diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index a39df8a740cc8..2aace6fb41ebe 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -75,12 +75,13 @@ # ninjanomnom -/code/__DEFINES/dcs/ @ninjanomnom /code/controllers/subsystem/dcs.dm @ninjanomnom -/code/controllers/subsystem/shuttle.dm @ninjanomnom -/code/datums/components/ @ninjanomnom -/code/datums/elements/ @ninjanomnom -/code/modules/shuttle/ @ninjanomnom +/code/datums/signals.dm @ninjanomnom +/code/datums/components/_component.dm @ninjanomnom +/code/datums/elements/_element.dm @ninjanomnom +/code/datums/greyscale/_greyscale_config.dm @ninjanomnom +/code/datums/greyscale/json_reader.dm @ninjanomnom +/code/datums/greyscale/layer.dm @ninjanomnom # Ryll-Ryll/Shaps @@ -203,6 +204,10 @@ /tools/WebhookProcessor/ @BraveMole @TiviPlus +# Expensive files that touching basically always cause performance problems +## Init times +**/*_EXPENSIVE.dm @Mothblocks @LemonInTheDark + # SIC SEMPER TYRANNIS /code/modules/hydroponics/grown/citrus.dm @optimumtact diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index fd89307ac7b09..0b802c12c51ef 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -90,6 +90,8 @@ Things you **CAN'T** do: * [Close PRs](https://imgur.com/w2RqpX8.png): Only maintainers are allowed to close PRs. Do not hit that button. * Close issues purely for breaking a template if the same information is contained without it. +For more information reference the [Issue Manager Guide](.github/guides/ISSUE_MANAGER.md). + ## Development Guides diff --git a/.github/guides/ISSUE_MANAGER.md b/.github/guides/ISSUE_MANAGER.md new file mode 100644 index 0000000000000..c0ef14ae0cc7b --- /dev/null +++ b/.github/guides/ISSUE_MANAGER.md @@ -0,0 +1,91 @@ +## What is an Issue Manager + +Issue Managers proactively manage issues for the repo by providing feedback, performing triage, and troubleshooting problems. They search through the codebase to link relevant code, issues, and PRs that help contributors identify and solve an issue. + +## Triage An Issue + +New issues should be properly diagnosed by using several methods and tools below: + +#### Emergency Issues + +When examining new issues you should immediately notify a maintainer if you see the following: + +- **Security Exploit** [[1]](https://github.com/tgstation/tgstation/issues/51654) [[2]](https://github.com/tgstation/tgstation/issues/38407) [[3]](https://github.com/tgstation/tgstation/issues/9900) - Something that can be used to bypass bans, give a player admin powers, cheats or hacks +- **Server Crashing** [[1]](https://github.com/tgstation/tgstation/issues/29342) [[2]](https://github.com/tgstation/tgstation/issues/25890) [[3]](https://github.com/tgstation/tgstation/issues/17475) - Something that is causing the server to _consistently_ crash +- **Server Lagging** [[1]](https://github.com/tgstation/tgstation/issues/60193) [[2]](https://github.com/tgstation/tgstation/issues/51927) [[3]](https://github.com/tgstation/tgstation/issues/32762) - Something that is causing a _severe_ amount of lag during the game + +#### Runtime Issue Reports +If an issue reports a runtime, it must have the actual runtime call stack provided by round logging or in-game debug menu (https://github.com/tgstation/tgstation/issues/70329#issuecomment-1279853883). +
+ Example runtime call stack + + ``` + [2022-10-15 16:12:38.902] runtime error: Cannot execute null.add(). + - proc name: visibility (/datum/cameranet/proc/visibility) + - source file: cameranet.dm,88 + - usr: AI (/mob/living/silicon/ai) + - src: Camera Net (/datum/cameranet) + - usr.loc: the floor (150,25,4) (/turf/open/floor/circuit) + - call stack: + - Camera Net (/datum/cameranet): visibility(/list (/list), null, /list (/list), 1) + - AI (/mob/living/silicon/ai): camera visibility(Inactive AI Eye (/mob/camera/ai_eye)) + - Inactive AI Eye (/mob/camera/ai_eye): setLoc(the floor (150,25,4) (/turf/open/floor/circuit), 0) + - AI (/mob/living/silicon/ai): create eye() + - AI (/mob/living/silicon/ai): Initialize(0, null, TagGamerGame2 (/mob/dead/new_player)) + - Atoms (/datum/controller/subsystem/atoms): InitAtom(AI (/mob/living/silicon/ai), 0, /list (/list)) + - AI (/mob/living/silicon/ai): New(0, null, TagGamerGame2 (/mob/dead/new_player)) + - AI (/mob/living/silicon/ai): New(the floor (150,25,4) (/turf/open/floor/circuit), null, TagGamerGame2 (/mob/dead/new_player)) + - /datum/job/ai (/datum/job/ai): get spawn mob(TagGamerGame2 (/client), AI (/obj/effect/landmark/start/ai)) + - TagGamerGame2 (/mob/dead/new_player): create character(AI (/obj/effect/landmark/start/ai)) + - Ticker (/datum/controller/subsystem/ticker): create characters() + - Ticker (/datum/controller/subsystem/ticker): setup() + - Ticker (/datum/controller/subsystem/ticker): fire(0) + - Ticker (/datum/controller/subsystem/ticker): ignite(0) + ``` + +
+ +#### Downstream Issues Taken Upstream +If an issue reports a bug encountered at a branch of the codebase or on a downstream server, it __MUST__ have a link to the branch or downstream codebase repo or it is eligible for closing (https://github.com/tgstation/tgstation/issues/70875#issuecomment-1295767891). Reproducing the issue on the compiled master of our codebase is also encouraged. + +
+ Image macro for your issue marking pleasure + +![image](https://user-images.githubusercontent.com/39163353/198381160-f0aa7fc4-4f2d-486f-8b33-44a1965e2ad1.svg) + +`![image](https://user-images.githubusercontent.com/39163353/198381160-f0aa7fc4-4f2d-486f-8b33-44a1965e2ad1.svg)` +
+ +#### Link Code Snippets + +To help triangulate bugs, search the GitHub repo to locate relevant code and attach it to an issue. Do this by creating a [link to the code](https://docs.github.com/en/github/writing-on-github/working-with-advanced-formatting/creating-a-permanent-link-to-a-code-snippet). This saves the contributors time from having to identify the problem and will be appreciated. + +#### Use Gitblame + +GitHub also has a tool called `gitblame` that is useful in [tracking code](https://docs.github.com/en/repositories/working-with-files/using-files/viewing-a-file#viewing-the-line-by-line-revision-history-for-a-file) to determine who and when someone made a change. This is ideally used to help solve old issues when there is uncertainty over which PR might have fixed it. It is also a good tool to use to link PRs that caused the issue. + +#### Search For Keywords + +When a new issue appears search for any keywords involved with the issue. This is important to prune for duplicates, match several issues to a test merge PR, or if you want to link multiple issues together since there is overlapping problems. (but not duplicate) + +## Closing Issues + +It is recommended to close issues in the following situations: + +- **Feature Requests** [[1]](https://github.com/tgstation/tgstation/issues/55919) [[2]](https://github.com/tgstation/tgstation/issues/53342) [[3]](https://github.com/tgstation/tgstation/issues/45412) - The issue is a suggestion or request for a new feature to be added to the game. +- **Working as Intended** [[1]](https://github.com/tgstation/tgstation/issues/62619) [[2]](https://github.com/tgstation/tgstation/issues/61511) [[3]](https://github.com/tgstation/tgstation/issues/60942) - The issue is detailing a problem that is _specifically intended_ by the code and is not considered a bug. +- **Duplicates** [[1]](https://github.com/tgstation/tgstation/issues/62709) [[2]](https://github.com/tgstation/tgstation/issues/62364) [[3]](https://github.com/tgstation/tgstation/issues/61823) - The issue is detailing an identical problem from another issue. Do not automatically close the most recent issue. Instead compare both and close the one that provides the least information. +- **Removed Features** [[1]](https://github.com/tgstation/tgstation/issues/48255) [[2]](https://github.com/tgstation/tgstation/issues/47194) [[3]](https://github.com/tgstation/tgstation/issues/45653) - The issue is referring to something that was removed from the codebase and no longer exists. +- **Defective Issues** [[1]](https://github.com/tgstation/tgstation/issues/57366) [[2]](https://github.com/tgstation/tgstation/issues/48778) [[3]](https://github.com/tgstation/tgstation/issues/51520) - The issue is badly written and lacking information. Politely ask the person to add more information or rewrite the issue. If there is no response after a sufficient amount of time close the issue. +- **Irreproducible Issues** [[1]](https://github.com/tgstation/tgstation/issues/51493) [[2]](https://github.com/tgstation/tgstation/issues/22796) [[3]](https://github.com/tgstation/tgstation/issues/25610) - The issue is old, cannot be reproduced, and nobody has reported a duplicate issue recently. If you feel _confident_ that the issue has been fixed at some point, list your reasons or link possible PRs that could have fixed it. +- **Impossible to Fix Issues** [[1]](https://github.com/tgstation/tgstation/issues/524) [[2]](https://github.com/tgstation/tgstation/issues/2679) [[3]](https://github.com/tgstation/tgstation/issues/9637) - The issue is not possible to fix due to either vague details or a clearly defined problem. + +## Reopening Issues + +In special cases a closed issue should be reopened if: + +- It has been updated with pertinent information (when before it was lacking info making it defective) +- The initial problem has reappeared (after it was presumably fixed in a PR) +- Someone feels that the issue was closed prematurely during discussion + +If there is a dispute on whether an issue should remain closed, ask for a second opinion. Get clarification from another Issue Manager or Maintainer and respect their judgement as the final verdict. diff --git a/.github/guides/MAPS_AND_AWAY_MISSIONS.md b/.github/guides/MAPS_AND_AWAY_MISSIONS.md index 41e81d3d64aab..5cda5ad88dda4 100644 --- a/.github/guides/MAPS_AND_AWAY_MISSIONS.md +++ b/.github/guides/MAPS_AND_AWAY_MISSIONS.md @@ -1,17 +1,18 @@ ## MAPS -/tg/station currently has five station maps in rotation. +/tg/station currently has six station maps in rotation. +* [Birdshot](https://tgstation13.org/wiki/Birdshot) * [DeltaStation](https://tgstation13.org/wiki/DeltaStation) * [IceBoxStation](https://tgstation13.org/wiki/IceboxStation) -* [KiloStation](https://tgstation13.org/wiki/KiloStation) * [MetaStation](https://tgstation13.org/wiki/MetaStation) +* [NorthStar](https://tgstation13.org/wiki/The_North_Star) * [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. +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 the server's [configuration](#configuration) passed onto the Mapping subsystem. 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. diff --git a/.github/images/README.md b/.github/images/README.md new file mode 100644 index 0000000000000..a3c0c24ade34f --- /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 0000000000000..702b62d721412 --- /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 0000000000000..051cec7117061 --- /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 0000000000000..aed1b7ca243c8 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 0000000000000..d88ea1f72b212 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 0000000000000..fd3da8561e625 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 82d0ac76f32f2..91ab12cdb19f6 100644 --- a/.github/workflows/autowiki.yml +++ b/.github/workflows/autowiki.yml @@ -8,7 +8,7 @@ permissions: jobs: autowiki: - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest steps: - name: "Check for AUTOWIKI_USERNAME" id: secrets_set @@ -30,9 +30,6 @@ jobs: - name: Install rust-g if: steps.secrets_set.outputs.SECRETS_ENABLED 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: Compile and generate Autowiki files if: steps.secrets_set.outputs.SECRETS_ENABLED diff --git a/.github/workflows/ci_suite.yml b/.github/workflows/ci_suite.yml index b5ed61226f2f8..39b5d7b222445 100644 --- a/.github/workflows/ci_suite.yml +++ b/.github/workflows/ci_suite.yml @@ -15,7 +15,7 @@ on: - master 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-22.04 concurrency: @@ -34,16 +34,26 @@ jobs: path: tgui/.yarn/cache key: ${{ runner.os }}-yarn-${{ hashFiles('tgui/yarn.lock') }} restore-keys: | - ${{ runner.os }}-build- - ${{ runner.os }}- + ${{ runner.os }}-yarn- + - name: Restore Node cache + uses: actions/cache@v3 + with: + path: ~/.nvm + key: ${{ runner.os }}-node-${{ hashFiles('dependencies.sh') }} + restore-keys: | + ${{ runner.os }}-node- + - name: Restore Bootstrap cache + uses: actions/cache@v3 + with: + path: tools/bootstrap/.cache + key: ${{ runner.os }}-bootstrap-${{ hashFiles('tools/requirements.txt') }} + restore-keys: | + ${{ runner.os }}-bootstrap- - name: Restore Rust cache uses: actions/cache@v3 with: path: ~/.cargo key: ${{ runner.os }}-rust - restore-keys: | - ${{ runner.os }}-build- - ${{ runner.os }}- - name: Install Tools run: | pip3 install setuptools @@ -51,27 +61,47 @@ jobs: bash tools/ci/install_spaceman_dmm.sh dreamchecker cargo install ripgrep --features pcre2 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: Ticked File Enforcement + if: steps.linter-setup.conclusion == 'success' && !cancelled() + run: | + tools/bootstrap/python tools/ticked_file_enforcement/ticked_file_enforcement.py < tools/ticked_file_enforcement/schemas/tgstation_dme.json + tools/bootstrap/python tools/ticked_file_enforcement/ticked_file_enforcement.py < tools/ticked_file_enforcement/schemas/unit_tests.json + - name: Check Define Sanity + if: steps.linter-setup.conclusion == 'success' && !cancelled() + run: tools/bootstrap/python -m define_sanity.check + - 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 tgstation.dme - bash tools/ci/check_changelogs.sh - bash tools/ci/check_grep.sh - bash tools/ci/check_misc.sh - tools/bootstrap/python tools/validate_dme.py ${GITHUB_WORKSPACE}/output-annotations.txt 2>&1 - - name: Annotate Lints - uses: yogstation13/DreamAnnotate@v2 - if: success() || failure() - with: - outputFile: output-annotations.txt + tools/bootstrap/python -m tools.maplint.source + - 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 tgstation.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 compile_all_maps: - if: "!contains(github.event.head_commit.message, '[ci skip]')" + if: ( !contains(github.event.head_commit.message, '[ci skip]') ) name: Compile Maps needs: [collect_data] runs-on: ubuntu-20.04 @@ -97,7 +127,7 @@ jobs: max-required-client-version: ${{needs.collect_data.outputs.max_required_byond_client}} collect_data: - if: "!contains(github.event.head_commit.message, '[ci skip]')" + if: ( !contains(github.event.head_commit.message, '[ci skip]') ) name: Collect data for other tasks runs-on: ubuntu-20.04 outputs: @@ -128,7 +158,7 @@ jobs: echo "max_required_byond_client=$(grep -Ev '^[[:blank:]]{0,}#{1,}|^[[:blank:]]{0,}$' .github/max_required_byond_client.txt | tail -n1)" >> $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: [collect_data] strategy: @@ -144,7 +174,7 @@ jobs: max_required_byond_client: ${{needs.collect_data.outputs.max_required_byond_client}} 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: [collect_data] strategy: @@ -162,7 +192,7 @@ jobs: max_required_byond_client: ${{needs.collect_data.outputs.max_required_byond_client}} 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 @@ -170,7 +200,7 @@ jobs: - run: echo Alternate tests passed. compare_screenshots: - if: "!contains(github.event.head_commit.message, '[ci skip]') && (success() || failure())" + if: ( !contains(github.event.head_commit.message, '[ci skip]') && (success() || failure()) ) needs: [run_all_tests, run_alternate_tests] name: Compare Screenshot Tests runs-on: ubuntu-20.04 @@ -205,7 +235,7 @@ 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 needs: [collect_data] runs-on: windows-latest @@ -220,8 +250,7 @@ jobs: path: tgui/.yarn/cache key: ${{ runner.os }}-yarn-${{ hashFiles('tgui/yarn.lock') }} restore-keys: | - ${{ runner.os }}-build- - ${{ runner.os }}- + ${{ runner.os }}-yarn- - name: Compile run: pwsh tools/ci/build.ps1 env: diff --git a/.github/workflows/conflicts.yml b/.github/workflows/conflicts.yml deleted file mode 100644 index 4823aee3abf80..0000000000000 --- a/.github/workflows/conflicts.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: 'Check for merge conflicts' -on: - push: - branches: - - master - - 'project/**' -jobs: - triage: - runs-on: ubuntu-20.04 - steps: - - uses: mschilde/auto-label-merge-conflicts@2e8fcc76c6430272ec8bb64fb74ec1592156aa6a - with: - CONFLICT_LABEL_NAME: 'Merge Conflict' - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - WAIT_MS: 10000 diff --git a/.github/workflows/docker_publish.yml b/.github/workflows/docker_publish.yml index 529a706ff6da1..c9d30e846f93b 100644 --- a/.github/workflows/docker_publish.yml +++ b/.github/workflows/docker_publish.yml @@ -5,7 +5,7 @@ on: workflow_dispatch: 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@v3 diff --git a/.github/workflows/generate_documentation.yml b/.github/workflows/generate_documentation.yml index 5f13472ca524b..ddac2bf378ffd 100644 --- a/.github/workflows/generate_documentation.yml +++ b/.github/workflows/generate_documentation.yml @@ -9,7 +9,7 @@ jobs: generate_documentation: permissions: contents: write # for JamesIves/github-pages-deploy-action to push changes in repo - if: "!contains(github.event.head_commit.message, '[ci skip]')" + if: ( !contains(github.event.head_commit.message, '[ci skip]') ) runs-on: ubuntu-20.04 concurrency: gen-docs steps: diff --git a/.github/workflows/run_integration_tests.yml b/.github/workflows/run_integration_tests.yml index 0c4ba61a8a45e..404119d988060 100644 --- a/.github/workflows/run_integration_tests.yml +++ b/.github/workflows/run_integration_tests.yml @@ -18,7 +18,7 @@ on: type: string jobs: run_integration_tests: - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest services: mysql: image: mysql:latest @@ -43,9 +43,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: Install auxlua run: | diff --git a/.github/workflows/show_screenshot_test_results.yml b/.github/workflows/show_screenshot_test_results.yml index 8e463e46c05ff..32ea68476d2c3 100644 --- a/.github/workflows/show_screenshot_test_results.yml +++ b/.github/workflows/show_screenshot_test_results.yml @@ -11,7 +11,7 @@ on: - completed jobs: show_screenshot_test_results: - if: "!contains(github.event.head_commit.message, '[ci skip]') && github.event.workflow_run.run_attempt == 1" + 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 steps: diff --git a/.github/workflows/tgs_test.yml b/.github/workflows/tgs_test.yml index 5123a2d447cb7..4925019bc6a02 100644 --- a/.github/workflows/tgs_test.yml +++ b/.github/workflows/tgs_test.yml @@ -38,7 +38,7 @@ env: PR_NUMBER: ${{ github.event.number }} jobs: test_tgs_docker: - if: "!contains(github.event.head_commit.message, '[ci skip]')" + if: ( !contains(github.event.head_commit.message, '[ci skip]') ) name: Test TGS Docker runs-on: ubuntu-22.04 concurrency: diff --git a/README.md b/README.md index 37852e65756b3..d2da6e2788663 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,9 @@ [![Build Status](https://github.com/tgstation/tgstation/workflows/CI%20Suite/badge.svg)](https://github.com/tgstation/tgstation/actions?query=workflow%3A%22CI+Suite%22) [![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---3%25-red.svg) +![Coverage](https://img.shields.io/badge/coverage---4%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://www.tgstation13.org * **Code:** https://github.com/tgstation/tgstation @@ -21,7 +21,7 @@ Space Station 13 is a paranoia-laden round-based roleplaying game set against th ## DOWNLOADING [Downloading](.github/guides/DOWNLOADING.md) -[Running on the server](.github/guides/RUNNING_A_SERVER.md) +[Running a server](.github/guides/RUNNING_A_SERVER.md) [Maps and Away Missions](.github/guides/MAPS_AND_AWAY_MISSIONS.md) diff --git a/SQL/database_changelog.md b/SQL/database_changelog.md index c990427876e82..4e4c0d592b344 100644 --- a/SQL/database_changelog.md +++ b/SQL/database_changelog.md @@ -2,19 +2,26 @@ Any time you make a change to the schema files, remember to increment the databa Make sure to also update `DB_MAJOR_VERSION` and `DB_MINOR_VERSION`, which can be found in `code/__DEFINES/subsystem.dm`. -The latest database version is 5.24; The query to update the schema revision table is: +The latest database version is 5.25; The query to update the schema revision table is: ```sql -INSERT INTO `schema_revision` (`major`, `minor`) VALUES (5, 24); +INSERT INTO `schema_revision` (`major`, `minor`) VALUES (5, 25); ``` or ```sql -INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (5, 24); +INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (5, 25); ``` In any query remember to add a prefix to the table names if you use one. +----------------------------------------------------- +Version 5.25, 27 September 2023, by Jimmyl +Removes the text_adventures table because it is no longer used +```sql + DROP TABLE IF EXISTS `text_adventures`; +``` + ----------------------------------------------------- Version 5.24, 17 May 2023, by LemonInTheDark Modified the library action table to fit ckeys properly, and to properly store ips. diff --git a/SQL/tgstation_schema.sql b/SQL/tgstation_schema.sql index 6a140dc16d083..3ee20e1b7d7cd 100644 --- a/SQL/tgstation_schema.sql +++ b/SQL/tgstation_schema.sql @@ -637,19 +637,6 @@ CREATE TABLE `discord_links` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB; --- --- Table structure for table `text_adventures` --- -DROP TABLE IF EXISTS `text_adventures`; -CREATE TABLE `text_adventures` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `adventure_data` LONGTEXT NOT NULL, - `uploader` VARCHAR(32) NOT NULL, - `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - `approved` TINYINT(1) NOT NULL DEFAULT FALSE, - PRIMARY KEY (`id`) -) ENGINE=InnoDB; - -- -- Table structure for table `admin_connections` -- diff --git a/SQL/tgstation_schema_prefixed.sql b/SQL/tgstation_schema_prefixed.sql index a700ae8da9f25..89badb12275be 100644 --- a/SQL/tgstation_schema_prefixed.sql +++ b/SQL/tgstation_schema_prefixed.sql @@ -637,19 +637,6 @@ CREATE TABLE `SS13_discord_links` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB; --- --- Table structure for table `text_adventures` --- -DROP TABLE IF EXISTS `SS13_text_adventures`; -CREATE TABLE `SS13_text_adventures` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `adventure_data` LONGTEXT NOT NULL, - `uploader` VARCHAR(32) NOT NULL, - `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - `approved` TINYINT(1) NOT NULL DEFAULT FALSE, - PRIMARY KEY (`id`) -) ENGINE=InnoDB; - -- -- Table structure for table `admin_connections` -- diff --git a/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm b/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm index aa9c613e50a16..5c36e6674565b 100644 --- a/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm +++ b/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm @@ -80,12 +80,6 @@ /obj/item/resonator, /turf/open/floor/mineral/titanium/purple, /area/ruin/powered/golem_ship) -"p" = ( -/obj/structure/frame/machine, -/obj/item/stack/cable_coil/five, -/obj/item/circuitboard/machine/ore_redemption/offstation, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) "q" = ( /obj/structure/statue/gold/rd, /obj/structure/window/reinforced/spawner/directional/east{ @@ -140,38 +134,11 @@ /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" - }, +/obj/item/areaeditor/blueprints/golem, /turf/open/floor/mineral/titanium/purple, /area/ruin/powered/golem_ship) "D" = ( @@ -222,14 +189,34 @@ /obj/machinery/light/directional/north, /turf/open/floor/mineral/titanium/purple, /area/ruin/powered/golem_ship) -"O" = ( -/obj/machinery/light/directional/west, +"P" = ( +/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, +/obj/machinery/light/directional/south, /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) +"S" = ( +/obj/item/storage/medkit/fire, +/obj/structure/table/wood, +/obj/item/storage/medkit/fire, +/turf/open/floor/mineral/titanium/purple, +/area/ruin/powered/golem_ship) "T" = ( /obj/structure/fans/tiny, /obj/machinery/door/airlock/titanium, @@ -244,6 +231,28 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating, /area/ruin/powered/golem_ship) +"W" = ( +/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, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/ruin/powered/golem_ship) +"X" = ( +/obj/structure/frame/machine, +/obj/item/stack/cable_coil/five, +/obj/item/circuitboard/machine/ore_redemption/offstation, +/turf/open/floor/mineral/titanium/purple, +/area/ruin/powered/golem_ship) "Y" = ( /obj/machinery/door/airlock/titanium, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -251,6 +260,11 @@ }, /turf/open/floor/mineral/titanium/purple, /area/ruin/powered/golem_ship) +"Z" = ( +/obj/structure/ore_box, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/ruin/powered/golem_ship) (1,1,1) = {" a @@ -329,7 +343,7 @@ a a a b -L +l l j l @@ -347,11 +361,11 @@ b b b b -l +L l b l -Q +l G l Q @@ -362,20 +376,20 @@ b "} (7,1,1) = {" b -c +W f j l l b l -l +Q G l l j f -F +Z b "} (8,1,1) = {" @@ -386,7 +400,7 @@ j l l b -L +l l G l @@ -399,18 +413,18 @@ b (9,1,1) = {" b c -I +f b M o b -l +L l G o U b -V +f F b "} @@ -435,7 +449,7 @@ b (11,1,1) = {" b c -f +I b b j @@ -446,25 +460,25 @@ G j b b -f +V F b "} (12,1,1) = {" b c -I +f b l l -O l l -O +l +l l z b -V +f F b "} @@ -509,14 +523,14 @@ b d f b +N l l l l l l -l -A +P b f f @@ -527,14 +541,14 @@ T e I b -N +l l l l l v l -B +S b V f @@ -547,7 +561,7 @@ f b l l -p +X l l w diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_bughabitat.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_bughabitat.dmm index 64274635234d3..8e4b42e823900 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_bughabitat.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_bughabitat.dmm @@ -10,6 +10,12 @@ }, /turf/open/floor/plastic, /area/ruin/bughabitat) +"aL" = ( +/mob/living/basic/ant{ + environment_smash = 0 + }, +/turf/open/floor/grass, +/area/ruin/bughabitat) "aR" = ( /obj/item/reagent_containers/syringe/syriniver, /obj/effect/turf_decal/siding/wideplating/dark/corner, @@ -28,12 +34,6 @@ }, /turf/open/floor/plastic, /area/ruin/bughabitat) -"cK" = ( -/mob/living/basic/ant{ - environment_smash = 0 - }, -/turf/open/floor/grass, -/area/ruin/bughabitat) "eM" = ( /obj/structure/chair/pew/right{ dir = 8 @@ -71,6 +71,14 @@ }, /turf/open/floor/iron, /area/ruin/bughabitat) +"gw" = ( +/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) "hk" = ( /obj/structure/window/reinforced/spawner/directional/east, /turf/open/misc/snow, @@ -123,11 +131,6 @@ /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/directional/east, /obj/effect/turf_decal/siding/wideplating/light{ @@ -145,6 +148,25 @@ /obj/effect/decal/cleanable/blood/drip, /turf/open/floor/iron, /area/ruin/bughabitat) +"pc" = ( +/obj/structure/table/rolling, +/obj/item/petri_dish/random, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/plastic, +/area/ruin/bughabitat) +"pL" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/effect/turf_decal/siding/wideplating/light{ + color = "#236F26" + }, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/plastic, +/area/ruin/bughabitat) +"qS" = ( +/obj/structure/tank_holder/oxygen, +/turf/open/floor/plastic, +/area/ruin/bughabitat) "qV" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/item/wallframe/camera, @@ -189,14 +211,6 @@ /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"; @@ -223,6 +237,15 @@ }, /turf/open/floor/iron, /area/ruin/bughabitat) +"zz" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/effect/turf_decal/siding/wideplating/light{ + color = "#236F26" + }, +/obj/machinery/light/warm/directional/south, +/turf/open/floor/plastic, +/area/ruin/bughabitat) "zJ" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/effect/turf_decal/siding/wideplating/light{ @@ -237,12 +260,6 @@ "Bs" = ( /turf/closed/wall/ice, /area/ruin/bughabitat) -"BK" = ( -/obj/structure/table/rolling, -/obj/item/petri_dish/random, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/plastic, -/area/ruin/bughabitat) "Cb" = ( /turf/open/floor/plastic, /area/ruin/bughabitat) @@ -299,15 +316,6 @@ /obj/structure/barricade/wooden/crude, /turf/open/misc/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, @@ -338,15 +346,6 @@ /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) @@ -473,7 +472,7 @@ Xn HA bu ot -Pt +gw of bQ wL @@ -494,7 +493,7 @@ Xt zJ AL AL -Kc +zz HA ZT QV @@ -507,12 +506,12 @@ Xn Xn Qd Bs -cK +aL Ft Ea aR hM -wC +pL HA RR RR @@ -568,7 +567,7 @@ Tp yC lj hy -mM +qS IX VM Bs @@ -636,7 +635,7 @@ Qd Qd Qd Bs -BK +pc uB eM ax diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm index 90640ee5353d9..8c31d589343aa 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm @@ -37,7 +37,7 @@ /turf/open/floor/catwalk_floor/iron, /area/ruin/planetengi) "as" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 8 }, /obj/effect/turf_decal/trimline/yellow/filled/warning{ diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm index 025c39035343f..d499b63b24267 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm @@ -18,16 +18,6 @@ dir = 5 }, /area/ruin/pizzeria) -"bf" = ( -/obj/structure/table, -/obj/item/plate/small, -/obj/structure/sign/poster/official/moth_meth/directional/north, -/obj/item/reagent_containers/condiment/enzyme, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/ruin/pizzeria/kitchen) "bV" = ( /obj/structure/chair/sofa/left/brown{ dir = 4 @@ -158,6 +148,10 @@ }, /turf/open/floor/iron/cafeteria, /area/ruin/pizzeria/kitchen) +"fV" = ( +/obj/structure/sign/poster/contraband/syndiemoth/directional/east, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "gm" = ( /obj/structure/disposalpipe/trunk{ dir = 8 @@ -167,6 +161,13 @@ }, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/ruin/pizzeria) +"gs" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/light/small/broken/directional/north, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "gS" = ( /obj/structure/chair, /obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ @@ -179,6 +180,22 @@ dir = 10 }, /area/ruin/pizzeria) +"gV" = ( +/obj/structure/chair/sofa/right/brown{ + dir = 8 + }, +/obj/item/trash/can, +/obj/effect/turf_decal/siding/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/side{ + dir = 10 + }, +/area/ruin/pizzeria) "gW" = ( /obj/machinery/computer/arcade/orion_trail, /obj/effect/turf_decal/siding/red{ @@ -206,6 +223,14 @@ /obj/machinery/atmospherics/components/unary/vent_pump/siphon/on, /turf/open/floor/plating, /area/ruin/pizzeria/kitchen) +"ia" = ( +/obj/effect/turf_decal/siding/blue, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/iron/cafeteria, +/area/ruin/pizzeria/kitchen) "ir" = ( /obj/structure/chair{ dir = 1 @@ -226,6 +251,14 @@ "iK" = ( /turf/closed/wall, /area/ruin/pizzeria/kitchen) +"iL" = ( +/obj/item/wrench, +/obj/item/screwdriver, +/obj/item/crowbar/red, +/obj/structure/rack, +/obj/structure/sign/poster/official/moth_delam/directional/north, +/turf/open/floor/plating, +/area/ruin/pizzeria) "iV" = ( /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 @@ -269,15 +302,6 @@ dir = 5 }, /area/ruin/pizzeria) -"ko" = ( -/obj/machinery/light/warm/directional/south, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) "kr" = ( /obj/structure/table, /obj/item/trash/waffles, @@ -299,15 +323,6 @@ /obj/structure/flora/grass/green/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) -"lm" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/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/opposingcorners{ @@ -340,11 +355,6 @@ dir = 10 }, /area/ruin/pizzeria) -"mN" = ( -/obj/structure/flora/bush/pointy/style_random, -/obj/structure/sign/poster/official/moth_piping/directional/north, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/nospawn) "nr" = ( /obj/structure/flora/rock/icy/style_random, /turf/open/misc/asteroid/snow/icemoon, @@ -353,28 +363,6 @@ /obj/structure/flora/grass/brown/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) -"oM" = ( -/obj/effect/turf_decal/siding/blue, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/ruin/pizzeria/kitchen) -"qo" = ( -/obj/structure/chair/sofa/right/brown{ - dir = 8 - }, -/obj/item/trash/can, -/obj/effect/turf_decal/siding/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) "qw" = ( /obj/effect/decal/cleanable/food/salt, /obj/item/chair/stool/bar, @@ -429,6 +417,11 @@ }, /turf/open/floor/iron/cafeteria, /area/ruin/pizzeria/kitchen) +"rZ" = ( +/obj/structure/flora/bush/pointy/style_random, +/obj/structure/sign/poster/official/moth_piping/directional/north, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "se" = ( /obj/structure/toilet{ dir = 8 @@ -437,14 +430,6 @@ /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/directional/north, -/turf/open/floor/plating, -/area/ruin/pizzeria) "sY" = ( /obj/effect/turf_decal/trimline/white/filled/shrink_cw{ dir = 8 @@ -456,6 +441,17 @@ dir = 10 }, /area/ruin/pizzeria) +"te" = ( +/obj/structure/chair, +/obj/machinery/newscaster/directional/east, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/small/red/directional/east, +/turf/open/floor/iron/dark/side{ + dir = 10 + }, +/area/ruin/pizzeria) "tl" = ( /obj/structure/table/reinforced, /obj/item/pen/fountain, @@ -478,10 +474,6 @@ }, /turf/open/floor/iron/freezer, /area/ruin/pizzeria) -"vf" = ( -/obj/structure/sign/poster/contraband/syndiemoth/directional/east, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/surface/outdoors/nospawn) "vO" = ( /obj/structure/cable, /obj/effect/turf_decal/bot, @@ -658,16 +650,6 @@ dir = 4 }, /area/ruin/pizzeria) -"Cf" = ( -/obj/structure/chair, -/obj/machinery/newscaster/directional/east, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) "CZ" = ( /obj/structure/cable, /obj/machinery/light/cold/no_nightlight/directional/south, @@ -769,18 +751,6 @@ dir = 5 }, /area/ruin/pizzeria) -"HM" = ( -/obj/structure/cable, -/obj/machinery/light/warm/directional/north, -/obj/structure/sign/departments/restroom/directional/north, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) "Ih" = ( /obj/machinery/atmospherics/pipe/smart/manifold/supply/hidden{ dir = 4 @@ -1049,17 +1019,6 @@ }, /turf/closed/wall, /area/ruin/pizzeria) -"PW" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/warm/directional/south, -/obj/item/reagent_containers/cup/glass/colocup{ - pixel_y = 11 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/checker, -/area/ruin/pizzeria) "Qg" = ( /obj/structure/chair/sofa/left/brown, /obj/effect/turf_decal/tile/blue{ @@ -1096,6 +1055,16 @@ }, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/surface/outdoors/nospawn) +"RV" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/cup/glass/colocup{ + pixel_y = 11 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/checker, +/area/ruin/pizzeria) "RW" = ( /obj/item/trash/boritos, /obj/effect/turf_decal/tile/red/opposingcorners{ @@ -1109,10 +1078,41 @@ /obj/structure/fence, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/surface/outdoors/nospawn) +"Sb" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 10 + }, +/area/ruin/pizzeria) +"Sc" = ( +/obj/structure/cable, +/obj/structure/sign/departments/restroom/directional/north, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron/dark/side{ + dir = 5 + }, +/area/ruin/pizzeria) "Sm" = ( /obj/structure/flora/tree/pine/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) +"So" = ( +/obj/structure/table, +/obj/item/plate/small, +/obj/structure/sign/poster/official/moth_meth/directional/north, +/obj/item/reagent_containers/condiment/enzyme, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/ruin/pizzeria/kitchen) "Sw" = ( /obj/structure/chair/sofa/middle/brown, /obj/machinery/light/small/red/directional/north, @@ -1438,7 +1438,7 @@ TK TK Jv iK -bf +So kG kG kG @@ -1446,7 +1446,7 @@ fa kG kG kG -oM +ia EU Eu RF @@ -1494,12 +1494,12 @@ iK tl wT XS -PW +RV NL NL wS NL -Jg +gs TK qR "} @@ -1531,7 +1531,7 @@ Jv qR qR qR -vf +fV Qw hS IL @@ -1563,7 +1563,7 @@ Ny yP jb iK -lm +Sb Ay JG aP @@ -1571,7 +1571,7 @@ Dw NL wS NL -mN +rZ TK qR "} @@ -1580,14 +1580,14 @@ qR qR qR NL -sl +iL AP iK iK iK rU iK -HM +Sc gS kr ir @@ -1640,7 +1640,7 @@ qF Qm az KU -qo +gV wd wS TK @@ -1663,7 +1663,7 @@ Jt KU Dw KU -ko +Dw NL wS NL @@ -1734,7 +1734,7 @@ cH VK RW iV -Cf +te yn wS TK diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm index 6f58e1358c11a..6c6378c3e3cc8 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm @@ -987,9 +987,7 @@ /turf/open/floor/iron/edge, /area/ruin/plasma_facility/commons) "pn" = ( -/obj/item/kirbyplants{ - icon_state = "applebush" - }, +/obj/item/kirbyplants/organic/applebush, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/brown/full, /turf/open/floor/iron/large, @@ -1682,9 +1680,7 @@ /turf/open/floor/iron, /area/ruin/plasma_facility/commons) "DQ" = ( -/obj/item/kirbyplants{ - icon_state = "applebush" - }, +/obj/item/kirbyplants/organic/applebush, /obj/effect/turf_decal/tile/brown/full, /turf/open/floor/iron/large, /area/ruin/plasma_facility/commons) diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_hermit.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_hermit.dmm index fd9551784ecd6..fdfb9632b7671 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_hermit.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_hermit.dmm @@ -20,12 +20,6 @@ /obj/structure/sink/directional/south, /turf/open/floor/plating, /area/ruin/powered/hermit) -"ec" = ( -/obj/structure/chair/comfy/beige, -/obj/machinery/light/directional/west, -/obj/machinery/light/directional/north, -/turf/open/floor/wood, -/area/ruin/powered/hermit) "gr" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/grass/fairy, @@ -56,18 +50,16 @@ "jG" = ( /turf/closed/wall/mineral/wood, /area/icemoon/underground/explored) -"mN" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/wood, -/area/ruin/powered/hermit) "oJ" = ( /obj/structure/glowshroom/single, /turf/open/floor/plating, /area/ruin/powered/hermit) -"sj" = ( -/obj/machinery/hydroponics/soil, -/obj/machinery/light/directional/north, -/turf/open/floor/grass/fairy, +"ph" = ( +/turf/closed/mineral/snowmountain/icemoon/unscrapeable, +/area/icemoon/underground/explored) +"pA" = ( +/obj/structure/chair/comfy/beige, +/turf/open/floor/wood, /area/ruin/powered/hermit) "sC" = ( /obj/item/chair/wood/wings, @@ -83,10 +75,6 @@ /obj/item/flashlight/lantern, /turf/open/floor/wood, /area/ruin/powered/hermit) -"wH" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/grass/fairy, -/area/ruin/powered/hermit) "zd" = ( /obj/item/pickaxe/improvised, /obj/structure/table/wood, @@ -150,9 +138,6 @@ /obj/item/reagent_containers/cup/bucket/wooden, /turf/open/floor/plating, /area/ruin/powered/hermit) -"YN" = ( -/turf/closed/mineral/snowmountain/icemoon/unscrapeable, -/area/icemoon/underground/explored) (1,1,1) = {" QD @@ -177,15 +162,15 @@ QD QD QD QD -YN -YN -YN -YN -YN -YN -YN -YN -YN +ph +ph +ph +ph +ph +ph +ph +ph +ph aM QD QD @@ -194,48 +179,48 @@ QD QD QD QD -YN -YN -YN -YN -YN -YN -YN -YN -YN -YN -YN -YN -YN +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph "} (4,1,1) = {" QD QD -YN -YN -YN -YN -YN -YN -YN -YN -YN -YN -YN -YN -YN -YN +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph "} (5,1,1) = {" QD -YN -YN -YN -YN -YN -YN -YN -YN +ph +ph +ph +ph +ph +ph +ph +ph aM aM il @@ -245,10 +230,10 @@ aM aM "} (6,1,1) = {" -YN -YN -YN -YN +ph +ph +ph +ph Xl Xl TL @@ -263,17 +248,17 @@ Rr aM "} (7,1,1) = {" -YN -YN -YN +ph +ph +ph uw Yi Lf TL -ec +pA ii ha -mN +JI TL aM aM @@ -281,8 +266,8 @@ aM il "} (8,1,1) = {" -YN -YN +ph +ph uw bp GU @@ -299,9 +284,9 @@ Rr aM "} (9,1,1) = {" -YN +ph jG -sj +uw bp Si oJ @@ -317,8 +302,8 @@ aM CR "} (10,1,1) = {" -YN -YN +ph +ph uw Rd bp @@ -335,54 +320,54 @@ aM aM "} (11,1,1) = {" -YN -YN -YN -YN +ph +ph +ph +ph uw bp bp -wH +bp WK gr bp -YN -YN +ph +ph aM aM Rr "} (12,1,1) = {" QD -YN -YN -YN -YN +ph +ph +ph +ph zd io jG -YN -YN -YN -YN -YN +ph +ph +ph +ph +ph aM aM aM "} (13,1,1) = {" QD -YN -YN -YN -YN -YN -YN -YN -YN -YN -YN -YN +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aM aM Rr @@ -391,16 +376,16 @@ aM (14,1,1) = {" QD QD -YN -YN -YN -YN -YN -YN -YN -YN -YN -YN +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph Rr aM aM @@ -411,10 +396,10 @@ QD QD QD QD -YN -YN -YN -YN +ph +ph +ph +ph aM aM aM diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm index 79a92d95ea716..ffa76bff09403 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm @@ -61,19 +61,6 @@ "an" = ( /turf/open/misc/asteroid/snow/icemoon, /area/ruin/unpowered/buried_library) -"ao" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/unpowered/buried_library) -"ap" = ( -/obj/item/stack/sheet/mineral/wood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/unpowered/buried_library) "aq" = ( /obj/structure/fluff/paper/stack, /obj/effect/mapping_helpers/broken_floor, @@ -111,10 +98,6 @@ initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) -"aA" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/icemoon, -/area/ruin/unpowered/buried_library) "aC" = ( /obj/item/feather, /turf/open/misc/asteroid/snow/icemoon, @@ -150,22 +133,6 @@ /obj/item/clothing/head/costume/rice_hat, /turf/open/floor/cult, /area/ruin/unpowered/buried_library) -"aJ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/unpowered/buried_library) -"aK" = ( -/obj/item/feather, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/unpowered/buried_library) -"aL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/fluff/paper/stack, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/unpowered/buried_library) "aM" = ( /obj/item/stack/sheet/mineral/wood, /obj/item/book/manual/random, @@ -178,7 +145,7 @@ }, /area/ruin/unpowered/buried_library) "aO" = ( -/mob/living/simple_animal/pet/fox, +/mob/living/basic/pet/fox, /turf/open/floor/wood{ initial_gas_mix = "ICEMOON_ATMOS" }, @@ -187,35 +154,12 @@ /obj/item/keycard/library, /turf/closed/mineral/random/snow, /area/ruin/unpowered/buried_library) -"aQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_autopsy, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/unpowered/buried_library) "aR" = ( /obj/structure/fluff/paper/stack, /turf/open/floor/wood{ initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) -"aS" = ( -/obj/structure/table/wood/fancy/black, -/obj/effect/decal/cleanable/dirt, -/obj/item/paper/secretrecipe, -/obj/item/flashlight/lantern/jade{ - on = 1 - }, -/turf/open/floor/cult, -/area/ruin/unpowered/buried_library) -"aT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/fluff/paper, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/unpowered/buried_library) "aU" = ( /obj/item/stack/sheet/mineral/wood, /turf/open/misc/asteroid/snow/icemoon, @@ -265,16 +209,6 @@ initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) -"bd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/fluff/paper{ - dir = 1 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/unpowered/buried_library) "be" = ( /obj/structure/fluff/paper{ dir = 5 @@ -283,26 +217,10 @@ initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) -"bf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/fluff/paper{ - dir = 4 - }, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" - }, -/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, -/mob/living/simple_animal/pet/fox, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/unpowered/buried_library) "bi" = ( /obj/structure/fluff/paper, /turf/open/misc/asteroid/snow/icemoon, @@ -343,10 +261,6 @@ /obj/structure/girder, /turf/open/misc/asteroid/snow/icemoon, /area/ruin/unpowered/buried_library) -"bt" = ( -/obj/effect/decal/cleanable/dirt, -/turf/template_noop, -/area/template_noop) "bu" = ( /obj/item/stack/sheet/mineral/wood, /turf/closed/mineral/random/snow, @@ -379,24 +293,81 @@ initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) -"bC" = ( -/obj/effect/decal/cleanable/dirt, +"bK" = ( +/obj/item/stack/sheet/mineral/wood, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/buried_library) +"bL" = ( +/obj/structure/fluff/paper{ + dir = 10 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/buried_library) +"bM" = ( /obj/structure/fluff/paper{ dir = 1 }, -/mob/living/simple_animal/pet/fox, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood{ initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) -"bE" = ( -/obj/effect/decal/cleanable/dirt, +"bP" = ( +/obj/item/paper/crumpled/bloody/fluff/stations/lavaland/library/warning, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood{ initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) -"bH" = ( +"cA" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/pet/fox, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/buried_library) +"gb" = ( +/obj/structure/table/wood/fancy/black, +/obj/effect/decal/cleanable/dirt, +/obj/item/paper/secretrecipe, +/obj/item/flashlight/lantern/jade{ + on = 1 + }, +/turf/open/floor/cult, +/area/ruin/unpowered/buried_library) +"gv" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/buried_library) +"ms" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/paper{ + dir = 4 + }, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/buried_library) +"oi" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/icemoon, +/area/ruin/unpowered/buried_library) +"or" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/paper/stack, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/buried_library) +"pk" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/fluff/paper, /obj/effect/mapping_helpers/broken_floor, @@ -404,23 +375,32 @@ initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) -"bK" = ( -/obj/item/stack/sheet/mineral/wood, -/obj/effect/mapping_helpers/broken_floor, +"Aq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/paper, /turf/open/floor/wood{ initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) -"bL" = ( +"DL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_autopsy, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/buried_library) +"Eh" = ( +/obj/effect/decal/cleanable/dirt, /obj/structure/fluff/paper{ - dir = 10 + dir = 1 }, -/obj/effect/mapping_helpers/broken_floor, +/mob/living/basic/pet/fox, /turf/open/floor/wood{ initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) -"bM" = ( +"Gs" = ( +/obj/effect/decal/cleanable/dirt, /obj/structure/fluff/paper{ dir = 1 }, @@ -429,13 +409,29 @@ initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) -"bP" = ( -/obj/item/paper/crumpled/bloody/fluff/stations/lavaland/library/warning, +"GM" = ( +/obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood{ initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) +"PF" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/cult, +/area/ruin/unpowered/buried_library) +"TP" = ( +/obj/item/feather, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/cult, +/area/ruin/unpowered/buried_library) +"Xd" = ( +/obj/item/stack/sheet/mineral/wood, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/buried_library) (1,1,1) = {" aa @@ -459,7 +455,7 @@ ad ad ad ad -bt +aa aa "} (2,1,1) = {" @@ -529,9 +525,9 @@ bb av ak ah -aL +or ah -aT +Aq ac ad aa @@ -548,13 +544,13 @@ ak an aC ae -aQ +DL ah ak av bg ah -bH +pk ah ak ac @@ -577,9 +573,9 @@ aO ah au ah -aA +oi ah -ao +gv ah bM ac @@ -597,16 +593,16 @@ ac ak au ak -bE +GM aR -bE -aA -ao +GM +oi +gv bw ah aZ ah -bC +Eh ac ad ad @@ -621,15 +617,15 @@ ad ak ak av -aA +oi an aG aD aX an -bE +GM ae -bE +GM ah ae ac @@ -654,9 +650,9 @@ aD bB ak ae -bE +GM ae -bE +GM ac an bw @@ -669,7 +665,7 @@ aa ad ad ac -ap +Xd an ak aD @@ -678,7 +674,7 @@ aN an aw ak -ao +gv bK aR ae @@ -702,9 +698,9 @@ an aD aD by -bE +GM aw -ao +gv ae bm ac @@ -741,14 +737,14 @@ ad ad al am -aJ +PF aW ay bw ah -ao +gv ae -bE +GM ae af an @@ -765,15 +761,15 @@ ad (14,1,1) = {" ad al -aS +gb aW -aK +TP al at ah an ah -bh +cA ah az ah @@ -781,7 +777,7 @@ ak ah ak bn -bH +pk ac ad aa @@ -796,11 +792,11 @@ ar al bc ah -aL +or ah -aA +oi ah -bE +GM ah ak ak @@ -819,11 +815,11 @@ al al al al -bd +Gs ah -bE +GM ah -ao +gv aV ak ah @@ -845,7 +841,7 @@ ad ad ac be -bf +ms bw aP bw diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm index 6211bd0ef6d73..0f2fcf59ba771 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm @@ -61,12 +61,6 @@ /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, @@ -125,12 +119,6 @@ /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) @@ -191,6 +179,12 @@ /obj/machinery/light/small/red/directional/west, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/ruin/powered/mailroom) +"sA" = ( +/obj/machinery/modular_computer/preset/civilian{ + dir = 8 + }, +/turf/open/floor/carpet/green, +/area/ruin/powered/mailroom) "tN" = ( /obj/effect/turf_decal/plaque, /turf/open/floor/carpet/green, @@ -365,15 +359,6 @@ /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 @@ -431,6 +416,12 @@ /obj/item/ticket_machine_ticket, /turf/open/floor/iron/white, /area/ruin/powered/mailroom) +"Sm" = ( +/obj/machinery/modular_computer/preset/civilian{ + dir = 4 + }, +/turf/open/floor/carpet/green, +/area/ruin/powered/mailroom) "SA" = ( /obj/structure/table/greyscale, /turf/open/floor/carpet/royalblack, @@ -502,6 +493,14 @@ /obj/structure/sign/warning/secure_area, /turf/closed/indestructible/reinforced, /area/ruin/powered/mailroom) +"Xi" = ( +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/obj/effect/decal/remains/human, +/obj/item/clothing/suit/hooded/wintercoat, +/turf/open/floor/iron/textured, +/area/ruin/powered/mailroom) "XO" = ( /turf/open/floor/iron/smooth_corner{ dir = 8 @@ -771,7 +770,7 @@ AX MT ba ba -Nq +Xi vU iV zr @@ -866,7 +865,7 @@ ms Ze NN NN -lw +sA HL ms Vq @@ -912,7 +911,7 @@ ms nM NN NN -gO +Sm SA ms iV diff --git a/_maps/RandomRuins/LavaRuins/lavaland_battle_site.dmm b/_maps/RandomRuins/LavaRuins/lavaland_battle_site.dmm new file mode 100644 index 0000000000000..7dbc17d40f969 --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_battle_site.dmm @@ -0,0 +1,464 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/mineral/strong/wasteland, +/area/lavaland/surface/outdoors) +"f" = ( +/obj/effect/mob_spawn/corpse/human/skeleton, +/obj/item/clothing/head/costume/crown{ + pixel_x = 15; + pixel_y = 6; + desc = "A crown that was fit for a king, looks like it didn't get them very far."; + name = "dented crown" + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"g" = ( +/obj/structure/water_source/puddle, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"h" = ( +/obj/effect/mob_spawn/corpse/human/skeleton, +/obj/item/shield/buckler, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"j" = ( +/turf/template_noop, +/area/template_noop) +"m" = ( +/obj/effect/decal/cleanable/shreds, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"n" = ( +/obj/structure/stone_tile/block/burnt, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"o" = ( +/obj/structure/stone_tile/burnt{ + dir = 1 + }, +/obj/structure/stone_tile/burnt{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/drip, +/mob/living/basic/mining/goliath, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"p" = ( +/obj/item/stack/rods{ + pixel_x = 10 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"q" = ( +/obj/structure/flora/rock, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"s" = ( +/mob/living/basic/mining/goliath, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"t" = ( +/obj/effect/decal/cleanable/blood/gibs/old, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"u" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"x" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"D" = ( +/obj/structure/statue/bone/rib{ + name = "colossal tailbone" + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"F" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/statue/bone/rib, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"G" = ( +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"H" = ( +/obj/structure/firepit, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"I" = ( +/obj/structure/closet/crate/wooden, +/obj/item/stack/sheet/animalhide/goliath_hide, +/obj/item/flashlight/flare/torch, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"J" = ( +/obj/structure/flora/ash/cap_shroom, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"K" = ( +/obj/structure/closet/crate/wooden, +/obj/item/stack/sheet/sinew, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"L" = ( +/obj/effect/decal/cleanable/blood/hitsplatter{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"M" = ( +/obj/structure/statue/bone/skull, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"O" = ( +/obj/structure/statue/bone/rib{ + dir = 1 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"P" = ( +/obj/effect/mob_spawn/corpse/human/skeleton, +/obj/item/shovel/spade, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"S" = ( +/obj/structure/chair/wood/wings{ + color = "#ffff00" + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"T" = ( +/obj/effect/mob_spawn/corpse/human/skeleton, +/obj/item/spear/bonespear{ + pixel_x = 13; + pixel_y = 12 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"U" = ( +/obj/structure/statue/bone/rib, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"V" = ( +/obj/effect/mob_spawn/corpse/human/skeleton, +/obj/item/stack/rods{ + pixel_x = -1; + pixel_y = -7 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"X" = ( +/obj/structure/stone_tile/burnt, +/obj/structure/stone_tile/burnt{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"Y" = ( +/obj/effect/mob_spawn/corpse/human/skeleton, +/obj/item/stack/rods{ + pixel_y = -12; + pixel_x = 2 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) + +(1,1,1) = {" +j +j +j +j +j +j +j +j +j +j +j +j +j +j +j +j +"} +(2,1,1) = {" +j +j +a +j +j +j +j +j +j +j +j +j +a +j +j +j +"} +(3,1,1) = {" +j +a +a +a +j +j +J +G +G +G +j +j +a +a +a +j +"} +(4,1,1) = {" +j +j +a +a +G +K +G +u +T +x +J +a +a +a +j +j +"} +(5,1,1) = {" +j +j +j +J +I +G +G +q +L +G +s +g +a +G +j +j +"} +(6,1,1) = {" +j +j +j +G +s +x +x +G +x +G +x +G +G +D +j +j +"} +(7,1,1) = {" +j +j +V +q +G +p +t +J +G +q +J +O +q +G +j +j +"} +(8,1,1) = {" +j +j +m +u +G +q +f +O +J +O +G +n +J +x +j +j +"} +(9,1,1) = {" +j +j +G +x +G +M +S +n +o +n +X +F +u +G +j +j +"} +(10,1,1) = {" +j +j +J +G +G +u +J +U +G +U +J +G +G +G +j +j +"} +(11,1,1) = {" +j +j +j +q +h +G +G +G +q +G +G +J +m +q +j +j +"} +(12,1,1) = {" +j +j +j +G +G +x +H +x +G +G +q +Y +G +a +j +j +"} +(13,1,1) = {" +j +j +a +G +J +G +G +P +G +u +G +a +a +a +a +j +"} +(14,1,1) = {" +j +a +a +a +j +j +G +G +q +G +j +j +a +a +j +j +"} +(15,1,1) = {" +j +a +a +j +j +j +j +j +j +j +j +a +a +a +j +j +"} +(16,1,1) = {" +j +j +j +j +j +j +j +j +j +j +j +j +j +j +j +j +"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm index af949b000f074..3b220a5022aed 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm @@ -196,6 +196,11 @@ /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, /area/ruin/powered/beach) +"eA" = ( +/obj/item/melee/skateboard/hoverboard, +/obj/machinery/light/directional/west, +/turf/open/floor/pod/light, +/area/ruin/powered/beach) "eE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 1 @@ -220,7 +225,7 @@ /turf/open/floor/wood, /area/ruin/powered/beach) "fS" = ( -/mob/living/simple_animal/crab{ +/mob/living/basic/crab{ name = "Jonny" }, /turf/open/misc/beach/sand, @@ -261,6 +266,10 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/layer4, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors/explored) +"hj" = ( +/obj/structure/flora/tree/palm, +/turf/open/misc/beach/sand, +/area/ruin/powered/beach) "hk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ dir = 4 @@ -339,9 +348,9 @@ /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/directional/north, +"jh" = ( +/obj/machinery/hydroponics/constructable, +/obj/machinery/light/directional/east, /turf/open/floor/iron/grimy, /area/ruin/powered/beach) "kd" = ( @@ -362,11 +371,6 @@ }, /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/bush/sparsegrass/style_random, /obj/item/toy/seashell, @@ -402,6 +406,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/plating, /area/ruin/powered/beach) +"mw" = ( +/obj/structure/flora/coconuts, +/turf/open/misc/beach/sand, +/area/ruin/powered/beach) +"mE" = ( +/obj/machinery/chem_dispenser/drinks/fullupgrade{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/ruin/powered/beach) "mG" = ( /obj/structure/flora/rock/pile/style_random, /turf/open/misc/beach/sand, @@ -506,6 +523,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/closed/wall/mineral/sandstone, /area/ruin/powered/beach) +"qK" = ( +/obj/structure/closet/secure_closet/bar/lavaland_bartender_clothes, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/ruin/powered/beach) "qT" = ( /obj/machinery/light/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -548,27 +570,11 @@ /turf/closed/wall/mineral/wood/nonmetal, /area/ruin/powered/beach) "sA" = ( -/mob/living/simple_animal/crab{ +/mob/living/basic/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("bar") - }, -/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/costume/hawaiian, -/turf/open/floor/wood, -/area/ruin/powered/beach) "sV" = ( /obj/machinery/hydroponics/constructable, /turf/open/floor/iron/grimy, @@ -577,21 +583,6 @@ /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/brown, /turf/open/floor/wood, @@ -737,7 +728,7 @@ /area/ruin/powered/beach) "AB" = ( /obj/effect/turf_decal/sand, -/mob/living/simple_animal/crab{ +/mob/living/basic/crab{ name = "James" }, /turf/open/misc/beach/sand, @@ -796,11 +787,6 @@ }, /turf/closed/wall/mineral/sandstone, /area/ruin/powered/beach) -"Cb" = ( -/obj/structure/flora/coconuts, -/obj/machinery/light/directional/north, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) "Cq" = ( /obj/structure/sign/departments/restroom/directional/east, /turf/open/floor/wood, @@ -815,6 +801,12 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/wood, /area/ruin/powered/beach) +"CL" = ( +/obj/effect/turf_decal/sand, +/obj/structure/sign/warning/no_smoking/circle/directional/east, +/obj/machinery/light/directional/east, +/turf/open/misc/beach/sand, +/area/ruin/powered/beach) "CT" = ( /obj/item/toy/plush/lizard_plushie/green{ name = "Soaks-The-Rays" @@ -835,6 +827,11 @@ }, /turf/open/floor/iron/grimy, /area/ruin/powered/beach) +"Df" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, +/turf/open/floor/wood, +/area/ruin/powered/beach) "Dg" = ( /obj/machinery/hydroponics/constructable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -874,12 +871,6 @@ /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 @@ -896,12 +887,13 @@ }, /turf/open/floor/wood, /area/ruin/powered/beach) -"FF" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/barman_recipes, -/obj/item/reagent_containers/cup/glass/shaker, -/obj/item/reagent_containers/cup/rag, -/turf/open/floor/wood, +"FD" = ( +/obj/structure/sign/poster/contraband/ambrosia_vulgaris/directional/north, +/turf/open/floor/iron/grimy, +/area/ruin/powered/beach) +"FH" = ( +/obj/machinery/light/directional/south, +/turf/open/misc/beach/sand, /area/ruin/powered/beach) "FO" = ( /obj/structure/fluff/beach_umbrella/cap, @@ -952,43 +944,12 @@ /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) "HW" = ( -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/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("bar") - }, -/obj/item/storage/backpack/duffelbag, -/obj/item/etherealballdeployer, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/colocup, -/obj/item/reagent_containers/cup/glass/colocup, -/obj/item/reagent_containers/cup/glass/colocup, -/obj/item/reagent_containers/cup/glass/colocup, -/obj/item/reagent_containers/cup/glass/colocup, +/obj/structure/closet/secure_closet/bar/lavaland_bartender_booze, /turf/open/floor/wood, /area/ruin/powered/beach) "Il" = ( @@ -1005,6 +966,11 @@ "Iv" = ( /turf/open/floor/iron/stairs/right, /area/ruin/powered/beach) +"Iy" = ( +/obj/structure/chair/wood, +/obj/machinery/light/directional/west, +/turf/open/misc/beach/sand, +/area/ruin/powered/beach) "IG" = ( /turf/open/floor/carpet/royalblue, /area/ruin/powered/beach) @@ -1065,6 +1031,20 @@ }, /turf/closed/wall/mineral/sandstone, /area/ruin/powered/beach) +"La" = ( +/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, +/turf/open/floor/iron/grimy, +/area/ruin/powered/beach) "Ld" = ( /turf/open/misc/beach/coast/corner{ dir = 1 @@ -1081,11 +1061,6 @@ }, /turf/open/floor/wood, /area/ruin/powered/beach) -"Mb" = ( -/obj/effect/turf_decal/sand, -/obj/structure/sign/warning/no_smoking/circle/directional/east, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) "Md" = ( /obj/structure/urinal/directional/north, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ @@ -1102,15 +1077,6 @@ }, /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 @@ -1137,10 +1103,6 @@ }, /turf/closed/wall/mineral/wood/nonmetal, /area/ruin/powered/beach) -"Ou" = ( -/obj/structure/flora/tree/palm, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) "OE" = ( /obj/machinery/light/directional/west, /turf/open/floor/wood, @@ -1178,9 +1140,13 @@ /obj/structure/sign/departments/botany/directional/south, /turf/open/misc/beach/sand, /area/ruin/powered/beach) -"Qx" = ( -/obj/structure/flora/coconuts, -/turf/open/misc/beach/sand, +"Qz" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/barman_recipes, +/obj/item/reagent_containers/cup/glass/shaker, +/obj/item/reagent_containers/cup/rag, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, /area/ruin/powered/beach) "QF" = ( /obj/machinery/light/directional/south, @@ -1218,11 +1184,8 @@ /obj/structure/closet/cabinet, /obj/item/storage/backpack/duffelbag, /obj/item/clothing/under/shorts/blue, -/obj/item/clothing/suit/costume/ianshirt, -/obj/item/clothing/shoes/sandal{ - desc = "A very fashionable pair of flip-flops."; - name = "flip-flops" - }, +/obj/item/clothing/suit/costume/wellworn_shirt/graphic/ian, +/obj/item/clothing/shoes/sandal/beach, /obj/item/clothing/glasses/sunglasses, /obj/item/clothing/neck/beads, /turf/open/floor/wood, @@ -1240,7 +1203,7 @@ /area/ruin/powered/beach) "SC" = ( /obj/machinery/light/directional/north, -/mob/living/simple_animal/crab{ +/mob/living/basic/crab{ name = "Eddie" }, /turf/open/misc/beach/sand, @@ -1368,6 +1331,11 @@ "VO" = ( /turf/open/floor/pod/dark, /area/ruin/powered/beach) +"VY" = ( +/obj/structure/flora/coconuts, +/obj/machinery/light/directional/north, +/turf/open/misc/beach/sand, +/area/ruin/powered/beach) "Wa" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, @@ -1458,10 +1426,6 @@ "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 @@ -1514,14 +1478,14 @@ aa Zi BE Mf -kp +Iy fS UT aj oQ Zq -FF -Fi +Qz +Df aF Fr yc @@ -1580,14 +1544,14 @@ VI IG VI VI -VI +FH aj -sM +qK aC aC CK IJ -MO +mE CU Bp "} @@ -1639,7 +1603,7 @@ BE Mf aj aj -Ou +hj VI UT AC @@ -1670,7 +1634,7 @@ aN aT aY rv -Qx +mw VI VI VI @@ -1758,7 +1722,7 @@ BE gg gg Mf -Qx +mw hk VI VI @@ -1832,7 +1796,7 @@ Il GB RE Uk -VI +bd VI bC Ti @@ -1916,7 +1880,7 @@ Bp gX cd VI -Ou +hj CT VI tQ @@ -1948,7 +1912,7 @@ Bp wL MZ dj -Ou +hj aE VI sl @@ -1979,7 +1943,7 @@ MZ Bp wL MZ -Cb +VY VI VI VI @@ -2161,7 +2125,7 @@ wY wY wY AE -AE +eA qf MZ Bp @@ -2194,7 +2158,7 @@ VO og wY wY -Hn +wY Fr yc Bp @@ -2216,8 +2180,8 @@ de TC hq MZ -Ou -Qx +hj +mw VI VI Lm @@ -2284,15 +2248,15 @@ zK Lm Lm Lm -Mb +CL +wY wY -ZZ wY gC oF oU wY -tf +La MZ "} (27,1,1) = {" @@ -2319,7 +2283,7 @@ Sn qF BE yc -kb +FD gC wY kg @@ -2353,7 +2317,7 @@ IL MZ sV Dg -sV +jh CZ sV Zi diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm index 7ab354935c395..ef650913f1410 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm @@ -671,7 +671,7 @@ /area/ruin/powered/clownplanet) "RW" = ( /obj/effect/mapping_helpers/no_lava, -/mob/living/simple_animal/hostile/retaliate/clown, +/mob/living/basic/clown, /turf/open/floor/noslip, /area/ruin/powered/clownplanet) "Tj" = ( @@ -714,7 +714,7 @@ "YI" = ( /obj/machinery/light/small/directional/south, /obj/effect/mapping_helpers/no_lava, -/mob/living/simple_animal/hostile/retaliate/clown, +/mob/living/basic/clown, /turf/open/floor/noslip, /area/ruin/powered/clownplanet) "Zg" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_strong_rock.dmm b/_maps/RandomRuins/LavaRuins/lavaland_strong_rock.dmm index f236a25a6a0e7..ad90df101676a 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_strong_rock.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_strong_rock.dmm @@ -4,7 +4,7 @@ /area/template_noop) "b" = ( /turf/closed/mineral/strong, -/area/template_noop) +/area/lavaland/surface/outdoors) (1,1,1) = {" a diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm index f83887d9b4271..0a6ebba330589 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm @@ -28,12 +28,9 @@ /area/ruin/powered/snow_biodome) "ag" = ( /obj/structure/displaycase/freezeray, +/obj/machinery/light/cold/directional/north, /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/directional/south, /obj/structure/mirror/directional/east, @@ -179,7 +176,7 @@ /turf/open/floor/wood, /area/ruin/powered/snow_biodome) "aO" = ( -/obj/machinery/door/airlock/glass_large, +/obj/machinery/door/airlock/multi_tile/public/glass, /obj/structure/fans/tiny, /turf/open/floor/pod/dark, /area/ruin/powered/snow_biodome) @@ -327,7 +324,6 @@ /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" = ( @@ -364,7 +360,7 @@ /area/ruin/powered/snow_biodome) "Ez" = ( /obj/structure/fans/tiny, -/obj/machinery/door/airlock/glass_large, +/obj/machinery/door/airlock/multi_tile/public/glass, /turf/open/floor/pod/dark, /area/ruin/powered/snow_biodome) "EA" = ( @@ -920,7 +916,7 @@ tb "} (15,1,1) = {" Wg -ah +wN Wg Wg hr diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_dead_ratvar.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_dead_ratvar.dmm index dc1168b07cae0..65a2652915d03 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_dead_ratvar.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_dead_ratvar.dmm @@ -57,10 +57,6 @@ /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, @@ -424,13 +420,13 @@ l l b l -q +l r h h h c -q +l l b l @@ -526,7 +522,7 @@ l l l l -q +l b h h @@ -553,7 +549,7 @@ l l b l -q +l r h h @@ -736,7 +732,7 @@ l l j j -q +l p h m @@ -791,7 +787,7 @@ l l l g -q +l b h l diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm index 39bb644458fb5..52e9e68ac409c 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm @@ -82,42 +82,11 @@ /obj/structure/sign/warning/explosives, /turf/closed/wall, /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, -/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, -/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, -/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, -/obj/item/clothing/head/fedora/curator, -/obj/item/clothing/suit/jacket/curator, -/turf/open/floor/mineral/titanium/white, -/area/ruin/powered/graveyard_shuttle) "cm" = ( /obj/structure/table/optable, /obj/item/storage/backpack/explorer, @@ -125,22 +94,27 @@ /obj/item/restraints/handcuffs/cable/zipties/used, /turf/open/floor/mineral/titanium/white, /area/ruin/powered/graveyard_shuttle) -"cv" = ( -/obj/effect/decal/cleanable/dirt, -/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, +"cO" = ( +/obj/structure/bed, +/obj/item/trash/pistachios, +/obj/item/trash/chips, +/obj/item/bedsheet/brown, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/graveyard_shuttle) +/turf/open/misc/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) "cZ" = ( /obj/structure/stone_tile{ dir = 8 }, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) +"di" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/decal/cleanable/cobweb, +/obj/item/paper/fluff/ruins/elephant_graveyard/hypothesis, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/titanium/white, +/area/ruin/powered/graveyard_shuttle) "do" = ( /obj/structure/stone_tile/block/cracked, /turf/open/misc/asteroid/basalt/wasteland, @@ -154,20 +128,10 @@ /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, -/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, -/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, @@ -236,11 +200,6 @@ /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, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) "nl" = ( /obj/structure/table, /obj/item/pen, @@ -248,14 +207,6 @@ /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, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) "nv" = ( /obj/structure/reagent_dispensers/water_cooler, /turf/open/misc/asteroid/basalt/wasteland, @@ -289,6 +240,12 @@ /obj/structure/stone_tile/slab/cracked, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) +"pI" = ( +/obj/item/light/bulb/broken, +/obj/effect/turf_decal/caution/stand_clear/white, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/titanium/purple, +/area/ruin/powered/graveyard_shuttle) "rb" = ( /obj/item/chair, /turf/open/misc/asteroid/basalt/wasteland, @@ -300,6 +257,15 @@ /obj/item/wrench, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) +"rH" = ( +/obj/structure/closet/crate/bin, +/obj/item/trash/candle, +/obj/item/trash/can/food/beans, +/obj/item/trash/can, +/obj/effect/decal/cleanable/dirt, +/obj/item/cigbutt, +/turf/open/misc/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) "sg" = ( /obj/structure/table, /obj/structure/cable, @@ -323,12 +289,22 @@ /obj/effect/mob_spawn/corpse/human/skeleton, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) -"vc" = ( +"vk" = ( /obj/structure/closet/crate/grave/filled, /obj/effect/decal/cleanable/dirt, /obj/effect/mob_spawn/corpse/human/skeleton, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) +"vP" = ( +/obj/item/light/bulb/broken, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/titanium/white, +/area/ruin/powered/graveyard_shuttle) +"vS" = ( +/obj/structure/stone_tile, +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) "wk" = ( /obj/structure/table, /obj/item/tape/random, @@ -381,6 +357,15 @@ /obj/item/assembly/mousetrap, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) +"Bf" = ( +/obj/structure/stone_tile/slab/cracked, +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"Bo" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/titanium/white, +/area/ruin/powered/graveyard_shuttle) "Br" = ( /obj/structure/cable, /turf/open/misc/asteroid/basalt/wasteland, @@ -392,6 +377,11 @@ /obj/structure/flora/rock/style_random, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) +"Cp" = ( +/obj/item/stack/medical/gauze/improvised, +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) "Cu" = ( /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface) @@ -428,17 +418,16 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) +"GC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/cigbutt, +/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, -/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, @@ -449,15 +438,35 @@ /obj/item/paper_bin, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) +"IR" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/shuttle{ + name = "Archaeology Shuttle Airlock" + }, +/turf/open/floor/mineral/titanium/purple, +/area/ruin/powered/graveyard_shuttle) "Jd" = ( /obj/structure/stone_tile/cracked, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) +"JD" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/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) +"Kg" = ( +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/head/fedora/curator, +/obj/item/clothing/suit/jacket/curator, +/turf/open/floor/mineral/titanium/white, +/area/ruin/powered/graveyard_shuttle) "Kj" = ( /obj/item/organ/internal/heart, /obj/item/organ/internal/eyes, @@ -517,16 +526,6 @@ /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, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"PM" = ( -/obj/structure/stone_tile/slab/cracked, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) "PN" = ( /obj/machinery/power/floodlight, /obj/structure/cable, @@ -561,17 +560,14 @@ /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, +"Vv" = ( /obj/item/cigbutt, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) -"Vv" = ( -/obj/item/cigbutt, +"VM" = ( +/obj/structure/bed, +/obj/item/bedsheet/brown, +/obj/effect/decal/cleanable/dirt, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) "WF" = ( @@ -762,7 +758,7 @@ ab ab bf bf -UN +rH Oa bf bf @@ -801,7 +797,7 @@ bf bf AG Vv -eG +GC gB bf bf @@ -979,7 +975,7 @@ bf bf bf Br -OC +JD gB gB gB @@ -1029,11 +1025,11 @@ gB Di oL gB -eq +vS gB gB UE -vc +vk bf bf dr @@ -1060,7 +1056,7 @@ gB gB ZH do -PM +Bf gB do gB @@ -1175,7 +1171,7 @@ gB gB gB gB -vc +vk gB gB gB @@ -1338,7 +1334,7 @@ ac ac NO dr -bV +ac ac ac "} @@ -1460,10 +1456,10 @@ aa ab ab bf -Ix +VM WZ dr -nt +cO bf bf bf @@ -1498,14 +1494,14 @@ aa ab at uj -mO +Cp gl AB bf aH aH ZC -bW +IR ZC aH aH @@ -1540,10 +1536,10 @@ bf bf aH aN -bQ +di bh -cv -bU +Bo +vP by aH aH @@ -1577,11 +1573,11 @@ ab ab YM aO -bX +Kg bi bp bi -cx +pI bE aH jx diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm index e7afbb5e3a1fd..ed7a0aef9e22d 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm @@ -18,9 +18,7 @@ /turf/open/floor/plating, /area/ruin/unpowered) "f" = ( -/obj/structure/mirror/directional/east{ - icon_state = "mirror_broke" - }, +/obj/structure/mirror/broken/directional/east, /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/ruin/unpowered) @@ -41,16 +39,12 @@ /turf/open/floor/plating, /area/ruin/unpowered) "k" = ( -/obj/structure/mirror/directional/north{ - icon_state = "mirror_broke" - }, +/obj/structure/mirror/broken/directional/north, /obj/item/knife/envy, /turf/open/floor/plating, /area/ruin/unpowered) "l" = ( -/obj/structure/mirror/directional/east{ - icon_state = "mirror_broke" - }, +/obj/structure/mirror/broken/directional/east, /turf/open/floor/plating, /area/ruin/unpowered) "m" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm index 27e36df29f7a5..d138d1c39f24c 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm @@ -11,7 +11,6 @@ "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" = ( @@ -21,12 +20,12 @@ "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, +/obj/machinery/light/small/directional/west, /turf/open/floor/carpet, /area/ruin/powered/greed) "i" = ( @@ -35,6 +34,7 @@ "j" = ( /obj/structure/table/wood/poker, /obj/item/coin/adamantine, +/obj/machinery/light/small/directional/east, /turf/open/floor/carpet, /area/ruin/powered/greed) "k" = ( @@ -95,12 +95,11 @@ /area/ruin/powered/greed) "v" = ( /obj/item/coin/gold, -/obj/machinery/light/small/directional/south, +/obj/machinery/light/small/directional/west, /turf/open/floor/engine/cult, /area/ruin/powered/greed) "w" = ( -/obj/item/storage/bag/money, -/obj/machinery/light/small/directional/south, +/obj/machinery/light/small/directional/east, /turf/open/floor/engine/cult, /area/ruin/powered/greed) "J" = ( @@ -301,9 +300,9 @@ l m m m -l -m v +m +l W W a @@ -345,9 +344,9 @@ l m m l -m -l w +l +o W W a diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm index 72e8336571778..8fc2a2b03deee 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm @@ -102,7 +102,7 @@ "ff" = ( /obj/effect/mapping_helpers/burnt_floor, /obj/structure/fluff{ - icon = 'icons/obj/computer.dmi'; + icon = 'icons/obj/machines/computer.dmi'; icon_state = "television"; name = "old tv"; desc = "A modern plasma display boxed in by a rustic wooden frame and mock antenna. Just like the old, old, old days." @@ -496,7 +496,7 @@ /turf/open/floor/carpet/blue/lavaland, /area/ruin/unpowered) "Fg" = ( -/mob/living/simple_animal/hostile/asteroid/goliath/beast, +/mob/living/basic/mining/goliath, /obj/effect/decal/cleanable/blood/old, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_random_ripley.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_random_ripley.dmm index c4923a38c4c61..4c82e52088774 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_random_ripley.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_random_ripley.dmm @@ -9,7 +9,7 @@ /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "d" = ( -/obj/vehicle/sealed/mecha/working/ripley/mining, +/obj/vehicle/sealed/mecha/ripley/mining, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "e" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm index 005c4f3eb653c..c70a28308c3ec 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm @@ -60,11 +60,6 @@ /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) @@ -80,17 +75,6 @@ /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, @@ -104,7 +88,7 @@ /turf/open/floor/iron/dark, /area/ruin/powered/seedvault) "as" = ( -/obj/machinery/door/airlock/glass_large, +/obj/machinery/door/airlock/multi_tile/public/glass, /turf/open/floor/iron/freezer, /area/ruin/powered/seedvault) "at" = ( @@ -183,16 +167,6 @@ /obj/item/vending_refill/hydroseeds, /turf/open/floor/vault, /area/ruin/powered/seedvault) -"aC" = ( -/obj/structure/sink/directional/east, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"aD" = ( -/obj/structure/sink/directional/west, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) "aE" = ( /obj/structure/closet/crate/hydroponics, /obj/structure/beebox, @@ -238,11 +212,6 @@ }, /turf/open/floor/iron/dark, /area/ruin/powered/seedvault) -"aK" = ( -/obj/structure/sink/directional/west, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) "aL" = ( /obj/structure/table/wood, /obj/item/geneshears{ @@ -353,12 +322,6 @@ }, /turf/open/floor/vault, /area/ruin/powered/seedvault) -"aZ" = ( -/obj/structure/sink/directional/east, -/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 @@ -411,19 +374,6 @@ }, /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{ @@ -509,18 +459,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/bush/sunny/style_random, /obj/structure/flora/grass/jungle/b/style_random, @@ -531,13 +469,6 @@ /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/misc/grass/lavaland, /area/ruin/powered/seedvault) -"bt" = ( -/obj/structure/window/spawner/directional/south, -/obj/structure/flora/bush/flowers_pp/style_random, -/obj/structure/flora/bush/generic/style_random, -/obj/structure/flora/bush/flowers_br/style_random, -/turf/open/misc/grass/lavaland, -/area/ruin/powered/seedvault) "bu" = ( /obj/structure/window/spawner/directional/east, /obj/structure/flora/bush/ferny/style_random, @@ -546,16 +477,6 @@ /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, @@ -612,34 +533,77 @@ }, /turf/open/floor/iron/freezer, /area/ruin/powered/seedvault) +"ds" = ( +/obj/effect/mob_spawn/ghost_role/human/seed_vault, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/light/directional/east, +/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) +"hf" = ( +/obj/structure/sink/directional/east, +/turf/open/floor/iron/dark, +/area/ruin/powered/seedvault) +"le" = ( +/obj/structure/window/spawner/directional/south, +/obj/structure/flora/bush/flowers_pp/style_random, +/obj/structure/flora/bush/generic/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/misc/grass/lavaland, +/area/ruin/powered/seedvault) +"og" = ( +/obj/effect/mob_spawn/ghost_role/human/seed_vault, +/turf/open/floor/iron/freezer, +/area/ruin/powered/seedvault) "oR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 10 }, /turf/open/floor/iron/freezer, /area/ruin/powered/seedvault) +"pZ" = ( +/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) +"rF" = ( +/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) +"rX" = ( +/obj/structure/sink/directional/east, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/iron/dark, +/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" = ( +"vc" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/light/floor, /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 - }, +"Bb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/iron/freezer, /area/ruin/powered/seedvault) "GN" = ( @@ -656,11 +620,25 @@ }, /turf/open/floor/vault, /area/ruin/powered/seedvault) +"Ik" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/light/floor, +/turf/open/floor/iron/freezer, +/area/ruin/powered/seedvault) +"Kq" = ( +/obj/structure/sink/directional/west, +/turf/open/floor/iron/dark, +/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) +"OE" = ( +/obj/effect/mob_spawn/ghost_role/human/seed_vault, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/freezer, +/area/ruin/powered/seedvault) "PH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 @@ -677,6 +655,15 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/iron/freezer, /area/ruin/powered/seedvault) +"VF" = ( +/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) (1,1,1) = {" eq @@ -747,7 +734,7 @@ ab (4,1,1) = {" aa ac -ak +OE ah ac ca @@ -769,7 +756,7 @@ aa (5,1,1) = {" aa ac -ap +og ah as PH @@ -791,7 +778,7 @@ aa (6,1,1) = {" aa ac -ap +og Vn Bb Bb @@ -813,7 +800,7 @@ aa (7,1,1) = {" aa ac -aq +ds ah ac PH @@ -824,9 +811,9 @@ ac ac ac ac +rF bc -bc -bc +rF ac ac bD @@ -885,9 +872,9 @@ al PH ah al -aC +hf ac -aZ +rX bb aN bd @@ -895,7 +882,7 @@ ba bo aN aN -bv +VF ac "} (11,1,1) = {" @@ -906,11 +893,11 @@ Vn Bb Bb Bb -Bb +Ik Bb aH Bb -DA +vc Uz aV aW @@ -929,9 +916,9 @@ al PH ah al -aD +Kq ac -aK +Kq bb aN bf @@ -939,7 +926,7 @@ bi bp aN aN -bv +VF ac "} (13,1,1) = {" @@ -1000,9 +987,9 @@ aA ac ac ac -bg +pZ bl -bq +rF ac ac ac @@ -1014,7 +1001,7 @@ aj al al al -Eu +PH ac ac ac @@ -1046,7 +1033,7 @@ GN ac bm br -bt +le ab ab aa diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm index e72dfb7c9fda8..4894dbce32b1b 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm @@ -55,7 +55,7 @@ /obj/structure/bed/pod, /obj/item/bedsheet/black, /obj/structure/tubes, -/obj/machinery/light/small/directional/east, +/obj/machinery/light/small/broken/directional/east, /turf/open/floor/pod/dark, /area/ruin/powered) "n" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm index 3b5733b1b65b5..7497b5bb9079d 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm @@ -8,24 +8,6 @@ "ae" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/syndicate_lava_base/testlab) -"ag" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/obj/effect/mapping_helpers/airalarm/syndicate_access, -/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/machinery/barsign/all_access/directional/south{ - chosen_sign = "/datum/barsign/hiddensigns/syndibarsign" - }, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/bar) "ai" = ( /obj/structure/table/wood, /obj/machinery/chem_dispenser/drinks/fullupgrade{ @@ -66,17 +48,15 @@ }, /turf/open/floor/plating, /area/ruin/syndicate_lava_base/chemistry) -"aC" = ( -/obj/structure/fans/tiny, -/obj/machinery/door/airlock/external/ruin{ - name = "Turbine Exhaust Chamber Access" - }, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, -/obj/effect/mapping_helpers/airlock_note_placer{ - note_info = "You are expected to build the cooling system for the exhaust yourself." +"aA" = ( +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" }, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/engineering) +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/duct, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/dormitories) "aG" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible/layer4, @@ -94,11 +74,36 @@ /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, +"aO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/shower/directional/east{ + desc = "The HS-452. Installed recently by the Donk Co. Hygiene Division."; + name = "emergency shower" + }, /turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) +/area/ruin/syndicate_lava_base/engineering) +"aU" = ( +/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 = 8 + }, +/area/ruin/syndicate_lava_base/medbay) +"aV" = ( +/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate{ + dir = 8 + }, +/obj/machinery/airalarm/directional/north, +/obj/item/bedsheet/syndie, +/obj/structure/bed, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/turf/open/floor/carpet/red, +/area/ruin/syndicate_lava_base/dormitories) "aW" = ( /obj/machinery/button/door{ id = "lavalandsyndi_arrivals"; @@ -109,35 +114,37 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/arrivals) -"aY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"bd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/chemistry) -"bq" = ( +"bi" = ( +/obj/machinery/firealarm/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, /turf/open/floor/iron/white/side{ + dir = 8 + }, +/area/ruin/syndicate_lava_base/chemistry) +"bz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/turf_decal/sand/plating/volcanic, +/turf/open/floor/plating/lavaland_atmos, +/area/lavaland/surface/outdoors) +"bB" = ( +/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate{ dir = 4 }, -/area/ruin/syndicate_lava_base/arrivals) -"bx" = ( -/obj/machinery/syndicatebomb/self_destruct{ - anchored = 1 +/obj/machinery/airalarm/directional/north, +/obj/item/bedsheet/syndie{ + dir = 4 }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/circuit/red, -/area/ruin/syndicate_lava_base/main) +/obj/structure/bed{ + dir = 4 + }, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/turf/open/floor/carpet/red, +/area/ruin/syndicate_lava_base/dormitories) "bC" = ( /obj/machinery/light/small/directional/north, /obj/structure/table, @@ -148,75 +155,63 @@ 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/layer2, -/obj/machinery/door/airlock/engineering{ - name = "Engineering" +"bE" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 }, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"bP" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ - dir = 8 +/area/ruin/syndicate_lava_base/cargo) +"bQ" = ( +/obj/machinery/sleeper/syndie{ + dir = 4 }, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/engineering) -"bV" = ( -/obj/machinery/airalarm/directional/north, /obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airalarm/syndicate_access, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/dormitories) -"bY" = ( -/obj/structure/closet/crate, -/obj/item/vending_refill/snack{ - pixel_x = -3; - pixel_y = 3 +/turf/open/floor/iron/white/side{ + dir = 8 }, -/obj/item/vending_refill/snack{ - pixel_x = -3; - pixel_y = 3 +/area/ruin/syndicate_lava_base/medbay) +"bS" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Water Supply" }, -/obj/item/vending_refill/coffee, -/obj/item/vending_refill/cola, +/obj/machinery/duct, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/plating, +/area/ruin/syndicate_lava_base/dormitories) +"bW" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) +/obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/ruin/syndicate_lava_base/arrivals) "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/machinery/vending/assist, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) -"cn" = ( -/obj/effect/turf_decal/tile/red/half/contrasted, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"cq" = ( -/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{ +"cb" = ( +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, +/obj/machinery/button/door{ + id = "lavalandsyndi_cargo"; + name = "Cargo Bay Blast Door Control"; + pixel_x = 26; + req_access = list("syndicate") + }, /turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) +/area/ruin/syndicate_lava_base/cargo) +"ce" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Dormitories" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/wood, +/area/ruin/syndicate_lava_base/dormitories) "cA" = ( /obj/structure/table/reinforced, /obj/item/book/manual/wiki/chemistry, @@ -256,42 +251,60 @@ /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/directional/north, +"cP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/light/small/directional/east, +/obj/machinery/airalarm/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/engineering) +"cY" = ( +/obj/machinery/light/small/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/machinery/duct, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/main) +"dc" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 }, -/obj/effect/mapping_helpers/airalarm/syndicate_access, +/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/syndicate_lava_base/arrivals) -"de" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +"di" = ( +/obj/machinery/airalarm/directional/west, +/obj/structure/sink/directional/east, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/obj/machinery/light/small/directional/west, /turf/open/floor/iron/white/side{ - dir = 1 + dir = 8 }, /area/ruin/syndicate_lava_base/virology) -"do" = ( -/obj/structure/closet/secure_closet/medical1{ - req_access = list("syndicate") - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/box/beakers/bluespace, -/obj/item/storage/box/beakers/bluespace, -/obj/item/construction/plumbing, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, +"ds" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, /turf/open/floor/iron/white/side{ - dir = 9 + dir = 4 }, -/area/ruin/syndicate_lava_base/chemistry) +/area/ruin/syndicate_lava_base/arrivals) "dv" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -308,34 +321,9 @@ /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/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/syndicate_access, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/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/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/chemistry) "dC" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -383,89 +371,29 @@ /obj/machinery/igniter/incinerator_syndicatelava, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/engineering) -"dL" = ( -/obj/machinery/airalarm/directional/north, -/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, -/obj/effect/mapping_helpers/airalarm/syndicate_access, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) -"dP" = ( -/turf/closed/wall/mineral/plastitanium/explosive, -/area/ruin/syndicate_lava_base/chemistry) "dQ" = ( /obj/structure/sign/warning/secure_area, /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/syndicate_lava_base/testlab) -"dU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) +"dV" = ( +/obj/machinery/atmospherics/miner/plasma, +/turf/open/floor/engine/plasma, +/area/ruin/syndicate_lava_base/engineering) "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/cup/beaker/large{ - pixel_x = -3 - }, -/obj/item/reagent_containers/cup/beaker/large{ - pixel_x = -3 +"eb" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 }, -/obj/item/reagent_containers/dropper, -/obj/machinery/airalarm/directional/east, /obj/effect/decal/cleanable/dirt, -/obj/item/screwdriver/nuke{ - pixel_y = 18 - }, -/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/iron/white/side{ - dir = 4 + dir = 10 }, -/area/ruin/syndicate_lava_base/chemistry) +/area/ruin/syndicate_lava_base/virology) "ee" = ( /obj/structure/rack, /obj/item/flashlight{ @@ -538,6 +466,25 @@ dir = 6 }, /area/ruin/syndicate_lava_base/chemistry) +"ey" = ( +/obj/machinery/sleeper/syndie{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white/side{ + dir = 8 + }, +/area/ruin/syndicate_lava_base/medbay) +"ez" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/structure/reagent_dispensers/water_cooler{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/cargo) "eD" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -553,15 +500,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/mineral/plastitanium, /area/ruin/syndicate_lava_base/cargo) -"eF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/obj/effect/mapping_helpers/airalarm/syndicate_access, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) "eG" = ( /obj/structure/closet/secure_closet/personal/patient, /obj/effect/decal/cleanable/dirt, @@ -569,16 +507,6 @@ dir = 9 }, /area/ruin/syndicate_lava_base/virology) -"eH" = ( -/obj/structure/bed{ - dir = 4 - }, -/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, @@ -597,20 +525,6 @@ }, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) -"eM" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/computer/turbine_computer{ - dir = 1; - mapping_id = "syndie_lavaland_incineratorturbine" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/button/door/incinerator_vent_syndicatelava_main{ - pixel_y = -23; - id = "syndicatelava_mainvent_outer"; - name = "turbine exhaust chamber vent control" - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) "eS" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -634,32 +548,18 @@ /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/layer2{ - dir = 1 +"eZ" = ( +/obj/machinery/door/airlock/vault{ + id_tag = "syndie_lavaland_vault" }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/effect/mapping_helpers/airlock/locked, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) +/area/ruin/syndicate_lava_base/main) "fa" = ( /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, /obj/machinery/door/firedoor, @@ -673,41 +573,13 @@ }, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/cargo) -"fd" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"fe" = ( +"fc" = ( +/obj/structure/filingcabinet/chestdrawer, /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/structure/cable, /turf/open/floor/mineral/plastitanium, /area/ruin/syndicate_lava_base/cargo) -"ff" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - 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/layer2{ - 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{ @@ -736,6 +608,37 @@ dir = 5 }, /area/ruin/syndicate_lava_base/virology) +"fk" = ( +/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 = list("syndicate") + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/main) +"fm" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/arrivals) "fn" = ( /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, /obj/machinery/door/firedoor, @@ -761,36 +664,11 @@ /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/directional/west, -/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/half/contrasted{ - dir = 8 - }, -/obj/effect/mapping_helpers/airalarm/syndicate_access, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"fw" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/firealarm/directional/east, +"fv" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) +/area/ruin/syndicate_lava_base/chemistry) "fx" = ( /obj/structure/sign/warning/secure_area, /turf/closed/wall/mineral/plastitanium/nodiagonal, @@ -823,21 +701,6 @@ dir = 5 }, /area/ruin/syndicate_lava_base/virology) -"fD" = ( -/obj/machinery/microwave, -/obj/structure/table/reinforced, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"fE" = ( -/obj/effect/turf_decal/bot, -/obj/structure/closet/l3closet, -/obj/machinery/light/small/directional/west, -/obj/machinery/airalarm/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/biohazard/directional/west, -/obj/effect/mapping_helpers/airalarm/syndicate_access, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) "fF" = ( /obj/effect/turf_decal/bot, /obj/machinery/shower/directional/south, @@ -849,27 +712,37 @@ dir = 1 }, /area/ruin/syndicate_lava_base/main) -"fO" = ( -/turf/open/floor/iron/white/side{ - dir = 1 +"fK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/ruin/syndicate_lava_base/virology) +"fL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock{ + name = "Bar Storage" }, -/area/ruin/syndicate_lava_base/main) -"fY" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/bar) +"fM" = ( /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/anticorner/contrasted{ - dir = 1 +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 }, +/obj/item/paper_bin, +/obj/structure/table, /turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) +/area/ruin/syndicate_lava_base/main) +"fO" = ( +/turf/open/floor/iron/white/side{ + dir = 1 + }, +/area/ruin/syndicate_lava_base/main) "gb" = ( /obj/structure/table, /obj/item/paper_bin, @@ -899,11 +772,6 @@ }, /turf/open/floor/plating, /area/ruin/syndicate_lava_base/cargo) -"gf" = ( -/obj/structure/sign/warning/vacuum/external/directional/south, -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/cargo) "gg" = ( /obj/structure/sign/warning/fire/directional/north, /obj/structure/sign/warning/xeno_mining/directional/south, @@ -918,17 +786,30 @@ }, /turf/open/floor/plating, /area/ruin/syndicate_lava_base/cargo) -"gi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/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/dark, -/area/ruin/syndicate_lava_base/bar) "gj" = ( /turf/closed/wall/mineral/plastitanium/explosive, /area/ruin/syndicate_lava_base/virology) +"gt" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/chemistry) +"gv" = ( +/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/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/bar) "gO" = ( /obj/structure/sign/departments/cargo, /turf/closed/wall/mineral/plastitanium/nodiagonal, @@ -945,31 +826,6 @@ /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 = list("syndicate") - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"gU" = ( -/obj/machinery/airalarm/directional/west, -/obj/structure/sink/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airalarm/syndicate_access, -/turf/open/floor/iron/white/side{ - dir = 8 - }, -/area/ruin/syndicate_lava_base/virology) "gV" = ( /obj/structure/chair/office/light, /turf/open/floor/iron, @@ -999,16 +855,6 @@ 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/layer2{ - 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) @@ -1032,55 +878,14 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /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/half/contrasted, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) "hh" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/red/half/contrasted, /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, -/obj/machinery/duct, -/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, -/obj/structure/cable, -/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 = list("syndicate"); - shuttleId = "syndie_cargo" - }, -/obj/structure/cable, -/turf/open/floor/mineral/plastitanium, -/area/ruin/syndicate_lava_base/cargo) "hp" = ( /obj/effect/decal/cleanable/dirt, /mob/living/carbon/human/species/monkey{ @@ -1166,6 +971,15 @@ "hz" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/syndicate_lava_base/dormitories) +"hA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/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/ruin/syndicate_lava_base/main) "hB" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 @@ -1179,13 +993,6 @@ }, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/cargo) -"hD" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/syndicate_lava_base/cargo) "hE" = ( /mob/living/carbon/human/species/monkey{ faction = list("neutral","Syndicate") @@ -1194,14 +1001,6 @@ dir = 10 }, /area/ruin/syndicate_lava_base/virology) -"hF" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - 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{ @@ -1218,10 +1017,6 @@ }, /turf/open/floor/plating, /area/ruin/syndicate_lava_base/virology) -"hI" = ( -/obj/structure/sign/warning/vacuum/external/directional/west, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/main) "hJ" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -1237,36 +1032,9 @@ /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/directional/north, -/obj/item/crowbar/red, -/obj/effect/mapping_helpers/airalarm/syndicate_access, -/turf/open/floor/carpet/red, -/area/ruin/syndicate_lava_base/dormitories) -"hN" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/carpet/red, -/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/layer2, -/turf/open/floor/carpet/red, -/area/ruin/syndicate_lava_base/dormitories) -"hQ" = ( -/obj/structure/table/wood, -/obj/item/ammo_box/magazine/m9mm, -/obj/machinery/airalarm/directional/north, -/obj/item/crowbar/red, -/obj/effect/mapping_helpers/airalarm/syndicate_access, -/turf/open/floor/carpet/red, -/area/ruin/syndicate_lava_base/dormitories) "hS" = ( /obj/structure/table/reinforced, /obj/item/folder, @@ -1286,21 +1054,6 @@ /obj/effect/turf_decal/tile/brown/half/contrasted, /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/half/contrasted, -/obj/structure/reagent_dispensers/water_cooler{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"hV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/obj/machinery/autolathe/hacked, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) "hW" = ( /obj/machinery/porta_turret/syndicate{ dir = 10 @@ -1326,28 +1079,12 @@ }, /turf/open/floor/plating, /area/ruin/syndicate_lava_base/main) -"ie" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"if" = ( +/obj/structure/sign/warning/explosives/alt/directional/east, /obj/structure/cable, -/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, -/obj/effect/turf_decal/sand/plating/volcanic, -/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, -/obj/effect/turf_decal/sand/plating/volcanic, -/turf/open/floor/plating/lavaland_atmos, -/area/lavaland/surface/outdoors) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/circuit/red, +/area/ruin/syndicate_lava_base/main) "ii" = ( /obj/structure/table, /obj/item/storage/toolbox/emergency, @@ -1358,23 +1095,6 @@ }, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) -"ij" = ( -/obj/effect/turf_decal/box/white/corners{ - dir = 4 - }, -/obj/structure/closet/crate/radiation, -/obj/item/clothing/suit/utility/radiation, -/obj/item/clothing/suit/utility/radiation, -/obj/item/clothing/suit/utility/radiation, -/obj/item/clothing/head/utility/radiation, -/obj/item/clothing/head/utility/radiation, -/obj/item/clothing/head/utility/radiation, -/obj/item/geiger_counter, -/obj/item/geiger_counter, -/obj/item/geiger_counter, -/obj/item/reagent_containers/cup/glass/bottle/vodka, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) "ik" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -1385,112 +1105,55 @@ /obj/structure/sign/warning/secure_area, /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 = list("syndicate") - }, -/turf/open/floor/circuit/red, -/area/ruin/syndicate_lava_base/main) -"iu" = ( -/obj/effect/turf_decal/stripes/line{ +"iF" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, -/obj/effect/mapping_helpers/no_lava, -/obj/effect/turf_decal/sand/plating/volcanic, -/turf/open/floor/plating/lavaland_atmos, -/area/lavaland/surface/outdoors) -"iv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/no_lava, -/obj/effect/turf_decal/sand/plating/volcanic, -/turf/open/floor/plating/lavaland_atmos, -/area/lavaland/surface/outdoors) -"iw" = ( -/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/medbay) +"iG" = ( +/obj/machinery/firealarm/directional/west, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/obj/item/paper_bin, -/obj/structure/table, -/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/wood, -/area/ruin/syndicate_lava_base/dormitories) -"iz" = ( -/obj/structure/noticeboard/directional/north, -/obj/item/paper{ - default_raw_text = "The next person who steals my ammunition I will shoot myself." - }, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/dormitories) -"iC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/dormitories) -"iG" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable, /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 }, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) -"iM" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/sand/plating/volcanic, -/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/layer4{ - dir = 4 +"iQ" = ( +/obj/machinery/airalarm/directional/west, +/obj/structure/table, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/head/soft{ + pixel_x = -8 }, -/obj/effect/turf_decal/tile/red/half/contrasted{ +/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/half/contrasted{ dir = 8 }, +/obj/effect/mapping_helpers/airalarm/syndicate_access, /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" - }, +/area/ruin/syndicate_lava_base/cargo) +"iU" = ( +/obj/machinery/light/small/directional/south, /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/manifold4w/supply/hidden/layer4, /obj/machinery/duct, /turf/open/floor/wood, -/area/ruin/syndicate_lava_base/bar) -"iS" = ( -/obj/effect/turf_decal/stripes/red/line{ - 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/circuit/red, -/area/ruin/syndicate_lava_base/main) +/area/ruin/syndicate_lava_base/dormitories) "iZ" = ( /obj/structure/extinguisher_cabinet/directional/west, /obj/effect/decal/cleanable/dirt, @@ -1500,25 +1163,15 @@ }, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) -"jb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"jd" = ( +/obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, /obj/structure/cable, -/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{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white/side{ dir = 1 }, -/obj/effect/mapping_helpers/no_lava, -/obj/effect/turf_decal/sand/plating/volcanic, -/turf/open/floor/plating/lavaland_atmos, -/area/lavaland/surface/outdoors) +/area/ruin/syndicate_lava_base/main) "ji" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/effect/mapping_helpers/apc/syndicate_access, @@ -1528,11 +1181,6 @@ }, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) -"jk" = ( -/obj/effect/mapping_helpers/no_lava, -/obj/effect/turf_decal/sand/plating/volcanic, -/turf/open/floor/plating/lavaland_atmos, -/area/lavaland/surface/outdoors) "jl" = ( /obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 8 @@ -1540,34 +1188,15 @@ /turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) "jm" = ( +/obj/structure/closet/emcloset/anchored, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/anticorner/contrasted, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/dormitories) "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, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"jw" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/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, @@ -1586,35 +1215,6 @@ /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, -/obj/item/crowbar/red, -/turf/open/floor/carpet/red, -/area/ruin/syndicate_lava_base/dormitories) -"jB" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/carpet/red, -/area/ruin/syndicate_lava_base/dormitories) -"jC" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/carpet/red, -/area/ruin/syndicate_lava_base/dormitories) -"jD" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/end, -/obj/machinery/door/window/brigdoor{ - name = "Turbine Access" - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) "jM" = ( /obj/machinery/light/small/directional/north, /obj/structure/chair{ @@ -1628,14 +1228,6 @@ }, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) -"jO" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) "jP" = ( /turf/closed/wall/mineral/plastitanium/explosive, /area/ruin/syndicate_lava_base/bar) @@ -1646,30 +1238,6 @@ }, /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/directional/east{ - desc = "The HS-452. Installed recently by the Donk Co. Hygiene Division."; - name = "emergency shower" - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"jY" = ( -/obj/structure/chair{ - 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/dark, -/area/ruin/syndicate_lava_base/bar) "jZ" = ( /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) @@ -1679,55 +1247,45 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) -"kb" = ( -/obj/structure/reagent_dispensers/plumbed, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"kj" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"kp" = ( +"kl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"kq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/obj/machinery/duct, +/obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"ks" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Bar" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/red/half/contrasted, -/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/side{ - dir = 1 - }, -/area/ruin/syndicate_lava_base/bar) +/area/ruin/syndicate_lava_base/cargo) +"kn" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/sand/plating/volcanic, +/turf/open/floor/plating/lavaland_atmos, +/area/ruin/syndicate_lava_base/arrivals) "kt" = ( +/obj/structure/closet/crate/secure/gear{ + req_access = list("syndicate") + }, +/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/structure/closet/l3closet/janitor, -/obj/item/reagent_containers/spray/cleaner, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/main) +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/box/white/corners{ + dir = 1 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/cargo) "kv" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/side, @@ -1748,12 +1306,33 @@ }, /turf/open/floor/iron/white/side, /area/ruin/syndicate_lava_base/main) +"kD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/carpet/red, +/area/ruin/syndicate_lava_base/dormitories) +"kE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/arrivals) "kH" = ( /obj/structure/chair{ dir = 8 }, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) +"kK" = ( +/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/white, +/area/ruin/syndicate_lava_base/virology) "kM" = ( /obj/machinery/firealarm/directional/east, /obj/machinery/vending/cigarette{ @@ -1763,15 +1342,10 @@ /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/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/machinery/duct, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) +"kO" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/ruin/syndicate_lava_base/main) "kP" = ( /obj/structure/reagent_dispensers/watertank, /obj/effect/decal/cleanable/dirt, @@ -1802,6 +1376,11 @@ /obj/structure/sign/departments/medbay/alt, /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/syndicate_lava_base/medbay) +"kU" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/carpet/red, +/area/ruin/syndicate_lava_base/dormitories) "kV" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -1828,21 +1407,6 @@ /obj/structure/cable, /turf/open/lava/smooth/lava_land_surface, /area/ruin/syndicate_lava_base/main) -"ld" = ( -/obj/machinery/air_sensor{ - chamber_id = "lavalandsyndieco2" - }, -/obj/structure/sign/poster/official/wtf_is_co2/directional/north{ - dir = 1 - }, -/turf/open/floor/engine/co2, -/area/ruin/syndicate_lava_base/engineering) -"le" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/sand/plating/volcanic, -/turf/open/floor/plating/lavaland_atmos, -/area/ruin/syndicate_lava_base/arrivals) "lf" = ( /obj/machinery/light/small/directional/west, /obj/structure/chair{ @@ -1873,6 +1437,18 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/ruin/syndicate_lava_base/bar) +"lj" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Dormitories" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/turf/open/floor/wood, +/area/ruin/syndicate_lava_base/dormitories) "lk" = ( /obj/structure/table/wood, /obj/machinery/light/small/directional/east, @@ -1927,20 +1503,6 @@ /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, -/obj/effect/turf_decal/sand/plating/volcanic, -/turf/open/floor/plating/lavaland_atmos, -/area/lavaland/surface/outdoors) -"lw" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/no_lava, -/obj/effect/turf_decal/sand/plating/volcanic, -/turf/open/floor/plating/lavaland_atmos, -/area/lavaland/surface/outdoors) "ly" = ( /obj/structure/chair/stool/bar/directional/east, /turf/open/floor/iron/dark, @@ -1957,27 +1519,10 @@ }, /turf/open/floor/wood, /area/ruin/syndicate_lava_base/bar) -"lE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/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 = 8 - }, -/area/ruin/syndicate_lava_base/medbay) -"lH" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, +"lF" = ( +/obj/structure/sign/warning/vacuum/external/directional/west, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, /area/ruin/syndicate_lava_base/arrivals) "lI" = ( /turf/open/floor/iron, @@ -1986,36 +1531,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/medbay) -"lL" = ( -/obj/machinery/airalarm/directional/west, -/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/utility/welding, -/obj/item/weldingtool/largetank, -/obj/item/analyzer, -/obj/effect/mapping_helpers/airalarm/syndicate_access, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"lM" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 +"lP" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ + dir = 8; + chamber_id = "lavalandsyndieo2" }, -/obj/structure/cable, -/obj/machinery/portable_atmospherics/pump, -/turf/open/floor/iron, +/turf/open/floor/engine/o2, /area/ruin/syndicate_lava_base/engineering) "lS" = ( /obj/machinery/porta_turret/syndicate{ @@ -2030,54 +1551,14 @@ /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, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/bar) -"lX" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"md" = ( -/obj/machinery/sleeper/syndie{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ - dir = 8 - }, -/area/ruin/syndicate_lava_base/medbay) "mf" = ( /obj/structure/sink/directional/west, /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/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"mk" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - 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/external/directional/west, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/arrivals) "mr" = ( /turf/open/floor/plating, /area/ruin/syndicate_lava_base/arrivals) @@ -2098,38 +1579,13 @@ /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, -/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/machinery/portable_atmospherics/canister/oxygen, -/obj/machinery/duct, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/dormitories) -"my" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) "mA" = ( /obj/machinery/light/small/directional/west, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, /obj/item/reagent_containers/blood/o_minus, /obj/machinery/firealarm/directional/west, @@ -2138,6 +1594,16 @@ dir = 8 }, /area/ruin/syndicate_lava_base/medbay) +"mB" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/main) "mE" = ( /obj/structure/table/reinforced, /obj/item/scalpel, @@ -2162,6 +1628,27 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) +"mK" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/bar) +"mN" = ( +/obj/machinery/griddle, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/bar) +"mQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/closet/crate/bin, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/chemistry) "mS" = ( /obj/machinery/door/airlock/external/ruin, /obj/structure/fans/tiny, @@ -2179,34 +1666,29 @@ /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, -/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/white/side{ +"nb" = ( +/obj/effect/turf_decal/stripes/line{ dir = 8 }, -/area/ruin/syndicate_lava_base/medbay) +/obj/effect/mapping_helpers/no_lava, +/obj/effect/turf_decal/sand/plating/volcanic, +/turf/open/floor/plating/lavaland_atmos, +/area/lavaland/surface/outdoors) "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) +"nj" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor{ + id = "lavalandsyndi_cargo" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/syndicate_lava_base/cargo) "no" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -2223,15 +1705,6 @@ }, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/arrivals) -"nq" = ( -/obj/effect/turf_decal/tile/red/half/contrasted{ - 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/syndicate_lava_base/arrivals) "nr" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/red/anticorner/contrasted{ @@ -2239,6 +1712,12 @@ }, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/arrivals) +"ns" = ( +/obj/machinery/air_sensor{ + id_tag = "lavalandsyndieturbinecool" + }, +/turf/open/floor/engine/vacuum, +/area/ruin/syndicate_lava_base/engineering) "nA" = ( /obj/structure/cable, /turf/open/floor/iron/white/corner, @@ -2270,10 +1749,38 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/syndicate_lava_base/engineering) -"nF" = ( -/obj/structure/reagent_dispensers/beerkeg, -/turf/open/floor/iron/dark, +"nK" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/machinery/door/firedoor, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/turf/open/floor/iron, /area/ruin/syndicate_lava_base/bar) +"nM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/medbay) +"nN" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/air_sensor{ + chamber_id = "lavalandsyndieplasma" + }, +/turf/open/floor/engine/plasma, +/area/ruin/syndicate_lava_base/engineering) +"nR" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ + dir = 8; + chamber_id = "lavalandsyndieplasma" + }, +/turf/open/floor/engine/plasma, +/area/ruin/syndicate_lava_base/engineering) "nW" = ( /turf/open/floor/iron, /area/ruin/syndicate_lava_base/arrivals) @@ -2306,6 +1813,16 @@ dir = 6 }, /area/ruin/syndicate_lava_base/medbay) +"oi" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, +/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/ruin/syndicate_lava_base/arrivals) "ol" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -2320,22 +1837,10 @@ /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/half/contrasted, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) "oo" = ( /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/arrivals) -"op" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) "or" = ( /obj/structure/rack{ dir = 8 @@ -2347,12 +1852,6 @@ /obj/item/clothing/neck/stethoscope, /turf/open/floor/iron/white, /area/ruin/syndicate_lava_base/medbay) -"ou" = ( -/obj/structure/sign/warning/explosives/alt/directional/east, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/circuit/red, -/area/ruin/syndicate_lava_base/main) "ov" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -2362,23 +1861,6 @@ /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" - }, -/obj/structure/cable, -/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, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/dormitories) "oC" = ( /obj/machinery/door/poddoor/incinerator_syndicatelava_aux, /turf/open/floor/engine/vacuum, @@ -2396,19 +1878,6 @@ /obj/machinery/door/poddoor/incinerator_syndicatelava_main, /turf/open/floor/engine/vacuum, /area/ruin/syndicate_lava_base/engineering) -"oI" = ( -/obj/structure/sign/warning/vacuum/external/directional/west, -/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 - }, -/obj/item/bedsheet/syndie, -/obj/structure/bed, -/turf/open/floor/carpet/red, -/area/ruin/syndicate_lava_base/dormitories) "oM" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ chamber_id = "lavalandsyndien2"; @@ -2416,12 +1885,6 @@ }, /turf/open/floor/engine/n2, /area/ruin/syndicate_lava_base/engineering) -"oO" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ - 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, @@ -2430,6 +1893,26 @@ /obj/effect/mapping_helpers/no_lava, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"pe" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/red/line{ + dir = 10 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/main) +"pk" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/l3closet, +/obj/machinery/light/small/directional/west, +/obj/machinery/airalarm/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/biohazard/directional/west, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/main) "pm" = ( /obj/structure/extinguisher_cabinet/directional/south, /obj/effect/turf_decal/stripes/line, @@ -2439,16 +1922,20 @@ }, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) -"pI" = ( +"pp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/structure/cable, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/medbay) +"pu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, /turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) +/area/ruin/syndicate_lava_base/cargo) "pM" = ( /obj/structure/toilet{ pixel_y = 18 @@ -2461,13 +1948,26 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/dormitories) -"pU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, +"pR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, /turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) +/area/ruin/syndicate_lava_base/main) +"pV" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/syndicate_lava_base/bar) +"pW" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/medbay) "qa" = ( /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_syndicatelava{ dir = 8 @@ -2479,90 +1979,76 @@ /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/layer2{ - 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" = ( +"qd" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/sign/warning/fire/directional/east, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/engineering) +"qf" = ( +/obj/structure/closet/emcloset/anchored, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/brown/half/contrasted{ +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 1 }, -/obj/machinery/duct, /turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"qq" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor{ - id = "lavalandsyndi_cargo" +/area/ruin/syndicate_lava_base/arrivals) +"qt" = ( +/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/side{ + dir = 1 + }, +/area/ruin/syndicate_lava_base/medbay) +"qv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, /obj/structure/cable, -/turf/open/floor/plating, +/turf/open/floor/mineral/plastitanium, /area/ruin/syndicate_lava_base/cargo) -"qw" = ( -/obj/machinery/door/airlock{ - name = "Cabin 2" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet/red, -/area/ruin/syndicate_lava_base/dormitories) -"qy" = ( -/obj/effect/decal/cleanable/dirt, +"qA" = ( +/obj/structure/reagent_dispensers/beerkeg, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/bar) +"qN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, /obj/machinery/duct, -/obj/machinery/button/door/directional/north{ - id = "syndicate_lavaland_warehouse"; - req_access = list("syndicate"); - name = "Warehouse Shutters" - }, +/obj/structure/cable, /turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"qI" = ( -/obj/machinery/door/airlock{ - name = "Cabin 3" +/area/ruin/syndicate_lava_base/medbay) +"qO" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet/red, -/area/ruin/syndicate_lava_base/dormitories) -"qU" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/brown{ +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/arrivals) +"qP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ dir = 4 }, /turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"qW" = ( +/area/ruin/syndicate_lava_base/engineering) +"rb" = ( +/obj/machinery/door/poddoor/incinerator_syndicatelava_main{ + id = "syndicatelava_mainvent_outer" + }, +/turf/open/floor/engine/vacuum, +/area/ruin/syndicate_lava_base/engineering) +"rf" = ( /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/side, -/area/ruin/syndicate_lava_base/main) -"rg" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/air_sensor{ - chamber_id = "lavalandsyndien2" - }, -/turf/open/floor/engine/n2, +/turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) "rn" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber{ @@ -2584,52 +2070,55 @@ /obj/structure/disposalpipe/trunk, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/ruin/syndicate_lava_base/virology) -"rv" = ( -/obj/machinery/airalarm/directional/west, -/obj/structure/chair/stool/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/mapping_helpers/airalarm/syndicate_access, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"ry" = ( -/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 = 8 +"rC" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining/glass{ + name = "Warehouse" }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/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/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 = list("syndicate") - }, -/obj/machinery/chem_mass_spec, -/turf/open/floor/iron/white/side{ - dir = 1 - }, -/area/ruin/syndicate_lava_base/chemistry) +/area/ruin/syndicate_lava_base/cargo) +"rI" = ( +/obj/machinery/firealarm/directional/west, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/engineering) "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" = ( -/obj/machinery/atmospherics/miner/oxygen, -/turf/open/floor/engine/o2, +"rP" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/turf_decal/sand/plating/volcanic, +/turf/open/floor/plating/lavaland_atmos, +/area/lavaland/surface/outdoors) +"rU" = ( +/obj/structure/closet/radiation, +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) -"sd" = ( -/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/white/corner{ +"rV" = ( +/obj/machinery/plumbing/synthesizer{ + reagent_id = /datum/reagent/water; dir = 1 }, -/area/ruin/syndicate_lava_base/virology) +/turf/open/floor/plating, +/area/ruin/syndicate_lava_base/dormitories) +"sf" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/atmospherics/miner/carbon_dioxide, +/turf/open/floor/engine/co2, +/area/ruin/syndicate_lava_base/engineering) "si" = ( /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) @@ -2637,245 +2126,343 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) -"sw" = ( -/obj/effect/spawner/random/vending/snackvend{ - hacked = 1 +"sn" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/virology{ + frequency = 1449; + id_tag = "lavaland_syndie_virology_exterior"; + name = "Virology Lab Exterior Airlock" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 1 +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/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 = list("syndicate") }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"sT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) -"te" = ( +"sq" = ( +/obj/machinery/door/airlock{ + name = "Cabin 1" + }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/medbay) -"tf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet/red, +/area/ruin/syndicate_lava_base/dormitories) +"sr" = ( /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/white/side{ - dir = 4 +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 }, -/area/ruin/syndicate_lava_base/virology) -"tp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/red/line{ - dir = 10 +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/arrivals) +"sw" = ( +/obj/effect/spawner/random/vending/snackvend{ + hacked = 1 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/mapping_helpers/airalarm/syndicate_access, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/main) -"tu" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Janitorial Closet" +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, -/turf/open/floor/plating, +/turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) -"tT" = ( +"sx" = ( +/obj/structure/rack, +/obj/item/storage/belt/utility, /obj/effect/decal/cleanable/dirt, -/obj/structure/chair/stool/bar/directional/east, +/obj/item/storage/part_replacer/bluespace/tier4, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/box/white/corners, +/obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"um" = ( +/area/ruin/syndicate_lava_base/cargo) +"sH" = ( +/obj/machinery/door/airlock/virology/glass{ + name = "Monkey Pen" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/bar) -"ur" = ( -/obj/machinery/duct, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"va" = ( +/turf/open/floor/iron/white, +/area/ruin/syndicate_lava_base/virology) +"ta" = ( +/obj/machinery/light/small/directional/east, /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/obj/item/turbine_parts/rotor{ - current_tier = 3 - }, -/obj/item/turbine_parts/stator{ - current_tier = 2 - }, -/obj/item/turbine_parts/compressor{ - current_tier = 3 - }, -/obj/item/pipe_dispenser, -/obj/structure/closet/crate/engineering, -/obj/item/stack/sheet/mineral/plastitanium{ - amount = 30 - }, -/obj/item/stack/sheet/plastitaniumglass{ - amount = 15 - }, +/obj/machinery/space_heater, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) -"vg" = ( +"td" = ( /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 = 1 - }, +/obj/structure/cable, /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/layer4, +"tg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, /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/layer2, +/area/ruin/syndicate_lava_base/arrivals) +"to" = ( /obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/turf/open/floor/iron, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/bar) +"ty" = ( +/obj/structure/sign/warning/vacuum/external/directional/west, +/turf/open/floor/plating, /area/ruin/syndicate_lava_base/main) -"vB" = ( -/obj/machinery/atmospherics/components/binary/pump/on/cyan/visible/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/components/binary/pump/on/orange/visible/layer4{ +"tA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, -/obj/machinery/atmospherics/components/binary/pump/off/general/visible{ +/obj/machinery/duct, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/bar) +"tB" = ( +/obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/engineering) +"tC" = ( +/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 = list("syndicate"); + specialfunctions = 4 + }, +/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/ruin/syndicate_lava_base/engineering) -"vI" = ( +/area/ruin/syndicate_lava_base/main) +"tN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white/side{ - dir = 10 + dir = 6 }, -/area/ruin/syndicate_lava_base/chemistry) -"vK" = ( -/obj/effect/decal/cleanable/dirt, +/area/ruin/syndicate_lava_base/virology) +"tP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white/side{ - dir = 1 - }, -/area/ruin/syndicate_lava_base/main) -"vM" = ( +/obj/machinery/duct, +/turf/open/floor/wood, +/area/ruin/syndicate_lava_base/dormitories) +"tT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/stool/bar/directional/east, /obj/effect/turf_decal/tile/neutral/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/dark, /area/ruin/syndicate_lava_base/bar) -"vN" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/sign/warning/fire/directional/east, +"tZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/duct, /turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"vU" = ( +/area/ruin/syndicate_lava_base/cargo) +"ue" = ( +/obj/machinery/airalarm/directional/east, +/obj/machinery/vending/coffee{ + extended_inventory = 1 + }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/reagent_dispensers/fueltank, +/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) -"wi" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer2{ - dir = 8 - }, -/obj/effect/turf_decal/sand/plating/volcanic, -/turf/open/floor/plating/lavaland_atmos, -/area/ruin/syndicate_lava_base/main) -"wp" = ( +/area/ruin/syndicate_lava_base/bar) +"uh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/chemistry) +"uj" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/turf/open/floor/wood, +/area/ruin/syndicate_lava_base/dormitories) +"uk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/bar) +"uo" = ( +/obj/effect/turf_decal/stripes/red/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 4 - }, /obj/machinery/duct, -/obj/machinery/light/small/directional/north, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) -"wv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"uv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, +/turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/syndicate_lava_base/engineering) -"wA" = ( +"uH" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor{ + id = "lavalandsyndi_arrivals" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/syndicate_lava_base/arrivals) +"uN" = ( /obj/effect/turf_decal/tile/neutral/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/dark, +/area/ruin/syndicate_lava_base/bar) +"vo" = ( +/obj/machinery/light/small/directional/east, /obj/machinery/duct, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) -"wE" = ( +"vy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/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/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"xf" = ( -/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate{ - dir = 4 +/area/ruin/syndicate_lava_base/main) +"vB" = ( +/obj/machinery/atmospherics/components/binary/pump/on/cyan/visible/layer2{ + dir = 8 }, -/obj/item/bedsheet/syndie{ - dir = 4 +/obj/machinery/atmospherics/components/binary/pump/on/orange/visible/layer4{ + dir = 8 }, -/obj/structure/bed{ +/obj/machinery/atmospherics/components/binary/pump/off/general/visible{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 4 }, -/turf/open/floor/carpet/red, -/area/ruin/syndicate_lava_base/dormitories) -"xn" = ( -/obj/machinery/atmospherics/miner/nitrogen, -/turf/open/floor/engine/n2, +/turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) -"xr" = ( -/obj/machinery/light/small/directional/east, +"vR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/turf_decal/sand/plating/volcanic, +/turf/open/floor/plating/lavaland_atmos, +/area/lavaland/surface/outdoors) +"vT" = ( +/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, +/obj/machinery/button/door/directional/south{ + req_access = list("syndicate"); + id = "syndicate_lavaland_warehouse"; + name = "Warehouse Shutters" + }, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/cargo) +"vV" = ( +/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 = list("syndicate") + }, +/turf/open/floor/circuit/red, +/area/ruin/syndicate_lava_base/main) +"wc" = ( +/obj/structure/chair/stool/bar/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/bar) +"wg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, /obj/machinery/duct, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) +"ww" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/portable_atmospherics/pump, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/engineering) +"wx" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Janitorial Closet" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/plating, +/area/ruin/syndicate_lava_base/main) +"wV" = ( +/obj/structure/noticeboard/directional/north, +/obj/item/paper{ + default_raw_text = "The next person who steals my ammunition I will shoot myself." + }, +/turf/open/floor/wood, +/area/ruin/syndicate_lava_base/dormitories) +"xk" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/turf_decal/sand/plating/volcanic, +/turf/open/floor/plating/lavaland_atmos, +/area/lavaland/surface/outdoors) "xt" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -2886,51 +2473,23 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/arrivals) -"xD" = ( +"xQ" = ( +/obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"xF" = ( -/obj/structure/sink/kitchen/directional/west, -/obj/structure/closet/secure_closet/freezer/kitchen/maintenance{ - req_access = null - }, -/obj/item/storage/box/donkpockets{ - pixel_x = 2 - }, -/obj/item/storage/box/donkpockets{ - pixel_y = 3 - }, -/obj/item/storage/box/donkpockets{ - pixel_x = -2; - pixel_y = 6 - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"xM" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/caution/stand_clear{ - dir = 1 +/obj/machinery/duct, +/obj/effect/turf_decal/tile/brown{ + dir = 4 }, -/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/ruin/syndicate_lava_base/arrivals) -"ya" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" - }, +/area/ruin/syndicate_lava_base/main) +"xX" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/duct, +/obj/structure/table/reinforced, /turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/dormitories) +/area/ruin/syndicate_lava_base/bar) "ye" = ( /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, /obj/machinery/atmospherics/pipe/layer_manifold{ @@ -2962,131 +2521,187 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) -"yk" = ( +"yq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/medbay) -"yl" = ( -/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, -/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/layer4{ +/obj/effect/turf_decal/stripes{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/ruin/syndicate_lava_base/virology) -"ys" = ( -/obj/machinery/door/poddoor/incinerator_syndicatelava_main{ - id = "syndicatelava_mainvent_outer" - }, -/turf/open/floor/engine/vacuum, /area/ruin/syndicate_lava_base/engineering) -"yy" = ( -/obj/structure/closet/crate/freezer, -/obj/item/food/rationpack, -/obj/item/food/rationpack, -/obj/item/food/rationpack, -/obj/item/food/rationpack, -/obj/item/food/rationpack, -/obj/item/food/rationpack, -/obj/item/food/rationpack, -/obj/item/food/rationpack, -/obj/item/food/rationpack, -/obj/item/food/rationpack, -/obj/item/food/rationpack, -/obj/item/food/rationpack, -/obj/item/food/canned/beans, -/obj/item/food/canned/beans, -/obj/item/food/canned/beans, -/obj/item/food/canned/beans, -/obj/item/food/canned/beans, -/obj/item/food/canned/beans, -/obj/item/food/canned/beans, -/obj/item/food/canned/beans, -/obj/item/food/canned/beans, -/obj/item/food/canned/beans, -/obj/item/food/canned/beans, -/obj/item/reagent_containers/cup/glass/waterbottle/large, -/obj/item/reagent_containers/cup/glass/waterbottle/large, -/obj/item/reagent_containers/cup/glass/waterbottle/large, -/obj/item/reagent_containers/cup/glass/waterbottle/large, -/obj/item/reagent_containers/cup/glass/waterbottle/large, -/obj/item/reagent_containers/cup/glass/waterbottle/large, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"yO" = ( +"yv" = ( +/turf/open/floor/circuit/red, +/area/ruin/syndicate_lava_base/main) +"yA" = ( +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/main) +"yE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/engineering) +"yG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/machinery/door/airlock/engineering{ + name = "Engineering" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/red{ - dir = 8 +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 }, /obj/machinery/duct, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) -"yS" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 +"yL" = ( +/obj/structure/table/optable, +/obj/item/surgical_drapes, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/side{ + dir = 4 }, +/area/ruin/syndicate_lava_base/medbay) +"za" = ( +/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/ruin/syndicate_lava_base/chemistry) -"zK" = ( +/area/ruin/syndicate_lava_base/engineering) +"ze" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/north, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/red/half/contrasted{ +/obj/machinery/duct, +/obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 1 }, /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, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/dormitories) -"Ag" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical{ - name = "Chemistry Lab" - }, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/area/ruin/syndicate_lava_base/main) +"zk" = ( /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/white, -/area/ruin/syndicate_lava_base/chemistry) -"Ao" = ( -/obj/machinery/atmospherics/components/trinary/mixer/layer2{ +/obj/machinery/duct, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/bar) +"zm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/l3closet/janitor, +/obj/item/reagent_containers/spray/cleaner, +/turf/open/floor/plating, +/area/ruin/syndicate_lava_base/main) +"zq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/medbay) +"zt" = ( +/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 = list("syndicate"); + shuttleId = "syndie_cargo" + }, +/obj/structure/cable, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndicate_lava_base/cargo) +"zw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/machinery/autolathe/hacked, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/cargo) +"zy" = ( +/obj/machinery/duct, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/bar) +"zC" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/end, +/obj/machinery/door/window/brigdoor{ + name = "Turbine Access" + }, +/obj/machinery/light/small/directional/west, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) -"AB" = ( -/obj/machinery/power/turbine/inlet_compressor{ - dir = 4 +"zD" = ( +/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/ruin/syndicate_lava_base/bar) +"zH" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/wood, +/area/ruin/syndicate_lava_base/dormitories) +"zI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/arrivals) +"zK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white/side{ + dir = 6 }, -/turf/open/floor/engine, +/area/ruin/syndicate_lava_base/chemistry) +"zT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/engineering) +"zU" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ + dir = 8; + chamber_id = "lavalandsyndien2" + }, +/turf/open/floor/engine/n2, +/area/ruin/syndicate_lava_base/engineering) +"zZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/mapping_helpers/apc/syndicate_access, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/bar) +"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) -"AD" = ( +"Ac" = ( /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/machinery/door/poddoor/shutters{ id = "syndicate_lavaland_warehouse" }, @@ -3096,40 +2711,94 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/ruin/syndicate_lava_base/cargo) -"AQ" = ( +"Aj" = ( +/obj/effect/turf_decal/box/white/corners{ + dir = 8 + }, +/obj/structure/closet/crate/secure/weapon{ + req_access = list("syndicate") + }, +/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/layer4, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/cargo) +"Ao" = ( +/obj/machinery/atmospherics/components/trinary/mixer/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/engineering) +"Ap" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, /obj/machinery/duct, /turf/open/floor/iron, -/area/ruin/syndicate_lava_base/medbay) -"AX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/reagent_dispensers/water_cooler, -/turf/open/floor/iron/white/side{ +/area/ruin/syndicate_lava_base/main) +"AB" = ( +/obj/machinery/power/turbine/inlet_compressor{ dir = 4 }, -/area/ruin/syndicate_lava_base/arrivals) -"Bb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/obj/effect/turf_decal/tile/brown/half/contrasted{ +/turf/open/floor/engine, +/area/ruin/syndicate_lava_base/engineering) +"AJ" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/beer/fullupgrade{ dir = 1 }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"Bj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/barsign/all_access/directional/south{ + chosen_sign = "/datum/barsign/hiddensigns/syndibarsign" + }, +/turf/open/floor/wood, +/area/ruin/syndicate_lava_base/bar) +"AO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/obj/effect/turf_decal/stripes{ +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) +"Bi" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/structure/cable, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/arrivals) +"Bm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white/side{ + dir = 1 + }, +/area/ruin/syndicate_lava_base/virology) "Bu" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -3141,26 +2810,6 @@ }, /turf/open/floor/plating, /area/ruin/syndicate_lava_base/engineering) -"BD" = ( -/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/duct, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) "BG" = ( /obj/structure/bookcase/random, /obj/effect/decal/cleanable/dirt, @@ -3169,12 +2818,56 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) -"Cc" = ( +"BH" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/machinery/duct, +/turf/open/floor/plating, +/area/ruin/syndicate_lava_base/dormitories) +"BV" = ( +/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, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, /obj/machinery/duct, +/obj/machinery/button/door/directional/north{ + id = "syndicate_lavaland_warehouse"; + req_access = list("syndicate"); + name = "Warehouse Shutters" + }, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/main) +"BX" = ( +/obj/machinery/door/airlock{ + name = "Cabin 4" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet/red, +/area/ruin/syndicate_lava_base/dormitories) +"Cc" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) +"Ce" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/main) +"Cf" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/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/white/side{ + dir = 8 + }, +/area/ruin/syndicate_lava_base/chemistry) "Ci" = ( /obj/effect/turf_decal/box/white/corners{ dir = 1 @@ -3197,107 +2890,133 @@ /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/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"Cl" = ( /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/layer2, -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/ruin/syndicate_lava_base/virology) -"Cu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white/side{ - dir = 9 +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/main) +"Cy" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/turf/open/floor/wood, +/area/ruin/syndicate_lava_base/dormitories) +"CC" = ( +/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/comms{ + dir = 8 + }, +/obj/item/bedsheet/syndie, +/obj/structure/bed, +/turf/open/floor/carpet/red, +/area/ruin/syndicate_lava_base/dormitories) +"CE" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay" }, -/area/ruin/syndicate_lava_base/virology) -"Cz" = ( /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/side{ - dir = 1 - }, +/turf/open/floor/iron/white, /area/ruin/syndicate_lava_base/medbay) -"CA" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ - dir = 8; - chamber_id = "lavalandsyndieplasma" +"CJ" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 }, -/turf/open/floor/engine/plasma, -/area/ruin/syndicate_lava_base/engineering) -"CI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white/side, +/area/ruin/syndicate_lava_base/virology) +"CV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/radiation/rad_area/directional/south, +/obj/effect/turf_decal/stripes, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 }, -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) -"CR" = ( -/obj/effect/turf_decal/box/white/corners{ - dir = 8 +"CZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 }, -/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, -/obj/machinery/button/door/directional/south{ - req_access = list("syndicate"); - id = "syndicate_lavaland_warehouse"; - name = "Warehouse Shutters" +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) -"CY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/engineering) -"Dj" = ( +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/virology) +"Di" = ( +/obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay" + }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/duct, -/turf/open/floor/iron, +/turf/open/floor/iron/white, /area/ruin/syndicate_lava_base/medbay) -"Dp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"Dt" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 +"Dr" = ( +/obj/machinery/airalarm/directional/west, +/obj/machinery/light/small/directional/west, +/obj/structure/table, +/obj/item/stack/sheet/iron/fifty{ + pixel_x = -1; + pixel_y = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/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/utility/welding, +/obj/item/weldingtool/largetank, +/obj/item/analyzer, +/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) -"Dx" = ( +"DG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/closed/wall/mineral/plastitanium/nodiagonal, +/obj/machinery/duct, +/turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) -"DL" = ( -/obj/machinery/door/airlock/virology/glass{ - name = "Monkey Pen" +"DI" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Bar" }, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/red/half/contrasted, +/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/side{ + dir = 1 + }, +/area/ruin/syndicate_lava_base/bar) +"DN" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/item/bedsheet, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white/side{ + dir = 5 + }, +/area/ruin/syndicate_lava_base/virology) +"DO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/directional/south, +/obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/ruin/syndicate_lava_base/virology) @@ -3314,34 +3033,13 @@ }, /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, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/main) -"Eg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"Eo" = ( +"Ee" = ( +/obj/machinery/light/small/directional/west, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) +/turf/open/floor/carpet/red, +/area/ruin/syndicate_lava_base/dormitories) "Ev" = ( /obj/structure/table/wood, /obj/item/reagent_containers/cup/rag{ @@ -3355,6 +3053,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/ruin/syndicate_lava_base/bar) +"EC" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Chemistry Lab" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/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/white, +/area/ruin/syndicate_lava_base/chemistry) "ET" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/layer_manifold/orange/visible{ @@ -3362,13 +3071,16 @@ }, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) -"EV" = ( -/obj/structure/closet/emcloset/anchored, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"EU" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/cargo) +"EX" = ( +/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/anticorner/contrasted{ +/obj/effect/turf_decal/tile/red{ dir = 1 }, /turf/open/floor/iron, @@ -3380,193 +3092,226 @@ /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/layer4{ - dir = 1 +"Ft" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/engineering{ + name = "Engineering" }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"Fs" = ( -/obj/machinery/door/airlock/virology/glass{ - name = "Isolation B" +/area/ruin/syndicate_lava_base/engineering) +"Fz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 }, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/ruin/syndicate_lava_base/virology) -"FC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/engineering) +"FD" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/carpet/red, /area/ruin/syndicate_lava_base/dormitories) -"FI" = ( +"FO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/carpet/red, -/area/ruin/syndicate_lava_base/dormitories) -"FP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/main) -"FW" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /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 = list("syndicate"); - specialfunctions = 4 +/area/ruin/syndicate_lava_base/arrivals) +"FX" = ( +/obj/machinery/door/window/left/directional/south{ + base_state = "right"; + dir = 1; + icon_state = "right"; + name = "Bar" }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /obj/machinery/duct, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"Gx" = ( +/turf/open/floor/wood, +/area/ruin/syndicate_lava_base/bar) +"Gd" = ( +/obj/machinery/light/small/directional/east, +/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/duct, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) -"GQ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 +"Gm" = ( +/obj/machinery/syndicatebomb/self_destruct{ + anchored = 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, +/turf/open/floor/circuit/red, /area/ruin/syndicate_lava_base/main) -"Hm" = ( -/obj/machinery/duct, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/dormitories) -"HP" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Water Supply" - }, +"Gq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /obj/machinery/duct, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/dormitories) -"HQ" = ( -/obj/effect/turf_decal/stripes/corner{ +/turf/open/floor/wood, +/area/ruin/syndicate_lava_base/bar) +"Gu" = ( +/obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, +/obj/effect/turf_decal/stripes/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /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/layer2, +/area/ruin/syndicate_lava_base/engineering) +"Gw" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/sand/plating/volcanic, +/turf/open/floor/plating/lavaland_atmos, +/area/ruin/syndicate_lava_base/main) +"GG" = ( +/obj/machinery/microwave, +/obj/structure/table/reinforced, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/bar) +"GV" = ( /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/ruin/syndicate_lava_base/arrivals) -"HX" = ( -/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate{ - dir = 4 +/area/ruin/syndicate_lava_base/engineering) +"Hi" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 }, -/obj/machinery/airalarm/directional/north, -/obj/item/bedsheet/syndie{ - dir = 4 +/obj/effect/turf_decal/tile/red{ + dir = 8 }, -/obj/structure/bed{ +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/main) +"Hk" = ( +/obj/effect/turf_decal/box/white/corners{ dir = 4 }, -/obj/effect/mapping_helpers/airalarm/syndicate_access, +/obj/structure/closet/crate/radiation, +/obj/item/clothing/suit/utility/radiation, +/obj/item/clothing/suit/utility/radiation, +/obj/item/clothing/suit/utility/radiation, +/obj/item/clothing/head/utility/radiation, +/obj/item/clothing/head/utility/radiation, +/obj/item/clothing/head/utility/radiation, +/obj/item/geiger_counter, +/obj/item/geiger_counter, +/obj/item/geiger_counter, +/obj/item/reagent_containers/cup/glass/bottle/vodka, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/cargo) +"Hn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/turf_decal/sand/plating/volcanic, +/turf/open/floor/plating/lavaland_atmos, +/area/lavaland/surface/outdoors) +"Hq" = ( +/obj/machinery/door/airlock{ + name = "Cabin 3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/red, /area/ruin/syndicate_lava_base/dormitories) -"Ir" = ( -/obj/machinery/washing_machine, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/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" +"HG" = ( +/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/brown/half/contrasted{ + dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, -/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 = list("syndicate") +/obj/machinery/duct, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/main) +"HJ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 }, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/arrivals) +"HT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/turf/open/floor/iron/white/side{ dir = 8 }, +/area/ruin/syndicate_lava_base/medbay) +"Ic" = ( +/obj/machinery/portable_atmospherics/scrubber, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"IC" = ( +/area/ruin/syndicate_lava_base/engineering) +"Ih" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters{ + id = "syndicate_lavaland_warehouse" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/ruin/syndicate_lava_base/cargo) +"In" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/medbay) +"Is" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown{ +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 4 }, /obj/machinery/duct, +/obj/machinery/light/small/directional/north, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) -"IF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/chemistry) -"IH" = ( -/obj/machinery/air_sensor{ - id_tag = "lavalandsyndieturbinecool" - }, -/turf/open/floor/engine/vacuum, -/area/ruin/syndicate_lava_base/engineering) -"IJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/rack{ - dir = 8 +"Iv" = ( +/obj/structure/chair{ + dir = 4 }, -/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, -/obj/machinery/light/small/directional/south, -/turf/open/floor/mineral/plastitanium, -/area/ruin/syndicate_lava_base/arrivals) -"IP" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, -/obj/machinery/space_heater, +/obj/structure/cable, /turf/open/floor/iron, +/area/ruin/syndicate_lava_base/cargo) +"Iw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/cargo) +"IA" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/air_sensor{ + chamber_id = "lavalandsyndien2" + }, +/turf/open/floor/engine/n2, /area/ruin/syndicate_lava_base/engineering) "IQ" = ( /obj/structure/table, @@ -3579,27 +3324,46 @@ /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/effect/turf_decal/tile/red, -/obj/structure/cable, +"IX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/duct, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) -"Jq" = ( -/obj/effect/turf_decal/stripes/red/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"Jj" = ( +/obj/structure/table/wood, +/obj/item/ammo_box/magazine/m9mm, +/obj/machinery/airalarm/directional/north, +/obj/item/crowbar/red, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/turf/open/floor/carpet/red, +/area/ruin/syndicate_lava_base/dormitories) +"Jr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/ruin/syndicate_lava_base/dormitories) +"JB" = ( +/obj/machinery/button/door{ + id = "lavalandsyndi_chemistry"; + name = "Chemistry Blast Door Control"; + pixel_y = 26; + req_access = list("syndicate") + }, +/obj/machinery/chem_mass_spec, +/turf/open/floor/iron/white/side{ + dir = 1 + }, +/area/ruin/syndicate_lava_base/chemistry) +"JD" = ( +/obj/machinery/airalarm/directional/west, +/obj/structure/chair/stool/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/bar) "JE" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/binary/pump/on/cyan/visible/layer2{ @@ -3613,66 +3377,38 @@ }, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) -"JM" = ( +"JF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/dormitories) -"JQ" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/syndicate_access, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/thermomachine/freezer, /turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) +/area/ruin/syndicate_lava_base/arrivals) +"JR" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/carpet/red, +/area/ruin/syndicate_lava_base/dormitories) "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/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +"Ks" = ( +/obj/structure/sign/warning/vacuum/external/directional/west, +/turf/open/floor/plating, +/area/ruin/syndicate_lava_base/arrivals) +"Ku" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"Kg" = ( /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/brown/half/contrasted{ + dir = 4 + }, +/obj/machinery/duct, /turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"Kj" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/medical/glass{ - name = "Medbay" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/turf/open/floor/iron/white, -/area/ruin/syndicate_lava_base/medbay) -"Kp" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, /area/ruin/syndicate_lava_base/main) -"Kz" = ( -/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/ruin/syndicate_lava_base/arrivals) "KC" = ( /obj/effect/mapping_helpers/airlock/locked, /obj/machinery/door/airlock/glass/incinerator/syndicatelava_exterior, @@ -3683,23 +3419,35 @@ /obj/structure/cable, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/engineering) -"KI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, +"KM" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/virology) -"KR" = ( /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{ +/turf/open/floor/circuit/red, +/area/ruin/syndicate_lava_base/main) +"KN" = ( +/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/layer2{ dir = 1 }, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/cargo) "KS" = ( /obj/structure/table, /obj/item/storage/medkit/regular, @@ -3708,38 +3456,71 @@ dir = 4 }, /area/ruin/syndicate_lava_base/medbay) +"KT" = ( +/obj/machinery/washing_machine, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/syndicate_lava_base/dormitories) "KU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible/layer2, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) -"Ln" = ( +"KV" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /obj/machinery/duct, -/turf/open/floor/iron, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/bar) +"KX" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/white/side{ + dir = 10 + }, +/area/ruin/syndicate_lava_base/virology) +"Le" = ( +/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) +"Ll" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/syndicate_lava_base/main) "Lp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow, /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/syndicate_lava_base/engineering) -"Ly" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"Ls" = ( +/obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"LG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/light/small/directional/east, -/obj/machinery/airalarm/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/engineering) +"LK" = ( +/obj/effect/turf_decal/tile/red, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airalarm/syndicate_access, +/obj/machinery/duct, /turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) +/area/ruin/syndicate_lava_base/main) "LS" = ( /turf/closed/wall/mineral/plastitanium/explosive, /area/ruin/syndicate_lava_base/engineering) @@ -3749,29 +3530,7 @@ }, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/engineering) -"Mr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/duct, -/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/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"Mt" = ( -/obj/machinery/plumbing/synthesizer{ - reagent_id = /datum/reagent/water; - dir = 1 - }, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/dormitories) -"Nh" = ( +"LW" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 4 @@ -3779,64 +3538,135 @@ /obj/machinery/atmospherics/components/unary/portables_connector/visible, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) -"Nk" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/medbay) -"No" = ( +"LX" = ( /obj/machinery/light/small/directional/east, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/engineering) +"Mg" = ( +/obj/machinery/door/airlock/virology/glass{ + name = "Isolation A" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/ruin/syndicate_lava_base/virology) +"Mj" = ( +/obj/machinery/atmospherics/miner/nitrogen, +/turf/open/floor/engine/n2, +/area/ruin/syndicate_lava_base/engineering) +"Mr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"Ny" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white/side{ + dir = 10 }, +/area/ruin/syndicate_lava_base/chemistry) +"MM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/ruin/syndicate_lava_base/virology) +"MZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) -"NQ" = ( -/obj/structure/chair/stool/bar/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"NR" = ( -/obj/structure/table/optable, -/obj/item/surgical_drapes, +"Nh" = ( +/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/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/arrivals) +"Np" = ( +/obj/structure/closet/l3closet, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/mapping_helpers/apc/syndicate_access, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, /turf/open/floor/iron/white/side{ - dir = 4 + dir = 8 }, -/area/ruin/syndicate_lava_base/medbay) -"NU" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ - dir = 8; - chamber_id = "lavalandsyndieo2" +/area/ruin/syndicate_lava_base/chemistry) +"ND" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external/ruin{ + name = "Turbine Exhaust Chamber Access" }, -/turf/open/floor/engine/o2, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/effect/mapping_helpers/airlock_note_placer{ + note_info = "You are expected to build the cooling system for the exhaust yourself." + }, +/turf/open/floor/plating, /area/ruin/syndicate_lava_base/engineering) -"Ob" = ( -/obj/machinery/airalarm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"NE" = ( +/obj/structure/table/glass, +/obj/item/folder/white, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_x = -3 + }, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_x = -3 + }, +/obj/item/reagent_containers/dropper, +/obj/machinery/airalarm/directional/east, /obj/effect/decal/cleanable/dirt, +/obj/item/screwdriver/nuke{ + pixel_y = 18 + }, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/ruin/syndicate_lava_base/chemistry) +"NO" = ( +/obj/effect/decal/cleanable/dirt, +/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 = 8 +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/cargo) +"NQ" = ( +/obj/structure/chair/stool/bar/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/bar) +"Oa" = ( +/obj/machinery/computer/turbine_computer{ + dir = 1; + mapping_id = "syndie_lavaland_incineratorturbine" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/button/door/incinerator_vent_syndicatelava_main{ + pixel_y = -23; + id = "syndicatelava_mainvent_outer"; + name = "turbine exhaust chamber vent control" }, -/obj/machinery/duct, -/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) +/area/ruin/syndicate_lava_base/engineering) "Oq" = ( /obj/effect/spawner/random/vending/colavend{ hacked = 1 @@ -3847,69 +3677,86 @@ }, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) -"OG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"OI" = ( -/obj/machinery/power/turbine/turbine_outlet{ - dir = 4 - }, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/engineering) -"OQ" = ( -/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/white, -/area/ruin/syndicate_lava_base/virology) -"OW" = ( +"Or" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, /obj/structure/cable, -/obj/machinery/door/airlock/engineering{ - name = "Engineering" - }, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/obj/machinery/duct, /turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"OX" = ( -/obj/effect/decal/cleanable/dirt, +/area/ruin/syndicate_lava_base/virology) +"Ot" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/cargo) -"Pb" = ( +"OF" = ( /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/dark, -/area/ruin/syndicate_lava_base/cargo) -"Pl" = ( +/turf/open/floor/wood, +/area/ruin/syndicate_lava_base/dormitories) +"OI" = ( +/obj/machinery/power/turbine/turbine_outlet{ + dir = 4 + }, +/turf/open/floor/engine, +/area/ruin/syndicate_lava_base/engineering) +"OL" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/effect/turf_decal/sand/plating/volcanic, +/turf/open/floor/plating/lavaland_atmos, +/area/lavaland/surface/outdoors) +"OO" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, /obj/structure/tank_dispenser/oxygen, /turf/open/floor/mineral/plastitanium, /area/ruin/syndicate_lava_base/arrivals) -"Pw" = ( -/obj/machinery/airalarm/directional/east, -/obj/machinery/vending/coffee{ - extended_inventory = 1 - }, +"OZ" = ( +/obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/mapping_helpers/airalarm/syndicate_access, +/obj/machinery/suit_storage_unit/syndicate/lavaland, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/engineering) +"Pn" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) +"PA" = ( +/turf/open/floor/engine/vacuum, +/area/ruin/syndicate_lava_base/engineering) +"PB" = ( +/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 = 8 + }, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/main) +"PD" = ( +/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" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/ruin/syndicate_lava_base/virology) "PE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible/layer2, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -3917,22 +3764,29 @@ }, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) -"PR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"PG" = ( +/obj/machinery/atmospherics/miner/oxygen, +/turf/open/floor/engine/o2, +/area/ruin/syndicate_lava_base/engineering) +"PM" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/ruin/syndicate_lava_base/virology) -"PT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock{ - name = "Bar Storage" +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/engineering) +"PO" = ( +/obj/structure/chair{ + dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) +"PW" = ( +/turf/closed/wall/mineral/plastitanium/explosive, +/area/ruin/syndicate_lava_base/chemistry) "PZ" = ( /obj/machinery/atmospherics/components/binary/pump/on{ target_pressure = 4500 @@ -3942,95 +3796,71 @@ }, /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/syndicate_lava_base/engineering) -"Qa" = ( -/obj/structure/rack, -/obj/item/storage/belt/utility, -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/part_replacer/bluespace/tier4, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/box/white/corners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) -"Qb" = ( -/obj/machinery/portable_atmospherics/scrubber, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 +"Qj" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/sand/plating/volcanic, +/turf/open/floor/plating/lavaland_atmos, +/area/ruin/syndicate_lava_base/arrivals) +"Qu" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/structure/chair{ + dir = 8 }, /turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) +/area/ruin/syndicate_lava_base/main) "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" - }, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +"QA" = ( /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/ruin/syndicate_lava_base/cargo) -"QS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 +"QF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/north, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 }, -/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 = list("syndicate") +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/arrivals) +"QN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/arrivals) +"QQ" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 }, +/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) -"QV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/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" = ( +"Rf" = ( +/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/ruin/syndicate_lava_base/engineering) -"Rj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/duct, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"Rl" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/air_sensor{ - chamber_id = "lavalandsyndieo2" +/obj/effect/turf_decal/tile/brown{ + dir = 4 }, -/turf/open/floor/engine/o2, -/area/ruin/syndicate_lava_base/engineering) -"Rn" = ( -/obj/structure/closet/secure_closet/freezer/fridge/open, -/obj/item/reagent_containers/condiment/enzyme, -/obj/item/food/chocolatebar, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) +/obj/machinery/duct, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/main) "Ry" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ chamber_id = "lavalandsyndieplasma"; @@ -4038,64 +3868,25 @@ }, /turf/open/floor/engine/plasma, /area/ruin/syndicate_lava_base/engineering) -"RH" = ( -/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/wood, -/area/ruin/syndicate_lava_base/dormitories) -"RK" = ( -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"RO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/mapping_helpers/apc/syndicate_access, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"RP" = ( -/obj/structure/closet/crate/secure/gear{ - req_access = list("syndicate") +"RG" = ( +/obj/structure/sink/kitchen/directional/west, +/obj/structure/closet/secure_closet/freezer/kitchen/maintenance{ + req_access = null }, -/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, -/obj/effect/turf_decal/box/white/corners{ - dir = 1 +/obj/item/storage/box/donkpockets{ + pixel_x = 2 }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) -"Se" = ( -/obj/machinery/door/airlock{ - name = "Cabin 4" +/obj/item/storage/box/donkpockets{ + pixel_y = 3 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet/red, -/area/ruin/syndicate_lava_base/dormitories) -"Sk" = ( -/turf/open/floor/engine/vacuum, -/area/ruin/syndicate_lava_base/engineering) -"Sm" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ - dir = 8; - chamber_id = "lavalandsyndien2" +/obj/item/storage/box/donkpockets{ + pixel_x = -2; + pixel_y = 6 }, -/turf/open/floor/engine/n2, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/bar) +"RK" = ( +/turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) "St" = ( /obj/structure/fans/tiny, @@ -4106,6 +3897,15 @@ }, /turf/open/floor/plating, /area/ruin/syndicate_lava_base/arrivals) +"Sv" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/engine, +/area/ruin/syndicate_lava_base/engineering) "SA" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/trinary/mixer/flipped/layer4{ @@ -4113,31 +3913,141 @@ }, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) -"Tt" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +"SN" = ( +/obj/structure/closet/secure_closet/freezer/fridge/open, +/obj/item/reagent_containers/condiment/enzyme, +/obj/item/food/chocolatebar, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/bar) +"SQ" = ( +/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/dark, +/area/ruin/syndicate_lava_base/cargo) +"SX" = ( +/obj/structure/closet/secure_closet/medical1{ + req_access = list("syndicate") + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/beakers/bluespace, +/obj/item/storage/box/beakers/bluespace, +/obj/machinery/light/small/directional/west, +/obj/item/construction/plumbing, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/turf/open/floor/iron/white/side{ + dir = 9 + }, +/area/ruin/syndicate_lava_base/chemistry) +"Tb" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining/glass{ + name = "Cargo Bay" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/cargo) +"Tf" = ( +/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/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/duct, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/main) +"Tg" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/chemistry) +"To" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/turf/open/floor/wood, +/area/ruin/syndicate_lava_base/bar) +"Tq" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/caution/stand_clear{ dir = 1 }, -/obj/effect/turf_decal/tile/red/half/contrasted, +/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/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" +"Tr" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/mapping_helpers/apc/syndicate_access, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/arrivals) +"TD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/main) +"TE" = ( +/obj/structure/table, +/obj/structure/bedsheetbin, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/syndicate_lava_base/dormitories) +"TG" = ( +/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/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/cargo) +"TL" = ( +/obj/machinery/airalarm/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/ruin/syndicate_lava_base/virology) +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/machinery/duct, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/main) +"TN" = ( +/obj/structure/table/wood, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/ruin/syndicate_lava_base/bar) "TO" = ( /obj/machinery/portable_atmospherics/canister, /turf/open/floor/iron, @@ -4150,67 +4060,34 @@ /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/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/obj/machinery/duct, -/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" - }, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, -/obj/effect/mapping_helpers/airlock/locked, -/obj/structure/cable, +/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, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/bar) +"Um" = ( +/obj/structure/sign/departments/engineering, +/turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/syndicate_lava_base/main) -"Uk" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Dormitories" - }, +"Ur" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/dormitories) -"Uq" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ - name = "Medbay" +/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/duct, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/ruin/syndicate_lava_base/medbay) +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/main) "Ut" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/red/line{ @@ -4221,59 +4098,71 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/main) -"UD" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Bar" +"Uw" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ + chamber_id = "lavalandsyndieco2" }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/engine/co2, +/area/ruin/syndicate_lava_base/engineering) +"Uz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/arrivals) +"UF" = ( /obj/machinery/duct, /turf/open/floor/iron, -/area/ruin/syndicate_lava_base/bar) -"Vd" = ( -/obj/machinery/atmospherics/miner/plasma, -/turf/open/floor/engine/plasma, -/area/ruin/syndicate_lava_base/engineering) -"Vo" = ( -/obj/machinery/light/small/directional/south, +/area/ruin/syndicate_lava_base/cargo) +"UK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/main) +"UP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/turf/open/floor/wood, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/ruin/syndicate_lava_base/virology) +"UX" = ( +/obj/structure/table/wood, +/obj/item/ammo_box/magazine/m9mm, +/obj/item/ammo_box/magazine/sniper_rounds, +/obj/machinery/airalarm/directional/north, +/obj/item/crowbar/red, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/turf/open/floor/carpet/red, /area/ruin/syndicate_lava_base/dormitories) -"Vp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"Vr" = ( +"Vb" = ( +/obj/effect/turf_decal/stripes/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/arrivals) -"VM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/white/side{ - dir = 6 - }, -/area/ruin/syndicate_lava_base/virology) -"VR" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ +"Vj" = ( +/obj/machinery/duct, +/turf/open/floor/plating, +/area/ruin/syndicate_lava_base/dormitories) +"Vl" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ 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/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/bar) +"Vm" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -4283,16 +4172,42 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) -"VV" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/extinguisher_cabinet/directional/west, +"Vs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/mapping_helpers/apc/syndicate_access, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white/side{ - dir = 8 +/obj/machinery/duct, +/turf/open/floor/wood, +/area/ruin/syndicate_lava_base/dormitories) +"VH" = ( +/obj/structure/table/wood, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/ruin/syndicate_lava_base/bar) +"VL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/turf_decal/sand/plating/volcanic, +/turf/open/floor/plating/lavaland_atmos, +/area/lavaland/surface/outdoors) +"VR" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 }, -/area/ruin/syndicate_lava_base/chemistry) +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible/layer4, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/engineering) +"Wc" = ( +/obj/machinery/door/airlock/virology/glass{ + name = "Isolation B" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/ruin/syndicate_lava_base/virology) "Wf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible/layer4, /turf/open/floor/iron, @@ -4305,13 +4220,20 @@ /obj/structure/cable, /turf/open/floor/plating, /area/ruin/syndicate_lava_base/engineering) -"Wl" = ( +"Wj" = ( +/obj/effect/turf_decal/box/white/corners, +/obj/machinery/vending/assist, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/cargo) +"Wm" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/firealarm/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, /turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) +/area/ruin/syndicate_lava_base/cargo) "Wn" = ( /obj/modular_map_root/syndicatebase{ key = "mistake" @@ -4319,236 +4241,303 @@ /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, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, +"Wv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/red/line{ + dir = 9 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/main) +"WA" = ( +/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, +/obj/machinery/light/small/directional/south, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndicate_lava_base/arrivals) +"WD" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/air_sensor{ + chamber_id = "lavalandsyndieo2" + }, +/turf/open/floor/engine/o2, /area/ruin/syndicate_lava_base/engineering) -"Xq" = ( +"WK" = ( +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/structure/cable, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/arrivals) +"WT" = ( +/obj/machinery/light/small/directional/west, /obj/machinery/firealarm/directional/west, /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/white/side{ - dir = 8 - }, -/area/ruin/syndicate_lava_base/chemistry) -"Xr" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/cargo) +"WZ" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/mapping_helpers/apc/syndicate_access, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) -"XA" = ( +"Xi" = ( /obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate{ - dir = 8 + dir = 4 + }, +/obj/item/bedsheet/syndie{ + dir = 4 + }, +/obj/structure/bed{ + dir = 4 + }, +/turf/open/floor/carpet/red, +/area/ruin/syndicate_lava_base/dormitories) +"Xv" = ( +/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/side, +/area/ruin/syndicate_lava_base/main) +"Xy" = ( +/obj/machinery/air_sensor{ + chamber_id = "lavalandsyndieco2" + }, +/obj/structure/sign/poster/official/wtf_is_co2/directional/north{ + dir = 1 + }, +/turf/open/floor/engine/co2, +/area/ruin/syndicate_lava_base/engineering) +"Xz" = ( +/obj/structure/closet/crate/freezer, +/obj/item/food/rationpack, +/obj/item/food/rationpack, +/obj/item/food/rationpack, +/obj/item/food/rationpack, +/obj/item/food/rationpack, +/obj/item/food/rationpack, +/obj/item/food/rationpack, +/obj/item/food/rationpack, +/obj/item/food/rationpack, +/obj/item/food/rationpack, +/obj/item/food/rationpack, +/obj/item/food/rationpack, +/obj/item/food/canned/beans, +/obj/item/food/canned/beans, +/obj/item/food/canned/beans, +/obj/item/food/canned/beans, +/obj/item/food/canned/beans, +/obj/item/food/canned/beans, +/obj/item/food/canned/beans, +/obj/item/food/canned/beans, +/obj/item/food/canned/beans, +/obj/item/food/canned/beans, +/obj/item/food/canned/beans, +/obj/item/reagent_containers/cup/glass/waterbottle/large, +/obj/item/reagent_containers/cup/glass/waterbottle/large, +/obj/item/reagent_containers/cup/glass/waterbottle/large, +/obj/item/reagent_containers/cup/glass/waterbottle/large, +/obj/item/reagent_containers/cup/glass/waterbottle/large, +/obj/item/reagent_containers/cup/glass/waterbottle/large, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/bar) +"XE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 }, -/obj/machinery/airalarm/directional/north, -/obj/item/bedsheet/syndie, -/obj/structure/bed, -/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/carpet/red, /area/ruin/syndicate_lava_base/dormitories) -"XC" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/syndicate_access, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) "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/layer_manifold/supply/hidden{ - dir = 4 - }, -/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/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet/red, -/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, +"XQ" = ( /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/neutral/fourcorners, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/cargo) -"XW" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"XV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/poddoor/shutters{ - id = "syndicate_lavaland_warehouse" - }, -/obj/effect/turf_decal/stripes/line{ +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/syndicate_lava_base/main) +"Yd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, +/obj/structure/cable, +/turf/open/floor/iron, /area/ruin/syndicate_lava_base/cargo) -"Yb" = ( +"Yx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/red/line{ + dir = 6 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/main) +"YG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/mapping_helpers/apc/syndicate_access, -/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable, /obj/machinery/duct, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/dormitories) -"Yh" = ( -/obj/machinery/door/airlock/virology/glass{ - name = "Isolation A" - }, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/bar) +"YI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/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/layer4{ +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/engineering) +"YJ" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"Yt" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/air_sensor{ - chamber_id = "lavalandsyndieplasma" +/obj/item/turbine_parts/rotor{ + current_tier = 3 }, -/turf/open/floor/engine/plasma, +/obj/item/turbine_parts/stator{ + current_tier = 2 + }, +/obj/item/turbine_parts/compressor{ + current_tier = 3 + }, +/obj/item/pipe_dispenser, +/obj/structure/closet/crate/engineering, +/obj/item/stack/sheet/mineral/plastitanium{ + amount = 30 + }, +/obj/item/stack/sheet/plastitaniumglass{ + amount = 15 + }, +/turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) -"YS" = ( -/obj/effect/turf_decal/box/white/corners{ - dir = 8 +"YP" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 }, -/obj/structure/closet/crate/secure/weapon{ - req_access = list("syndicate") +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/engineering) +"Zj" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/toolcloset{ + anchored = 1 }, -/obj/item/ammo_box/c9mm{ - pixel_y = 6 +/obj/item/crowbar, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/engineering) +"Zn" = ( +/obj/machinery/door/airlock{ + name = "Cabin 2" }, -/obj/item/ammo_box/c9mm, -/obj/item/ammo_box/magazine/m9mm{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet/red, +/area/ruin/syndicate_lava_base/dormitories) +"Zp" = ( +/obj/machinery/airalarm/directional/north, +/obj/structure/closet/crate, +/obj/item/extinguisher{ pixel_x = -5; pixel_y = 5 }, -/obj/item/ammo_box/magazine/m9mm{ +/obj/item/extinguisher{ pixel_x = -2; pixel_y = 2 }, -/obj/item/ammo_box/magazine/m9mm{ +/obj/item/extinguisher{ 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/layer4, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) -"YU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 +/obj/item/flashlight{ + pixel_x = -5; + pixel_y = 5 }, -/obj/machinery/duct, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"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/item/flashlight{ + pixel_x = -2; + pixel_y = 2 }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"Zv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = -1 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/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/item/radio/headset/syndicate/alt{ + pixel_x = -3; + pixel_y = 3 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 +/obj/item/radio/headset/syndicate/alt, +/obj/item/radio/headset/syndicate/alt{ + pixel_x = 3; + pixel_y = -3 }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/main) -"ZD" = ( +/area/ruin/syndicate_lava_base/cargo) +"Zr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/dormitories) -"ZG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/radiation/rad_area/directional/south, -/obj/effect/turf_decal/stripes, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 +/turf/open/floor/iron/white/side{ + dir = 9 }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) +/area/ruin/syndicate_lava_base/virology) +"Zu" = ( +/obj/structure/table/wood, +/obj/item/ammo_box/magazine/m9mm, +/obj/item/ammo_box/magazine/sniper_rounds, +/obj/item/crowbar/red, +/turf/open/floor/carpet/red, +/area/ruin/syndicate_lava_base/dormitories) +"Zw" = ( +/obj/structure/sign/warning/vacuum/external/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/ruin/syndicate_lava_base/cargo) +"ZA" = ( +/obj/structure/reagent_dispensers/plumbed, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/bar) "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, -/obj/machinery/atmospherics/miner/carbon_dioxide, -/turf/open/floor/engine/co2, -/area/ruin/syndicate_lava_base/engineering) -"ZO" = ( +"ZQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/duct, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"ZU" = ( -/obj/machinery/griddle, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) -"ZZ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) (1,1,1) = {" IU @@ -4915,7 +4904,7 @@ ab si eh eG -ff +eb eI aj eh @@ -4964,10 +4953,10 @@ ab ab ab eh -eH -VM -Fs -OQ +DN +tN +Wc +kK eI hp hE @@ -5017,10 +5006,10 @@ eh eI eI eI -PR -DL -de -hF +fK +sH +Bm +CJ eh ab ab @@ -5065,9 +5054,9 @@ ab si eh eG -fh +KX eI -PR +fK eI hr hG @@ -5114,10 +5103,10 @@ ab ab ab eh -eH -VM -Yh -Cn +DN +tN +Mg +DO eh gj eh @@ -5167,8 +5156,8 @@ eh eh eI eI -Cu -gU +Zr +di hs hH ab @@ -5179,17 +5168,17 @@ ab ab dG dG -ig -iu -iu -iu -lv +bz +nb +nb +nb +Hn lT -mq +Ks mS -Zv -Vr -Pl +Uz +FO +OO mT ab ab @@ -5217,7 +5206,7 @@ si eh fi fA -sd +MM gV ht hH @@ -5228,18 +5217,18 @@ ab ab dG dG -ig -je -iv -jk -le -lw +bz +xk +VL +OL +kn +rP lT mr mS -Ms -Kg -IJ +QN +JF +WA mT ab ab @@ -5267,8 +5256,8 @@ rp eJ fj fB -KI -yp +Or +CZ hu hH ab @@ -5277,9 +5266,9 @@ ab ab dG dG -ig -je -jk +bz +xk +OL jx jx jy @@ -5288,7 +5277,7 @@ jy ms mT no -Kg +JF ol mT ab @@ -5317,7 +5306,7 @@ pa ae ae fC -tf +UP gX hv hH @@ -5326,9 +5315,9 @@ ab ab dG dG -ig -je -jk +bz +xk +OL jx jx IQ @@ -5338,7 +5327,7 @@ jy jy jy np -HS +Vb mT mT mT @@ -5367,7 +5356,7 @@ pa pa ae eh -Tu +PD eh eh eh @@ -5375,22 +5364,22 @@ hW dG dG dG -ig -je -iv +bz +xk +VL jx jx Ue kH xt jZ -rv +JD mt mU np -xM +Tq EZ -oI +lF oD St ab @@ -5416,29 +5405,29 @@ pa pa pa ae -fE -Ny -QS +pk +vy +fk hw -hI +ty hX -ig -iu -iu -je -jk +bz +nb +nb +xk +OL jx jx -vM -Ly -vM -Ly -vM -Ly -gi -ks -nq -HQ +uN +zD +uN +zD +uN +zD +to +DI +dc +oi mT mT mT @@ -5467,29 +5456,29 @@ pa pa ae fF -GQ -gZ +hA +MZ hw hJ hY -ih -iv -iM -iv -iv +vR +VL +Qj +VL +VL jx cI -jY +PO xt jZ tT ly NQ -mu +Cc mU nr -cq -om +tg +zI mT ab ab @@ -5517,7 +5506,7 @@ pa pa ae ae -IB +sn ha ha hK @@ -5529,16 +5518,16 @@ ha ha jP jM -vM +uN jZ bZ lh Ev -lW -mv +pV +VH jy jy -zK +QF xA mT ab @@ -5567,30 +5556,30 @@ pa pa pa ae -ry +PB hb ha iN ha ii -iw -iO +fM +mB hB jl jz xt -Ly -qk -Yn +zD +Vl +wc li lA lA mw -ah +AJ jy -vg -Tt -ox +sr +Bi +uH ab ab ab @@ -5617,30 +5606,30 @@ pa pa pa Wn -ZO -yO -Ob -VT -TY -KR -ZO -sT -Jp -jm -UD -jO -wA -kp -Rj -iQ -Mr -um +TD +Ap +TL +cY +Vm +Ur +TD +IX +LK +pR +nK +Pn +mK +ZQ +YG +FX +Gq +To lA ai jP -vg -op -ox +sr +HJ +uH ab ab ab @@ -5667,30 +5656,30 @@ pa pa ae dQ -vA +TD hd hy hy hy ik -Wl -ZO +UK +TD hz hz jy jy ka -Pw +ue kM lk lC -um -lh +To +TN jy jy -cS +fm oo -ox +uH ab ab ab @@ -5717,30 +5706,30 @@ ae ae oP fH -sT -he +IX +yA hz hz hz hz -iy -Uk +ce +lj hz -HX -jA +bB +Zu jy jy jy jy jy ak -PT +fL jy jy -EV -xD -cn -ox +qf +EX +WK +uH ab ab ab @@ -5760,34 +5749,34 @@ ab pa pa as -do -dA -Xq -VV -vI -Ag -vK -sT +SX +Np +bi +Cf +Mr +EC +jd +IX he hz -hM -xf +UX +Xi hz -iz -JM -XR -FC -jB +wV +tP +sq +XE +JR hz -kb -ur -kN -yy -lE -kp +ZA +zy +KV +Xz +xX +ZQ jy -XC -pI +Tr +kE nW aW mT @@ -5810,34 +5799,34 @@ ab ab as as -rE -dB -bd +JB +Tg +fv es eS fn fO -sT +IX hf hz -hN -FI -qw -RH -Vo +FD +kD +Zn +Jr +iU hz hz hz hz jy -RO -kq -Cc -kp -eF +zZ +wg +zk +ZQ +uk jy -lH -Kz +qO +td nX oo mT @@ -5862,33 +5851,33 @@ at aM dv dC -IF +uh et eT fo fO -sT -hg +IX +hf hz hz hz hz -bV -JM -HP -Hm -mx -Mt +Cy +tP +bS +Vj +BH +rV jy -nF -bY -ZU -YU -Rn +qA +gv +mN +tA +SN jy -mX -Kg -aQ +Nh +JF +nX mT mT ab @@ -5912,19 +5901,19 @@ at cA dw dC -yS +gt eu eU fn fH -sT +IX he -Jo +jm hz pM -ya -iC -Yb +aA +uj +Vs hz hz hz @@ -5932,12 +5921,12 @@ hz jy jy jy -xF -xr -fD +RG +vo +GG jy -AX -bq +bW +ds nZ mT ab @@ -5960,26 +5949,26 @@ ab ab at cG -dx +mQ dE dY ev -eV +zK fp fH -ZO -FW +TD +Ce hz hz hz hz -Ae -RH -qI -FC -jC +zH +Jr +Hq +XE +Ee hz -Kp +kO kP kQ kQ @@ -5987,7 +5976,7 @@ kQ kQ kQ kT -Kj +Di kR kQ kQ @@ -6012,32 +6001,32 @@ as as as dI -dZ +NE ew as as as -qU +xQ hh hz -hP -FI -Se -ZD -RH +kU +kD +BX +OF +Jr hz -XA -jA +aV +Zu hz hJ -kt +zm kQ lm -lG -md +aU +ey mA -mZ -wE +bQ +HT oa or kQ @@ -6064,30 +6053,30 @@ as as as as -dP +PW ZH -AD -Bb +Ih +ze he hz -hQ -oK +Jj +CC hz -Ir -oy +KT +TE hz hO hz hz -tu +wx ha kQ ln lJ -mk +pW lI -AQ -Dj +zq +nM ob al kQ @@ -6111,14 +6100,14 @@ ab ab si dy -RP -YS -XU -yl -Ck -XW -qm -he +kt +Aj +WT +XQ +kl +Ac +HG +yA hz hz hz @@ -6129,14 +6118,14 @@ hz sw Oq jR -ZO -qW -Uq -Cz -jb -jb -jb -yk +TD +Xv +CE +qt +qN +qN +qN +pp nA oc kQ @@ -6161,32 +6150,32 @@ ab ab ab dy -dL +Zp Ub -yl +XQ Ci -CR +vT dy -qy -Eo +BV +Hi hB hB hB -ag +QQ iG iZ ji -ZZ -sT -sT -sT +Cl +IX +IX +IX kv kS ln lJ mf -Nk -te +iF +In nB kQ kQ @@ -6211,32 +6200,32 @@ ab ab ab dy -BD +Le DP -Ck -eY -cc +kl +KN +Wj dy -wp -dU -dU -IC -No -Jq -vq -Gs -Gx -Gx -ZO +Is +Ku +Ku +Rf +Gd +uo +Tf +tC +DG +DG +TD Qv -kj +Qu kw kT bC KS ap mE -NR +yL nC kQ si @@ -6261,24 +6250,24 @@ ab ab ab dy -ij -Qa -Pb -vU +Hk +sx +SQ +Iw dy dy gO -hk +Tb hC dy ha iq -Ui +eZ iq ha ha -OW -jT +yG +Um ju ju ju @@ -6286,9 +6275,9 @@ ju ju LS ju -CY -CY -CY +uv +uv +uv ju ju ju @@ -6313,32 +6302,32 @@ ab dy dy dy -Qy +rC fa dy -fY +TG gP -Dp +EU hl hS ha -DY -iS -tp +Wv +KM +pe ha -Xd -Eg -jU +rU +zT +aO ju Bu kV lp -lL -mg +Dr +rI mF Cj Lp -bP +Sv Lp rn dK @@ -6363,28 +6352,28 @@ ab ab dy ee -aY +pu fb -fu +iQ gb gQ -BF +UF gQ hT ha -is -bx -jc -Dx -jv -Bj -ZG +vV +Gm +yv +XV +OZ +yq +CV ju Wg kW lq -lM -Qb +ww +Ic mG nd nD @@ -6413,29 +6402,29 @@ ab ab dy ef -OX -ie -QV -QV -Ff -Ln -BF -hU +NO +Ot +QA +QA +Yd +tZ +UF +ez ha Ut -ou -Zz -Dx -jw -LG -Kf -bM -wX -wv -wv -Rh -Vp -Xr +if +Yx +XV +Zj +cP +Fz +Ft +GV +za +za +rf +Ls +YI yh nE PZ @@ -6464,32 +6453,32 @@ ab dy eg eD -fd -fw +bE +Wm gc -gS -hn +cb +Iv gQ -hV +zw ha -Dx -FP -Dx -Dx +XV +Ll +XV +XV ju ju ju ju -JQ -lX +WZ +YP sl -XP +qP ET -OG -Dt -pU -CI -jD +yE +PM +tB +Gu +zC TV ju ab @@ -6514,23 +6503,23 @@ ab dy dy eE -fe +qv dy gd dy -ho -hD +zt +fc dy dy -wi +Gw lc lc ju -ld +Xy JV XK ov -Za +AO KU KU Ao @@ -6538,7 +6527,7 @@ SA aG Wf sl -eM +Oa ju OI ju @@ -6563,21 +6552,21 @@ ab ab ab dy -qq -qq +nj +nj dy -gf +Zw dy -qq -qq +nj +nj dy si si ab ab ju -ZN -oO +sf +Uw XK TO PE @@ -6631,18 +6620,18 @@ ju ju TO JE -va -IP +YJ +ta vB -Nh -my +LW +LX eK sl -vN -aC -Sk -Sk -ys +qd +ND +PA +PA +rb ab ab ab @@ -6690,8 +6679,8 @@ cB cB ju ju -IH -Sk +ns +PA ju ab ab @@ -6731,13 +6720,13 @@ ab ab ju oM -Sm +zU ju Ab -NU +lP ju Ry -CA +nR ju ju ju @@ -6780,14 +6769,14 @@ ab ab ab ju -rg -xn +IA +Mj ju -Rl -sc +WD +PG ju -Yt -Vd +nN +dV ju ab ab diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_1.dmm index ea6dfc3d2b6e9..92338633ecfb3 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_1.dmm @@ -24,30 +24,18 @@ "f" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/syndicate_lava_base/telecomms) -"h" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/door/airlock/hatch{ - name = "Telecommunications" - }, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, -/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/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/noticeboard/directional/east, +"m" = ( +/obj/machinery/computer/camera_advanced, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/telecomms) -"m" = ( -/obj/machinery/computer/camera_advanced, +"n" = ( +/obj/machinery/telecomms/relay/preset/ruskie{ + use_power = 0 + }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/telecomms) @@ -77,27 +65,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/telecomms) -"s" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, +"v" = ( /obj/effect/mapping_helpers/airalarm/syndicate_access, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/dark, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/circuit/green, /area/ruin/syndicate_lava_base/telecomms) -"u" = ( +"x" = ( /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/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/telecomms) -"y" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - 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{ @@ -107,8 +86,8 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/telecomms) -"A" = ( -/obj/machinery/light/small/directional/west, +"B" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/telecomms) @@ -119,6 +98,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/telecomms) +"E" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/door/airlock/hatch{ + name = "Telecommunications" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/modular_map_connector, +/turf/template_noop, +/area/ruin/syndicate_lava_base/telecomms) "G" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, @@ -130,12 +120,11 @@ /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, +"N" = ( +/obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/obj/machinery/airalarm/directional/south, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/telecomms) "O" = ( @@ -146,8 +135,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/telecomms) -"R" = ( +"U" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/noticeboard/directional/east, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/telecomms) @@ -158,10 +150,17 @@ "W" = ( /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/telecomms) +"Y" = ( +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/telecomms) "Z" = ( -/obj/effect/mapping_helpers/airalarm/syndicate_access, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/circuit/green, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/telecomms) (1,1,1) = {" @@ -178,7 +177,7 @@ a f f j -M +n j f f @@ -189,7 +188,7 @@ f j j o -Z +v j f a @@ -209,8 +208,8 @@ a e c o -A -s +Y +N f f "} @@ -218,7 +217,7 @@ f a e c -y +Z m C b @@ -228,7 +227,7 @@ f a e W -R +B K z G @@ -238,8 +237,8 @@ f a e p -l -u +U +x q f f @@ -249,7 +248,7 @@ a a a a -h +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 index fdd6a821d7a20..9dfb448cffecb 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_feasible.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_feasible.dmm @@ -1,20 +1,8 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( +"aa" = ( /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, -/mob/living/carbon/human/species/monkey{ - faction = list("neutral","Syndicate") - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"c" = ( +"ac" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/hatch{ heat_proof = 1; @@ -29,7 +17,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/testlab) -"d" = ( +"ad" = ( /obj/structure/table/reinforced, /obj/item/restraints/handcuffs, /obj/item/taperecorder, @@ -37,38 +25,73 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/testlab) -"f" = ( +"ae" = ( +/obj/machinery/firealarm/directional/south, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/testlab) +"af" = ( /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/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" = ( +"ag" = ( +/obj/structure/table/reinforced, +/obj/item/restraints/handcuffs, +/obj/item/taperecorder, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/testlab) +"ah" = ( /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) -"j" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +"ai" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, -/turf/open/floor/engine, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/testlab) -"k" = ( -/obj/effect/mapping_helpers/airalarm/syndicate_access, -/obj/machinery/airalarm/directional/north, +"aj" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 4 + }, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) -"l" = ( +"ak" = ( +/obj/structure/table/reinforced, +/obj/effect/decal/cleanable/dirt, +/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, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/testlab) +"al" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/extinguisher_cabinet/directional/east, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/testlab) -"m" = ( +"am" = ( /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/preopen{ @@ -77,11 +100,17 @@ }, /turf/open/floor/plating, /area/ruin/syndicate_lava_base/testlab) -"n" = ( +"an" = ( /obj/structure/sign/warning/explosives/alt/directional/west, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) -"p" = ( +"ao" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/engine, +/area/ruin/syndicate_lava_base/testlab) +"ap" = ( /obj/structure/table/reinforced, /obj/item/storage/toolbox/syndicate, /obj/item/paper/crumpled{ @@ -93,37 +122,43 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/testlab) -"q" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"aq" = ( +/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" = ( +"ar" = ( /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/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/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/layer4{ +"as" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) -"t" = ( +"at" = ( /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" = ( +"au" = ( /obj/machinery/door/airlock/hatch{ name = "Monkey Pen" }, @@ -132,36 +167,65 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/testlab) -"w" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"av" = ( +/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) +"aw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ + dir = 4 + }, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/mapping_helpers/airalarm/syndicate_access, /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/testlab) -"x" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"ax" = ( +/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" = ( +"ay" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/testlab) -"z" = ( +"az" = ( /obj/machinery/firealarm/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +/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" = ( +"aA" = ( +/obj/structure/bed/medical/emergency, +/obj/machinery/iv_drip, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/mob/living/carbon/human/species/monkey{ + faction = list("neutral","Syndicate") + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/north, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/testlab) +"aB" = ( /obj/machinery/light/small/directional/north, /obj/machinery/button/door{ id = "lavalandsyndi"; @@ -176,14 +240,16 @@ /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/layer2, +"aC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ + dir = 4 + }, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) -"D" = ( +"aD" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/syndicate_lava_base/testlab) -"F" = ( +"aE" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -196,7 +262,20 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/testlab) -"G" = ( +"aF" = ( +/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" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/structure/cable, +/obj/modular_map_connector, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/testlab) +"aG" = ( /obj/machinery/light/small/directional/south, /obj/structure/table/reinforced, /obj/item/storage/box/monkeycubes/syndicate, @@ -204,44 +283,107 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/testlab) -"I" = ( +"aH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/engine, +/area/ruin/syndicate_lava_base/testlab) +"aI" = ( /obj/structure/sign/warning/secure_area, /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/syndicate_lava_base/testlab) -"L" = ( +"aJ" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/testlab) +"aK" = ( +/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) +"aL" = ( /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, /turf/open/floor/plating, /area/ruin/syndicate_lava_base/testlab) -"P" = ( +"aM" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/engine, +/area/ruin/syndicate_lava_base/testlab) +"aN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/testlab) +"aO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/testlab) +"aP" = ( /obj/structure/sign/warning/explosives/alt/directional/east, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) -"R" = ( +"aQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/engine, +/area/ruin/syndicate_lava_base/testlab) +"aR" = ( /obj/structure/table/reinforced, /obj/effect/decal/cleanable/dirt, /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, +/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" = ( +"aS" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) -"V" = ( +"aT" = ( +/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/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +/turf/open/floor/plating, +/area/ruin/syndicate_lava_base/testlab) +"aU" = ( +/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) +"aV" = ( +/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" = ( +"aW" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) -"X" = ( +"aX" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, @@ -249,12 +391,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/testlab) -"Y" = ( +"aY" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) -"Z" = ( -/obj/structure/bed/roller, +"aZ" = ( +/obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -262,134 +404,149 @@ faction = list("neutral","Syndicate") }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/mapping_helpers/airalarm/syndicate_access, -/obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/testlab) +"gS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/engine, +/area/ruin/syndicate_lava_base/testlab) +"IP" = ( +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/engine, +/area/ruin/syndicate_lava_base/testlab) +"Zh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/engine, +/area/ruin/syndicate_lava_base/testlab) (1,1,1) = {" -a -a -a -a -a -a -a -D -D -a -a -a +aa +aa +aa +aa +aa +aa +aa +aD +aD +aa +aa +aa "} (2,1,1) = {" -a -D -D -D -D -D -D -D -Z -b -a -a +aa +aD +aD +aD +aD +aD +aD +aD +aA +aZ +aa +aa "} (3,1,1) = {" -D -D -h -h -n -Y -h -I -L -u -a -a +aD +aD +ah +ah +an +aY +ah +aI +aL +au +aa +aa "} (4,1,1) = {" -D -W -h -j -h -j -h -c -t -z -a -a +aD +aW +ah +ao +ah +ao +ah +ac +at +ae +aa +aa "} (5,1,1) = {" -D -k -h -C -h -C -h -D -B -w -a -a +aD +IP +ah +aH +ah +aH +ah +aD +aB +aO +aa +aa "} (6,1,1) = {" -D -h -h -V -h -s -h -m -p -y -X -a +aD +ah +ah +Zh +ah +aM +ah +am +ap +ai +aX +aa "} (7,1,1) = {" -D -W -h -q -x -x -q -r -R -f -l -F +aD +aW +ah +aQ +gS +gS +aQ +aT +ak +aJ +aN +aE "} (8,1,1) = {" -D -D -h -h -P -S -h -m -d -G -a -a +aD +aD +ah +ah +aP +aS +ah +am +ag +av +aa +aa "} (9,1,1) = {" -a -D -D -D -D -a -a -a -a -a -a -a +aa +aD +aD +aD +aD +aa +aa +aa +aa +aa +aa +aa "} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm index 6521ff2c4e633..1c4f402f49d1f 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm @@ -2,11 +2,6 @@ "aA" = ( /turf/template_noop, /area/template_noop) -"aU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/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, @@ -119,6 +114,14 @@ }, /turf/open/floor/plating, /area/ruin/syndicate_lava_base/testlab) +"iF" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/south, +/obj/structure/window/reinforced/plasma/spawner/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/engine, +/area/ruin/syndicate_lava_base/testlab) "iQ" = ( /obj/structure/sign/warning/explosives/alt/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, @@ -127,6 +130,11 @@ "js" = ( /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) +"kw" = ( +/obj/item/stack/sheet/plasmarglass, +/obj/structure/window/reinforced/plasma/spawner/directional/south, +/turf/open/floor/engine, +/area/ruin/syndicate_lava_base/testlab) "kE" = ( /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/testlab) @@ -171,14 +179,6 @@ /obj/structure/cable, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) -"oV" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/south, -/obj/structure/window/reinforced/plasma/spawner/directional/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{ @@ -195,15 +195,18 @@ }, /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) +"sY" = ( +/obj/machinery/atmospherics/components/trinary/filter/on{ + dir = 1; + filter_type = list(/datum/gas/nitrogen) + }, +/obj/structure/window/reinforced/plasma/spawner/directional/south, +/turf/open/floor/engine, +/area/ruin/syndicate_lava_base/testlab) "uG" = ( /obj/item/storage/toolbox/syndicate, /obj/item/pipe_dispenser, @@ -218,12 +221,6 @@ /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/layer4{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) "xI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -235,10 +232,13 @@ /obj/structure/cable, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) -"yO" = ( -/obj/machinery/power/supermatter_crystal/shard/syndicate, -/obj/structure/window/reinforced/plasma/spawner/directional/south, -/turf/open/floor/engine, +"yU" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/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/directional/east, +/turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/testlab) "Au" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -252,19 +252,9 @@ /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/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"Ce" = ( +"Ch" = ( +/obj/machinery/power/supermatter_crystal/shard/syndicate, /obj/structure/window/reinforced/plasma/spawner/directional/south, -/obj/structure/window/reinforced/plasma/spawner/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) "EC" = ( @@ -274,11 +264,6 @@ /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/directional/south, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) "HC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/airalarm/directional/south, @@ -294,18 +279,30 @@ /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(/datum/gas/nitrogen) +"Lc" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4 }, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/testlab) +"Ni" = ( +/obj/machinery/atmospherics/components/unary/passive_vent, +/obj/structure/lattice/catwalk, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/syndicate_lava_base/testlab) +"OO" = ( /obj/structure/window/reinforced/plasma/spawner/directional/south, +/obj/structure/window/reinforced/plasma/spawner/directional/east, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) -"Lc" = ( -/obj/machinery/atmospherics/components/binary/pump{ +"Qz" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, +/obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/testlab) "Rn" = ( @@ -404,7 +401,7 @@ XN uG em kE -xD +Qz aA aA "} @@ -434,7 +431,7 @@ Ys xT em kE -aU +xI aA aA "} @@ -443,8 +440,8 @@ hK me XS fY -GD -oV +kw +iF js kP IG @@ -459,13 +456,13 @@ me XS Rn js -yO +Ch js rT IG Vp ef -AV +yU on "} (8,1,1) = {" @@ -473,8 +470,8 @@ em me AS oo -JO -Ce +sY +OO Rp lR em @@ -499,7 +496,7 @@ aA aA "} (10,1,1) = {" -rX +Ni sa sa em diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_1.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_1.dmm index eb8a951ce7ace..5d7b0c4bee510 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_1.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_1.dmm @@ -22,18 +22,19 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/ruin/space/djstation) -"n" = ( -/obj/structure/closet/secure_closet/freezer/fridge/all_access, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/ruin/space/djstation) "o" = ( /obj/structure/table, /obj/machinery/cell_charger, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/ruin/space/djstation) +"t" = ( +/obj/structure/closet/secure_closet/freezer/fridge/all_access, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/ruin/space/djstation) "u" = ( /obj/structure/disposalpipe/trunk, /obj/machinery/disposal/bin, @@ -152,7 +153,7 @@ a L W P -n +t L V b diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_3.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_3.dmm index ebd8d7a821185..d40460ca6deaa 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_3.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_3.dmm @@ -51,11 +51,6 @@ /obj/modular_map_connector, /turf/template_noop, /area/ruin/space/djstation) -"O" = ( -/obj/structure/lattice, -/obj/effect/spawner/random/structure/grille, -/turf/open/space/basic, -/area/space/nearstation) "P" = ( /obj/structure/rack, /obj/effect/spawner/random/food_or_drink/refreshing_beverage{ @@ -94,7 +89,7 @@ e e e e -O +e j e a diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_4.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_4.dmm index 6c70ee4def880..b1e312f9936c1 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_4.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_4.dmm @@ -6,10 +6,6 @@ /obj/structure/lattice, /turf/template_noop, /area/space/nearstation) -"c" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron/white, -/area/ruin/space/djstation) "e" = ( /obj/structure/lattice, /obj/effect/spawner/random/structure/grille, @@ -42,26 +38,25 @@ /obj/item/storage/bag/tray, /turf/open/floor/iron/white, /area/ruin/space/djstation) -"j" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white, -/area/ruin/space/djstation) -"k" = ( -/obj/structure/closet/secure_closet/freezer/meat/all_access, -/turf/open/floor/iron/freezer, -/area/ruin/space/djstation) "r" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall, /area/ruin/space/djstation) -"z" = ( -/obj/machinery/oven/range, -/turf/open/floor/iron/white, +"s" = ( +/obj/structure/closet/secure_closet/freezer/kitchen/mining{ + req_access = null + }, +/turf/open/floor/iron/freezer, /area/ruin/space/djstation) -"A" = ( +"t" = ( /obj/structure/closet/secure_closet/freezer/fridge/all_access, +/obj/machinery/light/directional/north, /turf/open/floor/iron/freezer, /area/ruin/space/djstation) +"z" = ( +/obj/machinery/oven/range, +/turf/open/floor/iron/white, +/area/ruin/space/djstation) "F" = ( /obj/structure/table, /obj/machinery/microwave{ @@ -99,12 +94,6 @@ /obj/item/book/manual/wiki/cooking_to_serve_man, /turf/open/floor/iron/white, /area/ruin/space/djstation) -"Q" = ( -/obj/structure/closet/secure_closet/freezer/kitchen/mining{ - req_access = null - }, -/turf/open/floor/iron/freezer, -/area/ruin/space/djstation) "R" = ( /obj/structure/table, /obj/item/reagent_containers/condiment/enzyme{ @@ -118,6 +107,10 @@ }, /turf/open/floor/iron/white, /area/ruin/space/djstation) +"S" = ( +/obj/structure/closet/secure_closet/freezer/meat/all_access, +/turf/open/floor/iron/freezer, +/area/ruin/space/djstation) "T" = ( /obj/machinery/door/airlock/public/glass{ name = "Kitchen" @@ -195,7 +188,7 @@ a e b L -Q +s h W W @@ -209,7 +202,7 @@ I e a L -A +t f W R @@ -223,7 +216,7 @@ b e b L -k +S h W i @@ -239,10 +232,10 @@ a L L L -c +W O J -j +W L L b diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_1.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_1.dmm index 51447e42663c9..c389af77150b2 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_1.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_1.dmm @@ -67,7 +67,6 @@ "M" = ( /obj/structure/table, /obj/item/flashlight/lamp, -/obj/machinery/light/small/directional/north, /turf/open/floor/iron/grimy, /area/ruin/space/djstation) "R" = ( diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_3.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_3.dmm index 266be91c8a4fc..956b5efe78749 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_3.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_3.dmm @@ -26,6 +26,12 @@ /obj/machinery/duct, /turf/open/floor/wood/tile, /area/ruin/space/djstation) +"g" = ( +/obj/structure/window/plasma/spawner/directional/south, +/obj/structure/table/wood, +/obj/effect/spawner/random/exotic/languagebook, +/turf/open/floor/carpet/purple, +/area/ruin/space/djstation) "h" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/effect/spawner/random/food_or_drink/booze{ @@ -38,6 +44,14 @@ "i" = ( /turf/closed/wall, /area/ruin/space/djstation) +"l" = ( +/obj/structure/window/plasma/spawner/directional/south, +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_y = 4 + }, +/turf/open/floor/carpet/purple, +/area/ruin/space/djstation) "p" = ( /obj/machinery/door/airlock/public/glass{ name = "Rest Room" @@ -48,10 +62,6 @@ /obj/machinery/shower/directional/east, /turf/open/floor/iron/freezer, /area/ruin/space/djstation) -"t" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/wood/tile, -/area/ruin/space/djstation) "u" = ( /obj/machinery/duct, /obj/machinery/door/airlock/silver{ @@ -59,14 +69,6 @@ }, /turf/open/floor/wood/tile, /area/ruin/space/djstation) -"v" = ( -/obj/structure/window/plasma/spawner/directional/south, -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - pixel_y = 4 - }, -/turf/open/floor/carpet/purple, -/area/ruin/space/djstation) "x" = ( /obj/effect/spawner/random/trash/soap{ spawn_scatter_radius = 1 @@ -116,11 +118,9 @@ }, /turf/open/floor/carpet/purple, /area/ruin/space/djstation) -"N" = ( -/obj/structure/window/plasma/spawner/directional/south, -/obj/structure/table/wood, -/obj/effect/spawner/random/exotic/languagebook, -/turf/open/floor/carpet/purple, +"S" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood/tile, /area/ruin/space/djstation) "T" = ( /obj/structure/dresser, @@ -212,7 +212,7 @@ a a J L -v +l f A i @@ -227,7 +227,7 @@ J D D f -t +S i X C @@ -238,7 +238,7 @@ a a J z -N +g T f U diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_1.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_1.dmm index 998c3f34c7552..534c49564cb16 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_1.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_1.dmm @@ -13,7 +13,7 @@ /turf/open/floor/iron, /area/ruin/space/djstation) "h" = ( -/obj/item/stack/tile/iron{ +/obj/item/stack/tile/iron/base{ pixel_x = -10; pixel_y = -6 }, @@ -42,7 +42,7 @@ /turf/open/floor/plating, /area/ruin/space/djstation) "r" = ( -/obj/item/stack/tile/iron{ +/obj/item/stack/tile/iron/base{ pixel_x = -7; pixel_y = 4 }, diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_2.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_2.dmm index f1ffa4b9ef3c7..3104b81b69ce6 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_2.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_2.dmm @@ -2,13 +2,6 @@ "a" = ( /turf/closed/wall, /area/ruin/space/djstation) -"b" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/djstation) "c" = ( /obj/structure/table/wood/poker, /obj/item/toy/cards/deck/cas{ @@ -30,20 +23,6 @@ dir = 1 }, /area/ruin/space/djstation) -"e" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/djstation) -"f" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/djstation) "g" = ( /obj/machinery/duct, /obj/effect/turf_decal/tile/green/half/contrasted{ @@ -64,6 +43,13 @@ }, /turf/open/floor/iron/dark, /area/ruin/space/djstation) +"l" = ( +/obj/structure/window/reinforced/tinted/spawner/directional/north, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/djstation) "m" = ( /obj/machinery/duct, /obj/modular_map_root/djstation{ @@ -100,6 +86,10 @@ /obj/structure/lattice, /turf/template_noop, /area/space/nearstation) +"t" = ( +/obj/machinery/light/floor, +/turf/open/floor/wood/parquet, +/area/ruin/space/djstation) "u" = ( /obj/item/radio/intercom{ dir = 8; @@ -169,6 +159,12 @@ }, /turf/open/floor/iron/dark/smooth_edge, /area/ruin/space/djstation) +"M" = ( +/obj/modular_map_connector, +/obj/effect/turf_decal/tile/green/half/contrasted, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/ruin/space/djstation) "N" = ( /obj/effect/turf_decal/tile/green/anticorner/contrasted{ dir = 1 @@ -219,17 +215,18 @@ /obj/structure/table/reinforced/plastitaniumglass, /turf/open/floor/iron/dark/smooth_large, /area/ruin/space/djstation) -"V" = ( -/obj/modular_map_connector, -/obj/effect/turf_decal/tile/green/half/contrasted, -/turf/open/floor/iron/dark, -/area/ruin/space/djstation) "W" = ( /turf/open/floor/wood/parquet, /area/ruin/space/djstation) -"X" = ( +"Y" = ( +/obj/structure/window/reinforced/tinted/spawner/directional/north, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/djstation) +"Z" = ( /obj/structure/cable, -/obj/machinery/light/directional/west, /obj/effect/turf_decal/tile/green/anticorner/contrasted{ dir = 8 }, @@ -268,25 +265,25 @@ v R c p -b +l r u F O -X +Z "} (4,1,1) = {" s o R y -W -f +t +Y I U q d -V +M "} (5,1,1) = {" s @@ -294,7 +291,7 @@ v R W W -e +x L u Q diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_3.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_3.dmm index c6804a107a342..74d8aed1229eb 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_3.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_3.dmm @@ -25,14 +25,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/iron/cafeteria, /area/ruin/space/djstation) -"s" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/djstation) -"u" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/djstation) "x" = ( /obj/structure/lattice, /turf/template_noop, @@ -52,11 +44,6 @@ /obj/machinery/duct, /turf/open/floor/iron/cafeteria, /area/ruin/space/djstation) -"G" = ( -/obj/structure/cable, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/djstation) "K" = ( /obj/machinery/duct, /obj/modular_map_root/djstation{ @@ -69,6 +56,7 @@ /area/template_noop) "N" = ( /obj/modular_map_connector, +/obj/machinery/light/directional/south, /turf/open/floor/iron/cafeteria, /area/ruin/space/djstation) "O" = ( @@ -87,11 +75,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{ @@ -105,6 +88,10 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/ruin/space/djstation) +"Z" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/djstation) (1,1,1) = {" y @@ -132,19 +119,19 @@ a y M W -u +h h O V g -G +g "} (4,1,1) = {" y M W h -h +Z Q z h @@ -154,12 +141,12 @@ N y M W -s +h h r V A -T +A "} (6,1,1) = {" y diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/solars_1.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/solars_1.dmm index 98c3d08508a9a..bbe74385cfa4e 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/solars_1.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/solars_1.dmm @@ -32,7 +32,7 @@ /area/ruin/space/djstation/solars) "t" = ( /obj/structure/lattice, -/obj/item/stack/tile/iron{ +/obj/item/stack/tile/iron/base{ pixel_x = 3; pixel_y = 4 }, diff --git a/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm b/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm index 588dc37d736be..136697eacc118 100644 --- a/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm +++ b/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm @@ -72,12 +72,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/abandonedzoo) -"aN" = ( -/obj/structure/table/reinforced, -/obj/item/folder, -/obj/item/gps/spaceruin, -/turf/open/floor/iron/dark/side, -/area/ruin/space/has_grav/abandonedzoo) "aP" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/cup/bottle/random_virus, @@ -111,17 +105,6 @@ }, /turf/open/floor/iron/dark/side, /area/ruin/space/has_grav/abandonedzoo) -"aZ" = ( -/obj/structure/table/reinforced, -/obj/item/cultivator, -/obj/item/shovel, -/turf/open/floor/iron/dark/side, -/area/ruin/space/has_grav/abandonedzoo) -"be" = ( -/obj/structure/frame/machine, -/obj/structure/cable, -/turf/open/floor/iron/dark/side, -/area/ruin/space/has_grav/abandonedzoo) "bf" = ( /obj/structure/cable, /obj/machinery/power/terminal{ @@ -157,11 +140,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/side, /area/ruin/space/has_grav/abandonedzoo) -"bn" = ( -/obj/structure/table/reinforced, -/obj/item/food/carrotfries, -/turf/open/floor/iron/dark/side, -/area/ruin/space/has_grav/abandonedzoo) "bp" = ( /obj/structure/bed{ dir = 4 @@ -225,7 +203,7 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/abandonedzoo) "bJ" = ( -/mob/living/simple_animal/crab{ +/mob/living/basic/crab{ faction = list("carp") }, /turf/open/floor/plating, @@ -250,22 +228,6 @@ /obj/structure/lattice, /turf/template_noop, /area/template_noop) -"bQ" = ( -/obj/structure/table/reinforced, -/obj/item/grenade/chem_grenade/antiweed{ - pixel_x = 3; - pixel_y = 5 - }, -/obj/item/grenade/chem_grenade/antiweed{ - pixel_x = 4 - }, -/obj/item/grenade/chem_grenade/antiweed{ - pixel_x = -3; - pixel_y = -1 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/side, -/area/ruin/space/has_grav/abandonedzoo) "bR" = ( /obj/structure/disposalpipe/trunk{ dir = 1 @@ -291,13 +253,28 @@ "bX" = ( /turf/open/floor/plating/airless, /area/ruin/space/has_grav/abandonedzoo) +"cf" = ( +/obj/structure/frame/machine, +/obj/structure/cable, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark/side, +/area/ruin/space/has_grav/abandonedzoo) "eY" = ( /obj/structure/reagent_dispensers/watertank, /obj/effect/turf_decal/tile/green/fourcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/abandonedzoo) +"fn" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/syringes{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/storage/box/beakers, +/turf/open/floor/iron/dark/side, +/area/ruin/space/has_grav/abandonedzoo) "gE" = ( -/mob/living/simple_animal/hostile/bee, +/mob/living/basic/bee, /turf/open/floor/grass, /area/ruin/space/has_grav/abandonedzoo) "ib" = ( @@ -339,26 +316,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/abandonedzoo) -"kF" = ( -/obj/machinery/space_heater, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark/side, -/area/ruin/space/has_grav/abandonedzoo) "ly" = ( /obj/machinery/power/shieldwallgen/unlocked, /turf/template_noop, /area/template_noop) -"mY" = ( -/obj/structure/alien/weeds/node, -/obj/machinery/light/directional/north, +"nI" = ( +/obj/structure/alien/resin/wall, +/obj/machinery/light/floor/broken, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/abandonedzoo) "nY" = ( /obj/structure/flora/bush/leavy/style_random, -/mob/living/simple_animal/hostile/bee, +/mob/living/basic/bee, /turf/open/floor/grass, /area/ruin/space/has_grav/abandonedzoo) "oS" = ( @@ -366,27 +335,36 @@ /obj/effect/turf_decal/tile/green/fourcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/abandonedzoo) +"py" = ( +/mob/living/basic/carp, +/turf/open/floor/plating, +/area/ruin/space/has_grav/abandonedzoo) "qX" = ( /obj/machinery/power/shieldwallgen/unlocked/anchored, /obj/structure/cable, /turf/open/floor/plating, /area/ruin/space/has_grav/abandonedzoo) -"sT" = ( -/obj/structure/cable, -/obj/machinery/power/shieldwallgen/unlocked/anchored, -/turf/open/floor/plating, +"rb" = ( +/obj/machinery/space_heater, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/dark/side, /area/ruin/space/has_grav/abandonedzoo) -"uA" = ( +"sb" = ( /obj/structure/rack, -/obj/item/crowbar, -/obj/item/shield/riot, -/obj/machinery/light/directional/north, +/obj/effect/spawner/random/maintenance, +/obj/structure/cable, +/obj/machinery/power/apc/worn_out/directional/west{ + environ = 0; + lighting = 0 + }, +/obj/item/melee/baton/security/cattleprod, +/obj/effect/mapping_helpers/apc/unlocked, /turf/open/floor/iron/dark/side, /area/ruin/space/has_grav/abandonedzoo) "vU" = ( -/mob/living/simple_animal/hostile/asteroid/goldgrub{ - will_burrow = 0 - }, +/mob/living/basic/mining/goldgrub, /turf/open/misc/asteroid, /area/ruin/space/has_grav/abandonedzoo) "wc" = ( @@ -399,14 +377,30 @@ /obj/structure/flora/rock/style_random, /turf/open/misc/asteroid, /area/ruin/space/has_grav/abandonedzoo) -"Ct" = ( +"Bh" = ( +/obj/structure/cable, +/obj/machinery/power/smes/engineering, +/turf/open/floor/iron/dark/side, +/area/ruin/space/has_grav/abandonedzoo) +"Bt" = ( /obj/structure/table/reinforced, -/obj/item/storage/box/syringes{ - pixel_x = 5; - pixel_y = 5 +/obj/item/folder, +/obj/item/gps/spaceruin, +/obj/structure/disposalpipe/segment{ + dir = 9 }, -/obj/item/storage/box/beakers, -/obj/machinery/light/directional/east, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark/side, +/area/ruin/space/has_grav/abandonedzoo) +"Ep" = ( +/obj/structure/table/reinforced, +/obj/item/surgicaldrill, +/obj/item/hemostat, +/obj/item/scalpel, +/obj/item/surgical_drapes, +/obj/item/retractor, +/obj/item/cautery, +/obj/item/circular_saw, /turf/open/floor/iron/dark/side, /area/ruin/space/has_grav/abandonedzoo) "Gh" = ( @@ -414,36 +408,32 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/abandonedzoo) -"GX" = ( -/obj/machinery/light/directional/south, -/obj/structure/cable, -/obj/machinery/power/smes/engineering, +"HI" = ( +/obj/structure/table/reinforced, +/obj/item/food/carrotfries, +/obj/machinery/light/directional/east, /turf/open/floor/iron/dark/side, /area/ruin/space/has_grav/abandonedzoo) -"Ig" = ( -/obj/machinery/light/directional/north, -/mob/living/basic/carp, -/turf/open/floor/plating, +"JW" = ( +/obj/structure/table/reinforced, +/obj/item/cultivator, +/obj/item/shovel, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark/side, /area/ruin/space/has_grav/abandonedzoo) -"LD" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, +"KR" = ( /obj/structure/cable, -/obj/machinery/power/apc/worn_out/directional/west{ - environ = 0; - lighting = 0 - }, -/obj/item/melee/baton/security/cattleprod, -/obj/effect/mapping_helpers/apc/unlocked, -/turf/open/floor/iron/dark/side, +/obj/machinery/power/shieldwallgen/unlocked/anchored, +/obj/machinery/light/broken/directional/north, +/turf/open/floor/plating, /area/ruin/space/has_grav/abandonedzoo) "Mb" = ( -/mob/living/simple_animal/hostile/bee, -/mob/living/simple_animal/hostile/bee, -/mob/living/simple_animal/hostile/bee, -/mob/living/simple_animal/hostile/bee, -/mob/living/simple_animal/hostile/bee, -/mob/living/simple_animal/hostile/bee, +/mob/living/basic/bee, +/mob/living/basic/bee, +/mob/living/basic/bee, +/mob/living/basic/bee, +/mob/living/basic/bee, +/mob/living/basic/bee, /turf/open/floor/grass, /area/ruin/space/has_grav/abandonedzoo) "Ng" = ( @@ -455,18 +445,13 @@ /obj/effect/turf_decal/tile/green/fourcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/abandonedzoo) -"OR" = ( -/obj/structure/table/reinforced, -/obj/item/clipboard, -/obj/item/clothing/mask/surgical, -/obj/item/razor, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark/side, +"Qz" = ( +/obj/structure/alien/weeds/node, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav/abandonedzoo) -"PF" = ( -/obj/machinery/light/directional/south, -/mob/living/simple_animal/hostile/bee, -/mob/living/simple_animal/hostile/bee, +"Rc" = ( +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/machinery/light/floor, /turf/open/floor/grass, /area/ruin/space/has_grav/abandonedzoo) "Rh" = ( @@ -479,10 +464,25 @@ /obj/effect/turf_decal/tile/green/fourcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/abandonedzoo) -"RD" = ( -/obj/structure/flora/rock/style_random, -/obj/machinery/light/directional/south, -/turf/open/misc/asteroid, +"Rz" = ( +/mob/living/basic/bee, +/mob/living/basic/bee, +/turf/open/floor/grass, +/area/ruin/space/has_grav/abandonedzoo) +"RR" = ( +/obj/structure/table/reinforced, +/obj/item/grenade/chem_grenade/antiweed{ + pixel_x = 3; + pixel_y = 5 + }, +/obj/item/grenade/chem_grenade/antiweed{ + pixel_x = 4 + }, +/obj/item/grenade/chem_grenade/antiweed{ + pixel_x = -3; + pixel_y = -1 + }, +/turf/open/floor/iron/dark/side, /area/ruin/space/has_grav/abandonedzoo) "Ti" = ( /obj/machinery/door/airlock/hatch{ @@ -491,6 +491,12 @@ /obj/effect/turf_decal/tile/green/fourcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/abandonedzoo) +"TQ" = ( +/obj/structure/rack, +/obj/item/crowbar, +/obj/item/shield/riot, +/turf/open/floor/iron/dark/side, +/area/ruin/space/has_grav/abandonedzoo) "Ua" = ( /turf/open/misc/asteroid, /area/ruin/space/has_grav/abandonedzoo) @@ -500,8 +506,19 @@ /obj/effect/turf_decal/tile/green/fourcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/abandonedzoo) +"Vq" = ( +/obj/structure/table/reinforced, +/obj/item/clipboard, +/obj/item/clothing/mask/surgical, +/obj/item/razor, +/turf/open/floor/iron/dark/side, +/area/ruin/space/has_grav/abandonedzoo) "WV" = ( -/mob/living/simple_animal/hostile/asteroid/basilisk, +/mob/living/basic/mining/basilisk, +/turf/open/misc/asteroid, +/area/ruin/space/has_grav/abandonedzoo) +"Xl" = ( +/obj/machinery/light/floor, /turf/open/misc/asteroid, /area/ruin/space/has_grav/abandonedzoo) "Xx" = ( @@ -515,17 +532,9 @@ /obj/effect/turf_decal/tile/green/fourcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/abandonedzoo) -"ZP" = ( -/obj/structure/table/reinforced, -/obj/item/surgicaldrill, -/obj/item/hemostat, -/obj/item/scalpel, -/obj/item/surgical_drapes, -/obj/item/retractor, -/obj/item/cautery, -/obj/item/circular_saw, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark/side, +"Zq" = ( +/obj/machinery/light/floor, +/turf/open/floor/plating, /area/ruin/space/has_grav/abandonedzoo) (1,1,1) = {" @@ -595,8 +604,8 @@ aa ac Ua ah -Ua -RD +Xl +Ap ac at at @@ -605,8 +614,8 @@ iX at at ac -Ig -bv +py +Zq bv bv ac @@ -620,10 +629,10 @@ WV Xx ac at -LD +sb oS Ni -be +cf at ac bx @@ -662,10 +671,10 @@ at at at at -uA +TQ oS Ni -GX +Bh at at by @@ -680,16 +689,16 @@ aa aa aa ag -OR +Vq aG -aN +Bt aV oS oS bh bm bp -kF +rb at at at @@ -743,14 +752,14 @@ aa aa aa ag -Ct +fn aI aP aW oS Ni bi -bn +HI br bA at @@ -767,10 +776,10 @@ at at at at -bQ +RR oS Ni -ZP +Ep at at at @@ -793,7 +802,7 @@ oS Ni bk at -sT +KR ac ac ac @@ -809,7 +818,7 @@ gE aA ac at -aZ +JW oS Ni bl @@ -826,8 +835,8 @@ aa ac Mb Mb -ao -PF +Rc +Rz ac at at @@ -836,8 +845,8 @@ Ti at at ac -mY -bH +Qz +nI bH bB bT diff --git a/_maps/RandomRuins/SpaceRuins/allamericandiner.dmm b/_maps/RandomRuins/SpaceRuins/allamericandiner.dmm index 0bbc2a5331e2d..4cdeea3c327b3 100644 --- a/_maps/RandomRuins/SpaceRuins/allamericandiner.dmm +++ b/_maps/RandomRuins/SpaceRuins/allamericandiner.dmm @@ -2,29 +2,14 @@ "aa" = ( /obj/structure/lattice/catwalk, /obj/structure/marker_beacon/teal, -/turf/open/space/basic, +/turf/template_noop, /area/ruin/space) -"ak" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/sink/kitchen/directional/east, -/obj/machinery/light/dim/directional/west, -/turf/open/floor/iron/freezer, -/area/ruin/space/has_grav/allamericandiner) "aA" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 4 }, /turf/open/floor/iron, /area/ruin/space/has_grav/allamericandiner) -"br" = ( -/obj/structure/chair/sofa/right/maroon, -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/obj/machinery/light/dim/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/kitchen, -/area/ruin/space/has_grav/allamericandiner) "bA" = ( /obj/machinery/power/rtg/advanced, /obj/structure/cable, @@ -47,28 +32,12 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/allamericandiner) -"cn" = ( -/obj/structure/chair/sofa/left/maroon{ - dir = 1 - }, -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/turf/open/floor/iron/kitchen, -/area/ruin/space/has_grav/allamericandiner) "cQ" = ( /obj/effect/turf_decal/bot, /obj/structure/reagent_dispensers/watertank, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/ruin/space/has_grav/allamericandiner) -"cT" = ( -/obj/structure/chair/sofa/right/maroon{ - dir = 4 - }, -/obj/structure/window/reinforced/tinted/spawner/directional/west, -/obj/machinery/light/dim/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/kitchen, -/area/ruin/space/has_grav/allamericandiner) "db" = ( /obj/structure/chair/sofa/right/maroon{ dir = 1 @@ -112,17 +81,6 @@ /obj/structure/filingcabinet, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/allamericandiner) -"et" = ( -/obj/machinery/shower/directional/east, -/obj/structure/fluff{ - desc = "What, you think the water just magically soaks into the metallic flooring?"; - icon = 'icons/obj/lavaland/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, -/obj/item/soap, -/turf/open/floor/iron/freezer, -/area/ruin/space/has_grav/allamericandiner) "eM" = ( /obj/machinery/door/airlock{ name = "Bathrooms" @@ -136,6 +94,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/has_grav/allamericandiner) +"eR" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/suit_storage_unit/open, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/ruin/space/has_grav/allamericandiner) "fu" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line, /obj/structure/chair/stool/directional{ @@ -191,10 +155,6 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/allamericandiner) -"gI" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/ruin/space/has_grav/allamericandiner) "gO" = ( /obj/structure/chair/sofa/middle/brown{ dir = 1 @@ -205,21 +165,20 @@ /obj/structure/marker_beacon/burgundy, /turf/open/misc/asteroid/airless, /area/ruin/space) -"hT" = ( -/obj/structure/chair/sofa/left/maroon{ - dir = 1 +"hU" = ( +/obj/structure/chair/sofa/right/maroon{ + dir = 4 }, -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/machinery/light/dim/directional/west, -/obj/effect/decal/cleanable/dirt, +/obj/structure/window/reinforced/tinted/spawner/directional/west, +/obj/machinery/light/dim/directional/south, /turf/open/floor/iron/kitchen, /area/ruin/space/has_grav/allamericandiner) -"hU" = ( +"iS" = ( /obj/structure/chair/sofa/right/maroon{ dir = 4 }, /obj/structure/window/reinforced/tinted/spawner/directional/west, -/obj/machinery/light/dim/directional/south, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/kitchen, /area/ruin/space/has_grav/allamericandiner) "jl" = ( @@ -236,6 +195,12 @@ "jZ" = ( /turf/open/floor/iron/kitchen/small, /area/ruin/space/has_grav/allamericandiner) +"kj" = ( +/obj/structure/kitchenspike, +/obj/effect/turf_decal/bot, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/freezer, +/area/ruin/space/has_grav/allamericandiner) "kL" = ( /obj/structure/table, /turf/open/floor/iron/kitchen/small, @@ -247,6 +212,11 @@ /obj/machinery/computer/security/telescreen/entertainment/directional/north, /turf/open/floor/iron, /area/ruin/space/has_grav/allamericandiner) +"ls" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/freezer, +/area/ruin/space/has_grav/allamericandiner) "lF" = ( /obj/machinery/chem_master/condimaster{ name = "CondiMaster Neo" @@ -259,6 +229,14 @@ }, /turf/open/floor/iron/kitchen, /area/ruin/space/has_grav/allamericandiner) +"mK" = ( +/obj/structure/chair/sofa/left/maroon{ + dir = 1 + }, +/obj/structure/window/reinforced/tinted/spawner/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/allamericandiner) "na" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 6 @@ -266,6 +244,17 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/ruin/space/has_grav/allamericandiner) +"nq" = ( +/obj/machinery/shower/directional/east, +/obj/structure/fluff{ + desc = "What, you think the water just magically soaks into the metallic flooring?"; + icon = 'icons/obj/mining_zones/survival_pod.dmi'; + icon_state = "fan_tiny"; + name = "shower drain" + }, +/obj/item/soap, +/turf/open/floor/iron/freezer, +/area/ruin/space/has_grav/allamericandiner) "nr" = ( /obj/structure/table/wood, /obj/item/paper_bin{ @@ -281,21 +270,13 @@ /area/ruin/space/has_grav/allamericandiner) "nv" = ( /obj/structure/lattice, -/turf/open/space/basic, +/turf/template_noop, /area/ruin/space) "ny" = ( /obj/machinery/oven, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/kitchen/small, /area/ruin/space/has_grav/allamericandiner) -"nD" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/sink/kitchen/directional/west, -/obj/machinery/light/dim/directional/east, -/turf/open/floor/iron/freezer, -/area/ruin/space/has_grav/allamericandiner) "nM" = ( /obj/structure/table/reinforced, /obj/structure/desk_bell{ @@ -329,6 +310,12 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/allamericandiner) +"oj" = ( +/obj/structure/chair/sofa/right/maroon, +/obj/structure/window/reinforced/tinted/spawner/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/allamericandiner) "oN" = ( /turf/closed/mineral/random/low_chance, /area/ruin/space) @@ -443,6 +430,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/has_grav/allamericandiner) +"uy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/sink/kitchen/directional/west, +/turf/open/floor/iron/freezer, +/area/ruin/space/has_grav/allamericandiner) "uP" = ( /obj/structure/kitchenspike, /obj/effect/turf_decal/bot, @@ -490,12 +484,6 @@ /obj/item/chair/plastic, /turf/open/misc/asteroid/airless, /area/ruin/space) -"wD" = ( -/obj/machinery/deepfryer, -/obj/machinery/light/dim/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/kitchen/small, -/area/ruin/space/has_grav/allamericandiner) "wI" = ( /obj/structure/table/reinforced, /obj/effect/decal/cleanable/dirt, @@ -528,11 +516,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/kitchen, /area/ruin/space/has_grav/allamericandiner) -"yq" = ( -/obj/machinery/griddle, -/obj/machinery/light/dim/directional/north, -/turf/open/floor/iron/kitchen/small, -/area/ruin/space/has_grav/allamericandiner) "yB" = ( /obj/machinery/door/airlock/command, /obj/effect/mapping_helpers/airlock/access/all/away/general, @@ -562,6 +545,18 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/allamericandiner) +"zw" = ( +/obj/machinery/vending/dinnerware, +/obj/machinery/light/dim/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/kitchen/small, +/area/ruin/space/has_grav/allamericandiner) +"zM" = ( +/obj/effect/turf_decal/trimline/dark_green/filled/line, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/ruin/space/has_grav/allamericandiner) "zN" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 10 @@ -577,6 +572,13 @@ }, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/allamericandiner) +"Ao" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/sink/kitchen/directional/east, +/turf/open/floor/iron/freezer, +/area/ruin/space/has_grav/allamericandiner) "Ap" = ( /obj/structure/chair/sofa/right/maroon{ dir = 8 @@ -584,6 +586,14 @@ /obj/structure/window/reinforced/tinted/spawner/directional/east, /turf/open/floor/iron/kitchen, /area/ruin/space/has_grav/allamericandiner) +"Bg" = ( +/obj/machinery/light/dim/directional/west, +/obj/structure/chair/sofa/left/maroon{ + dir = 1 + }, +/obj/structure/window/reinforced/tinted/spawner/directional/south, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/allamericandiner) "Bl" = ( /obj/structure/closet/secure_closet/freezer/meat/open, /obj/effect/turf_decal/bot, @@ -596,19 +606,27 @@ "Bn" = ( /turf/open/misc/asteroid/airless, /area/ruin/space) -"BZ" = ( -/obj/structure/chair/sofa/left/maroon{ - dir = 8 - }, -/obj/structure/window/reinforced/tinted/spawner/directional/east, -/obj/machinery/light/dim/directional/south, -/turf/open/floor/iron/kitchen, -/area/ruin/space/has_grav/allamericandiner) "Cr" = ( /obj/structure/table/reinforced, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/kitchen/small, /area/ruin/space/has_grav/allamericandiner) +"CC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/freezer, +/area/ruin/space/has_grav/allamericandiner) +"CF" = ( +/obj/machinery/shower/directional/west, +/obj/structure/fluff{ + desc = "What, you think the water just magically soaks into the metallic flooring?"; + icon = 'icons/obj/mining_zones/survival_pod.dmi'; + icon_state = "fan_tiny"; + name = "shower drain" + }, +/obj/item/soap, +/turf/open/floor/iron/freezer, +/area/ruin/space/has_grav/allamericandiner) "Du" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/condiment/peppermill{ @@ -651,12 +669,6 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/allamericandiner) -"Ey" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/suit_storage_unit/open, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron, -/area/ruin/space/has_grav/allamericandiner) "EK" = ( /turf/closed/wall, /area/ruin/space/has_grav/allamericandiner) @@ -749,17 +761,6 @@ /obj/structure/sign/poster/official/cleanliness/directional/east, /turf/open/floor/plating, /area/ruin/space/has_grav/allamericandiner) -"Hp" = ( -/obj/machinery/shower/directional/west, -/obj/structure/fluff{ - desc = "What, you think the water just magically soaks into the metallic flooring?"; - icon = 'icons/obj/lavaland/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, -/obj/item/soap, -/turf/open/floor/iron/freezer, -/area/ruin/space/has_grav/allamericandiner) "Hz" = ( /obj/structure/closet/secure_closet/freezer/meat/open, /obj/item/food/meat/slab/monkey, @@ -823,11 +824,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/kitchen/small, /area/ruin/space/has_grav/allamericandiner) -"Iz" = ( -/obj/machinery/vending/dinnerware, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/kitchen/small, -/area/ruin/space/has_grav/allamericandiner) "IY" = ( /obj/structure/table/wood, /obj/item/paper_bin, @@ -838,6 +834,10 @@ /obj/machinery/griddle, /turf/open/floor/iron/kitchen/small, /area/ruin/space/has_grav/allamericandiner) +"JC" = ( +/obj/machinery/light/small/directional/south, +/turf/open/misc/asteroid/airless, +/area/ruin/space) "JD" = ( /obj/structure/chair/sofa/left/maroon{ dir = 4 @@ -914,11 +914,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/ruin/space/has_grav/allamericandiner) +"Mt" = ( +/turf/open/floor/plating, +/area/ruin/space/has_grav/allamericandiner) "MJ" = ( /obj/structure/urinal/directional/north, /obj/effect/turf_decal/bot, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/allamericandiner) +"MQ" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/suit_storage_unit/open, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/ruin/space/has_grav/allamericandiner) "MS" = ( /obj/structure/table/wood, /obj/item/reagent_containers/cup/glass/bottle/beer{ @@ -949,18 +958,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/kitchen/small, /area/ruin/space/has_grav/allamericandiner) -"NF" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/ruin/space/has_grav/allamericandiner) "NH" = ( /obj/machinery/grill, /turf/open/floor/iron/kitchen/small, /area/ruin/space/has_grav/allamericandiner) -"NR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/east, -/turf/open/floor/iron/freezer, +"Ot" = ( +/obj/machinery/light/dim/directional/south, +/obj/structure/window/reinforced/tinted/spawner/directional/east, +/obj/structure/chair/sofa/left/maroon{ + dir = 8 + }, +/turf/open/floor/iron/kitchen, /area/ruin/space/has_grav/allamericandiner) "OE" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line, @@ -1038,11 +1046,6 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/allamericandiner) -"Sn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/west, -/turf/open/floor/iron/freezer, -/area/ruin/space/has_grav/allamericandiner) "ST" = ( /obj/structure/sink/directional/west, /obj/structure/mirror/directional/east, @@ -1050,7 +1053,7 @@ /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/allamericandiner) "SU" = ( -/turf/open/space/basic, +/turf/template_noop, /area/template_noop) "SZ" = ( /obj/effect/decal/cleanable/dirt, @@ -1125,14 +1128,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/allamericandiner) -"Un" = ( -/obj/effect/turf_decal/trimline/dark_green/filled/line{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/ruin/space/has_grav/allamericandiner) "Uv" = ( /obj/structure/toilet{ dir = 8 @@ -1175,13 +1170,6 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/ruin/space/has_grav/allamericandiner) -"Wn" = ( -/obj/effect/turf_decal/trimline/dark_green/filled/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/ruin/space/has_grav/allamericandiner) "WC" = ( /obj/machinery/gibber{ pixel_y = -2 @@ -1211,6 +1199,11 @@ }, /turf/open/misc/asteroid/airless, /area/ruin/space) +"Xj" = ( +/obj/machinery/deepfryer, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/kitchen/small, +/area/ruin/space/has_grav/allamericandiner) "Xs" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/trimline/dark_green/filled/line{ @@ -1231,7 +1224,7 @@ "Yd" = ( /obj/structure/lattice/catwalk, /obj/structure/marker_beacon/fuchsia, -/turf/open/space/basic, +/turf/template_noop, /area/ruin/space) "Yo" = ( /obj/structure/table/wood, @@ -1432,10 +1425,10 @@ oN EK DQ yl -hT -br +mK +oj fL -cn +Bg vp Ph Pn @@ -1512,7 +1505,7 @@ PW PW PW Zk -BZ +ET EK SU SU @@ -1549,7 +1542,7 @@ GE rd PW JD -cT +iS EK SU SU @@ -1623,7 +1616,7 @@ Xw FB PW Ap -ET +Ot EK EK EK @@ -1662,7 +1655,7 @@ rd Id FP xa -Ey +MQ EK EK EK @@ -1689,7 +1682,7 @@ oN oN oN EK -yq +Jw Fr ny Fr @@ -1701,7 +1694,7 @@ yY Ud Ud Tv -NF +Mt vu SU SU @@ -1738,7 +1731,7 @@ DU DU DU Tv -gI +Mt vu SU SU @@ -1759,7 +1752,7 @@ oN oN EK Hz -ak +Ao KT GX EK @@ -1773,7 +1766,7 @@ rd gB XE xa -Ey +eR EK EK EK @@ -1808,7 +1801,7 @@ nM rG rd gl -GU +hU EK EK EK @@ -1837,7 +1830,7 @@ Al UM ZS EK -Iz +zw jZ Qn Fr @@ -1869,7 +1862,7 @@ oN oN oN EK -uP +kj Al Kp WC @@ -1882,7 +1875,7 @@ Cr rG PW Zk -BZ +ET EK SU SU @@ -1911,7 +1904,7 @@ Al rV ZS EK -wD +Xj Fr NH Fr @@ -1919,7 +1912,7 @@ ug rG rd gl -hU +GU EK SU SU @@ -1981,7 +1974,7 @@ oN oN EK fV -nD +uy KT GX EK @@ -2059,12 +2052,12 @@ HB Go EK ue -Un +eN eN zN EK MJ -Sn +ls YX EK qY @@ -2073,9 +2066,9 @@ dY EK oN Bn -gU -gU -gU +Bn +Bn +Bn SU SU SU @@ -2106,13 +2099,13 @@ Kp jx Kp Lp -Hp +CF EK oN oN gU Ie -gU +Bn Bn SU SU @@ -2147,11 +2140,11 @@ EK EK oN oN -gU Bn gU Bn Bn +Bn SU SU SU @@ -2180,13 +2173,13 @@ YX Im YX bE -et +nq EK oN oN gU Bn -gU +Bn Bn Bn SU @@ -2209,10 +2202,10 @@ EK ck WS WS -Dv +zM EK MJ -NR +CC Kp EK ST @@ -2222,8 +2215,8 @@ EK oN oN oN -gU -gU +Bn +Bn Bn Bn Bn @@ -2352,10 +2345,10 @@ Bn Ty JH Bn -Bn +JC EK Vy -Wn +aA aA na EK diff --git a/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm b/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm index 4bdb7026e28a4..e3015469bcea4 100644 --- a/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm +++ b/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm @@ -15,16 +15,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/lava/plasma/ice_moon, /area/misc/anomaly_research) -"aP" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/misc/anomaly_research) "aX" = ( /obj/machinery/light/broken/directional/north, /obj/effect/turf_decal/tile/purple/opposingcorners, @@ -32,15 +22,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/misc/anomaly_research) +"ba" = ( +/obj/structure/reagent_dispensers/plumbed, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plating, +/area/misc/anomaly_research) "bB" = ( /obj/effect/spawner/structure/window, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/misc/anomaly_research) -"bG" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, +/turf/open/floor/plating, /area/misc/anomaly_research) "bP" = ( /obj/structure/table/wood, @@ -62,20 +54,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/smooth, /area/misc/anomaly_research) -"cA" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/iron/white, -/area/misc/anomaly_research) "cD" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/smooth, /area/misc/anomaly_research) -"cF" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/window/plasma/spawner/directional/south, -/turf/open/floor/iron/smooth, -/area/misc/anomaly_research) "cK" = ( /obj/structure/table/wood, /obj/machinery/microwave, @@ -92,6 +75,13 @@ /obj/effect/spawner/random/environmentally_safe_anomaly, /turf/open/lava/plasma/ice_moon, /area/misc/anomaly_research) +"ds" = ( +/obj/machinery/duct, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/freezer, +/area/misc/anomaly_research) "dy" = ( /obj/effect/turf_decal/tile/purple/half/contrasted, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -99,26 +89,24 @@ }, /turf/open/floor/iron/white, /area/misc/anomaly_research) -"dz" = ( -/turf/open/space/basic, -/area/misc/anomaly_research) "dD" = ( /obj/structure/lattice/catwalk, /obj/effect/spawner/random/environmentally_safe_anomaly, /turf/open/lava/plasma/ice_moon, /area/misc/anomaly_research) -"dU" = ( -/obj/structure/rack, -/obj/item/clothing/head/collectable/welding, -/obj/item/weldingtool/largetank, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/misc/anomaly_research) "eq" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/table, /turf/open/floor/iron/white, /area/misc/anomaly_research) +"ev" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/wood, +/area/misc/anomaly_research) "eA" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -129,10 +117,14 @@ /obj/structure/flora/tree/stump, /turf/open/misc/asteroid/snow/icemoon, /area/misc/anomaly_research) -"eO" = ( -/obj/effect/spawner/random/structure/closet_private, +"eT" = ( +/obj/effect/turf_decal/siding/purple{ + dir = 6 + }, +/obj/structure/table/reinforced, +/obj/item/reactive_armour_shell, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, +/turf/open/floor/iron/dark, /area/misc/anomaly_research) "eU" = ( /obj/effect/turf_decal/siding/wood{ @@ -142,15 +134,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/misc/anomaly_research) -"eZ" = ( -/obj/structure/fireplace{ - pixel_x = -32 - }, -/obj/item/kirbyplants/random/fullysynthetic{ - pixel_x = 10; - pixel_y = 19 - }, -/turf/open/floor/wood, +"eW" = ( +/obj/effect/decal/cleanable/oil/slippery, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/white, /area/misc/anomaly_research) "fc" = ( /obj/effect/turf_decal/stripes/corner{ @@ -167,53 +155,32 @@ }, /turf/open/floor/iron/smooth, /area/misc/anomaly_research) -"fm" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 5 - }, -/obj/structure/table/reinforced, -/obj/item/anomaly_neutralizer, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/misc/anomaly_research) -"ft" = ( +"fe" = ( /obj/effect/turf_decal/trimline/purple/line, -/obj/effect/decal/cleanable/oil/slippery, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron/white, /area/misc/anomaly_research) -"fw" = ( -/obj/machinery/suit_storage_unit, -/turf/open/floor/iron/smooth, -/area/misc/anomaly_research) -"fO" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/iron/white, -/area/misc/anomaly_research) -"gg" = ( -/obj/effect/spawner/random/trash/botanical_waste, +"fv" = ( +/obj/machinery/duct, +/obj/structure/rack, +/obj/item/reagent_containers/cup/bottle/iron{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = 1 + }, +/obj/item/reagent_containers/cup/bottle/acidic_buffer{ + pixel_x = 7; + pixel_y = 3 + }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/misc/anomaly_research) -"gi" = ( -/obj/structure/table/wood, -/obj/machinery/light/warm/no_nightlight/directional/north, -/turf/open/floor/wood, -/area/misc/anomaly_research) -"gr" = ( -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 1 - }, -/obj/structure/table/reinforced, -/obj/item/anomaly_neutralizer, -/obj/item/anomaly_neutralizer, -/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/white, +"fw" = ( +/obj/machinery/suit_storage_unit, +/turf/open/floor/iron/smooth, /area/misc/anomaly_research) "gs" = ( /obj/structure/lattice/catwalk, @@ -222,12 +189,21 @@ }, /turf/open/lava/plasma/ice_moon, /area/misc/anomaly_research) -"gA" = ( -/obj/effect/decal/cleanable/oil/slippery, +"gB" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 8 + }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/misc/anomaly_research) +"gF" = ( +/obj/effect/spawner/random/trash/box, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/misc/anomaly_research) "gN" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 1 @@ -237,10 +213,6 @@ }, /turf/open/floor/iron/white, /area/misc/anomaly_research) -"hh" = ( -/obj/effect/spawner/structure/window/plasma, -/turf/open/floor/wood, -/area/misc/anomaly_research) "hl" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -260,6 +232,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/misc/anomaly_research) +"hK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/window/plasma/spawner/directional/south, +/turf/open/floor/iron/smooth, +/area/misc/anomaly_research) +"hU" = ( +/obj/effect/turf_decal/siding/purple{ + dir = 1 + }, +/obj/structure/chair/office, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/misc/anomaly_research) "hV" = ( /obj/structure/flora/grass/green/style_random, /obj/structure/flora/grass/green/style_random, @@ -273,8 +260,7 @@ /area/misc/anomaly_research) "ii" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/iron/white, +/turf/open/floor/plating, /area/misc/anomaly_research) "ip" = ( /obj/effect/turf_decal/tile/neutral{ @@ -287,6 +273,14 @@ /obj/item/computer_disk/ordnance, /turf/open/floor/iron/dark, /area/misc/anomaly_research) +"iq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/misc/anomaly_research) "it" = ( /obj/machinery/shower/directional/east, /obj/effect/spawner/random/trash/soap, @@ -301,20 +295,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/misc/anomaly_research) -"iw" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/misc/anomaly_research) "iC" = ( /obj/machinery/door/airlock/external, /turf/open/floor/iron/smooth, /area/misc/anomaly_research) +"iK" = ( +/obj/effect/turf_decal/siding/purple{ + dir = 9 + }, +/obj/machinery/monkey_recycler, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/misc/anomaly_research) "iP" = ( /obj/effect/turf_decal/tile/purple/anticorner/contrasted, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -326,36 +318,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall, /area/misc/anomaly_research) -"jl" = ( -/obj/effect/turf_decal/tile/purple/half/contrasted, -/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/white, -/area/misc/anomaly_research) "jt" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 }, /turf/open/floor/iron/smooth, /area/misc/anomaly_research) -"jE" = ( -/obj/machinery/duct, -/obj/structure/rack, -/obj/item/reagent_containers/cup/bottle/ethanol{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/chlorine{ - pixel_x = 1 - }, -/obj/item/reagent_containers/cup/bottle/carbon{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/misc/anomaly_research) "jN" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -365,6 +333,15 @@ }, /turf/open/floor/iron/smooth, /area/misc/anomaly_research) +"ki" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plating, +/area/misc/anomaly_research) "kj" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -376,6 +353,18 @@ /obj/effect/spawner/random/environmentally_safe_anomaly/immobile, /turf/template_noop, /area/space) +"kt" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/anomaly_neutralizer, +/obj/item/anomaly_neutralizer, +/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/white, +/area/misc/anomaly_research) "kw" = ( /obj/effect/turf_decal/siding/purple{ dir = 1 @@ -383,18 +372,20 @@ /obj/machinery/light/warm/no_nightlight/directional/north, /turf/open/floor/iron/dark, /area/misc/anomaly_research) +"kY" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/misc/anomaly_research) "lo" = ( /obj/machinery/duct, /turf/open/floor/iron/freezer, /area/misc/anomaly_research) -"lx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/misc/anomaly_research) "lz" = ( /obj/effect/turf_decal/tile/purple/anticorner/contrasted, /obj/item/kirbyplants/random, @@ -430,19 +421,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/misc/anomaly_research) -"mb" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/computer/rdconsole{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/misc/anomaly_research) "mk" = ( /obj/structure/table/wood, /obj/item/paper/fluff/ruins/anomaly_research/intro, @@ -453,18 +431,13 @@ /obj/effect/turf_decal/tile/yellow/anticorner/contrasted, /turf/open/floor/iron/white, /area/misc/anomaly_research) -"my" = ( -/obj/effect/turf_decal/tile/neutral{ +"mC" = ( +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ dir = 8 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/office, /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/dark, +/turf/open/floor/iron/white, /area/misc/anomaly_research) "mE" = ( /obj/effect/turf_decal/stripes/line{ @@ -480,16 +453,14 @@ /obj/machinery/light/warm/no_nightlight/directional/north, /turf/open/floor/iron/smooth, /area/misc/anomaly_research) -"mY" = ( -/obj/machinery/light/warm/no_nightlight/directional/north, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 1 +"mZ" = ( +/obj/effect/turf_decal/siding/purple{ + dir = 5 }, +/obj/structure/table/reinforced, +/obj/item/anomaly_neutralizer, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/white, +/turf/open/floor/iron/dark, /area/misc/anomaly_research) "nh" = ( /obj/effect/turf_decal/tile/neutral{ @@ -526,20 +497,6 @@ }, /turf/open/floor/iron/smooth, /area/misc/anomaly_research) -"nI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/misc/anomaly_research) -"nS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/structure/window/plasma/spawner/directional/south, -/turf/open/floor/iron/smooth, -/area/misc/anomaly_research) "nU" = ( /obj/effect/turf_decal/siding/purple{ dir = 5 @@ -558,13 +515,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/misc/anomaly_research) -"og" = ( -/obj/machinery/light/warm/no_nightlight/directional/south, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/misc/anomaly_research) "ok" = ( /obj/effect/turf_decal/stripes/white/line, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -574,22 +524,12 @@ /obj/effect/turf_decal/box, /turf/open/floor/iron/dark, /area/misc/anomaly_research) -"ow" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" - }, -/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/freezer, -/area/misc/anomaly_research) -"oF" = ( -/obj/effect/turf_decal/trimline/purple/corner, +"oq" = ( +/obj/effect/turf_decal/siding/purple, +/obj/structure/table/reinforced, +/obj/item/melee/baton/security/cattleprod, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, +/turf/open/floor/iron/dark, /area/misc/anomaly_research) "oI" = ( /obj/effect/turf_decal/tile/purple/half/contrasted{ @@ -599,6 +539,24 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/misc/anomaly_research) +"oK" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/computer/rdconsole{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/misc/anomaly_research) +"pb" = ( +/obj/item/storage/box/lights/mixed, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/misc/anomaly_research) "pk" = ( /obj/machinery/jukebox, /turf/open/floor/iron/dark/textured, @@ -608,60 +566,42 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/misc/anomaly_research) -"pn" = ( -/obj/effect/decal/cleanable/dirt, +"ps" = ( +/obj/effect/spawner/random/trash/grime, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/opposingcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, +/turf/open/floor/plating, /area/misc/anomaly_research) "pu" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/light/small/directional/south, /turf/open/floor/engine, /area/misc/anomaly_research) -"pE" = ( -/obj/machinery/light/broken/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 +"qr" = ( +/obj/structure/tank_dispenser/oxygen{ + pixel_x = -1; + pixel_y = 2 }, -/turf/open/floor/iron/white, +/turf/open/floor/iron/smooth, /area/misc/anomaly_research) -"qa" = ( -/obj/effect/turf_decal/trimline/purple/corner{ - dir = 8 +"qx" = ( +/obj/machinery/light/warm/no_nightlight/directional/north, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 1 }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/misc/anomaly_research) -"qj" = ( +"qH" = ( +/obj/structure/table/reinforced, +/obj/item/stack/sheet/glass/fifty, /obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 1 + dir = 8 }, -/obj/machinery/recharge_station, /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/white, /area/misc/anomaly_research) -"qr" = ( -/obj/structure/tank_dispenser/oxygen{ - pixel_x = -1; - pixel_y = 2 - }, -/turf/open/floor/iron/smooth, -/area/misc/anomaly_research) -"qt" = ( -/obj/effect/spawner/random/trash/box, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/misc/anomaly_research) "qM" = ( /obj/effect/spawner/random/environmentally_safe_anomaly, /obj/effect/turf_decal/trimline/purple, @@ -669,21 +609,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/misc/anomaly_research) -"rk" = ( -/obj/structure/table/reinforced, -/obj/item/stack/sheet/glass/fifty, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 8 - }, +"rA" = ( +/obj/machinery/power/port_gen/pacman/pre_loaded, +/obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/misc/anomaly_research) -"rD" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/window/plasma/spawner/directional/south, -/turf/open/floor/iron/smooth, +/turf/open/floor/plating, /area/misc/anomaly_research) "rX" = ( /obj/machinery/duct, @@ -700,14 +630,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, /area/misc/anomaly_research) -"sp" = ( -/obj/machinery/light/broken/directional/north, -/obj/item/kirbyplants/random, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/iron/white, -/area/misc/anomaly_research) "st" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -730,18 +652,50 @@ }, /turf/open/floor/iron/white, /area/misc/anomaly_research) +"sE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/misc/anomaly_research) +"sF" = ( +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/recharge_station, +/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/white, +/area/misc/anomaly_research) +"sN" = ( +/obj/item/kirbyplants/random/fullysynthetic{ + pixel_x = -8; + pixel_y = 21 + }, +/turf/open/floor/wood, +/area/misc/anomaly_research) "sU" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron/white, /area/misc/anomaly_research) -"tp" = ( -/obj/machinery/light/small/built/directional/east, -/obj/effect/spawner/random/trash/garbage, -/obj/effect/spawner/random/trash/mopbucket, +"sX" = ( +/obj/machinery/light/small/built/directional/north, +/obj/effect/spawner/random/environmentally_safe_anomaly, +/obj/item/reagent_containers/cup/bottle/wittel, +/obj/effect/spawner/random/trash/grime, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/misc/anomaly_research) +"tf" = ( +/obj/structure/bed/double, +/obj/item/bedsheet/rd/double, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/misc/anomaly_research) "tw" = ( /obj/structure/table/reinforced, /obj/item/taperecorder{ @@ -768,6 +722,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/smooth, /area/misc/anomaly_research) +"tG" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/misc/anomaly_research) "tK" = ( /obj/structure/chair/office{ dir = 1 @@ -806,6 +765,13 @@ /obj/item/anomaly_releaser, /turf/open/floor/iron/dark, /area/misc/anomaly_research) +"uB" = ( +/obj/effect/turf_decal/siding/purple{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/misc/anomaly_research) "uG" = ( /obj/structure/rack, /obj/item/clothing/shoes/winterboots, @@ -817,6 +783,17 @@ }, /turf/open/floor/iron/smooth, /area/misc/anomaly_research) +"uL" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple/half/contrasted, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/misc/anomaly_research) "uN" = ( /obj/effect/turf_decal/tile/purple/anticorner/contrasted{ dir = 4 @@ -866,26 +843,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/misc/anomaly_research) -"vJ" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/structure/chair/office, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/misc/anomaly_research) -"vK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/misc/anomaly_research) -"vS" = ( -/obj/effect/turf_decal/siding/purple, -/obj/structure/table/reinforced, -/obj/item/melee/baton/security/cattleprod, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/misc/anomaly_research) "vT" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -893,22 +850,11 @@ }, /turf/open/floor/iron/white, /area/misc/anomaly_research) -"vY" = ( -/obj/machinery/power/port_gen/pacman/pre_loaded, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/misc/anomaly_research) "wb" = ( /obj/effect/turf_decal/tile/yellow/half, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/misc/anomaly_research) -"wf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash/moisture_trap, -/turf/open/floor/plating, -/area/misc/anomaly_research) "wg" = ( /obj/effect/turf_decal/siding/purple{ dir = 10 @@ -917,28 +863,16 @@ /obj/item/storage/box/monkeycubes, /turf/open/floor/iron/dark, /area/misc/anomaly_research) +"ww" = ( +/obj/machinery/light/warm/no_nightlight/directional/east, +/turf/open/floor/wood, +/area/misc/anomaly_research) "wz" = ( /obj/structure/table/reinforced, /obj/item/anomaly_neutralizer, /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/iron/dark, /area/misc/anomaly_research) -"wB" = ( -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 8 - }, -/obj/structure/chair/office, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/misc/anomaly_research) -"wW" = ( -/obj/machinery/autolathe, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/misc/anomaly_research) "xa" = ( /obj/structure/table/reinforced, /obj/structure/chem_separator, @@ -952,32 +886,10 @@ }, /turf/open/floor/iron/dark, /area/misc/anomaly_research) -"xh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron/white, -/area/misc/anomaly_research) -"xj" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/misc/anomaly_research) "xo" = ( /obj/machinery/duct, /turf/closed/wall, /area/misc/anomaly_research) -"xs" = ( -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/misc/anomaly_research) "xE" = ( /turf/open/lava/plasma/ice_moon, /area/misc/anomaly_research) @@ -994,6 +906,11 @@ /obj/effect/turf_decal/tile/yellow/half, /turf/open/floor/iron/white, /area/misc/anomaly_research) +"xY" = ( +/obj/effect/spawner/random/trash/botanical_waste, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/misc/anomaly_research) "ya" = ( /obj/machinery/door/airlock/maintenance{ name = "Mining Station Maintenance" @@ -1006,16 +923,12 @@ /obj/structure/flora/grass/green/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/misc/anomaly_research) -"yG" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple/half/contrasted, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 +"yv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 }, -/turf/open/floor/iron/white, +/obj/structure/window/plasma/spawner/directional/south, +/turf/open/floor/iron/smooth, /area/misc/anomaly_research) "yJ" = ( /obj/machinery/door/airlock/research/glass{ @@ -1023,16 +936,9 @@ }, /turf/open/floor/iron/white, /area/misc/anomaly_research) -"yK" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/misc/anomaly_research) "yR" = ( /obj/effect/spawner/structure/window, -/turf/open/floor/iron/white, +/turf/open/floor/plating, /area/misc/anomaly_research) "yS" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, @@ -1056,31 +962,6 @@ /obj/structure/statue/snow/snowman, /turf/open/misc/asteroid/snow/icemoon, /area/misc/anomaly_research) -"AF" = ( -/obj/machinery/duct, -/obj/structure/rack, -/obj/item/reagent_containers/cup/bottle/nitrogen{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/oxygen{ - pixel_x = 1 - }, -/obj/item/reagent_containers/cup/bottle/mercury{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/misc/anomaly_research) -"AL" = ( -/obj/machinery/light/small/built/directional/north, -/obj/effect/spawner/random/environmentally_safe_anomaly, -/obj/item/reagent_containers/cup/bottle/wittel, -/obj/effect/spawner/random/trash/grime, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/misc/anomaly_research) "AO" = ( /obj/structure/sign/warning/test_chamber, /turf/closed/wall, @@ -1088,6 +969,25 @@ "AV" = ( /turf/closed/wall, /area/misc/anomaly_research) +"Bq" = ( +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/iron/white, +/area/misc/anomaly_research) +"Bu" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/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/dark, +/area/misc/anomaly_research) "BD" = ( /obj/structure/rack, /obj/item/clothing/shoes/winterboots, @@ -1102,23 +1002,6 @@ /obj/machinery/light/floor, /turf/open/misc/asteroid/snow/icemoon, /area/misc/anomaly_research) -"Cc" = ( -/obj/machinery/duct, -/obj/structure/rack, -/obj/item/reagent_containers/cup/bottle/iron{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/multiver{ - pixel_x = 1 - }, -/obj/item/reagent_containers/cup/bottle/acidic_buffer{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/misc/anomaly_research) "Ce" = ( /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 8 @@ -1136,15 +1019,7 @@ /area/misc/anomaly_research) "Cl" = ( /obj/effect/spawner/structure/window/plasma, -/turf/open/floor/engine, -/area/misc/anomaly_research) -"Cy" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 9 - }, -/obj/machinery/monkey_recycler, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, +/turf/open/floor/plating, /area/misc/anomaly_research) "CI" = ( /turf/open/floor/engine, @@ -1154,16 +1029,55 @@ /obj/effect/spawner/random/clothing, /turf/open/floor/wood, /area/misc/anomaly_research) +"CZ" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/misc/anomaly_research) +"Ds" = ( +/obj/effect/turf_decal/trimline/purple/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/misc/anomaly_research) +"Dt" = ( +/obj/structure/rack, +/obj/item/clothing/head/collectable/welding, +/obj/item/weldingtool/largetank, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/misc/anomaly_research) "DV" = ( /obj/effect/turf_decal/siding/purple{ dir = 8 }, /turf/open/floor/iron/dark, /area/misc/anomaly_research) +"Eb" = ( +/obj/machinery/autolathe, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/misc/anomaly_research) "Ek" = ( /obj/structure/lattice, /turf/open/lava/plasma/ice_moon, /area/misc/anomaly_research) +"En" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/misc/anomaly_research) "Eo" = ( /obj/structure/lattice, /obj/item/anomaly_releaser, @@ -1177,15 +1091,50 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/misc/anomaly_research) +"Ew" = ( +/obj/machinery/duct, +/obj/structure/rack, +/obj/item/reagent_containers/cup/bottle/ethanol{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/bottle/chlorine{ + pixel_x = 1 + }, +/obj/item/reagent_containers/cup/bottle/carbon{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/misc/anomaly_research) "EE" = ( /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ dir = 4 }, /turf/open/floor/iron/white, /area/misc/anomaly_research) +"Ff" = ( +/obj/effect/turf_decal/trimline/purple/line, +/obj/effect/decal/cleanable/oil/slippery, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/white, +/area/misc/anomaly_research) "Fg" = ( /turf/open/floor/iron/white, /area/misc/anomaly_research) +"Fj" = ( +/obj/machinery/light/warm/no_nightlight/directional/north, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/misc/anomaly_research) "Fm" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/table, @@ -1223,6 +1172,11 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron/dark/textured, /area/misc/anomaly_research) +"FX" = ( +/obj/structure/sink/directional, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/freezer, +/area/misc/anomaly_research) "Gc" = ( /obj/structure/chair/office, /obj/effect/turf_decal/siding/purple{ @@ -1241,20 +1195,20 @@ /obj/item/paperwork/research, /turf/open/floor/iron/dark, /area/misc/anomaly_research) -"Gi" = ( -/obj/item/kirbyplants/random/fullysynthetic{ - pixel_x = -8; - pixel_y = 21 - }, -/turf/open/floor/wood, -/area/misc/anomaly_research) "Gj" = ( /turf/open/floor/iron/dark/textured, /area/misc/anomaly_research) +"Gr" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/misc/anomaly_research) "GG" = ( /obj/effect/spawner/structure/window, /obj/machinery/duct, -/turf/open/floor/iron/white, +/turf/open/floor/plating, /area/misc/anomaly_research) "GI" = ( /obj/effect/turf_decal/stripes/white/line, @@ -1267,13 +1221,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/misc/anomaly_research) -"Hb" = ( -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/misc/anomaly_research) "Hs" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -1297,6 +1244,14 @@ /obj/effect/turf_decal/siding/white, /turf/open/floor/iron/dark, /area/misc/anomaly_research) +"HN" = ( +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/iron/freezer, +/area/misc/anomaly_research) "HO" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/cup/beaker, @@ -1316,12 +1271,13 @@ }, /turf/open/floor/iron/dark, /area/misc/anomaly_research) -"HY" = ( -/obj/item/stack/cable_coil, +"HT" = ( +/obj/effect/turf_decal/trimline/purple/corner, /obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/purple/opposingcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, +/turf/open/floor/iron/white, /area/misc/anomaly_research) "Ia" = ( /obj/effect/turf_decal/siding/purple, @@ -1329,53 +1285,32 @@ /obj/item/anomaly_releaser, /turf/open/floor/iron/dark, /area/misc/anomaly_research) -"Ii" = ( -/obj/machinery/light/broken/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron/white, -/area/misc/anomaly_research) "Is" = ( /obj/machinery/duct, /obj/machinery/light/small/directional/north, /turf/open/floor/iron/freezer, /area/misc/anomaly_research) -"It" = ( -/obj/machinery/light/small/directional/east, +"Iw" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/wood, -/area/misc/anomaly_research) -"IC" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/iron/dark/textured, -/area/misc/anomaly_research) -"IH" = ( -/obj/effect/spawner/random/big_anomaly, -/turf/open/floor/engine, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, /area/misc/anomaly_research) -"II" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 6 - }, -/obj/structure/table/reinforced, -/obj/item/reactive_armour_shell, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, +"IC" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/turf/open/floor/plating, +/area/misc/anomaly_research) +"IH" = ( +/obj/effect/spawner/random/big_anomaly, +/turf/open/floor/engine, /area/misc/anomaly_research) -"Jb" = ( +"IL" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted, /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/plating, -/area/misc/anomaly_research) -"Jp" = ( -/obj/structure/window/spawner/directional/north, -/obj/structure/window/spawner/directional/north, -/obj/structure/flora/bush/flowers_br/style_random, -/turf/open/floor/grass, +/turf/open/floor/iron/white, /area/misc/anomaly_research) "Jw" = ( /obj/effect/turf_decal/arrows/red, @@ -1393,6 +1328,14 @@ /obj/item/anomaly_neutralizer, /turf/open/floor/engine, /area/misc/anomaly_research) +"JN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/freezer, +/area/misc/anomaly_research) "Kc" = ( /obj/machinery/door/airlock/maintenance{ name = "Mining Station Maintenance" @@ -1434,24 +1377,6 @@ }, /turf/open/floor/wood, /area/misc/anomaly_research) -"Lc" = ( -/obj/structure/toilet{ - pixel_y = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/iron/freezer, -/area/misc/anomaly_research) -"Le" = ( -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/mechanical, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/iron/white, -/area/misc/anomaly_research) "Lo" = ( /obj/effect/turf_decal/siding/wood, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -1471,6 +1396,11 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/smooth, /area/misc/anomaly_research) +"LH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/moisture_trap, +/turf/open/floor/plating, +/area/misc/anomaly_research) "LL" = ( /obj/structure/flora/grass/brown/style_random, /turf/open/misc/asteroid/snow/icemoon, @@ -1484,6 +1414,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/misc/anomaly_research) +"LW" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/mechanical, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/iron/white, +/area/misc/anomaly_research) +"LZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/misc/anomaly_research) "Mg" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -1507,10 +1452,11 @@ /obj/machinery/light/floor, /turf/open/misc/asteroid/snow/icemoon, /area/misc/anomaly_research) -"Nc" = ( -/obj/structure/sink/directional, +"MX" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, /area/misc/anomaly_research) "Ng" = ( /obj/effect/turf_decal/trimline/purple/line, @@ -1521,14 +1467,6 @@ /obj/structure/sign/warning/cold_temp, /turf/closed/wall, /area/misc/anomaly_research) -"NM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/freezer, -/area/misc/anomaly_research) "NP" = ( /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ dir = 8 @@ -1536,12 +1474,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/misc/anomaly_research) -"NR" = ( -/obj/structure/reagent_dispensers/plumbed, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plating, -/area/misc/anomaly_research) "Oa" = ( /obj/effect/decal/cleanable/oil/slippery, /obj/effect/turf_decal/tile/purple/opposingcorners, @@ -1569,13 +1501,6 @@ }, /turf/open/floor/iron/dark, /area/misc/anomaly_research) -"Op" = ( -/obj/machinery/duct, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/freezer, -/area/misc/anomaly_research) "Oq" = ( /obj/structure/table/glass, /obj/item/paper_bin, @@ -1583,6 +1508,26 @@ /obj/effect/turf_decal/siding/white, /turf/open/floor/iron/dark, /area/misc/anomaly_research) +"Ov" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/oil/slippery, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/white, +/area/misc/anomaly_research) +"Ox" = ( +/obj/structure/window/spawner/directional/north, +/obj/structure/window/spawner/directional/north, +/obj/structure/flora/bush/flowers_br/style_random, +/obj/machinery/light/broken/directional/south, +/turf/open/floor/grass, +/area/misc/anomaly_research) +"OL" = ( +/obj/item/stack/cable_coil, +/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/plating, +/area/misc/anomaly_research) "PQ" = ( /obj/machinery/atmospherics/components/unary/passive_vent/layer2{ dir = 1 @@ -1593,21 +1538,19 @@ "PY" = ( /turf/open/floor/wood, /area/misc/anomaly_research) -"Qh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plating, -/area/misc/anomaly_research) "Qp" = ( /obj/machinery/door/airlock/wood, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/misc/anomaly_research) +"Qq" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/misc/anomaly_research) "Qr" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -1615,6 +1558,12 @@ /obj/item/anomaly_releaser, /turf/open/floor/engine, /area/misc/anomaly_research) +"Qu" = ( +/obj/machinery/light/broken/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/white, +/area/misc/anomaly_research) "Qw" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -1629,6 +1578,23 @@ /obj/structure/closet/radiation, /turf/open/floor/iron/smooth, /area/misc/anomaly_research) +"QI" = ( +/obj/machinery/duct, +/obj/structure/rack, +/obj/item/reagent_containers/cup/bottle/nitrogen{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/bottle/oxygen{ + pixel_x = 1 + }, +/obj/item/reagent_containers/cup/bottle/mercury{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/misc/anomaly_research) "QP" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1641,6 +1607,16 @@ }, /turf/open/floor/iron/dark, /area/misc/anomaly_research) +"RC" = ( +/obj/structure/fireplace{ + pixel_x = -32 + }, +/obj/item/kirbyplants/random/fullysynthetic{ + pixel_x = 10; + pixel_y = 19 + }, +/turf/open/floor/wood, +/area/misc/anomaly_research) "RN" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -1656,13 +1632,6 @@ }, /turf/open/floor/engine, /area/misc/anomaly_research) -"Sj" = ( -/obj/structure/table/reinforced, -/obj/machinery/chem_mass_spec, -/obj/machinery/light/warm/no_nightlight/directional/north, -/obj/effect/turf_decal/siding/white, -/turf/open/floor/iron/dark, -/area/misc/anomaly_research) "Sm" = ( /obj/effect/turf_decal/tile/yellow/half, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -1680,15 +1649,6 @@ /obj/effect/turf_decal/siding/white, /turf/open/floor/iron/dark, /area/misc/anomaly_research) -"Ss" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/iron/dark/textured, -/area/misc/anomaly_research) -"Sv" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/misc/anomaly_research) "SQ" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/stripes/white/line, @@ -1705,14 +1665,6 @@ /obj/item/pickaxe, /turf/open/floor/iron/smooth, /area/misc/anomaly_research) -"SX" = ( -/obj/effect/spawner/random/environmentally_safe_anomaly, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/misc/anomaly_research) "Tp" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, @@ -1723,18 +1675,24 @@ /obj/item/flashlight/lamp, /turf/open/floor/iron/dark, /area/misc/anomaly_research) -"Ts" = ( -/obj/machinery/light/warm/no_nightlight/directional/north, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 1 - }, +"Tt" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, +/turf/open/floor/wood, /area/misc/anomaly_research) "TE" = ( /obj/structure/fluff/fokoff_sign, /turf/open/misc/asteroid/snow/airless, /area/misc/anomaly_research) +"TF" = ( +/obj/effect/spawner/random/structure/closet_private, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/misc/anomaly_research) +"TN" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/window/plasma/spawner/directional/south, +/turf/open/floor/iron/smooth, +/area/misc/anomaly_research) "TU" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/smooth, @@ -1768,13 +1726,6 @@ /obj/effect/turf_decal/siding/white, /turf/open/floor/iron/dark, /area/misc/anomaly_research) -"Vy" = ( -/obj/effect/spawner/random/trash/grime, -/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/plating, -/area/misc/anomaly_research) "VL" = ( /obj/structure/table/wood, /turf/open/floor/wood, @@ -1789,6 +1740,14 @@ }, /turf/open/floor/iron/smooth, /area/misc/anomaly_research) +"Wi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/misc/anomaly_research) "Wy" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -1799,6 +1758,13 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/smooth, /area/misc/anomaly_research) +"WB" = ( +/obj/item/kirbyplants/random, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/iron/white, +/area/misc/anomaly_research) "WD" = ( /obj/effect/turf_decal/siding/purple, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1813,10 +1779,14 @@ }, /turf/open/floor/iron/white, /area/misc/anomaly_research) -"WO" = ( -/obj/item/storage/box/lights/mixed, +"Xo" = ( +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" + }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/freezer, /area/misc/anomaly_research) "Xp" = ( /obj/structure/fence{ @@ -1831,12 +1801,6 @@ /obj/structure/tank_holder/oxygen/yellow, /turf/open/floor/iron/smooth, /area/misc/anomaly_research) -"Xv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/oil/slippery, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron/white, -/area/misc/anomaly_research) "XH" = ( /obj/item/shovel/spade, /turf/open/misc/asteroid/snow/icemoon, @@ -1844,18 +1808,19 @@ "Ya" = ( /turf/closed/mineral/snowmountain/cavern, /area/misc/anomaly_research) +"Yo" = ( +/obj/machinery/light/small/built/directional/east, +/obj/effect/spawner/random/trash/garbage, +/obj/effect/spawner/random/trash/mopbucket, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/misc/anomaly_research) "YA" = ( /obj/structure/window/spawner/directional/north, /obj/structure/window/spawner/directional/west, /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, /area/misc/anomaly_research) -"YB" = ( -/obj/structure/bed/double, -/obj/item/bedsheet/rd/double, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/misc/anomaly_research) "YU" = ( /obj/structure/fence/door, /turf/open/misc/asteroid/snow/icemoon, @@ -1891,15 +1856,23 @@ "ZJ" = ( /turf/open/misc/asteroid/snow/icemoon, /area/misc/anomaly_research) -"ZM" = ( -/turf/open/misc/asteroid/snow/airless, -/area/misc/anomaly_research) -"ZQ" = ( -/obj/effect/turf_decal/trimline/purple/line, +"ZL" = ( +/obj/effect/spawner/random/environmentally_safe_anomaly, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/misc/anomaly_research) +"ZM" = ( +/turf/open/misc/asteroid/snow/airless, +/area/misc/anomaly_research) +"ZO" = ( +/obj/structure/table/reinforced, +/obj/machinery/chem_mass_spec, +/obj/effect/turf_decal/siding/white, +/turf/open/floor/iron/dark, +/area/misc/anomaly_research) "ZX" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -2189,11 +2162,11 @@ dr xE xE AV -Ss -Ss -Ss -Ss -Ss +IC +IC +IC +IC +IC AV AV AV @@ -2307,7 +2280,7 @@ pl pl PY Lo -Gj +FK AV vm Zh @@ -2341,11 +2314,11 @@ UD IC IC AV -gi +VL VL mk As -FK +Gj AV Kc AV @@ -2379,17 +2352,17 @@ UD IC dr AV -Gi +sN Wy VL As Gj AV -Vy -Jb -HY -WO -wf +ps +MX +OL +pb +LH AV xE xE @@ -2417,17 +2390,17 @@ cy AV xE AV -eZ -PY +RC +ww PY As pk AV -vY -dU -Qh -tp -qt +rA +Dt +ki +Yo +gF AV AV AV @@ -2447,8 +2420,8 @@ RT Ya Ya AV -Le -rk +LW +qH yR sU QP @@ -2471,7 +2444,7 @@ xE AV qr ZX -nS +hK xE xE xE @@ -2485,8 +2458,8 @@ RT Ya Ya AV -wW -yG +Eb +uL yR Kh QP @@ -2509,7 +2482,7 @@ xE AV fw Hs -cF +TN xE xE Ya @@ -2523,8 +2496,8 @@ RT Ya Ya AV -Ts -jl +qx +IL bB QP QP @@ -2547,7 +2520,7 @@ xE AV mS Hs -cF +TN xE xE Ya @@ -2565,9 +2538,9 @@ tR iP yR Ls -og +QP MG -mY +Fj Fg eq eA @@ -2585,7 +2558,7 @@ xE AV Uo zu -rD +yv xE xE Ya @@ -2605,9 +2578,9 @@ yR Ls QP AV -fO -Hb -Hb +Bq +Qq +Qq Uz Qr RN @@ -2789,7 +2762,7 @@ RT RT Ya AV -Sj +ZO nZ LU NP @@ -2985,7 +2958,7 @@ rX xo xo aX -xh +tG Cl xE xE @@ -3018,12 +2991,12 @@ Ya Ya Ya AV -gg -jE +xY +Ew AV lL QP -xh +tG Cl xE xE @@ -3056,12 +3029,12 @@ Ya Ya Ya AV -AL -AF +sX +QI AV SQ -nI -xh +Iw +tG Cl Cl AV @@ -3094,14 +3067,14 @@ Ya Ya Ya AV -NR -Cc +ba +fv AV wz -nI -Xv -xh -xh +Iw +Ov +tG +tG AV Ya xE @@ -3136,10 +3109,10 @@ AV xo AV GI -nI -Cy +Iw +iK wg -xh +tG AV Ya xE @@ -3174,10 +3147,10 @@ it lo AV ok -nI -yK -vS -xh +Iw +uB +oq +tG AV Ya xE @@ -3212,10 +3185,10 @@ Is sv AV sg -nI -vJ +Iw +hU Ia -xh +tG AV Ya Ya @@ -3246,14 +3219,14 @@ RT Ya Ya AV -Nc -Op +FX +ds AV -xh -nI -fm -II -lx +Qu +Iw +mZ +eT +Wi AV AV AV @@ -3284,15 +3257,15 @@ RT Ya Ya AV -Lc -NM +HN +JN AV -sp -nI -nI -pn -nI -Ii +WB +Iw +Iw +iq +Iw +tG xQ AV nA @@ -3323,15 +3296,15 @@ Ya Ya AV AV -ow +Xo AV -cA -cA -cA -gA +ii +ii +ii +eW QP -oF -aP +HT +CZ cy Jw KP @@ -3361,14 +3334,14 @@ Ya Ya Ya AV -my -xj -mb +Bu +kY +oK ip ii -xh -nI -ZQ +tG +Iw +fe YA AV Qz @@ -3399,15 +3372,15 @@ RT Ya Ya AV -qj -xs -wB +sF +Gr +mC nh -cA -xh -SX +ii +tG +ZL Ng -Jp +Ox AV AV AV @@ -3437,14 +3410,14 @@ kp Ya Ya AV -gr -Sv +kt +En dy Gg -cA +ii Ls -nI -ft +Iw +Ff dj AV un @@ -3472,7 +3445,7 @@ Ya RT RT Ya -dz +Ya Ya AV hq @@ -3481,9 +3454,9 @@ Ft lX GR QP -nI -qa -iw +Iw +Ds +gB cy HE Zh @@ -3509,18 +3482,18 @@ Ya (43,1,1) = {" RT RT -dz -dz +Ya +Ya Ya AV uN vG lz ut -cA +ii Cf -pE -xh +sE +tG xQ AV jN @@ -3547,7 +3520,7 @@ Ya (44,1,1) = {" RT Ya -dz +Ya Ya Ya AV @@ -3585,7 +3558,7 @@ RT (45,1,1) = {" RT Ya -dz +Ya Ya Ya AV @@ -3593,7 +3566,7 @@ bP FE PY CP -hh +Cl xE xE xE @@ -3628,10 +3601,10 @@ Ya Ya AV UC -vK -bG +LZ +Tt PY -hh +Cl xE xE xE @@ -3665,11 +3638,11 @@ Ya Ya Ya AV -eO -It -bG -YB -hh +TF +ev +Tt +tf +Cl xE xE xE diff --git a/_maps/RandomRuins/SpaceRuins/atmosasteroidruin.dmm b/_maps/RandomRuins/SpaceRuins/atmosasteroidruin.dmm index a68da2a99759d..7e3b7000c42ab 100644 --- a/_maps/RandomRuins/SpaceRuins/atmosasteroidruin.dmm +++ b/_maps/RandomRuins/SpaceRuins/atmosasteroidruin.dmm @@ -2,6 +2,11 @@ "af" = ( /turf/open/floor/iron/co2_pressurized, /area/ruin/space/has_grav/atmosasteroid) +"aO" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, +/turf/open/floor/plating, +/area/ruin/space/has_grav/atmosasteroid) "ba" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/effect/turf_decal/tile/yellow/half{ @@ -9,6 +14,12 @@ }, /turf/open/floor/iron/co2_pressurized, /area/ruin/space/has_grav/atmosasteroid) +"bC" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon{ + dir = 8 + }, +/turf/open/floor/engine/co2/equalized_with_regular_air, +/area/ruin/space/has_grav/atmosasteroid) "bF" = ( /obj/effect/turf_decal/tile/yellow/half, /obj/machinery/light/directional/south, @@ -28,10 +39,6 @@ }, /turf/open/floor/engine/airless, /area/ruin/space/has_grav/atmosasteroid) -"fz" = ( -/obj/machinery/atmospherics/miner/carbon_dioxide, -/turf/open/floor/engine/co2/equalized_with_regular_air, -/area/ruin/space/has_grav/atmosasteroid) "fV" = ( /obj/machinery/atmospherics/components/binary/volume_pump{ dir = 4 @@ -63,18 +70,37 @@ }, /turf/open/floor/engine/airless, /area/ruin/space/has_grav/atmosasteroid) +"hN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark, +/obj/machinery/light/small/directional/west, +/turf/open/floor/engine/airless, +/area/ruin/space/has_grav/atmosasteroid) "hP" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /obj/machinery/atmospherics/pipe/smart/manifold4w/green, /turf/open/floor/plating, /area/ruin/space/has_grav/atmosasteroid) -"hX" = ( -/obj/item/analyzer/ranged, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 4 +"hS" = ( +/obj/structure/rack, +/obj/item/rpd_upgrade{ + pixel_x = -4; + pixel_y = 3 }, -/obj/machinery/light/dim/directional/east, -/turf/open/floor/iron/co2_pressurized, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/item/rpd_upgrade/unwrench{ + pixel_x = 5 + }, +/obj/item/paper/crumpled{ + default_raw_text = "Ever since I set up those miners, they've all been making a strange clunking noise, especially the Carbon Dioxide miner. I swear, it's just been getting louder and louder these past couple hours. I just hope I set it up right." + }, +/obj/machinery/door/window/left/directional/east, +/obj/structure/window/spawner/directional/north, +/obj/structure/window/spawner/directional/south, +/obj/item/storage/toolbox/mechanical, +/obj/item/gps/spaceruin, +/turf/open/floor/iron/dark/co2_pressurized, /area/ruin/space/has_grav/atmosasteroid) "ij" = ( /obj/effect/spawner/structure/window/reinforced/plasma, @@ -100,6 +126,17 @@ }, /turf/open/floor/iron/co2_pressurized, /area/ruin/space/has_grav/atmosasteroid) +"jM" = ( +/obj/machinery/power/port_gen/pacman/pre_loaded{ + anchored = 1 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/co2_pressurized, +/area/ruin/space/has_grav/atmosasteroid) "jP" = ( /obj/machinery/door/airlock/atmos/glass, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, @@ -124,6 +161,10 @@ }, /turf/open/floor/iron/co2_pressurized, /area/ruin/space/has_grav/atmosasteroid) +"ky" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine/plasma, +/area/ruin/space/has_grav/atmosasteroid) "kB" = ( /obj/machinery/atmospherics/components/trinary/mixer/airmix/inverse{ dir = 4 @@ -176,12 +217,6 @@ }, /turf/open/floor/engine/air, /area/ruin/space/has_grav/atmosasteroid) -"nB" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/turf/open/floor/iron/co2_pressurized, -/area/ruin/space/has_grav/atmosasteroid) "og" = ( /obj/machinery/power/turbine/inlet_compressor, /turf/open/misc/asteroid, @@ -217,10 +252,6 @@ /obj/structure/closet/firecloset/full, /turf/open/floor/iron/co2_pressurized, /area/ruin/space/has_grav/atmosasteroid) -"ps" = ( -/obj/machinery/atmospherics/miner/oxygen, -/turf/open/floor/engine/o2, -/area/ruin/space/has_grav/atmosasteroid) "pw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/effect/turf_decal/stripes/corner{ @@ -235,6 +266,10 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber, /turf/open/floor/engine/airless, /area/ruin/space/has_grav/atmosasteroid) +"qA" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/engine/air, +/area/ruin/space/has_grav/atmosasteroid) "rg" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/effect/turf_decal/tile/yellow/anticorner{ @@ -255,32 +290,13 @@ /obj/machinery/power/turbine/turbine_outlet, /turf/open/misc/asteroid, /area/ruin/space/has_grav/atmosasteroid) -"sp" = ( -/obj/effect/turf_decal/tile/yellow/half, -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/turf/open/floor/iron/co2_pressurized, -/area/ruin/space/has_grav/atmosasteroid) -"tC" = ( -/obj/structure/rack, -/obj/item/rpd_upgrade{ - pixel_x = -4; - pixel_y = 3 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/item/rpd_upgrade/unwrench{ - pixel_x = 5 - }, -/obj/item/paper/crumpled{ - default_raw_text = "Ever since I set up those miners, they've all been making a strange clunking noise, especially the Carbon Dioxide miner. I swear, it's just been getting louder and louder these past couple hours. I just hope I set it up right." +"sH" = ( +/obj/item/analyzer/ranged, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 4 }, -/obj/machinery/door/window/left/directional/east, -/obj/structure/window/spawner/directional/north, -/obj/structure/window/spawner/directional/south, -/obj/item/storage/toolbox/mechanical, -/obj/item/gps/spaceruin, -/turf/open/floor/iron/dark/co2_pressurized, +/obj/machinery/light/broken/directional/east, +/turf/open/floor/iron/co2_pressurized, /area/ruin/space/has_grav/atmosasteroid) "tL" = ( /obj/machinery/atmospherics/components/unary/outlet_injector{ @@ -323,6 +339,11 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/ruin/space/has_grav/atmosasteroid) +"zw" = ( +/obj/machinery/atmospherics/miner/nitrogen, +/obj/machinery/light/small/directional/south, +/turf/open/floor/engine/n2, +/area/ruin/space/has_grav/atmosasteroid) "zD" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/general/visible/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, @@ -332,25 +353,14 @@ /obj/machinery/power/turbine/core_rotor, /turf/open/misc/asteroid, /area/ruin/space/has_grav/atmosasteroid) -"zM" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, -/turf/open/floor/plating, +"zL" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine/n2o, /area/ruin/space/has_grav/atmosasteroid) "Ak" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/iron/co2_pressurized, /area/ruin/space/has_grav/atmosasteroid) -"Al" = ( -/obj/machinery/power/port_gen/pacman/pre_loaded{ - anchored = 1 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/turf/open/floor/iron/co2_pressurized, -/area/ruin/space/has_grav/atmosasteroid) "AJ" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers, @@ -370,6 +380,10 @@ dir = 4 }, /area/ruin/space/has_grav/atmosasteroid) +"By" = ( +/obj/machinery/atmospherics/miner/carbon_dioxide, +/turf/open/floor/engine/co2/equalized_with_regular_air, +/area/ruin/space/has_grav/atmosasteroid) "Cb" = ( /obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible, /obj/effect/turf_decal/tile/yellow/half, @@ -394,16 +408,6 @@ }, /turf/open/floor/iron/co2_pressurized, /area/ruin/space/has_grav/atmosasteroid) -"Dw" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/turf/open/floor/iron/co2_pressurized, -/area/ruin/space/has_grav/atmosasteroid) "DN" = ( /obj/machinery/door/airlock/external/glass/ruin{ locked = 1 @@ -417,6 +421,13 @@ }, /turf/open/floor/iron/co2_pressurized, /area/ruin/space/has_grav/atmosasteroid) +"ED" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 4 + }, +/turf/open/floor/iron/co2_pressurized, +/area/ruin/space/has_grav/atmosasteroid) "Fj" = ( /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/tile/yellow/half{ @@ -444,10 +455,7 @@ }, /turf/open/floor/iron/co2_pressurized, /area/ruin/space/has_grav/atmosasteroid) -"HD" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon{ - dir = 8 - }, +"Hl" = ( /turf/open/floor/engine/co2/equalized_with_regular_air, /area/ruin/space/has_grav/atmosasteroid) "HF" = ( @@ -503,13 +511,6 @@ dir = 8 }, /area/ruin/space/has_grav/atmosasteroid) -"LI" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/tank_holder/extinguisher/advanced{ - anchored = 1 - }, -/turf/open/floor/iron/dark/side/co2_pressurized, -/area/ruin/space/has_grav/atmosasteroid) "LJ" = ( /obj/machinery/atmospherics/pipe/layer_manifold/purple/visible{ dir = 4 @@ -519,6 +520,12 @@ }, /turf/open/floor/iron/co2_pressurized, /area/ruin/space/has_grav/atmosasteroid) +"LP" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/iron/co2_pressurized, +/area/ruin/space/has_grav/atmosasteroid) "Mt" = ( /obj/effect/decal/cleanable/blood/gibs/core, /obj/effect/turf_decal/stripes/corner{ @@ -526,6 +533,11 @@ }, /turf/open/floor/iron/co2_pressurized, /area/ruin/space/has_grav/atmosasteroid) +"Mz" = ( +/obj/effect/turf_decal/tile/yellow/half, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/turf/open/floor/iron/co2_pressurized, +/area/ruin/space/has_grav/atmosasteroid) "MG" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -548,15 +560,6 @@ /obj/machinery/portable_atmospherics/scrubber/huge/movable, /turf/open/floor/iron/co2_pressurized, /area/ruin/space/has_grav/atmosasteroid) -"Ns" = ( -/obj/effect/turf_decal/tile/yellow/half{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/layer_manifold/green/visible{ - dir = 4 - }, -/turf/open/floor/iron/co2_pressurized, -/area/ruin/space/has_grav/atmosasteroid) "Ny" = ( /turf/closed/wall, /area/ruin/space/has_grav/atmosasteroid) @@ -566,6 +569,15 @@ }, /turf/open/floor/engine/o2, /area/ruin/space/has_grav/atmosasteroid) +"Oc" = ( +/obj/effect/turf_decal/tile/yellow/half{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/layer_manifold/green/visible{ + dir = 4 + }, +/turf/open/floor/iron/co2_pressurized, +/area/ruin/space/has_grav/atmosasteroid) "Oe" = ( /obj/item/pickaxe, /turf/open/misc/asteroid, @@ -583,6 +595,17 @@ /obj/machinery/electrolyzer, /turf/open/floor/iron/dark/co2_pressurized, /area/ruin/space/has_grav/atmosasteroid) +"QA" = ( +/obj/effect/turf_decal/tile/yellow/half, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/co2_pressurized, +/area/ruin/space/has_grav/atmosasteroid) +"QI" = ( +/obj/machinery/atmospherics/miner/oxygen, +/obj/machinery/light/small/directional/south, +/turf/open/floor/engine/o2, +/area/ruin/space/has_grav/atmosasteroid) "QP" = ( /turf/closed/mineral, /area/ruin/space/has_grav/atmosasteroid) @@ -595,6 +618,16 @@ "Rp" = ( /turf/open/floor/engine/n2o, /area/ruin/space/has_grav/atmosasteroid) +"RI" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/iron/co2_pressurized, +/area/ruin/space/has_grav/atmosasteroid) "RJ" = ( /obj/item/stack/rods, /obj/machinery/atmospherics/pipe/layer_manifold/dark/visible{ @@ -604,7 +637,7 @@ /obj/effect/turf_decal/tile/yellow/half{ dir = 4 }, -/mob/living/simple_animal/hostile/asteroid/hivelord, +/mob/living/basic/mining/hivelord, /turf/open/floor/iron/co2_pressurized, /area/ruin/space/has_grav/atmosasteroid) "RK" = ( @@ -626,15 +659,16 @@ }, /turf/open/floor/iron/co2_pressurized, /area/ruin/space/has_grav/atmosasteroid) +"SO" = ( +/obj/machinery/light/small/broken/directional/east, +/turf/open/floor/engine/co2/equalized_with_regular_air, +/area/ruin/space/has_grav/atmosasteroid) "TP" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon{ dir = 8 }, /turf/open/floor/engine/plasma, /area/ruin/space/has_grav/atmosasteroid) -"TU" = ( -/turf/open/floor/engine/co2/equalized_with_regular_air, -/area/ruin/space/has_grav/atmosasteroid) "Ub" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/structure/reagent_dispensers/foamtank, @@ -651,14 +685,6 @@ "Up" = ( /turf/template_noop, /area/template_noop) -"Ur" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 4 - }, -/obj/machinery/light/broken/directional/east, -/turf/open/floor/iron/co2_pressurized, -/area/ruin/space/has_grav/atmosasteroid) "Uz" = ( /obj/effect/turf_decal/tile/yellow/anticorner{ dir = 8 @@ -676,19 +702,17 @@ /obj/machinery/atmospherics/miner/plasma, /turf/open/floor/engine/plasma, /area/ruin/space/has_grav/atmosasteroid) -"Vw" = ( -/obj/effect/turf_decal/tile/yellow/half, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron/co2_pressurized, +"VH" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/tank_holder/extinguisher/advanced{ + anchored = 1 + }, +/turf/open/floor/iron/dark/side/co2_pressurized, /area/ruin/space/has_grav/atmosasteroid) "Wc" = ( /obj/effect/turf_decal/tile/yellow/half, /turf/open/floor/iron/co2_pressurized, /area/ruin/space/has_grav/atmosasteroid) -"Wn" = ( -/obj/machinery/atmospherics/miner/nitrogen, -/turf/open/floor/engine/n2, -/area/ruin/space/has_grav/atmosasteroid) "Ws" = ( /obj/item/shard/plasma, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, @@ -817,7 +841,7 @@ QP QP gG pU -Co +hN fm gG rg @@ -848,7 +872,7 @@ gG UL Ak af -Vw +QA gG gG gG @@ -873,7 +897,7 @@ gG Lj Ak af -sp +Mz ij Ra hj @@ -894,14 +918,14 @@ gG oZ fV vo -Dw +RI Ep Ak af Wc zd hj -ps +QI gG QP "} @@ -917,14 +941,14 @@ zH vW gG jB -nB -nB +LP +LP af af KT zD Cb -zM +aO NP hj gG @@ -941,14 +965,14 @@ rC vW So gG -Al +jM af jV FU FU KT uH -bF +Wc gG gG gG @@ -973,7 +997,7 @@ Oz mI Bq uH -sp +Mz ij tL vG @@ -992,7 +1016,7 @@ Oe xr gG HF -LI +VH Ny Ny Ny @@ -1001,7 +1025,7 @@ uH Wc zd vG -Wn +zw gG QP "} @@ -1016,15 +1040,15 @@ og vW mC gG -Lj +HF Lv MG OY -tC +hS pw kB Cb -zM +aO om vG gG @@ -1101,7 +1125,7 @@ af ZN zd eL -eL +qA gG QP "} @@ -1118,10 +1142,10 @@ gG gG LJ KR -hX -Ns +sH +Oc KR -Ur +ED RJ mA df @@ -1172,8 +1196,8 @@ gG rp Rp gG -HD -TU +bC +Hl gG QP QP @@ -1192,13 +1216,13 @@ QP QP gG UR -iD +ky gG Kg -Rp +zL gG -fz -TU +By +SO gG QP QP diff --git a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm index af977569da226..12c40f0b280db 100644 --- a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm +++ b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm @@ -60,12 +60,6 @@ /obj/effect/mapping_helpers/apc/no_charge, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/cargobay) -"ap" = ( -/obj/structure/table, -/obj/machinery/light/directional/west, -/obj/item/reagent_containers/cup/bucket, -/turf/open/floor/iron, -/area/ruin/space/has_grav/derelictoutpost/cargobay) "aq" = ( /turf/closed/wall/mineral/titanium/interior, /area/ruin/space/has_grav/derelictoutpost/dockedship) @@ -88,11 +82,6 @@ /obj/structure/alien/resin/wall/creature, /turf/open/misc/asteroid, /area/ruin/space/has_grav/derelictoutpost) -"av" = ( -/obj/structure/table, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/ruin/space/has_grav/derelictoutpost/cargobay) "aw" = ( /obj/structure/table, /turf/open/floor/iron, @@ -323,17 +312,6 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost) -"bq" = ( -/obj/effect/mob_spawn/corpse/human/nanotrasensoldier{ - outfit_override = list("head" = null) - }, -/obj/item/paper/crumpled/ruins/bigderelict1/coward, -/obj/effect/decal/cleanable/blood/old{ - name = "dried blood splatter"; - pixel_x = -29 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/derelictoutpost/powerstorage) "br" = ( /obj/machinery/power/terminal{ dir = 1 @@ -507,15 +485,6 @@ /obj/effect/spawner/structure/window/reinforced/shuttle, /turf/open/floor/plating, /area/ruin/space/has_grav/derelictoutpost/dockedship) -"cd" = ( -/obj/structure/grille/broken, -/obj/effect/decal/cleanable/blood/old{ - icon_state = "trails_1"; - name = "dried blood trail" - }, -/obj/structure/alien/weeds/creature, -/turf/closed/wall/mineral/iron, -/area/ruin/space/has_grav/derelictoutpost/dockedship) "ce" = ( /obj/structure/alien/weeds/creature, /obj/structure/cable, @@ -752,17 +721,6 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/cargobay) -"df" = ( -/obj/effect/decal/cleanable/blood/old{ - dir = 4; - icon_state = "trails_1"; - name = "dried blood trail" - }, -/obj/structure/alien/weeds/creature, -/obj/machinery/light/directional/south, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/derelictoutpost/cargobay) "dg" = ( /obj/effect/decal/cleanable/blood/old{ dir = 4; @@ -818,10 +776,6 @@ /obj/structure/alien/gelpod, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost) -"dp" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/ruin/space/has_grav/derelictoutpost/cargobay) "dq" = ( /obj/effect/decal/cleanable/xenoblood/xsplatter, /obj/structure/alien/weeds/creature, @@ -870,20 +824,6 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/cargobay) -"dK" = ( -/obj/item/ammo_casing/c45{ - caliber = null; - desc = "A .45 bullet casing. This one is spent."; - name = "spent bullet casing" - }, -/obj/structure/alien/weeds/creature, -/obj/effect/decal/cleanable/blood/old{ - dir = 5; - icon_state = "trails_1"; - name = "dried blood trail" - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/derelictoutpost/cargobay) "dL" = ( /turf/closed/wall, /area/ruin/space/has_grav/derelictoutpost/cargostorage) @@ -976,17 +916,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/cargostorage) -"eb" = ( -/obj/structure/closet/crate, -/obj/item/target/syndicate, -/obj/item/target/clown, -/obj/item/target/clown, -/obj/item/target/alien, -/obj/item/target, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/ruin/space/has_grav/derelictoutpost/cargostorage) "ee" = ( /obj/effect/decal/cleanable/blood/old{ icon_state = "trails_1"; @@ -1095,13 +1024,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/cargostorage) -"eB" = ( -/obj/structure/closet/crate/preopen, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/delivery, -/obj/effect/spawner/random/exotic/technology, -/turf/open/floor/iron, -/area/ruin/space/has_grav/derelictoutpost/cargostorage) "eC" = ( /obj/structure/closet/crate, /obj/item/modular_computer/pda/clear, @@ -1172,6 +1094,16 @@ /obj/structure/alien/weeds/creature, /turf/open/misc/asteroid, /area/ruin/space/has_grav/derelictoutpost) +"gw" = ( +/obj/structure/closet/crate/medical, +/obj/item/storage/medkit/regular{ + empty = 1; + name = "First-Aid (empty)" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/ruin/space/has_grav/derelictoutpost/cargostorage) "hF" = ( /obj/structure/alien/weeds/creature, /obj/structure/alien/gelpod, @@ -1207,6 +1139,17 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/misc/asteroid, /area/ruin/space/has_grav/derelictoutpost) +"nc" = ( +/obj/structure/table, +/obj/item/clothing/gloves/fingerless, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/ruin/space/has_grav/derelictoutpost/cargobay) +"oc" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/bucket, +/turf/open/floor/iron, +/area/ruin/space/has_grav/derelictoutpost/cargobay) "oU" = ( /obj/structure/alien/weeds/creature, /obj/effect/decal/cleanable/blood/old{ @@ -1296,6 +1239,12 @@ /obj/structure/glowshroom/single, /turf/open/misc/asteroid, /area/ruin/space/has_grav/derelictoutpost) +"ye" = ( +/obj/structure/filingcabinet, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/derelictoutpost) "yl" = ( /obj/effect/decal/cleanable/blood/old{ dir = 8; @@ -1324,6 +1273,11 @@ }, /turf/open/misc/asteroid, /area/ruin/space/has_grav/derelictoutpost) +"zA" = ( +/obj/structure/grille/broken, +/obj/structure/alien/weeds/creature, +/turf/closed/wall/mineral/iron, +/area/ruin/space/has_grav/derelictoutpost/dockedship) "BI" = ( /obj/structure/closet/crate/medical, /obj/item/storage/medkit/brute, @@ -1351,18 +1305,27 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/derelictoutpost) +"DL" = ( +/obj/item/ammo_casing/c45{ + caliber = null; + desc = "A .45 bullet casing. This one is spent."; + name = "spent bullet casing" + }, +/obj/structure/alien/weeds/creature, +/obj/effect/decal/cleanable/blood/old{ + dir = 5; + icon_state = "trails_1"; + name = "dried blood trail" + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/ruin/space/has_grav/derelictoutpost/cargobay) "Ef" = ( /obj/structure/closet/crate/medical, /obj/item/storage/medkit/regular, /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/cargostorage) -"Ev" = ( -/obj/structure/filingcabinet, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/derelictoutpost) "Fe" = ( /obj/structure/alien/weeds/creature, /obj/effect/decal/cleanable/blood/old, @@ -1410,6 +1373,22 @@ /obj/item/shard, /turf/open/misc/asteroid, /area/ruin/space/has_grav/derelictoutpost) +"Ks" = ( +/obj/structure/closet/crate/preopen, +/obj/effect/turf_decal/delivery, +/obj/effect/spawner/random/exotic/technology, +/turf/open/floor/iron, +/area/ruin/space/has_grav/derelictoutpost/cargostorage) +"KB" = ( +/obj/structure/closet/crate, +/obj/item/target/syndicate, +/obj/item/target/clown, +/obj/item/target/clown, +/obj/item/target/alien, +/obj/item/target, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/ruin/space/has_grav/derelictoutpost/cargostorage) "LB" = ( /obj/machinery/door/airlock/external/ruin, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -1468,15 +1447,6 @@ }, /turf/open/misc/asteroid, /area/ruin/space/has_grav/derelictoutpost) -"Sd" = ( -/obj/structure/closet/crate/medical, -/obj/item/storage/medkit/regular{ - empty = 1; - name = "First-Aid (empty)" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/ruin/space/has_grav/derelictoutpost/cargostorage) "Ve" = ( /obj/structure/alien/weeds/creature, /obj/effect/turf_decal/tile/red/fourcorners, @@ -1491,6 +1461,26 @@ /obj/item/storage/medkit/brute, /turf/open/floor/mineral/titanium/yellow, /area/ruin/space/has_grav/derelictoutpost/dockedship) +"VZ" = ( +/obj/effect/decal/cleanable/blood/old{ + dir = 4; + icon_state = "trails_1"; + name = "dried blood trail" + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/ruin/space/has_grav/derelictoutpost/cargobay) +"XO" = ( +/obj/effect/mob_spawn/corpse/human/nanotrasensoldier{ + outfit_override = list("head"=null) + }, +/obj/item/paper/crumpled/ruins/bigderelict1/coward, +/obj/effect/decal/cleanable/blood/old{ + name = "dried blood splatter"; + pixel_x = -29 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/derelictoutpost/powerstorage) "YX" = ( /obj/structure/closet/crate/medical, /obj/item/storage/medkit/regular, @@ -1599,7 +1589,7 @@ aB aM uV ba -bq +XO bH bJ cn @@ -1678,13 +1668,13 @@ bJ aS cT ak -dp +ak cT bx dJ bx bx -dp +ak ak ak eL @@ -1717,7 +1707,7 @@ bx dq bx bx -dK +DL dS eh eh @@ -1773,14 +1763,14 @@ ab af ai al -ap -aw +oc aw +bK aN aT aJ az -bK +aw cb an cG @@ -1821,7 +1811,7 @@ ak an cH cV -dc +bx ab Hc Cr @@ -1830,7 +1820,7 @@ dU dW dW ex -eB +Ks dL aR aZ @@ -1857,7 +1847,7 @@ ae ae an bx -bx +dc ab pB au @@ -2010,7 +2000,7 @@ dY dW eq ex -dW +eG dL aR aZ @@ -2033,7 +2023,7 @@ aV bg bw bN -cd +zA cu cK cW @@ -2145,16 +2135,16 @@ ae cv ce bx -de +VZ ab lm au dL -eb +KB dW es ex -eG +dW dL aR aZ @@ -2181,12 +2171,12 @@ ce ce ce ce -df +dg ab lm vr dL -Sd +gw dW BI ey @@ -2205,12 +2195,12 @@ ab ah ak ao -av +aw az -aJ +nc aN aX -av +aw bx bP bx @@ -2320,7 +2310,7 @@ aa aY aK iK -Ev +ye bC cj cO diff --git a/_maps/RandomRuins/SpaceRuins/botanical_haven.dmm b/_maps/RandomRuins/SpaceRuins/botanical_haven.dmm index 4ca1f453331fb..f39b0b383e74c 100644 --- a/_maps/RandomRuins/SpaceRuins/botanical_haven.dmm +++ b/_maps/RandomRuins/SpaceRuins/botanical_haven.dmm @@ -14,9 +14,8 @@ /obj/structure/water_source/puddle, /turf/open/misc/grass, /area/ruin/space/has_grav/powered/botanical_haven) -"f" = ( +"e" = ( /obj/structure/flora/bush/flowers_br/style_random, -/obj/machinery/light/warm/directional/east, /obj/machinery/hydroponics/soil, /turf/open/misc/grass, /area/ruin/space/has_grav/powered/botanical_haven) @@ -68,6 +67,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/powered/botanical_haven) +"r" = ( +/obj/structure/flora/bush/snow/style_random, +/obj/machinery/light/warm/directional/west, +/turf/open/misc/grass, +/area/ruin/space/has_grav/powered/botanical_haven) "s" = ( /obj/effect/decal/cleanable/generic, /turf/open/misc/grass, @@ -76,15 +80,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/misc/grass, /area/ruin/space/has_grav/powered/botanical_haven) -"v" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/siding/thinplating_new/terracotta/end{ - dir = 8 - }, -/turf/open/floor/iron/terracotta/small, -/area/ruin/space/has_grav/powered/botanical_haven) "w" = ( /obj/machinery/door/airlock/external/ruin, /obj/structure/fans/tiny, @@ -123,11 +118,6 @@ /obj/structure/flora/rock/pile/jungle/style_random, /turf/open/misc/grass, /area/ruin/space/has_grav/powered/botanical_haven) -"F" = ( -/obj/structure/flora/rock/pile/jungle/style_random, -/obj/machinery/light/warm/directional/north, -/turf/open/misc/grass, -/area/ruin/space/has_grav/powered/botanical_haven) "G" = ( /turf/closed/wall, /area/ruin/space/has_grav/powered/botanical_haven) @@ -151,6 +141,13 @@ /obj/effect/spawner/random/decoration/flower, /turf/open/misc/grass, /area/ruin/space/has_grav/powered/botanical_haven) +"L" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/siding/thinplating_new/terracotta/end{ + dir = 8 + }, +/turf/open/floor/iron/terracotta/small, +/area/ruin/space/has_grav/powered/botanical_haven) "M" = ( /obj/structure/table/glass, /obj/effect/spawner/random/food_or_drink/seed_rare, @@ -221,6 +218,11 @@ /obj/structure/flora/grass/brown/style_random, /turf/open/misc/grass, /area/ruin/space/has_grav/powered/botanical_haven) +"Z" = ( +/obj/machinery/hydroponics/soil, +/obj/machinery/light/warm/directional/east, +/turf/open/misc/grass, +/area/ruin/space/has_grav/powered/botanical_haven) (1,1,1) = {" a @@ -344,8 +346,8 @@ o o o o -F -V +D +r c D o @@ -394,7 +396,7 @@ C Y M C -v +L G Q U @@ -505,8 +507,8 @@ o o o o -g -f +Z +e g o o diff --git a/_maps/RandomRuins/SpaceRuins/clownplanet.dmm b/_maps/RandomRuins/SpaceRuins/clownplanet.dmm index b0cc8cc29e20e..fa0b50cc44359 100644 --- a/_maps/RandomRuins/SpaceRuins/clownplanet.dmm +++ b/_maps/RandomRuins/SpaceRuins/clownplanet.dmm @@ -26,7 +26,7 @@ /turf/open/floor/engine, /area/ruin/space/has_grav/powered/clownplanet) "ah" = ( -/mob/living/simple_animal/hostile/retaliate/clown/clownhulk/destroyer, +/mob/living/basic/clown/clownhulk/destroyer, /turf/open/floor/engine, /area/ruin/space/has_grav/powered/clownplanet) "ai" = ( diff --git a/_maps/RandomRuins/SpaceRuins/crashedship.dmm b/_maps/RandomRuins/SpaceRuins/crashedship.dmm index bab4fb2f2899f..c419c508a1b8b 100644 --- a/_maps/RandomRuins/SpaceRuins/crashedship.dmm +++ b/_maps/RandomRuins/SpaceRuins/crashedship.dmm @@ -130,7 +130,7 @@ /turf/open/floor/iron/airless, /area/ruin/space/has_grav/crashedship/fore) "fI" = ( -/obj/structure/closet/mini_fridge, +/obj/structure/closet/mini_fridge/grimy, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/ruin/space/has_grav/crashedship/fore) @@ -934,9 +934,7 @@ /obj/effect/turf_decal/siding/white{ dir = 4 }, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, +/obj/item/kirbyplants/organic/plant21, /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/white/corner{ dir = 4 diff --git a/_maps/RandomRuins/SpaceRuins/cyborg_mothership.dmm b/_maps/RandomRuins/SpaceRuins/cyborg_mothership.dmm index ccd2818eb32d6..7e6927290bc23 100644 --- a/_maps/RandomRuins/SpaceRuins/cyborg_mothership.dmm +++ b/_maps/RandomRuins/SpaceRuins/cyborg_mothership.dmm @@ -7,7 +7,7 @@ /turf/open/misc/asteroid/airless, /area/space) "d" = ( -/obj/effect/decal/remains/human/grave, +/obj/effect/decal/remains/human, /turf/open/misc/asteroid/airless, /area/space) "e" = ( @@ -50,7 +50,7 @@ /turf/open/misc/asteroid/airless, /area/space) "o" = ( -/mob/living/simple_animal/hostile/hivebot/range, +/mob/living/basic/hivebot/range, /turf/open/misc/asteroid/airless, /area/space) "p" = ( @@ -91,7 +91,7 @@ /turf/open/misc/asteroid/airless, /area/space) "D" = ( -/mob/living/simple_animal/hostile/hivebot, +/mob/living/basic/hivebot, /turf/open/misc/asteroid/airless, /area/space) "E" = ( @@ -99,7 +99,7 @@ /turf/open/misc/asteroid/airless, /area/space) "F" = ( -/mob/living/simple_animal/hostile/hivebot/mechanic, +/mob/living/basic/hivebot/mechanic, /turf/open/misc/asteroid/airless, /area/space) "G" = ( @@ -140,7 +140,7 @@ /turf/open/misc/asteroid/airless, /area/space) "Q" = ( -/mob/living/simple_animal/hostile/hivebot/strong, +/mob/living/basic/hivebot/strong, /turf/open/misc/asteroid/airless, /area/space) "R" = ( @@ -171,7 +171,7 @@ /turf/open/misc/asteroid/airless, /area/space) "Y" = ( -/mob/living/simple_animal/hostile/hivebot/range, +/mob/living/basic/hivebot/range, /obj/effect/decal/cleanable/oil/streak, /turf/open/misc/asteroid/airless, /area/space) diff --git a/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm b/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm index 07a10f3e34e89..2383c4688e3eb 100644 --- a/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm +++ b/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm @@ -27,6 +27,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/ruin/space/has_grav/dangerous_research/medical) +"ar" = ( +/obj/machinery/light/dim/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/dangerous_research/maint) "at" = ( /obj/machinery/light/dim/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -90,7 +98,7 @@ /turf/open/floor/iron/white, /area/ruin/space/has_grav/dangerous_research/medical) "aZ" = ( -/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/item/surgery_tray/full, /obj/structure/table, /turf/open/floor/plating/rust, /area/ruin/space/has_grav/dangerous_research/medical) @@ -973,15 +981,6 @@ /obj/structure/sign/clock/directional/east, /turf/open/floor/iron/dark/diagonal, /area/ruin/space/has_grav/dangerous_research) -"nT" = ( -/obj/structure/closet/crate/trashcart/filled, -/obj/effect/turf_decal/siding/dark{ - dir = 9 - }, -/obj/item/trash/cheesie, -/obj/item/trash/ready_donk, -/turf/open/floor/iron/white/small, -/area/ruin/space/has_grav/dangerous_research/dorms) "nY" = ( /obj/structure/toilet{ dir = 8 @@ -1052,13 +1051,6 @@ /obj/effect/mapping_helpers/airlock/access/all/away/science, /turf/open/floor/iron/white, /area/ruin/space/has_grav/dangerous_research/maint) -"oF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/dangerous_research/maint) "oH" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -1188,6 +1180,11 @@ /obj/effect/mapping_helpers/airlock/access/all/away/command, /turf/open/floor/wood/parquet, /area/ruin/space/has_grav/dangerous_research/dorms) +"qf" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/computer/arcade/battle, +/turf/open/floor/iron/dark/diagonal, +/area/ruin/space/has_grav/dangerous_research/dorms) "qg" = ( /obj/effect/decal/cleanable/blood/gibs/core, /obj/effect/decal/cleanable/blood/footprints{ @@ -1265,25 +1262,11 @@ "qM" = ( /turf/closed/wall, /area/ruin/space/has_grav/dangerous_research/medical) -"qO" = ( -/obj/machinery/washing_machine, -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/turf/open/floor/iron/dark/diagonal, -/area/ruin/space/has_grav/dangerous_research/dorms) "qR" = ( /obj/effect/turf_decal/stripes/asteroid, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/white, /area/ruin/space/has_grav/dangerous_research/lab) -"ra" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/oil, -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/dangerous_research/maint) "rb" = ( /obj/effect/decal/cleanable/blood/footprints{ dir = 4 @@ -1324,10 +1307,7 @@ /turf/open/floor/iron/dark, /area/ruin/space/has_grav/dangerous_research/lab) "re" = ( -/mob/living/simple_animal/hostile/heretic_summon/raw_prophet{ - AIStatus = 1; - stop_automated_movement = 0 - }, +/mob/living/basic/heretic_summon/raw_prophet/ruins, /turf/open/floor/plating/rust, /area/ruin/space/has_grav/dangerous_research/medical) "ri" = ( @@ -1699,6 +1679,16 @@ /obj/item/stack/cable_coil, /turf/open/floor/plating/rust, /area/ruin/space/has_grav/dangerous_research/lab) +"wb" = ( +/obj/structure/closet/crate/trashcart/filled, +/obj/effect/turf_decal/siding/dark{ + dir = 9 + }, +/obj/item/trash/cheesie, +/obj/item/trash/ready_donk, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/white/small, +/area/ruin/space/has_grav/dangerous_research/dorms) "wf" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -1727,17 +1717,17 @@ }, /turf/open/floor/iron/white, /area/ruin/space/has_grav/dangerous_research) -"wr" = ( +"wk" = ( /obj/effect/turf_decal/siding/purple{ dir = 4 }, -/obj/machinery/light/dim/directional/west, /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/purple/half/contrasted{ dir = 8 }, +/obj/machinery/light/broken/directional/west, /turf/open/floor/iron/white, /area/ruin/space/has_grav/dangerous_research) "wt" = ( @@ -1816,6 +1806,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/ruin/space/has_grav/dangerous_research/lab) +"xA" = ( +/obj/machinery/light/warm/directional/north, +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/diagonal, +/area/ruin/space/has_grav/dangerous_research/dorms) "xB" = ( /obj/structure/barricade/wooden, /obj/structure/extinguisher_cabinet/directional/north, @@ -1843,11 +1840,6 @@ /obj/effect/turf_decal/tile/neutral/diagonal_edge, /turf/open/floor/iron/dark/diagonal, /area/ruin/space/has_grav/dangerous_research) -"xS" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/machinery/light/broken/directional/east, -/turf/open/floor/iron/dark/diagonal, -/area/ruin/space/has_grav/dangerous_research) "xW" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible/layer4, @@ -1976,18 +1968,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/dangerous_research/medical) -"zM" = ( -/obj/structure/table, -/obj/machinery/computer/security/telescreen/entertainment/directional/south, -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/machinery/light/warm/directional/south, -/obj/item/clothing/suit/toggle/labcoat/science, -/obj/effect/mapping_helpers/atom_injector/element_injector{ - element_type = /datum/element/decal/blood; - target_type = /obj/item/clothing - }, -/turf/open/floor/iron/dark/diagonal, -/area/ruin/space/has_grav/dangerous_research/dorms) "zO" = ( /obj/effect/turf_decal/siding/dark{ dir = 4 @@ -2004,10 +1984,7 @@ /obj/effect/decal/cleanable/glass, /obj/item/shard, /obj/item/stack/sheet/iron, -/mob/living/simple_animal/hostile/heretic_summon/rust_spirit{ - AIStatus = 1; - stop_automated_movement = 0 - }, +/mob/living/basic/heretic_summon/rust_walker, /turf/open/floor/plating/rust, /area/ruin/space/has_grav/dangerous_research/lab) "zR" = ( @@ -2037,10 +2014,7 @@ dir = 1 }, /obj/effect/decal/cleanable/blood/footprints, -/mob/living/simple_animal/hostile/heretic_summon/raw_prophet{ - AIStatus = 1; - stop_automated_movement = 0 - }, +/mob/living/basic/heretic_summon/raw_prophet/ruins, /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/ruin/space/has_grav/dangerous_research/medical) @@ -2255,13 +2229,6 @@ dir = 4 }, /area/ruin/space/has_grav/dangerous_research/dorms) -"CA" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/dark/diagonal, -/area/ruin/space/has_grav/dangerous_research/dorms) "CB" = ( /obj/machinery/computer/atmos_control/noreconnect{ atmos_chambers = list("asrc_b"="Air Supply B"); @@ -2511,6 +2478,20 @@ /obj/item/stack/sheet/iron/five, /turf/open/floor/plating/rust, /area/ruin/space/has_grav/dangerous_research/medical) +"FP" = ( +/obj/structure/toilet{ + pixel_x = 15; + pixel_y = 12 + }, +/obj/structure/fluff{ + desc = "Ew, I think I see a hairball."; + icon = 'icons/obj/mining_zones/survival_pod.dmi'; + icon_state = "fan_tiny"; + name = "shower drain" + }, +/obj/machinery/shower/directional/east, +/turf/open/floor/iron/showroomfloor, +/area/ruin/space/has_grav/dangerous_research/dorms) "FZ" = ( /obj/effect/decal/cleanable/blood/footprints, /obj/effect/decal/cleanable/blood/bubblegum, @@ -2826,7 +2807,7 @@ /area/ruin/space/has_grav/dangerous_research/dorms) "La" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /turf/open/floor/iron/white, /area/ruin/space/has_grav/dangerous_research/lab) "Lc" = ( @@ -2907,6 +2888,17 @@ }, /turf/open/floor/iron/white, /area/ruin/space/has_grav/dangerous_research) +"Mb" = ( +/obj/structure/table, +/obj/machinery/computer/security/telescreen/entertainment/directional/south, +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/item/clothing/suit/toggle/labcoat/science, +/obj/effect/mapping_helpers/atom_injector/element_injector{ + element_type = /datum/element/decal/blood; + target_type = /obj/item/clothing + }, +/turf/open/floor/iron/dark/diagonal, +/area/ruin/space/has_grav/dangerous_research/dorms) "Mr" = ( /obj/effect/turf_decal/tile/purple/diagonal_edge, /obj/effect/turf_decal/stripes/corner, @@ -3124,12 +3116,6 @@ /obj/effect/turf_decal/stripes/end, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/dangerous_research) -"OR" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/machinery/light/warm/directional/north, -/obj/machinery/computer/arcade/battle, -/turf/open/floor/iron/dark/diagonal, -/area/ruin/space/has_grav/dangerous_research/dorms) "OW" = ( /obj/effect/turf_decal/tile/neutral/diagonal_edge, /obj/effect/decal/cleanable/dirt, @@ -3223,6 +3209,14 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/dangerous_research/dorms) +"PZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/oil, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/dangerous_research/maint) "Qa" = ( /obj/effect/turf_decal/siding/dark{ dir = 4 @@ -3712,20 +3706,6 @@ }, /turf/open/floor/iron/white, /area/ruin/space/has_grav/dangerous_research) -"WQ" = ( -/obj/structure/toilet{ - pixel_x = 15; - pixel_y = 12 - }, -/obj/structure/fluff{ - desc = "Ew, I think I see a hairball."; - icon = 'icons/obj/lavaland/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, -/obj/machinery/shower/directional/east, -/turf/open/floor/iron/showroomfloor, -/area/ruin/space/has_grav/dangerous_research/dorms) "Xb" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ chamber_id = "asrc_a"; @@ -3734,10 +3714,7 @@ /turf/open/floor/engine/airless, /area/ruin/space/has_grav/dangerous_research/maint) "Xh" = ( -/mob/living/simple_animal/hostile/heretic_summon/rust_spirit{ - AIStatus = 1; - stop_automated_movement = 0 - }, +/mob/living/basic/heretic_summon/rust_walker, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -3879,10 +3856,7 @@ /turf/open/floor/iron/white, /area/ruin/space/has_grav/dangerous_research/medical) "YZ" = ( -/mob/living/simple_animal/hostile/heretic_summon/rust_spirit{ - AIStatus = 1; - stop_automated_movement = 0 - }, +/mob/living/basic/heretic_summon/rust_walker, /turf/open/floor/plating/rust, /area/ruin/space/has_grav/dangerous_research/lab) "Zc" = ( @@ -3895,6 +3869,12 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/ruin/space/has_grav/dangerous_research/medical) +"Zg" = ( +/obj/machinery/washing_machine, +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/dark/diagonal, +/area/ruin/space/has_grav/dangerous_research/dorms) "Zn" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, @@ -4241,7 +4221,7 @@ ts um YL ts -WQ +FP ts rl EU @@ -4361,10 +4341,10 @@ jp ts ts ts -OR +qf OL Rt -nT +wb ts ts ts @@ -4445,7 +4425,7 @@ Qe bP Rx ts -CA +xA AO Rt HF @@ -4487,10 +4467,10 @@ jp ts ts ts -qO +Zg PJ Rt -zM +Mb ts Bm OC @@ -4616,7 +4596,7 @@ jp MO Av Xr -wr +wk Av Av db @@ -5209,7 +5189,7 @@ wt WG tE nS -xS +xN xN pk Bg @@ -5294,7 +5274,7 @@ Vf Cl Cl pu -oF +ar Qy jR On @@ -5377,7 +5357,7 @@ XI go Ob Aq -ra +PZ MU CB jR diff --git a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm index 8d926bee3a9b9..5645ac3ef152c 100644 --- a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm +++ b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm @@ -116,19 +116,6 @@ /obj/effect/mapping_helpers/apc/cell_5k, /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/crusher) -"aG" = ( -/obj/structure/closet/cardboard, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/effect/turf_decal/delivery, -/obj/machinery/light/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/deepstorage/storage) "aH" = ( /obj/structure/closet/cardboard, /obj/item/storage/box/monkeycubes, @@ -140,17 +127,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/storage) -"aJ" = ( -/obj/structure/closet/cardboard, -/obj/item/storage/box/mousetraps, -/obj/item/storage/box/mousetraps, -/obj/item/storage/box/drinkingglasses, -/obj/item/storage/box/zipties, -/obj/item/switchblade, -/obj/effect/turf_decal/delivery, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/deepstorage/storage) "aK" = ( /obj/structure/closet/cardboard, /obj/item/stack/sheet/iron/fifty{ @@ -177,31 +153,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/storage) -"aL" = ( -/obj/structure/closet/cardboard, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/plasteel{ - amount = 10 - }, -/obj/item/stack/sheet/plasteel{ - amount = 10 - }, -/obj/item/stack/sheet/plasteel{ - amount = 10 - }, -/obj/item/stack/sheet/plasteel{ - amount = 10 - }, -/obj/item/clothing/shoes/combat, -/obj/item/clothing/shoes/combat, -/obj/effect/turf_decal/delivery, -/obj/machinery/light/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/deepstorage/storage) "aO" = ( /obj/machinery/door/airlock/highsecurity{ name = "Recycling Room" @@ -299,13 +250,6 @@ /obj/effect/spawner/random/exotic/languagebook, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/storage) -"aX" = ( -/obj/structure/table, -/obj/machinery/light/directional/north, -/obj/item/storage/box/cups, -/obj/item/reagent_containers/cup/beaker, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/deepstorage/kitchen) "aY" = ( /obj/structure/table, /obj/item/reagent_containers/condiment/enzyme, @@ -318,13 +262,6 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/deepstorage/kitchen) -"ba" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 9 - }, -/obj/machinery/oven/range, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/deepstorage/kitchen) "bc" = ( /obj/structure/sink/kitchen/directional/south, /turf/open/floor/iron/cafeteria, @@ -384,14 +321,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/storage) -"bs" = ( -/obj/structure/closet/secure_closet/freezer/kitchen/all_access, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/item/storage/box/drinkingglasses, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/deepstorage/kitchen) "bt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 @@ -419,12 +348,6 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/deepstorage/kitchen) -"by" = ( -/obj/machinery/light/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/deepstorage) "bz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -444,6 +367,10 @@ "bC" = ( /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/hydroponics) +"bE" = ( +/obj/machinery/griddle, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/deepstorage/kitchen) "bG" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/decal/cleanable/dirt, @@ -497,11 +424,6 @@ /obj/effect/mapping_helpers/apc/cell_5k, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/deepstorage/kitchen) -"bO" = ( -/obj/machinery/light/directional/south, -/obj/machinery/griddle, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/deepstorage/kitchen) "bP" = ( /obj/machinery/firealarm/directional/west, /obj/effect/decal/cleanable/dirt, @@ -512,37 +434,6 @@ /obj/machinery/hydroponics/constructable, /turf/open/floor/light, /area/ruin/space/has_grav/deepstorage/hydroponics) -"bT" = ( -/obj/effect/turf_decal/delivery, -/obj/item/food/canned/beans{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/food/canned/beans{ - pixel_x = 2; - pixel_y = 3 - }, -/obj/item/food/canned/beans{ - pixel_x = -2 - }, -/obj/item/food/canned/beans{ - pixel_x = 5 - }, -/obj/item/food/canned/beans{ - pixel_x = 1; - pixel_y = -3 - }, -/obj/item/food/canned/beans{ - pixel_x = 8; - pixel_y = -3 - }, -/obj/structure/closet/crate{ - name = "food crate" - }, -/obj/machinery/light/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/deepstorage/storage) "bU" = ( /obj/effect/turf_decal/delivery, /obj/item/food/canned/beans{ @@ -610,16 +501,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) -"cl" = ( -/obj/structure/table, -/obj/item/storage/box/donkpockets, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/ruin/space/has_grav/deepstorage) "cn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 4 @@ -795,46 +676,6 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/deepstorage/armory) -"dw" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/closet/crate{ - name = "food crate" - }, -/obj/item/storage/box/donkpockets{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/storage/box/donkpockets{ - pixel_x = 2; - pixel_y = 3 - }, -/obj/item/storage/box/donkpockets{ - pixel_x = -2 - }, -/obj/item/storage/box/donkpockets{ - pixel_x = 5 - }, -/obj/item/storage/box/donkpockets{ - pixel_x = 1; - pixel_y = -3 - }, -/obj/item/storage/box/donkpockets{ - pixel_x = 8; - pixel_y = -3 - }, -/obj/machinery/light/directional/west, -/obj/item/vending_refill/cigarette{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/vending_refill/cigarette, -/obj/item/vending_refill/coffee{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/deepstorage/storage) "dx" = ( /obj/effect/turf_decal/delivery, /obj/structure/closet/crate{ @@ -923,13 +764,6 @@ "eq" = ( /turf/closed/wall/mineral/iron, /area/ruin/space/has_grav/deepstorage/airlock) -"et" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/deepstorage) "ev" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 5 @@ -953,14 +787,6 @@ /obj/item/card/id/away/deep_storage, /turf/open/floor/wood, /area/ruin/space/has_grav/deepstorage/dorm) -"ez" = ( -/obj/structure/chair/stool/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/wood, -/area/ruin/space/has_grav/deepstorage/dorm) "eB" = ( /obj/machinery/door/airlock{ name = "Personal Dorm" @@ -1038,21 +864,6 @@ /obj/effect/mapping_helpers/apc/cell_5k, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/airlock) -"eO" = ( -/obj/structure/table, -/obj/item/clothing/gloves/combat{ - pixel_x = -3; - pixel_y = 4 - }, -/obj/item/clothing/gloves/combat{ - pixel_x = 3; - pixel_y = -2 - }, -/obj/item/clothing/mask/gas, -/obj/item/clothing/mask/gas, -/obj/item/clothing/mask/gas, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/deepstorage/armory) "eP" = ( /obj/structure/table, /obj/item/storage/toolbox/drone, @@ -1094,17 +905,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/airlock) -"eY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible, -/obj/machinery/door/airlock/highsecurity{ - name = "Atmospherics and Power Storage" - }, -/obj/effect/mapping_helpers/airlock/access/all/away/general, -/obj/effect/baseturf_helper/asteroid/airless, -/turf/open/floor/iron, -/area/ruin/space/has_grav/deepstorage/power) "eZ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/layer_manifold/supply/visible, @@ -1201,14 +1001,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/airlock) -"fu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/deepstorage/airlock) "fv" = ( /obj/machinery/atmospherics/components/binary/valve{ dir = 4; @@ -1587,9 +1379,28 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/power) +"hD" = ( +/obj/machinery/door/firedoor, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/effect/baseturf_helper/asteroid/airless, +/turf/open/floor/plating, +/area/ruin/space/has_grav/deepstorage/armory) +"hK" = ( +/obj/effect/baseturf_helper/asteroid/airless, +/turf/closed/wall/mineral/iron, +/area/ruin/space/has_grav/deepstorage/dorm) "hU" = ( /turf/closed/wall/mineral/iron, /area/ruin/space/has_grav/deepstorage/storage) +"hV" = ( +/obj/effect/spawner/random/entertainment/arcade{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/ruin/space/has_grav/deepstorage) "iw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 6 @@ -1626,22 +1437,21 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/power) -"jr" = ( -/obj/structure/table, -/obj/machinery/light/directional/south, -/obj/item/reagent_containers/cup/bucket{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/reagent_containers/cup/bucket, -/turf/open/floor/iron, -/area/ruin/space/has_grav/deepstorage/hydroponics) "jE" = ( /obj/machinery/airalarm/directional/south, /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airalarm/away_general_access, /turf/open/floor/engine, /area/ruin/space/has_grav/deepstorage/pharmacy) +"ky" = ( +/obj/structure/table, +/obj/item/storage/box/donkpockets, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/ruin/space/has_grav/deepstorage) "lf" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/secure_closet/chemical, @@ -1685,6 +1495,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) +"mD" = ( +/obj/structure/table, +/obj/item/clothing/gloves/combat{ + pixel_x = -3; + pixel_y = 4 + }, +/obj/item/clothing/gloves/combat{ + pixel_x = 3; + pixel_y = -2 + }, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/deepstorage/armory) "mW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 @@ -1711,11 +1537,20 @@ }, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/deepstorage) +"ng" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/baseturf_helper/asteroid/airless, +/turf/open/floor/iron, +/area/ruin/space/has_grav/deepstorage) "oo" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) +"oE" = ( +/obj/effect/baseturf_helper/asteroid/airless, +/turf/closed/wall/mineral/iron, +/area/ruin/space/has_grav/deepstorage/crusher) "pq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 10 @@ -1741,6 +1576,14 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/airlock) +"pQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 9 + }, +/obj/machinery/oven/range, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/deepstorage/kitchen) "qm" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ chamber_id = "deepo2"; @@ -1776,19 +1619,34 @@ /obj/effect/mapping_helpers/airalarm/away_general_access, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/deepstorage/kitchen) -"qP" = ( -/obj/effect/baseturf_helper/asteroid/airless, -/turf/closed/wall/mineral/iron, -/area/ruin/space/has_grav/deepstorage/storage) -"qX" = ( -/obj/machinery/light/directional/north, +"qO" = ( +/obj/structure/closet/cardboard, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/plasteel{ + amount = 10 + }, +/obj/item/stack/sheet/plasteel{ + amount = 10 + }, +/obj/item/stack/sheet/plasteel{ + amount = 10 + }, +/obj/item/stack/sheet/plasteel{ + amount = 10 + }, +/obj/item/clothing/shoes/combat, +/obj/item/clothing/shoes/combat, +/obj/effect/turf_decal/delivery, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/ruin/space/has_grav/deepstorage) -"rc" = ( +/area/ruin/space/has_grav/deepstorage/storage) +"rl" = ( /obj/effect/baseturf_helper/asteroid/airless, -/turf/closed/wall/mineral/iron, -/area/ruin/space/has_grav/deepstorage/pharmacy) +/turf/closed/mineral/random/low_chance, +/area/ruin/space) "rz" = ( /obj/machinery/conveyor{ dir = 6; @@ -1811,31 +1669,36 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) -"sU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden{ - dir = 4 - }, -/obj/machinery/airalarm/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airalarm/away_general_access, -/turf/open/floor/iron, -/area/ruin/space/has_grav/deepstorage/airlock) "tf" = ( /obj/machinery/firealarm/directional/north, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) -"ti" = ( -/obj/machinery/hydroponics/constructable, -/obj/machinery/light/directional/north, -/turf/open/floor/light, -/area/ruin/space/has_grav/deepstorage/hydroponics) "tk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 4 }, /turf/open/floor/engine, /area/ruin/space/has_grav/deepstorage/pharmacy) +"tx" = ( +/obj/structure/closet/secure_closet/freezer/kitchen/all_access, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/item/storage/box/drinkingglasses, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/deepstorage/kitchen) +"tG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible, +/obj/machinery/door/airlock/highsecurity{ + name = "Atmospherics and Power Storage" + }, +/obj/effect/mapping_helpers/airlock/access/all/away/general, +/obj/effect/baseturf_helper/asteroid/airless, +/turf/open/floor/iron, +/area/ruin/space/has_grav/deepstorage/power) "tT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/power/apc/auto_name/directional/east, @@ -1882,6 +1745,19 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/white, /area/ruin/space/has_grav/deepstorage/pharmacy) +"uO" = ( +/obj/machinery/door/poddoor{ + id = "bunkerinterior" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 5 + }, +/obj/effect/baseturf_helper/asteroid/airless, +/turf/open/floor/iron, +/area/ruin/space/has_grav/deepstorage/airlock) "uY" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, @@ -1903,10 +1779,6 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/hydroponics) -"wf" = ( -/obj/effect/baseturf_helper/asteroid/airless, -/turf/closed/wall/mineral/iron, -/area/ruin/space/has_grav/deepstorage/hydroponics) "wl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -1949,6 +1821,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/airlock) +"xg" = ( +/obj/structure/closet/cardboard, +/obj/item/stack/sheet/mineral/silver, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/silver, +/obj/item/stack/sheet/mineral/silver, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/ruin/space/has_grav/deepstorage/storage) "xI" = ( /obj/machinery/firealarm/directional/north, /obj/effect/decal/cleanable/dirt, @@ -1968,6 +1852,16 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/airlock) +"xY" = ( +/obj/structure/table, +/obj/item/storage/medkit/toxin{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/storage/medkit/toxin, +/obj/item/storage/pill_bottle/multiver, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/deepstorage/armory) "ya" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2062,13 +1956,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/hydroponics) -"zi" = ( -/obj/machinery/sleeper{ - dir = 4 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/deepstorage/dorm) "zl" = ( /obj/structure/bed/double, /obj/item/bedsheet/dorms_double, @@ -2110,6 +1997,10 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/storage) +"Ay" = ( +/obj/effect/baseturf_helper/asteroid/airless, +/turf/closed/wall/mineral/iron, +/area/ruin/space/has_grav/deepstorage) "Az" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, @@ -2240,6 +2131,15 @@ /obj/item/bedsheet/dorms_double, /turf/open/floor/wood, /area/ruin/space/has_grav/deepstorage/dorm) +"EA" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/closet/crate/bin{ + name = "laundry bin" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/ruin/space/has_grav/deepstorage/dorm) "EP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden{ dir = 4 @@ -2251,6 +2151,41 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/storage) +"Ff" = ( +/obj/effect/turf_decal/delivery, +/obj/item/food/canned/beans{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/food/canned/beans{ + pixel_x = 2; + pixel_y = 3 + }, +/obj/item/food/canned/beans{ + pixel_x = -2 + }, +/obj/item/food/canned/beans{ + pixel_x = 5 + }, +/obj/item/food/canned/beans{ + pixel_x = 1; + pixel_y = -3 + }, +/obj/item/food/canned/beans{ + pixel_x = 8; + pixel_y = -3 + }, +/obj/structure/closet/crate{ + name = "food crate" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/ruin/space/has_grav/deepstorage/storage) +"Fv" = ( +/obj/effect/baseturf_helper/asteroid/airless, +/turf/closed/wall/mineral/iron, +/area/ruin/space/has_grav/deepstorage/hydroponics) "Fw" = ( /obj/structure/closet/crate/bin, /obj/effect/turf_decal/tile/bar/opposingcorners, @@ -2266,6 +2201,17 @@ /obj/effect/mapping_helpers/airalarm/away_general_access, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/power) +"Gp" = ( +/obj/effect/baseturf_helper/asteroid/airless, +/turf/closed/wall/mineral/iron, +/area/ruin/space/has_grav/deepstorage/kitchen) +"GI" = ( +/obj/structure/chair/stool/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/wood, +/area/ruin/space/has_grav/deepstorage/dorm) "GK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 @@ -2296,17 +2242,6 @@ /obj/effect/mapping_helpers/airalarm/away_general_access, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/storage) -"Ht" = ( -/obj/structure/table, -/obj/item/storage/medkit/toxin{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/storage/medkit/toxin, -/obj/item/storage/pill_bottle/multiver, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/deepstorage/armory) "HY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -2324,10 +2259,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) -"Ij" = ( -/obj/effect/baseturf_helper/asteroid/airless, -/turf/closed/wall/mineral/iron, -/area/ruin/space/has_grav/deepstorage/crusher) "Ik" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -2382,11 +2313,6 @@ /obj/item/reagent_containers/cup/beaker/large, /turf/open/floor/engine, /area/ruin/space/has_grav/deepstorage/pharmacy) -"JY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/baseturf_helper/asteroid/airless, -/turf/open/floor/iron, -/area/ruin/space/has_grav/deepstorage) "Kg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/stripes/line, @@ -2397,9 +2323,15 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/airlock) "Kl" = ( -/obj/effect/baseturf_helper/asteroid/airless, -/turf/closed/wall/mineral/iron, +/obj/machinery/airalarm/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/washing_machine, +/obj/effect/mapping_helpers/airalarm/away_general_access, +/turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/dorm) +"Kz" = ( +/turf/template_noop, +/area/template_noop) "KW" = ( /obj/structure/closet/crate/freezer, /obj/item/reagent_containers/blood/o_minus, @@ -2458,22 +2390,11 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) "Ma" = ( -/obj/machinery/door/firedoor, -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/effect/baseturf_helper/asteroid/airless, -/turf/open/floor/plating, -/area/ruin/space/has_grav/deepstorage/armory) -"Mp" = ( /obj/structure/table, -/obj/item/storage/medkit/brute{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/storage/medkit/brute, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/deepstorage/armory) +/obj/item/storage/box/cups, +/obj/item/reagent_containers/cup/beaker, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/deepstorage/kitchen) "Mx" = ( /obj/machinery/iv_drip, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -2489,10 +2410,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/hydroponics) -"Nh" = ( +"MV" = ( /obj/effect/baseturf_helper/asteroid/airless, /turf/closed/wall/mineral/iron, -/area/ruin/space/has_grav/deepstorage/kitchen) +/area/ruin/space/has_grav/deepstorage/pharmacy) "Nv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -2507,10 +2428,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/deepstorage/kitchen) -"NO" = ( -/obj/effect/baseturf_helper/asteroid/airless, -/turf/closed/mineral/random/low_chance, -/area/ruin/space) "Ob" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -2523,6 +2440,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/airlock) +"OM" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/bucket{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/reagent_containers/cup/bucket, +/turf/open/floor/iron, +/area/ruin/space/has_grav/deepstorage/hydroponics) "OW" = ( /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/deepstorage/kitchen) @@ -2533,14 +2459,19 @@ }, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/deepstorage/armory) -"Pw" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/closet/crate/bin{ - name = "laundry bin" - }, +"Pg" = ( /obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/light/directional/west, /turf/open/floor/iron, -/area/ruin/space/has_grav/deepstorage/dorm) +/area/ruin/space/has_grav/deepstorage) +"PG" = ( +/obj/effect/baseturf_helper/asteroid/airless, +/turf/closed/wall/mineral/iron, +/area/ruin/space/has_grav/deepstorage/storage) "PR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -2569,19 +2500,6 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/airlock) -"RA" = ( -/obj/machinery/door/poddoor{ - id = "bunkerinterior" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/delivery, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 5 - }, -/obj/effect/baseturf_helper/asteroid/airless, -/turf/open/floor/iron, -/area/ruin/space/has_grav/deepstorage/airlock) "RT" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/office/light, @@ -2612,14 +2530,16 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/power) -"SS" = ( -/obj/machinery/light/directional/east, -/obj/machinery/airalarm/directional/east, +"SU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden{ + dir = 4 + }, +/obj/machinery/airalarm/directional/west, /obj/effect/decal/cleanable/dirt, -/obj/machinery/washing_machine, /obj/effect/mapping_helpers/airalarm/away_general_access, +/obj/machinery/light/directional/west, /turf/open/floor/iron, -/area/ruin/space/has_grav/deepstorage/dorm) +/area/ruin/space/has_grav/deepstorage/airlock) "Tc" = ( /obj/machinery/smartfridge, /turf/open/floor/plating, @@ -2636,6 +2556,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/airlock) +"Uc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 5 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/ruin/space/has_grav/deepstorage) "Uj" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -2653,14 +2585,15 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) -"UP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 +"Vo" = ( +/obj/structure/table, +/obj/item/storage/medkit/brute{ + pixel_x = 4; + pixel_y = 4 }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/deepstorage) +/obj/item/storage/medkit/brute, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/deepstorage/armory) "Vs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/airlock{ @@ -2681,19 +2614,12 @@ }, /turf/open/floor/wood, /area/ruin/space/has_grav/deepstorage/dorm) -"VI" = ( -/turf/template_noop, -/area/template_noop) "Wx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) -"WE" = ( -/obj/effect/baseturf_helper/asteroid/airless, -/turf/closed/wall/mineral/iron, -/area/ruin/space/has_grav/deepstorage) "WF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 9 @@ -2797,16 +2723,18 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/dorm) -"YX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/west, +"YH" = ( +/obj/structure/closet/cardboard, +/obj/item/storage/box/mousetraps, +/obj/item/storage/box/mousetraps, +/obj/item/storage/box/drinkingglasses, +/obj/item/storage/box/zipties, +/obj/item/switchblade, +/obj/effect/turf_decal/delivery, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 5 - }, +/obj/machinery/light/directional/north, /turf/open/floor/iron, -/area/ruin/space/has_grav/deepstorage) +/area/ruin/space/has_grav/deepstorage/storage) "Zv" = ( /obj/machinery/door/airlock/highsecurity{ name = "Secure Storage" @@ -2815,6 +2743,13 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/deepstorage/armory) +"ZA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/ruin/space/has_grav/deepstorage/airlock) "ZM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 @@ -2828,72 +2763,72 @@ /area/ruin/space/has_grav/deepstorage/dorm) (1,1,1) = {" -VI -VI -VI -ab -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -ab -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -ab -ab -ab -ab -VI -VI +Kz +Kz +Kz +ab +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +ab +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +ab +ab +ab +ab +Kz +Kz "} (2,1,1) = {" -VI +Kz ab -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz ab -VI +Kz ab Iy ab @@ -2901,51 +2836,51 @@ ab ab ab ab -VI +Kz ab -VI -VI +Kz +Kz ab ab ab ab -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz ab -VI -VI -VI +Kz +Kz +Kz Iy Iy Iy ab ab -VI -VI +Kz +Kz "} (3,1,1) = {" -VI -VI +Kz +Kz ab ab ab ab -VI -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz ab ab ab @@ -2953,26 +2888,26 @@ ab Iy Iy ab -VI -VI -VI +Kz +Kz +Kz ab ab ab -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz ab ab -VI -VI -VI +Kz +Kz +Kz ab -VI -VI -VI +Kz +Kz +Kz ab ab ab @@ -2980,174 +2915,174 @@ Iy Iy ab ab -VI -VI +Kz +Kz "} (4,1,1) = {" -VI -VI +Kz +Kz ab ab ab ab -VI -VI -VI +Kz +Kz +Kz ab -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz ab Iy Iy Iy -VI -VI -VI +Kz +Kz +Kz ab ab ab -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz ab ab ab -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz ab ab ab ab -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz "} (5,1,1) = {" -VI -VI -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz ab ab -VI -VI -VI +Kz +Kz +Kz ab -VI -VI +Kz +Kz ab Iy Iy Iy -VI +Kz ab ab ab ab ab ab -VI -VI -VI +Kz +Kz +Kz ab -VI +Kz ab ab ab -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz "} (6,1,1) = {" -VI -VI +Kz +Kz ab -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz ab ab Iy Iy Iy -VI +Kz Iy Iy -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz ab ab ab ab ab ab -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz ab -VI -VI +Kz +Kz ab -VI -VI -VI +Kz +Kz +Kz "} (7,1,1) = {" -VI -VI +Kz +Kz ab -VI -VI +Kz +Kz ab ab -VI +Kz ab ab Iy @@ -3158,9 +3093,9 @@ Iy Iy Iy Iy -VI -VI -VI +Kz +Kz +Kz Iy Iy ab @@ -3169,37 +3104,37 @@ ab ab ab ab -VI -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz ab -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz "} (8,1,1) = {" -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz ab -VI +Kz ab ab Iy @@ -3224,32 +3159,32 @@ ab ab ab ab -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz "} (9,1,1) = {" -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz ab ab ab @@ -3281,27 +3216,27 @@ ab ab ab ab -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz ab ab -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz "} (10,1,1) = {" -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz ab ab ab @@ -3335,22 +3270,22 @@ ab ab ab ab -VI -VI +Kz +Kz ab ab ab -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz "} (11,1,1) = {" -VI -VI -VI +Kz +Kz +Kz ab ab ab @@ -3372,7 +3307,7 @@ hU hU hU hU -Kl +hK dB dB dB @@ -3392,18 +3327,18 @@ ab ab ab ab -VI -VI -VI +Kz +Kz +Kz ab -VI -VI +Kz +Kz "} (12,1,1) = {" -VI -VI -VI -VI +Kz +Kz +Kz +Kz ab ab ab @@ -3412,18 +3347,18 @@ ab ab ab ab -NO +rl ab ab ab ab hU -bT +bU bU cB cB cB -dw +dx dB ei ey @@ -3436,7 +3371,7 @@ ey dB ab ab -rc +MV gF gF gF @@ -3444,20 +3379,20 @@ gF ab ab ab -VI +Kz ab -VI +Kz ab -VI -VI +Kz +Kz "} (13,1,1) = {" -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz ab Iy ab @@ -3465,12 +3400,12 @@ ab ab ab ab -qP +PG hU hU hU hU -bU +Ff bU cB cB @@ -3478,13 +3413,13 @@ cB dx dB Xt -ez +GI dB Xt -ez +GI dB Xt -ez +GI dB ab ab @@ -3495,21 +3430,21 @@ yf gF ab ab -VI -VI -VI -VI +Kz +Kz +Kz +Kz ab ab ab "} (14,1,1) = {" -VI -VI +Kz +Kz ab -VI -VI -VI +Kz +Kz +Kz ab Iy ab @@ -3518,7 +3453,7 @@ ab ab ab hU -aG +xg aR bm hU @@ -3547,8 +3482,8 @@ AI gF ab ab -VI -VI +Kz +Kz ab Iy Iy @@ -3556,13 +3491,13 @@ ab ab "} (15,1,1) = {" -VI +Kz ab ab ab -VI -VI -VI +Kz +Kz +Kz Iy ab ab @@ -3591,7 +3526,7 @@ dB Vt dB gw -zi +gw gF lf tk @@ -3599,8 +3534,8 @@ ae gF ab ab -VI -VI +Kz +Kz ab Iy Iy @@ -3608,13 +3543,13 @@ Iy ab "} (16,1,1) = {" -VI +Kz ab Iy ab -VI -VI -VI +Kz +Kz +Kz Iy ab ab @@ -3627,9 +3562,9 @@ aT bo EX hU -JY +ng cE -sS +hV sS dB iw @@ -3651,13 +3586,13 @@ jE gF ab ab -VI -VI +Kz +Kz Iy Iy Iy -VI -VI +Kz +Kz "} (17,1,1) = {" ab @@ -3665,8 +3600,8 @@ ab ab Iy Iy -VI -VI +Kz +Kz Iy Iy ab @@ -3674,7 +3609,7 @@ ab ab ab hU -aJ +YH aU DI DD @@ -3685,15 +3620,15 @@ cS cS dB Yq -WE +Ay cp cp cp cp cp fP -SS -Pw +Kl +EA KW Mx gF @@ -3703,8 +3638,8 @@ JV gF ab ab -VI -VI +Kz +Kz Iy Iy Iy @@ -3712,13 +3647,13 @@ ab ab "} (18,1,1) = {" -VI +Kz ab Iy Iy ab -VI -VI +Kz +Kz Iy Iy ab @@ -3735,7 +3670,7 @@ cj ze XM XM -YX +XM XM en eD @@ -3755,8 +3690,8 @@ gF gF ab ab -VI -VI +Kz +Kz Iy Iy Iy @@ -3764,13 +3699,13 @@ ab ab "} (19,1,1) = {" -VI +Kz Iy Iy Iy ab -VI -VI +Kz +Kz Iy Iy ab @@ -3778,7 +3713,7 @@ ab ab ab hU -aL +qO aW br bH @@ -3808,20 +3743,20 @@ ab ab ab ab -VI -VI +Kz +Kz ab ab ab ab "} (20,1,1) = {" -VI +Kz ab ab -VI -VI -VI +Kz +Kz +Kz Iy Iy ab @@ -3830,12 +3765,12 @@ ab ab ab hU -Nh +Gp af af af af -cl +ky cI cT fT @@ -3860,20 +3795,20 @@ Iy ab ab ab -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz "} (21,1,1) = {" -VI +Kz ab ab -VI -VI -VI +Kz +Kz +Kz Iy Iy ab @@ -3883,8 +3818,8 @@ ab ab ab af -aX -bs +Ma +tx bI af xK @@ -3893,7 +3828,7 @@ cU fT fT qq -RA +uO BH Sp Sp @@ -3913,20 +3848,20 @@ ab ab ab ab -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz "} (22,1,1) = {" -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz ab ab ab @@ -3965,20 +3900,20 @@ Iy ab ab ab -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz "} (23,1,1) = {" -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz ab ab ab @@ -4017,19 +3952,19 @@ Iy Iy ab ab -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz "} (24,1,1) = {" -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz ab ab ab @@ -4039,7 +3974,7 @@ ai ap OW af -ba +pQ bv bL af @@ -4047,13 +3982,13 @@ cp cp cp cp -qX -Ba +fT +Uc eq eI AC jn -sU +SU eq Sn OD @@ -4069,19 +4004,19 @@ Iy Iy ab ab -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz "} (25,1,1) = {" -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz ab ab ab @@ -4105,7 +4040,7 @@ Jz Ep wm fi -fu +ZA eq fp fp @@ -4121,18 +4056,18 @@ Iy Iy ab ab -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz "} (26,1,1) = {" -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz ab ab ab @@ -4173,31 +4108,31 @@ Iy Iy ab ab -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz "} (27,1,1) = {" -VI -VI +Kz +Kz ab -VI -VI +Kz +Kz ab ab ab ab ab -Ij +oE ag ag ag ag bd bx -bO +bE af WP cO @@ -4225,18 +4160,18 @@ Iy Iy Iy ab -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz "} (28,1,1) = {" -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz ab ab ab @@ -4277,19 +4212,19 @@ ab Iy Iy ab -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz "} (29,1,1) = {" -VI +Kz ab Iy ab -VI -VI +Kz +Kz ab ab ab @@ -4300,18 +4235,18 @@ at aC aO be -by +oo bP -UP +Pg oo oo oo oo oo cE -et cP -eY +cP +tG fl fx hl @@ -4328,12 +4263,12 @@ ab ab ab Iy -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz "} (30,1,1) = {" ab @@ -4341,8 +4276,8 @@ ab Iy Iy Iy -VI -VI +Kz +Kz ab ab ab @@ -4380,21 +4315,21 @@ ab ab ab Iy -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz "} (31,1,1) = {" -VI +Kz ab ab Iy Iy -VI -VI +Kz +Kz ab ab ab @@ -4402,14 +4337,14 @@ ag am he aE -wf +Fv bA bA WG bA bA aQ -Ma +hD da Zv GY @@ -4433,20 +4368,20 @@ ab ab Iy ab -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz "} (32,1,1) = {" -VI +Kz ab ab Iy Iy -VI -VI +Kz +Kz ab ab ab @@ -4459,14 +4394,14 @@ ux bB zf cd -jr +OM aQ db dt dt pq ev -Ht +xY fb fo fA @@ -4486,20 +4421,20 @@ ab Iy Iy ab -VI -VI -VI -VI +Kz +Kz +Kz +Kz "} (33,1,1) = {" -VI -VI +Kz +Kz ab ab -VI -VI -VI -VI +Kz +Kz +Kz +Kz ab ab ag @@ -4518,7 +4453,7 @@ du dO OX ew -eO +mD fb fp Be @@ -4538,20 +4473,20 @@ ab Iy Iy ab -VI -VI -VI -VI +Kz +Kz +Kz +Kz "} (34,1,1) = {" -VI -VI +Kz +Kz ab ab -VI -VI -VI -VI +Kz +Kz +Kz +Kz ab ab ab @@ -4565,7 +4500,7 @@ MA JO yc aQ -Mp +Vo dv XD eh @@ -4590,18 +4525,18 @@ ab Iy Iy ab -VI -VI -VI -VI +Kz +Kz +Kz +Kz "} (35,1,1) = {" -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz ab ab ab @@ -4642,18 +4577,18 @@ ab Iy Iy Iy -VI -VI -VI -VI +Kz +Kz +Kz +Kz "} (36,1,1) = {" -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz ab ab ab @@ -4688,24 +4623,24 @@ fp ab ab ab -VI +Kz ab ab ab Iy Iy -VI -VI -VI -VI +Kz +Kz +Kz +Kz "} (37,1,1) = {" -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz ab ab ab @@ -4715,7 +4650,7 @@ ab ab ab aQ -ti +bS LB bS cg @@ -4740,26 +4675,26 @@ ab ab ab ab -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz "} (38,1,1) = {" -VI -VI -VI -VI +Kz +Kz +Kz +Kz ab -VI -VI -VI +Kz +Kz +Kz ab ab ab @@ -4790,30 +4725,30 @@ ab ab ab ab -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz "} (39,1,1) = {" -VI -VI -VI +Kz +Kz +Kz ab ab -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz ab ab ab @@ -4842,32 +4777,32 @@ ab ab ab ab -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz "} (40,1,1) = {" -VI -VI -VI +Kz +Kz +Kz ab ab -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz ab ab ab @@ -4895,33 +4830,33 @@ ab ab ab ab -VI -VI -VI +Kz +Kz +Kz ab -VI -VI -VI +Kz +Kz +Kz ab -VI -VI -VI +Kz +Kz +Kz "} (41,1,1) = {" -VI -VI -VI +Kz +Kz +Kz Iy ab -VI -VI -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz ab ab ab @@ -4947,33 +4882,33 @@ ab ab Iy Iy -VI -VI -VI +Kz +Kz +Kz ab -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz "} (42,1,1) = {" -VI -VI -VI +Kz +Kz +Kz Iy Iy Iy Iy -VI -VI +Kz +Kz ab -VI -VI -VI -VI +Kz +Kz +Kz +Kz ab ab ab @@ -4982,9 +4917,9 @@ Iy Iy Iy Iy -VI -VI -VI +Kz +Kz +Kz Iy Iy Iy @@ -4999,44 +4934,44 @@ ab ab Iy Iy -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz Iy Iy ab -VI -VI +Kz +Kz "} (43,1,1) = {" -VI +Kz ab ab Iy Iy Iy Iy -VI -VI -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz ab ab Iy Iy ab -VI -VI -VI -VI +Kz +Kz +Kz +Kz Iy Iy Iy @@ -5046,13 +4981,13 @@ Iy ab ab ab -VI +Kz ab ab Iy Iy -VI -VI +Kz +Kz ab Iy Iy @@ -5060,11 +4995,11 @@ Iy Iy Iy ab -VI -VI +Kz +Kz "} (44,1,1) = {" -VI +Kz ab ab ab @@ -5072,25 +5007,25 @@ Iy Iy ab ab -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz ab -VI -VI +Kz +Kz ab ab Iy Iy -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz Iy Iy Iy @@ -5098,13 +5033,13 @@ Iy Iy Iy ab -VI +Kz ab ab ab ab -VI -VI +Kz +Kz ab ab Iy @@ -5112,37 +5047,37 @@ Iy Iy ab ab -VI -VI +Kz +Kz "} (45,1,1) = {" -VI -VI +Kz +Kz ab ab Iy Iy ab -VI -VI +Kz +Kz ab ab -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz ab ab ab -VI -VI +Kz +Kz Iy Iy Iy @@ -5150,228 +5085,228 @@ Iy Iy Iy Iy -VI -VI -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz ab ab ab ab ab -VI -VI +Kz +Kz "} (46,1,1) = {" -VI -VI -VI -VI +Kz +Kz +Kz +Kz Iy Iy ab -VI -VI +Kz +Kz ab ab ab ab -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz ab ab ab ab ab -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz ab ab ab -VI -VI -VI -VI +Kz +Kz +Kz +Kz "} (47,1,1) = {" -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz ab ab ab ab -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz ab ab ab ab -VI -VI -VI +Kz +Kz +Kz ab ab ab ab -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz "} (48,1,1) = {" -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -ab -ab -ab -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -ab -ab -ab -ab -VI -VI -VI -VI -ab -VI -VI -VI -ab -VI -VI -ab -VI -VI -VI -VI -VI -ab -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +ab +ab +ab +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +ab +ab +ab +ab +Kz +Kz +Kz +Kz +ab +Kz +Kz +Kz +ab +Kz +Kz +ab +Kz +Kz +Kz +Kz +Kz +ab +Kz +Kz "} (49,1,1) = {" -VI -VI -VI -VI -VI -VI -VI -VI -ab -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -ab -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +ab +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +ab +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz "} diff --git a/_maps/RandomRuins/SpaceRuins/derelict7.dmm b/_maps/RandomRuins/SpaceRuins/derelict7.dmm index 83cd21565503b..50d683c353b71 100644 --- a/_maps/RandomRuins/SpaceRuins/derelict7.dmm +++ b/_maps/RandomRuins/SpaceRuins/derelict7.dmm @@ -66,7 +66,7 @@ /area/ruin/space/has_grav) "gw" = ( /obj/structure/lattice, -/obj/item/stack/tile/iron, +/obj/item/stack/tile/iron/base, /obj/structure/disposalpipe/broken, /turf/template_noop, /area/template_noop) @@ -106,11 +106,11 @@ /area/ruin/space/has_grav) "lQ" = ( /obj/structure/lattice, -/obj/item/stack/tile/iron, +/obj/item/stack/tile/iron/base, /turf/template_noop, /area/template_noop) "lU" = ( -/obj/item/stack/tile/iron, +/obj/item/stack/tile/iron/base, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/ruin/space/has_grav) @@ -118,7 +118,7 @@ /turf/open/floor/iron/airless, /area/ruin/space/has_grav) "or" = ( -/obj/item/stack/tile/iron, +/obj/item/stack/tile/iron/base, /turf/template_noop, /area/template_noop) "oy" = ( @@ -187,7 +187,7 @@ /turf/open/floor/plating/airless, /area/ruin/space/has_grav) "tH" = ( -/obj/item/stack/tile/iron, +/obj/item/stack/tile/iron/base, /obj/item/stack/rods, /turf/template_noop, /area/template_noop) @@ -205,7 +205,7 @@ /area/ruin/space/has_grav) "wz" = ( /obj/structure/lattice, -/obj/item/stack/tile/iron, +/obj/item/stack/tile/iron/base, /obj/item/stack/sheet/iron, /turf/template_noop, /area/template_noop) @@ -520,11 +520,6 @@ /obj/item/stack/rods, /turf/template_noop, /area/template_noop) -"YX" = ( -/obj/structure/lattice, -/obj/effect/decal/cleanable/glass, -/turf/template_noop, -/area/template_noop) (1,1,1) = {" DY @@ -802,7 +797,7 @@ eP eP gi dy -YX +CT Vn rN eP diff --git a/_maps/RandomRuins/SpaceRuins/derelict8.dmm b/_maps/RandomRuins/SpaceRuins/derelict8.dmm index 2370c6c89a114..41b53c9b81668 100644 --- a/_maps/RandomRuins/SpaceRuins/derelict8.dmm +++ b/_maps/RandomRuins/SpaceRuins/derelict8.dmm @@ -1,6 +1,6 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "bY" = ( -/obj/item/stack/tile/iron, +/obj/item/stack/tile/iron/base, /obj/structure/lattice, /turf/template_noop, /area/template_noop) @@ -20,7 +20,7 @@ /area/ruin/space/has_grav) "dL" = ( /obj/structure/lattice, -/obj/item/stack/tile/iron, +/obj/item/stack/tile/iron/base, /turf/template_noop, /area/template_noop) "dS" = ( @@ -133,12 +133,12 @@ /turf/open/floor/wood/tile, /area/ruin/space/has_grav) "zc" = ( -/obj/item/stack/tile/iron, +/obj/item/stack/tile/iron/base, /obj/item/stack/rods, /turf/template_noop, /area/template_noop) "zh" = ( -/obj/item/stack/tile/iron, +/obj/item/stack/tile/iron/base, /turf/template_noop, /area/template_noop) "zt" = ( diff --git a/_maps/RandomRuins/SpaceRuins/derelict9.dmm b/_maps/RandomRuins/SpaceRuins/derelict9.dmm new file mode 100644 index 0000000000000..2fa948a60fae3 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/derelict9.dmm @@ -0,0 +1,900 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/mineral/random, +/area/ruin/space) +"b" = ( +/turf/closed/indestructible/riveted, +/area/ruin/space/has_grav) +"c" = ( +/obj/item/storage/toolbox/mechanical/old, +/obj/structure/rack, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/maintenance/three, +/turf/open/floor/plating/airless, +/area/ruin/space) +"h" = ( +/obj/structure/closet/crate, +/obj/item/weldingtool, +/obj/item/clothing/glasses/welding, +/turf/open/misc/asteroid/airless, +/area/ruin/space) +"j" = ( +/obj/structure/closet/crate/secure/loot, +/turf/open/floor/pod/dark, +/area/ruin/space/has_grav) +"l" = ( +/turf/template_noop, +/area/template_noop) +"m" = ( +/turf/closed/wall/rock, +/area/ruin/space) +"q" = ( +/obj/effect/mob_spawn/corpse/human/pirate/melee/space, +/obj/effect/decal/cleanable/blood, +/turf/open/misc/asteroid/airless, +/area/ruin/space) +"r" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/misc/asteroid/airless, +/area/ruin/space) +"s" = ( +/obj/effect/mapping_helpers/bombable_wall, +/turf/closed/indestructible/riveted, +/area/ruin/space/has_grav) +"t" = ( +/obj/effect/gibspawner/human/bodypartless, +/obj/effect/mob_spawn/corpse/human/charredskeleton, +/turf/open/misc/asteroid/airless, +/area/ruin/space) +"u" = ( +/obj/structure/rack, +/obj/effect/spawner/random/clothing/beret_or_rabbitears, +/obj/effect/spawner/random/clothing/mafia_outfit, +/turf/open/floor/pod/dark, +/area/ruin/space/has_grav) +"x" = ( +/turf/open/floor/pod, +/area/ruin/space/has_grav) +"B" = ( +/obj/structure/rack, +/obj/effect/spawner/random/clothing/funny_hats, +/obj/effect/spawner/random/clothing/gloves, +/turf/open/floor/pod/dark, +/area/ruin/space/has_grav) +"C" = ( +/obj/structure/rack, +/obj/effect/spawner/random/clothing/mafia_outfit, +/obj/effect/spawner/random/clothing/pirate_or_bandana, +/turf/open/floor/pod/dark, +/area/ruin/space/has_grav) +"E" = ( +/obj/structure/mineral_door/wood, +/turf/open/misc/asteroid/airless, +/area/ruin/space) +"G" = ( +/obj/structure/safe, +/obj/item/clothing/head/collectable/petehat, +/turf/open/floor/pod/light, +/area/ruin/space/has_grav) +"I" = ( +/obj/machinery/porta_turret/syndicate/pod, +/turf/closed/wall/r_wall, +/area/ruin/space) +"J" = ( +/obj/item/gun/energy/laser/musket, +/obj/effect/decal/cleanable/blood, +/turf/open/misc/asteroid/airless, +/area/ruin/space) +"K" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless, +/area/ruin/space) +"M" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/misc/asteroid/airless, +/area/ruin/space) +"O" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating/airless, +/area/ruin/space) +"Q" = ( +/turf/open/floor/pod/light, +/area/ruin/space/has_grav) +"S" = ( +/obj/item/flashlight/lantern, +/turf/open/misc/asteroid/airless, +/area/ruin/space) +"T" = ( +/turf/open/misc/asteroid/airless, +/area/ruin/space) +"U" = ( +/obj/structure/rack, +/obj/effect/spawner/random/clothing/kittyears_or_rabbitears, +/obj/effect/spawner/random/clothing/lizardboots, +/turf/open/floor/pod/dark, +/area/ruin/space/has_grav) +"X" = ( +/obj/structure/rack, +/obj/effect/spawner/random/clothing/twentyfive_percent_cyborg_mask, +/obj/effect/spawner/random/clothing/costume, +/turf/open/floor/pod/dark, +/area/ruin/space/has_grav) +"Y" = ( +/obj/machinery/light/dim/directional/north, +/turf/open/floor/pod, +/area/ruin/space/has_grav) +"Z" = ( +/turf/closed/indestructible/fakedoor, +/area/ruin/space/has_grav) + +(1,1,1) = {" +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +a +a +a +l +l +l +l +"} +(2,1,1) = {" +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +T +l +l +a +l +"} +(3,1,1) = {" +l +l +l +l +l +l +l +a +l +l +l +l +l +l +l +l +l +l +l +l +l +l +a +a +l +l +l +l +l +l +l +l +l +"} +(4,1,1) = {" +l +l +l +l +T +a +a +a +T +l +l +I +l +l +l +l +l +l +l +l +l +l +T +l +l +l +l +l +l +l +l +l +a +"} +(5,1,1) = {" +T +T +T +T +T +a +a +m +r +T +r +a +l +a +l +l +l +l +l +l +l +l +l +l +l +l +l +T +a +a +l +l +T +"} +(6,1,1) = {" +l +T +T +a +a +a +a +T +q +T +m +a +a +a +a +l +l +l +l +l +l +l +l +l +l +l +T +a +a +T +l +l +l +"} +(7,1,1) = {" +l +T +a +a +a +a +a +J +a +a +a +a +a +a +a +a +a +a +l +l +l +l +l +l +l +l +l +a +a +T +l +l +l +"} +(8,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +O +m +a +a +a +a +a +T +T +T +T +l +l +l +a +r +l +l +l +l +"} +(9,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +T +T +K +K +T +O +a +a +a +a +T +T +T +T +T +l +l +l +l +l +l +l +"} +(10,1,1) = {" +a +a +a +a +a +a +a +a +b +b +b +s +b +b +r +T +T +K +a +a +a +a +T +T +T +l +l +l +l +l +l +T +T +"} +(11,1,1) = {" +l +a +a +a +a +a +a +a +b +j +B +X +U +b +T +t +T +m +a +a +a +a +T +T +T +l +l +l +l +l +l +a +a +"} +(12,1,1) = {" +l +l +a +a +a +a +a +a +b +x +x +x +x +b +K +T +T +a +a +a +a +a +a +T +T +l +l +l +l +l +l +l +l +"} +(13,1,1) = {" +l +T +T +a +a +a +a +a +b +Y +G +Q +x +Z +K +K +r +a +a +a +a +a +a +T +T +l +l +l +l +l +l +l +l +"} +(14,1,1) = {" +l +l +T +T +a +a +a +a +b +x +x +x +x +b +c +T +S +m +a +a +a +a +T +T +l +l +l +l +l +T +l +l +l +"} +(15,1,1) = {" +l +l +l +l +l +a +a +a +b +u +j +C +j +b +r +r +T +T +r +m +a +a +T +l +l +l +l +T +T +T +l +l +l +"} +(16,1,1) = {" +l +l +l +l +a +a +a +a +b +b +b +b +b +b +K +r +m +a +r +E +T +T +T +l +l +T +T +T +T +T +a +l +l +"} +(17,1,1) = {" +l +l +l +l +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +m +T +r +T +T +T +a +T +T +a +a +a +l +l +"} +(18,1,1) = {" +l +l +l +l +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +M +h +a +a +a +a +a +a +a +a +l +l +"} +(19,1,1) = {" +l +l +l +l +l +a +a +a +a +a +a +T +T +T +T +T +T +a +a +a +a +a +a +a +a +a +a +a +a +a +a +T +l +"} +(20,1,1) = {" +l +l +l +l +l +l +T +T +a +a +T +T +l +l +l +T +T +T +a +a +a +a +a +a +a +a +a +a +a +a +l +l +l +"} +(21,1,1) = {" +l +l +l +l +l +l +l +l +T +T +T +l +l +l +l +l +l +T +T +a +a +a +a +a +a +a +a +T +T +T +l +l +l +"} +(22,1,1) = {" +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +a +a +T +T +T +l +l +l +l +"} diff --git a/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm b/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm index cfda5e1c7f0f5..1f616ced8d279 100644 --- a/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm +++ b/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm @@ -36,14 +36,6 @@ }, /turf/open/floor/pod/light, /area/ruin/space/has_grav/derelictsulaco) -"bU" = ( -/obj/effect/turf_decal/tile/red/anticorner{ - dir = 1 - }, -/turf/open/floor/iron/smooth_corner{ - dir = 2 - }, -/area/ruin/space/has_grav/derelictsulaco) "bV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/light, @@ -207,12 +199,6 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/derelictsulaco) -"gL" = ( -/obj/machinery/light/broken/directional/south, -/obj/effect/decal/cleanable/xenoblood/xsplatter, -/obj/effect/turf_decal/tile/red/half, -/turf/open/floor/iron/smooth_edge, -/area/ruin/space/has_grav/derelictsulaco) "hi" = ( /turf/template_noop, /area/template_noop) @@ -330,6 +316,19 @@ /obj/structure/alien/weeds, /turf/open/floor/plating, /area/ruin/space/has_grav/derelictsulaco) +"kY" = ( +/obj/structure/table/reinforced, +/obj/item/kirbyplants{ + pixel_y = 10 + }, +/obj/machinery/camera/directional/north{ + network = list() + }, +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 1 + }, +/turf/open/floor/iron/smooth_corner, +/area/ruin/space/has_grav/derelictsulaco) "ld" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/north, @@ -354,19 +353,6 @@ /obj/machinery/pdapainter, /turf/open/floor/wood, /area/ruin/space/has_grav/derelictsulaco) -"ln" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/frame/computer{ - anchored = 1 - }, -/obj/effect/turf_decal/tile/red/anticorner{ - dir = 1 - }, -/turf/open/floor/iron/smooth_corner{ - dir = 2 - }, -/area/ruin/space/has_grav/derelictsulaco) "lq" = ( /turf/open/floor/iron/showroomfloor, /area/ruin/space/has_grav/derelictsulaco) @@ -441,6 +427,11 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/derelictsulaco) +"mU" = ( +/obj/effect/decal/cleanable/xenoblood/xsplatter, +/obj/effect/turf_decal/tile/red/half, +/turf/open/floor/iron/smooth_edge, +/area/ruin/space/has_grav/derelictsulaco) "na" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/machinery/computer/terminal/sulaco/map, @@ -448,12 +439,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/light, /area/ruin/space/has_grav/derelictsulaco) -"nk" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/obj/machinery/light/dim/directional/east, -/turf/open/floor/plating, -/area/ruin/space/has_grav/derelictsulaco) "nn" = ( /obj/structure/alien/weeds, /obj/structure/alien/resin/wall, @@ -464,11 +449,6 @@ /obj/item/stack/tile/iron/smooth_half, /turf/template_noop, /area/template_noop) -"nJ" = ( -/obj/machinery/light/dim/directional/east, -/obj/structure/alien/weeds, -/turf/open/floor/iron/smooth, -/area/ruin/space/has_grav/derelictsulaco) "ob" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -482,6 +462,13 @@ "oV" = ( /turf/open/floor/plating/airless, /area/ruin/space) +"pb" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/barricade/sandbags, +/obj/structure/cable, +/obj/item/light/tube/broken, +/turf/open/floor/pod/light, +/area/ruin/space/has_grav/derelictsulaco) "pv" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, @@ -490,14 +477,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/ruin/space/has_grav/derelictsulaco) -"qc" = ( -/obj/structure/alien/weeds, -/obj/machinery/camera/directional/west{ - network = list() - }, -/obj/effect/decal/remains/xeno/larva, -/turf/open/floor/plating, -/area/ruin/space/has_grav/derelictsulaco) "qx" = ( /obj/effect/decal/cleanable/robot_debris, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -571,6 +550,14 @@ /obj/structure/girder/reinforced, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/derelictsulaco) +"sw" = ( +/obj/structure/alien/weeds, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/light/floor, +/turf/open/floor/iron/smooth, +/area/ruin/space/has_grav/derelictsulaco) "sE" = ( /obj/structure/alien/weeds, /obj/structure/alien/resin/wall, @@ -622,6 +609,26 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/derelictsulaco) +"ug" = ( +/obj/item/radio/intercom/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/layer4{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/carpet, +/area/ruin/space/has_grav/derelictsulaco) +"uk" = ( +/obj/machinery/light/dim/directional/south, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/frame/computer{ + dir = 1; + anchored = 1 + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/smooth_edge, +/area/ruin/space/has_grav/derelictsulaco) "ur" = ( /obj/machinery/door/airlock/command/glass{ name = "Bridge Office" @@ -671,17 +678,6 @@ /obj/structure/cable, /turf/open/floor/iron/smooth_edge, /area/ruin/space/has_grav/derelictsulaco) -"vw" = ( -/obj/machinery/light/dim/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/wood, -/area/ruin/space/has_grav/derelictsulaco) -"vz" = ( -/obj/effect/decal/cleanable/glass, -/obj/structure/cable, -/turf/open/floor/pod/light, -/area/ruin/space/has_grav/derelictsulaco) "vJ" = ( /obj/effect/turf_decal/siding/wideplating/dark/corner{ dir = 4 @@ -701,11 +697,6 @@ }, /turf/open/floor/pod/light, /area/ruin/space/has_grav/derelictsulaco) -"wL" = ( -/obj/structure/alien/weeds, -/obj/machinery/light/dim/directional/west, -/turf/open/floor/plating, -/area/ruin/space/has_grav/derelictsulaco) "wR" = ( /obj/effect/mapping_helpers/burnt_floor, /obj/effect/decal/cleanable/blood/xtracks{ @@ -730,6 +721,10 @@ /obj/effect/decal/cleanable/shreds, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/derelictsulaco) +"xP" = ( +/obj/structure/alien/weeds, +/turf/open/floor/iron/smooth, +/area/ruin/space/has_grav/derelictsulaco) "yb" = ( /obj/structure/cable, /turf/open/floor/iron/tgmcemblem{ @@ -805,12 +800,6 @@ /obj/machinery/status_display, /turf/closed/wall/r_wall, /area/ruin/space/has_grav/derelictsulaco) -"zI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/robot_debris/limb, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/iron/smooth, -/area/ruin/space/has_grav/derelictsulaco) "zZ" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/computer/terminal/sulaco/overwatch/main{ @@ -866,6 +855,16 @@ /obj/effect/mapping_helpers/apc/unlocked, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/derelictsulaco) +"DD" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/computer/terminal/sulaco/map, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron/smooth_edge{ + dir = 1 + }, +/area/ruin/space/has_grav/derelictsulaco) "DJ" = ( /obj/item/storage/medkit, /turf/open/floor/iron/smooth, @@ -902,6 +901,11 @@ /obj/item/chair/plastic, /turf/open/floor/plating, /area/ruin/space/has_grav/derelictsulaco) +"Fc" = ( +/obj/structure/alien/weeds, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/iron/smooth, +/area/ruin/space/has_grav/derelictsulaco) "Fo" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/west, @@ -911,6 +915,14 @@ }, /turf/open/floor/circuit, /area/ruin/space/has_grav/derelictsulaco) +"Fs" = ( +/obj/structure/frame/computer{ + dir = 1; + anchored = 1 + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/smooth_edge, +/area/ruin/space/has_grav/derelictsulaco) "FA" = ( /obj/structure/alien/weeds, /obj/effect/decal/cleanable/xenoblood/xgibs/up, @@ -947,10 +959,12 @@ /obj/structure/alien/weeds/node, /turf/open/floor/plating/airless, /area/ruin/space) -"Gq" = ( -/obj/structure/alien/weeds, -/obj/machinery/light/broken/directional/west, -/turf/open/floor/iron/smooth, +"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/machinery/light/floor/broken, +/turf/open/floor/carpet, /area/ruin/space/has_grav/derelictsulaco) "GL" = ( /obj/effect/mapping_helpers/burnt_floor, @@ -965,16 +979,6 @@ /obj/item/toy/plush/rouny, /turf/open/floor/wood, /area/ruin/space/has_grav/derelictsulaco) -"Hc" = ( -/obj/machinery/light/broken/directional/west, -/obj/item/radio/intercom/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/layer4{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/ruin/space/has_grav/derelictsulaco) "Hh" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/glass, @@ -994,12 +998,6 @@ dir = 8 }, /area/ruin/space/has_grav/derelictsulaco) -"Hr" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/barricade/sandbags, -/obj/structure/cable, -/turf/open/floor/pod/light, -/area/ruin/space/has_grav/derelictsulaco) "HC" = ( /obj/structure/alien/weeds, /obj/effect/decal/cleanable/blood/tracks{ @@ -1049,18 +1047,17 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/derelictsulaco) +"JO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/wood, +/area/ruin/space/has_grav/derelictsulaco) "JT" = ( /obj/structure/alien/weeds, /obj/machinery/door/poddoor/shutters/preopen, /obj/structure/alien/resin/membrane, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/derelictsulaco) -"Ke" = ( -/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/carpet, -/area/ruin/space/has_grav/derelictsulaco) "Ki" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 1 @@ -1146,6 +1143,12 @@ /obj/structure/bed, /turf/open/floor/wood, /area/ruin/space/has_grav/derelictsulaco) +"LA" = ( +/obj/effect/decal/cleanable/glass, +/obj/structure/cable, +/obj/machinery/light/floor/broken, +/turf/open/floor/pod/light, +/area/ruin/space/has_grav/derelictsulaco) "LW" = ( /obj/structure/cable, /turf/open/floor/iron/tgmcemblem/center{ @@ -1186,21 +1189,6 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/derelictsulaco) -"Mv" = ( -/obj/structure/table/reinforced, -/obj/item/kirbyplants{ - pixel_y = 10 - }, -/obj/machinery/camera/directional/north{ - network = list() - }, -/obj/effect/turf_decal/tile/red/anticorner{ - dir = 1 - }, -/turf/open/floor/iron/smooth_corner{ - dir = 2 - }, -/area/ruin/space/has_grav/derelictsulaco) "MG" = ( /obj/structure/alien/weeds, /obj/effect/decal/cleanable/xenoblood/xgibs, @@ -1221,6 +1209,11 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/derelictsulaco) +"Nj" = ( +/obj/structure/alien/weeds, +/obj/effect/gibspawner/xeno/bodypartless, +/turf/open/floor/plating/airless, +/area/ruin/space) "Nu" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1275,6 +1268,11 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/derelictsulaco) +"OW" = ( +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/iron/smooth, +/area/ruin/space/has_grav/derelictsulaco) "Pq" = ( /obj/structure/alien/weeds, /obj/effect/decal/cleanable/blood/tracks{ @@ -1306,6 +1304,15 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/derelictsulaco) +"QC" = ( +/obj/machinery/computer/crew, +/obj/structure/cable, +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 1 + }, +/turf/open/floor/iron/smooth_corner, +/area/ruin/space/has_grav/derelictsulaco) "QF" = ( /obj/effect/decal/cleanable/blood/tracks{ dir = 9 @@ -1328,13 +1335,6 @@ /obj/item/trash/flare, /turf/open/floor/plating/airless, /area/ruin/space) -"Rm" = ( -/obj/structure/alien/weeds, -/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/smooth, -/area/ruin/space/has_grav/derelictsulaco) "RA" = ( /obj/machinery/door/airlock/command/glass{ name = "Bridge" @@ -1400,13 +1400,6 @@ /obj/machinery/door/window/left/directional/east, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/derelictsulaco) -"SF" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp{ - on = 0 - }, -/turf/open/floor/wood, -/area/ruin/space/has_grav/derelictsulaco) "SS" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 10 @@ -1428,6 +1421,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/derelictsulaco) +"Ti" = ( +/obj/machinery/light/floor, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/robot_debris/limb, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/iron/smooth, +/area/ruin/space/has_grav/derelictsulaco) +"TD" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp, +/turf/open/floor/wood, +/area/ruin/space/has_grav/derelictsulaco) "TI" = ( /turf/open/floor/iron/tgmcemblem, /area/ruin/space/has_grav/derelictsulaco) @@ -1463,12 +1468,29 @@ }, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/derelictsulaco) +"Ut" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/frame/computer{ + anchored = 1 + }, +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 1 + }, +/turf/open/floor/iron/smooth_corner, +/area/ruin/space/has_grav/derelictsulaco) "UH" = ( /obj/structure/alien/weeds, /obj/structure/rack, /obj/item/storage/medkit/advanced, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/derelictsulaco) +"UO" = ( +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 1 + }, +/turf/open/floor/iron/smooth_corner, +/area/ruin/space/has_grav/derelictsulaco) "UP" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/frame/machine, @@ -1550,12 +1572,6 @@ /obj/item/storage/lockbox/dueling, /turf/open/floor/iron/smooth_edge, /area/ruin/space/has_grav/derelictsulaco) -"WR" = ( -/obj/machinery/light/broken/directional/west, -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/iron/smooth, -/area/ruin/space/has_grav/derelictsulaco) "Xg" = ( /obj/structure/cable, /obj/machinery/power/floodlight{ @@ -1575,6 +1591,15 @@ }, /turf/open/floor/plating/airless, /area/ruin/space) +"XK" = ( +/obj/structure/alien/weeds, +/obj/machinery/camera/directional/west{ + network = list() + }, +/obj/effect/decal/remains/xeno/larva, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/plating, +/area/ruin/space/has_grav/derelictsulaco) "Yh" = ( /obj/effect/mapping_helpers/burnt_floor, /obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ @@ -1582,15 +1607,6 @@ }, /turf/open/floor/pod/light, /area/ruin/space/has_grav/derelictsulaco) -"Yk" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/computer/terminal/sulaco/map, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/smooth_edge{ - dir = 1 - }, -/area/ruin/space/has_grav/derelictsulaco) "Yn" = ( /obj/structure/alien/resin/wall, /obj/effect/turf_decal/tile/red/half{ @@ -1623,26 +1639,12 @@ dir = 8 }, /area/ruin/space) -"YO" = ( -/obj/machinery/light/dim/directional/north, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron/smooth_edge{ - dir = 1 - }, -/area/ruin/space/has_grav/derelictsulaco) "YQ" = ( /obj/effect/turf_decal/tile/red{ dir = 8 }, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/derelictsulaco) -"Zc" = ( -/obj/structure/lattice, -/obj/effect/gibspawner/xeno/bodypartless, -/turf/template_noop, -/area/template_noop) "ZA" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/blood/xtracks{ @@ -1659,15 +1661,6 @@ }, /turf/open/floor/wood, /area/ruin/space/has_grav/derelictsulaco) -"ZL" = ( -/obj/structure/frame/computer{ - dir = 1; - anchored = 1 - }, -/obj/machinery/light/dim/directional/south, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/smooth_edge, -/area/ruin/space/has_grav/derelictsulaco) "ZP" = ( /obj/effect/decal/cleanable/blood/footprints{ dir = 1 @@ -1675,17 +1668,6 @@ /obj/structure/cable, /turf/open/floor/pod/light, /area/ruin/space/has_grav/derelictsulaco) -"ZX" = ( -/obj/machinery/computer/crew, -/obj/structure/cable, -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/tile/red/anticorner{ - dir = 1 - }, -/turf/open/floor/iron/smooth_corner{ - dir = 2 - }, -/area/ruin/space/has_grav/derelictsulaco) "ZZ" = ( /obj/structure/lattice, /turf/template_noop, @@ -2159,7 +2141,7 @@ Ki lf VT yy -bU +UO Hj lr rW @@ -2199,7 +2181,7 @@ xL WC cl ym -ZL +Fs VT Ki lf @@ -2228,10 +2210,10 @@ hi Ki VT VT -ZX +QC FQ zw -zI +Ti RZ YQ jq @@ -2262,7 +2244,7 @@ hi hi Ki VT -Mv +kY QF WG bI @@ -2297,7 +2279,7 @@ hi hi VT zH -YO +mi KY jn tp @@ -2305,7 +2287,7 @@ gi rA QP cu -gL +mU zH VT hi @@ -2366,7 +2348,7 @@ lf hi hi VT -Yk +DD mi tq eU @@ -2376,7 +2358,7 @@ ib wb DJ cW -Mi +uk VT hi hi @@ -2401,12 +2383,12 @@ ag dw dw VT -ln +Ut rM KC uP yU -vz +LA SA ZP Qp @@ -2506,8 +2488,8 @@ lS UH JT Lv -wL -qc +Bk +XK Bk Bk jI @@ -2515,7 +2497,7 @@ dJ Yh mg HC -Gq +Fc gx VT ub @@ -2651,7 +2633,7 @@ EQ Bk mS sR -Hr +pb EK zA Bk @@ -2690,11 +2672,11 @@ RC lF Ek EQ -nk +Lv Aa VT Lr -vw +JO VT VT fd @@ -2728,7 +2710,7 @@ VT VT VT VT -SF +TD BQ Lz VT @@ -2756,10 +2738,10 @@ iF yS VT wR -WR +OW hU VT -Hc +ug SD tL Cs @@ -2791,11 +2773,11 @@ pF pF VT vl -Rm +sw TL ur tL -Ke +Gy LY VT Ss @@ -2826,7 +2808,7 @@ fd fd VT Ie -nJ +xP dM VT PZ @@ -2970,8 +2952,8 @@ RP Oo Vz dO -Zc -CU +ZZ +Nj YA Ot oV diff --git a/_maps/RandomRuins/SpaceRuins/fasttravel.dmm b/_maps/RandomRuins/SpaceRuins/fasttravel.dmm index ec8bb96956baa..2a8a8a2226a9c 100644 --- a/_maps/RandomRuins/SpaceRuins/fasttravel.dmm +++ b/_maps/RandomRuins/SpaceRuins/fasttravel.dmm @@ -14,13 +14,6 @@ }, /turf/open/floor/plating/airless, /area/ruin/space/massdriverhub) -"cj" = ( -/obj/structure/cable, -/obj/machinery/light/directional/east, -/turf/open/floor/catwalk_floor{ - initial_gas_mix = "TEMP=2.7" - }, -/area/ruin/space/massdriverhub) "cE" = ( /obj/machinery/conveyor/inverted{ dir = 9; @@ -191,12 +184,6 @@ /obj/structure/disposalpipe/broken, /turf/open/floor/plating/airless, /area/ruin/space/massdriverhub) -"CJ" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/catwalk_floor{ - initial_gas_mix = "TEMP=2.7" - }, -/area/ruin/space/massdriverhub) "CX" = ( /obj/item/stack/rods, /turf/template_noop, @@ -204,6 +191,7 @@ "DZ" = ( /obj/machinery/power/rtg/advanced, /obj/structure/cable, +/obj/machinery/light/directional/south, /turf/open/floor/catwalk_floor{ initial_gas_mix = "TEMP=2.7" }, @@ -220,6 +208,7 @@ "EO" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/light/directional/north, /turf/open/floor/catwalk_floor{ initial_gas_mix = "TEMP=2.7" }, @@ -232,14 +221,6 @@ }, /turf/open/floor/plating/airless, /area/ruin/space/massdriverhub) -"FV" = ( -/obj/machinery/conveyor{ - dir = 4; - id = "zaza" - }, -/obj/machinery/light/directional/north, -/turf/open/floor/plating/airless, -/area/ruin/space/massdriverhub) "FY" = ( /turf/closed/wall/r_wall, /area/ruin/space/massdriverhub) @@ -347,10 +328,6 @@ "Rm" = ( /turf/open/floor/plating/airless, /area/ruin/space/massdriverhub) -"Rp" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/plating/airless, -/area/ruin/space/massdriverhub) "Rz" = ( /obj/machinery/conveyor{ id = "zaza" @@ -492,11 +469,11 @@ FY "} (6,1,1) = {" FY -FV +hV EN hV qH -cj +No No GT mr @@ -526,13 +503,13 @@ AA Rm hV tm -CJ +tm Bv zn uW Rm Rm -Rp +Rm FY "} (9,1,1) = {" diff --git a/_maps/RandomRuins/SpaceRuins/forgottenship.dmm b/_maps/RandomRuins/SpaceRuins/forgottenship.dmm index 3bb3ef142e8c4..92f998e1ae88f 100644 --- a/_maps/RandomRuins/SpaceRuins/forgottenship.dmm +++ b/_maps/RandomRuins/SpaceRuins/forgottenship.dmm @@ -34,18 +34,10 @@ }, /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, @@ -103,11 +95,6 @@ }, /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) @@ -117,24 +104,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/syndicate_forgotten_ship) -"ay" = ( -/obj/structure/closet/syndicate{ - anchored = 1; - desc = "A basic closet for all your villainous needs."; - locked = 1; - name = "Closet"; - req_access = list("syndicate"); - 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 @@ -142,19 +111,10 @@ /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{ @@ -162,22 +122,6 @@ }, /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 = list("syndicate") - }, -/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{ @@ -185,25 +129,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_access = list("syndicate") - }, -/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 @@ -215,14 +140,6 @@ /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, @@ -276,10 +193,6 @@ /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/space) @@ -292,11 +205,6 @@ "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_access = list("syndicate") @@ -349,19 +257,6 @@ /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_access = list("syndicate") - }, -/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) @@ -374,10 +269,6 @@ }, /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"; @@ -393,10 +284,6 @@ /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_access = list("syndicate") @@ -537,14 +424,6 @@ }, /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, @@ -569,11 +448,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/syndicate_forgotten_ship) -"bP" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/syndicate_access, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) "bQ" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -602,19 +476,10 @@ }, /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, @@ -716,12 +581,6 @@ /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" @@ -763,14 +622,6 @@ /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_access = list("syndicate") - }, -/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, @@ -803,15 +654,6 @@ }, /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_access = list("syndicate") @@ -888,14 +730,6 @@ }, /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; @@ -924,12 +758,6 @@ }, /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 @@ -1004,13 +832,6 @@ }, /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{ @@ -1019,14 +840,6 @@ /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, @@ -1180,6 +993,15 @@ /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/syndicate_forgotten_ship) +"dy" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/directional/east, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/syndicate_forgotten_ship) +"gz" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/syndicate_forgotten_ship) "jN" = ( /obj/structure/closet/crate/secure/gear{ req_access = list("syndicate") @@ -1187,6 +1009,10 @@ /obj/effect/spawner/random/food_or_drink/donkpockets, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/syndicate_forgotten_ship) +"jZ" = ( +/obj/structure/closet/crate/solarpanel_small, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/syndicate_forgotten_cargopod) "kY" = ( /obj/structure/closet/syndicate{ anchored = 1; @@ -1199,6 +1025,127 @@ /obj/effect/spawner/random/contraband/armory, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/syndicate_forgotten_ship) +"lQ" = ( +/obj/machinery/ore_silo, +/obj/machinery/light/directional/west, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/syndicate_forgotten_cargopod) +"ml" = ( +/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/small/directional/south, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/syndicate_forgotten_ship) +"mm" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/syndicate_forgotten_ship) +"mp" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/syndicate_forgotten_ship) +"mZ" = ( +/obj/machinery/power/smes, +/obj/structure/cable, +/obj/machinery/light/small/directional/west, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/syndicate_forgotten_ship) +"qK" = ( +/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 = list("syndicate") + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/syndicate_forgotten_ship) +"rz" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/syndicate_forgotten_ship) +"sL" = ( +/obj/effect/mob_spawn/ghost_role/human/syndicatespace/captain, +/obj/machinery/light/directional/west, +/turf/open/floor/carpet/royalblack, +/area/ruin/space/has_grav/syndicate_forgotten_ship) +"tv" = ( +/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) +"tO" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/small/directional/north, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/syndicate_forgotten_ship) +"vB" = ( +/obj/item/stack/sheet/mineral/uranium{ + amount = 15 + }, +/obj/structure/cable, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/syndicate_forgotten_ship) +"vR" = ( +/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) +"yf" = ( +/mob/living/simple_animal/hostile/nanotrasen/ranged/assault, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/syndicate_forgotten_ship) +"yv" = ( +/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_access = list("syndicate") + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/syndicate_forgotten_cargopod) +"Cy" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/syndicate_forgotten_ship) +"Dx" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/syndicate_forgotten_ship) +"Hi" = ( +/obj/machinery/camera/xray/directional/east{ + c_tag = "Conference room"; + network = list("fsc"); + screen_loc = "" + }, +/obj/machinery/light/directional/east, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/syndicate_forgotten_ship) +"HM" = ( +/obj/structure/closet/crate/secure/gear{ + req_access = list("syndicate") + }, +/obj/item/toy/sword, +/obj/item/toy/balloon/syndicate, +/obj/machinery/light/directional/east, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/syndicate_forgotten_cargopod) "Ia" = ( /obj/structure/closet/crate/secure/gear{ req_access = list("syndicate") @@ -1215,6 +1162,47 @@ /obj/machinery/light/directional/north, /turf/open/floor/pod/dark, /area/ruin/space/has_grav/powered/syndicate_forgotten_vault) +"IP" = ( +/obj/structure/cable, +/obj/machinery/light/directional/west, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/syndicate_forgotten_ship) +"Ji" = ( +/obj/machinery/atmospherics/components/tank/air{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/syndicate_forgotten_ship) +"Lj" = ( +/obj/structure/closet/syndicate{ + anchored = 1; + desc = "A basic closet for all your villainous needs."; + locked = 1; + name = "Closet"; + req_access = list("syndicate"); + 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, +/obj/machinery/light/small/directional/north, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/syndicate_forgotten_ship) +"VF" = ( +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "fscaproom"; + name = "Room shutters control"; + req_access = list("syndicate") + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/syndicate_forgotten_ship) "WR" = ( /obj/structure/closet/crate/secure/gear{ req_access = list("syndicate") @@ -1845,10 +1833,10 @@ bZ bZ bV bZ -ag +sL bw bZ -av +mZ aR az bZ @@ -1889,15 +1877,15 @@ aa aa aa bZ -aA +tO aw bZ ao aO bZ -aN +vB cC -bc +yf bZ bY bE @@ -1983,7 +1971,7 @@ aa aa aa bZ -ay +Lj aw bZ ao @@ -2030,15 +2018,15 @@ aa aa aa bZ -cl +vR aw bZ aB bn bZ -cy +tv cE -cV +aS bZ bY bE @@ -2080,12 +2068,12 @@ ac bZ co bZ -aI +VF bT bg aD cF -cM +Ji bZ ah bD @@ -2224,9 +2212,9 @@ am am cj bZ -aJ -cI -aC +Dx +mm +al bZ bH cd @@ -2244,7 +2232,7 @@ bq bb bb bj -bl +lQ bb bb ba @@ -2289,10 +2277,10 @@ aY ba ba bX -aX bj bj -bo +bj +bj bb ba ba @@ -2364,11 +2352,11 @@ bS bZ bv aP -aK aP +IP cH aP -aK +aP aP al bZ @@ -2406,10 +2394,10 @@ aa aa aa bZ -ai +Cy al bZ -bP +rz al ax ax @@ -2420,7 +2408,7 @@ aP al bZ al -bK +ml bZ aa aa @@ -2500,7 +2488,7 @@ aa aa aa bZ -ai +al al an al @@ -2514,7 +2502,7 @@ aL al an al -bK +bJ bZ aa aa @@ -2524,10 +2512,10 @@ aa aY aY ck -bi +yv bj bj -bU +jZ bb ba ba @@ -2572,7 +2560,7 @@ aY ba bb bb -cs +HM cw bb bb @@ -2595,19 +2583,19 @@ aa aa ac bZ -ah +dy bZ cr al -aF +al al cR -cX -aF +Hi +al al al bZ -ah +dy bZ ac aa @@ -2693,11 +2681,11 @@ aa aq kY ce -bW +aw aw cS aw -bW +aw cg ce bZ @@ -2782,10 +2770,10 @@ aa aa aa bZ -aG +qK aw bZ -aw +br aw aw cB @@ -2793,7 +2781,7 @@ cT aw aw aw -aw +bt bZ df df @@ -2829,7 +2817,7 @@ aa aa aa bZ -br +mp aw cp aw @@ -2843,7 +2831,7 @@ aV aw cJ aw -bt +gz bZ aa aa diff --git a/_maps/RandomRuins/SpaceRuins/hellfactory.dmm b/_maps/RandomRuins/SpaceRuins/hellfactory.dmm index f149f3f991887..f2ddafd3096c0 100644 --- a/_maps/RandomRuins/SpaceRuins/hellfactory.dmm +++ b/_maps/RandomRuins/SpaceRuins/hellfactory.dmm @@ -335,28 +335,6 @@ /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, @@ -576,10 +554,6 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/plating, /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, @@ -730,11 +704,6 @@ /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, @@ -828,6 +797,16 @@ /obj/structure/window/spawner/directional/south, /turf/open/floor/iron, /area/ruin/space/has_grav/hellfactory) +"dm" = ( +/obj/structure/cable, +/obj/machinery/light/floor/broken, +/turf/open/floor/iron, +/area/ruin/space/has_grav/hellfactory) +"gu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot_white/left, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/hellfactory) "hk" = ( /obj/machinery/atmospherics/components/tank/water_vapor{ dir = 8 @@ -847,10 +826,18 @@ /obj/structure/sign/poster/random/directional/east, /turf/open/floor/iron/checker, /area/ruin/space/has_grav/hellfactory) -"lR" = ( -/obj/machinery/light/floor, -/obj/effect/turf_decal/bot_white/right, -/turf/open/floor/iron/dark, +"lP" = ( +/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) "nd" = ( /obj/structure/sign/warning/vacuum, @@ -875,9 +862,8 @@ /obj/structure/sign/poster/random/directional/west, /turf/open/floor/iron, /area/ruin/space/has_grav/hellfactory) -"pT" = ( -/obj/machinery/light/built/directional/south, -/obj/structure/marker_beacon/burgundy, +"po" = ( +/obj/machinery/light/floor/broken, /turf/open/floor/iron, /area/ruin/space/has_grav/hellfactory) "qK" = ( @@ -885,16 +871,14 @@ /obj/effect/spawner/random/exotic/languagebook, /turf/open/floor/iron, /area/ruin/space/has_grav/hellfactory) -"ry" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/floor, -/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) +"ux" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/ruin/space/has_grav/hellfactory) "uL" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/floor, @@ -942,6 +926,10 @@ /obj/structure/sign/warning/chem_diamond, /turf/closed/wall, /area/ruin/space/has_grav/hellfactory) +"KZ" = ( +/obj/machinery/modular_computer/preset/civilian, +/turf/open/floor/iron, +/area/ruin/space/has_grav/hellfactory) "Ns" = ( /obj/structure/closet/crate, /obj/machinery/conveyor/auto{ @@ -978,12 +966,6 @@ /obj/effect/decal/cleanable/oil, /turf/open/floor/plating, /area/ruin/space/has_grav/hellfactory) -"SF" = ( -/obj/machinery/light/broken/directional/south, -/obj/structure/marker_beacon/burgundy, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) "UK" = ( /obj/effect/decal/cleanable/oil/streak, /turf/open/floor/iron, @@ -1229,7 +1211,7 @@ aA aA bL aA -pT +po cE aW Vd @@ -1251,7 +1233,7 @@ bx bE by by -bY +by by by by @@ -1271,7 +1253,7 @@ ao ao aF ah -bh +lP aA bp cV @@ -1280,7 +1262,7 @@ Wh BC oJ Zq -ry +gu by by cv @@ -1298,15 +1280,15 @@ ao aG Yd ah -bg -aA +KZ +ux bL aA Wh Wh oJ -by -by +oJ +oJ oJ Wh by @@ -1331,7 +1313,7 @@ aW VN by by -lR +oJ oJ oJ uL @@ -1362,7 +1344,7 @@ cq cz cq cz -cC +cq cP cy cJ @@ -1391,7 +1373,7 @@ aL ca aL cq -SF +dm cE ac Vd @@ -1460,7 +1442,7 @@ aE aP aP ah -bi +by aB aW ac @@ -1594,8 +1576,8 @@ at GE aL GE -aZ aB +aZ aB aL by diff --git a/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm b/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm index 2fcb1ee03d98b..3d03f4acd18d3 100644 --- a/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm +++ b/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm @@ -3,6 +3,11 @@ /obj/structure/holosign/barrier/atmos/tram, /turf/open/floor/engine, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"af" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/biohazard/directional/north, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "am" = ( /obj/machinery/research/anomaly_refinery, /turf/open/floor/plating/airless, @@ -14,11 +19,20 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"az" = ( -/turf/open/floor/carpet/black, +"ap" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/machinery/reagentgrinder{ + pixel_x = -1; + pixel_y = 8 + }, +/obj/structure/table/reinforced/rglass, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"aX" = ( -/obj/machinery/light/small/directional/east, +"az" = ( /turf/open/floor/carpet/black, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "ba" = ( @@ -62,13 +76,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"bO" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "cE" = ( /obj/structure/closet{ desc = "It's a storage unit for mining."; @@ -109,11 +116,6 @@ /obj/effect/spawner/random/vending/snackvend, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"dq" = ( -/obj/effect/turf_decal/loading_area, -/obj/machinery/light/red/directional/east, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "dA" = ( /obj/structure/grille/broken, /obj/machinery/power/shuttle_engine/propulsion/burst{ @@ -122,10 +124,6 @@ }, /turf/open/floor/mineral/titanium/blue, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"dB" = ( -/obj/machinery/chem_master, -/turf/open/floor/mineral/titanium/tiled/blue, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "dD" = ( /obj/structure/window/reinforced/survival_pod/spawner/directional/west, /turf/open/floor/plating, @@ -146,18 +144,6 @@ }, /turf/closed/mineral/asteroid, /area/ruin/space) -"eg" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/structure/railing/corner, -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/light/floor, -/turf/open/floor/wood, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "el" = ( /obj/item/disk/cargo/bluespace_pod{ pixel_y = 8 @@ -198,11 +184,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"fv" = ( -/obj/machinery/door/window/left/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "fQ" = ( /obj/structure/hedge/opaque, /turf/open/floor/iron/grimy, @@ -303,11 +284,6 @@ }, /turf/open/floor/mineral/titanium/tiled/purple, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"hT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/biohazard/directional/north, -/turf/open/floor/wood, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "hW" = ( /obj/structure/spawner/nether{ light_color = "#FF0000"; @@ -353,7 +329,8 @@ bulb_power = 0.6 }, /obj/structure/industrial_lift/tram/purple, -/obj/effect/landmark/tram/hilbert/middle, +/obj/effect/landmark/tram/platform/hilbert/middle, +/obj/effect/landmark/tram/nav/hilbert, /turf/open/floor/engine, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "iY" = ( @@ -397,12 +374,21 @@ }, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"jT" = ( -/obj/effect/mapping_helpers/dead_body_placer{ - bodycount = 1 +"jQ" = ( +/obj/structure/railing/corner{ + dir = 4 }, -/obj/machinery/light/small/red/directional/north, -/turf/open/floor/mineral/plastitanium, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) +"ko" = ( +/obj/machinery/light/cold/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/directional/east, +/turf/open/floor/mineral/titanium/tiled/purple, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "kp" = ( /obj/effect/decal/cleanable/dirt, @@ -428,16 +414,18 @@ /obj/structure/frame/machine, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"ky" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/carpet/black, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "kD" = ( /obj/structure/table/reinforced/rglass, /obj/item/storage/bag/plants, /obj/item/plant_analyzer, /turf/open/floor/glass, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"kJ" = ( +/obj/effect/mapping_helpers/dead_body_placer{ + bodycount = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "kO" = ( /obj/effect/turf_decal/siding/thinplating_new/light, /turf/open/floor/mineral/titanium/tiled/white, @@ -451,15 +439,14 @@ }, /turf/open/floor/mineral/titanium/tiled/white, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"ln" = ( -/obj/effect/turf_decal/loading_area, -/obj/machinery/light/red/directional/west, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "lq" = ( /obj/structure/window/reinforced/survival_pod/spawner/directional/west, /turf/open/floor/cult, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"lB" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/grimy, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "lH" = ( /turf/open/misc/asteroid/airless, /area/ruin/space) @@ -495,6 +482,12 @@ }, /turf/template_noop, /area/template_noop) +"ml" = ( +/obj/effect/turf_decal/stripes/red/corner{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/tiled/white, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "mo" = ( /obj/effect/turf_decal/siding/thinplating_new/light/end, /turf/open/floor/mineral/titanium/tiled/white, @@ -531,23 +524,25 @@ /obj/machinery/light/red/directional/west, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"nk" = ( -/obj/structure/sign/departments/botany/directional/west, -/obj/effect/turf_decal/trimline/green/mid_joiner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/green/arrow_cw{ - dir = 8 - }, -/obj/item/pickaxe/mini, -/obj/structure/closet/emcloset/anchored, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "np" = ( /obj/effect/turf_decal/box, /obj/machinery/light/red/directional/east, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"nq" = ( +/obj/machinery/chem_master, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/mineral/titanium/tiled/blue, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) +"nu" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) +"nx" = ( +/obj/machinery/door/window/left/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "nB" = ( /obj/structure/sign/departments/chemistry/directional/north, /obj/effect/turf_decal/trimline/blue/arrow_cw{ @@ -570,10 +565,23 @@ /obj/structure/sign/warning/docking/directional/west, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"nV" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/grimy, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "nW" = ( /obj/item/assembly/signaler, /turf/open/floor/plating/airless, /area/ruin/space) +"og" = ( +/obj/item/slime_extract/bluespace, +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/reinforced/plastitaniumglass, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "oi" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -607,6 +615,12 @@ /obj/structure/frame/computer, /turf/open/floor/mineral/titanium/tiled/yellow, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"pp" = ( +/obj/effect/turf_decal/stripes/red/corner{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/tiled/white, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "pq" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -619,11 +633,6 @@ }, /turf/open/floor/mineral/titanium/tiled/yellow, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"pI" = ( -/obj/structure/chair/stool/bar/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "pY" = ( /obj/machinery/light/small/broken/directional/east, /obj/effect/turf_decal/siding/wideplating_new/dark{ @@ -656,19 +665,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"qU" = ( -/obj/machinery/light/cold/directional/north, -/obj/structure/table/reinforced/rglass, -/obj/item/reagent_containers/cup/bottle/epinephrine{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/multiver{ - pixel_x = 6; - pixel_y = 3 - }, -/turf/open/floor/mineral/titanium/tiled/blue, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "qX" = ( /obj/effect/turf_decal/delivery/white{ color = "#52B4E9" @@ -688,6 +684,15 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"rC" = ( +/obj/effect/turf_decal/stripes/red/corner, +/turf/open/floor/mineral/titanium/tiled/white, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) +"rE" = ( +/obj/structure/chair/office, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "rM" = ( /obj/structure/bodycontainer/morgue{ dir = 1 @@ -709,12 +714,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"rW" = ( -/obj/machinery/light/cold/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/directional/east, -/turf/open/floor/mineral/titanium/tiled/purple, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "sj" = ( /turf/open/floor/circuit/green/anim, /area/ruin/space/has_grav/powered/hilbertresearchfacility/secretroom) @@ -754,6 +753,24 @@ /obj/structure/table/reinforced/plastitaniumglass, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"tO" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/grimy, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) +"tQ" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/structure/railing/corner, +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "ua" = ( /obj/structure/sign/warning/docking/directional/south, /turf/open/floor/iron/grimy, @@ -770,18 +787,6 @@ /obj/effect/turf_decal/trimline/neutral/mid_joiner, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"up" = ( -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/stock_parts/matter_bin/bluespace{ - pixel_y = 7 - }, -/obj/item/stock_parts/matter_bin/bluespace{ - pixel_x = -16; - pixel_y = 7 - }, -/obj/machinery/light/red/directional/south, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "us" = ( /obj/machinery/door/window/survival_pod{ dir = 8 @@ -791,18 +796,6 @@ }, /turf/open/floor/mineral/titanium/tiled/purple, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"uG" = ( -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/stock_parts/matter_bin/bluespace{ - pixel_y = 7 - }, -/obj/item/stock_parts/matter_bin/bluespace{ - pixel_x = 16; - pixel_y = 7 - }, -/obj/machinery/light/red/directional/south, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "uV" = ( /obj/effect/turf_decal/siding/thinplating_new/light{ dir = 5 @@ -816,6 +809,10 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"uX" = ( +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/iron/grimy, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "vq" = ( /obj/item/toy/plush/beeplushie, /turf/open/floor/plating/elevatorshaft, @@ -826,15 +823,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"vt" = ( -/obj/structure/railing/corner, -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/light/floor, -/turf/open/floor/wood, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "vz" = ( /obj/structure/rack, /obj/item/clothing/suit/bio_suit/cmo, @@ -879,14 +867,18 @@ "wa" = ( /turf/open/floor/mineral/titanium/tiled/yellow, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"wh" = ( -/obj/structure/chair/office, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "wo" = ( /turf/open/floor/cult, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"wp" = ( +/obj/structure/chair/stool/bar/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/grimy, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) +"wy" = ( +/obj/effect/turf_decal/loading_area, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "wG" = ( /obj/effect/turf_decal/stripes/end, /obj/machinery/shower/directional/south, @@ -897,13 +889,6 @@ /obj/item/food/monkeycube, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"wJ" = ( -/obj/machinery/light/cold/directional/south, -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 4 - }, -/turf/open/floor/mineral/titanium/tiled/white, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "wY" = ( /mob/living/simple_animal/slime{ colour = "bluespace"; @@ -952,6 +937,10 @@ }, /turf/open/floor/mineral/titanium/tiled/white, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"yf" = ( +/obj/effect/landmark/tram/nav/immovable_rod, +/turf/closed/indestructible/riveted/plastinum, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "yi" = ( /obj/structure/table/reinforced/rglass, /obj/item/food/grown/banana, @@ -1090,11 +1079,6 @@ /obj/machinery/chem_dispenser, /turf/open/floor/mineral/titanium/tiled/blue, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"Af" = ( -/obj/structure/reagent_dispensers/water_cooler, -/obj/machinery/light/warm/directional/south, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "Ax" = ( /obj/effect/turf_decal/trimline/brown/arrow_cw{ dir = 1 @@ -1145,6 +1129,11 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"Bf" = ( +/obj/structure/chair/stool/bar/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/grimy, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "Bh" = ( /obj/machinery/light/small/red/directional/north, /turf/open/floor/mineral/plastitanium, @@ -1161,10 +1150,18 @@ "Bo" = ( /turf/closed/indestructible/riveted/plastinum, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"Bs" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/grimy, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "BA" = ( /obj/machinery/door/airlock/science{ name = "Hilbert's Office" }, +/obj/effect/landmark/tram/nav/immovable_rod, /turf/open/floor/wood, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "BF" = ( @@ -1215,6 +1212,18 @@ "BY" = ( /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"Cc" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/reagent_containers/cup/bottle/epinephrine{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = 6; + pixel_y = 3 + }, +/turf/open/floor/mineral/titanium/tiled/blue, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "Co" = ( /obj/structure/table/wood, /obj/item/plate, @@ -1238,11 +1247,6 @@ }, /turf/open/floor/wood, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"CV" = ( -/obj/machinery/light/cold/directional/north, -/obj/effect/turf_decal/stripes/red/corner, -/turf/open/floor/mineral/titanium/tiled/white, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "Dh" = ( /obj/machinery/chem_heater/withbuffer, /turf/open/floor/mineral/titanium/tiled/blue, @@ -1345,10 +1349,6 @@ /obj/structure/barricade/wooden/crude, /turf/open/floor/mineral/titanium/tiled/yellow, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"Fm" = ( -/obj/machinery/light/warm/directional/east, -/turf/open/floor/wood, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "Fn" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -1388,13 +1388,8 @@ /obj/structure/table/reinforced/plastitaniumglass, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"FF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/warm/directional/west, -/turf/open/floor/wood, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "Gf" = ( -/obj/effect/landmark/tram/hilbert/right, +/obj/effect/landmark/tram/platform/hilbert/right, /turf/open/floor/engine, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "Gi" = ( @@ -1420,21 +1415,6 @@ }, /turf/open/floor/mineral/titanium/tiled/white, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"Gy" = ( -/obj/effect/turf_decal/stripes/red/corner{ - dir = 8 - }, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/mineral/titanium/tiled/white, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) -"GJ" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/effect/turf_decal/siding/wood, -/obj/machinery/light/floor, -/turf/open/floor/wood, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "GP" = ( /obj/structure/table/wood, /obj/item/gps/spaceruin, @@ -1503,7 +1483,7 @@ /turf/open/floor/grass/fairy, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "It" = ( -/obj/effect/landmark/tram/hilbert/left, +/obj/effect/landmark/tram/platform/hilbert/left, /turf/open/floor/engine, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "Iv" = ( @@ -1583,6 +1563,17 @@ }, /turf/open/floor/glass, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"Jq" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/stock_parts/matter_bin/bluespace{ + pixel_y = 7 + }, +/obj/item/stock_parts/matter_bin/bluespace{ + pixel_x = 16; + pixel_y = 7 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "JL" = ( /obj/structure/fluff/tram_rail, /obj/structure/holosign/barrier/atmos/tram, @@ -1607,11 +1598,6 @@ /obj/item/flashlight/lamp/green, /turf/open/floor/carpet/black, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"JW" = ( -/obj/machinery/light/broken/directional/north, -/obj/machinery/monkey_recycler, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "Kd" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/barricade/wooden, @@ -1624,11 +1610,6 @@ /obj/structure/fans/tiny, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"KL" = ( -/obj/structure/chair/stool/bar/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "KS" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 8 @@ -1653,13 +1634,6 @@ }, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"LD" = ( -/obj/machinery/light/cold/directional/south, -/obj/effect/turf_decal/stripes/red/corner{ - dir = 4 - }, -/turf/open/floor/mineral/titanium/tiled/white, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "LE" = ( /obj/item/kirbyplants/photosynthetic, /obj/effect/turf_decal/stripes/red/line{ @@ -1667,20 +1641,35 @@ }, /turf/open/floor/mineral/titanium/tiled/white, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"LP" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "Mf" = ( /obj/structure/girder/reinforced, /obj/effect/decal/cleanable/blood/tracks, /turf/open/floor/engine, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"Mh" = ( -/obj/machinery/computer/terminal/hilbert{ +"Mv" = ( +/turf/open/floor/mineral/titanium/tiled/blue, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) +"Mx" = ( +/obj/structure/railing/corner{ dir = 8 }, +/obj/effect/turf_decal/siding/wood, +/obj/machinery/light/small/directional/east, /turf/open/floor/wood, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"Mv" = ( -/turf/open/floor/mineral/titanium/tiled/blue, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "MD" = ( /obj/effect/turf_decal/stripes/red/line{ dir = 1 @@ -1725,13 +1714,6 @@ }, /turf/open/floor/mineral/titanium/tiled/white, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"Nw" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "Ny" = ( /obj/structure/window/reinforced/survival_pod/spawner/directional/east, /turf/open/floor/mineral/plastitanium, @@ -1751,12 +1733,23 @@ }, /turf/open/floor/mineral/titanium/tiled/purple, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"NQ" = ( -/obj/effect/turf_decal/stripes/red/corner{ - dir = 1 +"NU" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 }, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/mineral/titanium/tiled/white, +/obj/effect/turf_decal/siding/wood/corner, +/obj/structure/table/reinforced/rglass, +/obj/item/reagent_containers/cup/bottle/nutrient/l4z{ + pixel_x = 4; + pixel_y = 6 + }, +/obj/item/reagent_containers/cup/bottle/nutrient/rh{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/item/reagent_containers/cup/bottle/mutagen, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "Oe" = ( /obj/machinery/light/warm/directional/south, @@ -1825,22 +1818,11 @@ /obj/item/pen, /turf/template_noop, /area/ruin/space) -"Qu" = ( -/obj/effect/turf_decal/siding/wood/corner{ +"Qj" = ( +/obj/effect/turf_decal/stripes/red/corner{ dir = 4 }, -/obj/effect/turf_decal/siding/wood/corner, -/obj/structure/table/reinforced/rglass, -/obj/item/reagent_containers/cup/bottle/nutrient/l4z{ - pixel_x = 4; - pixel_y = 6 - }, -/obj/item/reagent_containers/cup/bottle/nutrient/rh{ - pixel_x = -4; - pixel_y = 6 - }, -/obj/item/reagent_containers/cup/bottle/mutagen, -/turf/open/floor/wood, +/turf/open/floor/mineral/titanium/tiled/white, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "QA" = ( /obj/effect/turf_decal/siding/wood{ @@ -1869,17 +1851,6 @@ }, /turf/open/floor/engine, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"QU" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/decal/cleanable/food/tomato_smudge, -/obj/machinery/light/floor, -/turf/open/floor/wood, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "QV" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -1916,6 +1887,10 @@ }, /turf/open/floor/mineral/titanium/tiled/white, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"RB" = ( +/obj/machinery/monkey_recycler, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "RE" = ( /obj/item/stack/cable_coil/cut, /turf/open/floor/plating, @@ -1964,6 +1939,17 @@ /obj/machinery/chem_master/condimaster, /turf/open/floor/wood, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"Se" = ( +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/decal/cleanable/food/tomato_smudge, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "Sg" = ( /obj/machinery/door/airlock/science{ name = "Arrivals" @@ -2065,13 +2051,6 @@ /obj/item/secateurs, /turf/open/floor/glass, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"TO" = ( -/obj/machinery/light/broken/directional/south, -/obj/item/slime_extract/bluespace, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced/plastitaniumglass, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "TT" = ( /obj/machinery/light/cold/directional/north, /obj/structure/hedge/opaque, @@ -2087,10 +2066,6 @@ /obj/item/food/grown/banana/bluespace, /turf/open/floor/glass, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"Ui" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "Un" = ( /turf/closed/indestructible/riveted/plastinum, /area/ruin/space) @@ -2165,6 +2140,16 @@ /obj/structure/window/reinforced/survival_pod/spawner/directional/west, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"Wb" = ( +/obj/effect/turf_decal/trimline/red/arrow_cw{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/mid_joiner{ + dir = 4 + }, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "Wg" = ( /obj/structure/mop_bucket, /turf/open/floor/plating, @@ -2202,13 +2187,6 @@ /obj/item/food/cornchips/blue, /turf/open/floor/wood, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"WJ" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "WQ" = ( /obj/structure/fluff/tram_rail, /obj/structure/industrial_lift/tram/purple, @@ -2216,6 +2194,13 @@ /obj/structure/window/reinforced/survival_pod/spawner/directional/south, /turf/open/floor/engine, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"WV" = ( +/obj/machinery/computer/terminal/hilbert{ + dir = 8 + }, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "WY" = ( /obj/effect/turf_decal/trimline/purple/arrow_cw, /obj/effect/turf_decal/trimline/purple/mid_joiner, @@ -2253,36 +2238,23 @@ "XP" = ( /turf/open/floor/mineral/titanium/tiled/white, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"XY" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood, -/obj/machinery/light/floor, -/turf/open/floor/wood, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "Yg" = ( /obj/structure/table/wood, /obj/structure/bedsheetbin, /turf/open/floor/wood, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"Ym" = ( -/obj/effect/turf_decal/siding/wood/corner, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 +"Yr" = ( +/obj/structure/sign/departments/botany/directional/west, +/obj/effect/turf_decal/trimline/green/mid_joiner{ + dir = 8 }, -/obj/machinery/reagentgrinder{ - pixel_x = -1; - pixel_y = 8 +/obj/effect/turf_decal/trimline/green/arrow_cw{ + dir = 8 }, -/obj/structure/table/reinforced/rglass, -/turf/open/floor/wood, +/obj/item/pickaxe/mini, +/obj/structure/closet/emcloset/anchored, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "Yv" = ( /obj/item/kirbyplants/random, @@ -2292,17 +2264,6 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"YF" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood, -/obj/machinery/light/floor, -/turf/open/floor/wood, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "YG" = ( /obj/effect/turf_decal/stripes/red/line{ dir = 1 @@ -2321,6 +2282,17 @@ /obj/machinery/light/warm/directional/west, /turf/open/floor/wood, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"YV" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/stock_parts/matter_bin/bluespace{ + pixel_y = 7 + }, +/obj/item/stock_parts/matter_bin/bluespace{ + pixel_x = -16; + pixel_y = 7 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "Zc" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -2375,6 +2347,14 @@ }, /turf/open/floor/mineral/titanium/tiled/purple, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"ZT" = ( +/obj/structure/railing/corner, +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "ZV" = ( /turf/open/floor/plating, /area/ruin/space/has_grav/powered/hilbertresearchfacility) @@ -2440,13 +2420,13 @@ Ut Ut Bo Ok -Ym +ap za Sc ie UH vZ -Qu +NU Ok Bo Ut @@ -2479,13 +2459,13 @@ Ut Ut Bo kD -vt +ZT Iv BQ Iv Im Iv -YF +jQ TE Bo Ut @@ -2596,13 +2576,13 @@ Dk Dk Bo ID -eg +tQ SR hw Jp IO SR -XY +LP Nl Bo Ut @@ -2713,13 +2693,13 @@ Dk Dk Bo yD -eg +tQ SR hw Jp IW SR -XY +LP UK Bo Wm @@ -2830,13 +2810,13 @@ uW Ok vq Bo -GJ +Mx hM ZG vN mD gB -QU +Se Bo Dk Dk @@ -2864,7 +2844,7 @@ Ut Ut Ut Bo -La +Bh La Ok Bo @@ -2872,7 +2852,7 @@ Bo Bo Ok CP -Bo +yf CP Ok Bo @@ -2903,7 +2883,7 @@ Bo Bo Bo Bo -jT +kJ qX rM Bo @@ -2911,7 +2891,7 @@ Dk Dk Bo rV -nk +Yr rV Bo Dk @@ -2987,18 +2967,18 @@ Bo Ok Bo Ok -CV +rC Ru Fo Ru -LD +Qj Ok Bo Bo Bo Ok Hf -FF +nu Gl QV Bo @@ -3016,14 +2996,14 @@ Ut Ut Ut Bo -qU +Cc Vk Uz mo Mv uV Rw -wJ +Rw Bo nB Xi @@ -3037,8 +3017,8 @@ To To Ok Ok -hT -fv +af +nx QV ua Ok @@ -3055,7 +3035,7 @@ Ut Ut Ut Bo -dB +nq Vk kO Mv @@ -3079,7 +3059,7 @@ hQ sU ev QV -Ui +lB en KJ en @@ -3112,12 +3092,12 @@ YG PG Bo wG -rW +ko lL Ej -wh +rE Gl -WJ +nV ua Ok Bo @@ -3154,10 +3134,10 @@ Bo Bo Bo Ok -Mh +WV Fv QV -Af +uX Bo lH mk @@ -3194,8 +3174,8 @@ Dk Bo Yv pq -Nw -bO +Bs +tO db Bo lH @@ -3232,9 +3212,9 @@ Bo Dk Ok Bo -pI +Bf eC -KL +wp Bo Ok Dk @@ -3599,7 +3579,7 @@ Dk Dk Bo Ok -ln +wy Uy Fn gx @@ -3685,7 +3665,7 @@ MX xm oi ZV -up +YV Ok Bo Ok @@ -3693,7 +3673,7 @@ BI hk KC Xw -MD +YG Ok Bo Bo @@ -3741,7 +3721,7 @@ lY DR kp La -TO +og Bo Dk Dk @@ -3813,7 +3793,7 @@ uc YG Sp Bo -JW +RB yw VD lY @@ -3841,11 +3821,11 @@ mb Sh pC wo -uG +Jq Ok Bo Ok -BI +Xi hk KC Xw @@ -3911,7 +3891,7 @@ Dk Dk Bo Ok -dq +wy Uy SD iY @@ -4324,7 +4304,7 @@ Dk Bo Vn oI -ky +az Bo Bo Bo @@ -4367,7 +4347,7 @@ az Bo Vn JV -ky +az Bo Dk Dk @@ -4547,11 +4527,11 @@ Un Dk Bo Ok -Gy +ml zw Gs zw -NQ +pp Ok Bo Ok @@ -4597,13 +4577,13 @@ Bo Zy sU ME -Fm +sU sU QV BY BY Bo -aX +az Th Bo "} @@ -4626,9 +4606,9 @@ Dk Dk Dk Bo +Wb on -on -on +Wb Bo Dk Dk @@ -4715,7 +4695,7 @@ Dk Bo Vn JV -ky +az Bo Bo Ok diff --git a/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm b/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm index baefaaca4bcf4..c7901e1421f8b 100644 --- a/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm +++ b/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm @@ -34,7 +34,7 @@ /area/ruin/space/has_grav/infested_frigate) "aB" = ( /obj/item/shard, -/turf/open/space/basic, +/turf/template_noop, /area/template_noop) "aV" = ( /obj/machinery/light/small/red/dim/directional/north, @@ -79,22 +79,12 @@ }, /turf/open/floor/pod/dark, /area/ruin/space/has_grav/infested_frigate) -"bg" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear, +"be" = ( +/obj/structure/broken_flooring/plating/directional/east, /obj/item/ammo_casing/spent, /obj/item/ammo_casing/spent, -/mob/living/simple_animal/hostile/alien{ - faction = list("syndicate","xenomorph") - }, -/obj/machinery/light/broken/directional/south, -/turf/open/floor/mineral/titanium/tiled/white, -/area/ruin/space/has_grav/infested_frigate) +/turf/template_noop, +/area/template_noop) "bD" = ( /obj/effect/decal/cleanable/blood/gibs{ icon_state = "gib3-old"; @@ -143,21 +133,19 @@ }, /turf/closed/wall/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) -"cv" = ( -/obj/effect/turf_decal{ - icon_state = "warningline_white"; - dir = 1 - }, -/obj/machinery/light/broken/directional/east, -/obj/effect/turf_decal{ - icon_state = "warningline_white"; - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/computer/operating{ - dir = 1 +"cj" = ( +/obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear, +/obj/effect/decal/cleanable/blood/gibs{ + icon_state = "gib2-old" }, -/turf/open/floor/pod/dark, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) "cw" = ( /obj/structure/table/reinforced, @@ -321,10 +309,6 @@ /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) -"dA" = ( -/obj/structure/broken_flooring/singular/directional/east, -/turf/open/space/basic, -/area/template_noop) "ef" = ( /obj/structure/kitchenspike{ icon_state = "spikebloodymonkey"; @@ -333,6 +317,28 @@ /obj/effect/decal/cleanable/blood/gibs/old, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/infested_frigate) +"eo" = ( +/obj/effect/turf_decal{ + icon_state = "arrows_red"; + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/gibs{ + icon_state = "gib6-old"; + dir = 8 + }, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/obj/effect/turf_decal{ + icon_state = "warningline_white"; + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/infested_frigate) "ep" = ( /obj/effect/decal/cleanable/glass, /obj/structure/cable, @@ -342,6 +348,25 @@ /obj/item/ammo_casing/spent, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/infested_frigate) +"er" = ( +/obj/structure/lattice, +/obj/structure/alien/resin/membrane{ + max_integrity = 1600; + desc = "Resin just thin enough to let light pass through, but it's congealing in the same way as the thicker stuff."; + name = "viscous resin membrane" + }, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/obj/structure/door_assembly/door_assembly_hatch{ + anchored = 1; + name = "crew quarters"; + desc = "People lived in this place."; + layer = 2.8 + }, +/turf/template_noop, +/area/ruin/space/has_grav/infested_frigate) "eE" = ( /mob/living/simple_animal/hostile/alien{ faction = list("syndicate","xenomorph") @@ -378,31 +403,57 @@ }, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/infested_frigate) -"fa" = ( -/obj/structure/cable, -/obj/structure/closet/firecloset/full{ - anchored = 1 +"fc" = ( +/obj/effect/turf_decal{ + dir = 4 }, /obj/effect/turf_decal{ - icon_state = "warningline_red"; - dir = 8 + dir = 1 }, -/obj/item/storage/toolbox/emergency, /obj/effect/turf_decal{ - icon_state = "warningline_red"; - dir = 4 + dir = 5 }, -/obj/structure/sign/warning/fire/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/light/red/dim/directional/east, -/turf/open/floor/pod/dark, +/obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear, +/obj/effect/decal/cleanable/blood/gibs{ + icon_state = "gib1-old" + }, +/obj/item/ammo_casing/spent, +/turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) "fl" = ( -/turf/open/space/basic, +/turf/template_noop, /area/template_noop) +"fr" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/structure/table/reinforced, +/obj/structure/closet/mini_fridge/grimy{ + anchored = 1; + pixel_y = 6 + }, +/obj/effect/spawner/random/food_or_drink/refreshing_beverage, +/obj/effect/spawner/random/food_or_drink/booze{ + pixel_x = 4; + pixel_y = 6 + }, +/obj/effect/spawner/random/food_or_drink/booze{ + pixel_x = 4; + pixel_y = 6 + }, +/obj/effect/spawner/random/food_or_drink/donkpockets_single, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/item/bodypart/head, +/obj/machinery/chem_dispenser/drinks/beer{ + pixel_y = 32 + }, +/turf/open/floor/mineral/titanium/tiled/white, +/area/ruin/space/has_grav/infested_frigate) "fM" = ( /obj/structure/door_assembly/door_assembly_ext, -/turf/open/space/basic, +/turf/template_noop, /area/template_noop) "fX" = ( /obj/structure/toilet{ @@ -415,13 +466,26 @@ /area/ruin/space/has_grav/infested_frigate) "gG" = ( /obj/effect/spawner/random/trash/food_packaging, -/turf/open/space/basic, -/area/template_noop) -"gP" = ( -/obj/effect/decal/cleanable/glass, -/obj/structure/lattice, -/turf/open/space/basic, +/turf/template_noop, /area/template_noop) +"gW" = ( +/obj/effect/turf_decal{ + dir = 4 + }, +/obj/effect/turf_decal{ + dir = 6 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/infested_frigate) "hm" = ( /obj/machinery/porta_turret/syndicate/pod{ dir = 5; @@ -430,14 +494,6 @@ }, /turf/closed/wall/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) -"hu" = ( -/obj/structure/barricade/security, -/obj/effect/decal/cleanable/blood/gibs{ - icon_state = "floor1-old" - }, -/obj/item/ammo_casing/spent, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/infested_frigate) "hA" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/gibs{ @@ -466,6 +522,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/infested_frigate) +"hI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/structure/alien/weeds/node{ + maximum_growtime = 240000; + minimum_growtime = 120000; + growtime = 150000 + }, +/obj/item/ammo_casing/spent, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/infested_frigate) "hK" = ( /obj/effect/turf_decal{ dir = 8 @@ -481,6 +547,20 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) +"hW" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal{ + icon_state = "warningline_white"; + dir = 1 + }, +/obj/effect/spawner/random/trash/mess, +/obj/structure/sign/poster/contraband/random/directional/south, +/obj/item/kirbyplants/random, +/turf/open/floor/mineral/titanium/tiled/white, +/area/ruin/space/has_grav/infested_frigate) "hX" = ( /obj/structure/cable, /obj/machinery/airalarm/directional/north, @@ -551,15 +631,6 @@ /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, /area/ruin/space/has_grav/infested_frigate) -"jf" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - icon_state = "ltrails_1"; - dir = 10 - }, -/obj/effect/decal/cleanable/food/egg_smudge, -/turf/open/floor/iron/freezer, -/area/ruin/space/has_grav/infested_frigate) "jk" = ( /obj/structure/barricade/security, /obj/structure/door_assembly/door_assembly_ext{ @@ -588,42 +659,6 @@ }, /turf/open/floor/pod/dark, /area/ruin/space/has_grav/infested_frigate) -"jA" = ( -/obj/machinery/light/small/broken/directional/east, -/obj/effect/turf_decal{ - icon_state = "warningline_white"; - dir = 1 - }, -/obj/effect/turf_decal{ - icon_state = "warningline_white"; - dir = 4 - }, -/obj/effect/turf_decal{ - icon_state = "warningline_white" - }, -/obj/structure/barricade/security, -/obj/structure/cable, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/infested_frigate) -"ka" = ( -/obj/effect/turf_decal{ - dir = 4 - }, -/obj/effect/turf_decal{ - dir = 6 - }, -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/obj/machinery/light/broken/directional/east, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/infested_frigate) "kc" = ( /obj/effect/turf_decal{ dir = 8 @@ -646,15 +681,6 @@ /obj/effect/turf_decal/tile/bar, /turf/closed/wall/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) -"kp" = ( -/obj/machinery/light/broken/directional/west, -/obj/structure/alien/weeds/node{ - maximum_growtime = 240000; - minimum_growtime = 120000; - growtime = 150000 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/infested_frigate) "ku" = ( /obj/structure/cable, /obj/effect/turf_decal{ @@ -711,6 +737,15 @@ }, /turf/closed/wall/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) +"lx" = ( +/obj/structure/barricade/security, +/obj/effect/decal/cleanable/blood/gibs{ + icon_state = "floor1-old" + }, +/obj/item/ammo_casing/spent, +/obj/machinery/light/red/dim/directional/north, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/infested_frigate) "lU" = ( /obj/effect/decal/cleanable/blood/gibs{ icon_state = "u_madman_l" @@ -728,6 +763,14 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) +"mk" = ( +/obj/structure/alien/weeds/node{ + maximum_growtime = 240000; + minimum_growtime = 120000; + growtime = 150000 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/infested_frigate) "mn" = ( /obj/effect/turf_decal{ dir = 8 @@ -736,6 +779,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) +"mo" = ( +/obj/structure/mirror/broken, +/turf/closed/wall/mineral/plastitanium, +/area/ruin/space/has_grav/infested_frigate) "mp" = ( /obj/structure/sign/departments/medbay/alt/directional/east, /obj/effect/decal/cleanable/blood/gibs{ @@ -757,10 +804,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) -"mx" = ( -/obj/structure/broken_flooring/singular/directional/south, -/turf/open/space/basic, -/area/template_noop) "mG" = ( /obj/structure/bed/maint, /obj/effect/decal/cleanable/blood{ @@ -800,21 +843,6 @@ }, /turf/open/floor/pod/dark, /area/ruin/space/has_grav/infested_frigate) -"nu" = ( -/obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear, -/obj/effect/decal/cleanable/blood/gibs{ - icon_state = "gib2-old" - }, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/obj/machinery/light/red/dim/directional/north, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/infested_frigate) "nG" = ( /mob/living/simple_animal/hostile/alien{ faction = list("syndicate","xenomorph") @@ -863,6 +891,15 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) +"or" = ( +/obj/item/ammo_casing/spent, +/obj/effect/decal/cleanable/blood{ + icon_state = "drip1" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/infested_frigate) "oV" = ( /obj/effect/decal/cleanable/xenoblood/xgibs/up{ icon_state = "xltrails_2"; @@ -877,6 +914,25 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) +"pk" = ( +/obj/structure/cable, +/obj/structure/closet/firecloset/full{ + anchored = 1 + }, +/obj/effect/turf_decal{ + icon_state = "warningline_red"; + dir = 8 + }, +/obj/item/storage/toolbox/emergency, +/obj/effect/turf_decal{ + icon_state = "warningline_red"; + dir = 4 + }, +/obj/structure/sign/warning/fire/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/light/broken/directional/east, +/turf/open/floor/pod/dark, +/area/ruin/space/has_grav/infested_frigate) "pl" = ( /obj/item/shard, /obj/effect/decal/cleanable/glass, @@ -898,12 +954,7 @@ pixel_y = 2; pixel_x = 15 }, -/turf/open/space/basic, -/area/template_noop) -"pu" = ( -/obj/structure/broken_flooring/plating/directional/north, -/obj/structure/broken_flooring/pile/directional/west, -/turf/open/space/basic, +/turf/template_noop, /area/template_noop) "qb" = ( /obj/effect/turf_decal{ @@ -924,23 +975,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) -"qq" = ( -/obj/machinery/light/small/red/dim/directional/east, -/obj/effect/turf_decal{ - icon_state = "warningline_white" - }, -/obj/item/ammo_casing/spent, -/obj/effect/turf_decal{ - icon_state = "warningline_white"; - dir = 4 - }, -/obj/effect/turf_decal{ - icon_state = "warningline_white"; - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/infested_frigate) "qu" = ( /obj/effect/decal/cleanable/blood{ icon_state = "floor7-old" @@ -990,28 +1024,20 @@ /area/ruin/space/has_grav/infested_frigate) "qF" = ( /obj/item/ammo_casing/spent, -/turf/open/space/basic, +/turf/template_noop, /area/template_noop) "qJ" = ( /obj/structure/closet/crate/trashcart, /obj/item/clothing/mask/facehugger/toy, /obj/item/storage/fancy/cigarettes/cigpack_cannabis, /obj/effect/mob_spawn/corpse/human/charredskeleton, -/turf/open/space/basic, +/turf/template_noop, /area/template_noop) "qR" = ( /obj/effect/decal/cleanable/blood/gibs/old, /obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear, /turf/open/floor/mineral/plastitanium/airless, /area/ruin/space/has_grav/infested_frigate) -"rb" = ( -/obj/effect/decal/cleanable/glass, -/obj/structure/broken_flooring/plating/directional/north, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/turf/open/space/basic, -/area/template_noop) "rd" = ( /obj/effect/decal/cleanable/blood/gibs/old{ icon_state = "gibmid1" @@ -1049,6 +1075,27 @@ /obj/item/bedsheet/syndie/double, /turf/open/floor/plating, /area/ruin/space/has_grav/infested_frigate) +"rz" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/effect/decal/cleanable/blood/gibs{ + icon_state = "ltrails_1"; + dir = 1 + }, +/obj/effect/turf_decal{ + icon_state = "warningline_white"; + dir = 1 + }, +/obj/effect/turf_decal{ + icon_state = "warningline_white"; + dir = 8 + }, +/obj/effect/turf_decal{ + icon_state = "warningline_white" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/infested_frigate) "rL" = ( /obj/effect/turf_decal{ icon_state = "bot_red" @@ -1064,6 +1111,10 @@ /obj/effect/decal/cleanable/plastic, /turf/open/floor/pod/dark, /area/ruin/space/has_grav/infested_frigate) +"rO" = ( +/obj/structure/broken_flooring/pile/directional/south, +/turf/template_noop, +/area/template_noop) "so" = ( /obj/effect/mapping_helpers/broken_floor, /obj/item/broken_missile, @@ -1092,10 +1143,6 @@ /obj/machinery/door/airlock/hatch, /turf/open/floor/pod/dark, /area/ruin/space/has_grav/infested_frigate) -"sK" = ( -/obj/structure/broken_flooring/pile/directional/east, -/turf/open/space/basic, -/area/template_noop) "sQ" = ( /obj/structure/cable, /obj/structure/alien/weeds, @@ -1113,7 +1160,7 @@ /area/ruin/space/has_grav/infested_frigate) "sT" = ( /obj/structure/lattice, -/turf/open/space/basic, +/turf/template_noop, /area/template_noop) "sZ" = ( /obj/structure/cable, @@ -1140,18 +1187,6 @@ /obj/item/ammo_casing/spent, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) -"tJ" = ( -/obj/structure/window/spawner/directional/west, -/obj/effect/decal/cleanable/glass, -/obj/structure/table_frame, -/obj/item/shard, -/obj/effect/turf_decal{ - icon_state = "warningline_white"; - dir = 1 - }, -/obj/effect/spawner/random/medical/minor_healing, -/turf/open/floor/pod/dark, -/area/ruin/space/has_grav/infested_frigate) "tO" = ( /obj/machinery/door/airlock/external/ruin, /obj/effect/mapping_helpers/airlock/cyclelink_helper, @@ -1159,26 +1194,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) -"tU" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/item/bodypart/head/lizard, -/obj/item/bodypart/head/lizard, -/obj/item/bodypart/head, -/obj/item/bodypart/head, -/obj/item/bodypart/head, -/obj/effect/spawner/random/medical/memeorgans, -/obj/item/reagent_containers/condiment/rice, -/obj/item/reagent_containers/condiment/rice, -/obj/structure/closet/secure_closet/freezer/gulag_fridge{ - locked = 0 - }, -/obj/item/bodypart/head, -/obj/effect/spawner/random/food_or_drink/cake_ingredients, -/turf/open/floor/mineral/titanium/tiled/white, -/area/ruin/space/has_grav/infested_frigate) "ug" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/turf_decal{ @@ -1188,6 +1203,18 @@ /obj/effect/spawner/random/entertainment/arcade, /turf/open/floor/pod/dark, /area/ruin/space/has_grav/infested_frigate) +"uy" = ( +/obj/structure/cable, +/obj/effect/turf_decal{ + icon_state = "warningline_white" + }, +/obj/effect/turf_decal{ + icon_state = "warningline_white"; + dir = 8 + }, +/obj/machinery/vending/medical/infested_frigate, +/turf/open/floor/pod/dark, +/area/ruin/space/has_grav/infested_frigate) "uC" = ( /obj/effect/turf_decal, /obj/machinery/recharge_station{ @@ -1225,6 +1252,26 @@ /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) +"vo" = ( +/obj/effect/turf_decal{ + icon_state = "warningline_white"; + dir = 1 + }, +/obj/item/storage/toolbox/ammobox/strilka310{ + pixel_y = 16; + pixel_x = 5 + }, +/obj/item/storage/toolbox/ammobox/strilka310{ + pixel_y = 8; + pixel_x = 3 + }, +/obj/item/storage/box/handcuffs{ + pixel_y = 2; + pixel_x = -8 + }, +/obj/structure/table/glass/plasmaglass, +/turf/open/floor/pod/dark, +/area/ruin/space/has_grav/infested_frigate) "vx" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -1237,6 +1284,17 @@ /obj/item/ammo_casing/spent, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) +"vH" = ( +/obj/effect/turf_decal{ + dir = 8 + }, +/obj/machinery/mech_bay_recharge_port, +/obj/effect/turf_decal{ + dir = 10 + }, +/obj/machinery/light/very_dim/directional/south, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/infested_frigate) "vM" = ( /obj/item/ammo_casing/spent, /obj/effect/decal/cleanable/dirt, @@ -1246,6 +1304,21 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) +"vR" = ( +/obj/effect/turf_decal{ + icon_state = "warningline_white"; + dir = 1 + }, +/obj/effect/turf_decal{ + icon_state = "warningline_white"; + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/computer/operating{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/ruin/space/has_grav/infested_frigate) "wc" = ( /obj/structure/cable, /obj/structure/alien/weeds, @@ -1306,7 +1379,7 @@ /obj/item/stack/rods{ amount = 25 }, -/turf/open/space/basic, +/turf/template_noop, /area/template_noop) "wt" = ( /obj/effect/turf_decal{ @@ -1476,13 +1549,6 @@ /obj/effect/spawner/random/structure/crate_loot, /turf/open/floor/plating, /area/ruin/space/has_grav/infested_frigate) -"ye" = ( -/obj/item/trash/flare, -/obj/item/ammo_casing/spent, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/infested_frigate) "yt" = ( /obj/effect/turf_decal/tile/bar{ dir = 1 @@ -1567,19 +1633,20 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/infested_frigate) -"zb" = ( -/obj/structure/broken_flooring/pile/directional/south, -/turf/open/space/basic, -/area/template_noop) -"zE" = ( -/obj/effect/turf_decal{ - icon_state = "warningline_white"; - dir = 8 +"zg" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 1 }, -/obj/machinery/light/red/dim/directional/north, -/obj/structure/barricade/security, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/mineral/plastitanium/red, +/obj/effect/turf_decal/tile/bar, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/mob/living/simple_animal/hostile/alien{ + faction = list("syndicate","xenomorph") + }, +/turf/open/floor/mineral/titanium/tiled/white, /area/ruin/space/has_grav/infested_frigate) "zK" = ( /obj/structure/cable, @@ -1602,6 +1669,10 @@ /obj/effect/decal/cleanable/glass, /turf/open/floor/plating/airless, /area/template_noop) +"zU" = ( +/obj/structure/broken_flooring/pile/directional/east, +/turf/template_noop, +/area/template_noop) "zV" = ( /obj/machinery/suit_storage_unit/open, /obj/effect/turf_decal{ @@ -1655,34 +1726,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) -"Ar" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/table/reinforced, -/obj/structure/closet/mini_fridge{ - anchored = 1; - pixel_y = 6 - }, -/obj/effect/spawner/random/food_or_drink/refreshing_beverage, -/obj/effect/spawner/random/food_or_drink/booze{ - pixel_x = 4; - pixel_y = 6 - }, -/obj/effect/spawner/random/food_or_drink/booze{ - pixel_x = 4; - pixel_y = 6 - }, -/obj/effect/spawner/random/food_or_drink/donkpockets_single, -/obj/effect/spawner/random/food_or_drink/booze, -/obj/effect/spawner/random/food_or_drink/booze, -/obj/item/bodypart/head, -/obj/machinery/chem_dispenser/drinks/beer{ - pixel_y = 32 - }, -/turf/open/floor/mineral/titanium/tiled/white, -/area/ruin/space/has_grav/infested_frigate) "AH" = ( /obj/structure/cable, /obj/item/wallframe/telescreen/entertainment{ @@ -1744,6 +1787,14 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) +"BI" = ( +/obj/item/trash/flare, +/obj/item/ammo_casing/spent, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/light/broken/directional/south, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/infested_frigate) "BO" = ( /turf/closed/wall/mineral/plastitanium/overspace, /area/ruin/space/has_grav/infested_frigate) @@ -1804,7 +1855,7 @@ /area/ruin/space/has_grav/infested_frigate) "Eg" = ( /obj/item/stack/rods, -/turf/open/space/basic, +/turf/template_noop, /area/template_noop) "Er" = ( /obj/effect/turf_decal{ @@ -1835,12 +1886,6 @@ }, /turf/open/floor/mineral/titanium/tiled/white, /area/ruin/space/has_grav/infested_frigate) -"Ey" = ( -/obj/structure/broken_flooring/plating/directional/east, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/turf/open/space/basic, -/area/template_noop) "Ez" = ( /obj/structure/alien/weeds, /obj/effect/decal/cleanable/blood{ @@ -1850,7 +1895,7 @@ /area/ruin/space/has_grav/infested_frigate) "EB" = ( /obj/structure/girder/displaced, -/turf/open/space/basic, +/turf/template_noop, /area/template_noop) "EL" = ( /obj/effect/turf_decal{ @@ -1955,28 +2000,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/pod/dark, /area/ruin/space/has_grav/infested_frigate) -"Ft" = ( -/obj/structure/lattice, -/obj/effect/decal/cleanable/glass{ - dir = 1 - }, -/obj/structure/alien/resin/membrane{ - max_integrity = 1600; - desc = "Resin just thin enough to let light pass through, but it's congealing in the same way as the thicker stuff."; - name = "viscous resin membrane" - }, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/obj/structure/door_assembly/door_assembly_hatch{ - anchored = 1; - name = "crew quarters"; - desc = "People lived in this place."; - layer = 2.8 - }, -/turf/template_noop, -/area/ruin/space/has_grav/infested_frigate) "FJ" = ( /obj/machinery/suit_storage_unit/open, /obj/effect/turf_decal{ @@ -2079,28 +2102,17 @@ /mob/living/simple_animal/hostile/alien{ faction = list("syndicate","xenomorph") }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/infested_frigate) -"HQ" = ( -/obj/machinery/iv_drip, -/obj/item/clothing/mask/facehugger/dead, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal{ - icon_state = "warningline_white"; - dir = 1 - }, -/obj/machinery/light/broken/directional/west, -/obj/effect/turf_decal{ - icon_state = "warningline_white"; - dir = 8 - }, -/obj/structure/cable, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/turf/open/floor/pod/dark, +/turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) +"HD" = ( +/obj/structure/broken_flooring/singular/directional/south, +/turf/template_noop, +/area/template_noop) +"HP" = ( +/obj/structure/broken_flooring/plating/directional/north, +/obj/structure/broken_flooring/pile/directional/west, +/turf/template_noop, +/area/template_noop) "Im" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/mineral/plastitanium, @@ -2141,26 +2153,6 @@ /obj/machinery/power/smes, /turf/open/floor/plating, /area/ruin/space/has_grav/infested_frigate) -"IO" = ( -/obj/effect/turf_decal{ - icon_state = "warningline_white"; - dir = 1 - }, -/obj/item/storage/toolbox/a762{ - pixel_y = 16; - pixel_x = 5 - }, -/obj/item/storage/toolbox/a762{ - pixel_y = 8; - pixel_x = 3 - }, -/obj/item/storage/box/handcuffs{ - pixel_y = 2; - pixel_x = -8 - }, -/obj/structure/table/glass/plasmaglass, -/turf/open/floor/pod/dark, -/area/ruin/space/has_grav/infested_frigate) "IS" = ( /obj/item/ammo_casing/spent, /obj/item/ammo_casing/spent, @@ -2286,6 +2278,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) +"KD" = ( +/obj/effect/turf_decal{ + icon_state = "warningline_white"; + dir = 8 + }, +/obj/structure/barricade/security, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/infested_frigate) "KF" = ( /obj/item/ammo_casing/spent, /obj/item/ammo_casing/spent, @@ -2370,11 +2371,26 @@ /obj/item/ammo_casing/spent, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) -"Mm" = ( -/obj/structure/mirror{ - icon_state = "mirror_broke" +"Ml" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 1 }, -/turf/closed/wall/mineral/plastitanium, +/obj/effect/turf_decal/tile/bar, +/obj/item/bodypart/head/lizard, +/obj/item/bodypart/head/lizard, +/obj/item/bodypart/head, +/obj/item/bodypart/head, +/obj/item/bodypart/head, +/obj/effect/spawner/random/medical/memeorgans, +/obj/item/reagent_containers/condiment/rice, +/obj/item/reagent_containers/condiment/rice, +/obj/structure/closet/secure_closet/freezer/gulag_fridge{ + locked = 0 + }, +/obj/item/bodypart/head, +/obj/effect/spawner/random/food_or_drink/cake_ingredients, +/obj/machinery/light/broken/directional/north, +/turf/open/floor/mineral/titanium/tiled/white, /area/ruin/space/has_grav/infested_frigate) "Mp" = ( /obj/effect/turf_decal{ @@ -2414,14 +2430,21 @@ /obj/structure/alien/egg/burst, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) -"MG" = ( +"MH" = ( /obj/effect/turf_decal{ - dir = 8 + icon_state = "warningline_white"; + dir = 1 }, -/obj/machinery/mech_bay_recharge_port, /obj/effect/turf_decal{ - dir = 10 + icon_state = "warningline_white"; + dir = 4 + }, +/obj/effect/turf_decal{ + icon_state = "warningline_white" }, +/obj/structure/barricade/security, +/obj/structure/cable, +/obj/machinery/light/small/red/dim/directional/east, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) "ML" = ( @@ -2444,19 +2467,6 @@ /obj/effect/spawner/random/exotic/antag_gear, /turf/open/floor/pod/dark, /area/ruin/space/has_grav/infested_frigate) -"MN" = ( -/obj/structure/cable, -/obj/effect/turf_decal{ - icon_state = "warningline_white" - }, -/obj/machinery/light/very_dim/directional/west, -/obj/effect/turf_decal{ - icon_state = "warningline_white"; - dir = 8 - }, -/obj/machinery/vending/medical/infested_frigate, -/turf/open/floor/pod/dark, -/area/ruin/space/has_grav/infested_frigate) "MW" = ( /obj/effect/turf_decal{ icon_state = "arrows_red"; @@ -2483,6 +2493,18 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) +"NU" = ( +/obj/structure/cable, +/obj/effect/turf_decal{ + icon_state = "warningline_white" + }, +/obj/effect/turf_decal{ + icon_state = "warningline_white"; + dir = 4 + }, +/obj/machinery/computer/operating, +/turf/open/floor/pod/dark, +/area/ruin/space/has_grav/infested_frigate) "NX" = ( /obj/structure/table/glass, /obj/effect/decal/cleanable/glass, @@ -2516,7 +2538,7 @@ /obj/item/stack/rods{ amount = 23 }, -/turf/open/space/basic, +/turf/template_noop, /area/template_noop) "Ou" = ( /obj/structure/cable, @@ -2550,24 +2572,6 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) -"ON" = ( -/obj/effect/turf_decal{ - dir = 4 - }, -/obj/effect/turf_decal{ - dir = 1 - }, -/obj/effect/turf_decal{ - dir = 5 - }, -/obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear, -/obj/effect/decal/cleanable/blood/gibs{ - icon_state = "gib1-old" - }, -/obj/machinery/light/very_dim/directional/east, -/obj/item/ammo_casing/spent, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/infested_frigate) "OW" = ( /obj/effect/turf_decal{ dir = 4 @@ -2580,29 +2584,6 @@ /obj/effect/decal/cleanable/plastic, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) -"Pa" = ( -/obj/effect/turf_decal{ - icon_state = "arrows_red"; - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood/gibs{ - icon_state = "gib6-old"; - dir = 8 - }, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent, -/obj/effect/turf_decal{ - icon_state = "warningline_white"; - dir = 8 - }, -/obj/machinery/light/broken/directional/south, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/infested_frigate) "Pb" = ( /obj/structure/alien/resin/membrane{ max_integrity = 1600; @@ -2658,6 +2639,13 @@ "Qg" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/space/has_grav/infested_frigate) +"Qj" = ( +/obj/structure/broken_flooring/plating/directional/north, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/turf/template_noop, +/area/template_noop) "Qm" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -2672,16 +2660,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) -"Qp" = ( -/obj/machinery/light/broken/directional/south, -/obj/item/ammo_casing/spent, -/obj/effect/decal/cleanable/blood{ - icon_state = "drip1" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/infested_frigate) "QA" = ( /obj/effect/turf_decal{ dir = 1 @@ -2689,6 +2667,10 @@ /obj/machinery/suit_storage_unit/open, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) +"QL" = ( +/obj/structure/broken_flooring/singular/directional/east, +/turf/template_noop, +/area/template_noop) "Ru" = ( /obj/effect/turf_decal/delivery, /obj/effect/decal/cleanable/dirt, @@ -2739,17 +2721,6 @@ }, /turf/open/floor/mineral/titanium/tiled/white, /area/ruin/space/has_grav/infested_frigate) -"RK" = ( -/obj/machinery/light/broken/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/structure/alien/weeds/node{ - maximum_growtime = 240000; - minimum_growtime = 120000; - growtime = 150000 - }, -/obj/item/ammo_casing/spent, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/infested_frigate) "RS" = ( /obj/structure/cable, /obj/structure/barricade/security, @@ -2777,7 +2748,7 @@ /area/ruin/space/has_grav/infested_frigate) "RY" = ( /obj/effect/spawner/random/trash, -/turf/open/space/basic, +/turf/template_noop, /area/template_noop) "Sr" = ( /obj/effect/turf_decal{ @@ -2811,6 +2782,25 @@ /obj/item/ammo_casing/spent, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) +"SL" = ( +/obj/machinery/iv_drip, +/obj/item/clothing/mask/facehugger/dead, +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/effect/turf_decal{ + icon_state = "warningline_white"; + dir = 1 + }, +/obj/effect/turf_decal{ + icon_state = "warningline_white"; + dir = 8 + }, +/obj/structure/cable, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/turf/open/floor/pod/dark, +/area/ruin/space/has_grav/infested_frigate) "SM" = ( /obj/structure/cable, /obj/structure/alien/weeds, @@ -2864,6 +2854,22 @@ /obj/structure/alien/egg/burst, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) +"Td" = ( +/obj/effect/turf_decal{ + icon_state = "warningline_white" + }, +/obj/item/ammo_casing/spent, +/obj/effect/turf_decal{ + icon_state = "warningline_white"; + dir = 4 + }, +/obj/effect/turf_decal{ + icon_state = "warningline_white"; + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/infested_frigate) "TL" = ( /obj/structure/table/optable, /obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear, @@ -2917,18 +2923,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) -"Vo" = ( -/obj/structure/cable, +"Vf" = ( /obj/effect/turf_decal{ - icon_state = "warningline_white" + dir = 1 }, -/obj/machinery/light/broken/directional/east, -/obj/effect/turf_decal{ - icon_state = "warningline_white"; - dir = 4 +/obj/machinery/suit_storage_unit/open, +/obj/machinery/light/red/dim/directional/north, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/infested_frigate) +"Vt" = ( +/obj/effect/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + icon_state = "ltrails_1"; + dir = 10 }, -/obj/machinery/computer/operating, -/turf/open/floor/pod/dark, +/obj/effect/decal/cleanable/food/egg_smudge, +/obj/machinery/light/small/broken/directional/south, +/turf/open/floor/iron/freezer, /area/ruin/space/has_grav/infested_frigate) "VQ" = ( /obj/structure/window/spawner/directional/west, @@ -2947,7 +2958,7 @@ /area/ruin/space/has_grav/infested_frigate) "VR" = ( /obj/item/tank/internals/oxygen/empty, -/turf/open/space/basic, +/turf/template_noop, /area/template_noop) "VU" = ( /obj/structure/cable, @@ -3014,23 +3025,8 @@ /obj/item/stack/rods{ amount = 50 }, -/turf/open/space/basic, +/turf/template_noop, /area/template_noop) -"Xa" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal{ - icon_state = "warningline_white"; - dir = 1 - }, -/obj/effect/spawner/random/trash/mess, -/obj/structure/sign/poster/contraband/random/directional/south, -/obj/item/kirbyplants/random, -/obj/machinery/light/broken/directional/south, -/turf/open/floor/mineral/titanium/tiled/white, -/area/ruin/space/has_grav/infested_frigate) "Xc" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/reinforced, @@ -3096,28 +3092,6 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/infested_frigate) -"Yf" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/blood/gibs{ - icon_state = "ltrails_1"; - dir = 1 - }, -/obj/machinery/light/small/broken/directional/west, -/obj/effect/turf_decal{ - icon_state = "warningline_white"; - dir = 1 - }, -/obj/effect/turf_decal{ - icon_state = "warningline_white"; - dir = 8 - }, -/obj/effect/turf_decal{ - icon_state = "warningline_white" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/infested_frigate) "YV" = ( /obj/effect/turf_decal{ icon_state = "warningline_white" @@ -3143,6 +3117,19 @@ }, /turf/open/floor/mineral/titanium/tiled/white, /area/ruin/space/has_grav/infested_frigate) +"YY" = ( +/obj/machinery/light/very_dim/directional/south, +/obj/structure/window/spawner/directional/west, +/obj/effect/decal/cleanable/glass, +/obj/structure/table_frame, +/obj/item/shard, +/obj/effect/turf_decal{ + icon_state = "warningline_white"; + dir = 1 + }, +/obj/effect/spawner/random/medical/minor_healing, +/turf/open/floor/pod/dark, +/area/ruin/space/has_grav/infested_frigate) "Ze" = ( /obj/item/shard{ icon_state = "titaniumtiny" @@ -3378,7 +3365,7 @@ fl fl fl fl -Mm +mo mG wP bJ @@ -3387,7 +3374,7 @@ sQ KZ wP ef -jf +Vt wP fl fl @@ -3440,7 +3427,7 @@ df DR Hx LF -Ar +fr kT wP fl @@ -3468,7 +3455,7 @@ ku PD LF Ux -bg +zg wP fl fl @@ -3601,7 +3588,7 @@ Cm mp ti Qg -tU +Ml hB xB vj @@ -3630,7 +3617,7 @@ RS Qg Qg Ah -Xa +hW wP fl fl @@ -3652,9 +3639,9 @@ BO nN mw wP -MN +uy sA -HQ +SL wP dx wP @@ -3675,7 +3662,7 @@ fM fl fl sT -pu +HP xi KB wP @@ -3697,18 +3684,18 @@ fl fl fl fl -dA +QL fl Or fl -Ey +be zN -gP +sT Lf wP VQ Ff -tJ +YY wP Tb wP @@ -3727,7 +3714,7 @@ RY fl fl fl -zb +rO fl pq wq @@ -3756,13 +3743,13 @@ fl fl Eg fl -rb -Ft +Qj +er Qm wP -Vo +NU Hc -cv +vR wP wt wP @@ -3773,13 +3760,13 @@ fl "} (22,1,1) = {" fl -mx +HD fl fl qF aB fl -sK +zU fl fl fl @@ -3814,9 +3801,9 @@ vj EL yP Fg -RK +hI wJ -kp +mk Jx lU Rx @@ -3836,13 +3823,13 @@ fl fl fl fl -mx +HD vj ug Nu CE uG -fa +pk Fs Im iy @@ -3947,13 +3934,13 @@ fl fl fl wP -nu +cj wP FJ vx Jw wP -Qp +or wP fl fl @@ -3978,7 +3965,7 @@ bD wP zV kS -IO +vo wP wu wP @@ -4028,13 +4015,13 @@ fl fl fl wP -hu +lx wP wP wi wP wP -ye +BI wP fl fl @@ -4059,7 +4046,7 @@ Bw ip BA sZ -Yf +rz Ai KC vj @@ -4084,9 +4071,9 @@ fl vj HA Cm -qq +Td st -jA +MH eE AM vj @@ -4102,7 +4089,7 @@ fl fl fl fl -mx +HD fl fl fl @@ -4244,13 +4231,13 @@ fl fl fl wP -zE +KD rL cw SS aY ie -Pa +eo wP fl fl @@ -4304,7 +4291,7 @@ kc mn hK LO -MG +vH wP fl fl @@ -4325,7 +4312,7 @@ fl fl fl wP -QA +Vf SE vz Xm @@ -4379,13 +4366,13 @@ fl fl fl wP -ON +fc Oy OW Jh Mp Bh -ka +gW wP fl fl diff --git a/_maps/RandomRuins/SpaceRuins/intactemptyship.dmm b/_maps/RandomRuins/SpaceRuins/intactemptyship.dmm index 6c0721fcbff82..f54460937b02a 100644 --- a/_maps/RandomRuins/SpaceRuins/intactemptyship.dmm +++ b/_maps/RandomRuins/SpaceRuins/intactemptyship.dmm @@ -23,27 +23,9 @@ }, /turf/template_noop, /area/ruin/space/has_grav/powered/authorship) -"f" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/power/shuttle_engine/heater{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/powered/authorship) -"g" = ( -/obj/structure/table/wood, -/obj/item/clothing/under/shorts/black, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/space/has_grav/powered/authorship) "h" = ( /turf/open/floor/mineral/titanium/purple, /area/ruin/space/has_grav/powered/authorship) -"i" = ( -/obj/structure/table, -/obj/item/flashlight/lamp, -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/space/has_grav/powered/authorship) "j" = ( /obj/structure/closet, /turf/open/floor/mineral/titanium/purple, @@ -57,14 +39,15 @@ /obj/item/clothing/shoes/sandal, /turf/open/floor/mineral/titanium/purple, /area/ruin/space/has_grav/powered/authorship) -"m" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/space/has_grav/powered/authorship) "n" = ( /obj/structure/table/wood, /turf/open/floor/mineral/titanium/purple, /area/ruin/space/has_grav/powered/authorship) +"o" = ( +/obj/structure/table, +/obj/item/flashlight/lamp, +/turf/open/floor/mineral/titanium/purple, +/area/ruin/space/has_grav/powered/authorship) "p" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -100,16 +83,6 @@ }, /turf/open/floor/mineral/titanium/purple, /area/ruin/space/has_grav/powered/authorship) -"w" = ( -/obj/structure/table/wood, -/obj/item/paper, -/obj/item/pen, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/space/has_grav/powered/authorship) -"x" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/space/has_grav/powered/authorship) "y" = ( /mob/living/simple_animal/bot/medbot/derelict, /turf/open/floor/mineral/titanium/purple, @@ -129,15 +102,52 @@ icon_state = "diagonalWall3" }, /area/ruin/space/has_grav/powered/authorship) -"C" = ( -/obj/machinery/light/directional/south, +"D" = ( +/obj/machinery/door/airlock/external/ruin, +/turf/open/floor/mineral/titanium/purple, +/area/ruin/space/has_grav/powered/authorship) +"K" = ( /obj/structure/bed, /turf/open/floor/mineral/titanium/purple, /area/ruin/space/has_grav/powered/authorship) -"D" = ( -/obj/machinery/door/airlock/external/ruin, +"M" = ( +/obj/machinery/light/floor, +/turf/open/floor/mineral/titanium/purple, +/area/ruin/space/has_grav/powered/authorship) +"N" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green, +/turf/open/floor/mineral/titanium/purple, +/area/ruin/space/has_grav/powered/authorship) +"P" = ( +/obj/structure/table/wood, +/obj/machinery/light/small/directional/south, +/turf/open/floor/mineral/titanium/purple, +/area/ruin/space/has_grav/powered/authorship) +"Q" = ( +/obj/machinery/light_switch/directional/north, +/turf/open/floor/mineral/titanium/purple, +/area/ruin/space/has_grav/powered/authorship) +"R" = ( +/obj/structure/table/wood, +/obj/item/clothing/under/shorts/black, +/obj/machinery/light/small/directional/north, +/turf/open/floor/mineral/titanium/purple, +/area/ruin/space/has_grav/powered/authorship) +"U" = ( +/obj/structure/table/wood, +/obj/item/paper, +/obj/item/pen, +/obj/machinery/light/directional/east, /turf/open/floor/mineral/titanium/purple, /area/ruin/space/has_grav/powered/authorship) +"W" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/power/shuttle_engine/heater{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/ruin/space/has_grav/powered/authorship) (1,1,1) = {" a @@ -167,20 +177,20 @@ a "} (3,1,1) = {" b -f -f +W +W c q +M h -x c -f -f +W +W z "} (4,1,1) = {" c -g +R l c p @@ -188,7 +198,7 @@ D p c A -n +P c "} (5,1,1) = {" @@ -200,21 +210,21 @@ h h y c -h -n +Q +N c "} (6,1,1) = {" c -i +o +h h -m h h h -m h -C +h +K c "} (7,1,1) = {" @@ -223,7 +233,7 @@ j h h h -h +M h h h @@ -260,11 +270,11 @@ B a a c -m h h h -m +h +h c a a @@ -288,7 +298,7 @@ a c j r -w +U n j c diff --git a/_maps/RandomRuins/SpaceRuins/interdyne.dmm b/_maps/RandomRuins/SpaceRuins/interdyne.dmm index b35c0649fc0e0..bd0ba4cc2ff7f 100644 --- a/_maps/RandomRuins/SpaceRuins/interdyne.dmm +++ b/_maps/RandomRuins/SpaceRuins/interdyne.dmm @@ -1,10 +1,4 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"ak" = ( -/obj/effect/mapping_helpers/burnt_floor, -/obj/structure/cable, -/obj/machinery/light/cold/no_nightlight/directional/south, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) "am" = ( /obj/effect/mob_spawn/corpse/human/doctor, /obj/structure/cable, @@ -32,12 +26,6 @@ /obj/machinery/light/blacklight/directional/north, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"bU" = ( -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/zombie, -/obj/structure/cable, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) "bV" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -47,14 +35,8 @@ "bW" = ( /turf/template_noop, /area/template_noop) -"bZ" = ( -/obj/machinery/chem_heater/withbuffer, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) -"cj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"ca" = ( +/obj/machinery/light/blacklight/directional/north, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) "ck" = ( @@ -68,6 +50,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"cG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/gibspawner/generic, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/interdyne) "cJ" = ( /obj/effect/decal/cleanable/glass/plastitanium, /obj/structure/shipping_container/interdyne, @@ -77,14 +65,6 @@ /obj/structure/shipping_container/interdyne, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"dk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) "dC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -96,8 +76,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) -"dR" = ( +"dJ" = ( /obj/effect/decal/cleanable/dirt, +/obj/item/pizzabox, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) "dU" = ( @@ -113,12 +94,6 @@ /obj/item/reagent_containers/cup/glass/bottle/molotov, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) -"ej" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/gibspawner/generic, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) "et" = ( /obj/effect/gibspawner/human, /turf/open/floor/mineral/plastitanium, @@ -128,12 +103,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"eI" = ( -/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/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) "eJ" = ( /mob/living/simple_animal/hostile/zombie, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -153,11 +122,9 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) -"fj" = ( -/obj/effect/gibspawner/generic, -/obj/machinery/light/blacklight/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/mineral/plastitanium, +"eR" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) "fs" = ( /obj/structure/table/wood/fancy/black, @@ -172,13 +139,6 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"fx" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/interdyne) "fS" = ( /obj/machinery/vending/medical/syndicate_access, /turf/open/floor/mineral/plastitanium, @@ -187,11 +147,13 @@ /obj/effect/mob_spawn/corpse/human/geneticist, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"gi" = ( -/obj/machinery/light/blacklight/directional/north, -/obj/structure/rack, -/obj/effect/spawner/random/exotic/tool, -/turf/open/floor/iron/smooth, +"gp" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/light/cold/no_nightlight/directional/south, +/turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) "gV" = ( /obj/structure/cable, @@ -208,18 +170,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"he" = ( -/obj/structure/fluff{ - desc = "Ew, I think I see a hairball."; - icon = 'icons/obj/lavaland/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, -/obj/machinery/shower/directional/east, -/obj/item/soap/syndie, -/obj/machinery/light/blacklight/directional/north, -/turf/open/floor/iron/showroomfloor, -/area/ruin/space/has_grav/interdyne) "hi" = ( /obj/structure/sign/departments/chemistry, /turf/closed/wall/mineral/plastitanium, @@ -269,6 +219,10 @@ /obj/structure/table/optable, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"kl" = ( +/obj/machinery/light/blacklight/directional/west, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/interdyne) "kp" = ( /obj/structure/cable, /obj/item/paper/fluff/ruins/interdyne/note_2, @@ -284,9 +238,10 @@ /obj/structure/closet/secure_closet/freezer/fridge/open, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) -"kH" = ( +"kI" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/south, +/obj/structure/table/wood, +/obj/item/book/granter/sign_language, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) "kL" = ( @@ -302,10 +257,6 @@ /obj/structure/filingcabinet, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) -"kV" = ( -/obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear, -/turf/open/floor/iron/smooth, -/area/ruin/space/has_grav/interdyne) "li" = ( /obj/machinery/door/poddoor{ id = "interdyne_vault" @@ -313,15 +264,6 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/interdyne) -"lQ" = ( -/obj/machinery/light/blacklight/directional/south, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) "ma" = ( /obj/structure/bed{ dir = 4 @@ -379,6 +321,11 @@ /obj/item/paper/fluff/junkmail_generic, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"ne" = ( +/obj/structure/cable, +/obj/machinery/jukebox, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/interdyne) "nm" = ( /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/mineral/plastitanium, @@ -389,11 +336,6 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"nA" = ( -/obj/machinery/light/blacklight/directional/north, -/obj/structure/cable, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) "nU" = ( /obj/structure/rack, /obj/item/storage/medkit/brute, @@ -409,16 +351,17 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/interdyne) -"oJ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/ruin/space/has_grav/interdyne) "oO" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"oS" = ( +/obj/structure/rack, +/obj/effect/spawner/random/exotic/tool, +/turf/open/floor/iron/smooth, +/area/ruin/space/has_grav/interdyne) "pb" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/storage/box/syringes, @@ -462,13 +405,6 @@ /obj/item/paper/fluff/junkmail_redpill, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"qt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/maintenance{ - name = "Restroom" - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) "qS" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/storage/box/beakers, @@ -519,11 +455,6 @@ /obj/item/paper/fluff/ruins/interdyne/note_5, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/interdyne) -"sJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/oil/streak, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/interdyne) "tg" = ( /obj/effect/gibspawner/human, /obj/structure/cable, @@ -544,6 +475,10 @@ /obj/effect/decal/cleanable/glass/plastitanium, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"tH" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/interdyne) "ua" = ( /obj/structure/mirror/directional/west, /turf/open/floor/mineral/plastitanium, @@ -552,16 +487,18 @@ /obj/effect/mob_spawn/corpse/human/monkey, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"uw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/interdyne) "uy" = ( /mob/living/simple_animal/hostile/zombie, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"uS" = ( -/obj/machinery/light/blacklight/directional/south, -/obj/structure/cable, -/obj/machinery/power/rtg/advanced, -/turf/open/floor/iron/smooth, -/area/ruin/space/has_grav/interdyne) "vd" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -573,14 +510,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) +"vA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/oil/streak, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/interdyne) "vK" = ( /obj/structure/chair/office/tactical, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"vU" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/interdyne) "wx" = ( /obj/structure/bed{ dir = 1 @@ -595,14 +533,6 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/interdyne) -"wF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) "wJ" = ( /obj/machinery/door/airlock/science/glass, /obj/structure/cable, @@ -632,11 +562,6 @@ /obj/machinery/griddle, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) -"yb" = ( -/obj/structure/cable, -/obj/machinery/light/blacklight/directional/north, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) "yt" = ( /obj/machinery/chem_dispenser/drinks/fullupgrade{ dir = 8 @@ -644,17 +569,23 @@ /obj/structure/table/reinforced, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) -"yN" = ( +"zp" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/sleeper/syndie{ - dir = 4 - }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) "zx" = ( /obj/structure/flora/rock/icy/style_3, /turf/open/misc/asteroid/airless, /area/ruin/space/has_grav/interdyne) +"zU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/structure/rack, +/obj/item/storage/medkit/regular, +/turf/open/floor/iron/smooth, +/area/ruin/space/has_grav/interdyne) "zX" = ( /obj/machinery/light/blacklight/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -665,27 +596,28 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) +"Ak" = ( +/obj/machinery/computer/atmos_control/noreconnect{ + atmos_chambers = list("interdyne_atmos"="Air Supply"); + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/interdyne) "Am" = ( /obj/structure/table/wood, /obj/item/pizzabox/margherita, /obj/item/food/pizzaslice/arnold, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"Aw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/interdyne) "AC" = ( /obj/structure/closet/secure_closet/chemical, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"AF" = ( -/obj/machinery/light/blacklight/directional/south, +"AD" = ( /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/cold/no_nightlight/directional/south, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) "AN" = ( @@ -709,6 +641,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"Bk" = ( +/obj/machinery/light/blacklight/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/interdyne) "Bx" = ( /obj/structure/table/reinforced/rglass, /obj/item/paper/fluff/ruins/interdyne/note_3, @@ -719,34 +660,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) -"BR" = ( +"BZ" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/light/blacklight/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/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"BW" = ( -/obj/structure/safe, -/obj/item/documents/syndicate, +"Ci" = ( +/obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear, /obj/machinery/light/blacklight/directional/north, -/obj/item/stack/spacecash/c1000, -/obj/item/stack/spacecash/c1000, -/obj/item/stack/spacecash/c1000, -/obj/item/gps/spaceruin, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/interdyne) -"CP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/wood, -/obj/item/book/granter/sign_language, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) -"CW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/sofa/corp/right, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/interdyne) "DA" = ( /mob/living/simple_animal/hostile/zombie, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -778,15 +702,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"Ej" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) "Eq" = ( /obj/effect/mob_spawn/corpse/human/doctor, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -802,10 +717,18 @@ /obj/effect/mapping_helpers/apc/cell_10k, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/interdyne) -"Fw" = ( -/obj/machinery/light/blacklight/directional/north, +"Ft" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/zombie, /obj/structure/cable, -/obj/machinery/jukebox, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/interdyne) +"Fv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) "FC" = ( @@ -813,6 +736,23 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"FF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/interdyne) +"FN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/maintenance{ + name = "Restroom" + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/interdyne) +"Gk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/sofa/corp/left, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/interdyne) "Go" = ( /obj/machinery/chem_master, /obj/structure/cable, @@ -822,6 +762,11 @@ /obj/machinery/chem_master, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"Gq" = ( +/obj/structure/cable, +/obj/machinery/power/rtg/advanced, +/turf/open/floor/iron/smooth, +/area/ruin/space/has_grav/interdyne) "GK" = ( /obj/machinery/door/airlock/hatch, /obj/effect/mapping_helpers/airlock/access/all/medical/general, @@ -833,12 +778,6 @@ /obj/machinery/light/cold/no_nightlight/directional/north, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"HF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) "HP" = ( /obj/item/pizzabox, /obj/machinery/light/blacklight/directional/north, @@ -848,21 +787,42 @@ /obj/machinery/light/blacklight/directional/south, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) +"Id" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/interdyne) "Ie" = ( /obj/effect/decal/cleanable/glass/plastitanium, /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"In" = ( +/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/mineral/plastitanium, +/area/ruin/space/has_grav/interdyne) +"Iq" = ( +/obj/structure/safe, +/obj/item/documents/syndicate, +/obj/item/stack/spacecash/c1000, +/obj/item/stack/spacecash/c1000, +/obj/item/stack/spacecash/c1000, +/obj/item/gps/spaceruin, +/turf/open/floor/iron/smooth, +/area/ruin/space/has_grav/interdyne) "IL" = ( /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, /turf/open/floor/plating, /area/ruin/space/has_grav/interdyne) -"Jm" = ( -/obj/machinery/light/blacklight/directional/south, +"IR" = ( /obj/structure/rack, -/obj/item/stack/sheet/mineral/gold{ +/obj/item/stack/sheet/mineral/silver{ amount = 25 }, +/obj/machinery/light/blacklight/directional/south, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/interdyne) "Jo" = ( @@ -891,13 +851,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"JH" = ( -/obj/structure/rack, -/obj/item/stack/sheet/mineral/silver{ - amount = 25 - }, -/turf/open/floor/iron/smooth, -/area/ruin/space/has_grav/interdyne) "JM" = ( /obj/machinery/computer/arcade{ dir = 1 @@ -913,6 +866,12 @@ /obj/machinery/vending/sovietsoda, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) +"Kh" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/interdyne) "Kv" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/light/blacklight/directional/north, @@ -924,9 +883,18 @@ icon_state = "asteroid1" }, /area/ruin/space/has_grav/interdyne) -"KA" = ( +"KI" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/cable, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/interdyne) +"KN" = ( +/obj/structure/closet/crate/mail, +/obj/item/mail/junkmail, +/obj/item/mail/junkmail, +/obj/item/paper/fluff/junkmail_generic, /obj/effect/decal/cleanable/dirt, -/turf/closed/wall/mineral/plastitanium, +/turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) "KP" = ( /turf/open/misc/asteroid/airless{ @@ -948,21 +916,6 @@ icon_state = "asteroid12" }, /area/ruin/space/has_grav/interdyne) -"LB" = ( -/obj/machinery/light/blacklight/directional/north, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) -"LE" = ( -/obj/structure/closet/crate/mail, -/obj/item/mail/junkmail, -/obj/item/mail/junkmail, -/obj/item/paper/fluff/junkmail_generic, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) "Me" = ( /turf/open/misc/asteroid/airless, /area/ruin/space/has_grav/interdyne) @@ -971,10 +924,9 @@ /obj/item/paper/fluff/ruins/interdyne/note_4, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"MA" = ( +"Mn" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/chair/sofa/corp, -/turf/open/floor/mineral/plastitanium/red, +/turf/open/floor/iron/smooth, /area/ruin/space/has_grav/interdyne) "MB" = ( /obj/structure/cable, @@ -982,6 +934,14 @@ /obj/machinery/light/blacklight/directional/east, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"MJ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/interdyne) "MY" = ( /obj/structure/cable, /obj/machinery/airalarm/directional/south, @@ -1012,6 +972,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"NU" = ( +/obj/structure/fluff{ + desc = "Ew, I think I see a hairball."; + icon = 'icons/obj/mining_zones/survival_pod.dmi'; + icon_state = "fan_tiny"; + name = "shower drain" + }, +/obj/machinery/shower/directional/east, +/obj/item/soap/syndie, +/obj/machinery/light/blacklight/directional/north, +/turf/open/floor/iron/showroomfloor, +/area/ruin/space/has_grav/interdyne) "NV" = ( /obj/structure/toilet{ dir = 4 @@ -1029,20 +1001,6 @@ /obj/structure/sink/directional/south, /turf/open/floor/iron/showroomfloor, /area/ruin/space/has_grav/interdyne) -"OD" = ( -/obj/machinery/light/blacklight/directional/south, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/interdyne) -"OR" = ( -/obj/machinery/computer/atmos_control/noreconnect{ - atmos_chambers = list("interdyne_atmos"="Air Supply"); - dir = 4 - }, -/obj/machinery/light/blacklight/directional/north, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/interdyne) "OW" = ( /obj/machinery/power/smes/engineering{ input_available = 100000; @@ -1051,13 +1009,18 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/interdyne) +"Po" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/interdyne) "PB" = ( /obj/structure/table/reinforced/ctf, /obj/machinery/microwave, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) "PD" = ( -/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/item/surgery_tray/full, /obj/structure/table/reinforced/rglass, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) @@ -1065,17 +1028,18 @@ /obj/machinery/dna_scannernew, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"PP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/gibspawner/generic, -/obj/structure/cable, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) "PX" = ( /obj/item/kirbyplants/random, /obj/structure/cable, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) +"Qj" = ( +/obj/structure/rack, +/obj/item/stack/sheet/mineral/gold{ + amount = 25 + }, +/turf/open/floor/iron/smooth, +/area/ruin/space/has_grav/interdyne) "Qw" = ( /obj/effect/decal/cleanable/oil/streak, /turf/open/floor/mineral/plastitanium, @@ -1111,10 +1075,9 @@ "Rn" = ( /turf/closed/mineral/random, /area/ruin/space/has_grav/interdyne) -"Ro" = ( +"RB" = ( /obj/effect/mapping_helpers/burnt_floor, /obj/structure/cable, -/obj/machinery/light/cold/no_nightlight/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/plastitanium, @@ -1124,12 +1087,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"RG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/blacklight/directional/north, -/obj/structure/cable, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) "RR" = ( /obj/machinery/door/airlock/hatch, /obj/structure/barricade/wooden/crude, @@ -1142,6 +1099,11 @@ /obj/effect/decal/cleanable/glass/plastitanium, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"Su" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/sofa/corp/right, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/interdyne) "Sy" = ( /obj/structure/cable, /obj/machinery/airalarm/directional/east, @@ -1153,6 +1115,11 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"SC" = ( +/obj/machinery/chem_heater/withbuffer, +/obj/machinery/light/blacklight/directional/south, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/interdyne) "SE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/plastitanium, @@ -1193,6 +1160,15 @@ /obj/item/clothing/mask/chameleon/broken, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/interdyne) +"Um" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/interdyne) "Un" = ( /obj/effect/decal/cleanable/oil/streak, /turf/open/floor/mineral/plastitanium/red, @@ -1208,11 +1184,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"Vi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/interdyne) "Vp" = ( /obj/structure/rack, /obj/item/clothing/shoes/chameleon, @@ -1222,27 +1193,30 @@ /obj/machinery/vending/boozeomat, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) -"VN" = ( -/obj/machinery/light/cold/no_nightlight/directional/south, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/interdyne) "VR" = ( /obj/machinery/computer/scan_consolenew{ dir = 1 }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"Wa" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/sofa/corp/left, -/obj/machinery/light/blacklight/directional/north, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/interdyne) "Wc" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"Wd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/interdyne) +"Wf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/sleeper/syndie{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/interdyne) "Wv" = ( /obj/item/bedsheet/syndie/double{ dir = 4 @@ -1258,11 +1232,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"WM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/blacklight/directional/north, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) "WU" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -1270,10 +1239,10 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"Xh" = ( -/obj/effect/mapping_helpers/burnt_floor, +"XC" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/gibspawner/generic, +/obj/structure/cable, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) "XD" = ( @@ -1285,9 +1254,10 @@ /obj/machinery/vending/cigarette/syndicate, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) -"XT" = ( +"Ya" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/pizzabox, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) "Ye" = ( @@ -1317,16 +1287,14 @@ "Yv" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/space/has_grav/interdyne) -"YB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/structure/rack, -/obj/item/storage/medkit/regular, -/turf/open/floor/iron/smooth, -/area/ruin/space/has_grav/interdyne) "Zi" = ( /turf/closed/wall/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"Zr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/sofa/corp, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/interdyne) "Zu" = ( /obj/effect/decal/cleanable/glass/plastitanium, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1463,7 +1431,7 @@ Zi QD hG Zi -QD +kl Zi ma Am @@ -1493,7 +1461,7 @@ Rh aY aY Lb -VN +aY Zi QD QD @@ -1501,7 +1469,7 @@ JC fu Zi xf -XT +dJ Zi QD Ww @@ -1526,23 +1494,23 @@ Zi ri aY Lb -vU +eR aY QZ Zi Zi Zi -KA -yb +Zi +fu Zi HP jI -KA +Zi bE -CP -KA +kI +Zi bE -dR +tH Bf Zi Rn @@ -1561,11 +1529,11 @@ Zi QR mD rW -sJ +vA Un -fx +gp Zi -he +NU NV Zi fu @@ -1577,7 +1545,7 @@ JC Zi Zi QD -dR +tH QD Zi Rn @@ -1602,13 +1570,13 @@ QC Zi Oo DH -qt +FN fu Js KW MB gV -Ej +Um fu pE fu @@ -1633,7 +1601,7 @@ am mD Rh aY -VN +aY Zi Zi Zi @@ -1643,7 +1611,7 @@ Zi Zi Zi Zi -eI +Ya ZT Zi fs @@ -1678,7 +1646,7 @@ dU dU dU Zi -KA +Zi NG Zi Zi @@ -1706,17 +1674,17 @@ Zi RR Zi dU -gi +oS Ye Ub EM -Jm +Qj dU Zi cF US -KA -yN +Zi +Wf fS AN Zi @@ -1742,18 +1710,18 @@ fu Zi dU Ul -oJ +Mn nU EM -JH +IR dU Zi -fj +AV Ei Zi -RG +BZ +fu fu -AF Zi jF bW @@ -1768,8 +1736,8 @@ Me Rn Rn Zi -LE -dR +KN +tH Eh et uy @@ -1778,8 +1746,8 @@ Zi dU Vp EM -YB -oJ +zU +Mn me dU Zi @@ -1808,7 +1776,7 @@ Qw QD Zu bV -ak +KI Zi dU Fe @@ -1820,7 +1788,7 @@ li fu eJ WU -KA +Zi gV vd xb @@ -1842,7 +1810,7 @@ nm QD vd Rg -Xh +Kh qj Zi dU @@ -1856,9 +1824,9 @@ Zi Yi US NG -BR +In SE -kH +FF Zi Rn Rn @@ -1877,11 +1845,11 @@ eE Ie SE pR -dR +tH ck Zi dU -kV +Ci sD IL UN @@ -1912,21 +1880,21 @@ fu rr Nb Bj -HF -oO +zp +AD Zi dU -BW +Iq EM IL ox -uS +Gq dU Zi zX -lQ +MJ Zi -nA +fu QD rL Zi @@ -1983,7 +1951,7 @@ QD QD nm nm -Ro +RB Yv Zi Zi @@ -2023,16 +1991,16 @@ JD oO jA jA -dk +Bk jA jA Zi -Fw -cj +ne +Wd qa JM Zi -OR +Ak IL si Zi @@ -2048,14 +2016,14 @@ Rn Rn Rn Zi -QD +GY cJ mQ QD vd Te Zi -LB +oO Nb Sy oO @@ -2083,7 +2051,7 @@ Rn Rn Rn Zi -GY +QD QD pp uy @@ -2097,10 +2065,10 @@ wJ Zi Zi Yv -aY +ca Nr Jo -OD +Po GK Ai IL @@ -2127,15 +2095,15 @@ Zi Zi oO Yv -WM +tH US QD PF Zi -CW +Su Bx vg -Aw +Fv Yv Zi Yv @@ -2159,7 +2127,7 @@ Zi Zi Zi hi -bE +QD kp Zi fu @@ -2167,10 +2135,10 @@ Og bV VR Zi -MA +Zr eg By -Vi +Id kA VC Zi @@ -2202,7 +2170,7 @@ Nb DA ga Zi -Wa +Gk eh Nr eQ @@ -2227,20 +2195,20 @@ DL FC ot Sd -wF -PP -bU -bZ +uw +XC +Ft +SC Zi ub -ej +cG aI QD Zi XS iR aY -Vi +Id DP yt Zi diff --git a/_maps/RandomRuins/SpaceRuins/listeningstation.dmm b/_maps/RandomRuins/SpaceRuins/listeningstation.dmm index 80d6ed215dadd..366005b95a68a 100644 --- a/_maps/RandomRuins/SpaceRuins/listeningstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/listeningstation.dmm @@ -1,9 +1,4 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"ac" = ( -/obj/structure/sign/poster/official/nanotrasen_logo/directional/north, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron, -/area/ruin/space/has_grav/listeningstation) "ad" = ( /obj/machinery/airalarm/directional/west, /obj/structure/closet/crate/secure/freezer/commsagent, @@ -22,22 +17,30 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) -"ap" = ( -/obj/structure/marker_beacon/cerulean, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, -/turf/open/floor/plating/airless, -/area/ruin/space) +"aO" = ( +/obj/structure/sign/warning/vacuum/external/directional/west, +/obj/structure/cable, +/obj/machinery/light/small/red/directional/east, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) "aP" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) +"aQ" = ( +/obj/structure/table, +/obj/item/paper/fluff/ruins/listeningstation/reports/september, +/obj/item/storage/box/donkpockets{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/storage/box/donkpockets{ + pixel_x = 2 + }, +/turf/open/floor/iron/small, +/area/ruin/space/has_grav/listeningstation) "aR" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -133,19 +136,6 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"dC" = ( -/obj/structure/table, -/obj/item/paper/fluff/ruins/listeningstation/reports/september, -/obj/item/storage/box/donkpockets{ - pixel_x = -2; - pixel_y = 6 - }, -/obj/item/storage/box/donkpockets{ - pixel_x = 2 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/small, -/area/ruin/space/has_grav/listeningstation) "dW" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -204,16 +194,6 @@ /obj/machinery/hydroponics/soil, /turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) -"iU" = ( -/obj/structure/toilet{ - pixel_y = 18 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/soap/syndie, -/obj/structure/sign/poster/contraband/gorlex_recruitment/directional/west, -/obj/machinery/light/very_dim/directional/east, -/turf/open/floor/iron/showroomfloor, -/area/ruin/space/has_grav/listeningstation) "jr" = ( /obj/machinery/power/port_gen/pacman{ anchored = 1 @@ -254,13 +234,22 @@ anchored = 1 }, /obj/machinery/door/window/brigdoor{ - dir = 2; req_access = list("syndicate"); name = "Self Destruct Option" }, /obj/machinery/light/small/red/directional/north, /turf/open/floor/circuit/red, /area/ruin/space/has_grav/listeningstation) +"lO" = ( +/obj/structure/sign/nanotrasen{ + pixel_y = 32 + }, +/obj/structure/sign/nanotrasen{ + pixel_x = 32 + }, +/obj/structure/marker_beacon/cerulean, +/turf/open/floor/plating/airless, +/area/ruin/space) "nG" = ( /obj/effect/decal/cleanable/blood/drip, /obj/structure/table, @@ -315,9 +304,6 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) "rr" = ( -/obj/machinery/door/airlock{ - name = "Emergency Backup" - }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -362,6 +348,14 @@ /obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) +"vt" = ( +/obj/structure/lattice/catwalk, +/obj/structure/sign/nanotrasen{ + pixel_x = -32 + }, +/obj/structure/marker_beacon/cerulean, +/turf/template_noop, +/area/ruin/space) "vC" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -392,19 +386,8 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/small, /area/ruin/space/has_grav/listeningstation) -"wy" = ( -/obj/structure/marker_beacon/cerulean, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, -/turf/open/floor/plating/airless, -/area/ruin/space) "xh" = ( /obj/machinery/computer/records/medical/syndie{ - dir = 2; req_access = list("syndicate") }, /obj/machinery/light/small/directional/north, @@ -422,6 +405,12 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/listeningstation) +"xP" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/small, +/area/ruin/space/has_grav/listeningstation) "xY" = ( /obj/structure/sink/directional/west, /obj/machinery/shower/directional/north, @@ -609,6 +598,26 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) +"FC" = ( +/obj/structure/toilet{ + pixel_y = 18 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/soap/syndie, +/obj/structure/sign/poster/contraband/gorlex_recruitment/directional/west, +/obj/machinery/light/very_dim/directional/east, +/turf/open/floor/iron/showroomfloor, +/area/ruin/space/has_grav/listeningstation) +"FU" = ( +/obj/structure/sign/nanotrasen{ + pixel_y = -32 + }, +/obj/structure/sign/nanotrasen{ + pixel_x = 32 + }, +/obj/structure/marker_beacon/cerulean, +/turf/open/floor/plating/airless, +/area/ruin/space) "FV" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -662,14 +671,6 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"Jj" = ( -/obj/structure/lattice/catwalk, -/obj/structure/marker_beacon/cerulean, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, -/turf/template_noop, -/area/ruin/space) "JB" = ( /turf/closed/wall/r_wall, /area/ruin/space/has_grav/listeningstation) @@ -721,6 +722,13 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/listeningstation) +"MA" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/small, +/area/ruin/space/has_grav/listeningstation) "MS" = ( /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/plating, @@ -777,6 +785,13 @@ }, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/listeningstation) +"Or" = ( +/obj/structure/closet/crate/bin, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/small, +/area/ruin/space/has_grav/listeningstation) "OS" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -793,20 +808,12 @@ /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/machinery/door/airlock{ + name = "Emergency Backup" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"QI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/red/directional/south, -/turf/open/floor/plating, -/area/ruin/space/has_grav/listeningstation) -"RB" = ( -/obj/structure/closet/crate/bin, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/small, -/area/ruin/space/has_grav/listeningstation) "RK" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -816,11 +823,6 @@ /obj/machinery/light/warm/directional/south, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/listeningstation) -"RP" = ( -/obj/structure/table, -/obj/machinery/microwave, -/turf/open/floor/iron/small, -/area/ruin/space/has_grav/listeningstation) "Sx" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -846,14 +848,6 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/listeningstation) -"SQ" = ( -/obj/structure/lattice/catwalk, -/obj/structure/marker_beacon/cerulean, -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, -/turf/template_noop, -/area/ruin/space) "TK" = ( /obj/machinery/firealarm/directional/east, /obj/structure/filingcabinet, @@ -878,12 +872,6 @@ /obj/structure/tank_frame, /turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"Uu" = ( -/obj/structure/sign/warning/vacuum/external/directional/west, -/obj/machinery/light/red/directional/east, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/listeningstation) "UI" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -894,6 +882,11 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/listeningstation) +"Vq" = ( +/obj/structure/sign/poster/official/nanotrasen_logo/directional/north, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron, +/area/ruin/space/has_grav/listeningstation) "Vz" = ( /obj/machinery/computer/arcade/orion_trail, /turf/open/floor/plating, @@ -937,6 +930,14 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/listeningstation) +"WG" = ( +/obj/structure/lattice/catwalk, +/obj/structure/sign/nanotrasen{ + pixel_y = -32 + }, +/obj/structure/marker_beacon/cerulean, +/turf/template_noop, +/area/ruin/space) "WW" = ( /obj/effect/baseturf_helper/asteroid/airless, /turf/closed/wall/r_wall, @@ -978,13 +979,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"Zj" = ( -/obj/structure/cable, -/obj/machinery/firealarm/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/small, -/area/ruin/space/has_grav/listeningstation) (1,1,1) = {" AV @@ -1047,9 +1041,9 @@ vI vI vI zp -wy +lO rE -ap +FU zp vI AV @@ -1268,12 +1262,12 @@ vI vI vI JB -ac +Vq yB zZ UI qD -Uu +aO aR JB vI @@ -1338,7 +1332,7 @@ AV "} (15,1,1) = {" AV -Jj +WG zp NY hm @@ -1374,13 +1368,13 @@ ta Dv WD rG -RB +Or SB FV ca BX dW -QI +Sz JB vI vI @@ -1424,7 +1418,7 @@ lk tm TK rG -Zj +MA wm Sz VH @@ -1455,7 +1449,7 @@ Yf FV lu db -RP +xP JB vI vI @@ -1480,7 +1474,7 @@ BJ Lq wm yH -dC +aQ JB vI AV @@ -1526,7 +1520,7 @@ kK YV IG rG -iU +FC KG xY JB @@ -1598,7 +1592,7 @@ AV AV AV AV -SQ +vt AV AV AV diff --git a/_maps/RandomRuins/SpaceRuins/mechtransport.dmm b/_maps/RandomRuins/SpaceRuins/mechtransport.dmm index 7110c4ea09e46..ac1f0b03f4bf6 100644 --- a/_maps/RandomRuins/SpaceRuins/mechtransport.dmm +++ b/_maps/RandomRuins/SpaceRuins/mechtransport.dmm @@ -279,7 +279,7 @@ /turf/open/floor/iron/smooth_large/airless, /area/ruin/space/has_grav/powered/mechtransport) "NG" = ( -/obj/vehicle/sealed/mecha/working/ripley, +/obj/vehicle/sealed/mecha/ripley, /turf/open/floor/iron/recharge_floor/Airless, /area/ruin/space/has_grav/powered/mechtransport) "Oh" = ( diff --git a/_maps/RandomRuins/SpaceRuins/mimesvsclowns.dmm b/_maps/RandomRuins/SpaceRuins/mimesvsclowns.dmm index 37535bffdb364..d7186f4477677 100644 --- a/_maps/RandomRuins/SpaceRuins/mimesvsclowns.dmm +++ b/_maps/RandomRuins/SpaceRuins/mimesvsclowns.dmm @@ -37,18 +37,10 @@ /obj/structure/tank_dispenser, /turf/open/floor/iron/checker/airless, /area/ruin) -"iP" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/checker/airless, -/area/ruin) "lS" = ( /obj/structure/door_assembly, /turf/open/floor/iron/checker/airless, /area/ruin) -"mB" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, -/area/ruin) "of" = ( /obj/item/storage/toolbox/syndicate, /turf/open/floor/iron/checker/airless, @@ -75,6 +67,19 @@ }, /turf/open/floor/iron/checker/airless, /area/ruin) +"tz" = ( +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 4 + }, +/obj/item/ammo_casing/energy/c3dbullet{ + pixel_y = 10; + pixel_x = 115; + dir = 9 + }, +/obj/effect/decal/cleanable/blood/gibs, +/obj/machinery/light/small/broken/directional/south, +/turf/open/floor/iron/checker/airless, +/area/ruin) "uc" = ( /obj/item/ammo_casing/energy/c3dbullet, /obj/effect/decal/cleanable/blood/footprints{ @@ -124,6 +129,15 @@ }, /turf/open/floor/iron/checker/airless, /area/ruin) +"zk" = ( +/obj/machinery/computer/old, +/obj/machinery/light/small/broken/directional/north, +/turf/open/floor/iron/checker/airless, +/area/ruin) +"Al" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/checker/airless, +/area/ruin) "Ar" = ( /obj/item/ammo_casing/energy/c3dbullet{ dir = 5; @@ -144,6 +158,13 @@ /obj/machinery/microwave, /turf/open/floor/iron/checker/airless, /area/ruin) +"CH" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/checker/airless, +/area/ruin) "CZ" = ( /obj/item/clothing/suit/space/eva{ pixel_y = 8; @@ -168,10 +189,6 @@ "Fx" = ( /turf/template_noop, /area/template_noop) -"Gv" = ( -/obj/machinery/light/small/broken/directional/north, -/turf/open/floor/iron/checker/airless, -/area/ruin) "GF" = ( /obj/structure/table, /obj/item/stamp/mime, @@ -181,12 +198,13 @@ }, /turf/open/floor/iron/checker/airless, /area/ruin) -"GS" = ( -/obj/effect/decal/cleanable/blood/footprints{ - dir = 4 - }, +"GR" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/mob_spawn/corpse/human/clown, +/obj/item/ammo_casing/energy/c3dbullet, +/obj/effect/decal/cleanable/blood/footprints, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/checker/airless, +/turf/open/floor/plating/airless, /area/ruin) "Ij" = ( /obj/machinery/door/airlock/glass, @@ -220,22 +238,11 @@ }, /turf/open/floor/iron/checker/airless, /area/ruin) -"Kx" = ( -/obj/machinery/computer/old{ - dir = 4 - }, -/obj/machinery/light/broken/directional/west, -/turf/open/floor/iron/checker/airless, -/area/ruin) "KI" = ( /obj/structure/sign/poster/contraband/microwave, /turf/closed/wall, /area/ruin) -"KV" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/mob_spawn/corpse/human/clown, -/obj/item/ammo_casing/energy/c3dbullet, -/obj/effect/decal/cleanable/blood/footprints, +"Ln" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/airless, /area/ruin) @@ -253,11 +260,6 @@ /obj/structure/sign/poster/contraband/masked_men, /turf/closed/wall, /area/ruin) -"Qh" = ( -/obj/machinery/computer/old, -/obj/machinery/light/broken/directional/north, -/turf/open/floor/iron/checker/airless, -/area/ruin) "Sc" = ( /obj/effect/decal/cleanable/blood/footprints{ dir = 4 @@ -269,18 +271,12 @@ /obj/effect/spawner/structure/window/reinforced, /obj/effect/mapping_helpers/damaged_window, /obj/effect/decal/cleanable/blood/splatter/over_window, -/turf/template_noop, +/turf/open/floor/plating/airless, /area/ruin) -"WY" = ( -/obj/machinery/atmospherics/components/unary/passive_vent{ +"XA" = ( +/obj/machinery/computer/old{ dir = 4 }, -/obj/item/ammo_casing/energy/c3dbullet{ - pixel_y = 10; - pixel_x = 115; - dir = 9 - }, -/obj/effect/decal/cleanable/blood/gibs, /turf/open/floor/iron/checker/airless, /area/ruin) "YF" = ( @@ -400,9 +396,9 @@ GF Jz Jz vs -Kx +XA Jz -Qh +zk gV gZ Fx @@ -417,13 +413,13 @@ gZ gZ Kh ED -iP +Al lS ve -WY +tz KI hG -iP +Al Vj Fx Fx @@ -443,7 +439,7 @@ JK Ar Ij AK -iP +Al gZ Fx Fx @@ -459,7 +455,7 @@ Kr rn Jz Jz -Gv +gV Sc Jz Jz @@ -499,7 +495,7 @@ gZ gZ Jz hT -iP +Al dI Jz YF @@ -519,7 +515,7 @@ gZ gZ Qb Pq -mB +Ln gV vj gZ @@ -539,7 +535,7 @@ gZ gZ Jz dq -mB +Ln CZ of gZ @@ -561,7 +557,7 @@ Jz gZ gZ EY -KV +GR gZ Fx Fx @@ -581,7 +577,7 @@ gZ Fx gZ gV -GS +CH gZ Fx Fx diff --git a/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm b/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm index e1f35d27fd24b..9597a976d84b0 100644 --- a/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm +++ b/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm @@ -287,16 +287,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating, /area/ruin/space/has_grav/powered/cat_man) -"aY" = ( -/obj/structure/bed/dogbed{ - name = "kitty bed" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mob_spawn/corpse/human/damaged{ - outfit_override = list("head" = /obj/item/clothing/head/costume/kitty) - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/powered/cat_man) "aZ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -306,12 +296,6 @@ /obj/item/flashlight/lamp, /turf/open/floor/carpet, /area/ruin/space/has_grav/powered/cat_man) -"bb" = ( -/obj/machinery/light/directional/east, -/obj/structure/closet/cabinet, -/obj/item/gps/spaceruin, -/turf/open/floor/carpet, -/area/ruin/space/has_grav/powered/cat_man) "bc" = ( /obj/machinery/button/door/directional/west{ id = "meow"; @@ -409,12 +393,6 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/powered/cat_man) -"bs" = ( -/mob/living/basic/cat_butcherer, -/turf/open/floor/iron/white/side{ - dir = 4 - }, -/area/ruin/space/has_grav/powered/cat_man) "bt" = ( /obj/structure/table/optable, /obj/effect/mob_spawn/corpse/human/damaged, @@ -430,17 +408,6 @@ dir = 8 }, /area/ruin/space/has_grav/powered/cat_man) -"bv" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/computer/atmos_control/noreconnect{ - atmos_chambers = list("catstation1" = "Chamber 1", "catstation2" = "Chamber 2", "catstation3" = "Chamber 3", "catstation4" = "Chamber 4", "catstation5" = "Chamber 5", "catstation6" = "Chamber 6", "catstationsupply" = "Supply"); - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/powered/cat_man) "bw" = ( /obj/structure/table/wood, /obj/item/paper_bin, @@ -613,17 +580,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/plating, /area/ruin/space/has_grav/powered/cat_man) -"bW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/bed/dogbed{ - name = "kitty bed" - }, -/obj/effect/mob_spawn/corpse/human/damaged{ - outfit_override = list("head" = /obj/item/clothing/head/costume/kitty) - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/powered/cat_man) "bX" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -850,6 +806,42 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/powered/cat_man) +"lQ" = ( +/obj/structure/bed/dogbed{ + name = "kitty bed" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/corpse/human/damaged{ + outfit_override = list("head"=/obj/item/clothing/head/costume/kitty) + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/powered/cat_man) +"mm" = ( +/obj/structure/closet/cabinet, +/obj/item/gps/spaceruin, +/turf/open/floor/carpet, +/area/ruin/space/has_grav/powered/cat_man) +"nv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/bed/dogbed{ + name = "kitty bed" + }, +/obj/effect/mob_spawn/corpse/human/damaged{ + outfit_override = list("head"=/obj/item/clothing/head/costume/kitty) + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/powered/cat_man) +"uy" = ( +/mob/living/basic/cat_butcherer, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/ruin/space/has_grav/powered/cat_man) +"yx" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/carpet, +/area/ruin/space/has_grav/powered/cat_man) "Bl" = ( /obj/machinery/door/airlock/external/ruin, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -857,6 +849,17 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/powered/cat_man) +"BX" = ( +/obj/machinery/firealarm/directional/east, +/obj/machinery/computer/atmos_control/noreconnect{ + atmos_chambers = list("catstation1"="Chamber 1","catstation2"="Chamber 2","catstation3"="Chamber 3","catstation4"="Chamber 4","catstation5"="Chamber 5","catstation6"="Chamber 6","catstationsupply"="Supply"); + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/powered/cat_man) "RT" = ( /obj/machinery/door/airlock/external/ruin, /obj/effect/mapping_helpers/airlock/cyclelink_helper, @@ -1203,8 +1206,8 @@ ax aH ad aT -bb -aS +mm +yx by ad bM @@ -1332,7 +1335,7 @@ ay aP aw be -bs +uy bA aG aP @@ -1401,7 +1404,7 @@ bC aG bO aK -bW +nv ad an ad @@ -1460,7 +1463,7 @@ ay aQ aW bh -bv +BX bh bG bO @@ -1586,7 +1589,7 @@ at cb aM ad -aY +lQ bl ad bD diff --git a/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm b/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm index eb3d1ca2ba47b..afa11afbc9aa3 100644 --- a/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm +++ b/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm @@ -215,7 +215,7 @@ pixel_y = -4; pixel_x = -7 }, -/obj/item/camera_bug{ +/obj/item/computer_disk/syndicate/camera_app{ pixel_x = -5; pixel_y = 9 }, diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm index 576ccaea5f561..e134100000d32 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -6,19 +6,22 @@ /mob/living/basic/carp, /turf/template_noop, /area/template_noop) -"ac" = ( -/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/yellow{ - dir = 4 - }, -/obj/structure/sign/warning/chem_diamond/directional/east, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/rnd) "ad" = ( /turf/closed/wall/r_wall, /area/ruin/space/ancientstation/delta/ai) +"ae" = ( +/obj/structure/closet/crate/bin, +/obj/effect/decal/cleanable/dirt, +/obj/item/paper/crumpled, +/obj/item/ph_booklet, +/obj/effect/turf_decal/tile/purple/half/contrasted, +/obj/machinery/firealarm/directional/south, +/obj/item/trash/bee, +/obj/effect/spawner/random/trash/bacteria, +/turf/open/floor/iron/white/textured_edge{ + dir = 1 + }, +/area/ruin/space/ancientstation/delta/biolab) "af" = ( /obj/structure/alien/weeds, /mob/living/simple_animal/hostile/alien, @@ -42,13 +45,6 @@ "ak" = ( /turf/closed/wall/rust, /area/ruin/space/ancientstation/charlie/bridge) -"an" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/structure/broken_flooring/corner/directional/north, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/charlie/hall) "ao" = ( /obj/structure/alien/weeds, /mob/living/simple_animal/hostile/alien/drone, @@ -98,27 +94,6 @@ /obj/structure/closet/firecloset/full, /turf/open/floor/plating, /area/ruin/space/ancientstation/charlie/hall) -"aB" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/alien/weeds/node, -/turf/open/floor/iron/dark, -/area/ruin/space/ancientstation/delta/ai) -"aC" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/alien/weeds, -/turf/open/floor/iron/dark, -/area/ruin/space/ancientstation/delta/ai) -"aD" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/alien/weeds, -/turf/open/floor/iron/dark, -/area/ruin/space/ancientstation/delta/ai) -"aE" = ( -/obj/effect/decal/cleanable/oil, -/obj/machinery/light/small/directional/west, -/obj/structure/alien/weeds, -/turf/open/floor/iron/dark, -/area/ruin/space/ancientstation/delta/ai) "aF" = ( /obj/effect/decal/cleanable/robot_debris, /obj/structure/alien/weeds, @@ -182,6 +157,7 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/table, /obj/effect/decal/cleanable/dirt, +/obj/item/clothing/neck/link_scryer/loaded/charlie, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/bridge) "aS" = ( @@ -235,22 +211,12 @@ /obj/structure/sign/poster/contraband/pwr_game, /turf/closed/wall, /area/ruin/space/ancientstation/charlie/hall) -"bc" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/rust, -/area/ruin/space/ancientstation/charlie/hall) "be" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/alien/weeds, /turf/open/floor/iron/dark, /area/ruin/space/ancientstation/delta/ai) -"bf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) "bg" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -324,17 +290,6 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/bridge) -"bv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/duct, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) "bw" = ( /obj/machinery/door/airlock/engineering{ name = "Gravity Generator" @@ -388,9 +343,12 @@ /turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/medbay) "bG" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/charlie/engie) +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/beta/mining) "bJ" = ( /turf/closed/wall, /area/ruin/space/ancientstation/beta/atmos) @@ -447,15 +405,6 @@ }, /turf/open/floor/iron/white/textured, /area/ruin/space/ancientstation/delta/proto) -"bW" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock/external/glass/ruin, -/turf/open/floor/catwalk_floor, -/area/ruin/space/ancientstation/charlie/engie) "bX" = ( /obj/structure/sign/departments/science, /turf/closed/wall/rust, @@ -476,14 +425,6 @@ /obj/structure/sign/poster/official/science, /turf/closed/wall/rust, /area/ruin/space/ancientstation/delta/hall) -"cc" = ( -/obj/effect/spawner/structure/window, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "oldstation_rnd" - }, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/delta/rnd) "cd" = ( /obj/machinery/door/airlock/command{ name = "Beta Station Access" @@ -506,6 +447,19 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/engie) +"ci" = ( +/obj/structure/rack, +/obj/item/storage/bag/ore, +/obj/item/storage/bag/ore, +/obj/item/mining_scanner, +/obj/item/mining_scanner, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/beta/mining) "cj" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/command, @@ -573,6 +527,31 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/hall) +"cs" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/remains/human{ + pixel_y = -4; + pixel_x = -4 + }, +/obj/item/paper/fluff/ruins/oldstation/survivor_note{ + pixel_x = 17; + pixel_y = 12 + }, +/obj/item/organ/internal/cyberimp/arm/toolset{ + pixel_y = 2; + pixel_x = 6 + }, +/mob/living/simple_animal/bot/cleanbot/autopatrol{ + bot_mode_flags = 12; + name = "Ramboo"; + pixel_x = -2; + pixel_y = 5; + bot_cover_flags = 0 + }, +/turf/open/floor/plating{ + initial_gas_mix = "co2=6;o2=16;n2=82;TEMP=293.15" + }, +/area/ruin/space/ancientstation/delta/hall) "ct" = ( /obj/structure/sign/poster/official/science, /turf/closed/wall, @@ -590,6 +569,10 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) +"cx" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating/airless, +/area/ruin/space/ancientstation/beta/supermatter) "cz" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/north, @@ -624,12 +607,6 @@ /obj/structure/table, /turf/open/floor/iron/white/textured, /area/ruin/space/ancientstation/delta/proto) -"cG" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/shreds, -/obj/structure/alien/weeds/node, -/turf/open/floor/iron/dark, -/area/ruin/space/ancientstation/delta/ai) "cH" = ( /obj/structure/alien/weeds/node, /obj/effect/decal/cleanable/blood/old, @@ -649,6 +626,15 @@ "cK" = ( /turf/closed/mineral/iron, /area/ruin/space/ancientstation/charlie/hall) +"cM" = ( +/obj/effect/decal/cleanable/glass, +/obj/item/shard{ + icon_state = "small" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/beta/atmos) "cP" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -662,19 +648,18 @@ "cQ" = ( /turf/closed/wall/rust, /area/ruin/space/ancientstation/charlie/hydro) -"cS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 8 +"cR" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor{ + id = "oldstation_rnd_external" }, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/away_general_access, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/hall) +/turf/open/floor/plating, +/area/ruin/space/ancientstation/delta/hall) +"cT" = ( +/obj/structure/broken_flooring/pile/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless, +/area/ruin/space/ancientstation/beta/hall) "cU" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -688,11 +673,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hall) -"cV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/official/safety_internals/directional/north, -/turf/open/floor/catwalk_floor, -/area/ruin/space/ancientstation/delta/hall) "cW" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/west, @@ -760,12 +740,12 @@ /turf/open/floor/plating, /area/ruin/space/ancientstation/delta/hall) "dj" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor{ - id = "oldstation_rnd_external" +/obj/machinery/door/airlock/external/glass/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 }, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/delta/hall) +/turf/open/floor/catwalk_floor, +/area/ruin/space/ancientstation/beta/mining) "dk" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -781,19 +761,6 @@ "dl" = ( /turf/closed/wall/rust, /area/ruin/space/ancientstation/charlie/engie) -"dm" = ( -/obj/machinery/door/firedoor, -/obj/structure/broken_flooring/singular/directional/east, -/turf/open/floor/plating/airless, -/area/ruin/space/ancientstation/beta/hall) -"dn" = ( -/obj/machinery/light/small/directional/west, -/obj/item/kirbyplants/random/dead, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/hydro) "do" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/green{ @@ -846,16 +813,6 @@ "dv" = ( /turf/closed/wall/rust, /area/ruin/space/ancientstation/charlie/sec) -"dw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) "dx" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -869,9 +826,11 @@ /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) "dz" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/beta/gravity) +/obj/machinery/smartfridge, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/broken_machine, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/kitchen) "dB" = ( /obj/structure/alien/weeds, /obj/effect/gibspawner/human, @@ -879,7 +838,7 @@ /area/ruin/space/ancientstation/delta/ai) "dD" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/roller, +/obj/item/emergency_bed, /obj/structure/cable, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 4 @@ -928,12 +887,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hydro) -"dT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) "dU" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -1200,6 +1153,11 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/sec) +"eV" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/modular_computer/preset/engineering, +/turf/open/floor/engine/airless, +/area/ruin/space/ancientstation/beta/supermatter) "eW" = ( /obj/structure/table/glass, /obj/item/reagent_containers/cup/bottle/mercury{ @@ -1231,24 +1189,6 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) -"eY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 10 - }, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) -"eZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/mapping_helpers/apc/away_general_access, -/turf/open/floor/engine/airless, -/area/ruin/space/ancientstation/beta/supermatter) "fa" = ( /obj/machinery/rnd/destructive_analyzer, /obj/effect/decal/cleanable/dirt, @@ -1331,13 +1271,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/sec) -"ft" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) "fu" = ( /obj/machinery/mecha_part_fabricator, /obj/effect/decal/cleanable/dirt, @@ -1351,11 +1284,20 @@ pixel_x = 3; pixel_y = 3 }, +/obj/item/autopsy_scanner, /turf/open/floor/iron/white, /area/ruin/space/ancientstation/delta/rnd) -"fy" = ( -/obj/effect/decal/cleanable/oil, -/turf/closed/wall/r_wall, +"fw" = ( +/obj/structure/alien/weeds, +/obj/structure/closet/crate, +/obj/item/stack/sheet/mineral/titanium{ + amount = 30 + }, +/obj/item/stack/sheet/mineral/plasma{ + amount = 25 + }, +/obj/machinery/light/small/broken/directional/east, +/turf/open/floor/iron/dark, /area/ruin/space/ancientstation/delta/ai) "fE" = ( /obj/effect/decal/cleanable/dirt, @@ -1451,6 +1393,18 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hall) +"fR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/away_general_access, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2{ + dir = 5 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/beta/atmos) "fS" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -1459,32 +1413,23 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/mining) -"fW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/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/ruin/space/ancientstation/delta/hall) -"fY" = ( +"fY" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, /turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/hall) -"fZ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/broken_flooring/singular/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, -/area/ruin/space/ancientstation/beta/hall) "ga" = ( /turf/closed/wall, /area/ruin/space/ancientstation/beta/mining) +"gg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/structure/broken_flooring/corner/directional/north, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/charlie/hall) "gh" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -1530,12 +1475,11 @@ /turf/open/floor/iron/diagonal, /area/ruin/space/ancientstation/beta/gravity) "gx" = ( -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/ruin/space/ancientstation/delta/rnd) +/obj/structure/alien/weeds, +/obj/effect/gibspawner/human, +/obj/machinery/light/small/broken/directional/west, +/turf/open/floor/iron/dark, +/area/ruin/space/ancientstation/delta/ai) "gz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1588,9 +1532,9 @@ /area/ruin/space/ancientstation/delta/rnd) "gP" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/tank/internals/anesthetic, -/obj/item/clothing/mask/breath/medical, +/obj/machinery/computer/operating/oldstation{ + dir = 4 + }, /turf/open/floor/iron/white, /area/ruin/space/ancientstation/delta/rnd) "gQ" = ( @@ -1604,6 +1548,12 @@ "gU" = ( /turf/open/floor/plating/airless, /area/space/nearstation) +"gV" = ( +/obj/item/stack/rods, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/broken_flooring/singular/directional/east, +/turf/open/floor/plating/airless, +/area/ruin/space/ancientstation/beta/hall) "gW" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -1644,20 +1594,28 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/sec) -"hc" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/ruin/space/ancientstation/beta/hall) "hf" = ( -/obj/effect/decal/cleanable/glass, -/obj/item/stack/rods, -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/turf_decal/stripes/line, +/obj/structure/rack, +/obj/effect/decal/cleanable/dirt, +/obj/item/crowbar, +/obj/item/stock_parts/cell/high, +/obj/machinery/door/window/right/directional/east{ + dir = 1; + req_access = list("away_general") + }, +/obj/item/paper/fluff/ruins/oldstation/apc_note, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/obj/item/card/id/away/old/equipment, /turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/atmos) +/area/ruin/space/ancientstation/charlie/engie) +"hh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/xenoblood/xgibs/core, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/ruin/space/ancientstation/delta/rnd) "hi" = ( /turf/closed/wall/rust, /area/ruin/space/ancientstation/charlie/hall) @@ -1686,12 +1644,13 @@ /area/ruin/space/ancientstation/charlie/engie) "hn" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 4 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 6 }, -/obj/machinery/light/directional/east, +/obj/machinery/duct, /turf/open/floor/iron/white, -/area/ruin/space/ancientstation/delta/rnd) +/area/ruin/space/ancientstation/charlie/hall) "ho" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -1756,6 +1715,10 @@ }, /turf/open/floor/iron/white, /area/ruin/space/ancientstation/delta/rnd) +"hF" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/closed/wall, +/area/ruin/space/ancientstation/delta/hall) "hI" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -1763,13 +1726,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hydro) -"hL" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/alien/weeds, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks, -/turf/open/floor/iron/dark, -/area/ruin/space/ancientstation/delta/ai) "hM" = ( /obj/structure/sign/departments/science, /turf/closed/wall, @@ -1816,6 +1772,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/rnd) +"hZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/mapping_helpers/apc/no_charge, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/mapping_helpers/apc/away_general_access, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/bridge) "ia" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -1914,6 +1883,12 @@ /obj/structure/cable, /turf/open/floor/iron/cafeteria, /area/ruin/space/ancientstation/charlie/kitchen) +"ij" = ( +/obj/structure/table/reinforced, +/obj/item/paper/fluff/ruins/oldstation/protohealth, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white/textured, +/area/ruin/space/ancientstation/delta/proto) "ik" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/red, @@ -1972,13 +1947,6 @@ /obj/effect/decal/cleanable/glass/plasma, /turf/open/floor/engine/airless, /area/ruin/space/ancientstation/beta/supermatter) -"ix" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) "iy" = ( /obj/machinery/door/airlock/medical/glass{ name = "Medical Bay" @@ -2076,6 +2044,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/rnd) +"iR" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/portable_atmospherics/scrubber, +/obj/machinery/atmospherics/components/unary/portables_connector/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/airless, +/area/ruin/space/ancientstation/beta/hall) "iU" = ( /obj/machinery/power/terminal{ dir = 4 @@ -2094,6 +2074,16 @@ /obj/structure/cable, /turf/open/floor/plating, /area/ruin/space/ancientstation/charlie/storage) +"iX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/rnd) "je" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -2119,13 +2109,12 @@ /turf/open/floor/plating, /area/ruin/space/ancientstation/charlie/storage) "jk" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/away_general_access, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) +/obj/effect/decal/cleanable/xenoblood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/ruin/space/ancientstation/delta/rnd) "jm" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -2183,44 +2172,9 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/dorms) -"jC" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/alien/weeds, -/obj/effect/gibspawner/human, -/turf/open/floor/iron/dark, -/area/ruin/space/ancientstation/delta/ai) -"jD" = ( -/obj/structure/alien/weeds, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/gibs/old, -/obj/effect/decal/cleanable/blood/old, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/away_general_access, -/obj/effect/mapping_helpers/apc/unlocked, -/turf/open/floor/iron/dark, -/area/ruin/space/ancientstation/delta/ai) "jE" = ( /turf/closed/wall/rust, /area/ruin/space/ancientstation/beta/hall) -"jF" = ( -/obj/machinery/firealarm/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/ruin/space/ancientstation/delta/rnd) -"jG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/highsecurity, -/obj/machinery/door/firedoor, -/obj/structure/alien/weeds, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "oldstation-aisat" - }, -/obj/effect/mapping_helpers/airlock/access/all/away/general, -/turf/open/floor/iron/dark, -/area/ruin/space/ancientstation/delta/hall) "jH" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/south, @@ -2304,12 +2258,6 @@ /obj/effect/spawner/random/clothing/backpack, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/dorms) -"jS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/hall) "jU" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/public/glass{ @@ -2332,12 +2280,6 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/mining) -"jW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted, -/turf/open/floor/iron/white, -/area/ruin/space/ancientstation/delta/rnd) "jX" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -2383,6 +2325,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/textured, /area/ruin/space/ancientstation/delta/proto) +"kl" = ( +/obj/machinery/door/airlock/highsecurity, +/obj/structure/alien/weeds, +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/xtracks, +/obj/effect/decal/cleanable/blood/tracks, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "oldstation-aisat" + }, +/obj/effect/mapping_helpers/airlock/access/all/away/general, +/turf/open/floor/iron/dark, +/area/ruin/space/ancientstation/delta/ai) "ko" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4; @@ -2426,12 +2380,6 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/dorms) -"kt" = ( -/obj/machinery/light/directional/west, -/obj/structure/table/reinforced, -/obj/item/paper/fluff/ruins/oldstation/protosuit, -/turf/open/floor/iron/white/textured, -/area/ruin/space/ancientstation/delta/proto) "ku" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/door/poddoor{ @@ -2439,14 +2387,6 @@ }, /turf/open/floor/iron/white/textured, /area/ruin/space/ancientstation/delta/proto) -"kv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white/textured, -/area/ruin/space/ancientstation/delta/proto) "kw" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, @@ -2466,13 +2406,6 @@ }, /turf/open/floor/iron/white/textured, /area/ruin/space/ancientstation/delta/proto) -"kz" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor{ - id = "ancient" - }, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/charlie/bridge) "kA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, /turf/open/floor/iron, @@ -2491,10 +2424,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/dorms) -"kF" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/charlie/hydro) "kI" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/corner{ @@ -2541,6 +2470,7 @@ /obj/machinery/light/small/directional/west, /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/decoration/glowstick, +/obj/item/clothing/neck/link_scryer/loaded/charlie, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/dorms) "kO" = ( @@ -2571,31 +2501,10 @@ "kQ" = ( /turf/closed/wall, /area/ruin/space/ancientstation/beta/hall) -"kR" = ( -/obj/machinery/light/directional/west, -/obj/structure/table/reinforced, -/obj/item/paper/fluff/ruins/oldstation/protohealth, -/turf/open/floor/iron/white/textured, -/area/ruin/space/ancientstation/delta/proto) "kS" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/textured, /area/ruin/space/ancientstation/delta/proto) -"kT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/rnd) -"kU" = ( -/obj/machinery/light/directional/east, -/obj/structure/table/reinforced, -/obj/item/paper/fluff/ruins/oldstation/protogun, -/turf/open/floor/iron/white/textured, -/area/ruin/space/ancientstation/delta/proto) "kV" = ( /turf/closed/mineral/random, /area/ruin/space/ancientstation/beta/atmos) @@ -2651,6 +2560,15 @@ /obj/item/clothing/gloves/color/fyellow/old, /turf/open/floor/plating, /area/ruin/space/ancientstation/charlie/hall) +"lb" = ( +/obj/structure/closet/crate/bin, +/obj/effect/spawner/random/trash/botanical_waste, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 8 + }, +/obj/effect/spawner/random/trash/botanical_waste, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/hydro) "lc" = ( /obj/structure/table/reinforced, /obj/item/gun/energy/e_gun/old, @@ -2677,6 +2595,12 @@ /obj/effect/turf_decal/tile/yellow/half/contrasted, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/atmos) +"lh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/rnd/server/oldstation, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/rnd) "lk" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/brown/half/contrasted{ @@ -2684,21 +2608,6 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/mining) -"ll" = ( -/obj/structure/transit_tube{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 10 - }, -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/obj/effect/mapping_helpers/damaged_window, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/charlie/hall) "lm" = ( /obj/structure/alien/weeds, /obj/structure/alien/egg/burst, @@ -2717,6 +2626,16 @@ /obj/effect/mob_spawn/ghost_role/human/oldeng, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/dorms) +"lo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/west, +/obj/effect/decal/cleanable/oil, +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/engie) "lq" = ( /obj/structure/alien/weeds, /obj/effect/decal/cleanable/blood/gibs/old, @@ -2753,6 +2672,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/cafeteria, /area/ruin/space/ancientstation/charlie/kitchen) +"lz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/bin, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/effect/spawner/random/trash/garbage, +/obj/effect/spawner/random/trash/garbage, +/obj/effect/spawner/random/trash/garbage, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/engie) "lB" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/east, @@ -2870,6 +2800,28 @@ /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, /area/ruin/space/ancientstation/delta/biolab) +"me" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 + }, +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 10 + }, +/obj/structure/broken_flooring/singular/directional/west, +/turf/open/floor/plating/airless, +/area/ruin/space/ancientstation/beta/hall) +"mg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/toy/seashell, +/obj/item/toy/seashell, +/obj/machinery/light/small/directional/north, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/iron/white, +/area/ruin/space/ancientstation/charlie/hall) "mh" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm/directional/east, @@ -2900,6 +2852,16 @@ dir = 1 }, /area/ruin/space/ancientstation/delta/rnd) +"mp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 10 + }, +/obj/effect/decal/cleanable/glass, +/obj/item/shard, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/broken_flooring/singular/directional/east, +/turf/open/floor/plating/airless, +/area/ruin/space/ancientstation/beta/hall) "mq" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ @@ -2932,10 +2894,6 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/mining) -"mx" = ( -/obj/structure/lattice, -/turf/template_noop, -/area/ruin/space/ancientstation/beta/hall) "my" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -2980,6 +2938,12 @@ }, /turf/open/floor/plating, /area/ruin/space/ancientstation/beta/mining) +"mF" = ( +/obj/machinery/shower/directional/west{ + has_water_reclaimer = 0 + }, +/turf/open/floor/vault, +/area/ruin/space/ancientstation/delta/biolab) "mG" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -3005,15 +2969,6 @@ }, /turf/open/floor/plating, /area/ruin/space/ancientstation/beta/mining) -"mL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/obj/machinery/suit_storage_unit/void_old/jetpack, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/mining) "mM" = ( /obj/machinery/door/airlock/mining/glass{ name = "Mining Equipment" @@ -3028,6 +2983,13 @@ /obj/machinery/mineral/processing_unit_console, /turf/closed/wall, /area/ruin/space/ancientstation/beta/mining) +"mP" = ( +/obj/machinery/door/airlock/external/glass/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/catwalk_floor, +/area/ruin/space/ancientstation/beta/supermatter) "mR" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -3147,9 +3109,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hall) -"ne" = ( -/turf/open/floor/catwalk_floor, -/area/ruin/space/ancientstation/beta/supermatter) "nf" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/east, @@ -3167,10 +3126,6 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/atmos) -"nh" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/rust, -/area/ruin/space/ancientstation/beta/hall) "nk" = ( /turf/closed/wall, /area/ruin/space/ancientstation/charlie/dorms) @@ -3250,6 +3205,14 @@ /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /turf/open/floor/iron/airless, /area/ruin/space/ancientstation/beta/medbay) +"nI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/science, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor/closed, +/obj/machinery/duct, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/rnd) "nJ" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/engineering{ @@ -3279,12 +3242,12 @@ /area/ruin/space/ancientstation/delta/rnd) "nO" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/chair{ - dir = 1 - }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/mapping_helpers/airalarm/away_general_access, /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 8 + dir = 4 }, +/obj/machinery/airalarm/directional/east, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/bridge) "nP" = ( @@ -3300,18 +3263,12 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/rnd) -"nW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/east, -/obj/machinery/firealarm/directional/east, +"nU" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 1 - }, -/mob/living/simple_animal/hostile/alien, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/away_general_access, +/turf/open/floor/engine/airless, +/area/ruin/space/ancientstation/beta/supermatter) "nX" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -3322,18 +3279,12 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) -"oa" = ( +"ob" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/north, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, +/obj/item/kirbyplants/photosynthetic, /turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) +/area/ruin/space/ancientstation/delta/rnd) "oc" = ( /obj/machinery/door/airlock/science, /obj/effect/decal/cleanable/dirt, @@ -3392,25 +3343,12 @@ /obj/effect/decal/cleanable/xenoblood/xgibs/larva/body, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) -"or" = ( -/obj/machinery/door/firedoor/closed, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/hall) "ou" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/xenoblood/xgibs/up, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) -"ov" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/old, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) "oy" = ( /obj/structure/table, /obj/item/tank/internals/oxygen, @@ -3423,6 +3361,14 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/engie) +"oz" = ( +/obj/machinery/light/small/directional/east, +/obj/item/kirbyplants/random/dead, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/hydro) "oB" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/glass, @@ -3461,13 +3407,6 @@ /obj/effect/decal/cleanable/xenoblood/xgibs/core, /turf/open/floor/iron/white, /area/ruin/space/ancientstation/delta/rnd) -"oK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) "oL" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -3491,6 +3430,12 @@ }, /turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/hall) +"oP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/away_general_access, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/engie) "oQ" = ( /obj/structure/cable, /obj/item/shard{ @@ -3501,6 +3446,11 @@ /obj/machinery/light/broken/directional/west, /turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/hall) +"oR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor/closed, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/beta/hall) "oS" = ( /obj/effect/decal/cleanable/glass, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ @@ -3520,6 +3470,14 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/hall) +"oX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/kirbyplants/random/dead, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/hall) "oZ" = ( /obj/item/shard{ icon_state = "small" @@ -3528,15 +3486,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/hall) -"pb" = ( -/obj/effect/decal/cleanable/dirt, +"pc" = ( /obj/item/kirbyplants/random/dead, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 1 - }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, /turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/bridge) +/area/ruin/space/ancientstation/delta/hall) "pi" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -3569,44 +3525,41 @@ /obj/effect/turf_decal/tile/yellow/half/contrasted, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/atmos) -"pu" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/spawner/random/trash/moisture_trap, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/beta/hall) +"pq" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/beta/atmos) "pv" = ( /obj/structure/window/reinforced/spawner/directional/north{ layer = 2.9 }, /turf/open/floor/engine/n2, /area/ruin/space/ancientstation/beta/atmos) -"pw" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/rust, -/area/ruin/space/ancientstation/charlie/kitchen) -"pA" = ( -/obj/effect/mapping_helpers/damaged_window, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/delta/hall) "pD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) -"pI" = ( -/obj/structure/rack, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/hall) +"pF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/engie) "pK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -3619,6 +3572,15 @@ dir = 4 }, /area/ruin/space/ancientstation/delta/biolab) +"pP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light_switch/directional/south, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 8 + }, +/obj/structure/tank_holder/oxygen/yellow, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/beta/mining) "pR" = ( /obj/effect/decal/cleanable/dirt, /obj/item/shard{ @@ -3626,15 +3588,18 @@ }, /turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/supermatter) +"pV" = ( +/obj/machinery/light/broken/directional/south, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/ruin/space/ancientstation/delta/rnd) "pW" = ( -/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/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/white/textured_large, -/area/ruin/space/ancientstation/delta/biolab) +/obj/effect/decal/cleanable/oil, +/obj/structure/alien/weeds, +/obj/machinery/light/small/broken/directional/west, +/turf/open/floor/iron/dark, +/area/ruin/space/ancientstation/delta/ai) "qc" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -3668,29 +3633,52 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/atmos) -"qt" = ( -/obj/structure/table, -/obj/item/crowbar, +"ql" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/decoration/glowstick, -/obj/structure/mirror/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/firealarm/directional/west, /turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/dorms) -"qz" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 10 - }, -/turf/template_noop, -/area/space/nearstation) -"qE" = ( -/obj/effect/spawner/structure/window/reinforced, +/area/ruin/space/ancientstation/delta/hall) +"qo" = ( /obj/structure/cable, -/turf/open/floor/light{ - state = 2 +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/south, +/obj/effect/mapping_helpers/airalarm/away_general_access, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 }, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/beta/hall) +"qr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/soap/nanotrasen, +/obj/item/coin, +/obj/item/coin, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/bridge) +"qt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 10 + }, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/hall) +"qx" = ( +/obj/machinery/door/airlock/external/glass/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/catwalk_floor, +/area/ruin/space/ancientstation/beta/supermatter) "qF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2{ dir = 4 @@ -3707,54 +3695,41 @@ /obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/plating/rust, /area/ruin/space/ancientstation/delta/hall) -"qO" = ( -/obj/item/kirbyplants/fern, +"qL" = ( +/obj/structure/alien/weeds/node, +/obj/machinery/light/small/broken/directional/east, +/turf/open/floor/iron/dark, +/area/ruin/space/ancientstation/delta/ai) +"qM" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted, -/turf/open/floor/iron/white/textured, -/area/ruin/space/ancientstation/delta/biolab) -"qQ" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/structure/sign/departments/aisat/directional/north, /obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/away_general_access, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) -"qS" = ( -/obj/item/kirbyplants/random/dead, -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/light/small/broken/directional/west, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/ancientstation/beta/medbay) -"rb" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/remains/human{ - pixel_y = -4; - pixel_x = -4 - }, -/obj/item/paper/fluff/ruins/oldstation/survivor_note{ - pixel_x = 17; - pixel_y = 12 - }, -/obj/item/organ/internal/cyberimp/arm/toolset{ - pixel_y = 2; - pixel_x = 6 - }, -/turf/open/floor/plating{ - initial_gas_mix = "co2=6;o2=16;n2=82;TEMP=293.15" +"qQ" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 }, -/area/ruin/space/ancientstation/delta/hall) +/obj/machinery/door/airlock/external/glass/ruin, +/turf/open/floor/catwalk_floor, +/area/ruin/space/ancientstation/charlie/engie) "rc" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/power/energy_accumulator/grounding_rod, /turf/open/floor/plating, /area/ruin/space/ancientstation/beta/supermatter) -"re" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/engine/airless, -/area/ruin/space/ancientstation/beta/supermatter) +"rf" = ( +/obj/machinery/door/firedoor, +/obj/structure/broken_flooring/singular/directional/east, +/turf/open/floor/plating/airless, +/area/ruin/space/ancientstation/beta/hall) "rh" = ( /obj/machinery/door/firedoor, /obj/effect/decal/cleanable/dirt, @@ -3772,57 +3747,39 @@ "rm" = ( /turf/closed/mineral/random, /area/ruin/space/ancientstation/beta/supermatter) +"rn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/away_general_access, +/obj/effect/decal/cleanable/generic, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/hydro) "rp" = ( /turf/closed/wall/r_wall, /area/ruin/space/ancientstation/delta/biolab) -"ru" = ( +"rq" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/closet/crate/bin, -/obj/effect/spawner/random/trash/garbage, -/obj/effect/spawner/random/trash/garbage, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/mapping_helpers/apc/no_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/mapping_helpers/apc/away_general_access, /turf/open/floor/iron/cafeteria, /area/ruin/space/ancientstation/charlie/kitchen) +"rt" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/damaged_window, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/delta/biolab) "rv" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm/directional/west, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hall) -"rw" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/charlie/sec) -"ry" = ( -/obj/structure/sink/directional/west{ - has_water_reclaimer = 0 - }, -/obj/structure/mirror/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/ruin/space/ancientstation/charlie/hall) -"rz" = ( -/obj/structure/closet/crate/engineering, -/obj/item/circuitboard/machine/smes, -/obj/item/stock_parts/cell/high/empty, -/obj/item/stock_parts/cell/high/empty, -/obj/item/stock_parts/cell/high/empty, -/obj/item/stock_parts/cell/high/empty, -/obj/item/stock_parts/cell/high/empty, -/obj/item/stock_parts/capacitor, -/obj/effect/decal/cleanable/dirt, -/obj/item/circuitboard/machine/thermomachine, -/obj/item/circuitboard/machine/thermomachine, -/obj/item/stock_parts/micro_laser, -/obj/item/stock_parts/micro_laser, -/obj/item/stock_parts/micro_laser, -/obj/item/stock_parts/micro_laser, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/matter_bin, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/beta/supermatter) "rC" = ( /obj/effect/decal/cleanable/blood/xtracks{ dir = 8 @@ -3830,20 +3787,21 @@ /obj/effect/decal/cleanable/glass, /turf/open/floor/engine, /area/ruin/space/ancientstation/delta/biolab) -"rE" = ( -/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/engine_safety/directional/west, -/obj/structure/broken_flooring/pile/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, -/area/ruin/space/ancientstation/beta/hall) "rG" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/gravity_generator/main/off, /turf/open/floor/iron/diagonal, /area/ruin/space/ancientstation/beta/gravity) +"rJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/mapping_helpers/apc/no_charge, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/mapping_helpers/apc/away_general_access, +/turf/open/floor/engine/airless, +/area/ruin/space/ancientstation/beta/supermatter) "rN" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -3870,12 +3828,18 @@ }, /turf/open/floor/iron/white/textured_edge, /area/ruin/space/ancientstation/delta/biolab) -"rO" = ( -/obj/machinery/shower/directional/west{ - has_water_reclaimer = 0 - }, -/turf/open/floor/vault, -/area/ruin/space/ancientstation/delta/biolab) +"rP" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/beta/gravity) +"rQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/item/stack/sheet/iron/fifty, +/obj/machinery/light/small/directional/east, +/obj/effect/spawner/random/maintenance/two, +/turf/open/floor/plating/rust, +/area/ruin/space/ancientstation/delta/hall) "rR" = ( /obj/effect/decal/cleanable/generic, /obj/item/stack/rods, @@ -3944,22 +3908,42 @@ /obj/structure/noticeboard/directional/west, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hall) -"sz" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating/airless, -/area/ruin/space/ancientstation/beta/supermatter) +"sv" = ( +/obj/item/kirbyplants/fern, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white/textured, +/area/ruin/space/ancientstation/delta/biolab) +"sw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/gun/energy/laser/retro/old{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/away_general_access, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/sec) +"sx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 1 + }, +/mob/living/simple_animal/hostile/alien, +/obj/structure/cable, +/obj/machinery/light/broken/directional/east, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/hall) "sA" = ( /turf/closed/wall, /area/ruin/space/ancientstation/beta/gravity) -"sI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 6 - }, -/obj/machinery/duct, -/turf/open/floor/iron/white, -/area/ruin/space/ancientstation/charlie/hall) "sJ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -4005,17 +3989,23 @@ }, /turf/open/floor/engine/airless, /area/ruin/space/ancientstation/beta/supermatter) -"sT" = ( -/obj/effect/decal/cleanable/glass, -/obj/structure/closet/firecloset, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/beta/hall) -"ta" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/effect/mapping_helpers/damaged_window, +"sZ" = ( +/obj/machinery/conveyor{ + id = "beta" + }, +/obj/machinery/light/small/directional/east, /turf/open/floor/plating, -/area/ruin/space/ancientstation/delta/biolab) +/area/ruin/space/ancientstation/beta/mining) +"tc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/mapping_helpers/apc/no_charge, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/mapping_helpers/apc/away_general_access, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/beta/mining) "td" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/duct, @@ -4028,20 +4018,11 @@ }, /turf/open/floor/iron/white/textured, /area/ruin/space/ancientstation/delta/proto) -"tl" = ( -/obj/structure/closet/crate/bin, -/obj/machinery/light/small/broken/directional/west, -/obj/effect/spawner/random/trash/garbage, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash/garbage, -/turf/open/floor/iron/airless, -/area/ruin/space/ancientstation/beta/hall) -"tq" = ( -/obj/machinery/light/small/directional/west, -/mob/living/simple_animal/hostile/alien, -/obj/structure/alien/weeds, -/turf/open/floor/iron/dark, -/area/ruin/space/ancientstation/delta/ai) +"tm" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/damaged_window, +/turf/open/floor/plating/airless, +/area/ruin/space/ancientstation/beta/supermatter) "tv" = ( /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, @@ -4056,72 +4037,73 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hall) -"tC" = ( -/turf/closed/mineral/gold, -/area/space/nearstation) -"tF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/wrench, -/obj/item/wirecutters, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/away_general_access, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/apc/no_charge, +"tB" = ( +/obj/structure/transit_tube{ + dir = 4 + }, /obj/structure/cable, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/mapping_helpers/apc/away_general_access, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 + }, +/obj/machinery/duct, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/ruin/space/ancientstation/charlie/storage) -"tI" = ( +/area/ruin/space/ancientstation/delta/hall) +"tC" = ( +/turf/closed/mineral/gold, +/area/space/nearstation) +"tF" = ( +/obj/machinery/light/small/directional/south, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/dorms) +"tH" = ( +/obj/structure/transit_tube{ dir = 4 }, -/obj/machinery/light/directional/north, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/away_general_access, -/turf/open/floor/iron/white/textured, -/area/ruin/space/ancientstation/delta/proto) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 10 + }, +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/delta/hall) "tJ" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 }, /turf/open/floor/iron/diagonal, /area/ruin/space/ancientstation/beta/gravity) -"tL" = ( +"tS" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch/directional/south, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 8 - }, -/obj/structure/tank_holder/oxygen/yellow, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/mining) -"tM" = ( -/obj/structure/closet/crate/bin, -/obj/effect/spawner/random/trash/botanical_waste, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 8 +/obj/machinery/door/airlock/highsecurity, +/obj/machinery/door/firedoor, +/obj/structure/alien/weeds, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "oldstation-aisat" }, -/obj/effect/spawner/random/trash/botanical_waste, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/hydro) -"tP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/structure/cable, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/mapping_helpers/apc/away_general_access, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/engie) +/obj/effect/mapping_helpers/airlock/access/all/away/general, +/turf/open/floor/iron/dark, +/area/ruin/space/ancientstation/delta/hall) "tT" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/frame/machine, /turf/open/floor/engine/airless, /area/ruin/space/ancientstation/beta/supermatter) +"tW" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters{ + dir = 8; + id = "oldstation_rnd" + }, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/delta/rnd) "tZ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/food/pie_smudge, @@ -4137,35 +4119,6 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/sec) -"ue" = ( -/obj/machinery/door/airlock/science{ - name = "Biolab" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor/closed, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/duct, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/iron/white/textured_large, -/area/ruin/space/ancientstation/delta/biolab) -"uf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/rods, -/obj/item/shard{ - icon_state = "medium" - }, -/obj/effect/decal/cleanable/glass, -/obj/structure/broken_flooring/side/directional/west, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/charlie/dorms) -"ug" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/closed/wall, -/area/ruin/space/ancientstation/delta/hall) "uj" = ( /turf/closed/wall/r_wall, /area/ruin/space/ancientstation/delta/proto) @@ -4192,6 +4145,14 @@ /obj/structure/sign/warning/radiation/rad_area/directional/north, /turf/open/floor/iron/diagonal, /area/ruin/space/ancientstation/beta/gravity) +"uo" = ( +/obj/effect/decal/cleanable/generic, +/obj/effect/turf_decal/tile/purple/half/contrasted, +/obj/item/light/tube/broken, +/turf/open/floor/iron/white/textured_edge{ + dir = 1 + }, +/area/ruin/space/ancientstation/delta/biolab) "up" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -4203,6 +4164,26 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hall) +"ur" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/suit_storage_unit/void_old/jetpack, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/away_general_access, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/beta/mining) +"uv" = ( +/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/yellow{ + dir = 4 + }, +/obj/structure/sign/warning/chem_diamond/directional/east, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/rnd) "uw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, @@ -4220,10 +4201,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/diagonal, /area/ruin/space/ancientstation/beta/gravity) -"uA" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/delta/proto) "uB" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -4245,33 +4222,28 @@ }, /turf/open/floor/engine/n2, /area/ruin/space/ancientstation/beta/atmos) -"uE" = ( -/obj/machinery/door/airlock/highsecurity, -/obj/structure/alien/weeds, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "oldstation-aisat" +"uI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/mapping_helpers/apc/no_charge, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 }, -/obj/effect/mapping_helpers/airlock/access/all/away/general, -/turf/open/floor/iron/dark, -/area/ruin/space/ancientstation/delta/ai) -"uM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/binary/pump/layer2{ - dir = 1 +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/mapping_helpers/apc/away_general_access, +/turf/open/floor/iron/white/textured_edge{ + dir = 4 }, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/iron/airless, -/area/ruin/space/ancientstation/beta/hall) -"uN" = ( -/obj/effect/turf_decal/caution/stand_clear, -/obj/effect/turf_decal/stripes/line, +/area/ruin/space/ancientstation/delta/biolab) +"uO" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/door/poddoor{ - id = "Beta Secure Storage"; - name = "Secure Storage" - }, -/turf/open/floor/iron/textured_large, -/area/ruin/space/ancientstation/beta/supermatter) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/hall) "uR" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -4279,17 +4251,29 @@ /area/ruin/space/ancientstation/beta/hall) "uS" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 1 +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/bin, +/obj/effect/spawner/random/trash/garbage, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/dorms) +"uT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/assembly/flash/handheld, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 }, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/mapping_helpers/apc/away_general_access, -/obj/machinery/power/apc/auto_name/directional/west, +/obj/machinery/light/small/directional/east, /turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/bridge) +/area/ruin/space/ancientstation/charlie/sec) +"uX" = ( +/obj/item/shard, +/obj/item/stack/rods, +/obj/effect/decal/cleanable/glass, +/obj/effect/decal/cleanable/dirt, +/obj/structure/broken_flooring/corner/directional/east, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/charlie/dorms) "uY" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ @@ -4318,11 +4302,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/supermatter) -"vl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/ruin/space/ancientstation/charlie/engie) "vn" = ( /obj/machinery/door/firedoor, /obj/effect/decal/cleanable/dirt, @@ -4332,21 +4311,46 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hydro) -"vx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/xenoblood, +"vq" = ( /obj/structure/cable, -/turf/open/floor/iron/white, -/area/ruin/space/ancientstation/delta/rnd) +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating/airless, +/area/ruin/space/ancientstation/beta/hall) +"vv" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/closet/crate, +/obj/item/stack/sheet/mineral/silver{ + amount = 25 + }, +/obj/item/stack/sheet/mineral/gold{ + amount = 25 + }, +/obj/effect/spawner/random/maintenance/two, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/delta/hall) "vy" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/engine, /area/ruin/space/ancientstation/delta/biolab) -"vH" = ( +"vD" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/engine/airless, -/area/ruin/space/ancientstation/beta/supermatter) +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/mapping_helpers/apc/no_charge, +/obj/structure/cable, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/mapping_helpers/apc/away_general_access, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/dorms) +"vJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/broken/directional/east, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/hall) "vL" = ( /obj/structure/table/glass, /obj/item/reagent_containers/cup/bottle/iodine{ @@ -4414,11 +4418,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hall) -"we" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/modular_computer/console/preset/engineering, -/turf/open/floor/engine/airless, -/area/ruin/space/ancientstation/beta/supermatter) "wg" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/east, @@ -4428,8 +4427,8 @@ /obj/item/knife/combat, /obj/item/clothing/suit/armor/vest/old, /obj/item/gun/ballistic/rifle/boltaction, -/obj/item/ammo_box/a762, -/obj/item/ammo_box/a762, +/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/strilka310, /turf/open/floor/plating, /area/ruin/space/ancientstation/delta/hall) "wi" = ( @@ -4449,12 +4448,21 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) -"wk" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/beta/atmos) -"wn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"wl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/kirbyplants/random/dead, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/bridge) +"wm" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/beta/atmos) +"wn" = ( +/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, @@ -4468,6 +4476,23 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/engine/airless, /area/ruin/space/ancientstation/beta/supermatter) +"wp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 10 + }, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/hall) +"wr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/alien/drone, +/obj/machinery/duct, +/obj/machinery/light/broken/directional/south, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/hall) "wt" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/computer/old{ @@ -4475,6 +4500,16 @@ }, /turf/open/floor/iron/white/textured, /area/ruin/space/ancientstation/delta/proto) +"ww" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/bin, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/spawner/random/trash/garbage, +/obj/effect/spawner/random/trash/garbage, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/bridge) "wx" = ( /turf/closed/wall, /area/ruin/space/ancientstation/delta/rnd) @@ -4502,6 +4537,17 @@ }, /turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/supermatter) +"wJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/old{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/beta/atmos) "wK" = ( /obj/machinery/computer/pandemic{ machine_stat = 1 @@ -4518,29 +4564,28 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/engie) -"wM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/obj/effect/spawner/random/trash/garbage, -/obj/effect/spawner/random/trash/garbage, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/sec) "wO" = ( /obj/machinery/hydroponics/soil, /obj/machinery/light/small/directional/south, /turf/open/floor/grass, /area/ruin/space/ancientstation/charlie/hydro) -"wQ" = ( +"wP" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants/random/dead, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 + }, +/obj/machinery/light/broken/directional/north, /turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/hall) +/area/ruin/space/ancientstation/delta/hall) +"wR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/ruin/space/ancientstation/charlie/engie) "wS" = ( /obj/item/stack/rods, /obj/machinery/atmospherics/components/unary/vent_scrubber{ @@ -4549,47 +4594,16 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/supermatter) -"wU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/atmos/glass{ - name = "Station Atmospherics" - }, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/atmos) -"xa" = ( +"xi" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/filingcabinet/chestdrawer{ - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 1 - }, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/away_general_access, -/turf/open/floor/iron/white/textured_edge, -/area/ruin/space/ancientstation/delta/biolab) -"xd" = ( -/obj/structure/closet/crate/bin, -/obj/effect/spawner/random/trash/garbage, -/obj/structure/broken_flooring/corner/directional/west, -/turf/open/floor/plating/airless, -/area/ruin/space/ancientstation/beta/medbay) -"xg" = ( -/obj/machinery/light/small/directional/east, -/obj/item/kirbyplants/random/dead, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/snack, +/obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 }, +/obj/machinery/light/small/directional/east, /turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/hydro) -"xl" = ( -/obj/machinery/firealarm/directional/south, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white/corner{ - dir = 4 - }, -/area/ruin/space/ancientstation/delta/rnd) +/area/ruin/space/ancientstation/charlie/sec) "xr" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -4612,14 +4626,37 @@ /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) "xx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/mapping_helpers/apc/no_charge, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/mapping_helpers/apc/away_general_access, +/turf/open/floor/iron/diagonal, +/area/ruin/space/ancientstation/beta/gravity) +"xz" = ( +/obj/machinery/duct, +/obj/structure/curtain, +/turf/open/floor/iron/white, +/area/ruin/space/ancientstation/charlie/hall) +"xF" = ( +/obj/structure/transit_tube{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 10 + }, /obj/structure/cable, -/obj/machinery/door/airlock/external/glass/ruin, -/turf/open/floor/catwalk_floor, -/area/ruin/space/ancientstation/charlie/engie) +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/damaged_window, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/charlie/hall) "xH" = ( /obj/effect/decal/cleanable/generic, /obj/structure/cable, @@ -4631,33 +4668,29 @@ }, /turf/open/floor/engine, /area/ruin/space/ancientstation/delta/biolab) -"xR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/delta/hall) -"xW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/obj/structure/sign/departments/science/directional/south, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) -"xX" = ( +"xT" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/broken_flooring/corner/directional/east, /obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/away_general_access, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/dorms) -"yd" = ( +/turf/open/floor/plating/airless, +/area/ruin/space/ancientstation/beta/hall) +"xY" = ( +/obj/effect/turf_decal/caution/stand_clear, +/obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/away_general_access, -/turf/open/floor/engine/airless, +/obj/machinery/door/poddoor{ + id = "Beta Secure Storage"; + name = "Secure Storage" + }, +/turf/open/floor/iron/textured_large, /area/ruin/space/ancientstation/beta/supermatter) +"yc" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/beta/medbay) "ye" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -4693,6 +4726,15 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/engie) +"yw" = ( +/obj/item/shard{ + icon_state = "medium" + }, +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/broken_flooring/pile/directional/north, +/turf/open/floor/plating/airless, +/area/ruin/space/ancientstation/beta/hall) "yx" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/reagent_dispensers/fueltank, @@ -4703,27 +4745,13 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/rnd) -"yH" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/charlie/kitchen) -"yL" = ( +"yG" = ( +/obj/machinery/door/airlock/science/glass, +/obj/machinery/door/firedoor, /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/l3closet/scientist, -/obj/machinery/light/small/directional/east{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/duct, -/turf/open/floor/iron/white/textured_large, -/area/ruin/space/ancientstation/delta/biolab) -"yN" = ( -/obj/effect/decal/cleanable/xenoblood, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, +/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/ancientstation/delta/rnd) "yQ" = ( /obj/effect/decal/cleanable/dirt, @@ -4735,17 +4763,46 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/diagonal, /area/ruin/space/ancientstation/beta/gravity) -"yY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/hall) "yZ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/broken/directional/east, /turf/open/floor/engine/airless, /area/ruin/space/ancientstation/beta/supermatter) +"ze" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/autolathe, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/rnd) +"zf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/ruin/space/ancientstation/delta/rnd) +"zi" = ( +/obj/item/kirbyplants/random/dead, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/light/small/broken/directional/west, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/airless, +/area/ruin/space/ancientstation/beta/medbay) +"zj" = ( +/obj/machinery/door/airlock/science{ + name = "Biolab" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor/closed, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/duct, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/iron/white/textured_large, +/area/ruin/space/ancientstation/delta/biolab) "zm" = ( /obj/machinery/door/window/brigdoor{ dir = 8; @@ -4785,14 +4842,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/diagonal, /area/ruin/space/ancientstation/beta/gravity) -"zs" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor{ - id = "ancient" +"zr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/kirbyplants/random/dead, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 }, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/hall) +"zt" = ( +/obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/charlie/sec) +/obj/machinery/duct, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/hall) "zw" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ @@ -4811,15 +4874,7 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hall) -"zz" = ( -/obj/machinery/door/airlock/science, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/door/firedoor/closed, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/rnd) -"zA" = ( +"zA" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -4831,14 +4886,12 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hall) -"zF" = ( +"zC" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants/random/dead, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 4 - }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/north, /turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/bridge) +/area/ruin/space/ancientstation/beta/hall) "zI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -4857,45 +4910,29 @@ "zL" = ( /turf/closed/mineral/random, /area/ruin/space/ancientstation/delta/hall) -"zM" = ( -/obj/machinery/door/airlock/science{ - name = "Biolab" - }, -/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/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 +"zS" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 10 }, -/turf/open/floor/iron/white/textured_large, -/area/ruin/space/ancientstation/delta/biolab) -"zO" = ( -/obj/effect/decal/cleanable/dirt, +/turf/template_noop, +/area/space/nearstation) +"zX" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/broken_flooring/side/directional/north, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/charlie/hall) -"zQ" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/closet/crate, -/obj/item/stack/sheet/mineral/silver{ - amount = 25 - }, -/obj/item/stack/sheet/mineral/gold{ - amount = 25 +/obj/effect/turf_decal/tile/yellow{ + dir = 4 }, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/delta/hall) +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/engie) "zZ" = ( /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/yellow, +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, /turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/rnd) +/area/ruin/space/ancientstation/charlie/engie) "Aa" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -4917,11 +4954,6 @@ /obj/structure/closet/emcloset/anchored, /turf/open/floor/plating, /area/ruin/space/ancientstation/delta/hall) -"Ad" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron/white/textured, -/area/ruin/space/ancientstation/delta/proto) "Ae" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, @@ -4959,13 +4991,6 @@ /obj/structure/cable, /turf/template_noop, /area/space/nearstation) -"As" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/away_general_access, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/hall) "Au" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -4979,20 +5004,37 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) -"Aw" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/delta/hall) "Ax" = ( /turf/closed/mineral/plasma, /area/ruin/space/ancientstation/beta/hall) "AA" = ( -/obj/structure/toilet{ - dir = 8 +/obj/effect/decal/cleanable/dirt, +/obj/item/kirbyplants/random/dead, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 }, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/bridge) +"AC" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/ruin/space/ancientstation/charlie/hall) +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/mob/living/simple_animal/hostile/alien/drone, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 10 + }, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/hall) +"AH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/stack/rods, +/obj/item/shard{ + icon_state = "medium" + }, +/obj/effect/decal/cleanable/glass, +/obj/structure/broken_flooring/side/directional/west, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/charlie/dorms) "AJ" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -5002,27 +5044,15 @@ "AK" = ( /turf/closed/wall, /area/ruin/space/ancientstation/beta/medbay) -"AR" = ( +"AT" = ( +/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/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 1 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/ruin/space/ancientstation/delta/rnd) -"AS" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/decal/cleanable/glass, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/item/shard{ - icon_state = "small" - }, -/turf/open/floor/plating/airless, -/area/ruin/space/ancientstation/beta/hall) +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/white/textured_large, +/area/ruin/space/ancientstation/delta/biolab) "AV" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -5044,35 +5074,40 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/engie) -"AY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 10 - }, -/obj/effect/decal/cleanable/glass, -/obj/item/shard, -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/broken_flooring/singular/directional/east, -/turf/open/floor/plating/airless, -/area/ruin/space/ancientstation/beta/hall) "AZ" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/mining) "Bb" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/light{ - state = 1 +/obj/machinery/door/airlock/highsecurity, +/obj/structure/alien/weeds, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "oldstation-aisat" }, -/area/ruin/space/ancientstation/charlie/bridge) +/obj/effect/mapping_helpers/airlock/access/all/away/general, +/turf/open/floor/iron/dark, +/area/ruin/space/ancientstation/delta/ai) +"Bd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/mapping_helpers/apc/no_charge, +/obj/structure/cable, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/mapping_helpers/apc/away_general_access, +/turf/open/floor/plating/rust, +/area/ruin/space/ancientstation/charlie/hall) "Bk" = ( /turf/closed/mineral/silver, /area/space/nearstation) "Bp" = ( -/obj/machinery/light/small/broken/directional/west, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/ancientstation/beta/hall) +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/sec) "Bq" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -5105,6 +5140,18 @@ initial_gas_mix = "co2=6;o2=16;n2=82;TEMP=293.15" }, /area/ruin/space/ancientstation/delta/hall) +"Bv" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/beta/hall) "By" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/computer/monitor, @@ -5136,14 +5183,6 @@ /obj/structure/cable, /turf/open/floor/iron/solarpanel/airless, /area/ruin/space/solars/ancientstation/charlie/solars) -"BI" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/broken_bottle, -/obj/item/soap/nanotrasen, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/rnd) "BJ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/firedoor, @@ -5155,22 +5194,10 @@ /turf/open/floor/iron/cafeteria, /area/ruin/space/ancientstation/charlie/kitchen) "BN" = ( -/obj/structure/table, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/scanning_module{ - pixel_x = 2; - pixel_y = 3 - }, -/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm/directional/north, /obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/obj/machinery/button/door/directional/south{ - name = "Central Hall Windows Control"; - id = "oldstation_rnd_external" - }, -/turf/open/floor/iron, +/obj/structure/cable, +/turf/open/floor/iron/white, /area/ruin/space/ancientstation/delta/rnd) "BP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -5184,11 +5211,6 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/engie) -"Cg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/shard, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/dorms) "Cj" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/airless, @@ -5196,9 +5218,37 @@ "Ck" = ( /turf/closed/wall/rust, /area/ruin/space/ancientstation/beta/medbay) +"Cl" = ( +/obj/machinery/door/airlock/science, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/door/firedoor/closed, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 10 + }, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/hall) "Cq" = ( /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/hall) +"Cr" = ( +/obj/structure/table/glass, +/obj/item/storage/medkit/ancient, +/obj/effect/decal/cleanable/dirt, +/obj/item/paper/fluff/ruins/oldstation/protosleep{ + default_raw_text = "*Prototype Sleeper*

We have deliverted the lastest in medical technology to the medical bay for your use." + }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/mapping_helpers/apc/no_charge, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/mapping_helpers/apc/away_general_access, +/turf/open/floor/iron/airless, +/area/ruin/space/ancientstation/beta/medbay) "Cs" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/public/glass{ @@ -5207,22 +5257,22 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/kitchen) -"Ct" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 1 +"CA" = ( +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/atmos) -"CE" = ( -/obj/effect/decal/cleanable/dirt, /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/closed, +/turf/open/floor/iron/white, +/area/ruin/space/ancientstation/delta/rnd) +"CC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/atmos/glass{ + name = "Station Atmospherics" + }, /turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/hall) +/area/ruin/space/ancientstation/beta/atmos) "CK" = ( /obj/effect/decal/cleanable/dirt, /obj/item/reagent_containers/cup/beaker/oldstation, @@ -5232,13 +5282,30 @@ /obj/effect/decal/cleanable/glass/plasma, /turf/open/floor/engine/airless, /area/ruin/space/ancientstation/beta/supermatter) -"CR" = ( -/obj/machinery/power/smes{ - input_level = 5000; - output_level = 5000 +"CP" = ( +/obj/machinery/light/small/directional/west, +/obj/item/kirbyplants/random/dead, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 1 }, -/obj/structure/cable, -/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/hydro) +"CQ" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white/textured_edge{ + dir = 8 + }, +/area/ruin/space/ancientstation/delta/biolab) +"CR" = ( +/obj/machinery/power/smes{ + input_level = 5000; + output_level = 5000 + }, +/obj/structure/cable, +/obj/machinery/light/small/directional/east, /turf/open/floor/iron/diagonal, /area/ruin/space/ancientstation/beta/gravity) "CU" = ( @@ -5247,6 +5314,22 @@ }, /turf/open/floor/engine/o2, /area/ruin/space/ancientstation/beta/atmos) +"CZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/obj/structure/sign/departments/science/directional/south, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/hall) +"Db" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/away_general_access, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/tracks, +/obj/structure/cable, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/hall) "Df" = ( /obj/structure/grille/broken, /turf/open/floor/plating/airless, @@ -5260,10 +5343,6 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) -"Dh" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/catwalk_floor, -/area/ruin/space/ancientstation/delta/hall) "Dk" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -5275,10 +5354,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/sec) -"Dn" = ( -/obj/structure/sign/poster/contraband/lamarr, -/turf/closed/wall, -/area/ruin/space/ancientstation/delta/biolab) "Dp" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -5287,6 +5362,11 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/atmos) +"Ds" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/damaged_window, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/delta/hall) "Dw" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -5305,54 +5385,34 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/supermatter) -"Dy" = ( +"DB" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/engie) -"Dz" = ( -/obj/structure/alien/weeds, -/obj/effect/gibspawner/human, -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/iron/dark, -/area/ruin/space/ancientstation/delta/ai) -"DE" = ( -/obj/structure/transit_tube{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 10 - }, -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/delta/hall) -"DG" = ( +/obj/effect/decal/cleanable/cobweb, /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/away_general_access, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/dorms) +"DC" = ( +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/spawner/random/trash/garbage, -/obj/effect/spawner/random/trash/garbage, -/obj/effect/spawner/random/trash/garbage, +/obj/machinery/light/small/directional/south, /turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/engie) +/area/ruin/space/ancientstation/beta/atmos) "DI" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/highsecurity, +/obj/machinery/door/firedoor, +/obj/structure/alien/weeds, +/obj/structure/cable, /obj/effect/decal/cleanable/blood/tracks, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "oldstation-aisat" }, -/obj/structure/cable, -/turf/open/floor/iron, +/obj/effect/mapping_helpers/airlock/access/all/away/general, +/turf/open/floor/iron/dark, /area/ruin/space/ancientstation/delta/hall) "DJ" = ( /obj/effect/decal/cleanable/dirt, @@ -5367,59 +5427,90 @@ /obj/structure/canister_frame/machine/unfinished_canister_frame, /turf/open/floor/engine/airless, /area/ruin/space/ancientstation/beta/supermatter) -"DN" = ( -/obj/machinery/duct, -/obj/structure/curtain, -/turf/open/floor/iron/white, -/area/ruin/space/ancientstation/charlie/hall) -"DT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ +"DM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/mop_bucket/janitorialcart{ dir = 4 }, -/obj/effect/decal/cleanable/glass, -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 10 +/obj/item/reagent_containers/cup/bucket, +/obj/item/mop, +/obj/item/storage/bag/trash/filled, +/turf/open/floor/plating/rust{ + initial_gas_mix = "co2=6;o2=16;n2=82;TEMP=293.15" }, -/obj/structure/broken_flooring/singular/directional/west, -/turf/open/floor/plating/airless, -/area/ruin/space/ancientstation/beta/hall) +/area/ruin/space/ancientstation/delta/hall) +"DQ" = ( +/obj/item/kirbyplants/fern, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted, +/turf/open/floor/iron/white/textured, +/area/ruin/space/ancientstation/delta/biolab) +"DX" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/damaged_window, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/charlie/dorms) "Eg" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/rnd) -"En" = ( -/obj/effect/decal/cleanable/dirt, +"Eh" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/tracks, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) -"Eo" = ( +"Ei" = ( +/obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/east, /obj/effect/mapping_helpers/airalarm/away_general_access, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/tracks, -/obj/structure/cable, /turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) -"Ew" = ( +/area/ruin/space/ancientstation/beta/hall) +"Ej" = ( +/obj/machinery/light/small/directional/south, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/oil, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 +/obj/item/storage/box/lights/mixed, +/turf/open/floor/plating{ + initial_gas_mix = "co2=6;o2=16;n2=82;TEMP=293.15" }, +/area/ruin/space/ancientstation/delta/hall) +"El" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/shard, /turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/engie) +/area/ruin/space/ancientstation/charlie/dorms) +"En" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/hall) "EB" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair, /turf/open/floor/iron/cafeteria, /area/ruin/space/ancientstation/charlie/kitchen) +"ED" = ( +/obj/structure/transit_tube{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 + }, +/obj/machinery/duct, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/charlie/hall) "EE" = ( /obj/machinery/door/firedoor, /obj/effect/decal/cleanable/dirt, @@ -5445,95 +5536,16 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) -"EG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/structure/sign/departments/chemistry/directional/north, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) -"EH" = ( -/obj/effect/decal/cleanable/glass, -/obj/item/light/tube/broken, -/obj/machinery/light/built/directional/east, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white/textured_edge{ - dir = 8 - }, -/area/ruin/space/ancientstation/delta/biolab) -"EI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/structure/cable, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/mapping_helpers/apc/away_general_access, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/dorms) -"EJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/autolathe, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/rnd) -"EN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 6 - }, -/obj/structure/sign/poster/official/no_erp/directional/west, -/turf/open/floor/iron/white, -/area/ruin/space/ancientstation/charlie/hall) "EP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/cafeteria, /area/ruin/space/ancientstation/charlie/kitchen) -"EQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 10 - }, -/obj/structure/cable, -/obj/structure/broken_flooring/pile/directional/north, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/charlie/hall) "ES" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/power/energy_accumulator/tesla_coil, /turf/open/floor/plating, /area/ruin/space/ancientstation/beta/supermatter) -"EU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/mob/living/simple_animal/hostile/alien/drone, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 10 - }, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) -"EV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/atmos) "EW" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -5562,19 +5574,14 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) -"EY" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/effect/mapping_helpers/damaged_window, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/charlie/dorms) "Fa" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 +/obj/structure/sink/directional/west{ + has_water_reclaimer = 0 }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/rnd) +/obj/structure/mirror/directional/east, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/ruin/space/ancientstation/charlie/hall) "Fd" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm/directional/south, @@ -5585,12 +5592,6 @@ /obj/machinery/space_heater, /turf/open/floor/plating/rust, /area/ruin/space/ancientstation/delta/hall) -"Fm" = ( -/obj/item/stack/rods, -/obj/effect/decal/cleanable/dirt, -/obj/structure/broken_flooring/pile/directional/south, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/charlie/dorms) "Fo" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/glass, @@ -5603,16 +5604,6 @@ initial_gas_mix = "co2=6;o2=16;n2=82;TEMP=293.15" }, /area/ruin/space/ancientstation/delta/hall) -"Fq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/old{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/atmos) "Fr" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -5623,52 +5614,30 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/diagonal, /area/ruin/space/ancientstation/beta/gravity) -"Fu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) "Fv" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/dorms) +"Fw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/hall) "Fz" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/item/stack/rods, /turf/open/floor/engine/airless, /area/ruin/space/ancientstation/beta/supermatter) -"FF" = ( -/obj/structure/broken_flooring/pile/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, -/area/ruin/space/ancientstation/beta/hall) -"FG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general, -/obj/machinery/meter, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/away_general_access, -/turf/open/floor/plating/rust, -/area/ruin/space/ancientstation/charlie/hall) "FJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 1 - }, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/mapping_helpers/apc/away_general_access, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/sec) +/obj/structure/alien/weeds, +/obj/machinery/light/small/broken/directional/west, +/turf/open/floor/iron/dark, +/area/ruin/space/ancientstation/delta/ai) "FK" = ( /obj/structure/closet/crate, /obj/item/stack/sheet/iron{ @@ -5683,20 +5652,6 @@ }, /turf/open/floor/plating, /area/ruin/space/ancientstation/beta/hall) -"FL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 - }, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/mapping_helpers/apc/away_general_access, -/turf/open/floor/iron/white/textured_edge{ - dir = 4 - }, -/area/ruin/space/ancientstation/delta/biolab) "FM" = ( /obj/structure/transit_tube{ dir = 4 @@ -5711,10 +5666,19 @@ /obj/structure/cable, /turf/template_noop, /area/space/nearstation) -"FO" = ( -/obj/effect/spawner/structure/window, +"FN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/wrench, +/obj/item/wirecutters, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/away_general_access, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/mapping_helpers/apc/no_charge, +/obj/structure/cable, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/mapping_helpers/apc/away_general_access, /turf/open/floor/plating, -/area/ruin/space/ancientstation/beta/medbay) +/area/ruin/space/ancientstation/charlie/storage) "FP" = ( /obj/item/shard/plasma{ icon_state = "plasmasmall" @@ -5744,13 +5708,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hall) -"FW" = ( -/obj/effect/decal/cleanable/generic, -/obj/effect/turf_decal/tile/purple/half/contrasted, -/turf/open/floor/iron/white/textured_edge{ - dir = 1 +"FX" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters{ + dir = 4; + id = "oldstation_rnd" }, -/area/ruin/space/ancientstation/delta/biolab) +/turf/open/floor/plating, +/area/ruin/space/ancientstation/delta/rnd) +"FY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/away_general_access, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/ancientstation/charlie/kitchen) "Ga" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/general, @@ -5758,6 +5729,13 @@ /obj/effect/decal/cleanable/food/flour, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hall) +"Gb" = ( +/obj/effect/decal/cleanable/glass, +/obj/item/stack/rods, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/beta/atmos) "Gd" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate, @@ -5769,6 +5747,15 @@ }, /turf/open/floor/plating/rust, /area/ruin/space/ancientstation/charlie/hall) +"Gf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 6 + }, +/obj/structure/sign/poster/official/no_erp/directional/west, +/turf/open/floor/iron/white, +/area/ruin/space/ancientstation/charlie/hall) "Gi" = ( /obj/machinery/portable_atmospherics/canister/plasma, /obj/effect/decal/cleanable/dirt, @@ -5793,60 +5780,23 @@ /area/ruin/space/ancientstation/delta/hall) "Gt" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/soap/nanotrasen, -/obj/item/coin, -/obj/item/coin, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/bridge) -"Gx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) -"Gy" = ( -/obj/structure/alien/weeds, -/obj/item/bodypart/chest, -/obj/effect/decal/cleanable/blood/gibs/old, -/turf/open/floor/iron/dark, -/area/ruin/space/ancientstation/delta/ai) +/turf/open/floor/plating, +/area/ruin/space/ancientstation/charlie/engie) +"Gv" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/delta/proto) "Gz" = ( /turf/closed/wall/rust, /area/ruin/space/ancientstation/delta/hall) -"GC" = ( -/obj/structure/table/glass, -/obj/item/storage/medkit/ancient, -/obj/effect/decal/cleanable/dirt, -/obj/item/paper/fluff/ruins/oldstation/protosleep{ - default_raw_text = "*Prototype Sleeper*

We have deliverted the lastest in medical technology to the medical bay for your use." - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 4 - }, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/mapping_helpers/apc/away_general_access, -/turf/open/floor/iron/airless, -/area/ruin/space/ancientstation/beta/medbay) -"GG" = ( -/obj/effect/decal/cleanable/glass, -/obj/item/shard{ - icon_state = "small" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/small/built/directional/east, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/atmos) "GH" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) +"GJ" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/engine/airless, +/area/ruin/space/ancientstation/beta/supermatter) "GK" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Storage Room" @@ -5873,45 +5823,31 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/atmos) -"GQ" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/alien/weeds, -/obj/structure/closet/crate, -/obj/item/stack/sheet/mineral/titanium{ - amount = 30 - }, -/obj/item/stack/sheet/mineral/plasma{ - amount = 25 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/ancientstation/delta/ai) -"GT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/away_general_access, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) "GX" = ( /turf/closed/wall/rust, /area/ruin/space/ancientstation/delta/biolab) -"Hg" = ( -/obj/effect/decal/cleanable/dirt, +"GY" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/mop_bucket/janitorialcart{ +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ dir = 4 }, -/obj/item/reagent_containers/cup/bucket, -/obj/item/mop, -/obj/item/storage/bag/trash/filled, -/turf/open/floor/plating/rust{ - initial_gas_mix = "co2=6;o2=16;n2=82;TEMP=293.15" - }, -/area/ruin/space/ancientstation/delta/hall) +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/away_general_access, +/turf/open/floor/iron/white, +/area/ruin/space/ancientstation/delta/rnd) +"Hf" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/beta/mining) "Hj" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/engine/airless, /area/ruin/space/ancientstation/beta/supermatter) +"Hk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/broken/directional/west, +/turf/open/floor/iron/white, +/area/ruin/space/ancientstation/delta/rnd) "Hl" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/highsecurity{ @@ -5947,15 +5883,6 @@ initial_gas_mix = "co2=6;o2=16;n2=82;TEMP=293.15" }, /area/ruin/space/ancientstation/delta/hall) -"Hv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/mapping_helpers/apc/away_general_access, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/ancientstation/charlie/kitchen) "Hw" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -5963,49 +5890,38 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/diagonal, /area/ruin/space/ancientstation/beta/gravity) -"Hz" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/dorms) "HA" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow/half/contrasted, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/atmos) -"HB" = ( +"HC" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/obj/machinery/button/door/directional/south{ + name = "Research Shutters Control"; + id = "oldstation_rnd" + }, +/obj/structure/table, +/obj/item/stock_parts/capacitor, +/obj/item/stock_parts/servo, +/obj/item/stock_parts/micro_laser, +/obj/item/stack/cable_coil, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/rnd) "HE" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/toy/seashell, -/obj/item/toy/seashell, -/obj/item/toy/seashell, -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/iron/white, -/area/ruin/space/ancientstation/charlie/hall) -"HF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/science, -/obj/effect/decal/cleanable/dirt, +/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/closed, -/obj/machinery/duct, /turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/rnd) -"HJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/curtain, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white/textured_edge{ - dir = 8 - }, -/area/ruin/space/ancientstation/delta/biolab) +/area/ruin/space/ancientstation/beta/hall) +"HG" = ( +/obj/structure/grille/broken, +/turf/open/floor/plating/airless, +/area/ruin/space/ancientstation/beta/hall) "HK" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ @@ -6017,19 +5933,14 @@ /obj/structure/cable, /turf/template_noop, /area/space/nearstation) -"HM" = ( -/obj/structure/cable, +"HL" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/atmos) +/obj/machinery/atmospherics/pipe/smart/manifold4w/general, +/obj/machinery/meter, +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/away_general_access, +/turf/open/floor/plating/rust, +/area/ruin/space/ancientstation/charlie/hall) "HN" = ( /obj/effect/decal/cleanable/blood/old, /obj/item/paper/fluff/ruins/oldstation/biolab_note_emergency{ @@ -6079,14 +5990,28 @@ }, /turf/open/floor/iron/white/textured, /area/ruin/space/ancientstation/delta/proto) -"Ih" = ( -/turf/open/floor/plating, -/area/ruin/space/ancientstation/beta/hall) +"Ie" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/structure/sign/departments/aisat/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/hall) "Ij" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/ruin/space/ancientstation/delta/hall) +"Ik" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/rust, +/area/ruin/space/ancientstation/delta/hall) +"Im" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light_switch/directional/west{ + pixel_x = -24 + }, +/turf/open/floor/engine/airless, +/area/ruin/space/ancientstation/beta/supermatter) "Ip" = ( /obj/effect/decal/cleanable/dirt, /obj/item/kitchen/fork{ @@ -6095,23 +6020,12 @@ }, /turf/open/floor/iron/cafeteria, /area/ruin/space/ancientstation/charlie/kitchen) -"Ir" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/engie) "Is" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 1 +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters{ + id = "oldstation_rnd" }, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron/white, +/turf/open/floor/plating, /area/ruin/space/ancientstation/delta/rnd) "Iu" = ( /obj/effect/decal/cleanable/dirt, @@ -6139,12 +6053,6 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/hall) -"Iz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants/photosynthetic, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/rnd) "IB" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -6155,31 +6063,12 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hydro) -"IF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/bin, -/obj/effect/spawner/random/trash/garbage, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/dorms) -"IH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/away_general_access, -/obj/effect/decal/cleanable/generic, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/hydro) -"IL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/south, +"IC" = ( +/obj/machinery/door/airlock/science/glass, +/obj/machinery/door/firedoor, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/alien/drone, -/obj/machinery/duct, /turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) +/area/ruin/space/ancientstation/delta/rnd) "IM" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6190,69 +6079,47 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) -"IQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/transit_tube/station/reverse/flipped{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 10 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/charlie/hall) "IT" = ( /obj/machinery/power/solar, /obj/structure/cable, /turf/open/floor/iron/solarpanel/airless, /area/ruin/space/solars/ancientstation/charlie/solars) -"IV" = ( +"IU" = ( +/obj/structure/closet/crate/engineering, +/obj/item/circuitboard/machine/smes, +/obj/item/stock_parts/cell/high/empty, +/obj/item/stock_parts/cell/high/empty, +/obj/item/stock_parts/cell/high/empty, +/obj/item/stock_parts/cell/high/empty, +/obj/item/stock_parts/cell/high/empty, +/obj/item/stock_parts/capacitor, /obj/effect/decal/cleanable/dirt, +/obj/item/circuitboard/machine/thermomachine, +/obj/item/circuitboard/machine/thermomachine, +/obj/item/stock_parts/micro_laser, +/obj/item/stock_parts/micro_laser, +/obj/item/stock_parts/micro_laser, +/obj/item/stock_parts/micro_laser, +/obj/item/stock_parts/matter_bin, +/obj/item/stock_parts/matter_bin, +/obj/item/stock_parts/matter_bin, +/obj/item/stock_parts/matter_bin, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/beta/supermatter) +"IV" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) -"IW" = ( -/obj/structure/grille/broken, -/turf/open/floor/plating/airless, -/area/ruin/space/ancientstation/beta/hall) -"IY" = ( -/obj/machinery/door/airlock/atmos/glass{ - name = "Station Atmospherics" - }, -/obj/machinery/door/firedoor, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2{ +/obj/effect/decal/cleanable/blood/tracks{ dir = 4 }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible/layer4, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/atmos) -"IZ" = ( -/obj/structure/table/glass, -/obj/structure/closet/mini_fridge{ - pixel_y = 8; - pixel_x = 2 +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 }, -/obj/item/petri_dish/oldstation, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 1 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 }, -/turf/open/floor/iron/white/textured, -/area/ruin/space/ancientstation/delta/biolab) +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/hall) "Ja" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -6289,17 +6156,6 @@ /obj/structure/lattice, /turf/template_noop, /area/space/nearstation) -"Jn" = ( -/obj/machinery/door/airlock/science, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/door/firedoor/closed, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 10 - }, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) "Jo" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -6319,35 +6175,23 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) -"Jq" = ( -/obj/item/chair{ - pixel_y = -8; - pixel_x = 13 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/textured_large, -/area/ruin/space/ancientstation/delta/biolab) -"Jr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/structure/cable, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 - }, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/mapping_helpers/apc/away_general_access, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/hydro) -"Ju" = ( +"Jw" = ( +/obj/effect/decal/cleanable/glass, +/obj/structure/closet/firecloset, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/beta/hall) +"Jz" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/away_general_access, +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 10 + }, +/obj/machinery/firealarm/directional/east, /turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/rnd) +/area/ruin/space/ancientstation/delta/hall) "JB" = ( /obj/structure/lattice/catwalk, /obj/machinery/power/rtg/old_station, @@ -6387,6 +6231,14 @@ }, /turf/open/floor/iron/white/textured, /area/ruin/space/ancientstation/delta/biolab) +"JF" = ( +/obj/machinery/door/airlock/science, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/door/firedoor/closed, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/rnd) "JH" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/generic, @@ -6423,6 +6275,16 @@ /obj/machinery/light/small/broken/directional/south, /turf/open/floor/engine/airless, /area/ruin/space/ancientstation/beta/supermatter) +"JO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet, +/obj/effect/spawner/random/maintenance/three, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/delta/hall) +"JR" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor, +/area/ruin/space/ancientstation/delta/hall) "JT" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -6444,12 +6306,18 @@ /area/ruin/space/ancientstation/beta/gravity) "JX" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/bin, -/obj/effect/spawner/random/trash/garbage, -/obj/effect/spawner/random/trash/garbage, +/obj/structure/cable, +/obj/item/stack/rods, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2{ + dir = 4 + }, +/obj/effect/decal/cleanable/glass, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, /turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/rnd) +/area/ruin/space/ancientstation/beta/atmos) "JY" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -6459,12 +6327,41 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hall) +"JZ" = ( +/mob/living/simple_animal/hostile/alien, +/obj/structure/alien/weeds, +/obj/machinery/light/small/broken/directional/west, +/turf/open/floor/iron/dark, +/area/ruin/space/ancientstation/delta/ai) "Ka" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm/directional/east, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hall) +"Kb" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/cup/bottle/carbon{ + pixel_x = 6 + }, +/obj/item/reagent_containers/cup/bottle/chlorine{ + pixel_x = -6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/structure/sign/poster/official/periodic_table/directional/north, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/rnd) +"Kd" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/away_general_access, +/turf/open/floor/iron/diagonal, +/area/ruin/space/ancientstation/beta/gravity) "Ke" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -6481,14 +6378,23 @@ }, /turf/open/floor/engine/o2, /area/ruin/space/ancientstation/beta/atmos) -"Kg" = ( +"Kk" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +/obj/machinery/computer/old{ dir = 8 }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_machine, /turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/mining) +/area/ruin/space/ancientstation/charlie/dorms) +"Ku" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/closet/crate/bin, +/obj/effect/spawner/random/trash/garbage, +/obj/effect/spawner/random/trash/garbage, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/ancientstation/charlie/kitchen) "Kv" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/oven/range, @@ -6506,25 +6412,21 @@ /obj/structure/sign/warning/test_chamber/directional/south, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) -"Ky" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/east, +"KA" = ( +/obj/structure/closet/crate/bin, +/obj/effect/spawner/random/trash/garbage, +/obj/structure/broken_flooring/corner/directional/west, +/turf/open/floor/plating/airless, +/area/ruin/space/ancientstation/beta/medbay) +"KF" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/machinery/duct, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) -"KA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/away_general_access, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/ancientstation/charlie/kitchen) -"KG" = ( -/obj/machinery/light/directional/east, -/obj/structure/table/reinforced, -/obj/item/paper/fluff/ruins/oldstation/protosupermatter, -/turf/open/floor/iron/white/textured, -/area/ruin/space/ancientstation/delta/proto) +"KH" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/ruin/space/ancientstation/beta/hall) "KI" = ( /obj/item/stack/rods, /obj/structure/cable, @@ -6562,22 +6464,10 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/supermatter) -"KS" = ( -/obj/item/kirbyplants/fern, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white/textured, -/area/ruin/space/ancientstation/delta/biolab) "KT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/ruin/space/ancientstation/delta/rnd) +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/charlie/sec) "KV" = ( /obj/machinery/firealarm/directional/south, /obj/machinery/light_switch/directional/west, @@ -6586,13 +6476,23 @@ /obj/item/paper/guides/jobs/engi/gravity_gen, /turf/open/floor/iron/diagonal, /area/ruin/space/ancientstation/beta/gravity) -"KZ" = ( +"KX" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light_switch/directional/west{ - pixel_x = -24 - }, -/turf/open/floor/engine/airless, -/area/ruin/space/ancientstation/beta/supermatter) +/obj/structure/sign/warning/engine_safety/directional/west, +/obj/structure/broken_flooring/pile/directional/west, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless, +/area/ruin/space/ancientstation/beta/hall) +"Lc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/duct, +/obj/machinery/light/broken/directional/south, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/hall) "Le" = ( /obj/machinery/door/airlock/science, /obj/effect/decal/cleanable/dirt, @@ -6609,10 +6509,6 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) -"Lg" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/mineral/diamond, -/area/space/nearstation) "Lh" = ( /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/engine/o2, @@ -6632,18 +6528,25 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/atmos) +"Lo" = ( +/obj/machinery/door/airlock/science{ + name = "Biolab" + }, +/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/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/iron/white/textured_large, +/area/ruin/space/ancientstation/delta/biolab) "Lp" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light_switch/directional/south, /turf/open/floor/iron/cafeteria, /area/ruin/space/ancientstation/charlie/kitchen) -"Lq" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/catwalk_floor, -/area/ruin/space/ancientstation/delta/hall) "Ls" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate/radiation, @@ -6652,6 +6555,13 @@ }, /turf/open/floor/plating, /area/ruin/space/ancientstation/beta/supermatter) +"Lw" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/ruin/space/ancientstation/charlie/hall) "Lx" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/plumbing/synthesizer{ @@ -6667,21 +6577,11 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/cafeteria, /area/ruin/space/ancientstation/charlie/kitchen) -"LD" = ( -/obj/structure/transit_tube{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/duct, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/delta/hall) +"LC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/white/textured, +/area/ruin/space/ancientstation/delta/proto) "LG" = ( /obj/item/shard{ icon_state = "medium" @@ -6700,21 +6600,10 @@ initial_gas_mix = "co2=6;o2=16;n2=82;TEMP=293.15" }, /area/ruin/space/ancientstation/delta/hall) -"LL" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/cup/bottle/carbon{ - pixel_x = 6 - }, -/obj/item/reagent_containers/cup/bottle/chlorine{ - pixel_x = -6 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/obj/structure/sign/poster/official/periodic_table/directional/north, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/rnd) +"LK" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/delta/hall) "LM" = ( /obj/structure/table/glass, /obj/item/reagent_containers/cup/bottle/sugar{ @@ -6737,17 +6626,29 @@ /obj/effect/decal/cleanable/generic, /turf/open/floor/iron/white/textured_large, /area/ruin/space/ancientstation/delta/biolab) -"LV" = ( +"LS" = ( +/obj/structure/table, +/obj/item/stack/sheet/glass, +/obj/item/stack/sheet/glass, +/obj/item/stock_parts/matter_bin, +/obj/item/stock_parts/scanning_module{ + pixel_x = 2; + pixel_y = 3 + }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/duct, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 10 +/obj/machinery/button/door/directional/south{ + name = "Central Hall Windows Control"; + id = "oldstation_rnd_external" }, -/obj/machinery/firealarm/directional/east, /turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) +/area/ruin/space/ancientstation/delta/rnd) +"LV" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/damaged_window, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/charlie/hall) "LW" = ( /obj/structure/table/glass, /obj/item/reagent_containers/cup/bottle/potassium{ @@ -6766,22 +6667,25 @@ /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/rnd) "LX" = ( -/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, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/rnd) +"LY" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/obj/machinery/airalarm/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/airalarm/directional/east, /obj/effect/mapping_helpers/airalarm/away_general_access, -/obj/machinery/light/small/directional/west, /turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/hall) -"LY" = ( +/area/ruin/space/ancientstation/delta/rnd) +"Ma" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/ruin/space/ancientstation/beta/hall) +/area/ruin/space/ancientstation/charlie/engie) "Md" = ( /turf/open/floor/iron/diagonal, /area/ruin/space/ancientstation/beta/gravity) @@ -6791,21 +6695,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hall) -"Ml" = ( -/obj/machinery/atmospherics/components/binary/pump/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/structure/broken_flooring/corner/directional/north, -/turf/open/floor/plating/airless, -/area/ruin/space/ancientstation/beta/hall) -"Mp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/xenoblood/xgibs/core, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/ruin/space/ancientstation/delta/rnd) +"Mr" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/charlie/hydro) "Ms" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/window/plasma/spawner/directional/east, @@ -6813,45 +6706,41 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/supermatter) +"Mt" = ( +/obj/structure/table, +/obj/item/crowbar, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/decoration/glowstick, +/obj/structure/mirror/directional/west, +/obj/item/clothing/neck/link_scryer/loaded/charlie, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/dorms) "Mu" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/space_heater, /obj/machinery/light/small/broken/directional/west, /turf/open/floor/plating, /area/ruin/space/ancientstation/charlie/hall) -"MD" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/effect/mapping_helpers/damaged_window, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/delta/hall) +"Mx" = ( +/obj/structure/table/reinforced, +/obj/item/paper/fluff/ruins/oldstation/protogun, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white/textured, +/area/ruin/space/ancientstation/delta/proto) "MH" = ( /obj/structure/girder/displaced, /turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/supermatter) -"MI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor/closed, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/hall) "MJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/structure/cable, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/mapping_helpers/apc/away_general_access, -/turf/open/floor/plating/rust, -/area/ruin/space/ancientstation/charlie/hall) -"MK" = ( -/obj/machinery/door/airlock/highsecurity, /obj/structure/alien/weeds, /obj/structure/cable, -/obj/effect/decal/cleanable/blood/xtracks, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "oldstation-aisat" - }, -/obj/effect/mapping_helpers/airlock/access/all/away/general, +/obj/effect/decal/cleanable/blood/gibs/old, +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/mapping_helpers/apc/no_charge, +/obj/effect/mapping_helpers/apc/away_general_access, +/obj/effect/mapping_helpers/apc/unlocked, /turf/open/floor/iron/dark, /area/ruin/space/ancientstation/delta/ai) "MM" = ( @@ -6877,6 +6766,18 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/rnd) +"MP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/filingcabinet/chestdrawer{ + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/away_general_access, +/turf/open/floor/iron/white/textured_edge, +/area/ruin/space/ancientstation/delta/biolab) "MS" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -6884,25 +6785,14 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) -"MU" = ( -/obj/structure/transit_tube{ - dir = 4 - }, +"MV" = ( /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/duct, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/charlie/hall) -"MX" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/charlie/dorms) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/broken_flooring/singular/directional/east, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless, +/area/ruin/space/ancientstation/beta/hall) "MY" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -6926,10 +6816,11 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/plating, /area/ruin/space/ancientstation/beta/supermatter) -"Nk" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/delta/rnd) +"Ni" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/safety_internals/directional/north, +/turf/open/floor/catwalk_floor, +/area/ruin/space/ancientstation/delta/hall) "Np" = ( /obj/effect/decal/cleanable/blood/xtracks{ dir = 10 @@ -6944,22 +6835,14 @@ /obj/structure/window/plasma/spawner/directional/west, /turf/open/floor/engine/airless, /area/ruin/space/ancientstation/beta/supermatter) -"Nu" = ( -/obj/effect/spawner/structure/window, -/obj/machinery/door/poddoor/shutters{ - id = "oldstation_rnd" - }, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/delta/rnd) -"Ny" = ( +"Nx" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/obj/machinery/firealarm/directional/west, +/obj/effect/decal/cleanable/dirt, +/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/ruin/space/ancientstation/charlie/sec) +/area/ruin/space/ancientstation/delta/hall) "Nz" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -6981,6 +6864,23 @@ /obj/structure/table_frame, /turf/open/floor/iron/airless, /area/ruin/space/ancientstation/beta/medbay) +"NC" = ( +/turf/open/floor/catwalk_floor, +/area/ruin/space/ancientstation/beta/supermatter) +"ND" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/machinery/portable_atmospherics/pump, +/obj/machinery/atmospherics/components/unary/portables_connector/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/airalarm/directional/south, +/obj/effect/mapping_helpers/airalarm/away_general_access, +/turf/open/floor/iron/airless, +/area/ruin/space/ancientstation/beta/hall) "NE" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -6996,27 +6896,42 @@ /obj/machinery/door/airlock/maintenance_hatch, /turf/open/floor/plating, /area/ruin/space/ancientstation/delta/hall) -"NO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 +"NP" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/away_general_access, +/obj/structure/table_frame, +/obj/item/shard{ + icon_state = "medium" }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 +/obj/item/defibrillator, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 }, -/obj/structure/broken_flooring/side/directional/north, +/obj/effect/mapping_helpers/airalarm/unlocked, +/turf/open/floor/iron/airless, +/area/ruin/space/ancientstation/beta/medbay) +"NQ" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, -/area/ruin/space/ancientstation/beta/hall) +/obj/effect/decal/cleanable/xenoblood, +/turf/open/floor/iron/white, +/area/ruin/space/ancientstation/delta/rnd) +"NS" = ( +/obj/structure/alien/weeds, +/obj/item/bodypart/chest, +/obj/effect/decal/cleanable/blood/gibs/old, +/turf/open/floor/iron/dark, +/area/ruin/space/ancientstation/delta/ai) "NU" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_half, /area/ruin/space/ancientstation/beta/supermatter) -"NV" = ( -/obj/item/stack/rods, -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/broken_flooring/singular/directional/east, -/turf/open/floor/plating/airless, -/area/ruin/space/ancientstation/beta/hall) +"NW" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor{ + id = "ancient" + }, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/charlie/bridge) "NY" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -7037,6 +6952,13 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/rnd) +"Oa" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/obj/machinery/iv_drip, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/rnd) "Ob" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/purple/half/contrasted{ @@ -7046,42 +6968,68 @@ dir = 8 }, /area/ruin/space/ancientstation/delta/biolab) -"Om" = ( -/obj/effect/decal/cleanable/oil/slippery, +"Oc" = ( +/obj/structure/table/glass, +/obj/structure/microscope{ + pixel_y = 4 + }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/hall) -"Oo" = ( +/obj/item/paper/fluff/ruins/oldstation/biolab_note_molly{ + pixel_y = -10; + pixel_x = 7 + }, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/built/directional/west, +/turf/open/floor/iron/white/textured_edge{ + dir = 4 + }, +/area/ruin/space/ancientstation/delta/biolab) +"Oh" = ( +/obj/structure/table/reinforced, +/obj/item/paper/fluff/ruins/oldstation/protosupermatter, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white/textured, +/area/ruin/space/ancientstation/delta/proto) +"Ol" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/mapping_helpers/apc/no_charge, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible/layer4, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/mapping_helpers/apc/away_general_access, /turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/atmos) +/area/ruin/space/ancientstation/charlie/hydro) +"Om" = ( +/obj/effect/decal/cleanable/oil/slippery, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/hall) +"Or" = ( +/obj/effect/mapping_helpers/damaged_window, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/delta/hall) "Os" = ( /obj/structure/door_assembly/door_assembly_eng, /turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/supermatter) -"Ot" = ( -/obj/effect/decal/cleanable/dirt, +"Ou" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/obj/machinery/button/door/directional/south{ - name = "Research Shutters Control"; - id = "oldstation_rnd" +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 1 }, -/obj/structure/table, -/obj/item/stock_parts/capacitor, -/obj/item/stock_parts/servo, -/obj/item/stock_parts/micro_laser, -/obj/item/stack/cable_coil, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/rnd) -"Ou" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/mapping_helpers/apc/no_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/mapping_helpers/apc/away_general_access, /obj/structure/cable, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating/airless, -/area/ruin/space/ancientstation/beta/hall) +/turf/open/floor/iron/white, +/area/ruin/space/ancientstation/delta/rnd) "Ox" = ( /turf/closed/wall, /area/ruin/space/ancientstation/charlie/storage) @@ -7095,24 +7043,16 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/rnd) -"OF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/mapping_helpers/apc/away_general_access, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/ruin/space/ancientstation/delta/rnd) -"OL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/away_general_access, +"OE" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) +/obj/structure/closet/l3closet/scientist, +/obj/machinery/light/small/directional/east{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/duct, +/turf/open/floor/iron/white/textured_large, +/area/ruin/space/ancientstation/delta/biolab) "OM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -7120,44 +7060,10 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) -"OP" = ( -/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/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/turf/open/floor/iron/white/textured_large, -/area/ruin/space/ancientstation/delta/biolab) "OQ" = ( /obj/structure/girder, /turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/medbay) -"OR" = ( -/obj/structure/alien/weeds, -/obj/structure/closet/crate/engineering{ - name = "camera assembly crate" - }, -/obj/item/wallframe/camera, -/obj/item/wallframe/camera, -/obj/item/wallframe/camera, -/obj/item/wallframe/camera, -/obj/item/wallframe/camera, -/obj/item/wallframe/camera, -/obj/item/wallframe/camera, -/obj/item/wallframe/camera, -/obj/item/wallframe/camera, -/obj/item/wallframe/camera, -/obj/item/stack/cable_coil, -/obj/item/wallframe/camera, -/obj/item/wallframe/camera, -/obj/item/wallframe/camera, -/obj/item/wallframe/camera, -/obj/item/wallframe/camera, -/obj/structure/window/reinforced/spawner, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/iron/dark, -/area/ruin/space/ancientstation/delta/ai) "OS" = ( /obj/machinery/air_sensor/nitrogen_tank{ chamber_id = "beta-n2" @@ -7187,6 +7093,12 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/sec) +"OX" = ( +/obj/structure/table/reinforced, +/obj/item/paper/fluff/ruins/oldstation/protosuit, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white/textured, +/area/ruin/space/ancientstation/delta/proto) "Pd" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -7204,13 +7116,12 @@ /turf/open/floor/iron/white/textured_large, /area/ruin/space/ancientstation/delta/biolab) "Pj" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/charlie/engie) +/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/space/ancientstation/beta/hall) "Pn" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light_switch/directional/west, @@ -7220,32 +7131,12 @@ /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/sec) "Po" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/old{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_machine, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/dorms) -"Pp" = ( -/obj/structure/table/glass, -/obj/structure/microscope{ - pixel_y = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/paper/fluff/ruins/oldstation/biolab_note_molly{ - pixel_y = -10; - pixel_x = 7 - }, -/obj/machinery/light/red/directional/west, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white/textured_edge{ +/obj/machinery/door/airlock/external/glass/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/area/ruin/space/ancientstation/delta/biolab) +/turf/open/floor/catwalk_floor, +/area/ruin/space/ancientstation/delta/hall) "Pq" = ( /obj/machinery/door/airlock/science, /obj/effect/decal/cleanable/dirt, @@ -7291,6 +7182,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) +"PB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 + }, +/obj/structure/sign/departments/chemistry/directional/north, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/hall) "PC" = ( /obj/machinery/door/airlock/security/glass, /obj/machinery/door/poddoor{ @@ -7309,14 +7212,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/bridge) -"PE" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/away_general_access, -/turf/open/floor/iron/diagonal, -/area/ruin/space/ancientstation/beta/gravity) "PG" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -7330,11 +7225,16 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/atmos) -"PI" = ( +"PH" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/stack/rods, -/turf/open/floor/plating/airless, -/area/ruin/space/ancientstation/beta/hall) +/obj/structure/curtain, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white/textured_edge{ + dir = 8 + }, +/area/ruin/space/ancientstation/delta/biolab) "PJ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -7345,16 +7245,6 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) -"PO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/machinery/recharger, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 8 - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/bridge) "PS" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7364,23 +7254,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/ruin/space/ancientstation/beta/hall) -"PT" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/catwalk_floor, -/area/ruin/space/ancientstation/beta/supermatter) -"PU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron/white, -/area/ruin/space/ancientstation/delta/rnd) -"Qa" = ( -/obj/structure/cable, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) +"PV" = ( +/turf/closed/mineral/diamond, +/area/space/nearstation) +"Qc" = ( +/obj/item/stack/rods, +/obj/effect/decal/cleanable/glass, +/obj/structure/broken_flooring/side/directional/south, +/turf/open/floor/plating/airless, +/area/ruin/space/ancientstation/beta/hall) +"Qg" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/charlie/dorms) "Qh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -7393,14 +7279,6 @@ /obj/structure/cable, /turf/open/floor/engine/airless, /area/ruin/space/ancientstation/beta/supermatter) -"Qk" = ( -/obj/effect/spawner/structure/window, -/obj/machinery/door/poddoor/shutters{ - dir = 8; - id = "oldstation_rnd" - }, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/delta/rnd) "Ql" = ( /obj/machinery/door/airlock, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ @@ -7412,14 +7290,13 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/ruin/space/ancientstation/charlie/hall) -"Qn" = ( +"Qp" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/item/stack/sheet/iron/fifty, -/obj/machinery/light/small/directional/east, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating/rust, -/area/ruin/space/ancientstation/delta/hall) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/rnd) "Qs" = ( /turf/closed/mineral/gibtonite, /area/space/nearstation) @@ -7430,30 +7307,31 @@ /obj/structure/lattice, /turf/template_noop, /area/space/nearstation) -"QE" = ( -/obj/effect/decal/cleanable/dirt, +"QF" = ( /obj/effect/decal/cleanable/dirt, +/obj/structure/table, /obj/structure/cable, -/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, +/obj/machinery/power/apc/auto_name/directional/west, /obj/effect/mapping_helpers/apc/no_charge, -/obj/machinery/duct, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 + }, /obj/effect/mapping_helpers/apc/unlocked, /obj/effect/mapping_helpers/apc/away_general_access, /turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) -"QI" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/catwalk_floor, -/area/ruin/space/ancientstation/beta/mining) +/area/ruin/space/ancientstation/charlie/sec) "QK" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/light_switch/directional/west, /turf/open/floor/plating, /area/ruin/space/ancientstation/charlie/hall) +"QL" = ( +/obj/effect/decal/cleanable/shreds, +/obj/structure/alien/weeds/node, +/obj/machinery/light/small/broken/directional/east, +/turf/open/floor/iron/dark, +/area/ruin/space/ancientstation/delta/ai) "QO" = ( /obj/structure/table/glass, /obj/item/reagent_containers/cup/bottle/aluminium{ @@ -7475,26 +7353,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) -"QS" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/bot/cleanbot/autopatrol{ - bot_mode_flags = 12; - name = "Ramboo"; - pixel_x = -2; - pixel_y = 5; - bot_cover_flags = 0 - }, -/turf/open/floor/plating{ - initial_gas_mix = "co2=6;o2=16;n2=82;TEMP=293.15" - }, -/area/ruin/space/ancientstation/delta/hall) "QT" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/machinery/power/energy_accumulator/tesla_coil, /turf/open/floor/engine/airless, /area/ruin/space/ancientstation/beta/supermatter) +"QV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/rnd) "QZ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7514,62 +7387,42 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/atmos) -"Rj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) -"Rl" = ( +"Rm" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/obj/machinery/iv_drip, +/obj/machinery/firealarm/directional/north, /turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/rnd) -"Rm" = ( +/area/ruin/space/ancientstation/delta/hall) +"Rv" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/obj/item/stack/rods, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/glass, +/obj/machinery/atmospherics/pipe/layer_manifold, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/mapping_helpers/apc/no_charge, /obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 + dir = 4 }, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/mapping_helpers/apc/away_general_access, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/atmos) -"Rp" = ( -/obj/machinery/smartfridge, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/broken_machine, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/kitchen) -"Rr" = ( +"Rx" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/mapping_helpers/airalarm/away_general_access, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 4 - }, -/obj/machinery/airalarm/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/mapping_helpers/apc/no_charge, +/obj/structure/cable, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/mapping_helpers/apc/away_general_access, /turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/bridge) +/area/ruin/space/ancientstation/charlie/engie) "RA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, /turf/open/floor/iron/white/textured, /area/ruin/space/ancientstation/delta/proto) -"RB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/shard{ - icon_state = "medium" - }, -/obj/structure/broken_flooring/side/directional/south, -/turf/open/floor/plating/airless, -/area/ruin/space/ancientstation/beta/hall) "RD" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -7582,43 +7435,44 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) -"RF" = ( +"RE" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/north, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/structure/cable, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/mapping_helpers/apc/away_general_access, -/turf/open/floor/iron/white/textured, -/area/ruin/space/ancientstation/delta/proto) -"RG" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/broken_flooring/corner/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, -/area/ruin/space/ancientstation/beta/hall) -"RH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/assembly/flash/handheld, -/obj/effect/turf_decal/tile/red/half/contrasted{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, -/obj/machinery/light/small/directional/east, +/obj/machinery/duct, +/obj/machinery/firealarm/directional/east, /turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/sec) +/area/ruin/space/ancientstation/delta/hall) +"RK" = ( +/obj/machinery/door/firedoor/closed, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/beta/hall) +"RN" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/charlie/hall) "RP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/sec) +"RR" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/beta/hall) +"RY" = ( +/obj/structure/rack, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/effect/spawner/random/maintenance/two, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/beta/hall) "Sb" = ( /obj/item/stack/rods/twentyfive, /obj/effect/decal/cleanable/dirt, @@ -7634,18 +7488,22 @@ /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) "Sf" = ( -/obj/machinery/door/airlock/science/glass, -/obj/machinery/door/firedoor, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/obj/structure/broken_flooring/side/directional/east, /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/space/ancientstation/delta/rnd) +/turf/open/floor/plating/airless, +/area/ruin/space/ancientstation/beta/hall) "Si" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/catwalk_floor, -/area/ruin/space/ancientstation/beta/supermatter) +/obj/structure/cable, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/hall) "Sk" = ( /turf/open/floor/engine/airless, /area/ruin/space/ancientstation/beta/supermatter) @@ -7662,12 +7520,26 @@ /obj/effect/turf_decal/tile/green/half/contrasted, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hydro) +"Ss" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/charlie/kitchen) "Sv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/duct, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/cafeteria, /area/ruin/space/ancientstation/charlie/kitchen) +"Sx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/bridge) "Sz" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/xenoblood/xgibs/larva/body, @@ -7690,17 +7562,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/rnd) -"SJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/highsecurity, -/obj/machinery/door/firedoor, -/obj/structure/alien/weeds, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "oldstation-aisat" - }, -/obj/effect/mapping_helpers/airlock/access/all/away/general, -/turf/open/floor/iron/dark, -/area/ruin/space/ancientstation/delta/hall) "SK" = ( /turf/closed/wall/rust, /area/ruin/space/ancientstation/beta/supermatter) @@ -7731,10 +7592,6 @@ /obj/item/reagent_containers/cup/soda_cans/dr_gibb, /turf/open/floor/iron/dark, /area/ruin/space/ancientstation/delta/ai) -"SS" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/charlie/hall) "ST" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -7746,32 +7603,41 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) +"SU" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/delta/biolab) +"SV" = ( +/obj/item/stack/rods, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/broken_flooring/pile/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless, +/area/ruin/space/ancientstation/beta/hall) "SZ" = ( /turf/closed/mineral/bscrystal, /area/space/nearstation) "Td" = ( /turf/closed/mineral/random, /area/ruin/space/ancientstation/beta/hall) -"Tg" = ( +"Tf" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/obj/structure/sign/poster/official/cleanliness/directional/north, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/ancientstation/charlie/kitchen) -"Th" = ( -/obj/structure/rack, -/obj/item/storage/bag/ore, -/obj/item/storage/bag/ore, -/obj/item/mining_scanner, -/obj/item/mining_scanner, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/charlie/engie) +"Tg" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/away_general_access, -/obj/effect/turf_decal/tile/brown/half/contrasted{ +/obj/structure/table, +/obj/machinery/recharger, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ dir = 8 }, +/obj/machinery/firealarm/directional/west, /turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/mining) +/area/ruin/space/ancientstation/charlie/bridge) "Ti" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -7786,10 +7652,6 @@ dir = 4 }, /area/ruin/space/ancientstation/delta/biolab) -"Tl" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/charlie/engie) "Tm" = ( /obj/machinery/power/port_gen/pacman/super{ name = "\improper emergency power generator" @@ -7799,15 +7661,23 @@ /obj/structure/sign/warning/electric_shock/directional/south, /turf/open/floor/plating, /area/ruin/space/ancientstation/charlie/storage) +"Tq" = ( +/obj/structure/alien/weeds, +/obj/machinery/light/small/broken/directional/east, +/turf/open/floor/iron/dark, +/area/ruin/space/ancientstation/delta/ai) "Tr" = ( -/obj/item/shard{ - icon_state = "medium" +/obj/structure/table/glass, +/obj/structure/closet/mini_fridge/grimy{ + pixel_y = 8; + pixel_x = 2 }, -/obj/effect/decal/cleanable/glass, -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/broken_flooring/pile/directional/north, -/turf/open/floor/plating/airless, -/area/ruin/space/ancientstation/beta/hall) +/obj/item/petri_dish/oldstation, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white/textured, +/area/ruin/space/ancientstation/delta/biolab) "Ts" = ( /obj/structure/closet/emcloset/anchored, /obj/effect/spawner/random/maintenance, @@ -7824,6 +7694,17 @@ "Tu" = ( /turf/open/floor/plating/rust, /area/ruin/space/ancientstation/beta/hall) +"Tw" = ( +/obj/machinery/door/firedoor/closed, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/beta/hall) "Tx" = ( /obj/structure/closet/radiation, /obj/item/clothing/suit/utility/radiation, @@ -7835,6 +7716,12 @@ /obj/machinery/light/small/broken/directional/north, /turf/open/floor/engine/airless, /area/ruin/space/ancientstation/beta/supermatter) +"TA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/hall) "TB" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ @@ -7845,12 +7732,14 @@ /turf/open/floor/engine/o2, /area/ruin/space/ancientstation/beta/atmos) "TD" = ( -/obj/machinery/shower/directional/south{ - has_water_reclaimer = 0 +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/obj/item/soap/nanotrasen, -/turf/open/floor/iron/white, -/area/ruin/space/ancientstation/charlie/hall) +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/away_general_access, +/turf/open/floor/iron/white/textured, +/area/ruin/space/ancientstation/delta/proto) "TI" = ( /obj/machinery/door/airlock/science, /obj/effect/decal/cleanable/dirt, @@ -7859,6 +7748,14 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) +"TL" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor{ + id = "ancient" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/charlie/sec) "TM" = ( /obj/machinery/conveyor_switch/oneway{ id = "beta" @@ -7867,21 +7764,6 @@ /obj/machinery/door/window/brigdoor/right/directional/east, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/mining) -"TN" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/away_general_access, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/hall) "TO" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/decal/cleanable/dirt, @@ -7890,20 +7772,11 @@ }, /turf/open/floor/engine, /area/ruin/space/ancientstation/delta/biolab) -"TW" = ( -/obj/structure/rack, +"TV" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/crowbar, -/obj/item/stock_parts/cell/high, -/obj/machinery/door/window/right/directional/east{ - dir = 1; - req_access = list("away_general") - }, -/obj/item/paper/fluff/ruins/oldstation/apc_note, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, -/obj/item/card/id/away/old/equipment, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/engie) +/obj/effect/spawner/random/maintenance/two, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/delta/hall) "TZ" = ( /obj/structure/table/glass, /obj/item/reagent_containers/cup/bottle/copper{ @@ -7922,12 +7795,12 @@ /obj/structure/cable, /turf/open/floor/iron/solarpanel/airless, /area/ruin/space/solars/ancientstation/charlie/solars) -"Ug" = ( -/obj/item/kirbyplants/random/dead, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, +"Ui" = ( +/obj/machinery/door/airlock/external/glass/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/catwalk_floor, /area/ruin/space/ancientstation/delta/hall) "Uj" = ( /obj/structure/girder, @@ -7943,6 +7816,12 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/supermatter) +"Un" = ( +/obj/item/stack/rods, +/obj/effect/decal/cleanable/dirt, +/obj/structure/broken_flooring/pile/directional/south, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/charlie/dorms) "Uo" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -7955,49 +7834,64 @@ /obj/item/circuitboard/machine/sleeper, /turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/medbay) +"Uq" = ( +/obj/machinery/shower/directional/south{ + has_water_reclaimer = 0 + }, +/obj/item/soap/nanotrasen, +/turf/open/floor/iron/white, +/area/ruin/space/ancientstation/charlie/hall) +"Us" = ( +/turf/open/floor/catwalk_floor, +/area/ruin/space/ancientstation/beta/mining) "Uu" = ( /turf/closed/mineral/plasma, /area/space/nearstation) -"Uw" = ( -/obj/machinery/door/airlock/science/glass, -/obj/machinery/door/firedoor, +"UA" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/rnd) -"Uy" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/rust, +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/light/broken/directional/west, +/turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) -"UC" = ( -/turf/open/floor/catwalk_floor, -/area/ruin/space/ancientstation/beta/mining) -"UF" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/portable_atmospherics/scrubber, -/obj/machinery/atmospherics/components/unary/portables_connector/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red/half/contrasted, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +"UH" = ( +/obj/item/chair{ + pixel_y = -8; + pixel_x = 13 }, -/turf/open/floor/iron/airless, -/area/ruin/space/ancientstation/beta/hall) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white/textured_large, +/area/ruin/space/ancientstation/delta/biolab) "UI" = ( /turf/closed/mineral/random, /area/ruin/space/ancientstation/beta/gravity) "UJ" = ( /turf/open/floor/iron/white/textured, /area/ruin/space/ancientstation/delta/proto) +"UN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/engine/airless, +/area/ruin/space/ancientstation/beta/supermatter) "UP" = ( /turf/closed/mineral/random, /area/space/nearstation) "UR" = ( +/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/structure/closet, -/obj/effect/spawner/random/maintenance/three, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/delta/hall) +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/turf/open/floor/iron/white/textured_large, +/area/ruin/space/ancientstation/delta/biolab) +"UU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/stack/rods, +/obj/machinery/light/small/broken/directional/east, +/turf/open/floor/plating/airless, +/area/ruin/space/ancientstation/beta/hall) "UV" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -8014,16 +7908,24 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/atmos) +"UY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 8 + }, +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/away_general_access, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/hall) "Vb" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/emcloset/anchored, /turf/open/floor/plating, /area/ruin/space/ancientstation/delta/hall) -"Vd" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/effect/mapping_helpers/damaged_window, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/charlie/hall) "Vk" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -8034,55 +7936,58 @@ "Vl" = ( /turf/closed/wall, /area/ruin/space/ancientstation/beta/supermatter) -"Vm" = ( -/obj/effect/spawner/structure/window, -/obj/effect/mapping_helpers/damaged_window, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/beta/medbay) "Vp" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/griddle, /turf/open/floor/iron/cafeteria, /area/ruin/space/ancientstation/charlie/kitchen) -"Vs" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/mapping_helpers/apc/away_general_access, -/turf/open/floor/iron/diagonal, -/area/ruin/space/ancientstation/beta/gravity) -"Vv" = ( -/obj/machinery/door/firedoor/closed, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/hall) "Vw" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/iron/diagonal, /area/ruin/space/ancientstation/beta/gravity) -"VG" = ( +"Vy" = ( +/obj/machinery/light/small/directional/west, +/obj/effect/spawner/random/trash/moisture_trap, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/beta/hall) +"Vz" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor{ + id = "ancient" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/charlie/engie) +"VD" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/damaged_window, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/charlie/sec) +"VE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron/white, +/area/ruin/space/ancientstation/delta/rnd) +"VF" = ( +/obj/structure/closet/crate/bin, +/obj/machinery/light/small/broken/directional/west, +/obj/effect/spawner/random/trash/garbage, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/garbage, +/turf/open/floor/iron/airless, +/area/ruin/space/ancientstation/beta/hall) +"VS" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate/bin, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 }, /obj/effect/spawner/random/trash/garbage, /obj/effect/spawner/random/trash/garbage, /turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/bridge) +/area/ruin/space/ancientstation/charlie/sec) "VT" = ( /obj/effect/decal/cleanable/dirt, /obj/item/shard/plasma{ @@ -8090,6 +7995,11 @@ }, /turf/open/floor/engine/airless, /area/ruin/space/ancientstation/beta/supermatter) +"VU" = ( +/obj/machinery/door/airlock/external/glass/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/catwalk_floor, +/area/ruin/space/ancientstation/beta/mining) "VV" = ( /turf/open/floor/plating, /area/ruin/space/ancientstation/delta/hall) @@ -8097,6 +8007,15 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/engine, /area/ruin/space/ancientstation/delta/biolab) +"Wa" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/door/airlock/external/glass/ruin, +/turf/open/floor/catwalk_floor, +/area/ruin/space/ancientstation/charlie/engie) "Wd" = ( /obj/effect/decal/cleanable/blood/xtracks{ dir = 5 @@ -8108,12 +8027,6 @@ initial_gas_mix = "TEMP=2.7" }, /area/ruin/space/ancientstation/beta/supermatter) -"Wl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/away_general_access, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/engie) "Wm" = ( /obj/structure/lattice/catwalk, /turf/template_noop, @@ -8135,35 +8048,22 @@ /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/atmos) "Wq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/mapping_helpers/apc/away_general_access, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/mining) +/turf/open/floor/plating, +/area/ruin/space/ancientstation/beta/hall) "Wu" = ( /obj/machinery/duct, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/cafeteria, /area/ruin/space/ancientstation/charlie/kitchen) -"Wv" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/away_general_access, -/obj/structure/table_frame, +"Wx" = ( +/obj/effect/decal/cleanable/dirt, /obj/item/shard{ icon_state = "medium" }, -/obj/item/defibrillator, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/obj/effect/mapping_helpers/airalarm/unlocked, -/turf/open/floor/iron/airless, -/area/ruin/space/ancientstation/beta/medbay) +/obj/structure/broken_flooring/side/directional/south, +/turf/open/floor/plating/airless, +/area/ruin/space/ancientstation/beta/hall) "WA" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -8174,23 +8074,15 @@ /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/engie) "WG" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 10 - }, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) -"WH" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/tracks, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, /obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/mapping_helpers/apc/away_general_access, /turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/hall) +/area/ruin/space/ancientstation/delta/hall) "WI" = ( /turf/closed/wall/rust, /area/ruin/space/ancientstation/beta/mining) @@ -8201,73 +8093,98 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/ruin/space/ancientstation/beta/supermatter) -"WL" = ( +"WN" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/effect/spawner/random/food_or_drink/snack, -/obj/effect/turf_decal/tile/red/half/contrasted{ +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible/layer4, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/beta/atmos) +"WR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/hall) +"WV" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/delta/rnd) +"WW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, -/obj/machinery/light/small/directional/east, /turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/sec) -"WU" = ( +/area/ruin/space/ancientstation/charlie/hall) +"WZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/white, +/area/ruin/space/ancientstation/charlie/hall) +"Xd" = ( +/obj/effect/decal/cleanable/glass, +/turf/open/floor/engine/airless, +/area/ruin/space/ancientstation/beta/supermatter) +"Xj" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 10 - }, +/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, +/obj/effect/mapping_helpers/apc/no_charge, +/obj/machinery/duct, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/mapping_helpers/apc/away_general_access, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) -"WW" = ( +"Xk" = ( +/obj/effect/spawner/structure/window, +/obj/effect/mapping_helpers/damaged_window, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/beta/medbay) +"Xn" = ( +/obj/machinery/light_switch/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/directional/north, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/mapping_helpers/apc/no_charge, +/obj/structure/cable, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/mapping_helpers/apc/away_general_access, +/turf/open/floor/iron/white/textured, +/area/ruin/space/ancientstation/delta/proto) +"Xs" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/hall) -"Xd" = ( -/obj/effect/decal/cleanable/glass, -/turf/open/floor/engine/airless, -/area/ruin/space/ancientstation/beta/supermatter) -"Xg" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 +/obj/structure/transit_tube/station/reverse/flipped{ + dir = 1 }, -/turf/open/floor/catwalk_floor, -/area/ruin/space/ancientstation/delta/hall) -"Xl" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/away_general_access, -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2{ - dir = 5 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 6 }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 10 }, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/atmos) +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/charlie/hall) "Xt" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/diagonal, /area/ruin/space/ancientstation/beta/gravity) -"Xw" = ( -/obj/item/shard, -/obj/item/stack/rods, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/obj/structure/broken_flooring/corner/directional/east, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/charlie/dorms) "Xx" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/effect/mapping_helpers/damaged_window, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/charlie/sec) +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 10 + }, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/hall) "Xy" = ( /obj/structure/alien/egg/burst, /obj/effect/decal/cleanable/insectguts, @@ -8282,6 +8199,14 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/engine/n2, /area/ruin/space/ancientstation/beta/atmos) +"XB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/beta/atmos) "XD" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Custodial Closet" @@ -8291,53 +8216,62 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) -"XE" = ( -/obj/item/stack/rods, -/obj/effect/decal/cleanable/glass, -/obj/structure/broken_flooring/side/directional/south, -/turf/open/floor/plating/airless, -/area/ruin/space/ancientstation/beta/hall) -"XF" = ( -/obj/effect/decal/cleanable/dirt, -/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/space/ancientstation/beta/hall) "XJ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/plating, /area/ruin/space/ancientstation/charlie/engie) +"XK" = ( +/obj/machinery/door/airlock/atmos/glass{ + name = "Station Atmospherics" + }, +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible/layer4, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/beta/atmos) +"XM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/mapping_helpers/airalarm/away_general_access, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/hall) "XN" = ( /obj/structure/sign/poster/contraband/space_cola, /obj/structure/sign/poster/contraband/space_cola, /turf/closed/wall, /area/ruin/space/ancientstation/charlie/sec) "XO" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/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{ + dir = 8 }, -/turf/open/floor/catwalk_floor, -/area/ruin/space/ancientstation/beta/mining) -"XR" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/delta/biolab) +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/away_general_access, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/hall) "XV" = ( /obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/layer_manifold, -/obj/machinery/power/apc/auto_name/directional/east, +/obj/machinery/power/apc/auto_name/directional/north, /obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, /obj/effect/mapping_helpers/apc/unlocked, /obj/effect/mapping_helpers/apc/away_general_access, /turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/atmos) +/area/ruin/space/ancientstation/beta/hall) "XW" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -8369,20 +8303,15 @@ }, /turf/open/floor/iron/cafeteria, /area/ruin/space/ancientstation/charlie/kitchen) -"Yd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/gun/energy/laser/retro/old{ - pixel_x = -2; - pixel_y = -2 - }, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/away_general_access, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 8 +"Yf" = ( +/obj/structure/chair{ + dir = 1 }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm/directional/south, /turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/sec) +/area/ruin/space/ancientstation/delta/rnd) "Yh" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -8397,6 +8326,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/ruin/space/ancientstation/charlie/engie) +"Yk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/north, +/obj/structure/sign/poster/official/cleanliness/directional/north, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/ancientstation/charlie/kitchen) "Yl" = ( /obj/machinery/door/window/right/directional/east{ req_access = list("away_general") @@ -8404,14 +8339,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/engine, /area/ruin/space/ancientstation/delta/biolab) -"Yo" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor{ - id = "ancient" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/charlie/engie) +"Ym" = ( +/obj/structure/alien/weeds, +/obj/effect/gibspawner/human, +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/iron/dark, +/area/ruin/space/ancientstation/delta/ai) "Yp" = ( /turf/closed/mineral/plasma, /area/ruin/space/ancientstation/beta/atmos) @@ -8433,6 +8366,13 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) +"Ys" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/hall) "Yv" = ( /obj/structure/transit_tube/crossing/horizontal, /obj/structure/lattice/catwalk, @@ -8446,20 +8386,31 @@ /obj/machinery/duct, /turf/template_noop, /area/space/nearstation) +"Yx" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/broken_bottle, +/obj/item/soap/nanotrasen, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/rnd) "Yy" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/rust, /area/ruin/space/ancientstation/charlie/hall) -"YC" = ( +"YD" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 6 }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 10 }, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/rnd) +/obj/structure/cable, +/obj/structure/broken_flooring/pile/directional/north, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/charlie/hall) "YF" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/computer/old, @@ -8468,20 +8419,18 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/bridge) -"YG" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/hall) "YH" = ( /obj/structure/lattice, /obj/item/stack/rods, /turf/template_noop, /area/space/nearstation) +"YI" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/light{ + state = 1 + }, +/area/ruin/space/ancientstation/charlie/bridge) "YJ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -8497,34 +8446,43 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/engie) -"YQ" = ( -/obj/item/stack/rods, -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/broken_flooring/pile/directional/south, +"YP" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/white, +/area/ruin/space/ancientstation/delta/rnd) +"YR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/binary/pump/layer2{ + dir = 1 + }, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/iron/airless, /area/ruin/space/ancientstation/beta/hall) "YS" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/effect/mapping_helpers/damaged_window, -/turf/open/floor/plating/airless, -/area/ruin/space/ancientstation/beta/supermatter) +/obj/structure/alien/weeds, +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/tracks, +/obj/machinery/light/small/broken/directional/east, +/turf/open/floor/iron/dark, +/area/ruin/space/ancientstation/delta/ai) "YW" = ( /turf/open/floor/iron/textured_half, /area/ruin/space/ancientstation/beta/supermatter) +"YX" = ( +/obj/machinery/atmospherics/components/binary/pump/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/structure/broken_flooring/corner/directional/north, +/turf/open/floor/plating/airless, +/area/ruin/space/ancientstation/beta/hall) "YZ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/ruin/space/ancientstation/charlie/hall) -"Za" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants/random/dead, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/hall) "Zb" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/computer/old, @@ -8532,81 +8490,51 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/bridge) -"Zd" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/structure/broken_flooring/side/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, -/area/ruin/space/ancientstation/beta/hall) "Ze" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /turf/open/floor/engine/n2, /area/ruin/space/ancientstation/beta/atmos) +"Zf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/broken_flooring/side/directional/north, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/charlie/hall) "Zg" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2{ dir = 4 }, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/beta/atmos) -"Zh" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/machinery/portable_atmospherics/pump, -/obj/machinery/atmospherics/components/unary/portables_connector/layer4{ - dir = 1 +/turf/open/floor/plating, +/area/ruin/space/ancientstation/beta/atmos) +"Zj" = ( +/obj/structure/sign/poster/contraband/lamarr, +/turf/closed/wall, +/area/ruin/space/ancientstation/delta/biolab) +"Zl" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/light{ + state = 2 + }, +/area/ruin/space/ancientstation/charlie/bridge) +"Zq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 }, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 }, -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/away_general_access, -/turf/open/floor/iron/airless, -/area/ruin/space/ancientstation/beta/hall) -"Zj" = ( +/obj/structure/broken_flooring/side/directional/north, /obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/white, -/area/ruin/space/ancientstation/charlie/hall) -"Zn" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/beta/mining) +/turf/open/floor/plating/airless, +/area/ruin/space/ancientstation/beta/hall) "Zt" = ( /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/rnd) -"Zv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/engie) -"Zw" = ( -/obj/structure/closet/crate/bin, -/obj/effect/decal/cleanable/dirt, -/obj/item/paper/crumpled, -/obj/item/ph_booklet, -/obj/effect/turf_decal/tile/purple/half/contrasted, -/obj/machinery/firealarm/directional/south, -/obj/item/trash/bee, -/obj/effect/spawner/random/trash/bacteria, -/turf/open/floor/iron/white/textured_edge{ - dir = 1 - }, -/area/ruin/space/ancientstation/delta/biolab) -"Zz" = ( +"ZC" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/away_general_access, +/obj/machinery/light/directional/east, /turf/open/floor/iron/white, /area/ruin/space/ancientstation/delta/rnd) "ZD" = ( @@ -8633,6 +8561,44 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) +"ZP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/decal/cleanable/glass, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 + }, +/obj/item/shard{ + icon_state = "small" + }, +/turf/open/floor/plating/airless, +/area/ruin/space/ancientstation/beta/hall) +"ZW" = ( +/obj/structure/alien/weeds, +/obj/structure/closet/crate/engineering{ + name = "camera assembly crate" + }, +/obj/item/wallframe/camera, +/obj/item/wallframe/camera, +/obj/item/wallframe/camera, +/obj/item/wallframe/camera, +/obj/item/wallframe/camera, +/obj/item/wallframe/camera, +/obj/item/wallframe/camera, +/obj/item/wallframe/camera, +/obj/item/wallframe/camera, +/obj/item/wallframe/camera, +/obj/item/stack/cable_coil, +/obj/item/wallframe/camera, +/obj/item/wallframe/camera, +/obj/item/wallframe/camera, +/obj/item/wallframe/camera, +/obj/item/wallframe/camera, +/obj/structure/window/reinforced/spawner, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/iron/dark, +/area/ruin/space/ancientstation/delta/ai) "ZZ" = ( /obj/structure/transit_tube{ dir = 4; @@ -9920,8 +9886,8 @@ ab UP UP Td -mx -hc +KH +pD AK AK AK @@ -9941,7 +9907,7 @@ bJ mH mH PG -Fq +wJ Rf mH mH @@ -9986,11 +9952,11 @@ UP UP UP Uj -NV -NO +gV +Zq AK -qS -Wv +zi +NP NB oE nC @@ -10003,17 +9969,17 @@ Uu SZ Uu Yp -hf -Ct +Gb +XB Ln kK Ln ny nz -Xl +fR nB nK -EV +DC mH aa aa @@ -10050,16 +10016,16 @@ sA sA UP UP -Lg +PV jE -or -Vv +RK +Tw AK Up bq oB oF -xd +KA lW YH Jg @@ -10069,11 +10035,11 @@ UP Uu Uu Yp -GG -Rm -Oo -HM -XV +cM +JX +WN +pq +Rv Ab nA UW @@ -10118,10 +10084,10 @@ sA sA sA sA -jS +zC je Ck -GC +Cr dD kb eH @@ -10136,8 +10102,8 @@ UP UP Yp mH -IY -wU +XK +CC mH mH kX @@ -10180,17 +10146,17 @@ Xt Xt MY JU -dz -PE +rP +Kd KV sA zJ mY AK Ck -FO +yc iy -Vm +Xk Ck OQ Bz @@ -10201,10 +10167,10 @@ gJ Ax Ax kQ -Bp -Zd Cj -tl +Sf +Cj +VF mH ko kB @@ -10256,21 +10222,21 @@ gi EW gi Iy -XF -CE -RG +Pj +HE +xT oM -fZ -rE +MV +KX oQ oS oV -YQ -Ou -AS -DT -Ml -Zh +SV +vq +ZP +me +YX +ND bJ TB Kf @@ -10312,31 +10278,31 @@ Xt Xt yS Fr -dz -Vs +rP +xx CR sA zJ mY -As +Ei nf zJ zJ mW -MI +oR Cj fY -RB -FF +Wx +cT Kw -XE -Tr +Qc +yw oZ -dm -PI -AY -uM -UF +rf +UU +mp +YR +iR bJ CU Lh @@ -10391,7 +10357,7 @@ SK SK Vl Vl -sz +cx SK Os Lm @@ -10400,7 +10366,7 @@ SK Df SK jE -IW +HG gJ kQ bJ @@ -10456,25 +10422,25 @@ Dk WJ Nh Vl -we +eV Hj -eZ +rJ uw wn BP -KZ -vH +Im +UN SK Jg Jg Jg Jg bJ -wk -wk +wm +wm qF -wk -wk +wm +wm bJ aa aa @@ -10514,14 +10480,14 @@ UP UP UP kQ -WH +XV mS Vl ES NU hw NU -uN +xY rR VT YJ @@ -10529,11 +10495,11 @@ Hj vY Sk wo -re +GJ Vl -sz -sz -YS +cx +cx +tm Jg Jg aa @@ -10587,7 +10553,7 @@ ES NU YW NU -uN +xY lI CN DK @@ -10596,10 +10562,10 @@ Qi ZD Hj Hj -Si -ne -ne -PT +qx +NC +NC +mP Jg aa aa @@ -10651,7 +10617,7 @@ mV Vl rc Ls -rz +IU eb Vl Tx @@ -10663,9 +10629,9 @@ Ms xH JL Vl -YS -YS -YS +tm +tm +tm Jg aa aa @@ -10782,8 +10748,8 @@ Cq dM jE Ts -sT -pu +Jw +Vy FK sP Vl @@ -10843,17 +10809,17 @@ Jg aa aa aa -LY +RR mW mV GK Tu Yq -Ih +Wq Tu tv Vl -yd +nU Fz Hj sR @@ -10908,12 +10874,12 @@ ga ga ga ga -Zn +Hf WI mW mV jE -pI +RY ux Tu Ix @@ -10970,27 +10936,27 @@ aa aa aa aa -Zn +Hf jV -Th -mL -tL +ci +ur +pP WI mW mS kQ jE jE -LY -LY +RR +RR kQ Vl -sz -sz -sz +cx +cx +cx Vl -YS -YS +tm +tm rm rm Jg @@ -11036,15 +11002,15 @@ aa aa aa aa -Zn +Hf lk mG AZ -Wq +tc ga mX nc -LY +RR aa aa aa @@ -11099,18 +11065,18 @@ aa aa aa aa -Zn -Zn -Zn +Hf +Hf +Hf ga mt AZ fS mR -Zn +Hf zJ mS -LY +RR aa aa aa @@ -11165,10 +11131,10 @@ aa aa aa aa -QI -UC -UC -XO +VU +Us +Us +dj mB mG cm @@ -11176,7 +11142,7 @@ gh mM gi mZ -LY +RR aa aa aa @@ -11231,18 +11197,18 @@ aa aa aa aa -Zn -Zn -Zn +Hf +Hf +Hf ga qh AZ -Kg +bG mT -Zn +Hf zJ mS -LY +RR aa aa aa @@ -11300,7 +11266,7 @@ aa aa aa aa -Zn +Hf mD TM mO @@ -11308,7 +11274,7 @@ mU WI uR uB -LY +RR aa aa aa @@ -11366,23 +11332,23 @@ aa aa aa aa -Zn -mA +Hf mA +sZ mE mK WI zJ -TN +qo kQ aa aa aa aa aa -bG -bW -bG +Ma +qQ +Ma aa JB aa @@ -11436,19 +11402,19 @@ ga ga ga ga -Zn +Hf ga -yY -mS +zJ +Bv jE aa aa aa aa aa -bG -vl -bG +Ma +wR +Ma aa JB aa @@ -11512,9 +11478,9 @@ aa aa aa aa -bG -vl -bG +Ma +wR +Ma aa aa aa @@ -11569,22 +11535,22 @@ aa aa aa aa -LY +RR mW mV jE aa -bG -bG +Ma +Ma eI -bG +Ma eI -xx +Wa eI -bG +Ma eI -bG -bG +Ma +Ma aa Jg aa @@ -11635,22 +11601,22 @@ aa aa aa aa -LY +RR mW mS jE aa -bG +Ma By eK fc Wn -Pj +Tf YM hl -Ew +lo id -bG +Ma aa Jg aa @@ -11701,17 +11667,17 @@ aa aa aa aa -LY +RR mW mS -nh +jE dl eI -DG +lz ju hm Yi -Tl +Gt Yi hm em @@ -11767,7 +11733,7 @@ aa aa aa aa -LY +RR mW mS kQ @@ -11833,7 +11799,7 @@ aa aa aa aa -LY +RR zJ mY kQ @@ -11904,20 +11870,20 @@ zJ mY kQ lJ -Wl +oP en -Zv -Dy +zZ +zX el kJ WA ho -Ir +pF Cc -tP -TW +Rx +hf Ox -tF +FN fI ie Ox @@ -11975,7 +11941,7 @@ dl dl eI fG -Yo +Vz yu gX eI @@ -12107,7 +12073,7 @@ UV eP fh cP -cS +UY tz fh UV @@ -12120,7 +12086,7 @@ NE JJ XZ Ga -FG +HL yk hT aT @@ -12156,7 +12122,7 @@ aa aa aa aa -kz +NW as as as @@ -12168,19 +12134,19 @@ FV jJ bZ ey -kF +Mr eo -kF +Mr cQ ey gI gI gY -yH +Ss ii -yH +Ss gI -wQ +oX jJ Om aG @@ -12221,13 +12187,13 @@ aa aa aa aa -kz -kz -uS +NW +NW +hZ YF aV YF -nO +Sx ak ak bR @@ -12237,11 +12203,11 @@ cQ IB qc eQ -IH -tM +rn +lb gI hr -Hv +rq Ja JK Lp @@ -12254,7 +12220,7 @@ nk mz gZ kN -qt +Mt mz nk nk @@ -12288,18 +12254,18 @@ aa aa aa aS -pb +wl bg aQ aI ba bk -PO +Tg by bS jJ -kF -dn +Mr +CP do qc Vk @@ -12312,17 +12278,17 @@ EP Uo ht Ne -yH +Ss jJ lC aG -xX +DB bN bN bN pi pk -Hz +tF aG UP UP @@ -12353,7 +12319,7 @@ aa aa aa aa -kz +NW at bi bi @@ -12361,10 +12327,10 @@ cl aI aI bt -qE +Zl FV jJ -kF +Mr dp dR dR @@ -12378,17 +12344,17 @@ eg ht ly iI -yH +Ss jJ cq -MX +Qg bN ln bN kO bN lr -Xw +uX mc UP tC @@ -12419,41 +12385,41 @@ aa aa aa aa -kz +NW PD aJ bi dc aI aI -VG -Bb +ww +YI FV jJ -kF +Mr dp dR ep eR dR Sr -yH +Ss Ya ht Vp ht ht iJ -yH +Ss jJ wz -MX +Qg bN bN bN bN bN -uf +AH mc mc UP @@ -12485,7 +12451,7 @@ aa aa aa aa -kz +NW Zb aK bi @@ -12496,7 +12462,7 @@ bz dL UV cp -kF +Mr dq dR eq @@ -12510,7 +12476,7 @@ Ae ht tZ ht -yH +Ss jm jI jU @@ -12520,7 +12486,7 @@ Aa kP bT kp -Fm +Un mc UP Uu @@ -12551,7 +12517,7 @@ aa aa aa aa -kz +NW PD aL aI @@ -12559,34 +12525,34 @@ ei aI aI bm -qE +Zl zy OT -kF +Mr dp dR er jX dR Sr -Rp +dz fi Bq GN ht ht iK -yH +Ss jJ FV -MX +Qg Fv bN kE bN pj bN -Cg +El nk UP UP @@ -12617,7 +12583,7 @@ aa aa aa aa -kz +NW ax aI aI @@ -12625,27 +12591,27 @@ eL aI aI bu -qE +Zl cq OT -kF +Mr dp dR dR dQ dR wO -pw -Tg +gY +Yk lx ht ht EB ye -yH +Ss jJ FV -MX +Qg Fv kr bN @@ -12653,7 +12619,7 @@ ln bN kp pk -EY +DX aa UP UP @@ -12684,18 +12650,18 @@ aa aa aa aS -zF +AA ax aW aI aQ bm -Gt +qr aS bS fQ -kF -xg +Mr +oz dr gE dO @@ -12708,11 +12674,11 @@ Wu KK Ip iN -yH +Ss jJ jH nk -EI +vD bN bN bN @@ -12749,9 +12715,9 @@ aa aa aa aa -kz -kz -Rr +NW +NW +nO hV aX hV @@ -12765,11 +12731,11 @@ cQ lH hI eS -Jr +Ol lU gY -ru -KA +Ku +FY ht Sv Fd @@ -12780,9 +12746,9 @@ bU aG nk ks -IF +uS jB -Po +Kk jP aG nk @@ -12816,7 +12782,7 @@ aa aa aa aa -kz +NW as as as @@ -12828,19 +12794,19 @@ FV OT WW cQ -kF +Mr vn -kF +Mr cQ cQ gY gI gI -yH +Ss BJ -yH +Ss gY -Za +zr jJ cq aG @@ -12884,11 +12850,11 @@ aa aa aa aT -TD -DN -Zj -EN -sI +Uq +xz +WZ +Gf +hn Ql zw Hp @@ -12899,7 +12865,7 @@ dt dt fn fJ -LX +XO up iC Qh @@ -12911,7 +12877,7 @@ Bt gW kY QK -MJ +Bd Yy aY la @@ -12951,10 +12917,10 @@ aa aa aT aT -bc -HE -AA -ry +hi +mg +Lw +Fa hi Mf KM @@ -13031,7 +12997,7 @@ eJ dv fp fK -zs +TL PC eJ eJ @@ -13089,10 +13055,10 @@ aa Al cK cK -EQ -an +YD +gg eJ -FJ +QF et eU et @@ -13100,9 +13066,9 @@ fL gB ha Pn -Ny +Bp hz -Yd +sw eJ cW ia @@ -13155,8 +13121,8 @@ Al Al cK cK -IQ -zO +Xs +Zf eJ XX eu @@ -13221,8 +13187,8 @@ Al Al bO cK -ll -Vd +xF +LV eJ dU ev @@ -13236,9 +13202,9 @@ eu ik iB eJ -SS -MU -SS +RN +ED +RN aT aa aa @@ -13356,17 +13322,17 @@ ZZ HK aa aa -Xx +VD ex -RH -wM +uT +VS fO fO fO fO -WL +xi im -rw +KT aa aa HQ @@ -13422,17 +13388,17 @@ aa Ar ZZ aa -Xx -Xx +VD +VD eJ -rw +KT eJ -rw +KT eJ -rw +KT dv -rw -rw +KT +KT aa aa HQ @@ -13485,7 +13451,7 @@ aa aa ZZ aa -qz +zS aa aa aa @@ -13748,25 +13714,25 @@ aa aa aa bE -MD -DE -MD +Ds +tH +Ds bE bE zL UP bE bE -Xg +Po bE bE -ug -Aw +hF +LK bE bE -Aw -LD -Aw +LK +tB +LK bE aa aa @@ -13818,17 +13784,17 @@ si cw En bE -Hg +DM Fo Hr -rb +cs Gz -cV +Ni bE Ac -xR +TV dh -zQ +vv bE IP jq @@ -13887,12 +13853,12 @@ Gz Lx LH Bu -QS +Ej Gz -Dh +JR Gz Ac -Uy +Ik VV Gr Gz @@ -13955,7 +13921,7 @@ XD Gz Gz bE -Lq +Ui Gz bE Gz @@ -14012,26 +13978,26 @@ aa aa aa aa -dj +cR FR cA -dw -OL +qM +UA MS EE -ft +cD Dg cD yq -ft -bf +cD +TA oU -jk -dw +Ys +qM cD jr -Ug -dj +pc +cR aa ab aa @@ -14078,26 +14044,26 @@ aa aa aa aa -dj +cR Au EX dx -LV +Jz dX eX dX oL -QE +Xj vU vU -Fu +uO vU JT -bv +RE JT xs cD -dj +cR aa aa aa @@ -14145,20 +14111,20 @@ aa aa aa bE -Jn +Cl oc wx wx -Qk +tW wx -Qk +tW bD bD bD bD bD -Qk -Qk +tW +tW bD bD da @@ -14211,19 +14177,19 @@ aa aa aa Gz -WU +wp Ao wx -AR +Ou kw -OF +Hk kw -KT -EJ -Nk -Iz +iq +lh +WV +ob hY -BI +Yx iD iP wx @@ -14231,9 +14197,9 @@ ST cD uj kd -kt +OX uj -kR +ij kZ uj aa @@ -14267,7 +14233,7 @@ ad ad ag aM -Gy +NS bh cz cz @@ -14277,21 +14243,21 @@ ad aa aa Gz -EU +AC Ao bD -kw +zf eF -vx +NQ gG nN oe -Nk +WV ca hY io iE -iP +Yf wx mq mi @@ -14332,41 +14298,41 @@ aa ad af ag -aB +qL ag ag ag -cG +QL cZ SQ ad aa ab bE -WU -ov +wp +Lc wx -jF +BN fa -Mp +hh gM oH of -Nk +WV ca dY jL Zt -xl +pV bD mr cD uj -RF +Xn SF kI SF -kv +SF uj Jg Jg @@ -14406,19 +14372,19 @@ ad ad ad ad -pA -pA +Or +Or bE -WG -xW +Xx +CZ wx -gx +CA kw -yN +jk lF hS -JX -Nk +ze +WV ca SI ip @@ -14433,7 +14399,7 @@ UJ tf UJ cE -uA +Gv Jg aa aa @@ -14471,16 +14437,16 @@ ag ag db aq -uE +Bb df df -SJ -eY -Gx -zz +tS +qt +zt +JF Eg -HB -Fa +jL +Qp ca jL ca @@ -14490,7 +14456,7 @@ ea NZ ca mo -Uw +IC ST Dg Iu @@ -14499,7 +14465,7 @@ UJ RA sk wt -uA +Gv aa aa aa @@ -14530,20 +14496,20 @@ aa ad ag ap -aC +Tq dd ao -jD -hL +MJ +YS ld lZ -MK +kl nL nL -jG -YG -Rj -HF +DI +Eh +KF +nI SM yF mI @@ -14551,12 +14517,12 @@ nS nS nS ol -Ju -zZ +LY +LX ir -ac +uv Ke -Sf +yG QR wC Hl @@ -14565,7 +14531,7 @@ ki qf kS cJ -uA +Gv aa aa aa @@ -14604,18 +14570,18 @@ ad ad ad ad -Aw -Aw +LK +LK Gz -qQ +Ie Ao wx -Is +YP oD og lF iq -Ot +HC wx wx wx @@ -14623,15 +14589,15 @@ Ps bD bD bD -EG +PB cD uj -Ad +LC UJ Pu kS cE -uA +Gv Jg aa aa @@ -14662,11 +14628,11 @@ aa ad aH ao -aD +FJ dB ag ai -jC +gx aq aN ad @@ -14674,25 +14640,25 @@ aa aa bE oq -IL +wr bD -PU +VE fu hE gP kw -BN +LS wx QO -kT +QV OA -YC +iX LM wx -oa +wP cD uj -tI +TD lG bV Ic @@ -14739,7 +14705,7 @@ ad aa aa bE -dT +Rm Ao bD kw @@ -14747,16 +14713,16 @@ fv lF gQ kw -Rl +Oa wx -LL +Kb ca eW ca vS -Nu +Is IV -ix +Fw uj ke ky @@ -14808,11 +14774,11 @@ bE En Ao bD -hn +GY kw -Zz +ZC kw -jW +hS sJ wx TZ @@ -14825,9 +14791,9 @@ Yr cD uj mm -KG +Oh uj -kU +Mx lc uj aa @@ -14875,9 +14841,9 @@ dV Pq bD wx -cc +FX bD -cc +FX bD wx bD @@ -14936,7 +14902,7 @@ ai ad aa aa -dj +cR En PJ NY @@ -14948,14 +14914,14 @@ OM vU QR QR -fW +Nx Px -QR +ql QR nX ZJ cD -dj +cR aa aa aa @@ -14992,36 +14958,36 @@ aa ad ao ag -aC +Tq aN ag ai -GQ +fw ag -Dz +Ym ad aa aa -dj +cR ou En -pD -GT +XM +vJ gD nP -oK +WR sL Sz MM -Ky -Qa +cD +Si Se -Eo -nW -DI +Db +sx +WG Yh -Ug -dj +pc +cR aa aa aa @@ -15077,7 +15043,7 @@ NG GX GX yr -ue +zj rp rp rp @@ -15124,26 +15090,26 @@ aa aa ad aF -aE +pW lq ag gk -tq +JZ aN ad aa aa bE -UR +JO dh qK NG -IZ -Pp +Tr +Oc JE NG -yL -OP +OE +UR rp qH TO @@ -15193,23 +15159,23 @@ ad ar be bp -OR +ZW cY -fy +ad ad aa aa bE Vb -Qn +rQ Fi -Dn +Zj wK -Jq -Zw +UH +ae GX -rO -pW +mF +AT rp CK VW @@ -15270,12 +15236,12 @@ bE bE bE NG -xa +MP rl -FW +uo GX NG -zM +Lo md xM Go @@ -15335,11 +15301,11 @@ aa aa aa aa -XR +SU rN Pg zI -FL +uI pK HT Ti @@ -15347,7 +15313,7 @@ uZ LN rT um -XR +SU aa aa aa @@ -15401,19 +15367,19 @@ aa aa aa aa -XR -KS +SU +sv Ob Ob -EH +CQ Ob HN -HJ +PH NA Ob Ob -qO -XR +DQ +SU aa aa aa @@ -15467,19 +15433,19 @@ aa aa aa aa -XR -XR -XR +SU +SU +SU NG GX NG -ta +rt GX GX NG -XR -XR -XR +SU +SU +SU aa aa aa diff --git a/_maps/RandomRuins/SpaceRuins/onehalf.dmm b/_maps/RandomRuins/SpaceRuins/onehalf.dmm index d384a88bd2796..0048ccb3976ea 100644 --- a/_maps/RandomRuins/SpaceRuins/onehalf.dmm +++ b/_maps/RandomRuins/SpaceRuins/onehalf.dmm @@ -121,7 +121,7 @@ /turf/open/floor/iron/airless, /area/ruin/space/has_grav/onehalf/hallway) "aA" = ( -/obj/item/roller, +/obj/item/emergency_bed, /turf/open/floor/iron/white, /area/ruin/space/has_grav/onehalf/dorms_med) "aB" = ( @@ -497,13 +497,6 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/onehalf/drone_bay) -"bE" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/ruin/space/has_grav/onehalf/drone_bay) "bF" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -615,11 +608,6 @@ /obj/structure/closet/emcloset, /turf/open/floor/iron, /area/ruin/space/has_grav/onehalf/bridge) -"cd" = ( -/obj/machinery/light/directional/north, -/obj/structure/frame/computer, -/turf/open/floor/iron, -/area/ruin/space/has_grav/onehalf/bridge) "ce" = ( /obj/structure/frame/computer, /turf/open/floor/iron, @@ -632,6 +620,7 @@ "cg" = ( /obj/structure/table/reinforced, /obj/effect/spawner/random/entertainment/money_large, +/obj/machinery/light/directional/north, /turf/open/floor/iron, /area/ruin/space/has_grav/onehalf/bridge) "ch" = ( @@ -818,7 +807,6 @@ /turf/template_noop, /area/ruin/space/has_grav/onehalf/hallway) "cM" = ( -/obj/machinery/light/directional/west, /obj/machinery/vending/sovietsoda, /turf/open/floor/iron, /area/ruin/space/has_grav/onehalf/bridge) @@ -857,6 +845,7 @@ /obj/structure/table/reinforced, /obj/item/gps/spaceruin, /obj/item/flashlight, +/obj/machinery/light/directional/south, /turf/open/floor/iron, /area/ruin/space/has_grav/onehalf/bridge) "cZ" = ( @@ -871,7 +860,6 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/onehalf/bridge) "db" = ( -/obj/machinery/light/directional/south, /obj/structure/table/reinforced, /obj/item/storage/medkit/regular, /turf/open/floor/iron, @@ -928,6 +916,13 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/onehalf/dorms_med) +"Id" = ( +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/ruin/space/has_grav/onehalf/drone_bay) "KC" = ( /obj/structure/frame/computer, /obj/structure/cable, @@ -1321,7 +1316,7 @@ ar ar ba bp -bE +bp bU cb cm @@ -1343,7 +1338,7 @@ aF aO aZ bq -bD +Id bU cc cn @@ -1367,7 +1362,7 @@ bb bp bp bU -cd +ce co cn ms @@ -1409,7 +1404,7 @@ ar ar bc bp -bE +bp bU cf Vh diff --git a/_maps/RandomRuins/SpaceRuins/originalcontent.dmm b/_maps/RandomRuins/SpaceRuins/originalcontent.dmm index 678f17b17391a..ea2ca46c0921a 100644 --- a/_maps/RandomRuins/SpaceRuins/originalcontent.dmm +++ b/_maps/RandomRuins/SpaceRuins/originalcontent.dmm @@ -740,7 +740,7 @@ /turf/open/indestructible/paper, /area/ruin/space/has_grav/powered) "cc" = ( -/mob/living/simple_animal/hostile/boss/paper_wizard, +/mob/living/basic/paper_wizard, /turf/open/indestructible/paper, /area/ruin/space/has_grav/powered) "cd" = ( diff --git a/_maps/RandomRuins/SpaceRuins/phonebooth.dmm b/_maps/RandomRuins/SpaceRuins/phonebooth.dmm index ac43612d59771..10ced2125ddca 100644 --- a/_maps/RandomRuins/SpaceRuins/phonebooth.dmm +++ b/_maps/RandomRuins/SpaceRuins/phonebooth.dmm @@ -11,7 +11,7 @@ /turf/open/floor/iron/dark/smooth_edge, /area/ruin/space/has_grav/powered/space_phone_booth) "e" = ( -/turf/open/space/basic, +/turf/template_noop, /area/ruin/space/has_grav/powered/space_phone_booth) "k" = ( /obj/machinery/vending/snack/green{ @@ -35,7 +35,7 @@ "v" = ( /obj/structure/lattice, /obj/structure/billboard/Phone_booth, -/turf/open/space/basic, +/turf/template_noop, /area/ruin/space/has_grav/powered/space_phone_booth) "z" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -65,7 +65,7 @@ /area/ruin/space/has_grav/powered/space_phone_booth) "V" = ( /obj/structure/lattice, -/turf/open/space/basic, +/turf/template_noop, /area/ruin/space/has_grav/powered/space_phone_booth) "W" = ( /obj/machinery/vending/cigarette{ diff --git a/_maps/RandomRuins/SpaceRuins/prey_pod.dmm b/_maps/RandomRuins/SpaceRuins/prey_pod.dmm index 9089dea664c09..6f53409b8735c 100644 --- a/_maps/RandomRuins/SpaceRuins/prey_pod.dmm +++ b/_maps/RandomRuins/SpaceRuins/prey_pod.dmm @@ -17,7 +17,7 @@ /obj/structure/chair/comfy/shuttle{ dir = 4 }, -/mob/living/simple_animal/hostile/asteroid/hivelord, +/mob/living/basic/mining/hivelord, /turf/open/floor/mineral/titanium/white/airless, /area/ruin/space/has_grav) "p" = ( @@ -32,7 +32,7 @@ /area/ruin/space/has_grav) "D" = ( /obj/structure/chair/comfy/shuttle, -/mob/living/simple_animal/hostile/asteroid/hivelord, +/mob/living/basic/mining/hivelord, /turf/open/floor/mineral/titanium/white/airless, /area/ruin/space/has_grav) "E" = ( @@ -57,7 +57,7 @@ /turf/open/floor/mineral/titanium/white/airless, /area/ruin/space/has_grav) "S" = ( -/mob/living/simple_animal/hostile/asteroid/hivelord, +/mob/living/basic/mining/hivelord, /turf/open/floor/mineral/titanium/white/airless, /area/ruin/space/has_grav) "T" = ( diff --git a/_maps/RandomRuins/SpaceRuins/prison_shuttle.dmm b/_maps/RandomRuins/SpaceRuins/prison_shuttle.dmm index b2aa28d68bab6..6acec2ccc4393 100644 --- a/_maps/RandomRuins/SpaceRuins/prison_shuttle.dmm +++ b/_maps/RandomRuins/SpaceRuins/prison_shuttle.dmm @@ -18,12 +18,8 @@ /obj/structure/table/reinforced, /turf/open/floor/carpet/red/airless, /area/ruin/space/prison_shuttle) -"f" = ( -/obj/machinery/modular_computer/console, -/turf/closed/mineral/random/stationside/asteroid, -/area/ruin/space/prison_shuttle) "g" = ( -/mob/living/simple_animal/hostile/asteroid/basilisk{ +/mob/living/basic/mining/basilisk{ environment_smash = 0 }, /turf/open/misc/asteroid/airless, @@ -38,6 +34,17 @@ "j" = ( /turf/open/floor/carpet/red/airless, /area/ruin/space/prison_shuttle) +"k" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron/dark/airless, +/area/ruin/space/prison_shuttle) +"l" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/mineral/titanium/tiled/airless, +/area/ruin/space/prison_shuttle) "m" = ( /obj/structure/chair/office{ dir = 4 @@ -49,7 +56,7 @@ /turf/open/floor/plating/airless, /area/ruin/space/prison_shuttle) "q" = ( -/mob/living/simple_animal/hostile/asteroid/hivelord, +/mob/living/basic/mining/hivelord, /turf/open/misc/asteroid/airless, /area/ruin/space/prison_shuttle) "r" = ( @@ -66,31 +73,42 @@ /obj/structure/girder/reinforced, /turf/open/floor/plating/airless, /area/ruin/space/prison_shuttle) -"u" = ( -/obj/structure/closet/secure_closet/security, -/obj/machinery/light/broken/directional/north, +"v" = ( +/obj/structure/closet/secure_closet/contraband{ + name = "confiscation locker" + }, +/obj/effect/spawner/random/exotic/antag_gear, +/obj/effect/spawner/random/exotic/antag_gear_weak, +/obj/effect/spawner/random/contraband/prison, +/obj/effect/spawner/random/contraband/prison, /turf/open/floor/mineral/titanium/tiled/airless, /area/ruin/space/prison_shuttle) "w" = ( -/mob/living/simple_animal/hostile/asteroid/hivelord, +/mob/living/basic/mining/hivelord, /turf/open/floor/plating/airless, /area/ruin/space/prison_shuttle) "x" = ( /turf/open/floor/mineral/titanium/tiled/airless, /area/ruin/space/prison_shuttle) -"y" = ( -/obj/machinery/light/broken/directional/north, -/turf/open/floor/plating/airless, -/area/ruin/space/prison_shuttle) "z" = ( /obj/machinery/door/airlock/security, /obj/effect/mapping_helpers/airlock/cutaiwire, /obj/effect/mapping_helpers/airlock/access/all/security, /turf/open/floor/mineral/titanium/tiled/airless, /area/ruin/space/prison_shuttle) +"A" = ( +/obj/effect/spawner/random/contraband/narcotics, +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/machinery/light/dim/directional/east, +/turf/open/floor/iron/dark/airless, +/area/ruin/space/prison_shuttle) "B" = ( /turf/open/floor/plating/airless, /area/ruin/space/prison_shuttle) +"D" = ( +/obj/structure/closet/secure_closet/security, +/turf/open/floor/mineral/titanium/tiled/airless, +/area/ruin/space/prison_shuttle) "E" = ( /turf/open/misc/asteroid/airless, /area/ruin/space/prison_shuttle) @@ -104,20 +122,9 @@ /obj/effect/mapping_helpers/airlock/access/all/security, /turf/open/floor/mineral/titanium/tiled/airless, /area/ruin/space/prison_shuttle) -"H" = ( -/obj/structure/closet/secure_closet/contraband{ - name = "confiscation locker" - }, -/obj/effect/spawner/random/exotic/antag_gear, -/obj/effect/spawner/random/exotic/antag_gear_weak, -/obj/effect/spawner/random/contraband/prison, -/obj/effect/spawner/random/contraband/prison, -/obj/machinery/light, -/turf/open/floor/mineral/titanium/tiled/airless, -/area/ruin/space/prison_shuttle) -"J" = ( -/obj/machinery/light, -/turf/open/floor/mineral/titanium/tiled/airless, +"K" = ( +/obj/machinery/modular_computer, +/turf/closed/mineral/random/stationside/asteroid, /area/ruin/space/prison_shuttle) "L" = ( /obj/machinery/power/shuttle_engine/propulsion/burst/left, @@ -159,29 +166,11 @@ /obj/machinery/power/shuttle_engine/propulsion/burst/right, /turf/template_noop, /area/ruin/space/prison_shuttle) -"S" = ( -/obj/structure/toilet{ - dir = 4 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/prison_shuttle) "T" = ( /obj/effect/decal/cleanable/vomit/old, /obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron/dark/airless, /area/ruin/space/prison_shuttle) -"U" = ( -/obj/effect/spawner/random/contraband/narcotics, -/obj/machinery/light/broken{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/prison_shuttle) "V" = ( /obj/structure/bed{ dir = 4 @@ -192,6 +181,10 @@ /obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron/dark/airless, /area/ruin/space/prison_shuttle) +"W" = ( +/obj/machinery/light/small/broken/directional/south, +/turf/open/floor/plating/airless, +/area/ruin/space/prison_shuttle) "X" = ( /obj/structure/bed, /obj/item/bedsheet/orange, @@ -235,9 +228,9 @@ c h h h -u +D x -H +v h h h @@ -256,10 +249,10 @@ p h w x -B +W h M -S +k V Z F @@ -288,7 +281,7 @@ E Y Y d -f +K m r h @@ -313,10 +306,10 @@ E t x B -x +l h P -U +A X Z F @@ -330,9 +323,9 @@ Y c c h -y +B +x x -J h h h diff --git a/_maps/RandomRuins/SpaceRuins/russian_derelict.dmm b/_maps/RandomRuins/SpaceRuins/russian_derelict.dmm index 8c288d21c1597..953bde1f09441 100644 --- a/_maps/RandomRuins/SpaceRuins/russian_derelict.dmm +++ b/_maps/RandomRuins/SpaceRuins/russian_derelict.dmm @@ -62,6 +62,11 @@ /obj/item/storage/box/lights/mixed, /turf/open/floor/plating/airless, /area/ruin/space/ks13/engineering/singulo) +"as" = ( +/obj/item/kirbyplants/random/dead, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/ruin/space/ks13/command/bridge) "av" = ( /obj/effect/spawner/structure/window/hollow/end{ dir = 1 @@ -112,6 +117,14 @@ /obj/structure/lattice, /turf/template_noop, /area/space/nearstation) +"aW" = ( +/obj/structure/window/spawner/directional/south, +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/space/ks13/security/court) "bd" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/east, @@ -290,6 +303,27 @@ /obj/item/stock_parts/cell/high, /turf/open/floor/iron, /area/ruin/space/ks13/engineering/sb_bow_solars_control) +"dx" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/bottle/vodka{ + pixel_x = 6; + pixel_y = 10 + }, +/obj/item/reagent_containers/cup/glass/bottle/vodka{ + pixel_x = -7; + pixel_y = 13 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating/airless, +/area/ruin/space/ks13/command/bridge) +"dy" = ( +/obj/structure/window/spawner/directional/south, +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/ruin/space/ks13/security/court) "dE" = ( /obj/structure/cable, /turf/open/floor/plating/airless, @@ -373,6 +407,11 @@ }, /turf/open/floor/iron, /area/ruin/space/ks13/ai/corridor) +"eE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/kirbyplants/random/dead, +/turf/open/floor/iron/airless, +/area/ruin/space/ks13/service/cafe) "eG" = ( /obj/structure/frame/machine, /obj/effect/mapping_helpers/burnt_floor, @@ -422,10 +461,19 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/ruin/space/solars/ks13/sb_bow_solars) +"fe" = ( +/obj/item/circuitboard/computer/solar_control, +/turf/open/floor/iron, +/area/ruin/space/ks13/engineering/sb_bow_solars_control) "fg" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/airless, /area/ruin/space/ks13/engineering/singulo) +"fz" = ( +/obj/structure/sign/departments/medbay/alt/directional/west, +/obj/item/kirbyplants/random/dead, +/turf/open/floor/iron/airless, +/area/ruin/space/ks13/hallway/central) "fC" = ( /obj/structure/chair{ dir = 4 @@ -449,7 +497,7 @@ pixel_x = -6; pixel_y = 6 }, -/turf/open/floor/iron, +/turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "fL" = ( /obj/machinery/door/window/left/directional/west{ @@ -493,14 +541,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating/airless, /area/ruin/space/ks13/ai/vault) -"gy" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/structure/window/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/ks13/security/court) "gB" = ( /obj/effect/spawner/structure/window/hollow/reinforced/end{ dir = 4 @@ -526,6 +566,11 @@ /obj/structure/lattice, /turf/template_noop, /area/space/nearstation) +"gU" = ( +/obj/item/kirbyplants/random/dead, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/ruin/space/ks13/security/court) "hm" = ( /obj/machinery/vending/hydroseeds, /obj/effect/mapping_helpers/broken_floor, @@ -548,6 +593,13 @@ /obj/effect/spawner/structure/window/hollow/reinforced/middle, /turf/open/floor/plating/airless, /area/ruin/space/ks13/engineering/atmos) +"hT" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/chapel{ + dir = 4 + }, +/area/ruin/space/ks13/service/chapel) "hY" = ( /obj/item/stack/cable_coil/cut, /obj/effect/mapping_helpers/broken_floor, @@ -611,6 +663,12 @@ /obj/structure/cable, /turf/open/floor/iron/airless, /area/ruin/space/ks13/security/court_hall) +"iL" = ( +/obj/structure/sign/departments/medbay/alt/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/item/kirbyplants/random/dead, +/turf/open/floor/iron/airless, +/area/ruin/space/ks13/hallway/central) "iR" = ( /obj/machinery/door/airlock/command{ name = "E.V.A." @@ -640,6 +698,10 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/ruin/space/ks13/security/court) +"iV" = ( +/obj/structure/window/spawner/directional/south, +/turf/open/floor/plating, +/area/ruin/space/ks13/security/court) "jc" = ( /obj/structure/frame/machine{ anchored = 1 @@ -666,6 +728,11 @@ }, /turf/open/floor/iron/airless, /area/ruin/space/ks13/science/rnd) +"jk" = ( +/obj/structure/lattice, +/obj/machinery/light/small/directional/north, +/turf/template_noop, +/area/ruin/space/ks13/security/sec) "jl" = ( /turf/open/floor/plating/airless, /area/ruin/space/ks13/service/bar) @@ -674,6 +741,12 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/ruin/space/ks13/engineering/singulo) +"jD" = ( +/obj/machinery/light/small/directional/east, +/obj/structure/closet/emcloset, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/airless, +/area/ruin/space/ks13/dorms) "jV" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle, /turf/open/floor/plating/airless, @@ -711,12 +784,6 @@ }, /turf/open/floor/plating/airless, /area/ruin/space/ks13/engineering/secure_storage) -"kA" = ( -/obj/item/kirbyplants/random/dead, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating/airless, -/area/ruin/space/ks13/hallway/central) "kE" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -734,12 +801,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/airless, /area/ruin/space/ks13/service/hydro) -"kJ" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/closet/emcloset, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/airless, -/area/space/nearstation) "kK" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 4 @@ -797,6 +858,15 @@ }, /turf/open/floor/iron, /area/ruin/space/ks13/ai/corridor) +"lq" = ( +/turf/open/floor/circuit/red/off, +/area/ruin/space/ks13/ai/corridor) +"lw" = ( +/obj/structure/lattice, +/obj/item/chair, +/obj/machinery/light/small/broken/directional/east, +/turf/template_noop, +/area/ruin/space/ks13/engineering/singulo) "lz" = ( /obj/machinery/door/airlock/security{ name = "Security" @@ -820,14 +890,14 @@ /obj/structure/cable, /turf/open/floor/iron/airless, /area/ruin/space/ks13/hallway/central) -"lR" = ( -/obj/structure/lattice, -/obj/structure/frame/computer{ - anchored = 1 +"lV" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/chapel{ + dir = 4 }, -/obj/machinery/light/small/directional/north, -/turf/template_noop, -/area/space/nearstation) +/area/ruin/space/ks13/service/chapel) "lW" = ( /obj/structure/rack, /obj/item/stock_parts/cell/lead, @@ -844,16 +914,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/ruin/space/ks13/medical/morgue) -"mg" = ( -/obj/structure/lattice, -/obj/machinery/light/small/directional/north, -/turf/template_noop, -/area/space/nearstation) -"mp" = ( -/obj/structure/sign/departments/medbay/alt/directional/west, -/obj/item/kirbyplants/random/dead, -/turf/open/floor/iron/airless, -/area/ruin/space/ks13/hallway/central) "mv" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/effect/mapping_helpers/apc/no_charge, @@ -911,6 +971,10 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/template_noop, /area/space/nearstation) +"nf" = ( +/obj/item/kirbyplants/random/dead, +/turf/open/floor/plating/airless, +/area/ruin/space/ks13/hallway/central) "nm" = ( /obj/structure/sign/warning/test_chamber/directional/north, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, @@ -963,13 +1027,6 @@ "od" = ( /turf/closed/wall/r_wall, /area/ruin/space/ks13/hallway/aft) -"oj" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/chapel{ - dir = 1 - }, -/area/ruin/space/ks13/service/chapel) "om" = ( /obj/structure/lattice, /obj/effect/mapping_helpers/broken_floor, @@ -980,6 +1037,14 @@ dir = 1 }, /area/ruin/space/ks13/service/chapel) +"op" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/structure/window/spawner/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/ruin/space/ks13/security/court) "oq" = ( /obj/structure/rack, /obj/item/vending_refill/boozeomat, @@ -1123,7 +1188,7 @@ /obj/item/stack/sheet/glass/fifty, /obj/item/stack/sheet/glass/fifty, /obj/item/stack/sheet/glass/fifty, -/turf/open/floor/iron/airless, +/turf/open/floor/circuit/red/airless, /area/ruin/space/ks13/ai/vault) "pc" = ( /obj/effect/decal/cleanable/blood/splatter, @@ -1333,7 +1398,7 @@ pixel_y = 6 }, /obj/item/circuitboard/machine/cryo_tube, -/turf/open/floor/iron, +/turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "qh" = ( /obj/structure/fluff/oldturret, @@ -1600,20 +1665,8 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/airless, /area/ruin/space/ks13/hallway/aft) -"rH" = ( -/obj/structure/window/spawner/directional/south, -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/ks13/security/court) "rI" = ( /obj/structure/table_frame/wood, -/obj/item/clothing/head/helmet/chaplain{ - armor = null; - desc = "The Chaplains crusader helment. It seems old and dented." - }, /turf/open/floor/wood, /area/ruin/space/ks13/service/chapel_office) "rJ" = ( @@ -1883,6 +1936,10 @@ /obj/machinery/power/smes, /turf/open/floor/iron, /area/ruin/space/ks13/engineering/sb_bow_solars_control) +"sQ" = ( +/obj/item/kirbyplants/random/dead, +/turf/open/floor/iron, +/area/ruin/space/ks13/security/court) "sR" = ( /obj/structure/cable, /obj/machinery/door/airlock/research/glass{ @@ -1899,11 +1956,6 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/ruin/space/ks13/engineering/singulo) -"sT" = ( -/obj/structure/window/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/ks13/security/court) "sU" = ( /turf/closed/wall/r_wall, /area/ruin/space/ks13/engineering/singulo) @@ -2320,6 +2372,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/airless, /area/ruin/space/ks13/engineering/atmos) +"vD" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/chapel{ + dir = 1 + }, +/area/ruin/space/ks13/service/chapel) "vE" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -2431,6 +2490,11 @@ /obj/structure/cable, /turf/open/floor/iron/airless, /area/ruin/space/ks13/hallway/aft) +"wt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/head/chaplain/bishopmitre, +/turf/open/floor/iron/dark, +/area/ruin/space/ks13/service/chapel_office) "wu" = ( /obj/structure/rack, /obj/effect/decal/cleanable/dirt, @@ -2567,7 +2631,7 @@ /obj/item/stack/sheet/iron/fifty, /obj/item/stack/sheet/iron/fifty, /obj/item/stack/sheet/iron/fifty, -/turf/open/floor/iron/airless, +/turf/open/floor/circuit/red/airless, /area/ruin/space/ks13/ai/vault) "xb" = ( /obj/structure/frame/computer{ @@ -2658,10 +2722,6 @@ /obj/effect/spawner/structure/window/hollow/reinforced/middle, /turf/open/floor/plating/airless, /area/ruin/space/ks13/medical/medbay) -"xy" = ( -/obj/structure/window/spawner/directional/south, -/turf/open/floor/plating, -/area/ruin/space/ks13/security/court) "xA" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/effect/mapping_helpers/apc/no_charge, @@ -2717,7 +2777,7 @@ pixel_y = 6 }, /obj/item/circuitboard/machine/chem_dispenser/drinks/beer, -/turf/open/floor/iron, +/turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "xN" = ( /obj/structure/rack, @@ -2956,6 +3016,11 @@ /obj/effect/spawner/structure/window/hollow/reinforced/middle, /turf/open/floor/plating/airless, /area/ruin/space/ks13/engineering/aft_solars_control) +"yY" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/closet/crate/solarpanel_small, +/turf/open/floor/iron/airless, +/area/space/nearstation) "yZ" = ( /obj/structure/grille/broken, /obj/effect/decal/cleanable/glass, @@ -3101,6 +3166,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/ruin/space/ks13/ai/vault) +"zJ" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/solarpanel_small, +/turf/open/floor/iron/airless, +/area/ruin/space/ks13/hallway/central) "zK" = ( /obj/machinery/light/small/directional/east, /obj/effect/decal/cleanable/dirt, @@ -3422,7 +3494,7 @@ pixel_y = 6 }, /obj/item/circuitboard/machine/smes, -/turf/open/floor/iron, +/turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "Bv" = ( /obj/effect/decal/cleanable/glass, @@ -3480,14 +3552,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/iron/airless, /area/ruin/space/ks13/engineering/atmos) -"BH" = ( -/obj/structure/window/spawner/directional/south, -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/ks13/security/court) "BI" = ( /obj/effect/spawner/structure/window/hollow/reinforced/end, /turf/open/floor/plating/airless, @@ -3539,14 +3603,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/airless, /area/ruin/space/ks13/security/sec) -"BV" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/chapel{ - dir = 4 - }, -/area/ruin/space/ks13/service/chapel) "BW" = ( /obj/effect/spawner/structure/window/hollow/end, /turf/open/floor/plating, @@ -3598,12 +3654,6 @@ }, /turf/template_noop, /area/space/nearstation) -"Cn" = ( -/obj/structure/sign/departments/medbay/alt/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants/random/dead, -/turf/open/floor/iron/airless, -/area/ruin/space/ks13/hallway/central) "Co" = ( /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron/white/airless, @@ -3752,19 +3802,6 @@ /obj/machinery/pipedispenser, /turf/open/floor/iron/airless, /area/ruin/space/ks13/engineering/atmos) -"Dj" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/cup/glass/bottle/vodka{ - pixel_x = 6; - pixel_y = 10 - }, -/obj/item/reagent_containers/cup/glass/bottle/vodka{ - pixel_x = -7; - pixel_y = 13 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating/airless, -/area/space/nearstation) "Dl" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /obj/effect/mapping_helpers/burnt_floor, @@ -3852,7 +3889,7 @@ pixel_y = 6 }, /obj/item/ai_module/core/full/drone, -/turf/open/floor/iron, +/turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "DL" = ( /obj/structure/table, @@ -3970,10 +4007,6 @@ }, /turf/open/floor/plating/airless, /area/ruin/space/ks13/tool_storage) -"Eg" = ( -/obj/item/kirbyplants/random/dead, -/turf/open/floor/plating/airless, -/area/ruin/space/ks13/hallway/central) "Ei" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -4266,6 +4299,25 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/ruin/space/ks13/engineering/atmos) +"FQ" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_x = 8; + pixel_y = 9 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_x = 8 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_x = -7; + pixel_y = 9 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_x = -7 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless, +/area/ruin/space/ks13/command/bridge) "FR" = ( /obj/machinery/vending/sovietsoda, /turf/open/floor/iron/airless, @@ -4316,11 +4368,6 @@ "Gc" = ( /turf/open/floor/plating/airless, /area/ruin/space/ks13/engineering/grav_gen) -"Ge" = ( -/obj/item/kirbyplants/random/dead, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/ks13/security/court) "Gf" = ( /turf/closed/wall, /area/space/nearstation) @@ -4548,7 +4595,7 @@ pixel_y = 6 }, /obj/item/circuitboard/machine/space_heater, -/turf/open/floor/iron, +/turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "Hh" = ( /obj/effect/decal/cleanable/dirt, @@ -4668,25 +4715,6 @@ /obj/structure/girder/reinforced, /turf/open/floor/plating/airless, /area/ruin/space/ks13/science/ordnance) -"HL" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ - pixel_x = 8; - pixel_y = 9 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ - pixel_x = 8 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ - pixel_x = -7; - pixel_y = 9 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ - pixel_x = -7 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, -/area/space/nearstation) "HO" = ( /turf/open/floor/plating/airless, /area/ruin/space/ks13/engineering/singulo) @@ -4721,6 +4749,10 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/ruin/space/ks13/engineering/singulo) +"Ia" = ( +/obj/item/kirbyplants/random/dead, +/turf/open/floor/iron, +/area/ruin/space/ks13/command/bridge_hall) "Ib" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/blood/old, @@ -4955,7 +4987,7 @@ pixel_x = -6; pixel_y = -6 }, -/turf/open/floor/iron, +/turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "Jz" = ( /obj/effect/mapping_helpers/burnt_floor, @@ -5280,6 +5312,14 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/airless, /area/ruin/space/ks13/hallway/aft) +"Lu" = ( +/obj/structure/table/wood, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/iron/chapel{ + dir = 1 + }, +/area/ruin/space/ks13/service/chapel) "Lw" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -5341,12 +5381,12 @@ pixel_y = 6 }, /obj/item/circuitboard/machine/protolathe/offstation, -/turf/open/floor/iron, +/turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "LM" = ( /obj/machinery/light/small/directional/north, /obj/structure/cable, -/turf/open/floor/iron, +/turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "LN" = ( /turf/closed/wall, @@ -5395,14 +5435,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/ks13/engineering/singulo) -"Mb" = ( -/obj/structure/table/wood, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/iron/chapel{ - dir = 1 - }, -/area/ruin/space/ks13/service/chapel) "Mc" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/closed/wall/r_wall, @@ -5791,10 +5823,6 @@ /obj/effect/mapping_helpers/apc/no_charge, /turf/open/floor/iron/airless, /area/ruin/space/ks13/science/rnd) -"Og" = ( -/obj/item/kirbyplants/random/dead, -/turf/open/floor/iron, -/area/ruin/space/ks13/security/court) "Oh" = ( /obj/machinery/vending/cigarette, /turf/open/floor/iron/airless, @@ -5958,6 +5986,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/airless, /area/ruin/space/ks13/medical/medbay) +"Pc" = ( +/obj/structure/lattice, +/obj/structure/frame/computer{ + anchored = 1 + }, +/obj/machinery/light/small/directional/north, +/turf/template_noop, +/area/ruin/space/ks13/command/bridge) "Pd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /obj/effect/decal/cleanable/dirt, @@ -6021,7 +6057,7 @@ pixel_x = -6; pixel_y = -6 }, -/turf/open/floor/iron, +/turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "Pq" = ( /obj/effect/decal/cleanable/dirt, @@ -6159,11 +6195,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/ruin/space/ks13/engineering/singulo) -"PT" = ( -/obj/item/kirbyplants/random/dead, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/ks13/command/bridge) "PU" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -6396,7 +6427,7 @@ "Rm" = ( /obj/structure/rack, /obj/item/circuitboard/computer/crew, -/turf/open/floor/iron, +/turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "Ro" = ( /obj/structure/grille/broken, @@ -6924,10 +6955,6 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/ruin/space/ks13/security/sec) -"TA" = ( -/obj/item/kirbyplants/random/dead, -/turf/open/floor/iron, -/area/ruin/space/ks13/command/bridge_hall) "TB" = ( /obj/structure/cable, /turf/open/floor/iron/airless, @@ -6987,12 +7014,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/airless, /area/ruin/space/ks13/engineering/aft_solars_control) -"TO" = ( -/obj/structure/lattice, -/obj/item/chair, -/obj/machinery/light/small/broken/directional/east, -/turf/template_noop, -/area/space/nearstation) "TQ" = ( /obj/item/shard{ icon_state = "medium" @@ -7529,7 +7550,7 @@ /obj/item/stack/sheet/mineral/silver{ amount = 15 }, -/turf/open/floor/iron/airless, +/turf/open/floor/circuit/red/airless, /area/ruin/space/ks13/ai/vault) "WO" = ( /obj/effect/spawner/random/maintenance, @@ -7593,6 +7614,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/airless, /area/ruin/space/ks13/science/rnd) +"Xf" = ( +/obj/structure/window/spawner/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/space/ks13/security/court) "Xh" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/east, @@ -7603,7 +7629,7 @@ /obj/machinery/power/apc/auto_name/directional/north, /obj/effect/mapping_helpers/apc/no_charge, /obj/structure/cable, -/turf/open/floor/iron, +/turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "Xj" = ( /obj/effect/decal/cleanable/dirt, @@ -7623,11 +7649,6 @@ "Xr" = ( /turf/closed/wall, /area/ruin/space/ks13/science/genetics) -"Xs" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants/random/dead, -/turf/open/floor/iron/airless, -/area/ruin/space/ks13/service/cafe) "Xt" = ( /obj/structure/table, /obj/effect/spawner/random/maintenance, @@ -7653,13 +7674,6 @@ /obj/structure/cable, /turf/open/floor/iron/airless, /area/ruin/space/ks13/science/rnd) -"Xz" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/chapel{ - dir = 4 - }, -/area/ruin/space/ks13/service/chapel) "XA" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, @@ -7681,6 +7695,10 @@ /obj/structure/cable, /turf/open/floor/iron/white/airless, /area/ruin/space/ks13/medical/medbay) +"XI" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/circuit/red/off, +/area/ruin/space/ks13/ai/corridor) "XJ" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/effect/mapping_helpers/apc/no_charge, @@ -7715,6 +7733,12 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/ruin/space/ks13/engineering/aux_storage) +"XV" = ( +/obj/item/kirbyplants/random/dead, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating/airless, +/area/ruin/space/ks13/hallway/central) "XW" = ( /turf/closed/wall, /area/ruin/space/ks13/security/court_hall) @@ -7735,6 +7759,13 @@ }, /turf/open/floor/iron, /area/ruin/space/ks13/command/bridge) +"Yb" = ( +/obj/structure/cable, +/obj/structure/frame/computer{ + anchored = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/ks13/engineering/sb_bow_solars_control) "Yc" = ( /turf/closed/wall/r_wall, /area/ruin/space/ks13/ai/corridor) @@ -7835,7 +7866,7 @@ /area/ruin/space/ks13/hallway/aft) "YC" = ( /obj/structure/fluff/oldturret, -/turf/open/floor/iron, +/turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "YE" = ( /obj/structure/plaque/static_plaque/golden/commission/ks13, @@ -7980,7 +8011,7 @@ /obj/item/stack/sheet/mineral/plasma{ amount = 15 }, -/turf/open/floor/iron/airless, +/turf/open/floor/circuit/red/airless, /area/ruin/space/ks13/ai/vault) "Zq" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -8006,6 +8037,11 @@ /obj/item/grenade/empgrenade, /turf/open/floor/iron, /area/ruin/space/ks13/command/eva) +"Zv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, +/area/ruin/space/ks13/command/bridge) "Zw" = ( /obj/item/stack/cable_coil/cut, /obj/effect/mapping_helpers/broken_floor, @@ -8040,7 +8076,7 @@ /obj/item/stack/sheet/iron/fifty, /obj/item/stack/sheet/iron/fifty, /obj/item/stack/sheet/iron/fifty, -/turf/open/floor/iron/airless, +/turf/open/floor/circuit/red/airless, /area/ruin/space/ks13/ai/vault) "ZC" = ( /obj/structure/table/glass, @@ -8435,7 +8471,7 @@ MB rw PA JN -Mb +Lu IW WA JN @@ -8548,13 +8584,13 @@ MB EQ Ok pN -Xz +hT IW xB vl NO uf -oU +yY zN qG aa @@ -8661,7 +8697,7 @@ MB rw oo zb -oj +vD IW OP LE @@ -8767,14 +8803,14 @@ aa aa rk MB -sh +wt Eu sh sh rw Jf vl -BV +lV je Eq vl @@ -9571,7 +9607,7 @@ Fq yq rm uf -kJ +jD oU sm wc @@ -10756,13 +10792,13 @@ aa aa aa aa -rk aa aa aa -rk -rk -rk +aa +aa +aa +aa aa aa aa @@ -10868,16 +10904,16 @@ aa aa aa aa -rk aa -rk -rk -rk aa aa aa -rk -rk +aa +aa +aa +aa +aa +aa aa aa aa @@ -10981,16 +11017,16 @@ aa aa aa aa -rk -Yc -Yc -Yc -Yc -Yc -Yc -Yc aa -rk +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -11095,24 +11131,24 @@ aa aa aa aa -rk -Yc -Pw -fU -zA -fU -Yc aa -rk -rk -rk -rk -rk -rk -rk -rk -rk -rk +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -11153,7 +11189,7 @@ oQ xn ZC xx -mp +fz yl Uw DM @@ -11207,32 +11243,32 @@ aa aa aa aa +aa rk -Yc -Yc -eA -Yc -Yc -fU -Yc -Jw -Jw -Jw -Jw -Jw -Jw -Jw -Jw -Jw -Jw -rk -rk +aa +aa +aa rk rk rk aa aa aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa rk rk rk @@ -11320,31 +11356,31 @@ aa aa aa aa +rk aa rk rk rk -Yc -AW -KO -Yc -Bw -Bw -Bw -Bw -Bw -Bw -IF -IF -RL aa aa +aa +rk rk aa aa aa aa aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa rk rk rk @@ -11433,22 +11469,15 @@ aa aa aa aa -aa -aa -aa rk Yc Yc -lk Yc -Jw -Jw -Jw -Jw -Jw -Jw -Jw -Jw +Yc +Yc +Yc +Yc +aa rk aa aa @@ -11459,6 +11488,13 @@ aa aa aa aa +aa +aa +aa +aa +aa +aa +aa rk Kb rk @@ -11547,24 +11583,24 @@ aa aa aa aa -aa -aa -aa rk Yc +Pw fU +zA fU -fU -fU -fU -fU -fU -fU -YC Yc +aa +rk +rk +rk +rk +rk +rk +rk +rk rk rk -aa aa aa aa @@ -11659,23 +11695,24 @@ aa aa aa aa -aa -aa -aa -aa -aa -Yc -Yc -Yc -Yc -Yc +rk Yc Yc +eA Yc -st Yc +fU Yc -aa +Jw +Jw +Jw +Jw +Jw +Jw +Jw +Jw +Jw +Jw rk aa aa @@ -11685,7 +11722,6 @@ aa aa aa aa -aa rk sU Wk @@ -11718,12 +11754,12 @@ Se wF CO rQ -Cn +iL zK yl Uw qw -Xs +eE ah XX Xh @@ -11773,22 +11809,22 @@ aa aa aa aa -aa -aa -aa -aa -Yc -YC -fU -fU -fU -fU -fU -fU -fU +rk +rk +rk Yc +AW +KO Yc -aa +sg +Bw +Bw +Bw +Bw +Bw +IF +IF +RL aa aa aa @@ -11824,7 +11860,7 @@ NB fg Wk sU -TO +lw rk Xr BB @@ -11888,20 +11924,20 @@ aa aa aa aa -aa -aa -Yc -Yc -st -Yc -Yc -Yc -Yc -Yc +rk Yc Yc +lk Yc -aa +Jw +Jw +Jw +Jw +Jw +Jw +Jw +Jw +rk aa aa aa @@ -12002,8 +12038,7 @@ aa aa aa aa -aa -Yc +rk Yc fU fU @@ -12012,10 +12047,11 @@ fU fU fU fU +fU YC Yc -aa -aa +rk +rk aa aa uu @@ -12037,11 +12073,11 @@ bm PI zv PI +Jc xJ xJ xJ -xJ -xJ +Jc zv PI zv @@ -12128,9 +12164,9 @@ st Yc Yc aa -aa rk aa +aa uu NJ QJ @@ -12241,8 +12277,8 @@ fU Yc Yc aa -IF -rk +aa +aa aa yf bN @@ -12354,8 +12390,8 @@ Yc Yc Yc aa -Bw -Gf +aa +aa aa yf wQ @@ -12467,8 +12503,8 @@ fU YC Yc aa -Bw -Gf +aa +aa aa yf WF @@ -12489,11 +12525,11 @@ PI zv PI zv +Jc xJ xJ xJ -xJ -xJ +PI PI fg FI @@ -12581,7 +12617,7 @@ Yc Yc Yc Bw -Gf +Jw aa yf yf @@ -12798,15 +12834,15 @@ Yc Yc Yc Yc -fU +lq Bu Hg fJ -fU +lq YC Yc Yc -IF +Xa aa aa aa @@ -13025,11 +13061,11 @@ Yc Yc Yc Xi -fU +lq qf Rm -fU -fU +lq +lq Yc LL Yc @@ -13144,7 +13180,7 @@ fU fU fU PW -KO +XI Yc aa aa @@ -13254,7 +13290,7 @@ LM xL Po Jy -fU +lq YC Yc DK @@ -13633,7 +13669,7 @@ QR NG yl XC -Qz +zJ Mz QR yg @@ -13878,7 +13914,7 @@ Wy gm Lq Lq -mg +jk rk hY rk @@ -14982,9 +15018,9 @@ AX yl yl DM -Eg +nf wv -kA +XV iF cf wv @@ -15423,7 +15459,7 @@ wJ DZ FM DZ -TA +Ia As aa aa @@ -15729,7 +15765,7 @@ aa aa xS pR -pR +fe xS VB cR @@ -15764,7 +15800,7 @@ Pk WV wU rl -lR +Pc Db IL Aw @@ -15841,7 +15877,7 @@ bP aa aa xS -VB +Yb IK xS pR @@ -15877,7 +15913,7 @@ Dz ag Jz JC -Wm +Zv Rs rk vY @@ -15990,7 +16026,7 @@ Pk SA Am rl -HL +FQ sa Hu IL @@ -16095,7 +16131,7 @@ ig DZ wg rl -PT +as QN WD Gs @@ -16103,7 +16139,7 @@ aJ aJ Wi rl -Dj +dx Bg Wm Ol @@ -16205,7 +16241,7 @@ Sb As LW As -TA +Ia wg rl se @@ -16452,11 +16488,11 @@ IF oU cz uw -Ge +gU JT JT JT -sT +Xf oV EN uU @@ -16569,7 +16605,7 @@ gH KJ JT MO -gy +op iU MU YL @@ -16682,7 +16718,7 @@ cJ Nv WB pv -rH +aW Yg pf YL @@ -16908,7 +16944,7 @@ JT WB NI MO -BH +dy oV Pq uU @@ -17021,7 +17057,7 @@ WB NI NI MO -gy +op Ft NI uU @@ -17130,11 +17166,11 @@ oU cz tH uw -Og +sQ WB NI WB -xy +iV Yg NI uU diff --git a/_maps/RandomRuins/SpaceRuins/space_ghost_restaurant.dmm b/_maps/RandomRuins/SpaceRuins/space_ghost_restaurant.dmm index ab62bae2cd0db..fa97cdd8966e0 100644 --- a/_maps/RandomRuins/SpaceRuins/space_ghost_restaurant.dmm +++ b/_maps/RandomRuins/SpaceRuins/space_ghost_restaurant.dmm @@ -51,6 +51,12 @@ /obj/item/reagent_containers/cup/glass/mug/nanotrasen, /turf/open/floor/iron/cafeteria/airless, /area/ruin/space/space_ghost_restaurant) +"gS" = ( +/obj/item/food/mashed_potatoes, +/obj/structure/lattice, +/obj/item/clothing/head/costume/scarecrow_hat, +/turf/template_noop, +/area/space/nearstation) "hp" = ( /obj/item/stack/rods, /turf/template_noop, @@ -66,6 +72,11 @@ "kf" = ( /turf/open/floor/iron/cafeteria/airless, /area/ruin/space/space_ghost_restaurant) +"kM" = ( +/obj/structure/broken_flooring/pile/directional/east, +/obj/structure/lattice, +/turf/template_noop, +/area/space/nearstation) "kX" = ( /obj/structure/bed, /obj/item/bedsheet/yellow, @@ -83,11 +94,6 @@ }, /turf/template_noop, /area/space/nearstation) -"nr" = ( -/obj/structure/lattice, -/obj/structure/broken_flooring/singular/directional/south, -/turf/template_noop, -/area/space/nearstation) "nT" = ( /obj/effect/decal/cleanable/food/flour, /obj/structure/mannequin/wood, @@ -133,17 +139,16 @@ /obj/machinery/door/airlock/maintenance_hatch, /turf/open/floor/plating, /area/ruin/space/space_ghost_restaurant) -"Ak" = ( -/obj/structure/lattice, -/obj/structure/broken_flooring/singular/directional/east, -/turf/template_noop, -/area/space/nearstation) "AT" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/frame/machine, /obj/item/stack/cable_coil/cut, /turf/open/floor/iron/showroomfloor/airless, /area/ruin/space/space_ghost_restaurant) +"Bv" = ( +/obj/structure/broken_flooring/singular/directional/south, +/turf/template_noop, +/area/template_noop) "BA" = ( /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/glass, @@ -170,10 +175,20 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/showroomfloor/airless, /area/ruin/space/space_ghost_restaurant) +"Hc" = ( +/obj/structure/lattice, +/obj/structure/broken_flooring/singular/directional/south, +/turf/template_noop, +/area/space/nearstation) "Hx" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/plating, /area/ruin/space/space_ghost_restaurant) +"Im" = ( +/obj/structure/lattice, +/obj/structure/broken_flooring/singular/directional/east, +/turf/template_noop, +/area/space/nearstation) "Ix" = ( /obj/structure/lattice, /turf/template_noop, @@ -191,13 +206,6 @@ /obj/item/stack/tile/iron/cafeteria, /turf/template_noop, /area/space/nearstation) -"Jd" = ( -/obj/item/food/mashed_potatoes, -/obj/structure/lattice, -/obj/effect/decal/cleanable/robot_debris/up, -/obj/item/clothing/head/costume/scarecrow_hat, -/turf/template_noop, -/area/space/nearstation) "Jo" = ( /obj/item/bodypart/leg/left/robot/surplus, /obj/item/stack/tile/iron/cafeteria, @@ -207,11 +215,6 @@ /obj/item/chair, /turf/open/floor/iron/cafeteria/airless, /area/ruin/space/space_ghost_restaurant) -"Kj" = ( -/obj/structure/broken_flooring/pile/directional/east, -/obj/structure/lattice, -/turf/template_noop, -/area/space/nearstation) "Km" = ( /obj/structure/table/wood/fancy/red, /obj/item/clothing/head/costume/papersack/smiley, @@ -252,10 +255,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/carpet/donk, /area/ruin/space/space_ghost_restaurant) -"Oy" = ( -/obj/structure/broken_flooring/singular/directional/south, -/turf/template_noop, -/area/template_noop) "Py" = ( /obj/structure/table/wood/fancy/red, /obj/item/clothing/head/wizard/santa, @@ -388,7 +387,7 @@ Ea Ix Ea Ea -Ak +Im Ea Ea Ea @@ -475,7 +474,7 @@ Ns RI kf Qi -Jd +gS Dz Ix hp @@ -499,7 +498,7 @@ WY Jo vs vh -Kj +kM Ea Ea Ea @@ -523,7 +522,7 @@ Ix AT Ea Ea -Oy +Bv Ea Ea Ea @@ -565,7 +564,7 @@ Ix Ea Ea Ea -nr +Hc Ea Ea Ea diff --git a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm index b60becf24728e..705b26545460b 100644 --- a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm @@ -37,6 +37,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/hotel) +"ap" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/chair, +/obj/structure/sign/poster/random/directional/north, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood/large, +/area/ruin/space/has_grav/hotel/dock) "au" = ( /obj/structure/toilet{ pixel_y = 5 @@ -52,12 +59,21 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/catwalk_floor, /area/ruin/space/has_grav/hotel/dock) -"aE" = ( -/obj/item/kirbyplants{ - icon_state = "plant-03" +"aD" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/turf/open/floor/iron/freezer, -/area/ruin/space/has_grav/hotel/pool) +/obj/effect/spawner/random/vending/colavend, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood/large, +/area/ruin/space/has_grav/hotel/dock) +"aF" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/kirbyplants/organic/plant3, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/hotel) "aH" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -68,11 +84,12 @@ /obj/machinery/door/firedoor, /turf/open/floor/stone, /area/ruin/space/has_grav/hotel/bar) -"aU" = ( -/obj/structure/chair/sofa/corp/left{ - dir = 1 +"aP" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 }, -/obj/machinery/light/directional/south, +/obj/item/kirbyplants/organic/plant16, +/obj/structure/sign/poster/random/directional/north, /turf/open/floor/carpet/blue, /area/ruin/space/has_grav/hotel) "be" = ( @@ -116,14 +133,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/parquet, /area/ruin/space/has_grav/hotel/guestroom/room_2) -"bs" = ( -/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/directional/north, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/wood, -/area/ruin/space/has_grav/hotel/bar) "bu" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -143,13 +152,6 @@ /obj/machinery/light_switch/directional/north, /turf/open/floor/wood/parquet, /area/ruin/space/has_grav/hotel/guestroom/room_1) -"bz" = ( -/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/wood/tile, -/area/ruin/space/has_grav/hotel) "bK" = ( /obj/structure/sink/directional/west, /turf/open/floor/iron/freezer, @@ -171,18 +173,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel/power) +"bP" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/kirbyplants/organic/plant5, +/obj/machinery/light/directional/west, +/turf/open/floor/wood/tile, +/area/ruin/space/has_grav/hotel) "bU" = ( /obj/structure/table/wood/fancy/orange, /obj/item/flashlight/lamp, /turf/open/floor/wood/parquet, /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, -/area/ruin/space/has_grav/hotel) "bX" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -232,11 +235,6 @@ }, /turf/open/floor/iron/sepia, /area/ruin/space/has_grav/hotel/pool) -"cl" = ( -/obj/structure/chair/sofa/corp/right, -/obj/machinery/light/directional/north, -/turf/open/floor/carpet/blue, -/area/ruin/space/has_grav/hotel) "cn" = ( /obj/structure/chair{ dir = 1 @@ -311,12 +309,6 @@ /obj/structure/sink/directional/west, /turf/open/floor/iron/showroomfloor, /area/ruin/space/has_grav/hotel/guestroom/room_3) -"de" = ( -/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, -/area/ruin/space/has_grav/hotel) "dh" = ( /obj/structure/cable, /obj/machinery/power/solar_control{ @@ -389,10 +381,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel) -"eb" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hotel) "eg" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/closet/crate/bin, @@ -410,12 +398,6 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel/power) -"ep" = ( -/obj/structure/table/reinforced/plastitaniumglass, -/obj/machinery/light/directional/south, -/obj/structure/sign/poster/contraband/random/directional/south, -/turf/open/floor/iron/dark/smooth_edge, -/area/ruin/space/has_grav/hotel/workroom) "eu" = ( /turf/open/floor/iron/showroomfloor, /area/ruin/space/has_grav/hotel/dock) @@ -446,11 +428,6 @@ /obj/structure/sign/warning/no_smoking/circle/directional/north, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/hotel) -"eK" = ( -/obj/structure/chair/wood, -/obj/structure/sign/warning/no_smoking/circle/directional/north, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hotel/bar) "eR" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -476,18 +453,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/hotel) -"fc" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/obj/item/kirbyplants{ - icon_state = "plant-05" - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/ruin/space/has_grav/hotel) "fg" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/sign/poster/random/directional/north, @@ -531,13 +496,6 @@ dir = 1 }, /area/ruin/space/has_grav/hotel/guestroom/room_4) -"fT" = ( -/obj/item/kirbyplants{ - icon_state = "plant-16" - }, -/obj/structure/sign/poster/random/directional/west, -/turf/open/floor/carpet/blue, -/area/ruin/space/has_grav/hotel) "fW" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -545,11 +503,6 @@ }, /turf/template_noop, /area/ruin/space/has_grav/hotel) -"fY" = ( -/obj/machinery/light/directional/west, -/obj/structure/dresser, -/turf/open/floor/wood/parquet, -/area/ruin/space/has_grav/hotel/guestroom/room_4) "fZ" = ( /obj/item/reagent_containers/condiment/saltshaker{ pixel_x = 7; @@ -637,17 +590,20 @@ }, /turf/open/floor/wood/tile, /area/ruin/space/has_grav/hotel) -"gw" = ( -/obj/structure/chair/wood{ - dir = 1 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hotel/bar) +"gB" = ( +/obj/structure/sign/poster/contraband/random/directional/north, +/turf/open/floor/carpet/black, +/area/ruin/space/has_grav/hotel) "gC" = ( /obj/structure/frame/computer, /turf/open/floor/circuit/green, /area/ruin/space/has_grav/hotel) +"gD" = ( +/obj/item/kirbyplants/organic/plant5, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/ruin/space/has_grav/hotel) "gG" = ( /turf/open/floor/iron/dark, /area/ruin/space/has_grav/hotel/workroom) @@ -914,12 +870,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit/red, /area/ruin/space/has_grav/hotel/workroom) -"iE" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/chair, -/obj/machinery/light/directional/north, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/hotel/dock) +"iG" = ( +/obj/structure/chair/comfy{ + dir = 8 + }, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/ruin/space/has_grav/hotel) "iH" = ( /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -928,11 +886,6 @@ /obj/item/reagent_containers/cup/glass/mug/tea, /turf/open/floor/stone, /area/ruin/space/has_grav/hotel/bar) -"iI" = ( -/obj/effect/turf_decal/siding/wood, -/obj/machinery/light/directional/south, -/turf/open/floor/stone, -/area/ruin/space/has_grav/hotel/bar) "iJ" = ( /obj/structure/railing/corner{ dir = 4 @@ -1011,6 +964,10 @@ /obj/structure/sign/warning/no_smoking/circle/directional/north, /turf/open/floor/wood, /area/ruin/space/has_grav/hotel/bar) +"je" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/wood/tile, +/area/ruin/space/has_grav/hotel) "jf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1038,35 +995,6 @@ }, /turf/open/floor/stone, /area/ruin/space/has_grav/hotel/bar) -"jp" = ( -/obj/structure/closet/secure_closet/freezer/fridge/open, -/obj/item/food/grown/potato, -/obj/item/food/grown/potato, -/obj/item/food/grown/whitebeet, -/obj/item/food/grown/whitebeet, -/obj/item/food/grown/tomato, -/obj/item/food/grown/tomato, -/obj/item/food/grown/rice, -/obj/item/food/grown/rice, -/obj/item/food/grown/icepepper, -/obj/item/food/grown/icepepper, -/obj/item/food/grown/citrus/lemon, -/obj/item/food/grown/citrus/lime, -/obj/item/food/grown/citrus/orange, -/obj/item/food/grown/cherries, -/obj/item/food/grown/apple, -/obj/item/food/grown/ambrosia/deus, -/obj/structure/window/reinforced/survival_pod/spawner/directional/west, -/obj/item/reagent_containers/condiment/milk, -/obj/item/reagent_containers/condiment/milk, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/ruin/space/has_grav/hotel/bar) -"jq" = ( -/obj/item/reagent_containers/condiment/flour, -/obj/effect/decal/cleanable/food/flour, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/ruin/space/has_grav/hotel/bar) "js" = ( /obj/effect/turf_decal/stripes/end{ dir = 1 @@ -1090,6 +1018,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/hotel) +"jE" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/kirbyplants/organic/plant5, +/obj/structure/sign/poster/random/directional/south, +/turf/open/floor/wood/tile, +/area/ruin/space/has_grav/hotel) "jI" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -1110,13 +1046,10 @@ }, /turf/open/floor/carpet/blue, /area/ruin/space/has_grav/hotel) -"jY" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/spawner/random/vending/colavend, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/hotel/dock) +"jV" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood/tile, +/area/ruin/space/has_grav/hotel) "kd" = ( /obj/structure/tank_dispenser/oxygen, /turf/open/floor/plating, @@ -1134,24 +1067,11 @@ /obj/structure/window/fulltile, /turf/open/floor/grass, /area/ruin/space/has_grav/hotel/bar) -"km" = ( -/obj/effect/turf_decal/siding/wood, -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/hotel) "kn" = ( /obj/effect/turf_decal/siding/wood, /obj/machinery/vending/cigarette, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/hotel) -"ku" = ( -/obj/structure/chair/wood, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hotel/bar) "kw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1166,6 +1086,15 @@ dir = 1 }, /area/ruin/space/has_grav/hotel) +"kA" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/kirbyplants/organic/plant5, +/obj/structure/sign/poster/random/directional/north, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/corner{ + dir = 8 + }, +/area/ruin/space/has_grav/hotel) "kB" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -1228,10 +1157,6 @@ }, /turf/open/floor/carpet/blue, /area/ruin/space/has_grav/hotel) -"la" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hotel/bar) "le" = ( /obj/structure/fluff/tram_rail{ pixel_y = 17 @@ -1263,6 +1188,11 @@ /obj/structure/table/wood/fancy/red, /turf/open/floor/wood/parquet, /area/ruin/space/has_grav/hotel/guestroom/room_2) +"lq" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/chair, +/turf/open/floor/wood/large, +/area/ruin/space/has_grav/hotel/dock) "lr" = ( /obj/structure/fluff/tram_rail/end{ dir = 8; @@ -1270,16 +1200,6 @@ }, /turf/template_noop, /area/template_noop) -"lu" = ( -/obj/effect/turf_decal/siding/wood, -/obj/item/kirbyplants{ - icon_state = "plant-05" - }, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/iron/dark/corner{ - dir = 8 - }, -/area/ruin/space/has_grav/hotel) "lw" = ( /obj/item/storage/toolbox/mechanical, /turf/open/floor/plating, @@ -1344,6 +1264,14 @@ /obj/structure/rack, /turf/open/floor/iron/sepia, /area/ruin/space/has_grav/hotel/pool) +"mb" = ( +/obj/machinery/recharge_station, +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 1 + }, +/area/ruin/space/has_grav/hotel/workroom) "mh" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/effect/mapping_helpers/apc/cell_5k, @@ -1512,10 +1440,6 @@ }, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/hotel/dock) -"no" = ( -/obj/structure/sign/warning/no_smoking/circle/directional/north, -/turf/open/floor/wood/tile, -/area/ruin/space/has_grav/hotel) "ns" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -1568,12 +1492,6 @@ /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel) -"nQ" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/ruin/space/has_grav/hotel/dock) "nX" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -1628,23 +1546,12 @@ /obj/structure/lattice/catwalk, /turf/template_noop, /area/template_noop) -"op" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/chair/stool/directional/west, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hotel/bar) "ot" = ( /obj/structure/table/wood/fancy/red, /obj/item/paper_bin, /obj/item/pen, /turf/open/floor/wood/parquet, /area/ruin/space/has_grav/hotel/guestroom/room_2) -"oC" = ( -/obj/structure/filingcabinet, -/turf/open/floor/carpet/black, -/area/ruin/space/has_grav/hotel) "oZ" = ( /obj/machinery/atmospherics/components/tank/air{ dir = 4 @@ -1715,6 +1622,12 @@ }, /turf/template_noop, /area/ruin/space/has_grav/hotel) +"pZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/ruin/space/has_grav/hotel/dock) "qd" = ( /obj/structure/closet/l3closet/janitor, /obj/item/grenade/chem_grenade/cleaner, @@ -1776,15 +1689,6 @@ }, /turf/template_noop, /area/template_noop) -"qL" = ( -/obj/effect/turf_decal/siding/wood, -/obj/item/kirbyplants{ - icon_state = "plant-05" - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/ruin/space/has_grav/hotel) "qM" = ( /turf/open/floor/wood/parquet, /area/ruin/space/has_grav/hotel/guestroom/room_1) @@ -1808,6 +1712,29 @@ "qU" = ( /turf/open/floor/wood/parquet, /area/ruin/space/has_grav/hotel/guestroom/room_4) +"qY" = ( +/obj/structure/closet/secure_closet/freezer/fridge/open, +/obj/item/food/grown/potato, +/obj/item/food/grown/potato, +/obj/item/food/grown/whitebeet, +/obj/item/food/grown/whitebeet, +/obj/item/food/grown/tomato, +/obj/item/food/grown/tomato, +/obj/item/food/grown/rice, +/obj/item/food/grown/rice, +/obj/item/food/grown/icepepper, +/obj/item/food/grown/icepepper, +/obj/item/food/grown/citrus/lemon, +/obj/item/food/grown/citrus/lime, +/obj/item/food/grown/citrus/orange, +/obj/item/food/grown/cherries, +/obj/item/food/grown/apple, +/obj/item/food/grown/ambrosia/deus, +/obj/structure/window/reinforced/survival_pod/spawner/directional/west, +/obj/item/reagent_containers/condiment/milk, +/obj/item/reagent_containers/condiment/milk, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/ruin/space/has_grav/hotel/bar) "re" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, @@ -1832,6 +1759,12 @@ "rx" = ( /turf/open/floor/iron/showroomfloor, /area/ruin/space/has_grav/hotel/guestroom/room_1) +"rB" = ( +/obj/item/reagent_containers/condiment/flour, +/obj/effect/decal/cleanable/food/flour, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/ruin/space/has_grav/hotel/bar) "rM" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -1920,6 +1853,13 @@ /obj/structure/window/reinforced/survival_pod/spawner/directional/west, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/hotel/bar) +"sM" = ( +/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/random/directional/north, +/turf/open/floor/wood, +/area/ruin/space/has_grav/hotel/bar) "sP" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -1953,15 +1893,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/hotel) -"td" = ( -/obj/structure/chair/comfy{ - dir = 4 - }, -/obj/structure/sign/poster/random/directional/west, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/ruin/space/has_grav/hotel) "ti" = ( /obj/structure/railing/corner{ dir = 8 @@ -2010,6 +1941,11 @@ }, /turf/open/floor/wood/tile, /area/ruin/space/has_grav/hotel) +"ua" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/light/small/directional/south, +/turf/open/floor/stone, +/area/ruin/space/has_grav/hotel/bar) "uf" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/iron/showroomfloor, @@ -2036,12 +1972,6 @@ /obj/structure/sign/warning/vacuum, /turf/closed/wall, /area/ruin/space/has_grav/hotel) -"uw" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/chair, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/hotel/dock) "uG" = ( /obj/structure/chair/comfy{ dir = 8 @@ -2169,14 +2099,6 @@ /obj/item/soap, /turf/open/floor/iron/showroomfloor, /area/ruin/space/has_grav/hotel/guestroom/room_5) -"vX" = ( -/obj/machinery/recharge_station, -/obj/machinery/light/directional/north, -/obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 1 - }, -/area/ruin/space/has_grav/hotel/workroom) "vY" = ( /obj/machinery/button{ id = "hcb1"; @@ -2199,11 +2121,6 @@ /obj/structure/chair/sofa/corp/right, /turf/open/floor/carpet/blue, /area/ruin/space/has_grav/hotel) -"wd" = ( -/obj/machinery/light/directional/east, -/obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/carpet/black, -/area/ruin/space/has_grav/hotel) "wf" = ( /turf/open/floor/carpet/lone, /area/ruin/space/has_grav/hotel/guestroom/room_1) @@ -2260,6 +2177,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/parquet, /area/ruin/space/has_grav/hotel/guestroom/room_4) +"wE" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/kirbyplants/organic/plant5, +/turf/open/floor/wood/tile, +/area/ruin/space/has_grav/hotel) "wI" = ( /obj/structure/lattice/catwalk, /turf/template_noop, @@ -2280,11 +2202,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/carpet/blue, /area/ruin/space/has_grav/hotel) -"wT" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/turf/open/space/basic, -/area/ruin/space/has_grav/hotel) "wW" = ( /obj/structure/chair/plastic, /obj/structure/cable, @@ -2361,16 +2278,10 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/hotel/pool) -"xq" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/item/kirbyplants{ - icon_state = "plant-05" - }, -/obj/structure/sign/poster/random/directional/south, -/turf/open/floor/wood/tile, -/area/ruin/space/has_grav/hotel) +"xr" = ( +/obj/structure/dresser, +/turf/open/floor/wood/parquet, +/area/ruin/space/has_grav/hotel/guestroom/room_4) "xs" = ( /obj/machinery/door/airlock/freezer{ name = "Freezer" @@ -2380,6 +2291,10 @@ dir = 4 }, /area/ruin/space/has_grav/hotel/bar) +"xA" = ( +/obj/structure/filingcabinet, +/turf/open/floor/wood/tile, +/area/ruin/space/has_grav/hotel) "xB" = ( /obj/effect/turf_decal/siding/wood, /obj/effect/turf_decal/siding/wood{ @@ -2424,12 +2339,6 @@ dir = 8 }, /area/ruin/space/has_grav/hotel) -"ya" = ( -/obj/item/kirbyplants{ - icon_state = "plant-06" - }, -/turf/open/floor/iron/sepia, -/area/ruin/space/has_grav/hotel/pool) "yd" = ( /obj/structure/window/reinforced/survival_pod/spawner/directional/west, /obj/structure/table/reinforced, @@ -2450,6 +2359,13 @@ }, /turf/open/floor/carpet/blue, /area/ruin/space/has_grav/hotel) +"yj" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/kirbyplants/organic/plant16, +/turf/open/floor/carpet/blue, +/area/ruin/space/has_grav/hotel) "yl" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/cable, @@ -2500,6 +2416,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/ruin/space/has_grav/hotel) +"yN" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/iron/grimy, +/area/ruin/space/has_grav/hotel/bar) "yR" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/wood/corner{ @@ -2507,6 +2427,10 @@ }, /turf/open/floor/wood/tile, /area/ruin/space/has_grav/hotel) +"yU" = ( +/obj/item/kirbyplants/organic/plant3, +/turf/open/floor/iron/freezer, +/area/ruin/space/has_grav/hotel/pool) "yV" = ( /obj/structure/lattice, /turf/template_noop, @@ -2546,15 +2470,6 @@ dir = 8 }, /area/ruin/space/has_grav/hotel/bar) -"zC" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/item/kirbyplants{ - icon_state = "plant-05" - }, -/turf/open/floor/wood/tile, -/area/ruin/space/has_grav/hotel) "zJ" = ( /obj/structure/sign/poster/random/directional/north, /turf/open/floor/wood/tile, @@ -2646,6 +2561,14 @@ }, /turf/open/floor/wood/parquet, /area/ruin/space/has_grav/hotel/guestroom/room_1) +"BD" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/kirbyplants/organic/plant5, +/obj/machinery/light/directional/east, +/turf/open/floor/wood/tile, +/area/ruin/space/has_grav/hotel) "BH" = ( /obj/structure/table/reinforced, /obj/item/storage/fancy/egg_box, @@ -2671,6 +2594,13 @@ /obj/structure/cable, /turf/open/floor/circuit/green, /area/ruin/space/has_grav/hotel) +"Cg" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/kirbyplants/organic/plant5, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/ruin/space/has_grav/hotel) "Cl" = ( /turf/template_noop, /area/template_noop) @@ -2686,6 +2616,16 @@ }, /turf/open/floor/iron/sepia, /area/ruin/space/has_grav/hotel/pool) +"Cv" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/obj/item/kirbyplants/organic/plant5, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/ruin/space/has_grav/hotel) "Cw" = ( /turf/open/floor/plating, /area/ruin/space/has_grav/hotel/power) @@ -2774,24 +2714,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/stone, /area/ruin/space/has_grav/hotel/bar) -"DF" = ( -/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/ruin/space/has_grav/hotel/dock) -"DI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/ruin/space/has_grav/hotel/bar) "DK" = ( /turf/open/water/beach, /area/ruin/space/has_grav/hotel/pool) -"DO" = ( -/obj/effect/turf_decal/loading_area, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/hotel/dock) "DP" = ( /obj/machinery/shower/directional/east, /obj/item/bikehorn/rubberducky, @@ -2815,6 +2740,17 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/dark/side, /area/ruin/space/has_grav/hotel/dock) +"Ef" = ( +/obj/structure/sign/warning/no_smoking/circle/directional/north, +/obj/machinery/light/directional/north, +/turf/open/floor/wood/tile, +/area/ruin/space/has_grav/hotel) +"Eg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood, +/area/ruin/space/has_grav/hotel/bar) "El" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/wood, @@ -2861,6 +2797,10 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/wood/tile, /area/ruin/space/has_grav/hotel) +"EE" = ( +/obj/item/kirbyplants/organic/plant6, +/turf/open/floor/iron/sepia, +/area/ruin/space/has_grav/hotel/pool) "EJ" = ( /obj/structure/table/wood/fancy/purple, /obj/item/paper_bin, @@ -2930,6 +2870,11 @@ /obj/structure/closet/emcloset, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel) +"Fo" = ( +/obj/structure/chair/wood, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron/grimy, +/area/ruin/space/has_grav/hotel/bar) "Ft" = ( /obj/machinery/door/airlock/external/glass, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -3021,15 +2966,6 @@ }, /turf/open/floor/carpet/royalblue, /area/ruin/space/has_grav/hotel/guestroom/room_4) -"Gi" = ( -/obj/machinery/light/directional/north, -/obj/item/kirbyplants{ - icon_state = "plant-05" - }, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/ruin/space/has_grav/hotel) "Gp" = ( /turf/closed/wall, /area/ruin/space/has_grav/hotel/workroom) @@ -3062,6 +2998,13 @@ dir = 1 }, /area/ruin/space/has_grav/hotel) +"GF" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/kirbyplants/organic/plant13, +/turf/open/floor/wood/large, +/area/ruin/space/has_grav/hotel/dock) "Hb" = ( /obj/effect/turf_decal/siding/wood, /obj/machinery/computer/teleporter, @@ -3098,17 +3041,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel) -"Hy" = ( -/obj/item/kirbyplants{ - icon_state = "plant-05" - }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/ruin/space/has_grav/hotel) "Hz" = ( /obj/effect/turf_decal/siding/white{ dir = 8 @@ -3160,14 +3092,12 @@ dir = 1 }, /area/ruin/space/has_grav/hotel/dock) -"Ib" = ( -/obj/item/kirbyplants{ - icon_state = "plant-16" - }, -/obj/structure/sign/poster/random/directional/north, -/obj/structure/sign/poster/random/directional/west, -/turf/open/floor/carpet/blue, -/area/ruin/space/has_grav/hotel) +"HZ" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/teleport/hub, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood/large, +/area/ruin/space/has_grav/hotel/dock) "Ic" = ( /obj/structure/lattice/catwalk, /turf/open/floor/plating/airless, @@ -3180,6 +3110,10 @@ /obj/structure/marker_beacon/burgundy, /turf/template_noop, /area/template_noop) +"Ig" = ( +/obj/structure/sign/warning/no_smoking/circle/directional/north, +/turf/open/floor/iron/grimy, +/area/ruin/space/has_grav/hotel/bar) "Ij" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3192,6 +3126,11 @@ /obj/structure/grille/broken, /turf/template_noop, /area/template_noop) +"Iq" = ( +/obj/item/kirbyplants/organic/plant16, +/obj/structure/sign/poster/random/directional/west, +/turf/open/floor/carpet/blue, +/area/ruin/space/has_grav/hotel) "Is" = ( /obj/effect/turf_decal/siding/yellow/end{ dir = 1 @@ -3282,10 +3221,6 @@ }, /turf/open/floor/wood/tile, /area/ruin/space/has_grav/hotel) -"JQ" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hotel/bar) "JR" = ( /obj/effect/turf_decal/siding/white/corner{ dir = 8 @@ -3387,31 +3322,22 @@ /obj/item/bedsheet/red, /turf/open/floor/carpet/green, /area/ruin/space/has_grav/hotel/guestroom/room_2) -"LS" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/obj/item/kirbyplants{ - icon_state = "plant-05" - }, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, +"LR" = ( +/obj/structure/filingcabinet, +/obj/machinery/light/directional/west, +/turf/open/floor/carpet/black, /area/ruin/space/has_grav/hotel) "LZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel/power) -"Mi" = ( -/obj/machinery/light/directional/north, -/obj/structure/chair/comfy{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 8 +"Me" = ( +/obj/structure/chair/wood{ + dir = 1 }, -/area/ruin/space/has_grav/hotel) +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/grimy, +/area/ruin/space/has_grav/hotel/bar) "Ml" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -3485,6 +3411,11 @@ }, /turf/open/floor/carpet/green, /area/ruin/space/has_grav/hotel/guestroom/room_2) +"Ne" = ( +/obj/effect/turf_decal/loading_area, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/hotel/dock) "Nl" = ( /obj/machinery/door/airlock{ name = "Bathroom" @@ -3648,24 +3579,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/showroomfloor, /area/ruin/space/has_grav/hotel/guestroom/room_6) -"Pw" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/item/kirbyplants{ - icon_state = "plant-16" - }, -/turf/open/floor/carpet/blue, -/area/ruin/space/has_grav/hotel) -"PB" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/item/kirbyplants{ - icon_state = "plant-03" - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/hotel) "PD" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3700,6 +3613,14 @@ /obj/structure/closet, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel) +"PS" = ( +/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, +/turf/open/floor/iron, +/area/ruin/space/has_grav/hotel) "PW" = ( /obj/structure/railing/corner{ dir = 1 @@ -3782,6 +3703,12 @@ /obj/effect/turf_decal/siding/white, /turf/open/floor/iron/sepia, /area/ruin/space/has_grav/hotel/pool) +"QR" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/structure/sign/poster/contraband/random/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark/smooth_edge, +/area/ruin/space/has_grav/hotel/workroom) "QS" = ( /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ dir = 4 @@ -3798,16 +3725,6 @@ }, /turf/open/floor/carpet/blue, /area/ruin/space/has_grav/hotel) -"Rf" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/item/kirbyplants{ - icon_state = "plant-16" - }, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/carpet/blue, -/area/ruin/space/has_grav/hotel) "Rg" = ( /turf/open/floor/iron/dark, /area/ruin/space/has_grav/hotel) @@ -3864,6 +3781,15 @@ /obj/structure/railing, /turf/template_noop, /area/ruin/space/has_grav/hotel) +"RQ" = ( +/obj/item/kirbyplants/organic/plant5, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/ruin/space/has_grav/hotel) "RR" = ( /obj/structure/window/spawner/directional/south, /obj/machinery/shower/directional/south, @@ -3892,11 +3818,6 @@ "Sf" = ( /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/hotel/pool) -"Sg" = ( -/obj/structure/filingcabinet, -/obj/machinery/light/directional/west, -/turf/open/floor/wood/tile, -/area/ruin/space/has_grav/hotel) "Sh" = ( /obj/effect/turf_decal/siding/white/corner{ dir = 1 @@ -3954,6 +3875,14 @@ dir = 8 }, /area/ruin/space/has_grav/hotel/workroom) +"Td" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/chair/stool/directional/west, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/grimy, +/area/ruin/space/has_grav/hotel/bar) "Tm" = ( /obj/machinery/oven/range, /obj/structure/sign/warning/no_smoking/circle/directional/north, @@ -4049,14 +3978,11 @@ dir = 1 }, /area/ruin/space/has_grav/hotel/dock) -"Ug" = ( -/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/machinery/light/directional/east, -/turf/open/floor/iron, +"Uj" = ( +/obj/item/kirbyplants/organic/plant16, +/obj/structure/sign/poster/random/directional/north, +/obj/structure/sign/poster/random/directional/west, +/turf/open/floor/carpet/blue, /area/ruin/space/has_grav/hotel) "Um" = ( /obj/effect/turf_decal/siding/wood{ @@ -4069,6 +3995,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/stone, /area/ruin/space/has_grav/hotel/bar) +"Uo" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/kirbyplants/organic/plant5, +/obj/machinery/airalarm/directional/north, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark/corner, +/area/ruin/space/has_grav/hotel) "Up" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -4085,7 +4018,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/turf/open/space/basic, +/turf/open/floor/plating, /area/ruin/space/has_grav/hotel/power) "UD" = ( /obj/effect/turf_decal/stripes/end, @@ -4106,11 +4039,6 @@ }, /turf/open/floor/iron/showroomfloor, /area/ruin/space/has_grav/hotel/guestroom/room_4) -"UL" = ( -/obj/effect/turf_decal/siding/wood, -/obj/machinery/teleport/hub, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/hotel/dock) "UO" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -4258,6 +4186,12 @@ dir = 1 }, /area/ruin/space/has_grav/hotel/dock) +"Wz" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/kirbyplants/organic/applebush, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/hotel) "WD" = ( /turf/closed/wall, /area/ruin/space/has_grav/hotel) @@ -4346,6 +4280,10 @@ }, /turf/open/floor/wood/tile, /area/ruin/space/has_grav/hotel) +"Xt" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/iron/grimy, +/area/ruin/space/has_grav/hotel/bar) "Xw" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -4453,22 +4391,16 @@ /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/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, -/area/ruin/space/has_grav/hotel) -"YC" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 +"Yx" = ( +/obj/structure/chair/comfy{ + dir = 4 }, -/obj/item/kirbyplants{ - icon_state = "plant-13" +/obj/structure/sign/poster/random/directional/west, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark/side{ + dir = 4 }, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/hotel/dock) +/area/ruin/space/has_grav/hotel) "YE" = ( /obj/structure/table/wood/fancy/royalblue, /obj/item/paper_bin, @@ -4478,6 +4410,16 @@ /obj/item/pen, /turf/open/floor/carpet/orange, /area/ruin/space/has_grav/hotel/guestroom/room_6) +"YI" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/light/small/directional/east, +/obj/item/kirbyplants/organic/plant5, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/ruin/space/has_grav/hotel) "YL" = ( /obj/structure/cable, /obj/effect/spawner/random/maintenance, @@ -4557,14 +4499,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/tile, /area/ruin/space/has_grav/hotel) -"Zv" = ( -/obj/effect/turf_decal/siding/wood, -/obj/item/kirbyplants{ - icon_state = "plant-05" - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/dark/corner, -/area/ruin/space/has_grav/hotel) "ZA" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -5279,11 +5213,11 @@ Cl Cl Cl Ki -op +Td it id it -iI +ua Ki yV ii @@ -5347,8 +5281,8 @@ yV LD XB XB -Ki -Ki +XB +XB XB XB Ki @@ -5360,8 +5294,8 @@ iJ Ki XB XB -Ki -Ki +XB +XB XB XB Ki @@ -5420,8 +5354,8 @@ LD LD Mn OJ -gw -ku +VS +Mn OJ gu Ki @@ -5433,8 +5367,8 @@ vL Ki Df OJ -gw -ku +VS +Mn OJ VS Ki @@ -5480,7 +5414,7 @@ Gs Gs xh xI -bV +wE cf rr cf @@ -5491,7 +5425,7 @@ gt gt Bl LD -JQ +Xt Ex Ex Ex @@ -5509,7 +5443,7 @@ Ex Ex Ex Ex -la +yN Ki Wr pN @@ -5564,7 +5498,7 @@ AG hN mF LD -eK +Fo OJ VS Mn @@ -5582,7 +5516,7 @@ OJ VS Mn OJ -VS +Me WD Ru QN @@ -5637,7 +5571,7 @@ lZ hO sw LD -Ex +Ig Ex KN dr @@ -5772,11 +5706,11 @@ mM mP Gz xI -bV +wE cf PF cf -xq +jE LD Yh Ts @@ -5859,7 +5793,7 @@ LD Em Fj Ki -bs +sM wb kk Ki @@ -5869,11 +5803,11 @@ if iy Ew iU -jp +qY Ki kk zb -TH +kM WD re QN @@ -5919,7 +5853,7 @@ tw tw tw WD -lL +cf mq TR WD @@ -5942,7 +5876,7 @@ BH qO Ew xs -jq +rB Ki kk zb @@ -6005,7 +5939,7 @@ WD PI YZ Ki -DI +Eg zb kk Ki @@ -6019,7 +5953,7 @@ wX Ki kk zb -kM +TH WD dO WD @@ -6065,7 +5999,7 @@ tw cc xI WD -cf +lL iM cf WD @@ -6163,7 +6097,7 @@ ul dk VP Gp -km +Wz mR HU nf @@ -6228,13 +6162,13 @@ iQ lK ho Gp -vX +mb gG Is iA vz iW -ep +QR Gp kn mR @@ -6299,7 +6233,7 @@ PI WD vG mR -PB +aF Gp Lg Vs @@ -6322,10 +6256,10 @@ eZ xj JY HV -JY HV JY HV +HV JY cN Cl @@ -6359,7 +6293,7 @@ Id WD Fa pG -eb +cf WD Wq dd @@ -6388,17 +6322,17 @@ qF JY JY JY -aE +yU Sf -aE +yU JY JY JY DK -HI DK HI DK +DK JY cN Cl @@ -6443,18 +6377,18 @@ vy PI WD WD -de +iX mR WD -Ib +Uj NB TX -Sg +xA mR -Sg +xA El nY -fT +Iq WD zJ qF @@ -6506,7 +6440,7 @@ eg cf PF cf -xq +jE vy hL An @@ -6530,7 +6464,7 @@ jt jR Ez mR -Yy +qF JY yD bK @@ -6590,7 +6524,7 @@ YZ WD iq iX -mR +je WD AO jt @@ -6602,7 +6536,7 @@ ol jt wP WD -no +Ef qF JY JY @@ -6678,7 +6612,7 @@ Ez mR rk WD -oC +LR Za WD gW @@ -6716,7 +6650,7 @@ yV WD PI WD -fY +xr qU rN wB @@ -6746,7 +6680,7 @@ iY iY hY ag -aU +jR WD ED Hg @@ -6794,11 +6728,11 @@ SG SG yw Hm -bV +wE cf PF cf -zC +BD vy Ws zO @@ -6811,7 +6745,7 @@ AS NU mR WD -cl +wc Zm MJ mR @@ -6830,7 +6764,7 @@ MN WD yV JY -wW +MD Cu DK DK @@ -6897,13 +6831,13 @@ Ez mR qF WD -wd +gB rW MN WD yV JY -MD +wW ti CG CG @@ -6940,14 +6874,14 @@ oZ oZ gr QN -Zv +Uo cf mq cf -LS +Cv WD -Gi -td +gD +Yx YY vH La @@ -6957,7 +6891,7 @@ La og SD WD -Rf +aP iY iY iY @@ -6965,7 +6899,7 @@ iY iY iY iY -Pw +yj Xh SD bM @@ -7025,11 +6959,11 @@ dj KS YS AU -yH mR -NU mR +NU mR +yH mR mR AU @@ -7039,13 +6973,13 @@ mR Rp mR mR -mR +yH mR qF mR AU mR -mR +jV Xj mR Oc @@ -7106,7 +7040,7 @@ hb hb vY qF -bz +qF pJ qF qF @@ -7117,7 +7051,7 @@ qF qF qF qF -bz +qF qF qF PM @@ -7159,16 +7093,16 @@ dh CH be QN -lu +kA cf pG cf -fc +YI WD -Mi +iG xZ uG -qL +Cg WD nP WD @@ -7182,7 +7116,7 @@ FX WD WD ZA -Ug +PS Xy WD WD @@ -7270,12 +7204,12 @@ Cl JY JY Rn +Rn +EE uI -ya Rn Rn -uI -ya +EE JY JY Cl @@ -7305,11 +7239,11 @@ ot EP hq Ff -bV +wE cf PF cf -zC +bP BK by Hn @@ -7328,7 +7262,7 @@ Ct VV VV iP -DF +jf jy VV VV @@ -7343,12 +7277,12 @@ Cl Cl JY HV -JY -HV HV HV JY HV +HV +HV JY Cl Cl @@ -7403,7 +7337,7 @@ zr nw jf Sj -jY +aD nX Cl Cl @@ -7472,7 +7406,7 @@ hZ hZ hZ LB -DO +Ne iP jf FT @@ -7597,7 +7531,7 @@ RH LI LI Ff -bV +wE cf PF cf @@ -7618,11 +7552,11 @@ mO hZ hZ VV -uw +ap iP jf FT -YC +GF nX Cl Cl @@ -7691,7 +7625,7 @@ hE xd hZ VV -iE +lq iP jf FT @@ -7746,7 +7680,7 @@ wK sK cf mq -eb +cf WD rx Zl @@ -7912,7 +7846,7 @@ PI PI TY iP -jf +pZ fN Zf QE @@ -7966,7 +7900,7 @@ sK cf iM cf -Hy +RQ WD WD nP @@ -8202,7 +8136,7 @@ Cl Cl Cl nX -UL +HZ dM jf hh @@ -8236,11 +8170,11 @@ Qy ak ak ak -wT ak -wT ak -wT +ak +ak +ak ak yV ak @@ -8276,7 +8210,7 @@ yV yV VV VV -nQ +lI xS FT VV diff --git a/_maps/RandomRuins/SpaceRuins/spinwardsmoothies.dmm b/_maps/RandomRuins/SpaceRuins/spinwardsmoothies.dmm index d3ca2e27e3772..91f7771f0ea69 100644 --- a/_maps/RandomRuins/SpaceRuins/spinwardsmoothies.dmm +++ b/_maps/RandomRuins/SpaceRuins/spinwardsmoothies.dmm @@ -1,12 +1,4 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/grass, -/area/ruin/space/has_grav/spinwardsmoothies) -"dq" = ( -/mob/living/basic/butterfly, -/turf/open/floor/grass, -/area/ruin/space/has_grav/spinwardsmoothies) "dD" = ( /obj/structure/billboard/smoothies{ pixel_y = 14 @@ -23,21 +15,25 @@ smoothing_flags = 0 }, /area/ruin/space/has_grav/spinwardsmoothies) +"qR" = ( +/obj/structure/flora/bush/flowers_br/style_random, +/mob/living/basic/butterfly, +/turf/open/floor/grass, +/area/ruin/space/has_grav/spinwardsmoothies) "qT" = ( /obj/machinery/door/airlock/external/ruin, /obj/structure/fans/tiny, /turf/open/floor/iron/dark/textured, /area/ruin/space/has_grav/spinwardsmoothies) -"rf" = ( -/obj/structure/flora/bush/flowers_br/style_random, -/mob/living/basic/butterfly, -/turf/open/floor/grass, -/area/ruin/space/has_grav/spinwardsmoothies) "ri" = ( /obj/machinery/light/directional/east, /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, /area/ruin/space/has_grav/spinwardsmoothies) +"sG" = ( +/mob/living/basic/butterfly, +/turf/open/floor/grass, +/area/ruin/space/has_grav/spinwardsmoothies) "sJ" = ( /obj/structure/flora/rock/pile/jungle/large/style_random, /turf/open/floor/grass, @@ -53,11 +49,16 @@ }, /turf/open/floor/wood/tile, /area/ruin/space/has_grav/spinwardsmoothies) -"uX" = ( +"wv" = ( /obj/structure/flora/bush/flowers_pp/style_random, /mob/living/basic/butterfly, /turf/open/floor/grass, /area/ruin/space/has_grav/spinwardsmoothies) +"wH" = ( +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/machinery/light/directional/south, +/turf/open/floor/grass, +/area/ruin/space/has_grav/spinwardsmoothies) "xc" = ( /obj/structure/table/wood, /obj/machinery/light/directional/south, @@ -86,21 +87,6 @@ "AW" = ( /turf/open/floor/grass, /area/ruin/space/has_grav/spinwardsmoothies) -"CK" = ( -/obj/structure/flora/bush/flowers_br/style_random, -/obj/machinery/light/directional/south, -/turf/open/floor/grass, -/area/ruin/space/has_grav/spinwardsmoothies) -"CV" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/siding/thinplating/terracotta{ - dir = 8 - }, -/obj/machinery/hydroponics/constructable, -/turf/open/floor/bamboo{ - smoothing_flags = 0 - }, -/area/ruin/space/has_grav/spinwardsmoothies) "Dh" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/thinplating/terracotta{ @@ -135,10 +121,24 @@ /obj/effect/turf_decal/siding/thinplating/terracotta/corner, /turf/open/floor/bamboo, /area/ruin/space/has_grav/spinwardsmoothies) +"EL" = ( +/obj/structure/flora/bush/flowers_yw/style_random, +/mob/living/basic/butterfly, +/turf/open/floor/grass, +/area/ruin/space/has_grav/spinwardsmoothies) "Gd" = ( /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, /area/ruin/space/has_grav/spinwardsmoothies) +"Jw" = ( +/obj/effect/turf_decal/siding/thinplating/terracotta{ + dir = 8 + }, +/obj/machinery/hydroponics/constructable, +/turf/open/floor/bamboo{ + smoothing_flags = 0 + }, +/area/ruin/space/has_grav/spinwardsmoothies) "JG" = ( /obj/structure/table/wood/fancy, /obj/machinery/reagentgrinder, @@ -147,10 +147,6 @@ }, /turf/open/floor/bamboo, /area/ruin/space/has_grav/spinwardsmoothies) -"KV" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/grass, -/area/ruin/space/has_grav/spinwardsmoothies) "OI" = ( /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, @@ -188,10 +184,13 @@ "TE" = ( /turf/closed/wall/mineral/wood, /area/ruin/space/has_grav/spinwardsmoothies) -"UZ" = ( -/obj/structure/flora/bush/flowers_yw/style_random, -/mob/living/basic/butterfly, -/turf/open/floor/grass, +"Ws" = ( +/obj/structure/hedge{ + pixel_y = 8 + }, +/obj/effect/turf_decal/siding/thinplating/terracotta, +/obj/machinery/light/directional/north, +/turf/open/floor/wood/tile, /area/ruin/space/has_grav/spinwardsmoothies) "XG" = ( /obj/machinery/hydroponics/constructable, @@ -470,11 +469,11 @@ Qi Qi TE TE -aa +AW AW Gd -uX -KV +wv +AW TE TE TE @@ -490,7 +489,7 @@ YB Qi Qi TE -Zs +Ws OI AW AW @@ -498,7 +497,7 @@ AW Pk AW Gd -Pk +wH TE Qi Qi @@ -512,7 +511,7 @@ Qi Qi TE Zs -dq +sG AW sJ AW @@ -559,7 +558,7 @@ Pk AW OI AW -UZ +EL AW Gd AW @@ -583,7 +582,7 @@ Pk Gd Pk AW -CK +Gd TE Qi Qi @@ -597,7 +596,7 @@ Qi TE Zs Gd -rf +qR AW xy QG @@ -686,7 +685,7 @@ TE ti Sz XG -CV +Jw mR Sz DA diff --git a/_maps/RandomRuins/SpaceRuins/the_faceoff.dmm b/_maps/RandomRuins/SpaceRuins/the_faceoff.dmm index 28d75f3d455d3..2560cefa8a102 100644 --- a/_maps/RandomRuins/SpaceRuins/the_faceoff.dmm +++ b/_maps/RandomRuins/SpaceRuins/the_faceoff.dmm @@ -16,10 +16,6 @@ }, /turf/open/floor/mineral/plastitanium/airless, /area/ruin/space) -"am" = ( -/obj/structure/sign/poster/contraband/random/directional/east, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/space) "ap" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/fuel_pool, @@ -46,8 +42,8 @@ /turf/open/floor/iron/dark/smooth_large/airless, /area/ruin/space) "bz" = ( -/turf/open/space/basic, -/area/space) +/turf/template_noop, +/area/template_noop) "bM" = ( /obj/item/ammo_casing/a357/spent{ dir = 1; @@ -185,10 +181,9 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium/airless, /area/ruin/space) -"fl" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/iron/dark/smooth_large/airless, +"fa" = ( +/obj/structure/sign/poster/contraband/interdyne_gene_clinics, +/turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/space) "fO" = ( /obj/structure/table/reinforced/plastitaniumglass, @@ -236,19 +231,9 @@ /obj/effect/decal/remains/human, /turf/open/floor/iron/dark/airless, /area/ruin/space) -"gy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/space) "gN" = ( /turf/open/floor/mineral/plastitanium/red/airless, /area/ruin/space) -"gR" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/mapping_helpers/broken_floor, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/space) "hl" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/mapping_helpers/burnt_floor, @@ -344,18 +329,14 @@ }, /turf/open/floor/mineral/plastitanium/red/airless, /area/ruin/space) -"ka" = ( -/turf/open/space/basic, -/area/template_noop) -"kC" = ( -/obj/structure/cable, +"jZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/stack/sheet/mineral/wood/fifty, +/obj/machinery/light/dim/directional/west, /turf/open/floor/iron/dark/airless, /area/ruin/space) -"ll" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim{ - dir = 1 - }, +"kC" = ( +/obj/structure/cable, /turf/open/floor/iron/dark/airless, /area/ruin/space) "lX" = ( @@ -438,12 +419,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/misc/asteroid/basalt/airless, /area/ruin/space) -"qL" = ( -/obj/machinery/light/dim{ - dir = 1 - }, -/turf/open/floor/iron/dark/airless, -/area/ruin/space) "qO" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/decal/cleanable/fuel_pool, @@ -474,6 +449,10 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium/airless, /area/ruin/space) +"rG" = ( +/obj/structure/sign/poster/official/moth_meth, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/space) "rU" = ( /obj/effect/mapping_helpers/broken_floor, /obj/item/ammo_casing/a357/spent{ @@ -525,11 +504,6 @@ /obj/effect/turf_decal/stripes/red/full, /turf/open/floor/iron/dark/smooth_large/airless, /area/ruin/space) -"td" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/official/moth_meth, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/space) "tm" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/gun/energy/laser/chameleon, @@ -561,10 +535,6 @@ }, /turf/open/floor/mineral/plastitanium/red/airless, /area/ruin/space) -"uq" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/space) "vl" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -696,12 +666,6 @@ /obj/effect/gibspawner/human, /turf/open/floor/iron/dark/textured/airless, /area/ruin/space) -"AE" = ( -/obj/machinery/light/dim{ - dir = 1 - }, -/turf/open/floor/mineral/plastitanium/airless, -/area/ruin/space) "AV" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -728,11 +692,6 @@ }, /turf/open/floor/iron/dark/airless, /area/ruin/space) -"Cp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/contraband/interdyne_gene_clinics, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/space) "Cv" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/end{ @@ -776,7 +735,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/full, -/mob/living/simple_animal/hostile/mining_drone, +/mob/living/basic/mining_drone, /obj/item/grenade/c4, /turf/open/misc/asteroid/basalt/airless, /area/ruin/space) @@ -917,6 +876,10 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium/airless, /area/ruin/space) +"JF" = ( +/obj/machinery/light/dim/directional/east, +/turf/open/floor/mineral/plastitanium/airless, +/area/ruin/space) "JP" = ( /obj/item/ammo_casing/a357/spent{ pixel_x = 2; @@ -1032,16 +995,6 @@ /obj/structure/barricade/wooden, /turf/open/floor/iron/dark/airless, /area/ruin/space) -"Pb" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/blood, -/turf/closed/wall/mineral/titanium, -/area/ruin/space) -"Ph" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/mineral/asteroid, -/area/ruin/space) "Pi" = ( /obj/effect/decal/cleanable/dirt, /turf/open/misc/asteroid/basalt/airless, @@ -1052,10 +1005,8 @@ /obj/effect/decal/cleanable/blood, /turf/open/floor/mineral/plastitanium/airless, /area/ruin/space) -"QN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/contraband/soviet_propaganda, -/turf/closed/wall/mineral/plastitanium/nodiagonal, +"Qx" = ( +/turf/open/floor/iron/dark/smooth_large/airless, /area/ruin/space) "Rt" = ( /obj/item/wallframe/firealarm, @@ -1150,14 +1101,6 @@ /obj/item/paperplane/syndicate, /turf/open/floor/mineral/plastitanium/airless, /area/ruin/space) -"UV" = ( -/obj/item/ammo_casing/a357/spent{ - dir = 8; - pixel_x = 2; - pixel_y = 1 - }, -/turf/open/floor/iron/dark/airless, -/area/ruin/space) "Vn" = ( /obj/item/ammo_casing/a357/spent{ dir = 4; @@ -1215,12 +1158,6 @@ }, /turf/open/floor/mineral/plastitanium/airless, /area/ruin/space) -"VQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/sheet/mineral/wood/fifty, -/obj/machinery/light/dim, -/turf/open/floor/iron/dark/airless, -/area/ruin/space) "VX" = ( /obj/structure/sign/poster/contraband/bountyhunters, /turf/closed/wall/mineral/plastitanium/nodiagonal, @@ -1321,6 +1258,15 @@ "ZO" = ( /turf/open/floor/mineral/plastitanium/airless, /area/ruin/space) +"ZP" = ( +/obj/item/ammo_casing/a357/spent{ + dir = 8; + pixel_x = 2; + pixel_y = 1 + }, +/obj/machinery/light/dim/directional/east, +/turf/open/floor/iron/dark/airless, +/area/ruin/space) "ZS" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -1328,12 +1274,6 @@ }, /turf/open/misc/asteroid/basalt/airless, /area/ruin/space) -"ZZ" = ( -/obj/machinery/light/dim{ - dir = 1 - }, -/turf/open/floor/iron/dark/textured/airless, -/area/ruin/space) (1,1,1) = {" bz @@ -1465,11 +1405,11 @@ bz bz bz bz -ka -ka -ka -ka -ka +bz +bz +bz +bz +bz bz bz bz @@ -1495,18 +1435,18 @@ bz bz bz bz -ka -ka -ka -ka -ka bz -ka -ka +bz +bz +bz +bz +bz +bz +bz Er Er Er -ka +bz bz bz bz @@ -1531,23 +1471,23 @@ bz bz bz bz -ka -ka +bz +bz Er Er Er -ka -ka -ka +bz +bz +bz Er Er Er Er -ka -ka -ka -ka -ka +bz +bz +bz +bz +bz bz bz bz @@ -1567,14 +1507,14 @@ bz bz bz bz -ka -ka +bz +bz Er Er Er Er Er -ka +bz Er Er Er @@ -1584,8 +1524,8 @@ Er Er Er Er -ka -ka +bz +bz bz bz bz @@ -1603,8 +1543,8 @@ bz bz bz bz -ka -ka +bz +bz Er Er Er @@ -1618,11 +1558,11 @@ Er Er Er Er -uq +ED ED Er Er -ka +bz bz bz bz @@ -1639,8 +1579,8 @@ bz bz bz bz -ka -ka +bz +bz Er Er Er @@ -1656,10 +1596,10 @@ YJ eh eo so -uq +ED ED Er -ka +bz bz bz bz @@ -1674,9 +1614,9 @@ bz bz bz bz -ka -ka -ka +bz +bz +bz Er ED Er @@ -1685,18 +1625,18 @@ cA pL az qT -VQ +jZ +ED +ED ED -zx -gR Fk vl oe Ck fR -QN +xT Er -ka +bz bz bz bz @@ -1710,8 +1650,8 @@ bz bz bz bz -ka -ka +bz +bz Er Er Er @@ -1733,7 +1673,7 @@ yx Dm Er Er -ka +bz bz bz bz @@ -1745,9 +1685,9 @@ bz (12,1,1) = {" bz bz -ka -ka -ka +bz +bz +bz Er Er ED @@ -1766,11 +1706,11 @@ UM UM gq ED -td -uq -uq +rG +ED +ED Er -ka +bz bz bz bz @@ -1781,15 +1721,15 @@ bz "} (13,1,1) = {" bz -ka -ka +bz +bz Er Er Er ED ED -uq -ll +ED +Tu BV Tu Tu @@ -1807,7 +1747,7 @@ Er Er Er Er -ka +bz bz bz bz @@ -1818,12 +1758,12 @@ bz "} (14,1,1) = {" bz -ka +bz Er Er Er Er -gy +ED lX xm ZC @@ -1842,9 +1782,9 @@ vZ xT Er Er -ka -ka -ka +bz +bz +bz bz bz bz @@ -1855,10 +1795,10 @@ bz "} (15,1,1) = {" bz -ka +bz +Er Er Er -Ph sk XQ Gi @@ -1878,9 +1818,9 @@ je ZC ED Er -ka -ka -ka +bz +bz +bz bz bz bz @@ -1892,10 +1832,10 @@ bz "} (16,1,1) = {" bz -ka -ka +bz +bz +Er Er -Ph AV SY ap @@ -1917,8 +1857,8 @@ ij Er Er Er -ka -ka +bz +bz bz bz bz @@ -1930,13 +1870,13 @@ bz (17,1,1) = {" bz bz -ka +bz Er ED wW eH ii -uq +ED Jh wY zi @@ -1955,8 +1895,8 @@ ED ED ED Er -ka -ka +bz +bz bz bz bz @@ -1967,13 +1907,13 @@ bz (18,1,1) = {" bz bz -ka +bz Er ED -Cp +fa HI Md -uq +ED rj ZC ZO @@ -1993,7 +1933,7 @@ ch ED Er Er -ka +bz bz bz bz @@ -2004,8 +1944,8 @@ bz (19,1,1) = {" bz bz -ka -ka +bz +bz Er ED ou @@ -2030,9 +1970,9 @@ ZC HG ED Er -ka -ka -ka +bz +bz +bz bz bz bz @@ -2042,13 +1982,13 @@ bz bz bz bz -ka +bz Er ED ED -uq ED -qL +ED +ZC CT Tu pD @@ -2068,8 +2008,8 @@ ZC ED ED Er -ka -ka +bz +bz bz bz bz @@ -2079,8 +2019,8 @@ bz bz bz bz -ka -ka +bz +bz Er Er Er @@ -2106,7 +2046,7 @@ ZC ED ED Er -ka +bz bz bz bz @@ -2117,8 +2057,8 @@ bz bz bz bz -ka -ka +bz +bz Er Er ED @@ -2143,7 +2083,7 @@ ZO aC ED Er -ka +bz bz bz bz @@ -2155,14 +2095,14 @@ bz bz bz bz -ka -ka -ka +bz +bz +bz Er Er Er ED -Jh +kC pl Vn GA @@ -2180,7 +2120,7 @@ Ef Ef ED Er -ka +bz bz bz bz @@ -2194,13 +2134,13 @@ bz bz bz bz -ka -ka -ka +bz +bz +bz Er ED LX -UV +ZP zv ds zi @@ -2215,9 +2155,9 @@ ZO Ef Ef GX -Pb +eA Er -ka +bz bz bz bz @@ -2233,14 +2173,14 @@ bz bz bz bz -ka +bz Er ED mG +ED Rt ED -zx -ZZ +ds Tp ds ZC @@ -2252,9 +2192,9 @@ Ef hA YI YI -fl +Qx Er -ka +bz bz bz bz @@ -2270,7 +2210,7 @@ bz bz bz bz -ka +bz Er Er Er @@ -2290,8 +2230,8 @@ xI sa Ds eA -ka -ka +bz +bz bz bz bz @@ -2307,11 +2247,11 @@ bz bz bz bz -ka -ka -ka -ka -ka +bz +bz +bz +bz +bz Er ED ED @@ -2327,7 +2267,7 @@ YI eA Ds eA -ka +bz bz bz bz @@ -2348,14 +2288,14 @@ bz bz bz bz -ka +bz Er Er Er Er ED ED -AE +JF Ef Ef YI @@ -2364,7 +2304,7 @@ Ts nl cq nl -ka +bz bz bz bz @@ -2385,10 +2325,10 @@ bz bz bz bz -ka -ka -ka -ka +bz +bz +bz +bz Er Er ED @@ -2396,12 +2336,12 @@ ED sZ ED Er -ka -ka -ka -ka -ka -ka +bz +bz +bz +bz +bz +bz bz bz bz @@ -2425,15 +2365,15 @@ bz bz bz bz -ka -ka -ka +bz +bz +bz Er ED -am +ED ED Er -ka +bz bz bz bz @@ -2464,13 +2404,13 @@ bz bz bz bz -ka -ka +bz +bz Er Er Er Er -ka +bz bz bz bz @@ -2502,12 +2442,12 @@ bz bz bz bz -ka -ka -ka -ka -ka -ka +bz +bz +bz +bz +bz +bz bz bz bz diff --git a/_maps/RandomRuins/SpaceRuins/the_outlet.dmm b/_maps/RandomRuins/SpaceRuins/the_outlet.dmm index 5df4301374510..6b0f009dcc6fe 100644 --- a/_maps/RandomRuins/SpaceRuins/the_outlet.dmm +++ b/_maps/RandomRuins/SpaceRuins/the_outlet.dmm @@ -19,21 +19,12 @@ "au" = ( /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/the_outlet/employeesection) -"aB" = ( -/obj/structure/cable, -/obj/machinery/light/dim/directional/east, -/turf/open/floor/iron/freezer, -/area/ruin/space/has_grav/the_outlet/researchrooms) "aN" = ( /obj/item/clothing/suit/hooded/cultrobes/alt, /obj/item/clothing/shoes/cult/alt, /obj/structure/closet/crate, /turf/open/floor/cult, /area/ruin/space/has_grav/the_outlet/cultinfluence) -"aX" = ( -/obj/structure/broken_flooring/plating/directional/south, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/the_outlet/employeesection) "bk" = ( /obj/effect/turf_decal/tile/bar/half/contrasted, /obj/effect/decal/cleanable/dirt{ @@ -49,27 +40,22 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/the_outlet/employeesection) +"bt" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating/rust, +/area/ruin/space/has_grav/the_outlet/researchrooms) "bC" = ( /obj/effect/decal/cleanable/dirt{ icon_state = "dirt-14" }, /turf/open/floor/plating, /area/ruin/space/has_grav/the_outlet/employeesection) -"bJ" = ( -/obj/structure/broken_flooring/pile/directional/east, -/turf/open/floor/plating, -/area/ruin/space/has_grav/the_outlet/employeesection) "bS" = ( /obj/structure/rack, /obj/item/storage/backpack, /obj/item/storage/backpack/duffelbag, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/the_outlet/employeesection) -"bW" = ( -/obj/structure/broken_flooring/singular/directional/east, -/obj/structure/broken_flooring/singular/directional/south, -/turf/open/floor/plating/rust, -/area/ruin/space/has_grav/the_outlet/employeesection) "ci" = ( /obj/structure/rack, /obj/effect/spawner/random/clothing/gloves, @@ -77,10 +63,6 @@ /obj/effect/spawner/random/clothing/gloves, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/the_outlet/employeesection) -"cl" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/the_outlet/employeesection) "cp" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -162,17 +144,27 @@ }, /turf/open/floor/cult, /area/ruin/space/has_grav/the_outlet/cultinfluence) +"dC" = ( +/obj/structure/cable, +/obj/machinery/light/broken/directional/east, +/turf/open/floor/iron/freezer, +/area/ruin/space/has_grav/the_outlet/researchrooms) "dF" = ( /turf/open/floor/plating, /area/ruin/space/has_grav/the_outlet/employeesection) +"dS" = ( +/obj/structure/broken_flooring/plating/directional/west, +/turf/open/floor/iron/grimy, +/area/ruin/space/has_grav/the_outlet/employeesection) "eg" = ( /obj/structure/table/wood, /turf/open/floor/iron, /area/ruin/space/has_grav/the_outlet/employeesection) -"es" = ( -/obj/structure/broken_flooring/pile/directional/east, -/turf/open/floor/plating/rust, -/area/ruin/space/has_grav/the_outlet/employeesection) +"ez" = ( +/obj/structure/chair/sofa/corp/left, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white, +/area/ruin/space/has_grav/the_outlet/researchrooms) "eN" = ( /turf/open/floor/plating/rust, /area/ruin/space/has_grav/the_outlet/cultinfluence) @@ -206,6 +198,10 @@ /obj/effect/mapping_helpers/airlock/access/all/away/general, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/the_outlet/storefront) +"fL" = ( +/obj/structure/broken_flooring/corner/directional/south, +/turf/open/floor/plating, +/area/ruin/space/has_grav/the_outlet/employeesection) "fO" = ( /obj/effect/decal/cleanable/dirt{ icon_state = "dirt-1" @@ -312,6 +308,14 @@ /obj/effect/decal/cleanable/vomit/old, /turf/open/floor/eighties, /area/ruin/space/has_grav/the_outlet/storefront) +"ix" = ( +/obj/structure/chair/sofa/corp/right, +/obj/item/pillow, +/obj/item/bedsheet/cult{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/ruin/space/has_grav/the_outlet/researchrooms) "iB" = ( /obj/effect/turf_decal/tile/dark_blue/opposingcorners{ dir = 8 @@ -361,10 +365,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/ruin/space/has_grav/the_outlet/researchrooms) -"jv" = ( -/obj/structure/broken_flooring/pile/directional/east, -/turf/open/floor/plating, -/area/ruin/space/has_grav/the_outlet/storefront) "jw" = ( /obj/effect/decal/cleanable/dirt{ icon_state = "dirt-13" @@ -457,10 +457,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/the_outlet/researchrooms) +"lu" = ( +/obj/structure/broken_flooring/side/directional/south, +/turf/open/floor/plating/rust, +/area/ruin/space/has_grav/the_outlet/employeesection) "lK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/ruin/space/has_grav/the_outlet/researchrooms) +"lL" = ( +/obj/structure/broken_flooring/plating/directional/south, +/turf/open/floor/iron/grimy, +/area/ruin/space/has_grav/the_outlet/employeesection) "lZ" = ( /obj/effect/decal/cleanable/dirt{ icon_state = "dirt-9" @@ -500,10 +508,6 @@ }, /turf/open/floor/iron/white, /area/ruin/space/has_grav/the_outlet/researchrooms) -"mX" = ( -/obj/structure/broken_flooring/plating/directional/west, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/the_outlet/employeesection) "nq" = ( /obj/machinery/door/window, /turf/open/floor/eighties, @@ -526,6 +530,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/ruin/space/has_grav/the_outlet/employeesection) +"nL" = ( +/obj/structure/broken_flooring/pile/directional/east, +/turf/open/floor/plating, +/area/ruin/space/has_grav/the_outlet/employeesection) "nM" = ( /obj/structure/lattice, /turf/template_noop, @@ -580,10 +588,6 @@ /obj/structure/statue/bone/rib, /turf/open/floor/cult, /area/ruin/space/has_grav/the_outlet/cultinfluence) -"pC" = ( -/obj/structure/broken_flooring/side/directional/south, -/turf/open/floor/plating/rust, -/area/ruin/space/has_grav/the_outlet/employeesection) "pG" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt{ @@ -596,6 +600,12 @@ /obj/structure/billboard/donk_n_go, /turf/open/misc/asteroid/airless, /area/ruin/space) +"pU" = ( +/obj/effect/decal/cleanable/dirt{ + icon_state = "dirt-0" + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/the_outlet/employeesection) "pY" = ( /obj/effect/decal/cleanable/dirt{ icon_state = "dirt-127" @@ -675,10 +685,6 @@ /obj/item/kirbyplants/random, /turf/open/floor/plating/rust, /area/ruin/space/has_grav/the_outlet/employeesection) -"ri" = ( -/obj/machinery/light/dim/directional/west, -/turf/open/floor/iron, -/area/ruin/space/has_grav/the_outlet/employeesection) "rk" = ( /obj/structure/bodycontainer/morgue{ dir = 2 @@ -691,9 +697,14 @@ }, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/the_outlet/researchrooms) +"rA" = ( +/obj/structure/broken_flooring/singular/directional/east, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/space/has_grav/the_outlet/employeesection) "rF" = ( /obj/structure/table/reinforced/rglass, -/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/item/surgery_tray/full, /obj/item/reagent_containers/syringe/lethal/execution, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/the_outlet/researchrooms) @@ -710,14 +721,6 @@ /obj/item/kirbyplants/random, /turf/open/floor/eighties, /area/ruin/space/has_grav/the_outlet/storefront) -"rP" = ( -/obj/effect/turf_decal/tile/dark_blue/opposingcorners, -/obj/machinery/light/dim/directional/east, -/obj/effect/decal/cleanable/dirt{ - icon_state = "dirt-0" - }, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/the_outlet/researchrooms) "rV" = ( /obj/effect/spawner/random/trash/garbage, /obj/effect/decal/cleanable/dirt{ @@ -749,10 +752,10 @@ /obj/effect/mapping_helpers/airlock/access/all/away/general, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/the_outlet/storefront) -"ss" = ( +"sr" = ( /obj/structure/broken_flooring/singular/directional/east, -/obj/structure/cable, -/turf/open/floor/plating, +/obj/structure/broken_flooring/singular/directional/south, +/turf/open/floor/plating/rust, /area/ruin/space/has_grav/the_outlet/employeesection) "sv" = ( /obj/effect/spawner/random/decoration, @@ -769,10 +772,6 @@ /obj/machinery/light/dim/directional/north, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/the_outlet/employeesection) -"sR" = ( -/obj/structure/broken_flooring/corner/directional/south, -/turf/open/floor/plating/rust, -/area/ruin/space/has_grav/the_outlet/employeesection) "sS" = ( /obj/effect/turf_decal/tile/dark_blue/opposingcorners{ dir = 8 @@ -869,6 +868,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/ruin/space/has_grav/the_outlet/researchrooms) +"vl" = ( +/obj/effect/decal/cleanable/dirt{ + icon_state = "dirt-137" + }, +/obj/effect/decal/cleanable/oil{ + icon_state = "floor7" + }, +/obj/machinery/light/dim/directional/south, +/turf/open/floor/iron, +/area/ruin/space/has_grav/the_outlet/employeesection) "vs" = ( /turf/open/floor/plating, /area/ruin/space/has_grav/the_outlet/storefront) @@ -883,6 +892,13 @@ }, /turf/open/floor/iron/white, /area/ruin/space/has_grav/the_outlet/researchrooms) +"vP" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/reagent_containers/cup/coffeepot, +/obj/effect/spawner/random/food_or_drink/donkpockets, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white, +/area/ruin/space/has_grav/the_outlet/researchrooms) "wf" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/decal/cleanable/dirt{ @@ -1048,11 +1064,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/ruin/space/has_grav/the_outlet/researchrooms) -"zA" = ( -/obj/structure/broken_flooring/plating/directional/south, -/obj/structure/broken_flooring/plating/directional/west, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/the_outlet/employeesection) "zB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/blood/tracks{ @@ -1060,6 +1071,10 @@ }, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/the_outlet/researchrooms) +"zC" = ( +/obj/effect/decal/remains/human, +/turf/open/floor/eighties, +/area/ruin/space/has_grav/the_outlet/storefront) "zF" = ( /obj/effect/spawner/random/food_or_drink/booze, /obj/structure/table/wood, @@ -1123,17 +1138,6 @@ /obj/structure/sign/departments/restroom, /turf/closed/wall/rust, /area/ruin/space/has_grav/the_outlet/storefront) -"Bb" = ( -/obj/effect/turf_decal/tile/dark_blue/opposingcorners, -/obj/structure/cable, -/obj/machinery/light/dim/directional/west, -/obj/effect/decal/cleanable/dirt{ - icon_state = "dirt-8" - }, -/obj/effect/decal/cleanable/blood/tracks, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/the_outlet/researchrooms) "Bg" = ( /obj/item/flashlight, /turf/open/floor/eighties, @@ -1161,6 +1165,11 @@ /obj/structure/emergency_shield/cult, /turf/open/floor/iron/white, /area/ruin/space/has_grav/the_outlet/cultinfluence) +"BH" = ( +/obj/structure/broken_flooring/plating/directional/south, +/obj/structure/broken_flooring/plating/directional/west, +/turf/open/floor/iron/grimy, +/area/ruin/space/has_grav/the_outlet/employeesection) "BK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating/rust, @@ -1180,6 +1189,10 @@ }, /turf/open/floor/iron/white, /area/ruin/space/has_grav/the_outlet/cultinfluence) +"Cn" = ( +/obj/structure/broken_flooring/pile/directional/east, +/turf/open/floor/plating/rust, +/area/ruin/space/has_grav/the_outlet/employeesection) "CC" = ( /obj/structure/table/wood, /obj/item/reagent_containers/cup/glass/bottle/beer, @@ -1334,6 +1347,10 @@ /obj/structure/cable, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/the_outlet/storefront) +"FM" = ( +/obj/structure/broken_flooring/corner/directional/south, +/turf/open/floor/plating, +/area/ruin/space/has_grav/the_outlet/storefront) "FO" = ( /obj/machinery/door/airlock/cult/weak, /turf/open/floor/cult, @@ -1476,6 +1493,10 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/the_outlet/employeesection) +"IT" = ( +/obj/structure/broken_flooring/corner/directional/south, +/turf/open/floor/plating/rust, +/area/ruin/space/has_grav/the_outlet/employeesection) "Jh" = ( /obj/structure/aquarium/prefilled, /turf/open/floor/plating/rust, @@ -1487,10 +1508,6 @@ "Kp" = ( /turf/template_noop, /area/template_noop) -"Kq" = ( -/obj/structure/broken_flooring/corner/directional/south, -/turf/open/floor/plating, -/area/ruin/space/has_grav/the_outlet/storefront) "Kv" = ( /obj/effect/turf_decal/tile/dark_blue/opposingcorners{ dir = 8 @@ -1591,10 +1608,6 @@ /obj/effect/mapping_helpers/airlock/access/all/away/general, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/the_outlet/storefront) -"MA" = ( -/obj/structure/broken_flooring/singular/directional/east, -/turf/open/floor/plating, -/area/ruin/space/has_grav/the_outlet/storefront) "MF" = ( /obj/effect/decal/cleanable/cobweb, /obj/effect/decal/cleanable/dirt{ @@ -1687,23 +1700,10 @@ /obj/effect/baseturf_helper/asteroid/airless, /turf/open/floor/cult, /area/ruin/space/has_grav/the_outlet/cultinfluence) -"Oy" = ( -/obj/structure/chair/sofa/corp/left, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/the_outlet/researchrooms) "OD" = ( /obj/item/paper/crumpled/bloody/ruins/the_outlet/final_regrets, /turf/open/floor/cult, /area/ruin/space/has_grav/the_outlet/cultinfluence) -"OJ" = ( -/obj/structure/chair/sofa/corp/right, -/obj/item/pillow, -/obj/machinery/light/small/directional/north, -/obj/item/bedsheet/cult{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/the_outlet/researchrooms) "OL" = ( /turf/open/floor/plating/rust, /area/ruin/space/has_grav/the_outlet/researchrooms) @@ -1752,6 +1752,11 @@ }, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/the_outlet/researchrooms) +"PU" = ( +/obj/structure/cable, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron, +/area/ruin/space/has_grav/the_outlet/employeesection) "PV" = ( /obj/effect/decal/cleanable/blood{ icon_state = "floor2-old" @@ -1785,17 +1790,16 @@ /obj/effect/spawner/random/vending/snackvend, /turf/open/floor/iron, /area/ruin/space/has_grav/the_outlet/employeesection) +"QO" = ( +/obj/structure/broken_flooring/pile/directional/east, +/turf/open/floor/plating, +/area/ruin/space/has_grav/the_outlet/storefront) "Ra" = ( /obj/effect/decal/cleanable/dirt{ icon_state = "dirt-14" }, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/the_outlet/researchrooms) -"Rj" = ( -/obj/structure/broken_flooring/plating/directional/east, -/obj/structure/broken_flooring/plating/directional/north, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/the_outlet/employeesection) "Rs" = ( /obj/effect/baseturf_helper/asteroid/airless, /turf/closed/wall/r_wall/rust, @@ -1819,13 +1823,6 @@ /obj/structure/lattice, /turf/open/misc/asteroid/airless, /area/ruin/space) -"RL" = ( -/obj/machinery/light/dim/directional/east, -/obj/effect/decal/cleanable/dirt{ - icon_state = "dirt-0" - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/the_outlet/employeesection) "RN" = ( /turf/closed/wall/r_wall/rust, /area/ruin/space/has_grav/the_outlet/cultinfluence) @@ -1898,10 +1895,6 @@ /obj/item/clipboard, /turf/open/floor/iron/white, /area/ruin/space/has_grav/the_outlet/researchrooms) -"Ub" = ( -/obj/structure/broken_flooring/corner/directional/south, -/turf/open/floor/plating, -/area/ruin/space/has_grav/the_outlet/employeesection) "Ui" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/effect/decal/cleanable/dirt{ @@ -1926,6 +1919,10 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/white, /area/ruin/space/has_grav/the_outlet/researchrooms) +"UI" = ( +/obj/structure/broken_flooring/singular/directional/east, +/turf/open/floor/plating, +/area/ruin/space/has_grav/the_outlet/storefront) "UO" = ( /obj/structure/cable, /obj/machinery/door/firedoor, @@ -1936,6 +1933,10 @@ }, /turf/open/floor/plating/rust, /area/ruin/space/has_grav/the_outlet/employeesection) +"UR" = ( +/obj/machinery/light/blacklight/directional/south, +/turf/open/floor/plating/rust, +/area/ruin/space/has_grav/the_outlet/storefront) "UY" = ( /turf/closed/wall, /area/ruin/space/has_grav/the_outlet/storefront) @@ -1996,10 +1997,6 @@ /obj/effect/spawner/random/clothing/gloves, /turf/open/floor/eighties, /area/ruin/space/has_grav/the_outlet/storefront) -"Wm" = ( -/obj/machinery/light/blacklight/directional/south, -/turf/open/floor/eighties, -/area/ruin/space/has_grav/the_outlet/storefront) "Wu" = ( /obj/machinery/light/dim/directional/south, /turf/open/floor/iron/grimy, @@ -2009,7 +2006,7 @@ /turf/open/floor/plating/rust, /area/ruin/space/has_grav/the_outlet/researchrooms) "Wz" = ( -/obj/machinery/door/airlock/glass_large, +/obj/machinery/door/airlock/multi_tile/public/glass, /turf/open/floor/iron, /area/ruin/space/has_grav/the_outlet/storefront) "WC" = ( @@ -2026,6 +2023,22 @@ /obj/item/gps/spaceruin, /turf/open/floor/plating/rust, /area/ruin/space/has_grav/the_outlet/researchrooms) +"WF" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt{ + icon_state = "dirt-8" + }, +/obj/effect/decal/cleanable/blood/tracks, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/broken/directional/west, +/turf/open/floor/iron/white, +/area/ruin/space/has_grav/the_outlet/researchrooms) +"WQ" = ( +/obj/structure/broken_flooring/plating/directional/east, +/obj/structure/broken_flooring/plating/directional/north, +/turf/open/floor/iron/grimy, +/area/ruin/space/has_grav/the_outlet/employeesection) "WR" = ( /obj/structure/rack, /obj/effect/spawner/random/clothing/costume, @@ -2045,12 +2058,6 @@ /obj/structure/closet/l3closet/virology, /turf/open/floor/plating/rust, /area/ruin/space/has_grav/the_outlet/researchrooms) -"Xj" = ( -/obj/structure/table/reinforced/rglass, -/obj/item/reagent_containers/cup/coffeepot, -/obj/effect/spawner/random/food_or_drink/donkpockets, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/the_outlet/researchrooms) "Xm" = ( /obj/effect/decal/cleanable/dirt{ icon_state = "dirt-137" @@ -2066,11 +2073,6 @@ }, /turf/open/floor/plating/rust, /area/ruin/space/has_grav/the_outlet/employeesection) -"Xu" = ( -/obj/effect/decal/remains/human, -/obj/machinery/light/blacklight/directional/north, -/turf/open/floor/eighties, -/area/ruin/space/has_grav/the_outlet/storefront) "Xv" = ( /obj/effect/decal/cleanable/dirt{ icon_state = "dirt-159" @@ -2081,11 +2083,6 @@ /obj/structure/destructible/cult/pylon, /turf/open/floor/cult, /area/ruin/space/has_grav/the_outlet/cultinfluence) -"XO" = ( -/obj/machinery/light/dim/directional/north, -/obj/structure/closet/crate/trashcart, -/turf/open/floor/iron, -/area/ruin/space/has_grav/the_outlet/employeesection) "XQ" = ( /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /obj/structure/cable, @@ -2133,15 +2130,6 @@ /obj/structure/sink, /turf/open/floor/iron/small, /area/ruin/space/has_grav/the_outlet/storefront) -"Zl" = ( -/obj/effect/decal/cleanable/dirt{ - icon_state = "dirt-137" - }, -/obj/effect/decal/cleanable/oil{ - icon_state = "floor7" - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/the_outlet/employeesection) "Zy" = ( /obj/effect/turf_decal/tile/bar/anticorner/contrasted{ dir = 8 @@ -2554,7 +2542,7 @@ fO Nb Ef Fm -Xj +vP OL IF IF @@ -2647,7 +2635,7 @@ cZ qe UF Fm -OJ +ix OL eO FF @@ -2661,8 +2649,8 @@ uE MF jH sn -ri -bW +gX +sr Lw Ts HH @@ -2706,8 +2694,8 @@ hG uE Vz gX -ss -Ub +rA +fL YB dF uE @@ -2739,7 +2727,7 @@ oi Nb LR UF -Oy +ez lK WE Ab @@ -2750,7 +2738,7 @@ Xv nD Wc Ts -cl +PU AH xQ Bz @@ -2827,7 +2815,7 @@ Fm rk lZ hT -aB +dC fk AS Fm @@ -2842,10 +2830,10 @@ FA BK rV Ts -XO +zR bC CQ -es +Cn NK qC Ts @@ -2889,11 +2877,11 @@ df uE uE gX -pC +lu wW Yx -bJ -Zl +nL +vl Ts HH HH @@ -2922,7 +2910,7 @@ vg GG zz sS -Bb +WF Kv XQ ji @@ -2938,7 +2926,7 @@ wW gy wW gX -sR +IT dF uE HH @@ -2962,10 +2950,10 @@ Er Er UF MT -OL +bt ZZ mE -rP +MT mE OL mE @@ -2978,13 +2966,13 @@ au Hg SJ Wc -mX +dS rZ ya jw zR Qd -RL +pU ya uE HH @@ -3020,7 +3008,7 @@ RN qs qs qs -aX +lL yG SJ ci @@ -3113,7 +3101,7 @@ re Mk qs Ll -Rj +WQ Qi Vr Wc @@ -3207,7 +3195,7 @@ RN sO au pG -zA +BH Hg uE od @@ -3218,7 +3206,7 @@ TM xI RB Bg -Wm +xI od UY UY @@ -3267,7 +3255,7 @@ uh xI Wz vs -Kq +FM SU An nM @@ -3312,8 +3300,8 @@ xI HI xI kQ -jv -MA +QO +UI SU An Kp @@ -3356,7 +3344,7 @@ iD ux uh HI -TM +UR UY UY UY @@ -3719,7 +3707,7 @@ od UY Er od -Xu +zC xI xI TM @@ -3767,10 +3755,10 @@ Er UY Da iq -iD +Mj xI fo -Mj +iD UY HH HH diff --git a/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm b/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm index d40e9584a072b..fe62f0ed09ddb 100644 --- a/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm +++ b/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm @@ -30,12 +30,6 @@ }, /turf/open/floor/iron/white, /area/ruin/space/has_grav/thelizardsgas) -"bt" = ( -/obj/structure/sign/poster/fluff/lizards_gas_payment/directional/north, -/turf/open/floor/iron/dark/smooth_corner{ - dir = 8 - }, -/area/ruin/space/has_grav/thelizardsgas) "bO" = ( /obj/structure/closet/crate/secure/gear, /turf/closed/mineral, @@ -58,6 +52,13 @@ dir = 4 }, /area/ruin/space/has_grav/thelizardsgas) +"cv" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/hidden, +/obj/structure/sign/poster/fluff/lizards_gas_payment/directional/west, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/ruin/space/has_grav/thelizardsgas) "de" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/components/binary/pump/off{ @@ -65,6 +66,12 @@ }, /turf/template_noop, /area/ruin/space/has_grav/thelizardsgas) +"eV" = ( +/obj/structure/sign/poster/fluff/lizards_gas_payment/directional/north, +/turf/open/floor/iron/dark/smooth_corner{ + dir = 8 + }, +/area/ruin/space/has_grav/thelizardsgas) "gL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -111,6 +118,13 @@ }, /turf/open/floor/iron/white, /area/ruin/space/has_grav/thelizardsgas) +"kk" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/iron/white/side, +/area/ruin/space/has_grav/thelizardsgas) "kS" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ chamber_id = "lizardgas" @@ -149,12 +163,6 @@ /obj/structure/disposalpipe/segment, /turf/closed/wall, /area/ruin/space/has_grav/thelizardsgas) -"qX" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white/side{ - dir = 8 - }, -/area/ruin/space/has_grav/thelizardsgas) "rs" = ( /obj/machinery/button/door/directional/west{ desc = "After all, what's more important than making sure you get what you're due?"; @@ -181,6 +189,14 @@ /obj/machinery/atmospherics/pipe/smart/simple/yellow/hidden, /turf/open/floor/iron/white, /area/ruin/space/has_grav/thelizardsgas) +"tq" = ( +/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/sign/poster/fluff/lizards_gas_power/directional/east, +/turf/open/floor/plating, +/area/ruin/space/has_grav/thelizardsgas) "ua" = ( /obj/effect/spawner/random/structure/billboard/roadsigns, /turf/open/misc/asteroid/airless, @@ -234,25 +250,6 @@ dir = 4 }, /area/ruin/space/has_grav/thelizardsgas) -"AZ" = ( -/obj/machinery/light/directional/west, -/obj/structure/closet/crate/secure/freezer{ - desc = "There's a reason why this is behind the counter. Do not sell to minors."; - locked = 0; - name = "The GOOD Stuff" - }, -/obj/machinery/power/apc/auto_name/directional/north{ - coverlocked = 0; - start_charge = 60 - }, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/structure/cable, -/obj/item/paper/fluff/spaceruins/lizardsgas/memorandum, -/obj/effect/spawner/random/contraband/cannabis/lizardsgas, -/obj/effect/spawner/random/contraband/cannabis/lizardsgas, -/obj/effect/spawner/random/contraband/cannabis/lizardsgas, -/turf/open/floor/iron/dark/smooth_corner, -/area/ruin/space/has_grav/thelizardsgas) "Bi" = ( /obj/structure/closet{ desc = "Why leave the chairs in a locker?"; @@ -302,15 +299,6 @@ dir = 1 }, /area/ruin/space/has_grav/thelizardsgas) -"FJ" = ( -/obj/machinery/computer/atmos_control/noreconnect{ - atmos_chambers = list("lizardgas" = "Plasma Supply"); - dir = 8 - }, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 4 - }, -/area/ruin/space/has_grav/thelizardsgas) "Gr" = ( /obj/structure/rack, /obj/effect/spawner/random/food_or_drink/snack/lizard, @@ -361,6 +349,25 @@ }, /turf/open/misc/asteroid/airless, /area/ruin/space/has_grav/thelizardsgas) +"JA" = ( +/obj/structure/closet/crate/secure/freezer{ + desc = "There's a reason why this is behind the counter. Do not sell to minors."; + locked = 0; + name = "The GOOD Stuff" + }, +/obj/machinery/power/apc/auto_name/directional/north{ + coverlocked = 0; + start_charge = 60 + }, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/structure/cable, +/obj/item/paper/fluff/spaceruins/lizardsgas/memorandum, +/obj/effect/spawner/random/contraband/cannabis/lizardsgas, +/obj/effect/spawner/random/contraband/cannabis/lizardsgas, +/obj/effect/spawner/random/contraband/cannabis/lizardsgas, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark/smooth_corner, +/area/ruin/space/has_grav/thelizardsgas) "JP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/small/directional/west, @@ -388,14 +395,6 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/thelizardsgas) -"Mw" = ( -/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/sign/poster/fluff/lizards_gas_power/directional/east, -/turf/open/floor/plating, -/area/ruin/space/has_grav/thelizardsgas) "MB" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/simple/yellow/hidden{ @@ -425,6 +424,15 @@ }, /turf/open/floor/iron/white, /area/ruin/space/has_grav/thelizardsgas) +"PF" = ( +/obj/machinery/computer/atmos_control/noreconnect{ + atmos_chambers = list("lizardgas"="Plasma Supply"); + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 4 + }, +/area/ruin/space/has_grav/thelizardsgas) "Qg" = ( /turf/closed/mineral, /area/ruin/space/has_grav/thelizardsgas) @@ -448,13 +456,6 @@ /obj/structure/marker_beacon/burgundy, /turf/open/misc/asteroid/airless, /area/ruin/space/has_grav/thelizardsgas) -"Ss" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/hidden, -/obj/structure/sign/poster/fluff/lizards_gas_payment/directional/west, -/turf/open/floor/iron/white/corner{ - dir = 4 - }, -/area/ruin/space/has_grav/thelizardsgas) "Tj" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /obj/effect/spawner/structure/window/reinforced/plasma, @@ -507,14 +508,6 @@ dir = 1 }, /area/ruin/space/has_grav/thelizardsgas) -"VV" = ( -/obj/machinery/light/directional/north, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/iron/white/side, -/area/ruin/space/has_grav/thelizardsgas) "Wh" = ( /obj/machinery/light/directional/south, /turf/open/floor/iron/white/side{ @@ -657,7 +650,7 @@ Qg wb RB Um -RB +wb CA CA CA @@ -674,7 +667,7 @@ CA Qg Qg mR -AZ +JA rs zz JY @@ -728,8 +721,8 @@ Qg Qg Qg mR -bt -FJ +eV +PF VP hl Gr @@ -788,7 +781,7 @@ Tj na sN iO -Ss +cv GM Pb ss @@ -972,7 +965,7 @@ Qg mR Io cm -Mw +tq Cv nL gL @@ -1001,10 +994,10 @@ mR mR mR mR -VV +kk jN zn -UO +Wh mR Qg Um @@ -1035,7 +1028,7 @@ UO mR Qg wb -RB +wb wb RB CA @@ -1083,7 +1076,7 @@ Qg mR mN Je -qX +Je Je EH mR @@ -1145,7 +1138,7 @@ wb Qg RB wb -RB +wb CA CA CA diff --git a/_maps/RandomRuins/SpaceRuins/transit_booth.dmm b/_maps/RandomRuins/SpaceRuins/transit_booth.dmm index 10e024806e429..eaff9f2f073b0 100644 --- a/_maps/RandomRuins/SpaceRuins/transit_booth.dmm +++ b/_maps/RandomRuins/SpaceRuins/transit_booth.dmm @@ -1,8 +1,8 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( +"aa" = ( /turf/template_noop, /area/template_noop) -"b" = ( +"ab" = ( /obj/effect/turf_decal/siding/dark{ dir = 8 }, @@ -11,12 +11,12 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/transit_booth) -"c" = ( +"ac" = ( /obj/machinery/light/small/directional/north, /obj/structure/sign/warning/vacuum/external/directional/north, /turf/open/floor/plating, /area/ruin/space/has_grav/transit_booth) -"d" = ( +"ad" = ( /obj/effect/turf_decal/siding/dark{ dir = 4 }, @@ -24,14 +24,13 @@ /obj/effect/turf_decal/siding/dark{ dir = 8 }, -/obj/structure/sign/poster/official/high_class_martini/directional/east, /turf/open/floor/iron, /area/ruin/space/has_grav/transit_booth) -"e" = ( +"ae" = ( /obj/machinery/vending/coffee, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/transit_booth) -"f" = ( +"af" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/machinery/mass_driver{ id = "south" @@ -44,7 +43,7 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/transit_booth) -"g" = ( +"ag" = ( /obj/machinery/door/airlock/external{ name = "Transit Booth Airlock" }, @@ -53,42 +52,55 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/transit_booth) -"h" = ( +"ah" = ( /obj/effect/turf_decal/stripes/red/line, /obj/machinery/door/window/right/directional/west{ name = "Eastbound" }, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/transit_booth) -"i" = ( +"ai" = ( /obj/effect/turf_decal/siding/dark, /obj/effect/turf_decal/siding/dark{ dir = 1 }, /turf/open/floor/iron, /area/ruin/space/has_grav/transit_booth) -"j" = ( +"aj" = ( /obj/structure/lattice, /turf/template_noop, /area/ruin/space/has_grav/transit_booth) -"k" = ( +"ak" = ( /obj/effect/turf_decal/siding/dark{ dir = 1 }, /obj/effect/turf_decal/siding/dark, /turf/open/floor/iron, /area/ruin/space/has_grav/transit_booth) -"l" = ( +"al" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/ruin/space/has_grav/transit_booth) -"n" = ( +"am" = ( +/obj/structure/table, +/obj/item/storage/fancy/cigarettes/cigars{ + pixel_y = 11; + pixel_x = 3 + }, +/obj/item/lighter{ + pixel_x = -8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/transit_booth) +"an" = ( /obj/structure/chair/comfy/black{ dir = 8 }, +/obj/structure/sign/poster/official/cohiba_robusto_ad/directional/north, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/transit_booth) -"o" = ( +"ao" = ( /obj/effect/turf_decal/siding/dark{ dir = 8 }, @@ -96,10 +108,9 @@ /obj/effect/turf_decal/siding/dark{ dir = 4 }, -/obj/structure/sign/poster/official/cohiba_robusto_ad/directional/west, /turf/open/floor/iron, /area/ruin/space/has_grav/transit_booth) -"p" = ( +"ap" = ( /obj/machinery/door/airlock/external{ name = "Transit Booth Airlock" }, @@ -111,10 +122,20 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/transit_booth) -"q" = ( +"aq" = ( /turf/open/floor/iron/dark, /area/ruin/space/has_grav/transit_booth) -"s" = ( +"ar" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/structure/sign/poster/official/high_class_martini/directional/east, +/turf/open/floor/iron, +/area/ruin/space/has_grav/transit_booth) +"as" = ( /obj/structure/rack, /obj/effect/turf_decal/siding/dark_red{ dir = 4 @@ -134,7 +155,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/transit_booth) -"t" = ( +"at" = ( /obj/structure/window/reinforced/spawner/directional/north{ pixel_y = 2 }, @@ -153,11 +174,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/transit_booth) -"u" = ( +"au" = ( /obj/machinery/vending/cigarette, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/transit_booth) -"w" = ( +"av" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/transit_booth) +"aw" = ( /obj/machinery/door/airlock/external{ name = "Transit Booth Airlock" }, @@ -166,7 +193,7 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/transit_booth) -"x" = ( +"ax" = ( /obj/effect/turf_decal/siding/dark{ dir = 9 }, @@ -174,7 +201,7 @@ /obj/effect/turf_decal/siding/dark/corner, /turf/open/floor/iron, /area/ruin/space/has_grav/transit_booth) -"y" = ( +"ay" = ( /obj/effect/turf_decal/siding/dark{ dir = 6 }, @@ -184,7 +211,7 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/transit_booth) -"z" = ( +"az" = ( /obj/machinery/door/poddoor{ id = "east" }, @@ -195,16 +222,22 @@ /obj/structure/table/reinforced, /turf/open/floor/plating, /area/ruin/space/has_grav/transit_booth) -"B" = ( +"aA" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/transit_booth) +"aB" = ( /obj/structure/lattice/catwalk, /obj/structure/marker_beacon/burgundy, /turf/template_noop, /area/ruin/space/has_grav/transit_booth) -"C" = ( +"aC" = ( /obj/structure/lattice/catwalk, /turf/template_noop, /area/ruin/space/has_grav/transit_booth) -"D" = ( +"aD" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/mass_driver{ dir = 8; @@ -219,7 +252,7 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/transit_booth) -"E" = ( +"aE" = ( /obj/effect/turf_decal/siding/dark{ dir = 10 }, @@ -228,7 +261,7 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/transit_booth) -"F" = ( +"aF" = ( /obj/structure/window/reinforced/spawner/directional/south{ layer = 2.9 }, @@ -246,7 +279,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/transit_booth) -"G" = ( +"aG" = ( /obj/structure/window/reinforced/spawner/directional/south{ layer = 2.9 }, @@ -262,7 +295,7 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/transit_booth) -"H" = ( +"aH" = ( /obj/structure/rack, /obj/effect/turf_decal/siding/dark_red{ dir = 4 @@ -276,7 +309,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/transit_booth) -"I" = ( +"aI" = ( /obj/structure/rack, /obj/effect/turf_decal/siding/dark_red{ dir = 8 @@ -292,7 +325,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/transit_booth) -"J" = ( +"aJ" = ( /obj/structure/table, /obj/item/reagent_containers/cup/glass/coffee{ pixel_x = 6; @@ -300,7 +333,7 @@ }, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/transit_booth) -"K" = ( +"aK" = ( /obj/machinery/door/poddoor{ id = "south" }, @@ -309,7 +342,7 @@ /obj/structure/table/reinforced, /turf/open/floor/plating, /area/ruin/space/has_grav/transit_booth) -"L" = ( +"aL" = ( /obj/structure/table, /obj/item/storage/fancy/cigarettes/cigars{ pixel_y = 11; @@ -320,7 +353,7 @@ }, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/transit_booth) -"M" = ( +"aM" = ( /obj/machinery/door/poddoor{ id = "north" }, @@ -331,7 +364,7 @@ /obj/structure/table/reinforced, /turf/open/floor/plating, /area/ruin/space/has_grav/transit_booth) -"N" = ( +"aN" = ( /obj/effect/turf_decal/stripes/red/line{ dir = 8 }, @@ -340,7 +373,7 @@ }, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/transit_booth) -"O" = ( +"aO" = ( /obj/machinery/door/window/left/directional/north{ name = "Southbound" }, @@ -349,7 +382,7 @@ }, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/transit_booth) -"P" = ( +"aP" = ( /obj/machinery/door/poddoor{ id = "west" }, @@ -360,7 +393,7 @@ /obj/structure/table/reinforced, /turf/open/floor/plating, /area/ruin/space/has_grav/transit_booth) -"Q" = ( +"aQ" = ( /obj/structure/rack, /obj/item/book/random{ pixel_x = -5; @@ -379,7 +412,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/transit_booth) -"R" = ( +"aR" = ( /obj/machinery/door/airlock/external{ name = "Transit Booth Airlock" }, @@ -391,15 +424,15 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/transit_booth) -"S" = ( +"aS" = ( /obj/machinery/light/small/directional/south, /obj/structure/sign/warning/vacuum/external/directional/south, /turf/open/floor/plating, /area/ruin/space/has_grav/transit_booth) -"T" = ( +"aT" = ( /turf/closed/wall, /area/ruin/space/has_grav/transit_booth) -"U" = ( +"aU" = ( /obj/effect/turf_decal/siding/dark{ dir = 4 }, @@ -408,7 +441,7 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/transit_booth) -"V" = ( +"aV" = ( /obj/structure/window/reinforced/spawner/directional/south{ layer = 2.9 }, @@ -427,7 +460,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/transit_booth) -"W" = ( +"aW" = ( /obj/structure/window/reinforced/spawner/directional/west{ layer = 2.9 }, @@ -444,7 +477,7 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/transit_booth) -"X" = ( +"aX" = ( /obj/effect/turf_decal/stripes/red/line{ dir = 1 }, @@ -453,13 +486,14 @@ }, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/transit_booth) -"Y" = ( +"aY" = ( /obj/structure/chair/comfy/black{ dir = 4 }, +/obj/structure/sign/poster/official/high_class_martini/directional/south, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/transit_booth) -"Z" = ( +"aZ" = ( /obj/effect/turf_decal/siding/dark{ dir = 5 }, @@ -468,172 +502,191 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/transit_booth) +"zw" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/glass/coffee{ + pixel_x = 6; + pixel_y = 3 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/transit_booth) +"UJ" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/structure/sign/poster/official/cohiba_robusto_ad/directional/west, +/turf/open/floor/iron, +/area/ruin/space/has_grav/transit_booth) (1,1,1) = {" -B -j -j -C -j -j -j -j -j -a -a -a +aB +aj +aj +aC +aj +aj +aj +aj +aj +aa +aa +aa "} (2,1,1) = {" -j -a -T -w -T -a -T -P -l -l -a -a +aj +aa +aT +aw +aT +aa +aT +aP +al +al +aa +aa "} (3,1,1) = {" -j -a -T -c -T -l -T -D -X -l -a -a +aj +aa +aT +ac +aT +al +aT +aD +aX +al +aa +aa "} (4,1,1) = {" -j -a -T -R -T -n -L -u -q -l -l -a +aj +aa +aT +aR +aT +av +am +au +aq +al +al +aa "} (5,1,1) = {" -j -a -T -x -o -b -b -b -E -O -l -j +aj +aa +aT +ax +UJ +ab +ab +ab +aE +aO +al +aj "} (6,1,1) = {" -j -T -T -k -Q -I -I -V -i -f -K -j +aj +aT +aT +ak +aQ +aI +aI +aV +ai +af +aK +aj "} (7,1,1) = {" -j -M -G -k -t -s -H -F -i -T -T -j +aj +aM +aG +ak +at +as +aH +aF +ai +aT +aT +aj "} (8,1,1) = {" -j -l -N -Z -U -U -U -d -y -T -a -j +aj +al +aN +aZ +aU +aU +aU +ar +ay +aT +aa +aj "} (9,1,1) = {" -a -l -l -q -e -J -Y -T -p -T -a -j +aa +al +al +aq +ae +zw +aA +aT +ap +aT +aa +aj "} (10,1,1) = {" -a -a -l -h -W -T -l -T -S -T -a -j +aa +aa +al +ah +aW +aT +al +aT +aS +aT +aa +aj "} (11,1,1) = {" -a -a -l -l -z -T -a -T -g -T -a -j +aa +aa +al +al +az +aT +aa +aT +ag +aT +aa +aj "} (12,1,1) = {" -a -a -a -j -j -j -j -j -C -j -j -B +aa +aa +aa +aj +aj +aj +aj +aj +aC +aj +aj +aB "} diff --git a/_maps/RandomRuins/SpaceRuins/travelers_rest.dmm b/_maps/RandomRuins/SpaceRuins/travelers_rest.dmm index b08b516d1fd1e..8e773ee992666 100644 --- a/_maps/RandomRuins/SpaceRuins/travelers_rest.dmm +++ b/_maps/RandomRuins/SpaceRuins/travelers_rest.dmm @@ -1,8 +1,6 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "aq" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, +/obj/item/kirbyplants/organic/plant21, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 9 }, @@ -127,9 +125,7 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/travelers_rest) "iP" = ( -/obj/item/kirbyplants{ - icon_state = "plant-06" - }, +/obj/item/kirbyplants/organic/plant6, /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 9 }, @@ -155,6 +151,7 @@ /area/ruin/space/has_grav/travelers_rest) "mg" = ( /obj/effect/turf_decal/trimline/dark_green, +/obj/machinery/light/floor, /turf/open/floor/iron, /area/ruin/space/has_grav/travelers_rest) "pk" = ( @@ -165,9 +162,7 @@ /turf/open/floor/iron/textured, /area/ruin/space/has_grav/travelers_rest) "sn" = ( -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, +/obj/item/kirbyplants/organic/plant10, /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 10 @@ -175,18 +170,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/ruin/space/has_grav/travelers_rest) -"sM" = ( -/obj/machinery/light/directional/east, -/obj/machinery/light/directional/south, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/door/window/brigdoor{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/brown/filled, -/turf/open/floor/iron, -/area/ruin/space/has_grav/travelers_rest) "uq" = ( /obj/effect/turf_decal/trimline/brown, +/obj/machinery/light/floor, /turf/open/floor/iron/textured, /area/ruin/space/has_grav/travelers_rest) "uS" = ( @@ -214,6 +200,7 @@ dir = 1 }, /obj/effect/turf_decal/trimline/yellow, +/obj/machinery/light/floor, /turf/open/floor/iron/textured, /area/ruin/space/has_grav/travelers_rest) "xq" = ( @@ -250,14 +237,6 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/travelers_rest) -"Dw" = ( -/obj/machinery/light/directional/west, -/obj/machinery/light/directional/north, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/door/window/brigdoor, -/obj/effect/turf_decal/trimline/dark_green/filled, -/turf/open/floor/iron, -/area/ruin/space/has_grav/travelers_rest) "Ef" = ( /obj/effect/turf_decal/trimline/white/filled/line{ dir = 9 @@ -293,14 +272,6 @@ /obj/effect/turf_decal/trimline/neutral/end, /turf/open/floor/iron/large, /area/ruin/space/has_grav/travelers_rest) -"FL" = ( -/obj/machinery/light/directional/east, -/obj/machinery/light/directional/north, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/machinery/door/window/brigdoor, -/obj/effect/turf_decal/trimline/blue/filled, -/turf/open/floor/iron, -/area/ruin/space/has_grav/travelers_rest) "Gj" = ( /obj/structure/table/reinforced, /obj/item/gps/spaceruin{ @@ -317,19 +288,10 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/textured, /area/ruin/space/has_grav/travelers_rest) -"HA" = ( -/obj/machinery/light/directional/west, -/obj/machinery/light/directional/south, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/door/window/brigdoor{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/filled, -/turf/open/floor/iron, -/area/ruin/space/has_grav/travelers_rest) "HC" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/blue, +/obj/machinery/light/floor, /turf/open/floor/iron, /area/ruin/space/has_grav/travelers_rest) "KD" = ( @@ -452,9 +414,7 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/travelers_rest) "Vn" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, +/obj/item/kirbyplants/organic/plant21, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 5 }, @@ -592,11 +552,11 @@ MB Lx Px NG -Dw +NG Ob aX LU -HA +NG NG bz gF @@ -652,11 +612,11 @@ MB gF bz NG -FL +NG iP iZ pk -sM +NG NG bz gF diff --git a/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm b/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm index 7b536ba4694a7..4be262c6fd052 100644 --- a/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm +++ b/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm @@ -25,10 +25,6 @@ "ag" = ( /turf/open/floor/iron, /area/ruin/space/has_grav/turretedoutpost) -"ah" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/ruin/space/has_grav/turretedoutpost) "aj" = ( /obj/machinery/light/directional/north, /turf/open/floor/plating, @@ -39,12 +35,6 @@ "al" = ( /turf/open/floor/plating/airless, /area/ruin/space/has_grav/turretedoutpost) -"am" = ( -/obj/structure/table/reinforced, -/obj/item/folder, -/obj/item/radio, -/turf/open/floor/iron, -/area/ruin/space/has_grav/turretedoutpost) "an" = ( /obj/structure/chair/office{ dir = 8 @@ -59,10 +49,6 @@ /obj/structure/filingcabinet, /turf/open/floor/iron, /area/ruin/space/has_grav/turretedoutpost) -"aq" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/ruin/space/has_grav/turretedoutpost) "ar" = ( /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron, @@ -82,14 +68,6 @@ }, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/turretedoutpost) -"au" = ( -/obj/item/rack_parts, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/turretedoutpost) "av" = ( /obj/structure/rack, /obj/item/firing_pin, @@ -132,13 +110,6 @@ /obj/item/gps/spaceruin, /turf/open/floor/iron, /area/ruin/space/has_grav/turretedoutpost) -"aD" = ( -/obj/structure/table/reinforced, -/obj/item/clipboard, -/obj/machinery/light/directional/north, -/obj/item/radio, -/turf/open/floor/iron, -/area/ruin/space/has_grav/turretedoutpost) "aE" = ( /obj/machinery/vending/clothing, /turf/open/floor/iron, @@ -158,12 +129,6 @@ /obj/machinery/door/airlock/public/glass, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/turretedoutpost) -"aK" = ( -/obj/structure/bed, -/obj/item/bedsheet/orange, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/ruin/space/has_grav/turretedoutpost) "aL" = ( /obj/structure/rack, /obj/effect/spawner/random/exotic/syndie, @@ -183,12 +148,6 @@ /obj/structure/chair/office, /turf/open/floor/iron, /area/ruin/space/has_grav/turretedoutpost) -"aO" = ( -/obj/structure/chair/comfy/beige{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/turretedoutpost) "aP" = ( /obj/structure/bed, /obj/item/bedsheet/orange, @@ -205,12 +164,6 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron, /area/ruin/space/has_grav/turretedoutpost) -"aS" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/directional/south, -/obj/item/camera_bug, -/turf/open/floor/iron, -/area/ruin/space/has_grav/turretedoutpost) "aT" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, @@ -242,36 +195,72 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/turretedoutpost) -"aY" = ( -/obj/structure/rack, -/obj/machinery/light/directional/south, -/obj/effect/spawner/random/exotic/syndie, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/turretedoutpost) "aZ" = ( /obj/structure/rack, /obj/effect/spawner/random/exotic/syndie, /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/turretedoutpost) -"ba" = ( +"df" = ( +/obj/structure/chair/comfy/beige{ + dir = 4 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/ruin/space/has_grav/turretedoutpost) +"fk" = ( /obj/structure/table/wood, /obj/item/food/breadslice/meat, +/turf/open/floor/iron, +/area/ruin/space/has_grav/turretedoutpost) +"iq" = ( +/obj/structure/rack, +/obj/effect/spawner/random/exotic/syndie, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, /obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/turretedoutpost) +"kK" = ( +/obj/structure/bed, +/obj/item/bedsheet/orange, +/obj/machinery/light/small/directional/east, /turf/open/floor/iron, /area/ruin/space/has_grav/turretedoutpost) "tK" = ( /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron, /area/ruin/space/has_grav/turretedoutpost) -"Nu" = ( +"vd" = ( +/obj/structure/table/reinforced, +/obj/item/clipboard, +/obj/item/radio, +/turf/open/floor/iron, +/area/ruin/space/has_grav/turretedoutpost) +"Ar" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/ruin/space/has_grav/turretedoutpost) +"Iq" = ( +/obj/structure/table/reinforced, +/obj/item/computer_disk/syndicate/camera_app, +/turf/open/floor/iron, +/area/ruin/space/has_grav/turretedoutpost) +"LS" = ( /obj/machinery/door/airlock/external/ruin, /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "turret_outpost" }, /turf/open/floor/plating, /area/ruin/space/has_grav/turretedoutpost) +"WF" = ( +/obj/structure/table/reinforced, +/obj/item/folder, +/obj/item/radio, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/ruin/space/has_grav/turretedoutpost) (1,1,1) = {" aa @@ -363,8 +352,8 @@ al ad ad ay -aL -aL +iq +iq aL ad ad @@ -421,12 +410,12 @@ ab aa al ad -au +at az aH aM az -aY +aZ ad al aa @@ -519,13 +508,13 @@ aa ac ad ae -am +WF ap ad aC ag ag -aS +Iq ad al ab @@ -540,9 +529,9 @@ ac ad af an -aq +ag ad -aD +vd ag aN aT @@ -563,7 +552,7 @@ ag ag aw ag -ag +Ar ag aU ad @@ -604,9 +593,9 @@ ag ax ag ag -aO +df aV -ba +fk ad ac ab @@ -618,7 +607,7 @@ aa ab ac ad -ah +ag ag ar ad @@ -638,8 +627,8 @@ ab aa ac ad -Nu -Nu +LS +LS ad ad ad @@ -663,8 +652,8 @@ ak ad al ad -aK aP +kK aP aP ad @@ -698,8 +687,8 @@ ab ab ac ad -Nu -Nu +LS +LS ad ac ac diff --git a/_maps/RandomRuins/SpaceRuins/waystation.dmm b/_maps/RandomRuins/SpaceRuins/waystation.dmm index d4a4fd8e64f64..9577f92ea791f 100644 --- a/_maps/RandomRuins/SpaceRuins/waystation.dmm +++ b/_maps/RandomRuins/SpaceRuins/waystation.dmm @@ -20,10 +20,6 @@ /obj/effect/mapping_helpers/airlock/access/all/away/security, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/waystation/securestorage) -"aQ" = ( -/obj/structure/broken_flooring/pile/directional/north, -/turf/template_noop, -/area/template_noop) "be" = ( /obj/structure/toilet{ dir = 8 @@ -112,6 +108,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/waystation/kitchen) +"dd" = ( +/obj/structure/broken_flooring/pile/directional/west, +/turf/template_noop, +/area/template_noop) "dl" = ( /obj/machinery/door/airlock/mining/glass, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -355,15 +355,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/has_grav/waystation/cargobay) -"gD" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/siding/green, -/obj/effect/turf_decal/siding/green{ - dir = 1 - }, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/waystation/dorms) "gE" = ( /obj/structure/sign/poster/contraband/missing_gloves/directional/north, /obj/machinery/power/smes{ @@ -535,6 +526,15 @@ /obj/machinery/light/dim/directional/west, /turf/open/floor/iron, /area/ruin/space/has_grav/waystation/cargobay) +"jN" = ( +/obj/effect/turf_decal/bot_red, +/obj/structure/closet/crate/secure/weapon, +/obj/item/gun/ballistic/automatic/wt550{ + pin = /obj/item/firing_pin/explorer + }, +/obj/item/ammo_box/magazine/wt550m9, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/waystation/securestorage) "jV" = ( /turf/open/floor/iron, /area/ruin/space/has_grav/waystation/dorms) @@ -564,6 +564,10 @@ /obj/effect/spawner/random/structure/crate_loot, /turf/open/floor/iron, /area/ruin/space/has_grav/waystation/cargobay) +"kn" = ( +/obj/structure/broken_flooring/pile/directional/north, +/turf/template_noop, +/area/template_noop) "ko" = ( /obj/machinery/door/airlock{ name = "Freezer" @@ -977,10 +981,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/has_grav/waystation/cargobay) -"pE" = ( -/obj/structure/broken_flooring/pile/directional/west, -/turf/closed/mineral/random/low_chance, -/area/ruin/space) "pF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -1007,22 +1007,6 @@ /obj/structure/cable, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/waystation/qm) -"qr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/dim/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/waystation/dorms) -"qs" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall, -/area/ruin/space/has_grav/waystation/cargooffice) -"qy" = ( -/obj/structure/broken_flooring/pile/directional/east, -/turf/template_noop, -/area/template_noop) "qC" = ( /obj/effect/decal/cleanable/blood/tracks{ dir = 8 @@ -1122,11 +1106,24 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/has_grav/waystation/cargobay) -"rC" = ( -/obj/structure/curtain, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/freezer, -/area/ruin/space/has_grav/waystation/dorms) +"rF" = ( +/obj/machinery/button/door/directional/east{ + id = "Blastdoor_load"; + layer = 4; + name = "Loading Doors"; + pixel_y = -6 + }, +/obj/machinery/button/door/directional/east{ + id = "Blastdoor_unload"; + layer = 4; + name = "Loading Doors"; + pixel_y = 6 + }, +/obj/machinery/modular_computer/preset{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/waystation/cargobay) "rI" = ( /obj/effect/baseturf_helper/asteroid/airless, /turf/closed/wall, @@ -1335,6 +1332,16 @@ /obj/item/stack/rods/two, /turf/template_noop, /area/template_noop) +"wj" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/siding/green, +/obj/effect/turf_decal/siding/green{ + dir = 1 + }, +/obj/structure/sign/poster/official/random/directional/north, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/waystation/dorms) "wm" = ( /obj/structure/table/wood, /obj/effect/spawner/random/entertainment/toy_figure, @@ -1377,6 +1384,10 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/waystation/cargooffice) +"xi" = ( +/obj/structure/broken_flooring/pile/directional/east, +/turf/template_noop, +/area/template_noop) "xk" = ( /obj/machinery/porta_turret/syndicate/pod{ dir = 1; @@ -1460,6 +1471,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/ruin/space/has_grav/waystation) +"yu" = ( +/obj/effect/turf_decal/siding/green/end{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/kirbyplants/random, +/obj/machinery/light/dim/directional/east, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/waystation/dorms) "yA" = ( /obj/effect/decal/cleanable/blood/footprints{ pixel_y = -3 @@ -1584,6 +1604,10 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/has_grav/waystation/cargobay) +"Br" = ( +/obj/structure/broken_flooring/pile/directional/west, +/turf/closed/mineral/random/low_chance, +/area/ruin/space) "Bu" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -1600,12 +1624,6 @@ }, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/waystation/kitchen) -"BN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/dim/directional/west, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/waystation/dorms) "BZ" = ( /obj/machinery/conveyor{ dir = 4; @@ -1934,10 +1952,11 @@ /obj/effect/turf_decal/siding/red{ dir = 9 }, -/obj/machinery/door/window/brigdoor/security/cell/left, +/obj/machinery/door/window/brigdoor/security/cell/left{ + req_access = list("away_sec") + }, /obj/structure/filingcabinet, /obj/item/folder/documents, -/obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/waystation/securestorage) @@ -2122,24 +2141,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/waystation/kitchen) -"Mj" = ( -/obj/machinery/button/door/directional/east{ - id = "Blastdoor_load"; - layer = 4; - name = "Loading Doors"; - pixel_y = -6 - }, -/obj/machinery/button/door/directional/east{ - id = "Blastdoor_unload"; - layer = 4; - name = "Loading Doors"; - pixel_y = 6 - }, -/obj/machinery/modular_computer/console/preset{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/waystation/cargobay) "Mk" = ( /obj/structure/table/wood, /obj/item/folder, @@ -2163,15 +2164,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/has_grav/waystation/dorms) -"Ms" = ( -/obj/effect/turf_decal/bot_red, -/obj/structure/closet/crate/secure/weapon, -/obj/item/gun/ballistic/automatic/wt550{ - pin = /obj/item/firing_pin/explorer - }, -/obj/item/ammo_box/magazine/wt550m9, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/waystation/securestorage) "Mu" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -2326,10 +2318,6 @@ }, /turf/open/floor/wood, /area/ruin/space/has_grav/waystation/qm) -"Or" = ( -/obj/structure/broken_flooring/pile/directional/west, -/turf/template_noop, -/area/template_noop) "OM" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 4 @@ -2410,13 +2398,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/waystation/kitchen) -"PV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/west, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/waystation/dorms) "PX" = ( /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron/dark, @@ -2706,6 +2687,11 @@ /obj/structure/bookcase/random, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/waystation/qm) +"Vy" = ( +/obj/structure/curtain, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/freezer, +/area/ruin/space/has_grav/waystation/dorms) "VE" = ( /obj/machinery/door/airlock/external{ id_tag = "SBC_corvette_bolt"; @@ -2763,14 +2749,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/waystation/assaultpod) -"WD" = ( -/obj/effect/turf_decal/siding/green/end{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants/random, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/waystation/dorms) "WF" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -4217,19 +4195,19 @@ pK Ls El xw -PV +zZ zZ xw xw xw zZ -qr +zZ xw xw xw zZ zZ -BN +xw HA Uy QN @@ -4277,7 +4255,7 @@ pK pK pK Ls -gD +wj tt jV jV @@ -4408,7 +4386,7 @@ KD MY ox pg -WD +yu Ol Je yS @@ -4530,7 +4508,7 @@ Gj xH yg fx -rC +Vy Qd do Rs @@ -4562,7 +4540,7 @@ Sj Sj no Sj -qy +xi Ya Ya Ya @@ -4617,7 +4595,7 @@ TT Ya Ya Ya -Or +dd vi no Sj @@ -4771,7 +4749,7 @@ iJ iJ pK pK -pE +Br yg Mu Mu @@ -4795,7 +4773,7 @@ Kc lP Ld ea -qs +UG LK Ze VE @@ -4869,7 +4847,7 @@ Wd XF no Sj -aQ +kn no Ya Ya @@ -5456,7 +5434,7 @@ pK pK yi Ok -Ms +jN er nD Ar @@ -5534,7 +5512,7 @@ fm fm vL Jy -Mj +rF Jy JG Zf diff --git a/_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm b/_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm index 28c3e1584a93e..602aa1a273b9d 100644 --- a/_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm +++ b/_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm @@ -397,7 +397,7 @@ id = "oldship_ruin_gun"; name = "Pod Bay Door" }, -/turf/open/space/basic, +/turf/open/floor/iron/textured, /area/ruin/space/has_grav/whiteship/box) "lO" = ( /obj/effect/turf_decal/siding/wideplating{ @@ -491,12 +491,8 @@ /obj/structure/lattice, /turf/open/misc/asteroid/airless, /area/ruin/space/has_grav/whiteship/box) -"nd" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/ruin/space/has_grav/whiteship/box) "nz" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/effect/decal/cleanable/dirt, /turf/open/floor/mineral/titanium/white/airless, /area/ruin/space/has_grav/whiteship/box) @@ -519,7 +515,7 @@ /turf/open/floor/carpet, /area/ruin/space/has_grav/whiteship/box) "oe" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/effect/turf_decal/siding/yellow{ dir = 6 }, @@ -937,7 +933,7 @@ /area/ruin/space/has_grav/whiteship/box) "CV" = ( /obj/structure/lattice, -/obj/machinery/modular_computer/console{ +/obj/machinery/modular_computer{ dir = 8 }, /obj/item/shard, @@ -1123,10 +1119,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured, /area/ruin/space/has_grav/whiteship/box) -"Ke" = ( -/obj/effect/decal/cleanable/glass, -/turf/closed/mineral/random, -/area/ruin/space/has_grav/whiteship/box) "Kg" = ( /obj/effect/turf_decal/trimline/blue/arrow_cw{ dir = 1 @@ -1955,7 +1947,7 @@ kK TC Xy Nf -nd +HR jP HC IA @@ -2308,7 +2300,7 @@ Jy Jy Jy Xx -Ke +Jy na ku jO diff --git a/_maps/RandomZLevels/SnowCabin.dmm b/_maps/RandomZLevels/SnowCabin.dmm index 8d7e60a0f7ff1..cf324e6c5bbfd 100644 --- a/_maps/RandomZLevels/SnowCabin.dmm +++ b/_maps/RandomZLevels/SnowCabin.dmm @@ -2,46 +2,23 @@ "ab" = ( /turf/closed/indestructible/rock/snow, /area/awaymission/cabin/caves/mountain) -"ad" = ( -/turf/closed/wall/mineral/wood, -/area/awaymission/cabin/lumbermill) -"ae" = ( +"ac" = ( /obj/structure/fence{ dir = 4 }, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 9 +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" }, -/turf/open/floor/plating/snowed/snow_cabin, +/turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/snowforest) +"ad" = ( +/turf/closed/wall/mineral/wood, +/area/awaymission/cabin/lumbermill) "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 @@ -84,10 +61,6 @@ }, /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) @@ -123,13 +96,6 @@ /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{ @@ -184,22 +150,11 @@ /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/directional/north, /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, @@ -210,11 +165,6 @@ /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) @@ -253,7 +203,7 @@ density = 1; desc = "Generates power from lava!"; dir = 1; - icon = 'icons/obj/atmospherics/pipes/simple.dmi'; + icon = 'icons/obj/pipes_n_cables/simple.dmi'; icon_state = "compressor"; name = "geothermal generator" }, @@ -403,11 +353,6 @@ }, /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, @@ -481,7 +426,7 @@ /turf/open/floor/iron/white, /area/awaymission/cabin) "bF" = ( -/obj/machinery/atmospherics/components/unary/cryo_cell, +/obj/machinery/cryo_cell, /turf/open/floor/iron/white, /area/awaymission/cabin) "bG" = ( @@ -504,12 +449,6 @@ /obj/structure/sink/directional/west, /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, @@ -522,10 +461,6 @@ /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) @@ -535,15 +470,17 @@ }, /turf/open/floor/iron/white, /area/awaymission/cabin) -"bQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible{ - dir = 4 +"bR" = ( +/obj/structure/closet/secure_closet/personal/cabinet{ + anchored = 1 }, -/turf/open/floor/iron/white, +/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/large_scarf/red, +/turf/open/floor/wood, /area/awaymission/cabin) -"bS" = ( -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/snowforest) "bT" = ( /obj/machinery/light/small/directional/west, /obj/item/instrument/guitar, @@ -564,56 +501,10 @@ }, /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, @@ -648,16 +539,6 @@ /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, @@ -669,13 +550,6 @@ /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, @@ -687,15 +561,6 @@ /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."; - name = "theatre piano" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) "cA" = ( /obj/structure/cable, /obj/machinery/door/airlock/wood{ @@ -719,11 +584,6 @@ }, /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/machinery/reagentgrinder, @@ -804,12 +664,6 @@ /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" @@ -821,10 +675,6 @@ /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, @@ -839,111 +689,6 @@ /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/cup/glass/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) -"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/condiment/mayonnaise, @@ -960,7 +705,7 @@ anchored = 1; density = 1; desc = "Generates power from lava!"; - icon = 'icons/obj/atmospherics/pipes/simple.dmi'; + icon = 'icons/obj/pipes_n_cables/simple.dmi'; icon_state = "turbine"; name = "geothermal generator" }, @@ -969,139 +714,20 @@ /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" = ( +"dC" = ( /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 +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/snowforest) "eb" = ( /obj/structure/closet, /obj/item/clothing/suit/hooded/wintercoat, @@ -1114,25 +740,10 @@ /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, @@ -1151,33 +762,6 @@ /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{ @@ -1185,13 +769,6 @@ }, /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"; @@ -1200,14 +777,18 @@ /obj/structure/fans/tiny, /turf/open/floor/plating/snowed/snow_cabin, /area/awaymission/cabin) -"er" = ( -/obj/effect/turf_decal/weather/snow/corner, +"es" = ( +/obj/effect/decal/cleanable/blood, /obj/effect/light_emitter{ - set_cap = 1; - set_luminosity = 4 + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin) +/turf/open/misc/asteroid/snow/snow_cabin{ + name = "packed snow"; + slowdown = 0 + }, +/area/awaymission/cabin/snowforest) "et" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -1259,13 +840,6 @@ /obj/item/stack/sheet/mineral/wood, /turf/open/floor/wood/freezing, /area/awaymission/cabin/lumbermill) -"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, @@ -1278,45 +852,6 @@ }, /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, @@ -1328,33 +863,6 @@ }, /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, @@ -1374,58 +882,6 @@ }, /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, @@ -1462,38 +918,6 @@ /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, @@ -1521,10 +945,6 @@ }, /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/records/security{ dir = 8 @@ -1593,46 +1013,12 @@ }, /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/structure/ladder/unbreakable{ desc = "Who left the grate open?"; @@ -1647,17 +1033,6 @@ }, /turf/open/floor/iron/dark, /area/awaymission/cabin/caves/mountain) -"fF" = ( -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) "fG" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet, @@ -1672,15 +1047,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet, /area/awaymission/cabin/caves/mountain) -"fK" = ( -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) "fL" = ( /obj/effect/decal/cleanable/dirt, /mob/living/basic/mouse{ @@ -1786,15 +1152,37 @@ name = "dirty water" }, /area/awaymission/cabin/caves/mountain) -"go" = ( +"ge" = ( +/obj/structure/flora/tree/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 + set_luminosity = 6; + light_color = "#9bbbff" }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine, -/area/awaymission/cabin/caves/mountain) +/turf/open/misc/asteroid/snow/snow_cabin{ + name = "packed snow"; + slowdown = 0 + }, +/area/awaymission/cabin/snowforest) +"gl" = ( +/obj/structure/cable, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood, +/area/awaymission/cabin) +"gm" = ( +/obj/item/food/fishmeat/carp, +/obj/item/food/fishmeat/carp, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/ice/smooth, +/area/awaymission/cabin/snowforest) "gp" = ( /obj/structure/sign/poster/contraband/pwr_game/directional/east, /obj/effect/decal/cleanable/dirt, @@ -1821,23 +1209,6 @@ /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." @@ -1899,6 +1270,15 @@ /obj/item/mop, /turf/open/floor/carpet, /area/awaymission/cabin/caves/mountain) +"gJ" = ( +/obj/structure/flora/tree/pine/style_random, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/snowforest) "gL" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/oil, @@ -1915,17 +1295,35 @@ /obj/item/key/atv, /turf/open/floor/plating, /area/awaymission/cabin) -"gN" = ( -/obj/machinery/light/directional/south, +"gS" = ( +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/awaymission/cabin) +/turf/open/floor/engine, +/area/awaymission/cabin/caves/mountain) "gT" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood, /turf/open/floor/carpet, /area/awaymission/cabin/caves/mountain) +"gU" = ( +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/obj/structure/flora{ + desc = "Looks frozen."; + icon = 'icons/obj/fluff/flora/snowflora.dmi'; + icon_state = "snowgrass_sw"; + name = "frozen flora" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/snowforest) "gY" = ( /obj/structure/table/wood, /obj/item/clothing/suit/hooded/wintercoat/hydro, @@ -2150,17 +1548,6 @@ /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/directional/south, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/awaymission/cabin) "hJ" = ( /obj/structure/lattice/catwalk, /turf/open/indestructible{ @@ -2193,63 +1580,6 @@ }, /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) @@ -2292,7 +1622,7 @@ /area/awaymission/cabin/caves/sovietcave) "iq" = ( /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/hivebot/range{ +/mob/living/basic/hivebot/range{ desc = "Looks like he's been left behind."; faction = list("russian"); maxHealth = 5; @@ -2539,18 +1869,6 @@ }, /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 @@ -2561,66 +1879,6 @@ }, /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/large_scarf/blue, -/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/large_scarf/green, -/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/large_scarf/red, -/turf/open/floor/wood, -/area/awaymission/cabin) "jx" = ( /obj/structure/table/wood/poker, /obj/item/dice/d6{ @@ -2720,10 +1978,6 @@ /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, /obj/machinery/light/directional/north, @@ -2731,6 +1985,16 @@ name = "soviet floor" }, /area/awaymission/cabin/caves/sovietcave) +"jQ" = ( +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/indestructible, +/area/awaymission/cabin/caves/mountain) "jR" = ( /obj/structure/table/wood, /obj/item/hatchet{ @@ -2873,11 +2137,6 @@ /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, @@ -2891,6 +2150,18 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood/freezing, /area/awaymission/cabin/caves) +"kq" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "lumbermill" + }, +/obj/effect/turf_decal/stripes/red/line, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest) "kE" = ( /obj/structure/closet, /obj/item/clothing/suit/hooded/wintercoat, @@ -3009,6 +2280,17 @@ /obj/effect/decal/cleanable/blood/gibs, /turf/open/floor/carpet, /area/awaymission/cabin/caves/mountain) +"kY" = ( +/obj/structure/statue/snow/snowman{ + anchored = 1 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/snowforest) "kZ" = ( /obj/effect/decal/cleanable/insectguts, /obj/effect/decal/cleanable/dirt, @@ -3036,26 +2318,39 @@ name = "Reinforced Soviet Hatch" }, /area/awaymission/cabin/caves/sovietcave) +"ll" = ( +/obj/structure/cable, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/awaymission/cabin) "lz" = ( /obj/structure/sign/poster/official/cleanliness/directional/south, /turf/open/floor/iron/white, /area/awaymission/cabin) -"lC" = ( -/obj/machinery/conveyor{ - dir = 4; - id = "lumbermill" +"lB" = ( +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" }, -/obj/effect/turf_decal/stripes/red/full, +/obj/structure/flora{ + desc = "Looks frozen."; + icon = 'icons/obj/fluff/flora/snowflora.dmi'; + icon_state = "snowgrass3"; + name = "frozen flora" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/caves) +"lD" = ( /obj/structure/barricade/wooden/snowed, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/lumbermill) -"lP" = ( +/obj/structure/barricade/wooden/crude/snow, /obj/effect/light_emitter{ name = "outdoor light"; set_cap = 3; - set_luminosity = 6 + set_luminosity = 6; + light_color = "#9bbbff" }, -/turf/closed/wall/ice, +/turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) "lS" = ( /obj/effect/decal/cleanable/dirt, @@ -3070,107 +2365,33 @@ 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 +"lW" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 }, /obj/effect/light_emitter{ - name = "outdoor light"; set_cap = 3; - set_luminosity = 6 + set_luminosity = 6; + light_color = "#9bbbff" }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/cabin/caves) -"mr" = ( -/obj/effect/decal/cleanable/shreds{ - pixel_x = -12; - pixel_y = -12 +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"md" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "lumbermill" }, +/obj/effect/turf_decal/stripes/red/full, /obj/effect/light_emitter{ - name = "outdoor light"; set_cap = 3; - set_luminosity = 6 + set_luminosity = 6; + light_color = "#9bbbff" }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/cabin/caves) +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/lumbermill) "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/directional/west{ - name = "\improper SAWBLADE WARNING" - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) "my" = ( /obj/effect/decal/cleanable/dirt, /obj/item/gun/ballistic/automatic/surplus{ @@ -3181,40 +2402,6 @@ 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, /obj/machinery/light/directional/south, @@ -3302,31 +2489,17 @@ /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 +"nd" = ( +/obj/structure/closet/secure_closet/personal/cabinet{ + anchored = 1 }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) +/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) "nn" = ( /obj/structure/sign/warning/explosives, /turf/closed/indestructible/syndicate, @@ -3378,6 +2551,16 @@ name = "soviet floor" }, /area/awaymission/cabin/caves/sovietcave) +"nw" = ( +/obj/effect/decal/cleanable/blood, +/obj/item/reagent_containers/pill/patch/libital, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) "nB" = ( /obj/structure/table/wood/poker, /obj/item/dice/d6{ @@ -3385,24 +2568,24 @@ }, /turf/open/floor/carpet, /area/awaymission/cabin) -"nE" = ( -/obj/structure/statue/snow/snowlegion{ - anchored = 1 +"nC" = ( +/obj/structure/ladder/unbreakable{ + desc = "Finally."; + icon_state = "ladder10"; + id = "whyisitcalledladder10andnotladder1"; + name = "Freedom" }, -/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/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" }, -/obj/structure/barricade/wooden/snowed, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) +/turf/open/indestructible{ + icon_state = "plating"; + name = "plating" + }, +/area/awaymission/cabin/caves/mountain) "nL" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/grunge, @@ -3411,7 +2594,7 @@ }, /area/awaymission/cabin/caves/sovietcave) "nM" = ( -/obj/machinery/door/airlock/glass_large{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Medical Bay" }, /obj/structure/cable, @@ -3421,14 +2604,6 @@ /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, @@ -3457,15 +2632,66 @@ }, /turf/open/floor/plating, /area/awaymission/cabin) -"oC" = ( +"ol" = ( +/obj/structure/bonfire/dense{ + desc = "Multiple logs thrown together into a pile hastily. Let's burn it for fun!."; + name = "pile of logs" + }, /obj/effect/light_emitter{ - name = "outdoor light"; set_cap = 3; - set_luminosity = 6 + set_luminosity = 6; + light_color = "#9bbbff" }, -/obj/effect/decal/remains/human, -/turf/open/misc/asteroid/snow/snow_cabin, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest) +"oz" = ( +/obj/effect/light_emitter{ + name = "cave light"; + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/closed/wall/ice, /area/awaymission/cabin/caves) +"oH" = ( +/obj/item/clothing/suit/armor/vest/russian_coat{ + pixel_x = 16; + pixel_y = 16 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"oN" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/mob/living/basic/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 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"oP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/south, +/turf/open/floor/plating, +/area/awaymission/cabin) "pj" = ( /obj/structure/sign/warning/engine_safety{ 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."; @@ -3473,6 +2699,29 @@ }, /turf/closed/wall/mineral/wood, /area/awaymission/cabin/lumbermill) +"pl" = ( +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin) +"pq" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "lumbermill" + }, +/obj/effect/turf_decal/stripes/red/full, +/obj/structure/barricade/wooden/snowed, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/lumbermill) "pu" = ( /obj/item/grenade/barrier{ pixel_x = -14; @@ -3493,19 +2742,12 @@ }, /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/style_random, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) -"qe" = ( +"pw" = ( /obj/effect/light_emitter{ name = "outdoor light"; set_cap = 3; - set_luminosity = 6 + set_luminosity = 6; + light_color = "#9bbbff" }, /obj/structure/ladder/unbreakable{ alpha = 0; @@ -3518,6 +2760,107 @@ }, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) +"px" = ( +/obj/structure/statue/snow/snowman{ + anchored = 1; + name = "Who" + }, +/obj/item/clothing/head/helmet/knight/yellow{ + 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/roman/fake{ + layer = 3.01; + pixel_x = -7 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/snowforest) +"pB" = ( +/obj/structure/fluff/fokoff_sign, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/snowforest) +"pE" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/caves) +"pH" = ( +/obj/machinery/space_heater, +/obj/machinery/light/directional/north, +/turf/open/floor/wood/freezing, +/area/awaymission/cabin/lumbermill) +"qg" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/obj/effect/turf_decal/weather/snow, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/iron/dark/snowdin, +/area/awaymission/cabin/caves) +"qi" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"qj" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"qn" = ( +/mob/living/basic/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 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) "qo" = ( /obj/item/pickaxe{ desc = "It's almost broken."; @@ -3527,15 +2870,24 @@ }, /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 +"qz" = ( +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" }, +/turf/open/floor/wood/freezing, /area/awaymission/cabin/snowforest) -"qR" = ( -/turf/open/misc/ice/smooth, +"qF" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/wood/freezing, /area/awaymission/cabin/snowforest) "qV" = ( /obj/item/banhammer{ @@ -3546,24 +2898,55 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/cabin/caves/mountain) -"rb" = ( -/obj/structure/statue/snow/snowman{ - anchored = 1; - name = "What" +"re" = ( +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" }, -/obj/item/clothing/head/wizard/fake{ - pixel_x = -1; - pixel_y = 13 +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest) +"rk" = ( +/obj/machinery/light/directional/south, +/obj/effect/landmark/awaystart, +/obj/structure/sign/poster/official/report_crimes/directional/south, +/obj/structure/cable, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"rK" = ( +/obj/effect/decal/cleanable/blood/gibs/body, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" }, -/obj/item/staff{ - layer = 3.01 +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"sb" = ( +/obj/structure/table/reinforced, +/obj/item/megaphone/sec{ + name = "soviet megaphone" }, -/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) +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"sc" = ( +/obj/item/hatchet/wooden, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"sl" = ( +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/wood, +/area/awaymission/cabin) "so" = ( /obj/structure/displaycase{ start_showpiece_type = /obj/item/dice/d6/space; @@ -3572,18 +2955,57 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /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" +"st" = ( +/obj/structure/fence/cut/medium{ + dir = 4 }, -/turf/open/misc/asteroid/snow/snow_cabin, +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/smoothed, +/area/awaymission/cabin/caves) +"sB" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/wood/freezing, /area/awaymission/cabin/snowforest) -"sF" = ( -/obj/structure/fluff/fokoff_sign, +"sC" = ( +/obj/structure/flora/tree/pine/style_random, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, /turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin) +"sG" = ( +/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/large_scarf/blue, +/turf/open/floor/wood, +/area/awaymission/cabin) +"sI" = ( +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/mob/living/basic/pet/penguin/baby/permanent, +/turf/open/misc/ice/smooth, /area/awaymission/cabin/snowforest) "sK" = ( /obj/item/clothing/shoes/sneakers/brown, @@ -3600,26 +3022,75 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/cabin/caves/mountain) -"sY" = ( +"tc" = ( +/obj/structure/chair/wood{ + dir = 8 + }, /obj/effect/light_emitter{ - name = "outdoor light"; set_cap = 3; - set_luminosity = 6 + set_luminosity = 6; + light_color = "#9bbbff" }, +/turf/open/floor/wood/freezing, +/area/awaymission/cabin/snowforest) +"td" = ( /obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/indestructible, +/turf/open/floor/iron/dark, /area/awaymission/cabin/caves/mountain) -"td" = ( +"te" = ( +/obj/structure/fence/cut/medium{ + dir = 4 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/smoothed, +/area/awaymission/cabin/caves) +"ti" = ( +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/obj/structure/sign/poster/official/space_cops/directional/north, /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/cabin/caves/mountain) -"th" = ( +"tk" = ( +/obj/effect/turf_decal/stripes/red/corner{ + dir = 4 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest) +"tq" = ( +/obj/structure/chair, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"tr" = ( +/obj/structure/flora/tree/pine/style_random, /obj/effect/light_emitter{ - set_cap = 1; - set_luminosity = 4 + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" }, /turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin) +/area/awaymission/cabin/caves) "ts" = ( /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/remains/human, @@ -3636,28 +3107,37 @@ }, /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 +"tL" = ( +/obj/structure/fence{ + dir = 4 }, -/turf/open/misc/asteroid/snow/snow_cabin{ - name = "packed snow"; - slowdown = 0 +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" }, +/turf/open/floor/plating/snowed/snow_cabin, /area/awaymission/cabin/snowforest) -"tP" = ( +"tQ" = ( /obj/effect/light_emitter{ - name = "cave light"; set_cap = 3; - set_luminosity = 6 + set_luminosity = 6; + light_color = "#9bbbff" }, -/turf/open/misc/asteroid/snow/snow_cabin, +/turf/open/floor/plating/snowed, /area/awaymission/cabin/caves) +"tU" = ( +/obj/structure/fence/door{ + dir = 4 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/snowforest) "ud" = ( /obj/structure/showcase/mecha/marauder{ desc = "Used by vigilantes in the past to fight ruffians causing trouble in neighborhoods and space stations."; @@ -3667,6 +3147,43 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/indestructible, /area/awaymission/cabin/caves/mountain) +"ue" = ( +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/caves) +"uf" = ( +/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 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/wood/freezing, +/area/awaymission/cabin/snowforest) "um" = ( /obj/effect/turf_decal/weather/snow, /turf/open/misc/ice/smooth, @@ -3679,24 +3196,102 @@ slowdown = 1 }, /area/awaymission/cabin/caves) +"uq" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) "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" +"uF" = ( +/obj/item/shard, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"uM" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/wood/freezing, +/area/awaymission/cabin/snowforest) +"uQ" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/wood/freezing, +/area/awaymission/cabin/snowforest) "uR" = ( /obj/structure/table/wood, /obj/item/storage/medkit/brute, /turf/open/floor/wood/freezing, /area/awaymission/cabin/lumbermill) +"uS" = ( +/obj/structure/table/optable, +/turf/open/floor/iron/white, +/area/awaymission/cabin) +"uU" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest) +"uW" = ( +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/smoothed, +/area/awaymission/cabin/caves) +"uZ" = ( +/obj/structure/flora/tree/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; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/caves) +"vh" = ( +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/snowforest) "vj" = ( /obj/item/key/atv, /obj/effect/decal/remains/human{ @@ -3726,6 +3321,17 @@ }, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) +"vq" = ( +/obj/effect/turf_decal/stripes/red/corner{ + dir = 8 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest) "vD" = ( /obj/effect/turf_decal/weather/snow, /obj/item/modular_computer/pda/syndicate{ @@ -3743,6 +3349,18 @@ /obj/item/grenade/chem_grenade/large, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) +"vH" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) "vJ" = ( /obj/effect/decal/cleanable/glitter/blue{ desc = "It looks like fancy glitter to me."; @@ -3751,36 +3369,106 @@ /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." +"wf" = ( +/obj/structure/statue/snow/snowman{ + anchored = 1; + name = "I Don't Know" }, -/turf/open/misc/ice/smooth, +/obj/item/clothing/head/chaplain/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 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/caves) +"wq" = ( +/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, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/lumbermill) +"wC" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest) +"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, +"xf" = ( +/obj/structure/fence/door, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/snowforest) "xo" = ( /obj/structure/table/wood, /obj/item/reagent_containers/cup/glass/mug/britcup, /turf/open/floor/carpet, /area/awaymission/cabin) -"xs" = ( -/mob/living/basic/tree{ - desc = "I am death. I will have my vengeance upon my enemies."; - melee_damage_upper = 8 +"xq" = ( +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/obj/structure/flora{ + desc = "Looks frozen."; + icon = 'icons/obj/fluff/flora/snowflora.dmi'; + icon_state = "snowgrass2"; + name = "frozen flora" }, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/snowforest) +"xt" = ( +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin) "xw" = ( /obj/effect/decal/cleanable/glitter/blue{ desc = "It looks like fancy glitter to me."; @@ -3802,17 +3490,6 @@ }, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) -"xy" = ( -/obj/structure/flora/tree/dead/style_random, -/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."; @@ -3822,6 +3499,32 @@ }, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) +"xY" = ( +/obj/vehicle/ridden/atv{ + dir = 4 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/snowforest) +"yg" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) "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."; @@ -3834,6 +3537,17 @@ }, /turf/open/misc/ice/smooth, /area/awaymission/cabin/caves) +"ym" = ( +/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) "ys" = ( /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/remains/human{ @@ -3850,6 +3564,15 @@ }, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) +"yt" = ( +/obj/item/trash/can, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) "yv" = ( /obj/item/food/egg/rainbow{ desc = "Was an egg really worth this much effort?"; @@ -3870,6 +3593,22 @@ }, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) +"yD" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/reagent_containers/cup/glass/bottle/vodka/badminka{ + desc = "A fancy bottle of vodka. The name isn't in Galactic Common though."; + name = "Porosha Vodka" + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) "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." @@ -3877,55 +3616,70 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/indestructible, /area/awaymission/cabin/caves/mountain) -"yR" = ( -/obj/structure/table/reinforced, -/obj/item/modular_computer/pda/syndicate{ - desc = "A portable microcomputer by Thinktronic Systems, LTD."; - inserted_disk = /obj/item/computer_disk/virus/mime; - name = "soviet tablet" +"yP" = ( +/obj/structure/kitchenspike, +/obj/effect/decal/cleanable/blood/gibs, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" }, /turf/open/floor/plating/snowed/snow_cabin, /area/awaymission/cabin/snowforest/sovietsurface) -"yY" = ( -/obj/vehicle/ridden/atv{ - dir = 4 +"yQ" = ( +/obj/structure/sign/warning/directional/west{ + name = "\improper SAWBLADE WARNING" }, -/turf/open/misc/asteroid/snow/snow_cabin, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, /area/awaymission/cabin/snowforest) -"zd" = ( -/obj/structure/statue/snow/snowman{ - anchored = 1; - name = "Who" +"yU" = ( +/obj/structure/chair{ + dir = 1 }, -/obj/item/clothing/head/helmet/knight/yellow{ - desc = "A classic metal helmet. The cold has made it unreliable though."; - name = "old medieval helmet"; - pixel_y = 7 +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" }, -/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 +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"yW" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/cafeteria, +/area/awaymission/cabin) +"ze" = ( +/obj/structure/chair{ + dir = 8 }, -/obj/item/shield/roman/fake{ - layer = 3.01; - pixel_x = -7 +/obj/effect/decal/cleanable/blood, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) -"zm" = ( -/obj/structure/sign/warning/no_smoking/circle, -/turf/closed/wall/mineral/wood, -/area/awaymission/cabin/snowforest) +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) "zn" = ( /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/remains/human, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) +"zo" = ( +/obj/structure/flora/tree/dead/style_random, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/caves) "zv" = ( /obj/structure/dresser, /obj/machinery/button/door/directional/north{ @@ -3950,6 +3704,44 @@ }, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) +"zR" = ( +/obj/effect/turf_decal/stripes/red/corner, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest) +"zT" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"zY" = ( +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/mob/living/basic/pet/penguin/emperor, +/turf/open/misc/ice/smooth, +/area/awaymission/cabin/snowforest) +"Aa" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) "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?"; @@ -3958,12 +3750,30 @@ /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" +"Ae" = ( +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"Ag" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/wood/freezing, +/area/awaymission/cabin) +"Aj" = ( +/obj/structure/fence, +/obj/effect/light_emitter{ + name = "cave light"; + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" }, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) @@ -3981,11 +3791,44 @@ slowdown = 1 }, /area/awaymission/cabin/caves) +"AB" = ( +/obj/structure/flora/rock/icy/style_random{ + desc = "A mountain rock." + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/snowforest) "AC" = ( /obj/structure/sign/poster/official/no_erp/directional/south, /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/cabin/caves/mountain) +"AD" = ( +/obj/effect/light_emitter{ + name = "cave light"; + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/smoothed, +/area/awaymission/cabin/caves) +"AL" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin{ + name = "packed snow"; + slowdown = 0 + }, +/area/awaymission/cabin/caves) "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?"; @@ -3997,6 +3840,31 @@ }, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) +"Bo" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"BI" = ( +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/obj/structure/flora{ + desc = "Looks frozen."; + icon = 'icons/obj/fluff/flora/snowflora.dmi'; + icon_state = "snowgrass3"; + name = "frozen flora" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/snowforest) "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."; @@ -4009,41 +3877,69 @@ }, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) -"BU" = ( -/obj/structure/fence, +"Cl" = ( +/obj/item/broken_bottle, /obj/effect/light_emitter{ - name = "cave light"; set_cap = 3; - set_luminosity = 6 + set_luminosity = 6; + light_color = "#9bbbff" }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"BZ" = ( -/obj/structure/flora/tree/pine/style_random, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"CA" = ( +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"CH" = ( /obj/machinery/icecream_vat, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) -"Dc" = ( -/obj/structure/fence/door{ - dir = 4 +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" }, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/snowforest) -"Di" = ( -/obj/structure/fence{ - dir = 4 +"CO" = ( +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) +/turf/open/misc/ice/smooth, +/area/awaymission/cabin/caves) +"CS" = ( +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/closed/indestructible/rock/snow, +/area/awaymission/cabin/caves) "Dl" = ( /obj/structure/statue/snow/snowman{ anchored = 1 }, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) +"Dr" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood, +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"Dt" = ( +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/ice/smooth, +/area/awaymission/cabin/caves) "Dw" = ( /obj/effect/decal/cleanable/glitter/blue{ desc = "It looks like fancy glitter to me."; @@ -4052,29 +3948,176 @@ /obj/effect/decal/cleanable/generic, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) +"Dy" = ( +/obj/machinery/light/floor, +/turf/open/floor/wood, +/area/awaymission/cabin) "DE" = ( /turf/open/misc/asteroid/snow/snow_cabin{ name = "packed snow"; slowdown = 0 }, /area/awaymission/cabin/caves) -"Fq" = ( -/obj/structure/sign/poster/official/space_cops/directional/north, +"DI" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest) +"DR" = ( +/obj/item/chair, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"DW" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest) +"Ea" = ( /obj/effect/light_emitter{ name = "outdoor light"; set_cap = 3; - set_luminosity = 6 + set_luminosity = 6; + light_color = "#9bbbff" + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 }, -/obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/cabin/caves/mountain) -"Fz" = ( -/obj/structure/flora/rock/icy/style_random{ - desc = "A mountain rock." +"Ek" = ( +/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/large_scarf/green, +/turf/open/floor/wood, +/area/awaymission/cabin) +"El" = ( +/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/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest) +"Es" = ( +/obj/structure/statue/snow/snowman{ + anchored = 1; + name = "Why" + }, +/obj/item/clothing/head/costume/pirate/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 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" }, /turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/caves) +"Ez" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/snowforest) +"EL" = ( +/obj/machinery/light/directional/east, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"EQ" = ( +/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; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/smoothed, +/area/awaymission/cabin/caves) +"Fp" = ( +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed, /area/awaymission/cabin/snowforest) -"FL" = ( +"Fu" = ( +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin) +"FK" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"FO" = ( +/obj/structure/light_construct/directional/south, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/caves) +"FQ" = ( /obj/structure/statue/snow/snowman{ anchored = 1; name = "Because" @@ -4088,10 +4131,11 @@ /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, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) "FW" = ( @@ -4099,6 +4143,44 @@ /obj/structure/light_construct/directional/south, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) +"Gb" = ( +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/obj/structure/flora/tree/pine/style_random, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/caves) +"Gk" = ( +/obj/structure/closet/crate/bin, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/awaymission/cabin) +"GB" = ( +/obj/structure/fence, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest) +"GD" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/caves) "GL" = ( /obj/machinery/barsign/all_access, /turf/closed/wall/mineral/wood, @@ -4111,31 +4193,52 @@ /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" +"Hf" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 }, -/turf/open/misc/asteroid/snow/snow_cabin, +/obj/structure/barricade/wooden/snowed, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, /area/awaymission/cabin/snowforest) -"Ho" = ( -/obj/structure/flora/tree/stump{ - desc = "Breaking it should be easy."; - max_integrity = 20; - name = "old stump" +"Hk" = ( +/obj/effect/decal/cleanable/blood/gibs, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" }, -/turf/open/misc/asteroid/snow/snow_cabin{ - name = "packed snow"; - slowdown = 0 +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"Hx" = ( +/obj/effect/turf_decal/stripes/red/line, +/obj/structure/barricade/wooden/snowed, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" }, +/turf/open/floor/plating/snowed/snow_cabin, /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) +"HH" = ( +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/obj/effect/decal/remains/human, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/caves) +"Ic" = ( +/obj/machinery/processor, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/freezer, +/area/awaymission/cabin) "Id" = ( /obj/effect/decal/remains/human, /obj/item/pickaxe{ @@ -4146,6 +4249,44 @@ }, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) +"Ie" = ( +/obj/effect/decal/cleanable/blood, +/obj/item/shard/plasma, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"Ih" = ( +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"IJ" = ( +/obj/item/reagent_containers/pill/patch/libital, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"IR" = ( +/obj/structure/chair, +/obj/effect/decal/cleanable/blood, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) "IU" = ( /obj/effect/decal/cleanable/shreds, /turf/open/misc/asteroid/snow/snow_cabin, @@ -4158,6 +4299,85 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/indestructible, /area/awaymission/cabin/caves/mountain) +"IX" = ( +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/caves) +"Jc" = ( +/obj/structure/flora/tree/stump{ + desc = "Breaking it should be easy."; + max_integrity = 20; + name = "old stump" + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/snowforest) +"Je" = ( +/obj/effect/turf_decal/weather/snow, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/obj/effect/turf_decal/weather/snow, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/iron/dark/snowdin, +/area/awaymission/cabin/caves) +"Jp" = ( +/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" + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"Jw" = ( +/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 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest) +"Jz" = ( +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin{ + name = "packed snow"; + slowdown = 0 + }, +/area/awaymission/cabin/snowforest) "JL" = ( /turf/open/misc/asteroid/snow/snow_cabin{ floor_variance = 0; @@ -4165,23 +4385,101 @@ slowdown = 1 }, /area/awaymission/cabin/caves) +"JV" = ( +/obj/effect/turf_decal/stripes/red/line, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest) "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, +"JX" = ( +/obj/structure/fence/door/opened, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest) +"JZ" = ( +/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 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) -"Lc" = ( +"Kf" = ( +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, /obj/structure/flora{ desc = "Looks frozen."; - icon = 'icons/obj/flora/snowflora.dmi'; + icon = 'icons/obj/fluff/flora/snowflora.dmi'; icon_state = "snowgrass2"; name = "frozen flora" }, /turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/caves) +"Kl" = ( +/obj/structure/cable, +/obj/machinery/light/directional/south, +/turf/open/floor/wood, +/area/awaymission/cabin) +"KA" = ( +/obj/effect/decal/cleanable/shreds, +/turf/open/misc/ice/smooth, +/area/awaymission/cabin/caves) +"KK" = ( +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/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." + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/dark, +/area/awaymission/cabin/caves/mountain) +"KP" = ( +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/ice/smooth, /area/awaymission/cabin/snowforest) "Ld" = ( /obj/item/toy/mecha/deathripley{ @@ -4199,6 +4497,19 @@ }, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) +"Ll" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/hourglass, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) "Lm" = ( /obj/structure/statue/snow/snowman{ anchored = 1; @@ -4218,14 +4529,25 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/indestructible, /area/awaymission/cabin/caves/mountain) -"LF" = ( -/obj/structure/flora/tree/stump{ - desc = "Breaking it should be easy."; - max_integrity = 20; - name = "old stump" +"LG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible{ + dir = 4 }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white, +/area/awaymission/cabin) +"LR" = ( +/obj/structure/closet/crate/wooden{ + anchored = 1 + }, +/obj/effect/turf_decal/delivery/red, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/lumbermill) "LS" = ( /obj/structure/sign{ pixel_x = 32 @@ -4244,6 +4566,17 @@ slowdown = 1 }, /area/awaymission/cabin/caves) +"Md" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) "Mk" = ( /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/glitter/blue{ @@ -4253,13 +4586,11 @@ /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) "Ml" = ( -/mob/living/simple_animal/hostile/bear/russian{ +/mob/living/basic/bear/russian{ desc = "He'll hold the line against you!"; light_range = 3; melee_damage_upper = 25; - name = "Artyom"; - speak = list("Blyat!","Rawr!","GRR!","Growl!"); - wander = 0 + name = "Artyom" }, /turf/open/misc/asteroid/snow/snow_cabin{ floor_variance = 0; @@ -4267,33 +4598,32 @@ slowdown = 1 }, /area/awaymission/cabin/caves) -"Mv" = ( -/obj/structure/statue/snow/snowman{ - anchored = 1; - name = "I Don't Know" +"MA" = ( +/obj/effect/turf_decal/stripes/red/corner{ + dir = 1 }, -/obj/item/clothing/head/chaplain/bishopmitre{ - pixel_x = -1; - pixel_y = 16 +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" }, -/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/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest) +"MC" = ( +/obj/effect/decal/cleanable/generic, +/obj/effect/decal/cleanable/generic{ + pixel_x = -17 + }, +/obj/effect/decal/cleanable/shreds{ + pixel_y = -12 }, -/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 + set_luminosity = 6; + light_color = "#9bbbff" }, -/turf/open/misc/asteroid/snow/snow_cabin, +/turf/open/floor/plating/snowed/smoothed, /area/awaymission/cabin/caves) "Na" = ( /obj/machinery/button/door/directional/north{ @@ -4315,6 +4645,18 @@ /obj/item/shovel, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) +"Ng" = ( +/obj/structure/fence/cut/large{ + dir = 4 + }, +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/smoothed, +/area/awaymission/cabin/caves) "Nq" = ( /obj/machinery/button/door/directional/north{ id = "fightingcommunity20"; @@ -4322,36 +4664,40 @@ }, /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" +"NI" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 }, /obj/effect/light_emitter{ - name = "outdoor light"; set_cap = 3; - set_luminosity = 6 + set_luminosity = 6; + light_color = "#9bbbff" }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/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/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest) +"NJ" = ( +/mob/living/basic/tree{ + desc = "I am death. I will have my vengeance upon my enemies."; + melee_damage_upper = 8 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" }, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/snowforest) +"Oe" = ( +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/caves) +"Oq" = ( +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/snowforest) "OF" = ( /obj/structure/table/wood, /obj/structure/sign/warning/no_smoking/circle{ @@ -4360,14 +4706,42 @@ }, /turf/open/floor/wood/freezing, /area/awaymission/cabin/lumbermill) -"OZ" = ( -/obj/structure/flora/tree/dead/style_random, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) +"OK" = ( +/obj/structure/fence, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest) +"OQ" = ( +/obj/structure/cable, +/obj/structure/musician/piano{ + desc = "Very theatrical."; + name = "theatre piano" + }, +/turf/open/floor/wood, +/area/awaymission/cabin) "Pd" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/indestructible, /area/awaymission/cabin/caves/mountain) +"Pi" = ( +/obj/structure/fence, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest) "Po" = ( /obj/effect/decal/remains/human, /obj/effect/decal/cleanable/glitter/blue{ @@ -4376,28 +4750,88 @@ }, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) +"Pu" = ( +/obj/machinery/vending/sovietsoda, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"Pv" = ( +/obj/structure/chair, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/snowforest) +"PE" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/wood/freezing, +/area/awaymission/cabin) "PV" = ( /turf/open/misc/ice/smooth, /area/awaymission/cabin/caves) -"Qf" = ( +"Qa" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/awaymission/cabin) +"Qh" = ( +/obj/machinery/vending/boozeomat, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/awaymission/cabin) +"Qi" = ( +/obj/structure/statue/snow/snowlegion{ + anchored = 1 + }, /obj/effect/light_emitter{ - name = "outdoor light"; set_cap = 3; - set_luminosity = 6 + set_luminosity = 6; + light_color = "#9bbbff" }, -/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/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/snowforest) +"Qk" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"Qw" = ( +/obj/structure/fence/door, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/caves) +"Qy" = ( +/obj/structure/sign/warning/no_smoking/circle, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/closed/wall/mineral/wood, +/area/awaymission/cabin/snowforest) "QA" = ( /obj/item/gun/ballistic/automatic/toy{ anchored = 1; @@ -4407,10 +4841,27 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/indestructible, /area/awaymission/cabin/caves/mountain) -"QL" = ( -/obj/structure/flora/tree/pine/style_random, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin) +"QC" = ( +/obj/structure/table, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"QR" = ( +/obj/effect/decal/cleanable/blood, +/obj/item/trash/popcorn{ + pixel_y = 12 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) "QT" = ( /obj/item/chair/stool, /obj/effect/decal/cleanable/glitter/blue{ @@ -4419,6 +4870,15 @@ }, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) +"QV" = ( +/obj/effect/decal/cleanable/blood/gibs/limb, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) "Ri" = ( /obj/effect/decal/remains/human, /obj/item/reagent_containers/spray/pepper/empty, @@ -4428,27 +4888,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/mineral/plastitanium/red/snow_cabin, /area/awaymission/cabin/caves/sovietcave) -"Rs" = ( -/obj/structure/flora/tree/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."; @@ -4466,19 +4905,7 @@ desc = "It looks like fancy glitter to me."; name = "icy wind" }, -/mob/living/basic/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" - }, +/mob/living/basic/statue/frosty, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) "RL" = ( @@ -4489,6 +4916,12 @@ }, /turf/open/misc/ice/smooth, /area/awaymission/cabin/caves) +"RM" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/awaymission/cabin) "RN" = ( /obj/structure/ladder/unbreakable/rune{ desc = "Get me out of this boring room."; @@ -4499,19 +4932,65 @@ }, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) +"RU" = ( +/obj/structure/fence/door/opened, +/obj/structure/barricade/wooden/crude/snow, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/snowforest) "RY" = ( /obj/structure/sign/poster/official/do_not_question/directional/east, /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/cabin/caves/mountain) -"Sd" = ( +"Sb" = ( /obj/structure/flora/tree/stump{ desc = "Breaking it should be easy."; max_integrity = 20; name = "old stump" }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/caves) +"Sg" = ( +/obj/structure/fence, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/snowforest) +"Si" = ( +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/closed/wall/ice, +/area/awaymission/cabin/snowforest) +"Sl" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest) "So" = ( /obj/machinery/button/door/directional/north{ id = "fightingcommunity30"; @@ -4519,6 +4998,54 @@ }, /turf/open/floor/wood, /area/awaymission/cabin) +"Su" = ( +/obj/effect/light_emitter{ + name = "cave light"; + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/caves) +"Sx" = ( +/obj/structure/fence/end, +/obj/effect/light_emitter{ + name = "cave light"; + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/caves) +"SI" = ( +/obj/item/flashlight/flare, +/obj/effect/light_emitter{ + name = "cave light"; + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/caves) +"SK" = ( +/obj/structure/kitchenspike, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"SN" = ( +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron/dark, +/area/awaymission/cabin/caves/mountain) "SQ" = ( /obj/structure/table/wood, /obj/item/hatchet{ @@ -4569,19 +5096,11 @@ /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; @@ -4590,39 +5109,91 @@ /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" +"TG" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 }, -/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 + set_luminosity = 6; + light_color = "#9bbbff" }, -/area/awaymission/cabin/caves) +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"TI" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/awaymission/cabin) +"TJ" = ( +/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/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/indestructible, +/area/awaymission/cabin/caves/mountain) +"TK" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks{ + dir = 8 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"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) +"Ua" = ( +/obj/effect/turf_decal/weather/snow, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/iron/dark/snowdin, +/area/awaymission/cabin/caves) +"Ue" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) "Un" = ( /obj/structure/sign/warning/no_smoking/directional/west, /turf/open/floor/wood/freezing, /area/awaymission/cabin/lumbermill) +"Ut" = ( +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/closed/wall/ice, +/area/awaymission/cabin/caves) "Uu" = ( /obj/structure/statue/snow/snowlegion{ anchored = 1; @@ -4631,34 +5202,68 @@ }, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) -"Uv" = ( +"UC" = ( +/obj/structure/chair, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"UE" = ( /obj/effect/light_emitter{ name = "outdoor light"; set_cap = 3; - set_luminosity = 6 + set_luminosity = 6; + light_color = "#9bbbff" }, -/obj/structure/flora/tree/pine/style_random, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/dark, +/area/awaymission/cabin/caves/mountain) +"UG" = ( +/obj/machinery/vending/cigarette, +/obj/machinery/light/small/directional/north, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"UH" = ( +/obj/structure/table, +/obj/item/storage/medkit/regular, +/obj/item/storage/medkit/brute, +/obj/item/storage/medkit/fire, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white, +/area/awaymission/cabin) "UO" = ( /obj/effect/mine/stun, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) -"US" = ( +"UR" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, /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 + set_luminosity = 6; + light_color = "#9bbbff" }, -/area/awaymission/cabin/caves) +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest) "UZ" = ( /obj/item/pickaxe/drill, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) +"Vc" = ( +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/wood/freezing, +/area/awaymission/cabin) "Vg" = ( /obj/machinery/button/door/directional/north{ id = "fightingcommunity50"; @@ -4666,15 +5271,20 @@ }, /turf/open/floor/wood, /area/awaymission/cabin) -"Vj" = ( -/obj/item/flashlight/flare, +"VA" = ( /obj/effect/light_emitter{ - name = "cave light"; set_cap = 3; - set_luminosity = 6 + set_luminosity = 6; + light_color = "#9bbbff" + }, +/obj/structure/flora{ + desc = "Looks frozen."; + icon = 'icons/obj/fluff/flora/snowflora.dmi'; + icon_state = "snowgrass"; + name = "frozen flora" }, /turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) +/area/awaymission/cabin/snowforest) "VC" = ( /obj/item/toy/figure/clown{ desc = "Shut up, we don't talk about him."; @@ -4682,12 +5292,20 @@ }, /turf/open/misc/ice/smooth, /area/awaymission/cabin/caves) -"Wd" = ( -/obj/structure/statue/snow/snowman{ - anchored = 1 +"Wb" = ( +/obj/structure/table/reinforced, +/obj/item/modular_computer/pda/syndicate{ + desc = "A portable microcomputer by Thinktronic Systems, LTD."; + inserted_disk = /obj/item/computer_disk/virus/mime; + name = "soviet tablet" }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) "We" = ( /obj/structure/easel{ desc = "An ancient canvas that was used to produce art so fine, the universe can't handle it!"; @@ -4696,6 +5314,15 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/indestructible, /area/awaymission/cabin/caves/mountain) +"Wg" = ( +/obj/structure/flora/tree/dead/style_random, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/snowforest) "Wp" = ( /obj/effect/decal/cleanable/glitter/blue{ desc = "It looks like fancy glitter to me."; @@ -4704,18 +5331,6 @@ /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) "WF" = ( /obj/item/flashlight/flare/candle/infinite, /turf/open/floor/plating/snowed, @@ -4729,43 +5344,94 @@ /obj/item/clothing/head/helmet/skull, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) -"WK" = ( -/obj/structure/statue/snow/snowman{ - anchored = 1; - name = "Why" +"Xe" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 }, -/obj/item/clothing/head/costume/pirate/bandana{ - pixel_x = -1; - pixel_y = -1 +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" }, -/obj/item/throwing_star{ - desc = "I better not rely on this being useful."; - force = 1; - name = "frozen throwing star"; - throwforce = 1 +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"Xw" = ( +/obj/structure/chair{ + dir = 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 +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"XK" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/obj/item/wrench, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" }, +/turf/open/floor/plating/snowed/snow_cabin, /area/awaymission/cabin/snowforest) -"Xy" = ( +"XM" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, /obj/effect/light_emitter{ - name = "outdoor light"; set_cap = 3; - set_luminosity = 6 + set_luminosity = 6; + light_color = "#9bbbff" }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest) "XO" = ( /obj/effect/decal/cleanable/blood/old, /obj/item/shovel, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) +"XQ" = ( +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin{ + name = "packed snow"; + slowdown = 0 + }, +/area/awaymission/cabin/caves) +"XT" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/snowforest) +"XX" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/snowforest) "Yc" = ( /obj/effect/decal/cleanable/blood/old, /obj/item/melee/baseball_bat, @@ -4775,16 +5441,152 @@ }, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) -"Yd" = ( +"Ye" = ( +/obj/effect/decal/cleanable/shreds{ + pixel_x = -12; + pixel_y = -12 + }, +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/smoothed, +/area/awaymission/cabin/caves) +"Yg" = ( +/mob/living/basic/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 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/misc/asteroid/snow/snow_cabin{ + name = "packed snow"; + slowdown = 0 + }, +/area/awaymission/cabin/snowforest) +"Yp" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/awaymission/cabin) +"YG" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"YI" = ( +/obj/structure/table/reinforced, +/obj/item/cigbutt/cigarbutt, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"YL" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/snowforest) +"YY" = ( +/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; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/smoothed, +/area/awaymission/cabin/caves) +"Zb" = ( /obj/structure/fence{ dir = 4 }, +/obj/structure/sign/nanotrasen, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) -"ZY" = ( -/obj/structure/fence/door, -/turf/open/misc/asteroid/snow/snow_cabin, +"Zf" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, /area/awaymission/cabin/snowforest) +"Zw" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 4 + }, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest) +"ZB" = ( +/obj/effect/decal/cleanable/blood/gibs, +/obj/item/reagent_containers/pill/patch/libital, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"ZH" = ( +/obj/item/lighter/greyscale, +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/turf/open/floor/plating/snowed/snow_cabin, +/area/awaymission/cabin/snowforest/sovietsurface) +"ZI" = ( +/obj/machinery/space_heater, +/obj/machinery/light/directional/south, +/turf/open/floor/wood/freezing, +/area/awaymission/cabin/lumbermill) (1,1,1) = {" ab @@ -7371,15 +8173,15 @@ co cx cx fp -Xy -Xy +UE +UE fM fP TD cx cx -Qf -Xy +KK +UE cx cx co @@ -7632,7 +8434,7 @@ fq fN fN fQ -sY +jQ cx cx td @@ -8150,7 +8952,7 @@ QA cx cx td -Xy +UE sK cx co @@ -8403,7 +9205,7 @@ fq fN fN fR -sY +jQ cx cx td @@ -9174,7 +9976,7 @@ fE fN fN fS -sY +jQ cx cx td @@ -9941,11 +10743,11 @@ co cx fh ft -fF -fK +Ea +SN fN fU -Oo +TJ cx cx td @@ -10198,15 +11000,15 @@ co cx aj ft -fF -fK +Ea +SN fN cx cx cx cx td -Xy +UE cx cx co @@ -10455,8 +11257,8 @@ co cx fk ft -fF -fK +Ea +SN fN fP We @@ -10716,7 +11518,7 @@ fq fN fN fV -sY +jQ cx cx td @@ -11487,7 +12289,7 @@ fq fN fN fW -sY +jQ cx cx td @@ -11747,7 +12549,7 @@ cx cx cx cx -Fq +ti td cx cx @@ -12258,7 +13060,7 @@ fq fN fN fX -sY +jQ cx cx td @@ -12407,14 +13209,14 @@ ab ab ab ab -jm -jm -jm -jm -jm -jm -jm -jm +ue +ue +ue +ue +ue +ue +ue +ue ab ab ab @@ -12663,16 +13465,16 @@ ab ab ab ab -jm -jm -RC -RC -RC -RC -xs -RC -jm -jm +ue +ue +vh +vh +vh +vh +NJ +vh +ue +ue ab ab ab @@ -12919,17 +13721,17 @@ ab ab ab ab -jm -jm -RC -RC -pL -RC -RC -RC -RC -RC -jm +ue +ue +vh +vh +gJ +vh +vh +vh +vh +vh +ue ab ab ab @@ -13025,11 +13827,11 @@ co cx cx fu -Xy -Xy +UE +UE fO fY -sY +jQ cx cx td @@ -13174,20 +13976,20 @@ ab ab ab ab -jm -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm +ue +ue +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue ab ab ab @@ -13429,23 +14231,23 @@ ab ab ab ab -jm -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -jm -jm +ue +ue +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +ue +ue ab ab ab @@ -13540,14 +14342,14 @@ cx cx cx td -Xy +UE cx fZ -go +gS gs gw td -Xy +UE cx cx co @@ -13684,25 +14486,25 @@ ab ab ab ab -jm -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm +ue +ue +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue ab ab ab @@ -13940,27 +14742,27 @@ 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 +ue +ue +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue ab ab ab @@ -14152,8 +14954,8 @@ ab ab ab ab -Oe -qe +IX +pw ab ab ab @@ -14196,29 +14998,29 @@ 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 +ue +ue +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +tr +ue ab ab ab @@ -14256,10 +15058,10 @@ ab ab ab ab -jm -jm -Oe -BZ +ue +ue +IX +tr ab ab ab @@ -14315,7 +15117,7 @@ td td td td -Xy +UE td td td @@ -14408,12 +15210,12 @@ ab ab ab ab -jm -jm -jm -jm -jm -jm +ue +ue +ue +ue +ue +ue ab ab ab @@ -14452,31 +15254,31 @@ 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 +ue +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +ue +ue ab ab ab @@ -14513,10 +15315,10 @@ ab ab ab ab -jm -pL -RC -jm +ue +gJ +vh +ue ab ab ab @@ -14567,7 +15369,7 @@ co cx cx cx -Xy +UE td td td @@ -14575,7 +15377,7 @@ RY td td td -Xy +UE cx cx co @@ -14664,14 +15466,14 @@ ab ab ab ab -jm -jm -RC -RC -pL -RC -jm -jm +ue +ue +vh +vh +gJ +vh +ue +ue ab ab ab @@ -14698,8 +15500,8 @@ ab ab ab ab -jm -jm +ue +ue ab ab ab @@ -14708,32 +15510,32 @@ 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 +ue +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue ab ab ab @@ -14769,13 +15571,13 @@ ab ab ab ab -jm -jm -RC -RC -Af -jm -jm +ue +ue +vh +vh +lB +ue +ue ab ab ab @@ -14919,18 +15721,18 @@ ab ab ab ab -PV -PV -jm -RC -RC -RC +Dt +Dt +ue +vh +vh +vh +vh +vh RC -RC -RC -jm -jm -jm +ue +ue +ue ab ab ab @@ -14953,11 +15755,11 @@ ab ab ab ab -jm -jm -Oe -jm -jm +ue +ue +IX +ue +ue ab ab ab @@ -14965,33 +15767,33 @@ 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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue ab ab ab @@ -15025,16 +15827,16 @@ ab ab ab ab -jm -jm -RC -RC -RC -RC -RC -jm -jm -jm +ue +ue +vh +vh +vh +vh +vh +ue +ue +ue ab ab ab @@ -15164,9 +15966,9 @@ Oe Oe Oe Oe -MN -jm -jm +lD +ue +ue ab ab ab @@ -15174,21 +15976,21 @@ ab ab ab ab -Rt -Rt -PV -qR -qR -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm +CO +CO +Dt +KP +KP +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue ab ab ab @@ -15199,8 +16001,8 @@ ab ab ab ab -jm -jm +ue +ue ab ab ab @@ -15209,46 +16011,46 @@ ab ab ab ab -jm -jm -RC -RC -RC -jm -jm +ue +ue +vh +vh +vh +ue +ue 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 +ue +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +gJ +ue ab ab ab @@ -15281,20 +16083,20 @@ ab ab ab ab -jm -jm -RC -RC -RC -RC -RC -RC -RC -pL -jm -jm -jm -OZ +ue +ue +vh +vh +vh +vh +vh +vh +vh +gJ +ue +ue +ue +zo ab ab ab @@ -15421,32 +16223,32 @@ Oe Oe Oe PV -Rt -qR -jm -jm -jm -jm +CO +KP +ue +ue +ue +ue ab ab ab ab -Rt -qR -qR -qR -qR -qR -qR -RC -RC -RC -RC -RC -RC -RC -jm -jm +CO +KP +KP +KP +KP +KP +KP +vh +vh +vh +vh +vh +vh +vh +ue +ue ab ab ab @@ -15455,58 +16257,58 @@ ab ab ab ab -jm -Oe -jm -jm +ue +IX +ue +ue ab ab ab ab -jm -jm -jm -jm -RC -RC -RC -pL -RC -jm -jm +ue +ue +ue +ue +vh +vh +vh +gJ +vh +ue +ue 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 +ue +ue +ue +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue ab ab ab @@ -15538,22 +16340,22 @@ ab ab ab ab -jm -RC -RC -RC -xy -RC -RC -RC -RC -RC -RC -RC -Oe -jm -jm -jm +ue +vh +vh +vh +Wg +vh +vh +vh +vh +vh +vh +vh +IX +ue +ue +ue ab ab ab @@ -15678,92 +16480,92 @@ 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 +CO +KP +KP +KP +vh +ue +ue +ue +ue +CO +CO +KP +KP +KP +KP +KP +KP +vh +vh +vh +vh +vh +vh +gJ +vh +ue +ue 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 +ue +ue +vh +vh +ue +ue +ue +ue +ue +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue +ue +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue ab ab ab @@ -15794,24 +16596,24 @@ ab ab ab ab -jm -jm -RC -pL -RC -RC -RC -RC -su -RC -RC -su -RC -mi -BU -TM -jm -mE +ue +ue +vh +gJ +vh +vh +vh +vh +BI +vh +vh +BI +vh +EQ +Aj +Sx +ue +CS mP iz mP @@ -15935,107 +16737,108 @@ 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 +CO +KP +KP +KP +KP +KP +vh +vh +gJ +KP +KP +KP +KP +KP +KP +KP +KP +KP +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue 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 +ue +ue +ue 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 +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue +ab +ab +ab +ab +ab +ab +ue +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -16048,27 +16851,26 @@ 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 +ue +Sb +ue +vh +vh +vh +vh +vh +vh +BI +VA +BI +vh +BI +vh +MC +Su +Ut +CS +CS iz iz mP @@ -16192,140 +16994,140 @@ 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 +CO +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue +ue +ue +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ab +ab +ab +ab +ab +ue +ue +ue +ue +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ue +zo +ue +ue +vh +vh +vh +vh +xq +vh +vh +vh +vh +BI +vh +vh +vh +vh +Zb +Su +oz +oz +oz iz mJ mJ @@ -16449,140 +17251,140 @@ 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 +CO +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +vh +vh +KP +KP +KP +KP +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +ue +ue +ab +ab +ab +ue +ue +vh +vh +ue +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ue +ue +vh +xq +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +GD +AD +AD +qg +Ua mJ mJ mJ @@ -16706,140 +17508,140 @@ 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 +CO +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +vh +vh +vh +KP +KP +KP +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue +ue +ue +ue +vh +vh +vh +ue +ue +ab +ab +ab +ab +ab +ab +ab +ab +ab +ue +ue +ue +ue +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xq +BI +vh +vh +vh +vh +vh +Qw +AD +uW +uW +tQ iC iC iC @@ -16963,140 +17765,140 @@ 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 +lD +vh +vh +vh +vh +KP +KP +KP +KP +KP +KP +KP +vh +vh +vh +vh +KP +KP +KP +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh 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 +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +ue +ue +ue +ab +ab +ab +ab +ab +ab +ue +ue +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +Ng +AD +SI +uW +tQ iC iC iC @@ -17220,140 +18022,140 @@ 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 +lD +ue +vh +vh +vh +KP +KP +KP +KP +KP +vh +vh +vh +vh +vh +vh +KP +KP +KP +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Wg +vh +vh +ue +ue +ue +ue +ue +ue +zo +ue +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +st +AD +Su +uW +tQ iC iC iC @@ -17478,139 +18280,139 @@ 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 +ue +vh +vh +KP +KP +KP +KP +KP +vh +vh +vh +vh +vh +vh +vh +KP +KP +KP +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +BI +vh +vh +vh +vh +vh +vh +vh +BI +vh +vh +Qw +AD +uW +uW +tQ iC iC iC @@ -17735,139 +18537,139 @@ 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 +ue +vh +vh +KP +KP +KP +KP +vh +vh +Pv +CH +vh +vh +vh +KP +KP +KP +KP +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gU +vh +xq +vh +vh +vh +vh +vh +vh +xq +vh +vh +vh +xq +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +te +AD +Su +Je +Ua mJ mJ mJ @@ -17992,139 +18794,139 @@ 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 +ue +vh +vh +KP +KP +KP +KP +KP +vh +vh +vh +vh +vh +vh +KP +KP +KP +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Zb +Su +oz +oz +oz iz mJ mJ @@ -18249,139 +19051,139 @@ 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 +ue +vh +vh +KP +KP +KP +KP +KP +vh +vh +vh +vh +vh +vh +KP +KP +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +BI +vh +Jc +vh +YY +Su +Ut +Ut +CS iz iz mP @@ -18506,139 +19308,139 @@ 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 +ue +vh +vh +KP +KP +KP +KP +KP +KP +vh +vh +vh +vh +KP +KP +KP +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Wg +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +Wg +vh +vh +vh +vh +vh +vh +BI +vh +vh +vh +Ye +Aj +Sx +ue +CS mP iz mP @@ -18698,1227 +19500,38 @@ 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 +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 @@ -19934,8 +19547,157 @@ ab ab ab ab +gx +gx +ab +gx +gx +Oe +Oe +Oe +Oe +PV +PV +PV +PV +Oe +Oe +Oe ab ab +ue +vh +vh +vh +KP +KP +KP +KP +KP +KP +vh +vh +KP +KP +KP +KP +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +BI +Kf +ue +ue +mP +mP ab ab ab @@ -19943,13 +19705,25 @@ ab ab ab ab +iz +iz +iz +mP +mP +mP +mP +mP +iz +iz +iz +iz ab ab ab ab ab "} -(60,1,1) = {" +(56,1,1) = {" ab ab ab @@ -19966,20 +19740,20 @@ cx cx fG fG -fI +fG gd gd fG fG -gu -fG -fG -fG fG -hK -kR cx cx +cx +co +co +co +co +co co co co @@ -20029,10 +19803,12 @@ ab ab ab ab -ab -ab -ab -Oe +gx +gx +gx +gx +gx +gx Oe Oe Oe @@ -20041,143 +19817,141 @@ 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 +Oe ab ab ab +ue +vh +vh +vh +vh +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +ue +ue ab ab ab @@ -20206,7 +19980,7 @@ ab ab ab "} -(61,1,1) = {" +(57,1,1) = {" ab ab ab @@ -20227,15 +20001,15 @@ fG gd gd fG -gA -fL -fG -gT -fH -gT +gz fG -kX -kZ +cx +cx +cx +cx +cx +cx +cx cx co co @@ -20289,7 +20063,9 @@ ab ab ab ab -Oe +ab +ab +ab Oe Oe Oe @@ -20298,142 +20074,140 @@ PV PV PV PV -Oe -Oe -Oe -gx -ab +Ao 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 +ue +vh +vh +vh +vh +vh +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gU +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +lB ab ab ab @@ -20463,7 +20237,7 @@ ab ab ab "} -(62,1,1) = {" +(58,1,1) = {" ab ab ab @@ -20479,20 +20253,20 @@ cx cx cx fG +fH fG -fL gd gd -gu -fG -fG -fI fG fG fG -jL -fG -kR +cx +cx +cx +cx +cx +cx +cx cx co co @@ -20546,150 +20320,150 @@ 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 +Oe +Oe +Oe +Oe +PV +PV +PV +PV +Oe +Oe +ab +ab +ab +ab +ue +vh +vh +vh +vh +vh +vh +vh +KP +KP +KP +KP +KP +KP +KP +KP +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Wg +vh +vh +vh +vh +vh +vh +gJ +vh +vh +BI +vh +vh +vh +vh +vh +vh +tr ab ab ab @@ -20720,7 +20494,7 @@ ab ab ab "} -(63,1,1) = {" +(59,1,1) = {" ab ab ab @@ -20735,22 +20509,22 @@ co cx cx cx -fH +fG fG fG gd gd -gd -gd -gd -gd -gd -gd -hJ -hJ -gd -gd -gc +fI +fG +gH +cx +cx +cx +cx +cx +cx +cx +cx co co co @@ -20803,150 +20577,150 @@ ab ab ab ab +ab Oe Oe -ki -ki -ko -ko -ki -ki -ki Oe Oe +Oe +PV +PV +PV +PV +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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +KP +KP +KP +KP +KP +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xq +vh +vh +vh +vh +vh +vh +vh +xq +vh +vh +vh +BI +vh +ue +ue ab ab ab @@ -20977,7 +20751,7 @@ ab ab ab "} -(64,1,1) = {" +(60,1,1) = {" ab ab ab @@ -20994,20 +20768,20 @@ cx cx fG fG -fH -gd -gd -gd -gd -gd -gd -gd -gd -hJ -hJ +fI gd gd -gc +fG +fG +gu +fG +fG +fG +fG +hK +kR +cx +cx co co co @@ -21059,150 +20833,150 @@ ab ab ab ab +ab Oe Oe Oe -ko -ki -ki -ki -ki -ko -ki Oe Oe +PV +PV +PV +PV +PV +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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +KP +KP +KP +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue ab ab ab @@ -21234,7 +21008,7 @@ ab ab ab "} -(65,1,1) = {" +(61,1,1) = {" ab ab ab @@ -21252,18 +21026,18 @@ cx fG fG fG +gd +gd fG -fH -fG -fG -fG -fG -fG -fG -fG -fG +gA fL fG +gT +fH +gT +fG +kX +kZ cx co co @@ -21317,165 +21091,165 @@ 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 +Oe +Oe +Oe +Oe +PV +PV +PV +PV +PV +Oe +Oe +Oe +gx +ab +ab +ab +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +KP +KP +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +BI +vh +vh +vh +ue +ue +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -21491,7 +21265,7 @@ ab ab ab "} -(66,1,1) = {" +(62,1,1) = {" ab ab ab @@ -21507,20 +21281,20 @@ cx cx cx fG -fI -fG fG fL -fG -fG +gd +gd +gu fG fG fI fG fG fG +jL fG -fI +kR cx co co @@ -21574,7 +21348,9 @@ ab ab ab ab -ab +Oe +Oe +Oe PV PV PV @@ -21584,138 +21360,136 @@ 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 +ue +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +Wg +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue ab ab ab @@ -21748,7 +21522,7 @@ ab ab ab "} -(67,1,1) = {" +(63,1,1) = {" ab ab ab @@ -21763,22 +21537,22 @@ co cx cx cx -cx -fG -fG -fG -fG -fG -gB -fG -fG -fG -fG -fG fH fG -cx -cx +fG +gd +gd +gd +gd +gd +gd +gd +gd +hJ +hJ +gd +gd +gc co co co @@ -21831,15 +21605,15 @@ ab ab ab ab -ab -PV -PV -PV -PV -PV -PV Oe Oe +ki +ki +ko +ko +ki +ki +ki Oe Oe gx @@ -21847,131 +21621,131 @@ 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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue +ue +ue ab ab ab @@ -22005,7 +21779,7 @@ ab ab ab "} -(68,1,1) = {" +(64,1,1) = {" ab ab ab @@ -22020,22 +21794,22 @@ co cx cx cx -cx -cx -cx -cx -cx -cx -gD -cx -cx -cx -cx -cx -cx -cx -cx -cx +fG +fG +fH +gd +gd +gd +gd +gd +gd +gd +gd +hJ +hJ +gd +gd +gc co co co @@ -22087,160 +21861,160 @@ 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 +Oe +Oe +Oe +ko +ki +ki +ki +ki +ko +ki +Oe +Oe +gx +gx +gx +ab +ab +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +tr +ue +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -22262,7 +22036,7 @@ ab ab ab "} -(69,1,1) = {" +(65,1,1) = {" ab ab ab @@ -22277,21 +22051,21 @@ co cx cx cx -cx -cx -cx -cx -gr -gr -gr -cx -cx -cx -cx -cx -cx -cx -cx +fG +fG +fG +fG +fH +fG +fG +fG +fG +fG +fG +fG +fG +fL +fG cx co co @@ -22345,7 +22119,8 @@ ab ab ab ab -ab +Oe +Oe PV PV PV @@ -22360,128 +22135,127 @@ 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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Wg +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gU +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue ab ab ab @@ -22519,7 +22293,7 @@ ab ab ab "} -(70,1,1) = {" +(66,1,1) = {" ab ab ab @@ -22534,21 +22308,21 @@ co cx cx cx -cx -cx -cx -cx -cx -gr -gr -cx -cx -cx -cx -cx -cx -cx -cx +fG +fI +fG +fG +fL +fG +fG +fG +fG +fI +fG +fG +fG +fG +fI cx co co @@ -22612,132 +22386,132 @@ PV Oe 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 +ue +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +dC +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Wg +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +ue +Kf ab ab ab @@ -22776,7 +22550,7 @@ ab ab ab "} -(71,1,1) = {" +(67,1,1) = {" ab ab ab @@ -22788,29 +22562,29 @@ co co co co -co -co -co -co cx cx cx -gr -gr -gr cx +fG +fG +fG +fG +fG +gB +fG +fG +fG +fG +fG +fH +fG cx cx co co co co -co -co -co -co -co -co bI bI bI @@ -22859,7 +22633,7 @@ ab ab ab ab -PV +ab PV PV PV @@ -22868,132 +22642,389 @@ PV PV Oe Oe -gx +Oe +Oe gx gx gx ab ab +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +XX +Ez +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 -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 +PV +PV +PV +PV +PV +PV +Oe +Oe +Oe +Oe +gx +gx +gx +ab +ab +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +XX +Fp +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +AB +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +zo ab ab ab @@ -23033,7 +23064,7 @@ ab ab ab "} -(72,1,1) = {" +(69,1,1) = {" ab ab ab @@ -23045,10 +23076,10 @@ co co co co -co -co -co -co +cx +cx +cx +cx cx cx cx @@ -23058,12 +23089,12 @@ gr cx cx cx -co -co -co -co -co -co +cx +cx +cx +cx +cx +cx co co co @@ -23116,13 +23147,14 @@ ab ab ab ab +ab PV PV PV PV PV PV -PV +Oe Oe Oe gx @@ -23131,126 +23163,125 @@ 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 +ue +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +kY +vh +vh +YL +Oq +Oq +Ez +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xq +vh +vh +vh +ue ab ab ab @@ -23290,7 +23321,7 @@ ab ab ab "} -(73,1,1) = {" +(70,1,1) = {" ab ab ab @@ -23302,25 +23333,25 @@ co co co co -co -co -co -co cx cx cx -gr +cx +cx +cx +cx +cx gr gr cx cx cx -co -co -co -co -co -co +cx +cx +cx +cx +cx +cx co co co @@ -23372,14 +23403,15 @@ ab ab ab ab +ab +ab PV PV PV PV PV PV -PV -PV +Oe Oe Oe gx @@ -23389,125 +23421,124 @@ 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 +ue +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +XX +Oq +Oq +XT +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +ue ab ab ab @@ -23547,7 +23578,7 @@ ab ab ab "} -(74,1,1) = {" +(71,1,1) = {" ab ab ab @@ -23566,7 +23597,7 @@ co cx cx cx -cx +gr gr gr cx @@ -23623,13 +23654,13 @@ ab ab ab ab -gx -gx -gx -gx -gx -gx -PV +ab +ab +ab +ab +ab +ab +ab PV PV PV @@ -23638,6 +23669,8 @@ PV PV PV Oe +Oe +gx gx gx gx @@ -23646,125 +23679,380 @@ ab ab ab ab +ue +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +XX +Oq +Fp +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -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 +PV +PV +PV +PV +PV +PV +PV +Oe +Oe +gx +gx +gx +ab +ab +ab +ab +ab +ab +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +qF +sB +sB +sB +sB +sB +sB +Oq +Oq +Fp +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gU +vh +vh +tr ab ab ab @@ -23804,7 +24092,7 @@ ab ab ab "} -(75,1,1) = {" +(73,1,1) = {" ab ab ab @@ -23812,20 +24100,20 @@ ab bI bI bI -bI -bI -bI -bI co co co co -cx +co +co +co +co cx cx cx gr gr +gr cx cx cx @@ -23833,12 +24121,12 @@ co co co co -bI -bI -bI -bI -bI -bI +co +co +co +co +co +co bI bI bI @@ -23878,14 +24166,15 @@ ab ab ab ab -gx -gx -gx -gx -gx ab ab ab +ab +ab +ab +ab +ab +PV PV PV PV @@ -23897,131 +24186,130 @@ Oe Oe 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 -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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +qF +qz +uQ +uQ +uQ +qz +qz +qz +Oq +Oq +Fp +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue ab ab ab @@ -24061,7 +24349,7 @@ ab ab ab "} -(76,1,1) = {" +(74,1,1) = {" ab ab ab @@ -24069,20 +24357,20 @@ ab bI bI bI -bI -bI -bI -bI co co co co -cx +co +co +co +co cx cx cx cx gr +gr cx cx cx @@ -24090,15 +24378,18 @@ co co co co +co +co +co +co +co +co bI bI bI -bI -bI -bI -bI -bI -bI +ab +ab +ab ab ab ab @@ -24139,10 +24430,8 @@ gx gx gx gx -ab -ab -ab -Oe +gx +PV PV PV PV @@ -24160,125 +24449,124 @@ 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 +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +qF +qz +qz +uf +uf +uf +qz +qz +qz +Oq +Oq +Oq +Ez +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +Wg +vh +vh +vh +vh +ue ab ab ab @@ -24318,7 +24606,7 @@ ab ab ab "} -(77,1,1) = {" +(75,1,1) = {" ab ab ab @@ -24391,15 +24679,15 @@ ab ab ab ab -gx ab gx gx gx -Oe -Oe -Oe -Oe +gx +gx +ab +ab +ab PV PV PV @@ -24408,6 +24696,7 @@ PV PV PV Oe +Oe gx gx ab @@ -24418,124 +24707,123 @@ 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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +uM +qz +qz +tc +tc +tc +qz +qz +qz +Oq +Oq +Oq +Fp +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue ab ab ab @@ -24575,11 +24863,7 @@ ab ab ab "} -(78,1,1) = {" -ab -ab -ab -ab +(76,1,1) = {" ab ab ab @@ -24587,6 +24871,10 @@ ab bI bI bI +bI +bI +bI +bI co co co @@ -24607,6 +24895,12 @@ co bI bI bI +bI +bI +bI +bI +bI +bI ab ab ab @@ -24642,161 +24936,151 @@ ab ab ab ab -ab -ab -ab -ab -ab -ab -gx -ab gx gx -Oe -Oe -Oe -Oe -Oe -ki -ki -ki -ki -ki -ko -Oe -Oe -gx -ab +gx +gx +gx ab ab ab +Oe +PV +PV +PV +PV +PV +PV +PV +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 -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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +xt +xt +xt +xt +xt +xt +xt +xt +xt +xt +xt +xt +PE +Vc +Vc +Ag +Vc +Vc +Vc +Vc +Vc +Fu +Fu +Fu +pl +xt +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue ab ab ab @@ -24831,12 +25115,12 @@ ab ab ab ab -"} -(79,1,1) = {" ab ab ab ab +"} +(77,1,1) = {" ab ab ab @@ -24844,6 +25128,10 @@ ab bI bI bI +bI +bI +bI +bI co co co @@ -24851,7 +25139,7 @@ co cx cx cx -gr +cx gr gr cx @@ -24864,12 +25152,12 @@ co bI bI bI -ab -ab -ab -ab -ab -ab +bI +bI +bI +bI +bI +bI ab ab ab @@ -24906,22 +25194,24 @@ ab ab ab gx +ab gx gx gx Oe -gx -gx Oe Oe -ki -ki -ki -ko -ki -ki Oe +PV +PV +PV +PV +PV +PV +PV Oe +gx +gx ab ab ab @@ -24930,126 +25220,124 @@ 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 +ue +ue +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt +xt 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 +an +an +an +an +ao +ao +an +an +an +an +an +an +an +an +ba +ba +an +eq +eq +eq +eq +an +xt +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +ue ab ab ab @@ -25089,7 +25377,7 @@ ab ab ab "} -(80,1,1) = {" +(78,1,1) = {" ab ab ab @@ -25108,8 +25396,8 @@ co cx cx cx -gr -gr +cx +cx gr cx cx @@ -25161,23 +25449,25 @@ ab ab ab ab +ab gx -gx +ab gx gx Oe Oe -gx Oe Oe Oe -PV -PV -PV -PV -PV -PV +ki +ki +ki +ki +ki +ko Oe +Oe +gx ab ab ab @@ -25186,127 +25476,125 @@ 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 +ue +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt an an +Na +aV +ym +au +jk an +aq +aq an -hx +bl +bM +ij +bT +cs +bl an aq -eg +aq an -cU +cS +aL 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 +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue ab ab ab @@ -25346,7 +25634,7 @@ ab ab ab "} -(81,1,1) = {" +(79,1,1) = {" ab ab ab @@ -25418,6 +25706,7 @@ ab ab ab ab +ab gx gx gx @@ -25425,146 +25714,145 @@ 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 +Oe +Oe +ki +ki +ki +ko +ki +ki +Oe +Oe +ab +ab +ab +ab +ab +ab +ab +ab +ab +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +xt iZ -bp +aN aq az -az -az -aq -an -aq +bb +bb eg +bm +eg +nR an eg -aq -aq -aq -aq eg -an -aq +eg +eg +eg +eg +hB +eg eg an +cT 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 +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ab ab ab ab @@ -25603,7 +25891,7 @@ ab ab ab "} -(82,1,1) = {" +(80,1,1) = {" ab ab ab @@ -25675,16 +25963,16 @@ ab ab ab ab -ab -gx gx gx -Oe gx gx +Oe +Oe gx Oe Oe +Oe PV PV PV @@ -25702,126 +25990,126 @@ 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 +ue +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt +iZ +jy +jG +az +bb +az +bh an aq -aA -aI -aA -aq +ht an -br -eg +cA an -cE -aq -aq -aq -aq -ht +an +an +an +hx an aq -ht +Kl an aL aL aL -ed +TI 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 +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +ue +ab ab ab ab @@ -25860,7 +26148,7 @@ ab ab ab "} -(83,1,1) = {" +(81,1,1) = {" ab ab ab @@ -25932,23 +26220,22 @@ ab ab ab ab -ab gx gx gx -Oe -Oe gx Oe -Oe -Oe +gx +gx +gx +gx +Ao PV PV PV PV PV PV -Oe ab ab ab @@ -25961,62 +26248,63 @@ 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 +ue +ue +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt +iZ +bp +aq +az +az +az +aq an aq eg @@ -26031,54 +26319,54 @@ an aq eg an -cU -cW -aL -gN +cV +gL +cV +cV 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 +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue ab ab ab @@ -26117,7 +26405,7 @@ ab ab ab "} -(84,1,1) = {" +(82,1,1) = {" ab ab ab @@ -26193,9 +26481,10 @@ ab gx gx gx -ab Oe gx +gx +gx Oe Oe PV @@ -26204,8 +26493,6 @@ PV PV PV PV -PV -Oe Oe ab ab @@ -26218,125 +26505,126 @@ 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 +ab +ue +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +xt an an aq -eg +aA +Yp +aA +aq an -cz -eg -eg +br eg +an eg -ht +aq +aq +aq +aq +ll an aq eg an -ed aL aL -kE +aL +oP 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 +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +KP +KP +KP +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ab ab ab ab @@ -26374,7 +26662,7 @@ ab ab ab "} -(85,1,1) = {" +(83,1,1) = {" ab ab ab @@ -26450,13 +26738,12 @@ ab gx gx gx -ab +Oe +Oe +gx Oe Oe Oe -PV -PV -PV PV PV PV @@ -26476,124 +26763,125 @@ 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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt +xt an +nU an an -aS -hg -aq -ht an -nT -bo -bo -bo -bo -cB +aR 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 +an +gl +aq +aq +aq +aq +eg +an +aq +eg +an +aL +cW +aL +Qa +an +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +Wg +vh +vh +vh +vh +ue +ab ab ab ab @@ -26631,7 +26919,7 @@ ab ab ab "} -(86,1,1) = {" +(84,1,1) = {" ab ab ab @@ -26709,6 +26997,7 @@ gx gx ab Oe +gx Oe Oe PV @@ -26718,8 +27007,7 @@ PV PV PV PV -PV -PV +Oe Oe ab ab @@ -26732,59 +27020,59 @@ 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 +ue +ue +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +xt an -at -aC +as +aB aH an an @@ -26792,66 +27080,66 @@ an aq eg an -aO -aO -aO -aO -aO -az -az -aq +OQ +eg +eg +eg +eg eg an -eb -cX +aq +eg an +ed +aL +aL +kE 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 +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +vh +vh +vh +vh +ue +ue +ab ab ab ab @@ -26888,7 +27176,7 @@ ab ab ab "} -(87,1,1) = {" +(85,1,1) = {" ab ab ab @@ -26990,125 +27278,125 @@ 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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +xt an -nU an an an -aT an +aS +hg aq eg an -az -aq -aq -az -aq -aq -cO -aq -ht -an +nT +bo +bo +bo +bo +cB an +aq +eg +bV +ed +ed +gM 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 +xt +gJ +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +vh +vh +vh +vh +vh +ue +ab ab ab ab @@ -27145,7 +27433,7 @@ ab ab ab "} -(88,1,1) = {" +(86,1,1) = {" ab ab ab @@ -27217,11 +27505,11 @@ ab ab ab ab +ab gx gx gx ab -ab Oe Oe Oe @@ -27234,6 +27522,7 @@ PV PV PV PV +Oe ab ab ab @@ -27246,126 +27535,125 @@ 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 +ue +gJ +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt +an +at +aC +aH an an -aq -au -jt -aV -aq an -bs -eg -eh -bb +aq eg -bb -hC -bb -hE -he -hG +an +aO +aO +aO +aO +aO +az +az +aq 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 +eb +cX +an +an +xt +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +vh +vh +vh +vh +vh +ue +ue ab ab ab @@ -27402,7 +27690,7 @@ ab ab ab "} -(89,1,1) = {" +(87,1,1) = {" ab ab ab @@ -27422,7 +27710,7 @@ cx cx cx gr -gv +gr gr cx cx @@ -27473,11 +27761,12 @@ ab ab ab ab +ab +ab gx gx gx -gx -Oe +ab Oe Oe Oe @@ -27490,7 +27779,7 @@ PV PV PV PV -PV +Oe ab ab ab @@ -27503,126 +27792,125 @@ 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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt +xt +an +nU +an +an +an +aT an aq -eg +Kl an -aP az -ej -nB -hd +aq +Dy az -aO aq -eg aq +cO +aq +ht 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 +an +an +xt +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +vh +gJ +vh +vh +vh RC -jm +Gb ab ab ab @@ -27659,7 +27947,7 @@ ab ab ab "} -(90,1,1) = {" +(88,1,1) = {" ab ab ab @@ -27730,16 +28018,15 @@ ab ab ab ab +ab gx gx gx +ab +ab Oe Oe Oe -Oe -Oe -PV -PV PV PV PV @@ -27750,136 +28037,137 @@ 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 +ab +ab +ab +ab +ab +ab +ab +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt an -aq -ht an -bq -az -ha -hc -hd -az -az aq -eg +au +nd +aV 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 +an +bs +eg +eh +bb +eg +bb +hC +bb +hE +he +hG +eg +eN +an +xt +xt +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +KP +KP +KP +KP +KP +zY +KP +KP +KP +KP +KP +zY +KP +KP +KP +KP +vh +vh +vh +vh +vh +ue ab ab ab @@ -27916,7 +28204,7 @@ ab ab ab "} -(91,1,1) = {" +(89,1,1) = {" ab ab ab @@ -27935,9 +28223,9 @@ co cx cx cx -cx -cx -cx +gr +nC +gr cx cx cx @@ -27989,7 +28277,8 @@ ab ab gx gx -Ao +gx +gx Oe Oe Oe @@ -28004,139 +28293,138 @@ 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 +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ue +FQ +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +gJ +vh +vh +vh +xt ja -bp +aN aq az az -bb -eg -iY -eg +az +aq +an +aq eg an -bt +aP az ej -jx +nB hd az -cO +aO 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 +an +an +xt +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +vh +vh +vh +vh +vh +ue ab ab ab @@ -28173,7 +28461,7 @@ ab ab ab "} -(92,1,1) = {" +(90,1,1) = {" ab ab ab @@ -28192,9 +28480,9 @@ co cx cx cx -cx -cx -cx +gr +gr +gr cx cx cx @@ -28245,7 +28533,8 @@ ab ab ab gx -ab +gx +gx Oe Oe Oe @@ -28262,10 +28551,7 @@ PV PV PV PV -PV -Ao -Oe -Oe +ab gx gx gx @@ -28273,127 +28559,129 @@ 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 +ab +ab +ue +JZ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt +ja +jy +jF +az +bb +bb +bh an -eg aq +eg an -cN -aq +UG az -aO +ha +hc +hd az -ci -hF -cC +az +aq eg aq -bp +aN 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 +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +vh +vh +vh +vh +ue +ue ab ab ab @@ -28430,7 +28718,7 @@ ab ab ab "} -(93,1,1) = {" +(91,1,1) = {" ab ab ab @@ -28498,12 +28786,12 @@ ab ab ab ab +ab +ab +ab gx gx -gx -gx -Oe -Oe +Ao Oe Oe Oe @@ -28520,9 +28808,8 @@ PV PV PV PV -Oe -Oe -Oe +gx +gx gx gx gx @@ -28530,126 +28817,127 @@ 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 +ue +IX +vh +px +vh +Qi +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +xt +ja +bp aq +az +az +bb +eg +iY +eg +eg an -jE -aq -aq +bt az -aq -aq -aO +ej +jx +hd +az +cO 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 +iR +ao +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +vh +vh +vh +vh +ue ab ab ab @@ -28687,7 +28975,7 @@ ab ab ab "} -(94,1,1) = {" +(92,1,1) = {" ab ab ab @@ -28703,15 +28991,15 @@ co co co co -co -co -co -co -co -co -co -co -co +cx +cx +cx +cx +cx +cx +cx +cx +cx co co co @@ -28755,8 +29043,9 @@ ab ab ab ab -gx -gx +ab +ab +ab gx ab Oe @@ -28776,9 +29065,7 @@ PV PV PV PV -PV -Oe -Oe +Ao Oe Oe gx @@ -28788,125 +29075,126 @@ 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 +ue +wf +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt an an -So -aV -ju -au -ji +Nq +aA +Yp +aA +jj an eg aq an -cO -cO -cO -cO -cO +cN +aq az +aO az +ci +hF +cC +eg 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 +bp +ao +xt +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +KP +KP +zY +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +vh +vh +vh +ue ab ab ab @@ -28944,7 +29232,7 @@ ab ab ab "} -(95,1,1) = {" +(93,1,1) = {" ab ab ab @@ -28960,15 +29248,15 @@ co co co co -co -co -co -co -co -co -co -co -co +cx +cx +cx +cx +cx +cx +cx +cx +cx co co co @@ -29015,13 +29303,13 @@ ab gx gx gx -ab +gx +Oe Oe Oe Oe Oe Oe -PV PV PV PV @@ -29035,135 +29323,135 @@ PV PV PV Oe -Ao Oe Oe gx 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 +ue +Es +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +xt +xt +an +an +an +an +an +an +an +ct aq -az -bb -bb -eg -iX -eg -ht an -hb -bU -ev -eu -cK -cD -GL +jE +aq +Dy +az +aq +aq +aO 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 +xt +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +KP +KP +KP +KP +KP +KP +KP +KP +gm +KP +KP +KP +KP +KP +zY +KP +KP +KP +vh +vh +vh +ue ab ab ab @@ -29201,7 +29489,7 @@ ab ab ab "} -(96,1,1) = {" +(94,1,1) = {" ab ab ab @@ -29268,11 +29556,11 @@ ab ab ab ab +ab gx gx gx ab -ab Oe Oe Oe @@ -29290,7 +29578,7 @@ PV PV PV PV -Oe +PV Oe Oe Oe @@ -29303,124 +29591,124 @@ 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 +ue +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +xt an -aq -eg an -hn -aq -eg -eg -eg -eg +So +aV +sG +au +ji an -aq eg +bh +an +cO +cO +cO +cO +cO +az +az 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 +ht +an +an +xt +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +KP +KP +KP +KP +KP +KP +sI +gm +sI +gm +sI +KP +KP +KP +KP +KP +KP +vh +vh +Wg +ue +ue ab ab ab @@ -29458,7 +29746,7 @@ ab ab ab "} -(97,1,1) = {" +(95,1,1) = {" ab ab ab @@ -29525,15 +29813,15 @@ ab ab ab ab +ab gx gx gx ab -ab Oe Oe Oe -Ao +Oe Oe PV PV @@ -29549,134 +29837,134 @@ PV PV PV Oe -Oe +Ao Oe Oe gx 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 +ue +gJ +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt jb -bp +aN aq az -az -az -aq -an -aq +bb +bb +eg +iX eg -an -bv -bN -nO -aq -ap eg an +hb +bU +ev +eu +cK +cD +GL 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 +an +an +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +KP +KP +KP +KP +KP +KP +sI +gm +sI +KP +KP +KP +KP +KP +KP +KP +vh +vh +vh +ue ab ab ab @@ -29715,7 +30003,7 @@ ab ab ab "} -(98,1,1) = {" +(96,1,1) = {" ab ab ab @@ -29727,23 +30015,23 @@ ab bI bI bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI +co +co +co +co +co +co +co +co +co +co +co +co +co +co +co +co +co bI bI bI @@ -29781,7 +30069,7 @@ ab ab ab ab -gx +ab gx gx gx @@ -29804,7 +30092,7 @@ PV PV PV PV -PV +Oe Oe Oe Oe @@ -29818,122 +30106,122 @@ 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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt +jb +jy +jH +az +bb +az +bh 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 +eg +an +hn +aq +eg +eg +eg +eg +an +aq +eg +aq +aN +ao +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +vh +vh +vh +ue ab ab ab @@ -29972,7 +30260,7 @@ ab ab ab "} -(99,1,1) = {" +(97,1,1) = {" ab ab ab @@ -29984,23 +30272,23 @@ ab bI bI bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI +co +co +co +co +co +co +co +co +co +co +co +co +co +co +co +co +co bI bI bI @@ -30038,16 +30326,16 @@ ab ab ab ab +ab gx gx gx -gx -gx -gx -Ao +ab +ab Oe Oe Oe +Ao Oe PV PV @@ -30069,128 +30357,128 @@ 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 +ue +ue +ue +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt +jb +bp +aq +az +az +az +aq an aq eg an -bw -bO -bO -bO -bO -hz -eo +bv +Qh +TK +aq +Gk eg +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 -RC -RC -RC -RC -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -RC -RC -RC -RC -jm +iU +ao +xt +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +vh +vh +vh +ue ab ab ab @@ -30229,7 +30517,7 @@ ab ab ab "} -(100,1,1) = {" +(98,1,1) = {" ab ab ab @@ -30299,7 +30587,7 @@ gx gx gx gx -gx +ab ab Oe Oe @@ -30318,7 +30606,7 @@ PV PV PV PV -Oe +PV Oe Oe Oe @@ -30333,121 +30621,121 @@ 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 +ab +ue +vh +vh +vh +gJ +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt an an aq +aA +Yp +aA +aq +an +br 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 +bu +an +eo +an +aq +eg +aq +bp +ao +xt +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +vh +vh +gJ +vh +ue ab ab ab @@ -30486,30 +30774,7 @@ 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 +(99,1,1) = {" ab ab ab @@ -30518,6 +30783,29 @@ 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 @@ -30556,9 +30844,9 @@ gx gx gx gx -ab -ab -Oe +gx +gx +Ao Oe Oe Oe @@ -30575,11 +30863,11 @@ PV PV PV PV +PV Oe Oe Oe Oe -Ao gx gx gx @@ -30590,121 +30878,121 @@ 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 +ue +tr +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt +xt an +nU an an an +aU an -hf -hy aq eg an -by +bw bO bO bO bO hz -an -aq +eo +eg 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 +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +vh +vh +vh +vh +ue ab ab ab @@ -30743,27 +31031,7 @@ 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 +(100,1,1) = {" ab ab ab @@ -30772,6 +31040,29 @@ 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 @@ -30811,9 +31102,6 @@ gx gx gx gx -gx -gx -ab ab Oe Oe @@ -30822,147 +31110,147 @@ 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 +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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +Jc +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +xt an -at -aC +as +aB aH an an an aq -ht +eg an -bz +bx bO -bW -ck -cj +cJ +cF +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 +ht +an +an +xt +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +KP +KP +KP +zY +KP +KP +KP +KP +KP +KP +KP +KP +zY +KP +KP +KP +vh +vh +vh +ue +ab ab ab ab @@ -31000,7 +31288,11 @@ ab ab ab "} -(103,1,1) = {" +(101,1,1) = {" +ab +ab +ab +ab ab ab ab @@ -31066,11 +31358,7 @@ gx gx gx gx -gx -gx -gx -gx -gx +ab ab Oe Oe @@ -31079,21 +31367,22 @@ Oe Oe PV PV -JL -JL -JL -JL -JL -JL -JL -JL -JL -Oe -Oe +PV +PV +PV +PV +PV +PV +PV +PV +PV +PV Oe Oe Oe Oe +Ao +gx gx gx gx @@ -31103,123 +31392,122 @@ 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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +xt an -nU an an an -aW an +hf +hy aq -eg -an -an -an -an -an +Kl an -hA +by +bO +bO +bO +bO +hz 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 +an +an +xt +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +vh +vh +ue +ab ab ab ab @@ -31257,7 +31545,9 @@ ab ab ab "} -(104,1,1) = {" +(102,1,1) = {" +ab +ab ab ab ab @@ -31325,32 +31615,31 @@ gx gx gx gx -gx -gx -gx -gx -Ao +ab +ab Oe Oe Oe Oe -JL -JL -JL -JL -JL -JL -JL -JL -JL -JL -JL +Oe +PV +PV +PV +PV +PV +PV +PV +PV +PV +PV +PV +PV Oe Oe Oe Oe Oe -Ao +gx gx gx gx @@ -31360,124 +31649,123 @@ 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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +xt an +at +aC +aH an -aq -au -jv -aV -aq an -bs +an +aq eg an -bA -bB -bX -cl -cl -hi +bz +bO +yW +ck +cj +hz an aq eg aq -bp +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 -RC -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -RC -RC -RC -RC -jm -jm +xt +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +KP +KP +KP +KP +KP +KP +KP +zY +KP +KP +KP +KP +KP +KP +KP +KP +vh +vh +ue +ue +ab ab ab ab @@ -31514,7 +31802,14 @@ ab ab ab "} -(105,1,1) = {" +(103,1,1) = {" +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -31565,17 +31860,10 @@ ab ab ab ab -gx -gx -gx -gx -gx ab ab ab -gx ab -gx gx gx gx @@ -31590,24 +31878,24 @@ Oe Oe Oe Oe +Oe +PV +PV JL JL JL JL -Oe JL JL JL -Oe -Oe JL JL Oe Oe -Ao Oe Oe -gx +Oe +Oe gx gx gx @@ -31617,124 +31905,124 @@ 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 +ab +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt +xt +an +nU +an +an +an +aW 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 +an +an +hA +an +aq +eg +aq +iS +ao +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +vh +vh +vh +vh +ue +ab ab ab ab @@ -31771,7 +32059,17 @@ ab ab ab "} -(106,1,1) = {" +(104,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -31833,21 +32131,7 @@ gx gx gx gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -Oe -Oe -Oe -Oe -Oe +Ao Oe Oe Oe @@ -31855,18 +32139,22 @@ Oe JL JL JL -Oe -Oe -Oe +JL +JL +JL +JL +JL +JL JL JL Oe Oe Oe Oe +Oe +Ao gx gx -ab gx ab ab @@ -31874,124 +32162,124 @@ 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 +ab +ue +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +xt +an an aq +au +Ek +aV +aq +an +bs eg an -bC +bA bB -bY -is -dt -cG +bX +cl +cl +hi 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 +eg +aq +bp +ao +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +vh +vh +vh +vh +ue +ue ab ab ab @@ -32028,7 +32316,7 @@ ab ab ab "} -(107,1,1) = {" +(105,1,1) = {" ab ab ab @@ -32084,10 +32372,11 @@ gx gx gx gx +ab +ab +ab gx -gx -gx -gx +ab gx gx gx @@ -32099,156 +32388,155 @@ gx gx gx ab -ab -Oe -Ao -Oe -Oe -Oe Oe Oe Oe Oe JL JL -LS +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 -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 +ue +ue +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +xt jc -bp +aN aq az -bb -bb -eg -iW -eg -eg -an -an -an -an -an +az +az +aq an +aq +eg an +bB +bB +bB +bB +hi +hi an -aq +hh 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 +xt +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +KP +KP +KP +KP +KP +KP +KP +KP +KP +KP +vh +vh +vh +vh +vh +vh +vh +vh +ue ab ab ab @@ -32285,7 +32573,7 @@ ab ab ab "} -(108,1,1) = {" +(106,1,1) = {" ab ab ab @@ -32365,147 +32653,147 @@ Oe Oe Oe Oe -iv -iv -kj -iv -iv -Oe Oe JL JL JL Oe Oe -gx -gx +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 -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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt +jc +jy +jI +az +bb +az +bh an +aq +eg an -zv -aA -aI -aA -jg +bC +bB +Ic +is +dt +cG an -eg aq +ht 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 +xt +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +KP +KP +KP +KP +KP +KP +KP +vh +vh +Wg +vh +vh +vh +vh +vh +vh +vh +ue ab ab ab @@ -32542,7 +32830,7 @@ ab ab ab "} -(109,1,1) = {" +(107,1,1) = {" ab ab ab @@ -32612,153 +32900,32 @@ 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 +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 @@ -32766,6 +32933,127 @@ ab ab ab ab +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +xt +jc +bp +aq +az +bb +bb +eg +iW +eg +eg +an +an +an +an +an +an +an +an +aq +eg +aq +an +an +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +KP +KP +KP +KP +vh +vh +vh +vh +vh +vh +vh +ue +ue +ue +ue +ab +ab +ab ab ab ab @@ -32799,7 +33087,7 @@ ab ab ab "} -(110,1,1) = {" +(108,1,1) = {" ab ab ab @@ -32868,10 +33156,11 @@ gx gx gx gx -ab -gx gx gx +ab +Oe +Oe Oe Oe Oe @@ -32879,21 +33168,21 @@ Oe Oe Oe iv -iM -iM -iM -iM -iM +iv +kj +iv iv Oe Oe JL JL +JL Oe Oe gx gx gx +gx ab ab ab @@ -32901,122 +33190,121 @@ 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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +xt an an -Vg -aV -jw -au -jh +zv +aA +Yp +aA +jg an eg -aq +bh an -bD -bE +aJ +bG +cv bE -cI -hD -cP -nM -eg +hq +cv +an +aq eg aq -bp +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 -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab +xt +vh +gJ +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue +ue ab ab ab @@ -33056,8 +33344,7 @@ ab ab ab "} -(111,1,1) = {" -ab +(109,1,1) = {" ab ab ab @@ -33125,7 +33412,6 @@ gx gx gx gx -ab gx gx gx @@ -33135,18 +33421,21 @@ Oe Oe Oe Oe +Oe +Oe +iv iv -iP iM -kl iM iM iv +iv Oe Oe JL JL Oe +Oe gx gx gx @@ -33158,120 +33447,119 @@ 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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +sC +xt +an +an +an +an +an +an +an +ct aq an +uS bE bE bE -cP -jq -bE bE +lz +an 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 +iT +ao +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue +ue ab ab ab @@ -33313,9 +33601,7 @@ ab ab ab "} -(112,1,1) = {" -ab -ab +(110,1,1) = {" ab ab ab @@ -33382,15 +33668,17 @@ gx gx gx gx +gx +gx ab -ab -ab -ab -ab +gx +gx +gx +Oe +Oe Oe Oe Oe -Ao Oe iv iM @@ -33404,6 +33692,7 @@ Oe JL JL Oe +Oe gx gx gx @@ -33415,118 +33704,117 @@ 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 +ue +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt +an +an +Vg +aV +bR +au +jh an eg aq an -bF -bP -cm -ho +bD bE -lz -an -aq +bE +cI +hD +cP +nM 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 +eg +aq +bp +ao +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue ab ab ab @@ -33570,8 +33858,7 @@ ab ab ab "} -(113,1,1) = {" -ab +(111,1,1) = {" ab ab ab @@ -33635,154 +33922,155 @@ 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 +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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt jd -bp +aN aq az -az -az -aq -an +bb +bb eg -nS -an -bF -bQ -cu -hp -Wz -hp +iV +eg +aq an +bE +bE +bE +cP +jq +bE +bE aq eg +aq 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 +an +xt +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +ue +ue ab ab ab @@ -33827,7 +34115,7 @@ ab ab ab "} -(114,1,1) = {" +(112,1,1) = {" ab ab ab @@ -33901,22 +34189,25 @@ ab ab ab ab -gx -gx -ab Oe Oe Oe +Ao +Oe iv -iv -iv -iv +iM +iM +iM +iM +iM iv Oe Oe -Oe JL JL +Oe +gx +gx gx ab ab @@ -33926,119 +34217,116 @@ 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 +IX +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +gJ +vh +vh +vh +xt +jd +jy +jJ +az +bb +az +bh an +eg aq -aA -aI -aA -aq -an -in -nN -an -an -an -an -an -an an +bF +bP +cm +ho +bE +lz an aq -ht +eg 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 +an +xt +xt +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue ab ab ab @@ -34084,7 +34372,7 @@ ab ab ab "} -(115,1,1) = {" +(113,1,1) = {" ab ab ab @@ -34158,22 +34446,22 @@ ab ab ab ab -gx -gx -gx -gx -gx -ab -ab ab -gx -gx -gx -gx -gx -gx -LW -LW +Oe +Oe +Oe +Oe +iv +iv +iQ +km +iQ +iv +iv +Oe +Oe +JL +JL gx gx ab @@ -34186,116 +34474,116 @@ 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 +ue +IX +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt +jd +bp +aq +az +az +az +aq an +eg +nS an -aU +bF +LG +RM +hp +UH +hp an -eg -eg -nV -ei -et -hj -hr -hs -et -nV -eg +aq 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 +xt +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue ab ab ab @@ -34341,7 +34629,7 @@ ab ab ab "} -(116,1,1) = {" +(114,1,1) = {" ab ab ab @@ -34415,25 +34703,23 @@ ab ab ab ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx gx gx +ab +Oe +Oe +Oe +iv +iv +iv +iv +iv +Oe +Oe +Oe JL JL gx -gx -gx ab ab ab @@ -34443,115 +34729,117 @@ 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 +ab +ab +ab +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt an an +aq +aA +Yp +aA +aq an +in +nN 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 +an +an +an +an +an +an +aq +ht +an +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue ab ab ab @@ -34598,7 +34886,7 @@ ab ab ab "} -(117,1,1) = {" +(115,1,1) = {" ab ab ab @@ -34672,14 +34960,14 @@ ab ab ab ab -ab -ab -ab gx gx gx gx gx +ab +ab +ab gx gx gx @@ -34690,7 +34978,6 @@ LW LW gx gx -gx ab ab ab @@ -34699,116 +34986,117 @@ 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 +ab +ab +ab +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +xt +xt an +nU an an -aX -bf -bb an -bj -bH +aU an -kk -aq -aq -aq -io -az -bb +eg +eg +nV +ei +et +hj +hr +hs +et +nV +eg +eg 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 +xt +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue ab ab ab @@ -34855,7 +35143,7 @@ ab ab ab "} -(118,1,1) = {" +(116,1,1) = {" ab ab ab @@ -34930,19 +35218,19 @@ ab ab ab ab -ab -ab -ab -ab -ab -ab gx gx gx gx gx gx -Oe +gx +gx +gx +gx +gx +gx +gx JL JL gx @@ -34955,118 +35243,118 @@ 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 +ab +ab +ue +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt an -aF -cL -aw -jC -bb -bb -az +as +aB +aH 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 +ar +an +an +an +an +an +an +an +an +an +cM +hm +an +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +ue +ab ab ab ab @@ -35112,7 +35400,7 @@ ab ab ab "} -(119,1,1) = {" +(117,1,1) = {" ab ab ab @@ -35180,13 +35468,7 @@ gx gx gx gx -ab -ab -ab -ab -ab -ab -ab +gx ab ab ab @@ -35198,10 +35480,16 @@ ab gx gx gx -Oe -Oe -JL -JL +gx +gx +gx +gx +gx +gx +gx +gx +LW +LW gx gx gx @@ -35212,118 +35500,118 @@ 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 +ab +ue +ue +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +xY +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +xt +xt an -aY -xo -bg an -nU an an +an +aX +bf +bb +an +bj +bH +an +sl aq -cp -eg -eg aq -cQ -hI +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 -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ab ab ab ab @@ -35369,7 +35657,10 @@ ab ab ab "} -(120,1,1) = {" +(118,1,1) = {" +ab +ab +ab ab ab ab @@ -35435,10 +35726,6 @@ gx gx gx gx -gx -ab -ab -ab ab ab ab @@ -35455,10 +35742,11 @@ gx gx gx gx +gx +gx Oe JL JL -JL gx gx gx @@ -35468,69 +35756,69 @@ 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 +ab +ue +ue +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt an -hl -bd +an +aF +cL +aw +jC +bb +bb az an -jf -ay +bk +bJ an aq aq @@ -35538,49 +35826,49 @@ aq eg cH cQ -ee +bb 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 +xt +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +ue +ue ab ab ab @@ -35626,7 +35914,11 @@ ab ab ab "} -(121,1,1) = {" +(119,1,1) = {" +ab +ab +ab +ab ab ab ab @@ -35675,9 +35967,6 @@ ab ab ab ab -gx -gx -gx gx gx gx @@ -35707,16 +35996,14 @@ ab ab ab ab -gx -gx +ab gx gx gx Oe +Oe JL JL -JL -gx gx gx gx @@ -35725,120 +36012,121 @@ ab ab ab ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -ad -ad -Un -af -af -af -af -af -Un -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 +ab +ab +ue +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +NI +uU +uU +uU +uU +uU +DI +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt +an +av +aw +ed +hu +an +aY +xo +bg +an +nU an -aZ -be -az -bi -hk -bL an bn +cp +eg +eg aq -aq -aq -aq -az -az +cQ +rk 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 +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ab ab ab ab @@ -35883,7 +36171,8 @@ ab ab ab "} -(122,1,1) = {" +(120,1,1) = {" +ab ab ab ab @@ -35932,12 +36221,6 @@ ab ab ab ab -gx -gx -gx -gx -gx -gx gx gx gx @@ -35962,18 +36245,22 @@ ab ab ab ab +ab +ab +ab +ab +ab +ab +ab +ab gx gx gx gx -gx -gx -Oe Oe JL JL -Oe -Oe +JL gx gx gx @@ -35982,121 +36269,122 @@ ab ab ab ab -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC +ab +ue +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh ad ad -af -af -af -af -jB -af -af -af -af +eG +eG +eH +eG +eG 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 +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt an +aw +ed +ed +hv an -jD -jD +hl +bd +az an -jA -jz +jf +ay an +aq +aq +aq +eg +cH +cQ +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 -RC -RC -RC -RC -RC -RC -RC -jm -jm +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ab +ab ab ab ab @@ -36140,7 +36428,7 @@ ab ab ab "} -(123,1,1) = {" +(121,1,1) = {" ab ab ab @@ -36207,15 +36495,18 @@ 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 @@ -36223,13 +36514,10 @@ gx gx gx gx -gx -gx -Oe Oe JL JL -Oe +JL gx gx gx @@ -36239,121 +36527,121 @@ ab ab ab ab -ab -jm -jm -RC -Sd -RC -RC -RC -RC -RC -RC -RC +ue +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh ad -ew +ad +Un af af -al -kf -ff -eQ -ak af af -eY +af +Un 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 +ad +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt an -ao -ao +aD +aM +du +hw an -ao -ao +aZ +be +az +bi +hk +bL 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 +aq +aq +aq +aq +aq +az +az +an +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +ue +ue +ab ab ab ab @@ -36397,7 +36685,8 @@ ab ab ab "} -(124,1,1) = {" +(122,1,1) = {" +ab ab ab ab @@ -36445,11 +36734,6 @@ ab ab ab ab -gx -gx -gx -gx -gx gx gx gx @@ -36474,7 +36758,12 @@ gx gx gx ab -gx +ab +ab +ab +ab +ab +ab gx gx gx @@ -36485,7 +36774,7 @@ Oe Oe JL JL -JL +Oe Oe gx gx @@ -36495,123 +36784,122 @@ ab ab ab ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC +ue +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh ad ad af af -ak af -am af -fe +jB +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 -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 +ad +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +gJ +xt +an +aE +aQ +dv +an +an +ao +ao +ao +an +an +je +an +an +jD +jD +an +jA +jz +an +an +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue +ab ab ab ab @@ -36654,7 +36942,8 @@ ab ab ab "} -(125,1,1) = {" +(123,1,1) = {" +ab ab ab ab @@ -36729,8 +37018,8 @@ gx gx gx gx -gx -gx +ab +ab gx gx gx @@ -36743,7 +37032,7 @@ Oe JL JL Oe -Oe +gx gx gx gx @@ -36753,122 +37042,121 @@ ab ab ab ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC +ue +ue +vh +Jc +vh +vh +vh +vh +vh +vh +vh ad -jM -af -af +ew af -jV af +al +kf +ff +eQ +ak af af -jM +eY 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 +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt +an +an +an +an +an +xt +xt +xt +xt +xt +xt +xt +xt +an +ao +ao +an +ao +ao +an +xt +xt +vh +vh +gJ +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ab ab ab ab @@ -36911,7 +37199,7 @@ ab ab ab "} -(126,1,1) = {" +(124,1,1) = {" ab ab ab @@ -36987,7 +37275,7 @@ gx gx gx gx -gx +ab gx gx gx @@ -36999,7 +37287,7 @@ Oe Oe JL JL -Oe +JL Oe gx gx @@ -37012,120 +37300,120 @@ ab ab ab ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +ad ad -gY -af af af +ak af +am af +fe 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 +ad +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xt +xt +xt +xt +xt +xt +xt +vh +vh +vh +vh +vh +vh +xt +xt +xt +xt +xt +xt +xt +xt +xt +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +IX +IX ab ab ab @@ -37168,7 +37456,8 @@ ab ab ab "} -(127,1,1) = {" +(125,1,1) = {" +ab ab ab ab @@ -37250,7 +37539,7 @@ gx gx gx gx -Oe +gx Oe Oe JL @@ -37260,7 +37549,6 @@ Oe gx gx gx -gx ab ab ab @@ -37269,120 +37557,120 @@ ab ab ab ab -ab -jm -RC -RC -RC -Sd -RC -RC -RC -RC -RC +ue +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh ad -gY +pH af af -ak af -ak +jV af af -SQ +af +ZI 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 +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +ue +ue ab ab ab @@ -37425,7 +37713,7 @@ ab ab ab "} -(128,1,1) = {" +(126,1,1) = {" ab ab ab @@ -37472,7 +37760,6 @@ ab ab ab ab -gx ab gx gx @@ -37480,163 +37767,46 @@ gx gx gx gx -gx -gx -gx -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 -OF -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 +gx +gx +gx +gx +gx +gx +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 @@ -37645,6 +37815,122 @@ ab ab ab ab +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +ad +gY +af +af +af +af +af +af +af +jR +ad +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue +ab +ab +ab +ab ab ab ab @@ -37681,10 +37967,10 @@ ab ab ab ab -"} -(129,1,1) = {" ab ab +"} +(127,1,1) = {" ab ab ab @@ -37748,7 +38034,10 @@ gx gx gx gx -iz +gx +gx +gx +gx gx gx gx @@ -37773,6 +38062,7 @@ Oe gx gx gx +gx ab ab ab @@ -37782,119 +38072,117 @@ ab ab ab ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC +ue +vh +vh +vh +Jc +vh +vh +vh +vh +vh ad gY af -jW af +ak af -jU -jT +ak af -jR +af +SQ 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 +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue ab ab ab @@ -37939,7 +38227,7 @@ ab ab ab "} -(130,1,1) = {" +(128,1,1) = {" ab ab ab @@ -38004,8 +38292,6 @@ gx gx gx gx -iz -iz gx gx gx @@ -38019,13 +38305,17 @@ gx gx gx gx -Oe +gx +gx +gx +gx Oe Oe JL JL JL Oe +Oe gx gx gx @@ -38039,119 +38329,117 @@ ab ab ab ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC +ue +ue +vh +vh +vh +vh +vh +Jc +vh +vh ad -jM -af -kb -gZ +OF af +ak +jX af -uR +ka +ke af -jM +eA 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 +vh +vh +Jc +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Si +Sg +Sg +tU +Sg +tU +Sg +Sg +Sg +Sg +Ut +ab ab ab ab @@ -38196,7 +38484,8 @@ ab ab ab "} -(131,1,1) = {" +(129,1,1) = {" +ab ab ab ab @@ -38243,7 +38532,6 @@ ab ab ab ab -gx ab gx gx @@ -38262,11 +38550,12 @@ gx gx gx gx -iA -iC +iz +gx +gx +gx gx gx -iA gx gx gx @@ -38278,13 +38567,14 @@ gx gx Oe Oe -JL +Oe JL JL Oe Oe gx gx +gx ab ab ab @@ -38297,119 +38587,117 @@ ab ab ab ab -ab -Ao -jm -RC -RC -RC -RC -RC -RC -RC -ad +ue +vh +vh +vh +vh +vh +vh +vh +vh ad +gY af +jW af -ak -ak -af -kd -kc af +jU +jT af +jR 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 +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ac +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +XQ +ab +ab ab ab ab @@ -38453,7 +38741,7 @@ ab ab ab "} -(132,1,1) = {" +(130,1,1) = {" ab ab ab @@ -38518,12 +38806,10 @@ gx gx gx gx +iz +iz +gx gx -iB -iC -iG -iC -iH gx gx gx @@ -38532,146 +38818,148 @@ gx gx gx gx -Ao -Oe -JL -JL -JL -Oe -Oe 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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +ad +pH +af +kb +gZ +af +af +uR +af +ZI +ad +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +pB +vh +vh +ac +Jz +Jz +Jz +Jz +Jz +ge +Jz +Jz +Jz +XQ +XQ +ab +ab +ab +ab 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 @@ -38710,7 +38998,7 @@ ab ab ab "} -(133,1,1) = {" +(131,1,1) = {" ab ab ab @@ -38775,28 +39063,28 @@ gx gx gx gx -iz +gx iA iC -iC -iC -iJ -iz +gx +gx +iA +gx +gx +gx +gx gx gx gx gx gx -Oe -Oe Oe Oe JL JL JL Oe -gx -gx +Oe gx gx ab @@ -38812,122 +39100,122 @@ ab ab ab ab -jm -jm -RC -RC -RC -RC -RC -RC -RC +Ao +ue +vh +vh +vh +vh +vh +vh +vh ad ad af af +ak +ak af -af -af -af -af +kd +kc 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 +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +xf +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +ge +Jz +XQ +XQ +ab +ab +ab +ab ab ab ab @@ -38967,7 +39255,7 @@ ab ab ab "} -(134,1,1) = {" +(132,1,1) = {" ab ab ab @@ -39032,27 +39320,27 @@ gx gx gx gx -iz -iz -iD +gx +iB +iC +iG +iC iH -iI -iz -iz gx gx gx gx -Oe -Oe -Oe +gx +gx +gx +gx +Ao Oe JL JL JL Oe -gx -gx +Oe gx gx gx @@ -39068,123 +39356,123 @@ ab ab ab ab -jm -jm -RC -Sd -RC -Sd -RC -RC -RC -RC -ae -ad +ab +ab +ue +vh +vh +vh +vh +vh +vh +vh ad -Lt +ex +af af af +jZ af +jY af af -Lt -ad +af +eZ 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 +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +ac +Jz +Yg +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +XQ +XQ +XQ +XQ +ab ab ab ab @@ -39224,7 +39512,7 @@ ab ab ab "} -(135,1,1) = {" +(133,1,1) = {" ab ab ab @@ -39289,13 +39577,15 @@ gx gx gx gx -Oe -iz -iz -iz iz +iA +iC +iC +iC +iJ iz -Oe +gx +gx gx gx gx @@ -39307,9 +39597,6 @@ JL JL JL Oe -Oe -gx -gx gx gx gx @@ -39325,124 +39612,125 @@ ab ab ab ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -ag -cZ +ab +ab +ue +ue +vh +vh +vh +vh +vh +vh +vh ad ad -eH -eG -pj -eG -eH +af +af +af +af +af +af +af +af +af 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 +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +RU +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +XQ +XQ +ab ab ab ab @@ -39481,7 +39769,7 @@ ab ab ab "} -(136,1,1) = {" +(134,1,1) = {" ab ab ab @@ -39529,178 +39817,47 @@ 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 -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 @@ -39713,6 +39870,130 @@ ab ab ab ab +ue +ue +vh +Jc +vh +Jc +vh +vh +vh +vh +UR +ad +ad +Lt +af +af +af +af +af +Lt +ad +ad +Sl +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +ac +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +XQ +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -39737,8 +40018,6 @@ ab ab ab ab -"} -(137,1,1) = {" ab ab ab @@ -39746,6 +40025,14 @@ ab ab ab ab +"} +(135,1,1) = {" +ab +ab +ab +ab +ab +ab ab ab ab @@ -39787,6 +40074,7 @@ ab ab ab gx +ab gx gx gx @@ -39804,10 +40092,11 @@ gx gx gx Oe -Oe -Oe -Oe -Oe +iz +iz +iz +iz +iz Oe gx gx @@ -39815,6 +40104,7 @@ gx Oe Oe Oe +Oe JL JL JL @@ -39826,11 +40116,6 @@ gx gx gx gx -gx -gx -gx -gx -gx ab ab ab @@ -39839,126 +40124,127 @@ 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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +XM +re +ad +ad +eH +eG +pj +eG +eH +ad +ad +re +tL +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ac +Jz +Jz +Jz +Jz +Jz +Jz +Jz +ge +Jz +Jz +Jz +Jz +Jz +ge +Jz +XQ +XQ ab ab ab @@ -39994,10 +40280,10 @@ ab ab ab ab -"} -(138,1,1) = {" ab ab +"} +(136,1,1) = {" ab ab ab @@ -40060,15 +40346,19 @@ gx gx gx gx +gx +gx +Oe Oe Oe -PV Oe Oe Oe gx gx gx +gx +Oe Oe Oe JL @@ -40076,10 +40366,6 @@ JL JL Oe Oe -Oe -gx -gx -gx gx gx gx @@ -40096,127 +40382,127 @@ 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 +Ao +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +XM +re +yQ +qz +qz +zR +Zw +tk +qz +qz +yQ +re +tL +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ac +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +ge +Jz +Jz +Jz +Jz +Jz +XQ +XQ ab ab ab @@ -40251,10 +40537,10 @@ ab ab ab ab -"} -(139,1,1) = {" ab ab +"} +(137,1,1) = {" ab ab ab @@ -40317,17 +40603,20 @@ gx gx gx gx +gx +gx +Oe +Oe +Oe Oe -PV -PV Oe Oe -IU gx gx gx Oe Oe +Oe JL JL JL @@ -40344,137 +40633,6 @@ 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 @@ -40483,6 +40641,126 @@ ab ab ab ab +ue +vh +vh +vh +vh +vh +vh +vh +Jc +vh +XM +re +qz +qz +Jw +JV +md +wC +Jw +qz +qz +re +tL +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ac +Jz +ge +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +XQ +XQ ab ab ab @@ -40508,13 +40786,6 @@ ab ab ab ab -"} -(140,1,1) = {" -ab -ab -ab -ab -ab ab ab ab @@ -40525,6 +40796,8 @@ ab ab ab ab +"} +(138,1,1) = {" ab ab ab @@ -40559,50 +40832,6 @@ 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 @@ -40610,126 +40839,185 @@ 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 +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 +ue +Jc +vh +vh +vh +vh +vh +vh +vh +vh +XM +re +qz +ol +El +JV +md +wC +El +ol +qz +re +tL +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +ac +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +XQ ab ab ab @@ -40766,7 +41054,7 @@ ab ab ab "} -(141,1,1) = {" +(139,1,1) = {" ab ab ab @@ -40836,15 +41124,15 @@ PV PV Oe Oe -Oe +IU +gx +gx gx Oe Oe -Oe -Oe -Oe -Oe -Oe +JL +JL +JL Oe Oe gx @@ -40867,127 +41155,127 @@ 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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +XM +re +qz +Jw +re +JV +md +wC +re +Jw +qz +re +tL +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ac +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +XQ +ab ab ab ab @@ -41023,7 +41311,7 @@ ab ab ab "} -(142,1,1) = {" +(140,1,1) = {" ab ab ab @@ -41094,13 +41382,14 @@ PV Oe Oe Oe +gx +gx Oe Oe Oe -Oe -Oe -Oe -Ao +JL +JL +JL Oe Oe gx @@ -41116,7 +41405,6 @@ gx gx gx gx -gx ab ab ab @@ -41124,126 +41412,126 @@ 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 +ue +vh +vh +Jc +vh +vh +vh +vh +vh +vh +JX +re +qz +El +re +kq +md +wC +re +El +qz +re +tL +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ac +Jz +Jz +ge +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +Jz +es +XQ ab ab ab @@ -41280,7 +41568,7 @@ ab ab ab "} -(143,1,1) = {" +(141,1,1) = {" ab ab ab @@ -41344,12 +41632,14 @@ gx gx gx gx +gx +Oe PV PV Oe -PV Oe Oe +gx Oe Oe Oe @@ -41372,8 +41662,6 @@ gx gx gx gx -gx -gx ab ab ab @@ -41381,127 +41669,127 @@ 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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +XM +re +qz +qz +re +JV +pq +wC +re +qz +qz +re +tL +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +ac +Jz +Jz +Jz +Jz +FK +lW +lW +Ue +Ue +Ue +Ue +Ue +Ue +yg +yg +lW +lW +Bo +XQ +DE ab ab ab @@ -41537,7 +41825,7 @@ ab ab ab "} -(144,1,1) = {" +(142,1,1) = {" ab ab ab @@ -41602,9 +41890,7 @@ gx gx gx gx -PV Oe -IU PV PV Oe @@ -41613,10 +41899,12 @@ Oe Oe Oe Oe -gx -gx -gx -gx +Oe +Oe +Oe +Ao +Oe +Oe gx gx gx @@ -41638,127 +41926,384 @@ 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 +ue +vh +vh +vh +vh +vh +Jc +vh +vh +vh +XM +re +qz +qz +re +Hx +wq +Hf +re +qz +qz +re +tL +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ac +Jz +Jz +Jz +Jz +Qk +zT +Ae +uq +qi +uq +zT +uq +uq +uq +uq +QR +Pu +Ih +XQ +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +ue +Jc +vh +vh +vh +vh +vh +vh +vh +vh +XM +re +qz +qz +qz +JV +pq +wC +qz +qz +qz +re +tL +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ac +Jz +Jz +Jz +es +Qk +Ae +Ae +Hk +Ae +Ae +qn +Ae +ZB +Ae +Ae +Ae +zT +Ih +XQ +ab ab ab ab @@ -41794,7 +42339,7 @@ ab ab ab "} -(145,1,1) = {" +(144,1,1) = {" ab ab ab @@ -41860,16 +42405,16 @@ gx gx gx PV -PV -PV Oe +IU PV PV Oe Oe Oe Oe -gx +Oe +Oe gx gx gx @@ -41894,128 +42439,128 @@ 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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +XM +re +qz +qz +qz +kq +md +XK +qz +qz +qz +re +tL +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ac +Jz +Jz +Jz +Jz +tq +UC +Ae +SK +SK +SK +SK +yP +SK +QC +SK +Ae +yU +Xw +XQ +DE ab ab ab @@ -42051,7 +42596,8 @@ ab ab ab "} -(146,1,1) = {" +(145,1,1) = {" +ab ab ab ab @@ -42100,7 +42646,6 @@ ab ab ab ab -gx gx gx gx @@ -42119,7 +42664,7 @@ gx PV PV PV -PV +Oe PV PV Oe @@ -42151,128 +42696,128 @@ 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 +ue +uZ +vh +vh +vh +vh +vh +vh +vh +vh +vh +XM +re +re +qz +qz +vq +LR +MA +qz +qz +re +re +tL +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue +ue +ue +ue +ue +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +ac +Jz +ge +Jz +Jz +vH +IR +nw +QC +Ae +Ae +DR +yt +Ae +zT +SK +Ae +yU +Xw +AL ab -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -Di -Xa -Xa -Xa -Xa -dc -yR -di -dG -dP -di -dh -dW -dS -ia -dG -di -id -ni -US -DE ab ab ab @@ -42308,7 +42853,8 @@ ab ab ab "} -(147,1,1) = {" +(146,1,1) = {" +ab ab ab ab @@ -42401,135 +42947,134 @@ gx gx gx gx -gx -ab -ab -ab -ab -ab -jm -jm -RC -RC -Sd -RC -RC -RC -RC -RC -Sd -RC -zm -ez -eC -eC -eC -eC -eC -eC -eC -eC -eC -fa -zm -RC -RC -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 +ue +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +Zf +re +re +re +qz +qz +qz +qz +qz +re +re +re +DW +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue +ue +ue +ab +ab +ab +ab +ue +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +ac +Jz +Jz +Jz +Jz +yD +Wb +Ae +SK +uF +Ae +zT +IJ +QV +Ie +SK +Ae +yU +Xw +XQ +DE ab ab ab @@ -42565,7 +43110,8 @@ ab ab ab "} -(148,1,1) = {" +(147,1,1) = {" +ab ab ab ab @@ -42612,7 +43158,6 @@ ab ab ab ab -gx gx gx gx @@ -42633,11 +43178,12 @@ PV PV PV PV -KA +PV PV Oe Oe Oe +Oe gx gx gx @@ -42663,90 +43209,90 @@ 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 +ue +ue +vh +vh +Jc +vh +vh +vh +vh +vh +Jc +vh +Qy +GB +Pi +Pi +Pi +Pi +Pi +Pi +Pi +Pi +Pi +OK +Qy +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue +ue +ue +ue +IX +ue +ue +ue ab ab ab @@ -42755,37 +43301,36 @@ 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 +ue +ue +vh +vh +vh +vh +vh +vh +vh +vh +ac +Jz +Jz +Jz +Jz +Jp +sb +Ae +SK +Ae +QV +Ae +oH +Ae +Ae +SK +Ae +YG +Xw +XQ ab ab ab @@ -42822,7 +43367,8 @@ ab ab ab "} -(149,1,1) = {" +(148,1,1) = {" +ab ab ab ab @@ -42868,8 +43414,6 @@ ab ab ab ab -gx -gx gx gx gx @@ -42891,9 +43435,11 @@ PV PV PV PV +KA PV -PV -gx +Oe +Oe +Oe gx gx gx @@ -42920,134 +43466,133 @@ 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 +uZ +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue +ue +ab +ab +ab +ue +ue +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ue +ue +vh +vh +vh +vh +vh +vh +vh +ac +Jz +Jz +Jz +Jz +Jp +sb +Hk +SK +Ae +Cl +Ae +zT +Ae +zT +SK +Ae +yU +Xw +XQ +ab +ab +ab +ab +ab ab ab ab @@ -43079,7 +43624,8 @@ ab ab ab "} -(150,1,1) = {" +(149,1,1) = {" +ab ab ab ab @@ -43124,7 +43670,6 @@ ab ab ab ab -gx gx gx gx @@ -43170,6 +43715,7 @@ gx gx gx gx +gx ab ab ab @@ -43177,86 +43723,84 @@ 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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +ue +ue +ue +ue +ue +ue +ue +vh +vh +vh +vh +vh +gJ +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue 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 @@ -43273,33 +43817,34 @@ 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 +ue +ue +vh +vh +vh +vh +gJ +vh +ac +Jz +Jz +Jz +Jz +Ll +YI +Ae +SK +Ae +zT +Ae +Ae +Ae +sc +SK +qn +yU +Dr +XQ ab ab ab @@ -43336,7 +43881,8 @@ ab ab ab "} -(151,1,1) = {" +(150,1,1) = {" +ab ab ab ab @@ -43380,7 +43926,6 @@ ab ab ab ab -gx gx gx gx @@ -43435,80 +43980,80 @@ 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 +ue +vh +Jc +vh +vh +vh +Jc +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue +ue +ue +ue +ue +ue +ue +vh +vh +vh +vh +ue +ue +ue +ue 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 +ue +ue +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +gJ +ue +ue ab gx gx @@ -43530,34 +44075,36 @@ ab ab ab ab +ue +ue +ue +ue +vh +ue +ue +Ut +XQ +Jz +ge +Jz +vH +IR +Ae +yP +ZH +Ae +rK +Ae +DR +rK +QC +zT +YG +Xw +XQ 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 @@ -43590,10 +44137,10 @@ ab ab ab ab +"} +(151,1,1) = {" ab ab -"} -(152,1,1) = {" ab ab ab @@ -43656,8 +44203,6 @@ gx gx gx gx -gx -gx PV PV PV @@ -43692,42 +44237,169 @@ 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 +ue +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +ue +ue +ab +ab +ab +ab +ab +ab +ue +ue +ue +ue +ue +ue +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ue +ue +vh +vh +vh +vh +vh +vh +gJ +vh +vh +vh +ue +ue +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 +ue +IX +ue +ab +ab +XQ +XQ +Jz +Jz +tq +UC +qn +SK +QC +SK +SK +SK +SK +SK +SK +Ae +yU +Xw +XQ +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 @@ -43752,18 +44424,148 @@ ab ab ab ab -jm -jm -pL -RC -RC -RC -RC -RC -RC -RC -jm -jm +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ue +ue +gJ +vh +vh +vh +vh +vh +vh +vh +ue +ue ab ab gx @@ -43791,29 +44593,29 @@ ab ab ab ab -jm +ue ab ab ab ab -US -US -qq -bK -di -di -dh -di -di -dW -ds -di -di -di -di -di -nh -US +XQ +XQ +es +Qk +Ae +Ae +zT +Ae +Ae +IJ +Hk +Ae +Ae +Ae +Ae +Ae +Ih +XQ ab ab ab @@ -43949,41 +44751,41 @@ 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 +ue +ue +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +ue +ue ab ab ab @@ -44010,16 +44812,16 @@ ab gx ab ab -jm -jm -RC -RC -RC -RC -RC -RC -jm -jm +ue +ue +vh +vh +vh +vh +vh +vh +ue +ue ab ab ab @@ -44054,23 +44856,23 @@ ab ab ab ab -US -US -bK -dp -dh -dK -dR -dK -dK -dK -dh -dK -dK -di -dp -nh -US +XQ +XQ +Qk +Pu +zT +Md +ze +Md +Md +Md +zT +Md +Md +Ae +Pu +Ih +XQ ab ab ab @@ -44207,39 +45009,39 @@ 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 +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +ue +ue ab ab ab @@ -44268,14 +45070,14 @@ gx ab ab ab -jm -RC -RC -RC -RC -jm -jm -jm +ue +vh +vh +vh +vh +ue +ue +ue gx gx gx @@ -44312,22 +45114,22 @@ ab ab ab ab -US -df -dq -dq -dM -dM -dM -dZ -dM -dM -dM -dM -dq -dq -nk -US +XQ +TG +Xe +Xe +qj +qj +qj +oN +qj +qj +qj +qj +Xe +Xe +Aa +XQ ab ab ab @@ -44464,38 +45266,38 @@ 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 +ue +ue +vh +vh +Jc +vh +vh +vh +Jc +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue ab ab ab @@ -44525,12 +45327,12 @@ gx gx ab ab -jm -jm -jm -Oe -oC -jm +ue +ue +ue +IX +HH +ue gx ab gx @@ -44569,22 +45371,22 @@ ab ab ab ab -US -US -US -Xa -Xa -US -US -US -Xa -Xa -Xa -US -US -US -US -TY +XQ +XQ +XQ +Jz +Jz +XQ +XQ +XQ +Jz +Jz +Jz +XQ +XQ +XQ +XQ +AL gx gx gx @@ -44722,36 +45524,36 @@ 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 +ue +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +ue +ue +ue +ue +ue +ue +ue +vh +Jc +vh +Jc +ue +ue ab ab ab @@ -44828,19 +45630,19 @@ ab ab ab ab -US -US -TY -US +XQ +XQ +AL +XQ ab -US -US -US -TY -US +XQ +XQ +XQ +AL +XQ ab gx -US +XQ DE JL Oe @@ -44980,34 +45782,34 @@ ab ab ab ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -jm -jm +ue +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +vh +Jc +vh +ue +ue ab ab ab ab ab -jm -jm -jm -jm -jm -jm +ue +ue +ue +ue +ue +ue ab ab ab @@ -45237,22 +46039,22 @@ ab ab ab ab -jm -RC -xy -RC -RC -Sd -RC -RC -RC -RC -Sd -RC -RC -RC -jm -jm +ue +vh +Wg +vh +vh +Jc +vh +vh +vh +vh +Jc +vh +vh +vh +ue +ue ab ab ab @@ -45494,21 +46296,21 @@ ab ab ab ab -jm -jm -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -jm -jm +ue +ue +vh +vh +vh +vh +vh +vh +Jc +vh +vh +vh +vh +ue +ue ab ab ab @@ -45752,19 +46554,19 @@ ab ab ab ab -jm -jm -jm -jm -jm -jm -jm -jm -jm -jm -jm -jm -jm +ue +ue +ue +ue +ue +ue +ue +ue +ue +ue +ue +ue +ue ab ab ab @@ -57172,7 +57974,7 @@ ii ii gx ii -mO +im im ii ii @@ -57684,7 +58486,7 @@ ii im im kF -kH +im im im im @@ -58180,7 +58982,7 @@ Oe ii ii ii -jN +im im im jK @@ -58195,7 +58997,7 @@ im ii ii ii -im +mO my kF im @@ -58694,7 +59496,7 @@ Oe ii ik ii -im +mO jK im im @@ -58716,7 +59518,7 @@ im im im im -mI +im ii gx gx @@ -59485,7 +60287,7 @@ kF ii mN im -im +EL im kF mR @@ -66677,7 +67479,7 @@ gx gx ii lS -mI +im ii gx gx @@ -67961,7 +68763,7 @@ gx gx gx no -jN +im im no gx diff --git a/_maps/RandomZLevels/TheBeach.dmm b/_maps/RandomZLevels/TheBeach.dmm index 3c064dc49653b..7b36dfb1471e0 100644 --- a/_maps/RandomZLevels/TheBeach.dmm +++ b/_maps/RandomZLevels/TheBeach.dmm @@ -1,401 +1,411 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/closed/indestructible/sandstone, +"ae" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/vending/clothing, +/turf/open/misc/beach/sand, /area/awaymission/beach) -"ab" = ( -/turf/open/indestructible/binary{ - density = 1; - desc = "I can't move through this."; - icon = 'icons/turf/beach.dmi'; - icon_state = "water"; - name = "deep ocean water" +"ah" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 8 }, +/turf/open/misc/beach/sand, /area/awaymission/beach) -"af" = ( -/turf/open/misc/beach/coast{ - dir = 9 +"ai" = ( +/obj/structure/table/wood, +/obj/item/knife/kitchen{ + pixel_y = 12; + pixel_x = -13 }, +/obj/item/clothing/head/utility/chefhat, +/turf/open/floor/wood/large, /area/awaymission/beach) -"ag" = ( -/turf/open/misc/beach/coast{ - dir = 1 - }, +"an" = ( +/obj/structure/rack, +/obj/item/mop, +/obj/item/extinguisher, +/turf/open/floor/wood/large, /area/awaymission/beach) -"ah" = ( -/turf/open/misc/beach/coast{ - dir = 5 +"at" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, +/obj/machinery/door/airlock/wood{ + name = "Room 7"; + id_tag = "beach_room_7" + }, +/turf/open/floor/wood, /area/awaymission/beach) -"aj" = ( -/turf/open/misc/beach/coast{ - dir = 8 +"aw" = ( +/obj/structure/table/glass, +/obj/machinery/coffeemaker/impressa{ + pixel_y = 13; + pixel_x = -1 + }, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = -6; + pixel_y = 2 }, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = 11; + pixel_y = -1 + }, +/turf/open/floor/iron/dark/diagonal, /area/awaymission/beach) -"ak" = ( -/turf/open/misc/beach/sand, +"aB" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/awaymission/beach) -"al" = ( -/obj/structure/flora/tree/palm{ - desc = "How did you get here?"; - icon_state = "palm2"; - name = "\proper island palm tree" +"aC" = ( +/obj/structure/table/bronze, +/obj/item/reagent_containers/condiment/bbqsauce{ + pixel_y = 13; + pixel_x = 3 }, -/turf/open/misc/beach/sand, +/obj/item/reagent_containers/condiment/hotsauce{ + pixel_y = 9; + pixel_x = -3 + }, +/turf/open/floor/wood/large, /area/awaymission/beach) -"am" = ( -/turf/open/misc/beach/coast{ - dir = 4 +"aE" = ( +/obj/item/cigbutt{ + pixel_y = 21; + pixel_x = -13 }, +/turf/open/floor/wood/large, /area/awaymission/beach) -"an" = ( -/obj/structure/flora/coconuts{ - pixel_x = 17; - pixel_y = 7 +"aT" = ( +/obj/machinery/shower/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 9 }, -/turf/open/misc/beach/sand, +/turf/open/floor/wood, /area/awaymission/beach) -"ao" = ( -/turf/open/misc/beach/coast{ - dir = 10 +"aU" = ( +/obj/machinery/door/airlock/wood{ + name = "Garage" }, +/turf/open/floor/iron/dark/herringbone, /area/awaymission/beach) -"ap" = ( -/turf/open/misc/beach/coast, +"aX" = ( +/obj/machinery/space_heater, +/obj/structure/sign/clock/directional/north, +/turf/open/floor/wood, /area/awaymission/beach) -"aq" = ( -/turf/open/misc/beach/coast{ - dir = 6 +"bg" = ( +/obj/structure/no_effect_signpost{ + pixel_y = 6; + desc = "Northwest: Hotel. South: Seaside Bar. East: Dressing Rooms." }, +/turf/open/misc/beach/sand, /area/awaymission/beach) -"as" = ( -/obj/structure/flora/rock/style_random{ - desc = "A volcanic rock."; - name = "coastal rock" - }, -/obj/structure/flora/bush/stalky/style_random{ - desc = "It can't be smoked."; - name = "sea weed" - }, -/turf/open/indestructible/binary{ - density = 1; - desc = "I can't move through this."; - icon = 'icons/turf/beach.dmi'; - icon_state = "water"; - name = "deep ocean water" +"bi" = ( +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach) +"bx" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/door/airlock/wood{ + name = "Bathroom"; + id_tag = "toiletfarbeach" }, +/turf/open/floor/iron/white, /area/awaymission/beach) -"at" = ( -/obj/structure/flora/rock/style_random{ - desc = "A volcanic rock."; - name = "coastal rock" - }, -/turf/open/indestructible/binary{ - density = 1; - desc = "I can't move through this."; - icon = 'icons/turf/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/costume/pirate, -/obj/item/clothing/glasses/eyepatch, -/obj/item/clothing/suit/costume/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 +"by" = ( +/obj/structure/table/bronze, +/obj/item/clothing/suit/costume/hawaiian{ + pixel_y = 2; + pixel_x = 5 }, -/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/clothing/suit/costume/hawaiian{ + pixel_y = 6; + pixel_x = -4 }, -/turf/open/misc/beach/sand, +/turf/open/floor/wood/parquet, /area/awaymission/beach) -"av" = ( -/turf/open/water/beach, +"bz" = ( +/obj/structure/table/bronze, +/obj/item/clothing/suit/costume/hawaiian{ + pixel_y = 7; + pixel_x = -3 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/wood/parquet, /area/awaymission/beach) -"ay" = ( -/turf/open/misc/beach/coast/corner{ +"bC" = ( +/obj/vehicle/ridden/atv{ dir = 4 }, +/turf/open/floor/iron/dark/herringbone, /area/awaymission/beach) -"az" = ( -/turf/open/misc/beach/coast/corner{ - dir = 8 +"bH" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/railing{ + dir = 1 }, +/turf/open/floor/wood/parquet, /area/awaymission/beach) -"aA" = ( -/obj/structure/flora/tree/palm, +"bY" = ( +/obj/structure/fluff/beach_umbrella/cap, /turf/open/misc/beach/sand, /area/awaymission/beach) -"aB" = ( -/mob/living/simple_animal/crab/kreb, +"cj" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 4 + }, +/obj/item/trash/can{ + pixel_y = -9; + pixel_x = 10 + }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"aC" = ( -/obj/item/flashlight/flare/torch, -/turf/open/misc/beach/sand, +"cn" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/under/costume/lobster, +/obj/item/clothing/head/costume/lobsterhat, +/turf/open/floor/wood, /area/awaymission/beach) -"aD" = ( -/obj/structure/flora/coconuts, -/turf/open/misc/beach/sand, +"cp" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/wood, /area/awaymission/beach) -"aE" = ( -/obj/structure/chair{ - dir = 4 +"cq" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/carpet/cyan, +/area/awaymission/beach) +"cv" = ( +/obj/structure/table/wood, +/obj/item/food/grown/watermelon{ + pixel_y = 8; + pixel_x = 6 }, +/obj/item/food/watermelonslice, /turf/open/misc/beach/sand, /area/awaymission/beach) -"aF" = ( -/obj/structure/bonfire/prelit, +"cw" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 24 + }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"aG" = ( -/obj/item/clothing/mask/gas/tiki_mask, +"cD" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 10 + }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"aH" = ( -/obj/item/reagent_containers/cup/soda_cans/space_mountain_wind{ - pixel_x = -17; - pixel_y = 17 +"cE" = ( +/obj/structure/chair{ + dir = 8 }, -/turf/open/misc/beach/sand, +/turf/open/floor/iron/dark/textured_large, /area/awaymission/beach) -"aI" = ( -/obj/item/melee/skateboard/hoverboard{ - pixel_x = -16; - pixel_y = 1 +"cG" = ( +/obj/item/toy/beach_ball, +/turf/open/misc/beach/coast/corner{ + dir = 4 }, -/turf/open/water/beach, /area/awaymission/beach) -"aK" = ( -/mob/living/simple_animal/crab, -/turf/open/misc/beach/sand, +"cR" = ( +/turf/open/floor/iron/freezer, /area/awaymission/beach) -"aO" = ( -/obj/effect/baseturf_helper/beach/sand, +"cX" = ( +/obj/structure/closet/crate/hydroponics, +/obj/item/popsicle_stick, +/obj/item/popsicle_stick, +/obj/item/popsicle_stick, +/obj/item/reagent_containers/condiment/flour, +/obj/item/reagent_containers/condiment/flour, +/obj/item/reagent_containers/condiment/rice, +/obj/item/reagent_containers/condiment/rice, +/obj/item/food/grown/banana/bunch, /turf/open/misc/beach/sand, /area/awaymission/beach) -"aQ" = ( -/obj/machinery/gateway/away, -/obj/effect/turf_decal/sand, -/turf/open/misc/beach/sand, +"cZ" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 1"; + id_tag = "beach_room_1" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, /area/awaymission/beach) -"aS" = ( +"db" = ( /obj/item/reagent_containers/cup/soda_cans/lemon_lime{ pixel_x = -12; pixel_y = 14 }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"aT" = ( -/turf/open/misc/beach/coast/corner{ +"dc" = ( +/obj/effect/turf_decal/siding/wood/corner{ dir = 1 }, +/turf/open/floor/wood/large, /area/awaymission/beach) -"aX" = ( -/turf/closed/wall/mineral/sandstone, -/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 +"dg" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 }, -/turf/open/floor/wood, +/obj/machinery/vending/cigarette/beach, +/turf/open/floor/wood/large, /area/awaymission/beach) -"bc" = ( -/obj/structure/mirror/directional/north, -/turf/open/floor/wood, +"dh" = ( +/obj/machinery/vending/cola/pwr_game, +/turf/open/floor/eighties, /area/awaymission/beach) -"bd" = ( -/turf/open/floor/wood, +"di" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/water/beach, /area/awaymission/beach) -"be" = ( -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/turf/open/floor/wood, +"dk" = ( +/obj/item/cigbutt{ + pixel_y = -11; + pixel_x = -15 + }, +/turf/open/floor/iron/dark/diagonal, /area/awaymission/beach) -"bf" = ( +"dq" = ( /obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ +/obj/effect/turf_decal/siding/wood{ 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, +"dr" = ( +/obj/structure/musician/piano, +/turf/open/floor/wood, /area/awaymission/beach) -"bh" = ( -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 5 +"dx" = ( +/obj/structure/sign/directions/dorms/directional/north{ + pixel_y = 35 }, -/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 +/obj/structure/sign/directions/medical/directional/north{ + pixel_y = 29 }, -/turf/open/floor/wood, +/obj/machinery/computer/slot_machine, +/turf/open/floor/wood/large, /area/awaymission/beach) -"bj" = ( -/obj/machinery/button/door/directional/west{ - id = "changlinhut1"; - name = "changing room lock"; - normaldoorcontrol = 1; - specialfunctions = 4 +"dL" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Locker Room" }, -/turf/open/floor/wood, +/turf/open/floor/wood/parquet, /area/awaymission/beach) -"bk" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/glasses/heat, -/turf/open/floor/wood, +"dO" = ( +/obj/effect/baseturf_helper/beach/water, +/turf/open/misc/beach/sand, /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 +"dR" = ( +/obj/machinery/door/airlock/wood{ + name = "Balcony"; + id_tag = "beach_room_x" }, -/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 +/obj/structure/railing/corner/end{ + dir = 8 }, /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 +"dS" = ( +/obj/item/kirbyplants/organic/applebush{ + pixel_x = 7 }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bo" = ( -/turf/open/misc/beach/coast/corner, -/area/awaymission/beach) -"bp" = ( -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 8 +/obj/item/kirbyplants/organic/plant17{ + pixel_y = 2; + pixel_x = -8 }, -/turf/open/misc/beach/sand, +/turf/open/floor/wood/large, /area/awaymission/beach) -"bq" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/telecomms/allinone, +"dV" = ( +/obj/effect/turf_decal/siding/blue, /turf/open/misc/beach/sand, /area/awaymission/beach) -"br" = ( -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 4 +"ea" = ( +/obj/structure/table/bronze, +/obj/structure/desk_bell{ + pixel_x = 7; + pixel_y = 8 }, -/turf/open/misc/beach/sand, +/turf/open/floor/wood/large, /area/awaymission/beach) -"bs" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "changlinhut2"; - name = "Changing Room" +"eE" = ( +/obj/structure/table/glass, +/obj/machinery/microwave{ + pixel_y = 15 }, -/turf/open/floor/wood, +/obj/item/cigbutt{ + pixel_y = 2; + pixel_x = -12 + }, +/turf/open/floor/iron/dark/diagonal, /area/awaymission/beach) -"bt" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "changlinhut1"; - name = "Changing Room" +"eH" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 }, -/turf/open/floor/wood, +/turf/open/misc/beach/sand, /area/awaymission/beach) -"bu" = ( +"eT" = ( /obj/structure/table/wood, -/obj/item/reagent_containers/cup/glass/bottle/whiskey{ - pixel_y = 3 +/obj/item/clothing/mask/cigarette/cigar{ + pixel_y = 16; + pixel_x = -2 }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bx" = ( -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 10 +/obj/item/reagent_containers/cup/glass/coffee{ + pixel_x = 8; + pixel_y = 9 }, -/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, +/obj/machinery/cell_charger, +/turf/open/floor/iron/dark/diagonal, /area/awaymission/beach) -"bz" = ( -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 6 +"fa" = ( +/obj/structure/table/reinforced, +/obj/item/toy/plush/slimeplushie{ + pixel_y = 8; + pixel_x = 4 }, -/turf/open/misc/beach/sand, +/turf/open/floor/iron/white/textured_large, /area/awaymission/beach) -"bA" = ( -/obj/structure{ - desc = "Bar and beach south, dorms east."; - icon = 'icons/obj/stationobjs.dmi'; - icon_state = "signpost"; - name = "directions signpost" +"fd" = ( +/obj/structure/table/bronze, +/obj/structure/desk_bell{ + pixel_x = -11; + pixel_y = 9 }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"bB" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "theloveshack1"; - name = "Beach Hut" +/obj/item/phone{ + pixel_y = 9; + pixel_x = 8 }, -/turf/open/floor/wood, +/turf/open/floor/carpet, /area/awaymission/beach) -"bC" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "theloveshack2"; - name = "Beach Hut" +"fe" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/cigbutt{ + pixel_y = -9; + pixel_x = 13 }, -/turf/open/floor/wood, +/turf/open/water/beach, /area/awaymission/beach) -"bD" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "theloveshack3"; - name = "Beach Hut" +"fi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/awaymission/beach) +"fj" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 3"; + id_tag = "beach_room_3" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, /turf/open/floor/wood, /area/awaymission/beach) -"bE" = ( +"fm" = ( /obj/structure/flora/tree/palm{ pixel_y = 25 }, @@ -405,401 +415,392 @@ }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"bF" = ( -/obj/structure/bedsheetbin, -/obj/effect/turf_decal/sand, +"fu" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/item/binoculars{ + pixel_y = 20 + }, +/obj/item/megaphone{ + pixel_y = 2; + pixel_x = 1 + }, /obj/structure/table/wood, -/turf/open/misc/beach/sand, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood, /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" +"fv" = ( +/obj/machinery/chem_master/condimaster{ + name = "CondiMaster Neo" }, -/turf/open/floor/wood, +/turf/open/floor/wood/large, /area/awaymission/beach) -"bJ" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "theloveshack4"; - name = "Beach Hut" +"fz" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/table/wood, +/obj/item/storage/medkit/o2{ + pixel_y = 4; + pixel_x = 1 }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bK" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "theloveshack5"; - name = "Beach Hut" +/obj/effect/turf_decal/siding/wood{ + dir = 9 }, /turf/open/floor/wood, /area/awaymission/beach) -"bL" = ( -/obj/structure/toilet{ - pixel_y = 8 +"fI" = ( +/obj/structure/table/bronze, +/obj/item/clothing/suit/costume/hawaiian{ + pixel_y = 6; + pixel_x = 4 }, -/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/directional/south, -/turf/open/floor/iron/white, -/area/awaymission/beach) -"bN" = ( -/obj/structure/mirror/directional/west, -/obj/effect/turf_decal/sand, -/obj/structure/sink/directional/south, -/turf/open/floor/iron/white, +/turf/open/floor/wood/parquet, /area/awaymission/beach) -"bO" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/cup/glass/bottle/tequila{ - pixel_y = 2 +"fM" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 4 }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bP" = ( -/obj/item/trash/chips{ - pixel_x = -18; - pixel_y = 7 +/obj/structure/chair/plastic{ + dir = 4 }, /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 +"fU" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 14 }, -/turf/open/floor/iron/white, +/turf/open/misc/beach/sand, /area/awaymission/beach) -"bS" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/button/door/directional/west{ - id = "toilet2"; - name = "restroom lock"; - normaldoorcontrol = 1; - specialfunctions = 4 +"fV" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, -/turf/open/floor/iron/white, +/turf/open/floor/wood/large, /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, +"fX" = ( +/obj/structure/chair, +/turf/open/misc/beach/sand, /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 +"gd" = ( +/obj/effect/spawner/random/entertainment/arcade{ + dir = 8 }, -/turf/open/floor/wood, +/turf/open/floor/eighties, /area/awaymission/beach) -"bV" = ( -/obj/structure/sign/poster/ripped/directional/east, +"gi" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 4 + }, /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 +"gj" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 8 }, -/turf/open/floor/wood, +/turf/open/misc/beach/sand, /area/awaymission/beach) -"bX" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "toilet1"; - name = "Restroom Stall" +"gk" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, -/obj/effect/turf_decal/sand, -/turf/open/floor/iron/white, +/turf/closed/wall/mineral/wood, /area/awaymission/beach) -"bY" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "toilet2"; - name = "Restroom Stall" +"gw" = ( +/obj/item/stack/sheet/mineral/sandstone{ + pixel_x = -8 }, -/obj/effect/turf_decal/sand, -/turf/open/floor/iron/white, -/area/awaymission/beach) -"bZ" = ( -/obj/structure/dresser{ - density = 0 +/obj/item/stack/sheet/mineral/sandstone{ + pixel_x = 5 }, -/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/directional/west, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cc" = ( -/obj/item/trash/can{ - pixel_x = 14; +/obj/item/stack/sheet/mineral/sandstone{ + pixel_x = 1; pixel_y = 7 }, +/obj/item/stack/sheet/mineral/sandstone{ + pixel_x = -12; + pixel_y = 6 + }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"cd" = ( -/obj/machinery/vending/cola/starkist, -/obj/effect/turf_decal/sand, -/turf/open/misc/beach/sand, +"gG" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/water/beach, /area/awaymission/beach) -"cf" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, +"gI" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 4 + }, +/turf/open/misc/beach/sand, /area/awaymission/beach) -"cg" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/vending/cola/space_up, +"gP" = ( +/obj/structure/chair/plastic, /turf/open/misc/beach/sand, /area/awaymission/beach) -"ch" = ( -/obj/structure/flora/tree/palm, -/obj/structure/flora/coconuts, +"gR" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"ci" = ( -/obj/structure/closet/gmcloset, -/turf/open/floor/wood, +"hf" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/water/beach, /area/awaymission/beach) -"cj" = ( -/obj/structure/closet/secure_closet/bar/all_access, -/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, +"ho" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/door/poddoor/shutters{ + id = "BeachBoats" + }, +/turf/open/water/beach, /area/awaymission/beach) -"ck" = ( -/obj/effect/mob_spawn/corpse/human/bartender, +"hp" = ( +/obj/structure/table/bronze, +/obj/structure/sign/poster/random/directional/east, +/obj/machinery/button/door/directional/south{ + id = "beach_room_10" + }, +/obj/item/table_clock{ + pixel_y = 4 + }, /turf/open/floor/wood, /area/awaymission/beach) -"cl" = ( -/obj/machinery/processor, -/obj/structure/table/wood, +"hC" = ( +/obj/structure/railing{ + dir = 8 + }, /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." +"hD" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/turf/open/floor/wood, +/obj/item/clothing/mask/breath/medical{ + pixel_y = 7; + pixel_x = -9 + }, +/obj/item/clothing/mask/breath/medical{ + pixel_y = 4; + pixel_x = 3 + }, +/obj/item/clothing/gloves/latex, +/obj/structure/table/glass, +/turf/open/floor/wood/large, /area/awaymission/beach) -"co" = ( -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/drinks/fullupgrade, -/obj/structure/sign/picture_frame{ - pixel_y = 32 +"hL" = ( +/turf/open/misc/beach/coast/corner{ + dir = 1 }, -/turf/open/floor/wood, /area/awaymission/beach) -"cp" = ( -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/drinks/beer/fullupgrade, -/turf/open/floor/wood, +"hQ" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/water/beach, /area/awaymission/beach) -"cq" = ( -/obj/structure/table/wood, -/obj/machinery/microwave, +"im" = ( +/obj/structure/table/bronze, +/obj/structure/sign/poster/random/directional/east, +/obj/item/table_clock{ + pixel_y = 4 + }, /turf/open/floor/wood, /area/awaymission/beach) -"cr" = ( -/obj/structure/closet/secure_closet/freezer/kitchen/all_access, -/obj/item/storage/fancy/egg_box, -/obj/item/reagent_containers/condiment/milk, -/obj/item/reagent_containers/condiment/milk, -/obj/item/reagent_containers/condiment/flour, -/obj/item/reagent_containers/condiment/flour, -/obj/item/reagent_containers/condiment/mayonnaise, -/obj/item/reagent_containers/condiment/sugar, -/obj/item/reagent_containers/condiment/sugar, -/obj/item/reagent_containers/condiment/enzyme, -/turf/open/floor/wood, +"io" = ( +/obj/effect/spawner/random/entertainment/arcade{ + dir = 4 + }, +/turf/open/floor/wood/large, /area/awaymission/beach) -"cs" = ( -/obj/effect/spawner/random/vending/snackvend, -/obj/effect/turf_decal/sand, -/turf/open/misc/beach/sand, +"iq" = ( +/obj/machinery/washing_machine, +/obj/machinery/light/directional/north, +/turf/open/floor/plastic, /area/awaymission/beach) -"ct" = ( -/obj/effect/turf_decal/stripes/white/corner, -/turf/open/misc/beach/sand, +"iw" = ( +/obj/structure/sign/poster/official/fruit_bowl/directional/north, +/turf/open/floor/carpet, /area/awaymission/beach) -"cu" = ( -/obj/effect/turf_decal/stripes/white/line, -/turf/open/misc/beach/sand, +"iy" = ( +/obj/structure/sign/poster/contraband/pwr_game/directional/west, +/turf/open/floor/eighties, /area/awaymission/beach) -"cv" = ( -/obj/effect/turf_decal/stripes/white/corner{ +"iA" = ( +/obj/effect/turf_decal/siding/wood{ 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, +/turf/open/water/beach, /area/awaymission/beach) -"cx" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 +"iF" = ( +/obj/item/trash/candy{ + pixel_y = 9; + pixel_x = -9 }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cy" = ( -/obj/effect/turf_decal/stripes/white/full, -/turf/open/misc/beach/sand, +/turf/open/floor/wood/large, /area/awaymission/beach) -"cz" = ( -/obj/effect/turf_decal/stripes/white/line{ +"iI" = ( +/mob/living/basic/crab, +/obj/effect/turf_decal/stripes/red/line{ dir = 8 }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"cA" = ( -/obj/structure/mineral_door/wood{ - name = "bar" - }, -/turf/open/floor/wood, +"iJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/rack, +/obj/effect/spawner/random/maintenance/three, +/obj/effect/decal/cleanable/cobweb, +/obj/item/wheelchair, +/turf/open/floor/plating, /area/awaymission/beach) -"cC" = ( -/obj/structure/table/wood, -/obj/item/food/burger/crab{ +"iM" = ( +/obj/structure/table/glass, +/obj/item/storage/box/coffeepack{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/box/donkpockets{ + pixel_y = 10; + pixel_x = 11 + }, +/obj/item/storage/fancy/donut_box{ + pixel_y = 18; pixel_x = -11 }, -/turf/open/floor/wood, +/obj/item/food/donut/berry{ + pixel_y = 5; + pixel_x = -6 + }, +/turf/open/floor/iron/dark/diagonal, /area/awaymission/beach) -"cD" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/cup/rag{ - pixel_y = 7 +"iN" = ( +/obj/structure/table/wood/poker, +/obj/item/stack/spacecash/c100{ + pixel_y = 5 }, -/obj/item/food/burger/crab{ - pixel_x = -14; - pixel_y = 9 +/obj/item/toy/cards/deck{ + pixel_y = 13; + pixel_x = -5 }, -/turf/open/floor/wood, -/area/awaymission/beach) -"cE" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/cup/soda_cans/dr_gibb, -/turf/open/floor/wood, +/turf/open/floor/wood/large, /area/awaymission/beach) -"cF" = ( +"iU" = ( /obj/structure/table/wood, -/obj/item/reagent_containers/cup/soda_cans/lemon_lime, -/turf/open/floor/wood, +/obj/machinery/chem_dispenser/drinks/fullupgrade{ + dir = 4 + }, +/turf/open/floor/wood/large, /area/awaymission/beach) -"cG" = ( -/obj/item/toy/beach_ball, +"iW" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"cH" = ( -/obj/effect/turf_decal/sand, -/obj/structure/chair/stool/directional/north, -/turf/open/misc/beach/sand, +"iY" = ( +/obj/structure/sign/departments/custodian/directional/north{ + pixel_x = -32 + }, +/turf/open/floor/wood/large, /area/awaymission/beach) -"cI" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/barsign/all_access/directional/north, -/turf/open/misc/beach/sand, +"jm" = ( +/obj/structure/table/reinforced, +/obj/machinery/cell_charger{ + pixel_y = 13; + pixel_x = 21 + }, +/obj/item/clothing/glasses/hud/health{ + pixel_y = 1; + pixel_x = 18 + }, +/obj/item/stack/medical/gauze{ + pixel_x = -15; + pixel_y = 10 + }, +/obj/item/storage/belt/medical{ + pixel_y = 3; + pixel_x = -3 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white/textured_large, /area/awaymission/beach) -"cJ" = ( -/obj/effect/turf_decal/stripes/white/corner, -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 +"jF" = ( +/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/misc/beach/sand, +/turf/open/floor/wood/large, /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 +"jH" = ( +/obj/item/storage/box/fishing_hooks{ + pixel_y = 14 + }, +/obj/item/storage/box/fishing_lines{ + pixel_y = 12; + pixel_x = 18 }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"cM" = ( -/obj/structure/table, -/obj/item/food/chips, -/turf/open/misc/beach/sand, +"jI" = ( +/obj/structure/railing{ + dir = 10 + }, +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 9; + pixel_x = 6 + }, +/turf/open/floor/wood, /area/awaymission/beach) -"cN" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/soda_cans/sodawater, -/obj/item/reagent_containers/cup/soda_cans/shamblers, -/obj/item/reagent_containers/cup/soda_cans/pwr_game, -/obj/item/reagent_containers/cup/soda_cans/air, -/obj/item/reagent_containers/cup/soda_cans/canned_laughter, -/obj/item/reagent_containers/cup/soda_cans/tonic, +"jM" = ( +/obj/item/clothing/head/soft/black{ + pixel_x = -1; + pixel_y = -3 + }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"cO" = ( -/obj/structure/chair, -/turf/open/misc/beach/sand, +"jU" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/plating, /area/awaymission/beach) -"cP" = ( -/obj/item/reagent_containers/cup/soda_cans/lemon_lime{ - pixel_x = -12; - pixel_y = -7 +"jW" = ( +/turf/closed/wall/mineral/sandstone, +/area/awaymission/beach) +"jZ" = ( +/obj/structure/bed/double, +/obj/item/bedsheet/hop/double{ + desc = "A blue bedsheet. Likely from the beach hotel."; + name = "blue bedsheet" }, -/obj/item/reagent_containers/cup/soda_cans/dr_gibb{ - pixel_x = 13; - pixel_y = -7 +/turf/open/floor/carpet/cyan, +/area/awaymission/beach) +"ke" = ( +/obj/effect/turf_decal/sand/plating, +/obj/item/reagent_containers/cup/bucket/wooden{ + pixel_y = 17; + pixel_x = -6 }, -/obj/structure/fluff/beach_umbrella, /turf/open/misc/beach/sand, /area/awaymission/beach) -"cQ" = ( +"kh" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"kl" = ( /obj/item/reagent_containers/cup/soda_cans/starkist{ pixel_x = -12; pixel_y = -6 @@ -807,14786 +808,68764 @@ /obj/structure/fluff/beach_umbrella/cap, /turf/open/misc/beach/sand, /area/awaymission/beach) -"cR" = ( -/obj/item/reagent_containers/cup/soda_cans/cola{ - pixel_x = -8; - pixel_y = -4 +"ko" = ( +/obj/structure/closet/secure_closet/freezer/empty, +/obj/item/food/popsicle/creamsicle_berry, +/obj/item/food/popsicle/creamsicle_berry, +/obj/item/food/popsicle/creamsicle_orange, +/obj/item/food/popsicle/creamsicle_orange, +/obj/item/food/popsicle/jumbo, +/obj/item/food/popsicle/pineapple_pop, +/obj/item/food/popsicle/pineapple_pop, +/obj/item/food/fishmeat, +/obj/item/food/fishmeat, +/obj/item/food/fishmeat, +/obj/item/food/fishmeat, +/obj/item/food/fishmeat, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"kp" = ( +/obj/effect/decal/cleanable/oil, +/obj/machinery/button/door/directional/south{ + id = "BeachGarage" }, -/turf/open/misc/beach/sand, +/turf/open/floor/iron/dark/herringbone, /area/awaymission/beach) -"cS" = ( -/obj/item/reagent_containers/cup/soda_cans/dr_gibb{ - pixel_x = -9; - pixel_y = -9 +"kz" = ( +/obj/item/storage/medkit/regular{ + pixel_y = 15; + pixel_x = -2 }, -/obj/structure/fluff/beach_umbrella/engine, -/turf/open/misc/beach/sand, +/obj/structure/table/glass, +/obj/item/emergency_bed{ + pixel_y = 6 + }, +/turf/open/floor/iron/white/textured_large, /area/awaymission/beach) -"cT" = ( -/obj/item/reagent_containers/cup/soda_cans/space_mountain_wind, -/turf/open/misc/beach/sand, +"kB" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/wood/large, /area/awaymission/beach) -"cU" = ( -/obj/item/reagent_containers/cup/soda_cans/cola{ - pixel_x = -8; +"kC" = ( +/obj/structure/sign/chalkboard_menu{ + pixel_y = 32 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"kD" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/glasses/heat, +/obj/item/clothing/head/cowboy/brown, +/turf/open/floor/wood, +/area/awaymission/beach) +"kG" = ( +/obj/effect/baseturf_helper/beach/sand, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"kI" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/carpet, +/area/awaymission/beach) +"kR" = ( +/obj/machinery/button/door/directional/north{ + id = "beach_room_12" + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"kZ" = ( +/turf/open/floor/eighties, +/area/awaymission/beach) +"lb" = ( +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"lf" = ( +/obj/structure/chair/stool/directional/south, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/freezer, +/area/awaymission/beach) +"li" = ( +/obj/machinery/chem_dispenser/drinks/beer/fullupgrade{ + dir = 4 + }, +/obj/structure/table/wood, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"lk" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/effect/turf_decal/tile/dark/half{ + pixel_y = -1; + pixel_x = 5; + dir = 8 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"ll" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 11"; + id_tag = "beach_room_11" + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/awaymission/beach) +"ls" = ( +/obj/structure/flora/coconuts, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"lz" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 10"; + id_tag = "beach_room_10" + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/awaymission/beach) +"lB" = ( +/obj/machinery/door/poddoor/shutters{ + id = "BeachBoats" + }, +/turf/open/water/beach, +/area/awaymission/beach) +"lP" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 16 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"lS" = ( +/obj/machinery/medical_kiosk, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"lY" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plating, +/area/awaymission/beach) +"mb" = ( +/obj/structure/chair/stool/bar/directional/west, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"mf" = ( +/obj/item/toy/seashell, +/turf/open/misc/beach/coast/corner{ + dir = 8 + }, +/area/awaymission/beach) +"mg" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/under/costume/pirate, +/turf/open/floor/wood, +/area/awaymission/beach) +"mi" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"mk" = ( +/obj/machinery/door/airlock/wood{ + name = "Trash Disposal" + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"mp" = ( +/obj/item/radio/off{ + pixel_y = 16; + pixel_x = -5 + }, +/obj/item/storage/box/monkeycubes{ + pixel_y = 10; + pixel_x = 4 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 2 + }, +/obj/structure/table/glass, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"mG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark/half{ + pixel_y = -1; + pixel_x = 5; + dir = 8 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"mJ" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"mN" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"mO" = ( +/obj/item/reagent_containers/cup/soda_cans/sol_dry{ + pixel_y = 18; + pixel_x = 9 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"mP" = ( +/obj/structure/table/wood, +/obj/item/tape{ + pixel_y = 7; + pixel_x = 11 + }, +/obj/item/reagent_containers/cup/glass/coffee{ + pixel_x = -7; + pixel_y = 12 + }, +/obj/effect/spawner/random/bureaucracy/pen{ + pixel_x = -3; + pixel_y = -2 + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"mT" = ( +/obj/machinery/vending/games, +/turf/open/floor/eighties, +/area/awaymission/beach) +"mU" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/under/costume/sailor, +/turf/open/floor/wood, +/area/awaymission/beach) +"ni" = ( +/turf/open/misc/beach/coast{ + dir = 10 + }, +/area/awaymission/beach) +"nq" = ( +/obj/effect/turf_decal/sand, +/mob/living/basic/crab, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"nr" = ( +/obj/structure/mineral_door/sandstone{ + name = "Sandcastle" + }, +/obj/effect/turf_decal/sand/plating, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"ns" = ( +/obj/item/retractor{ + pixel_y = 8; + pixel_x = -2 + }, +/obj/item/cautery{ + pixel_y = 10 + }, +/obj/item/hemostat{ + pixel_y = -11 + }, +/obj/item/bonesetter{ + pixel_y = -12 + }, +/obj/structure/table/glass, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"nC" = ( +/obj/effect/turf_decal/tile/dark_red/full, +/turf/open/floor/iron/smooth_large, +/area/awaymission/beach) +"nD" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/door/airlock/wood{ + name = "Room 1" + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"nK" = ( +/obj/machinery/medical_kiosk, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach) +"nO" = ( +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 5 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"nV" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 25 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"nW" = ( +/obj/machinery/door/airlock/wood/glass{ + name = "Beach Access" + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"oa" = ( +/obj/machinery/door/airlock/wood/glass{ + name = "Rooms" + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"ob" = ( +/obj/machinery/door/airlock/wood{ + name = "Employees' Only" + }, +/turf/open/floor/plastic, +/area/awaymission/beach) +"oi" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/shower/directional/south, +/obj/structure/sink/directional/east, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"om" = ( +/obj/item/trash/can{ + pixel_y = -5; + pixel_x = 4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"oq" = ( +/obj/structure/rack, +/obj/item/melee/skateboard/hoverboard{ + pixel_x = -7 + }, +/obj/item/melee/skateboard/hoverboard, +/obj/item/melee/skateboard/hoverboard{ + pixel_x = 7 + }, +/turf/open/misc/beach/coast/corner{ + dir = 4 + }, +/area/awaymission/beach) +"ot" = ( +/obj/structure/chair/plastic{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"ow" = ( +/obj/machinery/reagentgrinder{ + pixel_y = 15; + pixel_x = -1 + }, +/obj/structure/table/bronze, +/obj/structure/desk_bell{ + pixel_x = 12; + pixel_y = 3 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"oC" = ( +/obj/structure/closet/crate/bin, +/obj/item/flashlight/glowstick/yellow, +/obj/item/trash/candy, +/turf/open/floor/eighties, +/area/awaymission/beach) +"oX" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/machinery/button/door/directional/west{ + id = "beach_room_7" + }, +/obj/item/clothing/suit/apron/overalls, +/turf/open/floor/wood, +/area/awaymission/beach) +"pd" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"pr" = ( +/obj/item/reagent_containers/cup/soda_cans/space_mountain_wind{ + pixel_x = -17; + pixel_y = 17 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"pt" = ( +/obj/structure/table/bronze, +/obj/item/book/manual/wiki/barman_recipes{ + pixel_x = 9; + pixel_y = 7; + name = "Tropical Mixing for Tropical Bartenders" + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_y = 10; + pixel_x = -12 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"pw" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"pC" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/button/door/directional/south{ + id = "BeachBoats" + }, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"pD" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 19; + pixel_x = 10 + }, +/obj/machinery/hydroponics/constructable, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"pE" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Temporary Holding Cell" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/all/security/entrance, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/beach) +"pF" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 3; + pixel_x = -4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"pM" = ( +/obj/structure/marker_beacon/teal, +/turf/open/water/beach, +/area/awaymission/beach) +"pN" = ( +/obj/machinery/processor, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"pO" = ( +/obj/machinery/door/airlock/wood{ + name = "Docks" + }, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"pT" = ( +/obj/item/flashlight/flare/torch{ + pixel_x = -11; + pixel_y = -6 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"pX" = ( +/obj/structure/sink/kitchen/directional/south, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"qf" = ( +/obj/structure/table/bronze, +/obj/item/pai_card{ + 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"; + pixel_y = 2 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"qk" = ( +/obj/machinery/telecomms/allinone, +/obj/item/wirecutters{ + pixel_y = 9 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"ql" = ( +/obj/effect/turf_decal/siding/blue/corner{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"qt" = ( +/obj/structure/table/wood, +/obj/item/melee/baseball_bat{ + pixel_y = 3; + pixel_x = 6 + }, +/obj/item/clothing/glasses/blindfold/white{ + pixel_y = 7; + pixel_x = -5 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"qy" = ( +/obj/machinery/door/airlock/wood{ + name = "Arcade" + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"qC" = ( +/obj/machinery/button/door/directional/west{ + id = "beach_room_1" + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"qX" = ( +/obj/structure/chair/stool/bar/directional/east, +/obj/machinery/light/directional/west, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"rd" = ( +/obj/structure/closet/crate/trashcart/laundry, +/turf/open/floor/plastic, +/area/awaymission/beach) +"re" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/suit/jacket/letterman_red, +/turf/open/floor/wood, +/area/awaymission/beach) +"rq" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 19; + pixel_x = 8 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"ru" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/wood, +/area/awaymission/beach) +"rA" = ( +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -8; + pixel_y = -6 + }, +/obj/item/reagent_containers/cup/soda_cans/space_mountain_wind{ + pixel_x = 15 + }, +/obj/structure/fluff/beach_umbrella/science, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"rE" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"rF" = ( +/obj/machinery/grill, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"rQ" = ( +/obj/structure/table/bronze, +/obj/item/paper_bin/carbon{ + pixel_y = 8 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"rR" = ( +/obj/effect/turf_decal/siding/dark_red/corner{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"sc" = ( +/obj/structure/fluff/beach_umbrella/syndi, +/obj/item/reagent_containers/cup/soda_cans/wellcheers{ + pixel_y = -10; + pixel_x = -6 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"sd" = ( +/obj/item/cigbutt{ + pixel_y = -4; + pixel_x = 2 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"sj" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"sp" = ( +/obj/item/reagent_containers/cup/soda_cans/space_mountain_wind, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"sL" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"sM" = ( +/obj/machinery/shower/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"sP" = ( +/obj/structure/table/wood, +/obj/item/stack/arcadeticket{ + pixel_y = 3; + pixel_x = -5 + }, +/obj/item/reagent_containers/cup/soda_cans/pwr_game{ + pixel_y = 12; + pixel_x = -8 + }, +/obj/item/paper_bin/carbon{ + pixel_y = 6; + pixel_x = 4 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"sS" = ( +/turf/open/floor/plastic, +/area/awaymission/beach) +"sU" = ( +/obj/item/toy/plush/moth{ + pixel_y = 5 + }, +/turf/open/floor/carpet/red, +/area/awaymission/beach) +"to" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/machinery/shower/directional/south, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"tr" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 6 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"tx" = ( +/obj/machinery/button/door/directional/north{ + id = "beach_room_3" + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"tz" = ( +/obj/structure/tank_holder/extinguisher{ + pixel_y = 11 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"tD" = ( +/obj/structure/table/glass, +/obj/item/paper{ + pixel_y = 7; + pixel_x = 2 + }, +/obj/item/screwdriver{ + pixel_y = 13; + pixel_x = 3 + }, +/obj/item/paper_bin/carbon{ + pixel_y = 4; + pixel_x = -6 + }, +/obj/effect/spawner/random/bureaucracy/pen{ + pixel_x = 7 + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"tE" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 19; + pixel_x = 7 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"tJ" = ( +/turf/open/misc/beach/coast/corner{ + dir = 8 + }, +/area/awaymission/beach) +"tK" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/engineering_guide{ + pixel_y = 7; + pixel_x = -6 + }, +/obj/item/pen{ + pixel_x = 7; + pixel_y = 6 + }, +/obj/item/clothing/head/utility/welding{ + pixel_x = -10; + pixel_y = -8 + }, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"tP" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/obj/item/reagent_containers/cup/soda_cans/starkist{ + pixel_y = 10; + pixel_x = -17 + }, +/obj/item/fishing_rod{ + pixel_x = -13; + pixel_y = 2 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"tU" = ( +/obj/structure/table/bronze, +/turf/open/floor/carpet, +/area/awaymission/beach) +"uc" = ( +/obj/item/stack/arcadeticket{ + pixel_y = 5; + pixel_x = 13 + }, +/turf/open/floor/eighties, +/area/awaymission/beach) +"ug" = ( +/obj/structure/chair/stool/directional/south, +/turf/open/floor/iron/freezer, +/area/awaymission/beach) +"um" = ( +/obj/structure/table/bronze, +/obj/machinery/button/door/directional/south{ + id = "beach_room_11" + }, +/obj/item/storage/toolbox/fishing{ + pixel_y = 2 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"un" = ( +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"uo" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"uq" = ( +/obj/machinery/door/airlock/wood/glass{ + name = "Hotel's Facilities" + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"us" = ( +/obj/structure/closet/crate/bin, +/obj/structure/sign/clock/directional/north, +/turf/open/floor/wood, +/area/awaymission/beach) +"uu" = ( +/obj/structure/table/bronze, +/obj/item/reagent_containers/condiment/ketchup{ + pixel_y = 14; + pixel_x = 1 + }, +/obj/item/reagent_containers/condiment/mayonnaise{ + pixel_y = 8; + pixel_x = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"uv" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark/half{ + pixel_x = 5; + dir = 8 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"uz" = ( +/turf/open/floor/carpet/red, +/area/awaymission/beach) +"uG" = ( +/turf/open/floor/carpet/green, +/area/awaymission/beach) +"uJ" = ( +/obj/structure/table/wood, +/obj/item/food/donut/plain{ + pixel_y = -2; + pixel_x = 14 + }, +/obj/item/assembly/signaler{ + pixel_x = -6; + pixel_y = -5 + }, +/obj/effect/spawner/random/bureaucracy/folder{ + pixel_y = 11; + pixel_x = 4 + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"uL" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"uN" = ( +/obj/structure/table, +/obj/item/storage/belt/utility, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_y = 14; + pixel_x = -8 + }, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"uP" = ( +/obj/structure/chair/plastic{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"uT" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/beach) +"uV" = ( +/obj/structure/closet/crate/trashcart/filled, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"uY" = ( +/obj/item/toy/seashell{ + pixel_x = 12; + pixel_y = 5 + }, +/turf/open/misc/beach/coast{ + dir = 4 + }, +/area/awaymission/beach) +"uZ" = ( +/obj/item/circular_saw{ + pixel_y = 4 + }, +/obj/item/scalpel{ + pixel_y = 15 + }, +/obj/structure/table/glass, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"vc" = ( +/obj/structure/dresser, +/turf/open/floor/wood, +/area/awaymission/beach) +"vf" = ( +/obj/vehicle/ridden/atv{ + dir = 4 + }, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/iron/dark/herringbone, +/area/awaymission/beach) +"vq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/landmark/awaystart, +/turf/open/floor/plating, +/area/awaymission/beach) +"vx" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/effect/turf_decal/tile/dark/half{ + pixel_y = -1; + pixel_x = 5; + dir = 8 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"vF" = ( +/obj/structure/table/bronze, +/obj/structure/sign/poster/random/directional/east, +/obj/machinery/button/door/directional/south{ + id = "beach_room_8" + }, +/obj/item/camera{ + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"vM" = ( +/obj/structure/bed/double, +/obj/item/bedsheet/hos/double{ + name = "bedsheet"; + desc = "A bedsheet from the beach hotel." + }, +/turf/open/floor/carpet, +/area/awaymission/beach) +"vR" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/wood, +/area/awaymission/beach) +"vX" = ( +/obj/structure/chair/stool/bamboo{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"wd" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"wt" = ( +/obj/machinery/vending/cigarette/beach, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"wv" = ( +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/obj/item/wrench{ + pixel_y = -1; + pixel_x = 6 + }, +/obj/item/storage/toolbox/fishing{ + pixel_y = -8; + pixel_x = -3 + }, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"wA" = ( +/obj/structure/flora/tree/palm, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"wC" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"wL" = ( +/obj/structure/table/bronze, +/obj/item/food/grown/banana/bunch{ + pixel_y = 10; + offset_at_init = 0 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"wX" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 9"; + id_tag = "beach_room_9" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"wY" = ( +/obj/effect/turf_decal/sand/plating, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"xi" = ( +/obj/effect/turf_decal/sand, +/turf/closed/wall/mineral/wood, +/area/awaymission/beach) +"xo" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/button/door/directional/east{ + id = "toilet3beach"; + name = "restroom lock"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/structure/sink/directional/west, +/obj/item/cigbutt{ + pixel_y = -7; + pixel_x = -13 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white, +/area/awaymission/beach) +"xp" = ( +/obj/structure/sign/poster/official/tactical_game_cards/directional/west, +/turf/open/floor/eighties, +/area/awaymission/beach) +"xr" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/door/airlock/wood{ + name = "Tropical Kitchen" + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"xv" = ( +/turf/closed/wall/mineral/wood, +/area/awaymission/beach) +"xE" = ( +/obj/structure/table/wood, +/obj/item/storage/box/drinkingglasses{ + pixel_y = 18; + pixel_x = -5 + }, +/obj/item/reagent_containers/cup/glass/shaker{ + pixel_y = 12; + pixel_x = -7 + }, +/obj/item/clothing/head/hats/tophat{ + pixel_y = 2; + pixel_x = 3 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"xI" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"yc" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/eighties, +/area/awaymission/beach) +"yn" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 6 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/eighties, +/area/awaymission/beach) +"yq" = ( +/obj/item/storage/toolbox/fishing{ + pixel_x = 2; + pixel_y = -13 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"yt" = ( +/obj/structure/table/bronze, +/obj/item/camera{ + pixel_y = 12; + pixel_x = 6 + }, +/obj/item/camera_film{ + pixel_y = 4; + pixel_x = -2 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"yE" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 8"; + id_tag = "beach_room_8" + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"yF" = ( +/obj/structure/chair/plastic, +/obj/item/fishing_rod{ + pixel_x = 11; + pixel_y = -8 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"yL" = ( +/obj/item/cigbutt{ + pixel_y = -7; + pixel_x = 14 + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"yO" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 12; + pixel_x = 3 + }, +/obj/item/stock_parts/cell/emproof{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/item/clothing/head/soft/mime{ + pixel_y = 3; + pixel_x = 5 + }, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"yT" = ( +/obj/item/toy/seashell{ + pixel_y = -5 + }, +/turf/open/misc/beach/coast, +/area/awaymission/beach) +"yX" = ( +/obj/structure/table/wood/poker, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"yZ" = ( +/obj/machinery/space_heater, +/obj/machinery/button/door/directional/north{ + id = "beach_room_2" + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"zp" = ( +/obj/structure/table/wood, +/obj/item/clothing/suit/apron/chef{ + pixel_y = 5; + pixel_x = 2 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"zr" = ( +/obj/item/toy/dodgeball{ + name = "William"; + desc = "It's just not the same thing."; + pixel_y = -4; + pixel_x = 7 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"zs" = ( +/obj/effect/spawner/random/entertainment/arcade{ + dir = 4 + }, +/turf/open/floor/eighties, +/area/awaymission/beach) +"zA" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/item/cigbutt{ + pixel_y = -6; + pixel_x = -12 + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"zH" = ( +/obj/structure/table/wood/poker, +/obj/item/storage/dice{ + pixel_y = 3; + pixel_x = 5 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"zI" = ( +/obj/machinery/defibrillator_mount/directional/west, +/obj/structure/bed/pod{ + desc = "An old medical bed, just waiting for replacement with something up to date."; + dir = 4; + name = "medical bed" + }, +/obj/machinery/iv_drip{ + pixel_y = 21; + pixel_x = -4 + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach) +"zK" = ( +/obj/structure/table, +/obj/item/weldingtool{ + pixel_y = -7; + pixel_x = 4 + }, +/obj/item/trash/can{ + pixel_y = 10; + pixel_x = -5 + }, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"zX" = ( +/obj/item/storage/toolbox/fishing{ + pixel_x = 10 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Aa" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/condiment/enzyme{ + layer = 5; + pixel_x = 9; + pixel_y = 5 + }, +/obj/item/food/seaweedsheet{ + pixel_y = 6; + pixel_x = -4 + }, +/obj/item/food/seaweedsheet{ + pixel_x = -15; + pixel_y = 2 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Ar" = ( +/turf/open/floor/carpet/blue, +/area/awaymission/beach) +"Av" = ( +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -8; + pixel_y = -4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"AB" = ( +/obj/structure/table/bronze, +/obj/item/pai_card{ + 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"; + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"AG" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/suit/jacket/letterman_nanotrasen, +/obj/item/clothing/glasses/salesman, +/turf/open/floor/wood, +/area/awaymission/beach) +"AH" = ( +/obj/item/reagent_containers/cup/bucket/wooden{ + pixel_y = -5; + pixel_x = -11 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"AP" = ( +/obj/machinery/door/airlock/wood{ + name = "Changing Room" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/iron/freezer, +/area/awaymission/beach) +"AU" = ( +/obj/structure/fluff/beach_umbrella/syndi, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -8; + pixel_y = -6 + }, +/obj/item/reagent_containers/cup/soda_cans/thirteenloko{ + pixel_x = 15; + pixel_y = -11 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"AW" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 2"; + id_tag = "beach_room_2" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/sign/poster/random/directional/east, +/turf/open/floor/wood, +/area/awaymission/beach) +"Bl" = ( +/obj/structure/statue/sandstone/venus{ + dir = 4; + pixel_y = 9; + anchored = 1 + }, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/awaymission/beach) +"Bm" = ( +/obj/machinery/washing_machine, +/turf/open/floor/plastic, +/area/awaymission/beach) +"Bq" = ( +/obj/machinery/computer/operating{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Bv" = ( +/obj/machinery/door/poddoor/shutters{ + dir = 4; + id = "BeachGarage" + }, +/turf/open/floor/plating, +/area/awaymission/beach) +"BD" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/railing/corner/end{ + dir = 8 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"BK" = ( +/turf/open/misc/beach/coast, +/area/awaymission/beach) +"BL" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"BN" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/machinery/vending/cola/red, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"BQ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Cb" = ( +/obj/structure/table/wood, +/obj/item/modular_computer/laptop{ + pixel_y = 5 + }, +/obj/item/multitool{ + pixel_x = -8; + pixel_y = -8 + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"Ce" = ( +/obj/structure/table, +/obj/item/wrench{ + pixel_y = 4 + }, +/obj/item/storage/toolbox/emergency, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/iron/dark/herringbone, +/area/awaymission/beach) +"Cf" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"Cg" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/button/door/directional/east{ + id = "toiletfarbeach"; + name = "restroom lock"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/structure/sink/directional/west, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white, +/area/awaymission/beach) +"Cl" = ( +/obj/machinery/vending/dinnerware, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Cp" = ( +/obj/structure/fluff/beach_umbrella/syndi, +/turf/open/misc/beach/coast/corner{ + dir = 8 + }, +/area/awaymission/beach) +"Cv" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/obj/structure/chair/plastic{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Cy" = ( +/obj/structure/closet/crate/bin, +/obj/item/trash/candy, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"CF" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 25 + }, +/obj/item/stack/sheet/mineral/sandstone/thirty{ + pixel_y = -10; + pixel_x = -5 + }, +/obj/item/stack/sheet/mineral/sandstone/thirty{ + pixel_y = -2; + pixel_x = 9 + }, +/obj/item/stack/sheet/mineral/sandstone/thirty{ + pixel_y = -4; + pixel_x = 1 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"CG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"CH" = ( +/obj/structure/railing{ + dir = 5 + }, +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 3; + pixel_x = -2 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"CJ" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"CQ" = ( +/obj/machinery/space_heater, +/turf/open/floor/wood, +/area/awaymission/beach) +"CR" = ( +/obj/structure/table/bronze, +/obj/item/camera{ + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"CY" = ( +/obj/machinery/shower/directional/south, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"Da" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Dj" = ( +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 4; + pixel_x = 8 + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"Dv" = ( +/obj/item/storage/bag/tray, +/obj/item/food/grown/watermelon{ + pixel_y = 4; + pixel_x = -1 + }, +/obj/effect/turf_decal/stripes/red/box, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Dy" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/item/stack/arcadeticket{ + pixel_y = 12; + pixel_x = -16 + }, +/turf/open/floor/eighties, +/area/awaymission/beach) +"DD" = ( +/obj/structure/closet{ + name = "Holding Cell Storage" + }, +/obj/item/taperecorder, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"DF" = ( +/obj/item/toy/seashell{ + pixel_y = 3; + pixel_x = -6 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"DH" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"DR" = ( +/obj/structure/table/bronze, +/obj/item/camera{ + pixel_y = 8; + pixel_x = -3 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"DU" = ( +/obj/structure/table/bronze, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"DV" = ( +/obj/structure/table/bronze, +/obj/machinery/button/door/directional/south{ + id = "beach_room_4" + }, +/obj/item/storage/toolbox/fishing{ + pixel_y = 2 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"DY" = ( +/obj/machinery/oven/range, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Ea" = ( +/obj/machinery/griddle, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Eb" = ( +/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/chicken, +/obj/item/food/meat/slab/chicken, +/obj/item/food/meat/slab/chicken, +/obj/item/food/meat/slab, +/obj/item/food/meat/slab, +/obj/item/food/meat/slab, +/obj/item/stack/sheet/mineral/coal/ten, +/obj/item/stack/sheet/mineral/coal/ten, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Ej" = ( +/obj/item/tank/internals/anesthetic{ + pixel_y = 4 + }, +/obj/item/stack/medical/bone_gel{ + pixel_y = 16; + pixel_x = -7 + }, +/obj/item/clothing/mask/breath/medical{ + pixel_y = 3; + pixel_x = 3 + }, +/obj/structure/table/bronze, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Em" = ( +/turf/open/floor/carpet/cyan, +/area/awaymission/beach) +"Er" = ( +/obj/item/toy/seashell{ + pixel_y = -15 + }, +/obj/item/toy/seashell{ + pixel_y = -3; + pixel_x = -18 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Es" = ( +/obj/structure/table/bronze, +/obj/item/table_clock{ + pixel_y = 13 + }, +/obj/structure/sign/poster/random/directional/east, +/turf/open/floor/wood, +/area/awaymission/beach) +"EB" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 16; + pixel_x = 12 + }, +/obj/structure/flora/coconuts, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"EC" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"EF" = ( +/obj/structure/railing/corner/end{ + dir = 8 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"EG" = ( +/obj/machinery/recharge_station, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"EH" = ( +/obj/structure/mop_bucket/janitorialcart{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"EO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/lights/mixed{ + pixel_x = -4; + pixel_y = 18 + }, +/obj/item/storage/box/lights/mixed{ + pixel_x = 6; + pixel_y = 12 + }, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = -7; + pixel_y = 12 + }, +/obj/structure/table, +/obj/item/reagent_containers/cup/bucket{ + pixel_x = 10; + pixel_y = 4 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"EP" = ( +/obj/machinery/door/airlock/wood{ + name = "Janitorial" + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"EU" = ( +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -8; + pixel_y = 13 + }, +/turf/open/floor/carpet/blue, +/area/awaymission/beach) +"Fb" = ( +/turf/open/misc/beach/coast{ + dir = 4 + }, +/area/awaymission/beach) +"Fe" = ( +/obj/item/storage/box/gloves{ + pixel_y = 14; + pixel_x = 7 + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach) +"Ff" = ( +/obj/item/reagent_containers/cup/soda_cans/lemon_lime{ + pixel_x = -12 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Fg" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/suit/jacket/letterman_syndie, +/turf/open/floor/wood, +/area/awaymission/beach) +"Fk" = ( +/obj/item/toy/seashell, +/turf/open/misc/beach/coast, +/area/awaymission/beach) +"Ft" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/window/reinforced/spawner/directional/north{ + layer = 2.9 + }, +/obj/structure/chair/stool/directional/south, +/obj/item/clothing/glasses/sunglasses{ + pixel_y = -2; + pixel_x = 2 + }, +/obj/item/bikehorn/airhorn{ + pixel_y = -15; + pixel_x = -13 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"Fu" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 31 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"FB" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/button/door/directional/east{ + id = "toilet2beach"; + name = "restroom lock"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/structure/sink/directional/west, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white, +/area/awaymission/beach) +"FD" = ( +/obj/item/toy/seashell{ + pixel_x = -7; + pixel_y = 5 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"FE" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/eighties, +/area/awaymission/beach) +"FF" = ( +/obj/machinery/gateway/away, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/beach) +"FH" = ( +/obj/structure/table/wood, +/obj/item/food/grown/watermelon{ + pixel_y = 13; + pixel_x = 6 + }, +/obj/item/food/grown/watermelon{ + pixel_y = 8; + pixel_x = -4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"FJ" = ( +/obj/item/instrument/guitar{ + pixel_y = 4; + pixel_x = -1 + }, +/turf/open/misc/beach/coast, +/area/awaymission/beach) +"FK" = ( +/obj/item/toy/seashell{ + pixel_x = 12; + pixel_y = -9 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"FL" = ( +/obj/effect/turf_decal/siding/blue/corner{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"FM" = ( +/obj/structure/railing{ + dir = 9 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"FP" = ( +/obj/item/kirbyplants/organic/plant24{ + pixel_x = 7; + pixel_y = 10 + }, +/obj/item/reagent_containers/cup/watering_can{ + pixel_x = -3; + pixel_y = 15 + }, +/obj/structure/table, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"FU" = ( +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/obj/item/cigbutt{ + pixel_y = -6; + pixel_x = -12 + }, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"FY" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Ge" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/awaymission/beach) +"Gf" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/carpet, +/area/awaymission/beach) +"Gh" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"Gi" = ( +/obj/structure/closet/crate/bin, +/obj/item/reagent_containers/syringe{ + pixel_y = -4; + pixel_x = 3 + }, +/obj/effect/spawner/random/trash/food_packaging, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach) +"Gm" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/door/airlock/wood{ + name = "Bathroom"; + id_tag = "toilet1beach" + }, +/turf/open/floor/iron/white, +/area/awaymission/beach) +"Gn" = ( +/turf/open/floor/wood, +/area/awaymission/beach) +"Gq" = ( +/obj/structure/tank_holder/extinguisher{ + pixel_y = 11 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Gu" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"GC" = ( +/turf/open/floor/carpet, +/area/awaymission/beach) +"GG" = ( +/obj/item/toy/seashell, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"GI" = ( +/obj/structure/bonfire, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"GN" = ( +/obj/machinery/icecream_vat, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Ha" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/reagent_dispensers/fueltank/large, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"Hg" = ( +/obj/item/stack/sheet/mineral/sandstone{ + pixel_x = -11; + pixel_y = -2 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Hn" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 6 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Hq" = ( +/obj/structure/closet/secure_closet/personal, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"Hv" = ( +/obj/structure/dresser, +/obj/machinery/light/directional/north, +/turf/open/floor/wood, +/area/awaymission/beach) +"HF" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/herringbone, +/area/awaymission/beach) +"HU" = ( +/obj/structure/table/bronze, +/obj/item/camera{ + pixel_y = 12; + pixel_x = -10 + }, +/obj/item/camera{ + pixel_y = 4; + pixel_x = 1 + }, +/obj/item/camera_film{ + pixel_y = -11; + pixel_x = -10 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"HV" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"Ia" = ( +/obj/effect/turf_decal/siding/wood, +/turf/closed/wall/mineral/wood, +/area/awaymission/beach) +"Ic" = ( +/obj/structure/table/reinforced, +/obj/item/defibrillator/loaded{ + pixel_y = 7 + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach) +"Ih" = ( +/obj/structure/table/reinforced, +/obj/item/storage/medkit/brute{ + pixel_y = 9; + pixel_x = 2 + }, +/obj/item/storage/medkit/o2{ + pixel_y = 15; + pixel_x = 2 + }, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = -9; + pixel_y = 3 + }, +/obj/item/reagent_containers/syringe{ + pixel_y = -4; + pixel_x = 3 + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach) +"Il" = ( +/obj/machinery/vending/autodrobe/all_access, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"It" = ( +/obj/item/clothing/head/soft/green, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Iw" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/awaymission/beach) +"IA" = ( +/obj/structure/fluff/beach_umbrella/science, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"IE" = ( +/obj/structure/table/bronze, +/obj/item/clothing/suit/costume/hawaiian{ + pixel_y = 1; + pixel_x = 7 + }, +/obj/item/clothing/suit/costume/hawaiian{ + pixel_x = -14 + }, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"II" = ( +/obj/machinery/shower/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"IP" = ( +/obj/machinery/computer/order_console/cook, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"IW" = ( +/obj/structure/closet/athletic_mixed, +/turf/open/floor/iron/freezer, +/area/awaymission/beach) +"IZ" = ( +/mob/living/basic/crab, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Ja" = ( +/obj/structure/table/bronze, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_y = 12 + }, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -5; + pixel_y = 9 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Ji" = ( +/obj/effect/turf_decal/stripes/white/full, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Jj" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/door/airlock/wood{ + name = "Room 6"; + id_tag = "beach_room_6" + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"Jo" = ( +/obj/item/reagent_containers/cup/glass/bottle/beer/light{ + pixel_x = -14; + pixel_y = 15 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Jr" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"JF" = ( +/obj/structure/marker_beacon/burgundy, +/turf/open/water/beach, +/area/awaymission/beach) +"JG" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 4"; + id_tag = "beach_room_4" + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/awaymission/beach) +"JO" = ( +/obj/machinery/vending/cigarette/beach, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"JQ" = ( +/turf/open/floor/iron/stairs, +/area/awaymission/beach) +"JR" = ( +/obj/structure/chair/stool/bamboo{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Ka" = ( +/obj/structure/bed/pod{ + desc = "An old medical bed, just waiting for replacement with something up to date."; + dir = 4; + name = "medical bed" + }, +/obj/machinery/defibrillator_mount/directional/east, +/obj/machinery/iv_drip{ + pixel_y = 21; + pixel_x = -4 + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach) +"Kh" = ( +/turf/open/misc/beach/coast/corner, +/area/awaymission/beach) +"Km" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 7; + pixel_x = 9 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Kn" = ( +/obj/structure/statue/sandstone/venus{ + dir = 4; + pixel_y = 9 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Kw" = ( +/obj/item/reagent_containers/cup/soda_cans/dr_gibb{ + pixel_x = -9; + pixel_y = -9 + }, +/obj/structure/fluff/beach_umbrella/engine, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Ky" = ( +/obj/structure/table/reinforced, +/obj/item/storage/medkit/o2{ + pixel_y = 17; + pixel_x = -1 + }, +/obj/item/storage/medkit/brute{ + pixel_y = 23; + pixel_x = -1 + }, +/obj/item/food/lollipop{ + pixel_y = 8; + pixel_x = 12 + }, +/obj/item/food/lollipop{ + pixel_y = 5; + pixel_x = 12 + }, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = -9; + pixel_y = 9 + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach) +"KB" = ( +/obj/structure/dresser, +/obj/structure/sign/clock/directional/east, +/turf/open/floor/wood, +/area/awaymission/beach) +"KK" = ( +/obj/effect/turf_decal/siding/dark_red, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"KL" = ( +/obj/item/stack/sheet/mineral/sandstone{ + pixel_x = 11 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"KV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/awaymission/beach) +"KW" = ( +/obj/structure/fluff/beach_umbrella/syndi, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"La" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/structure/crate_empty, +/obj/effect/spawner/random/maintenance/two, +/obj/item/storage/toolbox/fishing{ + pixel_y = 2 + }, +/turf/open/floor/plating, +/area/awaymission/beach) +"Ld" = ( +/obj/item/toy/seashell{ + pixel_x = -8; + pixel_y = 9 + }, +/turf/open/misc/beach/coast/corner{ + dir = 1 + }, +/area/awaymission/beach) +"Le" = ( +/turf/open/misc/beach/coast{ + dir = 8 + }, +/area/awaymission/beach) +"Lg" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"Ll" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Lt" = ( +/obj/structure/rack, +/obj/effect/turf_decal/sand, +/obj/item/clothing/shoes/sandal{ + pixel_y = 4; + pixel_x = 8 + }, +/obj/item/clothing/shoes/sandal{ + pixel_x = 4 + }, +/obj/item/clothing/shoes/sandal{ + pixel_y = -4 + }, +/obj/item/clothing/shoes/sandal{ + pixel_y = -7; + pixel_x = -3 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"LC" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"LJ" = ( +/obj/structure/railing/corner/end/flip{ + dir = 1 + }, +/obj/machinery/door/airlock/wood{ + name = "Balcony"; + id_tag = "beach_room_x" + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"LQ" = ( +/obj/effect/turf_decal/tile/dark_red/full, +/obj/machinery/vending/cola/red, +/turf/open/floor/iron/smooth_large, +/area/awaymission/beach) +"LS" = ( +/obj/machinery/space_heater, +/obj/machinery/light/directional/north, +/turf/open/floor/wood, +/area/awaymission/beach) +"Mm" = ( +/obj/structure/table/bronze, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Mn" = ( +/obj/structure/table/wood, +/obj/item/book/manual/chef_recipes{ + pixel_x = 2; + pixel_y = 6 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Mo" = ( +/obj/structure/statue/sandstone/venus{ + pixel_y = 9; + dir = 1; + anchored = 1 + }, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/awaymission/beach) +"Mr" = ( +/obj/effect/turf_decal/siding/blue/corner{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"MD" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/lighter, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"MF" = ( +/turf/open/misc/beach/coast/corner{ + dir = 4 + }, +/area/awaymission/beach) +"MG" = ( +/obj/structure/chair/stool/bamboo{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"MH" = ( +/obj/structure/closet, +/obj/item/key/atv{ + pixel_x = -4 + }, +/obj/item/key/atv{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/item/key/atv{ + pixel_x = 1; + pixel_y = 1 + }, +/obj/item/clothing/head/soft/black, +/obj/item/clothing/head/soft/black, +/obj/item/clothing/head/soft/black, +/obj/effect/decal/cleanable/oil, +/obj/item/clothing/glasses/sunglasses, +/obj/item/clothing/glasses/heat, +/turf/open/floor/iron/dark/herringbone, +/area/awaymission/beach) +"MK" = ( +/turf/open/floor/iron/dark/herringbone, +/area/awaymission/beach) +"MN" = ( +/obj/item/stack/arcadeticket{ + pixel_y = -1; + pixel_x = -6 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"MO" = ( +/obj/item/trash/boritos/purple{ + pixel_y = -16; + pixel_x = -5 + }, +/turf/open/floor/eighties, +/area/awaymission/beach) +"MP" = ( +/obj/structure/table/bronze, +/obj/structure/sign/poster/random/directional/east, +/obj/item/camera{ + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"MT" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 5 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"MV" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Clinic" + }, +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach) +"MX" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"MZ" = ( +/turf/open/misc/beach/coast{ + dir = 9 + }, +/area/awaymission/beach) +"Nb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/maintenance, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/awaymission/beach) +"Nd" = ( +/obj/machinery/button/door/directional/south{ + id = "beach_room_5" + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"Ne" = ( +/obj/structure/closet/crate/bin, +/obj/effect/spawner/random/trash/cigbutt, +/obj/effect/spawner/random/trash/food_packaging, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"Nf" = ( +/obj/structure/table/wood, +/obj/item/food/seaweedsheet, +/obj/item/kitchen/rollingpin{ + pixel_x = -12; + pixel_y = 3 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Nh" = ( +/obj/effect/turf_decal/sand, +/obj/structure/bedsheetbin{ + pixel_y = 3; + pixel_x = -1 + }, +/obj/structure/table, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Nk" = ( +/obj/machinery/door/airlock/wood{ + name = "Balcony"; + id_tag = "beach_room_x" + }, +/obj/structure/railing/corner/end/flip{ + dir = 1 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"Nl" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Nm" = ( +/obj/structure/flora/coconuts{ + pixel_x = -5; + pixel_y = 4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"NF" = ( +/obj/item/toy/seashell{ + pixel_x = -10; + pixel_y = -4 + }, +/obj/structure/fluff/beach_umbrella, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"NH" = ( +/obj/machinery/door/airlock/wood/glass{ + name = "Cabin" + }, +/turf/open/floor/carpet, +/area/awaymission/beach) +"NS" = ( +/obj/structure/table/bronze, +/obj/item/storage/bag/tray, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"NU" = ( +/obj/machinery/vending/medical{ + req_access = "201" + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach) +"Og" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"On" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/beach) +"Ow" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"OD" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"OE" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/machinery/button/door/directional/west{ + id = "beach_room_6" + }, +/obj/item/clothing/suit/jacket/leather/biker, +/turf/open/floor/wood, +/area/awaymission/beach) +"OG" = ( +/obj/effect/turf_decal/siding/dark_red/corner, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"OK" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark/half{ + pixel_y = -2; + pixel_x = 5; + dir = 8 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"OT" = ( +/obj/item/reagent_containers/cup/soda_cans/lemon_lime{ + pixel_x = -12; + pixel_y = -7 + }, +/obj/item/reagent_containers/cup/soda_cans/dr_gibb{ + pixel_x = 13; + pixel_y = -7 + }, +/obj/structure/fluff/beach_umbrella, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"OU" = ( +/obj/structure/chair/plastic, +/obj/item/pai_card{ + 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"; + pixel_y = 3; + pixel_x = -1 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Pe" = ( +/turf/open/misc/beach/coast{ + dir = 5 + }, +/area/awaymission/beach) +"Pk" = ( +/obj/structure/table/glass, +/obj/machinery/fax{ + fax_name = "Beach Hotel Fax"; + name = "Beach Hotel's Fax Machine"; + pixel_y = 8; + visible_to_network = 0 + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"Pn" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"Pt" = ( +/obj/machinery/door/airlock/command/glass{ + name = "Admin" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock_note_placer{ + note_info = "Dear IT: Please fix the fax machine" + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"Py" = ( +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"PH" = ( +/obj/effect/turf_decal/siding/blue/corner, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"PN" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Qe" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/door/airlock/wood{ + name = "Bathroom"; + id_tag = "toilet3beach" + }, +/turf/open/floor/iron/white, +/area/awaymission/beach) +"Qf" = ( +/obj/structure/dresser, +/obj/structure/sign/calendar/directional/north, +/turf/open/floor/wood, +/area/awaymission/beach) +"Qg" = ( +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"Qk" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/suit/jacket/miljacket, +/turf/open/floor/wood, +/area/awaymission/beach) +"Qr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/food_cart, +/turf/open/floor/plating, +/area/awaymission/beach) +"Qt" = ( +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 18; + pixel_x = -8 + }, +/obj/item/cigbutt{ + pixel_y = -4; + pixel_x = 2 + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"QF" = ( +/obj/structure/sink/kitchen/directional/east, +/turf/open/floor/plastic, +/area/awaymission/beach) +"QG" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/obj/item/reagent_containers/cup/soda_cans/melon_soda{ + pixel_y = 13; + pixel_x = -9 + }, +/obj/item/fishing_rod{ + pixel_x = 8; pixel_y = -6 }, -/obj/item/reagent_containers/cup/soda_cans/space_mountain_wind{ - pixel_x = 15 +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"QI" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 12"; + id_tag = "beach_room_12" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"QM" = ( +/obj/structure/table/wood, +/obj/item/stack/arcadeticket{ + pixel_y = 6; + pixel_x = -7 + }, +/obj/item/pen{ + pixel_y = 5; + pixel_x = 8 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"QN" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"QO" = ( +/obj/item/trash/can{ + pixel_y = -9; + pixel_x = 10 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"QR" = ( +/obj/item/kirbyplants/organic/plant21{ + pixel_y = 3; + pixel_x = -6 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Rj" = ( +/turf/open/misc/beach/coast{ + dir = 6 + }, +/area/awaymission/beach) +"Rn" = ( +/obj/effect/turf_decal/stripes/red/box, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Rr" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 10; + pixel_x = 7 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Rs" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 25 + }, +/obj/structure/chair/plastic{ + dir = 4 }, -/obj/structure/fluff/beach_umbrella/science, /turf/open/misc/beach/sand, /area/awaymission/beach) -"cV" = ( -/obj/structure/flora/coconuts{ - pixel_x = -5; - pixel_y = 4 +"RA" = ( +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 18; + pixel_x = -8 }, -/turf/open/misc/beach/coast, +/turf/open/floor/wood/large, /area/awaymission/beach) -"cW" = ( -/obj/item/reagent_containers/cup/soda_cans/lemon_lime{ - pixel_x = -12 +"RE" = ( +/obj/structure/chair/stool/bamboo{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"RI" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Clinic" + }, +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach) +"RQ" = ( +/obj/structure/closet/crate, +/obj/item/clothing/suit/hooded/carp_costume, +/obj/item/clothing/head/hooded/carp_hood, +/obj/item/toy/plush/carpplushie, +/obj/item/toy/plush/shark, +/turf/open/floor/eighties, +/area/awaymission/beach) +"Sg" = ( +/obj/structure/table/bronze, +/obj/item/reagent_containers/cup/rag{ + pixel_y = 5 + }, +/obj/item/reagent_containers/condiment/coconut_milk{ + pixel_y = 14; + pixel_x = 5 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Sj" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"cX" = ( +"Sr" = ( +/obj/structure/table/wood/fancy, +/obj/effect/turf_decal/tile/dark_red/full, /obj/item/reagent_containers/cup/soda_cans/cola{ pixel_x = -5; - pixel_y = -5 + pixel_y = 14 }, -/obj/structure/fluff/beach_umbrella/security, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cY" = ( -/obj/item/reagent_containers/cup/soda_cans/starkist{ - pixel_x = -6 +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_y = 13; + pixel_x = 6 }, -/turf/open/misc/beach/sand, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_y = 10 + }, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_y = 6; + pixel_x = 11 + }, +/turf/open/floor/iron/smooth_large, /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." +"St" = ( +/turf/open/floor/iron/stairs/old, +/area/awaymission/beach) +"Sw" = ( +/obj/structure/chair/stool/directional/south{ + dir = 8 }, -/turf/open/water/beach, +/turf/open/floor/wood, /area/awaymission/beach) -"da" = ( -/mob/living/simple_animal/parrot, +"SB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/awaystart, +/turf/open/floor/plating, +/area/awaymission/beach) +"SI" = ( +/mob/living/basic/crab/kreb, /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, +"Th" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_y = 7 + }, +/turf/open/floor/wood/large, /area/awaymission/beach) -"dc" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/suit/jacket/letterman_syndie, -/turf/open/floor/wood, +"Tn" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/eighties, /area/awaymission/beach) -"dd" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/suit/jacket/letterman_red, -/turf/open/floor/wood, +"Tr" = ( +/turf/open/floor/iron/dark/textured_large, /area/awaymission/beach) -"de" = ( +"Ts" = ( /obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/neck/necklace/dope, /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, +"TC" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/turf/open/misc/beach/sand, /area/awaymission/beach) -"dg" = ( -/obj/item/clothing/glasses/heat, +"TG" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"TJ" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"hw" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/cup/glass/bottle/ale, -/turf/open/floor/wood, +"TK" = ( +/obj/item/storage/box/syringes{ + pixel_y = 14; + pixel_x = -5 + }, +/obj/item/clothing/neck/stethoscope{ + pixel_y = 3; + pixel_x = 4 + }, +/obj/structure/table/glass, +/turf/open/floor/iron/white/textured_large, /area/awaymission/beach) -"iy" = ( -/obj/item/toy/seashell, -/turf/open/misc/beach/coast, +"TO" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/wood/parquet, /area/awaymission/beach) -"kK" = ( -/obj/item/toy/seashell{ - pixel_x = 5; - pixel_y = 4 +"TX" = ( +/obj/structure/table/reinforced, +/obj/item/stack/medical/mesh{ + pixel_y = 1; + pixel_x = 1 }, -/turf/open/misc/beach/sand, +/obj/item/clothing/suit/toggle/labcoat{ + pixel_y = 9; + pixel_x = -8 + }, +/obj/item/storage/box/bodybags{ + pixel_y = 17; + pixel_x = 8 + }, +/turf/open/floor/iron/white/textured_large, /area/awaymission/beach) -"kS" = ( -/obj/item/toy/seashell{ +"Ug" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/mousetraps{ + pixel_x = -5; + pixel_y = 14 + }, +/obj/structure/table, +/obj/item/storage/box/mousetraps{ + pixel_x = 12; + pixel_y = 15 + }, +/obj/item/grenade/chem_grenade/cleaner{ pixel_x = -7; - pixel_y = 5 + pixel_y = 6 }, -/turf/open/misc/beach/sand, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = -1; + pixel_y = 3 + }, +/turf/open/floor/wood/large, /area/awaymission/beach) -"lx" = ( -/obj/structure/table/wood, -/obj/item/clothing/glasses/sunglasses, -/obj/item/reagent_containers/cup/glass/shaker, +"Uq" = ( +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 9; + pixel_x = 6 + }, +/obj/structure/railing{ + dir = 10 + }, /turf/open/floor/wood, /area/awaymission/beach) -"lA" = ( +"Ut" = ( /obj/structure/table/wood, -/obj/item/reagent_containers/cup/glass/bottle/maltliquor{ - pixel_y = 3 +/obj/item/pai_card{ + 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"; + pixel_y = 3; + pixel_x = 10 }, -/turf/open/floor/wood, +/turf/open/floor/wood/large, /area/awaymission/beach) -"mF" = ( -/obj/structure/table/wood, -/obj/item/food/burger/crab{ - pixel_x = 9; - pixel_y = 8 +"UB" = ( +/obj/structure/bed, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/beach) +"UI" = ( +/obj/effect/turf_decal/siding/dark_red/corner{ + dir = 8 }, -/turf/open/floor/wood, +/turf/open/misc/beach/sand, /area/awaymission/beach) -"mV" = ( -/obj/item/reagent_containers/cup/glass/bottle/beer/light{ - pixel_x = -14; - pixel_y = 15 +"UK" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"UX" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 12; + pixel_x = -7 }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"oE" = ( -/obj/structure/table/wood, -/obj/item/food/burger/crab, -/turf/open/floor/wood, +"Vc" = ( +/obj/structure/closet/gmcloset, +/turf/open/floor/plastic, +/area/awaymission/beach) +"Vd" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Vf" = ( +/turf/open/misc/beach/coast{ + dir = 1 + }, /area/awaymission/beach) -"sG" = ( +"Vo" = ( /obj/effect/turf_decal/sand, -/obj/structure/sign/poster/contraband/smoke/directional/south, -/obj/machinery/vending/cigarette/beach, -/turf/open/misc/beach/sand, +/obj/machinery/door/airlock/wood{ + name = "Bathroom"; + id_tag = "toilet2beach" + }, +/turf/open/floor/iron/white, /area/awaymission/beach) -"wr" = ( +"Vy" = ( /obj/item/toy/seashell{ - pixel_y = -5 + pixel_x = 5; + pixel_y = 4 }, -/turf/open/misc/beach/coast, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"VG" = ( +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/wood/large, /area/awaymission/beach) -"wz" = ( +"VI" = ( /obj/item/toy/seashell{ - pixel_x = -8; - pixel_y = 9 + pixel_x = 12; + pixel_y = -5 }, -/turf/open/misc/beach/coast/corner{ +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"VP" = ( +/obj/structure/dresser, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/wood, +/area/awaymission/beach) +"VQ" = ( +/obj/effect/turf_decal/siding/wood{ dir = 1 }, +/obj/item/blood_filter{ + pixel_y = 8; + pixel_x = -6 + }, +/obj/item/surgical_drapes{ + pixel_x = -1; + pixel_y = 2 + }, +/obj/item/surgical_drapes{ + pixel_x = 13; + pixel_y = 2 + }, +/obj/structure/table/glass, +/turf/open/floor/wood/large, /area/awaymission/beach) -"xA" = ( -/obj/structure/table/wood, -/obj/item/camera, -/turf/open/floor/wood, +"VY" = ( +/turf/open/misc/beach/sand, /area/awaymission/beach) -"yp" = ( -/obj/item/flashlight/flare/torch{ - pixel_x = 15; - pixel_y = -7 +"Wa" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Wb" = ( +/obj/item/toy/seashell{ + pixel_x = 8; + pixel_y = 14 }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"zc" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/cup/glass/bottle/sake{ - pixel_y = 4 +"Wd" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 5"; + id_tag = "beach_room_5" }, +/obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, /area/awaymission/beach) -"ze" = ( -/obj/item/toy/seashell{ - pixel_x = 12; - pixel_y = -5 +"Wi" = ( +/obj/effect/turf_decal/sand{ + density = 1 + }, +/obj/effect/decal/fakelattice, +/turf/open/floor/pod/light{ + density = 1 }, +/area/awaymission/beach) +"Wk" = ( +/obj/structure/billboard/space_cola, +/obj/effect/turf_decal/siding/dark_red, /turf/open/misc/beach/sand, /area/awaymission/beach) -"zZ" = ( +"Wl" = ( /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 +"Wv" = ( +/obj/item/reagent_containers/cup/soda_cans/starkist{ + pixel_y = 16; + pixel_x = 10 }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"Bd" = ( -/obj/item/toy/seashell{ - pixel_x = 12; - pixel_y = 5 +"Wx" = ( +/obj/item/reagent_containers/cup/glass/bottle/wine{ + pixel_y = 16; + pixel_x = -5 }, -/turf/open/misc/beach/coast{ - dir = 4 +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_y = 3; + pixel_x = -8 }, +/obj/structure/table/bronze, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_y = 10; + pixel_x = 6 + }, +/turf/open/floor/wood/large, /area/awaymission/beach) -"EG" = ( -/obj/item/flashlight/flare/torch{ - pixel_x = -2; - pixel_y = 8 +"WC" = ( +/obj/structure/table/bronze, +/obj/item/camera{ + pixel_y = 8; + pixel_x = 6 + }, +/obj/item/pen/blue{ + pixel_x = -11; + pixel_y = 2 }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"FG" = ( -/obj/structure/table/wood, -/obj/machinery/reagentgrinder, -/turf/open/floor/wood, +"WM" = ( +/obj/item/reagent_containers/cup/soda_cans/starkist{ + pixel_x = -6 + }, +/turf/open/misc/beach/sand, /area/awaymission/beach) -"He" = ( -/obj/structure/fluff/beach_umbrella/syndi, -/turf/open/misc/beach/coast/corner{ - dir = 8 +"WO" = ( +/obj/item/cigbutt{ + pixel_y = -6; + pixel_x = -12 }, +/obj/item/clothing/head/soft/black, +/turf/open/floor/wood/parquet, /area/awaymission/beach) -"HN" = ( -/obj/machinery/griddle, -/turf/open/floor/wood, +"Xd" = ( +/obj/structure/table/optable, +/turf/open/floor/wood/large, /area/awaymission/beach) -"Jr" = ( -/obj/machinery/oven/range, +"Xh" = ( +/obj/vehicle/ridden/atv{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Xt" = ( +/obj/structure/table/wood/fancy, +/obj/effect/turf_decal/tile/dark_red/full, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -13; + pixel_y = 14 + }, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = 7; + pixel_y = 8 + }, +/turf/open/floor/iron/smooth_large, +/area/awaymission/beach) +"XB" = ( +/turf/open/water/beach, +/area/awaymission/beach) +"XT" = ( +/obj/effect/turf_decal/siding/dark_red/corner{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"XV" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/machinery/button/door/directional/north{ + id = "beach_room_9" + }, +/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/floor/wood, /area/awaymission/beach) -"Kg" = ( -/obj/item/flashlight/flare/torch{ - pixel_x = 12; +"XX" = ( +/obj/structure/table/wood, +/obj/machinery/recharger, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = -12; pixel_y = 9 }, -/turf/open/misc/beach/sand, +/obj/effect/spawner/random/bureaucracy/stamp{ + pixel_y = 14; + pixel_x = 8 + }, +/turf/open/floor/iron/dark/diagonal, /area/awaymission/beach) -"MD" = ( -/obj/item/toy/seashell, +"Yl" = ( +/obj/effect/turf_decal/sand/plating, +/obj/item/shovel{ + pixel_y = 15; + pixel_x = -8 + }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"MP" = ( -/obj/item/flashlight/flare/torch{ - pixel_x = 7; - pixel_y = -5 +"Yq" = ( +/obj/item/reagent_containers/cup/watering_can{ + pixel_y = 19; + pixel_x = -6 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"YB" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"YL" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/beach) +"YM" = ( +/obj/item/toy/seashell{ + pixel_x = 12; + pixel_y = 5 }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"Nr" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/glass/bottle/beer, -/obj/item/reagent_containers/cup/glass/bottle/beer, -/obj/item/reagent_containers/cup/glass/bottle/beer, -/obj/item/reagent_containers/cup/glass/bottle/beer, -/obj/item/reagent_containers/cup/glass/bottle/beer, -/obj/item/reagent_containers/cup/glass/bottle/beer, +"YV" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 24; + pixel_x = -7 + }, +/obj/structure/flora/coconuts, /turf/open/misc/beach/sand, /area/awaymission/beach) -"QQ" = ( -/obj/item/reagent_containers/cup/glass/bottle/rum{ - pixel_y = 2 - }, -/obj/structure/table/wood, -/turf/open/floor/wood, +"Zj" = ( +/obj/machinery/recharge_station, +/obj/machinery/light/directional/east, +/turf/open/floor/carpet/cyan, /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, +"Zm" = ( +/obj/item/toy/beach_ball, /turf/open/misc/beach/sand, /area/awaymission/beach) -"Sg" = ( -/obj/structure/sink/kitchen/directional/south, -/turf/open/floor/wood, +"Zn" = ( +/obj/structure/bed/medical/emergency, +/turf/open/floor/iron/white/textured_large, /area/awaymission/beach) -"SR" = ( -/obj/machinery/food_cart, -/turf/open/misc/beach/sand, +"Zp" = ( +/turf/open/floor/wood/large, /area/awaymission/beach) -"Tr" = ( -/obj/structure/table/wood, -/obj/item/storage/photo_album, +"Zt" = ( +/obj/structure/table/bronze, +/obj/item/storage/toolbox/fishing{ + pixel_y = 2 + }, /turf/open/floor/wood, /area/awaymission/beach) -"Vn" = ( +"Zw" = ( +/obj/machinery/vending/snack, /obj/effect/turf_decal/sand, -/obj/structure/table/wood, /turf/open/misc/beach/sand, /area/awaymission/beach) -"Vx" = ( -/obj/item/reagent_containers/cup/glass/bottle/wine{ - pixel_y = 4 +"ZA" = ( +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -5; + pixel_y = -5 }, -/obj/structure/table/wood, -/turf/open/floor/wood, +/obj/structure/fluff/beach_umbrella/syndi, +/turf/open/misc/beach/sand, /area/awaymission/beach) -"Ws" = ( -/obj/item/toy/seashell{ - pixel_x = -10; - pixel_y = -4 +"ZH" = ( +/obj/structure/table/bronze, +/obj/item/paper/paperslip{ + pixel_y = 6; + pixel_x = 10 }, -/turf/open/misc/beach/sand, +/obj/item/pen/fourcolor{ + pixel_y = 7; + pixel_x = 1 + }, +/turf/open/floor/carpet, /area/awaymission/beach) -"Za" = ( -/obj/item/flashlight/flare/torch{ - pixel_x = 10; +"ZR" = ( +/obj/structure/chair/plastic, +/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."; pixel_y = -4 }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"ZL" = ( -/obj/machinery/grill, -/turf/open/misc/beach/sand, +"ZU" = ( +/obj/item/toy/seashell{ + pixel_y = 11; + pixel_x = -7 + }, +/turf/open/misc/beach/coast, +/area/awaymission/beach) +"ZX" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/button/door/directional/east{ + id = "toilet1beach"; + name = "restroom lock"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/structure/sink/directional/west, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white, +/area/awaymission/beach) +"ZZ" = ( +/obj/item/stack/arcadeticket{ + pixel_y = 6; + pixel_x = -7 + }, +/turf/open/floor/eighties, /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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +MZ +Le +Le +Le +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +Vf +YV +VY +VY +hL +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +Vf +VY +VY +VY +Er +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +Vf +VY +VY +VY +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +Vf +IZ +VY +VY +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +Pe +Fb +tJ +zr +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +hf +CG +CG +CG +Gh +XB +hf +CG +CG +CG +hQ +CG +CG +CG +Gh +XB +hf +CG +CG +CG +Gh +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +Pe +Fb +Fb +Rj +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +di +FM +hC +jI +Cf +XB +di +FM +hC +jI +gG +FM +hC +jI +Cf +XB +di +FM +hC +Uq +Cf +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +dR +Iw +Iw +xv +XB +xv +dR +Iw +Iw +xv +dR +Iw +Iw +xv +XB +xv +dR +Iw +Iw +xv +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +vR +GC +CQ +xv +xv +xv +kR +Em +CQ +xv +Gn +GC +kD +xv +xv +xv +tx +Em +Ts +xv +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +mg +GC +Gn +ll +Zp +QI +Gn +Em +mU +xv +aX +GC +Gn +JG +Zp +fj +Gn +Em +ru +xv +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +Qf +vM +um +xv +Zp +xv +Qf +Zj +MP +xv +Hv +vM +DV +xv +Zp +xv +Es +jZ +vc +xv +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +xv +xv +xv +xv +Gu +xv +xv +xv +xv +xv +xv +xv +xv +xv +Zp +xv +xv +xv +xv +xv +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +FM +Nk +Gn +cq +CQ +xv +Zp +Zp +UK +Zp +Zp +Zp +Zp +UK +Zp +Zp +Zp +Zp +UK +VG +xv +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +pw +Iw +AG +Em +Gn +lz +Zp +xv +xv +xv +xv +xv +xv +xv +xv +xv +Zp +xv +xv +xv +xv +xv +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +CH +Iw +vc +jZ +hp +xv +Zp +xv +XV +GC +cp +xv +Qk +Em +Nd +xv +Gu +xv +yZ +GC +Fg +xv +XB +MZ +Le +Le +Le +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +xv +gk +xv +xv +Zp +wX +Gn +GC +ru +xv +LS +Em +Gn +Wd +Zp +AW +Gn +GC +ru +xv +MZ +MF +Vy +VY +FD +hL +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +FM +LJ +Gn +kI +cp +xv +Zp +xv +VP +vM +Zt +xv +Qf +jZ +im +xv +Zp +xv +VP +vM +Zt +xv +MF +Wb +It +VY +yq +VY +hL +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +pw +Iw +cn +GC +Gn +yE +Zp +xv +xv +xv +xv +xv +xv +xv +xv +xv +Zp +xv +xv +xv +xv +xv +MT +VY +tP +NF +QG +VY +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +CH +Iw +KB +vM +vF +xv +Zp +Zp +UK +Zp +xv +VY +xv +Zp +Zp +Zp +Zp +UK +Zp +Zp +nW +Da +Wl +VY +VY +VY +VY +VY +ls +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +xv +xv +xv +xv +Zp +xv +xv +at +xv +xv +xv +Jj +xv +xv +Zp +xv +xv +xv +xv +xv +jH +ls +VY +VY +VY +MT +VY +hL +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -af -aj -aj -aj -ao -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +xv +xv +Ug +Yq +an +xv +Zp +xv +oX +Em +CQ +xv +OE +GC +Gn +xv +Zp +cZ +qC +Em +re +xv +VY +VY +xv +nD +xv +xv +xv +tE +hL +Le +Le +Le +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -af -ay -kK -ak -kS -aT -ao -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +EO +Zp +EH +xv +Gu +xv +Gn +Em +ru +xv +CQ +GC +ru +xv +Zp +xv +us +Em +ru +xv +ah +xv +xv +Zp +qX +Zp +xv +xv +tE +VY +VY +VY +hL +Le +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -af -ay -AR -ak -ak -ak -ak -aT -ao -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +RA +Zp +Zp +xv +oa +xv +VP +jZ +AB +xv +Qf +vM +Zt +xv +oa +xv +vc +jZ +CR +xv +xv +xv +Gq +iN +yX +zH +io +xv +xv +wA +VY +VY +VY +VY +hL +Le +Le +Le +Le +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -af -ay -ak -ak -ak -Ws -ak -ak -ak -aT -aj -aj -ao -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +OD +xv +EP +xv +Zp +xv +xv +xv +xv +xv +xv +xv +xv +xv +Zp +xv +xv +xv +xv +xv +dx +Zp +Zp +mb +mb +mb +Zp +QR +Iw +VY +GG +VY +VY +uz +VY +VY +VY +VY +VY +hL +Le +ni +XB +XB +XB +XB +MZ +Le +Le +Le +Le +Le +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -af -ay -ak -ak -ak -aA -ak -ak -ak -ak -ak -ak -ak -aT -aj -aj -aj -aj -ao -av -av -av -av -av -av -av -av -av -av -av -av -av -av -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +hf +CG +xv +xv +xv +iY +Zp +Zp +Zp +Zp +Zp +Zp +Jr +Zp +Zp +Zp +Zp +Zp +Zp +Jr +Zp +uq +Zp +Zp +Og +uL +TG +Zp +Zp +Zp +dS +Iw +VY +VY +VY +sc +sU +VY +VY +VY +ls +VY +VY +VY +hL +ni +XB +XB +XB +Vf +GG +wA +VY +VY +VY +hL +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -af -ay -ak -ak -ak -ak -ak -ak -aA -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aT -aj -ao -av -av -av -av -af -aj -aj -aj -aj -aj -ao -av -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +hf +sj +aE +Zp +mk +Zp +Zp +Zp +Zp +Zp +Zp +Zp +Zp +Zp +Zp +Zp +Zp +Zp +Zp +Zp +Zp +Zp +uq +Zp +Zp +Wa +Bl +BQ +Zp +Zp +FP +Iw +Iw +Wl +VY +VY +VY +VY +VY +VY +Ar +VY +VY +rq +VY +GG +hL +Le +Le +Le +MF +VY +VY +VY +VY +VY +GG +hL +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -ag -ak -ak -ak -aA -ak -aD -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aT -ao -av -av -av -ag -MD -aA -ak -ak -ak -aT -ao -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +di +iF +Zp +xv +xv +xv +aB +aB +xv +Pt +xv +xv +xv +xv +xv +Iw +RI +Iw +xv +xv +xv +xv +xv +xv +Gu +BL +Vd +dc +Zp +Zp +Iw +Iw +Wl +Wl +VY +VY +VY +VY +VY +IA +EU +VY +VY +VY +VY +VY +VY +VY +VY +VY +VY +VY +VY +VY +VY +IZ +VY +Zm +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +di +Zp +Zp +xv +aw +Qt +un +un +dk +un +Py +xv +Ky +zI +Zn +Zn +bi +nK +NU +xv +rd +rd +xv +Wx +Zp +rQ +Zp +Zp +Zp +Zp +xv +gI +Wl +nq +Wl +VY +VY +VY +ls +VY +VY +VY +VY +xv +Iw +Iw +xv +VY +xv +Iw +Iw +xv +fU +VY +VY +bY +VY +VY +hL +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +fe +sd +uV +xv +iM +un +Lg +mP +Lg +un +tD +xv +TX +bi +bi +bi +bi +bi +bi +ob +sS +sS +xv +iw +GC +ZH +GC +GC +GC +GC +NH +GC +Wl +Wl +Wl +VY +VY +wA +VY +VY +VY +VY +xv +xv +zs +zs +xv +Iw +xv +oC +RQ +xv +xv +ls +VY +Ar +Ar +VY +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +HV +mi +uV +xv +eE +un +Cb +uJ +eT +un +Pk +xv +jm +bi +bi +TK +bi +bi +Gi +xv +Bm +sS +xv +GC +GC +tU +GC +GC +GC +Gf +xv +GC +GC +Wl +Wl +VY +VY +VY +VY +VY +VY +VY +xv +dh +kZ +MO +iy +kZ +xp +Dy +yc +MN +xv +VY +VY +VY +tr +VY +Kh +Rj +JF +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +HV +iA +xv +Ne +un +zA +XX +Pn +dk +qk +xv +fa +Ka +bi +kz +Fe +bi +Ih +xv +Bm +sS +xv +iw +GC +fd +GC +GC +GC +GC +NH +GC +GC +GC +Wl +VY +VY +VY +VY +VY +VY +VY +xv +xv +mT +ZZ +kZ +uc +FE +Tn +QM +Zp +Iw +VY +VY +VY +ls +VY +BK +XB +XB +XB +XB +pM +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +xv +un +un +un +yL +Dj +xv +xv +Iw +xv +bi +bi +bi +xv +xv +xv +iq +sS +xv +wL +Zp +qf +Zp +Zp +Zp +xv +xv +cD +GC +GC +GC +VY +VY +VY +ls +VY +VY +GG +VY +xv +Iw +xv +gd +gd +yn +Zp +Ut +Zp +xv +VY +VY +VY +VY +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +un +mN +DD +mp +xv +xv +ns +uZ +xv +MV +xv +Ic +xv +Bm +QF +sS +sS +xv +xv +Zp +Og +uL +TG +Zp +Iw +cD +Lt +Wl +GC +GC +GC +VY +VY +VY +VY +VY +VY +wA +VY +Wl +xv +Iw +Iw +xv +Zp +sP +xv +xv +Hn +VY +VY +VY +VY +hL +ni +XB +XB +XB +XB +XB +XB +XB +JF +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +pE +aB +aB +xv +xv +VQ +Zp +Zp +Zp +Zp +xv +Iw +xv +Bm +sS +sS +sS +sS +ob +Zp +Wa +Mo +BQ +Zp +Iw +Iw +Lt +Wl +Wl +GC +GC +GC +VY +VY +VY +VY +VY +VY +VY +VY +VY +VY +Wl +xv +qy +Iw +xv +tz +Wl +VY +VY +VY +IZ +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -ag -ak -ak -aA -ak -ak -ak -ak -ak -aA -ak -ak -ak -ak -ak -ak -ak -ak -aA -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aT -ao -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +Tr +Tr +On +xv +XB +hD +Zp +Zp +Zp +Zp +Cf +XB +xv +xv +Vc +Vc +Vc +xv +xv +xv +BL +fV +dc +Zp +nO +Iw +Lt +Wl +Wl +VY +GC +GC +GC +VY +VY +VY +VY +VY +VY +VY +Wl +VY +VY +TJ +sL +Sj +Ll +VY +VY +VY +Wl +VY +VY +VY +Fk +XB +XB +XB +XB +XB +XB +XB +XB +XB +pM +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +aB +UB +Tr +On +aB +XB +vx +Bq +Xd +Ej +lk +LC +XB +XB +xv +xv +xv +xv +xv +iJ +xv +jU +xv +Zp +Zp +EG +Iw +Nh +Wl +ls +VY +VY +GC +GC +GC +VY +VY +VY +ls +VY +Wl +Wl +Wl +VY +Wl +VY +Wl +VY +Wl +VY +VY +VY +VY +VY +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +xv +cE +xv +xv +XB +HV +OK +mG +uv +LC +XB +XB +XB +xv +fi +uT +uT +Nb +SB +SB +uT +xv +wt +YB +xv +xv +Wl +VY +VY +VY +VY +VY +GC +GC +GC +VY +VY +VY +Wl +Wl +Wl +VY +Wl +VY +Wl +Wl +VY +VY +VY +Wl +VY +VY +gP +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +JF +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +xv +xv +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +uT +FF +Ge +SB +SB +Qr +KV +xv +xv +xv +xv +VY +VY +nV +VY +GG +VY +VY +bg +GC +GC +Wl +Wl +Wl +Wl +Wl +VY +VY +Wl +Wl +VY +VY +Wl +VY +VY +VY +VY +VY +OT +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -ag -MD -ak -ak -ak -ak -ak -ak -ak -ak -aA -bf -bp -bx -ak -ak -aX -aX -aX -aX -ak -ba -ba -cd -aX -co -bd -bd -hw -cH -ba -ak -ak -cO -ak -ap -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +Ge +uT +uT +vq +La +xv +xv +xv +ls +VY +VY +VY +VY +VY +VY +VY +VY +wA +VY +Wl +Wl +Wl +Wl +Wl +Wl +VY +Cy +xv +xv +Iw +Iw +xv +xv +Zw +VY +Wl +VY +VY +gP +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -ah -az -ak -ak -ak -ak -ak -ak -ak -ak -ak -bg -bq -by -ak -ak -aX -bL -bQ -aX -ak -ba -ba -cs -aX -cn -ck -bd -hw -cH -ba -ak -ak -cP -ak -ap -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +xv +xv +lY +YL +xv +xv +CF +VY +VY +VY +jW +jW +jW +VY +VY +VY +VY +VY +ls +Wl +Wl +Wl +VY +VY +Wl +Wl +cX +xv +jF +iU +li +xE +xv +BN +VY +VY +VY +VY +VY +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +pM +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -ag -ak -ak -ak -ak -ak -ak -ak -ak -ak -bh -br -bz -ak -aA -aX -bM -bR -bX -ba -ba -ba -cg -aX -cp -bd -bd -cC -cH -ba -ak -ak -cO -ak -ap -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +xv +xv +xv +Fb +mf +VY +KL +jW +jW +wY +jW +jW +GG +VY +VY +VY +VY +Wl +Wl +Rr +VY +VY +VY +Wl +xv +xv +pX +Zp +Zp +Zp +ow +vX +wd +VY +VY +gP +VY +Kh +Rj +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -ah -az -ak -ak -ak -ak -ak -ak -ak -ak -ak -ba -ak -ak -aD -aX -aX -aX -aX -ak -ba -ba -Vn -aX -cj -bd -bd -cD -cH -ba -ak -ak -ak -ak -ap -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +tJ +gw +jW +wY +Yl +wY +jW +GG +VY +aT +sM +II +Wl +Wl +VY +VY +VY +VY +Wl +xr +Zp +Zp +MD +fv +Zp +Mm +RE +Wa +VY +VY +kl +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -ag -ak -ak -ak -ak -bf -bp -bx -ak -ak -ba -ak -ak -ak -ak -ak -ak -ak -ak -ba -ba -Vn -aX -ci -bd -bd -mF -cH -ba -ak -ak -cO -ak -ap -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +Hg +jW +wY +wY +wY +nr +VY +VY +xi +xi +xv +Wl +Wl +VY +VY +VY +VY +pD +xv +kC +Th +Mn +zp +Zp +Mm +RE +Wa +VY +VY +gP +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +JF +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -ag -ak -ak -ak -ak -bg -aQ -by -zZ -ba -ba -ba -ba -ba -ba -ba -ba -ba -ba -ba -ba -sG -aX -lx -bd -bd -cE -cH -ba -ak -ak -cQ -ak -ap -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +AH +jW +ke +wY +wY +jW +GG +VY +xi +ZX +Gm +Wl +Wl +ls +VY +VY +VY +xv +xv +Gu +Nf +ai +Zp +Zp +pt +RE +Wa +VY +VY +Av +VY +hL +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -ag -ak -ak -ak -ak -bh -br -bz -ak -ak -ak -bA -ba -ba -ak -ak -ak -ak -ak -ba -ba -aX -aX -aX -bd -bd -cF -cH -ba -ak -ak -cO -ak -ap -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +jW +jW +wY +jW +jW +GG +VY +xi +xi +xv +Wl +Wl +VY +VY +VY +DF +xv +Cl +Zp +Aa +pN +Zp +kB +Sg +JR +kh +VY +VY +VY +gP +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -ag -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ba -ba -aX -aX -aX -aX -ak -ba -ba -aX -cq -bd -bd -bd -oE -cH -ba -ak -ak -cR -ak -ap -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +VY +jW +jW +jW +VY +VY +VY +xi +FB +Vo +Wl +Wl +VY +VY +VY +VY +Iw +Ea +Zp +Zp +Zp +Zp +aC +xv +kh +VY +VY +VY +wA +Kw +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -ag -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ba -ba -aX -bN -bS -bY -ba -ba -ba -aX -Jr -bd -FG -bd -Tr -cH -ba -ak -ak -cO -ak -ap -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +GG +VY +VY +VY +wA +VY +xv +xi +xi +xv +Wl +Wl +VY +VY +VY +VY +Iw +IP +Zp +Zp +Zp +NS +Mm +Wa +VY +VY +VY +VY +VY +gP +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -ag -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ba -ba -aX -bL -bQ -aX -ak -ba -ba -aX -HN -bd -cf -bd -xA -cH -ba -ak -aA -cS -ak -ap -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +VY +ls +VY +VY +VY +VY +VY +xi +xo +Qe +Wl +Wl +VY +wA +VY +VY +Iw +DY +Zp +Zp +Ja +ea +MG +kh +VY +Hn +VY +VY +VY +sp +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +pM +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -ag -ak -ak -ak -ak -ak -ak -aX -aX -aX -aX -ak -ba -ba -aX -aX -aX -aX -ak -ba -ba -aX -Sg -bd -bd -bd -cf -cH -ba -ak -ak -cO -ak -ap -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +tJ +wA +VY +VY +VY +VY +VY +VY +xv +xv +xv +Wl +Wl +VY +VY +ls +VY +xv +DY +Zp +ko +uu +MG +kh +VY +VY +VY +VY +VY +VY +VY +Kh +Rj +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -ag -ak -ak -ak -ak -ak -ak -aX -bb -bd -aX -ak -ba -ba -ak -ak -ak -ak -ak -ba -ba -aX -cf -cr -cl -cw -aX -cI -ba -ak -ak -cT -ak -ap -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +VY +VY +dO +VY +VY +VY +xv +JO +Wl +Wl +Wl +VY +VY +VY +VY +xv +xv +Iw +Iw +xv +dg +VY +VY +VY +VY +VY +VY +VY +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -ah -az -ak -ak -ak -ak -ak -aX -bc -bi -bs -ba -ba -ba -bF -ak -ak -ak -ak -ba -ba -aX -aX -aX -aX -aX -aX -ba -ba -ak -ak -ak -bo -aq -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +VY +VY +kG +VY +VY +Hn +VY +lS +Wl +Wl +VY +VY +VY +VY +VY +VY +UX +VY +om +VY +ls +VY +VY +VY +VY +VY +rF +VY +Kh +Rj +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -ag -ak -ak -ak -ak -ak -aX -aX -aX -aX -ak -ba -ba -bG -ak -ak -ak -ak -ba -ba -ba -ba -ba -ba -ba -ba -ba -ba -ak -ak -ak -ap -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +ot +VY +VY +wA +VY +VY +VY +VY +VY +Wl +Wl +VY +VY +VY +VY +wA +VY +MT +VY +VY +Hn +VY +VY +VY +VY +VY +VY +Eb +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +JF +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +Fu +pr +VY +VY +ls +VY +VY +VY +VY +Wl +Wl +VY +VY +VY +VY +VY +VY +GG +VY +VY +VY +VY +VY +fz +fu +Wi +VY +VY +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -ag -aE -ak -ak -aA -ak -ak -ak -ak -ak -ak -ba -ba -bG -ak -ak -aA -ak -ak -ak -ak -ak -ak -SR -ak -ak -ak -ak -Nr -cM -ap -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +tJ +VY +VY +VY +VY +VY +VY +VY +VY +Wl +Wl +Wl +OG +gi +cj +XT +VY +VY +VY +ls +VY +VY +VY +Ft +wC +St +VY +VY +VY +hL +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +Rs +VY +VY +VY +VY +VY +VY +VY +Hn +Wl +Wl +Wk +LQ +nC +DH +VY +VY +VY +VY +VY +VY +VY +VY +VY +VY +VY +wA +VY +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +Jo +ot +VY +KW +mO +VY +VY +VY +Wl +Wl +KK +Sr +nC +DH +VY +VY +VY +VY +VY +VY +VY +VY +VY +VY +VY +VY +ls +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +pM +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -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 -aA -ak -ak -ap -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +Fb +Cp +VY +db +Ar +Ar +VY +VY +VY +Wl +Wl +KK +Xt +nC +DH +VY +ls +VY +VY +wA +VY +VY +wA +VY +VY +IZ +VY +VY +zX +hL +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +JF +XB +XB +XB +Pe +Fb +tJ +VY +VY +VY +VY +VY +Wl +Wl +UI +pd +pd +rR +VY +VY +VY +VY +VY +VY +ot +ot +ot +ot +VY +VY +VY +yF +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +IA +Wv +VY +Wl +Wl +Wl +pF +VY +VY +VY +VY +QO +VY +VY +VY +PH +fM +fM +fM +fM +TC +Mr +VY +rA +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +JF +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +pM +XB +XB +XB +XB +XB +XB +Vf +VY +uG +uG +VY +Wl +Wl +VY +VY +VY +VY +VY +VY +VY +GG +OU +gP +dV +VY +VY +VY +VY +VY +EC +VY +gP +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +tJ +VY +VY +VY +Wl +Wl +VY +VY +VY +VY +VY +VY +EB +VY +gP +gP +dV +VY +VY +VY +VY +VY +EC +VY +VY +Kh +Rj +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +VY +VY +Wl +Wl +VY +cw +VY +VY +VY +VY +VY +VY +gP +gP +dV +VY +VY +VY +VY +VY +EC +wA +Kh +Rj +XB +XB +XB +XB +XB +XB +XB +XB +XB +pM +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -ak -ak -ba -ba -bH -ak -ak -ak -ak -ak -ch -ak -ak -cu -ak -ak -ak -ak -cu -ak -ak -ak -bo -aq -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +JF +XB +XB +XB +XB +XB +XB +XB +Vf +ls +VY +VY +Wl +Wl +VY +VY +VY +VY +ls +VY +Wl +VY +VY +VY +dV +VY +Zm +VY +VY +VY +EC +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -ak -ak -ba -ba -ak -ak -ak -ak -ak -ak -ak -ak -ak -cu -ak -ak -ak -ak -cu -ak -aA -bo -aq -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +VY +VY +Wl +Wl +Wl +Wl +Wl +VY +VY +VY +VY +VY +VY +fX +dV +VY +VY +VY +VY +VY +EC +IZ +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -aI -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +wA +VY +VY +Wl +Wl +Wl +VY +Wl +Wl +VY +Wl +VY +VY +VY +AU +dV +Ji +Ji +Ji +Ji +Ji +EC +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +JF +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +pM +XB +XB +XB +XB +XB +XB +MZ +cG +VY +VY +ls +Wl +Wl +VY +DU +VY +VY +VY +VY +VY +VY +VY +fX +dV +VY +VY +VY +VY +VY +EC +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -av -av -av -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 -ap -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +MZ +MF +VY +VY +GN +VY +Wl +Wl +VY +VY +VY +VY +Wl +VY +VY +wA +VY +VY +dV +VY +VY +VY +VY +VY +EC +VY +BK +XB +XB +XB +XB +XB +XB +pM +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +JF +XB +XB +MZ +Le +oq +VY +VY +VY +VY +VY +Wl +Wl +Wl +VY +VY +VY +VY +VY +VY +ls +gP +gP +dV +VY +VY +VY +VY +VY +EC +Nm +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -av -av -af -ay -aX -be -bl -bd -aX -ba -ba -aX -bd -bT -ca -aX -ak -aA -ak -ak -cu -ak -ak -ak -ak -cu -ak -ak -ap -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +MZ +MF +wA +VY +VY +xv +xv +xv +xv +ae +Wl +Wl +VY +VY +VY +VY +VY +Wl +VY +gP +gP +dV +VY +VY +VY +VY +VY +EC +VY +Ld +ni +XB +XB +JF +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +IZ +xv +xv +xv +Hq +Hq +xv +xv +xI +QN +VY +VY +DR +yt +VY +VY +VY +gP +gP +dV +VY +VY +VY +VY +VY +EC +VY +VY +hL +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +MZ +MF +VY +xv +xv +Hq +TO +Qg +Qg +Qg +dL +Qg +PN +QN +VY +HU +WC +VY +VY +VY +VY +VY +FL +Cv +Cv +Cv +Cv +gj +ql +VY +ZR +VY +ZU +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +MZ +MF +VY +VY +xv +Hq +Qg +Qg +Qg +Qg +Qg +dL +Qg +Qg +Da +VY +VY +VY +ls +VY +VY +VY +VY +wA +MX +MX +MX +MX +VY +VY +VY +Ff +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +GG +VY +VY +xv +xv +AP +xv +xv +Hq +Qg +xv +Qg +Qg +Da +VY +VY +VY +VY +VY +VY +VY +VY +ls +VY +VY +VY +VY +VY +ls +VY +gP +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -af -ay -ak -ak -ak -ak -ak -aX -bb -df -QQ -aX -ba -ba -aX -bu -dc -bZ -aX -ak -ak -ak -ak -aA -ak -ak -ak -ak -ak -ak -ak -cW -ak -ap -av -av -av -av -cZ -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +MZ +MF +VY +GG +Wl +xv +IW +cR +IW +xv +Hq +Qg +bz +Qg +Qg +Da +VY +VY +wA +VY +VY +VY +VY +VY +VY +VY +VY +VY +wA +VY +VY +VY +ZA +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +VY +xv +aU +xv +xv +cR +cR +xv +xv +Qg +IE +Qg +Qg +Da +VY +VY +VY +ot +ot +ot +VY +ot +ot +VY +VY +VY +VY +VY +VY +VY +gP +VY +yT +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -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 -aA -ak -ak -ak -cX -ak -ap -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +VY +xv +MK +Ce +xv +IW +cR +cR +xv +Qg +by +Qg +Qg +Da +VY +VY +VY +ot +ot +ot +VY +ot +ot +VY +VY +VY +VY +VY +gI +VY +WM +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +wA +VY +xv +HF +kp +xv +xv +lf +cR +xv +xv +fI +Qg +dq +FY +VY +VY +ls +VY +VY +VY +VY +VY +VY +VY +VY +VY +ot +VY +VY +VY +IZ +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +VY +xv +MH +MK +vf +xv +ug +cR +IW +xv +Ia +sL +FY +VY +VY +VY +VY +VY +CJ +iW +iW +iW +mJ +VY +VY +gP +GI +uP +VY +VY +VY +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -ag -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ch -ak -ba -ba -ak -bP -bV -cc -ak -ak -ak -ak -ak -aA -ak -ak -ak -ak -ak -ak -ak -aK -ak -ap -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +tJ +VY +xv +xv +MK +bC +xv +ug +cR +IW +xv +oi +VY +VY +VY +VY +wA +VY +CJ +gR +Gn +Gn +Gn +eH +mJ +IZ +pT +MX +VY +VY +VY +VI +Kh +Rj +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +GG +Xh +xv +Bv +Bv +xv +xv +IW +xv +xv +to +VY +VY +VY +VY +VY +VY +rE +dr +Gn +Gn +Gn +Gn +Nl +VY +VY +VY +VY +lP +ls +Kh +Rj +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +tJ +VY +VY +VY +VY +VY +xv +xv +xv +CY +VY +SI +VY +VY +VY +VY +VY +Km +Sw +Gn +Gn +Gn +Gn +JQ +VY +Zm +VY +VY +VY +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +tJ +VY +VY +VY +VY +VY +VY +gI +VY +VY +VY +VY +VY +VY +VY +jM +xv +xv +xv +xv +xv +xv +xv +Il +VY +VY +VY +VY +Kh +Rj +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -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 -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +tJ +IZ +VY +VY +VY +VY +VY +VY +ot +ot +VY +ot +ot +CJ +xv +xv +tK +Qg +TO +zK +uN +xv +xv +VY +VY +Kh +Fb +Rj +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -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 -av -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +wA +VY +xi +xi +xv +VY +VY +VY +VY +VY +VY +VY +rE +pO +Qg +FU +lb +lb +FU +lb +wv +xv +xv +Fb +Rj +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -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 -av -av -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +tJ +VY +xi +Cg +bx +VY +VY +uo +uo +uo +uo +iI +TJ +xv +yO +Ow +Ow +Ow +Ow +Ow +bH +WO +xv +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -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 -av -av -av -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +tJ +xv +xv +xv +VY +FH +VY +VY +VY +VY +VY +VY +xv +xv +EF +EF +EF +EF +EF +BD +pC +xv +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -av -ah -az -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -bo -am -aq -av -av -av -av -av -av -av -av -av -av -av -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +tJ +YM +VY +VY +cv +Dv +VY +VY +VY +Rn +VY +FJ +xv +CG +Gh +XB +XB +XB +XB +Ha +xv +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -av -av -ah -az -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -bo -aq -av -av -av -av -av -av -av -av -av -av -av -av -av -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +VY +IZ +VY +VY +VY +VY +qt +Kh +uY +Rj +xv +Kn +Cf +XB +XB +XB +XB +xv +xv +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +tJ +fm +VY +VY +FK +Kh +Fb +Fb +Rj +XB +XB +xv +xv +lB +ho +ho +ho +xv +xv +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -av -av -av -ah -az -ak -ak -ak -ak -bo -am -am -am -Bd -aq -av -av -av -av -av -av -av -av -av -av -av -av -av -av -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +Fb +Fb +Fb +Fb +Rj +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -av -av -av -av -ah -am -am -am -am -aq -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (127,1,1) = {" -aa -aa -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (128,1,1) = {" -aa -aa -av -af -aj -aj -aj -ao -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (129,1,1) = {" -aa -aa -av -ag -ak -ak -da -ap -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (130,1,1) = {" -aa -aa -av -ag -au -an -ak -ap -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (131,1,1) = {" -aa -aa -av -ag -al -ak -MD -ap -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (132,1,1) = {" -aa -aa -av -ah -am -am -am -aq -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (133,1,1) = {" -aa -aa -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (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 +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(136,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(137,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(138,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(139,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(140,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(141,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(142,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(143,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(144,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(145,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(146,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(147,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(148,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(149,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(150,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(151,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(152,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(153,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(154,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(155,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(156,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(157,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(158,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(159,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(160,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(161,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(162,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(163,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(164,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(165,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(166,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(167,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(168,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(169,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(170,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(171,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(172,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(173,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(174,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(175,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(176,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(177,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(178,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(179,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(180,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(181,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(182,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(183,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(184,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(185,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(186,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(187,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(188,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(189,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(190,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(191,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(192,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(193,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(194,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(195,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(196,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(197,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(198,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(199,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(200,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(201,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(202,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(203,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(204,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(205,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(206,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(207,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(208,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(209,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(210,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(211,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(212,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(213,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(214,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(215,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(216,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(217,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(218,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(219,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(220,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(221,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(222,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(223,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(224,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(225,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(226,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(227,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(228,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(229,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(230,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(231,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(232,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(233,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(234,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(235,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(236,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(237,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(238,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(239,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(240,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(241,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(242,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(243,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(244,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(245,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(246,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(247,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(248,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(249,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(250,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(251,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(252,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(253,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(254,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(255,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm index 7f0c4a2e38669..a1e4de62b485c 100644 --- a/_maps/RandomZLevels/caves.dmm +++ b/_maps/RandomZLevels/caves.dmm @@ -1112,10 +1112,6 @@ initial_gas_mix = "n2=23;o2=14;TEMP=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, @@ -1210,7 +1206,7 @@ "he" = ( /obj/structure/window/spawner/directional/west, /obj/structure/window/spawner/directional/south, -/mob/living/simple_animal/hostile/mining_drone, +/mob/living/basic/mining_drone, /turf/open/floor/plating, /area/awaymission/caves/listeningpost) "hq" = ( @@ -1268,7 +1264,7 @@ }, /area/awaymission/caves/bmp_asteroid/level_two) "kE" = ( -/mob/living/basic/giant_spider/hunter, +/mob/living/basic/spider/giant/hunter, /turf/open/floor/iron, /area/awaymission/caves/bmp_asteroid) "kL" = ( @@ -1340,7 +1336,7 @@ /area/awaymission/caves/northblock) "pC" = ( /obj/item/mjollnir, -/mob/living/basic/giant_spider/nurse, +/mob/living/basic/spider/giant/nurse, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, @@ -1444,7 +1440,7 @@ /obj/machinery/sleeper{ dir = 8 }, -/mob/living/basic/giant_spider/hunter, +/mob/living/basic/spider/giant/hunter, /turf/open/floor/iron, /area/awaymission/caves/bmp_asteroid) "uO" = ( @@ -1602,7 +1598,7 @@ }, /area/awaymission/caves/bmp_asteroid/level_two) "Bz" = ( -/mob/living/basic/giant_spider/nurse, +/mob/living/basic/spider/giant/nurse, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, @@ -1684,7 +1680,7 @@ "FS" = ( /obj/machinery/light/small/built/directional/north, /obj/structure/spider/stickyweb, -/mob/living/basic/giant_spider/hunter, +/mob/living/basic/spider/giant/hunter, /turf/open/floor/iron, /area/awaymission/caves/bmp_asteroid) "FV" = ( @@ -1732,7 +1728,7 @@ /area/awaymission/caves/bmp_asteroid/level_three) "IH" = ( /obj/structure/window/spawner/directional/west, -/mob/living/simple_animal/hostile/mining_drone, +/mob/living/basic/mining_drone, /turf/open/floor/plating, /area/awaymission/caves/listeningpost) "IN" = ( @@ -1851,10 +1847,6 @@ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) -"OE" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/plating, -/area/awaymission/caves/research) "OX" = ( /turf/closed/indestructible/oldshuttle{ desc = "Go through."; @@ -1962,6 +1954,10 @@ /obj/item/reagent_containers/blood/o_plus, /turf/open/floor/iron, /area/awaymission/caves/bmp_asteroid) +"WH" = ( +/obj/vehicle/sealed/mecha/ripley/mining, +/turf/open/floor/iron/recharge_floor, +/area/awaymission/caves/bmp_asteroid) "Xa" = ( /mob/living/basic/bat{ desc = "A rare breed of bat which roosts deep in caves."; @@ -1970,7 +1966,7 @@ /turf/open/floor/iron, /area/awaymission/caves/northblock) "Xs" = ( -/mob/living/basic/giant_spider/hunter, +/mob/living/basic/spider/giant/hunter, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, @@ -1992,7 +1988,7 @@ /area/awaymission/caves/bmp_asteroid/level_two) "XR" = ( /obj/structure/spider/stickyweb, -/mob/living/basic/giant_spider/hunter, +/mob/living/basic/spider/giant/hunter, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, @@ -9394,7 +9390,7 @@ bL ch cr cA -OE +cr cR cV cr @@ -19204,7 +19200,7 @@ bL bL bL dX -gC +WH sI gG gJ diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm index 870f873d45a28..2ab9c32123472 100644 --- a/_maps/RandomZLevels/moonoutpost19.dmm +++ b/_maps/RandomZLevels/moonoutpost19.dmm @@ -2,26 +2,74 @@ "aa" = ( /turf/open/space, /area/space) +"ab" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/syndicate) "ac" = ( /turf/closed/mineral/random/labormineral, /area/awaymission/moonoutpost19/main) +"ad" = ( +/obj/structure/marker_beacon/burgundy, +/obj/structure/lattice/catwalk, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/mines) "ae" = ( /turf/closed/indestructible/rock, /area/awaymission/moonoutpost19/main) -"am" = ( -/obj/structure/alien/weeds, -/obj/structure/fluff/minepost, +"ah" = ( +/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, +/area/awaymission/moonoutpost19/research) +"ai" = ( +/obj/machinery/mineral/processing_unit{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/railing/corner, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/syndicate) +"ak" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/sign/warning/vacuum/directional/south, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/syndicate) +"al" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/structure/cable, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/mines) -"ao" = ( -/obj/machinery/light/warm/no_nightlight/directional/west, -/obj/item/cigbutt{ - pixel_x = 4 - }, -/turf/open/floor/plastic, -/area/awaymission/moonoutpost19/arrivals) +/area/awaymission/moonoutpost19/main) "ap" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/dark/opposingcorners{ @@ -31,13 +79,6 @@ dir = 5 }, /area/awaymission/moonoutpost19/research) -"ar" = ( -/obj/effect/mapping_helpers/burnt_floor, -/obj/effect/decal/cleanable/blood/gibs/body, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/mines) "as" = ( /obj/item/stack/rods, /obj/structure/cable, @@ -52,45 +93,21 @@ }, /turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/research) -"aw" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/contraband/space_cube/directional/west, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +"ay" = ( +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 6 }, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"az" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"aA" = ( -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"aB" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"aF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"aG" = ( -/obj/machinery/door/airlock{ - name = "Unisex Showers" - }, -/obj/machinery/duct, -/turf/open/floor/iron/freezer, /area/awaymission/moonoutpost19/arrivals) +"aJ" = ( +/obj/machinery/door/poddoor{ + id = "AwayRD"; + layer = 2.9; + name = "Privacy Shutter" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) "aK" = ( /obj/structure/table/reinforced, /obj/structure/window/reinforced/spawner/directional/north, @@ -110,10 +127,11 @@ "aL" = ( /turf/open/misc/asteroid/basalt, /area/awaymission/moonoutpost19/main) -"aN" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) +"aM" = ( +/obj/structure/closet/emcloset, +/obj/structure/window/spawner/directional/south, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) "aO" = ( /obj/structure/displaycase{ desc = "A display case for prized possessions. It hasn't been cleaned in a while."; @@ -125,82 +143,62 @@ }, /turf/open/floor/pod/dark, /area/awaymission/moonoutpost19/tent) -"aP" = ( -/obj/machinery/gateway/away{ - calibrated = 0 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"aR" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"aS" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -12; - pixel_y = 2 +"aQ" = ( +/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/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/obj/structure/alien/weeds, +/obj/effect/turf_decal/tile/purple{ + dir = 8 }, /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) "aU" = ( /turf/closed/wall, /area/awaymission/moonoutpost19/syndicate) -"aV" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"aZ" = ( -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"ba" = ( -/obj/structure/marker_beacon/burgundy, -/obj/structure/cable, -/obj/structure/lattice/catwalk, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"aW" = ( +/obj/machinery/mineral/unloading_machine{ + dir = 1; + icon_state = "unloader-corner"; + input_dir = 4; + output_dir = 8 }, -/area/awaymission/moonoutpost19/main) -"bc" = ( -/obj/structure/marker_beacon/burgundy, -/obj/structure/lattice/catwalk, -/turf/open/misc/asteroid/moon{ +/obj/structure/alien/weeds, +/turf/open/floor/plating{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/mines) +/area/awaymission/moonoutpost19/syndicate) +"aY" = ( +/obj/structure/grille/broken, +/obj/item/stack/rods, +/obj/item/stack/rods, +/obj/item/shard, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) "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/directional/north, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"bg" = ( -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"bh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"bj" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood/gibs, +"bf" = ( +/obj/structure/flora/rock/style_random{ + pixel_y = -2 + }, +/obj/item/clothing/head/soft/blue{ + pixel_x = 12; + pixel_y = -12; + name = "medbay runtimes cap" + }, +/obj/item/clothing/head/soft/blue{ + pixel_y = 8; + pixel_x = 12; + name = "medbay runtimes cap" + }, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/hive) +/area/awaymission/moonoutpost19/main) "bk" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 8 @@ -210,220 +208,95 @@ "bl" = ( /turf/closed/mineral/random/high_chance, /area/awaymission/moonoutpost19/hive) -"bq" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/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, -/area/awaymission/moonoutpost19/syndicate) -"br" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/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, -/area/awaymission/moonoutpost19/syndicate) -"bu" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 4 - }, +"bm" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"bw" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" +/obj/item/stack/ore/glass{ + pixel_x = -6; + pixel_y = 10 }, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/syndicate) -"bA" = ( -/obj/machinery/light/directional/west, -/obj/structure/chair/stool/directional/south, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"bB" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"bC" = ( +/area/awaymission/moonoutpost19/arrivals) +"bn" = ( +/obj/structure/chair, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"bD" = ( /turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"bF" = ( -/obj/structure/toilet{ - dir = 1 - }, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/syndicate) -"bI" = ( -/obj/machinery/light/broken/directional/east, -/obj/machinery/airalarm/directional/east, +/area/awaymission/moonoutpost19/arrivals) +"bo" = ( +/obj/machinery/airalarm/directional/north, /obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"bO" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Break Room" +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 1 }, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"bP" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/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 +/area/awaymission/moonoutpost19/arrivals) +"bp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/barricade/sandbags, +/obj/effect/turf_decal/sand, +/obj/item/stack/ore/glass{ + pixel_y = -10 }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) -"bS" = ( -/obj/machinery/computer/monitor, -/obj/effect/turf_decal/stripes/line{ - dir = 5 +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 1 }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) -"bT" = ( -/obj/machinery/power/smes{ - input_level = 10000; - inputting = 0; - output_level = 15000 +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"bt" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 }, /obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) -"bV" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) -"bX" = ( -/obj/machinery/conveyor{ - id = "awaysyndie" +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"bv" = ( +/obj/structure/tank_dispenser/oxygen{ + oxygentanks = 9 }, +/obj/machinery/light/small/broken/directional/north, /obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/railing/corner{ - dir = 4 + dir = 9 }, /turf/open/floor/plating{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) -"bY" = ( -/obj/machinery/mineral/unloading_machine{ - dir = 1; - icon_state = "unloader-corner"; - input_dir = 4; - output_dir = 8 - }, +"bJ" = ( /obj/structure/alien/weeds, -/turf/open/floor/plating{ +/obj/structure/alien/egg/burst, +/turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/syndicate) -"bZ" = ( -/obj/structure/sign/poster/contraband/syndicate_recruitment/directional/north, -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/obj/structure/alien/weeds, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"ca" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"cf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/area/awaymission/moonoutpost19/hive) +"bK" = ( +/obj/item/stack/sheet/mineral/wood, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/structure/cable, +/area/awaymission/moonoutpost19/mines) +"bL" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; 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, -/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, -/area/awaymission/moonoutpost19/syndicate) -"cl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) -"cm" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/area/awaymission/moonoutpost19/arrivals) +"bU" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security Post"; + req_access = "201" }, -/obj/structure/sign/poster/contraband/hacking_guide/directional/east, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"cb" = ( +/obj/machinery/light/broken/directional/east, +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) "cn" = ( /obj/structure/railing{ dir = 5 @@ -432,71 +305,43 @@ /obj/effect/turf_decal/stripes/red/end, /turf/open/floor/iron/half, /area/awaymission/moonoutpost19/syndicate) -"co" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +"cq" = ( +/obj/machinery/vending/medical{ + req_access = "201" }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +/turf/open/floor/iron/white/side, +/area/awaymission/moonoutpost19/research) +"cr" = ( +/obj/item/clothing/head/soft/blue{ + pixel_x = 12; + pixel_y = -12; + name = "medbay runtimes cap" }, -/area/awaymission/moonoutpost19/syndicate) -"cp" = ( -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/item/clothing/head/soft/blue{ + pixel_x = 12; + name = "medbay runtimes cap" }, -/area/awaymission/moonoutpost19/syndicate) -"ct" = ( -/obj/structure/cable, -/turf/open/floor/iron{ +/obj/item/clothing/head/soft/blue{ + name = "medbay runtimes cap" + }, +/turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/syndicate) -"cu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +/area/awaymission/moonoutpost19/main) +"cv" = ( +/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."; + pixel_x = 5 }, -/area/awaymission/moonoutpost19/syndicate) -"cx" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/arrivals) "cy" = ( -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) -"cz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) -"cA" = ( -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/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, -/area/awaymission/moonoutpost19/syndicate) -"cC" = ( -/obj/machinery/mineral/processing_unit{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/railing/corner, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) +/area/awaymission/moonoutpost19/arrivals/shed) "cD" = ( /obj/structure/railing{ dir = 6 @@ -515,81 +360,70 @@ }, /turf/open/floor/iron/half, /area/awaymission/moonoutpost19/syndicate) -"cE" = ( -/obj/effect/decal/cleanable/dirt, +"cF" = ( +/obj/item/stack/tile/iron/base, +/obj/effect/decal/cleanable/crayon, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) +"cH" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/closet/l3closet/scientist, +/obj/structure/alien/weeds, /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - 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{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"cI" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/closet/secure_closet{ + icon_state = "science"; + name = "scientist's locker"; + req_access = "201" }, -/area/awaymission/moonoutpost19/syndicate) -"cM" = ( -/obj/item/storage/box/lights/mixed, +/obj/item/clothing/suit/toggle/labcoat, +/obj/item/tank/internals/oxygen, +/obj/item/clothing/mask/gas, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plating, -/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, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"cL" = ( /obj/structure/cable, -/turf/open/floor/plating, -/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" +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"cS" = ( +/mob/living/simple_animal/hostile/construct/proteon/hostile, +/obj/structure/flora/lunar_plant, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/effect/turf_decal/stripes/line, +/area/awaymission/moonoutpost19/mines) +"cT" = ( /obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) -"cP" = ( -/obj/machinery/portable_atmospherics/scrubber, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plating, -/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 - }, -/obj/effect/decal/cleanable/fuel_pool, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +/obj/effect/decal/cleanable/xenoblood, +/obj/effect/turf_decal/siding/thinplating_new/light, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"dd" = ( +/obj/structure/fluff/minepost, +/obj/item/stack/sheet/mineral/plasma/thirty, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, +/area/awaymission/moonoutpost19/mines) +"df" = ( +/obj/machinery/mineral/stacking_unit_console, +/turf/closed/wall, /area/awaymission/moonoutpost19/syndicate) -"cU" = ( -/obj/machinery/door/airlock{ - id_tag = "awaydorm5"; - name = "Dorm 2" +"dh" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/turf/open/floor/wood, -/area/awaymission/moonoutpost19/syndicate) -"cV" = ( +/area/awaymission/moonoutpost19/main) +"do" = ( /obj/structure/alien/weeds/node, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -599,199 +433,116 @@ 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; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"da" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ +"dr" = ( +/mob/living/simple_animal/hostile/construct/proteon/hostile, +/turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/syndicate) -"db" = ( -/turf/open/floor/wood, -/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 +/area/awaymission/moonoutpost19/mines) +"ds" = ( +/obj/item/pizzabox{ + pixel_x = 20; + pixel_y = -1 }, -/turf/open/floor/wood, -/area/awaymission/moonoutpost19/syndicate) -"de" = ( -/obj/machinery/mineral/stacking_machine{ - dir = 1; - input_dir = 1; - output_dir = 2 +/obj/effect/decal/cleanable/garbage, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/area/awaymission/moonoutpost19/main) +"dt" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 10 }, +/obj/effect/turf_decal/lunar_sand/plating, +/obj/structure/closet/crate/trashcart, /turf/open/floor/plating{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, -/area/awaymission/moonoutpost19/syndicate) -"df" = ( -/obj/machinery/mineral/stacking_unit_console, -/turf/closed/wall, -/area/awaymission/moonoutpost19/syndicate) -"dg" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/glass{ - amount = 10 - }, +/area/awaymission/moonoutpost19/main) +"dz" = ( /obj/structure/alien/weeds, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/iron{ - dir = 1; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"di" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/wood{ +/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/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/syndicate) -"dj" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/wood, -/area/awaymission/moonoutpost19/syndicate) -"dl" = ( +/area/awaymission/moonoutpost19/hive) +"dA" = ( +/turf/closed/mineral/random, +/area/awaymission/moonoutpost19/main) +"dF" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/loading_area, -/obj/structure/alien/weeds, /turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, -/area/awaymission/moonoutpost19/syndicate) -"dn" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 +/area/awaymission/moonoutpost19/arrivals) +"dL" = ( +/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/yellow/opposingcorners, /turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; 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/directional/south, -/turf/open/floor/wood{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/syndicate) -"dv" = ( -/obj/structure/rack, -/obj/item/stack/ducts/fifty, -/obj/item/weldingtool{ - pixel_x = 7 - }, -/obj/item/weldingtool{ - pixel_x = -7 - }, -/turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"dw" = ( -/obj/structure/tank_dispenser/oxygen{ - oxygentanks = 9 +"dM" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/glass/bottle/beer/almost_empty{ + pixel_x = -5; + pixel_y = 15 }, -/obj/machinery/light/small/broken/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/item/reagent_containers/cup/glass/colocup{ + pixel_x = -9 }, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +/obj/machinery/button/door{ + id = "awaymission19atvs"; + name = "Biohazard Shutter Control"; + pixel_y = 8; + req_access = "201" }, -/area/awaymission/moonoutpost19/syndicate) -"dx" = ( +/turf/open/floor/plastic, +/area/awaymission/moonoutpost19/arrivals/shed) +"dR" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/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{ +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, -/area/awaymission/moonoutpost19/syndicate) -"dA" = ( -/turf/closed/mineral/random, -/area/awaymission/moonoutpost19/main) -"dD" = ( -/obj/structure/rack, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +/area/awaymission/moonoutpost19/arrivals) +"dU" = ( +/obj/structure/fence/cut{ + dir = 4 }, -/area/awaymission/moonoutpost19/syndicate) -"dK" = ( -/obj/effect/decal/cleanable/blood/old, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/mines) -"dT" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/xenoblood, -/obj/effect/turf_decal/siding/thinplating_new/light, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"dW" = ( -/obj/structure/closet/secure_closet/personal/cabinet{ - req_access = "150" - }, -/obj/item/ammo_box/magazine/m9mm, -/obj/item/ammo_box/magazine/m9mm, -/obj/item/suppressor, +/area/awaymission/moonoutpost19/main) +"dV" = ( +/obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/syndicate) -"dX" = ( -/obj/structure/marker_beacon/burgundy, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"dY" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/area/awaymission/moonoutpost19/mines) +/obj/structure/cable, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) "dZ" = ( /turf/closed/wall/r_wall/rust, /area/awaymission/moonoutpost19/research) @@ -806,25 +557,13 @@ /obj/machinery/vending/snack, /turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/research) -"ee" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"eg" = ( -/obj/machinery/atmospherics/components/unary/portables_connector{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/canister, +"ef" = ( /obj/structure/alien/weeds, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"eh" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4 - }, -/turf/open/floor/iron/white/side{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, +/obj/structure/cable, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/research) "ei" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible{ @@ -834,14 +573,6 @@ /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, -/area/awaymission/moonoutpost19/research) "el" = ( /obj/structure/alien/weeds, /obj/structure/bed/nest, @@ -899,9 +630,6 @@ /obj/machinery/vending/coffee, /turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/research) -"eu" = ( -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) "ex" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w{ dir = 4 @@ -909,46 +637,34 @@ /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, -/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" +"eA" = ( +/obj/structure/flora/lunar_plant, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) +/area/awaymission/moonoutpost19/mines) "eB" = ( /obj/structure/alien/weeds/node, /turf/open/floor/engine, /area/awaymission/moonoutpost19/research) -"eE" = ( -/obj/structure/alien/weeds, -/obj/structure/flora/lunar_plant, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/hive) +"eD" = ( +/obj/structure/chair, +/obj/effect/decal/cleanable/generic, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) "eF" = ( /obj/structure/alien/weeds, /obj/structure/bed/nest, /turf/open/floor/engine, /area/awaymission/moonoutpost19/research) +"eG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) "eH" = ( /obj/structure/alien/weeds, /obj/structure/alien/egg/burst, @@ -960,95 +676,53 @@ "eJ" = ( /turf/closed/wall/rust, /area/awaymission/moonoutpost19/research) -"eK" = ( -/turf/open/floor/iron/white/side, -/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 - }, -/area/awaymission/moonoutpost19/research) -"eP" = ( -/obj/item/stack/sheet/mineral/wood, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/mines) +"eL" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/structure/cable, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) "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, -/area/awaymission/moonoutpost19/research) -"eU" = ( -/obj/machinery/space_heater, -/obj/machinery/light/small/directional/north, -/obj/structure/sign/poster/official/build/directional/north, +"eR" = ( +/obj/machinery/light/small/broken/directional/east, +/obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/research) -"eW" = ( -/obj/machinery/power/smes{ - charge = 1.5e+006; - input_level = 10000; - inputting = 0; - output_level = 15000 +"eT" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"eY" = ( -/obj/item/newspaper, -/obj/structure/cable, -/turf/open/floor/plating, -/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" +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"fe" = ( +/area/awaymission/moonoutpost19/arrivals) +"fb" = ( /obj/effect/turf_decal/stripes/asteroid/line, -/obj/structure/lattice/catwalk, /obj/effect/turf_decal/lunar_sand/plating, /turf/open/floor/plating{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/main) -"ff" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"fh" = ( -/obj/machinery/firealarm/directional/north, -/obj/structure/table, -/obj/item/storage/box/beakers{ - pixel_x = 2; - pixel_y = 2 +"fc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/item/storage/box/syringes, -/obj/structure/alien/weeds, -/turf/open/floor/iron, +/turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) +"fi" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "line" + }, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) "fk" = ( /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) @@ -1057,14 +731,16 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"fm" = ( -/obj/structure/closet/l3closet/scientist, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/stripes/line{ +"fo" = ( +/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, +/turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) "fp" = ( /obj/structure/alien/weeds, @@ -1072,40 +748,27 @@ /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, -/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" +"fs" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 6 }, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/tile/purple{ - dir = 8 +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"fy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"fz" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"fA" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/area/awaymission/moonoutpost19/main) +"fw" = ( +/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 }, -/obj/structure/cable, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) +/area/awaymission/moonoutpost19/arrivals) "fB" = ( /obj/structure/alien/weeds/node, /obj/structure/cable, @@ -1168,6 +831,22 @@ /obj/structure/alien/resin/wall, /turf/open/floor/engine, /area/awaymission/moonoutpost19/research) +"fI" = ( +/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; + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/syndicate) "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."; @@ -1187,29 +866,19 @@ /turf/open/floor/engine, /area/awaymission/moonoutpost19/research) "fL" = ( -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"fM" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/item/cigbutt{ + pixel_x = -6 + }, /obj/item/cigbutt, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"fN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/turf/open/floor/plastic, +/area/awaymission/moonoutpost19/arrivals/shed) +"fP" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"fQ" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"fS" = ( -/obj/structure/filingcabinet, -/obj/item/paper/fluff/awaymissions/moonoutpost19/log/kenneth, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, +/turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) "fU" = ( /obj/machinery/light/small/directional/east, @@ -1218,44 +887,12 @@ /obj/effect/mapping_helpers/airalarm/all_access, /turf/open/floor/carpet/orange, /area/awaymission/moonoutpost19/arrivals) -"fV" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"fW" = ( +"fY" = ( /obj/structure/alien/weeds, -/obj/effect/turf_decal/tile/purple{ - dir = 8 +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/turf/open/floor/iron/white, -/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, -/area/awaymission/moonoutpost19/research) -"ga" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/closet/l3closet/scientist, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/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, -/area/awaymission/moonoutpost19/research) +/area/awaymission/moonoutpost19/hive) "gc" = ( /obj/structure/alien/weeds, /obj/effect/decal/cleanable/blood, @@ -1265,100 +902,38 @@ }, /turf/open/floor/engine, /area/awaymission/moonoutpost19/research) -"gf" = ( -/obj/structure/chair/stool/directional/south, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"gi" = ( -/obj/structure/reagent_dispensers/wall/peppertank/directional/west, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"gj" = ( -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/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, -/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, -/area/awaymission/moonoutpost19/research) -"go" = ( -/obj/structure/alien/weeds/node, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"gp" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/white, -/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, -/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 +"ge" = ( +/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, /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" +"gg" = ( +/obj/effect/turf_decal/stripes/asteroid/line, +/obj/structure/lattice/catwalk, +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/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" +/area/awaymission/moonoutpost19/main) +"gk" = ( +/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/spawner/structure/window/reinforced, +/obj/effect/turf_decal/stripes/line, /obj/structure/cable, /turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) +/area/awaymission/moonoutpost19/syndicate) +"gm" = ( +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) "gu" = ( /obj/structure/disposalpipe/segment{ desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; @@ -1378,54 +953,20 @@ /obj/structure/alien/weeds, /turf/open/floor/engine, /area/awaymission/moonoutpost19/research) -"gz" = ( -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"gA" = ( -/obj/machinery/computer/monitor{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"gC" = ( -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"gD" = ( -/obj/item/stack/rods, -/obj/item/shard{ - icon_state = "small" - }, +"gG" = ( /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/half/contrasted{ - dir = 4 + icon_state = "ltrails_2" }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"gE" = ( -/obj/structure/grille/broken, -/obj/item/stack/rods, -/obj/item/stack/rods, -/obj/item/shard, -/turf/open/floor/plating, -/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/machinery/camera/directional/west{ + c_tag = "Dormitories"; + network = list("mo19") }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) +/area/awaymission/moonoutpost19/arrivals) "gI" = ( /obj/structure/table, /obj/item/surgical_drapes, @@ -1444,30 +985,6 @@ /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, -/area/awaymission/moonoutpost19/research) -"gL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) "gM" = ( /obj/structure/disposalpipe/segment{ desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; @@ -1476,42 +993,16 @@ /obj/structure/alien/weeds, /turf/open/floor/engine, /area/awaymission/moonoutpost19/research) -"gP" = ( -/obj/structure/chair/office, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"gR" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"gT" = ( -/obj/structure/table/optable, -/obj/structure/alien/weeds, -/turf/open/floor/iron/white/side{ - dir = 1 - }, -/area/awaymission/moonoutpost19/research) -"gU" = ( -/obj/machinery/computer/operating{ - dir = 8 - }, -/obj/structure/alien/weeds, -/turf/open/floor/iron/white/side{ - dir = 1 - }, -/area/awaymission/moonoutpost19/research) -"gV" = ( -/obj/structure/table, -/obj/item/clothing/gloves/latex, -/obj/item/clothing/mask/surgical, -/obj/item/clothing/suit/apron/surgical, -/obj/structure/alien/weeds, -/turf/open/floor/iron/white/side{ - dir = 1 +"gN" = ( +/obj/effect/turf_decal/tile/red, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"gO" = ( +/obj/machinery/light/small/directional/north, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/research) +/area/awaymission/moonoutpost19/arrivals) "gW" = ( /obj/structure/filingcabinet/filingcabinet, /obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_hivemind, @@ -1549,485 +1040,441 @@ }, /turf/open/floor/engine, /area/awaymission/moonoutpost19/research) -"hd" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"he" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"hf" = ( -/obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/sentinel, +"hl" = ( +/obj/item/stack/ore/slag, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/hive) -"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/anticorner/contrasted{ - dir = 8 +/area/awaymission/moonoutpost19/mines) +"hm" = ( +/obj/effect/decal/cleanable/xenoblood/xgibs, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 }, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"hh" = ( -/obj/structure/table, -/obj/item/folder/red, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"hi" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 +/area/awaymission/moonoutpost19/arrivals) +"hq" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 }, -/obj/item/pen, -/obj/effect/turf_decal/tile/red/anticorner/contrasted, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"hk" = ( -/obj/item/stack/ore/iron, -/obj/effect/decal/cleanable/blood/drip, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/effect/turf_decal/tile/red{ + dir = 4 }, -/area/awaymission/moonoutpost19/mines) -"hn" = ( -/obj/structure/closet/crate/bin, -/obj/item/clothing/gloves/latex, -/obj/item/trash/chips, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/broken/directional/north, -/turf/open/floor/iron/white/side, -/area/awaymission/moonoutpost19/research) -"ho" = ( -/obj/structure/table, -/obj/item/storage/box/gloves, -/turf/open/floor/iron/white/corner{ +/obj/effect/turf_decal/tile/red{ dir = 8 }, -/area/awaymission/moonoutpost19/research) +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) "hr" = ( -/obj/item/cigbutt, +/obj/structure/reagent_dispensers/fueltank/large, +/turf/open/floor/plastic, +/area/awaymission/moonoutpost19/arrivals/shed) +"ht" = ( +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"hB" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/structure/table/wood, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"hu" = ( -/obj/machinery/door/poddoor{ - id = "AwayRD"; - layer = 2.9; - name = "Privacy Shutter" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"hv" = ( -/obj/effect/turf_decal/tile/purple{ +/area/awaymission/moonoutpost19/syndicate) +"hC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"hw" = ( -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, -/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, -/area/awaymission/moonoutpost19/research) -"hy" = ( -/obj/item/stack/rods, -/obj/item/shard{ - icon_state = "small" - }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"hz" = ( -/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."; - pixel_x = 5 - }, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/arrivals) -"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 +/obj/item/stack/sheet/mineral/plasma/five, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"hF" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) +/area/awaymission/moonoutpost19/syndicate) "hI" = ( /turf/closed/wall/rust, /area/awaymission/moonoutpost19/arrivals) "hJ" = ( /turf/closed/wall, /area/awaymission/moonoutpost19/arrivals) -"hL" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/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" +"hM" = ( +/obj/machinery/door/airlock{ + id_tag = "awaydorm5"; + name = "Dorm 2" }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"hP" = ( -/obj/structure/toilet{ +/turf/open/floor/wood, +/area/awaymission/moonoutpost19/syndicate) +"hO" = ( +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"hR" = ( +/obj/item/flashlight/lantern{ + icon_state = "lantern-on" + }, +/obj/effect/decal/cleanable/blood/tracks{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/arrivals) -"hQ" = ( -/obj/machinery/door/airlock{ - name = "Unit 2" +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/arrivals) -"hV" = ( -/obj/structure/chair/comfy/black{ - dir = 8 +/area/awaymission/moonoutpost19/main) +"hT" = ( +/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/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 1 +/area/awaymission/moonoutpost19/hive) +"hX" = ( +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon/burgundy, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"ie" = ( +/area/awaymission/moonoutpost19/main) +"hY" = ( +/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/burnt_floor, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/syndicate) +"ib" = ( +/obj/item/stack/sheet/mineral/wood, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/mines) -"if" = ( -/obj/structure/closet/l3closet, +/area/awaymission/moonoutpost19/main) +"ij" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ +/obj/machinery/door/firedoor/closed, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"ik" = ( +/obj/effect/turf_decal/tile/purple{ dir = 1 }, +/turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"ig" = ( -/obj/structure/closet/l3closet, -/obj/machinery/light/small/broken/directional/south, -/turf/open/floor/iron/white/side{ - dir = 1 +"il" = ( +/obj/machinery/newscaster{ + pixel_x = -30 }, -/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 +/obj/item/chair{ + pixel_x = 5; + pixel_y = 5 }, -/area/awaymission/moonoutpost19/research) -"ii" = ( -/obj/structure/table, -/turf/open/floor/iron/white/corner{ - dir = 1 +/obj/item/kirbyplants{ + desc = "A plastic potted plant."; + pixel_y = 3 + }, +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 }, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/research) -"im" = ( -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/arrivals) "io" = ( -/obj/effect/spawner/structure/window/reinforced, +/obj/structure/rack, +/obj/item/stack/ducts/fifty, +/obj/item/weldingtool{ + pixel_x = 7 + }, +/obj/item/weldingtool{ + pixel_x = -7 + }, /turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"iv" = ( -/obj/structure/closet/firecloset, +/area/awaymission/moonoutpost19/arrivals/shed) +"ir" = ( +/obj/structure/alien/weeds/node, /obj/effect/turf_decal/stripes/line{ - dir = 5 + dir = 1 }, /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"iw" = ( -/obj/structure/toilet{ +"is" = ( +/obj/structure/fence/post{ dir = 4 }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/arrivals) -"ix" = ( -/obj/machinery/door/airlock{ - name = "Unit 1" +/obj/structure/sign/warning, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/arrivals) -"iE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/turf_decal/siding/thinplating_new/light/corner, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"iG" = ( -/obj/machinery/door/airlock{ - name = "Private Restroom" +/area/awaymission/moonoutpost19/main) +"iu" = ( +/obj/machinery/door/airlock/medical{ + name = "Research Division"; + req_access = "201" }, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/research) -"iO" = ( -/obj/structure/closet/emcloset, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 6 +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 }, /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"iU" = ( -/obj/machinery/vending/boozeomat, -/turf/open/floor/iron/cafeteria{ - dir = 5 +"iA" = ( +/obj/item/toy/crayon/white{ + pixel_y = 13 }, -/area/awaymission/moonoutpost19/arrivals) -"iX" = ( -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/item/toy/crayon/white, +/obj/item/toy/crayon/white{ + pixel_y = 4 }, -/area/awaymission/moonoutpost19/arrivals) -"iY" = ( +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) +"iB" = ( /obj/structure/table, -/obj/machinery/reagentgrinder, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/pen, +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"iD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 10 }, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"iZ" = ( -/obj/structure/toilet{ - dir = 1 +"iJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) +"iK" = ( +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/research) -"ja" = ( -/obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"jj" = ( +"iM" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"iQ" = ( +/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 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"iR" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/resin/wall, /obj/structure/alien/weeds, -/obj/structure/flora/lunar_plant, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/mines) -"jm" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/reagent_containers/condiment/peppermill{ - pixel_x = 3 +/area/awaymission/moonoutpost19/hive) +"iU" = ( +/obj/machinery/vending/boozeomat, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/obj/item/reagent_containers/condiment/saltshaker{ - pixel_x = -3 +/area/awaymission/moonoutpost19/arrivals) +"iW" = ( +/obj/machinery/airalarm/directional/north{ + req_access = "150" }, -/obj/machinery/door/poddoor/shutters{ - id = "awaykitchen"; - name = "Serving Hatch" +/obj/effect/mapping_helpers/airalarm/unlocked, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/turf/open/floor/carpet, -/area/awaymission/moonoutpost19/arrivals) -"jn" = ( -/obj/effect/decal/cleanable/food/flour, +/area/awaymission/moonoutpost19/syndicate) +"iX" = ( /turf/open/floor/iron/cafeteria{ dir = 5 }, /area/awaymission/moonoutpost19/arrivals) -"jo" = ( -/obj/machinery/firealarm/directional/east, +"iY" = ( /obj/structure/table, -/obj/effect/decal/cleanable/dirt, +/obj/machinery/reagentgrinder, /turf/open/floor/iron/cafeteria{ dir = 5 }, /area/awaymission/moonoutpost19/arrivals) -"jr" = ( -/obj/structure/chair, +"jb" = ( +/obj/machinery/door/airlock/engineering{ + name = "Power Maintenance"; + req_access = "150" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"je" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"js" = ( -/obj/structure/chair, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/iron, +/obj/machinery/duct, +/turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"jt" = ( -/obj/structure/table, -/obj/item/newspaper, +"jh" = ( +/obj/machinery/portable_atmospherics/canister/air, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, +/obj/structure/window/spawner/directional/north, +/turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"ju" = ( -/obj/structure/chair, -/turf/open/floor/iron, +"jn" = ( +/obj/effect/decal/cleanable/food/flour, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, /area/awaymission/moonoutpost19/arrivals) -"jy" = ( +"jo" = ( +/obj/machinery/firealarm/directional/east, +/obj/structure/table, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 1 +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"jB" = ( -/obj/structure/grille, -/turf/open/floor/plating{ +"jp" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/arrivals) -"jC" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating{ +/area/awaymission/moonoutpost19/mines) +"jx" = ( +/obj/structure/flora/rock/style_random, +/turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/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 - }, -/area/awaymission/moonoutpost19/research) -"jF" = ( +/area/awaymission/moonoutpost19/main) +"jD" = ( +/obj/machinery/space_heater, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"jG" = ( -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"jM" = ( -/obj/effect/spawner/structure/window, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"jO" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters{ - id = "awaykitchen"; - name = "Serving Hatch" +/area/awaymission/moonoutpost19/syndicate) +"jH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/turf/open/floor/carpet, -/area/awaymission/moonoutpost19/arrivals) -"jR" = ( -/obj/machinery/vending/dinnerware, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/area/awaymission/moonoutpost19/arrivals) -"jT" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"jU" = ( +/area/awaymission/moonoutpost19/syndicate) +"jJ" = ( /obj/structure/cable, +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 8 + }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"jV" = ( +"jN" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/white/corner, /area/awaymission/moonoutpost19/arrivals) -"jX" = ( +"jP" = ( /obj/item/cigbutt, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"jQ" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"kb" = ( -/obj/machinery/door/firedoor/closed, -/obj/structure/cable, -/turf/open/floor/iron, +/obj/effect/decal/cleanable/generic, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"jR" = ( +/obj/machinery/vending/dinnerware, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, /area/awaymission/moonoutpost19/arrivals) -"ke" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +"jS" = ( +/obj/structure/grille, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/arrivals) -"kf" = ( +"jZ" = ( /obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron{ +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 6 + }, +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"kl" = ( +"kd" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/stack/ore/glass{ - pixel_x = -6; - pixel_y = 10 - }, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"km" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Diner" +/area/awaymission/moonoutpost19/research) +"ki" = ( +/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/iron, +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"kn" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/reagent_containers/cup/rag{ - pixel_y = 5 +"kj" = ( +/obj/structure/alien/weeds, +/obj/structure/flora/lunar_plant, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/machinery/door/poddoor/shutters{ - id = "awaykitchen"; - name = "Serving Hatch" +/area/awaymission/moonoutpost19/hive) +"kk" = ( +/obj/structure/alien/weeds/node, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 }, -/turf/open/floor/carpet, -/area/awaymission/moonoutpost19/arrivals) +/obj/structure/sign/warning/biohazard/directional/north, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/syndicate) "ko" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/cafeteria{ dir = 5 }, /area/awaymission/moonoutpost19/arrivals) +"kp" = ( +/obj/item/reagent_containers/cup/glass/bottle/beer{ + desc = "Someone's last meal. He went out with a bang."; + pixel_x = 16; + pixel_y = -10 + }, +/obj/effect/decal/remains/human{ + desc = "...the pilot wasn't as lucky as the flag." + }, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) "kq" = ( /obj/structure/table, /obj/item/book/manual/chef_recipes{ @@ -2045,73 +1492,61 @@ dir = 5 }, /area/awaymission/moonoutpost19/arrivals) -"ku" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 +"ks" = ( +/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/white/corner, -/area/awaymission/moonoutpost19/arrivals) -"kv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) +"kC" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = 11 }, -/turf/open/floor/iron/white/corner, +/obj/structure/urinal/directional/north, +/obj/structure/mirror/directional/east, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/freezer, /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 +"kD" = ( +/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 }, -/turf/open/floor/iron/white/corner, -/area/awaymission/moonoutpost19/arrivals) -"kx" = ( -/obj/structure/sign/poster/official/nanotrasen_logo/directional/south, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/area/awaymission/moonoutpost19/research) +"kH" = ( +/obj/machinery/door/firedoor, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/floor/iron/white/corner, -/area/awaymission/moonoutpost19/arrivals) -"ky" = ( -/turf/open/floor/iron/white/corner{ +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"kI" = ( +/obj/structure/chair/comfy/black{ dir = 8 }, -/area/awaymission/moonoutpost19/arrivals) -"kz" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"kA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor/closed, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"kE" = ( -/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"kF" = ( -/obj/structure/cable, -/obj/effect/turf_decal/lunar_sand, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"kG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +"kL" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, /turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, -/area/awaymission/moonoutpost19/arrivals) +/area/awaymission/moonoutpost19/syndicate) "kM" = ( /obj/structure/closet/crate/bin, /obj/item/plate, @@ -2121,27 +1556,23 @@ }, /area/awaymission/moonoutpost19/arrivals) "kN" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white/corner{ - dir = 1 +/obj/machinery/light/warm/no_nightlight/directional/west, +/obj/item/cigbutt{ + pixel_x = 4 }, +/turf/open/floor/plastic, +/area/awaymission/moonoutpost19/arrivals/shed) +"kP" = ( +/obj/machinery/vending/cigarette, +/obj/structure/sign/poster/contraband/smoke/directional/south, +/turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/arrivals) -"kO" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"kR" = ( -/obj/machinery/door/firedoor/closed, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"kV" = ( -/obj/machinery/door/airlock/maintenance, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) +"kX" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) "kZ" = ( /obj/machinery/light/small/directional/east, /obj/machinery/airalarm/directional/east, @@ -2164,107 +1595,192 @@ "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 +"le" = ( +/obj/structure/alien/weeds, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 }, -/area/awaymission/moonoutpost19/arrivals) -"lh" = ( -/obj/structure/chair{ +/obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"lm" = ( +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/syndicate) +"lg" = ( +/obj/effect/mapping_helpers/airlock/locked, /obj/machinery/door/airlock{ - id_tag = "awaydorm1"; - name = "Dorm 1" + id_tag = "awaydorm3"; + name = "Dorm 3" }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"lv" = ( -/turf/open/floor/iron/showroomfloor{ - temperature = 273.15 +"lj" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/area/awaymission/moonoutpost19/arrivals) -"lD" = ( -/obj/machinery/power/shuttle_engine/heater{ +/area/awaymission/moonoutpost19/syndicate) +"lk" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/plating{ +/obj/structure/cable, +/turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, -/area/awaymission/moonoutpost19/arrivals) -"lF" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/area/awaymission/moonoutpost19/syndicate) +"ln" = ( +/obj/structure/cable, +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon/burgundy, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"lH" = ( -/obj/structure/table, -/obj/item/storage/fancy/cigarettes/dromedaryco, -/obj/effect/turf_decal/stripes/line{ - dir = 6 +/area/awaymission/moonoutpost19/main) +"lp" = ( +/obj/effect/decal/cleanable/xenoblood/xsplatter, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) +"lq" = ( +/obj/structure/alien/weeds/node, +/obj/effect/decal/cleanable/blood, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) +"lu" = ( +/obj/structure/chair/comfy/black, +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"lI" = ( -/obj/effect/turf_decal/tile/neutral{ +"ly" = ( +/obj/structure/alien/resin/wall, +/obj/structure/alien/weeds, +/obj/structure/alien/weeds, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/mines) +"lz" = ( +/obj/machinery/computer/operating{ dir = 8 }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +/obj/structure/alien/weeds, +/turf/open/floor/iron/white/side{ + dir = 1 + }, +/area/awaymission/moonoutpost19/research) +"lA" = ( +/obj/item/stack/rods{ + pixel_x = 3 + }, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) +"lB" = ( +/obj/item/storage/bag/ore, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) +"lC" = ( +/obj/machinery/door/airlock/external/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 }, +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"lJ" = ( -/obj/effect/turf_decal/tile/neutral{ +"lD" = ( +/obj/machinery/power/shuttle_engine/heater{ dir = 4 }, -/turf/open/floor/iron{ +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/plating{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"lM" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"lO" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plating, -/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, +"lG" = ( +/obj/structure/cable, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"lT" = ( -/obj/structure/table, +"lK" = ( +/obj/machinery/light/small/directional/west, /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/structure/sign/poster/contraband/space_cube/directional/west, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 }, -/obj/item/gun/ballistic/shotgun/sc_pump, -/turf/open/floor/iron/showroomfloor{ - temperature = 273.15 +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) +"lL" = ( +/obj/structure/chair/stool/directional/south, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"lN" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 1 + }, +/turf/open/floor/plastic, +/area/awaymission/moonoutpost19/arrivals/shed) +"lP" = ( +/obj/structure/closet/crate/bin, +/obj/item/clothing/gloves/latex, +/obj/item/trash/chips, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/broken/directional/north, +/turf/open/floor/iron/white/side, +/area/awaymission/moonoutpost19/research) +"lQ" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/turf_decal/stripes/line{ + dir = 6 }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"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) +"lV" = ( +/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{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/syndicate) "lW" = ( /obj/structure/table, /obj/item/storage/lockbox, @@ -2304,24 +1820,53 @@ /obj/structure/closet/emcloset, /turf/open/floor/mineral/titanium/blue, /area/awaymission/moonoutpost19/arrivals) -"mh" = ( -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +"mf" = ( +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 4 }, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"mi" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/effect/decal/cleanable/dirt, -/obj/structure/window/spawner/directional/north, -/turf/open/floor/plating, +"mj" = ( +/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, /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/effect/turf_decal/stripes/asteroid/line{ + dir = 10 + }, +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/main) +"mn" = ( +/obj/structure/noticeboard/directional/north, +/obj/item/paper/fluff/awaymissions/moonoutpost19/food_specials, +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"mo" = ( +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/mines) "mp" = ( /obj/structure/table, /obj/item/storage/box/donkpockets, @@ -2353,33 +1898,6 @@ /obj/structure/window/reinforced/spawner/directional/north, /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, -/area/awaymission/moonoutpost19/arrivals) -"mA" = ( -/obj/structure/closet/emcloset, -/obj/structure/window/spawner/directional/south, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"mB" = ( -/obj/machinery/door/airlock/external/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/turf_decal/lunar_sand, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"mC" = ( -/obj/machinery/vending/cigarette, -/obj/structure/sign/poster/contraband/smoke/directional/south, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/arrivals) "mD" = ( /obj/machinery/light/small/directional/west, /obj/structure/chair/comfy/beige, @@ -2436,52 +1954,21 @@ }, /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, -/area/awaymission/moonoutpost19/arrivals) -"mM" = ( -/obj/machinery/door/airlock/external/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/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{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"mR" = ( -/obj/machinery/door/airlock{ - id_tag = "awaydorm2"; - name = "Dorm 2" +"mO" = ( +/obj/structure/alien/weeds, +/obj/structure/fluff/minepost, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_1" +/area/awaymission/moonoutpost19/mines) +"mS" = ( +/obj/structure/chair/stool/directional/west, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 }, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"mU" = ( -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) +/area/awaymission/moonoutpost19/syndicate) "mV" = ( /obj/structure/table, /obj/item/clipboard, @@ -2493,23 +1980,46 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/mineral/titanium/yellow, /area/awaymission/moonoutpost19/arrivals) -"mX" = ( -/obj/effect/mapping_helpers/burnt_floor, -/obj/effect/decal/cleanable/blood/gibs, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/mines) "mY" = ( /obj/machinery/light/small/directional/east, /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/mineral/titanium/yellow, /area/awaymission/moonoutpost19/arrivals) -"nc" = ( -/obj/machinery/space_heater, -/obj/effect/decal/cleanable/generic, -/obj/structure/window/spawner/directional/south, -/turf/open/floor/plating, +"mZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/item/chair{ + dir = 4; + pixel_x = -4; + pixel_y = 2 + }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"na" = ( +/obj/structure/table, +/obj/item/storage/fancy/cigarettes/dromedaryco, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"ne" = ( +/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 + }, +/obj/structure/cable, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) "nf" = ( /obj/structure/filingcabinet, @@ -2527,69 +2037,127 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/mineral/titanium/blue, /area/awaymission/moonoutpost19/arrivals) -"nl" = ( +"nk" = ( +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"nn" = ( /obj/item/cigbutt, /turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"no" = ( +"np" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"nq" = ( +/obj/structure/filingcabinet, +/obj/item/paper/fluff/awaymissions/moonoutpost19/log/kenneth, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 }, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"nC" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/asteroid/corner, -/obj/effect/turf_decal/stripes/asteroid/corner{ - dir = 8 +/area/awaymission/moonoutpost19/research) +"ns" = ( +/obj/structure/rack, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 6 }, -/obj/effect/turf_decal/lunar_sand/plating, /turf/open/floor/plating{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, -/area/awaymission/moonoutpost19/main) -"nO" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock{ - id_tag = "awaydorm3"; - name = "Dorm 3" +/area/awaymission/moonoutpost19/syndicate) +"nw" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/resin/wall, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/mines) +"nx" = ( +/obj/structure/alien/weeds, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"ny" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, +/area/awaymission/moonoutpost19/syndicate) +"nz" = ( +/obj/structure/alien/weeds, +/mob/living/simple_animal/hostile/alien/sentinel, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) +"nE" = ( +/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" }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"nQ" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"nR" = ( -/obj/structure/closet, -/obj/item/storage/box/lights/mixed, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"nV" = ( -/obj/structure/disposalpipe/segment, /obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, /turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"nY" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/generic, -/obj/effect/turf_decal/tile/neutral, +/area/awaymission/moonoutpost19/research) +"nJ" = ( +/obj/item/shard{ + icon_state = "small" + }, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) +"nL" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/item/screwdriver{ + pixel_x = 9; + pixel_y = 10 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"nN" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"ok" = ( -/obj/structure/fluff/tram_rail/end{ - dir = 8 - }, +"nS" = ( +/obj/machinery/door/airlock/maintenance, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"od" = ( +/obj/effect/decal/cleanable/xenoblood/xgibs/larva/body, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) +"of" = ( +/obj/machinery/vending/snack, +/obj/structure/sign/poster/contraband/eat/directional/north, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"ol" = ( +/obj/machinery/door/airlock{ + name = "Unisex Showers" + }, +/obj/machinery/duct, +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/arrivals) "on" = ( /obj/structure/table/reinforced, /obj/structure/window/reinforced/spawner/directional/west, @@ -2612,27 +2180,65 @@ dir = 5 }, /area/awaymission/moonoutpost19/research) +"oo" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/item/stack/ore/glass/basalt{ + pixel_x = -2; + pixel_y = 3 + }, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) "op" = ( /obj/structure/cable, /turf/open/floor/plating, /area/awaymission/moonoutpost19/research) -"ov" = ( -/obj/structure/lattice/catwalk, -/obj/item/storage/toolbox/mechanical, -/obj/structure/rack, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"oq" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/area/awaymission/moonoutpost19/mines) -"ow" = ( -/obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/drone{ - plants_off = 1 +/turf/open/floor/iron/white/corner, +/area/awaymission/moonoutpost19/arrivals) +"os" = ( +/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, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"ot" = ( +/obj/machinery/door/airlock{ + name = "Private Restroom" + }, +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/research) +"ou" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, +/area/awaymission/moonoutpost19/arrivals) +"ox" = ( +/obj/structure/alien/resin/wall, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/hive) +/area/awaymission/moonoutpost19/mines) "oA" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/purple{ @@ -2649,149 +2255,141 @@ /obj/item/stack/ore/iron, /turf/open/misc/asteroid/moon/dug, /area/awaymission/moonoutpost19/mines) -"oD" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 10 - }, -/obj/effect/turf_decal/lunar_sand/plating, -/obj/structure/closet/crate/trashcart, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/main) -"oE" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/structure/mirror/directional/east{ - icon_state = "mirror_broke" - }, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/arrivals) -"oG" = ( -/obj/structure/cable, -/obj/structure/fluff/tram_rail/floor, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"oJ" = ( -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/structure/cable, +"oN" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/closet/toolcloset, +/obj/item/clothing/gloves/color/yellow, +/obj/effect/mapping_helpers/broken_floor, +/obj/item/clothing/under/rank/engineering/atmospheric_technician, /turf/open/floor/plating, /area/awaymission/moonoutpost19/research) -"oL" = ( +"oV" = ( +/obj/machinery/firealarm/directional/east, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/sand, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"oM" = ( -/obj/item/toy/crayon/white{ - pixel_y = 13 - }, -/obj/item/toy/crayon/white, -/obj/item/toy/crayon/white{ - pixel_y = 4 - }, +"oY" = ( +/obj/structure/fluff/meteor/large, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"oO" = ( -/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 +"pc" = ( +/obj/machinery/door/airlock{ + id_tag = "awaydorm1"; + name = "Dorm 1" }, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"oW" = ( -/obj/machinery/door/poddoor/shutters{ - id = "awaymission19atvs" - }, +/area/awaymission/moonoutpost19/arrivals) +"pf" = ( +/obj/structure/closet, +/obj/item/storage/box/lights/mixed, /turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"oX" = ( -/obj/effect/decal/cleanable/blood/tracks{ +"pg" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/asteroid/line{ dir = 4 }, -/obj/item/stack/ore/glass/basalt{ - pixel_x = -2; - pixel_y = 3 +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/main) +"pj" = ( +/obj/item/stack/ore/iron{ + pixel_x = -7; + pixel_y = -4 }, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"oZ" = ( -/obj/structure/cable, -/turf/open/floor/plating{ +"pm" = ( +/obj/structure/lattice/catwalk, +/obj/item/storage/toolbox/mechanical, +/obj/structure/rack, +/turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/arrivals) -"pd" = ( -/obj/structure/chair{ +/area/awaymission/moonoutpost19/mines) +"px" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ +/turf/open/floor/iron/white/corner{ dir = 1 }, -/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"pk" = ( -/obj/item/clothing/head/soft, +"pA" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/syndicate) +"pB" = ( +/obj/item/toy/seashell{ + pixel_x = 5; + pixel_y = 6 + }, +/obj/item/toy/seashell{ + pixel_x = -9; + pixel_y = 6 + }, +/obj/item/toy/seashell, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"ps" = ( -/obj/machinery/firealarm/directional/south, +"pE" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/thinplating_new/light, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"pu" = ( -/obj/structure/chair/comfy/black{ - dir = 8 +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ +/area/awaymission/moonoutpost19/syndicate) +"pF" = ( +/obj/machinery/light/small/directional/north, +/obj/structure/window/reinforced/spawner/directional/east{ + layer = 2.9 + }, +/obj/structure/table, +/obj/structure/bedsheetbin, +/obj/item/clothing/neck/tie/black, +/obj/item/clothing/under/costume/buttondown/slacks/service, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron{ +/turf/open/floor/iron/cafeteria{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"pv" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/item/extinguisher{ - pixel_x = 7 - }, -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 1 - }, -/obj/effect/mapping_helpers/broken_floor, +"pH" = ( +/obj/structure/table, +/obj/item/folder/red, +/obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"pJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/area/awaymission/moonoutpost19/research) +"pL" = ( +/obj/machinery/firealarm/directional/north, +/obj/structure/table, +/obj/item/storage/box/beakers{ + pixel_x = 2; + pixel_y = 2 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) +/obj/item/storage/box/syringes, +/obj/structure/alien/weeds, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) "pM" = ( /obj/machinery/power/port_gen/pacman/super{ name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator" @@ -2799,20 +2397,70 @@ /obj/structure/cable, /turf/open/floor/plating, /area/awaymission/moonoutpost19/research) -"pO" = ( -/obj/structure/lattice/catwalk, -/obj/structure/tank_holder/extinguisher, +"pP" = ( +/obj/machinery/door/airlock{ + name = "Unit 2" + }, +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/arrivals) +"pS" = ( +/obj/structure/alien/weeds, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/main) -"pQ" = ( -/obj/item/cigbutt, +/area/awaymission/moonoutpost19/mines) +"pT" = ( +/obj/item/plate, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/table/wood, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"pV" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/arrivals) +"pX" = ( +/obj/structure/chair, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"pY" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, +/obj/item/chair/stool{ + dir = 1; + pixel_x = -6; + pixel_y = -4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, /turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"pZ" = ( +/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{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, /area/awaymission/moonoutpost19/syndicate) "qa" = ( /obj/machinery/computer/security/telescreen/entertainment/directional/north, @@ -2824,57 +2472,109 @@ }, /turf/open/floor/carpet, /area/awaymission/moonoutpost19/arrivals) -"qb" = ( -/obj/machinery/door/firedoor/closed, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +"qg" = ( +/obj/effect/decal/cleanable/generic, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 10 }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/duct, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"qn" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 +"qh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"qi" = ( +/obj/machinery/shower{ + pixel_y = 16 }, -/obj/effect/turf_decal/tile/red{ - dir = 8 +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/arrivals) +"qj" = ( +/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{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +/obj/item/mining_scanner, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 }, -/area/awaymission/moonoutpost19/syndicate) -"qs" = ( -/obj/item/stack/sheet/mineral/wood, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"qt" = ( -/obj/machinery/door/airlock/maintenance{ - req_access = "201" +"qm" = ( +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"qx" = ( +/obj/machinery/light/small/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/item/extinguisher{ + pixel_x = 7 }, -/obj/machinery/duct, -/turf/open/floor/plating, +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 1 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"qE" = ( -/obj/item/pizzabox{ - pixel_x = 20; - pixel_y = -1 +"qy" = ( +/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/effect/decal/cleanable/garbage, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/item/stack/rods, +/obj/item/stack/cable_coil{ + amount = 5 }, -/area/awaymission/moonoutpost19/main) -"qF" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ +/obj/item/shard{ + icon_state = "small"; + pixel_x = -9; + pixel_y = 6 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"qz" = ( +/obj/structure/closet/l3closet, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white/side{ dir = 1 }, +/area/awaymission/moonoutpost19/research) +"qA" = ( +/obj/structure/alien/weeds, +/obj/structure/bed/nest, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) +"qI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/turf_decal/siding/thinplating_new/light/corner, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) +"qJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/trash/candy, +/obj/machinery/duct, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"qK" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/arrivals) "qM" = ( /obj/structure/closet/secure_closet{ icon_state = "rd"; @@ -2893,60 +2593,53 @@ dir = 5 }, /area/awaymission/moonoutpost19/research) -"qQ" = ( -/obj/structure/table, -/obj/item/toy/cards/deck, +"qN" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, /turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"qT" = ( -/obj/effect/mapping_helpers/burnt_floor, -/obj/effect/decal/cleanable/blood/old, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/mines) -"qW" = ( -/obj/structure/sign/departments/science{ - pixel_y = 32 +"qO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"qP" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/anticorner{ +/obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 1 }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) "qY" = ( -/obj/item/soap/nanotrasen{ - pixel_x = -3; - pixel_y = 9 +/obj/structure/closet/mini_fridge/grimy, +/obj/item/food/pizzaslice/margherita, +/obj/item/food/pizzaslice/margherita{ + pixel_x = 5; + pixel_y = 4 }, -/obj/machinery/light/small/directional/west, -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/arrivals) -"qZ" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/purple{ - dir = 4 +/obj/item/food/pizzaslice/ants{ + pixel_x = -4; + pixel_y = 7 }, +/obj/structure/fluff/paper/corner, /obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"rb" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/full_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/mapping_helpers/apc/cell_10k, -/obj/structure/cable, -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 1 +/obj/machinery/power/apc/auto_name/directional/south, +/turf/open/floor/pod/dark, +/area/awaymission/moonoutpost19/tent) +"ra" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) "rc" = ( /obj/structure/table, @@ -2966,43 +2659,122 @@ dir = 5 }, /area/awaymission/moonoutpost19/research) -"rn" = ( -/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, +"rd" = ( +/obj/effect/mapping_helpers/burnt_floor, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/hive) -"rs" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/resin/wall, +/area/awaymission/moonoutpost19/mines) +"ri" = ( +/obj/structure/lattice/catwalk, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/hive) -"rv" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/area/awaymission/moonoutpost19/mines) +"rk" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) +"rl" = ( +/obj/structure/cable, +/obj/structure/lattice/catwalk, +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/main) +"rm" = ( +/obj/machinery/door/airlock{ + id_tag = "awaydorm2"; + name = "Dorm 2" }, -/obj/structure/sign/warning/vacuum/directional/south, +/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, +/area/awaymission/moonoutpost19/arrivals) +"ro" = ( +/obj/item/stack/ore/iron, +/obj/item/stack/ore/iron{ + pixel_x = -7; + pixel_y = -4 + }, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) +"rt" = ( +/obj/machinery/door/airlock/external/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"ru" = ( +/obj/item/toy/beach_ball/baseball{ + pixel_x = 11; + pixel_y = -4 + }, +/obj/item/toy/beach_ball/baseball{ + pixel_x = -11; + pixel_y = -4 + }, +/obj/item/toy/beach_ball/baseball{ + pixel_y = 4 + }, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) +"rx" = ( +/obj/structure/disposaloutlet, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/turf_decal/lunar_sand/plating, /turf/open/floor/plating{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, +/area/awaymission/moonoutpost19/main) +"ry" = ( +/turf/open/floor/wood, /area/awaymission/moonoutpost19/syndicate) -"rG" = ( -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +"rA" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Diner" + }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"rB" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 }, +/obj/item/multitool, +/obj/effect/turf_decal/siding/thinplating_new/light, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) +"rC" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/structure/railing/corner, +/obj/item/cigbutt{ + pixel_x = -9; + pixel_y = -6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/turf/open/floor/plastic, +/area/awaymission/moonoutpost19/arrivals/shed) +"rD" = ( +/obj/structure/table, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/awaymission/moonoutpost19/research) "rH" = ( /obj/structure/closet/crate/bin, /obj/effect/turf_decal/siding/purple{ @@ -3015,6 +2787,28 @@ dir = 5 }, /area/awaymission/moonoutpost19/research) +"rK" = ( +/obj/structure/marker_beacon/burgundy, +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) +"rM" = ( +/obj/structure/closet/secure_closet/freezer{ + locked = 0; + name = "meat fridge"; + req_access = "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{ + temperature = 273.15 + }, +/area/awaymission/moonoutpost19/arrivals) "rO" = ( /obj/effect/turf_decal/siding/purple{ dir = 8 @@ -3026,142 +2820,173 @@ dir = 5 }, /area/awaymission/moonoutpost19/research) -"rR" = ( -/obj/structure/railing{ - dir = 4 +"rP" = ( +/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/item/cigbutt{ - pixel_x = -6 +/turf/open/floor/iron/showroomfloor{ + temperature = 273.15 }, -/obj/item/cigbutt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/turf/open/floor/plastic, /area/awaymission/moonoutpost19/arrivals) -"rY" = ( -/obj/item/stack/rods{ - pixel_x = 5; - pixel_y = -5 +"rU" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 5 }, -/obj/item/shard{ - icon_state = "small"; - pixel_x = -7; - pixel_y = 8 +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/main) +"rV" = ( +/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, +/area/awaymission/moonoutpost19/syndicate) +"rW" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/blood/gibs, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/main) -"sa" = ( -/obj/structure/alien/weeds/node, -/obj/structure/alien/resin/wall, +/area/awaymission/moonoutpost19/mines) +"rX" = ( +/obj/structure/lattice/catwalk, +/obj/item/storage/medkit, +/obj/structure/rack, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/hive) -"sf" = ( -/obj/effect/decal/cleanable/dirt, +/area/awaymission/moonoutpost19/mines) +"si" = ( +/obj/structure/sign/warning/biohazard{ + pixel_x = 32 + }, +/obj/structure/alien/weeds, +/obj/effect/turf_decal/tile/purple, /obj/structure/cable, -/obj/item/ammo_casing/a357{ - pixel_x = 11; - pixel_y = 8 +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"sn" = ( +/obj/structure/flora/rock/style_random{ + pixel_y = -2 }, -/obj/effect/turf_decal/siding/thinplating_new/light/corner{ - dir = 8 +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"sj" = ( -/obj/structure/chair{ - dir = 1 +/area/awaymission/moonoutpost19/mines) +"sq" = ( +/obj/item/ammo_casing/spent, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"sl" = ( +/area/awaymission/moonoutpost19/mines) +"sr" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, -/area/awaymission/moonoutpost19/syndicate) -"so" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"sp" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"st" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"su" = ( +/obj/machinery/door/airlock{ + name = "Kitchen Cold Room"; + req_access = "201" }, -/area/awaymission/moonoutpost19/hive) +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/iron/showroomfloor, +/area/awaymission/moonoutpost19/arrivals) "sv" = ( -/obj/machinery/light/floor, -/obj/effect/turf_decal/stripes/line{ +/obj/structure/railing{ dir = 4 }, -/obj/effect/turf_decal/lunar_sand/plating, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/structure/chair/plastic, +/turf/open/floor/plastic, +/area/awaymission/moonoutpost19/arrivals/shed) +"sx" = ( +/obj/machinery/door/airlock/external/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"sA" = ( -/obj/machinery/power/floodlight{ - anchored = 1 - }, /obj/structure/cable, -/obj/structure/lattice/catwalk, +/obj/effect/turf_decal/lunar_sand, /turf/open/floor/plating, -/area/awaymission/moonoutpost19/main) -"sF" = ( -/obj/machinery/door/airlock/maintenance{ - req_access = "201" - }, +/area/awaymission/moonoutpost19/arrivals) +"sC" = ( /obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_1" + dir = 4 }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) "sI" = ( /obj/item/stack/ore/diamond, /turf/open/misc/asteroid/moon/dug, /area/awaymission/moonoutpost19/mines) -"sR" = ( -/obj/item/trash/raisins, +"sJ" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/machinery/light/small/directional/west, +/obj/machinery/duct, +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/arrivals) +"sL" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/structure/table/wood, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"sT" = ( -/obj/item/stack/ore/iron, -/obj/item/stack/ore/iron{ - pixel_x = -7; - pixel_y = -4 +"sM" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/item/flashlight/flare{ + on = 1 }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/area/awaymission/moonoutpost19/main) -"sW" = ( -/obj/structure/flora/rock/style_random{ - pixel_y = -2 +/area/awaymission/moonoutpost19/syndicate) +"sO" = ( +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/lunar_sand, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"sU" = ( +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/external/ruin{ + density = 0; + icon_state = "open"; + opacity = 0 }, -/obj/item/stack/sheet/mineral/plasma/five, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 }, -/area/awaymission/moonoutpost19/mines) +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/syndicate) "sY" = ( /obj/machinery/vending/coffee, /obj/effect/turf_decal/siding/thinplating_new/light{ @@ -3170,59 +2995,132 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/arrivals) -"ta" = ( -/obj/machinery/door/airlock/medical{ - name = "Research Division"; - req_access = "201" +"sZ" = ( +/obj/structure/fluff/tram_rail/end{ + dir = 8 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) +/area/awaymission/moonoutpost19/main) "tb" = ( /turf/closed/mineral/random, /area/awaymission/moonoutpost19/mines) -"tf" = ( -/obj/machinery/door/firedoor, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +"ti" = ( +/obj/structure/fence/corner, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/structure/sign/warning/test_chamber/directional/north, +/area/awaymission/moonoutpost19/main) +"tk" = ( +/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{ + temperature = 273.15 + }, +/area/awaymission/moonoutpost19/arrivals) +"tm" = ( +/obj/structure/flora/rock/style_random{ + pixel_y = -2 + }, +/obj/structure/alien/weeds, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/mines) +"to" = ( +/obj/machinery/vending/cigarette, +/obj/structure/sign/poster/contraband/smoke/directional/north, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"tv" = ( +/obj/item/stack/ore/iron, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/mines) +"ty" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/effect/turf_decal/siding/thinplating_new/light, /turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"tA" = ( +/obj/structure/urinal/directional/north, +/obj/machinery/duct, +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/arrivals) +"tE" = ( +/obj/structure/rack, +/obj/item/pai_card{ + pixel_x = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/research) -"th" = ( -/obj/structure/alien/weeds, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ +"tG" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/research) +"tL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/effect/turf_decal/tile/red{ - dir = 8 +/obj/structure/cable, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"tN" = ( +/obj/structure/alien/weeds/node, +/mob/living/simple_animal/hostile/alien/drone{ + plants_off = 1 }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/syndicate) -"tn" = ( +/area/awaymission/moonoutpost19/mines) +"tQ" = ( /obj/structure/table, -/obj/item/storage/box/donkpockets, +/obj/item/stack/sheet/mineral/plasma, +/obj/machinery/light/small/broken/directional/north, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/structure/alien/weeds, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"tS" = ( +/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, /area/awaymission/moonoutpost19/syndicate) -"tq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +"ub" = ( +/obj/item/cigbutt, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 }, -/obj/structure/cable, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"ts" = ( +/area/awaymission/moonoutpost19/syndicate) +"uc" = ( +/obj/item/stack/ore/uranium, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/mines) +"ue" = ( /obj/machinery/power/apc/auto_name/directional/south{ req_access = "150" }, @@ -3238,132 +3136,109 @@ temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) -"tu" = ( +"ug" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/effect/turf_decal/lunar_sand, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"ui" = ( +/obj/structure/fluff/meteor/sharp, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) +"um" = ( /obj/structure/alien/weeds, /obj/structure/alien/resin/wall, -/obj/structure/alien/weeds, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) -"tx" = ( +"uo" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/barricade/sandbags, -/obj/effect/turf_decal/sand, -/obj/item/stack/ore/glass{ - pixel_y = -10 - }, +/obj/structure/tank_holder, /obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 1 + dir = 6 }, -/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"tE" = ( -/obj/structure/rack, -/obj/item/pai_card{ - pixel_x = 4 +"uq" = ( +/obj/structure/sign/poster/contraband/syndicate_recruitment/directional/north, +/obj/effect/turf_decal/loading_area{ + dir = 8 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/structure/alien/weeds, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/syndicate) +"ur" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) +"us" = ( +/obj/item/key/atv{ + pixel_x = 12; + pixel_y = 24 + }, +/obj/item/flashlight{ + pixel_x = -3; + pixel_y = 4 + }, +/obj/structure/rack, +/obj/item/flashlight, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) +"ut" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 }, /turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/research) -"tG" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/research) -"tM" = ( +/area/awaymission/moonoutpost19/syndicate) +"uC" = ( /obj/effect/turf_decal/caution/stand_clear{ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"tY" = ( -/obj/structure/ore_box, +/area/awaymission/moonoutpost19/arrivals/shed) +"uF" = ( +/obj/machinery/light/small/directional/east, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/mines) -"uf" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"uh" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/detective, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"uk" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/effect/turf_decal/siding/thinplating_new/light, -/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"us" = ( -/obj/effect/turf_decal/sand, -/obj/item/stack/ore/glass{ - pixel_x = 8 - }, -/obj/item/ammo_casing/a357{ - pixel_x = -10; - pixel_y = -7 +"uH" = ( +/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/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"uy" = ( -/obj/structure/fluff/meteor, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/main) -"uA" = ( -/obj/structure/chair/comfy/black{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 9 - }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"uB" = ( -/obj/item/toy/seashell{ - pixel_x = 5; - pixel_y = 6 - }, -/obj/item/toy/seashell{ - pixel_x = -9; - pixel_y = 6 - }, -/obj/item/toy/seashell, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/area/awaymission/moonoutpost19/hive) +"uK" = ( +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/public/glass{ + density = 0; + icon_state = "open"; + name = "Dormitories" }, -/area/awaymission/moonoutpost19/main) -"uI" = ( -/obj/structure/grille/broken, /obj/item/stack/rods, /obj/item/shard{ - pixel_x = -4; - pixel_y = 4 + icon_state = "small" }, -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_2" +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/effect/turf_decal/lunar_sand/plating, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) +/area/awaymission/moonoutpost19/syndicate) "uM" = ( /obj/structure/closet/secure_closet/personal/cabinet{ locked = 0; @@ -3372,25 +3247,72 @@ /obj/item/clothing/under/misc/assistantformal, /turf/open/floor/carpet/red, /area/awaymission/moonoutpost19/arrivals) -"uN" = ( -/obj/machinery/door/airlock/medical{ - name = "Research Division"; - req_access = "201" +"uR" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/iron/white, +/obj/item/clothing/gloves/color/yellow, +/obj/item/multitool, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"uS" = ( +/obj/structure/flora/rock/style_random{ + pixel_y = -2 + }, +/obj/item/stack/sheet/mineral/plasma/five, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/mines) +"uT" = ( +/obj/machinery/airalarm/directional/east{ + req_access = "150" + }, +/obj/effect/mapping_helpers/airalarm/unlocked, +/turf/open/floor/wood, +/area/awaymission/moonoutpost19/syndicate) +"uZ" = ( +/obj/machinery/power/port_gen/pacman{ + name = "P.A.C.M.A.N.-type portable generator" + }, +/obj/structure/cable, +/turf/open/floor/plating, /area/awaymission/moonoutpost19/research) -"uU" = ( -/obj/structure/closet/emcloset, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 +"vb" = ( +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" }, -/turf/open/floor/iron, +/turf/open/floor/iron/freezer, /area/awaymission/moonoutpost19/syndicate) -"uW" = ( -/obj/item/stack/tile/iron, +"vd" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/arrivals) +"vf" = ( +/obj/structure/flora/lunar_plant, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) +"vg" = ( +/obj/item/stack/rods{ + pixel_x = 5; + pixel_y = -5 + }, +/obj/item/shard{ + icon_state = "small"; + pixel_x = -7; + pixel_y = 8 + }, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, @@ -3405,32 +3327,35 @@ /obj/structure/extinguisher_cabinet/directional/north, /turf/closed/wall/r_wall/rust, /area/awaymission/moonoutpost19/research) -"vn" = ( -/obj/structure/marker_beacon/burgundy, -/obj/structure/lattice/catwalk, +"vp" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/closed/wall/r_wall, +/area/awaymission/moonoutpost19/research) +"vr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, /obj/structure/cable, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/arrivals) +"vs" = ( +/obj/structure/alien/weeds, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"vo" = ( -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"vt" = ( +/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" }, -/area/awaymission/moonoutpost19/arrivals) -"vp" = ( -/obj/effect/mapping_helpers/burnt_floor, -/turf/closed/wall/r_wall, +/obj/item/stack/cable_coil/cut, +/turf/open/floor/plating, /area/awaymission/moonoutpost19/research) -"vq" = ( -/obj/effect/decal/cleanable/xenoblood/xgibs, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) "vu" = ( /obj/structure/table, /obj/item/storage/secure/briefcase, @@ -3442,37 +3367,68 @@ }, /turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/research) +"vx" = ( +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "Awaylab"; + name = "Containment Chamber Blast Doors"; + pixel_x = 4; + pixel_y = -2; + req_access = "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, +/area/awaymission/moonoutpost19/research) +"vz" = ( +/obj/structure/alien/weeds/node, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/mines) +"vB" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/arrivals) +"vC" = ( +/obj/structure/closet/secure_closet/personal/cabinet{ + req_access = "150" + }, +/obj/item/ammo_box/magazine/m9mm, +/obj/item/ammo_box/magazine/m9mm, +/obj/item/suppressor, +/turf/open/floor/wood{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/syndicate) +"vE" = ( +/obj/structure/fluff/minepost, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/mines) "vG" = ( /obj/effect/mapping_helpers/broken_floor, /turf/closed/wall/r_wall, /area/awaymission/moonoutpost19/research) -"vI" = ( -/obj/structure/closet/mini_fridge, -/obj/item/food/pizzaslice/margherita, -/obj/item/food/pizzaslice/margherita{ - pixel_x = 5; - pixel_y = 4 - }, -/obj/item/food/pizzaslice/ants{ - pixel_x = -4; - pixel_y = 7 - }, -/obj/structure/fluff/paper/corner, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/pod/dark, -/area/awaymission/moonoutpost19/tent) -"vL" = ( -/obj/effect/turf_decal/siding/thinplating_new/light{ +"vK" = ( +/obj/machinery/power/terminal{ dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"vO" = ( -/obj/effect/turf_decal/sand/plating, -/obj/item/emptysandbag, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) "vR" = ( /obj/structure/bed, /obj/item/bedsheet, @@ -3488,6 +3444,10 @@ }, /turf/open/floor/carpet/royalblue, /area/awaymission/moonoutpost19/arrivals) +"vT" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) "vU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /obj/structure/chair/office/light{ @@ -3497,184 +3457,93 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"vV" = ( -/obj/machinery/door/airlock/external/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, +"vW" = ( +/obj/structure/barricade/sandbags, +/obj/effect/turf_decal/sand, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"wd" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 10 - }, -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +"vY" = ( +/obj/structure/fluff/minepost, +/obj/item/stack/sheet/mineral/plasma/five, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/main) -"wf" = ( -/obj/machinery/door/airlock{ - name = "Kitchen Cold Room"; - req_access = "201" +/area/awaymission/moonoutpost19/mines) +"wh" = ( +/obj/structure/alien/weeds/node, +/obj/structure/alien/resin/wall, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 +/area/awaymission/moonoutpost19/hive) +"wi" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/moonoutpost19/arrivals) +/obj/structure/sign/warning/test_chamber/directional/north, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) "wj" = ( /obj/item/stack/ore/glass/basalt, /turf/open/misc/asteroid/basalt, /area/awaymission/moonoutpost19/main) -"wm" = ( -/obj/structure/lattice/catwalk, -/obj/item/storage/medkit, -/obj/structure/rack, +"wt" = ( +/obj/structure/chair/pew{ + dir = 8 + }, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) +"wu" = ( +/obj/structure/cable, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/arrivals) +"wz" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/blood/gibs/limb, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/mines) -"wn" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/item/radio/off{ - pixel_x = 8; - pixel_y = 17 - }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"wo" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 8 - }, -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/main) -"wr" = ( -/obj/structure/flora/lunar_plant, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/mines) -"ws" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/closet/secure_closet{ - icon_state = "science"; - name = "scientist's locker"; - req_access = "201" - }, -/obj/item/clothing/suit/toggle/labcoat, -/obj/item/tank/internals/oxygen, -/obj/item/clothing/mask/gas, +"wD" = ( +/obj/machinery/light/small/broken/directional/east, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"ww" = ( -/obj/effect/turf_decal/stripes/asteroid/line, -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/main) -"wy" = ( -/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 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/lunar_sand, /turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, -/area/awaymission/moonoutpost19/arrivals) -"wE" = ( -/obj/structure/chair/stool/directional/south, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, /area/awaymission/moonoutpost19/syndicate) -"wI" = ( -/obj/machinery/door/window{ - dir = 1; - name = "Gateway Access"; - req_access = "150" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +"wF" = ( +/obj/machinery/door/poddoor/shutters{ + id = "awaymission19atvs" }, /obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"wK" = ( -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"wN" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) "wQ" = ( -/obj/structure/closet/secure_closet{ - icon_state = "sec"; - name = "security officer's locker"; - req_access = "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/cup/glass/bottle/beer{ - pixel_x = -3; - pixel_y = -2 - }, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 +/obj/machinery/computer/exoscanner_control, +/obj/structure/railing{ + dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"wR" = ( -/obj/structure/closet/l3closet, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 +/turf/open/floor/plastic, +/area/awaymission/moonoutpost19/arrivals/shed) +"wT" = ( +/obj/structure/closet/secure_closet/personal/cabinet{ + locked = 0; + req_access = "150" }, -/turf/open/floor/iron, +/obj/item/stack/spacecash/c50, +/turf/open/floor/wood, /area/awaymission/moonoutpost19/syndicate) -"wS" = ( -/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 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) "wU" = ( /obj/structure/table/reinforced, /obj/structure/window/reinforced/spawner/directional/north, @@ -3693,32 +3562,11 @@ dir = 5 }, /area/awaymission/moonoutpost19/research) -"wW" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"wY" = ( -/obj/item/storage/bag/ore, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"wZ" = ( -/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, -/area/awaymission/moonoutpost19/syndicate) +"wV" = ( +/obj/structure/closet/emcloset, +/obj/item/shovel, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) "xa" = ( /obj/machinery/light/cold/directional/west, /turf/open/floor/pod/light, @@ -3731,130 +3579,111 @@ }, /turf/open/floor/carpet/royalblue, /area/awaymission/moonoutpost19/arrivals) -"xc" = ( -/obj/structure/fence{ - dir = 4 +"xd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/structure/cable, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/syndicate) +"xj" = ( +/obj/machinery/door/airlock{ + name = "Unit 1" }, -/area/awaymission/moonoutpost19/main) -"xh" = ( -/obj/structure/urinal/directional/north, -/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/awaymission/moonoutpost19/arrivals) -"xl" = ( -/obj/item/stack/rods, -/obj/item/shard{ - icon_state = "small"; - pixel_x = 7; - pixel_y = -7 - }, -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 9; - icon_state = "ltrails_1" +"xk" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) +"xm" = ( +/obj/structure/cable, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"xp" = ( -/obj/structure/closet/secure_closet/freezer{ - locked = 0; - name = "refrigerator"; - req_access = "201" - }, -/obj/item/reagent_containers/condiment/milk{ - pixel_x = 4 - }, -/obj/item/reagent_containers/condiment/milk, -/obj/item/reagent_containers/condiment/milk{ - pixel_x = -3 - }, -/obj/item/storage/fancy/egg_box, -/turf/open/floor/iron/showroomfloor{ - temperature = 273.15 - }, -/area/awaymission/moonoutpost19/arrivals) -"xq" = ( -/obj/item/radio/off, -/obj/structure/sign/poster/official/safety_report/directional/north, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 4 - }, +"xn" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/turf_decal/siding/thinplating_new/light, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) +/area/awaymission/moonoutpost19/arrivals) "xr" = ( /obj/structure/bed, /obj/item/bedsheet, /turf/open/floor/carpet/orange, /area/awaymission/moonoutpost19/arrivals) -"xt" = ( -/obj/structure/table, -/obj/item/paper/fluff/awaymissions/moonoutpost19/log/ivan, -/obj/item/storage/box/emptysandbags{ - pixel_x = 6; - pixel_y = 9 - }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"xv" = ( -/obj/effect/turf_decal/tile/red{ +"xs" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"xw" = ( -/obj/machinery/shower{ - pixel_y = 16 +/obj/effect/turf_decal/siding/wood{ + dir = 4 }, -/turf/open/floor/iron/freezer, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) +"xu" = ( +/obj/structure/reagent_dispensers/plumbed, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"xx" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/egg/burst, +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) "xy" = ( /obj/effect/spawner/random/medical/surgery_tool_advanced, /turf/closed/mineral/random, /area/awaymission/moonoutpost19/mines) -"xA" = ( -/obj/structure/sign/warning/vacuum{ - desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; - name = "\improper HOSTILE ATMOSPHERE AHEAD"; - pixel_x = -32 - }, +"xB" = ( /obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, /area/awaymission/moonoutpost19/arrivals) -"xF" = ( -/obj/machinery/light/small/directional/south, +"xC" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/turf_decal/siding/thinplating_new/light, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"xH" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/external/ruin{ - density = 0; - icon_state = "open"; - opacity = 0 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 +/obj/structure/alien/weeds, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 }, -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating{ +/turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) +"xG" = ( +/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 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) "xK" = ( /obj/structure/rack, /obj/structure/window/reinforced/spawner/directional/west, @@ -3864,122 +3693,38 @@ }, /turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/research) -"xL" = ( -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "Awaylab"; - name = "Containment Chamber Blast Doors"; - pixel_x = 4; - pixel_y = -2; - req_access = "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 - }, +"yg" = ( +/obj/machinery/door/firedoor/closed, +/obj/structure/cable, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"xM" = ( -/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/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/hive) -"xN" = ( -/obj/machinery/power/shuttle_engine/propulsion/burst/left{ - dir = 4 - }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/arrivals) -"xX" = ( -/obj/machinery/shower{ - dir = 8 - }, -/obj/item/bikehorn/rubberducky, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/arrivals) -"xZ" = ( -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/main) -"ya" = ( -/mob/living/simple_animal/hostile/alien/drone{ - plants_off = 1 - }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"yb" = ( -/obj/structure/fence{ - dir = 4 - }, -/obj/structure/sign/warning, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"yd" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 10 - }, -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, /area/awaymission/moonoutpost19/arrivals) -"yf" = ( -/obj/machinery/light/directional/east, -/obj/machinery/airalarm/directional/east{ - req_access = "150" +"yi" = ( +/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/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airalarm/unlocked, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"yl" = ( -/obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ - dir = 4 + dir = 8 }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"yn" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/asteroid/corner{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/asteroid/corner{ - dir = 4 +"yj" = ( +/obj/structure/chair/comfy/black{ + dir = 8 }, -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 1 }, -/area/awaymission/moonoutpost19/main) +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"ym" = ( +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/arrivals) "yp" = ( /obj/structure/chair, /obj/effect/turf_decal/tile/dark/opposingcorners{ @@ -3993,76 +3738,46 @@ /obj/structure/fluff/meteor/large, /turf/open/misc/asteroid/basalt, /area/awaymission/moonoutpost19/main) -"yv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ +"yr" = ( +/obj/structure/chair{ dir = 1 }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"yw" = ( -/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 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"yy" = ( -/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/item/chair{ - dir = 4; - pixel_x = -4; - pixel_y = 2 - }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"yA" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 1 - }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"yB" = ( -/obj/structure/closet/crate/bin, -/obj/machinery/light/small/directional/west, -/obj/item/trash/cheesie, -/obj/item/trash/can, +"yt" = ( +/obj/item/cigbutt, /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/awaymission/moonoutpost19/arrivals) -"yE" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_1" +"yx" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "awaysyndie"; + layer = 3.1; + name = "mining conveyor" }, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/effect/decal/cleanable/fuel_pool, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/area/awaymission/moonoutpost19/main) +/area/awaymission/moonoutpost19/syndicate) +"yz" = ( +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) "yF" = ( /obj/structure/table/reinforced, /obj/item/paper_bin{ @@ -4076,24 +3791,15 @@ dir = 5 }, /area/awaymission/moonoutpost19/research) -"yI" = ( -/obj/item/reagent_containers/cup/glass/bottle/beer{ - desc = "Someone's last meal. He went out with a bang."; - pixel_x = 16; - pixel_y = -10 - }, -/obj/effect/decal/remains/human{ - desc = "...the pilot wasn't as lucky as the flag." - }, +"yJ" = ( +/obj/item/stack/ore/slag, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"yO" = ( +"yK" = ( +/obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/thinplating_new/light/corner{ - dir = 4 - }, /turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 @@ -4116,33 +3822,42 @@ }, /turf/open/floor/carpet/red, /area/awaymission/moonoutpost19/arrivals) -"yU" = ( -/obj/machinery/door/puzzle/keycard{ - name = "ATV Shed Door"; - puzzle_id = "atvs" +"yT" = ( +/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, /area/awaymission/moonoutpost19/arrivals) "yV" = ( /turf/open/misc/asteroid/moon, /area/awaymission/moonoutpost19/main) -"yW" = ( -/obj/machinery/firealarm/directional/east, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/tile/purple, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) +"yY" = ( +/obj/machinery/light/small/directional/west, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/arrivals) "yZ" = ( /obj/effect/mapping_helpers/broken_floor, /turf/closed/wall, /area/awaymission/moonoutpost19/arrivals) -"ze" = ( -/obj/effect/decal/cleanable/xenoblood/xsplatter, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) +"zb" = ( +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" + }, +/obj/machinery/duct, +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/arrivals) +"zc" = ( +/obj/machinery/door/firedoor/closed, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) "zf" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock{ @@ -4152,31 +3867,33 @@ /obj/structure/barricade/wooden/crude, /turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/arrivals) +"zi" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister, +/obj/structure/alien/weeds, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) "zk" = ( /turf/closed/indestructible/rock, /area/awaymission/moonoutpost19/mines) -"zs" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 1 +"zl" = ( +/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/red{ +/obj/effect/turf_decal/tile/purple{ dir = 8 }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"zt" = ( -/obj/structure/closet/secure_closet{ - icon_state = "science"; - locked = 0; - name = "scientist's locker"; - req_access = "201" +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"zr" = ( +/obj/machinery/computer/monitor{ + dir = 1 }, -/obj/item/clothing/suit/toggle/labcoat, -/turf/open/floor/iron, +/obj/structure/cable, +/turf/open/floor/plating, /area/awaymission/moonoutpost19/research) "zx" = ( /obj/structure/table, @@ -4198,31 +3915,22 @@ }, /turf/open/floor/carpet/red, /area/awaymission/moonoutpost19/arrivals) -"zA" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, +"zz" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/thinplating_new/light, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"zD" = ( -/obj/structure/chair/pew/right{ - dir = 8 - }, -/obj/item/reagent_containers/cup/glass/bottle/beer/almost_empty, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"zG" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +"zB" = ( +/obj/machinery/door/airlock/maintenance, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"zE" = ( +/obj/machinery/door/airlock/maintenance{ + req_access = "201" }, -/turf/open/floor/iron, +/obj/machinery/duct, +/turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) "zI" = ( /obj/structure/chair/office/light{ @@ -4245,156 +3953,53 @@ /obj/effect/turf_decal/lunar_sand/plating, /turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"zL" = ( -/obj/machinery/newscaster{ - pixel_x = -30 - }, -/obj/item/chair{ - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/kirbyplants{ - desc = "A plastic potted plant."; - pixel_y = 3 - }, -/obj/effect/mapping_helpers/burnt_floor, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 +"zN" = ( +/obj/structure/sink{ + pixel_y = 28 }, -/turf/open/floor/iron, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/freezer, /area/awaymission/moonoutpost19/research) -"zP" = ( -/obj/item/ammo_casing/spent{ - pixel_x = -7; - pixel_y = 9 - }, -/obj/item/ammo_casing/spent{ - pixel_x = -7; - pixel_y = -6 - }, -/obj/item/ammo_casing/spent{ - pixel_x = 8; - pixel_y = 6 - }, -/obj/item/ammo_casing/spent, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/mines) -"zQ" = ( +"zO" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"zT" = ( -/obj/structure/cable, -/obj/structure/lattice/catwalk, -/obj/structure/marker_beacon/burgundy, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"zV" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/resin/wall, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/mines) -"zW" = ( -/obj/item/stack/ore/uranium, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/effect/turf_decal/tile/red{ + dir = 1 }, -/area/awaymission/moonoutpost19/mines) -"zX" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/structure/cable, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, +/turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/syndicate) -"zZ" = ( -/obj/machinery/door/airlock/external/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, +"zR" = ( +/obj/structure/grille, +/obj/machinery/duct, /turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"Aa" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"Ad" = ( -/obj/machinery/airalarm/directional/east{ - req_access = "150" - }, -/obj/machinery/light/broken/directional/east, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/mapping_helpers/airalarm/unlocked, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"Ae" = ( -/obj/structure/chair/pew{ - dir = 8 - }, +"zY" = ( +/obj/structure/alien/resin/wall, +/obj/structure/alien/weeds, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/main) -"Ag" = ( -/obj/structure/flora/rock/style_random, +/area/awaymission/moonoutpost19/mines) +"Aj" = ( +/obj/item/pickaxe/drill, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"Ah" = ( -/obj/machinery/airalarm/directional/east{ - req_access = "150" - }, -/obj/effect/mapping_helpers/airalarm/unlocked, -/turf/open/floor/wood, -/area/awaymission/moonoutpost19/syndicate) -"Ai" = ( -/obj/structure/closet/crate/freezer, -/obj/structure/alien/weeds, -/obj/item/xenos_claw{ - pixel_x = -5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) "Am" = ( /obj/machinery/newscaster/directional/east, /turf/open/floor/carpet/royalblue, /area/awaymission/moonoutpost19/arrivals) -"Ao" = ( -/obj/machinery/door/poddoor/shutters{ - id = "awaymission19atvs" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"Ar" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +"Aq" = ( +/obj/structure/flora/lunar_plant, +/obj/item/stack/ore/iron, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) +/area/awaymission/moonoutpost19/mines) "Au" = ( /turf/closed/wall/mineral/titanium/survival/pod, /area/awaymission/moonoutpost19/tent) @@ -4411,6 +4016,32 @@ dir = 5 }, /area/awaymission/moonoutpost19/research) +"Az" = ( +/obj/structure/closet/emcloset, +/obj/machinery/light/small/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"AC" = ( +/obj/machinery/door/window{ + dir = 1; + name = "Gateway Access"; + req_access = "150" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) +"AD" = ( +/obj/item/bodybag/environmental, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) "AE" = ( /obj/structure/table, /obj/item/storage/box/donkpockets{ @@ -4421,185 +4052,195 @@ dir = 5 }, /area/awaymission/moonoutpost19/arrivals) -"AF" = ( -/obj/structure/chair/comfy/black, -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"AG" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 9 }, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"AN" = ( -/obj/structure/alien/weeds/node, -/mob/living/simple_animal/hostile/alien, +"AI" = ( +/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, +/area/awaymission/moonoutpost19/research) +"AO" = ( +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/blood/gibs, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) -"AR" = ( -/obj/machinery/exoscanner, -/obj/structure/cable, -/obj/structure/fluff/tram_rail/floor, +"AP" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/egg, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) +"AQ" = ( +/obj/item/stack/sheet/mineral/plasma, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"AS" = ( +"AT" = ( +/obj/item/stack/sheet/mineral/wood, /obj/structure/lattice/catwalk, -/obj/structure/tank_holder/emergency_oxygen, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/mines) +"AY" = ( +/obj/structure/fence/cut/large{ + dir = 8 + }, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"AU" = ( -/obj/machinery/light/small/directional/west, -/obj/item/storage/box, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, +"AZ" = ( +/obj/item/trash/raisins, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/structure/table_frame/wood, +/obj/structure/table/wood, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"AW" = ( -/obj/machinery/door/airlock/research/glass{ - name = "Research Storage"; - req_access = "201" +"Bb" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"AX" = ( -/obj/machinery/computer/exoscanner_control, -/obj/structure/railing{ - dir = 4 +/obj/item/crowbar{ + layer = 2.9; + pixel_x = 7; + pixel_y = -13 }, -/turf/open/floor/plastic, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) "Bc" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/hive) -"Be" = ( -/obj/structure/alien/weeds/node, -/obj/effect/decal/cleanable/blood, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/vehicle/ridden/atv{ + dir = 4 }, -/area/awaymission/moonoutpost19/hive) -"Bg" = ( -/obj/structure/alien/weeds, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/area/awaymission/moonoutpost19/hive) -"Bm" = ( -/obj/item/banner/command/mundane{ - desc = "The banner of Central Command, impaled into the rock upon first landing on this moon."; - name = "command claim banner"; - pixel_x = -1; - pixel_y = 15 +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) +"Bf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/ammo_casing/a357{ + pixel_x = -2; + pixel_y = -7 }, -/obj/structure/stone_tile/surrounding/burnt, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 1 }, -/area/awaymission/moonoutpost19/main) -"Bp" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/resin/wall, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/machinery/duct, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"Bk" = ( +/obj/machinery/door/airlock/maintenance, +/obj/machinery/duct, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"Bn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/area/awaymission/moonoutpost19/main) +/obj/structure/cable, +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) "Bq" = ( /obj/structure/filingcabinet/chestdrawer, /turf/open/floor/pod/dark, /area/awaymission/moonoutpost19/tent) -"Br" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Security Post"; +"Bs" = ( +/obj/machinery/door/airlock/research/glass{ + name = "Research Storage"; req_access = "201" }, /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"Bt" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/chair/plastic, -/turf/open/floor/plastic, -/area/awaymission/moonoutpost19/arrivals) "Bu" = ( -/obj/item/stack/ore/glass{ - pixel_x = 8; - pixel_y = 9 - }, -/obj/item/stack/ore/glass{ - pixel_x = -6 - }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"Bv" = ( -/obj/item/clothing/head/soft/blue{ - pixel_x = 12; - pixel_y = -12; - name = "medbay runtimes cap" - }, -/obj/item/clothing/head/soft/blue{ - pixel_x = 12; - name = "medbay runtimes cap" - }, -/obj/item/clothing/head/soft/blue{ - name = "medbay runtimes cap" +/turf/closed/wall/rust, +/area/awaymission/moonoutpost19/arrivals/shed) +"Bx" = ( +/turf/open/floor/iron/white/corner{ + dir = 8 }, +/area/awaymission/moonoutpost19/arrivals) +"Bz" = ( +/obj/structure/lattice/catwalk, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"Bw" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/closet/toolcloset, -/obj/item/clothing/gloves/color/yellow, -/obj/effect/mapping_helpers/broken_floor, -/obj/item/clothing/under/rank/engineering/atmospheric_technician, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) "BB" = ( /obj/effect/turf_decal/stripes{ dir = 8 }, /turf/open/misc/asteroid/basalt, /area/awaymission/moonoutpost19/main) +"BC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/ash, +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"BD" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters{ + id = "awaykitchen"; + name = "Serving Hatch" + }, +/turf/open/floor/carpet, +/area/awaymission/moonoutpost19/arrivals) "BE" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/survival_pod, /turf/open/floor/pod/dark, /area/awaymission/moonoutpost19/tent) -"BF" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 9; - icon_state = "ltrails_1" - }, -/obj/item/stack/ore/glass/basalt{ - pixel_x = 6 - }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"BJ" = ( -/obj/structure/lattice/catwalk, +"BG" = ( +/obj/effect/decal/cleanable/blood/old, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/mines) +"BI" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4 + }, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/awaymission/moonoutpost19/research) +"BK" = ( +/obj/machinery/door/airlock/external/ruin, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) "BL" = ( /obj/structure/table, /obj/item/book/manual/wiki/barman_recipes{ @@ -4612,24 +4253,21 @@ dir = 5 }, /area/awaymission/moonoutpost19/arrivals) -"BN" = ( -/obj/effect/decal/cleanable/dirt, +"BP" = ( +/obj/machinery/conveyor{ + id = "awaysyndie" + }, /obj/effect/turf_decal/stripes/line{ - dir = 1 + dir = 4 }, -/obj/item/stack/sheet/mineral/plasma/five, -/turf/open/floor/iron{ +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/plating{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) -"BO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/thinplating_new/light/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) "BQ" = ( /obj/machinery/button/door/directional/west{ id = "awaydorm1"; @@ -4647,149 +4285,125 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"BU" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/structure/urinal/directional/north, -/obj/structure/mirror/directional/east, +"BW" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/arrivals) -"BX" = ( -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 6 - }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"BZ" = ( -/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{ - temperature = 273.15 - }, -/area/awaymission/moonoutpost19/arrivals) -"Cf" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ - dir = 8 + dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"Ci" = ( -/obj/machinery/computer/aifixer, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/siding/purple{ - dir = 5 +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/obj/effect/turf_decal/tile/dark/opposingcorners{ +/area/awaymission/moonoutpost19/syndicate) +"Ca" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ dir = 1 }, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/item/chair{ + dir = 4; + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/plate/oven_tray{ + pixel_x = -10; + pixel_y = -12 }, -/area/awaymission/moonoutpost19/research) -"Ck" = ( -/obj/machinery/duct, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"Cp" = ( -/obj/item/flashlight/flare{ - on = 1 - }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"Cb" = ( +/obj/structure/dresser, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/button/door/directional/north{ + id = "awaydorm5"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 }, -/area/awaymission/moonoutpost19/mines) -"Ct" = ( +/turf/open/floor/wood, +/area/awaymission/moonoutpost19/syndicate) +"Ce" = ( /obj/structure/alien/weeds, /obj/effect/turf_decal/tile/purple, /obj/structure/cable, /obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"Cu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +"Ci" = ( +/obj/machinery/computer/aifixer, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/effect/turf_decal/siding/purple{ + dir = 5 }, -/area/awaymission/moonoutpost19/arrivals) -"Cx" = ( -/obj/structure/fluff/minepost, -/obj/item/stack/sheet/mineral/plasma/five, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/area/awaymission/moonoutpost19/mines) -"Cz" = ( -/obj/machinery/power/shieldwallgen/unlocked, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, /area/awaymission/moonoutpost19/research) -"CA" = ( -/obj/structure/sink{ - pixel_y = 28 +"Cn" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"Co" = ( +/obj/structure/closet/secure_closet{ + locked = 0; + name = "kitchen Cabinet"; + req_access = "201" }, -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/syndicate) -"CB" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/egg/burst, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/item/reagent_containers/condiment/flour{ + pixel_x = -4; + pixel_y = -4 }, -/area/awaymission/moonoutpost19/hive) -"CC" = ( -/obj/item/stack/ore/iron, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/item/reagent_containers/condiment/flour, +/obj/item/reagent_containers/condiment/sugar{ + pixel_x = 4; + pixel_y = 4 }, -/area/awaymission/moonoutpost19/main) -"CF" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 10 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/showroomfloor{ + temperature = 273.15 }, +/area/awaymission/moonoutpost19/arrivals) +"Cs" = ( +/obj/machinery/light/small/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"CI" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/egg/burst, -/obj/effect/decal/cleanable/blood/gibs, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"Cz" = ( +/obj/structure/closet/firecloset{ + name = "fire-proof closet" }, -/area/awaymission/moonoutpost19/hive) -"CJ" = ( -/obj/item/clothing/head/soft, -/obj/item/clothing/head/soft{ - pixel_y = 3 +/obj/effect/decal/cleanable/dirt, +/obj/item/tank/internals/plasma/full{ + pixel_y = -8 }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/item/tank/internals/plasma/full{ + pixel_y = -4 }, -/area/awaymission/moonoutpost19/main) -"CM" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 4 +/obj/item/fuel_pellet, +/obj/item/fuel_pellet{ + pixel_y = 4 }, -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +/obj/item/fuel_pellet{ + pixel_y = 8 }, -/area/awaymission/moonoutpost19/main) -"CN" = ( -/obj/item/trash/candy, +/obj/item/clothing/under/shorts/black, +/turf/open/floor/plastic, +/area/awaymission/moonoutpost19/arrivals/shed) +"CK" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/arrivals) +"CL" = ( +/obj/structure/fence/door, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, @@ -4798,20 +4412,29 @@ /obj/structure/cable, /turf/open/floor/pod/light, /area/awaymission/moonoutpost19/tent) -"CU" = ( -/obj/structure/fluff/minepost, -/obj/item/stack/sheet/mineral/plasma/thirty, +"CW" = ( +/obj/structure/ore_box, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/mines) -"CV" = ( -/obj/effect/turf_decal/tile/purple{ +"CX" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) +"CY" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/mapping_helpers/apc/cell_10k, +/obj/structure/cable, +/obj/effect/turf_decal/lunar_sand, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) "CZ" = ( /obj/machinery/vending/cola, /obj/effect/turf_decal/siding/thinplating_new/light{ @@ -4819,276 +4442,187 @@ }, /turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/arrivals) -"De" = ( -/obj/structure/grille/broken, -/obj/item/stack/rods{ - pixel_x = 6; - pixel_y = 6 - }, -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, +"Da" = ( +/obj/machinery/door/airlock/external/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/cable, +/turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"Dg" = ( -/obj/machinery/conveyor{ - id = "awaysyndie" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/railing/corner, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"Dh" = ( -/obj/structure/fence, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"Dm" = ( -/obj/structure/flora/lunar_plant, +"Db" = ( +/obj/structure/marker_beacon/burgundy, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/main) -"Dn" = ( -/obj/structure/flora/rock/style_random{ - pixel_y = -2 - }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/area/awaymission/moonoutpost19/mines) +"Dc" = ( +/obj/machinery/door/airlock/external/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 }, -/area/awaymission/moonoutpost19/main) -"Dq" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"Df" = ( +/obj/structure/grille/broken, +/obj/item/stack/rods, +/obj/item/shard{ + pixel_x = -4; + pixel_y = 4 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"Dv" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +/obj/effect/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + dir = 8; + icon_state = "ltrails_2" }, +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"DA" = ( -/obj/structure/fluff/meteor/sharp, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"DC" = ( -/obj/structure/fluff/minepost, +"Dk" = ( +/obj/structure/trap/cult, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/mines) -"DF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"DG" = ( -/obj/structure/barricade/wooden/crude, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"DM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/ammo_casing/a357{ - pixel_x = -2; - pixel_y = -7 +"Dl" = ( +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 10 }, -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 1 +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/obj/machinery/duct, -/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"DP" = ( -/obj/structure/chair/comfy/black{ - dir = 8 - }, +"Do" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"DU" = ( -/obj/item/stack/ore/titanium, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/mines) -"DX" = ( +"Dp" = ( /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/neutral{ + dir = 8 + }, /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"DY" = ( -/obj/effect/mapping_helpers/burnt_floor, -/obj/item/flashlight/flare{ - on = 1 - }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"Ea" = ( -/obj/structure/chair/pew/left{ - dir = 8 - }, -/obj/item/clothing/head/soft, +"Ds" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"Dw" = ( +/obj/item/stack/tile/iron/base, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"Eb" = ( -/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/awaymission/moonoutpost19/arrivals) -"Ef" = ( -/obj/structure/flora/rock/pile, +"Dx" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/mapping_helpers/apc/cell_10k, +/obj/effect/turf_decal/tile/purple, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"Dy" = ( +/obj/item/stack/cable_coil/cut, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"Eh" = ( -/obj/structure/noticeboard/directional/north, -/obj/item/paper/fluff/awaymissions/moonoutpost19/food_specials, -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"Ei" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"El" = ( +"DH" = ( +/obj/structure/grille/broken, +/obj/item/stack/rods, +/obj/item/stack/rods, +/obj/item/shard, /obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood, -/mob/living/simple_animal/hostile/alien/drone{ - plants_off = 1 - }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/hive) -"Ep" = ( -/turf/closed/mineral/random/labormineral, -/area/awaymission/moonoutpost19/mines) -"Eq" = ( -/obj/structure/marker_beacon/burgundy, -/turf/open/misc/asteroid/moon{ +/turf/open/floor/plating{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/main) -"Er" = ( -/obj/structure/flora/rock/style_random{ - pixel_y = -2 +/area/awaymission/moonoutpost19/syndicate) +"DJ" = ( +/obj/effect/turf_decal/tile/purple/anticorner{ + dir = 4 }, -/obj/item/clothing/head/soft/blue{ - pixel_x = 12; - pixel_y = -12; - name = "medbay runtimes cap" +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"DN" = ( +/obj/machinery/shower{ + dir = 8 }, -/obj/item/clothing/head/soft/blue{ - pixel_y = 8; - pixel_x = 12; - name = "medbay runtimes cap" +/obj/item/bikehorn/rubberducky, +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/arrivals) +"DQ" = ( +/obj/item/shard{ + pixel_x = -3 }, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"Et" = ( -/obj/structure/fluff/minepost, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"DS" = ( +/obj/structure/fence{ + dir = 4 }, -/area/awaymission/moonoutpost19/main) -"Ev" = ( -/obj/structure/fence/door, +/obj/structure/sign/warning, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"Ey" = ( -/obj/structure/chair/stool/directional/west, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ +"DW" = ( +/obj/machinery/shower{ dir = 1 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"EC" = ( -/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"; - pixel_x = -9; - pixel_y = 6 - }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/arrivals) +"DZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/thinplating_new/light/corner{ dir = 8 }, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"EE" = ( -/obj/item/stack/ore/diamond, -/obj/effect/decal/cleanable/blood/drip, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/area/awaymission/moonoutpost19/arrivals) +"Eg" = ( +/obj/machinery/conveyor{ + id = "awaysyndie" }, -/area/awaymission/moonoutpost19/mines) -"EL" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/public/glass{ - density = 0; - icon_state = "open"; - name = "Dormitories" +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/obj/item/stack/rods, -/obj/item/shard{ - icon_state = "small" +/obj/structure/railing/corner{ + dir = 4 }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) -"ER" = ( +"Ep" = ( +/turf/closed/mineral/random/labormineral, +/area/awaymission/moonoutpost19/mines) +"Eu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) +"Ev" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 }, @@ -5096,112 +4630,131 @@ /obj/effect/turf_decal/lunar_sand/plating, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"ES" = ( -/obj/structure/closet/crate, -/obj/item/storage/bag/ore, -/obj/structure/alien/weeds, -/obj/item/mining_scanner, -/obj/item/shovel, -/obj/item/pickaxe, +/area/awaymission/moonoutpost19/arrivals/shed) +"Ew" = ( +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"EB" = ( +/obj/structure/chair/stool/directional/south, /obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"EI" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 }, +/turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/syndicate) -"EU" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +"EK" = ( +/mob/living/basic/lizard{ + name = "Newt" }, -/obj/item/chair{ - dir = 4; - pixel_x = -4; - pixel_y = 2 +/turf/open/floor/carpet/royalblue, +/area/awaymission/moonoutpost19/arrivals) +"EN" = ( +/obj/machinery/gateway/away{ + calibrated = 0 }, -/obj/item/plate/oven_tray{ - pixel_x = -10; - pixel_y = -12 +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"EP" = ( +/obj/structure/cable, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/syndicate) +"EQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, +/obj/structure/cable, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"EV" = ( -/obj/machinery/power/shuttle_engine/propulsion/burst/right{ +"EX" = ( +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"EW" = ( +"EY" = ( +/obj/effect/decal/cleanable/dirt, /obj/structure/alien/weeds, -/obj/structure/alien/resin/wall, -/obj/structure/alien/resin/wall, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"EZ" = ( +/obj/structure/alien/weeds/node, +/mob/living/simple_animal/hostile/alien, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) -"Fd" = ( -/obj/item/flashlight/lantern{ - icon_state = "lantern-on" - }, -/obj/effect/decal/cleanable/blood/tracks{ +"Fc" = ( +/obj/machinery/light/floor, +/obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/effect/turf_decal/lunar_sand/plating, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) +"Ff" = ( +/obj/structure/cable, +/obj/structure/lattice/catwalk, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"Fk" = ( -/obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/item/screwdriver{ - pixel_x = 9; - pixel_y = 10 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ +"Fi" = ( +/obj/machinery/washing_machine, +/obj/effect/turf_decal/tile/blue{ dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"Fr" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/tile/blue{ dir = 8 }, -/turf/open/floor/iron{ +/turf/open/floor/iron/cafeteria{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, -/area/awaymission/moonoutpost19/syndicate) -"Fu" = ( -/obj/structure/closet/emcloset, -/obj/item/shovel, -/turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"Fw" = ( -/obj/item/pickaxe{ - layer = 2.9; - pixel_x = -12; - pixel_y = 6 - }, -/obj/structure/flora/rock/style_random{ - pixel_y = -2 +"Ft" = ( +/obj/effect/decal/cleanable/robot_debris, +/obj/effect/decal/cleanable/oil, +/obj/item/storage/medkit/regular{ + empty = 1; + name = "First-Aid (empty)" }, -/turf/open/misc/asteroid/basalt, -/area/awaymission/moonoutpost19/main) -"Fz" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 6 +/obj/item/healthanalyzer{ + pixel_x = 6; + pixel_y = -5 }, -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +/obj/item/assembly/prox_sensor{ + pixel_x = -5; + pixel_y = -2 + }, +/obj/item/bodypart/arm/left/robot, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"Fw" = ( +/obj/item/pickaxe{ + layer = 2.9; + pixel_x = -12; + pixel_y = 6 }, +/obj/structure/flora/rock/style_random{ + pixel_y = -2 + }, +/turf/open/misc/asteroid/basalt, /area/awaymission/moonoutpost19/main) "FA" = ( /turf/open/lava/airless, @@ -5220,23 +4773,50 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/engine, /area/awaymission/moonoutpost19/research) -"FJ" = ( -/obj/effect/decal/cleanable/robot_debris, -/obj/effect/decal/cleanable/oil, -/obj/item/storage/medkit/regular{ - empty = 1; - name = "First-Aid (empty)" +"FD" = ( +/obj/machinery/airalarm/directional/north{ + req_access = "150" }, -/obj/item/healthanalyzer{ - pixel_x = 6; - pixel_y = -5 +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 }, -/obj/item/assembly/prox_sensor{ - pixel_x = -5; - pixel_y = -2 +/obj/effect/mapping_helpers/airalarm/unlocked, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) +"FF" = ( +/obj/structure/table/wood, +/obj/item/pen, +/obj/item/paper/fluff/awaymissions/moonoutpost19/log/personal_2, +/obj/structure/sign/poster/contraband/c20r/directional/south, +/turf/open/floor/wood{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/syndicate) +"FH" = ( +/obj/structure/closet/crate{ + desc = "It's a storage unit for kitchen clothes and equipment."; + name = "Kitchen Crate" + }, +/obj/item/storage/box/mousetraps{ + pixel_x = -1 + }, +/obj/item/clothing/under/suit/waiter{ + pixel_x = -6 + }, +/turf/open/floor/iron/showroomfloor{ + temperature = 273.15 + }, +/area/awaymission/moonoutpost19/arrivals) +"FI" = ( +/obj/structure/table, +/obj/item/storage/medkit/regular, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/iron/white/side{ + dir = 8 }, -/obj/item/bodypart/arm/left/robot, -/turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) "FK" = ( /turf/open/misc/asteroid/moon/dug, @@ -5248,39 +4828,17 @@ /obj/effect/turf_decal/stripes, /turf/open/misc/asteroid/basalt, /area/awaymission/moonoutpost19/main) -"FS" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/egg, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/hive) -"FW" = ( -/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, -/area/awaymission/moonoutpost19/research) -"FX" = ( +"FQ" = ( /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/machinery/button/door/directional/west{ - id = "Awaybiohazard"; - name = "Biohazard Shutter Control"; - req_access = "101" +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 6 }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) +/area/awaymission/moonoutpost19/arrivals) "FY" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/effect/turf_decal/stripes/line{ @@ -5288,79 +4846,91 @@ }, /turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/research) -"Gb" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - icon_state = "ltrails_2" +"Ga" = ( +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock{ + density = 0; + icon_state = "open"; + id_tag = "awaydorm4"; + name = "Dorm 1"; + opacity = 0 }, -/obj/machinery/camera/directional/west{ - c_tag = "Dormitories"; - network = list("mo19") +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +/area/awaymission/moonoutpost19/syndicate) +"Gd" = ( +/obj/structure/fence/corner{ + dir = 10 }, -/area/awaymission/moonoutpost19/arrivals) -"Gf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple{ - dir = 4 +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) +"Gh" = ( +/obj/structure/closet/l3closet/scientist, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/alien/weeds, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/obj/structure/cable, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"Gg" = ( +/area/awaymission/moonoutpost19/research) +"Gj" = ( /obj/structure/alien/weeds, -/obj/structure/alien/resin/membrane, +/obj/effect/decal/cleanable/blood, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/mines) -"Gk" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 6 +/area/awaymission/moonoutpost19/hive) +"Gl" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/item/reagent_containers/cup/rag{ + pixel_y = 5 }, -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +/obj/machinery/door/poddoor/shutters{ + id = "awaykitchen"; + name = "Serving Hatch" }, +/turf/open/floor/carpet, /area/awaymission/moonoutpost19/arrivals) -"Go" = ( -/obj/effect/mapping_helpers/burnt_floor, -/obj/effect/decal/cleanable/blood/gibs/up, +"Gm" = ( +/obj/structure/fluff/meteor, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/mines) +/area/awaymission/moonoutpost19/main) "Gp" = ( /turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"Gq" = ( -/obj/structure/trap/cult, +"Gs" = ( +/obj/structure/alien/weeds/node, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/mines) -"Gu" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/canister/air, -/obj/machinery/atmospherics/components/unary/portables_connector{ - dir = 1 - }, -/turf/open/floor/plastic, -/area/awaymission/moonoutpost19/arrivals) +/area/awaymission/moonoutpost19/main) "Gv" = ( /obj/structure/flora/rock/style_random, /turf/open/misc/asteroid/basalt, /area/awaymission/moonoutpost19/main) -"Gy" = ( -/obj/structure/fence/corner{ - dir = 10 +"Gw" = ( +/obj/structure/grille/broken, +/obj/item/stack/rods, +/obj/machinery/duct, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"Gx" = ( +/obj/structure/alien/weeds, +/obj/effect/turf_decal/tile/purple, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"Gz" = ( +/obj/item/clothing/head/soft, +/obj/item/clothing/head/soft{ + pixel_y = 3 }, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" @@ -5372,33 +4942,13 @@ dir = 5 }, /area/awaymission/moonoutpost19/arrivals) -"GB" = ( -/obj/structure/cable, -/obj/structure/lattice/catwalk, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"GG" = ( -/obj/structure/closet/secure_closet{ - locked = 0; - name = "kitchen Cabinet"; - req_access = "201" - }, -/obj/item/reagent_containers/condiment/flour{ - pixel_x = -4; - pixel_y = -4 - }, -/obj/item/reagent_containers/condiment/flour, -/obj/item/reagent_containers/condiment/sugar{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/showroomfloor{ - temperature = 273.15 +"GE" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 }, -/area/awaymission/moonoutpost19/arrivals) +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) "GH" = ( /obj/structure/table, /obj/machinery/microwave{ @@ -5407,166 +4957,177 @@ }, /turf/open/floor/iron/cafeteria, /area/awaymission/moonoutpost19/arrivals) -"GO" = ( -/obj/item/pickaxe{ - pixel_x = 20; - pixel_y = 8 - }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"GI" = ( +/obj/machinery/airalarm/directional/east{ + req_access = "150" }, -/area/awaymission/moonoutpost19/main) -"GQ" = ( -/obj/structure/closet/secure_closet/freezer{ - locked = 0; - name = "meat fridge"; - req_access = "201" +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airalarm/unlocked, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) +"GK" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/detective, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 1 }, -/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{ - temperature = 273.15 +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"GP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, +/obj/structure/cable, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) "GR" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"GT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +"GU" = ( +/obj/effect/baseturf_helper/asteroid/moon, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/machinery/airalarm/directional/south, +/area/awaymission/moonoutpost19/main) +"GW" = ( +/obj/effect/spawner/structure/window, /turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"Hf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"Hh" = ( -/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/awaymission/moonoutpost19/syndicate) -"Hj" = ( -/obj/machinery/conveyor{ - id = "awaysyndie" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +"GX" = ( +/obj/structure/table, +/obj/item/shard{ + icon_state = "medium" }, -/obj/structure/railing{ - dir = 4 +/turf/open/floor/iron/white/side{ + dir = 8 }, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +/area/awaymission/moonoutpost19/research) +"Ha" = ( +/obj/structure/alien/weeds, +/mob/living/simple_animal/hostile/alien, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/syndicate) -"Hp" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/external/ruin{ - density = 0; - icon_state = "open"; - opacity = 0 +/area/awaymission/moonoutpost19/hive) +"Hd" = ( +/obj/item/stack/rods, +/obj/item/shard{ + pixel_x = -6; + pixel_y = 4 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating{ +/turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/syndicate) -"Hr" = ( -/obj/effect/turf_decal/tile/purple/anticorner{ - dir = 4 +/area/awaymission/moonoutpost19/main) +"Hg" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/mapping_helpers/apc/cell_10k, +/obj/structure/cable, +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 1 }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) +"Hk" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"Hl" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/airalarm/directional/north{ + req_access = "150" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/mapping_helpers/airalarm/unlocked, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) "Hs" = ( /obj/effect/turf_decal/stripes{ dir = 4 }, /turf/open/misc/asteroid/basalt, /area/awaymission/moonoutpost19/main) -"Ht" = ( -/obj/machinery/door/firedoor/closed, -/obj/effect/decal/cleanable/greenglow, +"Hy" = ( +/obj/structure/fluff/minepost, +/obj/item/stack/sheet/mineral/uranium/five, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/mines) +"HD" = ( +/obj/machinery/firealarm/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/thinplating_new/light, +/obj/machinery/duct, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"Hu" = ( -/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 +"HE" = ( +/obj/machinery/airalarm/directional/east{ + req_access = "150" }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"Hv" = ( -/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/machinery/light/broken/directional/east, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/effect/mapping_helpers/airalarm/unlocked, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 +/area/awaymission/moonoutpost19/syndicate) +"HG" = ( +/obj/item/pickaxe{ + pixel_x = 20; + pixel_y = 8 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"Hx" = ( -/obj/machinery/light/small/broken/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"HC" = ( -/obj/effect/mapping_helpers/burnt_floor, -/obj/effect/decal/cleanable/blood/gibs/limb, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/mines) -"HH" = ( -/obj/machinery/vending/snack, -/obj/structure/sign/poster/contraband/eat/directional/north, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) +/area/awaymission/moonoutpost19/main) "HJ" = ( /obj/structure/safe, /obj/item/camera, /turf/open/floor/pod/dark, /area/awaymission/moonoutpost19/tent) -"HK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +"HN" = ( +/obj/item/stack/rods, +/obj/structure/grille/broken, +/obj/item/stack/rods, +/obj/item/shard{ + icon_state = "medium"; + pixel_x = -7; + pixel_y = 5 + }, +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/arrivals) -"HQ" = ( -/obj/machinery/power/shieldwallgen/unlocked, -/obj/structure/cable, -/turf/open/floor/plating, +"HO" = ( +/obj/structure/table, +/obj/item/storage/medkit/fire, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/white/side{ + dir = 8 + }, /area/awaymission/moonoutpost19/research) +"HP" = ( +/mob/living/simple_animal/pet/cat/space{ + desc = "With survival instincts like these, it's no wonder cats survived to the 26th century."; + name = "Jones" + }, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) "HS" = ( /obj/structure/chair/stool/directional/east{ pixel_x = 9 @@ -5576,27 +5137,36 @@ }, /turf/open/floor/carpet, /area/awaymission/moonoutpost19/arrivals) -"HW" = ( -/obj/structure/bed/dogbed/runtime, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"HU" = ( +/obj/structure/reagent_dispensers/wall/peppertank/directional/west, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 }, -/area/awaymission/moonoutpost19/main) -"HX" = ( -/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"HY" = ( +/obj/structure/sign/departments/science{ + pixel_y = 32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/purple/anticorner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"Ia" = ( +/obj/machinery/exoscanner, +/obj/structure/cable, +/obj/structure/fluff/tram_rail/floor, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/mines) -"Ic" = ( -/obj/structure/grille/broken, -/obj/item/stack/rods, -/obj/machinery/duct, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"Id" = ( -/obj/structure/alien/resin/wall, -/obj/structure/alien/weeds, +/area/awaymission/moonoutpost19/main) +"Ig" = ( +/obj/structure/rack, +/obj/structure/lattice/catwalk, +/obj/item/pickaxe, +/obj/item/emptysandbag, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, @@ -5617,6 +5187,13 @@ }, /turf/open/floor/iron/half, /area/awaymission/moonoutpost19/syndicate) +"Ii" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) "Ik" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 8 @@ -5624,6 +5201,13 @@ /obj/effect/turf_decal/siding/wood/corner, /turf/open/floor/carpet, /area/awaymission/moonoutpost19/arrivals) +"Im" = ( +/obj/machinery/door/puzzle/keycard{ + name = "ATV Shed Door"; + puzzle_id = "atvs" + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) "In" = ( /obj/structure/filingcabinet/chestdrawer, /obj/machinery/light/small/broken/directional/north, @@ -5640,46 +5224,29 @@ dir = 5 }, /area/awaymission/moonoutpost19/research) -"Ip" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/highsecurity{ - name = "Gateway"; - req_access = "150" +"Io" = ( +/obj/structure/barricade/wooden/crude, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"Is" = ( -/obj/effect/turf_decal/stripes/line{ +/area/awaymission/moonoutpost19/main) +"Ir" = ( +/obj/vehicle/ridden/atv{ dir = 4 }, -/obj/structure/cable, -/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"It" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/neutral{ +/area/awaymission/moonoutpost19/arrivals/shed) +"Iu" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"IB" = ( +/obj/structure/chair/pew/right{ dir = 8 }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"Iv" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/item/stack/ore/glass/basalt{ - pixel_x = -8; - pixel_y = -5 - }, -/obj/item/stack/sheet/mineral/wood{ - pixel_x = 9; - pixel_y = 8 - }, +/obj/item/reagent_containers/cup/glass/bottle/beer/almost_empty, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, @@ -5693,144 +5260,189 @@ }, /turf/open/floor/carpet, /area/awaymission/moonoutpost19/arrivals) -"IG" = ( -/obj/machinery/washing_machine, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +"IM" = ( +/turf/open/space/basic, +/area/space) +"IO" = ( +/obj/machinery/door/airlock/survival_pod/glass, +/obj/structure/fans/tiny, +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/pod/light, +/area/awaymission/moonoutpost19/tent) +"IP" = ( +/turf/closed/wall/mineral/titanium/survival, +/area/awaymission/moonoutpost19/tent) +"IW" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 }, -/turf/open/floor/iron/cafeteria{ +/turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, -/area/awaymission/moonoutpost19/arrivals) -"II" = ( -/obj/item/stack/sheet/mineral/plasma, +/area/awaymission/moonoutpost19/syndicate) +"IX" = ( +/obj/structure/chair/pew{ + dir = 8 + }, +/obj/item/food/peanuts/salted, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"IL" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +"Ja" = ( +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/blood, +/mob/living/simple_animal/hostile/alien/drone{ + plants_off = 1 }, -/obj/item/chair/stool{ - dir = 1; - pixel_x = -6; - pixel_y = -4 +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/effect/turf_decal/siding/wood{ +/area/awaymission/moonoutpost19/hive) +"Jb" = ( +/obj/structure/fence/post{ dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"IM" = ( -/turf/open/space/basic, -/area/space) -"IN" = ( -/mob/living/simple_animal/pet/cat/space{ - desc = "With survival instincts like these, it's no wonder cats survived to the 26th century."; - name = "Jones" - }, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"IO" = ( -/obj/machinery/door/airlock/survival_pod/glass, -/obj/structure/fans/tiny, -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/pod/light, -/area/awaymission/moonoutpost19/tent) -"IP" = ( -/turf/closed/wall/mineral/titanium/survival, -/area/awaymission/moonoutpost19/tent) "Jc" = ( /obj/effect/spawner/structure/window/reinforced/shuttle, /turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"Ji" = ( -/obj/machinery/door/airlock/external/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, +"Jd" = ( +/obj/machinery/power/shieldwallgen/unlocked, /obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"Jn" = ( -/obj/item/stack/ore/iron{ - pixel_x = -3; - pixel_y = 9 +/area/awaymission/moonoutpost19/research) +"Je" = ( +/obj/structure/grille/broken, +/obj/item/stack/rods, +/obj/item/stack/rods, +/obj/item/shard{ + icon_state = "medium" }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"Jl" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 3 }, -/area/awaymission/moonoutpost19/main) +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/machinery/door/poddoor/shutters{ + id = "awaykitchen"; + name = "Serving Hatch" + }, +/turf/open/floor/carpet, +/area/awaymission/moonoutpost19/arrivals) "Jq" = ( /obj/item/stack/ore/uranium, /turf/open/misc/asteroid/moon/dug, /area/awaymission/moonoutpost19/mines) -"Jx" = ( -/obj/effect/decal/cleanable/generic, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 10 +"Jt" = ( +/obj/machinery/light/small/broken/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Xenobiology"; + network = list("mo19","mo19r") }, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"JA" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 +/turf/open/floor/iron/white/side{ + dir = 6 }, -/obj/effect/turf_decal/tile/red{ - dir = 4 +/area/awaymission/moonoutpost19/research) +"Ju" = ( +/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/red{ +/obj/effect/turf_decal/tile/purple{ dir = 8 }, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"Jw" = ( +/obj/structure/alien/weeds/node, +/mob/living/simple_animal/hostile/alien/drone{ + plants_off = 1 + }, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) +"Jz" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable, /turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/syndicate) -"JB" = ( -/obj/structure/closet/secure_closet/personal/cabinet{ - locked = 0; - req_access = "150" - }, -/obj/item/stack/spacecash/c50, -/turf/open/floor/wood, +"JD" = ( +/obj/structure/chair/stool/directional/south, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/syndicate) -"JC" = ( -/obj/item/toy/beach_ball/baseball{ - pixel_x = 11; - pixel_y = -4 - }, -/obj/item/toy/beach_ball/baseball{ - pixel_x = -11; - pixel_y = -4 +"JF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 }, -/obj/item/toy/beach_ball/baseball{ - pixel_y = 4 +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, +/area/awaymission/moonoutpost19/syndicate) +"JH" = ( +/obj/structure/alien/weeds, +/obj/structure/flora/lunar_plant, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/main) -"JD" = ( -/obj/item/stack/ore/slag, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/area/awaymission/moonoutpost19/mines) +"JI" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/area/awaymission/moonoutpost19/main) -"JE" = ( -/obj/item/cigbutt, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"JJ" = ( +/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"JP" = ( +/area/awaymission/moonoutpost19/syndicate) +"JL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"JO" = ( +/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, +/area/awaymission/moonoutpost19/syndicate) +"JQ" = ( +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/syndicate) +"JS" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 }, @@ -5840,17 +5452,6 @@ temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) -"JR" = ( -/obj/effect/baseturf_helper/asteroid/moon, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"JT" = ( -/obj/machinery/door/airlock/maintenance, -/obj/machinery/duct, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) "JV" = ( /obj/structure/sink{ dir = 4; @@ -5859,246 +5460,197 @@ }, /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"JW" = ( -/obj/item/cigbutt, -/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/awaymission/moonoutpost19/arrivals) -"Ke" = ( -/obj/structure/alien/weeds/node, -/obj/effect/decal/cleanable/blood/drip, +"Kb" = ( +/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/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/main) -"Kf" = ( -/obj/structure/lattice/catwalk, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/area/awaymission/moonoutpost19/hive) +"Kh" = ( +/obj/item/soap/nanotrasen{ + pixel_x = -3; + pixel_y = 9 }, -/area/awaymission/moonoutpost19/main) -"Km" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/turf/open/floor/plating, +/obj/machinery/light/small/directional/west, +/obj/machinery/duct, +/turf/open/floor/iron/freezer, /area/awaymission/moonoutpost19/arrivals) -"Kr" = ( -/obj/structure/flora/rock/style_random{ - pixel_y = -2 +"Kk" = ( +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/arrivals) +"Kp" = ( +/obj/structure/closet/crate/bin, +/obj/item/trash/candy, +/obj/item/trash/can, +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, +/obj/item/stack/sheet/mineral/plasma, +/turf/open/floor/iron/white/corner, +/area/awaymission/moonoutpost19/arrivals) +"Ky" = ( +/turf/open/floor/iron/white/side, +/area/awaymission/moonoutpost19/research) +"KA" = ( /obj/structure/alien/weeds, +/mob/living/simple_animal/hostile/alien/drone{ + plants_off = 1 + }, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/mines) -"Ks" = ( -/obj/machinery/airalarm/directional/north{ - req_access = "150" - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +"KF" = ( +/obj/item/banner/command/mundane{ + desc = "The banner of Central Command, impaled into the rock upon first landing on this moon."; + name = "command claim banner"; + pixel_x = -1; + pixel_y = 15 }, -/obj/effect/mapping_helpers/airalarm/unlocked, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"Kw" = ( -/obj/machinery/mineral/processing_unit_console{ - pixel_x = -4; - pixel_y = 2 +/obj/structure/stone_tile/surrounding/burnt, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, +/area/awaymission/moonoutpost19/main) +"KL" = ( /obj/structure/table, -/obj/item/reagent_containers/cup/glass/mug/tea{ - pixel_x = 11; - pixel_y = 7 +/obj/item/clothing/gloves/latex, +/obj/item/clothing/mask/surgical, +/obj/item/clothing/suit/apron/surgical, +/obj/structure/alien/weeds, +/turf/open/floor/iron/white/side{ + dir = 1 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/area/awaymission/moonoutpost19/research) +"Lc" = ( +/obj/machinery/conveyor{ + id = "awaysyndie" }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 8 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, +/obj/structure/railing/corner, /turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) -"Kx" = ( -/mob/living/simple_animal/hostile/construct/proteon/hostile, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/mines) -"KC" = ( -/obj/vehicle/ridden/atv{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +"Lf" = ( +/obj/machinery/power/floodlight{ + anchored = 1 }, +/obj/structure/cable, +/obj/structure/lattice/catwalk, /turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"KM" = ( -/obj/item/stack/ore/iron{ - pixel_x = 7; - pixel_y = -6 - }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, /area/awaymission/moonoutpost19/main) -"KQ" = ( -/obj/structure/alien/weeds/node, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"Lk" = ( +/obj/machinery/light/small/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/area/awaymission/moonoutpost19/hive) -"KR" = ( -/obj/structure/rack, +/area/awaymission/moonoutpost19/arrivals) +"Ll" = ( +/obj/machinery/duct, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"Lm" = ( +/obj/structure/ore_box, /obj/structure/lattice/catwalk, -/obj/item/pickaxe, -/obj/item/t_scanner, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/mines) -"KU" = ( -/obj/effect/turf_decal/stripes/asteroid/line, -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/main) -"KV" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/lunar_sand, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"Lg" = ( -/obj/machinery/shower{ - dir = 4; - name = "emergency shower" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/sign/warning/secure_area/directional/west, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"Lh" = ( -/obj/structure/table, -/obj/item/stack/sheet/mineral/plasma, -/obj/machinery/light/small/broken/directional/north, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/structure/alien/weeds, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"Li" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +"Lp" = ( +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/highsecurity{ + name = "Gateway"; + req_access = "150" }, +/obj/structure/cable, /turf/open/floor/iron, /area/awaymission/moonoutpost19/syndicate) -"Lq" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/machinery/airalarm/directional/north{ - req_access = "150" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +"LA" = ( +/obj/item/stack/ore/iron{ + pixel_x = -3; + pixel_y = 9 }, -/obj/effect/mapping_helpers/airalarm/unlocked, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) -"Lr" = ( -/obj/structure/trap/cult, -/obj/effect/decal/cleanable/blood/drip, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/mines) -"Lw" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"LB" = ( -/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 +/area/awaymission/moonoutpost19/main) +"LC" = ( +/obj/item/stack/rods, +/obj/item/shard{ + icon_state = "small" }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) "LG" = ( /turf/closed/mineral/random/high_chance, /area/awaymission/moonoutpost19/main) "LH" = ( -/obj/structure/flora/rock/style_random{ - pixel_y = -2 - }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/mines) -"LJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/ash, -/obj/effect/turf_decal/siding/thinplating_new/light{ +/obj/machinery/light/floor, +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"LO" = ( -/obj/item/stack/tile/iron, -/obj/effect/decal/cleanable/crayon, +/obj/effect/turf_decal/lunar_sand/plating, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) +"LK" = ( +/obj/item/stack/ore/iron, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"LP" = ( -/obj/structure/fluff/minepost, -/obj/item/stack/sheet/mineral/uranium/five, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"LL" = ( +/obj/structure/sign/poster/official/nanotrasen_logo/directional/south, +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/area/awaymission/moonoutpost19/mines) +/turf/open/floor/iron/white/corner, +/area/awaymission/moonoutpost19/arrivals) "LQ" = ( /obj/effect/decal/cleanable/blood/tracks{ dir = 4 }, /turf/open/misc/asteroid/moon/dug, /area/awaymission/moonoutpost19/main) -"LV" = ( -/obj/machinery/door/airlock/engineering{ - name = "Power Maintenance"; - req_access = "150" +"LU" = ( +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"LW" = ( +/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/structure/cable, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) +/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/awaymission/moonoutpost19/arrivals) "LX" = ( /obj/structure/closet/secure_closet/personal/cabinet{ locked = 0; @@ -6108,88 +5660,60 @@ /obj/item/stack/sheet/mineral/plasma/five, /turf/open/floor/carpet/orange, /area/awaymission/moonoutpost19/arrivals) -"LZ" = ( -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/arrivals) -"Me" = ( -/obj/item/stack/rods, -/obj/item/shard{ - pixel_x = -6; - pixel_y = 4 - }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"Mg" = ( -/obj/effect/turf_decal/lunar_sand/plating, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating{ +"LY" = ( +/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/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/syndicate) -"Mi" = ( -/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, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, +/area/awaymission/moonoutpost19/hive) +"Mf" = ( +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/blood/drip, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) +"Mh" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/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, +/area/awaymission/moonoutpost19/syndicate) "Mj" = ( /obj/structure/alien/weeds/node, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/engine, /area/awaymission/moonoutpost19/research) -"Ml" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/apc/full_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/mapping_helpers/apc/cell_10k, -/obj/effect/turf_decal/tile/purple, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"Mo" = ( -/obj/structure/fluff/meteor/large, +"Mt" = ( +/obj/structure/table, +/obj/item/toy/cards/deck, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/arrivals) +"Mw" = ( +/obj/structure/alien/weeds/node, +/obj/effect/decal/cleanable/blood/drip, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"Mp" = ( -/obj/structure/chair/stool/directional/south, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"Mq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"Mv" = ( +"My" = ( /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/mines) -"Mx" = ( -/obj/item/radio/intercom/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plastic, -/area/awaymission/moonoutpost19/arrivals) +/area/awaymission/moonoutpost19/main) "MC" = ( /obj/structure/table, /obj/item/kitchen/rollingpin, @@ -6201,18 +5725,29 @@ dir = 5 }, /area/awaymission/moonoutpost19/arrivals) -"MI" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"MJ" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +"MD" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/item/radio/off{ + pixel_x = 8; + pixel_y = 17 }, -/obj/effect/turf_decal/lunar_sand/plating, /turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"MF" = ( +/obj/structure/flora/rock/style_random{ + pixel_y = -2 + }, +/obj/item/trash/peanuts, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) +"MG" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) "MM" = ( /obj/effect/mapping_helpers/broken_floor, @@ -6227,9 +5762,17 @@ dir = 5 }, /area/awaymission/moonoutpost19/arrivals) -"MU" = ( -/obj/machinery/duct, +"MQ" = ( +/obj/item/newspaper, +/obj/structure/cable, /turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"MS" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 10 + }, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) "MW" = ( /obj/structure/table, @@ -6238,26 +5781,69 @@ }, /turf/open/floor/pod/dark, /area/awaymission/moonoutpost19/tent) -"Na" = ( -/obj/structure/alien/weeds, -/obj/effect/turf_decal/tile/purple, -/obj/structure/cable, -/turf/open/floor/iron/white, +"Nf" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"Ng" = ( +/obj/structure/marker_beacon/burgundy, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) +"Nj" = ( +/turf/open/floor/plating, /area/awaymission/moonoutpost19/research) -"Nb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 +"Nk" = ( +/obj/structure/closet/secure_closet{ + icon_state = "science"; + locked = 0; + name = "scientist's locker"; + req_access = "201" }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +/obj/item/clothing/suit/toggle/labcoat, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"Nm" = ( +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"No" = ( +/obj/item/reagent_containers/cup/bowl, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/syndicate) -"Nj" = ( +/area/awaymission/moonoutpost19/main) +"Np" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/blood/gibs/up, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/mines) +"Nq" = ( +/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, +/obj/structure/sign/warning/electric_shock/directional/east, /turf/open/floor/plating, /area/awaymission/moonoutpost19/research) +"Nr" = ( +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/external/ruin{ + density = 0; + icon_state = "open"; + opacity = 0 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/syndicate) "Nt" = ( /obj/effect/turf_decal/tile/dark/opposingcorners{ dir = 1 @@ -6266,53 +5852,77 @@ dir = 5 }, /area/awaymission/moonoutpost19/research) -"Nu" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/egg/burst, -/obj/effect/decal/cleanable/blood, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"Nv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/area/awaymission/moonoutpost19/hive) -"Nz" = ( -/obj/item/kirbyplants{ - desc = "A plastic potted plant."; - pixel_y = 3 +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) +"ND" = ( +/obj/structure/mecha_wreckage/ripley/mk2{ + desc = "Remains of the historical mech that first touched down on Moon Outpost 19. Completely irreparable, but perhaps something can be salvaged."; + name = "\improper Historical Ripley MK-II wreckage" }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"NB" = ( -/obj/vehicle/ridden/atv{ - dir = 4 +/obj/effect/decal/cleanable/oil, +/obj/item/food/grown/moonflower{ + pixel_x = 7; + pixel_y = -18 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"NH" = ( -/obj/structure/alien/weeds/node, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/mines) -"NK" = ( +/area/awaymission/moonoutpost19/main) +"NF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor/closed, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/decal/cleanable/greenglow, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"NG" = ( +/obj/structure/alien/weeds/node, /obj/structure/alien/resin/wall, -/obj/structure/alien/weeds, -/obj/structure/alien/weeds, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/mines) -"NO" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 +/area/awaymission/moonoutpost19/main) +"NJ" = ( +/obj/machinery/power/shieldwallgen/unlocked, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"NL" = ( +/obj/structure/closet/secure_closet{ + icon_state = "sec"; + name = "security officer's locker"; + req_access = "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/cup/glass/bottle/beer{ + pixel_x = -3; + pixel_y = -2 + }, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 }, -/obj/item/multitool, -/obj/effect/turf_decal/siding/thinplating_new/light, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) +/area/awaymission/moonoutpost19/research) +"NM" = ( +/obj/structure/chair/pew/left{ + dir = 8 + }, +/obj/item/clothing/head/soft, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) "NQ" = ( /obj/item/shovel{ pixel_x = -7 @@ -6320,24 +5930,102 @@ /obj/structure/fluff/meteor, /turf/open/misc/asteroid/basalt, /area/awaymission/moonoutpost19/main) -"NV" = ( +"NR" = ( +/obj/structure/table/reinforced, /obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood/drip, +/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, +/area/awaymission/moonoutpost19/research) +"NS" = ( +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/arrivals) +"NU" = ( +/mob/living/simple_animal/hostile/alien/drone{ + plants_off = 1 + }, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"Oh" = ( -/turf/closed/indestructible/reinforced, -/area/awaymission/moonoutpost19/arrivals) -"Om" = ( -/obj/structure/fence/cut/large{ - dir = 8 +"NW" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, +/area/awaymission/moonoutpost19/syndicate) +"Oa" = ( +/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, +/area/awaymission/moonoutpost19/research) +"Ob" = ( +/obj/item/clothing/head/soft, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) +"Od" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"Oj" = ( +/obj/structure/table/rolling, +/obj/item/clothing/mask/facehugger/impregnated{ + pixel_y = 5 + }, +/obj/structure/microscope{ + pixel_y = 11 + }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"Oq" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/resin/membrane, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/mines) +"Or" = ( +/obj/item/cigbutt, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"Os" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/decal/cleanable/generic, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/arrivals) +"Ot" = ( +/obj/structure/lattice/catwalk, +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/main) "Ou" = ( /obj/structure/table/wood, /obj/item/lighter, @@ -6345,19 +6033,46 @@ /obj/item/clothing/mask/cigarette/cigar, /turf/open/floor/carpet/orange, /area/awaymission/moonoutpost19/arrivals) -"Ow" = ( -/obj/structure/table/rolling, -/obj/item/clothing/mask/facehugger/impregnated{ - pixel_y = 5 - }, -/obj/structure/microscope{ - pixel_y = 11 +"Ov" = ( +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"Oz" = ( +/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, +/area/awaymission/moonoutpost19/syndicate) +"OA" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/moonoutpost19/research) -"OD" = ( +"OC" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"OG" = ( +/obj/effect/turf_decal/sand/plating, +/obj/item/emptysandbag, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"OJ" = ( +/obj/structure/closet/l3closet, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) +"OK" = ( /obj/effect/turf_decal/stripes/asteroid/line{ - dir = 5 + dir = 9 }, /obj/effect/turf_decal/lunar_sand/plating, /turf/open/floor/plating{ @@ -6365,76 +6080,149 @@ temperature = 251 }, /area/awaymission/moonoutpost19/main) -"OF" = ( -/obj/item/stack/rods{ - pixel_x = 3 +"OL" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/turf/open/floor/iron/white/corner{ + dir = 1 }, -/area/awaymission/moonoutpost19/main) -"OI" = ( -/obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/area/awaymission/moonoutpost19/arrivals) +"OM" = ( +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/area/awaymission/moonoutpost19/hive) -"OP" = ( -/obj/structure/fence{ - dir = 4 +/area/awaymission/moonoutpost19/syndicate) +"OO" = ( +/obj/machinery/power/smes{ + charge = 1.5e+006; + input_level = 10000; + inputting = 0; + output_level = 15000 }, /obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"OQ" = ( +/obj/structure/trap/cult, +/obj/effect/decal/cleanable/blood/drip, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, +/area/awaymission/moonoutpost19/mines) +"OR" = ( +/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, +/area/awaymission/moonoutpost19/research) +"OS" = ( +/obj/effect/turf_decal/stripes/asteroid/line, +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, /area/awaymission/moonoutpost19/main) -"OU" = ( -/obj/structure/alien/weeds/node, +"OT" = ( +/obj/structure/marker_beacon/burgundy, +/obj/structure/cable, +/obj/structure/lattice/catwalk, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"Pa" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular, +"OV" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"OW" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/airalarm/directional/north, /obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/iron/white/side{ - dir = 8 +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/area/awaymission/moonoutpost19/research) -"Pc" = ( -/obj/machinery/light/small/directional/west, +/obj/structure/cable, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"OY" = ( +/obj/structure/rack, +/obj/structure/lattice/catwalk, +/obj/item/pickaxe, +/obj/item/t_scanner, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/arrivals) -"Pp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"Ps" = ( -/obj/structure/flora/rock/style_random{ - pixel_y = -2 +/area/awaymission/moonoutpost19/mines) +"Pf" = ( +/obj/item/flashlight/flare{ + on = 1 }, -/obj/item/trash/peanuts, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/main) -"Pt" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ +/area/awaymission/moonoutpost19/mines) +"Ph" = ( +/obj/effect/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + dir = 8; + icon_state = "ltrails_2" + }, +/obj/effect/decal/cleanable/blood/tracks{ dir = 4 }, -/obj/effect/turf_decal/tile/red{ - dir = 8 +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/main) +"Pk" = ( +/obj/structure/closet/crate/freezer, +/obj/structure/alien/weeds, +/obj/item/xenos_claw{ + pixel_x = -5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"Pn" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/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, /area/awaymission/moonoutpost19/syndicate) +"Po" = ( +/obj/item/stack/ore/glass{ + pixel_x = 8; + pixel_y = 9 + }, +/obj/item/stack/ore/glass{ + pixel_x = -6 + }, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) "Pu" = ( /obj/effect/decal/cleanable/xenoblood{ desc = "It's green and acidic. Nothing good could come of this..." @@ -6442,282 +6230,294 @@ /obj/structure/fluff/meteor/large, /turf/open/misc/asteroid/basalt, /area/awaymission/moonoutpost19/main) -"Pw" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/window/reinforced/spawner/directional/east{ - 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{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) "Px" = ( /obj/item/stack/ore/gold{ amount = 7 }, /turf/open/misc/asteroid/moon/dug, /area/awaymission/moonoutpost19/mines) -"PB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor/closed, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/decal/cleanable/greenglow, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"PG" = ( +"Py" = ( +/obj/item/stack/rods, +/obj/item/shard{ + icon_state = "small"; + pixel_x = 7; + pixel_y = -7 + }, /obj/effect/decal/cleanable/blood/tracks{ desc = "Your instincts say you shouldn't be following these."; - dir = 8; + dir = 9; icon_state = "ltrails_1" }, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/research) -"PK" = ( -/obj/item/key/atv{ - pixel_x = -6; - pixel_y = 26 - }, -/obj/structure/noticeboard/directional/north{ - pixel_x = -15; - pixel_y = 26 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"PL" = ( -/obj/structure/alien/weeds/node, -/mob/living/simple_animal/hostile/alien/drone{ - plants_off = 1 - }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/hive) -"PM" = ( -/obj/structure/cable, -/obj/structure/fluff/tram_rail/end, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"PO" = ( -/obj/effect/turf_decal/tile/neutral{ +"Pz" = ( +/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 }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron{ +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"PE" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, -/area/awaymission/moonoutpost19/arrivals) +/area/awaymission/moonoutpost19/main) +"PF" = ( +/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, +/area/awaymission/moonoutpost19/research) +"PG" = ( +/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/dark, +/area/awaymission/moonoutpost19/research) +"PI" = ( +/obj/structure/ore_box, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) "PP" = ( /obj/item/stack/ore/silver{ amount = 11 }, /turf/open/misc/asteroid/moon/dug, /area/awaymission/moonoutpost19/mines) -"PQ" = ( -/obj/structure/alien/resin/wall, +"PR" = ( +/obj/structure/bed, +/obj/item/bedsheet/syndie, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/awaymission/moonoutpost19/syndicate) +"PS" = ( +/obj/structure/bed/dogbed/runtime, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/mines) -"Qb" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 6 +/area/awaymission/moonoutpost19/main) +"PU" = ( +/turf/closed/indestructible/reinforced, +/area/awaymission/moonoutpost19/arrivals/shed) +"PV" = ( +/obj/structure/toilet{ + dir = 1 }, -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/syndicate) +"PY" = ( +/obj/structure/alien/weeds, +/obj/structure/flora/lunar_plant, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/arrivals) +/area/awaymission/moonoutpost19/main) +"Qa" = ( +/obj/item/stack/ore/titanium, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/mines) "Qe" = ( /turf/closed/mineral/random/high_chance, /area/awaymission/moonoutpost19/mines) -"Qi" = ( -/obj/machinery/door/airlock/external/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"Qj" = ( -/obj/effect/decal/cleanable/oil, -/obj/machinery/duct, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"Ql" = ( -/obj/structure/reagent_dispensers/plumbed, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"Qt" = ( -/obj/item/shard{ - pixel_x = -3 +"Qf" = ( +/obj/machinery/power/shuttle_engine/propulsion/burst/right{ + dir = 4 }, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/main) -"Qu" = ( -/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 +/area/awaymission/moonoutpost19/arrivals) +"Qg" = ( +/obj/machinery/door/firedoor/closed, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"Qj" = ( +/obj/effect/turf_decal/lunar_sand, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) +"Qm" = ( +/obj/machinery/shower{ + dir = 8 }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/arrivals) +"Qn" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "line"; + rotation = 90 }, -/area/awaymission/moonoutpost19/hive) -"Qw" = ( /obj/effect/decal/cleanable/crayon{ - icon_state = "line" + icon_state = "line"; + rotation = 90 }, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"Qx" = ( -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/pod/light, -/area/awaymission/moonoutpost19/tent) -"Qz" = ( -/obj/item/ammo_casing/spent, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/mines) -"QD" = ( -/obj/structure/ore_box, -/obj/structure/lattice/catwalk, +"Qo" = ( +/obj/item/stack/ore/diamond, +/obj/effect/decal/cleanable/blood/drip, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/mines) -"QH" = ( -/obj/effect/decal/cleanable/blood/drip, +"Qp" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/resin/wall, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"QJ" = ( -/obj/item/shard{ - icon_state = "small" +"Qq" = ( +/obj/machinery/door/airlock/medical{ + name = "Research Division"; + req_access = "201" }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"Qr" = ( +/obj/machinery/duct, +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/arrivals) +"Qs" = ( +/obj/structure/cable, +/obj/structure/fluff/tram_rail/floor, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"QK" = ( -/obj/item/stack/ore/iron, +"Qx" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/pod/light, +/area/awaymission/moonoutpost19/tent) +"Qy" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"QA" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/egg/burst, +/obj/effect/decal/cleanable/blood, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/mines) -"QL" = ( -/obj/structure/alien/weeds/node, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/structure/sign/warning/biohazard/directional/north, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +/area/awaymission/moonoutpost19/hive) +"QG" = ( +/obj/machinery/door/airlock/maintenance{ + req_access = "201" }, -/area/awaymission/moonoutpost19/syndicate) -"QM" = ( -/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/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + dir = 8; + icon_state = "ltrails_1" }, -/obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, -/obj/structure/sign/warning/electric_shock/directional/east, /turf/open/floor/plating, /area/awaymission/moonoutpost19/research) -"QP" = ( -/obj/structure/alien/weeds/node, -/mob/living/simple_animal/hostile/alien/drone{ - plants_off = 1 +"QI" = ( +/obj/structure/chair{ + dir = 8 }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 }, -/area/awaymission/moonoutpost19/mines) +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"QQ" = ( +/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 + }, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"QR" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) "QS" = ( /turf/open/misc/asteroid/moon/dug, /area/awaymission/moonoutpost19/main) -"QT" = ( -/obj/item/melee/baseball_bat, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"QV" = ( +"QZ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"QW" = ( -/obj/effect/decal/cleanable/xenoblood/xgibs/limb, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"Rb" = ( -/obj/item/stack/ore/iron{ - pixel_x = -7; - pixel_y = -4 - }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"Rd" = ( -/obj/effect/decal/cleanable/crayon{ - icon_state = "line"; - rotation = 90 - }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/item/ammo_casing/a357{ + pixel_x = 11; + pixel_y = 8 }, -/area/awaymission/moonoutpost19/main) -"Rh" = ( -/obj/structure/chair/pew{ +/obj/effect/turf_decal/siding/thinplating_new/light/corner{ dir = 8 }, -/obj/item/food/peanuts/salted, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"Ra" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/area/awaymission/moonoutpost19/main) -"Rj" = ( +/obj/structure/sign/poster/contraband/hacking_guide/directional/east, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"Re" = ( +/obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/obj/effect/turf_decal/siding/thinplating_new/light{ +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) +"Rk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/thinplating_new/light/corner{ + dir = 4 + }, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/arrivals) +"Rl" = ( +/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/anticorner/contrasted{ dir = 8 }, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) +/area/awaymission/moonoutpost19/research) "Rm" = ( /obj/effect/spawner/random/entertainment/arcade{ dir = 1 @@ -6735,95 +6535,89 @@ /obj/machinery/cell_charger, /turf/open/floor/pod/dark, /area/awaymission/moonoutpost19/tent) -"Rs" = ( -/obj/effect/decal/cleanable/blood/drip, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/mines) -"Rt" = ( -/obj/structure/disposaloutlet, -/obj/structure/disposalpipe/trunk{ +"Rq" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"Rx" = ( +/obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating{ +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, -/area/awaymission/moonoutpost19/main) -"RA" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, +/area/awaymission/moonoutpost19/syndicate) +"Rz" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"RI" = ( +/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, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/arrivals) +"RJ" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"RK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/sand, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"RP" = ( +/obj/item/melee/baseball_bat, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"RB" = ( -/obj/item/bodybag/environmental, +"RW" = ( +/obj/structure/fluff/minepost, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"RC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/arrivals) -"RD" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/thinplating_new/light, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"RE" = ( -/obj/structure/closet/crate/bin, -/obj/item/trash/candy, -/obj/item/trash/can, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/item/stack/sheet/mineral/plasma, -/turf/open/floor/iron/white/corner, -/area/awaymission/moonoutpost19/arrivals) -"RL" = ( +"RX" = ( +/obj/item/cigbutt, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, +/obj/structure/table/wood, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"RN" = ( -/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/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"RY" = ( +/obj/effect/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + dir = 8; + icon_state = "ltrails_1" }, -/area/awaymission/moonoutpost19/hive) -"RR" = ( -/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/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/lunar_sand, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/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" +/area/awaymission/moonoutpost19/arrivals) +"Sa" = ( +/obj/item/trash/candy, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"RU" = ( -/obj/structure/bed, -/obj/item/bedsheet/syndie, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/awaymission/moonoutpost19/syndicate) +/area/awaymission/moonoutpost19/main) "Sc" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/oven, @@ -6842,30 +6636,72 @@ dir = 5 }, /area/awaymission/moonoutpost19/research) -"Se" = ( -/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 +"Sf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/syndicate) "Si" = ( -/obj/machinery/shower{ +/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/freezer, -/area/awaymission/moonoutpost19/arrivals) +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"Sj" = ( +/obj/item/radio/intercom/directional/west, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plastic, +/area/awaymission/moonoutpost19/arrivals/shed) "Sk" = ( /obj/structure/bed, /obj/item/bedsheet, /obj/effect/decal/cleanable/blood, /turf/open/floor/carpet/red, /area/awaymission/moonoutpost19/arrivals) +"Sl" = ( +/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, +/area/awaymission/moonoutpost19/syndicate) +"Sn" = ( +/obj/structure/lattice/catwalk, +/obj/structure/tank_holder/extinguisher, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) +"So" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/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, +/area/awaymission/moonoutpost19/syndicate) "Sp" = ( /obj/machinery/computer/security/telescreen/entertainment/directional/south, /obj/machinery/light/small/broken/directional/south, @@ -6881,33 +6717,12 @@ dir = 5 }, /area/awaymission/moonoutpost19/research) -"Sw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"Sz" = ( -/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 +"Sv" = ( +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 8 }, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"SA" = ( -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, /area/awaymission/moonoutpost19/arrivals) "SD" = ( /obj/item/trash/can{ @@ -6923,32 +6738,43 @@ }, /turf/open/misc/asteroid/moon/dug, /area/awaymission/moonoutpost19/main) -"SF" = ( -/obj/machinery/light/small/directional/north, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"SE" = ( +/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" }, -/area/awaymission/moonoutpost19/arrivals) -"SI" = ( -/obj/item/stack/sheet/mineral/wood, -/obj/structure/lattice/catwalk, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/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" }, -/area/awaymission/moonoutpost19/mines) -"SN" = ( +/obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"SG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/loading_area, +/obj/structure/alien/weeds, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/syndicate) +"SK" = ( +/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/blood/tracks{ + dir = 4 + }, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"SQ" = ( -/obj/machinery/shower{ - pixel_y = 16 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/arrivals) "SX" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/purple{ @@ -6961,30 +6787,52 @@ dir = 5 }, /area/awaymission/moonoutpost19/research) -"Ta" = ( -/obj/item/reagent_containers/cup/bowl, +"SZ" = ( +/obj/structure/flora/rock/pile, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"Tk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/opposingcorners, +"Td" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) +"Te" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"Tg" = ( +/obj/machinery/duct, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"Th" = ( +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"Tn" = ( -/obj/structure/rack, -/obj/structure/lattice/catwalk, -/obj/item/pickaxe, -/obj/item/emptysandbag, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"Ti" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"Tm" = ( +/obj/machinery/power/smes{ + input_level = 10000; + inputting = 0; + output_level = 15000 }, -/area/awaymission/moonoutpost19/mines) +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) "Ts" = ( /obj/machinery/newscaster/directional/south, /obj/effect/turf_decal/siding/purple, @@ -6995,14 +6843,6 @@ dir = 5 }, /area/awaymission/moonoutpost19/research) -"Tt" = ( -/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/moonoutpost19/syndicate) "Tx" = ( /obj/item/storage/secure/safe/directional/east, /obj/effect/decal/cleanable/blood/splatter, @@ -7013,76 +6853,105 @@ }, /turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/research) -"Ty" = ( -/obj/structure/alien/weeds, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"Tz" = ( +/obj/machinery/power/shuttle_engine/propulsion/burst/left{ + dir = 4 }, -/area/awaymission/moonoutpost19/main) -"TG" = ( -/obj/item/stack/ore/slag, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/mines) -"TJ" = ( -/obj/structure/lattice/catwalk, -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/main) -"TN" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/light/small/directional/west, -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/arrivals) -"TP" = ( -/obj/structure/reagent_dispensers/fueltank/large, -/turf/open/floor/plastic, /area/awaymission/moonoutpost19/arrivals) -"TQ" = ( -/obj/structure/alien/weeds/node, -/obj/structure/alien/resin/wall, +"TA" = ( +/obj/structure/toilet{ + dir = 1 + }, +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/research) +"TB" = ( +/obj/item/stack/sheet/mineral/wood, +/obj/item/circular_saw, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"TT" = ( -/obj/structure/flora/lunar_plant, -/obj/item/stack/ore/iron, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"TE" = ( +/obj/item/kirbyplants{ + desc = "A plastic potted plant."; + pixel_y = 3 }, -/area/awaymission/moonoutpost19/mines) -"TU" = ( -/obj/structure/ore_box, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/area/awaymission/moonoutpost19/main) -"TW" = ( -/obj/structure/sink{ - pixel_y = 28 +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/arrivals) +"TH" = ( +/obj/structure/table, +/obj/item/storage/box/gloves, +/turf/open/floor/iron/white/corner{ + dir = 8 }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/freezer, /area/awaymission/moonoutpost19/research) -"TY" = ( -/obj/item/key/atv{ - pixel_x = 12; - pixel_y = 24 +"TM" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/obj/item/flashlight{ - pixel_x = -3; - pixel_y = 4 +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"TN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) +"TR" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"TS" = ( +/obj/item/cigbutt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"Ud" = ( +/obj/structure/bed, +/obj/item/bedsheet/syndie, +/obj/machinery/button/door/directional/north{ + id = "awaydorm4"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 }, -/obj/structure/rack, -/obj/item/flashlight, +/turf/open/floor/wood{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/syndicate) +"Ue" = ( +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"Ug" = ( -/obj/effect/turf_decal/lunar_sand, +"Uh" = ( +/obj/machinery/space_heater, +/obj/machinery/light/small/directional/north, +/obj/structure/sign/poster/official/build/directional/north, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"Uj" = ( +/obj/structure/cable, +/obj/structure/fluff/tram_rail/end, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) +"Ul" = ( +/obj/machinery/space_heater, +/obj/effect/decal/cleanable/generic, +/obj/structure/window/spawner/directional/south, /turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) "Um" = ( @@ -7098,26 +6967,31 @@ }, /turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/research) -"Un" = ( -/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, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +"Ur" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = 11 }, +/obj/structure/mirror/broken/directional/east, +/turf/open/floor/iron/freezer, /area/awaymission/moonoutpost19/arrivals) -"Us" = ( -/obj/structure/fence/post{ +"Uu" = ( +/obj/structure/cable, +/obj/effect/turf_decal/lunar_sand, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"Uv" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/asteroid/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/asteroid/corner{ dir = 4 }, -/obj/structure/sign/warning, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, /area/awaymission/moonoutpost19/main) "Uw" = ( @@ -7127,21 +7001,24 @@ }, /turf/open/floor/pod/dark, /area/awaymission/moonoutpost19/tent) -"UA" = ( -/obj/effect/decal/cleanable/xenoblood/xgibs/larva/body, +"Uy" = ( +/obj/structure/table, +/obj/item/paper/fluff/awaymissions/moonoutpost19/log/ivan, +/obj/item/storage/box/emptysandbags{ + pixel_x = 6; + pixel_y = 9 + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"UI" = ( +/obj/structure/alien/weeds, +/mob/living/simple_animal/hostile/alien/drone{ + plants_off = 1 + }, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/main) -"UG" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) +/area/awaymission/moonoutpost19/hive) "UO" = ( /obj/structure/closet/crate/miningcar{ desc = "A mining cart. It's caked with old basalt and lunar debris."; @@ -7149,65 +7026,68 @@ }, /turf/open/misc/asteroid/basalt, /area/awaymission/moonoutpost19/main) -"UP" = ( -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) "US" = ( /turf/open/floor/carpet/orange, /area/awaymission/moonoutpost19/arrivals) -"UT" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/full_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/mapping_helpers/apc/cell_10k, -/obj/structure/cable, -/obj/effect/turf_decal/lunar_sand, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"UU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 10 +"UZ" = ( +/obj/machinery/shower{ + dir = 4; + name = "emergency shower" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/sign/warning/secure_area/directional/west, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"Va" = ( +/obj/machinery/light/small/directional/west, +/obj/item/storage/box, +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 }, +/obj/structure/table_frame/wood, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"UX" = ( -/obj/machinery/airalarm/directional/north{ - req_access = "150" +"Vi" = ( +/obj/item/ammo_casing/spent{ + pixel_x = -7; + pixel_y = 9 }, -/obj/effect/mapping_helpers/airalarm/unlocked, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +/obj/item/ammo_casing/spent{ + pixel_x = -7; + pixel_y = -6 }, -/area/awaymission/moonoutpost19/syndicate) -"Vb" = ( -/obj/structure/bed, -/obj/item/bedsheet/syndie, -/obj/machinery/button/door/directional/north{ - id = "awaydorm4"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 +/obj/item/ammo_casing/spent{ + pixel_x = 8; + pixel_y = 6 }, -/turf/open/floor/wood{ +/obj/item/ammo_casing/spent, +/turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, +/area/awaymission/moonoutpost19/mines) +"Vj" = ( +/obj/structure/cable, +/turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/syndicate) -"Vd" = ( -/obj/machinery/light/small/broken/directional/east, +"Vl" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, -/area/awaymission/moonoutpost19/syndicate) +/area/awaymission/moonoutpost19/arrivals) "Vp" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/button/door/directional/west{ @@ -7219,62 +7099,127 @@ dir = 5 }, /area/awaymission/moonoutpost19/arrivals) -"Vx" = ( -/obj/structure/grille, -/obj/machinery/duct, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"VB" = ( -/obj/machinery/shower{ +"Vt" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ dir = 1 }, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/arrivals) -"VC" = ( -/obj/structure/barricade/sandbags, -/obj/effect/turf_decal/sand, +/obj/item/chair{ + dir = 4; + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/chair/stool{ + pixel_x = -8; + pixel_y = -16 + }, +/obj/item/chair/stool{ + dir = 1; + pixel_x = -9; + pixel_y = 6 + }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"VI" = ( +"VH" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/tank_holder, -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 6 +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/syndicate) +"VJ" = ( +/obj/item/stack/ore/iron{ + pixel_x = 7; + pixel_y = -6 + }, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) +"VM" = ( +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"VN" = ( +/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/moonoutpost19/syndicate) +"VR" = ( +/obj/machinery/door/airlock/external/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"VK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/trash/candy, +"VS" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/blood/old, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/mines) +"VT" = ( +/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; + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/syndicate) +"VU" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/item/stack/ore/glass/basalt{ + pixel_x = -8; + pixel_y = -5 + }, +/obj/item/stack/sheet/mineral/wood{ + pixel_x = 9; + pixel_y = 8 + }, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) +"VW" = ( +/obj/effect/decal/cleanable/oil, /obj/machinery/duct, /turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"VQ" = ( -/obj/structure/cable, -/obj/structure/lattice/catwalk, -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/main) -"We" = ( -/obj/structure/alien/weeds, -/obj/structure/flora/lunar_plant, +"VX" = ( +/obj/item/stack/ore/iron, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/mines) +"Wg" = ( +/obj/structure/flora/rock/style_random{ + pixel_y = -2 + }, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"Wi" = ( -/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, +"Wh" = ( +/obj/effect/decal/cleanable/blood/old, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/hive) +/area/awaymission/moonoutpost19/main) "Wj" = ( /obj/structure/table/wood, /obj/machinery/newscaster/directional/north, @@ -7286,61 +7231,52 @@ }, /turf/open/floor/carpet/red, /area/awaymission/moonoutpost19/arrivals) -"Wm" = ( -/obj/structure/railing/corner{ - dir = 4 +"Ws" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/weeds, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/structure/railing/corner, -/obj/item/cigbutt{ - pixel_x = -9; - pixel_y = -6 +/area/awaymission/moonoutpost19/mines) +"Wu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/turf/open/floor/plastic, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"Wo" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ +"Ww" = ( +/obj/structure/table, +/obj/item/newspaper, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"Wz" = ( +/obj/machinery/power/terminal{ dir = 1 }, -/obj/item/chair{ - dir = 4; - pixel_x = -4; - pixel_y = 2 - }, -/obj/item/chair/stool{ - pixel_x = -8; - pixel_y = -16 +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/item/chair/stool{ - dir = 1; - pixel_x = -9; - pixel_y = 6 +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"WD" = ( +/obj/item/stack/rods, +/obj/item/shard{ + icon_state = "small" }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"Wp" = ( -/obj/item/stack/sheet/mineral/wood, -/obj/item/circular_saw, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/effect/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + dir = 8; + icon_state = "ltrails_1" }, -/area/awaymission/moonoutpost19/main) -"Wr" = ( -/obj/machinery/light/floor, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 }, -/obj/effect/turf_decal/lunar_sand/plating, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"WC" = ( -/obj/structure/alien/weeds, -/obj/structure/cable, -/turf/open/floor/iron/white/side, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/research) -"WH" = ( +"WE" = ( /obj/machinery/door/airlock/external/ruin, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -7348,194 +7284,176 @@ /obj/effect/turf_decal/lunar_sand/plating, /turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"WL" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 8 - }, -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating{ +"WF" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, -/area/awaymission/moonoutpost19/main) -"WN" = ( +/area/awaymission/moonoutpost19/arrivals) +"WP" = ( /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{ +/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, -/area/awaymission/moonoutpost19/syndicate) -"WO" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/east{ - c_tag = "Bar"; - network = list("mo19") +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"WS" = ( +/obj/structure/closet/secure_closet/freezer{ + locked = 0; + name = "refrigerator"; + req_access = "201" }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/item/reagent_containers/condiment/milk{ + pixel_x = 4 }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 +/obj/item/reagent_containers/condiment/milk, +/obj/item/reagent_containers/condiment/milk{ + pixel_x = -3 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"WV" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" +/obj/item/storage/fancy/egg_box, +/turf/open/floor/iron/showroomfloor{ + temperature = 273.15 }, -/obj/machinery/duct, -/turf/open/floor/iron/freezer, /area/awaymission/moonoutpost19/arrivals) +"WU" = ( +/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/machinery/button/door/directional/west{ + id = "Awaybiohazard"; + name = "Biohazard Shutter Control"; + req_access = "101" + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"WW" = ( +/obj/item/radio/off, +/obj/structure/sign/poster/official/safety_report/directional/north, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) "WX" = ( /obj/structure/closet/crate, /obj/item/storage/box/lights/mixed, /obj/item/poster/random_contraband, /turf/open/floor/plating, /area/awaymission/moonoutpost19/research) -"Xa" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"Xd" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_2" - }, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"Xe" = ( -/obj/structure/mecha_wreckage/ripley/mk2{ - desc = "Remains of the historical mech that first touched down on Moon Outpost 19. Completely irreparable, but perhaps something can be salvaged."; - name = "\improper Historical Ripley MK-II wreckage" - }, -/obj/effect/decal/cleanable/oil, -/obj/item/food/grown/moonflower{ - pixel_x = 7; - pixel_y = -18 +"WZ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, +/area/awaymission/moonoutpost19/syndicate) +"Xc" = ( +/obj/machinery/light/small/directional/south, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/main) -"Xh" = ( -/obj/item/stack/rods, -/obj/structure/grille/broken, -/obj/item/stack/rods, -/obj/item/shard{ - icon_state = "medium"; - pixel_x = -7; - pixel_y = 5 +/area/awaymission/moonoutpost19/arrivals) +"Xf" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"Xj" = ( +/obj/structure/table/optable, +/obj/structure/alien/weeds, +/turf/open/floor/iron/white/side{ + dir = 1 }, -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/area/awaymission/moonoutpost19/research) +"Xm" = ( +/obj/structure/closet/l3closet, +/obj/machinery/light/small/broken/directional/south, +/turf/open/floor/iron/white/side{ + dir = 1 }, -/area/awaymission/moonoutpost19/arrivals) -"Xi" = ( -/obj/effect/turf_decal/stripes/line, +/area/awaymission/moonoutpost19/research) +"Xp" = ( +/obj/machinery/firealarm/directional/east, +/obj/structure/alien/weeds, +/obj/effect/turf_decal/tile/purple, +/obj/structure/cable, /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"Xl" = ( -/obj/effect/decal/cleanable/crayon{ - icon_state = "line"; - rotation = 90 - }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "line"; - rotation = 90 - }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) "Xr" = ( /obj/effect/decal/cleanable/oil, /obj/structure/cable, /turf/open/floor/plating, /area/awaymission/moonoutpost19/research) -"Xw" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/item/crowbar{ - layer = 2.9; - pixel_x = 7; - pixel_y = -13 +"Xu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"Xz" = ( -/obj/structure/closet/firecloset{ - name = "fire-proof closet" - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/tank/internals/plasma/full{ - pixel_y = -8 +"Xv" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/resin/wall, +/obj/structure/alien/resin/wall, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/item/tank/internals/plasma/full{ - pixel_y = -4 +/area/awaymission/moonoutpost19/hive) +"Xw" = ( +/obj/item/key/atv{ + pixel_x = -6; + pixel_y = 26 }, -/obj/item/fuel_pellet, -/obj/item/fuel_pellet{ - pixel_y = 4 +/obj/structure/noticeboard/directional/north{ + pixel_x = -15; + pixel_y = 26 }, -/obj/item/fuel_pellet{ - pixel_y = 8 +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/obj/item/clothing/under/shorts/black, -/turf/open/floor/plastic, -/area/awaymission/moonoutpost19/arrivals) +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) "XA" = ( -/obj/structure/chair{ - dir = 1 +/obj/machinery/door/poddoor/shutters{ + id = "awaymission19atvs" }, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) +"XH" = ( +/obj/structure/lattice/catwalk, +/obj/structure/tank_holder/emergency_oxygen, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) +"XM" = ( +/turf/open/floor/iron/showroomfloor{ + temperature = 273.15 }, -/obj/effect/turf_decal/siding/wood/corner, -/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"XG" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock{ - density = 0; - icon_state = "open"; - id_tag = "awaydorm4"; - name = "Dorm 1"; - opacity = 0 +"XN" = ( +/obj/effect/decal/cleanable/xenoblood/xgibs/limb, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ +/area/awaymission/moonoutpost19/main) +"XO" = ( +/obj/structure/alien/weeds/node, +/turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/syndicate) -"XL" = ( -/obj/machinery/suit_storage_unit/standard_unit, -/obj/effect/turf_decal/lunar_sand, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) +/area/awaymission/moonoutpost19/hive) "XP" = ( /obj/item/reagent_containers/cup/glass/trophy/gold_cup{ desc = "For continued excellence in the field of archaeology."; @@ -7543,20 +7461,19 @@ }, /turf/closed/mineral/random, /area/awaymission/moonoutpost19/mines) +"XQ" = ( +/obj/effect/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + dir = 8; + icon_state = "ltrails_2" + }, +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) "XR" = ( /obj/effect/mapping_helpers/burnt_floor, /turf/closed/mineral/random, /area/awaymission/moonoutpost19/main) -"XU" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 9 - }, -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/main) "XV" = ( /obj/structure/closet/crate/miningcar{ desc = "A mining cart. It's caked with old basalt and lunar debris."; @@ -7567,47 +7484,82 @@ }, /turf/open/misc/asteroid/basalt, /area/awaymission/moonoutpost19/main) -"XY" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"Yc" = ( +/obj/structure/sink{ + pixel_y = 28 }, -/area/awaymission/moonoutpost19/main) -"Yo" = ( -/obj/structure/lattice/catwalk, -/obj/structure/marker_beacon/burgundy, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/machinery/light/small/directional/west, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/syndicate) +"Yd" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 }, -/area/awaymission/moonoutpost19/main) -"Yq" = ( -/obj/machinery/vending/medical{ - req_access = "201" +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 }, -/turf/open/floor/iron/white/side, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) +"Ye" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/research) -"Yr" = ( -/obj/item/stack/cable_coil/cut, +"Yh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/syndicate) +"Yk" = ( +/obj/effect/turf_decal/sand, +/obj/item/stack/ore/glass{ + pixel_x = 8 + }, +/obj/item/ammo_casing/a357{ + pixel_x = -10; + pixel_y = -7 + }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"Ym" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "line"; + rotation = 90 + }, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"Yx" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/glass/bottle/beer/almost_empty{ - pixel_x = -5; - pixel_y = 15 +"Yt" = ( +/obj/structure/chair/stool/directional/south, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 }, -/obj/item/reagent_containers/cup/glass/colocup{ - pixel_x = -9 +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"Yu" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/obj/machinery/button/door{ - id = "awaymission19atvs"; - name = "Biohazard Shutter Control"; - pixel_y = 8; - req_access = "201" +/area/awaymission/moonoutpost19/main) +"YD" = ( +/obj/item/kirbyplants{ + desc = "A plastic potted plant."; + pixel_y = 3 }, -/turf/open/floor/plastic, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) "YF" = ( /obj/structure/closet/secure_closet/personal/cabinet{ @@ -7617,30 +7569,33 @@ /obj/item/clothing/under/suit/burgundy, /turf/open/floor/carpet/royalblue, /area/awaymission/moonoutpost19/arrivals) -"YG" = ( -/mob/living/simple_animal/hostile/construct/proteon/hostile, -/obj/structure/flora/lunar_plant, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/mines) -"YK" = ( -/obj/structure/fence/post{ +"YI" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ dir = 4 }, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, /area/awaymission/moonoutpost19/main) -"YM" = ( -/obj/structure/table, -/obj/item/shard{ - icon_state = "medium" - }, -/turf/open/floor/iron/white/side{ +"YJ" = ( +/obj/structure/closet/emcloset, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ dir = 8 }, -/area/awaymission/moonoutpost19/research) +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) +"YK" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) "YO" = ( /obj/effect/turf_decal/siding/thinplating_new/light{ dir = 1 @@ -7649,51 +7604,79 @@ /obj/structure/frame/machine, /turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/arrivals) -"YP" = ( -/obj/structure/closet/crate{ - desc = "It's a storage unit for kitchen clothes and equipment."; - name = "Kitchen Crate" +"YR" = ( +/obj/effect/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + dir = 9; + icon_state = "ltrails_1" }, -/obj/item/storage/box/mousetraps{ - pixel_x = -1 +/obj/item/stack/ore/glass/basalt{ + pixel_x = 6 }, -/obj/item/clothing/under/suit/waiter{ - pixel_x = -6 +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/turf/open/floor/iron/showroomfloor{ - temperature = 273.15 +/area/awaymission/moonoutpost19/main) +"YS" = ( +/obj/machinery/shower{ + pixel_y = 16 }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/freezer, /area/awaymission/moonoutpost19/arrivals) -"YT" = ( -/obj/item/plate, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +"YV" = ( +/obj/machinery/mineral/processing_unit_console{ + pixel_x = -4; + pixel_y = 2 }, -/obj/structure/table/wood, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"YU" = ( -/obj/machinery/light/small/directional/south, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/structure/table, +/obj/item/reagent_containers/cup/glass/mug/tea{ + pixel_x = 11; + pixel_y = 7 }, -/area/awaymission/moonoutpost19/arrivals) -"YZ" = ( -/obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/drone{ - plants_off = 1 +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 }, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/syndicate) +"YW" = ( +/obj/structure/fence, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/mines) -"Zc" = ( -/obj/structure/fence/corner, +/area/awaymission/moonoutpost19/main) +"YX" = ( +/obj/structure/fence{ + dir = 4 + }, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) +"Za" = ( +/obj/structure/alien/weeds, +/obj/structure/cable, +/turf/open/floor/iron/white/side, +/area/awaymission/moonoutpost19/research) +"Zg" = ( +/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{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/syndicate) "Zh" = ( /obj/effect/mapping_helpers/burnt_floor, /obj/structure/closet/crate, @@ -7705,21 +7688,14 @@ /obj/effect/spawner/random/medical/surgery_tool, /turf/open/misc/asteroid/moon/dug, /area/awaymission/moonoutpost19/mines) -"Zn" = ( -/mob/living/basic/lizard{ - name = "Newt" - }, -/turf/open/floor/carpet/royalblue, -/area/awaymission/moonoutpost19/arrivals) "Zo" = ( /turf/open/floor/pod/light, /area/awaymission/moonoutpost19/tent) -"Zq" = ( -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) +"Zp" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) "Zr" = ( /obj/effect/turf_decal/stripes{ dir = 8 @@ -7727,20 +7703,13 @@ /obj/effect/turf_decal/stripes, /turf/open/misc/asteroid/basalt, /area/awaymission/moonoutpost19/main) -"Zt" = ( -/obj/machinery/light/small/directional/east, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/arrivals) -"Zv" = ( -/obj/structure/fence/cut{ - dir = 4 - }, +"Zs" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/blood/gibs/body, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/main) +/area/awaymission/moonoutpost19/mines) "Zw" = ( /obj/effect/turf_decal/siding/purple, /obj/effect/turf_decal/tile/dark/opposingcorners{ @@ -7750,15 +7719,77 @@ dir = 5 }, /area/awaymission/moonoutpost19/research) -"ZD" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ +"Zx" = ( +/obj/structure/chair/office, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"Zy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/arrivals) +"Zz" = ( +/obj/structure/grille/broken, +/obj/item/stack/rods{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/arrivals) +"ZA" = ( +/obj/structure/chair{ dir = 1 }, -/obj/effect/mapping_helpers/broken_floor, +/obj/structure/cable, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"ZB" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/asteroid/corner, +/obj/effect/turf_decal/stripes/asteroid/corner{ + dir = 8 + }, +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/main) +"ZC" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Break Room" + }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) +"ZH" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"ZJ" = ( +/obj/machinery/light/small/directional/south, +/obj/item/stack/cable_coil/five, +/turf/open/misc/asteroid/moon/dug, +/area/awaymission/moonoutpost19/research) +"ZK" = ( +/obj/machinery/door/firedoor/closed, +/obj/effect/decal/cleanable/greenglow, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"ZE" = ( +"ZO" = ( +/obj/machinery/computer/monitor, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"ZP" = ( /obj/structure/chair/wood, /obj/machinery/airalarm/directional/west{ req_access = "150" @@ -7769,57 +7800,23 @@ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/syndicate) -"ZI" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/weeds, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/mines) -"ZJ" = ( -/obj/machinery/light/small/directional/south, -/obj/item/stack/cable_coil/five, -/turf/open/misc/asteroid/moon/dug, -/area/awaymission/moonoutpost19/research) -"ZM" = ( +"ZT" = ( +/obj/item/storage/box/lights/mixed, /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{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 +/obj/effect/turf_decal/stripes/line{ + dir = 10 }, +/turf/open/floor/plating, /area/awaymission/moonoutpost19/syndicate) -"ZR" = ( +"ZU" = ( /obj/effect/decal/cleanable/blood/tracks{ desc = "Your instincts say you shouldn't be following these."; dir = 8; - icon_state = "ltrails_2" + icon_state = "ltrails_1" }, -/obj/effect/turf_decal/lunar_sand/plating, +/obj/structure/cable, /turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"ZS" = ( -/obj/item/pickaxe/drill, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"ZV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) +/area/awaymission/moonoutpost19/research) "ZX" = ( /obj/effect/turf_decal/stripes, /turf/open/misc/asteroid/basalt, @@ -15634,12 +15631,12 @@ tb tb tb tb -Kx -Mv -Mv +dr +mo +mo FB -Mv -Mv +mo +mo tb tb tb @@ -15890,17 +15887,17 @@ tb tb tb tb -Mv -Mv +mo +mo tb tb tb tb -LH -Mv -Mv -Mv -Mv +sn +mo +mo +mo +mo tb tb tb @@ -16146,8 +16143,8 @@ tb tb tb tb -DC -Mv +vE +mo tb tb tb @@ -16157,12 +16154,12 @@ tb tb tb tb -DC -Gq +vE +Dk tb tb tb -wr +eA tb tb tb @@ -16407,25 +16404,25 @@ tb oC tb tb -wr +eA tb tb tb -YG -Mv -Mv -Mv -Mv -Mv -LH -Mv -Mv -Mv +cS +mo +mo +mo +mo +mo +sn +mo +mo +mo PP -Kx +dr tb tb -LH +sn tb tb tb @@ -16660,30 +16657,30 @@ tb tb tb tb -Mv -Mv -LH -Mv -Mv -Mv -Mv -Mv -Mv -Mv -Mv -QK -LH -Mv -Mv -Mv +mo +mo +sn +mo +mo +mo +mo +mo +mo +mo +mo +tv +sn +mo +mo +mo tb -Mv -Mv -Mv -Mv -Mv -Mv -Mv +mo +mo +mo +mo +mo +mo +mo tb tb tb @@ -16920,9 +16917,9 @@ tb tb Qe tb -Mv -Mv -Mv +mo +mo +mo tb tb tb @@ -16939,8 +16936,8 @@ tb tb tb tb -DC -Mv +vE +mo tb tb tb @@ -17178,7 +17175,7 @@ tb Qe tb tb -Mv +mo tb tb tb @@ -17197,7 +17194,7 @@ tb tb tb tb -Mv +mo tb tb tb @@ -17435,7 +17432,7 @@ tb Qe tb tb -Mv +mo tb tb Qe @@ -17454,7 +17451,7 @@ tb tb tb tb -Mv +mo tb tb tb @@ -17692,7 +17689,7 @@ Qe tb tb tb -Mv +mo Px Qe Qe @@ -17710,8 +17707,8 @@ tb tb tb tb -Mv -Mv +mo +mo tb tb tb @@ -17948,9 +17945,9 @@ Qe tb tb tb -Mv -Mv -LH +mo +mo +sn tb Qe Qe @@ -17967,8 +17964,8 @@ Qe Qe Qe Qe -Mv -Mv +mo +mo tb tb tb @@ -18205,8 +18202,8 @@ tb tb tb tb -Mv -Mv +mo +mo tb tb Qe @@ -18218,14 +18215,14 @@ tb tb tb tb -CU +dd tb tb tb tb tb -wr -Mv +eA +mo Qe tb tb @@ -18462,8 +18459,8 @@ tb tb tb tb -Mv -Mv +mo +mo tb tb Qe @@ -18473,16 +18470,16 @@ tb tb tb tb -dK -HX -Mv +BG +rd +mo FK -HX -dK -Mv -Mv -Mv -Mv +rd +BG +mo +mo +mo +mo Qe Qe tb @@ -18719,9 +18716,9 @@ Qe tb tb tb -DC -Mv -Kx +vE +mo +dr Qe Qe tb @@ -18730,16 +18727,16 @@ tb tb tb sI -HX -mX +rd +rW Zh -HC -EE +wz +Qo tb tb tb -Mv -Mv +mo +mo tb tb Qe @@ -18977,8 +18974,8 @@ Qe Qe Qe oC -Mv -Mv +mo +mo tb tb tb @@ -18987,16 +18984,16 @@ tb tb tb tb -Mv -Go -ar -Kx -Mv -HX +mo +Np +Zs +dr +mo +rd tb tb -LH -Kx +sn +dr tb tb tb @@ -19234,8 +19231,8 @@ tb tb tb tb -Mv -Mv +mo +mo tb tb tb @@ -19244,16 +19241,16 @@ tb tb tb tb -qT -Mv +VS +mo sI -HX -dK +rd +BG tb tb tb -Rs -Mv +jp +mo tb tb tb @@ -19481,7 +19478,7 @@ tb tb tb tb -Mv +mo tb Qe tb @@ -19490,9 +19487,9 @@ tb tb tb tb -wr -Mv -Mv +eA +mo +mo tb tb tb @@ -19502,15 +19499,15 @@ tb tb tb tb -DC +vE tb tb tb tb tb tb -Mv -Mv +mo +mo tb tb tb @@ -19735,21 +19732,21 @@ Qe tb tb tb -DC -Mv -Mv -Mv -Mv -Mv -Mv -Mv -Mv -Mv -Mv -Mv -Mv -Mv -Mv +vE +mo +mo +mo +mo +mo +mo +mo +mo +mo +mo +mo +mo +mo +mo tb tb tb @@ -19766,8 +19763,8 @@ tb tb Qe Qe -Mv -LH +mo +sn tb tb tb @@ -19989,10 +19986,10 @@ Qe Qe Qe tb -Mv -Mv -Mv -Kx +mo +mo +mo +dr tb tb tb @@ -20000,13 +19997,13 @@ Qe Qe tb tb -Mv +mo tb tb tb tb tb -Mv +mo tb tb tb @@ -20023,8 +20020,8 @@ Qe Qe Qe Qe -Mv -Mv +mo +mo Qe tb tb @@ -20246,9 +20243,9 @@ Qe tb tb Px -Mv +mo tb -wr +eA tb tb tb @@ -20262,12 +20259,12 @@ tb tb tb tb -LH +sn oC tb tb tb -Mv +mo tb tb Qe @@ -20280,8 +20277,8 @@ Qe tb tb tb -Mv -Mv +mo +mo Qe Qe Qe @@ -20500,8 +20497,8 @@ tb tb tb tb -Mv -Mv +mo +mo tb tb tb @@ -20518,27 +20515,27 @@ tb tb Qe tb -Kx -Mv -Mv -Mv -Mv -Mv -Mv +dr +mo +mo +mo +mo +mo +mo oC -wr -Mv -wr -LH +eA +mo +eA +sn tb tb -Kx -wr +dr +eA tb tb -Mv -Mv -Mv +mo +mo +mo tb Qe Qe @@ -20756,8 +20753,8 @@ tb tb tb tb -Mv -Mv +mo +mo tb tb tb @@ -20776,26 +20773,26 @@ Qe Qe tb tb -Mv +mo tb tb -Mv -QK -Mv -Mv -Mv -Rs -Mv -Gq -Mv -Mv -Mv -Mv -hk -Mv -Mv -Mv -Mv +mo +tv +mo +mo +mo +jp +mo +Dk +mo +mo +mo +mo +VX +mo +mo +mo +mo tb tb Qe @@ -21037,21 +21034,21 @@ tb tb tb tb -Mv +mo tb tb -Mv -Mv +mo +mo tb -Mv -Mv -Mv -Mv -Mv -Mv -Mv -Mv -LH +mo +mo +mo +mo +mo +mo +mo +mo +sn tb tb tb @@ -21269,9 +21266,9 @@ tb tb tb tb -DU -Mv -Mv +Qa +mo +mo tb tb tb @@ -21297,16 +21294,16 @@ tb tb tb tb -LH -Mv +sn +mo tb tb Qe Qe tb tb -Mv -Mv +mo +mo tb tb tb @@ -21526,10 +21523,10 @@ tb tb tb tb -Mv +mo tb -Mv -Mv +mo +mo tb tb tb @@ -21563,8 +21560,8 @@ Qe tb tb tb -Mv -Mv +mo +mo tb tb tb @@ -21786,8 +21783,8 @@ tb FB tb tb -wr -Kx +eA +dr tb tb tb @@ -21811,8 +21808,8 @@ tb tb tb tb -wr -Mv +eA +mo tb Qe tb @@ -21821,8 +21818,8 @@ tb tb tb tb -DC -Mv +vE +mo tb tb tb @@ -22044,7 +22041,7 @@ tb tb tb tb -Mv +mo tb tb tb @@ -22069,7 +22066,7 @@ tb tb tb tb -Mv +mo tb Qe Qe @@ -22079,8 +22076,8 @@ tb tb tb tb -Mv -Kx +mo +dr tb tb tb @@ -22301,7 +22298,7 @@ tb tb tb tb -Mv +mo tb tb tb @@ -22325,8 +22322,8 @@ tb tb tb tb -Mv -Rs +mo +jp tb Qe Qe @@ -22336,8 +22333,8 @@ tb tb tb tb -Mv -Mv +mo +mo tb tb tb @@ -22557,8 +22554,8 @@ tb tb tb tb -Mv -Mv +mo +mo tb tb tb @@ -22581,9 +22578,9 @@ tb tb tb tb -Mv -Mv -Mv +mo +mo +mo Qe Qe Qe @@ -22594,8 +22591,8 @@ tb tb tb tb -Mv -Mv +mo +mo tb tb tb @@ -22813,8 +22810,8 @@ tb tb tb tb -Mv -Mv +mo +mo tb tb tb @@ -22839,7 +22836,7 @@ tb tb tb tb -Mv +mo FB Qe tb @@ -22852,8 +22849,8 @@ tb tb tb tb -wr -LH +eA +sn tb tb tb @@ -23069,8 +23066,8 @@ tb tb tb Px -Mv -Mv +mo +mo tb tb Qe @@ -23096,7 +23093,7 @@ tb Qe Qe Qe -Mv +mo tb tb tb @@ -23324,8 +23321,8 @@ tb tb tb tb -Kx -Mv +dr +mo tb tb tb @@ -23353,7 +23350,7 @@ Qe Qe Qe Qe -Mv +mo tb tb tb @@ -23367,7 +23364,7 @@ tb tb tb tb -Mv +mo tb tb tb @@ -23580,8 +23577,8 @@ zk tb tb tb -Kx -Mv +dr +mo tb tb tb @@ -23608,12 +23605,12 @@ Qe Qe Qe Qe -Cx -Mv -Rs -Mv -Mv -QK +vY +mo +jp +mo +mo +tv tb tb tb @@ -23624,7 +23621,7 @@ tb tb tb tb -DC +vE tb tb tb @@ -23837,7 +23834,7 @@ zk tb tb tb -Mv +mo tb tb tb @@ -23866,13 +23863,13 @@ tb tb tb FB -Mv -Mv -Mv -Mv -Mv -Mv -wr +mo +mo +mo +mo +mo +mo +eA tb tb Qe @@ -24094,7 +24091,7 @@ zk tb tb tb -wr +eA tb tb tb @@ -24124,12 +24121,12 @@ tb tb tb tb -Mv +mo tb tb tb -Mv -Mv +mo +mo tb tb Qe @@ -24380,12 +24377,12 @@ tb tb tb tb -DC -Mv +vE +mo tb tb tb -Mv +mo tb tb tb @@ -24635,14 +24632,14 @@ tb tb tb tb -Mv -Mv -Mv +mo +mo +mo tb tb tb tb -Rs +jp FB tb tb @@ -24891,16 +24888,16 @@ tb tb tb oC -Mv -wr +mo +eA tb tb tb tb tb tb -Mv -Mv +mo +mo tb tb tb @@ -25146,8 +25143,8 @@ tb tb tb Px -Mv -Mv +mo +mo tb tb tb @@ -25156,8 +25153,8 @@ tb tb tb tb -Mv -Mv +mo +mo tb tb tb @@ -25401,8 +25398,8 @@ tb tb tb tb -DC -Mv +vE +mo tb tb tb @@ -25414,7 +25411,7 @@ tb tb tb tb -Mv +mo tb tb Qe @@ -25638,264 +25635,7 @@ tb tb tb tb -tb -Qe -Qe -Qe -tb -tb -tb -tb -tb -tb -tb -tb -tb -Qe -tb -tb -tb -tb -tb -Mv -Mv -tb -tb -tb -tb -tb -tb -tb -tb -tb -tb -tb -DC -Rs -tb -Qe -Qe -tb -tb -tb -tb -tb -tb -Qe -Qe -Qe -Qe -tb -tb -tb -tb -tb -tb -zk -zk -zk -zk -zk -zk -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 -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -"} -(71,1,1) = {" -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -zk -zk -zk -zk -zk -tb -tb -tb -tb -tb -Qe +tb Qe Qe Qe @@ -25913,9 +25653,9 @@ tb tb tb tb -FB -Mv tb +mo +mo tb tb tb @@ -25927,14 +25667,15 @@ tb tb tb tb +vE +jp tb -Mv Qe Qe tb tb tb -Mv +tb tb tb Qe @@ -25947,7 +25688,6 @@ tb tb tb tb -tb zk zk zk @@ -25959,67 +25699,67 @@ 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 +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae ae ae ae @@ -26083,7 +25823,7 @@ IM IM IM "} -(72,1,1) = {" +(71,1,1) = {" IM IM IM @@ -26101,43 +25841,43 @@ ae ae ae ae -ac -ac -ac -ac -ac -ac -ac -rs -rs -rs -rs -ac -ac -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 +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae ae ae ae @@ -26155,6 +25895,7 @@ tb Qe Qe Qe +Qe tb tb tb @@ -26169,35 +25910,33 @@ tb tb tb tb -wr -Mv +FB +mo tb tb tb +tb +tb +tb +tb +tb +tb +tb +tb +tb +tb +mo Qe Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Mv -Mv -Qe tb tb -Mv -TG -Mv +tb +mo +tb tb Qe Qe -tb Qe -tb Qe tb tb @@ -26205,6 +25944,7 @@ tb tb tb tb +tb zk zk zk @@ -26340,7 +26080,7 @@ IM IM IM "} -(73,1,1) = {" +(72,1,1) = {" IM IM IM @@ -26363,14 +26103,14 @@ ac ac ac ac -rs -rs -rs -FS -CB -rs -rs -rs +ac +ac +um +um +um +um +ac +ac ac ac ac @@ -26411,7 +26151,7 @@ tb tb Qe Qe -tb +Qe tb tb tb @@ -26426,7 +26166,8 @@ tb tb tb tb -Mv +eA +mo tb tb tb @@ -26434,34 +26175,33 @@ Qe Qe Qe Qe -tb -tb -tb -tb -tb -tb Qe -Mv -Mv +Qe +Qe +Qe +Qe +Qe +mo +mo +Qe tb -QK -Mv -Mv tb +mo +hl +mo tb Qe Qe tb Qe tb -tb -tb Qe tb tb tb tb tb +tb zk zk zk @@ -26597,7 +26337,7 @@ IM IM IM "} -(74,1,1) = {" +(73,1,1) = {" IM IM IM @@ -26620,15 +26360,15 @@ ac ac ac ac -rs -Bg -CB -CB -Bg -FS -Bg -rs -rs +um +um +um +AP +bJ +um +um +um +ac ac ac ac @@ -26668,7 +26408,7 @@ tb tb Qe Qe -Qe +tb tb tb tb @@ -26683,34 +26423,33 @@ tb tb tb tb +mo tb tb tb Qe Qe +Qe +Qe tb tb tb tb tb tb +Qe +mo +mo tb -tb -tb -tb -tb -Rs -Mv -QK -tb +tv +mo +mo tb tb Qe Qe tb Qe -Qe -tb tb tb tb @@ -26719,8 +26458,9 @@ tb tb tb tb +tb +zk zk -Qe zk zk zk @@ -26854,7 +26594,7 @@ IM IM IM "} -(75,1,1) = {" +(74,1,1) = {" IM IM IM @@ -26876,16 +26616,16 @@ ac ac ac ac -rs -rs -FS -Bg -Bg -FS -ow -Bg -CB -rs +ac +um +fY +bJ +bJ +fY +AP +fY +um +um ac ac ac @@ -26922,6 +26662,7 @@ tb tb tb tb +tb Qe Qe Qe @@ -26935,7 +26676,7 @@ tb tb tb Qe -Qe +tb tb tb tb @@ -26954,15 +26695,12 @@ tb tb tb tb -Qe -LH -Mv -wr tb +jp +mo +tv tb tb -Qe -Qe tb Qe Qe @@ -26972,13 +26710,15 @@ Qe tb tb tb +tb Qe tb tb tb +tb zk Qe -Qe +zk zk zk zk @@ -27111,7 +26851,7 @@ IM IM IM "} -(76,1,1) = {" +(75,1,1) = {" IM IM IM @@ -27133,16 +26873,273 @@ ac ac ac ac -rs -Bg -Bg -sa -Bc -Bg -Bg -sa -Bg -rs +um +um +AP +fY +fY +AP +UI +fY +bJ +um +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 +zk +zk +zk +zk +zk +tb +tb +tb +tb +Qe +Qe +Qe +tb +tb +tb +tb +tb +tb +tb +tb +tb +Qe +Qe +tb +tb +tb +tb +tb +tb +Qe +Qe +tb +tb +tb +tb +tb +tb +tb +tb +tb +tb +Qe +sn +mo +eA +tb +tb +tb +Qe +Qe +tb +Qe +Qe +tb +Qe +Qe +tb +tb +tb +Qe +tb +tb +tb +zk +Qe +Qe +zk +zk +zk +zk +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 +ae +ae +ae +ae +ae +ae +ae +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +"} +(76,1,1) = {" +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +ae +ae +ae +ae +ac +ac +ac +ac +um +fY +fY +wh +qA +fY +fY +wh +fY +um ac ac ac @@ -27212,8 +27209,8 @@ tb tb Qe Qe -Mv -Mv +mo +mo tb tb tb @@ -27390,16 +27387,16 @@ ac ac ac ac -rs -Bg -Bg -Bc -Bg -Qu -bj -xM -sp -rs +um +fY +fY +qA +fY +uH +AO +LY +Gj +um ac ac ac @@ -27470,7 +27467,7 @@ Qe Qe Qe tb -Gq +Dk tb tb tb @@ -27647,16 +27644,16 @@ ac ac ac ac -rs -CB -hf -Bg -Bg -Bg -sp -bj -Bg -rs +um +bJ +nz +fY +fY +fY +Gj +AO +fY +um ac ac ac @@ -27726,8 +27723,8 @@ tb Qe Qe Qe -Mv -Mv +mo +mo tb tb tb @@ -27904,16 +27901,16 @@ ac ac ac ac -rs -Bc -bj -Bg -Bg -KQ -Bg -hf -CB -rs +um +qA +AO +fY +fY +XO +fY +nz +bJ +um ac ac ac @@ -27984,7 +27981,7 @@ Qe tb tb tb -Mv +mo tb tb tb @@ -28161,16 +28158,16 @@ ac ac ac ac -rs -RN -Be -Bg -Bg -Bg -Bg -CB -Bg -tu +um +hT +lq +fY +fY +fY +fY +bJ +fY +iR ac ac ac @@ -28241,7 +28238,7 @@ tb tb tb tb -Mv +mo tb tb tb @@ -28418,16 +28415,16 @@ ac ac ac ac -rs -Bg -bj -rs -Bg -Bg -Bg -sa -CB -rs +um +fY +AO +um +fY +fY +fY +wh +bJ +um ac ac ac @@ -28497,8 +28494,8 @@ tb tb tb tb -wr -Rs +eA +jp tb tb tb @@ -28538,10 +28535,10 @@ dA dA dA dA -UP +My dA -Dn -UP +Wg +My dA dA dA @@ -28675,16 +28672,16 @@ ac ac ac ac -rs -rs -Bg -eE -Bg -Bg -Bg -eE -Bg -rs +um +um +fY +kj +fY +fY +fY +kj +fY +um ac ac ac @@ -28697,10 +28694,10 @@ ac ac ac ac -rs -rs -rs -rs +um +um +um +um ac ac ac @@ -28755,7 +28752,7 @@ tb tb tb tb -Mv +mo tb tb tb @@ -28793,13 +28790,13 @@ dA dA dA dA -Dn -UP -UP -UP -UP -UP -UP +Wg +My +My +My +My +My +My dA dA dA @@ -28808,9 +28805,9 @@ ac ac dA ac -Ta -UP -HW +No +My +PS ac dA dA @@ -28933,15 +28930,15 @@ ac ac ac ac -rs -CB -Bg -Bg -Bg -Bg -Bg -Bg -rs +um +bJ +fY +fY +fY +fY +fY +fY +um ac ac ac @@ -28953,12 +28950,12 @@ ac ac ac ac -rs -rs -Wi -Bc -rs -rs +um +um +Kb +qA +um +um ac ac ac @@ -29011,8 +29008,8 @@ tb tb tb tb -DC -Mv +vE +mo tb tb tb @@ -29048,27 +29045,27 @@ dA dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +My +My +My +My +My +My +My +My +My +Wg dA dA dA dA ac ac -uB -UP -UP -UP -UP +pB +My +My +My +My ac ac ac @@ -29190,15 +29187,15 @@ ac ac ac ac -rs -rs -Bg -Bg -KQ -Bg -Bg -rs -rs +um +um +fY +fY +XO +fY +fY +um +um ac ac ac @@ -29209,13 +29206,13 @@ ac ac ac ac -rs -rs -CB -bj -El -Bg -rs +um +um +bJ +AO +Ja +fY +um ac ac ac @@ -29269,7 +29266,7 @@ tb tb tb tb -Mv +mo tb tb tb @@ -29303,29 +29300,29 @@ dA dA dA dA -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +Wg +My +My +My +My +My +My +My +My +My +My +My dA dA ac ac -UP -UP -IN -UP -UP -UP +My +My +HP +My +My +My ac ac dA @@ -29448,13 +29445,13 @@ ac ac ac ac -rs -rs -Bg -Bg -Bg -rs -rs +um +um +fY +fY +fY +um +um ac ac ac @@ -29466,13 +29463,13 @@ ac ac ac ac -rs -Bc -Bg -KQ -Bg -CB -rs +um +qA +fY +XO +fY +bJ +um ac ac ac @@ -29486,8 +29483,8 @@ dA tb tb tb -Mv -LH +mo +sn Qe Qe Qe @@ -29509,24 +29506,24 @@ tb tb zk zk -Mv -LH -Mv -LH +mo +sn +mo +sn tb -Mv -wr +mo +eA tb tb tb -LH -TG +sn +hl tb tb tb -LH -Mv -Mv +sn +mo +mo tb tb tb @@ -29558,30 +29555,30 @@ dA dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA ac ac -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My ac dA dA @@ -29706,11 +29703,11 @@ ac ac ac ac -rs -rs -rs -rs -rs +um +um +um +um +um ac ac ac @@ -29721,15 +29718,15 @@ ac ac ac ac -rs -rs -rs -Bg -Bg -eE -Bc -rs -rs +um +um +um +fY +fY +kj +qA +um +um ac ac ac @@ -29739,14 +29736,14 @@ dA dA dA dA -UP -Dn -UP -UP -UP -UP -UP -UP +My +Wg +My +My +My +My +My +My Qe Qe zk @@ -29764,26 +29761,26 @@ zk zk zk zk -DC -Mv -TT -Mv -Mv -Mv -Lr -Mv -Mv -LH -Mv -Rs -Mv -Mv -Mv -Mv -Mv -Rs -Mv -Mv +vE +mo +Aq +mo +mo +mo +OQ +mo +mo +sn +mo +jp +mo +mo +mo +mo +mo +jp +mo +mo zk zk zk @@ -29813,31 +29810,31 @@ dA dA dA dA -UP +My dA -Dn -UP -UP -UP -UP -Dn +Wg +My +My +My +My +Wg dA -UP -Dn +My +Wg ac -Dn -UP -UP -UP -UP -Dn +Wg +My +My +My +My +Wg dA ac -UP -UP -UP -UP -UP +My +My +My +My +My ac ac dA @@ -29963,10 +29960,10 @@ ac ac ac ac -rs -KQ -KQ -rs +um +XO +XO +um ac ac ac @@ -29977,15 +29974,15 @@ ac ac ac ac -rs -rs -Bg -OI -Bg -CB -rs -rs -rs +um +um +fY +Ha +fY +bJ +um +um +um ac ac ac @@ -29994,18 +29991,18 @@ dA dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +My +My +My +My +My +My +My +My +My +My +My +Wg dA dA tb @@ -30022,7 +30019,7 @@ zk zk zk zk -LH +sn oC zk zk @@ -30032,9 +30029,9 @@ zk zk zk zk -DC -Mv -Mv +vE +mo +mo zk zk zk @@ -30069,39 +30066,39 @@ tb dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My dA ac -UP +My ac dA ac -Dn -UP -UP -UP -UP +Wg +My +My +My +My dA ac ac -Bu -UP -UP +Po +My +My ac ac dA dA dA -Dn -UP -UP +Wg +My +My dA dA dA @@ -30220,27 +30217,27 @@ ac ac ac ac -rs -Bg -Bg -rs -rs +um +fY +fY +um +um ac -rs -rs -rs -rs -rs -rs -rs -rs -rs -Bg -Bg -rs -rs -rs -rs +um +um +um +um +um +um +um +um +um +fY +fY +um +um +um +um ac ac ac @@ -30249,21 +30246,21 @@ dA dA dA dA -UP -Dn -UP -UP -UP -UP -UP -UP -Dn -UP -UP -QH -UP -UP -UP +My +Wg +My +My +My +My +My +My +Wg +My +My +dh +My +My +My dA dA tb @@ -30278,8 +30275,8 @@ zk zk zk zk -Mv -Mv +mo +mo zk zk zk @@ -30290,8 +30287,8 @@ zk zk zk zk -Mv -Mv +mo +mo zk zk zk @@ -30326,26 +30323,26 @@ tb dA dA dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP +Wg +My +My +My +My +My +My +My +My +My ac dA ac ac dA ac -UP -UP -UP -UP +My +My +My +My dA dA ac @@ -30355,19 +30352,19 @@ dA dA dA dA -UP -UP -UP -UP -UP +My +My +My +My +My dA dA dA dA dA -Dn -UP -UP +Wg +My +My dA dA dA @@ -30477,24 +30474,24 @@ ac ac ac ac -rs -Bg -Bg -eE -rs -rs -rs -Bg -eE -Bg -Bg -Bg -Bg -rs -rs -Bg -rs -rs +um +fY +fY +kj +um +um +um +fY +kj +fY +fY +fY +fY +um +um +fY +um +um ac ac ac @@ -30505,22 +30502,22 @@ ac dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -ya -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +NU +My +My +My +My +My +My dA dA dA @@ -30535,8 +30532,8 @@ zk zk zk zk -LH -Mv +sn +mo zk zk zk @@ -30546,8 +30543,8 @@ zk zk zk zk -Mv -Mv +mo +mo zk zk zk @@ -30582,16 +30579,16 @@ tb dA dA dA -UP -UP -UP -UP -UP -UP -UP -Dn +My +My +My +My +My +My +My +Wg ac -UP +My ac dA ac @@ -30599,11 +30596,11 @@ ac ac ac ac -Dn -UP -UP -UP -Dn +Wg +My +My +My +Wg dA dA dA @@ -30611,21 +30608,21 @@ ac dA dA dA -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -Dn +My +Wg +My +My +My +My +My +My +My +My +My +My +Wg +My +Wg dA dA dA @@ -30734,23 +30731,23 @@ ac ac ac ac -rs -rs -Bg -Bg -Bg -rs -Bg -Bg -Bg -Bg -Bg -Bg -KQ -eE -Bg -Bg -rs +um +um +fY +fY +fY +um +fY +fY +fY +fY +fY +fY +XO +kj +fY +fY +um ac ac ac @@ -30761,24 +30758,24 @@ ac ac dA dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg dA dA dA @@ -30792,8 +30789,8 @@ zk zk zk zk -Mv -QK +mo +tv zk zk zk @@ -30804,7 +30801,7 @@ zk zk zk zk -Mv +mo zk zk zk @@ -30838,14 +30835,14 @@ zk tb dA dA -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My ac ac ac @@ -30854,35 +30851,35 @@ ac dA ac ac -Dn -UP -UP -UP -UP -UP -UP -UP -UP +Wg +My +My +My +My +My +My +My +My dA dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg dA dA dA @@ -30985,29 +30982,29 @@ ae ae ae ac -rs -rs -rs -rs +um +um +um +um ac ac ac -rs -rs -Bg -KQ -Bg -Bg -Bg -rs -rs -rs -rs -Bg -Bg -Bg -rs -rs +um +um +fY +XO +fY +fY +fY +um +um +um +um +fY +fY +fY +um +um ac ac ac @@ -31018,24 +31015,24 @@ ac dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA dA dA @@ -31049,8 +31046,8 @@ tb tb tb tb -TG -LH +hl +sn tb tb tb @@ -31060,9 +31057,9 @@ tb tb tb tb -LH -Mv -Mv +sn +mo +mo tb tb tb @@ -31096,50 +31093,50 @@ tb dA dA dA -Dn -UP -UP -UP -UP -UP -UP -UP -Dn +Wg +My +My +My +My +My +My +My +Wg dA ac dA ac dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP +Wg +My +My +My +My +My +My +My +My +My +My +My +Wg +Wg +My +My +My +My +My +My +My +My +My +My +Wg +My +My +My +My +My dA dA dA @@ -31241,29 +31238,29 @@ ae ae ae ae -rs -rs -CB -Bc -rs -rs -rs -rs -rs -rs -eE -Bg -Bg -Bg -rs -rs +um +um +bJ +qA +um +um +um +um +um +um +kj +fY +fY +fY +um +um bl bl -rs -rs -Bg -Bg -rs +um +um +fY +fY +um ac ac ac @@ -31274,27 +31271,27 @@ ac dA dA dA -UP -Dn -UP -UP -UP -UP -UP -UP -UP -QH -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +My +Wg +My +My +My +My +My +My +My +dh +My +My +My +My +My +My +My +My +My +My +Wg dA dA dA @@ -31306,8 +31303,8 @@ tb tb tb tb -LH -sW +sn +uS tb tb tb @@ -31319,8 +31316,8 @@ tb tb tb tb -Mv -wr +mo +eA tb tb tb @@ -31352,51 +31349,54 @@ tb dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -ok +My +My +My +My +My +My +My +My +My +My +My +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +sZ +dA +dA +dA dA dA dA @@ -31404,6 +31404,260 @@ dA dA dA dA +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ae +ae +ae +ae +ae +ae +ae +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +"} +(93,1,1) = {" +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +IM +ae +ae +ae +ae +um +bJ +fY +Ha +kj +um +um +fY +fY +fY +fY +fY +fY +um +um +bl +bl +bl +um +fY +fY +fY +um +ac +ac +ac +ac +ac +ac +ac +dA +dA +My +NU +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +dA +dA +dA +dA +zk +zk +tb +tb +tb +tb +oC +mo +tb +tb +tb +tb +tb +tb +tb +tb +tb +tb +tb +tb +mo +mo +tb +tb +tb +tb +tb +tb +tb +tb +tb +tb +tb +tb +tb +tb +tb +tb +tb +tb +tb +tb +Qe +tb +tb +tb +tb +tb +tb +dA +dA +My +My +My +My +My +My +My +My +My +My +My +My +My +ac +dA +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +lc +Jc +Jc +Jc +lc +My +My +My +My +My +My +My +Ia +PU +Bu +PU +Bu +PU +Bu +PU dA dA dA @@ -31480,7 +31734,7 @@ IM IM IM "} -(93,1,1) = {" +(94,1,1) = {" IM IM IM @@ -31498,30 +31752,29 @@ ae ae ae ae -rs -CB -Bg -OI -eE -rs -rs -Bg -Bg -Bg -Bg -Bg -Bg -rs -rs +um +bJ +fY +bJ +XO +fY +fY +fY +um +um +fY +um +um +um bl bl bl -rs -Bg -Bg -Bg -rs -ac +bl +um +fY +kj +um +um ac ac ac @@ -31530,41 +31783,42 @@ ac ac dA dA -UP -ya -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP dA +Wg +My +My +My +My +My +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg dA dA dA zk -zk tb tb tb tb -oC -Mv +zk +mo tb tb tb @@ -31577,9 +31831,8 @@ tb tb tb tb -Mv -Mv tb +tv tb tb tb @@ -31599,72 +31852,73 @@ tb tb tb tb -Qe tb tb +Qe +tb tb tb tb tb dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -ac +Wg +My +GU +My +My +My +My +My +My +My +My +My +My dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My lc -Jc -Jc -Jc lc -UP -UP -UP -UP -UP -UP -UP -AR -Oh -hI -Oh -hI -Oh -hI -Oh +mp +mG +mV +lc +lc +My +My +Wg +My +My +My +Qs +PU +Cz +Sj +kN +hr +dM +Bu +dA dA dA dA -ac ac ac ac @@ -31737,7 +31991,7 @@ IM IM IM "} -(94,1,1) = {" +(95,1,1) = {" IM IM IM @@ -31755,29 +32009,28 @@ ae ae ae ae -rs -CB -Bg -CB -KQ -Bg -Bg -Bg -rs -rs -Bg -rs -rs -rs +um +um +um +qA +qA +um +um +um +um +um +fY +um +bl bl bl bl bl -rs -Bg -eE -rs -rs +bl +um +fY +fY +um ac ac ac @@ -31787,41 +32040,42 @@ ac dA dA dA -Dn -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn dA +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA dA -zk +dA +ae tb tb tb tb -zk -Mv +vE +sn tb tb tb @@ -31835,7 +32089,7 @@ tb tb tb tb -QK +mo tb tb tb @@ -31857,67 +32111,67 @@ tb tb tb tb -Qe tb +Qe tb tb tb tb dA -dA -Dn -UP -JR -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -lc -lc -mp -mG -mV -lc -lc -UP -UP -Dn -UP -UP -UP -oG -Oh -Xz -Mx -ao -TP -Yx -hI +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +ld +lW +mb +mc +mb +nf +ld +My +My +My +My +My +My +Ia +PU +wQ +sv +rC +fL +lN +Bu dA dA dA @@ -31994,7 +32248,7 @@ IM IM IM "} -(95,1,1) = {" +(96,1,1) = {" IM IM IM @@ -32012,95 +32266,96 @@ ae ae ae ae -rs -rs -rs -Bc -Bc -rs -rs -rs -rs -rs -Bg -rs -bl +ac +ac +um +um +um +um +ac +ac +ac +um +UI +um +um bl bl bl bl bl -rs -Bg -Bg -rs -ac -ac -ac +um +fY +Jw +um +um +um ac ac ac dA dA dA +Qp +vs +My +My +My +My +My +My +My +My +My +My +My +My +NU +My +My +My +My +My +My +My +My +Wg +My +My +My +Wg dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP dA dA -dA -ae -tb -tb -tb -tb -DC -LH -tb -tb -tb -tb -tb -tb -tb -tb -tb -tb -tb -tb -tb -Mv -tb -tb tb +zk +zk tb +zk +mo tb tb +zk +zk +zk +zk +zk +zk +zk +zk +zk tb tb +mo +mo +mo +mo +mo +zk +zk +zk +zk +zk tb tb tb @@ -32115,66 +32370,65 @@ tb tb tb tb -Qe tb tb tb tb dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +eI +eJ +eJ +eJ +eI +eI +eI +eJ +eI +My +My ld -lW -mb -mc -mb -nf +lX +mq +mr +mW +lX ld -UP -UP -UP -UP -UP -UP -AR -Oh -AX -Bt -Wm -rR -Gu -hI +My +My +My +My +Wg +My +Qs +PU +us +Ir +uC +Bc +io +PU dA dA dA @@ -32251,7 +32505,7 @@ IM IM IM "} -(96,1,1) = {" +(97,1,1) = {" IM IM IM @@ -32271,71 +32525,71 @@ ae ae ac ac -rs -rs -rs -rs ac ac ac -rs -ow -rs -rs +ac +ac +ac +ac +um +fY +fY +um bl bl bl bl bl -rs -Bg -PL -rs -rs -rs -ac -ac +um +kj +fY +fY +fY +um +um +um ac dA dA +Qp +Qp +vs +My +My +My +My +My +My +My +My +My +My +My +My +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My dA -Bp -Ty -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -ya -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -Dn dA dA dA -tb zk zk tb -zk -Mv +eA +tv tb tb zk @@ -32347,29 +32601,28 @@ zk zk zk zk -tb -tb -Mv -Mv -Mv -Mv -Mv zk +mo +mo zk zk zk +mo +mo +mo zk +zk +zk +sn tb -tb -tb -tb -tb -tb -tb -tb -tb -tb -tb +zk +zk +zk +zk +zk +zk +zk +zk tb tb tb @@ -32378,65 +32631,66 @@ tb tb tb dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +dA +dA +My +My +My +My +My +My +My +My +My +My +My eI -eJ -eJ -eJ eI eI +eJ eI eJ +eJ +My +My +My +eJ +WX +op +op +JL +op +Xr +op eI -UP -UP +My +My +ld ld -lX -mq -mr -mW -lX ld -UP -UP -UP -UP -Dn -UP -oG -Oh -TY -NB -tM -KC -dv -Oh +mH +ld +ld +ld +My +My +My +My +My +My +Qs +PU +Xw +Nv +TN +Eu +Td +Bu +dA dA dA dA dA -ac ac ac ac @@ -32508,7 +32762,7 @@ IM IM IM "} -(97,1,1) = {" +(98,1,1) = {" IM IM IM @@ -32533,68 +32787,69 @@ ac ac ac ac -ac -ac -rs -Bg -Bg -rs +um +um +um +fY +fY +um +um bl bl bl bl -bl -rs -eE -Bg -Bg -Bg -rs -rs -rs -ac +um +um +fY +fY +fY +fY +fY +um +um +Qp +Qp +NG +PY +vs +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg +My +My +My +My +My +My +My +My dA dA -Bp -Bp -Ty -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -dA dA dA +ae +ae dA -zk -zk -tb -wr -QK -tb -tb +Wg +Wg +ae +ae +ae zk zk zk @@ -32604,20 +32859,19 @@ zk zk zk zk +vE zk -Mv -Mv zk zk zk -Mv -Mv -Mv zk zk +vE +mo +eA +mo +mo zk -LH -tb zk zk zk @@ -32632,63 +32886,63 @@ tb tb tb tb -tb dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -eI -eI +My +My +My +My +My +My +My +My +My +My +My +My eI +uZ +Nj +nk +nk +MD eJ eI eJ -eJ -UP -UP -UP -eJ -WX -op -op -he +eI +eI +QR op -Xr +ea +ea +dZ +dZ op -eI -UP -UP -ld -ld -ld -mH -ld +eJ +My +My ld +lZ +mr +mr +mr +lZ ld -UP -UP -UP -UP -UP -UP -oG -Oh -PK -pJ -Km -gL -GT -hI +My +My +My +My +My +My +Qs +PU +CY +cy +iJ +Qj +cy +Bu dA dA dA @@ -32765,7 +33019,7 @@ IM IM IM "} -(98,1,1) = {" +(99,1,1) = {" IM IM IM @@ -32789,70 +33043,76 @@ ac ac ac ac -ac -rs -rs -rs -Bg -Bg -rs -rs -bl +um +um +xx +fY +fY +XO +bJ +um bl bl bl -rs -rs -Bg -Bg -Bg -Bg -Bg -rs -rs -Bp -Bp -TQ -We -Ty -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -dA +um +um +fY +fY +um +um +fY +fY +fY +um +Mw +vs +Mf +vs +vs +My +My +My +My +My +My +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA dA dA ae ae dA -Dn -Dn +ae +My +ae +ae ae ae ae +ae +ae +zk +zk zk zk zk @@ -32862,18 +33122,12 @@ zk zk zk zk -DC zk zk zk zk zk zk -DC -Mv -wr -Mv -Mv zk zk zk @@ -32888,64 +33142,64 @@ tb tb tb tb -tb dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -eI -eS -Nj -fL -fL -wn +Wg +My +My +My +My +My +My +My +My +My +My +My +My eJ +pM +jQ +jP +lL +Uy eI -eJ -eI -eI -hL +Zp op -ea -ea +Xr +op +op +JL dZ +zN +TA dZ -op +zB eJ -UP -UP +hI +My ld -lZ -mr -mr +ma +mc mr -lZ +mc +ng ld -UP -UP -UP -UP -UP -UP -oG -Oh -UT -lM -zQ -Ug -lM -hI +My +My +My +My +My +My +Uj +PU +Bn +Fc +Ev +LH +YK +PU dA dA dA @@ -33022,7 +33276,7 @@ IM IM IM "} -(99,1,1) = {" +(100,1,1) = {" IM IM IM @@ -33046,59 +33300,59 @@ ac ac ac ac -rs -rs -CI -Bg -Bg -KQ -CB -rs +um +dz +QA +Ha +fY +bJ +qA +um bl bl bl -rs -rs -Bg -Bg -rs -rs -Bg -Bg -Bg -rs -Ke -Ty -NV -Ty -Ty -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +um +fY +fY +um +um +um +um +fY +XO +um +Gs +vs +vs +vs +vs +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +HG dA dA dA @@ -33106,7 +33360,10 @@ ae ae dA ae -UP +Wg +ae +ae +ae ae ae ae @@ -33114,9 +33371,6 @@ ae ae ae ae -zk -zk -zk zk zk zk @@ -33143,69 +33397,69 @@ zk tb tb tb -tb -tb -dA dA +ae +ae +ae dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My eJ -pM -fr -fM -gf -xt +Uh +Nj +Iu +Iu +oN eI -hd -op -Xr -op op -he +ea +ea dZ -TW -iZ dZ -fQ -eJ +ea +ea +ot +dZ +ea +Cs +Kp hI -UP -ld -ma -mc -mr -mc -ng -ld -UP -UP -UP -UP -UP -UP -PM -Oh -Is -Wr -ER -sv -MJ -Oh -dA +My +Jc +mb +ms +mI +ms +mb +Jc +My +My +My +My +My +My +xm +PU +wF +XA +Im +XA +XA +PU dA dA +Wg dA dA ac @@ -33279,7 +33533,7 @@ IM IM IM "} -(100,1,1) = {" +(101,1,1) = {" IM IM IM @@ -33303,68 +33557,90 @@ ac ac ac ac -rs -rn -Nu -OI -Bg -CB -Bc -rs +um +qA +AO +fY +qA +qA +um +um bl bl bl -rs -Bg -Bg -rs -rs -rs -rs -Bg -KQ -rs -OU -Ty -Ty -Ty -Ty -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -GO +um +fY +um +um +ac +ac +um +um +um +um +Qp +NG +vs +vs +vs +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg +My dA dA +ae +ae dA ae +yJ +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae ae dA ae -Dn ae +dA ae ae ae @@ -33374,95 +33650,73 @@ ae ae ae ae -zk -zk -zk -zk -zk -zk -zk -zk -zk -zk -zk -zk -zk -zk -zk -zk -zk -zk -zk -zk -zk -zk -zk -tb -tb -tb +ae +ae +dA +dA dA ae ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +dA +My +My +My +My +My +My +My +My +My +My +My +My eJ -eU +vK +Nj Nj -fN -fN -Bw +Nj +VM eI op ea +qM +rO +rO +rO +rO +oA ea -dZ -dZ -ea -ea -iG -dZ -ea -jT -RE -hI -UP -Jc -mb -ms -mI -ms -mb -Jc -UP -UP -UP -UP -UP -UP -SN -Oh -Ao -oW -yU -oW -oW -Oh -dA +YD +lG +oq +iM +My +ld +mc +mt +mJ +mt +mc +ld +My +My +My +My +My +My +Dy +OT +rl +Ot +Ot +Ot +Ot +Ng dA -Dn +Wg +My dA dA ac @@ -33536,7 +33790,7 @@ IM IM IM "} -(101,1,1) = {" +(102,1,1) = {" IM IM IM @@ -33560,70 +33814,67 @@ ac ac ac ac -rs -Bc -bj -Bg -Bc -Bc -rs -rs +um +um +um +fY +um +um +um +bl bl bl bl -rs -Bg -rs -rs -ac -ac -rs -rs -rs -rs -Bp -TQ -Ty -Ty -Ty -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP +um +fY +um +um +ac +ac +ac +ac +ac dA dA -ae -ae +Qp +PY +vs +dh +My +My +My +My +My +My +My +My +My +NU +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +dA dA -ae -JD -ae ae ae +dA +RW +My ae ae ae @@ -33641,12 +33892,15 @@ ae ae ae dA -ae -ae +dA +dA +My +dA +dA +ds dA ae -ae -ae +dA ae ae ae @@ -33662,67 +33916,67 @@ ae ae ae dA -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -eJ -oJ -Nj -Nj -Nj -gz +My +My +My +My +My +My +My +My +My +My +My +My +My eI +OO op +op +Xr +zr +eJ +JL ea -qM -rO -rO -rO -rO -oA -ea -Nz -jU -ku -io -UP +rc +Nt +ap +aK +on +Zw +dZ +bn +lG +jN +iM +My ld -mc -mt -mJ -mt -mc +md +ms +mI +ms +nh ld -UP -UP -UP -UP -UP -UP -Yr -ba -VQ -TJ -TJ -TJ -TJ -Eq +My +My +My +Wg +My +My +My +ur +My +My +My +My +My +My +My +My +dA dA -Dn -UP dA dA -ac ac ac ac @@ -33793,7 +34047,7 @@ IM IM IM "} -(102,1,1) = {" +(103,1,1) = {" IM IM IM @@ -33817,72 +34071,67 @@ ac ac ac ac -rs -rs -rs -Bg -rs -rs -rs +ac +ac +um +fY +um bl bl bl bl -rs -Bg -rs -rs -ac -ac -ac -ac -ac -dA -dA -Bp -We -Ty -QH -UP -UP -UP -UP -UP -UP -UP -UP -UP -ya -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +bl +bl +um +fY +fY +um +ac +ac +ac +ac +ac +dA +dA +Qp +vs +vs +My +My +My +NU +My +My +My +My +My +My +My +Wg +My +My +My +My +My +My +My +My +Wg +My +My +My +My +My +My +My +QS dA dA ae ae dA -Et -UP -ae -ae -ae -ae -ae +My +Wg ae ae ae @@ -33897,14 +34146,19 @@ ae dA dA dA -UP dA dA -qE +My +Wg +My +My +Wg dA -ae +My +My +dA +My dA -ae ae ae ae @@ -33919,63 +34173,63 @@ ae ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +eJ eI -eW -op -op -Xr -gA eJ -he +zB +eJ +eJ +eI +op ea -rc +In Nt -ap -aK -on -Zw -dZ -jr -jU -kv -io -UP -ld -md -ms -mI -ms -nh -ld -UP -UP -UP -Dn -UP -UP -UP -RA -UP -UP -UP -UP -UP -UP -UP -UP +yp +yF +zI +Sp +ea +eD +qh +oq +iM +My +Jc +mc +mc +mr +mc +mc +Jc +My +My +My +My +My +My +My +rK +My +My +My +My +My +Ng +My +My dA dA dA @@ -34050,7 +34304,7 @@ IM IM IM "} -(103,1,1) = {" +(104,1,1) = {" IM IM IM @@ -34076,322 +34330,65 @@ ac ac ac ac -rs -Bg -rs +um +fY +um bl bl bl bl bl bl -rs -Bg -Bg -rs -ac -ac -ac -ac -ac -dA -dA -Bp -Ty -Ty -UP -UP -UP -ya -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -QS -dA -dA -ae -ae -dA -UP -Dn -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -dA -dA -dA -dA -dA -UP -Dn -UP -UP -Dn -dA -UP -UP -dA -UP -dA -ae -ae -ae -ae -ae -ae -ae -dA -dA -dA -ae -ae -ae -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -eJ -eI -eJ -fQ -eJ -eJ -eI -op -ea -In -Nt -yp -yF -zI -Sp -ea -js -jV -ku -io -UP -Jc -mc -mc -mr -mc -mc -Jc -UP -UP -UP -UP -UP -UP -UP -vn -UP -UP -UP -UP -UP -Eq -UP -UP -dA -dA -dA -dA -ac +um +um +XO +um ac ac ac ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -"} -(104,1,1) = {" -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -IM -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -rs -Bg -rs -bl -bl -bl -bl -bl -bl -rs -rs -KQ -rs -ac -ac -ac -ac -dA -dA -Bp -Bp -Ty -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UA -QW -UP -UP -ze -DG -JD +dA +dA +Qp +Qp +vs +My +My +My +My +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +od +XN +My +My +lp +Io +yJ ae -Dm -UP -UP +vf +My +My ae ae ae @@ -34403,20 +34400,20 @@ ae dA dA dA -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -Ef -UP -UP -UP +My +Wg +My +My +My +My +My +My +My +My +SZ +My +My +My dA dA LG @@ -34432,20 +34429,20 @@ ae ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My eI op op @@ -34453,7 +34450,7 @@ Xr op op as -he +JL dZ rH SX @@ -34462,9 +34459,9 @@ wU ap Ts ea -jt -jV -kw +Ww +qh +mj hI lc ld @@ -34475,22 +34472,22 @@ mb me ld lc -UP -UP -UP -UP -UP -UP -RA -UP -UP -UP -UP -UP -UP -Dn -UP -UP +My +My +My +My +My +My +ur +My +My +My +My +My +My +Wg +My +My dA dA dA @@ -34590,9 +34587,9 @@ ac ac ac ac -rs -KQ -rs +um +XO +um bl bl bl @@ -34600,54 +34597,54 @@ bl bl bl bl -rs -Bg -rs +um +fY +um ac ac ac ac dA dA -Bp -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Ef +Qp +My +My +My +My +My +My +My +My +My +My +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +SZ ae -UP -UP -CC -Dn +My +My +LK +Wg ae ae ae @@ -34657,28 +34654,28 @@ ae ae dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Ef -UP -UP -UP -UP -Dn +My +My +My +My +My +My +My +My +My +My +SZ +My +My +My +My +Wg dA dA LG -UP -Ag -UP +My +jx +My dA dA LG @@ -34689,22 +34686,22 @@ ae ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My eI -eY +MQ ea ea ea @@ -34712,17 +34709,17 @@ dZ dZ ea ea -hu +aJ Ay -hu +aJ Ci Sd zx ea -ju -jU -ku -io +pX +lG +oq +iM ld lD lD @@ -34732,21 +34729,21 @@ mY lD lD ld -UP -UP -UP -UP -UP -UP -RA -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +ur +My +My +My +My +My +My +My +My dA dA dA @@ -34847,9 +34844,9 @@ ac ac ac ac -rs -Bg -rs +um +fY +um bl bl bl @@ -34857,49 +34854,49 @@ bl bl bl bl -rs -Bg -rs -ac -ac -ac -ac -dA -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +um +fY +um +ac +ac +ac +ac +dA +dA +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My QS -UP -UP -UP +My +My +My dA ae ae @@ -34912,100 +34909,100 @@ ae ae ae dA -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -uy -UP -UP -UP -UP +My +Wg +My +My +My +My +My +My +My +My +My +My +My +Gm +My +My +My +My dA -Dn -UP -UP -UP -UP -UP +Wg +My +My +My +My +My LG -UP -Dn +My +Wg LG ae ae ae dA -Dn -UP -UP -UP -UP +Wg +My +My +My +My yV -UP +My yV -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My eI op ea -fS -gi -zL -FX -hg -fV -hv -gR -hu +nq +HU +il +WU +Rl +Rq +ik +OC +aJ xK au FY dZ -jr -jV -kv -io +bn +qh +jN +iM lc -EV -xN +Qf +Tz ld mK ld -EV -xN +Qf +Tz lc -UP -UP -UP -UP -UP -UP -RA -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +My +My +My +My +My +My +ur +My +My +My +My +My +My +My +My +My +Wg dA dA ac @@ -35104,59 +35101,59 @@ ac ac ac ac -rs -Bg -rs +um +fY +um bl bl bl bl bl bl -rs -rs -Bg -rs +um +um +fY +um ac ac ac ac dA dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg ae ae ae @@ -35168,100 +35165,100 @@ ae ae ae dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Ef -UP -UP -Ef -UP -UP +Wg +My +My +My +My +My +My +My +My +My +My +My +SZ +My +My +SZ +My +My dA LG -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP +My +My +My +My +My +My +Wg +My +My +My LG dA ae dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My eJ -fa +ZU dZ -wQ -eu -gC -gP -hh -fV -hv -gR -hu +NL +Ov +Rz +Zx +pH +Rq +ik +OC +aJ tE PG tG ea -so -jV -kv -io -UP -UP -UP -io -mL -io -UP -UP -UP -UP -UP -UP -UP -UP -UP -RA -UP -UP -UP -UP -UP -UP -UP -UP -UP +Hk +qh +jN +iM +My +My +My +iM +BK +iM +My +My +My +My +My +My +My +My +My +ur +My +My +My +My +My +My +My +My +My dA dA dA @@ -35361,165 +35358,165 @@ ac ac ac ac -rs -Bg -rs +um +fY +um bl bl bl bl bl -rs -rs -Bg -Bg -rs -ac -ac -ac -ac -dA -dA -UP -UP -UP -UP -QH -UP -UP -UP -UP -UP -UP -ya -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -ae -ae -ae -ae -ae -ae -ae -ae -ae -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +um +um +fY +fY +um +ac +ac +ac +ac +dA +dA +My +My +My +My +dh +My +My +My +My +My +My +NU +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg +My +My +My +My +My +ae +ae +ae +ae +ae +ae +ae +ae +ae +dA +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +dA +Wg +My +My +My +My +My +My +My +My +My +My LG -UP -dA -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +dA +dA +My +My +My +My +My +My +My +My +My +My +My +My dZ dZ ea ea op ea -xq -gj -gD -Fk -hi -fV -hv -gR -hu +WW +Ye +WD +nL +iB +Rq +ik +OC +aJ Um Tx vu ea -HH -jX -ku +of +TS +oq hI -UP -UP -UP -mv -lM -io -UP -UP -UP -UP -UP -UP -UP -UP -UP -RA -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP +My +My +My +yT +Ue +iM +My +My +My +My +My +My +My +My +My +ur +My +My +My +My +My +My +My +My +Wg +My dA dA dA @@ -35617,60 +35614,60 @@ ac ac ac ac -rs -rs -Bg -rs -rs -rs -rs -rs -rs -rs -Bg -Bg -rs -rs +um +um +fY +um +um +um +um +um +um +um +fY +fY +um +um ac ac ac dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +Wg +My +My +My +My +My +My +My +My +My +My +Wg +My +My +My +My +My +My +My +My +My +My +My ae ae ae @@ -35680,103 +35677,103 @@ ae ae ae dA -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My QS -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Ef -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +SZ +dA +My +My +My +My +My +My +My +My +My +My LG dA -UP -dA -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +dA +My +My +Wg +My +My +My +My +My +My +My +My +My +My ea ed et ea -sF +QG ea -fV -Br -gE -fV -fV -fV -hv -hE +Rq +bU +aY +Rq +Rq +Rq +ik +Ju eI ea dZ dZ ea hJ -qZ -kx +OW +LL hI hI -io -io -io -mM -io -io -io +iM +iM +iM +rt +iM +iM +iM hI hI hI hI -yd -UP -UP -RA -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +Dl +My +My +ur +My +My +My +My +My +My +My +My +My +Wg dA dA dA @@ -35873,61 +35870,61 @@ ac ac ac ac -rs -rs -eE -Bg -CB -rs -rs -Bg -Bg -AN -Bg -Bg -rs -rs +um +um +kj +fY +bJ +um +um +fY +fY +EZ +fY +fY +um +um ac ac ac ac dA dA -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +Wg +My +My +My +My +My +My +My +My +My +My +My +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My ae ae ae @@ -35936,104 +35933,104 @@ ae ae ae dA -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My QS QS QS -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -dA -dA -UP -xc -UP -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -RR -ee -eu -eK -Hu -fv -fW -gl -gF -gR -gR -gR +My +My +My +My +My +My +My +My +My +My +My +dA +My +My +My +My +My +My +My +My +My +Wg +dA +dA +My +YX +My +dA +My +My +My +My +My +My +My +My +My +My +My +os +kd +Ov +Ky +ah +aQ +nx +zl +fo +OC +OC +OC fk fk -hN +ge ea -Lg -aS +UZ +Oa eI -qW -CV -ky -kN -lf -lF -lF -lF -jG -lF -lF -no -zZ -KV -xA -WH -fe -Kf -Kf -RA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +HY +bt +Bx +OL +px +Xu +Xu +Xu +qm +Xu +Xu +Wu +VR +sO +ki +WE +gg +Bz +Bz +ur +My +My +My +My +My +My +My +My +My +My dA dA dA @@ -36130,19 +36127,19 @@ ac ac ac ac -rs -Bc -ow -Bg -Bg -Bg -Bg -Bg -rs -rs -rs -rs -rs +um +qA +UI +fY +fY +fY +fY +fY +um +um +um +um +um ac ac ac @@ -36150,40 +36147,40 @@ ac ac dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA dA -UP -Dn +My +Wg dA dA -UP -UP -UP -UP -UP -UP -UP -UP -Dn +My +My +My +My +My +My +My +My +Wg dA ae ae @@ -36192,106 +36189,106 @@ ae ae ae dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP +Wg +My +My +My +My +My +My +My +My QS -UP -UP -UP -UP -UP -UP -UP -UP -sA -UP -UP -UP +My +My +My +My +My +My +My +My +Lf +My +My +My dA LG -UP -UP -UP -UP +My +My +My +My QS -UP -UP -UP -UP -dA -UP -UP -dA -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -SN -RR -sj -Hx -WC -Ct -Na -FW -yW -Ml -bI +My +My +My +My +dA +My +My +dA +dA +My +My +My +My +My +My +My +My +My +My +My +xm +os +ZA +eR +Za +Ce +Gx +si +Xp +Dx +cb fk fk fk -hF -hN -uN -gp -Xi -ta -jy -jU -jV -jU -jX -Ei -tq -Sw -LB -tq -tq -tq -Ji -QV -kF -mB -ww -RA -RA -RA -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP +fP +ge +Qq +fc +Ds +iu +qP +lG +qh +lG +TS +eL +EQ +GP +ne +EQ +EQ +EQ +Da +np +Uu +sx +OS +ur +ur +ur +My +My +My +My +My +My +My +My +My +Wg +My dA dA ac @@ -36386,16 +36383,16 @@ ac ac ac ac -rs -rs -CB -Bg -KQ -Bg -CB -rs -rs -rs +um +um +bJ +fY +XO +fY +bJ +um +um +um ac ac ac @@ -36407,41 +36404,41 @@ ac ac dA dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg +My +My +My +My +My +My +My dA -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My ae ae ae @@ -36449,105 +36446,105 @@ ae ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -SN -SN -SN -SN -SN -SN -GB -GB -UP -UP -Dn +My +My +My +My +My +My +My +My +My +My +My +My +xm +xm +xm +xm +xm +xm +Ff +Ff +My +My +Wg dA -UP -UP -UP +My +My +My QS QS QS -UP -UP +My +My LG dA -UP -UP -yb -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +DS +My +My +My +My +My +My +My +My +My +My +My +My ZJ ea ea dZ ea ea -Se +iQ dZ ea vk dZ -zt -ws -hw -hw -hN +Nk +cI +LU +LU +ge ea -iv -iO +TM +Az eI -Hr -Gf -jF -kO -lh -lH -io -io +DJ +tL +MG +oV +ZH +na +iM +iM hI -io -io -io +iM +iM +iM hI -Fu -XL +wV +ug hI -Qb -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +jZ +My +My +My +My +My +My +My +My +My +My +My +My +Wg dA dA dA @@ -36643,14 +36640,14 @@ ac ac ac ac -rs -CB -Bg -Bg -Bc -Bc -rs -rs +um +bJ +fY +fY +qA +qA +um +um ac ac ac @@ -36664,40 +36661,40 @@ ac ac dA dA -UP -UP -UP -UP -UP -ya -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -Gy -Dh +My +My +My +My +My +NU +Wg +My +My +My +My +My +My +My +My +My +Wg +Gd +YW LG -UP -Dn +My +Wg LG LG -UP -Dn -Dn -UP -UP -UP -UP -UP -UP -Dn +My +Wg +Wg +My +My +My +My +My +My +Wg dA ae ae @@ -36705,107 +36702,107 @@ ae ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -SN +My +My +My +My +My +My +My +My +My +My +My +My +My +xm IP IP IP BE IP Au -GB -SN -UP -UP -UP -UP -UP -UP -UP +Ff +xm +My +My +My +My +My +My +My QS -UP -UP -UP -dA -UP -UP -SN -OP -SN -SN -SN -SN -SN -SN -SN -SN -SN -SN -SN -SN -SN -UP -UP -UP +My +My +My +dA +My +My +xm +al +xm +xm +xm +xm +xm +xm +xm +xm +xm +xm +xm +xm +xm +My +My +My ea -ff -fy -Ow -gn +OA +Ti +Oj +PF BR dZ ea -fV -hx -AW +Rq +Je +Bs eI dZ ea ea ea hI -CV -kz +bt +Xf hJ hJ hJ -io -UP -Pc -UP -UP -UP +iM +My +yY +My +My +My hI hI hI hI -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA dA ac @@ -36900,13 +36897,13 @@ ac ac ac ac -EW -rs -rs -rs -rs -rs -rs +Xv +um +um +um +um +um +um ac ac ac @@ -36921,39 +36918,39 @@ ac ac dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg +My LG -Zc -UP -Zc -Dh -Dh +ti +My +ti +YW +YW LG -Dh -Dh +YW +YW dA dA dA dA -UP -UP -UP -UP +My +My +My +My dA ae ae @@ -36962,107 +36959,107 @@ ae ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -SN +My +My +My +My +My +My +My +My +My +My +My +My +My +xm IP aO xa CP Bq Au -Kf -SN -SN -UP -UP -UP -dA -Dn -UP -UP -UP -Dn -dA -UP -UP -SN -SN -dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +Bz +xm +xm +My +My +My +dA +Wg +My +My +My +Wg +dA +My +My +xm +xm +dA +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My ea -Lh -fy -eu -go +tQ +Ti +Ov +ir fk -gT +Xj ea -Yq -hy +cq +LC fk fk -if +qz dZ -UP -UP +My +My hJ -kb -kA +yg +ij hI -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -Dn -UP -UP -UP -Dn +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg +My +Wg +My +My +My +Wg dA dA ac @@ -37178,39 +37175,39 @@ ac ac dA dA -UP -UP -UP -UP -QH -UP -UP -UP -UP -UP -UP -UP -UP -UP -Gy +My +My +My +My +dh +My +My +My +My +My +My +My +My +My +Gd LG LG -UP -UP -UP -UP -UP -Dn -UP -UP -Dn -UP +My +My +My +My +My +Wg +My +My +Wg +My LG dA -UP -UP -UP -UP +My +My +My +My dA ae ae @@ -37218,108 +37215,108 @@ ae ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -sA -SN +My +My +My +My +My +My +My +My +My +My +My +My +My +Lf +xm IP HJ Zo CP Bq Au -Kf -UP -SN -SN -SN -sA -SN -SN -SN -SN -SN -SN -SN -SN -SN -SN -UP -dA -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +Bz +My +xm +xm +xm +Lf +xm +xm +xm +xm +xm +xm +xm +xm +xm +xm +My +dA +dA +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dZ -fh -fz -ee -gp +pL +cL +kd +fc fk -gU +lz dZ -hn +lP fk fk fk -ig +Xm dZ -UP -UP -io -jU -jG -jC -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +iM +lG +qm +vB +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA dA dA @@ -37435,34 +37432,34 @@ ac ac dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -Dn -UP -xc -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +My +My +My +My +My +My +My +My +My +Wg +My +My +Wg +My +YX +My +My +My +My +My +My +My +My +My +My +My +My +Wg LG dA dA @@ -37474,109 +37471,109 @@ ae ae ae dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -SN -GB -UP +Wg +My +My +My +My +My +My +My +My +My +My +My +My +xm +Ff +My IP MW ZY CP -vI +qY Au -Kf -UP -UP -UP -UP -Kf -UP -UP -SN -UP -UP -UP -UP -UP -UP -SN -SN -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +Bz +My +My +My +My +Bz +My +My +xm +My +My +My +My +My +My +xm +xm +dA +My +My +My +My +My +My +My +My +My +My +My +My +My dZ dZ ea ea -Ai -fz -ee -gq +Pk +cL +kd +WP gI -gV +KL ea -eK -FJ +Ky +Ft fk -hF -ih +fP +kD ea -UP -UP -io -jU -vo -Xh -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP +My +My +iM +lG +xB +HN +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg +My +My +My +My +My dA dA dA @@ -37692,34 +37689,34 @@ ac ac dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My dA LG -Zc -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +ti +My +My +My +My +My +My +My +My +My +My +My +My +My LG LG dA @@ -37731,109 +37728,109 @@ ae ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -SN -SN -Kf -UP +My +My +My +My +My +My +My +My +My +My +My +My +xm +xm +Bz +My IP Ro Uw Qx vj Au -AS -UP -UP -UP -UP -Kf -UP -UP -SN -UP -UP -UP -UP -UP -UP -UP -SN -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +XH +My +My +My +My +Bz +My +My +xm +My +My +My +My +My +My +My +xm +dA +My +My +My +My +My +My +My +My +My +My +My +My +My ea -eg -eg +zi +zi eI -tf -fA -fZ +wi +dY +kH eJ eI eJ ea -ho -jE -Pa -YM -ii +TH +HO +FI +GX +rD ea -UP -UP -io -ke -hz -De -rY -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -Dn +My +My +iM +vr +cv +Zz +vg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg +My +My +Wg dA dA dA @@ -37949,102 +37946,102 @@ ac ac dA dA -UP -UP -UP -UP -QH -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +dh +My +My +My +My +My +My +My LG LG -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -dA -dA -UP -ae -ae -ae -dA -UP -UP -UP -UP -UP -UP -UP -Mo -UP -UP -UP -UP -SN -SN -UP -Kf -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg +dA +dA +My +ae +ae +ae +dA +My +My +My +My +My +My +My +oY +My +My +My +My +xm +xm +My +Bz +My IP IP IP IO Au Au -pO -UP -UP -UP -UP -Kf -UP -UP -SN -UP -UP -UP -UP -UP -UP -UP -SN -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +Sn +My +My +My +My +Bz +My +My +xm +My +My +My +My +My +My +My +xm +dA +My +My +My +My +My +My +My +My +My +My +My +My +My dZ -eh -eh -eM +BI +BI +Jt fk fB fk @@ -38058,38 +38055,38 @@ ea ea dZ ea -UP -YU +My +Xc hI -kf -SA +Lk +vd hI -SF -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +gO +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA dA dA @@ -38206,36 +38203,36 @@ ac ac dA dA -Dn -UP -UP -UP -UP -UP -ya -UP -UP -UP -UP -UP +Wg +My +My +My +My +My +NU +My +My +My +My +My LG LG -UP -UP -UP -UP -UP -UP -yI -UP -UP -UP -UP -UP -UP -UP -UP -Dn +My +My +My +My +My +My +kp +My +My +My +My +My +My +My +My +Wg LG dA dA @@ -38244,60 +38241,60 @@ ae ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -SN -SN -Yo -Kf -Kf -Kf -Kf -Kf -Kf -Kf -Kf -Kf -Kf -Kf -Kf -Kf -Yo -Kf -Kf -Kf -GB -UP -UP -UP -UP -UP -UP -UP -SN -dA -dA -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +xm +xm +hX +Bz +Bz +Bz +Bz +Bz +Bz +Bz +Bz +Bz +Bz +Bz +Bz +Bz +hX +Bz +Bz +Bz +Ff +My +My +My +My +My +My +My +xm +dA +dA +My +My +My yV -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My dZ ei ex @@ -38309,44 +38306,44 @@ fk fk gX dZ -UP -UP -UP -UP -UP -UP -UP -UP -jC -jU -kE -io -UP -UP -UP -UP -UP -UP -UP -Zt -UP -xl -Me -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +My +My +My +My +My +My +My +My +vB +lG +dF +iM +My +My +My +My +My +My +My +uF +My +Py +Hd +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg dA dA dA @@ -38463,148 +38460,148 @@ ac ac dA dA -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -Dn +My +My +My +My +My +My +Wg +My +My +My +My +Wg LG -UP -UP -UP -UP -UP -UP -UP -Xe -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +ND +My +My +My +My +My +My +My +My +My LG -UP -UP -dA -ae -ae -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -SN -UP -Kf -UP -UP -UP -UP -UP -UP -uy -UP +My +My +dA +ae +ae +dA +My +My +My +My +My +My +My +My +My +My +My +My +xm +My +Bz +My +My +My +My +My +My +Gm +My aL -UP -UP +My +My aL -UP -Kf -UP -UP -UP -GB -UP -UP -UP -UP -UP -UP -UP -SN -sA -xc -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +Bz +My +My +My +Ff +My +My +My +My +My +My +My +xm +Lf +YX +My +My +My +My +My +My +My +My +My +My +My +My ea -ej -ey -xL -fm -EC -ga -gs -gK -Mq +ef +AI +vx +Gh +qy +cH +OR +NR +EY MM -UP -UP -UP -UP -UP -Qt -UP -OF -jB -oZ -jG -io -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +DQ +My +lA +jS +wu +qm +iM +My +My +My +My +My +My +My hI -jC -uI -jC -jC -jC -jC -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP +vB +Df +vB +vB +vB +vB +My +My +My +My +My +My +Wg +My +My +My +My +My +My dA dA dA @@ -38720,147 +38717,147 @@ ac ac dA dA -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -Ev -UP -UP -UP -UP -UP -UP -UP -Bm -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -dA -dA -ae -ae -ae -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -SN -UP -Kf -UP -UP +My +My +My +My +My +My +Wg +My +My +My +My +My +CL +My +My +My +My +My +My +My +KF +My +My +My +My +My +My +My +My +My +Wg +dA +dA +ae +ae +ae +dA +My +My +My +My +My +My +My +My +My +My +My +My +xm +My +Bz +My +My aL -UP +My aL aL aL aL aL aL -UP -UP -UP -Kf -UP -UP -UP -GB -Kf -Kf -Kf -Kf -Kf -Kf -Kf -Kf -RA -Ev -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +Bz +My +My +My +Ff +Bz +Bz +Bz +Bz +Bz +Bz +Bz +Bz +ur +CL +My +My +My +My +My +My +My +My +My +My +My +My dZ -HQ -QM -ez -ez +NJ +Nq +nE +nE fE -gb -gt -QM -Cz +vt +SE +Nq +Jd ea -UP -UP -UP -UP -UP -UP -UP -UP -jC -jU -kG -io -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +vB +lG +yK +iM +My +My +My +My +My +My +My hI -IG -ZR -pu -qQ -DP -jC -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP +Fi +XQ +Vl +Mt +kI +vB +My +My +My +My +My +My +My +My +Wg +My +My +My dA dA dA @@ -38978,60 +38975,60 @@ ac dA dA dA -UP -UP -UP -UP -QH -UP -UP -UP -UP -UP -Dn -xc -UP -UP -UP -UP -UP -UP -UP -Eq -UP -UP -UP -UP -UP -UP -UP -UP -Dn +My +My +My +My +dh +My +My +My +My +My +Wg +YX +My +My +My +My +My +My +My +Ng +My +My +My +My +My +My +My +My +Wg LG -UP -UP -dA -ae -ae -dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -sA -Kf -Kf -UP -UP -UP +My +My +dA +ae +ae +dA +Wg +My +My +My +My +My +My +My +My +My +My +My +Lf +Bz +Bz +My +My +My wj aL aL @@ -39040,35 +39037,35 @@ aL aL wj aL -UP -UP -Kf -UP -UP -UP -sA -UP -UP -UP -UP -UP -UP -UP -UP -sA -xc -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +Bz +My +My +My +Lf +My +My +My +My +My +My +My +My +Lf +YX +My +My +My +My +My +My +My +My +My +My +My +My ea ea ea @@ -39080,17 +39077,17 @@ gu ea ea ea -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My hJ hI hI -PB -Ht +NF +ZK hJ hJ hJ @@ -39100,24 +39097,24 @@ hI hI hJ hJ -Pw -wy -kE -zA -vo -jC -jC -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +pF +RY +dF +WF +xB +vB +vB +My +My +My +My +My +My +My +My +My +My +Wg dA dA dA @@ -39235,35 +39232,35 @@ ac ac dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My LG -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My LG dA dA @@ -39271,22 +39268,22 @@ dA ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -SN -UP -Kf -UP +My +My +My +My +My +My +My +My +My +My +My +My +xm +My +Bz +My aL aL ZX @@ -39299,33 +39296,33 @@ Zr aL aL aL -Kf -UP -UP -UP -SN -UP -UP -UP -UP -UP -UP -UP -UP -dA -dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +Bz +My +My +My +xm +My +My +My +My +My +My +My +My +dA +dA +Wg +My +My +My +My +My +My +My +My +My +My +My ea el er @@ -39337,45 +39334,45 @@ gv gM ha ea -UP -UP -UP -UP -UP -YU +My +My +My +My +My +Xc hJ -uA -Xa -Rj -UU -qb -It -lI -PO -PO -mP -yw -zA -Gb -Tk -Un -kE -kE -Cu -AF -jC -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +AG +Sv +jJ +iD +zc +iK +eT +nN +nN +yi +Dp +WF +gG +ra +RI +dF +dF +Do +lu +vB +My +My +My +My +My +My +My +My +My +My +My +Wg dA dA dA @@ -39477,50 +39474,50 @@ ac ac ac aU -CA -bF +Yc +PV aU -Dg -bX -cC -Hj -bX -de -dl +Lc +Eg +ai +BP +Eg +Zg +SG aU ac ac dA dA dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -Dn +Wg +My +My +My +My +My +My +My +My +Wg LG -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg LG ae ae @@ -39528,23 +39525,23 @@ ae ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -SN -UP -Kf -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +xm +My +Bz +My +My UO ZX aL @@ -39555,34 +39552,34 @@ aL ZX aL aL -UP -Kf -UP -UP -UP -SN -UP -UP -UP -UP -UP -UP -UP -UP -xc -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +Bz +My +My +My +xm +My +My +My +My +My +My +My +My +YX +My +My +My +My +My +My +My +My +My +My +My +My +My ea em eB @@ -39594,45 +39591,45 @@ en Mj eq ea -UP -UP -UP -UP -UP -UP -io -uh -jF -iE -BX -kR -ZV -Lw -mh -HK -DX -rG -Dv -ja -UG -HK -yl -lJ -nY -wS -jC -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +iM +GK +MG +qI +ay +Qg +sr +EX +Th +dR +dL +NS +Kk +bL +ou +dR +pV +qN +Os +TE +vB +My +My +My +My +My +My +My +My +My +My +My +My dA dA dA @@ -39734,74 +39731,74 @@ ac aU aU aU -bw +vb aU aU -bY +aW Ih cD -Kw +YV cn df -BN +hC aU aU aU aU dA dA -UP -UP -UP -QH -UP -UP -UP -UP -UP -UP +My +My +My +dh +My +My +My +My +My +My LG -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -dA -dA -UP -ae -ae -ae -dA -UP -UP -UP -UP -UP -DA -UP -UP -UP -UP -UP -UP -UP -SN -UP -Kf +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +dA +dA +My +ae +ae +ae +dA +My +My +My +My +My +ui +My +My +My +My +My +My +My +xm +My +Bz aL -UP +My aL ZX aL @@ -39812,34 +39809,34 @@ wj ZX aL aL -UP -Kf -UP -UP -UP -SN -UP -UP -UP +My +Bz +My +My +My +xm +My +My +My QS -UP -UP -UP -UP -Us -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +is +My +My +My +My +My +My +My +My +My +My +My +My +My ea en en @@ -39851,44 +39848,44 @@ eq en eq vG -UP -UP -UP -UP -UP -UP -io -hV -jF -RD +My +My +My +My +My +My +iM +yj +MG +zz hI hI -lm +pc hJ hI hI -mR +rm hJ hJ -kV +nS hI hJ -nO +lg hJ hI hI hJ -SF -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +gO +My +My +My +My +My +My +My +My +My +My dA dA dA @@ -39990,50 +39987,50 @@ ac ac aU bd -aw -Dq -wZ +lK +hB +Sl aU -bZ -co -cE -cQ -cV -cE -dn +uq +jH +VH +yx +do +VH +IW aU -dw -rv +bv +ak aU -wN -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -Dn +OM +My +My +My +My +My +My +My +My +My +Wg +My +Wg LG -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg LG dA dA @@ -40041,24 +40038,24 @@ ae ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -SN -UP -Kf -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +xm +My +Bz +My +My aL ZX aL @@ -40070,33 +40067,33 @@ ZX aL aL aL -Kf -UP -UP -UP -SN -UP -UP -UP -UP -UP -UP -UP -UP -xc -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +Bz +My +My +My +xm +My +My +My +My +My +My +My +My +YX +My +My +My +My +My +My +My +My +My +My +My +My +My ec eo eq @@ -40108,16 +40105,16 @@ eq en FC ec -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My hJ YO -jG -RD +qm +zz hJ BQ US @@ -40127,26 +40124,26 @@ Wj yQ Sk hJ -lM +Ue hJ vR yP YF hI -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -Dn +My +My +My +My +My +My +My +My +My +My +My +My +Wg +Wg dA dA dA @@ -40246,76 +40243,76 @@ ac ac ac aU -be -pQ -Dq -Ar -bO -ca -cp -ca -wK -DY -ca -ca -Hp -dx -Mg -xH -xZ -XY -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +to +ub +hB +JJ +ZC +WZ +JQ +WZ +lj +sM +WZ +WZ +Nr +pE +pA +sU +Yu +Wh +My +My +My +My +My +My +My +My +My +My +My dA LG -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My LG LG -UP +My dA dA ae ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -SN -UP -Kf -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +xm +My +Bz +My +My aL ZX aL @@ -40326,34 +40323,34 @@ aL ZX aL aL -UP -Kf -UP -UP -UP -SN -UP -UP -UP -UP -UP -UP -UP -UP -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +Bz +My +My +My +xm +My +My +My +My +My +My +My +My +dA +My +My +My +My +My +My +My +My +My +My +My +My +My ea ep eq @@ -40365,16 +40362,16 @@ eq eQ hc ea -UP -UP +My +My hI hI hJ hJ hJ CZ -jF -dT +MG +cT hI LX fU @@ -40387,23 +40384,23 @@ hJ Gp hI xb -Zn +EK Am hJ -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg dA dA dA @@ -40504,74 +40501,74 @@ ac ac aU aU -Ks -oO -Ey -bP -ZM -wW -sl -Ad -wK -sl -wK +FD +rV +mS +GW +xC +ab +BW +HE +lj +BW +lj aU -dy -dD +pZ +ns aU dA -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -Dn +My +My +My +My +My +My +Wg +My +My +My +My +My +My +Wg LG LG -Dh -Dh -Dh -Dh +YW +YW +YW +YW LG -Dh -Dh -Dh -Dh -Dh +YW +YW +YW +YW +YW LG dA dA -Dn +Wg dA ae ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My QS -UP -UP -SN -UP -Kf -UP +My +My +xm +My +Bz +My aL aL ZX @@ -40584,33 +40581,33 @@ FP aL aL aL -Kf -UP -UP -UP -SN -UP -UP -UP -UP -UP -UP -UP -UP -YK -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +Bz +My +My +My +xm +My +My +My +My +My +My +My +My +Jb +My +My +My +My +My +My +My +My +My +My +My +My +My ea eq eF @@ -40622,16 +40619,16 @@ eq en eq ea -UP -UP +My +My hI -hP +qK hJ -iw +CK hJ sY -yO -xF +Rk +xn hI hJ hJ @@ -40647,19 +40644,19 @@ hJ hJ hJ hJ -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My dA dA dA @@ -40761,76 +40758,76 @@ ac ac ac aU -Sz -WN -tn +Yd +tS +ks aU -bP -EL -cG +GW +uK +DH aU -cY -dg -ES +fI +VT +hY aU aU aU aU dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -dA -dA -Dn -UP -UP -Dn -Dn -Dn -UP -UP -UP -Dn +My +My +My +My +My +My +My +My +My +My +My +My +My +dA +dA +Wg +My +My +Wg +Wg +Wg +My +My +My +Wg LG dA -Dn -UP -ya +Wg +My +NU dA ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My QS QS QS -UP -SN -UP -Kf -UP -UP -UP +My +xm +My +Bz +My +My +My aL aL aL @@ -40840,34 +40837,34 @@ aL aL aL aL -UP -Kf -UP -UP -SN -SN -UP -UP -UP -UP -UP -UP -UP -UP -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +Bz +My +My +xm +xm +My +My +My +My +My +My +My +My +dA +My +My +My +My +My +My +My +My +My +My +My +My +My ea er em @@ -40879,45 +40876,45 @@ en eB eq ea -UP -UP +My +My hJ -hQ +pP hI -ix +xj yZ hI -rb -sf -Jx -JT -MU -Pp -MU -MU -MU -Qj -VK -Ic +Hg +QZ +qg +Bk +Tg +je +Tg +Tg +Tg +VW +qJ +Gw hJ -Pp -Ql +je +xu hI -oD -UP -UP -UP -XU -wo -wd -QJ -UP -UP -UP -UP -UP -UP -Dn +dt +My +My +My +OK +PE +mm +nJ +My +My +My +My +My +My +Wg dA dA ac @@ -41022,9 +41019,9 @@ at at at at -zs -qn -xv +Sf +Rx +lV aU aU aU @@ -41035,96 +41032,96 @@ ac dA dA dA -Dn -UP -QH -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +Wg +My +dh +My +My +My +My +My +My +My +My +My +My +My +My +My dA dA -UP -Dn -UP +My +Wg +My LG LG dA -Dn +Wg dA dA dA dA -UP +My dA ae ae ae dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP +Wg +My +My +My +My +My +My +My +My QS -UP -UP -SN -UP -Kf -UP -UP -UP -UP +My +My +xm +My +Bz +My +My +My +My aL aL aL aL aL aL -DA -UP -UP -Kf -UP -UP -SN +ui +My +My +Bz +My +My +xm QS -UP -UP -UP -UP -UP -UP -UP -UP -dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +dA +Wg +My +My +My +My +My +My +My +My +My +My +My +My ea el eH @@ -41136,45 +41133,45 @@ eH eq eq ea -UP -UP +My +My hI -xh -TN -LZ -RC -WV -DM -Ck -ps +tA +sJ +Qr +Zy +zb +Bf +Ll +HD hJ hJ Gp -mi -mA -mU -nc -nl -Vx -qt -MU -nQ -nV -nC -WL -WL -WL -yn -Rt -KU -UP -II -UP -UP -UP -UP -UP -UP +jh +aM +yz +Ul +nn +zR +zE +Tg +RJ +Cn +ZB +pg +pg +pg +Uv +rx +fb +My +AQ +My +My +My +My +My +My dA dA ac @@ -41270,118 +41267,118 @@ ac ac ac at -JA -aF -aN -aV -yv -bq -bA -Cf +hq +Ii +hO +ut +Pz +Pn +JD +GE at -UX -ca -Nb +iW +WZ +JF aU -Vb -ZE -dq +Ud +ZP +FF aU ac ac ac dA dA -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -XY -UP -UP -UP -UP -UP -dA -dA -UP -UP -dA -ae -ae -ae -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -SN -SN -Kf -UP -Mo -UP -UP +My +My +My +My +My +My +My +My +Wg +My +My +My +My +My +My +My +My +My +My +My +Wh +My +My +My +My +My +dA +dA +My +My +dA +ae +ae +ae +dA +My +My +My +My +My +My +My +My +My +My +My +My +xm +xm +Bz +My +oY +My +My aL aL -Kf -Kf -Kf +Bz +Bz +Bz aL -UP -UP -UP -Kf -UP -SN -SN -UP -UP -UP -UP -UP -UP -UP -UP -UP -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +Bz +My +xm +xm +My +My +My +My +My +My +My +My +My +dA +My +My +My +My +My +My +My +My +My +My +My +My +My ea ea ea @@ -41393,45 +41390,45 @@ vp ea ea ea -UP -UP +My +My hI -BU -oE -LZ -im +kC +Ur +Qr +ym hJ -yA -us -BO -CF +bo +Yk +DZ +MS hJ -lO +Nm hI hJ hI hI -vV +Dc hI hI GR -nR +pf hJ -Fz -UP -UP -UP -OD -CM -Fz -UP -CN -UP -UP -UP -UP -UP -Dn +fs +My +My +My +rU +YI +fs +My +Sa +My +My +My +My +My +Wg dA dA ac @@ -41527,146 +41524,146 @@ ac ac ac at -az -uf -uf -uf -aV -br -bB -Tt +Qy +TR +TR +TR +ut +So +rk +VN at -QL -ca -Fr -XG -da -di -dW +kk +WZ +kL +Ga +dV +NW +vC aU ac ac ac dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -dA -UP -UP -UP -UP -dA -dA -ae -ae -ae -ae -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -sA -GB -UP -UP -UP -UP -UP -UP -Kf +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +dA +My +My +My +My +dA +dA +ae +ae +ae +ae +dA +My +My +My +My +My +My +My +My +My +My +My +My +Lf +Ff +My +My +My +My +My +My +Bz XV -Kf -UP -UP -UP +Bz +My +My +My aL -Kf -GB -sA -UP -dA -UP -UP -Dn -dA -UP -UP -UP -UP -Zc -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +Bz +Ff +Lf +My +dA +My +My +Wg +dA +My +My +My +My +ti +dA +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My hI hI hI -aG +ol hJ hI -tx -vO -VC -NO +bp +OG +vW +rB hI -lM +Ue hI -UP -UP +My +My hI zK Gp @@ -41674,20 +41671,20 @@ hI hJ hJ hJ -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg dA dA dA @@ -41784,18 +41781,18 @@ ac ac ac at -aA -uf -aP -MI -bg -wI -bC -bC -Ip -cf -ct -ts +hO +TR +EN +Jz +Vj +AC +Re +Re +Lp +xd +EP +ue aU aU aU @@ -41807,145 +41804,145 @@ ac dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -dA -UP -dA -UP -dA -ae -ae -ae -ae -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -zT -GB -Kf -Kf -Kf -Kf -Kf -Kf -Kf -Kf -Kf -Kf -Kf -Kf -zT -SN -UP -Dn -dA -dA -dA -dA -dA -dA -UP -UP -UP -UP -YK -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +dA +My +dA +My +dA +ae +ae +ae +ae +dA +My +My +My +My +My +My +My +My +My +My +My +My +My +ln +Ff +Bz +Bz +Bz +Bz +Bz +Bz +Bz +Bz +Bz +Bz +Bz +Bz +ln +xm +My +Wg +dA +dA +dA +dA +dA +dA +My +My +My +My +Jb +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My hI -xw -qY -RC -VB +qi +Kh +Zy +DW hI -pv -oL -kl -uk +qx +RK +bm +ty hJ Gp hI -UP -UP +My +My hI -Qi +lC hI hI -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg dA dA ac @@ -42041,22 +42038,22 @@ ac ac ac at -aB -uf -uf -DF -bh -Li -bD -uU +EI +TR +TR +OV +Od +Mh +gm +YJ at -JP -cu -Nb -cU -db -dj -RU +JS +Yh +JF +hM +ry +ny +PR aU ac ac @@ -42064,71 +42061,71 @@ ac ac dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -dA -dA -ae -ae -ae -ae -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -SN -SN -UP -Kf -UP -UP -UP -UP -UP -UP -UP -UP -SN -SN -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +dA +dA +ae +ae +ae +ae +dA +My +My +My +My +My +My +My +My +My +My +My +My +My +My +xm +xm +My +Bz +My +My +My +My +My +My +My +My +xm +xm +My +My dA LG dA @@ -42137,72 +42134,72 @@ LG LG dA dA -UP -UP -UP -xc -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +YX +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My hI -SQ -LZ -LZ -VB +YS +Qr +Qr +DW hI -Eh -LJ -vL -VI +mn +BC +mf +uo hJ Gp hJ -UP -UP -OD -CM -Gk -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +rU +YI +FQ +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA dA ac @@ -42298,22 +42295,22 @@ ac ac ac at -Hh -aB -aR -aZ -Pt -bu -yf -wR +zO +EI +hO +gN +Si +xk +GI +OJ at -Vd -zX -th +wD +lk +le aU -dc -Ah -JB +Cb +uT +wT aU ac ac @@ -42321,144 +42318,144 @@ ac ac dA dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -dA -dA -ae -ae -ae -ae -ae -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -SN -SN -Kf -UP -UP -UP -UP -UP -UP -UP -SN -SN -UP -UP -dA -dA -dA -UP -Dn -UP -UP +Wg +My +My +My +My +My +My +My +My +My +My +My +Wg +My +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +dA +dA +ae +ae +ae +ae +ae +dA +My +My +My +My +My +My +My +My +My +My +My +My +My +My +xm +xm +Bz +My +My +My +My +My +My +My +xm +xm +My +My +dA +dA +dA +My +Wg +My +My LG -Dn -dA -UP -UP -dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +Wg +dA +My +My +dA +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My hI hI -Si -xX +Qm +DN hI hI -jM -km -km -jM +Nf +rA +rA +Nf hJ -kV +nS hJ hJ hJ -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA dA dA @@ -42565,7 +42562,7 @@ at at at aU -LV +jb aU aU aU @@ -42578,144 +42575,144 @@ ac ac dA dA -QH -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -XY -UP -UP -ae -ae -ae -ae -ae -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -SN -sA -SN -SN -SN -SN -SN -SN -SN -SN -UP -UP -Dn +dh +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wh +My +My +ae +ae +ae +ae +ae +dA +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +xm +Lf +xm +xm +xm +xm +xm +xm +xm +xm +My +My +Wg dA LG -UP -UP -UP -UP -UP -UP -UP -UP -UP -dA -UP -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +dA +My +dA +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My hI hJ hJ hJ -yB -RL -Wo -EU -Hf -AU -RL -Mp +fw +sL +Vt +Ca +eG +Va +sL +Yt Rm hJ -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg +My dA dA dA @@ -42820,10 +42817,10 @@ ac ac ac aU -bR -ci -cx -cM +uR +JO +Ew +ZT aU ac ac @@ -42834,145 +42831,145 @@ ac ac ac dA -Et -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -ae -ae -ae -ae -ae -ae -dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +RW +My +My +My +My +My +My +My +Wg +My +My +My +My +My +My +My +My +My +Wg +My +My +My +My +My +My +My +My +My +My +My +My +ae +ae +ae +ae +ae +ae +dA +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA LG -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -xc -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -io -YT -zG -Hf -ZD -RL -RL -JE -pd -Hf -RL +Wg +My +My +My +My +My +My +My +My +My +My +My +YX +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +iM +pT +yr +eG +CX +sL +sL +Or +QI +eG +sL Rm hI -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA dA ac @@ -43077,10 +43074,10 @@ ac ac ac aU -bS -wE -cy -cN +ZO +EB +ht +Oz aU ac ac @@ -43091,37 +43088,37 @@ ac ac ac ac -QH +dh dA -Dn -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +Wg +My +My +My +My +My +My +My +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My ae ae ae @@ -43130,106 +43127,106 @@ ae ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA dA dA -UP -UP -UP -UP -UP +My +My +My +My +My aL -UP -UP -UP -UP -UP -UP -dA -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -io -hr -yy -Hf -RL -RL -vq -RL -RL -RL -Hf -mC +My +My +My +My +My +My +dA +dA +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +iM +RX +mZ +eG +sL +sL +hm +sL +sL +sL +eG +kP hI -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg dA dA ac @@ -43334,10 +43331,10 @@ ac ac ac aU -bT -ck -cz -cO +Tm +Wz +st +gk aU ac ac @@ -43347,38 +43344,38 @@ ac ac ac ac -UP -UP +My +My dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg ae ae ae @@ -43387,105 +43384,105 @@ ae ae ae dA -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA LG -UP -UP -UP -UP +My +My +My +My aL yq aL -UP -UP -UP -UP -UP -UP -dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -io -sR -XA -Eb -JW -Eb -Hv -IL -WO -Xw -qF +My +My +My +My +My +My +dA +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +iM +AZ +QQ +xs +yt +xs +LW +pY +xG +Bb +Te hI hJ -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA dA dA @@ -43591,10 +43588,10 @@ ac ac ac aU -Lq -cl -cA -cN +Hl +qO +vT +Oz aU ac ac @@ -43604,40 +43601,40 @@ ac ac ac ac -UP +My ac dA dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg +My +My +My +My +My +My +My +My +My +My ae ae ae @@ -43645,71 +43642,71 @@ ae ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My dA -UP -UP +My +My dA dA -UP -UP -UP -UP -UP -UP -Dn +My +My +My +My +My +My +Wg dA LG -Dn +Wg QS -UP -UP -UP +My +My +My aL -UP +My QS -UP -UP -UP -UP -Dn -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -YU +My +My +My +My +Wg +dA +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Xc hJ hJ hI @@ -43722,28 +43719,28 @@ hJ zf hJ hJ -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg +My dA dA ac @@ -43848,10 +43845,10 @@ ac ac ac aU -bV -cm -cB -cP +JI +Ra +jD +lQ aU ac ac @@ -43860,41 +43857,41 @@ ac ac ac ac -UP -UP +My +My ac dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg +My +My +My ae ae ae @@ -43903,103 +43900,103 @@ ae ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My dA dA -UP +My dA dA dA dA -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My dA dA -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My QS QS QS -UP -UP +My +My LG dA dA -Gy -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +Gd +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My hJ hJ -jm -jO -kn -jO -jO +Jl +BD +Gl +BD +BD hJ lR lR hJ hJ -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA dA dA @@ -44116,42 +44113,42 @@ ac ac ac ac -UP -QH +My +dh ac ac ac dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My ae ae ae @@ -44161,14 +44158,14 @@ ae ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My dA dA dA @@ -44176,55 +44173,55 @@ dA dA dA dA -UP -UP -UP -UP -UP +My +My +My +My +My dA dA LG -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My QS -UP -UP -UP +My +My +My LG dA -UP -xc -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +YX +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg +dA +Wg +My +My +My +My +My +My +My +My +My +My hJ iU iX @@ -44236,27 +44233,27 @@ Vp lR lS mD -io -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +iM +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg dA dA ac @@ -44372,8 +44369,8 @@ ac ac ac ac -UP -UP +My +My ac ac ac @@ -44381,35 +44378,35 @@ ac dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA ae ae @@ -44418,70 +44415,70 @@ ae ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP -Dn +My +My +My +My +My +My +My +My +Wg dA dA dA dA dA dA -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My dA dA LG -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -dA -dA -UP -dA -Gy -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -dA -dA -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +Wg +dA +dA +My +dA +Gd +My +My +My +My +My +My +My +My +My +My +My +Wg +dA +dA +dA +My +My +My +My +My +My +My +My +My +My hI GH jn @@ -44493,25 +44490,25 @@ es lS lR mE -io -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +iM +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA dA dA @@ -44628,8 +44625,8 @@ ac ac ac ac -UP -UP +My +My ac ac ac @@ -44638,35 +44635,35 @@ ac ac dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg +My +My +My +My +My +My +My +My +My +My +My +My dA ae ae @@ -44676,69 +44673,69 @@ ae ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My dA dA dA dA XR dA -UP -UP -UP -UP -UP -UP -Dn +My +My +My +My +My +My +Wg dA dA LG -Dn -UP -UP -UP -UP -UP -UP -UP +Wg +My +My +My +My +My +My +My LG dA -UP -UP -UP -yb -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -dA -dA -dA -dA -dA -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +DS +Wg +My +My +My +My +My +My +My +My +My +My +dA +dA +dA +dA +dA +My +My +My +My +My +My +My +My +My hI GH iX @@ -44750,26 +44747,26 @@ es lR lR mF -io -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP +iM +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg +My dA dA ac @@ -44885,7 +44882,7 @@ ac ac ac ac -QH +dh ac ac ac @@ -44896,34 +44893,34 @@ ac dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA ae ae @@ -44934,68 +44931,68 @@ ae ae ae dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP +Wg +My +My +My +My +My +My +My +My dA dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My dA dA dA LG -UP -UP -UP -Dn +My +My +My +Wg LG dA dA -Bv -UP -Dn +cr +My +Wg dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My dA dA dA dA dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP +Wg +My +My +My +My +My +My +My +My hJ iX iX @@ -45008,23 +45005,23 @@ lT ml hI hI -SF -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +gO +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA dA dA @@ -45141,8 +45138,8 @@ ac ac ac ac -Et -UP +RW +My ac ac ac @@ -45153,34 +45150,34 @@ ac ac dA dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA ae ae @@ -45192,67 +45189,67 @@ ae ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP +My +My +My +My +My +My +My +My +My +Wg +My dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +My +My +My +My +My +My +My +My +My +Wg dA -UP -UP -UP +My +My +My LG LG dA dA -Er -UP -QT +bf +My +RP dA -UP -UP -xc -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +My +My +YX +My +My +My +My +My +My +My +My +My +Wg dA dA dA dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My hI iY jo @@ -45260,29 +45257,29 @@ jR MN kM hJ -wf +su hJ hJ hI -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg +My dA dA ac @@ -45393,14 +45390,14 @@ ac ac ac ac -UP -UP -UP -UP -UP -UP -UP -QH +My +My +My +My +My +My +My +dh ac ac ac @@ -45411,33 +45408,33 @@ ac dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg dA ae ae @@ -45450,93 +45447,93 @@ ae ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA -UP +My dA dA dA -UP -UP -UP -UP -UP -JC +My +My +My +My +My +ru dA dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My hJ hJ hI -io +iM hJ hJ hJ -lv -lv -GG +XM +XM +Co hJ -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA dA dA @@ -45653,11 +45650,11 @@ ac ac ac ac -UP -UP +My +My ac ac -BF +YR ac ac ac @@ -45669,33 +45666,33 @@ ac dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA ae ae @@ -45708,92 +45705,92 @@ ae ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA dA dA -Dn -uW -Qw -Qw -Qw -Qw -LO -UP -UP -Dn +Wg +Dw +fi +fi +fi +fi +cF +My +My +Wg dA dA dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +Wg +My +My +My +My +My +My +My +My +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My hI -BZ -lv -GQ +rP +XM +rM hJ -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My SD -Dn -UP -UP -UP -UP -UP -UP +Wg +My +My +My +My +My +My dA dA dA @@ -45909,12 +45906,12 @@ ac ac ac ac -UP -UP +My +My ac ac ac -oX +oo ac ac ac @@ -45926,33 +45923,33 @@ ac dA dA dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg +My +My +My +My +My +My +My +My dA ae ae @@ -45967,90 +45964,90 @@ ae ae dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -xc -CJ -UP -Rd -UP -UP -UP -UP -Xl -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +YX +Gz +My +Ym +My +My +My +My +Qn +My dA dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My hI -YP -lU -xp +FH +tk +WS hI -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My dA dA dA -UP -UP -UP -UP -UP -Dn +My +My +My +My +My +Wg dA dA ac @@ -46156,7 +46153,7 @@ ac ac ac ac -UP +My ac ac ac @@ -46164,14 +46161,14 @@ ac ac ac ac -Et -UP -UP +RW +My +My ac ac ac ac -Iv +VU ac ac ac @@ -46185,31 +46182,31 @@ dA dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA ae ae @@ -46225,87 +46222,87 @@ ae ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My QS -xc -pk -UP -Rd -UP -UP -UP -UP -Rd -UP -oM -Wp -dA -dA -dA -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +YX +Ob +My +Ym +My +My +My +My +Ym +My +iA +TB +dA +dA +dA +My +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My hJ hJ hJ hI hI -UP -UP -UP -UP -UP -UP -Dn +My +My +My +My +My +My +Wg dA dA -UP -UP -UP -UP -Dn +My +My +My +My +Wg dA dA dA @@ -46412,17 +46409,17 @@ ac ac ac ac -KM -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +VJ +My +My +My +My +My +My +My +My +My +My ac ac ac @@ -46444,29 +46441,29 @@ dA dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA ae ae @@ -46484,83 +46481,83 @@ ae ae dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -xc -pk -UP -Rd -UP -UP -UP -UP -Rd -UP -UP -UP -qs -Dn +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +YX +Ob +My +Ym +My +My +My +My +Ym +My +My +My +ib +Wg dA dA dA dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA -UP -UP -UP -UP -UP +My +My +My +My +My dA dA dA @@ -46675,7 +46672,7 @@ ac ac ac ac -UP +My ac ac ac @@ -46685,7 +46682,7 @@ ac ac ac QS -yE +SK ac ac ac @@ -46702,29 +46699,29 @@ dA dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA ae ae @@ -46742,80 +46739,80 @@ ae ae ae dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -xc -UP -UP -Rd -UP -UP -UP -UP -Rd -UP -UP -UP -qs +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +YX +My +My +Ym +My +My +My +My +Ym +My +My +My +ib dA dA dA dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg dA dA dA @@ -46932,7 +46929,7 @@ ac ac ac ac -Et +RW ac ac ac @@ -46942,7 +46939,7 @@ ac ac ac QS -Xd +Ph ac ac ac @@ -46960,28 +46957,28 @@ dA dA dA dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +Wg +My +My +My +My +My +My +My +My +My +Wg +My +My +My +My +My +My +My +My +My +My +My dA ae ae @@ -47001,34 +46998,34 @@ ae ae dA dA -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -xc -UP -UP -uW -Qw -Qw -Qw -Qw -uW -UP -UP -UP -qs +My +My +Wg +My +My +My +My +My +My +My +My +My +My +My +My +YX +My +My +Dw +fi +fi +fi +fi +Dw +My +My +My +ib dA dA ac @@ -47036,41 +47033,41 @@ dA dA dA dA -Dn -UP -Dn -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +Wg +My +Wg +My +My +My +My +Wg +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg dA dA dA @@ -47189,7 +47186,7 @@ ac ac ac ac -UP +My ac ac ac @@ -47199,8 +47196,8 @@ ac ac ac QS -Aa -UP +sC +My ac ac ac @@ -47218,27 +47215,27 @@ dA dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -Dn +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +Wg +My +My +My +Wg dA ae ae @@ -47261,29 +47258,29 @@ ae dA dA dA -UP -UP -UP -Kf -UP -Kf -Kf -Kf -Kf -UP -UP -UP -Zv -UP -UP -UP -UP -UP -UP -UP -UP -UP -Ps +My +My +My +Bz +My +Bz +Bz +Bz +Bz +My +My +My +dU +My +My +My +My +My +My +My +My +My +MF dA dA dA @@ -47294,38 +47291,38 @@ dA dA dA dA -UP +My dA -UP -UP -UP -UP +My +My +My +My dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My dA dA dA @@ -47446,7 +47443,7 @@ ac ac ac ac -UP +My ac ac ac @@ -47455,10 +47452,10 @@ ac ac ac ac -UP -Aa -UP -Rb +My +sC +My +pj ac ac ac @@ -47475,28 +47472,28 @@ ae ae dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Mv -ov +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +mo +pm tb zk zk @@ -47521,24 +47518,24 @@ ae dA dA dA -bc -BJ -bc -BJ -UP -Kf -UP -UP -UP -Om -UP -UP -Ea -Rh -Ae -Ae -zD -UP +ad +ri +ad +ri +My +Bz +My +My +My +AY +My +My +NM +IX +wt +wt +IB +My dA dA dA @@ -47554,33 +47551,33 @@ dA dA dA dA -Dn -UP +Wg +My dA dA -UP -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -UP -UP -UP -UP -UP -Dn -UP -UP -Dn +My +Wg +My +My +My +My +My +My +My +My +My +Wg +My +My +My +My +My +My +My +Wg +My +My +Wg dA dA dA @@ -47711,12 +47708,12 @@ ac ac ac ac -Et -UP -Aa -UP -UP -UP +RW +My +sC +My +My +My ac ac ac @@ -47735,25 +47732,25 @@ dA dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -Mv -dX -wm +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +My +mo +Db +rX tb zk zk @@ -47777,23 +47774,23 @@ ae ae dA dA -Mv +mo tb -Mv +mo tb -SI -Tn -KR -Dn -UP -UP -xc -UP -UP -UP -UP -UP -Dn +AT +Ig +OY +Wg +My +My +YX +My +My +My +My +My +Wg dA dA dA @@ -47817,18 +47814,18 @@ dA dA dA dA -UP -UP -Dn -UP +My +My +Wg +My dA -Dn +Wg dA -UP -UP +My +My dA -UP -Dn +My +Wg dA dA dA @@ -47968,12 +47965,12 @@ ac ac ac ac -UP -UP -Aa -TU -UP -UP +My +My +sC +PI +My +My ac ac ac @@ -47992,25 +47989,25 @@ ae dA dA dA -Dn -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -UP -QD -BJ -bc -Mv -Mv -dX +Wg +My +My +My +My +My +My +My +My +My +My +My +My +Lm +ri +ad +mo +mo +Db tb zk zk @@ -48035,19 +48032,19 @@ zk tb tb tb -LH -Mv -Mv +sn +mo +mo tb tb tb tb tb tb -xc -UP -Dn -UP +YX +My +Wg +My dA dA dA @@ -48225,12 +48222,12 @@ ac ac ac ac -sT -UP -Mi -UP -UP -UP +ro +My +qj +My +My +My ac ac ac @@ -48252,23 +48249,23 @@ dA dA dA dA -UP -UP -UP -UP -UP -UP -UP -UP -UP -Dn +My +My +My +My +My +My +My +My +My +Wg tb tb tb -dX -Mv -Mv -Mv +Db +mo +mo +mo tb zk zk @@ -48293,10 +48290,10 @@ tb tb zk tb -Mv -Mv -Mv -Mv +mo +mo +mo +mo tb tb tb @@ -48483,11 +48480,11 @@ ac ac ac ac -Jn -Fd -wY -RB -UP +LA +hR +lB +AD +My ac ac ac @@ -48510,22 +48507,22 @@ dA dA dA dA -UP -UP -Dn -UP -UP -UP -UP +My +My +Wg +My +My +My +My dA dA tb tb tb -Mv -Mv -Mv -Mv +mo +mo +mo +mo tb zk zk @@ -48551,10 +48548,10 @@ tb zk tb tb -Mv -Mv -Mv -LH +mo +mo +mo +sn tb tb tb @@ -48741,8 +48738,8 @@ ac ac ac ac -Zq -ZS +kX +Aj ac ac ac @@ -48780,9 +48777,9 @@ tb tb tb tb -Mv -Mv -Mv +mo +mo +mo tb zk zk @@ -48808,10 +48805,10 @@ tb zk tb tb -Mv -Mv -Mv -Mv +mo +mo +mo +mo tb tb tb @@ -49037,10 +49034,10 @@ tb tb zk tb -DC -Mv -Mv -DC +vE +mo +mo +vE tb zk zk @@ -49067,9 +49064,9 @@ tb tb tb tb -DC -Mv -Mv +vE +mo +mo tb tb tb @@ -49295,9 +49292,9 @@ zk zk tb tb -Mv -Mv -Mv +mo +mo +mo tb zk zk @@ -49325,9 +49322,9 @@ tb tb zk tb -Mv -Mv -jj +mo +mo +JH tb tb tb @@ -49552,10 +49549,10 @@ zk zk zk tb -Mv -Mv -Mv -Mv +mo +mo +mo +mo tb zk zk @@ -49583,9 +49580,9 @@ tb zk tb tb -Mv -Mv -Mv +mo +mo +mo tb tb tb @@ -49810,10 +49807,10 @@ zk zk tb tb -Mv -Mv -Mv -Mv +mo +mo +mo +mo tb zk zk @@ -49841,9 +49838,9 @@ zk tb zk tb -LH -Mv -DC +sn +mo +vE tb tb tb @@ -50068,10 +50065,10 @@ zk zk tb tb -LH -Mv -Mv -Mv +sn +mo +mo +mo tb zk zk @@ -50099,10 +50096,10 @@ tb zk tb tb -Mv -ie -Mv -LH +mo +pS +mo +sn tb tb Ep @@ -50325,11 +50322,11 @@ zk zk zk zk -DC -Mv -Mv -Mv -DC +vE +mo +mo +mo +vE tb zk zk @@ -50356,10 +50353,10 @@ tb zk tb tb -Mv -Mv -Mv -Mv +mo +mo +mo +mo tb tb Ep @@ -50584,9 +50581,9 @@ zk zk tb tb -Mv -Mv -Mv +mo +mo +mo tb zk zk @@ -50614,10 +50611,10 @@ zk tb tb tb -LH -Mv -ie -Mv +sn +mo +pS +mo tb Ep Ep @@ -50841,10 +50838,10 @@ zk zk zk tb -Mv -Mv -Mv -Mv +mo +mo +mo +mo tb tb tb @@ -50872,10 +50869,10 @@ tb tb tb tb -DC -Mv -Mv -Mv +vE +mo +mo +mo tb Ep Ep @@ -51099,11 +51096,11 @@ zk zk zk tb -Mv -Mv -Mv -Mv -LH +mo +mo +mo +mo +sn tb zk zk @@ -51130,9 +51127,9 @@ tb tb tb tb -Mv -Mv -ie +mo +mo +pS tb tb Ep @@ -51357,11 +51354,11 @@ zk zk zk tb -Mv -Mv -Mv -Mv -Mv +mo +mo +mo +mo +mo tb tb zk @@ -51387,10 +51384,10 @@ tb tb tb tb -LH -Mv -Mv -DC +sn +mo +mo +vE tb Ep Ep @@ -51615,11 +51612,11 @@ zk zk tb tb -DC -Mv -Mv -Mv -DC +vE +mo +mo +mo +vE tb zk zk @@ -51627,8 +51624,8 @@ zk zk zk tb -Kr -ie +tm +pS tb tb tb @@ -51644,10 +51641,10 @@ tb tb tb tb -Mv -Mv -Mv -Mv +mo +mo +mo +mo tb Ep Ep @@ -51873,10 +51870,10 @@ zk zk tb tb -Mv -Mv -Mv -Mv +mo +mo +mo +mo tb zk zk @@ -51884,8 +51881,8 @@ zk zk zk tb -am -ie +mO +pS tb tb tb @@ -51902,10 +51899,10 @@ tb tb tb tb -Mv -Mv -Mv -ie +mo +mo +mo +pS tb Ep Ep @@ -52131,18 +52128,18 @@ zk zk tb tb -Mv -Mv -Mv -Mv +mo +mo +mo +mo tb zk tb tb tb tb -NH -ie +vz +pS tb tb tb @@ -52160,9 +52157,9 @@ tb tb tb tb -LH -Mv -ie +sn +mo +pS tb tb tb @@ -52388,19 +52385,19 @@ zk zk zk tb -Mv -Mv -Mv -Mv +mo +mo +mo +mo tb zk tb -jj -ie +JH +pS tb tb -ie -Kr +pS +tm tb tb zk @@ -52417,14 +52414,14 @@ tb tb tb tb -DC -ie -Mv -ie +vE +pS +mo +pS tb -ie -ie -QP +pS +pS +tN tb tb tb @@ -52646,18 +52643,18 @@ zk zk tb tb -DC -Mv -Mv -Mv +vE +mo +mo +mo tb tb -ie -ie -ie -ie -ie -jj +pS +pS +pS +pS +pS +JH tb tb zk @@ -52675,11 +52672,11 @@ tb tb tb tb -Mv -ie -Mv -ie -ie +mo +pS +mo +pS +pS tb tb tb @@ -52904,17 +52901,17 @@ zk zk tb tb -Mv -Mv -Mv +mo +mo +mo tb tb tb -Kr -ie +tm +pS tb tb -ie +pS tb tb zk @@ -52933,8 +52930,8 @@ tb tb tb tb -Mv -Mv +mo +mo FK tb tb @@ -53161,18 +53158,18 @@ zk zk zk tb -Mv -LH -Mv -DC +mo +sn +mo +vE tb tb tb -ie -ie -ie -ie -Mv +pS +pS +pS +pS +mo tb tb tb @@ -53190,9 +53187,9 @@ tb tb tb tb -jj -Mv -ie +JH +mo +pS tb tb tb @@ -53420,18 +53417,18 @@ zk zk tb tb -Mv -Mv -Mv -Mv -Mv +mo +mo +mo +mo +mo tb -jj -Mv -Mv -ie -ie -Mv +JH +mo +mo +pS +pS +mo tb tb tb @@ -53448,9 +53445,9 @@ tb tb tb tb -Mv -Mv -DC +mo +mo +vE tb tb tb @@ -53677,19 +53674,19 @@ zk zk zk tb -Mv -Mv -Mv -Mv -Mv -Mv +mo +mo +mo +mo +mo +mo tb tb -Kr -ie -ie -Mv -Mv +tm +pS +pS +mo +mo tb tb zk @@ -53705,9 +53702,9 @@ tb tb tb tb -Mv -Mv -Mv +mo +mo +mo tb tb tb @@ -53936,18 +53933,18 @@ zk zk tb tb -Mv -Mv -Mv -Mv -Mv +mo +mo +mo +mo +mo tb tb -am -ie -ie -ie -LH +mO +pS +pS +pS +sn tb tb zk @@ -53962,10 +53959,10 @@ tb tb tb tb -Mv -Qz -Mv -LH +mo +sq +mo +sn tb tb tb @@ -54193,20 +54190,20 @@ zk zk zk tb -DC -Mv -Mv -Mv -Mv -DC +vE +mo +mo +mo +mo +vE tb tb -NH -ie -Mv -ie -ie -tY +vz +pS +mo +pS +pS +CW tb tb zk @@ -54219,10 +54216,10 @@ tb tb tb tb -DC -Mv -Mv -Mv +vE +mo +mo +mo tb tb tb @@ -54452,17 +54449,17 @@ zk tb tb tb -LH -Mv -Mv -Mv -LH +sn +mo +mo +mo +sn tb tb -jj -ie -ie -Mv +JH +pS +pS +mo tb tb tb @@ -54476,10 +54473,10 @@ tb tb tb tb -LH -Mv -Mv -ie +sn +mo +mo +pS tb tb tb @@ -54488,12 +54485,12 @@ tb tb tb tb -Id -Id -Id -Id -Id -Id +zY +zY +zY +zY +zY +zY tb tb tb @@ -54710,17 +54707,17 @@ zk zk tb tb -Mv -Mv -Mv -Mv -Mv +mo +mo +mo +mo +mo tb tb -ie -Mv -ie -LH +pS +mo +pS +sn tb tb tb @@ -54734,24 +54731,24 @@ tb tb tb tb -Mv -Qz -Mv +mo +sq +mo FK tb tb tb tb tb -Id -Id -ie -NH -zV -ie -zV -ie -Id +zY +zY +pS +vz +nw +pS +nw +pS +zY tb tb tb @@ -54969,15 +54966,15 @@ tb tb tb tb -DC -Mv -Mv -Mv +vE +mo +mo +mo tb tb tb -Mv -Mv +mo +mo tb tb tb @@ -54992,25 +54989,25 @@ tb tb tb tb -Mv -Mv -Mv +mo +mo +mo tb tb tb tb tb -Id -ie -ie -ie -jj -ie -ie -ie -NH -Id -Id +zY +pS +pS +pS +JH +pS +pS +pS +vz +zY +zY tb tb tb @@ -55227,15 +55224,15 @@ tb tb tb tb -Mv -Mv -Mv -Mv -Mv +mo +mo +mo +mo +mo tb -Mv -Mv -Mv +mo +mo +mo tb tb tb @@ -55249,25 +55246,25 @@ tb tb tb tb -Mv -Mv -Mv +mo +mo +mo tb tb tb tb -Id -ie -ie -ie -ie -ie -ie -ie -ie -ie -jj -Id +zY +pS +pS +pS +pS +pS +pS +pS +pS +pS +JH +zY tb tb tb @@ -55485,14 +55482,14 @@ tb tb tb tb -Mv -Mv -Mv -Mv +mo +mo +mo +mo tb -Mv -Mv -LH +mo +mo +sn tb tb tb @@ -55506,26 +55503,26 @@ tb tb tb tb -Mv -Mv -Mv -LH +mo +mo +mo +sn tb tb -Id -NH -ie -ie -ie -ie -ie -zV -ie -ie -ie -ie -ie -Id +zY +vz +pS +pS +pS +pS +pS +nw +pS +pS +pS +pS +pS +zY tb tb tb @@ -55742,14 +55739,14 @@ zk tb tb tb -Mv -Mv -Mv -Mv +mo +mo +mo +mo tb -Mv -Mv -Mv +mo +mo +mo tb tb tb @@ -55763,27 +55760,27 @@ tb tb tb tb -Mv -Qz -ie -DC +mo +sq +pS +vE tb tb -Id -ie -ie -ie -NH -ie -zV -zV -zV -zV -YZ -ie -ie -ie -Id +zY +pS +pS +pS +vz +pS +nw +nw +nw +nw +KA +pS +pS +pS +zY tb tb tb @@ -56000,13 +55997,13 @@ tb tb tb tb -DC -Mv -Mv +vE +mo +mo tb -Mv -Mv -DC +mo +mo +vE tb tb tb @@ -56020,27 +56017,27 @@ tb tb tb tb -Mv -Mv -Mv -Mv +mo +mo +mo +mo tb tb -Id -ie -ie -ie -ie -ie -ie -zV -jj -ie -ie -ie -ie -NH -Id +zY +pS +pS +pS +pS +pS +pS +nw +JH +pS +pS +pS +pS +vz +zY tb tb tb @@ -56253,17 +56250,17 @@ zk zk tb tb -Mv -Mv -Mv +mo +mo +mo tb tb -Mv -LH +mo +sn tb -Mv -Mv -Mv +mo +mo +mo tb tb tb @@ -56276,28 +56273,28 @@ tb tb tb tb -DC -ie -Mv -zP -Mv +vE +pS +mo +Vi +mo tb tb -Id -ie -ie -jj -ie -ie -ie -ie -NH -ie -ie -ie -ie -ie -Id +zY +pS +pS +JH +pS +pS +pS +pS +vz +pS +pS +pS +pS +pS +zY tb tb tb @@ -56509,18 +56506,18 @@ zk zk tb tb -DC -Mv -Mv -LH -Mv +vE +mo +mo +sn +mo tb -Mv -Mv +mo +mo tb -Mv -Mv -Mv +mo +mo +mo tb tb tb @@ -56533,29 +56530,29 @@ tb tb tb tb -Mv -Mv -Mv -Cp -ie +mo +mo +mo +Pf +pS tb tb -Id -ie -ie -zV -ie -zV -ie -zV -ie -zV -ie -jj -ie -ie -ie -Id +zY +pS +pS +nw +pS +nw +pS +nw +pS +nw +pS +JH +pS +pS +pS +zY tb tb zk @@ -56765,18 +56762,18 @@ zk zk tb tb -Mv -Mv -Mv +mo +mo +mo FK -Mv -Mv +mo +mo tb -Mv -Mv +mo +mo tb -Mv -Mv +mo +mo tb tb tb @@ -56789,31 +56786,31 @@ tb tb tb tb -Mv -Mv +mo +mo tb tb -ie -ZI +pS +Ws tb tb -Id -ie -NH -zV -Gg -zV -zV -zV -Gg -zV -Gg -Gg -Gg -zV -YZ -ie -Id +zY +pS +vz +nw +Oq +nw +nw +nw +Oq +nw +Oq +Oq +Oq +nw +KA +pS +zY tb zk zk @@ -57021,19 +57018,19 @@ zk zk tb tb -Mv -Mv -Mv -Mv -Mv -Mv -Mv -Mv -Mv -Mv +mo +mo +mo +mo +mo +mo +mo +mo +mo +mo tb -Mv -LH +mo +sn tb tb tb @@ -57045,32 +57042,32 @@ zk tb tb tb -Mv -ie -LH +mo +pS +sn tb tb tb -NH -ie +vz +pS tb -Id -ie -ie -zV -YZ -ie -ie -ie -jj -zV -ie -NH -ie -zV -ie -ie -Id +zY +pS +pS +nw +KA +pS +pS +pS +JH +nw +pS +vz +pS +nw +pS +pS +zY tb zk zk @@ -57277,20 +57274,20 @@ zk zk zk tb -Mv -Mv -Mv -Mv +mo +mo +mo +mo tb tb -Mv -Mv -Mv -Mv -Mv +mo +mo +mo +mo +mo tb -Mv -Mv +mo +mo tb tb zk @@ -57302,32 +57299,32 @@ zk tb tb FK -Mv -Mv +mo +mo tb tb tb tb -Mv -Mv +mo +mo tb tb -Id -ie -ie -ie -ie -ie -ie -ie -ie -ie -ie -zV -zV -zV -ie -Id +zY +pS +pS +pS +pS +pS +pS +pS +pS +pS +pS +nw +nw +nw +pS +zY tb zk zk @@ -57534,20 +57531,20 @@ zk zk tb tb -Mv +mo FK -Mv -Mv +mo +mo tb tb -wr -Mv -Mv -Mv -Mv +eA +mo +mo +mo +mo tb -Mv -Mv +mo +mo tb tb zk @@ -57557,34 +57554,34 @@ tb tb tb tb -Mv -Mv -Mv +mo +mo +mo tb tb tb tb tb FK -Mv -Mv +mo +mo tb -Id -Id -Id -Id -Id -Id -Id -ie -ie -ie -ie -ie -zV -jj -ie -Id +zY +zY +zY +zY +zY +zY +zY +pS +pS +pS +pS +pS +nw +JH +pS +zY tb zk zk @@ -57790,20 +57787,20 @@ zk zk tb tb -DC -Mv -Mv -Mv +vE +mo +mo +mo tb tb tb -Mv -Mv -Mv -Mv -LH +mo +mo +mo +mo +sn tb -Mv +mo FK tb tb @@ -57814,17 +57811,17 @@ tb tb tb tb -Mv -Mv -DC +mo +mo +vE tb tb tb tb tb tb -DC -Mv +vE +mo tb tb tb @@ -57832,16 +57829,16 @@ tb tb tb tb -Id -NH -ie -ie -ie -ie -zV -ie -ie -Id +zY +vz +pS +pS +pS +pS +nw +pS +pS +zY tb zk zk @@ -58046,22 +58043,22 @@ zk zk zk tb -Mv -Mv -Mv -Mv -LH +mo +mo +mo +mo +sn tb tb -DC -Mv -Mv +vE +mo +mo Jq -Mv +mo tb -DC -Mv -Mv +vE +mo +mo tb zk zk @@ -58070,9 +58067,9 @@ tb tb tb tb -Mv -Mv -Mv +mo +mo +mo tb tb tb @@ -58080,25 +58077,25 @@ tb tb tb tb -Mv -Mv -Mv +mo +mo +mo tb tb tb tb tb tb -Id -ie -ie -ie -ie -jj -zV -ie -NH -Id +zY +pS +pS +pS +pS +JH +nw +pS +vz +zY tb zk zk @@ -58303,21 +58300,21 @@ zk zk tb tb -Mv -Mv -Mv -tY +mo +mo +mo +CW tb tb tb Jq -Mv -Mv -LH -Mv +mo +mo +sn +mo tb -Mv -Mv +mo +mo tb tb zk @@ -58326,8 +58323,8 @@ tb tb tb tb -DC -Mv +vE +mo tb tb tb @@ -58336,25 +58333,25 @@ tb tb tb tb -LH -Mv -Mv -Mv -eP -LH -Mv -Mv -Mv -PQ -jj -ie -ie -ie -ie -ie -zV -ie -Id +sn +mo +mo +mo +bK +sn +mo +mo +mo +ox +JH +pS +pS +pS +pS +pS +nw +pS +zY tb tb zk @@ -58559,22 +58556,22 @@ zk zk zk tb -LH -Mv -Mv -Mv +sn +mo +mo +mo tb tb tb tb -Mv -Mv -Mv -Mv +mo +mo +mo +mo tb tb -Mv -LH +mo +sn tb tb zk @@ -58582,8 +58579,8 @@ zk tb tb FK -Mv -Mv +mo +mo tb tb tb @@ -58594,23 +58591,23 @@ tb tb tb tb -Mv -Mv -Mv -Mv -Mv -Mv -Mv -eP -Mv -Mv -ie -ie -ie -NK -Id -Id -Id +mo +mo +mo +mo +mo +mo +mo +bK +mo +mo +pS +pS +pS +ly +zY +zY +zY tb tb tb @@ -58816,30 +58813,30 @@ zk zk zk tb -Mv -Mv -Mv -Mv +mo +mo +mo +mo tb tb tb tb FK -Mv -Mv -zW +mo +mo +uc tb FK -Mv -Mv +mo +mo tb zk tb tb tb -Mv -Mv -Mv +mo +mo +mo tb tb tb @@ -58851,19 +58848,19 @@ tb tb tb tb -wr -Mv -Mv -Mv -Mv -Mv -Mv -Mv -Mv -Mv -ie -ie -Id +eA +mo +mo +mo +mo +mo +mo +mo +mo +mo +pS +pS +zY tb tb tb @@ -59073,31 +59070,31 @@ zk zk tb tb -Mv -Mv -Mv -Mv +mo +mo +mo +mo tb tb tb tb -Mv -Mv -Mv -zW +mo +mo +mo +uc tb -Mv -Mv -wr +mo +mo +eA tb zk tb tb -tY -Mv -Mv -Mv -wr +CW +mo +mo +mo +eA tb tb tb @@ -59110,16 +59107,16 @@ tb tb tb tb -Mv -LH -Mv -Mv -Mv -Mv -Mv -ie -ie -Id +mo +sn +mo +mo +mo +mo +mo +pS +pS +zY tb tb tb @@ -59329,30 +59326,30 @@ zk zk zk tb -LH -Mv -Mv -Mv -Mv +sn +mo +mo +mo +mo tb tb tb -wr -Mv -Mv -Mv -Mv +eA +mo +mo +mo +mo tb -Mv -Mv -DC +mo +mo +vE tb tb -Mv -Mv -Mv -Mv -Mv +mo +mo +mo +mo +mo tb tb tb @@ -59369,13 +59366,13 @@ tb tb tb tb -Mv -eP -Mv -Mv -LH -Id -Id +mo +bK +mo +mo +sn +zY +zY tb tb tb @@ -59586,29 +59583,29 @@ zk zk zk tb -Mv -Mv -Mv -Mv -LH +mo +mo +mo +mo +sn tb tb tb -tY -Mv -Mv -Mv +CW +mo +mo +mo Jq tb -Mv -Mv -Mv -Mv -Mv -Mv -Mv -Mv -DC +mo +mo +mo +mo +mo +mo +mo +mo +vE tb tb tb @@ -59844,26 +59841,26 @@ zk zk tb FK -Mv -Mv -Mv -Mv +mo +mo +mo +mo tb tb tb Jq -LH -Mv -LH +sn +mo +sn tb tb -Mv -Mv -Mv -Mv -Mv -Mv -Mv +mo +mo +mo +mo +mo +mo +mo tb tb tb @@ -60100,25 +60097,25 @@ zk zk zk tb -Mv -Mv -Mv -Mv -Mv +mo +mo +mo +mo +mo tb tb tb tb -Mv -Mv +mo +mo tb tb -DC -Mv -Mv -Mv -Mv -Mv +vE +mo +mo +mo +mo +mo tb tb tb @@ -60358,21 +60355,21 @@ zk zk tb tb -Mv -Mv -Mv -Mv +mo +mo +mo +mo FK tb tb -LP -Mv +Hy +mo tb tb -Mv -Mv -Mv -LH +mo +mo +mo +sn tb tb tb @@ -60615,20 +60612,20 @@ zk zk zk tb -DC -Mv -Mv -Mv -Mv -tY +vE +mo +mo +mo +mo +CW tb tb tb tb -wr -Mv -Mv -Mv +eA +mo +mo +mo tb tb tb @@ -60873,18 +60870,18 @@ zk zk tb tb -Mv -Mv -Mv -Mv -Mv -Mv -Mv -Mv -Mv -Mv -Mv -LH +mo +mo +mo +mo +mo +mo +mo +mo +mo +mo +mo +sn tb tb tb @@ -61130,17 +61127,17 @@ zk zk zk tb -Mv -Mv -Mv -Mv -Mv -Mv -Mv -Mv -Mv -Mv -Mv +mo +mo +mo +mo +mo +mo +mo +mo +mo +mo +mo tb tb zk @@ -61388,15 +61385,15 @@ zk zk tb tb -Mv -Mv -Mv +mo +mo +mo tb tb tb -LH -Mv -Mv +sn +mo +mo FK tb zk @@ -61646,14 +61643,14 @@ zk zk tb tb -Mv -Mv -LH +mo +mo +sn tb tb tb -Mv -Mv +mo +mo tb zk zk @@ -61905,12 +61902,12 @@ zk tb tb FK -Mv -Mv -Mv -Mv -Mv -Mv +mo +mo +mo +mo +mo +mo tb zk zk @@ -62162,11 +62159,11 @@ zk zk tb tb -DC -Mv -Mv -Mv -Mv +vE +mo +mo +mo +mo tb tb zk diff --git a/_maps/RandomZLevels/research.dmm b/_maps/RandomZLevels/research.dmm index fb15fbe07b00f..18429389d87fc 100644 --- a/_maps/RandomZLevels/research.dmm +++ b/_maps/RandomZLevels/research.dmm @@ -13,22 +13,10 @@ dir = 8 }, /area/awaymission/research/interior/engineering) -"ah" = ( -/obj/machinery/power/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/machinery/power/shuttle_engine/propulsion/left{ - dir = 1 - }, -/turf/open/space, -/area/awaymission/research/interior/engineering) "ak" = ( /turf/closed/wall/mineral/plastitanium{ dir = 1 @@ -99,16 +87,6 @@ /obj/effect/turf_decal/tile/yellow/half/contrasted, /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 @@ -925,13 +903,6 @@ }, /turf/open/floor/iron/white, /area/awaymission/research/interior/cryo) -"ex" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) "ez" = ( /obj/machinery/light/directional/north, /obj/effect/turf_decal/tile/purple/anticorner/contrasted{ @@ -1071,7 +1042,7 @@ /turf/open/floor/iron/white, /area/awaymission/research/interior/cryo) "fc" = ( -/obj/machinery/atmospherics/components/unary/cryo_cell, +/obj/machinery/cryo_cell, /turf/open/floor/iron/white, /area/awaymission/research/interior/cryo) "fd" = ( @@ -1112,14 +1083,7 @@ /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/half/contrasted{ - dir = 4 - }, +/obj/machinery/cryo_cell, /turf/open/floor/iron/white, /area/awaymission/research/interior/cryo) "fk" = ( @@ -1156,12 +1120,6 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/white, /area/awaymission/research/interior/security) -"ft" = ( -/obj/machinery/light/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) "fu" = ( /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/tile/red/half/contrasted, @@ -1534,13 +1492,6 @@ /obj/effect/turf_decal/tile/purple/anticorner/contrasted, /turf/open/floor/iron/white, /area/awaymission/research/interior/cryo) -"hv" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) "hy" = ( /obj/effect/decal/cleanable/blood/drip, /obj/structure/cable, @@ -1935,15 +1886,6 @@ /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 @@ -2037,6 +1979,13 @@ /obj/structure/sign/departments/medbay, /turf/closed/wall/r_wall, /area/awaymission/research/interior) +"jP" = ( +/obj/item/kirbyplants/organic/plant16, +/obj/effect/turf_decal/siding/yellow{ + dir = 10 + }, +/turf/open/floor/iron, +/area/awaymission/research/interior/dorm) "jR" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -2231,14 +2180,6 @@ }, /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/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) "kz" = ( /obj/machinery/iv_drip, /obj/effect/turf_decal/tile/blue/half/contrasted{ @@ -2257,15 +2198,6 @@ /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 @@ -2305,13 +2237,6 @@ /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, @@ -2322,14 +2247,6 @@ /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, @@ -2369,14 +2286,6 @@ }, /turf/open/floor/iron/white, /area/awaymission/research/interior/medbay) -"lc" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/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, @@ -2420,16 +2329,6 @@ }, /turf/open/floor/iron/white, /area/awaymission/research/interior/medbay) -"lm" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/siding/yellow{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/cell_5k, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) "lo" = ( /obj/structure/table/wood, /obj/structure/bedsheetbin, @@ -2449,6 +2348,14 @@ }, /turf/open/floor/iron/white, /area/awaymission/research/interior/medbay) +"ls" = ( +/obj/machinery/computer/scan_consolenew{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/machinery/light/small/broken/directional/south, +/turf/open/floor/iron/dark, +/area/awaymission/research/interior/genetics) "lu" = ( /obj/item/ammo_casing/c45, /obj/item/ammo_casing/c45, @@ -2474,15 +2381,6 @@ }, /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, @@ -2513,16 +2411,6 @@ }, /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{ @@ -2842,15 +2730,6 @@ }, /turf/open/floor/grass, /area/awaymission/research/interior/escapepods) -"mN" = ( -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) "mO" = ( /obj/machinery/door/airlock/external/ruin{ name = "Escape Pod Two" @@ -2886,14 +2765,6 @@ }, /turf/open/floor/iron/white, /area/awaymission/research/interior/escapepods) -"mU" = ( -/obj/structure/sign/warning/vacuum/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) "mV" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/green/half/contrasted{ @@ -2965,15 +2836,19 @@ /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) +"oO" = ( +/obj/structure/chair/stool/directional/west, +/obj/effect/turf_decal/siding/yellow{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/mapping_helpers/apc/cell_5k, +/turf/open/floor/iron, +/area/awaymission/research/interior/dorm) "oT" = ( /obj/structure/table, /obj/effect/turf_decal/tile/red/fourcorners, @@ -3077,14 +2952,11 @@ /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) +"rK" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/awaymission/research/interior) "si" = ( /obj/structure/chair/stool/directional/south, /obj/effect/turf_decal/tile/red/fourcorners, @@ -3118,6 +2990,12 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/awaymission/research/interior/gateway) +"ta" = ( +/obj/machinery/power/shuttle_engine/propulsion/left{ + dir = 1 + }, +/turf/open/floor/plating, +/area/awaymission/research/interior/engineering) "ts" = ( /turf/open/misc/asteroid/airless, /area/awaymission/research/exterior) @@ -3139,6 +3017,13 @@ }, /turf/open/floor/iron/white, /area/awaymission/research/interior) +"tW" = ( +/obj/item/kirbyplants/organic/applebush, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/awaymission/research/interior/escapepods) "uf" = ( /obj/machinery/dna_scannernew, /obj/effect/turf_decal/tile/purple/fourcorners, @@ -3170,6 +3055,14 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/research/interior/genetics) +"vv" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/siding/yellow{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/awaymission/research/interior/dorm) "vT" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, @@ -3208,6 +3101,11 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior/security) +"xe" = ( +/obj/item/kirbyplants/organic/plant16, +/obj/effect/turf_decal/tile/purple/fourcorners, +/turf/open/floor/iron/dark, +/area/awaymission/research/interior/genetics) "xl" = ( /obj/structure/table, /obj/item/storage/medkit/regular, @@ -3239,6 +3137,11 @@ }, /turf/open/floor/plating, /area/awaymission/research/interior/escapepods) +"xS" = ( +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/awaymission/research/interior) "yc" = ( /obj/structure/table, /obj/item/paper_bin, @@ -3298,6 +3201,20 @@ /obj/structure/chair/stool/directional/south, /turf/open/floor/iron, /area/awaymission/research/interior/dorm) +"zt" = ( +/obj/item/ammo_casing/c9mm, +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/awaymission/research/interior/cryo) +"zU" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/awaymission/research/interior/medbay) "AY" = ( /obj/structure/rack, /obj/item/clothing/suit/armor/riot, @@ -3334,6 +3251,12 @@ }, /turf/open/floor/iron/white, /area/awaymission/research/interior) +"By" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white, +/area/awaymission/research/interior/security) "BN" = ( /obj/structure/window/reinforced/spawner/directional/west, /mob/living/carbon/human/species/monkey, @@ -3345,11 +3268,28 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior/security) +"BY" = ( +/obj/effect/turf_decal/siding/yellow, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/awaymission/research/interior/dorm) +"Ch" = ( +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/awaymission/research/interior) "Cs" = ( /obj/machinery/door/window/left/directional/west, /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, /area/awaymission/research/interior/genetics) +"Cu" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/awaymission/research/interior/medbay) "CF" = ( /obj/item/stack/rods, /obj/effect/turf_decal/tile/purple/fourcorners, @@ -3380,11 +3320,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/awaymission/research/interior/security) -"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, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -3415,13 +3350,11 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /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) +"Em" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/awaymission/research/interior) "Ez" = ( /obj/effect/decal/cleanable/blood, /obj/item/stack/rods, @@ -3489,9 +3422,8 @@ /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, +"Gd" = ( +/obj/item/kirbyplants/organic/plant10, /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/research/interior/genetics) @@ -3519,6 +3451,13 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, /area/awaymission/research/interior/genetics) +"Hc" = ( +/obj/item/kirbyplants/organic/plant14, +/obj/effect/turf_decal/siding/yellow{ + dir = 9 + }, +/turf/open/floor/iron, +/area/awaymission/research/interior/dorm) "HD" = ( /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/white, @@ -3569,6 +3508,13 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, /area/awaymission/research/interior/genetics) +"IX" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/awaymission/research/interior) "Jb" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Genetics Maintenance" @@ -3583,6 +3529,15 @@ }, /turf/open/floor/iron, /area/awaymission/research/interior/dorm) +"Jl" = ( +/obj/item/kirbyplants/organic/plant20{ + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/awaymission/research/interior/engineering) "Jm" = ( /obj/effect/turf_decal/siding/yellow{ dir = 8 @@ -3665,15 +3620,6 @@ }, /turf/open/floor/iron/white, /area/awaymission/research/interior/medbay) -"KZ" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) "Le" = ( /obj/structure/table/optable, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -3685,6 +3631,13 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior) +"LP" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/effect/turf_decal/siding/yellow{ + dir = 9 + }, +/turf/open/floor/iron, +/area/awaymission/research/interior/dorm) "LX" = ( /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/white, @@ -3738,6 +3691,11 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior/engineering) +"Ob" = ( +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/awaymission/research/interior) "Ok" = ( /obj/effect/turf_decal/tile/purple/anticorner/contrasted{ dir = 1 @@ -3768,6 +3726,15 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior) +"OG" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/closet/wardrobe/mixed, +/obj/effect/turf_decal/siding/yellow{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/awaymission/research/interior/dorm) "OH" = ( /obj/effect/turf_decal/tile/green/fourcorners, /turf/open/floor/iron/white, @@ -3843,11 +3810,6 @@ }, /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{ @@ -3884,6 +3846,24 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior) +"Sf" = ( +/obj/effect/mob_spawn/corpse/human/doctor{ + brute_damage = 200 + }, +/obj/effect/decal/cleanable/blood, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/south, +/turf/open/floor/iron/white, +/area/awaymission/research/interior/medbay) +"SJ" = ( +/obj/structure/closet/wardrobe/grey, +/obj/effect/turf_decal/siding/yellow{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/research/interior/dorm) "SM" = ( /turf/open/misc/asteroid, /area/awaymission/research/exterior) @@ -3931,16 +3911,12 @@ }, /turf/open/floor/plating, /area/awaymission/research/interior/escapepods) -"TW" = ( -/obj/item/ammo_casing/c9mm, +"TK" = ( +/obj/machinery/computer/scan_consolenew, /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) +/obj/machinery/light/small/broken/directional/north, +/turf/open/floor/iron/dark, +/area/awaymission/research/interior/genetics) "Uf" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance, @@ -3988,13 +3964,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/awaymission/research/interior/cryo) -"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, @@ -4017,6 +3986,11 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron, /area/awaymission/research/interior/security) +"VY" = ( +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/awaymission/research/interior) "Wf" = ( /obj/effect/decal/cleanable/blood/drip, /obj/effect/turf_decal/tile/purple/fourcorners, @@ -4068,6 +4042,13 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior/cryo) +"XR" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/awaymission/research/interior/escapepods) "XU" = ( /obj/item/ammo_casing/c45, /obj/effect/decal/cleanable/blood/drip, @@ -4104,6 +4085,12 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron, /area/awaymission/research/interior/security) +"YV" = ( +/obj/machinery/power/shuttle_engine/propulsion/right{ + dir = 1 + }, +/turf/open/floor/plating, +/area/awaymission/research/interior/engineering) "Zg" = ( /obj/item/stack/rods, /obj/item/shard, @@ -36619,7 +36606,7 @@ Yf KK KK KK -UV +xe ea ev fc @@ -36878,7 +36865,7 @@ KK qP KK ea -ex +gQ ff fF HD @@ -36900,11 +36887,11 @@ jj jC jT iX -kC -kQ +LP +oO Jm -lm -ly +vv +jP iX lO jC @@ -37129,7 +37116,7 @@ ad aH bD cx -FZ +TK Tz KK KK @@ -37147,7 +37134,7 @@ KK KK KK uh -sf +ls cx bD id @@ -37398,7 +37385,7 @@ fD HD gS fg -hv +fD ea KK qP @@ -37657,7 +37644,7 @@ ev fc fE ea -Eh +Gd KK KK KK @@ -38703,7 +38690,7 @@ jn jF jF jF -kc +BY iX iX iX @@ -38714,7 +38701,7 @@ mb mh mw mw -mC +mw mI mw mw @@ -38935,11 +38922,11 @@ aH dR ea eD -fi +ff fJ -TW +zt gU -fi +ff fF ea bD @@ -38960,7 +38947,7 @@ jn jF jF jF -lz +kc iX lS jC @@ -39451,7 +39438,7 @@ ec eE cp fL -OF +Ch gV cp bD @@ -39708,7 +39695,7 @@ ed eF cp fL -oc +OF gV cp bD @@ -39980,7 +39967,7 @@ iM iR iU iX -jm +Hc jE jE jE @@ -40005,7 +39992,7 @@ mP OH OH OH -mU +mW mb aa aa @@ -40222,7 +40209,7 @@ rB pW cp fL -Dl +OF gV cp bD @@ -40479,7 +40466,7 @@ eg bD cp fL -OF +VY gV cp bD @@ -40513,7 +40500,7 @@ mb mi OH OH -mG +XR mb mQ OH @@ -40756,8 +40743,8 @@ jF ka ku kF -kV -lc +SJ +OG lp lp lN @@ -40772,7 +40759,7 @@ OH OH mG mb -mQ +mj OH OH OH @@ -41281,7 +41268,7 @@ bD bD bD mb -ml +mi OH OH mF @@ -41481,7 +41468,7 @@ aa ts ts ts -ah +YV am ap ap @@ -41799,7 +41786,7 @@ mm OH OH mH -mN +tW mm OH OH @@ -42252,7 +42239,7 @@ ts ts ts ts -aj +ta ao aq aq @@ -42299,10 +42286,10 @@ HS kv it ia -iE ia ia ia +IX ia ia ia @@ -42573,7 +42560,7 @@ mx mx mx mx -mA +mx mx mX mb @@ -43065,7 +43052,7 @@ aH aO cp js -ut +rK ke cp bD @@ -43285,7 +43272,7 @@ ts ts ts ar -ax +Jl aB aB aB @@ -43322,7 +43309,7 @@ aH aO cp js -ry +ut ke cp bD @@ -43563,7 +43550,7 @@ aH aH cp fT -Nf +Ob hc cp aH @@ -43820,7 +43807,7 @@ aO aO aP fT -Fx +Nf hc aP bD @@ -43836,7 +43823,7 @@ aH aO cp js -Ub +ut ke cp bD @@ -44093,7 +44080,7 @@ aH aO cp js -ut +Em ke cp bD @@ -44334,7 +44321,7 @@ aH aO cp fT -QC +Nf hc cp bD @@ -44591,7 +44578,7 @@ aH aO cp fT -Nf +xS hc cp bD @@ -46131,7 +46118,7 @@ do do do do -fr +By QQ QQ QQ @@ -46408,7 +46395,7 @@ jc vT vT ZJ -ky +Cu jf jR jR @@ -46670,7 +46657,7 @@ jR kY lf jz -lF +Sf iW hD aH @@ -47159,7 +47146,7 @@ do do do do -ft +fr Or Or QQ @@ -47184,7 +47171,7 @@ kL kZ Fl Th -KZ +zU iW aO aH diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm index 3f35d8d84e4e1..5051bf26b10dc 100644 --- a/_maps/RandomZLevels/snowdin.dmm +++ b/_maps/RandomZLevels/snowdin.dmm @@ -32,6 +32,12 @@ "aj" = ( /turf/closed/mineral/snowmountain, /area/awaymission/snowdin/cave) +"ak" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "an" = ( /turf/open/floor/plating/snowed, /area/awaymission/snowdin/cave) @@ -368,18 +374,6 @@ "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/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) "bu" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/decal/cleanable/blood/old, @@ -445,6 +439,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/awaymission/snowdin/post/research) +"bG" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/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) "bH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ dir = 4; @@ -861,23 +868,6 @@ /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 @@ -947,6 +937,14 @@ /obj/item/stack/sheet/mineral/wood, /turf/open/floor/plating/snowed, /area/awaymission/snowdin/cave) +"cU" = ( +/obj/structure/ore_box, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "cV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 5 @@ -1233,6 +1231,15 @@ /obj/structure/table, /turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) +"dJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "dK" = ( /turf/closed/wall, /area/awaymission/snowdin/post) @@ -1276,23 +1283,6 @@ /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/condiment/enzyme, @@ -2308,6 +2298,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/snowdin/post/gateway) +"ho" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ + dir = 4; + piping_layer = 4 + }, +/turf/closed/wall/ice, +/area/awaymission/snowdin/post/mining_main/mechbay) "hp" = ( /obj/item/chair, /turf/open/floor/iron/cafeteria, @@ -2581,8 +2578,8 @@ /area/awaymission/snowdin/post/hydro) "hZ" = ( /obj/item/gun/ballistic/rifle/boltaction, -/obj/item/ammo_box/a762, -/obj/item/ammo_box/a762, +/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/strilka310, /obj/structure/closet/secure_closet{ icon_state = "sec"; name = "security officer's locker"; @@ -3027,6 +3024,11 @@ }, /turf/open/floor/plating/snowed/smoothed, /area/awaymission/snowdin/cave) +"ja" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "jb" = ( /obj/effect/light_emitter{ name = "cave light"; @@ -3035,6 +3037,22 @@ }, /turf/open/floor/plating/snowed/smoothed, /area/awaymission/snowdin/cave) +"jd" = ( +/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{ + name = "box of donkpockets" + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/kitchen) "je" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ @@ -3468,6 +3486,11 @@ /obj/item/tank/internals/plasma, /turf/open/floor/plating, /area/awaymission/snowdin/post/garage) +"kn" = ( +/obj/machinery/holopad, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "kr" = ( /obj/structure/fence{ dir = 4 @@ -3703,6 +3726,11 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/awaymission/snowdin/post/garage) +"la" = ( +/obj/machinery/light/small/directional/north, +/obj/effect/spawner/random/structure/crate_abandoned, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "lb" = ( /obj/machinery/light/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ @@ -3769,13 +3797,6 @@ /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/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) "lo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ dir = 8; @@ -4921,24 +4942,6 @@ }, /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, @@ -5176,7 +5179,7 @@ /area/awaymission/snowdin/post/cavern2) "pc" = ( /obj/structure/spider/stickyweb, -/mob/living/basic/giant_spider/hunter/ice, +/mob/living/basic/spider/giant/hunter/ice, /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) "pd" = ( @@ -5213,6 +5216,17 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/awaymission/snowdin/post/secpost) +"pl" = ( +/obj/docking_port/stationary{ + dir = 4; + dwidth = 2; + height = 5; + shuttle_id = "snowdin_mining_down"; + name = "snowdin mining bottom"; + width = 5 + }, +/turf/open/floor/plating/elevatorshaft, +/area/awaymission/snowdin/post/mining_main/mechbay) "pm" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -5309,20 +5323,6 @@ }, /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, @@ -5942,6 +5942,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/awaymission/snowdin/post/cavern2) +"rE" = ( +/obj/machinery/conveyor{ + dir = 10; + id = "snowdin_belt_mine" + }, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "rF" = ( /obj/machinery/power/smes/engineering, /obj/structure/cable, @@ -6090,6 +6097,14 @@ }, /turf/open/floor/plating, /area/awaymission/snowdin/post/cavern2) +"se" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/awaymission/snowdin/post) "sf" = ( /obj/machinery/computer/monitor, /obj/structure/cable, @@ -6249,6 +6264,13 @@ }, /turf/open/floor/iron/dark/snowdin, /area/awaymission/snowdin/outside) +"sN" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "sO" = ( /obj/structure/fence{ dir = 4 @@ -6305,6 +6327,11 @@ }, /turf/open/floor/iron/dark/snowdin, /area/awaymission/snowdin/outside) +"sX" = ( +/obj/item/disk/holodisk/snowdin/ripjacob, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "sZ" = ( /obj/machinery/space_heater, /turf/open/floor/plating, @@ -6360,6 +6387,10 @@ /obj/structure/window/spawner/directional/east, /turf/open/floor/iron/showroomfloor, /area/awaymission/snowdin/post/cavern2) +"tj" = ( +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "tk" = ( /obj/structure/toilet{ dir = 1 @@ -6401,10 +6432,25 @@ /obj/structure/barricade/wooden/crude/snow, /turf/open/floor/plating/snowed/cavern, /area/awaymission/snowdin/cave/cavern) +"ty" = ( +/obj/machinery/power/port_gen/pacman, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "tz" = ( /mob/living/simple_animal/hostile/skeleton/ice, /turf/open/floor/plating/snowed/cavern, /area/awaymission/snowdin/cave/cavern) +"tB" = ( +/mob/living/basic/migo, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) +"tC" = ( +/obj/structure/closet/crate/preopen, +/obj/item/storage/toolbox/emergency, +/obj/item/clothing/suit/hooded/wintercoat, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "tE" = ( /turf/closed/indestructible/rock/snow, /area/awaymission/snowdin/cave) @@ -6415,6 +6461,17 @@ /obj/effect/baseturf_helper/asteroid/snow, /turf/closed/mineral/snowmountain, /area/awaymission/snowdin/cave) +"tK" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) +"tQ" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/sign/nanotrasen{ + pixel_y = -32 + }, +/turf/open/misc/asteroid/snow/ice, +/area/awaymission/snowdin/cave/cavern) "tR" = ( /obj/structure/barricade/wooden/snowed, /turf/open/floor/plating/snowed/cavern, @@ -6425,6 +6482,19 @@ "tZ" = ( /turf/closed/wall/rust, /area/awaymission/snowdin/post/cavern1) +"ua" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) +"ub" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Misc Storage" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "uc" = ( /obj/structure/table/wood, /turf/open/floor/wood, @@ -6478,6 +6548,25 @@ /obj/structure/cable, /turf/open/floor/plating, /area/awaymission/snowdin/post/cavern1) +"ut" = ( +/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 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/engineering) "ux" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 @@ -6549,6 +6638,10 @@ /obj/effect/spawner/structure/electrified_grille, /turf/open/floor/plating, /area/awaymission/snowdin/post/cavern1) +"uQ" = ( +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "uS" = ( /mob/living/simple_animal/hostile/skeleton/plasmaminer, /obj/effect/mapping_helpers/broken_floor, @@ -6645,6 +6738,13 @@ }, /turf/open/floor/iron, /area/awaymission/snowdin/post/cavern1) +"vl" = ( +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "vn" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/firedoor, @@ -6661,6 +6761,15 @@ }, /turf/open/floor/iron/showroomfloor, /area/awaymission/snowdin/post/cavern1) +"vq" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "vr" = ( /obj/structure/filingcabinet/chestdrawer, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -6739,6 +6848,19 @@ }, /turf/open/floor/plating/snowed/cavern, /area/awaymission/snowdin/post/cavern1) +"vI" = ( +/obj/structure/ore_box, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) +"vJ" = ( +/obj/machinery/power/smes/engineering, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "vL" = ( /turf/closed/wall/mineral/titanium, /area/awaymission/snowdin/post/broken_shuttle) @@ -6751,6 +6873,14 @@ /obj/effect/baseturf_helper/asteroid/snow, /turf/open/floor/plating, /area/awaymission/snowdin/post/broken_shuttle) +"vP" = ( +/obj/structure/plasticflaps, +/obj/machinery/conveyor{ + dir = 8; + id = "snowdin_belt_mine" + }, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "vR" = ( /obj/structure/sign/nanotrasen, /turf/closed/wall/mineral/titanium, @@ -6966,6 +7096,13 @@ /obj/machinery/light/small/broken/directional/east, /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/post/cavern1) +"xr" = ( +/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_main/mechbay) "xs" = ( /obj/item/gun/energy/e_gun{ dead_cell = 1 @@ -7121,6 +7258,10 @@ }, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) +"xP" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "xQ" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -7167,6 +7308,10 @@ "xW" = ( /turf/closed/wall/ice, /area/awaymission/snowdin/post/mining_dock) +"xX" = ( +/obj/item/shard, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "xY" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/firedoor, @@ -7187,6 +7332,13 @@ }, /turf/open/floor/iron, /area/awaymission/snowdin/post/mining_dock) +"yb" = ( +/obj/structure/plasticflaps, +/obj/machinery/conveyor{ + id = "snowdin_belt_mine" + }, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "yc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ dir = 6 @@ -7325,6 +7477,11 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) +"yB" = ( +/obj/item/shard, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "yC" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -7482,6 +7639,20 @@ }, /turf/open/floor/plating/snowed, /area/awaymission/snowdin/cave) +"zg" = ( +/obj/machinery/door/airlock/maintenance{ + name = "SMES Storage" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) +"zh" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "zj" = ( /obj/effect/turf_decal/stripes/corner, /obj/structure/fence/corner{ @@ -7536,6 +7707,12 @@ "zu" = ( /turf/closed/wall/mineral/wood, /area/awaymission/snowdin/igloo) +"zv" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 8 + }, +/turf/open/floor/plating/snowed/cavern, +/area/awaymission/snowdin/post/mining_main/mechbay) "zw" = ( /obj/structure/rack, /obj/structure/cable, @@ -7713,6 +7890,14 @@ }, /turf/open/floor/plating/snowed/cavern, /area/awaymission/snowdin/cave/cavern) +"Af" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "Ag" = ( /obj/structure/rack, /obj/item/clothing/suit/hooded/wintercoat, @@ -7744,6 +7929,13 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plating/snowed/smoothed, /area/awaymission/snowdin/cave) +"An" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "Ao" = ( /obj/structure/mineral_door/wood, /turf/open/floor/wood, @@ -7755,6 +7947,14 @@ /obj/structure/fence, /turf/open/floor/plating/snowed/cavern, /area/awaymission/snowdin/cave/cavern) +"Aq" = ( +/obj/machinery/light/small/directional/west, +/obj/item/stack/rods{ + amount = 2 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "Ar" = ( /obj/effect/turf_decal/stripes/corner, /obj/structure/fence/corner{ @@ -7832,7 +8032,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/minipost) "AG" = ( -/mob/living/simple_animal/hostile/bear/snow, +/mob/living/basic/bear/snow, /turf/open/floor/plating/snowed/smoothed, /area/awaymission/snowdin/post/minipost) "AH" = ( @@ -8187,6 +8387,26 @@ }, /turf/open/floor/plating/snowed, /area/awaymission/snowdin/cave) +"BW" = ( +/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/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) +"BX" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "snowdin_belt_mine" + }, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "BY" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -8362,6 +8582,12 @@ }, /turf/open/floor/iron/dark, /area/awaymission/snowdin/cave) +"CV" = ( +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "CW" = ( /obj/item/shard, /obj/item/stack/cable_coil{ @@ -8457,6 +8683,11 @@ }, /turf/open/floor/plating/snowed/smoothed, /area/awaymission/snowdin/cave) +"Do" = ( +/obj/structure/sign/warning/electric_shock/directional/east, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "Dq" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -8522,6 +8753,15 @@ /obj/item/shard, /turf/open/floor/plating, /area/awaymission/snowdin/cave) +"DL" = ( +/obj/structure/sign/warning/docking/directional/east, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) +"DM" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "DN" = ( /obj/effect/gibspawner/human, /obj/effect/decal/cleanable/blood/drip, @@ -8555,7 +8795,7 @@ /area/awaymission/snowdin/cave) "DY" = ( /obj/effect/turf_decal/weather/snow, -/mob/living/simple_animal/hostile/bear/snow, +/mob/living/basic/bear/snow, /turf/open/floor/iron/dark/snowdin, /area/awaymission/snowdin/cave) "Ea" = ( @@ -8579,6 +8819,12 @@ /obj/effect/decal/cleanable/vomit/old, /turf/open/floor/mineral/plastitanium/red, /area/awaymission/snowdin/cave) +"Ei" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "Ej" = ( /obj/structure/grille/broken, /obj/item/stack/rods, @@ -8719,7 +8965,7 @@ /turf/open/floor/iron/dark, /area/awaymission/snowdin/cave) "EK" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 }, @@ -8803,6 +9049,10 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plating/snowed/smoothed, /area/awaymission/snowdin/outside) +"Fk" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "Fn" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/machinery/portable_atmospherics/canister/plasma, @@ -8856,50 +9106,17 @@ 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/directional/east, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"FL" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 8 +"FI" = ( +/obj/machinery/conveyor{ + id = "snowdin_belt_mine" }, -/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) +/area/awaymission/snowdin/post/mining_main/mechbay) "FO" = ( /obj/machinery/computer/monitor{ dir = 8 @@ -8911,24 +9128,33 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating/snowed, /area/awaymission/snowdin/outside) -"FQ" = ( -/obj/machinery/conveyor{ - id = "snowdin_belt_mine" +"FR" = ( +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 1 }, -/obj/machinery/light/small/directional/east, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/post/mining_dock) +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "FT" = ( /obj/structure/ore_box, /turf/closed/mineral/snowmountain/cavern, /area/awaymission/snowdin/cave/cavern) -"FU" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 +"FV" = ( +/obj/machinery/computer/shuttle/snowdin/mining{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 }, /turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) +/area/awaymission/snowdin/post/mining_main/mechbay) +"FX" = ( +/obj/structure/barricade/sandbags, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "FZ" = ( /turf/closed/wall/ice, /area/awaymission/snowdin/post/mining_main) @@ -8953,14 +9179,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/plating/snowed, /area/awaymission/snowdin/outside) -"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) @@ -8980,19 +9198,17 @@ /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) +"Gr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "Gt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ dir = 1 @@ -9050,29 +9266,6 @@ /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/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "GH" = ( /turf/closed/wall/rust, /area/awaymission/snowdin/post/mining_main/mechbay) @@ -9107,18 +9300,6 @@ "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) @@ -9171,18 +9352,6 @@ /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/basic/migo, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "Hc" = ( /obj/structure/table, /obj/item/storage/toolbox/mechanical{ @@ -9219,12 +9388,6 @@ /obj/effect/spawner/structure/window/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, @@ -9264,16 +9427,6 @@ /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" @@ -9293,15 +9446,6 @@ /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, @@ -9433,37 +9577,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/awaymission/snowdin/post/mining_main/robotics) -"Id" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/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/no_smoking/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"Ig" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"Ih" = ( -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, -/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, @@ -9481,21 +9594,12 @@ /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, @@ -9558,13 +9662,6 @@ }, /turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) -"ID" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "IE" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -9602,12 +9699,6 @@ /obj/structure/flora/grass/both/style_random, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) -"IN" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/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, @@ -9674,44 +9765,6 @@ }, /turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) -"Jc" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"Jd" = ( -/obj/item/shard, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/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 @@ -9725,26 +9778,11 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /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/preopen, -/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) +"Jl" = ( +/obj/structure/ore_box, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "Jq" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -9800,69 +9838,6 @@ }, /turf/open/floor/iron, /area/awaymission/snowdin/post/mining_main) -"JA" = ( -/obj/structure/sign/warning/electric_shock/directional/east, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"JB" = ( -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"JC" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"JD" = ( -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"JE" = ( -/obj/structure/closet/crate/preopen, -/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/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"JH" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/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/half/contrasted, -/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/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "JL" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 1 @@ -9901,48 +9876,22 @@ "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/half/contrasted{ - 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 - }, +"JR" = ( /obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"JY" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ +/obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 }, /turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"JZ" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Misc Storage" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/area/awaymission/snowdin/post/mining_main/mechbay) +"JS" = ( +/obj/machinery/light/directional/west, /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/half/contrasted{ - dir = 4 - }, +/area/awaymission/snowdin/post/mining_main/mechbay) +"JT" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"Kb" = ( +/area/awaymission/snowdin/post/mining_main/mechbay) +"JU" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -9950,7 +9899,10 @@ dir = 8 }, /turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) +/area/awaymission/snowdin/post/mining_main) +"JV" = ( +/turf/open/misc/ice, +/area/awaymission/snowdin/outside) "Kc" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 8 @@ -9962,18 +9914,20 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/snowdin/post/messhall) -"Kg" = ( -/obj/structure/ore_box, -/obj/effect/turf_decal/bot, +"Ke" = ( +/obj/machinery/airalarm/directional/north, +/obj/structure/sign/warning/docking/directional/east, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) +"Kf" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ 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) +/area/awaymission/snowdin/post/mining_main/mechbay) "Kj" = ( /obj/machinery/power/port_gen/pacman, /obj/machinery/power/terminal{ @@ -10018,45 +9972,6 @@ }, /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/half/contrasted{ - 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) -"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/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "Kv" = ( /obj/structure/fence/corner, /turf/open/misc/asteroid/snow, @@ -10094,27 +10009,13 @@ /obj/structure/flora/grass/both/style_random, /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/anticorner/contrasted{ - dir = 8 +"KH" = ( +/obj/structure/door_assembly/door_assembly_min{ + anchored = 1; + name = "broken airlock" }, /turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"KE" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"KF" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"KG" = ( -/obj/structure/sign/warning/docking/directional/east, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) +/area/awaymission/snowdin/post/mining_main/mechbay) "KI" = ( /obj/structure/table, /obj/item/storage/toolbox/mechanical, @@ -10171,18 +10072,6 @@ 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/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "KR" = ( /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 8 @@ -10215,32 +10104,15 @@ /obj/effect/turf_decal/tile/brown/anticorner/contrasted, /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/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"KY" = ( +"Lb" = ( /obj/effect/turf_decal/stripes/line{ - dir = 1 + dir = 4 }, -/obj/effect/turf_decal/caution/stand_clear, /obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/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/anticorner/contrasted, /turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) +/area/awaymission/snowdin/post/mining_main/mechbay) "Lf" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -10258,7 +10130,7 @@ set_cap = 3; set_luminosity = 6 }, -/mob/living/simple_animal/hostile/bear/snow, +/mob/living/basic/bear/snow, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) "Li" = ( @@ -10275,7 +10147,7 @@ /turf/open/floor/plating/snowed/smoothed, /area/awaymission/snowdin/post/minipost) "Lm" = ( -/mob/living/simple_animal/hostile/bear/snow, +/mob/living/basic/bear/snow, /turf/open/misc/asteroid/snow{ floor_variance = 0; icon_state = "snow_dug"; @@ -10317,13 +10189,6 @@ }, /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 @@ -10336,6 +10201,12 @@ /obj/structure/cable, /turf/open/floor/plating, /area/awaymission/snowdin/post/minipost) +"LB" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "LI" = ( /obj/effect/turf_decal/weather/snow, /obj/effect/decal/cleanable/blood/drip, @@ -10357,10 +10228,34 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating, /area/awaymission/snowdin/post) +"LL" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/research) "LM" = ( /obj/effect/mob_spawn/corpse/human/assistant, /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) +"LO" = ( +/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{ + name = "box of donkpockets" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/kitchen) "LQ" = ( /obj/item/stack/rods, /turf/open/misc/asteroid/snow, @@ -10439,6 +10334,14 @@ }, /turf/open/floor/iron/white, /area/awaymission/snowdin/post) +"Mh" = ( +/obj/machinery/computer/monitor, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) +"Mi" = ( +/turf/open/floor/plating/elevatorshaft, +/area/awaymission/snowdin/post/mining_main/mechbay) "Mj" = ( /obj/structure/chair{ dir = 4 @@ -10454,7 +10357,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/engineering) "Mo" = ( -/mob/living/simple_animal/hostile/asteroid/basilisk, +/mob/living/basic/mining/basilisk, /turf/open/misc/asteroid/snow{ floor_variance = 0; icon_state = "snow_dug"; @@ -10481,6 +10384,12 @@ }, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) +"ME" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "MG" = ( /obj/effect/decal/remains/human, /obj/effect/decal/cleanable/blood/old, @@ -10550,7 +10459,7 @@ /area/awaymission/snowdin/cave/cavern) "MV" = ( /obj/item/shard, -/mob/living/simple_animal/hostile/bear/snow, +/mob/living/basic/bear/snow, /turf/open/misc/asteroid/snow{ floor_variance = 0; icon_state = "snow_dug"; @@ -10700,6 +10609,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) +"NJ" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "NL" = ( /obj/machinery/airalarm/directional/north, /obj/structure/spider/stickyweb, @@ -10747,6 +10663,15 @@ }, /turf/open/floor/iron, /area/awaymission/snowdin/post/secpost) +"Oc" = ( +/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_main/mechbay) "Oe" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -10809,6 +10734,12 @@ }, /turf/open/floor/iron, /area/awaymission/snowdin/post/gateway) +"Oy" = ( +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "Oz" = ( /obj/structure/closet/crate/wooden, /obj/effect/spawner/random/exotic/antag_gear_weak, @@ -10824,11 +10755,10 @@ /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) +"OC" = ( +/obj/structure/cable, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "OD" = ( /obj/machinery/light/small/directional/west, /obj/structure/closet/emcloset, @@ -10845,6 +10775,18 @@ /obj/machinery/light/small/directional/west, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/cave) +"OL" = ( +/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_main/mechbay) "OP" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/airalarm/directional/west, @@ -10879,6 +10821,17 @@ /obj/item/paper/fluff/awaymissions/snowdin/secnotice, /turf/open/floor/plating, /area/awaymission/snowdin/post/secpost) +"OX" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + piping_layer = 4; + pixel_x = 5; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/research) "OZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ piping_layer = 4; @@ -10925,6 +10878,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/awaymission/snowdin/post/dorm) +"Pg" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "Ph" = ( /obj/effect/decal/cleanable/blood/drip, /turf/open/misc/asteroid/snow{ @@ -10963,7 +10922,7 @@ dir = 5 }, /obj/structure/spider/stickyweb, -/mob/living/basic/giant_spider/hunter/ice, +/mob/living/basic/spider/giant/hunter/ice, /turf/open/floor/iron/freezer, /area/awaymission/snowdin/post/kitchen) "Ps" = ( @@ -11068,6 +11027,14 @@ slowdown = 1 }, /area/awaymission/snowdin/outside) +"Qb" = ( +/obj/machinery/door/airlock/mining/glass{ + name = "Mining Dock" + }, +/obj/effect/mapping_helpers/airlock/access/all/supply/mining, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "Qc" = ( /obj/structure/flora/tree/stump, /obj/effect/light_emitter{ @@ -11093,13 +11060,6 @@ 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, @@ -11109,6 +11069,13 @@ }, /turf/open/floor/iron/white, /area/awaymission/snowdin/post) +"Qi" = ( +/obj/structure/closet/crate/preopen, +/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_main/mechbay) "Qj" = ( /obj/effect/light_emitter{ name = "outdoor light"; @@ -11117,6 +11084,11 @@ }, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) +"Qk" = ( +/obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "Ql" = ( /obj/machinery/light/small/directional/south, /turf/open/misc/asteroid/snow{ @@ -11125,6 +11097,14 @@ slowdown = 1 }, /area/awaymission/snowdin/cave) +"Qn" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4; + piping_layer = 4 + }, +/obj/structure/sign/warning/xeno_mining/directional/east, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "Qp" = ( /obj/structure/table/reinforced, /obj/structure/window/reinforced/spawner/directional/south, @@ -11152,13 +11132,13 @@ /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) +"Qz" = ( +/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_main/mechbay) "QB" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1; @@ -11170,6 +11150,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/awaymission/snowdin/post) +"QC" = ( +/obj/machinery/conveyor{ + id = "snowdin_belt_mine" + }, +/obj/machinery/light/small/directional/east, +/turf/open/misc/asteroid/snow/ice, +/area/awaymission/snowdin/post/mining_main/mechbay) "QD" = ( /obj/item/shard{ icon_state = "medium" @@ -11211,7 +11198,7 @@ /turf/open/floor/iron/dark, /area/awaymission/snowdin/post/research) "QM" = ( -/mob/living/basic/giant_spider/nurse/ice, +/mob/living/basic/spider/giant/nurse/ice, /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) "QN" = ( @@ -11231,7 +11218,7 @@ /turf/open/floor/iron/dark, /area/awaymission/snowdin/cave) "QP" = ( -/mob/living/simple_animal/hostile/asteroid/basilisk, +/mob/living/basic/mining/basilisk, /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) "QQ" = ( @@ -11361,17 +11348,25 @@ /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/anticorner/contrasted{ - dir = 4 +"RG" = ( +/obj/item/shard, +/obj/item/stack/rods{ + amount = 2 }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "RH" = ( /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/cafeteria, /area/awaymission/snowdin/post/messhall) +"RL" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "RN" = ( /obj/structure/flora/bush/snow/style_random, /obj/effect/light_emitter{ @@ -11429,7 +11424,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/garage) "Sa" = ( -/mob/living/simple_animal/hostile/bear/snow, +/mob/living/basic/bear/snow, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/cave) "Sb" = ( @@ -11448,7 +11443,7 @@ /turf/open/floor/iron/dark/snowdin, /area/awaymission/snowdin/cave) "Si" = ( -/mob/living/basic/giant_spider/hunter/ice, +/mob/living/basic/spider/giant/hunter/ice, /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) "Sj" = ( @@ -11619,14 +11614,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/awaymission/snowdin/post/mining_dock) -"SQ" = ( -/obj/machinery/light/small/directional/west, -/obj/item/stack/rods{ - amount = 2 +"SO" = ( +/obj/machinery/door/airlock/external/glass/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 }, -/obj/structure/cable, /turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) +/area/awaymission/snowdin/post/mining_main/mechbay) "SS" = ( /obj/structure/fence{ dir = 4 @@ -11681,7 +11675,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/cavern2) "Tf" = ( -/mob/living/simple_animal/hostile/bear/snow, +/mob/living/basic/bear/snow, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) "Tk" = ( @@ -11711,14 +11705,6 @@ /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/directional/east, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "Tv" = ( /obj/structure/table, /obj/item/storage/medkit/ancient, @@ -11736,6 +11722,13 @@ /obj/machinery/light/broken/directional/east, /turf/open/floor/iron, /area/awaymission/snowdin/post/gateway) +"Tz" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "TA" = ( /mob/living/simple_animal/hostile/skeleton/eskimo, /turf/open/misc/asteroid/snow, @@ -11812,10 +11805,6 @@ /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, @@ -11859,6 +11848,10 @@ }, /turf/closed/indestructible/rock/snow/ice, /area/awaymission/snowdin/cave/cavern) +"Ur" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "Us" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ dir = 4; @@ -11929,11 +11922,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, @@ -11987,9 +11975,15 @@ slowdown = 1 }, /area/awaymission/snowdin/cave) +"Vg" = ( +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "Vi" = ( /obj/effect/decal/cleanable/blood/old, -/mob/living/simple_animal/hostile/bear/snow, +/mob/living/basic/bear/snow, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/cave) "Vl" = ( @@ -12012,7 +12006,7 @@ }, /area/awaymission/snowdin/outside) "Vo" = ( -/mob/living/basic/giant_spider/ice, +/mob/living/basic/spider/giant/ice, /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) "Vp" = ( @@ -12114,12 +12108,6 @@ /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, @@ -12139,6 +12127,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/awaymission/snowdin/post/dorm) +"Wk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/caution/stand_clear, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "Wl" = ( /obj/structure/rack, /obj/machinery/light/small/directional/east, @@ -12146,13 +12144,6 @@ /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/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) "Wp" = ( /obj/structure/statue/snow/snowman{ anchored = 1; @@ -12163,6 +12154,13 @@ }, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) +"Wq" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "Wt" = ( /obj/machinery/button/door/directional/west{ id = "snowdingarage1"; @@ -12194,6 +12192,10 @@ slowdown = 1 }, /area/awaymission/snowdin/cave) +"Wz" = ( +/obj/machinery/holopad, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "WA" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/machinery/portable_atmospherics/canister/plasma, @@ -12204,6 +12206,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/awaymission/snowdin/post/mining_dock) +"WD" = ( +/obj/machinery/door/firedoor, +/obj/structure/grille/broken, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "WE" = ( /obj/machinery/airalarm/directional/west, /obj/effect/turf_decal/tile/green/half/contrasted{ @@ -12240,6 +12248,11 @@ /obj/structure/cable, /turf/open/floor/plating, /area/awaymission/snowdin/post/minipost) +"WK" = ( +/obj/vehicle/sealed/mecha/ripley/mining, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/recharge_floor, +/area/awaymission/snowdin/post/mining_main/mechbay) "WM" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/plating, @@ -12275,6 +12288,15 @@ /obj/structure/cable, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_main/mechbay) +"WY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "Xb" = ( /mob/living/simple_animal/hostile/skeleton/eskimo, /turf/open/floor/plating, @@ -12284,6 +12306,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/snowdin/cave) +"Xg" = ( +/obj/structure/sign/warning/no_smoking/directional/south, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "Xh" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/manifold4w/pink/visible, @@ -12321,13 +12349,6 @@ }, /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/anticorner/contrasted, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "Xw" = ( /obj/structure/table, /obj/machinery/light/small/directional/south, @@ -12355,6 +12376,15 @@ /obj/effect/spawner/random/exotic/snow_gear, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) +"XJ" = ( +/obj/machinery/mineral/processing_unit{ + dir = 1 + }, +/obj/machinery/conveyor{ + id = "snowdin_belt_mine" + }, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "XK" = ( /obj/machinery/light/small/directional/south, /obj/machinery/button/door/directional/south{ @@ -12363,6 +12393,12 @@ }, /turf/open/floor/plating, /area/awaymission/snowdin/post/minipost) +"XM" = ( +/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_main/mechbay) "XN" = ( /obj/structure/fence, /turf/open/misc/asteroid/snow, @@ -12455,6 +12491,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/snowdin/cave) +"Yl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "Ym" = ( /turf/open/misc/asteroid/snow{ floor_variance = 0; @@ -12516,14 +12558,6 @@ /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" - }, -/obj/effect/mapping_helpers/airlock/access/all/supply/mining, -/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, @@ -12558,17 +12592,6 @@ /obj/structure/sign/warning/fire/directional/south, /turf/open/floor/engine, /area/awaymission/snowdin/post/engineering) -"YH" = ( -/obj/docking_port/stationary{ - dir = 4; - dwidth = 2; - height = 5; - shuttle_id = "snowdin_mining_down"; - name = "snowdin mining bottom"; - width = 5 - }, -/turf/open/floor/plating/elevatorshaft, -/area/awaymission/snowdin/post/mining_dock) "YK" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/iron/grimy, @@ -12577,15 +12600,6 @@ /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/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) "YR" = ( /obj/effect/turf_decal/weather/snow, /obj/structure/closet/crate/preopen{ @@ -12602,6 +12616,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark/snowdin, /area/awaymission/snowdin/outside) +"YW" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "YZ" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/airalarm/directional/west, @@ -12752,6 +12773,15 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/cafeteria, /area/awaymission/snowdin/post/messhall) +"ZV" = ( +/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_main/mechbay) "ZX" = ( /obj/structure/flora/tree/stump, /turf/open/misc/asteroid/snow, @@ -21269,7 +21299,7 @@ hg hN it jn -Wm +nJ jR jR mc @@ -21528,7 +21558,7 @@ iu jm jT kF -ln +se md xw QB @@ -23054,7 +23084,7 @@ az aC aC az -YP +LL bF bV cA @@ -24082,7 +24112,7 @@ aC aC aC az -bt +OX bJ Sp bp @@ -26416,9 +26446,9 @@ ZU dO ST nU -oq +ut oQ -py +bG pV Nv Mb @@ -26912,7 +26942,7 @@ Zy Zy bf SE -cM +jd ds dR ey @@ -27171,7 +27201,7 @@ bf ch cN dt -dS +LO ez fj fQ @@ -28400,7 +28430,7 @@ ae ae ae ae -tq +ku Zy dX dX @@ -28657,7 +28687,7 @@ ae ae ae ae -tq +ku FP te dX @@ -28667,10 +28697,10 @@ TI dX te Gf -tq -tq -tq -tq +ku +ku +ku +ku ae ae ae @@ -28914,7 +28944,7 @@ ae ae ae ae -tq +ku Fn Gw Fx @@ -28927,7 +28957,7 @@ Fy GS Ho Ho -tq +ku ae ae ae @@ -29171,7 +29201,7 @@ ae ae ae ae -tq +ku Fo Fx te @@ -29184,7 +29214,7 @@ Gt GT Hp Ho -tq +ku ae ae ae @@ -29428,7 +29458,7 @@ ae ae ae ae -tq +ku Fp Fx te @@ -29438,10 +29468,10 @@ Zy dX te WV -tq -tq -tq -tq +ku +ku +ku +ku ae ae ae @@ -29685,7 +29715,7 @@ ae ae ae ae -tq +ku WA Fx te @@ -29942,7 +29972,7 @@ ae ae ae ae -tq +ku Fn Fu Fy @@ -29952,10 +29982,10 @@ Zy dX te WV -tq -tq -tq -tq +ku +ku +ku +ku ae ae ae @@ -30199,8 +30229,8 @@ ae ae ae ae -tq -tq +ku +ku Fp Fx te @@ -30212,7 +30242,7 @@ Gw GS Ho Ho -tq +ku ae ae ae @@ -30457,7 +30487,7 @@ ae ae ae ae -tq +ku Fp RS Fx @@ -30469,7 +30499,7 @@ Fu GT Hp Ho -tq +ku ae ae ae @@ -30714,19 +30744,19 @@ ae ae ae ae -tq -tq -tq +ku +ku +ku Zy dX Zy dX te Gf -tq -tq -tq -tq +ku +ku +ku +ku ae ae ae @@ -57200,11 +57230,11 @@ OP HL Iz GU -wE -wE -wE -wD -wD +GH +GH +GH +GN +GN eJ eJ eJ @@ -57457,11 +57487,11 @@ HK HL IA GU -vW -Uf -wL -wO -wE +Mh +tK +He +ty +GH eJ eJ eJ @@ -57714,11 +57744,11 @@ HL Vd IB Gx -wM -wL -wL -JW -wE +tj +He +He +vl +GH eJ eJ eJ @@ -57971,11 +58001,11 @@ HM HM IB IJ -wM -wM -JA -wG -wE +tj +tj +Do +vJ +GH eJ eJ eJ @@ -58228,14 +58258,14 @@ GC Ic GU GU -wR -wD -wD -wE -wE -wD -wD -wD +zg +GN +GN +GH +GH +GN +GN +GN eJ eJ bh @@ -58475,24 +58505,24 @@ WN WN WN WN -xW -xW -xW -wT -xN -wL -xN -Id -Id -Id -Jc -YA -JB -JY -Kg -Kg -KD -wD +Gk +Gk +Gk +Oy +ak +He +ak +JR +JR +JR +An +Qb +FR +Kf +cU +cU +vI +GN eJ eJ bh @@ -58728,28 +58758,28 @@ WN WN WN WN -Qy -Qg -xW -xW -xW -wL -xN -GD -GZ -xy -Gj -wL -wL -Gi -Jd -Jm -JC -GZ -Gj -xy -xy -wD +tQ +xr +Gk +Gk +Gk +He +ak +Ei +Hg +Hf +Hh +He +He +Gr +yB +ZV +ME +Hg +Hh +Hf +Hf +GN eJ eJ bh @@ -58986,27 +59016,27 @@ 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 +Qz +RG +Aq +WD +RL +Gr +sX +OC +Qk +Qk +Qk +Wq +tj +uQ +Qb +CV +He +Hf +Hh +Hf +GN eJ eJ bh @@ -59243,27 +59273,27 @@ 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 +XM +xX +He +SO +Hf +Hh +Hf +tB +kn +Hf +FX +GN +ua +GH +GN +GN +GN +ME +Hg +ja +GN eJ eJ bh @@ -59500,27 +59530,27 @@ 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 +XM +He +Qn +SO +Hf +Hf +He +Hh +Hg +Hh +Xg +GN +tj +GH +xP +xP +GH +ME +Wz +JT +GN eJ eJ bh @@ -59756,28 +59786,28 @@ 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 +tQ +Gk +Gk +ho +Gk +NJ +zh +Pg +Hf +He +Hf +Fk +GN +tj +GN +la +He +ub +ME +Hg +Hf +GN eJ eJ bh @@ -60016,25 +60046,25 @@ WN WN WN WN -FL -xW -xW -xW -GG -wL -ya -ya -Ih -wD -UH -wD -Jp -JE -wD -Ts -Kq -KG -wD +zv +Gk +Gk +Gk +Vg +He +zh +zh +uQ +GN +tj +GN +Qi +tC +GN +Ke +LB +DL +GN eJ eJ bh @@ -60283,17 +60313,17 @@ Hy GN GH GH -wM -wE -wD -wE -wE -wD -Kr -wD -wD -wE -wE +tj +GH +GN +GH +GH +GN +KH +GN +GN +GH +GH bh bh bh @@ -60538,19 +60568,19 @@ GI Hc Hg YZ -Ii +Im +GN +tj +He +GN +Jl +Jl +JS +He +Hg +He +Hh GN -wM -wL -wD -JF -JF -Ki -wL -GZ -wL -Gj -wD bh bh bh @@ -60797,17 +60827,17 @@ Hg HO Ij GH -wM -wL -wD -JG -Ka -xO -Ks -Ka -KQ -KZ -wE +tj +He +GN +YW +Lb +Yl +Oc +Lb +FV +Tz +GH bh bh bh @@ -61054,17 +61084,17 @@ He HP Ik GH -wM -wL -wE -JH -Ys -Ys -YH -Ys -Ys -KX -wE +tj +He +GH +DM +Mi +Mi +pl +Mi +Mi +WY +GH bh bh bh @@ -61312,16 +61342,16 @@ HQ Il GH WX -wL -wE -JH -Ys -Ys -Ys -Ys -Ys -KX -wE +He +GH +DM +Mi +Mi +Mi +Mi +Mi +WY +GH bh bh bh @@ -61568,17 +61598,17 @@ Hz HO Im GN -wL -wL -wE -JI -Ys -Ys -Ys -Ys -Ys -KY -wE +He +He +GH +Af +Mi +Mi +Mi +Mi +Mi +Wk +GH bh bh bh @@ -61823,19 +61853,19 @@ GJ He HA HO -In +WK +GH +He +He +GH +DM +Mi +Mi +Mi +Mi +Mi +WY GH -wL -wL -wE -JH -Ys -Ys -Ys -Ys -Ys -KX -wE bh bh bh @@ -62082,17 +62112,17 @@ Hf HO Ik GN -wL -wL -wD -JH -Ys -Ys -Ys -Ys -Ys -KX -wD +He +He +GN +DM +Mi +Mi +Mi +Mi +Mi +WY +GN bh bh bh @@ -62339,17 +62369,17 @@ Hg Um Io IE -wL -Je -wD -JJ -Kb -Kb -Ku -Kb -Kb -Xu -wD +He +Ur +GN +vq +dJ +dJ +BW +dJ +dJ +sN +GN bh bh bh @@ -62594,19 +62624,19 @@ HR Hi Hh HS -Ip +Hh +GN +GN +vP +GH +GN +GH +GN +GN +GH +GH +GN GN -wD -Jf -wE -wD -wE -wD -wD -wE -wE -wD -wD bh bh bh @@ -62853,9 +62883,9 @@ HB GN GH GH -wL -Jg -wD +He +BX +GN eJ eJ eJ @@ -63102,17 +63132,17 @@ WN WN WN Bw -FQ -Gn -GO -Hk -HC -Hk -Hk -Hk -Hk -Jh -wE +QC +yb +OL +FI +XJ +FI +FI +FI +FI +rE +GH eJ eJ eJ @@ -63359,17 +63389,17 @@ WN WN WN ui -xW -xW -xW -xW -xW -xW -xW -xW -xW -xW -xW +Gk +Gk +Gk +Gk +Gk +Gk +Gk +Gk +Gk +Gk +Gk eJ eJ eJ diff --git a/_maps/RandomZLevels/undergroundoutpost45.dmm b/_maps/RandomZLevels/undergroundoutpost45.dmm index 40f8cbb430b7d..6aa99013c81f7 100644 --- a/_maps/RandomZLevels/undergroundoutpost45.dmm +++ b/_maps/RandomZLevels/undergroundoutpost45.dmm @@ -24,6 +24,11 @@ temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) +"ai" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) "aj" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, @@ -127,7 +132,7 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "aB" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/landmark/awaystart, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 @@ -178,6 +183,14 @@ /obj/structure/sign/poster/official/safety_internals/directional/west, /turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/central) +"aL" = ( +/obj/effect/turf_decal/tile/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/awaymission/undergroundoutpost45/research) "aM" = ( /obj/machinery/vending/cola, /turf/open/floor/iron/dark, @@ -216,7 +229,6 @@ /turf/open/floor/iron/grimy, /area/awaymission/undergroundoutpost45/central) "aU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/structure/closet/secure_closet/personal/cabinet{ locked = 0; req_access = list("away_maintenance") @@ -248,14 +260,12 @@ /turf/open/floor/iron, /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 = list("away_maintenance") }, /obj/item/clothing/under/suit/black/skirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/central) "ba" = ( @@ -273,10 +283,6 @@ }, /turf/open/floor/iron/grimy, /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, @@ -295,7 +301,7 @@ /turf/open/floor/iron/grimy, /area/awaymission/undergroundoutpost45/central) "bh" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 }, @@ -315,13 +321,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"bl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) "bm" = ( /obj/structure/chair/comfy/beige{ dir = 1 @@ -347,13 +346,6 @@ }, /turf/open/floor/iron/grimy, /area/awaymission/undergroundoutpost45/central) -"bp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) "bq" = ( /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) @@ -375,7 +367,6 @@ /turf/open/floor/iron/freezer, /area/awaymission/undergroundoutpost45/central) "bw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/machinery/camera/directional/east{ c_tag = "Arrivals"; network = list("uo45") @@ -383,6 +374,7 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "bx" = ( @@ -406,57 +398,17 @@ /turf/open/floor/iron, /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, -/area/awaymission/undergroundoutpost45/central) -"bC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"bD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 10 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"bE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"bF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "bG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "bH" = ( @@ -480,64 +432,15 @@ /area/awaymission/undergroundoutpost45/central) "bK" = ( /obj/structure/sign/poster/official/nanotrasen_logo/directional/south, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"bL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"bM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "bN" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/official/nanotrasen_logo/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /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, -/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, @@ -546,56 +449,6 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) -"ca" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"cb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"cc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"cd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"ce" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/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, -/area/awaymission/undergroundoutpost45/central) -"cg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"ch" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) "ci" = ( /obj/effect/decal/cleanable/blood/gibs/limb, /turf/open/misc/asteroid{ @@ -604,67 +457,22 @@ temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) -"cj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/turf/open/floor/plating, -/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, -/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, -/area/awaymission/undergroundoutpost45/central) "cm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/gateway) "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, /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, -/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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"ct" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) "cu" = ( /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, @@ -675,15 +483,17 @@ /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) "cw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, /obj/structure/table/wood, /obj/machinery/newscaster/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/central) +"cA" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/gateway) "cB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/structure/table/wood, /obj/machinery/newscaster/directional/east, /turf/open/floor/carpet, @@ -698,18 +508,12 @@ /turf/open/floor/plating, /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, /area/awaymission/undergroundoutpost45/central) -"cG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) "cH" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, /obj/structure/chair/wood{ @@ -723,20 +527,16 @@ }, /turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/central) -"cI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/central) "cJ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, /obj/structure/bed, /obj/item/bedsheet, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/central) "cK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, /obj/structure/bed, @@ -744,8 +544,8 @@ /turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/central) "cL" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 }, /obj/machinery/button/door/directional/south{ id = "awaydorm1"; @@ -755,74 +555,20 @@ }, /turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/central) -"cM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5 - }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"cN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/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, -/area/awaymission/undergroundoutpost45/central) -"cP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"cQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1 - }, -/turf/open/floor/plating, -/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, -/area/awaymission/undergroundoutpost45/central) "cS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, /obj/machinery/portable_atmospherics/scrubber, /obj/structure/window/spawner/directional/west, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) "cT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, /obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) "cU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, /obj/structure/reagent_dispensers/fueltank, /obj/structure/window/spawner/directional/east, /turf/open/floor/plating, /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, @@ -831,17 +577,13 @@ /obj/item/stack/rods, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) -"cY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/grille, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) "cZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/door/airlock{ id_tag = "awaydorm2"; name = "Dorm 2" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "da" = ( @@ -852,72 +594,19 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "db" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/door/airlock{ id_tag = "awaydorm1"; name = "Dorm 1" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /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, /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, -/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, -/area/awaymission/undergroundoutpost45/central) -"dh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plating, -/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, -/area/awaymission/undergroundoutpost45/central) -"dk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"dl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) "dm" = ( /obj/machinery/firealarm/directional/north, /turf/open/floor/iron, @@ -934,39 +623,13 @@ /obj/effect/turf_decal/tile/green, /turf/open/floor/iron, /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) -"dx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"dy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"dz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"dA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 +"du" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/gateway) "dB" = ( /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 4 @@ -988,11 +651,12 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/sink/directional/south, /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, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "dF" = ( @@ -1003,6 +667,8 @@ /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, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "dG" = ( @@ -1012,6 +678,8 @@ /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, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "dH" = ( @@ -1021,6 +689,8 @@ /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, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "dI" = ( @@ -1032,6 +702,8 @@ /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, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "dJ" = ( @@ -1043,17 +715,20 @@ /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, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "dK" = ( /obj/structure/disposalpipe/segment{ dir = 10 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/structure/sink/directional/south, /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, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "dL" = ( @@ -1075,7 +750,6 @@ /turf/open/floor/iron/showroomfloor, /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, @@ -1091,14 +765,12 @@ name = "refrigerator"; req_access = list("away_maintenance") }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/cafeteria{ dir = 5 }, /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/half/contrasted{ @@ -1107,12 +779,11 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "dQ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, /obj/effect/turf_decal/tile/red/anticorner/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/awaymission/undergroundoutpost45/central) "dR" = ( @@ -1120,10 +791,12 @@ name = "Security Checkpoint" }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "dS" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, /obj/effect/turf_decal/tile/neutral, @@ -1139,7 +812,7 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "dV" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, /obj/effect/turf_decal/tile/neutral{ @@ -1151,6 +824,8 @@ /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/iron, /area/awaymission/undergroundoutpost45/central) "dX" = ( @@ -1160,6 +835,8 @@ /obj/effect/turf_decal/tile/green/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/awaymission/undergroundoutpost45/central) "dY" = ( @@ -1171,18 +848,24 @@ name = "Hydroponics" }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "dZ" = ( /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/awaymission/undergroundoutpost45/central) "ea" = ( /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, /area/awaymission/undergroundoutpost45/central) "eb" = ( @@ -1191,9 +874,9 @@ /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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "ed" = ( @@ -1203,38 +886,21 @@ }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, /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/awaymission/undergroundoutpost45/gateway) -"ee" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) "ef" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, /obj/machinery/door/airlock/maintenance{ name = "Security Checkpoint Maintenance" }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) -"eg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) "eh" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) @@ -1242,12 +908,15 @@ /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/awaymission/undergroundoutpost45/central) "ej" = ( /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "ek" = ( @@ -1280,31 +949,31 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "ep" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "eq" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, /turf/open/floor/iron, /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/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 2 }, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) +"eu" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) "ev" = ( /obj/structure/closet/secure_closet/personal/cabinet{ locked = 0; @@ -1318,6 +987,7 @@ /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "ey" = ( @@ -1357,24 +1027,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"eF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/turf/open/floor/plating, -/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, -/area/awaymission/undergroundoutpost45/central) "eH" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/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/awaymission/undergroundoutpost45/central) "eI" = ( @@ -1424,6 +1081,8 @@ /obj/effect/turf_decal/tile/green/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/awaymission/undergroundoutpost45/central) "eV" = ( @@ -1434,7 +1093,6 @@ /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/anticorner/contrasted{ dir = 8 @@ -1443,7 +1101,6 @@ /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 @@ -1464,6 +1121,7 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "fa" = ( @@ -1530,18 +1188,12 @@ "fl" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/green/anticorner/contrasted, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /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/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, @@ -1554,7 +1206,7 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "fr" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -1572,11 +1224,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/central) +"fv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/turf/closed/wall/r_wall, +/area/awaymission/undergroundoutpost45/engineering) "fw" = ( /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/dark, /area/awaymission/undergroundoutpost45/central) "fx" = ( @@ -1588,6 +1246,8 @@ }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, /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/awaymission/undergroundoutpost45/central) "fy" = ( @@ -1595,75 +1255,58 @@ 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/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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) "fA" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 }, /obj/structure/chair/wood, /turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/central) "fB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - 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/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 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /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, -/area/awaymission/undergroundoutpost45/central) -"fE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"fF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"fG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - 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/awaymission/undergroundoutpost45/central) "fH" = ( /obj/structure/disposalpipe/segment{ dir = 5 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "fI" = ( @@ -1686,6 +1329,13 @@ "fO" = ( /turf/closed/wall, /area/awaymission/undergroundoutpost45/crew_quarters) +"fP" = ( +/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/awaymission/undergroundoutpost45/mining) "fQ" = ( /obj/structure/table/wood, /obj/machinery/newscaster/directional/south, @@ -1745,28 +1395,21 @@ /area/awaymission/undergroundoutpost45/crew_quarters) "gb" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /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/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" - }, +/obj/machinery/door/airlock/external/ruin, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"gf" = ( +/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/awaymission/undergroundoutpost45/central) "gg" = ( @@ -1783,18 +1426,6 @@ /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, /turf/open/floor/plating, /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, -/area/awaymission/undergroundoutpost45/central) -"gl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) "gm" = ( /obj/structure/closet/crate{ desc = "It's a storage unit for kitchen clothes and equipment."; @@ -1823,14 +1454,17 @@ }, /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) "gq" = ( /obj/structure/disposalpipe/segment{ dir = 10 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /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/awaymission/undergroundoutpost45/central) "gr" = ( @@ -1841,8 +1475,8 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) "gt" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 2 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) @@ -1913,9 +1547,10 @@ /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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) "gI" = ( @@ -1963,13 +1598,6 @@ dir = 5 }, /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, -/area/awaymission/undergroundoutpost45/central) "gU" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -2111,7 +1739,7 @@ /turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/gateway) "hx" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/structure/chair{ dir = 8 }, @@ -2160,7 +1788,7 @@ /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) "hF" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) "hH" = ( @@ -2252,43 +1880,20 @@ }, /area/awaymission/undergroundoutpost45/crew_quarters) "hT" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 2 }, /turf/open/floor/iron/cafeteria{ dir = 5 }, /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 }, /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, -/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, -/area/awaymission/undergroundoutpost45/central) -"hX" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) "hZ" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -2423,9 +2028,6 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -2435,33 +2037,27 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /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 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) "iC" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) "iD" = ( @@ -2474,7 +2070,7 @@ }, /area/awaymission/undergroundoutpost45/research) "iE" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) "iF" = ( @@ -2509,7 +2105,7 @@ }, /area/awaymission/undergroundoutpost45/crew_quarters) "iK" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/structure/disposalpipe/segment{ dir = 10 }, @@ -2525,9 +2121,10 @@ /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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) "iO" = ( @@ -2549,59 +2146,23 @@ /turf/open/floor/iron, /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, /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, -/area/awaymission/undergroundoutpost45/gateway) "iT" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/structure/chair{ dir = 8 }, /turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/gateway) -"iU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/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, /area/awaymission/undergroundoutpost45/gateway) -"iX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 10 - }, -/turf/open/floor/iron/white, -/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, @@ -2611,13 +2172,9 @@ /area/awaymission/undergroundoutpost45/research) "iZ" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"ja" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) "jc" = ( /obj/machinery/light/blacklight/directional/east, /obj/machinery/computer/security/telescreen/entertainment/directional/east, @@ -2638,8 +2195,9 @@ }, /area/awaymission/undergroundoutpost45/crew_quarters) "je" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/structure/disposalpipe/junction, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria{ dir = 5 }, @@ -2659,97 +2217,44 @@ }, /area/awaymission/undergroundoutpost45/crew_quarters) "jh" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/gateway) -"ji" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/gateway) -"jj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron, -/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, /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, -/area/awaymission/undergroundoutpost45/gateway) -"jm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"jn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) "jo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, /obj/machinery/door/airlock/research{ name = "Gateway Observation" }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/gateway) -"jp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) "jq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/machinery/light/small/directional/east, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/gateway) "jr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/structure/table, /obj/item/folder/white, /obj/item/disk/tech_disk, /obj/item/disk/design_disk, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"js" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/white, -/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, -/area/awaymission/undergroundoutpost45/crew_quarters) "ju" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ name = "Central Access" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) "jv" = ( @@ -2768,6 +2273,13 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) +"jy" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) "jz" = ( /obj/machinery/camera/directional/east{ c_tag = "Bar"; @@ -2780,44 +2292,23 @@ "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" }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, /obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /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{ @@ -2834,42 +2325,31 @@ /area/awaymission/undergroundoutpost45/gateway) "jI" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/gateway) "jJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/gateway) -"jM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/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" }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) "jO" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) -"jQ" = ( -/obj/machinery/light/small/directional/west, -/turf/open/misc/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/research) "jR" = ( /obj/structure/closet/emcloset, /obj/item/clothing/mask/breath, @@ -2893,7 +2373,7 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) "jU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) @@ -2908,9 +2388,6 @@ /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/structure/cable, /obj/effect/turf_decal/tile/bar/opposingcorners, @@ -2920,66 +2397,50 @@ /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/structure/cable, /obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /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, -/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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) "kd" = ( @@ -2996,10 +2457,6 @@ dir = 5 }, /area/awaymission/undergroundoutpost45/research) -"kf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) "kh" = ( /obj/item/kirbyplants{ layer = 5 @@ -3007,19 +2464,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, /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, -/area/awaymission/undergroundoutpost45/research) "kj" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/turf_decal/tile/purple/half/contrasted{ 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/awaymission/undergroundoutpost45/research) "kk" = ( @@ -3031,14 +2482,13 @@ /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" }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, /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/awaymission/undergroundoutpost45/gateway) "km" = ( @@ -3051,8 +2501,9 @@ /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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) "kp" = ( @@ -3062,42 +2513,21 @@ }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"kq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) "kr" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ks" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"kt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /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/structure/cable, /obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) "kv" = ( @@ -3141,7 +2571,7 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/gateway) "kB" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, /obj/effect/turf_decal/stripes/line{ @@ -3150,24 +2580,15 @@ /turf/open/floor/iron, /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 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/gateway) -"kE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/open/floor/iron/white, -/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" }, @@ -3175,9 +2596,6 @@ /turf/open/floor/iron/white, /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 @@ -3185,28 +2603,13 @@ /turf/open/floor/iron/white, /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, /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, -/area/awaymission/undergroundoutpost45/gateway) -"kK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1 - }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/purple{ dir = 4 }, @@ -3214,9 +2617,6 @@ /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" }, @@ -3226,60 +2626,21 @@ }, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/gateway) -"kM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"kN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/open/floor/iron/white, -/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, -/area/awaymission/undergroundoutpost45/research) -"kP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - 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/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, -/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, -/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, /area/awaymission/undergroundoutpost45/research) "kU" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, /obj/effect/decal/cleanable/dirt, @@ -3317,6 +2678,11 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/research) +"kZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) "la" = ( /obj/machinery/shower/directional/south, /obj/effect/turf_decal/stripes/line{ @@ -3332,23 +2698,16 @@ /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) "lc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, /obj/structure/sign/departments/science/directional/west, /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ld" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - 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/awaymission/undergroundoutpost45/crew_quarters) "le" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, /turf/open/floor/iron, @@ -3362,68 +2721,47 @@ /turf/open/floor/iron, /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/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"li" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /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/opposingcorners, -/turf/open/floor/iron, -/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/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) "lm" = ( /obj/structure/disposalpipe/junction, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/structure/cable, /obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) "ln" = ( /turf/closed/wall/r_wall, /area/awaymission/undergroundoutpost45/engineering) "lq" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, /obj/structure/cable, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/gateway) "lt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /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, @@ -3433,111 +2771,92 @@ req_access = list("away_maintenance") }, /obj/effect/turf_decal/tile/red/anticorner/contrasted, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/research) "lv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) -"lw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - 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/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" }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, /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/awaymission/undergroundoutpost45/gateway) "ly" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) -"lz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/cable, /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/white, /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/structure/cable, /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/white, /area/awaymission/undergroundoutpost45/gateway) "lB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, /obj/structure/cable, /obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/gateway) "lC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /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/white, /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" }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, /obj/structure/cable, /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/white, /area/awaymission/undergroundoutpost45/gateway) "lE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/structure/cable, /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/white, /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/structure/cable, /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/white, /area/awaymission/undergroundoutpost45/research) "lG" = ( @@ -3546,9 +2865,10 @@ dir = 8 }, /obj/machinery/firealarm/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/cable, /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/white, /area/awaymission/undergroundoutpost45/research) "lH" = ( @@ -3558,11 +2878,10 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, /obj/structure/cable, /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/white, /area/awaymission/undergroundoutpost45/research) "lI" = ( @@ -3570,38 +2889,31 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, /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/white, /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, -/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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) "lL" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, /obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) "lM" = ( /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/white, /area/awaymission/undergroundoutpost45/research) "lN" = ( @@ -3611,6 +2923,7 @@ network = list("uo45","uo45r") }, /obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) "lO" = ( @@ -3618,17 +2931,21 @@ name = "Research Division Access" }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) "lP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/turf_decal/tile/purple/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/awaymission/undergroundoutpost45/crew_quarters) "lQ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) "lR" = ( @@ -3669,18 +2986,9 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /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, -/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" }, @@ -3730,6 +3038,7 @@ /area/awaymission/undergroundoutpost45/gateway) "mc" = ( /obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron{ dir = 8 }, @@ -3738,14 +3047,13 @@ /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/gateway) "me" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/gateway) "mf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/machinery/portable_atmospherics/scrubber, /obj/structure/window/spawner/directional/east, /obj/effect/decal/cleanable/dirt, @@ -3753,30 +3061,23 @@ /area/awaymission/undergroundoutpost45/research) "mg" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /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/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" }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria{ dir = 5 }, /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, -/area/awaymission/undergroundoutpost45/research) "mj" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -3835,9 +3136,6 @@ /turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/crew_quarters) "mw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 4 - }, /obj/structure/window/reinforced/spawner/directional/west, /obj/item/storage/backpack/satchel/eng, /obj/item/clothing/suit/hazardvest, @@ -3854,13 +3152,11 @@ /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, /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, /area/awaymission/undergroundoutpost45/crew_quarters) @@ -3938,18 +3234,15 @@ }, /turf/open/floor/iron/dark, /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" }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, /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/awaymission/undergroundoutpost45/research) "mL" = ( @@ -3960,6 +3253,8 @@ /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/iron/cafeteria{ dir = 5 }, @@ -3968,13 +3263,8 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/undergroundoutpost45/research) -"mO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria{ dir = 5 }, @@ -4032,23 +3322,14 @@ /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, -/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" - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) "mX" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/structure/chair/wood{ dir = 1 }, @@ -4058,20 +3339,16 @@ normaldoorcontrol = 1; specialfunctions = 4 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/crew_quarters) "mY" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /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, -/area/awaymission/undergroundoutpost45/engineering) "nb" = ( /obj/machinery/button/door/directional/south{ id = "awaydorm7"; @@ -4079,6 +3356,9 @@ normaldoorcontrol = 1; specialfunctions = 4 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/crew_quarters) "nc" = ( @@ -4115,11 +3395,6 @@ }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"ng" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) "nh" = ( /obj/machinery/door/poddoor{ id = "UO45_Secure Storage"; @@ -4131,20 +3406,23 @@ /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, -/area/awaymission/undergroundoutpost45/research) +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Central Access" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) "nl" = ( /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/cafeteria{ dir = 5 }, /area/awaymission/undergroundoutpost45/research) "nm" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, /turf/open/floor/iron/cafeteria{ @@ -4152,7 +3430,6 @@ }, /area/awaymission/undergroundoutpost45/research) "nn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/structure/chair, /turf/open/floor/iron/cafeteria{ dir = 5 @@ -4195,71 +3472,49 @@ }, /turf/open/floor/iron/white, /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, -/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, -/area/awaymission/undergroundoutpost45/research) -"nu" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - 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/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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) "nw" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ 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/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/structure/cable, /obj/effect/turf_decal/tile/neutral/anticorner/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/awaymission/undergroundoutpost45/crew_quarters) "ny" = ( @@ -4272,19 +3527,21 @@ /turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/crew_quarters) "nB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/door/airlock{ id_tag = "awaydorm5"; name = "Dorm 5" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) "nC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/door/airlock{ id_tag = "awaydorm7"; name = "Dorm 7" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) "nD" = ( @@ -4293,16 +3550,7 @@ }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"nE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) "nF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 }, @@ -4310,29 +3558,11 @@ /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, /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, -/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, -/area/awaymission/undergroundoutpost45/crew_quarters) "nJ" = ( /obj/effect/turf_decal/stripes/corner, /obj/structure/cable, @@ -4350,18 +3580,7 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /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, -/area/awaymission/undergroundoutpost45/research) "nQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/structure/table/reinforced, /obj/item/paper_bin{ pixel_x = 1; @@ -4399,7 +3618,7 @@ }, /area/awaymission/undergroundoutpost45/research) "nU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/research) "nV" = ( @@ -4408,60 +3627,41 @@ }, /turf/open/floor/iron, /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) "oa" = ( /obj/structure/disposalpipe/segment{ dir = 5 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/structure/cable, /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/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/structure/cable, /obj/effect/turf_decal/tile/neutral/half/contrasted{ 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/awaymission/undergroundoutpost45/crew_quarters) "oc" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/half/contrasted{ 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/awaymission/undergroundoutpost45/crew_quarters) "od" = ( @@ -4469,20 +3669,18 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/half/contrasted{ 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/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") @@ -4491,17 +3689,17 @@ /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/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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) "og" = ( @@ -4509,39 +3707,38 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1 - }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /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/awaymission/undergroundoutpost45/crew_quarters) "oi" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/structure/cable, /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/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/structure/cable, /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/awaymission/undergroundoutpost45/crew_quarters) "ok" = ( @@ -4549,61 +3746,34 @@ dir = 4 }, /obj/machinery/light/small/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ol" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable, -/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/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, -/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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) "oo" = ( /obj/structure/disposalpipe/junction/yjunction{ dir = 2 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/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/awaymission/undergroundoutpost45/crew_quarters) "op" = ( @@ -4611,30 +3781,18 @@ /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, -/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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /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, @@ -4673,13 +3831,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /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, -/area/awaymission/undergroundoutpost45/research) "ox" = ( /obj/structure/filingcabinet/chestdrawer, /turf/open/floor/iron/cafeteria{ @@ -4712,7 +3863,6 @@ dir = 1; pixel_y = 3 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/open/floor/iron/cafeteria{ dir = 5 }, @@ -4739,69 +3889,38 @@ }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/research) -"oD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/research) "oE" = ( /obj/machinery/door/airlock/security/glass{ name = "Security Office" }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"oF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/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, /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, /area/awaymission/undergroundoutpost45/crew_quarters) -"oI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/turf/open/floor/iron, -/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, /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/half/contrasted, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) "oL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, /obj/machinery/firealarm/directional/south, @@ -4810,57 +3929,20 @@ }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"oM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) "oN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /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, -/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, -/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/half/contrasted, /turf/open/floor/iron, /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/anticorner/contrasted, /turf/open/floor/iron, /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, -/area/awaymission/undergroundoutpost45/crew_quarters) "oU" = ( /obj/machinery/light/small/directional/west, /obj/effect/decal/cleanable/dirt, @@ -4911,18 +3993,20 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /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/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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) "pd" = ( @@ -4943,13 +4027,15 @@ dir = 9 }, /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/cafeteria{ dir = 5 }, /area/awaymission/undergroundoutpost45/research) "pf" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 }, /turf/open/floor/iron/cafeteria{ dir = 5 @@ -4972,7 +4058,6 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/research) "pi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, /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."; @@ -4983,12 +4068,6 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/research) -"pj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ - dir = 6 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) "pl" = ( /obj/item/kirbyplants{ layer = 5 @@ -5014,23 +4093,21 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) "po" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/door/airlock{ id_tag = "awaydorm4"; name = "Dorm 4" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /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" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) "pr" = ( @@ -5045,27 +4122,13 @@ /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/crew_quarters) "pt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/firealarm/directional/west, /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/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 @@ -5073,26 +4136,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /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, -/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, -/area/awaymission/undergroundoutpost45/engineering) "pC" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -5121,20 +4164,18 @@ /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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /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" }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/research) "pJ" = ( @@ -5143,14 +4184,6 @@ }, /turf/open/floor/iron/freezer, /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" @@ -5178,7 +4211,7 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) "pQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, /obj/machinery/button/door/directional/west{ @@ -5187,20 +4220,14 @@ normaldoorcontrol = 1; specialfunctions = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/crew_quarters) "pR" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, /turf/open/floor/carpet, /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{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, /obj/machinery/button/door/directional/east{ @@ -5209,6 +4236,7 @@ normaldoorcontrol = 1; specialfunctions = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/crew_quarters) "pV" = ( @@ -5245,7 +4273,6 @@ /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/engineering) "qc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /obj/machinery/door/airlock/engineering/glass{ name = "SMES Room" }, @@ -5254,34 +4281,23 @@ /turf/open/floor/iron/dark, /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, +/obj/machinery/atmospherics/pipe/layer_manifold/supply, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /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" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /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, -/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; @@ -5294,10 +4310,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/general{ dir = 10 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/telecomms, /area/awaymission/undergroundoutpost45/research) "qk" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/research) "ql" = ( @@ -5319,7 +4337,6 @@ /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, @@ -5341,6 +4358,7 @@ /area/awaymission/undergroundoutpost45/research) "qs" = ( /obj/structure/chair/wood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/crew_quarters) "qu" = ( @@ -5372,27 +4390,20 @@ /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 1 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"qG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 5 +/obj/machinery/atmospherics/components/binary/valve/on/layer2{ + dir = 4 }, -/obj/structure/cable, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "qH" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, -/obj/structure/cable, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "qI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 4 - }, /obj/structure/window/reinforced/spawner/directional/east{ layer = 2.9 }, @@ -5407,9 +4418,6 @@ /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") @@ -5427,13 +4435,13 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "qK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/machinery/computer/atmos_control/noreconnect{ atmos_chambers = list("uo45air"="Air Supply") }, /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/corner{ dir = 1 }, @@ -5447,25 +4455,11 @@ }, /turf/open/floor/iron/cafeteria, /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, -/area/awaymission/undergroundoutpost45/engineering) "qN" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"qO" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) "qQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general, /turf/open/floor/iron/dark/telecomms, @@ -5497,19 +4491,16 @@ /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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/side{ dir = 4 }, /area/awaymission/undergroundoutpost45/research) "qV" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) @@ -5522,9 +4513,10 @@ /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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) "qY" = ( @@ -5563,23 +4555,18 @@ /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/crew_quarters) "re" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/extinguisher_cabinet/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/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, /area/awaymission/undergroundoutpost45/crew_quarters) -"rg" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/crew_quarters) "rh" = ( /obj/machinery/light/small/directional/west, /obj/machinery/firealarm/directional/west, @@ -5589,7 +4576,7 @@ }, /area/awaymission/undergroundoutpost45/engineering) "ri" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -5639,9 +4626,6 @@ /turf/open/floor/iron, /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, @@ -5651,32 +4635,16 @@ }, /turf/open/floor/iron, /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/auto_name/directional/west, /obj/effect/mapping_helpers/apc/full_charge, /obj/effect/mapping_helpers/apc/cell_10k, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, /obj/structure/cable, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"rq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, -/obj/machinery/meter/monitored{ - chamber_id = "uo45distro" - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) "rr" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 }, /obj/item/clothing/suit/armor/vest, /obj/item/clothing/head/helmet, @@ -5702,45 +4670,29 @@ /obj/item/clothing/under/misc/pj/blue, /turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/mining) -"rt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/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, -/area/awaymission/undergroundoutpost45/engineering) "rv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible{ - dir = 9 - }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "rw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "rx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/machinery/portable_atmospherics/scrubber, /obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/manifold4w/green, /turf/open/floor/iron, /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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) "rz" = ( @@ -5773,43 +4725,34 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /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" }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) "rG" = ( /obj/structure/disposalpipe/segment{ dir = 10 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - 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/side{ dir = 4 }, /area/awaymission/undergroundoutpost45/research) -"rH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) "rI" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, /obj/effect/decal/cleanable/dirt, @@ -5824,10 +4767,11 @@ /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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) "rL" = ( @@ -5842,85 +4786,63 @@ /turf/open/floor/plating, /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") }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) "rQ" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"rR" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, /obj/structure/cable, /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/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/structure/cable, /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/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/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/structure/cable, /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -5931,23 +4853,17 @@ /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/structure/cable, /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) "rW" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, /obj/structure/cable, /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ dir = 4 @@ -5959,9 +4875,6 @@ /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" }, @@ -5973,34 +4886,17 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, /obj/structure/cable, /turf/open/floor/iron, /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, -/area/awaymission/undergroundoutpost45/engineering) -"sa" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) +/area/awaymission/undergroundoutpost45/research) "sb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 @@ -6008,22 +4904,12 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "sd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"se" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) "sf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/table, /obj/machinery/recharger{ pixel_y = 4 @@ -6034,28 +4920,14 @@ }, /turf/open/floor/iron, /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, -/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, /area/awaymission/undergroundoutpost45/engineering) "si" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 }, /obj/structure/closet/secure_closet/personal/cabinet{ locked = 0; @@ -6069,9 +4941,6 @@ /obj/effect/mapping_helpers/apc/unlocked, /obj/effect/mapping_helpers/apc/cell_10k, /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; @@ -6084,40 +4953,17 @@ /obj/effect/turf_decal/tile/brown, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/mining) -"sk" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Mix to Distro" - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"sl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"sm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) "sn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "so" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "sp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible{ - dir = 4 - }, /obj/effect/decal/cleanable/dirt, /obj/machinery/computer/atmos_control/noreconnect{ atmos_chambers = list("uo45mix"="Mix Chamber"); @@ -6126,16 +4972,15 @@ /obj/effect/turf_decal/tile/green/anticorner/contrasted{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/iron, /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 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/engineering) "sr" = ( @@ -6155,8 +5000,9 @@ /area/awaymission/undergroundoutpost45/research) "su" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /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/plating, /area/awaymission/undergroundoutpost45/research) "sv" = ( @@ -6174,7 +5020,6 @@ /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 }, @@ -6201,35 +5046,24 @@ /turf/open/floor/iron/freezer, /area/awaymission/undergroundoutpost45/crew_quarters) "sD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8 - }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) "sE" = ( /obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, /turf/open/floor/iron, /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, /area/awaymission/undergroundoutpost45/crew_quarters) "sG" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, @@ -6237,95 +5071,54 @@ /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, /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, -/area/awaymission/undergroundoutpost45/crew_quarters) "sJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /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/anticorner/contrasted, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /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, -/area/awaymission/undergroundoutpost45/engineering) -"sM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"sN" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - 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/awaymission/undergroundoutpost45/engineering) "sO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1 - }, /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 }, /turf/open/floor/iron, /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/half/contrasted{ dir = 8 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"sR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/iron, /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/half/contrasted{ @@ -6335,81 +5128,32 @@ /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, /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, -/area/awaymission/undergroundoutpost45/engineering) -"sV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/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, -/area/awaymission/undergroundoutpost45/engineering) -"sX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 10 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"sY" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - name = "Mix to Filter" - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"sZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible{ - dir = 6 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"ta" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible{ - dir = 9 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) "tb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/iron, /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/anticorner/contrasted, +/obj/machinery/atmospherics/components/trinary/filter/on/layer2{ + dir = 1 + }, /turf/open/floor/iron, /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 }, +/obj/machinery/atmospherics/pipe/layer_manifold/orange{ + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/engineering) "te" = ( @@ -6429,91 +5173,36 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/cable, -/turf/open/floor/plating, -/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, -/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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /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, -/area/awaymission/undergroundoutpost45/research) -"tk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - 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/awaymission/undergroundoutpost45/research) "tl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) "tm" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) "ts" = ( @@ -6521,33 +5210,32 @@ /turf/open/floor/iron/freezer, /area/awaymission/undergroundoutpost45/crew_quarters) "tt" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /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 }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ + dir = 1 + }, /turf/open/floor/iron/white/corner{ dir = 1 }, /area/awaymission/undergroundoutpost45/engineering) "tw" = ( /obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/structure/window/reinforced/spawner/directional/east{ layer = 2.9 }, @@ -6555,15 +5243,19 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2{ + dir = 1 + }, /turf/open/floor/iron/white/corner{ dir = 1 }, /area/awaymission/undergroundoutpost45/engineering) "tx" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/structure/cable, /obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "tz" = ( @@ -6582,14 +5274,7 @@ }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"tA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) "tB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8 - }, /obj/item/screwdriver{ pixel_y = 10 }, @@ -6600,178 +5285,111 @@ /turf/open/floor/iron, /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, -/area/awaymission/undergroundoutpost45/engineering) -"tD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/obj/structure/cable, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "tE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "tF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 8 - }, /obj/machinery/meter/monitored{ chamber_id = "uo45waste" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "tG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 9 - }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"tH" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "N2 Outlet Pump" - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) "tI" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "O2 Outlet Pump" - }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/green, /turf/open/floor/iron, /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" }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) "tP" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - 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/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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /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, -/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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /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/directional/north, /turf/open/floor/iron/freezer, @@ -6782,40 +5400,31 @@ /turf/open/floor/iron/freezer, /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 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) "ua" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/structure/cable, /obj/effect/turf_decal/tile/brown{ dir = 4 }, /turf/open/floor/iron, /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" }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, /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/awaymission/undergroundoutpost45/engineering) "uf" = ( @@ -6827,130 +5436,93 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "ug" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "uj" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "External to Filter" - }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "uk" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - name = "Air to External" - }, +/obj/machinery/atmospherics/components/binary/pump/on/supply/visible/layer4, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "um" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{ - dir = 4 - }, /obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 8 }, +/obj/machinery/atmospherics/components/trinary/filter/on/layer2{ + dir = 4 + }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "un" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/machinery/computer/atmos_control/noreconnect{ atmos_chambers = list("uo45n2"="Nitrogen Supply"); dir = 1 }, /obj/effect/turf_decal/tile/red/anticorner/contrasted, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/iron, /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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "up" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ dir = 8 }, +/obj/machinery/atmospherics/components/trinary/filter/on/layer2{ + dir = 4 + }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "uq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/machinery/computer/atmos_control/noreconnect{ atmos_chambers = list("uo45o2"="Oxygen Supply"); dir = 1 }, /obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/obj/machinery/atmospherics/pipe/smart/manifold4w/green, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "ur" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible{ - dir = 9 - }, /obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/iron{ dir = 8 }, /area/awaymission/undergroundoutpost45/engineering) "us" = ( -/obj/structure/closet/firecloset, /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) "ut" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden{ - dir = 8 - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/atmospherics/pipe/layer_manifold/general/visible, /turf/open/floor/plating, /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 + dir = 1 }, /turf/open/floor/plating, /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, -/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, @@ -6962,7 +5534,6 @@ /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/crew_quarters) "uA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/computer/atmos_control/fixed{ atmos_chambers = list("uo45air"="Air Supply","uo45mix"="Mix Chamber","uo45n2"="Nitrogen Supply","uo45o2"="Oxygen Supply"); dir = 4; @@ -6975,20 +5546,15 @@ dir = 1 }, /area/awaymission/undergroundoutpost45/engineering) -"uB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) "uC" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - 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/awaymission/undergroundoutpost45/engineering) "uD" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, /obj/effect/decal/cleanable/dirt, @@ -7003,38 +5569,37 @@ name = "Security Office" }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "uG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /obj/machinery/door/airlock/engineering{ name = "Engineering" }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "uH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /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 }, +/obj/machinery/atmospherics/pipe/layer_manifold/orange, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /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, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/engineering) "uK" = ( @@ -7043,17 +5608,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/structure/closet/firecloset, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) "uL" = ( -/obj/machinery/atmospherics/components/binary/valve, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"uM" = ( -/obj/machinery/atmospherics/components/binary/valve, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) "uN" = ( @@ -7064,16 +5622,17 @@ /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) "uO" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) "uP" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -7095,14 +5654,14 @@ /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/crew_quarters) "uT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /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/awaymission/undergroundoutpost45/crew_quarters) "uU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/computer/atmos_control/fixed{ atmos_chambers = list("uo45waste","uo45distro"); dir = 4; @@ -7116,36 +5675,17 @@ }, /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, /area/awaymission/undergroundoutpost45/engineering) -"uW" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/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, /area/awaymission/undergroundoutpost45/engineering) @@ -7155,11 +5695,9 @@ 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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "vd" = ( @@ -7191,28 +5729,14 @@ /turf/open/floor/engine/o2, /area/awaymission/undergroundoutpost45/engineering) "vh" = ( -/obj/machinery/portable_atmospherics/scrubber, /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/obj/machinery/atmospherics/components/tank/air, /turf/open/floor/plating, /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, -/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 - }, +/obj/machinery/atmospherics/components/tank/air, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) "vk" = ( @@ -7247,20 +5771,19 @@ /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/crew_quarters) "vq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/turf_decal/tile/brown/anticorner/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/awaymission/undergroundoutpost45/crew_quarters) "vr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/structure/cable, /obj/effect/turf_decal/tile/brown/anticorner/contrasted, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) "vs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/computer/atmos_alert{ dir = 4 }, @@ -7275,43 +5798,39 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /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/awaymission/undergroundoutpost45/engineering) "vu" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - 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/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, /area/awaymission/undergroundoutpost45/engineering) "vw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 }, -/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) +/area/awaymission/undergroundoutpost45/central) "vx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, /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/awaymission/undergroundoutpost45/engineering) "vy" = ( @@ -7319,6 +5838,8 @@ /obj/effect/turf_decal/tile/yellow/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/awaymission/undergroundoutpost45/engineering) "vz" = ( @@ -7327,12 +5848,14 @@ }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, /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/awaymission/undergroundoutpost45/engineering) "vC" = ( /obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "vD" = ( @@ -7378,16 +5901,16 @@ /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" }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /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" }, @@ -7396,9 +5919,6 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/mining) "vP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, /obj/machinery/computer/station_alert{ dir = 4 }, @@ -7408,9 +5928,6 @@ /turf/open/floor/iron/checker, /area/awaymission/undergroundoutpost45/engineering) "vQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, /obj/structure/noticeboard{ dir = 1; pixel_y = -27 @@ -7419,33 +5936,21 @@ /turf/open/floor/iron, /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, -/area/awaymission/undergroundoutpost45/engineering) -"vS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 }, /turf/open/floor/iron, /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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /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/directional/south, /obj/effect/mapping_helpers/burnt_floor, @@ -7454,43 +5959,20 @@ }, /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/anticorner/contrasted, /turf/open/floor/iron, /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, /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, -/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, /area/awaymission/undergroundoutpost45/engineering) @@ -7506,23 +5988,14 @@ /turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/mining) "wd" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 2 }, /obj/structure/bed, /obj/item/bedsheet, /turf/open/floor/carpet, /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 @@ -7530,9 +6003,6 @@ /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 }, @@ -7540,27 +6010,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /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, -/area/awaymission/undergroundoutpost45/mining) -"wi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/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, -/area/awaymission/undergroundoutpost45/engineering) "wl" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -7570,49 +6019,41 @@ /turf/closed/wall/rust, /area/awaymission/undergroundoutpost45/engineering) "wp" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, /turf/open/floor/carpet, /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 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /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" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/mining) -"ws" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"wu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 +"wt" = ( +/obj/machinery/atmospherics/components/tank/air, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) "wv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/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/awaymission/undergroundoutpost45/mining) "ww" = ( @@ -7631,17 +6072,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/mining) -"wE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/iron, -/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, -/area/awaymission/undergroundoutpost45/mining) "wK" = ( /obj/machinery/door/airlock{ name = "Private Restroom" @@ -7659,38 +6089,26 @@ /turf/open/floor/carpet, /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 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /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, -/area/awaymission/undergroundoutpost45/mining) -"wP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - 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/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 = list("away_maintenance") @@ -7699,17 +6117,12 @@ /turf/open/floor/iron, /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/half/contrasted, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/mining) "xa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/effect/turf_decal/tile/brown/half/contrasted, @@ -7719,26 +6132,33 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, /obj/machinery/airalarm/directional/south, /obj/effect/mapping_helpers/airalarm/all_access, /obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) +"xd" = ( +/obj/machinery/meter{ + layer = 3.3 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/green, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/engineering) "xg" = ( /obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/door/airlock/mining{ name = "Processing Area" }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /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" }, @@ -7774,10 +6194,6 @@ }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/mining) -"xo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) "xr" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -7815,7 +6231,7 @@ /turf/closed/wall/rust, /area/awaymission/undergroundoutpost45/mining) "xy" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, /obj/machinery/light/blacklight/directional/west, @@ -7826,23 +6242,9 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/mining) -"xz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/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, -/area/awaymission/undergroundoutpost45/mining) "xB" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 2 }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -7877,41 +6279,22 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/mining) -"xG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/turf/open/floor/iron, -/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, /area/awaymission/undergroundoutpost45/mining) "xI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, /obj/machinery/door/airlock/mining/glass{ name = "Mining EVA" }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, /obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"xJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - 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/awaymission/undergroundoutpost45/mining) "xK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, /turf/open/floor/iron, @@ -7926,15 +6309,12 @@ /turf/closed/wall, /area/awaymission/undergroundoutpost45/mining) "xN" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, /turf/open/floor/iron, /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 @@ -7980,13 +6360,7 @@ }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/mining) -"xV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/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{ @@ -7998,29 +6372,25 @@ }, /area/awaymission/undergroundoutpost45/mining) "xX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/door/airlock/external/ruin{ name = "Mining External Airlock" }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, /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, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/mining) -"xY" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/mining) "ya" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/mining) "yb" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, /obj/effect/mapping_helpers/burnt_floor, @@ -8054,14 +6424,26 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/mining) "yh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/structure/chair{ dir = 8 }, /obj/effect/decal/cleanable/dirt, /obj/structure/sign/warning/no_smoking/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/gateway) +"yj" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/mining) +"yq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/gateway) "yN" = ( /obj/structure/chair/office/light{ dir = 1; @@ -8074,9 +6456,6 @@ /obj/machinery/airalarm/directional/north, /obj/effect/mapping_helpers/airalarm/all_access, /obj/machinery/light/small/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/purple{ dir = 4 }, @@ -8092,9 +6471,6 @@ }, /area/awaymission/undergroundoutpost45/caves) "ze" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6 - }, /obj/structure/table, /obj/item/stack/cable_coil, /obj/item/stack/cable_coil{ @@ -8116,9 +6492,9 @@ /obj/machinery/light/small/directional/east, /obj/machinery/airalarm/directional/east, /obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "zq" = ( @@ -8128,8 +6504,20 @@ temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) +"zr" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Central Access" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"zA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) "zG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/table, /obj/machinery/recharger{ pixel_y = 4 @@ -8143,6 +6531,10 @@ }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) +"zJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) "zK" = ( /obj/structure/alien/weeds, /obj/structure/bed/nest, @@ -8187,20 +6579,13 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "Ai" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/turf/open/misc/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) "Ap" = ( /obj/structure/table, /obj/machinery/airalarm/directional/north, /obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/item/hand_labeler, /obj/item/clothing/neck/stethoscope, /turf/open/floor/iron/white/side, @@ -8212,9 +6597,6 @@ }, /area/awaymission/undergroundoutpost45/crew_quarters) "AN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, /obj/structure/sign/warning/electric_shock/directional/south, /obj/machinery/vending/engivend, /obj/machinery/camera/directional/south{ @@ -8237,12 +6619,10 @@ /area/awaymission/undergroundoutpost45/central) "AZ" = ( /obj/machinery/light/blacklight/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 5 - }, /obj/machinery/airalarm/directional/south, /obj/effect/mapping_helpers/airalarm/all_access, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "Ba" = ( @@ -8262,27 +6642,30 @@ /obj/machinery/light/small/directional/north, /obj/machinery/airalarm/directional/north, /obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, /obj/structure/chair/wood{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/central) +"Bz" = ( +/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/awaymission/undergroundoutpost45/mining) "BI" = ( /obj/machinery/airalarm/directional/north, /obj/effect/mapping_helpers/airalarm/all_access, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, /obj/structure/cable, /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/awaymission/undergroundoutpost45/crew_quarters) "BL" = ( @@ -8322,14 +6705,6 @@ temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) -"Ce" = ( -/obj/machinery/light/small/directional/north, -/turf/open/misc/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/research) "Cj" = ( /obj/structure/table/reinforced, /obj/structure/window/reinforced/spawner/directional/north, @@ -8348,16 +6723,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/central) -"Cv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9 - }, -/turf/open/misc/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) "Cw" = ( /obj/structure/table, /obj/item/storage/medkit/regular{ @@ -8373,6 +6738,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/gateway) +"CD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) "CH" = ( /obj/structure/table/reinforced, /obj/item/paper_bin{ @@ -8384,6 +6753,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) +"CT" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/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/awaymission/undergroundoutpost45/engineering) "De" = ( /obj/machinery/computer/monitor{ name = "primary power monitoring console" @@ -8393,32 +6771,30 @@ /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/iron, /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, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"Dq" = ( -/obj/machinery/light/small/directional/west, -/turf/open/misc/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) +"Dt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/gateway) "Dz" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "DB" = ( @@ -8445,6 +6821,14 @@ temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) +"DL" = ( +/obj/effect/turf_decal/tile/green/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/awaymission/undergroundoutpost45/central) "DU" = ( /obj/structure/table/reinforced, /obj/item/storage/fancy/cigarettes{ @@ -8464,6 +6848,10 @@ }, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) +"Ec" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) "Ed" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -8516,9 +6904,10 @@ name = "Chief Engineer" }, /obj/effect/mapping_helpers/airlock/access/all/away/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/cable, /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, /area/awaymission/undergroundoutpost45/engineering) "Fw" = ( @@ -8526,35 +6915,14 @@ /obj/effect/mapping_helpers/airalarm/all_access, /turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/crew_quarters) -"Fx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1 - }, -/turf/open/misc/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - 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{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) "FA" = ( /obj/machinery/airalarm/directional/east, /obj/effect/mapping_helpers/airalarm/all_access, /obj/machinery/light/small/directional/east, /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/structure/cable, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) @@ -8563,16 +6931,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/central) -"Ga" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 4 - }, -/turf/open/misc/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) "Gc" = ( /obj/machinery/light/blacklight/directional/west, /obj/machinery/airalarm/directional/west, @@ -8585,7 +6943,6 @@ "Ge" = ( /obj/machinery/airalarm/directional/west, /obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/filingcabinet, /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/west, @@ -8614,6 +6971,7 @@ desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) "GI" = ( @@ -8621,8 +6979,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) +"Hp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"HA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) "HM" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/structure/bed{ dir = 4 }, @@ -8658,8 +7024,33 @@ /obj/machinery/light/small/directional/east, /obj/machinery/airalarm/directional/east, /obj/effect/mapping_helpers/airalarm/all_access, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/crew_quarters) +"Ij" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Central Access" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"Iw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/gateway) +"IH" = ( +/obj/machinery/door/airlock/external/ruin, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) "IK" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, @@ -8679,37 +7070,55 @@ temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) +"IV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) "IX" = ( /obj/machinery/airalarm/directional/north, /obj/effect/mapping_helpers/airalarm/all_access, /obj/machinery/light/small/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) "Ji" = ( /obj/machinery/airalarm/directional/north, /obj/effect/mapping_helpers/airalarm/all_access, -/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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/gateway) -"JD" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ +"Jm" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/brown{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"Jo" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"Jv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/awaymission/undergroundoutpost45/crew_quarters) +"JD" = ( +/obj/machinery/light/small/directional/west, /obj/machinery/airalarm/directional/west, /obj/effect/mapping_helpers/airalarm/all_access, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -8720,8 +7129,14 @@ "JJ" = ( /obj/machinery/airalarm/directional/east, /obj/effect/mapping_helpers/airalarm/all_access, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) +"JO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) "Km" = ( /obj/structure/table, /obj/item/storage/medkit/toxin{ @@ -8737,14 +7152,8 @@ dir = 1 }, /area/awaymission/undergroundoutpost45/research) -"Kt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) "KE" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, /turf/open/floor/circuit/telecomms/server, @@ -8758,6 +7167,22 @@ temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) +"KO" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id = "UO45_biohazard"; + name = "Biohazard Containment Door" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/research) +"KT" = ( +/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/awaymission/undergroundoutpost45/crew_quarters) "KU" = ( /obj/structure/closet/crate, /turf/open/misc/asteroid{ @@ -8776,6 +7201,8 @@ /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, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "KY" = ( @@ -8801,6 +7228,16 @@ temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) +"Lo" = ( +/obj/machinery/atmospherics/components/unary/passive_vent/layer2{ + dir = 4 + }, +/turf/open/misc/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + name = "Cave Floor"; + temperature = 363.9 + }, +/area/awaymission/undergroundoutpost45/caves) "Lz" = ( /turf/open/misc/asteroid{ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; @@ -8822,14 +7259,29 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/gateway) -"Mk" = ( -/obj/machinery/light/small/directional/south, -/turf/open/misc/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - name = "Cave Floor"; - temperature = 363.9 - }, +"LX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/gateway) +"LZ" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"Mg" = ( +/obj/effect/turf_decal/tile/purple{ + 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/awaymission/undergroundoutpost45/research) +"Mo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/research) "Mu" = ( /obj/machinery/door/window/right/directional/south{ name = "Bar Door"; @@ -8841,14 +7293,6 @@ /area/awaymission/undergroundoutpost45/crew_quarters) "Mx" = ( /obj/machinery/light/small/directional/east, -/turf/open/misc/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"MA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/open/misc/asteroid{ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; @@ -8862,14 +7306,12 @@ name = "Cave Floor"; temperature = 363.9 }, -/area/awaymission/undergroundoutpost45/mining) -"MW" = ( -/obj/machinery/light/small/directional/west, -/turf/open/misc/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - name = "Cave Floor"; - temperature = 363.9 - }, +/area/awaymission/undergroundoutpost45/caves) +"MJ" = ( +/obj/machinery/light/blacklight/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/awaymission/undergroundoutpost45/central) "Nd" = ( /obj/machinery/light/small/directional/west, @@ -8902,10 +7344,19 @@ id = "UO45_Engineering"; name = "Engineering Security Door" }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) +"Nr" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Diner" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) "NA" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -8945,22 +7396,6 @@ }, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"NT" = ( -/obj/machinery/light/small/directional/north, -/turf/open/misc/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/central) -"Oh" = ( -/obj/machinery/light/small/directional/north, -/turf/open/misc/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/gateway) "Oq" = ( /obj/machinery/light/small/directional/south, /obj/structure/bed{ @@ -8996,6 +7431,16 @@ temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) +"OL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/green, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"ON" = ( +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) "OO" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -9009,8 +7454,29 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) +"Pi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"Pw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"PB" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"Qb" = ( +/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/awaymission/undergroundoutpost45/gateway) "Qe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/machinery/airalarm/directional/east, /obj/effect/mapping_helpers/airalarm/all_access, /obj/effect/decal/cleanable/dirt, @@ -9020,9 +7486,6 @@ "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" @@ -9043,18 +7506,17 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/cable, /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, /area/awaymission/undergroundoutpost45/engineering) "Qs" = ( /obj/machinery/light/small/directional/north, /obj/machinery/airalarm/directional/north, /obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/central) "Qu" = ( @@ -9070,22 +7532,34 @@ temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) +"Qw" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) "QC" = ( /obj/machinery/airalarm/directional/east, /obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/gateway) "QG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/sign/warning/secure_area/directional/west, /obj/effect/turf_decal/tile/purple{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) +"QL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) "QX" = ( /obj/structure/table, /obj/item/storage/medkit/regular, @@ -9099,6 +7573,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/central) +"Rn" = ( +/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/awaymission/undergroundoutpost45/engineering) +"Ro" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) "Rx" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -9111,7 +7596,7 @@ name = "Cave Floor"; temperature = 363.9 }, -/area/awaymission/undergroundoutpost45/crew_quarters) +/area/awaymission/undergroundoutpost45/caves) "RC" = ( /obj/machinery/airalarm/directional/west, /obj/effect/mapping_helpers/airalarm/all_access, @@ -9126,9 +7611,6 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/research) "RF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, /obj/structure/sign/warning/secure_area/directional/east, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ @@ -9136,6 +7618,15 @@ }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) +"RN" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) "RX" = ( /obj/machinery/computer/atmos_alert{ dir = 1 @@ -9155,6 +7646,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) +"Sa" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"Sb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/gateway) "Sd" = ( /obj/machinery/airalarm/directional/west, /obj/effect/mapping_helpers/airalarm/all_access, @@ -9165,25 +7666,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/gateway) -"Sf" = ( -/obj/machinery/light/small/directional/south, -/turf/open/misc/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - 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{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/engineering) "Su" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -9201,14 +7683,23 @@ }, /area/awaymission/undergroundoutpost45/research) "SZ" = ( -/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/secure_area/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/gateway) +"Ta" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/gateway) +"Tf" = ( +/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, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) "Tr" = ( /obj/structure/alien/resin/membrane, /turf/open/misc/asteroid{ @@ -9218,8 +7709,8 @@ }, /area/awaymission/undergroundoutpost45/caves) "Tu" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 }, /obj/structure/sign/warning/secure_area/directional/south, /obj/effect/turf_decal/tile/yellow/anticorner/contrasted, @@ -9231,6 +7722,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/central) +"TE" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) "TP" = ( /obj/machinery/light/small/directional/north, /obj/machinery/airalarm/directional/north, @@ -9240,14 +7737,25 @@ }, /turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/crew_quarters) -"UG" = ( -/obj/machinery/light/small/directional/north, -/turf/open/misc/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - name = "Cave Floor"; - temperature = 363.9 - }, +"Ud" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) +"Ug" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"Ul" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"Us" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) "UH" = ( /obj/structure/alien/weeds, /obj/effect/decal/cleanable/blood/gibs/down, @@ -9267,11 +7775,25 @@ temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) -"VH" = ( -/obj/machinery/light/blacklight/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ +"UU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"Vo" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"VF" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"VH" = ( +/obj/machinery/light/blacklight/directional/north, /obj/machinery/airalarm/directional/north, /obj/effect/mapping_helpers/airalarm/all_access, /obj/effect/decal/cleanable/dirt, @@ -9280,6 +7802,8 @@ "VM" = ( /obj/machinery/airalarm/directional/north, /obj/effect/mapping_helpers/airalarm/all_access, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) "VR" = ( @@ -9288,25 +7812,28 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1 - }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/half/contrasted{ 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/awaymission/undergroundoutpost45/crew_quarters) "VX" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "Unfiltered to Mix" - }, /obj/structure/sign/warning/no_smoking/directional/east, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) +"Wa" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) "Wd" = ( /obj/structure/alien/resin/wall, /obj/structure/alien/weeds, @@ -9316,6 +7843,18 @@ temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) +"Wk" = ( +/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/awaymission/undergroundoutpost45/mining) +"Wn" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) "Wo" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -9326,6 +7865,11 @@ }, /turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/crew_quarters) +"WD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) "WE" = ( /obj/structure/glowshroom/single, /turf/open/misc/asteroid{ @@ -9334,18 +7878,31 @@ temperature = 351.9 }, /area/awaymission/undergroundoutpost45/caves) -"WQ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 +"WG" = ( +/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/awaymission/undergroundoutpost45/research) +"WQ" = ( /obj/structure/bed{ dir = 4 }, /obj/item/bedsheet{ dir = 4 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/crew_quarters) +"WR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) "WT" = ( /obj/structure/table/glass, /obj/item/stock_parts/servo, @@ -9359,6 +7916,20 @@ dir = 8 }, /area/awaymission/undergroundoutpost45/research) +"WU" = ( +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"Xd" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) "Xq" = ( /obj/structure/closet/firecloset, /obj/machinery/light/small/directional/south, @@ -9378,9 +7949,6 @@ "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" @@ -9403,6 +7971,10 @@ temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) +"XU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/gateway) "Yb" = ( /obj/structure/alien/weeds, /obj/structure/bed/nest, @@ -9413,6 +7985,11 @@ temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) +"Yf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) "Yk" = ( /obj/structure/table, /obj/item/computer_disk/ordnance, @@ -9429,6 +8006,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/central) +"YD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/green, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"YF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) "YK" = ( /obj/structure/chair/stool/directional/west, /obj/effect/turf_decal/tile/bar/opposingcorners, @@ -9445,7 +8030,7 @@ /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/mining) "YV" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, /obj/machinery/newscaster/directional/south, @@ -9461,7 +8046,7 @@ name = "Cave Floor"; temperature = 363.9 }, -/area/awaymission/undergroundoutpost45/mining) +/area/awaymission/undergroundoutpost45/caves) "ZD" = ( /obj/structure/alien/weeds, /obj/effect/decal/cleanable/blood/gibs/core, @@ -9474,17 +8059,17 @@ "ZH" = ( /obj/machinery/airalarm/directional/east, /obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/structure/chair{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/gateway) "ZM" = ( /obj/machinery/light/small/directional/south, /obj/machinery/airalarm/directional/south, /obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, /obj/structure/dresser, @@ -29163,12 +27748,12 @@ hu Su iu iP -ji -iP +cA +Qb ed -iP -iP -jI +Qb +Qb +cm mC gL ad @@ -29420,12 +28005,12 @@ LW LW iv iQ -jj +mb jI gv Cy lq -jI +cm mD gL ad @@ -29678,11 +28263,11 @@ gJ it iR jk -jI +yq gv gK Ji -iP +Qb mE gK ad @@ -29933,13 +28518,13 @@ gU gU gU gU -iS -jl +gU +gU gv gv kA -ji -mb +cA +XU mF gv ad @@ -30191,12 +28776,12 @@ hw ib ib iT -jm +LX gK Rx kB lt -mb +XU mG gw zq @@ -30447,12 +29032,12 @@ gW hx ZH yh -iU -jn +jy +UU gL Rx kC -ji +Qb mc mH gw @@ -30704,11 +29289,11 @@ gK gL gL gK -iV +gK jo gL gL -iV +gK kl gK gw @@ -30962,9 +29547,9 @@ hy id gK iW -jp +Sb jJ -kf +Ta SZ lv md @@ -31218,12 +29803,12 @@ gK hz ie ix -iX +md jq QC -kE -kE -lw +Dt +Dt +lv me gU zq @@ -31483,7 +30068,7 @@ kF lx gw gv -Oh +Zs zq zq zq @@ -32251,7 +30836,7 @@ zq zq gU kI -lz +ly gU zq zq @@ -32762,12 +31347,12 @@ zq zq zq zq -Mk +RA gw yR lA gw -Oh +Zs zq zq zq @@ -33021,7 +31606,7 @@ zq zq zq gU -kH +du ly gU zq @@ -33278,7 +31863,7 @@ zq zq zq gU -kK +du lB gU zq @@ -33535,7 +32120,7 @@ zq zq zq gU -kG +Iw ly gU zq @@ -34068,7 +32653,7 @@ gx gy gy gy -ad +gy ad ad ad @@ -34306,23 +32891,24 @@ hc gz gz kh -kM +ha lE mf -mJ -mJ -nM -nM +hc +hc +gz +gz pb pG -qf -qO +qX +tr ry -qO +tr tg -tK +gx us uK +wt vh gy ad @@ -34359,7 +32945,6 @@ ad ad ad ad -ad zq zq ad @@ -34561,28 +33146,28 @@ ig ze iY jr -jM -ki -kN +jO +mU +ha lF mg mK -nj -nN -ow +pG +tr +ry pc -pH -qg -pH -qg -qg -th +gz +hc +gz +hc +hc +tP tL ut -uL +Pi vi -gx -ad +Ec +gy ad ad ad @@ -34817,7 +33402,7 @@ hC ih iz iZ -js +kO jN kj kO @@ -34834,12 +33419,12 @@ Os qh gz nt -tM +gy uu -uM -vj -gx -ad +Pi +vi +Sa +gy ad ad ad @@ -35073,11 +33658,11 @@ gZ hD ii iA -ha -gX +YF +JO jO kk -kP +ha lH gy kd @@ -35090,11 +33675,12 @@ qi qQ rz gz -ti -tN -gy -gy +tS gx +QL +Wa +Wa +Pw gy ad ad @@ -35130,7 +33716,6 @@ ad ad ad ad -ad zq ad ad @@ -35347,13 +33932,13 @@ Gq qR Ea gz -nu -tN -uv -ad -ad -ad -ad +tP +gx +gy +gy +gy +gy +gy ad ad ad @@ -35585,27 +34170,27 @@ gy gN gX hF -kN +YF iC hc zq zq gz -kR +mU lJ mh mN nm Cj oy -mP +rZ pI qk qS rB hc -nu -tM +tP +gy gy ad ad @@ -35848,10 +34433,10 @@ hc zq zq hH -kS -lK -mi -mO +Jo +lM +mj +mP nn nQ oz @@ -36105,7 +34690,7 @@ gz zq zq hH -kR +Jo lL mj mP @@ -36118,7 +34703,7 @@ gx gz gz gz -tk +uL tP gy ad @@ -36354,7 +34939,7 @@ ad ad ad zq -jQ +MC zq zq zq @@ -36362,8 +34947,8 @@ zq zq zq hH -kR -lM +Jo +ON mj mQ mP @@ -36617,7 +35202,7 @@ zq zq zq zq -Sf +RA gz IX lN @@ -36876,7 +35461,7 @@ zq zq zq hH -kR +Mg lM hH mR @@ -36889,7 +35474,7 @@ gy gz rF gz -tn +gz tP gx ad @@ -37139,14 +35724,14 @@ hH mS np nU -oD +Mo pi -pK +gy qo qU rG sv -tn +gz tP gz ad @@ -37396,14 +35981,14 @@ hH mT nq nV -nV +WG lu -pL +gx Ap qV -rH +YF sw -to +gz tR gz zq @@ -37658,9 +36243,9 @@ hH gx qq ha -kP +YF sx -tn +gz tP hc zq @@ -37881,10 +36466,10 @@ aC cu cD cW -di -cq -cq -ee +bZ +bY +bY +bq aC ad ad @@ -37905,24 +36490,24 @@ zq gz gn kV -ha -mk -mk -mk -mk -mk +kZ +aL +aL +aL +aL +aL mk pM ha ha rI Km -tn +gz tS hc hc hc -Ce +Zs zq ad ad @@ -38138,7 +36723,7 @@ aC al bY cX -cm +bY ae ae ef @@ -38162,7 +36747,7 @@ zq gz iL kX -kX +VF kX mU nr @@ -38174,7 +36759,7 @@ qr qW rJ Cw -tp +hc tT gy uN @@ -38395,14 +36980,14 @@ aC cv cE cW -ce +al ae bf -eg +ey Ge zG eW -fo +ae fA fQ aC @@ -38419,7 +37004,7 @@ ad gz gz kY -kY +KO kY gz hc @@ -38431,9 +37016,9 @@ gz gz gz gz -tq -tU -uw +hc +tP +gc uO vk ah @@ -38646,20 +37231,20 @@ bi bs by bI -bO -ca -cp -cp +aC +bq +aC +aC cF -cY -cf -dv +cW +bq +ae dP eh -bL -bL +Ai +Wn eX -fm +an fB ZM aC @@ -38679,18 +37264,18 @@ gz lO gz gz -ns -nN -nj +pb +tr +pG rK -nN -nN +tr +tr qX rK -nN +tr tr tV -ux +gy uP hH ah @@ -38903,13 +37488,13 @@ bj AT aC aC -bP -cb -cq -ct -cG -cq -dk +aC +bq +bY +bq +al +bY +bq an dQ ei @@ -38933,20 +37518,20 @@ zq ad gy NR -ha +Us ml gx nt -nW -mJ -mJ -nM -mJ -mJ -mJ -mJ -nM -tW +gz +hc +hc +gz +hc +hc +hc +hc +gz +gz hc hc hc @@ -39160,8 +37745,8 @@ bi bu bz bJ -bQ -cc +aD +bq aC aC aC @@ -39190,11 +37775,11 @@ zq ad gx la -ha +Us Xq gy -nu -nX +tP +gz zq zq XQ @@ -39417,21 +38002,21 @@ aC bv aC aC -bQ -cd -cr +aD +bY +aD cw cH ae aF Gc -aS +IV ej -ey -ey +LZ +LZ eZ -bA -fE +MJ +IV fT aC ad @@ -39447,11 +38032,11 @@ XQ ad gy lb -ha +Us mn gy -nu -nY +tP +hc zq zq zq @@ -39674,21 +38259,21 @@ bk aS bA aF -bP -ce +aC +al aC Qs -cI +fB cZ -dl -dx -aS -aS -aS -aS -aS -aS -fE +gf +gf +zJ +zJ +zJ +zJ +zJ +zJ +Ai aS aC fO @@ -39708,7 +38293,7 @@ lO gy gx nv -nY +hc gr gr gr @@ -39927,25 +38512,25 @@ aO ax az aB -bl +Xd bw bB bK -bR -cf -cp +aC +bq +aC aU cJ ae aF -dy +IV dS ek ez eN fa fp -bL +Ai aS da gA @@ -39956,9 +38541,9 @@ hf gs gs iE -ja -jt -ng +Ug +ju +Ud kn lc lP @@ -39966,7 +38551,7 @@ QG mV nw JD -oF +nD pl gr gr @@ -40186,44 +38771,44 @@ ay aT bm aC -bC -aS -bQ -cg +fq +Ai +aD +br ae ae ae ae aS -aS +IV dT el el el el fq -fF -bL -ge -gl -gt -gA +Ai +aS +da gs +gt +WD +HA JJ -gA -gA -gA -gA -ju -gs -gs -ld +WD +WD +WD +WD +Ij +HA +HA +Ug lQ -gl -mW +gs +nG nx oa -ld +gs pm pN gr @@ -40443,23 +39028,23 @@ ba bg bn aC -bD -bL -bL -ch +fq +Ai +Ai +Ai cs -aI -aS -da -aS -aS +Ul +Ai +nj +Ai +IV dT el eA eB el fq -fE +Ai fU ae fK @@ -40473,14 +39058,14 @@ gr gg gg jR -gs -ld +Ro +Ug gA mp fN ny ob -ld +gs gs pO gr @@ -40700,30 +39285,30 @@ bb bg bo aC -bE -bM -bT -bM -aS -aS -aS -da -aS -aS +fq +zJ +zJ +zJ +zJ +zJ +zJ +zr +zJ +IV dT el eB eO el fq -fE +Ai fV ae zq zq zq zq -Dq +MC zq zq zq @@ -40957,23 +39542,23 @@ bc bg bm aC -bF -aF -bP -cg +fq +WR +aC +br aC aC aC aC dm -aS +IV dU el el el el fq -fE +Ai aF aP zq @@ -40987,7 +39572,7 @@ zq zq zq fK -gs +Ro lf fO fO @@ -41212,25 +39797,25 @@ aQ aY aY bh -bp -bp +vw +vw bG bN -bP -cj -cr +aC +bq +aD aZ cK aC dn -dz +IV dV em eC eC aY fr -fG +Ai fW aP zq @@ -41244,14 +39829,14 @@ zq zq zq gr -gA +KT gs fN mr mX -pS +fO oe -oI +zA po pQ qs @@ -41473,20 +40058,20 @@ aS bx bH aS -bQ -ck +aD +bZ aC Bq -cI +fB db -bM -dA +IV +IV dW -en -en -en -en -en +PB +PB +PB +PB +PB fH fX aP @@ -41501,7 +40086,7 @@ zq zq zq gr -gs +Ro gs fO EJ @@ -41730,9 +40315,9 @@ aP aC aC aD -bU -cl -co +aD +al +aD cB cL aC @@ -41758,7 +40343,7 @@ zq zq zq gg -gs +Ro lg fO mt @@ -41766,8 +40351,8 @@ km fO og oK -pp -pS +fN +fO fO fO gg @@ -41987,8 +40572,8 @@ ad ad ad ad -bP -cm +aC +bY aC aC aC @@ -42015,7 +40600,7 @@ gr fK gg gg -kp +Nr kp fN fN @@ -42244,14 +40829,14 @@ ad ad ad ad -bP +aC cn -ct -cG -ct +bq +al +bq dc aD -bd +aP dZ aS aP @@ -42272,14 +40857,14 @@ iF Nd jv jS -hK +TE hK fN mu HM -pS +fO oi -oI +zA pq pU Fw @@ -42501,12 +41086,12 @@ ad ad ad ad -bV -co -cp -cp -cM -cm +aC +aD +aC +aC +bq +bY aD dC ea @@ -42529,14 +41114,14 @@ hJ hK jw jT -hK +TE iH fO TP mY nC of -oM +oG fO fN fO @@ -42762,11 +41347,11 @@ ad ad ad ae -cN -dd -dp +bq +bZ +aC dD -bM +IV ep aS aS @@ -42786,7 +41371,7 @@ hK iH hK hJ -hK +TE hK fO ev @@ -43019,8 +41604,8 @@ ad ad ad ae -cN -de +bq +aC aC KW eb @@ -43043,14 +41628,14 @@ in YK iH jU -kq +TE lh fO fN fN fO ok -oO +pm fN pW fO @@ -43276,8 +41861,8 @@ ad ad ad ae -cN -de +bq +aC Cr dF aF @@ -43301,13 +41886,13 @@ hl hl hL iH -li +TE lS fN nc nD -ol -oP +oi +gA pr pX Ac @@ -43533,8 +42118,8 @@ ad ad Lz an -cN -de +bq +aC Yn dG eb @@ -43558,11 +42143,11 @@ hK jx hL hK -li +TE lT fO nd -gA +ai om oJ fO @@ -43790,8 +42375,8 @@ ad Lz WE ae -cN -df +bq +aD IK dH aS @@ -43800,7 +42385,7 @@ aS aS fg an -NT +Zs zq zq zq @@ -43815,12 +42400,12 @@ hK Mu hK kr -li +TE hJ fO ne -nE -on +gs +of oQ fO fN @@ -43834,11 +42419,11 @@ uy uR vo vL -we +vK wr vL wO -we +vK vK xl YM @@ -44047,8 +42632,8 @@ WE Lz Lz an -cN -de +bq +aC Rb dG eb @@ -44071,7 +42656,7 @@ iH jc jz hK -ks +Vo lj lU fN @@ -44092,9 +42677,9 @@ uS vp vM wf -ws +Bz Ba -wu +wv wX vK xm @@ -44304,8 +42889,8 @@ Lz Lz Lz an -cO -df +al +aD FS dI aS @@ -44328,7 +42913,7 @@ iI fO fO jV -ks +hK xc fO fO @@ -44349,9 +42934,9 @@ fO fN vK wg -wu +wv wD -wP +Wk sj vL xn @@ -44561,8 +43146,8 @@ Lz Lz Lz aP -cP -df +bY +aD aC dJ eb @@ -44585,38 +43170,38 @@ iJ jd fO jW -kt -ll -lV +hK +RN +kp mx -ng -nH -oq -oS +gA +gs +of +KT pt -ja -ja +Ro +Ro re rN -ng +Ud tt tZ tZ uT vq vN -wh -wu -wE -wu +Bz +wv +Wk +wv wZ xg -xo -xo -wu -xG -wh -xV +wv +wv +wv +wv +Bz +Bz xX ya yd @@ -44818,9 +43403,9 @@ ad WE Lz aP -cQ -dg -co +bq +cX +aD dK ec eq @@ -44847,7 +43432,7 @@ lm lW my my -nI +my or FA my @@ -44857,24 +43442,24 @@ rf rO sD tu -ua +Jm ua ua vr vO -wi -wv -wF -wF +xH +xH +wD +wD xa xh Qe -wv -xz xH +xH +Wk xP xW -xY +yj yb ye ww @@ -45075,13 +43660,13 @@ ad Lz Lz an -cR -cc +bZ +bq aC -dL -dB -dB -dB +WU +DL +DL +DL eT fl fw @@ -45096,8 +43681,8 @@ hr hS iq gO -gO -jB +Jv +fO jY fO fK @@ -45127,7 +43712,7 @@ vI vI vJ ww -xA +ww xI ww vI @@ -45333,7 +43918,7 @@ Lz Lz an cS -ce +al aC zX EP @@ -45351,11 +43936,11 @@ gF gO gO hT -gO -gO +Jv +Jv dO -jB -jZ +fO +fy kv ae zq @@ -45363,7 +43948,7 @@ zq zq zq zq -Dq +MC zq zq zq @@ -45385,7 +43970,7 @@ ad vJ xu xB -xJ +fP xQ vI zq @@ -45590,7 +44175,7 @@ WE Lz an cT -cc +bq aC aC aC @@ -45611,7 +44196,7 @@ hU ir Ar jf -jC +fN ka kw an @@ -45625,7 +44210,7 @@ zq zq zq gr -rR +rQ sG gr zq @@ -45847,28 +44432,28 @@ Lz Lz ae cU -dh -cq +bq +bY dN -cG -ct -eF -ct -ct +al +bq +Hp +Hp +Hp fz -gQ +jD +gb gb -gj gp fO fN fN fN -hV +gr fO fN fO -jC +fN kb kx an @@ -46103,25 +44688,25 @@ ad ad ad ae -cV -cp -co -co -cp -es -eG -cp -fm -fm -fm -gc -dh +aD +aC +aD +aD +aC +aC +IH +aC +an +an +an +ae +bq gq gb gH -gQ +jD +gb gb -hW gH iM gb @@ -46142,7 +44727,7 @@ gg BI sH gg -UG +Zs zq zq zq @@ -46371,18 +44956,18 @@ eV an zq zq -gd -fm -fm -fm -dv -dv -fm -hX -fm -fm -fm -jE +ae +an +an +an +ae +ae +an +aP +an +an +an +ae an ae zq @@ -46397,7 +44982,7 @@ zq zq gr rQ -sF +Tf gr zq zq @@ -46636,7 +45221,8 @@ zq zq zq zq -MW +MC +zq zq zq zq @@ -46651,12 +45237,11 @@ zq zq zq zq -Ga gr rU -sI +Tf gr -Ga +zq zq zq zq @@ -46882,7 +45467,8 @@ ad ah ah ah -MW +MC +zq zq zq zq @@ -46908,12 +45494,11 @@ zq zq zq zq -Fx -rg +gr rV sJ -rg -Cv +gr +zq zq zq zq @@ -47163,9 +45748,9 @@ zq zq zq zq -Fy -MA -Cv +zq +zq +zq fK rW sK @@ -47420,7 +46005,7 @@ zq zq zq zq -Ai +zq ni ni ln @@ -47677,14 +46262,14 @@ zq zq zq zq -Ai +zq ni qC rh rY -sM +Yf tv -uc +ln uA uU vs @@ -47934,15 +46519,15 @@ zq zq zq zq -Ai +zq qb qD ri -rZ -sM +Qw +Yf tw -ud -uB +ln +rj uV rj vQ @@ -48191,19 +46776,19 @@ zq zq zq zq -Ai +zq qb qD rj -sa -sN +vv +uC tx ue uC -uW +vT vt vR -wk +wl Dm Ae Gp @@ -48448,7 +47033,7 @@ zq zq zq zq -Sh +RA ni ln rk @@ -48457,9 +47042,9 @@ sO Tu ln uD -sM +rj vu -vS +rj wl Dz KY @@ -48705,7 +47290,7 @@ zq zq zq zq -Ai +zq zq ni ni @@ -48715,11 +47300,11 @@ ln ln uE VH -vv +CT vT Fd Qo -Kt +eu zn YV ln @@ -48962,7 +47547,7 @@ ad ad zq zq -Ai +zq zq ni rl @@ -48971,8 +47556,8 @@ sQ tz uf qb -sM -vw +rj +Rn AN wn uE @@ -49219,16 +47804,16 @@ ad ad ad ad -Ai +zq zq ni rm -se -sR -tA +rj +CD +CD ug uF -sR +Yf vx vV uE @@ -49476,8 +48061,8 @@ ad ad ad ad -px -ad +wn +Lo ln rn sf @@ -49733,18 +48318,18 @@ ln ni ni ln -py ln +fv +fv ln -ro -sg +sT sT sT ln ln -uZ +uE vz -vX +uE ni ad ad @@ -49995,12 +48580,12 @@ qb De rp sh -sU +tG tC -ui +qN ln va -mL +Rn vY ln ad @@ -50247,17 +48832,17 @@ ln nK ot oV -pA +pC qb qF mL qH -sV -tD +mL +uj uj uG vb -mL +Rn vZ ln ad @@ -50504,18 +49089,18 @@ nh nK ou oW -pB +pC qc -qG -pj -rq -sW +uj +so +tE +CD tE uk uH No vC -wa +vZ ni ad ad @@ -50764,9 +49349,9 @@ oV pC qb mw -mZ -sk -sX +tG +tE +rj tF AZ ln @@ -51021,9 +49606,9 @@ oY pD qb qI -rt -sl -sY +rj +tE +rj tG um uI @@ -51278,10 +49863,10 @@ ln ni ln qJ -ru -sm -sZ -tH +rj +tE +rj +tb un uJ ve @@ -51537,8 +50122,8 @@ qd qK rv sn -rt -rj +tb +tb uo ni ln @@ -51794,7 +50379,7 @@ qe qL rw so -ta +rj rj up uI @@ -52048,13 +50633,13 @@ ln ln ln ln -qM rx -so -tb +rx +OL +YD tI uq -uJ +xd vg vG ln diff --git a/_maps/gateway_test.json b/_maps/gateway_test.json new file mode 100644 index 0000000000000..5f4f8eec8a9c8 --- /dev/null +++ b/_maps/gateway_test.json @@ -0,0 +1,15 @@ +{ + "version": 1, + "map_name": "Gateway Test", + "map_path": "map_files/debug", + "map_file": "gateway_test.dmm", + "space_ruin_levels": 1, + "load_all_away_missions": true, + "ignored_unit_tests": [ + "/datum/unit_test/antag_moodlets", + "/datum/unit_test/job_roundstart_spawnpoints", + "/datum/unit_test/required_map_items", + "/datum/unit_test/space_dragon_expiration", + "/datum/unit_test/traitor" + ] +} diff --git a/_maps/icebox.json b/_maps/icebox.json index 95a7d7e03d6ae..2f11d13e7eaa1 100644 --- a/_maps/icebox.json +++ b/_maps/icebox.json @@ -14,7 +14,7 @@ }, "traits": [ { - "Up": 1, + "Up": true, "Mining": true, "Linkage": null, "Gravity": true, @@ -23,8 +23,8 @@ "No Parallax": true }, { - "Down": -1, - "Up": 1, + "Down": true, + "Up": true, "Mining": true, "Linkage": null, "Gravity": true, @@ -33,7 +33,7 @@ "No Parallax": true }, { - "Down": -1, + "Down": true, "Mining": true, "Linkage": null, "Gravity": true, diff --git a/_maps/map_files/Basketball/ass_blast_usa.dmm b/_maps/map_files/Basketball/ass_blast_usa.dmm index d4d7a435ebebe..4b3354ba6495d 100644 --- a/_maps/map_files/Basketball/ass_blast_usa.dmm +++ b/_maps/map_files/Basketball/ass_blast_usa.dmm @@ -27,7 +27,7 @@ /area/centcom/basketball) "cz" = ( /obj/structure/rack, -/obj/item/gun/ballistic/automatic/sniper_rifle, +/obj/item/gun/ballistic/rifle/sniper_rifle, /turf/open/floor/iron/dark, /area/centcom/basketball) "dr" = ( diff --git a/_maps/map_files/Basketball/beach_bums.dmm b/_maps/map_files/Basketball/beach_bums.dmm index 06ea708405433..aa5948a34e6d2 100644 --- a/_maps/map_files/Basketball/beach_bums.dmm +++ b/_maps/map_files/Basketball/beach_bums.dmm @@ -214,7 +214,7 @@ }, /area/centcom/basketball) "yY" = ( -/mob/living/simple_animal/crab, +/mob/living/basic/crab, /turf/open/misc/beach/sand, /area/centcom/basketball) "zk" = ( @@ -313,7 +313,7 @@ /turf/open/water/beach, /area/centcom/basketball) "Fy" = ( -/mob/living/simple_animal/crab/kreb, +/mob/living/basic/crab/kreb, /turf/open/misc/beach/sand, /area/centcom/basketball) "FS" = ( diff --git a/_maps/map_files/Basketball/greytide_worldwide.dmm b/_maps/map_files/Basketball/greytide_worldwide.dmm index bffda0d409d69..b104d189891e7 100644 --- a/_maps/map_files/Basketball/greytide_worldwide.dmm +++ b/_maps/map_files/Basketball/greytide_worldwide.dmm @@ -628,7 +628,7 @@ /turf/open/floor/plating, /area/centcom/basketball) "Tc" = ( -/obj/structure/closet/mini_fridge, +/obj/structure/closet/mini_fridge/grimy, /turf/open/floor/plating, /area/centcom/basketball) "Tl" = ( diff --git a/_maps/map_files/Basketball/soviet_bear.dmm b/_maps/map_files/Basketball/soviet_bear.dmm index c4cf94ba0a4ab..b034f0c33c881 100644 --- a/_maps/map_files/Basketball/soviet_bear.dmm +++ b/_maps/map_files/Basketball/soviet_bear.dmm @@ -6,9 +6,9 @@ /area/centcom/basketball) "aw" = ( /obj/structure/table, -/obj/item/ammo_box/a762, -/obj/item/ammo_box/a762, -/obj/item/ammo_box/a762, +/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/strilka310, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -154,9 +154,7 @@ /turf/open/floor/iron/dark/small, /area/centcom/basketball) "kT" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, +/obj/item/kirbyplants/organic/plant22, /turf/open/floor/iron/dark, /area/centcom/basketball) "ly" = ( @@ -355,9 +353,9 @@ /area/centcom/basketball) "Bd" = ( /obj/structure/table, -/obj/item/ammo_box/a762, -/obj/item/ammo_box/a762, -/obj/item/ammo_box/a762, +/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/strilka310, /turf/open/floor/iron/dark, /area/centcom/basketball) "BJ" = ( @@ -494,9 +492,7 @@ /turf/open/floor/iron/dark/small, /area/centcom/basketball) "LV" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, +/obj/item/kirbyplants/organic/plant22, /obj/structure/sign/poster/random/directional/west, /turf/open/floor/iron, /area/centcom/basketball) @@ -539,14 +535,14 @@ /turf/open/floor/iron/dark/small, /area/centcom/basketball) "Om" = ( -/mob/living/simple_animal/hostile/bear/fightpit, +/mob/living/basic/bear/fightpit, /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/engine, /area/centcom/basketball) "OB" = ( -/mob/living/simple_animal/hostile/bear/fightpit, +/mob/living/basic/bear/fightpit, /turf/open/floor/engine, /area/centcom/basketball) "PU" = ( @@ -585,9 +581,7 @@ /turf/closed/indestructible/fakeglass, /area/centcom/basketball) "Ql" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, +/obj/item/kirbyplants/organic/plant22, /obj/structure/sign/poster/random/directional/east, /turf/open/floor/iron, /area/centcom/basketball) diff --git a/_maps/map_files/Basketball/stadium.dmm b/_maps/map_files/Basketball/stadium.dmm index 5b82f0be01c75..bcbb91ce4b7ef 100644 --- a/_maps/map_files/Basketball/stadium.dmm +++ b/_maps/map_files/Basketball/stadium.dmm @@ -98,8 +98,7 @@ /turf/open/floor/wood, /area/centcom/basketball) "fi" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21"; +/obj/item/kirbyplants/organic/plant21{ pixel_x = -3; pixel_y = 3 }, diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index 9bb20d84ddd5a..052aee9740c27 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -46,6 +46,10 @@ }, /turf/open/floor/iron, /area/station/security/tram) +"ach" = ( +/obj/machinery/netpod, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/bitrunning/den) "acl" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/decal/cleanable/dirt, @@ -104,6 +108,13 @@ /obj/machinery/camera/directional/east, /turf/open/floor/iron, /area/station/service/janitor) +"adl" = ( +/obj/effect/turf_decal/siding/white, +/obj/machinery/light/small/directional/south, +/obj/structure/table/reinforced, +/obj/item/surgery_tray/full/morgue, +/turf/open/floor/iron/small, +/area/station/medical/morgue) "adB" = ( /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, @@ -145,6 +156,23 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/rust, /area/station/engineering/atmos/project) +"aen" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 10 + }, +/obj/machinery/atmospherics/components/binary/pump/on/layer2{ + dir = 1 + }, +/obj/item/radio/intercom/prison/directional/west, +/turf/open/floor/iron/cafeteria, +/area/station/security/prison) "aeq" = ( /obj/structure/flora/bush/flowers_yw/style_random, /obj/structure/flora/bush/flowers_br/style_random, @@ -177,6 +205,18 @@ /obj/machinery/power/floodlight, /turf/open/floor/plating, /area/station/engineering/atmos/project) +"aeD" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/computer/scan_consolenew{ + dir = 4 + }, +/obj/effect/turf_decal/siding/purple{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/science/genetics) "aeF" = ( /obj/machinery/atmospherics/components/tank/air{ dir = 4 @@ -280,6 +320,20 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos/project) +"agy" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/tank/oxygen{ + dir = 4 + }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/plating, +/area/station/science/ordnance/storage) +"agC" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/structure/sign/departments/vault/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/spacebridge) "agD" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -307,6 +361,24 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/engineering/atmos/project) +"agV" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/white/warning{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/white/warning{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/white/mid_joiner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/white/mid_joiner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/station/commons/fitness/recreation) "agY" = ( /obj/effect/turf_decal/stripes, /obj/machinery/airalarm/directional/south, @@ -354,11 +426,6 @@ /obj/effect/turf_decal/siding/yellow, /turf/open/floor/wood/tile, /area/station/command/bridge) -"aia" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/security/interrogation) "aid" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -382,6 +449,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"aiI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/easel, +/obj/item/canvas/twentythree_twentythree, +/obj/item/canvas/twentythree_twentythree, +/turf/open/floor/iron, +/area/station/commons/storage/art) "aiJ" = ( /obj/machinery/door/airlock/external/glass, /obj/effect/mapping_helpers/airlock/cyclelink_helper, @@ -403,15 +477,6 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos/project) -"aiV" = ( -/obj/machinery/portable_atmospherics/canister, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/science/xenobiology) "ajg" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, @@ -458,16 +523,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/engineering/atmos/project) -"ajV" = ( -/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/item/kirbyplants/random, -/turf/open/floor/iron, -/area/station/hallway/secondary/dock) "akt" = ( /obj/structure/table/wood, /obj/item/clothing/mask/gas/owl_mask, @@ -483,6 +538,16 @@ }, /turf/open/floor/iron, /area/station/security) +"akY" = ( +/obj/machinery/door/airlock{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/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/rust, +/area/station/maintenance/fore/greater) "akZ" = ( /turf/closed/mineral/random/stationside, /area/space) @@ -493,14 +558,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"alc" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer, -/obj/effect/turf_decal/stripes, -/obj/machinery/light/cold/directional/east, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/white/small, -/area/station/medical/cryo) "alg" = ( /obj/structure/altar_of_gods, /obj/item/book/bible, @@ -534,6 +591,18 @@ /obj/structure/marker_beacon/jade, /turf/open/space/basic, /area/space/nearstation) +"alF" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/camera/autoname/directional/east, +/obj/machinery/status_display/ai/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "alJ" = ( /obj/structure/cable, /turf/open/floor/iron/small, @@ -546,11 +615,11 @@ /obj/structure/railing/corner, /turf/open/space/basic, /area/space/nearstation) -"alT" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/security/tram) +"alV" = ( +/obj/structure/cable, +/obj/machinery/power/apc/worn_out/directional/west, +/turf/open/floor/iron, +/area/station/maintenance/hallway/abandoned_recreation) "amp" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, @@ -613,11 +682,6 @@ }, /turf/open/floor/wood/tile, /area/station/command/bridge) -"anh" = ( -/obj/structure/cable, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/circuit, -/area/station/tcommsat/server) "ani" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -638,14 +702,6 @@ }, /turf/open/space/basic, /area/space/nearstation) -"anz" = ( -/obj/structure/table/reinforced/titaniumglass, -/obj/item/flashlight/lamp, -/turf/open/floor/iron/small, -/area/station/engineering/supermatter/room) -"anH" = ( -/turf/open/floor/iron/dark/herringbone, -/area/station/security/execution/education) "anJ" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 8 @@ -733,13 +789,6 @@ /obj/effect/turf_decal/siding/wideplating/dark, /turf/open/floor/iron, /area/station/security) -"apy" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/dim/directional/south, -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/kitchen/small, -/area/station/security/prison/mess) "apB" = ( /obj/structure/disposalpipe/junction{ dir = 4 @@ -751,13 +800,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/science/lab) -"apZ" = ( -/obj/structure/table, -/obj/item/wirecutters, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron, -/area/station/engineering/storage/tech) "aqr" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -767,14 +809,6 @@ }, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) -"aqw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/cold/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "aqU" = ( /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ @@ -785,9 +819,12 @@ /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) "aqV" = ( -/obj/structure/chair/sofa/bench/left, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) +/obj/machinery/door/airlock/glass, +/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/plating, +/area/station/maintenance/starboard/greater) "aqW" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/sofa/bench/right{ @@ -823,6 +860,18 @@ /obj/machinery/meter, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) +"arB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1 + }, +/turf/open/floor/iron/white/side{ + dir = 8 + }, +/area/station/science/xenobiology) "arJ" = ( /obj/structure/table/reinforced/titaniumglass, /obj/item/storage/toolbox/mechanical{ @@ -886,12 +935,40 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos/project) +"asN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/multi_tile/public/glass{ + name = "Diner" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/textured_half, +/area/station/service/cafeteria) +"asZ" = ( +/obj/structure/disposalpipe/trunk, +/obj/structure/disposaloutlet{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/stripes/box, +/turf/open/floor/plating, +/area/station/service/janitor) +"ata" = ( +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/machinery/light/small/directional/west, +/turf/open/misc/sandy_dirt, +/area/station/hallway/secondary/recreation) "ate" = ( /turf/closed/indestructible/riveted{ desc = "A wall impregnated with Fixium, able to withstand massive explosions with ease"; name = "hyper-reinforced wall" }, /area/station/science/ordnance/bomb) +"ati" = ( +/obj/machinery/hydroponics/soil, +/turf/open/misc/sandy_dirt, +/area/station/science/cytology) "atm" = ( /obj/structure/table, /obj/item/stack/spacecash/c1{ @@ -998,6 +1075,24 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/engine) +"avN" = ( +/obj/structure/table/glass, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/north, +/obj/item/food/pizzaslice/moldy/bacteria{ + pixel_x = -4; + pixel_y = 2 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) +"avU" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/obj/machinery/chem_mass_spec, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/medical/pharmacy) "awi" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/plastic{ @@ -1010,6 +1105,18 @@ /obj/effect/turf_decal/tile/blue/half, /turf/open/floor/iron/white/small, /area/station/service/hydroponics) +"awE" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + 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/mapping_helpers/mail_sorting/science/xenobiology, +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/white/side, +/area/station/science/lower) "awL" = ( /obj/structure/chair{ dir = 4 @@ -1038,6 +1145,10 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/misc/sandy_dirt, /area/station/hallway/secondary/entry) +"axj" = ( +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron, +/area/station/cargo/storage) "axq" = ( /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) @@ -1045,23 +1156,6 @@ /obj/item/bodypart/arm/left, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) -"axz" = ( -/obj/machinery/light/directional/north, -/obj/structure/window/spawner/directional/east, -/obj/structure/table/wood, -/obj/machinery/cell_charger{ - pixel_y = 5 - }, -/obj/item/stock_parts/cell/crap{ - pixel_y = 5 - }, -/obj/item/clothing/mask/cigarette/pipe/cobpipe{ - pixel_x = 1; - pixel_y = -2 - }, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/wood/tile, -/area/station/command/corporate_showroom) "axN" = ( /obj/machinery/sparker/directional/north{ id = "Xenobio" @@ -1072,10 +1166,8 @@ /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 }, -/obj/structure/bed/pod{ - desc = "An old medical bed, just waiting for replacement with something up to date."; - dir = 4; - name = "medical bed" +/obj/structure/bed/medical{ + dir = 8 }, /obj/machinery/iv_drip, /obj/effect/turf_decal/trimline/blue/corner{ @@ -1090,6 +1182,19 @@ "ayi" = ( /turf/closed/wall, /area/station/engineering/atmos/project) +"ayn" = ( +/obj/item/kirbyplants/organic/applebush, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "ays" = ( /obj/effect/turf_decal/stripes/white/line, /obj/structure/frame/machine, @@ -1110,17 +1215,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) -"aza" = ( -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/turf_decal/siding/wideplating{ - dir = 4 - }, -/obj/machinery/light/floor{ - pixel_x = 32 - }, -/turf/open/misc/sandy_dirt, -/area/station/security/tram) "azh" = ( /obj/structure/chair{ dir = 8 @@ -1130,6 +1224,17 @@ }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) +"azm" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/item/kirbyplants/organic/applebush, +/obj/machinery/firealarm/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/diagonal, +/area/station/command/heads_quarters/hop) "azq" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -1146,9 +1251,45 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/engine) +"azv" = ( +/obj/machinery/teleport/station, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/button/door/directional/north{ + id = "teleporterhubshutters"; + name = "Teleporter Shutters"; + pixel_x = 24; + pixel_y = 0; + req_access = list("command") + }, +/turf/open/floor/plating, +/area/station/command/teleporter) "azz" = ( /turf/open/floor/iron, /area/station/security/prison/workout) +"azJ" = ( +/obj/item/kirbyplants/organic/applebush, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood/large, +/area/station/command/corporate_suite) +"azK" = ( +/obj/effect/turf_decal/siding/red, +/obj/item/kirbyplants/random, +/obj/item/storage/toolbox/mechanical, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron, +/area/station/cargo/storage) +"azN" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 1 + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/dark/herringbone, +/area/station/security/courtroom) "aAt" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 10 @@ -1158,15 +1299,6 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter) -"aAw" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 8 - }, -/obj/machinery/light/cold/directional/north, -/obj/machinery/firealarm/directional/east, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/lobby) "aAD" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -1197,6 +1329,25 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/smooth, /area/station/engineering/engine_smes) +"aBu" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/structure/bookcase/random/nonfiction, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood/tile, +/area/station/science/lower) +"aBv" = ( +/obj/effect/turf_decal/siding/white{ + dir = 9 + }, +/obj/structure/bodycontainer/morgue/beeper_off{ + dir = 2 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/turf/open/floor/iron/small, +/area/station/medical/morgue) "aBy" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1242,12 +1393,9 @@ }, /turf/open/floor/iron, /area/station/engineering/storage/tech) -"aCG" = ( -/obj/structure/flora/bush/flowers_yw/style_random, -/turf/open/misc/sandy_dirt, -/area/station/hallway/secondary/recreation) "aCM" = ( /obj/effect/spawner/random/structure/crate_abandoned, +/obj/structure/alien/weeds, /turf/open/misc/asteroid, /area/station/maintenance/starboard/greater) "aCO" = ( @@ -1278,30 +1426,6 @@ }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) -"aDk" = ( -/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, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/effect/turf_decal/siding/green{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/station/science/circuits) -"aDA" = ( -/obj/machinery/firealarm/directional/north, -/obj/machinery/light/directional/north, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "aEc" = ( /obj/structure/disposalpipe/trunk{ dir = 1 @@ -1311,6 +1435,17 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/smooth, /area/station/command/bridge) +"aEl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/landmark/navigate_destination/teleporter, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "aEA" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/decal/cleanable/dirt, @@ -1347,13 +1482,6 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) -"aFq" = ( -/obj/effect/turf_decal/tile/dark_red/anticorner/contrasted{ - dir = 1 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/smooth, -/area/station/security/checkpoint/escape) "aFt" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -1375,6 +1503,15 @@ "aFR" = ( /turf/open/floor/plating, /area/station/security/tram) +"aFY" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/stairs{ + dir = 8 + }, +/area/station/science/xenobiology) "aGa" = ( /obj/structure/lattice/catwalk, /obj/structure/marker_beacon/fuchsia, @@ -1386,10 +1523,28 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/glass, /area/station/command/heads_quarters/rd) +"aGy" = ( +/obj/structure/flora/bush/large/style_random{ + pixel_y = -3 + }, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/light/floor{ + pixel_x = -32 + }, +/obj/effect/turf_decal/siding/wideplating{ + dir = 8 + }, +/turf/open/misc/sandy_dirt, +/area/station/security/tram) "aGF" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /turf/open/space/basic, /area/space/nearstation) +"aGU" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) "aHc" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -1397,18 +1552,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) -"aHh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/west{ - c_tag = "Xenobiology - Cell 4"; - network = list("ss13","rd","xeno") - }, -/obj/effect/turf_decal/box/red/corners, -/obj/effect/turf_decal/stripes/white/line{ - dir = 6 - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "aHq" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, @@ -1443,6 +1586,12 @@ dir = 9 }, /area/station/engineering/atmos) +"aIu" = ( +/obj/structure/bookcase/random/reference, +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/white/small, +/area/station/medical/psychology) "aIH" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1512,6 +1661,10 @@ }, /turf/open/floor/iron/small, /area/station/maintenance/port/lesser) +"aJN" = ( +/obj/structure/window/reinforced/shuttle, +/turf/open/floor/plating, +/area/station/commons/fitness/recreation/entertainment) "aJX" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock{ @@ -1520,6 +1673,20 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/auxiliary) +"aJZ" = ( +/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{ + name = "Auxillary Base Construction" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/aux_base, +/obj/machinery/door/firedoor, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/iron/textured_half{ + dir = 8 + }, +/area/station/construction/mining/aux_base) "aKm" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/power/terminal, @@ -1530,6 +1697,10 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/engineering/engine_smes) +"aKx" = ( +/obj/machinery/holopad, +/turf/open/floor/iron/dark/small, +/area/station/tcommsat/server) "aKG" = ( /obj/machinery/power/terminal, /obj/effect/turf_decal/stripes/line{ @@ -1554,7 +1725,6 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, -/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /obj/effect/mapping_helpers/airlock/unres{ dir = 4 }, @@ -1566,20 +1736,35 @@ }, /turf/open/floor/iron/small, /area/station/engineering/engine_smes) -"aLe" = ( -/obj/machinery/modular_computer/console/preset/engineering{ - dir = 8 +"aLg" = ( +/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/small, -/area/station/engineering/engine_smes) +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/cafeteria, +/area/station/science/breakroom) "aLh" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/maintenance/aft) +"aLk" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/dark_red{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/machinery/recharger{ + pixel_x = -6; + pixel_y = 2 + }, +/obj/item/storage/box/teargas{ + pixel_x = 8; + pixel_y = 6 + }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/dark/small, +/area/station/ai_monitored/security/armory) "aLr" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -1626,6 +1811,7 @@ /area/station/engineering/break_room) "aMy" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/visible, /turf/open/floor/plating, /area/station/science/ordnance/testlab) "aME" = ( @@ -1658,36 +1844,6 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/dark/small, /area/station/medical/storage) -"aNB" = ( -/obj/machinery/power/smes/engineering, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/south, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/engineering/engine_smes) -"aNH" = ( -/obj/structure/rack, -/obj/effect/turf_decal/stripes/line{ - 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/clothing/mask/gas{ - pixel_y = 4 - }, -/obj/item/clothing/mask/gas, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/dark/small, -/area/station/engineering/main) "aNL" = ( /turf/closed/wall, /area/station/science/ordnance/bomb) @@ -1707,10 +1863,40 @@ dir = 1 }, /area/station/hallway/secondary/entry) +"aNZ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/landmark/navigate_destination/dockesc, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/hallway/secondary/exit/departure_lounge) "aOx" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/stone, /area/station/service/bar/backroom) +"aOz" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/purple{ + dir = 8 + }, +/obj/machinery/holopad, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/science/genetics) +"aOE" = ( +/obj/machinery/modular_computer/preset/engineering{ + dir = 8 + }, +/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/light/small/directional/east, +/turf/open/floor/iron/small, +/area/station/engineering/engine_smes) "aOK" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer{ dir = 4 @@ -1750,6 +1936,14 @@ "aPb" = ( /turf/open/floor/plating/rust, /area/station/engineering/atmos/project) +"aPe" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/structure/window/reinforced/tram/directional/west, +/obj/structure/industrial_lift/tram/white, +/turf/open/floor/noslip/tram_platform, +/area/station/security/tram) "aPh" = ( /obj/structure/window/reinforced/plasma/spawner/directional/north, /obj/effect/turf_decal/stripes/white/line{ @@ -1805,6 +1999,13 @@ }, /turf/open/floor/plating, /area/station/engineering/supermatter) +"aPM" = ( +/obj/structure/chair/sofa/bench/right, +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/machinery/incident_display/tram/directional/north, +/turf/open/floor/iron, +/area/station/security/tram) "aPO" = ( /obj/structure/table/glass, /obj/effect/turf_decal/trimline/blue/filled/line, @@ -1824,14 +2025,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"aPU" = ( -/obj/structure/cable, -/obj/structure/table, -/obj/effect/mapping_helpers/broken_floor, -/obj/item/rcl/pre_loaded, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/iron, -/area/station/commons/storage/art) "aPX" = ( /obj/structure/cable, /obj/machinery/holopad, @@ -1878,6 +2071,17 @@ /obj/structure/cable, /turf/closed/wall/r_wall, /area/station/maintenance/department/engine) +"aRa" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/cafeteria, +/area/station/hallway/secondary/exit/departure_lounge) "aRn" = ( /obj/effect/turf_decal/siding/dark_red, /obj/item/stack/sheet/cardboard{ @@ -1906,6 +2110,7 @@ /turf/closed/wall/r_wall, /area/station/maintenance/department/engine) "aRw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/chapel{ dir = 4 }, @@ -1917,6 +2122,11 @@ }, /turf/open/floor/carpet, /area/station/medical/psychology) +"aRD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/interrogation) "aRF" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 8 @@ -2001,6 +2211,18 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/department/engine) +"aSQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/trash/popcorn/caramel{ + pixel_y = 5 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/grimy, +/area/station/service/theater) "aTc" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -2030,6 +2252,12 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"aTp" = ( +/obj/machinery/suit_storage_unit/medical, +/obj/effect/turf_decal/bot, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/small, +/area/station/medical/storage) "aTq" = ( /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/dark, @@ -2080,6 +2308,8 @@ /area/station/engineering/supermatter/room) "aUA" = ( /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/dark/smooth_edge, /area/station/maintenance/starboard/greater) "aUQ" = ( @@ -2113,12 +2343,6 @@ }, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/department/engine) -"aVr" = ( -/obj/machinery/modular_computer/console/preset/id, -/obj/effect/turf_decal/tile/dark_red/fourcorners, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/smooth, -/area/station/security/checkpoint/customs) "aVz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2148,6 +2372,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/west, /obj/machinery/camera/autoname/directional/west, +/obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron/checker, /area/station/security/breakroom) "aVZ" = ( @@ -2171,16 +2396,24 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/textured_half, /area/station/security/execution/transfer) -"aWE" = ( -/obj/machinery/door/airlock/hatch, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +"aWw" = ( +/obj/effect/turf_decal/siding/wood{ dir = 8 }, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/maintenance/department/engine) +/obj/structure/flora/bush/sunny/style_random, +/obj/machinery/light/small/directional/west, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden/monastery) +"aWC" = ( +/obj/machinery/computer/department_orders/engineering{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/station/engineering/break_room) "aXI" = ( /turf/closed/wall/r_wall, /area/station/science/lobby) @@ -2230,12 +2463,6 @@ dir = 8 }, /area/station/command/corporate_showroom) -"aYD" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/chapel{ - dir = 4 - }, -/area/station/maintenance/starboard/greater) "aYO" = ( /obj/effect/turf_decal/stripes/white/corner{ dir = 1 @@ -2245,6 +2472,15 @@ }, /turf/open/floor/noslip/tram_platform, /area/station/security/tram) +"aYR" = ( +/obj/structure/broken_flooring/singular/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"aYY" = ( +/obj/structure/flora/bush/flowers_yw/style_random, +/turf/open/misc/sandy_dirt, +/area/station/service/lawoffice) "aZi" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 9 @@ -2252,6 +2488,11 @@ /obj/structure/window/reinforced/plasma/spawner/directional/west, /turf/open/floor/engine, /area/station/maintenance/department/engine) +"aZw" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/landmark/navigate_destination/dockescpod, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "aZG" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/turf_decal/siding/wood{ @@ -2261,6 +2502,13 @@ /obj/structure/table/wood, /turf/open/floor/iron/grimy, /area/station/hallway/secondary/entry) +"aZL" = ( +/obj/structure/table, +/obj/item/aicard, +/obj/machinery/light/cold/directional/east, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron, +/area/station/engineering/storage/tech) "aZM" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -2271,13 +2519,43 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/engine) -"bab" = ( -/obj/machinery/door/airlock/external{ - name = "Common Mining Dock" +"aZP" = ( +/obj/structure/cable, +/obj/structure/table/wood, +/obj/item/storage/secure/briefcase{ + pixel_y = -10 }, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/plating, -/area/station/hallway/secondary/dock) +/obj/item/paper_bin{ + pixel_x = 7; + pixel_y = 7 + }, +/obj/item/pen{ + pixel_x = 8; + pixel_y = 8 + }, +/obj/item/flashlight/lamp/green{ + pixel_x = -6; + pixel_y = 11 + }, +/turf/open/floor/iron/grimy, +/area/station/command/heads_quarters/hop) +"aZS" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/station/command/meeting_room) +"bah" = ( +/obj/structure/cable, +/obj/item/kirbyplants/organic/applebush, +/obj/machinery/keycard_auth/directional/south, +/turf/open/floor/iron/dark/textured_corner{ + dir = 4 + }, +/area/station/command/heads_quarters/hop) "bat" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -2296,6 +2574,7 @@ pixel_x = -8; pixel_y = 6 }, +/obj/structure/alien/weeds, /turf/open/misc/asteroid, /area/station/maintenance/starboard/greater) "baW" = ( @@ -2314,33 +2593,12 @@ }, /turf/open/floor/iron/white/small, /area/station/medical/storage) -"bbe" = ( -/obj/machinery/atmospherics/pipe/smart/simple/general/visible, -/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{ - dir = 10 - }, -/area/station/science/xenobiology) "bbh" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"bbj" = ( -/obj/structure/cable, -/obj/machinery/modular_computer/console/preset/engineering{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating/rust, -/area/station/maintenance/department/engine) "bbU" = ( /obj/effect/landmark/generic_maintenance_landmark, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -2348,6 +2606,20 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/aft) +"bcc" = ( +/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/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/landmark/navigate_destination/atmos, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "bch" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/chair/sofa/right{ @@ -2393,6 +2665,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) +"bcR" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 9 + }, +/area/station/science/ordnance/testlab) "bcY" = ( /obj/structure/chair/sofa/bench/right{ dir = 1 @@ -2419,21 +2701,36 @@ /obj/structure/cable, /turf/closed/wall, /area/station/maintenance/department/engine) +"ber" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/warning/radiation/rad_area/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/hallway/abandoned_command) +"bey" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"beH" = ( +/obj/machinery/bookbinder, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/wood/parquet, +/area/station/service/library) +"beK" = ( +/turf/open/floor/iron/smooth, +/area/station/security/evidence) "beL" = ( /obj/structure/railing{ dir = 9 }, /turf/open/floor/plating/airless, /area/station/engineering/atmospherics_engine) -"beM" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/obj/structure/chair{ - pixel_y = -2 - }, -/turf/open/floor/wood/tile, -/area/station/science/lower) "beO" = ( /obj/machinery/atmospherics/components/unary/passive_vent{ dir = 4; @@ -2441,6 +2738,12 @@ }, /turf/open/floor/plating/airless, /area/station/engineering/supermatter/room) +"bfe" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/camera/autoname/directional/west, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/iron/white, +/area/station/science/cytology) "bfj" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -2473,6 +2776,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/rust, /area/station/maintenance/department/engine) +"bfy" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output{ + dir = 4 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/engine/n2o, +/area/station/ai_monitored/turret_protected/ai) "bfF" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -2490,6 +2800,19 @@ }, /turf/open/misc/asteroid/airless, /area/station/engineering/atmospherics_engine) +"bfI" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/brown/full, +/obj/machinery/chem_dispenser/drinks/beer{ + dir = 1 + }, +/obj/machinery/requests_console/directional/south{ + department = "Bar"; + name = "Bar Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/turf/open/floor/iron/smooth_large, +/area/station/service/bar) "bfN" = ( /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating/airless, @@ -2510,6 +2833,14 @@ }, /turf/open/floor/plating, /area/station/engineering/supermatter/room) +"bgp" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/tile, +/area/station/service/lawoffice) +"bgA" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/small, +/area/station/medical/morgue) "bgB" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -2518,15 +2849,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"bgH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/green{ - dir = 1 - }, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/iron/dark/small, -/area/station/medical/chemistry) +"bgK" = ( +/obj/structure/sink/kitchen/directional/east, +/obj/machinery/light_switch/directional/west, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "bgQ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -2551,28 +2878,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) -"bhI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair{ - dir = 1 - }, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/iron/showroomfloor, -/area/station/commons/toilet/auxiliary) -"bhL" = ( -/obj/machinery/computer/security/qm{ - dir = 1 - }, -/obj/machinery/light/cold/directional/south, -/obj/structure/sign/poster/official/random/directional/south, -/obj/machinery/requests_console/directional/east{ - department = "Quartermaster's Desk"; - name = "Quartermaster's Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/supplies, -/turf/open/floor/wood, -/area/station/command/heads_quarters/qm) "bhR" = ( /obj/machinery/door/airlock/engineering{ name = "Main Engine" @@ -2591,12 +2896,6 @@ }, /turf/open/floor/iron/smooth, /area/station/engineering/atmos) -"bia" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/table/greyscale, -/obj/item/folder/yellow, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "bio" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -2604,19 +2903,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_recreation) -"biq" = ( -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/obj/structure/table/reinforced, -/obj/machinery/recharger{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/machinery/recharger{ - pixel_x = 5; - pixel_y = 4 - }, -/turf/open/floor/iron, -/area/station/security/warden) "biB" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark/smooth_large, @@ -2626,14 +2912,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/white/small, /area/station/science/lobby) -"biW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "bjf" = ( /obj/item/stack/sheet/iron/fifty, /obj/item/stack/rods/fifty, @@ -2685,6 +2963,15 @@ /obj/structure/marker_beacon/burgundy, /turf/open/space/basic, /area/space/nearstation) +"bjV" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/obj/effect/landmark/start/hangover, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron, +/area/station/hallway/secondary/spacebridge) "bjX" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance, @@ -2709,6 +2996,15 @@ /obj/structure/marker_beacon/lime, /turf/open/space/basic, /area/space/nearstation) +"bkg" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 8 + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/light/floor, +/turf/open/floor/iron/grimy, +/area/station/science/cubicle) "bkl" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -2750,6 +3046,20 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) +"blf" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/machinery/camera/autoname/directional/east, +/obj/item/screwdriver{ + pixel_y = 10 + }, +/obj/item/restraints/handcuffs, +/obj/machinery/light/cold/directional/east, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/smooth, +/area/station/security/checkpoint/customs/auxiliary) "blh" = ( /obj/structure/hedge, /turf/open/floor/iron/grimy, @@ -2783,6 +3093,11 @@ /obj/effect/turf_decal/arrows/white, /turf/open/floor/plating/airless, /area/station/engineering/atmospherics_engine) +"blJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/small, +/area/station/science/ordnance/storage) "blU" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -2821,6 +3136,7 @@ /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/hallway/secondary/construction) "bmB" = ( @@ -2840,10 +3156,27 @@ /obj/item/wrench, /turf/open/floor/plating, /area/station/engineering/supermatter/room) +"bnc" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/item/pipe_dispenser, +/obj/item/pipe_dispenser{ + pixel_x = 10; + pixel_y = 7 + }, +/turf/open/floor/iron/small, +/area/station/engineering/supermatter/room) "bng" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/engineering/supermatter/room) +"bnh" = ( +/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/machinery/newscaster/directional/west, +/turf/open/floor/iron, +/area/station/commons) "bno" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -2857,16 +3190,17 @@ /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"bnu" = ( -/obj/item/clothing/glasses/meson, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/closet/firecloset, -/obj/machinery/firealarm/directional/north, -/obj/machinery/camera/autoname/directional/west, +"bnr" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/structure/alien/weeds, /turf/open/floor/plating, -/area/station/engineering/main) +/area/station/maintenance/starboard/greater) +"bnz" = ( +/obj/machinery/light_switch/directional/south, +/obj/structure/cable, +/turf/open/floor/iron/showroomfloor, +/area/station/medical/surgery/theatre) "bob" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, @@ -2879,6 +3213,12 @@ /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/iron/grimy, /area/station/science/cubicle) +"bor" = ( +/obj/machinery/firealarm/directional/east, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/turf/open/floor/iron/showroomfloor, +/area/station/medical/surgery/theatre) "boK" = ( /obj/effect/turf_decal/stripes/asteroid/end{ dir = 1 @@ -2910,6 +3250,13 @@ /obj/item/clothing/mask/breath/medical, /turf/open/floor/iron/white, /area/station/science/robotics/augments) +"boX" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "garbage" + }, +/turf/open/floor/plating, +/area/station/service/janitor) "boY" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -2957,6 +3304,14 @@ }, /turf/open/floor/iron/smooth, /area/station/engineering/atmos) +"bpI" = ( +/obj/structure/table, +/obj/item/storage/box/donkpockets, +/obj/machinery/light/small/directional/west, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/iron/cafeteria, +/area/station/science/breakroom) "bpS" = ( /obj/item/kirbyplants/random/fullysynthetic, /obj/item/radio/intercom/directional/north, @@ -2982,6 +3337,11 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, /area/station/maintenance/department/engine) +"bqy" = ( +/turf/open/floor/engine{ + name = "Holodeck Projector Floor" + }, +/area/station/holodeck/rec_center) "bqE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2991,6 +3351,11 @@ }, /turf/open/floor/iron/white/small, /area/station/medical/virology) +"bqR" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/closet/crate/mod, +/turf/open/floor/iron/white, +/area/station/science/robotics/augments) "bqZ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/crate, @@ -3005,6 +3370,13 @@ /obj/structure/grille, /turf/open/floor/plating, /area/station/hallway/primary/port) +"brz" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/decal/cleanable/dirt, +/obj/structure/alien/weeds, +/obj/vehicle/ridden/scooter/skateboard/hoverboard, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) "brD" = ( /obj/machinery/airalarm/directional/west, /obj/effect/turf_decal/tile/neutral{ @@ -3093,6 +3465,8 @@ }, /area/station/engineering/break_room) "bsI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_corner{ dir = 4 }, @@ -3109,6 +3483,13 @@ }, /turf/open/floor/plating/airless, /area/station/engineering/atmospherics_engine) +"btf" = ( +/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/landmark/navigate_destination/dorms, +/turf/open/floor/iron, +/area/station/commons/dorms) "btv" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/effect/decal/cleanable/dirt, @@ -3139,13 +3520,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/iron/small, /area/station/engineering/atmospherics_engine) -"btQ" = ( -/obj/machinery/computer/security{ - dir = 8 - }, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/iron/dark, -/area/station/security/office) "buk" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3184,20 +3558,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/iron/small, /area/station/engineering/atmospherics_engine) -"buL" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=6.2-Arrivals"; - location = "6.1-Arrivals" - }, -/turf/open/floor/iron/white/corner{ - dir = 8 - }, -/area/station/hallway/secondary/entry) "buN" = ( /obj/effect/turf_decal/arrows{ dir = 8 @@ -3205,6 +3565,14 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron, /area/station/engineering/atmospherics_engine) +"buO" = ( +/obj/machinery/computer/slot_machine{ + pixel_y = 2 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/light/small/directional/west, +/turf/open/floor/carpet/orange, +/area/station/service/abandoned_gambling_den) "buS" = ( /obj/structure/window/reinforced/plasma/spawner/directional/east, /obj/effect/turf_decal/stripes/white/line{ @@ -3279,16 +3647,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/prison/rec) -"bwH" = ( -/obj/structure/closet/radiation, -/obj/item/clothing/glasses/meson, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/plating, -/area/station/engineering/main) "bwJ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3363,6 +3721,15 @@ /obj/effect/turf_decal/arrows/white, /turf/open/floor/plating/airless, /area/station/engineering/atmospherics_engine) +"bxT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/navigate_destination/dockescpod, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central) "byk" = ( /obj/structure/railing{ dir = 6 @@ -3394,40 +3761,19 @@ /obj/effect/turf_decal/stripes/asteroid/end, /turf/open/floor/circuit/green, /area/station/science/robotics/mechbay) +"byU" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt, +/obj/structure/alien/egg/fake, +/obj/structure/alien/weeds, +/obj/effect/gibspawner, +/turf/open/floor/wood, +/area/station/maintenance/starboard/greater) "byV" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/item/radio/intercom/directional/west, /turf/open/floor/iron, /area/station/engineering/atmospherics_engine) -"byW" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Waste to Exhaust" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) -"bze" = ( -/obj/structure/table/reinforced/titaniumglass, -/obj/item/clothing/suit/hazardvest{ - pixel_y = 8 - }, -/obj/item/clothing/suit/hazardvest{ - pixel_y = 5 - }, -/obj/item/clothing/suit/hazardvest{ - pixel_y = 2 - }, -/obj/item/tank/internals/emergency_oxygen/engi{ - pixel_y = 7 - }, -/obj/item/tank/internals/emergency_oxygen/engi{ - pixel_y = 4 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/small, -/area/station/engineering/supermatter/room) "bzf" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/tile/yellow/opposingcorners, @@ -3437,9 +3783,11 @@ "bzn" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/item/stack/sheet/plasteel/fifty, /obj/machinery/firealarm/directional/east, /obj/structure/rack, +/obj/item/mod/module/plasma_stabilizer, +/obj/item/mod/module/signlang_radio, +/obj/item/mod/module/thermal_regulator, /turf/open/floor/iron, /area/station/engineering/atmospherics_engine) "bzs" = ( @@ -3458,6 +3806,15 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/engineering/supermatter/room) +"bzL" = ( +/obj/machinery/flasher/portable, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/station/security/tram) "bzM" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -3484,6 +3841,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/hallway/secondary/construction) +"bAd" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/dock) "bAi" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -3494,14 +3857,6 @@ dir = 8 }, /area/station/maintenance/disposal/incinerator) -"bAk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/obj/structure/chair/plastic{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/maintenance/disposal/incinerator) "bAo" = ( /obj/machinery/atmospherics/pipe/smart/simple/general/visible{ dir = 4 @@ -3568,9 +3923,9 @@ dir = 4 }, /obj/machinery/disposal/delivery_chute{ + desc = "The quickest way back to society"; dir = 1; - name = "freedom"; - desc = "The quickest way back to society" + name = "freedom" }, /obj/machinery/door/window/brigdoor/right/directional/north, /turf/open/floor/iron/dark, @@ -3585,19 +3940,18 @@ }, /turf/open/floor/plating/airless, /area/station/engineering/atmospherics_engine) +"bBr" = ( +/obj/structure/cable, +/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/small, +/area/station/science/cubicle) "bBu" = ( /obj/effect/turf_decal/siding, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/small, /area/station/science/lab) -"bBv" = ( -/obj/machinery/light/cold/directional/west, -/obj/structure/chair/sofa/corp/left{ - dir = 4 - }, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/smooth, -/area/station/hallway/secondary/command) "bBw" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/broken_flooring/singular/directional/south, @@ -3614,6 +3968,30 @@ }, /turf/open/floor/iron, /area/station/security/processing) +"bCh" = ( +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/machinery/door/airlock/mining{ + name = "Bitrunning Den" + }, +/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/access/any/supply/bit_den, +/turf/open/floor/iron/dark/smooth_half{ + dir = 1 + }, +/area/station/bitrunning/den) "bCi" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/machinery/atmospherics/components/binary/crystallizer{ @@ -3634,32 +4012,17 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"bCr" = ( -/obj/effect/turf_decal/siding/dark_red/corner, -/obj/structure/rack, -/obj/item/gun/energy/temperature/security, -/obj/item/gun/energy/ionrifle{ - pixel_y = 3 +"bCs" = ( +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 1 }, -/obj/item/clothing/suit/hooded/ablative, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/iron/dark/small, -/area/station/ai_monitored/security/armory) +/area/station/hallway/secondary/construction) "bCu" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/atmospherics_engine) -"bCz" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/obj/machinery/light/cold/directional/south, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/warden) "bCG" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -3711,18 +4074,10 @@ }, /turf/open/floor/iron/dark, /area/station/medical/cryo) -"bDp" = ( -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 10 - }, -/obj/structure/reagent_dispensers/watertank, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/smooth_large, -/area/station/science/robotics/mechbay) "bDq" = ( /obj/structure/table, /obj/item/shovel, +/obj/structure/alien/weeds, /turf/open/misc/asteroid, /area/station/maintenance/starboard/greater) "bDr" = ( @@ -3733,6 +4088,19 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"bDD" = ( +/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, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/green{ + dir = 8 + }, +/turf/open/floor/iron/cafeteria, +/area/station/science/circuits) "bDN" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/brown/half/contrasted{ @@ -3762,15 +4130,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/commons/storage/tools) -"bDY" = ( -/obj/effect/turf_decal/trimline/blue/corner{ - dir = 4 - }, -/obj/item/kirbyplants/random/fullysynthetic, -/obj/machinery/light/cold/directional/east, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "bEd" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/mapping_helpers/broken_floor, @@ -3809,6 +4168,11 @@ dir = 1 }, /area/station/science/ordnance/testlab) +"bEE" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/security/processing) "bEG" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -3831,13 +4195,6 @@ dir = 1 }, /area/station/hallway/secondary/entry) -"bEP" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/cold/directional/north, -/obj/machinery/status_display/ai/directional/north, -/turf/open/floor/iron, -/area/station/hallway/secondary/dock) "bFb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3851,10 +4208,26 @@ dir = 1 }, /area/station/engineering/atmospherics_engine) +"bFg" = ( +/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/decal/cleanable/dirt, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron, +/area/station/commons/dorms) "bFw" = ( /obj/machinery/telecomms/server/presets/science, /turf/open/floor/circuit, /area/station/tcommsat/server) +"bFG" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/item/stack/sheet/mineral/titanium, +/obj/machinery/light/small/directional/south, +/turf/open/floor/noslip/tram_platform, +/area/station/maintenance/department/medical/central) "bFM" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -3869,6 +4242,16 @@ /obj/effect/spawner/random/techstorage/rnd_all, /turf/open/floor/iron, /area/station/engineering/storage/tech) +"bGc" = ( +/obj/machinery/modular_computer/preset/civilian{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/directional/south{ + c_tag = "Engineering - Desk" + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/break_room) "bGi" = ( /obj/structure/table/wood, /obj/item/reagent_containers/cup/glass/mug{ @@ -3899,35 +4282,6 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/construction) -"bGs" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/maintenance{ - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-entrance" - }, -/obj/effect/mapping_helpers/airlock/access/any/security/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"bGv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/green{ - dir = 9 - }, -/obj/item/kirbyplants/random/fullysynthetic, -/obj/machinery/button/door/directional/north{ - id = "chem_lockdown"; - name = "chemistry lockdown control"; - req_access = list("pharmacy") - }, -/turf/open/floor/iron/dark/small, -/area/station/medical/chemistry) -"bGC" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/dark, -/area/station/security/interrogation) "bGL" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/iron, @@ -3938,6 +4292,17 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/dark, /area/station/engineering/main) +"bGT" = ( +/obj/item/clothing/glasses/meson, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/closet/firecloset, +/obj/machinery/firealarm/directional/north, +/obj/machinery/camera/autoname/directional/west, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/station/engineering/main) "bGU" = ( /obj/machinery/door/airlock/mining/glass{ name = "Filing Room" @@ -3963,19 +4328,6 @@ }, /turf/open/floor/plating/rust, /area/station/maintenance/department/engine) -"bHp" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/obj/machinery/firealarm/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/diagonal, -/area/station/command/heads_quarters/hop) "bHs" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance, @@ -3989,24 +4341,21 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/fore/greater) +"bHB" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/blue/full, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white/textured_large, +/area/station/command/heads_quarters/cmo) "bHU" = ( /obj/effect/turf_decal/siding/wood, /obj/machinery/camera/autoname/directional/south, /turf/open/floor/carpet/blue, /area/station/cargo/boutique) -"bHV" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/effect/turf_decal/siding/green, -/obj/structure/table, -/obj/item/multitool/circuit{ - pixel_x = 7 - }, -/obj/item/multitool/circuit, -/obj/item/multitool/circuit{ - pixel_x = -8 - }, -/turf/open/floor/iron/cafeteria, -/area/station/science/circuits) "bHW" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -4056,6 +4405,8 @@ "bJw" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/broken_flooring/singular/directional/south, +/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/aft) "bJL" = ( @@ -4074,26 +4425,20 @@ /obj/structure/chair/stool/directional/south, /turf/open/floor/iron, /area/station/security/prison/workout) -"bKk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) -"bKt" = ( -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/item/food/grown/banana, -/turf/open/floor/grass, -/area/station/medical/virology) "bKu" = ( /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/department/engine) +"bKz" = ( +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/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/north, +/turf/open/floor/iron/smooth, +/area/station/command/heads_quarters/qm) "bKE" = ( /obj/effect/turf_decal/siding/red{ dir = 1 @@ -4115,6 +4460,22 @@ }, /turf/open/floor/iron/small, /area/station/security/tram) +"bKP" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/neutral/full, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/item/lighter{ + pixel_x = 2; + pixel_y = 5 + }, +/obj/item/lighter{ + pixel_x = -8; + pixel_y = -2 + }, +/turf/open/floor/iron/smooth_large, +/area/station/service/bar) "bKU" = ( /obj/item/toy/crayon/spraycan{ pixel_x = -7 @@ -4135,13 +4496,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/dark, /area/station/science/xenobiology) -"bLW" = ( -/obj/structure/cable, -/obj/item/kirbyplants/random, -/obj/item/clothing/under/costume/griffin, -/obj/machinery/light/dim/directional/south, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/maintenance/port/aft) "bMq" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/decal/cleanable/dirt, @@ -4167,10 +4521,34 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/small, /area/station/engineering/atmos) +"bMW" = ( +/obj/machinery/iv_drip, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/showroomfloor, +/area/station/medical/virology) +"bNd" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/modular_computer/preset/id{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/smooth, +/area/station/command/bridge) "bNg" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/small, /area/station/engineering/atmos) +"bNl" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sci-entrance" + }, +/obj/machinery/door/airlock{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central) "bNq" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/engine/atmos) @@ -4203,6 +4581,8 @@ /obj/structure/cable, /obj/structure/broken_flooring/pile/directional/east, /obj/effect/decal/cleanable/dirt, +/obj/structure/alien/weeds, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "bNQ" = ( @@ -4243,6 +4623,19 @@ /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, /area/station/service/hydroponics/garden/monastery) +"bOp" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/hallway/primary/central/fore) "bOs" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -4302,6 +4695,14 @@ /obj/machinery/holopad, /turf/open/floor/iron/white/small, /area/station/science/ordnance/storage) +"bQm" = ( +/obj/effect/turf_decal/siding/red{ + dir = 5 + }, +/obj/item/radio/intercom/directional/north, +/obj/machinery/computer/records/security, +/turf/open/floor/wood/tile, +/area/station/command/bridge) "bQz" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 4 @@ -4332,6 +4733,11 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"bRm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/alien/weeds, +/turf/open/floor/wood, +/area/station/maintenance/starboard/greater) "bRo" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -4360,10 +4766,6 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, /area/station/maintenance/department/engine) -"bRN" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall, -/area/station/maintenance/department/science/xenobiology) "bSj" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -4406,13 +4808,6 @@ /obj/machinery/flasher/directional/north, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) -"bSW" = ( -/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, -/turf/open/floor/iron/white, -/area/station/hallway/primary/starboard) "bSX" = ( /obj/machinery/flasher/directional/east{ id = "AI"; @@ -4428,6 +4823,14 @@ /obj/structure/table/reinforced/titaniumglass, /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/item/hfr_box/core, +/obj/item/hfr_box/corner, +/obj/item/hfr_box/corner, +/obj/item/hfr_box/corner, +/obj/item/hfr_box/corner, +/obj/item/hfr_box/body/waste_output, +/obj/item/hfr_box/body/moderator_input, +/obj/item/hfr_box/body/interface, +/obj/item/hfr_box/body/fuel_input, /turf/open/floor/iron, /area/station/engineering/atmospherics_engine) "bTv" = ( @@ -4464,6 +4867,14 @@ }, /turf/open/floor/noslip/tram_platform, /area/station/security/tram) +"bUr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "bUt" = ( /obj/effect/turf_decal/tile/green{ dir = 8 @@ -4508,6 +4919,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"bUD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/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/starboard) "bUE" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -4519,17 +4939,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/department/engine) -"bUJ" = ( -/obj/structure/chair/sofa/bench{ - dir = 8 - }, -/obj/machinery/airalarm/directional/east, -/obj/effect/landmark/start/assistant, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white/corner, -/area/station/hallway/secondary/exit/departure_lounge) "bUX" = ( /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron/dark, @@ -4581,6 +4990,13 @@ /obj/effect/landmark/start/head_of_security, /turf/open/floor/iron/small, /area/station/security/office) +"bVR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) "bWa" = ( /obj/effect/turf_decal/siding/white{ dir = 10 @@ -4606,6 +5022,29 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/white/small, /area/station/security/warden) +"bWi" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/table, +/obj/effect/turf_decal/siding/purple{ + dir = 5 + }, +/obj/item/clothing/gloves/latex{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/clothing/gloves/latex{ + pixel_x = 2; + pixel_y = 6 + }, +/obj/item/storage/box/disks{ + pixel_x = 6; + pixel_y = 12 + }, +/obj/structure/sign/warning/no_smoking/circle/directional/north, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/science/genetics) "bWs" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -4624,14 +5063,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating/rust, /area/station/maintenance/department/engine) -"bWQ" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/main) "bWZ" = ( /obj/effect/turf_decal/tile/yellow, /obj/structure/cable, @@ -4641,6 +5072,11 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/dark, /area/station/engineering/main) +"bXu" = ( +/obj/item/kirbyplants/random, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/dark, +/area/station/medical/cryo) "bXG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light_switch/directional/north, @@ -4648,6 +5084,14 @@ dir = 4 }, /area/station/science/robotics/augments) +"bXH" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 4 + }, +/obj/structure/closet/crate/bin, +/turf/open/floor/iron/white, +/area/station/medical/virology) "bXO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4663,11 +5107,6 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/small, /area/station/engineering/atmos) -"bXW" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/showroomfloor, -/area/station/medical/surgery/theatre) "bYf" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/stripes/line{ @@ -4692,6 +5131,12 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"bZs" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/glass/drinkingglass, +/obj/item/flashlight/flare/candle/infinite, +/turf/open/floor/iron/cafeteria, +/area/station/security/prison/mess) "bZt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -4735,13 +5180,6 @@ }, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) -"bZL" = ( -/obj/machinery/light/directional/south, -/obj/machinery/ai_slipper{ - uses = 10 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "bZN" = ( /obj/effect/turf_decal/siding/thinplating_new/light{ dir = 4 @@ -4815,6 +5253,30 @@ "cbm" = ( /turf/closed/wall/rust, /area/station/ai_monitored/aisat/exterior) +"cbt" = ( +/obj/structure/cable, +/obj/structure/table/bronze, +/obj/effect/turf_decal/siding/thinplating_new/terracotta{ + dir = 4 + }, +/obj/item/reagent_containers/cup/glass/bottle/beer{ + pixel_x = 7; + pixel_y = 11 + }, +/obj/item/reagent_containers/cup/glass/bottle/beer{ + pixel_x = -1; + pixel_y = 11 + }, +/obj/item/reagent_containers/cup/glass/bottle/beer{ + pixel_x = 3; + pixel_y = 7 + }, +/obj/item/reagent_containers/cup/glass/bottle/beer{ + pixel_x = -7; + pixel_y = 7 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room) "cbu" = ( /obj/machinery/vending/engivend, /obj/effect/turf_decal/tile/yellow/opposingcorners, @@ -4872,25 +5334,6 @@ }, /turf/open/floor/plating, /area/station/construction/mining/aux_base) -"cce" = ( -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/machinery/light/cold/directional/south, -/obj/machinery/button/door/directional/south{ - id = "kihall"; - name = "Hallway Cutoff"; - pixel_x = -7 - }, -/obj/machinery/button/door/directional/south{ - id = "kitchenshutters"; - name = "Kitchen Shutters"; - pixel_x = 7 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "ccs" = ( /obj/effect/turf_decal/tile/dark_red/fourcorners, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -4898,14 +5341,6 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) -"ccy" = ( -/obj/machinery/mech_bay_recharge_port{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/asteroid/end, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/circuit/green, -/area/station/science/robotics/mechbay) "ccD" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -4938,6 +5373,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, /turf/open/floor/iron/textured_half, /area/station/engineering/main) "cdf" = ( @@ -4954,17 +5390,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/grass, /area/station/science/xenobiology) -"cdi" = ( -/obj/effect/turf_decal/tile/yellow{ - 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, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/station/engineering/main) "cdn" = ( /obj/machinery/telecomms/server/presets/medical, /turf/open/floor/circuit, @@ -5006,13 +5431,6 @@ /obj/structure/window/spawner/directional/south, /turf/open/space/basic, /area/space/nearstation) -"ced" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/kirbyplants/random/fullysynthetic, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron, -/area/station/security/prison) "cek" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -5035,7 +5453,7 @@ /area/station/maintenance/central/greater) "ceK" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /turf/open/floor/iron/dark, /area/station/medical/medbay/central) "ceZ" = ( @@ -5075,12 +5493,6 @@ /obj/machinery/duct, /turf/open/floor/iron/kitchen/small, /area/station/security/prison/mess) -"cgs" = ( -/obj/machinery/portable_atmospherics/canister, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) "cgy" = ( /obj/effect/turf_decal/stripes/red/line{ dir = 4 @@ -5088,22 +5500,6 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/smooth_large, /area/station/science/auxlab/firing_range) -"cgB" = ( -/obj/machinery/suit_storage_unit/engine, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/plating, -/area/station/engineering/main) -"cgD" = ( -/obj/machinery/door/airlock{ - name = "Mineshaft" - }, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/rust, -/area/station/maintenance/fore/greater) "cgM" = ( /turf/open/misc/asteroid, /area/station/maintenance/starboard/greater) @@ -5148,13 +5544,6 @@ /obj/structure/cable, /turf/closed/wall/r_wall, /area/station/hallway/primary/aft) -"chF" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/structure/industrial_lift/tram, -/obj/structure/window/reinforced/tram/mid/directional/south, -/obj/structure/rack, -/turf/open/floor/noslip/tram_platform, -/area/station/maintenance/port/aft) "chO" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -5163,6 +5552,20 @@ /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron/smooth, /area/station/maintenance/solars/port/aft) +"chP" = ( +/obj/machinery/deepfryer, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"chU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/dark_red/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/security) "cis" = ( /obj/machinery/atmospherics/pipe/smart/simple/general/visible{ dir = 9 @@ -5172,6 +5575,16 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/fore) +"ciR" = ( +/obj/structure/table, +/obj/effect/spawner/random/techstorage/command_all, +/turf/open/floor/iron, +/area/station/engineering/storage/tech) +"ciT" = ( +/obj/structure/table/glass, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/white, +/area/station/science/auxlab/firing_range) "cjm" = ( /obj/structure/closet/firecloset, /obj/machinery/status_display/evac/directional/south, @@ -5182,21 +5595,33 @@ /obj/structure/plasticflaps/opaque, /turf/open/floor/iron, /area/station/maintenance/port/lesser) -"cku" = ( -/obj/structure/barricade/wooden/crude, -/turf/open/floor/noslip, -/area/station/maintenance/department/medical/central) -"ckH" = ( -/obj/effect/turf_decal/tile/dark_red/half/contrasted{ +"cjY" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/camera/autoname/directional/east, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"cks" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/machinery/light/cold/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 +/obj/effect/turf_decal/tile/red{ + dir = 8 }, -/obj/effect/landmark/start/security_officer, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/structure/sign/departments/engineering/directional/north, /turf/open/floor/iron, -/area/station/security/tram) +/area/station/hallway/primary/fore) +"cku" = ( +/obj/structure/barricade/wooden/crude, +/turf/open/floor/noslip, +/area/station/maintenance/department/medical/central) "ckL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5219,6 +5644,10 @@ }, /turf/open/floor/iron/dark/small, /area/station/medical/chemistry) +"clb" = ( +/obj/structure/chair/stool/directional/north, +/turf/open/floor/iron/kitchen/small, +/area/station/maintenance/aft) "clc" = ( /obj/effect/turf_decal/siding/wood, /obj/effect/turf_decal/siding/wood{ @@ -5230,6 +5659,7 @@ /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/small, /area/station/engineering/main) "clf" = ( @@ -5320,6 +5750,15 @@ }, /turf/open/floor/iron, /area/station/security/brig/entrance) +"cmX" = ( +/obj/effect/turf_decal/tile/dark_red{ + dir = 8 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/recharge_station, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/security/tram) "cmY" = ( /mob/living/simple_animal/bot/firebot, /obj/machinery/camera/autoname/directional/north, @@ -5331,20 +5770,22 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"cnu" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/structure/table/glass, +/obj/item/book/codex_gigas, +/obj/item/camera{ + pixel_y = 18 + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/grimy, +/area/station/service/library) "cnG" = ( /obj/machinery/suit_storage_unit/rd, /turf/open/floor/iron/dark/small, /area/station/command/heads_quarters/rd) -"cnI" = ( -/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/siding/white{ - dir = 4 - }, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/iron/dark/small, -/area/station/science/xenobiology) "cnL" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 10 @@ -5401,6 +5842,17 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/small, /area/station/engineering/atmos) +"cop" = ( +/obj/machinery/portable_atmospherics/canister/anesthetic_mix, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/iron/white/small, +/area/station/medical/cryo) "coA" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible, /obj/machinery/airalarm/directional/west, @@ -5432,14 +5884,6 @@ /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron, /area/station/service/hydroponics) -"cph" = ( -/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/airalarm/directional/west, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/lower) "cpt" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -5476,6 +5920,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/lesser) +"cpJ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/transit_tube/horizontal, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) "cpP" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -5483,6 +5933,13 @@ }, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) +"cpT" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood, +/obj/structure/bed/dogbed/ian, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood/tile, +/area/station/command/heads_quarters/hop) "cpW" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -5508,12 +5965,11 @@ }, /turf/open/floor/iron/dark, /area/station/medical/medbay/aft) -"cqo" = ( -/obj/structure/table/reinforced/titaniumglass, -/obj/item/stack/sheet/titaniumglass, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) +"cqn" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/iron/white/side, +/area/station/science/xenobiology) "cqp" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/decal/cleanable/dirt, @@ -5563,26 +6019,22 @@ /obj/machinery/air_sensor/incinerator_tank, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) +"cqS" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "garbage" + }, +/obj/effect/spawner/random/trash/garbage{ + spawn_loot_count = 3 + }, +/turf/open/floor/plating, +/area/station/service/janitor) "crm" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 4 }, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) -"crq" = ( -/obj/structure/table, -/obj/machinery/light/small/directional/south, -/obj/item/clothing/suit/utility/radiation, -/obj/item/clothing/head/utility/radiation{ - pixel_x = 10; - pixel_y = 5 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/plating, -/area/station/engineering/gravity_generator) "crr" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 6 @@ -5613,12 +6065,24 @@ /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, /area/station/service/hydroponics/garden/monastery) -"csq" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output{ - dir = 4 +"csw" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/turf_decal/stripes/end, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/small, +/area/station/medical/medbay/lobby) +"csA" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sci-entrance" }, -/turf/open/floor/engine/n2o, -/area/station/ai_monitored/turret_protected/ai) +/obj/machinery/door/airlock/maintenance{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "csE" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -5639,6 +6103,12 @@ /obj/machinery/door/firedoor, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"csS" = ( +/obj/structure/cable, +/obj/item/kirbyplants/organic/plant21, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/iron/smooth, +/area/station/ai_monitored/turret_protected/aisat/foyer) "ctq" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -5672,12 +6142,16 @@ /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/dark, /area/station/engineering/main) -"cuB" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/station/engineering/main) +"cuh" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron, +/area/station/security/prison/rec) "cuG" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 8 @@ -5696,12 +6170,51 @@ /turf/open/floor/plating/rust, /area/station/maintenance/department/engine/atmos) "cvy" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /turf/open/floor/iron/dark, /area/station/medical/medbay/lobby) +"cvH" = ( +/obj/effect/turf_decal/trimline/purple/end{ + dir = 4 + }, +/obj/effect/turf_decal/siding/white{ + dir = 9 + }, +/obj/machinery/shower/directional/east{ + name = "emergency shower" + }, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "cvJ" = ( /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) +"cvP" = ( +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/holopad, +/turf/open/floor/iron/dark/smooth_half{ + dir = 1 + }, +/area/station/bitrunning/den) +"cvZ" = ( +/obj/structure/closet/secure_closet/evidence, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron/smooth, +/area/station/security/evidence) "cwb" = ( /obj/effect/turf_decal/stripes/white/end{ dir = 1 @@ -5713,9 +6226,19 @@ /turf/open/floor/plating, /area/station/engineering/atmos) "cwg" = ( -/mob/living/simple_animal/hostile/asteroid/lobstrosity, +/mob/living/basic/mining/lobstrosity, /turf/open/misc/asteroid/airless, /area/station/engineering/supermatter/room) +"cwp" = ( +/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/effect/decal/cleanable/dirt, +/obj/effect/landmark/navigate_destination/lawyer, +/turf/open/floor/iron, +/area/station/hallway/secondary/recreation) "cwt" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -5756,6 +6279,22 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron, /area/station/engineering/break_room) +"cwL" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/turf/open/floor/iron, +/area/station/security/tram) +"cwR" = ( +/obj/structure/closet/radiation, +/obj/item/clothing/glasses/meson, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/engineering/main) "cwS" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -5783,6 +6322,8 @@ dir = 1 }, /obj/structure/broken_flooring/singular/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/hallway/secondary/dock) "cxO" = ( @@ -5817,6 +6358,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/central/greater) +"cyj" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/purple, +/obj/item/kirbyplants/random, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/dark, +/area/station/science/genetics) "cyk" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, @@ -5872,13 +6421,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/service/greenroom) -"czm" = ( -/obj/effect/turf_decal/tile/blue{ +"czy" = ( +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +/obj/structure/table/reinforced/titaniumglass, +/obj/machinery/light/directional/north, +/obj/item/analyzer, +/turf/open/floor/iron/smooth_edge{ + dir = 1 + }, +/area/station/maintenance/disposal/incinerator) "czV" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/status_display/door_timer{ @@ -5914,14 +6467,6 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/cmo) -"cAg" = ( -/obj/structure/tank_dispenser, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/dark/small, -/area/station/engineering/main) "cAh" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall, @@ -5964,18 +6509,6 @@ }, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/science/robotics/mechbay) -"cAB" = ( -/obj/effect/landmark/secequipment, -/obj/item/clothing/under/rank/security/officer/formal, -/obj/item/clothing/under/rank/security/officer/formal, -/obj/item/clothing/suit/jacket/officer/blue, -/obj/item/clothing/suit/jacket/officer/blue, -/obj/item/clothing/head/beret/sec/navyofficer, -/obj/item/clothing/head/beret/sec/navyofficer, -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plating, -/area/station/security/tram) "cAC" = ( /obj/structure/reagent_dispensers/fueltank/large, /obj/effect/decal/cleanable/dirt, @@ -6057,6 +6590,12 @@ }, /turf/open/misc/asteroid/airless, /area/space/nearstation) +"cCP" = ( +/obj/structure/window/spawner/directional/south, +/obj/structure/flora/bush/flowers_pp/style_random, +/obj/machinery/light/small/directional/north, +/turf/open/misc/sandy_dirt, +/area/station/commons) "cCW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6157,12 +6696,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) -"cEp" = ( -/obj/structure/table/wood/fancy/red, -/obj/item/gun/ballistic/automatic/c20r/toy/unrestricted, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/wood/parquet, -/area/station/service/greenroom) "cEs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/window/brigdoor/right/directional/north{ @@ -6176,15 +6709,6 @@ }, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) -"cEJ" = ( -/obj/machinery/door/window/brigdoor/right/directional/west{ - id = "Cell 3"; - name = "Cell 3"; - req_access = list("security") - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/small, -/area/station/security/brig) "cEK" = ( /obj/effect/landmark/start/ai, /obj/item/radio/intercom/directional/south{ @@ -6225,16 +6749,21 @@ }, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) -"cEQ" = ( -/obj/structure/closet/radiation, -/obj/item/clothing/glasses/meson, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +"cEX" = ( +/obj/effect/turf_decal/siding/thinplating_new/terracotta{ + dir = 1 }, -/obj/machinery/light/directional/east, -/turf/open/floor/plating, -/area/station/engineering/main) +/obj/machinery/modular_computer/preset/engineering{ + dir = 1 + }, +/obj/effect/turf_decal/siding/yellow, +/obj/machinery/button/door/directional/south{ + id = "bridge blast"; + name = "Bridge Access Blast Door Control"; + req_access = list("command") + }, +/turf/open/floor/wood/tile, +/area/station/command/bridge) "cFg" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -6247,6 +6776,12 @@ }, /turf/open/floor/iron, /area/station/security) +"cFj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/alien/weeds, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) "cFq" = ( /obj/machinery/door/airlock{ name = "Maintenance" @@ -6291,8 +6826,18 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/department/engine) +"cFR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "cFS" = ( /obj/effect/mapping_helpers/airlock/access/all/security/general, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -6331,6 +6876,38 @@ /obj/item/clothing/mask/surgical, /turf/open/floor/iron/small, /area/station/medical/storage) +"cHp" = ( +/obj/effect/turf_decal/siding/dark_red/corner{ + dir = 4 + }, +/obj/structure/rack, +/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/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/small, +/area/station/ai_monitored/security/armory) +"cHC" = ( +/obj/structure/chair{ + pixel_y = -2 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/landmark/start/lawyer, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/lawoffice) "cHO" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/blue/full, @@ -6363,31 +6940,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark/herringbone, /area/station/ai_monitored/command/nuke_storage) -"cIe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/pink/visible{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/remains/human/grave{ - pixel_x = 6; - pixel_y = 6 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"cIs" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "cIy" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6430,6 +6982,50 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/noslip/tram_platform, /area/station/security/tram) +"cJz" = ( +/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/dark_red/half/contrasted, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/security/execution/transfer) +"cJL" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/holopad, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/science/xenobiology) +"cJT" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/closet/crate{ + name = "Breach Supplies" + }, +/obj/item/weldingtool/mini, +/obj/item/weldingtool/mini, +/obj/item/grenade/chem_grenade/smart_metal_foam{ + pixel_x = 9 + }, +/obj/item/grenade/chem_grenade/smart_metal_foam{ + pixel_x = -1 + }, +/obj/item/stack/rods/fifty, +/obj/item/stack/rods/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/item/clothing/head/utility/welding, +/obj/item/clothing/head/utility/welding, +/turf/open/floor/iron/smooth, +/area/station/commons/storage/tools) "cKc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/flasher/directional/west{ @@ -6457,11 +7053,6 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) -"cLc" = ( -/obj/structure/cable, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "cLe" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -6474,6 +7065,13 @@ /obj/structure/marker_beacon/indigo, /turf/open/space/basic, /area/space/nearstation) +"cLm" = ( +/obj/structure/table, +/obj/effect/mapping_helpers/broken_floor, +/obj/item/rcl/pre_loaded, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/commons/storage/art) "cLn" = ( /obj/structure/disposalpipe/trunk{ dir = 1 @@ -6548,27 +7146,6 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"cME" = ( -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/light/small/directional/west, -/obj/machinery/light_switch/directional/south, -/obj/machinery/requests_console/directional/west{ - department = "Robotics"; - name = "Robotics Requests Console"; - pixel_y = -30 - }, -/obj/effect/mapping_helpers/requests_console/ore_update, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/machinery/button/door/directional/west{ - id = "roboticshut"; - name = "Robotics Shutters"; - pixel_y = 8 - }, -/turf/open/floor/iron, -/area/station/science/robotics/lab) "cMI" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 4 @@ -6627,6 +7204,15 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"cNu" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "cNw" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -6642,6 +7228,8 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron/small, /area/station/engineering/main) "cNF" = ( @@ -6660,13 +7248,6 @@ /obj/machinery/light/very_dim/directional/west, /turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) -"cNU" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 4 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "cNW" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ dir = 1 @@ -6708,22 +7289,6 @@ /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/plating, /area/station/construction/mining/aux_base) -"cOY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/green{ - dir = 5 - }, -/obj/machinery/light_switch/directional/east, -/obj/machinery/disposal/bin{ - desc = "A pneumatic waste disposal unit. This one leads to the morgue."; - name = "corpse disposal" - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/iron/dark/small, -/area/station/medical/chemistry) "cPd" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 4 @@ -6738,20 +7303,6 @@ /obj/effect/turf_decal/siding/blue/corner, /turf/open/floor/iron/white/small, /area/station/medical/storage) -"cPj" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 2 - }, -/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/mapping_helpers/mail_sorting/engineering/general, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "cPD" = ( /obj/effect/turf_decal/stripes/end{ dir = 4 @@ -6777,6 +7328,17 @@ }, /turf/open/floor/iron/small, /area/station/engineering/main) +"cPN" = ( +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/showroomfloor, +/area/station/medical/surgery/theatre) +"cPQ" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/ai_monitored/turret_protected/aisat/teleporter) "cQb" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -6982,10 +7544,6 @@ /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/iron, /area/station/engineering/atmos) -"cUo" = ( -/obj/machinery/light/cold/directional/west, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/security/processing) "cUE" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -7027,6 +7585,25 @@ dir = 1 }, /area/station/hallway/primary/aft) +"cVx" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 4 + }, +/obj/structure/rack, +/obj/machinery/airalarm/directional/west, +/obj/effect/spawner/random/armory/laser_gun, +/turf/open/floor/iron/dark/small, +/area/station/ai_monitored/security/armory) +"cVz" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/newscaster/directional/west, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron, +/area/station/science/robotics/augments) "cVC" = ( /obj/machinery/computer/operating{ dir = 1 @@ -7057,6 +7634,7 @@ /area/station/maintenance/department/engine) "cWh" = ( /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/stairs{ dir = 4 }, @@ -7069,15 +7647,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/lesser) -"cWB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/medbay/aft) "cWM" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -7092,6 +7661,18 @@ dir = 1 }, /area/station/hallway/primary/aft) +"cWT" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/pdapainter/research, +/obj/machinery/computer/security/telescreen/rd{ + pixel_y = 30 + }, +/obj/effect/turf_decal/siding/purple{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/rd) "cWZ" = ( /obj/machinery/door/airlock/external{ name = "Primary Docking Bay" @@ -7103,14 +7684,6 @@ dir = 1 }, /area/station/hallway/secondary/entry) -"cXd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/stack/cable_coil, -/obj/item/multitool, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/engine, -/area/station/science/xenobiology) "cXe" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -7216,13 +7789,12 @@ /obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) -"cZv" = ( -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 4 +"cZm" = ( +/obj/effect/landmark/start/hangover, +/turf/open/floor/engine{ + name = "Holodeck Projector Floor" }, -/obj/machinery/light/directional/west, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai) +/area/station/holodeck/rec_center) "cZy" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -7237,7 +7809,11 @@ /obj/item/reagent_containers/cup/bucket, /obj/item/mop, /obj/structure/sink/kitchen/directional/east, -/obj/machinery/airalarm/directional/west, +/obj/machinery/airalarm/directional/south, +/obj/machinery/button/door/directional/west{ + pixel_y = 8; + id = "custodialshutters" + }, /turf/open/floor/iron/white/small, /area/station/service/janitor) "cZM" = ( @@ -7250,11 +7826,14 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark, /area/station/engineering/main) -"cZP" = ( -/obj/machinery/hydroponics/soil, -/obj/item/cultivator/rake, -/turf/open/floor/grass, -/area/station/security/prison/garden) +"dah" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/dark_red/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron, +/area/station/security) "daq" = ( /obj/effect/turf_decal/tile/dark_red/half/contrasted{ dir = 1 @@ -7270,14 +7849,6 @@ dir = 1 }, /area/station/science/lower) -"daT" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/security/prison/work) "dba" = ( /obj/structure/chair/sofa/bench/left{ dir = 4 @@ -7318,6 +7889,17 @@ /obj/effect/spawner/random/structure/girder, /turf/open/floor/noslip/tram_platform, /area/station/maintenance/department/medical/central) +"dbR" = ( +/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/brown/fourcorners, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/navigate_destination/cargo, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "dbU" = ( /obj/structure/cable, /obj/structure/broken_flooring/singular/directional/east, @@ -7333,19 +7915,17 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"dcm" = ( -/obj/machinery/atmospherics/components/tank/carbon_dioxide{ +"dcg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 4 }, -/obj/machinery/light/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/engineering/atmos) -"dcp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) +/obj/machinery/light/directional/north, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "dcG" = ( /obj/machinery/atmospherics/pipe/smart/manifold/pink/visible{ dir = 8 @@ -7371,6 +7951,17 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"dcS" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_red/half/contrasted, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/security/brig/entrance) "ddd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7501,18 +8092,6 @@ /obj/machinery/status_display/ai/directional/north, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) -"dfs" = ( -/obj/machinery/biogenerator, -/turf/open/floor/plating, -/area/station/maintenance/department/prison) -"dfv" = ( -/obj/item/kirbyplants/random, -/obj/item/radio/intercom/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/auxlab/firing_range) "dfB" = ( /obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ dir = 1 @@ -7536,6 +8115,13 @@ /obj/structure/window/spawner/directional/south, /turf/open/floor/grass, /area/station/cargo/storage) +"dfW" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood/parquet, +/area/station/service/library) "dgn" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -7588,6 +8174,22 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/dark, /area/station/engineering/main) +"dhy" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/trunk{ + 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/purple/opposingcorners, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/siding/green{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/cafeteria, +/area/station/science/circuits) "dhK" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -7711,15 +8313,6 @@ dir = 1 }, /area/station/engineering/atmospherics_engine) -"djR" = ( -/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 = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "djU" = ( /obj/machinery/power/smes/engineering, /turf/open/floor/plating, @@ -7754,6 +8347,29 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"dks" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/neutral/full, +/obj/item/reagent_containers/cup/glass/drinkingglass{ + pixel_x = -5; + pixel_y = 22 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass{ + pixel_x = -1; + pixel_y = 13 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass{ + pixel_x = -8; + pixel_y = 6 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass{ + pixel_x = 5; + pixel_y = 4 + }, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/smooth_large, +/area/station/service/bar) "dkz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7798,6 +8414,21 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, /area/station/hallway/secondary/construction) +"dkV" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=6.2-Arrivals"; + location = "6.1-Arrivals" + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/white/corner{ + dir = 8 + }, +/area/station/hallway/secondary/entry) "dkW" = ( /obj/machinery/atmospherics/components/unary/thermomachine/heater{ dir = 4 @@ -7813,6 +8444,15 @@ }, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) +"dlc" = ( +/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/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/iron, +/area/station/commons/dorms) "dll" = ( /obj/machinery/atmospherics/pipe/smart/manifold/cyan{ dir = 4 @@ -7941,17 +8581,10 @@ /obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt, /obj/structure/broken_flooring/singular/directional/east, +/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/aft) -"dog" = ( -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/light/directional/south, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron, -/area/station/engineering/break_room) "doj" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -7997,6 +8630,11 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) +"doX" = ( +/obj/structure/girder, +/obj/effect/decal/cleanable/glass/plastitanium, +/turf/open/floor/plating, +/area/station/commons/fitness/recreation/entertainment) "dps" = ( /obj/machinery/camera/directional/south{ c_tag = "AI Chamber - Aft"; @@ -8075,6 +8713,11 @@ "dqO" = ( /turf/open/floor/iron/dark/small, /area/station/security/checkpoint/customs/auxiliary) +"dqX" = ( +/obj/structure/reagent_dispensers/wall/peppertank/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark, +/area/station/security/office) "dra" = ( /obj/structure/table/wood, /obj/effect/spawner/random/entertainment/lighter, @@ -8082,9 +8725,8 @@ /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) "dry" = ( -/obj/structure/bed/pod{ - desc = "An old medical bed, just waiting for replacement with something up to date."; - name = "medical bed" +/obj/structure/bed/medical{ + dir = 4 }, /obj/item/bedsheet/medical, /obj/machinery/light/small/directional/east, @@ -8092,19 +8734,6 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/iron/showroomfloor, /area/station/medical/virology) -"drM" = ( -/obj/structure/table, -/obj/machinery/microwave{ - pixel_y = 5 - }, -/obj/machinery/light/cold/directional/south, -/obj/machinery/requests_console/directional/south{ - department = "Kitchen"; - name = "Kitchen Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "dse" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -8112,22 +8741,6 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"dsm" = ( -/obj/structure/flora/bush/large/style_random{ - pixel_y = -3 - }, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/turf_decal/siding/wideplating{ - dir = 8 - }, -/turf/open/misc/sandy_dirt, -/area/station/security/tram) -"dso" = ( -/obj/structure/closet/secure_closet/engineering_electrical, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) "dsq" = ( /obj/structure/rack, /obj/effect/decal/cleanable/dirt, @@ -8137,15 +8750,6 @@ /obj/item/airlock_painter, /turf/open/floor/iron/small, /area/station/engineering/atmos) -"dsr" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/delamination_counter/directional/west, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "dst" = ( /obj/effect/turf_decal/siding/white{ dir = 4 @@ -8161,6 +8765,16 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) +"dsL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "dsN" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -8174,22 +8788,16 @@ }, /turf/open/floor/iron, /area/station/security/brig/entrance) +"dtk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/closed/wall, +/area/station/science/ordnance/testlab) "dtq" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) -"dts" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "AI Core shutters"; - name = "AI Core Shutter" - }, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/ai_monitored/turret_protected/ai) "dty" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8197,6 +8805,30 @@ /obj/machinery/light/floor, /turf/open/floor/wood/large, /area/station/service/hydroponics/garden/monastery) +"dtC" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/purple{ + dir = 1 + }, +/obj/structure/table, +/obj/item/storage/box/monkeycubes{ + pixel_x = 16; + pixel_y = 9 + }, +/obj/item/storage/box/monkeycubes{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/item/storage/pill_bottle/mutadone{ + pixel_x = -7; + pixel_y = 13 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm/directional/north, +/obj/machinery/camera/autoname/directional/north, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/science/genetics) "dtH" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -8207,20 +8839,6 @@ }, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) -"dtM" = ( -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/brown/full, -/obj/machinery/chem_dispenser/drinks/beer{ - dir = 1 - }, -/obj/machinery/light/small/directional/south, -/obj/machinery/requests_console/directional/south{ - department = "Bar"; - name = "Bar Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/turf/open/floor/iron/smooth_large, -/area/station/service/bar) "dua" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 4 @@ -8258,24 +8876,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/engineering/atmos) -"duH" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/machinery/atmospherics/components/binary/valve/digital{ - name = "Waste Release" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/south{ - c_tag = "Atmospherics - Secondary" - }, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/station/engineering/atmos) "duI" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/hidden{ dir = 10 @@ -8328,6 +8928,15 @@ /obj/structure/sign/warning/electric_shock, /turf/closed/wall, /area/station/maintenance/department/engine) +"dvs" = ( +/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/airlock/glass{ + name = "Holodeck Access" + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "dvJ" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/dark_red/fourcorners, @@ -8342,21 +8951,18 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) -"dvR" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/maintenance/department/engine/atmos) -"dvW" = ( -/obj/structure/flora/rock/pile/jungle/style_random, -/turf/open/floor/grass, -/area/station/medical/virology) "dwa" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/dark_red/half/contrasted, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/security/tram) +"dwh" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/structure/broken_flooring/corner/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) "dwr" = ( /obj/structure/flora/bush/lavendergrass/style_random, /obj/structure/flora/rock/pile/jungle/style_random, @@ -8366,16 +8972,6 @@ }, /turf/open/misc/sandy_dirt, /area/station/security/tram) -"dwz" = ( -/obj/structure/chair{ - pixel_y = -2 - }, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/maintenance/department/engine/atmos) "dwJ" = ( /obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/plasma{ dir = 4 @@ -8393,6 +8989,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/department/engine/atmos) +"dwT" = ( +/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 = 4 + }, +/obj/effect/landmark/navigate_destination/techstorage, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "dwW" = ( /obj/structure/closet/wardrobe/mixed, /obj/effect/turf_decal/siding/thinplating_new/light{ @@ -8414,6 +9020,7 @@ /area/station/maintenance/department/medical/central) "dxz" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/fore/greater) "dxG" = ( @@ -8460,16 +9067,6 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/plating, /area/station/engineering/atmos/storage/gas) -"dyi" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "dyp" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/decal/cleanable/dirt, @@ -8479,6 +9076,26 @@ }, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) +"dyq" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/effect/turf_decal/bot, +/obj/machinery/computer/security/telescreen/entertainment/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"dyF" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/hallway/primary/central/fore) "dyG" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/corner, @@ -8501,12 +9118,26 @@ /obj/effect/turf_decal/siding/wideplating/dark/corner{ dir = 1 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/security) "dyW" = ( /obj/structure/closet/firecloset, /turf/open/floor/iron/small, /area/station/maintenance/port/lesser) +"dzf" = ( +/obj/structure/hoop{ + dir = 8; + pixel_x = 10; + pixel_y = 11 + }, +/obj/effect/turf_decal/trimline/white/end{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/station/commons/fitness/recreation) "dzi" = ( /obj/structure/table/wood, /obj/item/book/granter/action/spell/smoke/lesser{ @@ -8715,15 +9346,11 @@ name = "Study" }, /obj/machinery/door/firedoor, +/obj/structure/cable, /turf/open/floor/iron/smooth_half{ dir = 1 }, /area/station/service/library) -"dCC" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai) "dCH" = ( /obj/structure/table, /obj/item/storage/box/lights/mixed{ @@ -8748,6 +9375,13 @@ dir = 8 }, /area/station/security/office) +"dDd" = ( +/obj/structure/table, +/obj/item/exodrone{ + pixel_y = 8 + }, +/turf/open/floor/iron/smooth, +/area/station/cargo/drone_bay) "dDk" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/chapel{ @@ -8804,19 +9438,6 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/escape) -"dDU" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/r_wall, -/area/station/engineering/atmos) -"dDW" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/structure/industrial_lift/tram/white, -/obj/structure/window/reinforced/tram/mid/directional/north, -/obj/structure/chair/sofa/bench/right, -/turf/open/floor/noslip/tram_platform, -/area/station/maintenance/port/aft) "dEt" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 6 @@ -8832,18 +9453,6 @@ /obj/machinery/vending/cigarette, /turf/open/floor/iron/kitchen/small, /area/station/security/breakroom) -"dEK" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Mix to Distro" - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/pumproom) "dER" = ( /obj/machinery/power/emitter, /obj/effect/turf_decal/stripes/white/line{ @@ -8893,6 +9502,11 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"dHi" = ( +/obj/machinery/door/firedoor, +/obj/effect/landmark/navigate_destination/bar, +/turf/open/floor/catwalk_floor/iron, +/area/station/service/bar) "dHk" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 8 @@ -8927,8 +9541,16 @@ /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/plating, /area/station/maintenance/starboard/aft) +"dHT" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "dIe" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -8986,6 +9608,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/small, /area/station/science/xenobiology) +"dJd" = ( +/obj/machinery/computer/records/security, +/turf/open/floor/wood/tile, +/area/station/command/heads_quarters/hop) "dJe" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -9065,14 +9691,14 @@ name = "Privacy Bolts"; normaldoorcontrol = 1; pixel_x = -32; - pixel_y = 26; + pixel_y = 35; specialfunctions = 4 }, /obj/machinery/button/door/directional/north{ id = "com_guest2"; name = "Privacy Shutters"; pixel_x = -32; - pixel_y = 35 + pixel_y = 26 }, /turf/open/floor/wood/large, /area/station/command/corporate_suite) @@ -9095,6 +9721,11 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos/storage/gas) +"dKQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/layer3, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "dLb" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ @@ -9131,11 +9762,6 @@ /obj/structure/chair/office, /turf/open/floor/iron/dark/herringbone, /area/station/security/execution/education) -"dLu" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/iron/dark, -/area/station/science/ordnance) "dLy" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 4 @@ -9176,6 +9802,25 @@ }, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) +"dMj" = ( +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/head/cone{ + pixel_x = 9; + pixel_y = -4 + }, +/turf/open/floor/iron/dark/side{ + dir = 5 + }, +/area/station/engineering/atmos) "dMm" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/turf_decal/stripes/line{ @@ -9184,17 +9829,6 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/plating, /area/station/construction/mining/aux_base) -"dMn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/closed/wall, -/area/station/science/ordnance/testlab) -"dMF" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/hidden{ - dir = 9 - }, -/obj/machinery/light/floor, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "dMM" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron, @@ -9208,36 +9842,27 @@ /obj/item/wrench, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) -"dNa" = ( -/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/blue{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/iron/white/corner{ - dir = 1 - }, -/area/station/hallway/secondary/dock) "dNi" = ( -/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/effect/turf_decal/stripes/line{ +/obj/machinery/power/shuttle_engine/heater{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/iron/dark/side, -/area/station/science/xenobiology) +/obj/structure/window/spawner/directional/south, +/turf/open/floor/plating, +/area/station/commons/fitness/recreation/entertainment) "dNq" = ( /turf/closed/wall/r_wall/rust, /area/station/ai_monitored/aisat/exterior) +"dNw" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/door/airlock/multi_tile/public/glass{ + name = "Library" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/textured_half, +/area/station/service/library) "dNy" = ( /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, @@ -9248,6 +9873,10 @@ }, /turf/open/floor/wood/tile, /area/station/science/lower) +"dNG" = ( +/obj/structure/chair/stool/directional/south, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/station/maintenance/starboard/central) "dNI" = ( /obj/structure/chair/sofa/left/maroon, /obj/machinery/light/small/directional/east, @@ -9275,6 +9904,7 @@ /area/station/hallway/secondary/entry) "dOb" = ( /obj/structure/broken_flooring/singular/directional/east, +/obj/structure/alien/weeds, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) "dOd" = ( @@ -9305,13 +9935,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/commons/storage/tools) -"dOP" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/tank/oxygen{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/science/ordnance/storage) "dOT" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -9326,12 +9949,6 @@ }, /turf/open/floor/wood, /area/station/security/detectives_office) -"dOZ" = ( -/obj/machinery/light/floor, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/layer3, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "dPa" = ( /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) @@ -9373,12 +9990,13 @@ /obj/structure/broken_flooring/singular/directional/south, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"dQA" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output{ - dir = 8 - }, -/turf/open/floor/engine/n2o, -/area/station/ai_monitored/turret_protected/ai) +"dQP" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/autoname/directional/west, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/recreation) "dQQ" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 9 @@ -9402,14 +10020,6 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron, /area/station/maintenance/department/engine/atmos) -"dRc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/cold/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) "dRf" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -9529,6 +10139,14 @@ /obj/machinery/meter, /turf/open/floor/plating, /area/station/engineering/atmos) +"dTa" = ( +/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/dark_red/half/contrasted, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "dTg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -9548,12 +10166,16 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron, /area/station/maintenance/department/engine/atmos) -"dTu" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/meter, +"dTB" = ( +/obj/structure/broken_flooring/pile/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/south, +/obj/structure/alien/weeds, +/obj/structure/alien/weeds, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, -/area/station/engineering/atmos) +/area/station/maintenance/starboard/greater) "dTI" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -9574,6 +10196,30 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"dUr" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/yellow/line, +/obj/effect/landmark/navigate_destination/incinerator, +/turf/open/floor/iron/smooth_corner{ + dir = 8 + }, +/area/station/maintenance/disposal/incinerator) +"dUA" = ( +/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/end{ + dir = 1 + }, +/obj/machinery/meter, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/station/security/execution/education) "dUC" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -9597,17 +10243,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark/small, /area/station/science/xenobiology) -"dUP" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/effect/turf_decal/siding/green{ - dir = 9 - }, -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/cafeteria, -/area/station/science/circuits) "dUT" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /obj/machinery/computer/atmos_control/nitrogen_tank{ @@ -9658,14 +10293,14 @@ /obj/effect/landmark/start/depsec/supply, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/supply) -"dWm" = ( -/obj/structure/cable, -/obj/item/clothing/shoes/griffin{ - pixel_x = 7; - pixel_y = 7 +"dWh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/maintenance/port/aft) +/obj/structure/sign/departments/science/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "dWp" = ( /obj/machinery/field/generator, /obj/effect/turf_decal/stripes/white/line{ @@ -9754,6 +10389,18 @@ /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor/iron, /area/station/science/lower) +"dXo" = ( +/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/siding/red{ + dir = 6 + }, +/turf/open/floor/iron/white/small, +/area/station/security/warden) "dXE" = ( /obj/structure/disposalpipe/trunk{ dir = 1 @@ -9796,6 +10443,13 @@ dir = 9 }, /area/station/engineering/atmos) +"dXO" = ( +/obj/effect/spawner/structure/window/reinforced/tinted, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/service/janitor) "dXT" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 4 @@ -9810,6 +10464,16 @@ dir = 9 }, /area/station/engineering/atmos) +"dXU" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/science/xenobiology) "dYc" = ( /obj/structure/table, /obj/machinery/recharger{ @@ -9826,6 +10490,12 @@ }, /turf/open/floor/iron/dark, /area/station/security/lockers) +"dYf" = ( +/obj/effect/spawner/random/entertainment/arcade{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "dYj" = ( /obj/structure/table, /obj/effect/turf_decal/tile/dark_red, @@ -9836,6 +10506,16 @@ }, /turf/open/floor/iron/dark, /area/station/security/processing) +"dYo" = ( +/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 + }, +/obj/effect/landmark/navigate_destination/gateway, +/turf/open/floor/iron, +/area/station/maintenance/hallway/abandoned_command) "dYp" = ( /obj/structure/table, /obj/item/wrench, @@ -9860,17 +10540,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/small, /area/station/security/brig) -"dYG" = ( -/obj/machinery/hydroponics/constructable, -/obj/machinery/light/cold/directional/west, -/turf/open/floor/iron/white/small, -/area/station/service/hydroponics/garden) "dYI" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"dYM" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/closet/secure_closet/psychology, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white/small, +/area/station/medical/psychology) "dYR" = ( /obj/machinery/door/airlock{ name = "Maintenance" @@ -9912,12 +10593,27 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"dZm" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/maintenance/port/fore) "dZn" = ( /obj/machinery/ai_slipper{ uses = 10 }, /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/turret_protected/ai) +"dZp" = ( +/obj/item/kirbyplants/random, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white, +/area/station/science/auxlab/firing_range) "dZD" = ( /obj/machinery/camera/directional/south{ c_tag = "AI Chamber - Core"; @@ -9943,13 +10639,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"eaf" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 1 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark/side, -/area/station/security/execution/transfer) "eag" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 4; @@ -9966,6 +10655,11 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/dock) +"eax" = ( +/obj/item/shovel, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/department/prison) "eaA" = ( /obj/machinery/conveyor{ dir = 8; @@ -10015,6 +10709,18 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/smooth, /area/station/engineering/atmos/pumproom) +"ebe" = ( +/obj/structure/hoop{ + dir = 4; + pixel_x = -10; + pixel_y = 11 + }, +/obj/effect/turf_decal/trimline/white/end{ + dir = 4 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, +/area/station/commons/fitness/recreation) "ebj" = ( /obj/structure/cable, /obj/machinery/door/airlock/atmos{ @@ -10023,12 +10729,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/engineering/atmos/pumproom) -"ebv" = ( -/obj/structure/table, -/obj/effect/spawner/random/techstorage/command_all, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/iron, -/area/station/engineering/storage/tech) "ebx" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 9 @@ -10062,6 +10762,7 @@ "ecL" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/transit_tube/horizontal, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "ecQ" = ( @@ -10077,9 +10778,21 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat/teleporter) +"ede" = ( +/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, +/turf/open/floor/iron/white/side{ + dir = 1 + }, +/area/station/science/research) "edD" = ( /obj/machinery/light/small/directional/west, /obj/item/kirbyplants/random, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) "edJ" = ( @@ -10124,6 +10837,15 @@ /obj/effect/spawner/random/structure/girder, /turf/open/floor/noslip/tram_platform, /area/station/maintenance/department/medical/central) +"eeb" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/stairs{ + dir = 8 + }, +/area/station/cargo/storage) "eeg" = ( /turf/open/floor/iron/smooth_large, /area/station/engineering/atmos) @@ -10140,24 +10862,28 @@ }, /turf/open/space/basic, /area/space) +"eex" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/station/science/xenobiology) "eeD" = ( /obj/structure/showcase/cyborg/old{ pixel_y = 20 }, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat_interior) +"eeF" = ( +/obj/structure/table, +/obj/item/wirecutters, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, +/area/station/engineering/storage/tech) "eeJ" = ( /turf/closed/wall, /area/station/commons/fitness/locker_room) -"eeN" = ( -/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, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) "efa" = ( /obj/effect/turf_decal/delivery, /obj/structure/cable, @@ -10171,6 +10897,13 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) +"efj" = ( +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/cafeteria, +/area/station/service/cafeteria) "efp" = ( /obj/structure/cable, /obj/machinery/power/smes{ @@ -10184,6 +10917,12 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/lesser) +"efy" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/machinery/status_display/ai/directional/west, +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/iron/smooth, +/area/station/ai_monitored/turret_protected/aisat/foyer) "efB" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -10215,6 +10954,19 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) +"efS" = ( +/obj/machinery/computer/security/qm{ + dir = 1 + }, +/obj/structure/sign/poster/official/random/directional/south, +/obj/machinery/requests_console/directional/east{ + department = "Quartermaster's Desk"; + name = "Quartermaster's Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/supplies, +/turf/open/floor/wood, +/area/station/command/heads_quarters/qm) "egb" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -10231,16 +10983,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor/iron_dark, /area/station/science/xenobiology) -"egy" = ( -/obj/structure/table, -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/decal/cleanable/dirt, -/obj/item/hand_labeler, -/obj/item/camera, -/obj/machinery/firealarm/directional/north, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/iron, -/area/station/commons/storage/art) "egG" = ( /obj/effect/landmark/start/medical_doctor, /obj/item/radio/intercom/directional/south, @@ -10249,6 +10991,7 @@ /area/station/medical/storage) "egN" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/chapel, /area/station/maintenance/starboard/greater) "ehj" = ( @@ -10264,6 +11007,15 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"ehV" = ( +/obj/structure/cable, +/obj/structure/chair/sofa/right{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/landmark/start/paramedic, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "ehZ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -10334,12 +11086,16 @@ /turf/open/floor/iron, /area/station/security) "ejn" = ( -/obj/structure/frame, /obj/item/stack/cable_coil/five, -/obj/item/circuitboard/computer/arcade, /obj/effect/decal/cleanable/cobweb, +/obj/effect/spawner/random/techstorage/arcade_boards, +/obj/structure/frame/computer, /turf/open/floor/eighties/red, /area/station/service/abandoned_gambling_den/gaming) +"ejq" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/bitrunning/den) "ejt" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -10356,6 +11112,10 @@ /obj/machinery/atmospherics/pipe/layer_manifold/orange/visible, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) +"ejV" = ( +/mob/living/basic/mining/basilisk, +/turf/open/misc/asteroid, +/area/space/nearstation) "eki" = ( /obj/machinery/door/airlock/maintenance{ name = "Maintenance" @@ -10364,17 +11124,36 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating/rust, /area/station/maintenance/department/engine/atmos) +"ekr" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 1 + }, +/obj/machinery/computer/prisoner/management{ + dir = 4 + }, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/requests_console/directional/north{ + department = "Head of Security's Desk"; + name = "Head of Security Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/machinery/camera/autoname/directional/west, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/stone, +/area/station/command/heads_quarters/hos) "eku" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/command/heads_quarters/hop) -"ekE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/cold/directional/west, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/glass, -/area/station/command/heads_quarters/rd) +"ekF" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/holopad, +/obj/structure/cable, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/captain/private) "ekL" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 9 @@ -10423,6 +11202,15 @@ }, /turf/open/floor/iron, /area/station/medical/chemistry) +"ely" = ( +/obj/structure/closet/emcloset, +/obj/machinery/newscaster/directional/west, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/cafeteria, +/area/station/hallway/secondary/exit/departure_lounge) "elC" = ( /obj/structure/table/glass, /obj/machinery/computer/records/medical/laptop{ @@ -10523,6 +11311,14 @@ /obj/structure/reagent_dispensers/plumbed, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) +"enb" = ( +/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, +/obj/effect/landmark/navigate_destination/aiupload, +/turf/open/floor/iron/white, +/area/station/hallway/primary/starboard) "enm" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -10543,8 +11339,19 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) +"enD" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/camera/autoname/directional/west, +/obj/machinery/light_switch/directional/west, +/turf/open/floor/iron, +/area/station/service/hydroponics) "enE" = ( /obj/item/cultivator/rake, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/plating, /area/station/maintenance/department/prison) "enG" = ( @@ -10566,12 +11373,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"eoj" = ( -/obj/structure/table, -/obj/machinery/light/dim/directional/south, -/obj/item/reagent_containers/cup/glass/drinkingglass, -/turf/open/floor/iron/cafeteria, -/area/station/security/prison/mess) "eop" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 6 @@ -10595,6 +11396,20 @@ /obj/structure/broken_flooring/pile/directional/east, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"eoG" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/east, +/obj/machinery/computer/atmos_control/nocontrol/incinerator{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/turf/open/floor/iron/smooth_edge{ + dir = 4 + }, +/area/station/maintenance/disposal/incinerator) "eoK" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/green/visible, /obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{ @@ -10633,6 +11448,28 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/circuit, /area/station/tcommsat/server) +"epn" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/blue/full, +/obj/item/folder/white{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/paper_bin{ + pixel_x = 5; + pixel_y = 8 + }, +/obj/item/pen{ + pixel_x = 6; + pixel_y = 8 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medlock"; + name = "Lockdown Shutters" + }, +/turf/open/floor/iron/white/textured_large, +/area/station/medical/medbay/lobby) "epq" = ( /obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ dir = 8 @@ -10663,26 +11500,6 @@ /obj/machinery/holopad, /turf/open/floor/iron, /area/station/security/prison/rec) -"epA" = ( -/obj/machinery/atmospherics/pipe/smart/simple/pink/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/head/cone{ - pixel_x = 9; - pixel_y = -4 - }, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/station/engineering/atmos) "epN" = ( /obj/machinery/atmospherics/pipe/smart/simple/general/visible{ dir = 4 @@ -10782,20 +11599,6 @@ dir = 1 }, /area/station/engineering/atmos) -"eru" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos) "erA" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -10823,19 +11626,6 @@ /obj/machinery/computer/records/security, /turf/open/floor/iron/small, /area/station/security/office) -"esc" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Air to Pure" - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos) "esv" = ( /obj/docking_port/stationary{ dwidth = 4; @@ -10874,6 +11664,21 @@ }, /turf/open/floor/iron/smooth, /area/station/engineering/atmos/pumproom) +"esF" = ( +/obj/structure/cable, +/obj/item/kirbyplants/organic/applebush, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/captain/private) +"esI" = ( +/obj/effect/turf_decal/tile/green/half/contrasted, +/obj/machinery/computer/pandemic, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/virology) "esP" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -10902,6 +11707,10 @@ dir = 8 }, /area/station/maintenance/starboard/greater) +"ets" = ( +/obj/machinery/sparker/directional/north, +/turf/open/floor/iron/dark/smooth_large, +/area/station/security/execution/education) "etv" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash, @@ -10940,6 +11749,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/engineering/atmos/pumproom) +"euq" = ( +/obj/structure/cable, +/obj/item/kirbyplants/random/fullysynthetic, +/obj/machinery/airalarm/directional/west, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron, +/area/station/security/prison/rec) "eux" = ( /obj/effect/turf_decal/tile/dark_red{ dir = 8 @@ -10951,6 +11767,17 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security) +"euK" = ( +/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/effect/decal/cleanable/dirt, +/obj/effect/landmark/navigate_destination/janitor, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/commons/dorms) "euO" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -10980,6 +11807,12 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"eva" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/security/execution/education) "evb" = ( /obj/structure/disposalpipe/trunk{ dir = 8 @@ -11035,16 +11868,6 @@ /obj/effect/landmark/start/station_engineer, /turf/open/floor/iron/smooth, /area/station/engineering/break_room) -"evz" = ( -/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/floor, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/break_room) "evE" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -11054,13 +11877,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/engineering/break_room) -"evH" = ( -/obj/machinery/atmospherics/components/tank/nitrous{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/rust, -/area/station/engineering/atmos) "evP" = ( /obj/structure/disposalpipe/trunk{ dir = 4 @@ -11076,12 +11892,27 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/engineering/break_room) -"ewb" = ( -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/west, -/turf/open/floor/iron/dark, -/area/station/science/ordnance) +"ewi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/cold/directional/west, +/obj/machinery/duct, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"ewo" = ( +/obj/effect/turf_decal/box/corners{ + dir = 4 + }, +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, +/obj/machinery/plumbing/growing_vat{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/science/cytology) "ewy" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -11138,14 +11969,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"exK" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/turf_decal/tile/green/anticorner/contrasted, -/obj/structure/table/glass, -/obj/machinery/light/cold/directional/south, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron/white, -/area/station/medical/virology) "exR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -11161,18 +11984,12 @@ /obj/structure/sink/directional/east, /turf/open/floor/iron/white, /area/station/medical/virology) -"eyo" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/east, -/obj/machinery/computer/atmos_control/nocontrol/incinerator{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth_edge{ +"eyi" = ( +/obj/structure/chair/plastic{ dir = 4 }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/smooth, /area/station/maintenance/disposal/incinerator) "eyv" = ( /obj/effect/turf_decal/tile/red/fourcorners, @@ -11181,6 +11998,11 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/break_room) +"eyz" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/chair/stool/directional/west, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "eyB" = ( /obj/structure/cable, /obj/machinery/door/firedoor, @@ -11226,6 +12048,21 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"ezx" = ( +/obj/machinery/modular_computer/preset/id{ + dir = 1 + }, +/obj/machinery/requests_console/directional/east{ + department = "Captain's Desk"; + name = "Captain's Requests Console"; + pixel_x = 0; + pixel_y = -30 + }, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/captain) "ezE" = ( /obj/vehicle/ridden/secway, /turf/open/floor/plating, @@ -11251,6 +12088,19 @@ }, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat/teleporter) +"eAc" = ( +/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/command/glass, +/obj/effect/mapping_helpers/airlock/access/any/command/hop, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark/textured_half, +/area/station/command/heads_quarters/hop) +"eAf" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/cargo/storage) "eAn" = ( /obj/machinery/computer/mech_bay_power_console, /obj/effect/turf_decal/siding/thinplating_new/light{ @@ -11259,6 +12109,12 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/smooth_large, /area/station/science/robotics/mechbay) +"eAo" = ( +/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/grimy, +/area/station/commons/vacant_room/office) "eAu" = ( /obj/structure/cable, /obj/machinery/power/tracker, @@ -11283,6 +12139,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat/teleporter) +"eAR" = ( +/obj/structure/chair{ + name = "Defense" + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, +/area/station/security/courtroom) "eAU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/window/right/directional/south{ @@ -11323,17 +12189,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/medical/paramedic) -"eBx" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research{ - name = "Telecomms Storage" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white/textured_half, -/area/station/hallway/primary/starboard) "eBH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -11381,7 +12236,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/chair/office/tactical, /turf/open/floor/iron/small, /area/station/medical/morgue) "eBV" = ( @@ -11484,6 +12338,15 @@ /obj/item/stamp/head/hos, /turf/open/floor/carpet/red, /area/station/command/heads_quarters/hos) +"eEl" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/structure/industrial_lift/tram/white, +/obj/structure/window/reinforced/tram/directional/south, +/obj/structure/chair/sofa/bench/left{ + dir = 1 + }, +/turf/open/floor/noslip/tram_platform, +/area/station/maintenance/port/aft) "eEq" = ( /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/stripes/corner, @@ -11492,14 +12355,6 @@ /obj/machinery/camera/directional/west, /turf/open/floor/iron/smooth, /area/station/commons/storage/tools) -"eEN" = ( -/obj/machinery/computer/security/hos{ - dir = 4 - }, -/obj/machinery/light/small/directional/west, -/obj/machinery/keycard_auth/directional/south, -/turf/open/floor/carpet/red, -/area/station/command/heads_quarters/hos) "eFc" = ( /obj/effect/turf_decal/tile/blue, /obj/machinery/firealarm/directional/west, @@ -11513,54 +12368,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat/equipment) -"eFf" = ( -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/obj/structure/table/glass, -/obj/item/assembly/timer{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/assembly/igniter{ - pixel_x = 3; - pixel_y = -7 - }, -/obj/item/assembly/timer{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/assembly/igniter{ - pixel_x = 3; - pixel_y = -7 - }, -/obj/item/assembly/timer{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/assembly/igniter{ - pixel_x = 3; - pixel_y = -7 - }, -/obj/item/assembly/timer{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/assembly/igniter{ - pixel_x = 3; - pixel_y = -7 - }, -/obj/item/storage/pill_bottle/epinephrine{ - pixel_x = 8; - pixel_y = 5 - }, -/obj/machinery/button/door/directional/east{ - id = "pharmacy_shutters"; - name = "Pharmacy Shutters Control"; - req_access = list("pharmacy") - }, -/turf/open/floor/iron/dark, -/area/station/medical/pharmacy) "eFi" = ( /obj/structure/frame/machine, /turf/open/floor/noslip/tram_platform, @@ -11586,6 +12393,14 @@ }, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat/equipment) +"eFt" = ( +/obj/machinery/processor/slime, +/obj/effect/turf_decal/siding/white{ + dir = 6 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "eFv" = ( /obj/machinery/light/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11622,6 +12437,17 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) +"eFQ" = ( +/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/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/landmark/navigate_destination/eva, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "eFV" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/circuit, @@ -11642,6 +12468,21 @@ /obj/effect/turf_decal/delivery/red, /turf/open/floor/iron/dark/small, /area/station/medical/medbay/lobby) +"eGc" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/research{ + name = "Development Division Access" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sci-entrance" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/unres, +/turf/open/floor/iron/white/textured_half{ + dir = 1 + }, +/area/station/science/lobby) "eGl" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/siding/wood{ @@ -11718,6 +12559,13 @@ }, /turf/open/floor/iron/large, /area/station/command/heads_quarters/hop) +"eHs" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron, +/area/station/security/prison/workout) "eHy" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -11728,6 +12576,10 @@ /obj/structure/holosign/barrier/atmos/tram, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"eHN" = ( +/obj/structure/cable, +/turf/open/floor/wood/tile, +/area/station/maintenance/port/lesser) "eHR" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /obj/effect/spawner/structure/window/reinforced, @@ -11752,6 +12604,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"eIp" = ( +/obj/structure/cable/layer3, +/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/light/floor, +/turf/open/floor/iron/dark/textured, +/area/station/ai_monitored/turret_protected/ai) "eIM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/sorting/mail/flip{ @@ -11785,19 +12645,38 @@ /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"eJp" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/simple/brown/visible{ - dir = 6 +"eJm" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/iron/dark/side{ + dir = 8 }, -/turf/open/floor/plating, -/area/station/engineering/atmos) +/area/station/science/lab) "eJw" = ( /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/rec) +"eJH" = ( +/obj/structure/urinal/directional/west, +/turf/open/misc/asteroid/airless, +/area/space/nearstation) +"eJP" = ( +/obj/machinery/mech_bay_recharge_port{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/asteroid/end, +/turf/open/floor/circuit/green, +/area/station/science/robotics/mechbay) +"eJY" = ( +/obj/effect/turf_decal/tile/green/diagonal_centre, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/diagonal, +/area/station/hallway/primary/central/aft) "eJZ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -11848,14 +12727,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"eKT" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/simple/brown/visible{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/engineering/atmos) "eKU" = ( /turf/closed/wall/r_wall/rust, /area/station/engineering/atmos/pumproom) @@ -11865,19 +12736,11 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"eKY" = ( -/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/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, +"eKX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, -/area/station/hallway/primary/fore) +/area/station/commons/fitness/recreation/entertainment) "eLn" = ( /obj/machinery/door/airlock/glass{ name = "Gold Standard Law Firm" @@ -11886,6 +12749,19 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/grimy, /area/station/maintenance/starboard/greater) +"eLx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/command/glass{ + name = "E.V.A. Storage" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/command/eva, +/turf/open/floor/iron/smooth_half{ + dir = 1 + }, +/area/station/ai_monitored/command/storage/eva) "eLE" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -11928,30 +12804,6 @@ dir = 8 }, /area/station/engineering/break_room) -"eLY" = ( -/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/vault{ - name = "Vault" - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/access/all/supply/vault, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/catwalk_floor, -/area/station/ai_monitored/command/nuke_storage) -"eMj" = ( -/obj/machinery/modular_computer/console/preset/cargochat/engineering{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/engineering/break_room) "eMl" = ( /obj/effect/turf_decal/tile/blue, /obj/machinery/camera/autoname/directional/west, @@ -11977,6 +12829,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) +"eMV" = ( +/obj/structure/table, +/obj/item/folder/yellow{ + pixel_x = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/stack/sheet/mineral/plasma/thirty, +/turf/open/floor/iron/small, +/area/station/engineering/engine_smes) "eNb" = ( /obj/effect/turf_decal/stripes/white/line, /obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ @@ -12033,6 +12897,15 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) +"eNV" = ( +/obj/machinery/modular_computer/preset/cargochat/engineering{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/engineering/break_room) "eOo" = ( /obj/machinery/atmospherics/pipe/smart/simple/supply/visible{ dir = 9 @@ -12059,16 +12932,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) -"eOT" = ( -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/south{ - c_tag = "Engineering - Desk" - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/break_room) "eOZ" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/machinery/airalarm/directional/north, @@ -12092,6 +12955,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth, /area/station/engineering/break_room) +"ePV" = ( +/obj/structure/cable, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/iron/dark/small, +/area/station/security/brig) +"ePX" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/structure/table/glass, +/obj/item/folder/red, +/obj/item/pen, +/obj/machinery/airalarm/directional/west, +/obj/item/paper/monitorkey, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/server) "eQa" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/half/contrasted, @@ -12128,6 +13008,12 @@ "eQt" = ( /turf/closed/wall, /area/station/command/heads_quarters/rd) +"eQv" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/carpet/lone, +/area/station/service/theater) "eQz" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ dir = 8 @@ -12153,26 +13039,18 @@ /obj/machinery/computer/security/telescreen/entertainment/directional/south, /turf/open/floor/iron, /area/station/engineering/break_room) +"eQQ" = ( +/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/dark/smooth_edge{ + dir = 1 + }, +/area/station/maintenance/starboard/greater) "eQR" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/smooth, /area/station/maintenance/solars/port/aft) -"eQX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/server) -"eRp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/light/dim/directional/south, -/turf/open/floor/iron/dark/side{ - dir = 6 - }, -/area/station/hallway/secondary/construction) "eRX" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12300,13 +13178,34 @@ /obj/effect/landmark/start/roboticist, /turf/open/floor/iron/grimy, /area/station/science/cubicle) -"eTo" = ( -/obj/effect/turf_decal/tile/yellow/half/contrasted{ +"eTq" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/structure/window/reinforced/tram/directional/east, +/obj/structure/chair/comfy/shuttle, +/obj/structure/industrial_lift/tram, +/turf/open/floor/noslip/tram_platform, +/area/station/security/tram) +"eTr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/kirbyplants/random/fullysynthetic, +/turf/open/floor/iron, +/area/station/security/prison) +"eTt" = ( +/obj/structure/disposalpipe/sorting/mail{ dir = 8 }, -/obj/machinery/chem_mass_spec, -/turf/open/floor/iron/dark, -/area/station/medical/pharmacy) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/mail_sorting/service/hydroponics, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/landmark/navigate_destination/hydro, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "eTu" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 10 @@ -12326,6 +13225,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/atmos) +"eTT" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/west, +/obj/machinery/light/floor, +/turf/open/floor/iron/white/small, +/area/station/science/cubicle) "eUb" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12364,6 +13271,7 @@ /obj/effect/turf_decal/sand/plating, /obj/structure/table, /obj/item/stack/ore/bananium, +/obj/structure/alien/weeds, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "eUH" = ( @@ -12380,15 +13288,23 @@ /obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"eUX" = ( -/obj/structure/closet/secure_closet/engineering_electrical, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) +"eUW" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood/parquet, +/area/station/service/library) "eVb" = ( /obj/structure/closet/secure_closet/engineering_welding, /turf/open/floor/iron/small, /area/station/engineering/atmos) +"eVd" = ( +/obj/structure/cable, +/obj/item/clothing/shoes/griffin{ + pixel_x = 7; + pixel_y = 7 + }, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/port/aft) "eVe" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 6 @@ -12399,15 +13315,6 @@ }, /turf/open/floor/noslip/tram_platform, /area/station/maintenance/port/aft) -"eVm" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/smooth, -/area/station/ai_monitored/turret_protected/aisat/teleporter) "eVu" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/chair/sofa/bench{ @@ -12427,21 +13334,27 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/official/random/directional/south, +/obj/machinery/airalarm/directional/west, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat_interior) "eVI" = ( /obj/effect/turf_decal/tile/dark_red/half/contrasted, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/escape) -"eWd" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/modular_computer/console/preset/cargochat/service{ - dir = 4 +"eVM" = ( +/obj/structure/hedge, +/obj/machinery/status_display/evac/directional/west, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"eWB" = ( +/obj/effect/turf_decal/tile/dark_red/half/contrasted{ + dir = 1 }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/kitchen/small, -/area/station/hallway/secondary/service) +/obj/effect/landmark/secequipment, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/security/tram) "eWD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, @@ -12449,6 +13362,14 @@ "eWI" = ( /turf/closed/wall/r_wall, /area/station/maintenance/aft) +"eWY" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "eXa" = ( /obj/structure/table/reinforced/titaniumglass, /obj/effect/decal/cleanable/dirt, @@ -12469,11 +13390,6 @@ "eXo" = ( /turf/closed/wall/r_wall, /area/station/tcommsat/server) -"eXx" = ( -/obj/structure/closet/secure_closet/engineering_welding, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) "eXy" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/table, @@ -12509,6 +13425,17 @@ }, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat/equipment) +"eYm" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/reagent_dispensers/watertank, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "eYn" = ( /obj/machinery/computer/monitor{ dir = 1 @@ -12531,16 +13458,6 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron/small, /area/station/engineering/atmos) -"eYQ" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/structure/industrial_lift/tram/white, -/obj/structure/window/reinforced/tram/left/directional/north, -/obj/structure/chair/sofa/bench/left, -/obj/machinery/light/small/directional/east, -/turf/open/floor/noslip/tram_platform, -/area/station/maintenance/port/aft) "eYV" = ( /obj/structure/sink/directional/east, /obj/structure/mirror/directional/west, @@ -12572,42 +13489,10 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/plating/rust, /area/station/maintenance/department/engine/atmos) -"eZP" = ( -/obj/structure/table/reinforced, -/obj/item/folder/blue{ - pixel_y = 2 - }, -/obj/item/pen, -/obj/machinery/light/directional/east, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai) -"eZT" = ( -/obj/structure/hedge, -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/obj/machinery/light/cold/directional/north, -/obj/machinery/atmospherics/pipe/smart/simple/dark/hidden{ - dir = 8 - }, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/server) "faj" = ( /obj/machinery/door/airlock/public, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) -"fas" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/yellow/line, -/turf/open/floor/iron/smooth_corner{ - dir = 8 - }, -/area/station/maintenance/disposal/incinerator) "fav" = ( /obj/item/kirbyplants/random/fullysynthetic, /obj/machinery/computer/security/telescreen/entertainment/directional/west, @@ -12630,6 +13515,12 @@ dir = 4 }, /area/station/maintenance/starboard/greater) +"faR" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/station/hallway/secondary/command) "faX" = ( /obj/machinery/light/small/directional/north, /obj/structure/rack, @@ -12662,17 +13553,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) +"fbl" = ( +/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/smooth, +/area/station/hallway/secondary/command) "fbo" = ( /obj/structure/toilet{ dir = 8 }, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) -"fbp" = ( -/obj/machinery/light/small/directional/west, -/obj/item/kirbyplants/random, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "fbq" = ( /obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ dir = 8 @@ -12687,6 +13579,13 @@ }, /turf/open/floor/iron, /area/station/security/tram) +"fbG" = ( +/obj/effect/turf_decal/stripes/white/corner{ + dir = 4 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/small, +/area/station/security/execution/education) "fbM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow/opposingcorners, @@ -12716,12 +13615,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) -"fbQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/iron/white/small, -/area/station/science/ordnance/storage) "fca" = ( /obj/structure/flora/bush/lavendergrass/style_random, /obj/structure/flora/bush/flowers_br/style_random, @@ -12742,6 +13635,27 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating/rust, /area/station/maintenance/department/engine) +"fcn" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/item/kirbyplants/random, +/obj/item/storage/box{ + pixel_x = -8; + pixel_y = 15 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/smooth, +/area/station/service/greenroom) +"fcq" = ( +/obj/structure/alien/weeds, +/turf/open/misc/asteroid, +/area/station/maintenance/starboard/greater) "fcs" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -12827,6 +13741,13 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating/airless, /area/space/nearstation) +"ffD" = ( +/obj/machinery/conveyor/inverted{ + dir = 10; + id = "garbage" + }, +/turf/open/floor/plating, +/area/station/service/janitor) "ffO" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible, /turf/open/floor/plating/airless, @@ -12907,13 +13828,24 @@ }, /turf/open/floor/iron/small, /area/station/security/office) -"fhD" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, +"fhw" = ( +/obj/structure/table, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood/tile, -/area/station/tcommsat/server) +/obj/item/paper_bin, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/commons/storage/art) +"fhC" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/light_switch/directional/west, +/turf/open/floor/iron/cafeteria, +/area/station/service/cafeteria) "fhS" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 5 @@ -12927,6 +13859,7 @@ spawn_loot_chance = 50 }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) "fik" = ( @@ -12942,6 +13875,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, /obj/effect/landmark/atmospheric_sanity/ignore_area, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron/dark, /area/station/security/checkpoint/engineering) "fiD" = ( @@ -12981,13 +13916,12 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/hallway/primary/port) -"fjA" = ( -/obj/structure/cable/layer3, -/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/dark/textured, -/area/station/ai_monitored/turret_protected/ai) +"fjF" = ( +/obj/effect/turf_decal/bot_red, +/obj/structure/sign/poster/official/random/directional/north, +/obj/structure/reagent_dispensers/cooking_oil, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen/coldroom) "fjK" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible, /obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{ @@ -12996,6 +13930,16 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating/airless, /area/space/nearstation) +"fjL" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/structure/chair{ + pixel_y = -2 + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/wood/tile, +/area/station/science/lower) "fjN" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/window/reinforced/spawner/directional/north, @@ -13046,6 +13990,7 @@ /obj/item/mod/module/thermal_regulator, /obj/effect/turf_decal/bot_white, /obj/machinery/status_display/ai/directional/south, +/obj/item/mod/module/signlang_radio, /turf/open/floor/iron/small, /area/station/medical/storage) "fkt" = ( @@ -13061,6 +14006,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"fkT" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/alien/weeds, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) "flg" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 10 @@ -13081,6 +14031,23 @@ }, /turf/open/floor/iron/dark, /area/station/security/interrogation) +"fls" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/glass/plastitanium, +/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/fore/greater) +"flM" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/kirbyplants/organic/applebush, +/turf/open/floor/wood/tile, +/area/station/command/corporate_showroom) "flQ" = ( /turf/open/floor/plating/rust{ initial_gas_mix = "TEMP=2.7" @@ -13104,14 +14071,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"fmm" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/iron/dark/small, -/area/station/engineering/main) "fmq" = ( /obj/structure/closet/crate, /obj/effect/spawner/random/maintenance/three, @@ -13136,19 +14095,10 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/service/chapel/funeral) -"fne" = ( -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/structure/reagent_dispensers/wall/peppertank/directional/east, -/obj/machinery/camera/autoname/directional/east, -/obj/item/screwdriver{ - pixel_y = 10 - }, -/obj/item/restraints/handcuffs, -/turf/open/floor/iron/smooth, -/area/station/security/checkpoint/customs/auxiliary) +"fnd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/closed/wall/r_wall, +/area/station/science/ordnance/testlab) "fni" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/red/opposingcorners{ @@ -13223,11 +14173,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"fod" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/engineering/atmos/pumproom) "foe" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -13267,6 +14212,22 @@ /obj/machinery/vending/security, /turf/open/floor/iron, /area/station/security/lockers) +"foI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/button/door/directional/north{ + id = "Xenolab"; + name = "Test Chamber Blast Doors"; + pixel_x = 26; + pixel_y = -2; + req_access = list("xenobiology") + }, +/obj/machinery/atmospherics/components/binary/pump, +/turf/open/floor/iron/white/side{ + dir = 8 + }, +/area/station/science/xenobiology) "foJ" = ( /turf/closed/wall/r_wall/rust, /area/station/command/heads_quarters/ce) @@ -13338,19 +14299,6 @@ "fpY" = ( /turf/closed/mineral/random/stationside, /area/station/ai_monitored/aisat/exterior) -"fqd" = ( -/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 = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/science/xenobiology) "fqf" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -13411,6 +14359,13 @@ }, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) +"frq" = ( +/obj/machinery/suit_storage_unit/engine, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/engineering/main) "frs" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -13506,6 +14461,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor/iron_dark, /area/station/science/xenobiology) +"fsT" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/circuit, +/area/station/tcommsat/server) "fsV" = ( /obj/structure/cable, /obj/structure/window/reinforced/spawner/directional/east, @@ -13552,6 +14512,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/stone, /area/station/command/heads_quarters/hos) +"fts" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/computer/order_console/bitrunning{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/end{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "ftv" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/structure/table/reinforced, @@ -13604,6 +14576,15 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/engineering/atmos) +"fuj" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/siding/dark_red, +/obj/machinery/computer/records/medical/laptop{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/stone, +/area/station/command/heads_quarters/hos) "fuk" = ( /obj/structure/flora/bush/flowers_br/style_random, /obj/structure/flora/rock/pile/style_random, @@ -13638,6 +14619,13 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating/airless, /area/space/nearstation) +"fuz" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/power/shieldwallgen/xenobiologyaccess, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/cable/multilayer, +/turf/open/floor/plating, +/area/station/science/xenobiology) "fuC" = ( /obj/machinery/door/poddoor/incinerator_atmos_aux, /turf/open/floor/engine/airless, @@ -13660,6 +14648,11 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/iron, /area/station/hallway/primary/port) +"fvz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) "fvC" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -13669,6 +14662,21 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"fvF" = ( +/obj/effect/turf_decal/siding/dark_red, +/obj/machinery/modular_computer/preset/id{ + dir = 1 + }, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/stone, +/area/station/command/heads_quarters/hos) +"fvH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/electropack, +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine, +/area/station/science/xenobiology) "fvJ" = ( /obj/structure/cable, /obj/machinery/computer/apc_control{ @@ -13752,29 +14760,28 @@ "fwS" = ( /turf/open/floor/circuit, /area/station/maintenance/port/aft) +"fwU" = ( +/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/research{ + name = "Development Division Access" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sci-entrance" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/unres, +/turf/open/floor/iron/white/textured_half{ + dir = 1 + }, +/area/station/science/lobby) "fwZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, /area/station/hallway/secondary/entry) -"fxq" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/modular_computer/console/preset/id{ - dir = 8 - }, -/obj/machinery/requests_console/directional/east{ - department = "Research Director's Desk"; - name = "Research Director's Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/effect/turf_decal/siding/purple{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) "fxt" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -13828,6 +14835,13 @@ "fyr" = ( /turf/closed/wall/rust, /area/station/command/heads_quarters/ce) +"fyt" = ( +/obj/structure/chair/sofa/corp{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/wood/tile, +/area/station/command/corporate_showroom) "fyv" = ( /obj/structure/chair/sofa/bench/left{ dir = 4 @@ -13842,6 +14856,13 @@ dir = 1 }, /area/station/hallway/secondary/exit/departure_lounge) +"fyz" = ( +/obj/structure/cable, +/obj/structure/closet/crate/coffin, +/obj/structure/window/spawner/directional/south, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/plating, +/area/station/service/chapel/funeral) "fyH" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -13860,22 +14881,6 @@ /obj/structure/sign/poster/contraband/random/directional/east, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/ce) -"fyU" = ( -/obj/machinery/vending/wardrobe/robo_wardrobe, -/obj/machinery/light/small/directional/west, -/turf/open/floor/catwalk_floor/flat_white, -/area/station/science/robotics/augments) -"fyW" = ( -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/turf_decal/siding/wideplating{ - dir = 8 - }, -/obj/machinery/light/floor{ - pixel_x = -32 - }, -/turf/open/misc/sandy_dirt, -/area/station/security/tram) "fyZ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -13883,6 +14888,12 @@ }, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) +"fzc" = ( +/obj/structure/closet/secure_closet/engineering_electrical, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "fzd" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -13899,6 +14910,11 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating/rust, /area/station/maintenance/department/engine/atmos) +"fzf" = ( +/obj/machinery/vending/boozeomat, +/obj/machinery/light/cold/directional/east, +/turf/closed/wall, +/area/station/service/bar) "fzl" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 9 @@ -13906,6 +14922,10 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/engine, /area/station/engineering/supermatter) +"fzq" = ( +/obj/structure/closet/crate/trashcart/filled, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "fzt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -13926,13 +14946,6 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating/rust, /area/station/ai_monitored/turret_protected/aisat/maint) -"fzS" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/dim/directional/north, -/turf/open/floor/iron, -/area/station/security/prison/rec) "fAe" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -13960,14 +14973,6 @@ }, /turf/closed/wall, /area/station/hallway/primary/starboard) -"fAt" = ( -/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/dark_red/half/contrasted, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/iron, -/area/station/security/execution/transfer) "fAx" = ( /obj/structure/cable, /obj/effect/spawner/random/structure/furniture_parts, @@ -14050,6 +15055,24 @@ dir = 9 }, /area/station/engineering/atmos) +"fAY" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/blue/full, +/obj/item/storage/medkit/o2{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/medkit/o2{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/reagent_containers/cup/bottle/morphine{ + pixel_x = -7; + pixel_y = -11 + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/white/smooth_large, +/area/station/medical/storage) "fAZ" = ( /obj/structure/window/spawner/directional/south, /obj/effect/turf_decal/tile/neutral, @@ -14132,27 +15155,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/engine) -"fBR" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/dark_red{ - dir = 1 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/stone, -/area/station/command/heads_quarters/hos) -"fBT" = ( -/obj/effect/turf_decal/siding/wideplating/dark/corner{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wideplating/dark/corner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/dark_red/half/contrasted, -/obj/machinery/light/cold/directional/north, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/security/brig/entrance) "fBX" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/effect/turf_decal/siding/white{ @@ -14160,6 +15162,13 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"fCf" = ( +/obj/effect/turf_decal/caution{ + dir = 4 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/small, +/area/station/hallway/secondary/exit/departure_lounge) "fCg" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -14195,6 +15204,11 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/engineering/storage/tech) +"fCS" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/dark/small, +/area/station/security/brig) "fDd" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -14221,6 +15235,14 @@ }, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) +"fDp" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/station/hallway/secondary/service) "fDs" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron/smooth, @@ -14242,12 +15264,6 @@ }, /turf/open/floor/iron/textured_large, /area/station/engineering/break_room) -"fDz" = ( -/obj/structure/chair/sofa/bench/right, -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) "fDC" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron, @@ -14283,6 +15299,10 @@ }, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat_interior) +"fDQ" = ( +/obj/machinery/flasher/directional/north, +/turf/open/floor/iron/dark/smooth_large, +/area/station/ai_monitored/turret_protected/ai_upload) "fDS" = ( /obj/structure/lattice/catwalk, /obj/structure/marker_beacon/purple, @@ -14548,12 +15568,6 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/station/science/xenobiology) -"fJo" = ( -/obj/structure/chair/comfy/carp{ - dir = 1 - }, -/turf/open/floor/glass/reinforced, -/area/station/command/bridge) "fJs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -14581,6 +15595,16 @@ }, /turf/open/floor/iron, /area/station/science/xenobiology) +"fJO" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "flamedra"; + name = "Incinerator Conveyor"; + pixel_x = -13; + pixel_y = -4 + }, +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "fJZ" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/tile/yellow{ @@ -14607,25 +15631,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat_interior) -"fKo" = ( -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 5 - }, -/obj/machinery/portable_atmospherics/canister, -/obj/machinery/light/directional/north, -/turf/open/floor/plating, -/area/station/engineering/atmos/storage/gas) -"fKz" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, +"fKx" = ( +/obj/structure/transit_tube/horizontal, +/obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) +/turf/open/space/basic, +/area/space/nearstation) "fKO" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -14673,6 +15684,12 @@ /obj/item/clothing/mask/animal/small/bat, /turf/open/floor/wood/parquet, /area/station/service/greenroom) +"fLt" = ( +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/dinner, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/catwalk_floor/iron, +/area/station/maintenance/department/medical/central) "fLu" = ( /obj/structure/cable/layer3, /obj/structure/cable, @@ -14717,23 +15734,6 @@ }, /turf/open/floor/engine/n2, /area/station/engineering/atmos) -"fMi" = ( -/obj/structure/table/reinforced/titaniumglass, -/obj/item/stack/sheet/plasteel/fifty, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/item/electronics/airlock{ - pixel_x = -16 - }, -/obj/item/electronics/airlock{ - pixel_x = -16; - pixel_y = 7 - }, -/obj/machinery/light/directional/north, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) "fMj" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -14746,15 +15746,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"fMk" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "fMs" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -14801,6 +15792,13 @@ }, /turf/open/floor/iron/cafeteria, /area/station/hallway/secondary/exit/departure_lounge) +"fNb" = ( +/obj/effect/turf_decal/arrows{ + dir = 8 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/small, +/area/station/hallway/secondary/exit/departure_lounge) "fNh" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -14841,6 +15839,7 @@ /obj/structure/broken_flooring/corner/directional/south, /obj/effect/spawner/random/trash/food_packaging, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "fNA" = ( @@ -14852,6 +15851,18 @@ }, /turf/open/floor/engine/air, /area/station/engineering/atmos) +"fNF" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "AI Core shutters"; + name = "AI Core Shutter" + }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/catwalk_floor, +/area/station/ai_monitored/turret_protected/ai) "fNH" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -14901,12 +15912,6 @@ }, /turf/open/floor/engine/air, /area/station/engineering/atmos) -"fOP" = ( -/obj/machinery/modular_computer/console/preset/id{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "fOQ" = ( /obj/structure/cable, /obj/structure/window/reinforced/spawner/directional/north, @@ -14960,6 +15965,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, +/obj/structure/alien/weeds, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "fQi" = ( @@ -14970,27 +15976,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) -"fQo" = ( -/obj/effect/turf_decal/siding/dark_red/corner{ - dir = 4 - }, -/obj/structure/rack, -/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/light/cold/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/small, -/area/station/ai_monitored/security/armory) "fQA" = ( /obj/effect/spawner/random/structure/chair_maintenance{ dir = 8 @@ -14999,12 +15984,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"fQI" = ( -/obj/item/shovel, -/obj/machinery/light/small/directional/east, +"fQG" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/department/prison) +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/recreation) "fQN" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 4 @@ -15060,14 +16046,6 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) -"fRG" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/east, -/obj/machinery/status_display/ai/directional/east, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "fRJ" = ( /obj/effect/turf_decal/tile/blue, /obj/machinery/airalarm/directional/west, @@ -15089,24 +16067,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/security/prison) -"fSh" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/chair/stool/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/command/heads_quarters/ce) -"fSk" = ( -/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/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) "fSq" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/rack, @@ -15192,14 +16152,6 @@ /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/ai_monitored/turret_protected/aisat_interior) -"fTb" = ( -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/obj/machinery/light/cold/directional/east, -/obj/machinery/vending/wardrobe/chem_wardrobe, -/turf/open/floor/iron, -/area/station/medical/chemistry) "fTe" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/aisat_interior) @@ -15227,12 +16179,6 @@ /obj/item/storage/secure/safe/directional/south, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/ce) -"fTC" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/engineering/break_room) "fTD" = ( /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, @@ -15243,11 +16189,38 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"fUb" = ( +/obj/effect/turf_decal/arrows{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/small, +/area/station/hallway/secondary/exit/departure_lounge) "fUh" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/girder, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) +"fUj" = ( +/obj/structure/sign/poster/official/random/directional/north, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/spacebridge) +"fUo" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sci-entrance" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "fUI" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -15322,24 +16295,6 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs) -"fVM" = ( -/obj/structure/table/glass, -/obj/machinery/computer/records/medical/laptop{ - pixel_x = 1; - pixel_y = 10 - }, -/obj/item/clothing/gloves/latex{ - pixel_y = -8 - }, -/obj/item/reagent_containers/spray/cleaner{ - pixel_x = 6; - pixel_y = -5 - }, -/obj/effect/turf_decal/siding/red{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/station/security/medical) "fVU" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -15356,6 +16311,17 @@ /obj/machinery/camera/directional/east, /turf/open/floor/iron, /area/station/service/hydroponics) +"fWr" = ( +/obj/structure/closet/crate, +/obj/structure/barricade/wooden/crude, +/obj/item/stack/cannonball/four, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"fWs" = ( +/obj/structure/cable, +/obj/item/kirbyplants/random, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/port/aft) "fWw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -15366,23 +16332,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security) -"fWH" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance_hatch{ - name = "AISat Maintenance" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/any/command/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/ai_monitored/turret_protected/aisat/maint) "fWJ" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -15450,6 +16399,10 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"fYp" = ( +/obj/effect/landmark/navigate_destination/vault, +/turf/open/floor/glass, +/area/station/hallway/secondary/spacebridge) "fYX" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -15466,6 +16419,17 @@ dir = 8 }, /area/station/security/warden) +"fZp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/computer/telecomms/server{ + dir = 8; + network = "tcommsat" + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/server) "fZq" = ( /obj/machinery/door/window/left/directional/south, /obj/effect/decal/cleanable/dirt, @@ -15481,23 +16445,37 @@ dir = 8 }, /area/station/hallway/secondary/dock) -"fZw" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 +"gad" = ( +/obj/structure/table/bronze, +/obj/item/food/grown/cannabis{ + pixel_x = -11 }, -/obj/machinery/door/airlock/maintenance_hatch{ - name = "AISat Maintenance" +/obj/item/food/grown/cannabis{ + pixel_x = -5; + pixel_y = 5 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/captain/private) +"gal" = ( +/obj/structure/table, +/obj/item/reagent_containers/condiment/saltshaker{ + desc = "Salt. From space oceans, presumably. A staple of modern medicine."; + pixel_x = 8; + pixel_y = 7 }, -/obj/effect/mapping_helpers/airlock/access/any/command/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 +/obj/item/reagent_containers/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 }, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/ai_monitored/turret_protected/aisat/maint) +/obj/item/radio/intercom/directional/east, +/obj/effect/spawner/random/food_or_drink/condiment{ + pixel_x = -8; + pixel_y = 3 + }, +/turf/open/floor/iron/showroomfloor, +/area/station/service/cafeteria) "gan" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/airlock/research{ @@ -15515,6 +16493,13 @@ /obj/machinery/defibrillator_mount/directional/west, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"gaL" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/smooth_large, +/area/station/science/auxlab/firing_range) "gaU" = ( /obj/effect/turf_decal/siding{ dir = 9 @@ -15549,6 +16534,7 @@ "gbD" = ( /obj/machinery/hydroponics/soil, /obj/item/food/grown/mushroom/reishi, +/obj/structure/alien/weeds, /turf/open/misc/asteroid, /area/station/maintenance/starboard/greater) "gbH" = ( @@ -15591,6 +16577,18 @@ /obj/effect/spawner/random/structure/crate_abandoned, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) +"gdn" = ( +/obj/item/kirbyplants/organic/applebush, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/exit/departure_lounge) "gdr" = ( /turf/closed/wall/rust, /area/station/maintenance/fore/lesser) @@ -15619,20 +16617,17 @@ }, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat/foyer) -"gdJ" = ( -/obj/structure/cable, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/iron/smooth, -/area/station/ai_monitored/turret_protected/aisat/foyer) "gea" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) +"geb" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/flashlight/lamp/green, +/turf/open/floor/iron/smooth, +/area/station/maintenance/port/aft) "geg" = ( /obj/machinery/door/airlock{ name = "Gas Lab Maintenance" @@ -15640,16 +16635,6 @@ /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"gem" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/structure/industrial_lift/tram/white, -/obj/structure/window/reinforced/tram/right/directional/south, -/obj/structure/chair/sofa/bench/left{ - dir = 1 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/noslip/tram_platform, -/area/station/maintenance/port/aft) "geu" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -15690,6 +16675,12 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) +"geJ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/security/execution/education) "geQ" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 6 @@ -15708,6 +16699,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/dock) +"geW" = ( +/obj/machinery/computer/security/hos{ + dir = 4 + }, +/obj/machinery/keycard_auth/directional/south, +/turf/open/floor/carpet/red, +/area/station/command/heads_quarters/hos) "gfb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -15735,10 +16733,6 @@ /obj/effect/mapping_helpers/airalarm/mixingchamber_access, /turf/open/floor/iron/dark, /area/station/science/ordnance/freezerchamber) -"gfv" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall, -/area/station/command/heads_quarters/rd) "gfE" = ( /obj/effect/turf_decal/siding/red{ dir = 8 @@ -15767,26 +16761,6 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/dock) -"gfR" = ( -/obj/structure/table, -/obj/item/reagent_containers/condiment/saltshaker{ - desc = "Salt. From space oceans, presumably. A staple of modern medicine."; - pixel_x = 8; - pixel_y = 7 - }, -/obj/item/reagent_containers/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/machinery/light/cold/directional/east, -/obj/item/radio/intercom/directional/east, -/obj/effect/spawner/random/food_or_drink/condiment{ - pixel_x = -8; - pixel_y = 3 - }, -/turf/open/floor/iron/showroomfloor, -/area/station/service/cafeteria) "gfZ" = ( /obj/structure/window/spawner/directional/west, /obj/effect/turf_decal/sand/plating, @@ -15808,20 +16782,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) -"ggn" = ( -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/structure/window/spawner/directional/west, -/obj/effect/turf_decal/stripes/end, -/obj/structure/disposaloutlet{ - dir = 1 - }, -/obj/machinery/status_display/supply{ - pixel_x = 32 - }, -/turf/open/floor/plating, -/area/station/cargo/sorting) "ggv" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15839,6 +16799,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"ggN" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 9 + }, +/turf/open/floor/engine, +/area/station/science/explab) "ggW" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -15909,6 +16875,19 @@ /obj/effect/landmark/start/scientist, /turf/open/floor/iron/white, /area/station/science/cytology) +"ghD" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood, +/obj/structure/table/wood, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/fax{ + fax_name = "Head of Personnel's Office"; + name = "Head of Personnel's Fax Machine" + }, +/turf/open/floor/wood/tile, +/area/station/command/heads_quarters/hop) "ghK" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -15921,6 +16900,12 @@ /obj/machinery/nuclearbomb/selfdestruct, /turf/open/floor/circuit/green, /area/station/ai_monitored/command/nuke_storage) +"ghW" = ( +/obj/machinery/mineral/stacking_machine{ + input_dir = 2 + }, +/turf/open/floor/plating, +/area/station/service/janitor) "gic" = ( /obj/effect/turf_decal/siding/blue{ dir = 8 @@ -15972,31 +16957,62 @@ }, /turf/open/floor/engine/vacuum, /area/station/engineering/atmos) +"giU" = ( +/obj/effect/turf_decal/siding/thinplating_new/terracotta{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/effect/turf_decal/siding/yellow, +/obj/machinery/recharger{ + pixel_x = -7; + pixel_y = 3 + }, +/obj/item/folder/yellow{ + pixel_x = 6; + pixel_y = 3 + }, +/obj/item/assembly/signaler{ + pixel_x = 5; + pixel_y = 6 + }, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/wood/tile, +/area/station/command/bridge) "giY" = ( /obj/structure/window/spawner/directional/west, /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) -"gjm" = ( +"gjr" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/effect/spawner/random/structure/girder, +/obj/machinery/light/small/directional/south, +/turf/open/floor/noslip/tram_platform, +/area/station/maintenance/department/medical/central) +"gjL" = ( /obj/structure/cable, -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/turf/open/floor/iron/checker{ +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 8 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/tcommsat/server) +"gjS" = ( +/obj/effect/turf_decal/siding/thinplating_new/terracotta{ dir = 1 }, -/area/station/security/execution/transfer) +/obj/machinery/modular_computer/preset/command{ + dir = 1 + }, +/obj/effect/turf_decal/siding/yellow, +/turf/open/floor/wood/tile, +/area/station/command/bridge) "gjT" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/mix_output{ dir = 1 }, /turf/open/floor/engine/vacuum, /area/station/engineering/atmos) -"gkb" = ( -/obj/machinery/light/small/directional/west, -/obj/item/kirbyplants/random/fullysynthetic, -/turf/open/floor/iron/white/corner{ - dir = 4 - }, -/area/station/science/xenobiology) "gkw" = ( /obj/structure/cable, /obj/machinery/light_switch/directional/west, @@ -16015,27 +17031,6 @@ /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, /area/station/medical/virology) -"gkL" = ( -/obj/structure/table, -/obj/effect/mapping_helpers/broken_floor, -/obj/item/canvas{ - pixel_x = 13; - pixel_y = 12 - }, -/obj/item/canvas, -/obj/item/canvas{ - pixel_x = 4; - pixel_y = 16 - }, -/obj/item/canvas{ - pixel_y = 15 - }, -/obj/item/canvas{ - pixel_x = 6 - }, -/obj/machinery/light/cold/directional/west, -/turf/open/floor/iron, -/area/station/commons/storage/art) "gkN" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -16044,12 +17039,27 @@ dir = 8 }, /obj/machinery/camera/autoname/directional/west, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"gle" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron, -/area/station/hallway/secondary/recreation) +"gkO" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/structure/window/reinforced/tram/directional/west, +/obj/structure/chair/comfy/shuttle, +/obj/structure/industrial_lift/tram, +/turf/open/floor/noslip/tram_platform, +/area/station/security/tram) +"glb" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/brown/full, +/obj/structure/reagent_dispensers/beerkeg, +/obj/effect/turf_decal/bot_red/left, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/iron/smooth_large, +/area/station/service/bar) "gli" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -16062,17 +17072,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"glt" = ( -/obj/structure/chair/office, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/simple/dark/hidden{ - dir = 8 - }, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/server) "glv" = ( /obj/structure/reagent_dispensers/beerkeg, /obj/structure/sign/picture_frame/portrait/bar{ @@ -16099,12 +17098,14 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"glR" = ( -/obj/item/kirbyplants/random, +"glP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/holopad, /obj/machinery/light/cold/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/station/science/xenobiology) "glY" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/rack, @@ -16116,6 +17117,8 @@ /turf/open/floor/iron/dark, /area/station/medical/medbay/aft) "gmm" = ( +/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/aft) "gmn" = ( @@ -16169,6 +17172,15 @@ /obj/effect/landmark/start/chief_engineer, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) +"gni" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 4 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/small, +/area/station/commons/fitness/locker_room) "gnw" = ( /obj/effect/turf_decal/siding/wideplating_new/light{ dir = 4 @@ -16178,6 +17190,11 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) +"gnA" = ( +/obj/structure/cable, +/obj/machinery/light/small/directional/north, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai) "gnL" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -16216,17 +17233,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/stone, /area/station/command/heads_quarters/hos) -"goH" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/effect/turf_decal/siding/green{ - dir = 10 - }, -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/cafeteria, -/area/station/science/circuits) "goJ" = ( /obj/structure/table, /obj/item/stack/cable_coil, @@ -16296,13 +17302,6 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/dark/small, /area/station/medical/virology) -"gpR" = ( -/obj/structure/cable, -/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/small, -/area/station/science/cubicle) "gpS" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/airlock/engineering{ @@ -16347,13 +17346,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"gqY" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/rack, -/obj/item/pipe_dispenser, -/obj/item/assault_pod/mining, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) "grm" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -16464,7 +17456,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/airalarm/directional/north, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, @@ -16492,15 +17484,13 @@ }, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) -"gui" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/table, -/obj/effect/turf_decal/bot, -/obj/machinery/light_switch/directional/north, -/obj/machinery/light/directional/west, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron/kitchen/small, -/area/station/hallway/secondary/service) +"gun" = ( +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/exit/departure_lounge) "gux" = ( /obj/machinery/air_sensor/mix_tank, /turf/open/floor/engine/vacuum, @@ -16530,6 +17520,12 @@ "guI" = ( /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) +"guR" = ( +/obj/machinery/modular_computer/preset/curator, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/wood/parquet, +/area/station/service/library) "guT" = ( /obj/machinery/light/small/directional/east, /obj/machinery/camera/emp_proof{ @@ -16582,6 +17578,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) +"gvV" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/landmark/start/security_officer, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/security/brig/entrance) "gvX" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -16595,12 +17600,6 @@ "gvY" = ( /turf/closed/wall/r_wall, /area/space) -"gwa" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/sign/warning/no_smoking/circle/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "gwf" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, @@ -16673,6 +17672,17 @@ /obj/machinery/status_display/evac/directional/west, /turf/open/floor/iron/showroomfloor, /area/station/medical/surgery/theatre) +"gxc" = ( +/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/decal/cleanable/dirt, +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/dock) "gxg" = ( /obj/effect/turf_decal/siding/red{ dir = 9 @@ -16692,6 +17702,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) +"gxq" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/small, +/area/station/tcommsat/server) "gxs" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/research/glass{ @@ -16719,6 +17737,10 @@ }, /turf/open/misc/sandy_dirt, /area/station/security/tram) +"gxL" = ( +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/cargo/storage) "gxP" = ( /obj/structure/flora/bush/large/style_random, /obj/structure/window/spawner/directional/east, @@ -16746,6 +17768,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) +"gxZ" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/duct, +/obj/machinery/power/apc/auto_name/directional/west, +/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/fore/greater) "gyd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/window/spawner/directional/east, @@ -16759,11 +17791,6 @@ dir = 4 }, /area/station/science/lobby) -"gyf" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/spawner/random/structure/girder, -/turf/open/floor/noslip/tram_platform, -/area/station/maintenance/department/medical/central) "gyi" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -16795,6 +17822,13 @@ }, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) +"gzj" = ( +/obj/structure/flora/bush/flowers_br/style_random, +/obj/structure/beebox, +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/grass, +/area/station/service/hydroponics) "gzu" = ( /obj/effect/turf_decal/tile/dark_red{ dir = 1 @@ -16829,16 +17863,18 @@ "gzF" = ( /turf/closed/wall/r_wall, /area/station/security/prison/rec) -"gzQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/smooth, -/area/station/hallway/secondary/command) "gzY" = ( /obj/structure/cable, /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space/nearstation) +"gAi" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/status_display/ai/directional/east, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "gAn" = ( /obj/structure/railing/corner{ dir = 8 @@ -16846,11 +17882,6 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) -"gAp" = ( -/obj/structure/hedge, -/obj/machinery/status_display/evac/directional/west, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "gAA" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -16863,6 +17894,15 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) +"gAR" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/warden) "gBh" = ( /turf/closed/mineral/random/stationside, /area/station/maintenance/department/engine/atmos) @@ -16926,15 +17966,6 @@ }, /turf/open/floor/glass/reinforced, /area/station/command/bridge) -"gCa" = ( -/obj/machinery/computer/crew, -/obj/effect/turf_decal/siding/blue{ - dir = 9 - }, -/obj/machinery/light/cold/directional/north, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/wood/tile, -/area/station/command/bridge) "gCe" = ( /obj/structure/cable, /obj/machinery/portable_atmospherics/canister/oxygen, @@ -16972,6 +18003,14 @@ }, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) +"gCA" = ( +/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/light/floor, +/turf/open/floor/iron/smooth, +/area/station/hallway/secondary/command) "gCJ" = ( /obj/structure/table/reinforced/titaniumglass, /obj/effect/decal/cleanable/dirt, @@ -17034,25 +18073,22 @@ /obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/plating, /area/station/engineering/atmos/storage/gas) -"gDV" = ( -/obj/structure/table, -/obj/item/storage/box/prisoner{ - pixel_y = 6 - }, -/obj/machinery/light/cold/directional/north, -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/turf/open/floor/iron, -/area/station/security/tram) +"gDR" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/table/greyscale, +/obj/item/folder/yellow, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "gEc" = ( /obj/structure/closet/emcloset, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"gEB" = ( -/obj/structure/chair/stool/directional/west, -/obj/machinery/light/dim/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/station/security/prison/mess) +"gEe" = ( +/obj/item/kirbyplants/random/fullysynthetic, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) "gEH" = ( /turf/closed/wall/r_wall, /area/station/security/evidence) @@ -17071,18 +18107,21 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron, /area/station/cargo/office) -"gEO" = ( -/obj/structure/cable, +"gEQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/kirbyplants{ - icon_state = "applebush" +/obj/structure/chair/sofa/bench/right{ + dir = 4 }, -/obj/effect/turf_decal/siding/thinplating_new/terracotta{ - dir = 8 +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) +"gFg" = ( +/obj/machinery/computer/cargo/request, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/brown{ + dir = 1 }, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron/dark/smooth_large, -/area/station/command/meeting_room) +/turf/open/floor/iron/smooth, +/area/station/command/bridge) "gFs" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -17114,10 +18153,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/medical/medbay/aft) -"gFI" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall, -/area/station/maintenance/port/fore) "gFX" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -17189,41 +18224,12 @@ }, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs) -"gHn" = ( -/obj/machinery/computer/security/mining, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/siding/brown{ - dir = 1 - }, -/obj/machinery/status_display/ai/directional/north, -/turf/open/floor/iron/smooth, -/area/station/command/bridge) -"gHA" = ( -/obj/structure/chair/wood{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, -/turf/open/floor/wood, -/area/station/service/chapel/funeral) -"gHG" = ( -/obj/machinery/computer/cargo/request, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/siding/brown{ - dir = 1 - }, -/obj/machinery/light/cold/directional/north, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/smooth, -/area/station/command/bridge) -"gHJ" = ( -/obj/structure/hedge, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/siding/brown{ - dir = 5 - }, -/turf/open/floor/iron/smooth, -/area/station/command/bridge) +"gHt" = ( +/obj/structure/kitchenspike, +/obj/effect/turf_decal/bot_red, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen/coldroom) "gHP" = ( /obj/structure/hedge, /obj/effect/mapping_helpers/broken_floor, @@ -17273,14 +18279,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"gIE" = ( -/obj/effect/turf_decal/tile/blue, -/obj/machinery/light/cold/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "gIF" = ( /obj/effect/turf_decal/siding/green, /turf/open/floor/iron/dark/small, @@ -17355,16 +18353,6 @@ }, /turf/open/floor/iron/freezer, /area/station/command/corporate_suite) -"gJt" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/dark_red/half/contrasted{ - dir = 1 - }, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/iron, -/area/station/security/brig/entrance) "gJu" = ( /obj/structure/closet, /obj/effect/mapping_helpers/broken_floor, @@ -17474,6 +18462,25 @@ }, /turf/open/floor/iron/dark, /area/station/security/lockers) +"gLx" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/item/clothing/suit/hazardvest{ + pixel_y = 8 + }, +/obj/item/clothing/suit/hazardvest{ + pixel_y = 5 + }, +/obj/item/clothing/suit/hazardvest{ + pixel_y = 2 + }, +/obj/item/tank/internals/emergency_oxygen/engi{ + pixel_y = 7 + }, +/obj/item/tank/internals/emergency_oxygen/engi{ + pixel_y = 4 + }, +/turf/open/floor/iron/small, +/area/station/engineering/supermatter/room) "gLy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -17493,24 +18500,6 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) -"gLD" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/thinplating_new/terracotta{ - dir = 8 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/command/meeting_room) -"gLJ" = ( -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/obj/item/storage/secure/safe/caps_spare/directional/west, -/turf/open/floor/iron/dark/smooth_large, -/area/station/command/bridge) "gLK" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -17518,15 +18507,6 @@ /obj/machinery/recharge_station, /turf/open/floor/plating, /area/station/engineering/break_room) -"gLL" = ( -/obj/structure/cable, -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron/dark/smooth_large, -/area/station/command/bridge) "gLM" = ( /obj/structure/table/glass, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -17546,14 +18526,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/lesser) -"gLV" = ( -/obj/machinery/light/cold/directional/west, -/obj/machinery/firealarm/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/hallway/secondary/command) "gLY" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, @@ -17564,6 +18536,7 @@ }, /obj/effect/mapping_helpers/airlock/abandoned, /obj/effect/mapping_helpers/airlock/access/any/command/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) "gMb" = ( @@ -17669,6 +18642,11 @@ }, /turf/open/floor/iron/small, /area/station/hallway/primary/central/fore) +"gOf" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/commons) "gOm" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/aisat/equipment) @@ -17712,6 +18690,7 @@ /obj/effect/turf_decal/tile/dark_red/half/contrasted{ dir = 1 }, +/obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/escape) "gPo" = ( @@ -17729,25 +18708,10 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) -"gPx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/science/ordnance/testlab) "gPN" = ( /obj/structure/fermenting_barrel, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"gPQ" = ( -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/machinery/door/airlock{ - name = "Maintenance" - }, -/obj/structure/barricade/wooden, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) "gPT" = ( /obj/effect/spawner/random/structure/grille, /obj/effect/spawner/random/structure/girder, @@ -17851,11 +18815,18 @@ /obj/structure/broken_flooring/plating/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"gRj" = ( +"gRh" = ( +/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/tile/blue{ + dir = 4 + }, /obj/machinery/light/floor, -/turf/open/floor/iron/smooth, -/area/station/hallway/secondary/command) +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/hallway/secondary/entry) "gRp" = ( /obj/effect/mapping_helpers/airlock/access/all/security/general, /obj/machinery/door/airlock/security{ @@ -17865,6 +18836,17 @@ dir = 1 }, /area/station/security/tram) +"gRG" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/camera/autoname/directional/east, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/iron/freezer, +/area/station/command/heads_quarters/captain/private) "gRL" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -17883,15 +18865,6 @@ /obj/structure/broken_flooring/singular/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/dock) -"gSa" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/siding/dark_red, -/obj/machinery/computer/records/medical/laptop{ - dir = 1 - }, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/stone, -/area/station/command/heads_quarters/hos) "gSi" = ( /obj/structure/chair{ dir = 4 @@ -17900,11 +18873,13 @@ /turf/open/floor/wood/tile, /area/station/command/meeting_room) "gSk" = ( -/obj/machinery/light/dim/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 9 - }, -/area/station/hallway/secondary/construction) +/obj/structure/cable, +/obj/effect/turf_decal/sand/plating, +/obj/machinery/power/floodlight, +/obj/structure/alien/weeds, +/obj/effect/gibspawner/human, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) "gSD" = ( /obj/machinery/mass_driver/chapelgun{ dir = 8 @@ -17930,6 +18905,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) +"gSX" = ( +/obj/machinery/computer/piratepad_control/civilian{ + dir = 1 + }, +/obj/structure/sign/departments/cargo/directional/west, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central/fore) "gTb" = ( /turf/open/floor/iron/dark/side{ dir = 8 @@ -17952,14 +18934,6 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/solars/port/aft) -"gTf" = ( -/obj/machinery/suit_storage_unit/engine, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/engineering/main) "gTi" = ( /obj/structure/table/glass, /obj/item/aicard{ @@ -17973,33 +18947,11 @@ }, /obj/structure/industrial_lift/tram, /obj/machinery/door/window/tram/right/directional/north{ - pixel_y = -25 + pixel_y = -25; + associated_lift = "maint_tram" }, /turf/open/floor/noslip/tram_platform, /area/station/maintenance/port/aft) -"gTl" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/modular_computer/console/preset/research{ - dir = 1 - }, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/siding/purple, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) -"gTs" = ( -/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 = 4 - }, -/obj/machinery/light/cold/directional/east, -/obj/machinery/requests_console/directional/east{ - department = "Xenobiology"; - name = "Xenobiology Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/ore_update, -/turf/open/floor/iron/dark/small, -/area/station/science/xenobiology) "gTC" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 6 @@ -18129,30 +19081,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/carpet/green, /area/station/maintenance/central/lesser) -"gUz" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/syringe/epinephrine{ - pixel_x = 3; - pixel_y = -2 - }, -/obj/machinery/airalarm/directional/north, -/obj/item/reagent_containers/cup/beaker/cryoxadone{ - pixel_x = 6; - pixel_y = 10 - }, -/obj/item/reagent_containers/cup/beaker/cryoxadone{ - pixel_x = 9; - pixel_y = 3 - }, -/obj/item/reagent_containers/spray/cleaner{ - pixel_x = -6; - pixel_y = 13 - }, -/obj/item/wrench/medical{ - pixel_x = -5 - }, -/turf/open/floor/iron/small, -/area/station/medical/cryo) "gUC" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -18267,21 +19195,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"gWU" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/trunk{ - 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/purple/opposingcorners, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/siding/green{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/station/science/circuits) "gXd" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 9 @@ -18301,27 +19214,6 @@ /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating/rust, /area/station/maintenance/fore/lesser) -"gXh" = ( -/obj/structure/table, -/obj/item/stock_parts/matter_bin{ - pixel_x = -4; - pixel_y = 13 - }, -/obj/item/storage/toolbox/emergency{ - pixel_x = 2; - pixel_y = -8 - }, -/obj/item/stock_parts/matter_bin{ - pixel_x = 2; - pixel_y = 4 - }, -/obj/item/storage/toolbox/emergency{ - pixel_x = 2; - pixel_y = -8 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/fore/lesser) "gXq" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -18385,6 +19277,8 @@ /area/station/service/bar) "gYq" = ( /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/dark, /area/station/maintenance/starboard/greater) "gYy" = ( @@ -18397,6 +19291,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/command/gateway) +"gYH" = ( +/obj/machinery/vending/wardrobe/robo_wardrobe, +/turf/open/floor/catwalk_floor/flat_white, +/area/station/science/robotics/augments) +"gYK" = ( +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "gZf" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -18453,6 +19356,18 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"haq" = ( +/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/siding/white{ + dir = 8 + }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) "hau" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -18469,6 +19384,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"hbk" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "hbm" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -18480,6 +19402,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) +"hbu" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 4 + }, +/obj/structure/rack, +/obj/effect/spawner/random/armory/bulletproof_armor, +/obj/effect/spawner/random/armory/riot_armor, +/obj/effect/spawner/random/armory/riot_shield, +/turf/open/floor/iron/dark/small, +/area/station/ai_monitored/security/armory) "hbv" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 1 @@ -18548,22 +19480,6 @@ /obj/effect/turf_decal/siding/yellow, /turf/open/floor/wood/tile, /area/station/command/bridge) -"hcj" = ( -/obj/effect/turf_decal/siding/thinplating_new/terracotta{ - dir = 1 - }, -/obj/machinery/modular_computer/console/preset/engineering{ - dir = 1 - }, -/obj/effect/turf_decal/siding/yellow, -/obj/machinery/light/cold/directional/south, -/obj/machinery/button/door/directional/south{ - id = "bridge blast"; - name = "Bridge Access Blast Door Control"; - req_access = list("command") - }, -/turf/open/floor/wood/tile, -/area/station/command/bridge) "hcl" = ( /obj/structure/disposalpipe/trunk{ dir = 1 @@ -18603,26 +19519,26 @@ /obj/effect/turf_decal/siding/yellow, /turf/open/floor/wood/tile, /area/station/command/bridge) -"hcJ" = ( -/obj/effect/turf_decal/siding/thinplating_new/terracotta{ - dir = 1 - }, -/obj/structure/table/glass, -/obj/effect/turf_decal/siding/yellow, -/obj/machinery/recharger{ - pixel_x = -7; - pixel_y = 3 +"hcG" = ( +/obj/structure/closet{ + name = "Evidence Closet 2" }, -/obj/item/folder/yellow{ - pixel_x = 6; - pixel_y = 3 +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/secure/safe/directional/north{ + name = "evidence safe" }, -/obj/item/assembly/signaler{ - pixel_x = 5; - pixel_y = 6 +/turf/open/floor/iron/smooth, +/area/station/security/evidence) +"hcU" = ( +/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/siding/white{ + dir = 4 }, -/turf/open/floor/wood/tile, -/area/station/command/bridge) +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "hcY" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -18646,11 +19562,23 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/smooth, /area/station/command/bridge) +"hdk" = ( +/obj/structure/closet/radiation, +/obj/item/clothing/glasses/meson, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/station/engineering/main) "hdo" = ( /obj/machinery/door/airlock{ name = "Maintenance" }, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/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/aft) "hdB" = ( @@ -18675,10 +19603,35 @@ }, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/command/bridge) +"hdQ" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/obj/structure/closet/secure_closet/chemical, +/obj/machinery/button/door/directional/east{ + id = "pharmacy_shutters"; + name = "Pharmacy Shutters Control"; + req_access = list("pharmacy") + }, +/turf/open/floor/iron/dark, +/area/station/medical/pharmacy) "hdT" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/engineering/supermatter/room) +"hee" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/structure/rack{ + icon = 'icons/obj/fluff/general.dmi'; + icon_state = "minibar"; + name = "skeletal minibar" + }, +/obj/item/storage/fancy/candle_box, +/obj/machinery/light_switch/directional/west, +/turf/open/floor/iron/grimy, +/area/station/service/library) "hei" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -18700,6 +19653,23 @@ }, /turf/open/floor/wood/large, /area/station/command/corporate_suite) +"hek" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/closet/secure_closet/personal, +/obj/item/storage/backpack, +/obj/item/storage/backpack/satchel, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/shoes/winterboots, +/obj/effect/landmark/start/hangover/closet, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/sign/poster/official/random/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/north, +/obj/machinery/camera/directional/west, +/turf/open/floor/iron, +/area/station/commons) "hem" = ( /turf/closed/wall, /area/station/hallway/primary/fore) @@ -18897,15 +19867,6 @@ /obj/effect/mapping_helpers/airlock/access/any/security/general, /turf/open/floor/iron/textured_half, /area/station/security/checkpoint/customs) -"hhi" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/status_display/ai/directional/east, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "hhk" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/pdapainter{ @@ -18915,6 +19876,17 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron/smooth, /area/station/command/bridge) +"hhl" = ( +/obj/structure/cable, +/obj/machinery/door/airlock/maintenance{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sci-entrance" + }, +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "hhL" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18971,15 +19943,12 @@ pixel_x = 20; pixel_y = 11 }, +/obj/item/mod/module/signlang_radio{ + pixel_y = 2; + pixel_x = -2 + }, /turf/open/floor/iron/small, /area/station/security/office) -"hix" = ( -/obj/machinery/computer/gateway_control{ - dir = 1 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/smooth, -/area/station/command/gateway) "hiV" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -18996,11 +19965,6 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/dark/small, /area/station/security/brig) -"hjq" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/security/prison/workout) "hju" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 8 @@ -19013,7 +19977,7 @@ }, /area/station/engineering/atmos) "hjx" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -19028,13 +19992,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/small, /area/station/medical/morgue) -"hjS" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/airlock_painter, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/iron, -/area/station/commons/storage/art) "hjT" = ( /obj/machinery/atmospherics/pipe/smart/simple/pink/visible, /obj/effect/decal/cleanable/dirt, @@ -19044,6 +20001,16 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"hkk" = ( +/obj/machinery/computer/records/medical{ + dir = 4 + }, +/obj/effect/turf_decal/siding/blue{ + dir = 9 + }, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/iron/white, +/area/station/medical/paramedic) "hkm" = ( /obj/structure/tank_dispenser/oxygen{ pixel_x = -1; @@ -19060,9 +20027,19 @@ /obj/effect/turf_decal/siding/white{ dir = 4 }, -/obj/machinery/iv_drip, +/obj/structure/chair/office/tactical{ + dir = 1 + }, /turf/open/floor/iron/small, /area/station/medical/morgue) +"hky" = ( +/obj/item/kirbyplants/organic/applebush, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/exit/departure_lounge) "hkB" = ( /obj/structure/table/glass, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -19094,6 +20071,12 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) +"hkQ" = ( +/obj/machinery/computer/rdconsole, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/dark, +/area/station/science/lab) "hkW" = ( /obj/structure/closet/crate/goldcrate, /obj/effect/turf_decal/bot_white/right, @@ -19111,6 +20094,12 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron, /area/station/maintenance/department/engine/atmos) +"hlo" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "hlw" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -19185,18 +20174,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/small, /area/station/science/ordnance/storage) -"hmC" = ( -/obj/structure/cable, -/obj/machinery/light/cold/directional/south, -/obj/effect/turf_decal/siding/red, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/security/medical) "hmQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/table, @@ -19252,24 +20229,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/commons/storage/tools) -"hnr" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, +"hnF" = ( +/obj/structure/cable, +/obj/machinery/duct, /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 = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "hnO" = ( /obj/structure/disposalpipe/segment, /obj/structure/disposalpipe/segment{ @@ -19306,12 +20271,6 @@ }, /turf/open/floor/plating, /area/station/engineering/gravity_generator) -"hoe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/iron/smooth, -/area/station/hallway/secondary/command) "hok" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -19379,6 +20338,10 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/wood/parquet, /area/station/service/theater) +"hpM" = ( +/obj/effect/turf_decal/siding, +/turf/open/floor/iron/white, +/area/station/science/cytology) "hpP" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -19392,14 +20355,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating, /area/station/service/chapel/funeral) -"hpR" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/siding/wood, -/obj/machinery/light/small/directional/south, -/obj/effect/mapping_helpers/broken_floor, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/stone, -/area/station/command/corporate_suite) "hpW" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -19489,6 +20444,16 @@ }, /turf/open/space/basic, /area/space/nearstation) +"hrO" = ( +/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/dark_red{ + dir = 1 + }, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/iron, +/area/station/security/prison) "hrV" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 5 @@ -19529,13 +20494,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/hallway/secondary/command) -"hsX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sink/directional/south, -/obj/item/reagent_containers/cup/bucket, -/obj/item/mop, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "hsZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -19546,11 +20504,6 @@ /obj/structure/barricade/wooden, /turf/open/floor/plating, /area/station/security/tram) -"htt" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "htI" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19599,12 +20552,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) -"huc" = ( -/obj/effect/turf_decal/bot_white, -/obj/structure/rack, -/obj/item/electronics/apc, -/turf/open/floor/iron/smooth_large, -/area/station/cargo/warehouse) "huh" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -19659,6 +20606,23 @@ }, /turf/open/floor/iron/dark/small, /area/station/ai_monitored/security/armory) +"hvc" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "AISat Maintenance" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/command/general, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/ai_monitored/turret_protected/aisat/maint) "hvh" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -19681,6 +20645,11 @@ /obj/machinery/light/cold/directional/south, /turf/open/floor/iron, /area/station/commons/storage/tools) +"hvx" = ( +/obj/structure/flora/rock/pile/jungle/style_random, +/obj/machinery/light/small/directional/north, +/turf/open/floor/grass, +/area/station/medical/virology) "hvy" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -19697,26 +20666,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"hvz" = ( -/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/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"hvG" = ( -/obj/machinery/computer/prisoner/management{ - dir = 8 - }, -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/iron/checker{ - dir = 1 - }, -/area/station/security/execution/transfer) "hvJ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -19740,26 +20689,40 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"hvV" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/clipboard{ + pixel_x = 10; + pixel_y = 4 + }, +/obj/item/folder/red{ + pixel_x = 7 + }, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/security/tram) "hwe" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/tile/blue/half, /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/white/small, /area/station/service/hydroponics) -"hwg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/command/glass{ - name = "E.V.A. Storage" +"hwf" = ( +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 4 }, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/command/eva, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/iron/smooth_half{ - dir = 1 +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 8 }, -/area/station/ai_monitored/command/storage/eva) +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden) "hwk" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/effect/turf_decal/siding/green, @@ -19811,12 +20774,16 @@ "hwJ" = ( /turf/closed/wall/rust, /area/space/nearstation) -"hwP" = ( -/obj/item/kirbyplants/random, -/obj/machinery/light/cold/directional/east, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/dark, -/area/station/medical/cryo) +"hwK" = ( +/obj/structure/closet/wardrobe/grey, +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/autoname/directional/west, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/small, +/area/station/commons/fitness/locker_room) "hwZ" = ( /obj/structure/chair/bronze{ dir = 8 @@ -19859,20 +20826,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"hxW" = ( -/obj/structure/flora/bush/large/style_random{ - pixel_x = -18; - pixel_y = -9 - }, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/turf_decal/siding/wideplating{ - dir = 8 - }, -/obj/machinery/light/floor{ - pixel_x = -32 - }, -/turf/open/misc/sandy_dirt, -/area/station/security/tram) "hyi" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19880,6 +20833,7 @@ /obj/effect/turf_decal/tile/dark_red{ dir = 8 }, +/obj/machinery/digital_clock/directional/north, /turf/open/floor/iron, /area/station/security/execution/transfer) "hyj" = ( @@ -19888,6 +20842,7 @@ }, /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) "hyl" = ( @@ -19916,6 +20871,10 @@ }, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) +"hyA" = ( +/obj/machinery/light/dim/directional/south, +/turf/open/floor/iron/dark/side, +/area/station/hallway/secondary/construction) "hyD" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/small, @@ -19944,25 +20903,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_command) -"hzd" = ( -/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 = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/cold/directional/south, -/obj/machinery/button/door/directional/south{ - id = "XenoPens"; - name = "Xenobiology Shutters"; - req_access = list("xenobiology") - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/science/xenobiology) "hzi" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -19977,21 +20917,22 @@ "hzm" = ( /turf/closed/wall/rust, /area/station/cargo/miningoffice) -"hzy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/white/line, -/turf/open/floor/engine, -/area/station/science/explab) "hzI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/firealarm/directional/east, +/obj/effect/landmark/tram/nav/immovable_rod, /turf/open/floor/iron, /area/station/hallway/secondary/entry) "hzK" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"hzV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "hzX" = ( /obj/machinery/door/airlock/external{ name = "Mining Dock Airlock" @@ -20005,13 +20946,45 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/wood/parquet, /area/station/service/library) -"hAn" = ( -/obj/structure/chair{ +"hAc" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 2 + }, +/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/mapping_helpers/mail_sorting/engineering/general, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/landmark/navigate_destination/engineering, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"hAd" = ( +/obj/effect/turf_decal/tile/green{ dir = 8 }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/iron/cafeteria, -/area/station/science/breakroom) +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/reagent_dispensers/watertank/high, +/obj/item/reagent_containers/cup/watering_can, +/obj/machinery/light/small/directional/west, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"hAu" = ( +/obj/machinery/door/airlock{ + name = "Maintenance" + }, +/obj/structure/barricade/wooden, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) "hAC" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark/small, @@ -20035,45 +21008,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/cargo/warehouse) -"hAS" = ( -/obj/effect/turf_decal/bot_white, -/obj/structure/closet/crate{ - name = "Breach Supplies" - }, -/obj/item/weldingtool/mini, -/obj/item/weldingtool/mini, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = 9 - }, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = -1 +"hAQ" = ( +/obj/structure/table, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/item/clothing/mask/breath{ + pixel_x = 15; + pixel_y = 5 }, -/obj/item/stack/rods/fifty, -/obj/item/stack/rods/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/machinery/light/small/directional/north, -/obj/item/clothing/head/utility/welding, -/obj/item/clothing/head/utility/welding, +/obj/machinery/light/small/directional/south, /turf/open/floor/iron/smooth, -/area/station/commons/storage/tools) -"hBg" = ( -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) +/area/station/command/gateway) "hBq" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -20130,21 +21076,6 @@ }, /turf/open/floor/iron/textured_large, /area/station/command/heads_quarters/hop) -"hBw" = ( -/obj/structure/hedge, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/light/cold/directional/north, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/obj/structure/sign/departments/engineering/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "hBA" = ( /obj/structure/cable, /obj/effect/spawner/structure/window, @@ -20166,6 +21097,24 @@ }, /turf/open/floor/iron/small, /area/station/hallway/primary/central/fore) +"hBR" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/machinery/reagentgrinder{ + pixel_y = 9 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/pharmacy) +"hBW" = ( +/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, +/turf/open/floor/iron/dark/small, +/area/station/security/brig) "hCn" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -20189,6 +21138,7 @@ /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, /turf/open/floor/iron/smooth, /area/station/security/evidence) "hCQ" = ( @@ -20210,6 +21160,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"hDn" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/department/engine/atmos) "hDt" = ( /obj/structure/toilet{ pixel_y = 8 @@ -20229,21 +21185,18 @@ }, /turf/open/floor/plating, /area/station/ai_monitored/command/storage/eva) -"hDJ" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/department/medical/central) "hDN" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/station/security/interrogation) -"hDP" = ( -/obj/structure/cable, +"hDT" = ( /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/plating, -/area/station/maintenance/port/aft) +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "hDX" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/yellow/line, @@ -20274,15 +21227,17 @@ /obj/machinery/camera/directional/south, /turf/open/floor/iron/large, /area/station/ai_monitored/command/storage/eva) -"hEc" = ( -/obj/machinery/suit_storage_unit/standard_unit, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +"hEi" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 }, -/obj/structure/window/spawner/directional/west, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/plating, -/area/station/ai_monitored/command/storage/eva) +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/obj/machinery/firealarm/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/cargo/sorting) "hEm" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/effect/turf_decal/stripes/line{ @@ -20304,6 +21259,7 @@ /area/station/maintenance/starboard/greater) "hFC" = ( /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating/rust, /area/station/maintenance/fore/lesser) "hFG" = ( @@ -20362,6 +21318,14 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/engine, /area/station/engineering/gravity_generator) +"hHF" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 4 + }, +/obj/machinery/camera/autoname/directional/west, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/smooth, +/area/station/hallway/secondary/command) "hHH" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance, @@ -20379,16 +21343,6 @@ /obj/effect/landmark/start/cargo_technician, /turf/open/floor/iron/dark, /area/station/cargo/office) -"hIo" = ( -/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/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/commons/dorms) "hIq" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -20444,11 +21398,6 @@ "hJp" = ( /turf/closed/wall/r_wall/rust, /area/station/ai_monitored/turret_protected/ai) -"hJr" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid, -/area/station/maintenance/fore/greater) "hJC" = ( /obj/structure/closet/crate/hydroponics, /obj/item/paper/guides/jobs/hydroponics, @@ -20475,6 +21424,15 @@ dir = 1 }, /area/station/hallway/secondary/dock) +"hJP" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/sign/departments/engineering/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "hJR" = ( /obj/structure/cable, /obj/structure/lattice/catwalk, @@ -20517,13 +21475,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/grimy, /area/station/hallway/secondary/entry) -"hKQ" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/light/small/directional/east, -/obj/structure/broken_flooring/corner/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) "hKR" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -20599,6 +21550,26 @@ }, /turf/open/floor/wood/tile, /area/station/command/heads_quarters/hop) +"hMn" = ( +/obj/structure/table, +/obj/effect/mapping_helpers/broken_floor, +/obj/item/canvas{ + pixel_x = 13; + pixel_y = 12 + }, +/obj/item/canvas, +/obj/item/canvas{ + pixel_x = 4; + pixel_y = 16 + }, +/obj/item/canvas{ + pixel_y = 15 + }, +/obj/item/canvas{ + pixel_x = 6 + }, +/turf/open/floor/iron, +/area/station/commons/storage/art) "hMq" = ( /obj/machinery/atmospherics/pipe/smart/simple/general/visible{ dir = 10 @@ -20633,6 +21604,10 @@ }, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"hMz" = ( +/obj/machinery/computer/order_console/cook, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen/coldroom) "hMA" = ( /obj/machinery/status_display/ai/directional/east, /turf/open/floor/iron, @@ -20642,6 +21617,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"hMK" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/kirbyplants/organic/applebush, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/smooth, +/area/station/command/bridge) "hNb" = ( /obj/effect/turf_decal/tile/brown/opposingcorners, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -20655,18 +21636,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"hNv" = ( +/obj/machinery/netpod, +/obj/machinery/light_switch/directional/north, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/bitrunning/den) "hNA" = ( /obj/effect/turf_decal/tile/brown/opposingcorners, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"hNE" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/modular_computer/console/preset/id{ - dir = 1 - }, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/iron/smooth, -/area/station/command/bridge) "hNJ" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 @@ -20709,6 +21688,12 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/wood/tile, /area/station/command/corporate_showroom) +"hOk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "hOl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -20719,18 +21704,6 @@ "hOp" = ( /turf/open/floor/iron/showroomfloor, /area/station/medical/virology) -"hOy" = ( -/obj/structure/window/spawner/directional/south, -/obj/effect/turf_decal/stripes/box, -/obj/structure/sign/warning/pods/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"hOC" = ( -/obj/structure/chair/sofa/corp{ - dir = 1 - }, -/turf/open/floor/wood/tile, -/area/station/command/corporate_showroom) "hOF" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/structure/chair/office{ @@ -20741,15 +21714,6 @@ dir = 1 }, /area/station/security/execution/transfer) -"hOR" = ( -/obj/structure/closet/crate, -/obj/projectile/bullet/cannonball, -/obj/projectile/bullet/cannonball, -/obj/projectile/bullet/cannonball, -/obj/projectile/bullet/cannonball, -/obj/structure/barricade/wooden/crude, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) "hOS" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20792,6 +21756,11 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"hPs" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/engine, +/area/station/engineering/gravity_generator) "hPR" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -20827,6 +21796,14 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/wood/tile, /area/station/command/corporate_showroom) +"hQz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/light/warm/directional/south, +/turf/open/floor/plating, +/area/station/hallway/secondary/construction) "hQD" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -20845,15 +21822,6 @@ /obj/effect/mapping_helpers/airlock/access/any/security/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"hQH" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/turf/open/floor/wood/tile, -/area/station/command/corporate_showroom) "hRd" = ( /obj/structure/table/reinforced, /obj/item/binoculars, @@ -20885,29 +21853,6 @@ }, /turf/open/misc/sandy_dirt, /area/station/security/tram) -"hSj" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/bot, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/door/window/right/directional/south{ - name = "Command Deliveries"; - req_access = list("command") - }, -/turf/open/floor/wood/tile, -/area/station/command/corporate_showroom) -"hSv" = ( -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/obj/effect/turf_decal/siding/white{ - dir = 1 - }, -/obj/structure/railing{ - dir = 1 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/smooth, -/area/station/command/corporate_showroom) "hSx" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -20982,27 +21927,14 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"hTV" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +"hTW" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/vehicle/ridden/janicart, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/iron/showroomfloor, -/area/station/commons/toilet/auxiliary) -"hTY" = ( -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/obj/machinery/light/cold/directional/west, -/obj/structure/table, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/construction/plumbing, -/turf/open/floor/iron, -/area/station/medical/chemistry) +/turf/open/floor/iron/white/small, +/area/station/service/janitor) "hTZ" = ( /obj/structure/chair/sofa/bench/left{ dir = 1 @@ -21018,12 +21950,27 @@ /obj/structure/table/glass, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) +"hUI" = ( +/obj/structure/table, +/obj/item/storage/belt/utility, +/obj/item/radio/off, +/turf/open/floor/iron/smooth, +/area/station/command/gateway) "hUP" = ( /obj/structure/sink/directional/east, /obj/structure/mirror/directional/west, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/restrooms) +"hUT" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/structure/industrial_lift/tram/white, +/obj/structure/window/reinforced/tram/directional/south, +/obj/structure/chair/sofa/bench/right{ + dir = 1 + }, +/turf/open/floor/noslip/tram_platform, +/area/station/maintenance/port/aft) "hVb" = ( /obj/machinery/plate_press, /obj/effect/turf_decal/stripes/line, @@ -21085,21 +22032,25 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"hWa" = ( -/obj/structure/flora/bush/large/style_random, -/obj/structure/flora/bush/flowers_br/style_random, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/misc/sandy_dirt, -/area/station/commons) -"hWs" = ( -/obj/structure/disposalpipe/segment{ +"hVX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"hVY" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/computer/scan_consolenew{ dir = 4 }, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/siding/purple{ + dir = 9 + }, /obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/station/maintenance/hallway/abandoned_command) +/turf/open/floor/iron/dark, +/area/station/science/genetics) "hWu" = ( /obj/machinery/door/airlock/medical{ name = "CMO Bedroom" @@ -21167,12 +22118,6 @@ "hXt" = ( /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"hXJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/dim/directional/west, -/turf/open/floor/iron, -/area/station/security/prison/rec) "hXP" = ( /obj/structure/cable, /obj/machinery/power/terminal{ @@ -21204,6 +22149,20 @@ }, /turf/open/floor/iron/textured_half, /area/station/security/prison) +"hYf" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/landmark/navigate_destination/research, +/turf/open/floor/iron/white, +/area/station/hallway/primary/starboard) +"hYm" = ( +/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, +/turf/open/floor/iron/large, +/area/station/hallway/secondary/spacebridge) "hYn" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, @@ -21228,12 +22187,6 @@ /obj/structure/industrial_lift/tram/subfloor, /turf/open/floor/noslip/tram_platform, /area/station/security/tram) -"hYA" = ( -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/order_console/mining, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "hYC" = ( /turf/closed/wall, /area/station/engineering/atmos) @@ -21245,6 +22198,13 @@ dir = 8 }, /area/station/science/lab) +"hYN" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 5 + }, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/plating, +/area/station/engineering/atmos/storage/gas) "hYW" = ( /obj/structure/cable, /obj/structure/disposalpipe/junction/flip{ @@ -21273,15 +22233,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/command/meeting_room) -"hZd" = ( -/obj/effect/turf_decal/tile/dark_red{ - dir = 8 - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/machinery/light/small/directional/east, -/obj/machinery/recharge_station, -/turf/open/floor/iron, -/area/station/security/tram) "hZP" = ( /obj/structure/cable, /obj/structure/sign/poster/official/random/directional/north, @@ -21322,6 +22273,17 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/carpet/executive, /area/station/command/meeting_room) +"iaw" = ( +/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/wood/large, +/area/station/command/heads_quarters/captain/private) +"iaA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/showroomfloor, +/area/station/medical/surgery/theatre) "iaH" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -21331,6 +22293,12 @@ }, /turf/open/floor/wood/tile, /area/station/command/meeting_room) +"iaJ" = ( +/obj/structure/transit_tube/crossing/horizontal, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/space/basic, +/area/space/nearstation) "iaK" = ( /obj/structure/table/wood, /obj/item/reagent_containers/cup/glass/bottle/wine{ @@ -21367,7 +22335,8 @@ /obj/structure/industrial_lift/tram, /obj/machinery/door/window/tram/left/directional/north{ pixel_x = -32; - pixel_y = -25 + pixel_y = -25; + associated_lift = "maint_tram" }, /turf/open/floor/noslip/tram_platform, /area/station/maintenance/port/aft) @@ -21436,13 +22405,6 @@ }, /turf/open/floor/iron/dark/small, /area/station/science/xenobiology) -"ibV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/item/kirbyplants/random, -/turf/open/floor/iron, -/area/station/science/xenobiology) "icc" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, @@ -21461,11 +22423,12 @@ dir = 4 }, /area/station/hallway/secondary/entry) -"icl" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/turf_decal/stripes/end, -/turf/open/floor/iron/small, -/area/station/medical/medbay/lobby) +"ico" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/wood, +/area/station/hallway/secondary/entry) "icS" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -21497,6 +22460,7 @@ /area/station/science/lower) "icW" = ( /obj/structure/transit_tube/horizontal, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) "ide" = ( @@ -21505,16 +22469,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/medical/paramedic) -"idg" = ( -/obj/effect/turf_decal/tile/blue, -/obj/machinery/pdapainter{ - pixel_y = 2 - }, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/iron/dark/textured_edge{ - dir = 1 - }, -/area/station/command/heads_quarters/hop) "idj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -21607,12 +22561,12 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/diagonal, /area/station/command/heads_quarters/hop) -"idV" = ( -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/light/blacklight/directional/south, +"idW" = ( +/obj/structure/reagent_dispensers/water_cooler, +/obj/machinery/light/small/directional/south, +/obj/machinery/digital_clock/directional/south, /turf/open/floor/iron, -/area/station/hallway/primary/port) +/area/station/maintenance/department/medical/central) "ief" = ( /obj/structure/cable, /obj/machinery/telecomms/message_server/preset, @@ -21634,15 +22588,6 @@ }, /turf/closed/wall/mineral/titanium/nodiagonal, /area/station/engineering/supermatter) -"ieJ" = ( -/obj/effect/turf_decal/siding/red{ - dir = 5 - }, -/obj/machinery/light/cold/directional/north, -/obj/item/radio/intercom/directional/north, -/obj/machinery/computer/records/security, -/turf/open/floor/wood/tile, -/area/station/command/bridge) "ieY" = ( /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/broken_floor, @@ -21659,20 +22604,6 @@ /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) -"ifh" = ( -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/obj/effect/landmark/start/security_officer, -/turf/open/floor/iron, -/area/station/security/lockers) -"ifj" = ( -/obj/machinery/rnd/production/techfab/department/service, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/kitchen/small, -/area/station/hallway/secondary/service) "ifI" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/stripes/line{ @@ -21717,6 +22648,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_command) +"igr" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/fore/lesser) "ihc" = ( /obj/structure/cable, /obj/machinery/door/airlock/command/glass{ @@ -21744,15 +22681,6 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain) -"ihm" = ( -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/obj/structure/closet/secure_closet/security/sec, -/obj/machinery/light/cold/directional/west, -/obj/machinery/camera/directional/north, -/obj/effect/decal/cleanable/cobweb, -/obj/structure/reagent_dispensers/wall/peppertank/directional/north, -/turf/open/floor/iron, -/area/station/security/lockers) "iho" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21791,28 +22719,6 @@ "iht" = ( /turf/closed/wall/r_wall, /area/station/command/corporate_dock) -"ihu" = ( -/obj/structure/hedge, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron/dark/small, -/area/station/command/heads_quarters/captain/private) -"ihy" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron/stairs{ - dir = 8 - }, -/area/station/cargo/storage) -"ihB" = ( -/obj/structure/table/bronze, -/obj/machinery/microwave{ - pixel_y = 5 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/dark/small, -/area/station/command/heads_quarters/captain/private) "ihC" = ( /obj/structure/bodycontainer/morgue{ dir = 1 @@ -21850,10 +22756,35 @@ }, /turf/open/space/basic, /area/space) +"iiC" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/blue{ + dir = 5 + }, +/obj/machinery/light_switch/directional/east, +/obj/effect/mapping_helpers/broken_floor, +/obj/item/kirbyplants/random, +/obj/item/storage/medkit/regular{ + pixel_x = -3; + pixel_y = -3 + }, +/turf/open/floor/iron/white/small, +/area/station/command/heads_quarters/cmo) "iiW" = ( /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_dark, /area/station/science/xenobiology) +"ijm" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "ijB" = ( /obj/machinery/atmospherics/components/trinary/mixer/flipped{ dir = 8 @@ -21864,18 +22795,6 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/plating, /area/station/science/ordnance/storage) -"ijD" = ( -/obj/structure/table/bronze, -/obj/machinery/airalarm/directional/north, -/obj/item/food/grown/cannabis{ - pixel_x = -11 - }, -/obj/item/food/grown/cannabis{ - pixel_x = -5; - pixel_y = 5 - }, -/turf/open/floor/iron/dark/small, -/area/station/command/heads_quarters/captain/private) "ijF" = ( /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, @@ -21894,13 +22813,6 @@ "ikc" = ( /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"ike" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/obj/structure/broken_flooring/singular/directional/south, -/turf/open/floor/iron, -/area/station/maintenance/starboard/aft) "ikk" = ( /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/broken_floor, @@ -22010,11 +22922,6 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) -"imd" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "imj" = ( /obj/machinery/door/airlock/security/glass{ id_tag = "permaouter"; @@ -22034,10 +22941,6 @@ /obj/effect/landmark/atmospheric_sanity/ignore_area, /turf/open/floor/plating, /area/station/service/library/abandoned) -"imM" = ( -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron/showroomfloor, -/area/station/medical/surgery/theatre) "imS" = ( /obj/effect/turf_decal/tile/brown/opposingcorners, /obj/effect/decal/cleanable/dirt, @@ -22058,12 +22961,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"inD" = ( -/obj/effect/turf_decal/siding, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/dim/directional/south, -/turf/open/floor/iron/white/small, -/area/station/science/lab) "inH" = ( /obj/structure/chair/stool/directional/west, /obj/effect/decal/cleanable/dirt, @@ -22119,11 +23016,6 @@ /obj/effect/turf_decal/delivery/red, /turf/open/floor/iron/white/small, /area/station/medical/treatment_center) -"ioy" = ( -/obj/machinery/hydroponics/soil, -/obj/machinery/light/dim/directional/south, -/turf/open/floor/grass, -/area/station/security/prison/garden) "ioJ" = ( /obj/effect/turf_decal/tile/brown/opposingcorners, /obj/effect/decal/cleanable/dirt, @@ -22140,6 +23032,12 @@ /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"ioR" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/airalarm/directional/west, +/obj/effect/spawner/random/trash/moisture_trap, +/turf/open/floor/iron/white, +/area/station/science/cytology) "ioW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -22167,6 +23065,17 @@ }, /turf/open/floor/iron/smooth, /area/station/cargo/warehouse) +"ipf" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/kirbyplants/organic/applebush, +/obj/effect/turf_decal/siding/thinplating_new/terracotta{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room) "ipn" = ( /obj/effect/turf_decal/stripes/white/corner, /obj/effect/turf_decal/stripes/white/corner{ @@ -22275,6 +23184,19 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/smooth, /area/station/command/bridge) +"iqG" = ( +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/interrogation) +"iqH" = ( +/obj/machinery/firealarm/directional/north, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "iqN" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -22285,6 +23207,11 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"ira" = ( +/obj/structure/tank_dispenser/oxygen, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/small, +/area/station/security/tram) "iri" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -22345,6 +23272,15 @@ }, /turf/open/floor/noslip/tram_plate, /area/station/maintenance/port/aft) +"isi" = ( +/obj/structure/table, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 10 + }, +/obj/machinery/status_display/ai/directional/west, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/iron/dark/herringbone, +/area/station/security/courtroom) "isj" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/aisat/teleporter) @@ -22389,18 +23325,6 @@ dir = 1 }, /area/station/command/gateway) -"isV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/thinplating_new/corner{ - dir = 1 - }, -/obj/machinery/holopad, -/obj/effect/turf_decal/siding/thinplating_new/corner{ - dir = 8 - }, -/turf/open/floor/iron/small, -/area/station/medical/morgue) "isY" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -22411,15 +23335,6 @@ "itb" = ( /turf/closed/wall/r_wall/rust, /area/station/ai_monitored/turret_protected/aisat/maint) -"itq" = ( -/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/maintenance/hallway/abandoned_command) "itw" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -22431,16 +23346,23 @@ dir = 4 }, /area/station/command/heads_quarters/hop) -"itB" = ( -/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/iron/white, -/area/station/medical/medbay/central) "itF" = ( /obj/structure/closet/firecloset, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"itL" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/machinery/computer/security{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/wall/peppertank/directional/east, +/obj/machinery/camera/autoname/directional/east, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/brig/entrance) "itO" = ( /obj/structure/table, /obj/machinery/cell_charger, @@ -22494,8 +23416,23 @@ /obj/effect/mapping_helpers/broken_floor, /obj/effect/turf_decal/sand/plating, /obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc/worn_out/directional/east, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_command) +"ius" = ( +/obj/structure/flora/bush/large/style_random{ + pixel_y = -3 + }, +/obj/structure/flora/bush/flowers_br/style_random, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/turf_decal/siding/wideplating{ + dir = 4 + }, +/obj/machinery/light/floor{ + pixel_x = 32 + }, +/turf/open/misc/sandy_dirt, +/area/station/security/tram) "iut" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -22514,24 +23451,30 @@ /turf/closed/wall/mineral/titanium/nodiagonal, /area/station/engineering/supermatter) "iux" = ( -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 8 - }, -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden) -"iuN" = ( +/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/closed/wall/r_wall, -/area/station/science/ordnance/testlab) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) +"iuH" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/autoname/directional/east, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/dark, +/area/station/science/ordnance) +"iuL" = ( +/obj/machinery/vending/games, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood/parquet, +/area/station/service/library) "iuW" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/west, /obj/item/kirbyplants/random, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) "iuZ" = ( @@ -22540,17 +23483,17 @@ /obj/item/melee/baseball_bat, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) -"ivd" = ( -/obj/machinery/holopad, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/iron/dark/small, -/area/station/tcommsat/server) "ivk" = ( /obj/machinery/atmospherics/components/tank/air{ dir = 8 }, /turf/open/misc/asteroid, /area/station/maintenance/hallway/abandoned_command) +"ivl" = ( +/obj/item/kirbyplants/organic/applebush, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/smooth, +/area/station/hallway/primary/central/fore) "ivm" = ( /obj/machinery/vending/assist, /obj/effect/turf_decal/delivery/white, @@ -22606,8 +23549,9 @@ /turf/open/floor/iron/dark, /area/station/engineering/atmos) "ivO" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/reagent_dispensers/fueltank, +/obj/effect/decal/cleanable/dirt, +/obj/structure/girder, +/obj/effect/decal/cleanable/glass/plastitanium, /turf/open/floor/plating, /area/station/maintenance/fore/greater) "ivX" = ( @@ -22625,6 +23569,20 @@ /obj/machinery/light/cold/directional/east, /turf/open/floor/iron, /area/station/engineering/storage/tech) +"iwa" = ( +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/service/hydroponics) "iwe" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -22634,21 +23592,6 @@ /obj/machinery/computer/security/telescreen/entertainment/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"iwv" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/item/storage/box/pdas{ - pixel_x = 7; - pixel_y = 12 - }, -/obj/item/storage/box/ids{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/diagonal, -/area/station/command/heads_quarters/hop) "iwM" = ( /obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ dir = 1 @@ -22656,17 +23599,6 @@ /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/iron/smooth, /area/station/engineering/atmos/pumproom) -"iwT" = ( -/obj/machinery/light/cold/directional/north, -/obj/structure/table, -/obj/item/book/manual/wiki/tcomms, -/turf/open/floor/circuit, -/area/station/tcommsat/server) -"iwV" = ( -/obj/machinery/light/directional/north, -/obj/machinery/computer/records/security, -/turf/open/floor/wood/tile, -/area/station/command/heads_quarters/hop) "iwZ" = ( /obj/structure/disposalpipe/junction/flip{ dir = 8 @@ -22680,6 +23612,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/holopad, /obj/effect/decal/cleanable/dirt, +/obj/structure/cable, /turf/open/floor/iron/dark/small, /area/station/security/detectives_office) "ixz" = ( @@ -22694,6 +23627,19 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"ixP" = ( +/obj/structure/table, +/obj/machinery/firealarm/directional/south, +/obj/item/restraints/legcuffs/beartrap, +/obj/item/stack/tile/iron/base{ + pixel_y = 18 + }, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = -7; + pixel_y = 12 + }, +/turf/open/floor/iron, +/area/station/service/janitor) "ixU" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/decal/cleanable/dirt, @@ -22726,14 +23672,12 @@ /obj/effect/spawner/random/structure/girder, /turf/open/floor/noslip/tram_platform, /area/station/security/tram) -"iym" = ( -/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/landmark/generic_maintenance_landmark, -/turf/open/floor/iron, -/area/station/engineering/storage/tech) +"iyq" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/hidden{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "iyC" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/siding/purple{ @@ -22751,12 +23695,6 @@ }, /turf/open/floor/plating/rust, /area/station/maintenance/department/engine) -"iza" = ( -/obj/machinery/photocopier, -/obj/structure/sign/poster/official/random/directional/north, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/wood/tile, -/area/station/command/heads_quarters/hop) "izq" = ( /obj/structure/filingcabinet, /obj/effect/decal/cleanable/dirt, @@ -22775,14 +23713,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/department/bridge) -"izJ" = ( -/obj/machinery/light/cold/directional/south, -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ - dir = 4 - }, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/circuit, -/area/station/tcommsat/server) "izL" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, @@ -22791,23 +23721,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/engineering/break_room) -"iAt" = ( -/obj/effect/turf_decal/siding/dark_red{ - dir = 4 - }, -/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/machinery/airalarm/directional/west, -/turf/open/floor/iron/dark/small, -/area/station/ai_monitored/security/armory) "iAy" = ( /obj/structure/table, /obj/item/clothing/shoes/sneakers/orange{ @@ -22853,6 +23766,16 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/security/brig/entrance) +"iAZ" = ( +/obj/structure/bed/medical/anchored{ + dir = 4 + }, +/obj/item/bedsheet, +/obj/effect/turf_decal/siding/red{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/station/security/medical) "iBc" = ( /obj/effect/turf_decal/siding/thinplating_new/terracotta{ dir = 5 @@ -22888,6 +23811,11 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) +"iBE" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/cable, +/turf/open/floor/wood/tile, +/area/station/maintenance/port/lesser) "iBV" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 1 @@ -22933,28 +23861,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"iCN" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/hedge, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"iDg" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/bookcase/random, -/obj/effect/turf_decal/siding/thinplating_new/terracotta{ - dir = 4 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/command/meeting_room) "iDk" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -22968,6 +23874,18 @@ }, /turf/open/floor/plating, /area/station/maintenance/central/lesser) +"iDv" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/red, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/white, +/area/station/security/medical) "iDH" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/chair/office/light{ @@ -22980,13 +23898,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/command/bridge) -"iEw" = ( -/obj/structure/chair/wood/wings, -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/turf/open/floor/stone, -/area/station/command/heads_quarters/captain/private) "iEA" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/north, @@ -22996,10 +23907,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/engine, /area/station/science/explab) -"iEF" = ( -/obj/effect/landmark/start/captain, -/turf/open/floor/iron/dark/small, -/area/station/command/heads_quarters/captain/private) "iEG" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/dark/side{ @@ -23032,6 +23939,20 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/wood/large, /area/station/command/corporate_suite) +"iEX" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/window/spawner/directional/north, +/obj/effect/turf_decal/stripes/end{ + dir = 8 + }, +/obj/structure/disposaloutlet{ + dir = 4; + name = "Cargo Deliveries" + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/service) "iEZ" = ( /obj/structure/chair{ dir = 4 @@ -23044,13 +23965,20 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/aft) "iFi" = ( -/obj/effect/spawner/random/structure/crate, +/obj/effect/spawner/random/vending/colavend, /turf/open/floor/plating/rust, /area/station/maintenance/fore/greater) "iFs" = ( /obj/structure/window/spawner/directional/east, /turf/open/misc/sandy_dirt, /area/station/medical/medbay/lobby) +"iFB" = ( +/obj/structure/tank_dispenser, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron/dark/small, +/area/station/engineering/main) "iFE" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/chair/office{ @@ -23058,14 +23986,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) -"iFM" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/cold/directional/west, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/turf/open/floor/iron/dark/small, -/area/station/tcommsat/server) "iFP" = ( /obj/item/kirbyplants/random/fullysynthetic, /turf/open/floor/plating/rust, @@ -23121,23 +24041,19 @@ /obj/structure/broken_flooring/pile/directional/east, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"iGS" = ( -/obj/structure/hedge, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron/smooth, -/area/station/hallway/secondary/command) "iHg" = ( /obj/structure/cable, /obj/machinery/door/airlock/maintenance/external{ name = "Command Maintanence" }, /obj/effect/mapping_helpers/airlock/access/all/command/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) "iHs" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/spawner/random/engineering/atmospherics_portable, -/turf/open/floor/plating, +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/rust, /area/station/maintenance/fore/greater) "iHy" = ( /obj/structure/window/reinforced/plasma/spawner/directional/east, @@ -23158,6 +24074,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/engine, /area/station/science/xenobiology) +"iHL" = ( +/obj/structure/bookcase/random, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/wood/parquet, +/area/station/service/library) "iHM" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -23204,16 +24126,6 @@ /obj/item/wrench, /turf/open/floor/iron/dark, /area/station/science/lab) -"iIy" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/effect/turf_decal/siding/purple/corner, -/obj/effect/landmark/start/research_director, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) "iIA" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/blue{ @@ -23237,11 +24149,6 @@ }, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/escape) -"iIU" = ( -/obj/structure/chair, -/obj/machinery/sparker/directional/north, -/turf/open/floor/iron/dark/smooth_large, -/area/station/security/execution/education) "iJb" = ( /obj/structure/cable, /obj/structure/table/glass, @@ -23338,14 +24245,6 @@ dir = 1 }, /area/station/command/heads_quarters/hop) -"iKf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "iKm" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -23410,6 +24309,16 @@ }, /turf/open/floor/iron/diagonal, /area/station/command/heads_quarters/hop) +"iLF" = ( +/obj/item/kirbyplants/organic/applebush, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/hallway/primary/central/fore) "iLK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral{ @@ -23462,6 +24371,24 @@ /obj/effect/mapping_helpers/airlock/access/any/security/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"iMy" = ( +/turf/open/misc/asteroid, +/area/space/nearstation) +"iMC" = ( +/obj/machinery/flasher/portable, +/turf/open/floor/plating, +/area/station/security/tram) +"iMI" = ( +/obj/structure/cable, +/obj/structure/sign/warning/no_smoking/circle/directional/north, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/iron/white/corner{ + dir = 8 + }, +/area/station/science/xenobiology) "iMS" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -23512,26 +24439,6 @@ /obj/effect/spawner/random/vending/snackvend, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"iNK" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/closet/crate{ - name = "Outdated Weaponry" - }, -/obj/item/gun/ballistic/shotgun/riot{ - pixel_y = 6 - }, -/obj/item/gun/ballistic/shotgun/riot{ - pixel_y = 6 - }, -/obj/item/gun/ballistic/shotgun/riot{ - pixel_y = 6 - }, -/turf/open/floor/plating, -/area/station/ai_monitored/security/armory) "iNL" = ( /obj/machinery/door/airlock/wood{ desc = "Sessions held every Friday."; @@ -23540,13 +24447,6 @@ /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"iNO" = ( -/obj/machinery/light/cold/directional/north, -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ - dir = 4 - }, -/turf/open/floor/circuit, -/area/station/tcommsat/server) "iNV" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -23652,24 +24552,20 @@ /obj/structure/cable, /turf/open/floor/circuit/green, /area/station/ai_monitored/command/nuke_storage) -"iPv" = ( -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/obj/structure/closet/secure_closet/chemical, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/dark, -/area/station/medical/pharmacy) -"iPD" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/holopad, -/turf/open/floor/iron/dark/small, -/area/station/command/heads_quarters/captain/private) "iPF" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/hallway/primary/aft) +"iPJ" = ( +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 9 + }, +/obj/machinery/computer/mechpad, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/smooth_large, +/area/station/science/robotics/mechbay) "iPU" = ( /mob/living/simple_animal/hostile/mimic/crate, /turf/open/floor/plating, @@ -23696,17 +24592,13 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) -"iQF" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/spawner/random/structure/closet_maintenance, -/obj/effect/spawner/random/maintenance, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "iQK" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating/rust, /area/station/maintenance/fore/greater) "iQU" = ( @@ -23719,9 +24611,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/small, /area/station/service/chapel/storage) +"iRp" = ( +/obj/structure/industrial_lift/tram/white, +/obj/machinery/light/small/directional/east, +/turf/open/floor/noslip/tram_plate, +/area/station/maintenance/port/aft) "iRv" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/glass/plastitanium, +/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/fore/greater) "iRz" = ( @@ -23751,6 +24652,13 @@ }, /turf/open/floor/plating, /area/station/science/ordnance/storage) +"iSi" = ( +/obj/structure/table/wood/fancy/red, +/obj/item/gun/ballistic/automatic/c20r/toy/unrestricted, +/obj/structure/sign/poster/official/random/directional/north, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/wood/parquet, +/area/station/service/greenroom) "iSk" = ( /obj/structure/table, /obj/item/stack/cable_coil/five, @@ -23759,15 +24667,6 @@ "iSr" = ( /turf/open/floor/iron, /area/station/security/execution/transfer) -"iSB" = ( -/obj/structure/cable, -/obj/machinery/door/airlock{ - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "iSK" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -23776,26 +24675,11 @@ /obj/structure/sign/warning/pods/directional/west, /turf/open/floor/iron/checker, /area/station/security/breakroom) -"iSO" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "iSW" = ( /obj/structure/rack, /obj/item/clothing/gloves/boxing/yellow, /turf/open/floor/plating, /area/station/maintenance/fore/greater) -"iTj" = ( -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/turf_decal/siding/wideplating{ - dir = 8 - }, -/turf/open/misc/sandy_dirt, -/area/station/security/tram) "iTn" = ( /obj/machinery/firealarm/directional/north, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -23804,9 +24688,8 @@ /turf/open/floor/iron/dark/herringbone, /area/station/ai_monitored/command/nuke_storage) "iTv" = ( -/obj/structure/cable, -/obj/structure/falsewall, -/turf/open/floor/catwalk_floor/iron_dark, +/obj/item/kirbyplants/random, +/turf/open/floor/wood/parquet, /area/station/service/library) "iTB" = ( /obj/structure/cable, @@ -23859,6 +24742,14 @@ /obj/item/crowbar/large/old, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_command) +"iUq" = ( +/obj/machinery/atmospherics/components/tank/nitrous{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/station/engineering/atmos) "iUy" = ( /obj/structure/rack, /obj/item/clothing/gloves/boxing/green, @@ -23890,13 +24781,6 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) -"iUG" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/all/supply/general, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "iUH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/table/reinforced/titaniumglass, @@ -23976,14 +24860,6 @@ }, /turf/open/floor/plating, /area/station/cargo/miningoffice) -"iVP" = ( -/obj/structure/cable, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/wood/tile, -/area/station/command/meeting_room) "iVT" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -24019,6 +24895,23 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/security/prison/garden) +"iWj" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/siding/dark_red{ + dir = 5 + }, +/obj/machinery/fax{ + fax_name = "Head of Security's Office"; + name = "Head of Security's Fax Machine"; + pixel_y = 9 + }, +/obj/structure/table/glass, +/obj/machinery/firealarm/directional/east, +/obj/machinery/light/small/directional/north, +/turf/open/floor/stone, +/area/station/command/heads_quarters/hos) "iWE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -24027,6 +24920,12 @@ }, /turf/open/floor/iron, /area/station/security) +"iWI" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/transit_tube/horizontal, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "iWQ" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/effect/landmark/start/chemist, @@ -24072,6 +24971,8 @@ dir = 4 }, /obj/structure/broken_flooring/corner/directional/south, +/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/aft) "iXi" = ( @@ -24084,30 +24985,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_command) -"iXj" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood, -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = 7; - pixel_y = 7 - }, -/obj/item/storage/secure/briefcase{ - pixel_y = -10 - }, -/obj/item/flashlight/lamp/green{ - pixel_x = -6; - pixel_y = 11 - }, -/obj/item/pen{ - pixel_x = 8; - pixel_y = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/wood/tile, -/area/station/command/heads_quarters/hop) "iXm" = ( /obj/structure/cable, /obj/structure/disposalpipe/sorting/mail/flip{ @@ -24116,6 +24993,14 @@ /obj/effect/mapping_helpers/mail_sorting/medbay/cmo_office, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"iXB" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 4 + }, +/obj/structure/rack, +/obj/effect/spawner/random/armory/e_gun, +/turf/open/floor/iron/dark/small, +/area/station/ai_monitored/security/armory) "iYh" = ( /obj/structure/canister_frame/machine, /turf/open/floor/plating, @@ -24129,13 +25014,6 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron, /area/station/command/teleporter) -"iYs" = ( -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/wood, -/area/station/maintenance/port/fore) "iYu" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/photocopier, @@ -24159,29 +25037,16 @@ }, /turf/open/floor/iron/small, /area/station/command/teleporter) -"iYG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 +"iYJ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 5 }, -/obj/machinery/computer/teleporter{ +/obj/machinery/atmospherics/components/unary/outlet_injector/layer2{ dir = 8 }, -/obj/machinery/button/door/directional/north{ - id = "teleporterhubshutters"; - name = "Teleporter Shutters"; - pixel_x = 24; - pixel_y = 0; - req_access = list("command") - }, -/turf/open/floor/plating, -/area/station/command/teleporter) -"iYI" = ( -/obj/structure/chair/sofa/corp/right{ - dir = 4 - }, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron/smooth, -/area/station/hallway/secondary/command) +/turf/open/space/basic, +/area/space/nearstation) "iYY" = ( /obj/structure/cable, /turf/open/floor/iron/small, @@ -24262,6 +25127,12 @@ /obj/machinery/drone_dispenser, /turf/open/misc/asteroid, /area/station/maintenance/starboard/greater) +"jat" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ + dir = 4 + }, +/turf/open/floor/circuit, +/area/station/tcommsat/server) "jax" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -24279,6 +25150,15 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/small, /area/station/ai_monitored/command/storage/eva) +"jaG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/showroomfloor, +/area/station/commons/toilet/auxiliary) "jaK" = ( /obj/effect/turf_decal/siding/thinplating_new/terracotta{ dir = 1 @@ -24298,6 +25178,19 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security) +"jaN" = ( +/obj/structure/hedge, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/status_display/supply{ + pixel_y = 32 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/cargo/storage) +"jaP" = ( +/obj/effect/mob_spawn/corpse/human/clown, +/turf/open/floor/plating/airless, +/area/station/science/ordnance/bomb) "jaQ" = ( /turf/open/floor/catwalk_floor/iron_dark, /area/station/security/processing) @@ -24329,8 +25222,13 @@ /turf/open/floor/plating, /area/station/command/heads_quarters/rd) "jbm" = ( -/turf/closed/mineral/random/stationside, -/area/station/maintenance/fore/greater) +/obj/machinery/firealarm/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/structure/broken_flooring/corner/directional/north, +/obj/structure/sign/poster/official/random/directional/west, +/obj/effect/spawner/random/vending/snackvend, +/turf/open/floor/plating, +/area/station/commons/fitness/recreation/entertainment) "jbr" = ( /obj/structure/table/glass, /obj/item/folder/blue{ @@ -24339,16 +25237,6 @@ }, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/cmo) -"jbJ" = ( -/obj/structure/chair/wood/wings{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/stone, -/area/station/command/heads_quarters/captain/private) "jbV" = ( /obj/machinery/photocopier, /turf/open/floor/iron/dark, @@ -24365,6 +25253,7 @@ /obj/effect/spawner/random/entertainment/plushie, /obj/effect/spawner/random/entertainment/plushie, /obj/effect/spawner/random/entertainment/plushie, +/obj/structure/alien/weeds, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "jco" = ( @@ -24411,22 +25300,6 @@ /obj/machinery/atmospherics/components/trinary/filter/flipped/layer2, /turf/open/floor/iron/smooth, /area/station/maintenance/disposal/incinerator) -"jcS" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/turf_decal/siding/dark_red{ - dir = 5 - }, -/obj/machinery/fax{ - fax_name = "Head of Security's Office"; - name = "Head of Security's Fax Machine"; - pixel_y = 9 - }, -/obj/structure/table/glass, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/stone, -/area/station/command/heads_quarters/hos) "jcU" = ( /obj/structure/chair/wood/wings{ dir = 1 @@ -24444,22 +25317,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) -"jda" = ( -/obj/structure/cable, -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/wood/large, -/area/station/command/heads_quarters/captain/private) -"jdo" = ( -/obj/machinery/light_switch/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/freezer, -/area/station/command/heads_quarters/captain/private) "jdp" = ( /obj/structure/sink/directional/west, /obj/structure/mirror/directional/east, @@ -24488,22 +25345,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/rust, /area/station/maintenance/fore/greater) -"jeq" = ( -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/turf/open/floor/wood/large, -/area/station/command/corporate_suite) "jey" = ( -/obj/structure/cable, -/obj/machinery/portable_atmospherics/pump, -/turf/open/floor/plating/rust, -/area/station/maintenance/fore/greater) +/obj/machinery/vending/clothing, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "jez" = ( -/obj/structure/cable, -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) +/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/commons/fitness/recreation/entertainment) "jeC" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -24532,11 +25383,12 @@ /turf/open/floor/plating, /area/station/medical/medbay/lobby) "jeX" = ( -/obj/structure/cable, -/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/light/small/directional/east, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/rust, -/area/station/maintenance/fore/greater) +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/broken_flooring/singular/directional/west, +/turf/open/floor/plating, +/area/station/commons/fitness/recreation/entertainment) "jfs" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 @@ -24559,32 +25411,16 @@ /obj/effect/mapping_helpers/requests_console/supplies, /turf/open/floor/iron/dark, /area/station/medical/pharmacy) -"jfG" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/hallway/abandoned_command) "jfP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock{ name = "Faded Door" }, /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/fore/greater) -"jfQ" = ( -/obj/structure/cable, -/obj/machinery/light/dim/directional/east, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"jfT" = ( -/obj/structure/cable, -/obj/structure/closet/crate/coffin, -/obj/structure/window/spawner/directional/south, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/service/chapel/funeral) "jfX" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 6 @@ -24613,6 +25449,10 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) +"jgZ" = ( +/obj/structure/closet/secure_closet/engineering_electrical, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "jhm" = ( /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) @@ -24655,22 +25495,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_half, /area/station/hallway/primary/aft) -"jif" = ( -/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/white, -/area/station/science/robotics/augments) "jig" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 9 @@ -24752,16 +25576,6 @@ "jjq" = ( /turf/closed/wall, /area/station/cargo/warehouse) -"jju" = ( -/obj/structure/table/reinforced/titaniumglass, -/obj/item/pipe_dispenser{ - pixel_x = 10; - pixel_y = 7 - }, -/obj/item/pipe_dispenser, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/small, -/area/station/engineering/supermatter/room) "jjH" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -24770,6 +25584,12 @@ /obj/structure/filingcabinet/chestdrawer, /turf/open/floor/iron, /area/station/science/xenobiology) +"jjJ" = ( +/obj/structure/bed/dogbed/renault, +/mob/living/basic/pet/fox/renault, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/carpet/executive, +/area/station/command/heads_quarters/captain/private) "jjO" = ( /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ dir = 8 @@ -24900,6 +25720,12 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) +"jme" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/iron/textured_half, +/area/station/service/theater) "jmi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -25010,25 +25836,21 @@ }, /turf/open/floor/plating, /area/station/command/corporate_showroom) -"joj" = ( -/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/machinery/atmospherics/pipe/smart/simple/dark/hidden{ - dir = 10 - }, -/turf/open/floor/iron/dark, -/area/station/tcommsat/server) "jon" = ( /obj/structure/disposalpipe/segment, /obj/structure/chair/stool/directional/south, /turf/open/floor/plating, /area/station/cargo/sorting) +"joy" = ( +/obj/structure/cable, +/turf/open/floor/wood/parquet, +/area/station/service/library) "joS" = ( /obj/machinery/light/broken/directional/north, /obj/effect/decal/cleanable/dirt, /obj/structure/showcase/machinery/tv/broken, /obj/effect/decal/cleanable/glass, +/obj/structure/alien/weeds, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) "jpm" = ( @@ -25052,6 +25874,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"jpJ" = ( +/obj/structure/window/spawner/directional/south, +/obj/effect/turf_decal/stripes/box, +/obj/structure/sign/warning/pods/directional/north, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "jpK" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ @@ -25125,6 +25954,12 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) +"jqQ" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/spacebridge) "jqZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -25132,13 +25967,6 @@ }, /turf/open/floor/iron, /area/station/security/prison/rec) -"jrb" = ( -/obj/structure/cable, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/machinery/light/floor, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/iron/dark/small, -/area/station/security/brig) "jrk" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -25194,10 +26022,17 @@ /obj/structure/flora/tree/jungle/small/style_random, /turf/open/floor/grass, /area/station/service/hydroponics/garden/monastery) -"jsn" = ( -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) +"jsc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/smooth_large, +/area/station/science/auxlab/firing_range) "jsv" = ( /obj/structure/cable, /obj/machinery/holopad, @@ -25215,6 +26050,17 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"jsI" = ( +/obj/structure/table, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt, +/obj/item/hand_labeler, +/obj/item/camera, +/obj/machinery/firealarm/directional/north, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/commons/storage/art) "jsN" = ( /obj/structure/hedge, /obj/effect/decal/cleanable/cobweb/cobweb2, @@ -25229,6 +26075,13 @@ /obj/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/aft) +"jtd" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "jte" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -25249,15 +26102,6 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/diagonal, /area/station/command/heads_quarters/hop) -"jtx" = ( -/obj/structure/cable, -/obj/structure/table/wood, -/obj/machinery/fax{ - fax_name = "Head of Personnel's Office"; - name = "Head of Personnel's Fax Machine" - }, -/turf/open/floor/iron/grimy, -/area/station/command/heads_quarters/hop) "jtI" = ( /turf/open/floor/iron/white/side{ dir = 4 @@ -25266,6 +26110,16 @@ "jtK" = ( /turf/open/floor/iron/small, /area/station/maintenance/department/medical/central) +"jtY" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/status_display/ai/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "jug" = ( /obj/machinery/door/airlock/hatch{ name = "Tool Supply Corridor" @@ -25279,6 +26133,9 @@ }, /obj/structure/table, /obj/effect/decal/cleanable/dirt, +/obj/item/stack/package_wrap{ + pixel_y = 5 + }, /obj/item/storage/box/matches, /turf/open/floor/iron, /area/station/cargo/sorting) @@ -25288,13 +26145,6 @@ /obj/effect/landmark/start/head_of_personnel, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/hop) -"juX" = ( -/obj/structure/cable, -/obj/structure/closet/secure_closet/hop, -/obj/item/hand_labeler, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/grimy, -/area/station/command/heads_quarters/hop) "jvB" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -25313,6 +26163,7 @@ /obj/effect/turf_decal/tile/dark_red/half/contrasted{ dir = 1 }, +/obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/escape) "jvP" = ( @@ -25338,6 +26189,7 @@ pixel_x = -32; spawn_loot_chance = 50 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "jwi" = ( @@ -25354,6 +26206,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"jwC" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/structure/industrial_lift/tram, +/obj/structure/window/reinforced/tram/directional/south, +/obj/structure/rack, +/turf/open/floor/noslip/tram_platform, +/area/station/maintenance/port/aft) "jxd" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible/layer2{ dir = 9 @@ -25382,6 +26241,12 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter) +"jxy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/navigate_destination/library, +/turf/open/floor/wood/parquet, +/area/station/service/library) "jxC" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25396,6 +26261,65 @@ "jxD" = ( /turf/open/floor/iron, /area/station/maintenance/starboard/greater) +"jxJ" = ( +/obj/structure/hedge, +/obj/machinery/status_display/supply{ + pixel_y = -32 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/station/cargo/storage) +"jxU" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 9 + }, +/obj/structure/window/spawner/directional/west, +/obj/structure/rack, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health{ + pixel_x = 1; + pixel_y = 2 + }, +/obj/item/clothing/glasses/hud/health{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/clothing/glasses/hud/health{ + pixel_x = 3; + pixel_y = 6 + }, +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/white/small, +/area/station/medical/storage) +"jxV" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/modular_computer/preset/id, +/obj/machinery/button/ticket_machine{ + pixel_x = 9; + pixel_y = 23 + }, +/obj/machinery/button/door/directional/south{ + id = "hop"; + name = "Privacy Shutters Control"; + pixel_x = -2; + pixel_y = 23; + req_access = list("hop") + }, +/obj/machinery/button/door/directional/south{ + id = "hopqueue"; + name = "Queue Shutters Control"; + pixel_x = -13; + pixel_y = 23; + req_access = list("hop") + }, +/obj/machinery/button/flasher{ + id = "hopflash"; + pixel_x = -23; + pixel_y = 11 + }, +/turf/open/floor/iron/dark/textured_corner, +/area/station/command/heads_quarters/hop) "jxZ" = ( /obj/effect/turf_decal/siding/blue{ dir = 6 @@ -25426,6 +26350,12 @@ /obj/effect/landmark/start/captain, /turf/open/floor/wood/large, /area/station/command/heads_quarters/captain) +"jyw" = ( +/obj/effect/landmark/start/cyborg, +/obj/machinery/status_display/ai/directional/east, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload_foyer) "jyG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -25469,12 +26399,14 @@ /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) -"jzl" = ( -/obj/structure/cable, -/obj/effect/turf_decal/sand/plating, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) +"jza" = ( +/obj/machinery/rnd/production/techfab/department/service, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/iron/kitchen/small, +/area/station/hallway/secondary/service) "jzo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -25503,20 +26435,6 @@ dir = 1 }, /area/station/engineering/storage/tech) -"jAe" = ( -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron, -/area/station/service/hydroponics) "jAn" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/spawner/random/maintenance, @@ -25537,7 +26455,9 @@ /area/station/hallway/secondary/construction) "jAs" = ( /obj/structure/cable, -/obj/effect/turf_decal/sand/plating, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/fore/greater) "jAw" = ( @@ -25559,16 +26479,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_recreation) -"jAS" = ( -/obj/effect/turf_decal/stripes/end, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister/carbon_dioxide, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/station/security/execution/education) +"jAR" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron, +/area/station/security/tram) "jAV" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -25628,15 +26543,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"jCr" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/item/kirbyplants/random/fullysynthetic, -/obj/effect/turf_decal/siding/white{ - dir = 8 - }, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/aft) "jCA" = ( /obj/structure/disposalpipe/segment, /obj/structure/table, @@ -25681,6 +26587,19 @@ /obj/item/gun/ballistic/rifle/boltaction/pipegun, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) +"jDt" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/door/airlock/maintenance/glass, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/any/command/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/fore/lesser) "jDv" = ( /obj/machinery/light/small/directional/east, /obj/structure/closet/firecloset, @@ -25697,6 +26616,12 @@ dir = 8 }, /area/station/command/corporate_showroom) +"jDM" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/hedge, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/command/corporate_dock) "jDP" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -25812,20 +26737,41 @@ }, /turf/open/floor/iron, /area/station/cargo/office) +"jEX" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/structure/window/reinforced/tram/directional/west, +/obj/structure/chair{ + dir = 1 + }, +/obj/structure/industrial_lift/tram, +/turf/open/floor/noslip/tram_platform, +/area/station/security/tram) "jEZ" = ( /obj/structure/hedge, /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) +"jFc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/trash/cheesie{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/structure/table, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) +"jFf" = ( +/obj/effect/turf_decal/tile/green/diagonal_centre, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/diagonal, +/area/station/hallway/primary/central/aft) "jFh" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"jFk" = ( -/obj/effect/landmark/start/scientist, -/turf/open/floor/iron/smooth_large, -/area/station/science/auxlab/firing_range) "jFs" = ( /obj/machinery/light/small/broken/directional/east, /turf/open/floor/wood, @@ -25879,6 +26825,11 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) +"jFY" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/floor, +/turf/open/floor/iron/smooth, +/area/station/service/library) "jGc" = ( /obj/structure/window/spawner/directional/east, /turf/open/floor/iron/showroomfloor, @@ -25900,6 +26851,18 @@ dir = 1 }, /area/station/hallway/secondary/entry) +"jGL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ + dir = 8 + }, +/obj/structure/sign/warning/cold_temp/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/science/xenobiology) "jGN" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -25915,28 +26878,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/auxlab/firing_range) -"jGX" = ( -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/neutral/full, -/obj/item/reagent_containers/cup/glass/drinkingglass{ - pixel_x = -5; - pixel_y = 22 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass{ - pixel_x = -1; - pixel_y = 13 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass{ - pixel_x = -8; - pixel_y = 6 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass{ - pixel_x = 5; - pixel_y = 4 - }, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/iron/smooth_large, -/area/station/service/bar) +"jHa" = ( +/obj/effect/landmark/secequipment, +/obj/item/clothing/under/rank/security/officer/formal, +/obj/item/clothing/under/rank/security/officer/formal, +/obj/item/clothing/suit/jacket/officer/blue, +/obj/item/clothing/suit/jacket/officer/blue, +/obj/item/clothing/head/beret/sec/navyofficer, +/obj/item/clothing/head/beret/sec/navyofficer, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plating, +/area/station/security/tram) "jHi" = ( /obj/structure/table/glass, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -25956,15 +26908,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_command) -"jHm" = ( -/obj/item/storage/backpack/duffelbag/sec{ - pixel_x = -15; - pixel_y = 7 +"jHq" = ( +/obj/structure/table, +/obj/item/storage/box/prisoner{ + pixel_y = 6 }, -/obj/structure/sign/poster/official/random/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/security/office) +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/machinery/incident_display/tram/directional/north, +/turf/open/floor/iron, +/area/station/security/tram) "jHx" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold/dark/hidden, @@ -25976,7 +26928,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/holopad, -/mob/living/simple_animal/sloth/citrus, +/mob/living/basic/sloth/citrus, /turf/open/floor/iron, /area/station/cargo/storage) "jHE" = ( @@ -26118,6 +27070,16 @@ "jKf" = ( /turf/closed/wall/rust, /area/station/service/library/abandoned) +"jKh" = ( +/obj/machinery/vending/hydroseeds{ + slogan_delay = 700 + }, +/obj/effect/turf_decal/delivery/white{ + color = "#52B4E9" + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white/small, +/area/station/service/hydroponics) "jKj" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -26133,6 +27095,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/cargo/office) +"jKm" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/turf_decal/tile/dark_red/half/contrasted{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/light/cold/directional/south, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron, +/area/station/security/brig/entrance) "jKq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26158,22 +27134,38 @@ dir = 4 }, /area/station/cargo/office) +"jKG" = ( +/obj/machinery/incident_display/delam/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "jKJ" = ( /obj/machinery/door/window/right/directional/north, /turf/open/floor/iron, /area/station/security/prison/workout) +"jKS" = ( +/obj/structure/table/reinforced, +/obj/item/trash/cheesie{ + pixel_x = 2; + pixel_y = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "jLi" = ( /obj/effect/landmark/start/virologist, /turf/open/floor/iron/showroomfloor, /area/station/medical/virology) -"jLo" = ( -/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ - dir = 6 - }, -/obj/machinery/light/cold/directional/north, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) +"jLl" = ( +/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) "jLr" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -26232,14 +27224,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/smooth_large, /area/station/cargo/warehouse) -"jMj" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "jMk" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -26254,11 +27238,20 @@ /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"jMo" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Waste to Exhaust" + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "jMv" = ( /obj/structure/industrial_lift/tram, -/obj/effect/landmark/tram/birdshot/maint_left{ - specific_lift_id = "maint_tram" - }, +/obj/effect/landmark/tram/nav/birdshot/maint, +/obj/effect/landmark/tram/platform/birdshot/maint_left, /turf/open/floor/noslip/tram_plate, /area/station/maintenance/port/aft) "jMC" = ( @@ -26283,6 +27276,19 @@ /obj/machinery/light/cold/directional/north, /turf/open/floor/iron/dark, /area/station/cargo/office) +"jMX" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/station/security/brig/entrance) "jNc" = ( /obj/effect/turf_decal/bot_white, /obj/effect/spawner/random/structure/crate, @@ -26335,10 +27341,6 @@ /obj/machinery/status_display/evac/directional/west, /turf/open/misc/sandy_dirt, /area/station/hallway/primary/central/fore) -"jNZ" = ( -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/smooth_half, -/area/station/hallway/primary/central/fore) "jOb" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -26350,17 +27352,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) -"jOc" = ( -/mob/living/simple_animal/hostile/asteroid/basilisk, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid, -/area/station/maintenance/fore/greater) -"jOd" = ( -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/turf/open/floor/iron/smooth, -/area/station/hallway/primary/central/fore) "jOh" = ( /obj/structure/cable, /obj/machinery/door/firedoor, @@ -26386,16 +27377,10 @@ /obj/machinery/status_display/evac/directional/east, /turf/open/misc/sandy_dirt, /area/station/hallway/primary/central/fore) -"jOw" = ( -/obj/structure/chair/plastic{ - dir = 4 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/glass, -/area/station/hallway/secondary/spacebridge) "jOF" = ( /obj/item/kirbyplants/random, /obj/machinery/light_switch/directional/west, +/obj/machinery/airalarm/directional/north, /turf/open/floor/iron, /area/station/construction/mining/aux_base) "jOK" = ( @@ -26412,6 +27397,14 @@ /obj/effect/landmark/start/captain, /turf/open/floor/carpet/executive, /area/station/command/heads_quarters/captain/private) +"jOW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/commons) "jPg" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/broken_flooring/corner/directional/south, @@ -26425,43 +27418,18 @@ /area/station/cargo/warehouse) "jPq" = ( /obj/structure/disposalpipe/segment, -/turf/closed/wall, +/obj/effect/spawner/structure/window/reinforced/tinted, +/turf/open/floor/plating, /area/station/maintenance/fore/greater) -"jPO" = ( -/obj/structure/disposalpipe/segment, +"jPr" = ( /obj/structure/cable, -/obj/machinery/door/airlock/maintenance/glass, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/access/any/command/maintenance, -/obj/effect/mapping_helpers/airlock/access/any/command/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/fore/lesser) -"jQh" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/closet/secure_closet/personal, -/obj/item/storage/backpack, -/obj/item/storage/backpack/satchel, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/winterboots, -/obj/machinery/light/small/directional/north, -/obj/effect/landmark/start/hangover/closet, -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/sign/poster/official/random/directional/north, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/commons) -"jQi" = ( -/obj/machinery/vending/clothing, -/obj/machinery/camera/directional/north, -/turf/open/floor/iron, -/area/station/commons) +/obj/machinery/duct, +/obj/effect/mapping_helpers/broken_floor, +/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/fore/greater) "jQo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/airlock/research/glass{ @@ -26475,20 +27443,21 @@ /obj/structure/chair{ pixel_y = -2 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, /turf/open/floor/wood, /area/station/maintenance/fore/greater) "jQL" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /turf/open/floor/iron, /area/station/maintenance/fore/greater) -"jQM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/stool/directional/east, -/obj/machinery/light/small/directional/west, -/turf/open/floor/wood, -/area/station/maintenance/port/fore) "jQW" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -26506,14 +27475,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/white/small, /area/station/maintenance/port/aft) -"jRh" = ( -/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/dark_red/opposingcorners, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron, -/area/station/security/brig/entrance) "jRk" = ( /obj/effect/turf_decal/siding/white{ dir = 1 @@ -26523,10 +27484,17 @@ }, /turf/open/floor/iron/smooth, /area/station/command/corporate_showroom) +"jRx" = ( +/obj/structure/chair/sofa/bench, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) "jRz" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/window/reinforced/spawner/directional/east, /obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /turf/open/floor/plating, /area/station/maintenance/fore/greater) "jRE" = ( @@ -26608,6 +27576,7 @@ name = "Detective's Office" }, /obj/effect/mapping_helpers/airlock/access/all/security/detective, +/obj/structure/cable, /turf/open/floor/iron/textured_half, /area/station/security/detectives_office) "jTu" = ( @@ -26645,6 +27614,18 @@ dir = 1 }, /area/station/hallway/primary/aft) +"jUc" = ( +/obj/structure/cable, +/obj/machinery/firealarm/directional/east, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"jUl" = ( +/obj/machinery/door/airlock/external{ + name = "Common Mining Dock" + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/dock) "jUm" = ( /obj/structure/table/reinforced/titaniumglass, /obj/item/pen{ @@ -26669,14 +27650,6 @@ /obj/item/instrument/harmonica, /turf/open/floor/iron, /area/station/security/prison/rec) -"jUv" = ( -/obj/effect/turf_decal/tile/blue, -/obj/machinery/airalarm/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/aft) "jUN" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 5 @@ -26702,18 +27675,11 @@ "jVM" = ( /turf/closed/wall, /area/station/maintenance/central/greater) -"jVQ" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/firealarm/directional/south, +"jVO" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/station/cargo/storage) -"jWb" = ( -/obj/machinery/light/cold/directional/west, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/pdapainter/security, -/obj/machinery/status_display/ai/directional/south, -/turf/open/floor/wood/parquet, -/area/station/command/heads_quarters/cmo) +/area/station/hallway/secondary/recreation) "jWd" = ( /obj/structure/cable, /obj/item/kirbyplants/random/fullysynthetic, @@ -26730,14 +27696,6 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"jWm" = ( -/obj/structure/cable, -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/iron/smooth, -/area/station/hallway/secondary/command) "jWp" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 @@ -26769,6 +27727,16 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/security/courtroom) +"jWA" = ( +/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/landmark/start/bitrunner, +/turf/open/floor/iron, +/area/station/cargo/storage) "jWO" = ( /obj/effect/turf_decal/tile/blue, /obj/machinery/camera/autoname/directional/south, @@ -26776,6 +27744,10 @@ dir = 8 }, /area/station/hallway/secondary/dock) +"jWR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "jWZ" = ( /obj/machinery/mineral/ore_redemption{ dir = 4; @@ -26789,12 +27761,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/textured_large, /area/station/cargo/office) -"jXd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/floor, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/hallway/secondary/command) "jXe" = ( /obj/machinery/holopad/secure, /turf/open/floor/iron/smooth, @@ -26808,23 +27774,12 @@ /obj/effect/mapping_helpers/airlock/access/any/security/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"jXk" = ( -/obj/effect/turf_decal/tile/brown/fourcorners, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "jXl" = ( /obj/effect/decal/cleanable/glass, /obj/structure/grille, /obj/item/shard, /turf/open/floor/plating, /area/station/hallway/primary/central/fore) -"jXo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/floor, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/hallway/secondary/command) "jXr" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26836,6 +27791,18 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/junction, /turf/open/floor/catwalk_floor/iron_dark, /area/station/tcommsat/server) +"jXA" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research{ + name = "Telecomms Storage" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/iron/white/textured_half, +/area/station/engineering/storage/tcomms) "jXC" = ( /obj/effect/turf_decal/tile/dark_red/half/contrasted{ dir = 1 @@ -26843,6 +27810,17 @@ /obj/effect/turf_decal/siding/wideplating/dark/corner, /turf/open/floor/iron, /area/station/security) +"jXQ" = ( +/obj/structure/flora/bush/large/style_random{ + pixel_x = -18; + pixel_y = -9 + }, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/siding/wideplating{ + dir = 8 + }, +/turf/open/misc/sandy_dirt, +/area/station/security/tram) "jXR" = ( /obj/structure/disposalpipe/trunk{ dir = 8 @@ -26869,6 +27847,14 @@ }, /turf/open/floor/noslip/tram_platform, /area/station/security/tram) +"jYr" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/mecha_part_fabricator{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/box, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) "jYu" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, @@ -26900,23 +27886,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/half, /area/station/hallway/primary/central/fore) -"jYV" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/stripes/white/line{ - dir = 9 - }, -/turf/open/floor/engine, -/area/station/science/explab) -"jYW" = ( -/obj/machinery/door/airlock/maintenance/external{ - name = "Command Storeroom" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/access/any/command/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/department/bridge) "jYY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26932,10 +27901,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/command/heads_quarters/qm) -"jZh" = ( -/obj/machinery/vending/boozeomat, -/turf/closed/wall, -/area/station/service/bar) "jZl" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmospherics_engine) @@ -26946,12 +27911,6 @@ dir = 1 }, /area/station/hallway/primary/central/fore) -"jZs" = ( -/obj/structure/bed/dogbed/renault, -/mob/living/simple_animal/pet/fox/renault, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/carpet/executive, -/area/station/command/heads_quarters/captain/private) "jZI" = ( /obj/item/storage/backpack/duffelbag/sec{ pixel_y = 12 @@ -26967,10 +27926,7 @@ /turf/open/floor/plating, /area/station/maintenance/department/prison) "jZK" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/junction/yjunction, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_command) "jZL" = ( @@ -26997,16 +27953,16 @@ /turf/open/floor/plating, /area/station/maintenance/department/engine) "kam" = ( -/obj/structure/cable, -/obj/structure/table, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb, -/obj/item/storage/box/mousetraps{ - pixel_x = -3; - pixel_y = 8 +/obj/machinery/disposal/delivery_chute{ + dir = 4 }, -/turf/open/floor/iron/white/small, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/box, +/turf/open/floor/plating, /area/station/service/janitor) "kar" = ( /obj/structure/disposalpipe/segment, @@ -27047,11 +28003,8 @@ /obj/structure/disposalpipe/trunk{ dir = 1 }, -/obj/effect/turf_decal/stripes/end{ - dir = 1 - }, /obj/machinery/disposal/delivery_chute, -/obj/structure/sign/poster/official/random/directional/north, +/obj/effect/turf_decal/stripes/box, /turf/open/floor/plating, /area/station/service/janitor) "kaI" = ( @@ -27084,22 +28037,6 @@ /obj/structure/broken_flooring/corner/directional/south, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) -"kbc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/window/left/directional/east{ - name = "Trash Chute"; - req_access = list("janitor") - }, -/obj/machinery/conveyor_switch/oneway{ - dir = 4; - id = "garbage"; - name = "trash chute" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/small, -/area/station/service/janitor) "kbE" = ( /obj/effect/decal/cleanable/blood/gibs/body, /obj/machinery/light/small/broken/directional/north, @@ -27107,7 +28044,6 @@ /area/station/service/abandoned_gambling_den) "kbW" = ( /obj/effect/mapping_helpers/broken_floor, -/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/carpet/orange, /area/station/service/abandoned_gambling_den) "kbY" = ( @@ -27127,6 +28063,11 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"kcs" = ( +/obj/effect/turf_decal/tile/green/diagonal_centre, +/obj/effect/landmark/navigate_destination/kitchen, +/turf/open/floor/iron/diagonal, +/area/station/hallway/primary/central/aft) "kct" = ( /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -27139,18 +28080,25 @@ /obj/effect/decal/cleanable/blood/gibs/old, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) +"kcA" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/showroomfloor, +/area/station/medical/surgery/theatre) "kcT" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) -"kde" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/light/cold/directional/west, +"kdl" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/structure/sign/departments/vault/directional/south, /turf/open/floor/iron, -/area/station/cargo/storage) +/area/station/hallway/secondary/spacebridge) "kdn" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating, @@ -27188,12 +28136,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"kdS" = ( -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/machinery/light/cold/directional/east, -/obj/structure/closet/secure_closet/miner, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "kea" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -27225,22 +28167,19 @@ /obj/effect/spawner/random/structure/girder, /turf/open/floor/noslip/tram_platform, /area/station/security/tram) +"kel" = ( +/obj/machinery/light/cold/directional/south, +/obj/machinery/modular_computer/preset/id{ + dir = 1 + }, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/cmo) "ket" = ( /turf/open/floor/iron, /area/station/security/prison/work) "kev" = ( /turf/closed/wall, /area/station/hallway/secondary/spacebridge) -"kex" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/obj/machinery/light/cold/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron, -/area/station/cargo/sorting) "keZ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -27273,11 +28212,6 @@ dir = 8 }, /area/station/hallway/secondary/dock) -"kfA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "kfC" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, @@ -27298,24 +28232,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"kgc" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/blue/full, -/obj/machinery/light/cold/directional/north, -/obj/item/storage/medkit/brute{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/medkit/brute{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/reagent_containers/cup/bottle/morphine{ - pixel_x = 4; - pixel_y = -9 - }, -/turf/open/floor/iron/white/smooth_large, -/area/station/medical/storage) "kgh" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -27482,10 +28398,8 @@ "kjh" = ( /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/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_command) "kjl" = ( @@ -27583,29 +28497,20 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/iron/white/small, /area/station/medical/treatment_center) +"kks" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/obj/structure/broken_flooring/singular/directional/south, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/starboard/aft) "kkD" = ( /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/mapping_helpers/broken_floor, -/obj/effect/turf_decal/stripes/corner, -/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_command) -"kkF" = ( -/obj/structure/table, -/obj/item/clothing/gloves/color/orange{ - pixel_x = 4; - pixel_y = -2 - }, -/obj/item/stack/tile/iron{ - pixel_y = 18 - }, -/obj/item/key/janitor{ - pixel_x = -3; - pixel_y = 6 - }, -/turf/open/floor/iron/white/small, -/area/station/service/janitor) "kkL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -27655,6 +28560,11 @@ /obj/structure/chair/stool/directional/east, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) +"klH" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/security/processing) "klR" = ( /obj/machinery/computer/slot_machine{ pixel_y = 2 @@ -27662,10 +28572,15 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/carpet/orange, /area/station/service/abandoned_gambling_den) -"klZ" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron/chapel, -/area/station/maintenance/starboard/greater) +"kmb" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/computer/holodeck{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "kmd" = ( /obj/structure/cable, /obj/machinery/door/airlock/external{ @@ -27730,6 +28645,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"kmS" = ( +/obj/machinery/power/shuttle_engine/propulsion{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/commons/fitness/recreation/entertainment) "kmT" = ( /obj/structure/closet/firecloset, /turf/open/floor/plating, @@ -27744,6 +28665,14 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"knt" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/broken_flooring/pile/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/hallway/abandoned_command) "knv" = ( /turf/closed/wall, /area/station/maintenance/department/engine/atmos) @@ -27753,12 +28682,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"knF" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/recharge_station, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) "knJ" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -27795,14 +28718,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"kow" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/tcommsat/server) "koz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral{ @@ -27817,16 +28732,6 @@ }, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) -"kpw" = ( -/obj/structure/disposalpipe/junction{ - 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/north, -/obj/structure/cable, -/turf/open/floor/iron/smooth, -/area/station/command/heads_quarters/qm) "kpz" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod Three"; @@ -27846,16 +28751,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"kpS" = ( -/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/light/cold/directional/north, -/turf/open/floor/iron/smooth, -/area/station/command/heads_quarters/qm) "kpT" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -27875,12 +28770,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/engine) -"kqi" = ( -/obj/structure/flora/bush/flowers_br/style_random, -/obj/structure/beebox, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/grass, -/area/station/service/hydroponics) +"kqb" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/turf/open/floor/iron/white/side, +/area/station/science/research) "kqo" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -27917,6 +28814,19 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"kqO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/thinplating_new/corner{ + dir = 1 + }, +/obj/machinery/holopad, +/obj/effect/turf_decal/siding/thinplating_new/corner{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/small, +/area/station/medical/morgue) "kqQ" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -27963,6 +28873,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/port/fore) +"krd" = ( +/obj/machinery/rnd/production/circuit_imprinter/department/science, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/science/lab) "kro" = ( /obj/item/kirbyplants/random/fullysynthetic, /turf/open/floor/iron, @@ -28034,6 +28951,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/port/fore) +"kst" = ( +/obj/structure/chair/plastic{ + dir = 4 + }, +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/spacebridge) "ksx" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -28082,8 +29008,14 @@ "ksN" = ( /obj/structure/transit_tube/station/dispenser, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) +"ksP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/smooth, +/area/station/hallway/secondary/command) "ksX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -28091,7 +29023,6 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron, /area/station/engineering/gravity_generator) "ktc" = ( @@ -28101,6 +29032,21 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/cargo/office) +"kte" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/dark/small, +/area/station/service/chapel/storage) +"ktB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/item/kirbyplants/random, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/science/xenobiology) "ktD" = ( /obj/machinery/computer/camera_advanced/base_construction/aux{ dir = 1 @@ -28112,6 +29058,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/cargo/office) +"ktN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "ktZ" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/bookcase/random, @@ -28139,17 +29092,6 @@ /obj/machinery/computer/cargo/request, /turf/open/floor/plating, /area/station/hallway/primary/central/fore) -"kuv" = ( -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/hallway/primary/central/fore) "kux" = ( /obj/structure/cable, /obj/machinery/door/firedoor, @@ -28175,18 +29117,10 @@ /obj/effect/turf_decal/trimline/neutral/line, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"kuY" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/siding/purple, -/obj/item/kirbyplants/random, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/science/genetics) "kvb" = ( -/obj/effect/landmark/tram/birdshot/sec_wing{ - specific_lift_id = "prison_tram" - }, /obj/structure/industrial_lift/tram/white, +/obj/effect/landmark/tram/nav/birdshot/prison, +/obj/effect/landmark/tram/platform/birdshot/sec_wing, /turf/open/floor/noslip/tram_platform, /area/station/security/tram) "kvf" = ( @@ -28215,11 +29149,6 @@ }, /turf/open/space/basic, /area/space) -"kvK" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/station/maintenance/hallway/abandoned_command) "kvO" = ( /obj/machinery/light/small/directional/north, /obj/machinery/camera/directional/east{ @@ -28246,6 +29175,21 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/security/execution/transfer) +"kwu" = ( +/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) +"kwz" = ( +/obj/structure/closet/secure_closet/engineering_personal, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark/small, +/area/station/engineering/main) "kwA" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -28272,15 +29216,37 @@ dir = 1 }, /obj/effect/decal/cleanable/blood/old, +/obj/structure/alien/weeds, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) "kxp" = ( /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/white, /area/station/hallway/primary/starboard) +"kxD" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"kxK" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/main) "kxL" = ( /turf/open/floor/iron/dark/small, /area/station/hallway/secondary/entry) +"kxO" = ( +/obj/structure/cable, +/turf/open/floor/iron/dark/herringbone, +/area/station/security/execution/education) "kxX" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -28379,6 +29345,16 @@ /obj/effect/turf_decal/trimline/neutral/line, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"kzv" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 8 + }, +/obj/machinery/status_display/evac/directional/east, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/exit/departure_lounge) "kzx" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -28392,15 +29368,6 @@ }, /turf/open/floor/iron/small, /area/station/hallway/primary/central/fore) -"kzF" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/light/cold/directional/north, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron, -/area/station/cargo/storage) "kzI" = ( /obj/effect/turf_decal/bot_white, /obj/effect/spawner/random/structure/crate_empty, @@ -28409,6 +29376,7 @@ "kzP" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) "kzX" = ( @@ -28419,16 +29387,9 @@ /obj/structure/transit_tube/station/dispenser/flipped{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) -"kAg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=14.0-Dormatories-CentralStarboard"; - location = "13.0-DormatoryCommons-Dormatories" - }, -/turf/open/floor/iron, -/area/station/commons/dorms) "kAk" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/dark_red/opposingcorners, @@ -28450,20 +29411,6 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/stone, /area/station/maintenance/aft) -"kAS" = ( -/obj/structure/closet/crate, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/item/tank/internals/oxygen, -/obj/item/tank/internals/oxygen, -/obj/item/tank/internals/oxygen, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/machinery/light/cold/directional/west, -/turf/open/floor/plating, -/area/station/command/teleporter) "kBc" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -28505,12 +29452,6 @@ /obj/effect/landmark/start/medical_doctor, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"kCl" = ( -/obj/machinery/light/cold/directional/east, -/obj/effect/spawner/random/vending/colavend, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/smooth, -/area/station/hallway/secondary/command) "kCo" = ( /obj/structure/closet/emcloset, /obj/effect/decal/cleanable/dirt, @@ -28539,16 +29480,24 @@ /turf/open/floor/plating, /area/station/maintenance/fore/lesser) "kCN" = ( -/obj/machinery/holopad, /obj/effect/decal/cleanable/dirt, +/obj/machinery/door/window/left/directional/north{ + name = "Trash Chute" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white/small, /area/station/service/janitor) "kCP" = ( /obj/effect/turf_decal/stripes/line{ - dir = 5 + dir = 1 }, -/obj/structure/window/reinforced/spawner/directional/east, /obj/structure/mop_bucket/janitorialcart, +/obj/machinery/door/window/left/directional/north{ + name = "Trash Chute" + }, /turf/open/floor/iron/white/small, /area/station/service/janitor) "kCT" = ( @@ -28577,29 +29526,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/solars/port/aft) -"kDl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/conveyor{ - dir = 1; - id = "garbage"; - name = "trash belt" - }, -/obj/machinery/recycler{ - dir = 1; - eat_dir = 2 - }, -/turf/open/floor/plating, -/area/station/service/janitor) "kDq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons) +"kDV" = ( +/obj/item/kirbyplants/random, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/camera/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "kEe" = ( /obj/structure/broken_flooring/singular/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28648,6 +29588,11 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/iron/dark, /area/station/cargo/storage) +"kEL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/department/prison) "kEO" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/start/chaplain, @@ -28673,6 +29618,11 @@ }, /turf/open/floor/iron, /area/station/security/brig/entrance) +"kFy" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "kFD" = ( /obj/structure/disposalpipe/segment, /obj/machinery/autolathe, @@ -28727,24 +29677,14 @@ dir = 1 }, /area/station/maintenance/department/engine/atmos) -"kGi" = ( -/obj/machinery/light/cold/directional/north, -/obj/machinery/status_display/ai/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/hallway/secondary/dock) -"kGu" = ( -/obj/structure/table, -/obj/item/storage/fancy/donut_box, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) "kGz" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/reagent_dispensers/plumbed, +/obj/structure/girder, /turf/open/floor/plating, /area/station/maintenance/fore/greater) "kGB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/construction) "kGC" = ( @@ -28774,17 +29714,6 @@ "kGS" = ( /turf/open/floor/iron/white, /area/station/maintenance/central/greater) -"kHc" = ( -/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/effect/turf_decal/tile/neutral/half/contrasted, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/iron/dark/side, -/area/station/science/xenobiology) "kHi" = ( /obj/structure/table/glass, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -28839,29 +29768,12 @@ }, /turf/open/floor/iron, /area/station/security) -"kId" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 9 - }, -/obj/structure/window/spawner/directional/west, -/obj/structure/rack, -/obj/item/clothing/glasses/hud/health, -/obj/item/clothing/glasses/hud/health{ - pixel_x = 1; - pixel_y = 2 - }, -/obj/item/clothing/glasses/hud/health{ - pixel_x = 2; - pixel_y = 4 - }, -/obj/item/clothing/glasses/hud/health{ - pixel_x = 3; - pixel_y = 6 - }, -/obj/machinery/camera/autoname/directional/north, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron/white/small, -/area/station/medical/storage) +"kHT" = ( +/obj/structure/table, +/obj/effect/spawner/random/maintenance, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/commons/dorms) "kIe" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -28894,6 +29806,12 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"kIB" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white/corner{ + dir = 8 + }, +/area/station/science/xenobiology) "kIL" = ( /obj/machinery/vending/cigarette, /obj/effect/mapping_helpers/broken_floor, @@ -28931,15 +29849,20 @@ /obj/structure/cable, /turf/open/floor/iron/dark/small, /area/station/security/brig) -"kIR" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/commons) +"kIS" = ( +/obj/structure/disposalpipe/trunk, +/obj/structure/disposaloutlet{ + name = "Cargo Deliveries" + }, +/obj/effect/turf_decal/stripes/end{ + dir = 1 + }, +/turf/open/floor/iron/small, +/area/station/medical/medbay/lobby) "kIY" = ( /obj/structure/broken_flooring/singular/directional/south, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "kJb" = ( @@ -28976,30 +29899,12 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/plating, /area/station/ai_monitored/security/armory) -"kJq" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/cold/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "kJJ" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/port/lesser) -"kJN" = ( -/obj/structure/closet/secure_closet/injection{ - name = "educational injections"; - pixel_x = 2 - }, -/turf/open/floor/iron/dark/herringbone, -/area/station/security/execution/education) "kJQ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -29033,15 +29938,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"kJZ" = ( -/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/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/hallway/abandoned_command) "kKa" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -29080,11 +29976,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/restrooms) -"kKN" = ( -/obj/structure/barricade/wooden, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid, -/area/station/maintenance/fore/greater) "kKT" = ( /obj/machinery/computer/camera_advanced/xenobio{ dir = 4 @@ -29165,13 +30056,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs) -"kNc" = ( -/obj/machinery/computer/slot_machine{ - pixel_y = 2 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/station/service/abandoned_gambling_den) "kNf" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -29215,9 +30099,14 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/solars/starboard/fore) +"kNK" = ( +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/dock) "kNZ" = ( /obj/structure/cable, /obj/machinery/light/small/directional/north, +/obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron, /area/station/construction/mining/aux_base) "kOc" = ( @@ -29245,13 +30134,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_half, /area/station/cargo/miningoffice) -"kOs" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/wood, -/area/station/hallway/secondary/entry) "kOv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/brown/half, @@ -29261,10 +30143,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_half, /area/station/cargo/miningoffice) -"kOA" = ( -/obj/effect/spawner/random/structure/closet_maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "kOG" = ( /obj/structure/cable, /obj/machinery/door/airlock/external{ @@ -29294,16 +30172,21 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/construction/mining/aux_base) -"kOX" = ( +"kOW" = ( +/obj/effect/mob_spawn/corpse/human/miner, +/turf/open/misc/asteroid, +/area/space/nearstation) +"kPa" = ( /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/blue{ - dir = 1 - }, +/obj/effect/turf_decal/siding/red, /obj/machinery/light/cold/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +/turf/open/floor/iron/white/small, +/area/station/security/warden) "kPk" = ( /obj/structure/chair/sofa/bench{ dir = 1 @@ -29369,30 +30252,32 @@ /obj/item/kirbyplants/random/fullysynthetic, /turf/open/floor/iron/small, /area/station/maintenance/port/lesser) -"kQp" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "kQt" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/aft) -"kQv" = ( -/obj/machinery/light/small/directional/east, -/obj/item/kirbyplants/random, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) +"kQA" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_y = 5 + }, +/obj/machinery/requests_console/directional/south{ + department = "Kitchen"; + name = "Kitchen Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "kQM" = ( /obj/machinery/holopad, /turf/open/floor/iron, /area/station/cargo/storage) +"kRt" = ( +/obj/machinery/monkey_recycler, +/obj/effect/turf_decal/siding/white{ + dir = 5 + }, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "kRE" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -29415,6 +30300,10 @@ dir = 4 }, /area/station/maintenance/starboard/greater) +"kRS" = ( +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/plating, +/area/station/hallway/secondary/dock) "kRU" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/machinery/holopad, @@ -29424,6 +30313,11 @@ "kSb" = ( /turf/open/floor/wood, /area/station/command/heads_quarters/qm) +"kSd" = ( +/obj/structure/cable, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/dark/smooth_large, +/area/station/ai_monitored/turret_protected/ai_upload) "kSf" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/holopad, @@ -29464,21 +30358,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) -"kSA" = ( -/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/dark_red/half/contrasted{ - dir = 8 - }, -/obj/machinery/computer/security/telescreen/interrogation{ - dir = 8; - name = "isolation room monitor"; - network = list("isolation"); - pixel_x = 30 - }, +"kSL" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/portable_atmospherics/canister, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/engineering/atmospherics_engine) "kSN" = ( /obj/effect/landmark/atmospheric_sanity/ignore_area, /turf/open/floor/eighties/red, @@ -29491,6 +30376,11 @@ /obj/machinery/photocopier, /turf/open/floor/wood, /area/station/command/heads_quarters/qm) +"kSS" = ( +/obj/structure/closet/emcloset, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/hallway/abandoned_command) "kSV" = ( /obj/structure/chair/stool/bamboo{ dir = 8 @@ -29598,13 +30488,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron, /area/station/maintenance/department/medical/central) -"kVc" = ( -/obj/structure/table, -/obj/item/storage/belt/utility, -/obj/item/radio/off, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/smooth, -/area/station/command/gateway) "kVe" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -29617,6 +30500,20 @@ }, /turf/open/floor/plating, /area/station/commons/vacant_room/commissary) +"kVn" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/recharger{ + pixel_x = 5; + pixel_y = 4 + }, +/obj/item/radio/off{ + pixel_x = -6 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/smooth, +/area/station/security/checkpoint/supply) "kVx" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance, @@ -29635,16 +30532,6 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/security/prison/workout) -"kWq" = ( -/obj/structure/table, -/obj/item/paper/guides/jobs/engi/gravity_gen, -/obj/effect/spawner/random/bureaucracy/pen, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/plating, -/area/station/engineering/gravity_generator) "kWs" = ( /obj/structure/broken_flooring/corner/directional/south, /turf/open/floor/plating, @@ -29669,14 +30556,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/port) -"kXe" = ( -/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/dark_red/half/contrasted, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron, -/area/station/security/execution/transfer) "kXl" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -29703,6 +30582,10 @@ }, /turf/open/floor/iron/dark, /area/station/security/interrogation) +"kXJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "kXM" = ( /obj/effect/spawner/random/structure/girder, /obj/structure/barricade/wooden, @@ -29731,6 +30614,21 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/plating, /area/station/hallway/secondary/dock) +"kYs" = ( +/obj/machinery/mech_bay_recharge_port{ + dir = 2 + }, +/obj/effect/turf_decal/stripes/asteroid/end{ + dir = 1 + }, +/turf/open/floor/circuit/green, +/area/station/science/robotics/mechbay) +"kYA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/white/line, +/obj/machinery/light/small/directional/south, +/turf/open/floor/engine, +/area/station/science/explab) "kYG" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -29769,17 +30667,10 @@ /turf/open/floor/grass, /area/station/cargo/storage) "kZf" = ( -/obj/effect/turf_decal/sand/plating, +/obj/structure/cable, /obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) -"kZg" = ( -/obj/structure/chair{ - dir = 8 - }, /turf/open/floor/iron, -/area/station/maintenance/port/fore) +/area/station/commons/fitness/recreation/entertainment) "kZh" = ( /obj/structure/table/glass, /obj/effect/turf_decal/siding/thinplating_new/light{ @@ -29790,10 +30681,13 @@ /area/station/science/cubicle) "kZo" = ( /obj/structure/cable, -/obj/effect/turf_decal/sand/plating, /obj/effect/decal/cleanable/dirt, /obj/machinery/duct, /obj/effect/spawner/random/trash, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/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/fore/greater) "kZx" = ( @@ -29804,23 +30698,33 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/showroomfloor, /area/station/medical/surgery/theatre) +"kZB" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron, +/area/station/cargo/storage) "kZF" = ( +/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 = list("ordnance") + }, +/obj/item/target/clown, +/obj/item/target/clown, +/obj/item/target/syndicate, +/obj/item/target/alien, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/plating, /area/station/science/ordnance/testlab) "lao" = ( /obj/effect/mob_spawn/corpse/human, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) -"las" = ( -/obj/structure/filingcabinet/filingcabinet, -/obj/machinery/light/cold/directional/south, -/obj/machinery/status_display/supply{ - pixel_y = -32 - }, -/turf/open/floor/iron/dark, -/area/station/cargo/office) "laD" = ( /turf/open/floor/iron/dark, /area/station/hallway/primary/central/fore) @@ -29862,18 +30766,6 @@ }, /turf/closed/wall, /area/station/hallway/primary/central/fore) -"lbk" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 1 - }, -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/blue, -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/primary/central/fore) "lbs" = ( /obj/structure/table/wood, /obj/item/reagent_containers/cup/glass/shaker{ @@ -29882,6 +30774,19 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) +"lbF" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/turf_decal/stripes, +/obj/effect/turf_decal/trimline/brown/line, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/obj/effect/landmark/start/bitrunner, +/turf/open/floor/iron/dark/smooth_half, +/area/station/bitrunning/den) "lbM" = ( /obj/structure/chair/sofa/bench/right{ dir = 1 @@ -29895,26 +30800,6 @@ /obj/machinery/computer/security/telescreen/entertainment/directional/south, /turf/open/floor/iron/dark/side, /area/station/hallway/primary/central/fore) -"lbN" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/structure/table/glass, -/obj/item/stack/medical/mesh{ - pixel_x = 3 - }, -/obj/item/stack/medical/suture{ - pixel_x = 5 - }, -/obj/item/stack/medical/suture{ - pixel_y = 3 - }, -/obj/machinery/airalarm/directional/south, -/obj/machinery/light/cold/directional/west, -/obj/item/reagent_containers/cup/bottle/multiver{ - pixel_x = -4; - pixel_y = 10 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "lbO" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -29953,14 +30838,13 @@ }, /turf/open/floor/iron/dark/small, /area/station/security/execution/education) -"lcn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/cold/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) +"lcs" = ( +/obj/structure/hedge, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/captain/private) "lct" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -29980,18 +30864,23 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/grass, /area/station/service/hydroponics/garden) +"lcw" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/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/landmark/navigate_destination/chemfactory, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) "lcx" = ( /obj/structure/sink/kitchen/directional/south, /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/start/hangover, /turf/open/floor/iron/white/small, /area/station/service/hydroponics/garden) -"lcz" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/table, -/obj/item/pai_card, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) "lcC" = ( /obj/structure/disposalpipe/trunk{ dir = 1 @@ -30001,11 +30890,6 @@ /obj/machinery/camera/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"lcK" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/turf/open/floor/iron, -/area/station/security/tram) "lcN" = ( /obj/structure/flora/bush/flowers_yw/style_random, /obj/structure/flora/bush/flowers_br/style_random, @@ -30016,43 +30900,32 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/grass, /area/station/service/hydroponics/garden) +"lcU" = ( +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/incident_display/dual/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "lcW" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 +/obj/structure/disposalpipe/sorting/mail{ + dir = 1 }, +/obj/effect/mapping_helpers/mail_sorting/service/janitor_closet, +/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/small, /area/station/service/janitor) -"ldb" = ( +"lde" = ( +/obj/item/radio/intercom/directional/south, /obj/structure/disposalpipe/trunk{ dir = 8 }, -/obj/effect/turf_decal/stripes/end{ - dir = 8 - }, /obj/structure/disposaloutlet{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/machinery/camera/directional/south, -/turf/open/floor/plating, -/area/station/service/janitor) -"lde" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/obj/machinery/conveyor{ - dir = 1; - id = "garbage"; - name = "trash belt" - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/plating, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/box, +/turf/open/floor/iron/white/small, /area/station/service/janitor) "ldo" = ( /obj/structure/chair/comfy/brown{ @@ -30123,6 +30996,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/commons) +"ldW" = ( +/obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/construction) "ldZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/firedoor, @@ -30158,15 +31039,6 @@ /obj/structure/flora/bush/flowers_yw/style_random, /turf/open/misc/sandy_dirt, /area/station/commons) -"lev" = ( -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/shuttle/mining{ - dir = 4 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "ley" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -30199,8 +31071,8 @@ pixel_y = -3 }, /obj/item/storage/box/prisoner{ - pixel_y = -12; - pixel_x = 5 + pixel_x = 5; + pixel_y = -12 }, /obj/structure/disposalpipe/segment{ dir = 10 @@ -30218,6 +31090,15 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/restrooms) +"leF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 6 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "leH" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -30278,6 +31159,25 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/iron/white/small, /area/station/medical/treatment_center) +"lfi" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 6 + }, +/obj/machinery/pdapainter/security, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light_switch/directional/east, +/obj/machinery/light/small/directional/south, +/turf/open/floor/stone, +/area/station/command/heads_quarters/hos) +"lfv" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/brown{ + dir = 5 + }, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/smooth, +/area/station/command/bridge) "lfC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -30300,6 +31200,17 @@ }, /turf/open/space/basic, /area/space/nearstation) +"lgj" = ( +/obj/structure/chair/sofa/bench{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/exit/departure_lounge) "lgo" = ( /obj/effect/turf_decal/siding/blue{ dir = 5 @@ -30316,6 +31227,20 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/white/small, /area/station/medical/storage) +"lgp" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/structure/table/reinforced, +/obj/machinery/recharger{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/machinery/recharger{ + pixel_x = 5; + pixel_y = 4 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/security/warden) "lgq" = ( /obj/structure/chair/comfy/lime{ dir = 4 @@ -30346,6 +31271,19 @@ dir = 1 }, /area/station/hallway/primary/aft) +"lgG" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/hallway/secondary/exit/departure_lounge) "lgT" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/brown/opposingcorners, @@ -30429,11 +31367,6 @@ /obj/item/pickaxe, /turf/open/misc/asteroid, /area/station/maintenance/starboard/greater) -"lib" = ( -/obj/structure/chair/sofa/bench, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) "liG" = ( /obj/structure/cable, /obj/structure/table/glass, @@ -30445,16 +31378,16 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/wood/large, /area/station/command/heads_quarters/captain) -"liJ" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/cold/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +"liH" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 }, -/obj/structure/sign/departments/cargo/directional/west, +/obj/machinery/incident_display/tram/directional/north, /turf/open/floor/iron, -/area/station/hallway/primary/central/fore) +/area/station/maintenance/department/medical/central) "liP" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark/small, @@ -30475,6 +31408,18 @@ }, /turf/open/floor/noslip/tram_platform, /area/station/maintenance/department/medical/central) +"ljk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/machinery/camera/autoname/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "ljl" = ( /obj/structure/lattice, /obj/structure/railing/corner{ @@ -30493,11 +31438,6 @@ }, /turf/open/space/basic, /area/space) -"ljp" = ( -/obj/structure/reagent_dispensers/water_cooler, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron, -/area/station/maintenance/department/medical/central) "lju" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark/textured_half{ @@ -30517,6 +31457,50 @@ }, /turf/open/floor/iron, /area/station/security/prison/rec) +"ljN" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/thinplating_new/terracotta{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room) +"ljP" = ( +/obj/structure/disposalpipe/trunk, +/obj/structure/cable, +/obj/machinery/firealarm/directional/west, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/siding/blue{ + dir = 9 + }, +/turf/open/floor/iron/white/small, +/area/station/command/heads_quarters/cmo) +"ljZ" = ( +/obj/machinery/modular_computer/preset/civilian{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/light/small/directional/west, +/obj/machinery/light_switch/directional/south, +/obj/machinery/requests_console/directional/west{ + department = "Robotics"; + name = "Robotics Requests Console"; + pixel_y = -30 + }, +/obj/effect/mapping_helpers/requests_console/ore_update, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/machinery/button/door/directional/west{ + id = "roboticshut"; + name = "Robotics Shutters"; + pixel_y = 8 + }, +/turf/open/floor/iron, +/area/station/science/robotics/lab) "lka" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -30526,8 +31510,18 @@ /area/station/security/prison/workout) "lkd" = ( /obj/structure/cable, +/obj/structure/alien/weeds, /turf/open/misc/asteroid, /area/station/maintenance/starboard/greater) +"lko" = ( +/obj/machinery/door/airlock{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/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) "lku" = ( /obj/structure/table, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -30566,22 +31560,32 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron, /area/station/security/prison) +"lkU" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "lkV" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance) -"llg" = ( -/obj/effect/turf_decal/stripes/white/line, -/turf/open/floor/iron/dark, -/area/station/cargo/storage) -"llv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/cold/directional/north, -/obj/machinery/status_display/ai/directional/north, +"lkZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral{ - dir = 1 + dir = 8 }, +/obj/machinery/airalarm/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"llg" = ( +/obj/effect/turf_decal/stripes/white/line, +/turf/open/floor/iron/dark, +/area/station/cargo/storage) "llC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -30613,10 +31617,8 @@ /area/station/cargo/sorting) "llP" = ( /obj/structure/cable, -/obj/structure/bed/pod{ - desc = "An old medical bed, just waiting for replacement with something up to date."; - dir = 4; - name = "medical bed" +/obj/structure/bed/medical{ + dir = 8 }, /obj/effect/turf_decal/trimline/blue/corner, /obj/machinery/power/apc/auto_name/directional/south, @@ -30649,6 +31651,12 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/carpet/donk, /area/station/command/heads_quarters/qm) +"lmo" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "lmv" = ( /obj/structure/disposalpipe/segment, /obj/item/kirbyplants/random, @@ -30671,11 +31679,6 @@ }, /turf/open/floor/iron/dark, /area/station/cargo/office) -"lnc" = ( -/obj/machinery/light/cold/directional/east, -/obj/machinery/vending/wardrobe/sec_wardrobe, -/turf/open/floor/iron/dark, -/area/station/security/lockers) "lnu" = ( /obj/machinery/holopad, /turf/open/floor/iron/dark, @@ -30697,17 +31700,6 @@ /obj/structure/ore_box, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"lnU" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-entrance" - }, -/obj/machinery/door/airlock/maintenance{ - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "lnZ" = ( /obj/effect/turf_decal/tile/dark_red, /obj/effect/decal/cleanable/dirt, @@ -30718,14 +31710,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/processing) -"log" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/turf/open/floor/iron/smooth, -/area/station/hallway/secondary/command) "loj" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 4 @@ -30736,6 +31720,18 @@ dir = 8 }, /area/station/hallway/primary/central/fore) +"lom" = ( +/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, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/simple/dark/hidden{ + dir = 9 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/tcommsat/server) "loo" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -30766,10 +31762,10 @@ /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_command) "lpa" = ( -/obj/structure/lattice, /obj/structure/sign/poster/official/random/directional/north, -/turf/open/space/basic, -/area/space/nearstation) +/obj/structure/bookcase/random, +/turf/open/floor/wood/parquet, +/area/station/service/library) "lpC" = ( /turf/open/floor/plating, /area/station/service/chapel/funeral) @@ -30799,16 +31795,6 @@ /obj/machinery/duct, /turf/open/floor/iron/white/small, /area/station/medical/storage) -"lqa" = ( -/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/power/apc/auto_name/directional/south, -/turf/open/floor/catwalk_floor/flat_white, -/area/station/science/robotics/augments) "lqd" = ( /obj/effect/turf_decal/siding/red{ dir = 10 @@ -30826,27 +31812,16 @@ /turf/open/floor/wood/parquet, /area/station/service/library) "lqs" = ( -/turf/closed/wall/rust, -/area/station/maintenance/fore/greater) +/obj/machinery/light/cold/directional/south, +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "lqt" = ( /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/tile, /area/station/command/heads_quarters/hop) -"lqy" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/plating, -/area/station/security/brig/entrance) "lqC" = ( /turf/open/floor/iron/smooth, /area/station/maintenance/solars/starboard/aft) @@ -30861,35 +31836,11 @@ }, /turf/open/floor/wood/parquet, /area/station/service/library) -"lqS" = ( -/obj/structure/flora/bush/large/style_random{ - pixel_y = -3 - }, -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/turf_decal/siding/wideplating{ - dir = 8 - }, -/obj/machinery/light/floor{ - pixel_x = -32 - }, -/turf/open/misc/sandy_dirt, -/area/station/security/tram) "lrh" = ( /obj/structure/cable, /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/aft) -"lrx" = ( -/obj/effect/landmark/start/scientist, -/obj/structure/chair{ - dir = 4; - pixel_y = -2 - }, -/obj/machinery/light/dim/directional/west, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron/white, -/area/station/science/research) "lrE" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -30902,6 +31853,12 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) +"lrP" = ( +/obj/machinery/computer/security{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/office) "lsJ" = ( /obj/structure/window/spawner/directional/north, /obj/effect/turf_decal/stripes/end{ @@ -30916,6 +31873,13 @@ dir = 1 }, /area/station/science/lower) +"lsY" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/structure/closet/secure_closet/security/sec, +/turf/open/floor/iron/checker{ + dir = 1 + }, +/area/station/security/execution/transfer) "lti" = ( /obj/machinery/libraryscanner, /obj/machinery/newscaster/directional/north, @@ -30931,6 +31895,7 @@ /obj/structure/disposalpipe/segment, /obj/structure/cable, /obj/structure/steam_vent, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) "ltp" = ( @@ -30949,6 +31914,16 @@ }, /turf/open/floor/catwalk_floor/iron_dark, /area/station/service/library) +"ltP" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/structure/hedge, +/obj/machinery/status_display/evac/directional/north, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/grimy, +/area/station/hallway/secondary/entry) "ltT" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -30971,6 +31946,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) +"lun" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/command/general, +/obj/machinery/door/airlock/command/glass{ + name = "Command Hallway" + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/hallway/secondary/command) "luo" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow/opposingcorners, @@ -31069,10 +32052,18 @@ name = "Prison Garden" }, /obj/machinery/door/firedoor, +/obj/effect/landmark/tram/nav/immovable_rod, /turf/open/floor/iron/textured_half{ dir = 8 }, /area/station/security/prison/garden) +"lvS" = ( +/obj/machinery/porta_turret/ai{ + dir = 4 + }, +/obj/machinery/status_display/ai/directional/east, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai_upload) "lvY" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, @@ -31089,6 +32080,11 @@ dir = 8 }, /area/station/hallway/primary/central/fore) +"lwc" = ( +/obj/structure/table/optable, +/obj/structure/cable, +/turf/open/floor/iron/dark/small, +/area/station/security/execution/education) "lwk" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/blue/half/contrasted{ @@ -31100,9 +32096,9 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) "lwn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/hatch, +/obj/machinery/atmospherics/components/binary/pump/on/supply/hidden/layer4, /turf/open/floor/plating, /area/station/science/ordnance/testlab) "lwp" = ( @@ -31115,19 +32111,17 @@ dir = 1 }, /area/station/security/execution/transfer) -"lwD" = ( -/obj/item/kirbyplants/random, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 4 +"lwr" = ( +/obj/structure/window/spawner/directional/south, +/obj/structure/window/spawner/directional/west, +/obj/structure/flora/bush/large/style_random{ + pixel_x = -17; + pixel_y = 2 }, -/area/station/hallway/primary/central/fore) +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/machinery/light/small/directional/east, +/turf/open/misc/sandy_dirt, +/area/station/commons) "lwH" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -31181,6 +32175,8 @@ /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/plating, /area/station/maintenance/starboard/aft) "lxy" = ( @@ -31199,6 +32195,17 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/iron/small, /area/station/maintenance/port/lesser) +"lxN" = ( +/obj/structure/broken_flooring/pile/directional/east, +/turf/open/floor/plating, +/area/station/hallway/secondary/dock) +"lxT" = ( +/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/light/small/dim/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "lxZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/red{ @@ -31239,16 +32246,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/curtain/cloth, /obj/effect/decal/cleanable/dirt, +/obj/structure/cable, /turf/open/floor/iron/textured_half, /area/station/service/janitor) -"lyy" = ( -/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, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/commons) "lyQ" = ( /obj/structure/table, /obj/item/storage/photo_album/prison, @@ -31271,16 +32271,6 @@ /obj/item/wrench, /turf/open/floor/iron, /area/station/security/tram) -"lzn" = ( -/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/cable, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron, -/area/station/cargo/storage) "lzp" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -31391,6 +32381,13 @@ }, /turf/open/floor/iron, /area/station/cargo/office) +"lAF" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/item/stack/sheet/titaniumglass, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) "lAO" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -31405,8 +32402,18 @@ /obj/structure/sign/picture_frame/portrait{ pixel_x = -26 }, +/obj/structure/alien/resin/membrane, +/obj/structure/alien/weeds, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) +"lAS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/status_display/ai/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "lAU" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -31468,17 +32475,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/detective, /turf/open/floor/iron/textured_half, /area/station/security/detectives_office) -"lBO" = ( -/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{ - name = "Tech Storage" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/catwalk_floor/iron, -/area/station/engineering/storage/tech) "lCg" = ( /obj/structure/chair{ dir = 4 @@ -31487,6 +32483,20 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"lCh" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/green, +/obj/structure/table, +/obj/item/multitool/circuit{ + pixel_x = 7 + }, +/obj/item/multitool/circuit, +/obj/item/multitool/circuit{ + pixel_x = -8 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/cafeteria, +/area/station/science/circuits) "lCt" = ( /obj/effect/turf_decal/siding/red{ dir = 1 @@ -31585,6 +32595,13 @@ "lEa" = ( /turf/open/floor/iron/half, /area/station/hallway/primary/central/fore) +"lEg" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/broken_flooring/pile/directional/east, +/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/aft) "lEu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -31609,6 +32626,22 @@ }, /turf/open/floor/plating, /area/station/cargo/storage) +"lEK" = ( +/obj/structure/chair/wood/wings{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/stone, +/area/station/command/heads_quarters/captain/private) +"lEZ" = ( +/obj/effect/turf_decal/trimline/white/line, +/obj/effect/turf_decal/trimline/white/mid_joiner, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/wood, +/area/station/commons/fitness/recreation) "lFg" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -31622,20 +32655,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/storage) -"lFJ" = ( -/obj/machinery/teleport/station, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/command/teleporter) -"lFU" = ( -/obj/effect/turf_decal/siding/red, -/obj/item/kirbyplants/random, -/obj/item/radio/intercom/directional/east, -/obj/item/storage/toolbox/mechanical, -/turf/open/floor/iron, -/area/station/cargo/storage) "lGe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -31662,20 +32681,28 @@ /obj/structure/table/reinforced/plastitaniumglass, /turf/open/floor/iron/smooth, /area/station/maintenance/port/aft) -"lGA" = ( -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/command/general, -/obj/machinery/door/airlock/command/glass{ - name = "Command Hallway" +"lGE" = ( +/obj/machinery/computer/gateway_control{ + dir = 1 }, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/hallway/secondary/command) +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/smooth, +/area/station/command/gateway) "lGK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) +"lGL" = ( +/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/machinery/light/cold/directional/north, +/turf/open/floor/iron, +/area/station/science/lower) "lGO" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -31697,10 +32724,6 @@ /obj/structure/chair/stool/directional/south, /turf/open/floor/carpet/donk, /area/station/command/heads_quarters/qm) -"lHj" = ( -/obj/structure/table/optable, -/turf/open/floor/iron/dark/small, -/area/station/security/execution/education) "lHk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -31735,6 +32758,8 @@ "lHS" = ( /obj/effect/decal/cleanable/dirt, /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/iron, /area/station/maintenance/starboard/aft) "lHT" = ( @@ -31756,13 +32781,6 @@ dir = 1 }, /area/station/command/heads_quarters/qm) -"lHU" = ( -/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/wood/large, -/area/station/command/heads_quarters/captain/private) "lHW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -31849,34 +32867,16 @@ dir = 8 }, /area/station/science/xenobiology) +"lJc" = ( +/obj/machinery/door/firedoor, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/iron/textured_half, +/area/station/service/cafeteria) "lJe" = ( /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/command/heads_quarters/captain/private) -"lJk" = ( -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/security/tram) -"lJo" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/machinery/light/small/directional/south, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/iron/freezer, -/area/station/command/heads_quarters/captain/private) -"lJr" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 1 - }, -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/turf/open/floor/iron, -/area/station/security/tram) "lJA" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ dir = 5 @@ -31961,6 +32961,20 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) +"lKH" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/line, +/obj/effect/turf_decal/stripes, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/airalarm/directional/west, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/landmark/start/bitrunner, +/turf/open/floor/iron/dark/smooth_half, +/area/station/bitrunning/den) "lKK" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -31976,17 +32990,25 @@ /obj/effect/mapping_helpers/airlock/access/any/security/general, /turf/open/floor/iron, /area/station/security/checkpoint/escape) -"lLu" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/structure/window/reinforced/tram/right/directional/west, -/obj/structure/chair{ +"lLq" = ( +/obj/effect/turf_decal/box/corners{ dir = 1 }, -/obj/structure/industrial_lift/tram, -/turf/open/floor/noslip/tram_platform, -/area/station/security/tram) +/obj/effect/turf_decal/box/corners{ + dir = 4 + }, +/obj/machinery/firealarm/directional/east, +/obj/effect/decal/cleanable/oil, +/obj/effect/landmark/bitrunning/station_reward_spawn, +/turf/open/floor/iron/dark/smooth_large, +/area/station/bitrunning/den) +"lLr" = ( +/obj/machinery/porta_turret/ai{ + dir = 4 + }, +/obj/machinery/status_display/ai/directional/west, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai_upload) "lLv" = ( /turf/open/floor/wood, /area/station/maintenance/fore/greater) @@ -32002,6 +33024,11 @@ /obj/structure/table, /turf/open/floor/wood/parquet, /area/station/service/library) +"lLL" = ( +/turf/open/floor/iron/dark/side{ + dir = 9 + }, +/area/station/hallway/secondary/construction) "lLP" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -32019,39 +33046,11 @@ "lLX" = ( /turf/open/floor/iron/showroomfloor, /area/station/medical/surgery/theatre) -"lMo" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/obj/structure/rack{ - icon = 'icons/obj/stationobjs.dmi'; - icon_state = "minibar"; - name = "skeletal minibar" - }, -/obj/item/storage/fancy/candle_box, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron/grimy, -/area/station/service/library) "lMp" = ( /obj/structure/disposalpipe/segment, /obj/structure/plasticflaps/opaque, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"lMr" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/blue{ - dir = 5 - }, -/obj/machinery/light/cold/directional/east, -/obj/machinery/light_switch/directional/east, -/obj/effect/mapping_helpers/broken_floor, -/obj/item/kirbyplants/random, -/obj/item/storage/medkit/regular{ - pixel_x = -3; - pixel_y = -3 - }, -/turf/open/floor/iron/white/small, -/area/station/command/heads_quarters/cmo) "lMy" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -32113,13 +33112,19 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"lMU" = ( -/obj/machinery/portable_atmospherics/canister/anesthetic_mix, -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/effect/turf_decal/stripes, -/obj/machinery/light/cold/directional/west, -/turf/open/floor/iron/white/small, -/area/station/medical/cryo) +"lMV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/event_spawn, +/obj/machinery/computer/security/telescreen{ + dir = 4; + name = "Test Chamber Monitor"; + network = list("xeno"); + pixel_x = -29 + }, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/station/science/xenobiology) "lNb" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -32189,6 +33194,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"lNQ" = ( +/obj/effect/turf_decal/bot_white/right, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/engine, +/area/station/engineering/gravity_generator) +"lNU" = ( +/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/effect/landmark/navigate_destination/court, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "lOa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -32255,15 +33274,11 @@ }, /turf/open/floor/iron/white/small, /area/station/science/lobby) -"lPc" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/corner{ - dir = 1 - }, -/area/station/science/xenobiology) +"lOY" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore/lesser) "lPd" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -32293,6 +33308,33 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/security/prison/rec) +"lPI" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/simple/dark/hidden{ + dir = 8 + }, +/obj/machinery/announcement_system, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/server) +"lPO" = ( +/obj/structure/table, +/obj/item/surgery_tray/full{ + pixel_y = -5 + }, +/obj/item/wirecutters{ + pixel_y = 8 + }, +/turf/open/floor/iron/dark/small, +/area/station/security/execution/education) +"lPR" = ( +/obj/structure/table, +/obj/effect/spawner/random/maintenance, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/commons/dorms) "lQh" = ( /turf/open/floor/iron/small, /area/station/maintenance/port/aft) @@ -32301,14 +33343,12 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"lQq" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "lQu" = ( /obj/machinery/light/broken/directional/south, /obj/effect/spawner/random/trash/bin, /obj/effect/decal/cleanable/glass, +/obj/structure/alien/resin/membrane, +/obj/structure/alien/weeds, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) "lQA" = ( @@ -32320,10 +33360,13 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/plating, /area/station/maintenance/department/prison) -"lQG" = ( -/obj/structure/tank_dispenser/oxygen, -/turf/open/floor/iron/small, -/area/station/security/tram) +"lQR" = ( +/obj/effect/turf_decal/caution{ + dir = 4 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/terracotta/small, +/area/station/security/checkpoint/escape) "lQZ" = ( /obj/machinery/door/airlock{ name = "Maintenance" @@ -32346,6 +33389,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/cargo/storage) +"lRh" = ( +/obj/effect/landmark/start/scientist, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/smooth_large, +/area/station/science/auxlab/firing_range) "lRj" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -32369,14 +33417,6 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/smooth, /area/station/maintenance/solars/starboard/fore) -"lRG" = ( -/obj/machinery/flasher/portable, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/security/tram) "lRX" = ( /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/iron, @@ -32386,6 +33426,8 @@ dir = 6 }, /obj/effect/mapping_helpers/broken_floor, +/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/aft) "lSf" = ( @@ -32419,6 +33461,16 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/cafeteria, /area/station/science/breakroom) +"lSw" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/structure/chair, +/obj/effect/landmark/start/hangover, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/cafeteria, +/area/station/service/cafeteria) "lSI" = ( /obj/machinery/atmospherics/pipe/smart/simple/general/visible, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32455,6 +33507,11 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) +"lTs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/plating, +/area/station/security/tram) "lTt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32463,18 +33520,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/execution/transfer) -"lTu" = ( -/obj/structure/table, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/item/clothing/mask/breath{ - pixel_x = 15; - pixel_y = 5 - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/smooth, -/area/station/command/gateway) "lTv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32568,15 +33613,25 @@ /obj/structure/window/spawner/directional/west, /turf/open/floor/plating, /area/station/cargo/sorting) -"lUV" = ( -/obj/machinery/light/dim/directional/south, -/turf/open/floor/iron/smooth, -/area/station/security/evidence) -"lVl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/iron/dark, -/area/station/security/office) +"lVg" = ( +/obj/structure/transit_tube/horizontal, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/maintenance/starboard/aft) +"lVy" = ( +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 8 + }, +/obj/structure/closet/crate/freezer, +/obj/machinery/firealarm/directional/west, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/ethereal, +/obj/item/reagent_containers/blood{ + pixel_x = -3; + pixel_y = -3 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) "lVz" = ( /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, @@ -32595,16 +33650,6 @@ dir = 1 }, /area/station/science/xenobiology) -"lVF" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 6 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "lVL" = ( /obj/structure/disposalpipe/segment, /obj/structure/disposalpipe/segment{ @@ -32630,6 +33675,17 @@ }, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/cmo) +"lVZ" = ( +/obj/machinery/modular_computer/preset/id{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) +"lWb" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/warning/no_smoking/circle/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "lWk" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/iron/large, @@ -32697,16 +33753,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/security/checkpoint/supply) -"lXd" = ( -/obj/machinery/atmospherics/pipe/smart/simple/general/visible, -/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, -/turf/open/floor/iron/white/side{ - dir = 9 - }, -/area/station/science/xenobiology) "lXf" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, @@ -32731,27 +33777,24 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/qm) +"lXC" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sci-entrance" + }, +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "lXE" = ( /obj/effect/turf_decal/siding/wood{ dir = 10 }, /turf/open/floor/wood/tile, /area/station/science/lower) -"lXH" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/light/cold/directional/south, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/medbay/aft) -"lXJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/light/dim/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/station/hallway/secondary/construction) "lXR" = ( /obj/structure/disposalpipe/junction, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -32800,16 +33843,6 @@ "lYj" = ( /turf/closed/wall/r_wall, /area/station/hallway/primary/fore) -"lYp" = ( -/obj/effect/turf_decal/siding/white{ - dir = 8 - }, -/obj/vehicle/ridden/wheelchair{ - dir = 8 - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/lobby) "lYt" = ( /obj/structure/table/wood/fancy/green, /obj/item/storage/wallet{ @@ -32832,16 +33865,6 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/qm) -"lYD" = ( -/obj/machinery/atmospherics/pipe/smart/simple/general/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ - dir = 8 - }, -/area/station/science/xenobiology) "lYT" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/engineering/atmospherics_portable, @@ -32868,21 +33891,68 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood/parquet, /area/station/service/library) -"lZt" = ( -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plating, -/area/station/maintenance/department/bridge) -"lZu" = ( -/obj/structure/hedge, +"lZa" = ( /obj/effect/turf_decal/siding/wood{ - dir = 5 + dir = 4 }, -/obj/machinery/light/cold/directional/north, /obj/machinery/atmospherics/pipe/smart/simple/dark/hidden{ dir = 8 }, +/obj/machinery/computer/telecomms/monitor{ + dir = 8; + network = "tcommsat" + }, /turf/open/floor/iron/grimy, /area/station/tcommsat/server) +"lZt" = ( +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plating, +/area/station/maintenance/department/bridge) +"lZB" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/machinery/ecto_sniffer{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/item/bodypart/arm/left/robot{ + pixel_x = -3 + }, +/obj/item/bodypart/arm/right/robot{ + pixel_x = 3 + }, +/obj/item/assembly/flash/handheld{ + pixel_x = 6; + pixel_y = 13 + }, +/obj/item/assembly/flash/handheld{ + pixel_x = 6; + pixel_y = 13 + }, +/obj/item/borg/upgrade/rename{ + pixel_x = 3; + pixel_y = 25 + }, +/obj/item/assembly/flash/handheld{ + pixel_x = 6; + pixel_y = 13 + }, +/obj/item/assembly/flash/handheld{ + pixel_x = 6; + pixel_y = 13 + }, +/obj/item/bodypart/arm/right/robot{ + pixel_x = 3 + }, +/obj/item/bodypart/arm/left/robot{ + pixel_x = -3 + }, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) "lZD" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -32899,10 +33969,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"lZF" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/wood/parquet, -/area/station/service/library) "lZH" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -32939,15 +34005,6 @@ }, /turf/open/floor/wood/parquet, /area/station/service/library) -"mae" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/cold/directional/east, -/obj/effect/spawner/random/trash/bin, -/turf/open/floor/iron/white/small, -/area/station/science/ordnance/storage) "maf" = ( /turf/closed/wall/rust, /area/station/hallway/primary/fore) @@ -32993,13 +34050,12 @@ /obj/structure/broken_flooring/singular/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/dock) -"maX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/portable_atmospherics/canister/air, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/plating, -/area/station/hallway/secondary/construction) +"maL" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/sepia, +/area/station/maintenance/aft) "mbn" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -33013,12 +34069,25 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/wood/large, /area/station/command/heads_quarters/captain) +"mbq" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/status_display/ai/directional/south, +/obj/machinery/pdapainter/medbay, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/cmo) "mbK" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 }, /turf/open/floor/iron/grimy, /area/station/service/library) +"mbN" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine/n2o, +/area/station/ai_monitored/turret_protected/ai) "mbV" = ( /obj/effect/spawner/random/entertainment/arcade, /turf/open/floor/eighties/red, @@ -33032,8 +34101,15 @@ /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/plating, /area/station/maintenance/starboard/aft) +"mcl" = ( +/obj/structure/alien/weeds, +/obj/effect/gibspawner/xeno, +/turf/open/misc/asteroid, +/area/station/maintenance/starboard/greater) "mcn" = ( /obj/machinery/status_display/ai/directional/south, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -33047,12 +34123,12 @@ /obj/machinery/holopad, /turf/open/floor/iron/checker, /area/station/security/breakroom) -"mct" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/turf/open/floor/engine, -/area/station/science/xenobiology) +"mcv" = ( +/obj/effect/turf_decal/siding/brown, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/phone, +/turf/open/floor/iron/smooth, +/area/station/maintenance/port/aft) "mcx" = ( /obj/machinery/shieldgen, /obj/effect/turf_decal/stripes/white/line{ @@ -33068,20 +34144,6 @@ /obj/effect/landmark/start/medical_doctor, /turf/open/floor/iron/dark, /area/station/medical/medbay/aft) -"mcQ" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock{ - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-entrance" - }, -/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "mda" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -33113,11 +34175,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"meb" = ( -/obj/machinery/vending/autodrobe, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/wood/parquet, -/area/station/service/greenroom) "meu" = ( /turf/closed/wall, /area/station/command/heads_quarters/captain) @@ -33131,6 +34188,11 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/white/side, /area/station/science/lower) +"meJ" = ( +/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) "meN" = ( /obj/structure/chair/sofa/bench{ dir = 8 @@ -33140,6 +34202,14 @@ dir = 4 }, /area/station/hallway/secondary/entry) +"meP" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/entertainment/arcade{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "mfc" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -33227,16 +34297,6 @@ /obj/machinery/recharger, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs) -"mgk" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/structure/industrial_lift/tram/white, -/obj/structure/window/reinforced/tram/right/directional/north, -/obj/structure/chair/sofa/bench/right, -/obj/machinery/light/small/directional/west, -/turf/open/floor/noslip/tram_platform, -/area/station/maintenance/port/aft) "mgt" = ( /obj/machinery/vending/boozeomat, /obj/machinery/firealarm/directional/south, @@ -33291,17 +34351,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_command) -"mhD" = ( -/obj/structure/table, -/obj/machinery/firealarm/directional/south, -/obj/machinery/light/small/directional/west, -/obj/item/grenade/chem_grenade/cleaner{ - pixel_x = -7; - pixel_y = 12 - }, -/obj/item/restraints/legcuffs/beartrap, -/turf/open/floor/iron, -/area/station/service/janitor) "mhV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -33309,19 +34358,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"mhW" = ( -/obj/structure/cable, -/obj/machinery/door/airlock{ - name = "Custodial Closet Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/any/service/janitor, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "mhY" = ( /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/structure/cable, /turf/open/floor/iron, /area/station/commons/dorms) "mie" = ( @@ -33329,6 +34371,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/commons/dorms) +"mig" = ( +/obj/effect/turf_decal/tile/green/half/contrasted, +/obj/structure/table/glass, +/obj/item/storage/box/syringes{ + pixel_x = -8; + pixel_y = 2 + }, +/obj/item/storage/box/beakers{ + pixel_x = 2; + pixel_y = 11 + }, +/obj/structure/reagent_dispensers/wall/virusfood/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/virology) "mik" = ( /obj/effect/turf_decal/siding/red{ dir = 10 @@ -33336,15 +34392,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/small, /area/station/security/brig) -"mil" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/structure/chair/wood{ - dir = 8 - }, -/turf/open/floor/stone, -/area/station/command/corporate_suite) "miz" = ( /obj/structure/table/glass, /obj/item/wrench, @@ -33373,11 +34420,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/small, /area/station/commons/fitness/locker_room) -"miI" = ( -/obj/effect/spawner/random/entertainment/arcade, -/obj/machinery/light/small/directional/north, -/turf/open/floor/eighties/red, -/area/station/service/abandoned_gambling_den/gaming) "mjf" = ( /obj/structure/table/reinforced/rglass, /obj/machinery/door/window/left/directional/west{ @@ -33395,16 +34437,29 @@ /obj/structure/tank_frame, /turf/open/floor/plating, /area/station/maintenance/fore/greater) +"mjB" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/spacebridge) "mjF" = ( /obj/structure/table/glass, /obj/item/clothing/suit/costume/cyborg_suit, /obj/item/clothing/head/costume/tv_head, /turf/open/floor/eighties, /area/station/service/abandoned_gambling_den/gaming) -"mjP" = ( -/obj/structure/cable, -/obj/machinery/power/shieldwallgen/xenobiologyaccess, -/turf/open/floor/plating, +"mjN" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/machinery/camera/autoname/directional/east, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/dark/small, /area/station/science/xenobiology) "mjQ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -33428,20 +34483,29 @@ }, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/supply) -"mkf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/cold/directional/south, -/obj/structure/table, -/obj/item/kirbyplants/random{ - pixel_y = 8 - }, -/turf/open/floor/circuit, -/area/station/tcommsat/server) "mks" = ( /obj/structure/cable, /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) +"mky" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=14.0-Dormatories-CentralStarboard"; + location = "13.0-DormatoryCommons-Dormatories" + }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron, +/area/station/commons/dorms) +"mkA" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue/full, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/iron/white/textured_large, +/area/station/command/heads_quarters/cmo) "mkF" = ( /obj/structure/disposalpipe/segment, /obj/effect/landmark/start/depsec/supply, @@ -33479,6 +34543,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) +"mkZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/server) +"mlm" = ( +/obj/structure/cable, +/obj/structure/alien/weeds, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) "mlr" = ( /obj/structure/chair/office/light{ dir = 4 @@ -33529,6 +34606,13 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron, /area/station/science/ordnance/testlab) +"mmi" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/commons) "mmp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/small/directional/west, @@ -33553,6 +34637,24 @@ dir = 1 }, /area/station/ai_monitored/command/storage/eva) +"mmy" = ( +/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 = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/button/door/directional/south{ + id = "XenoPens"; + name = "Xenobiology Shutters"; + req_access = list("xenobiology") + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/science/xenobiology) "mmE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -33606,14 +34708,11 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/wood/parquet, /area/station/service/library) -"mnv" = ( -/obj/structure/hedge, -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/status_display/supply{ - pixel_y = 32 - }, -/turf/open/floor/plating, -/area/station/cargo/storage) +"mnw" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/smooth, +/area/station/hallway/secondary/command) "mny" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -33627,19 +34726,24 @@ /obj/structure/sign/poster/contraband/random/directional/west, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"mnN" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/bookcase/random, +/obj/effect/turf_decal/siding/thinplating_new/terracotta{ + dir = 4 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room) "mnZ" = ( /obj/machinery/computer/cargo{ dir = 4 }, /turf/open/floor/plating, /area/station/cargo/storage) -"moe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/server) "mos" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/iron/smooth, @@ -33652,22 +34756,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/storage) -"mpc" = ( -/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/research{ - name = "Development Division Access" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-entrance" - }, -/obj/effect/mapping_helpers/airlock/access/all/science/general, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white/textured_half{ - dir = 1 - }, -/area/station/science/lobby) "mpk" = ( /obj/machinery/airalarm/directional/south, /turf/open/floor/circuit/green, @@ -33758,6 +34846,11 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"mrt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/dock) "mrv" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -33775,28 +34868,12 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"msi" = ( -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron/stairs{ - dir = 8 - }, -/area/station/cargo/storage) "msq" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/iron/dark, /area/station/hallway/primary/central/fore) -"mst" = ( -/obj/structure/hedge, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/light/cold/directional/north, -/obj/structure/sign/departments/engineering/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "msy" = ( /obj/machinery/door/airlock/mining/glass{ name = "Cargo Bay" @@ -33815,24 +34892,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"mtf" = ( -/obj/effect/turf_decal/tile/red/opposingcorners, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 8 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/item/kirbyplants/random, -/obj/item/storage/box{ - pixel_x = -8; - pixel_y = 15 - }, -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron/smooth, -/area/station/service/greenroom) "mtu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -33843,15 +34902,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/service/greenroom) -"mtR" = ( +"mtP" = ( /obj/structure/cable, -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/siding/thinplating_new/terracotta{ - dir = 4 - }, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/dark/smooth_large, -/area/station/command/meeting_room) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/iron, +/area/station/security/prison) "mtV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -33877,18 +34935,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"muj" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall, -/area/station/hallway/secondary/entry) -"mum" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible, -/obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom/directional/south, -/obj/machinery/meter, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "mur" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, @@ -33931,27 +34977,11 @@ /obj/machinery/status_display/ai/directional/north, /turf/open/floor/wood/tile, /area/station/command/meeting_room) -"mvb" = ( -/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/command/glass, -/obj/effect/mapping_helpers/airlock/access/any/command/hop, -/obj/machinery/door/firedoor, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/iron/dark/textured_half, -/area/station/command/heads_quarters/hop) "mvh" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/holopad, /turf/open/floor/glass/reinforced, /area/station/command/bridge) -"mvl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/cold/directional/east, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "mvo" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/telecomms/bus/preset_three, @@ -33985,16 +35015,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/textured_half, /area/station/maintenance/hallway/abandoned_command) -"mvN" = ( -/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/machinery/light/cold/directional/north, -/turf/open/floor/iron/white/side, -/area/station/science/lower) "mvP" = ( /obj/machinery/smartfridge/organ, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -34009,14 +35029,6 @@ dir = 1 }, /area/station/hallway/primary/central/fore) -"mwm" = ( -/obj/structure/filingcabinet, -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/server) "mwn" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -34041,6 +35053,9 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/old, /obj/item/crowbar, +/obj/structure/alien/egg/burst, +/obj/structure/alien/weeds, +/obj/effect/gibspawner, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) "mwy" = ( @@ -34071,6 +35086,15 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/engine, /area/station/engineering/supermatter) +"mwJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/stack/cable_coil, +/obj/item/multitool, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine, +/area/station/science/xenobiology) "mwN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral{ @@ -34145,6 +35169,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, /turf/open/floor/iron, /area/station/commons/dorms) "mya" = ( @@ -34153,6 +35178,8 @@ }, /obj/effect/mapping_helpers/broken_floor, /obj/structure/broken_flooring/singular/directional/south, +/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/aft) "myt" = ( @@ -34168,6 +35195,19 @@ /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, /area/station/medical/virology) +"myT" = ( +/obj/structure/closet/crate, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/item/tank/internals/oxygen, +/obj/item/tank/internals/oxygen, +/obj/item/tank/internals/oxygen, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/turf/open/floor/plating, +/area/station/command/teleporter) "myW" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/broken_flooring/pile/directional/east, @@ -34260,13 +35300,6 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron, /area/station/security/checkpoint/escape) -"mAM" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 4 - }, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/iron, -/area/station/commons) "mAO" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -34308,6 +35341,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/science/xenobiology) +"mCb" = ( +/obj/machinery/computer/cargo{ + dir = 1 + }, +/obj/machinery/computer/security/telescreen/vault{ + dir = 1; + pixel_y = -30 + }, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/station/command/heads_quarters/qm) "mCf" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external/glass{ @@ -34369,12 +35414,6 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/iron/small, /area/station/commons/fitness/locker_room) -"mCV" = ( -/obj/structure/cable, -/obj/item/kirbyplants/random/fullysynthetic, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron, -/area/station/security/prison/rec) "mCW" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -34405,19 +35444,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"mDy" = ( -/obj/structure/window/spawner/directional/south, -/obj/structure/flora/bush/flowers_pp/style_random, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/misc/sandy_dirt, -/area/station/commons) -"mDA" = ( -/obj/structure/chair/plastic{ +"mDq" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/glass, -/area/station/hallway/secondary/spacebridge) +/obj/structure/sign/departments/cargo/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "mDC" = ( /obj/structure/closet/crate{ name = "Game Supplies" @@ -34439,6 +35474,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security) +"mDU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "mDW" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -34460,6 +35504,15 @@ /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor/flat_white, /area/station/science/robotics/lab) +"mEf" = ( +/obj/item/kirbyplants/random, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/closet/crate/trashcart/filled, +/turf/open/floor/iron, +/area/station/hallway/secondary/recreation) "mEk" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/binary/pump/on{ @@ -34478,20 +35531,29 @@ /turf/open/floor/iron/dark/smooth_corner, /area/station/maintenance/starboard/greater) "mEy" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 +/obj/machinery/conveyor{ + dir = 8; + id = "garbage" }, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/light/cold/directional/north, +/obj/machinery/mineral/stacking_unit_console{ + pixel_y = 27 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/small, +/turf/open/floor/plating, /area/station/service/janitor) "mEB" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"mEL" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/iron/white, +/area/station/science/cytology) "mEU" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/iron/showroomfloor, @@ -34627,11 +35689,9 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/white/small, /area/station/medical/virology) -"mHk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/east, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/construction) +"mHq" = ( +/turf/closed/wall/r_wall, +/area/station/commons/fitness/recreation/entertainment) "mHZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -34660,6 +35720,10 @@ }, /turf/open/floor/noslip, /area/station/security/tram) +"mIg" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/science/xenobiology) "mIh" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -34692,6 +35756,21 @@ }, /turf/open/floor/plating, /area/station/commons/storage/tools) +"mID" = ( +/obj/structure/window/spawner/directional/west, +/obj/structure/table/wood, +/obj/item/folder/blue, +/obj/item/reagent_containers/cup/glass/bottle/whiskey{ + pixel_x = 6; + pixel_y = 7 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/wood/tile, +/area/station/command/corporate_showroom) "mIT" = ( /obj/effect/turf_decal/siding/red{ dir = 10 @@ -34773,6 +35852,12 @@ }, /turf/open/floor/iron/dark/herringbone, /area/station/security/courtroom) +"mJZ" = ( +/obj/structure/cable, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron, +/area/station/security/prison/workout) "mKe" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -34787,19 +35872,6 @@ dir = 1 }, /area/station/hallway/primary/aft) -"mKu" = ( -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "mKy" = ( /obj/machinery/requests_console/directional/west{ department = "Engineering"; @@ -34890,6 +35962,16 @@ }, /turf/open/floor/iron, /area/station/security/processing) +"mLA" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/science/xenobiology) "mLF" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/broken_flooring/singular/directional/east, @@ -34902,6 +35984,16 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/medical/coldroom) +"mLM" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/simple/dark/hidden{ + dir = 8 + }, +/obj/structure/filingcabinet, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/server) "mLO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -34910,6 +36002,11 @@ }, /turf/open/floor/iron, /area/station/science/cytology) +"mLU" = ( +/obj/machinery/vending/autodrobe, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood/parquet, +/area/station/service/greenroom) "mMp" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -34920,6 +36017,10 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/general, /turf/open/floor/iron/dark/small, /area/station/medical/paramedic) +"mMr" = ( +/obj/structure/alien/weeds, +/turf/closed/wall, +/area/station/maintenance/starboard/greater) "mMt" = ( /obj/structure/cable, /obj/structure/chair{ @@ -34932,35 +36033,19 @@ /obj/effect/landmark/start/depsec/supply, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/supply) -"mMz" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/table/wood, -/obj/machinery/light/cold/directional/south, -/obj/item/hand_labeler_refill{ - pixel_x = -4; - pixel_y = 26 - }, -/obj/structure/sign/poster/official/random/directional/south, -/obj/machinery/fax{ - fax_name = "Quartermaster's Office"; - name = "Quartermaster's Fax Machine"; - pixel_y = 7 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/qm) "mME" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/broken_flooring/singular/directional/east, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"mMF" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/modular_computer/console/preset/id{ - dir = 1 +"mMK" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 9 }, -/obj/machinery/keycard_auth/directional/south, -/turf/open/floor/wood, -/area/station/command/heads_quarters/qm) +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/bin, +/turf/open/floor/iron/white/small, +/area/station/science/ordnance/storage) "mMN" = ( /obj/structure/chair/office{ dir = 8 @@ -34977,23 +36062,6 @@ }, /turf/open/floor/iron, /area/station/security) -"mMZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/commons/dorms) -"mNh" = ( -/obj/machinery/computer/cargo{ - dir = 1 - }, -/obj/machinery/computer/security/telescreen/vault{ - dir = 1; - pixel_y = -30 - }, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/wood, -/area/station/command/heads_quarters/qm) "mNu" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/stripes/line, @@ -35007,31 +36075,17 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) -"mNM" = ( +"mNv" = ( /obj/structure/cable, -/obj/structure/table/bronze, -/obj/effect/turf_decal/siding/thinplating_new/terracotta{ - dir = 4 - }, -/obj/machinery/light/small/directional/west, -/obj/item/reagent_containers/cup/glass/bottle/beer{ - pixel_x = 7; - pixel_y = 11 - }, -/obj/item/reagent_containers/cup/glass/bottle/beer{ - pixel_x = -1; - pixel_y = 11 - }, -/obj/item/reagent_containers/cup/glass/bottle/beer{ - pixel_x = 3; - pixel_y = 7 +/obj/machinery/door/airlock{ + name = "Maintenance" }, -/obj/item/reagent_containers/cup/glass/bottle/beer{ - pixel_x = -7; - pixel_y = 7 +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/command/meeting_room) +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/aft) "mNN" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/button/door/directional/east{ @@ -35044,6 +36098,14 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/auxiliary) +"mNQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "mNS" = ( /obj/structure/chair{ dir = 4 @@ -35057,6 +36119,17 @@ }, /turf/open/floor/carpet/executive, /area/station/command/meeting_room) +"mOm" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ + dir = 5 + }, +/turf/open/floor/iron/white/side{ + dir = 10 + }, +/area/station/science/xenobiology) "mOq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -35079,9 +36152,7 @@ /turf/open/floor/light/colour_cycle/dancefloor_b, /area/station/maintenance/starboard/central) "mOP" = ( -/obj/effect/landmark/tram/birdshot/prison_wing{ - specific_lift_id = "prison_tram" - }, +/obj/effect/landmark/tram/platform/birdshot/prison_wing, /turf/open/floor/noslip/tram_platform, /area/station/security/tram) "mOT" = ( @@ -35152,13 +36223,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall, /area/station/maintenance/department/engine) -"mQE" = ( -/obj/effect/turf_decal/siding/white{ - dir = 9 - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/dark/small, -/area/station/science/xenobiology) "mQF" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -35175,12 +36239,6 @@ dir = 8 }, /area/station/command/heads_quarters/hos) -"mRj" = ( -/obj/structure/chair/sofa/bench/right, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/turf/open/floor/iron, -/area/station/security/tram) "mRl" = ( /obj/machinery/door/airlock/engineering{ name = "Smoke Room" @@ -35279,9 +36337,31 @@ "mTs" = ( /turf/closed/wall/r_wall, /area/station/security/prison/work) +"mTy" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/blue/full, +/obj/item/storage/medkit/brute{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/medkit/brute{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/reagent_containers/cup/bottle/morphine{ + pixel_x = 4; + pixel_y = -9 + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/white/smooth_large, +/area/station/medical/storage) "mTB" = ( /turf/closed/wall, /area/station/command/gateway) +"mTM" = ( +/obj/structure/cable, +/turf/open/floor/circuit, +/area/station/tcommsat/server) "mTN" = ( /obj/structure/chair/stool/directional/south, /obj/structure/mirror/directional/north, @@ -35310,6 +36390,7 @@ "mTU" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/transit_tube/horizontal, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "mUg" = ( @@ -35328,6 +36409,7 @@ }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /obj/effect/decal/cleanable/dirt, +/obj/structure/alien/weeds, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "mUt" = ( @@ -35337,29 +36419,15 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/iron/grimy, /area/station/cargo/boutique) -"mUz" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/structure/bookcase/random/nonfiction, -/turf/open/floor/wood/tile, -/area/station/science/lower) +"mUC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/stool/directional/west, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "mUO" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/server) -"mUP" = ( -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/box, -/obj/machinery/disposal/bin{ - desc = "A pneumatic waste disposal unit. This one leads to the morgue."; - name = "corpse disposal" - }, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) "mUQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -35371,6 +36439,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/port) +"mVm" = ( +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/vending/wardrobe/viro_wardrobe, +/obj/machinery/camera/directional/west, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/virology) "mVs" = ( /obj/effect/turf_decal/siding/blue{ dir = 1 @@ -35388,6 +36466,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/small, /area/station/ai_monitored/security/armory) +"mVC" = ( +/obj/machinery/door/airlock/external{ + name = "Departure Lounge Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/hallway/secondary/exit/departure_lounge) "mVD" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/public{ @@ -35427,33 +36514,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/security/prison/safe) -"mWF" = ( -/obj/machinery/computer/security/telescreen{ - dir = 4; - name = "Test Chamber Monitor"; - network = list("xeno"); - pixel_x = -29 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/holopad, -/turf/open/floor/iron/white/side{ - dir = 4 - }, -/area/station/science/xenobiology) -"mWN" = ( -/obj/structure/cable, -/turf/open/floor/iron/white/corner{ - dir = 1 - }, -/area/station/science/xenobiology) -"mWT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/obj/structure/sign/poster/official/random/directional/north, -/obj/structure/broken_flooring/singular/directional/east, -/obj/structure/tank_dispenser, -/turf/open/floor/plating, -/area/station/hallway/secondary/dock) "mWY" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/structure/chair/sofa/bench/left{ @@ -35462,6 +36522,15 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron, /area/station/security/processing) +"mXk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/broken_flooring/singular/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "mXo" = ( /obj/machinery/atmospherics/pipe/smart/manifold/general/visible{ dir = 1 @@ -35490,6 +36559,14 @@ }, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs) +"mYm" = ( +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 10 + }, +/obj/structure/reagent_dispensers/watertank, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/smooth_large, +/area/station/science/robotics/mechbay) "mYq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -35519,6 +36596,15 @@ /obj/effect/turf_decal/tile/dark_red/opposingcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"mYS" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/flora/bush/flowers_br/style_random, +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden/monastery) "mYT" = ( /obj/structure/table, /obj/item/assembly/igniter{ @@ -35539,6 +36625,16 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"mYW" = ( +/obj/machinery/camera{ + c_tag = "Xenobiology - Zoo"; + dir = 6; + network = list("ss13","rd","xeno") + }, +/obj/structure/flora/bush/flowers_yw, +/obj/machinery/light/small/directional/east, +/turf/open/floor/grass, +/area/station/science/xenobiology) "mZc" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -35584,12 +36680,9 @@ /obj/machinery/door/airlock/public/glass{ name = "Old Dorms" }, +/obj/structure/alien/weeds, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) -"mZR" = ( -/obj/machinery/light/dim/directional/west, -/turf/open/floor/iron, -/area/station/security/prison) "mZX" = ( /obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, @@ -35675,15 +36768,16 @@ }, /turf/open/floor/iron/smooth, /area/station/service/library) -"nbn" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/smooth, -/area/station/service/library) "nbu" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/holopad, /turf/open/floor/iron/smooth, /area/station/service/library) +"nbF" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/science/robotics/augments) "nbL" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -35705,12 +36799,20 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/table/wood, /obj/item/paper/calling_card, +/obj/structure/alien/resin/membrane, +/obj/structure/alien/weeds, +/obj/structure/alien/weeds, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) "ncf" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/small, +/obj/machinery/recycler{ + dir = 8 + }, +/obj/machinery/conveyor{ + dir = 4; + id = "garbage" + }, +/turf/open/floor/plating, /area/station/service/janitor) "ncl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -35732,6 +36834,10 @@ /obj/effect/turf_decal/trimline/neutral/line, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"nde" = ( +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_large, +/area/station/ai_monitored/turret_protected/ai_upload) "ndq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -35749,26 +36855,10 @@ /obj/effect/spawner/random/structure/girder, /turf/open/floor/noslip/tram_platform, /area/station/security/tram) -"ndI" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/table/reinforced, -/obj/item/trash/cheesie{ - pixel_x = 2; - pixel_y = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "ndM" = ( /obj/structure/tank_dispenser/oxygen, /turf/open/floor/iron, /area/station/security/tram) -"ndY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/green{ - dir = 6 - }, -/turf/open/floor/iron/dark/small, -/area/station/medical/chemistry) "ndZ" = ( /obj/item/radio/intercom/directional/west, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -35798,20 +36888,6 @@ }, /turf/open/floor/wood/tile, /area/station/commons/vacant_room/commissary) -"net" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons) -"neu" = ( -/obj/machinery/computer/rdconsole, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/dark, -/area/station/science/lab) -"nev" = ( -/obj/structure/chair/stool/directional/south, -/turf/open/floor/iron/kitchen/small, -/area/station/maintenance/aft) "neZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -35839,6 +36915,7 @@ "nfm" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/hallway/secondary/construction) "nfs" = ( @@ -35853,20 +36930,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/fore/greater) -"nfB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light/cold/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/status_display/ai/directional/north, -/turf/open/floor/iron, -/area/station/commons/dorms) "nfD" = ( /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/landmark/start/hangover, +/obj/structure/cable, /turf/open/floor/iron, /area/station/commons/dorms) "nfG" = ( @@ -35884,15 +36953,7 @@ /obj/effect/mapping_helpers/broken_floor, /obj/structure/sign/poster/official/random/directional/north, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/commons/dorms) -"nfO" = ( -/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/effect/decal/cleanable/dirt, +/obj/structure/cable, /turf/open/floor/iron, /area/station/commons/dorms) "nfS" = ( @@ -35907,6 +36968,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, /obj/structure/sign/departments/custodian/directional/north, +/obj/structure/cable, /turf/open/floor/iron, /area/station/commons/dorms) "ngo" = ( @@ -35918,6 +36980,7 @@ /obj/effect/mapping_helpers/broken_floor, /obj/machinery/airalarm/directional/north, /obj/effect/decal/cleanable/dirt, +/obj/structure/cable, /turf/open/floor/iron, /area/station/commons/dorms) "ngq" = ( @@ -35948,6 +37011,7 @@ /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, /turf/open/floor/iron, /area/station/commons/dorms) "ngL" = ( @@ -35955,15 +37019,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) -"nhg" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/iron, -/area/station/science/xenobiology) "nhs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -35998,6 +37053,16 @@ }, /turf/open/floor/catwalk_floor/iron, /area/station/science/xenobiology) +"nhP" = ( +/obj/item/storage/backpack/duffelbag/sec{ + pixel_x = -15; + pixel_y = 7 + }, +/obj/structure/sign/poster/official/random/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/office) "nhU" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -36026,18 +37091,13 @@ /obj/structure/sign/warning/chem_diamond/directional/east, /turf/open/floor/iron/dark/small, /area/station/medical/chemistry) -"nig" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 6 +"nih" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/item/crowbar, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) +/obj/machinery/vending/wardrobe/chem_wardrobe, +/turf/open/floor/iron, +/area/station/medical/chemistry) "niw" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -36069,6 +37129,11 @@ dir = 1 }, /area/station/maintenance/department/engine/atmos) +"niR" = ( +/obj/structure/chair, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/smooth_large, +/area/station/security/execution/education) "niT" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -36098,6 +37163,13 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/fore/greater) +"njA" = ( +/obj/machinery/photocopier, +/obj/structure/sign/poster/official/random/directional/north, +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/wood/tile, +/area/station/command/heads_quarters/hop) "njL" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, @@ -36147,21 +37219,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"nkD" = ( -/obj/machinery/modular_computer/console/preset/id{ - dir = 1 - }, -/obj/machinery/requests_console/directional/east{ - department = "Captain's Desk"; - name = "Captain's Requests Console"; - pixel_x = 0; - pixel_y = -30 - }, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/wood/large, -/area/station/command/heads_quarters/captain) "nkH" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -36173,14 +37230,6 @@ /obj/effect/turf_decal/trimline/neutral/line, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"nkN" = ( -/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/holopad, -/turf/open/floor/iron, -/area/station/engineering/storage/tech) "nkY" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -36200,6 +37249,17 @@ /obj/item/radio/intercom/command, /turf/open/floor/carpet/executive, /area/station/command/meeting_room) +"nle" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/dark/side{ + dir = 5 + }, +/area/station/hallway/secondary/construction) +"nlf" = ( +/obj/machinery/vending/wardrobe/sec_wardrobe, +/turf/open/floor/iron/dark, +/area/station/security/lockers) "nlk" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -36228,13 +37288,12 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"nlD" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/item/kirbyplants{ - icon_state = "applebush" +"nlC" = ( +/obj/item/kirbyplants/random/fullysynthetic, +/turf/open/floor/iron/white/corner{ + dir = 4 }, -/turf/open/floor/iron/smooth, -/area/station/command/bridge) +/area/station/science/xenobiology) "nlQ" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, @@ -36272,16 +37331,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) -"nmV" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 4 - }, -/obj/machinery/light/small/directional/east, -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/small, -/area/station/commons/fitness/locker_room) "nnc" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -36314,15 +37363,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/central/lesser) -"nnK" = ( -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/machinery/disposal/bin, -/obj/machinery/light/cold/directional/north, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron/dark, -/area/station/security/office) "nnN" = ( /obj/effect/turf_decal/siding/green{ dir = 6 @@ -36330,6 +37370,11 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/dark/herringbone, /area/station/service/abandoned_gambling_den/gaming) +"nnR" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron, +/area/station/hallway/secondary/spacebridge) "noe" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -36346,6 +37391,18 @@ /obj/structure/bed/maint, /turf/open/floor/eighties, /area/station/service/abandoned_gambling_den/gaming) +"noz" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "noB" = ( /obj/structure/table/reinforced/rglass, /obj/machinery/door/window/left/directional/east{ @@ -36360,6 +37417,23 @@ /obj/item/clothing/head/costume/lobsterhat, /turf/open/floor/eighties, /area/station/service/abandoned_gambling_den/gaming) +"noF" = ( +/obj/structure/cable, +/obj/structure/table/bronze, +/obj/effect/turf_decal/siding/thinplating_new/terracotta{ + dir = 4 + }, +/obj/item/plate{ + pixel_y = 2 + }, +/obj/item/plate{ + pixel_y = 4 + }, +/obj/item/plate{ + pixel_y = 6 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room) "noN" = ( /obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt, @@ -36435,6 +37509,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/small, /area/station/hallway/secondary/spacebridge) +"npZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/sign/departments/court/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "nqd" = ( /obj/machinery/shower/directional/east, /obj/effect/turf_decal/trimline/blue/end{ @@ -36443,13 +37525,6 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/white/small, /area/station/medical/virology) -"nqE" = ( -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/carpet/executive, -/area/station/command/heads_quarters/captain/private) "nqJ" = ( /obj/structure/sink/directional/south, /obj/effect/turf_decal/siding/wood, @@ -36473,12 +37548,21 @@ dir = 8 }, /obj/structure/reagent_dispensers/wall/peppertank/directional/west, -/obj/machinery/requests_console/directional/south, /obj/machinery/computer/records/security{ dir = 4 }, +/obj/machinery/requests_console/directional/south{ + department = "Security"; + name = "Security Requests Console" + }, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/supply) +"nsc" = ( +/obj/structure/cable, +/obj/item/kirbyplants/organic/applebush, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/iron/smooth, +/area/station/hallway/secondary/command) "nsd" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/closet/crate/cardboard, @@ -36554,11 +37638,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/lesser) -"ntl" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/machinery/light/small/directional/south, -/turf/open/floor/noslip, -/area/station/security/tram) "nts" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/decal/cleanable/dirt, @@ -36574,6 +37653,14 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/textured_half, /area/station/hallway/primary/port) +"ntF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/status_display/ai/directional/south, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "ntH" = ( /obj/effect/spawner/random/trash, /turf/open/floor/iron/small, @@ -36591,6 +37678,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria, /area/station/science/breakroom) +"ntQ" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/stripes/red/line{ + dir = 4 + }, +/turf/open/floor/iron/smooth_large, +/area/station/science/auxlab/firing_range) +"ntW" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/vending/wardrobe/coroner_wardrobe, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/turf/open/floor/iron/small, +/area/station/medical/morgue) "ntX" = ( /obj/effect/decal/cleanable/cobweb, /obj/structure/dresser, @@ -36615,11 +37717,28 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"nuh" = ( -/obj/structure/bookcase/random, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/wood/parquet, -/area/station/service/library) +"num" = ( +/obj/effect/turf_decal/sand/plating, +/turf/closed/wall, +/area/station/maintenance/port/lesser) +"nuo" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/modular_computer/preset/id{ + dir = 8 + }, +/obj/machinery/requests_console/directional/east{ + department = "Research Director's Desk"; + name = "Research Director's Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/turf_decal/siding/purple{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/rd) "nuv" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -36629,20 +37748,28 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"nuI" = ( -/obj/structure/cable, -/obj/structure/table/reinforced, -/obj/machinery/light/cold/directional/west, -/obj/effect/turf_decal/tile/dark_red/fourcorners, -/obj/item/restraints/handcuffs, -/turf/open/floor/iron/smooth, -/area/station/security/checkpoint/customs) +"nuC" = ( +/obj/effect/turf_decal/siding, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/white/small, +/area/station/science/lab) "nuO" = ( /obj/effect/turf_decal/tile/blue, /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) +"nuS" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/engine, +/area/station/science/explab) "nuT" = ( /obj/structure/cable, /obj/machinery/power/solar_control{ @@ -36660,6 +37787,11 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/carpet/blue, /area/station/cargo/boutique) +"nuY" = ( +/obj/structure/broken_flooring/pile/directional/east, +/obj/structure/alien/weeds/node, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) "nvo" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -36684,6 +37816,12 @@ dir = 1 }, /area/station/hallway/secondary/exit/departure_lounge) +"nvL" = ( +/mob/living/simple_animal/hostile/ooze/gelatinous{ + name = "Cubie" + }, +/turf/open/floor/iron/recharge_floor, +/area/station/maintenance/port/aft) "nvP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -36725,13 +37863,11 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"nxc" = ( -/obj/structure/closet/secure_closet/security/med, -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/turf/open/floor/iron/checker{ - dir = 1 - }, -/area/station/security/execution/transfer) +"nwS" = ( +/obj/structure/flora/ash/tall_shroom, +/obj/structure/sign/poster/random/directional/north, +/turf/open/floor/grass, +/area/station/service/hydroponics) "nxo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -36740,17 +37876,6 @@ }, /turf/open/floor/iron/dark, /area/station/cargo/storage) -"nxt" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 6 - }, -/obj/structure/fireaxecabinet/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/engineering/atmos) "nxu" = ( /obj/effect/turf_decal/tile/dark_red/anticorner/contrasted{ dir = 4 @@ -36767,9 +37892,19 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/dead_body_placer, +/obj/effect/mapping_helpers/dead_body_placer{ + bodycount = 2 + }, /turf/open/floor/iron/dark/small, /area/station/medical/morgue) +"nxJ" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/modular_computer/preset/id{ + dir = 1 + }, +/obj/machinery/keycard_auth/directional/south, +/turf/open/floor/wood, +/area/station/command/heads_quarters/qm) "nxR" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -36802,6 +37937,16 @@ }, /turf/open/floor/circuit/telecomms/mainframe, /area/station/science/xenobiology) +"nyf" = ( +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/obj/effect/turf_decal/box/corners, +/obj/machinery/camera/autoname/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/bitrunning/station_reward_spawn, +/turf/open/floor/iron/dark/smooth_large, +/area/station/bitrunning/den) "nyi" = ( /turf/closed/wall/rust, /area/station/maintenance/hallway/abandoned_command) @@ -36905,16 +38050,6 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/iron/dark, /area/station/medical/pharmacy) -"nzr" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/white/corner{ - dir = 8 - }, -/area/station/hallway/secondary/entry) "nzK" = ( /obj/structure/cable, /obj/item/ammo_casing/spent{ @@ -37025,16 +38160,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, /area/station/commons/dorms) -"nBo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/gulag_item_reclaimer{ - pixel_y = 24 - }, -/turf/open/floor/iron/dark, -/area/station/security/processing) "nBq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -37089,12 +38214,6 @@ }, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"nCy" = ( -/obj/item/kirbyplants/random, -/obj/machinery/light/cold/directional/south, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron, -/area/station/commons) "nCH" = ( /turf/closed/wall/r_wall, /area/station/security) @@ -37169,16 +38288,43 @@ /obj/item/screwdriver, /turf/open/floor/iron, /area/station/construction/mining/aux_base) +"nEd" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/engine, +/area/station/science/xenobiology) "nEh" = ( /obj/structure/falsewall, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"nEl" = ( +/obj/machinery/computer/quantum_console{ + dir = 4 + }, +/obj/machinery/computer/quantum_console{ + dir = 4 + }, +/obj/machinery/computer/quantum_console{ + dir = 4 + }, +/obj/machinery/computer/quantum_console{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "nEo" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_recreation) +"nEr" = ( +/obj/item/kirbyplants/random, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/commons) "nEt" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -37207,20 +38353,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/cytology) -"nEJ" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor/shutters{ - dir = 8; - id = "custodialshutters"; - name = "Custodial Closet Shutters" - }, -/obj/machinery/button/door/directional/north{ - id = "custodialshutters"; - name = "shutters control"; - pixel_x = 8 - }, -/turf/open/floor/iron/large, -/area/station/service/janitor) "nEY" = ( /obj/structure/closet/firecloset, /obj/effect/decal/cleanable/dirt, @@ -37232,6 +38364,7 @@ /obj/machinery/door/airlock/highsecurity{ name = "Secure Tech Storage" }, +/obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/iron/textured_half, /area/station/engineering/storage/tech) "nFh" = ( @@ -37241,6 +38374,9 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/cargo/drone_bay) +"nFo" = ( +/turf/closed/wall, +/area/station/bitrunning/den) "nFp" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -37258,12 +38394,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"nFv" = ( -/obj/machinery/light/dim/directional/north, -/obj/structure/table, -/obj/item/plant_analyzer, -/turf/open/floor/iron, -/area/station/security/prison/garden) "nFy" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -37274,8 +38404,16 @@ /turf/open/floor/iron, /area/station/maintenance/department/medical/central) "nFA" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/landmark/start/janitor, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/conveyor_switch/oneway{ + dir = 4; + id = "garbage"; + name = "trash chute" + }, /turf/open/floor/iron/white/small, /area/station/service/janitor) "nFD" = ( @@ -37293,6 +38431,12 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) +"nFJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/office) "nFM" = ( /obj/machinery/door/airlock{ id_tag = "study_b"; @@ -37302,6 +38446,14 @@ dir = 1 }, /area/station/commons) +"nFQ" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Commons" + }, +/obj/machinery/door/firedoor, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/iron/textured_half, +/area/station/commons) "nFW" = ( /turf/closed/wall, /area/station/maintenance/fore/greater) @@ -37316,6 +38468,17 @@ /obj/machinery/portable_atmospherics/pump, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"nGd" = ( +/obj/machinery/vending/wardrobe/det_wardrobe, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/security/telescreen{ + dir = 4; + name = "Station Monitor"; + network = list("ss13"); + pixel_x = -26 + }, +/turf/open/floor/wood, +/area/station/security/detectives_office) "nGe" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -37326,35 +38489,27 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/security/brig/entrance) +"nGi" = ( +/obj/effect/turf_decal/tile/dark_red{ + dir = 4 + }, +/obj/machinery/camera/autoname/directional/north, +/obj/structure/cable, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/processing) +"nGk" = ( +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/item/food/grown/banana, +/obj/machinery/light/small/directional/south, +/turf/open/floor/grass, +/area/station/medical/virology) "nGu" = ( /obj/structure/disposalpipe/segment{ dir = 5 }, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"nGv" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/cold/directional/north, -/obj/machinery/status_display/ai/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"nGz" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/turf_decal/siding/white{ - dir = 5 - }, -/obj/structure/bodycontainer/morgue/beeper_off{ - dir = 2 - }, -/turf/open/floor/iron/small, -/area/station/medical/morgue) "nGA" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -37379,13 +38534,6 @@ /obj/structure/table, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"nGP" = ( -/obj/machinery/keycard_auth/directional/south, -/obj/machinery/modular_computer/console/preset/id{ - dir = 1 - }, -/turf/open/floor/wood/parquet, -/area/station/command/heads_quarters/cmo) "nHt" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -37396,12 +38544,6 @@ /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, /area/station/maintenance/port/lesser) -"nHv" = ( -/obj/structure/table, -/obj/effect/spawner/random/techstorage/rnd_secure_all, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/iron, -/area/station/engineering/storage/tech) "nHB" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -37412,6 +38554,22 @@ /obj/effect/turf_decal/stripes/red/line, /turf/open/floor/iron/small, /area/station/hallway/primary/central/fore) +"nHN" = ( +/obj/structure/table, +/obj/item/stack/pipe_cleaner_coil/random, +/obj/item/stack/pipe_cleaner_coil/random{ + pixel_y = 4 + }, +/obj/item/stack/pipe_cleaner_coil/random{ + pixel_y = 3 + }, +/obj/item/stack/pipe_cleaner_coil/random, +/obj/item/stack/pipe_cleaner_coil/random{ + pixel_y = 6 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron, +/area/station/commons/storage/art) "nId" = ( /turf/open/floor/circuit/green, /area/station/ai_monitored/command/nuke_storage) @@ -37421,6 +38579,25 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) +"nIx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/floor, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/server) +"nIA" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/vehicle/ridden/wheelchair{ + dir = 8 + }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/lobby) "nIC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -37470,10 +38647,6 @@ /obj/structure/cable, /turf/open/floor/iron/small, /area/station/maintenance/solars/starboard/fore) -"nJf" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall, -/area/station/maintenance/department/medical/central) "nJm" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 1 @@ -37503,7 +38676,9 @@ /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/machinery/light/small/directional/east, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_command) "nJU" = ( @@ -37517,6 +38692,35 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"nKc" = ( +/obj/effect/turf_decal/trimline/blue/corner{ + dir = 4 + }, +/obj/item/kirbyplants/random/fullysynthetic, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"nKf" = ( +/obj/effect/turf_decal/siding/dark_red/corner{ + dir = 8 + }, +/obj/item/storage/secure/safe/directional/north{ + name = "armory safe A" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/iron/dark/small, +/area/station/ai_monitored/security/armory) +"nKj" = ( +/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/machinery/atmospherics/pipe/smart/simple/dark/hidden{ + dir = 10 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/tcommsat/server) "nKk" = ( /obj/structure/cable, /obj/structure/disposalpipe/sorting/mail{ @@ -37536,6 +38740,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/central/greater) +"nKz" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/smooth, +/area/station/hallway/secondary/command) "nKH" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ dir = 4 @@ -37587,6 +38795,15 @@ /obj/effect/turf_decal/stripes/red/line, /turf/open/floor/iron/small, /area/station/hallway/primary/central/fore) +"nMX" = ( +/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) "nNb" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -37603,15 +38820,6 @@ dir = 1 }, /area/station/command/bridge) -"nNf" = ( -/obj/structure/closet/wardrobe/grey, -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron/small, -/area/station/commons/fitness/locker_room) "nNi" = ( /obj/effect/turf_decal/bot_white/right, /turf/open/floor/engine, @@ -37630,6 +38838,7 @@ /obj/machinery/door/airlock{ name = "Gardening Supplies" }, +/obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/prison) "nNR" = ( @@ -37660,6 +38869,7 @@ /area/station/maintenance/central/lesser) "nNZ" = ( /obj/structure/tank_dispenser, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, /turf/open/floor/plating, /area/station/science/ordnance/testlab) "nOf" = ( @@ -37679,16 +38889,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/small, /area/station/engineering/atmos) -"nOO" = ( -/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/siding/red, -/turf/open/floor/iron/white/small, -/area/station/security/warden) "nPc" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -37752,6 +38952,10 @@ }, /turf/open/floor/iron/white, /area/station/commons/dorms) +"nPX" = ( +/obj/structure/cable, +/turf/open/floor/iron/smooth_large, +/area/station/cargo/warehouse) "nQa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -37827,19 +39031,15 @@ }, /turf/open/floor/plating, /area/station/command/bridge) +"nRo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/table, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "nRr" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/tcommsat/server) -"nRE" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/engine, -/area/station/science/explab) "nRP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -37860,6 +39060,11 @@ /obj/effect/decal/cleanable/blood/gibs/limb, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) +"nSz" = ( +/obj/structure/closet/secure_closet/engineering_welding, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "nSA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral{ @@ -37887,12 +39092,6 @@ dir = 5 }, /area/station/science/xenobiology) -"nST" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/engineering/atmos/pumproom) "nSY" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -37908,11 +39107,6 @@ }, /turf/open/floor/iron/textured_half, /area/station/hallway/primary/central/fore) -"nTe" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/item/stack/sheet/mineral/titanium, -/turf/open/floor/noslip/tram_platform, -/area/station/maintenance/department/medical/central) "nTg" = ( /obj/structure/cable, /obj/item/kirbyplants/random, @@ -37963,6 +39157,14 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/dock) +"nTz" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/obj/machinery/chem_dispenser{ + layer = 2.7 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/medical/pharmacy) "nTC" = ( /turf/open/floor/iron/white/small, /area/station/security/prison/safe) @@ -38106,14 +39308,6 @@ /obj/structure/hedge, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) -"nWv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/white/line{ - dir = 10 - }, -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/turf/open/floor/iron/smooth_large, -/area/station/science/ordnance/storage) "nWO" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -38133,12 +39327,6 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/white, /area/station/science/cytology) -"nXe" = ( -/obj/structure/table/glass, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/white, -/area/station/science/cytology) "nXt" = ( /obj/effect/turf_decal/tile/yellow/full, /obj/structure/table/reinforced, @@ -38156,25 +39344,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/restrooms) -"nXE" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/item/kirbyplants/random, -/obj/effect/decal/cleanable/cobweb, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"nXL" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/structure/industrial_lift/tram/white, -/obj/structure/window/reinforced/tram/left/directional/south, -/obj/structure/chair/sofa/bench/right{ - dir = 1 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/noslip/tram_platform, -/area/station/maintenance/port/aft) "nXP" = ( /obj/machinery/airalarm/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -38190,14 +39359,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/cytology) -"nXT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/stripes/red/line{ - dir = 8 - }, -/turf/open/floor/iron/smooth_large, -/area/station/science/auxlab/firing_range) "nYg" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -38228,13 +39389,12 @@ /obj/structure/bed/maint, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"nYE" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/obj/structure/reagent_dispensers/water_cooler, -/turf/open/floor/iron, -/area/station/hallway/secondary/dock) +"nYQ" = ( +/obj/machinery/vending/wardrobe/cargo_wardrobe, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/cargo/office) "nZg" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -38304,14 +39464,22 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/general, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"oag" = ( -/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ - dir = 6 +"oah" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/landmark/start/cyborg, +/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/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/white/side, -/area/station/science/xenobiology) +/obj/machinery/status_display/ai/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload_foyer) "oaV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -38343,6 +39511,10 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron/white/small, /area/station/science/ordnance/storage) +"obv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "obG" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -38360,14 +39532,6 @@ /obj/structure/reagent_dispensers/plumbed, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"obW" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/structure/window/reinforced/tram/mid/directional/west, -/obj/structure/industrial_lift/tram/white, -/turf/open/floor/noslip/tram_platform, -/area/station/security/tram) "ocb" = ( /turf/open/floor/iron/white/small, /area/station/science/cubicle) @@ -38378,34 +39542,6 @@ /obj/item/stack/sheet/mineral/titanium, /turf/open/floor/noslip/tram_platform, /area/station/maintenance/department/medical/central) -"ocn" = ( -/obj/effect/turf_decal/tile/blue, -/obj/machinery/modular_computer/console/preset/id, -/obj/machinery/button/ticket_machine{ - pixel_x = 9; - pixel_y = 23 - }, -/obj/machinery/button/door/directional/south{ - id = "hop"; - name = "Privacy Shutters Control"; - pixel_x = -2; - pixel_y = 23; - req_access = list("hop") - }, -/obj/machinery/button/door/directional/south{ - id = "hopqueue"; - name = "Queue Shutters Control"; - pixel_x = -13; - pixel_y = 23; - req_access = list("hop") - }, -/obj/machinery/button/flasher{ - id = "hopflash"; - pixel_x = -23; - pixel_y = 11 - }, -/turf/open/floor/iron/dark/textured_corner, -/area/station/command/heads_quarters/hop) "ocs" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -38426,9 +39562,19 @@ /obj/machinery/computer/records/security, /turf/open/floor/iron, /area/station/security/brig/entrance) +"ode" = ( +/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/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/landmark/navigate_destination/disposals, +/turf/open/floor/iron, +/area/station/maintenance/hallway/abandoned_command) "odk" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/atmospheric_sanity/ignore_area, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) "odA" = ( @@ -38445,13 +39591,8 @@ /obj/structure/steam_vent, /turf/open/floor/plating/rust, /area/station/maintenance/fore/greater) -"odN" = ( -/obj/machinery/rnd/bepis, -/turf/open/floor/iron, -/area/station/cargo/storage) "odP" = ( /obj/machinery/firealarm/directional/west, -/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron/dark/small, /area/station/medical/morgue) "odX" = ( @@ -38497,17 +39638,6 @@ /obj/structure/barricade/wooden/crude, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"oeG" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/dark_red/half/contrasted{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/siding/wideplating/dark/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security) "oeH" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -38558,13 +39688,14 @@ }, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical/central) -"ofG" = ( -/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/machinery/light/cold/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +"ofZ" = ( +/turf/closed/mineral/random/stationside, +/area/station/maintenance/port/lesser) +"ogi" = ( +/obj/effect/landmark/start/captain, +/obj/structure/cable, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/captain/private) "ogr" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -38588,12 +39719,12 @@ }, /turf/open/floor/iron/white/small, /area/station/medical/storage) -"ogE" = ( -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/obj/structure/closet/secure_closet/security/sec, -/obj/machinery/light/cold/directional/west, +"ogF" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/closet/firecloset, +/obj/machinery/light/small/directional/west, /turf/open/floor/iron, -/area/station/security/lockers) +/area/station/hallway/secondary/dock) "ogK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -38651,6 +39782,17 @@ }, /turf/open/floor/iron/dark, /area/station/cargo/storage) +"ohk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/dark_red/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security) "ohl" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -38658,6 +39800,16 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"ohu" = ( +/obj/structure/rack, +/obj/item/storage/medkit/regular, +/obj/item/healthanalyzer, +/obj/effect/turf_decal/siding/red{ + dir = 9 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white, +/area/station/security/medical) "ohx" = ( /obj/structure/flora/bush/large/style_random{ pixel_y = 0 @@ -38744,18 +39896,6 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/entry) -"oih" = ( -/obj/machinery/light/cold/directional/east, -/turf/open/floor/iron, -/area/station/cargo/storage) -"oio" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/obj/effect/turf_decal/tile/dark_red/half/contrasted, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "ois" = ( /obj/effect/turf_decal/siding/white{ dir = 6 @@ -38789,11 +39929,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) -"oiK" = ( -/obj/machinery/vending/wardrobe/cargo_wardrobe, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/iron/dark, -/area/station/cargo/office) "oiL" = ( /obj/machinery/computer/cargo{ dir = 1 @@ -38826,22 +39961,23 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/white/small, /area/station/science/ordnance/storage) -"ojk" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/door/airlock/glass_large{ - name = "Library" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/textured_half, -/area/station/service/library) +"oiU" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt, +/obj/structure/alien/resin/membrane, +/obj/structure/alien/weeds, +/turf/open/floor/wood, +/area/station/maintenance/starboard/greater) "ojw" = ( /obj/item/kirbyplants/random, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/white, /area/station/commons/dorms) +"ojD" = ( +/obj/structure/cable, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/security/lockers) "ojU" = ( /obj/structure/rack, /obj/machinery/light/small/directional/south, @@ -38900,6 +40036,7 @@ "olm" = ( /obj/structure/table, /obj/item/mining_voucher, +/obj/structure/alien/weeds, /turf/open/misc/asteroid, /area/station/maintenance/starboard/greater) "olI" = ( @@ -38917,12 +40054,6 @@ }, /turf/open/floor/iron/checker, /area/station/security/breakroom) -"omo" = ( -/obj/effect/spawner/random/vending/snackvend, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron, -/area/station/hallway/secondary/recreation) "omp" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -38951,6 +40082,10 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/engineering/engine_smes) +"omW" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/iron/white/corner, +/area/station/science/xenobiology) "ona" = ( /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) @@ -38974,6 +40109,11 @@ }, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/exit/departure_lounge) +"ony" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/security/tram) "onG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -38994,14 +40134,19 @@ /turf/open/floor/iron/white/small, /area/station/medical/cryo) "onR" = ( -/obj/structure/disposalpipe/sorting/mail/flip{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/delivery/white{ - color = "#52B4E9" +/obj/structure/table, +/obj/item/clothing/gloves/color/orange{ + pixel_x = 4; + pixel_y = -2 }, -/obj/vehicle/ridden/janicart, -/obj/effect/mapping_helpers/mail_sorting/service/janitor_closet, +/obj/item/key/janitor{ + pixel_x = -3; + pixel_y = 6 + }, +/obj/structure/cable, /turf/open/floor/iron/white/small, /area/station/service/janitor) "onX" = ( @@ -39048,22 +40193,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"ooR" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/wood/tile, -/area/station/command/meeting_room) -"ooT" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/machinery/light/cold/directional/west, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/security/processing) "ooU" = ( /obj/structure/disposalpipe/sorting/mail/flip{ dir = 8 @@ -39108,16 +40237,6 @@ /obj/structure/barricade/wooden, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"opF" = ( -/obj/structure/disposalpipe/junction/flip{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/recreation) "opH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39160,6 +40279,13 @@ /obj/machinery/duct, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/restrooms) +"oqE" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/flora/bush/flowers_yw/style_random, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden/monastery) "oqI" = ( /obj/structure/cable, /obj/machinery/door/airlock{ @@ -39175,9 +40301,7 @@ /turf/open/floor/iron, /area/station/hallway/secondary/dock) "oqS" = ( -/obj/effect/landmark/tram/birdshot/maint_right{ - specific_lift_id = "maint_tram" - }, +/obj/effect/landmark/tram/platform/birdshot/maint_right, /turf/open/floor/noslip/tram_plate, /area/station/maintenance/department/medical/central) "oqT" = ( @@ -39198,12 +40322,6 @@ /obj/effect/turf_decal/tile/dark_red/half/contrasted, /turf/open/floor/iron, /area/station/security/execution/transfer) -"orq" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/light/small/directional/west, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron, -/area/station/science/robotics/augments) "orC" = ( /obj/structure/cable, /turf/open/floor/iron/smooth, @@ -39264,6 +40382,13 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) +"osy" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/small, +/area/station/medical/morgue) "osC" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, @@ -39295,6 +40420,18 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) +"ott" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) +"otG" = ( +/obj/structure/filingcabinet/filingcabinet, +/obj/machinery/status_display/supply{ + pixel_y = -32 + }, +/turf/open/floor/iron/dark, +/area/station/cargo/office) "otO" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -39344,14 +40481,6 @@ dir = 1 }, /area/station/command/corporate_suite) -"oub" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/machinery/status_display/ai/directional/west, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron/smooth, -/area/station/ai_monitored/turret_protected/aisat/foyer) "ouf" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -39365,10 +40494,20 @@ "ouj" = ( /turf/closed/wall, /area/station/engineering/engine_smes) +"oup" = ( +/obj/structure/chair/sofa/right/maroon{ + dir = 1 + }, +/obj/machinery/firealarm/directional/south, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/showroomfloor, +/area/station/service/cafeteria) "ouL" = ( /obj/item/clothing/head/cone{ pixel_x = 7 }, +/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) "ouN" = ( @@ -39429,15 +40568,17 @@ /obj/structure/closet/emcloset, /turf/open/floor/iron, /area/station/maintenance/aft) +"ovB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/alien/weeds, +/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) "ovQ" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/cargo/storage) -"ovT" = ( -/obj/structure/table/wood, -/obj/machinery/light/small/directional/east, -/turf/open/floor/wood, -/area/station/maintenance/fore/greater) "owb" = ( /obj/structure/cable, /obj/machinery/firealarm/directional/south, @@ -39498,6 +40639,19 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, /area/station/medical/medbay/central) +"owQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/stool/directional/east, +/turf/open/floor/wood, +/area/station/maintenance/port/fore) +"owR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "oxb" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/poddoor/preopen{ @@ -39534,13 +40688,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"oyz" = ( -/obj/effect/turf_decal/box/corners, -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/science/cytology) "oyA" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -39561,12 +40708,11 @@ "oyQ" = ( /turf/closed/wall, /area/station/science/auxlab/firing_range) -"oyU" = ( -/obj/machinery/exodrone_launcher, -/obj/machinery/firealarm/directional/east, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/smooth, -/area/station/cargo/drone_bay) +"oyR" = ( +/obj/structure/table, +/obj/item/pai_card, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) "oyW" = ( /obj/machinery/telecomms/bus/preset_two, /obj/machinery/camera/autoname/directional/west, @@ -39605,6 +40751,14 @@ /obj/structure/mannequin/plastic, /turf/open/floor/carpet/blue, /area/station/cargo/boutique) +"ozV" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 8 + }, +/area/station/maintenance/starboard/greater) "oAc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39639,16 +40793,6 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron, /area/station/security/lockers) -"oAu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "oAA" = ( /obj/structure/closet/emcloset, /obj/effect/mapping_helpers/broken_floor, @@ -39661,25 +40805,11 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_command) -"oAD" = ( -/obj/machinery/computer/piratepad_control/civilian{ - dir = 1 - }, -/obj/machinery/light/cold/directional/south, -/obj/structure/sign/departments/cargo/directional/west, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/central/fore) "oAF" = ( /obj/effect/spawner/random/vending/colavend, /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"oAL" = ( -/obj/machinery/modular_computer/console/preset/curator, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/wood/parquet, -/area/station/service/library) "oAQ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -39709,11 +40839,26 @@ /obj/effect/mapping_helpers/airlock/access/all/security/entrance, /turf/open/floor/iron/textured_half, /area/station/security/brig) +"oBh" = ( +/obj/structure/alien/weeds/node, +/turf/open/misc/asteroid, +/area/station/maintenance/starboard/greater) "oBm" = ( /obj/structure/chair/sofa/bench/left, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/port) +"oBo" = ( +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/turf_decal/siding/wideplating{ + dir = 4 + }, +/obj/machinery/light/floor{ + pixel_x = 32 + }, +/turf/open/misc/sandy_dirt, +/area/station/security/tram) "oBA" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -39773,19 +40918,20 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"oCJ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/full, -/turf/open/floor/iron/white/textured_large, -/area/station/command/heads_quarters/cmo) +"oCG" = ( +/turf/closed/wall/rust, +/area/station/bitrunning/den) "oCM" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/broken_flooring/pile/directional/east, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) +"oCP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/south, +/obj/machinery/light/floor, +/turf/open/floor/iron/smooth, +/area/station/hallway/secondary/command) "oDc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39793,11 +40939,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/side, /area/station/science/xenobiology) -"oDm" = ( -/obj/structure/table, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/iron, -/area/station/commons/dorms) "oDs" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -39821,6 +40962,13 @@ /obj/effect/mapping_helpers/airlock/access/any/service/hydroponics, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"oDO" = ( +/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, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "oDS" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm/directional/south, @@ -39835,10 +40983,16 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/iron, /area/station/commons/dorms) -"oEm" = ( -/obj/structure/barricade/wooden, -/turf/open/misc/asteroid, -/area/station/maintenance/fore/greater) +"oEr" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/status_display/ai/directional/south, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "oEB" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/effect/turf_decal/box/red/corners{ @@ -39873,6 +41027,16 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter) +"oFf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/chapel{ + dir = 4 + }, +/area/station/maintenance/starboard/greater) "oFi" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -39913,22 +41077,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/engineering/storage/tech) -"oFQ" = ( -/obj/machinery/atmospherics/pipe/smart/simple/general/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/button/door/directional/north{ - id = "Xenolab"; - name = "Test Chamber Blast Doors"; - pixel_x = 26; - pixel_y = -2; - req_access = list("xenobiology") - }, -/turf/open/floor/iron/white/side{ - dir = 8 - }, -/area/station/science/xenobiology) "oFT" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -39968,10 +41116,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/commons/dorms) -"oGA" = ( -/obj/machinery/light/floor, -/turf/open/floor/iron/white/small, -/area/station/science/cubicle) "oGJ" = ( /obj/effect/turf_decal/trimline/neutral/line{ dir = 1 @@ -40120,6 +41264,13 @@ /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/misc/sandy_dirt, /area/station/commons) +"oKb" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/obj/machinery/light_switch/directional/west, +/turf/open/floor/iron, +/area/station/medical/chemistry) "oKp" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -40243,6 +41394,13 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/white/small, /area/station/service/hydroponics) +"oMF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/sign/departments/holy/directional/south, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "oNd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/siding/blue/corner{ @@ -40259,6 +41417,14 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/engineering/supermatter/room) +"oNv" = ( +/obj/effect/turf_decal/tile/dark_red/anticorner/contrasted{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/iron/smooth, +/area/station/security/checkpoint/escape) "oND" = ( /obj/structure/reagent_dispensers/watertank, /obj/effect/turf_decal/stripes/line{ @@ -40269,14 +41435,18 @@ "oNH" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, +/obj/structure/alien/weeds, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) -"oNJ" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/iron/dark, -/area/station/science/ordnance) +"oNM" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/structure/industrial_lift/tram/white, +/obj/structure/window/reinforced/tram/directional/north, +/obj/structure/chair/sofa/bench/left, +/turf/open/floor/noslip/tram_platform, +/area/station/maintenance/port/aft) "oNX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40298,6 +41468,16 @@ /obj/structure/closet/crate/miningcar, /turf/open/floor/iron, /area/station/hallway/secondary/dock) +"oOh" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/white/side{ + dir = 1 + }, +/area/station/science/lobby) "oOk" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -40344,24 +41524,6 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/iron, /area/station/maintenance/port/fore) -"oOM" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/blue/full, -/obj/machinery/light/cold/directional/north, -/obj/item/storage/medkit/o2{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/medkit/o2{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/reagent_containers/cup/bottle/morphine{ - pixel_x = -7; - pixel_y = -11 - }, -/turf/open/floor/iron/white/smooth_large, -/area/station/medical/storage) "oPc" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/computer/upload/borg{ @@ -40451,15 +41613,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/security/prison/workout) -"oQe" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/structure/hedge, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/iron/grimy, -/area/station/hallway/secondary/entry) "oQj" = ( /obj/structure/window/spawner/directional/west, /obj/structure/window/spawner/directional/east, @@ -40482,17 +41635,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/cargo/storage) -"oQx" = ( -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 4 - }, -/obj/structure/table/glass, -/obj/machinery/light/cold/directional/north, -/obj/machinery/reagentgrinder{ - pixel_y = 9 - }, -/turf/open/floor/iron/dark, -/area/station/medical/pharmacy) "oQF" = ( /turf/closed/wall/r_wall, /area/station/security/execution/transfer) @@ -40510,21 +41652,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/commons/storage/tools) -"oRd" = ( -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"oRg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/stripes/red/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/smooth_large, -/area/station/science/auxlab/firing_range) "oRm" = ( /obj/effect/landmark/atmospheric_sanity/ignore_area, /turf/closed/mineral/random/stationside, @@ -40568,8 +41695,15 @@ /obj/machinery/door/airlock/grunge{ name = "St. Brendan's" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/maintenance/starboard/greater) +"oRZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "oSb" = ( /obj/machinery/conveyor{ dir = 8; @@ -40630,12 +41764,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"oSY" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "oTj" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash, @@ -40647,22 +41775,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor/iron, /area/station/service/bar) -"oTF" = ( -/obj/machinery/light/directional/north, -/obj/structure/window/spawner/directional/west, -/obj/structure/table/wood, -/obj/item/folder/blue, -/obj/item/reagent_containers/cup/glass/bottle/whiskey{ - pixel_x = 6; - pixel_y = 7 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ - pixel_x = -4; - pixel_y = 6 - }, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/wood/tile, -/area/station/command/corporate_showroom) "oTH" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/decal/cleanable/dirt, @@ -40689,12 +41801,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/genetics) -"oTW" = ( -/obj/effect/turf_decal/tile/green/half/contrasted, -/obj/machinery/computer/pandemic, -/obj/structure/reagent_dispensers/wall/virusfood/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/virology) "oTZ" = ( /obj/structure/table, /turf/open/floor/plating, @@ -40702,28 +41808,10 @@ "oUd" = ( /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) -"oUj" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"oUw" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/landmark/start/cyborg, -/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/machinery/light/small/directional/west, -/obj/machinery/status_display/ai/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +"oUo" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/recreation) "oUx" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -40763,6 +41851,7 @@ name = "Evidence Storage" }, /obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/structure/cable, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/security/evidence) "oUO" = ( @@ -40782,19 +41871,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/solars/port/aft) -"oVb" = ( -/obj/structure/cable, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron, -/area/station/security/prison/rec) -"oVi" = ( -/obj/machinery/computer/security{ - dir = 8 - }, -/obj/effect/turf_decal/tile/dark_red/fourcorners, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/iron/smooth, -/area/station/security/checkpoint/escape) "oVo" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -40838,13 +41914,14 @@ "oWk" = ( /obj/structure/broken_flooring/singular/directional/east, /obj/item/clothing/suit/caution, +/obj/structure/alien/weeds, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "oWl" = ( /obj/machinery/door/airlock{ name = "Maintenance" }, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/command/maintenance, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_command) "oWr" = ( @@ -40868,6 +41945,17 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/central/greater) +"oXh" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/structure/window/reinforced/tram/directional/east, +/obj/structure/chair{ + dir = 1 + }, +/obj/structure/industrial_lift/tram, +/turf/open/floor/noslip/tram_platform, +/area/station/security/tram) "oXs" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/emcloset, @@ -40882,11 +41970,11 @@ }, /turf/open/floor/iron/cafeteria, /area/station/service/cafeteria) -"oXI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron, -/area/station/commons/dorms) +"oXK" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/department/bridge) "oXM" = ( /obj/machinery/light/cold/directional/south, /obj/item/kirbyplants/random, @@ -40932,6 +42020,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/central/lesser) +"oYJ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible, +/turf/open/floor/plating, +/area/station/engineering/atmos) "oYL" = ( /obj/structure/disposalpipe/trunk{ dir = 1 @@ -40940,6 +42034,14 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) +"oYS" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/computer/station_alert{ + dir = 8 + }, +/obj/item/radio/intercom/command/directional/east, +/turf/open/floor/iron/dark, +/area/station/command/corporate_dock) "oYV" = ( /obj/structure/chair/sofa/bench/left{ dir = 1 @@ -41002,6 +42104,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) +"oZL" = ( +/obj/structure/table, +/obj/item/crowbar/large/heavy, +/obj/item/stack/cable_coil, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/construction/mining/aux_base) "oZY" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -41021,6 +42130,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/port) +"paL" = ( +/obj/structure/fireplace, +/obj/effect/turf_decal/siding/wood/end, +/obj/machinery/camera/directional/east, +/turf/open/floor/stone, +/area/station/service/bar) "paV" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -41043,16 +42158,6 @@ }, /turf/open/floor/iron/smooth, /area/station/service/greenroom) -"pbe" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/turf_decal/siding/wideplating{ - dir = 8 - }, -/obj/machinery/light/floor{ - pixel_x = -32 - }, -/turf/open/misc/sandy_dirt, -/area/station/security/tram) "pbt" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 5 @@ -41071,6 +42176,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_large, /area/station/science/auxlab/firing_range) +"pbE" = ( +/obj/machinery/firealarm/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/hallway/secondary/command) "pbG" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -41083,10 +42195,11 @@ /turf/open/floor/iron/smooth, /area/station/service/greenroom) "pca" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/maintenance/port/lesser) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/landmark/tram/nav/immovable_rod, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "pcb" = ( /obj/effect/turf_decal/tile/dark_red{ dir = 4 @@ -41099,16 +42212,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) -"pcf" = ( -/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/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/hallway/secondary/dock) "pcv" = ( /obj/machinery/door/airlock/command{ name = "Head of Security's Bedroom" @@ -41147,21 +42250,17 @@ /obj/structure/broken_flooring/corner/directional/south, /turf/open/floor/plating, /area/station/hallway/secondary/recreation) -"pdo" = ( -/obj/effect/turf_decal/siding/white{ - dir = 9 - }, -/obj/structure/bodycontainer/morgue/beeper_off{ - dir = 2 - }, -/turf/open/floor/iron/small, -/area/station/medical/morgue) "pds" = ( /obj/structure/cable, /obj/machinery/holopad, /obj/effect/landmark/start/warden, /turf/open/floor/iron/white/small, /area/station/security/warden) +"pdt" = ( +/obj/item/kirbyplants/random, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) "pdz" = ( /obj/structure/window/spawner/directional/west, /obj/structure/window/spawner/directional/east, @@ -41237,6 +42336,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/cargo/drone_bay) +"pep" = ( +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sci-entrance" + }, +/obj/machinery/door/airlock/maintenance{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "peu" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -41272,6 +42382,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/small, /area/station/maintenance/port/lesser) +"pfh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/alien/weeds, +/obj/effect/spawner/random/food_or_drink/soup, +/obj/effect/gibspawner, +/turf/open/floor/wood, +/area/station/maintenance/starboard/greater) "pfv" = ( /obj/structure/disposalpipe/trunk{ dir = 8 @@ -41313,6 +42430,8 @@ }, /obj/effect/mapping_helpers/airlock/abandoned, /obj/structure/barricade/wooden/crude, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/welded, /turf/open/floor/iron/textured_half{ dir = 8 }, @@ -41340,14 +42459,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/small, /area/station/security/prison/shower) -"pgu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/easel, -/obj/item/canvas/twentythree_twentythree, -/obj/item/canvas/twentythree_twentythree, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron, -/area/station/commons/storage/art) "pgw" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -41357,6 +42468,15 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"pgy" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/decal/cleanable/cobweb, +/obj/item/radio/intercom/directional/north, +/obj/item/kirbyplants/fern, +/turf/open/floor/iron/white, +/area/station/science/cytology) "pgE" = ( /obj/structure/chair/office, /obj/effect/mapping_helpers/broken_floor, @@ -41380,23 +42500,18 @@ dir = 4 }, /area/station/maintenance/disposal/incinerator) -"pgP" = ( -/obj/structure/chair{ - pixel_y = -2 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/landmark/start/lawyer, -/turf/open/floor/iron/dark, -/area/station/service/lawoffice) "pgW" = ( /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/service/kitchen/coldroom) +"phj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "phs" = ( /obj/machinery/duct, /turf/open/floor/iron/white/small, @@ -41407,26 +42522,39 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white/small, /area/station/service/hydroponics/garden) -"phJ" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/obj/structure/chair, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/cafeteria, -/area/station/service/cafeteria) "phZ" = ( /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/lower) +"pie" = ( +/obj/effect/spawner/random/decoration/showcase, +/obj/structure/window/spawner/directional/south, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/showroomfloor, +/area/station/command/corporate_showroom) +"pih" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/structure/window/spawner/directional/west, +/obj/effect/turf_decal/stripes/end, +/obj/structure/disposaloutlet{ + dir = 1 + }, +/obj/machinery/status_display/supply{ + pixel_x = 32 + }, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/plating, +/area/station/cargo/sorting) "pij" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/start/janitor, +/obj/structure/cable, /turf/open/floor/iron, /area/station/service/janitor) "pil" = ( @@ -41438,6 +42566,8 @@ /obj/effect/mapping_helpers/airlock/unres{ dir = 1 }, +/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/aft) "piG" = ( @@ -41456,6 +42586,25 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/commons/dorms) +"piT" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/components/binary/valve/digital{ + name = "Waste Release" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/directional/south{ + c_tag = "Atmospherics - Secondary" + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark/side{ + dir = 5 + }, +/area/station/engineering/atmos) "piZ" = ( /obj/structure/chair/sofa/right/maroon{ dir = 1 @@ -41488,15 +42637,6 @@ /obj/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/port/lesser) -"pjr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/cold/directional/west, -/obj/machinery/status_display/ai/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "pjA" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -41530,14 +42670,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons) -"pjO" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/white/corner{ - dir = 4 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/iron/dark/small, -/area/station/security/execution/education) "pjT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -41546,6 +42678,13 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) +"pke" = ( +/obj/machinery/door/airlock/centcom{ + name = "Disposals Access:" + }, +/obj/effect/mapping_helpers/airlock/access/any/service/janitor, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "pkh" = ( /obj/effect/spawner/random/decoration/showcase, /obj/structure/window/spawner/directional/south, @@ -41721,13 +42860,16 @@ }, /turf/open/floor/iron, /area/station/science/cytology) -"poc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/light/cold/directional/west, -/turf/open/floor/iron, -/area/station/cargo/storage) +"pnZ" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"pof" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/grimy, +/area/station/commons/vacant_room/office) "pog" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/iron/freezer, @@ -41748,23 +42890,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron, /area/station/science/xenobiology) -"pon" = ( -/obj/effect/turf_decal/siding/dark_red{ - dir = 4 - }, -/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/item/radio/intercom/directional/west, -/turf/open/floor/iron/dark/small, -/area/station/ai_monitored/security/armory) "pox" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -41781,6 +42906,11 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/iron, /area/station/hallway/primary/port) +"poA" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/plating, +/area/station/security/prison/safe) "poE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/table/reinforced, @@ -41864,6 +42994,17 @@ }, /turf/open/floor/iron, /area/station/science/cytology) +"ppu" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 4 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"ppy" = ( +/obj/machinery/hydroponics/constructable, +/turf/open/floor/iron/white/small, +/area/station/service/hydroponics/garden) "ppA" = ( /obj/effect/turf_decal/tile/green/half/contrasted, /turf/open/floor/iron/dark, @@ -41923,16 +43064,6 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"pqI" = ( -/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/brown/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "pqK" = ( /obj/structure/cable, /obj/machinery/door/window/left/directional/south, @@ -42015,16 +43146,6 @@ }, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/command/teleporter) -"psf" = ( -/obj/effect/turf_decal/siding/brown, -/obj/structure/table/reinforced/plastitaniumglass, -/obj/effect/spawner/random/decoration/ornament, -/turf/open/floor/iron/smooth, -/area/station/maintenance/port/aft) -"psg" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/station/hallway/secondary/dock) "psn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -42086,6 +43207,29 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"ptt" = ( +/obj/structure/chair/wood/wings, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/structure/cable, +/turf/open/floor/stone, +/area/station/command/heads_quarters/captain/private) +"ptu" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/structure/chair/wood{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/stone, +/area/station/command/corporate_suite) +"ptB" = ( +/obj/item/kirbyplants/organic/applebush, +/obj/item/storage/secure/safe/caps_spare/directional/west, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/bridge) "ptN" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/toy/talking/griffin{ @@ -42097,6 +43241,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 5 }, +/obj/machinery/airalarm/directional/north, /turf/open/floor/grass, /area/station/service/hydroponics/garden/monastery) "pug" = ( @@ -42117,10 +43262,13 @@ /area/station/maintenance/port/greater) "pum" = ( /obj/structure/cable, -/obj/item/kirbyplants/random, /obj/effect/turf_decal/arrows{ dir = 4 }, +/obj/machinery/door/window/right/directional/north{ + name = "Library Desk Door"; + req_access = list("library") + }, /turf/open/floor/wood/parquet, /area/station/service/library) "pup" = ( @@ -42153,24 +43301,40 @@ }, /turf/open/floor/catwalk_floor/iron_dark, /area/station/service/library) +"pux" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/diagonal, +/area/station/command/heads_quarters/hop) "puC" = ( -/obj/effect/turf_decal/sand/plating, +/obj/machinery/light/small/directional/west, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) +/obj/structure/closet/firecloset, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "puD" = ( /obj/structure/bookcase/random/nonfiction, /obj/machinery/newscaster/directional/west, +/obj/machinery/digital_clock/directional/north, /turf/open/floor/wood/tile, /area/station/service/bar) "puN" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/grimy, /area/station/service/library) -"puT" = ( -/obj/structure/bookcase/random/nonfiction, -/turf/open/floor/wood/tile, -/area/station/service/bar) +"puY" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_red/half/contrasted{ + dir = 1 + }, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/security/brig/entrance) "pvg" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -42185,13 +43349,6 @@ }, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) -"pvh" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/small, -/area/station/security/tram) "pvt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -42227,6 +43384,14 @@ /obj/effect/landmark/start/cook, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) +"pvY" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/light_switch/directional/west, +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "pwf" = ( /obj/item/kirbyplants/random, /obj/item/shard{ @@ -42263,6 +43428,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, +/obj/structure/cable, /turf/open/floor/iron, /area/station/service/janitor) "pwA" = ( @@ -42278,6 +43444,16 @@ /obj/structure/industrial_lift/tram/white, /turf/open/floor/noslip/tram_platform, /area/station/security/tram) +"pwJ" = ( +/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/light/small/directional/north, +/turf/open/floor/iron/smooth, +/area/station/command/heads_quarters/qm) "pwN" = ( /turf/open/floor/iron/dark/small, /area/station/service/chapel/storage) @@ -42372,19 +43548,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/showroomfloor, /area/station/service/cafeteria) -"pyf" = ( -/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ - dir = 5 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/white/side{ - dir = 1 - }, -/area/station/science/xenobiology) "pyh" = ( /obj/structure/cable, /obj/structure/broken_flooring/singular/directional/east, @@ -42427,6 +43590,9 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"pzd" = ( +/turf/closed/wall, +/area/station/commons/fitness/recreation/entertainment) "pzn" = ( /obj/structure/table, /obj/effect/turf_decal/siding/wood{ @@ -42469,11 +43635,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/tram) -"pzB" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/showroomfloor, -/area/station/medical/surgery/theatre) "pzL" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -42548,6 +43709,21 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"pAx" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "pAB" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -42596,12 +43772,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/central/lesser) -"pBi" = ( -/obj/effect/decal/cleanable/glass, -/obj/structure/chair/stool/directional/east, -/obj/machinery/light/small/directional/west, -/turf/open/floor/eighties, -/area/station/service/abandoned_gambling_den/gaming) "pBn" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -42700,14 +43870,6 @@ /obj/effect/landmark/start/clown, /turf/open/floor/carpet/lone, /area/station/service/theater) -"pDe" = ( -/obj/structure/flora/bush/large/style_random{ - pixel_x = -20; - pixel_y = -16 - }, -/obj/machinery/light/cold/directional/west, -/turf/open/misc/sandy_dirt, -/area/station/service/lawoffice) "pDr" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -42780,10 +43942,14 @@ /obj/effect/turf_decal/siding/blue, /turf/open/floor/iron/white, /area/station/medical/paramedic) -"pEw" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/showroomfloor, -/area/station/medical/surgery/theatre) +"pEu" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/meter, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "pEy" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -42804,16 +43970,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"pEM" = ( -/obj/machinery/mech_bay_recharge_port{ - dir = 2 - }, -/obj/effect/turf_decal/stripes/asteroid/end{ - dir = 1 - }, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/circuit/green, -/area/station/science/robotics/mechbay) "pFd" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 4 @@ -42824,8 +43980,13 @@ "pFk" = ( /obj/structure/broken_flooring/singular/directional/east, /obj/effect/decal/cleanable/dirt, +/obj/structure/alien/weeds, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"pFr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet/lone, +/area/station/service/theater) "pFE" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -42850,6 +44011,22 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"pFN" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/item/stack/sheet/plasteel/fifty, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/item/electronics/airlock{ + pixel_x = -16 + }, +/obj/item/electronics/airlock{ + pixel_x = -16; + pixel_y = 7 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) "pFQ" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 @@ -42885,19 +44062,6 @@ }, /turf/open/floor/wood/tile, /area/station/service/lawoffice) -"pGy" = ( -/obj/effect/turf_decal/trimline/white/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/white/mid_joiner{ - dir = 1 - }, -/obj/structure/sign/poster/official/random/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/light/dim/directional/north, -/turf/open/floor/wood, -/area/station/commons/fitness/recreation) "pGD" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -42933,6 +44097,12 @@ /obj/machinery/light_switch/directional/north, /turf/open/floor/wood, /area/station/commons/fitness/recreation) +"pGX" = ( +/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) "pHe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/firedoor, @@ -42942,19 +44112,16 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/textured_half, /area/station/security/interrogation) -"pHi" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/light/cold/directional/south, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron, -/area/station/commons/storage/tools) +"pHk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/chapel, +/area/station/maintenance/starboard/greater) "pHn" = ( /obj/structure/cable, /obj/structure/broken_flooring/singular/directional/east, +/obj/structure/alien/weeds, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "pHo" = ( @@ -42962,6 +44129,12 @@ /obj/item/storage/medkit/regular, /turf/open/floor/plating, /area/station/cargo/storage) +"pHw" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/airlock_painter, +/turf/open/floor/iron, +/area/station/commons/storage/art) "pHC" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -43026,6 +44199,17 @@ /obj/structure/broken_flooring/singular/directional/east, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"pIn" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Mix to Distro" + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/pumproom) "pIp" = ( /obj/machinery/light/small/directional/west, /obj/effect/turf_decal/stripes/white/line{ @@ -43055,27 +44239,14 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/department/engine) -"pJh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/pink/visible{ +"pJj" = ( +/obj/structure/chair/sofa/bench/left{ dir = 1 }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/machinery/light/small/directional/north, -/obj/effect/mapping_helpers/broken_floor, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/effect/decal/cleanable/ash{ - pixel_x = -16 - }, -/turf/open/floor/iron/dark/side{ - dir = 9 - }, -/area/station/engineering/atmos) +/obj/effect/landmark/start/hangover, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/dock) "pJm" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -43083,6 +44254,12 @@ /obj/effect/landmark/start/cargo_technician, /turf/open/floor/iron, /area/station/cargo/storage) +"pJn" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/stairs{ + dir = 8 + }, +/area/station/cargo/storage) "pJr" = ( /obj/machinery/portable_atmospherics/canister, /turf/open/floor/plating, @@ -43099,19 +44276,31 @@ /obj/structure/chair/stool/directional/south, /turf/open/floor/iron/smooth, /area/station/maintenance/solars/starboard/aft) +"pJw" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/landmark/navigate_destination/dockescpod, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"pJx" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/closet/crate{ + name = "Outdated Weaponry" + }, +/obj/effect/spawner/random/armory/barrier_grenades, +/obj/effect/spawner/random/armory/shotgun, +/turf/open/floor/plating, +/area/station/ai_monitored/security/armory) "pJz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/auxiliary) -"pJK" = ( -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/dark_red/half/contrasted{ - dir = 1 - }, -/obj/effect/landmark/secequipment, -/turf/open/floor/iron, -/area/station/security/tram) "pJQ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -43129,16 +44318,19 @@ dir = 8 }, /area/station/security/processing) +"pKj" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, +/area/station/maintenance/hallway/abandoned_command) "pKm" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/delivery/red, /turf/open/floor/iron/white/small, /area/station/medical/medbay/central) -"pKL" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/white, -/area/station/science/cytology) "pKR" = ( /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ dir = 4 @@ -43167,13 +44359,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"pLc" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/stripes/red/line{ - dir = 8 - }, -/turf/open/floor/iron/smooth_large, -/area/station/science/auxlab/firing_range) "pLg" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43222,6 +44407,8 @@ /obj/structure/cable, /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, +/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/fore/greater) "pLZ" = ( @@ -43239,13 +44426,6 @@ }, /turf/open/floor/grass, /area/station/service/hydroponics/garden/monastery) -"pMi" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) "pMr" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance/two, @@ -43253,6 +44433,7 @@ /area/station/maintenance/department/engine) "pMs" = ( /obj/structure/transit_tube/horizontal, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) "pMu" = ( @@ -43262,6 +44443,10 @@ }, /turf/open/floor/grass, /area/station/service/hydroponics/garden/monastery) +"pMA" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/science/xenobiology) "pMD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/airlock/research/glass{ @@ -43272,20 +44457,25 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/flat_white, /area/station/science/research) +"pMS" = ( +/obj/structure/table, +/obj/machinery/light/small/directional/south, +/obj/item/clothing/suit/utility/radiation, +/obj/item/clothing/head/utility/radiation{ + pixel_x = 10; + pixel_y = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/engineering/gravity_generator) "pNa" = ( /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/wood/parquet, /area/station/service/library) -"pNh" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/machinery/light/directional/north, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) "pNi" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43325,12 +44515,6 @@ dir = 1 }, /area/station/hallway/secondary/construction) -"pND" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/reagent_dispensers/water_cooler, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) "pNO" = ( /obj/effect/turf_decal/siding{ dir = 1 @@ -43339,19 +44523,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white/small, /area/station/science/lab) -"pNS" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/turf_decal/tile/dark_red/half/contrasted{ - dir = 1 - }, -/obj/machinery/firealarm/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/brig/entrance) "pOb" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -43432,6 +44603,16 @@ /obj/machinery/duct, /turf/open/floor/iron/kitchen/small, /area/station/hallway/secondary/service) +"pOL" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/glass/plastitanium, +/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/fore/greater) "pOX" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -43474,17 +44655,14 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/wood/tile, /area/station/service/bar) -"pQh" = ( -/obj/item/kirbyplants/random, -/turf/open/floor/iron/smooth, -/area/station/hallway/secondary/command) -"pQl" = ( -/obj/structure/fireplace, -/obj/effect/turf_decal/siding/wood/end, -/obj/machinery/light/small/directional/east, -/obj/machinery/camera/directional/east, -/turf/open/floor/stone, -/area/station/service/bar) +"pQr" = ( +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 1 + }, +/obj/machinery/mechpad, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/smooth_large, +/area/station/science/robotics/mechbay) "pQE" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -43498,15 +44676,6 @@ }, /turf/open/floor/engine, /area/station/hallway/secondary/entry) -"pQX" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/corner{ - dir = 8 - }, -/area/station/science/xenobiology) "pQY" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/half/contrasted, @@ -43515,11 +44684,16 @@ }, /turf/open/floor/iron/dark/side, /area/station/science/xenobiology) +"pRb" = ( +/obj/item/computer_disk/virus/mime, +/turf/closed/mineral/random/stationside, +/area/space/nearstation) "pRe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/table/wood, /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/decoration/statue, +/obj/machinery/airalarm/directional/east, /turf/open/floor/wood, /area/station/service/chapel/office) "pRz" = ( @@ -43532,11 +44706,11 @@ /obj/machinery/holopad, /turf/open/floor/iron, /area/station/science/ordnance/testlab) -"pRJ" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plating, -/area/station/security/prison/safe) +"pRF" = ( +/obj/structure/cable, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron, +/area/station/security/prison/rec) "pRL" = ( /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/iron/small, @@ -43568,13 +44742,6 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) -"pRV" = ( -/obj/structure/kitchenspike, -/obj/effect/turf_decal/bot_red, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) "pSc" = ( /obj/item/bikehorn/rubberducky{ pixel_x = 6; @@ -43594,6 +44761,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/prison) +"pSf" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "pSm" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ @@ -43639,16 +44812,13 @@ }, /turf/open/space/basic, /area/space/nearstation) -"pSA" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 8 - }, -/obj/machinery/newscaster/directional/north, -/obj/effect/turf_decal/tile/red{ - dir = 4 +"pSB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/tank/air{ + dir = 5 }, -/turf/open/floor/iron/cafeteria, -/area/station/hallway/secondary/exit/departure_lounge) +/turf/open/floor/plating, +/area/station/science/ordnance/testlab) "pSI" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/destructible/cult/item_dispenser/archives/library, @@ -43659,9 +44829,18 @@ /obj/effect/turf_decal/siding/wood{ dir = 6 }, -/obj/structure/bookcase/random, +/obj/structure/bookcase/random/adult, /turf/open/floor/iron/grimy, /area/station/service/library) +"pST" = ( +/obj/structure/table, +/obj/item/plant_analyzer, +/obj/item/healthanalyzer{ + pixel_x = 5 + }, +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/iron, +/area/station/engineering/storage/tech) "pTc" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -43688,11 +44867,6 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/stone, /area/station/service/theater) -"pTn" = ( -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/machinery/light/cold/directional/west, -/turf/open/misc/sandy_dirt, -/area/station/service/lawoffice) "pTq" = ( /obj/machinery/door/airlock/maintenance{ name = "Crematorium Maintenance" @@ -43700,16 +44874,6 @@ /obj/effect/mapping_helpers/airlock/access/all/service/chapel_office, /turf/open/floor/plating, /area/station/maintenance/port/lesser) -"pTr" = ( -/obj/structure/table, -/obj/item/storage/backpack/duffelbag/med/surgery{ - pixel_y = -5 - }, -/obj/item/wirecutters{ - pixel_y = 8 - }, -/turf/open/floor/iron/dark/small, -/area/station/security/execution/education) "pTs" = ( /obj/structure/window/spawner/directional/west, /obj/structure/chair/sofa/corp/right{ @@ -43760,18 +44924,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood/tile, /area/station/service/lawoffice) -"pTU" = ( -/obj/effect/turf_decal/siding/wood, -/obj/machinery/light/small/directional/south, -/turf/open/floor/wood/tile, -/area/station/service/lawoffice) -"pTV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/south, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/station/hallway/secondary/construction) "pTY" = ( /obj/effect/turf_decal/trimline/white/line{ dir = 4 @@ -43786,12 +44938,6 @@ /obj/effect/turf_decal/tile/green, /turf/open/floor/iron/dark, /area/station/medical/chemistry) -"pUi" = ( -/obj/structure/table, -/obj/machinery/airalarm/directional/west, -/obj/item/storage/box/donkpockets, -/turf/open/floor/iron/cafeteria, -/area/station/science/breakroom) "pUl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/firedoor, @@ -43825,21 +44971,16 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"pUD" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/warning/radiation/rad_area/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/hallway/abandoned_command) -"pUJ" = ( -/obj/machinery/light/cold/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 +"pUL" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/machinery/computer/records/medical/laptop{ + dir = 8; + pixel_y = 1 }, -/turf/open/floor/iron/smooth, -/area/station/hallway/secondary/command) +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/command/corporate_dock) "pUO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -43856,6 +44997,11 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/white, /area/station/science/auxlab/firing_range) +"pVo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/girder, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "pVq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/trimline/neutral/line{ @@ -43866,6 +45012,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"pVr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/broken_flooring/pile/directional/east, +/obj/effect/landmark/navigate_destination/dockescpod, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) "pVK" = ( /obj/effect/mapping_helpers/broken_floor, /turf/closed/wall, @@ -43884,6 +45036,14 @@ }, /turf/open/floor/iron/dark/side, /area/station/science/xenobiology) +"pWc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/white/side{ + dir = 1 + }, +/area/station/science/xenobiology) "pWl" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43900,14 +45060,6 @@ }, /turf/open/space/basic, /area/space/nearstation) -"pWv" = ( -/obj/structure/closet/emcloset, -/obj/machinery/newscaster/directional/west, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/hallway/secondary/exit/departure_lounge) "pWC" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -43970,6 +45122,7 @@ /obj/machinery/door/airlock/centcom{ name = "Custodial Closet" }, +/obj/structure/cable, /turf/open/floor/iron/textured_half, /area/station/service/janitor) "pWZ" = ( @@ -43986,18 +45139,6 @@ }, /turf/open/floor/iron/dark/small, /area/station/science/xenobiology) -"pXg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/table/reinforced/titaniumglass, -/obj/machinery/light/directional/north, -/obj/item/analyzer, -/turf/open/floor/iron/smooth_edge{ - dir = 1 - }, -/area/station/maintenance/disposal/incinerator) "pXo" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -44018,6 +45159,11 @@ }, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs) +"pXB" = ( +/obj/effect/turf_decal/siding/dark_red, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/small, +/area/station/ai_monitored/security/armory) "pXC" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -44051,6 +45197,18 @@ /obj/structure/broken_flooring/pile/directional/east, /turf/open/floor/plating, /area/station/hallway/secondary/dock) +"pYb" = ( +/obj/effect/turf_decal/trimline/white/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/white/mid_joiner{ + dir = 1 + }, +/obj/structure/sign/poster/official/random/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/wood, +/area/station/commons/fitness/recreation) "pYr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -44110,15 +45268,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/herringbone, /area/station/service/abandoned_gambling_den/gaming) -"pYP" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron/white/side{ - dir = 1 - }, -/area/station/science/lobby) "pYY" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -44126,16 +45275,14 @@ /obj/structure/cable, /turf/open/floor/iron/checker, /area/station/security/breakroom) -"pZm" = ( -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/obj/machinery/light/cold/directional/north, -/obj/machinery/computer/records/security{ - dir = 4 - }, -/turf/open/floor/iron/checker{ - dir = 1 +"pZl" = ( +/obj/structure/chair{ + dir = 8 }, -/area/station/security/execution/transfer) +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/cafeteria, +/area/station/science/breakroom) "pZu" = ( /obj/structure/hedge, /turf/open/floor/plating, @@ -44167,21 +45314,22 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"pZP" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=8"; - location = "QM #2" - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/firealarm/directional/south, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/iron, -/area/station/cargo/storage) "qaA" = ( /obj/structure/disposalpipe/segment, /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, /area/station/service/hydroponics/garden/monastery) +"qaH" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/dark_red/corner{ + dir = 1 + }, +/obj/structure/rack, +/obj/effect/spawner/random/armory/riot_helmet, +/obj/effect/spawner/random/armory/bulletproof_helmet, +/obj/item/gun/energy/e_gun/dragnet, +/turf/open/floor/iron/dark/small, +/area/station/ai_monitored/security/armory) "qaO" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -44196,6 +45344,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/brig/entrance) +"qbf" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/science/server) "qbg" = ( /turf/open/floor/iron/smooth, /area/station/cargo/warehouse) @@ -44205,6 +45359,13 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, /area/station/security/lockers) +"qbn" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/white/corner{ + dir = 8 + }, +/area/station/hallway/secondary/dock) "qbo" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -44215,6 +45376,7 @@ /obj/structure/chair{ dir = 1 }, +/obj/machinery/airalarm/directional/west, /turf/open/floor/iron/checker, /area/station/security/breakroom) "qbr" = ( @@ -44275,17 +45437,36 @@ /area/station/command/heads_quarters/rd) "qcf" = ( /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/side, /area/station/hallway/secondary/construction) "qcl" = ( /obj/item/radio/intercom/directional/south, /turf/open/floor/wood, /area/station/hallway/secondary/service) +"qcq" = ( +/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/atmospherics/pipe/smart/simple/general/visible{ + dir = 6 + }, +/turf/open/floor/iron/white/side{ + dir = 9 + }, +/area/station/science/xenobiology) "qcr" = ( /obj/structure/flora/bush/flowers_yw/style_random, /mob/living/carbon/human/species/monkey, /turf/open/floor/grass, /area/station/medical/virology) +"qcv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/navigate_destination/dockarrival, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "qcN" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, @@ -44327,17 +45508,6 @@ /obj/structure/cable, /turf/open/floor/iron/small, /area/station/security/processing) -"qdb" = ( -/obj/structure/disposalpipe/trunk, -/obj/structure/disposaloutlet{ - name = "Cargo Deliveries" - }, -/obj/effect/turf_decal/stripes/end{ - dir = 1 - }, -/obj/machinery/light/cold/directional/west, -/turf/open/floor/iron/small, -/area/station/medical/medbay/lobby) "qdm" = ( /turf/open/floor/wood, /area/station/hallway/secondary/service) @@ -44479,6 +45649,22 @@ /obj/structure/sign/departments/lawyer/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) +"qfv" = ( +/obj/structure/flora/rock/pile/jungle/style_random, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/siding/wideplating{ + dir = 8 + }, +/obj/machinery/light/floor{ + pixel_x = -32 + }, +/turf/open/misc/sandy_dirt, +/area/station/security/tram) +"qfz" = ( +/obj/item/kirbyplants/organic/applebush, +/obj/machinery/light/small/directional/south, +/turf/open/floor/carpet/executive, +/area/station/command/heads_quarters/captain/private) "qfA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -44494,15 +45680,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood/parquet, /area/station/service/library) -"qfQ" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/structure/industrial_lift/tram/white, -/obj/structure/window/reinforced/tram/mid/directional/south, -/obj/structure/chair/sofa/bench/left{ - dir = 1 - }, -/turf/open/floor/noslip/tram_platform, -/area/station/maintenance/port/aft) "qfV" = ( /obj/machinery/vending/tool, /obj/structure/sign/poster/official/random/directional/south, @@ -44515,6 +45692,14 @@ /obj/machinery/status_display/evac/directional/east, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"qgj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "qgq" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -44544,6 +45729,8 @@ dir = 4 }, /obj/structure/broken_flooring/singular/directional/east, +/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/aft) "qgx" = ( @@ -44569,6 +45756,7 @@ }, /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/parquet, /area/station/service/library) "qgK" = ( @@ -44586,6 +45774,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/event_spawn, +/obj/structure/cable, /turf/open/floor/wood/parquet, /area/station/service/library) "qgR" = ( @@ -44636,6 +45825,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/central/greater) +"qhq" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/closet/secure_closet/personal, +/obj/item/storage/backpack, +/obj/item/storage/backpack/satchel, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/shoes/winterboots, +/obj/effect/landmark/start/hangover/closet, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron, +/area/station/commons) "qhs" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/red/opposingcorners, @@ -44817,6 +46019,15 @@ /obj/structure/table, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"qju" = ( +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "Bridge Blast Door" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/command/meeting_room) "qjy" = ( /obj/structure/hedge, /turf/open/floor/iron/smooth, @@ -44825,6 +46036,12 @@ /obj/structure/table/reinforced/plastitaniumglass, /turf/open/floor/iron/smooth, /area/station/maintenance/port/aft) +"qjT" = ( +/obj/structure/cable, +/obj/item/kirbyplants/random, +/obj/item/clothing/suit/toggle/owlwings/griffinwings, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/port/aft) "qka" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/stripes/line{ @@ -44886,6 +46103,11 @@ }, /turf/open/floor/iron, /area/station/security) +"qld" = ( +/obj/machinery/destructive_scanner, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/white, +/area/station/hallway/primary/starboard) "qll" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -44921,12 +46143,19 @@ /obj/structure/window/spawner/directional/east, /turf/open/floor/plating, /area/station/ai_monitored/command/storage/eva) -"qlU" = ( -/obj/structure/flora/ash/tall_shroom, -/obj/machinery/light/small/directional/north, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/grass, -/area/station/service/hydroponics) +"qlV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"qma" = ( +/obj/structure/closet/firecloset, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/aft) "qmb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -44937,6 +46166,12 @@ /obj/item/kirbyplants/random, /turf/open/floor/wood/tile, /area/station/service/bar) +"qmf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/carpet/lone, +/area/station/service/theater) "qmr" = ( /obj/effect/turf_decal/siding/red{ dir = 9 @@ -44944,13 +46179,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/small, /area/station/security/brig) -"qmv" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/security/execution/education) "qmx" = ( /obj/structure/table/wood, /obj/effect/turf_decal/tile/neutral/full, @@ -45072,14 +46300,6 @@ }, /turf/open/floor/catwalk_floor/iron, /area/station/service/kitchen) -"qnC" = ( -/obj/machinery/light/cold/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "qnJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -45119,6 +46339,11 @@ /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) +"qop" = ( +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/space/nearstation) "qoD" = ( /turf/closed/wall/r_wall, /area/station/command/corporate_showroom) @@ -45135,14 +46360,6 @@ /obj/structure/steam_vent, /turf/open/floor/iron/smooth, /area/station/maintenance/port/aft) -"qpx" = ( -/obj/machinery/chem_master/condimaster{ - name = "CondiMaster Neo" - }, -/obj/structure/sign/poster/official/random/directional/north, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "qpO" = ( /obj/structure/chair{ dir = 1 @@ -45173,6 +46390,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) +"qqh" = ( +/obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/table, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen/coldroom) "qqp" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/decal/cleanable/dirt, @@ -45181,18 +46408,23 @@ dir = 8 }, /area/station/hallway/secondary/dock) +"qqq" = ( +/obj/effect/turf_decal/tile/green/diagonal_centre, +/obj/machinery/light/small/directional/north, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/diagonal, +/area/station/hallway/primary/central/aft) "qqx" = ( /obj/structure/bed/maint, /turf/open/floor/eighties/red, /area/station/service/abandoned_gambling_den/gaming) -"qqy" = ( -/obj/effect/turf_decal/tile/red/opposingcorners{ +"qqC" = ( +/obj/structure/chair/comfy/carp{ dir = 1 }, -/obj/machinery/light/cold/directional/north, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron/cafeteria, -/area/station/service/cafeteria) +/obj/machinery/light/floor, +/turf/open/floor/glass/reinforced, +/area/station/command/bridge) "qrb" = ( /obj/structure/sign/warning/biohazard, /turf/closed/wall/r_wall, @@ -45224,6 +46456,11 @@ }, /turf/open/floor/iron/cafeteria, /area/station/service/cafeteria) +"qrB" = ( +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/science/xenobiology) "qrI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/textured_half{ @@ -45257,6 +46494,13 @@ /obj/structure/chair/stool/directional/east, /turf/open/floor/circuit, /area/station/tcommsat/server) +"qsi" = ( +/obj/structure/closet/secure_closet/engineering_personal, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark/small, +/area/station/engineering/main) "qsj" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow/opposingcorners, @@ -45286,6 +46530,12 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/grimy, /area/station/service/theater) +"qsR" = ( +/obj/structure/table/reinforced, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/kitchen/small, +/area/station/security/prison/mess) "qsU" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -45302,12 +46552,6 @@ }, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/freezerchamber) -"qtb" = ( -/obj/machinery/vending/games, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/light/directional/south, -/turf/open/floor/wood/parquet, -/area/station/service/library) "qtd" = ( /turf/open/floor/wood/tile, /area/station/command/corporate_showroom) @@ -45322,32 +46566,15 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/hallway/secondary/spacebridge) -"qts" = ( -/obj/structure/table, -/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_x = 6; - pixel_y = 5 - }, -/obj/item/assembly/signaler{ - pixel_y = 8 +"qto" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 }, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron, -/area/station/science/ordnance/testlab) -"qtw" = ( -/obj/structure/table, -/obj/item/crowbar/large/heavy, -/obj/item/stack/cable_coil, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron, -/area/station/construction/mining/aux_base) +/area/station/cargo/sorting) "qtE" = ( /obj/structure/bed{ dir = 4 @@ -45363,6 +46590,11 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/hallway/primary/fore) +"qtJ" = ( +/obj/item/kirbyplants/random, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/smooth, +/area/station/cargo/drone_bay) "qtQ" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -45373,10 +46605,12 @@ dir = 8 }, /area/station/service/theater) -"quf" = ( -/obj/item/kirbyplants/random, +"quc" = ( +/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/commons) +/area/station/commons/dorms) "qui" = ( /obj/machinery/camera/autoname/directional/north, /turf/open/floor/wood/parquet, @@ -45410,6 +46644,12 @@ }, /turf/open/floor/iron/dark/small, /area/station/maintenance/aft) +"quJ" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/flora/tree/stump, +/obj/machinery/light/small/directional/south, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden/monastery) "quQ" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 4 @@ -45430,15 +46670,21 @@ "quU" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/captain) -"qvj" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/cable, -/turf/open/floor/iron/small, -/area/station/medical/morgue) "qvr" = ( /obj/structure/closet/firecloset, /turf/open/floor/plating, /area/station/maintenance/central/lesser) +"qvw" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/structure/chair{ + dir = 8; + name = "Judge" + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/security/courtroom) "qvD" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood/tile, @@ -45474,6 +46720,7 @@ "qwn" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) "qwq" = ( @@ -45489,8 +46736,21 @@ }, /obj/effect/mapping_helpers/broken_floor, /obj/structure/steam_vent, +/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/aft) +"qwz" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "qwC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/dark_red/half/contrasted{ @@ -45507,6 +46767,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/service/lawoffice) +"qwU" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/table/glass, +/turf/open/floor/iron/white/small, +/area/station/medical/psychology) "qwV" = ( /obj/structure/cable, /obj/machinery/power/solar{ @@ -45524,6 +46789,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/service/lawoffice) +"qxi" = ( +/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/dark, +/area/station/medical/medbay/central) "qxj" = ( /obj/structure/disposalpipe/trunk{ dir = 8 @@ -45547,6 +46820,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/prison/workout) +"qxv" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/dark_red/half/contrasted{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/security) "qxw" = ( /obj/structure/table/wood, /obj/item/restraints/handcuffs/fake, @@ -45587,6 +46869,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, +/obj/structure/cable, /turf/open/floor/iron/dark/small, /area/station/security/detectives_office) "qyz" = ( @@ -45604,25 +46887,10 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating/rust, /area/station/maintenance/fore/lesser) -"qyH" = ( -/obj/structure/cable, -/obj/item/kirbyplants/random, -/obj/machinery/light/dim/directional/north, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/maintenance/port/aft) "qyN" = ( /obj/structure/railing, /turf/open/space/basic, /area/space/nearstation) -"qyO" = ( -/obj/structure/closet/secure_closet/evidence, -/obj/item/storage/secure/safe/directional/north{ - name = "evidence safe" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/security/evidence) "qyT" = ( /turf/closed/wall, /area/station/hallway/secondary/exit/departure_lounge) @@ -45654,13 +46922,6 @@ /obj/structure/table/glass, /turf/open/floor/iron/white, /area/station/science/research) -"qzn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/cold/directional/south, -/obj/effect/turf_decal/stripes/line, -/obj/structure/sign/departments/aiupload/directional/south, -/turf/open/floor/iron/white, -/area/station/hallway/primary/starboard) "qzq" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -45685,6 +46946,11 @@ dir = 1 }, /area/station/science/xenobiology) +"qzC" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons) "qzD" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -45752,6 +47018,11 @@ /obj/structure/table, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"qBb" = ( +/obj/item/kirbyplants/organic/applebush, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/wood, +/area/station/maintenance/port/fore) "qBc" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -45766,6 +47037,17 @@ dir = 1 }, /area/station/security/execution/transfer) +"qBd" = ( +/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/power/apc/auto_name/directional/south, +/obj/machinery/light/small/directional/north, +/turf/open/floor/catwalk_floor/flat_white, +/area/station/science/robotics/augments) "qBg" = ( /obj/structure/cable, /obj/structure/table/reinforced, @@ -45790,6 +47072,15 @@ /obj/structure/barricade/wooden/crude, /turf/open/floor/plating, /area/station/cargo/boutique) +"qBl" = ( +/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) "qBy" = ( /obj/effect/turf_decal/plaque{ icon_state = "L5" @@ -45841,6 +47132,11 @@ /obj/effect/turf_decal/stripes/red/line, /turf/open/floor/iron/small, /area/station/hallway/secondary/exit/departure_lounge) +"qCc" = ( +/obj/machinery/light/cold/directional/north, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/station/hallway/secondary/dock) "qCg" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -45866,12 +47162,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, /area/station/science/xenobiology) -"qCF" = ( -/obj/machinery/bookbinder, -/obj/machinery/light/small/directional/south, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/wood/parquet, -/area/station/service/library) "qCJ" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/wood{ @@ -45940,21 +47230,6 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) -"qDr" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/flora/bush/flowers_br/style_random, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) -"qDu" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/structure/flora/bush/flowers_yw/style_random, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) "qDx" = ( /obj/structure/toilet, /obj/structure/sign/poster/contraband/random/directional/north, @@ -46005,6 +47280,21 @@ dir = 8 }, /area/station/science/lobby) +"qEj" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/machinery/camera/autoname/directional/north, +/obj/item/flashlight/lamp, +/turf/open/floor/iron/small, +/area/station/engineering/supermatter/room) +"qEk" = ( +/obj/structure/table/reinforced, +/obj/item/folder/blue{ + pixel_y = 2 + }, +/obj/item/pen, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai) "qEp" = ( /obj/machinery/chem_master/condimaster{ desc = "Used to separate out liquids - useful for purifying botanical extracts. Also dispenses condiments."; @@ -46033,11 +47323,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/lower) -"qEO" = ( -/obj/structure/broken_flooring/pile/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) "qFb" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -46130,6 +47415,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/tram) +"qGU" = ( +/obj/structure/table/wood, +/obj/machinery/computer/libraryconsole{ + dir = 4 + }, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/wood/parquet, +/area/station/service/library) "qGY" = ( /obj/effect/landmark/start/cook, /turf/open/floor/iron/cafeteria, @@ -46245,6 +47538,14 @@ /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron/white/side, /area/station/science/lower) +"qIM" = ( +/obj/structure/cable, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/siding/corner{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "qIO" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 1 @@ -46300,30 +47601,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"qJB" = ( -/obj/machinery/firealarm/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons) -"qJJ" = ( -/obj/structure/chair/office, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/dark/hidden{ - dir = 8 - }, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/server) -"qJS" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/item/kirbyplants/random, -/obj/machinery/light/dim/directional/south, -/turf/open/floor/iron, -/area/station/commons) "qKe" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/effect/turf_decal/siding/green, @@ -46337,19 +47614,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_dark, /area/station/science/xenobiology) -"qKv" = ( -/obj/structure/hedge, -/obj/machinery/status_display/evac/directional/east, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"qKD" = ( -/obj/effect/turf_decal/tile/dark_red{ - dir = 4 - }, -/obj/machinery/camera/autoname/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/security/processing) "qKE" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -46394,15 +47658,6 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/restrooms) -"qLd" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 9 - }, -/obj/machinery/light/cold/directional/west, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/dark/herringbone, -/area/station/security/courtroom) "qLf" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -46426,15 +47681,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/prison/safe) -"qLl" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/structure/window/reinforced/tram/right/directional/east, -/obj/structure/chair/comfy/shuttle, -/obj/structure/industrial_lift/tram, -/turf/open/floor/noslip/tram_platform, -/area/station/security/tram) "qLq" = ( /obj/machinery/recharge_station, /obj/machinery/button/door/directional/west{ @@ -46458,13 +47704,6 @@ }, /turf/open/floor/iron/dark/herringbone, /area/station/security/courtroom) -"qLy" = ( -/obj/structure/cable, -/obj/item/kirbyplants/random, -/obj/item/clothing/suit/toggle/owlwings/griffinwings, -/obj/machinery/light/dim/directional/north, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/maintenance/port/aft) "qLA" = ( /obj/structure/chair{ dir = 4 @@ -46523,11 +47762,6 @@ dir = 9 }, /area/station/science/ordnance/testlab) -"qMX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/modular_computer/console/preset/cargochat/cargo, -/turf/open/floor/iron, -/area/station/cargo/sorting) "qNj" = ( /turf/open/floor/catwalk_floor/iron, /area/station/maintenance/department/medical/central) @@ -46538,14 +47772,6 @@ /obj/structure/hedge, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"qNx" = ( -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 4 - }, -/obj/machinery/light/cold/directional/east, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/iron, -/area/station/security/courtroom) "qNz" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -46559,6 +47785,14 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"qNL" = ( +/obj/machinery/computer/security{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_red/fourcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/smooth, +/area/station/security/checkpoint/escape) "qNO" = ( /turf/open/floor/plating, /area/station/maintenance/starboard/central) @@ -46570,13 +47804,11 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/smooth_large, /area/station/science/auxlab/firing_range) -"qOj" = ( -/obj/structure/cable, -/obj/structure/table, -/obj/effect/spawner/random/techstorage/ai_all, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/engineering/storage/tech) +"qOi" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible, +/turf/open/floor/plating, +/area/station/engineering/atmos/pumproom) "qOm" = ( /obj/effect/spawner/structure/window/reinforced, /obj/effect/turf_decal/stripes/corner{ @@ -46584,6 +47816,12 @@ }, /turf/open/floor/plating, /area/station/commons/storage/tools) +"qOt" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "qOv" = ( /obj/structure/industrial_lift/tram/white, /turf/open/floor/noslip/tram_plate, @@ -46632,29 +47870,9 @@ /obj/effect/landmark/start/chemist, /turf/open/floor/iron/dark, /area/station/medical/chemistry) -"qPr" = ( -/obj/structure/table, -/obj/item/exodrone{ - pixel_y = 8 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/smooth, -/area/station/cargo/drone_bay) -"qPC" = ( -/obj/item/kirbyplants/random, -/turf/open/floor/iron/smooth, -/area/station/cargo/drone_bay) "qPN" = ( /turf/closed/wall/r_wall, /area/station/security/prison/safe) -"qPY" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/obj/item/radio/intercom/directional/east, -/obj/machinery/announcement_system, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/server) "qQg" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -46676,6 +47894,14 @@ }, /turf/open/misc/sandy_dirt, /area/station/security/tram) +"qQp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/green{ + dir = 6 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/dark/small, +/area/station/medical/chemistry) "qQt" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/table/greyscale, @@ -46811,20 +48037,6 @@ /obj/machinery/portable_atmospherics/canister/nitrogen, /turf/open/floor/iron/smooth_large, /area/station/science/ordnance/storage) -"qSG" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/recharger{ - pixel_x = 5; - pixel_y = 4 - }, -/obj/item/radio/off{ - pixel_x = -6 - }, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/iron/smooth, -/area/station/security/checkpoint/supply) "qSH" = ( /obj/effect/turf_decal/bot_white, /obj/effect/spawner/random/structure/crate, @@ -46855,6 +48067,21 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/spacebridge) +"qSZ" = ( +/obj/structure/hedge, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/smooth, +/area/station/hallway/secondary/command) +"qTb" = ( +/obj/structure/disposalpipe/segment, +/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/machinery/light/floor, +/turf/open/floor/iron/white/side{ + dir = 8 + }, +/area/station/science/research) "qTe" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -46886,6 +48113,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/commons/vacant_room/commissary) +"qTz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore/lesser) +"qTD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/computer/teleporter{ + dir = 8 + }, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/plating, +/area/station/command/teleporter) "qTH" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/closet/secure_closet/bar, @@ -46972,14 +48213,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark/herringbone, /area/station/security/courtroom) -"qUA" = ( -/obj/structure/disposalpipe/segment, -/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/machinery/light/small/directional/east, -/turf/open/floor/iron/dark, -/area/station/service/lawoffice) "qUF" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -47031,6 +48264,15 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/wood/tile, /area/station/command/corporate_showroom) +"qVz" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/structure/industrial_lift/tram/white, +/obj/structure/window/reinforced/tram/directional/north, +/obj/structure/chair/sofa/bench/right, +/turf/open/floor/noslip/tram_platform, +/area/station/maintenance/port/aft) "qVK" = ( /obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/stripes/corner{ @@ -47040,13 +48282,6 @@ dir = 8 }, /area/station/hallway/secondary/construction) -"qVM" = ( -/obj/machinery/rnd/production/circuit_imprinter/department/science, -/obj/machinery/light/cold/directional/west, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/science/lab) "qVP" = ( /turf/closed/wall/r_wall, /area/station/maintenance/port/lesser) @@ -47105,6 +48340,23 @@ }, /turf/open/floor/iron/cafeteria, /area/station/science/breakroom) +"qWQ" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "AISat Maintenance" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/all/command/general, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/ai_monitored/turret_protected/aisat/maint) "qWT" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ @@ -47115,12 +48367,32 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) -"qXa" = ( -/obj/structure/table, -/obj/item/radio/intercom/directional/south, -/obj/effect/spawner/random/food_or_drink/condiment, -/turf/open/floor/iron/cafeteria, -/area/station/science/breakroom) +"qXb" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/structure/table/wood, +/obj/machinery/recharger{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/item/storage/wallet/random{ + pixel_x = -7; + pixel_y = 1 + }, +/obj/item/assembly/flash/handheld{ + pixel_x = -6; + pixel_y = 5 + }, +/obj/machinery/requests_console/directional/north{ + department = "Head of Personnel's Desk"; + name = "Head of Personnel's Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/plating, +/area/station/command/heads_quarters/hop) "qXe" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -47185,12 +48457,6 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/cafeteria, /area/station/science/breakroom) -"qXQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/sign/departments/holy/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "qYc" = ( /obj/machinery/photocopier, /obj/effect/mapping_helpers/broken_floor, @@ -47231,6 +48497,12 @@ /obj/effect/turf_decal/tile/green/diagonal_centre, /turf/open/floor/iron/diagonal, /area/station/hallway/primary/central/aft) +"qYv" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/cafeteria, +/area/station/science/breakroom) "qYy" = ( /obj/structure/cable, /obj/structure/barricade/wooden, @@ -47315,10 +48587,6 @@ /obj/structure/broken_flooring/corner/directional/south, /turf/open/floor/plating, /area/station/hallway/secondary/dock) -"qZR" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/storage/art) "qZU" = ( /obj/machinery/portable_atmospherics/canister/plasma, /obj/effect/turf_decal/stripes/white/line{ @@ -47362,6 +48630,13 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) +"raL" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, +/turf/open/floor/iron, +/area/station/security/courtroom) "raM" = ( /obj/structure/chair/sofa/bench{ dir = 4 @@ -47435,6 +48710,15 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"rcg" = ( +/obj/structure/closet/secure_closet/injection{ + name = "educational injections"; + pixel_x = 2 + }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/turf/open/floor/iron/dark/herringbone, +/area/station/security/execution/education) "rch" = ( /obj/item/clothing/suit/costume/xenos, /obj/item/clothing/head/costume/xenos, @@ -47476,14 +48760,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, /area/station/commons/dorms) -"rcz" = ( -/obj/machinery/hydroponics/soil{ - pixel_y = 8 - }, -/obj/effect/spawner/random/food_or_drink/seed, -/obj/machinery/light/small/directional/east, -/turf/open/misc/sandy_dirt, -/area/station/maintenance/starboard/aft) "rcN" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -47504,15 +48780,13 @@ /obj/structure/barricade/wooden/crude, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) -"rdk" = ( -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/turf/open/floor/engine, -/area/station/science/cytology) +"rdh" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "rdo" = ( /obj/structure/window/spawner/directional/west, /obj/structure/flora/bush/jungle/a/style_random, @@ -47530,12 +48804,6 @@ /obj/structure/broken_flooring/pile/directional/east, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"rdC" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/tile/blue/half, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/white/small, -/area/station/service/hydroponics) "rdK" = ( /obj/structure/chair/office, /obj/effect/landmark/start/botanist, @@ -47700,6 +48968,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/engine, /area/station/science/xenobiology) +"rfO" = ( +/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/glass, +/area/station/command/heads_quarters/rd) "rfZ" = ( /obj/structure/cable, /turf/open/floor/iron/grimy, @@ -47716,6 +48990,13 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/maintenance/central/greater) +"rgo" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/order_console/mining, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "rgx" = ( /obj/structure/table, /turf/open/floor/iron/cafeteria, @@ -47742,13 +49023,6 @@ /obj/item/kirbyplants/random/fullysynthetic, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"rgS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/cold/directional/west, -/turf/open/floor/iron/white/side{ - dir = 4 - }, -/area/station/science/xenobiology) "rgT" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/red/line{ @@ -47827,11 +49101,12 @@ "rir" = ( /turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) -"rix" = ( -/obj/effect/landmark/start/cyborg, -/obj/machinery/status_display/ai/directional/east, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +"riu" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/delivery, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "riM" = ( /turf/open/floor/iron/textured_half{ dir = 1 @@ -47887,18 +49162,17 @@ }, /turf/open/floor/glass, /area/station/hallway/secondary/spacebridge) -"rjJ" = ( -/obj/structure/closet{ - name = "Paramedic Supplies" +"rjH" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/turf_decal/siding/blue{ - dir = 5 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/status_display/ai/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 }, -/obj/machinery/light/cold/directional/north, -/obj/machinery/light_switch/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/station/medical/paramedic) +/turf/open/floor/iron, +/area/station/hallway/primary/port) "rjP" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall, @@ -47946,17 +49220,6 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/cargo/boutique) -"rkY" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 8 - }, -/obj/machinery/light/cold/directional/east, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white/corner, -/area/station/hallway/secondary/exit/departure_lounge) "rlb" = ( /obj/item/kirbyplants/random/fullysynthetic, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -47965,15 +49228,6 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron, /area/station/security/prison/workout) -"rld" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/cold/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/sign/departments/science/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "rle" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -48034,6 +49288,13 @@ }, /turf/open/floor/noslip/tram_platform, /area/station/security/tram) +"rma" = ( +/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ + dir = 6 + }, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "rmu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -48055,29 +49316,16 @@ /obj/item/book/manual/wiki/security_space_law, /turf/open/floor/iron, /area/station/security/courtroom) -"rmZ" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/obj/structure/chair{ - dir = 8; - name = "Judge" +"rnc" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 9 }, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/dark/herringbone, /area/station/security/courtroom) -"rne" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/obj/machinery/light/cold/directional/east, -/obj/machinery/firealarm/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/cargo/sorting) "rnn" = ( /obj/structure/cable, /obj/structure/chair/sofa/bench/right{ @@ -48096,19 +49344,6 @@ }, /turf/open/floor/plating, /area/station/medical/chemistry) -"rnF" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) -"rnJ" = ( -/obj/structure/chair/stool/directional/west, -/obj/machinery/light/small/directional/east, -/obj/structure/sign/poster/random/directional/south, -/turf/open/floor/wood, -/area/station/maintenance/port/fore) "rnV" = ( /obj/structure/cable, /turf/open/floor/iron/showroomfloor, @@ -48129,16 +49364,10 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"rov" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/turf_decal/tile/blue/full, -/turf/open/floor/iron/white/textured_large, -/area/station/command/heads_quarters/cmo) +"roq" = ( +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/wood/tile, +/area/station/maintenance/port/lesser) "row" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/reagent_dispensers/plumbed, @@ -48149,18 +49378,9 @@ /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) "roB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/conveyor{ - dir = 1; - id = "garbage"; - name = "trash belt" - }, -/turf/open/floor/plating, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/white/small, /area/station/service/janitor) "roC" = ( /obj/structure/cable, @@ -48230,6 +49450,7 @@ /area/station/security/brig) "rpq" = ( /obj/machinery/camera/autoname/directional/east, +/obj/machinery/airalarm/directional/east, /turf/open/floor/iron/smooth, /area/station/security/evidence) "rpv" = ( @@ -48264,6 +49485,13 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/lesser) +"rpY" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 4 + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/smooth, +/area/station/hallway/secondary/command) "rqc" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/table/wood, @@ -48307,17 +49535,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet/red, /area/station/commons/dorms) -"rqM" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/cold/directional/west, -/obj/item/scalpel{ - pixel_y = 12 - }, -/obj/item/blood_filter, -/obj/item/circular_saw, -/obj/item/bonesetter, -/turf/open/floor/iron/showroomfloor, -/area/station/medical/surgery/theatre) "rqQ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair{ @@ -48349,15 +49566,6 @@ }, /turf/open/floor/glass, /area/station/hallway/secondary/spacebridge) -"rrA" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/siding/red{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/station/security/medical) "rrC" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48367,15 +49575,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"rrF" = ( -/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/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/hallway/secondary/recreation) "rrH" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -48415,6 +49614,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/service/lawoffice) +"rsp" = ( +/obj/structure/closet{ + name = "Paramedic Supplies" + }, +/obj/effect/turf_decal/siding/blue{ + dir = 5 + }, +/obj/machinery/light_switch/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/station/medical/paramedic) "rss" = ( /obj/machinery/portable_atmospherics/canister/plasma, /obj/effect/turf_decal/stripes/white/line{ @@ -48436,28 +49646,14 @@ /turf/open/floor/iron, /area/station/hallway/secondary/recreation) "rsz" = ( -/obj/structure/bed/pod{ - desc = "An old medical bed, just waiting for replacement with something up to date."; - name = "medical bed" +/obj/structure/bed/medical{ + dir = 4 }, /obj/item/bedsheet/medical, /obj/machinery/light/small/directional/east, /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/showroomfloor, /area/station/medical/virology) -"rsA" = ( -/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 = list("ordnance") - }, -/obj/item/target/clown, -/obj/item/target/clown, -/obj/item/target/syndicate, -/obj/item/target/alien, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/science/ordnance/testlab) "rsH" = ( /obj/structure/punching_bag, /obj/effect/turf_decal/bot, @@ -48466,6 +49662,15 @@ "rsL" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/fore) +"rsP" = ( +/obj/machinery/suit_storage_unit/engine, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/radio/intercom/directional/east, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/station/engineering/main) "rsV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48515,26 +49720,24 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) -"rtu" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/computer/scan_consolenew{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple{ - dir = 9 - }, -/obj/machinery/light/dim/directional/north, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/dark, -/area/station/science/genetics) "rty" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"rtK" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/commons) "rtQ" = ( /turf/closed/wall/r_wall, /area/station/security/tram) +"rtZ" = ( +/obj/structure/sign/directions/dorms{ + dir = 1 + }, +/turf/closed/wall, +/area/station/hallway/secondary/recreation) "rui" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -48549,15 +49752,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/science/lower) +"ruC" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/tile/green/anticorner/contrasted, +/obj/structure/table/glass, +/obj/effect/mapping_helpers/broken_floor, +/obj/item/radio/intercom/directional/south, +/obj/machinery/reagentgrinder, +/turf/open/floor/iron/white, +/area/station/medical/virology) "ruD" = ( /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"ruJ" = ( -/obj/structure/sign/warning/no_smoking/circle/directional/north, -/obj/structure/closet/l3closet/scientist, -/obj/item/storage/bag/xeno, -/turf/open/floor/iron/white/side, -/area/station/science/xenobiology) "ruO" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -48595,8 +49801,11 @@ "rvD" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/effect/turf_decal/tile/dark_red/fourcorners, -/obj/machinery/requests_console/directional/south, /obj/structure/closet/secure_closet/security, +/obj/machinery/requests_console/directional/south{ + department = "Security"; + name = "Security Requests Console" + }, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/escape) "rvE" = ( @@ -48676,44 +49885,12 @@ }, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) -"rwK" = ( -/obj/effect/turf_decal/siding/dark_red{ - dir = 1 - }, -/obj/machinery/computer/prisoner/management{ - dir = 4 - }, -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/light/small/directional/west, -/obj/machinery/requests_console/directional/north{ - department = "Head of Security's Desk"; - name = "Head of Security Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/stone, -/area/station/command/heads_quarters/hos) "rwP" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, /obj/machinery/camera/autoname/directional/east, /turf/open/floor/plating, /area/station/maintenance/department/prison) -"rwQ" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 4 - }, -/obj/item/radio/intercom/directional/west, -/obj/effect/landmark/start/assistant, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white/corner{ - dir = 1 - }, -/area/station/hallway/secondary/exit/departure_lounge) "rwR" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -48725,14 +49902,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) -"rwS" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 8 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/grimy, -/area/station/science/cubicle) "rwT" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -48758,6 +49927,10 @@ "rxu" = ( /obj/structure/table, /obj/machinery/airalarm/directional/south, +/obj/item/storage/box/bandages{ + pixel_y = 6; + pixel_x = -6 + }, /obj/item/clipboard{ pixel_x = 4; pixel_y = 4 @@ -48773,6 +49946,26 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) +"rxP" = ( +/obj/structure/table, +/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_x = 6; + pixel_y = 5 + }, +/obj/item/assembly/signaler{ + pixel_y = 8 + }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron, +/area/station/science/ordnance/testlab) "rxT" = ( /obj/structure/table/glass, /obj/effect/turf_decal/siding/thinplating_new/light{ @@ -48796,6 +49989,14 @@ /obj/structure/industrial_lift/tram/subfloor, /turf/open/floor/noslip/tram_platform, /area/station/security/tram) +"ryk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/white/side{ + dir = 1 + }, +/area/station/science/research) "rym" = ( /obj/machinery/door/airlock/public/glass{ name = "Public Shrine" @@ -48805,15 +50006,6 @@ dir = 1 }, /area/station/hallway/secondary/exit/departure_lounge) -"ryn" = ( -/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, -/turf/open/floor/iron, -/area/station/science/lower) "ryp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/siding/wood{ @@ -48867,14 +50059,6 @@ /obj/machinery/light/floor, /turf/open/floor/wood/large, /area/station/service/hydroponics/garden/monastery) -"rzC" = ( -/obj/item/kirbyplants/random, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/recreation) "rzG" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/dark_red/half/contrasted{ @@ -48897,6 +50081,11 @@ dir = 1 }, /area/station/hallway/secondary/entry) +"rzR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/holopad, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "rAb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -48910,15 +50099,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"rAj" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/generic_maintenance_landmark, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/department/medical/central) "rAn" = ( /obj/structure/closet/secure_closet/hydroponics, /obj/effect/turf_decal/bot, @@ -49025,6 +50205,19 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"rBh" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"rBq" = ( +/obj/structure/cable, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/dark_red/fourcorners, +/obj/item/restraints/handcuffs, +/obj/machinery/light/small/directional/west, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/smooth, +/area/station/security/checkpoint/customs) "rBx" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -49134,6 +50327,11 @@ dir = 4 }, /area/station/hallway/secondary/entry) +"rDl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "rDx" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/window/reinforced/spawner/directional/south, @@ -49150,15 +50348,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/service/hydroponics) -"rDA" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/light/dim/directional/west, -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/construction) +"rDP" = ( +/obj/item/kirbyplants/random/fullysynthetic, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/security/tram) "rDS" = ( /obj/machinery/computer/exodrone_control_console{ dir = 4 @@ -49169,45 +50364,15 @@ "rEb" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/generic_maintenance_landmark, +/obj/structure/alien/gelpod, +/obj/structure/alien/weeds, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) -"rEe" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/west, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 10 - }, -/obj/machinery/atmospherics/components/binary/pump/on/layer2{ - dir = 1 - }, -/obj/item/radio/intercom/prison/directional/west, -/turf/open/floor/iron/cafeteria, -/area/station/security/prison) "rEt" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/simple/orange/visible, /turf/open/floor/plating, /area/station/engineering/atmos/pumproom) -"rEC" = ( -/obj/effect/turf_decal/tile/green/half/contrasted, -/obj/structure/table/glass, -/obj/item/radio/intercom/directional/south, -/obj/item/storage/box/syringes{ - pixel_x = -8; - pixel_y = 2 - }, -/obj/item/storage/box/beakers{ - pixel_x = 2; - pixel_y = 11 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) "rEL" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -49215,6 +50380,17 @@ }, /turf/open/floor/iron/smooth, /area/station/cargo/drone_bay) +"rEY" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/pdapainter{ + pixel_y = 2 + }, +/obj/machinery/light/directional/north, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/dark/textured_edge{ + dir = 1 + }, +/area/station/command/heads_quarters/hop) "rFa" = ( /obj/structure/disposalpipe/trunk{ dir = 2 @@ -49234,6 +50410,11 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/iron, /area/station/cargo/sorting) +"rFi" = ( +/obj/item/kirbyplants/random, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "rFn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral, @@ -49387,13 +50568,9 @@ /turf/open/floor/iron/white, /area/station/medical/virology) "rGL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/picket_sign{ - desc = "Can't you read? it clearly says what it says!"; - name = "DO NOT ENTER" - }, -/turf/open/misc/asteroid, -/area/station/maintenance/fore/greater) +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/commons/fitness/recreation/entertainment) "rGN" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, @@ -49445,11 +50622,6 @@ }, /turf/open/floor/carpet/blue, /area/station/cargo/boutique) -"rHP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron, -/area/station/hallway/secondary/dock) "rHQ" = ( /obj/machinery/deepfryer, /turf/open/floor/iron/cafeteria, @@ -49467,6 +50639,22 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/execution/transfer) +"rHV" = ( +/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/machinery/status_display/ai/directional/north, +/turf/open/floor/iron, +/area/station/commons/dorms) +"rIb" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/structure/closet/secure_closet/security/sec, +/obj/machinery/camera/directional/north, +/obj/effect/decal/cleanable/cobweb, +/obj/structure/reagent_dispensers/wall/peppertank/directional/north, +/turf/open/floor/iron, +/area/station/security/lockers) "rIg" = ( /obj/machinery/griddle, /turf/open/floor/iron/cafeteria, @@ -49499,9 +50687,9 @@ /turf/open/floor/engine, /area/station/engineering/gravity_generator) "rIO" = ( -/obj/effect/spawner/random/trash, -/turf/open/misc/asteroid, -/area/station/maintenance/fore/greater) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "rIS" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/cafeteria, @@ -49574,6 +50762,12 @@ }, /turf/open/floor/iron, /area/station/security/brig/entrance) +"rJJ" = ( +/obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "rJT" = ( /obj/structure/chair/sofa/left/maroon, /turf/open/floor/iron/showroomfloor, @@ -49583,18 +50777,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/checker, /area/station/command/heads_quarters/hos) -"rJY" = ( -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/iron/dark/small, -/area/station/science/xenobiology) "rJZ" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -49631,19 +50813,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_command) +"rLk" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 10 + }, +/turf/open/floor/engine, +/area/station/science/explab) "rLr" = ( /obj/machinery/door/poddoor/incinerator_ordmix, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/burnchamber) -"rLv" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/structure/industrial_lift/tram/white, -/obj/structure/window/reinforced/tram/mid/directional/south, -/obj/structure/chair/sofa/bench/right{ - dir = 1 - }, -/turf/open/floor/noslip/tram_platform, -/area/station/maintenance/port/aft) "rLw" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -49654,6 +50837,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/central/greater) +"rLK" = ( +/obj/machinery/hydroponics/soil{ + pixel_y = 8 + }, +/obj/effect/spawner/random/food_or_drink/seed, +/obj/machinery/light/small/dim/directional/north, +/turf/open/misc/sandy_dirt, +/area/station/maintenance/starboard/aft) "rLN" = ( /obj/structure/safe, /obj/item/lazarus_injector, @@ -49681,6 +50872,28 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/dock) +"rMb" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/iron/grimy, +/area/station/commons/vacant_room/office) +"rMl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/green{ + dir = 5 + }, +/obj/machinery/light_switch/directional/east, +/obj/machinery/disposal/bin{ + desc = "A pneumatic waste disposal unit. This one leads to the morgue."; + name = "corpse disposal" + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/dark/small, +/area/station/medical/chemistry) "rMm" = ( /obj/structure/railing/corner{ dir = 8 @@ -49703,6 +50916,13 @@ }, /turf/open/misc/sandy_dirt, /area/station/security/tram) +"rMH" = ( +/obj/machinery/porta_turret/ai{ + dir = 4 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai_upload) "rMV" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -49733,41 +50953,44 @@ /obj/effect/mapping_helpers/airlock/access/all/science/general, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"rNn" = ( +/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/dark_red/half/contrasted, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron, +/area/station/security) +"rNq" = ( +/obj/machinery/door/airlock/multi_tile/public/glass{ + name = "Theatre" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/textured_half, +/area/station/service/theater) "rNA" = ( /turf/open/floor/wood, /area/station/service/theater) +"rNB" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/command/gateway) "rNJ" = ( /obj/effect/spawner/random/entertainment/arcade, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) "rNK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/iron/white/side{ - dir = 1 - }, -/area/station/science/xenobiology) -"rNU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - 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/door/firedoor, +/obj/machinery/door/airlock/glass{ + name = "Holodeck" }, /turf/open/floor/iron, -/area/station/hallway/secondary/dock) -"rNY" = ( -/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ - dir = 6 - }, -/obj/effect/turf_decal/stripes/end{ - dir = 1 - }, -/obj/machinery/meter, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating, -/area/station/security/execution/education) +/area/station/commons/fitness/recreation/entertainment) "rOb" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49807,12 +51030,14 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/wood/parquet, /area/station/service/theater) -"rOz" = ( -/obj/effect/spawner/random/vending/colavend, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron, -/area/station/hallway/secondary/recreation) +"rOy" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/obj/effect/landmark/start/hangover, +/obj/machinery/light/small/directional/east, +/turf/open/floor/glass, +/area/station/hallway/secondary/spacebridge) "rOD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, @@ -49832,6 +51057,16 @@ }, /turf/open/floor/iron/dark, /area/station/medical/medbay/lobby) +"rOK" = ( +/obj/effect/turf_decal/trimline/white/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/white/mid_joiner{ + dir = 1 + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/wood, +/area/station/commons/fitness/recreation) "rON" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral, @@ -49869,6 +51104,26 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, /turf/open/floor/catwalk_floor/iron_white, /area/station/engineering/atmos) +"rPx" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/trimline/brown/corner, +/obj/effect/turf_decal/trimline/brown/corner{ + 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, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 1 + }, +/area/station/bitrunning/den) "rPz" = ( /obj/structure/table/glass, /obj/item/flashlight/lamp/green{ @@ -49915,9 +51170,17 @@ /obj/machinery/door/airlock/research/glass{ name = "Pharmacy" }, -/obj/effect/mapping_helpers/airlock/access/all/medical/chemistry, +/obj/effect/mapping_helpers/airlock/access/all/medical/pharmacy, /turf/open/floor/iron/dark/small, /area/station/medical/pharmacy) +"rQN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "rQS" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -49954,6 +51217,7 @@ "rRu" = ( /obj/structure/transit_tube/horizontal, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) "rRy" = ( @@ -49975,23 +51239,11 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron, /area/station/commons/dorms) -"rRK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/dim/directional/south, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/secondary/recreation) "rRQ" = ( /obj/structure/hedge, /obj/item/radio/intercom/directional/south, /turf/open/floor/wood/large, /area/station/command/heads_quarters/captain) -"rRR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/turf/open/floor/engine, -/area/station/science/xenobiology) "rRT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -50081,32 +51333,33 @@ /obj/structure/railing/corner, /turf/open/space/basic, /area/space/nearstation) -"rSS" = ( -/obj/effect/turf_decal/tile/dark_red{ - dir = 4 - }, -/obj/structure/reagent_dispensers/water_cooler, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron, -/area/station/security/tram) "rST" = ( /turf/closed/wall, /area/station/cargo/storage) +"rTg" = ( +/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/decal/cleanable/dirt, +/turf/open/floor/iron/smooth, +/area/station/engineering/break_room) +"rTj" = ( +/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/decal/cleanable/dirt, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/commons/dorms) "rTq" = ( /obj/machinery/photocopier, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) -"rTt" = ( -/obj/effect/turf_decal/siding/thinplating_new/terracotta{ - dir = 1 - }, -/obj/machinery/modular_computer/console/preset/command{ - dir = 1 - }, -/obj/effect/turf_decal/siding/yellow, -/turf/open/floor/wood/tile, -/area/station/command/bridge) "rTy" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -50155,6 +51408,12 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) +"rUb" = ( +/obj/structure/hedge, +/obj/machinery/status_display/evac/directional/east, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "rUd" = ( /turf/closed/wall, /area/station/security/prison) @@ -50236,6 +51495,25 @@ }, /turf/open/floor/noslip/tram_platform, /area/station/security/tram) +"rVH" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/table/glass, +/obj/item/stack/medical/mesh{ + pixel_x = 3 + }, +/obj/item/stack/medical/suture{ + pixel_x = 5 + }, +/obj/item/stack/medical/suture{ + pixel_y = 3 + }, +/obj/machinery/airalarm/directional/south, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = -4; + pixel_y = 10 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "rVQ" = ( /obj/structure/disposalpipe/trunk, /obj/structure/window/spawner/directional/west, @@ -50259,7 +51537,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 4 }, -/obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) "rVX" = ( @@ -50318,8 +51595,30 @@ "rWO" = ( /obj/structure/disposalpipe/segment, /obj/structure/broken_flooring/singular/directional/east, +/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/aft) +"rWP" = ( +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes{ + 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/dark/smooth_half{ + dir = 1 + }, +/area/station/bitrunning/den) "rWW" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -50348,11 +51647,6 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"rXQ" = ( -/obj/structure/cable, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "rXW" = ( /obj/structure/flora/bush/flowers_yw, /obj/machinery/door/window/left/directional/west{ @@ -50362,6 +51656,12 @@ /mob/living/carbon/human/species/monkey, /turf/open/floor/grass, /area/station/science/genetics) +"rXY" = ( +/obj/machinery/modular_computer/preset/id, +/obj/effect/turf_decal/tile/dark_red/fourcorners, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/iron/smooth, +/area/station/security/checkpoint/customs) "rYd" = ( /obj/structure/chair/sofa/left, /obj/effect/mapping_helpers/broken_floor, @@ -50449,27 +51749,21 @@ /obj/machinery/duct, /turf/open/floor/stone, /area/station/service/bar/backroom) -"rZt" = ( -/obj/effect/spawner/random/entertainment/arcade{ - dir = 1 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/eighties/red, -/area/station/service/abandoned_gambling_den/gaming) -"rZu" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 +"rZq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/status_display/ai/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/broken_flooring/pile/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/hallway/abandoned_command) +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "rZG" = ( /obj/structure/closet/crate/trashcart, /obj/effect/spawner/random/trash/food_packaging, /obj/effect/spawner/random/trash/food_packaging, /obj/effect/spawner/random/trash/cigbutt, /obj/effect/decal/cleanable/dirt, +/obj/structure/alien/weeds, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) "rZH" = ( @@ -50511,6 +51805,28 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/white/small, /area/station/service/hydroponics) +"saD" = ( +/obj/machinery/camera/directional/south, +/obj/machinery/light/small/directional/south, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/table, +/obj/item/storage/box/mousetraps{ + pixel_x = -3; + pixel_y = 8 + }, +/obj/item/restraints/legcuffs/beartrap{ + pixel_x = 8; + pixel_y = 13 + }, +/obj/item/flashlight{ + pixel_y = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron/white/small, +/area/station/service/janitor) "saY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -50548,57 +51864,29 @@ /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/dark, /area/station/science/genetics) -"sbv" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, +"sbt" = ( /obj/structure/table, -/obj/item/storage/box/monkeycubes{ - pixel_x = 16; - pixel_y = 9 - }, -/obj/item/storage/box/monkeycubes{ - pixel_x = 6; - pixel_y = 4 +/obj/effect/turf_decal/bot, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/kitchen/small, +/area/station/hallway/secondary/service) +"sbx" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 8 }, -/obj/item/storage/pill_bottle/mutadone{ - pixel_x = -7; - pixel_y = 13 +/obj/machinery/newscaster/directional/north, +/obj/effect/turf_decal/tile/red{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/north, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/dark, -/area/station/science/genetics) +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/cafeteria, +/area/station/hallway/secondary/exit/departure_lounge) "sbB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /turf/open/floor/iron/dark/small, /area/station/tcommsat/server) -"sbC" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/table, -/obj/effect/turf_decal/siding/purple{ - dir = 5 - }, -/obj/item/clothing/gloves/latex{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/clothing/gloves/latex{ - pixel_x = 2; - pixel_y = 6 - }, -/obj/item/storage/box/disks{ - pixel_x = 6; - pixel_y = 12 - }, -/obj/machinery/light/dim/directional/north, -/obj/structure/sign/warning/no_smoking/circle/directional/north, -/turf/open/floor/iron/dark, -/area/station/science/genetics) "sbN" = ( /obj/machinery/rnd/server, /turf/open/floor/circuit, @@ -50617,6 +51905,15 @@ }, /turf/open/floor/iron/small, /area/station/hallway/primary/central/fore) +"sbW" = ( +/obj/effect/turf_decal/stripes/end, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/plating, +/area/station/security/execution/education) "sbX" = ( /obj/effect/turf_decal/siding/thinplating_new/light{ dir = 8 @@ -50691,6 +51988,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"scC" = ( +/obj/machinery/chem_master/condimaster{ + name = "CondiMaster Neo" + }, +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "sdf" = ( /obj/item/kirbyplants/random/fullysynthetic, /obj/machinery/light_switch/directional/east, @@ -50707,6 +52012,11 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"sdC" = ( +/obj/structure/industrial_lift/tram/white, +/obj/machinery/light/small/directional/west, +/turf/open/floor/noslip/tram_plate, +/area/station/maintenance/port/aft) "sdQ" = ( /obj/structure/cable, /obj/machinery/door/airlock/maintenance{ @@ -50739,32 +52049,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/service/hydroponics) -"sem" = ( -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/neutral/full, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/item/lighter{ - pixel_x = 2; - pixel_y = 5 - }, -/obj/item/lighter{ - pixel_x = -8; - pixel_y = -2 - }, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/iron/smooth_large, -/area/station/service/bar) -"sen" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/cafeteria, -/area/station/science/breakroom) "seE" = ( /obj/structure/curtain/cloth, /turf/open/floor/carpet/purple, /area/station/commons/dorms) +"seI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/maintenance/fore/greater) "seM" = ( /obj/effect/turf_decal/stripes/red/line{ dir = 4 @@ -50774,6 +52070,7 @@ "seV" = ( /obj/structure/transit_tube/horizontal, /obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/space/basic, /area/space/nearstation) "sfb" = ( @@ -50793,6 +52090,14 @@ }, /turf/open/floor/iron/smooth_large, /area/station/service/bar) +"sfq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/white/side{ + dir = 1 + }, +/area/station/science/research) "sfv" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -50853,16 +52158,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) -"sgI" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/box/red/corners{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 5 - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "sgL" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -50899,13 +52194,6 @@ }, /turf/open/floor/iron/smooth_large, /area/station/service/bar) -"sgT" = ( -/obj/machinery/light/very_dim/directional/east, -/mob/living/simple_animal/hostile/ooze/gelatinous{ - name = "Cubie" - }, -/turf/open/floor/iron/recharge_floor, -/area/station/maintenance/port/aft) "sgX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -51075,43 +52363,18 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"sjJ" = ( -/obj/structure/cable, -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/obj/machinery/keycard_auth/directional/south, -/turf/open/floor/iron/dark/textured_corner{ - dir = 4 - }, -/area/station/command/heads_quarters/hop) "skc" = ( /obj/structure/chair/sofa/bench/right{ dir = 1 }, /turf/open/floor/iron/dark/side, /area/station/security/execution/transfer) -"skf" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 1 - }, -/obj/machinery/light/cold/directional/south, -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/turf/open/floor/iron, -/area/station/security/tram) "skg" = ( /obj/effect/mapping_helpers/broken_floor, /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/port/aft) -"skh" = ( -/obj/machinery/processor/slime, -/obj/effect/turf_decal/siding/white{ - dir = 6 - }, -/turf/open/floor/iron/dark/small, -/area/station/science/xenobiology) "skm" = ( /obj/structure/cable, /obj/structure/table, @@ -51139,42 +52402,6 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron, /area/station/medical/chemistry) -"skH" = ( -/obj/structure/rack, -/obj/item/flashlight/lantern, -/turf/open/misc/asteroid, -/area/station/maintenance/fore/greater) -"skJ" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/chair/stool/directional/east, -/turf/open/floor/iron/kitchen/small, -/area/station/maintenance/aft) -"skO" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/dark_red/corner{ - dir = 1 - }, -/obj/structure/rack, -/obj/item/clothing/head/helmet/toggleable/riot{ - pixel_x = 3; - pixel_y = 2 - }, -/obj/item/clothing/head/helmet/toggleable/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_x = -3; - pixel_y = -2 - }, -/obj/item/gun/energy/e_gun/dragnet, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/iron/dark/small, -/area/station/ai_monitored/security/armory) "skP" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -51267,16 +52494,30 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, +/obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/escape) +"slM" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_red/half/contrasted, +/obj/effect/landmark/navigate_destination/sec, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "slY" = ( /turf/closed/wall, /area/station/maintenance/port/fore) -"smc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/carpet/lone, -/area/station/service/theater) +"slZ" = ( +/obj/structure/closet/secure_closet/detective, +/obj/machinery/requests_console/directional/north{ + department = "Detective's Office"; + name = "Detective Requests Console" + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, +/area/station/security/detectives_office) "smf" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -51353,6 +52594,11 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron, /area/station/security/courtroom) +"snJ" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/white, +/area/station/science/cytology) "snK" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/corner, /obj/effect/landmark/event_spawn, @@ -51399,13 +52645,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/small, /area/station/engineering/atmos) -"soA" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood, -/obj/structure/bed/dogbed/ian, -/obj/machinery/computer/security/telescreen/entertainment/directional/east, -/turf/open/floor/wood/tile, -/area/station/command/heads_quarters/hop) "soD" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/corner{ dir = 8 @@ -51450,6 +52689,13 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/dark/small, /area/station/security/checkpoint/customs/auxiliary) +"spx" = ( +/obj/machinery/portable_atmospherics/canister/anesthetic_mix, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/effect/turf_decal/stripes, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/white/small, +/area/station/medical/cryo) "spH" = ( /obj/structure/table/wood, /turf/open/floor/wood, @@ -51470,15 +52716,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs/auxiliary) -"spU" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/obj/machinery/computer/crew, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/iron/smooth, -/area/station/security/checkpoint/customs/auxiliary) "spW" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -51490,6 +52727,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"sqa" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "sqe" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -51520,12 +52764,6 @@ /obj/structure/sink/directional/south, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"sqp" = ( -/obj/machinery/light/cold/directional/west, -/obj/machinery/iv_drip, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/showroomfloor, -/area/station/medical/virology) "sqz" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance, @@ -51545,20 +52783,6 @@ }, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs/auxiliary) -"sqD" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/holopad, -/obj/machinery/light/cold/directional/west, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/science/xenobiology) "sqV" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/sofa/bench/left{ @@ -51592,6 +52816,14 @@ /obj/structure/disposalpipe/segment, /turf/closed/wall, /area/station/maintenance/port/greater) +"sru" = ( +/obj/structure/tank_dispenser, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "srA" = ( /obj/structure/chair/sofa/bench/left{ dir = 4 @@ -51641,6 +52873,13 @@ /obj/structure/broken_flooring/corner/directional/south, /turf/open/floor/plating, /area/station/hallway/secondary/recreation) +"srT" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/station/command/meeting_room) "srW" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/iron, @@ -51659,6 +52898,12 @@ /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"ssq" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/dock) "sst" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -51734,11 +52979,26 @@ /obj/machinery/holopad, /turf/open/floor/iron/white/small, /area/station/science/lab) +"suq" = ( +/obj/structure/chair/plastic{ + dir = 4 + }, +/obj/effect/landmark/start/hangover, +/obj/machinery/light/small/directional/west, +/turf/open/floor/glass, +/area/station/hallway/secondary/spacebridge) "suw" = ( /obj/effect/decal/cleanable/dirt, /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/checker, /area/station/command/heads_quarters/hos) +"suF" = ( +/obj/effect/mapping_helpers/broken_floor, +/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) "suK" = ( /obj/effect/spawner/random/vending/snackvend, /obj/effect/mapping_helpers/broken_floor, @@ -51893,15 +53153,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/small, /area/station/maintenance/starboard/central) -"swF" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) "swI" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -51929,16 +53180,6 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) -"swN" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/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/dark, -/area/station/medical/medbay/central) "swO" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -51950,6 +53191,39 @@ }, /turf/open/floor/grass, /area/station/cargo/storage) +"swV" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/table/wood, +/obj/item/hand_labeler_refill{ + pixel_x = -4; + pixel_y = 26 + }, +/obj/structure/sign/poster/official/random/directional/south, +/obj/machinery/fax{ + fax_name = "Quartermaster's Office"; + name = "Quartermaster's Fax Machine"; + pixel_y = 7 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/qm) +"sxd" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/obj/machinery/button/door/directional/south{ + id = "kihall"; + name = "Hallway Cutoff"; + pixel_x = -7 + }, +/obj/machinery/button/door/directional/south{ + id = "kitchenshutters"; + name = "Kitchen Shutters"; + pixel_x = 7 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "sxm" = ( /turf/closed/wall, /area/station/tcommsat/server) @@ -52020,6 +53294,17 @@ }, /turf/open/space/basic, /area/space) +"sye" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/siding/wideplating{ + dir = 8 + }, +/obj/machinery/light/floor{ + pixel_x = -32 + }, +/turf/open/misc/sandy_dirt, +/area/station/security/tram) "syg" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -52125,12 +53410,6 @@ /obj/machinery/duct, /turf/open/floor/iron/textured_large, /area/station/hallway/primary/central/fore) -"szK" = ( -/obj/structure/chair/wood{ - dir = 4 - }, -/turf/open/floor/wood/tile, -/area/station/service/bar) "szM" = ( /obj/machinery/computer/slot_machine{ pixel_y = 2 @@ -52168,32 +53447,21 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/smooth_large, /area/station/service/bar) -"sAi" = ( -/obj/machinery/monkey_recycler, -/obj/effect/turf_decal/siding/white{ - dir = 5 +"sAA" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/office/light{ + dir = 8 }, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/dark/small, -/area/station/science/xenobiology) +/obj/effect/turf_decal/siding/purple/corner, +/obj/effect/landmark/start/research_director, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/rd) "sAB" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/station/maintenance/central/lesser) -"sAT" = ( -/obj/machinery/deepfryer, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) -"sBa" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/structure/industrial_lift/tram/white, -/obj/structure/window/reinforced/tram/mid/directional/north, -/obj/structure/chair/sofa/bench/left, -/turf/open/floor/noslip/tram_platform, -/area/station/maintenance/port/aft) "sBp" = ( /obj/structure/table, /obj/machinery/processor{ @@ -52202,15 +53470,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) -"sBu" = ( -/obj/structure/chair/sofa/right/maroon{ - dir = 1 - }, -/obj/machinery/light/cold/directional/south, -/obj/machinery/firealarm/directional/south, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/showroomfloor, -/area/station/service/cafeteria) "sBz" = ( /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -52233,14 +53492,6 @@ }, /turf/closed/wall, /area/station/commons/storage/art) -"sBV" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 4; - piping_layer = 2 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/dark, -/area/station/science/ordnance) "sCc" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, @@ -52248,6 +53499,14 @@ "sCi" = ( /turf/closed/wall, /area/station/service/lawoffice) +"sCk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/kirbyplants/random{ + pixel_y = 8 + }, +/turf/open/floor/circuit, +/area/station/tcommsat/server) "sCl" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -52272,8 +53531,18 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/general, /turf/open/floor/iron/dark/small, /area/station/medical/medbay/central) +"sCu" = ( +/obj/machinery/computer/prisoner/management{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/turf/open/floor/iron/checker{ + dir = 1 + }, +/area/station/security/execution/transfer) "sCw" = ( /obj/structure/transit_tube/station/dispenser/flipped, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) "sCB" = ( @@ -52287,19 +53556,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) +"sCR" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/modular_computer/preset/research{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/obj/effect/turf_decal/siding/purple, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/rd) "sDj" = ( /turf/closed/wall/r_wall, /area/station/science/cytology) -"sDo" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/dark_red/half/contrasted{ - dir = 4 - }, -/obj/machinery/light/cold/directional/west, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security) "sDp" = ( /obj/structure/cable, /obj/structure/table, @@ -52328,6 +53596,15 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"sDD" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/modular_computer/preset/cargochat/service{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/kitchen/small, +/area/station/hallway/secondary/service) "sDT" = ( /obj/machinery/firealarm/directional/north, /obj/structure/cable, @@ -52365,10 +53642,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) -"sEC" = ( -/obj/machinery/light/cold/directional/south, -/turf/open/floor/circuit/green, -/area/station/ai_monitored/command/nuke_storage) "sED" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -52414,20 +53687,23 @@ /obj/machinery/light_switch/directional/north, /turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) -"sFv" = ( -/obj/machinery/camera{ - c_tag = "Xenobiology - Zoo"; - dir = 6; - network = list("ss13","rd","xeno") - }, -/obj/structure/flora/bush/flowers_yw, -/turf/open/floor/grass, -/area/station/science/xenobiology) "sFz" = ( /obj/structure/chair/stool/directional/east, /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) +"sFD" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/green{ + dir = 9 + }, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/cafeteria, +/area/station/science/circuits) "sFH" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -52447,13 +53723,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/grimy, /area/station/service/theater) -"sFW" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/sepia, -/area/station/maintenance/aft) "sGh" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/effect/turf_decal/stripes/white/line{ @@ -52469,6 +53738,16 @@ }, /turf/open/misc/sandy_dirt, /area/station/security/tram) +"sGt" = ( +/obj/structure/table/reinforced, +/obj/item/scalpel{ + pixel_y = 12 + }, +/obj/item/blood_filter, +/obj/item/circular_saw, +/obj/item/bonesetter, +/turf/open/floor/iron/showroomfloor, +/area/station/medical/surgery/theatre) "sGE" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/effect/turf_decal/stripes/line{ @@ -52557,17 +53836,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/medbay/lobby) -"sIm" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 10 - }, -/turf/open/floor/engine, -/area/station/science/explab) "sIt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/broken_floor, @@ -52619,6 +53887,14 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark, /area/station/engineering/storage/tcomms) +"sJE" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/kirbyplants/random/fullysynthetic, +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/aft) "sJF" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -52653,6 +53929,11 @@ "sJR" = ( /turf/open/floor/plating, /area/station/maintenance/fore/greater) +"sKk" = ( +/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) "sKq" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -52662,6 +53943,11 @@ }, /turf/open/floor/carpet, /area/station/medical/psychology) +"sKt" = ( +/obj/effect/turf_decal/trimline/white/line, +/obj/effect/turf_decal/trimline/white/mid_joiner, +/turf/open/floor/wood, +/area/station/commons/fitness/recreation) "sKv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -52696,18 +53982,11 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white/small, /area/station/security/warden) -"sKI" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/siding/purple{ - dir = 8 - }, -/obj/machinery/holopad, -/turf/open/floor/iron/dark, -/area/station/science/genetics) "sKS" = ( /obj/structure/sign/poster/official/pda_ad/directional/north, /obj/structure/tank_holder/extinguisher, +/obj/structure/alien/weeds, +/obj/effect/gibspawner, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) "sKX" = ( @@ -52726,12 +54005,6 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron, /area/station/engineering/atmos/storage/gas) -"sLy" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/science/genetics) "sLB" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -52766,6 +54039,23 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/science/server) +"sMh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/research{ + name = "Research Division Access" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sci-entrance" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/turf/open/floor/iron/white/textured_half{ + dir = 1 + }, +/area/station/science/research) "sMi" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/siding/wood{ @@ -52774,17 +54064,15 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/grass, /area/station/service/hydroponics/garden/monastery) +"sMq" = ( +/obj/machinery/light/warm/directional/west, +/turf/open/floor/iron, +/area/station/security/prison) "sMu" = ( /obj/structure/cable, /obj/structure/railing, /turf/open/floor/catwalk_floor, /area/station/hallway/secondary/entry) -"sMw" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/dark, -/area/station/science/server) "sMD" = ( /turf/closed/wall, /area/station/science/server) @@ -52795,6 +54083,26 @@ /obj/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"sMT" = ( +/obj/structure/table, +/obj/item/emergency_bed{ + pixel_y = 14 + }, +/obj/item/emergency_bed{ + pixel_y = 18 + }, +/obj/item/emergency_bed{ + pixel_y = 25 + }, +/obj/item/wheelchair{ + pixel_y = -3 + }, +/obj/item/wheelchair, +/obj/item/wheelchair{ + pixel_y = 3 + }, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "sMU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -52826,28 +54134,11 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"sNL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/cold/directional/west, -/obj/machinery/status_display/ai/directional/west, -/obj/machinery/duct, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "sNW" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"sNX" = ( -/obj/structure/cable, -/obj/structure/table, -/obj/effect/turf_decal/bot, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/iron/kitchen/small, -/area/station/hallway/secondary/service) "sOj" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -52863,16 +54154,6 @@ }, /turf/open/space/basic, /area/space/nearstation) -"sOm" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue/opposingcorners, -/obj/machinery/light/small/directional/west, -/obj/machinery/camera/autoname/directional/west, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron, -/area/station/service/hydroponics) "sOp" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -52889,6 +54170,9 @@ /area/station/engineering/gravity_generator) "sOF" = ( /obj/item/kirbyplants/random, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) "sON" = ( @@ -52919,6 +54203,15 @@ /obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) +"sPa" = ( +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/machinery/door/airlock/grunge{ + name = "St. Brendan's" + }, +/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/maintenance/starboard/greater) "sPt" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/green{ @@ -52957,9 +54250,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/mob/living/simple_animal/hostile/retaliate/goat{ - name = "Pete" - }, +/mob/living/basic/goat/pete, /obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) @@ -52987,27 +54278,9 @@ /obj/item/stack/ore/iron{ amount = 25 }, +/obj/structure/alien/weeds, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"sQw" = ( -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/effect/mapping_helpers/broken_floor, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = -18; - pixel_y = 4 - }, -/obj/machinery/recharger, -/obj/machinery/requests_console/directional/north{ - department = "Security"; - name = "Security Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/iron/smooth, -/area/station/security/checkpoint/customs/auxiliary) "sQA" = ( /obj/effect/turf_decal/siding/white, /obj/structure/bed/maint, @@ -53083,6 +54356,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/storage) +"sSl" = ( +/obj/machinery/camera/directional/west, +/obj/machinery/status_display/ai/directional/west, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "sSm" = ( /obj/effect/turf_decal/stripes/red/line{ dir = 4 @@ -53102,11 +54381,6 @@ dir = 1 }, /area/station/engineering/atmos) -"sSp" = ( -/obj/effect/turf_decal/siding/green, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/dark/small, -/area/station/medical/chemistry) "sSq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -53157,15 +54431,6 @@ /obj/item/folder/yellow, /turf/open/floor/iron, /area/station/cargo/sorting) -"sSF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "sSK" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -53180,10 +54445,6 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"sST" = ( -/obj/machinery/light/cold/directional/north, -/turf/open/floor/circuit/telecomms/mainframe, -/area/station/science/xenobiology) "sSU" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -53218,22 +54479,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/genetics) -"sSY" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron, -/area/station/hallway/secondary/recreation) -"sTa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/glass_large{ - name = "Diner" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/textured_half, -/area/station/service/cafeteria) "sTf" = ( /obj/structure/window/spawner/directional/west, /obj/structure/chair/sofa/corp/left{ @@ -53267,10 +54512,6 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/dark/smooth_large, /area/station/service/lawoffice) -"sTl" = ( -/obj/machinery/door/firedoor, -/turf/open/floor/iron/textured_half, -/area/station/service/cafeteria) "sTp" = ( /turf/closed/wall, /area/station/service/cafeteria) @@ -53314,13 +54555,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"sTW" = ( -/obj/machinery/door/airlock/glass_large{ - name = "Theatre" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/textured_half, -/area/station/service/theater) "sUe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, @@ -53331,19 +54565,6 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) -"sUq" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/obj/effect/turf_decal/siding/thinplating_new/terracotta{ - dir = 8 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/command/meeting_room) "sUy" = ( /turf/closed/wall/r_wall, /area/station/command/meeting_room) @@ -53382,6 +54603,11 @@ /obj/structure/cable, /turf/open/floor/iron/textured_half, /area/station/security) +"sVk" = ( +/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) "sVp" = ( /obj/structure/table, /obj/structure/sign/poster/official/corporate_perks_vacation/directional/east, @@ -53399,25 +54625,16 @@ /obj/effect/spawner/random/vending/colavend, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"sVL" = ( +/obj/structure/chair/sofa/bench/right, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/incident_display/tram/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) "sVN" = ( /turf/closed/wall/r_wall, /area/station/security/prison/workout) -"sVX" = ( -/obj/effect/turf_decal/trimline/white/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/white/mid_joiner{ - dir = 1 - }, -/obj/structure/sign/poster/official/random/directional/north, -/obj/machinery/light/dim/directional/north, -/turf/open/floor/wood, -/area/station/commons/fitness/recreation) -"sWj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/textured_half, -/area/station/service/theater) "sWm" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -53444,12 +54661,10 @@ /obj/effect/mapping_helpers/airlock/abandoned, /obj/effect/decal/cleanable/dirt, /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/grimy, /area/station/maintenance/starboard/greater) -"sWC" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/r_wall, -/area/station/commons/fitness/recreation) "sWJ" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -53517,15 +54732,6 @@ }, /turf/open/floor/engine, /area/station/science/cytology) -"sXM" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating_new, -/obj/machinery/firealarm/directional/south, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/dark/herringbone, -/area/station/security/courtroom) "sXO" = ( /obj/structure/chair{ dir = 4 @@ -53585,6 +54791,13 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, /turf/open/floor/catwalk_floor/iron, /area/station/engineering/storage/tech) +"sYx" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer, +/obj/effect/turf_decal/stripes, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/iron/white/small, +/area/station/medical/cryo) "sYF" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 4 @@ -53624,15 +54837,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) -"sZF" = ( -/obj/structure/chair{ - dir = 1; - name = "Prosecution" - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron, -/area/station/security/courtroom) "sZH" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -53678,31 +54882,16 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/security/courtroom) -"taf" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ - dir = 1 +"tao" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 }, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, -/obj/machinery/light/cold/directional/east, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, /turf/open/floor/iron, /area/station/security/courtroom) -"tah" = ( -/obj/structure/cable, -/obj/machinery/door/airlock{ - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft) -"tat" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/dark_red/fourcorners, -/obj/machinery/computer/records/security, -/turf/open/floor/iron/smooth, -/area/station/security/checkpoint/customs) "tax" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -53799,10 +54988,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"tbM" = ( -/obj/effect/spawner/random/structure/closet_maintenance, -/turf/open/misc/asteroid, -/area/station/maintenance/fore/greater) "tbS" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -53935,19 +55120,15 @@ /obj/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"teq" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 6 +"tey" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/machinery/computer/records/security{ + dir = 4 }, -/obj/structure/table/glass, -/obj/item/book/codex_gigas, -/obj/item/camera{ - pixel_y = 18 +/turf/open/floor/iron/checker{ + dir = 1 }, -/obj/machinery/light/small/directional/east, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/grimy, -/area/station/service/library) +/area/station/security/execution/transfer) "teG" = ( /obj/structure/chair/sofa/bench{ dir = 4 @@ -54002,6 +55183,21 @@ /obj/effect/mapping_helpers/airlock/access/all/science/rd, /turf/open/floor/catwalk_floor/flat_white, /area/station/science/server) +"tfl" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Air to Pure" + }, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/engineering/atmos) "tfy" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/tile/red{ @@ -54009,6 +55205,11 @@ }, /turf/open/floor/iron/cafeteria, /area/station/hallway/secondary/exit/departure_lounge) +"tfC" = ( +/obj/structure/cable, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "tfE" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -54016,19 +55217,6 @@ /obj/item/clipboard, /turf/open/floor/iron/white/small, /area/station/science/server) -"tfH" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) -"tfL" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall, -/area/station/maintenance/starboard/central) "tgj" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/easel, @@ -54067,7 +55255,7 @@ /turf/open/floor/wood/tile, /area/station/command/heads_quarters/hop) "tgJ" = ( -/obj/machinery/atmospherics/components/unary/cryo_cell, +/obj/machinery/cryo_cell, /obj/effect/turf_decal/stripes/line{ dir = 4 }, @@ -54091,28 +55279,15 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/service/cafeteria) -"thf" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/closet/secure_closet/personal, -/obj/item/storage/backpack, -/obj/item/storage/backpack/satchel, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/winterboots, -/obj/machinery/light/small/directional/north, -/obj/effect/landmark/start/hangover/closet, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron, -/area/station/commons) -"thq" = ( -/obj/machinery/light/cold/directional/east, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/tile/red{ - dir = 4 +"the" = ( +/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/machinery/firealarm/directional/north, +/turf/open/floor/iron/white/side{ + dir = 1 }, -/turf/open/floor/iron/white/corner, -/area/station/hallway/secondary/exit/departure_lounge) +/area/station/science/research) "thv" = ( /obj/machinery/seed_extractor, /obj/effect/turf_decal/delivery, @@ -54123,6 +55298,12 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/textured_large, /area/station/service/hydroponics) +"thM" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/closet/secure_closet/miner, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "tii" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -54133,6 +55314,17 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/department/medical/central) +"tij" = ( +/obj/structure/flora/bush/large/style_random{ + pixel_x = -18; + pixel_y = 1 + }, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/turf_decal/siding/wideplating{ + dir = 4 + }, +/turf/open/misc/sandy_dirt, +/area/station/security/tram) "tiC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor, @@ -54152,6 +55344,7 @@ /obj/item/stack/ore/glass{ amount = 20 }, +/obj/structure/alien/weeds, /turf/open/misc/asteroid, /area/station/maintenance/starboard/greater) "tiQ" = ( @@ -54168,6 +55361,17 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/port/aft) +"tiZ" = ( +/obj/effect/turf_decal/delivery/red, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay" + }, +/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/access/all/medical/general, +/turf/open/floor/iron/white/small, +/area/station/medical/medbay/central) "tjb" = ( /obj/structure/sign/poster/official/random/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -54188,13 +55392,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/stone, /area/station/command/heads_quarters/hos) -"tko" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/security/execution/education) "tkp" = ( /obj/machinery/door/airlock/public/glass{ name = "Services Corridor" @@ -54208,6 +55405,12 @@ /obj/structure/barricade/wooden/crude, /turf/open/floor/plating, /area/station/maintenance/central/lesser) +"tkS" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/showroomfloor, +/area/station/commons/toilet/auxiliary) "tlh" = ( /obj/effect/spawner/structure/window, /obj/structure/sign/warning/cold_temp/directional/north, @@ -54250,12 +55453,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"tlZ" = ( -/obj/effect/turf_decal/tile/green/diagonal_centre, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron/diagonal, -/area/station/hallway/primary/central/aft) "tmc" = ( /obj/effect/turf_decal/tile/green/diagonal_centre, /obj/machinery/camera/autoname/directional/north, @@ -54349,19 +55546,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/central/lesser) -"tob" = ( -/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{ - name = "Auxillary Base Construction" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/aux_base, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/textured_half{ - dir = 8 - }, -/area/station/construction/mining/aux_base) "tod" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -54375,32 +55559,63 @@ "tof" = ( /turf/closed/wall/rust, /area/station/ai_monitored/turret_protected/ai) -"ton" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-entrance" +"toh" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 }, -/obj/machinery/door/airlock/maintenance{ - name = "Maintenance" +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/office{ + dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) +/turf/open/floor/wood/tile, +/area/station/tcommsat/server) "toA" = ( /turf/open/floor/iron, /area/station/hallway/secondary/recreation) -"toE" = ( -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 8 +"toC" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + 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/mail_sorting/science/xenobiology, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/white/side, -/area/station/science/lower) +/obj/structure/table/glass, +/obj/item/assembly/timer{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/assembly/igniter{ + pixel_x = 3; + pixel_y = -7 + }, +/obj/item/assembly/timer{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/assembly/igniter{ + pixel_x = 3; + pixel_y = -7 + }, +/obj/item/assembly/timer{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/assembly/igniter{ + pixel_x = 3; + pixel_y = -7 + }, +/obj/item/assembly/timer{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/assembly/igniter{ + pixel_x = 3; + pixel_y = -7 + }, +/obj/item/storage/pill_bottle/epinephrine{ + pixel_x = 8; + pixel_y = 5 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/medical/pharmacy) "toH" = ( /obj/machinery/door/poddoor{ id = "pubminingdoor"; @@ -54412,17 +55627,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/storage/tech) -"toJ" = ( -/obj/structure/hoop{ - dir = 4; - pixel_x = -10; - pixel_y = 11 - }, -/obj/effect/turf_decal/trimline/white/end{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/commons/fitness/recreation) "toL" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -54539,18 +55743,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/diagonal, /area/station/hallway/primary/central/aft) -"tqr" = ( -/obj/structure/hoop{ - dir = 8; - pixel_x = 10; - pixel_y = 11 - }, -/obj/effect/turf_decal/trimline/white/end{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/commons/fitness/recreation) "tqs" = ( /obj/structure/bodycontainer/morgue{ dir = 1 @@ -54558,33 +55750,25 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark/small, /area/station/medical/morgue) -"tqt" = ( -/obj/effect/turf_decal/tile/green/diagonal_centre, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/camera/autoname/directional/north, -/obj/structure/sign/warning/no_smoking/circle/directional/north, -/turf/open/floor/iron/diagonal, -/area/station/hallway/primary/central/aft) "tqz" = ( /obj/structure/sign/poster/official/random/directional/north, /obj/effect/turf_decal/tile/green/diagonal_centre, /turf/open/floor/iron/diagonal, /area/station/hallway/primary/central/aft) -"tqB" = ( -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/machinery/light_switch/directional/south, -/obj/machinery/light/dim/directional/west, -/turf/open/floor/iron/white, -/area/station/science/cytology) "tqD" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/ai_upload) +"tqE" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/shuttle/mining{ + dir = 4 + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "tqF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -54610,6 +55794,11 @@ }, /turf/open/floor/engine, /area/station/science/cytology) +"tqW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/navigate_destination/dockaux, +/turf/open/floor/iron, +/area/station/hallway/secondary/dock) "tqX" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -54629,6 +55818,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer1, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"trk" = ( +/obj/effect/turf_decal/bot, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/door/window/right/directional/south{ + name = "Command Deliveries"; + req_access = list("command") + }, +/turf/open/floor/wood/tile, +/area/station/command/corporate_showroom) "tro" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/smooth, @@ -54636,6 +55834,15 @@ "trp" = ( /turf/closed/wall, /area/station/maintenance/port/aft) +"trz" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/status_display/ai/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "trI" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -54643,28 +55850,18 @@ /obj/structure/sign/warning/directional/north, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"trK" = ( -/obj/effect/turf_decal/siding/dark_red{ - dir = 4 - }, -/obj/structure/rack, -/obj/item/gun/energy/e_gun{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/gun/energy/e_gun, -/obj/item/gun/energy/e_gun{ - pixel_x = 3; - pixel_y = -3 - }, -/turf/open/floor/iron/dark/small, -/area/station/ai_monitored/security/armory) "trS" = ( /obj/effect/decal/cleanable/glass, /obj/structure/grille, /obj/item/shard, /turf/open/floor/plating, /area/station/commons/storage/tools) +"tsb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line, +/obj/structure/sign/departments/aiupload/directional/south, +/turf/open/floor/iron/white, +/area/station/hallway/primary/starboard) "tsf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -54744,6 +55941,14 @@ }, /turf/open/floor/iron/white/small, /area/station/security/execution/education) +"tuk" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/structure/chair/sofa/bench/right{ + dir = 4 + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron, +/area/station/security/processing) "tux" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -54754,6 +55959,7 @@ /obj/effect/turf_decal/siding/wideplating/dark{ dir = 1 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/security) "tuE" = ( @@ -54761,12 +55967,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/server) -"tuO" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/sign/warning/no_smoking/circle/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "tuP" = ( /obj/machinery/light/small/directional/east, /obj/item/kirbyplants/random, @@ -54782,11 +55982,6 @@ "tuT" = ( /turf/closed/wall, /area/station/hallway/secondary/entry) -"tuU" = ( -/obj/machinery/hydroponics/constructable, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/iron/white/small, -/area/station/service/hydroponics/garden) "tuW" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark/smooth_large, @@ -54794,6 +55989,13 @@ "tuZ" = ( /turf/closed/wall, /area/station/security/brig/entrance) +"tvg" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/modular_computer/preset/cargochat/medical{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) "tvM" = ( /obj/structure/flora/bush/fullgrass/style_random, /obj/structure/flora/bush/flowers_br/style_random, @@ -54803,20 +56005,24 @@ }, /turf/open/misc/sandy_dirt, /area/station/security/tram) +"tvN" = ( +/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/cable, +/turf/open/floor/iron, +/area/station/cargo/storage) "tvP" = ( /obj/machinery/suit_storage_unit/captain, /obj/machinery/light/small/directional/south, /obj/machinery/camera/autoname/directional/east, /turf/open/floor/carpet/executive, /area/station/command/heads_quarters/captain/private) -"tvS" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "tvZ" = ( /obj/effect/spawner/random/trash, +/obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/lesser) "twf" = ( @@ -54832,13 +56038,6 @@ }, /turf/open/space/basic, /area/space/nearstation) -"twh" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/stack/sheet/mineral/sandstone, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "twi" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -54879,19 +56078,6 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/small, /area/station/security/tram) -"twz" = ( -/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/siding/red{ - dir = 6 - }, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/iron/white/small, -/area/station/security/warden) "twC" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -54932,8 +56118,12 @@ /turf/open/floor/iron/small, /area/station/hallway/primary/central/fore) "twN" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid, +/obj/machinery/door/airlock{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/structure/cable, +/turf/open/floor/plating/rust, /area/station/maintenance/fore/greater) "twR" = ( /obj/structure/table/glass, @@ -54964,12 +56154,6 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/white, /area/station/hallway/primary/starboard) -"txp" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "txN" = ( /turf/closed/wall, /area/station/security/prison/workout) @@ -55014,10 +56198,6 @@ /obj/effect/mapping_helpers/airlock/access/all/command/captain, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_command) -"tyv" = ( -/obj/machinery/lapvend, -/turf/open/floor/iron/white, -/area/station/hallway/primary/starboard) "tyx" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -55034,6 +56214,18 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/cargo/drone_bay) +"tyY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/science/ordnance/testlab) +"tzo" = ( +/obj/structure/alien/egg/burst, +/obj/structure/alien/weeds, +/turf/open/misc/asteroid, +/area/station/maintenance/starboard/greater) "tzq" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -55052,6 +56244,16 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) +"tzx" = ( +/obj/effect/turf_decal/siding/dark_red/corner, +/obj/structure/rack, +/obj/item/gun/energy/temperature/security, +/obj/item/gun/energy/ionrifle{ + pixel_y = 3 + }, +/obj/item/clothing/suit/hooded/ablative, +/turf/open/floor/iron/dark/small, +/area/station/ai_monitored/security/armory) "tzz" = ( /obj/structure/disposalpipe/trunk, /obj/structure/window/spawner/directional/south, @@ -55064,27 +56266,12 @@ }, /turf/open/floor/plating, /area/station/science/lobby) -"tzB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron, -/area/station/hallway/secondary/dock) "tzD" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/structure/table, -/obj/item/restraints/legcuffs/beartrap{ - pixel_x = 8; - pixel_y = 13 - }, -/obj/item/flashlight{ - pixel_y = 4 +/obj/machinery/conveyor{ + dir = 8; + id = "garbage" }, -/obj/machinery/light/cold/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/small, +/turf/open/floor/plating, /area/station/service/janitor) "tzF" = ( /obj/structure/cable, @@ -55140,6 +56327,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet/lone, /area/station/service/chapel/office) +"tAx" = ( +/obj/effect/turf_decal/trimline/blue/corner, +/obj/structure/table/glass, +/obj/machinery/firealarm/directional/east, +/obj/item/storage/pill_bottle/mannitol{ + pixel_x = 8; + pixel_y = 6 + }, +/obj/item/book/manual/wiki/medicine{ + pixel_x = -5; + pixel_y = 2 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "tAE" = ( /obj/structure/table, /obj/effect/spawner/random/engineering/flashlight, @@ -55152,19 +56353,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"tAI" = ( -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/end{ - dir = 4 - }, -/obj/machinery/light/dim/directional/north, -/turf/open/floor/iron/white/small, -/area/station/service/janitor) "tAP" = ( /obj/effect/landmark/blobstart, /turf/open/floor/iron/dark/small, @@ -55201,6 +56389,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/cargo/sorting) +"tBi" = ( +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 4 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/iron, +/area/station/security/courtroom) "tBm" = ( /obj/machinery/hydroponics/soil, /turf/open/floor/grass, @@ -55251,19 +56446,12 @@ dir = 1 }, /area/station/commons) -"tCg" = ( -/obj/effect/turf_decal/arrows{ - dir = 8 - }, -/turf/open/floor/iron/small, -/area/station/hallway/secondary/exit/departure_lounge) -"tCh" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark/small, -/area/station/security/brig) +"tBO" = ( +/obj/structure/cable, +/obj/structure/chair/stool/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/security/prison/workout) "tCk" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -55286,22 +56474,6 @@ }, /turf/open/floor/iron/solarpanel/airless, /area/station/solars/starboard/aft) -"tCx" = ( -/obj/structure/table, -/obj/machinery/cell_charger{ - pixel_y = 18 - }, -/obj/item/stock_parts/cell/high{ - pixel_y = 18 - }, -/obj/item/clothing/suit/hazardvest, -/obj/effect/turf_decal/siding/thinplating_new/terracotta{ - dir = 4 - }, -/obj/machinery/light/cold/directional/west, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron, -/area/station/command/teleporter) "tCz" = ( /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/white, @@ -55408,6 +56580,16 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"tEt" = ( +/obj/structure/table, +/obj/item/storage/box/bodybags{ + pixel_x = 4; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron, +/area/station/security/tram) "tEI" = ( /mob/living/simple_animal/hostile/retaliate/goose/vomit, /turf/open/floor/wood/tile, @@ -55431,6 +56613,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"tEU" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden/monastery) "tEW" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -55441,29 +56630,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"tFg" = ( -/obj/structure/disposalpipe/sorting/mail{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/mail_sorting/service/hydroponics, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"tFn" = ( -/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, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/simple/dark/hidden{ - dir = 9 - }, -/turf/open/floor/iron/dark, -/area/station/tcommsat/server) "tFs" = ( /obj/structure/table/glass, /obj/item/storage/medkit/regular{ @@ -55517,28 +56683,6 @@ "tFQ" = ( /turf/closed/wall, /area/station/medical/medbay/central) -"tFS" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/research{ - name = "Development Division Access" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-entrance" - }, -/obj/effect/mapping_helpers/airlock/access/all/science/general, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white/textured_half{ - dir = 1 - }, -/area/station/science/lobby) -"tFX" = ( -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/obj/machinery/light/cold/directional/west, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron, -/area/station/medical/chemistry) "tFY" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -55550,10 +56694,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"tGe" = ( -/obj/structure/reagent_dispensers/cooking_oil, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) "tGp" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/engine, @@ -55569,6 +56709,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/tcommsat/server) +"tGJ" = ( +/obj/effect/turf_decal/tile/dark_red/fourcorners, +/obj/machinery/computer/records/security, +/turf/open/floor/iron/smooth, +/area/station/security/checkpoint/customs) "tGU" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/tile/blue, @@ -55588,6 +56733,12 @@ /obj/machinery/duct, /turf/open/floor/catwalk_floor/flat_white, /area/station/service/kitchen/coldroom) +"tHp" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/security/tram) "tHK" = ( /turf/closed/wall, /area/station/security/prison/shower) @@ -55613,18 +56764,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"tIu" = ( -/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/machinery/light/small/directional/south, -/obj/machinery/status_display/ai/directional/south, -/obj/effect/turf_decal/tile/green/diagonal_centre, -/turf/open/floor/iron/diagonal, -/area/station/hallway/primary/central/aft) "tIz" = ( /obj/structure/chair/wood{ dir = 8 @@ -55642,6 +56781,9 @@ /obj/effect/turf_decal/tile/green/diagonal_centre, /turf/open/floor/iron/diagonal, /area/station/hallway/primary/central/aft) +"tIE" = ( +/turf/closed/wall/mineral/titanium, +/area/station/commons/fitness/recreation/entertainment) "tII" = ( /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, @@ -55727,6 +56869,10 @@ /obj/effect/turf_decal/tile/green/diagonal_centre, /turf/open/floor/iron/diagonal, /area/station/hallway/primary/central/aft) +"tJN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "tJO" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /obj/machinery/atmospherics/pipe/smart/simple/brown/visible, @@ -55747,15 +56893,6 @@ /obj/structure/closet/emcloset, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"tKk" = ( -/obj/machinery/portable_atmospherics/canister, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/science/xenobiology) "tKl" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -55770,17 +56907,6 @@ /obj/effect/turf_decal/tile/green/diagonal_centre, /turf/open/floor/iron/diagonal, /area/station/hallway/primary/central/aft) -"tKy" = ( -/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/small/directional/south, -/obj/machinery/status_display/ai/directional/south, -/obj/effect/turf_decal/tile/green/diagonal_centre, -/turf/open/floor/iron/diagonal, -/area/station/hallway/primary/central/aft) "tKC" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -55791,20 +56917,6 @@ /obj/effect/turf_decal/tile/green/diagonal_centre, /turf/open/floor/iron/diagonal, /area/station/hallway/primary/central/aft) -"tKD" = ( -/obj/structure/flora/bush/large/style_random{ - pixel_x = -18; - pixel_y = 1 - }, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/turf_decal/siding/wideplating{ - dir = 4 - }, -/obj/machinery/light/floor{ - pixel_x = 32 - }, -/turf/open/misc/sandy_dirt, -/area/station/security/tram) "tKG" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/mapping_helpers/broken_floor, @@ -55942,6 +57054,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"tMS" = ( +/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/dark_red/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "tNc" = ( /turf/open/floor/wood/parquet, /area/station/service/theater) @@ -55964,6 +57086,19 @@ /obj/machinery/holopad, /turf/open/floor/iron, /area/station/science/robotics/lab) +"tNw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/directional/west{ + c_tag = "Xenobiology - Cell 4"; + network = list("ss13","rd","xeno") + }, +/obj/effect/turf_decal/box/red/corners, +/obj/effect/turf_decal/stripes/white/line{ + dir = 6 + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/engine, +/area/station/science/xenobiology) "tNz" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -56002,6 +57137,10 @@ }, /turf/open/floor/plating, /area/station/commons/vacant_room/commissary) +"tNT" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/kitchen/small, +/area/station/maintenance/aft) "tOk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -56019,6 +57158,14 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"tOO" = ( +/obj/structure/flora/bush/large/style_random{ + pixel_x = -20; + pixel_y = -16 + }, +/obj/machinery/light/small/directional/west, +/turf/open/misc/sandy_dirt, +/area/station/service/lawoffice) "tOX" = ( /obj/structure/cable, /obj/machinery/firealarm/directional/east, @@ -56036,6 +57183,14 @@ }, /turf/open/floor/iron/white, /area/station/hallway/primary/starboard) +"tPd" = ( +/obj/structure/chair/sofa/left/maroon{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/showroomfloor, +/area/station/service/cafeteria) "tPf" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark, @@ -56063,24 +57218,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/hallway/primary/starboard) -"tPY" = ( +"tPZ" = ( +/obj/machinery/netpod, +/obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, -/obj/effect/turf_decal/trimline/white/warning{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/white/warning{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/white/mid_joiner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/white/mid_joiner{ - dir = 8 - }, -/obj/item/radio/intercom/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/commons/fitness/recreation) +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/bitrunning/den) "tQx" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/reagent_dispensers/fueltank, @@ -56120,6 +57263,28 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) +"tRh" = ( +/obj/structure/chair{ + dir = 8; + name = "Judge" + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron, +/area/station/security/courtroom) +"tRp" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Door" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "holodeck" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "tRw" = ( /obj/structure/disposalpipe/trunk{ dir = 8 @@ -56145,12 +57310,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/white, /area/station/maintenance/central/greater) -"tRV" = ( -/obj/effect/turf_decal/trimline/white/line, -/obj/effect/turf_decal/trimline/white/mid_joiner, -/obj/machinery/light/dim/directional/south, -/turf/open/floor/wood, -/area/station/commons/fitness/recreation) "tSe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/stripes/line{ @@ -56200,6 +57359,12 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/white, /area/station/hallway/primary/starboard) +"tSv" = ( +/obj/effect/decal/cleanable/glass, +/obj/structure/chair/stool/directional/east, +/obj/machinery/light/small/broken/directional/west, +/turf/open/floor/eighties, +/area/station/service/abandoned_gambling_den/gaming) "tSB" = ( /obj/structure/cable, /obj/structure/table/reinforced, @@ -56259,6 +57424,19 @@ /obj/machinery/light/very_dim/directional/east, /turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) +"tTG" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/flora/bush/flowers_pp/style_random, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden/monastery) +"tTR" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/turf/open/floor/plating, +/area/station/engineering/atmos) "tTW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56304,6 +57482,16 @@ dir = 1 }, /area/station/hallway/primary/starboard) +"tUg" = ( +/obj/structure/cable, +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/siding/thinplating_new/terracotta{ + dir = 4 + }, +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room) "tUo" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -56407,15 +57595,17 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"tWr" = ( -/obj/machinery/light/dim/directional/east, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/iron/dark/side{ - dir = 8 +"tWw" = ( +/obj/item/kirbyplants/organic/applebush, +/obj/effect/turf_decal/siding/white{ + dir = 1 }, -/area/station/science/lab) +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/smooth, +/area/station/command/corporate_showroom) "tWx" = ( /obj/effect/turf_decal/caution{ dir = 4 @@ -56436,15 +57626,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/cafeteria, /area/station/science/breakroom) -"tWK" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/obj/machinery/status_display/ai/directional/north, -/turf/open/floor/iron/cafeteria, -/area/station/science/breakroom) "tWL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/blue{ @@ -56462,16 +57643,11 @@ dir = 1 }, /area/station/hallway/secondary/exit/departure_lounge) -"tWS" = ( -/obj/structure/bookcase/random/reference, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/white/small, -/area/station/medical/psychology) -"tXp" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/iron/white/corner, -/area/station/science/xenobiology) +"tXl" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/table/bronze, +/turf/open/floor/wood/tile, +/area/station/maintenance/port/lesser) "tXw" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -56479,6 +57655,19 @@ /obj/structure/broken_flooring/singular/directional/east, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"tXG" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"tXK" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/vending/wardrobe/atmos_wardrobe, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "tXP" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/green/opposingcorners{ @@ -56579,6 +57768,27 @@ /obj/machinery/chem_master, /turf/open/floor/iron, /area/station/medical/chemistry) +"tZp" = ( +/obj/structure/table, +/obj/item/stock_parts/matter_bin{ + pixel_x = -4; + pixel_y = 13 + }, +/obj/item/storage/toolbox/emergency{ + pixel_x = 2; + pixel_y = -8 + }, +/obj/item/stock_parts/matter_bin{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/toolbox/emergency{ + pixel_x = 2; + pixel_y = -8 + }, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/fore/lesser) "tZt" = ( /obj/machinery/light/small/broken{ dir = 4 @@ -56655,6 +57865,11 @@ /obj/structure/flora/tree/stump, /turf/open/floor/grass, /area/station/service/hydroponics/garden/monastery) +"uav" = ( +/obj/structure/chair/stool/directional/west, +/obj/structure/sign/poster/random/directional/south, +/turf/open/floor/wood, +/area/station/maintenance/port/fore) "uax" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56690,6 +57905,14 @@ }, /turf/open/floor/iron/dark, /area/station/science/genetics) +"ubb" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 8 + }, +/obj/machinery/firealarm/directional/east, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/lobby) "ubf" = ( /obj/effect/landmark/start/assistant, /obj/effect/turf_decal/trimline/neutral/line{ @@ -56699,11 +57922,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"ubq" = ( -/obj/machinery/flasher/portable, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/security/tram) "uby" = ( /turf/closed/wall, /area/station/security/prison/garden) @@ -56723,18 +57941,25 @@ dir = 1 }, /area/station/hallway/primary/central/fore) -"ubU" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/maintenance{ - name = "Maintenance" +"ubT" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-entrance" +/obj/structure/hedge, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/any/security/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/lesser) +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"ubV" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/recharge_station, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) "uch" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -56794,6 +58019,13 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/security/prison/shower) +"ucV" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/wood/tile, +/area/station/service/bar) "ucY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -56893,19 +58125,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"udU" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/service) -"udW" = ( -/obj/machinery/firealarm/directional/north, -/obj/item/kirbyplants/random/fullysynthetic, -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/turf/open/floor/iron, -/area/station/security/tram) "udZ" = ( /obj/structure/chair/sofa/bench/left{ dir = 8 @@ -56927,6 +58146,19 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) +"uer" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/obj/structure/table, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/construction/plumbing, +/turf/open/floor/iron, +/area/station/medical/chemistry) "ueC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56934,6 +58166,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/smooth, /area/station/command/bridge) +"ueD" = ( +/obj/structure/cable, +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/engineering/gravity_generator) "ueG" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -56943,12 +58184,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) -"ueR" = ( -/obj/structure/table, -/obj/machinery/chem_dispenser/drinks, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "ueX" = ( /turf/closed/wall/rust, /area/station/maintenance/port/fore) @@ -56969,11 +58204,6 @@ "ufn" = ( /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"ufu" = ( -/obj/machinery/light/cold/directional/north, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "ufE" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -57006,6 +58236,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/prison/garden) +"ugb" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/engineering/break_room) "uge" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -57103,8 +58339,13 @@ /obj/effect/turf_decal/siding/white{ dir = 8 }, +/obj/machinery/iv_drip, /turf/open/floor/iron/small, /area/station/medical/morgue) +"uhq" = ( +/obj/structure/chair/bronze, +/turf/open/floor/wood/tile, +/area/station/maintenance/port/lesser) "uhu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/blue{ @@ -57129,12 +58370,6 @@ /obj/effect/landmark/start/clown, /turf/open/floor/stone, /area/station/service/theater) -"uhI" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/hallway/primary/starboard) "uhN" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/decal/cleanable/dirt, @@ -57145,13 +58380,6 @@ dir = 8 }, /area/station/hallway/secondary/dock) -"uhO" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 1 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/secondary/dock) "uhS" = ( /obj/structure/chair/sofa/bench/right{ dir = 1 @@ -57177,18 +58405,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark, /area/station/medical/medbay/central) -"uii" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/item/trash/popcorn/caramel{ - pixel_y = 5 - }, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/iron/grimy, -/area/station/service/theater) "uij" = ( /obj/docking_port/stationary{ dheight = 4; @@ -57253,13 +58469,6 @@ /obj/effect/turf_decal/trimline/neutral/line, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"ujl" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/white/small, -/area/station/service/janitor) "ujq" = ( /obj/structure/disposalpipe/segment, /obj/structure/closet/emcloset, @@ -57304,14 +58513,16 @@ }, /turf/open/floor/iron/grimy, /area/station/tcommsat/server) -"ukz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/white/side{ - dir = 1 +"uku" = ( +/obj/machinery/computer/crew{ + dir = 8 }, -/area/station/science/research) +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light_switch/directional/south, +/obj/machinery/camera/autoname/directional/east, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "ukB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -57319,15 +58530,6 @@ /obj/machinery/holopad, /turf/open/floor/iron, /area/station/engineering/storage/tech) -"ukG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/cold/directional/north, -/obj/machinery/status_display/ai/directional/north, -/turf/open/floor/iron/white/side{ - dir = 1 - }, -/area/station/science/research) "ukI" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -57355,6 +58557,12 @@ /area/station/security/checkpoint/science) "ukW" = ( /obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/iron/white/small, /area/station/service/janitor) "ulb" = ( @@ -57367,67 +58575,26 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/general, /turf/open/floor/iron/white/small, /area/station/medical/cryo) -"uld" = ( -/obj/item/kirbyplants/random, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/machinery/camera/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "ull" = ( /obj/machinery/light/cold/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"ulr" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/item/clipboard{ - pixel_x = 10; - pixel_y = 4 - }, -/obj/item/folder/red{ - pixel_x = 7 - }, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/iron, -/area/station/security/tram) -"ulI" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 1 +"ulq" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/kirbyplants/organic/applebush, +/obj/effect/turf_decal/siding/thinplating_new/terracotta{ + dir = 8 }, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/turf/open/floor/iron, -/area/station/security/tram) +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room) "ulK" = ( /obj/structure/cable, /obj/machinery/ntnet_relay, /obj/effect/decal/cleanable/dirt, /turf/open/floor/circuit, /area/station/tcommsat/server) -"ulL" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/showroomfloor, -/area/station/medical/surgery/theatre) -"ulM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/mineral/stacking_machine{ - input_dir = 2 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/white/small, -/area/station/service/janitor) "ulO" = ( /turf/open/floor/plating, /area/station/maintenance/department/medical/central) @@ -57466,11 +58633,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/central/lesser) -"umO" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/chair/stool/directional/south, -/turf/open/floor/light/colour_cycle/dancefloor_b, -/area/station/maintenance/starboard/central) "unc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -57486,12 +58648,6 @@ }, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs/auxiliary) -"unt" = ( -/obj/machinery/light/cold/directional/west, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "uny" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/duct, @@ -57502,8 +58658,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "unK" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, +/obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/station/maintenance/fore/greater) "unM" = ( @@ -57537,25 +58692,9 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/security/tram) -"uot" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/cold/directional/south, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/status_display/evac/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "uoB" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/captain/private) -"uoE" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/circuit, -/area/station/tcommsat/server) "uoM" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -57565,12 +58704,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/port) -"uoS" = ( -/obj/machinery/light/cold/directional/east, -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/security/processing) "uoW" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -57647,13 +58780,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/hallway/primary/starboard) -"upG" = ( -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 1 - }, -/obj/machinery/mechpad, -/turf/open/floor/iron/smooth_large, -/area/station/science/robotics/mechbay) "upP" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -57700,6 +58826,8 @@ /obj/effect/mapping_helpers/broken_floor, /obj/effect/spawner/random/trash, /obj/structure/broken_flooring/singular/directional/south, +/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/aft) "uqO" = ( @@ -57712,6 +58840,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"uqU" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/structure/trap/stun, +/obj/structure/alien/weeds, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) "urd" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -57814,18 +58949,6 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron, /area/station/hallway/secondary/spacebridge) -"usB" = ( -/obj/effect/turf_decal/delivery/red, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ - id_tag = "MedbayFoyer"; - name = "Medbay" - }, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/iron/white/small, -/area/station/medical/medbay/central) "usF" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/easel, @@ -57833,19 +58956,16 @@ /obj/item/canvas/twentythree_twentythree, /turf/open/floor/sepia, /area/station/maintenance/aft) -"usI" = ( -/obj/structure/table, -/obj/item/storage/box/bodybags{ - pixel_x = 4; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/station/security/tram) "usJ" = ( /turf/open/floor/iron/kitchen/small, /area/station/maintenance/aft) +"utg" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/landmark/navigate_destination/chapel, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "uth" = ( /obj/effect/turf_decal/plaque{ icon_state = "L2" @@ -57860,6 +58980,14 @@ /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron/white, /area/station/hallway/primary/starboard) +"uty" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/machinery/light/small/directional/east, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden/monastery) "utD" = ( /obj/machinery/light_switch/directional/west, /obj/effect/turf_decal/stripes/corner{ @@ -57869,6 +58997,18 @@ dir = 8 }, /area/station/hallway/secondary/construction) +"utF" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "Bridge Blast Door" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/command/meeting_room) "utH" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -57906,12 +59046,26 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"uug" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/security/prison/work) "uuh" = ( /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/dark/smooth_large, /area/station/service/lawoffice) +"uul" = ( +/obj/structure/disposalpipe/segment, +/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/iron/dark, +/area/station/service/lawoffice) "uuv" = ( /obj/effect/turf_decal/plaque{ icon_state = "L4" @@ -57936,6 +59090,20 @@ }, /turf/open/floor/iron/white/small, /area/station/medical/storage) +"uvh" = ( +/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/vault{ + name = "Vault" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/access/all/supply/vault, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/catwalk_floor, +/area/station/ai_monitored/command/nuke_storage) "uvu" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -57944,21 +59112,14 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"uvv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/wood, +/area/station/maintenance/fore/greater) "uvA" = ( /turf/closed/wall/r_wall, /area/station/command/gateway) -"uvJ" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/small, -/area/station/medical/medbay/lobby) "uwl" = ( /obj/effect/turf_decal/plaque{ icon_state = "L6" @@ -58000,17 +59161,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/fore/greater) -"uwS" = ( -/obj/structure/chair{ - name = "Defense" - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/station/security/courtroom) "uwU" = ( /obj/structure/closet/secure_closet/hydroponics, /obj/effect/turf_decal/bot, @@ -58036,24 +59186,11 @@ }, /turf/open/floor/glass, /area/station/hallway/secondary/spacebridge) -"uxD" = ( -/obj/effect/turf_decal/siding/dark_red{ - dir = 6 - }, -/obj/machinery/pdapainter/security, +"uxk" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/cold/directional/south, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/stone, -/area/station/command/heads_quarters/hos) -"uxG" = ( -/obj/structure/table, -/obj/item/clothing/gloves/color/orange, -/obj/item/restraints/handcuffs, -/obj/item/reagent_containers/spray/pepper, -/obj/machinery/light/cold/directional/west, +/obj/machinery/light/small/directional/west, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/commons) "uxJ" = ( /obj/machinery/smartfridge/chemistry/preloaded, /obj/machinery/door/firedoor, @@ -58066,6 +59203,7 @@ /area/station/medical/pharmacy) "uxL" = ( /obj/structure/broken_flooring/pile/directional/east, +/obj/structure/trap/stun, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "uya" = ( @@ -58118,17 +59256,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) -"uyO" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/cold/directional/south, -/obj/machinery/status_display/ai/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "uyZ" = ( /obj/structure/closet{ name = "Evidence Closet 4" @@ -58221,9 +59348,8 @@ /turf/open/floor/wood/tile, /area/station/service/bar) "uAH" = ( -/obj/structure/bed/pod{ - desc = "An old medical bed, just waiting for replacement with something up to date."; - name = "medical bed" +/obj/structure/bed/medical{ + dir = 4 }, /obj/effect/turf_decal/tile/blue/fourcorners, /obj/item/bedsheet/medical, @@ -58299,6 +59425,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/stairs, /area/station/engineering/storage/tech) +"uBQ" = ( +/obj/structure/table/bronze, +/obj/machinery/microwave{ + pixel_y = 5 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/captain/private) "uBY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/side, @@ -58320,6 +59454,12 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/smooth_large, /area/station/service/bar) +"uCo" = ( +/obj/structure/window/spawner/directional/south, +/obj/structure/flora/bush/jungle/a/style_random, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/misc/sandy_dirt, +/area/station/commons) "uCp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/firealarm/directional/south, @@ -58344,15 +59484,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood, /area/station/service/theater) -"uCO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/cold/directional/south, -/obj/machinery/status_display/ai/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "uDg" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -58379,12 +59510,13 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/lockers) -"uDE" = ( -/obj/structure/cable, -/obj/item/kirbyplants/random, -/obj/machinery/light/dim/directional/south, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/maintenance/port/aft) +"uDw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/turf/open/floor/iron/smooth_large, +/area/station/science/auxlab/firing_range) "uDF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -58420,21 +59552,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet/lone, /area/station/service/theater) -"uEs" = ( -/obj/effect/turf_decal/trimline/blue/corner, +"uEh" = ( /obj/structure/table/glass, -/obj/machinery/light/cold/directional/east, -/obj/machinery/firealarm/directional/east, -/obj/item/storage/pill_bottle/mannitol{ - pixel_x = 8; - pixel_y = 6 - }, -/obj/item/book/manual/wiki/medicine{ - pixel_x = -5; - pixel_y = 2 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) +/obj/effect/turf_decal/siding/wood, +/obj/effect/mapping_helpers/broken_floor, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/stone, +/area/station/command/corporate_suite) "uEw" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -58445,12 +59569,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/catwalk_floor/flat_white, /area/station/science/robotics/augments) -"uEy" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/carpet/lone, -/area/station/service/theater) "uEC" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/effect/turf_decal/box/red/corners{ @@ -58461,14 +59579,6 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) -"uEG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/cold/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "uEI" = ( /obj/structure/flora/bush/lavendergrass/style_random, /obj/structure/window/reinforced/spawner/directional/west, @@ -58490,11 +59600,29 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"uES" = ( +/obj/machinery/door/window/brigdoor/right/directional/west{ + id = "Cell 3"; + name = "Cell 3"; + req_access = list("security") + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark/small, +/area/station/security/brig) "uEV" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/department/engine) +"uFc" = ( +/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/plating, +/area/station/maintenance/starboard/aft) "uFk" = ( /obj/structure/flora/rock/pile/jungle/style_random, /obj/structure/window/reinforced/spawner/directional/east, @@ -58516,12 +59644,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"uFs" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/table/glass, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/white/small, -/area/station/medical/psychology) "uFw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor, @@ -58564,20 +59686,6 @@ /obj/structure/window/spawner/directional/south, /turf/open/floor/plating, /area/station/service/chapel/funeral) -"uFV" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 4 - }, -/obj/structure/closet/crate/bin, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"uFZ" = ( -/obj/structure/closet/firecloset, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/aft) "uGj" = ( /obj/effect/turf_decal/tile/green/half/contrasted, /obj/structure/table/glass, @@ -58595,6 +59703,11 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_command) +"uGp" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/warning/no_smoking/circle/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "uGA" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -58669,6 +59782,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, +/obj/structure/cable, /turf/open/floor/iron/white/side, /area/station/science/research) "uGX" = ( @@ -58710,6 +59824,12 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) +"uHv" = ( +/obj/structure/rack, +/obj/item/pipe_dispenser, +/obj/item/assault_pod/mining, +/turf/open/floor/iron, +/area/station/construction/mining/aux_base) "uHF" = ( /obj/machinery/atmospherics/pipe/layer_manifold/supply/visible, /obj/machinery/door/airlock{ @@ -58743,6 +59863,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/small, /area/station/science/ordnance/storage) +"uIj" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore/lesser) "uIn" = ( /obj/structure/window/spawner/directional/west, /obj/structure/window/spawner/directional/east, @@ -58796,6 +59922,24 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/port) +"uJG" = ( +/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/wood, +/area/station/maintenance/fore/greater) +"uJR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/showroomfloor, +/area/station/commons/toilet/auxiliary) +"uJZ" = ( +/obj/structure/window/reinforced/shuttle, +/obj/structure/window/reinforced/shuttle, +/turf/open/floor/plating, +/area/station/commons/fitness/recreation/entertainment) "uKl" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -58845,26 +59989,6 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/wood, /area/station/command/heads_quarters/qm) -"uKV" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/secondary/spacebridge) -"uLb" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ - dir = 8 - }, -/obj/structure/sign/warning/cold_temp/directional/north, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"uLd" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/r_wall, -/area/station/service/abandoned_gambling_den/gaming) "uLf" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/landmark/atmospheric_sanity/ignore_area, @@ -58886,44 +60010,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/spacebridge) -"uLq" = ( -/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/dark_red/half/contrasted{ - dir = 8 - }, -/obj/machinery/light/cold/directional/east, -/obj/structure/table, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/iron, -/area/station/security/execution/transfer) "uLu" = ( /obj/machinery/status_display/ai/directional/south, /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron, /area/station/hallway/secondary/spacebridge) -"uLE" = ( -/obj/effect/turf_decal/siding/dark_red/corner{ - dir = 8 - }, -/obj/item/grenade/barrier{ - pixel_x = 11; - pixel_y = 17 - }, -/obj/item/grenade/barrier{ - pixel_x = 2; - pixel_y = 11 - }, -/obj/item/grenade/barrier{ - pixel_x = 15; - pixel_y = 7 - }, -/obj/machinery/light/cold/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/dark/small, -/area/station/ai_monitored/security/armory) "uLO" = ( /obj/item/stack/sheet/cardboard{ amount = 14 @@ -58947,16 +60038,8 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/hallway/secondary/service) -"uMk" = ( -/obj/machinery/light/cold/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/dark/small, -/area/station/service/chapel/storage) "uMl" = ( -/obj/machinery/atmospherics/components/unary/cryo_cell, +/obj/machinery/cryo_cell, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -59048,13 +60131,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs) -"uNk" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/obj/structure/sign/departments/vault/directional/south, -/turf/open/floor/iron, -/area/station/hallway/secondary/spacebridge) "uNn" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, @@ -59088,13 +60164,6 @@ }, /turf/open/floor/iron/white/corner, /area/station/hallway/primary/aft) -"uOd" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/obj/structure/sign/departments/vault/directional/south, -/turf/open/floor/iron, -/area/station/hallway/secondary/spacebridge) "uOh" = ( /obj/structure/chair{ dir = 1; @@ -59124,16 +60193,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"uPp" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/cold/directional/west, -/obj/machinery/status_display/ai/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) "uPr" = ( /obj/structure/weightmachine/weightlifter, /obj/effect/turf_decal/bot, @@ -59185,6 +60244,12 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, /area/station/medical/pharmacy) +"uQf" = ( +/obj/structure/bed/medical/emergency, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/lobby) "uQi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/firedoor, @@ -59219,6 +60284,11 @@ }, /turf/open/floor/iron/white/side, /area/station/hallway/primary/starboard) +"uQR" = ( +/obj/machinery/exodrone_launcher, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/smooth, +/area/station/cargo/drone_bay) "uRe" = ( /obj/structure/reagent_dispensers/water_cooler, /obj/effect/turf_decal/tile/red{ @@ -59256,17 +60326,6 @@ /obj/item/stack/sheet/mineral/titanium, /turf/open/floor/noslip/tram_platform, /area/station/security/tram) -"uRx" = ( -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/machinery/disposal/bin, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/cafeteria, -/area/station/hallway/secondary/exit/departure_lounge) "uRF" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -59277,6 +60336,12 @@ }, /turf/open/floor/iron/dark/small, /area/station/security/execution/education) +"uRR" = ( +/obj/structure/table, +/obj/item/plant_analyzer, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/security/prison/garden) "uRW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59291,10 +60356,6 @@ /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, /area/station/service/hydroponics/garden/monastery) -"uSb" = ( -/obj/machinery/skill_station, -/turf/open/floor/wood/parquet, -/area/station/service/library) "uSi" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59313,6 +60374,15 @@ }, /turf/open/floor/iron/smooth, /area/station/command/heads_quarters/qm) +"uSB" = ( +/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/airalarm/directional/west, +/obj/structure/cable, +/obj/effect/landmark/navigate_destination/tcomms, +/turf/open/floor/iron, +/area/station/science/lower) "uSC" = ( /turf/closed/wall/mineral/wood/nonmetal, /area/station/service/hydroponics/garden/monastery) @@ -59323,14 +60393,6 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/iron/smooth, /area/station/command/heads_quarters/qm) -"uSH" = ( -/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, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/white/small, -/area/station/science/cubicle) "uSI" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/wood, @@ -59368,15 +60430,6 @@ /obj/effect/landmark/start/botanist, /turf/open/floor/iron, /area/station/service/hydroponics) -"uTk" = ( -/obj/machinery/vending/hydroseeds{ - slogan_delay = 700 - }, -/obj/effect/turf_decal/delivery/white{ - color = "#52B4E9" - }, -/turf/open/floor/iron/white/small, -/area/station/service/hydroponics) "uTA" = ( /turf/closed/wall, /area/station/ai_monitored/turret_protected/ai) @@ -59406,18 +60459,6 @@ }, /turf/open/floor/iron/dark/small, /area/station/science/xenobiology) -"uTT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/dark_red/half/contrasted{ - dir = 8 - }, -/obj/machinery/light/cold/directional/east, -/obj/effect/turf_decal/siding/wideplating/dark/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security) "uUb" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -59492,16 +60533,6 @@ /obj/machinery/newscaster/directional/east, /turf/open/floor/iron, /area/station/service/hydroponics) -"uUV" = ( -/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/dark_red/half/contrasted, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/iron, -/area/station/security) "uVb" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, @@ -59550,6 +60581,13 @@ /obj/item/food/cake/apple, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) +"uVO" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/broken_floor, +/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/aft) "uVT" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/hop) @@ -59567,6 +60605,11 @@ }, /turf/closed/wall, /area/station/hallway/primary/starboard) +"uWg" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "uWl" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -59575,6 +60618,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/science/robotics/augments) +"uWn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/hallway/primary/starboard) "uWo" = ( /turf/closed/wall, /area/station/medical/paramedic) @@ -59717,6 +60767,20 @@ /obj/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/central/lesser) +"uYx" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/layer_manifold/brown/visible, +/turf/open/floor/plating, +/area/station/engineering/atmos) +"uYy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/firealarm/directional/east, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "uYD" = ( /obj/structure/table, /obj/effect/turf_decal/tile/green/fourcorners, @@ -59758,20 +60822,6 @@ /obj/structure/broken_flooring/singular/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/dock) -"uYY" = ( -/obj/structure/cable, -/obj/structure/bed{ - dir = 4 - }, -/obj/item/bedsheet{ - dir = 1 - }, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/siding/red{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/security/medical) "uZb" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -59788,15 +60838,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/security/courtroom) -"uZt" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/structure/flora/bush/flowers_pp/style_random, -/obj/machinery/light/directional/east, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) "uZA" = ( /obj/structure/chair{ dir = 1; @@ -59836,15 +60877,17 @@ /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron/white, /area/station/hallway/primary/starboard) -"vaj" = ( -/obj/machinery/destructive_scanner, -/turf/open/floor/iron/white, -/area/station/hallway/primary/starboard) "vav" = ( /obj/structure/lattice, /obj/structure/railing, /turf/open/space/basic, /area/space/nearstation) +"vaF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/kirbyplants/organic/applebush, +/turf/open/floor/iron/smooth, +/area/station/hallway/secondary/command) "vba" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -59854,10 +60897,13 @@ }, /turf/open/floor/iron, /area/station/medical/chemistry) -"vbj" = ( -/obj/structure/table/glass, -/turf/open/floor/iron/white, -/area/station/science/auxlab/firing_range) +"vbf" = ( +/obj/structure/table, +/obj/effect/spawner/random/techstorage/ai_all, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron, +/area/station/engineering/storage/tech) "vbm" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -59905,6 +60951,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"vct" = ( +/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/effect/turf_decal/tile/neutral/half/contrasted, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark/side, +/area/station/science/xenobiology) "vcB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59977,6 +61033,16 @@ /obj/structure/railing/corner, /turf/open/space/basic, /area/space/nearstation) +"vdj" = ( +/obj/effect/turf_decal/tile/blue, +/obj/structure/filingcabinet/chestdrawer{ + pixel_y = 2 + }, +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/iron/dark/textured_edge{ + dir = 1 + }, +/area/station/command/heads_quarters/hop) "vdm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/broken_flooring/pile/directional/east, @@ -60112,6 +61178,12 @@ /obj/effect/landmark/start/station_engineer, /turf/open/floor/iron/small, /area/station/engineering/atmos) +"vfD" = ( +/obj/effect/turf_decal/siding/thinplating_new/light, +/obj/structure/reagent_dispensers/fueltank, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/smooth_large, +/area/station/science/robotics/mechbay) "vfK" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -60195,12 +61267,6 @@ /obj/item/gun/syringe, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/cmo) -"vgD" = ( -/obj/machinery/light/cold/directional/north, -/obj/structure/reagent_dispensers/wall/peppertank/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/dark, -/area/station/security/office) "vgN" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow/opposingcorners, @@ -60243,25 +61309,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/research) -"vhQ" = ( -/obj/effect/turf_decal/siding/white{ - dir = 8 - }, -/turf/open/floor/iron/small, -/area/station/medical/morgue) "vid" = ( /obj/structure/closet/emcloset, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) -"vie" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/structure/window/reinforced/tram/left/directional/west, -/obj/structure/chair/comfy/shuttle, -/obj/structure/industrial_lift/tram, -/turf/open/floor/noslip/tram_platform, -/area/station/security/tram) "vij" = ( /obj/structure/chair/comfy/black{ dir = 4 @@ -60292,13 +61343,6 @@ }, /turf/open/floor/iron/white, /area/station/science/research) -"viD" = ( -/obj/machinery/modular_computer/console/preset/cargochat/science{ - dir = 1 - }, -/obj/machinery/light/dim/directional/east, -/turf/open/floor/iron/white, -/area/station/science/research) "viK" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -60365,8 +61409,24 @@ /obj/structure/cable, /obj/effect/turf_decal/sand/plating, /obj/machinery/power/floodlight, +/obj/structure/alien/weeds, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"vjx" = ( +/obj/structure/table, +/obj/machinery/cell_charger{ + pixel_y = 18 + }, +/obj/item/stock_parts/cell/high{ + pixel_y = 18 + }, +/obj/item/clothing/suit/hazardvest, +/obj/effect/turf_decal/siding/thinplating_new/terracotta{ + dir = 4 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron, +/area/station/command/teleporter) "vjZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -60419,6 +61479,18 @@ }, /turf/open/floor/iron, /area/station/science/research) +"vkw" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 6 + }, +/obj/structure/fireaxecabinet/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "vkz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/siding/wood, @@ -60491,6 +61563,11 @@ /obj/structure/broken_flooring/singular/directional/east, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"vlj" = ( +/obj/item/kirbyplants/random, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "vln" = ( /obj/structure/cable, /obj/machinery/door/airlock{ @@ -60526,6 +61603,13 @@ "vlV" = ( /turf/closed/wall, /area/station/maintenance/aft) +"vlX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/chapel{ + dir = 4 + }, +/area/station/maintenance/starboard/greater) "vlY" = ( /obj/structure/chair/stool/bamboo{ dir = 8 @@ -60534,23 +61618,6 @@ /obj/item/radio/intercom/chapel/directional/west, /turf/open/floor/iron/terracotta/diagonal, /area/station/service/chapel/office) -"vmc" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) -"vmg" = ( -/obj/structure/table, -/obj/item/plant_analyzer, -/obj/item/healthanalyzer{ - pixel_x = 5 - }, -/obj/item/radio/intercom/directional/west, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron, -/area/station/engineering/storage/tech) "vmh" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60589,6 +61656,14 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"vmA" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "vmH" = ( /obj/machinery/door/morgue{ name = "Confession Booth (Chaplain)"; @@ -60598,6 +61673,12 @@ dir = 1 }, /area/station/service/chapel/office) +"vmJ" = ( +/obj/structure/cable, +/obj/machinery/holopad, +/obj/effect/turf_decal/siding/corner, +/turf/open/floor/iron/white, +/area/station/science/cytology) "vmL" = ( /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating/airless, @@ -60610,10 +61691,25 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/dark/small, /area/station/medical/chemistry) +"vmS" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/security/tram) "vmX" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/wood, /area/station/service/chapel/office) +"vna" = ( +/obj/machinery/atmospherics/components/tank/nitrous{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating/rust, +/area/station/engineering/atmos) "vnb" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -60664,6 +61760,19 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/service/chapel/office) +"vnq" = ( +/obj/structure/cable, +/obj/structure/bed/medical/anchored{ + dir = 8 + }, +/obj/item/bedsheet{ + dir = 1 + }, +/obj/effect/turf_decal/siding/red{ + dir = 9 + }, +/turf/open/floor/iron/white, +/area/station/security/medical) "vnr" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/wood, @@ -60708,11 +61817,25 @@ }, /turf/open/floor/catwalk_floor/iron_dark, /area/station/service/library) +"voe" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/machinery/digital_clock/directional/south, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/security/tram) "voh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/science/cytology) +"voj" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron, +/area/station/security/tram) "von" = ( /obj/structure/hedge, /turf/open/floor/wood, @@ -60722,6 +61845,29 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/iron/smooth, /area/station/commons/storage/tools) +"voF" = ( +/obj/structure/table, +/obj/machinery/chem_dispenser/drinks, +/obj/machinery/light/cold/directional/north, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"voJ" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/dark_red/half/contrasted{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/security) +"voL" = ( +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "voO" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -60729,37 +61875,6 @@ }, /turf/open/space/basic, /area/space/nearstation) -"voX" = ( -/obj/effect/turf_decal/siding/dark_red{ - dir = 4 - }, -/obj/structure/rack, -/obj/item/clothing/suit/armor/riot{ - pixel_x = 3; - 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_x = -3; - pixel_y = -2 - }, -/obj/item/shield/riot{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/shield/riot{ - pixel_x = 3; - pixel_y = -3 - }, -/turf/open/floor/iron/dark/small, -/area/station/ai_monitored/security/armory) "vpb" = ( /obj/machinery/door/airlock/hatch{ name = "Tool Supply Corridor" @@ -60807,10 +61922,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor/iron, /area/station/service/bar) -"vpQ" = ( -/obj/structure/sink/kitchen/directional/east, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "vpT" = ( /obj/structure/chair/sofa/bench{ dir = 1 @@ -60840,6 +61951,10 @@ /obj/effect/spawner/random/trash/graffiti{ pixel_y = -32 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "vql" = ( @@ -60874,28 +61989,6 @@ }, /turf/open/floor/catwalk_floor/iron_dark, /area/station/tcommsat/server) -"vra" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/clothing/under/rank/cargo/miner/lavaland{ - pixel_y = 3 - }, -/obj/item/clothing/suit/hooded/wintercoat/miner{ - pixel_y = 5 - }, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) -"vrd" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/box/red/corners{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 10 - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "vrf" = ( /obj/structure/hedge, /obj/machinery/light/small/directional/north, @@ -60986,6 +62079,24 @@ dir = 1 }, /area/station/hallway/secondary/dock) +"vsl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/status_display/ai/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"vso" = ( +/obj/effect/landmark/start/scientist, +/obj/structure/chair{ + dir = 4; + pixel_y = -2 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/white, +/area/station/science/research) "vsq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60994,26 +62105,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/stone, /area/station/service/theater) -"vss" = ( -/obj/machinery/firealarm/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "vsx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"vsC" = ( -/obj/effect/turf_decal/siding/dark_red, -/obj/item/storage/secure/safe/directional/north{ - name = "armory safe A" - }, -/turf/open/floor/iron/dark/small, -/area/station/ai_monitored/security/armory) "vsQ" = ( /obj/machinery/light_switch/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -61093,13 +62190,13 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/fore/greater) -"vug" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"vtV" = ( +/obj/machinery/power/smes/engineering, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron, -/area/station/hallway/secondary/recreation) +/obj/structure/cable, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) "vum" = ( /obj/structure/cable, /obj/machinery/firealarm/directional/north, @@ -61158,13 +62255,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"vuO" = ( -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/obj/structure/chair/sofa/bench/right{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/processing) "vuR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -61245,6 +62335,11 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"vwg" = ( +/obj/structure/bookcase/random/nonfiction, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood/tile, +/area/station/service/bar) "vwh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/airlock/public/glass{ @@ -61272,6 +62367,18 @@ }, /turf/open/floor/carpet/green, /area/station/maintenance/central/lesser) +"vwE" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/simple/dark/hidden{ + dir = 8 + }, +/obj/item/kirbyplants/random{ + pixel_y = 8 + }, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/server) "vwI" = ( /obj/structure/closet/secure_closet/hos, /obj/item/clothing/shoes/cowboy/black, @@ -61302,22 +62409,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/small, /area/station/security/office) -"vwS" = ( -/obj/structure/table, -/obj/item/stack/pipe_cleaner_coil/random, -/obj/item/stack/pipe_cleaner_coil/random{ - pixel_y = 4 - }, -/obj/item/stack/pipe_cleaner_coil/random{ - pixel_y = 3 - }, -/obj/item/stack/pipe_cleaner_coil/random, -/obj/item/stack/pipe_cleaner_coil/random{ - pixel_y = 6 - }, -/obj/machinery/light/cold/directional/west, -/turf/open/floor/iron, -/area/station/commons/storage/art) "vxa" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -61325,13 +62416,6 @@ }, /turf/open/floor/iron, /area/station/commons/storage/art) -"vxf" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/flora/bush/sunny/style_random, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) "vxm" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -61353,6 +62437,14 @@ "vxM" = ( /turf/open/floor/iron, /area/station/commons/storage/art) +"vxR" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 4; + piping_layer = 2 + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/dark, +/area/station/science/ordnance) "vyi" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -61364,12 +62456,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/dark/hidden, /turf/open/floor/wood/tile, /area/station/tcommsat/server) -"vyt" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/hedge, -/obj/machinery/light/cold/directional/west, -/turf/open/floor/iron/dark, -/area/station/command/corporate_dock) "vyF" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/chair/sofa/bench/left{ @@ -61405,17 +62491,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"vzh" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/computer/station_alert{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/command/corporate_dock) +"vzt" = ( +/obj/structure/hedge, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/smooth, +/area/station/hallway/secondary/command) "vzv" = ( /obj/item/cultivator/rake, /obj/machinery/light/small/directional/west, /obj/effect/decal/cleanable/dirt, +/obj/structure/alien/weeds, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "vzy" = ( @@ -61431,6 +62516,11 @@ /obj/structure/cable, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) +"vzI" = ( +/obj/machinery/skill_station, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood/parquet, +/area/station/service/library) "vzM" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/brown/full, @@ -61462,14 +62552,17 @@ /obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/iron/textured_half, /area/station/command/corporate_dock) -"vAc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, +"vzY" = ( +/obj/effect/turf_decal/tile/dark_red/half/contrasted{ + dir = 1 + }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, -/turf/open/floor/iron/showroomfloor, -/area/station/commons/toilet/auxiliary) +/obj/effect/landmark/start/security_officer, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron, +/area/station/security/tram) "vAo" = ( /obj/item/radio/intercom/directional/north{ broadcasting = 1; @@ -61502,10 +62595,30 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"vAx" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/small, +/area/station/security/tram) "vAA" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/grass, /area/station/service/hydroponics/garden/monastery) +"vAC" = ( +/obj/structure/flora/bush/large/style_random{ + pixel_y = -3 + }, +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/siding/wideplating{ + dir = 8 + }, +/turf/open/misc/sandy_dirt, +/area/station/security/tram) +"vAD" = ( +/turf/open/floor/wood/tile, +/area/station/maintenance/port/lesser) "vAK" = ( /obj/machinery/door/airlock{ name = "Maintenance" @@ -61558,16 +62671,6 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron/white/small, /area/station/service/hydroponics) -"vBu" = ( -/obj/structure/disposalpipe/segment, -/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/machinery/light/cold/directional/west, -/turf/open/floor/iron/white/side{ - dir = 8 - }, -/area/station/science/research) "vBG" = ( /obj/structure/table, /obj/machinery/microwave{ @@ -61576,19 +62679,12 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/cafeteria, /area/station/science/breakroom) -"vCd" = ( -/obj/structure/table, -/obj/item/folder/yellow{ - pixel_x = 4 +"vBK" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/stack/sheet/mineral/plasma/thirty, -/turf/open/floor/iron/small, -/area/station/engineering/engine_smes) +/turf/open/floor/iron/dark, +/area/station/security/office) "vCe" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -61607,11 +62703,6 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) -"vCx" = ( -/obj/structure/cable, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/iron, -/area/station/security/prison/workout) "vCO" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, @@ -61625,6 +62716,15 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/smooth_large, /area/station/science/ordnance/storage) +"vDA" = ( +/obj/structure/chair{ + pixel_y = -2 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron, +/area/station/maintenance/department/engine/atmos) "vDB" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -61704,18 +62804,6 @@ "vEP" = ( /turf/closed/wall/r_wall, /area/station/security/brig) -"vEQ" = ( -/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/machinery/light/cold/directional/north, -/turf/open/floor/iron/white/corner{ - dir = 8 - }, -/area/station/science/lower) "vEW" = ( /turf/closed/wall/r_wall, /area/station/security/prison/shower) @@ -61740,6 +62828,13 @@ /obj/structure/sign/poster/official/no_erp/directional/east, /turf/open/floor/iron/grimy, /area/station/maintenance/starboard/central) +"vFu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/dark/side{ + dir = 6 + }, +/area/station/hallway/secondary/construction) "vFv" = ( /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 @@ -61787,6 +62882,16 @@ }, /turf/open/floor/iron/white/small, /area/station/science/server) +"vFQ" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=8"; + location = "QM #2" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/cargo/storage) "vFR" = ( /obj/structure/bed, /obj/effect/turf_decal/siding/red{ @@ -61834,6 +62939,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"vGK" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/side{ + dir = 10 + }, +/area/station/hallway/secondary/construction) "vGU" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -61896,6 +63007,16 @@ /obj/effect/landmark/observer_start, /turf/open/floor/glass, /area/station/hallway/secondary/spacebridge) +"vHT" = ( +/obj/effect/turf_decal/box/red/corners{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 10 + }, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/engine, +/area/station/science/xenobiology) "vHV" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -61927,6 +63048,8 @@ name = "Maintenance" }, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/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/aft) "vIJ" = ( @@ -61940,6 +63063,12 @@ }, /turf/open/floor/iron/small, /area/station/hallway/primary/central/fore) +"vIN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/chair/stool, +/obj/structure/sign/poster/contraband/random/directional/north, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "vIX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -61961,30 +63090,6 @@ }, /turf/open/floor/iron/dark/herringbone, /area/station/security/courtroom) -"vJi" = ( -/obj/structure/table/glass, -/obj/machinery/fax{ - fax_name = "Chief Medical Officer's Office"; - name = "Chief Medical Officer's Fax Machine"; - pixel_y = 13 - }, -/obj/machinery/light/cold/directional/east, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/button/door/directional/south{ - id = "cmoprivacy"; - name = "CMO Privacy Shutters"; - pixel_x = -6; - req_access = list("cmo") - }, -/obj/machinery/camera/autoname/directional/south, -/obj/machinery/button/door/directional/south{ - id = "medlock"; - name = "Medbay Lockdown Control"; - pixel_x = 6; - req_access = list("medical") - }, -/turf/open/floor/wood/parquet, -/area/station/command/heads_quarters/cmo) "vJn" = ( /obj/structure/closet/crate/coffin, /obj/structure/window/spawner/directional/west, @@ -62059,6 +63164,14 @@ "vKb" = ( /turf/open/floor/iron/dark, /area/station/medical/medbay/lobby) +"vKi" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/machinery/computer/crew, +/turf/open/floor/iron/smooth, +/area/station/security/checkpoint/customs/auxiliary) "vKy" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -62069,14 +63182,6 @@ }, /turf/open/floor/wood, /area/station/security/detectives_office) -"vKB" = ( -/obj/effect/turf_decal/siding/dark_red, -/obj/machinery/modular_computer/console/preset/id{ - dir = 1 - }, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/stone, -/area/station/command/heads_quarters/hos) "vKG" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /turf/open/floor/iron, @@ -62092,6 +63197,8 @@ dir = 8 }, /obj/machinery/camera/autoname/directional/east, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron/dark/small, /area/station/security/detectives_office) "vKX" = ( @@ -62121,6 +63228,14 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/white/small, /area/station/medical/storage) +"vLc" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "vLf" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -62190,6 +63305,17 @@ "vLP" = ( /turf/closed/wall/rust, /area/station/command/heads_quarters/qm) +"vLQ" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/box, +/obj/machinery/disposal/bin{ + desc = "A pneumatic waste disposal unit. This one leads to the morgue."; + name = "corpse disposal" + }, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) "vLT" = ( /obj/machinery/holopad, /obj/effect/turf_decal/box/white{ @@ -62197,17 +63323,9 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) -"vLW" = ( -/obj/machinery/computer/crew{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/light_switch/directional/south, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "vMr" = ( /obj/effect/turf_decal/sand/plating, +/obj/structure/alien/weeds, /turf/open/misc/asteroid, /area/station/maintenance/starboard/greater) "vMs" = ( @@ -62245,11 +63363,6 @@ /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"vMS" = ( -/obj/item/pickaxe, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid, -/area/station/maintenance/fore/greater) "vMT" = ( /obj/machinery/hydroponics/soil, /obj/item/food/grown/mushroom/libertycap, @@ -62296,6 +63409,7 @@ pixel_y = 12 }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) "vNv" = ( @@ -62306,14 +63420,6 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/smooth, /area/station/cargo/warehouse) -"vNw" = ( -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/landmark/start/security_officer, -/turf/open/floor/iron, -/area/station/security/brig/entrance) "vNK" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -62336,16 +63442,6 @@ /obj/effect/turf_decal/stripes/red/line, /turf/open/floor/iron/small, /area/station/hallway/secondary/spacebridge) -"vOq" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/chair/plastic{ - dir = 8 - }, -/obj/effect/landmark/start/hangover, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/turf/open/floor/iron, -/area/station/hallway/secondary/spacebridge) "vOr" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -62382,11 +63478,22 @@ /obj/structure/sign/departments/medbay/alt/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"vPx" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/science/xenobiology) "vPC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/r_wall, /area/station/hallway/secondary/spacebridge) +"vPJ" = ( +/obj/structure/broken_flooring/singular/directional/east, +/obj/structure/alien/weeds, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) "vPK" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -62408,57 +63515,11 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"vPV" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/chair/plastic{ - dir = 4 - }, -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron, -/area/station/hallway/secondary/spacebridge) -"vQi" = ( -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 1 - }, -/obj/machinery/light/cold/directional/west, -/obj/machinery/light_switch/directional/west, -/obj/structure/reagent_dispensers/water_cooler, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"vQj" = ( -/turf/open/floor/iron/dark/smooth_large, -/area/station/security/execution/education) "vQk" = ( /obj/effect/spawner/random/structure/crate, /obj/machinery/computer/security/telescreen/entertainment/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/dock) -"vQm" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/computer/scan_consolenew{ - dir = 8 - }, -/obj/effect/turf_decal/siding/purple{ - dir = 4 - }, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"vQn" = ( -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 1 - }, -/obj/machinery/vending/wardrobe/viro_wardrobe, -/obj/machinery/light/cold/directional/north, -/obj/machinery/camera/directional/west, -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/virology) "vQp" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/structure/chair/sofa/bench/right{ @@ -62480,6 +63541,14 @@ /obj/structure/flora/bush/large/style_random, /turf/open/misc/sandy_dirt, /area/station/medical/medbay/lobby) +"vQA" = ( +/obj/effect/turf_decal/tile/green/diagonal_centre, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/camera/autoname/directional/north, +/obj/structure/sign/warning/no_smoking/circle/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/diagonal, +/area/station/hallway/primary/central/aft) "vRd" = ( /obj/structure/table, /obj/effect/turf_decal/tile/dark_red, @@ -62508,17 +63577,6 @@ /obj/structure/broken_flooring/corner/directional/south, /turf/open/floor/plating, /area/station/commons) -"vRz" = ( -/obj/machinery/computer/records/medical{ - dir = 4 - }, -/obj/effect/turf_decal/siding/blue{ - dir = 9 - }, -/obj/machinery/light/cold/directional/north, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/iron/white, -/area/station/medical/paramedic) "vRC" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, @@ -62530,6 +63588,15 @@ /obj/effect/turf_decal/tile/brown/full, /turf/open/floor/iron/smooth_large, /area/station/service/bar) +"vRU" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/stool/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/command/heads_quarters/ce) "vSg" = ( /turf/closed/wall/r_wall, /area/station/hallway/primary/aft) @@ -62541,16 +63608,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"vSk" = ( -/obj/effect/turf_decal/tile/blue, -/obj/structure/filingcabinet/chestdrawer{ - pixel_y = 2 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/textured_edge{ - dir = 1 +"vSm" = ( +/obj/machinery/door/airlock/hatch, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 }, -/area/station/command/heads_quarters/hop) +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/department/engine) "vSq" = ( /obj/effect/turf_decal/stripes/corner, /obj/effect/turf_decal/stripes/corner{ @@ -62635,20 +63702,12 @@ }, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/freezerchamber) -"vTj" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/reagent_dispensers/watertank/high, -/obj/item/reagent_containers/cup/watering_can, -/turf/open/floor/iron, -/area/station/service/hydroponics) +"vTm" = ( +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/condiment, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/cafeteria, +/area/station/science/breakroom) "vTo" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -62659,13 +63718,6 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"vTs" = ( -/obj/structure/chair/wood/wings, -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/turf/open/floor/stone, -/area/station/command/heads_quarters/captain/private) "vTv" = ( /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ dir = 4 @@ -62702,10 +63754,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/small, /area/station/service/hydroponics) -"vTO" = ( -/mob/living/simple_animal/hostile/asteroid/gutlunch, -/turf/open/misc/asteroid, -/area/station/maintenance/fore/greater) "vTV" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/hos) @@ -62734,31 +63782,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/prison) -"vUp" = ( -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 8 - }, -/obj/structure/closet/crate/freezer, -/obj/machinery/light/cold/directional/south, -/obj/machinery/firealarm/directional/west, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/ethereal, -/obj/item/reagent_containers/blood{ - pixel_x = -3; - pixel_y = -3 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) "vUq" = ( /obj/machinery/restaurant_portal/bar, /obj/machinery/firealarm/directional/west, /turf/open/floor/wood/tile, /area/station/service/bar) -"vUt" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/turf/open/floor/iron, -/area/station/security/tram) "vUz" = ( /obj/structure/table_frame, /obj/effect/decal/cleanable/glass, @@ -62844,18 +63872,9 @@ /obj/machinery/light/cold/directional/south, /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/dark_red/fourcorners, +/obj/machinery/airalarm/directional/south, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/escape) -"vVu" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/table/reinforced/plastitaniumglass, -/obj/machinery/computer/records/medical/laptop{ - dir = 8; - pixel_y = 1 - }, -/obj/item/radio/intercom/command/directional/east, -/turf/open/floor/iron/dark, -/area/station/command/corporate_dock) "vVw" = ( /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 @@ -62916,19 +63935,10 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/hallway/secondary/command) -"vVS" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/dark_red{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/prison) "vVT" = ( /obj/structure/transit_tube/crossing/horizontal, /obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/space/basic, /area/space/nearstation) "vVU" = ( @@ -62948,7 +63958,8 @@ /obj/effect/turf_decal/siding/white{ dir = 5 }, -/obj/machinery/vending/wardrobe/coroner_wardrobe, +/obj/structure/table/reinforced, +/obj/machinery/computer/records/medical/laptop, /turf/open/floor/iron/small, /area/station/medical/morgue) "vWe" = ( @@ -63022,14 +64033,6 @@ /obj/item/clothing/gloves/boxing/blue, /turf/open/floor/iron, /area/station/security/prison/workout) -"vXd" = ( -/obj/structure/chair/sofa/left/maroon{ - dir = 1 - }, -/obj/machinery/light_switch/directional/south, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/showroomfloor, -/area/station/service/cafeteria) "vXi" = ( /obj/structure/table, /obj/item/reagent_containers/cup/bowl, @@ -63052,6 +64055,7 @@ dir = 6 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/iron/dark/small, /area/station/security/detectives_office) "vXs" = ( @@ -63067,15 +64071,6 @@ dir = 8 }, /area/station/science/lobby) -"vXz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/green{ - dir = 4 - }, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/iron/dark/small, -/area/station/medical/chemistry) "vXH" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -63213,20 +64208,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"vZK" = ( -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/obj/machinery/computer/security{ - dir = 1 - }, -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/structure/reagent_dispensers/wall/peppertank/directional/east, -/obj/machinery/camera/autoname/directional/east, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/brig/entrance) "vZW" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -63249,21 +64230,11 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) -"waG" = ( -/obj/structure/cable, -/obj/structure/table, -/obj/item/aicard, -/turf/open/floor/iron, -/area/station/engineering/storage/tech) -"waL" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, +"waw" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/east, /turf/open/floor/iron, -/area/station/security/courtroom) +/area/station/hallway/secondary/spacebridge) "waN" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -63315,6 +64286,7 @@ /area/station/engineering/break_room) "wbk" = ( /obj/effect/decal/cleanable/dirt, +/obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison/garden) "wbp" = ( @@ -63324,25 +64296,6 @@ dir = 1 }, /area/station/science/lower) -"wbq" = ( -/obj/effect/turf_decal/siding{ - dir = 10 - }, -/obj/structure/table, -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/decal/cleanable/dirt, -/obj/item/disk/tech_disk{ - pixel_x = -6 - }, -/obj/item/disk/tech_disk{ - pixel_x = 6 - }, -/obj/item/disk/tech_disk{ - pixel_y = 6 - }, -/obj/item/stack/cable_coil, -/turf/open/floor/iron/white/small, -/area/station/science/lab) "wbu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/siding, @@ -63406,6 +64359,19 @@ }, /turf/open/floor/iron/cafeteria, /area/station/hallway/secondary/exit/departure_lounge) +"wcI" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) +"wcP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/modular_computer/preset/cargochat/cargo, +/turf/open/floor/iron, +/area/station/cargo/sorting) "wcV" = ( /obj/structure/closet/crate, /obj/item/food/breadslice/plain, @@ -63418,14 +64384,6 @@ /obj/machinery/light/cold/directional/north, /turf/open/floor/iron/kitchen/small, /area/station/security/prison/mess) -"wdb" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "wdd" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -63446,6 +64404,13 @@ }, /turf/open/space/basic, /area/space/nearstation) +"wdS" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ + dir = 4 + }, +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/circuit, +/area/station/tcommsat/server) "wdV" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -63555,6 +64520,19 @@ /obj/structure/broken_flooring/pile/directional/east, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"wfU" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/small, +/area/station/medical/medbay/lobby) "wfV" = ( /obj/effect/turf_decal/siding/thinplating_new/light{ dir = 8 @@ -63584,19 +64562,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"wgu" = ( -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/iron/white/corner, -/area/station/hallway/secondary/exit/departure_lounge) "wgv" = ( /obj/structure/railing{ dir = 1 @@ -63612,6 +64577,17 @@ /obj/effect/turf_decal/weather, /turf/open/floor/plating, /area/station/service/chapel/office) +"wgC" = ( +/obj/structure/table/glass, +/obj/item/paper_bin{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/item/pen{ + pixel_y = 5 + }, +/turf/open/floor/iron/white, +/area/station/science/auxlab/firing_range) "wgF" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -63630,32 +64606,12 @@ /obj/effect/turf_decal/weather, /turf/open/floor/plating, /area/station/service/chapel/office) -"wgU" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/brown/full, -/obj/structure/reagent_dispensers/beerkeg, -/obj/effect/turf_decal/bot_red/left, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/iron/smooth_large, -/area/station/service/bar) "whc" = ( /obj/effect/turf_decal/tile/dark_red/anticorner/contrasted{ dir = 1 }, /turf/open/floor/iron, /area/station/security/execution/transfer) -"whf" = ( -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) -"whp" = ( -/obj/machinery/vending/wardrobe/det_wardrobe, -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/security/detectives_office) "wht" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -63696,6 +64652,13 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"wib" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/plating, +/area/station/engineering/atmos/pumproom) "wik" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 1; @@ -63706,18 +64669,22 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos/pumproom) -"wil" = ( -/obj/effect/turf_decal/siding/wood, -/obj/machinery/firealarm/directional/west, -/obj/structure/closet/secure_closet/psychology, -/turf/open/floor/iron/white/small, -/area/station/medical/psychology) "win" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/closed/wall/r_wall, /area/station/security/brig/entrance) +"wix" = ( +/obj/item/kirbyplants/random, +/obj/machinery/newscaster/directional/west, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/dark/side, +/area/station/hallway/primary/central/fore) "wiy" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -63744,6 +64711,11 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"wiP" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/space/nearstation) "wiT" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/newscaster/directional/south, @@ -63786,32 +64758,37 @@ /turf/open/floor/grass, /area/station/service/hydroponics/garden/monastery) "wjM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/small, /area/station/service/janitor) +"wjY" = ( +/obj/structure/window/spawner/directional/east, +/obj/structure/table/wood, +/obj/machinery/cell_charger{ + pixel_y = 5 + }, +/obj/item/stock_parts/cell/crap{ + pixel_y = 5 + }, +/obj/item/clothing/mask/cigarette/pipe/cobpipe{ + pixel_x = 1; + pixel_y = -2 + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/wood/tile, +/area/station/command/corporate_showroom) "wjZ" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/security/execution/transfer) -"wke" = ( -/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/official/random/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/commons/dorms) -"wkf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/white/side{ - dir = 4 - }, -/area/station/science/xenobiology) "wkg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -63852,11 +64829,11 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/station/hallway/secondary/recreation) -"wkJ" = ( -/obj/structure/cable, -/obj/machinery/holopad, -/turf/open/floor/iron/white, -/area/station/science/cytology) +"wla" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/chapel, +/area/station/maintenance/starboard/greater) "wlf" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/glass, @@ -63867,28 +64844,18 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) -"wlm" = ( -/obj/structure/window/spawner/directional/south, -/obj/structure/window/spawner/directional/west, -/obj/structure/flora/bush/large/style_random{ - pixel_x = -17; - pixel_y = 2 - }, -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/machinery/status_display/evac/directional/east, -/turf/open/misc/sandy_dirt, -/area/station/commons) -"wly" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/flora/tree/stump, -/obj/machinery/light/directional/south, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden/monastery) "wlF" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/siding/wood, /turf/open/floor/grass, /area/station/service/hydroponics/garden/monastery) +"wlJ" = ( +/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/holopad, +/turf/open/floor/iron, +/area/station/engineering/storage/tech) "wlL" = ( /obj/machinery/firealarm/directional/north, /obj/structure/cable, @@ -63901,12 +64868,6 @@ /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, /area/station/service/hydroponics/garden/monastery) -"wmc" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/sign/poster/official/random/directional/north, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/turf/open/floor/iron, -/area/station/hallway/secondary/spacebridge) "wme" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, @@ -63939,6 +64900,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"wmy" = ( +/obj/machinery/hydroponics/soil, +/obj/item/cultivator/rake, +/obj/machinery/light/small/directional/west, +/turf/open/floor/grass, +/area/station/security/prison/garden) "wmB" = ( /obj/effect/spawner/random/vending/colavend, /obj/machinery/computer/security/telescreen/entertainment/directional/north, @@ -63987,11 +64954,6 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/restrooms) -"wnv" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/turf/open/floor/iron, -/area/station/hallway/secondary/spacebridge) "wnB" = ( /obj/effect/turf_decal/plaque{ icon_state = "L1" @@ -64011,13 +64973,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/wood, /area/station/service/theater) -"wnN" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 4 - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "wnO" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ @@ -64025,6 +64980,16 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"wnY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/green{ + dir = 9 + }, +/obj/item/kirbyplants/random/fullysynthetic, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/dark/small, +/area/station/medical/chemistry) "wob" = ( /obj/structure/toilet{ dir = 8 @@ -64094,6 +65059,14 @@ /obj/item/wrench, /turf/open/floor/catwalk_floor, /area/station/science/xenobiology) +"woP" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/office) "woT" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/structure/chair/sofa/bench/left{ @@ -64119,17 +65092,27 @@ /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/misc/sandy_dirt, /area/station/medical/medbay/lobby) -"wpu" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/cold/directional/east, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) +"wpw" = ( +/obj/structure/cable, +/obj/item/kirbyplants/random, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/port/aft) "wpy" = ( /obj/effect/turf_decal/tile/dark_red/fourcorners, /turf/open/floor/iron, /area/station/security/execution/transfer) +"wpE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/pink/visible{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/remains/human{ + pixel_x = 6; + pixel_y = 6 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "wpO" = ( /turf/closed/wall/r_wall, /area/station/security/processing) @@ -64141,39 +65124,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, /area/station/medical/paramedic) -"wpZ" = ( -/obj/structure/closet{ - name = "Paramedic Supplies" - }, -/obj/effect/turf_decal/siding/blue{ +"wqb" = ( +/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 = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/paramedic) -"wqi" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/structure/table/wood, -/obj/machinery/recharger{ - pixel_x = 5; - pixel_y = 3 - }, -/obj/item/assembly/flash/handheld{ - pixel_x = -6; - pixel_y = 5 - }, -/obj/machinery/requests_console/directional/north{ - department = "Head of Personnel's Desk"; - name = "Head of Personnel's Requests Console" +/obj/machinery/requests_console/directional/east{ + department = "Xenobiology"; + name = "Xenobiology Requests Console" }, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/plating, -/area/station/command/heads_quarters/hop) +/obj/effect/mapping_helpers/requests_console/ore_update, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "wqj" = ( /turf/closed/wall, /area/station/commons/toilet/restrooms) @@ -64194,11 +65157,22 @@ }, /turf/open/floor/plating, /area/station/service/kitchen) +"wqD" = ( +/obj/structure/reagent_dispensers/water_cooler, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) "wqM" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating/rust, /area/station/maintenance/fore/lesser) +"wqY" = ( +/obj/machinery/camera/autoname/directional/east, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/prison/workout) "wro" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/newscaster/directional/south, @@ -64211,20 +65185,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/science/ordnance/testlab) -"wrw" = ( -/obj/structure/table, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 10 - }, -/obj/machinery/light/cold/directional/west, -/obj/machinery/status_display/ai/directional/west, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron/dark/herringbone, -/area/station/security/courtroom) "wrD" = ( /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, /area/station/maintenance/starboard/aft) "wrF" = ( @@ -64265,14 +65231,6 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron/dark, /area/station/command/corporate_dock) -"wrZ" = ( -/obj/structure/chair{ - dir = 1; - pixel_y = -2 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/dark/small, -/area/station/security/checkpoint/customs/auxiliary) "wsa" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/effect/turf_decal/tile/red/anticorner/contrasted{ @@ -64299,15 +65257,6 @@ /obj/effect/spawner/random/engineering/toolbox, /turf/open/floor/catwalk_floor/iron, /area/station/maintenance/department/medical/central) -"wsE" = ( -/obj/item/kirbyplants/random, -/obj/machinery/newscaster/directional/west, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/primary/central/fore) "wsG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64318,6 +65267,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/prison) +"wsL" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/engineering/atmos) "wsR" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -64353,16 +65312,6 @@ /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/plating/airless, /area/space/nearstation) -"wtl" = ( -/obj/machinery/computer/department_orders/engineering{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/plating, -/area/station/engineering/break_room) "wtm" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/blue{ @@ -64447,6 +65396,30 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"wuk" = ( +/obj/structure/rack, +/obj/effect/turf_decal/stripes/line{ + 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/clothing/mask/gas{ + pixel_y = 4 + }, +/obj/item/clothing/mask/gas, +/obj/machinery/airalarm/directional/west, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark/small, +/area/station/engineering/main) "wum" = ( /turf/closed/wall/r_wall, /area/station/security/medical) @@ -64461,6 +65434,11 @@ dir = 8 }, /area/station/science/lobby) +"wuq" = ( +/obj/structure/table, +/obj/effect/spawner/random/techstorage/rnd_secure_all, +/turf/open/floor/iron, +/area/station/engineering/storage/tech) "wur" = ( /obj/structure/closet/l3closet/scientist, /obj/effect/turf_decal/stripes/line, @@ -64477,6 +65455,9 @@ "wuH" = ( /obj/structure/broken_flooring/singular/directional/south, /obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) "wuI" = ( @@ -64491,16 +65472,24 @@ "wuM" = ( /turf/closed/wall, /area/station/command/heads_quarters/qm) -"wuN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/autoname/directional/south, +"wvg" = ( +/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/dark_red/half/contrasted{ + dir = 8 + }, +/obj/structure/chair{ + pixel_y = -2 + }, +/obj/machinery/computer/security/telescreen/interrogation{ + dir = 8; + name = "isolation room monitor"; + network = list("isolation"); + pixel_x = 30 + }, /turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"wuV" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/security/tram) +/area/station/security/execution/transfer) "wvn" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64544,6 +65533,14 @@ /obj/machinery/photocopier, /turf/open/floor/iron/grimy, /area/station/science/cubicle) +"wwm" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/machinery/light/floor, +/turf/open/floor/iron/checker{ + dir = 1 + }, +/area/station/security/execution/transfer) "wwz" = ( /obj/structure/cable, /obj/machinery/computer/mech_bay_power_console{ @@ -64592,23 +65589,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"wwZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/research{ - name = "Research Division Access" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-entrance" - }, -/obj/effect/mapping_helpers/airlock/access/all/science/general, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white/textured_half{ - dir = 1 - }, -/area/station/science/research) "wxd" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -64632,6 +65612,26 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/lesser) +"wxU" = ( +/obj/effect/turf_decal/siding{ + dir = 10 + }, +/obj/structure/table, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt, +/obj/item/disk/tech_disk{ + pixel_x = -6 + }, +/obj/item/disk/tech_disk{ + pixel_x = 6 + }, +/obj/item/disk/tech_disk{ + pixel_y = 6 + }, +/obj/item/stack/cable_coil, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white/small, +/area/station/science/lab) "wxW" = ( /obj/machinery/door/airlock/external/glass, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, @@ -64649,16 +65649,42 @@ dir = 1 }, /area/station/science/xenobiology) +"wya" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/chem_dispenser{ + layer = 2.7 + }, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/pharmacy) "wyb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/dark_red, /turf/open/floor/iron, /area/station/security/prison) -"wyc" = ( +"wyg" = ( +/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/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, /obj/effect/decal/cleanable/dirt, -/turf/closed/wall, -/area/station/maintenance/department/engine) +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/effect/landmark/navigate_destination/tools, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "wyj" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/decal/cleanable/dirt, @@ -64672,11 +65698,18 @@ "wyt" = ( /turf/open/floor/plating/rust, /area/station/maintenance/department/engine) -"wyA" = ( -/obj/item/kirbyplants/random/fullysynthetic, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) +"wyy" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/computer/scan_consolenew{ + dir = 8 + }, +/obj/effect/turf_decal/siding/purple{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/iron/dark, +/area/station/science/genetics) "wyK" = ( /obj/machinery/door/airlock/external/glass, /obj/effect/mapping_helpers/broken_floor, @@ -64719,6 +65752,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet/lone, /area/station/service/chapel/office) +"wzb" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/green{ + dir = 10 + }, +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria, +/area/station/science/circuits) "wzj" = ( /turf/open/floor/plating, /area/station/maintenance/central/greater) @@ -64773,33 +65816,23 @@ /obj/structure/broken_flooring/pile/directional/east, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_command) -"wAt" = ( -/obj/structure/cable, -/obj/structure/table/bronze, -/obj/effect/turf_decal/siding/thinplating_new/terracotta{ - dir = 4 - }, -/obj/machinery/light/small/directional/west, -/obj/item/plate{ - pixel_y = 2 - }, -/obj/item/plate{ - pixel_y = 4 +"wAE" = ( +/obj/structure/closet{ + name = "Paramedic Supplies" }, -/obj/item/plate{ - pixel_y = 6 +/obj/effect/turf_decal/siding/blue{ + dir = 4 }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/command/meeting_room) -"wAx" = ( -/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/autoname/directional/east, /obj/machinery/light/cold/directional/east, -/turf/open/floor/iron, -/area/station/security/processing) +/turf/open/floor/iron/white, +/area/station/medical/paramedic) "wAS" = ( /obj/structure/table/wood, /obj/item/hand_labeler, /obj/item/camera/detective, +/obj/machinery/airalarm/directional/south, /turf/open/floor/wood, /area/station/security/detectives_office) "wAW" = ( @@ -64830,6 +65863,7 @@ /obj/machinery/door/airlock/engineering{ name = "Supplies Depot" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/hallway/secondary/construction) "wBm" = ( @@ -64839,15 +65873,6 @@ "wBo" = ( /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) -"wBr" = ( -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/dark/small, -/area/station/security/detectives_office) "wBs" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -64869,8 +65894,12 @@ /obj/machinery/light/small/broken/directional/east, /obj/effect/decal/cleanable/dirt, /obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/fore/greater) +"wBQ" = ( +/turf/open/space/basic, +/area/station/construction/mining) "wCa" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -64889,26 +65918,21 @@ /obj/machinery/flasher/directional/east, /turf/open/floor/iron/half, /area/station/hallway/primary/central/fore) -"wCu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/research{ - name = "Research Division Access" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-entrance" - }, -/obj/effect/mapping_helpers/airlock/access/all/science/general, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white/textured_half{ - dir = 1 - }, -/area/station/science/research) "wCx" = ( /obj/effect/turf_decal/siding/green{ dir = 8 }, /turf/open/floor/iron/dark/small, /area/station/medical/chemistry) +"wCz" = ( +/obj/machinery/computer/arcade/orion_trail/kobayashi, +/turf/open/floor/wood/tile, +/area/station/maintenance/port/lesser) +"wCD" = ( +/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/entertainment) "wCH" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 9 @@ -64992,6 +66016,17 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/auxiliary) +"wDJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/status_display/ai/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "wDV" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -65016,12 +66051,6 @@ /obj/effect/turf_decal/tile/green/diagonal_centre, /turf/open/floor/iron/diagonal, /area/station/hallway/primary/central/aft) -"wEw" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/turf/open/floor/iron, -/area/station/hallway/secondary/spacebridge) "wEC" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -65077,32 +66106,13 @@ }, /turf/open/floor/iron/small, /area/station/hallway/primary/starboard) -"wFy" = ( -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/structure/window/spawner/directional/north, -/obj/effect/turf_decal/stripes/end{ - dir = 8 - }, -/obj/structure/disposaloutlet{ - dir = 4; - name = "Cargo Deliveries" - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/station/hallway/secondary/service) "wFz" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/table, /obj/item/storage/belt/mining, +/obj/structure/alien/weeds, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"wFM" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/turf/open/floor/iron, -/area/station/hallway/secondary/spacebridge) "wFQ" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -65155,14 +66165,42 @@ }, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"wGW" = ( -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron/white, -/area/station/science/cytology) +"wHa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/pink/visible{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/mapping_helpers/broken_floor, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/effect/decal/cleanable/ash{ + pixel_x = -16 + }, +/turf/open/floor/iron/dark/side{ + dir = 9 + }, +/area/station/engineering/atmos) "wHg" = ( /obj/structure/filingcabinet/filingcabinet, /turf/open/floor/iron/grimy, /area/station/science/cubicle) +"wHh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/crowbar, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "wHE" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -65183,6 +66221,12 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/wood/parquet, /area/station/service/greenroom) +"wHP" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/iron, +/area/station/hallway/secondary/dock) "wHX" = ( /obj/item/radio/intercom/directional/south, /obj/effect/landmark/start/hangover, @@ -65213,6 +66257,16 @@ /obj/effect/turf_decal/tile/dark_red/fourcorners, /turf/open/floor/iron, /area/station/security/brig/entrance) +"wIh" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/white/side{ + dir = 1 + }, +/area/station/science/xenobiology) "wIm" = ( /obj/effect/mapping_helpers/airlock/access/all/command/general, /obj/machinery/door/airlock/hatch{ @@ -65261,6 +66315,15 @@ /obj/structure/cable, /turf/closed/wall/r_wall, /area/station/maintenance/department/science/xenobiology) +"wJt" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "wJx" = ( /turf/closed/wall/r_wall, /area/station/security/courtroom) @@ -65279,12 +66342,6 @@ /obj/structure/window/spawner/directional/south, /turf/open/misc/sandy_dirt, /area/station/hallway/secondary/entry) -"wJH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/electropack, -/turf/open/floor/engine, -/area/station/science/xenobiology) "wJK" = ( /obj/effect/turf_decal/tile/dark_red{ dir = 4 @@ -65359,11 +66416,6 @@ }, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai_upload) -"wKl" = ( -/obj/item/kirbyplants/photosynthetic, -/obj/machinery/flasher/directional/north, -/turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) "wKm" = ( /obj/effect/turf_decal/siding/white/corner{ dir = 4 @@ -65393,14 +66445,19 @@ /turf/open/floor/iron, /area/station/engineering/atmos/storage/gas) "wKG" = ( +/obj/structure/alien/resin/wall, +/obj/structure/alien/weeds, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) -"wKP" = ( -/obj/structure/cable, -/obj/item/kirbyplants/photosynthetic, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) +"wKT" = ( +/obj/machinery/computer/security/mining, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/brown{ + dir = 1 + }, +/obj/machinery/incident_display/dual/directional/north, +/turf/open/floor/iron/smooth, +/area/station/command/bridge) "wKY" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -65461,12 +66518,6 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron/dark, /area/station/medical/medbay/lobby) -"wLW" = ( -/obj/structure/sign/directions/dorms{ - dir = 1 - }, -/turf/closed/wall, -/area/station/maintenance/starboard/lesser) "wLZ" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /obj/effect/decal/cleanable/dirt, @@ -65480,16 +66531,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/service/library) -"wMi" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/machinery/airalarm/directional/east, -/obj/item/folder/red, -/obj/item/pen, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/server) "wMm" = ( /turf/closed/wall/rust, /area/station/engineering/break_room) @@ -65540,12 +66581,6 @@ /obj/structure/table, /turf/open/floor/iron/smooth, /area/station/maintenance/solars/port/aft) -"wMV" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/paper_bin, -/turf/open/floor/iron, -/area/station/commons/storage/art) "wMZ" = ( /obj/effect/spawner/structure/window, /obj/machinery/door/poddoor/shutters/preopen{ @@ -65573,6 +66608,10 @@ }, /turf/open/floor/iron/smooth_large, /area/station/science/robotics/mechbay) +"wNv" = ( +/obj/effect/landmark/navigate_destination/bridge, +/turf/open/floor/iron/smooth_half, +/area/station/hallway/primary/central/fore) "wNw" = ( /obj/structure/chair/stool/directional/west, /obj/effect/decal/cleanable/dirt, @@ -65617,6 +66656,14 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"wNZ" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/sepia, +/area/station/maintenance/aft) "wOd" = ( /obj/structure/broken_flooring/plating/directional/south, /turf/open/floor/iron, @@ -65727,17 +66774,21 @@ }, /turf/open/floor/plating, /area/station/command/heads_quarters/hop) -"wPz" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/computer/scan_consolenew{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple{ - dir = 10 +"wPh" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark/small, +/area/station/security/detectives_office) +"wPu" = ( +/obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/science/genetics) +/obj/structure/alien/weeds, +/obj/effect/gibspawner, +/turf/open/floor/wood, +/area/station/maintenance/starboard/greater) "wPK" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/chair/office/light{ @@ -65767,19 +66818,6 @@ }, /turf/open/floor/iron, /area/station/medical/chemistry) -"wPR" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/pdapainter/research, -/obj/machinery/computer/security/telescreen/rd{ - pixel_y = 30 - }, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/siding/purple{ - dir = 5 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) "wQj" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -65833,17 +66871,6 @@ /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"wQW" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/obj/structure/chair{ - dir = 1 - }, -/obj/machinery/light/cold/directional/west, -/turf/open/floor/iron/cafeteria, -/area/station/service/cafeteria) "wRa" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/blue{ @@ -65896,16 +66923,6 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/smooth, /area/station/service/greenroom) -"wRF" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 9 - }, -/area/station/science/ordnance/testlab) "wRL" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -65930,21 +66947,9 @@ /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "wRU" = ( -/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/smartfridge/organ, /turf/open/floor/plating, /area/station/medical/morgue) -"wRV" = ( -/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/dark_red/half/contrasted{ - dir = 8 - }, -/obj/structure/chair{ - pixel_y = -2 - }, -/turf/open/floor/iron, -/area/station/security/execution/transfer) "wRW" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/atmospheric_sanity/ignore_area, @@ -65964,20 +66969,30 @@ }, /turf/open/floor/iron/white/corner, /area/station/hallway/primary/aft) -"wSG" = ( -/obj/structure/rack, -/obj/item/storage/medkit/regular, -/obj/item/healthanalyzer, -/obj/effect/turf_decal/siding/red{ - dir = 9 +"wSF" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/obj/structure/table, +/obj/item/radio/intercom/directional/south, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/item/storage/box/bandages{ + pixel_y = 6; + pixel_x = 4 + }, +/obj/item/stack/medical/gauze{ + pixel_x = -2; + pixel_y = 8 }, +/obj/item/stack/medical/gauze, /turf/open/floor/iron/white, -/area/station/security/medical) +/area/station/medical/medbay/lobby) "wSH" = ( /obj/structure/cable, /obj/machinery/door/airlock/highsecurity{ name = "Secure Tech Storage" }, +/obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/iron/textured_half, /area/station/engineering/storage/tech) "wSL" = ( @@ -65985,12 +67000,17 @@ /obj/effect/spawner/random/techstorage/engineering_all, /turf/open/floor/iron, /area/station/engineering/storage/tech) -"wSV" = ( -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/white/side{ +"wSM" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/area/station/science/xenobiology) +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/recreation) "wSZ" = ( /turf/closed/wall/r_wall, /area/station/maintenance/hallway/abandoned_command) @@ -66000,14 +67020,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) -"wTg" = ( -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, -/obj/machinery/chem_dispenser{ - layer = 2.7 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/medical/pharmacy) "wTm" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66018,6 +67030,13 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/textured_half, /area/station/security/prison/work) +"wTs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/random/directional/north, +/obj/structure/broken_flooring/singular/directional/east, +/obj/structure/tank_dispenser, +/turf/open/floor/plating, +/area/station/hallway/secondary/dock) "wTu" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/broken_flooring/pile/directional/east, @@ -66090,6 +67109,30 @@ /obj/structure/curtain/cloth/fancy, /turf/open/floor/iron/grimy, /area/station/cargo/boutique) +"wTU" = ( +/obj/structure/table/glass, +/obj/machinery/fax{ + fax_name = "Chief Medical Officer's Office"; + name = "Chief Medical Officer's Fax Machine"; + pixel_y = 13 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/button/door/directional/south{ + id = "cmoprivacy"; + name = "CMO Privacy Shutters"; + pixel_x = -6; + req_access = list("cmo") + }, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/button/door/directional/south{ + id = "medlock"; + name = "Medbay Lockdown Control"; + pixel_x = 6; + req_access = list("medical") + }, +/obj/machinery/keycard_auth/directional/east, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/cmo) "wTX" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66109,35 +67152,6 @@ }, /turf/open/floor/iron, /area/station/security) -"wUt" = ( -/obj/structure/table, -/obj/machinery/light/cold/directional/north, -/obj/machinery/computer/security/telescreen/ordnance{ - pixel_y = 2 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/science/ordnance/testlab) -"wUB" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark/small, -/area/station/engineering/main) -"wUJ" = ( -/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/siding/white{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) "wUZ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -66173,16 +67187,11 @@ }, /turf/open/floor/iron/dark/small, /area/station/security/execution/education) -"wVS" = ( -/obj/structure/cable, -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/firealarm/directional/north, +"wVI" = ( +/obj/machinery/biogenerator, +/obj/machinery/light/small/dim/directional/north, /turf/open/floor/plating, -/area/station/engineering/gravity_generator) +/area/station/maintenance/department/prison) "wVZ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -66199,28 +67208,10 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/grass, /area/station/service/hydroponics/garden/monastery) -"wWb" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "wWc" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/commons/dorms) -"wWr" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/cold/directional/north, -/obj/machinery/status_display/ai/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "wWs" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66246,6 +67237,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"wWR" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/orange, +/obj/item/restraints/handcuffs, +/obj/item/reagent_containers/spray/pepper, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "wWS" = ( /turf/open/floor/iron, /area/station/security/prison) @@ -66259,15 +67258,26 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"wXd" = ( -/obj/effect/turf_decal/stripes/line{ +"wWX" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 4 }, -/obj/machinery/light/directional/east, -/obj/machinery/firealarm/directional/east, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/obj/structure/table/reinforced, +/obj/effect/mapping_helpers/broken_floor, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = -18; + pixel_y = 4 + }, +/obj/machinery/recharger, +/obj/machinery/requests_console/directional/north{ + department = "Security"; + name = "Security Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/structure/reagent_dispensers/wall/peppertank/directional/east, /turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) +/area/station/security/checkpoint/customs/auxiliary) "wXg" = ( /obj/structure/disposalpipe/trunk, /obj/structure/window/reinforced/spawner/directional/east, @@ -66370,12 +67380,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/cryo) -"wYy" = ( -/obj/machinery/computer/order_console/cook, -/obj/effect/turf_decal/bot_red, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) "wYA" = ( /turf/closed/wall/r_wall, /area/station/medical/chemistry) @@ -66384,6 +67388,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons) +"wYD" = ( +/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 = 1 + }, +/obj/effect/landmark/navigate_destination/hop, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "wYF" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -66394,11 +67408,13 @@ /obj/effect/turf_decal/tile/green/diagonal_centre, /turf/open/floor/iron/diagonal, /area/station/hallway/primary/central/aft) -"wYL" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/broken_flooring/pile/directional/east, -/turf/open/floor/plating, -/area/station/hallway/secondary/dock) +"wYK" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/siding/wideplating{ + dir = 8 + }, +/turf/open/misc/sandy_dirt, +/area/station/security/tram) "wYM" = ( /obj/structure/dresser, /obj/effect/turf_decal/siding/thinplating_new/light{ @@ -66446,19 +67462,18 @@ }, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/hallway/secondary/exit/departure_lounge) +"wZd" = ( +/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/dark_red/opposingcorners, +/obj/machinery/camera/autoname/directional/west, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/security/brig/entrance) "wZl" = ( /turf/closed/wall, /area/station/commons) -"wZn" = ( -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 9 - }, -/obj/machinery/computer/mechpad, -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/smooth_large, -/area/station/science/robotics/mechbay) "wZo" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -66526,6 +67541,13 @@ /obj/structure/bed/maint, /turf/open/floor/eighties/red, /area/station/service/abandoned_gambling_den/gaming) +"wZS" = ( +/obj/machinery/status_display/evac/directional/east, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/exit/departure_lounge) "wZX" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -66543,6 +67565,14 @@ /obj/structure/grille, /turf/closed/wall/mineral/titanium/nodiagonal, /area/station/engineering/atmos) +"xaj" = ( +/obj/machinery/light/cold/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/entertainment/arcade{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "xam" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -66567,16 +67597,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"xaA" = ( -/obj/effect/landmark/navigate_destination, -/obj/machinery/door/airlock/external{ - name = "Departure Lounge Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/hallway/secondary/exit/departure_lounge) "xaC" = ( /obj/machinery/holopad, /turf/open/floor/iron, @@ -66589,6 +67609,17 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"xaI" = ( +/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/item/kirbyplants/random, +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/dock) "xaN" = ( /turf/closed/wall, /area/station/maintenance/starboard/central) @@ -66650,15 +67681,6 @@ }, /turf/open/floor/iron/dark/small, /area/station/tcommsat/server) -"xbx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/cold/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/sign/departments/court/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "xbC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/sign/poster/official/random/directional/north, @@ -66689,6 +67711,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/hallway/secondary/spacebridge) +"xbR" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/hedge, +/turf/open/floor/iron/dark, +/area/station/command/corporate_dock) "xbT" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/simple/general/visible{ @@ -66696,6 +67723,11 @@ }, /turf/open/floor/iron/white, /area/station/science/cytology) +"xbV" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/small, +/area/station/security/brig) "xbW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/firealarm/directional/north, @@ -66767,6 +67799,18 @@ }, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/exit/departure_lounge) +"xdD" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/sink/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/dark/small, +/area/station/service/chapel/storage) "xdE" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/side{ @@ -66869,6 +67913,15 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"xeV" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 4 + }, +/obj/structure/rack, +/obj/item/radio/intercom/directional/west, +/obj/effect/spawner/random/armory/disablers, +/turf/open/floor/iron/dark/small, +/area/station/ai_monitored/security/armory) "xeX" = ( /obj/structure/disposalpipe/segment, /obj/structure/table/reinforced, @@ -66940,6 +67993,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet/lone, /area/station/service/chapel/office) +"xfV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/green{ + dir = 1 + }, +/obj/machinery/button/door/directional/north{ + id = "chem_lockdown"; + name = "chemistry lockdown control"; + req_access = list("pharmacy") + }, +/turf/open/floor/iron/dark/small, +/area/station/medical/chemistry) "xgg" = ( /obj/structure/chair{ pixel_y = -2 @@ -66955,6 +68021,7 @@ /obj/effect/turf_decal/siding/red{ dir = 10 }, +/obj/machinery/airalarm/directional/west, /turf/open/floor/iron/white, /area/station/security/medical) "xgz" = ( @@ -67002,16 +68069,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"xgW" = ( -/obj/machinery/conveyor_switch/oneway{ - id = "QMLoad2"; - name = "Incinerator Conveyor"; - pixel_x = -13; - pixel_y = -4 - }, -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "xhe" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -67059,15 +68116,11 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"xhN" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/iron, -/area/station/science/robotics/augments) +"xhM" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/tcomms, +/turf/open/floor/circuit, +/area/station/tcommsat/server) "xhQ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -67119,50 +68172,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark/small, /area/station/service/chapel/storage) -"xiB" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/machinery/ecto_sniffer{ - pixel_x = -6; - pixel_y = 6 - }, -/obj/item/bodypart/arm/left/robot{ - pixel_x = -3 - }, -/obj/item/bodypart/arm/right/robot{ - pixel_x = 3 - }, -/obj/item/assembly/flash/handheld{ - pixel_x = 6; - pixel_y = 13 - }, -/obj/item/assembly/flash/handheld{ - pixel_x = 6; - pixel_y = 13 - }, -/obj/item/borg/upgrade/rename{ - pixel_x = 3; - pixel_y = 25 - }, -/obj/item/assembly/flash/handheld{ - pixel_x = 6; - pixel_y = 13 - }, -/obj/item/assembly/flash/handheld{ - pixel_x = 6; - pixel_y = 13 - }, -/obj/item/bodypart/arm/right/robot{ - pixel_x = 3 - }, -/obj/item/bodypart/arm/left/robot{ - pixel_x = -3 - }, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) "xiE" = ( /turf/closed/wall/r_wall, /area/station/medical/virology) @@ -67174,12 +68183,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"xiJ" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/cafeteria, -/area/station/science/breakroom) "xiL" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -67216,17 +68219,17 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"xjm" = ( +"xjo" = ( +/obj/structure/cable, /obj/structure/disposalpipe/segment{ - dir = 10 + dir = 4 }, -/obj/structure/sink/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/corner{ dir = 8 }, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/dark/small, -/area/station/service/chapel/storage) +/area/station/science/lower) "xjq" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -67299,6 +68302,8 @@ /area/station/security/brig/entrance) "xkn" = ( /obj/structure/steam_vent, +/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) "xkt" = ( @@ -67345,24 +68350,6 @@ }, /turf/open/floor/iron/smooth, /area/station/service/greenroom) -"xkX" = ( -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 8 - }, -/obj/structure/table, -/obj/item/stack/medical/gauze{ - pixel_x = -2; - pixel_y = 7 - }, -/obj/item/stack/medical/gauze{ - pixel_x = 2; - pixel_y = 1 - }, -/obj/machinery/light/cold/directional/west, -/obj/item/radio/intercom/directional/south, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "xla" = ( /obj/structure/toilet{ dir = 8 @@ -67417,16 +68404,16 @@ "xlL" = ( /turf/open/floor/iron/white, /area/station/science/cytology) +"xlM" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/power/shieldwallgen/xenobiologyaccess, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/multilayer, +/turf/open/floor/plating, +/area/station/science/xenobiology) "xlP" = ( /turf/open/floor/engine, /area/station/science/xenobiology) -"xlQ" = ( -/obj/structure/closet{ - name = "Evidence Closet 2" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/security/evidence) "xlZ" = ( /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_command) @@ -67458,11 +68445,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"xml" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "xms" = ( /obj/effect/turf_decal/siding/red{ dir = 6 @@ -67503,6 +68485,12 @@ /obj/structure/closet/firecloset, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"xmL" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/effect/landmark/start/security_officer, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/security/lockers) "xmO" = ( /turf/closed/wall/r_wall, /area/station/maintenance/fore/greater) @@ -67555,15 +68543,6 @@ "xnE" = ( /turf/closed/wall/r_wall, /area/station/hallway/secondary/entry) -"xnQ" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "xnR" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /obj/effect/decal/cleanable/dirt, @@ -67586,14 +68565,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"xog" = ( -/obj/machinery/porta_turret/ai{ - dir = 4 - }, -/obj/machinery/light/small/directional/west, -/obj/machinery/status_display/ai/directional/west, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) "xok" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/central) @@ -67605,18 +68576,16 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron/smooth, /area/station/security/evidence) -"xoy" = ( -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/obj/effect/turf_decal/tile/red{ +"xoB" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white/side{ dir = 4 }, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/white/corner, -/area/station/hallway/secondary/exit/departure_lounge) +/area/station/science/xenobiology) "xoS" = ( /obj/effect/turf_decal/siding/thinplating_new/terracotta{ dir = 9 @@ -67635,11 +68604,22 @@ /obj/structure/transit_tube/station/dispenser{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) "xpf" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/station/maintenance/disposal/incinerator) +"xpg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/gulag_item_reclaimer{ + pixel_y = 24 + }, +/turf/open/floor/iron/dark, +/area/station/security/processing) "xpl" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -67656,6 +68636,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/lesser) +"xpp" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating_new, +/obj/effect/landmark/start/hangover, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/dark/herringbone, +/area/station/security/courtroom) "xpw" = ( /obj/structure/table, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -67680,13 +68669,6 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"xpM" = ( -/obj/machinery/light/cold/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/office) "xpR" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ @@ -67728,24 +68710,24 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/storage/tech) +"xqa" = ( +/obj/structure/cable, +/obj/item/kirbyplants/organic/applebush, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/bridge) +"xqd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/broken/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) "xqe" = ( /obj/structure/disposalpipe/segment{ dir = 6 }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"xqg" = ( -/obj/structure/disposalpipe/trunk, -/obj/structure/cable, -/obj/machinery/light/cold/directional/west, -/obj/machinery/firealarm/directional/west, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/siding/blue{ - dir = 9 - }, -/turf/open/floor/iron/white/small, -/area/station/command/heads_quarters/cmo) "xql" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/maintenance{ @@ -67789,26 +68771,9 @@ dir = 1 }, /area/station/command/bridge) -"xqx" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/structure/window/reinforced/tram/mid/directional/east, -/obj/structure/chair{ - dir = 1 - }, -/obj/structure/industrial_lift/tram, -/turf/open/floor/noslip/tram_platform, -/area/station/security/tram) "xqC" = ( /turf/closed/wall, /area/station/maintenance/hallway/abandoned_command) -"xqL" = ( -/obj/structure/window/spawner/directional/south, -/obj/structure/flora/bush/jungle/a/style_random, -/obj/machinery/light/small/directional/north, -/turf/open/misc/sandy_dirt, -/area/station/commons) "xqN" = ( /turf/closed/wall, /area/station/medical/chemistry) @@ -67818,13 +68783,6 @@ "xqW" = ( /turf/closed/wall/r_wall, /area/station/hallway/primary/starboard) -"xqZ" = ( -/obj/structure/cable, -/obj/structure/chair/stool/directional/north, -/obj/machinery/light/dim/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/security/prison/workout) "xrh" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/button/tram{ @@ -67849,6 +68807,13 @@ /obj/item/radio/intercom/prison/directional/south, /turf/open/floor/iron, /area/station/security/prison/workout) +"xry" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "xrz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -67883,6 +68848,15 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) +"xrZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/commons/storage/tools) "xsa" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -67928,14 +68902,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) -"xsz" = ( -/obj/machinery/porta_turret/ai{ - dir = 4 - }, -/obj/machinery/light/small/directional/east, -/obj/machinery/status_display/ai/directional/east, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) "xsF" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -68014,11 +68980,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/small, /area/station/security/office) -"xtk" = ( -/obj/effect/turf_decal/siding/thinplating_new/light, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/iron/smooth_large, -/area/station/science/robotics/mechbay) "xtI" = ( /turf/closed/wall/r_wall, /area/station/science/breakroom) @@ -68028,6 +68989,19 @@ }, /turf/open/floor/iron/white, /area/station/hallway/primary/starboard) +"xtP" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/window/spawner/directional/west, +/turf/open/floor/plating, +/area/station/ai_monitored/command/storage/eva) +"xtU" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/effect/landmark/navigate_destination/med, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "xtW" = ( /turf/open/floor/engine/vacuum, /area/station/science/ordnance/burnchamber) @@ -68130,13 +69104,6 @@ dir = 1 }, /area/station/science/research) -"xvd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/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/aft) "xvf" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68204,11 +69171,35 @@ /obj/structure/bed/maint, /turf/open/floor/light/colour_cycle/dancefloor_b, /area/station/maintenance/starboard/central) +"xwn" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/turf/open/floor/iron/dark, +/area/station/science/ordnance) "xwr" = ( /obj/effect/turf_decal/siding/thinplating_new/light, /obj/machinery/recharge_station, /turf/open/floor/iron/smooth_large, /area/station/science/robotics/mechbay) +"xws" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/research{ + name = "Research Division Access" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sci-entrance" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/turf/open/floor/iron/white/textured_half{ + dir = 1 + }, +/area/station/science/research) "xwu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -68228,6 +69219,15 @@ /obj/structure/barricade/wooden/crude, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"xwQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/white/line{ + dir = 10 + }, +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/smooth_large, +/area/station/science/ordnance/storage) "xwS" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/bed/maint, @@ -68262,6 +69262,11 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, /area/station/maintenance/port/lesser) +"xxB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) "xxE" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -68314,6 +69319,7 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron, /area/station/security/brig/entrance) "xya" = ( @@ -68321,18 +69327,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/engine) -"xyc" = ( -/obj/effect/spawner/random/vending/snackvend, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/hallway/primary/central/fore) "xye" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -68390,35 +69384,6 @@ }, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/lobby) -"xym" = ( -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron, -/area/station/security/tram) -"xyp" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/blue/full, -/obj/item/folder/white{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/paper_bin{ - pixel_x = 5; - pixel_y = 8 - }, -/obj/item/pen{ - pixel_x = 6; - pixel_y = 8 - }, -/obj/machinery/door/firedoor, -/obj/machinery/light/cold/directional/east, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "medlock"; - name = "Lockdown Shutters" - }, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/lobby) "xyx" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -68442,33 +69407,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor, /area/station/hallway/secondary/entry) -"xyS" = ( -/obj/structure/table, -/obj/machinery/light/cold/directional/south, -/obj/item/roller{ - pixel_y = 14 - }, -/obj/item/roller{ - pixel_y = 18 - }, -/obj/item/roller{ - pixel_y = 25 - }, -/obj/item/wheelchair{ - pixel_y = -3 - }, -/obj/item/wheelchair, -/obj/item/wheelchair{ - pixel_y = 3 - }, -/turf/open/floor/iron/dark, -/area/station/medical/paramedic) -"xyX" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/displaycase/trophy, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/smooth, -/area/station/service/library) "xyY" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/displaycase/trophy, @@ -68483,13 +69421,6 @@ /obj/structure/railing/corner, /turf/open/space/basic, /area/space/nearstation) -"xzf" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/turf/open/floor/sepia, -/area/station/maintenance/aft) "xzg" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 8 @@ -68565,30 +69496,10 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) -"xAk" = ( -/obj/structure/cable, -/obj/item/kirbyplants/photosynthetic, -/turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) -"xAl" = ( -/obj/structure/table/wood, -/obj/machinery/computer/libraryconsole{ - dir = 4 - }, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/wood/parquet, -/area/station/service/library) "xAm" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) -"xAq" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/wood/parquet, -/area/station/service/library) "xAv" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -68635,6 +69546,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"xAV" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/dark/side, +/area/station/hallway/primary/central/fore) "xBe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -68643,15 +69566,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark/smooth_large, /area/station/ai_monitored/turret_protected/ai_upload) -"xBp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/cold/directional/east, -/obj/machinery/status_display/ai/directional/east, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) "xBr" = ( /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/broken_floor, @@ -68669,6 +69583,13 @@ dir = 1 }, /area/station/hallway/secondary/entry) +"xBF" = ( +/obj/structure/table, +/obj/item/storage/fancy/donut_box, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) "xBK" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -68707,10 +69628,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/service/cafeteria) -"xCw" = ( -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/iron/dark, -/area/station/security/prison/workout) "xCz" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/spawner/random/maintenance, @@ -68733,6 +69650,9 @@ /turf/open/floor/iron, /area/station/security/execution/transfer) "xCT" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, /turf/open/floor/iron/dark/smooth_edge{ dir = 8 }, @@ -68837,6 +69757,8 @@ /area/station/maintenance/starboard/central) "xEv" = ( /obj/structure/sign/departments/holy/directional/west, +/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) "xEC" = ( @@ -68855,6 +69777,30 @@ }, /turf/open/floor/plating, /area/station/science/ordnance/freezerchamber) +"xEW" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe/epinephrine{ + pixel_x = 3; + pixel_y = -2 + }, +/obj/item/reagent_containers/cup/beaker/cryoxadone{ + pixel_x = 6; + pixel_y = 10 + }, +/obj/item/reagent_containers/cup/beaker/cryoxadone{ + pixel_x = 9; + pixel_y = 3 + }, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -6; + pixel_y = 13 + }, +/obj/item/wrench/medical{ + pixel_x = -5 + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/small, +/area/station/medical/cryo) "xFd" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68966,18 +69912,6 @@ /obj/item/reagent_containers/cup/glass/drinkingglass, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) -"xGQ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet/lone, -/area/station/service/theater) -"xGS" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "xGT" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -69004,32 +69938,22 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) +"xHc" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/machinery/light_switch/directional/east, +/obj/machinery/computer/message_monitor{ + dir = 8 + }, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/server) "xHd" = ( /obj/effect/turf_decal/siding/thinplating/terracotta{ dir = 8 }, /turf/open/floor/iron/terracotta/small, /area/station/security/checkpoint/escape) -"xHl" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-entrance" - }, -/obj/machinery/door/airlock{ - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) -"xHm" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 8; - id = "com_guest"; - name = "Privacy Shutter" - }, -/turf/open/floor/plating, -/area/station/command/corporate_suite) "xHv" = ( /obj/structure/disposalpipe/trunk{ dir = 8 @@ -69044,14 +69968,16 @@ /obj/machinery/camera/directional/south, /turf/open/floor/iron/smooth, /area/station/service/greenroom) -"xHw" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/modular_computer/console/preset/cargochat/medical{ - dir = 1 - }, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) +"xHB" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/table, +/obj/effect/turf_decal/bot, +/obj/machinery/light_switch/directional/north, +/obj/machinery/camera/autoname/directional/west, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/kitchen/small, +/area/station/hallway/secondary/service) "xHD" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -69078,12 +70004,6 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron, /area/station/security/tram) -"xHU" = ( -/obj/effect/turf_decal/caution{ - dir = 4 - }, -/turf/open/floor/iron/terracotta/small, -/area/station/security/checkpoint/escape) "xIj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -69137,6 +70057,21 @@ }, /turf/open/floor/iron/terracotta/small, /area/station/security/checkpoint/escape) +"xIC" = ( +/obj/structure/chair/sofa/bench/left, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"xID" = ( +/obj/structure/table, +/obj/item/paper/guides/jobs/engi/gravity_gen, +/obj/effect/spawner/random/bureaucracy/pen, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/plating, +/area/station/engineering/gravity_generator) "xIK" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -69205,6 +70140,13 @@ /obj/structure/broken_flooring/pile/directional/east, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"xJO" = ( +/obj/structure/flora/bush/large/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/obj/structure/sign/poster/official/random/directional/north, +/obj/machinery/status_display/evac/directional/east, +/turf/open/misc/sandy_dirt, +/area/station/commons) "xJR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/duct, @@ -69298,6 +70240,11 @@ }, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/escape) +"xKX" = ( +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/station/science/xenobiology) "xLc" = ( /obj/effect/spawner/structure/window, /obj/machinery/door/poddoor/shutters/preopen{ @@ -69396,10 +70343,12 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/command/bridge) "xMo" = ( -/obj/structure/frame, /obj/item/stack/cable_coil/five, -/obj/item/circuitboard/computer/arcade, /obj/effect/decal/cleanable/glass, +/obj/effect/spawner/random/techstorage/arcade_boards, +/obj/structure/frame/computer{ + dir = 1 + }, /turf/open/floor/eighties/red, /area/station/service/abandoned_gambling_den/gaming) "xMr" = ( @@ -69409,26 +70358,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"xMv" = ( -/obj/structure/tank_dispenser, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/north, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"xMA" = ( -/obj/machinery/portable_atmospherics/canister/anesthetic_mix, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/light/cold/directional/west, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron/white/small, -/area/station/medical/cryo) "xMK" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ @@ -69549,16 +70478,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/textured_half, /area/station/security/breakroom) -"xOJ" = ( -/obj/structure/cable, -/obj/structure/chair/sofa/right{ - dir = 4 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/machinery/light/cold/directional/south, -/obj/effect/landmark/start/paramedic, -/turf/open/floor/iron/dark, -/area/station/medical/paramedic) "xOM" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/mapping_helpers/broken_floor, @@ -69698,16 +70617,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/dock) -"xQl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/cold/directional/west, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/smooth, -/area/station/hallway/secondary/command) "xQr" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/station/engineering/supermatter) +"xQv" = ( +/obj/structure/cable, +/obj/structure/closet/secure_closet/hop, +/obj/item/hand_labeler, +/obj/machinery/computer/security/telescreen/entertainment/directional/east, +/turf/open/floor/iron/grimy, +/area/station/command/heads_quarters/hop) "xQw" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -69717,6 +70636,16 @@ }, /turf/open/floor/plating, /area/station/command/heads_quarters/hop) +"xQx" = ( +/obj/structure/table, +/obj/machinery/computer/security/telescreen/ordnance{ + pixel_y = 2 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/science/ordnance/testlab) "xQy" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -69732,6 +70661,14 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron, /area/station/engineering/break_room) +"xQD" = ( +/obj/structure/chair/wood/wings, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/structure/cable, +/turf/open/floor/stone, +/area/station/command/heads_quarters/captain/private) "xQI" = ( /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) @@ -69785,11 +70722,16 @@ "xRl" = ( /obj/structure/cable, /obj/machinery/iv_drip, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/power/apc/auto_name/directional/south, /obj/effect/turf_decal/siding/red, /turf/open/floor/iron/white, /area/station/security/medical) +"xRm" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/freezer, +/area/station/command/heads_quarters/captain/private) "xRq" = ( /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, @@ -69825,6 +70767,16 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"xRU" = ( +/obj/machinery/door/airlock/maintenance/external{ + name = "Command Storeroom" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/all/command/general, +/turf/open/floor/plating, +/area/station/maintenance/department/bridge) "xRV" = ( /turf/closed/wall, /area/station/hallway/primary/central/fore) @@ -69836,6 +70788,11 @@ /obj/structure/barricade/wooden/crude, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den/gaming) +"xRX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/graffiti, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "xRZ" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/grass, @@ -69871,6 +70828,13 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/engine, /area/station/science/cytology) +"xSw" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "xSx" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -69962,17 +70926,6 @@ /obj/effect/landmark/start/paramedic, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"xTI" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/white/corner{ - dir = 8 - }, -/area/station/hallway/secondary/entry) "xTO" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 1 @@ -69987,6 +70940,12 @@ /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor/flat_white, /area/station/science/cubicle) +"xTV" = ( +/obj/machinery/ai_slipper{ + uses = 10 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "xUg" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -70031,6 +70990,13 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) +"xUG" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "xUL" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -70083,12 +71049,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/dock) -"xVl" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/light/floor, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/dark/small, -/area/station/security/brig) "xVn" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, @@ -70117,13 +71077,6 @@ }, /turf/open/floor/plating/rust, /area/station/maintenance/department/engine) -"xVz" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Commons" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/textured_half, -/area/station/commons) "xVG" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -70187,20 +71140,6 @@ /obj/effect/turf_decal/tile/green/half/contrasted, /turf/open/floor/iron/dark, /area/station/medical/chemistry) -"xWn" = ( -/obj/structure/closet/secure_closet/detective, -/obj/machinery/requests_console/directional/north{ - department = "Detective's Office"; - name = "Detective Requests Console" - }, -/obj/machinery/computer/security/telescreen{ - dir = 4; - name = "Station Monitor"; - network = list("ss13"); - pixel_x = -26 - }, -/turf/open/floor/wood, -/area/station/security/detectives_office) "xWq" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/effect/turf_decal/stripes/white/line{ @@ -70264,16 +71203,6 @@ /obj/structure/sign/poster/contraband/random/directional/west, /turf/open/floor/light/colour_cycle/dancefloor_b, /area/station/maintenance/starboard/central) -"xWT" = ( -/obj/structure/chair{ - dir = 8; - name = "Judge" - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/courtroom) "xWW" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/blue, @@ -70284,8 +71213,24 @@ dir = 4 }, /obj/effect/spawner/random/trash, +/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/aft) +"xXr" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/hallway/primary/aft) "xXy" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -70359,31 +71304,16 @@ "xXT" = ( /turf/closed/wall, /area/station/maintenance/starboard/fore) -"xXV" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 1 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark/side, -/area/station/security/execution/transfer) -"xYd" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/mecha_part_fabricator{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/box, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) -"xYj" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "xYu" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/security/processing) +"xYz" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/weeds, +/obj/effect/gibspawner/human, +/turf/open/misc/asteroid, +/area/station/maintenance/starboard/greater) "xYD" = ( /turf/open/floor/grass, /area/station/service/hydroponics/garden/monastery) @@ -70417,23 +71347,24 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"xZg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/landmark/navigate_destination/det, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "xZh" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/closed/wall, /area/station/maintenance/port/fore) -"xZm" = ( -/obj/machinery/suit_storage_unit/medical, -/obj/effect/turf_decal/bot, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/iron/dark/small, -/area/station/medical/storage) "xZs" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/effect/turf_decal/siding/white, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/construction) "xZx" = ( @@ -70498,6 +71429,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"yap" = ( +/obj/effect/turf_decal/tile/dark_red{ + dir = 4 + }, +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/iron, +/area/station/security/tram) "yat" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/landmark/start/assistant, @@ -70509,13 +71447,15 @@ /obj/machinery/power/tracker, /turf/open/space/basic, /area/station/solars/port) -"yaF" = ( -/obj/structure/hedge, -/obj/machinery/status_display/supply{ - pixel_y = -32 +"yaE" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/dark_red{ + dir = 1 }, -/turf/open/floor/plating, -/area/station/cargo/storage) +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/north, +/turf/open/floor/stone, +/area/station/command/heads_quarters/hos) "yaG" = ( /turf/open/floor/wood/large, /area/station/service/hydroponics/garden/monastery) @@ -70524,23 +71464,9 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"yaJ" = ( -/obj/machinery/smartfridge/organ, -/obj/effect/turf_decal/siding/white, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/small, -/area/station/medical/morgue) "yaL" = ( /turf/closed/wall, /area/station/commons/vacant_room/commissary) -"yaO" = ( -/obj/machinery/light/cold/directional/east, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white/corner, -/area/station/hallway/secondary/exit/departure_lounge) "yaS" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/button/crematorium{ @@ -70655,6 +71581,12 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"ycq" = ( +/obj/machinery/modular_computer/preset/cargochat/science{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/science/research) "ycv" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 1 @@ -70662,62 +71594,12 @@ /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/noslip/tram_plate, /area/station/maintenance/department/medical/central) -"ycy" = ( -/obj/structure/broken_flooring/pile/directional/east, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"ycz" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/stack/sheet/mineral/coal{ - pixel_x = 6; - pixel_y = 13 - }, -/obj/item/stack/sheet/mineral/coal{ - pixel_x = 1; - pixel_y = 8 - }, -/obj/item/stack/sheet/mineral/coal{ - pixel_x = -2; - pixel_y = -1 - }, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "ycC" = ( /turf/closed/wall/r_wall, /area/station/command/bridge) "ycE" = ( /turf/open/floor/plating, /area/station/construction/mining/aux_base) -"ycF" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/dark_red{ - dir = 1 - }, -/obj/structure/table/reinforced, -/obj/machinery/recharger{ - pixel_x = -6; - pixel_y = 2 - }, -/obj/item/storage/box/teargas{ - pixel_x = 8; - pixel_y = 6 - }, -/turf/open/floor/iron/dark/small, -/area/station/ai_monitored/security/armory) -"ycL" = ( -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 1 - }, -/obj/machinery/chem_dispenser{ - layer = 2.7 - }, -/obj/machinery/light/cold/directional/north, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/iron/dark, -/area/station/medical/pharmacy) "ycS" = ( /turf/open/floor/wood/tile, /area/station/service/bar) @@ -70746,9 +71628,24 @@ }, /turf/open/floor/wood/large, /area/station/command/corporate_suite) +"ydk" = ( +/obj/machinery/computer/crew, +/obj/effect/turf_decal/siding/blue{ + dir = 9 + }, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/wood/tile, +/area/station/command/bridge) "ydt" = ( -/turf/open/misc/asteroid, -/area/station/maintenance/fore/greater) +/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/entertainment) "ydu" = ( /obj/structure/cable, /obj/structure/disposalpipe/sorting/mail{ @@ -70764,15 +71661,24 @@ /obj/structure/sign/poster/random/directional/east, /turf/open/floor/wood, /area/station/maintenance/port/fore) -"ydW" = ( -/obj/structure/bed/roller, -/obj/machinery/light/cold/directional/north, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/lobby) +"ydH" = ( +/obj/effect/turf_decal/box/corners, +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/obj/machinery/plumbing/input{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/science/cytology) "yea" = ( /turf/closed/wall, /area/station/service/chapel/office) +"yec" = ( +/obj/structure/girder, +/obj/effect/decal/cleanable/glass/plastitanium, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "yee" = ( /obj/item/kirbyplants/random, /obj/machinery/light_switch/directional/west, @@ -70841,12 +71747,6 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/tcommsat/server) -"yeC" = ( -/obj/effect/spawner/random/vending/colavend, -/obj/effect/turf_decal/bot, -/obj/machinery/computer/security/telescreen/entertainment/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "yeD" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -70931,6 +71831,12 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/engineering/storage/tech) +"yfs" = ( +/obj/structure/closet/l3closet/scientist, +/obj/item/storage/bag/xeno, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white/side, +/area/station/science/xenobiology) "yfA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, @@ -70960,13 +71866,16 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"yfP" = ( +/obj/machinery/modular_computer/preset/civilian{ + dir = 4 + }, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai) "yfQ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) -"yfX" = ( -/turf/open/floor/plating/rust, -/area/station/maintenance/fore/greater) "yfY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -70977,11 +71886,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security) -"yfZ" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/closet/firecloset, -/turf/open/floor/iron, -/area/station/hallway/secondary/dock) "yga" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, @@ -71019,13 +71923,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"ygG" = ( -/obj/machinery/porta_turret/ai{ - dir = 4 - }, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) "ygK" = ( /obj/structure/table, /obj/structure/window/reinforced/spawner/directional/west, @@ -71034,6 +71931,37 @@ /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/ai_monitored/turret_protected/ai_upload) +"ygP" = ( +/obj/structure/cable, +/obj/machinery/modular_computer/preset/engineering{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating/rust, +/area/station/maintenance/department/engine) +"ygU" = ( +/obj/structure/table/glass, +/obj/machinery/computer/records/medical/laptop{ + pixel_x = 1; + pixel_y = 10 + }, +/obj/item/clothing/gloves/latex{ + pixel_y = -8 + }, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = 6; + pixel_y = -5 + }, +/obj/effect/turf_decal/siding/red{ + dir = 5 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white, +/area/station/security/medical) "yha" = ( /obj/structure/cable, /obj/structure/table, @@ -71088,6 +72016,10 @@ /obj/structure/window/spawner/directional/north, /turf/open/floor/plating, /area/station/maintenance/department/engine) +"yhE" = ( +/obj/effect/landmark/tram/nav/immovable_rod, +/turf/closed/wall, +/area/station/maintenance/port/aft) "yhF" = ( /obj/machinery/door/firedoor, /turf/open/floor/iron, @@ -71141,6 +72073,12 @@ }, /turf/open/floor/iron/white/side, /area/station/hallway/primary/starboard) +"yis" = ( +/obj/structure/cable, +/obj/item/kirbyplants/random, +/obj/item/clothing/under/costume/griffin, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/port/aft) "yit" = ( /obj/structure/rack, /obj/effect/turf_decal/bot, @@ -71238,8 +72176,15 @@ "yju" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/fore/greater) +"yjD" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden/monastery) "yjE" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/engine) @@ -71267,24 +72212,12 @@ }, /turf/open/floor/stone, /area/station/command/corporate_suite) -"ykk" = ( -/obj/structure/cable, -/turf/open/floor/iron/white/corner{ - dir = 8 - }, -/area/station/science/xenobiology) "ykn" = ( /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/secondary/entry) -"yku" = ( -/obj/structure/table, -/obj/effect/spawner/random/food_or_drink/dinner, -/obj/machinery/light/small/directional/east, -/turf/open/floor/catwalk_floor/iron, -/area/station/maintenance/department/medical/central) "ykv" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/decal/cleanable/dirt, @@ -71294,29 +72227,6 @@ /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"ykE" = ( -/obj/structure/table/glass, -/obj/machinery/light/small/directional/south, -/obj/item/paper_bin{ - pixel_x = 4; - pixel_y = 3 - }, -/obj/item/pen{ - pixel_y = 5 - }, -/turf/open/floor/iron/white, -/area/station/science/auxlab/firing_range) -"ykI" = ( -/obj/structure/cable, -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 1 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/iron/dark/herringbone, -/area/station/security/courtroom) "ykL" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/ai_upload_foyer) @@ -71384,6 +72294,12 @@ "ylD" = ( /turf/closed/wall, /area/station/maintenance/starboard/greater) +"ylH" = ( +/obj/machinery/quantum_server, +/obj/effect/turf_decal/delivery, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "ylJ" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, @@ -71399,6 +72315,12 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/commons/fitness/locker_room) +"yma" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/alien/resin/wall, +/obj/structure/alien/weeds, +/turf/open/floor/wood, +/area/station/maintenance/starboard/greater) "ymd" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -71408,6 +72330,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"ymh" = ( +/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/plating, +/area/station/maintenance/starboard/greater) (1,1,1) = {" dDB @@ -79951,8 +80879,8 @@ buN byV bCu bCu -bCu -cgs +kSL +tXK jZl aJq aJq @@ -80203,7 +81131,7 @@ gnL dLC bfj ayK -xMv +sru buW bzf bCM @@ -80451,14 +81379,14 @@ xZV ayK aou xgB -biW +aHc bsz aHc dtH -lVF +leF uyE lJA -byW +jMo ayK pBy bvT @@ -80706,7 +81634,7 @@ xZV xZV xYG xYG -nig +wHh jef hlw diK @@ -80715,7 +81643,7 @@ dID tKO kYK dyH -mum +pEu ayK jZl jZl @@ -80791,17 +81719,17 @@ sck uPX pSs qyT -tCg +fNb tWx -tCg +fUb qyT rMm blb pSs qyT -tWx +fCf xxs -xHU +lQR xxs dDB rMm @@ -80963,7 +81891,7 @@ xZV xZV xZV xYG -tfH +dsL sFg xQr cFC @@ -80980,8 +81908,8 @@ rQi bFM bUX rQi -cAg -aNH +iFB +wuk rQi rQi aJq @@ -81057,7 +81985,7 @@ qyT rCv rCv wZp -reM +xxs xIA reM gZt @@ -81079,7 +82007,7 @@ dDB dDB blb dDB -dDB +wBQ dDB blb dDB @@ -81236,10 +82164,10 @@ bzs rQi bHW bUX -cuB +rQi cNy qLf -wUB +qsi rQi aJq aJq @@ -81296,11 +82224,11 @@ dDB dDB qyT qyT -pWv +ely qjk rCv uRe -rwQ +lgG scl syg tfy @@ -81313,12 +82241,12 @@ fyv vFD vZW rCv -xaA +mVC reM xKi reM mAL -qpO +dus qVP hop fmR @@ -81491,12 +82419,12 @@ bhc bng bzv rQi -cdi +bHW ctZ ccN cld aFA -fmm +kwz rQi aJq aJq @@ -81563,7 +82491,7 @@ snZ mni rQS rQS -rQS +aNZ rQS rQS dBH @@ -81572,14 +82500,14 @@ mni rQS jGN reM -aFq +oNv xZN mAL -dus +qpO qVP -hpQ +uFQ tIz -gHA +fFt hop rig fEC @@ -81596,10 +82524,10 @@ tYT cCE tYT fEC -aJq -aJq -tYT -tYT +ofZ +ofZ +fEC +fEC dDB dDB dDB @@ -81734,7 +82662,7 @@ cwg xZV xZV xYG -oAu +jKG tod vFW aAt @@ -81749,11 +82677,11 @@ jAw cdf rQi woe -bWQ +kxK rQi clH fIr -wUB +qsi bNq knv knv @@ -81786,7 +82714,7 @@ ixX jhC lOj hMw -hYA +rgo imS lOj lOj @@ -81834,7 +82762,7 @@ rSi eUH rvD qVP -uFQ +hpQ afu fFt kyr @@ -81853,11 +82781,11 @@ qkK cFS qkK fEC -aJq -aJq -vmL -tYT -tYT +wCz +vAD +roq +fEC +fEC tYT tYT aJq @@ -81991,7 +82919,7 @@ xZV xZV xZV xYG -tfH +rVV acn iuu iey @@ -82008,8 +82936,8 @@ rQi bIW bVs rQi -gTf -cgB +frq +rsP bNq bNq wMC @@ -82046,10 +82974,10 @@ hMH hNA inT lOj -lev +tqE lwI lOj -mnv +jaN kdH kmo ouN @@ -82058,9 +82986,9 @@ ouN oQr kdH pZu -yaF +jxJ slw -qPr +dDd sob rEL rXm @@ -82110,11 +83038,11 @@ kCo peR dyW fEC -aJq -tYT -tYT -vmL -tYT +eHN +vAD +vAD +roq +fEC vmL aJq aJq @@ -82248,7 +83176,7 @@ xZV xZV xYG xYG -rVV +dcg vkk xQr xmb @@ -82259,8 +83187,8 @@ aUQ lOh xYG rQi -bnu -bwH +bGT +cwR rQi cZM bGP @@ -82317,7 +83245,7 @@ kdH pHo pZz slw -qPC +qtJ rho tyD rXr @@ -82332,11 +83260,11 @@ snZ snZ syh jch -thq +wZS tCm onw jeV -yaO +gun mKD snZ hxQ @@ -82348,7 +83276,7 @@ lvc eVI vVo qVP -jfT +fyz kgZ kUf fCp @@ -82367,12 +83295,11 @@ qXB tmT qXB fEC -aJq -tYT -vmL -tYT -vmL -aJq +eHN +uhq +tXl +vAD +num aJq aJq aJq @@ -82381,6 +83308,7 @@ aJq aJq aJq aJq +pRb dDB dDB dDB @@ -82511,7 +83439,7 @@ coA hzi bEG leh -dsr +lkU aVj bJL iQv @@ -82564,13 +83492,13 @@ lfU lxd lPi pJm -kde +oRZ nJU ppk -uzJ +eAf ovQ oRr -poc +phj pJm pZK npA @@ -82584,11 +83512,11 @@ mhk tzq mhk mhk -uRx +aRa onw onw onw -wgu +gdn qyT tDb ttX @@ -82621,15 +83549,14 @@ vFy vGU rOG hbm -nth +aZw vSW fEC -vmL -tYT -vmL -vmL -gcs -aJq +iBE +uhq +tXl +roq +fEC aJq aJq aJq @@ -82638,6 +83565,7 @@ aJq aJq aJq aJq +pRb aJq aJq aJq @@ -82761,13 +83689,13 @@ aJq xZV xZV xYG -bze +gLx aOP aSd qoh pvg uZR -wXd +uYy ejH alx vVE @@ -82787,7 +83715,7 @@ ecq bNq knv cSv -dcm +duF duF ybO vmL @@ -82814,7 +83742,7 @@ iVL jig lOj hNZ -kdS +thM kuy lOj lgT @@ -82824,7 +83752,7 @@ uzJ mQh nJU ppk -odN +uzJ ovQ oRr poM @@ -82833,7 +83761,7 @@ mKB npA nFh riV -oyU +uQR mhk spW ozn @@ -82851,14 +83779,14 @@ tDE tWQ unM qyT -pSA -bUJ -rkY -xoy +sbx +lgj +kzv +hky xUg reM xKQ -oVi +qNL reM reM qVP @@ -82879,14 +83807,13 @@ qVP wmV cpH tqo -tqo +hzV +eHN +iBE +roq +roq +roq fEC -vmL -vmL -vmL -vmL -gcs -aJq aJq aJq aJq @@ -82895,6 +83822,7 @@ aJq aJq aJq aJq +pRb aJq aJq aJq @@ -83018,7 +83946,7 @@ aJq xZV xZV xYG -jju +qEj aOZ ayK ayK @@ -83027,11 +83955,11 @@ gRc ayK ayK bDP -bKk +ljk naw rQi cTd -cEQ +hdk rQi yjg bWZ @@ -83041,11 +83969,11 @@ dHC knv ecq cGy -cGy +iUq cLB cSz dcG -duH +piT dRm enB xae @@ -83069,12 +83997,12 @@ slY ueX slY ueX -slY -ueX -slY -slY -slY -slY +nFo +oCG +nFo +nFo +nFo +nFo lxy hzm jTA @@ -83086,7 +84014,7 @@ owl oSb ppk mjQ -pZP +vFQ npF mhk riZ @@ -83136,7 +84064,7 @@ qVP fEC cpH fEC -tqo +hzV fEC qVP fNu @@ -83275,8 +84203,8 @@ aJq aJq xZV ayK -anz arJ +bnc ayK kBq aQy @@ -83297,7 +84225,7 @@ hln dIm dQY ecq -epA +dMj hju dEt cSY @@ -83305,7 +84233,7 @@ ddj dvb cwf eop -eGt +tTR fcD fta xae @@ -83324,15 +84252,15 @@ slY gOK slY hfc -slY -hsX jBb -kPW -kwY -lQq -kOA -slY -lzn +iNE +nFo +ach +lKH +ylH +nEl +ejq +tvN lRc moz kee @@ -83354,7 +84282,7 @@ mhk pMg pYE vzP -vxf +aWw vkG xYD xPR @@ -83383,9 +84311,9 @@ nbL cRm qVP qCU -biq +lgp qwq -bCz +gAR vTV rJW suw @@ -83393,15 +84321,15 @@ qVP nHu dpt tvZ -tqo +hzV efr qVP -vQj -qmv +ets +eva hXU -rNY +dUA vUM -jAS +sbW cGj rtQ aJq @@ -83538,7 +84466,7 @@ ayK xua aAE aKm -aNB +vtV aQI aVz yjE @@ -83550,11 +84478,11 @@ yjE uYG djC bNq -dvR +hDn dIe dRE ecF -cIe +wpE hjT ioQ eQe @@ -83581,15 +84509,15 @@ slY gPN gZk iNE -ueX -htt kwY -slY -slY -kwY -slY -slY -kzF +kPW +nFo +tPZ +rPx +cvP +rWP +bCh +jWA lTv oem oem @@ -83608,7 +84536,7 @@ udt rXw sqz mhk -pMi +yjD xYD rLT qCg @@ -83616,9 +84544,9 @@ qZB cPd wWa xYD -wly +quJ wAW -wXk +hDT glM xOS wEG @@ -83653,12 +84581,12 @@ vxm fEC tqo qVP -iIU +niR grn lSI lce vKU -pTr +lPO vfc rtQ rtQ @@ -83797,7 +84725,7 @@ aBs aKG omJ yjE -aWE +vSm yjE bUk yfa @@ -83807,17 +84735,17 @@ yjE lSh djE ecq -dwz +vDA dIm dSd bNq -pJh +wHa hhR ieu eQi fbq dxP -dTu +oYJ eoY xae xae @@ -83838,14 +84766,14 @@ slY gPN slY hff -jCo -hff -jCo -slY -kfA -lQq kPW -iUG +hfc +nFo +hNv +lbF +lLq +nyf +ejq jkS lTN mRD @@ -83901,9 +84829,9 @@ btv mxg nPu vTV -rwK +ekr tVe -eEN +geW qVP qVP cWo @@ -83911,7 +84839,7 @@ rOG sLB qVP pBN -tko +geJ hXU pOw dkI @@ -84069,11 +84997,11 @@ dJh dTm bNq wXM -evH +vna kUl cTr ddk -dyi +eYm hYC vmL cMq @@ -84097,13 +85025,13 @@ slY jCo slY slY -jCi -slY -slY -slY -slY -slY -kzF +nFo +nFo +nFo +nFo +nFo +nFo +kZB lUz ohj ohj @@ -84116,7 +85044,7 @@ lWY mkF mLk nsL -qSG +kVn srn uSM rYv @@ -84134,7 +85062,7 @@ wlF wzk tDJ blq -uot +cNu yea vmH yea @@ -84158,10 +85086,10 @@ bvK skS mIT vTV -fBR +yaE tVe cDb -gSa +fuj qVP rpV fEC @@ -84170,10 +85098,10 @@ qVP hXU hXU hXU -pjO +fbG qBT uRJ -kJN +rcg lzM ndA qWd @@ -84307,8 +85235,8 @@ aJq aJq aJq ouj -vCd -aLe +eMV +aOE mQB dSD dSD @@ -84352,8 +85280,8 @@ sjq sNz hyO roi -slY -huc +jCi +nPX hAN jMb kzI @@ -84363,12 +85291,12 @@ iUN jlv sRR odX -odX +fts nyE uzJ -oih +axj uzJ -lFU +azK qby mkO mMt @@ -84404,12 +85332,12 @@ gLR qVP blb xkt -bCr -trK -iAt -pon -voX -fQo +tzx +iXB +cVx +xeV +hbu +cHp syk bKE uyH @@ -84429,8 +85357,8 @@ bVI oJE kgh uRW -anH -lHj +kxO +lwc lzM xDM acO @@ -84569,7 +85497,7 @@ vxt vxt wyt aXR -wyc +vxt cIy cIy fch @@ -84582,8 +85510,8 @@ cmA dJp dVu efe -cIs -cLc +pAx +tfC cMB eQz deB @@ -84635,7 +85563,7 @@ mhk xmI pbu mhk -qDr +mYS xYD xPR uXN @@ -84670,7 +85598,7 @@ fpl oKz wYW pds -nOO +kPa vTV tjQ ddE @@ -84847,7 +85775,7 @@ dfB dAl dUT epq -dTu +oYJ ffs eGt fHQ @@ -84876,16 +85804,16 @@ rST iVI jmK jHB -jVQ +gxL wuM -kpw +bKz kFg kRJ llD lGk uKP wCI -mMz +swV mhk nFY mhk @@ -84918,12 +85846,12 @@ wmV qVP blb xkt -vsC +pXB rty gKC eJh noT -ycF +aLk syk lCt sKE @@ -84932,7 +85860,7 @@ vTV goE rAy loL -vKB +fvF qVP dpt fEC @@ -84990,12 +85918,12 @@ tDn tDn enE xAG -nFv +uRR vZb hJC aHJ -cZP -ioy +wmy +tBm xjz xjz blb @@ -85142,7 +86070,7 @@ tca lGT lWR mlr -mMF +nxJ mhk xYJ xYJ @@ -85150,7 +86078,7 @@ tYL pbu mhk mhk -pNh +oqE qbr hNT yaG @@ -85173,26 +86101,26 @@ uAi fEC rui qVP -blb +qop xkt -uLE +nKf mVt gJa huN jBr -skO +qaH syk nDx iLc -twz +dXo vTV -jcS +iWj fSE ftm -uxD +lfi qVP nGA -ubU +lXC iSK aVX tTg @@ -85200,7 +86128,7 @@ qbq xsf vRd ccD -rSS +yap lzM ezE aFR @@ -85211,9 +86139,9 @@ aFR aFR aFR rtQ -kaI +ius dRk -aza +nlV toT kaI tlI @@ -85225,18 +86153,18 @@ jqs jYv nlV sGp -tKD +tij qQo -uEI +oBo lzM -alT qBi qBi qBi +lTs +qBi qBi qBi qBi -wuV xAG pGR tDn @@ -85244,8 +86172,8 @@ jZJ cHR jZJ tDn -dfs -pGR +wVI +kEL nNB wbk iWe @@ -85350,11 +86278,11 @@ dbh bzM ybO lPf -fKo +hYN dWx egk lPf -aDA +iqH eHS eSF dgr @@ -85399,7 +86327,7 @@ lme lHe lWU tca -mNh +mCb mhk xZd mhk @@ -85419,7 +86347,7 @@ xRZ wAZ wXk xgN -oSY +utg kar vnr vIh @@ -85430,10 +86358,10 @@ xjU fEC kJJ qVP -blb +wiP xkt kJp -iNK +pJx xkt ntf uMT @@ -85461,10 +86389,10 @@ rBE lzM aFR hYz -vie -obW -obW -lLu +gkO +aPe +aPe +jEX jUN aFR kGC @@ -85502,14 +86430,14 @@ qdv bSH tDn eua -fQI +eax xAG jWd lGO ufU hyX tBm -ioy +tBm uby gzF gzF @@ -85605,7 +86533,7 @@ mcx ybO vfA tly -eUX +jgZ lPf fLz auB @@ -85644,19 +86572,19 @@ ueX ibe ipP rST -ihy +eeb lzU dfN -msi +pJn wuM -kpS +pwJ uSG kSO gNC lHk lXf mlE -bhL +efS mhk qTJ mhk @@ -85676,7 +86604,7 @@ tdg wBm wXk bVv -xOS +pca rQC von vRe @@ -85687,14 +86615,14 @@ tAu fEC rui qVP -pca +rui qVP llW llW xkt nNb ejc -urw +dah urw urw rzG @@ -85703,8 +86631,8 @@ cFg hWJ htV ild -oeG -sDo +voJ +qxv apk sUZ pYY @@ -85714,7 +86642,7 @@ xte xHK dwa dBr -pJK +eWB lzM aFR vNj @@ -85862,9 +86790,9 @@ eeg fUL bMN tly -dso +fzc lPf -cqo +lAF yic iTG eqS @@ -85893,7 +86821,7 @@ blb dDB slY ohb -gFI +slY ueX pBV mDC @@ -85924,16 +86852,16 @@ xLO mhk tCk uaE -qDu +uty rbh -uZt +tTG sdg -qZB +tEU hpP wAW mdU xhe -qXQ +oMF yea vrf von @@ -85947,16 +86875,16 @@ wmV rui qVP hiq -lUV +beK gEH -uUV +rNn iWE tAs tAs qGH vkS -uTT -tAs +ohk +chU poU xXM gZU @@ -85971,14 +86899,14 @@ vYO xOE psS tRE -ckH +vzY lzM aFR ryj -qLl +eTq cID cID -xqx +oXh gXd aFR kGC @@ -86015,7 +86943,7 @@ qdv rwP yca tDn -daT +uug xwT wTm eJw @@ -86023,7 +86951,7 @@ bwE eJw aVZ tyh -hXJ +tyh vXs iob gzF @@ -86121,7 +87049,7 @@ bNg tly dsq lPf -fMi +pFN wKD cAC eqS @@ -86132,7 +87060,7 @@ djj dBi dWI eqX -dTu +oYJ fjK eGt fMN @@ -86154,7 +87082,7 @@ slY hlA qbu qbu -jQM +owQ slY rFa rTD @@ -86162,7 +87090,7 @@ iWb jnn jHE bDN -kex +qto kpT kFD kTp @@ -86188,7 +87116,7 @@ sdQ mhk mhk wAW -wWr +wDJ xhH rje yea @@ -86203,7 +87131,7 @@ fEC fEC rui qVP -xlQ +hcG jnN gEH nDe @@ -86236,24 +87164,24 @@ tpm jeh jeh tpm -ntl +tpm lzM rtQ dwr tvM -hxW -uFk +jXQ +qfv fca qcX -lqS -iTj +vAC +sye uFk -dsm -fyW +aGy +qcX rMt hRX -uFk -pbe +qfv +wYK mTQ qDO lzM @@ -86263,7 +87191,7 @@ tpm jeh jeh tpm -ntl +tpm lzM xAG nyx @@ -86275,7 +87203,7 @@ tDn xjG oBB hqS -fzS +cuh qQv tOX pDu @@ -86283,7 +87211,7 @@ jqZ pDu pDu eJw -mCV +euq gzF eGL eGL @@ -86374,9 +87302,9 @@ dzT bpm dWp ybO -dcp +lcU tly -eVb +nSz lPf fNk glB @@ -86460,30 +87388,30 @@ pIw fEC wmV qVP -qyO +cvZ hCE oUN tux jGd xFe -ihm +rIb vDQ wrO -ogE +xNh xFe -vgD +dqX bCG slx xtg keb -xpM +vBK xsf dEu nCY fyo wAb xsf -hZd +cmX vzV jrT hZT @@ -86494,7 +87422,7 @@ uMu uMu vKG vKG -ulr +hvV rtQ lzM vmL @@ -86514,14 +87442,14 @@ dDB dDB rtQ rtQ -gDV +jHq vKG nne oKy nne nne bVB -skf +cwL xAG pSd xAG @@ -86540,7 +87468,7 @@ xPk xPk epu tyh -oVb +pRF xik bwz vzA @@ -86633,12 +87561,12 @@ eiK ybO bNJ xif -eXx +eVb lPf sKX gNh ybO -nxt +vkw hpc cNw hVO @@ -86668,14 +87596,14 @@ iNL kPW jlb qcU -bia +gDR rjP rFW bCZ lkG jns sSA -qMX +wcP qDP uuN yjc @@ -86705,12 +87633,12 @@ wDV tET glM xFO -yeC +dyq yea vKa wgM guY -xjm +xdD pYG kEO pwN @@ -86724,7 +87652,7 @@ dyO tJe xFe hMr -ifh +xmL wrO vHu xFe @@ -86736,7 +87664,7 @@ yjr aTq wuc trp -bGs +hhl trp trp wuc @@ -86744,10 +87672,10 @@ wuc bKN tww lzM -udW +rDP uMu imC -lJk +tHp dkz vKG vKG @@ -86771,10 +87699,10 @@ blb blb blb rtQ -usI +tEt pzA abJ -vKG +voj vKG tsf vKG @@ -86922,10 +87850,10 @@ ueX slY ohl slY -iYs +qBb kkl ydA -rnJ +uav slY rGq rUt @@ -86969,7 +87897,7 @@ xle xle xle xKx -uMk +kte yaS fEC wmV @@ -86985,7 +87913,7 @@ xGT wrO xNh xFe -jHm +nhP afl dDQ utP @@ -86998,16 +87926,16 @@ trp edK wEW wuc -pvh -lQG +vAx +ira lzM -mRj +aPM uMu -ulI +cwL lzM kaW fbt -vUt +vKG rtQ rtQ lzM @@ -87059,7 +87987,7 @@ egb iGE mlN fiD -eoj +xGL eGL dDB dDB @@ -87159,7 +88087,7 @@ eTL eTL fnp dXK -eru +tfl hYC fjS xae @@ -87190,7 +88118,7 @@ llN jqu sSU tBe -rne +hEi kqQ uUb wuM @@ -87208,21 +88136,21 @@ mhk xIl mhk mhk -qlU +nwS ozo dOv rAD yfC -vTj -sOm +hAd +enD thv tEW blq uoW xle xle -xWn -whp +slZ +nGd wAj xle qvQ @@ -87247,7 +88175,7 @@ wZX fho erZ yjr -lVl +nFJ wuc gFD sos @@ -87260,11 +88188,11 @@ aNk lzM pVN uMu -lJr +voe lzM eqg -lcK -vKG +ony +jAR qYn aWc irp @@ -87416,8 +88344,8 @@ cUd dkW fnp dXT -esc -eJp +wsL +uYx vpl tJO fNA @@ -87446,7 +88374,7 @@ rVQ oFi jqA lUT -ggn +pih mTl kqW kFJ @@ -87465,7 +88393,7 @@ mhk nlu pOb mhk -kqi +gzj uye uTh rBb @@ -87555,17 +88483,17 @@ lQA xAG rHT nPH -uxG +wWR pzy dSu oQF oQF -fAt +cJz wpy -xXV +skc tYq -pZm -nxc +tey +lsY wjZ eaT pDu @@ -87674,7 +88602,7 @@ dll fpk fAZ fHn -eKT +cwf flg ftZ fOn @@ -87753,7 +88681,7 @@ qwC uFw nQa tdx -uDv +ojD uDv eyB wEV @@ -87766,11 +88694,11 @@ wuc vJH rfe wuc -qyH +wpw ufg ufg ufg -uDE +fWs wuc lzg tsf @@ -87787,7 +88715,7 @@ trp trp trp trp -trp +yhE trp trp trp @@ -87830,7 +88758,7 @@ vJL lfe bhv vXi -xGL +bZs eGL dDB dDB @@ -87960,12 +88888,12 @@ sjq sjq syx jIh -ton +csA jhs kso kHH kYG -lnU +pep lJY uSM naE @@ -87985,11 +88913,11 @@ rdo rBG yfC cpc -jAe +iwa yfC wWT jjS -xOS +xZg lBN vOP ixl @@ -88010,15 +88938,15 @@ daq xFe yhk dYc -lnc +nlf yjd xFe -nnK +woP nhu jbV dOd nVs -btQ +lrP wuc iVJ peu @@ -88029,7 +88957,7 @@ jpm oAn ufg wuc -xym +vmS dOg xHO wuc @@ -88047,7 +88975,7 @@ xAR fos xAR xAR -hDP +xAR trp dDB dDB @@ -88057,7 +88985,7 @@ dDB dDB wum wum -wSG +ohu xgw gMs rrQ @@ -88079,7 +89007,7 @@ lTt slp tbb lwp -gjm +wwm wjZ lka rYG @@ -88087,7 +89015,7 @@ txN mbn ayV qRG -gEB +qRG eGL dDB dDB @@ -88183,7 +89111,7 @@ gJN oyx gwf los -dDU +ybO cwf cwf dZd @@ -88218,10 +89146,10 @@ skW wOM jpR ueX -uld +kDV uxd xaZ -kZg +dZm slY lKt tYL @@ -88233,16 +89161,16 @@ oaa mhk oTH mhk -gui +xHB pOK -eWd -wFy +sDD +iEX yfC -rdC +aws fMD sdT vTN -say +aws yfC lzv glM @@ -88251,15 +89179,15 @@ xle uVn vKV wjG -wBr +wPh xle xxV xOP hDN dcc vRC -bGC -aia +iqG +aRD ygF hDN ylR @@ -88282,13 +89210,13 @@ sos wuc mqH tiW -qjE +geb bRr ufg wuc iai uoi -lRG +bzL wuc gqg trp @@ -88313,7 +89241,7 @@ dDB dDB dDB oCq -uYY +vnq wmS fCu amE @@ -88322,10 +89250,10 @@ xCS xIj ohR eoz -uLq +eoz tTW -wRV -kSA +wvg +tMS xIj vfN xCS @@ -88428,8 +89356,8 @@ sZu bKu cpt yjE -pXg -bAk +czy +eyi dOq dOq jcF @@ -88490,10 +89418,10 @@ rkR mhk mhk mhk -sNX +sbt uAV tDT -udU +fDp yfC hwe rBN @@ -88524,18 +89452,18 @@ jXC xYu qFh veP -ooT +klH mLp mWY xFw -vuO +tuk myt -cUo +jaQ jWs lnz wuc xul -txp +rJJ wuc ufg tiW @@ -88543,9 +89471,9 @@ qjE bRr ufg wuc -cAB +jHa cfT -ubq +iMC wuc xAR trp @@ -88553,13 +89481,13 @@ kiG iVJ coH trp -wyA -xul -pND +mPv +aGU +wqD trp -mgk -qOv -gem +qVz +sdC +eEl vJH xAR trp @@ -88572,7 +89500,7 @@ dDB oCq gUG fwJ -hmC +iDv qPN qPN qPN @@ -88588,11 +89516,11 @@ qPN qPN qPN qPN -fAt +cJz wpy -eaf +hTZ tYq -hvG +sCu nQP wjZ qeP @@ -88687,7 +89615,7 @@ dAS yjE mfK iHy -eyo +eoG dmw hDX dyG @@ -88752,7 +89680,7 @@ tDP qbC lsJ yfC -uTk +jKh fMD vBm vTN @@ -88797,7 +89725,7 @@ wuc ufg iVY ptN -psf +mcv ufg wuc wuc @@ -88810,13 +89738,13 @@ ujr rKv dYp trp -fDz +sVL xul knJ fAr -sBa +oNM qOv -rLv +hUT vJH xAR trp @@ -88827,7 +89755,7 @@ dDB dDB dDB oCq -rrA +iAZ rPT xRl qPN @@ -88845,7 +89773,7 @@ wbf prq mTP qPN -kXe +dTa ccs kPk wjZ @@ -88944,9 +89872,9 @@ tWj cAh cLn blb -blb +iYJ fPb -fas +dUr dzl fQN wBo @@ -88960,7 +89888,7 @@ qbB fBe fIg eLL -fod +qOi ffs eGt gjT @@ -88972,7 +89900,7 @@ blb blb blb sRg -hAS +cJT eEq sRg gQG @@ -88992,7 +89920,7 @@ jWt mTr ktc nSY -oiK +nYQ mhk oUO mhk @@ -89007,7 +89935,7 @@ wCR uej wms qbK -ifj +jza yfC hwe fMD @@ -89015,7 +89943,7 @@ aws vTN vST yfC -wWT +ijm jte xOS par @@ -89028,8 +89956,8 @@ wId dtj hDN vSu -xjg tPf +xjg kXo sdf hDN @@ -89040,9 +89968,9 @@ wJK rVT gCq xrk -uoS +bEE +vZm vZm -wAx qIp jaQ dHE @@ -89067,13 +89995,13 @@ etx fwS ePg trp -lib +jRx knJ xul mxM iaZ cSD -chF +jwC vJH xAR trp @@ -89085,7 +90013,7 @@ dDB dDB wum wum -fVM +ygU iBj qPN noS @@ -89115,7 +90043,7 @@ oPV cgb vEb eHf -apy +qsR eGL dDB dDB @@ -89212,8 +90140,8 @@ hYC rZh toL ecQ -nST -dEK +wib +pIn iwM iJx eNb @@ -89236,7 +90164,7 @@ oQM hbI hgd fBl -pHi +xrZ sRg xat xat @@ -89249,7 +90177,7 @@ pOg kft ktM kIe -las +otG mhk xen ptk @@ -89266,13 +90194,13 @@ tbq qcl uej yfC -rdC +aws rBQ aws vTN say yfC -nGv +rjH glM xOS uJD @@ -89282,7 +90210,7 @@ kFs jsS iAM wId -gJt +puY vEP qVV qVV @@ -89293,7 +90221,7 @@ qVV fWw qlc xur -qKD +nGi yaU xsF xLl @@ -89302,17 +90230,17 @@ bCf xur xLl xur -nBo +xpg xzE wuc psX mag wuc -qLy +qjT ufg -dWm +eVd ufg -bLW +yis wuc kmT xAR @@ -89321,16 +90249,16 @@ trp kfC trp kIn -sgT +nvL oRP trp -aqV +xIC knJ nFu mxM gTk jMv -chF +jwC vJH xAR trp @@ -89363,7 +90291,7 @@ hyi aRI oQF oQF -hjq +brb muS muS lub @@ -89581,13 +90509,13 @@ trp trp trp trp -mPv +gEe bbU knJ fAr -dDW +qVz qOv -qfQ +eEl vJH xAR trp @@ -89602,7 +90530,7 @@ dbY kgu wOl uhu -rEe +aen gGB pNz wyb @@ -89610,7 +90538,7 @@ xJz wWS wyb jLB -mZR +sMq vUg eFy rBy @@ -89624,7 +90552,7 @@ muS muS lrE ihZ -vCx +mJZ txN wcV vEa @@ -89708,7 +90636,7 @@ aJq aJq vxt aTd -bbj +ygP bem sWm rRp @@ -89786,17 +90714,17 @@ sel rDy uWB yeu -tFg +eTt tXT wHE qnz vtc vLf -jRh +wZd sWJ xkg sxL -pNS +jKm vEP wXC rpo @@ -89831,7 +90759,7 @@ eOt cYd eOt kEe -xvd +lxT iZF vRt vUf @@ -89842,9 +90770,9 @@ vUf vAU caE trp -eYQ -qOv -nXL +oNM +iRp +hUT vJH xAR trp @@ -89862,7 +90790,7 @@ wRa xXJ wtr lkR -vVS +hrO wtr skn wsG @@ -89873,7 +90801,7 @@ tJi leC lfC rUd -ihZ +eHs qeP kWk qeP @@ -90021,7 +90949,7 @@ xRV kuq msq laD -oAD +gSX mhk wht mhk @@ -90046,7 +90974,7 @@ pxl wXO xjh alh -oio +slM tJz vLC rJH @@ -90057,8 +90985,8 @@ oZi vEP uQu dYD -jrb -cEJ +ePV +uES czV qVV yfY @@ -90126,9 +91054,9 @@ tHK fUT wbf wbf -ced +eTr wtr -skn +mtP hXY ihZ qxn @@ -90226,7 +91154,7 @@ tpH tTd pJg vxt -xgW +fJO awi fZq yfa @@ -90236,9 +91164,9 @@ yjE yjE yjE vxt -hOy +jpJ eUi -eKY +bcc eUi feq dIt @@ -90257,25 +91185,25 @@ qtG qtG qtG hem -hBw +cks hCX gKU gRe iCw jDP -hnr +wyg hvy -hBg +ayn xRV xRV xRV xRV smV lCg -pqI -jXk +dbR +rBh xRV -kuv +iLF kJb laL loj @@ -90313,7 +91241,7 @@ eAX lbO ybJ fbe -wTX +hBW wTX kIQ kIQ @@ -90353,7 +91281,7 @@ trp trp trp nFu -knJ +xqd xul trp vJH @@ -90500,8 +91428,8 @@ cXe dnW wbi iwe -iKf -fMk +mDU +wJt for fvC xvl @@ -90526,7 +91454,7 @@ wbi oDs rrC iqN -liJ +mDq snc snc lVL @@ -90551,8 +91479,8 @@ pPT xJR ofo mLi -xJR -sNL +vsl +ewi uny xJR frI @@ -90565,14 +91493,14 @@ uBc tJz iya eUg -fBT +dcS nGe naG oAY ykZ onX xDa -tCh +xbV ykZ ldJ iYC @@ -90828,7 +91756,7 @@ xQK vEP hji pCF -xVl +fCS syR fgk qVV @@ -90907,7 +91835,7 @@ muS muS muS fOQ -xqZ +tBO sVN blb dDB @@ -91009,14 +91937,14 @@ smo vxt gUS sne -cPj +hAc cXP msg -fRG +gAi msg fIE fNh -fRG +gAi gBD msg glz @@ -91033,18 +91961,18 @@ toU hYW inR toU -hhi +cjY jax -hvz -xnQ +eFQ +jtY nTa tlt eIM yjZ yjZ yjZ -vmc -rnF +jtd +xSw kfw yeD kJj @@ -91076,11 +92004,11 @@ xGc xOS ftX fnP -vNw -vZK +gvV +itL uBc qYK -lqy +jMX uYH vEP qmr @@ -91155,13 +92083,13 @@ dDB dDB qPN qPN -pRJ +poA rrZ wbf qen pqK brb -xCw +wqY muS vWY sVN @@ -91285,14 +92213,14 @@ qtG qtG qtG lYj -mst -mKu +hJP +noz niw inU -iCN +ubT lYj mmw -hwg +eLx hCr tsF xRV @@ -91307,7 +92235,7 @@ kux wGz lbh oAF -whf +riu xeO wMg qej @@ -91323,7 +92251,7 @@ efC efC vpN oTo -vpN +dHi vpN vkh vkh @@ -91525,14 +92453,14 @@ kzo rSw oFm sIg -dog +kxD wfn ecY evj ecY fpO fvJ -fOP +lVZ gmp fpO maf @@ -91543,10 +92471,10 @@ blb maf sUy nJG -sUy -niT -sUy +qju niT +qju +utF sUy xoS hwo @@ -91559,12 +92487,12 @@ wCt lEa lWk xRV -vrn +owR nAx tmQ -xRV -xRV -xRV +xeO +xeO +xeO xeO mnn naO @@ -91786,7 +92714,7 @@ sTH wMm izq evs -eOT +bGc fqf fvT fRU @@ -91799,11 +92727,11 @@ dDB dDB dDB sUy -mtR -mNM +tUg +cbt hYX -wAt -iDg +noF +mnN sUy jaD cmd @@ -91818,20 +92746,20 @@ jLI jXl vrn nzK -wQB -xRV +lkZ +xeO lpa -blb +iTv xeO izB -nbn -xyX +jFY +xyY jVM paV wLJ oXe jVM -puT +vwg ycS tEI ycS @@ -91839,12 +92767,12 @@ uAF ree rFQ ycS -szK +ucV vkh oBm tIc bxA -idV +gYK wAW vtv kev @@ -92032,7 +92960,7 @@ xFZ eLE wyt gKL -fTC +ugb vkP vkP wTv @@ -92042,7 +92970,7 @@ hXQ sTH mKy iAn -evz +rTg ePw fqf fwO @@ -92066,19 +92994,19 @@ rto hwp qlP uVT -ocn +jxV iri -sjJ +bah uVT uVT lWQ xZS vrn ncL -kQp +qwz xeO -wMg -wMg +wKr +lql xeO wJV nbu @@ -92089,7 +93017,7 @@ jVM sbm jVM vkh -pQl +paL ycS uAX uAX @@ -92097,12 +93025,12 @@ reW uAX vEq szM -efC -xYj +vkh +qOt wYr tYd hgE -uKV +jqQ uNn vOh qTM @@ -92303,7 +93231,7 @@ evE ePA frs fxt -fSh +vRU gof fpO dDB @@ -92323,7 +93251,7 @@ jaK hwx hDZ uVT -idg +rEY irQ iIA qCJ @@ -92335,7 +93263,7 @@ ncL wQB wMg wKr -wKr +eUW xeO eGl nbZ @@ -92352,10 +93280,10 @@ qmx uBn iZI vpU -sem +bKP vkh vkh -gwa +uGp wYr tYH mVa @@ -92542,7 +93470,7 @@ qin bst hyD kpz -tnx +pJw sRP yjE yjE @@ -92578,9 +93506,9 @@ pUy sUy pfC pLj -hEc +xtP uVT -vSk +vdj irQ iJg eHk @@ -92590,13 +93518,13 @@ xZS vrn ncL wQB -ojk +dNw lql lKK -lZF +lql wKq qfb -xAl +qGU jVM ydu qEa @@ -92610,7 +93538,7 @@ uCh vRE vpY sfh -jGX +dks vkh tjb xAP @@ -92827,11 +93755,11 @@ dDB dDB dDB sUy -iVP +srT mPx nlk mPx -ooR +aZS sUy sUy reE @@ -92850,10 +93778,10 @@ uIv okp qfF wuw -wuw +jxy pNa qfF -xAq +dfW jVM uPd jVM @@ -92867,7 +93795,7 @@ rZN rfI rHd vpY -dtM +bfI vkh tkp cbT @@ -92876,8 +93804,8 @@ urv yeh blb kev -wmc -wEw +fUj +nnR iho dDB dDB @@ -93084,11 +94012,11 @@ blb blb blb sUy -gEO +ulq xil -gLD +ljN gTH -sUq +ipf kGM sUy jnh @@ -93099,7 +94027,7 @@ itY rWE qJq oIP -bHp +azm xQw vrn ncL @@ -93321,8 +94249,8 @@ eLE vxt jco wJU -wtl -eMj +aWC +eNV wMm fiA wfn @@ -93351,23 +94279,23 @@ qoD pLr qoD uVT -wqi -iwv +qXb +pux iLC iLC jts wzK -mvb -djR +eAc +wYD kuE wQB xeO -oAL +guR wiU mad wKr qgA -qCF +beH jVM rpg jVM @@ -93375,10 +94303,10 @@ jVM pfU sON vkh -wgU +glb vpY sZQ -jZh +fzf rHm sgS szZ @@ -93600,7 +94528,7 @@ pIS uAK anb uFm -gLJ +ptB xsh ahE plz @@ -93615,7 +94543,7 @@ eku uVT uVT uVT -llv +lAS kvl wQB xeO @@ -93624,13 +94552,13 @@ kGE mam wKr lYY -nuh +iHL jVM ygb ipt jVM -swF -tGe +qqh +hMz tGq tGq qnA @@ -93640,9 +94568,9 @@ wqs wqs wqs xmt -tlZ -tIu -xli +eJY +wZo +tYX blb blb blb @@ -93854,22 +94782,22 @@ dDB dDB dDB ycC -ieJ +bQm wkh uFm xMk xsh hcc xGJ -axz +wjY jwi qtd hOg uVT tgw lqt -iXj -jtx +ghD +aZP wPf mvT vrn @@ -93879,7 +94807,7 @@ xeO ltl hzY pum -wKr +joy qgH wKr jVM @@ -93890,12 +94818,12 @@ pgW mwP pRP tGq -qnC -vpQ +xUG +bgK qIP rHQ shw -drM +kQA xmt tmc wZo @@ -94123,7 +95051,7 @@ jwi jFG qVo uVT -iwV +dJd pDr hMh juS @@ -94135,7 +95063,7 @@ smf xeO lty xeO -iTv +xeO wMg dCm wMg @@ -94161,8 +95089,8 @@ dDB dDB dDB kev -wnv -wFM +uPO +mjB iho dDB dDB @@ -94369,21 +95297,21 @@ dDB dDB pIS gBz -fJo +qqC tMh qMK xqv -hcj +cEX xGJ -pkh +pie jnr jDa -hOC +fyt uVT -iza +njA lqt -soA -juX +cpT +xQv wPf mvT vrn @@ -94393,7 +95321,7 @@ xeO oCc xeO nTg -lql +joy qgN pEC qYc @@ -94411,7 +95339,7 @@ rIg prQ uXb sSr -wEp +kcs wYV xli blb @@ -94643,7 +95571,7 @@ xYO xYO xYO xYO -vrn +qlV oGJ wQB xeO @@ -94653,7 +95581,7 @@ kTd mnu qgR omA -uSb +vzI jVM vXW jVM @@ -94661,14 +95589,14 @@ siz sPT lej tGq -ueR +voF qGw uVE rgx prQ -sAT +chP xmt -wEp +qqq tIA xli dDB @@ -94882,24 +95810,24 @@ dDB dDB dDB ycC -gCa +ydk gFv uFm cKV xsh -hcJ +giU xGJ -oTF +mID jwi jwi -hQH +flM ifK izD izD -uAY +oXK izL uAY -jYW +xRU vrn oGJ wVZ @@ -94910,11 +95838,11 @@ pgE mpC qhm xBK -qtb +iuL jVM vXW jVM -wYy +fjF pww pRU tGq @@ -94931,7 +95859,7 @@ tYX dDB dDB qtl -jOw +suq wnB uth uMW @@ -95142,14 +96070,14 @@ pIS gCg mxe uFm -gLL +xqa xsh -rTt +gjS plz sDq jwi qtd -hSj +trk kjU izL iLV @@ -95173,9 +96101,9 @@ nKk rgf kWF pxO -pRV +gHt tGq -qpx +scC qGY uXb rIS @@ -95432,23 +96360,23 @@ jVM jVM jVM jVM -ufu +voL uXb uXb rJh vEI -cce +sxd xmt wEp -tJD +tIL xli dDB dDB kev -vOq +bjV qBy uwl -uNk +kdl vPC qtl qtl @@ -95656,24 +96584,24 @@ dDB ycC gHe noq -nlD +hMK ipD hdd hhk xGJ hxj qtd -hSv +tWw kke -kAS +myT iMg iYj sDp -tCx +vjx kke kgz oGJ -kJq +wQB xeO lus uZY @@ -95705,15 +96633,15 @@ qtl qTM vHL ozd -qTM +fYp xbP +hYm rUB -rUB -eLY +uvh xcv nBw ghQ -sEC +nId uXY dDB dDB @@ -95911,7 +96839,7 @@ dDB dDB dDB ycC -gHn +wKT mPJ mPJ ipD @@ -95928,7 +96856,7 @@ opn jwa opn jYY -tSe +aEl oGJ wQB xeO @@ -95946,7 +96874,7 @@ jVM jVM jVM jVM -qqy +efj xKa xKa rJv @@ -95959,10 +96887,10 @@ xli dDB dDB kev -vPV +kst qSU uwx -uOd +agC kqo qtl qtl @@ -96168,12 +97096,12 @@ dDB dDB dDB ycC -gHG +gFg mQz noq iqp ueC -hNE +bNd xGJ qWh qtd @@ -96188,9 +97116,9 @@ xMY tSe oGJ wQB -wsE +wix xeO -lMo +hee mbK mqz jVM @@ -96199,9 +97127,9 @@ jVM jVM mRp aeN -phJ +lSw hym -wQW +fhC mKH qrw xCu @@ -96209,7 +97137,7 @@ rij xCu xCu xCu -sTa +asN wEI tIL tYX @@ -96401,7 +97329,7 @@ fpY oRm uTA fEb -csq +bfy sHg uTA fpY @@ -96412,7 +97340,7 @@ wct isj edS eBH -eVm +cPQ xvT fAx fVU @@ -96425,7 +97353,7 @@ blb blb ycC ycC -gHJ +lfv kHi gLM iqF @@ -96438,14 +97366,14 @@ mlx xMY iBc iMZ -iYG -lFJ +qTD +azv jNe psc tSe oGJ wQB -lbk +xAV xeO lMy puN @@ -96466,14 +97394,14 @@ ril vVw vFv vVw -sTl +lJc wEp tIL tYX dDB dDB qtl -mDA +rOy rrx uyg uOh @@ -96664,7 +97592,7 @@ hJp wct wct eMI -cZv +yfP wct isj isj @@ -96722,9 +97650,9 @@ vVw vVw oAp vFE -vXd +tPd sTp -wEp +jFf tKm xli dDB @@ -96929,7 +97857,7 @@ fKc eVz fTe xvT -fWH +hvc xvT gfs gwS @@ -96946,13 +97874,13 @@ nRd hdH nRd qoD -log +vaF jVe hUq -iGS -bBv +qSZ +rpY iNg -iYI +hHF lGo jNO geE @@ -96962,7 +97890,7 @@ wQB lbM xeO lMH -teq +cnu jVM jVM xCz @@ -96972,14 +97900,14 @@ dNI vLO piZ pyS -gfR +gal vgc wkk qJa vVw rJT sih -sBu +oup sTp wEp tIA @@ -97016,7 +97944,7 @@ dDB dDB yfD dZa -rqM +sGt gxb sSQ sSQ @@ -97170,9 +98098,9 @@ fpY uTA dfo dor -dts +fNF dCj -dMF +iyq cze wct wct @@ -97187,22 +98115,22 @@ fOk fTe fUO fXj -oub +efy jxp jFt -jXd +fMx gyd gyd -gRj +pRz fMx gCr gHV pRz -gLV +pbE oUd soO oUd -xQl +fbl pPK jVe oUd @@ -97210,8 +98138,8 @@ koD oUd iNV oUd -lGA -jNZ +lun +wNv mzM tWL kyZ @@ -97238,15 +98166,15 @@ qKE qKE qKE sTp -tqt +vQA tIL tYX dDB dDB dDB kev -wnv -wFM +uPO +mjB mVY dDB dDB @@ -97426,9 +98354,9 @@ yjV fpY uTA bSN -bZL +xTV dua -dCC +gnA dMX dZn cEK @@ -97436,7 +98364,7 @@ wct eCf eNl dbv -fjA +eIp fun fDL fLf @@ -97447,15 +98375,15 @@ gbH gdE gfb jEc -jXe +nKz kwZ gDs -pQh -gzQ +jXe +oCP gCT mks soO -soO +gCA gVc kTH kTH @@ -97468,11 +98396,11 @@ kTH kTH soO gfs -jOd +ivl mzM tWL uFG -aqw +vpI jVM vML atM @@ -97529,9 +98457,9 @@ dDB dDB dDB yfD -pzB +iaA xin -ulL +kcA sSQ tAq sCl @@ -97540,7 +98468,7 @@ hlg dPH wJk tWo -hKQ +dwh wJk iXm isY @@ -97686,7 +98614,7 @@ dhh cam dun dCR -dOZ +dKQ dZD wct wct @@ -97701,22 +98629,22 @@ fPO fTe fUR fXl -gdJ +csS jxp jEu -jXo +ksP xsm gzB -jXo +ksP jim gDk gIb jim -pUJ +faR pPK jVe oUd -hoe +pPK hxA hED xSx @@ -97751,10 +98679,10 @@ rjb rKL siv sED -sTW +rNq tmV -tKy -xli +tIL +tYX blb blb blb @@ -97788,7 +98716,7 @@ dDB yfD cTx wkg -imM +bnz sSQ sSQ vql @@ -97957,7 +98885,7 @@ eBN fQY fTh xvT -fZw +qWQ xvT gfs jEZ @@ -97972,15 +98900,15 @@ qjy vPP otX hei -xHm +hei vPP hxJ -jVe -jWm -qjy -kCl +gIb +nsc +vzt +mnw soO -log +vaF jye jOs mAv @@ -98002,13 +98930,13 @@ kGS sQn jVM jVM -uii +aSQ qKN wLA rNA siP sEK -sWj +jme tqK tIL tYX @@ -98043,9 +98971,9 @@ dDB dDB dDB yfD -pEw +cPN wmE -bXW +bor sSQ tAq rWW @@ -98206,7 +99134,7 @@ wct wct wct eNU -eZP +qEk wct gOm gOm @@ -98307,19 +99235,19 @@ sSQ iJc tLt sSQ -xZm +aTp lpX phs vFm fNR vDV -rov +bHB hWu stX wiT wgL tLt -nJf +sSQ aTc frB sSQ @@ -98332,7 +99260,7 @@ sSQ vTG vTG vTG -hDJ +vTG sSQ dDB dDB @@ -98457,7 +99385,7 @@ fpY fpY uTA fEb -dQA +mbN fEb uTA fpY @@ -98487,9 +99415,9 @@ nqJ gVp iEQ hic -jeq +azJ gcz -qtQ +lOY gcz ihl oVY @@ -98530,8 +99458,8 @@ urv yeh blb kev -wmc -wFM +fUj +uPO mVY blb blb @@ -98549,7 +99477,7 @@ geu geu vdX gaF -unt +pnZ gaF vdX geu @@ -98570,14 +99498,14 @@ cPi mGN grx vDV -oCJ +mkA wCY vEe xXG wgL hcv -nJf -rAj +sSQ +liH uOw eBQ qDD @@ -98746,22 +99674,22 @@ ydj ykd qyz gcz -qtQ +lOY gcz ihq rHp rth iJI jyu -nkD +ezx tsF vIJ kzx twJ tgl -cEp +iSi fLn -meb +mLU jVM jVM jVM @@ -98793,11 +99721,11 @@ mVY dDB dDB qIf -lMU +spx qRU -xMA +cop qIf -gIE +sqa wjr xSO xep @@ -98846,7 +99774,7 @@ sOj vTG ocg pqf -gyf +gjr sSQ dDB dDB @@ -99001,7 +99929,7 @@ gLY vPP hkL nBC -hpR +uEh gcz cWh gcz @@ -99012,14 +99940,14 @@ iZB uff mak tsF -vrn +qlV uFG tmQ tgl lut pbd mfc -mtf +fcn qhs qIg jVM @@ -99037,9 +99965,9 @@ rOx hpq sIh xvW -tuO +lWb mpO -xml +lmo vcP uPs fHb @@ -99073,21 +100001,21 @@ dDB xSO wuj xrC -xHw +tvg sSQ vYj sSQ -oOM +fAY cHO uuS lNf heF nFD -xqg +ljP pKS bkY lVP -jWb +mbq wgL hgF pVK @@ -99257,7 +100185,7 @@ gJu ibo gWk iEV -mil +ptu hpW gcz qwn @@ -99294,11 +100222,11 @@ rQt uEg tNc xvW -tvS +hlo tMy tZG aiE -uNn +waw uNn vOh qTM @@ -99307,7 +100235,7 @@ qtl dDB dDB qIf -gUz +xEW cUE lXT gnQ @@ -99328,13 +100256,13 @@ xQa blb blb tFQ -jMj +mXT mUg gcf sSQ bbh sSQ -kId +jxU bba oNd fFD @@ -99344,7 +100272,7 @@ mVs clt jbr guF -nGP +kel wgL rWW sSQ @@ -99507,7 +100435,7 @@ kIj kxX kIj kIj -jPO +jDt eDN gcz gcz @@ -99526,7 +100454,7 @@ meu jyG meu tsF -llv +lAS uFG wQB tgl @@ -99587,7 +100515,7 @@ dDB xSO xUL xrC -knF +ubV sSQ miA sSQ @@ -99604,9 +100532,9 @@ mdm cAd wgL tLt -nJf +sSQ fWW -ljp +idW sSQ qDD xnU @@ -99769,17 +100697,17 @@ gDp gIj iRz wqM -iRz -iRz -iRz +uIj +uIj +uIj lto hyj -qtQ +lOY gcz -ihu -iEw +lcs +xQD iOs -jbJ +lEK lGK mfP tsF @@ -99802,16 +100730,16 @@ pzX tDZ ygB quS -uEy -xGQ +eQv +qmf vrv -smc +pFr sIt xvW twj mpO ubf -uyO +oEr yeh blb blb @@ -99821,9 +100749,9 @@ blb dDB dDB qIf -alc +sYx wYv -hwP +bXu qIf diS fAJ @@ -99842,23 +100770,23 @@ xQa pqa pqa tFQ -mXT +vLc xrC ceK sSQ miA sSQ -kgc +mTy ark bXO jxZ dlz nFD -lMr +iiC don cSr krY -vJi +wTU wgL swJ sSQ @@ -100033,8 +100961,8 @@ xRH ryi qyB gcz -ihB -vTs +uBQ +ptt iOE jcU lGK @@ -100100,7 +101028,7 @@ eAz hGE hXl dcH -sSF +xrC tFQ sSQ dZk @@ -100131,7 +101059,7 @@ sOj vTG mGQ edW -nTe +bFG sSQ dDB dDB @@ -100282,7 +101210,7 @@ aJq aJq xRH nts -ruY +qTz gXf ruY iSb @@ -100290,9 +101218,9 @@ xRH ryi xRH gcz -ijD -iEF -iPD +gad +ogi +ekF jcZ lGK mgt @@ -100300,7 +101228,7 @@ tsF kiO nDV wNW -lcn +vpI vpI vpI pwO @@ -100309,15 +101237,15 @@ vpI vpI nMW tEL +rQN pwO -vpI -pjr +rZq vpI pBu vpI vpI oXZ -vpI +rQN vpI pwO sIG @@ -100328,16 +101256,16 @@ ucr xIK uQC jeW -vQi -wnN -cNU -xkX +pvY +xry +ppu +wSF qir -qdb -uvJ -icl +kIS +wfU +csw tlX -lbN +rVH tFQ vsx oED @@ -100366,8 +101294,8 @@ tCz tCz sSq tCz -jUv -tCz +eWY +kFy iFb nuO sSq @@ -100539,7 +101467,7 @@ tYT aJq nIY gJY -ruY +igr gXg iFE iSk @@ -100550,8 +101478,8 @@ gcz ikH kCC qrg -jda -lHU +esF +iaw uoB tsF kjg @@ -100604,9 +101532,9 @@ blb geu geu frf -uEs +tAx ooO -bDY +nKc evb geu geu @@ -100618,7 +101546,7 @@ pox hLa lUE ych -cWB +tRc tRc tRc tRc @@ -100628,7 +101556,7 @@ tRc tRc tRc hGt -lXH +dHT sSQ sSQ sSQ @@ -100645,7 +101573,7 @@ sSQ vTG vTG vTG -hDJ +vTG sSQ dDB dDB @@ -100797,7 +101725,7 @@ aJq nIY nIY hbN -gXh +tZp dyp gIH xRH @@ -100818,7 +101746,7 @@ nvE nvE nvE nvE -mvl +nvE qio nvE uQi @@ -100835,7 +101763,7 @@ hvM hvM hvM hvM -wpu +hvM ouf wZE ucH @@ -100871,7 +101799,7 @@ dDB dDB tFQ sqo -kOX +pox wYA rnE xqN @@ -100882,7 +101810,7 @@ fgW uBl ibp kEF -jCr +sJE niI cqc aPa @@ -100899,7 +101827,7 @@ qNj qNj kVb sSQ -gPQ +hAu sSQ sSQ sSQ @@ -101071,8 +101999,8 @@ uoB wSZ dRf xqC -xyc -lwD +bOp +dyF lNp xRA xRV @@ -101108,8 +102036,8 @@ xSp dUC qTK vnF -pRQ -usB +xtU +tiZ vsx xZY tFQ @@ -101131,7 +102059,7 @@ vDB vTo wYA wPP -hTY +uer skp tZl xqN @@ -101308,12 +102236,12 @@ blb blb gcs uvA -gIl xbl xbl +rNB irn heA -hix +lGE gcz xRH jFF @@ -101324,7 +102252,7 @@ iPU gcz sFk gGl -nqE +qfz wSZ lFg xqC @@ -101337,21 +102265,21 @@ neZ xIW ylJ rRF -oDm +kHT kru qUt fwI ovk qdW qUt -qLd +rnc ugH mJX vHH vYH -wrw +isi xJB -xvh +mNQ xpU uBY ygu @@ -101393,7 +102321,7 @@ rZc vba anJ vdY -tFX +oKb vdY jjO wYA @@ -101565,12 +102493,12 @@ dDB dDB aJq uvA -xbl +gIl gKg xbl gXq ouP -lTu +hAQ gcz hyv fyH @@ -101581,21 +102509,21 @@ xRH gcz lHW jOU -jZs +jjJ wSZ lFg xqC lcu siN -dYG +ppy gzx wRL qIv -qIv +btf qZq qIv oEi -mMZ +oGv qUt qUt qUt @@ -101608,7 +102536,7 @@ vrY vrY sXq wGu -nhZ +lNU xoa uCp yeh @@ -101621,10 +102549,10 @@ xyk xTD bmB qir -wdb +vnF pRQ tFQ -ofG +vsx oED qNw xSO @@ -101644,7 +102572,7 @@ qNw xUL xrC wYA -bGv +wnY wfi wfi wfi @@ -101663,11 +102591,11 @@ fFY xiE xiE wgL -fSk +wsR aTc sSQ hhb -yku +fLt tAE wsB wsB @@ -101822,12 +102750,12 @@ dDB dDB tYT uvA -gIl +xbl xbl xbl gXv heH -kVc +hUI gcz xkb qzi @@ -101858,14 +102786,14 @@ vjf qUt qey qUt -ykI +azN vcN vrY mIi vcN -sXM +xpp xJB -xvh +bUD uPJ lek yhq @@ -101874,7 +102802,7 @@ vQp woT pqT wJM -xyp +epn wJM wJM lIe @@ -101886,13 +102814,13 @@ rAv rBY jLV eyZ -oRJ +fRJ jLV bCn jLV fmf eMl -fRJ +oRJ jLV qDN owP @@ -101915,10 +102843,10 @@ gCe wWs wOn xiE -vQn +mVm nyp exW -vUp +lVy wgL dnJ myW @@ -102099,7 +103027,7 @@ wSZ wSZ lFg xqC -iux +hwf lwJ phE pwf @@ -102133,15 +103061,15 @@ wIc xma qir xUn -vLW +uku qir wfa eMo xSO -itB +sKk +cFR xrC -xrC -pEL +bUr pEL pEL qUf @@ -102149,7 +103077,7 @@ qfX oED oED oED -czm +oED oED oED owP @@ -102158,7 +103086,7 @@ vdH nyT iMS wYA -bgH +xfV pUc pks buV @@ -102166,7 +103094,7 @@ nei moy moy xWl -nmh +gIF wYA eOZ mLH @@ -102349,7 +103277,7 @@ eDN ilW gcz iPW -jdo +xRm lJe tyr iGl @@ -102379,7 +103307,7 @@ jWy jWy jWy wJx -xbx +npZ xpU xMr uQK @@ -102393,7 +103321,7 @@ uWo qir qir wLM -lYp +nIA xlh xlh xlh @@ -102410,10 +103338,10 @@ wfr rbs wfr wfr -mUP +vLQ uSj jBx -wUJ +haq wYA dCe ppA @@ -102423,7 +103351,7 @@ tAS moy moy xWl -sSp +nmh wYA xiE xiE @@ -102432,7 +103360,7 @@ xiE uae hPi bRg -rEC +mig wgL wsR sQg @@ -102607,7 +103535,7 @@ xRH gcz wSZ jdp -lJo +gRG wSZ tyx ujq @@ -102615,7 +103543,7 @@ nEx xqC lcN lwR -tuU +ppy mhg wRL rRy @@ -102629,48 +103557,48 @@ qUt qUt qxk wua -uwS +eAR vvK rRz smH vZD -sZF +sZJ wJx xbC xpU xMr uSN uWo -vRz +hkk wpV rGc xTB -xOJ +ehV uWo -ydW +uQf cvy tNA nCU xlh -tWS -wil +aIu +dYM hzk qDK vEz mGh wfr -ycL +wya lHJ vKY lSK -eTo +avU pxx tUz wfr wfr wfr gtJ -eeN +qxi wYA cCW qFv @@ -102683,13 +103611,13 @@ xWl gIF wYA tab -sqp +bMW sOO bqE rGI hPi tQA -oTW +esI wgL eFO wnE @@ -102859,9 +103787,9 @@ uvA gcz xRH xRH -hWs +pKj kro -kvK +kSS wSZ wSZ wSZ @@ -102875,7 +103803,7 @@ xqC xqC xqC xqC -nfB +rHV nwe nNW pzr @@ -102927,7 +103855,7 @@ rAt nzc rQF lIh -swN +lcw xuD ckV tAS @@ -103110,9 +104038,9 @@ aJq aJq xqC gMK -itq +dYo oAC -rZu +knt uPt hyZ hFO @@ -103186,24 +104114,24 @@ wfr vbq uid wYA -cOY -vXz +rMl +qmZ nib qmZ onG qmZ lpV vmR -ndY +qQp wYA nGI jGc tuR gLb -uFV +bXH vTY nqV -exK +ruC wgL oiA kWs @@ -103371,7 +104299,7 @@ iuo oAV oWg nJx -pUD +ber jHl rcN krC @@ -103383,7 +104311,7 @@ mhu nJH kkD kjh -kJZ +ode ons lyj lOa @@ -103407,38 +104335,38 @@ elR xRh cLD wJx -xvh +mNQ iLp xMr yiQ uWo -rjJ -wpZ +rsp +wAE tdv eGT -xyS +sMT uWo -aAw +ubb rOJ tNA ipF xlh rPz -uFs +qwU pfv xlh qWo qWo wfr -oQx +hBR jfs -iPv +hdQ ddl -eFf +toC bGY wCK tDd -wTg +nTz wfr sCp vJR @@ -103449,7 +104377,7 @@ wYA wYA wYA fRq -fTb +nih hNJ fst wYA @@ -103457,10 +104385,10 @@ hOp slq hOp gLb -dvW +hvx gkE cIU -bKt +nGk wgL cmw uWZ @@ -103637,9 +104565,9 @@ sOs xmO lKn nFW +dXO sRL sRL -nEJ nVX sRL sRL @@ -103657,12 +104585,12 @@ umM qUt wua wua -qNx -rmZ -xWT +tBi +qvw +tRh soD -waL -taf +tao +raL wJx plr xsK @@ -103886,25 +104814,25 @@ iFP iGl hqW wSZ -wVS +ueD hXP wLl iEZ -crq +pMS xmO sHe nFW kam -kkF -kBH +boX +asZ ukW cZL -xVV +sRL dCH -mhD +ixP sRL -rsv -kAg +quc +mky rqw ohT oGm @@ -103927,9 +104855,9 @@ xMr xDs vva vSj -dRc vVF vVF +hVX xzQ mfR vVF @@ -103943,12 +104871,12 @@ cAr pnf lXR cAr -uPp +trz bNQ gUe lgx ufE -ufE +xXr ufE vMJ ufE @@ -104141,18 +105069,18 @@ xqC vlB iGl iUb -jfG +iGl wSZ hnY hYq ksX kCW -kWq +xID xmO sHs -nFW +pke tzD -ukW +cqS kCN wjM lcW @@ -104160,12 +105088,12 @@ lyp pij pwz pWX -nfO +euK qIv nOf rsv oGv -oXI +nhs qUt tnO uYp @@ -104400,18 +105328,18 @@ sco uIT uIT wSZ -nNi +lNQ hYw tdI rIJ rAG xmO sHe -mhW +nFW mEy ncf nFA -ujl +kBH onR xVV lOt @@ -104421,7 +105349,7 @@ nfT xcF ylJ oiO -oDm +lPR oYy qUt umM @@ -104447,12 +105375,12 @@ pDU qcQ nSA pDU -jOk +dwT pDU koz qcQ -oOp -qcQ +pDU +qgj pDU qcQ koz @@ -104469,9 +105397,9 @@ sKB erA esP mxP -fKz +alF rBe -xBp +oOp owJ pDU pDU @@ -104665,11 +105593,11 @@ kXn xmO qzO nFW -tAI -ulM +ghW +boX kCP -kbc -ldb +kBH +saD sRL sRL sRL @@ -104690,7 +105618,7 @@ qUt wua spi dqO -wrZ +taD pzL xvh uPJ @@ -104704,14 +105632,14 @@ ldq oom ssz yeP -lBO +sYt yeP yeP iPF -vSg iPF vSg iPF +iPF yeP yeP sYt @@ -104912,24 +105840,24 @@ nyi rvp rvp uIT -xqC +uIT wSZ tdI hHE nNi -rIJ +hPs xmO -sJR +ott sIA jPq kaF -roB -kDl +ffD +hTW roB lde sRL lOH -mhY +dlc mxT ngw nAh @@ -104951,11 +105879,11 @@ taD pzL xvh xpU -uCO +ntF nla -vwS +nHN vSY -gkL +hMn ldq roz vuA @@ -104984,7 +105912,7 @@ vGX xaP mfT dvJ -nuI +rBq cLY xaP tuT @@ -105002,10 +105930,10 @@ tXw sSQ rch cmz -hOR +fWr sSQ yhv -myW +pVr tVc jtK shL @@ -105165,27 +106093,27 @@ dDB dDB aJq aJq -jbm -jbm -jbm -jbm -jbm -xmO -xmO +pzd +pzd +pzd +pzd +pzd +mHq +mHq +mHq +mHq xmO xmO -xmO -xmO -jsn +oTL sIS nFW +sRL +sRL xVV -xVV -xVV -xVV +sRL xVV sRL -hIo +bFg mie wTu nhs @@ -105212,7 +106140,7 @@ xMr sOR vxa qiw -wMV +fhw ldq xmD xQI @@ -105222,10 +106150,10 @@ vtB tnt yeP uya -yeP uya yeP uya +uya yeP oFI vtB @@ -105239,7 +106167,7 @@ liP hjz tqs xaP -tat +tGJ mYj uax nRP @@ -105422,17 +106350,17 @@ dDB dDB aJq aJq +pzd +dYf +xaj +meP +uWg +sSl +pSf jbm -jbm -jbm -jbm -jbm -jbm -jbm -jbm -tbM +pzd iFi -iQF +jej jej jAs nFW @@ -105442,7 +106370,7 @@ lgq wZl ldo wZl -wke +rTj xIW wWc niX @@ -105479,9 +106407,9 @@ ukB toI yeP xaW -apZ -qOj -vmg +eeF +vbf +pST mwu yeP bjv @@ -105496,7 +106424,7 @@ tAP nxD ihC xaP -aVr +rXY jlZ kMW pXz @@ -105679,18 +106607,18 @@ dDB aJq aJq aJq -jbm -vTO -jbm -jbm -twN -jbm -jbm +pzd +vIN +eyz +mUC +rIO +rzR +kZf lqs -xGS -yfX +pzd +nFW twN -tDB +nFW nFW nFW tBL @@ -105716,23 +106644,23 @@ qUt qUt qUt wua -spU +vKi dmk wOG wtX -xvh +mNQ nkH xMr slJ vxM qiw -pgu +aiI ldq qRO ssz bFW rwW -iym +vtB pGD wSH kJW @@ -105932,29 +106860,29 @@ dDB dDB dDB dDB -dDB aJq aJq aJq -jbm -oEm -jbm -jbm -oEm -jbm -twN -nFW +aJq +pzd +rDl +ktN +gEQ +rIO +jWR +vmA +rIO rGL puC kZf jey -nFW -jQh +pzd +hek wXt ndZ vRx -wXt -kIR +uxk +qzC wZl ngv miF @@ -105982,8 +106910,8 @@ uiY uDF uSO lTb -qZR -aPU +vxM +cLm ldq qnx ssz @@ -105994,7 +106922,7 @@ wYd nFa uBy rvO -nkN +wlJ rvO qdr nFa @@ -106005,9 +106933,9 @@ fCy ssz fmH ldq -pdo -vhQ -isV +aBv +osy +kqO uhk gGQ kFY @@ -106181,46 +107109,46 @@ aJq aJq aJq aJq +hwJ +blb +blb +blb +blb +blb +blb +blb +blb +hwJ aJq aJq -dDB -dDB -dDB -dDB -dDB -dDB -dDB -aJq -aJq -aJq -jbm -twN -ydt -twN -twN -twN -twN -cgD -twN -jsn -oTL +pzd +eKX +jFc +nRo +tJN +wCD +kmb +oDO +rNK +oDO +oDO jez -nFW -jQi -wXt -net +dvs +wYC +pGX +wYC kDq kDq ldB -lyy +bnh lPd qkF -mAM +mmi nkY -nCy +nEr wZl -omo -rOz +jVO +dQP mfo yaL rAN @@ -106230,17 +107158,17 @@ sGT kVl rqc vuo -sQw -fne +wWX +blf unf wtX xbC nkH -uEG +xMr nla -egy +jsI vTx -hjS +pHw ldq qRO ssz @@ -106250,9 +107178,9 @@ tLc qBg yeP xaW -nHv -waG -ebv +wuq +aZL +ciR mwu yeP tBG @@ -106262,11 +107190,11 @@ ssz ssz uIo ldq -nGz -qvj +ntW +bgA byq pOX -yaJ +adl kFY aQm qEz @@ -106438,36 +107366,36 @@ aJq aJq aJq aJq -hwJ -blb -blb -blb -blb -blb -blb -blb -blb -hwJ aJq -jbm -jbm -ydt -jbm -jbm +dDB +dDB +dDB +dDB +dDB +dDB +dDB +dDB +tIE +aJN +doX +aJN ydt -jbm -skH -lqs -imd -rIO -pLK +rGL +rGL +tRp +rGL +rGL +rGL +rGL +xRX +iux jeX -nFW -thf +pzd +qhq tDq rnn udZ -quf +rtK uct lzR wYC @@ -106475,7 +107403,7 @@ dSl wXt qkF wXt -xVz +nFQ toA rvy fQi @@ -106507,10 +107435,10 @@ yeP uya yeP uya -yeP uya yeP uya +uya yeP uya yeP @@ -106529,7 +107457,7 @@ nUQ ohM nUQ xaP -oQe +ltP bho blh qvL @@ -106703,21 +107631,21 @@ dDB dDB dDB dDB -aJq -aJq -aJq -jbm -twN -ydt -jbm -jbm -kKN -jbm -jbm -jbm -jbm -sJR -jzl +tIE +tIE +bqy +bqy +bqy +bqy +bqy +bqy +bqy +bqy +bqy +bqy +tIE +nFW +akY nFW nFW nFW @@ -106745,16 +107673,16 @@ qTx neq yaL sqY -aCG +ata taZ shD xaH nkH xMr tBv -vyt +xbR +jDM uMN -vyt ssz qRO pJr @@ -106799,7 +107727,7 @@ vbR vbR vbR vbR -vbR +qcv vbR ykn vbR @@ -106959,20 +107887,20 @@ dDB dDB dDB dDB -dDB -aJq -aJq -aJq -jbm -oEm -jbm -jbm -jbm -ydt -jbm -jbm -jbm -jbm +kmS +dNi +tIE +bqy +bqy +bqy +bqy +bqy +bqy +bqy +bqy +bqy +bqy +tIE iHs iQK tDB @@ -106981,14 +107909,14 @@ tDB tDB unK nFW -mDy +cCP oow lAb soN wwb wYq nmy -qJB +jOW wZl qWT rON @@ -107004,7 +107932,7 @@ yaL srA lrH uMD -shD +rtZ xvh ugh xMr @@ -107216,29 +108144,29 @@ dDB dDB dDB dDB -dDB -aJq -aJq -jbm -jbm -twN -jbm -jbm -jbm -twN -twh -ycz -jbm -jbm -jbm -iRv +kmS +dNi +tIE +bqy +bqy +bqy +bqy +bqy +bqy +bqy +bqy +bqy +bqy +doX +iHs +pLK bjX nFW nFW nFW nFW nFW -xqL +uCo jjZ lCD pjM @@ -107257,7 +108185,7 @@ tOk unc qUa jgR -vug +sWQ srN sWQ sWQ @@ -107287,7 +108215,7 @@ dDB blb dDB ldq -bRN +ldq ldq ldq kUF @@ -107299,15 +108227,15 @@ fpq lwH nBq pTB -hTV +tkS uLj clZ reH -kOs +ico tbK wBh lcC -qKv +rUb tuT vtC vtC @@ -107473,48 +108401,48 @@ dDB dDB dDB dDB -dDB -aJq -aJq -jbm -twN -twN -jbm -jbm -jbm -puC -ydt -vra -jbm -nFW -nFW -iSB +kmS +dNi +tIE +bqy +bqy +cZm +bqy +bqy +bqy +bqy +bqy +bqy +bqy +doX +pVo +iRv nFW nFW mjk unO kla nFW -hWa +xJO let oJZ -wlm +lwr pys wYC qll -qJS +gOf wZl ooU tts kTL sQd -sSY -gle +fQG +oUo qfo qvM uFJ -rrF -toA +cwp +oUo ssj waT uLh @@ -107546,7 +108474,7 @@ blb ldq uME jAp -bRN +ldq lTg dAr hDz @@ -107562,7 +108490,7 @@ dNU off okl ogW -nzr +idp tuT tuT tuT @@ -107730,26 +108658,26 @@ dDB dDB dDB dDB -dDB -dDB -aJq -jbm -jOc -twN -jbm -jbm -jbm -ydt -puC -hJr -jbm -nFW +tIE +tIE +tIE +qBl +bqy +bqy +bqy +bqy +bqy +bqy +bqy +bqy +nMX +doX ivO -pLK +iRv nFW sJR -sJR -nfc +obv +seI nfc nFW wqj @@ -107775,13 +108703,13 @@ sCi vDX tNn vDX -wLW -xvh +vDX +mNQ xsT xMr tBv -vzh -vVu +oYS +pUL wrW ssz roz @@ -107803,7 +108731,7 @@ dDB ldq tUa vXn -bRN +ldq ldq ldq xGw @@ -107813,7 +108741,7 @@ ldq mNN naN vOr -bhI +jaG uLj oig oig @@ -107987,24 +108915,24 @@ dDB dDB dDB dDB -dDB -dDB -aJq -aJq -jbm -jbm -jbm -jbm -jbm -vMS -puC -jbm -jbm -nFW +kmS +dNi +tIE +bqy +bqy +bqy +bqy +bqy +bqy +bqy +bqy +bqy +bqy +tIE yju -iRv +pOL jfP -nfc +uJG jQF spH klf @@ -108018,12 +108946,12 @@ mBb hUP nDF wqj -opF +wSM rPl oYL sCc -pDe -pTn +tOO +aYY sCi qwG uHe @@ -108033,7 +108961,7 @@ vDX xww sso vDX -rld +dWh dNL aBV xqW @@ -108076,7 +109004,7 @@ blb blb oig oqg -buL +dkV vtC blb dDB @@ -108244,27 +109172,27 @@ dDB dDB dDB dDB -dDB -dDB -dDB -aJq -aJq -aJq -jbm -jbm -jbm -jbm -jbm -jbm -jbm -nFW +kmS +dNi +tIE +bqy +bqy +bqy +bqy +bqy +bqy +bqy +cZm +bqy +bqy +tIE kGz kZo nFW lLv sJR -ovT -nfc +spH +uvv qxw wqj oqf @@ -108282,7 +109210,7 @@ sCc sTf pTs sCi -pgP +cHC qUm rrU rSm @@ -108327,7 +109255,7 @@ ldq cgY mAP omp -vAc +uJR uLj foL blb @@ -108501,22 +109429,22 @@ dDB dDB dDB dDB -dDB -dDB -dDB -aJq -aJq -aJq -aJq -aJq -jbm -jbm -jbm -jbm -jbm -jbm -sJR -njm +kmS +dNi +tIE +bqy +bqy +bqy +bqy +bqy +bqy +bqy +bqy +bqy +bqy +doX +yec +fls nFW nFW nFW @@ -108540,7 +109468,7 @@ uuh pTz qfA qxh -qUA +uul rsg rSz vDX @@ -108759,24 +109687,24 @@ dDB dDB dDB dDB -dDB -dDB -dDB -aJq -aJq -aJq -aJq -aJq -jbm -jbm -jbm -jbm -nFW -nFW -iSO -bHA +tIE +tIE +bqy +bqy +bqy +bqy +bqy +bqy +bqy +bqy +bqy +bqy +tIE +kGz +jPr +gxZ dxz -sJR +kXJ xwy sJR nFW @@ -108790,7 +109718,7 @@ wqj qLq wqj rwT -rRK +rQA shD sCi sTk @@ -108826,13 +109754,13 @@ ssz ssz ssz ssz -nhg +mLA dWs lXg -sqD +cJL jWp wJc -ibV +ktB ssz ssz ssz @@ -109017,21 +109945,21 @@ dDB dDB dDB dDB -dDB -dDB -dDB -aJq -aJq -aJq -aJq -aJq -jbm -jbm -jbm -jbm +tIE +aJN +aJN +aJN +uJZ +aJN +doX +doX +aJN +aJN +aJN +tIE nFW iSW -njm +rdh liR jQL uwH @@ -109103,7 +110031,7 @@ uLj blb blb oig -sSw +gRh idp vtC blb @@ -109283,12 +110211,12 @@ hwJ aJq aJq vcE -vcE -vcE -vcE +jIb +pyt +nvS nFW iUy -vtL +hnF iKN jRb kaL @@ -109298,7 +110226,7 @@ kLB leH wqj dwW -nNf +hwK wYM jNH xLj @@ -109326,8 +110254,8 @@ yeh blb tjj tjj -xog -xAk +lLr +nde xUr tjj tjj @@ -109545,7 +110473,7 @@ nvS pyt vcE vcE -njm +rdh fjN jRz sSV @@ -109565,7 +110493,7 @@ oJW wkF plJ pEb -pTU +bgp vDX qxP vDX @@ -109574,8 +110502,8 @@ wPd ssF vmn pqm -xqW -tOZ +pqm +uWn ugC xPY ykL @@ -109586,7 +110514,7 @@ wKc xol xAM xAM -ygG +rMH tjj blb ssz @@ -109618,7 +110546,7 @@ vyU sVA okl sSw -xTI +emw tuT tuT tuT @@ -109802,9 +110730,9 @@ kbY pvA iIe vcE -njm +rdh wBO -bHA +wcI njm njm njm @@ -109812,7 +110740,7 @@ bHA vtL nFW uaP -nmV +gni mCJ qnn xLu @@ -109831,15 +110759,15 @@ bjL vMt vCl vMt -xqW +pqm tPm fTM bAs ykL vAo -oUw +oah wtt -wKl +fDQ xoW oPc xUt @@ -109854,13 +110782,13 @@ aSy aSy aSy aSy -dNi +lEu iTB -vrd +vHT wlk rce wtc -hzd +mmy aSy aSy aSy @@ -109869,15 +110797,15 @@ xnE bOR pGK rRY -fbp +jFh tuT fcd fjh -glR +rFi vbR qtg rwo -gAp +eVM tuT vtC vtC @@ -110088,10 +111016,10 @@ rVj vMt sJw lup -eBx +jXA xRg xuu -bSW +enb wQP xPv uSi @@ -110126,7 +111054,7 @@ pQE yim fEd gWN -vss +bey tuT ufn vly @@ -110142,7 +111070,7 @@ jGA vtC cWZ vtC -muj +tuT vtC vtC vtC @@ -110309,8 +111237,8 @@ aJq aJq aJq aJq -aJq -weg +iMy +jJy nvS kbY imE @@ -110320,7 +111248,7 @@ srW jAF jRN kba -fxO +alV kEo kMo leN @@ -110345,15 +111273,15 @@ xOM vMt tQQ vMt -xqW +pqm eDz fTM xRB ykL rOo -rix +jyw wtt -wKP +kSd xsa ldF xUt @@ -110364,7 +111292,7 @@ ssz ldq reg ssz -sST +vLv qIk yeQ jjH @@ -110372,7 +111300,7 @@ oDc uDg xvF xvF -xvF +mIg pQY qzw kau @@ -110565,8 +111493,8 @@ aJq aJq aJq aJq -aJq -aJq +iMy +iMy weg jKf nvS @@ -110602,10 +111530,10 @@ wPd mzo sJF pqm -xqW +pqm tOZ alb -qzn +tsb ykL ykL ykL @@ -110614,7 +111542,7 @@ wME xAM xAM xAM -ygG +rMH tjj blb ssz @@ -110627,7 +111555,7 @@ vuB wpd ggv uDg -xvF +pMA xvF xvF pQY @@ -110640,12 +111568,12 @@ pQE jSw xXL yel -wuN +hOk tuT -wWb +tXG rtf wrR -rXQ +jUc ixM cwS ufn @@ -110820,9 +111748,9 @@ dDB dDB aJq aJq -aJq -aJq -aJq +iMy +iMy +iMy aJq weg weg @@ -110849,9 +111777,9 @@ otQ oLh oYV xbg -pGy -toJ -tRV +pYb +ebe +sKt vDX sEz ruD @@ -110868,8 +111796,8 @@ yeh blb tjj tjj -xsz -xAk +lvS +nde xUR tjj tjj @@ -110881,7 +111809,7 @@ ssz vLv nye aSy -uLb +jGL kKe iTB aSy @@ -110891,17 +111819,17 @@ wtc stU bWs yeQ -sFv +mYW ahD pQE nIT xXL fjh -jFh +vlj tuT kTw kOV -tob +aJZ kTw kTw hLU @@ -111077,8 +112005,8 @@ dDB dDB aJq aJq -aJq -aJq +iMy +kOW aJq aJq weg @@ -111091,9 +112019,9 @@ jgC qzc wOp nZR -nZR +buO uMa -kNc +iLr xXT oLV xQJ @@ -111114,7 +112042,7 @@ xww veq vDX gaU -wbq +wxU vMC kxp tSu @@ -111139,13 +112067,13 @@ aSy aSy aSy aSy -kHc +vct iTB -aHh +tNw nZQ -sgI +srb wtc -fqd +mwF aSy aSy aSy @@ -111154,7 +112082,7 @@ xnE awT wJF hRd -ndI +jKS tuT jOF wOC @@ -111334,7 +112262,7 @@ dDB dDB aJq aJq -aJq +ejV aJq aJq aJq @@ -111354,10 +112282,10 @@ nSu xXT cek xQJ -miI +mbV vJx rdw -rZt +xMO xQJ ryt qrR @@ -111416,7 +112344,7 @@ tuT kNZ weT rlH -qtw +oZL kTw kXl kfy @@ -111622,19 +112550,19 @@ pcT oIR pHM tpK -tPY +agV vMC -qVM +krd ruO rVX stP wbu tbD -tyv +ygu xdc ugC xSZ -vaj +qld ssz ssz ssz @@ -111889,7 +112817,7 @@ wbu tbD tyA tTx -uhI +hYf xSZ vbA vAK @@ -111930,9 +112858,9 @@ hgX aHu rXv nCo -gqY +uHv rIY -hJO +kXl jWO svs dDB @@ -112130,7 +113058,7 @@ yjK xpE xMT xQJ -rzC +mEf qrR sid xbg @@ -112138,11 +113066,11 @@ sUE tqh qic vMC -neu +hkQ vfk itO sul -inD +nuC veK yeh tUc @@ -112391,9 +113319,9 @@ sgY oNX shD xbg -sVX -tqr -tRV +rOK +dzf +lEZ vMC tiQ iIw @@ -112408,16 +113336,16 @@ uGN vdf vAT vWe -wtT -wNb xsM +wNb +wtT gye rWm rUI xDg -wtT +xDg pWl -mpc +fwU phZ wbp wMH @@ -112648,11 +113576,11 @@ ouY oPM sDj uqw -sWC +uqw uqw uqw vMC -tWr +eJm noe hYK pNO @@ -112673,7 +113601,7 @@ xIk xIk euR hok -pYP +oOh aXI qHY wML @@ -112681,7 +113609,7 @@ wMH wMH aSy aSy -roC +aFY pWZ qZe xvF @@ -112690,7 +113618,7 @@ cLS hOl eWI eWI -xzf +wNZ idF eWI gpf @@ -112711,7 +113639,7 @@ svs svs grm svs -bab +jUl svs grm svs @@ -112896,7 +113824,7 @@ vhH xXT vUS xRW -pBi +tSv xqS nou xQJ @@ -112931,13 +113859,13 @@ qEe sRj jkz ifU -tFS +eGc cAb xjb pAF nyB gOQ -mQE +cvH xiT blk rUE @@ -112947,7 +113875,7 @@ ibI xVX bWa eWI -sFW +maL usF eWI gpf @@ -113166,16 +114094,16 @@ xPj wBI oHg qzj -lrx +vso fHT veK dDF vkn vMC xFA -wCu +sMh xFA -wwZ +xws xFA mdt mdt @@ -113189,18 +114117,18 @@ lUo lUo hHf aXI -toE +awE kdO eTh kls gMR pAl deh -cnI +hcU uTR rFF sea -gTs +wqb dIP ois eWI @@ -113216,8 +114144,8 @@ ycE ycE ycE cOW -rIY -qXh +aLr +tqX wkm grm blb @@ -113414,7 +114342,7 @@ mjf mFh noB xQJ -nXe +avN ovg rRU wBI @@ -113435,10 +114363,10 @@ yfA uGU vfT uMU -wZn +iPJ ilD wNg -bDp +mYm mdt fdM tVt @@ -113446,7 +114374,7 @@ reh tgp reh reh -mvN +vnf wML oOw mZX @@ -113454,9 +114382,9 @@ qrb aSy svz aSy -sAi -rJY -skh +kRt +mjN +eFt aSy tJw aSy @@ -113692,23 +114620,23 @@ ilw xUV xWD uMU -upG +pQr xWs tCG -xtk +vfD uMU lDI yit xKq mMN -cME +ljZ uHd vnf mcn rOX rOX sYa -tXp +omW nYl aSy aSy @@ -113716,7 +114644,7 @@ aSy aSy aSy nIC -gkb +nlC eWI tJX wme @@ -113730,8 +114658,8 @@ ycE ycE ycE cOW -rIY -dNa +aLr +hJO kfy grm blb @@ -113928,15 +114856,15 @@ mjF mGp vUz qNn -nXE +pgy owm sXi -oUj +bfe sXi -pKL -tqB +ioR +mEL vbK -vRh +sfq uMH vbK wOs @@ -113963,17 +114891,17 @@ mDZ vnf wML rOX -fyU +gYH sYa -ruJ +yfs nSR -rgS -wkf -mWF -wSV -rgS +xoB +lMV +glP +xKX +eex tFE -rNK +pWc eWI dov oLg @@ -114184,7 +115112,7 @@ xQJ xQJ xQJ qNn -uLd +qNn vpM owD xda @@ -114196,11 +115124,11 @@ qiy vRh uMH vbK -rtu +hVY svo oTT wuI -wPz +aeD vbK xva xUV @@ -114222,15 +115150,15 @@ wEC vey uEw sYa -oag -lXd -oFQ +cqn +qcq +foI gJS lIL gJS -lYD -bbe -pyf +arB +mOm +wIh oWr tJX tJX @@ -114253,7 +115181,7 @@ svs svs grm svs -bab +jUl svs grm svs @@ -114477,17 +115405,17 @@ sZK vnf cVQ rOX -lqa +qBd sYa -pQX -mWN +kIB +dXU aSy deQ tst deQ aSy -ykk -lPc +iMI +vPx eWI wuf tJX @@ -114718,12 +115646,12 @@ wQj xeX xvf xUO -viD +ycq uMU -pEM +kYs boK byD -ccy +eJP uMU xWk wDA @@ -114736,15 +115664,15 @@ dav rOX rZj sYa -aiV -mjP +xlM +qrB yeQ yeQ ppW yeQ yeQ -mjP -tKk +qrB +fuz eWI dNy jbb @@ -114759,7 +115687,7 @@ eWI eWI eWI vlV -tqX +sok wkm svs grm @@ -114952,17 +115880,17 @@ kNI xXT oOv vwd -ikc +fzq xau rsL qhh ghC -wkJ -oRd -jfQ +vmJ +hbk +qIM xfu xbT -wGW +snJ vbK upr uMH @@ -114974,7 +115902,7 @@ tdw uaV xfc vRh -xUV +kqb vbK xia xia @@ -114999,7 +115927,7 @@ xlP xlP epN xlP -eWI +rfJ eWI eWI eWI @@ -115013,7 +115941,7 @@ twk vkZ lCN wme -uFZ +qma nAe vlV bPb @@ -115214,8 +116142,8 @@ xau rsL xSe miz -xlL -xlL +hpM +ati wJL ppQ tTp @@ -115239,27 +116167,27 @@ wvE wHg mbZ xia -xYd +jYr jbc -xiB +lZB ivz -xYd +jYr uHd mDW wML rrt uWl -orq -xhN +nbF +cVz sYa rQw xlP bAo +xlP tGp eWI asc usJ -usJ lCN jsX vlV @@ -115483,7 +116411,7 @@ qWJ rwk ctq mzl -sKI +aOz sWq sJI pMD @@ -115513,10 +116441,10 @@ xlP xlP jMC xlP +rfJ eWI eKf -usJ -skJ +tNT vlV jbb tJX @@ -115727,8 +116655,8 @@ rsL mIh rsL xTO -rdk -oyz +ewo +ydH xPj wJL sHX @@ -115738,13 +116666,13 @@ vbK upP rwg vbK -sbv +dtC svP -sLy qRc -kuY +qRc +cyj vbK -upr +sfq uGX vjZ xqn @@ -115753,9 +116681,9 @@ wvM xqn xwu xEd -uSH +bBr yjt -gpR +eTT nYg jxk vKX @@ -115770,10 +116698,10 @@ axN rfJ iHH xlP +rfJ eWI -eWI -nev fxN +clb vlV fSB eWI @@ -115782,12 +116710,12 @@ gky lrh gky vbm -tah +mNv xEc gky niZ vlV -sok +tqX fZu svs grm @@ -115995,22 +116923,22 @@ vbK qzD xfc vbK -sbC +bWi iyC -vQm +wyy pjn tzH vbK -ukz +the fqG wfD ocb mau -oGA +ocb bYk ayu xVv -oGA +ocb ocb mau xTT @@ -116258,7 +117186,7 @@ wcp wcp wcp xFA -ukG +ryk xVG sQb rxT @@ -116266,7 +117194,7 @@ vYF wwk sbX rxT -rwS +bkg xYH gTc rxT @@ -116276,15 +117204,15 @@ eQn vnf wML rrt -jif +bqR ryy boW sYa -cXd -mct +mwJ +nEd aTf -rRR -wJH +rfJ +fvH eWI blb blb @@ -116307,7 +117235,7 @@ qRo wGq hgu jzp -yfZ +ogF grm dDB dDB @@ -116504,7 +117432,7 @@ ikc vwd rsL vBG -pUi +bpI qiM urd qWL @@ -116528,7 +117456,7 @@ xYK jSl mbZ kse -mUz +aBu xLZ vnf wML @@ -116760,15 +117688,15 @@ wBs ikk jSR wxd -sen -xiJ +qYv +qYv tWG eXW uNR viA sbN svZ -sMw +qbf teP owv rOW @@ -116787,7 +117715,7 @@ xia xia uXC uXC -mvN +vnf lHn rOX rOX @@ -116816,11 +117744,11 @@ ani xQj svs nPx -kfy +qbn svs -psg +kNK qIZ -rNU +cfH svs svs dDB @@ -117019,9 +117947,9 @@ rsL rsL xtI xtI -tWK +aLg urd -qXa +vTm xok xok xok @@ -117032,14 +117960,14 @@ wMO ukQ qTe sxF -vBu +qTb vYL wwX wNT xnC xnC xnC -ekE +rfO aGv kSr vId @@ -117062,7 +117990,7 @@ wos nFs bgQ xbw -uoE +fsT eXo blb blb @@ -117269,12 +118197,12 @@ xXT xWd rsL qOc -nXT -pms -oRg +uDw +gaL +jsc blU prW -pLc +pms tCD nWO urd @@ -117286,7 +118214,7 @@ wcq wvX kea xff -xvv +ede hoG vkt vCe @@ -117326,8 +118254,8 @@ eXo eXo eXo eXo -kGi -pcf +qCc +gxc svs grm grm @@ -117525,7 +118453,7 @@ woE wyK xfa rsL -jFk +lRh reX tfe oRs @@ -117554,16 +118482,16 @@ ixU ipx enU ykv -gTl +sCR eQt -beM +fjL lXE vnf wML pwn eXo tUI -izJ +wdS eXo wos wos @@ -117576,11 +118504,11 @@ eXo srH vqX gCo -kow +gjL eXo eXo eXo -iNO +jat tUI nVF msJ @@ -117589,7 +118517,7 @@ svs dDB dDB svs -tzB +mrt hgu gRX svs @@ -117783,14 +118711,14 @@ xXT xfa rsL cgy -xmX +ntQ seM rVy seM oGL xmX tCD -hAn +pZl ntK lSu xok @@ -117807,7 +118735,7 @@ xok dXb xok wOh -iIy +sAA qbN xZE ykU @@ -117830,12 +118758,12 @@ vbQ iVE ksg wos -eZT +mLM iIN -eQX -glt +nIx +lPI iOF -mwm +ePX wos jrU qlz @@ -117848,7 +118776,7 @@ blb svs gFX hgu -wYL +lxN svs svs dDB @@ -118063,9 +118991,9 @@ cyx xok upe xok -wPR -fxq -gfv +cWT +nuo +eQt eQt oPG eQt @@ -118074,15 +119002,15 @@ xok xok qID iHM -cph +uSB lDc oAc -joj +nKj jXr mny oWC mny -iFM +gxq oWC oWC oWC @@ -118094,7 +119022,7 @@ aEJ bZt mHZ srE -tFn +lom tGI lDc hgu @@ -118106,7 +119034,7 @@ svs dlJ eem lwY -uhO +pJj grm dDB dDB @@ -118311,7 +119239,7 @@ xok vhC sHV wcs -tfL +xaN fds xok fni @@ -118339,7 +119267,7 @@ pJu rqm vwx rYp -ivd +aKx rYp viV rqm @@ -118348,7 +119276,7 @@ nFp hfI woD qCY -fhD +toh tAT pJu ldx @@ -118563,7 +119491,7 @@ pLg jGW vkU ogT -ykE +wgC xok vzg vPS @@ -118601,12 +119529,12 @@ bFw ulK cdn wos -lZu +vwE ujZ -moe -qJJ -wMi -qPY +mkZ +lZa +fZp +xHc wos oGk eFV @@ -118818,12 +119746,12 @@ utm utm utm jXR -dfv +dZp urm -vbj +ciT xok dex -fWJ +bxT qNO xaN vhC @@ -118843,12 +119771,12 @@ xok xok qLB xaN -vEQ +xjo qQK ikt nVF aAD -mkf +sCk eXo wos wos @@ -118865,7 +119793,7 @@ qiN eXo eXo eXo -iwT +xhM hPR nVF msJ @@ -118874,7 +119802,7 @@ grm blb blb grm -nYE +wHP iia msJ tuP @@ -119125,8 +120053,8 @@ eXo eXo eXo eXo -bEP -ajV +bAd +xaI svs svs svs @@ -119375,7 +120303,7 @@ wos aoa dzJ xQN -anh +mTM eXo blb blb @@ -119393,7 +120321,7 @@ sPx lwY wGh mCf -wfk +kRS dKA dDB dDB @@ -119613,7 +120541,7 @@ xok xok xok bWt -xHl +bNl bCQ qgq ruo @@ -119623,9 +120551,9 @@ ifa ifa ifa ifa -dUP +sFD vLi -goH +wzb ifa dDB eXo @@ -119645,10 +120573,10 @@ svs dDB dDB svs -mWT -gyi +wTs +ssq lwY -rHP +tqW mCf wfk dKA @@ -119866,23 +120794,23 @@ xok xok xok xok -sBV +vxR bYS xok jYu xaN -ryn +lGL jML jML awQ dXe jTu gTK -aDk -gWU +bDD +dhy pYs dJf -bHV +lCh ifa dDB blb @@ -120113,7 +121041,7 @@ dDB blb dDB xaN -umO +dNG gJQ vlq vFn @@ -120151,7 +121079,7 @@ blb blb kQt lxo -hzK +uFc pil cxy cyf @@ -120382,13 +121310,13 @@ xFI gfu qJr qJr -ewb +qJr fky lkV tDM okW kQt -mcQ +fUo hyE xKl vkW @@ -121410,9 +122338,9 @@ nWh xEn nWh xnR -oNJ +iuH wLZ -dLu +xwn cns vwJ kQt @@ -121422,14 +122350,14 @@ fAP vWU kRE hyE -nRE +nuS snn sQS lxh hyE dkS hyE -mJS +rLK wuH mME khD @@ -121664,7 +122592,7 @@ yeZ yeZ yeZ yeZ -iuN +fnd yeZ yeZ qei @@ -121682,12 +122610,12 @@ hyE iEA svG tns -hzy +kYA hyE oix hyE iZH -mME +mXk lKG scv hyE @@ -121918,12 +122846,12 @@ dDB dDB blb yeZ -jLo +rma xxn xFL -dMn +dtk kZF -rsA +pSB qei qZU jeG @@ -121936,14 +122864,14 @@ xZX iix gFu hyE -sIm +rLk umr cAm -jYV +ggN hyE mME hyE -rcz +mJS bJw eoC cRS @@ -122432,7 +123360,7 @@ dDB dDB blb yeZ -wRF +bcR bEC wVg nzL @@ -122444,7 +123372,7 @@ qSC tue uIe bVD -dOP +agy kQt uvu kQb @@ -122696,7 +123624,7 @@ tno qiH mmf qei -nWv +xwQ wCH pFd qez @@ -122714,10 +123642,10 @@ rWA hzK xap ieY -ike +kks dof -ieY -rWA +uVO +lEg rWO wrD bHs @@ -122946,12 +123874,12 @@ blb blb nzL yeZ -wUt +xQx wrv pRD wrv qFA -qts +rxP qei tHS vNo @@ -123114,7 +124042,7 @@ atE atE atG axq -axq +jaP aMa aPx atE @@ -123210,12 +124138,12 @@ rFp yly inW rGp -fbQ +blJ qnJ oiT obs aoT -mae +mMK kQt jeC dLQ @@ -123233,7 +124161,7 @@ gmm dAG iuW hyE -gSk +lLL xjZ xjZ gTb @@ -123241,7 +124169,7 @@ utD ucY qVK iEG -pTV +vGK xIP xIP xIP @@ -123465,7 +124393,7 @@ sDA sgw yeZ bNK -gPx +tyY kQt kQt kQt @@ -123490,7 +124418,7 @@ lHS kzP sCw hyE -pNC +bCs vWQ fBX fBX @@ -123502,7 +124430,7 @@ mCF xIP rGO mqO -rDA +ldW gXS njL xIP @@ -123742,7 +124670,7 @@ dDB dDB dDB hyE -pMs +lVg afF afF pMs @@ -123761,7 +124689,7 @@ nfm kGB bzZ flo -maX +hQz xIP dDB dDB @@ -123999,7 +124927,7 @@ dDB dDB dDB hyE -ecL +iWI hyE hyE ecL @@ -124012,11 +124940,11 @@ qsj vgN lhP ksa -mCF +hyA xIP sib uVD -mHk +bzZ bGn nCR xIP @@ -124256,12 +125184,12 @@ dDB dDB dDB dDB -seV +fKx blb blb seV wJd -lXJ +nle lnA hAI mCw @@ -124269,7 +125197,7 @@ fnI gwQ lnA lnA -eRp +vFu xIP xIP xIP @@ -124513,7 +125441,7 @@ dDB dDB dDB dDB -vVT +iaJ blb blb seV @@ -124770,7 +125698,7 @@ dDB dDB dDB dDB -vVT +iaJ blb blb vVT @@ -125027,7 +125955,7 @@ dDB dDB dDB dDB -seV +fKx blb blb seV @@ -125284,7 +126212,7 @@ ylD dDB dDB ylD -mTU +cpJ ylD ylD mTU @@ -125543,7 +126471,7 @@ loo ylD rRu jxD -xlx +xxB icW ylD kKa @@ -125799,7 +126727,7 @@ wNK pnt ylD ksN -jxD +sVk dtq xpb ylD @@ -125812,12 +126740,12 @@ dDB dDB ylD urn -egN -aRw -klZ +pHk +vlX +wla aRw egN -aYD +oFf cbg ylD dDB @@ -126044,19 +126972,19 @@ cCl cCl oGQ oGQ -oGQ -oGQ +bnr +bnr qkp rfZ sEB odk -sEB +pof eLn xlx sEn csI -xlx -jxD +bVR +jLl xlx sOF cFq @@ -126070,7 +126998,7 @@ dDB ylD ylD ylD -oRV +sPa ylD ylD oRV @@ -126302,18 +127230,18 @@ ylD ylD ylD mUn -ylD +mMr ylD rhL rTq -rir -sEB +rMb +eAo sWA -xlx +kwu ouL -csI -dtq -xlx +aqV +suF +kwu vLs qeT ylD @@ -126326,7 +127254,7 @@ ylD ylD ylD mEq -xCT +ozV bsI ylD wBa @@ -126553,11 +127481,11 @@ eDI xZy ylD jmd -sCH +bRm wKG lAO ncb -ylD +mMr oNH pFk ylD @@ -126565,24 +127493,24 @@ rir sIZ sEB bGi +mMr +vPJ +dTB ylD -vlb -qEO -ylD -kQv -kGu +pdt +xBF sVp -lcz +oyR ylD -idq -xZy +ymh +meJ xkn xEv -xZy -xZy -xZy -oRV -sgO +meJ +meJ +meJ +sPa +eQQ gYq aUA ylD @@ -126812,26 +127740,26 @@ ylD joS kxm rEb -nhB -nhB +oiU +oiU mZA -oNH +uqU naC ylD rlg tTA bAI fbj -ylD -ycy -xlx +mMr +nuY +ovB ylD ylD ylD ylD ylD ylD -idq +ymh ylD ylD ylD @@ -127067,11 +127995,11 @@ lgf xZy ylD sKS -nhB -sCH +wPu +yma lQu -ylD -ylD +mMr +mMr oWk qHt ylD @@ -127079,16 +128007,16 @@ ylD ylD ylD ylD -ylD +mMr dOb -xlx -cFq -xZy -xZy -xZy -xZy +ovB +lko +meJ +meJ +meJ +meJ xkn -idq +ymh ylD xqq xLY @@ -127323,19 +128251,19 @@ wdk goZ fmq ylD -nhB -sCH +byU +pfh mwx wgF ylD rZG -xlx +cFj bNP fii fNv jwh -xlx -vlb +fvz +aYR vNt kIY vqb @@ -127588,7 +128516,7 @@ ylD xcH xmg pHn -qHt +mlm vlb xgz iKo @@ -127599,7 +128527,7 @@ jxD ylD hqH vzv -wyj +brz cgM ylD wyj @@ -127855,7 +128783,7 @@ ylD ylD ylD aEB -cgM +tzo vMr gbD ylD @@ -128101,10 +129029,10 @@ tZt ylD wFz baE -cgM +fcq lkd -lgf -cgM +fkT +fcq sQv xwd wdk @@ -128357,8 +129285,8 @@ ylD ylD ylD olm -cgM -lgf +fcq +fkT jcm lkd lkd @@ -128613,15 +129541,15 @@ cgM lnI cgM cgM -cgM -cgM -cgM -cgM +fcq +fcq +mcl +xYz lkd -cgM -lgf -cgM -cgM +fcq +fkT +fcq +fcq cgM wdk wdk @@ -128870,17 +129798,17 @@ wdk wdk lhQ lgf -lgf -cgM -cgM -cgM -vjp -cgM -cgM -cgM -cgM -cgM -cgM +fkT +mcl +mcl +xYz +gSk +fcq +oBh +fcq +fcq +fcq +fcq wdk wdk wdk @@ -129129,14 +130057,14 @@ wdk wdk wdk wdk -cgM -cgM +fcq +fcq tiN aCM bDq eUF jar -ylD +mMr fPR ylD aJq @@ -129907,9 +130835,9 @@ aJq tYT tYT tYT +eJH tYT -tYT -tYT +eJH tYT aJq aJq diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index b2eb920e162ca..ff106565a426c 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -23,18 +23,13 @@ }, /turf/closed/wall/r_wall, /area/station/maintenance/solars/port/fore) -"aak" = ( -/obj/machinery/disposal/bin{ - desc = "A pneumatic waste disposal unit. This one leads to the morgue."; - name = "corpse disposal" - }, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/trunk, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/medical/medsci) +"aaj" = ( +/obj/structure/bed/dogbed/renault, +/obj/machinery/newscaster/directional/south, +/mob/living/basic/pet/fox/renault, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/captain) "aaz" = ( /obj/effect/landmark/start/hangover, /obj/structure/chair/stool/directional/east, @@ -57,6 +52,20 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) +"aaR" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/north, +/obj/item/kirbyplants/random, +/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 = "Library - Fore Starboard"; + dir = 9; + name = "library camera" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/library) "aaV" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -107,25 +116,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/central) -"abq" = ( -/obj/machinery/modular_computer/console/preset/id{ - dir = 1 - }, -/obj/machinery/keycard_auth/directional/south{ - pixel_x = -5 - }, -/obj/machinery/button/door/directional/south{ - id = "cmoshutter"; - name = "CMO Office Shutters"; - pixel_x = 8; - pixel_y = -26; - req_access = list("cmo") - }, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/cmo) "abw" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -138,6 +128,18 @@ "aby" = ( /turf/open/floor/wood, /area/station/command/heads_quarters/captain) +"abG" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/sign/warning/secure_area/directional/west, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay) "abJ" = ( /turf/open/floor/circuit/green, /area/station/ai_monitored/turret_protected/ai) @@ -250,18 +252,6 @@ dir = 1 }, /area/station/service/kitchen/abandoned) -"adb" = ( -/obj/structure/closet/crate, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/obj/item/crowbar/red, -/obj/item/stack/sheet/mineral/plasma{ - amount = 20 - }, -/obj/item/gps/engineering, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/engineering/main) "ady" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -288,7 +278,7 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/incinerator_input{ dir = 4 }, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "adC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -487,10 +477,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/detectives_office) -"afF" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall, -/area/station/cargo/warehouse) "afG" = ( /obj/machinery/computer/camera_advanced/base_construction/aux{ dir = 8 @@ -508,18 +494,15 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/white, /area/station/science/research) -"afJ" = ( -/obj/machinery/light/directional/east, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/brig) "afK" = ( /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"afN" = ( +/obj/structure/cable, +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/iron, +/area/station/science/xenobiology) "afQ" = ( /obj/structure/closet/secure_closet/brig{ name = "Prisoner Locker" @@ -583,13 +566,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/checkpoint/customs/fore) -"agn" = ( -/obj/structure/bed/dogbed/renault, -/obj/machinery/newscaster/directional/south, -/mob/living/simple_animal/pet/fox/renault, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/captain) "ago" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 @@ -613,6 +589,17 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/textured, /area/station/science/ordnance/storage) +"agx" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos) "agA" = ( /obj/structure/chair/stool/bar/directional/north, /obj/effect/landmark/start/hangover, @@ -638,6 +625,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/evidence) +"agQ" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/bot, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room) "agZ" = ( /obj/machinery/ntnet_relay, /turf/open/floor/circuit/green/telecomms/mainframe, @@ -740,12 +736,6 @@ }, /turf/open/floor/iron, /area/station/commons/locker) -"aid" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/sign/poster/official/do_not_question/directional/south, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "aii" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, @@ -763,6 +753,15 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"aiF" = ( +/obj/machinery/newscaster/directional/south, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/turf/open/floor/iron, +/area/station/command/heads_quarters/qm) "aiO" = ( /obj/structure/cable, /obj/structure/table/wood, @@ -862,33 +861,17 @@ /obj/effect/decal/cleanable/blood/splatter, /turf/open/floor/plating, /area/station/maintenance/disposal) -"akT" = ( -/obj/machinery/light/directional/north, -/obj/structure/reagent_dispensers/wall/peppertank/directional/north, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/courtroom) -"alc" = ( -/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 +"akW" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Security - Visitation" }, -/obj/effect/turf_decal/bot, -/obj/structure/window/reinforced/spawner/directional/east{ - pixel_x = 3 +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/security/prison/visit) "ale" = ( /obj/structure/rack, /obj/effect/turf_decal/bot, @@ -903,28 +886,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) -"all" = ( -/obj/machinery/conveyor{ - dir = 1; - id = "garbage" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"alx" = ( -/obj/machinery/modular_computer/console/preset/id, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "alG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -937,6 +898,18 @@ }, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) +"alK" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/camera/directional/south{ + c_tag = "AI Satellite - Fore"; + name = "ai camera"; + network = list("minisat"); + start_active = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) "alM" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -1090,21 +1063,6 @@ /obj/effect/decal/cleanable/insectguts, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"amU" = ( -/obj/machinery/computer/security/telescreen{ - dir = 8; - name = "Prisoner Telescreen"; - network = list("prison"); - pixel_x = 27 - }, -/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{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/execution/transfer) "amW" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -1118,6 +1076,10 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"amY" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "anp" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, @@ -1131,6 +1093,12 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/maintenance/port) +"anz" = ( +/obj/item/kirbyplants/random, +/obj/machinery/newscaster/directional/south, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/service/library/abandoned) "anB" = ( /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, @@ -1243,7 +1211,7 @@ /turf/open/floor/iron/dark, /area/station/command/bridge) "aoB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/r_wall, /area/station/science/ordnance/storage) "aoJ" = ( @@ -1266,12 +1234,6 @@ }, /turf/open/floor/iron, /area/station/engineering/hallway) -"aoN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "aoO" = ( /obj/effect/turf_decal/bot, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -1324,21 +1286,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) -"apw" = ( -/obj/structure/sign/poster/official/report_crimes/directional/north, -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/suit/jacket{ - desc = "All the class of a trenchcoat without the security fibers."; - icon_state = "detective"; - name = "trenchcoat" - }, -/obj/item/clothing/head/fedora{ - icon_state = "detective" - }, -/obj/item/clothing/gloves/color/black, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/security/detectives_office/private_investigators_office) "apz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/railing{ @@ -1351,6 +1298,15 @@ dir = 4 }, /area/station/commons/fitness/recreation) +"apA" = ( +/obj/structure/table, +/obj/item/clothing/under/rank/security/officer, +/obj/item/restraints/handcuffs, +/obj/effect/spawner/random/maintenance, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/department/security) "apC" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/table_or_rack, @@ -1359,21 +1315,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/science) -"apJ" = ( -/obj/machinery/computer/mecha{ - dir = 8 - }, -/obj/machinery/computer/security/telescreen/rd{ - dir = 8; - pixel_x = 32 - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron, -/area/station/command/heads_quarters/rd) "apT" = ( /obj/machinery/camera/directional/north{ c_tag = "AI - Upload"; @@ -1435,16 +1376,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/execution/education) -"aqs" = ( -/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/siding/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/medical/treatment_center) "aqy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -1464,6 +1395,21 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/maintenance/department/eva/abandoned) +"aqF" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/item/radio/intercom/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Xeniobiology - Maintenance Access"; + name = "xenobiology camera"; + network = list("ss13","xeno","rd") + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/science/xenobiology) "aqS" = ( /obj/structure/bed{ dir = 4 @@ -1582,6 +1528,12 @@ /obj/structure/flora/bush/fullgrass/style_random, /turf/open/floor/grass, /area/station/hallway/secondary/exit/departure_lounge) +"arJ" = ( +/obj/machinery/gulag_teleporter, +/obj/effect/turf_decal/bot_red, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/processing) "arL" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -1611,6 +1563,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"asc" = ( +/obj/effect/landmark/start/hangover, +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/item/radio/intercom/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "ask" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1627,21 +1589,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron/dark, /area/station/service/bar) -"asm" = ( -/obj/structure/cable, -/obj/machinery/button/door/incinerator_vent_atmos_main{ - pixel_x = -8; - pixel_y = 36 - }, -/obj/machinery/button/door/incinerator_vent_atmos_aux{ - pixel_x = -8; - pixel_y = 24 - }, -/obj/machinery/light/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/stool/directional/south, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "aso" = ( /obj/machinery/camera/directional/north{ c_tag = "Atmospherics - Oxygen Supply"; @@ -1653,18 +1600,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) -"asr" = ( -/obj/machinery/status_display/ai/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Bridge - E.V.A. Aft"; - name = "command camera" - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) "asu" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock{ @@ -1780,21 +1715,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/tcommsat/server) -"atM" = ( -/obj/structure/table/wood, -/obj/item/storage/secure/safe/hos{ - pixel_x = 32 - }, -/obj/item/flashlight/lamp{ - pixel_y = 3 - }, -/obj/machinery/light_switch/directional/north, -/obj/effect/turf_decal/siding/dark_red{ - dir = 6 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/station/command/heads_quarters/hos) "atW" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -1853,41 +1773,12 @@ /obj/structure/flora/bush/grassy/style_random, /turf/open/floor/grass, /area/station/hallway/secondary/exit/departure_lounge) -"auu" = ( -/obj/structure/table/glass, -/obj/machinery/camera/directional/north{ - c_tag = "Security - Medbay" - }, -/obj/machinery/computer/records/medical/laptop, -/obj/machinery/status_display/ai/directional/north, -/obj/effect/turf_decal/siding/dark_red, -/turf/open/floor/iron/dark, -/area/station/security/medical) "aux" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/start/cyborg, /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/science/robotics/mechbay) -"auy" = ( -/obj/structure/table/wood, -/obj/item/radio/intercom/directional/east, -/obj/item/storage/fancy/donut_box, -/obj/machinery/light/small/directional/east, -/obj/machinery/button/door/directional/north{ - id = "paramed_dispatch"; - name = "Privacy Shutters"; - pixel_x = 6; - req_access = list("medical") - }, -/obj/machinery/light_switch/directional/north{ - pixel_x = -8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/paramedic) "auD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/poddoor{ @@ -1948,6 +1839,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/atmos/project) +"auW" = ( +/obj/structure/rack, +/obj/effect/turf_decal/bot, +/obj/structure/window/reinforced/spawner/directional/east{ + pixel_x = 3 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/spawner/random/armory/e_gun, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "auZ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -2016,13 +1918,15 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/maintenance/department/security) -"avQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half/contrasted{ +"avN" = ( +/obj/effect/turf_decal/siding/wood{ dir = 8 }, -/turf/open/floor/iron, -/area/station/cargo/office) +/obj/structure/chair/stool/bar/directional/west, +/obj/structure/sign/poster/contraband/random/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/station/service/electronic_marketing_den) "avR" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -2060,6 +1964,22 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"awi" = ( +/obj/structure/table/glass, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/science/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/space_hut/observatory) +"awj" = ( +/obj/machinery/computer/warrant{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "awk" = ( /obj/structure/lattice/catwalk, /turf/open/space, @@ -2071,6 +1991,13 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"awA" = ( +/obj/structure/sign/poster/random/directional/north, +/obj/machinery/module_duplicator, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/science/circuits) "awC" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/south, @@ -2095,13 +2022,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) -"awH" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/cold/directional/west, -/turf/open/floor/iron, -/area/station/science/auxlab/firing_range) "awL" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/east, @@ -2114,12 +2034,6 @@ /obj/structure/chair/stool/directional/east, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) -"axa" = ( -/obj/item/radio/intercom/prison/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/tile/neutral/full, -/turf/open/floor/iron/dark/smooth_large, -/area/station/security/prison/visit) "axg" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 4 @@ -2177,14 +2091,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/department/science/xenobiology) -"axH" = ( -/obj/structure/table/wood, -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/maintenance/two, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/iron/dark, -/area/station/service/abandoned_gambling_den) +"axz" = ( +/obj/structure/disposalpipe/trunk, +/obj/structure/disposaloutlet, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/cargo/sorting) "axQ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -2286,24 +2198,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/orange/visible, /turf/closed/wall/r_wall, /area/station/engineering/supermatter/room) -"azV" = ( -/obj/machinery/photocopier, -/obj/machinery/light/directional/north, -/obj/machinery/requests_console/directional/north{ - department = "Head of Security's Desk"; - name = "Head of Security's Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/structure/sign/nanotrasen{ - pixel_x = 32; - pixel_y = 32 - }, -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hos) "azW" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -2344,24 +2238,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/genetics) -"aAv" = ( -/obj/structure/closet/secure_closet/miner/unlocked, -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) -"aAx" = ( -/obj/structure/table/wood, -/obj/machinery/cell_charger, -/obj/machinery/status_display/ai/directional/north, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/service/abandoned_gambling_den) "aAA" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -2375,13 +2251,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) -"aBi" = ( -/obj/item/kirbyplants/random, -/obj/machinery/light/directional/south, -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) "aBn" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -2402,6 +2271,15 @@ /obj/effect/turf_decal/siding/white, /turf/open/floor/iron/dark/side, /area/station/commons/fitness/recreation) +"aBw" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/bot, +/obj/item/clipboard, +/obj/item/toy/figure/ce, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "aBy" = ( /obj/effect/decal/cleanable/oil, /obj/effect/turf_decal/tile/neutral/half/contrasted, @@ -2494,6 +2372,15 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/maintenance/department/chapel) +"aCN" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/pump, +/obj/effect/turf_decal/box/white, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "aCO" = ( /obj/machinery/light/directional/south, /obj/structure/disposalpipe/segment{ @@ -2568,17 +2455,6 @@ dir = 8 }, /area/station/science/auxlab/firing_range) -"aEi" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/bureaucracy/briefcase{ - spawn_loot_count = 2; - spawn_random_offset = 1 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/library) "aEs" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -2606,8 +2482,14 @@ /area/station/engineering/atmos) "aEE" = ( /obj/structure/table/wood, -/obj/item/flashlight/lamp, -/obj/item/reagent_containers/cup/glass/flask/det, +/obj/item/flashlight/lamp{ + pixel_x = 4; + pixel_y = 2 + }, +/obj/item/reagent_containers/cup/glass/flask/det{ + pixel_x = -12; + pixel_y = 10 + }, /turf/open/floor/carpet, /area/station/security/detectives_office) "aEJ" = ( @@ -2628,14 +2510,15 @@ }, /turf/open/floor/iron, /area/station/engineering/main) -"aES" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/department/science) +"aEQ" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/gloves/color/yellow, +/obj/item/storage/toolbox/electrical, +/obj/item/multitool, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "aEV" = ( /obj/effect/landmark/start/hangover/closet, /obj/effect/spawner/random/structure/closet_private, @@ -2650,7 +2533,6 @@ /turf/open/space, /area/space/nearstation) "aFs" = ( -/obj/machinery/lapvend, /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 4 }, @@ -2667,18 +2549,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"aFB" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron, -/area/station/maintenance/disposal) "aFE" = ( /obj/structure/sign/nanotrasen, /turf/closed/wall/r_wall, /area/station/command/teleporter) +"aFH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/oil, +/obj/effect/turf_decal/bot, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "aFU" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/maintenance_hatch{ @@ -2698,15 +2579,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/maintenance/department/science/xenobiology) -"aGg" = ( -/obj/structure/table, -/obj/item/storage/box/bodybags, -/obj/effect/spawner/random/maintenance, -/obj/machinery/light/small/red/directional/north, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/department/security) "aGm" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/line, @@ -2873,6 +2745,11 @@ /obj/item/toy/figure/chef, /turf/open/floor/iron/dark, /area/station/service/kitchen) +"aHw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "aHC" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/status_display/evac/directional/east, @@ -2939,12 +2816,22 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/primary/central/fore) +"aIm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/cargo/office) "aIp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/components/tank/air{ + dir = 12 + }, /turf/open/floor/iron/dark/corner, /area/station/maintenance/disposal/incinerator) "aIA" = ( @@ -2968,6 +2855,14 @@ dir = 5 }, /area/station/service/chapel) +"aIL" = ( +/obj/machinery/duct, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/engineering/main) "aIM" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -2997,6 +2892,11 @@ /obj/machinery/power/smes/engineering, /turf/open/floor/circuit/green, /area/station/engineering/main) +"aJw" = ( +/obj/effect/spawner/random/structure/tank_holder, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "aJy" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -3109,6 +3009,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/port/aft) +"aKq" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/security/courtroom) "aKt" = ( /turf/closed/wall, /area/station/service/abandoned_gambling_den/gaming) @@ -3122,26 +3030,10 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"aKS" = ( -/obj/effect/spawner/random/trash/food_packaging, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/maintenance/fore) "aKU" = ( /obj/structure/sign/warning/electric_shock/directional/west, /turf/open/space/basic, /area/space) -"aLq" = ( -/obj/machinery/light/directional/west, -/obj/machinery/computer/security/telescreen/entertainment/directional/west, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "aLv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3194,13 +3086,6 @@ }, /turf/open/floor/iron, /area/station/cargo/warehouse) -"aMb" = ( -/obj/effect/turf_decal/bot, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) "aMc" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -3282,16 +3167,6 @@ /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) -"aMO" = ( -/obj/machinery/computer/security/telescreen/entertainment/directional/west, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/bot_red, -/obj/machinery/suit_storage_unit/medical, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/textured, -/area/station/medical/storage) "aMX" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -3317,12 +3192,6 @@ "aNq" = ( /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/hos) -"aNz" = ( -/obj/structure/table, -/obj/item/trash/popcorn, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/cafeteria, -/area/station/security/prison/mess) "aND" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral, @@ -3354,6 +3223,13 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) +"aNJ" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/suit_storage_unit/standard_unit, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/eva) "aNM" = ( /obj/structure/cable, /obj/structure/disposalpipe/junction{ @@ -3385,15 +3261,15 @@ }, /turf/open/floor/iron/dark, /area/station/service/library) -"aOd" = ( -/obj/structure/frame/computer{ - anchored = 1; - dir = 1 - }, -/obj/item/stack/sheet/glass, -/obj/structure/sign/poster/contraband/borg_fancy_1/directional/south, -/turf/open/floor/plating, -/area/station/science/research/abandoned) +"aNV" = ( +/obj/machinery/vending/wallmed/directional/east, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/vending/wardrobe/coroner_wardrobe, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/siding/dark_blue, +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "aOf" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -3467,6 +3343,13 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"aOO" = ( +/obj/machinery/newscaster/directional/west, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) "aOQ" = ( /obj/structure/closet/secure_closet/courtroom, /obj/machinery/light_switch/directional/north, @@ -3505,38 +3388,6 @@ }, /turf/open/floor/iron/checker, /area/station/service/theater) -"aPo" = ( -/obj/structure/table/reinforced, -/obj/item/folder/yellow, -/obj/item/stack/package_wrap, -/obj/item/hand_labeler, -/obj/machinery/light/directional/east, -/obj/structure/extinguisher_cabinet/directional/north{ - pixel_x = 32 - }, -/obj/item/radio/intercom/directional/east{ - pixel_x = 38; - pixel_y = 3 - }, -/obj/machinery/keycard_auth/directional/east{ - pixel_x = 40; - pixel_y = -8 - }, -/obj/machinery/button/door/directional/east{ - id = "qmspace"; - name = "Space Shutters Control"; - pixel_y = -8 - }, -/obj/machinery/button/door/directional/east{ - id = "qmprivacy"; - name = "Privacy Control"; - pixel_y = 6 - }, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) "aPq" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -3569,15 +3420,11 @@ /area/station/science/robotics/lab) "aPD" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/mining{ - name = "Mining Dock" - }, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 }, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/supply/mining, /turf/open/floor/iron, /area/station/cargo/miningoffice) "aPO" = ( @@ -3587,12 +3434,31 @@ }, /turf/open/floor/iron/dark/corner, /area/station/engineering/atmos/pumproom) +"aPS" = ( +/obj/machinery/light/directional/north, +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "aPW" = ( /obj/structure/chair/office{ dir = 8 }, /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) +"aQc" = ( +/obj/machinery/duct, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_half, +/area/station/medical/morgue) "aQn" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -3662,15 +3528,13 @@ dir = 1 }, /area/station/service/bar) -"aRd" = ( -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 8 - }, -/obj/effect/turf_decal/siding/thinplating/dark/corner, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) +"aRq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/kirbyplants/random, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "aRr" = ( /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai_upload) @@ -3728,6 +3592,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) +"aSt" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/effect/turf_decal/trimline/dark_blue/filled/line, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "aSB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3750,6 +3619,14 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"aSJ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/commons/dorms) "aSO" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -3803,16 +3680,6 @@ }, /turf/open/floor/iron, /area/station/engineering/lobby) -"aTL" = ( -/obj/structure/sign/departments/medbay/alt/directional/west, -/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/blue{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) "aTQ" = ( /obj/structure/frame/computer{ anchored = 1; @@ -3841,6 +3708,15 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) +"aUu" = ( +/obj/structure/table/wood, +/obj/item/storage/crayons, +/obj/item/toy/crayon/spraycan, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/wood, +/area/station/maintenance/port/fore) "aUG" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -3914,6 +3790,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/chapel/storage) +"aVQ" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/bodycontainer/morgue/beeper_off, +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/warning, +/turf/open/floor/iron/dark/textured_half, +/area/station/medical/morgue) "aVW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3949,6 +3834,18 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) +"aWt" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/computer/slot_machine, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/department/crew_quarters/bar) "aWu" = ( /obj/structure/cable, /obj/machinery/door/poddoor/preopen{ @@ -4120,18 +4017,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos) -"aYA" = ( -/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, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "aYF" = ( /obj/machinery/door/airlock/command/glass{ name = "Departures Customs Desk" @@ -4164,17 +4049,23 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/cargo/office) -"aYT" = ( -/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/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "aYU" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/engineering/main) +"aZo" = ( +/obj/structure/table/reinforced, +/obj/item/electronics/airalarm, +/obj/item/electronics/apc, +/obj/machinery/camera/directional/west{ + c_tag = "Technology Storage"; + name = "engineering camera" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "aZp" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -4191,14 +4082,6 @@ /obj/effect/turf_decal/siding/white, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) -"aZy" = ( -/obj/structure/cable, -/obj/item/kirbyplants/random, -/obj/machinery/light/directional/north, -/obj/machinery/newscaster/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "aZz" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -4221,6 +4104,13 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/project) +"aZK" = ( +/obj/machinery/status_display/evac/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "aZO" = ( /obj/machinery/newscaster/directional/west, /obj/effect/landmark/start/hangover, @@ -4373,13 +4263,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"bbS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/frame/machine, -/obj/item/wirecutters, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/department/crew_quarters/bar) "bcg" = ( /obj/structure/chair/wood, /turf/open/floor/wood, @@ -4426,16 +4309,6 @@ /obj/machinery/status_display/ai/directional/west, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) -"bcF" = ( -/obj/structure/sign/poster/official/help_others/directional/east, -/obj/machinery/light/warm/directional/south, -/obj/structure/closet/secure_closet/psychology, -/obj/item/toy/plush/beeplushie{ - desc = "Maybe hugging this will make you feel better about yourself."; - name = "Therabee" - }, -/turf/open/floor/wood, -/area/station/medical/psychology) "bcR" = ( /obj/structure/chair/office{ dir = 8 @@ -4490,8 +4363,14 @@ /area/station/commons/fitness/recreation) "bdC" = ( /obj/structure/table, -/obj/item/storage/box/bodybags, -/obj/item/clothing/gloves/latex, +/obj/item/storage/box/bodybags{ + pixel_x = -3; + pixel_y = 18 + }, +/obj/item/clothing/gloves/latex{ + pixel_x = 3; + pixel_y = 4 + }, /obj/effect/turf_decal/trimline/neutral/warning{ dir = 1 }, @@ -4537,6 +4416,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/security/prison/toilet) +"beD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/port) "beG" = ( /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/preopen{ @@ -4595,6 +4483,16 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/commons/dorms) +"bfn" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) "bfq" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -4684,18 +4582,6 @@ /obj/machinery/computer/security/telescreen/entertainment/directional/north, /turf/open/floor/wood/large, /area/station/service/library) -"bgl" = ( -/obj/machinery/hydroponics/constructable, -/obj/item/radio/intercom/directional/north, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) "bgo" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/trimline/green/line{ @@ -4843,6 +4729,21 @@ }, /turf/open/floor/iron, /area/station/security/prison/safe) +"bhJ" = ( +/obj/machinery/computer/security/mining{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/newscaster/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"bhN" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/project) "bhP" = ( /obj/structure/table, /obj/item/storage/belt/utility, @@ -4869,19 +4770,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"bhZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Central Hallway - Fore Port"; - name = "hallway camera" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "bii" = ( /obj/effect/spawner/random/entertainment/arcade{ dir = 8 @@ -4928,6 +4816,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/cryo) +"biI" = ( +/obj/machinery/status_display/ai/directional/west, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "biO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4955,6 +4850,16 @@ /obj/effect/turf_decal/stripes/end, /turf/open/floor/iron/white, /area/station/science/lobby) +"biZ" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/checker, +/area/station/hallway/secondary/service) "bjk" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch" @@ -5019,19 +4924,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"bjJ" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 4 - }, -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/entry) "bjN" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/mining{ @@ -5093,14 +4985,10 @@ /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/hos) "bkr" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, /obj/machinery/conveyor{ id = "cargodisposals" }, -/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/cargo/sorting) "bkD" = ( @@ -5230,15 +5118,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"bmm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/obj/structure/sign/poster/contraband/borg_fancy_2/directional/south, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "bmn" = ( /obj/structure/cable, /obj/effect/landmark/start/hangover, @@ -5248,6 +5127,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"bmp" = ( +/obj/machinery/status_display/ai/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "bmq" = ( /obj/structure/filingcabinet/chestdrawer, /obj/effect/turf_decal/tile/neutral/half/contrasted, @@ -5329,13 +5213,6 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/iron, /area/station/command/gateway) -"bmY" = ( -/obj/structure/sign/poster/random/directional/north, -/obj/machinery/module_duplicator, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/circuits) "bnt" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -5673,17 +5550,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos) -"bsA" = ( -/obj/machinery/firealarm/directional/west, -/obj/machinery/light/directional/west, -/obj/structure/cable, -/obj/item/kirbyplants/random, -/obj/machinery/duct, -/obj/effect/turf_decal/trimline/green/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) "bsC" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -5712,16 +5578,12 @@ /obj/effect/turf_decal/tile/neutral/half, /turf/open/floor/iron/smooth_half, /area/station/maintenance/port/aft) -"bsQ" = ( -/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/duct, -/obj/machinery/light/directional/west, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/white, -/area/station/science/research) +"bsS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/stool/directional/north, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/cafeteria, +/area/station/security/prison/mess) "bsY" = ( /obj/effect/spawner/structure/window/hollow/reinforced/directional{ dir = 5 @@ -5777,20 +5639,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay) -"btz" = ( -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/mechanical, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/glasses/welding, -/obj/effect/turf_decal/siding/purple{ - dir = 8 - }, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/iron, -/area/station/science/lab) "btE" = ( /obj/structure/chair/pew, /turf/open/floor/iron/chapel{ @@ -5845,6 +5693,16 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/storage/gas) +"buo" = ( +/obj/machinery/computer/scan_consolenew{ + dir = 4 + }, +/obj/effect/turf_decal/bot/left, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/science/genetics) "buK" = ( /obj/structure/table/wood/fancy, /turf/open/floor/iron/grimy, @@ -5893,6 +5751,11 @@ /obj/effect/turf_decal/tile/purple/anticorner/contrasted, /turf/open/floor/iron/white/telecomms, /area/station/tcommsat/server) +"bvG" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "bvI" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/vomit/old, @@ -5973,6 +5836,15 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/dark, /area/station/service/bar) +"bwi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/structure/sign/poster/random/directional/south, +/obj/machinery/power/port_gen/pacman/pre_loaded, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "bwl" = ( /obj/effect/turf_decal/trimline/blue/filled/corner, /obj/machinery/power/apc/auto_name/directional/east, @@ -6087,14 +5959,35 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/service/theater) -"byy" = ( -/obj/machinery/newscaster/directional/east, -/obj/effect/turf_decal/trimline/blue/filled/corner{ +"byx" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/entertainment/cigarette_pack{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/effect/spawner/random/entertainment/cigarette_pack{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/item/storage/box/coffeepack{ + pixel_x = -13; + pixel_y = 7 + }, +/turf/open/floor/wood, +/area/station/engineering/break_room) +"byP" = ( +/obj/machinery/firealarm/directional/east, +/obj/machinery/camera{ + c_tag = "Cargo Bay - Drone Bay"; + dir = 4; + name = "cargo camera" + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 4 }, /obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/medbay) +/turf/open/floor/iron, +/area/station/cargo/drone_bay) "byX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6175,13 +6068,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"bzI" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/status_display/ai/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/telecomms, -/area/station/science/server) "bzU" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -6209,6 +6095,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/engineering/supermatter/room) +"bAp" = ( +/obj/structure/sink/directional/west, +/obj/item/trash/sosjerky, +/obj/structure/sign/poster/official/cleanliness/directional/east, +/obj/machinery/firealarm/directional/south, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/security/prison/toilet) "bAt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6320,6 +6215,21 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"bBh" = ( +/obj/machinery/disposal/bin, +/obj/structure/sign/nanotrasen{ + pixel_x = 32; + pixel_y = -32 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/airalarm/directional/south, +/obj/machinery/status_display/evac/directional/east, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hos) "bBl" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/item/target, @@ -6329,16 +6239,6 @@ }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) -"bBm" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/sign/warning/pods/directional/east, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "bBp" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -6382,8 +6282,8 @@ /turf/open/floor/iron, /area/station/science/robotics/lab) "bBG" = ( -/obj/structure/bed{ - dir = 4 +/obj/structure/bed/medical/anchored{ + dir = 8 }, /obj/item/bedsheet/medical{ dir = 4 @@ -6441,14 +6341,25 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/grimy, /area/station/command/bridge) +"bCj" = ( +/obj/structure/table/reinforced, +/obj/item/electronics/firelock, +/obj/item/electronics/firelock, +/obj/item/electronics/firealarm, +/obj/item/electronics/firealarm, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "bCn" = ( /obj/effect/turf_decal/trimline/yellow/corner, /turf/open/floor/iron, /area/station/engineering/atmos/project) -"bCt" = ( -/obj/machinery/light_switch/directional/south, -/turf/open/floor/wood, -/area/station/command/meeting_room/council) +"bCo" = ( +/obj/machinery/portable_atmospherics/canister/plasma, +/obj/effect/turf_decal/bot, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark/textured, +/area/station/science/ordnance/storage) "bCu" = ( /obj/structure/cable, /turf/open/floor/circuit/green, @@ -6480,6 +6391,13 @@ }, /turf/open/floor/wood, /area/station/service/theater) +"bCX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/obj/effect/spawner/random/structure/tank_holder, +/obj/structure/sign/poster/official/wtf_is_co2/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/department/engine/atmos) "bCY" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -6667,6 +6585,15 @@ dir = 4 }, /area/station/service/chapel) +"bES" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/department/eva/abandoned) "bET" = ( /obj/structure/sign/warning/vacuum, /turf/closed/wall/r_wall, @@ -6836,6 +6763,19 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/checker, /area/station/service/bar/backroom) +"bGl" = ( +/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, +/obj/structure/sign/poster/official/help_others/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "bGn" = ( /obj/machinery/airalarm/directional/south, /obj/structure/filingcabinet/chestdrawer, @@ -6930,6 +6870,12 @@ }, /turf/open/floor/iron, /area/station/construction/mining/aux_base) +"bHg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/status_display/ai/directional/east, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "bHj" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch" @@ -6971,18 +6917,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"bHZ" = ( -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/mid_joiner{ - dir = 4 - }, -/obj/machinery/smartfridge/organ, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "bIa" = ( /obj/effect/turf_decal/trimline/blue/end{ dir = 4 @@ -6996,13 +6930,6 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron, /area/station/engineering/main) -"bIe" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) "bIh" = ( /obj/machinery/door/window/brigdoor{ dir = 1; @@ -7058,18 +6985,6 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron, /area/station/service/hydroponics) -"bIM" = ( -/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/camera/directional/east{ - c_tag = "Central Hallway - Bridge Port"; - name = "hallway camera" - }, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "bIP" = ( /obj/machinery/light/directional/south, /obj/machinery/camera/directional/south{ @@ -7221,6 +7136,15 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/service/theater) +"bKo" = ( +/obj/machinery/computer/station_alert{ + dir = 1 + }, +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/main) "bKp" = ( /obj/machinery/atmospherics/components/binary/pump/on{ dir = 1; @@ -7277,6 +7201,12 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/aft) +"bLl" = ( +/obj/structure/filingcabinet/medical, +/obj/machinery/light_switch/directional/east, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron/grimy, +/area/station/command/heads_quarters/hop) "bLo" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/brown{ @@ -7364,6 +7294,28 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/department/science) +"bLN" = ( +/obj/structure/rack, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/toolbox/emergency{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/storage/toolbox/emergency, +/obj/item/shovel, +/obj/item/shovel, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/effect/turf_decal/bot, +/obj/machinery/light/small/directional/south, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/machinery/light_switch/directional/west{ + pixel_x = -38 + }, +/obj/machinery/airalarm/directional/south, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "bLP" = ( /obj/machinery/camera/directional/east{ c_tag = "Permabrig - Kitchen Entrance"; @@ -7406,6 +7358,16 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) +"bMb" = ( +/obj/structure/bodycontainer/morgue/beeper_off{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/warning, +/turf/open/floor/iron/dark/textured_half, +/area/station/medical/morgue) "bMd" = ( /obj/effect/turf_decal/trimline/white/warning{ dir = 8 @@ -7445,6 +7407,12 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"bMI" = ( +/obj/structure/closet/crate/goldcrate, +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) "bML" = ( /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, @@ -7665,6 +7633,20 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"bQz" = ( +/obj/item/kirbyplants/random, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/plating, +/area/station/service/abandoned_gambling_den) +"bQN" = ( +/obj/item/radio/intercom/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron, +/area/station/commons/lounge) "bRe" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -7675,15 +7657,6 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/medical/medsci) -"bRh" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/directional/north, -/obj/machinery/gulag_item_reclaimer{ - pixel_y = 28 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/processing) "bRl" = ( /obj/structure/sign/warning/electric_shock{ pixel_y = -32 @@ -7738,18 +7711,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat_interior) -"bRA" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/machinery/light/directional/north, -/obj/machinery/status_display/ai/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) "bRC" = ( /obj/machinery/cell_charger, /obj/structure/table/reinforced, @@ -7796,13 +7757,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"bRL" = ( -/obj/machinery/teleport/station, -/obj/machinery/light/directional/north, -/obj/machinery/status_display/ai/directional/north, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) "bRM" = ( /obj/machinery/computer/teleporter, /obj/effect/turf_decal/stripes/line{ @@ -7847,6 +7801,14 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating, /area/station/maintenance/disposal) +"bRZ" = ( +/obj/structure/table/wood, +/obj/machinery/computer/libraryconsole{ + dir = 1 + }, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/dark, +/area/station/service/library/private) "bSa" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron, @@ -7859,6 +7821,16 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron, /area/station/security/execution/transfer) +"bSn" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 8 + }, +/obj/structure/sign/poster/official/anniversary_vintage_reprint/directional/south, +/turf/open/floor/iron/white, +/area/station/science/research) "bSp" = ( /obj/effect/landmark/start/hangover, /obj/structure/table/wood, @@ -7911,13 +7883,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/science/xenobiology) -"bSI" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/mannequin/skeleton, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "bSN" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -7948,6 +7913,17 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/iron, /area/station/engineering/atmos/project) +"bSX" = ( +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 4 + }, +/obj/structure/bed/medical/anchored{ + dir = 4 + }, +/obj/item/bedsheet/medical, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/medical) "bSZ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -7974,6 +7950,18 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port) +"bTo" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 1 + }, +/obj/machinery/status_display/evac/directional/south, +/obj/structure/table/wood, +/obj/item/flashlight/lamp, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/cmo) "bTq" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, @@ -8036,12 +8024,6 @@ /obj/item/reagent_containers/dropper, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) -"bTX" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/structure/sign/poster/official/report_crimes/directional/north, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "bTZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8062,33 +8044,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/engine_equipment, /turf/open/floor/iron, /area/station/engineering/storage) -"bUg" = ( -/obj/effect/spawner/random/vending/colavend, -/obj/structure/sign/poster/official/ian/directional/south, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/central/fore) -"bUy" = ( -/obj/structure/rack, -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/item/book/manual/wiki/atmospherics{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/book/manual/wiki/tcomms{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/book/manual/wiki/engineering_guide{ - pixel_x = 3 - }, -/obj/item/book/manual/wiki/engineering_construction{ - pixel_x = -3 - }, -/turf/open/floor/plating, -/area/station/maintenance/port) "bUz" = ( /obj/structure/sign/warning/secure_area/directional/south, /obj/item/kirbyplants/random, @@ -8157,23 +8112,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/port/aft) -"bVI" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/item/kirbyplants/random, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Engineering - Fore"; - name = "engineering camera" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/main) "bVJ" = ( /obj/machinery/camera/directional/north{ c_tag = "Central Hallway - Center"; @@ -8234,35 +8172,30 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/maintenance/department/science/xenobiology) -"bVY" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/button/door{ - id = "xeno1"; - name = "Containment Control"; - req_access = list("xenobiology") +"bWn" = ( +/obj/structure/sign/poster/party_game/directional/west, +/obj/structure/table, +/obj/item/storage/secure/briefcase{ + pixel_x = 3; + pixel_y = 3 }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"bWa" = ( -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/pipe/layer_manifold/green/visible, -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/stripes/corner{ +/obj/item/storage/briefcase{ + pixel_y = -2 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 }, /turf/open/floor/iron, -/area/station/engineering/supermatter/room) +/area/station/commons/fitness/recreation) "bWw" = ( -/obj/machinery/button/flasher{ - id = "Cell 6"; - name = "Prisoner Flash"; - pixel_x = -25 - }, /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/machinery/status_display/door_timer{ + id = "Isolation_Cell"; + name = "Isolation Cell"; + pixel_x = -32 + }, /turf/open/floor/iron, /area/station/security/execution/transfer) "bWD" = ( @@ -8285,6 +8218,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/circuits) +"bWN" = ( +/obj/machinery/firealarm/directional/south, +/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/siding/wood{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) "bWT" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/purple{ @@ -8378,6 +8324,14 @@ }, /turf/open/floor/iron/grimy, /area/station/ai_monitored/turret_protected/aisat_interior) +"bYh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/sign/warning/no_smoking/directional/south, +/obj/effect/turf_decal/trimline/purple/filled/line, +/turf/open/floor/iron/white, +/area/station/science/ordnance/storage) "bYk" = ( /obj/effect/turf_decal/siding/white{ dir = 4 @@ -8424,13 +8378,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/port) -"bYx" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) "bYG" = ( /obj/item/clipboard, /obj/item/folder/yellow, @@ -8516,22 +8463,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"cab" = ( -/obj/machinery/computer/monitor{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/item/radio/intercom/directional/south{ - freerange = 1; - frequency = 1447; - listening = 0; - name = "Private Channel" - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) "cac" = ( /obj/machinery/recharge_station, /obj/machinery/status_display/evac/directional/south, @@ -8605,6 +8536,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/security/prison/safe) +"caI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/iron, +/area/station/engineering/main) "caW" = ( /obj/structure/sign/poster/random/directional/west, /obj/structure/closet, @@ -8658,6 +8596,15 @@ /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/iron, /area/station/medical/abandoned) +"cbF" = ( +/obj/machinery/status_display/evac/directional/west, +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/virology) "cbR" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron/dark, @@ -8715,6 +8662,13 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) +"ccy" = ( +/obj/effect/spawner/random/trash/food_packaging, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/maintenance/fore) "ccA" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -8809,6 +8763,13 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/iron, /area/station/maintenance/port) +"cdS" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "cec" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -8853,6 +8814,12 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/iron/dark, /area/station/service/library) +"ceE" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt, +/obj/item/flashlight/lamp, +/turf/open/floor/carpet, +/area/station/service/library/abandoned) "ceF" = ( /turf/closed/wall, /area/station/science/genetics) @@ -8867,18 +8834,6 @@ icon_state = "foam_plating" }, /area/station/maintenance/department/science/xenobiology) -"cfd" = ( -/obj/structure/mop_bucket/janitorialcart, -/obj/item/mop, -/obj/item/reagent_containers/cup/bucket, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/siding/purple/corner{ - dir = 4 - }, -/obj/effect/turf_decal/bot/left, -/obj/item/storage/bag/trash, -/turf/open/floor/iron/checker, -/area/station/service/janitor) "cfp" = ( /obj/structure/table/wood, /obj/item/storage/box/rubbershot{ @@ -8998,6 +8953,9 @@ }, /turf/open/floor/iron, /area/station/security/lockers) +"chg" = ( +/turf/open/floor/wood, +/area/station/service/electronic_marketing_den) "chi" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -9161,11 +9119,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) -"cjx" = ( -/obj/machinery/airalarm/directional/south, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white, -/area/station/science/research) "cjE" = ( /obj/structure/disposalpipe/junction{ dir = 4 @@ -9175,15 +9128,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/medbay) -"cjG" = ( -/obj/structure/sign/poster/official/fruit_bowl/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/status_display/evac/directional/south, -/obj/structure/tank_holder/extinguisher, -/turf/open/floor/engine, -/area/station/science/genetics) "cjH" = ( /obj/machinery/firealarm/directional/south, /obj/structure/frame/computer{ @@ -9196,18 +9140,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/explab) -"cjI" = ( -/obj/structure/table/wood, -/obj/machinery/newscaster/directional/east, -/obj/item/storage/secure/briefcase, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/taperecorder{ - pixel_x = 3; - pixel_y = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hos) "cjN" = ( /turf/closed/wall/r_wall, /area/station/security/office) @@ -9275,7 +9207,7 @@ /area/station/medical/psychology) "ckB" = ( /obj/structure/closet/secure_closet/hop, -/obj/item/clothing/suit/costume/ianshirt, +/obj/item/clothing/suit/costume/wellworn_shirt/graphic/ian, /obj/item/bedsheet/ian, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/hop) @@ -9307,6 +9239,21 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) +"ckO" = ( +/obj/machinery/modular_computer/preset/id{ + dir = 8 + }, +/obj/machinery/computer/security/telescreen/entertainment/directional/east, +/obj/machinery/light/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Customs - Departures Customs" + }, +/obj/effect/turf_decal/bot/right, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/customs/aft) "ckP" = ( /turf/open/floor/plating, /area/station/maintenance/starboard/aft) @@ -9330,6 +9277,11 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/external, /turf/open/floor/iron, /area/station/construction/mining/aux_base) +"clj" = ( +/obj/effect/landmark/start/prisoner, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/station/security/prison/work) "cln" = ( /obj/structure/table/wood, /obj/item/instrument/guitar, @@ -9359,7 +9311,6 @@ /turf/open/space/basic, /area/space/nearstation) "clx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, /obj/machinery/computer/atmos_control/nocontrol/incinerator{ dir = 1 @@ -9367,6 +9318,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, /turf/open/floor/iron/dark/corner, /area/station/maintenance/disposal/incinerator) "clE" = ( @@ -9398,6 +9350,20 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) +"clK" = ( +/obj/structure/reagent_dispensers/plumbed{ + dir = 8; + name = "service water reservoir" + }, +/obj/effect/turf_decal/delivery/white{ + color = "#52B4E9" + }, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/textured, +/area/station/maintenance/port/fore) "clO" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -9425,6 +9391,21 @@ /obj/machinery/computer/security/telescreen/entertainment/directional/east, /turf/open/floor/plating, /area/station/service/theater/abandoned) +"cmb" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/machinery/newscaster/directional/north, +/obj/machinery/button/door/directional/south{ + id = "Arrivals_Toilet1"; + name = "Lock Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/broken/directional/east, +/turf/open/floor/plating, +/area/station/commons/toilet/restrooms) "cmd" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, @@ -9473,13 +9454,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) -"cmG" = ( -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/rock/pile/style_random, -/obj/machinery/light/floor, -/turf/open/misc/grass, -/area/station/hallway/primary/fore) "cmI" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -9559,6 +9533,17 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/command/gateway) +"cni" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/structure/tank_holder/anesthetic, +/turf/open/floor/iron/dark/textured_half, +/area/station/science/robotics/lab) "cnl" = ( /obj/structure/table, /obj/machinery/chem_dispenser/drinks{ @@ -9579,6 +9564,15 @@ /obj/structure/rack, /turf/open/floor/plating, /area/station/maintenance/fore) +"cnp" = ( +/obj/machinery/photocopier, +/obj/machinery/status_display/ai/directional/north, +/obj/structure/reagent_dispensers/wall/peppertank/directional/east, +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/detectives_office) "cnu" = ( /obj/machinery/camera/directional/east{ c_tag = "Telecomms - Cooling Room"; @@ -9617,12 +9611,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) -"cnK" = ( -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/machinery/light/floor, -/turf/open/misc/grass, -/area/station/hallway/primary/fore) "cnL" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -9739,13 +9727,6 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/atmos/hfr_room) -"cpA" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/range) "cpE" = ( /obj/structure/table/glass, /obj/item/reagent_containers/cup/bottle/morphine, @@ -9755,6 +9736,13 @@ /obj/effect/turf_decal/siding/dark_red, /turf/open/floor/iron/dark, /area/station/security/execution/transfer) +"cpG" = ( +/obj/structure/sign/poster/contraband/kudzu/directional/west, +/obj/machinery/light/small/directional/west, +/obj/structure/table, +/obj/machinery/reagentgrinder, +/turf/open/floor/iron/checker, +/area/station/service/hydroponics) "cpK" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -9820,15 +9808,6 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron, /area/station/service/hydroponics) -"crk" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay) "crw" = ( /obj/effect/landmark/event_spawn, /obj/structure/cable, @@ -9836,6 +9815,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/command/gateway) +"crD" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 1 + }, +/obj/structure/sign/poster/contraband/borg_fancy_1/directional/west, +/obj/structure/table/reinforced, +/obj/machinery/ecto_sniffer, +/turf/open/floor/iron/dark/textured_half, +/area/station/science/robotics/lab) "crE" = ( /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/engine/air, @@ -9844,6 +9835,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) +"crS" = ( +/obj/machinery/modular_computer/preset/id{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/command/heads_quarters/rd) "crT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -9882,23 +9885,22 @@ /obj/structure/cable, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai_upload) -"css" = ( -/obj/machinery/photocopier, -/obj/machinery/status_display/ai/directional/north, -/obj/structure/reagent_dispensers/wall/peppertank/directional/east, -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/detectives_office) "csw" = ( /turf/closed/wall, /area/station/service/hydroponics) "csy" = ( /obj/structure/table/wood, -/obj/item/pen, -/obj/item/paper_bin/carbon, -/obj/item/pen, -/obj/item/toy/figure/detective, +/obj/item/pen{ + pixel_x = 16 + }, +/obj/item/paper_bin/carbon{ + pixel_x = -1; + pixel_y = 5 + }, +/obj/item/pen{ + pixel_x = -1; + pixel_y = 8 + }, /turf/open/floor/carpet, /area/station/security/detectives_office) "csz" = ( @@ -9941,6 +9943,16 @@ dir = 8 }, /area/station/hallway/primary/port) +"csO" = ( +/obj/machinery/door/window/brigdoor{ + name = "Creature Pen"; + req_access = list("research") + }, +/obj/structure/cable, +/obj/effect/turf_decal/bot, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/science/xenobiology) "csR" = ( /obj/machinery/shieldgen, /obj/effect/decal/cleanable/dirt, @@ -9962,11 +9974,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/xenobiology) -"ctr" = ( -/obj/item/kirbyplants/random, -/obj/structure/sign/poster/official/report_crimes/directional/south, -/turf/open/floor/wood, -/area/station/service/lawoffice) "ctw" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=engi1"; @@ -10010,6 +10017,17 @@ dir = 1 }, /area/station/service/bar) +"cud" = ( +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_half{ + dir = 1 + }, +/area/station/medical/morgue) "cug" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -10036,15 +10054,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/engineering/main) -"cuj" = ( -/obj/effect/turf_decal/trimline/neutral/warning, -/obj/structure/chair/office/tactical{ - dir = 8 - }, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "cul" = ( /obj/machinery/plate_press, /obj/structure/sign/warning/electric_shock/directional/east, @@ -10090,17 +10099,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/security/prison/safe) -"cuM" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Chapel - Fore Port"; - name = "chapel camera"; - network = list("ss13","chapel") - }, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/chapel{ - dir = 1 - }, -/area/station/service/chapel) "cvc" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -10109,8 +10107,21 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/department/science) +"cvo" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/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/blue{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/paramedic) "cvr" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -10128,6 +10139,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) +"cvx" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/wood, +/area/station/command/meeting_room/council) "cvE" = ( /obj/machinery/computer/cargo/request{ dir = 4 @@ -10135,18 +10150,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) -"cvY" = ( -/obj/machinery/button/crematorium{ - id = "crematoriumChapel"; - pixel_x = 25 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +"cwd" = ( +/obj/effect/turf_decal/box/corners, +/obj/effect/turf_decal/box/corners{ + dir = 4 }, -/obj/structure/sign/warning/hot_temp/directional/north, -/obj/machinery/light/small/red/directional/north, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) +/obj/machinery/light/directional/south, +/obj/effect/landmark/bitrunning/station_reward_spawn, +/turf/open/floor/iron/dark/smooth_large, +/area/station/bitrunning/den) "cwe" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -10199,10 +10211,20 @@ /turf/open/floor/iron, /area/station/engineering/supermatter/room) "cwK" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, +/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/brown/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, /area/station/maintenance/starboard/fore) "cwV" = ( /obj/effect/landmark/start/hangover, @@ -10279,11 +10301,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/maintenance/fore) -"cxK" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) "cxM" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line, @@ -10319,13 +10336,10 @@ /turf/open/floor/iron, /area/station/medical/treatment_center) "cyc" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple/half/contrasted, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) +/obj/machinery/netpod, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/bitrunning/den) "cyq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -10401,11 +10415,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos) -"cza" = ( -/obj/item/kirbyplants/random, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/service/abandoned_gambling_den) "czf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/large, @@ -10428,11 +10437,16 @@ }, /turf/open/floor/glass, /area/station/maintenance/space_hut/observatory) -"czq" = ( -/obj/structure/table/optable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/medical/surgery/theatre) +"czu" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/airalarm/directional/south, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/command/teleporter) "czy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/duct, @@ -10482,6 +10496,25 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/medical/surgery/theatre) +"cAb" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/button/door{ + id = "xeno3"; + name = "Containment Control"; + req_access = list("xenobiology") + }, +/turf/open/floor/iron, +/area/station/science/xenobiology) +"cAd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron, +/area/station/science/robotics/mechbay) "cAs" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -10518,17 +10551,6 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) -"cAH" = ( -/obj/machinery/status_display/evac/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Courtroom - Center" - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/courtroom) "cAP" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -10574,15 +10596,6 @@ }, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/freezerchamber) -"cBr" = ( -/obj/machinery/suit_storage_unit/atmos, -/obj/effect/turf_decal/box/red/corners{ - dir = 4 - }, -/obj/effect/turf_decal/box/red/corners, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/atmos/storage) "cBt" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/steam_vent, @@ -10669,20 +10682,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"cBY" = ( -/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, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/structure/sign/poster/official/report_crimes/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/medbay) "cCb" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -10721,6 +10720,14 @@ /obj/effect/turf_decal/tile/yellow/anticorner/contrasted, /turf/open/floor/iron, /area/station/construction/mining/aux_base) +"cCD" = ( +/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/tile/neutral, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "cCJ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -10874,6 +10881,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"cDW" = ( +/obj/machinery/seed_extractor, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/checker, +/area/station/service/hydroponics/garden/abandoned) "cEa" = ( /obj/effect/spawner/random/structure/girder, /obj/effect/spawner/random/trash/grille_or_waste, @@ -10911,24 +10923,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"cEr" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"cEx" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/pump, -/obj/effect/turf_decal/box/white, -/obj/machinery/light/directional/east, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/dark, -/area/station/commons/locker) "cEK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -10946,17 +10940,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"cEO" = ( -/obj/machinery/cell_charger, -/obj/structure/table/reinforced, -/obj/machinery/status_display/ai/directional/north, -/obj/item/rcl/pre_loaded, -/obj/effect/turf_decal/bot, -/obj/item/stock_parts/cell/high, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "cEQ" = ( /obj/effect/landmark/start/hangover, /obj/effect/decal/cleanable/dirt, @@ -11010,6 +10993,16 @@ /obj/effect/turf_decal/tile/purple/half/contrasted, /turf/open/floor/iron, /area/station/cargo/storage) +"cFB" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 8 + }, +/obj/machinery/newscaster/directional/east, +/obj/effect/turf_decal/bot_red, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/science/ordnance) "cFF" = ( /turf/open/floor/engine{ name = "Holodeck Projector Floor" @@ -11025,13 +11018,6 @@ name = "Holodeck Projector Floor" }, /area/station/holodeck/rec_center) -"cFN" = ( -/obj/effect/spawner/random/entertainment/arcade{ - dir = 1 - }, -/obj/machinery/light/dim/directional/south, -/turf/open/floor/plating, -/area/station/service/abandoned_gambling_den/gaming) "cFQ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/glass, @@ -11110,7 +11096,7 @@ /area/station/tcommsat/computer) "cGV" = ( /turf/closed/wall, -/area/station/cargo/miningoffice) +/area/station/bitrunning/den) "cHb" = ( /obj/machinery/door/firedoor/heavy, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -11217,22 +11203,11 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"cIa" = ( -/obj/effect/landmark/start/hangover, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Service - Hydroponics Kitchen Access"; - name = "service camera" - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/service/kitchen) +"cIb" = ( +/obj/effect/mapping_helpers/ianbirthday, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "cIn" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron, @@ -11251,6 +11226,13 @@ }, /turf/open/floor/engine/n2, /area/station/engineering/atmos) +"cIw" = ( +/obj/machinery/suit_storage_unit/captain, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/captain/private) "cIA" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11260,12 +11242,18 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron, /area/station/engineering/hallway) -"cIO" = ( -/obj/machinery/light/directional/west, -/obj/structure/sign/warning/secure_area/directional/west, +"cIE" = ( +/obj/effect/landmark/start/hangover/closet, +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/delivery, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, -/area/station/engineering/atmos) +/area/station/hallway/primary/central/fore) +"cIX" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/bar) "cIZ" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -11277,6 +11265,12 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) +"cJh" = ( +/obj/item/kirbyplants/random, +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) "cJw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11288,14 +11282,6 @@ /obj/effect/turf_decal/tile/green/fourcorners, /turf/open/floor/iron, /area/station/medical/virology) -"cJD" = ( -/turf/closed/wall, -/area/station/security/checkpoint/escape) -"cJE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/bot, -/turf/closed/wall, -/area/station/maintenance/department/medical/morgue) "cJK" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -11461,17 +11447,6 @@ }, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/hos) -"cMf" = ( -/obj/machinery/firealarm/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/execution/transfer) "cMn" = ( /obj/machinery/duct, /obj/effect/turf_decal/trimline/purple/filled/corner, @@ -11540,6 +11515,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/cargo/storage) +"cNm" = ( +/obj/item/kirbyplants/random, +/obj/machinery/camera/directional/east{ + c_tag = "Security Post - Cargo" + }, +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) "cNp" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command{ @@ -11571,20 +11555,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/grimy, /area/station/service/library) -"cNP" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/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/machinery/light/directional/north, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/office) "cNQ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/closet_maintenance, @@ -11606,6 +11576,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"cOc" = ( +/mob/living/basic/mouse/white, +/turf/open/floor/iron/cafeteria, +/area/station/security/prison/mess) "cOg" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/south, @@ -11653,11 +11627,34 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos/storage/gas) +"cOE" = ( +/obj/machinery/door/airlock/security{ + name = "Brig" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/sign/poster/official/nanotrasen_logo/directional/west, +/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/access/all/security/general, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/security/brig) "cOJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"cOR" = ( +/obj/effect/spawner/random/maintenance/two, +/obj/structure/closet, +/obj/effect/spawner/random/trash/janitor_supplies, +/turf/open/floor/plating, +/area/station/maintenance/fore) "cOU" = ( /obj/structure/weightmachine/weightlifter, /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ @@ -11696,17 +11693,6 @@ /obj/effect/turf_decal/loading_area, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"cPw" = ( -/obj/machinery/status_display/evac/directional/east, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/light/cold/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/circuits) "cPD" = ( /obj/effect/turf_decal/bot, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11759,6 +11745,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) +"cQj" = ( +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/port) "cQl" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/iron, @@ -11855,16 +11845,17 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/iron/grimy, /area/station/service/library/abandoned) +"cRo" = ( +/obj/structure/closet/crate/bin, +/obj/effect/spawner/random/contraband/prison, +/obj/item/toy/figure/syndie, +/turf/open/floor/plating, +/area/station/security/prison) "cRs" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos) -"cRv" = ( -/obj/structure/reflector/single, -/obj/machinery/light/directional/north, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) "cRA" = ( /obj/structure/flora/bush/generic/style_random, /obj/structure/flora/bush/pointy/style_random, @@ -11889,6 +11880,11 @@ /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/iron, /area/station/service/abandoned_gambling_den) +"cRP" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/department/eva/abandoned) "cRT" = ( /turf/open/floor/iron, /area/station/medical/abandoned) @@ -11898,6 +11894,23 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"cRY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/newscaster/directional/south, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/paramedic) +"cSi" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/prison/visit) "cSm" = ( /obj/structure/cable, /obj/structure/table/reinforced, @@ -11934,6 +11947,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/prison/visit) +"cSG" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) "cSK" = ( /obj/structure/table/reinforced, /obj/effect/spawner/random/food_or_drink/donkpockets, @@ -12021,6 +12040,19 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/commons/locker) +"cUh" = ( +/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/trimline/blue/filled/warning{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/medbay) "cUk" = ( /obj/machinery/conveyor{ dir = 4; @@ -12029,6 +12061,15 @@ /obj/structure/plasticflaps/opaque, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"cUn" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/sign/warning/yes_smoking/circle/directional/south, +/obj/machinery/light/small/directional/south, +/obj/item/kirbyplants/random/dead{ + name = "Lungie" + }, +/turf/open/floor/iron/white, +/area/station/commons/fitness/recreation) "cUq" = ( /obj/structure/table/reinforced, /obj/item/storage/toolbox/emergency, @@ -12094,6 +12135,17 @@ /obj/structure/window/reinforced/plasma/spawner/directional/east, /turf/open/floor/engine, /area/station/engineering/supermatter) +"cUY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/departments/psychology/directional/west, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "cVe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -12302,14 +12354,6 @@ }, /turf/open/floor/iron, /area/station/medical/storage) -"cYp" = ( -/obj/item/kirbyplants/random, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/research) "cYu" = ( /obj/structure/chair/office/light{ dir = 1 @@ -12348,6 +12392,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/medical/cryo) +"cYG" = ( +/obj/structure/table/wood, +/obj/item/clothing/under/costume/geisha, +/obj/item/clothing/shoes/sandal, +/obj/structure/sign/poster/ripped/directional/east, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/theater/abandoned) +"cYP" = ( +/obj/machinery/light/small/red/directional/south, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) "cYQ" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 1 @@ -12425,10 +12482,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"cZU" = ( -/obj/effect/landmark/start/hangover, -/turf/open/floor/vault, -/area/station/commons/fitness/recreation) "cZY" = ( /obj/effect/turf_decal/trimline/yellow/corner{ dir = 8 @@ -12455,6 +12508,15 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"das" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/structure/flora/bush/flowers_pp/style_random, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/machinery/light/directional/east, +/turf/open/floor/grass, +/area/station/hallway/secondary/exit/departure_lounge) "dav" = ( /obj/structure/cable, /obj/structure/tank_dispenser/oxygen, @@ -12538,14 +12600,17 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/iron, /area/station/engineering/atmos) -"dbL" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) +"dbC" = ( +/obj/structure/table/reinforced, +/obj/item/folder/white, +/obj/item/stock_parts/cell/high, +/obj/item/stack/sheet/glass, +/obj/item/stack/sheet/glass, +/obj/item/stack/sheet/glass, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "dbO" = ( /obj/structure/chair/sofa/bench/right{ dir = 8 @@ -12612,20 +12677,29 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/science/xenobiology) +"dcz" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) "dcG" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/landmark/start/depsec/science, /turf/open/floor/iron/white, /area/station/science/research) -"dcH" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/obj/machinery/status_display/ai/directional/south, -/obj/effect/turf_decal/tile/blue/opposingcorners, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) "dcR" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -12685,21 +12759,24 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/security) -"ddM" = ( -/obj/structure/cable, -/obj/item/radio/intercom/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/escape) "ddW" = ( /obj/effect/turf_decal/box/white/corners, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/xenobiology) +"ddY" = ( +/obj/machinery/hydroponics/constructable, +/obj/item/radio/intercom/directional/south, +/obj/machinery/camera/directional/east{ + c_tag = "Service - Hydroponics Front Aft"; + name = "service camera" + }, +/obj/effect/turf_decal/tile/green/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron, +/area/station/service/hydroponics) "dea" = ( /obj/structure/table, /obj/machinery/microwave{ @@ -12731,17 +12808,6 @@ /obj/structure/chair/stool/bar/directional/east, /turf/open/floor/carpet/green, /area/station/commons/lounge) -"dej" = ( -/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, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "den" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/brown/half/contrasted{ @@ -12805,6 +12871,17 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/maintenance/department/eva/abandoned) +"deW" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/north, +/obj/structure/table, +/obj/machinery/fax{ + fax_name = "Chief Medical Officer's Office"; + name = "Chief Medical Officer's Fax Machine" + }, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) "deX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -12939,6 +13016,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit) +"dgo" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/structure/sign/poster/official/plasma_effects/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos) "dgt" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -12973,6 +13058,20 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"dgU" = ( +/obj/machinery/status_display/supply{ + pixel_x = -32 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Cargo Bay - Port"; + name = "cargo camera" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/cargo/storage) "dhk" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -12993,6 +13092,12 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"dib" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/service) "din" = ( /obj/structure/table/wood, /obj/item/paper_bin, @@ -13000,6 +13105,11 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/service/library/abandoned) +"dip" = ( +/obj/structure/sign/poster/contraband/hacking_guide/directional/south, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/science) "diC" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, @@ -13028,13 +13138,6 @@ /obj/structure/sign/warning/radiation, /turf/closed/wall/r_wall, /area/station/engineering/atmos/project) -"djk" = ( -/obj/machinery/computer/operating{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/medical/surgery/theatre) "djn" = ( /obj/structure/table/wood, /obj/item/toy/talking/codex_gigas, @@ -13111,10 +13214,15 @@ /turf/open/floor/iron/smooth, /area/station/maintenance/department/science/xenobiology) "djT" = ( -/obj/machinery/holopad, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/rack, +/obj/item/book/manual/wiki/ordnance{ + pixel_x = 4; + pixel_y = 1 + }, +/obj/item/book/manual/wiki/atmospherics, /obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/full, -/turf/open/floor/iron/dark/smooth_large, +/turf/open/floor/iron/dark, /area/station/science/ordnance) "djV" = ( /obj/effect/spawner/random/structure/chair_flipped{ @@ -13175,6 +13283,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"dkH" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "dkL" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, @@ -13259,6 +13372,13 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/command/teleporter) +"dlz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/mess, +/obj/structure/sign/poster/random/directional/east, +/turf/open/floor/iron/grimy, +/area/station/maintenance/port/fore) "dlC" = ( /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/tile/neutral, @@ -13281,14 +13401,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) -"dlL" = ( -/obj/machinery/portable_atmospherics/scrubber/huge/movable, -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron/textured_large, -/area/station/engineering/atmos/project) "dmq" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -13300,14 +13412,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"dmu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/loading_area{ - dir = 1 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/cargo/storage) "dmw" = ( /obj/effect/turf_decal/trimline/blue/filled/warning, /turf/open/floor/iron/white, @@ -13344,6 +13448,10 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron/dark, /area/station/security/brig) +"dmU" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) "dnd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -13355,6 +13463,20 @@ /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"dnC" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/sign/poster/ripped/directional/north, +/turf/open/floor/iron/grimy, +/area/station/maintenance/port/fore) +"dnH" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/grimy, +/area/station/security/detectives_office) "dnM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -13396,6 +13518,10 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) +"doD" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/security/prison) "doI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -13421,12 +13547,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison/safe) -"dps" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/service/hydroponics/garden/abandoned) "dpI" = ( /obj/structure/table, /obj/item/clothing/gloves/latex, @@ -13449,6 +13569,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, /turf/open/floor/iron, /area/station/science/xenobiology) +"dpO" = ( +/obj/structure/table/wood, +/obj/item/camera_film, +/obj/item/camera_film{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/carpet/royalblack, +/area/station/service/chapel/office) "dpQ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/box, @@ -13462,6 +13592,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) +"dqj" = ( +/obj/machinery/modular_computer/preset/cargochat/medical, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 10 + }, +/obj/machinery/light_switch/directional/north, +/obj/structure/cable, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/medical/storage) "dql" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -13552,6 +13692,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/courtroom) +"drd" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "dre" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -13594,6 +13739,31 @@ /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron, /area/station/security/processing) +"drH" = ( +/obj/machinery/light/small/dim/directional/west, +/obj/item/clothing/suit/caution, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/sign/poster/official/no_erp/directional/west, +/turf/open/floor/iron/white, +/area/station/security/prison/toilet) +"drJ" = ( +/obj/machinery/conveyor_switch/oneway{ + dir = 8; + id = "cargodeliver"; + name = "crate return conveyor"; + pixel_x = 8 + }, +/obj/effect/turf_decal/box/corners, +/obj/machinery/status_display/supply{ + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) "drM" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -13648,28 +13818,17 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/iron, /area/station/engineering/main) +"dsl" = ( +/obj/structure/chair/sofa/right/brown, +/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/library) "dso" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /obj/machinery/rnd/server, /turf/open/floor/circuit/green/telecomms/mainframe, /area/station/science/server) -"dsq" = ( -/obj/machinery/shieldgen, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/no_smoking/directional/north, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/engineering/main) -"dsw" = ( -/obj/machinery/light/directional/west, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/prison/visit) "dsy" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -13697,27 +13856,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"dsO" = ( -/obj/structure/table, -/obj/item/assembly/igniter, -/obj/item/assembly/igniter, -/obj/item/assembly/igniter, -/obj/item/assembly/timer{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/assembly/timer{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/assembly/timer{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/structure/sign/poster/official/periodic_table/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/medical/pharmacy) "dsS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -13764,11 +13902,6 @@ }, /turf/open/floor/iron, /area/station/science/ordnance/testlab) -"dtc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) "dtf" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -13813,17 +13946,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/detectives_office/private_investigators_office) -"dtL" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/status_display/supply{ - pixel_x = 32 - }, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ +"dtJ" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/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/red/half/contrasted{ + dir = 1 + }, /turf/open/floor/iron, -/area/station/cargo/storage) +/area/station/security/office) "dtM" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -13840,13 +13975,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"dtW" = ( -/obj/structure/table, -/obj/effect/spawner/random/food_or_drink/snack, -/obj/effect/spawner/random/trash/food_packaging, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/fore) "dtX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /obj/machinery/door/airlock/engineering/glass{ @@ -13888,11 +14016,16 @@ /turf/open/floor/iron/dark, /area/station/science/xenobiology) "dux" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/shaft_miner, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, +/obj/structure/table, +/obj/effect/turf_decal/tile/brown/half{ + dir = 4 + }, +/obj/item/clipboard, +/obj/item/toy/figure/miner, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/half{ + dir = 1 + }, /area/station/cargo/miningoffice) "duA" = ( /turf/closed/wall/r_wall, @@ -13964,6 +14097,12 @@ dir = 4 }, /area/station/security/medical) +"dvn" = ( +/obj/structure/easel, +/obj/item/canvas/twentythree_nineteen, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "dvu" = ( /obj/machinery/door/airlock/engineering{ name = "Starboard Quarter Solar Access" @@ -13988,10 +14127,12 @@ /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "dvA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/visible{ + dir = 4 + }, /turf/open/floor/iron/dark/corner, /area/station/maintenance/disposal/incinerator) "dvG" = ( @@ -14096,13 +14237,20 @@ /obj/item/storage/box/drinkingglasses, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) -"dwI" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/spawner/random/maintenance/two, -/obj/structure/closet, -/obj/effect/spawner/random/trash/janitor_supplies, -/turf/open/floor/plating, -/area/station/maintenance/fore) +"dwE" = ( +/obj/structure/cable, +/obj/machinery/camera/directional/west{ + c_tag = "Library - Game Lounge"; + dir = 1; + name = "library camera" + }, +/obj/machinery/firealarm/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/grimy, +/area/station/service/library/lounge) "dwN" = ( /turf/open/floor/iron/half{ dir = 8 @@ -14175,15 +14323,8 @@ /obj/structure/chair/stool/directional/east, /turf/open/floor/iron/dark, /area/station/service/theater) -"dxl" = ( -/obj/machinery/status_display/evac/directional/west, -/obj/structure/filingcabinet/chestdrawer, -/mob/living/simple_animal/parrot/poly, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "dxo" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/item/radio/intercom/directional/south, /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, @@ -14192,27 +14333,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"dxu" = ( -/obj/structure/cable, -/obj/machinery/requests_console/directional/west{ - department = "Chief Engineer's Desk"; - name = "Chief Engineer's Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/machinery/camera/directional/west{ - c_tag = "Engineering - Chief Engineer's Office"; - name = "engineering camera" - }, -/obj/machinery/computer/apc_control{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "dxA" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron, @@ -14273,14 +14393,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/checker, /area/station/service/janitor) -"dxW" = ( -/obj/machinery/computer/records/security{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hop) "dxZ" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 10 @@ -14292,6 +14404,25 @@ /obj/machinery/duct, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) +"dyi" = ( +/obj/structure/sign/nanotrasen{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"dyu" = ( +/obj/item/kirbyplants/random, +/obj/machinery/firealarm/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "dyw" = ( /obj/structure/sign/departments/psychology/directional/east, /turf/closed/wall, @@ -14352,20 +14483,25 @@ "dzw" = ( /turf/closed/wall/r_wall, /area/station/security/brig) -"dzD" = ( -/obj/effect/turf_decal/trimline/neutral/warning, -/obj/effect/mapping_helpers/dead_body_placer, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "dzJ" = ( /obj/effect/decal/cleanable/dirt, /obj/item/radio/intercom/directional/east, /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/commons/toilet/restrooms) +"dAX" = ( +/obj/machinery/light/small/directional/west, +/obj/structure/sign/poster/official/work_for_a_future/directional/south, +/obj/machinery/atmospherics/components/tank/air{ + dir = 1 + }, +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/siding/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/medical/virology) "dBc" = ( /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/remains/human, @@ -14391,6 +14527,10 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/dark, /area/station/service/theater) +"dBl" = ( +/obj/machinery/telecomms/server/presets/supply, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) "dBn" = ( /obj/machinery/newscaster/directional/south, /obj/effect/turf_decal/bot, @@ -14459,26 +14599,43 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai_upload) +"dBR" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/closet/emcloset, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/department/crew_quarters/bar) "dCd" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"dCf" = ( -/obj/machinery/light/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Xenobiology - Secure Cell Interior"; - name = "xenobiology camera"; - network = list("ss13","xeno","rd") - }, -/obj/machinery/status_display/ai/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "dCk" = ( /turf/closed/wall/r_wall, /area/station/security/detectives_office) +"dCp" = ( +/obj/structure/table/reinforced, +/obj/item/radio{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/radio{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/item/radio, +/obj/machinery/light_switch/directional/east, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "dCs" = ( /obj/structure/table/wood, /obj/item/folder/blue{ @@ -14496,11 +14653,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/science/research) -"dCC" = ( -/obj/structure/sign/poster/official/do_not_question/directional/west, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/carpet, -/area/station/commons/vacant_room/office) "dCH" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -14572,6 +14724,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) +"dDV" = ( +/obj/effect/landmark/start/hangover, +/obj/machinery/status_display/ai/directional/south, +/obj/structure/chair/stool/directional/east, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/service/theater) "dEc" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -14584,26 +14743,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/service/electronic_marketing_den) -"dEk" = ( -/obj/machinery/modular_computer/console/preset/research{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/camera/directional/south{ - c_tag = "Science - Research Director's Quarters"; - name = "science camera"; - network = list("ss13","rd") - }, -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/rd) "dEm" = ( /obj/item/reagent_containers/cup/beaker/cryoxadone{ pixel_x = -6; @@ -14707,6 +14846,12 @@ /obj/item/airlock_painter/decal, /turf/open/floor/iron, /area/station/cargo/warehouse) +"dFo" = ( +/obj/structure/table/wood, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/item/flashlight/lamp/green, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain) "dFw" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -14867,6 +15012,11 @@ /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, /area/station/cargo/lobby) +"dHS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/port) "dHX" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -14947,16 +15097,19 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/science/lobby) -"dJd" = ( -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 4 +"dJu" = ( +/obj/structure/table/glass, +/obj/machinery/camera/directional/north{ + c_tag = "Security - Medbay" }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark/textured_half{ +/obj/machinery/computer/records/medical/laptop, +/obj/machinery/status_display/ai/directional/north, +/obj/effect/turf_decal/siding/dark_red, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 }, -/area/station/medical/morgue) +/turf/open/floor/iron/dark, +/area/station/security/medical) "dJw" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -15033,22 +15186,14 @@ /obj/effect/spawner/random/engineering/flashlight, /turf/open/floor/plating, /area/station/hallway/secondary/construction) -"dJS" = ( -/obj/item/storage/toolbox/electrical, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/gloves/color/fyellow, -/obj/structure/rack, +"dJW" = ( /obj/machinery/light/small/directional/south, +/turf/open/floor/iron/grimy, +/area/station/service/chapel) +"dJY" = ( +/obj/structure/sign/calendar/directional/south, /turf/open/floor/plating, -/area/station/science/research/abandoned) -"dJV" = ( -/obj/structure/table/wood, -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/suit/costume/cardborg, -/obj/item/clothing/head/costume/cardborg, -/turf/open/floor/wood, -/area/station/service/theater/abandoned) +/area/station/service/abandoned_gambling_den) "dKg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -15058,15 +15203,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"dKp" = ( -/obj/machinery/rnd/production/protolathe/department/science, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/sign/departments/science/alt/directional/east, -/obj/structure/sign/clock/directional/north, -/turf/open/floor/iron, -/area/station/science/lab) "dKs" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15196,14 +15332,6 @@ /obj/effect/mapping_helpers/airlock/access/any/security/general, /turf/open/floor/iron/dark/textured, /area/station/security/checkpoint/arrivals) -"dLZ" = ( -/obj/structure/table/reinforced, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/machinery/light/small/directional/north, -/obj/structure/sign/poster/contraband/self_ai_liberation/directional/north, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "dMc" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -15214,6 +15342,23 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay) +"dMh" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Atmospherics - Project Room Fore"; + dir = 5; + name = "atmospherics camera" + }, +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/trimline/yellow/line, +/turf/open/floor/iron, +/area/station/engineering/atmos/project) +"dMp" = ( +/obj/effect/turf_decal/siding/dark_red, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/medical) "dMs" = ( /obj/structure/table/wood, /obj/effect/decal/cleanable/dirt, @@ -15255,13 +15400,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) -"dML" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) "dMM" = ( /obj/machinery/camera/directional/west{ c_tag = "Central Hallway - Dormitory Hallway"; @@ -15273,6 +15411,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) +"dMQ" = ( +/obj/structure/bookcase{ + name = "Holy Bookcase" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "dMV" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -15360,6 +15505,40 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/airless, /area/space/nearstation) +"dNq" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research{ + name = "Research Division Access" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sci-entrance" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/obj/effect/mapping_helpers/airlock/unres, +/turf/open/floor/iron, +/area/station/science/research) +"dNr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/frame/machine, +/obj/item/stack/cable_coil/five, +/obj/item/multitool{ + pixel_x = 5; + pixel_y = -5 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room) "dNM" = ( /obj/effect/decal/cleanable/blood/old, /obj/machinery/airalarm/directional/west, @@ -15452,21 +15631,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/abandoned_gambling_den) -"dOW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/firealarm/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) -"dOX" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "dOY" = ( /obj/machinery/door/airlock/command/glass{ name = "Gateway Chamber" @@ -15519,14 +15683,9 @@ /turf/open/floor/plating, /area/station/engineering/supermatter/room) "dPC" = ( -/obj/structure/table, -/obj/machinery/microwave{ - desc = "Cooks and boils stuff, somehow."; - pixel_x = -3; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/bot, +/obj/structure/closet/secure_closet/miner, +/obj/effect/turf_decal/delivery, +/obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron, /area/station/cargo/miningoffice) "dPD" = ( @@ -15575,6 +15734,18 @@ /obj/effect/mapping_helpers/airlock/access/all/command/hop, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) +"dQl" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Engineering - Gravity Generator"; + name = "engineering camera" + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "dQq" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/bot, @@ -15604,6 +15775,13 @@ }, /turf/open/floor/iron/large, /area/station/commons/fitness/recreation) +"dQC" = ( +/obj/structure/table/reinforced, +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/spawner/random/armory/barrier_grenades, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "dQN" = ( /obj/structure/table/wood, /obj/effect/spawner/random/food_or_drink/donkpockets, @@ -15677,7 +15855,7 @@ /area/station/cargo/lobby) "dRQ" = ( /obj/structure/table/glass, -/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/item/surgery_tray/full, /obj/structure/window/reinforced/spawner/directional/west, /obj/item/clothing/gloves/latex, /obj/item/clothing/suit/apron/surgical, @@ -15751,6 +15929,21 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white/smooth_large, /area/station/science/robotics/lab) +"dSZ" = ( +/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/engineering/lobby) +"dTl" = ( +/obj/structure/table, +/obj/item/trash/popcorn, +/turf/open/floor/iron/cafeteria, +/area/station/security/prison/mess) "dTp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -15760,15 +15953,6 @@ /obj/item/assembly/flash/handheld, /turf/open/floor/iron/grimy, /area/station/command/bridge) -"dTu" = ( -/obj/machinery/light/directional/west, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/storage/tools) "dTA" = ( /obj/machinery/duct, /obj/effect/turf_decal/tile/purple/half/contrasted{ @@ -15817,6 +16001,15 @@ }, /turf/open/space/basic, /area/space) +"dUb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "dUe" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron, @@ -15873,10 +16066,6 @@ dir = 1 }, /area/station/hallway/primary/fore) -"dVe" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/turf/open/floor/plating/airless, -/area/space/nearstation) "dVg" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -15998,6 +16187,28 @@ }, /turf/open/floor/plating, /area/station/cargo/sorting) +"dWF" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/bureaucracy/briefcase{ + spawn_loot_count = 2; + spawn_random_offset = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/library) +"dWO" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/vending/games, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "dXd" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch" @@ -16018,20 +16229,22 @@ /turf/open/floor/iron, /area/station/maintenance/port) "dXs" = ( -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/dirt, -/obj/item/flashlight/lamp, -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple/half/contrasted{ +/obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 4 }, +/obj/structure/table/reinforced, +/obj/item/flashlight/lamp, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"dXB" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp, -/turf/open/floor/carpet, -/area/station/service/library/abandoned) +"dXw" = ( +/obj/structure/sign/painting/large/library_private{ + dir = 1; + pixel_x = -29 + }, +/obj/structure/destructible/cult/item_dispenser/archives/library, +/obj/item/book/codex_gigas, +/turf/open/floor/iron/dark, +/area/station/service/library/printer) "dXD" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/east, @@ -16055,6 +16268,13 @@ "dXL" = ( /turf/closed/wall/r_wall, /area/station/service/barber) +"dXN" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/incident_display/delam/directional/south, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "dXO" = ( /obj/structure/chair{ dir = 4 @@ -16062,18 +16282,6 @@ /obj/effect/landmark/start/medical_doctor, /turf/open/floor/iron/white, /area/station/medical/medbay) -"dYb" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/machinery/computer/operating{ - dir = 4 - }, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "dYj" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmos/hfr_room) @@ -16088,6 +16296,23 @@ /obj/machinery/shieldgen, /turf/open/floor/plating, /area/station/maintenance/department/science) +"dYz" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/electrical, +/obj/item/clothing/gloves/color/yellow, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"dYE" = ( +/obj/machinery/portable_atmospherics/scrubber/huge/movable, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron/textured_large, +/area/station/engineering/atmos/project) "dYH" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -16106,16 +16331,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"dYO" = ( -/obj/machinery/light_switch/directional/north{ - pixel_x = 6 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/obj/effect/mapping_helpers/turn_off_lights_with_lightswitch, -/turf/open/floor/iron, -/area/station/cargo/warehouse) "dYQ" = ( /obj/structure/table, /obj/machinery/computer/records/medical/laptop{ @@ -16132,6 +16347,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood/large, /area/station/service/library/abandoned) +"dZc" = ( +/obj/effect/turf_decal/trimline/purple/filled/corner, +/obj/item/radio/intercom/directional/east, +/obj/effect/landmark/start/hangover, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/station/science/research) "dZi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -16232,15 +16454,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"eam" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/firealarm/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white/smooth_half, -/area/station/science/ordnance/storage) "eaA" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/east, @@ -16290,6 +16503,19 @@ }, /turf/open/floor/iron/dark, /area/station/medical/pharmacy) +"eaL" = ( +/obj/structure/table, +/obj/item/stack/package_wrap, +/obj/item/storage/secure/safe/directional/north, +/obj/item/stack/package_wrap, +/obj/item/hand_labeler, +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron, +/area/station/commons/vacant_room/commissary) "eaO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -16323,28 +16549,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/storage_shared) -"ebn" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/library/private) "ebo" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, /area/station/cargo/warehouse) -"ebp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/light/small/red/directional/south, -/turf/open/floor/iron/dark/smooth_large, -/area/station/service/chapel/funeral) "ebF" = ( /obj/structure/chair, /obj/effect/decal/cleanable/dirt, @@ -16403,6 +16612,15 @@ /obj/structure/sign/warning/secure_area/directional/north, /turf/open/floor/plating, /area/station/science/xenobiology) +"ebX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/structure/sign/poster/contraband/borg_fancy_2/directional/south, +/turf/open/floor/iron, +/area/station/science/research/abandoned) "ecm" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -16414,6 +16632,13 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/aft) +"ecq" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/station/tcommsat/server) "ect" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/generic, @@ -16456,12 +16681,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"edc" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/smooth, -/area/station/maintenance/department/science/xenobiology) "edd" = ( /turf/closed/wall, /area/station/service/chapel/storage) @@ -16536,18 +16755,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) -"edV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/east{ - c_tag = "Auxiliary Tool Storage"; - name = "engineering camera" - }, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/storage/tools) "edW" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -16591,6 +16798,23 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"eew" = ( +/obj/structure/cable, +/obj/structure/table, +/obj/item/storage/box/shipping{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/folder/yellow, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/light_switch/directional/north{ + pixel_x = 12 + }, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) "eex" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/siding/wood{ @@ -16610,6 +16834,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/command/gateway) +"eeX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/bluespace_vendor/directional/west, +/obj/structure/chair/stool/directional/east, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "eeZ" = ( /obj/item/exodrone, /obj/machinery/exodrone_launcher, @@ -16632,19 +16864,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/medical/abandoned) -"eff" = ( -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/neutral/mid_joiner{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/item/storage/backpack/duffelbag/med/surgery, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "efg" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/red/half/contrasted, @@ -16714,14 +16933,6 @@ dir = 8 }, /area/station/science/auxlab/firing_range) -"egJ" = ( -/obj/structure/table/wood, -/obj/item/clothing/under/costume/geisha, -/obj/item/clothing/shoes/sandal, -/obj/structure/sign/poster/ripped/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/theater/abandoned) "egP" = ( /obj/structure/chair{ dir = 4 @@ -16769,6 +16980,18 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/white/smooth_half, /area/station/science/ordnance/storage) +"ehl" = ( +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/dark/textured_half{ + dir = 1 + }, +/area/station/medical/morgue) "eho" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /obj/machinery/status_display/evac/directional/south, @@ -16790,6 +17013,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /turf/open/floor/iron, /area/station/engineering/supermatter/room) +"ehF" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/hallway/secondary/exit/departure_lounge) "ehJ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/contraband/random/directional/south, @@ -16825,19 +17057,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron/dark, /area/station/service/bar) -"eir" = ( -/obj/structure/cable, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Engineering - Gravity Generator"; - name = "engineering camera" - }, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) "eiw" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -16864,20 +17083,6 @@ /obj/structure/sign/warning/secure_area/directional/east, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) -"eiL" = ( -/obj/item/kirbyplants/random, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/opposingcorners, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/abandoned_gambling_den/gaming) -"eiT" = ( -/obj/machinery/computer/operating, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/medical/surgery/theatre) "eiU" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -16887,6 +17092,14 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/maintenance/department/security) +"eiW" = ( +/obj/structure/sign/poster/official/report_crimes/directional/north, +/obj/machinery/vending/wardrobe/det_wardrobe, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/detectives_office) "ejj" = ( /obj/structure/chair/sofa/bench/left{ dir = 8 @@ -16899,13 +17112,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) -"ejp" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "ejx" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -16916,16 +17122,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"ejy" = ( -/obj/structure/table/reinforced, -/obj/item/mmi, -/obj/item/mmi, -/obj/item/mmi, -/obj/structure/sign/departments/medbay/alt/directional/south, -/obj/machinery/light/cold/directional/west, -/obj/machinery/status_display/ai/directional/west, -/turf/open/floor/iron, -/area/station/science/robotics/lab) "ejE" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -17038,12 +17234,11 @@ /turf/open/floor/iron/dark, /area/station/command/gateway) "elO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/cable, /turf/open/floor/iron, -/area/station/maintenance/starboard/fore) +/area/station/cargo/miningoffice) "elP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/yellow/fourcorners, @@ -17075,31 +17270,18 @@ }, /turf/open/floor/iron, /area/station/cargo/drone_bay) -"emg" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/closet/emcloset, -/obj/machinery/light/small/directional/north, +"emm" = ( +/obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/obj/structure/sign/poster/random/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/department/crew_quarters/bar) -"emr" = ( -/obj/machinery/light/directional/south, /obj/machinery/camera/directional/south{ - c_tag = "Atmospherics - Project Room Fore"; - dir = 5; - name = "atmospherics camera" + c_tag = "Arrivals - Port Entrance"; + name = "arrivals camera" }, -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/trimline/yellow/line, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "emB" = ( /obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/tile/yellow{ @@ -17120,6 +17302,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) +"emK" = ( +/obj/structure/dresser, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) "emR" = ( /turf/open/floor/carpet, /area/station/security/detectives_office) @@ -17135,7 +17321,9 @@ dir = 4; id = "garbage" }, -/obj/machinery/recycler, +/obj/machinery/recycler{ + dir = 8 + }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, @@ -17167,6 +17355,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/department/medical/morgue) +"enw" = ( +/obj/item/storage/toolbox/electrical, +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/gloves/color/fyellow, +/obj/structure/rack, +/turf/open/floor/plating, +/area/station/science/research/abandoned) "enD" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/west, @@ -17176,13 +17371,6 @@ /obj/structure/flora/bush/lavendergrass/style_4, /turf/open/floor/grass, /area/station/hallway/secondary/exit/departure_lounge) -"enL" = ( -/obj/structure/sign/poster/official/cleanliness/directional/north, -/obj/item/radio/intercom/directional/east, -/obj/machinery/holopad, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/large, -/area/station/medical/break_room) "enR" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -17191,18 +17379,18 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"enT" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 +"enU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 }, +/obj/structure/closet/crate/preopen, +/obj/item/clothing/head/cone, +/obj/item/clothing/head/cone, +/obj/item/clothing/head/cone, +/obj/item/clothing/head/cone, +/obj/structure/sign/poster/official/moth_delam/directional/south, /turf/open/floor/iron, -/area/station/cargo/warehouse) -"enX" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/spawner/random/structure/tank_holder, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) +/area/station/engineering/main) "eos" = ( /obj/structure/disposalpipe/segment, /obj/machinery/duct, @@ -17212,13 +17400,6 @@ /obj/effect/turf_decal/trimline/purple/filled/warning, /turf/open/floor/iron/white, /area/station/science/research) -"eox" = ( -/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/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/commons/dorms) "eoy" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -17327,30 +17508,6 @@ dir = 1 }, /area/station/engineering/supermatter/room) -"epD" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light_switch/directional/south{ - pixel_x = -8 - }, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/cafeteria) -"epF" = ( -/obj/machinery/modular_computer/console/preset/id{ - dir = 1 - }, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/command/heads_quarters/rd) "epU" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -17447,27 +17604,6 @@ /obj/machinery/air_sensor/nitrogen_tank, /turf/open/floor/engine/n2, /area/station/engineering/atmos) -"eqE" = ( -/obj/machinery/light/dim/directional/north, -/obj/structure/bodycontainer/morgue{ - dir = 2 - }, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) -"eqH" = ( -/obj/machinery/light/directional/east, -/obj/machinery/requests_console/directional/east{ - department = "Quartermaster's Desk"; - name = "Quartermaster's Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) "eqM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -17479,6 +17615,17 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron/dark, /area/station/service/bar) +"eqP" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Xenobiology - Secure Cell Interior"; + name = "xenobiology camera"; + network = list("ss13","xeno","rd") + }, +/obj/machinery/status_display/ai/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/dark, +/area/station/science/xenobiology) "eqU" = ( /turf/open/space, /area/space) @@ -17523,14 +17670,13 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/supply) -"erz" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) +"erM" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/command/meeting_room/council) "erP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -17584,6 +17730,14 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) +"esb" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/obj/structure/sign/warning/secure_area/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/textured_large, +/area/station/science/xenobiology) "eso" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 10 @@ -17647,14 +17801,25 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"esN" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 +"esM" = ( +/obj/machinery/camera/motion/directional/east{ + c_tag = "E.V.A. Storage"; + name = "motion-sensitive command camera" }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) +/obj/machinery/requests_console/directional/east{ + department = "EVA"; + name = "EVA Requests Console" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) "esQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -17778,12 +17943,35 @@ /obj/machinery/disposal/bin, /turf/open/floor/iron, /area/station/engineering/storage) +"eua" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/bluespace_vendor/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "eub" = ( /obj/structure/chair/pew, /turf/open/floor/iron/chapel{ dir = 4 }, /area/station/service/chapel) +"euf" = ( +/obj/structure/table/wood, +/obj/machinery/newscaster/directional/east, +/obj/item/storage/secure/briefcase, +/obj/item/book/manual/wiki/security_space_law, +/obj/item/taperecorder{ + pixel_x = 3; + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hos) "eug" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 @@ -17892,6 +18080,18 @@ }, /turf/open/floor/iron/textured, /area/station/medical/storage) +"evH" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Atmospherics - Storage"; + name = "atmospherics camera" + }, +/obj/item/kirbyplants/random, +/obj/machinery/newscaster/directional/west, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage) "evI" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -17930,20 +18130,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) -"ewL" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/random/contraband/prison, -/obj/effect/spawner/random/contraband/prison, -/obj/item/stack/license_plates/empty/fifty, -/obj/item/stack/license_plates/empty/fifty, -/obj/item/stack/license_plates/empty/fifty, -/obj/item/stack/license_plates/empty/fifty, -/obj/item/stack/license_plates/empty/fifty, -/obj/item/stack/license_plates/empty/fifty, -/obj/machinery/light/directional/south, -/obj/item/radio/intercom/prison/directional/south, -/turf/open/floor/iron, -/area/station/security/prison/work) "ewQ" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ dir = 4 @@ -18012,6 +18198,11 @@ }, /turf/open/floor/iron, /area/station/engineering/supermatter/room) +"exJ" = ( +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/security/checkpoint/escape) "exK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/red/opposingcorners{ @@ -18036,6 +18227,13 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) +"exS" = ( +/obj/structure/sign/poster/official/work_for_a_future/directional/west, +/obj/machinery/firealarm/directional/south, +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) "exX" = ( /obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, @@ -18102,6 +18300,45 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"ezm" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_x = -2 + }, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_x = 2 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"ezx" = ( +/obj/effect/spawner/random/engineering/atmospherics_portable, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/maintenance/port) +"ezR" = ( +/obj/structure/window/spawner/directional/west, +/obj/structure/closet/secure_closet/freezer/kitchen/all_access, +/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/decal/cleanable/cobweb, +/obj/structure/sign/poster/ripped/directional/north, +/turf/open/floor/iron/cafeteria, +/area/station/security/prison/mess) "ezS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -18111,18 +18348,6 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"ezZ" = ( -/obj/machinery/firealarm/directional/south, -/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/siding/wood{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) "eAe" = ( /obj/effect/spawner/random/trash/mess, /turf/open/floor/iron/grimy, @@ -18142,20 +18367,17 @@ }, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"eAA" = ( -/obj/structure/sign/painting/library_private{ - pixel_y = -32 +"eAq" = ( +/obj/machinery/computer/scan_consolenew{ + dir = 8 }, -/obj/structure/disposalpipe/segment{ +/obj/machinery/status_display/ai/directional/east, +/obj/effect/turf_decal/bot/right, +/obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 4 }, -/obj/machinery/modular_computer/console/preset/curator{ - dir = 1 - }, -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/service/library/printer) +/area/station/science/genetics) "eAO" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/purple/filled/warning{ @@ -18176,6 +18398,26 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/interrogation) +"eAY" = ( +/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/bot, +/obj/machinery/door/window/left/directional/west{ + name = "Magboot Storage"; + req_access = list("eva") + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/eva) "eBb" = ( /obj/structure/filingcabinet/security, /obj/effect/turf_decal/tile/red/anticorner/contrasted{ @@ -18294,45 +18536,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/engineering/storage/tech) -"eCO" = ( -/obj/item/stack/cable_coil, -/obj/item/bodypart/arm/right/robot{ - pixel_x = 3 - }, -/obj/item/bodypart/arm/left/robot{ - pixel_x = -3 - }, -/obj/structure/table, -/obj/item/radio/intercom/directional/west, -/obj/item/assembly/prox_sensor{ - pixel_x = 5 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = 5 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = 5 - }, -/obj/item/assembly/flash/handheld, -/obj/item/assembly/flash/handheld, -/obj/item/assembly/flash/handheld, -/obj/item/assembly/flash/handheld, -/obj/item/assembly/flash/handheld, -/obj/item/assembly/flash/handheld, -/obj/machinery/light/directional/west, -/obj/item/stock_parts/cell/high{ - pixel_x = 3; - pixel_y = 16 - }, -/obj/item/stock_parts/cell/high{ - pixel_x = -3; - pixel_y = 16 - }, -/obj/item/stock_parts/cell/high{ - pixel_y = 15 - }, -/turf/open/floor/iron, -/area/station/science/robotics/lab) "eCR" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -18348,11 +18551,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"eDe" = ( -/obj/machinery/light_switch/directional/north, -/obj/machinery/photocopier, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain) "eDp" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral{ @@ -18370,6 +18568,10 @@ }, /turf/open/floor/iron, /area/station/medical/abandoned) +"eDK" = ( +/obj/machinery/telecomms/server/presets/medical, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) "eDV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18379,6 +18581,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"eDZ" = ( +/obj/item/kirbyplants/random, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/station/service/abandoned_gambling_den) "eEc" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/neutral/full, @@ -18405,6 +18613,16 @@ dir = 8 }, /area/station/security/execution/transfer) +"eEl" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/abandoned_gambling_den/gaming) "eEm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18449,14 +18667,6 @@ /obj/structure/flora/bush/grassy/style_random, /turf/open/floor/grass, /area/station/hallway/secondary/exit/departure_lounge) -"eFm" = ( -/obj/structure/table, -/obj/machinery/status_display/evac/directional/west, -/obj/item/paper_bin, -/obj/item/pen, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) "eFo" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -18489,13 +18699,6 @@ /obj/effect/mapping_helpers/requests_console/supplies, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) -"eFy" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/bodycontainer/morgue/beeper_off, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "eFz" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/line, @@ -18519,8 +18722,15 @@ /turf/open/floor/iron, /area/station/hallway/secondary/entry) "eFU" = ( -/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 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "eGb" = ( @@ -18532,6 +18742,11 @@ /obj/structure/barricade/wooden, /turf/open/floor/plating, /area/station/service/kitchen/abandoned) +"eGq" = ( +/obj/structure/sign/poster/official/do_not_question/directional/west, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/carpet, +/area/station/commons/vacant_room/office) "eGs" = ( /obj/structure/chair/office{ dir = 8 @@ -18567,18 +18782,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/science/robotics/lab) -"eGC" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Cargo - Quartermaster's Office"; - name = "cargo camera" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) "eGO" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -18591,16 +18794,17 @@ dir = 8 }, /area/station/hallway/secondary/entry) -"eGP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/departments/psychology/directional/west, -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +"eGR" = ( +/obj/item/radio/intercom/directional/north, +/obj/machinery/modular_computer/preset/civilian{ + dir = 4 }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/science/explab) "eGS" = ( /obj/machinery/duct, /obj/effect/turf_decal/tile/purple/fourcorners, @@ -18628,6 +18832,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port) +"eHp" = ( +/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 = 1 + }, +/obj/structure/sign/poster/official/cleanliness/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay) "eHt" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 @@ -18726,14 +18940,6 @@ }, /turf/open/floor/carpet/green, /area/station/service/library) -"eIj" = ( -/obj/machinery/light/directional/north, -/obj/machinery/suit_storage_unit/captain, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/captain/private) "eIl" = ( /obj/effect/landmark/start/security_officer, /obj/structure/chair/office{ @@ -18746,16 +18952,22 @@ dir = 4 }, /area/station/security/office) +"eIm" = ( +/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 + }, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "eIo" = ( /obj/item/kirbyplants/random, /obj/machinery/light_switch/directional/south, /obj/effect/turf_decal/bot/left, /turf/open/floor/iron, /area/station/engineering/storage/tech) -"eIs" = ( -/obj/effect/spawner/random/vending/colavend, -/turf/open/floor/iron/cafeteria, -/area/station/security/prison/mess) "eIt" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -18799,6 +19011,17 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"eIZ" = ( +/obj/machinery/power/energy_accumulator/tesla_coil, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/directional/south{ + c_tag = "Engineering - Secure Storage"; + name = "engineering camera" + }, +/obj/effect/turf_decal/bot, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/engineering/main) "eJb" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/structure/disposalpipe/segment, @@ -19017,12 +19240,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"eLR" = ( -/obj/effect/turf_decal/siding/thinplating/dark, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "eLY" = ( /obj/machinery/door/window/right/directional/west{ name = "Bar Delivery"; @@ -19122,13 +19339,6 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/large, /area/station/medical/virology) -"eNt" = ( -/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/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/engineering/supermatter/room) "eNB" = ( /obj/effect/turf_decal/siding/green{ dir = 8 @@ -19160,12 +19370,25 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron/large, /area/station/science/research) +"eNJ" = ( +/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 = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "eNP" = ( /obj/structure/sign/painting/library{ pixel_x = 32 }, /turf/open/floor/wood/large, /area/station/service/library/lounge) +"eOb" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) "eOe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -19283,14 +19506,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet/green, /area/station/commons/lounge) -"ePb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 10 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/virology) "ePd" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -19366,16 +19581,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"ePR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/west, -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) "ePU" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -19566,6 +19771,36 @@ }, /turf/open/floor/iron/cafeteria, /area/station/service/cafeteria) +"eSu" = ( +/obj/structure/table/reinforced, +/obj/structure/microscope{ + pixel_x = -1; + pixel_y = 2 + }, +/obj/item/biopsy_tool{ + pixel_x = 14; + pixel_y = 4 + }, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = -8; + pixel_y = 12 + }, +/obj/machinery/newscaster/directional/north, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/science/xenobiology) +"eSD" = ( +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/obj/machinery/light/dim/directional/south, +/turf/open/floor/iron/dark/textured_half{ + dir = 1 + }, +/area/station/medical/morgue) "eSJ" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 6 @@ -19634,6 +19869,14 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/science) +"eTS" = ( +/obj/structure/cable, +/obj/machinery/modular_computer/preset/command, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "eTU" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -19677,6 +19920,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/department/chapel) +"eUj" = ( +/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, +/turf/open/floor/carpet, +/area/station/command/bridge) "eUq" = ( /obj/machinery/ai_slipper{ uses = 10 @@ -19917,20 +20167,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"eWF" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/science/auxlab/firing_range) -"eWL" = ( -/obj/structure/closet/secure_closet/brig{ - name = "Prisoner Locker" - }, -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/execution/transfer) "eWN" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -19954,6 +20190,16 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/iron, /area/station/engineering/atmos/project) +"eWX" = ( +/obj/machinery/computer/message_monitor{ + dir = 4 + }, +/obj/item/paper/monitorkey, +/obj/machinery/newscaster/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/iron/dark, +/area/station/tcommsat/computer) "eXf" = ( /obj/structure/cable, /obj/structure/chair/comfy/brown{ @@ -20053,31 +20299,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/range) -"eYr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/modular_computer/console/preset/civilian, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/engineering/storage_shared) "eYt" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"eYu" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/computer/order_console/mining, +/obj/item/radio/intercom/directional/west, +/obj/machinery/firealarm/directional/west{ + pixel_y = -9 }, /turf/open/floor/iron, -/area/station/engineering/main) +/area/station/cargo/miningoffice) "eYy" = ( /obj/structure/cable, /obj/structure/closet/secure_closet/atmospherics, @@ -20088,25 +20318,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos/storage) -"eYz" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Maintenance Hatch" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/morgue) "eYG" = ( /obj/machinery/shower/directional/west{ name = "emergency shower" @@ -20185,6 +20396,16 @@ /obj/effect/turf_decal/tile/brown/anticorner/contrasted, /turf/open/floor/iron, /area/station/cargo/sorting) +"eZe" = ( +/obj/machinery/vending/wardrobe/viro_wardrobe, +/obj/structure/sign/poster/official/cleanliness/directional/west, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/siding/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/medical/virology) "eZh" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 8 @@ -20222,6 +20443,18 @@ /obj/effect/spawner/random/maintenance/three, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"eZV" = ( +/obj/machinery/light_switch/directional/east{ + pixel_x = 22 + }, +/obj/machinery/modular_computer/preset/id{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/qm) "fam" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -20265,12 +20498,17 @@ /turf/open/floor/iron/smooth, /area/station/maintenance/department/science/xenobiology) "fbu" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/bitrunning/den) +"fbA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) +/obj/structure/sign/poster/official/moth_piping/directional/west, +/obj/machinery/light/small/directional/west, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "fbF" = ( /obj/effect/landmark/start/hangover, /obj/structure/extinguisher_cabinet/directional/south, @@ -20302,12 +20540,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hos) -"fbY" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "fbZ" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -20321,6 +20553,15 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/warden) +"fcg" = ( +/obj/structure/cable, +/obj/item/kirbyplants/random, +/obj/machinery/light_switch/directional/west, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/drone_bay) "fcl" = ( /obj/item/reagent_containers/cup/bowl{ pixel_y = 3 @@ -20378,16 +20619,6 @@ }, /turf/open/floor/iron, /area/station/service/kitchen/abandoned) -"fcI" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/junction{ - dir = 1 - }, -/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/medical/medbay) "fcP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -20422,13 +20653,6 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron, /area/station/engineering/atmos/project) -"fdA" = ( -/obj/effect/landmark/start/hangover, -/obj/machinery/status_display/ai/directional/south, -/obj/structure/chair/stool/directional/east, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/service/theater) "fdG" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, @@ -20556,11 +20780,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/hop) -"feG" = ( -/obj/machinery/status_display/ai/directional/south, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "feK" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -20571,6 +20790,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/solars/port/fore) +"feL" = ( +/obj/structure/table, +/obj/item/stack/sheet/glass, +/obj/item/electronics/airlock, +/obj/item/assembly/signaler, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/station/science/lobby) "feO" = ( /obj/structure/reflector/single, /obj/effect/decal/cleanable/dirt, @@ -20601,10 +20831,10 @@ "fff" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, -/obj/item/holosign_creator/atmos, -/obj/structure/rack, -/obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/visible{ + dir = 4 + }, /turf/open/floor/iron/dark, /area/station/science/ordnance) "ffi" = ( @@ -20686,14 +20916,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"ffN" = ( -/obj/structure/sign/poster/random/directional/south, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/commons/lounge) "ffP" = ( /obj/item/radio/intercom/directional/east, /obj/item/kirbyplants/random, @@ -20705,11 +20927,11 @@ /turf/open/floor/wood/tile, /area/station/service/library/artgallery) "ffQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/dark_red{ - dir = 8 +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 }, -/turf/open/floor/iron/grimy, +/turf/open/floor/iron/dark, /area/station/security/detectives_office) "ffY" = ( /obj/item/kirbyplants/random, @@ -20746,18 +20968,15 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/maintenance/port/fore) -"fgL" = ( -/obj/machinery/light/directional/west, -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "fgM" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/commons/storage/primary) +"fgV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/station/service/theater/abandoned) "fhd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -20783,6 +21002,20 @@ /obj/structure/bookcase/random/reference, /turf/open/floor/wood/large, /area/station/medical/psychology) +"fhr" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/structure/sign/directions/upload{ + dir = 8; + pixel_x = -31; + pixel_y = -6 + }, +/obj/structure/table/reinforced, +/obj/item/storage/fancy/donut_box{ + pixel_y = 4 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, +/area/station/engineering/break_room) "fhA" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20818,6 +21051,17 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/ordnance/storage) +"fia" = ( +/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/siding/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron, +/area/station/medical/treatment_center) "fih" = ( /obj/structure/noticeboard/directional/east, /obj/machinery/camera/directional/east{ @@ -20852,17 +21096,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/abandoned_gambling_den) -"fiB" = ( -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 +"fix" = ( +/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 }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "fiI" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -20898,6 +21140,16 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/station/solars/starboard/fore) +"fjk" = ( +/obj/structure/chair{ + dir = 1; + name = "Jury" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) "fju" = ( /obj/structure/flora/bush/flowers_br/style_random, /obj/structure/flora/bush/sparsegrass/style_random, @@ -20910,6 +21162,13 @@ /obj/item/pen, /turf/open/floor/wood, /area/station/service/library/abandoned) +"fjP" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "fjQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20925,13 +21184,6 @@ }, /turf/open/floor/engine/n2o, /area/station/engineering/atmos) -"fjW" = ( -/obj/machinery/chem_dispenser, -/obj/structure/sign/warning/chem_diamond/directional/south, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/medical/pharmacy) "fkd" = ( /obj/structure/chair{ dir = 8 @@ -20988,6 +21240,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) +"fkS" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/maintenance/disposal) "fkU" = ( /obj/structure/railing{ dir = 5 @@ -21014,6 +21275,9 @@ }, /turf/open/floor/iron/grimy, /area/station/service/chapel) +"flr" = ( +/turf/open/floor/plating, +/area/station/service/library/abandoned) "flt" = ( /obj/structure/lattice, /obj/structure/window/reinforced/spawner/directional/north, @@ -21064,6 +21328,14 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"flE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/service/chapel/funeral) "flF" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -21121,6 +21393,18 @@ }, /turf/open/floor/iron, /area/station/cargo/warehouse) +"fmo" = ( +/obj/structure/table/reinforced, +/obj/item/clipboard, +/obj/item/toy/figure/engineer{ + pixel_x = -6 + }, +/obj/item/toy/figure/atmos{ + pixel_x = 6 + }, +/obj/machinery/incident_display/delam/directional/north, +/turf/open/floor/wood, +/area/station/engineering/break_room) "fms" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -21256,13 +21540,6 @@ /obj/structure/chair/office, /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) -"fnZ" = ( -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 8 - }, -/obj/structure/sign/departments/rndserver/directional/south, -/turf/open/floor/iron/white, -/area/station/science/research) "foh" = ( /obj/machinery/atmospherics/components/binary/volume_pump{ name = "Ports to Distro" @@ -21273,12 +21550,6 @@ }, /turf/open/floor/iron/dark/corner, /area/station/maintenance/department/electrical) -"foi" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) "fol" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -21289,13 +21560,6 @@ "fot" = ( /turf/closed/wall, /area/station/ai_monitored/command/storage/eva) -"foy" = ( -/obj/machinery/computer/libraryconsole/bookmanagement, -/obj/structure/table/wood, -/obj/machinery/newscaster/directional/north, -/obj/machinery/light/directional/north, -/turf/open/floor/wood/large, -/area/station/service/library) "foI" = ( /obj/docking_port/stationary{ dwidth = 2; @@ -21392,6 +21656,15 @@ }, /turf/open/floor/iron, /area/station/science/xenobiology) +"fpu" = ( +/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/duct, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/white, +/area/station/science/research) "fpv" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -21423,13 +21696,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) -"fpZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron, -/area/station/cargo/storage) +"fqi" = ( +/obj/effect/spawner/random/structure/chair_maintenance, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/fore) "fqm" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -21498,23 +21769,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"frq" = ( -/obj/machinery/light/directional/east, -/obj/machinery/conveyor_switch/oneway{ - dir = 8; - id = "cargodeliver"; - name = "crate return conveyor"; - pixel_x = 8 - }, -/obj/effect/turf_decal/box/corners, -/obj/machinery/status_display/supply{ - pixel_x = 32 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) "frC" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /obj/structure/lattice, @@ -21613,16 +21867,11 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron, /area/station/engineering/supermatter/room) -"fsK" = ( -/obj/item/kirbyplants/random, -/obj/machinery/light/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Security Post - Cargo" - }, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/red/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) +"fsJ" = ( +/obj/machinery/vending/wardrobe/chap_wardrobe, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) "fsL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21644,13 +21893,16 @@ /obj/effect/turf_decal/tile/neutral/anticorner/contrasted, /turf/open/floor/iron/textured, /area/station/maintenance/port/fore) -"ftb" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/mechanical, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/gloves/color/black, -/turf/open/floor/plating, -/area/station/science/research/abandoned) +"fti" = ( +/obj/structure/cable, +/obj/machinery/computer/security{ + dir = 1 + }, +/obj/machinery/newscaster/directional/south, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/light/warm/directional/south, +/turf/open/floor/iron, +/area/station/security/checkpoint/engineering) "ftk" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 @@ -21663,11 +21915,6 @@ /obj/effect/spawner/random/entertainment/dice, /turf/open/floor/carpet/green, /area/station/commons/lounge) -"fts" = ( -/obj/structure/bodycontainer/morgue, -/obj/machinery/light/cold/directional/west, -/turf/open/floor/iron/dark/textured_half, -/area/station/service/chapel/storage) "ftt" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -21706,12 +21953,19 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/general, /turf/open/floor/iron, /area/station/maintenance/department/crew_quarters/bar) -"ftI" = ( -/obj/structure/filingcabinet/medical, -/obj/machinery/light/directional/north, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron/grimy, -/area/station/command/heads_quarters/hop) +"ftG" = ( +/obj/structure/sign/nanotrasen{ + pixel_y = -32 + }, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/gps, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/line, +/turf/open/floor/iron/white, +/area/station/science/lobby) "ftO" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -21721,12 +21975,11 @@ /turf/open/floor/iron/grimy, /area/station/service/library) "ftS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/turf_decal/tile/brown/half/contrasted{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/herringbone, /area/station/cargo/miningoffice) "ftU" = ( /obj/structure/cable, @@ -21773,6 +22026,11 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/chapel) +"fuT" = ( +/obj/structure/flora/bush/grassy/style_random, +/obj/structure/flora/rock/pile/jungle/style_random, +/turf/open/misc/grass, +/area/station/hallway/primary/fore) "fuV" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -21885,13 +22143,19 @@ /obj/structure/sign/poster/random/directional/east, /turf/open/floor/wood, /area/station/service/theater) -"fws" = ( -/obj/machinery/nuclearbomb/beer, -/obj/structure/cable, -/obj/machinery/light/small/red/dim/directional/north, -/obj/effect/turf_decal/tile/red/fourcorners, +"fwt" = ( +/obj/effect/turf_decal/box/white/corners{ + dir = 8 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Xenobiology - Cell 1"; + name = "xenobiology camera"; + network = list("ss13","xeno","rd") + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, -/area/station/maintenance/department/security) +/area/station/science/xenobiology) "fwK" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -21967,20 +22231,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"fxM" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/machinery/light/directional/west, -/obj/structure/sign/directions/upload{ - dir = 8; - pixel_x = -31; - pixel_y = -6 - }, -/obj/structure/table/reinforced, -/obj/item/storage/fancy/donut_box{ - pixel_y = 4 - }, -/turf/open/floor/wood, -/area/station/engineering/break_room) "fxP" = ( /obj/machinery/computer/security/telescreen/entertainment/directional/west, /obj/structure/table/wood, @@ -22020,17 +22270,9 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/security/checkpoint/supply) -"fyj" = ( -/obj/machinery/light/directional/west, -/obj/structure/sign/warning/secure_area/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "fym" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 }, @@ -22080,6 +22322,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos) +"fyU" = ( +/obj/structure/sign/nanotrasen{ + pixel_y = -32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "fza" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -22167,12 +22418,14 @@ /turf/open/floor/iron, /area/station/engineering/storage) "fAj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt/dust, /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, +/turf/open/floor/iron/herringbone, /area/station/cargo/miningoffice) "fAn" = ( /obj/machinery/holopad, @@ -22186,12 +22439,37 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white/smooth_large, /area/station/command/heads_quarters/cmo) +"fAv" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/firealarm/directional/south, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/security/checkpoint/escape) "fAz" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 }, /turf/open/floor/iron, /area/station/commons/locker) +"fAB" = ( +/obj/structure/closet/crate/silvercrate, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) +"fAH" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "fAL" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /obj/effect/decal/cleanable/dirt, @@ -22239,17 +22517,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/port) -"fAY" = ( -/obj/machinery/light/directional/south, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) "fBd" = ( /obj/structure/table/wood, /obj/item/storage/dice, @@ -22276,11 +22543,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/iron, /area/station/maintenance/department/engine/atmos) -"fBm" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) "fBp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -22298,18 +22560,6 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space/nearstation) -"fBP" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/newscaster/directional/east, -/obj/machinery/light/directional/east, -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/engineering/lobby) "fBQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -22322,12 +22572,12 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"fBZ" = ( +"fBR" = ( /obj/item/kirbyplants/random, -/obj/machinery/bluespace_vendor/directional/east, /obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) "fCf" = ( /obj/machinery/door/poddoor/preopen{ @@ -22364,12 +22614,31 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/medical/break_room) +"fCo" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/turf_decal/box/white, +/obj/machinery/camera/directional/east{ + c_tag = "Dormitories - Pumps"; + name = "dormitories camera" + }, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "fCw" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 }, /turf/open/floor/iron/grimy, /area/station/service/library/abandoned) +"fCD" = ( +/obj/structure/table/optable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/bot_red, +/turf/open/floor/iron/dark, +/area/station/medical/surgery/theatre) "fCX" = ( /obj/effect/decal/cleanable/insectguts, /turf/open/floor/circuit, @@ -22411,16 +22680,12 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/engineering/main) -"fEa" = ( -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/brig) +"fEd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/vacuum/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/execution/education) "fEe" = ( /obj/structure/table/wood, /obj/item/folder/blue{ @@ -22474,6 +22739,12 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/service/library/abandoned) +"fED" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/mess, +/obj/effect/spawner/random/trash/graffiti, +/turf/open/floor/iron, +/area/station/medical/abandoned) "fEI" = ( /obj/effect/spawner/structure/window/hollow/reinforced/directional{ dir = 9 @@ -22481,6 +22752,30 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) +"fEX" = ( +/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/status_display/evac/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/service) +"fFb" = ( +/obj/structure/table, +/obj/effect/spawner/random/entertainment/drugs{ + pixel_y = 4 + }, +/obj/effect/spawner/random/entertainment/drugs{ + pixel_y = 1 + }, +/obj/machinery/reagentgrinder{ + pixel_y = 4 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/grimy, +/area/station/maintenance/port/fore) "fFf" = ( /obj/machinery/photocopier, /obj/effect/turf_decal/tile/brown/half/contrasted{ @@ -22510,6 +22805,13 @@ /obj/effect/mapping_helpers/airalarm/unlocked, /turf/open/floor/iron/dark, /area/station/maintenance/disposal/incinerator) +"fFo" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/prison/visit) "fFr" = ( /obj/machinery/computer/atmos_control{ dir = 8 @@ -22522,19 +22824,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/engineering/gravity_generator) -"fFw" = ( -/obj/machinery/light/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Atmospherics - Storage"; - name = "atmospherics camera" - }, -/obj/item/kirbyplants/random, -/obj/machinery/newscaster/directional/west, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage) "fFz" = ( /obj/structure/rack, /obj/effect/spawner/random/techstorage/security_all, @@ -22585,24 +22874,18 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/medical/medsci) -"fFW" = ( -/obj/machinery/light_switch/directional/north, -/turf/open/floor/wood, -/area/station/command/meeting_room/council) -"fGf" = ( -/obj/machinery/light/directional/west, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/service/lawoffice) "fGn" = ( /obj/machinery/deepfryer, /obj/effect/turf_decal/bot, /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) +"fGt" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/iron/dark, +/area/station/service/abandoned_gambling_den) "fGD" = ( /obj/machinery/light/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -22627,12 +22910,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/r_wall, /area/station/engineering/atmos/mix) -"fGU" = ( +"fGY" = ( +/obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/theater/abandoned) +/obj/machinery/status_display/supply{ + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/cargo/storage) "fGZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/spawner/random/structure/steam_vent, @@ -22658,12 +22947,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/chapel) -"fHp" = ( -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "fHr" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/purple/half/contrasted{ @@ -22686,6 +22969,19 @@ "fHI" = ( /turf/closed/wall, /area/station/commons/storage/primary) +"fHK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/camera/directional/east{ + c_tag = "Engineering Hallway - Fore"; + name = "hallway camera" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "fHM" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrogen_output{ dir = 4 @@ -22736,6 +23032,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/fore) +"fIx" = ( +/obj/machinery/modular_computer/preset/id, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "fIB" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/engine/n2o, @@ -22834,15 +23137,6 @@ }, /turf/open/floor/iron/checker, /area/station/service/janitor) -"fKk" = ( -/obj/structure/table/wood, -/obj/item/storage/crayons, -/obj/item/toy/crayon/spraycan, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/wood, -/area/station/maintenance/port/fore) "fKv" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -22901,6 +23195,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/abandoned_gambling_den) +"fKQ" = ( +/obj/item/stack/sheet/plasteel{ + amount = 15 + }, +/obj/item/wrench, +/obj/item/clothing/glasses/welding, +/obj/machinery/firealarm/directional/west, +/obj/structure/table, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron, +/area/station/science/robotics/lab) "fKS" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -22950,17 +23255,10 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/maintenance/starboard/lesser) -"fLA" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/button/door{ - id = "xeno2"; - name = "Containment Control"; - req_access = list("xenobiology") - }, -/obj/machinery/light/directional/north, +"fLv" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/east, /turf/open/floor/iron, -/area/station/science/xenobiology) +/area/station/security/prison) "fLJ" = ( /obj/structure/disposalpipe/junction{ dir = 1 @@ -23016,18 +23314,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"fMj" = ( -/obj/machinery/mass_driver/chapelgun, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/small/red/directional/north, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) "fMo" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -23094,16 +23380,6 @@ }, /turf/open/floor/iron, /area/station/cargo/office) -"fNM" = ( -/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 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "fNN" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/effect/spawner/random/vending/snackvend, @@ -23328,14 +23604,6 @@ }, /turf/open/floor/iron, /area/station/command/teleporter) -"fQx" = ( -/obj/structure/closet/radiation, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/main) "fQC" = ( /obj/structure/table, /obj/item/mod/module/plasma_stabilizer, @@ -23344,6 +23612,7 @@ dir = 5 }, /obj/item/radio/intercom/directional/south, +/obj/item/mod/module/signlang_radio, /turf/open/floor/iron/dark, /area/station/security/office) "fQF" = ( @@ -23365,6 +23634,24 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/customs/aft) +"fQL" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/button/door{ + id = "Disposal Exit"; + name = "Disposal Vent Control"; + pixel_x = -25; + pixel_y = 4; + req_access = list("maint_tunnels") + }, +/obj/structure/chair/stool/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/machinery/computer/pod/old/mass_driver_controller/trash{ + pixel_x = -24; + pixel_y = -7 + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal) "fQW" = ( /obj/machinery/door/airlock{ id_tag = "commissarydoor"; @@ -23417,6 +23704,12 @@ "fRo" = ( /turf/open/floor/iron, /area/station/hallway/primary/fore) +"fRA" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) "fRK" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -23465,12 +23758,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/department/science) -"fSE" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/supermatter/room) "fSG" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -23502,6 +23789,7 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners{ dir = 1 }, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron, /area/station/service/kitchen/abandoned) "fTw" = ( @@ -23510,16 +23798,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"fTx" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) "fTz" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -23587,6 +23865,13 @@ "fTS" = ( /turf/open/floor/iron, /area/station/security/prison/work) +"fTZ" = ( +/obj/structure/table, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/hand_labeler, +/turf/open/floor/iron/checker, +/area/station/hallway/secondary/service) "fUf" = ( /obj/structure/table/wood/poker, /obj/effect/spawner/random/maintenance, @@ -23616,18 +23901,21 @@ /turf/open/floor/iron, /area/station/commons/fitness/recreation) "fUr" = ( -/obj/machinery/atmospherics/components/unary/cryo_cell{ +/obj/machinery/cryo_cell{ dir = 8 }, /turf/open/floor/iron/dark/textured_large, /area/station/medical/cryo) -"fUM" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/white, -/area/station/science/research) +"fUF" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/button/door{ + id = "xeno1"; + name = "Containment Control"; + req_access = list("xenobiology") + }, +/turf/open/floor/iron, +/area/station/science/xenobiology) "fUN" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, @@ -23670,6 +23958,19 @@ dir = 1 }, /area/station/science/xenobiology) +"fVd" = ( +/obj/structure/cable, +/obj/structure/sign/warning/no_smoking/circle{ + pixel_x = 28; + pixel_y = -28 + }, +/obj/machinery/modular_computer/preset/engineering{ + dir = 1 + }, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/main) "fVh" = ( /obj/machinery/atmospherics/components/binary/pump/on/scrubbers/hidden/layer2{ dir = 8; @@ -23678,13 +23979,6 @@ /obj/effect/turf_decal/trimline/neutral, /turf/open/floor/iron/dark, /area/station/commons/locker) -"fVj" = ( -/obj/structure/closet/secure_closet/security/sec, -/obj/structure/sign/poster/official/do_not_question/directional/south, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/lockers) "fVl" = ( /obj/structure/displaycase/trophy, /obj/effect/turf_decal/siding/wood/end{ @@ -23702,6 +23996,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/medical/treatment_center) +"fVA" = ( +/obj/machinery/modular_computer/preset/cargochat/engineering{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 5 + }, +/obj/structure/sign/poster/official/random/directional/south, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) "fVT" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -23709,6 +24014,21 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"fVU" = ( +/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/thinplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "fWc" = ( /obj/structure/chair/pew/left, /turf/open/floor/iron/chapel{ @@ -23784,33 +24104,6 @@ }, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) -"fXb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/poster/official/work_for_a_future/directional/south, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/prison/safe) -"fXi" = ( -/obj/machinery/light/directional/north, -/obj/structure/sign/plaques/kiddie/badger{ - pixel_y = 32 - }, -/obj/structure/table/wood, -/obj/item/food/grown/harebell, -/obj/item/food/grown/harebell{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/food/grown/harebell{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "fXj" = ( /obj/machinery/door/airlock/atmos{ name = "Atmospherics Auxiliary Port" @@ -23819,11 +24112,11 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, /obj/effect/mapping_helpers/airlock/unres{ dir = 1 }, /obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/iron, /area/station/maintenance/department/electrical) "fXk" = ( @@ -23834,13 +24127,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"fXs" = ( -/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/iron/grimy, -/area/station/command/heads_quarters/hos) "fXt" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate/preopen, @@ -23857,6 +24143,16 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/science/lab) +"fXx" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/machinery/light_switch/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) "fXz" = ( /turf/open/space, /area/space/nearstation) @@ -23887,6 +24183,19 @@ "fXF" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmos) +"fXG" = ( +/obj/structure/table/reinforced, +/obj/item/clipboard, +/obj/item/toy/figure/borg, +/obj/item/radio/intercom/directional/south{ + freerange = 1; + frequency = 1447; + listening = 0; + name = "Private Channel" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) "fXQ" = ( /obj/effect/spawner/random/structure/tank_holder, /obj/effect/turf_decal/trimline/green/filled/corner{ @@ -23925,45 +24234,22 @@ }, /turf/open/floor/iron, /area/station/maintenance/fore) -"fYh" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/warning/no_smoking/circle/directional/south, -/obj/effect/turf_decal/siding/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 +"fYp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 10 }, -/turf/open/floor/iron, -/area/station/maintenance/department/electrical) -"fYu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/bluespace_vendor/directional/north, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 }, +/obj/machinery/light/dim/directional/south, /turf/open/floor/iron, -/area/station/hallway/primary/central/fore) +/area/station/tcommsat/server) "fYw" = ( /obj/machinery/telecomms/bus/preset_three, /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"fYz" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Bridge - Starboard"; - name = "command camera" - }, -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "fYD" = ( /obj/effect/turf_decal/loading_area{ dir = 4 @@ -24101,22 +24387,27 @@ /obj/effect/landmark/navigate_destination, /turf/open/floor/iron, /area/station/security/courtroom) -"gao" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/obj/item/radio/intercom/directional/east, -/obj/machinery/light/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Xeniobiology - Maintenance Access"; - name = "xenobiology camera"; - network = list("ss13","xeno","rd") +"gan" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/newscaster/directional/east, +/obj/effect/spawner/random/structure/table_fancy, +/obj/item/reagent_containers/cup/glass/bottle/beer{ + desc = "Whatever it is, it reeks of foul, putrid froth."; + list_reagents = list(/datum/reagent/consumable/ethanol/bacchus_blessing=15); + name = "Delta-Down"; + pixel_x = 5; + pixel_y = 5 }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_x = -3; + pixel_y = 6 }, -/turf/open/floor/iron, -/area/station/science/xenobiology) +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_x = -6; + pixel_y = 3 + }, +/turf/open/floor/wood, +/area/station/commons/dorms) "gat" = ( /obj/machinery/door/poddoor/preopen{ id = "brigprison"; @@ -24156,13 +24447,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/medical/chemistry) -"gaF" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "gaG" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -24228,22 +24512,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) -"gbv" = ( -/obj/effect/turf_decal/trimline/neutral/warning, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/table/reinforced, -/obj/machinery/computer/records/medical/laptop{ - dir = 4; - pixel_x = 3; - pixel_y = -1 - }, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "gby" = ( /obj/structure/table/wood, /obj/machinery/computer/records/medical/laptop, @@ -24258,6 +24526,13 @@ /obj/structure/sign/poster/random/directional/east, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"gbF" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "gbG" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -24303,15 +24578,41 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"gcm" = ( +/obj/machinery/hydroponics/constructable, +/obj/item/radio/intercom/directional/north, +/obj/machinery/camera/directional/east{ + c_tag = "Service - Hydroponics Front Fore"; + dir = 6; + name = "service camera" + }, +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) "gco" = ( +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + 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/cable, -/obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, /area/station/cargo/miningoffice) "gcr" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/maintenance/port) +"gcs" = ( +/obj/machinery/teleport/station, +/obj/machinery/status_display/ai/directional/north, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) "gcu" = ( /obj/machinery/door/poddoor/preopen{ id = "transitlock"; @@ -24332,12 +24633,20 @@ "gcB" = ( /turf/closed/wall/r_wall, /area/station/service/chapel/funeral) -"gcF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/south, -/obj/effect/turf_decal/tile/neutral/half/contrasted, +"gcD" = ( +/obj/machinery/status_display/door_timer{ + id = "cargocell"; + name = "Cargo Cell"; + pixel_x = -32; + pixel_y = -32 + }, +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/west, /turf/open/floor/iron, -/area/station/maintenance/department/science) +/area/station/security/checkpoint/supply) "gcI" = ( /obj/item/radio/intercom/directional/south{ broadcasting = 1; @@ -24397,6 +24706,13 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"gdq" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "gdr" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -24404,6 +24720,22 @@ }, /turf/open/floor/plating, /area/station/service/theater/abandoned) +"gdt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/bin, +/obj/effect/spawner/random/contraband/prison, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron, +/area/station/security/prison) +"gdA" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/duct, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/department/security) "gdE" = ( /obj/structure/chair/office, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -24501,6 +24833,12 @@ /obj/structure/cable, /turf/open/space, /area/station/solars/starboard/aft) +"geR" = ( +/obj/machinery/vending/engivend, +/obj/effect/turf_decal/delivery, +/obj/structure/sign/poster/official/moth_hardhat/directional/east, +/turf/open/floor/iron, +/area/station/engineering/main) "geU" = ( /obj/structure/extinguisher_cabinet/directional/south, /obj/machinery/firealarm/directional/west, @@ -24538,6 +24876,7 @@ dir = 4 }, /obj/machinery/requests_console/directional/north{ + department = "Ordnance"; name = "Ordnance Mixing Lab Requests Console" }, /obj/effect/turf_decal/box/red, @@ -24602,6 +24941,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/auxlab/firing_range) +"gfw" = ( +/obj/structure/sign/warning/secure_area/directional/south, +/obj/structure/table, +/obj/item/assembly/infra, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white, +/area/station/science/lobby) "gfC" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/effect/turf_decal/stripes/line{ @@ -24621,12 +24971,6 @@ /obj/effect/spawner/random/entertainment/deck, /turf/open/floor/carpet/black, /area/station/maintenance/port) -"gga" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/newscaster/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/electronic_marketing_den) "ggc" = ( /obj/machinery/duct, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -24634,16 +24978,16 @@ /obj/effect/turf_decal/tile/neutral/anticorner/contrasted, /turf/open/floor/iron, /area/station/commons/toilet/locker) -"ggg" = ( -/obj/structure/table, -/obj/machinery/status_display/ai/directional/west, -/obj/machinery/microwave{ - pixel_x = -2; - pixel_y = 5 +"ggl" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Central Hallway - Security Hallway"; + name = "hallway camera" }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "ggn" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/west, @@ -24653,12 +24997,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"ggu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/virology) "ggz" = ( /obj/machinery/firealarm/directional/south, /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ @@ -24799,6 +25137,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/medical/abandoned) +"giC" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Central Hallway - Port"; + name = "hallway camera" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "giY" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/contraband/random/directional/north, @@ -24851,6 +25199,19 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/fore) +"gjk" = ( +/obj/structure/chair, +/obj/machinery/airalarm/directional/west, +/obj/machinery/camera/directional/north{ + c_tag = "Security Post - Departures Holding Cell"; + dir = 9 + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 + }, +/obj/structure/sign/poster/official/report_crimes/directional/north, +/turf/open/floor/iron, +/area/station/security/checkpoint/escape) "gjl" = ( /obj/machinery/computer/upload/borg{ dir = 1 @@ -24877,6 +25238,19 @@ }, /turf/open/floor/iron/white, /area/station/medical/paramedic) +"gjG" = ( +/obj/structure/table/wood, +/obj/item/storage/secure/safe/hos{ + pixel_x = 32 + }, +/obj/machinery/light_switch/directional/north, +/obj/effect/turf_decal/siding/dark_red{ + dir = 6 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/item/flashlight/lamp/green, +/turf/open/floor/iron, +/area/station/command/heads_quarters/hos) "gjI" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/north, @@ -24941,11 +25315,6 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) -"gkT" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/station/science/research/abandoned) "gkU" = ( /obj/effect/turf_decal/stripes/red/line{ dir = 4 @@ -24953,6 +25322,13 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark/textured_large, /area/station/science/xenobiology) +"gkW" = ( +/obj/structure/table/wood, +/obj/item/storage/briefcase, +/obj/structure/sign/poster/official/help_others/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) "glb" = ( /obj/effect/turf_decal/delivery, /obj/machinery/meter, @@ -25023,17 +25399,6 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) -"gmr" = ( -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/obj/machinery/light/cold/directional/west, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white/corner, -/area/station/security/medical) "gmx" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Supermatter Engine Room" @@ -25054,12 +25419,12 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, /obj/effect/mapping_helpers/airlock/unres{ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/iron, /area/station/maintenance/department/electrical) "gmE" = ( @@ -25086,8 +25451,8 @@ /area/station/science/xenobiology) "gmK" = ( /obj/structure/cable, -/obj/machinery/newscaster/directional/south, /obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/machinery/mining_weather_monitor/directional/south, /turf/open/floor/iron, /area/station/construction/mining/aux_base) "gmP" = ( @@ -25114,6 +25479,13 @@ /obj/item/clothing/gloves/color/fyellow, /turf/open/floor/iron, /area/station/commons/storage/primary) +"gmY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "gmZ" = ( /obj/item/stack/cable_coil, /obj/item/assembly/igniter, @@ -25127,6 +25499,19 @@ /obj/structure/table, /turf/open/floor/iron/white, /area/station/science/lobby) +"gnb" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/medical_kiosk, +/obj/machinery/camera/directional/north{ + c_tag = "Medbay - Lobby"; + name = "medbay camera"; + network = list("ss13","medbay") + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "gng" = ( /obj/effect/turf_decal/arrows/red{ dir = 1 @@ -25147,15 +25532,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/security/detectives_office/private_investigators_office) -"gnv" = ( -/obj/structure/table/wood, -/obj/item/clothing/under/costume/maid, -/obj/item/clothing/head/costume/kitty, -/obj/structure/sign/poster/official/report_crimes/directional/north, -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/wood, -/area/station/service/theater/abandoned) "gnw" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -25195,6 +25571,12 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space/nearstation) +"gnO" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) "gnS" = ( /obj/effect/landmark/start/hangover, /obj/structure/extinguisher_cabinet/directional/south, @@ -25230,21 +25612,6 @@ }, /turf/open/floor/carpet, /area/station/command/bridge) -"goi" = ( -/obj/structure/table/wood, -/obj/item/stack/package_wrap{ - pixel_x = -4; - pixel_y = 6 - }, -/obj/item/stack/package_wrap{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/hand_labeler, -/obj/item/pen, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron/checker, -/area/station/service/bar/backroom) "goj" = ( /obj/structure/sign/painting/library{ pixel_y = 33 @@ -25285,15 +25652,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/plating, /area/station/maintenance/port) -"goG" = ( -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/hallway/secondary/exit/departure_lounge) "goV" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -25337,15 +25695,13 @@ }, /turf/open/floor/plating, /area/station/medical/paramedic) -"gpu" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/maintenance/department/chapel) +"gps" = ( +/obj/structure/closet/secure_closet/bar, +/obj/item/storage/photo_album/bar, +/obj/item/radio/intercom/directional/east, +/obj/item/storage/dice, +/turf/open/floor/iron/checker, +/area/station/service/bar/backroom) "gpw" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -25384,6 +25740,16 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"gqe" = ( +/obj/structure/table/reinforced, +/obj/item/pipe_dispenser{ + pixel_x = 2; + pixel_y = -4 + }, +/obj/item/pipe_dispenser, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "gqf" = ( /obj/structure/rack, /obj/effect/turf_decal/bot_red, @@ -25412,19 +25778,6 @@ /obj/structure/dresser, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/hop) -"gqv" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Engineering - Aft"; - name = "engineering camera" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/effect/spawner/random/structure/tank_holder, -/obj/item/radio/intercom/directional/south, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/engineering/main) "gqA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/airlock/maintenance_hatch{ @@ -25450,6 +25803,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos) +"gqG" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/scrubber, +/obj/structure/sign/poster/official/there_is_no_gas_giant/directional/east, +/turf/open/floor/iron/textured_large, +/area/station/engineering/atmos/project) "gqH" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 1; @@ -25625,6 +25984,12 @@ }, /turf/open/floor/wood, /area/station/engineering/break_room) +"gsh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/science/auxlab/firing_range) "gsy" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -25677,6 +26042,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/library/abandoned) +"gsP" = ( +/obj/machinery/light_switch/directional/north, +/obj/machinery/photocopier, +/obj/machinery/light/directional/north, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain) "gsV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ @@ -25709,13 +26080,6 @@ }, /turf/open/floor/iron, /area/station/medical/virology) -"gtj" = ( -/obj/effect/turf_decal/bot, -/obj/structure/tank_dispenser, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/supermatter/room) "gtp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/iron/dark/textured, @@ -25725,16 +26089,6 @@ /obj/item/toy/cards/deck, /turf/open/floor/iron/grimy, /area/station/service/abandoned_gambling_den) -"gtA" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/item/mod/module/plasma_stabilizer, -/obj/item/mod/module/thermal_regulator, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/medical/storage) "gtG" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -25789,10 +26143,22 @@ /turf/open/floor/iron, /area/station/commons/storage/primary) "guj" = ( -/obj/effect/landmark/start/shaft_miner, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"gum" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/science/auxlab/firing_range) "gup" = ( /obj/machinery/camera/directional/east{ c_tag = "Central Hallway - Aft Starboard"; @@ -25819,11 +26185,6 @@ /obj/structure/cable, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) -"guz" = ( -/obj/machinery/light/directional/north, -/obj/item/kirbyplants/random, -/turf/open/floor/wood, -/area/station/command/meeting_room/council) "guA" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -26022,12 +26383,6 @@ /obj/structure/sign/poster/random/directional/west, /turf/open/floor/wood, /area/station/hallway/secondary/service) -"gwu" = ( -/obj/item/kirbyplants/random, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) "gwx" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -26038,14 +26393,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/science/xenobiology) -"gwE" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/chair/stool/bar/directional/west, -/obj/structure/sign/poster/contraband/random/directional/south, -/turf/open/floor/wood, -/area/station/service/electronic_marketing_den) "gwL" = ( /obj/machinery/hydroponics/soil, /obj/effect/decal/cleanable/dirt, @@ -26081,14 +26428,6 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/large, /area/station/medical/surgery/theatre) -"gxD" = ( -/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{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "gxF" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/botanical_waste, @@ -26179,6 +26518,15 @@ }, /turf/open/floor/iron/white, /area/station/science/research) +"gyR" = ( +/obj/structure/cable, +/obj/machinery/modular_computer/preset/engineering{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "gyW" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/wood/corner{ @@ -26198,23 +26546,15 @@ /obj/effect/mapping_helpers/mail_sorting/service/law_office, /turf/open/floor/plating, /area/station/maintenance/department/security) +"gzc" = ( +/obj/structure/table/wood, +/turf/open/floor/carpet/red, +/area/station/hallway/secondary/service) "gzj" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/start/prisoner, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) -"gzz" = ( -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/newscaster/directional/east, -/obj/effect/turf_decal/bot/right, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/science/ordnance/office) "gzF" = ( /obj/structure/cable, /obj/structure/table/reinforced, @@ -26295,6 +26635,15 @@ "gAw" = ( /turf/closed/wall/r_wall, /area/station/engineering/supermatter/room) +"gAD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/button/door/directional/west{ + id = "cafe_counter"; + name = "Counter Shutters Control"; + pixel_y = 8 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "gAE" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/purple{ @@ -26312,30 +26661,20 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) -"gAV" = ( -/obj/machinery/newscaster/directional/east, -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/obj/structure/sign/warning/cold_temp/directional/south, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"gAW" = ( -/obj/effect/turf_decal/delivery, -/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) "gBc" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/medical/abandoned) +"gBd" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 5 + }, +/turf/open/floor/iron/dark/textured_half{ + dir = 1 + }, +/area/station/medical/morgue) "gBh" = ( /obj/structure/table/reinforced, /obj/item/stack/cable_coil, @@ -26372,12 +26711,40 @@ }, /turf/open/floor/iron/white/side, /area/station/science/research) +"gBs" = ( +/obj/structure/table/reinforced, +/obj/item/clipboard, +/obj/item/toy/figure/secofficer, +/obj/machinery/newscaster/directional/west, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/security/holding_cell) "gBx" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"gBA" = ( +/obj/structure/table/glass, +/obj/item/storage/medkit/regular, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -15; + pixel_y = 2 + }, +/obj/item/reagent_containers/cup/bottle/multiver, +/obj/item/reagent_containers/syringe, +/obj/structure/sign/poster/official/cleanliness/directional/east, +/obj/machinery/vending/wallmed/directional/north, +/obj/effect/turf_decal/siding/dark_red, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/medical) "gBC" = ( /obj/structure/window/spawner/directional/south, /obj/machinery/biogenerator, @@ -26506,6 +26873,44 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/science) +"gCQ" = ( +/obj/structure/reagent_dispensers/wall/peppertank/directional/north, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/courtroom) +"gCS" = ( +/obj/structure/sign/poster/official/science/directional/west, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/status_display/ai/directional/north, +/obj/structure/rack, +/obj/item/clothing/under/rank/medical/scrubs/purple{ + pixel_x = 6; + pixel_y = 5 + }, +/obj/item/clothing/under/rank/medical/scrubs/purple{ + pixel_x = 6; + pixel_y = 5 + }, +/obj/item/clothing/under/rank/medical/scrubs/blue{ + pixel_x = -4; + pixel_y = 5 + }, +/obj/item/clothing/under/rank/medical/scrubs/blue{ + pixel_x = -4; + pixel_y = 5 + }, +/obj/item/clothing/under/rank/medical/scrubs/green{ + pixel_x = 1; + pixel_y = 3 + }, +/obj/item/clothing/under/rank/medical/scrubs/green{ + pixel_x = 1; + pixel_y = 3 + }, +/turf/open/floor/engine, +/area/station/science/genetics) "gCV" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -26578,14 +26983,6 @@ }, /turf/open/floor/iron, /area/station/security/office) -"gEp" = ( -/obj/item/kirbyplants/random, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hos) "gEz" = ( /obj/structure/sign/calendar/directional/south, /turf/open/floor/carpet/blue, @@ -26625,13 +27022,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) -"gER" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/bin, -/obj/effect/spawner/random/contraband/prison, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron, -/area/station/security/prison) +"gEJ" = ( +/obj/structure/table/wood, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/flashlight/lamp/green, +/turf/open/floor/iron/dark, +/area/station/service/library/private) "gEW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -26699,13 +27097,16 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/ai_monitored/security/armory) -"gFK" = ( -/obj/machinery/vending/hydroseeds, -/obj/machinery/light_switch/directional/north{ - pixel_x = -8 +"gFM" = ( +/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, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 }, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden) +/turf/open/floor/iron, +/area/station/maintenance/department/science) "gFO" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26766,6 +27167,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"gGE" = ( +/obj/structure/chair, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/item/radio/intercom/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/security/checkpoint/escape) "gGF" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/girder, @@ -26803,14 +27214,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/research) -"gHk" = ( -/obj/machinery/light/directional/east, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "gHt" = ( /obj/item/kirbyplants/random, /obj/machinery/button/door/directional/north{ @@ -26826,24 +27229,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) -"gHz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/west, -/obj/structure/sign/poster/official/foam_force_ad/directional/west, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"gHF" = ( -/obj/structure/bodycontainer/morgue{ - dir = 1 - }, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 +"gHE" = ( +/obj/machinery/requests_console/directional/north{ + department = "Chapel"; + name = "Chapel Requests Console" }, -/area/station/medical/morgue) +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/machinery/light/small/directional/north, +/turf/open/floor/carpet/royalblack, +/area/station/service/chapel/office) "gHH" = ( /obj/structure/cable, /obj/structure/closet/secure_closet/contraband/heads, @@ -26920,6 +27314,39 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/main) +"gIw" = ( +/obj/machinery/status_display/ai/directional/north, +/obj/machinery/button/door/directional/east{ + id = "hosprivacy"; + name = "Privacy Control"; + pixel_y = 6; + req_access = list("hos") + }, +/obj/machinery/button/door/directional/east{ + id = "hosspace"; + name = "Space Shutters Control"; + pixel_y = -6; + req_access = list("hos") + }, +/obj/machinery/keycard_auth/directional/east{ + pixel_x = 38; + pixel_y = 6 + }, +/obj/machinery/light_switch/directional/east{ + pixel_x = 37; + pixel_y = -6 + }, +/obj/structure/tank_holder/extinguisher, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hos) +"gIx" = ( +/obj/machinery/atmospherics/components/binary/valve, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/engineering/atmos/hfr_room) "gIB" = ( /obj/structure/table/reinforced, /obj/machinery/newscaster/directional/west, @@ -26936,6 +27363,12 @@ }, /turf/open/floor/iron, /area/station/security/warden) +"gIE" = ( +/obj/machinery/modular_computer/preset/cargochat/service, +/obj/effect/turf_decal/bot, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/checker, +/area/station/hallway/secondary/service) "gII" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -27013,14 +27446,6 @@ "gJk" = ( /turf/closed/wall, /area/station/security/execution/transfer) -"gJA" = ( -/obj/machinery/status_display/evac/directional/south, -/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/ai_monitored/command/nuke_storage) "gJB" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/grille_or_waste, @@ -27288,14 +27713,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay) -"gMY" = ( -/obj/machinery/light/directional/west, -/obj/structure/sign/poster/official/safety_eye_protection/directional/west, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "gNd" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/binary/pump, @@ -27350,36 +27767,11 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"gOv" = ( -/obj/structure/rack, -/obj/effect/turf_decal/bot, -/obj/item/storage/box/bodybags{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/bodybags, -/obj/machinery/airalarm/directional/west, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "gOH" = ( /obj/effect/landmark/blobstart, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) -"gOM" = ( -/obj/structure/reagent_dispensers/water_cooler, -/obj/machinery/newscaster/directional/south, -/obj/machinery/camera/directional/east{ - c_tag = "Medbay - Paramedic Dispatch"; - name = "medbay camera"; - network = list("ss13","medbay") - }, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron/white, -/area/station/medical/paramedic) "gOR" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -27465,6 +27857,13 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plating, /area/station/commons/toilet/locker) +"gPy" = ( +/obj/effect/turf_decal/siding/yellow/corner{ + dir = 8 + }, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos/hfr_room) "gPG" = ( /obj/structure/weightmachine/weightlifter, /obj/effect/turf_decal/tile/brown/half/contrasted, @@ -27538,6 +27937,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"gQH" = ( +/obj/structure/sign/warning/secure_area/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "gQI" = ( /obj/structure/table/glass, /obj/item/storage/belt/medical, @@ -27558,14 +27962,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) -"gQN" = ( -/obj/structure/rack, -/obj/effect/turf_decal/bot, -/obj/item/reagent_containers/spray/cleaner, -/obj/item/pushbroom, -/obj/effect/turf_decal/siding/thinplating/dark, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "gQV" = ( /obj/structure/cable, /turf/open/floor/iron/grimy, @@ -27677,16 +28073,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/cargo/lobby) -"gSt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 5 - }, -/obj/structure/sign/poster/official/wtf_is_co2/directional/north, -/turf/open/floor/iron, -/area/station/engineering/atmos) "gSx" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/generic_maintenance_landmark, @@ -27695,6 +28081,21 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron, /area/station/maintenance/department/engine/atmos) +"gSB" = ( +/obj/structure/cable, +/obj/machinery/button/door/incinerator_vent_atmos_main{ + pixel_x = -8; + pixel_y = 36 + }, +/obj/machinery/button/door/incinerator_vent_atmos_aux{ + pixel_x = -8; + pixel_y = 24 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/stool/directional/south, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "gSR" = ( /obj/structure/sink/directional/south, /obj/effect/turf_decal/tile/blue{ @@ -27747,7 +28148,7 @@ /area/station/medical/cryo) "gTH" = ( /obj/machinery/flasher/directional/south{ - id = "Cell 6" + id = "Isolation_Cell" }, /obj/machinery/light/small/broken/directional/south, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -27755,6 +28156,18 @@ }, /turf/open/floor/plating, /area/station/security/prison/safe) +"gTO" = ( +/obj/structure/table/wood, +/obj/item/crowbar/red, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/book/manual/wiki/detective, +/obj/item/camera/detective, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/detectives_office/private_investigators_office) "gUa" = ( /obj/effect/spawner/random/trash/grille_or_waste, /turf/open/floor/plating, @@ -27822,27 +28235,6 @@ }, /turf/open/floor/iron, /area/station/service/kitchen/abandoned) -"gUB" = ( -/obj/structure/table/reinforced, -/obj/structure/microscope{ - pixel_x = -1; - pixel_y = 2 - }, -/obj/item/biopsy_tool{ - pixel_x = 14; - pixel_y = 4 - }, -/obj/item/reagent_containers/cup/beaker{ - pixel_x = -8; - pixel_y = 12 - }, -/obj/machinery/newscaster/directional/north, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) "gUD" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/research{ @@ -27905,6 +28297,28 @@ }, /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) +"gUZ" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/junction{ + 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) +"gVh" = ( +/obj/machinery/airalarm/directional/west, +/obj/structure/table, +/obj/item/paper_bin/carbon{ + pixel_y = 5 + }, +/obj/effect/spawner/random/bureaucracy/pen, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "gVr" = ( /obj/effect/landmark/start/assistant, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -28001,18 +28415,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"gWH" = ( -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/obj/machinery/duct, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "gWJ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot_white/right, @@ -28042,6 +28444,15 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/grimy, /area/station/service/lawoffice) +"gXg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "gXm" = ( /obj/item/kirbyplants/random, /obj/machinery/firealarm/directional/south, @@ -28075,15 +28486,17 @@ /obj/structure/cable, /turf/closed/wall/r_wall, /area/station/maintenance/port) -"gXM" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/red/opposingcorners{ +"gXS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing/corner{ dir = 1 }, -/turf/open/floor/iron/cafeteria, -/area/station/service/cafeteria) +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/service/hydroponics) "gXT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -28144,13 +28557,6 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"gYN" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "gYS" = ( /obj/item/radio/intercom/directional/east, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted, @@ -28189,29 +28595,14 @@ /area/station/science/xenobiology) "gZz" = ( /obj/structure/table/wood, -/obj/item/folder/red, -/obj/item/hand_labeler, -/turf/open/floor/carpet, -/area/station/security/detectives_office) -"gZM" = ( -/obj/structure/table, -/obj/machinery/light_switch/directional/south{ - pixel_x = -6 - }, -/obj/machinery/status_display/evac/directional/east, -/obj/item/storage/toolbox/mechanical{ - pixel_y = 3 - }, -/obj/item/storage/toolbox/electrical{ - pixel_x = 1 +/obj/item/folder/red{ + pixel_y = 5 }, -/obj/item/multitool, -/obj/item/clothing/head/utility/welding, -/obj/effect/turf_decal/siding/purple{ - dir = 8 +/obj/item/hand_labeler{ + pixel_y = -11 }, -/turf/open/floor/iron, -/area/station/science/robotics/lab) +/turf/open/floor/carpet, +/area/station/security/detectives_office) "gZU" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -28259,6 +28650,13 @@ /obj/structure/sign/warning/secure_area/directional/west, /turf/open/space/basic, /area/space) +"haG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 10 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) "haI" = ( /turf/open/floor/circuit/green, /area/station/engineering/gravity_generator) @@ -28285,21 +28683,17 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"hbg" = ( +/obj/effect/spawner/random/structure/closet_empty, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/department/science) "hbi" = ( /obj/structure/rack, /obj/effect/spawner/random/techstorage/medical_all, /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/engineering/storage/tech) -"hbn" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/light/small/directional/north, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "hby" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28345,6 +28739,17 @@ /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, /area/station/cargo/storage) +"hbO" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Medbay - Starboard Hallway"; + name = "medbay camera"; + network = list("ss13","medbay") + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay) "hbS" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/firealarm/directional/north, @@ -28366,6 +28771,13 @@ }, /turf/open/floor/iron, /area/station/engineering/storage/tech) +"hci" = ( +/obj/machinery/status_display/ai/directional/south, +/obj/structure/closet/secure_closet/security/sec, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/lockers) "hcj" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/east, @@ -28405,25 +28817,48 @@ /obj/effect/spawner/random/trash/graffiti, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"hcM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/maintenance/department/science) +"hcN" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/maintenance/port/fore) "hcQ" = ( /obj/structure/cable, /obj/effect/landmark/start/station_engineer, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/main) +"hcR" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_half{ + dir = 1 + }, +/area/station/medical/morgue) "hcW" = ( /obj/machinery/light/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/structure/sign/warning/gas_mask/directional/north, /obj/effect/turf_decal/tile/neutral/full, +/obj/machinery/atmospherics/components/binary/pump/on/supply/visible/layer4{ + dir = 4 + }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/ordnance) -"hdp" = ( -/obj/effect/turf_decal/trimline/purple/filled/corner, -/obj/item/radio/intercom/directional/east, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/white, -/area/station/science/research) "hdx" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -28466,15 +28901,6 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/escape) -"hdS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "hdU" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/directions/engineering{ @@ -28494,6 +28920,14 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) +"hec" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/north, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain) "hek" = ( /obj/structure/disposalpipe/junction/flip{ dir = 1 @@ -28531,11 +28965,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) -"heP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/r_wall, -/area/station/maintenance/port/aft) "heT" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -28589,7 +29018,7 @@ }, /obj/effect/mapping_helpers/airlock/locked, /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "hfe" = ( /obj/effect/turf_decal/stripes/end{ @@ -28627,14 +29056,6 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"hfG" = ( -/obj/machinery/computer/records/security{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/machinery/status_display/evac/directional/east, -/turf/open/floor/carpet, -/area/station/security/detectives_office) "hfM" = ( /obj/effect/decal/cleanable/glass, /obj/structure/sign/poster/contraband/random/directional/west, @@ -28682,15 +29103,6 @@ dir = 1 }, /area/station/engineering/gravity_generator) -"hgG" = ( -/obj/effect/landmark/start/hangover, -/obj/structure/chair/sofa/bench{ - dir = 8 - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "hgH" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -28733,30 +29145,10 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/science) -"hhe" = ( -/obj/machinery/light/directional/north, -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain) "hhn" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/execution/education) -"hhB" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/directional/east, -/obj/item/wrench, -/obj/item/assembly/timer, -/obj/item/assembly/signaler, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "hhJ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/blobstart, @@ -28772,6 +29164,15 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/engineering/atmos/mix) +"hhR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/firealarm/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron, +/area/station/engineering/atmos/project) "hie" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, @@ -28804,12 +29205,6 @@ }, /turf/open/floor/iron/white, /area/station/science/research) -"hiy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/newscaster/directional/east, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/security/detectives_office/private_investigators_office) "hiF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -28848,21 +29243,33 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) +"hiW" = ( +/obj/structure/table, +/obj/item/assembly/igniter, +/obj/item/assembly/igniter, +/obj/item/assembly/igniter, +/obj/item/assembly/timer{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/assembly/timer{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/assembly/timer{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/structure/sign/poster/official/periodic_table/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/station/medical/pharmacy) "hja" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) -"hjf" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/item/kirbyplants/random, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/auxlab/firing_range) "hjg" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -28952,9 +29359,10 @@ /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay) "hkn" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/turf_decal/delivery, -/obj/machinery/airalarm/directional/south, +/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, /area/station/cargo/miningoffice) "hkt" = ( @@ -28983,36 +29391,16 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/engineering/storage) -"hkQ" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/sign/warning/secure_area/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/medbay) "hkU" = ( /obj/machinery/door/firedoor/heavy, /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/smooth_half{ dir = 1 }, /area/station/science/ordnance/storage) -"hkZ" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/item/radio/intercom/directional/north, -/obj/structure/disposalpipe/trunk, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/command/heads_quarters/rd) "hlj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/holopad, @@ -29066,17 +29454,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/medical/coldroom) -"hlQ" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp, -/obj/machinery/newscaster/directional/east, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/siding/purple{ - dir = 6 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/station/command/heads_quarters/rd) "hlT" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/corner{ @@ -29154,13 +29531,18 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/atmos/storage/gas) -"hmO" = ( +"hmQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /obj/machinery/camera/directional/west{ - c_tag = "Permabrig - Workroom"; - network = list("ss13","prison") + c_tag = "Chapel - Crematorium"; + name = "chapel camera"; + network = list("ss13","chapel") }, -/turf/open/floor/iron, -/area/station/security/prison/work) +/obj/structure/sign/warning/no_smoking/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) "hmS" = ( /obj/structure/cable, /obj/structure/table/reinforced, @@ -29281,25 +29663,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/cargo/storage) -"hoe" = ( -/obj/structure/sign/poster/official/report_crimes/directional/north, -/obj/machinery/vending/wardrobe/det_wardrobe, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/detectives_office) "hoh" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 }, /turf/open/floor/iron/white, /area/station/medical/medbay) -"hol" = ( -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) "hom" = ( /obj/structure/closet/secure_closet/personal/patient, /obj/effect/turf_decal/bot, @@ -29314,12 +29683,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/medical/cryo) -"hoz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/tile/brown, -/turf/open/floor/iron, -/area/station/cargo/warehouse) "hoC" = ( /turf/closed/wall, /area/station/cargo/office) @@ -29399,17 +29762,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) -"hpG" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/airalarm/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/command/teleporter) "hpN" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/corner{ @@ -29418,13 +29770,6 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron, /area/station/security/execution/transfer) -"hqj" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/light_switch/directional/north{ - pixel_x = -8 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) "hqt" = ( /obj/effect/spawner/random/structure/chair_flipped, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -29520,14 +29865,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/department/science) -"hrY" = ( -/obj/item/flashlight/lamp, -/obj/machinery/airalarm/directional/east, -/obj/structure/table/wood, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/tcommsat/computer) "hsg" = ( /obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 4 @@ -29590,12 +29927,6 @@ dir = 4 }, /area/station/science/lobby) -"hsU" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/closet/crate/silvercrate, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) "htg" = ( /obj/structure/cable, /obj/machinery/power/port_gen/pacman/pre_loaded, @@ -29658,6 +29989,18 @@ /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, /turf/open/floor/iron, /area/station/maintenance/port/fore) +"htK" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=4"; + location = "QM #1" + }, +/obj/effect/turf_decal/delivery, +/mob/living/simple_animal/bot/mulebot{ + home_destination = "QM #3"; + suffix = "#3" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "htQ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -29726,7 +30069,7 @@ /turf/open/floor/iron/dark, /area/station/security/warden) "huR" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) @@ -29735,6 +30078,7 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /obj/effect/mapping_helpers/burnt_floor, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron, /area/station/maintenance/department/electrical) "huX" = ( @@ -29756,6 +30100,26 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) +"hvf" = ( +/obj/machinery/duct, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"hvl" = ( +/obj/machinery/newscaster/directional/east, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/structure/sign/warning/cold_temp/directional/south, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron, +/area/station/science/xenobiology) "hvm" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -29796,6 +30160,11 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/dark/smooth_large, /area/station/security/interrogation) +"hvD" = ( +/obj/structure/chair/stool/bar/directional/north, +/obj/structure/sign/poster/contraband/random/directional/west, +/turf/open/floor/iron/grimy, +/area/station/service/abandoned_gambling_den) "hvJ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29803,27 +30172,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/medical/virology) -"hvT" = ( -/obj/structure/bed, -/obj/item/bedsheet/orange, -/obj/machinery/camera/directional/east{ - c_tag = "Permabrig - Cell 5"; - network = list("ss13","prison") - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/status_display/ai/directional/north, -/obj/structure/sign/poster/official/obey/directional/east, -/turf/open/floor/plating, -/area/station/security/prison/safe) -"hvX" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/filingcabinet/chestdrawer, -/turf/open/floor/iron/dark/smooth_large, -/area/station/medical/morgue) "hwa" = ( /obj/structure/chair{ dir = 1 @@ -29858,13 +30206,6 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron, /area/station/security/execution/transfer) -"hwu" = ( -/obj/structure/cable, -/obj/machinery/light/small/directional/south, -/obj/effect/spawner/random/structure/crate, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/station/maintenance/port/fore) "hww" = ( /mob/living/basic/cockroach, /turf/open/floor/wood, @@ -29898,19 +30239,6 @@ }, /turf/open/floor/iron, /area/station/commons/storage/tools) -"hwG" = ( -/obj/machinery/door/window/brigdoor/left/directional/north{ - name = "Secure Morgue Trays"; - req_access = list("morgue_secure") - }, -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "hwK" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -29940,13 +30268,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/command/heads_quarters/rd) -"hwT" = ( -/obj/effect/turf_decal/trimline/neutral/warning, -/obj/effect/landmark/start/coroner, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "hwX" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -29979,6 +30300,11 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron, /area/station/engineering/atmos/project) +"hxk" = ( +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron, +/area/station/engineering/atmos/project) "hxl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -30014,24 +30340,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/department/security) -"hyg" = ( -/obj/item/stack/sheet/plasteel{ - amount = 15 - }, -/obj/item/wrench, -/obj/item/clothing/glasses/welding, -/obj/machinery/firealarm/directional/west, -/obj/structure/table, -/turf/open/floor/iron, -/area/station/science/robotics/lab) -"hyj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "hys" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 @@ -30054,43 +30362,18 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"hyT" = ( -/obj/machinery/light/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Central Hallway - Center Starboard"; - name = "hallway camera" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"hyU" = ( -/obj/machinery/vending/wardrobe/chap_wardrobe, -/obj/machinery/light_switch/directional/south, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) "hza" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"hzh" = ( -/obj/structure/table/wood, -/obj/item/assembly/igniter, -/obj/item/assembly/igniter, -/obj/item/assembly/timer{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/machinery/light/small/directional/east, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/iron/dark, -/area/station/service/abandoned_gambling_den) +"hzi" = ( +/obj/structure/railing/corner, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/service/hydroponics) "hzj" = ( /obj/machinery/camera/directional/east{ c_tag = "Xenobiology - Secure Cell Exterior"; @@ -30100,12 +30383,19 @@ /turf/open/floor/glass/reinforced, /area/station/maintenance/department/science/xenobiology) "hzs" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"hzx" = ( +/obj/machinery/firealarm/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "hzA" = ( /obj/item/kirbyplants/random, /obj/machinery/power/apc/auto_name/directional/north, @@ -30181,11 +30471,6 @@ /obj/effect/turf_decal/stripes/box, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"hAN" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) "hAU" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -30216,6 +30501,10 @@ }, /turf/open/floor/iron, /area/station/science/xenobiology) +"hBq" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "hBu" = ( /obj/docking_port/stationary/random{ dir = 4; @@ -30305,13 +30594,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/iron, /area/station/engineering/supermatter/room) -"hCM" = ( -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/machinery/disposal/bin, -/turf/open/floor/wood, -/area/station/service/lawoffice) "hCX" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/mess, @@ -30361,6 +30643,16 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/general, /turf/open/floor/iron, /area/station/cargo/storage) +"hDP" = ( +/obj/structure/cable, +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/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/supply) "hDT" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -30389,11 +30681,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/cargo/storage) -"hEa" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) "hEr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -30413,6 +30700,26 @@ /obj/item/taperecorder, /turf/open/floor/iron/grimy, /area/station/command/bridge) +"hEL" = ( +/obj/structure/cable, +/obj/machinery/requests_console/directional/west{ + department = "Chief Engineer's Desk"; + name = "Chief Engineer's Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/machinery/camera/directional/west{ + c_tag = "Engineering - Chief Engineer's Office"; + name = "engineering camera" + }, +/obj/machinery/computer/apc_control{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "hEQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -30421,17 +30728,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/abandoned_gambling_den/gaming) -"hES" = ( -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "xeno7"; - name = "Containment Control"; - req_access = list("xenobiology") - }, -/obj/machinery/light/directional/south, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/iron, -/area/station/science/xenobiology) "hFf" = ( /obj/machinery/firealarm/directional/west, /obj/item/kirbyplants/random, @@ -30447,16 +30743,6 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron, /area/station/commons/lounge) -"hFl" = ( -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "hFs" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -30496,15 +30782,6 @@ /obj/effect/mapping_helpers/airlock/access/all/service/kitchen, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) -"hFQ" = ( -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 1 - }, -/obj/machinery/duct, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "hFS" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -30532,12 +30809,16 @@ }, /turf/open/floor/iron, /area/station/engineering/main) -"hGg" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/light/directional/south, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) +"hGo" = ( +/obj/machinery/firealarm/directional/west, +/obj/structure/cable, +/obj/item/kirbyplants/random, +/obj/machinery/duct, +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) "hGt" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -30553,14 +30834,6 @@ }, /turf/open/floor/plating, /area/station/science/robotics/lab) -"hGB" = ( -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/effect/turf_decal/box/red, -/obj/structure/sign/poster/official/help_others/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) "hGE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -30602,17 +30875,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) -"hHf" = ( -/obj/item/radio/intercom/directional/north, -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/science/explab) "hHi" = ( /obj/structure/closet/crate/hydroponics, /obj/item/paper/guides/jobs/hydroponics, @@ -30670,10 +30932,6 @@ icon_state = "foam_plating" }, /area/station/maintenance/department/science/xenobiology) -"hHG" = ( -/obj/machinery/telecomms/receiver/preset_left, -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/station/tcommsat/server) "hHJ" = ( /obj/effect/turf_decal/stripes/white/line, /obj/effect/decal/cleanable/dirt, @@ -30717,6 +30975,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) +"hIh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "hIo" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -30766,17 +31029,6 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) -"hIK" = ( -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/electrical, -/obj/machinery/light/directional/west, -/obj/item/clothing/gloves/color/yellow, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/main) "hIP" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -30788,6 +31040,11 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"hIQ" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "hIU" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -30810,6 +31067,19 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/storage/tools) +"hJn" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/obj/item/stack/medical/gauze, +/obj/item/stack/medical/suture, +/obj/machinery/camera/directional/north{ + c_tag = "Medbay - Treatment Center"; + name = "medbay camera"; + network = list("ss13","medbay") + }, +/obj/structure/table/reinforced/rglass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron, +/area/station/medical/treatment_center) "hJo" = ( /obj/structure/table/wood, /obj/item/folder/white{ @@ -30862,11 +31132,6 @@ /obj/effect/landmark/start/bartender, /turf/open/floor/iron/grimy, /area/station/service/bar/backroom) -"hKC" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "hKE" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -30899,6 +31164,15 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/command/teleporter) +"hKO" = ( +/obj/item/kirbyplants/random, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/virology) "hKZ" = ( /obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/bot, @@ -30958,6 +31232,21 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) +"hMa" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/mechanical, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/glasses/welding, +/obj/effect/turf_decal/siding/purple{ + dir = 8 + }, +/obj/machinery/newscaster/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/science/lab) "hMd" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -30971,16 +31260,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hos) -"hMn" = ( -/obj/machinery/mineral/stacking_unit_console{ - pixel_x = 32 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/disposal) "hMx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -31144,17 +31423,6 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron, /area/station/engineering/main) -"hOZ" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/structure/sign/calendar/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/locker) "hPc" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/binary/valve/digital, @@ -31286,6 +31554,14 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/white, /area/station/medical/virology) +"hQs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/firealarm/directional/south, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/cargo/storage) "hQu" = ( /obj/machinery/duct, /obj/effect/decal/cleanable/dirt, @@ -31334,15 +31610,6 @@ /obj/structure/reflector/box, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"hQQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/light/small/directional/east, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plating, -/area/station/maintenance/port) "hQV" = ( /obj/effect/turf_decal/plaque{ icon_state = "L13" @@ -31500,11 +31767,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/grimy, /area/station/service/abandoned_gambling_den) -"hSM" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "hST" = ( /obj/structure/destructible/cult/item_dispenser/archives/library, /obj/effect/decal/cleanable/cobweb, @@ -31512,6 +31774,14 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating, /area/station/service/library/abandoned) +"hTg" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/light_switch/directional/north{ + pixel_x = -8 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) "hTi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -31590,6 +31860,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos) +"hUh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/structure/chair/office{ + dir = 1 + }, +/obj/structure/sign/poster/random/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/service) "hUm" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -31674,15 +31956,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"hVm" = ( -/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/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) "hVt" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/east, @@ -31735,6 +32008,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/space, /area/space/nearstation) +"hVI" = ( +/obj/structure/table, +/obj/item/plant_analyzer, +/obj/item/hatchet, +/obj/item/cultivator, +/obj/item/shovel/spade, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden) "hVV" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -31791,21 +32073,6 @@ }, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"hXd" = ( -/obj/structure/rack, -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/toolbox/emergency{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/storage/toolbox/emergency, -/obj/item/shovel, -/obj/item/shovel, -/obj/item/pickaxe, -/obj/item/pickaxe, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "hXf" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -31980,6 +32247,22 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/abandoned_gambling_den) +"hYT" = ( +/obj/item/radio/intercom/directional/east, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line, +/obj/structure/tank_holder/extinguisher{ + pixel_y = 8 + }, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) +"hZb" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "hZl" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/morgue{ @@ -32033,13 +32316,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/chapel) -"hZC" = ( -/obj/structure/table/wood, -/obj/item/storage/briefcase, -/obj/structure/sign/poster/official/help_others/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) "hZT" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/corner{ @@ -32129,24 +32405,6 @@ /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/freezerchamber) -"iaN" = ( -/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 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"iaP" = ( -/obj/structure/rack, -/obj/machinery/light/small/directional/south, -/obj/item/storage/toolbox/emergency, -/obj/item/wrench, -/obj/machinery/status_display/ai/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "iaS" = ( /obj/effect/turf_decal/arrows/white{ dir = 4 @@ -32154,6 +32412,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) +"iaT" = ( +/obj/structure/rack, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/spawner/random/armory/bulletproof_armor, +/obj/effect/spawner/random/armory/bulletproof_helmet, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "iaY" = ( /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 4 @@ -32205,6 +32472,25 @@ /obj/machinery/air_sensor/ordnance_freezer_chamber, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/freezerchamber) +"ibL" = ( +/obj/structure/rack, +/obj/effect/decal/cleanable/dirt, +/obj/item/book/manual/wiki/atmospherics{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/book/manual/wiki/tcomms{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/book/manual/wiki/engineering_guide{ + pixel_x = 3 + }, +/obj/item/book/manual/wiki/engineering_construction{ + pixel_x = -3 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) "ibM" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 5 @@ -32228,15 +32514,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/commons/toilet/locker) -"ibS" = ( -/obj/structure/dresser, -/obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom/directional/north, -/obj/item/flashlight/seclite{ - pixel_y = 8 - }, -/turf/open/floor/wood, -/area/station/commons/dorms) "icb" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -32259,22 +32536,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/service/electronic_marketing_den) -"ick" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants/random, -/turf/open/floor/wood, -/area/station/service/library/abandoned) -"icn" = ( -/obj/effect/landmark/start/hangover, -/obj/structure/chair/sofa/right/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/commons/lounge) "ico" = ( /obj/structure/table, /obj/item/storage/medkit/regular, @@ -32310,6 +32571,13 @@ }, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) +"icA" = ( +/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/machinery/holopad/secure, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) "icD" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -32368,29 +32636,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/cargo/storage) -"icN" = ( -/obj/machinery/light/directional/north, -/obj/machinery/light_switch/directional/north{ - pixel_x = -8 - }, -/obj/machinery/button/door{ - id = "rdordnance"; - name = "Ordnance Containment Control"; - pixel_x = 8; - pixel_y = 26; - req_access = list("science") - }, -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Science - Ordnance Lab Access"; - name = "science camera"; - network = list("ss13","rd") - }, -/turf/open/floor/iron/white, -/area/station/science/ordnance/office) "icS" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, @@ -32421,14 +32666,6 @@ /obj/effect/turf_decal/siding/dark_red, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/hos) -"idd" = ( -/obj/effect/spawner/random/vending/colavend, -/obj/effect/turf_decal/bot, -/obj/machinery/status_display/ai/directional/west, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) "idj" = ( /obj/machinery/door/airlock/public/glass{ name = "Library Access" @@ -32453,20 +32690,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"idm" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 4 - }, -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) "idp" = ( /obj/structure/cable, /obj/structure/table, @@ -32505,12 +32728,6 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"idF" = ( -/obj/structure/sign/warning/secure_area/directional/west, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "idM" = ( /obj/machinery/shieldgen, /obj/effect/turf_decal/bot_red, @@ -32578,15 +32795,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/bridge) -"ieH" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "ieI" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -32610,14 +32818,6 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/port) -"ieT" = ( -/obj/machinery/newscaster/directional/west, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) "ieW" = ( /obj/structure/table/reinforced, /obj/item/stack/sheet/iron/fifty, @@ -32630,13 +32830,6 @@ }, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"ife" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/light/small/directional/west, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) "iff" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, @@ -32655,6 +32848,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/medical/virology) +"ifj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/directional/north{ + c_tag = "Service - Cafeteria Fore"; + name = "service camera" + }, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/cafeteria, +/area/station/service/cafeteria) "ifk" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/vending/cigarette, @@ -32682,14 +32887,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/chapel) -"ifC" = ( -/obj/item/kirbyplants/random, -/obj/machinery/status_display/ai/directional/east, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "ifR" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -32716,13 +32913,6 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) -"igd" = ( -/obj/structure/sign/poster/contraband/kudzu/directional/west, -/obj/machinery/light/directional/west, -/obj/structure/table, -/obj/machinery/reagentgrinder, -/turf/open/floor/iron/checker, -/area/station/service/hydroponics) "igg" = ( /turf/closed/wall, /area/station/science/explab) @@ -32756,12 +32946,6 @@ /obj/item/stack/rods/fifty, /turf/open/floor/plating, /area/station/maintenance/department/eva/abandoned) -"igN" = ( -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/chapel{ - dir = 5 - }, -/area/station/service/chapel) "iho" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -32824,18 +33008,15 @@ /turf/open/floor/plating, /area/station/medical/virology) "iio" = ( -/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 + 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/cable, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"iiu" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) "iiy" = ( /obj/structure/easel, /turf/open/floor/iron, @@ -32872,17 +33053,36 @@ /obj/effect/turf_decal/siding/dark_red, /turf/open/floor/iron/dark, /area/station/security/execution/transfer) -"iiW" = ( -/obj/structure/mirror/directional/west, -/obj/structure/sink/directional/east, -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 10 +"iiU" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/monkeycubes{ + pixel_x = 6; + pixel_y = 4 }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 +/obj/item/storage/pill_bottle/mutadone{ + pixel_x = -8; + pixel_y = 9 }, -/area/station/medical/morgue) +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -10; + pixel_y = -1 + }, +/obj/item/storage/box/monkeycubes{ + pixel_x = 4 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Science - Genetics"; + dir = 6; + name = "science camera"; + network = list("ss13","rd") + }, +/obj/machinery/status_display/evac/directional/east, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/science/genetics) "ijm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -32945,14 +33145,6 @@ /obj/item/storage/wallet/random, /turf/open/floor/wood, /area/station/maintenance/port/fore) -"ijK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "ijP" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/half/contrasted, @@ -32969,13 +33161,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/maintenance/port) -"ikh" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/station/engineering/supermatter/room) "ikx" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -32985,17 +33170,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"iky" = ( -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron, -/area/station/engineering/hallway) -"ikC" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/closet/crate/goldcrate, -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) "ikD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ @@ -33080,14 +33254,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"ilo" = ( -/obj/machinery/light/directional/south, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "ilq" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -33138,13 +33304,17 @@ }, /turf/open/floor/iron, /area/station/commons/storage/primary) -"ilU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/wood, -/obj/effect/spawner/random/maintenance, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/iron/dark, -/area/station/service/abandoned_gambling_den) +"ilR" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/hallway/secondary/entry) "ilX" = ( /obj/structure/rack, /obj/item/analyzer{ @@ -33170,13 +33340,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/engine, /area/station/science/explab) -"ims" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white, -/area/station/science/research) "imw" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance/two, @@ -33270,6 +33433,14 @@ /obj/structure/sign/warning/no_smoking, /turf/closed/wall, /area/station/service/kitchen/abandoned) +"inl" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/decal/cleanable/dirt, +/obj/structure/noticeboard/directional/south, +/obj/effect/turf_decal/bot, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/engineering/storage) "inm" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/engineering/atmospherics_portable, @@ -33419,13 +33590,6 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) -"ipC" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/sign/poster/ripped/directional/north, -/turf/open/floor/iron/grimy, -/area/station/maintenance/port/fore) "ipQ" = ( /turf/closed/wall, /area/station/command/bridge) @@ -33438,19 +33602,11 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"iqd" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) "iqg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/full, +/obj/machinery/holopad, +/turf/open/floor/iron/dark/smooth_large, /area/station/science/ordnance) "iqj" = ( /obj/effect/turf_decal/trimline/purple/filled/warning, @@ -33470,6 +33626,29 @@ }, /turf/open/floor/iron, /area/station/commons/toilet/locker) +"iqz" = ( +/obj/structure/table/reinforced, +/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/crowbar, +/obj/item/grenade/chem_grenade/smart_metal_foam, +/obj/item/grenade/chem_grenade/smart_metal_foam, +/obj/structure/sign/poster/official/report_crimes/directional/north, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/engineering/storage) +"iqT" = ( +/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/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/service) "irl" = ( /turf/closed/wall/r_wall, /area/station/service/lawoffice) @@ -33533,6 +33712,21 @@ }, /turf/open/floor/iron, /area/station/medical/treatment_center) +"irF" = ( +/obj/structure/table, +/obj/item/paper{ + pixel_x = 6; + pixel_y = 3 + }, +/obj/item/radio{ + pixel_y = 4 + }, +/obj/machinery/computer/security/telescreen/entertainment/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "irJ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -33585,6 +33779,13 @@ dir = 1 }, /area/station/medical/medbay/lobby) +"iss" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/service/bar) "isy" = ( /obj/structure/chair/office{ dir = 4 @@ -33639,7 +33840,6 @@ "itC" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/generic_maintenance_landmark, /obj/effect/mapping_helpers/broken_floor, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -33783,6 +33983,13 @@ }, /turf/open/floor/plating, /area/station/science/lab) +"ivb" = ( +/obj/machinery/firealarm/directional/south, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/service/chapel/funeral) "ivg" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ dir = 1 @@ -33808,6 +34015,25 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/cargo/storage) +"ivu" = ( +/obj/structure/table/wood, +/obj/item/radio/intercom/directional/east, +/obj/item/storage/fancy/donut_box, +/obj/machinery/button/door/directional/north{ + id = "paramed_dispatch"; + name = "Privacy Shutters"; + pixel_x = 6; + req_access = list("medical") + }, +/obj/machinery/light_switch/directional/north{ + pixel_x = -8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/paramedic) "ivz" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/west, @@ -33819,6 +34045,12 @@ "ivA" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/captain/private) +"ivG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "ivH" = ( /obj/machinery/light/small/directional/south, /obj/structure/sign/warning/radiation/directional/south, @@ -33856,15 +34088,19 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"iwi" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/vending/cigarette, -/obj/structure/sign/nanotrasen{ - pixel_x = -32 +"iwn" = ( +/obj/item/radio/intercom/directional/north, +/obj/item/kirbyplants/random, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/directional/north{ + c_tag = "Engineering - Hallway"; + name = "engineering camera" }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/central/fore) +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/hallway) "iwp" = ( /obj/machinery/computer/operating{ dir = 1 @@ -33879,14 +34115,6 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"iwL" = ( -/obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/west, -/obj/effect/mapping_helpers/burnt_floor, -/obj/structure/sign/poster/contraband/ambrosia_vulgaris/directional/west, -/turf/open/floor/plating, -/area/station/security/prison/garden) "iwW" = ( /obj/structure/sign/painting/library{ pixel_y = -32 @@ -33898,87 +34126,6 @@ /obj/item/clothing/under/rank/civilian/lawyer/beige/skirt, /turf/open/floor/wood, /area/station/commons/dorms) -"iwY" = ( -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = 3 - }, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = 3 - }, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = 3 - }, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = 3 - }, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = 3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/head/utility/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/item/clothing/head/utility/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/item/clothing/head/utility/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/item/clothing/head/utility/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/item/clothing/head/utility/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/structure/closet/crate/internals, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "ixg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/broken_floor, @@ -34044,10 +34191,16 @@ "ixR" = ( /obj/structure/cable, /obj/structure/table/wood, -/obj/item/taperecorder, -/obj/item/restraints/handcuffs, +/obj/item/taperecorder{ + pixel_x = 6; + pixel_y = 5 + }, /obj/machinery/power/apc/auto_name/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/toy/figure/detective{ + pixel_x = -10; + pixel_y = 3 + }, /turf/open/floor/iron/dark, /area/station/security/detectives_office) "ixZ" = ( @@ -34057,13 +34210,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/cargo/sorting) -"iyb" = ( -/obj/effect/turf_decal/trimline/neutral/warning, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "iyc" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/blue/filled, @@ -34121,14 +34267,12 @@ /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) "izj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt/dust, /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/purple{ - dir = 4 - }, -/turf/open/floor/iron, +/turf/open/floor/iron/herringbone, /area/station/cargo/miningoffice) "izo" = ( /obj/structure/table/wood, @@ -34171,21 +34315,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/command/heads_quarters/hos) -"izE" = ( -/obj/structure/rack, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/effect/turf_decal/bot, -/obj/structure/sign/poster/contraband/free_drone/directional/south, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, -/turf/open/floor/iron/dark, -/area/station/maintenance/port) -"izG" = ( -/obj/machinery/light/small/directional/north, -/obj/item/kirbyplants/random, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/wood, -/area/station/service/electronic_marketing_den) "izM" = ( /obj/structure/closet/crate/trashcart/laundry, /obj/effect/spawner/random/contraband/prison, @@ -34273,6 +34402,17 @@ /obj/item/hand_labeler, /turf/open/floor/iron, /area/station/commons/storage/primary) +"iAL" = ( +/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, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 6 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay) "iAM" = ( /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted, @@ -34301,15 +34441,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/science) -"iBu" = ( -/obj/effect/turf_decal/trimline/neutral/warning, -/obj/effect/turf_decal/trimline/neutral/mid_joiner, -/obj/structure/sign/warning/no_smoking/directional/west, -/obj/structure/table/reinforced, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/iron/fifty, -/turf/open/floor/iron/dark/textured_half, -/area/station/science/robotics/lab) "iBx" = ( /obj/effect/spawner/random/structure/closet_private, /obj/structure/extinguisher_cabinet/directional/east, @@ -34324,6 +34455,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/port/aft) +"iBG" = ( +/obj/structure/sign/poster/official/help_others/directional/east, +/obj/structure/closet/secure_closet/psychology, +/obj/item/toy/plush/beeplushie{ + desc = "Maybe hugging this will make you feel better about yourself."; + name = "Therabee" + }, +/turf/open/floor/wood, +/area/station/medical/psychology) "iBO" = ( /obj/machinery/power/turbine/inlet_compressor, /turf/open/floor/engine, @@ -34420,6 +34560,20 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) +"iCT" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Medbay - Morgue"; + name = "medical camera"; + network = list("ss13","medical") + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "iDc" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -34436,6 +34590,18 @@ "iDq" = ( /turf/closed/wall/r_wall, /area/station/security/range) +"iDw" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Central Hallway - Center Starboard"; + name = "hallway camera" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) "iDC" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -34443,12 +34609,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/security/prison/toilet) -"iDG" = ( -/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/bridge) "iDP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -34457,11 +34617,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"iDQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/plating, -/area/station/service/theater/abandoned) "iDS" = ( /obj/machinery/computer/department_orders/engineering{ dir = 1 @@ -34471,6 +34626,15 @@ }, /turf/open/floor/iron, /area/station/engineering/storage_shared) +"iEa" = ( +/obj/structure/table/wood, +/obj/item/clothing/under/costume/maid, +/obj/item/clothing/head/costume/kitty, +/obj/structure/sign/poster/official/report_crimes/directional/north, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/wood, +/area/station/service/theater/abandoned) "iEe" = ( /obj/effect/turf_decal/siding/yellow, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -34592,24 +34756,23 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/secondary/exit) -"iFu" = ( -/obj/machinery/door/window{ - dir = 4; - name = "Mass Driver"; - req_access = list("chapel_office") - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) "iFD" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/wood, /obj/item/book/manual/wiki/engineering_hacking, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) +"iFG" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Central Hallway - Fore"; + name = "hallway camera" + }, +/obj/effect/turf_decal/plaque{ + icon_state = "L12" + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "iFI" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -34649,13 +34812,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"iGe" = ( -/obj/structure/table/glass, -/obj/item/food/pizzaslice/vegetable, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/official/bless_this_spess/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/space_hut/observatory) "iGm" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -34694,11 +34850,10 @@ /turf/open/floor/iron/dark, /area/station/security/execution/education) "iGB" = ( -/obj/machinery/vending/engivend, -/obj/effect/turf_decal/delivery, -/obj/structure/sign/poster/official/moth_hardhat/directional/east, -/turf/open/floor/iron, -/area/station/engineering/main) +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "iGI" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/maintenance_hatch{ @@ -34750,6 +34905,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/holding_cell) +"iHq" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/dark/textured_half{ + dir = 1 + }, +/area/station/medical/morgue) "iHy" = ( /obj/machinery/computer/crew{ dir = 8 @@ -34782,34 +34950,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/medical/chemistry) -"iIe" = ( -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/mid_joiner{ - dir = 8 - }, -/obj/structure/bed/roller, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/security/medical) "iIg" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"iIj" = ( -/obj/machinery/light/directional/south, -/obj/machinery/newscaster/directional/south, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) "iIk" = ( /obj/effect/decal/cleanable/blood/old, /obj/structure/cable, @@ -34865,6 +35011,19 @@ /obj/effect/spawner/random/trash/mess, /turf/open/floor/iron/white/side, /area/station/service/kitchen/abandoned) +"iJk" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/safety_internals/directional/north, +/obj/machinery/light/small/directional/north, +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/engineering/atmos/pumproom) "iJr" = ( /obj/structure/chair/office, /obj/effect/landmark/start/cargo_technician, @@ -34896,6 +35055,12 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron/dark, /area/station/medical/chemistry) +"iJJ" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/structure/sign/poster/official/report_crimes/directional/north, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "iJT" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -35062,11 +35227,6 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/dark, /area/station/command/bridge) -"iMp" = ( -/obj/structure/cable, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/white, -/area/station/science/lobby) "iME" = ( /obj/machinery/camera/directional/south{ c_tag = "Atmospherics - Mix Cell"; @@ -35093,7 +35253,7 @@ /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "iML" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, /turf/closed/wall/r_wall, /area/station/science/ordnance/burnchamber) "iMO" = ( @@ -35106,13 +35266,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/locker) -"iMU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/engineering/main) "iMV" = ( /obj/item/chair/stool/bar{ pixel_y = -8 @@ -35126,16 +35279,6 @@ }, /turf/open/floor/iron, /area/station/service/kitchen/abandoned) -"iNf" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Security - Visitation" - }, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/prison/visit) "iNg" = ( /obj/effect/landmark/start/hangover/closet, /obj/structure/closet/emcloset, @@ -35216,6 +35359,14 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) +"iNY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "iOc" = ( /turf/closed/wall, /area/station/security/prison/toilet) @@ -35256,17 +35407,21 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) -"iOX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash/mess, -/obj/effect/spawner/random/trash/graffiti, -/turf/open/floor/iron, -/area/station/medical/abandoned) "iPb" = ( /obj/structure/table, /obj/item/storage/box/tail_pin, /turf/open/floor/carpet/black, /area/station/maintenance/port) +"iPc" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/service/hydroponics) "iPe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -35276,13 +35431,17 @@ }, /turf/open/floor/iron, /area/station/engineering/lobby) -"iPi" = ( -/obj/effect/spawner/random/vending/snackvend, -/obj/machinery/light/directional/west, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) +"iPH" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/newscaster/directional/east, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/engineering/lobby) "iPJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -35298,12 +35457,6 @@ }, /turf/open/floor/iron, /area/station/security/prison/safe) -"iPM" = ( -/obj/effect/spawner/random/structure/tank_holder, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/maintenance/department/science/xenobiology) "iPR" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/west, @@ -35340,6 +35493,14 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/maintenance/port) +"iQR" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 9 + }, +/turf/open/floor/iron/dark/textured_half{ + dir = 1 + }, +/area/station/medical/morgue) "iQV" = ( /obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ dir = 8; @@ -35395,19 +35556,13 @@ dir = 1 }, /area/station/service/kitchen) -"iRu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/rack, -/obj/item/weldingtool, -/obj/item/wrench, -/obj/item/clothing/head/utility/welding, -/obj/item/clothing/gloves/color/yellow, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ +"iRt" = ( +/obj/effect/turf_decal/tile/purple{ dir = 8 }, -/turf/open/floor/iron/dark, -/area/station/engineering/supermatter/room) +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "iRx" = ( /obj/structure/cable, /obj/machinery/door/poddoor/shutters/radiation/preopen{ @@ -35567,6 +35722,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/medical/coldroom) +"iTW" = ( +/obj/structure/closet/emcloset, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port) "iUg" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -35595,15 +35755,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) -"iUG" = ( -/obj/structure/bed, -/obj/item/bedsheet/rd, -/obj/machinery/status_display/ai/directional/north, -/obj/effect/turf_decal/siding/purple, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/station/command/heads_quarters/rd) "iUJ" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/circuit, @@ -35614,15 +35765,6 @@ /obj/item/assembly/flash/handheld, /turf/open/floor/iron, /area/station/science/research/abandoned) -"iUO" = ( -/obj/structure/table/wood, -/obj/machinery/computer/libraryconsole{ - dir = 1 - }, -/obj/machinery/newscaster/directional/south, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, -/area/station/service/library/private) "iVb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -35672,6 +35814,64 @@ /obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible, /turf/open/floor/iron, /area/station/engineering/atmos) +"iVA" = ( +/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 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"iVG" = ( +/obj/machinery/space_heater, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/iron, +/area/station/maintenance/department/chapel) +"iVH" = ( +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "xeno6"; + name = "Containment Control"; + req_access = list("xenobiology") + }, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/iron, +/area/station/science/xenobiology) +"iVT" = ( +/obj/machinery/photocopier, +/obj/structure/sign/poster/official/work_for_a_future/directional/east, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) +"iVU" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured_half{ + dir = 1 + }, +/area/station/medical/morgue) +"iVV" = ( +/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 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Engineering - Foyer"; + name = "engineering camera" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/engineering/lobby) "iWc" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -35685,6 +35885,19 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay) +"iWj" = ( +/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, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos) "iWk" = ( /obj/structure/cable, /obj/machinery/door/firedoor, @@ -35788,11 +36001,12 @@ /turf/open/floor/iron, /area/station/engineering/lobby) "iXd" = ( -/obj/effect/landmark/start/shaft_miner, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/shaft_miner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/miningoffice) "iXj" = ( @@ -35938,6 +36152,15 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/engineering/atmos) +"iYJ" = ( +/obj/structure/table/wood, +/obj/item/camera, +/obj/structure/sign/nanotrasen{ + pixel_y = -32 + }, +/obj/item/hand_labeler, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) "iYS" = ( /obj/structure/cable, /obj/machinery/light/small/directional/east, @@ -36017,13 +36240,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/electronic_marketing_den) -"iZR" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen, -/obj/structure/sign/poster/official/report_crimes/directional/north, -/turf/open/floor/carpet/blue, -/area/station/commons/vacant_room/office) "iZU" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -36064,14 +36280,14 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/command/teleporter) -"jau" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/south, -/obj/structure/noticeboard/directional/south, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/engineering/storage) +"jat" = ( +/obj/structure/frame/computer{ + dir = 4 + }, +/obj/item/circuitboard/computer/secure_data, +/obj/machinery/light/small/broken/directional/west, +/turf/open/floor/iron/grimy, +/area/station/security/detectives_office/private_investigators_office) "jay" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable/layer3, @@ -36085,24 +36301,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/chapel) -"jaA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"jaF" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/plaque{ - icon_state = "L4" - }, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "jaI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -36219,9 +36417,12 @@ /obj/structure/rack, /obj/item/storage/briefcase{ pixel_x = -3; - pixel_y = 3 + pixel_y = 1 + }, +/obj/item/storage/secure/briefcase{ + pixel_x = 5; + pixel_y = -3 }, -/obj/item/storage/secure/briefcase, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -36378,6 +36579,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/commons/toilet/restrooms) +"jdf" = ( +/obj/machinery/computer/operating{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/iron/dark, +/area/station/medical/surgery/theatre) "jdg" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -36540,11 +36749,46 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/large, /area/station/security/processing) +"jeZ" = ( +/obj/structure/safe, +/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/item/stack/sheet/mineral/diamond, +/obj/item/stack/spacecash/c1000, +/obj/item/stack/spacecash/c1000, +/obj/item/stack/spacecash/c1000, +/obj/item/stack/spacecash/c1000, +/obj/item/stack/spacecash/c1000, +/obj/item/stack/spacecash/c500, +/obj/item/stack/spacecash/c500, +/obj/item/stack/spacecash/c500, +/obj/item/stack/spacecash/c500, +/obj/item/stack/spacecash/c500, +/obj/item/gun/ballistic/automatic/pistol/deagle, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) "jfn" = ( /obj/machinery/vending/wardrobe/bar_wardrobe, /obj/structure/sign/poster/random/directional/east, /turf/open/floor/iron/checker, /area/station/service/bar/backroom) +"jfo" = ( +/obj/effect/turf_decal/tile/yellow/diagonal_edge, +/obj/effect/turf_decal/tile/red/diagonal_centre, +/obj/structure/sign/poster/official/cleanliness/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Science - Break Room"; + name = "science camera"; + network = list("ss13","rd") + }, +/turf/open/floor/iron/diagonal, +/area/station/science/breakroom) "jfy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -36588,7 +36832,9 @@ /turf/open/floor/plating, /area/station/engineering/atmos/mix) "jfO" = ( -/obj/structure/table, +/obj/structure/closet/wardrobe/miner, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/backpack/satchel/explorer, /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/cargo/miningoffice) @@ -36647,12 +36893,6 @@ }, /turf/open/floor/iron, /area/station/security/prison/garden) -"jgd" = ( -/obj/item/radio/intercom/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/red/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/security/checkpoint/medical/medsci) "jgl" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/grunge{ @@ -36736,13 +36976,6 @@ /obj/effect/landmark/start/scientist, /turf/open/floor/iron/diagonal, /area/station/science/breakroom) -"jhg" = ( -/obj/structure/sign/poster/official/moth_meth/directional/west, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "jhh" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ @@ -36821,17 +37054,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/locker) -"jii" = ( -/obj/machinery/computer/scan_consolenew{ - dir = 4 - }, -/obj/effect/turf_decal/bot/left, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/science/genetics) "jim" = ( /obj/structure/chair/comfy/brown{ buildstackamount = 0; @@ -36858,19 +37080,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"jiP" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/sign/poster/official/work_for_a_future/directional/south, -/obj/machinery/atmospherics/components/tank/air{ - dir = 1 - }, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/siding/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/medical/virology) "jiR" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/corner{ @@ -36887,34 +37096,21 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/abandoned_gambling_den) -"jjc" = ( -/obj/structure/frame/computer{ - dir = 4 - }, -/obj/item/circuitboard/computer/secure_data, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office/private_investigators_office) "jjd" = ( /obj/effect/landmark/atmospheric_sanity/mark_all_station_areas_as_goal, /turf/open/space/basic, /area/space) -"jjo" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/machinery/status_display/evac/directional/west, -/turf/open/floor/iron, -/area/station/engineering/main) -"jjt" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 +"jjm" = ( +/obj/machinery/door/window/brigdoor{ + dir = 1; + name = "Creature Pen"; + req_access = list("research") }, +/obj/structure/cable, +/obj/effect/turf_decal/bot, +/obj/machinery/light/floor, /turf/open/floor/iron, -/area/station/maintenance/department/science/xenobiology) +/area/station/science/xenobiology) "jjw" = ( /obj/machinery/camera/directional/east{ c_tag = "Engineering - Supermatter"; @@ -36942,33 +37138,20 @@ dir = 8 }, /area/station/hallway/primary/port) -"jjH" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/gloves/latex, -/obj/item/surgical_drapes, -/obj/item/clothing/suit/apron/surgical, -/obj/structure/window/reinforced/spawner/directional/north{ - pixel_y = 2 - }, -/obj/item/reagent_containers/spray/cleaner{ - pixel_x = -10; - pixel_y = -4 - }, -/obj/item/clothing/mask/breath/medical, -/turf/open/floor/iron, -/area/station/science/robotics/lab) -"jjR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/newscaster/directional/south, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/paramedic) "jjU" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/maintenance/port/aft) +"jjW" = ( +/obj/machinery/status_display/ai/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/hos) "jjX" = ( /obj/item/storage/medkit/fire, /obj/effect/turf_decal/bot, @@ -36976,6 +37159,13 @@ /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/dark, /area/station/engineering/main) +"jkd" = ( +/obj/item/radio/intercom/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/white, +/area/station/science/research) "jkf" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -37147,14 +37337,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, /area/station/security/evidence) -"jlY" = ( -/obj/effect/turf_decal/stripes/red/line{ - dir = 1 - }, -/obj/structure/sign/warning/secure_area/directional/north, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/textured_large, -/area/station/science/xenobiology) "jlZ" = ( /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/tile/blue/half/contrasted, @@ -37170,14 +37352,6 @@ /obj/machinery/light/small/red/directional/west, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) -"jmd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/turf/closed/wall, -/area/station/maintenance/department/medical/morgue) "jme" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -37243,6 +37417,12 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) +"jmx" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/floor, +/turf/open/floor/engine, +/area/station/science/explab) "jmA" = ( /obj/machinery/newscaster/directional/north, /obj/item/kirbyplants/random, @@ -37454,6 +37634,24 @@ /obj/item/pen, /turf/open/floor/iron/checker, /area/station/hallway/secondary/service) +"jpe" = ( +/obj/machinery/computer/records/security{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hop) +"jpl" = ( +/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) "jpr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -37478,19 +37676,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/genetics) -"jpL" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/requests_console/directional/south{ - department = "Engineering"; - name = "Engineering Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/structure/sign/poster/official/do_not_question/directional/east, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/engineering/main) "jpN" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -37669,6 +37854,12 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/commons/dorms) +"jsa" = ( +/obj/item/storage/box/rxglasses, +/obj/structure/table/reinforced/rglass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron, +/area/station/medical/treatment_center) "jsh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -37677,28 +37868,13 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron, /area/station/engineering/atmos/project) -"jsm" = ( -/obj/machinery/light/directional/south, -/obj/machinery/status_display/supply{ - pixel_y = -32 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Cargo Bay - Aft Starboard"; - name = "cargo camera" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/cargo/storage) -"jss" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/red{ - dir = 1 +"jso" = ( +/obj/structure/sign/poster/random/directional/east, +/obj/structure/chair/comfy/beige{ + dir = 8 }, -/turf/open/floor/iron, -/area/station/security/execution/transfer) +/turf/open/floor/wood/large, +/area/station/service/library/lounge) "jst" = ( /obj/structure/table/wood, /obj/machinery/fax{ @@ -37755,6 +37931,13 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron, /area/station/engineering/atmos/project) +"jtl" = ( +/obj/machinery/recharge_station, +/obj/effect/turf_decal/bot_red, +/obj/machinery/newscaster/directional/west, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/textured, +/area/station/medical/medbay) "jtm" = ( /obj/machinery/conveyor{ dir = 8; @@ -37793,19 +37976,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"jtv" = ( -/obj/structure/reagent_dispensers/plumbed{ - dir = 8; - name = "service water reservoir" - }, -/obj/effect/turf_decal/delivery/white{ - color = "#52B4E9" - }, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/textured, -/area/station/maintenance/port/fore) "jtz" = ( /obj/structure/chair/sofa/bench{ dir = 8 @@ -37871,6 +38041,12 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) +"juM" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor, +/turf/open/floor/engine, +/area/station/science/explab) "juP" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 4 @@ -38036,12 +38212,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"jxz" = ( -/obj/effect/spawner/random/vending/snackvend, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) "jxB" = ( /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, @@ -38052,14 +38222,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"jxM" = ( -/obj/machinery/status_display/ai/directional/south, -/obj/structure/closet/secure_closet/security/sec, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/lockers) "jxQ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, @@ -38069,21 +38231,22 @@ /obj/effect/spawner/random/structure/tank_holder, /turf/open/floor/plating, /area/station/maintenance/department/science) -"jyb" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/table/reinforced, -/obj/item/storage/box/syringes{ - pixel_y = 5 - }, -/obj/item/storage/box/beakers{ - pixel_x = 3; - pixel_y = 3 +"jxZ" = ( +/obj/structure/table/wood, +/obj/machinery/light/small/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/maintenance/two, +/turf/open/floor/iron/dark, +/area/station/service/abandoned_gambling_den) +"jyc" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 }, -/obj/item/storage/box/petridish, -/obj/effect/turf_decal/siding/purple, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/science/xenobiology) +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) "jyp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -38110,39 +38273,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/lobby) -"jyx" = ( -/obj/structure/rack, -/obj/item/clothing/suit/armor/vest{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/suit/armor/vest, -/obj/item/clothing/suit/armor/vest{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/clothing/head/helmet/sec{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/head/helmet/sec, -/obj/item/clothing/head/helmet/sec{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"jyz" = ( -/obj/structure/closet/radiation, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/main) "jyA" = ( /obj/item/kirbyplants/random, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -38212,6 +38342,17 @@ }, /turf/open/floor/iron/textured, /area/station/commons/vacant_room) +"jzi" = ( +/obj/machinery/status_display/supply{ + pixel_y = -32 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Cargo Bay - Aft Starboard"; + name = "cargo camera" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/cargo/storage) "jzp" = ( /obj/machinery/airalarm/directional/north, /turf/open/floor/plating, @@ -38224,34 +38365,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/port/fore) -"jzx" = ( -/obj/structure/sign/directions/science{ - pixel_x = -32 - }, -/obj/structure/sign/directions/medical{ - pixel_x = -32; - pixel_y = -8 - }, -/obj/structure/sign/directions/upload{ - dir = 8; - pixel_x = -32; - pixel_y = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) -"jzC" = ( -/obj/structure/cable, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/supermatter/room) "jzE" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -38294,26 +38407,6 @@ /obj/item/camera, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) -"jzU" = ( -/obj/structure/rack, -/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/machinery/light/directional/south, -/obj/item/multitool, -/obj/effect/turf_decal/bot, -/obj/machinery/computer/security/telescreen/entertainment/directional/south, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "jzW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -38360,14 +38453,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/iron, /area/station/engineering/atmos/storage) -"jAp" = ( -/obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/east, -/obj/item/radio/intercom/directional/east, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/security/prison/garden) "jAI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -38459,20 +38544,10 @@ /turf/open/floor/iron, /area/station/science/lobby) "jBM" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 4 - }, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"jBR" = ( -/obj/structure/cable, -/obj/machinery/modular_computer/console/preset/command, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "jCb" = ( /obj/machinery/computer/records/security{ dir = 8 @@ -38529,6 +38604,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/storage/tech) +"jCm" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) "jCq" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral, @@ -38550,10 +38632,10 @@ /turf/open/floor/wood, /area/station/service/library/abandoned) "jCu" = ( -/obj/machinery/computer/order_console/mining, +/obj/structure/closet/secure_closet/miner, /obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, /obj/machinery/light/directional/north, -/obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/cargo/miningoffice) "jCv" = ( @@ -38612,6 +38694,18 @@ }, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) +"jCY" = ( +/obj/structure/chair/office, +/obj/machinery/newscaster/directional/east, +/obj/effect/turf_decal/siding/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) "jDa" = ( /obj/item/kirbyplants/random, /obj/structure/railing{ @@ -38631,6 +38725,9 @@ "jDd" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/science) +"jDi" = ( +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) "jDk" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -38668,14 +38765,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/security/brig) -"jDG" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/sign/poster/official/report_crimes/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "jDU" = ( /obj/effect/decal/cleanable/blood/old, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -38697,12 +38786,6 @@ /obj/structure/table/wood, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) -"jEg" = ( -/obj/item/kirbyplants/random, -/obj/machinery/light/small/directional/north, -/obj/structure/sign/poster/contraband/arc_slimes/directional/north, -/turf/open/floor/plating, -/area/station/service/abandoned_gambling_den) "jEh" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -38832,19 +38915,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"jFz" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/status_display/evac/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/tank_holder, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) "jFC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -38863,7 +38933,9 @@ /turf/open/floor/iron, /area/station/cargo/office) "jFJ" = ( -/obj/structure/bed, +/obj/structure/bed/medical/anchored{ + dir = 4 + }, /obj/item/bedsheet/medical, /obj/structure/sign/nanotrasen{ pixel_x = 32 @@ -38903,14 +38975,6 @@ }, /turf/closed/wall/r_wall, /area/station/maintenance/port/aft) -"jGw" = ( -/obj/machinery/light/directional/north, -/obj/structure/bookcase{ - name = "Holy Bookcase" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "jGx" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -38921,24 +38985,6 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/space/nearstation) -"jGF" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp, -/turf/open/floor/carpet/red, -/area/station/hallway/secondary/service) -"jGG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/rnd/production/protolathe/department/engineering, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/bot, -/obj/machinery/camera/directional/north{ - c_tag = "Engineering - Shared Storage"; - name = "engineering camera" - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/engineering/storage_shared) "jGI" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible, /obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{ @@ -38985,6 +39031,11 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"jHu" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/maintenance/port/fore) "jHw" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -38998,6 +39049,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) +"jHE" = ( +/obj/effect/landmark/start/hangover, +/obj/structure/chair/sofa/left/brown{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/commons/lounge) "jHH" = ( /obj/machinery/duct, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -39055,14 +39119,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"jIs" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "jIB" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, @@ -39086,7 +39142,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ dir = 1 }, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "jJf" = ( /obj/machinery/duct, @@ -39120,6 +39176,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/library/lounge) +"jJJ" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) "jJM" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -39189,6 +39253,11 @@ dir = 4 }, /area/station/service/kitchen) +"jKE" = ( +/obj/machinery/light_switch/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood, +/area/station/command/meeting_room/council) "jKG" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/blobstart, @@ -39208,24 +39277,26 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/dark/smooth_large, /area/station/science/circuits) -"jKU" = ( -/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, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 6 +"jKQ" = ( +/obj/structure/chair/office/light{ + dir = 8 }, +/obj/machinery/status_display/ai/directional/south, +/obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/white, -/area/station/medical/medbay) +/area/station/command/heads_quarters/cmo) "jKY" = ( -/obj/structure/cable, -/obj/effect/turf_decal/bot, -/obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, +/obj/effect/decal/cleanable/oil/streak, +/obj/machinery/camera/directional/south, +/obj/effect/landmark/bitrunning/station_reward_spawn, +/turf/open/floor/iron/dark/smooth_large, +/area/station/bitrunning/den) "jLa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/railing{ @@ -39373,30 +39444,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/disposal) -"jMq" = ( -/obj/structure/safe, -/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/item/stack/sheet/mineral/diamond, -/obj/item/stack/spacecash/c1000, -/obj/item/stack/spacecash/c1000, -/obj/item/stack/spacecash/c1000, -/obj/item/stack/spacecash/c1000, -/obj/item/stack/spacecash/c1000, -/obj/item/stack/spacecash/c500, -/obj/item/stack/spacecash/c500, -/obj/item/stack/spacecash/c500, -/obj/item/stack/spacecash/c500, -/obj/item/stack/spacecash/c500, -/obj/machinery/light/small/directional/south, -/obj/item/gun/ballistic/automatic/pistol/deagle, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) "jMs" = ( /obj/structure/bookcase/random, /turf/open/floor/iron, @@ -39447,6 +39494,22 @@ }, /turf/open/floor/wood, /area/station/service/library/abandoned) +"jNh" = ( +/obj/effect/turf_decal/siding/white, +/obj/item/radio/intercom/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Departures Lounge - Aft Starboard"; + dir = 6; + name = "departures camera" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/hallway/secondary/exit/departure_lounge) "jNx" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -39491,6 +39554,35 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/checkpoint/customs/fore) +"jNY" = ( +/obj/structure/table/optable, +/obj/machinery/newscaster/directional/north, +/obj/effect/turf_decal/bot_red, +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"jNZ" = ( +/obj/machinery/door/window{ + dir = 4; + name = "Mass Driver"; + req_access = list("chapel_office") + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light/small/red/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"jOe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) "jOo" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/stripes/line{ @@ -39700,16 +39792,17 @@ /obj/effect/landmark/navigate_destination, /turf/open/floor/iron, /area/station/medical/pharmacy) -"jQq" = ( -/obj/structure/closet/l3closet/virology, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/siding/green, -/obj/item/radio/intercom/directional/north, -/obj/machinery/light/cold/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/half/contrasted, +"jQl" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/light/small/directional/east, /turf/open/floor/iron, -/area/station/medical/virology) +/area/station/engineering/atmos/project) +"jQu" = ( +/obj/machinery/newscaster/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/electronic_marketing_den) "jQw" = ( /obj/machinery/telecomms/broadcaster/preset_right, /turf/open/floor/circuit/telecomms/mainframe, @@ -39787,8 +39880,16 @@ /turf/open/floor/iron/white, /area/station/medical/medbay) "jRc" = ( -/obj/machinery/power/apc/auto_name/directional/north, /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/power/apc/auto_name/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "jRg" = ( @@ -39829,10 +39930,10 @@ "jRJ" = ( /obj/machinery/defibrillator_mount/directional/south, /obj/item/radio/intercom/directional/west, -/obj/item/roller{ +/obj/item/emergency_bed{ pixel_y = 6 }, -/obj/item/roller{ +/obj/item/emergency_bed{ pixel_y = 11 }, /obj/structure/table/reinforced/rglass, @@ -39874,12 +39975,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/service/hydroponics/garden) -"jSq" = ( -/obj/machinery/light/directional/east, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "jSw" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -40031,11 +40126,6 @@ "jUx" = ( /turf/open/floor/plating, /area/station/maintenance/department/science) -"jUz" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) "jUC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40047,6 +40137,15 @@ /obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/department/chapel) +"jUM" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable, +/obj/effect/spawner/random/engineering/atmospherics_portable, +/obj/structure/sign/poster/random/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/bar) "jUS" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -40078,13 +40177,6 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"jVE" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/courtroom) "jVI" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -40109,6 +40201,10 @@ }, /turf/open/floor/iron/white, /area/station/science/robotics/lab) +"jVP" = ( +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/service) "jVS" = ( /obj/structure/tank_dispenser, /obj/effect/decal/cleanable/dirt, @@ -40129,27 +40225,6 @@ dir = 1 }, /area/station/service/bar) -"jWe" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/duct, -/turf/open/floor/plating, -/area/station/maintenance/department/security) -"jWq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/north, -/obj/structure/table/reinforced, -/obj/item/storage/box/lights/mixed, -/obj/machinery/airalarm/directional/north, -/obj/item/stock_parts/cell/high/empty, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "jWG" = ( /obj/structure/table, /obj/item/reagent_containers/cup/beaker/large, @@ -40159,27 +40234,21 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"jWI" = ( +/obj/machinery/duct, +/obj/machinery/holopad, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/bot_white{ + color = "#74b2d3" + }, +/obj/effect/turf_decal/siding/thinplating/dark, +/turf/open/floor/iron/dark/smooth_half, +/area/station/medical/morgue) "jWT" = ( /turf/open/floor/engine/n2, /area/station/engineering/atmos) -"jWX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/obj/machinery/airalarm/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Cargo - Warehouse"; - name = "cargo camera" - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"jXk" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "jXn" = ( /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ dir = 4 @@ -40225,6 +40294,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) +"jXK" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "jXN" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /obj/effect/spawner/structure/window/reinforced, @@ -40355,6 +40431,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/bridge) +"jZc" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) "jZf" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -40385,6 +40467,25 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron, /area/station/commons/vacant_room) +"jZs" = ( +/obj/structure/sign/directions/science{ + pixel_x = -32 + }, +/obj/structure/sign/directions/medical{ + pixel_x = -32; + pixel_y = -8 + }, +/obj/structure/sign/directions/upload{ + dir = 8; + pixel_x = -32; + pixel_y = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "jZH" = ( /obj/effect/landmark/start/hangover, /obj/structure/railing{ @@ -40489,21 +40590,11 @@ /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "kba" = ( -/obj/machinery/button/door/directional/west{ - id = "Dorm1"; - name = "Dormitory Door Lock"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/hangover, -/obj/item/flashlight/lamp/green{ - pixel_x = 8; - pixel_y = 6 - }, -/turf/open/floor/wood, -/area/station/commons/dorms) +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos/project) "kbb" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -40573,13 +40664,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/port) -"kbQ" = ( -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/bot, -/obj/structure/sign/clock/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/locker) "kbT" = ( /obj/machinery/camera/directional/south{ c_tag = "Central Hallway - Center Port"; @@ -40712,27 +40796,6 @@ /obj/effect/decal/cleanable/generic, /turf/open/floor/plating, /area/station/maintenance/fore) -"kdj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/newscaster/directional/east, -/obj/effect/spawner/random/structure/table_fancy, -/obj/item/reagent_containers/cup/glass/bottle/beer{ - desc = "Whatever it is, it reeks of foul, putrid froth."; - list_reagents = list(/datum/reagent/consumable/ethanol/bacchus_blessing=15); - name = "Delta-Down"; - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ - pixel_x = -3; - pixel_y = 6 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ - pixel_x = -6; - pixel_y = 3 - }, -/turf/open/floor/wood, -/area/station/commons/dorms) "kdq" = ( /obj/effect/turf_decal/trimline/purple/filled/corner, /obj/effect/turf_decal/stripes/corner, @@ -40766,6 +40829,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/eva) +"kdM" = ( +/obj/structure/sign/poster/official/do_not_question/directional/south, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/customs/aft) "kdN" = ( /obj/effect/decal/cleanable/greenglow, /turf/open/floor/plating, @@ -40795,6 +40863,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/detectives_office) +"kdZ" = ( +/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/landmark/start/hangover, +/turf/open/floor/wood, +/area/station/commons/dorms) "keb" = ( /obj/item/kirbyplants/random, /obj/machinery/status_display/evac/directional/north, @@ -41028,6 +41103,16 @@ /obj/structure/filingcabinet/security, /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) +"kgt" = ( +/obj/structure/closet/wardrobe/black, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/effect/landmark/start/hangover/closet, +/obj/effect/turf_decal/tile/dark_blue/fourcorners, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron, +/area/station/commons/dorms/laundry) "kgA" = ( /obj/structure/table/wood, /obj/item/clipboard, @@ -41131,17 +41216,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/gravity_generator) -"khF" = ( -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/neutral/mid_joiner, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 4 - }, -/obj/structure/tank_holder/anesthetic, -/turf/open/floor/iron/dark/textured_half, -/area/station/science/robotics/lab) "khM" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ @@ -41181,11 +41255,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/cargo/office) -"kim" = ( -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible, -/turf/open/floor/iron, -/area/station/engineering/supermatter/room) "kiq" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/iron, @@ -41246,35 +41315,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) -"kjc" = ( -/obj/structure/table/reinforced, -/obj/item/storage/box/monkeycubes{ - pixel_x = 6; - pixel_y = 4 - }, -/obj/item/storage/pill_bottle/mutadone{ - pixel_x = -8; - pixel_y = 9 - }, -/obj/item/reagent_containers/spray/cleaner{ - pixel_x = -10; - pixel_y = -1 - }, -/obj/item/storage/box/monkeycubes{ - pixel_x = 4 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Science - Genetics"; - dir = 6; - name = "science camera"; - network = list("ss13","rd") - }, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/science/genetics) "kjk" = ( /obj/effect/decal/cleanable/cobweb, /obj/effect/turf_decal/bot_red, @@ -41298,6 +41338,16 @@ }, /turf/open/floor/iron, /area/station/cargo/warehouse) +"kjt" = ( +/obj/machinery/status_display/evac/directional/east, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/science/circuits) "kju" = ( /obj/effect/landmark/start/hangover, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -41328,6 +41378,12 @@ /obj/structure/flora/bush/jungle/a/style_random, /turf/open/floor/grass, /area/station/hallway/secondary/exit/departure_lounge) +"kjH" = ( +/obj/machinery/nuclearbomb/beer, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/security) "kjI" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -41345,15 +41401,6 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics/garden) -"kjO" = ( -/obj/structure/table/reinforced, -/obj/item/pipe_dispenser{ - pixel_x = 2; - pixel_y = -4 - }, -/obj/item/pipe_dispenser, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/hfr_room) "kjZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -41425,14 +41472,6 @@ dir = 1 }, /area/station/engineering/atmos/mix) -"kkV" = ( -/obj/structure/cable, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/fore) "klb" = ( /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ dir = 4 @@ -41454,6 +41493,23 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) +"klm" = ( +/obj/structure/sign/plaques/kiddie/badger{ + pixel_y = 32 + }, +/obj/structure/table/wood, +/obj/item/food/grown/harebell, +/obj/item/food/grown/harebell{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/food/grown/harebell{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "klp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -41515,6 +41571,24 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"klO" = ( +/obj/structure/table/reinforced, +/obj/item/stack/cable_coil{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/stack/cable_coil, +/obj/item/stock_parts/scanning_module{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/stock_parts/capacitor, +/obj/item/stock_parts/servo, +/obj/item/stock_parts/servo, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "kmb" = ( /obj/structure/cable, /obj/machinery/computer/security{ @@ -41560,14 +41634,6 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/white, /area/station/medical/storage) -"kng" = ( -/obj/machinery/light/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Courtroom - Aft" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) "knu" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/green{ @@ -41616,14 +41682,6 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/department/science) -"kof" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/sign/poster/official/here_for_your_safety/directional/east, -/turf/open/floor/iron/dark, -/area/station/security/prison/visit) "kol" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 4 @@ -41739,15 +41797,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/command/gateway) -"kpB" = ( -/obj/machinery/light/small/directional/west, -/obj/item/clothing/suit/caution, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/structure/sign/poster/official/no_erp/directional/west, -/turf/open/floor/iron/white, -/area/station/security/prison/toilet) "kpD" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/yellow/half/contrasted{ @@ -41863,18 +41912,6 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) -"krP" = ( -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/neutral/mid_joiner{ - dir = 4 - }, -/obj/effect/turf_decal/siding/dark_red, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/security/medical) "krT" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -41924,14 +41961,23 @@ }, /turf/open/floor/iron, /area/station/science/ordnance/office) -"ksH" = ( -/obj/machinery/duct, +"ksI" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 1 - }, +/obj/machinery/vending/dinnerware, +/obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, -/area/station/engineering/atmos/project) +/area/station/service/kitchen/abandoned) +"ksJ" = ( +/obj/structure/sign/nanotrasen{ + pixel_x = -32; + pixel_y = -32 + }, +/obj/machinery/light/small/directional/south, +/obj/item/kirbyplants/organic/plant22, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "ksK" = ( /turf/closed/wall/r_wall, /area/station/command/gateway) @@ -41956,6 +42002,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) +"ktC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/theater/abandoned) "ktK" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/conveyor{ @@ -41994,15 +42045,6 @@ /obj/structure/cable/layer3, /turf/open/floor/circuit/green, /area/station/ai_monitored/turret_protected/ai) -"kui" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/structure/sign/warning/no_smoking/circle/directional/south, -/turf/open/floor/iron, -/area/station/maintenance/department/science) "kun" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -42021,11 +42063,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/cargo/storage) -"kuF" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "kuI" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -42100,6 +42137,16 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space/nearstation) +"kvs" = ( +/obj/item/kirbyplants/random, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron, +/area/station/service/abandoned_gambling_den/gaming) "kvt" = ( /obj/structure/lattice, /obj/structure/sign/warning/electric_shock/directional/north, @@ -42146,12 +42193,23 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/command/corporate_showroom) -"kvJ" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/easel, -/obj/item/canvas/twentythree_nineteen, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) +"kvG" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research{ + name = "Research Division Access" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sci-entrance" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/unres, +/turf/open/floor/iron, +/area/station/science/research) "kvK" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -42188,6 +42246,22 @@ /obj/machinery/light/small/red/directional/east, /turf/open/floor/iron/smooth, /area/station/maintenance/department/science/xenobiology) +"kwg" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/wood, +/area/station/service/electronic_marketing_den) +"kws" = ( +/obj/structure/sign/poster/official/work_for_a_future/directional/south, +/obj/structure/chair/sofa/bench{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/security/processing) "kwK" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -42233,11 +42307,6 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) -"kxm" = ( -/obj/machinery/light/directional/east, -/mob/living/basic/mouse/white, -/turf/open/floor/iron/cafeteria, -/area/station/security/prison/mess) "kxs" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral{ @@ -42286,28 +42355,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet, /area/station/commons/vacant_room/office) -"kxW" = ( -/obj/structure/sign/warning/secure_area/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Atmospherics - Fore Tanks"; - name = "atmospherics camera" - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"kyb" = ( -/obj/structure/sign/departments/science{ - name = "ROBOTICS"; - pixel_y = 32 - }, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) "kyi" = ( /obj/effect/landmark/start/hangover, /obj/structure/chair/sofa/right/brown{ @@ -42348,18 +42395,44 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/science/research) -"kyE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/stripes/end{ - dir = 4 +"kyI" = ( +/obj/item/stack/cable_coil, +/obj/item/bodypart/arm/right/robot{ + pixel_x = 3 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 +/obj/item/bodypart/arm/left/robot{ + pixel_x = -3 + }, +/obj/structure/table, +/obj/item/radio/intercom/directional/west, +/obj/item/assembly/prox_sensor{ + pixel_x = 5 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = 5 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = 5 + }, +/obj/item/assembly/flash/handheld, +/obj/item/assembly/flash/handheld, +/obj/item/assembly/flash/handheld, +/obj/item/assembly/flash/handheld, +/obj/item/assembly/flash/handheld, +/obj/item/assembly/flash/handheld, +/obj/item/stock_parts/cell/high{ + pixel_x = 3; + pixel_y = 16 + }, +/obj/item/stock_parts/cell/high{ + pixel_x = -3; + pixel_y = 16 + }, +/obj/item/stock_parts/cell/high{ + pixel_y = 15 }, -/obj/structure/sign/warning/fire/directional/east, /turf/open/floor/iron, -/area/station/engineering/main) +/area/station/science/robotics/lab) "kyR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/railing/corner, @@ -42416,13 +42489,6 @@ }, /turf/open/floor/iron, /area/station/command/corporate_showroom) -"kzt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/wood, -/obj/machinery/light/small/directional/north, -/obj/machinery/barsign/all_access/directional/north, -/turf/open/floor/iron/dark, -/area/station/service/abandoned_gambling_den) "kzI" = ( /obj/structure/table/wood, /obj/item/electronics/airalarm, @@ -42430,6 +42496,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/electronic_marketing_den) +"kzP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/do_not_question/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/detectives_office/private_investigators_office) "kzR" = ( /obj/structure/disposalpipe/segment, /obj/machinery/duct, @@ -42479,39 +42551,19 @@ /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/iron/white/smooth_large, /area/station/medical/psychology) -"kAo" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/structure/sign/warning/electric_shock/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "AI Chamber - Fore"; - name = "motion-sensitive ai camera"; - network = list("aichamber") - }, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"kAv" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/toilet{ - dir = 8 - }, -/obj/machinery/newscaster/directional/north, -/obj/machinery/button/door/directional/south{ - id = "Arrivals_Toilet1"; - name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/commons/toilet/restrooms) "kAD" = ( /obj/structure/sign/warning/electric_shock, /turf/closed/wall/r_wall, /area/station/engineering/storage/tech) +"kAE" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/structure/reagent_dispensers/fueltank, +/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) "kAX" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 1 @@ -42529,30 +42581,11 @@ /turf/open/floor/plating, /area/station/maintenance/port/fore) "kBb" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/tile/neutral/full, +/obj/item/kirbyplants/random, /turf/open/floor/iron/dark/smooth_large, /area/station/security/detectives_office) -"kBg" = ( -/obj/machinery/computer/crew{ - dir = 1 - }, -/obj/machinery/requests_console/directional/south{ - department = "Chief Medical Officer's Desk"; - name = "Chief Medical Officer's Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/cmo) "kBz" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -42568,11 +42601,6 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron/dark, /area/station/medical/pharmacy) -"kBJ" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "kBN" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/mess, @@ -42605,10 +42633,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/security) -"kBV" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/wood, -/area/station/service/electronic_marketing_den) "kCa" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/red{ @@ -42616,29 +42640,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"kCd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/lockers) -"kCi" = ( -/obj/machinery/light/dim/directional/south, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/maintenance/port) -"kCq" = ( -/obj/structure/cable, -/obj/machinery/modular_computer/console/preset/id{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "kCs" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -42665,16 +42666,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"kCP" = ( -/obj/structure/closet/wardrobe/black, -/obj/effect/turf_decal/siding/dark_blue{ - dir = 8 - }, -/obj/effect/landmark/start/hangover/closet, -/obj/machinery/light/cold/directional/east, -/obj/effect/turf_decal/tile/dark_blue/fourcorners, -/turf/open/floor/iron, -/area/station/commons/dorms/laundry) "kCR" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -42684,16 +42675,47 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) +"kCT" = ( +/obj/structure/closet/bombcloset/security, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/cable, +/obj/machinery/light/small/red/dim/directional/north, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/security) "kCV" = ( /obj/structure/extinguisher_cabinet/directional/south, /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/dark, /area/station/command/bridge) +"kCX" = ( +/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/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "kDd" = ( /obj/structure/disposalpipe/segment, /obj/machinery/duct, /turf/open/floor/iron/dark, /area/station/service/chapel/storage) +"kDi" = ( +/obj/structure/rack, +/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/machinery/status_display/evac/directional/west, +/obj/effect/turf_decal/bot, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "kDj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ @@ -42713,20 +42735,6 @@ /obj/structure/chair/pew/right, /turf/open/floor/iron/chapel, /area/station/service/chapel) -"kDq" = ( -/obj/machinery/camera/directional/north{ - c_tag = "AI Satellite - Transit Tube"; - name = "ai camera"; - network = list("minisat"); - start_active = 1 - }, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/trimline/blue/filled/end{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) "kDv" = ( /obj/structure/bed/dogbed/runtime, /obj/item/radio/intercom/directional/south, @@ -42784,12 +42792,6 @@ /obj/item/storage/crayons, /turf/open/floor/wood, /area/station/service/library/abandoned) -"kEv" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) "kEw" = ( /obj/structure/cable, /obj/structure/reagent_dispensers/plumbed{ @@ -42803,6 +42805,13 @@ }, /turf/open/floor/iron/white/textured, /area/station/medical/virology) +"kEA" = ( +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) "kEJ" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -42819,29 +42828,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"kEN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/newscaster/directional/east, +/obj/machinery/light/small/broken/directional/east, +/turf/open/floor/plating, +/area/station/security/detectives_office/private_investigators_office) "kFa" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/research) -"kFc" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) -"kFd" = ( -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/mid_joiner{ - dir = 1 - }, -/obj/structure/sign/poster/contraband/borg_fancy_1/directional/west, -/obj/structure/table/reinforced, -/obj/machinery/ecto_sniffer, -/turf/open/floor/iron/dark/textured_half, -/area/station/science/robotics/lab) "kFi" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/tile/green/opposingcorners, @@ -42959,20 +42957,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"kGP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/storage/bag/plants/portaseeder, -/obj/item/cultivator, -/obj/item/reagent_containers/cup/watering_can, -/obj/item/plant_analyzer, -/obj/structure/sign/poster/contraband/kudzu/directional/south, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/siding/green{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/station/service/hydroponics/garden/abandoned) +"kGK" = ( +/obj/effect/landmark/start/hangover/closet, +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central/fore) "kGQ" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -42996,18 +42988,6 @@ }, /turf/open/floor/carpet/blue, /area/station/service/library/lounge) -"kHd" = ( -/obj/machinery/light/directional/east, -/obj/structure/sign/directions/engineering{ - desc = "A sign that shows there are doors here. There are doors everywhere!"; - icon_state = "doors"; - name = "WARNING: PRESSURIZED DOORS"; - pixel_x = 32 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) "kHf" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -43049,6 +43029,26 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/courtroom) +"kHN" = ( +/obj/machinery/shieldgen, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/no_smoking/directional/north, +/obj/effect/turf_decal/bot, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/engineering/main) +"kHQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/camera/directional/east{ + c_tag = "Central Hallway - Bridge Port"; + name = "hallway camera" + }, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "kHV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/shower/directional/east{ @@ -43117,22 +43117,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/maintenance/department/eva/abandoned) -"kIM" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/beaker/large{ - pixel_x = -2 - }, -/obj/item/reagent_containers/cup/beaker/large{ - pixel_x = 2 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) "kJb" = ( /obj/structure/cable, /obj/structure/closet/secure_closet/detective, @@ -43204,11 +43188,24 @@ /turf/closed/wall, /area/station/hallway/secondary/entry) "kKx" = ( -/obj/effect/turf_decal/loading_area{ +/obj/effect/turf_decal/tile/brown/half{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron/half{ dir = 1 }, -/turf/open/floor/iron, /area/station/cargo/miningoffice) +"kKy" = ( +/obj/machinery/airalarm/directional/east, +/obj/machinery/rnd/production/techfab/department/medical, +/obj/effect/turf_decal/stripes/box, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron, +/area/station/medical/storage) "kKz" = ( /obj/machinery/turretid{ control_area = "/area/station/ai_monitored/turret_protected/ai_upload"; @@ -43219,30 +43216,20 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"kKK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/status_display/evac/directional/north, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/science/robotics/mechbay) -"kKV" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/machinery/modular_computer/console/preset/cargochat/science{ - dir = 4 - }, -/obj/effect/turf_decal/bot/left, -/turf/open/floor/iron, -/area/station/science/research) "kKW" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/department/electrical) +"kKY" = ( +/obj/structure/sign/nanotrasen{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "kLa" = ( /obj/effect/spawner/random/engineering/tank, /obj/effect/turf_decal/bot, @@ -43307,17 +43294,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"kLA" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "garbage" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "kLI" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm/directional/north{ @@ -43384,6 +43360,13 @@ /obj/item/pipe_dispenser, /turf/open/floor/iron, /area/station/engineering/main) +"kMN" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "kMS" = ( /turf/open/floor/iron/white/side, /area/station/commons/fitness/recreation) @@ -43523,10 +43506,6 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) -"kOy" = ( -/obj/vehicle/sealed/mecha/working/ripley/cargo, -/turf/open/floor/iron/recharge_floor, -/area/station/cargo/storage) "kOA" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/hos) @@ -43549,11 +43528,6 @@ }, /turf/open/floor/iron/white, /area/station/science/lobby) -"kPs" = ( -/obj/machinery/light/directional/west, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/security/prison) "kPu" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=hall9"; @@ -43562,13 +43536,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"kPA" = ( -/obj/effect/spawner/random/structure/table_fancy, -/obj/structure/sign/poster/contraband/random/directional/north, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/maintenance/department/science) "kPD" = ( /obj/machinery/door/window/brigdoor{ dir = 4; @@ -43603,12 +43570,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/maintenance/port) -"kQz" = ( -/obj/effect/turf_decal/bot, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) "kQB" = ( /obj/structure/cable, /obj/structure/chair{ @@ -43652,12 +43613,6 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron, /area/station/service/hydroponics) -"kQV" = ( -/obj/machinery/modular_computer/console/preset/cargochat/service, -/obj/effect/turf_decal/bot, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/checker, -/area/station/hallway/secondary/service) "kRi" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -43686,15 +43641,22 @@ }, /turf/open/floor/iron, /area/station/cargo/warehouse) -"kRw" = ( -/obj/machinery/washing_machine, -/obj/machinery/light/directional/east, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 +"kRv" = ( +/obj/structure/table/wood, +/obj/item/stack/package_wrap{ + pixel_x = -4; + pixel_y = 6 }, -/turf/open/floor/iron, -/area/station/security/prison/work) +/obj/item/stack/package_wrap{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/hand_labeler, +/obj/item/pen, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/checker, +/area/station/service/bar/backroom) "kRz" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -43741,9 +43703,29 @@ /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/iron, /area/station/maintenance/fore) -"kRU" = ( -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/station/tcommsat/server) +"kRZ" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/gloves/latex, +/obj/item/surgical_drapes, +/obj/item/clothing/suit/apron/surgical, +/obj/structure/window/reinforced/spawner/directional/north{ + pixel_y = 2 + }, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -10; + pixel_y = -4 + }, +/obj/item/clothing/mask/breath/medical, +/turf/open/floor/iron, +/area/station/science/robotics/lab) +"kSa" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/sign/warning/pods/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "kSc" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/decal/cleanable/dirt, @@ -43752,26 +43734,6 @@ }, /turf/open/floor/iron, /area/station/medical/abandoned) -"kSg" = ( -/obj/structure/closet/secure_closet/brig{ - name = "Prisoner Locker" - }, -/obj/machinery/status_display/ai/directional/south, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/execution/transfer) -"kSk" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/modular_computer/console/preset/cargochat/cargo, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "kSl" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, @@ -43861,8 +43823,15 @@ /turf/open/floor/iron/dark, /area/station/engineering/main) "kTs" = ( -/obj/structure/closet/secure_closet/miner, -/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 1 + }, +/obj/effect/landmark/start/shaft_miner, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/miningoffice) "kTy" = ( @@ -43871,6 +43840,17 @@ }, /turf/open/floor/iron/grimy, /area/station/service/library/abandoned) +"kTG" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/sign/calendar/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "kTQ" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -43921,6 +43901,13 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/cmo) +"kUx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/hallway) "kUC" = ( /obj/structure/table/wood, /obj/machinery/newscaster/directional/south, @@ -43949,18 +43936,6 @@ /obj/structure/closet/crate, /turf/open/space/basic, /area/space/nearstation) -"kUN" = ( -/obj/structure/sign/warning/electric_shock/directional/east, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"kVe" = ( -/obj/machinery/modular_computer/console/preset/id, -/turf/open/floor/iron/grimy, -/area/station/command/heads_quarters/hos) "kVo" = ( /obj/effect/landmark/start/chief_medical_officer, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -44000,6 +43975,7 @@ dir = 8 }, /obj/effect/turf_decal/tile/red/fourcorners, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron, /area/station/service/kitchen/abandoned) "kVx" = ( @@ -44063,13 +44039,6 @@ /obj/structure/sign/poster/contraband/random/directional/south, /turf/open/floor/plating, /area/station/service/kitchen/abandoned) -"kWb" = ( -/obj/machinery/door/window/brigdoor/left/directional/south{ - req_access = list("morgue_secure"); - name = "Coroner's Office" - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "kWi" = ( /obj/effect/turf_decal/box/white/corners{ dir = 8 @@ -44077,6 +44046,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/xenobiology) +"kWm" = ( +/obj/structure/table/wood, +/obj/item/folder/red, +/obj/item/lighter, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/wood, +/area/station/service/electronic_marketing_den) "kWE" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -44132,6 +44108,13 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"kWT" = ( +/obj/effect/turf_decal/bot, +/obj/structure/tank_dispenser, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room) "kXa" = ( /obj/machinery/defibrillator_mount/directional/north, /obj/item/reagent_containers/cup/bottle/epinephrine, @@ -44150,19 +44133,6 @@ }, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/hop) -"kXc" = ( -/obj/structure/table/wood, -/obj/item/crowbar/red, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/book/manual/wiki/detective, -/obj/item/camera/detective, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/detectives_office/private_investigators_office) "kXf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -44188,12 +44158,6 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) -"kXu" = ( -/obj/machinery/vending/wallmed/directional/east, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/vending/wardrobe/coroner_wardrobe, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "kXC" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -44369,6 +44333,19 @@ /obj/effect/turf_decal/bot/left, /turf/open/floor/iron, /area/station/engineering/storage/tech) +"laj" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 8 + }, +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/obj/effect/turf_decal/box/corners, +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "lan" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 4 @@ -44490,19 +44467,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"lbz" = ( -/obj/structure/table/reinforced, -/obj/item/bodypart/chest/robot, -/obj/item/bodypart/arm/right/robot{ - pixel_x = 6 - }, -/obj/item/bodypart/arm/left/robot{ - pixel_x = -6 +"lbO" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 }, -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "lbR" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -44517,14 +44488,6 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/port) -"lbT" = ( -/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{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "lbU" = ( /obj/machinery/status_display/evac/directional/east, /obj/structure/table/wood, @@ -44541,6 +44504,13 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) +"lca" = ( +/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/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "lcf" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -44669,6 +44639,11 @@ /obj/machinery/air_sensor/air_tank, /turf/open/floor/engine/air, /area/station/engineering/atmos) +"ldv" = ( +/obj/item/kirbyplants/random, +/obj/structure/sign/poster/contraband/arc_slimes/directional/north, +/turf/open/floor/plating, +/area/station/service/abandoned_gambling_den) "ldN" = ( /obj/structure/table, /obj/machinery/reagentgrinder{ @@ -44689,26 +44664,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) -"ldY" = ( -/obj/machinery/disposal/bin{ - desc = "A pneumatic waste disposal unit. This one leads to the morgue."; - name = "corpse disposal" - }, +"led" = ( +/obj/item/restraints/handcuffs, +/obj/item/assembly/flash/handheld, +/obj/structure/sign/poster/official/report_crimes/directional/south, +/obj/structure/cable, +/obj/structure/rack, /obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, -/area/station/medical/medbay) -"leh" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/wood/corner, -/turf/open/floor/wood/large, -/area/station/command/corporate_showroom) +/area/station/security/checkpoint/escape) "len" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -44760,6 +44725,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"lfs" = ( +/obj/structure/sign/nanotrasen{ + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "lfz" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -44777,11 +44752,15 @@ dir = 4 }, /obj/structure/table/reinforced, -/obj/item/storage/toolbox/mechanical, -/obj/item/storage/belt/utility, /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 1 }, +/obj/item/storage/box/bandages{ + pixel_y = 6; + pixel_x = 4 + }, +/obj/item/storage/toolbox/mechanical, +/obj/item/storage/belt/utility, /turf/open/floor/iron, /area/station/cargo/storage) "lfD" = ( @@ -44791,20 +44770,6 @@ }, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/hos) -"lfK" = ( -/obj/item/radio/intercom/directional/north, -/obj/item/kirbyplants/random, -/obj/machinery/light/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/north{ - c_tag = "Engineering - Hallway"; - name = "engineering camera" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/hallway) "lfL" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -44820,17 +44785,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/chapel) -"lga" = ( -/obj/item/restraints/handcuffs, -/obj/item/assembly/flash/handheld, -/obj/structure/sign/poster/official/report_crimes/directional/south, -/obj/structure/cable, -/obj/structure/rack, -/obj/effect/turf_decal/bot, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/red/half/contrasted, +"lgc" = ( +/obj/machinery/light_switch/directional/north{ + pixel_x = 6 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/obj/effect/mapping_helpers/turn_off_lights_with_lightswitch, /turf/open/floor/iron, -/area/station/security/checkpoint/escape) +/area/station/cargo/warehouse) "lgf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -44873,6 +44837,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"lgG" = ( +/obj/machinery/modular_computer/preset/engineering, +/obj/structure/cable, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "lgN" = ( /obj/machinery/door/window/brigdoor/left/directional/west{ name = "Captain's Bedroom"; @@ -44926,6 +44898,13 @@ }, /turf/open/floor/iron, /area/station/medical/storage) +"lhk" = ( +/obj/effect/spawner/random/clothing/wardrobe_closet_colored, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "lhn" = ( /obj/effect/landmark/start/depsec/engineering, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -44941,6 +44920,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"lhp" = ( +/obj/item/kirbyplants/random, +/obj/structure/sign/poster/official/report_crimes/directional/south, +/turf/open/floor/wood, +/area/station/service/lawoffice) "lhC" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -44979,15 +44963,6 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/station/engineering/supermatter/room) -"lir" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/obj/machinery/light_switch/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) "liv" = ( /obj/machinery/plate_press, /obj/effect/decal/cleanable/dirt, @@ -45106,6 +45081,15 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/maintenance/port) +"ljB" = ( +/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/hangover, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron, +/area/station/engineering/break_room) "ljC" = ( /obj/machinery/light_switch/directional/east, /obj/machinery/holopad, @@ -45137,13 +45121,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) -"ljO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/status_display/ai/directional/north, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/engineering/supermatter/room) "ljP" = ( /obj/structure/cable, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -45162,10 +45139,12 @@ /turf/open/floor/iron, /area/station/maintenance/solars/starboard/fore) "ljQ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/loading_area{ dir = 1 }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/miningoffice) "ljS" = ( @@ -45185,6 +45164,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) +"ljX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/range) "lke" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -45225,6 +45210,14 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/cargo/office) +"lks" = ( +/obj/machinery/chem_dispenser, +/obj/structure/sign/warning/chem_diamond/directional/south, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/medical/pharmacy) "lkx" = ( /obj/structure/sign/directions/engineering{ desc = "A sign that shows there are doors here. There are doors everywhere!"; @@ -45241,6 +45234,22 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) +"lkI" = ( +/obj/structure/table, +/obj/item/storage/box/gloves{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/box/bodybags, +/obj/machinery/camera/directional/west{ + c_tag = "Chapel - Morgue"; + name = "chapel camera"; + network = list("ss13","chapel") + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/dark, +/area/station/service/chapel/storage) "lkL" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -45268,17 +45277,33 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"lkS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "llj" = ( /obj/structure/disposalpipe/segment{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/herringbone, /area/station/cargo/miningoffice) -"llz" = ( -/obj/effect/decal/cleanable/oil, -/turf/closed/wall/r_wall, -/area/station/engineering/supermatter/room) +"llm" = ( +/obj/structure/chair/office/tactical{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/full, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/morgue) "llB" = ( /obj/structure/cable, /obj/structure/chair/stool/bar/directional/west, @@ -45315,13 +45340,13 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) -"lmn" = ( -/obj/machinery/duct, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron, -/area/station/engineering/main) +"lmm" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit) "lms" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -45342,17 +45367,17 @@ /obj/item/papercutter, /turf/open/floor/iron/dark, /area/station/security/warden) -"lmz" = ( -/obj/structure/table, -/obj/item/clothing/gloves/latex, -/obj/item/clothing/glasses/science, -/obj/structure/sign/poster/official/science/directional/west, -/turf/open/floor/iron/white, -/area/station/science/lobby) "lmC" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /turf/open/floor/iron/white, /area/station/science/lobby) +"lmD" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/west, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "lmG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -45360,6 +45385,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/security/brig) +"lmH" = ( +/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{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) "lmI" = ( /obj/structure/table/glass, /obj/machinery/computer/records/medical/laptop, @@ -45411,18 +45448,6 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/atmos/storage/gas) -"lmT" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 8 - }, -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/obj/effect/turf_decal/box/corners, -/obj/effect/landmark/start/assistant, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "lnm" = ( /obj/structure/closet/secure_closet/captains, /obj/effect/turf_decal/stripes/line{ @@ -45514,6 +45539,18 @@ }, /turf/open/floor/iron, /area/station/medical/storage) +"loU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "lpk" = ( /obj/machinery/door/window/right/directional/east{ name = "Hydroponics Delivery"; @@ -45580,6 +45617,31 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"lpA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/status_display/supply{ + pixel_y = 32 + }, +/obj/structure/reagent_dispensers/fueltank, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/item/weldingtool, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"lpC" = ( +/obj/machinery/light_switch/directional/east, +/obj/structure/table, +/obj/item/crowbar, +/obj/item/wrench, +/obj/item/clothing/mask/gas, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron, +/area/station/science/xenobiology) "lpG" = ( /obj/structure/chair/office{ dir = 1 @@ -45594,6 +45656,14 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/office) +"lpR" = ( +/obj/machinery/duct, +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "lpY" = ( /obj/structure/table/reinforced, /obj/machinery/light_switch/directional/east, @@ -45604,6 +45674,12 @@ /obj/machinery/light/small/red/directional/east, /turf/open/floor/iron/smooth, /area/station/maintenance/department/science/xenobiology) +"lqj" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/tcommsat/computer) "lql" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -45626,16 +45702,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/cargo/storage) -"lqT" = ( -/obj/structure/sink/directional/west, -/obj/item/trash/sosjerky, -/obj/structure/sign/poster/official/cleanliness/directional/east, -/obj/machinery/light/small/directional/north, -/obj/machinery/firealarm/directional/south, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/security/prison/toilet) "lra" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -45659,6 +45725,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/chapel) +"lru" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron, +/area/station/commons/dorms) "lrA" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -45693,13 +45766,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"lrP" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "lrX" = ( /obj/structure/bookcase/random/reference, /obj/effect/turf_decal/siding/wood{ @@ -45723,36 +45789,6 @@ /obj/item/robot_suit, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) -"lsm" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/window/preopen{ - dir = 1; - id = "left_arrivals_shutters" - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/corner, -/area/station/hallway/secondary/entry) -"lsu" = ( -/obj/effect/turf_decal/siding/white, -/obj/item/radio/intercom/directional/east, -/obj/machinery/light/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Departures Lounge - Aft Starboard"; - dir = 6; - name = "departures camera" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/hallway/secondary/exit/departure_lounge) "lsG" = ( /obj/machinery/door/airlock/public/glass{ name = "Holodeck Access" @@ -45772,15 +45808,6 @@ "lsJ" = ( /turf/closed/wall, /area/station/service/library/artgallery) -"lsN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/structure/sign/warning/biohazard/directional/south, -/turf/open/floor/iron, -/area/station/maintenance/department/science) "lte" = ( /obj/effect/mapping_helpers/airlock/abandoned, /obj/effect/mapping_helpers/airlock/unres, @@ -45803,6 +45830,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/department/chapel) "ltr" = ( @@ -45871,17 +45899,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/courtroom) -"ltM" = ( -/obj/item/kirbyplants/random, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/south{ - c_tag = "Arrivals - Port Entrance"; - name = "arrivals camera" +"ltO" = ( +/obj/item/radio/intercom/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/chapel{ + dir = 5 }, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/entry) +/area/station/service/chapel) "ltS" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/medical/glass{ @@ -45921,6 +45945,13 @@ /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/iron, /area/station/service/kitchen/abandoned) +"ltY" = ( +/obj/structure/sign/warning/secure_area/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "ltZ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/glass, @@ -45960,6 +45991,18 @@ }, /turf/open/floor/iron/dark, /area/station/security/brig) +"luE" = ( +/obj/machinery/modular_computer/preset/civilian{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/newscaster/directional/east, +/obj/effect/turf_decal/bot/right, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/science/ordnance/office) "luG" = ( /obj/structure/easel, /obj/item/canvas/twentythree_twentythree, @@ -45974,6 +46017,15 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/cargo/storage) +"lvi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/official/foam_force_ad/directional/west, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "lvk" = ( /obj/structure/closet/secure_closet/brig{ id = "brig1"; @@ -45991,13 +46043,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"lvv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/closed/wall, -/area/station/maintenance/department/medical/morgue) "lvw" = ( /obj/structure/lattice, /obj/effect/spawner/random/structure/grille, @@ -46055,6 +46100,32 @@ /obj/effect/spawner/random/bureaucracy/folder, /turf/open/floor/wood/large, /area/station/service/library/lounge) +"lvU" = ( +/obj/item/book/manual/wiki/ordnance{ + pixel_x = 4; + pixel_y = 1 + }, +/obj/item/computer_disk{ + pixel_y = 4 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/item/computer_disk{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/computer_disk, +/obj/item/computer_disk/ordnance{ + pixel_x = -4; + pixel_y = -1 + }, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/science/ordnance/office) "lvX" = ( /obj/structure/cable, /mob/living/simple_animal/slime, @@ -46090,12 +46161,10 @@ /obj/effect/turf_decal/tile/neutral/anticorner/contrasted, /turf/open/floor/iron, /area/station/medical/storage) -"lwE" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/seed_extractor, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/checker, -/area/station/service/hydroponics/garden/abandoned) +"lwo" = ( +/obj/structure/chair/office, +/turf/open/floor/plating, +/area/station/service/library/abandoned) "lwF" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ dir = 9 @@ -46110,15 +46179,6 @@ }, /turf/open/floor/iron, /area/station/science/research) -"lwI" = ( -/obj/structure/cable, -/obj/structure/table/reinforced, -/obj/item/folder/yellow, -/obj/item/electronics/airlock, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "lwZ" = ( /turf/closed/wall, /area/station/medical/medbay) @@ -46180,6 +46240,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /turf/open/floor/iron, /area/station/engineering/supermatter/room) +"lxP" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/obj/structure/sign/poster/contraband/random/directional/west, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "lxS" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -46212,26 +46279,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"lyx" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/computer/shuttle/mining/common, -/obj/structure/sign/directions/engineering{ - desc = "A sign that shows there are doors here. There are doors everywhere!"; - icon_state = "doors"; - name = "WARNING: EXTERNAL AIRLOCK"; - pixel_y = 32 - }, -/turf/open/floor/iron/smooth_large, -/area/station/hallway/secondary/entry) -"lyC" = ( -/obj/structure/table, -/obj/machinery/microwave{ - desc = "Cooks and boils stuff, somehow."; - pixel_y = 5 +"lyh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 }, -/obj/effect/turf_decal/bot, +/obj/machinery/light/directional/north, /turf/open/floor/iron, -/area/station/service/kitchen/abandoned) +/area/station/security/lockers) "lyE" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -46241,10 +46296,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/command/gateway) -"lyU" = ( -/obj/effect/spawner/random/structure/closet_empty, -/turf/open/floor/plating, -/area/station/maintenance/department/science) +"lyL" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/incident_display/delam/directional/north, +/turf/open/floor/iron, +/area/station/engineering/main) "lyZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -46268,28 +46330,6 @@ }, /turf/open/floor/iron, /area/station/science/xenobiology) -"lzj" = ( -/obj/structure/closet/crate/science{ - anchored = 1 - }, -/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/effect/turf_decal/bot, -/obj/machinery/requests_console/directional/north{ - department = "Robotics"; - name = "Robotics Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/ore_update, -/obj/effect/mapping_helpers/requests_console/supplies, -/turf/open/floor/iron, -/area/station/science/robotics/lab) "lzo" = ( /obj/machinery/atmospherics/components/binary/pump, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -46394,20 +46434,10 @@ /obj/machinery/computer/security/telescreen/entertainment/directional/east, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) -"lAx" = ( -/obj/machinery/telecomms/receiver/preset_right, -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/station/tcommsat/server) "lAA" = ( /obj/machinery/power/port_gen/pacman/pre_loaded, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"lAE" = ( -/obj/machinery/duct, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron, -/area/station/engineering/main) "lAH" = ( /obj/item/kirbyplants/random, /obj/machinery/power/apc/auto_name/directional/north, @@ -46510,19 +46540,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) -"lBr" = ( -/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, -/obj/structure/sign/poster/official/help_others/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "lBz" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -46613,12 +46630,6 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/wood, /area/station/service/lawoffice) -"lCK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/official/do_not_question/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/detectives_office/private_investigators_office) "lCM" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -46671,6 +46682,16 @@ "lDi" = ( /turf/closed/wall, /area/station/cargo/warehouse) +"lDo" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/newscaster/directional/west, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/command/corporate_showroom) "lDI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -46772,14 +46793,6 @@ dir = 1 }, /area/station/commons/fitness/recreation) -"lEq" = ( -/obj/item/kirbyplants/random, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) "lEr" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, @@ -46813,6 +46826,16 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"lES" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/port/fore) "lET" = ( /turf/closed/wall/r_wall, /area/station/security/medical) @@ -46875,21 +46898,35 @@ }, /turf/open/floor/iron, /area/station/security/holding_cell) -"lFQ" = ( +"lFX" = ( +/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, -/obj/machinery/light/directional/east, -/obj/effect/decal/cleanable/oil, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 }, -/turf/open/floor/iron, -/area/station/engineering/supermatter/room) +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/structure/sign/poster/official/report_crimes/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay) "lGf" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 1 }, /turf/open/floor/iron, /area/station/commons/storage/primary) +"lGg" = ( +/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/red{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "lGq" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -46987,7 +47024,7 @@ /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) "lHz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) "lHC" = ( @@ -47016,6 +47053,13 @@ /obj/structure/closet/emcloset, /turf/open/floor/iron, /area/station/maintenance/department/medical/morgue) +"lHJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/science/research/abandoned) "lHR" = ( /obj/effect/landmark/start/depsec/engineering, /obj/structure/chair{ @@ -47100,6 +47144,16 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/department/science) +"lIy" = ( +/obj/structure/sign/nanotrasen{ + pixel_x = 32 + }, +/obj/structure/table/reinforced, +/obj/item/storage/lockbox/loyalty, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "lID" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, @@ -47109,6 +47163,13 @@ }, /turf/open/floor/iron, /area/station/cargo/warehouse) +"lIG" = ( +/obj/structure/table/optable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/status_display/ai/directional/south, +/obj/effect/turf_decal/bot_red, +/turf/open/floor/iron/dark, +/area/station/medical/surgery/theatre) "lII" = ( /obj/structure/railing, /obj/structure/chair/sofa/bench{ @@ -47214,6 +47275,25 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) +"lJN" = ( +/obj/machinery/requests_console/directional/west{ + department = "Research Director's Desk"; + name = "Research Director's Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/ore_update, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/item/kirbyplants/random/dead/research_director, +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/rd) "lJQ" = ( /obj/effect/turf_decal/siding/yellow{ dir = 10 @@ -47222,6 +47302,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/medical/pharmacy) +"lJW" = ( +/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/incident_display/delam/directional/north, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "lKd" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/condiment/saltshaker{ @@ -47247,12 +47334,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos/mix) -"lKf" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) "lKl" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -47382,6 +47463,24 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/medical/surgery/theatre) +"lLU" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/mapping_helpers/apc/cell_10k, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"lLW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/storage/secure/briefcase, +/obj/item/storage/briefcase{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/plating, +/area/station/security/detectives_office/private_investigators_office) "lLY" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 4 @@ -47412,19 +47511,6 @@ /obj/item/toy/figure/lawyer, /turf/open/floor/wood, /area/station/service/lawoffice) -"lMf" = ( -/obj/machinery/recharge_station, -/obj/effect/turf_decal/bot/right, -/obj/machinery/camera/directional/south{ - c_tag = "Engineering - Break Room"; - name = "engineering camera" - }, -/obj/machinery/status_display/ai/directional/south, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "lMk" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -47445,6 +47531,15 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"lMA" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/status_display/evac/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "lMF" = ( /obj/machinery/vending/autodrobe/all_access, /obj/effect/turf_decal/siding/dark_blue{ @@ -47546,19 +47641,6 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron, /area/station/security/warden) -"lNR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/camera/directional/east{ - c_tag = "Engineering Hallway - Fore"; - name = "hallway camera" - }, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "lNZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47567,6 +47649,20 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/medical/medsci) +"lOc" = ( +/obj/structure/table/wood, +/obj/machinery/light_switch/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/library) +"lOf" = ( +/obj/structure/sign/poster/official/report_crimes/directional/south, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "lOw" = ( /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible/layer2{ dir = 4 @@ -47576,6 +47672,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"lOA" = ( +/obj/machinery/suit_storage_unit/atmos, +/obj/effect/turf_decal/box/red/corners{ + dir = 4 + }, +/obj/effect/turf_decal/box/red/corners, +/obj/machinery/airalarm/directional/east, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/atmos/storage) "lOG" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -47603,6 +47709,23 @@ }, /turf/open/floor/iron/checker, /area/station/service/hydroponics/garden/abandoned) +"lPd" = ( +/obj/machinery/holopad, +/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/bot_white, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"lPf" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "lPm" = ( /obj/machinery/telecomms/server/presets/service, /obj/effect/turf_decal/tile/green/anticorner/contrasted, @@ -47613,6 +47736,10 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, /area/station/service/hydroponics) +"lPv" = ( +/obj/machinery/modular_computer/preset/id, +/turf/open/floor/iron/grimy, +/area/station/command/heads_quarters/hos) "lPy" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/firecloset, @@ -47667,8 +47794,8 @@ /turf/open/floor/iron, /area/station/security/checkpoint/escape) "lQj" = ( -/obj/structure/bed{ - dir = 4 +/obj/structure/bed/medical{ + dir = 8 }, /obj/item/clothing/suit/jacket/straight_jacket, /obj/item/clothing/mask/muzzle, @@ -47712,6 +47839,14 @@ }, /turf/open/floor/iron/checker, /area/station/service/theater) +"lQB" = ( +/obj/structure/cable, +/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/escape) "lQP" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -47721,59 +47856,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/port) -"lQR" = ( -/obj/structure/table/wood, -/obj/machinery/computer/records/medical/laptop, -/obj/machinery/light_switch/directional/west{ - pixel_x = -38; - pixel_y = 8 - }, -/obj/machinery/button/flasher{ - id = "hopflash"; - pixel_x = -38; - pixel_y = -7; - req_access = list("kitchen") - }, -/obj/machinery/button/ticket_machine{ - pixel_y = 22 - }, -/obj/item/radio/intercom/directional/north{ - pixel_y = 30 - }, -/obj/machinery/button/door/directional/west{ - id = "hopblast"; - name = "Lockdown Blast Doors"; - pixel_y = 6; - req_access = list("hop") - }, -/obj/machinery/button/door/directional/west{ - id = "hopline"; - name = "Queue Shutters Control"; - pixel_y = -6; - req_access = list("hop") - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/item/papercutter, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hop) -"lQV" = ( -/obj/machinery/camera/motion/directional/east{ - c_tag = "E.V.A. Storage"; - name = "motion-sensitive command camera" - }, -/obj/machinery/requests_console/directional/east{ - department = "EVA"; - name = "EVA Requests Console" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) "lRb" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -47790,16 +47872,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/department/eva/abandoned) -"lRi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/machinery/camera/directional/east{ - c_tag = "Cargo Bay - Delivery Office"; - name = "cargo camera" - }, -/obj/effect/turf_decal/tile/brown, -/turf/open/floor/iron, -/area/station/cargo/sorting) "lRk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47823,24 +47895,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/maintenance/port) -"lRI" = ( -/obj/machinery/computer/shuttle/mining{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/item/radio/intercom/directional/east{ - pixel_y = 3 - }, -/obj/machinery/button/door/directional/east{ - id = "qmroom"; - name = "Privacy Control"; - pixel_y = -6 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) "lSh" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -47880,14 +47934,6 @@ "lSz" = ( /turf/closed/wall, /area/station/security/detectives_office) -"lSA" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/structure/sign/poster/official/plasma_effects/directional/north, -/turf/open/floor/iron, -/area/station/engineering/atmos) "lSG" = ( /obj/structure/dresser, /obj/structure/mirror/directional/west, @@ -48017,6 +48063,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"lUF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/sign/warning/no_smoking/circle/directional/south, +/turf/open/floor/iron, +/area/station/maintenance/department/science) "lUI" = ( /obj/structure/chair/office, /obj/effect/landmark/start/head_of_personnel, @@ -48040,15 +48094,22 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/large, /area/station/medical/paramedic) -"lUX" = ( -/obj/effect/landmark/start/hangover, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/contraband/random/directional/west, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, +"lUW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron, -/area/station/cargo/warehouse) +/area/station/service/kitchen/abandoned) +"lVi" = ( +/obj/structure/closet/l3closet/virology, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/siding/green, +/obj/item/radio/intercom/directional/north, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/medical/virology) "lVn" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -48133,6 +48194,15 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/half, /area/station/engineering/atmos) +"lWP" = ( +/obj/structure/table/reinforced, +/obj/item/crowbar, +/obj/item/wrench, +/obj/item/radio, +/obj/structure/sign/poster/official/space_cops/directional/west, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron, +/area/station/security/checkpoint/escape) "lXl" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -48171,6 +48241,19 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/rd) +"lXO" = ( +/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/yellow{ + dir = 4 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "lXV" = ( /obj/structure/table/wood, /obj/item/folder/blue, @@ -48178,6 +48261,13 @@ /obj/machinery/status_display/evac/directional/west, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/captain/private) +"lXW" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) "lYd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -48277,6 +48367,15 @@ "lZx" = ( /turf/closed/wall, /area/station/command/heads_quarters/hop) +"lZz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "lZF" = ( /obj/machinery/power/shieldwallgen/xenobiologyaccess, /obj/structure/cable, @@ -48292,22 +48391,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured_large, /area/station/science/xenobiology) -"lZW" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/machinery/newscaster/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/obj/machinery/button/door/directional/south{ - id = "Toilet_Med"; - name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/item/food/sandwich/cheese/grilled, -/turf/open/floor/iron/cafeteria, -/area/station/medical/break_room) "lZX" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, @@ -48368,7 +48451,7 @@ /turf/open/floor/iron, /area/station/maintenance/port/fore) "mbA" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/newscaster/directional/south, /obj/effect/turf_decal/trimline/blue/filled/line, /obj/machinery/light/directional/south, @@ -48447,6 +48530,14 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) +"mcC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/white/smooth_half, +/area/station/science/ordnance/storage) "mcE" = ( /obj/machinery/door/firedoor, /obj/machinery/light/directional/east, @@ -48474,19 +48565,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/carpet/orange, /area/station/commons/dorms) -"mcS" = ( -/obj/machinery/modular_computer/console/preset/id{ - dir = 4 - }, -/obj/machinery/requests_console/directional/west{ - department = "Captain's Desk"; - name = "Captain's Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain) "mcV" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Supermatter Engine Room" @@ -48512,14 +48590,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"mcX" = ( -/obj/effect/turf_decal/siding/yellow/corner{ - dir = 8 - }, -/obj/machinery/light/directional/north, -/obj/machinery/status_display/ai/directional/north, -/turf/open/floor/iron, -/area/station/engineering/atmos/hfr_room) "mdg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -48604,6 +48674,17 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron, /area/station/maintenance/department/security) +"meJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/machinery/duct, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "meL" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -48631,11 +48712,6 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/large, /area/station/security/brig) -"meW" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/iron/white, -/area/station/medical/virology) "meZ" = ( /obj/machinery/light/small/directional/east, /obj/structure/toilet{ @@ -48653,20 +48729,24 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/commons/toilet/restrooms) -"mfb" = ( -/obj/machinery/status_display/evac/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) "mfq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/event_spawn, /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron/dark, /area/station/service/electronic_marketing_den) +"mft" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/wrench, +/obj/item/analyzer{ + pixel_x = 7; + pixel_y = 3 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "mfC" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -48718,13 +48798,6 @@ }, /turf/open/floor/iron, /area/station/commons/locker) -"mfY" = ( -/obj/effect/spawner/random/clothing/wardrobe_closet_colored, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/locker) "mgd" = ( /obj/structure/railing{ dir = 10 @@ -48773,6 +48846,21 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron/dark, /area/station/maintenance/department/science) +"mgE" = ( +/obj/structure/sign/departments/chemistry/pharmacy/directional/west, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"mgJ" = ( +/obj/machinery/duct, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "mgW" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 4 @@ -48810,12 +48898,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) -"mhj" = ( -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/rock/pile/jungle/style_random, -/obj/machinery/light/floor, -/turf/open/misc/grass, -/area/station/hallway/primary/fore) "mhl" = ( /obj/effect/spawner/random/decoration/statue, /obj/effect/turf_decal/siding/wood{ @@ -48857,6 +48939,23 @@ dir = 1 }, /area/station/service/bar) +"mhx" = ( +/obj/structure/table/reinforced, +/obj/item/folder/yellow, +/obj/item/paper, +/obj/item/paper, +/obj/item/pen, +/obj/machinery/requests_console/directional/east{ + department = "Atmospherics"; + name = "Atmospherics Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/storage) "mhz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -48940,28 +49039,6 @@ /obj/effect/spawner/random/structure/tank_holder, /turf/open/floor/plating, /area/station/maintenance/fore) -"miE" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/machinery/light/directional/east, -/obj/machinery/photocopier, -/turf/open/floor/wood, -/area/station/engineering/break_room) -"miK" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/directional/west, -/obj/item/storage/medkit/regular, -/obj/item/storage/secure/safe/caps_spare/directional/west, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"mja" = ( -/obj/machinery/teleport/station, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/teleporter) "mjo" = ( /obj/machinery/recharge_station, /obj/effect/decal/cleanable/dirt, @@ -48982,23 +49059,6 @@ "mjz" = ( /turf/closed/wall, /area/station/maintenance/starboard/lesser) -"mjG" = ( -/obj/machinery/door/airlock/security{ - name = "Brig" - }, -/obj/structure/disposalpipe/segment, -/obj/structure/sign/poster/official/nanotrasen_logo/directional/west, -/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/access/all/security/general, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/security/brig) "mjK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/green/filled/corner{ @@ -49031,6 +49091,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/circuits) +"mkj" = ( +/obj/effect/turf_decal/trimline/neutral/warning, +/obj/effect/turf_decal/trimline/neutral/mid_joiner, +/obj/structure/sign/warning/no_smoking/directional/west, +/obj/structure/table/reinforced, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/dark/textured_half, +/area/station/science/robotics/lab) "mkB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49066,6 +49136,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/service/theater) +"mlw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) "mly" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, @@ -49091,13 +49167,44 @@ /turf/closed/wall/r_wall, /area/station/ai_monitored/command/storage/eva) "mlF" = ( -/obj/item/kirbyplants/random, -/obj/structure/sign/poster/official/random/directional/west, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 +/obj/machinery/computer/quantum_console, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/dark/smooth_corner, +/area/station/bitrunning/den) +"mlM" = ( +/obj/structure/table/wood, +/obj/machinery/computer/records/medical/laptop, +/obj/machinery/light_switch/directional/west{ + pixel_x = -38; + pixel_y = 8 }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) +/obj/machinery/button/flasher{ + id = "hopflash"; + pixel_x = -38; + pixel_y = -7; + req_access = list("kitchen") + }, +/obj/machinery/button/ticket_machine{ + pixel_y = 22 + }, +/obj/item/radio/intercom/directional/north{ + pixel_y = 30 + }, +/obj/machinery/button/door/directional/west{ + id = "hopblast"; + name = "Lockdown Blast Doors"; + pixel_y = 6; + req_access = list("hop") + }, +/obj/machinery/button/door/directional/west{ + id = "hopline"; + name = "Queue Shutters Control"; + pixel_y = -6; + req_access = list("hop") + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hop) "mlW" = ( /obj/structure/sign/nanotrasen{ pixel_y = 32 @@ -49110,17 +49217,21 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) -"mmj" = ( -/obj/machinery/computer/prisoner/management{ - dir = 8 +"mmf" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 10 }, -/obj/machinery/camera/directional/east{ - c_tag = "Security - Armory Internal" +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 8 }, -/obj/item/radio/intercom/directional/east, -/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/warden) +/area/station/medical/morgue) "mmq" = ( /obj/structure/bookcase, /obj/effect/decal/cleanable/cobweb/cobweb2, @@ -49133,39 +49244,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/space/basic, /area/space/nearstation) -"mmx" = ( -/obj/structure/rack, -/obj/item/clothing/suit/armor/riot{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/suit/armor/riot, -/obj/item/clothing/suit/armor/riot{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/clothing/head/helmet/toggleable/riot{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/head/helmet/toggleable/riot, -/obj/item/clothing/head/helmet/toggleable/riot{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/shield/riot{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/shield/riot, -/obj/item/shield/riot{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "mmA" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/glass, @@ -49187,37 +49265,30 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"mmU" = ( -/obj/effect/turf_decal/trimline/blue/end{ - dir = 4 - }, -/obj/machinery/shower/directional/east{ - name = "emergency shower" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/status_display/ai/directional/north, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/engineering/main) -"mnh" = ( +"mna" = ( +/obj/machinery/firealarm/directional/south, /obj/structure/table/reinforced, -/obj/machinery/airalarm/directional/north, -/obj/effect/spawner/random/entertainment/cigarette_pack{ - pixel_x = 3; - pixel_y = 2 +/obj/item/storage/box/monkeycubes{ + pixel_y = 3 }, -/obj/effect/spawner/random/entertainment/cigarette_pack{ - pixel_x = 3; - pixel_y = 2 +/obj/item/storage/box/monkeycubes, +/obj/effect/turf_decal/stripes/line, +/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/neutral/half/contrasted, +/turf/open/floor/iron, +/area/station/science/xenobiology) +"mnl" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/item/storage/box/coffeepack{ - pixel_x = -13; - pixel_y = 7 +/obj/machinery/modular_computer/preset/cargochat/cargo, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 }, -/turf/open/floor/wood, -/area/station/engineering/break_room) +/turf/open/floor/iron, +/area/station/cargo/storage) "mnz" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -49264,18 +49335,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/security/office) -"mor" = ( -/obj/structure/table/reinforced, -/obj/structure/reagent_dispensers/wall/peppertank/directional/west, -/obj/item/electropack, -/obj/item/assembly/signaler, -/obj/machinery/light/directional/west, -/obj/item/clothing/head/helmet/sec, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) "mou" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -49300,22 +49359,40 @@ /obj/structure/flora/bush/fullgrass/style_random, /turf/open/misc/grass, /area/station/hallway/primary/fore) -"mpj" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/window/preopen{ - dir = 1; - id = "right_arrivals_shutters" +"moZ" = ( +/obj/structure/table, +/obj/item/folder/white, +/obj/machinery/status_display/evac/directional/west, +/obj/item/folder{ + pixel_x = 2; + pixel_y = 2 }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ +/obj/item/pen, +/obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/corner{ - dir = 8 +/turf/open/floor/iron/white, +/area/station/science/lobby) +"mpb" = ( +/obj/structure/rack, +/obj/item/tank/jetpack/carbondioxide{ + pixel_x = 4; + pixel_y = -1 }, -/area/station/hallway/secondary/entry) +/obj/item/tank/jetpack/carbondioxide, +/obj/item/tank/jetpack/carbondioxide{ + pixel_x = -4; + pixel_y = 1 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/door/window/left/directional/west{ + name = "Jetpack Storage"; + req_access = list("eva") + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/eva) "mpk" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 1 @@ -49407,11 +49484,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/large, /area/station/security/checkpoint/medical/medsci) -"mqz" = ( -/obj/structure/railing/corner, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron, -/area/station/service/hydroponics) "mqG" = ( /obj/structure/filingcabinet/medical, /obj/effect/turf_decal/bot, @@ -49504,12 +49576,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/command/gateway) -"mrR" = ( -/obj/structure/bodycontainer/crematorium{ - id = "crematoriumChapel" - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/service/chapel/funeral) "mrT" = ( /obj/effect/turf_decal/siding/brown{ dir = 4 @@ -49529,25 +49595,6 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/dark/smooth_large, /area/station/security/detectives_office) -"msj" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/button/door{ - id = "Disposal Exit"; - name = "Disposal Vent Control"; - pixel_x = -25; - pixel_y = 4; - req_access = list("maint_tunnels") - }, -/obj/structure/chair/stool/directional/west, -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/obj/machinery/computer/pod/old/mass_driver_controller/trash{ - pixel_x = -24; - pixel_y = -7 - }, -/turf/open/floor/iron, -/area/station/maintenance/disposal) "msu" = ( /obj/structure/rack, /obj/effect/decal/cleanable/dirt, @@ -49581,20 +49628,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"msG" = ( -/obj/structure/window/reinforced/spawner/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/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"msJ" = ( -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/main) "msR" = ( /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 @@ -49602,6 +49635,14 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron, /area/station/commons/lounge) +"mta" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "mtb" = ( /obj/structure/rack, /obj/item/electronics/apc, @@ -49617,6 +49658,25 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/department/security) +"mtf" = ( +/obj/structure/rack, +/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/multitool, +/obj/effect/turf_decal/bot, +/obj/machinery/computer/security/telescreen/entertainment/directional/south, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "mti" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -49640,14 +49700,6 @@ dir = 1 }, /area/station/engineering/atmos/mix) -"mtn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) "mtu" = ( /obj/structure/cable, /obj/effect/turf_decal/delivery, @@ -49666,11 +49718,9 @@ /turf/open/floor/iron, /area/station/engineering/storage) "mtL" = ( -/obj/structure/closet/secure_closet/miner, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, +/obj/effect/spawner/structure/window/reinforced, /obj/machinery/status_display/evac/directional/north, -/turf/open/floor/iron, +/turf/open/floor/plating, /area/station/cargo/miningoffice) "mtO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49711,22 +49761,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/science/robotics/mechbay) -"muo" = ( -/obj/structure/table/reinforced, -/obj/item/radio{ - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/radio{ - pixel_x = -5; - pixel_y = 5 - }, -/obj/item/radio, -/obj/machinery/light_switch/directional/east, -/obj/machinery/light/directional/east, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "mus" = ( /obj/item/kirbyplants/random, /obj/machinery/airalarm/directional/north, @@ -49756,6 +49790,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/eva) +"muA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/engineering/main) "muK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor, @@ -49860,6 +49900,13 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/maintenance/disposal) +"mvw" = ( +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/textured_half, +/area/station/service/chapel/storage) "mvA" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -50003,6 +50050,13 @@ dir = 8 }, /area/station/engineering/lobby) +"mxn" = ( +/obj/structure/sign/warning/secure_area/directional/south, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/half{ + dir = 8 + }, +/area/station/security/range) "mxr" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -50033,12 +50087,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/customs/fore) -"mxS" = ( -/obj/structure/lattice/catwalk, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/light/directional/south, -/turf/open/space, -/area/space/nearstation) "mxU" = ( /obj/structure/table/wood, /obj/item/paper_bin, @@ -50066,6 +50114,13 @@ dir = 5 }, /area/station/service/chapel) +"myj" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Courtroom - Aft" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) "myx" = ( /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ @@ -50090,6 +50145,11 @@ /obj/effect/landmark/navigate_destination, /turf/open/floor/iron, /area/station/command/heads_quarters/cmo) +"myG" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/cafeteria, +/area/station/security/prison/mess) "myV" = ( /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/broken_floor, @@ -50169,18 +50229,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/corporate_showroom) -"mzO" = ( -/obj/structure/table/reinforced, -/obj/machinery/newscaster/directional/north, -/obj/item/clipboard, -/obj/item/toy/figure/engineer{ - pixel_x = -6 - }, -/obj/item/toy/figure/atmos{ - pixel_x = 6 - }, -/turf/open/floor/wood, -/area/station/engineering/break_room) "mzV" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/bot, @@ -50297,6 +50345,15 @@ }, /turf/open/floor/iron/edge, /area/station/hallway/primary/central/aft) +"mBJ" = ( +/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/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "mBQ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/camera/directional/east{ @@ -50337,6 +50394,13 @@ /obj/effect/spawner/random/structure/barricade, /turf/open/floor/iron, /area/station/maintenance/department/security) +"mCa" = ( +/obj/structure/table/glass, +/obj/item/paper_bin, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/safety_eye_protection/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/space_hut/observatory) "mCf" = ( /obj/structure/disposalpipe/trunk{ dir = 1 @@ -50412,9 +50476,12 @@ /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) "mDm" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) +/obj/machinery/quantum_server, +/obj/effect/turf_decal/bot/left, +/turf/open/floor/iron/dark/smooth_corner{ + dir = 4 + }, +/area/station/bitrunning/den) "mDo" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -50441,6 +50508,20 @@ dir = 4 }, /area/station/service/chapel) +"mDu" = ( +/obj/structure/table/reinforced, +/obj/item/analyzer{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/analyzer{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/assembly/signaler, +/obj/item/assembly/signaler, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "mDw" = ( /obj/structure/chair{ dir = 4 @@ -50495,7 +50576,7 @@ /turf/open/floor/iron, /area/station/service/kitchen/abandoned) "mDO" = ( -/obj/machinery/door/airlock/glass_large{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Laundromat" }, /obj/effect/turf_decal/stripes/line, @@ -50506,6 +50587,18 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/commons/dorms/laundry) +"mDP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Cargo - Warehouse"; + name = "cargo camera" + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "mDR" = ( /obj/machinery/vending/wardrobe/law_wardrobe, /obj/machinery/firealarm/directional/east, @@ -50581,13 +50674,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/kitchen/abandoned) -"mEL" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/security/range) "mFi" = ( /obj/structure/table/reinforced, /obj/item/storage/toolbox/emergency, @@ -50663,9 +50749,9 @@ /area/station/security/checkpoint/arrivals) "mGi" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/bot, /obj/machinery/status_display/ai/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/science/ordnance/storage) "mGk" = ( @@ -50685,13 +50771,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"mGo" = ( -/obj/effect/spawner/random/entertainment/arcade, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/abandoned_gambling_den/gaming) "mGq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -50766,17 +50845,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/commons/toilet/locker) -"mHc" = ( -/obj/structure/cable, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/status_display/ai/directional/north, -/turf/open/floor/iron, -/area/station/engineering/supermatter/room) "mHg" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/burnt_floor, @@ -50890,18 +50958,6 @@ /obj/effect/landmark/start/virologist, /turf/open/floor/iron/white, /area/station/medical/virology) -"mIi" = ( -/obj/machinery/light/directional/east, -/obj/item/radio/intercom/directional/east, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line, -/obj/structure/tank_holder/extinguisher{ - pixel_y = 8 - }, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/medical/chemistry) "mIs" = ( /turf/closed/wall, /area/station/command/gateway) @@ -51016,6 +51072,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) +"mJi" = ( +/obj/structure/sign/departments/science{ + name = "ROBOTICS"; + pixel_y = 32 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) "mJm" = ( /obj/machinery/door/firedoor/heavy, /obj/machinery/door/airlock/research/glass{ @@ -51151,18 +51218,6 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/dark, /area/station/security/execution/education) -"mKN" = ( -/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/firealarm/directional/east, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "mKO" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -51205,16 +51260,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/cargo/storage) -"mLE" = ( -/obj/structure/chair/sofa/bench{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/item/radio/intercom/directional/east, -/obj/effect/landmark/start/assistant, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "mLP" = ( /obj/effect/mapping_helpers/airlock/access/all/security/general, /obj/effect/turf_decal/stripes/line, @@ -51287,12 +51332,6 @@ }, /turf/open/floor/iron, /area/station/medical/medbay/lobby) -"mMW" = ( -/obj/structure/table/glass, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/official/science/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/space_hut/observatory) "mNo" = ( /obj/structure/tank_dispenser/oxygen, /obj/effect/turf_decal/bot, @@ -51333,6 +51372,19 @@ }, /turf/open/floor/iron, /area/station/medical/virology) +"mNL" = ( +/obj/machinery/disposal/bin{ + desc = "A pneumatic waste disposal unit. This one leads to the morgue."; + name = "corpse disposal" + }, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/medical/medbay) "mNX" = ( /obj/machinery/status_display/evac/directional/west, /obj/machinery/light/directional/west, @@ -51386,6 +51438,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/abandoned_gambling_den) +"mOo" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/station/tcommsat/server) "mOp" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/dirt, @@ -51398,32 +51454,21 @@ dir = 1 }, /area/station/engineering/atmos/pumproom) -"mOq" = ( -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "xeno6"; - name = "Containment Control"; - req_access = list("xenobiology") - }, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/science/xenobiology) "mOv" = ( /obj/machinery/holopad, /obj/structure/cable, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/hop) -"mOy" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/sign/painting/large/library_private{ - dir = 1; - pixel_x = -29 +"mOA" = ( +/obj/structure/chair/office/light{ + dir = 4 }, -/obj/structure/destructible/cult/item_dispenser/archives/library, -/obj/item/book/codex_gigas, -/turf/open/floor/iron/dark, -/area/station/service/library/printer) +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/purple{ + dir = 4 + }, +/turf/open/floor/glass, +/area/station/maintenance/space_hut/observatory) "mOB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -51497,6 +51542,19 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/wood, /area/station/commons/dorms) +"mPr" = ( +/obj/machinery/recharge_station, +/obj/effect/turf_decal/bot/right, +/obj/machinery/camera/directional/south{ + c_tag = "Engineering - Break Room"; + name = "engineering camera" + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "mPu" = ( /obj/structure/filingcabinet/security, /turf/open/floor/carpet, @@ -51551,22 +51609,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/primary/fore) -"mQp" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"mQt" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/light/directional/west, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/tile/brown/half/contrasted{ +"mQz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/poster/official/work_for_a_future/directional/south, +/obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 }, /turf/open/floor/iron, -/area/station/cargo/storage) +/area/station/security/prison/safe) "mQA" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/stool/bar/directional/west, @@ -51603,6 +51654,15 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/science/xenobiology) +"mQY" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Departures Lounge - Fore Starboard"; + dir = 6; + name = "departures camera" + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron/dark/corner, +/area/station/hallway/secondary/exit/departure_lounge) "mQZ" = ( /obj/machinery/gateway/centerstation, /obj/effect/decal/cleanable/dirt, @@ -51628,20 +51688,6 @@ }, /turf/open/floor/iron, /area/station/service/abandoned_gambling_den/gaming) -"mRh" = ( -/obj/structure/table, -/obj/item/stack/package_wrap, -/obj/machinery/light/small/directional/north, -/obj/item/storage/secure/safe/directional/north, -/obj/item/stack/package_wrap, -/obj/item/hand_labeler, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/turf/open/floor/iron, -/area/station/commons/vacant_room/commissary) "mRs" = ( /obj/structure/cable, /obj/effect/landmark/start/depsec/science, @@ -51652,13 +51698,6 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/medical/medsci) -"mRt" = ( -/obj/structure/table, -/obj/machinery/status_display/evac/directional/west, -/obj/machinery/light/directional/west, -/obj/item/pai_card, -/turf/open/floor/iron/white, -/area/station/science/lobby) "mRv" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -51673,15 +51712,26 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"mRZ" = ( +/obj/machinery/autolathe, +/obj/machinery/light_switch/directional/south{ + pixel_x = -20 + }, +/obj/machinery/firealarm/directional/west, +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/office) +"mSc" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "mSe" = ( /turf/closed/wall/r_wall, /area/station/security/prison/safe) -"mSp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/oil, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "mSA" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -51691,6 +51741,13 @@ /mob/living/carbon/human/species/monkey/punpun, /turf/open/floor/carpet/green, /area/station/commons/lounge) +"mSD" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/fore) "mSG" = ( /obj/structure/cable, /obj/machinery/light/small/directional/north, @@ -51707,16 +51764,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) -"mSM" = ( -/obj/structure/chair/office/light{ - dir = 4 - }, +"mSP" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/purple{ - dir = 4 - }, -/turf/open/floor/glass, -/area/station/maintenance/space_hut/observatory) +/obj/structure/table/wood, +/obj/machinery/barsign/all_access/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/abandoned_gambling_den) "mSZ" = ( /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/medical/general, @@ -51786,6 +51839,14 @@ dir = 8 }, /area/station/science/lobby) +"mUD" = ( +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/siding/dark_red, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/medical) "mUJ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -51871,6 +51932,16 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"mVI" = ( +/obj/structure/table, +/obj/machinery/microwave{ + desc = "Cooks and boils stuff, somehow."; + pixel_y = 5 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/service/kitchen/abandoned) "mVO" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/camera/directional/west{ @@ -51939,13 +52010,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/security) -"mWD" = ( -/obj/structure/chair/sofa/right/brown, -/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/service/library) "mWE" = ( /obj/machinery/duct, /obj/effect/decal/cleanable/dirt, @@ -52017,16 +52081,6 @@ /obj/item/clothing/mask/cigarette/cigar, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/captain) -"mXt" = ( -/obj/structure/table/wood, -/obj/item/camera, -/obj/machinery/light/small/directional/south, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, -/obj/item/hand_labeler, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) "mXy" = ( /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/hop) @@ -52060,21 +52114,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/storage/gas) -"mYl" = ( -/obj/machinery/hydroponics/constructable, -/obj/item/radio/intercom/directional/north, -/obj/machinery/light/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Service - Hydroponics Front Fore"; - dir = 6; - name = "service camera" - }, -/obj/effect/turf_decal/tile/green/opposingcorners, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) "mYo" = ( /obj/effect/turf_decal/trimline/yellow/line, /turf/open/floor/iron, @@ -52087,6 +52126,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) +"mYr" = ( +/obj/structure/sign/warning/secure_area/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Atmospherics - Fore Tanks"; + name = "atmospherics camera" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "mYs" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -52110,16 +52158,6 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, /area/station/maintenance/port) -"mZd" = ( -/obj/machinery/door/window/brigdoor{ - dir = 1; - name = "Creature Pen"; - req_access = list("research") - }, -/obj/structure/cable, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/science/xenobiology) "mZj" = ( /obj/machinery/atmospherics/components/trinary/mixer{ color = "#FFFF00"; @@ -52187,36 +52225,6 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) -"mZA" = ( -/obj/machinery/door/window/left/directional/west, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Justice gas pump" - }, -/obj/effect/turf_decal/siding/dark_red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"mZH" = ( -/obj/structure/rack, -/obj/item/gun/energy/disabler{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/gun/energy/disabler, -/obj/item/gun/energy/disabler{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/effect/turf_decal/bot, -/obj/structure/window/reinforced/spawner/directional/east{ - pixel_x = 3 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "mZK" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 @@ -52297,6 +52305,19 @@ }, /turf/open/floor/iron, /area/station/security/warden) +"nbs" = ( +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/warning, +/obj/effect/turf_decal/trimline/neutral/mid_joiner, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark/textured_half, +/area/station/medical/morgue) "nbv" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -52314,14 +52335,6 @@ }, /turf/open/floor/iron, /area/station/security/prison/safe) -"nbx" = ( -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "nbI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /obj/machinery/meter, @@ -52362,14 +52375,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible, /turf/open/floor/iron, /area/station/engineering/supermatter/room) -"ncg" = ( -/obj/structure/reagent_dispensers/wall/peppertank/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/burnt_floor, -/obj/structure/sign/poster/official/space_cops/directional/south, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/maintenance/department/security) "ncu" = ( /obj/structure/table/wood, /obj/item/paper_bin, @@ -52377,13 +52382,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/hop) -"ncw" = ( -/obj/item/kirbyplants/random, -/obj/machinery/light/small/directional/south, -/obj/machinery/newscaster/directional/south, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/service/library/abandoned) "ncE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -52442,6 +52440,22 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, /area/station/service/chapel) +"ncT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/reinforced, +/obj/item/storage/box/lights/mixed, +/obj/machinery/airalarm/directional/north, +/obj/item/stock_parts/cell/high/empty, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"ncY" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/library) "ncZ" = ( /obj/machinery/ai_slipper{ uses = 10 @@ -52481,6 +52495,16 @@ }, /turf/open/floor/iron/grimy, /area/station/service/chapel) +"ndY" = ( +/obj/structure/closet/secure_closet/brig{ + name = "Prisoner Locker" + }, +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/execution/transfer) "nea" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/brown{ @@ -52524,6 +52548,16 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) +"neK" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Bridge - Starboard"; + name = "command camera" + }, +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "neN" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -52531,6 +52565,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"neT" = ( +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/surgery_tray/full/morgue, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "nfd" = ( /obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/engine/plasma, @@ -52574,18 +52619,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/robotics/mechbay) -"nfT" = ( -/obj/effect/turf_decal/box/white/corners{ - dir = 1 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Xenobiology - Cell 6"; - name = "xenobiology camera"; - network = list("ss13","xeno","rd") - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "nfX" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/extinguisher_cabinet/directional/north, @@ -52607,6 +52640,25 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"ngb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"ngc" = ( +/obj/structure/sign/poster/official/cleanliness/directional/north, +/obj/item/radio/intercom/directional/east, +/obj/machinery/holopad, +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/large, +/area/station/medical/break_room) "ngp" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -52627,13 +52679,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/port) -"ngD" = ( -/obj/structure/table/wood, -/obj/machinery/light/directional/north, -/obj/item/paper_bin, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/tcommsat/computer) "ngQ" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/line, @@ -52642,6 +52687,17 @@ }, /turf/open/floor/iron, /area/station/science/lobby) +"ngR" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/obj/machinery/status_display/evac/directional/west, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/engineering/lobby) "ngX" = ( /obj/structure/table, /obj/item/multitool/circuit{ @@ -52659,8 +52715,14 @@ /turf/open/floor/plating, /area/station/maintenance/department/chapel) "nhj" = ( -/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/table, +/obj/machinery/microwave{ + desc = "Cooks and boils stuff, somehow."; + pixel_x = -3; + pixel_y = 5 + }, +/obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/iron, /area/station/cargo/miningoffice) "nhm" = ( @@ -52704,6 +52766,14 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) +"nhC" = ( +/obj/structure/table, +/obj/item/storage/box/bodybags, +/obj/effect/spawner/random/maintenance, +/obj/structure/cable, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/department/security) "nhE" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ @@ -52848,19 +52918,6 @@ /obj/structure/sign/warning/vacuum/external, /turf/closed/wall, /area/station/maintenance/starboard/aft) -"njC" = ( -/obj/structure/table/reinforced, -/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/crowbar, -/obj/item/grenade/chem_grenade/smart_metal_foam, -/obj/item/grenade/chem_grenade/smart_metal_foam, -/obj/structure/sign/poster/official/report_crimes/directional/north, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/engineering/storage) "njI" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/east, @@ -52940,11 +52997,28 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/dark, /area/station/command/bridge) +"nkV" = ( +/obj/item/kirbyplants/random, +/obj/machinery/status_display/ai/directional/east, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "nkW" = ( /obj/structure/closet, /obj/effect/spawner/random/maintenance/two, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"nlc" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) "nlm" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/virology{ @@ -53012,6 +53086,15 @@ }, /turf/open/floor/iron/white, /area/station/science/lobby) +"nlK" = ( +/obj/machinery/rnd/production/protolathe/department/science, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/sign/departments/science/alt/directional/east, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron, +/area/station/science/lab) "nlS" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -53028,25 +53111,6 @@ dir = 4 }, /area/station/security/brig) -"nlZ" = ( -/obj/item/grenade/barrier{ - pixel_x = -3; - pixel_y = 1 - }, -/obj/item/grenade/barrier, -/obj/item/grenade/barrier{ - pixel_x = 3; - pixel_y = -1 - }, -/obj/item/grenade/barrier{ - pixel_x = 6; - pixel_y = -2 - }, -/obj/structure/table/reinforced, -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "nma" = ( /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -53115,6 +53179,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"nmU" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "nmX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -53131,12 +53204,31 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"nnG" = ( +/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/central/fore) "nnM" = ( /obj/effect/landmark/start/hangover, /obj/effect/decal/cleanable/dirt, /obj/structure/chair/stool/bar/directional/east, /turf/open/floor/carpet/green, /area/station/commons/lounge) +"nnR" = ( +/obj/machinery/airalarm/directional/west, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) "nnW" = ( /obj/machinery/shower/directional/west, /obj/item/soap/homemade, @@ -53285,6 +53377,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) +"npQ" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/storage/toolbox/mechanical, +/obj/item/clothing/glasses/meson/engine/tray, +/turf/open/floor/iron, +/area/station/engineering/atmos) "npR" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 4 @@ -53303,37 +53404,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"nqe" = ( -/obj/structure/sign/poster/official/science/directional/west, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/status_display/ai/directional/north, -/obj/structure/rack, -/obj/item/clothing/under/rank/medical/scrubs/purple{ - pixel_x = 6; - pixel_y = 5 - }, -/obj/item/clothing/under/rank/medical/scrubs/purple{ - pixel_x = 6; - pixel_y = 5 - }, -/obj/item/clothing/under/rank/medical/scrubs/blue{ - pixel_x = -4; - pixel_y = 5 - }, -/obj/item/clothing/under/rank/medical/scrubs/blue{ - pixel_x = -4; - pixel_y = 5 - }, -/obj/item/clothing/under/rank/medical/scrubs/green{ - pixel_x = 1; - pixel_y = 3 - }, -/obj/item/clothing/under/rank/medical/scrubs/green{ - pixel_x = 1; - pixel_y = 3 - }, -/turf/open/floor/engine, -/area/station/science/genetics) "nqf" = ( /obj/structure/chair/comfy/brown, /obj/structure/cable, @@ -53377,19 +53447,6 @@ }, /turf/open/floor/iron, /area/station/science/xenobiology) -"nqV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/frame/machine, -/obj/item/stack/cable_coil/five, -/obj/item/multitool{ - pixel_x = 5; - pixel_y = -5 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/supermatter/room) "nrd" = ( /obj/item/kirbyplants/random, /obj/machinery/camera/directional/south{ @@ -53486,6 +53543,17 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/port) +"nsV" = ( +/obj/structure/table/reinforced, +/obj/structure/reagent_dispensers/wall/peppertank/directional/west, +/obj/item/electropack, +/obj/item/assembly/signaler, +/obj/item/clothing/head/helmet/sec, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/execution/education) "nsW" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, @@ -53538,6 +53606,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"ntP" = ( +/obj/effect/turf_decal/bot, +/obj/item/radio/intercom/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) "ntU" = ( /obj/structure/table/reinforced, /obj/machinery/microwave, @@ -53581,6 +53655,13 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"nus" = ( +/obj/machinery/status_display/evac/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "nuz" = ( /obj/effect/spawner/random/trash/garbage{ spawn_scatter_radius = 1 @@ -53635,16 +53716,6 @@ /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/iron, /area/station/maintenance/department/science) -"nuS" = ( -/obj/effect/turf_decal/bot, -/obj/structure/rack, -/obj/item/controller, -/obj/item/controller, -/obj/item/compact_remote, -/obj/item/compact_remote, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/circuits) "nuV" = ( /obj/effect/landmark/start/assistant, /obj/structure/chair/sofa/bench{ @@ -53721,18 +53792,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/lobby) -"nwl" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/scrubber, -/obj/effect/turf_decal/box/white, -/obj/machinery/camera/directional/east{ - c_tag = "Dormitories - Pumps"; - name = "dormitories camera" - }, -/turf/open/floor/iron/dark, -/area/station/commons/locker) "nwn" = ( /obj/structure/table/reinforced, /obj/item/hfr_box/body/waste_output, @@ -53801,6 +53860,11 @@ "nxb" = ( /turf/closed/wall, /area/station/hallway/secondary/exit/departure_lounge) +"nxd" = ( +/obj/item/kirbyplants/random, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/station/command/meeting_room/council) "nxf" = ( /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 4 @@ -53808,21 +53872,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos) -"nxg" = ( -/obj/machinery/light/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Central Hallway - Port"; - name = "hallway camera" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) -"nxl" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall, -/area/station/cargo/sorting) "nxn" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -53842,6 +53891,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/abandoned_gambling_den) +"nxG" = ( +/obj/machinery/modular_computer/preset/id{ + dir = 4 + }, +/obj/machinery/requests_console/directional/west{ + department = "Captain's Desk"; + name = "Captain's Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain) "nxR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -53990,17 +54052,6 @@ }, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) -"nzn" = ( -/obj/machinery/light/small/directional/east, -/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, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/department/science) "nzp" = ( /obj/machinery/air_sensor/oxygen_tank, /turf/open/floor/engine/o2, @@ -54021,18 +54072,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/xenobiology) -"nzw" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/trunk, -/obj/machinery/camera/directional/north{ - c_tag = "Security - Office Fore"; - dir = 9 - }, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/office) "nzx" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -54061,6 +54100,22 @@ }, /turf/open/space/basic, /area/space) +"nzM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/sign/warning/secure_area/directional/north, +/turf/open/floor/engine, +/area/station/science/explab) +"nzP" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/layer_manifold/cyan/visible, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/status_display/ai/directional/west, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "nzR" = ( /obj/structure/disposalpipe/segment, /obj/structure/extinguisher_cabinet/directional/west, @@ -54094,6 +54149,11 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron, /area/station/security/checkpoint/medical/medsci) +"nAy" = ( +/obj/structure/cable, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/grimy, +/area/station/service/chapel) "nAz" = ( /obj/machinery/pdapainter, /obj/machinery/status_display/evac/directional/east, @@ -54135,16 +54195,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos) -"nBf" = ( -/obj/structure/table/reinforced, -/obj/item/electronics/firelock, -/obj/item/electronics/firelock, -/obj/item/electronics/firealarm, -/obj/item/electronics/firealarm, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) +"nBb" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/newscaster/directional/west, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "nBh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/stripes/line{ @@ -54215,31 +54274,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) -"nCb" = ( -/obj/item/book/manual/wiki/ordnance{ - pixel_x = 4; - pixel_y = 1 - }, -/obj/item/computer_disk{ - pixel_y = 4 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/item/computer_disk{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/computer_disk, -/obj/item/computer_disk/ordnance{ - pixel_x = -4; - pixel_y = -1 - }, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/ordnance/office) "nCd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/delivery, @@ -54292,14 +54326,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/breakroom) -"nDd" = ( -/obj/machinery/duct, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) "nDk" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/conveyor{ @@ -54334,11 +54360,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"nDz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "nDJ" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 6 @@ -54401,17 +54422,6 @@ "nEc" = ( /turf/closed/wall, /area/station/science/research/abandoned) -"nEg" = ( -/obj/structure/table/reinforced, -/obj/item/electronics/airalarm, -/obj/item/electronics/apc, -/obj/machinery/camera/directional/west{ - c_tag = "Technology Storage"; - name = "engineering camera" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "nEk" = ( /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 8 @@ -54436,11 +54446,11 @@ /turf/open/floor/iron, /area/station/maintenance/port) "nEE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) +/obj/machinery/netpod, +/obj/structure/sign/poster/random/directional/north, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/bitrunning/den) "nEJ" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/yellow/line, @@ -54451,42 +54461,10 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/department/electrical) -"nEO" = ( -/obj/machinery/light/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/status_display/ai/directional/east, -/turf/open/floor/iron, -/area/station/engineering/supermatter/room) "nET" = ( /obj/structure/sign/warning/electric_shock/directional/east, /turf/open/space/basic, /area/space) -"nEW" = ( -/obj/structure/rack, -/obj/item/gun/energy/laser{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/gun/energy/laser, -/obj/item/gun/energy/laser{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/effect/turf_decal/bot, -/obj/structure/window/reinforced/spawner/directional/east{ - pixel_x = 3 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"nEY" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/sign/departments/xenobio/directional/east, -/turf/open/floor/iron, -/area/station/maintenance/department/science) "nFb" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/generic_maintenance_landmark, @@ -54501,15 +54479,6 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron, /area/station/service/hydroponics) -"nFq" = ( -/obj/machinery/computer/warrant{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "nFr" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -54529,6 +54498,11 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"nFN" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/machinery/photocopier, +/turf/open/floor/wood, +/area/station/engineering/break_room) "nFO" = ( /obj/machinery/firealarm/directional/east, /obj/structure/extinguisher_cabinet/directional/north, @@ -54566,6 +54540,19 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/science) +"nGC" = ( +/obj/machinery/vending/hydroseeds, +/obj/machinery/light_switch/directional/north{ + pixel_x = -8 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden) +"nGN" = ( +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "nGS" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -54750,11 +54737,6 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/lockers) -"nIr" = ( -/obj/machinery/computer/security/telescreen/entertainment/directional/east, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/security/prison) "nIz" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -54821,6 +54803,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) +"nJh" = ( +/obj/machinery/firealarm/directional/north, +/obj/item/stack/medical/gauze, +/obj/item/stack/medical/mesh, +/obj/structure/table/reinforced/rglass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron, +/area/station/medical/treatment_center) "nJj" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -54833,16 +54824,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) -"nJl" = ( -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/structure/sign/warning/deathsposal/directional/south, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/hfr_room) "nJx" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -54873,9 +54854,22 @@ /turf/open/floor/iron, /area/station/hallway/primary/starboard) "nJK" = ( -/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_ordmix, +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_ordmix{ + dir = 1 + }, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) +"nJL" = ( +/obj/machinery/status_display/ai/directional/south, +/obj/machinery/camera/directional/south{ + c_tag = "Bridge - E.V.A. Aft"; + name = "command camera" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) "nJP" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -54884,12 +54878,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"nJV" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/hydroponics/soil, -/obj/item/shovel/spade, +"nJQ" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, /turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden/abandoned) +/area/station/medical/morgue) "nJW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -54909,14 +54903,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/plating, /area/station/security/execution/transfer) -"nKe" = ( -/obj/structure/bed, -/obj/item/bedsheet/dorms, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/hangover, -/obj/item/pillow/random, -/turf/open/floor/wood, -/area/station/commons/dorms) "nKA" = ( /obj/effect/spawner/structure/window, /obj/machinery/door/poddoor/preopen{ @@ -54925,6 +54911,12 @@ }, /turf/open/floor/plating, /area/station/science/research) +"nKC" = ( +/obj/structure/table, +/obj/machinery/status_display/evac/directional/west, +/obj/item/pai_card, +/turf/open/floor/iron/white, +/area/station/science/lobby) "nKD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -54932,22 +54924,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"nKN" = ( -/obj/structure/cable, -/obj/machinery/modular_computer/console/preset/engineering{ - dir = 4 +"nKE" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Security - Head of Security's Office"; + dir = 9 }, -/obj/effect/turf_decal/bot, +/obj/structure/bed/dogbed/lia, +/obj/item/radio/intercom/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/west, /turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) -"nKS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/sign/poster/official/moth_piping/directional/west, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +/area/station/command/heads_quarters/hos) "nLt" = ( /obj/effect/turf_decal/trimline/yellow/line{ dir = 4 @@ -54955,13 +54943,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/lobby) -"nLB" = ( -/obj/item/storage/box/rxglasses, -/obj/machinery/light/directional/south, -/obj/structure/table/reinforced/rglass, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron, -/area/station/medical/treatment_center) "nLF" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -54994,14 +54975,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, /area/station/hallway/primary/central/fore) -"nLX" = ( -/obj/machinery/light/directional/west, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/office) "nLY" = ( /obj/item/kirbyplants/random, /obj/machinery/status_display/ai/directional/east, @@ -55172,6 +55145,15 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) +"nOk" = ( +/obj/item/kirbyplants/random, +/obj/machinery/status_display/ai/directional/west, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "nOn" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/photocopier, @@ -55194,18 +55176,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/xenobiology) +"nOx" = ( +/obj/structure/closet/radiation, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/main) "nOy" = ( /obj/structure/lattice, /obj/structure/window/reinforced/spawner/directional/west, /turf/open/space, /area/space/nearstation) -"nOz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/obj/structure/sign/warning/vacuum/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) "nOB" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -55301,6 +55283,20 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"nPO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/rack, +/obj/item/weldingtool, +/obj/item/wrench, +/obj/item/clothing/head/utility/welding, +/obj/item/clothing/gloves/color/yellow, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room) "nPQ" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -55332,10 +55328,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/engineering/atmos) -"nQa" = ( -/obj/item/kirbyplants/random, -/turf/open/floor/plating, -/area/station/service/abandoned_gambling_den) "nQg" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 4 @@ -55387,26 +55379,6 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) -"nQP" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"nQQ" = ( -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/obj/machinery/disposal/delivery_chute{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/cargo/sorting) "nQS" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -55463,17 +55435,6 @@ /obj/effect/turf_decal/trimline/purple/filled/corner, /turf/open/floor/iron/white, /area/station/science/lobby) -"nRs" = ( -/obj/effect/turf_decal/tile/yellow/diagonal_edge, -/obj/effect/turf_decal/tile/red/diagonal_centre, -/obj/structure/sign/poster/official/cleanliness/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Science - Break Room"; - name = "science camera"; - network = list("ss13","rd") - }, -/turf/open/floor/iron/diagonal, -/area/station/science/breakroom) "nRv" = ( /obj/effect/spawner/random/maintenance, /obj/effect/spawner/random/trash/bin, @@ -55552,6 +55513,16 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron, /area/station/engineering/lobby) +"nSL" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay) "nSR" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -55581,10 +55552,6 @@ }, /turf/open/floor/iron, /area/station/service/kitchen/abandoned) -"nTj" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/closed/wall, -/area/station/maintenance/department/medical/morgue) "nTn" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/neutral/filled/corner{ @@ -55614,6 +55581,14 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/science) +"nTU" = ( +/obj/structure/bed, +/obj/item/bedsheet/dorms, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/hangover, +/obj/item/pillow/random, +/turf/open/floor/wood, +/area/station/commons/dorms) "nUc" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ dir = 4 @@ -55641,21 +55616,6 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/large, /area/station/security/brig) -"nUv" = ( -/obj/structure/sign/poster/party_game/directional/west, -/obj/structure/table, -/obj/item/storage/secure/briefcase{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/briefcase{ - pixel_y = -2 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "nUG" = ( /obj/machinery/requests_console/directional/south{ department = "Service Hall"; @@ -55664,21 +55624,6 @@ /obj/effect/mapping_helpers/requests_console/supplies, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) -"nUI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/smooth, -/area/station/hallway/secondary/entry) "nUL" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -55693,18 +55638,6 @@ }, /turf/open/space/basic, /area/space/nearstation) -"nUY" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/camera{ - c_tag = "Cargo Bay - Drone Bay"; - dir = 4; - name = "cargo camera" - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "nVf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55765,11 +55698,24 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/fore) +"nVH" = ( +/obj/effect/turf_decal/bot, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) "nVQ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/science/research/abandoned) +"nWc" = ( +/obj/machinery/restaurant_portal/restaurant, +/obj/effect/turf_decal/delivery/red, +/obj/item/radio/intercom/directional/west, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/white/smooth_large, +/area/station/service/cafeteria) "nWg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55816,6 +55762,13 @@ }, /turf/open/floor/wood, /area/station/hallway/secondary/service) +"nWY" = ( +/obj/structure/closet/secure_closet/security/sec, +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/lockers) "nXj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -55841,11 +55794,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/courtroom) -"nXs" = ( -/obj/structure/table, -/obj/item/flashlight/lamp, -/turf/open/floor/iron/checker, -/area/station/hallway/secondary/service) "nXv" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, @@ -55894,24 +55842,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) -"nYa" = ( -/obj/structure/table/reinforced, -/obj/item/stack/cable_coil{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/stack/cable_coil, -/obj/item/stock_parts/scanning_module{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/stock_parts/capacitor, -/obj/item/stock_parts/servo, -/obj/item/stock_parts/servo, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "nYg" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor, @@ -55967,34 +55897,10 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) -"nYG" = ( -/obj/structure/table/reinforced, -/obj/item/analyzer{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/item/analyzer{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/item/assembly/signaler, -/obj/item/assembly/signaler, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "nYJ" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"nYS" = ( -/obj/machinery/door/window/brigdoor{ - name = "Creature Pen"; - req_access = list("research") - }, -/obj/structure/cable, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/science/xenobiology) "nYV" = ( /obj/item/radio/intercom/directional/east, /obj/effect/turf_decal/tile/yellow{ @@ -56046,13 +55952,6 @@ dir = 4 }, /area/station/commons/fitness/recreation) -"nZt" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/item/kirbyplants/random, -/obj/machinery/light/small/directional/north, -/turf/open/floor/wood, -/area/station/security/detectives_office/private_investigators_office) "nZx" = ( /obj/structure/chair/office{ dir = 1 @@ -56060,6 +55959,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/cargo/drone_bay) +"nZA" = ( +/obj/structure/table/wood, +/obj/item/assembly/igniter, +/obj/item/assembly/igniter, +/obj/item/assembly/timer{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron/dark, +/area/station/service/abandoned_gambling_den) "nZC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -56108,23 +56018,24 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/execution/transfer) -"oaS" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/light/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/official/safety_internals/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos/pumproom) "oaU" = ( /obj/effect/spawner/random/trash/grille_or_waste, /turf/open/floor/plating, /area/station/maintenance/department/chapel) +"oaZ" = ( +/obj/structure/sign/painting/library_private{ + pixel_y = -32 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/modular_computer/preset/curator{ + dir = 1 + }, +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/library/printer) "obc" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, @@ -56171,16 +56082,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/service/hydroponics/garden) -"obH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) "obI" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 4 @@ -56241,17 +56142,6 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron, /area/station/security/range) -"ocr" = ( -/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, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/lobby) "ocx" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Teleporter Maintenance" @@ -56341,6 +56231,17 @@ /obj/structure/closet/emcloset, /turf/open/floor/plating, /area/station/hallway/secondary/entry) +"odc" = ( +/obj/structure/reagent_dispensers/water_cooler, +/obj/machinery/newscaster/directional/south, +/obj/machinery/camera/directional/east{ + c_tag = "Medbay - Paramedic Dispatch"; + name = "medbay camera"; + network = list("ss13","medbay") + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron/white, +/area/station/medical/paramedic) "odd" = ( /obj/docking_port/stationary/random{ name = "lavaland"; @@ -56401,6 +56302,11 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"odX" = ( +/obj/effect/spawner/random/maintenance/two, +/obj/structure/closet, +/turf/open/floor/plating, +/area/station/maintenance/fore) "oec" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating/airless, @@ -56419,15 +56325,6 @@ }, /turf/open/floor/iron, /area/station/security/prison/safe) -"oez" = ( -/obj/machinery/recharge_station, -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/bot/left, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "oeW" = ( /obj/structure/table/wood, /obj/effect/decal/cleanable/dirt, @@ -56494,6 +56391,18 @@ }, /turf/open/floor/plating, /area/station/command/heads_quarters/qm) +"ofC" = ( +/obj/machinery/status_display/evac/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/directional/east{ + c_tag = "Arrivals Dock - Fore Port"; + name = "dock camera" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "ofE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/stripes/line{ @@ -56525,14 +56434,6 @@ }, /turf/open/floor/plating, /area/station/cargo/storage) -"ofR" = ( -/obj/machinery/light/directional/west, -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "ofY" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -56565,16 +56466,6 @@ }, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/hop) -"ogA" = ( -/obj/structure/table/reinforced, -/obj/item/folder/white, -/obj/item/stock_parts/cell/high, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "ogG" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -56615,6 +56506,12 @@ "ogZ" = ( /turf/open/floor/iron, /area/station/service/hydroponics) +"ohb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/science/auxlab/firing_range) "ohj" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ @@ -56686,18 +56583,13 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/engineering/storage/tech) -"oia" = ( -/obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 4; - name = "killroom vent" - }, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/siding/dark_blue{ - dir = 4 - }, +"oif" = ( +/obj/structure/cable, +/obj/item/kirbyplants/random, +/obj/machinery/newscaster/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/telecomms, -/area/station/science/xenobiology) +/turf/open/floor/iron/dark, +/area/station/command/bridge) "oig" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -56706,11 +56598,22 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"oij" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) +"ois" = ( +/obj/structure/table/glass, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/science/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/space_hut/observatory) +"oit" = ( +/obj/structure/table/wood, +/obj/machinery/light/directional/north, +/obj/item/storage/secure/safe/directional/east, +/obj/item/storage/lockbox/loyalty, +/obj/item/storage/backpack/satchel/leather/withwallet{ + pixel_y = 6 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "oiC" = ( /obj/machinery/computer/records/security{ dir = 8 @@ -56775,6 +56678,10 @@ dir = 1 }, /area/station/hallway/primary/central/aft) +"ojz" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/station/science/research/abandoned) "ojB" = ( /obj/effect/landmark/start/hangover, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -56814,6 +56721,15 @@ /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/freezerchamber) +"ojV" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/turf_decal/siding/white, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/hallway/primary/fore) "ojW" = ( /obj/machinery/light/small/directional/west, /obj/structure/sign/warning/vacuum/directional/east, @@ -56902,12 +56818,23 @@ /turf/open/floor/iron, /area/station/security/prison/garden) "okN" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/generic, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/landmark/start/bitrunner, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "okV" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/reagent_dispensers/plumbed{ @@ -56976,6 +56903,31 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/sepia, /area/station/service/library/artgallery) +"olD" = ( +/obj/item/kirbyplants/random, +/obj/structure/sign/poster/official/ian/directional/south, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) +"olI" = ( +/obj/machinery/computer/shuttle/mining{ + dir = 8 + }, +/obj/item/radio/intercom/directional/east{ + pixel_y = 3 + }, +/obj/machinery/button/door/directional/east{ + id = "qmroom"; + name = "Privacy Control"; + pixel_y = -6 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/command/heads_quarters/qm) "olQ" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -57036,11 +56988,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"omp" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) "omv" = ( /obj/structure/table, /obj/item/flashlight/lamp, @@ -57055,20 +57002,14 @@ }, /turf/open/floor/iron, /area/station/science/auxlab/firing_range) -"omC" = ( -/obj/structure/table/glass, -/obj/item/storage/medkit/regular, -/obj/item/reagent_containers/spray/cleaner{ - pixel_x = -15; - pixel_y = 2 +"omF" = ( +/obj/machinery/duct, +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 }, -/obj/item/reagent_containers/cup/bottle/multiver, -/obj/item/reagent_containers/syringe, -/obj/structure/sign/poster/official/cleanliness/directional/east, -/obj/machinery/vending/wallmed/directional/north, -/obj/effect/turf_decal/siding/dark_red, -/turf/open/floor/iron/dark, -/area/station/security/medical) +/turf/open/floor/iron/dark/smooth_half, +/area/station/medical/morgue) "omI" = ( /obj/machinery/door/airlock{ name = "Custodial Closet" @@ -57081,6 +57022,29 @@ /obj/effect/mapping_helpers/airlock/access/all/service/janitor, /turf/open/floor/iron/checker, /area/station/service/janitor) +"omU" = ( +/obj/machinery/status_display/evac/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Courtroom - Center" + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/security/courtroom) +"omW" = ( +/obj/structure/bed, +/obj/item/bedsheet/orange, +/obj/machinery/camera/directional/east{ + c_tag = "Permabrig - Cell 5"; + network = list("ss13","prison") + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/status_display/ai/directional/north, +/obj/structure/sign/poster/official/obey/directional/east, +/turf/open/floor/plating, +/area/station/security/prison/safe) "omY" = ( /obj/machinery/status_display/evac/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -57149,16 +57113,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/security/execution/transfer) -"ooa" = ( -/obj/machinery/modular_computer/console/preset/cargochat/engineering{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 5 - }, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) "ooc" = ( /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/tile/neutral/full, @@ -57292,6 +57246,13 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/service/library) +"opG" = ( +/obj/machinery/duct, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/project) "opX" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -57354,6 +57315,19 @@ }, /turf/open/floor/iron/white/side, /area/station/science/lobby) +"oqR" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/random/contraband/prison, +/obj/effect/spawner/random/contraband/prison, +/obj/item/stack/license_plates/empty/fifty, +/obj/item/stack/license_plates/empty/fifty, +/obj/item/stack/license_plates/empty/fifty, +/obj/item/stack/license_plates/empty/fifty, +/obj/item/stack/license_plates/empty/fifty, +/obj/item/stack/license_plates/empty/fifty, +/obj/item/radio/intercom/prison/directional/south, +/turf/open/floor/iron, +/area/station/security/prison/work) "orh" = ( /obj/structure/table/reinforced, /obj/effect/spawner/random/entertainment/cigarette_pack, @@ -57431,6 +57405,14 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) +"osO" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/obj/item/radio/intercom/directional/north, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, +/turf/open/floor/iron, +/area/station/command/heads_quarters/rd) "osR" = ( /obj/structure/table/wood, /obj/structure/disposalpipe/segment, @@ -57543,27 +57525,33 @@ }, /turf/open/floor/iron/large, /area/station/science/auxlab/firing_range) -"ouZ" = ( -/obj/structure/cable, -/obj/machinery/status_display/evac/directional/east, -/obj/machinery/light/directional/east, -/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/engineering/gravity_generator) "ovb" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrous_input{ dir = 4 }, /turf/open/floor/engine/n2o, /area/station/engineering/atmos) +"ovc" = ( +/obj/structure/bodycontainer/crematorium{ + id = "crematoriumChapel" + }, +/obj/machinery/light/small/red/directional/north, +/turf/open/floor/iron/dark/smooth_large, +/area/station/service/chapel/funeral) "ovf" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/department/chapel) +"ovx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/status_display/ai/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron, +/area/station/science/robotics/mechbay) "ovH" = ( /obj/structure/rack, /obj/item/crowbar, @@ -57707,11 +57695,10 @@ /turf/open/floor/iron, /area/station/maintenance/port) "owZ" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/turf_decal/tile/purple/half/contrasted, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/table, +/obj/item/storage/medkit/regular, +/obj/machinery/light/directional/west, /turf/open/floor/iron, /area/station/cargo/miningoffice) "oxb" = ( @@ -57760,6 +57747,24 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/maintenance/port/fore) +"oyj" = ( +/obj/structure/rack, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/effect/turf_decal/bot, +/obj/structure/sign/poster/contraband/free_drone/directional/south, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, +/turf/open/floor/iron/dark, +/area/station/maintenance/port) +"oyu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/delivery, +/obj/structure/closet/radiation, +/obj/item/radio/intercom/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "oyy" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 1 @@ -57908,19 +57913,14 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron, /area/station/commons/lounge) -"oAn" = ( -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/obj/item/kirbyplants/random, -/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 = "Library - Fore Starboard"; - dir = 9; - name = "library camera" +"oAc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/office/light, +/obj/effect/turf_decal/siding/purple{ + dir = 4 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/library) +/turf/open/floor/glass, +/area/station/maintenance/space_hut/observatory) "oAu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/table, @@ -57944,26 +57944,28 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/captain/private) -"oAT" = ( -/obj/machinery/power/energy_accumulator/tesla_coil, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/south{ - c_tag = "Engineering - Secure Storage"; - name = "engineering camera" - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/engineering/main) "oAV" = ( -/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/siding/thinplating_new/dark{ + dir = 4 }, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/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/dark/textured_large, +/area/station/bitrunning/den) "oAW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -57974,16 +57976,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"oBn" = ( -/obj/structure/closet/emcloset/anchored, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/corner{ +"oBd" = ( +/obj/machinery/newscaster/directional/east, +/obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 4 }, -/obj/structure/sign/warning/vacuum/directional/north, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) +/turf/open/floor/iron/white, +/area/station/medical/medbay) "oBq" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/engineering/tracking_beacon, @@ -58152,13 +58151,6 @@ "oDE" = ( /turf/closed/wall, /area/station/medical/cryo) -"oDJ" = ( -/obj/machinery/gulag_teleporter, -/obj/effect/turf_decal/bot_red, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/processing) "oDR" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -58206,6 +58198,20 @@ /obj/structure/flora/bush/flowers_pp, /turf/open/floor/grass, /area/station/medical/virology) +"oEf" = ( +/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{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"oEp" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/grassy/style_random, +/turf/open/misc/grass, +/area/station/hallway/primary/fore) "oEy" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/effect/turf_decal/stripes/line{ @@ -58257,17 +58263,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"oFh" = ( -/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/status_display/evac/directional/north, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "oFi" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -58296,32 +58291,6 @@ }, /turf/open/floor/engine, /area/station/science/genetics) -"oFt" = ( -/obj/machinery/light/directional/north, -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/medical_kiosk, -/obj/machinery/camera/directional/north{ - c_tag = "Medbay - Lobby"; - name = "medbay camera"; - network = list("ss13","medbay") - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"oFu" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = 32; - pixel_y = -32 - }, -/obj/machinery/light/small/directional/south, -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "oFv" = ( /obj/docking_port/stationary/syndicate/northeast{ dir = 8 @@ -58335,6 +58304,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"oFI" = ( +/obj/machinery/requests_console/directional/east{ + department = "Quartermaster's Desk"; + name = "Quartermaster's Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted, +/turf/open/floor/iron, +/area/station/command/heads_quarters/qm) "oFK" = ( /turf/closed/wall/mineral/plastitanium, /area/station/hallway/secondary/entry) @@ -58387,25 +58367,16 @@ "oGK" = ( /turf/closed/wall, /area/station/service/chapel) -"oGV" = ( -/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 +"oGM" = ( +/obj/structure/sign/nanotrasen{ + pixel_x = 32 }, +/obj/structure/closet/secure_closet/armory2, /obj/effect/turf_decal/bot, -/obj/machinery/door/window/left/directional/west{ - name = "Magboot Storage"; - req_access = list("eva") - }, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/spawner/random/armory/rubbershot, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/ai_monitored/security/armory) "oGZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -58415,17 +58386,17 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron, /area/station/commons/toilet/restrooms) -"oHa" = ( -/obj/structure/table/reinforced, -/obj/item/aicard, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "oHe" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"oHj" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "oHo" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/brown/half/contrasted, @@ -58553,9 +58524,6 @@ /turf/open/floor/iron/dark, /area/station/engineering/atmos) "oIL" = ( -/obj/item/computer_disk/atmos, -/obj/item/computer_disk/atmos, -/obj/item/computer_disk/atmos, /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/bot, /obj/item/computer_disk/engineering, @@ -58608,6 +58576,13 @@ "oKr" = ( /turf/closed/wall, /area/station/security/checkpoint/supply) +"oKz" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "oKL" = ( /obj/machinery/camera/directional/north{ c_tag = "Dormitory Hallway"; @@ -58638,6 +58613,14 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/plating, /area/station/commons/toilet/locker) +"oKX" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/emergency, +/obj/item/wrench, +/obj/machinery/status_display/ai/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "oLd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /obj/effect/decal/cleanable/dirt, @@ -58649,6 +58632,11 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark, /area/station/service/theater) +"oLm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/security/prison) "oLz" = ( /obj/structure/cable, /obj/structure/chair/office{ @@ -58659,21 +58647,6 @@ }, /turf/open/floor/wood, /area/station/service/electronic_marketing_den) -"oLD" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/iron, -/area/station/science/auxlab/firing_range) -"oLF" = ( -/obj/machinery/light/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/hallway) "oLL" = ( /obj/structure/cable, /obj/effect/turf_decal/delivery, @@ -58753,6 +58726,11 @@ /obj/structure/closet/crate/internals, /turf/open/floor/plating, /area/station/maintenance/department/eva/abandoned) +"oMh" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/engineering/hallway) "oMo" = ( /obj/structure/table/wood, /obj/effect/spawner/random/bureaucracy/briefcase{ @@ -58764,6 +58742,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/library/private) +"oMp" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/station/tcommsat/server) "oMq" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -58794,6 +58777,19 @@ }, /turf/open/floor/plating, /area/station/construction/mining/aux_base) +"oML" = ( +/obj/machinery/door/window/left/directional/west, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Justice gas pump" + }, +/obj/effect/turf_decal/siding/dark_red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/execution/education) "oMV" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/chair/office{ @@ -58838,19 +58834,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/maintenance/port) -"oNd" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/light/directional/east, -/obj/structure/sign/warning/deathsposal/directional/east, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) "oNm" = ( /obj/structure/table/reinforced, /obj/item/stock_parts/cell/high, @@ -58864,6 +58847,12 @@ /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /turf/open/floor/iron/kitchen, /area/station/commons/dorms/laundry) +"oNB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) "oNF" = ( /obj/effect/turf_decal/siding/blue, /obj/effect/turf_decal/tile/blue/opposingcorners, @@ -58901,10 +58890,6 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/rd) -"oOv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "oOw" = ( /obj/effect/landmark/generic_maintenance_landmark, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -58922,7 +58907,7 @@ /area/station/commons/locker) "oOz" = ( /obj/structure/extinguisher_cabinet/directional/north, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/item/restraints/handcuffs, /obj/effect/turf_decal/trimline/green/filled/line{ dir = 9 @@ -59006,14 +58991,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/disposal) -"oPY" = ( -/obj/structure/closet/secure_closet/bar, -/obj/item/storage/photo_album/bar, -/obj/item/radio/intercom/directional/east, -/obj/item/storage/dice, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/checker, -/area/station/service/bar/backroom) "oQa" = ( /obj/effect/spawner/random/trash/grille_or_waste, /turf/open/floor/plating, @@ -59083,6 +59060,28 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/medical/medsci) +"oQZ" = ( +/obj/effect/spawner/random/trash/food_packaging, +/obj/effect/spawner/random/trash/cigbutt, +/obj/effect/spawner/random/trash/cigbutt, +/obj/machinery/duct, +/obj/effect/spawner/random/trash/cigbutt, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"oRh" = ( +/obj/machinery/status_display/evac/directional/east, +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Science - Port Hallway"; + name = "science camera"; + network = list("ss13","rd") + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/white, +/area/station/science/research) "oRk" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -59116,6 +59115,17 @@ }, /turf/open/floor/iron/white, /area/station/science/lobby) +"oRD" = ( +/obj/structure/cable, +/obj/item/circuitboard/computer/secure_data, +/obj/structure/frame/computer{ + anchored = 1; + dir = 8 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/wood, +/area/station/service/electronic_marketing_den) "oRH" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/tile/neutral/full, @@ -59162,6 +59172,13 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"oSo" = ( +/obj/structure/table/reinforced, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/structure/sign/poster/contraband/self_ai_liberation/directional/north, +/turf/open/floor/iron, +/area/station/science/research/abandoned) "oSv" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, @@ -59181,26 +59198,12 @@ dir = 4 }, /area/station/security/brig) -"oSz" = ( -/obj/structure/table/reinforced, -/obj/item/folder/yellow, -/obj/item/paper, -/obj/item/paper, -/obj/item/pen, -/obj/machinery/requests_console/directional/east{ - department = "Atmospherics"; - name = "Atmospherics Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/storage) "oSA" = ( /obj/machinery/status_display/ai/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/rack, +/obj/item/holosign_creator/atmos, +/obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, /area/station/science/ordnance) "oSE" = ( @@ -59267,6 +59270,17 @@ dir = 8 }, /area/station/security/medical) +"oTl" = ( +/obj/structure/table/reinforced, +/obj/item/scalpel{ + pixel_y = 8 + }, +/obj/item/circular_saw, +/obj/item/cautery, +/obj/structure/sign/departments/medbay/alt/directional/south, +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/iron, +/area/station/science/robotics/lab) "oTs" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -59405,19 +59419,23 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron, /area/station/engineering/supermatter/room) -"oVo" = ( -/obj/structure/cable, -/obj/structure/sign/warning/no_smoking/circle{ - pixel_x = 28; - pixel_y = -28 - }, -/obj/machinery/modular_computer/console/preset/engineering{ - dir = 1 - }, -/obj/item/radio/intercom/directional/east, +"oVd" = ( +/obj/structure/table, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/plunger, +/obj/item/plunger, +/obj/effect/turf_decal/siding/yellow, +/obj/structure/sign/poster/official/periodic_table/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/engineering/main) +/area/station/medical/chemistry) "oVp" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -59434,7 +59452,7 @@ }, /area/station/service/chapel) "oVI" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, /turf/open/floor/iron, @@ -59485,22 +59503,20 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron, /area/station/security/prison/garden) +"oWt" = ( +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 8 + }, +/obj/structure/bed/medical/emergency, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/medical) "oWA" = ( /obj/structure/bed, /obj/item/bedsheet/mime, /obj/machinery/newscaster/directional/east, /turf/open/floor/wood, /area/station/hallway/secondary/service) -"oXe" = ( -/obj/machinery/holopad, -/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/machinery/light/small/directional/west, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) "oXi" = ( /obj/effect/turf_decal/bot_white/left, /obj/effect/turf_decal/tile/neutral{ @@ -59535,6 +59551,13 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"oXU" = ( +/obj/machinery/status_display/ai/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/half{ + dir = 8 + }, +/area/station/engineering/atmos/project) "oYe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59624,13 +59647,6 @@ /obj/structure/sign/poster/contraband/random/directional/east, /turf/open/floor/wood, /area/station/service/theater) -"oZt" = ( -/obj/machinery/telecomms/server/presets/supply, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/telecomms, -/area/station/tcommsat/server) "oZz" = ( /obj/structure/table/reinforced, /obj/item/experi_scanner{ @@ -59678,6 +59694,12 @@ }, /turf/open/floor/wood, /area/station/security/detectives_office/private_investigators_office) +"paD" = ( +/obj/structure/table/wood, +/obj/item/papercutter, +/obj/item/paper/fluff/ids_for_dummies, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "paQ" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /turf/open/floor/iron/white, @@ -59701,6 +59723,14 @@ /obj/structure/flora/bush/leavy/style_random, /turf/open/misc/grass, /area/station/hallway/primary/fore) +"pbn" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/oil, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "pbp" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -59827,11 +59857,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/service/theater/abandoned) -"pcp" = ( -/obj/item/kirbyplants/random, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/station/science/research/abandoned) +"pcx" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/delivery_chute{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/station/cargo/sorting) "pcA" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -59912,29 +59948,20 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/command/gateway) +"pdA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/plumbed{ + name = "dormitory water reservoir" + }, +/turf/open/floor/plating, +/area/station/maintenance/department/security) "pdB" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 }, /turf/open/floor/iron, /area/station/cargo/storage) -"pdF" = ( -/obj/structure/closet/crate/preopen, -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, -/obj/item/tank/internals/oxygen/red{ - pixel_x = 3 - }, -/obj/item/tank/internals/oxygen/red{ - pixel_x = -3 - }, -/obj/item/wrench, -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) "pdH" = ( /obj/machinery/door/airlock/research{ name = "Ordnance Lab" @@ -59956,18 +59983,16 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/commons/vacant_room) -"pdP" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/warning, -/obj/effect/turf_decal/trimline/neutral/warning{ +"pdS" = ( +/obj/structure/closet/secure_closet/miner/unlocked, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 }, -/area/station/medical/morgue) +/turf/open/floor/iron, +/area/station/construction/mining/aux_base) "pdT" = ( /obj/structure/table/wood, /obj/effect/spawner/random/entertainment/coin, @@ -60016,6 +60041,18 @@ dir = 1 }, /area/station/commons/fitness/recreation) +"pen" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/sign/warning/deathsposal/directional/east, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/science/xenobiology) "peo" = ( /obj/structure/table/reinforced, /obj/item/storage/belt/utility, @@ -60050,6 +60087,12 @@ }, /turf/open/floor/iron, /area/station/security/warden) +"pey" = ( +/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, +/area/station/commons/dorms) "peD" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -60107,6 +60150,12 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"pfA" = ( +/obj/structure/table/reinforced, +/obj/item/assembly/timer, +/obj/item/assembly/timer, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "pfQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -60131,11 +60180,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/iron, /area/station/maintenance/port/fore) -"pga" = ( -/obj/item/radio/intercom/directional/east, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/engineering/atmos/hfr_room) "pgb" = ( /turf/open/floor/engine/n2o, /area/station/engineering/atmos) @@ -60158,6 +60202,13 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"pgv" = ( +/obj/machinery/teleport/station, +/obj/machinery/status_display/evac/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/command/teleporter) "pgy" = ( /obj/machinery/holopad, /obj/structure/disposalpipe/segment, @@ -60178,15 +60229,6 @@ /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, /area/station/engineering/main) -"pgB" = ( -/obj/structure/rack, -/obj/machinery/light/small/directional/south, -/obj/item/aicard, -/obj/item/storage/secure/briefcase, -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "pgE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -60198,12 +60240,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) -"pgJ" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/light/directional/north, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) +"pgG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/maintenance/department/science/xenobiology) "pgL" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral{ @@ -60223,6 +60266,12 @@ }, /turf/open/floor/iron, /area/station/commons/lounge) +"pgP" = ( +/obj/structure/closet/secure_closet/atmospherics, +/obj/effect/turf_decal/bot, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/storage) "pgV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -60243,16 +60292,6 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/iron, /area/station/engineering/supermatter/room) -"phb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/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/fore) "phn" = ( /obj/structure/cable, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -60301,6 +60340,19 @@ /obj/effect/landmark/navigate_destination, /turf/open/floor/iron, /area/station/science/circuits) +"phy" = ( +/obj/machinery/camera/directional/north{ + c_tag = "AI Satellite - Transit Tube"; + name = "ai camera"; + network = list("minisat"); + start_active = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/end{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) "phI" = ( /obj/structure/closet/secure_closet/hydroponics, /obj/effect/turf_decal/bot, @@ -60416,6 +60468,13 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, /area/station/engineering/main) +"pjh" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/command/corporate_showroom) "pjj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -60514,14 +60573,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/medical/break_room) -"pkj" = ( -/obj/machinery/light/directional/north, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) +"pkk" = ( +/obj/structure/sign/warning/test_chamber/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/science/circuits) "pkp" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -60576,6 +60633,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/grimy, /area/station/service/theater/abandoned) +"pkX" = ( +/obj/machinery/computer/prisoner/management{ + dir = 8 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Security - Armory Internal" + }, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/warden) "pkZ" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -60612,13 +60681,12 @@ /obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/port) -"pln" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/portable_atmospherics/canister/water_vapor, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/bot/right, -/turf/open/floor/iron/checker, -/area/station/service/janitor) +"plm" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/structure/flora/rock/pile/style_random, +/turf/open/misc/grass, +/area/station/hallway/primary/fore) "plr" = ( /obj/structure/chair/pew/right, /turf/open/floor/iron/chapel{ @@ -60652,6 +60720,15 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/hfr_room) +"plO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "plP" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -60686,18 +60763,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) -"pmw" = ( -/obj/effect/turf_decal/box/white/corners{ - dir = 8 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Xenobiology - Cell 1"; - name = "xenobiology camera"; - network = list("ss13","xeno","rd") - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "pmz" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -60756,19 +60821,6 @@ /obj/item/stack/sheet/glass/fifty, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) -"pnr" = ( -/obj/structure/sign/poster/contraband/hacking_guide/directional/south, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/maintenance/department/science) -"pnu" = ( -/obj/item/kirbyplants/random, -/obj/machinery/light/directional/south, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) "pnV" = ( /obj/structure/cable, /obj/structure/chair/office{ @@ -60777,14 +60829,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/bridge) -"pob" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/entertainment/arcade{ - dir = 1 - }, -/obj/machinery/light/dim/directional/south, -/turf/open/floor/plating, -/area/station/service/abandoned_gambling_den/gaming) "pok" = ( /obj/structure/table/reinforced, /obj/machinery/microwave{ @@ -60841,6 +60885,13 @@ /obj/structure/chair/office, /turf/open/floor/iron, /area/station/science/research/abandoned) +"poy" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/station/tcommsat/server) "poC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60857,17 +60908,6 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron, /area/station/security/office) -"poU" = ( -/obj/structure/table/wood, -/obj/machinery/light/directional/west, -/obj/item/flashlight/lamp/green, -/obj/machinery/camera/directional/west{ - c_tag = "Bridge - Captain's Office"; - name = "command camera" - }, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain) "pps" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, @@ -61055,17 +61095,6 @@ /obj/effect/turf_decal/tile/neutral/anticorner/contrasted, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) -"prV" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/machinery/newscaster/directional/west, -/obj/machinery/light/warm/directional/west, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/command/corporate_showroom) "psb" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 4 @@ -61091,15 +61120,19 @@ }, /turf/open/floor/iron, /area/station/commons/toilet/restrooms) +"psx" = ( +/obj/item/kirbyplants/random, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hos) "psF" = ( /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/station/security/checkpoint/escape) -"psR" = ( -/obj/machinery/atmospherics/components/binary/valve, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/engineering/atmos/hfr_room) "psZ" = ( /obj/effect/turf_decal/plaque{ icon_state = "L2" @@ -61147,13 +61180,11 @@ "ptA" = ( /obj/structure/cable, /obj/structure/table/reinforced, -/obj/item/tank/jetpack/carbondioxide{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/tank/jetpack/carbondioxide, /obj/effect/turf_decal/delivery, /obj/machinery/power/apc/auto_name/directional/east, +/obj/item/mod/module/tether, +/obj/item/mod/module/tether, +/obj/item/stack/sheet/plasteel/fifty, /turf/open/floor/iron, /area/station/engineering/storage) "ptC" = ( @@ -61205,6 +61236,17 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics/garden) +"pum" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/firealarm/directional/north, +/obj/machinery/light_switch/directional/north{ + pixel_x = -8 + }, +/turf/open/floor/iron, +/area/station/engineering/main) "puJ" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/effect/turf_decal/delivery, @@ -61243,11 +61285,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"pvv" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/status_display/evac/directional/east, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/central/fore) "pvx" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -61493,21 +61530,24 @@ /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) "pxS" = ( -/turf/open/floor/iron, +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/half{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/landmark/start/bitrunner, +/turf/open/floor/iron/half{ + dir = 1 + }, /area/station/cargo/miningoffice) "pxT" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, /area/station/maintenance/fore) -"pxU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "pyd" = ( /obj/effect/decal/cleanable/oil/slippery, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -61553,16 +61593,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"pyC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/west, -/obj/machinery/button/door/directional/west{ - id = "cafe_counter"; - name = "Counter Shutters Control"; - pixel_y = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "pyM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/steam_vent, @@ -61830,6 +61860,17 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"pBu" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) "pBw" = ( /obj/machinery/status_display/supply{ pixel_y = 32 @@ -61870,21 +61911,6 @@ }, /turf/open/floor/wood, /area/station/service/lawoffice) -"pBO" = ( -/obj/structure/table, -/obj/item/folder/white, -/obj/machinery/status_display/evac/directional/west, -/obj/item/folder{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/pen, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 1 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/station/science/lobby) "pBY" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -61984,20 +62010,36 @@ /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "pDy" = ( -/obj/machinery/atmospherics/components/unary/cryo_cell{ +/obj/machinery/cryo_cell{ dir = 8 }, /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron/dark/textured_large, /area/station/medical/cryo) +"pDE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, +/obj/structure/sign/poster/official/wtf_is_co2/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos) "pDM" = ( /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/science/xenobiology) "pDS" = ( /obj/structure/table/wood, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/camera/detective, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = 9; + pixel_y = 4 + }, +/obj/item/camera/detective{ + pixel_x = -6; + pixel_y = 6 + }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/detectives_office) @@ -62022,30 +62064,25 @@ dir = 4 }, /area/station/engineering/atmos/pumproom) -"pEa" = ( -/obj/structure/cable, -/obj/structure/table/reinforced, -/obj/machinery/recharger, -/obj/machinery/light/directional/north, -/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/supply) "pEb" = ( /obj/machinery/power/energy_accumulator/tesla_coil, /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/engineering/main) -"pEf" = ( +"pEg" = ( +/obj/effect/landmark/start/hangover, /obj/effect/decal/cleanable/dirt, -/obj/structure/chair/office/light, -/obj/effect/turf_decal/siding/purple{ +/obj/machinery/light/small/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Service - Hydroponics Kitchen Access"; + name = "service camera" + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 }, -/turf/open/floor/glass, -/area/station/maintenance/space_hut/observatory) +/obj/structure/table, +/turf/open/floor/iron, +/area/station/service/kitchen) "pEi" = ( /turf/open/floor/iron/grimy, /area/station/service/theater/abandoned) @@ -62075,12 +62112,6 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron/dark, /area/station/maintenance/department/science) -"pEG" = ( -/obj/structure/bodycontainer/morgue/beeper_off, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "pEH" = ( /obj/machinery/door/poddoor/preopen{ id = "brigprison"; @@ -62110,7 +62141,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/glass_large{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Laundromat" }, /turf/open/floor/iron, @@ -62157,6 +62188,23 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/maintenance/port/aft) +"pFg" = ( +/obj/structure/table/reinforced, +/obj/machinery/requests_console/directional/west{ + department = "Security"; + name = "Security Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/item/book/manual/wiki/security_space_law, +/obj/item/toy/figure/warden{ + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/warden) "pFk" = ( /obj/machinery/conveyor/inverted{ dir = 10; @@ -62182,6 +62230,10 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/iron, /area/station/engineering/atmos/hfr_room) +"pFy" = ( +/obj/machinery/telecomms/server/presets/common, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) "pFB" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -62209,19 +62261,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) -"pFH" = ( -/obj/machinery/light/directional/east, -/obj/structure/table/reinforced, -/obj/item/storage/box/chemimp{ - pixel_x = 4; - pixel_y = 10 - }, -/obj/item/storage/box/trackimp{ - pixel_y = 6 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "pFO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, @@ -62265,6 +62304,13 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"pGm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "pGo" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -62437,24 +62483,6 @@ /obj/effect/decal/cleanable/plastic, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) -"pIR" = ( -/obj/machinery/light/directional/east, -/obj/machinery/airalarm/directional/east, -/obj/machinery/rnd/production/techfab/department/medical, -/obj/effect/turf_decal/stripes/box, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/medical/storage) -"pIW" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/cable, -/obj/effect/spawner/random/engineering/atmospherics_portable, -/turf/open/floor/plating, -/area/station/maintenance/department/crew_quarters/bar) "pIX" = ( /obj/effect/turf_decal/trimline/dark_red/filled/warning, /turf/open/floor/iron/dark, @@ -62468,12 +62496,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos/storage/gas) -"pJg" = ( -/obj/structure/table/wood, -/obj/item/clipboard, -/obj/item/electronics/apc, -/turf/open/floor/wood, -/area/station/service/electronic_marketing_den) "pJi" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -62579,6 +62601,21 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/science/breakroom) +"pKa" = ( +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/obj/structure/sign/warning/electric_shock/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "AI Chamber - Fore"; + name = "motion-sensitive ai camera"; + network = list("aichamber") + }, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "pKb" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -62596,16 +62633,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/abandoned_gambling_den) -"pKm" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +"pKf" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) +/turf/open/floor/iron/dark, +/area/station/maintenance/port) +"pKi" = ( +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) "pKn" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -62659,6 +62698,21 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"pLe" = ( +/obj/structure/sign/poster/official/report_crimes/directional/north, +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/suit/jacket{ + desc = "All the class of a trenchcoat without the security fibers."; + icon_state = "detective"; + name = "trenchcoat" + }, +/obj/item/clothing/head/fedora{ + icon_state = "detective" + }, +/obj/item/clothing/gloves/color/black, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/security/detectives_office/private_investigators_office) "pLg" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -62738,20 +62792,17 @@ /obj/structure/bookcase, /turf/open/floor/wood, /area/station/service/library/abandoned) +"pLQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/kirbyplants/random, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/station/service/library/abandoned) "pLR" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/grimy, /area/station/service/lawoffice) -"pLV" = ( -/obj/machinery/modular_computer/console/preset/id{ - dir = 1 - }, -/obj/structure/cable, -/obj/item/paper/fluff/ids_for_dummies, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hop) "pMa" = ( /obj/item/reagent_containers/cup/bucket, /obj/effect/decal/cleanable/cobweb/cobweb2, @@ -62893,14 +62944,6 @@ }, /turf/open/floor/iron/large, /area/station/science/research) -"pNJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/north, -/obj/machinery/suit_storage_unit/engine, -/obj/effect/turf_decal/stripes/line, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/storage) "pNP" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted, @@ -62937,6 +62980,15 @@ /obj/structure/barricade/wooden, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"pOz" = ( +/obj/structure/cable, +/obj/machinery/modular_computer/preset/id{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "pOB" = ( /obj/structure/table/glass, /obj/machinery/newscaster/directional/west, @@ -63063,23 +63115,6 @@ "pPl" = ( /turf/open/floor/wood/tile, /area/station/service/library/artgallery) -"pPm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/contraband/revolver/directional/north, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/commons/dorms) -"pPp" = ( -/obj/machinery/computer/security/mining{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "pPs" = ( /obj/structure/chair/office/light{ dir = 8 @@ -63119,6 +63154,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) +"pPI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/portable_atmospherics/canister/water_vapor, +/obj/effect/turf_decal/bot/right, +/turf/open/floor/iron/checker, +/area/station/service/janitor) "pPN" = ( /obj/structure/cable, /obj/effect/landmark/start/hangover, @@ -63132,11 +63173,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/atmos/project) -"pPZ" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/sign/calendar/directional/south, -/turf/open/floor/plating, -/area/station/service/abandoned_gambling_den) "pQd" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -63151,6 +63187,13 @@ }, /turf/open/floor/iron, /area/station/service/kitchen/abandoned) +"pQn" = ( +/obj/structure/sign/poster/official/safety_eye_protection/directional/west, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "pQx" = ( /obj/structure/lattice, /obj/structure/window/reinforced/spawner/directional/north, @@ -63169,24 +63212,6 @@ /obj/item/grenade/smokebomb, /turf/open/floor/wood, /area/station/maintenance/starboard/aft) -"pQS" = ( -/obj/structure/cable, -/obj/machinery/light/directional/west, -/obj/structure/table, -/obj/item/storage/box/shipping{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/folder/yellow, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/light_switch/directional/north{ - pixel_x = 12 - }, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "pQT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -63196,6 +63221,23 @@ }, /turf/open/floor/wood, /area/station/service/electronic_marketing_den) +"pQV" = ( +/obj/structure/dresser, +/obj/effect/decal/cleanable/dirt, +/obj/item/radio/intercom/directional/north, +/obj/item/flashlight/seclite{ + pixel_y = 8 + }, +/turf/open/floor/wood, +/area/station/commons/dorms) +"pRg" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/cafeteria) "pRk" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -63207,13 +63249,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/broken_floor, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"pRw" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +"pRy" = ( +/obj/effect/turf_decal/siding/green, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/flora/bush/leafy, +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/structure/flora/bush/flowers_yw, +/obj/machinery/light/small/directional/west, +/turf/open/floor/grass, +/area/station/medical/virology) "pRz" = ( /obj/effect/turf_decal/box/white/corners{ dir = 1 @@ -63232,6 +63279,12 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, /area/station/science/lobby) +"pRI" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) "pRJ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -63462,6 +63515,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"pTK" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/lavendergrass/style_random, +/turf/open/misc/grass, +/area/station/hallway/primary/fore) "pTM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -63475,6 +63533,16 @@ /obj/structure/lattice, /turf/open/space, /area/space/nearstation) +"pTT" = ( +/obj/structure/sign/directions/engineering{ + desc = "A sign that shows there are doors here. There are doors everywhere!"; + icon_state = "doors"; + name = "WARNING: EXTERNAL AIRLOCK"; + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/execution/education) "pTV" = ( /obj/structure/sign/poster/official/random/directional/north, /obj/structure/cable, @@ -63496,6 +63564,15 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/iron, /area/station/engineering/storage) +"pUi" = ( +/obj/structure/chair/office, +/obj/item/cardboard_cutout, +/obj/structure/sign/poster/contraband/tools/directional/north, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 1 + }, +/turf/open/floor/iron/smooth_half, +/area/station/maintenance/port/aft) "pUl" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ @@ -63535,15 +63612,16 @@ /turf/open/floor/iron/dark/corner, /area/station/engineering/atmos/pumproom) "pUs" = ( -/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/structure/disposalpipe/segment{ - dir = 9 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, +/obj/machinery/door/airlock/mining/glass{ + name = "Bitrunning Den" }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "pUw" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, @@ -63575,15 +63653,6 @@ /obj/effect/landmark/navigate_destination, /turf/open/floor/iron/checker, /area/station/hallway/secondary/service) -"pUC" = ( -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/science/robotics/lab) "pUF" = ( /obj/structure/table/reinforced, /obj/item/folder/blue, @@ -63599,6 +63668,19 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) +"pUH" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Engineering - Aft"; + name = "engineering camera" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/spawner/random/structure/tank_holder, +/obj/item/radio/intercom/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/engineering/main) "pUI" = ( /obj/machinery/duct, /obj/structure/disposalpipe/segment, @@ -63613,6 +63695,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/fore) +"pUP" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/execution/transfer) "pUQ" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -63642,6 +63731,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos) +"pUY" = ( +/obj/structure/rack, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/spawner/random/armory/bulletproof_armor, +/obj/effect/spawner/random/armory/bulletproof_helmet, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "pVb" = ( /obj/effect/spawner/random/vending/colavend, /obj/effect/turf_decal/bot, @@ -63649,33 +63746,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/command) -"pVd" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/machinery/firealarm/directional/south, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/checkpoint/escape) "pVk" = ( /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/service/abandoned_gambling_den) -"pVw" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/machinery/duct, -/obj/machinery/status_display/evac/directional/west, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "pVD" = ( /obj/effect/mapping_helpers/iannewyear, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -63733,16 +63809,6 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space/nearstation) -"pWq" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/landmark/start/assistant, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "pWz" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/loading_area{ @@ -63815,14 +63881,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"pXi" = ( -/obj/machinery/light/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, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "pXj" = ( /obj/structure/cable, /obj/machinery/power/energy_accumulator/grounding_rod/anchored, @@ -63850,6 +63908,19 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/iron, /area/station/engineering/atmos/hfr_room) +"pXt" = ( +/obj/structure/mop_bucket/janitorialcart, +/obj/item/mop, +/obj/item/reagent_containers/cup/bucket, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/siding/purple/corner{ + dir = 4 + }, +/obj/effect/turf_decal/bot/left, +/obj/item/storage/bag/trash, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/checker, +/area/station/service/janitor) "pXw" = ( /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, @@ -63859,6 +63930,22 @@ /obj/machinery/coffeemaker/impressa, /turf/open/floor/wood, /area/station/engineering/break_room) +"pXI" = ( +/obj/machinery/computer/security/telescreen{ + dir = 8; + name = "Prisoner Telescreen"; + network = list("prison"); + pixel_x = 27 + }, +/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{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "pXK" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -63868,15 +63955,6 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) -"pXM" = ( -/obj/structure/table/wood, -/obj/item/storage/box/ids{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/silver_ids, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) "pXW" = ( /obj/structure/cable, /obj/structure/disposalpipe/junction/yjunction{ @@ -63893,15 +63971,6 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) -"pYl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/bluespace_vendor/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "pYo" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock/maintenance_hatch{ @@ -64026,34 +64095,26 @@ /obj/effect/turf_decal/tile/neutral/anticorner/contrasted, /turf/open/floor/iron, /area/station/medical/storage) -"pZA" = ( -/obj/structure/closet/crate, -/obj/item/toy/dodgeball, -/obj/item/toy/dodgeball, -/obj/effect/spawner/random/contraband/prison, -/obj/item/instrument/harmonica, -/obj/item/storage/dice, -/obj/item/toy/cards/deck/tarot, -/obj/machinery/light/directional/south, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/iron, -/area/station/security/prison) +"pZF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/white/corner{ + dir = 8 + }, +/area/station/service/kitchen) "pZI" = ( /obj/structure/chair/stool/bar/directional/south, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) -"pZL" = ( -/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 = 1 - }, -/obj/structure/sign/poster/official/cleanliness/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/medbay) "pZM" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/disposalpipe/trunk{ @@ -64073,22 +64134,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/explab) -"qam" = ( -/obj/structure/table, -/obj/item/paper{ - pixel_x = 6; - pixel_y = 3 - }, -/obj/item/radio{ - pixel_y = 4 - }, -/obj/machinery/light/directional/west, -/obj/machinery/computer/security/telescreen/entertainment/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "qaq" = ( /obj/structure/table, /obj/item/clothing/gloves/latex, @@ -64155,17 +64200,6 @@ }, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/entry) -"qaL" = ( -/obj/vehicle/ridden/wheelchair{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/obj/machinery/vending/wallmed/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/textured, -/area/station/medical/medbay) "qaT" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -64196,19 +64230,6 @@ }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) -"qbm" = ( -/obj/item/radio/intercom/directional/north, -/obj/machinery/button/door/directional/north{ - id = "barber_door_lock"; - normaldoorcontrol = 1; - pixel_y = 40; - specialfunctions = 4 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Barber Shop" - }, -/turf/open/floor/wood/large, -/area/station/service/barber) "qbp" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -64216,16 +64237,6 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/dark, /area/station/security/execution/education) -"qbs" = ( -/obj/structure/cable, -/obj/machinery/biogenerator, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/siding/green{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/station/service/hydroponics/garden/abandoned) "qbu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /obj/effect/decal/cleanable/dirt, @@ -64384,6 +64395,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) +"qdL" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "qdP" = ( /obj/item/kirbyplants/random, /obj/structure/extinguisher_cabinet/directional/east, @@ -64414,6 +64434,12 @@ /obj/effect/spawner/random/decoration/paint, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"qea" = ( +/obj/structure/filingcabinet, +/obj/item/folder/documents, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) "qeg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -64472,6 +64498,25 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/medical/surgery/theatre) +"qeP" = ( +/obj/structure/closet/radiation, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/main) +"qeS" = ( +/obj/effect/landmark/start/hangover, +/obj/structure/chair/sofa/right/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/commons/lounge) "qfd" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ @@ -64540,16 +64585,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/chapel/funeral) -"qfZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 8 - }, -/obj/structure/sign/poster/official/anniversary_vintage_reprint/directional/south, -/turf/open/floor/iron/white, -/area/station/science/research) "qgl" = ( /obj/machinery/power/solar{ id = "aftport"; @@ -64562,7 +64597,7 @@ /turf/closed/wall/r_wall, /area/station/science/ordnance/storage) "qgp" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/item/bot_assembly/medbot, /turf/open/floor/plating, /area/station/medical/abandoned) @@ -64591,16 +64626,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"qgV" = ( -/obj/structure/table, -/obj/item/plant_analyzer, -/obj/item/hatchet, -/obj/item/cultivator, -/obj/item/shovel/spade, -/obj/machinery/light/small/directional/east, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden) "qhh" = ( /obj/structure/table/wood/fancy, /obj/structure/window/reinforced/spawner/directional/east, @@ -64620,23 +64645,6 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron, /area/station/commons/lounge) -"qhB" = ( -/obj/structure/easel, -/obj/effect/decal/cleanable/dirt, -/obj/item/canvas/twentythree_twentythree, -/obj/item/canvas/twentythree_twentythree, -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/station/service/library/abandoned) -"qhC" = ( -/obj/structure/table/reinforced, -/obj/item/stack/rods/fifty, -/obj/item/wrench, -/obj/item/storage/box/lights/mixed, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/iron, -/area/station/maintenance/port) "qhN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -64649,14 +64657,6 @@ /obj/effect/turf_decal/delivery/white, /turf/open/floor/plating/airless, /area/space/nearstation) -"qhS" = ( -/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/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "qhW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -64667,6 +64667,25 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"qid" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"qig" = ( +/obj/structure/table/wood, +/obj/machinery/camera/directional/west{ + c_tag = "Bridge - Captain's Office"; + name = "command camera" + }, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/item/paper_bin, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain) "qij" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/bridge_pipe/orange/visible, @@ -64694,6 +64713,23 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"qip" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/table/reinforced, +/obj/item/storage/box/syringes{ + pixel_y = 5 + }, +/obj/item/storage/box/beakers{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/box/petridish, +/obj/effect/turf_decal/siding/purple, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/dropper, +/turf/open/floor/iron, +/area/station/science/xenobiology) "qiM" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -64721,12 +64757,6 @@ }, /turf/open/floor/plating, /area/station/service/theater/abandoned) -"qiX" = ( -/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/dark, -/area/station/ai_monitored/turret_protected/ai_upload) "qje" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -64792,6 +64822,13 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"qkg" = ( +/obj/machinery/hydroponics/soil, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/food_or_drink/seed, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden/abandoned) "qkj" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/half/contrasted, @@ -64805,21 +64842,26 @@ /turf/open/floor/iron/dark, /area/station/command/bridge) "qko" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/clipboard, -/obj/item/toy/figure/miner, -/obj/machinery/light/directional/north, -/obj/machinery/light_switch/directional/west{ - pixel_x = -42 +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/brown/half{ + dir = 8 }, -/obj/effect/turf_decal/bot, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ +/obj/machinery/light/directional/west, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/iron/half{ dir = 1 }, -/turf/open/floor/iron, /area/station/cargo/miningoffice) +"qkv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/revolver/directional/north, +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood, +/area/station/commons/dorms) "qkA" = ( /obj/structure/chair/stool/bar/directional/east, /obj/effect/turf_decal/tile/red/opposingcorners{ @@ -64900,34 +64942,6 @@ dir = 4 }, /area/station/commons/fitness/recreation) -"qlJ" = ( -/obj/item/secateurs{ - desc = "It look like a pair of botanical secateurs, but there's a crudely applied label on its handle that denotes them as 'scissors'."; - name = "scissors"; - pixel_y = 1 - }, -/obj/item/reagent_containers/cup/rag{ - pixel_y = 4 - }, -/obj/machinery/light/warm/directional/south, -/obj/structure/table, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/barber) -"qlK" = ( -/obj/machinery/light/directional/south, -/obj/structure/table, -/obj/item/fuel_pellet{ - pixel_x = 8 - }, -/obj/item/wrench{ - pixel_x = -4 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "qlN" = ( /obj/structure/table/reinforced, /obj/item/restraints/handcuffs, @@ -64956,17 +64970,6 @@ }, /turf/open/floor/iron/white, /area/station/science/research) -"qml" = ( -/obj/structure/table/reinforced, -/obj/item/electronics/apc, -/obj/item/electronics/apc{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/stack/cable_coil, -/obj/structure/sign/poster/official/build/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/department/electrical) "qmu" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -65013,23 +65016,14 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 }, /turf/open/floor/iron, /area/station/maintenance/starboard/fore) -"qmX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/north{ - c_tag = "Service - Cafeteria Fore"; - name = "service camera" - }, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/cafeteria) "qnc" = ( /obj/machinery/firealarm/directional/south, /obj/effect/turf_decal/tile/blue{ @@ -65135,17 +65129,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) -"qoc" = ( -/obj/machinery/light/directional/south, -/obj/effect/decal/cleanable/dirt, -/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/tcommsat/server) "qoi" = ( /obj/structure/chair/office{ dir = 1 @@ -65281,6 +65264,17 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/space, /area/space/nearstation) +"qpU" = ( +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 4 + }, +/obj/machinery/smartfridge/organ, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "qqe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -65343,6 +65337,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/hallway) +"qqQ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "qqZ" = ( /obj/structure/rack, /obj/item/analyzer{ @@ -65363,6 +65366,33 @@ /obj/item/pen, /turf/open/floor/wood, /area/station/service/electronic_marketing_den) +"qry" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/machinery/computer/operating{ + dir = 4 + }, +/obj/effect/turf_decal/bot_white/left, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"qrG" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Cargo - Quartermaster's Office"; + name = "cargo camera" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/command/heads_quarters/qm) "qrP" = ( /obj/effect/landmark/start/hangover, /obj/structure/chair/stool/bar/directional/south, @@ -65408,15 +65438,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"qsv" = ( -/obj/machinery/light/directional/south, -/obj/machinery/computer/station_alert{ - dir = 1 - }, -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/main) "qsw" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/wood, @@ -65431,33 +65452,21 @@ /turf/open/floor/iron, /area/station/science/xenobiology) "qsF" = ( -/obj/structure/cable, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"qsI" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/door/window/right/directional/west{ - name = "Supply Storage"; - req_access = list("medical") +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/item/storage/box/syringes, -/obj/item/storage/box/beakers{ - pixel_x = 3; - pixel_y = 3 +/obj/effect/turf_decal/trimline/brown/line, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 1 }, -/obj/item/gun/syringe, -/obj/item/gun/syringe, -/obj/structure/table/reinforced, -/obj/structure/sign/clock/directional/east, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 }, -/turf/open/floor/iron, -/area/station/medical/storage) +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "qsN" = ( /obj/structure/chair{ dir = 4 @@ -65529,11 +65538,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/circuits) -"quc" = ( -/obj/machinery/telecomms/server/presets/common, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, -/turf/open/floor/iron/telecomms, -/area/station/tcommsat/server) "qud" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -65567,15 +65571,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"quQ" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "quR" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -65642,17 +65637,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/theater/abandoned) -"qvw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible/layer2, -/obj/machinery/light/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/maintenance/disposal/incinerator) "qvB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -65661,6 +65645,13 @@ }, /turf/open/floor/iron/cafeteria, /area/station/service/cafeteria) +"qvF" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) "qvG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/grimy, @@ -65755,6 +65746,18 @@ /obj/structure/filingcabinet/employment, /turf/open/floor/wood, /area/station/service/lawoffice) +"qwQ" = ( +/obj/structure/closet/crate, +/obj/item/toy/dodgeball, +/obj/item/toy/dodgeball, +/obj/effect/spawner/random/contraband/prison, +/obj/item/instrument/harmonica, +/obj/item/storage/dice, +/obj/item/toy/cards/deck/tarot, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/turf/open/floor/iron, +/area/station/security/prison) "qwY" = ( /obj/item/kirbyplants/random, /obj/machinery/light/directional/south, @@ -65851,20 +65854,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"qye" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/oil, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/maintenance/disposal) -"qyi" = ( -/obj/structure/sign/poster/official/work_for_a_future/directional/west, -/obj/machinery/firealarm/directional/south, -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) "qyj" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -65881,6 +65870,22 @@ /obj/item/pen, /turf/open/floor/plating, /area/station/service/library/abandoned) +"qyy" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/item/kirbyplants/random, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/directional/north{ + c_tag = "Engineering - Fore"; + name = "engineering camera" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/main) "qyK" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, @@ -65916,6 +65921,13 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"qzj" = ( +/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/structure/table/wood, +/obj/machinery/newscaster/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood/large, +/area/station/service/library) "qzn" = ( /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -65946,6 +65958,22 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) +"qzR" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/machinery/newscaster/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/obj/machinery/button/door/directional/south{ + id = "Toilet_Med"; + name = "Lock Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/food/sandwich/cheese/grilled, +/turf/open/floor/iron/cafeteria, +/area/station/medical/break_room) "qzT" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/stripes/line{ @@ -66067,6 +66095,19 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/aft) +"qBn" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/sign/poster/official/moth_epi/directional/west, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/medical/storage) "qBo" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66120,16 +66161,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel/funeral) -"qBK" = ( -/obj/structure/table, -/obj/structure/bedsheetbin, -/obj/effect/turf_decal/siding/dark_blue{ - dir = 4 - }, -/obj/machinery/light/cold/directional/west, -/obj/effect/turf_decal/tile/dark_blue/fourcorners, -/turf/open/floor/iron, -/area/station/commons/dorms/laundry) "qBN" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/status_display/ai/directional/south, @@ -66137,15 +66168,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/textured, /area/station/engineering/storage) -"qBS" = ( -/obj/structure/closet/wardrobe/miner, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/south, -/obj/item/storage/backpack/satchel/explorer, -/obj/effect/turf_decal/bot, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "qBY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -66210,6 +66232,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/station/service/chapel) +"qCr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/disposal) "qCs" = ( /obj/machinery/light/small/directional/north, /obj/machinery/vending/assist, @@ -66405,6 +66435,11 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"qFp" = ( +/obj/structure/table/wood, +/obj/item/pai_card, +/turf/open/floor/carpet, +/area/station/service/library/abandoned) "qFr" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -66421,15 +66456,23 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"qFI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/bluespace_vendor/directional/west, -/obj/structure/chair/stool/directional/east, -/obj/effect/landmark/start/hangover, -/obj/machinery/light/directional/west, +"qFJ" = ( +/obj/structure/table, +/obj/item/transfer_valve{ + pixel_x = 5 + }, +/obj/item/transfer_valve, +/obj/item/transfer_valve{ + pixel_x = -5 + }, +/obj/item/transfer_valve{ + pixel_x = 5 + }, +/obj/item/transfer_valve, +/obj/machinery/status_display/evac/directional/east, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/commons/locker) +/area/station/science/ordnance/testlab) "qFK" = ( /obj/structure/railing{ dir = 1 @@ -66439,12 +66482,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) -"qGa" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain) "qGm" = ( /turf/open/floor/iron/dark, /area/station/service/theater) @@ -66463,6 +66500,13 @@ }, /turf/open/floor/iron/dark, /area/station/command/corporate_showroom) +"qGs" = ( +/obj/item/kirbyplants/random, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) "qGz" = ( /obj/structure/bookcase, /obj/effect/decal/cleanable/cobweb, @@ -66645,15 +66689,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/service/kitchen/abandoned) -"qHY" = ( -/obj/item/kirbyplants/random, -/obj/machinery/light/directional/east, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/office) "qIf" = ( /obj/effect/spawner/random/trash/mess, /obj/effect/mapping_helpers/broken_floor, @@ -66786,6 +66821,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit/green, /area/station/ai_monitored/command/nuke_storage) +"qKg" = ( +/obj/machinery/duct, +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "qKi" = ( /obj/structure/cable, /obj/effect/spawner/random/engineering/tracking_beacon, @@ -66801,13 +66844,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/courtroom) -"qKm" = ( -/obj/structure/table/wood, -/obj/item/folder/red, -/obj/item/lighter, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/wood, -/area/station/service/electronic_marketing_den) "qKs" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -66815,14 +66851,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/chapel/funeral) -"qKu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "qKz" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/toilet{ @@ -67018,6 +67046,14 @@ /obj/structure/sign/nanotrasen, /turf/closed/wall/r_wall, /area/station/security/checkpoint/engineering) +"qLO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/suit_storage_unit/engine, +/obj/effect/turf_decal/stripes/line, +/obj/item/radio/intercom/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/storage) "qLQ" = ( /obj/machinery/atmospherics/components/unary/passive_vent/layer2{ dir = 4 @@ -67061,11 +67097,6 @@ /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/iron, /area/station/service/library/lounge) -"qMn" = ( -/obj/structure/disposalpipe/trunk, -/obj/structure/disposaloutlet, -/turf/open/floor/plating, -/area/station/cargo/sorting) "qMq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -67078,6 +67109,13 @@ }, /turf/open/floor/iron/white, /area/station/maintenance/fore) +"qMv" = ( +/obj/item/radio/intercom/prison/directional/north, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/tile/neutral/full, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/smooth_large, +/area/station/security/prison/visit) "qMB" = ( /obj/effect/turf_decal/bot, /obj/machinery/firealarm/directional/north, @@ -67094,10 +67132,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"qMJ" = ( -/obj/machinery/light/small/broken/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/department/science) "qMS" = ( /obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, @@ -67118,11 +67152,6 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron/dark, /area/station/maintenance/department/science) -"qNc" = ( -/obj/structure/dresser, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) "qNf" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -67150,13 +67179,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) -"qNw" = ( -/obj/machinery/space_heater, -/obj/effect/turf_decal/bot, -/obj/machinery/light/small/red/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/maintenance/department/chapel) "qNy" = ( /obj/structure/table, /obj/item/crowbar, @@ -67257,13 +67279,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos) -"qPn" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +"qPm" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/space, +/area/space/nearstation) "qPp" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/purple{ @@ -67367,10 +67387,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"qQK" = ( -/obj/effect/spawner/random/structure/chair_maintenance, -/turf/open/floor/plating, -/area/station/maintenance/fore) "qQM" = ( /turf/closed/wall, /area/station/maintenance/port/aft) @@ -67437,11 +67453,6 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"qRO" = ( -/obj/machinery/photocopier, -/obj/structure/sign/poster/official/work_for_a_future/directional/east, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) "qRZ" = ( /obj/structure/table, /obj/item/storage/bag/tray/cafeteria, @@ -67479,17 +67490,14 @@ }, /turf/open/floor/iron, /area/station/security/brig) -"qSl" = ( -/obj/structure/table/wood, -/obj/item/clothing/glasses/regular/hipster, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/abandoned_gambling_den/gaming) "qSm" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/yellow/filled/line, /turf/open/floor/iron, /area/station/engineering/atmos) +"qSn" = ( +/turf/open/floor/iron, +/area/station/maintenance/department/chapel) "qSp" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -67575,6 +67583,10 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) +"qTR" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "qUi" = ( /obj/structure/disposalpipe/sorting/mail{ name = "Engineering Junction" @@ -67621,6 +67633,11 @@ /obj/structure/sign/nanotrasen, /turf/closed/wall/r_wall, /area/station/tcommsat/server) +"qUP" = ( +/obj/machinery/hydroponics/soil, +/obj/item/shovel/spade, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden/abandoned) "qVf" = ( /obj/structure/chair, /obj/effect/decal/cleanable/blood/splatter, @@ -67650,6 +67667,12 @@ /obj/structure/sign/poster/contraband/random/directional/south, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) +"qVr" = ( +/obj/effect/spawner/random/entertainment/arcade, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/abandoned_gambling_den/gaming) "qVv" = ( /obj/machinery/power/shieldwallgen, /obj/effect/decal/cleanable/dirt, @@ -67748,15 +67771,6 @@ /obj/item/newspaper, /turf/open/floor/plating, /area/station/security/detectives_office/private_investigators_office) -"qXx" = ( -/obj/effect/spawner/random/engineering/atmospherics_portable, -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/west, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/maintenance/port) "qXJ" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -67815,7 +67829,7 @@ /area/station/service/abandoned_gambling_den) "qYx" = ( /obj/machinery/igniter/incinerator_atmos, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "qYy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -67843,9 +67857,11 @@ }, /turf/open/floor/iron, /area/station/service/kitchen/abandoned) -"qYZ" = ( -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/siding/thinplating/dark, +"qYU" = ( +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/iron/dark/textured_half{ dir = 1 }, @@ -67854,18 +67870,21 @@ /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, /area/station/maintenance/port) -"qZg" = ( -/obj/structure/bodycontainer/morgue{ - dir = 8 - }, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/iron/dark/textured_half, -/area/station/service/chapel/storage) "qZn" = ( /obj/machinery/status_display/ai/directional/south, /obj/effect/turf_decal/trimline/yellow/filled/line, /turf/open/floor/iron, /area/station/engineering/atmos) +"qZq" = ( +/obj/machinery/airalarm/directional/west, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel/storage) "qZr" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -67926,21 +67945,6 @@ dir = 8 }, /area/station/commons/fitness/recreation) -"rac" = ( -/obj/structure/window/spawner/directional/west, -/obj/structure/closet/secure_closet/freezer/kitchen/all_access, -/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/decal/cleanable/cobweb, -/obj/structure/sign/poster/ripped/directional/north, -/turf/open/floor/iron/cafeteria, -/area/station/security/prison/mess) "ram" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/east, @@ -67994,21 +67998,35 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/maintenance/disposal/incinerator) +"raQ" = ( +/obj/machinery/photocopier, +/obj/machinery/requests_console/directional/north{ + department = "Head of Security's Desk"; + name = "Head of Security's Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/structure/sign/nanotrasen{ + pixel_x = 32; + pixel_y = 32 + }, +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hos) +"rbb" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "rbj" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/barricade/wooden, /turf/open/floor/plating, /area/station/maintenance/department/chapel) -"rbk" = ( -/obj/machinery/light/directional/east, -/obj/item/radio/intercom/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/commons/lounge) "rbB" = ( /obj/structure/table/wood, /turf/open/floor/iron/grimy, @@ -68024,6 +68042,15 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron, /area/station/maintenance/port/aft) +"rbF" = ( +/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{ + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "rbR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -68107,15 +68134,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/xenobiology) -"rdr" = ( -/obj/machinery/hydroponics/constructable, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/blue/opposingcorners, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) "rdu" = ( /obj/machinery/computer/security/mining, /obj/effect/turf_decal/tile/purple/half/contrasted{ @@ -68165,16 +68183,6 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/dark/side, /area/station/engineering/lobby) -"rdU" = ( -/obj/machinery/modular_computer/console/preset/cargochat/medical, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 10 - }, -/obj/machinery/light_switch/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/medical/storage) "rem" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/sign/poster/random/directional/west, @@ -68244,6 +68252,23 @@ }, /turf/open/floor/plating, /area/station/science/ordnance/office) +"reK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/status_display/ai/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark/telecomms, +/area/station/science/server) +"reM" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/science/auxlab/firing_range) +"rfa" = ( +/obj/machinery/hydroponics/soil, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/service/hydroponics/garden/abandoned) "rfd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68257,9 +68282,8 @@ /turf/open/floor/iron, /area/station/hallway/secondary/entry) "rff" = ( -/obj/structure/bed/pod{ - desc = "An old medical bed, just waiting for replacement with something up to date."; - name = "medical bed" +/obj/structure/bed/medical{ + dir = 4 }, /obj/structure/window/reinforced/spawner/directional/east, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -68292,6 +68316,20 @@ /obj/effect/landmark/navigate_destination/dockescpod1, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"rgb" = ( +/obj/structure/sign/departments/science/alt/directional/north, +/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/purple/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white, +/area/station/science/research) "rgf" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -68319,6 +68357,25 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron, /area/station/security/checkpoint/supply) +"rgq" = ( +/obj/machinery/modular_computer/preset/civilian{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/science/robotics/lab) +"rgw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible, +/obj/structure/sign/directions/engineering{ + desc = "A sign that shows there are doors here. There are doors everywhere!"; + icon_state = "doors"; + name = "WARNING: PRESSURIZED DOORS"; + pixel_y = -32 + }, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "rgA" = ( /obj/structure/chair, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -68329,14 +68386,37 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) "rgC" = ( -/obj/structure/cable, /obj/structure/table/reinforced, -/obj/effect/decal/cleanable/dirt, /obj/item/folder/yellow, /obj/item/gps/mining, /obj/effect/turf_decal/tile/brown/anticorner/contrasted, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"rgG" = ( +/obj/structure/closet/secure_closet/engineering_personal, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/requests_console/directional/south{ + department = "Engineering"; + name = "Engineering Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/structure/sign/poster/official/do_not_question/directional/east, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/engineering/main) +"rgH" = ( +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/obj/machinery/status_display/ai/directional/north, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/ai_monitored/turret_protected/aisat_interior) "rgK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -68387,22 +68467,6 @@ /obj/effect/turf_decal/tile/yellow/anticorner/contrasted, /turf/open/floor/iron, /area/station/engineering/main) -"rhg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/obj/structure/chair/office{ - dir = 1 - }, -/obj/structure/sign/poster/random/directional/south, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) -"rhh" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/department/crew_quarters/bar) "rhi" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -68415,6 +68479,15 @@ }, /turf/open/floor/iron, /area/station/science/xenobiology) +"rhp" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/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) "rhw" = ( /obj/structure/chair/office/light{ dir = 8 @@ -68461,30 +68534,12 @@ }, /turf/open/floor/iron, /area/station/medical/virology) -"rhV" = ( -/obj/structure/table/wood, -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/maintenance, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/iron/dark, -/area/station/service/abandoned_gambling_den) "riq" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/grille/broken, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/department/crew_quarters/bar) -"rir" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/machinery/newscaster/directional/east, -/obj/effect/turf_decal/bot_red, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/ordnance) "riv" = ( /obj/effect/landmark/start/hangover/closet, /obj/structure/closet/emcloset, @@ -68513,6 +68568,13 @@ }, /turf/open/floor/iron, /area/station/medical/virology) +"riH" = ( +/obj/effect/turf_decal/bot, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/landmark/start/hangover, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) "riK" = ( /obj/structure/table_frame/wood, /obj/item/crowbar/red, @@ -68521,31 +68583,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/wood, /area/station/commons/dorms) -"riM" = ( -/obj/structure/table, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/plunger, -/obj/item/plunger, -/obj/effect/turf_decal/siding/yellow, -/obj/structure/sign/poster/official/periodic_table/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/medical/chemistry) -"riO" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/dinnerware, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/service/kitchen/abandoned) "riQ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/camera/directional/north{ @@ -68622,6 +68659,22 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/service/theater) +"rju" = ( +/obj/structure/closet/crate/preopen, +/obj/structure/sign/nanotrasen{ + pixel_x = 32 + }, +/obj/item/tank/internals/oxygen/red{ + pixel_x = 3 + }, +/obj/item/tank/internals/oxygen/red{ + pixel_x = -3 + }, +/obj/item/wrench, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/execution/education) "rjz" = ( /obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/glass/reinforced, @@ -68655,11 +68708,6 @@ }, /turf/open/floor/wood, /area/station/service/electronic_marketing_den) -"rjN" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "rjO" = ( /obj/effect/turf_decal/siding/blue{ dir = 9 @@ -68672,6 +68720,15 @@ /obj/effect/turf_decal/siding/white, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) +"rjT" = ( +/obj/structure/sign/poster/official/ion_rifle/directional/east, +/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/maintenance/department/science) "rjZ" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/line{ @@ -68683,27 +68740,29 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"rkj" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +"rkr" = ( +/obj/structure/chair{ + dir = 4 }, -/obj/machinery/status_display/ai/directional/north, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/directional/west, /turf/open/floor/iron, -/area/station/science/lab) -"rks" = ( -/obj/structure/table, -/obj/machinery/airalarm/directional/east, -/obj/machinery/light/directional/east, -/obj/item/storage/medkit/emergency, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) +/area/station/hallway/primary/central/aft) "rku" = ( /obj/structure/table/wood, -/obj/item/clipboard, -/obj/item/folder/red, -/obj/item/pen, +/obj/item/clipboard{ + pixel_y = 3 + }, +/obj/item/folder/red{ + pixel_y = 4 + }, +/obj/item/pen{ + pixel_x = -6; + pixel_y = 3 + }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/detectives_office) @@ -68763,15 +68822,6 @@ }, /turf/open/floor/iron/white, /area/station/science/lab) -"rlp" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/sign/warning/engine_safety/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron, -/area/station/engineering/lobby) "rlq" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, @@ -68802,9 +68852,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, /obj/effect/mapping_helpers/airlock/unres, /obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/iron, /area/station/maintenance/department/electrical) "rly" = ( @@ -68832,7 +68882,7 @@ dir = 4 }, /obj/machinery/air_sensor/incinerator_tank, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "rlG" = ( /obj/item/crowbar/red, @@ -68843,6 +68893,28 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/plating, /area/station/science/research/abandoned) +"rlH" = ( +/obj/machinery/airalarm/directional/north, +/obj/structure/rack, +/obj/item/crowbar, +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/item/binoculars, +/obj/item/gps/engineering{ + gpstag = "CE0" + }, +/obj/machinery/camera/directional/north{ + c_tag = "AI Satellite - Transit Tube Entrance"; + name = "ai camera"; + network = list("minisat"); + start_active = 1 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) "rlJ" = ( /obj/effect/spawner/random/structure/tank_holder, /obj/effect/turf_decal/bot, @@ -68878,6 +68950,19 @@ }, /turf/open/floor/iron/dark, /area/station/security/evidence) +"rmc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/camera/directional/east{ + c_tag = "Engineering Hallway - Center"; + name = "hallway camera" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "rme" = ( /obj/structure/table/wood, /obj/item/phone{ @@ -68892,10 +68977,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/tcommsat/computer) -"rmf" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/r_wall, -/area/station/maintenance/port/aft) +"rmg" = ( +/obj/structure/table/reinforced, +/obj/item/wrench, +/obj/item/assembly/timer, +/obj/item/assembly/signaler, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "rmh" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/effect/turf_decal/stripes/line{ @@ -68924,23 +69015,50 @@ }, /turf/open/floor/iron/white/side, /area/station/medical/medbay/lobby) +"rmx" = ( +/obj/machinery/computer/telecomms/server{ + dir = 8 + }, +/obj/machinery/newscaster/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/dim/directional/east, +/turf/open/floor/iron/dark, +/area/station/tcommsat/computer) "rmH" = ( /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, /obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/mining{ - name = "Mining Dock" - }, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 }, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/supply/mining, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"rmI" = ( +/obj/structure/table/reinforced, +/obj/item/electronics/apc, +/obj/item/electronics/apc{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/stack/cable_coil, +/obj/structure/sign/poster/official/build/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) +"rmP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/poster/contraband/free_drone/directional/north, +/turf/open/floor/iron, +/area/station/science/research/abandoned) "rmV" = ( /obj/machinery/newscaster/directional/east, /obj/effect/turf_decal/bot, @@ -68952,12 +69070,11 @@ /obj/structure/sink/directional/west, /turf/open/floor/iron, /area/station/science/robotics/lab) -"rnh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, +"rnf" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) +/turf/open/floor/iron/dark, +/area/station/security/execution/education) "rni" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -68968,6 +69085,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/circuits) +"rnm" = ( +/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/machinery/bluespace_vendor/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "rnn" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -69016,19 +69142,25 @@ }, /turf/open/floor/iron, /area/station/security/prison/safe) -"rnM" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/maintenance/disposal/incinerator) "rnP" = ( /obj/effect/turf_decal/stripes/end{ dir = 1 }, /turf/open/floor/iron, /area/station/cargo/storage) +"rnS" = ( +/obj/effect/turf_decal/box/white/corners{ + dir = 1 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Xenobiology - Cell 6"; + name = "xenobiology camera"; + network = list("ss13","xeno","rd") + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/science/xenobiology) "rnW" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -69053,6 +69185,15 @@ }, /turf/open/floor/iron, /area/station/maintenance/port) +"rol" = ( +/obj/structure/chair/sofa/bench{ + dir = 8 + }, +/obj/item/radio/intercom/directional/east, +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "rop" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -69155,35 +69296,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/xenobiology) -"rqn" = ( -/obj/machinery/disposal/bin, -/obj/machinery/light/directional/south, -/obj/structure/sign/nanotrasen{ - pixel_x = 32; - pixel_y = -32 - }, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/airalarm/directional/south, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hos) -"rqr" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/sign/poster/official/moth_epi/directional/west, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/medical/storage) "rqy" = ( /obj/structure/table, /obj/machinery/firealarm/directional/east, @@ -69209,6 +69321,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/port) "rqV" = ( @@ -69238,6 +69351,15 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"rrq" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/table/reinforced, +/obj/item/weldingtool, +/obj/item/wrench, +/obj/item/clothing/head/utility/welding, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos) "rrt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -69276,16 +69398,6 @@ "rrU" = ( /turf/open/floor/plating, /area/station/maintenance/port) -"rrV" = ( -/obj/machinery/airalarm/directional/west, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) "rsa" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -69314,16 +69426,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"rss" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/structure/sign/poster/official/safety_report/directional/west, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/escape) "rsw" = ( /obj/structure/table/reinforced, /obj/item/storage/box/ids, @@ -69351,15 +69453,6 @@ /obj/effect/turf_decal/tile/yellow/half/contrasted, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"rtk" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/port/fore) "rtv" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -69457,14 +69550,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/genetics) -"rug" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "rul" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -69503,10 +69588,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/plating, /area/station/service/theater/abandoned) -"rvb" = ( -/obj/machinery/firealarm/directional/north, -/turf/open/floor/wood, -/area/station/command/meeting_room/council) "rve" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, @@ -69612,6 +69693,18 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"rwk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/random/directional/west, +/turf/open/floor/iron/grimy, +/area/station/service/abandoned_gambling_den) +"rwl" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "rwu" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -69625,17 +69718,6 @@ }, /turf/open/floor/carpet/blue, /area/station/service/library/lounge) -"rwS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/south{ - c_tag = "Atmospherics - Project Room Closet"; - name = "atmospherics camera" - }, -/obj/machinery/status_display/evac/directional/south, -/turf/open/floor/iron/half{ - dir = 8 - }, -/area/station/engineering/atmos/project) "rwZ" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/landmark/start/scientist, @@ -69674,6 +69756,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"rxM" = ( +/obj/machinery/vending/wardrobe/chef_wardrobe, +/obj/effect/turf_decal/bot, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/service/kitchen) "rxT" = ( /obj/structure/table/reinforced, /obj/item/paper_bin{ @@ -69720,6 +69808,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) +"ryd" = ( +/obj/machinery/duct, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos/project) "ryg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -69739,20 +69836,32 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/atmos/hfr_room) +"ryp" = ( +/obj/structure/table, +/obj/machinery/light_switch/directional/south{ + pixel_x = -6 + }, +/obj/machinery/status_display/evac/directional/east, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 3 + }, +/obj/item/storage/toolbox/electrical{ + pixel_x = 1 + }, +/obj/item/multitool, +/obj/item/clothing/head/utility/welding, +/obj/effect/turf_decal/siding/purple{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/science/robotics/lab) "ryt" = ( /obj/structure/lattice, /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/west, /turf/open/space, /area/space/nearstation) -"ryx" = ( -/obj/machinery/requests_console/directional/north{ - department = "Chapel"; - name = "Chapel Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/carpet/royalblack, -/area/station/service/chapel/office) "ryA" = ( /obj/structure/chair{ dir = 1 @@ -69816,14 +69925,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) -"rza" = ( -/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/light/directional/east, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "rzg" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible, /obj/machinery/computer/atmos_control/nitrous_tank{ @@ -69837,6 +69938,13 @@ dir = 1 }, /area/station/engineering/atmos) +"rzw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/frame/machine, +/obj/item/wirecutters, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/bar) "rzF" = ( /obj/structure/dresser, /obj/machinery/computer/security/telescreen/entertainment/directional/west, @@ -69910,6 +70018,9 @@ /area/station/cargo/storage) "rAl" = ( /obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, /obj/machinery/conveyor{ id = "cargodisposals" }, @@ -70051,25 +70162,6 @@ /obj/item/pai_card, /turf/open/floor/iron/white, /area/station/science/research) -"rCj" = ( -/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/bot, -/obj/machinery/door/window/left/directional/west{ - name = "Jetpack Storage"; - req_access = list("eva") - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) "rCx" = ( /obj/structure/rack, /obj/effect/spawner/random/techstorage/tcomms_all, @@ -70137,6 +70229,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/main) +"rDJ" = ( +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "rDL" = ( /turf/open/floor/iron, /area/station/engineering/storage_shared) @@ -70240,15 +70339,16 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) -"rFl" = ( +"rFm" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/bed/medical/emergency, +/obj/machinery/iv_drip, +/obj/effect/turf_decal/siding/dark_blue, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light/directional/south, -/obj/structure/sign/warning/no_smoking/directional/south, -/obj/effect/turf_decal/trimline/purple/filled/line, -/turf/open/floor/iron/white, -/area/station/science/ordnance/storage) +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "rFz" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 @@ -70259,6 +70359,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"rFB" = ( +/obj/structure/cable, +/obj/machinery/status_display/evac/directional/east, +/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/engineering/gravity_generator) "rFG" = ( /obj/effect/turf_decal/siding/yellow/corner{ dir = 8 @@ -70266,6 +70375,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/atmos/storage) +"rFV" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/trunk, +/obj/machinery/camera/directional/north{ + c_tag = "Security - Office Fore"; + dir = 9 + }, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/office) "rFZ" = ( /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -70299,12 +70421,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/fore) -"rGO" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "rGU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -70357,6 +70473,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/checkpoint/customs/fore) +"rHI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "rHQ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -70372,6 +70497,14 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/engineering/atmos) +"rHZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/status_display/ai/directional/north, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron, +/area/station/science/lab) "rIa" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 @@ -70411,12 +70544,35 @@ /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/iron, /area/station/service/kitchen/abandoned) +"rIl" = ( +/obj/machinery/mass_driver/chapelgun, +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 + }, +/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) "rIn" = ( /obj/effect/turf_decal/trimline/yellow/warning, /turf/open/floor/iron/white/smooth_edge{ dir = 1 }, /area/station/commons/fitness/recreation) +"rIv" = ( +/obj/structure/sign/poster/official/moth_meth/directional/west, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"rIx" = ( +/obj/structure/table, +/obj/item/clipboard, +/turf/open/floor/iron/checker, +/area/station/hallway/secondary/service) "rID" = ( /obj/effect/turf_decal/tile/green{ dir = 8 @@ -70443,6 +70599,11 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) +"rIM" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/execution/education) "rIN" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/corner, @@ -70484,12 +70645,6 @@ /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/iron, /area/station/maintenance/port) -"rJa" = ( -/obj/structure/closet/radiation, -/obj/effect/turf_decal/bot, -/obj/item/analyzer, -/turf/open/floor/iron, -/area/station/engineering/atmos/hfr_room) "rJb" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -70588,6 +70743,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"rKE" = ( +/obj/effect/turf_decal/trimline/yellow/line, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/engineering/atmos/project) "rKF" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -70667,20 +70827,6 @@ /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron/dark/smooth_large, /area/station/commons/fitness/recreation) -"rLx" = ( -/obj/machinery/status_display/evac/directional/east, -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Science - Port Hallway"; - name = "science camera"; - network = list("ss13","rd") - }, -/obj/machinery/light/directional/east, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/white, -/area/station/science/research) "rLz" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -70909,6 +71055,21 @@ dir = 4 }, /area/station/commons/fitness/recreation) +"rOq" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/obj/effect/turf_decal/box/corners{ + dir = 4 + }, +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) "rOH" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch" @@ -71053,6 +71214,13 @@ }, /turf/closed/wall, /area/station/commons/vacant_room/office) +"rPJ" = ( +/obj/structure/cable, +/obj/effect/spawner/random/structure/crate, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/iron, +/area/station/maintenance/port/fore) "rPN" = ( /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71147,13 +71315,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/execution/education) -"rQw" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) "rQB" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -71163,6 +71324,11 @@ /obj/structure/mirror/directional/west, /turf/open/floor/wood, /area/station/maintenance/port/aft) +"rQF" = ( +/obj/machinery/netpod, +/obj/effect/decal/cleanable/robot_debris, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/bitrunning/den) "rQI" = ( /obj/machinery/airlock_sensor/incinerator_atmos{ pixel_x = 24 @@ -71171,21 +71337,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) -"rQN" = ( -/obj/structure/cable, -/obj/machinery/camera/directional/west{ - c_tag = "Library - Game Lounge"; - dir = 1; - name = "library camera" - }, -/obj/machinery/firealarm/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/grimy, -/area/station/service/library/lounge) "rQQ" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 5 @@ -71199,6 +71350,21 @@ /obj/effect/turf_decal/siding/white/corner, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) +"rQZ" = ( +/obj/machinery/modular_computer/preset/id{ + dir = 8 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Customs - Arrivals" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/customs/fore) "rRa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -71208,6 +71374,13 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/storage) +"rRk" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white, +/area/station/science/research) "rRr" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71225,6 +71398,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/chapel/storage) +"rRz" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/station/tcommsat/server) "rRB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -71282,14 +71462,6 @@ }, /turf/open/floor/iron/large, /area/station/security/checkpoint/escape) -"rSa" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "rSg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -71353,6 +71525,24 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron/dark/textured, /area/station/science/ordnance/storage) +"rST" = ( +/obj/machinery/computer/crew{ + dir = 1 + }, +/obj/machinery/requests_console/directional/south{ + department = "Chief Medical Officer's Desk"; + name = "Chief Medical Officer's Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/machinery/light_switch/directional/west, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/command/heads_quarters/cmo) "rSZ" = ( /obj/machinery/vending/cigarette, /obj/effect/turf_decal/delivery, @@ -71362,17 +71552,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/break_room) -"rTe" = ( -/obj/machinery/light/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Central Hallway - Security Hallway"; - name = "hallway camera" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "rTr" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/graffiti, @@ -71451,6 +71630,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/xenobiology) +"rUi" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/loading_area{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "rUj" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -71508,6 +71695,22 @@ }, /turf/open/floor/iron, /area/station/maintenance/fore) +"rUW" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"rUX" = ( +/obj/structure/sign/nanotrasen{ + pixel_x = 32 + }, +/obj/item/kirbyplants/random, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/wood, +/area/station/commons/dorms) "rVc" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch" @@ -71523,16 +71726,6 @@ /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/iron, /area/station/service/library/abandoned) -"rVf" = ( -/obj/machinery/light/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Departures Lounge - Fore Starboard"; - dir = 6; - name = "departures camera" - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron/dark/corner, -/area/station/hallway/secondary/exit/departure_lounge) "rVs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -71576,12 +71769,25 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/chapel/funeral) +"rVH" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/green/visible, +/obj/machinery/status_display/evac/directional/west, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "rVK" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 9 }, /turf/open/floor/iron/white, /area/station/science/research) +"rVM" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/engine_access, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "rVX" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -71598,26 +71804,6 @@ /obj/effect/decal/cleanable/oil, /turf/open/floor/iron, /area/station/cargo/sorting) -"rWj" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/sign/nanotrasen{ - pixel_x = 32; - pixel_y = 32 - }, -/obj/structure/sign/directions/engineering{ - desc = "A sign that shows there are doors here. There are doors everywhere!"; - icon_state = "doors"; - name = "WARNING: BLAST DOORS"; - pixel_y = 32 - }, -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "rWo" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -71633,19 +71819,6 @@ }, /turf/open/floor/iron/textured, /area/station/engineering/atmos) -"rWu" = ( -/obj/machinery/status_display/evac/directional/east, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/east{ - c_tag = "Arrivals Dock - Fore Port"; - name = "dock camera" - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "rWz" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -71661,13 +71834,6 @@ /mob/living/carbon/human/species/monkey, /turf/open/floor/iron/white, /area/station/medical/virology) -"rWG" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/office) "rWK" = ( /obj/structure/cable, /obj/machinery/firealarm/directional/east, @@ -71776,19 +71942,19 @@ }, /turf/open/floor/iron, /area/station/cargo/drone_bay) +"rXN" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "rXR" = ( /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/engineering/main) -"rXS" = ( -/obj/structure/table/wood, -/obj/item/taperecorder, -/obj/machinery/light/small/directional/north, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/carpet/blue, -/area/station/commons/vacant_room/office) "rXT" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/plastic, @@ -71952,19 +72118,6 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron, /area/station/maintenance/department/engine/atmos) -"sac" = ( -/obj/machinery/autolathe, -/obj/machinery/light/directional/west, -/obj/machinery/light_switch/directional/south{ - pixel_x = -20 - }, -/obj/machinery/firealarm/directional/west, -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/office) "sao" = ( /obj/machinery/hydroponics/constructable, /obj/structure/railing{ @@ -72053,6 +72206,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) +"saS" = ( +/obj/structure/closet/crate, +/obj/effect/decal/cleanable/dirt, +/obj/item/crowbar/red, +/obj/item/stack/sheet/mineral/plasma{ + amount = 20 + }, +/obj/item/gps/engineering, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/engineering/main) "saT" = ( /obj/structure/cable, /obj/machinery/holopad/secure, @@ -72074,15 +72238,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"sbD" = ( +"sbl" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/machinery/recharger, -/obj/item/radio/intercom/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/range) +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/sign/warning/biohazard/directional/south, +/turf/open/floor/iron, +/area/station/maintenance/department/science) "sbP" = ( /obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt, @@ -72092,16 +72255,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/crew_quarters/bar) -"sbR" = ( -/obj/structure/cable, -/obj/machinery/light/directional/south, -/obj/machinery/computer/security{ - dir = 1 - }, -/obj/machinery/newscaster/directional/south, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/checkpoint/engineering) "sbT" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -72164,6 +72317,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/chapel) +"scv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/machinery/camera/directional/east{ + c_tag = "Cargo Bay - Delivery Office"; + name = "cargo camera" + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/cargo/sorting) "scy" = ( /obj/machinery/atmospherics/components/trinary/mixer{ dir = 4 @@ -72171,6 +72335,29 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) +"scR" = ( +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/white, +/area/station/science/research) +"scU" = ( +/obj/structure/easel, +/obj/effect/decal/cleanable/dirt, +/obj/item/canvas/twentythree_twentythree, +/obj/item/canvas/twentythree_twentythree, +/turf/open/floor/plating, +/area/station/service/library/abandoned) +"scX" = ( +/obj/machinery/door/window{ + base_state = "rightsecure"; + dir = 4; + icon_state = "rightsecure"; + name = "Primary AI Core Access"; + req_access = list("ai_upload") + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "sdi" = ( /obj/machinery/atmospherics/pipe/smart/manifold/supply/visible, /obj/machinery/meter/monitored/distro_loop, @@ -72234,6 +72421,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"sdV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor, +/turf/open/floor/wood/large, +/area/station/command/corporate_showroom) "sef" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -72293,13 +72485,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"seP" = ( -/obj/machinery/telecomms/server/presets/security, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) "sfc" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -72327,6 +72512,18 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"sfy" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/computer/shuttle/mining/common, +/obj/structure/sign/directions/engineering{ + desc = "A sign that shows there are doors here. There are doors everywhere!"; + icon_state = "doors"; + name = "WARNING: EXTERNAL AIRLOCK"; + pixel_y = 32 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/smooth_large, +/area/station/hallway/secondary/entry) "sfA" = ( /obj/structure/chair/stool/directional/north, /obj/effect/landmark/start/assistant, @@ -72380,6 +72577,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/server) +"sgd" = ( +/obj/structure/cable, +/obj/machinery/biogenerator, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/siding/green{ + dir = 8 + }, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron/checker, +/area/station/service/hydroponics/garden/abandoned) "sgh" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -72406,6 +72613,14 @@ }, /turf/open/floor/iron, /area/station/medical/pharmacy) +"sgA" = ( +/obj/structure/table/reinforced, +/obj/machinery/gulag_item_reclaimer{ + pixel_y = 28 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/processing) "sgD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -72421,8 +72636,12 @@ /turf/open/space/basic, /area/space) "sgK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/miningoffice) "sgZ" = ( @@ -72434,10 +72653,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/main) -"shc" = ( -/obj/effect/landmark/start/prisoner, -/turf/open/floor/plating, -/area/station/security/prison/work) "shm" = ( /obj/effect/spawner/random/structure/table_or_rack, /obj/machinery/airalarm/directional/north, @@ -72449,6 +72664,14 @@ }, /turf/open/floor/engine/vacuum, /area/station/engineering/atmos) +"shM" = ( +/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/machinery/light/floor, +/turf/open/floor/iron/grimy, +/area/station/command/heads_quarters/hos) "shO" = ( /obj/structure/cable, /turf/open/floor/circuit/green, @@ -72598,14 +72821,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay) -"sjs" = ( -/obj/item/kirbyplants/random, -/obj/machinery/status_display/ai/directional/west, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "sjt" = ( /turf/closed/wall, /area/station/hallway/secondary/entry) @@ -72616,6 +72831,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) +"sjD" = ( +/obj/structure/closet/radiation, +/obj/effect/turf_decal/bot, +/obj/item/analyzer, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos/hfr_room) "sjH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -72675,6 +72897,28 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/command/teleporter) +"sky" = ( +/obj/machinery/light_switch/directional/north{ + pixel_x = -8 + }, +/obj/machinery/button/door{ + id = "rdordnance"; + name = "Ordnance Containment Control"; + pixel_x = 8; + pixel_y = 26; + req_access = list("science") + }, +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Science - Ordnance Lab Access"; + name = "science camera"; + network = list("ss13","rd") + }, +/turf/open/floor/iron/white, +/area/station/science/ordnance/office) "skC" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -72690,6 +72934,14 @@ }, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"skQ" = ( +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/effect/turf_decal/box/red, +/obj/structure/sign/poster/official/help_others/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/execution/education) "skX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -72778,16 +73030,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/port) -"slX" = ( -/obj/structure/cable, -/obj/machinery/light/directional/west, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/turf_decal/siding/white, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/hallway/primary/fore) "slZ" = ( /obj/machinery/power/port_gen/pacman/pre_loaded, /obj/effect/turf_decal/bot_red, @@ -72814,14 +73056,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/smooth, /area/station/maintenance/department/science/xenobiology) -"smo" = ( -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "smF" = ( /obj/structure/chair{ dir = 8; @@ -72906,25 +73140,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"snU" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden, -/obj/machinery/light_switch/directional/west{ - pixel_y = 8 - }, -/obj/machinery/light/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Atmospherics - Office"; - name = "atmospherics camera" - }, +"snW" = ( +/obj/structure/rack, /obj/effect/turf_decal/bot, -/obj/item/radio/intercom/directional/west{ - pixel_y = -8 - }, -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 4 +/obj/structure/window/reinforced/spawner/directional/east{ + pixel_x = 3 }, -/turf/open/floor/iron/dark/textured_large, -/area/station/engineering/atmos/storage/gas) +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/spawner/random/armory/disablers, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "sob" = ( /obj/structure/disposalpipe/segment, /obj/item/kirbyplants/random, @@ -72932,15 +73157,15 @@ /turf/open/floor/iron/dark, /area/station/science/circuits) "sog" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ - dir = 8 - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/components/binary/pump/on/supply/visible/layer4{ + dir = 8 + }, /turf/open/floor/iron/dark/corner, /area/station/maintenance/disposal/incinerator) "sox" = ( @@ -72955,6 +73180,25 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/courtroom) +"soO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Engineering - Supermatter Foyer"; + name = "engineering camera"; + network = list("ss13","engine") + }, +/obj/structure/rack, +/obj/item/analyzer, +/obj/item/geiger_counter, +/obj/item/geiger_counter{ + pixel_x = 3; + pixel_y = 4 + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron, +/area/station/engineering/main) "soU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/neutral/full, @@ -72983,6 +73227,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/science/research) +"spe" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/sign/warning/fire/directional/east, +/turf/open/floor/iron, +/area/station/engineering/main) "spq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria, @@ -73057,6 +73312,12 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/medical/medbay/lobby) +"sqD" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp, +/obj/structure/sign/poster/official/work_for_a_future/directional/south, +/turf/open/floor/carpet, +/area/station/commons/vacant_room/office) "sqI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -73110,6 +73371,13 @@ }, /turf/open/floor/iron/checker, /area/station/maintenance/disposal/incinerator) +"srg" = ( +/obj/structure/table/glass, +/obj/item/food/pizzaslice/vegetable, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/bless_this_spess/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/space_hut/observatory) "srh" = ( /obj/machinery/door/window/brigdoor/security/cell/right/directional/west{ id = "brig1"; @@ -73136,17 +73404,6 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/large, /area/station/science/research) -"srA" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/obj/structure/sign/warning/secure_area/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Atmospherics - Aft Tanks"; - name = "atmospherics camera" - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "srI" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -73266,30 +73523,34 @@ /area/station/medical/pharmacy) "stf" = ( /obj/structure/disposalpipe/segment, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 1 +/turf/open/floor/iron/herringbone, +/area/station/cargo/miningoffice) +"stp" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 }, +/obj/machinery/modular_computer/preset/cargochat/science{ + dir = 4 + }, +/obj/effect/turf_decal/bot/left, /turf/open/floor/iron, -/area/station/cargo/miningoffice) +/area/station/science/research) "stx" = ( /obj/structure/chair/pew/left, /turf/open/floor/iron/chapel{ dir = 10 }, /area/station/service/chapel) -"stB" = ( -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/duct, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 +"stA" = ( +/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 = 8 }, -/area/station/medical/morgue) +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/security/brig) "stC" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -73318,35 +73579,6 @@ }, /turf/open/floor/wood, /area/station/service/theater) -"stO" = ( -/obj/structure/table/wood, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/obj/item/clothing/suit/costume/justice, -/obj/item/clothing/head/helmet/toggleable/justice/escape{ - name = "justice helmet" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/theater/abandoned) -"stX" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/directional/west, -/obj/machinery/requests_console/directional/west{ - department = "Security"; - name = "Security Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/toy/figure/warden{ - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/warden) "suj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -73409,6 +73641,14 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/electrical) +"suH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/modular_computer/preset/civilian, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron/dark, +/area/station/engineering/storage_shared) "suQ" = ( /obj/structure/cable, /obj/structure/table/wood/fancy/blue, @@ -73441,17 +73681,50 @@ }, /turf/open/floor/iron/cafeteria, /area/station/engineering/atmos) +"sva" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/warning/engine_safety/directional/south, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron, +/area/station/engineering/lobby) +"svc" = ( +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "xeno7"; + name = "Containment Control"; + req_access = list("xenobiology") + }, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/iron, +/area/station/science/xenobiology) "svd" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/crate, /obj/effect/spawner/random/engineering/tool, /turf/open/floor/plating, /area/station/maintenance/department/security) -"svk" = ( -/obj/structure/chair/office, +"svf" = ( +/obj/structure/closet/crate/hydroponics, +/obj/effect/spawner/random/food_or_drink/seed, +/obj/effect/spawner/random/food_or_drink/seed, +/obj/effect/spawner/random/food_or_drink/seed, +/obj/effect/spawner/random/maintenance, +/obj/machinery/light_switch/directional/east{ + pixel_y = 6 + }, +/obj/effect/turf_decal/box, +/turf/open/floor/iron/checker, +/area/station/service/hydroponics/garden/abandoned) +"svj" = ( +/obj/effect/turf_decal/box/white/corners{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/service/library/abandoned) +/turf/open/floor/iron/dark, +/area/station/science/xenobiology) "svm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -73460,19 +73733,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel/funeral) -"svq" = ( -/obj/machinery/status_display/supply{ - pixel_x = -32 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Cargo Bay - Port"; - name = "cargo camera" - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "svt" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -73487,18 +73747,6 @@ /obj/structure/sign/poster/random/directional/east, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"svI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/camera/directional/east{ - c_tag = "Engineering Hallway - Center"; - name = "hallway camera" - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "svO" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 @@ -73540,6 +73788,16 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark/side, /area/station/security/checkpoint/medical/medsci) +"swg" = ( +/obj/machinery/cell_charger, +/obj/structure/table/reinforced, +/obj/machinery/status_display/ai/directional/north, +/obj/item/rcl/pre_loaded, +/obj/effect/turf_decal/bot, +/obj/item/stock_parts/cell/high, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "swj" = ( /obj/structure/table/wood, /obj/machinery/fax{ @@ -73645,18 +73903,6 @@ /obj/item/papercutter, /turf/open/floor/iron/grimy, /area/station/command/bridge) -"sxB" = ( -/obj/machinery/airalarm/directional/west, -/obj/structure/table, -/obj/item/paper_bin/carbon{ - pixel_y = 5 - }, -/obj/effect/spawner/random/bureaucracy/pen, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "sxD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -73696,14 +73942,6 @@ }, /turf/open/floor/iron, /area/station/medical/paramedic) -"sxJ" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/flora/bush/flowers_pp/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/turf/open/floor/grass, -/area/station/hallway/secondary/exit/departure_lounge) "sxK" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/cable, @@ -73712,15 +73950,6 @@ }, /turf/open/floor/wood/large, /area/station/service/barber) -"sxO" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/bodycontainer/morgue/beeper_off{ - dir = 8 - }, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "sxP" = ( /obj/machinery/computer/records/security, /obj/machinery/status_display/ai/directional/north, @@ -73780,6 +74009,14 @@ "sze" = ( /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) +"szf" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/status_display/evac/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal/incinerator) "szg" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -73848,16 +74085,6 @@ "szy" = ( /turf/closed/wall, /area/station/service/bar/backroom) -"szF" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/item/storage/toolbox/mechanical, -/obj/item/clothing/glasses/meson/engine/tray, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/engineering/atmos) "szG" = ( /obj/effect/turf_decal/box/white, /turf/open/floor/iron/dark/textured_large, @@ -73875,19 +74102,41 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/processing) -"szM" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "szN" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"szZ" = ( +/obj/structure/table/reinforced, +/obj/item/folder/yellow, +/obj/item/stack/package_wrap, +/obj/item/hand_labeler, +/obj/structure/extinguisher_cabinet/directional/north{ + pixel_x = 32 + }, +/obj/item/radio/intercom/directional/east{ + pixel_x = 38; + pixel_y = 3 + }, +/obj/machinery/keycard_auth/directional/east{ + pixel_x = 40; + pixel_y = -8 + }, +/obj/machinery/button/door/directional/east{ + id = "qmspace"; + name = "Space Shutters Control"; + pixel_y = -8 + }, +/obj/machinery/button/door/directional/east{ + id = "qmprivacy"; + name = "Privacy Control"; + pixel_y = 6 + }, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/qm) "sAh" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -73909,15 +74158,6 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) -"sAw" = ( -/obj/effect/turf_decal/trimline/green/filled/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/poster/official/plasma_effects/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/virology) "sAD" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -73927,18 +74167,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/maintenance/department/medical/morgue) -"sAQ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/closet/crate/preopen, -/obj/item/clothing/head/cone, -/obj/item/clothing/head/cone, -/obj/item/clothing/head/cone, -/obj/item/clothing/head/cone, -/obj/structure/sign/poster/official/moth_delam/directional/south, -/turf/open/floor/iron, -/area/station/engineering/main) "sAU" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -74029,6 +74257,12 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/aft) +"sBM" = ( +/obj/structure/table, +/obj/machinery/airalarm/directional/east, +/obj/item/storage/medkit/emergency, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) "sBX" = ( /turf/closed/wall, /area/station/service/bar) @@ -74113,6 +74347,7 @@ }, /obj/effect/mapping_helpers/airlock/access/any/supply/mining, /obj/effect/mapping_helpers/airlock/access/any/supply/shipping, +/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, /turf/open/floor/iron, /area/station/cargo/sorting) "sCY" = ( @@ -74226,20 +74461,6 @@ "sEs" = ( /turf/closed/wall, /area/station/command/heads_quarters/captain/private) -"sEt" = ( -/obj/machinery/hydroponics/constructable, -/obj/item/radio/intercom/directional/south, -/obj/machinery/camera/directional/east{ - c_tag = "Service - Hydroponics Front Aft"; - name = "service camera" - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/green/opposingcorners{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron, -/area/station/service/hydroponics) "sEv" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/loading_area{ @@ -74284,15 +74505,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/corporate_showroom) -"sFM" = ( -/obj/structure/table/reinforced, -/obj/item/crowbar, -/obj/item/wrench, -/obj/item/radio, -/obj/structure/sign/poster/official/space_cops/directional/west, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron, -/area/station/security/checkpoint/escape) "sFR" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -74329,12 +74541,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"sGd" = ( -/obj/machinery/light/directional/north, -/obj/machinery/status_display/ai/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "sGi" = ( /obj/structure/cable, /obj/effect/landmark/start/hangover, @@ -74387,13 +74593,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"sGO" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/light/small/directional/east, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) "sGQ" = ( /obj/structure/chair/office{ dir = 4 @@ -74440,6 +74639,20 @@ "sHt" = ( /turf/open/space/basic, /area/space/nearstation) +"sHv" = ( +/obj/machinery/computer/mecha{ + dir = 8 + }, +/obj/machinery/computer/security/telescreen/rd{ + dir = 8; + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron, +/area/station/command/heads_quarters/rd) "sHw" = ( /obj/machinery/firealarm/directional/east, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -74447,14 +74660,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"sHx" = ( -/obj/structure/bodycontainer/morgue/beeper_off{ - dir = 8 - }, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "sHC" = ( /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) @@ -74487,12 +74692,6 @@ "sHT" = ( /turf/closed/wall/r_wall, /area/station/engineering/supermatter) -"sHW" = ( -/obj/structure/cable, -/obj/machinery/status_display/ai/directional/south, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/science/xenobiology) "sIb" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -74576,16 +74775,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/customs/aft) -"sIP" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/obj/structure/sign/poster/random/directional/south, -/obj/machinery/power/port_gen/pacman/pre_loaded, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "sIR" = ( /obj/machinery/shower/directional/west, /obj/effect/spawner/random/contraband/prison, @@ -74626,16 +74815,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"sJd" = ( -/obj/structure/cable, -/obj/item/kirbyplants/random, -/obj/machinery/light/directional/west, -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "sJh" = ( /obj/structure/extinguisher_cabinet/directional/west, /obj/machinery/portable_atmospherics/canister/oxygen, @@ -74680,6 +74859,23 @@ /obj/machinery/button/ignition/incinerator/atmos, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) +"sJG" = ( +/obj/item/reagent_containers/chem_pack{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/item/reagent_containers/chem_pack{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/reagent_containers/chem_pack{ + pixel_y = 3 + }, +/obj/structure/table/reinforced/rglass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron, +/area/station/medical/treatment_center) "sJN" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -74801,17 +74997,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"sKW" = ( -/obj/structure/cable, -/obj/item/circuitboard/computer/secure_data, -/obj/structure/frame/computer{ - anchored = 1; - dir = 8 - }, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/service/electronic_marketing_den) "sLa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -74842,9 +75027,13 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron, /area/station/engineering/supermatter/room) +"sLf" = ( +/obj/machinery/computer/mechpad, +/obj/effect/turf_decal/bot, +/obj/structure/sign/poster/official/build/directional/north, +/turf/open/floor/iron, +/area/station/science/robotics/mechbay) "sLg" = ( -/obj/machinery/rnd/bepis, -/obj/effect/turf_decal/box/white, /turf/open/floor/iron, /area/station/cargo/storage) "sLx" = ( @@ -75023,6 +75212,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/duct, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron, /area/station/maintenance/department/chapel) "sOi" = ( @@ -75069,11 +75259,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/processing) -"sPb" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "sPd" = ( /obj/structure/bookcase{ name = "Holy Bookcase" @@ -75317,6 +75502,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/ai) +"sSe" = ( +/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/machinery/button/door/directional/north{ + id = "teleportershutters"; + name = "Teleporter Shutters"; + req_access = list("command") + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) "sSh" = ( /obj/machinery/conveyor{ dir = 4; @@ -75329,21 +75531,18 @@ }, /turf/open/floor/plating, /area/station/cargo/storage) -"sSn" = ( -/obj/machinery/status_display/ai/directional/north, -/turf/open/floor/iron/half{ - dir = 8 +"sSl" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 }, -/area/station/engineering/atmos/project) -"sSv" = ( -/obj/structure/sign/poster/ripped/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{ - dir = 8 +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 }, -/turf/open/floor/iron, -/area/station/security/prison/safe) +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "sSw" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -75352,16 +75551,12 @@ /obj/effect/spawner/random/trash/graffiti, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"sSz" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/item/radio/intercom/directional/east, +"sSx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron, -/area/station/hallway/secondary/entry) +/area/station/science/research/abandoned) "sSH" = ( /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 8 @@ -75429,30 +75624,13 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/medical/medsci) -"sTE" = ( -/obj/machinery/firealarm/directional/south, -/obj/structure/table/reinforced, -/obj/item/storage/box/monkeycubes{ - pixel_y = 3 - }, -/obj/item/storage/box/monkeycubes, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"sTK" = ( -/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/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) +"sTG" = ( +/obj/structure/table, +/obj/item/clothing/gloves/latex, +/obj/item/clothing/glasses/science, +/obj/structure/sign/poster/official/science/directional/west, +/turf/open/floor/iron/white, +/area/station/science/lobby) "sTR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -75503,15 +75681,6 @@ /obj/effect/landmark/start/depsec/medical, /turf/open/floor/iron/white, /area/station/medical/medbay) -"sUm" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/machinery/light/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/maintenance/department/eva/abandoned) "sUv" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/effect/turf_decal/bot, @@ -75687,23 +75856,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/maintenance/disposal/incinerator) -"sWw" = ( -/obj/structure/rack, -/obj/item/storage/belt/utility, -/turf/open/floor/plating, -/area/station/science/research/abandoned) -"sWD" = ( -/obj/machinery/light_switch/directional/east{ - pixel_x = 22 - }, -/obj/machinery/modular_computer/console/preset/id{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) "sWI" = ( /obj/machinery/camera/directional/east{ c_tag = "Central Hallway - Starboard"; @@ -75854,14 +76006,6 @@ }, /turf/open/floor/iron, /area/station/science/lab) -"sXX" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) "sYf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -75886,12 +76030,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/ordnance/office) -"sYt" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/spawner/random/maintenance/two, -/obj/structure/closet, -/turf/open/floor/plating, -/area/station/maintenance/fore) +"sYw" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/landmark/event_spawn, +/obj/machinery/light/floor, +/turf/open/floor/vault, +/area/station/commons/fitness/recreation) "sYD" = ( /obj/effect/turf_decal/trimline/yellow/corner, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -75937,15 +76081,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"sZi" = ( -/obj/machinery/smartfridge/extract/preloaded, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "sZn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -76003,6 +76138,13 @@ dir = 1 }, /area/station/science/research) +"sZT" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen, +/obj/structure/sign/poster/official/report_crimes/directional/north, +/turf/open/floor/carpet/blue, +/area/station/commons/vacant_room/office) "sZV" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -76013,16 +76155,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/main) -"taa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/green/filled/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/vending/wallmed/directional/east, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) "tax" = ( /turf/closed/wall, /area/station/engineering/break_room) @@ -76051,13 +76183,18 @@ }, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"tbs" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 +"tbf" = ( +/obj/structure/table/reinforced, +/obj/item/healthanalyzer, +/obj/item/stack/cable_coil{ + pixel_x = 3; + pixel_y = 3 }, -/obj/structure/sign/warning/explosives/alt/directional/east, -/turf/open/floor/iron, -/area/station/maintenance/department/science) +/obj/item/stack/cable_coil, +/obj/item/healthanalyzer, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "tbC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -76114,6 +76251,16 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/medical/medbay) +"tcd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/oil, +/obj/effect/turf_decal/bot, +/obj/machinery/mineral/stacking_unit_console{ + pixel_x = 32 + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal) "tce" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/item/radio/intercom/directional/north, @@ -76161,7 +76308,11 @@ /turf/open/floor/iron, /area/station/engineering/supermatter/room) "tcB" = ( -/obj/effect/decal/cleanable/oil, +/obj/machinery/door/airlock/mining{ + name = "Mining Dock" + }, +/obj/effect/mapping_helpers/airlock/access/all/supply/mining, +/obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/miningoffice) "tcG" = ( @@ -76180,21 +76331,6 @@ }, /turf/open/floor/circuit/green/telecomms/mainframe, /area/station/tcommsat/server) -"tcT" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/conveyor{ - dir = 4; - id = "garbage" - }, -/obj/structure/sign/warning/vacuum/directional/north, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "tcY" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/maintenance_hatch{ @@ -76251,15 +76387,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"tdv" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, -/obj/structure/table/reinforced, -/obj/item/storage/lockbox/loyalty, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "tdC" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/bot, @@ -76272,6 +76399,25 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel/office) +"tdX" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/effect/mapping_helpers/dead_body_placer, +/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) +"tek" = ( +/obj/structure/table, +/obj/machinery/status_display/evac/directional/west, +/obj/item/paper_bin, +/obj/item/pen, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) "teo" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -76298,6 +76444,15 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"teK" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/wood/corner, +/obj/machinery/light/floor, +/turf/open/floor/wood/large, +/area/station/command/corporate_showroom) "teU" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -76337,12 +76492,6 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/virology) -"tfp" = ( -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "tfq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -76401,13 +76550,6 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/space, /area/space/nearstation) -"tfR" = ( -/obj/structure/table/glass, -/obj/item/paper_bin, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/official/safety_eye_protection/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/space_hut/observatory) "tgl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -76441,15 +76583,10 @@ /turf/open/floor/wood, /area/station/commons/dorms) "tgI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/book/manual/wiki/atmospherics, -/obj/item/book/manual/wiki/ordnance{ - pixel_x = 4; - pixel_y = 1 - }, -/obj/effect/turf_decal/bot, -/obj/structure/rack, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/tank/air{ + dir = 9 + }, /turf/open/floor/iron/dark, /area/station/science/ordnance) "tgN" = ( @@ -76507,19 +76644,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"thn" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/item/wrench, -/obj/item/analyzer{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/engineering/atmos) "tho" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 @@ -76577,6 +76701,22 @@ /obj/effect/turf_decal/trimline/green/filled/corner, /turf/open/floor/iron/white, /area/station/medical/virology) +"thZ" = ( +/obj/machinery/status_display/evac/directional/west, +/obj/structure/filingcabinet/chestdrawer, +/mob/living/simple_animal/parrot/poly, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) +"tip" = ( +/obj/structure/rack, +/obj/item/aicard, +/obj/item/storage/secure/briefcase, +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "tiC" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 5 @@ -76584,13 +76724,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"tiM" = ( -/obj/machinery/status_display/evac/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/white, -/area/station/science/research) "tiP" = ( /obj/structure/table/wood, /obj/item/paper_bin, @@ -76600,11 +76733,6 @@ }, /turf/open/floor/wood, /area/station/commons/dorms) -"tiS" = ( -/obj/machinery/vending/wardrobe/chef_wardrobe, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/station/service/kitchen) "tiU" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -76724,6 +76852,12 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, /area/station/science/research) +"tlp" = ( +/obj/structure/table/reinforced, +/obj/item/aicard, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "tlq" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ dir = 4 @@ -76747,17 +76881,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/theater) -"tlK" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen, -/obj/machinery/light/dim/directional/north, -/obj/effect/turf_decal/tile/red/opposingcorners, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/abandoned_gambling_den/gaming) "tlL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -76802,6 +76925,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos) +"tmr" = ( +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 4; + name = "killroom vent" + }, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark/telecomms, +/area/station/science/xenobiology) "tms" = ( /obj/structure/cable, /obj/machinery/computer/security, @@ -76810,38 +76944,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) -"tmy" = ( -/obj/machinery/light/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/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) -"tmD" = ( -/obj/structure/table, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/machinery/cell_charger, -/obj/item/screwdriver{ - pixel_y = -1 - }, -/obj/effect/turf_decal/siding/purple{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/item/stock_parts/cell/high, -/turf/open/floor/iron, -/area/station/science/robotics/lab) -"tnm" = ( -/obj/machinery/recharge_station, -/obj/effect/turf_decal/bot_red, -/obj/machinery/newscaster/directional/west, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/textured, -/area/station/medical/medbay) "tns" = ( /obj/structure/table/wood, /obj/machinery/keycard_auth/directional/west, @@ -76886,6 +76988,16 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/service/library/abandoned) +"tnN" = ( +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "xeno5"; + name = "Containment Control"; + req_access = list("xenobiology") + }, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/iron, +/area/station/science/xenobiology) "tnR" = ( /obj/structure/sign/painting/library{ pixel_y = -32 @@ -76903,21 +77015,12 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) -"tou" = ( -/obj/structure/sign/delamination_counter/directional/west, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/engine_access, -/turf/open/floor/engine, -/area/station/engineering/supermatter) "toy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/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, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, +/turf/open/floor/iron/herringbone, /area/station/cargo/miningoffice) "toB" = ( /obj/machinery/light/directional/west, @@ -76957,19 +77060,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"toR" = ( -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/mid_joiner{ - dir = 4 - }, -/obj/structure/bed, -/obj/item/bedsheet/medical, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/security/medical) "toS" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/mining{ @@ -77076,6 +77166,13 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) +"tpS" = ( +/obj/effect/spawner/random/structure/table_fancy, +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/science) "tpZ" = ( /turf/closed/wall, /area/station/maintenance/starboard/fore) @@ -77125,6 +77222,11 @@ }, /turf/open/floor/iron, /area/station/security/office) +"tqK" = ( +/obj/effect/turf_decal/tile/green, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/virology) "tqT" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/effect/turf_decal/trimline/neutral/warning{ @@ -77143,28 +77245,22 @@ /area/station/service/bar/backroom) "trf" = ( /obj/structure/table/wood, +/obj/item/restraints/handcuffs{ + pixel_y = 6 + }, /obj/item/clothing/mask/cigarette/cigar/cohiba{ - pixel_x = 3 + pixel_x = 7; + pixel_y = -7 }, /obj/item/clothing/mask/cigarette/cigar/havana{ pixel_x = -3 }, -/obj/item/clothing/mask/cigarette/cigar, +/obj/item/clothing/mask/cigarette/cigar{ + pixel_x = -1; + pixel_y = -7 + }, /turf/open/floor/carpet, /area/station/security/detectives_office) -"trn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/west, -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "trw" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -77265,7 +77361,7 @@ /area/station/engineering/atmos) "tsx" = ( /obj/structure/table/glass, -/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/item/surgery_tray/full, /obj/item/clothing/gloves/latex, /obj/item/clothing/suit/apron/surgical, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -77308,6 +77404,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/maintenance/department/eva/abandoned) +"tsK" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "tsL" = ( /obj/structure/closet/crate/hydroponics, /obj/item/wrench, @@ -77379,6 +77483,20 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"ttz" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L4" + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"ttD" = ( +/obj/effect/spawner/random/structure/tank_holder, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/science/xenobiology) "ttE" = ( /obj/structure/sign/warning/electric_shock, /turf/closed/wall/r_wall, @@ -77550,6 +77668,15 @@ /obj/structure/sign/warning/electric_shock/directional/south, /turf/open/floor/plating, /area/station/maintenance/department/electrical) +"tuM" = ( +/obj/item/kirbyplants/random, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 8 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/white, +/area/station/science/research) "tuN" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -77582,6 +77709,18 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/cargo/storage) +"tve" = ( +/obj/machinery/duct, +/obj/machinery/camera/directional/north{ + c_tag = "Atmospherics - Project Room Aft"; + name = "atmospherics camera" + }, +/obj/machinery/status_display/ai/directional/north, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/project) "tvj" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp, @@ -77627,6 +77766,26 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) +"tvO" = ( +/obj/machinery/modular_computer/preset/research{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/camera/directional/south{ + c_tag = "Science - Research Director's Quarters"; + name = "science camera"; + network = list("ss13","rd") + }, +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/rd) "tvQ" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/blue/half/contrasted, @@ -77637,27 +77796,6 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/maintenance/department/crew_quarters/bar) -"twq" = ( -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/medical/morgue, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/airlock/grunge{ - name = "Morgue" - }, -/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/medical/morgue) "twE" = ( /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters{ @@ -77684,15 +77822,6 @@ dir = 8 }, /area/station/commons/fitness/recreation) -"twZ" = ( -/obj/machinery/computer/message_monitor{ - dir = 4 - }, -/obj/item/paper/monitorkey, -/obj/machinery/newscaster/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/tcommsat/computer) "txc" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -77710,14 +77839,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/eva/abandoned) -"txt" = ( -/obj/structure/sign/poster/random/directional/east, -/obj/machinery/light/small/directional/east, -/obj/structure/chair/comfy/beige{ - dir = 8 +"txJ" = ( +/obj/structure/sign/directions/engineering{ + desc = "A sign that shows there are doors here. There are doors everywhere!"; + icon_state = "doors"; + name = "WARNING: PRESSURIZED DOORS"; + pixel_x = 32 }, -/turf/open/floor/wood/large, -/area/station/service/library/lounge) +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron, +/area/station/engineering/atmos/project) "txK" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -77793,6 +77925,15 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos/hfr_room) +"tzj" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/sign/warning/deathsposal/directional/south, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "tzm" = ( /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) @@ -77821,7 +77962,7 @@ /obj/machinery/airlock_sensor/incinerator_ordmix{ pixel_y = 24 }, -/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) "tzT" = ( @@ -77834,13 +77975,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/chapel) -"tzV" = ( -/obj/structure/sign/departments/chemistry/pharmacy/directional/west, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "tAd" = ( /obj/item/target/syndicate, /obj/effect/decal/cleanable/dirt, @@ -77887,11 +78021,6 @@ /obj/structure/sign/poster/contraband/random/directional/east, /turf/open/floor/iron, /area/station/service/hydroponics/garden) -"tAJ" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/security/range) "tAL" = ( /obj/structure/sign/nanotrasen{ pixel_y = 32 @@ -77915,16 +78044,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos) -"tAP" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/engineering/lobby) "tAS" = ( /obj/effect/turf_decal/siding/white, /obj/structure/cable, @@ -77940,6 +78059,19 @@ }, /turf/open/floor/wood/large, /area/station/service/barber) +"tBm" = ( +/obj/machinery/recharge_station, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/bot/left, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Engineering - Break Room"; + name = "engineering camera" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "tBs" = ( /obj/effect/turf_decal/siding/yellow{ dir = 6 @@ -77994,12 +78126,6 @@ }, /turf/open/floor/iron, /area/station/engineering/supermatter/room) -"tBY" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/research) "tCh" = ( /obj/machinery/door/poddoor/preopen{ id = "brigprison"; @@ -78031,13 +78157,6 @@ /obj/item/clothing/head/costume/cardborg, /turf/open/floor/plating, /area/station/maintenance/port) -"tCq" = ( -/obj/machinery/vending/cigarette, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/meeting_room/council) "tCr" = ( /obj/structure/disposalpipe/segment, /obj/structure/disposalpipe/segment, @@ -78127,6 +78246,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"tDd" = ( +/obj/effect/turf_decal/trimline/blue/end{ + dir = 4 + }, +/obj/machinery/shower/directional/east{ + name = "emergency shower" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron, +/area/station/engineering/main) "tDo" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -78138,6 +78270,14 @@ "tDs" = ( /turf/closed/wall, /area/station/service/electronic_marketing_den) +"tDt" = ( +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/security/brig) "tDw" = ( /turf/open/misc/grass, /area/station/hallway/primary/fore) @@ -78305,6 +78445,17 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron, /area/station/hallway/primary/port) +"tFd" = ( +/obj/structure/closet/emcloset/anchored, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/sign/warning/vacuum/directional/north, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos/project) "tFm" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -78341,6 +78492,12 @@ }, /turf/open/floor/iron/white, /area/station/science/research) +"tFP" = ( +/obj/structure/rack, +/obj/item/storage/belt/utility, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/science/research/abandoned) "tFQ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -78367,9 +78524,15 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space/nearstation) +"tGj" = ( +/obj/effect/turf_decal/trimline/blue/filled/warning, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "tGm" = ( /obj/structure/table/reinforced, -/obj/item/stack/sheet/plasteel/fifty, /obj/item/stack/sheet/rglass{ amount = 50; pixel_x = 2; @@ -78384,6 +78547,7 @@ /obj/item/mod/module/plasma_stabilizer, /obj/item/mod/module/thermal_regulator, /obj/item/mod/module/magboot, +/obj/item/mod/module/signlang_radio, /turf/open/floor/iron, /area/station/engineering/storage) "tGq" = ( @@ -78411,6 +78575,11 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/fore) +"tGJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/port) "tGL" = ( /obj/structure/cable, /obj/effect/turf_decal/delivery, @@ -78428,6 +78597,14 @@ }, /turf/open/floor/wood/large, /area/station/command/corporate_showroom) +"tGW" = ( +/obj/machinery/hydroponics/soil, +/obj/effect/decal/cleanable/dirt, +/obj/item/radio/intercom/directional/east, +/obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/station/security/prison/garden) "tHc" = ( /obj/structure/table/wood/fancy, /obj/effect/turf_decal/siding/wideplating/dark{ @@ -78446,14 +78623,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/solars/port/fore) -"tHs" = ( -/obj/machinery/light/directional/west, -/obj/machinery/status_display/ai/directional/west, -/obj/effect/turf_decal/tile/red{ - dir = 4 +"tHg" = ( +/obj/structure/table, +/obj/item/fuel_pellet{ + pixel_x = 8 + }, +/obj/item/wrench{ + pixel_x = -4 }, +/obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/cargo/drone_bay) "tHu" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ @@ -78522,6 +78702,27 @@ "tHV" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/medical/morgue) +"tHW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/directions/supply{ + dir = 1; + pixel_x = 32; + pixel_y = 8 + }, +/obj/structure/sign/directions/vault{ + dir = 1; + pixel_x = 32 + }, +/obj/structure/sign/directions/security{ + dir = 1; + pixel_x = 32; + pixel_y = -8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "tIb" = ( /obj/item/kirbyplants/random, /obj/machinery/light_switch/directional/west, @@ -78728,22 +78929,13 @@ /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/requests_console/directional/east, +/obj/machinery/requests_console/directional/east{ + department = "Theater"; + name = "Theater Requests Console" + }, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/service/theater) -"tLm" = ( -/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/trimline/blue/filled/warning{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner, -/turf/open/floor/iron/white, -/area/station/medical/medbay) "tLp" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -78775,14 +78967,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"tMe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/airalarm/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/station/commons/dorms) "tMj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -78846,14 +79030,6 @@ dir = 4 }, /area/station/commons/fitness/recreation) -"tMK" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "tML" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -78876,6 +79052,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) +"tMU" = ( +/obj/structure/cable, +/obj/machinery/airalarm/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/station/science/lobby) "tNa" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -78895,23 +79077,13 @@ /turf/open/floor/iron/dark, /area/station/science/server) "tNn" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 4 }, -/obj/machinery/requests_console/directional/south{ - department = "Mining"; - name = "Mining Requests Console" - }, -/obj/machinery/requests_console/directional/south{ - department = "Mining"; - name = "Mining Requests Console" - }, -/obj/machinery/camera/directional/south{ - c_tag = "Cargo - Mining Dock"; - name = "cargo camera" +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 }, -/obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, /area/station/cargo/miningoffice) "tNq" = ( @@ -78987,13 +79159,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/holding_cell) -"tOf" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/duct, -/obj/machinery/light/small/directional/east, -/obj/structure/cable, -/turf/open/floor/iron/grimy, -/area/station/service/bar/backroom) "tOi" = ( /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/medical/general, @@ -79130,6 +79295,17 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"tPm" = ( +/obj/machinery/duct, +/obj/effect/turf_decal/siding/thinplating/dark/corner, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_half, +/area/station/medical/morgue) "tPo" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2, /turf/open/floor/engine/vacuum, @@ -79157,12 +79333,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"tPF" = ( -/obj/structure/table/reinforced, -/obj/machinery/recharger, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/execution/transfer) "tPG" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -79187,17 +79357,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/gravity_generator) -"tPX" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/event_spawn, -/obj/machinery/duct, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "tPY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -79208,6 +79367,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/port) +"tQh" = ( +/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/neutral, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "tQn" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -79234,13 +79400,6 @@ dir = 1 }, /area/station/service/bar) -"tQr" = ( -/obj/structure/closet/bombcloset/security, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/maintenance/department/security) "tQt" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -79279,20 +79438,6 @@ /obj/effect/turf_decal/tile/purple/half/contrasted, /turf/open/floor/iron, /area/station/cargo/storage) -"tQR" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/obj/item/stack/medical/gauze, -/obj/item/stack/medical/suture, -/obj/machinery/camera/directional/north{ - c_tag = "Medbay - Treatment Center"; - name = "medbay camera"; - network = list("ss13","medbay") - }, -/obj/machinery/light/directional/north, -/obj/structure/table/reinforced/rglass, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron, -/area/station/medical/treatment_center) "tQW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -79334,6 +79479,29 @@ /obj/effect/turf_decal/bot/right, /turf/open/floor/iron, /area/station/engineering/storage/tech) +"tRt" = ( +/obj/item/secateurs{ + desc = "It look like a pair of botanical secateurs, but there's a crudely applied label on its handle that denotes them as 'scissors'."; + name = "scissors"; + pixel_y = 1 + }, +/obj/item/reagent_containers/cup/rag{ + pixel_y = 4 + }, +/obj/structure/table, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/barber) +"tRu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/wood, +/obj/effect/spawner/random/maintenance, +/obj/machinery/light/small/directional/north, +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/abandoned_gambling_den) "tRO" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/contraband/random/directional/south, @@ -79352,6 +79520,20 @@ /mob/living/carbon/human/species/monkey, /turf/open/floor/iron/white, /area/station/medical/virology) +"tSa" = ( +/obj/structure/sign/poster/random/directional/south, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron, +/area/station/commons/lounge) +"tSh" = ( +/obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/smooth, +/area/station/maintenance/department/science/xenobiology) "tSo" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -79359,6 +79541,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) +"tSq" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/structure/table/reinforced, +/obj/item/wrench, +/obj/item/clothing/glasses/science, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/science/xenobiology) +"tSQ" = ( +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron/dark/corner, +/area/station/hallway/secondary/exit/departure_lounge) "tSU" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -79387,31 +79584,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"tTb" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/obj/machinery/light/directional/west, -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) -"tTe" = ( -/obj/structure/table/reinforced, -/obj/item/folder/blue, -/obj/item/bodypart/leg/left/robot, -/obj/item/bodypart/leg/right/robot, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"tTf" = ( -/obj/machinery/light/directional/north, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) "tTg" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -79468,6 +79640,15 @@ }, /turf/open/floor/iron, /area/station/commons/toilet/locker) +"tTQ" = ( +/obj/structure/sign/poster/ripped/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{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/prison/safe) "tTU" = ( /obj/structure/table/wood/fancy, /obj/effect/turf_decal/siding/wideplating/dark{ @@ -79535,14 +79716,15 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"tVm" = ( -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/trimline/green/filled/corner{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/virology) +"tVw" = ( +/obj/structure/rack, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/spawner/random/armory/riot_armor, +/obj/effect/spawner/random/armory/riot_helmet, +/obj/effect/spawner/random/armory/riot_shield, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "tVC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/start/hangover/closet, @@ -79666,6 +79848,11 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) +"tWS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/department/science/xenobiology) "tWU" = ( /obj/effect/turf_decal/siding/green{ dir = 1 @@ -79676,14 +79863,6 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics/garden) -"tXa" = ( -/obj/structure/table/wood, -/obj/machinery/light/directional/west, -/obj/item/paper_bin, -/obj/item/pen, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) "tXe" = ( /obj/effect/turf_decal/loading_area/red{ dir = 4 @@ -79720,6 +79899,12 @@ }, /turf/open/floor/iron/cafeteria, /area/station/service/cafeteria) +"tXy" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) "tXA" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -79732,16 +79917,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) -"tXF" = ( -/obj/structure/table, -/obj/item/stack/sheet/glass, -/obj/item/electronics/airlock, -/obj/item/assembly/signaler, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/lobby) "tXI" = ( /turf/open/floor/plating, /area/station/science/research/abandoned) @@ -79899,14 +80074,11 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/rd) -"tYY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/east, -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/delivery, +"tYR" = ( +/obj/structure/bookcase/random, +/obj/machinery/light/directional/south, /turf/open/floor/iron, -/area/station/engineering/supermatter/room) +/area/station/security/prison) "tZi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -79922,13 +80094,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/hfr_room) -"tZo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/obj/effect/spawner/random/structure/tank_holder, -/obj/structure/sign/poster/official/wtf_is_co2/directional/east, -/turf/open/floor/iron, -/area/station/maintenance/department/engine/atmos) "tZu" = ( /obj/structure/table/reinforced, /obj/item/clipboard, @@ -79938,14 +80103,6 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron, /area/station/maintenance/port) -"tZw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "tZJ" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -79977,9 +80134,7 @@ /obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt, /obj/machinery/duct, -/mob/living/simple_animal/hostile/retaliate/goat{ - name = "Pete" - }, +/mob/living/basic/goat/pete, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) "uaE" = ( @@ -80079,6 +80234,12 @@ }, /turf/open/floor/iron, /area/station/medical/abandoned) +"ubK" = ( +/obj/machinery/computer/operating, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/iron/dark, +/area/station/medical/surgery/theatre) "ubL" = ( /obj/structure/table, /obj/item/book/manual/chef_recipes, @@ -80108,11 +80269,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"ubT" = ( -/obj/item/kirbyplants/random, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) "uce" = ( /obj/effect/turf_decal/trimline/purple/filled/warning{ dir = 4 @@ -80140,17 +80296,22 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/library/private) -"uck" = ( -/obj/structure/chair/office, -/obj/machinery/newscaster/directional/east, -/obj/effect/turf_decal/siding/blue{ - dir = 1 +"uco" = ( +/obj/machinery/button/door/directional/west{ + id = "Dorm1"; + name = "Dormitory Door Lock"; + normaldoorcontrol = 1; + specialfunctions = 4 }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/hangover, +/obj/item/flashlight/lamp/green{ + pixel_x = 8; + pixel_y = 6 }, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) +/turf/open/floor/wood, +/area/station/commons/dorms) "ucu" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -80210,33 +80371,18 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/large, /area/station/security/processing) -"ucM" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research{ - name = "Research Division Access" +"ucT" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Chapel - Fore Port"; + name = "chapel camera"; + network = list("ss13","chapel") }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ +/obj/item/radio/intercom/directional/west, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/chapel{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-entrance" - }, -/obj/effect/mapping_helpers/airlock/access/all/science/general, -/obj/structure/disposalpipe/segment, -/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/science/research) -"ucW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) +/area/station/service/chapel) "udb" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -80265,21 +80411,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/medical/cryo) -"udj" = ( -/obj/structure/table, -/obj/item/storage/box/gloves{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/bodybags, -/obj/machinery/camera/directional/west{ - c_tag = "Chapel - Morgue"; - name = "chapel camera"; - network = list("ss13","chapel") - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel/storage) "udk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -80301,6 +80432,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/security/courtroom) +"udq" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/suit/costume/justice, +/obj/item/clothing/head/helmet/toggleable/justice/escape{ + name = "justice helmet" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/theater/abandoned) "udr" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -80358,17 +80499,6 @@ /obj/effect/spawner/random/engineering/tank, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) -"udY" = ( -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "xeno5"; - name = "Containment Control"; - req_access = list("xenobiology") - }, -/obj/machinery/light/directional/south, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/iron, -/area/station/science/xenobiology) "uec" = ( /obj/structure/cable, /obj/machinery/door/firedoor, @@ -80391,14 +80521,35 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/medical/abandoned) +"uet" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/service/theater) "ueB" = ( /obj/structure/table/reinforced, /obj/item/folder/blue, /obj/item/pen, -/obj/machinery/requests_console/directional/west, +/obj/machinery/requests_console/directional/west{ + department = "AI Chamber"; + name = "AI Chamber Requests Console" + }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) +"ueC" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/button/door{ + id = "xeno2"; + name = "Containment Control"; + req_access = list("xenobiology") + }, +/turf/open/floor/iron, +/area/station/science/xenobiology) "ueH" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -80434,12 +80585,6 @@ /obj/effect/spawner/random/engineering/canister, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) -"ufO" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/maintenance/port/fore) "ufR" = ( /turf/closed/wall/r_wall, /area/station/security/warden) @@ -80526,20 +80671,11 @@ "uhb" = ( /turf/closed/wall/r_wall, /area/station/science/xenobiology) -"uhl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/status_display/evac/directional/west, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Arrivals Dock - Aft Starboard"; - name = "dock camera" - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) +"uhc" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/effect/turf_decal/trimline/dark_blue/filled/warning, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "uhB" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/steam_vent, @@ -80548,17 +80684,13 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) -"uhE" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/button/door{ - id = "xeno3"; - name = "Containment Control"; - req_access = list("xenobiology") - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/science/xenobiology) +"uhC" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/structure/sign/poster/official/ian/directional/south, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central/fore) "uhG" = ( /obj/machinery/porta_turret/ai, /obj/machinery/firealarm/directional/north, @@ -80571,6 +80703,20 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/command/bridge) +"uhL" = ( +/obj/structure/table/reinforced, +/obj/item/bodypart/chest/robot, +/obj/item/bodypart/arm/right/robot{ + pixel_x = 6 + }, +/obj/item/bodypart/arm/left/robot{ + pixel_x = -6 + }, +/obj/machinery/status_display/evac/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "uhS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -80598,14 +80744,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos) -"uin" = ( -/obj/machinery/light/directional/east, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/prison/visit) "uiv" = ( /obj/structure/reagent_dispensers/fueltank/large, /obj/effect/turf_decal/stripes/line{ @@ -80629,6 +80767,14 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"uiG" = ( +/obj/machinery/status_display/evac/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/engineering/main) "uiK" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -80674,12 +80820,6 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"ujp" = ( -/obj/structure/table/glass, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/official/science/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/space_hut/observatory) "ujs" = ( /obj/machinery/door/airlock/grunge{ name = "Chapel Quarters" @@ -80697,22 +80837,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/chapel/funeral) -"ujt" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, -/obj/structure/table/reinforced, -/obj/machinery/recharger{ - pixel_x = -6; - pixel_y = 2 - }, -/obj/machinery/recharger{ - pixel_x = 6; - pixel_y = 2 - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/lockers) "ujK" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -80813,10 +80937,24 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/station/maintenance/fore) +"ukX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/brig) "ulg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"ulp" = ( +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/turf/open/floor/iron, +/area/station/security/checkpoint/medical/medsci) "ult" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -80850,6 +80988,13 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"ulR" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/duct, +/obj/structure/cable, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/grimy, +/area/station/service/bar/backroom) "umb" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -80862,6 +81007,10 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/science/xenobiology) +"umd" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/security/range) "umf" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 4 @@ -80886,18 +81035,6 @@ }, /turf/open/floor/iron, /area/station/medical/virology) -"umk" = ( -/obj/machinery/computer/scan_consolenew{ - dir = 8 - }, -/obj/machinery/status_display/ai/directional/east, -/obj/effect/turf_decal/bot/right, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/science/genetics) "umm" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -80952,11 +81089,11 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, /obj/effect/mapping_helpers/airlock/unres{ dir = 1 }, /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/iron, /area/station/maintenance/department/electrical) "umM" = ( @@ -81057,6 +81194,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) +"unL" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "unO" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible{ @@ -81121,6 +81264,12 @@ /obj/effect/spawner/random/structure/girder, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"uoW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/dresser, +/obj/structure/mirror/directional/south, +/turf/open/floor/plating, +/area/station/service/theater/abandoned) "uoY" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/end{ @@ -81180,6 +81329,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) "upv" = ( @@ -81274,6 +81424,12 @@ /obj/structure/sign/poster/random/directional/north, /turf/open/floor/wood, /area/station/service/theater) +"uqZ" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/status_display/evac/directional/east, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central/fore) "urh" = ( /obj/effect/spawner/structure/window/hollow/reinforced/end{ dir = 4 @@ -81281,6 +81437,18 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) +"uro" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/chemimp{ + pixel_x = 4; + pixel_y = 10 + }, +/obj/item/storage/box/trackimp{ + pixel_y = 6 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "urq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -81301,6 +81469,27 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/science/xenobiology) +"urA" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"urC" = ( +/obj/structure/cable, +/obj/structure/table/reinforced, +/obj/item/folder/yellow, +/obj/item/electronics/airlock, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"urF" = ( +/obj/effect/turf_decal/bot, +/obj/item/radio/intercom/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) "urH" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, @@ -81370,6 +81559,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/theater/abandoned) +"usz" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/maintenance/department/chapel) "usD" = ( /obj/structure/cable, /obj/effect/landmark/start/depsec/engineering, @@ -81388,27 +81587,19 @@ /turf/open/floor/wood, /area/station/command/heads_quarters/hop) "usJ" = ( -/obj/effect/turf_decal/tile/purple/half/contrasted{ +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/loading_area{ dir = 1 }, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"usV" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research{ - name = "Research Division Access" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-entrance" - }, -/obj/effect/mapping_helpers/airlock/access/all/science/general, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/research) +"usZ" = ( +/obj/item/flashlight/lamp, +/obj/machinery/airalarm/directional/east, +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/tcommsat/computer) "utj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -81456,7 +81647,7 @@ /turf/open/floor/iron/white, /area/station/science/lab) "uue" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron, @@ -81553,6 +81744,16 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/iron, /area/station/maintenance/department/science) +"uuP" = ( +/obj/machinery/button/door/directional/south{ + id = "chapelprivacyoffice"; + name = "Privacy Control"; + req_access = list("crematorium") + }, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) "uvb" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible{ dir = 4 @@ -81571,6 +81772,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos) +"uvi" = ( +/obj/effect/landmark/start/hangover, +/obj/machinery/light/floor, +/turf/open/floor/vault, +/area/station/commons/fitness/recreation) "uvl" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -81578,18 +81784,23 @@ /obj/effect/turf_decal/siding/green, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) +"uvs" = ( +/obj/effect/turf_decal/bot, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/arrivals) "uvt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/green, /area/station/service/library) -"uvy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/chair/stool/directional/south, -/turf/open/floor/iron/grimy, -/area/station/maintenance/port/fore) +"uvJ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) "uvR" = ( /obj/machinery/camera/directional/south{ c_tag = "Security Hallway - Center"; @@ -81600,6 +81811,13 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"uvT" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "uvW" = ( /obj/machinery/status_display/evac/directional/north, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -81707,26 +81925,6 @@ /obj/effect/mapping_helpers/airlock/access/all/command/captain, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) -"uxz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Engineering - Supermatter Foyer"; - name = "engineering camera"; - network = list("ss13","engine") - }, -/obj/structure/rack, -/obj/item/analyzer, -/obj/item/geiger_counter, -/obj/item/geiger_counter{ - pixel_x = 3; - pixel_y = 4 - }, -/obj/item/radio/intercom/directional/south, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/engineering/main) "uxB" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -81746,19 +81944,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white/smooth_large, /area/station/medical/psychology) -"uxC" = ( -/obj/machinery/status_display/door_timer{ - id = "cargocell"; - name = "Cargo Cell"; - pixel_x = -32; - pixel_y = -32 - }, -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "uxG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -81975,23 +82160,13 @@ /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, /area/station/cargo/storage) -"uzO" = ( -/obj/structure/filingcabinet/chestdrawer, +"uzT" = ( +/obj/effect/spawner/random/vending/colavend, /obj/effect/turf_decal/bot, -/obj/machinery/status_display/evac/directional/east, -/obj/item/taperecorder{ - pixel_y = 7 - }, -/obj/machinery/light_switch/directional/north{ - pixel_x = 9; - pixel_y = 32 - }, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/rd) +/obj/machinery/status_display/ai/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) "uzU" = ( /obj/structure/table/wood, /obj/item/camera_film{ @@ -82043,16 +82218,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/department/science) -"uAA" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/table/reinforced, -/obj/item/weldingtool, -/obj/machinery/light/directional/north, -/obj/item/wrench, -/obj/item/clothing/head/utility/welding, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/station/engineering/atmos) "uAD" = ( /obj/structure/cable, /obj/structure/extinguisher_cabinet/directional/north, @@ -82071,6 +82236,23 @@ "uAK" = ( /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) +"uAL" = ( +/obj/structure/sign/nanotrasen{ + pixel_y = -32 + }, +/obj/structure/table/reinforced, +/obj/machinery/recharger{ + pixel_x = -6; + pixel_y = 2 + }, +/obj/machinery/recharger{ + pixel_x = 6; + pixel_y = 2 + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/lockers) "uAV" = ( /obj/effect/turf_decal/trimline/neutral/warning{ dir = 8 @@ -82090,15 +82272,15 @@ /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/structure/sign/nanotrasen{ pixel_y = 32 }, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "uBf" = ( @@ -82120,6 +82302,13 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/science) +"uBq" = ( +/obj/machinery/duct, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/engineering/main) "uBt" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/steam_vent, @@ -82128,11 +82317,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"uBA" = ( -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) "uBI" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -82165,6 +82349,20 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/engineering/atmos/storage/gas) +"uBY" = ( +/obj/machinery/light/directional/south, +/obj/machinery/camera/directional/south{ + c_tag = "Security - Office Aft" + }, +/obj/machinery/computer/security/telescreen/entertainment/directional/south, +/obj/machinery/modular_computer/preset/cargochat/security{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/office) "uBZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -82239,12 +82437,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/engineering/lobby) -"uCY" = ( -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/machinery/light/floor, -/turf/open/misc/grass, -/area/station/hallway/primary/fore) "uDb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -82285,11 +82477,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/ai) -"uDo" = ( -/obj/structure/sign/poster/official/do_not_question/directional/south, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/customs/aft) "uDp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -82344,6 +82531,10 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) +"uEh" = ( +/obj/machinery/telecomms/server/presets/security, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) "uEo" = ( /obj/structure/bed/double, /obj/item/bedsheet/dorms_double, @@ -82406,12 +82597,6 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/station/security/holding_cell) -"uFn" = ( -/obj/item/radio/intercom/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron/dark/corner, -/area/station/hallway/secondary/exit/departure_lounge) "uFs" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/north, @@ -82419,6 +82604,19 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/iron, /area/station/maintenance/port) +"uFt" = ( +/obj/item/radio/intercom/directional/west, +/obj/item/storage/toolbox/electrical{ + pixel_y = 3 + }, +/obj/structure/table, +/obj/item/multitool{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/science/circuits) "uFv" = ( /obj/structure/chair/pew, /turf/open/floor/iron/chapel{ @@ -82437,6 +82635,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos) +"uFH" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/effect/spawner/random/maintenance, +/obj/structure/sign/poster/contraband/lusty_xenomorph/directional/north, +/obj/item/circuitboard/machine/holopad, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "uFM" = ( /obj/effect/turf_decal/plaque{ icon_state = "L6" @@ -82472,6 +82677,88 @@ "uGn" = ( /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) +"uGt" = ( +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = 3 + }, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = 3 + }, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = 3 + }, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = 3 + }, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = 3 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/head/utility/hardhat/orange{ + name = "protective hat"; + pixel_y = 9 + }, +/obj/item/clothing/head/utility/hardhat/orange{ + name = "protective hat"; + pixel_y = 9 + }, +/obj/item/clothing/head/utility/hardhat/orange{ + name = "protective hat"; + pixel_y = 9 + }, +/obj/item/clothing/head/utility/hardhat/orange{ + name = "protective hat"; + pixel_y = 9 + }, +/obj/item/clothing/head/utility/hardhat/orange{ + name = "protective hat"; + pixel_y = 9 + }, +/obj/structure/closet/crate/internals, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/bot, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "uGx" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/costume/mafia/checkered, @@ -82531,6 +82818,10 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/cargo/storage) +"uHp" = ( +/obj/structure/cable, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) "uHE" = ( /obj/structure/table/wood/poker, /obj/effect/decal/cleanable/dirt, @@ -82541,12 +82832,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/service/kitchen/abandoned) -"uHJ" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit) "uHP" = ( /obj/structure/closet/secure_closet/security/sec, /obj/effect/turf_decal/bot, @@ -82554,18 +82839,6 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/lockers) -"uHW" = ( -/obj/structure/table/reinforced, -/obj/item/scalpel{ - pixel_y = 8 - }, -/obj/item/circular_saw, -/obj/item/cautery, -/obj/structure/sign/departments/medbay/alt/directional/south, -/obj/machinery/light/cold/directional/east, -/obj/machinery/status_display/evac/directional/east, -/turf/open/floor/iron, -/area/station/science/robotics/lab) "uHZ" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -82608,13 +82881,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"uIR" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "uIY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/grimy, @@ -82644,6 +82910,19 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"uJp" = ( +/obj/machinery/disposal/bin{ + desc = "A pneumatic waste disposal unit. This one leads to the morgue."; + name = "corpse disposal" + }, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/security/checkpoint/medical/medsci) "uJr" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/lattice, @@ -82661,13 +82940,26 @@ /obj/machinery/newscaster/directional/east, /turf/open/floor/iron, /area/station/engineering/supermatter/room) -"uJT" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/light/small/directional/west, -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, +"uJO" = ( +/obj/machinery/telecomms/receiver/preset_left, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) +"uJW" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/table/reinforced, +/obj/machinery/computer/records/medical/laptop{ + dir = 4; + pixel_x = 3; + pixel_y = -1 + }, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/medical/morgue) "uJX" = ( /obj/structure/table, /obj/item/storage/box/donkpockets, @@ -82691,6 +82983,17 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/service/library/private) +"uKj" = ( +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 8; + name = "killroom vent" + }, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark/telecomms, +/area/station/science/xenobiology) "uKl" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, @@ -82705,6 +83008,22 @@ "uKw" = ( /turf/closed/wall, /area/station/commons/fitness/recreation) +"uKA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/warning/no_smoking/circle/directional/south, +/obj/effect/turf_decal/siding/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light/small/broken/directional/south, +/turf/open/floor/iron, +/area/station/maintenance/department/electrical) "uKD" = ( /obj/structure/flora/bush/lavendergrass/style_random, /obj/structure/flora/bush/flowers_yw/style_random, @@ -82715,14 +83034,6 @@ /obj/effect/spawner/random/trash/cigbutt, /turf/open/floor/plating, /area/station/medical/abandoned) -"uKO" = ( -/obj/structure/table, -/obj/item/clothing/under/rank/security/officer, -/obj/item/restraints/handcuffs, -/obj/effect/spawner/random/maintenance, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plating, -/area/station/maintenance/department/security) "uKQ" = ( /obj/structure/chair{ dir = 1; @@ -82751,6 +83062,22 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/chapel) +"uLf" = ( +/obj/structure/sign/warning/electric_shock/directional/east, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"uLh" = ( +/obj/effect/turf_decal/box/white/corners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/science/xenobiology) "uLl" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, @@ -82795,6 +83122,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/break_room) +"uLx" = ( +/obj/machinery/status_display/ai/directional/south, +/obj/effect/turf_decal/siding/thinplating/dark/corner, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "uLG" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ @@ -82811,12 +83147,41 @@ }, /turf/open/floor/iron, /area/station/security/office) +"uLS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/sign/departments/xenobio/directional/east, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/maintenance/department/science) "uMb" = ( /obj/structure/table, /obj/item/analyzer, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/maintenance/starboard/aft) +"uMe" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/medical/morgue, +/obj/effect/mapping_helpers/airlock/access/all/medical/general, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/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, +/obj/machinery/door/airlock/grunge{ + name = "Morgue" + }, +/turf/open/floor/iron, +/area/station/medical/morgue) "uMj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -82902,48 +83267,30 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) -"uNA" = ( -/obj/structure/sign/poster/official/work_for_a_future/directional/south, -/obj/structure/chair/sofa/bench{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/security/processing) "uNC" = ( /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/storage/primary) "uND" = ( -/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/tile/brown/half{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/maintenance/starboard/fore) +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/computer/order_console/bitrunning, +/obj/effect/turf_decal/stripes/end, +/turf/open/floor/iron/half{ + dir = 1 + }, +/area/station/cargo/miningoffice) "uNE" = ( /obj/machinery/atmospherics/components/unary/passive_vent{ dir = 4 }, /turf/open/floor/plating/airless, /area/space/nearstation) -"uNJ" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "uNQ" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, @@ -82985,30 +83332,14 @@ /turf/open/floor/iron/white, /area/station/science/ordnance/office) "uOk" = ( -/obj/structure/cable, /obj/structure/chair/office{ dir = 4 }, +/obj/effect/turf_decal/tile/brown/half/contrasted, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/half/contrasted, +/obj/effect/landmark/start/shaft_miner, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"uOl" = ( -/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/machinery/button/door/directional/north{ - id = "teleportershutters"; - name = "Teleporter Shutters"; - req_access = list("command") - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) "uOn" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -83029,6 +83360,12 @@ }, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) +"uOz" = ( +/obj/structure/table/wood, +/obj/machinery/cell_charger, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/plating, +/area/station/service/abandoned_gambling_den) "uOC" = ( /obj/structure/lattice, /obj/structure/sign/nanotrasen{ @@ -83036,6 +83373,13 @@ }, /turf/open/space, /area/space/nearstation) +"uOE" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/suit/costume/cardborg, +/obj/item/clothing/head/costume/cardborg, +/turf/open/floor/wood, +/area/station/service/theater/abandoned) "uOF" = ( /obj/machinery/status_display/evac/directional/west, /obj/effect/turf_decal/stripes/line{ @@ -83044,6 +83388,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 1 }, +/obj/machinery/hydroponics/constructable, /turf/open/floor/iron/white, /area/station/science/xenobiology) "uOH" = ( @@ -83098,14 +83443,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/chapel/storage) -"uPg" = ( -/obj/structure/sign/warning/secure_area/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/half{ - dir = 8 - }, -/area/station/security/range) "uPh" = ( /obj/structure/disposalpipe/trunk, /obj/structure/cable, @@ -83231,32 +83568,6 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/commons/locker) -"uQi" = ( -/obj/machinery/status_display/ai/directional/north, -/obj/machinery/button/door/directional/east{ - id = "hosprivacy"; - name = "Privacy Control"; - pixel_y = 6; - req_access = list("hos") - }, -/obj/machinery/button/door/directional/east{ - id = "hosspace"; - name = "Space Shutters Control"; - pixel_y = -6; - req_access = list("hos") - }, -/obj/machinery/keycard_auth/directional/east{ - pixel_x = 38; - pixel_y = 6 - }, -/obj/machinery/light_switch/directional/east{ - pixel_x = 37; - pixel_y = -6 - }, -/obj/structure/tank_holder/extinguisher, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hos) "uQk" = ( /turf/open/floor/engine/o2, /area/station/engineering/atmos) @@ -83274,25 +83585,40 @@ }, /turf/open/floor/iron, /area/station/commons/storage/primary) +"uQD" = ( +/obj/machinery/light/small/directional/north, +/obj/structure/sign/nanotrasen{ + pixel_x = 32; + pixel_y = 32 + }, +/obj/structure/sign/directions/engineering{ + desc = "A sign that shows there are doors here. There are doors everywhere!"; + icon_state = "doors"; + name = "WARNING: BLAST DOORS"; + pixel_y = 32 + }, +/obj/item/kirbyplants/organic/plant22, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"uQF" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/west, +/obj/effect/turf_decal/bot_red, +/obj/machinery/suit_storage_unit/medical, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/textured, +/area/station/medical/storage) "uQN" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, /turf/open/floor/iron/white, /area/station/service/kitchen/abandoned) -"uQO" = ( -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/neutral/mid_joiner{ - dir = 8 - }, -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/siding/dark_red, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/security/medical) "uQY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -83367,6 +83693,13 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/fore) +"uRP" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/office) "uRV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -83467,6 +83800,7 @@ /obj/effect/turf_decal/bot, /obj/item/radio/intercom/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/science/ordnance) "uSY" = ( @@ -83494,11 +83828,6 @@ "uTm" = ( /turf/open/floor/iron, /area/station/science/robotics/mechbay) -"uTq" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "uTs" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -83588,35 +83917,20 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) -"uUV" = ( -/obj/structure/table, -/obj/item/transfer_valve{ - pixel_x = 5 - }, -/obj/item/transfer_valve, -/obj/item/transfer_valve{ - pixel_x = -5 - }, -/obj/item/transfer_valve{ - pixel_x = 5 +"uUS" = ( +/obj/structure/table/wood, +/obj/machinery/newscaster/directional/east, +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/siding/purple{ + dir = 6 }, -/obj/item/transfer_valve, -/obj/machinery/status_display/evac/directional/east, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/item/flashlight/lamp/green, +/turf/open/floor/iron, +/area/station/command/heads_quarters/rd) "uUW" = ( /turf/closed/wall, /area/station/maintenance/space_hut/observatory) -"uVa" = ( -/obj/machinery/restaurant_portal/restaurant, -/obj/effect/turf_decal/delivery/red, -/obj/machinery/light/directional/west, -/obj/item/radio/intercom/directional/west, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/white/smooth_large, -/area/station/service/cafeteria) "uVd" = ( /obj/effect/landmark/start/hangover, /obj/machinery/holopad, @@ -83639,6 +83953,22 @@ "uVk" = ( /turf/open/floor/engine/co2, /area/station/engineering/atmos) +"uVs" = ( +/obj/machinery/portable_atmospherics/canister, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Atmospherics - Ports"; + name = "atmospherics camera" + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/engineering/atmos) "uVF" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, @@ -83670,10 +84000,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/service/kitchen/abandoned) -"uWi" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron, -/area/station/maintenance/department/chapel) "uWj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -83703,17 +84029,6 @@ /obj/structure/sign/warning/xeno_mining/directional/south, /turf/open/floor/iron/smooth, /area/station/maintenance/department/science/xenobiology) -"uWu" = ( -/obj/machinery/door/window{ - base_state = "rightsecure"; - dir = 4; - icon_state = "rightsecure"; - name = "Primary AI Core Access"; - req_access = list("ai_upload") - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "uWI" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -83809,14 +84124,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/xenobiology) -"uXX" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/light/directional/east, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/service/bar) "uYg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet/green, @@ -83851,18 +84158,6 @@ }, /turf/open/floor/iron, /area/station/medical/surgery/theatre) -"uYv" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = -32; - pixel_y = -32 - }, -/obj/machinery/light/small/directional/south, -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "uYy" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -83893,14 +84188,6 @@ "uYH" = ( /turf/open/floor/plating, /area/station/maintenance/port/aft) -"uYK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) "uYX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -83909,6 +84196,16 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"uZe" = ( +/obj/machinery/door/window/brigdoor/left/directional/south{ + name = "Coroner's Office"; + req_access = list("morgue_secure") + }, +/obj/effect/turf_decal/siding/dark_blue, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "uZf" = ( /obj/structure/flora/bush/flowers_br/style_random, /obj/structure/flora/bush/lavendergrass, @@ -83990,6 +84287,13 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, /area/station/engineering/atmos/storage) +"uZM" = ( +/obj/structure/sign/warning/electric_shock/directional/east, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "uZQ" = ( /obj/structure/rack, /obj/item/stack/medical/gauze, @@ -84069,16 +84373,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/engineering/main) -"vaE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/storage/secure/briefcase, -/obj/item/storage/briefcase{ - pixel_x = -3; - pixel_y = 3 - }, -/turf/open/floor/plating, -/area/station/security/detectives_office/private_investigators_office) "vaK" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -84116,19 +84410,6 @@ dir = 4 }, /area/station/commons/fitness/recreation) -"vbp" = ( -/obj/machinery/duct, -/obj/machinery/light/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Atmospherics - Project Room Aft"; - name = "atmospherics camera" - }, -/obj/machinery/status_display/ai/directional/north, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) "vbq" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -84148,17 +84429,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/chapel) -"vbx" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/vending/games, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "vbH" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 @@ -84228,11 +84498,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/captain/private) -"vcf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/security/prison) "vcj" = ( /obj/structure/closet/firecloset, /obj/machinery/firealarm/directional/south, @@ -84255,6 +84520,22 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"vcz" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/conveyor{ + dir = 4; + id = "garbage" + }, +/obj/structure/sign/warning/vacuum/directional/north, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "vcB" = ( /turf/closed/wall, /area/station/maintenance/port) @@ -84287,14 +84568,6 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/iron, /area/station/security/prison) -"vdd" = ( -/obj/item/radio/intercom/directional/north, -/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/north, -/turf/open/floor/iron/white, -/area/station/science/research) "vdA" = ( /obj/effect/turf_decal/siding/white{ dir = 4 @@ -84302,6 +84575,22 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/genetics) +"vdB" = ( +/obj/machinery/computer/monitor{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/radio/intercom/directional/south{ + freerange = 1; + frequency = 1447; + listening = 0; + name = "Private Channel" + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) "vdH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -84312,19 +84601,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"vdM" = ( -/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/light/small/directional/north, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "vdN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -84457,6 +84733,21 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"vfA" = ( +/obj/structure/table/glass, +/obj/item/radio/intercom/directional/south, +/obj/item/clipboard, +/obj/item/toy/figure/md{ + pixel_y = 4 + }, +/obj/item/reagent_containers/hypospray/medipen{ + pixel_y = -4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/paramedic) "vfN" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/hydroponics/constructable, @@ -84528,23 +84819,9 @@ "vgE" = ( /turf/open/floor/circuit/telecomms, /area/station/science/xenobiology) -"vgF" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/machinery/light/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/department/eva/abandoned) "vgK" = ( /turf/closed/wall, /area/station/security/range) -"vgO" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/structure/table/reinforced, -/obj/item/wrench, -/obj/item/clothing/glasses/science, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/station/science/xenobiology) "vgQ" = ( /turf/closed/wall/r_wall, /area/station/security/interrogation) @@ -84553,14 +84830,6 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/space/basic, /area/space/nearstation) -"vgU" = ( -/obj/item/kirbyplants/random, -/obj/machinery/firealarm/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) "vgZ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -84610,21 +84879,9 @@ /area/station/service/bar/backroom) "vhK" = ( /obj/effect/landmark/blobstart, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) -"vhN" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Chapel - Crematorium"; - name = "chapel camera"; - network = list("ss13","chapel") - }, -/obj/structure/sign/warning/no_smoking/directional/north, -/obj/machinery/light/small/red/directional/north, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) "vhW" = ( /obj/item/kirbyplants/random, /obj/structure/sign/warning/pods/directional/south{ @@ -84635,6 +84892,17 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) +"vid" = ( +/obj/item/reagent_containers/spray/cleaner, +/obj/item/pushbroom, +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/obj/structure/closet, +/obj/effect/turf_decal/trimline/dark_blue/filled/line, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "vii" = ( /turf/open/floor/iron/white/side{ dir = 4 @@ -84721,17 +84989,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos) -"vji" = ( -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Security - Head of Security's Office"; - dir = 9 - }, -/obj/structure/bed/dogbed/lia, -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hos) "vjm" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, @@ -84788,20 +85045,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"vka" = ( -/obj/item/radio/intercom/directional/west, -/obj/item/storage/toolbox/electrical{ - pixel_y = 3 - }, -/obj/structure/table, -/obj/item/multitool{ - pixel_x = -4; - pixel_y = 2 - }, -/obj/machinery/light/cold/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/circuits) "vkg" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -84809,6 +85052,19 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/engineering/atmos/mix) +"vki" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/directional/east{ + c_tag = "Auxiliary Tool Storage"; + name = "engineering camera" + }, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/iron, +/area/station/commons/storage/tools) "vkv" = ( /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 8 @@ -84859,6 +85115,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/fore) +"vkX" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/vending/cigarette, +/obj/structure/sign/nanotrasen{ + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central/fore) "vlA" = ( /turf/closed/wall/r_wall, /area/station/maintenance/solars/port/fore) @@ -84897,11 +85163,15 @@ /area/station/service/cafeteria) "vmo" = ( /obj/structure/table/glass, -/obj/item/reagent_containers/cup/bottle/morphine, -/obj/item/reagent_containers/syringe, /obj/machinery/status_display/ai/directional/west, /obj/machinery/newscaster/directional/north, /obj/effect/turf_decal/siding/dark_red, +/obj/item/storage/box/bandages{ + pixel_y = 6; + pixel_x = -6 + }, +/obj/item/reagent_containers/cup/bottle/morphine, +/obj/item/reagent_containers/syringe, /turf/open/floor/iron/dark, /area/station/security/execution/transfer) "vmr" = ( @@ -84955,6 +85225,11 @@ /obj/structure/sign/clock/directional/east, /turf/open/floor/wood, /area/station/commons/dorms) +"vnd" = ( +/obj/structure/bodycontainer/morgue, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark/textured_half, +/area/station/service/chapel/storage) "vnn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -84982,31 +85257,8 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/storage/gas) -"vnu" = ( -/obj/machinery/airalarm/directional/north, -/obj/structure/rack, -/obj/item/crowbar, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/obj/item/binoculars, -/obj/item/gps/engineering{ - gpstag = "CE0" - }, -/obj/machinery/camera/directional/north{ - c_tag = "AI Satellite - Transit Tube Entrance"; - name = "ai camera"; - network = list("minisat"); - start_active = 1 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) "vnB" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, /obj/machinery/camera/directional/east{ c_tag = "Medbay - Operating Room"; @@ -85051,21 +85303,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/engineering/main) -"vob" = ( -/obj/machinery/light/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Fore Hallway - Hydroponics"; - name = "hallway camera" - }, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, -/turf/open/floor/iron/dark/corner{ - dir = 8 - }, -/area/station/hallway/primary/fore) "vod" = ( /obj/item/kirbyplants/random, /obj/machinery/button/door/directional/south{ @@ -85169,17 +85406,6 @@ }, /turf/open/space/basic, /area/space/nearstation) -"vpq" = ( -/obj/machinery/light/directional/south, -/obj/machinery/status_display/ai/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/hos) "vpC" = ( /obj/item/storage/medkit/regular, /obj/structure/table, @@ -85342,31 +85568,20 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/office) -"vrJ" = ( -/obj/machinery/modular_computer/console/preset/id{ +"vrP" = ( +/obj/structure/disposalpipe/trunk{ dir = 8 }, -/obj/machinery/camera/directional/east{ - c_tag = "Customs - Arrivals" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/customs/fore) -"vsp" = ( -/obj/machinery/status_display/ai/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/obj/machinery/disposal/bin, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/station/service/lawoffice) "vss" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /turf/open/floor/iron/dark, /area/station/science/ordnance) "vsy" = ( @@ -85396,6 +85611,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/maintenance/fore) +"vsB" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) "vsI" = ( /obj/structure/sign/departments/chemistry/pharmacy/directional/north, /obj/structure/cable, @@ -85454,7 +85676,7 @@ /turf/open/floor/iron, /area/station/science/research/abandoned) "vtt" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 @@ -85541,14 +85763,30 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) -"vuy" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = 32 +"vuv" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Bridge - Port"; + name = "command camera" }, -/obj/item/kirbyplants/random, -/obj/structure/sign/clock/directional/north, -/turf/open/floor/wood, -/area/station/commons/dorms) +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"vuE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/storage/bag/plants/portaseeder, +/obj/item/cultivator, +/obj/item/reagent_containers/cup/watering_can, +/obj/item/plant_analyzer, +/obj/structure/sign/poster/contraband/kudzu/directional/south, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/siding/green{ + dir = 8 + }, +/turf/open/floor/iron/checker, +/area/station/service/hydroponics/garden/abandoned) "vuG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -85576,17 +85814,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"vuS" = ( -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/obj/machinery/light/directional/north, -/obj/structure/table, -/obj/machinery/fax{ - fax_name = "Chief Medical Officer's Office"; - name = "Chief Medical Officer's Fax Machine" - }, -/obj/effect/turf_decal/tile/blue/opposingcorners, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) "vuU" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -85597,14 +85824,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/secondary/exit) -"vvb" = ( -/obj/effect/turf_decal/siding/green, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/flora/bush/leafy, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/flowers_yw, -/turf/open/floor/grass, -/area/station/medical/virology) "vvh" = ( /obj/structure/sign/departments/medbay/alt/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -85641,10 +85860,18 @@ dir = 1 }, /area/station/science/ordnance/storage) +"vvA" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Permabrig - Workroom"; + network = list("ss13","prison") + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/security/prison/work) "vvD" = ( /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "vvF" = ( @@ -85678,6 +85905,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"vvO" = ( +/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/opposingcorners, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/engineering/atmos/project) "vvR" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral, @@ -85821,6 +86056,15 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/fore) +"vxN" = ( +/obj/structure/table/reinforced, +/obj/item/folder/blue, +/obj/item/bodypart/leg/left/robot, +/obj/item/bodypart/leg/right/robot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "vxQ" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -85863,6 +86107,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/port) +"vyj" = ( +/obj/structure/rack, +/obj/effect/turf_decal/bot, +/obj/structure/window/reinforced/spawner/directional/east{ + pixel_x = 3 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/spawner/random/armory/laser_gun, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "vyl" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -85913,6 +86167,16 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron, /area/station/medical/treatment_center) +"vyN" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) "vyO" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -86084,19 +86348,6 @@ }, /turf/open/floor/iron, /area/station/commons/toilet/locker) -"vAz" = ( -/obj/machinery/space_heater, -/obj/effect/turf_decal/bot, -/obj/machinery/requests_console/directional/east{ - department = "Atmospherics"; - name = "Atmospherics Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) "vAC" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -86141,6 +86392,19 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/cargo/storage) +"vBa" = ( +/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, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "vBc" = ( /obj/machinery/airalarm/directional/south, /obj/item/kirbyplants/random, @@ -86201,22 +86465,6 @@ }, /turf/open/floor/carpet/orange, /area/station/commons/dorms) -"vBM" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Medbay - Morgue"; - name = "medical camera"; - network = list("ss13","medical") - }, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "vBO" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ @@ -86297,11 +86545,6 @@ }, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"vCO" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "vCQ" = ( /obj/machinery/newscaster/directional/south, /obj/machinery/vending/wardrobe/sec_wardrobe, @@ -86322,11 +86565,24 @@ /turf/open/floor/iron, /area/station/command/heads_quarters/hos) "vDj" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/line, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -8; + pixel_y = 17 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/half/contrasted, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) +/obj/machinery/holopad, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "vDm" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -86346,6 +86602,25 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/captain) +"vDw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/maintenance/disposal/incinerator) +"vDy" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/structure/sink/directional/east, +/obj/structure/mirror/directional/west, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "vDH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -86388,14 +86663,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"vEl" = ( -/obj/machinery/modular_computer/console/preset/engineering, -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "vEo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -86421,13 +86688,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/main) -"vEy" = ( -/obj/machinery/telecomms/server/presets/medical, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white/telecomms, -/area/station/tcommsat/server) "vEV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -86511,24 +86771,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"vFi" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/north, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/cell_10k, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) -"vFm" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Central Hallway - Aft"; - name = "hallway camera" - }, -/obj/structure/sign/departments/chemistry/pharmacy/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "vFn" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/structure/railing/corner{ @@ -86557,14 +86799,17 @@ }, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai_upload) -"vFx" = ( -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/spawner/random/trash/cigbutt, -/obj/effect/spawner/random/trash/cigbutt, -/obj/machinery/duct, -/obj/effect/spawner/random/trash/cigbutt, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) +"vFz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/green/filled/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/vending/wallmed/directional/east, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/virology) "vFC" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 5 @@ -86621,27 +86866,6 @@ "vGy" = ( /turf/closed/wall/mineral/plastitanium, /area/station/commons/fitness/recreation) -"vGG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/east, -/obj/machinery/bluespace_vendor/directional/east, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"vGM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/poster/contraband/free_drone/directional/north, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "vGP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/railing{ @@ -86667,6 +86891,19 @@ /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron, /area/station/security/range) +"vGY" = ( +/obj/structure/rack, +/obj/effect/turf_decal/bot, +/obj/item/storage/box/bodybags{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/box/bodybags, +/obj/machinery/airalarm/directional/west, +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/trimline/blue/filled/corner, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "vHh" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -86709,25 +86946,20 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"vHF" = ( -/obj/machinery/requests_console/directional/west{ - department = "Research Director's Desk"; - name = "Research Director's Requests Console" +"vHO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/ore_update, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/item/kirbyplants/random/dead/research_director, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/obj/effect/turf_decal/tile/purple{ +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ dir = 8 }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/rd) +/turf/open/floor/iron/smooth, +/area/station/hallway/secondary/entry) "vHT" = ( /turf/open/floor/wood, /area/station/maintenance/port/aft) @@ -86736,15 +86968,22 @@ /turf/open/floor/plating, /area/station/maintenance/department/security) "vId" = ( -/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, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 8 + }, +/obj/item/radio/intercom/directional/south, +/obj/effect/decal/cleanable/oil, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "vIq" = ( /obj/structure/cable, /obj/structure/disposalpipe/junction{ @@ -86856,6 +87095,14 @@ /obj/structure/cable/layer3, /turf/open/floor/circuit/green, /area/station/ai_monitored/turret_protected/ai) +"vKl" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/cargo/office) "vKn" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -86899,21 +87146,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"vKL" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/effect/spawner/random/maintenance, -/obj/structure/sign/poster/contraband/lusty_xenomorph/directional/north, -/obj/item/circuitboard/machine/holopad, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"vKY" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron, -/area/station/engineering/main) "vLd" = ( /obj/machinery/light/small/directional/east, /obj/structure/closet/secure_closet/brig{ @@ -86978,18 +87210,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"vLP" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/computer/slot_machine, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/maintenance/department/crew_quarters/bar) "vMd" = ( /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, @@ -87036,6 +87256,17 @@ dir = 8 }, /area/station/service/hydroponics/garden) +"vMI" = ( +/obj/structure/table, +/obj/machinery/status_display/ai/directional/west, +/obj/machinery/microwave{ + pixel_x = -2; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) "vMU" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -87066,6 +87297,10 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/service/chapel) +"vNo" = ( +/obj/vehicle/sealed/mecha/ripley/cargo, +/turf/open/floor/iron/recharge_floor, +/area/station/cargo/storage) "vNF" = ( /turf/open/floor/plating, /area/station/maintenance/department/security) @@ -87087,13 +87322,20 @@ /turf/open/floor/iron, /area/station/security/checkpoint/engineering) "vNV" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/half{ + dir = 8 + }, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/tile/purple{ +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/landmark/start/bitrunner, +/turf/open/floor/iron/half{ dir = 1 }, -/turf/open/floor/iron, /area/station/cargo/miningoffice) "vOh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -87192,14 +87434,6 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/arrivals) -"vPn" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "vPp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -87263,6 +87497,15 @@ "vPU" = ( /turf/open/floor/glass/reinforced, /area/station/maintenance/department/science/xenobiology) +"vPV" = ( +/obj/structure/table/reinforced, +/obj/item/mmi, +/obj/item/mmi, +/obj/item/mmi, +/obj/structure/sign/departments/medbay/alt/directional/south, +/obj/machinery/status_display/ai/directional/west, +/turf/open/floor/iron, +/area/station/science/robotics/lab) "vPZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -87276,6 +87519,15 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"vQc" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Central Hallway - Aft"; + name = "hallway camera" + }, +/obj/structure/sign/departments/chemistry/pharmacy/directional/south, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "vQe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -87297,12 +87549,6 @@ "vQj" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmos/mix) -"vQm" = ( -/obj/machinery/computer/mechpad, -/obj/effect/turf_decal/bot, -/obj/structure/sign/poster/official/build/directional/north, -/turf/open/floor/iron, -/area/station/science/robotics/mechbay) "vQq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/structure/disposalpipe/segment, @@ -87316,18 +87562,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"vQS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/obj/effect/turf_decal/siding/white{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron/white/corner{ - dir = 8 - }, -/area/station/service/kitchen) +"vQB" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/service/bar) "vRn" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/structure/railing/corner, @@ -87339,6 +87581,15 @@ /obj/effect/spawner/random/entertainment/cigarette_pack, /turf/open/floor/carpet/black, /area/station/maintenance/port) +"vRz" = ( +/obj/structure/closet/secure_closet/brig{ + name = "Prisoner Locker" + }, +/obj/machinery/status_display/ai/directional/south, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/execution/transfer) "vRB" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -87479,23 +87730,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/main) -"vTN" = ( -/obj/item/reagent_containers/chem_pack{ - pixel_x = 3; - pixel_y = 2 - }, -/obj/item/reagent_containers/chem_pack{ - pixel_x = -4; - pixel_y = 2 - }, -/obj/item/reagent_containers/chem_pack{ - pixel_y = 3 - }, -/obj/machinery/light/directional/south, -/obj/structure/table/reinforced/rglass, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron, -/area/station/medical/treatment_center) "vTO" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -87536,6 +87770,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos) +"vUt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/directional/south{ + c_tag = "Atmospherics - Project Room Closet"; + name = "atmospherics camera" + }, +/obj/machinery/status_display/evac/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/half{ + dir = 8 + }, +/area/station/engineering/atmos/project) "vUz" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, @@ -87638,17 +87884,6 @@ /obj/structure/transit_tube/crossing/horizontal, /turf/open/space/basic, /area/space/nearstation) -"vVY" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 9 - }, -/obj/machinery/duct, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "vWb" = ( /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -87669,15 +87904,17 @@ "vWu" = ( /turf/open/floor/iron, /area/station/service/hydroponics/garden) -"vWv" = ( -/obj/structure/disposalpipe/trunk{ - dir = 1 +"vWD" = ( +/obj/item/radio/intercom/directional/north, +/obj/machinery/mech_bay_recharge_port, +/obj/effect/turf_decal/delivery, +/obj/machinery/camera/directional/north{ + c_tag = "Cargo Bay - Fore"; + name = "cargo camera" }, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron/checker, -/area/station/hallway/secondary/service) +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/cargo/storage) "vWM" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/warning/vacuum/directional/west, @@ -87690,15 +87927,23 @@ /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/commons/fitness/recreation) -"vWS" = ( -/obj/structure/chair/office, -/obj/item/cardboard_cutout, -/obj/structure/sign/poster/contraband/tools/directional/north, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 +"vWU" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) +"vWV" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/requests_console/directional/north{ + department = "Robotics"; + name = "Robotics Requests Console" }, -/turf/open/floor/iron/smooth_half, -/area/station/maintenance/port/aft) +/obj/effect/mapping_helpers/requests_console/ore_update, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/machinery/light/cold/directional/north, +/obj/structure/closet/crate/mod, +/turf/open/floor/iron, +/area/station/science/robotics/lab) "vXh" = ( /obj/structure/chair/stool/directional/north, /obj/effect/turf_decal/tile/red/diagonal_centre, @@ -87714,21 +87959,19 @@ }, /turf/open/floor/plating, /area/station/security/execution/transfer) -"vXF" = ( -/obj/machinery/portable_atmospherics/canister, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 +"vXv" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/window/preopen{ + dir = 1; + id = "left_arrivals_shutters" }, -/obj/effect/turf_decal/bot, /obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Atmospherics - Ports"; - name = "atmospherics camera" + dir = 1 }, -/turf/open/floor/iron, -/area/station/engineering/atmos) +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark/corner, +/area/station/hallway/secondary/entry) "vXH" = ( /obj/structure/chair/office{ dir = 8 @@ -87769,16 +88012,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den/gaming) -"vXS" = ( -/obj/structure/sign/warning/secure_area/directional/south, -/obj/structure/table, -/obj/item/assembly/infra, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/filled/line, -/turf/open/floor/iron/white, -/area/station/science/lobby) "vXT" = ( /obj/structure/closet/wardrobe/pjs, /obj/effect/landmark/start/hangover/closet, @@ -87828,16 +88061,6 @@ }, /turf/open/floor/iron/solarpanel/airless, /area/station/solars/port/fore) -"vYv" = ( -/obj/structure/cable, -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/pipe/layer_manifold/cyan/visible, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/status_display/ai/directional/west, -/turf/open/floor/iron, -/area/station/engineering/supermatter/room) "vYw" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 @@ -87859,6 +88082,17 @@ }, /turf/open/floor/iron/dark/corner, /area/station/engineering/atmos/mix) +"vZk" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/bodycontainer/morgue/beeper_off{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/warning, +/turf/open/floor/iron/dark/textured_half, +/area/station/medical/morgue) "vZl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -87878,6 +88112,15 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"vZw" = ( +/obj/structure/table/reinforced, +/obj/item/storage/medkit/regular, +/obj/item/storage/secure/safe/caps_spare/directional/west, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "vZE" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -87969,18 +88212,6 @@ /obj/item/lighter, /turf/open/floor/iron/grimy, /area/station/security/detectives_office/private_investigators_office) -"waV" = ( -/obj/structure/chair, -/obj/machinery/airalarm/directional/west, -/obj/machinery/camera/directional/north{ - c_tag = "Security Post - Departures Holding Cell"; - dir = 9 - }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/escape) "waZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -88035,20 +88266,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"wbA" = ( -/obj/machinery/light/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Security - Office Aft" - }, -/obj/machinery/computer/security/telescreen/entertainment/directional/south, -/obj/machinery/modular_computer/console/preset/cargochat/security{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/office) "wbE" = ( /obj/effect/turf_decal/trimline/yellow/line{ dir = 4 @@ -88116,17 +88333,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/security/prison/garden) -"wcZ" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "AI Satellite - Fore"; - name = "ai camera"; - network = list("minisat"); - start_active = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) "wda" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -88166,6 +88372,14 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/chapel) +"wdC" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/security/range) "wdD" = ( /obj/effect/turf_decal/tile/purple{ dir = 8 @@ -88194,6 +88408,24 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/detectives_office) +"wdZ" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden, +/obj/machinery/light_switch/directional/west{ + pixel_y = 8 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Atmospherics - Office"; + name = "atmospherics camera" + }, +/obj/effect/turf_decal/bot, +/obj/item/radio/intercom/directional/west{ + pixel_y = -8 + }, +/obj/machinery/modular_computer/preset/civilian{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos/storage/gas) "web" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 @@ -88209,6 +88441,11 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/atmos/storage/gas) +"weg" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay) "weh" = ( /obj/structure/closet/secure_closet/brig{ id = "cargocell"; @@ -88219,6 +88456,10 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/supply) +"wem" = ( +/obj/machinery/telecomms/receiver/preset_right, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) "wes" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ @@ -88226,17 +88467,6 @@ }, /turf/open/space/basic, /area/space/nearstation) -"weu" = ( -/obj/structure/table/wood, -/obj/item/camera_film, -/obj/item/camera_film{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/machinery/status_display/evac/directional/east, -/obj/machinery/light/small/directional/east, -/turf/open/floor/carpet/royalblack, -/area/station/service/chapel/office) "weE" = ( /obj/structure/sign/departments/xenobio/directional/west, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -88289,15 +88519,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/primary/fore) -"wfg" = ( -/obj/machinery/firealarm/directional/north, -/obj/item/stack/medical/gauze, -/obj/item/stack/medical/mesh, -/obj/machinery/light/directional/north, -/obj/structure/table/reinforced/rglass, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron, -/area/station/medical/treatment_center) "wfv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/airlock/maintenance_hatch{ @@ -88345,17 +88566,24 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"wfV" = ( -/obj/machinery/mass_driver/trash{ - dir = 4 +"wfK" = ( +/obj/item/radio/intercom/directional/east, +/obj/machinery/newscaster/directional/south, +/obj/structure/filingcabinet/filingcabinet, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted, +/turf/open/floor/iron, +/area/station/cargo/office) +"wfR" = ( +/obj/machinery/hydroponics/constructable, +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 }, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/green{ dir = 1 }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) +/turf/open/floor/iron, +/area/station/service/hydroponics) "wgb" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command{ @@ -88371,13 +88599,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"wgc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/dresser, -/obj/structure/mirror/directional/south, -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/station/service/theater/abandoned) "wgn" = ( /obj/structure/closet/masks, /obj/effect/turf_decal/bot, @@ -88386,14 +88607,6 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"wgv" = ( -/obj/machinery/airalarm/directional/east, -/obj/machinery/light/warm/directional/east, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/command/corporate_showroom) "wgx" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -88458,14 +88671,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos) -"wgU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash/mess, -/obj/structure/sign/poster/random/directional/east, -/turf/open/floor/iron/grimy, -/area/station/maintenance/port/fore) "wgV" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -88487,8 +88692,18 @@ }, /obj/effect/mapping_helpers/airlock/access/any/supply/shipping, /obj/effect/mapping_helpers/airlock/access/any/supply/mining, +/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, /turf/open/floor/iron, /area/station/cargo/sorting) +"whc" = ( +/obj/structure/sign/poster/official/fruit_bowl/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/status_display/evac/directional/south, +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/engine, +/area/station/science/genetics) "whf" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -88553,15 +88768,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"whX" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) "wif" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -88599,12 +88805,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/service/library/abandoned) -"wiN" = ( -/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, -/area/station/commons/dorms) "wiT" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, @@ -88654,6 +88854,15 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) +"wjA" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/official/plasma_effects/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/virology) "wjF" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -88752,26 +88961,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) -"wkz" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=4"; - location = "QM #1" - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/light/directional/west, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #3"; - suffix = "#3" - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"wkN" = ( -/obj/machinery/duct, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "wkP" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -88941,17 +89130,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/iron, /area/station/engineering/atmos/project) -"wmu" = ( -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible, -/obj/structure/sign/directions/engineering{ - desc = "A sign that shows there are doors here. There are doors everywhere!"; - icon_state = "doors"; - name = "WARNING: PRESSURIZED DOORS"; - pixel_y = -32 - }, -/turf/open/floor/iron, -/area/station/engineering/supermatter/room) "wmE" = ( /obj/structure/closet/wardrobe/mixed, /obj/effect/turf_decal/siding/dark_blue{ @@ -89082,6 +89260,21 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/security/brig) +"wnG" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/window/preopen{ + dir = 1; + id = "right_arrivals_shutters" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark/corner{ + dir = 8 + }, +/area/station/hallway/secondary/entry) "wnI" = ( /obj/item/sign, /obj/effect/spawner/random/structure/crate_empty, @@ -89097,19 +89290,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"wnW" = ( -/obj/structure/sign/departments/science/alt/directional/north, -/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/purple/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/research) "wnY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -89139,13 +89319,14 @@ /obj/machinery/light/small/broken/directional/south, /turf/open/floor/plating, /area/station/service/library/abandoned) -"wok" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/station/science/research) +"woh" = ( +/obj/structure/reagent_dispensers/wall/peppertank/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/sign/poster/official/space_cops/directional/south, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/security) "won" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -89159,34 +89340,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"wow" = ( -/obj/structure/rack, -/obj/item/clothing/suit/armor/bulletproof{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/suit/armor/bulletproof, -/obj/item/clothing/suit/armor/bulletproof{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/clothing/head/helmet/alt{ - layer = 3.00001; - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/head/helmet/alt{ - layer = 3.00001 - }, -/obj/item/clothing/head/helmet/alt{ - layer = 3.00001; - pixel_x = 3; - pixel_y = -3 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "woB" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/delivery, @@ -89232,19 +89385,16 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/chapel) -"wpk" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 1 +"wpp" = ( +/obj/structure/closet/crate/bin, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 }, -/obj/machinery/status_display/evac/directional/south, -/obj/structure/table/wood, -/obj/item/flashlight/lamp, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/corner{ + dir = 4 }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/cmo) +/area/station/hallway/secondary/exit/departure_lounge) "wpt" = ( /obj/structure/fireplace, /turf/open/floor/stone, @@ -89311,19 +89461,6 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron, /area/station/security/processing) -"wpS" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/closet/crate/hydroponics, -/obj/effect/spawner/random/food_or_drink/seed, -/obj/effect/spawner/random/food_or_drink/seed, -/obj/effect/spawner/random/food_or_drink/seed, -/obj/effect/spawner/random/maintenance, -/obj/machinery/light_switch/directional/east{ - pixel_y = 6 - }, -/obj/effect/turf_decal/box, -/turf/open/floor/iron/checker, -/area/station/service/hydroponics/garden/abandoned) "wpT" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -89424,13 +89561,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/storage) -"wqG" = ( -/obj/structure/table/wood, -/obj/machinery/light/directional/north, -/obj/item/storage/lockbox/loyalty, -/obj/item/storage/secure/safe/directional/east, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) "wqQ" = ( /obj/item/radio/intercom/directional/east, /obj/structure/window/reinforced/spawner/directional/south, @@ -89473,6 +89603,14 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/escape) +"wrw" = ( +/obj/item/kirbyplants/random, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/office) "wry" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, /obj/effect/decal/cleanable/dirt, @@ -89523,12 +89661,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, /area/station/service/kitchen/coldroom) -"wrX" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/scrubber, -/obj/structure/sign/poster/official/there_is_no_gas_giant/directional/east, -/turf/open/floor/iron/textured_large, -/area/station/engineering/atmos/project) "wrZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -89545,13 +89677,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/port) -"wsn" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp, -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/library) "wsp" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 @@ -89638,11 +89763,6 @@ /obj/effect/landmark/navigate_destination, /turf/open/floor/iron, /area/station/science/ordnance/office) -"wte" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron, -/area/station/cargo/warehouse) "wtg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/start/hangover, @@ -89666,11 +89786,6 @@ /obj/structure/chair/office, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) -"wtE" = ( -/obj/effect/landmark/start/hangover, -/obj/effect/landmark/event_spawn, -/turf/open/floor/vault, -/area/station/commons/fitness/recreation) "wtH" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/oil, @@ -89703,26 +89818,6 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/white, /area/station/medical/storage) -"wtZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/directions/supply{ - dir = 1; - pixel_x = 32; - pixel_y = 8 - }, -/obj/structure/sign/directions/vault{ - dir = 1; - pixel_x = 32 - }, -/obj/structure/sign/directions/security{ - dir = 1; - pixel_x = 32; - pixel_y = -8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "wuh" = ( /obj/structure/railing{ dir = 8 @@ -89762,6 +89857,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/main) +"wuA" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "wuB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -89783,12 +89888,19 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/storage) -"wuF" = ( -/obj/effect/turf_decal/bot, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/arrivals) +"wuU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "wuV" = ( /obj/structure/fireaxecabinet/directional/south, /obj/effect/turf_decal/tile/blue/half/contrasted, @@ -89815,14 +89927,6 @@ }, /turf/open/floor/iron, /area/station/service/abandoned_gambling_den/gaming) -"wvb" = ( -/obj/machinery/light/directional/east, -/obj/item/radio/intercom/directional/east, -/obj/machinery/newscaster/directional/south, -/obj/structure/filingcabinet/filingcabinet, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/cargo/office) "wvf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -89913,17 +90017,6 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron/dark, /area/station/medical/chemistry) -"wwk" = ( -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/disposal/bin, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/delivery, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "wwr" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, @@ -89931,14 +90024,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/engineering/break_room) -"wwI" = ( -/obj/machinery/light/dim/directional/south, -/obj/machinery/status_display/ai/directional/south, -/obj/effect/turf_decal/siding/thinplating/dark, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "wwN" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, @@ -89986,6 +90071,23 @@ dir = 8 }, /area/station/science/lobby) +"wxk" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"wxl" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/structure/sign/poster/official/safety_report/directional/west, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/escape) "wxo" = ( /obj/effect/turf_decal/bot, /obj/machinery/vending/coffee, @@ -90027,15 +90129,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"wxQ" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/sign/warning/yes_smoking/circle/directional/south, -/obj/machinery/light/small/directional/south, -/obj/item/kirbyplants/random/dead{ - name = "Lungie" - }, -/turf/open/floor/iron/white, -/area/station/commons/fitness/recreation) "wyh" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -90067,15 +90160,23 @@ }, /turf/open/floor/plating, /area/station/command/bridge) -"wyJ" = ( -/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/hangover, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/delamination_counter/directional/north, +"wyK" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/turf_decal/bot, +/obj/machinery/status_display/evac/directional/east, +/obj/item/taperecorder{ + pixel_y = 7 + }, +/obj/machinery/light_switch/directional/north{ + pixel_x = 9; + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, /turf/open/floor/iron, -/area/station/engineering/break_room) +/area/station/command/heads_quarters/rd) "wyN" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 10 @@ -90142,26 +90243,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/textured_large, /area/station/engineering/atmos/project) -"wzH" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/gps, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"wzM" = ( -/obj/machinery/light/directional/west, -/obj/effect/mapping_helpers/ianbirthday, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) "wzO" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/virology{ @@ -90205,6 +90286,14 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/department/science/xenobiology) +"wzY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) "wzZ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/plastic, @@ -90232,21 +90321,25 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/security/prison/garden) -"wAu" = ( -/obj/machinery/light/directional/east, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "wAz" = ( /obj/structure/table/wood, /obj/item/folder/red, /obj/item/pen, /turf/open/floor/wood, /area/station/service/electronic_marketing_den) +"wAI" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light_switch/directional/south{ + pixel_x = -8 + }, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/cafeteria, +/area/station/service/cafeteria) "wAN" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -90357,10 +90450,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/medical/treatment_center) -"wBX" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/station/service/library/abandoned) "wCc" = ( /obj/structure/flora/bush/lavendergrass/style_random, /obj/structure/flora/bush/grassy/style_random, @@ -90393,6 +90482,17 @@ /obj/structure/closet/firecloset, /turf/open/floor/iron, /area/station/engineering/main) +"wCr" = ( +/obj/machinery/button/crematorium{ + id = "crematoriumChapel"; + pixel_x = 25 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/sign/warning/hot_temp/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) "wCv" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -90423,13 +90523,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/courtroom) -"wCP" = ( -/obj/item/kirbyplants/random, -/obj/structure/sign/poster/official/ian/directional/south, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) "wCT" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/line{ @@ -90490,21 +90583,6 @@ }, /turf/open/floor/iron, /area/station/science/xenobiology) -"wDr" = ( -/obj/structure/rack, -/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/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "wDy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -90536,19 +90614,50 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/medical/medsci) +"wDO" = ( +/obj/machinery/modular_computer/preset/id{ + dir = 1 + }, +/obj/machinery/keycard_auth/directional/south{ + pixel_x = -5 + }, +/obj/machinery/button/door/directional/south{ + id = "cmoshutter"; + name = "CMO Office Shutters"; + pixel_x = 8; + pixel_y = -26; + req_access = list("cmo") + }, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/cmo) "wDX" = ( /obj/effect/turf_decal/tile/red{ dir = 4 }, /turf/open/floor/iron, /area/station/security/execution/transfer) -"wEj" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, +"wEm" = ( +/obj/structure/table/reinforced, +/obj/item/assembly/igniter, +/obj/item/assembly/igniter, +/obj/item/assembly/igniter, +/obj/effect/spawner/random/maintenance, +/obj/machinery/status_display/evac/directional/east, /turf/open/floor/iron, -/area/station/hallway/primary/central/aft) +/area/station/commons/storage/primary) +"wEv" = ( +/obj/structure/table/reinforced, +/obj/item/stack/rods/fifty, +/obj/item/wrench, +/obj/item/storage/box/lights/mixed, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/random/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/maintenance/port) "wEx" = ( /obj/structure/table/reinforced, /obj/item/clipboard, @@ -90564,6 +90673,23 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) +"wEC" = ( +/obj/machinery/smartfridge/extract/preloaded, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/science/xenobiology) +"wEE" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/mechanical, +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/gloves/color/black, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/plating, +/area/station/science/research/abandoned) "wEI" = ( /turf/closed/wall, /area/station/maintenance/department/science) @@ -90572,6 +90698,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/medical/abandoned) +"wEQ" = ( +/obj/structure/frame/computer{ + anchored = 1; + dir = 1 + }, +/obj/item/stack/sheet/glass, +/obj/structure/sign/poster/contraband/borg_fancy_1/directional/south, +/turf/open/floor/plating, +/area/station/science/research/abandoned) "wEX" = ( /obj/machinery/computer/atmos_alert{ dir = 8 @@ -90613,6 +90748,29 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) +"wFi" = ( +/obj/structure/table, +/obj/item/assembly/prox_sensor{ + pixel_x = -4; + pixel_y = 1 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = 2; + pixel_y = -2 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = 5; + pixel_y = 7 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = 9; + pixel_y = -2 + }, +/obj/machinery/status_display/ai/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "wFo" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -90634,15 +90792,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/port) -"wFG" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/lounge) "wFJ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -90651,14 +90800,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/orange/visible, /turf/open/space/basic, /area/space/nearstation) -"wFK" = ( -/obj/machinery/duct, -/obj/effect/turf_decal/trimline/neutral/warning, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "wFP" = ( /obj/structure/table/wood, /obj/item/stack/rods{ @@ -90745,6 +90886,36 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/atmos/storage/gas) +"wGQ" = ( +/obj/structure/cable, +/obj/machinery/computer/security/telescreen{ + dir = 8; + name = "Prisoner Telescreen"; + network = list("prison"); + pixel_x = 27 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/security/execution/transfer) +"wGS" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, +/obj/effect/turf_decal/box/corners{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "wGV" = ( /obj/effect/turf_decal/plaque{ icon_state = "L5" @@ -90755,15 +90926,6 @@ /obj/effect/spawner/random/structure/girder, /turf/open/floor/plating, /area/station/maintenance/department/science) -"wGX" = ( -/obj/structure/sign/poster/official/ion_rifle/directional/east, -/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/maintenance/department/science) "wHa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -90781,17 +90943,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/atmos/storage/gas) -"wHr" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/machinery/light/small/directional/west, -/obj/item/pen, -/obj/structure/sign/poster/official/enlist/directional/south, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/holding_cell) "wHs" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -90849,6 +91000,11 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/engineering/atmos/storage) +"wIr" = ( +/obj/machinery/firealarm/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood, +/area/station/command/meeting_room/council) "wIs" = ( /obj/effect/turf_decal/plaque{ icon_state = "L11" @@ -90868,6 +91024,15 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/maintenance/port/fore) +"wIz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/bluespace_vendor/directional/east, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "wIJ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -90878,12 +91043,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) -"wIM" = ( -/obj/structure/table/optable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/status_display/ai/directional/south, -/turf/open/floor/iron/dark, -/area/station/medical/surgery/theatre) "wJa" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/engine/vacuum, @@ -90903,6 +91062,23 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/security/courtroom) +"wJq" = ( +/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, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"wJJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/sign/warning/explosives/alt/directional/east, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/maintenance/department/science) "wJK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -90916,6 +91092,11 @@ /obj/item/razor, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/captain/private) +"wJS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/science/research/abandoned) "wJT" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral{ @@ -91144,6 +91325,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/service/hydroponics/garden/abandoned) +"wNE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron, +/area/station/engineering/atmos/project) "wNP" = ( /obj/machinery/portable_atmospherics/pump, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -91158,6 +91347,13 @@ dir = 1 }, /area/station/engineering/atmos/storage/gas) +"wNV" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white, +/area/station/science/research) "wOq" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -91252,12 +91448,14 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay) -"wPY" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) +"wPT" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) "wQo" = ( /obj/structure/table/wood, /obj/machinery/recharger{ @@ -91296,13 +91494,6 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/commons/locker) -"wQy" = ( -/obj/structure/filingcabinet, -/obj/item/folder/documents, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) "wQB" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, @@ -91312,20 +91503,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"wQD" = ( -/obj/structure/table/reinforced, -/obj/item/clipboard, -/obj/item/toy/figure/borg, -/obj/machinery/light/directional/south, -/obj/item/radio/intercom/directional/south{ - freerange = 1; - frequency = 1447; - listening = 0; - name = "Private Channel" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) "wQN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -91410,26 +91587,14 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/maintenance/department/eva/abandoned) -"wRU" = ( -/obj/machinery/light/directional/south, -/obj/structure/closet/secure_closet/security/sec, -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"wSk" = ( -/obj/effect/landmark/start/hangover, -/obj/structure/chair/sofa/left/brown{ +"wSh" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 }, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/commons/lounge) +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/poster/official/here_for_your_safety/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/prison/visit) "wSv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -91475,17 +91640,6 @@ }, /turf/open/floor/iron, /area/station/science/xenobiology) -"wSK" = ( -/obj/machinery/light_switch/directional/east, -/obj/structure/table, -/obj/item/crowbar, -/obj/item/wrench, -/obj/item/clothing/mask/gas, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) "wSR" = ( /turf/closed/wall, /area/station/maintenance/disposal/incinerator) @@ -91632,6 +91786,14 @@ /obj/effect/landmark/carpspawn, /turf/open/space/basic, /area/space) +"wVy" = ( +/obj/machinery/hydroponics/soil, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/west, +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/sign/poster/contraband/ambrosia_vulgaris/directional/west, +/turf/open/floor/plating, +/area/station/security/prison/garden) "wVJ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -91639,16 +91801,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) -"wVO" = ( -/obj/structure/table/reinforced, -/obj/item/clipboard, -/obj/item/toy/figure/secofficer, -/obj/machinery/newscaster/directional/west, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/holding_cell) +"wVQ" = ( +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/snack, +/obj/effect/spawner/random/trash/food_packaging, +/turf/open/floor/plating, +/area/station/maintenance/fore) "wVR" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -91690,6 +91848,18 @@ }, /turf/open/floor/iron/dark, /area/station/security/office) +"wWJ" = ( +/obj/machinery/space_heater, +/obj/effect/turf_decal/bot, +/obj/machinery/requests_console/directional/east{ + department = "Atmospherics"; + name = "Atmospherics Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) "wWL" = ( /obj/item/radio/intercom/directional/west, /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ @@ -91743,22 +91913,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/cargo/storage) -"wXd" = ( -/obj/structure/table/glass, -/obj/item/radio/intercom/directional/south, -/obj/item/clipboard, -/obj/item/toy/figure/md{ - pixel_y = 4 - }, -/obj/item/reagent_containers/hypospray/medipen{ - pixel_y = -4 - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/paramedic) "wXq" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -91768,12 +91922,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"wXy" = ( -/obj/structure/chair/stool/bar/directional/north, -/obj/machinery/light/small/directional/west, -/obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/iron/grimy, -/area/station/service/abandoned_gambling_den) "wXH" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -91795,18 +91943,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"wXZ" = ( -/obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 8; - name = "killroom vent" - }, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/siding/dark_blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/telecomms, -/area/station/science/xenobiology) "wYH" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -91837,17 +91973,6 @@ /obj/effect/landmark/blobstart, /turf/open/floor/plating, /area/station/maintenance/fore) -"wZb" = ( -/obj/machinery/button/door/directional/south{ - id = "chapelprivacyoffice"; - name = "Privacy Control"; - req_access = list("crematorium") - }, -/obj/machinery/light/small/directional/south, -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) "wZu" = ( /obj/machinery/power/port_gen/pacman/pre_loaded, /obj/effect/turf_decal/delivery/red, @@ -91908,6 +92033,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) +"xao" = ( +/obj/machinery/status_display/evac/directional/north, +/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/north, +/turf/open/floor/iron/white, +/area/station/science/research) "xap" = ( /obj/structure/flora/bush/flowers_br/style_random, /obj/structure/flora/bush/sparsegrass/style_random, @@ -91926,6 +92059,16 @@ }, /turf/open/floor/iron, /area/station/commons/storage/tools) +"xaF" = ( +/obj/structure/sign/nanotrasen{ + pixel_x = 32; + pixel_y = -32 + }, +/obj/machinery/light/small/directional/south, +/obj/item/kirbyplants/organic/plant22, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "xaK" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ @@ -91993,13 +92136,6 @@ /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, /turf/open/floor/iron, /area/station/commons/vacant_room/office) -"xbk" = ( -/obj/structure/table/optable, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "xbp" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -92038,14 +92174,6 @@ }, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"xby" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Bridge - Port"; - name = "command camera" - }, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "xbD" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -92118,14 +92246,6 @@ /obj/item/reagent_containers/condiment/soymilk, /turf/open/floor/iron/dark, /area/station/service/kitchen/coldroom) -"xbW" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) "xcd" = ( /obj/item/stack/cable_coil, /obj/structure/lattice/catwalk, @@ -92163,6 +92283,18 @@ /obj/effect/turf_decal/trimline/purple/filled/warning, /turf/open/floor/iron/white, /area/station/science/research) +"xcL" = ( +/obj/vehicle/ridden/wheelchair{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/machinery/vending/wallmed/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/textured, +/area/station/medical/medbay) "xcR" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /obj/effect/landmark/event_spawn, @@ -92193,6 +92325,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/xenobiology) +"xdA" = ( +/obj/effect/spawner/random/decoration/carpet, +/obj/effect/spawner/random/structure/furniture_parts, +/obj/structure/closet/crate/decorations, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/station/maintenance/fore) "xdH" = ( /obj/effect/turf_decal/delivery, /obj/effect/landmark/start/hangover, @@ -92227,14 +92366,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/cargo/storage) -"xeg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/sign/warning/secure_area/directional/north, -/obj/machinery/light/directional/north, -/turf/open/floor/engine, -/area/station/science/explab) "xeh" = ( /obj/structure/cable, /obj/machinery/duct, @@ -92291,6 +92422,12 @@ dir = 8 }, /area/station/science/lobby) +"xeF" = ( +/obj/structure/cable, +/obj/item/kirbyplants/random, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/wood, +/area/station/security/detectives_office/private_investigators_office) "xeH" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch" @@ -92309,28 +92446,6 @@ /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/iron, /area/station/maintenance/department/crew_quarters/bar) -"xeN" = ( -/obj/structure/table, -/obj/item/assembly/prox_sensor{ - pixel_x = -4; - pixel_y = 1 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = 2; - pixel_y = -2 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = 5; - pixel_y = 7 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = 9; - pixel_y = -2 - }, -/obj/machinery/status_display/ai/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) "xeP" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 4 @@ -92354,6 +92469,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/department/chapel) +"xeY" = ( +/obj/machinery/washing_machine, +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/prison/work) "xfd" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -92372,6 +92495,24 @@ /obj/structure/cable, /turf/open/floor/wood/large, /area/station/service/library/lounge) +"xfj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/airalarm/directional/east, +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/delivery, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) +"xfq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "xfE" = ( /obj/structure/lattice/catwalk, /obj/structure/sign/nanotrasen{ @@ -92466,9 +92607,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"xhf" = ( -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) "xhi" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/button/door/directional/east{ @@ -92569,16 +92707,25 @@ /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/iron, /area/station/service/electronic_marketing_den) -"xhV" = ( +"xhT" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/door/window/right/directional/west{ + name = "Supply Storage"; + req_access = list("medical") + }, +/obj/item/storage/box/syringes, +/obj/item/storage/box/beakers{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/gun/syringe, +/obj/item/gun/syringe, /obj/structure/table/reinforced, -/obj/item/assembly/igniter, -/obj/item/assembly/igniter, -/obj/item/assembly/igniter, -/obj/effect/spawner/random/maintenance, -/obj/machinery/light/directional/north, -/obj/machinery/status_display/evac/directional/east, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, /turf/open/floor/iron, -/area/station/commons/storage/primary) +/area/station/medical/storage) "xhW" = ( /turf/closed/wall, /area/station/cargo/sorting) @@ -92593,6 +92740,11 @@ /obj/machinery/vending/cigarette, /turf/open/floor/plating, /area/station/service/theater/abandoned) +"xil" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "xin" = ( /obj/effect/spawner/random/structure/tank_holder, /obj/effect/turf_decal/tile/yellow{ @@ -92600,6 +92752,14 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"xip" = ( +/obj/structure/bodycontainer/morgue/beeper_off, +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/warning, +/turf/open/floor/iron/dark/textured_half, +/area/station/medical/morgue) "xiB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -92650,6 +92810,19 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) +"xjo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/status_display/evac/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Arrivals Dock - Aft Starboard"; + name = "dock camera" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "xjx" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, @@ -92698,6 +92871,20 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay) +"xka" = ( +/obj/item/radio/intercom/directional/north, +/obj/machinery/button/door/directional/north{ + id = "barber_door_lock"; + normaldoorcontrol = 1; + pixel_y = 40; + specialfunctions = 4 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Barber Shop" + }, +/obj/machinery/light/directional/north, +/turf/open/floor/wood/large, +/area/station/service/barber) "xkh" = ( /obj/effect/turf_decal/loading_area{ dir = 8 @@ -92738,6 +92925,20 @@ /obj/structure/closet/crate/freezer/blood, /turf/open/floor/iron/freezer, /area/station/medical/coldroom) +"xkV" = ( +/obj/structure/table, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/machinery/cell_charger, +/obj/item/screwdriver{ + pixel_y = -1 + }, +/obj/effect/turf_decal/siding/purple{ + dir = 8 + }, +/obj/item/stock_parts/cell/high, +/turf/open/floor/iron, +/area/station/science/robotics/lab) "xkW" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/north, @@ -92752,17 +92953,6 @@ dir = 1 }, /area/station/engineering/atmos) -"xla" = ( -/obj/machinery/airalarm/directional/west, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/machinery/light/cold/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel/storage) "xlb" = ( /obj/item/kirbyplants/random, /obj/structure/extinguisher_cabinet/directional/north, @@ -92787,6 +92977,11 @@ /obj/item/flashlight, /turf/open/floor/iron, /area/station/commons/storage/primary) +"xlC" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "xlG" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, @@ -92815,22 +93010,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/genetics) -"xmg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"xmk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/stool/directional/north, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/cafeteria, -/area/station/security/prison/mess) "xmm" = ( /obj/structure/table/reinforced, /obj/machinery/door/poddoor/shutters{ @@ -92904,6 +93083,13 @@ /obj/structure/noticeboard/directional/north, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) +"xnd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/entertainment/arcade{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/service/abandoned_gambling_den/gaming) "xng" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -92987,6 +93173,11 @@ /obj/machinery/computer/security/wooden_tv, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) +"xny" = ( +/obj/structure/sign/poster/official/do_not_question/directional/south, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "xnF" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -93010,6 +93201,12 @@ /obj/machinery/atmospherics/components/tank, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) +"xor" = ( +/obj/effect/spawner/random/entertainment/arcade{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/service/abandoned_gambling_den/gaming) "xoK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -93052,14 +93249,6 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/iron/grimy, /area/station/service/library/abandoned) -"xpr" = ( -/obj/effect/spawner/random/decoration/carpet, -/obj/effect/spawner/random/structure/furniture_parts, -/obj/structure/closet/crate/decorations, -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/fore) "xpt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -93113,7 +93302,9 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "xqc" = ( -/obj/structure/bed, +/obj/structure/bed/medical{ + dir = 4 + }, /obj/item/clothing/suit/jacket/straight_jacket, /obj/item/clothing/mask/muzzle, /obj/item/clothing/glasses/blindfold, @@ -93156,22 +93347,6 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/virology) -"xqA" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp, -/obj/structure/sign/poster/official/work_for_a_future/directional/south, -/obj/machinery/light/small/directional/south, -/turf/open/floor/carpet, -/area/station/commons/vacant_room/office) -"xqG" = ( -/obj/structure/table/reinforced, -/obj/machinery/newscaster/directional/north, -/obj/effect/turf_decal/bot, -/obj/item/clipboard, -/obj/item/toy/figure/ce, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "xqM" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -93193,14 +93368,6 @@ }, /turf/open/floor/iron, /area/station/engineering/hallway) -"xqT" = ( -/obj/machinery/firealarm/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/machinery/light/small/red/directional/south, -/turf/open/floor/iron/dark/smooth_large, -/area/station/service/chapel/funeral) "xqW" = ( /obj/effect/turf_decal/bot, /obj/structure/closet/secure_closet/engineering_electrical, @@ -93271,6 +93438,16 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) +"xsj" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/structure/bed/medical/emergency, +/obj/machinery/iv_drip, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white/corner, +/area/station/security/medical) "xsl" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/purple{ @@ -93320,15 +93497,6 @@ }, /turf/open/floor/iron, /area/station/cargo/lobby) -"xsr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/reagent_dispensers/plumbed{ - name = "dormitory water reservoir" - }, -/obj/machinery/light/small/red/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/department/security) "xsG" = ( /obj/structure/lattice, /obj/structure/window/reinforced/spawner/directional/east, @@ -93439,6 +93607,14 @@ }, /turf/open/floor/iron, /area/station/service/theater) +"xto" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/range) "xtp" = ( /turf/closed/wall, /area/station/service/kitchen) @@ -93466,6 +93642,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/fore) +"xtS" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/item/mod/module/plasma_stabilizer, +/obj/item/mod/module/thermal_regulator, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/digital_clock/directional/south, +/obj/item/mod/module/signlang_radio, +/turf/open/floor/iron, +/area/station/medical/storage) "xtZ" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/delivery, @@ -93499,6 +93687,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/cargo/storage) +"xvf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/rnd/production/protolathe/department/engineering, +/obj/effect/turf_decal/bot, +/obj/machinery/camera/directional/north{ + c_tag = "Engineering - Shared Storage"; + name = "engineering camera" + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron/dark, +/area/station/engineering/storage_shared) "xvo" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -93524,18 +93724,6 @@ /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/iron, /area/station/maintenance/fore) -"xvC" = ( -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/mid_joiner{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating/dark, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "xvE" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -93554,13 +93742,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/processing) -"xvY" = ( -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/bot, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) "xwa" = ( /obj/machinery/light/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -93720,6 +93901,15 @@ }, /turf/open/floor/glass, /area/station/maintenance/space_hut/observatory) +"xxL" = ( +/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/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) "xxN" = ( /obj/structure/table/wood, /obj/machinery/computer/security/telescreen/entertainment/directional/north, @@ -93825,6 +94015,12 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"xyN" = ( +/obj/effect/turf_decal/trimline/neutral/warning, +/turf/open/floor/iron/dark/textured_half{ + dir = 1 + }, +/area/station/medical/morgue) "xyS" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, @@ -93848,19 +94044,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"xzn" = ( -/obj/structure/table/reinforced, -/obj/item/healthanalyzer, -/obj/item/stack/cable_coil{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/stack/cable_coil, -/obj/item/healthanalyzer, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "xzo" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -93912,6 +94095,16 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/wood, /area/station/service/theater) +"xzH" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/obj/structure/sign/poster/official/enlist/directional/south, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/holding_cell) "xzI" = ( /obj/machinery/camera/directional/north{ c_tag = "Library - Private Study"; @@ -93933,6 +94126,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/port) "xzO" = ( @@ -94008,6 +94202,14 @@ "xAo" = ( /turf/closed/wall, /area/station/security/detectives_office/private_investigators_office) +"xAr" = ( +/obj/structure/mannequin/skeleton, +/obj/machinery/status_display/ai/directional/north, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "xAt" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/junction{ dir = 8 @@ -94119,6 +94321,12 @@ dir = 4 }, /area/station/security/execution/transfer) +"xBJ" = ( +/obj/effect/landmark/start/coroner, +/obj/effect/turf_decal/tile/neutral/full, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/morgue) "xCa" = ( /obj/machinery/telecomms/broadcaster/preset_left, /turf/open/floor/circuit/telecomms/mainframe, @@ -94133,14 +94341,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"xCt" = ( -/obj/machinery/computer/telecomms/server{ - dir = 8 - }, -/obj/machinery/newscaster/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/tcommsat/computer) "xCC" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, @@ -94231,20 +94431,6 @@ }, /turf/open/floor/iron, /area/station/science/xenobiology) -"xDH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/north, -/obj/machinery/status_display/supply{ - pixel_y = 32 - }, -/obj/structure/reagent_dispensers/fueltank, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/item/weldingtool, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "xDU" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron/grimy, @@ -94373,17 +94559,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/cargo/storage) -"xFh" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/sign/directions/engineering{ - desc = "A sign that shows there are doors here. There are doors everywhere!"; - icon_state = "doors"; - name = "WARNING: EXTERNAL AIRLOCK"; - pixel_x = 32 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) "xFk" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod 3"; @@ -94400,16 +94575,6 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"xFo" = ( -/obj/item/radio/intercom/directional/north, -/obj/machinery/mech_bay_recharge_port, -/obj/effect/turf_decal/delivery, -/obj/machinery/camera/directional/north{ - c_tag = "Cargo Bay - Fore"; - name = "cargo camera" - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "xFw" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm/directional/west, @@ -94441,12 +94606,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/virology) -"xFO" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/musician/piano, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/service/theater/abandoned) "xFP" = ( /turf/open/floor/plating, /area/station/security/execution/transfer) @@ -94548,6 +94707,13 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/eva/abandoned) +"xGK" = ( +/obj/structure/table/wood, +/obj/item/clothing/glasses/regular/hipster, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/dim/directional/south, +/turf/open/floor/iron/dark, +/area/station/service/abandoned_gambling_den/gaming) "xGL" = ( /obj/effect/turf_decal/bot, /obj/machinery/shower/directional/north{ @@ -94643,6 +94809,15 @@ }, /turf/open/floor/iron/white, /area/station/science/lobby) +"xIa" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8 + }, +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/box, +/turf/open/floor/iron, +/area/station/science/xenobiology) "xIb" = ( /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/textured_large, @@ -94681,11 +94856,6 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) -"xIx" = ( -/obj/structure/sign/warning/test_chamber/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/circuits) "xIz" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ @@ -94714,18 +94884,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/fore) -"xIV" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Medbay - Starboard Hallway"; - name = "medbay camera"; - network = list("ss13","medbay") - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay) "xJa" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -94749,6 +94907,11 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"xJh" = ( +/obj/machinery/light_switch/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/station/command/meeting_room/council) "xJn" = ( /obj/structure/table/reinforced, /obj/item/airlock_painter/decal, @@ -94789,6 +94952,21 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/engineering/storage_shared) +"xJO" = ( +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Secure Morgue Trays"; + req_access = list("morgue_secure") + }, +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/warning, +/obj/effect/turf_decal/trimline/neutral/mid_joiner, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured_half, +/area/station/medical/morgue) "xJW" = ( /obj/effect/landmark/generic_maintenance_landmark, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -94805,14 +94983,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/commons/locker) -"xJZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/delivery, -/obj/structure/closet/radiation, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron, -/area/station/engineering/supermatter/room) "xKn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -94884,6 +95054,31 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"xLp" = ( +/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 = "Central Hallway - Fore Port"; + name = "hallway camera" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"xLx" = ( +/obj/machinery/status_display/evac/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/tank_holder, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) "xLy" = ( /obj/structure/disposalpipe/trunk{ dir = 4 @@ -95022,19 +95217,24 @@ /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) "xMZ" = ( +/obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) +/turf/open/floor/plating, +/area/station/cargo/sorting) "xNe" = ( /obj/structure/lattice, /obj/structure/grille/broken, /turf/open/space/basic, /area/space/nearstation) +"xNl" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/musician/piano, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/station/service/theater/abandoned) "xNu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /obj/structure/sink/kitchen/directional/south, @@ -95120,6 +95320,14 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/wood, /area/station/command/meeting_room/council) +"xOw" = ( +/obj/item/kirbyplants/random, +/obj/machinery/bluespace_vendor/directional/east, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "xOz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -95174,7 +95382,7 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, -/mob/living/simple_animal/sloth/citrus, +/mob/living/basic/sloth/citrus, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) @@ -95207,13 +95415,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/primary/central/fore) -"xPz" = ( -/obj/structure/closet/crate/bin, -/obj/effect/spawner/random/contraband/prison, -/obj/item/toy/figure/syndie, -/obj/machinery/light/directional/east, -/turf/open/floor/plating, -/area/station/security/prison) "xPK" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -95228,13 +95429,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) -"xQa" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/service/bar) +"xQm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible, +/obj/machinery/incident_display/delam/directional/south, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "xQq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -95281,6 +95480,13 @@ /obj/item/clothing/under/dress/redeveninggown, /turf/open/floor/wood, /area/station/commons/dorms) +"xRa" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "xRo" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -95326,15 +95532,6 @@ /obj/structure/sign/poster/random/directional/north, /turf/open/floor/wood, /area/station/hallway/secondary/service) -"xSq" = ( -/obj/effect/landmark/start/hangover, -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/delivery, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "xSx" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -95399,6 +95596,13 @@ dir = 1 }, /area/station/maintenance/department/electrical) +"xTk" = ( +/obj/structure/closet/secure_closet/security/sec, +/obj/structure/sign/poster/official/do_not_question/directional/south, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/lockers) "xTm" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/tile/blue{ @@ -95423,6 +95627,14 @@ }, /turf/open/floor/iron/dark, /area/station/science/xenobiology) +"xTB" = ( +/obj/structure/bed, +/obj/item/bedsheet/rd, +/obj/machinery/status_display/ai/directional/north, +/obj/effect/turf_decal/siding/purple, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron, +/area/station/command/heads_quarters/rd) "xTC" = ( /obj/structure/table/reinforced, /obj/machinery/cell_charger, @@ -95449,16 +95661,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/paramedic) -"xTT" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/gloves/color/yellow, -/obj/item/storage/toolbox/electrical, -/obj/item/multitool, -/obj/machinery/light/directional/west, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "xTV" = ( /obj/structure/disposalpipe/sorting/mail{ dir = 8; @@ -95477,6 +95679,15 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/grimy, /area/station/service/lawoffice) +"xUd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/chair/stool/directional/south, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron/grimy, +/area/station/maintenance/port/fore) "xUi" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -95498,27 +95709,12 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/station/engineering/supermatter/room) -"xUn" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) "xUq" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"xUt" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/chair{ - dir = 4 - }, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "xUv" = ( /obj/machinery/firealarm/directional/west, /obj/structure/cable, @@ -95539,6 +95735,17 @@ }, /turf/open/floor/carpet/purple, /area/station/commons/dorms) +"xUW" = ( +/obj/effect/turf_decal/bot, +/obj/structure/rack, +/obj/item/controller, +/obj/item/controller, +/obj/item/compact_remote, +/obj/item/compact_remote, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/science/circuits) "xVa" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral{ @@ -95575,6 +95782,7 @@ /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/miningoffice) "xVI" = ( @@ -95607,12 +95815,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"xWd" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/iron/grimy, -/area/station/service/abandoned_gambling_den) "xWf" = ( /turf/closed/wall, /area/station/science/research) @@ -95667,24 +95869,20 @@ }, /turf/open/floor/iron, /area/station/maintenance/fore) -"xWI" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, -/obj/structure/closet/secure_closet/armory2, -/obj/item/storage/box/rubbershot, -/obj/item/storage/box/rubbershot, -/obj/item/storage/box/rubbershot, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "xWJ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output{ dir = 4 }, /turf/open/floor/engine/n2o, /area/station/engineering/atmos) +"xWK" = ( +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 8 + }, +/obj/structure/sign/departments/rndserver/directional/south, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white, +/area/station/science/research) "xWP" = ( /obj/structure/table/reinforced, /obj/item/stack/rods{ @@ -95703,13 +95901,13 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/crew_quarters/bar) -"xXc" = ( -/obj/structure/table/reinforced, -/obj/item/assembly/timer, -/obj/item/assembly/timer, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/commons/storage/primary) +"xWR" = ( +/obj/machinery/computer/records/security{ + dir = 8 + }, +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/carpet, +/area/station/security/detectives_office) "xXd" = ( /obj/machinery/hydroponics/constructable, /obj/structure/sign/poster/random/directional/south, @@ -95725,24 +95923,6 @@ /obj/item/folder/red, /turf/open/floor/carpet, /area/station/service/library/abandoned) -"xXm" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Central Hallway - Fore"; - name = "hallway camera" - }, -/obj/effect/turf_decal/plaque{ - icon_state = "L12" - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) -"xXt" = ( -/obj/structure/closet/emcloset, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/port) "xXw" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -95775,6 +95955,14 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/science/research) +"xXU" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/wood, +/area/station/service/lawoffice) "xYl" = ( /obj/structure/lattice, /obj/item/toy/figure/ninja, @@ -95840,30 +96028,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) -"xYR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/light/directional/north, -/obj/machinery/status_display/ai/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/science/robotics/mechbay) -"xYS" = ( -/obj/machinery/modular_computer/console/preset/id{ - dir = 8 - }, -/obj/machinery/computer/security/telescreen/entertainment/directional/east, -/obj/machinery/light/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Customs - Departures Customs" - }, -/obj/effect/turf_decal/bot/right, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/customs/aft) "xYW" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/maintenance_hatch{ @@ -95887,6 +96051,12 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/maintenance/department/chapel) +"xYY" = ( +/obj/structure/table/wood, +/obj/item/taperecorder, +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/carpet/blue, +/area/station/commons/vacant_room/office) "xYZ" = ( /obj/machinery/exodrone_launcher, /obj/effect/turf_decal/box, @@ -95942,6 +96112,20 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/maintenance/starboard/aft) +"yas" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Fore Hallway - Hydroponics"; + name = "hallway camera" + }, +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, +/turf/open/floor/iron/dark/corner{ + dir = 8 + }, +/area/station/hallway/primary/fore) "yat" = ( /obj/machinery/status_display/evac/directional/east, /obj/effect/turf_decal/tile/neutral, @@ -95969,15 +96153,6 @@ "yaI" = ( /turf/closed/wall, /area/station/commons/dorms) -"yaP" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "yaW" = ( /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai_upload) @@ -95986,26 +96161,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"ybb" = ( -/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 - }, -/obj/machinery/light/directional/north, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Engineering - Foyer"; - name = "engineering camera" - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/lobby) "ybk" = ( /obj/machinery/door/poddoor/preopen{ id = "brigprison"; @@ -96093,16 +96248,6 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) -"yco" = ( -/obj/machinery/vending/wardrobe/viro_wardrobe, -/obj/structure/sign/poster/official/cleanliness/directional/west, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/siding/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/medical/virology) "ycx" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/table/reinforced, @@ -96124,12 +96269,6 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"ycA" = ( -/obj/structure/table/wood, -/obj/effect/decal/cleanable/dirt, -/obj/item/pai_card, -/turf/open/floor/carpet, -/area/station/service/library/abandoned) "ycR" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -96217,10 +96356,6 @@ dir = 4 }, /area/station/hallway/secondary/exit/departure_lounge) -"ydR" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/station/science/research/abandoned) "ydW" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/eva/abandoned) @@ -96234,34 +96369,11 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/fore) -"yem" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/port/fore) -"yeo" = ( -/obj/structure/table, -/obj/effect/spawner/random/entertainment/drugs{ - pixel_y = 4 - }, -/obj/effect/spawner/random/entertainment/drugs{ - pixel_y = 1 - }, -/obj/machinery/reagentgrinder{ - pixel_y = 4 - }, -/turf/open/floor/iron/grimy, -/area/station/maintenance/port/fore) "yex" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 4 }, -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) "yeD" = ( @@ -96355,6 +96467,10 @@ }, /turf/closed/wall/r_wall, /area/station/engineering/atmos) +"yfY" = ( +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron, +/area/station/engineering/atmos/hfr_room) "yga" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -96375,14 +96491,16 @@ /obj/effect/turf_decal/tile/yellow/half/contrasted, /turf/open/floor/iron, /area/station/commons/storage/primary) -"ygD" = ( -/obj/structure/table, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/clipboard, -/obj/item/hand_labeler, -/turf/open/floor/iron/checker, -/area/station/hallway/secondary/service) +"ygC" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/obj/structure/sign/warning/secure_area/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Atmospherics - Aft Tanks"; + name = "atmospherics camera" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "ygJ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/maintenance_hatch{ @@ -96445,6 +96563,14 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, /area/station/service/hydroponics) +"ygX" = ( +/obj/structure/window/reinforced/spawner/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/neutral/fourcorners, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) "ygY" = ( /obj/structure/sign/directions/engineering{ desc = "A sign that shows there are doors here. There are doors everywhere!"; @@ -96485,6 +96611,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/medical/break_room) +"yhv" = ( +/obj/machinery/mass_driver/trash{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "yhw" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, @@ -96568,16 +96704,6 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) -"yiB" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8 - }, -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/box, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/science/xenobiology) "yiC" = ( /obj/structure/table/wood, /obj/machinery/microwave{ @@ -96588,21 +96714,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/tcommsat/computer) -"yiD" = ( -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 5 - }, -/obj/effect/turf_decal/trimline/neutral/mid_joiner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/duct, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/medical/morgue) "yiE" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -96610,6 +96721,11 @@ }, /turf/open/floor/iron/white, /area/station/science/lab) +"yiK" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "yiT" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -96704,6 +96820,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) +"ykm" = ( +/obj/structure/table/wood, +/obj/item/clipboard, +/obj/item/electronics/apc, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/station/service/electronic_marketing_den) "yko" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/west, @@ -96714,13 +96837,23 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/dark/smooth_half, /area/station/engineering/gravity_generator) -"ykw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/wood/corner, -/obj/machinery/light/directional/south, +"ykA" = ( +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron/dark/textured_half{ + dir = 1 + }, +/area/station/medical/morgue) +"ykB" = ( +/obj/machinery/modular_computer/preset/id{ + dir = 1 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) +/area/station/command/heads_quarters/hop) "ykE" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -96750,17 +96883,6 @@ /obj/item/electronics/airlock, /turf/open/floor/wood, /area/station/service/electronic_marketing_den) -"yle" = ( -/obj/machinery/power/apc/auto_name/directional/west, -/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/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/paramedic) "ylf" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 @@ -96782,15 +96904,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/chapel) -"ylM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/item/radio/intercom/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) "ylT" = ( /obj/machinery/newscaster/directional/west, /obj/effect/decal/cleanable/dirt, @@ -96822,11 +96935,6 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron, /area/station/commons/toilet/restrooms) -"ymi" = ( -/obj/machinery/light/directional/south, -/obj/item/kirbyplants/random, -/turf/open/floor/wood, -/area/station/command/meeting_room/council) (1,1,1) = {" aaa @@ -102350,9 +102458,9 @@ ePZ qpQ smV ryt -sGO -dtc -iiu +urA +oNB +hfl flt smV yko @@ -103377,11 +103485,11 @@ btH btH btH bPC -bRA +rgH bTq jYp vgi -cab +vdB bPC idU hVt @@ -103881,14 +103989,14 @@ aaa btH btH btH -tTe +vxN cKE btH bEf btH rhH ueB -lbz +uhL btH bPC bRC @@ -104394,7 +104502,7 @@ pzp aaa btH btH -sGd +bmp bCu hGF bCu @@ -104403,7 +104511,7 @@ abJ abJ tKq abJ -jXk +kXJ bPC dLq ikT @@ -104656,7 +104764,7 @@ aBN yga lMy upB -tfp +lMy lMy lMy abJ @@ -104668,13 +104776,13 @@ tfl bYe qwY bPC -gwu +vWU hmU sdK xpt sdK qdV -pnu +qGs cdt idU kXC @@ -105160,11 +105268,11 @@ qYo clr kXC cEq -wcZ -mxS +alK +qPm btH btH -kAo +pKa kXJ bEl xMy @@ -105184,14 +105292,14 @@ wLX lUB kjZ kjZ -hVm -qiX +xxL +icA bpT kmX uoO sGj bNv -msG +ygX fRa hfl gvf @@ -105426,7 +105534,7 @@ ixt abJ yga btH -uWu +scX btH btH jnr @@ -105684,7 +105792,7 @@ kub yga deX deX -fHp +deX deX deX hkC @@ -105696,13 +105804,13 @@ tfl bYf aHr bPC -gwu +vWU hmU sdK tDB hmU tEd -aBi +cJh cdt idU kXC @@ -105936,7 +106044,7 @@ pzp aaa btH btH -sGd +bmp hkC vJL hkC @@ -105945,7 +106053,7 @@ hkC hkC kub hkC -jXk +kXJ bPC dKK asa @@ -106458,7 +106566,7 @@ bEm btH kxx lyf -jIs +lMA btH bPC uNh @@ -106975,11 +107083,11 @@ btH btH btH bPC -bRL +gcs kkh bAN kkh -wQD +fXG bPC idU fMb @@ -107493,7 +107601,7 @@ uNh asa uQY asa -wCP +olD bPC pYJ ePZ @@ -108004,9 +108112,9 @@ ePZ nCB cVr fsr -uJT +jZc fkB -ife +fRA fJy cVr dXD @@ -108262,7 +108370,7 @@ nBm dNT chU pxs -fkB +wJq eAf chU chU @@ -109290,7 +109398,7 @@ vVc aaa idU mJh -fkB +wJq hfl pQx aaa @@ -109546,9 +109654,9 @@ aad vVc aad bRP -pRw +eOb qdF -qPn +gnO aJD aad aad @@ -115235,7 +115343,7 @@ nCi nCi sfN sfN -dCf +eqP sfN sfN nCi @@ -115709,11 +115817,11 @@ wGy aQv wGy wGy -vnu +rlH cnH hqV vmt -kDq +phy iyc kNA cmq @@ -115746,13 +115854,13 @@ rXu nCi eVp nCi -kFc +sfN ozA pJz xcR sfE gCt -hKC +sfN nCi mFq nCi @@ -115972,7 +116080,7 @@ cak dgk eqg uYy -uck +jCY qzK vmt nUT @@ -116243,7 +116351,7 @@ oke mZr lin ciB -fSE +gbF iga cGh tBX @@ -116252,9 +116360,9 @@ lin hXo mvk nCi -iPM +ttD wjt -jjt +pgG wzW vQq eIy @@ -116480,8 +116588,8 @@ lvE qqO eWr vmt -lir -jFz +fXx +xLx vwl dgk bzd @@ -116507,13 +116615,13 @@ cbs ike cbs wry -kim +hIh akM jyt aMM wlI jFe -edc +tSh pyZ vBO uhb @@ -116752,14 +116860,14 @@ imQ gpy rVD gAw -llz +gAw meL ehD -nEO +bHg haw tqa gnw -lFQ +pbn mWF jcg jcg @@ -116774,16 +116882,16 @@ nCi aFU nCi uhb -yiB +xIa cQT gxT kPD rxX oWn -sHW +afN uhb jPZ -oia +tmr nCi mwA hHF @@ -116991,10 +117099,10 @@ qYo xUy xqR qzc -oLF +kUx kTV chv -eir +dQl oIE fFu whA @@ -117003,7 +117111,7 @@ tPS aCy aCy gAw -cRv +gpy feO rOU mHg @@ -117021,7 +117129,7 @@ glb dRK wcP yeO -nbZ +xQm nCi kmS fCk @@ -117207,7 +117315,7 @@ edx hfb edx sJF -asm +gSB pGt pEP qYo @@ -117246,7 +117354,7 @@ fZO pxN vVc wGy -lfK +iwn qzc vgZ nUp @@ -117279,7 +117387,7 @@ vrs qJI iQV nbZ -akM +nCi cOx uGn axu @@ -117303,10 +117411,10 @@ liB smj hgi mAt -cza -xWd +eDZ +rwk gtx -wXy +hvD jtC nCI aad @@ -117533,28 +117641,28 @@ cUW sHT sHT sHT -mHc +wuA yeO iKl nCi jLo -rnh +tWS aKk nCi fsC nOv uhb -wSK -gao +lpC +aqF rqy jKx rTW tuk -oNd -gAV +pen +hvl uhb hSi -wXZ +uKj mAt mAt cRJ @@ -117792,7 +117900,7 @@ kMt chY vUV sst -wmu +rgw nCi nCi nCi @@ -117823,9 +117931,9 @@ cME hSE pNA wcd -axH +jxZ hHX -nQa +bQz fYR aad efQ @@ -117974,7 +118082,7 @@ qYo hNg rIP edx -qvw +vDw dtS snK snK @@ -118019,7 +118127,7 @@ qYo xUy xqR vTc -iky +oMh kTV oow qzT @@ -118027,7 +118135,7 @@ nAF fFu urq urq -ouZ +rFB vEq aCy gAw @@ -118049,7 +118157,7 @@ fNc jcL vUV ugr -nbZ +xil tLC epC qZb @@ -118317,11 +118425,11 @@ rTW shO rTW bIh -nYS +csO rhi tLp pWL -mZd +jjm rUl rTW lvX @@ -118339,7 +118447,7 @@ jtC pNA rGU xJW -rhV +fGt fYR aaa aad @@ -118545,7 +118653,7 @@ aaa qYo aaa gAw -vFi +lLU ntd jMM sAm @@ -118553,7 +118661,7 @@ mHg hQK pqr qJs -tcy +ehD sHT sHT ePU @@ -118561,7 +118669,7 @@ sHT sHT sHT sHT -jzC +qqQ sLe nzs tLC @@ -118584,7 +118692,7 @@ xsN sfN csY mAt -aAx +uOz nxt ydE fsp @@ -118753,15 +118861,15 @@ fTC bFs gAL tRh -cIO +gQH rMi eoY lZs -kxW +mYr rMi hmY lZs -idF +gQH oOh gvk rMi @@ -118771,7 +118879,7 @@ mmN udG jxJ hka -srA +ygC uaY jxJ slG @@ -118812,11 +118920,11 @@ eHy qJs cxp sHT -tou +rVM tsa bPI sHT -enR +agQ enR uxl sst @@ -118831,11 +118939,11 @@ siI utw rqi fNY -uhE +cAb eaO hFS acD -hES +svc pla uFO utw @@ -119045,28 +119153,28 @@ wlS vQj ntU cJX -fxM +fhr kTd wwr rSZ bAR -dxl +thZ viB -kCq -dxu -nKN +pOz +hEL +gyR pcS vyn eMN gAw uTe -iRu +nPO xbw lkN cwp ubM gAw -eNt +lJW ehD sHT sHT @@ -119088,11 +119196,11 @@ rTW shO rTW gbj -nYS +csO uDQ dxU kSA -mZd +jjm ygV rTW shO @@ -119266,7 +119374,7 @@ qUE mTe nXw wSR -aqc +agx lJc sLV iVz @@ -119300,12 +119408,12 @@ tsB sch cKK vQj -mzO +fmo agA hHJ tgl uLv -fiB +sSl bAR saR pFB @@ -119323,13 +119431,13 @@ jZV jZV gAw gAw -ljO +qJs okr -bWa +rVH nrP bKp exA -vYv +nzP qJI qJI nCl @@ -119355,7 +119463,7 @@ xsN sfN pRz mAt -jEg +ldv qYr dqD hUD @@ -119557,14 +119665,14 @@ lKe nZW qAz vQj -mnh +byx agA uzb jLx dFw -lMf +mPr bAR -cEO +swg gsV auh tMl @@ -119574,7 +119682,7 @@ aHE niL gAw qje -nKS +fbA bmf oLd oLd @@ -119598,21 +119706,21 @@ pTC wle iQF pTC -siI +uFO utw rqi kBO -fLA +ueC eaO dxU acD -mOq +iVH cGA uFO utw -uiA +rqi mAt -ilU +tRu qYr wcd hUD @@ -119816,12 +119924,12 @@ lpv vQj pXB gsf -miE +nFN tgl dFw -oez +tBm bAR -xqG +aBw gsV vEZ fzY @@ -119830,7 +119938,7 @@ tEw aHE iov gAw -ikh +unL cel oLd ulE @@ -119859,11 +119967,11 @@ rTW shO rTW bgH -nYS +csO uDQ dxU kSA -mZd +jjm nkj rTW lvX @@ -120030,7 +120138,7 @@ qYo aaa pEP hZq -rnM +szf udr ojb pwr @@ -120074,9 +120182,9 @@ vQj uCa uCa leE -wyJ +ljB kyW -jzU +mtf bAR ovH xya @@ -120112,7 +120220,7 @@ pTC rZw qcM pTC -kWi +svj sfN duq mWy @@ -120124,9 +120232,9 @@ buY nNT xsN sfN -nfT +rnS mAt -kzt +mSP xQq bfz bsY @@ -120338,26 +120446,26 @@ bAR gHt bAV tgq -hyj +tgq tgq coj hbB edS gAw qoC -nqV +dNr aoO kGe kGe -gtj +kWT gAw -tYY -mTo +xfj +aRq pjN ckC pjN xUl -xJZ +oyu uJN rLc mTo @@ -120369,19 +120477,19 @@ pTC rZw rrU pTC -siI +uFO utw rqi ghQ -bVY +fUF eaO qrU acD -udY +tnN nNR uFO utw -uiA +rqi mAt cZl mPF @@ -120395,7 +120503,7 @@ pNA tmc fza lgW -pPZ +dJY fYR aad aaa @@ -120551,16 +120659,16 @@ mWP dYj biO fcW -mtn +uGJ uGJ uGJ jti jti uGJ -uGJ +vvO uGJ cUF -uAA +rrq sID sID ivg @@ -120583,10 +120691,10 @@ lql tdi web fXF -eYr +suH ikV gIk -ooa +fVA leE bfq iFn @@ -120630,11 +120738,11 @@ rTW lvX rTW iWX -nYS +csO bXL xzo urx -mZd +jjm ycY rTW shO @@ -120815,7 +120923,7 @@ rGb rGb rGb ilq -ylM +wNE cUF rWq pUW @@ -120824,11 +120932,11 @@ ksP aBp icY vHh -szF +npQ gKW -vXF +uVs gKW -thn +mft ilH nQg kMh @@ -120840,7 +120948,7 @@ tsu suZ ccK nmi -jGG +xvf oQJ xJJ pbV @@ -120848,7 +120956,7 @@ uCa aTz ygM fzF -ocr +dSZ sys rCE uWj @@ -120863,17 +120971,17 @@ azi aEP rPc rHQ -jjo +caI whu rRD -mmU +tDd jBE fSG jBE bIa rRD xqW -azi +lbR lbR pFq dqX @@ -120883,7 +120991,7 @@ pTC rZw oUy pTC -pmw +fwt uyy duq gED @@ -120895,19 +121003,19 @@ buY kYq xsN uyy -pRz +uLh mAt iIn srI uDR -egi +ryQ imS jEb wHW -ryQ +egi lbU iFD -hzh +nZA geY skr fYR @@ -121063,7 +121171,7 @@ ecH rVx xHw dYj -vSE +kba rGb yhw fWN @@ -121074,7 +121182,7 @@ fWN nFv jti cUF -lSA +dgo sID sID urM @@ -121124,9 +121232,9 @@ mRv ovN aXk gIt -lmn +aIL qzA -lAE +uBq lzq mcV sxR @@ -121324,7 +121432,7 @@ lbo rGb fWN bCn -rQw +bhN hWW bwG yhw @@ -121338,9 +121446,9 @@ xxZ cwY hKZ pbU -fFw +evH iEe -uZL +pgP uZL eYy cwY @@ -121384,7 +121492,7 @@ hUt lcf euT wCp -uxz +soO rRD qWY fbn @@ -121392,7 +121500,7 @@ sNN lav qYy rIN -sAQ +enU pTC rZw iQF @@ -121416,7 +121524,7 @@ cdb wZX nEc olg -ydR +tXI dxA jvX sLN @@ -121571,7 +121679,7 @@ dYj dYj nwn ugF -kjO +gqe wcG bpg nDM @@ -121655,7 +121763,7 @@ uKY xzL mYM pTC -gUB +eSu qLu gSe fKv @@ -121665,16 +121773,16 @@ cgJ fWq nqD xCN -sZi +wEC jDd -kPA +tpS nmX ndH -gcF +vSX nEc -sWw +tFP oMV -nVQ +sSx cHU eKz qel @@ -121825,7 +121933,7 @@ qYo qYo dYj dYj -mcX +gPy tZj cqA cqA @@ -121834,10 +121942,10 @@ oKM ewi qNo dYj -tTf +hxk umm fWN -mYo +rKE cUF raz cFe @@ -121879,14 +121987,14 @@ oGb qYo oGb lGF -rlp +sva iBR iBR wxd iBR iBR tqo -eYu +lyL bfX cui maI @@ -121899,14 +122007,14 @@ cRW pgr oSh xJn -hIK +dYz vtQ glW rvG aIV qYy rQq -gqv +pUH pTC rZw qcM @@ -121937,7 +122045,7 @@ qjy qjy qjy lTZ -gkT +ojz nEc qYo qYo @@ -122094,10 +122202,10 @@ epV cIn rGb fWN -emr +dMh cUF cUF -vbp +tve fWN umm uGJ @@ -122139,11 +122247,11 @@ lGF qOL iNJ elK -jyz +nOx xbD kgP -lDV -bVI +tqo +qyy vvH oks fSG @@ -122170,7 +122278,7 @@ qcM pTC pTC ycx -jyb +qip wDq sEc xNv @@ -122187,14 +122295,14 @@ hXf nRv nEc fWY -vPn +lHJ pjS hXO kGc nzb rPC lTZ -bmm +ebX nEc qYo aaa @@ -122354,7 +122462,7 @@ yhw hQu xGL cUF -ksH +ryd yhw rGb uGJ @@ -122366,13 +122474,13 @@ udl cwY fFL rcw -cBr -oSz +lOA +mhx fFr wEX oiO cwY -aYA +iWj jSI len ded @@ -122629,7 +122737,7 @@ wIf blJ wIf cwY -gSt +pDE nxf dNU rMq @@ -122670,7 +122778,7 @@ jvF bfX iUr etS -msJ +uiG gor goV jPP @@ -122682,12 +122790,12 @@ pTC aWk mqP pTC -jlY +esb bpz lZG gmI ahY -sTE +mna jDd eJG loj @@ -122702,7 +122810,7 @@ wEI qNb naL nEc -dLZ +oSo kGQ bGz nzb @@ -122867,11 +122975,11 @@ rGb yhw rTH aZF -nDd +opG uzJ yhw umm -dOW +hhR cUF boR boR @@ -122901,7 +123009,7 @@ xLZ xLZ rOa xLZ -ybb +iVV cZY wbn eSk @@ -122912,7 +123020,7 @@ vvp lDV tUg gmP -fQx +qeP ceV nFr bfX @@ -122944,7 +123052,7 @@ gkU fVa xEe sZC -vgO +tSq jDd dYx dlo @@ -122957,7 +123065,7 @@ gFP ehJ wEI fxj -pnr +dip nEc kfj xxX @@ -123109,7 +123217,7 @@ aaa qYo aaa dYj -rJa +sjD hGt beo uAK @@ -123154,7 +123262,7 @@ jEm vnq ftU dCX -snU +wdZ guI bYK xLZ @@ -123171,7 +123279,7 @@ slp slp slp bJI -vKY +pum mgk cui kpD @@ -123222,7 +123330,7 @@ tWl bSN tXI pov -aOd +wEQ nEc qYo efQ @@ -123367,14 +123475,14 @@ qYo qYo dYj dYj -pga +yfY xmv isc isc ppU nbv plK -nJl +tzj dYj cIn vev @@ -123396,7 +123504,7 @@ rZU rZU gHS boR -oaS +iJk uYC wuj gEF @@ -123432,15 +123540,15 @@ cec eOe bTN kpD -iGB +geR odD -jpL +rgG rRD -adb +saS odL etS hGd -iMU +muA fii xSC wmO @@ -123453,7 +123561,7 @@ pTC sNd iQF qcM -qXx +ezx kQr jDd jDd @@ -123628,7 +123736,7 @@ dYj eba czB aul -psR +gIx nUc jaX dYj @@ -123672,7 +123780,7 @@ iGZ pJf lmP xLZ -tAP +ngR bUQ oLV iPe @@ -123699,26 +123807,26 @@ bxc qat gNP fii -pNJ +qLO hDT elP byX qBo veD -jau +inl pTC jto qcM qev qev -qcM +tGJ wEI cxb iaG -lsN +sbl wEI eTP -qMJ +jUx eHt jUx cdb @@ -123731,7 +123839,7 @@ lte naL naL nEc -vGM +rmP dfv vto vfc @@ -123889,7 +123997,7 @@ dYj dYj dYj dYj -oBn +tFd vSE rGb rGb @@ -123907,7 +124015,7 @@ nCd nhA aGW emW -tZo +bCX cMI boR hbS @@ -123940,7 +124048,7 @@ usD slp uAI lWx -sbR +fti wGA aJu uxG @@ -123950,11 +124058,11 @@ pTC jfZ csR pTC -dsq +kHN sCd wLK pEb -oAT +eIZ fii stD wmO @@ -123988,11 +124096,11 @@ wEI pEE qfI nEc -pcp -nDz +dxA +wJS tGL -ftb -dJS +wEE +enw nEc aaa aad @@ -124148,8 +124256,8 @@ ewY xxp mDa wZv -kHd -jUz +txJ +jQl kND qyj cUF @@ -124180,14 +124288,14 @@ xLZ xLZ mYk lwa -vAz +wWJ uMu qCk szs ewQ xLZ rMR -fBP +iPH mVZ iPe nSJ @@ -124202,7 +124310,7 @@ slp aJu iSi mQF -qsv +bKo pTC lsf kwL @@ -124213,7 +124321,7 @@ nnZ swD baw fii -njC +iqz kgi hps hkJ @@ -124225,14 +124333,14 @@ sNd vbb rod wFE -rrU +cQj wEI bfc fZG -nEY +uLS wEI -lyU -aES +hbg +hcM apC nmk ahW @@ -124410,11 +124518,11 @@ djf bGC djf hwM -sSn +oXU vjF hNp iaJ -rwS +vUt nmw lHZ dge @@ -124459,14 +124567,14 @@ wGA pky tCS gCn -oVo +fVd pTC goD sjH pTC xDV xgE -kyE +spe wxf baw pTC @@ -124481,7 +124589,7 @@ pTC xiJ qcM nBL -xXt +iTW wTK wEI wEI @@ -124668,14 +124776,14 @@ lCM qlr hwM pqw -wrX -dlL +gqG +dYE sOi wzD nmw rUp iwC -ufO +jHu jxB oYs sdq @@ -124937,7 +125045,7 @@ oYs oYs cLz ycz -aYT +cLz gjh nKD yei @@ -124946,7 +125054,7 @@ yei yei lHZ nwY -qhS +wOR lpw oYs azy @@ -124967,9 +125075,9 @@ hza hza emB hza -ejp hza -quQ +hza +jXK vcB lmJ qVA @@ -125006,17 +125114,17 @@ sfW tNi xlK bYV -bzI +reK jDd aaa lIv oVp lNg -nzn +gFM pMA lNg iLq -wGX +rjT gcP khq aHI @@ -125179,7 +125287,7 @@ gbD hWF uMH cdg -tMK +lPf sDk qgU qgU @@ -125257,7 +125365,7 @@ mHS vcB pxO lYj -fnZ +xWK mpC rAN yam @@ -125427,7 +125535,7 @@ keO evq bYN evq -gga +jQu oYs lvF oYs @@ -125451,35 +125559,35 @@ qYo azA qsn oYs -nJV +qUP wNn gwL kJr -dps +rfa oYs tFp hLq -sIP +bwi oYs fAL oYs -vdM +lXO vGc ckR nYV jLz -vGG -lNR +wIz +fHK laP -tZw +xfq kEg gxL -sTK +nAb nAb vxZ +fix nAb -hdS -svI +rmc oEV sOM tFa @@ -125504,7 +125612,7 @@ aEJ qcM rMS dMV -qhC +wEv vcB sNd iQF @@ -125512,9 +125620,9 @@ vcB ttN ect vcB -vdd +jkd bbH -cjx +scR sIX sIX aMc @@ -125529,7 +125637,7 @@ jfT oEy baf hvu -awH +gsh rmk jDd ooQ @@ -125548,7 +125656,7 @@ uZj qQM qym vLq -wBX +flr bAz dJM qGz @@ -125687,10 +125795,10 @@ kzI iFV oYs jYg -enX +aJw oYs aQx -yeo +fFb uFX oYs oje @@ -125701,22 +125809,22 @@ nbP rGh hSu oYs -hbn +tsK azA aaa aaa azA -uTq +amY oYs gPj rTM guq kJr -gwL +qkg oYs dqC fUQ -fKk +aUu oYs oYs oYs @@ -125761,7 +125869,7 @@ uFs tUR iZf uPI -bUy +ibL vcB jto mJn @@ -125787,7 +125895,7 @@ pAA hrV eZw qKI -eWF +reM jDd iBf bJE @@ -125941,7 +126049,7 @@ rjL pTD kFX vjN -gwE +avN oYs bxg hcL @@ -125965,16 +126073,16 @@ qYo azA qjO oYs -qbs +sgd pke lPa lPa -kGP +vuE oYs -kBJ +hBq ijJ jzt -uvy +xUd luG oYs jzE @@ -125985,13 +126093,13 @@ aaa aad aJU keE -xzn +tbf sdB kSn -lwI -nEg +urC +aZo jPJ -xTT +aEQ oUk dGS slx @@ -126026,17 +126134,17 @@ vcB ccY kVT vcB -tiM +xao tDE dyx sIX -iUG +xTB umC wrz iZp -dEk +tvO sIX -hjf +gum eEc vyt rPN @@ -126070,7 +126178,7 @@ vyC daz bAz vLq -ncw +anz qQM uYH frM @@ -126208,7 +126316,7 @@ hEr lHY oYs lpk -igd +cpG tpr oYs prn @@ -126222,17 +126330,17 @@ aaa oYs gBm oYs -lwE +cDW kaL gxF wDf -wpS +svf oYs -ipC +dnC cKp sSw ugu -kvJ +dvn oYs vnD oYs @@ -126258,7 +126366,7 @@ vcB jtp aqa iPb -kCi +pKf vcB lbX pgV @@ -126287,7 +126395,7 @@ nil dTA yeL sIX -hlQ +uUS sQJ vJj ddn @@ -126300,7 +126408,7 @@ gmE omw rsa ouT -oLD +ohb mdk jDd ila @@ -126313,7 +126421,7 @@ xoR mdm vHx ntK -xeN +wFi kzc tTg rVc @@ -126455,20 +126563,20 @@ gtS sCE uPS wAz -kBV +chg oYs wIu uVe fam bxp -wgU +dlz jWG oYs gSR jHi sAU iKr -yem +hcN jLN cOb oYs @@ -126569,7 +126677,7 @@ onq vQu dSo jCf -uUV +qFJ bzG kzc tOM @@ -126726,7 +126834,7 @@ inS rlL oYs oYs -jtv +clK fsY oYs bmP @@ -126767,12 +126875,12 @@ rOR fdL iCO axQ -ilo +cdS vcB yjV gfX rSG -qcM +dHS vcB jPf ant @@ -126793,26 +126901,26 @@ wFE qcM uDk pTC -xeg +nzM cPa -aNE +juM oyZ ffb dBJ hwS sIX -hkZ +osO voZ iao nLM -vHF +lJN hnM urt -bmY +awA cmd jqt qub -vka +uFt elq pDi bWH @@ -126841,7 +126949,7 @@ ovP xeR woc edw -ick +pLQ qQM dnV ijm @@ -126964,8 +127072,8 @@ aaa aaa aaa aaa -tDs -izG +fIE +kwg dEe oLz dEe @@ -127024,19 +127132,19 @@ eIo dGS iCO uED -nXK +gdq vcB jtp gXn vRy -kCi +pKf vcB lbX pps xtB vHu -hQQ -izE +beD +oyj pTC nYz pTC @@ -127063,9 +127171,9 @@ uzo tud dGp czL -epF +crS urt -nuS +xUW qcE jqt bUX @@ -127082,7 +127190,7 @@ nGq wEI mxY aZz -kui +lUF wEI oGr uYH @@ -127098,7 +127206,7 @@ vLq xHr hww wiA -qhB +scU qQM tTg frM @@ -127222,16 +127330,16 @@ aaa aaa aaa fIE -pJg +ykm nie -sKW +oRD elp -qKm +kWm oYs rcP oYs oYs -bgl +wfR mpH mrw mrw @@ -127239,7 +127347,7 @@ ogZ hwo dwN rID -rdr +nlc oYs oYs oUm @@ -127296,8 +127404,8 @@ pTC pTC pTC unj -hyg -eCO +fKQ +kyI xGw iCI pTC @@ -127329,7 +127437,7 @@ jKO pTr qcE sGQ -xIx +pkk jDd jSj viI @@ -127365,7 +127473,7 @@ jeo xwL irX lFs -sUm +bES ydW qYo qYo @@ -127490,11 +127598,11 @@ oYs sHL glv hKE -mqz +hzi xMK mae kQR -whX +iPc tZN rID xXd @@ -127527,13 +127635,13 @@ aaa aad aJU akf -oHa +tlp nLY uyf -nYa -ogA +klO +dbC iNR -nBf +bCj tjp dGS rRr @@ -127550,7 +127658,7 @@ jni pTC pTC pTC -rrV +nnR cjw mvM mvM @@ -127576,14 +127684,14 @@ vgu tYP hBT ipr -apJ +sHv eIh urt mjW lPM rni sob -cPw +kjt fJF kiz ngX @@ -127596,14 +127704,14 @@ jUx wEI wXH bvd -tbs +wJJ wEI dnV -tTg +aHw gFO qQM isR -ycA +ceE qQe cRl fEx @@ -127821,15 +127929,15 @@ vcB xXz pZc pTC -xeg +nzM uMs -imp +jmx eGw ffb dBJ hwS sIX -uzO +wyK eqh vPv sIX @@ -127859,8 +127967,8 @@ xjL tXS pkA qQM -svk -dXB +lwo +qFp xXj xkO wog @@ -127879,7 +127987,7 @@ lrn jeo xGF qDI -vgF +cRP ydW qYo efQ @@ -128016,15 +128124,15 @@ kGt cyM fyw gld -vQS +pZF rEP -pyC +gAD lZa dyb cEK yca sIE -pVw +meJ hXw btc hFP @@ -128058,7 +128166,7 @@ aej wce lzM dvG -kKK +cAd bNh kvo pcK @@ -128070,8 +128178,8 @@ iYC okJ voV rvI -kFd -iBu +crD +mkj pTC pTC pTC @@ -128092,7 +128200,7 @@ sIX sIX skv dCI -kKV +stp dNN qMB wtS @@ -128100,7 +128208,7 @@ dQq hIB xop xop -eam +mcC rHp rSR qgo @@ -128251,8 +128359,8 @@ smU sik peK qEV -rtk -cEr +lES +lbO pNP oYs shm @@ -128271,7 +128379,7 @@ ueJ bIG csw frR -cIa +pEg ddg uWI oHQ @@ -128328,9 +128436,9 @@ iYC xPX rvI inb -khF -jjH -ejy +cni +kRZ +vPV pTC pTC rOH @@ -128339,10 +128447,10 @@ rUj rUj rUj igg -wnW +rgb kyD qmd -wok +bNU bNU hiq dxZ @@ -128359,7 +128467,7 @@ xop xop ehk kLi -kLi +bCo qgo duG sXB @@ -128539,7 +128647,7 @@ gBI tzm aZs aHv -tiS +rxM pAu nFX wrP @@ -128549,20 +128657,20 @@ oTY tTn cIZ oYs -dCC +eGq isy suw oYs mcs oYs -nYG +mDu bUE lHV ybN eMw -wDr +kDi rAG -xXc +pfA fHI gRm uED @@ -128592,7 +128700,7 @@ kjI kPc evI dNS -hHf +eGR nhn cjH igg @@ -128625,7 +128733,7 @@ iLH hcW wnY wwP -heP +kzc amy aKp qSJ @@ -128760,7 +128868,7 @@ kAc cCN bFV jTf -pOC +dkH lWu wiU dkz @@ -128788,7 +128896,7 @@ xnh pLx jZj umN -uVa +nWc hgH nyg cnE @@ -128808,11 +128916,11 @@ oYs oYs kxJ tJE -xqA +sqD oYs fgK oYs -bTX +iJJ kyx kbd kbd @@ -128835,7 +128943,7 @@ aXV bIk ozE xTr -kyb +mJi vMU mLA iOz @@ -128994,10 +129102,10 @@ aaa qld odb qld -sSz +rUW mti mti -rWu +ofC mti wOq mti @@ -129010,7 +129118,7 @@ mti mti mti tJi -jxn +aZK mti mti vUN @@ -129032,11 +129140,11 @@ oYs kFi csh rOc -obH +ngb jLa gbY vGP -xmg +gXS vYk crg unh @@ -129053,7 +129161,7 @@ jkZ wTU ydb tXu -gXM +pRg tXu uRf oYs @@ -129085,14 +129193,14 @@ sAh jkl ccp dvG -vQm +sLf vTD wdb wdb wdb muk khb -lzj +vWV aPz fHr cfO @@ -129101,7 +129209,7 @@ eGy liL rmV xez -uHW +oTl khb bPY nlF @@ -129113,10 +129221,10 @@ igg tFM cTj dyx -rLx +oRh oHq -fUM -cYp +wNV +tuM dNN vZV sEF @@ -129137,13 +129245,13 @@ nJK yex iML tgI -iqg +uUG djT kzc kzc kzc -rmf -rmf +kzc +kzc kff vLB tTg @@ -129259,10 +129367,10 @@ pkd qld thf qld -pkj +aPS qqA -xSq -uNJ +asc +hIQ qld thf qld @@ -129272,7 +129380,7 @@ qld qld sjt kKm -pxU +oMr kJd uqk lWu @@ -129287,7 +129395,7 @@ oYs cPL oYs oYs -mYl +gcm csh dwN dwN @@ -129295,7 +129403,7 @@ eYR dwN dwN crg -sEt +ddY csw csw xhi @@ -129353,7 +129461,7 @@ qPs iQw dSA kYQ -pUC +rgq tpd khb khb @@ -129394,7 +129502,7 @@ vqx oHM iLH pKR -uUG +iqg uUG fgy oFC @@ -129559,7 +129667,7 @@ umN jzb vqy umN -qmX +ifj euk sbW uGl @@ -129573,7 +129681,7 @@ mCf oYs uRF hHS -hwu +rPJ oYs ttQ dCs @@ -129596,7 +129704,7 @@ iCO lOG fpm qAQ -qbm +xka sxK xpI dvG @@ -129615,15 +129723,15 @@ sUv khb oBy egP -pBO +moZ wQs wIa nlF hFf kWH qsN -mRt -lmz +nKC +sTG nRi dNN bXw @@ -129792,7 +129900,7 @@ fbF lWu pOY lWu -kAv +cmb lWu meZ lWu @@ -129810,12 +129918,12 @@ auZ tMF kbe csw -idm +rOq sCl weZ mQh wTF -slX +ojV tXu jRL epZ @@ -129825,14 +129933,14 @@ nAP exK lnp wzl -epD +wAI cUD oYs oYs ybS scn oYs -rXS +xYY rRC deE wZB @@ -129840,7 +129948,7 @@ ucA oYs sup oYs -iwY +uGt lGf qfC gVr @@ -129855,9 +129963,9 @@ qZI qrY vlP wDd -qlJ +tRt dvG -xYR +ovx aJA dka pLr @@ -129882,18 +129990,18 @@ mUt utj tQt xaS -ucM +dNq qAG kzT alT -ucM +dNq tWa kSR pba dCx -afH +jui fDF -icN +sky gdc gEW mJm @@ -129901,7 +130009,7 @@ bgQ fhU nMp fgq -rFl +bYh qgo kGa hNW @@ -129918,7 +130026,7 @@ kzc uYH qWx qQM -vWS +pUi bsN joB qQM @@ -130066,7 +130174,7 @@ wvR sNF sZn xyt -vob +yas pAR ktP pAR @@ -130089,11 +130197,11 @@ oYs qjO kal oYs -iZR +sZT hFu lNB bvW -mXt +iYJ oYs pSt oYs @@ -130144,7 +130252,7 @@ ugs jky hBb oEb -tBY +rRk sZK mYs vIB @@ -130302,9 +130410,9 @@ aaa qld ePK kJd -erz +fyU sjt -bjJ +wGS cGM tMN qMS @@ -130354,14 +130462,14 @@ dtj oYs miv oYs -xhV +wEm jME dUe dLu fgM dUe oly -muo +dCp fHI wjF uED @@ -130381,33 +130489,33 @@ fHD tCD khb rNZ -tmD -gZM +xkV +ryp khb gmZ -tXF +feL uyE uce rkU hBZ xHW -iMp +tMU oPE flF oqJ saz -usV +kvG nHB mHq qLE -usV +kvG eAO ban jqx dCx -jui +afH fDF -nCb +lvU pOU ksy qgo @@ -130567,7 +130675,7 @@ nMD nMD pyq pyq -oqt +ilR nPQ nPQ nPQ @@ -130585,7 +130693,7 @@ ffM jNB sQN fzw -uCY +pTK cmi fkU uCA @@ -130603,7 +130711,7 @@ jMQ sie tNu wxo -iwi +vkX aHW rPI oYm @@ -130652,7 +130760,7 @@ qnY alM lVF bwE -vXS +gfw dNN xNL gHh @@ -130665,7 +130773,7 @@ bXG jui reC eXw -gzz +luE ilX peU eTV @@ -130681,7 +130789,7 @@ ciH lcP lOw wCh -rir +cFB oQq fYa hqU @@ -130863,7 +130971,7 @@ roZ ccA hek nYg -ieH +nnG fmN jsL kNY @@ -130875,12 +130983,12 @@ alW sYU sYU sYU -nxg +giC sIZ hAc ctw lSl -jzx +jZs dbU lSl jol @@ -130896,20 +131004,20 @@ rcW rcW rcW nIS -rcW -fgL +wxk +rDJ rcW rUn rcW rcW opl rcW -rcW +iRt qnY biV nCt ijx -wzH +ftG fvi fvi fvi @@ -130919,7 +131027,7 @@ fvi fvi jmA dCx -qfZ +bSn fDF fDF fDF @@ -131097,11 +131205,11 @@ dRJ dRJ ptk lII -cnK +oEp pbk tDw moY -mhj +fuT vbK aXu dRJ @@ -131181,11 +131289,11 @@ aAj nQl vhs lbs -nRs +jfo nCK mzi qQM -vFx +oQZ tlV kzc kzc @@ -131209,7 +131317,7 @@ qQM aaa tgT tgT -yco +eZe iAt lSG tgT @@ -131380,19 +131488,19 @@ vnn lZt lZt lZt -bIM +kHQ pfh aSB pfh pfh iOu -lZt +lca lZt lZt lZt oAW cZp -pXi +gmY pfh pfh pfh @@ -131408,7 +131516,7 @@ clH unK erS nXY -hFl +plO nXY nXY nXY @@ -131469,11 +131577,11 @@ pOB nJb nSp hXu -jiP +dAX tgT qYo tgT -jQq +lVi wjV kSX hGJ @@ -131588,7 +131696,7 @@ qld nnv xbu pOC -lsm +vXv kNd hjg kNd @@ -131613,7 +131721,7 @@ hTi vDY mgd fju -cmG +plm rtT uNg xjF @@ -131628,13 +131736,13 @@ qGm dxk dxk qTA -fdA +dDV vnU eea eem -dOX +dOZ gDS -anV +cIE pca pca diL @@ -131700,7 +131808,7 @@ jxf hUx qQM jEA -sPb +tTg tLZ kzc kzc @@ -131709,12 +131817,12 @@ kzc kzc kzc hRH -qya +rXN tbd doe -gYN +qya lEj -jhg +rIv xIz swY qpq @@ -131851,9 +131959,9 @@ tht dbO bLd pUU -ltM +emm sjt -yaP +dyi iWA vRU tCs @@ -131895,10 +132003,10 @@ xms xms xms diL -rWj +uQD drj bog -oFu +xaF awc xOv nHc @@ -131909,11 +132017,11 @@ pRS qLa nLS xld -pvv +uqZ uuy tPv cPD -bUg +uhC pRS gqq tMo @@ -131925,7 +132033,7 @@ mlE xWP nTz puJ -gAW +aNJ puJ kpj bYG @@ -131947,7 +132055,7 @@ vzA iuU fMZ dCx -ims +xdN aAj aAj aAj @@ -131963,7 +132071,7 @@ kzc vmK wWL vfS -gMY +pQn jvQ eKe eKe @@ -132099,7 +132207,7 @@ aaa aaa aaa sjt -kEn +eIm kJd wTn sjt @@ -132138,7 +132246,7 @@ opX opX opX opX -opX +uet opX opX opX @@ -132172,20 +132280,20 @@ xOt iaL pRS pRS -ftI +bLl kXb ckB pRS oHJ qdA mlE -bYx +dZW rKF gAr jOo fwU dZW -asr +nJL mlE kxg hJs @@ -132217,7 +132325,7 @@ mPZ gmc kUt loe -riM +oVd nuI kFK kFK @@ -132414,16 +132522,16 @@ jEt lBe uhH awc -guz +cvx qxi sEm dEA -ymi +nxd pRS -lQR +mlM eGs -pLV -dxW +ykB +jpe sCh cvE vcU @@ -132448,12 +132556,12 @@ dvH whK lGJ oJy -nqe +gCS uZf fHc -cjG +whc fvi -rkj +rHZ rwZ cQr pJs @@ -132472,7 +132580,7 @@ gWz pdf kVo sqX -wpk +bTo loe uTT nuI @@ -132626,17 +132734,17 @@ qYo qld pgL prJ -jaA +dUb tCs wzr uCb dtf kVP -vRB +iqT dcR giz kVP -wSk +jHE ixs aGF mgn @@ -132646,7 +132754,7 @@ fto pkr ffo tXn -icn +qeS vnU uqX mOI @@ -132671,7 +132779,7 @@ drj bog iMg sQA -rvb +wIr aSS aiO hWq @@ -132686,7 +132794,7 @@ lNA lUI mqr uNy -wzM +cIb asq qnQ pRS @@ -132710,7 +132818,7 @@ pXk hXQ lfz fvi -dKp +nlK qvK jFP veR @@ -132751,14 +132859,14 @@ qQM qYo tgT kEw -bsA +hGo kLx xqg ppN avZ nSp nSp -tVm +cbF eZh wvf thT @@ -132859,7 +132967,7 @@ xyL qld vQb hfB -xUt +nBb eUf qld rAC @@ -132890,7 +132998,7 @@ sid sBG sLz vRB -nXs +rIx xMe kVP bSp @@ -132917,7 +133025,7 @@ xzC rjt iDP eem -aid +xny kOj aad aad @@ -132948,7 +133056,7 @@ guY usF iaL oHJ -fAY +bfn mlE lml xjd @@ -132960,7 +133068,7 @@ sKP hPs avR whK -wEj +rcW oJy rvY aAu @@ -132969,7 +133077,7 @@ xmR fvi fvi fvi -btz +hMa sXV gsG iuU @@ -133109,7 +133217,7 @@ qld rNY lrc tPE -mNX +nus mVS mVS sdJ @@ -133122,7 +133230,7 @@ sdJ pWO lxc sUz -uhl +xjo sUz sUz qhN @@ -133144,11 +133252,11 @@ xWc oDm cnL kfa -pln +pPI kVP -oFh -ygD -feG +fEX +fTZ +jVP kVP pET vwr @@ -133172,7 +133280,7 @@ jbr feq vnU vnU -bhZ +xLp wjO dOZ xms @@ -133202,9 +133310,9 @@ mOv sox ogs guY -vgU +dyu pRS -oHJ +lmH kbT mlE ryC @@ -133217,13 +133325,13 @@ sKP hPs avR qLG -rcW +oKz oJy jpB iAe bvb kCL -jii +buo gsZ oJy fvi @@ -133243,7 +133351,7 @@ dQT ghA nQG rtw -kBg +rST loe fUU nuI @@ -133266,14 +133374,14 @@ qYo tgT unv mjK -taa +vFz xFJ ejL jlv ifT jLW -sAw -ggu +wjA +tUS tUS fXQ tgT @@ -133401,14 +133509,14 @@ dFS tCs vdZ qPp -cfd +pXt kVP ovQ joU iXO kVP pgN -wFG +jJJ qhA rut bNB @@ -133416,8 +133524,8 @@ pri pri qkA nWI -rbk -ffN +bQN +tSa vnU bTy eex @@ -133438,7 +133546,7 @@ aad aaa diL ipQ -aZy +oif qey mGE qGW @@ -133446,7 +133554,7 @@ nHu lgQ xVo mxU -bCt +xJh pRS qnQ mXy @@ -133486,7 +133594,7 @@ gem vBk wil sDd -bsQ +fpu wil erT iqj @@ -133500,7 +133608,7 @@ dQT akg hdH jgt -abq +wDO loe iId nuI @@ -133620,7 +133728,7 @@ aaa qld odb qld -bBm +kSa mti oYh aho @@ -133697,22 +133805,22 @@ wyH rdu pzu bog -xby +vuv sQA -fFW +jKE rgW wmp rgW mGw pRS -pXM +paD lAv nAz jce lZx -wqG +oit lbt -qRO +iVT nuY njs cqt @@ -133721,15 +133829,15 @@ pRS bMB xaP mlE -dML +mlw nxn sVP -lQV +esM bLu umz -mfb +kEA mlE -tmy +nXY whK rcW tXO @@ -133743,7 +133851,7 @@ snE kdq shU bbj -hdp +dZc lhC uGE qmu @@ -133754,7 +133862,7 @@ qfi fLd uws dQT -vuS +deW pMF uZm wqz @@ -133780,9 +133888,9 @@ qYo tgT sdw tgT -vvb +pRy tRS -ePb +haG xPc oOz vfa @@ -133921,7 +134029,7 @@ sRB eWN iff rpH -vWv +biZ kVP sGS qOT @@ -133930,7 +134038,7 @@ pqv uGR qdl ewV -xQa +iss jhH vnU vnU @@ -133980,9 +134088,9 @@ drM mlE odw kdL -oGV +eAY fot -rCj +mpb muz vyP mlE @@ -134014,7 +134122,7 @@ dQT qtq pMF nti -dcH +jKQ loe mAW wlr @@ -134164,9 +134272,9 @@ jAi bOU hUU iyM -tht +fBR sjt -nQP +kKY prJ gXT kVP @@ -134187,7 +134295,7 @@ pOV eqM ask dep -uXX +vQB bwh vnU tOs @@ -134215,18 +134323,18 @@ wuV sQA awc ijB -tCq +erM vtT awc aFA -hAN +ilI ilI ilI tfw iro ilI ilI -hAN +ilI ilI xkw aaa @@ -134249,9 +134357,9 @@ rcW sAv wYH lmL -kjc +iiU fZg -umk +eAq okD oJy lYW @@ -134276,13 +134384,13 @@ loe iJG wwb kZL -mIi +hYT ouK -rug +fAH aOr gpw caw -gHk +xRa eug eug mDU @@ -134415,7 +134523,7 @@ qld oMr dJO urY -mpj +wnG nMD nMD nMD @@ -134432,7 +134540,7 @@ ptC maV rgK gmh -jGF +gzc nUG kVP kVP @@ -134463,8 +134571,8 @@ dOZ xms aaa wyH -alx -miK +fIx +vZw cQv drj bog @@ -134476,14 +134584,14 @@ eVl eVl eVl xkw -ilI -ilI -ilI -hup -ilI -ilI -kRU -kRU +jDi +jDi +jDi +uHp +jDi +jDi +jDi +jDi hup iyy aad @@ -134494,12 +134602,12 @@ xaP lkg qJK csB -prV +lDo ebb hTq jDa -qam -pWq +irF +rkr clH whK kXm @@ -134520,7 +134628,7 @@ dlG wgV mqw xoL -jgd +ulp dQT xkU jew @@ -134682,7 +134790,7 @@ rbR euQ bsb dLJ -bsb +kCX kVP bpd pyw @@ -134690,7 +134798,7 @@ kVP gyW ryg mGF -ykw +dib kVP gwt lUy @@ -134714,7 +134822,7 @@ vJd qAV fOP qAV -iDP +rnm nPa dOZ xms @@ -134724,30 +134832,30 @@ fbH ieC cQv drj -gxD +rbF pma fnA eVl -ngD +lqj sVj -twZ +eWX yiC qUM -kRU -vEy +jDi +eDK dfb hup xCa ilI dRh -oZt +dBl qoD xkw aaa aaa vpK qin -bIe +xaP duA qGr ybl @@ -134764,7 +134872,7 @@ lbZ mvS cQZ kBH -kIM +ezm ldN mtQ cwh @@ -134773,7 +134881,7 @@ sMQ piI dQT sTv -aak +uJp fFV bRe mck @@ -134801,9 +134909,9 @@ unk riS iAY lwZ -lEq +hKO vJm -fTx +qid tgT vKI iFg @@ -134925,7 +135033,7 @@ aaa aaa aad pkd -uIR +yiK oMr cDT kJd @@ -134939,7 +135047,7 @@ nJx jeO aSO jfF -ucW +tQh kVP xSf mqV @@ -134956,7 +135064,7 @@ grM xcs xWw trd -tOf +ulR vhJ vDS bGj @@ -134982,7 +135090,7 @@ pnV bsC fIg hdZ -pgB +tip ipQ eVl cGR @@ -134990,7 +135098,7 @@ vBA aPW rbB lkL -kRU +jDi dZD bvw hup @@ -135203,24 +135311,24 @@ kVP kVP vat kVP -kQV -rhg +gIE +hUh kVP cAV cHm qAV -vLP +aWt saB vxS eLY szy sWo hJP -goi +kRv qAV xiG vba -rhh +cIX jEF edg ptG @@ -135228,14 +135336,14 @@ pYo ifR twh qAV -phb +mBJ drQ -jaF +ttz kOj aad diL nYn -cQv +iGB cQv sHn dTp @@ -135247,15 +135355,15 @@ gnA jHb kgs lkL -lAx +wem ilI ilI -esN +poy qqk -hEa -lKf -lKf -lKf +mOo +oMp +oMp +oMp atv eoC gUN @@ -135264,7 +135372,7 @@ ivq xaP duA nuC -leh +teK rRS stC nQD @@ -135284,8 +135392,8 @@ fsq cwh wPN hbE -hkQ -tnm +abG +jtl wBL dQT qfi @@ -135308,7 +135416,7 @@ bBp xvE mpz njg -pZL +eHp oyJ tjf fqO @@ -135317,7 +135425,7 @@ gdR lwZ fWX cug -meW +tqK yaG gte qpr @@ -135450,7 +135558,7 @@ cZH qbW ete jpW -mcE +pBu qwz prJ jYM @@ -135472,7 +135580,7 @@ qAV qAV qAV jfn -oPY +gps cfp qAV fqn @@ -135482,7 +135590,7 @@ fiZ dag tNa qAV -emg +dBR bCZ qAV iDP @@ -135506,16 +135614,16 @@ xDU lkL lkL lkL -oij -xbW +ilI +rRz ilI ilI -kEv +hup lkL lkL lkL nav -qoc +fYp vpK jkk xaP @@ -135530,7 +135638,7 @@ crR wGV uZV whK -vFm +vQc cwh cwh pkb @@ -135544,12 +135652,12 @@ rgX dMc hdK tQE -cBY +lFX sTZ dlp dUF anX -fcI +gUZ eYX nZf lyZ @@ -135568,7 +135676,7 @@ aaM qYL qYL qYL -twq +uMe qYL qYL bhw @@ -135699,9 +135807,9 @@ qld qld qso dJO -szM +lfs jJc -wuF +uvs fcR amp fcR @@ -135742,7 +135850,7 @@ qAV tEj fOP qAV -fYu +eNJ kfI rSq xms @@ -135754,7 +135862,7 @@ jGQ sHn xgP uWl -iDG +eUj eUu gkp cHe @@ -135775,7 +135883,7 @@ vgg vap wgb mOB -hol +pRI duA wpt oGk @@ -135811,9 +135919,9 @@ iWc hfX mgW qEf -fWH +weg hoh -byy +oBd qEf aVw ycR @@ -135824,11 +135932,11 @@ tgN lLO qYL tpf -iiW -dej -dbL -vBM -gOv +iHq +fVU +vDy +iCT +vGY bhw esQ ooP @@ -135978,7 +136086,7 @@ qAV daR dla itV -bbS +rzw fIR wnI pgF @@ -135996,7 +136104,7 @@ xWQ vya gcT qAV -pIW +jUM tvs flw vEo @@ -136020,11 +136128,11 @@ xDU lkL lkL lkL -oij -xbW ilI +rRz ilI -kEv +ilI +hup lkL lkL lkL @@ -136046,7 +136154,7 @@ buP whK hiV cwh -dsO +hiW sgp mql nJj @@ -136056,14 +136164,14 @@ jQg gbG jyJ irm -qaL +xcL veM rQB irD irD rQB veM -ldY +mNL ako cBP pdl @@ -136080,12 +136188,12 @@ sbT geJ dMY qYL -eqE -wFK -tPX -vVY -aRd -pdP +uwZ +xyN +rhp +tPm +nJQ +tGj jgl xBc grq @@ -136258,12 +136366,12 @@ okb rKN pXg jkf -xXm +iFG kOj aad diL cnW -cQv +iGB cQv sHn lGz @@ -136275,15 +136383,15 @@ wvi jHb uPz lkL -hHG +uJO ilI ilI -sXX +ecq sau -lKf -lKf -lKf -lKf +oMp +oMp +oMp +oMp atv cnu mly @@ -136324,8 +136432,8 @@ veM ako piu evr -rqr -aMO +qBn +uQF ibh cYk ako @@ -136337,13 +136445,13 @@ vdU iGr dBn qYL -uwZ -iyb -aoN -hFQ -qYZ -gHF -lvv +ykA +xyN +rhp +lpR +iQR +ehl +bhw eUW sAI bhw @@ -136481,7 +136589,7 @@ nbN dLX eCt bHB -rza +cCD qRw wTJ vxu @@ -136500,13 +136608,13 @@ qAV xSx xGC qAV -nLX +uRP mzb lkm -avQ -sac +aIm +mRZ hoC -tTb +vyN gMR gPm quA @@ -136524,7 +136632,7 @@ pnV jeF cgg hdZ -iaP +oKX ipQ eVl mCM @@ -136532,7 +136640,7 @@ gUW fnM hpv lkL -kRU +jDi tCI hiH hup @@ -136549,7 +136657,7 @@ dNm xAL kvF czf -czf +sdV bCM ocA kzp @@ -136565,7 +136673,7 @@ kgq cwh ptf dWe -fjW +lks cwh qwM mwR @@ -136579,7 +136687,7 @@ oCo fiU jRJ ako -rdU +dqj bGM dNc dNc @@ -136595,12 +136703,12 @@ qQa rZe qYL uAV -iyb -oOv -hFQ -qYZ -gHF -cJE +xyN +tdX +jWI +iVU +eSD +bhw roI hYf bhw @@ -136612,7 +136720,7 @@ tHV tHV tHV tHV -waV +gjk xYG dfg nEa @@ -136727,7 +136835,7 @@ aaa sjt dBg kJd -gaF +urY jJc aje arc @@ -136740,7 +136848,7 @@ jdL gPc jdL jdL -gFK +nGC puj obx tAA @@ -136780,30 +136888,30 @@ wkT qkm cQv drj -lbT +oEf ccq -rGO +dXN eVl -hrY +usZ wiw -xCt +rmx rme xkw -kRU -seP +jDi +uEh fYw hup jQw hup jPC -quc +pFy qoD xkw aaa aaa vpK jcB -omp +uJm duA anP mzL @@ -136825,16 +136933,16 @@ pTz cwh cwh udd -tLm +cUh veM -wfg +nJh wOP dfB knX nuG euF oCo -vTN +sJG ako kbc rjO @@ -136851,13 +136959,13 @@ bjB uOu tzn qYL -uwZ -dzD -fbY -hFQ -qYZ -gHF -jmd +cud +hcR +rhp +omF +gBd +qYU +bhw lHE tJV bhw @@ -136867,12 +136975,12 @@ oDT fQl tHV jlN -sFM -nEa -lQg +lWP +fvo +gGE bUL tke -nEa +exJ aaa efQ aaa @@ -136998,7 +137106,7 @@ qHz pOi jdL qNy -qgV +hVI ykb jdL jdL @@ -137010,7 +137118,7 @@ xYZ vGf rXE cAw -sJd +fcg khn mhe rvK @@ -137034,7 +137142,7 @@ xms aaa wyH cEp -hhB +rmg cQv drj bog @@ -137046,14 +137154,14 @@ eVl eVl eVl xkw -ilI -ilI -ilI -hup -ilI -hup -kRU -kRU +jDi +jDi +jDi +uHp +jDi +uHp +jDi +jDi hup iyy aad @@ -137064,19 +137172,19 @@ uJm lkg knP por -wgv +pjh rWK hTq aWl -mLE -lmT +rol +laj ewk whK hiV xuI svO cSD -tzV +mgE sKd xcA uNY @@ -137108,14 +137216,14 @@ jqJ jqJ qeF qYL -dYb -gbv -hvX -gWH -wwI +qry +uJW +mmf +aQc +uLx qYL bhw -nTj +bhw njy tHV tHV @@ -137125,11 +137233,11 @@ tHV xyu eKU imN -fvo -ddM +exJ +lQB iGT -lga -cJD +led +exJ qYo efQ aaa @@ -137241,7 +137349,7 @@ sCo cCN bFV aSO -rSa +lZz koM gHH pzr @@ -137295,22 +137403,22 @@ diL hFx drj bog -nkU +hZb gOU gOU vDo eBw -agn +aaj gOU fOw -fBm +ilI ilI ilI hup qlY cMD ilI -fBm +ilI ilI xkw aaa @@ -137365,24 +137473,24 @@ jqJ jqJ dRQ qYL -xbk -cuj -mQp -stB -eLR -eFy -pEG +jNY +llm +rFm +mgJ +aSt +aVQ +xip bhw xBc tHV -rss +wxl ujQ iRF iYq qmF hvv psF -nEa +exJ lQg ucw tke @@ -137475,7 +137583,7 @@ aaa sjt qld sjt -lyx +sfy cIq flS flS @@ -137505,7 +137613,7 @@ jNP rHq mdM jdL -sYt +odX oHz rUM xtM @@ -137526,7 +137634,7 @@ cBS vUO jPU uiK -qlK +tHg vVu iSf hqK @@ -137549,7 +137657,7 @@ aad aad aad wyH -jBR +eTS pnV bog jlZ @@ -137614,22 +137722,22 @@ klr oNF lhe ako -crk +nSL kuU tOS -czq +fCD jqJ jqJ -wIM +lIG qYL -bSI -hwT -kWb -yiD -xvC -hwG -dJd -nTj +xAr +xBJ +uZe +qKg +uhc +xJO +nbs +bhw asH iXC pUQ @@ -137642,7 +137750,7 @@ cmI tBO oli iCE -pVd +fAv fvo nEa nEa @@ -137733,12 +137841,12 @@ aaa aaa qld mMr -nUI +vHO jeC rsg czD nSl -iaN +jRq ozs jRq won @@ -137749,7 +137857,7 @@ jRq rfd vwa jRq -fNM +iVA oqz bBa uPx @@ -137759,7 +137867,7 @@ qnG koM rsw ixE -vrJ +rQZ rkN jdL jdL @@ -137773,14 +137881,14 @@ ukR uaS jdL tGD -qQK -dtW +fqi +wVQ uCt jdL eeZ ieI rEA -nUY +byP sQU ozp bfy @@ -137806,17 +137914,17 @@ aaa aad aaa wyH -vEl +lgG pnV bog -fYz +neK gOU -eDe +gsP hja aby aby -poU -mcS +qig +nxG bcE ivA saC @@ -137871,21 +137979,21 @@ dcd djC wvG ako -xIV +hbO dRy aaM -eiT +ubK vnB uue -djk +jdf qYL -bHZ -eff -kXu -wkN -gQN -sxO -sHx +qpU +neT +aNV +hvf +vid +vZk +bMb bhw ljj tHV @@ -137997,15 +138105,15 @@ abi abi abi abi -fBZ +xOw wiY kAc kJH -hgG +qdc qxC nPF sHQ -wPY +oHj jdL jdL jdL @@ -138019,7 +138127,7 @@ jdL jdL jdL jdL -dwI +cOR fIY pxT gCB @@ -138064,7 +138172,7 @@ aad aaa diL ipQ -aZy +oif qey mGE uxr @@ -138100,9 +138208,9 @@ xzu gyf aLv cCP -hSM +hiV uNY -oFt +gnb dnj eiw fNm @@ -138112,20 +138220,20 @@ keH jtz ckd veM -tQR +hJn eya wBh xVb nuG qKU fIt -nLB +jsa ako nFO tqw -pIR -qsI -gtA +kKy +xhT +xtS ako ako gMX @@ -138144,7 +138252,7 @@ qYL bhw bhw bhw -eYz +dcz tHV nEa bgG @@ -138264,7 +138372,7 @@ pSq dmC abi jdL -xpr +xdA iql hfM siV @@ -138285,16 +138393,16 @@ jdL dZN lID fmk -lUX +qdL agg -enT +lxP aLR lDi flB aoT kmb fAT -uxC +gcD eoy weh vnP @@ -138325,15 +138433,15 @@ bsC bog nkU gOU -hhe +hec aby wkt aby -qGa +dFo xnw fyH ivA -hqj +hTg pgE rVu nuj @@ -138344,7 +138452,7 @@ oHC tYi cyv vIQ -uOl +sSe jiC ksK ooC @@ -138355,7 +138463,7 @@ kpy pwa isP ksK -pYl +eua whK hiV xuI @@ -138390,7 +138498,7 @@ kuU qCV lvZ rtC -idd +uzT fPh eOE dIJ @@ -138547,7 +138655,7 @@ dmK iXj ebo lDi -pEa +hDP xKn fFi fye @@ -138566,12 +138674,12 @@ vsJ qQE ygT wzb -frq +drJ fYD hsn pXg dvy -jDG +lOf kOj aad aad @@ -138590,7 +138698,7 @@ hjN xKD lcG ivA -eIj +cIw tLa vAs aOB @@ -138602,7 +138710,7 @@ sBb qBq fQw icV -hyT +iDw ksK ryE ico @@ -138624,13 +138732,13 @@ huR pGo tPQ mVr -wXd +vfA gQl gQl gQl wBV cya -aqs +fia iUg iUg tQM @@ -138643,7 +138751,7 @@ fhp dki dki uyL -jKU +iAL cuy aMB wJK @@ -138764,7 +138872,7 @@ abT abi acr hIo -aAv +pdS xbx adQ abi @@ -138796,34 +138904,34 @@ jdL jdL vkN jdL -jWX +mDP szg brZ wqn lNc hXB -wte +bvG lDi fPJ vBx ery njx -fsK +cNm eoy rly ePl eoy -qHY +wrw vwg wRf -rWG -wvb +vKl +wfK hoC yfI bGf kGo sCW -nxl +xhW ygL xhW sLK @@ -138881,7 +138989,7 @@ dnj xnp mHZ soU -jjR +cRY gQl dVX gQl @@ -138904,7 +139012,7 @@ dki dki dki dki -enL +ngc pmY tWx hxe @@ -139041,7 +139149,7 @@ jQx siV uRt kdg -aKS +ccy jdL pbq jdL @@ -139113,7 +139221,7 @@ abp ocx bOF skx -hpG +czu vIQ hIP png @@ -139142,7 +139250,7 @@ jUC sxG wAk gjE -yle +cvo uCe gQl dOE @@ -139184,7 +139292,7 @@ eFj thB ivz jTa -vCO +eWi hLt qYo aaa @@ -139276,7 +139384,7 @@ aad aad aad xrr -kkV +mSD qtS rGZ xrr @@ -139310,15 +139418,15 @@ tpI jdL fYK jdL -dYO +lgc dfk kYB -hoz +ivG pAz wzZ uEN lDi -trn +loU xzk pdB pdB @@ -139327,12 +139435,12 @@ uQa xqM tTa lKl -mQt +nmU tfC bcD haS xhW -pQS +eew fZi sye sye @@ -139416,11 +139524,11 @@ xpW kfE mZk itY -bcF +iBG dki lcw gyn -lZW +qzR lvZ lvZ lvZ @@ -139559,11 +139667,11 @@ pOi hvn pjk jdL -mGo +qVr lBa uTB wak -cFN +xor jdL oFk jdL @@ -139574,7 +139682,7 @@ lDi kRn kjl lDi -afF +lDi sLg bqv hDZ @@ -139605,10 +139713,10 @@ xms xms xms diL -rWj +uQD drj bog -uYv +ksJ gOU prt wqT @@ -139626,7 +139734,7 @@ ivA eyK kSu vDJ -mja +pgv sXg vIQ rBB @@ -139654,10 +139762,10 @@ bYc lAk tfK gQl -auy +ivu umM oUz -gOM +odc gQl cwe ltS @@ -139827,11 +139935,11 @@ jdL aix wHa mIA -wkz +htK tfy tuZ upv -svq +dgU nZK hey oSv @@ -139850,15 +139958,15 @@ uBZ pso sqW sqW -lRi +scv eYZ vxt uzn eUH dvy -lrP +lSl kOj -pca +kGK kNw anV diL @@ -139936,7 +140044,7 @@ hXm kYb vcj nxb -qpg +ehF nyb iJv knH @@ -140077,11 +140185,11 @@ feg exy xwO liM -qSl +xGK jdL eNn jdL -jWq +ncT hTl tjl kdE @@ -140130,15 +140238,15 @@ lSl lSl cpr lSl -rTe +ggl lSl lSl lSl lSl -dbU +mta jol lSl -fyj +ltY lSl lSl dbU @@ -140146,13 +140254,13 @@ qSd rRB nOP sqd -ofR +rwl sqd dMM uKZ sqd sqd -sqd +rbb jom aLv qAW @@ -140163,16 +140271,16 @@ dju mxc dju vvh -ePR +gXg dju dju dju slE -dju +rHI dju dju hBL -aTL +vvh dju oXR dju @@ -140182,7 +140290,7 @@ dju dju dju uRV -eGP +cUY fdX dju dju @@ -140360,13 +140468,13 @@ jqs oSv gLz xhW -qMn +axz fOz rAl bkr yfo qLp -nQQ +pcx xhW pCE qxy @@ -140619,14 +140727,14 @@ ohH xhW xhW nPo -kGo -nPo -xhW -xhW -xhW -xhW +xMZ +cGV +cGV +cGV +cGV +cGV uBd -mKN +wuU vPp tJT qzY @@ -140658,7 +140766,7 @@ sWI lZt piG clH -wtZ +tHW juZ dHb clH @@ -140669,12 +140777,12 @@ clH clH mAh dlJ -jSq +nGN gup qgx tIV yat -tIV +drd tIV vuU tIV @@ -140693,7 +140801,7 @@ tIV tIV tIV mhW -cxK +tIV pYp tIV tIV @@ -140717,7 +140825,7 @@ kVG jkH jkH hQF -sxJ +das iWE uns rPG @@ -140725,7 +140833,7 @@ pxP pYD oIc iGM -lsu +jNh eWi hDl hDl @@ -140843,12 +140951,12 @@ pXw hwO mDI vno -tlK +eEl nyJ wuZ jhJ lgh -pob +xnd jdL fIu jdL @@ -140867,7 +140975,7 @@ osd oSv kuy uHl -kSk +mnl mOe oSv uSp @@ -140877,11 +140985,11 @@ rWo qko vNV pxS -xMZ +fbu mlF qsF jKY -tpZ +cGV lDY tpZ kOj @@ -140946,7 +141054,7 @@ mhM kaN mhM fLK -uHJ +lmm dgd kaN kaN @@ -140968,12 +141076,12 @@ bMh nyb jdg pPN -rVf +mQY hQF hQF hQF hQF -uFn +tSQ nxb nxb nxb @@ -141097,10 +141205,10 @@ fTh egs vno rJN -tLW +lUW pGy vno -eiL +kvs gUb mRf eIt @@ -141109,7 +141217,7 @@ gbo jdL ouu jdL -xFo +vWD gNo nlB lVv @@ -141133,12 +141241,12 @@ uzM aPD stf llj -mDm +ftS fbu mDm vDj -hXd -tpZ +cwd +cGV qmT tpZ aaa @@ -141154,24 +141262,24 @@ mjz iJT mjz xav -dTu +kAE tWD erX iSU ljd rdP iVq -iPi +cSG xIp -ggg +vMI uJX wCI dra wxa hCh -eFm +tek vmr -qyi +exS iVq juZ crR @@ -141187,14 +141295,14 @@ gCD hgJ hnC pWG -aEi +dWF bXA osR tkB nHY ush wBG -wsn +lOc nZi nZi nZi @@ -141222,15 +141330,15 @@ eBn aYF nxb ydO -goG +wpp vyl aND nxb -foi +jCm fmO -xvY +tXy gQd -jxz +lXW nxb aaa aaa @@ -141366,7 +141474,7 @@ kwb jdL gMt jdL -kOy +vNo cFs wyh mLD @@ -141381,7 +141489,7 @@ nfE qaF oJR qHL -dtL +fGY bLo rbV qLg @@ -141395,8 +141503,8 @@ pUs okN oAV vId -qyX -uND +cGV +eFU tpZ aaa lhY @@ -141460,15 +141568,15 @@ qMf okV jHH gIX -gpu +usz slZ qMf -nZt +xeF oxV lcm nii bIr -jjc +jat oYz eBn mqG @@ -141485,7 +141593,7 @@ lfL oGK oGK oWo -oGK +oWo oWo oGK oGK @@ -141623,7 +141731,7 @@ aKt jdL qHM jdL -xDH +lpA ycW xva ivt @@ -141637,7 +141745,7 @@ oSv lZw aCY fXt -jsm +jzi jrp pJR wfA @@ -141645,14 +141753,14 @@ fya cSK pok rWo -llJ +uND kKx dux -tcB +cGV nEE cyc -qBS -tpZ +rQF +cGV eFU tpZ aad @@ -141691,7 +141799,7 @@ lgf ljT gbt hgJ -mRh +eaL qoR aNG tXA @@ -141712,7 +141820,7 @@ cNH uci jCS gdE -iUO +bRZ qMf jfW gUF @@ -141720,7 +141828,7 @@ ltg xeX qkj qMf -vaE +lLW rKL gnj cjs @@ -141733,19 +141841,19 @@ epU hWJ eQo aSU -uDo +kdM oGK taN uLe qCp -wHF +nAy oGK qDj cUU -nbx +kMN wvp cus -sjs +nOk oGK oGK vNn @@ -141867,9 +141975,9 @@ azE ffk qYN ind -riO +ksI qHQ -lyC +mVI vno aad aad @@ -141894,7 +142002,7 @@ dIE dIE omk dIE -fpZ +hQs aJE krp krp @@ -141903,22 +142011,22 @@ krp krp aJE mtL -kKx -iXd -eYt -hzs -tNn +tcB +rWo +cGV +cGV +cGV +cGV cGV -tpZ jRc tpZ aaa lhY -hsU +fAB qKc uYm sJr -ikC +bMI lhY aaa mjz @@ -141969,15 +142077,15 @@ rkJ nZi bgA uKf -ebn +gEJ qMf tbQ vbr cXb -uWi +qSn nhi qMf -apw +pLe wKM qIf pat @@ -141992,11 +142100,11 @@ hlj tFG eKi oGK -fXi +klm utS qCp wHF -cuM +ucT sOs jAf stx @@ -142004,7 +142112,7 @@ aMK vaL dFg dgh -kuF +qTR rsG vNn vNn @@ -142159,33 +142267,33 @@ jmp iWR gkP krp -kTs +llJ ljQ guj eYt nhj owZ -wwk +bLN tpZ -elO +eFU tpZ aaa lhY -vsp +uvJ qKc iYp sJr -gJA +wPT lhY aaa mjz guK mjz jJx -edV +vki mes erX -eDc +jpl ljd cPS iVq @@ -142198,8 +142306,8 @@ vwO vwO vwO vwO -kng -nXo +myj +jOe iVq rEg crR @@ -142234,18 +142342,18 @@ xYW qMf qMf qMf -kXc +gTO wKM jUf -lCK +kzP dtn -hiy +kEN pqm eBn mTc irU evp -xYS +ckO mLV kdC oGK @@ -142407,32 +142515,32 @@ egU jPz egU uPk -dmu +awl aDg krp cAF qqx xPf xZC -iIj +aiF aJE jCu -iio -mDm +rUi +kTs sgK -mDm +iio gco hkn -tpZ +qyX cwK tpZ aaa lhY -wQy +qea eQr rgL eQr -jMq +jeZ lhY aaa mjz @@ -142442,7 +142550,7 @@ mjz erX erX erX -pKm +wnQ sGx bjR iVq @@ -142645,7 +142753,7 @@ vno aad oeX bRV -all +agH agH axr vQh @@ -142671,15 +142779,15 @@ hoO rBe osw qZD -eGC +qrG aJE dPC usJ -nhj -mDm -mDm +iXd +elO +hzs uOk -pPp +bhJ tpZ tpZ tpZ @@ -142712,10 +142820,10 @@ nez cHg uzv cBN -tXa +qvF nXo iVq -lRk +vBa crR iee iYi @@ -142901,12 +143009,12 @@ pzS vno aad kic -tcT +vcz kic kic -kLA +xBu mvv -aFB +fkS kic aad aad @@ -142932,8 +143040,8 @@ vMd tgX jfO jBM +tNn xVv -ftS dXs rgC tDD @@ -143034,7 +143142,7 @@ iVt xDd slr oQM -mmM +xlC olR vNn qYo @@ -143159,7 +143267,7 @@ vno aad oeX sZt -msj +fQL oGq xBu rum @@ -143207,7 +143315,7 @@ aad aaa aaa dCk -hoe +eiW iUz wdO jYC @@ -143217,7 +143325,7 @@ wnQ ljd rdP iVq -jVE +aKq cgV vAP udm @@ -143227,7 +143335,7 @@ qBp fuG rrF vSo -nob +fjk iVq klc crR @@ -143239,7 +143347,7 @@ bEK iYi iYi cao -foy +qzj aJG uvt jeg @@ -143438,11 +143546,11 @@ aaa aaa aad ljS -aPo +szZ bdF wob -sWD -eqH +eZV +oFI tgX aad rWo @@ -143467,14 +143575,14 @@ oIU kJb qud kdY -xEJ +ffQ kBb dCk rTO ljd eMG iVq -akT +gCQ wJd kam izo @@ -143526,15 +143634,15 @@ jEh ovf mkQ qMf -qNc +emK tUd kgA -hyU +fsJ kZc jmc mnK oGK -jGw +dMQ ocH gYo lEn @@ -143705,7 +143813,7 @@ aaa gME rYR hYO -mSp +aFH gME aaa aaa @@ -143724,8 +143832,8 @@ oIU pDS dbd qgQ +dnH uja -ffQ oIU rTO ljd @@ -143929,9 +144037,9 @@ aaa aac aad kic -wfV -qye -hMn +yhv +tcd +qCr ocO kqQ nou @@ -143992,12 +144100,12 @@ aOQ qTK smF xJF -cAH +omU laJ smF fkt jmT -hZC +gkW ghq iVq nMd @@ -144052,7 +144160,7 @@ sRC oGK ckE lEn -igN +ltO aYO bAO kDo @@ -144060,7 +144168,7 @@ myg oCU bEP wKc -rjN +mSc rsG vNn vNn @@ -144271,7 +144379,7 @@ fQi lDI ehg dfZ -oAn +aaR nHY ukv nHY @@ -144297,10 +144405,10 @@ lIV lrr qMf dBw -ieT +aOO ghC ghC -oXe +lPd jeU mqb cXs @@ -144308,14 +144416,14 @@ oWo gFo oGK bTa -lEn +dJW oGK nei lRq -wAu +uvT fSU iNW -ifC +nkV oGK oGK vNn @@ -144468,7 +144576,7 @@ aad ofx udI tpE -lRI +olI ilx ofx aad @@ -144504,7 +144612,7 @@ qkf tGt lCy gbK -fGf +xXU qAr vmM rYA @@ -144526,9 +144634,9 @@ szh dfZ ptI kHk -eAA +oaZ dfZ -mWD +dsl nHY phX lLJ @@ -144558,7 +144666,7 @@ uwn xLK hsC lpG -ezZ +bWN kZc kZc oGK @@ -144569,7 +144677,7 @@ kcp oGK oGK vNn -oGK +vNn vNn oGK oGK @@ -144749,10 +144857,10 @@ aaa aaa aaa dCk -css +cnp uzz uYp -hfG +xWR hQJ dCk rTO @@ -144775,13 +144883,13 @@ bEY sDe acs hzC -hOZ +kTG oCP mWE peW qaV dfZ -mOy +dXw aIC qEj dfZ @@ -144808,9 +144916,9 @@ tFQ wZE wZE wAN -qNw +iVG qMf -ryx +gHE hxS azo sQp @@ -145020,7 +145128,7 @@ jvs pLR gXc pwx -ctr +lhp rYA icD nfC @@ -145032,7 +145140,7 @@ oOx nVB xCF mgX -kbQ +fjP oCP tTM nMG @@ -145068,10 +145176,10 @@ krx bDP qMf dKz -weu +dpO asS iVj -ubT +dmU tdC kZc mVY @@ -145319,7 +145427,7 @@ wZE vtM gKc suE -fYh +uKA wZE qaw qMf @@ -145532,11 +145640,11 @@ uvR tGt mDR qwP -hCM +vrP gez pal rYA -jWe +gdA hjQ rYA jif @@ -145547,7 +145655,7 @@ nsd hLf mJJ kcn -qFI +eeX uDq woZ oCP @@ -145562,10 +145670,10 @@ bwr nxR lLJ nHY -tvj +ncY qLT gDV -rQN +dwE kJO vqH vrk @@ -145581,14 +145689,14 @@ gmD krx qMf ccj -fts +vnd dIU cBv -udj -xla +lkI +qZq tgw edd -mVY +vsB qKs rVG aCz @@ -145785,7 +145893,7 @@ dCk dCk nMg fdR -lBr +bGl tGt irl irl @@ -145810,7 +145918,7 @@ fVh kTi gwd kZt -qBK +kZt rji xIu cao @@ -145850,7 +145958,7 @@ lWm oRH vQe ryR -uBA +pKi brb aaa aaa @@ -146036,18 +146144,18 @@ iIz wsC mVO nHs -ijK +lkS nHs nHs whm sQL huv -qKu -nFq +iNY +awj vMj tEK -wVO -wHr +gBs +xzH dth ddC ajq @@ -146107,7 +146215,7 @@ aWA cVh kgf cVh -wZb +uuP brb uDI aaa @@ -146338,14 +146446,14 @@ gDV onk xfi eNP -txt +jso qVk qMf uDB feV wZE xvr -qml +rmI tJB vTn wZE @@ -146550,11 +146658,11 @@ xxF kCa lim lim -kUN +uZM lim lim lim -kUN +uLf grp mJq bBK @@ -146575,14 +146683,14 @@ puK hLf tAS tKf -cEx -nwl +aCN +fCo aWU kTi mtk lMF jyP -kCP +kgt hRI wmE kTi @@ -146609,7 +146717,7 @@ wZE kwK qMf vzT -qZg +mvw tBQ uOR nIQ @@ -146797,12 +146905,12 @@ rJt mXD lwh fRn -oDJ +arJ rJt -bRh +sgA vhH oux -uNA +kws rJt hOz hOz @@ -146843,7 +146951,7 @@ xIu xIu xIu xIu -xUn +aSJ gri nXH uhX @@ -146874,11 +146982,11 @@ iLr hTR stK bli -vhN +hmQ wCv -ebp +flE gcB -iFu +jNZ liQ brb aaa @@ -147077,7 +147185,7 @@ aPx gIn amH dth -xsr +pdA iJf ijP rYA @@ -147101,13 +147209,13 @@ tYs mPo yaI xgA -tMe +lru nXH ckP oaj cbA pCY -iOX +fED pWX fWr cbA @@ -147131,11 +147239,11 @@ iLr iLr iLr rPY -mrR -uYK -xhf +ovc +wzY +cYP gcB -fMj +rIl cfy dHN aaa @@ -147299,7 +147407,7 @@ vtt jrA xPo krO -tPF +pUP vgQ nBC xfR @@ -147345,7 +147453,7 @@ nSU fse fAz cUe -mfY +lhk oCP rqa ibo @@ -147388,9 +147496,9 @@ iLr xih uwc rPY -cvY -iqd -xqT +wCr +jyc +ivb gcB brb brb @@ -147555,7 +147663,7 @@ qIH qIH qIH hws -jss +lGg qIH vgQ vgQ @@ -147604,7 +147712,7 @@ vbH gYS lQt oCP -vuy +rUX obO nNq aRZ @@ -147801,14 +147909,14 @@ cKx wDX hlr wDX -tHs +biI iZG bWw kxj wDX xNU hlr -cMf +hzx ygY sYM vyO @@ -147820,8 +147928,8 @@ aub ivK dqs fND -fEa -qSg +ukX +stA mdg hMP sgD @@ -148056,13 +148164,13 @@ vXr jbn xIl obL -amU +pXI xIl gjc pJo xIl aSW -pJo +wGQ xIl sTq pJo @@ -148087,7 +148195,7 @@ nUr sIi pAs dbw -mjG +cOE plh tOP jDB @@ -148341,7 +148449,7 @@ flD cDm owO gdj -afJ +tDt hMP ozm fJq @@ -148362,7 +148470,7 @@ beY qUA odl dzw -aGg +nhC hxY eiU avF @@ -148409,13 +148517,13 @@ waI iTi xzB waI -fGU +ktC jtB vak xHx bEd qvv -wgc +uoW iLr aaa xNe @@ -148574,10 +148682,10 @@ iPK lYv lTv iPK -fXb +mQz lTv iPK -sSv +tTQ lTv cKa nOr @@ -148619,7 +148727,7 @@ pUl xaK hEF dth -uKO +apA vwb mWB avF @@ -148672,7 +148780,7 @@ lBV uEJ lBV dBB -xFO +xNl iLr qYo efQ @@ -148842,9 +148950,9 @@ mSe iCo nYt lET -iIe -uQO -gmr +oWt +mUD +xsj dvh pWT eVE @@ -148866,7 +148974,7 @@ lra nrh nbk mFp -stX +pFg gIB cPF vEV @@ -148883,9 +148991,9 @@ rYA meA ukn rYA -ibS -wiN -kba +pQV +pey +uco yaI tgE bhg @@ -149081,7 +149189,7 @@ aaa qYo aaa mSe -hvT +omW nbw lTv oel @@ -149099,8 +149207,8 @@ mSe iuk uDZ lET -toR -krP +bSX +dMp mjr rSg rfG @@ -149114,7 +149222,7 @@ one tOm vSt kkD -sbD +xto vgK xsW qKX @@ -149134,14 +149242,14 @@ qpz adM uHP dth -fws +kjH vHY rYA vHY hie qbZ riK -eox +kdZ kvM yaI wgE @@ -149357,7 +149465,7 @@ iCo spB lET lET -auu +dJu uui rJR fcE @@ -149389,17 +149497,17 @@ lra cgZ qiM adM -wRU +nWY dth -tQr -ncg +kCT +woh rYA juF juF rYA yaI -pPm -nKe +qkv +nTU yaI xQZ xnF @@ -149437,7 +149545,7 @@ kCR xGN jta waI -gnv +iEa nbc kKl kjC @@ -149598,13 +149706,13 @@ idT uWT qkJ ayH -kPs +doD tWG nWw diC tWG kho -vcf +oLm ddw tUB pcA @@ -149614,7 +149722,7 @@ iCo krO qyK lET -omC +gBA xtf oTg pWT @@ -149626,7 +149734,7 @@ vrz sYN wWH vgK -mEL +wdC lTt jPA vgK @@ -149637,7 +149745,7 @@ ufR xEL oiC siu -mmj +pkX huK fce yhY @@ -149646,7 +149754,7 @@ ufR phL qpz adM -fVj +xTk dth dBH rYA @@ -149656,7 +149764,7 @@ aaa aad vop qqe -kdj +gan yaI fNn uEo @@ -149695,11 +149803,11 @@ dvu oCG nXH cln -stO +udq cma -iDQ -egJ -dJV +fgV +cYG +uOE ruU iLr aad @@ -149875,17 +149983,17 @@ lET lET lET lET -cNP +dtJ aLO sKp tXJ bkN gCV -wbA +uBY vgK -cpA +ljX tLx -tAJ +umd vgK jNM jLm @@ -149900,10 +150008,10 @@ oMZ oDx bPw bLs -kCd +lyh saT cqm -ujt +uAL hEF aad aad @@ -149936,7 +150044,7 @@ nXH nXH aad nXH -vKL +uFH itC udQ cun @@ -150106,7 +150214,7 @@ uHd aaa arw gLT -iwL +wVy eQx gZi gOo @@ -150131,7 +150239,7 @@ qIH aaa aaa cjN -nzw +rFV agb ajc pyW @@ -150170,12 +150278,12 @@ aaa uKw pzN uYX -smo +pGm jMz -nUv +bWn bvT -sxB -aLq +gVh +lmD mJx vNm wgn @@ -150187,9 +150295,9 @@ wVe ezS dVv xbK -gHz +lvi cTW -vbx +dWO uKw aaa nXH @@ -150375,11 +150483,11 @@ iOc fwL bez iDC -kpB +drH fiO uuf bGi -xPz +cRo qWZ sgh lTJ @@ -150405,7 +150513,7 @@ fqs fHX dEZ bLs -nlZ +dQC uVJ lHb lHb @@ -150417,7 +150525,7 @@ cdr jhr osc adM -jxM +hci hEF aad aad @@ -150627,9 +150735,9 @@ vxr upM ibb bDw -jMs +tYR iOc -lqT +bAp iOc sIR nnW @@ -150640,7 +150748,7 @@ lAj vxs kiB krO -kSg +vRz qIH aaa aaa @@ -150665,9 +150773,9 @@ bLs iRi nIV ale -nEW -mZH -alc +vyj +snW +auW gFF pIX cdr @@ -150884,14 +150992,14 @@ diC vTP aNd qkJ -pZA +qwQ iOc iOc iOc iOc iOc lAj -dsw +cSi cSF nOT vxs @@ -150913,7 +151021,7 @@ kVE vgK mrD tAd -uPg +mxn iDq sRd jNM @@ -150921,9 +151029,9 @@ sRd bLs aqW aEs -jyx -wow -mmx +iaT +pUY +tVw nmT dwU wtB @@ -150949,7 +151057,7 @@ rIn hJG keq dLF -wtE +sYw tct sjz yax @@ -151145,16 +151253,16 @@ xxf bPF hmr jOw -aNz -xmk +dTl +bsS lAj -axa +qMv kFN kgO hjJ iCo krO -eWL +ndY qIH aaa aaa @@ -151207,7 +151315,7 @@ hJG eUT dLF oHw -cZU +uvi sjz lEp tZJ @@ -151391,7 +151499,7 @@ uHd aaa arw wAt -jAp +tGW czg tYo iiy @@ -151406,7 +151514,7 @@ tse awT lAj sVe -kof +wSh cWX aWu iCo @@ -151435,11 +151543,11 @@ aad bLs bLs gPh -xWI +oGM vhx gYv -tdv -pFH +lIy +uro bLs bLs aaa @@ -151652,10 +151760,10 @@ idT idT hHi pGj -nIr +fLv sMN bLP -gER +gdt bPF sOS bnU @@ -151673,13 +151781,13 @@ aaa aad aaa kOA -vji +nKE cLX aNq oYp aNq ida -gEp +psx kOA aaa qYo @@ -151914,7 +152022,7 @@ ntc gQZ gQZ gQZ -eIs +myG mvF sze eqa @@ -152166,19 +152274,19 @@ qYo qYo ivM pWb -shc +clj eYK -hmO +vvA liv gQZ -rac +ezR bgE gzj ljD lAj mvs -iNf -uin +akW +fFo vos lCQ krO @@ -152245,7 +152353,7 @@ mfC uKw fNN kBR -wxQ +cUn uKw qYo qYo @@ -152426,7 +152534,7 @@ fIW fYO eYK qEw -ewL +oqR gQZ eWh tXL @@ -152446,7 +152554,7 @@ aad bRF jst cLX -kVe +lPv hHt aVo ida @@ -152490,10 +152598,10 @@ qYo hVE aaa uKw -pgJ +ntP omZ omZ -aMb +riH uKw aaa spV @@ -152679,7 +152787,7 @@ aaa aaa aaa ivM -kRw +xeY fTS izM pgo @@ -152687,11 +152795,11 @@ cul gQZ ubL mAA -kxm +cOc dwC eHO bJx -mor +nsV dXF eHO fEh @@ -152701,13 +152809,13 @@ aad aaa aad kOA -azV +raQ dmB bkn kTQ lfD uoK -rqn +bBh kOA aaa lvw @@ -152959,11 +153067,11 @@ qIH aad kOA kOA -uQi +gIw huI fbW okz -cjI +euf kOA kOA aad @@ -153200,9 +153308,9 @@ aaa aaa aaa bCC -nOz +fEd aqq -hhn +rIM oHS swn aAA @@ -153282,7 +153390,7 @@ aaa aaa qYo kUH -dVe +yhJ yhJ vVc vVc @@ -153475,7 +153583,7 @@ aaa kOA gxW aNq -fXs +shM aNq rON kOA @@ -153714,9 +153822,9 @@ aad aaa aaa bCC -xFh +pTT lyd -hhn +rnf fmY jxg iGx @@ -153734,7 +153842,7 @@ vCU bil wae pQd -vpq +jjW kOA aad aad @@ -153977,7 +154085,7 @@ eHO eHO edh gku -mZA +oML eHO tuW jDY @@ -153987,7 +154095,7 @@ aaa aad aaa kOA -atM +gjG xtj iHy yfO @@ -154232,8 +154340,8 @@ qYo qYo aaa eHO -hGB -pdF +skQ +rju rQv eHO riQ @@ -155574,10 +155682,10 @@ qYo hVE aaa uKw -kQz +nVH omZ omZ -hGg +urF uKw aaa spV @@ -155852,9 +155960,9 @@ aaa aaa uUW uUW -iGe +srg okC -tfR +mCa uUW uUW qYo @@ -156603,7 +156711,7 @@ efQ qYo mfC bdz -rks +sBM iad cit mfC @@ -156623,9 +156731,9 @@ aaa dNn mUL wmc -mSM +mOA czi -pEf +oAc bWT mUL dNn @@ -156880,9 +156988,9 @@ aaa aaa uUW uUW -ujp +ois ltZ -mMW +awi uUW uUW aaa diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index bfdb0637b9355..6aa6f43864314 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -36,11 +36,17 @@ /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, /area/station/security/prison/safe) -"aaT" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green, -/turf/open/floor/carpet/red, -/area/station/commons/vacant_room/office) +"aaW" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Port Hallway West" + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"aaX" = ( +/obj/structure/chair/sofa/bench/right, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "abb" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 5 @@ -50,13 +56,19 @@ "abe" = ( /turf/open/floor/engine, /area/station/science/xenobiology) -"abu" = ( -/obj/effect/turf_decal/stripes/corner{ +"abv" = ( +/obj/effect/turf_decal/loading_area{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) +"abz" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, -/obj/effect/turf_decal/stripes/corner, /turf/open/floor/iron, -/area/station/hallway/secondary/entry) +/area/station/cargo/miningdock) "abB" = ( /obj/item/clothing/head/helmet/skull, /turf/open/misc/asteroid/snow/icemoon, @@ -93,10 +105,6 @@ /obj/structure/table/wood, /turf/open/floor/wood, /area/station/maintenance/port/aft) -"ack" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) "acr" = ( /obj/structure/table/wood, /obj/effect/spawner/random/entertainment/gambling, @@ -104,14 +112,6 @@ /obj/machinery/status_display/evac/directional/west, /turf/open/floor/iron/grimy, /area/station/commons/lounge) -"act" = ( -/obj/machinery/porta_turret/ai{ - dir = 4; - installation = /obj/item/gun/energy/e_gun - }, -/obj/machinery/light/directional/west, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat/hallway) "acw" = ( /obj/machinery/camera{ c_tag = "Starboard Primary Hallway Center East" @@ -132,52 +132,54 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) -"acM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +"ade" = ( +/obj/structure/table/glass, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/item/reagent_containers/cup/bottle/epinephrine, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = 6 }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ +/obj/item/reagent_containers/syringe, +/obj/effect/turf_decal/tile/blue/full, +/turf/open/floor/iron/large, +/area/station/medical/treatment_center) +"adq" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ dir = 4 }, -/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/dark, -/area/station/service/chapel/office) +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "adD" = ( /obj/structure/railing/corner{ dir = 8 }, /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) -"adT" = ( -/obj/structure/light_construct/directional/north, -/obj/effect/spawner/random/structure/closet_private, -/obj/effect/turf_decal/siding/blue{ - dir = 4 +"adY" = ( +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "xenobiomain"; + name = "Containment Blast Door" }, -/obj/structure/sign/poster/ripped/directional/north, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/maintenance/port/fore) -"adW" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) +/turf/open/floor/plating, +/area/station/science/xenobiology) "aee" = ( /obj/structure/ladder, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/aft/lesser) -"aeg" = ( -/obj/machinery/porta_turret/ai{ +"ael" = ( +/obj/effect/turf_decal/siding/thinplating_new/corner{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating_new{ dir = 4 }, -/obj/structure/sign/warning/secure_area/directional/east, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "aen" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 5 @@ -195,6 +197,14 @@ /obj/effect/turf_decal/tile/green, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) +"aes" = ( +/obj/machinery/computer/cargo, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/command/heads_quarters/qm) "aey" = ( /obj/machinery/camera/directional/east{ c_tag = "Xenobiology Pens - Starboard Fore"; @@ -207,10 +217,33 @@ /obj/item/clothing/mask/gas, /turf/open/floor/iron/smooth, /area/mine/living_quarters) +"aeQ" = ( +/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{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "aeV" = ( /obj/structure/sign/warning, /turf/closed/wall, /area/station/maintenance/port/fore) +"afl" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/firealarm/directional/north, +/obj/structure/cable, +/turf/open/floor/iron, +/area/mine/production) +"afn" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "afp" = ( /obj/machinery/air_sensor/nitrogen_tank, /turf/open/floor/engine/n2, @@ -232,6 +265,15 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/mining, /turf/open/floor/iron/large, /area/mine/mechbay) +"afv" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/iron/white/smooth_large, +/area/station/service/kitchen/diner) "afz" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, @@ -242,6 +284,14 @@ dir = 4 }, /area/station/engineering/lobby) +"afR" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{ + dir = 10 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron, +/area/station/engineering/atmos) "afU" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -258,12 +308,6 @@ /obj/structure/table/wood, /turf/open/floor/wood/tile, /area/station/service/theater) -"agh" = ( -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/commons/locker) "agk" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -307,6 +351,10 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/security/armory) +"agG" = ( +/obj/structure/sign/poster/official/random/directional/east, +/turf/open/floor/iron/grimy, +/area/station/hallway/secondary/entry) "agI" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -324,15 +372,6 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"agO" = ( -/obj/structure/sign/poster/official/safety_report/directional/west, -/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) "agY" = ( /obj/machinery/door/poddoor/shutters/window/preopen{ dir = 1; @@ -395,6 +434,14 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, /area/station/service/chapel) +"aiA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/spawner/random/trash/mess, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "aiH" = ( /obj/structure/table, /obj/item/folder/white, @@ -407,12 +454,6 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/project) -"aiN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/light/built/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "aiT" = ( /obj/structure/sign/warning/electric_shock, /turf/closed/wall/r_wall, @@ -520,6 +561,13 @@ /obj/structure/chair/stool/directional/east, /turf/open/floor/iron, /area/station/commons/dorms) +"akK" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/grimy, +/area/station/commons/vacant_room/office) "akL" = ( /obj/effect/turf_decal/bot{ dir = 1 @@ -535,6 +583,14 @@ /obj/effect/turf_decal/weather/snow/corner, /turf/open/floor/glass/reinforced/icemoon, /area/icemoon/surface/outdoors/nospawn) +"akZ" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/flora/bush/jungle/a/style_random, +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/misc/ashplanet/wateryrock{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + }, +/area/station/security/prison/rec) "alb" = ( /obj/structure/transit_tube_pod, /obj/structure/transit_tube/station/reverse/flipped{ @@ -570,16 +626,12 @@ /turf/open/floor/wood, /area/station/security/prison/rec) "alD" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/effect/turf_decal/siding/yellow{ - dir = 8 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 }, -/obj/item/kirbyplants/random, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) +/obj/effect/turf_decal/siding/thinplating_new/corner, +/turf/open/floor/iron/large, +/area/station/hallway/secondary/entry) "alK" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/machinery/power/port_gen/pacman, @@ -652,16 +704,6 @@ /obj/structure/curtain, /turf/open/floor/iron/showroomfloor, /area/station/security/prison/toilet) -"amD" = ( -/obj/structure/rack, -/obj/effect/spawner/random/clothing/costume, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/maintenance/port/fore) "amE" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -721,23 +763,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) -"anG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"anI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/status_display/ai/directional/west, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "anK" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -761,17 +786,24 @@ dir = 1 }, /area/station/command/heads_quarters/rd) -"anY" = ( -/obj/structure/sign/warning/no_smoking/directional/south, -/obj/machinery/light/directional/south, -/turf/open/floor/circuit/telecomms/mainframe, -/area/station/tcommsat/server) "anZ" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 4 }, /turf/open/floor/plating, /area/station/engineering/lobby) +"aog" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/command/bridge) +"aol" = ( +/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, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron, +/area/station/command/heads_quarters/hop) "aoo" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -800,11 +832,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/dorms) -"aoK" = ( -/obj/structure/table, -/obj/item/toy/cards/deck, -/turf/open/floor/iron, -/area/station/commons/locker) "aoP" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -847,6 +874,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/service) +"apq" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/thinplating_new/corner{ + dir = 8 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron, +/area/station/commons/locker) "apt" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 4 @@ -862,17 +898,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"apz" = ( -/obj/structure/table/wood, -/obj/item/storage/fancy/cigarettes{ - pixel_y = 2 - }, -/obj/item/lighter/greyscale{ - pixel_x = 4; - pixel_y = 2 - }, -/turf/open/floor/iron/grimy, -/area/station/hallway/secondary/entry) "apB" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 4 @@ -893,27 +918,6 @@ }, /turf/open/floor/iron, /area/station/command/gateway) -"apL" = ( -/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/red/half/contrasted, -/turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) -"apM" = ( -/obj/machinery/airalarm/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/robotics/mechbay) "apS" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -938,14 +942,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"apZ" = ( -/obj/structure/tank_holder/extinguisher, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) "aqa" = ( /obj/machinery/door/airlock/external{ glass = 1; @@ -970,14 +966,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) -"aqy" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/external, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "aqB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -987,6 +975,12 @@ }, /turf/open/floor/iron, /area/station/command/bridge) +"aqK" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "aqQ" = ( /obj/structure/table, /obj/item/stack/package_wrap, @@ -1000,21 +994,6 @@ }, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) -"aqT" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "garbage" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"aqU" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/hallway) "arb" = ( /obj/structure/table, /obj/item/folder/red, @@ -1059,11 +1038,13 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/office) -"arO" = ( -/obj/structure/table, -/obj/effect/spawner/random/entertainment/dice, +"arG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/airalarm/directional/east, +/obj/structure/cable, /turf/open/floor/iron, -/area/station/commons/locker) +/area/station/hallway/secondary/entry) "arT" = ( /obj/machinery/computer/security/labor{ dir = 4 @@ -1091,6 +1072,16 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"asm" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/entry) "asy" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -1108,20 +1099,23 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"asL" = ( -/turf/open/floor/iron/freezer, -/area/station/medical/break_room) +"asJ" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/turf/open/floor/iron, +/area/station/service/hydroponics) "asM" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/project) -"asO" = ( -/obj/structure/chair/stool/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/maintenance/port/fore) "asZ" = ( /obj/machinery/door/airlock/research{ name = "Robotics Lab" @@ -1132,6 +1126,23 @@ /obj/effect/mapping_helpers/airlock/access/all/science/robotics, /turf/open/floor/iron/white, /area/station/science/robotics/lab) +"atb" = ( +/obj/structure/table/glass, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/item/storage/medkit/o2{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/medkit/o2, +/obj/item/storage/medkit/regular{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/effect/turf_decal/tile/blue/full, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/storage) "atc" = ( /obj/structure/fence{ dir = 1 @@ -1147,6 +1158,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_dark, /area/station/security/prison) +"atj" = ( +/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/siding/wood, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/stone, +/area/mine/eva/lower) "atl" = ( /obj/machinery/duct, /obj/machinery/holopad, @@ -1199,14 +1218,27 @@ /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, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark/textured, /area/station/hallway/primary/port) -"auq" = ( -/obj/structure/ladder, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/dark/textured_large, -/area/station/maintenance/department/medical/central) +"aud" = ( +/obj/structure/closet/secure_closet/miner, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/cargo/miningdock) +"aui" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron/large, +/area/station/hallway/secondary/entry) "aus" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -1273,6 +1305,14 @@ }, /turf/open/floor/wood, /area/station/hallway/secondary/service) +"auX" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/chapel) "avb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -1297,11 +1337,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) -"avr" = ( -/obj/machinery/light/directional/east, -/obj/machinery/status_display/ai/directional/east, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) "avP" = ( /obj/effect/turf_decal/bot, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -1309,13 +1344,6 @@ }, /turf/open/floor/iron, /area/mine/laborcamp) -"avW" = ( -/obj/machinery/recharger, -/obj/structure/table, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) "awa" = ( /turf/open/openspace, /area/station/science/ordnance) @@ -1324,20 +1352,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/ai_monitored/security/armory/upper) -"awh" = ( -/obj/effect/decal/cleanable/blood/gibs/old, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"awk" = ( -/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/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "awn" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -1363,7 +1377,9 @@ /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/structure/disposalpipe/junction{ + dir = 4 + }, /turf/open/floor/iron, /area/station/hallway/primary/port) "awK" = ( @@ -1389,6 +1405,23 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/mix) +"awM" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"awR" = ( +/obj/machinery/conveyor{ + id = "garbage"; + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "axb" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -1409,7 +1442,7 @@ /area/station/science/research) "axf" = ( /obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/obj/machinery/modular_computer/console/preset/id, +/obj/machinery/modular_computer/preset/id, /turf/open/floor/iron, /area/station/command/bridge) "axm" = ( @@ -1446,6 +1479,12 @@ }, /turf/open/floor/iron/freezer, /area/station/command/heads_quarters/captain) +"axC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/bookcase/random, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "axD" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -1457,14 +1496,6 @@ /obj/effect/spawner/random/structure/billboard/nanotrasen, /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) -"axM" = ( -/obj/machinery/light/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Atmospherics - West" - }, -/obj/machinery/status_display/evac/directional/east, -/turf/open/floor/iron, -/area/station/engineering/atmos) "axN" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, @@ -1498,13 +1529,17 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/engineering/lobby) -"aym" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/red{ +"ayk" = ( +/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/textured, -/area/station/security/brig) +/obj/machinery/duct, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "ayq" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "atmos-entrance" @@ -1525,6 +1560,26 @@ }, /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) +"ayI" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 5 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"ayR" = ( +/obj/machinery/airalarm/directional/east, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/structure/table/glass, +/obj/item/folder/white, +/obj/item/stamp/head/cmo, +/obj/item/clothing/neck/stethoscope, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/cmo) "azf" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -1564,6 +1619,23 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/engine_equipment, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"azN" = ( +/obj/structure/rack, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = 5; + pixel_y = -2 + }, +/obj/item/tank/internals/emergency_oxygen{ + pixel_y = 3 + }, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/radio/intercom/directional/west, +/obj/structure/cable, +/obj/effect/turf_decal/delivery/red, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/secondary/entry) "azU" = ( /obj/structure/table/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -1594,18 +1666,10 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"aAc" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/obj/structure/chair/sofa/corp/right{ - dir = 4; - pixel_x = -4; - pixel_y = 8 - }, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/iron/grimy, -/area/station/service/bar/atrium) +"aAf" = ( +/obj/machinery/incident_display/delam, +/turf/closed/wall/r_wall, +/area/station/command/bridge) "aAi" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/table/wood/fancy/red, @@ -1623,12 +1687,6 @@ }, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai_upload) -"aAu" = ( -/obj/machinery/light/directional/west, -/obj/structure/closet/wardrobe/grey, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/commons/locker) "aAv" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -1647,19 +1705,46 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/cargo/lobby) +"aBi" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/table/glass, +/obj/machinery/fax{ + fax_name = "Chief Medical Officer's Office"; + name = "Chief Medical Officer's Fax Machine" + }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/cmo) "aBx" = ( /obj/effect/decal/cleanable/plasma, /obj/effect/landmark/blobstart, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) "aBQ" = ( /obj/effect/landmark/blobstart, /obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron, /area/station/maintenance/port/aft) "aBR" = ( /turf/open/genturf/blue, /area/icemoon/surface/outdoors/noruins) +"aBT" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/external, +/turf/open/floor/plating, +/area/station/commons/dorms/laundry) +"aBX" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "aCb" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -1674,6 +1759,13 @@ }, /turf/open/floor/iron, /area/station/cargo/miningdock) +"aCj" = ( +/obj/structure/sign/poster/official/twelve_gauge/directional/north, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron, +/area/mine/laborcamp/security) "aCl" = ( /obj/structure/bodycontainer/morgue{ dir = 8 @@ -1699,20 +1791,23 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"aCJ" = ( -/obj/effect/turf_decal/siding/wood{ +"aCU" = ( +/obj/effect/spawner/random/maintenance, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) -"aDm" = ( -/obj/structure/sign/poster/official/no_erp/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, -/area/station/maintenance/starboard/fore) +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"aCX" = ( +/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, +/turf/open/floor/plating, +/area/station/engineering/storage/tech) "aDo" = ( /obj/structure/chair/office{ dir = 4 @@ -1721,10 +1816,13 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/wood, /area/station/service/library) -"aDx" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) +"aDy" = ( +/obj/machinery/light/directional/south, +/obj/effect/spawner/random/vending/colavend, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "aDJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1732,13 +1830,6 @@ /obj/effect/landmark/start/prisoner, /turf/open/floor/iron/dark/side, /area/station/security/prison) -"aDN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "aDZ" = ( /obj/structure/sign/warning/secure_area/directional/east, /obj/machinery/door/firedoor, @@ -1749,20 +1840,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/command/bridge) -"aEk" = ( -/obj/machinery/light/directional/east, -/obj/item/training_toolbox{ - pixel_y = 5 - }, -/obj/structure/table, -/obj/item/training_toolbox{ - pixel_y = -2 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/fitness) "aEA" = ( /obj/structure/rack, /obj/item/clothing/mask/gas, @@ -1776,14 +1853,16 @@ dir = 1 }, /area/station/command/heads_quarters/rd) +"aEG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/white, +/area/station/science/robotics/lab) "aEM" = ( /obj/structure/sign/departments/cargo, /turf/closed/wall/r_wall, /area/station/cargo/warehouse) -"aEO" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron, -/area/station/cargo/storage) "aES" = ( /obj/structure/table/wood/fancy/blue, /obj/effect/spawner/random/aimodule/neutral, @@ -1804,6 +1883,19 @@ }, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai_upload) +"aET" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=8"; + location = "QM #2" + }, +/obj/effect/turf_decal/bot, +/mob/living/simple_animal/bot/mulebot{ + home_destination = "QM #2"; + suffix = "#2" + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/cargo/storage) "aEU" = ( /obj/effect/turf_decal/tile/neutral/diagonal_edge, /obj/structure/cable, @@ -1832,16 +1924,27 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/atmos) -"aFr" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "aFt" = ( /obj/machinery/dna_scannernew, /turf/open/floor/iron/dark, /area/station/science/genetics) +"aFx" = ( +/obj/structure/rack, +/obj/item/clothing/suit/hooded/wintercoat/eva{ + pixel_y = 9 + }, +/obj/item/clothing/shoes/winterboots/ice_boots/eva{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/effect/turf_decal/delivery/red, +/obj/item/clothing/gloves/color/grey/protects_cold, +/obj/item/clothing/mask/gas, +/obj/structure/sign/nanotrasen{ + pixel_x = -32 + }, +/turf/open/floor/iron/textured, +/area/station/ai_monitored/command/storage/eva) "aFz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1854,6 +1957,17 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) +"aFH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/green/corner{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) "aFJ" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -1911,16 +2025,6 @@ /obj/effect/turf_decal/tile/brown/anticorner/contrasted, /turf/open/floor/iron, /area/station/cargo/office) -"aHL" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "aHT" = ( /turf/closed/wall, /area/station/security/checkpoint/science) @@ -1979,13 +2083,6 @@ /obj/structure/closet/toolcloset, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"aIK" = ( -/obj/structure/closet/toolcloset, -/obj/machinery/status_display/evac/directional/south, -/obj/machinery/light/directional/west, -/obj/structure/sign/poster/official/random/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/storage) "aIN" = ( /obj/machinery/door/window/brigdoor/security/cell{ dir = 8; @@ -2011,10 +2108,6 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"aJi" = ( -/obj/item/paper/fluff/jobs/security/beepsky_mom, -/turf/open/floor/plating, -/area/station/maintenance/fore) "aJm" = ( /obj/structure/cable, /obj/machinery/door/window/left/directional/east{ @@ -2047,6 +2140,14 @@ /obj/item/lighter/greyscale, /turf/open/floor/iron/showroomfloor, /area/station/maintenance/department/medical/morgue) +"aJz" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/cafeteria{ + dir = 8 + }, +/area/station/science/ordnance/office) "aJA" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2059,13 +2160,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"aJL" = ( -/obj/machinery/portable_atmospherics/canister, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage) "aJN" = ( /obj/structure/table/wood, /turf/open/floor/carpet, @@ -2143,6 +2237,16 @@ /obj/structure/altar_of_gods, /turf/open/floor/iron/dark, /area/station/service/chapel) +"aLz" = ( +/obj/machinery/conveyor{ + id = "garbage" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "aLA" = ( /obj/structure/cable, /obj/machinery/door/poddoor/preopen{ @@ -2160,24 +2264,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"aLK" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white/corner, -/area/station/hallway/secondary/entry) "aLM" = ( /obj/machinery/shower/directional/south, /turf/open/floor/iron/showroomfloor, /area/station/security/prison/toilet) -"aLS" = ( -/obj/machinery/modular_computer/console/preset/engineering, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/engine_smes) +"aLO" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/structure/sign/clock/directional/east, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) "aLV" = ( /obj/machinery/bluespace_vendor/directional/south, /turf/open/floor/iron, @@ -2270,13 +2368,6 @@ /obj/structure/sign/nanotrasen, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) -"aNg" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/light/small/directional/north, -/obj/machinery/firealarm/directional/north, -/obj/structure/cable, -/turf/open/floor/iron, -/area/mine/production) "aNq" = ( /obj/effect/turf_decal/caution/stand_clear, /obj/effect/turf_decal/siding/dark_blue, @@ -2311,6 +2402,12 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/service/bar/backroom) +"aOa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "aOd" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -2321,13 +2418,14 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/mine/eva) -"aOo" = ( -/obj/effect/turf_decal/box, -/obj/structure/closet/crate/maint, -/obj/effect/spawner/random/maintenance/six, -/obj/structure/sign/poster/official/wtf_is_co2/directional/north, -/turf/open/floor/iron/dark, -/area/station/maintenance/starboard/aft) +"aOz" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/department/chapel) "aOE" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ @@ -2404,29 +2502,9 @@ /obj/effect/turf_decal/tile/green, /turf/open/floor/iron, /area/station/hallway/primary/central) -"aPr" = ( -/obj/machinery/light/directional/north, -/obj/structure/rack, -/obj/item/clothing/suit/hazardvest, -/obj/structure/sign/warning/no_smoking/directional/north, -/obj/item/clothing/suit/hazardvest, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/clothing/glasses/meson/engine, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/main) "aPD" = ( /turf/closed/wall/r_wall, /area/station/engineering/storage_shared) -"aPI" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Arrivals" - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "aPM" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -2436,6 +2514,13 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics/garden) +"aPN" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/textured, +/area/station/security/warden) "aPV" = ( /obj/effect/spawner/random/trash/mess, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -2470,6 +2555,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/science/ordnance) +"aQy" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/kirbyplants/random/fullysynthetic{ + pixel_x = 10; + pixel_y = 19 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/stone, +/area/mine/eva/lower) "aQJ" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -2526,6 +2621,22 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) +"aRr" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 6 + }, +/obj/structure/bed/medical/anchored{ + dir = 8 + }, +/obj/item/bedsheet/medical{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/medical/virology) "aRt" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 4 @@ -2610,11 +2721,25 @@ /obj/effect/turf_decal/box, /turf/open/floor/iron/dark, /area/station/science/ordnance/office) +"aSC" = ( +/obj/structure/window/spawner/directional/south, +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/structure/railing/corner, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal) "aSH" = ( /obj/machinery/flasher/portable, /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/security/armory/upper) +"aSI" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "aSS" = ( /obj/effect/turf_decal/trimline/dark_red/end, /obj/machinery/meter, @@ -2655,6 +2780,17 @@ /obj/structure/displaycase/captain, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) +"aTE" = ( +/obj/structure/table/reinforced, +/obj/machinery/light_switch/directional/east, +/obj/machinery/reagentgrinder{ + pixel_y = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark/textured_edge{ + dir = 4 + }, +/area/station/medical/chem_storage) "aTG" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -2680,9 +2816,9 @@ "aTJ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; id = "pharmacy_shutters"; - name = "Pharmacy Shutters"; - dir = 4 + name = "Pharmacy Shutters" }, /turf/open/floor/plating, /area/station/medical/pharmacy) @@ -2713,6 +2849,17 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"aUi" = ( +/obj/structure/table, +/obj/item/storage/briefcase{ + pixel_y = 3; + pixel_x = 2 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/storage/wallet, +/obj/item/storage/wallet, +/turf/open/floor/iron, +/area/station/commons/locker) "aUj" = ( /turf/closed/wall/r_wall, /area/station/engineering/storage) @@ -2724,13 +2871,12 @@ /obj/effect/spawner/random/trash/mess, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) -"aUr" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"aUm" = ( /obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) +/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) "aUA" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -2775,6 +2921,27 @@ /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /turf/closed/wall/r_wall, /area/station/engineering/atmos) +"aUY" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/structure/chair/sofa/corp/right{ + dir = 4; + pixel_x = -4; + pixel_y = 8 + }, +/obj/machinery/newscaster/directional/west, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/grimy, +/area/station/service/bar/atrium) +"aVb" = ( +/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, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) "aVe" = ( /obj/machinery/door/airlock/maintenance{ name = "Mining Station Maintenance" @@ -2783,12 +2950,6 @@ /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/cargo) -"aVg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/maintenance/aft/greater) "aVi" = ( /obj/effect/decal/cleanable/generic, /turf/open/floor/plating, @@ -2801,6 +2962,17 @@ }, /turf/open/floor/iron/cafeteria, /area/station/hallway/secondary/exit/departure_lounge) +"aVp" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Mining B-1 Crater Observatory Access" + }, +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/mine/living_quarters) "aVq" = ( /obj/structure/ore_box, /turf/open/misc/asteroid/snow/icemoon, @@ -2816,8 +2988,17 @@ /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 4 }, +/obj/item/radio/intercom/directional/east, /turf/open/floor/iron/dark, /area/station/cargo/miningdock) +"aVF" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/textured, +/area/station/security/brig) "aVH" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/tile/blue/half/contrasted, @@ -2882,12 +3063,6 @@ }, /turf/open/floor/iron, /area/station/ai_monitored/security/armory/upper) -"aWs" = ( -/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_ordmix{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/science/ordnance/burnchamber) "aWD" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -2900,15 +3075,17 @@ /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron/dark, /area/station/tcommsat/computer) -"aWH" = ( -/obj/structure/disposalpipe/trunk, -/obj/machinery/disposal/bin, -/obj/machinery/light/directional/east, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/white/side{ - dir = 9 +"aWI" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood/parquet, +/area/station/service/bar/atrium) +"aWN" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/siding/thinplating_new/corner{ + dir = 1 }, -/area/station/science/lab) +/turf/open/floor/iron/large, +/area/station/hallway/secondary/entry) "aWS" = ( /obj/structure/table, /obj/item/storage/box/donkpockets/donkpocketberry, @@ -2925,23 +3102,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/mine/laborcamp/security) -"aWX" = ( -/obj/structure/chair/comfy/beige{ - dir = 8 - }, -/turf/open/floor/iron/grimy, -/area/station/hallway/secondary/entry) -"aWY" = ( -/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/dark, -/area/station/commons/storage/mining) -"aXM" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/hallway) "aXY" = ( /obj/structure/rack, /obj/item/circuitboard/machine/monkey_recycler, @@ -3036,6 +3196,25 @@ }, /turf/closed/wall/r_wall, /area/station/engineering/supermatter/room) +"aZK" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/table, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/lighter/greyscale{ + pixel_x = 4; + pixel_y = 2 + }, +/obj/effect/spawner/random/entertainment/cigarette_pack{ + pixel_x = 7 + }, +/obj/item/reagent_containers/cup/soda_cans/sol_dry{ + pixel_y = 4; + pixel_x = -7 + }, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/entry) "aZL" = ( /obj/item/kirbyplants/random, /obj/machinery/firealarm/directional/south, @@ -3091,6 +3270,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"baq" = ( +/obj/machinery/modular_computer/preset/civilian{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/random/directional/south, +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) +"bar" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "baA" = ( /obj/structure/cable, /obj/machinery/camera/directional/east{ @@ -3114,14 +3309,6 @@ /obj/effect/mapping_helpers/requests_console/supplies, /turf/open/floor/glass/reinforced, /area/station/science/xenobiology) -"baO" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) "baQ" = ( /obj/machinery/atmospherics/components/trinary/filter/atmos/o2{ dir = 4 @@ -3144,15 +3331,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_large, /area/station/cargo/warehouse) -"bba" = ( -/obj/item/stack/medical/mesh, -/obj/item/wrench/medical, -/obj/machinery/light/directional/east, -/obj/machinery/airalarm/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/structure/table/glass, -/turf/open/floor/iron/white, -/area/station/medical/cryo) "bbo" = ( /turf/open/floor/iron, /area/station/construction) @@ -3203,12 +3381,6 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron/textured, /area/station/security/brig) -"bcn" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "bcx" = ( /obj/machinery/door/airlock/maintenance{ name = "Quartermaster Office Maintenance" @@ -3222,6 +3394,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"bcE" = ( +/obj/structure/rack, +/obj/item/wirecutters, +/obj/item/screwdriver, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/science/xenobiology) "bcN" = ( /turf/closed/wall/r_wall, /area/station/hallway/primary/central) @@ -3233,6 +3416,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "bcT" = ( @@ -3245,18 +3429,6 @@ "bde" = ( /turf/open/floor/plating, /area/station/cargo/storage) -"bdi" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=8"; - location = "QM #2" - }, -/obj/effect/turf_decal/bot, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #2"; - suffix = "#2" - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "bdo" = ( /obj/structure/table/wood, /obj/item/food/grown/poppy{ @@ -3294,27 +3466,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/external, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"bdF" = ( -/obj/structure/table, -/obj/item/flashlight{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/item/clothing/suit/hooded/wintercoat{ - pixel_x = -5 - }, -/obj/item/clothing/suit/hooded/wintercoat/security{ - pixel_x = 5 - }, -/obj/item/clothing/suit/hooded/wintercoat/security{ - pixel_x = 5 - }, -/obj/item/clothing/suit/hooded/wintercoat/security{ - pixel_x = 5 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) "bdJ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3328,34 +3479,37 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) -"bdP" = ( -/obj/effect/turf_decal/siding/white{ - dir = 8 +"bdQ" = ( +/obj/structure/table, +/obj/item/assembly/signaler{ + pixel_y = 8 }, -/obj/structure/chair, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/red/full, -/turf/open/floor/iron/large, -/area/station/service/kitchen/diner) +/obj/item/assembly/signaler{ + pixel_x = -8; + pixel_y = 5 + }, +/obj/item/assembly/signaler{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/item/assembly/signaler{ + pixel_x = 6; + pixel_y = 5 + }, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/office) "bdR" = ( /obj/machinery/telecomms/server/presets/command, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) +"bdS" = ( +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/wood, +/area/station/service/library) "bea" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating/icemoon, /area/station/engineering/atmos) -"beh" = ( -/obj/machinery/firealarm/directional/north{ - pixel_x = -26 - }, -/obj/machinery/light/directional/north, -/obj/structure/chair, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "ben" = ( /obj/machinery/bluespace_beacon, /obj/effect/turf_decal/stripes/line{ @@ -3393,12 +3547,21 @@ }, /area/station/science/ordnance/bomb) "bfa" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/commons/locker) +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/industrial_lift{ + radial_travel = 0 + }, +/obj/structure/railing{ + dir = 5 + }, +/obj/machinery/elevator_control_panel/directional/north{ + linked_elevator_id = "publicElevator"; + preset_destination_names = list("3"="Icemoon Level","4"="Station Level") + }, +/turf/open/floor/plating/elevatorshaft, +/area/mine/storage) "bff" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, @@ -3423,16 +3586,6 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark/textured, /area/station/security/office) -"bfH" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/bluespace_vendor/directional/east, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "bfL" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -3472,6 +3625,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, /turf/open/floor/iron, /area/station/engineering/atmos/storage/gas) +"bfZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/half{ + dir = 4 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/half{ + dir = 1 + }, +/area/station/hallway/secondary/service) "bgd" = ( /obj/structure/reagent_dispensers/plumbed, /turf/open/floor/plating, @@ -3524,6 +3687,20 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/iron, /area/station/maintenance/starboard/fore) +"bgK" = ( +/obj/structure/table, +/obj/item/toner, +/obj/item/hand_labeler, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/storage/box, +/obj/item/storage/box, +/obj/item/storage/box, +/obj/effect/spawner/random/bureaucracy/birthday_wrap, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/iron, +/area/station/cargo/lobby) "bgN" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/cable, @@ -3554,16 +3731,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"bhs" = ( -/obj/effect/turf_decal/siding/wood, -/obj/item/kirbyplants/random/fullysynthetic{ - pixel_x = -8; - pixel_y = 21 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/official/random/directional/west, -/turf/open/floor/stone, -/area/mine/eva/lower) +"bht" = ( +/obj/structure/closet/lasertag/red, +/obj/effect/spawner/random/contraband/permabrig_gear, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/security/prison/workout) "bhw" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -3573,14 +3747,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply, /turf/open/floor/iron/white, /area/station/medical/virology) -"bhK" = ( -/obj/structure/table, -/obj/item/folder/blue{ - pixel_x = 8 - }, -/obj/item/papercutter, -/turf/open/floor/iron, -/area/station/command/heads_quarters/hop) "bhV" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -3637,12 +3803,6 @@ /obj/machinery/light/directional/west, /turf/open/floor/engine, /area/station/science/xenobiology) -"biN" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/machinery/light/directional/south, -/obj/item/kirbyplants/random, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "biR" = ( /obj/structure/table/glass, /obj/item/storage/box/beakers{ @@ -3665,13 +3825,6 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) -"biX" = ( -/obj/machinery/status_display/evac/directional/west, -/obj/machinery/light/directional/west, -/obj/item/kirbyplants/random, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "biY" = ( /turf/closed/wall/r_wall, /area/station/maintenance/port/fore) @@ -3727,10 +3880,20 @@ dir = 4 }, /area/station/security/prison) -"bjE" = ( -/obj/machinery/vending/games, -/turf/open/floor/wood, -/area/station/service/library) +"bjv" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/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/airlock/unres{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "bjN" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3738,6 +3901,12 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron/dark, /area/mine/mechbay) +"bjQ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/large, +/area/station/commons/locker) "bjU" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -3775,6 +3944,14 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/service) +"bkw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "bkC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3790,15 +3967,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/science/explab) -"bkK" = ( -/obj/machinery/requests_console/auto_name/directional/east, -/turf/open/floor/iron, -/area/station/commons/locker) -"bkR" = ( -/obj/machinery/light/directional/south, -/obj/structure/sign/warning/test_chamber/directional/south, -/turf/open/floor/engine, -/area/station/science/genetics) "bkS" = ( /obj/machinery/bci_implanter, /turf/open/floor/iron/white/side{ @@ -3861,11 +4029,11 @@ "bln" = ( /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) -"blq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/locker) +"blA" = ( +/obj/machinery/hydroponics/soil, +/obj/machinery/light/directional/west, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden) "blO" = ( /obj/structure/girder, /turf/open/floor/plating, @@ -3928,15 +4096,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"bmK" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/junction/flip{ - dir = 1 - }, -/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/greater) "bmM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -4025,11 +4184,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/interrogation) -"bnY" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/sign/poster/contraband/random/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "bnZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible/layer2{ dir = 1 @@ -4037,10 +4191,18 @@ /turf/open/floor/iron, /area/station/science/ordnance) "bod" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron/dark/side, -/area/mine/eva/lower) +/obj/structure/closet/crate/wooden, +/obj/item/camera_film{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/camera, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/sign/poster/contraband/the_griffin/directional/south, +/turf/open/floor/iron/grimy, +/area/station/commons/vacant_room/office) "bol" = ( /turf/open/floor/iron/dark/textured, /area/station/security/prison) @@ -4054,11 +4216,6 @@ /obj/structure/closet/firecloset, /turf/open/floor/plating, /area/station/service/kitchen/coldroom) -"boL" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/commons/locker) "boO" = ( /obj/structure/chair/sofa/left/brown{ dir = 8 @@ -4071,6 +4228,18 @@ /obj/machinery/atmospherics/pipe/layer_manifold/supply/visible, /turf/closed/wall/r_wall, /area/station/maintenance/department/medical/central) +"boS" = ( +/obj/structure/disposaloutlet{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "boV" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -4094,6 +4263,15 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron, /area/station/command/bridge) +"bpm" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 4 + }, +/obj/structure/closet/secure_closet/security, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/customs/auxiliary) "bpn" = ( /obj/effect/turf_decal/trimline/neutral/corner{ dir = 8 @@ -4118,10 +4296,22 @@ /obj/machinery/chem_master/condimaster, /turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) +"bpK" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "bpL" = ( /obj/structure/noticeboard/directional/west, /turf/open/floor/engine/cult, /area/station/service/library) +"bpQ" = ( +/obj/machinery/mech_bay_recharge_port, +/obj/structure/cable, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "bpR" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible, /turf/open/floor/iron, @@ -4143,6 +4333,11 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured_edge, /area/station/security/prison) +"bpZ" = ( +/obj/item/radio/intercom/directional/west, +/obj/machinery/chem_dispenser, +/turf/open/floor/glass/reinforced, +/area/station/medical/treatment_center) "bqe" = ( /obj/structure/grille, /obj/effect/mapping_helpers/burnt_floor, @@ -4158,6 +4353,13 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat/hallway) +"bqx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/security/processing) "bqF" = ( /obj/structure/chair{ dir = 4 @@ -4184,14 +4386,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"bqR" = ( -/obj/machinery/vending/wardrobe/sec_wardrobe, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs/auxiliary) "bqY" = ( /obj/structure/closet, /obj/effect/spawner/random/maintenance/two, @@ -4211,6 +4405,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/station/ai_monitored/turret_protected/aisat_interior) +"brp" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "brt" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /turf/open/floor/iron/dark, @@ -4224,20 +4426,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/checkpoint/engineering) -"brC" = ( -/obj/machinery/light/directional/west, -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/locker) "brJ" = ( /obj/structure/chair/stool/directional/south, /obj/effect/landmark/event_spawn, @@ -4251,6 +4439,10 @@ dir = 5 }, /area/station/service/chapel) +"brM" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "brY" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -4263,12 +4455,35 @@ }, /turf/open/floor/plating, /area/mine/eva/lower) +"bsd" = ( +/obj/structure/chair/stool/directional/south, +/obj/structure/sign/poster/official/obey/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/iron, +/area/mine/laborcamp) "bse" = ( /obj/effect/spawner/random/trash/mess, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"bsi" = ( +/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 = 10 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/break_room) "bst" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 6 @@ -4276,11 +4491,8 @@ /turf/open/floor/iron/dark, /area/mine/storage) "bsx" = ( -/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/cargo/miningdock) +/turf/closed/wall, +/area/station/bitrunning/den) "bsG" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/research/glass{ @@ -4299,15 +4511,23 @@ pixel_x = 11; pixel_y = 7 }, -/obj/item/radio/headset/headset_sci{ - pixel_x = -7; - pixel_y = 6 - }, /obj/item/reagent_containers/spray/cleaner{ pixel_x = 2 }, +/obj/item/radio/headset/headset_medsci{ + pixel_x = -7; + pixel_y = 6 + }, /turf/open/floor/iron/dark, /area/station/science/genetics) +"bsO" = ( +/obj/effect/turf_decal/box, +/obj/structure/closet/crate, +/obj/effect/spawner/random/maintenance/two, +/obj/item/wrench, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/iron/dark, +/area/station/maintenance/port/greater) "bta" = ( /obj/structure/chair/sofa/bench/right{ dir = 8 @@ -4324,6 +4544,35 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"btm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/sign/warning/directional/north, +/obj/structure/cable, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) +"btp" = ( +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Service Diner North" + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white/smooth_large, +/area/station/service/kitchen/diner) +"bts" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/construction) "btB" = ( /obj/structure/table, /obj/item/flashlight/lantern, @@ -4336,16 +4585,33 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/large, /area/station/engineering/main) -"btQ" = ( -/obj/machinery/modular_computer/console/preset/curator{ +"btG" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 8 }, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/wood, -/area/station/service/library) +/turf/open/floor/iron, +/area/station/commons/locker) "btU" = ( /turf/closed/wall, /area/station/medical/morgue) +"btW" = ( +/obj/structure/cable, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/hallway/secondary/entry) +"bub" = ( +/obj/machinery/vending/cola/red, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/security/prison) "bum" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, @@ -4375,6 +4641,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"buF" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/chair/sofa/bench/left{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "buW" = ( /obj/structure/lattice, /obj/structure/sign/warning/directional/south, @@ -4398,6 +4671,21 @@ }, /turf/open/openspace, /area/station/medical/treatment_center) +"bvg" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/locker) "bvj" = ( /obj/structure/table, /obj/item/paper_bin, @@ -4405,17 +4693,17 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron, /area/mine/laborcamp/security) +"bvq" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "bvr" = ( /obj/machinery/light_switch/directional/west, /obj/machinery/autolathe, /turf/open/floor/iron, /area/station/cargo/office) -"bvs" = ( -/obj/structure/table, -/obj/item/clothing/suit/apron/chef, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "bvE" = ( /obj/machinery/computer/monitor{ name = "bridge power monitoring console" @@ -4442,6 +4730,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured_large, /area/station/maintenance/department/medical/morgue) +"bvY" = ( +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron, +/area/station/security/brig/upper) "bwe" = ( /obj/effect/mapping_helpers/airlock/locked, /obj/machinery/door/airlock/virology{ @@ -4480,6 +4773,18 @@ }, /turf/open/floor/wood, /area/station/service/library) +"bwn" = ( +/obj/effect/turf_decal/tile/blue, +/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/corner{ + dir = 8 + }, +/area/station/hallway/secondary/entry) "bwr" = ( /obj/machinery/light_switch/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -4565,14 +4870,20 @@ dir = 5 }, /area/station/maintenance/port/aft) -"bxW" = ( +"bxX" = ( +/obj/structure/chair/stool/directional/north, +/obj/structure/sign/poster/official/report_crimes/directional/west, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, /turf/open/floor/iron, /area/mine/laborcamp) +"byd" = ( +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/light_switch/directional/south, +/obj/machinery/camera/directional/south{ + c_tag = "Customs Security Checkpoint" + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/customs/auxiliary) "byk" = ( /obj/structure/sign/painting/library{ pixel_y = 32 @@ -4604,6 +4915,12 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron/white, /area/station/security/prison/safe) +"byv" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/item/trash/semki, +/obj/item/trash/semki, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "byx" = ( /obj/machinery/computer/security/telescreen/entertainment/directional/north, /obj/structure/cable, @@ -4640,14 +4957,14 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron, /area/station/hallway/primary/central) -"bzh" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Cargo Bay Maintenance" +"bzg" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/supply/general, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) "bzn" = ( /obj/machinery/door/airlock{ name = "Kitchen Access" @@ -4664,6 +4981,13 @@ /obj/effect/turf_decal/tile/neutral/diagonal_edge, /turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) +"bzA" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/service/library) "bzB" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/reagent_dispensers/watertank, @@ -4701,12 +5025,6 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/iron/smooth, /area/mine/mechbay) -"bzN" = ( -/obj/structure/rack, -/obj/machinery/light/small/directional/west, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron/smooth_large, -/area/station/cargo/warehouse) "bzQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -4730,16 +5048,24 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/carpet, /area/station/security/prison/rec) -"bAD" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/computer/slot_machine{ - pixel_y = -6 +"bAo" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) +"bAB" = ( +/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/small/directional/west, -/turf/open/floor/wood/parquet, -/area/station/commons/lounge) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "bAF" = ( /turf/open/floor/iron/chapel{ dir = 1 @@ -4763,12 +5089,13 @@ /obj/item/clothing/gloves/color/yellow, /obj/structure/cable, /obj/item/mod/module/plasma_stabilizer, -/obj/item/mod/module/thermal_regulator, /obj/item/stock_parts/cell/emproof{ pixel_x = -4; pixel_y = -1 }, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/mod/module/signlang_radio, +/obj/item/mod/module/thermal_regulator, /turf/open/floor/iron/dark, /area/station/engineering/engine_smes) "bAR" = ( @@ -4799,29 +5126,21 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"bBe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ +"bBb" = ( +/obj/structure/railing{ dir = 4 }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"bBn" = ( -/obj/machinery/door/airlock/security/glass{ - id_tag = "permainner"; - name = "Permabrig Transfer" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "perma-entrance" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/dark/textured, -/area/station/security/execution/transfer) -"bBr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/closed/wall, -/area/station/maintenance/port/fore) +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) +"bBd" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 6 + }, +/obj/effect/landmark/start/station_engineer, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/engineering/lobby) "bBw" = ( /obj/item/trash/sosjerky, /turf/open/floor/plating, @@ -4883,11 +5202,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/command/heads_quarters/cmo) -"bCl" = ( -/obj/machinery/door/firedoor, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/iron, -/area/station/commons/locker) "bCp" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -4941,6 +5255,10 @@ /obj/item/storage/box/monkeycubes, /turf/open/floor/iron, /area/station/science/xenobiology) +"bCQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "bCT" = ( /obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ dir = 1 @@ -4979,11 +5297,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) -"bDp" = ( -/obj/item/airlock_painter, -/obj/structure/closet, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/nospawn) "bDu" = ( /turf/closed/wall/r_wall, /area/station/security/lockers) @@ -5044,18 +5357,28 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"bDZ" = ( -/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/plating, -/area/station/maintenance/port/greater) "bEa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) +"bEd" = ( +/obj/machinery/conveyor_switch/oneway{ + dir = 8; + id = "garbage"; + name = "disposal conveyor"; + pixel_y = 5; + pixel_x = -5 + }, +/obj/structure/railing/corner, +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal) "bEf" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -5077,6 +5400,11 @@ /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) +"bEi" = ( +/obj/structure/sign/poster/official/work_for_a_future/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/mine/laborcamp) "bEo" = ( /obj/structure/sign/warning/secure_area/directional/east, /obj/machinery/light/small/directional/north, @@ -5156,14 +5484,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/engine/n2, /area/station/engineering/atmos) -"bFe" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Security Maintenance" - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/security/general, -/turf/open/floor/plating, -/area/station/security/checkpoint/customs/auxiliary) "bFq" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, @@ -5178,22 +5498,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"bFL" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/cafeteria, -/area/station/hallway/secondary/entry) -"bFP" = ( -/obj/machinery/camera/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white/corner, -/area/station/hallway/secondary/entry) "bFS" = ( /obj/item/crowbar/red, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -5218,6 +5522,15 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) +"bGf" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/red/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/trash/waffles, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "bGm" = ( /obj/machinery/firealarm/directional/south, /obj/structure/filingcabinet/filingcabinet, @@ -5226,29 +5539,11 @@ }, /turf/open/floor/iron, /area/station/command/bridge) -"bGn" = ( -/obj/machinery/door/airlock/engineering{ - name = "Auxillary Base Construction" - }, -/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/access/all/engineering/aux_base, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) "bGA" = ( /obj/effect/spawner/structure/window, /obj/structure/sign/departments/xenobio/directional/south, /turf/open/floor/plating, /area/station/science/xenobiology) -"bGL" = ( -/obj/item/radio/intercom/directional/south, -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "bGP" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/tile/brown/half/contrasted{ @@ -5286,6 +5581,17 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) +"bHG" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood/parquet, +/area/station/service/bar/atrium) "bHI" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -5295,13 +5601,6 @@ }, /turf/open/floor/plating, /area/station/hallway/primary/fore) -"bHL" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/fitness) "bHO" = ( /obj/machinery/light_switch/directional/south{ pixel_x = 6; @@ -5342,31 +5641,43 @@ dir = 4 }, /area/station/ai_monitored/command/storage/eva) -"bIq" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 +"bId" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 4 }, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms/laundry) -"bIs" = ( -/obj/structure/chair/stool/directional/east, -/turf/open/floor/iron/half{ - dir = 1 +/obj/machinery/door/firedoor/heavy, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/science/ordnance) +"bIl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 }, -/area/station/engineering/atmos) +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/visible, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"bIo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/railing/corner/end/flip{ + dir = 8 + }, +/obj/structure/railing/corner/end{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "bIt" = ( /obj/structure/rack, /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"bIB" = ( -/obj/effect/spawner/random/vending/snackvend, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/entry) "bID" = ( /turf/closed/wall/r_wall, /area/station/engineering/lobby) @@ -5395,6 +5706,11 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron, /area/station/command/bridge) +"bIS" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "bIU" = ( /obj/structure/table, /obj/item/stack/sheet/glass/fifty, @@ -5461,9 +5777,17 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/mine/laborcamp) -"bJy" = ( -/turf/open/floor/wood/tile, -/area/station/service/theater) +"bJA" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/multi_tile/public/glass{ + name = "The Girly Boar" + }, +/turf/open/floor/iron/dark/textured_half, +/area/station/service/bar/atrium) "bJD" = ( /obj/machinery/atmospherics/components/trinary/filter/atmos/n2{ dir = 4 @@ -5490,14 +5814,6 @@ }, /turf/open/floor/wood, /area/station/service/library) -"bJZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/iron/dark, -/area/station/maintenance/disposal) "bKm" = ( /obj/machinery/vending/assist, /obj/structure/sign/poster/random/directional/west, @@ -5514,6 +5830,15 @@ /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"bKA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/door/airlock/grunge{ + name = "Vacant Office A" + }, +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/office) "bKI" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/machinery/disposal/bin, @@ -5539,15 +5864,13 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/showroomfloor, /area/station/security/warden) -"bLb" = ( -/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{ - dir = 1 +"bKZ" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/open/floor/iron/dark/side, -/area/station/security/processing) +/area/station/maintenance/port/aft) "bLc" = ( /turf/open/floor/iron/dark/textured_edge{ dir = 1 @@ -5569,6 +5892,10 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/fore) +"bLs" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/secondary/entry) "bLz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -5693,16 +6020,13 @@ }, /turf/open/floor/plating, /area/station/cargo/storage) -"bNx" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 +"bNu" = ( +/obj/item/kirbyplants/random, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/cafeteria{ + dir = 8 }, -/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/plating, -/area/station/maintenance/department/chapel) +/area/station/science/research) "bNy" = ( /obj/item/toy/snowball{ pixel_x = 9; @@ -5744,6 +6068,12 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"bOk" = ( +/obj/structure/rack, +/obj/item/clothing/suit/hazardvest, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/construction) "bOo" = ( /obj/effect/turf_decal/arrows/white{ dir = 4 @@ -5753,18 +6083,6 @@ }, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) -"bOu" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/structure/chair/sofa/corp/left{ - dir = 4; - pixel_x = -4 - }, -/obj/effect/landmark/start/hangover, -/obj/machinery/computer/security/telescreen/entertainment/directional/west, -/turf/open/floor/iron/grimy, -/area/station/service/bar/atrium) "bOy" = ( /obj/structure/window/reinforced/spawner/directional/north{ layer = 2.9 @@ -5782,10 +6100,6 @@ }, /turf/open/floor/plating, /area/mine/living_quarters) -"bOL" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/entry) "bOO" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 8 @@ -5801,24 +6115,20 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) -"bOY" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{ - dir = 10 +"bOX" = ( +/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 }, -/obj/item/radio/intercom/directional/east, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/engineering/atmos) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/port/fore) "bPc" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) -"bPe" = ( -/obj/machinery/light/directional/south, -/obj/item/kirbyplants/random, -/turf/open/floor/iron, -/area/station/security/courtroom) "bPg" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 10 @@ -5854,6 +6164,15 @@ }, /turf/open/floor/iron/dark, /area/station/commons/storage/primary) +"bPs" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "bPt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5874,6 +6193,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/construction) +"bPy" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "bPz" = ( /obj/effect/landmark/blobstart, /turf/open/floor/plating, @@ -5884,12 +6209,10 @@ /obj/effect/turf_decal/tile/green/full, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/virology) -"bPP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) +"bPV" = ( +/obj/item/kirbyplants/random/dead, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/underground/explored) "bPY" = ( /obj/machinery/atmospherics/pipe/multiz/pink/visible{ dir = 8; @@ -5936,6 +6259,16 @@ }, /turf/open/floor/plating, /area/mine/eva/lower) +"bQP" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/red/full, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/large, +/area/station/service/kitchen/diner) "bQS" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -5963,6 +6296,11 @@ /obj/effect/mapping_helpers/airlock/access/all/science/robotics, /turf/open/floor/iron, /area/station/science/robotics/mechbay) +"bRn" = ( +/obj/machinery/computer/warrant, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "bRo" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -5970,29 +6308,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/cargo) -"bRt" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Pod Two" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) "bRz" = ( /obj/machinery/hydroponics/soil{ pixel_y = 8 }, /turf/open/floor/grass, /area/station/maintenance/starboard/aft) -"bRA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) "bRC" = ( /obj/structure/chair/plastic{ dir = 8 @@ -6019,30 +6340,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"bRJ" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) -"bRO" = ( -/obj/structure/rack, -/obj/item/wrench, -/obj/item/crowbar/red, -/turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/atmos) -"bRZ" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/airalarm/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 4 - }, -/area/station/engineering/transit_tube) "bSk" = ( /obj/machinery/door/poddoor/preopen{ id = "Prison Gate"; @@ -6053,6 +6350,30 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron/textured, /area/station/security/brig) +"bSo" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/sign/poster/contraband/random/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/eighties/red, +/area/station/security/prison/safe) +"bSz" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) +"bSG" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/textured, +/area/station/engineering/atmos) "bSH" = ( /obj/effect/landmark/start/hangover, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6109,22 +6430,13 @@ }, /turf/open/floor/iron, /area/station/engineering/main) -"bTI" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics) -"bTZ" = ( +"bTQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/obj/structure/extinguisher_cabinet/directional/east, /obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 4 - }, /turf/open/floor/iron, -/area/station/hallway/primary/starboard) +/area/station/maintenance/disposal/incinerator) "bUa" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -6164,12 +6476,27 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"bUW" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/newscaster/directional/north, +/obj/structure/chair/stool/directional/south, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "bVe" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/chemistry) +"bVn" = ( +/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/contraband/random/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "bVp" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/closet/secure_closet/medical3, @@ -6220,6 +6547,15 @@ }, /turf/open/floor/iron/dark, /area/station/commons/storage/primary) +"bVY" = ( +/obj/machinery/hydroponics/constructable, +/obj/item/seeds/soya, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/mine/laborcamp) "bVZ" = ( /obj/structure/sign/poster/contraband/the_big_gas_giant_truth, /turf/closed/wall, @@ -6244,14 +6580,14 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/iron/dark, /area/station/service/chapel) +"bWy" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/engineering/atmos) "bWK" = ( /turf/open/floor/iron/dark, /area/station/engineering/atmos/project) -"bWL" = ( -/obj/machinery/light/directional/east, -/obj/structure/sign/poster/official/random/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "bWQ" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/engineering/glass{ @@ -6303,6 +6639,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/engine_smes) +"bXx" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/hallway/secondary/entry) "bXy" = ( /turf/open/openspace, /area/station/ai_monitored/security/armory/upper) @@ -6311,17 +6656,21 @@ /obj/effect/spawner/random/techstorage/ai_all, /turf/open/floor/iron, /area/station/engineering/storage/tech) +"bXI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/bluespace_vendor/directional/south, +/turf/open/floor/iron/dark/textured_edge{ + dir = 1 + }, +/area/station/security/prison) "bXL" = ( /obj/machinery/door/firedoor/heavy, /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/white, /area/station/science/research) -"bXR" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, -/turf/open/openspace/icemoon/keep_below, -/area/icemoon/surface/outdoors/nospawn) "bXT" = ( /obj/machinery/camera{ c_tag = "Medbay Storage"; @@ -6337,6 +6686,14 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/dark, /area/mine/mechbay) +"bYg" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/effect/spawner/random/armory/laser_gun, +/turf/open/floor/iron/dark/textured, +/area/station/ai_monitored/security/armory) "bYm" = ( /obj/structure/chair/pew{ dir = 1 @@ -6359,6 +6716,16 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter) +"bYz" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "garbage" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "bYB" = ( /obj/structure/table, /obj/item/storage/box/hug{ @@ -6436,13 +6803,6 @@ }, /turf/open/floor/iron/smooth_half, /area/station/command/heads_quarters/rd) -"bZf" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 5 - }, -/obj/machinery/igniter/incinerator_atmos, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) "bZg" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6460,12 +6820,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison/visit) -"bZu" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/light/directional/east, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "bZx" = ( /turf/open/openspace, /area/station/hallway/primary/fore) @@ -6486,14 +6840,6 @@ /obj/structure/sign/warning/electric_shock/directional/east, /turf/open/floor/iron/textured, /area/station/ai_monitored/command/storage/eva) -"bZG" = ( -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/contraband/random/directional/south, -/turf/open/floor/iron, -/area/station/maintenance/starboard/fore) "bZK" = ( /obj/structure/table, /obj/effect/turf_decal/tile/red, @@ -6507,6 +6853,11 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"cat" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/fore) "caC" = ( /obj/machinery/door/window/right/directional/south{ dir = 8; @@ -6516,16 +6867,25 @@ /mob/living/carbon/human/species/monkey, /turf/open/floor/engine, /area/station/science/genetics) -"caS" = ( -/obj/machinery/light/directional/east, -/obj/machinery/status_display/evac/directional/east, -/turf/open/floor/iron, -/area/station/engineering/atmos) +"caH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/large, +/area/station/hallway/primary/port) "caU" = ( /obj/structure/sign/warning/cold_temp/directional/south, /obj/structure/sign/warning/gas_mask/directional/north, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"caX" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/obj/structure/marker_beacon/burgundy, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "caY" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, @@ -6563,6 +6923,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"cbz" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark/textured, +/area/station/ai_monitored/security/armory) "cbF" = ( /obj/machinery/door/firedoor/heavy, /obj/machinery/door/poddoor/shutters/preopen{ @@ -6575,6 +6939,16 @@ }, /turf/open/floor/iron, /area/station/science/lab) +"cbP" = ( +/obj/machinery/button/door/directional/east{ + id = "xenobio9"; + layer = 4; + name = "Xenobio Pen 9 Blast DOors"; + req_access = list("xenobiology") + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "cbS" = ( /obj/structure/rack, /obj/item/wrench, @@ -6589,18 +6963,6 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/project) -"cck" = ( -/obj/structure/table/glass, -/obj/machinery/light/directional/east, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/item/reagent_containers/cup/bottle/epinephrine, -/obj/item/reagent_containers/cup/bottle/multiver{ - pixel_x = 6 - }, -/obj/item/reagent_containers/syringe, -/obj/effect/turf_decal/tile/blue/full, -/turf/open/floor/iron/large, -/area/station/medical/treatment_center) "ccp" = ( /obj/structure/bed, /obj/item/bedsheet/dorms, @@ -6654,13 +7016,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/storage_shared) -"ccD" = ( -/obj/effect/turf_decal/siding/wood{ +"ccB" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ dir = 4 }, -/obj/machinery/light/directional/north, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) +/obj/effect/mapping_helpers/mail_sorting/supply/disposals, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/port/lesser) "ccQ" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -6670,6 +7033,17 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"ccS" = ( +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/white/side{ + dir = 8 + }, +/area/station/hallway/secondary/entry) "ccT" = ( /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/dark/smooth_edge, @@ -6707,6 +7081,14 @@ }, /turf/open/floor/iron, /area/mine/laborcamp/security) +"cdg" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/grimy, +/area/station/security/detectives_office) "cdl" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -6733,17 +7115,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) -"ceh" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white/corner{ - dir = 1 - }, -/area/station/hallway/secondary/entry) "cek" = ( /obj/structure/grille, /turf/open/misc/asteroid/snow/icemoon, @@ -6782,6 +7153,26 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, /area/station/service/chapel/office) +"ceS" = ( +/obj/machinery/mech_bay_recharge_port{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/turf_decal/siding/white, +/turf/open/floor/iron/smooth, +/area/mine/mechbay) +"ceY" = ( +/obj/machinery/door/poddoor/preopen{ + id = "Disposal Exit"; + name = "Disposal Exit Vent" + }, +/obj/machinery/conveyor{ + id = "garbage"; + dir = 1 + }, +/obj/effect/turf_decal/stripes/red/box, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "cfe" = ( /obj/structure/cable, /obj/machinery/holopad/secure, @@ -6838,16 +7229,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"cfR" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/decal/cleanable/dirt, -/obj/item/seeds/redbeet, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/mine/laborcamp) "cfS" = ( /obj/item/clothing/suit/costume/snowman{ name = "Man of Snow" @@ -6912,6 +7293,13 @@ }, /turf/open/floor/iron/dark, /area/station/service/hydroponics/garden) +"cgz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood/parquet, +/area/station/commons/lounge) "cgC" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -6953,6 +7341,11 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white/smooth_large, /area/station/service/kitchen/diner) +"cht" = ( +/obj/machinery/vending/engivend, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/storage_shared) "chB" = ( /obj/machinery/door/airlock{ id_tag = "Toilet1"; @@ -6992,6 +7385,16 @@ /obj/item/flashlight/lamp, /turf/open/floor/wood/large, /area/mine/eva/lower) +"chP" = ( +/obj/structure/sign/nanotrasen{ + pixel_x = -32 + }, +/obj/structure/marker_beacon/burgundy, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "chQ" = ( /obj/effect/turf_decal/stripes/asteroid/line{ dir = 1 @@ -7010,6 +7413,32 @@ }, /turf/open/floor/plating/elevatorshaft, /area/mine/storage) +"chW" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/chem_master, +/obj/structure/sign/warning/no_smoking/circle{ + pixel_x = -27; + pixel_y = -26 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/glass/reinforced, +/area/station/medical/treatment_center) +"cih" = ( +/obj/machinery/button/door/directional/west{ + id = "chemistry_lower_shutters"; + name = "Chemistry Exterior Shutter Control"; + req_access = list("plumbing") + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "cin" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, @@ -7026,6 +7455,13 @@ }, /turf/open/floor/iron/smooth_half, /area/station/security/brig/upper) +"ciH" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "ciI" = ( /obj/item/radio/intercom/directional/west, /obj/effect/turf_decal/tile/neutral/opposingcorners, @@ -7071,13 +7507,6 @@ /obj/effect/spawner/random/contraband/permabrig_gear, /turf/open/floor/iron/grimy, /area/station/security/prison/work) -"cjG" = ( -/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/yellow/half/contrasted, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) "cjI" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -7110,10 +7539,13 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"cjT" = ( -/obj/structure/sign/poster/official/here_for_your_safety/directional/east, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) +"cjO" = ( +/obj/structure/table, +/obj/item/clothing/shoes/jackboots, +/obj/item/storage/backpack/satchel/leather, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) "ckc" = ( /obj/machinery/door/firedoor, /obj/machinery/camera/directional/south{ @@ -7125,7 +7557,9 @@ /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, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, /turf/open/floor/iron, /area/station/hallway/primary/port) "cks" = ( @@ -7225,6 +7659,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/blue, /area/station/security/prison/work) +"clT" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "clV" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -7237,16 +7679,6 @@ }, /turf/open/floor/iron, /area/station/science/ordnance/testlab) -"clW" = ( -/obj/structure/cable, -/obj/machinery/button/door/directional/west{ - id = "xenobio1"; - layer = 4; - name = "Xenobio Pen 1 Blast Door"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) "clY" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -7258,11 +7690,6 @@ /obj/structure/closet/firecloset, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) -"cmm" = ( -/obj/structure/chair/office, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs/auxiliary) "cmq" = ( /obj/machinery/door/airlock/external{ name = "External Access" @@ -7334,11 +7761,19 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) +"cmT" = ( +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal) "cmV" = ( -/obj/machinery/airalarm/directional/west, -/obj/structure/closet/secure_closet/freezer/fridge/all_access, -/turf/open/floor/iron/showroomfloor, -/area/station/security/prison/mess) +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "cmX" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/mapping_helpers/broken_floor, @@ -7349,6 +7784,10 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) +"cnb" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/freezer, +/area/station/medical/break_room) "cnd" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -7406,13 +7845,8 @@ }, /turf/open/floor/iron, /area/station/cargo/office) -"cnM" = ( -/obj/machinery/airalarm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/sorting) "cnU" = ( -/obj/machinery/modular_computer/console/preset/id, +/obj/machinery/modular_computer/preset/id, /obj/machinery/computer/security/telescreen/vault{ pixel_y = 30 }, @@ -7421,43 +7855,6 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) -"coa" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/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/greater) -"cow" = ( -/obj/structure/cable, -/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/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"coB" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/large, -/area/station/security/checkpoint/customs/auxiliary) -"coH" = ( -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"coK" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/maintenance/aft/greater) "coL" = ( /obj/structure/reagent_dispensers/water_cooler, /obj/structure/cable, @@ -7466,6 +7863,15 @@ }, /turf/open/floor/iron, /area/station/commons/fitness) +"coT" = ( +/obj/structure/table, +/obj/item/storage/wallet, +/obj/item/storage/wallet{ + pixel_y = 3; + pixel_x = 4 + }, +/turf/open/floor/plastic, +/area/station/commons/dorms/laundry) "cpe" = ( /obj/machinery/atmospherics/components/tank/air{ dir = 8 @@ -7481,13 +7887,6 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"cpj" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "cpl" = ( /obj/machinery/camera/directional/south{ c_tag = "Atmospherics Storage Room - East" @@ -7554,14 +7953,6 @@ }, /turf/open/floor/plating/elevatorshaft, /area/mine/storage) -"cpO" = ( -/obj/structure/table, -/obj/item/screwdriver{ - pixel_y = 16 - }, -/obj/item/wirecutters, -/turf/open/floor/plating, -/area/station/engineering/storage/tech) "cpT" = ( /obj/item/kirbyplants/random, /obj/machinery/status_display/evac/directional/south, @@ -7595,6 +7986,17 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"cqv" = ( +/obj/effect/landmark/blobstart, +/obj/machinery/camera{ + c_tag = "Virology Pen"; + dir = 9; + network = list("ss13","medbay") + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply, +/obj/machinery/light/small/directional/north, +/turf/open/floor/grass, +/area/station/medical/virology) "cqx" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7643,6 +8045,19 @@ /obj/machinery/vending/wardrobe/law_wardrobe, /turf/open/floor/wood, /area/station/service/lawoffice) +"crT" = ( +/obj/effect/spawner/random/structure/chair_flipped, +/obj/effect/spawner/random/trash/bacteria, +/obj/structure/sign/poster/ripped/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) +"cse" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Cargo Bay Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/all/supply/general, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "csf" = ( /obj/structure/table, /obj/effect/turf_decal/siding/red{ @@ -7676,6 +8091,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/port/aft) +"csR" = ( +/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, +/turf/open/floor/iron, +/area/station/service/hydroponics) "csT" = ( /turf/open/floor/circuit/telecomms/mainframe, /area/station/tcommsat/server) @@ -7688,30 +8110,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"csZ" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Atmospherics Distribution Loop" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Distro to Waste" - }, -/obj/effect/turf_decal/siding/wideplating, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"cte" = ( -/obj/machinery/computer/security/telescreen/engine{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Security Post - Engineering" - }, -/obj/structure/cable, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/engineering) "ctk" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -7726,6 +8124,15 @@ /obj/structure/grille, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) +"ctr" = ( +/obj/machinery/portable_atmospherics/pump, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/showroomfloor, +/area/station/engineering/atmos) "ctE" = ( /obj/structure/cable, /obj/machinery/light_switch/directional/south, @@ -7755,6 +8162,14 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"ctY" = ( +/obj/structure/tank_holder/anesthetic, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"cuc" = ( +/obj/effect/turf_decal/siding/thinplating_new, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "cum" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 1 @@ -7782,14 +8197,35 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/prison/rec) +"cut" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light_switch/directional/west, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"cuJ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 9 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/virology) "cuP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"cuT" = ( -/obj/machinery/airalarm/directional/north, -/turf/open/floor/plating, -/area/station/engineering/storage/tech) +"cvg" = ( +/obj/effect/mapping_helpers/trapdoor_placer, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "cvh" = ( /obj/effect/landmark/start/ai, /obj/item/radio/intercom/directional/west{ @@ -7831,12 +8267,20 @@ }, /obj/effect/turf_decal/tile/yellow/fourcorners, /obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; id = "pharmacy_shutters"; - name = "Pharmacy Shutters"; - dir = 4 + name = "Pharmacy Shutters" }, /turf/open/floor/iron, /area/station/medical/pharmacy) +"cvq" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark/textured, +/area/station/security/prison) "cvr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -7869,6 +8313,17 @@ /obj/structure/closet/emcloset, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"cvG" = ( +/obj/effect/turf_decal/siding/wideplating_new/light, +/obj/item/trash/bee, +/obj/machinery/light/directional/west, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/sign/poster/official/moth_piping/directional/west, +/turf/open/floor/iron/showroomfloor, +/area/station/security/prison/work) "cvN" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 4 @@ -7888,12 +8343,31 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/iron, /area/station/service/theater) +"cwe" = ( +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron, +/area/station/maintenance/port/fore) "cwh" = ( /obj/structure/plaque/static_plaque/golden/commission/icebox{ pixel_y = 29 }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"cwj" = ( +/obj/machinery/requests_console/directional/south{ + department = "Atmospherics"; + name = "Atmospherics Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/turf_decal/siding/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark/corner, +/area/station/engineering/atmos/storage/gas) "cwn" = ( /obj/structure/cable, /obj/structure/transit_tube/crossing/horizontal, @@ -7924,11 +8398,6 @@ /obj/effect/turf_decal/tile/blue/full, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/storage) -"cwK" = ( -/obj/structure/tank_holder/extinguisher, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "cwO" = ( /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, @@ -7944,6 +8413,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/engineering/storage/tech) +"cxl" = ( +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai) +"cxp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/personal{ + anchored = 1 + }, +/obj/item/clothing/under/pants/track, +/obj/item/clothing/suit/costume/wellworn_shirt/graphic/ian, +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) "cxz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -7985,16 +8467,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply, /turf/open/floor/iron/white, /area/station/medical/virology) -"cya" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "cyh" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -8007,12 +8479,15 @@ /obj/effect/turf_decal/tile/blue/full, /turf/open/floor/iron/large, /area/station/medical/treatment_center) -"cyF" = ( -/obj/structure/table/wood, -/obj/machinery/recharger, -/obj/item/melee/chainofcommand, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain) +"cyA" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/spawner/random/structure/barricade, +/turf/open/floor/plating, +/area/station/commons/vacant_room/office) "cyG" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -8069,16 +8544,19 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"cyW" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Arrivals Lounge" +"cyV" = ( +/obj/structure/chair/stool/directional/west, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 }, -/obj/machinery/light/directional/north, -/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/secondary/entry) +/area/station/maintenance/port/fore) +"cyX" = ( +/obj/machinery/recharge_station, +/obj/item/radio/intercom/directional/west, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron, +/area/station/science/robotics/mechbay) "cyZ" = ( /obj/structure/sign/poster/contraband/random/directional/east, /turf/open/floor/plating, @@ -8112,20 +8590,6 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/mining_station, /turf/open/floor/iron/smooth, /area/mine/eva) -"czs" = ( -/obj/structure/table, -/obj/item/clothing/head/soft/grey{ - pixel_x = -2; - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/commons/locker) -"czt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/department/chapel) "czv" = ( /obj/machinery/conveyor_switch/oneway{ dir = 8; @@ -8133,6 +8597,33 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"czx" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"czz" = ( +/obj/machinery/computer/pod/old/mass_driver_controller/trash{ + pixel_x = -24; + pixel_y = -6 + }, +/obj/machinery/button/door/directional/west{ + id = "Disposal Exit"; + name = "Disposal Vent Control"; + pixel_y = 4; + req_access = list("maint_tunnels") + }, +/obj/structure/chair/stool/directional/south{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal) "czD" = ( /turf/closed/wall, /area/mine/laborcamp/security) @@ -8170,14 +8661,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"czV" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/external, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "czW" = ( /obj/structure/weightmachine, /obj/effect/turf_decal/box, @@ -8200,12 +8683,6 @@ dir = 1 }, /area/station/hallway/primary/starboard) -"cAl" = ( -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs/auxiliary) "cAo" = ( /obj/machinery/airalarm/directional/west, /obj/structure/closet/toolcloset, @@ -8224,14 +8701,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply, /turf/open/floor/iron/white, /area/station/medical/virology) -"cAs" = ( -/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/greater) "cAu" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ @@ -8244,14 +8713,6 @@ /obj/item/book/manual/wiki/security_space_law, /turf/open/floor/wood, /area/station/security/courtroom) -"cAA" = ( -/obj/item/soap/deluxe, -/obj/item/bikehorn/rubberducky, -/obj/structure/curtain, -/obj/machinery/shower/directional/south, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/freezer, -/area/station/medical/break_room) "cAB" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/airalarm/directional/west, @@ -8327,13 +8788,9 @@ /turf/open/floor/iron/large, /area/station/engineering/atmos/storage/gas) "cAT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/generic_maintenance_landmark, -/obj/effect/decal/cleanable/confetti, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/maintenance/port/fore) +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) "cBj" = ( /obj/structure/closet/emcloset, /obj/item/clothing/head/costume/festive, @@ -8344,13 +8801,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"cBp" = ( -/obj/structure/table, -/obj/structure/frame/machine, -/obj/item/stack/cable_coil/five, -/obj/effect/decal/cleanable/dirt, +"cBw" = ( +/obj/effect/spawner/random/structure/steam_vent, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, -/area/station/maintenance/port/fore) +/area/station/maintenance/department/medical/morgue) "cBD" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 4 @@ -8399,6 +8854,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/courtroom) +"cBU" = ( +/obj/structure/table, +/obj/structure/sign/plaques/kiddie{ + pixel_x = 32 + }, +/obj/machinery/camera/motion/directional/east{ + c_tag = "AI Upload East"; + network = list("aiupload") + }, +/obj/item/folder/blue, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) "cCb" = ( /obj/structure/flora/tree/pine/style_random, /turf/open/misc/asteroid/snow/icemoon, @@ -8415,6 +8886,14 @@ /obj/machinery/newscaster/directional/east, /turf/open/floor/iron/white/smooth_large, /area/station/science/genetics) +"cCC" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/potato{ + name = "\improper Beepsky's emergency battery" + }, +/turf/open/floor/plating, +/area/station/maintenance/fore) "cCD" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -8434,12 +8913,6 @@ }, /turf/open/floor/iron/dark, /area/mine/laborcamp) -"cCV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/station/maintenance/port/fore) "cCW" = ( /obj/machinery/conveyor/inverted{ dir = 6; @@ -8475,6 +8948,13 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"cDz" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/engineering/atmos) "cDH" = ( /obj/structure/table/wood, /obj/machinery/computer/libraryconsole, @@ -8549,6 +9029,11 @@ /obj/structure/grille/broken, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) +"cEG" = ( +/obj/effect/spawner/random/trash/cigbutt, +/obj/effect/spawner/random/trash/cigbutt, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "cEL" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8584,40 +9069,20 @@ /obj/structure/sign/warning/cold_temp/directional/west, /turf/open/floor/vault, /area/station/security/prison/rec) -"cFl" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/construction) "cFJ" = ( /obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) -"cFL" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 +"cFX" = ( +/obj/structure/sign/nanotrasen{ + pixel_x = -32 }, -/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/greater) -"cFR" = ( +/obj/structure/chair/stool/directional/north, /obj/structure/cable, -/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/plating, -/area/station/maintenance/port/greater) -"cFT" = ( -/obj/structure/rack, -/obj/item/crowbar/red, -/obj/item/restraints/handcuffs, -/obj/item/wrench, -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/station/medical/virology) +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/command/gateway) "cFZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -8627,6 +9092,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/showroomfloor, /area/station/security/warden) +"cGe" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/official/wtf_is_co2/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "cGf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/r_wall, @@ -8692,23 +9165,12 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "cHs" = ( -/obj/machinery/light/directional/south, -/obj/structure/table, -/obj/item/storage/belt/medical{ - pixel_y = 2 - }, -/obj/item/clothing/glasses/hud/health, -/obj/item/clothing/glasses/hud/health, -/obj/item/clothing/glasses/hud/health, -/obj/item/clothing/glasses/hud/health, -/obj/item/storage/belt/medical{ - pixel_y = 2 +/obj/structure/disposalpipe/segment{ + dir = 10 }, -/obj/item/reagent_containers/spray/cleaner, -/obj/item/blood_filter, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/storage) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "cHy" = ( /obj/structure/cable, /obj/structure/railing, @@ -8763,6 +9225,13 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/cargo/storage) +"cIa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/digital_clock/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "cIc" = ( /turf/closed/wall, /area/station/security/prison/work) @@ -8786,12 +9255,6 @@ /obj/item/coin/diamond, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"cIu" = ( -/obj/structure/table, -/obj/item/toy/gun, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/locker) "cIK" = ( /obj/structure/table/wood, /obj/item/pai_card, @@ -8869,33 +9332,24 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"cJI" = ( -/obj/structure/cable, +"cKe" = ( +/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/power/apc/auto_name/directional/east, -/turf/open/floor/iron, -/area/station/security/prison/workout) -"cKl" = ( -/obj/effect/turf_decal/bot, -/obj/structure/sign/warning/xeno_mining{ - pixel_x = 2; - pixel_y = -32 +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"cKk" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white/side{ + dir = 6 }, -/turf/open/floor/iron/smooth, -/area/mine/eva) +/area/station/science/research) "cKn" = ( /obj/effect/mapping_helpers/broken_floor, /mob/living/simple_animal/bot/secbot/beepsky, /turf/open/floor/plating, /area/station/maintenance/fore) -"cKp" = ( -/obj/machinery/door/airlock/glass_large{ - name = "Hydroponics" - }, -/obj/effect/mapping_helpers/airlock/access/all/service/hydroponics, -/turf/open/floor/iron/textured_half, -/area/station/service/hydroponics) "cKq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8914,19 +9368,33 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"cKB" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron/checker{ + dir = 8 + }, +/area/station/maintenance/port/fore) +"cKD" = ( +/obj/structure/closet, +/obj/effect/spawner/random/maintenance, +/obj/item/stock_parts/water_recycler, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "cKF" = ( /obj/structure/bookcase/random/reference, /turf/open/floor/carpet/blue, /area/station/medical/psychology) -"cKM" = ( -/obj/structure/cable, -/obj/structure/sign/poster/random/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "cLf" = ( /obj/effect/decal/cleanable/blood/bubblegum, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, /turf/open/floor/iron/dark, /area/station/medical/morgue) @@ -8969,14 +9437,6 @@ }, /turf/open/floor/iron, /area/station/engineering/lobby) -"cLy" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/closet/cardboard, -/turf/open/floor/iron, -/area/station/maintenance/port/fore) "cLB" = ( /obj/machinery/computer/prisoner/gulag_teleporter_computer{ dir = 4 @@ -9010,11 +9470,6 @@ }, /turf/open/floor/wood, /area/station/service/library) -"cLM" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/hidden, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "cLN" = ( /turf/open/floor/iron, /area/station/hallway/primary/aft) @@ -9143,6 +9598,15 @@ }, /turf/open/floor/iron, /area/station/service/janitor) +"cNq" = ( +/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/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/station/service/lawoffice) "cND" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -9152,6 +9616,10 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"cNG" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "cNI" = ( /obj/machinery/door/poddoor/preopen{ id = "xenobio7"; @@ -9164,11 +9632,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/engine, /area/station/science/xenobiology) -"cNQ" = ( -/obj/structure/closet/wardrobe/grey, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/commons/locker) "cNS" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -9177,7 +9640,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/navigate_destination, -/obj/structure/disposalpipe/segment, /turf/open/floor/iron/textured, /area/station/service/hydroponics/garden) "cOa" = ( @@ -9221,13 +9683,6 @@ }, /turf/open/floor/iron, /area/station/command/bridge) -"cOZ" = ( -/obj/effect/turf_decal/siding/yellow{ - dir = 6 - }, -/obj/effect/landmark/start/station_engineer, -/turf/open/floor/iron, -/area/station/engineering/lobby) "cPd" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -9264,12 +9719,17 @@ }, /turf/open/floor/iron, /area/station/security/prison/workout) -"cQb" = ( -/obj/machinery/light_switch/directional/north, -/obj/machinery/vending/autodrobe/all_access, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/commons/locker) +"cQa" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/nanotrasen{ + pixel_x = 32 + }, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/entry) "cQc" = ( /obj/structure/table/wood, /obj/item/reagent_containers/cup/rag, @@ -9295,6 +9755,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/checkpoint/supply) +"cQi" = ( +/obj/machinery/disposal/delivery_chute{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/door/window/left/directional/east{ + name = "Loop Chute Access" + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "cQs" = ( /obj/structure/table, /obj/item/computer_disk{ @@ -9343,6 +9818,10 @@ dir = 8 }, /area/station/ai_monitored/command/storage/eva) +"cQH" = ( +/obj/structure/sign/warning/no_smoking/directional/south, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) "cQL" = ( /obj/machinery/porta_turret/ai{ dir = 4 @@ -9392,29 +9871,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/closed/wall, /area/station/engineering/atmos) -"cRS" = ( -/obj/structure/table, -/obj/item/storage/box/lights/mixed, -/obj/item/pipe_dispenser, -/obj/machinery/button/door/directional/east{ - id = "aux_base_shutters"; - name = "Public Shutters Control"; - req_access = list("aux_base") - }, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) "cRX" = ( /obj/machinery/processor, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"cSb" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "cSc" = ( /obj/structure/flora/bush/flowers_pp/style_random, /obj/structure/closet/crate{ @@ -9431,17 +9891,23 @@ /obj/item/queen_bee/bought, /turf/open/floor/grass, /area/station/service/hydroponics) +"cSe" = ( +/obj/structure/table, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/item/wirecutters, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/iron/dark, +/area/station/commons/storage/primary) "cSj" = ( /obj/effect/turf_decal/weather/snow/corner, /turf/open/misc/dirt{ initial_gas_mix = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored) -"cSo" = ( -/obj/machinery/module_duplicator, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/iron, -/area/station/science/explab) "cSu" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -9480,10 +9946,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"cSM" = ( -/obj/machinery/door/firedoor, +"cSP" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Aft Primary Hallway South"; + pixel_y = -22 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/light/small/directional/east, /turf/open/floor/iron, -/area/station/hallway/secondary/entry) +/area/station/hallway/primary/aft) "cSQ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -9491,6 +9962,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"cTh" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/iron/grimy, +/area/station/commons/vacant_room/office) "cTs" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -9500,13 +9977,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/engine_equipment, /turf/open/floor/iron, /area/station/engineering/storage) -"cTt" = ( -/obj/effect/turf_decal/trimline/green/filled/line, -/obj/machinery/light/directional/south, -/obj/structure/closet/l3closet/virology, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/virology) "cTv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -9522,6 +9992,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"cTD" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood/large, +/area/station/commons/vacant_room/office) "cTJ" = ( /obj/structure/cable, /obj/machinery/light_switch/directional/south{ @@ -9533,14 +10011,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/cryo) -"cTK" = ( -/obj/structure/table, -/obj/effect/spawner/random/maintenance/two, -/obj/effect/decal/cleanable/dirt, -/obj/item/stock_parts/capacitor, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/iron, -/area/station/maintenance/port/fore) "cTV" = ( /obj/effect/turf_decal/box/white{ color = "#52B4E9" @@ -9548,6 +10018,15 @@ /obj/machinery/holopad, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"cUd" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Locker Room Maintenance" + }, +/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "cUt" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -9560,22 +10039,16 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"cUy" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) -"cUT" = ( -/obj/effect/turf_decal/stripes/line{ +"cUF" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Aft Primary Hallway North" + }, +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, /obj/machinery/light/directional/west, -/obj/item/kirbyplants/random/dead/research_director, -/obj/machinery/computer/security/telescreen/rd{ - dir = 4; - pixel_x = -26 - }, -/turf/open/floor/iron/smooth_half, -/area/station/command/heads_quarters/rd) +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "cVa" = ( /obj/machinery/camera/directional/north{ c_tag = "Fitness Room North" @@ -9587,14 +10060,6 @@ }, /turf/open/floor/iron, /area/station/commons/fitness) -"cVc" = ( -/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/siding/wood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/stone, -/area/mine/eva/lower) "cVk" = ( /obj/item/storage/box/evidence{ pixel_x = -10; @@ -9605,13 +10070,6 @@ }, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) -"cVq" = ( -/obj/structure/rack, -/obj/effect/spawner/random/clothing/costume, -/obj/item/crowbar, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/commons/locker) "cVz" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -9631,10 +10089,26 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/mine/laborcamp) -"cWn" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) +"cWa" = ( +/obj/machinery/light_switch/directional/west, +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, +/obj/effect/turf_decal/box/corners{ + dir = 4 + }, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/landmark/bitrunning/station_reward_spawn, +/turf/open/floor/iron/dark/smooth_large, +/area/station/bitrunning/den) +"cWq" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/prison/garden) "cWG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -9643,9 +10117,7 @@ /area/station/security/processing) "cWH" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants{ - icon_state = "plant-05" - }, +/obj/item/kirbyplants/organic/plant5, /obj/machinery/camera/directional/west{ c_tag = "Labor Camp Cellblock"; network = list("labor") @@ -9742,6 +10214,14 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) +"cYf" = ( +/obj/machinery/shower/directional/west, +/obj/effect/turf_decal/stripes/red/line{ + dir = 6 + }, +/obj/structure/sign/warning/no_smoking/directional/east, +/turf/open/floor/iron/textured, +/area/station/engineering/atmos) "cYi" = ( /obj/effect/turf_decal/trimline/dark_red/line, /obj/effect/turf_decal/trimline/dark_red/line{ @@ -9884,23 +10364,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/science/robotics/mechbay) -"dab" = ( -/obj/machinery/camera/directional/west{ - c_tag = "MiniSat Antechamber"; - network = list("minisat"); - start_active = 1 - }, -/obj/machinery/turretid{ - control_area = "/area/station/ai_monitored/turret_protected/aisat/atmos"; - name = "Atmospherics Turret Control"; - pixel_x = -27; - req_access = list("minisat") - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) "daf" = ( /obj/structure/table, /turf/open/floor/plating/snowed/icemoon, @@ -9912,6 +10375,22 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) +"dak" = ( +/obj/item/clothing/suit/apron/surgical, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"dal" = ( +/obj/structure/table/wood, +/obj/machinery/libraryscanner{ + pixel_x = -3; + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/station/service/library) "daq" = ( /obj/machinery/computer/crew{ dir = 8 @@ -10066,17 +10545,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"dcz" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/maintenance{ - name = "Medbay Maintenance" - }, -/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/mapping_helpers/airlock/access/all/medical/cmo, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) "dcC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -10097,6 +10565,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/mix) +"dcG" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/iron/white/corner{ + dir = 8 + }, +/area/station/hallway/secondary/entry) "dcO" = ( /obj/machinery/camera/directional/east{ c_tag = "Engineering Emitter Room Starboard"; @@ -10113,6 +10592,12 @@ /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"dcW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "dcX" = ( /obj/structure/rack, /obj/item/clothing/suit/hooded/wintercoat/security{ @@ -10132,37 +10617,6 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/security/brig/upper) -"dcZ" = ( -/obj/structure/table/glass, -/obj/machinery/light/directional/north, -/obj/machinery/requests_console/directional/north{ - department = "Chief Medical Officer's Desk"; - name = "Chief Medical Officer's Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/item/toy/figure/cmo{ - pixel_x = -17; - pixel_y = -1 - }, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 5 - }, -/obj/item/pen, -/obj/effect/turf_decal/tile/blue/full, -/turf/open/floor/iron/dark/smooth_large, -/area/station/command/heads_quarters/cmo) -"ddd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/prison/mess) "ddh" = ( /obj/structure/chair/stool/directional/north, /obj/effect/landmark/start/assistant, @@ -10187,10 +10641,6 @@ /obj/effect/landmark/start/hangover/closet, /turf/open/floor/wood, /area/station/commons/dorms) -"ddt" = ( -/obj/machinery/status_display/evac/directional/east, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "ddu" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -10205,6 +10655,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/showroomfloor, /area/station/security/prison/toilet) +"ddA" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/components/binary/pump/on/supply/hidden/layer4{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "ddZ" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/green{ @@ -10225,7 +10682,7 @@ /turf/open/floor/plating, /area/station/maintenance/port/fore) "deD" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 4 }, /obj/machinery/camera/directional/west{ @@ -10245,6 +10702,12 @@ /obj/effect/decal/cleanable/blood/gibs, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"deO" = ( +/obj/structure/closet/crate, +/obj/effect/landmark/blobstart, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/construction) "deP" = ( /obj/machinery/camera/directional/north{ c_tag = "Chapel Office" @@ -10276,11 +10739,6 @@ }, /turf/open/floor/glass/reinforced, /area/station/science/xenobiology) -"dfj" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/locker) "dfq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/closed/wall/r_wall, @@ -10315,13 +10773,12 @@ }, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) -"dgk" = ( -/obj/effect/spawner/random/vending/snackvend, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, +"dgf" = ( +/obj/machinery/firealarm/directional/north, +/obj/structure/chair, +/obj/effect/landmark/start/bitrunner, /turf/open/floor/iron, -/area/station/hallway/secondary/entry) +/area/station/cargo/storage) "dgl" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -10329,11 +10786,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"dgm" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/computer/security/telescreen/entertainment/directional/west, -/turf/open/floor/wood, -/area/station/service/library) "dgZ" = ( /obj/machinery/airalarm/directional/south, /obj/structure/cable, @@ -10354,12 +10806,9 @@ /turf/open/floor/iron/dark/textured, /area/station/security/execution/transfer) "dhj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 1 - }, -/area/station/command/gateway) +/obj/machinery/light_switch/directional/north, +/turf/open/floor/wood, +/area/station/command/meeting_room) "dhk" = ( /obj/structure/table/reinforced, /obj/machinery/camera{ @@ -10378,16 +10827,9 @@ /area/station/security/checkpoint/medical) "dho" = ( /obj/structure/table/reinforced, -/obj/item/storage/secure/briefcase, -/obj/item/storage/box/pdas{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/storage/box/silver_ids{ - pixel_x = 4; - pixel_y = 6 +/obj/item/storage/secure/briefcase{ + pixel_y = 5 }, -/obj/item/storage/box/ids, /obj/machinery/status_display/evac/directional/west, /turf/open/floor/iron, /area/station/command/bridge) @@ -10401,12 +10843,6 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) -"dhJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "dhL" = ( /obj/machinery/computer/upload/ai{ dir = 1 @@ -10429,26 +10865,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/showroomfloor, /area/station/security/prison/toilet) -"dhT" = ( -/obj/structure/table, -/obj/machinery/computer/security/telescreen/interrogation{ - dir = 1; - name = "isolation room monitor"; - network = list("isolation"); - pixel_y = -32 - }, -/obj/item/clothing/suit/jacket/straight_jacket, -/obj/item/clothing/suit/jacket/straight_jacket{ - pixel_x = 6 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Security - Permabrig Prep"; - network = list("ss13","prison"); - view_range = 5 - }, -/obj/structure/cable, -/turf/open/floor/iron/smooth, -/area/station/security/execution/transfer) "dhU" = ( /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -10466,6 +10882,14 @@ }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) +"diq" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/newscaster/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/hos) "dit" = ( /obj/machinery/requests_console/directional/north{ department = "Chapel"; @@ -10481,6 +10905,10 @@ /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/atmos) +"dix" = ( +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "diC" = ( /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/security/armory/upper) @@ -10514,7 +10942,7 @@ pixel_x = -4; pixel_y = 3 }, -/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/item/surgery_tray/full, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 }, @@ -10532,8 +10960,19 @@ "djr" = ( /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) +"djB" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/camera{ + c_tag = "Medbay Chemistry Lab - South"; + dir = 5; + network = list("ss13","medbay") + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "djC" = ( /obj/effect/decal/remains/human, /obj/item/reagent_containers/cup/glass/bottle/wine{ @@ -10579,14 +11018,6 @@ /obj/effect/mapping_helpers/airlock/access/any/engineering/construction, /turf/open/floor/iron, /area/station/engineering/lobby) -"djT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/machinery/firealarm/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "djU" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/open/floor/iron, @@ -10596,6 +11027,19 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/central/greater) +"dkg" = ( +/obj/structure/table/glass, +/obj/machinery/computer/records/medical/laptop, +/obj/effect/turf_decal/tile/blue/full, +/obj/machinery/requests_console/directional/north{ + department = "Chief Medical Officer's Desk"; + name = "Chief Medical Officer's Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/mapping_helpers/requests_console/announcement, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/heads_quarters/cmo) "dkn" = ( /obj/machinery/space_heater, /turf/open/floor/wood, @@ -10604,17 +11048,22 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/science/robotics/lab) +"dkB" = ( +/obj/structure/rack, +/obj/structure/window/reinforced/spawner/directional/north{ + layer = 2.9 + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 4 + }, +/obj/effect/spawner/random/armory/shotgun, +/turf/open/floor/iron/dark/textured, +/area/station/ai_monitored/security/armory) "dkK" = ( /obj/structure/railing/corner, /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"dkN" = ( -/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/secondary/entry) "dkO" = ( /obj/effect/landmark/start/hangover, /obj/structure/chair/stool/directional/north, @@ -10670,25 +11119,6 @@ }, /turf/open/floor/plating, /area/station/construction) -"dlT" = ( -/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, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood/parquet, -/area/station/commons/lounge) -"dlV" = ( -/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, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "dmj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /obj/machinery/button/door/directional/east{ @@ -10700,6 +11130,22 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"dmk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/locker) "dms" = ( /obj/structure/closet/crate, /turf/open/floor/plating, @@ -10708,13 +11154,6 @@ /obj/structure/ladder, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"dmu" = ( -/obj/structure/sign/poster/official/safety_report/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/prison/visit) "dmD" = ( /obj/structure/closet/secure_closet/bar, /obj/machinery/firealarm/directional/north, @@ -10723,8 +11162,7 @@ /area/station/service/bar/backroom) "dmG" = ( /obj/structure/table/wood, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/coin/plasma, +/obj/item/camera, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) "dmI" = ( @@ -10738,19 +11176,6 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/iron, /area/station/maintenance/department/electrical) -"dmO" = ( -/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 = 10 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/break_room) "dmR" = ( /obj/machinery/door/airlock/external{ glass = 1; @@ -10787,15 +11212,6 @@ "dnq" = ( /turf/open/floor/iron, /area/station/hallway/primary/central) -"dnD" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white/corner{ - dir = 1 - }, -/area/station/hallway/secondary/entry) "dnL" = ( /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, @@ -10811,11 +11227,31 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/station/security/checkpoint/supply) +"dnU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/obj/item/kirbyplants/random/dead/research_director, +/obj/machinery/computer/security/telescreen/rd{ + dir = 4; + pixel_x = -26 + }, +/turf/open/floor/iron/smooth_half, +/area/station/command/heads_quarters/rd) "dnX" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, /area/station/security/lockers) +"don" = ( +/obj/machinery/portable_atmospherics/canister, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage) "doq" = ( /obj/machinery/flasher/directional/north{ id = "transferflash" @@ -10858,12 +11294,26 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"doT" = ( -/obj/item/hand_labeler, -/obj/item/assembly/timer, +"doM" = ( /obj/structure/table, -/turf/open/floor/wood, -/area/station/command/meeting_room) +/obj/item/paper{ + pixel_y = 7 + }, +/obj/item/paper{ + pixel_x = 4; + pixel_y = 2 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/large, +/area/mine/eva/lower) +"doW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "dpc" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command/glass{ @@ -10877,13 +11327,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/command/storage/eva) -"dpi" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) "dpq" = ( /obj/structure/tank_holder/extinguisher, /turf/open/floor/plating, @@ -10912,32 +11355,34 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"dpX" = ( -/obj/structure/rack, -/obj/item/gun/ballistic/shotgun/riot{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/gun/ballistic/shotgun/riot, -/obj/item/gun/ballistic/shotgun/riot{ - pixel_x = 3; - pixel_y = -3 +"dpU" = ( +/obj/effect/turf_decal/tile/blue, +/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/secondary/entry) +"dpZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/warning/docking/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 5 }, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"dqd" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/half{ dir = 4 }, -/turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) -"dqd" = ( -/obj/machinery/iv_drip, -/obj/structure/mirror/directional/north{ - icon_state = "mirror_broke" +/turf/open/floor/iron/half{ + dir = 1 }, -/turf/open/floor/iron, -/area/station/maintenance/port/fore) +/area/station/hallway/secondary/service) "dqg" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/secure_area/directional/south, @@ -10979,6 +11424,19 @@ }, /turf/open/floor/iron, /area/station/command/bridge) +"dqV" = ( +/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/modular_computer/preset/civilian{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/obj/structure/sign/poster/official/work_for_a_future/directional/east, +/turf/open/floor/iron, +/area/station/command/heads_quarters/qm) "dqW" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/plating/snowed/icemoon, @@ -11038,6 +11496,18 @@ dir = 1 }, /area/mine/living_quarters) +"drE" = ( +/obj/structure/table, +/obj/item/clothing/glasses/meson, +/obj/item/storage/bag/ore, +/obj/item/pickaxe, +/obj/item/mining_scanner, +/obj/item/flashlight, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/gps/mining, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/commons/storage/mining) "drG" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, @@ -11086,6 +11556,15 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) +"dsg" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "dsj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/firealarm/directional/south, @@ -11122,19 +11601,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"dsA" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/components/tank/air{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/medical/virology) "dsO" = ( /obj/structure/railing/corner{ dir = 4 }, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"dsR" = ( +/obj/machinery/conveyor/inverted{ + dir = 10; + id = "garbage" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "dsT" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -11198,6 +11680,11 @@ /obj/structure/sign/poster/contraband/random/directional/south, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"dtz" = ( +/obj/item/kirbyplants/random, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/textured, +/area/station/security/processing) "dtC" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -11209,20 +11696,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"dtY" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Arrivals Bay 1" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white/corner{ - dir = 1 - }, -/area/station/hallway/secondary/entry) "duh" = ( /turf/closed/wall/r_wall, /area/station/engineering/transit_tube) +"duq" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/obj/structure/sign/warning/electric_shock/directional/west, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) "duE" = ( /obj/machinery/atmospherics/components/binary/tank_compressor{ dir = 4 @@ -11261,13 +11745,6 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) -"duW" = ( -/obj/effect/spawner/random/structure/crate, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "duZ" = ( /obj/machinery/door/airlock/engineering{ name = "Utilities Closet" @@ -11283,12 +11760,26 @@ dir = 1 }, /area/mine/eva) -"dvf" = ( +"dva" = ( /obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/random/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, -/area/station/construction) +/area/station/maintenance/port/fore) +"dvf" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/camera/directional/south{ + c_tag = "Arrivals Lobby South" + }, +/obj/machinery/newscaster/directional/south, +/obj/effect/landmark/start/hangover, +/obj/effect/landmark/start/assistant, +/obj/structure/chair/sofa/bench{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "dvi" = ( /obj/structure/flora/grass/both/style_random, /obj/structure/railing, @@ -11301,16 +11792,44 @@ /obj/effect/turf_decal/weather/snow/corner, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/surface/outdoors/nospawn) -"dvR" = ( -/obj/structure/cable, -/obj/structure/chair/stool/directional/south, -/obj/effect/landmark/start/assistant, +"dvw" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light/directional/west, /turf/open/floor/iron, -/area/station/commons/locker) +/area/station/hallway/primary/central/fore) +"dvO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/entry) +"dvS" = ( +/turf/open/floor/iron/recharge_floor, +/area/station/maintenance/department/electrical) "dvY" = ( /obj/structure/flora/tree/dead/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) +"dwb" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"dwo" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/lattice/catwalk, +/obj/effect/decal/cleanable/cobweb, +/turf/open/openspace/icemoon/keep_below, +/area/station/maintenance/port/lesser) "dww" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -11327,6 +11846,12 @@ /obj/machinery/power/energy_accumulator/grounding_rod/anchored, /turf/open/floor/engine, /area/station/engineering/supermatter) +"dwI" = ( +/obj/structure/table, +/obj/effect/spawner/random/entertainment/wallet_storage, +/obj/effect/spawner/random/clothing/kittyears_or_rabbitears, +/turf/open/floor/plastic, +/area/station/commons/dorms/laundry) "dwS" = ( /obj/machinery/status_display/door_timer{ id = "Cell 3"; @@ -11368,14 +11893,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/wood, /area/station/commons/dorms) -"dxj" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/commons/locker) "dxm" = ( /obj/structure/rack, /obj/item/clothing/suit/toggle/labcoat, @@ -11394,16 +11911,6 @@ }, /turf/open/floor/iron, /area/station/engineering/main) -"dxq" = ( -/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/light/small/directional/south, -/turf/open/floor/plating, -/area/station/engineering/storage/tech) "dxs" = ( /obj/structure/closet/secure_closet/personal{ anchored = 1 @@ -11412,6 +11919,11 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"dxu" = ( +/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/port/fore) "dxA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -11420,6 +11932,13 @@ }, /turf/open/floor/iron, /area/station/engineering/lobby) +"dxE" = ( +/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_smooth, +/area/station/maintenance/port/lesser) "dxJ" = ( /obj/structure/table, /obj/item/crowbar/red, @@ -11445,19 +11964,21 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"dxV" = ( -/obj/structure/rack, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "dyf" = ( /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/security/courtroom) +"dyw" = ( +/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/plating, +/area/station/maintenance/department/crew_quarters/bar) "dyE" = ( /obj/structure/chair/pew/right{ dir = 1 @@ -11474,16 +11995,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central) -"dyQ" = ( -/obj/machinery/power/apc/auto_name/directional/south, -/obj/machinery/light/directional/south, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron, -/area/station/command/bridge) "dyW" = ( /obj/structure/sign/poster/official/random/directional/south, /obj/structure/table/optable{ @@ -11543,12 +12054,6 @@ /obj/structure/closet/firecloset, /turf/open/floor/iron/dark, /area/mine/eva/lower) -"dAa" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/dark/textured, -/area/station/security/interrogation) "dAc" = ( /obj/item/radio/intercom/directional/north, /obj/item/storage/belt/utility{ @@ -11567,14 +12072,6 @@ /obj/effect/turf_decal/tile/neutral/anticorner/contrasted, /turf/open/floor/iron/dark, /area/station/commons/storage/primary) -"dAg" = ( -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "N2 to Airmix" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "dAk" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/yellow/half/contrasted{ @@ -11588,6 +12085,20 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/engineering/lobby) +"dAq" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) +"dAt" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light_switch/directional/west, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "dAx" = ( /obj/machinery/hydroponics/soil{ pixel_y = 8 @@ -11608,14 +12119,6 @@ dir = 5 }, /area/station/command/heads_quarters/rd) -"dAO" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) "dAP" = ( /obj/structure/cable, /obj/structure/chair{ @@ -11626,14 +12129,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"dAT" = ( -/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/plating, -/area/station/maintenance/port/greater) "dAZ" = ( /turf/closed/wall/r_wall, /area/station/security/prison/visit) @@ -11641,15 +12136,6 @@ /obj/machinery/telecomms/server/presets/medical, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"dBj" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/door/airlock/external{ - name = "Port Docking Bay 4" - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) "dBp" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -11672,14 +12158,12 @@ /turf/open/floor/iron/checker, /area/station/commons/storage/emergency/port) "dBJ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/prison/visit) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "dBK" = ( /obj/machinery/disposal/bin, /obj/machinery/light/directional/south, @@ -11833,11 +12317,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"dEi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/maintenance/aft/greater) "dEv" = ( /obj/machinery/airalarm/directional/south, /turf/open/floor/wood, @@ -11889,6 +12368,18 @@ }, /turf/open/floor/iron/dark, /area/station/commons/storage/mining) +"dER" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/light/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal) "dEV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11922,9 +12413,34 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"dFr" = ( +/obj/structure/table, +/obj/machinery/computer/security/telescreen/interrogation{ + dir = 1; + name = "isolation room monitor"; + network = list("isolation"); + pixel_y = -32 + }, +/obj/item/clothing/suit/jacket/straight_jacket, +/obj/item/clothing/suit/jacket/straight_jacket{ + pixel_x = 6 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Security - Permabrig Prep"; + network = list("ss13","prison"); + view_range = 5 + }, +/obj/structure/cable, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/smooth, +/area/station/security/execution/transfer) "dFt" = ( /turf/closed/wall, /area/station/hallway/secondary/exit/departure_lounge) +"dFA" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/grimy, +/area/station/maintenance/aft/greater) "dFC" = ( /obj/effect/turf_decal/bot, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -11950,6 +12466,10 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"dFO" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "dFP" = ( /obj/structure/sink/directional/east, /turf/open/floor/iron/freezer, @@ -11986,10 +12506,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/commons/fitness) -"dGP" = ( -/obj/machinery/light/small/directional/east, -/turf/open/openspace, -/area/station/service/bar/atrium) "dGU" = ( /obj/machinery/door/airlock/maintenance{ name = "Captain's Office Maintenance" @@ -12001,16 +12517,28 @@ /obj/effect/mapping_helpers/airlock/access/all/command/captain, /turf/open/floor/plating, /area/station/maintenance/central/lesser) -"dHg" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Fore Primary Hallway - Courtroom Hallway" - }, -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/red{ - dir = 8 +"dHb" = ( +/obj/structure/flora/grass/jungle/b/style_random, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/item/throwing_star/toy, +/turf/open/misc/ashplanet/wateryrock{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15" }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) +/area/station/security/prison/rec) +"dHk" = ( +/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_smooth, +/area/station/maintenance/port/lesser) +"dHl" = ( +/obj/structure/rack, +/obj/item/crowbar/red, +/obj/item/restraints/handcuffs, +/obj/item/wrench, +/turf/open/floor/plating, +/area/station/medical/virology) "dHw" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -12018,17 +12546,22 @@ }, /turf/open/floor/iron/dark/textured_edge, /area/station/security/prison) -"dHG" = ( -/obj/structure/chair/comfy/beige{ - dir = 1 - }, -/turf/open/floor/iron/grimy, -/area/station/hallway/secondary/entry) "dHJ" = ( /obj/structure/cable/multilayer/multiz, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/maintenance/department/chapel) +"dIc" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 10 + }, +/obj/machinery/hydroponics/constructable, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics) "dIe" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock{ @@ -12049,6 +12582,14 @@ /obj/effect/turf_decal/bot_red, /turf/open/floor/iron/dark, /area/station/engineering/atmos/project) +"dIn" = ( +/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/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "dIx" = ( /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, @@ -12068,13 +12609,6 @@ dir = 9 }, /area/station/science/xenobiology) -"dID" = ( -/obj/machinery/biogenerator, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/prison/garden) "dIS" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -12096,6 +12630,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply, /turf/open/floor/iron/dark, /area/station/medical/virology) +"dJk" = ( +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_ordmix{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/science/ordnance/burnchamber) "dJx" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -12112,6 +12652,12 @@ /obj/machinery/air_sensor/ordnance_freezer_chamber, /turf/open/floor/iron/dark/airless, /area/station/science/ordnance/freezerchamber) +"dJY" = ( +/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/secondary/entry) "dJZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -12121,6 +12667,17 @@ }, /turf/open/floor/iron/white, /area/station/science/genetics) +"dKe" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "packageSort2" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/cargo/sorting) "dKh" = ( /obj/machinery/light_switch/directional/east, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -12129,13 +12686,6 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron, /area/station/tcommsat/computer) -"dKl" = ( -/obj/structure/chair/stool/directional/west, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms/laundry) "dKt" = ( /obj/machinery/door/airlock/external, /obj/effect/turf_decal/weather/snow/corner{ @@ -12220,17 +12770,6 @@ "dLf" = ( /turf/closed/wall/r_wall, /area/station/cargo/storage) -"dLk" = ( -/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/siding/white/end{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "dLo" = ( /obj/structure/disposalpipe/segment, /obj/machinery/status_display/evac/directional/east, @@ -12247,18 +12786,6 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) -"dLv" = ( -/obj/docking_port/stationary{ - dir = 8; - dwidth = 3; - height = 15; - name = "arrivals"; - roundstart_template = /datum/map_template/shuttle/arrival/box; - shuttle_id = "arrival_stationary"; - width = 7 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/nospawn) "dLH" = ( /obj/structure/fence{ dir = 1 @@ -12288,13 +12815,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"dMu" = ( -/obj/machinery/door/airlock/research{ - name = "Communications Server" - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron, -/area/mine/living_quarters) "dMv" = ( /obj/item/clothing/gloves/color/rainbow, /obj/item/clothing/head/soft/rainbow, @@ -12321,6 +12841,11 @@ /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron/dark, /area/station/service/chapel) +"dMK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room) "dMO" = ( /obj/structure/closet/secure_closet/freezer/kitchen/maintenance, /obj/effect/decal/cleanable/cobweb, @@ -12336,10 +12861,14 @@ }, /turf/open/floor/iron, /area/station/command/bridge) -"dNi" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) +"dNl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plastic, +/area/station/commons/dorms/laundry) "dNt" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -12397,6 +12926,15 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) +"dNZ" = ( +/obj/structure/training_machine, +/obj/item/target, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/commons/fitness) "dOc" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -12417,14 +12955,6 @@ /obj/structure/closet/wardrobe/mixed, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) -"dOF" = ( -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/textured, -/area/station/security/brig) "dOH" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /turf/open/floor/plating, @@ -12463,6 +12993,9 @@ /obj/item/pickaxe{ pixel_x = 5 }, +/obj/item/shovel{ + pixel_x = -5 + }, /turf/open/floor/iron, /area/station/cargo/miningdock) "dPy" = ( @@ -12487,6 +13020,30 @@ /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"dPW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/landmark/start/bitrunner, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/line, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) +"dPX" = ( +/obj/structure/sign/warning/docking/directional/east, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "dQd" = ( /obj/machinery/door/airlock/maintenance{ name = "Mining Station Maintenance" @@ -12497,19 +13054,17 @@ dir = 1 }, /area/station/maintenance/department/cargo) -"dQF" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 +"dQo" = ( +/obj/machinery/button/door/directional/east{ + id = "pharmacy_shutters2"; + name = "Pharmacy Shutter Control"; + req_access = list("pharmacy") }, -/obj/machinery/vending/cigarette, -/obj/machinery/camera{ - c_tag = "Service Bar South"; - dir = 9 +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 }, -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/obj/machinery/status_display/evac/directional/west, -/turf/open/floor/iron/grimy, -/area/station/commons/lounge) +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) "dQI" = ( /obj/effect/landmark/start/assistant, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -12521,17 +13076,6 @@ /obj/effect/spawner/random/trash/grille_or_waste, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"dQO" = ( -/obj/machinery/light/directional/south, -/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/structure/sign/departments/rndserver/directional/south, -/turf/open/floor/iron/white, -/area/station/science/research) "dQZ" = ( /obj/machinery/door/window/left/directional/north{ base_state = "right"; @@ -12586,16 +13130,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/mine/laborcamp) -"dRm" = ( -/obj/structure/disposaloutlet{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "dRz" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -12603,19 +13137,27 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply, /turf/open/floor/iron/white, /area/station/medical/virology) +"dRD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 1 + }, +/area/station/command/gateway) +"dSj" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron, +/area/mine/production) "dSm" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 }, /turf/open/floor/iron/white, /area/station/security/prison/safe) -"dSI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/binary/pump{ - name = "Gas to Chamber" - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter) "dSJ" = ( /obj/machinery/flasher/directional/north{ id = "visitorflash" @@ -12660,27 +13202,6 @@ "dTs" = ( /turf/open/floor/iron/smooth, /area/mine/eva) -"dTu" = ( -/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 - }, -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/small/directional/east, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/dark, -/area/station/cargo/drone_bay) "dTv" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -12698,6 +13219,7 @@ /area/station/service/chapel) "dTD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/commons/storage/primary) "dTF" = ( @@ -12713,10 +13235,14 @@ }, /turf/open/floor/iron, /area/mine/production) -"dUd" = ( -/obj/structure/closet/secure_closet/warden, -/turf/open/floor/iron/showroomfloor, -/area/station/security/warden) +"dTW" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "dUe" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -12764,12 +13290,10 @@ /turf/open/floor/iron/freezer, /area/mine/laborcamp) "dUK" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Mining Dock" - }, -/obj/machinery/computer/security/mining, -/turf/open/floor/iron, -/area/station/cargo/miningdock) +/obj/machinery/netpod, +/obj/machinery/light/small/directional/south, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/bitrunning/den) "dUL" = ( /obj/machinery/door/poddoor/preopen{ id = "maint1" @@ -12787,10 +13311,10 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/wood, /area/station/security/courtroom) -"dVj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"dVb" = ( +/obj/structure/table, +/obj/item/toy/cards/deck, +/obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/commons/locker) "dVq" = ( @@ -12798,6 +13322,15 @@ /obj/structure/sign/poster/random/directional/east, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"dVs" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/quantum_server, +/obj/effect/decal/cleanable/oil/streak, +/turf/open/floor/iron/dark/smooth_corner{ + dir = 4 + }, +/area/station/bitrunning/den) "dVt" = ( /obj/structure/chair/stool/directional/west, /turf/open/floor/iron/checker, @@ -12813,24 +13346,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/medbay/aft) -"dVD" = ( -/obj/structure/table, -/obj/item/crowbar, -/obj/item/wrench, -/obj/item/assembly/infra{ - pixel_x = 3 - }, -/obj/item/assembly/igniter{ - pixel_y = -2 - }, -/obj/effect/turf_decal/trimline/neutral/warning, -/obj/effect/turf_decal/trimline/neutral/mid_joiner, -/obj/item/assembly/signaler, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark/smooth_edge, -/area/station/ai_monitored/command/storage/eva) "dVF" = ( /obj/structure/sign/warning/secure_area/directional/north, /obj/effect/turf_decal/tile/blue/half/contrasted{ @@ -12843,16 +13358,28 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/engineering/lobby) -"dVN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"dVX" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood/parquet, -/area/station/commons/lounge) +/obj/structure/sign/poster/contraband/random/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood/large, +/area/station/commons/vacant_room/office) "dWf" = ( /obj/item/trash/pistachios, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"dWl" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/siding/white, +/obj/effect/landmark/start/hangover/closet, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "dWn" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/machinery/camera/directional/north{ @@ -12862,19 +13389,28 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/dark/textured, /area/station/security/prison) -"dWu" = ( -/obj/item/kirbyplants/random, -/turf/open/floor/iron/cafeteria{ - dir = 8 - }, -/area/station/science/research) "dWK" = ( /obj/machinery/hydroponics/soil, /obj/item/shovel/spade, /turf/open/floor/grass, /area/station/security/prison/garden) +"dWP" = ( +/obj/structure/table/wood, +/obj/item/pen/red{ + pixel_x = -1; + pixel_y = 5 + }, +/obj/item/reagent_containers/cup/glass/mug/britcup{ + pixel_x = 8; + pixel_y = 1 + }, +/obj/item/pen/blue{ + pixel_y = -2 + }, +/turf/open/floor/iron/grimy, +/area/station/commons/vacant_room/office) "dWX" = ( -/obj/machinery/modular_computer/console/preset/engineering, +/obj/machinery/modular_computer/preset/engineering, /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 8 }, @@ -12889,12 +13425,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"dXb" = ( -/obj/structure/closet/crate/coffin, -/obj/effect/decal/cleanable/dirt, -/obj/item/toy/figure/chaplain, -/turf/open/floor/plating, -/area/station/maintenance/department/chapel) "dXi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -12910,6 +13440,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"dXv" = ( +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/command/gateway) "dXy" = ( /obj/structure/table/glass, /obj/machinery/vending/wallmed/directional/north, @@ -12923,7 +13459,7 @@ network = list("ss13","medbay"); pixel_x = 22 }, -/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/item/surgery_tray/full, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 }, @@ -12953,13 +13489,20 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) -"dXT" = ( +"dXU" = ( +/obj/effect/decal/cleanable/generic, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"dYj" = ( +/obj/machinery/airalarm/directional/north, /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/greater) +/area/station/maintenance/port/fore) +"dYq" = ( +/turf/open/floor/plating, +/area/station/commons/dorms/laundry) "dYr" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, @@ -12976,6 +13519,11 @@ }, /turf/open/floor/iron, /area/mine/production) +"dYC" = ( +/obj/structure/closet/firecloset, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "dYI" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 4 @@ -13010,24 +13558,24 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/checker, /area/station/maintenance/port/fore) -"dZj" = ( -/obj/effect/decal/cleanable/oil, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/maintenance/disposal) +"dZq" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/mine/eva) "dZB" = ( /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/commons/fitness) -"dZG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/holopad, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/large, -/area/station/security/checkpoint/customs/auxiliary) "dZJ" = ( /obj/machinery/seed_extractor, /obj/machinery/status_display/evac/directional/north, @@ -13099,6 +13647,12 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"eae" = ( +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "eag" = ( /obj/structure/chair/stool/directional/north, /obj/effect/landmark/start/scientist, @@ -13114,6 +13668,20 @@ /obj/structure/cable, /turf/open/floor/carpet/red, /area/station/security/prison/work) +"ear" = ( +/obj/machinery/mineral/processing_unit{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/mine/production) "eaw" = ( /obj/effect/spawner/random/contraband/prison, /obj/structure/closet/crate, @@ -13133,20 +13701,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"eaI" = ( -/obj/structure/sign/warning/secure_area/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"eaS" = ( -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs/auxiliary) "ebb" = ( /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron, @@ -13163,11 +13717,6 @@ "ebr" = ( /turf/open/openspace, /area/station/engineering/atmos/storage) -"ebs" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/oil, -/turf/open/floor/iron/checker, -/area/station/maintenance/port/fore) "ebv" = ( /obj/machinery/light/small/directional/east, /obj/effect/turf_decal/stripes/corner{ @@ -13179,6 +13728,7 @@ /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) "ebB" = ( @@ -13186,6 +13736,19 @@ initial_gas_mix = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored) +"ebC" = ( +/obj/machinery/recycler{ + dir = 8 + }, +/obj/machinery/conveyor{ + dir = 4; + id = "garbage" + }, +/obj/structure/sign/warning/secure_area/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "ebK" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/rack, @@ -13243,11 +13806,13 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/engineering/storage/tech) -"ecR" = ( -/obj/machinery/recharge_station, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/mine/eva/lower) +"ecU" = ( +/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/hallway/secondary/entry) "ecZ" = ( /obj/structure/table, /obj/effect/turf_decal/tile/neutral/diagonal_edge, @@ -13283,25 +13848,60 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron, /area/station/science/xenobiology) +"edq" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/science/robotics/mechbay) +"edD" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/vending/cigarette, +/obj/machinery/camera{ + c_tag = "Service Bar South"; + dir = 9 + }, +/obj/machinery/computer/security/telescreen/entertainment/directional/north, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) +"edN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "edT" = ( /obj/structure/grille/broken, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"eei" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "eek" = ( /obj/structure/rack, /obj/structure/window/reinforced/spawner/directional/east, /obj/item/clothing/head/costume/fancy, /turf/open/floor/iron/dark/textured, /area/station/security/prison) -"eex" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 +"eeq" = ( +/obj/structure/table, +/obj/item/hand_tele{ + pixel_x = 3; + pixel_y = 13 }, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) +/turf/open/floor/iron, +/area/station/command/teleporter) +"eeD" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark/textured, +/area/station/ai_monitored/security/armory/upper) "eeF" = ( /obj/item/cigbutt/cigarbutt, /obj/effect/decal/cleanable/blood/old, @@ -13317,11 +13917,15 @@ /obj/effect/mapping_helpers/mail_sorting/engineering/atmospherics, /turf/open/floor/iron, /area/station/engineering/lobby) -"efa" = ( -/obj/machinery/mechpad, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron/textured, -/area/mine/mechbay) +"efh" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/computer/slot_machine{ + pixel_y = -6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/parquet, +/area/station/commons/lounge) "efi" = ( /obj/structure/bed/dogbed, /obj/effect/decal/cleanable/blood/gibs/body, @@ -13331,6 +13935,11 @@ /obj/structure/cable, /turf/open/floor/iron/white/side, /area/station/science/explab) +"efo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/iv_drip, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "efv" = ( /obj/item/toy/snowball{ pixel_x = -6; @@ -13347,6 +13956,13 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/range) +"efz" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "efE" = ( /obj/structure/reflector/box/anchored{ dir = 1 @@ -13365,6 +13981,10 @@ /obj/item/food/grown/harebell, /turf/open/floor/iron/chapel, /area/station/service/chapel) +"efI" = ( +/obj/structure/lattice, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "efK" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 @@ -13378,32 +13998,30 @@ initial_gas_mix = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored) -"efP" = ( -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"efR" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms/laundry) -"efU" = ( -/obj/structure/closet/radiation, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/main) +"efV" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/purple/visible, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room) "ega" = ( /obj/effect/landmark/event_spawn, +/obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/xenobiology) "egf" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance/burnchamber) +"egj" = ( +/obj/structure/rack, +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/effect/spawner/random/armory/riot_armor, +/obj/effect/spawner/random/armory/riot_helmet, +/obj/effect/spawner/random/armory/riot_shield, +/turf/open/floor/iron/dark/textured, +/area/station/ai_monitored/security/armory) "egm" = ( /obj/structure/table, /obj/item/restraints/handcuffs, @@ -13428,17 +14046,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) -"egG" = ( -/obj/machinery/light/warm/directional/west, -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 8 - }, -/turf/open/floor/iron/dark/textured, -/area/station/security/prison/rec) -"egK" = ( -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "egL" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -13455,6 +14062,17 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) +"egT" = ( +/obj/item/circuitboard/machine/stasis, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/item/wrench/medical, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/blood/gibs/old, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "egV" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -13479,13 +14097,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"ehc" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms/laundry) "ehd" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -13519,18 +14130,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/textured_half, /area/station/hallway/primary/starboard) -"ehG" = ( -/obj/structure/table, -/obj/item/folder/yellow, -/obj/item/pen, -/obj/machinery/light/directional/west, -/obj/machinery/requests_console/directional/west{ - department = "Mining"; - name = "Mining Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/turf/open/floor/iron, -/area/station/cargo/miningdock) "ehJ" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -13578,24 +14177,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/security/prison/rec) -"eia" = ( -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark/textured, -/area/station/security/prison) "eic" = ( /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/textured, /area/station/security/execution/transfer) -"eie" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "eig" = ( /obj/structure/rack, /obj/effect/decal/cleanable/dirt, @@ -13618,21 +14205,6 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron/smooth, /area/station/security/holding_cell) -"eit" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"eix" = ( -/obj/structure/table, -/obj/item/radio{ - pixel_x = -3 - }, -/obj/item/pickaxe, -/obj/item/flashlight, -/obj/machinery/light/small/directional/north, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/dark, -/area/station/maintenance/department/medical/morgue) "eiI" = ( /obj/effect/turf_decal/siding/yellow{ dir = 1 @@ -13649,6 +14221,7 @@ "eiY" = ( /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/medbay/central) "ejg" = ( @@ -13680,21 +14253,11 @@ }, /turf/open/floor/iron/dark, /area/station/commons/storage/primary) -"ejq" = ( -/obj/structure/chair/comfy/brown{ - dir = 1 - }, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) -"ejO" = ( -/obj/structure/table/reinforced, -/obj/item/folder/white, +"ejD" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/machinery/light/directional/east, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/science/ordnance/office) "ejQ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -13703,20 +14266,9 @@ }, /turf/open/floor/plating, /area/station/engineering/lobby) -"ejW" = ( -/obj/structure/chair/comfy/beige{ - dir = 1 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron/grimy, -/area/station/hallway/secondary/entry) "ejX" = ( /turf/open/floor/plating, /area/station/security/prison/safe) -"ejZ" = ( -/obj/structure/sink/directional/south, -/turf/open/floor/iron, -/area/station/science/xenobiology) "eke" = ( /obj/structure/table, /obj/effect/turf_decal/tile/neutral/diagonal_edge, @@ -13726,6 +14278,15 @@ /obj/item/reagent_containers/condiment/milk, /turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) +"ekh" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Atmospherics - Central" + }, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Port to Infiltrate" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "ekm" = ( /obj/machinery/door/poddoor/shutters/preopen{ dir = 8; @@ -13738,6 +14299,12 @@ }, /turf/open/floor/plating, /area/station/medical/chemistry) +"ekn" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "ekq" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/mapping_helpers/burnt_floor, @@ -13790,17 +14357,15 @@ dir = 8 }, /area/station/science/explab) -"elr" = ( -/obj/machinery/mineral/stacking_unit_console, -/turf/closed/wall, -/area/station/maintenance/port/greater) -"elu" = ( -/obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "elw" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/upper) +"elT" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ + dir = 8 + }, +/turf/open/floor/engine/vacuum, +/area/station/maintenance/disposal/incinerator) "elU" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -13808,12 +14373,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/security/prison/work) -"emi" = ( -/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/station/construction) "emp" = ( /turf/open/floor/iron/dark/side{ dir = 1 @@ -13825,14 +14384,6 @@ dir = 6 }, /area/station/command/heads_quarters/rd) -"emL" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white/corner, -/area/station/hallway/secondary/entry) "emM" = ( /obj/machinery/door/window/brigdoor/security/cell{ dir = 8; @@ -13844,13 +14395,6 @@ dir = 1 }, /area/station/security/brig) -"emO" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/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/secondary/entry) "ena" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -13878,11 +14422,6 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/service) -"enH" = ( -/obj/structure/sign/poster/official/obey/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) "enI" = ( /obj/machinery/door/airlock/maintenance{ name = "Tool Storage Maintenance" @@ -13891,9 +14430,6 @@ /obj/effect/mapping_helpers/airlock/unres{ dir = 4 }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /turf/open/floor/plating, /area/station/commons/storage/primary) "enR" = ( @@ -13901,6 +14437,19 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"enX" = ( +/obj/structure/railing{ + dir = 6 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) +"eog" = ( +/obj/structure/table/wood, +/obj/machinery/newscaster/directional/north, +/obj/item/flashlight/lantern, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "eoq" = ( /obj/structure/stairs/south{ dir = 1 @@ -13915,14 +14464,12 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) -"eov" = ( -/obj/item/radio/off, -/obj/item/crowbar, -/obj/item/assembly/flash/handheld, -/obj/structure/table, -/obj/effect/turf_decal/tile/red/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs/auxiliary) +"eoy" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/port/lesser) "eoD" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ @@ -13934,6 +14481,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/atmos) +"eoE" = ( +/obj/machinery/firealarm/directional/east, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "eoJ" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -13961,6 +14513,15 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) +"eoY" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/locker) "epd" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -13980,14 +14541,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/science/explab) -"epX" = ( -/obj/structure/table/wood, -/obj/item/toy/cards/deck{ - pixel_y = 4 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/carpet, -/area/station/service/theater) "epY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -14003,20 +14556,16 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/large, /area/station/engineering/storage) -"eqb" = ( -/obj/structure/sign/poster/official/do_not_question/directional/north, -/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) "eqj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria{ dir = 8 }, /area/station/science/ordnance/office) +"eqn" = ( +/obj/structure/sign/warning/docking/directional/east, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "eqp" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -14060,14 +14609,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) -"eqL" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/service/hydroponics) "eqN" = ( /obj/structure/fence/door, /obj/effect/turf_decal/weather/snow/corner{ @@ -14116,6 +14657,13 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"erl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/greenglow, +/obj/structure/sign/poster/official/safety_eye_protection/directional/east, /turf/open/floor/plating, /area/station/maintenance/port/fore) "ero" = ( @@ -14129,10 +14677,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/genetics) -"erE" = ( -/obj/machinery/vending/coffee, +"erw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/brown, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal) +"erA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light_switch/directional/east, /turf/open/floor/iron, -/area/station/commons/locker) +/area/station/construction) "erH" = ( /obj/structure/disposalpipe/trunk{ dir = 8 @@ -14143,11 +14699,30 @@ }, /turf/open/floor/iron, /area/station/commons/fitness) -"erJ" = ( -/obj/structure/table, -/obj/item/lipstick/random, -/turf/open/floor/iron, -/area/station/commons/locker) +"erI" = ( +/obj/structure/rack, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = 5; + pixel_y = -2 + }, +/obj/item/tank/internals/emergency_oxygen{ + pixel_y = 3 + }, +/obj/item/tank/internals/emergency_oxygen, +/obj/structure/sign/warning/cold_temp/directional/west, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/exit/departure_lounge) +"erK" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters{ + id = "vacantofficemaintshutter"; + name = "Privacy Shutters" + }, +/turf/open/floor/plating, +/area/station/commons/vacant_room/office) "erN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -14158,6 +14733,7 @@ "erU" = ( /obj/effect/landmark/generic_maintenance_landmark, /obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "erY" = ( @@ -14177,12 +14753,6 @@ }, /turf/open/floor/iron/dark, /area/station/cargo/miningdock) -"esj" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) "esn" = ( /obj/effect/landmark/start/bartender, /turf/open/floor/wood, @@ -14207,12 +14777,6 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics/garden) -"esB" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) "esC" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/effect/decal/cleanable/dirt, @@ -14235,23 +14799,35 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/glass/reinforced, /area/station/security/brig/entrance) +"esS" = ( +/obj/machinery/computer/shuttle/labor{ + dir = 8 + }, +/turf/open/floor/iron/showroomfloor, +/area/station/security/processing) +"eta" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Central Hallway East" + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 2 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "etw" = ( /obj/effect/turf_decal/stripes/white/line, /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/west, /turf/open/floor/iron, /area/station/security/prison/workout) -"etx" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "etA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/obj/structure/disposalpipe/junction{ - dir = 1 - }, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/secondary/service) "etB" = ( @@ -14293,6 +14869,10 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"etY" = ( +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron, +/area/station/commons/locker) "euc" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -14309,6 +14889,13 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) +"eul" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/trimline/yellow/filled/end{ + dir = 1 + }, +/turf/open/floor/iron/textured, +/area/station/medical/chem_storage) "euq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -14327,6 +14914,10 @@ /obj/item/storage/toolbox/mechanical, /turf/open/floor/iron/smooth, /area/mine/eva) +"euI" = ( +/obj/structure/statue/snow/snowman, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) "euM" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -14378,12 +14969,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"evv" = ( -/obj/machinery/light/dim/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/iv_drip, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "evw" = ( /obj/structure/window/reinforced/spawner/directional/north{ pixel_y = 2 @@ -14410,10 +14995,11 @@ /turf/open/floor/iron, /area/station/maintenance/department/medical/central) "ewq" = ( -/obj/machinery/light_switch/directional/north, -/obj/machinery/light/directional/north, +/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/cargo/miningdock) +/area/station/cargo/storage) "ewz" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/north, @@ -14431,6 +15017,16 @@ }, /turf/open/floor/iron/dark, /area/station/cargo/miningdock) +"ewM" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/security/brig/upper) "exe" = ( /obj/effect/turf_decal/siding/yellow/end{ dir = 8 @@ -14439,12 +15035,6 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/plating, /area/station/medical/treatment_center) -"exl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "exq" = ( /obj/effect/turf_decal/trimline/neutral/warning, /obj/effect/turf_decal/trimline/neutral/mid_joiner, @@ -14475,11 +15065,6 @@ "exw" = ( /turf/closed/wall, /area/station/service/hydroponics) -"exx" = ( -/obj/structure/bookcase/random, -/obj/structure/sign/poster/official/nanomichi_ad/directional/north, -/turf/open/floor/carpet/red, -/area/station/security/prison/work) "exy" = ( /obj/structure/sign/warning/no_smoking{ pixel_x = -28 @@ -14517,19 +15102,44 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/pharmacy) -"eye" = ( -/obj/effect/turf_decal/siding/wood{ +"eyf" = ( +/obj/machinery/door/firedoor, +/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 = "Arrivals" + }, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/secondary/entry) +"eyj" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/white/corner{ dir = 1 }, -/obj/effect/turf_decal/siding/wood/corner, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) -"eyD" = ( -/obj/effect/spawner/structure/window/hollow/directional{ +/area/station/hallway/secondary/entry) +"eyk" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/siding/white{ dir = 1 }, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) +/obj/structure/closet/firecloset, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "eyU" = ( /obj/structure/closet/crate/coffin, /obj/machinery/light/small/red/directional/south, @@ -14542,6 +15152,11 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/general, /turf/open/floor/iron/freezer, /area/station/medical/break_room) +"ezl" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/large, +/area/mine/eva/lower) "ezq" = ( /obj/structure/table, /obj/item/stamp, @@ -14577,13 +15192,6 @@ /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/cargo) -"ezO" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark/side, -/area/station/security/processing) "eAb" = ( /obj/structure/chair{ dir = 1 @@ -14591,6 +15199,10 @@ /obj/item/toy/sword, /turf/open/floor/iron/checker, /area/station/maintenance/port/fore) +"eAe" = ( +/obj/structure/chair, +/turf/open/floor/iron, +/area/station/cargo/storage) "eAg" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/closed/wall, @@ -14604,13 +15216,22 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"eAs" = ( -/obj/structure/cable, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/trimline/dark_blue/line, -/obj/effect/turf_decal/tile/neutral/fourcorners, +"eAk" = ( +/obj/structure/bookcase{ + name = "Holy Bookcase" + }, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/button/door/directional/west{ + id = "lower_chapel_shutters"; + name = "Graveyard Shutters"; + pixel_y = -8 + }, +/obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark, -/area/station/engineering/atmos/mix) +/area/station/service/chapel) "eAu" = ( /obj/structure/flora/grass/green/style_2, /turf/open/misc/asteroid/snow/icemoon, @@ -14635,12 +15256,6 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"eAV" = ( -/obj/machinery/light/directional/south, -/obj/effect/mapping_helpers/trapdoor_placer, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "eBa" = ( /obj/effect/turf_decal/siding/white, /turf/open/floor/iron/white/smooth_large, @@ -14670,6 +15285,17 @@ /obj/effect/mapping_helpers/airlock/access/all/service/hydroponics, /turf/open/floor/iron/textured_half, /area/station/service/hydroponics) +"eBk" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/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/neutral/half/contrasted, +/turf/open/floor/iron, +/area/station/commons/fitness) "eBz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -14693,12 +15319,6 @@ }, /turf/open/floor/iron, /area/station/engineering/main) -"eBT" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "eBU" = ( /obj/machinery/camera/directional/north{ c_tag = "Courtroom" @@ -14730,19 +15350,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"eCq" = ( -/obj/structure/chair/sofa/corp/left, -/turf/open/floor/wood, -/area/station/hallway/secondary/service) -"eCs" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron/dark/textured_edge{ - dir = 1 - }, -/area/station/security/prison) "eCt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -14754,16 +15361,11 @@ }, /turf/open/floor/iron, /area/station/engineering/main) -"eCA" = ( -/obj/effect/turf_decal/siding/white{ - dir = 8 - }, -/obj/structure/chair{ - dir = 1 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white/smooth_large, -/area/station/service/kitchen/diner) +"eCz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/mine/laborcamp) "eCD" = ( /obj/machinery/door/airlock/public/glass{ name = "Prison Common Room" @@ -14794,6 +15396,15 @@ /obj/machinery/suit_storage_unit/medical, /turf/open/floor/iron/dark, /area/station/medical/storage) +"eDg" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/item/radio/intercom/prison/directional/west, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/security/prison) "eDh" = ( /obj/machinery/door/poddoor/shutters{ dir = 8; @@ -14862,16 +15473,6 @@ /obj/structure/bookcase/random/fiction, /turf/open/floor/iron/dark, /area/station/commons/lounge) -"eEb" = ( -/obj/machinery/computer/security/telescreen{ - name = "Test Chamber Monitor"; - network = list("xeno"); - pixel_y = 26 - }, -/turf/open/floor/iron/white/side{ - dir = 1 - }, -/area/station/command/heads_quarters/rd) "eEh" = ( /obj/structure/table/reinforced, /obj/item/storage/toolbox/mechanical, @@ -14895,16 +15496,6 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) -"eEN" = ( -/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/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "eEO" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -14990,10 +15581,6 @@ /obj/structure/chair/stool/directional/south, /turf/open/floor/wood, /area/station/commons/dorms) -"eGj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white/textured, -/area/station/security/medical) "eGl" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/landmark/event_spawn, @@ -15023,6 +15610,14 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/security/prison/visit) +"eGA" = ( +/obj/machinery/computer/prisoner/management{ + dir = 1 + }, +/obj/machinery/airalarm/directional/south, +/obj/structure/cable, +/turf/open/floor/iron/showroomfloor, +/area/station/security/warden) "eGK" = ( /obj/structure/closet, /obj/effect/spawner/random/entertainment/drugs, @@ -15063,13 +15658,14 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"eHK" = ( -/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, -/turf/open/floor/iron/smooth, -/area/station/security/execution/transfer) +"eHj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/personal{ + anchored = 1 + }, +/obj/item/clothing/under/costume/jabroni, +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) "eHT" = ( /obj/structure/cable, /obj/effect/spawner/random/structure/steam_vent, @@ -15145,6 +15741,16 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"eIY" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics) "eJe" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -15158,14 +15764,6 @@ /obj/structure/lattice, /turf/open/openspace/icemoon/keep_below, /area/icemoon/underground/explored) -"eJn" = ( -/obj/machinery/portable_atmospherics/pump, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, -/turf/open/floor/iron/showroomfloor, -/area/station/engineering/atmos) "eJq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15196,6 +15794,29 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/central) +"eJC" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/bottle/vodka/badminka{ + pixel_x = 7; + pixel_y = 20 + }, +/obj/item/taperecorder{ + pixel_x = -5; + pixel_y = 1 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_x = 7; + pixel_y = 8 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_x = 6 + }, +/obj/item/storage/secure/safe/hos{ + pixel_x = 35 + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/heads_quarters/hos) "eJI" = ( /obj/structure/closet/emcloset, /obj/effect/mapping_helpers/broken_floor, @@ -15224,30 +15845,20 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/mine/eva) -"eKk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron/smooth_half, -/area/station/security/brig/upper) "eKl" = ( /obj/effect/turf_decal/stripes/box, /obj/machinery/destructive_scanner, /turf/open/floor/iron/textured_large, /area/station/hallway/primary/starboard) -"eKB" = ( -/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, -/turf/open/floor/iron, -/area/mine/production) "eKJ" = ( /obj/structure/chair/stool/directional/west, /turf/open/floor/iron, /area/station/commons/dorms) +"eKN" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/lattice/catwalk, +/turf/open/openspace/icemoon/keep_below, +/area/station/maintenance/port/lesser) "eKW" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 4 @@ -15271,12 +15882,6 @@ }, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/department/chapel) -"eLm" = ( -/obj/machinery/hydroponics/soil, -/obj/machinery/light/directional/west, -/obj/structure/sign/poster/contraband/kudzu/directional/west, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden) "eLn" = ( /obj/machinery/computer/crew{ dir = 4 @@ -15289,16 +15894,6 @@ dir = 5 }, /area/station/science/research) -"eLs" = ( -/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/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/station/service/lawoffice) "eLx" = ( /obj/effect/landmark/start/bartender, /obj/machinery/duct, @@ -15308,20 +15903,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) -"eLE" = ( -/obj/item/grenade/barrier{ - pixel_x = 4 - }, -/obj/item/grenade/barrier, -/obj/item/grenade/barrier{ - pixel_x = -4 - }, -/obj/structure/table, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory/upper) "eLS" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/east, @@ -15349,25 +15930,20 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos) -"eMu" = ( -/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/iron, -/area/station/service/hydroponics/garden) -"eMF" = ( -/obj/machinery/door/firedoor, +"eMG" = ( +/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red{ + dir = 1 }, +/obj/machinery/digital_clock/directional/north, /turf/open/floor/iron, -/area/station/hallway/secondary/entry) +/area/station/security/prison/mess) "eMH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/start/assistant, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/commons/storage/primary) "eMK" = ( @@ -15441,10 +16017,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/fore) -"eNA" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/locker) +"eNC" = ( +/obj/machinery/status_display/evac/directional/west, +/obj/item/kirbyplants/random, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "eND" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15480,13 +16058,6 @@ }, /turf/open/floor/iron/smooth, /area/station/engineering/lobby) -"eNR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/broken/directional/north, -/obj/machinery/vending/dinnerware, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "eNS" = ( /obj/structure/sign/warning/xeno_mining, /turf/closed/wall, @@ -15495,6 +16066,10 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/commons/fitness) +"eOm" = ( +/obj/structure/sign/poster/official/no_erp/directional/west, +/turf/closed/wall, +/area/station/maintenance/starboard/fore) "eOw" = ( /obj/machinery/computer/shuttle/labor, /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ @@ -15558,6 +16133,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"ePn" = ( +/obj/structure/closet, +/obj/item/clothing/under/suit/black/skirt, +/obj/item/clothing/under/suit/black, +/obj/machinery/newscaster/directional/east, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "ePr" = ( /turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/hos) @@ -15577,6 +16162,11 @@ /obj/structure/table, /turf/open/floor/iron, /area/station/security/prison/mess) +"eQH" = ( +/obj/structure/sign/departments/medbay/alt/directional/west, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/mine/laborcamp) "eQN" = ( /obj/machinery/door/airlock{ name = "Unisex Showers" @@ -15605,6 +16195,10 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"eRh" = ( +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) "eRw" = ( /obj/effect/landmark/event_spawn, /obj/structure/cable, @@ -15627,22 +16221,23 @@ }, /turf/open/floor/iron/grimy, /area/station/ai_monitored/turret_protected/aisat_interior) -"eRK" = ( -/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/yjunction{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "eRO" = ( /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/showroomfloor, /area/station/security/warden) +"eRZ" = ( +/obj/structure/table, +/obj/item/papercutter{ + pixel_x = 8; + pixel_y = 6 + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/hop) "eSg" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/solars/port/fore) "eSn" = ( @@ -15691,13 +16286,6 @@ }, /turf/open/floor/iron/white, /area/station/science/genetics) -"eST" = ( -/obj/structure/toilet{ - dir = 4 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/freezer, -/area/mine/laborcamp) "eSY" = ( /obj/structure/closet/emcloset, /turf/open/floor/iron/smooth, @@ -15731,14 +16319,12 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/large, /area/station/engineering/main) -"eTL" = ( -/obj/effect/turf_decal/trimline/yellow/filled/shrink_ccw, -/obj/machinery/light/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Atmospherics - HFR South" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/hfr_room) +"eTC" = ( +/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/commons/locker) "eTM" = ( /obj/effect/turf_decal/trimline/blue/corner, /obj/effect/turf_decal/trimline/blue/corner, @@ -15756,12 +16342,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/starboard/fore) -"eTY" = ( -/obj/structure/table, -/obj/item/clothing/shoes/jackboots, -/obj/item/storage/backpack/satchel/leather, -/turf/open/floor/iron, -/area/station/maintenance/starboard/fore) "eUe" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner, /turf/open/floor/iron/white, @@ -15793,11 +16373,38 @@ }, /turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) -"eUD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/east, +"eUA" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/green/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron, -/area/mine/laborcamp) +/area/station/service/hydroponics/garden) +"eUB" = ( +/obj/structure/table, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/item/clothing/suit/hooded/wintercoat{ + pixel_x = -5 + }, +/obj/item/clothing/suit/hooded/wintercoat/security{ + pixel_x = 5 + }, +/obj/item/clothing/suit/hooded/wintercoat/security{ + pixel_x = 5 + }, +/obj/item/clothing/suit/hooded/wintercoat/security{ + pixel_x = 5 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/execution/education) "eUI" = ( /obj/machinery/space_heater, /turf/open/floor/plating, @@ -15856,6 +16463,13 @@ /obj/effect/gibspawner/human, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"eVa" = ( +/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, +/turf/open/floor/iron, +/area/mine/eva/lower) "eVl" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/mining/glass{ @@ -15871,24 +16485,11 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/shipping, /turf/open/floor/iron, /area/station/cargo/sorting) -"eVn" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"eVy" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"eVz" = ( -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 8 - }, -/obj/structure/sign/poster/official/build/directional/north, -/turf/open/floor/iron/dark, -/area/station/engineering/lobby) +"eVp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "eVC" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 9 @@ -15912,13 +16513,6 @@ /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) -"eVR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/station/maintenance/port/aft) "eVV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15973,21 +16567,10 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) -"eWi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron, -/area/station/construction) "eWj" = ( /obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/engine/plasma, /area/station/engineering/atmos) -"eWn" = ( -/obj/structure/table/glass, -/obj/machinery/computer/records/medical/laptop, -/obj/effect/turf_decal/tile/blue/full, -/turf/open/floor/iron/dark/smooth_large, -/area/station/command/heads_quarters/cmo) "eWB" = ( /obj/structure/rack, /obj/item/electropack, @@ -16014,11 +16597,6 @@ /obj/effect/mapping_helpers/airlock/access/all/service/hydroponics, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) -"eWK" = ( -/obj/structure/closet/toolcloset, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/construction) "eWP" = ( /obj/machinery/computer/security/mining, /obj/effect/turf_decal/tile/brown/anticorner/contrasted, @@ -16041,24 +16619,9 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"eXk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/hidden, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "eXH" = ( /turf/closed/wall/r_wall, /area/station/medical/chemistry) -"eXM" = ( -/obj/structure/cable, -/obj/machinery/camera/directional/west{ - c_tag = "Dormitory South" - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) "eXU" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -16094,12 +16657,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/mine/laborcamp) -"eYA" = ( -/obj/machinery/vending/engivend, -/obj/machinery/newscaster/directional/north, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/station/engineering/storage_shared) "eYC" = ( /turf/open/floor/iron/smooth, /area/mine/laborcamp/security) @@ -16140,7 +16697,10 @@ pixel_x = -3; pixel_y = 7 }, -/obj/item/pen, +/obj/item/pen{ + pixel_x = 11; + pixel_y = 2 + }, /obj/structure/table/wood, /turf/open/floor/carpet, /area/station/command/meeting_room) @@ -16182,24 +16742,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"eZw" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/end, -/turf/open/floor/iron, -/area/station/maintenance/port/fore) "eZz" = ( /obj/item/storage/fancy/cigarettes/cigpack_mindbreaker, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"eZJ" = ( -/obj/machinery/mineral/stacking_machine{ - input_dir = 1; - stack_amt = 10 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "eZL" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 8 @@ -16259,11 +16805,6 @@ /obj/structure/tank_holder/extinguisher, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"fas" = ( -/obj/machinery/vending/coffee, -/obj/machinery/light/small/directional/south, -/turf/open/floor/stone, -/area/mine/eva/lower) "faG" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -16302,16 +16843,17 @@ /obj/effect/turf_decal/tile/green, /turf/open/floor/iron, /area/station/hallway/primary/central) -"fbK" = ( -/obj/structure/cable, -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +"fbw" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Bridge Conference Room" }, -/turf/open/floor/iron, -/area/station/commons/locker) +/obj/machinery/newscaster/directional/north, +/turf/open/floor/wood, +/area/station/command/meeting_room) +"fbY" = ( +/obj/effect/spawner/random/trash/hobo_squat, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "fca" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -16335,24 +16877,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/science/ordnance) +"fcs" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) "fcu" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/chair, /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"fcC" = ( -/obj/machinery/requests_console/directional/north{ - department = "Robotics"; - name = "Robotics Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/ore_update, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/machinery/light/directional/north, -/obj/machinery/rnd/production/circuit_imprinter/department/science, -/turf/open/floor/iron/white, -/area/station/science/robotics/lab) "fcN" = ( /obj/machinery/atmospherics/pipe/smart/manifold/general/visible{ dir = 8 @@ -16371,12 +16906,6 @@ }, /turf/open/floor/engine/n2o, /area/station/engineering/atmos) -"fcR" = ( -/obj/effect/spawner/random/contraband/narcotics, -/obj/structure/sign/poster/contraband/syndiemoth/directional/west, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/security/prison/safe) "fcY" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -16424,23 +16953,25 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/general, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"fdJ" = ( -/obj/structure/cable, +"fdN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, -/area/station/construction) -"fdO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) +/area/station/maintenance/department/chapel) "fdP" = ( /obj/structure/bonfire, /obj/item/melee/roastingstick, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) +"fdX" = ( +/obj/item/toy/cards/deck{ + pixel_y = 13; + pixel_x = -9 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/generic, +/turf/open/floor/plating, +/area/station/commons/dorms/laundry) "fdY" = ( /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, /turf/closed/wall, @@ -16460,6 +16991,7 @@ /area/mine/laborcamp) "feB" = ( /obj/machinery/airalarm/directional/east, +/obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/cargo/miningdock) "feJ" = ( @@ -16516,6 +17048,13 @@ /obj/structure/sign/poster/official/random/directional/east, /turf/open/floor/wood, /area/station/service/library) +"fgo" = ( +/obj/effect/spawner/random/trash/mess, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "fgs" = ( /obj/effect/spawner/random/trash/grille_or_waste, /turf/open/floor/plating, @@ -16555,13 +17094,6 @@ dir = 1 }, /area/station/ai_monitored/command/storage/eva) -"fgS" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/random/maintenance/four, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/plating, -/area/station/construction) "fgU" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -16590,16 +17122,10 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/fore) -"fhF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/plating, -/area/station/construction) -"fhL" = ( -/obj/item/clothing/suit/apron/surgical, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) +"fhB" = ( +/obj/structure/chair/sofa/bench/left, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "fhU" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -16608,13 +17134,6 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron, /area/station/security/prison/mess) -"fhV" = ( -/obj/structure/closet/secure_closet/brig, -/obj/machinery/camera/directional/north{ - c_tag = "Security - Transport" - }, -/turf/open/floor/iron/showroomfloor, -/area/station/security/processing) "fhW" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -16659,11 +17178,28 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) +"fiq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/closet/secure_closet/medical2, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/science/xenobiology) "fiu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) +"fiv" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/structure/marker_beacon/burgundy, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "fiA" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/open/floor/iron/dark, @@ -16722,11 +17258,6 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"fjp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/grimy, -/area/station/maintenance/aft/greater) "fjt" = ( /obj/machinery/door/window/left/directional/north{ dir = 4; @@ -16740,6 +17271,11 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/science/xenobiology) +"fjz" = ( +/obj/effect/decal/cleanable/generic, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/department/chapel) "fjC" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/wood/parquet, @@ -16769,6 +17305,14 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white, /area/mine/living_quarters) +"fkc" = ( +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/sign/poster/contraband/missing_gloves/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "fkj" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -16784,6 +17328,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) +"fkt" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating/icemoon, +/area/station/maintenance/port/lesser) "fkF" = ( /obj/item/weldingtool, /turf/open/floor/plating/snowed/icemoon, @@ -16832,20 +17380,15 @@ }, /turf/open/openspace, /area/station/science/ordnance/office) +"fld" = ( +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/entry) "fle" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 4 }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"flq" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/turf/open/floor/iron, -/area/station/cargo/miningdock) "flx" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=HOP"; @@ -16870,6 +17413,13 @@ /obj/machinery/vending/wardrobe/jani_wardrobe, /turf/open/floor/iron, /area/station/service/janitor) +"flV" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/siding/wood/corner, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/wood, +/area/station/service/library) "flW" = ( /obj/machinery/atmospherics/components/tank/air, /turf/open/floor/plating, @@ -16893,6 +17443,12 @@ "fmc" = ( /turf/closed/wall, /area/station/hallway/primary/aft) +"fmg" = ( +/obj/structure/disposalpipe/junction/yjunction{ + dir = 1 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/port/lesser) "fmm" = ( /obj/structure/table, /obj/item/stack/sheet/glass/fifty{ @@ -16935,12 +17491,6 @@ "fmD" = ( /turf/open/floor/wood/parquet, /area/station/service/bar/atrium) -"fmL" = ( -/obj/machinery/light/directional/north, -/obj/structure/bed, -/obj/item/clothing/suit/jacket/straight_jacket, -/turf/open/floor/iron/white/textured, -/area/station/security/medical) "fmU" = ( /obj/structure/railing/corner{ dir = 4 @@ -16977,19 +17527,16 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/engineering/atmos) +"fnC" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/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/hallway/secondary/entry) "fnF" = ( /obj/structure/chair/sofa/middle/brown, /turf/open/floor/carpet/blue, /area/station/security/prison/work) -"fnL" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/external{ - name = "Port Docking Bay 2" - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) "fnW" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/red/warning{ @@ -16997,13 +17544,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/range) -"fob" = ( -/obj/structure/sink/directional/west, -/obj/structure/mirror/directional/east, -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, -/area/mine/eva/lower) "fog" = ( /obj/machinery/rnd/production/techfab/department/medical, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -17011,34 +17551,21 @@ }, /turf/open/floor/iron/dark, /area/station/medical/storage) +"foo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "foy" = ( /obj/item/radio/intercom/directional/south, /obj/machinery/vending/wardrobe/science_wardrobe, /turf/open/floor/iron/dark, /area/station/science/breakroom) -"foN" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) "foO" = ( /turf/open/floor/carpet, /area/station/security/prison/rec) -"foS" = ( -/obj/item/radio/intercom/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Chapel West" - }, -/obj/structure/cable, -/obj/machinery/button/door/directional/west{ - id = "lower_chapel_shutters"; - name = "Graveyard Shutters"; - pixel_y = -8 - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "foT" = ( /obj/structure/closet/emcloset/anchored, /turf/open/floor/plating, @@ -17086,6 +17613,14 @@ }, /turf/open/floor/grass, /area/station/maintenance/starboard/fore) +"fpC" = ( +/obj/structure/rack, +/obj/item/pickaxe, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/clothing/mask/breath, +/obj/structure/sign/warning/cold_temp/directional/east, +/turf/open/floor/plating, +/area/station/commons/dorms/laundry) "fpD" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, @@ -17177,7 +17712,11 @@ /turf/open/floor/iron/dark/textured_edge{ dir = 8 }, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) +"fqY" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "frd" = ( /obj/structure/railing/corner{ dir = 1 @@ -17227,17 +17766,6 @@ }, /turf/open/floor/iron/dark/corner, /area/station/engineering/atmos/storage/gas) -"frL" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/item/kirbyplants/random, -/obj/machinery/light/small/directional/east, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/starboard) "frN" = ( /obj/machinery/power/shieldwallgen, /obj/structure/window/reinforced/spawner/directional/west, @@ -17275,6 +17803,19 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/range) +"fss" = ( +/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/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "fsv" = ( /turf/open/floor/iron, /area/station/hallway/secondary/entry) @@ -17290,10 +17831,6 @@ }, /turf/open/floor/plating, /area/station/security/execution/education) -"fsO" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/department/chapel) "fsQ" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /obj/effect/turf_decal/tile/blue{ @@ -17309,14 +17846,17 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) -"ftg" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/mass_driver/trash, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +"fsZ" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, -/area/station/maintenance/disposal) +/area/station/maintenance/port/fore) "ftt" = ( /obj/structure/sign/warning/secure_area/directional/south{ desc = "A warning sign which reads 'SERVER ROOM'."; @@ -17370,10 +17910,19 @@ /area/station/maintenance/starboard/aft) "fue" = ( /obj/structure/table/wood, -/obj/item/flashlight/lamp/green, +/obj/item/flashlight/lamp/green{ + pixel_y = 14 + }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/book/manual/wiki/security_space_law{ + pixel_y = 5 + }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) +"fum" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/engineering/storage/tech) "fuD" = ( /obj/structure/tank_holder/extinguisher, /obj/structure/sign/poster/random/directional/north, @@ -17409,6 +17958,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"fuZ" = ( +/obj/structure/railing, +/obj/structure/flora/tree/pine/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "fvk" = ( /turf/open/floor/glass/reinforced, /area/station/science/xenobiology) @@ -17470,15 +18024,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/central) -"fwn" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/machinery/light/warm/directional/west, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/security/prison) "fwq" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -17489,10 +18034,6 @@ "fwB" = ( /turf/closed/mineral/snowmountain/coldroom, /area/station/service/kitchen/coldroom) -"fwC" = ( -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "fwD" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 6 @@ -17517,6 +18058,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) +"fwM" = ( +/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/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "fwO" = ( /obj/machinery/space_heater, /obj/structure/cable, @@ -17541,11 +18091,13 @@ dir = 4 }, /area/station/engineering/lobby) -"fxe" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/cold_temp, -/turf/open/floor/plating, -/area/station/construction/mining/aux_base) +"fxd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal) "fxl" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -17565,16 +18117,6 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron, /area/station/security/checkpoint/supply) -"fxJ" = ( -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/grunge{ - name = "Vacant Office A" - }, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) "fxR" = ( /obj/machinery/telecomms/hub/preset, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -17595,7 +18137,7 @@ /area/station/maintenance/starboard/aft) "fya" = ( /obj/structure/cable, -/mob/living/simple_animal/sloth/paperwork, +/mob/living/basic/sloth/paperwork, /turf/open/floor/iron, /area/station/cargo/storage) "fyc" = ( @@ -17629,6 +18171,13 @@ /obj/machinery/telecomms/server/presets/service, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) +"fyQ" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "fyR" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -17640,13 +18189,11 @@ /turf/open/floor/iron, /area/station/hallway/primary/starboard) "fza" = ( -/obj/structure/disposalpipe/junction/flip{ - 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/cable, +/obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/port/fore) "fzo" = ( @@ -17659,12 +18206,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/surgery/fore) -"fzu" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/random/maintenance/three, -/obj/structure/sign/poster/random/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "fzv" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 @@ -17680,6 +18221,9 @@ "fzA" = ( /obj/effect/spawner/random/maintenance, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/plating, /area/station/maintenance/port/aft) "fzD" = ( @@ -17691,12 +18235,6 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"fzF" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden) "fzG" = ( /obj/structure/closet{ name = "evidence closet 5" @@ -17729,17 +18267,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/storage/tech) -"fAc" = ( -/obj/effect/turf_decal/siding/white{ - dir = 8 - }, -/obj/structure/chair{ - dir = 1 - }, -/obj/structure/sign/poster/random/directional/west, -/obj/effect/turf_decal/tile/red/full, -/turf/open/floor/iron/large, -/area/station/service/kitchen/diner) "fAF" = ( /obj/structure/rack, /obj/item/clothing/gloves/boxing/green, @@ -17750,12 +18277,6 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/station/security/prison/work) -"fAW" = ( -/obj/structure/cable, -/obj/structure/railing/corner, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron, -/area/station/commons/locker) "fBc" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/yellow/line, @@ -17779,6 +18300,20 @@ }, /turf/open/floor/plating, /area/station/cargo/drone_bay) +"fBs" = ( +/obj/structure/table, +/obj/item/paper, +/obj/item/pen, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/directional/west{ + c_tag = "Labor Camp Cell 3"; + network = list("labor") + }, +/obj/machinery/flasher/directional/west{ + id = "GulagCell 1" + }, +/turf/open/floor/iron, +/area/mine/laborcamp) "fBw" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 5 @@ -17787,14 +18322,12 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"fBA" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/hfr_room) +"fBF" = ( +/obj/effect/landmark/start/hangover, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "fBM" = ( /obj/structure/chair{ dir = 4 @@ -17807,6 +18340,18 @@ /obj/structure/marker_beacon/burgundy, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) +"fBQ" = ( +/obj/structure/cable, +/turf/open/floor/iron/white/corner{ + dir = 8 + }, +/area/station/hallway/secondary/entry) +"fBR" = ( +/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/medbay/central) "fCd" = ( /obj/structure/table, /obj/machinery/button/door{ @@ -17845,6 +18390,13 @@ }, /turf/open/floor/cult, /area/station/service/chapel/office) +"fCA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) "fCM" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -17853,6 +18405,11 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/dark/textured, /area/station/security/processing) +"fCY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sink/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "fDc" = ( /obj/structure/chair/office, /obj/effect/landmark/start/warden, @@ -17894,18 +18451,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) -"fDv" = ( -/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/station/commons/locker) -"fDH" = ( -/obj/machinery/light/directional/north, -/obj/structure/flora/rock/pile/jungle/style_random, -/mob/living/carbon/human/species/monkey, -/turf/open/floor/grass, -/area/station/medical/virology) "fDI" = ( /obj/structure/table/wood, /obj/machinery/computer/records/medical/laptop{ @@ -17923,6 +18468,25 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/service/janitor) +"fDP" = ( +/obj/structure/cable, +/obj/item/radio/intercom/prison/directional/north, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"fEd" = ( +/obj/structure/table, +/obj/effect/spawner/random/maintenance/two, +/obj/effect/decal/cleanable/dirt, +/obj/item/stock_parts/capacitor, +/obj/structure/sign/poster/random/directional/north, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/maintenance/port/fore) "fEA" = ( /obj/structure/cable, /obj/machinery/door/airlock/maintenance{ @@ -17970,24 +18534,37 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/mining, /turf/open/floor/stone, /area/mine/eva/lower) +"fEX" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron, +/area/mine/laborcamp/security) "fEZ" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/commons/dorms) +"fFi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/airalarm/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 4 + }, +/area/station/engineering/transit_tube) "fFn" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 }, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) -"fFv" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Port Mix to West Ports" - }, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/engineering/atmos) "fFy" = ( /obj/machinery/space_heater, /obj/structure/sign/poster/official/random/directional/north, @@ -17999,6 +18576,13 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"fFD" = ( +/obj/structure/railing, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/structure/cable, +/obj/effect/decal/cleanable/greenglow, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal) "fFI" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -18017,18 +18601,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"fFT" = ( -/obj/structure/table/wood, -/obj/item/pen/red{ - pixel_x = 6; - pixel_y = 11 - }, -/obj/item/folder/red{ - pixel_x = -3; - pixel_y = 2 - }, -/turf/open/floor/carpet/red, -/area/station/commons/vacant_room/office) "fGn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18051,6 +18623,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/prison/workout) +"fGJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/lattice/catwalk, +/turf/open/openspace/icemoon/keep_below, +/area/station/maintenance/port/lesser) "fGM" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -18115,6 +18694,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/mix) +"fHS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/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/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) "fHY" = ( /obj/item/kirbyplants/random, /obj/machinery/button/door/directional/south{ @@ -18138,6 +18730,10 @@ dir = 1 }, /area/mine/eva/lower) +"fIb" = ( +/obj/machinery/light/warm/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/security/prison/rec) "fIn" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/item/radio/intercom/directional/north, @@ -18160,25 +18756,12 @@ "fIt" = ( /turf/closed/wall/r_wall, /area/icemoon/underground/explored) -"fIu" = ( -/obj/structure/table/glass, -/obj/machinery/light/directional/west, -/obj/item/reagent_containers/cup/bottle/epinephrine, -/obj/item/reagent_containers/cup/bottle/multiver{ - pixel_x = 6 - }, -/obj/item/reagent_containers/syringe, -/obj/machinery/defibrillator_mount/directional/north, -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/blue/full, -/turf/open/floor/iron/large, -/area/station/medical/treatment_center) -"fIH" = ( -/obj/structure/closet/lasertag/red, -/obj/effect/spawner/random/contraband/permabrig_gear, -/obj/machinery/light/warm/directional/east, -/turf/open/floor/iron, -/area/station/security/prison/workout) +"fIx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white, +/area/station/maintenance/port/fore) "fIL" = ( /obj/machinery/door/airlock{ name = "Observatory Access" @@ -18186,8 +18769,21 @@ /obj/effect/mapping_helpers/airlock/abandoned, /obj/effect/mapping_helpers/airlock/unres, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"fJd" = ( +/obj/item/kirbyplants/random, +/obj/structure/sign/warning/pods/directional/west, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/station/hallway/secondary/entry) "fJe" = ( /obj/machinery/door/airlock/external{ name = "Atmospherics External Airlock" @@ -18224,6 +18820,13 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) +"fJG" = ( +/obj/structure/rack, +/obj/item/hand_labeler, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/iron/textured, +/area/station/security/brig) "fJL" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrogen_input{ dir = 1 @@ -18240,6 +18843,20 @@ }, /turf/open/floor/grass, /area/station/service/hydroponics) +"fKe" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Engineering West" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/engineering/main) "fKf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -18248,7 +18865,7 @@ /area/station/engineering/storage_shared) "fKi" = ( /obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, /turf/open/floor/iron/white, /area/station/medical/medbay/central) @@ -18259,6 +18876,7 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 }, +/obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark/side{ dir = 4 }, @@ -18313,6 +18931,26 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos) +"fKO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, +/obj/machinery/status_display/ai/directional/east, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"fKW" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Security - Upper Permabrig Hallway North"; + network = list("ss13","prison") + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/dark/textured_edge, +/area/station/security/prison) "fLa" = ( /obj/machinery/gibber, /turf/open/floor/plating/snowed/coldroom, @@ -18348,6 +18986,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall/r_wall, /area/station/ai_monitored/security/armory/upper) +"fLC" = ( +/obj/structure/chair/stool/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/wood/large, +/area/mine/eva/lower) +"fLK" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/underground/explored) "fLP" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ dir = 10 @@ -18368,6 +19018,11 @@ }, /turf/open/floor/iron/white, /area/station/medical/surgery/fore) +"fLS" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "fLT" = ( /obj/machinery/door/airlock{ name = "Restroom" @@ -18420,7 +19075,7 @@ /turf/open/floor/iron/dark/textured_edge{ dir = 8 }, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) "fMq" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -18431,13 +19086,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) -"fMJ" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "fMP" = ( /obj/effect/turf_decal/tile/neutral/diagonal_edge, /obj/structure/cable, @@ -18449,16 +19097,6 @@ /obj/structure/closet/emcloset, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"fNj" = ( -/obj/machinery/door/airlock/external{ - name = "Common Mining Shuttle Bay" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) "fNp" = ( /obj/structure/girder, /turf/open/floor/plating/snowed/icemoon, @@ -18474,12 +19112,35 @@ dir = 1 }, /area/station/engineering/engine_smes) +"fNv" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "fNx" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 +/obj/structure/cable, +/obj/machinery/computer/quantum_console, +/turf/open/floor/iron/dark/smooth_corner, +/area/station/bitrunning/den) +"fNy" = ( +/obj/structure/rack, +/obj/item/clothing/suit/hooded/wintercoat{ + pixel_x = 3; + pixel_y = 3 }, -/turf/open/floor/iron, -/area/station/cargo/miningdock) +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/structure/sign/warning/gas_mask/directional/west, +/obj/machinery/light/small/directional/west, +/obj/machinery/mining_weather_monitor/directional/north, +/obj/effect/turf_decal/delivery/red, +/obj/machinery/camera/directional/north{ + c_tag = "Arrivals External Access"; + dir = 9 + }, +/turf/open/floor/iron/textured, +/area/station/hallway/secondary/entry) "fNA" = ( /turf/open/openspace, /area/station/medical/medbay/central) @@ -18503,17 +19164,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/science/explab) -"fOz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/stool/directional/east, -/turf/open/floor/iron, -/area/station/maintenance/starboard/fore) -"fOV" = ( -/obj/structure/chair/stool/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/wood/large, -/area/mine/eva/lower) +"fOR" = ( +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/white/side{ + dir = 9 + }, +/area/station/science/lab) "fPb" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/cable, @@ -18534,14 +19192,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /turf/open/floor/iron/freezer, /area/station/science/xenobiology) -"fPx" = ( -/obj/docking_port/stationary/random/icemoon{ - dir = 8; - name = "lavaland"; - shuttle_id = "pod_lavaland" - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/unexplored/rivers/no_monsters) "fPA" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -18552,10 +19202,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_large, /area/station/cargo/warehouse) -"fPM" = ( -/obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "fPP" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -18586,6 +19232,11 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"fQk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/stool/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) "fQu" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -18593,6 +19244,13 @@ /obj/structure/cable/layer3, /turf/open/floor/iron/grimy, /area/station/ai_monitored/turret_protected/aisat_interior) +"fQx" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "fQz" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/carpet, @@ -18608,11 +19266,20 @@ dir = 1 }, /area/station/security/prison) -"fRx" = ( -/obj/machinery/light_switch/directional/north, -/obj/machinery/light/directional/north, -/turf/open/floor/wood, -/area/station/command/meeting_room) +"fRb" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"fRv" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "fRz" = ( /obj/effect/turf_decal/trimline/green/filled/warning{ dir = 1 @@ -18622,15 +19289,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply, /turf/open/floor/iron/dark, /area/station/medical/virology) -"fRF" = ( -/obj/machinery/deepfryer, -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/structure/sign/poster/contraband/moffuchis_pizza/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Service Kitchen" - }, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "fRG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18638,13 +19296,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"fRI" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/wood, -/area/station/hallway/secondary/service) "fRJ" = ( /obj/effect/turf_decal/siding/white{ dir = 1 @@ -18671,6 +19322,17 @@ /obj/structure/railing/corner, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) +"fSi" = ( +/obj/structure/cable/multilayer/multiz, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/sign/nanotrasen{ + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "fSj" = ( /obj/effect/decal/cleanable/oil, /turf/open/floor/plating, @@ -18681,6 +19343,20 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"fSv" = ( +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"fSC" = ( +/obj/effect/turf_decal/bot, +/obj/effect/landmark/start/hangover, +/obj/structure/sign/warning/electric_shock/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"fSG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/closed/wall/r_wall, +/area/station/science/ordnance/burnchamber) "fTb" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -18698,6 +19374,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/access/all/command/general, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/station/command/meeting_room) "fTo" = ( @@ -18726,20 +19403,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"fTz" = ( -/obj/machinery/door/airlock/security/glass{ - id_tag = "permainner"; - name = "Permabrig Transfer" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "perma-entrance" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/siding/red/corner{ - dir = 4 - }, -/turf/open/floor/iron/dark/textured, -/area/station/security/execution/transfer) "fTB" = ( /obj/machinery/power/turbine/core_rotor{ dir = 8; @@ -18789,18 +19452,11 @@ }, /turf/open/floor/glass/reinforced, /area/station/hallway/primary/starboard) -"fUb" = ( -/obj/structure/table/glass, -/obj/item/storage/medkit/regular, -/obj/machinery/newscaster/directional/east, -/obj/effect/turf_decal/tile/green/full, -/turf/open/floor/iron/white/smooth_large, -/area/station/medical/medbay/aft) "fUc" = ( /turf/open/floor/plating, /area/station/maintenance/department/electrical) "fUj" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /turf/open/floor/iron/white/textured, /area/station/security/medical) "fUn" = ( @@ -18863,11 +19519,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"fVq" = ( -/obj/item/trash/cheesie, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "fVD" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock/engineering{ @@ -18912,19 +19563,14 @@ /obj/item/plant_analyzer, /turf/open/floor/grass, /area/station/security/prison/garden) -"fWr" = ( -/obj/effect/turf_decal/siding/white{ - dir = 1 - }, -/obj/structure/chair{ - dir = 4 - }, -/obj/structure/sign/poster/random/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Service Diner North" - }, -/turf/open/floor/iron/white/smooth_large, -/area/station/service/kitchen/diner) +"fWo" = ( +/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, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/mine/laborcamp) "fWw" = ( /obj/structure/railing/corner, /turf/open/misc/asteroid/snow/icemoon, @@ -18942,6 +19588,10 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/aft/greater) +"fWN" = ( +/obj/effect/turf_decal/tile/green/half/contrasted, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "fWO" = ( /obj/effect/spawner/random/trash/mess, /turf/open/floor/plating, @@ -18951,17 +19601,6 @@ /obj/structure/barricade/wooden/crude/snow, /turf/open/floor/wood, /area/station/maintenance/space_hut/cabin) -"fWU" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/chair/sofa/left/brown{ - dir = 1 - }, -/obj/effect/landmark/start/hangover, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/grimy, -/area/station/commons/lounge) "fWX" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating/snowed/icemoon, @@ -18975,13 +19614,16 @@ }, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) -"fXi" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 1 +"fXo" = ( +/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/neutral/anticorner/contrasted{ + dir = 4 }, -/turf/open/floor/iron/dark/corner, -/area/station/security/processing) +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/commons/dorms) "fXr" = ( /turf/open/floor/iron/white/corner{ dir = 8 @@ -19014,6 +19656,27 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/mine/laborcamp) +"fYe" = ( +/obj/structure/closet/crate, +/obj/item/reagent_containers/cup/glass/waterbottle{ + pixel_x = 7; + pixel_y = 6 + }, +/obj/item/reagent_containers/cup/glass/waterbottle{ + pixel_x = 7; + pixel_y = 6 + }, +/obj/item/reagent_containers/cup/glass/waterbottle{ + pixel_x = 7; + pixel_y = 6 + }, +/obj/item/food/canned/beans, +/obj/item/food/canned/beans, +/obj/item/food/canned/beans, +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/mouse/white, +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) "fYh" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/structure/disposalpipe/segment{ @@ -19030,11 +19693,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/security/prison/work) -"fYj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/starboard/fore) "fYF" = ( /obj/structure/sign/poster/contraband/random/directional/west, /turf/open/openspace, @@ -19058,6 +19716,12 @@ "fYS" = ( /turf/closed/wall, /area/station/commons/storage/primary) +"fYW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/large, +/area/station/hallway/secondary/entry) "fZb" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "miner-passthrough" @@ -19077,13 +19741,6 @@ }, /turf/open/floor/plating, /area/station/command/teleporter) -"fZk" = ( -/obj/structure/table/optable{ - name = "Robotics Operating Table" - }, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/iron, -/area/station/maintenance/port/fore) "fZo" = ( /obj/structure/railing/corner{ dir = 4 @@ -19111,13 +19768,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"gaa" = ( -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "gad" = ( /obj/item/radio/intercom/directional/east, /obj/structure/table/reinforced, @@ -19134,6 +19784,10 @@ }, /turf/open/floor/iron, /area/station/command/gateway) +"gak" = ( +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/locker) "gam" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/mining/glass{ @@ -19198,17 +19852,6 @@ /obj/effect/turf_decal/box/corners, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) -"gaz" = ( -/obj/structure/table, -/obj/machinery/light/directional/east, -/obj/machinery/firealarm/directional/east, -/obj/item/pipe_dispenser, -/obj/item/pipe_dispenser{ - pixel_x = 3; - pixel_y = 7 - }, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/office) "gaS" = ( /obj/item/hot_potato/harmless/toy, /obj/structure/table/wood, @@ -19219,7 +19862,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 8 }, /turf/open/floor/iron/smooth_corner{ @@ -19245,30 +19888,15 @@ }, /turf/open/floor/iron, /area/station/command/gateway) -"gbl" = ( -/obj/structure/table, -/obj/item/camera_film, -/obj/item/camera, -/obj/machinery/firealarm/directional/south, -/obj/machinery/camera/directional/east{ - c_tag = "Art Storage" - }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted, -/turf/open/floor/iron/white/corner{ - dir = 1 - }, -/area/station/commons/storage/art) -"gbq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/station/maintenance/port/aft) -"gbt" = ( -/obj/effect/spawner/structure/window/reinforced, +"gbf" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, -/area/station/security/checkpoint/customs/auxiliary) +/area/station/maintenance/starboard/fore) +"gbh" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "gbu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19289,38 +19917,6 @@ /obj/structure/sign/warning/secure_area/directional/west, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) -"gbB" = ( -/obj/structure/closet/crate, -/obj/item/reagent_containers/cup/glass/waterbottle{ - pixel_x = 7; - pixel_y = 6 - }, -/obj/item/reagent_containers/cup/glass/waterbottle{ - pixel_x = 7; - pixel_y = 6 - }, -/obj/item/reagent_containers/cup/glass/waterbottle{ - pixel_x = 7; - pixel_y = 6 - }, -/obj/item/food/canned/beans, -/obj/item/food/canned/beans, -/obj/item/food/canned/beans, -/obj/effect/decal/cleanable/dirt, -/mob/living/basic/mouse/white, -/turf/open/floor/iron, -/area/station/maintenance/starboard/fore) -"gbF" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 9 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics) "gbH" = ( /obj/machinery/conveyor{ id = "mining_internal" @@ -19370,24 +19966,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/storage) -"gbS" = ( -/obj/structure/table/glass, -/obj/item/food/grown/wheat, -/obj/item/food/grown/watermelon, -/obj/item/food/grown/watermelon, -/obj/item/food/grown/watermelon, -/obj/item/food/grown/citrus/orange, -/obj/item/food/grown/grapes, -/obj/item/food/grown/cocoapod, -/obj/machinery/newscaster/directional/west, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden) "gca" = ( /obj/structure/table, /obj/machinery/cell_charger, @@ -19406,18 +19984,17 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/plating, /area/station/security/processing) -"gcx" = ( -/obj/machinery/computer/mecha{ - dir = 1 - }, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/machinery/keycard_auth/directional/south, -/obj/machinery/camera/autoname/directional/south{ - c_tag = "Research Director's Office"; - network = list("ss13","rd") - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/rd) +"gcm" = ( +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/machinery/light/small/directional/east, +/turf/open/floor/grass, +/area/station/service/hydroponics) +"gcu" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "gcy" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -19427,16 +20004,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"gcE" = ( -/obj/structure/chair/wood{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/sign/poster/contraband/random/directional/south, -/turf/open/floor/eighties/red, -/area/station/security/prison/safe) "gcV" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 @@ -19462,14 +20029,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible, /turf/open/floor/iron, /area/station/engineering/atmos) -"gdx" = ( -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white/corner, -/area/station/hallway/secondary/entry) "gdC" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -19502,6 +20061,13 @@ }, /turf/open/floor/iron/smooth, /area/mine/eva/lower) +"gdY" = ( +/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/green/half/contrasted, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "gea" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19517,10 +20083,27 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, /area/station/science/explab) +"gel" = ( +/obj/structure/table/wood, +/obj/machinery/newscaster/directional/south, +/obj/item/radio/intercom/directional/west, +/obj/item/flashlight/lamp/green{ + pixel_y = 5 + }, +/turf/open/floor/iron/grimy, +/area/station/hallway/secondary/entry) "gem" = ( /obj/structure/railing, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) +"geq" = ( +/obj/structure/closet/secure_closet/personal{ + anchored = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/iron, +/area/station/commons/locker) "geJ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -19563,6 +20146,13 @@ /obj/effect/turf_decal/siding/yellow, /turf/open/floor/iron, /area/station/engineering/storage) +"gfu" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/computer/order_console/bitrunning{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "gfw" = ( /obj/machinery/light/small/directional/west, /obj/structure/table, @@ -19580,6 +20170,11 @@ }, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"gfC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/light_construct/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "gfE" = ( /obj/machinery/light/small/directional/west, /obj/structure/chair/stool/directional/south, @@ -19600,18 +20195,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria, /area/station/commons/storage/art) -"ggk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/mine/laborcamp) +"gfY" = ( +/obj/effect/spawner/random/structure/tank_holder, +/obj/structure/sign/poster/official/wtf_is_co2/directional/east, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron, +/area/station/maintenance/port/fore) +"gga" = ( +/obj/machinery/light/small/directional/west, +/obj/effect/spawner/random/trash/hobo_squat, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "ggn" = ( /obj/machinery/door/airlock/atmos{ name = "Atmospherics Maintenance" @@ -19624,6 +20218,15 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"ggv" = ( +/obj/effect/turf_decal/bot, +/obj/structure/sign/warning/xeno_mining{ + pixel_x = 2; + pixel_y = -32 + }, +/obj/machinery/shower/directional/north, +/turf/open/floor/iron/smooth, +/area/mine/eva) "ggD" = ( /obj/structure/chair{ dir = 4 @@ -19645,9 +20248,36 @@ /obj/structure/sign/warning/biohazard/directional/west, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) +"ggV" = ( +/obj/machinery/conveyor{ + id = "gulag" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/mine/laborcamp) +"ghj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Gas to Chamber" + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine, +/area/station/engineering/supermatter) +"ghl" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/cargo/storage) "ghx" = ( /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) +"ghz" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/closet/crate, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) "ghE" = ( /obj/structure/disposalpipe/segment, /obj/machinery/camera/directional/west{ @@ -19681,6 +20311,14 @@ "ghY" = ( /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/atmos) +"gif" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/plastic, +/obj/structure/sign/warning/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "giD" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/siding/wideplating/dark{ @@ -19689,12 +20327,6 @@ /obj/item/seeds/watermelon, /turf/open/floor/grass, /area/station/maintenance/starboard/fore) -"giH" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/airalarm/directional/south, -/obj/machinery/light/directional/south, -/turf/open/openspace, -/area/station/science/xenobiology) "giN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/trimline/yellow/line, @@ -19764,16 +20396,6 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron, /area/station/science/robotics/lab) -"gjh" = ( -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/machinery/duct, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/red/full, -/turf/open/floor/iron/large, -/area/station/service/kitchen/diner) "gjq" = ( /turf/open/openspace/icemoon/keep_below, /area/icemoon/underground/explored) @@ -19784,6 +20406,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) +"gjN" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/secondary/entry) "gjP" = ( /obj/structure/table, /obj/item/clothing/gloves/cargo_gauntlet, @@ -19803,6 +20436,14 @@ /obj/structure/chair, /turf/open/floor/iron/cafeteria, /area/station/hallway/secondary/exit/departure_lounge) +"gjZ" = ( +/obj/machinery/door/airlock/security{ + name = "Security Checkpoint" + }, +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/customs/auxiliary) "gka" = ( /turf/closed/wall/r_wall, /area/station/engineering/supermatter/room) @@ -19854,6 +20495,14 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron, /area/station/engineering/atmos) +"gkZ" = ( +/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, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "glc" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -19864,6 +20513,18 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"gle" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/cold_temp{ + pixel_x = -2; + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/turf/open/floor/iron/dark/side, +/area/mine/eva/lower) "glh" = ( /turf/closed/wall/r_wall, /area/station/maintenance/solars/port/aft) @@ -19876,18 +20537,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/department/chapel) -"glz" = ( -/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") +"gls" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply, +/obj/effect/turf_decal/tile/dark{ + dir = 8 }, -/turf/open/floor/iron, -/area/mine/laborcamp) +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/white, +/area/station/medical/virology) "glC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -19897,10 +20560,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/department/electrical) -"glN" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "glP" = ( /obj/structure/railing/corner, /obj/item/storage/belt/utility, @@ -19943,13 +20602,17 @@ }, /turf/open/floor/iron/dark/airless, /area/station/science/ordnance/freezerchamber) -"gmn" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 +"gmf" = ( +/obj/structure/table/glass, +/obj/machinery/reagentgrinder{ + pixel_y = 8 }, -/turf/open/floor/iron, -/area/station/commons/dorms) +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 6 + }, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/virology) "gmB" = ( /obj/structure/stairs/south{ dir = 1 @@ -20023,10 +20686,22 @@ /obj/effect/mapping_helpers/airlock/access/any/security/general, /turf/open/floor/iron/dark, /area/station/engineering/lobby) +"gnq" = ( +/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/ordnance) "gnw" = ( /obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible, /turf/open/floor/iron, /area/station/engineering/atmos) +"gnA" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/command/heads_quarters/hop) "gnL" = ( /obj/structure/closet/bombcloset/security, /turf/open/floor/iron/smooth, @@ -20039,14 +20714,6 @@ }, /turf/open/floor/wood, /area/station/command/meeting_room) -"gnQ" = ( -/obj/structure/table, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/cargo/miningdock) "gnR" = ( /obj/structure/toilet/greyscale{ cistern = 1; @@ -20070,11 +20737,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"goi" = ( -/obj/machinery/light/directional/east, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/wood, -/area/station/service/library) "goq" = ( /obj/structure/statue/snow/snowman, /turf/open/misc/asteroid/snow/standard_air, @@ -20112,6 +20774,17 @@ /obj/effect/turf_decal/tile/green/full, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/virology) +"goI" = ( +/obj/structure/curtain/bounty/start_closed, +/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/commons/vacant_room/office) +"goJ" = ( +/obj/structure/flora/rock/pile/jungle/style_random, +/mob/living/carbon/human/species/monkey, +/turf/open/floor/grass, +/area/station/medical/virology) "gpj" = ( /obj/structure/chair/sofa/corp/right{ dir = 8 @@ -20205,12 +20878,6 @@ dir = 8 }, /area/station/command/heads_quarters/rd) -"gqV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/greenglow, -/obj/structure/sign/poster/official/safety_eye_protection/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "gqZ" = ( /obj/machinery/status_display/door_timer{ id = "Cell 2"; @@ -20224,18 +20891,11 @@ }, /turf/open/floor/iron/textured, /area/station/security/brig) -"grh" = ( -/obj/machinery/vending/security, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/smooth_edge, -/area/station/security/lockers) -"gri" = ( -/obj/structure/chair/stool/directional/west, -/obj/machinery/camera/emp_proof/directional/south, -/obj/effect/turf_decal/tile/blue/opposingcorners{ +"grk" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, -/turf/open/floor/iron/cafeteria, +/turf/open/floor/plating, /area/station/commons/dorms/laundry) "grr" = ( /obj/structure/table, @@ -20255,27 +20915,14 @@ /obj/structure/sign/warning/fire/directional/south, /turf/open/floor/glass/reinforced, /area/station/science/ordnance/office) -"grz" = ( -/obj/machinery/exodrone_launcher, -/obj/item/exodrone{ - pixel_y = 8 - }, -/obj/effect/turf_decal/trimline/yellow/end, -/obj/effect/turf_decal/trimline/yellow/mid_joiner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/mid_joiner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/mid_joiner, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/iron/smooth_large, -/area/station/cargo/drone_bay) "grA" = ( /obj/structure/table/reinforced, /obj/item/assembly/flash/handheld, /obj/item/assembly/flash/handheld, /obj/machinery/newscaster/directional/west, +/obj/item/wrench{ + pixel_y = 17 + }, /turf/open/floor/iron, /area/station/command/bridge) "grD" = ( @@ -20347,10 +20994,23 @@ /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron/dark/side, /area/mine/eva) -"gsH" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron, -/area/station/maintenance/starboard/fore) +"gsK" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) +"gsN" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/customs/auxiliary) "gsT" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -20370,6 +21030,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/service/kitchen/coldroom) +"gta" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/table, +/obj/item/folder, +/obj/item/pen, +/turf/open/floor/iron, +/area/station/commons/locker) "gtc" = ( /obj/effect/turf_decal/siding/white{ dir = 1 @@ -20394,17 +21061,6 @@ /obj/effect/spawner/random/maintenance/three, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"gtt" = ( -/obj/structure/rack, -/obj/effect/spawner/random/clothing/costume, -/obj/effect/spawner/random/clothing/costume, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/maintenance/port/fore) "gtw" = ( /obj/effect/turf_decal/tile/neutral/diagonal_edge, /turf/open/floor/iron/kitchen/diagonal, @@ -20415,6 +21071,12 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"gtG" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/spawner/random/vending/colavend, +/turf/open/floor/iron, +/area/station/commons/locker) "guS" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20453,6 +21115,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison/workout) +"gvp" = ( +/obj/item/chair/stool{ + pixel_y = -3; + pixel_x = -1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "gvK" = ( /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/dark, @@ -20463,20 +21134,39 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron, /area/station/science/xenobiology) -"gvV" = ( -/obj/machinery/hydroponics/constructable, -/obj/item/seeds/soya, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/mine/laborcamp) "gwm" = ( /obj/machinery/door/firedoor/heavy, /turf/open/floor/iron/white/side{ dir = 9 }, /area/station/science/research) +"gwp" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/full, +/obj/machinery/holopad, +/turf/open/floor/iron/large, +/area/station/commons/locker) +"gwq" = ( +/obj/machinery/computer/records/security, +/obj/machinery/requests_console/directional/north{ + department = "Security"; + name = "Security Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/customs/auxiliary) +"gwy" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/machinery/light/warm/directional/north, +/turf/open/misc/ashplanet/wateryrock{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + }, +/area/station/security/prison/rec) "gwz" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -20499,10 +21189,17 @@ "gwK" = ( /turf/closed/wall/r_wall, /area/station/security/checkpoint/engineering) -"gxn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/science/ordnance) +"gwM" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/small/dim/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/visible, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/maintenance/port/fore) "gxq" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -20574,15 +21271,6 @@ /obj/item/storage/medkit/regular, /turf/open/floor/iron, /area/station/commons/dorms) -"gyc" = ( -/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/port/greater) "gyf" = ( /obj/structure/table/wood, /obj/machinery/newscaster/directional/south, @@ -20610,6 +21298,18 @@ }, /turf/open/floor/grass, /area/station/service/hydroponics) +"gyC" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) +"gyH" = ( +/obj/machinery/light/directional/north, +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "gyR" = ( /turf/closed/wall/r_wall, /area/station/engineering/main) @@ -20618,17 +21318,6 @@ /obj/effect/turf_decal/tile/green/full, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/virology) -"gzd" = ( -/obj/machinery/light/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Atmospherics - HFR North" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/hfr_room) "gzv" = ( /turf/open/floor/iron, /area/mine/production) @@ -20644,17 +21333,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"gzB" = ( -/obj/machinery/recharge_station, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron, -/area/station/science/robotics/mechbay) -"gzN" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "gzV" = ( /obj/structure/mineral_door/paperframe{ name = "Meditation Room" @@ -20668,6 +21346,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/starboard/fore) +"gAd" = ( +/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/dim/directional/north, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "gAk" = ( /obj/machinery/airalarm/directional/east, /obj/structure/closet/l3closet/scientist, @@ -20696,6 +21382,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/service/hydroponics) +"gAB" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/locker) "gAD" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/siding/wood{ @@ -20756,19 +21447,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/carpet/blue, /area/station/security/prison/work) -"gBk" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Central Hallway East" - }, -/obj/machinery/status_display/evac/directional/west, -/obj/structure/disposalpipe/junction/flip{ - dir = 2 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "gBl" = ( /obj/structure/sign/warning/electric_shock, /turf/closed/wall/r_wall, @@ -20780,13 +21458,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"gBs" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) "gBv" = ( /obj/machinery/door/window/left/directional/south{ name = "Engineering Delivery"; @@ -20849,6 +21520,14 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"gCq" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/firealarm/directional/east, +/obj/machinery/status_display/ai/directional/north, +/obj/effect/turf_decal/siding/white, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "gCu" = ( /obj/structure/closet/emcloset, /turf/open/floor/plating, @@ -20920,11 +21599,6 @@ dir = 1 }, /area/mine/eva) -"gDO" = ( -/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/secondary/entry) "gDS" = ( /obj/structure/table, /obj/effect/spawner/random/maintenance, @@ -20994,13 +21668,6 @@ /obj/effect/mapping_helpers/airlock/access/any/engineering/general, /turf/open/floor/plating, /area/station/engineering/storage_shared) -"gEw" = ( -/obj/machinery/suit_storage_unit/rd, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron/smooth_half, -/area/station/command/heads_quarters/rd) "gEz" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/space_heater, @@ -21023,14 +21690,6 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) -"gEQ" = ( -/obj/machinery/shower/directional/east, -/obj/structure/sign/warning/gas_mask{ - desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals."; - pixel_x = -29 - }, -/turf/open/floor/iron/smooth, -/area/mine/eva) "gER" = ( /turf/open/floor/iron, /area/station/command/bridge) @@ -21071,6 +21730,14 @@ /obj/structure/tank_holder/extinguisher, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"gFL" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/station/hallway/secondary/entry) "gFR" = ( /obj/structure/table/reinforced, /obj/item/clothing/suit/utility/radiation, @@ -21126,6 +21793,15 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/plating, /area/station/engineering/main) +"gGx" = ( +/obj/machinery/dna_scannernew, +/obj/machinery/camera/directional/west{ + c_tag = "Research Division Genetics Lab"; + network = list("ss13","rd") + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/science/genetics) "gGC" = ( /obj/structure/table, /obj/item/stack/sheet/glass/fifty, @@ -21149,14 +21825,17 @@ /obj/effect/spawner/random/trash/mess, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"gGJ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, +"gGH" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) +/obj/structure/light_construct/directional/west, +/turf/open/floor/plating, +/area/station/construction) +"gGK" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "gGZ" = ( /obj/machinery/computer/bank_machine, /obj/effect/turf_decal/bot_white, @@ -21203,6 +21882,8 @@ /turf/open/floor/iron/white, /area/station/medical/treatment_center) "gHv" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) "gHA" = ( @@ -21241,6 +21922,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) +"gHR" = ( +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/donkpockets{ + pixel_y = 8 + }, +/obj/structure/sign/poster/random/directional/north, +/turf/open/floor/iron/white/smooth_large, +/area/station/service/kitchen/diner) "gHS" = ( /obj/structure/chair/stool/directional/north, /obj/effect/turf_decal/tile/neutral/half/contrasted, @@ -21251,29 +21943,21 @@ /obj/structure/chair/stool/directional/west, /turf/open/floor/iron/checker, /area/station/science/lab) -"gIk" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) "gIl" = ( /obj/structure/fence/corner{ dir = 6 }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"gIt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/department/electrical) "gIu" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/mine/mechbay) -"gIx" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark/textured_edge{ - dir = 4 - }, -/area/station/security/prison) "gIF" = ( /obj/machinery/holopad, /turf/open/floor/iron/showroomfloor, @@ -21314,10 +21998,12 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/iron, /area/station/commons/dorms) -"gJM" = ( -/obj/structure/grille, +"gJK" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, /turf/open/floor/plating, -/area/station/maintenance/port/greater) +/area/station/commons/dorms/laundry) "gJT" = ( /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/white/side{ @@ -21342,7 +22028,9 @@ "gKk" = ( /obj/structure/table/reinforced, /obj/item/storage/secure/safe/caps_spare/directional/east, -/obj/item/papercutter, +/obj/item/papercutter{ + pixel_x = 7 + }, /turf/open/floor/iron, /area/station/command/bridge) "gKl" = ( @@ -21368,10 +22056,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"gKq" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/grimy, -/area/station/maintenance/aft/greater) "gKG" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/green{ @@ -21390,14 +22074,6 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/central) -"gLl" = ( -/obj/structure/closet/emcloset, -/obj/machinery/camera/directional/north{ - c_tag = "Security - Access" - }, -/obj/effect/turf_decal/tile/red/half, -/turf/open/floor/iron/smooth_half, -/area/station/security/brig/upper) "gLo" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/wood/tile, @@ -21439,6 +22115,24 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/dark, /area/station/commons/fitness) +"gMt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"gMw" = ( +/obj/structure/sign/warning/gas_mask{ + desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals."; + pixel_x = -29 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/smooth, +/area/mine/eva) "gMK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21468,6 +22162,15 @@ }, /turf/open/floor/iron/dark/corner, /area/station/engineering/atmos) +"gMT" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/station/maintenance/aft/greater) +"gMV" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/bitrunning/den) "gMZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21509,6 +22212,17 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison/workout) +"gNJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"gNL" = ( +/obj/machinery/status_display/evac/directional/south, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/grimy, +/area/station/hallway/secondary/entry) "gNP" = ( /obj/machinery/oven/range, /turf/open/floor/iron/cafeteria, @@ -21528,6 +22242,39 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/command/heads_quarters/cmo) +"gOg" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "MiniSat Atmospherics"; + network = list("minisat"); + start_active = 1 + }, +/obj/machinery/space_heater, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/ai_monitored/turret_protected/aisat/atmos) +"gOi" = ( +/obj/structure/rack, +/obj/item/clothing/glasses/sunglasses/big{ + pixel_x = 4; + pixel_y = 8 + }, +/obj/item/clothing/glasses/sunglasses/big{ + pixel_x = 4; + pixel_y = 2 + }, +/obj/item/taperecorder, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"gOq" = ( +/obj/effect/spawner/random/trash, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "gOx" = ( /obj/effect/turf_decal/loading_area, /obj/effect/turf_decal/tile/neutral/half/contrasted, @@ -21546,18 +22293,6 @@ }, /turf/open/openspace, /area/station/cargo/storage) -"gOM" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Xenobiology Pens Observation - Port Fore"; - network = list("ss13","rd","xeno") - }, -/obj/machinery/light/directional/west, -/turf/open/openspace, -/area/station/science/xenobiology) -"gOR" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "gOS" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21610,14 +22345,6 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/iron/showroomfloor, /area/station/security/warden) -"gPu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) "gPE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -21625,16 +22352,6 @@ dir = 8 }, /area/station/science/research) -"gPF" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/mail_sorting/supply/disposals, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "gPR" = ( /obj/effect/turf_decal/trimline/green/filled/warning, /obj/machinery/duct, @@ -21654,14 +22371,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/science/breakroom) -"gQd" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Chapel South" - }, -/obj/machinery/status_display/evac/directional/south, -/obj/structure/closet/crate/bin, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "gQe" = ( /obj/structure/railing{ dir = 8 @@ -21700,6 +22409,17 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"gQD" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/red{ + dir = 8 + }, +/obj/effect/spawner/random/maintenance, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/maintenance/port/fore) "gQE" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -21727,11 +22447,15 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/central) -"gRa" = ( -/obj/machinery/airalarm/directional/east, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/commons/storage/mining) +"gRl" = ( +/obj/effect/landmark/start/hangover, +/obj/structure/chair/wood{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood/parquet, +/area/station/commons/lounge) "gRm" = ( /obj/structure/grille/broken, /obj/effect/decal/cleanable/dirt, @@ -21753,20 +22477,28 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/commons/locker) +"gRs" = ( +/obj/structure/sign/warning/electric_shock/directional/north, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "gRI" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"gSa" = ( -/obj/structure/toilet{ - pixel_y = 12 +"gRZ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 }, /obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/landmark/start/psychologist, -/turf/open/floor/iron/freezer, -/area/station/medical/break_room) +/turf/open/floor/iron, +/area/station/security/prison/visit) "gSr" = ( /obj/structure/table/reinforced, /obj/item/clothing/suit/utility/radiation, @@ -21781,6 +22513,28 @@ "gSy" = ( /turf/open/floor/iron, /area/station/security/prison/workout) +"gSE" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) +"gSK" = ( +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/mine/eva/lower) "gSN" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -21803,6 +22557,18 @@ dir = 1 }, /area/station/service/chapel/office) +"gTb" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "QMLoad" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/sign/warning/cold_temp/directional/west, +/obj/machinery/light/directional/west, +/turf/open/floor/plating, +/area/station/cargo/storage) "gTi" = ( /obj/machinery/door/airlock/medical/glass{ name = "Medbay Chemistry Access" @@ -21828,13 +22594,6 @@ }, /turf/open/openspace, /area/station/security/prison) -"gTH" = ( -/obj/structure/closet/wardrobe/miner, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/cargo/miningdock) "gTK" = ( /turf/closed/wall, /area/station/engineering/engine_smes) @@ -21849,22 +22608,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/cryo) -"gUj" = ( -/obj/machinery/light/directional/east, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/commons/locker) -"gUo" = ( -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/obj/machinery/firealarm/directional/west, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/wood, -/area/station/service/library) "gUp" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner{ @@ -21927,22 +22670,24 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/dark, /area/station/science/breakroom) +"gVm" = ( +/obj/item/coin/silver{ + pixel_y = -3; + pixel_x = -5 + }, +/obj/item/toy/plush/moth{ + pixel_y = 5; + pixel_x = 5; + name = "Marcellus" + }, +/turf/open/floor/plating, +/area/station/commons/dorms/laundry) "gVn" = ( /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/secondary/service) -"gVr" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/status_display/evac/directional/west, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "gVt" = ( /obj/item/radio/intercom/directional/west, /obj/effect/turf_decal/tile/red{ @@ -22003,6 +22748,14 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark, /area/station/security/courtroom) +"gWf" = ( +/obj/item/storage/box/lights/mixed, +/obj/structure/table, +/obj/item/crowbar, +/obj/item/wrench, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/medical/morgue) "gWr" = ( /obj/structure/tank_dispenser, /turf/open/floor/iron/dark, @@ -22046,15 +22799,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/cmo) -"gXl" = ( -/obj/machinery/dna_scannernew, -/obj/machinery/light/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Research Division Genetics Lab"; - network = list("ss13","rd") - }, -/turf/open/floor/iron/dark, -/area/station/science/genetics) "gXm" = ( /obj/structure/extinguisher_cabinet/directional/south, /obj/effect/decal/cleanable/dirt, @@ -22071,6 +22815,20 @@ /obj/item/pen, /turf/open/floor/wood, /area/station/service/library) +"gXr" = ( +/obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{ + dir = 1 + }, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2{ + dir = 1 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "gXv" = ( /obj/machinery/portable_atmospherics/pump/lil_pump, /turf/open/floor/iron/dark, @@ -22091,11 +22849,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/lab) -"gXS" = ( -/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/entry) "gYa" = ( /obj/structure/railing{ dir = 9 @@ -22115,12 +22868,6 @@ /obj/effect/spawner/structure/window/hollow/reinforced, /turf/open/floor/plating, /area/mine/living_quarters) -"gYm" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white/side{ - dir = 9 - }, -/area/station/science/research) "gYp" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -22151,7 +22898,9 @@ pixel_x = -3; pixel_y = 7 }, -/obj/item/pen, +/obj/item/pen{ + pixel_x = 12 + }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) "gYG" = ( @@ -22162,11 +22911,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"gYR" = ( -/obj/machinery/vending/clothing, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/commons/locker) "gZa" = ( /obj/structure/sign/nanotrasen{ pixel_x = -32 @@ -22179,16 +22923,20 @@ /mob/living/carbon/human/species/monkey, /turf/open/floor/grass, /area/station/medical/virology) -"gZj" = ( -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/emergency, -/obj/item/wrench, -/obj/item/assembly/timer, -/obj/item/assembly/signaler, -/obj/item/assembly/signaler, -/obj/machinery/status_display/ai/directional/east, +"gZc" = ( +/obj/structure/sign/warning/electric_shock/directional/north, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, /turf/open/floor/iron, -/area/station/command/bridge) +/area/station/hallway/primary/port) +"gZk" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/random/maintenance/four, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/random/directional/north, +/turf/open/floor/plating, +/area/station/construction) "gZl" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -22222,15 +22970,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/science/ordnance/office) -"gZz" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/chem_master, -/obj/structure/sign/warning/no_smoking/circle{ - pixel_x = -27; - pixel_y = -26 - }, -/turf/open/floor/glass/reinforced, -/area/station/medical/treatment_center) "gZP" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -22246,6 +22985,17 @@ dir = 1 }, /area/station/security/prison) +"gZT" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Atmospherics - HFR North" + }, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "hac" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ dir = 9 @@ -22286,10 +23036,6 @@ "hap" = ( /turf/open/floor/vault, /area/station/security/prison/rec) -"haq" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/mine/eva/lower) "haw" = ( /obj/item/storage/secure/safe/directional/south, /obj/machinery/light/directional/south, @@ -22298,27 +23044,63 @@ }, /turf/open/floor/plating, /area/station/commons/vacant_room/commissary) +"hay" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/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 = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "haC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) -"haQ" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/incinerator_input{ - dir = 8 +"haD" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) -"hbm" = ( /obj/structure/cable, -/obj/structure/sign/poster/contraband/random/directional/east, -/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/port/greater) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/port/lesser) +"haN" = ( +/obj/machinery/deepfryer, +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/sign/poster/contraband/moffuchis_pizza/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Service Kitchen" + }, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "hbp" = ( /obj/machinery/photocopier, /turf/open/floor/wood, /area/station/command/meeting_room) +"hbt" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/effect/spawner/random/clothing/mafia_outfit, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/bureaucracy/briefcase{ + pixel_y = 8 + }, +/obj/item/toy/gun, +/obj/effect/spawner/random/entertainment/money_small, +/obj/effect/turf_decal/siding/wood, +/obj/effect/spawner/random/trash/box, +/turf/open/floor/iron/grimy, +/area/station/commons/vacant_room/office) +"hby" = ( +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"hbI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) "hbR" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -22338,13 +23120,13 @@ dir = 1 }, /area/station/service/hydroponics) -"hbV" = ( -/obj/machinery/vending/tool, -/obj/effect/turf_decal/bot, -/obj/structure/sign/poster/official/build/directional/north, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/commons/storage/primary) +"hbY" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "hce" = ( /obj/machinery/door/airlock{ id_tag = "AuxToilet3"; @@ -22368,6 +23150,14 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"hcw" = ( +/obj/docking_port/stationary/random/icemoon{ + dir = 8; + name = "lavaland"; + shuttle_id = "pod_2_lavaland" + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "hcG" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -22458,26 +23248,25 @@ }, /turf/open/floor/iron, /area/mine/laborcamp) -"hdW" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/obj/structure/chair/office{ - dir = 8 - }, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"hed" = ( -/obj/structure/sign/map/left{ - pixel_y = 32 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"heg" = ( +/obj/effect/spawner/random/engineering/canister, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"hek" = ( +/obj/structure/table, +/obj/item/stack/sheet/glass, +/obj/item/stack/sheet/glass, +/obj/item/stack/sheet/glass, +/obj/item/stock_parts/matter_bin, +/obj/item/stock_parts/matter_bin, +/obj/item/stock_parts/scanning_module, +/obj/item/stock_parts/scanning_module, /obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/iron/white/side{ + dir = 10 + }, +/area/station/science/lab) "het" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/gas_mask, @@ -22529,6 +23318,11 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron, /area/station/command/bridge) +"heW" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "heX" = ( /obj/structure/cable, /turf/open/floor/wood, @@ -22554,6 +23348,11 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"hfm" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "hfv" = ( /obj/machinery/processor{ pixel_y = 6 @@ -22587,6 +23386,16 @@ "hgh" = ( /turf/closed/wall, /area/station/medical/medbay/lobby) +"hgr" = ( +/turf/open/floor/glass/reinforced, +/area/station/hallway/secondary/entry) +"hgx" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "hgH" = ( /obj/item/radio/intercom/prison/directional/west, /turf/open/floor/iron/dark/textured, @@ -22614,6 +23423,20 @@ /obj/effect/turf_decal/box, /turf/open/floor/iron/dark/textured, /area/station/security/prison/workout) +"hht" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/cyan, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron/checker, +/area/station/engineering/atmos) "hhu" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/portable_atmospherics/canister/oxygen, @@ -22631,6 +23454,13 @@ dir = 1 }, /area/station/service/chapel/office) +"hhN" = ( +/obj/structure/sign/warning/secure_area/directional/east, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 4 + }, +/area/station/command/gateway) "hhT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -22641,7 +23471,7 @@ }, /obj/effect/landmark/start/chemist, /turf/open/floor/iron/textured, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) "hid" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -22657,10 +23487,6 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"hiF" = ( -/obj/machinery/light/floor, -/turf/open/floor/iron/white, -/area/mine/living_quarters) "hjh" = ( /obj/machinery/computer/records/security{ dir = 4 @@ -22697,6 +23523,12 @@ "hjI" = ( /turf/open/floor/plating, /area/station/maintenance/port/fore) +"hjJ" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/firealarm/directional/north, +/obj/machinery/vending/coffee, +/turf/open/floor/iron, +/area/station/commons/locker) "hjM" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/medical/morgue) @@ -22712,16 +23544,14 @@ /turf/open/floor/plating, /area/station/engineering/atmos/project) "hjU" = ( -/obj/machinery/newscaster/directional/south, -/obj/machinery/light/directional/south, -/obj/machinery/computer/department_orders/science{ - dir = 1 +/obj/structure/sign/nanotrasen{ + pixel_x = 32 }, -/obj/effect/turf_decal/tile/brown/opposingcorners{ - dir = 1 +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 }, -/turf/open/floor/iron, -/area/station/science/lab) +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "hjV" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -22730,24 +23560,11 @@ }, /turf/open/floor/plating, /area/station/medical/virology) -"hkb" = ( -/obj/structure/table/wood, -/obj/item/newspaper{ - pixel_x = 8; - pixel_y = 8 - }, -/obj/item/paper_bin/carbon{ - pixel_x = -6; - pixel_y = 4 - }, -/turf/open/floor/iron/grimy, -/area/station/commons/vacant_room/office) -"hke" = ( -/obj/machinery/light/directional/east, +"hkd" = ( /obj/structure/cable, -/obj/item/radio/intercom/prison/directional/east, -/turf/open/floor/carpet/red, -/area/station/security/prison/work) +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "hkl" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/wood/corner{ @@ -22785,13 +23602,16 @@ }, /turf/open/floor/iron, /area/station/cargo/office) -"hle" = ( -/obj/effect/turf_decal/siding/wood{ +"hkY" = ( +/obj/structure/table, +/obj/machinery/recharger, +/obj/machinery/light_switch/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/smooth_edge{ dir = 1 }, -/obj/machinery/light/directional/west, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) +/area/station/security/lockers) "hll" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -22809,15 +23629,12 @@ /obj/item/bikehorn/rubberducky, /turf/open/floor/iron/freezer, /area/station/commons/toilet/locker) -"hlJ" = ( -/obj/machinery/light/directional/west, -/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, +"hlE" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/west, /turf/open/floor/iron, -/area/station/hallway/secondary/entry) +/area/mine/laborcamp) "hlP" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -22838,6 +23655,11 @@ /obj/item/clothing/under/misc/burial, /turf/open/floor/iron/dark, /area/station/service/chapel) +"hlW" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/vending/clothing, +/turf/open/floor/iron, +/area/station/commons/locker) "hmb" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -22862,6 +23684,27 @@ }, /turf/open/floor/iron/dark, /area/station/service/hydroponics) +"hmt" = ( +/obj/machinery/door/firedoor, +/obj/structure/table/reinforced, +/obj/machinery/door/window/right/directional/west{ + dir = 1; + name = "Security Checkpoint"; + req_access = list("security") + }, +/obj/effect/turf_decal/delivery, +/obj/item/paper, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs/auxiliary) +"hmX" = ( +/obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{ + color = "#0000ff"; + dir = 8; + name = "Supply multi deck pipe adapter" + }, +/obj/machinery/light/directional/north, +/turf/open/floor/plating, +/area/station/medical/chemistry) "hmZ" = ( /obj/structure/sink/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -22917,16 +23760,6 @@ dir = 8 }, /area/station/science/research) -"hnV" = ( -/obj/machinery/newscaster/directional/east, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"hor" = ( -/obj/structure/table/wood, -/obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/stone, -/area/mine/eva/lower) "hos" = ( /obj/structure/disposalpipe/trunk/multiz/down{ dir = 1 @@ -22939,11 +23772,12 @@ "hoD" = ( /turf/open/floor/iron, /area/station/cargo/miningdock) -"hoO" = ( -/obj/item/paper/crumpled, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron/icemoon, -/area/icemoon/surface/outdoors/nospawn) +"hoM" = ( +/obj/effect/turf_decal/trimline/green/filled/line, +/obj/structure/closet/l3closet/virology, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/virology) "hoT" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -22963,6 +23797,15 @@ /obj/machinery/atmospherics/pipe/bridge_pipe/green/visible, /turf/open/floor/plating, /area/station/engineering/atmos/pumproom) +"hoZ" = ( +/obj/effect/spawner/random/entertainment/arcade{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/dorms/laundry) "hpd" = ( /turf/open/floor/plating, /area/station/engineering/engine_smes) @@ -22971,7 +23814,15 @@ /obj/machinery/camera/directional/east{ c_tag = "Captain's Office" }, -/obj/item/storage/lockbox/medal, +/obj/item/storage/lockbox/medal{ + pixel_y = 8 + }, +/obj/item/pinpointer/nuke{ + pixel_y = -9 + }, +/obj/item/disk/nuclear{ + pixel_y = -8 + }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) "hpm" = ( @@ -23004,6 +23855,24 @@ /obj/structure/marker_beacon/burgundy, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) +"hpB" = ( +/obj/machinery/vending/coffee, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron/white, +/area/station/medical/break_room) +"hpC" = ( +/obj/machinery/requests_console/directional/north{ + department = "Robotics"; + name = "Robotics Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/ore_update, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/machinery/rnd/production/circuit_imprinter/department/science, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white, +/area/station/science/robotics/lab) "hpE" = ( /obj/structure/marker_beacon/burgundy{ name = "landing marker" @@ -23040,11 +23909,6 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/general, /turf/open/floor/iron/smooth, /area/station/cargo/drone_bay) -"hpN" = ( -/obj/structure/cable, -/obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "hpR" = ( /obj/effect/spawner/random/entertainment/arcade{ dir = 4 @@ -23086,7 +23950,6 @@ /area/station/commons/storage/art) "hqx" = ( /obj/effect/landmark/start/assistant, -/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/storage/primary) @@ -23101,17 +23964,24 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"hqE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "hqV" = ( /obj/structure/sign/warning/radiation/rad_area, /turf/closed/wall/r_wall, /area/station/engineering/main) -"hrd" = ( -/obj/structure/destructible/cult/item_dispenser/archives/library, -/obj/item/book/codex_gigas, -/obj/machinery/light/small/directional/south, -/obj/machinery/computer/security/telescreen/entertainment/directional/east, -/turf/open/floor/engine/cult, -/area/station/service/library) +"hrh" = ( +/obj/structure/chair/comfy/beige{ + dir = 1 + }, +/turf/open/floor/iron/grimy, +/area/station/hallway/secondary/entry) "hro" = ( /obj/machinery/computer/records/security{ dir = 1 @@ -23166,16 +24036,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/security/prison/rec) -"hsu" = ( -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, -/obj/structure/filingcabinet/filingcabinet, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "hsx" = ( /obj/machinery/vending/cigarette, /turf/open/floor/wood, @@ -23209,9 +24069,15 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/cmo) -"hsI" = ( -/turf/closed/wall, -/area/station/construction/mining/aux_base) +"hsN" = ( +/obj/structure/table, +/obj/item/storage/box/firingpins, +/obj/item/storage/box/firingpins, +/obj/item/key/security, +/obj/machinery/light/directional/east, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/dark/textured, +/area/station/ai_monitored/security/armory/upper) "hsQ" = ( /obj/structure/tank_holder/oxygen, /turf/open/floor/plating, @@ -23223,6 +24089,10 @@ /obj/item/rcl/pre_loaded, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) +"htd" = ( +/obj/structure/sign/warning/docking/directional/north, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "hte" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /turf/open/floor/iron/dark, @@ -23247,6 +24117,14 @@ }, /turf/open/floor/plating, /area/station/science/xenobiology) +"htq" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/firealarm/directional/east, +/obj/machinery/status_display/ai/directional/north, +/obj/effect/turf_decal/siding/white, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "hty" = ( /obj/item/stack/rods, /turf/open/misc/asteroid/snow/icemoon, @@ -23254,19 +24132,6 @@ "htB" = ( /turf/open/floor/carpet/red, /area/station/security/prison/work) -"htN" = ( -/obj/structure/table/wood, -/obj/item/clothing/under/suit/red, -/obj/item/flashlight/flare/candle{ - pixel_x = -8; - pixel_y = 4 - }, -/obj/item/flashlight/flare/candle{ - pixel_x = 8; - pixel_y = 4 - }, -/turf/open/floor/engine/cult, -/area/station/service/library) "htO" = ( /obj/structure/chair/office{ dir = 4 @@ -23274,11 +24139,6 @@ /obj/effect/landmark/start/depsec/science, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) -"hub" = ( -/obj/structure/chair/stool/directional/west, -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron, -/area/station/commons/locker) "hue" = ( /obj/structure/chair/comfy/black, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -23301,6 +24161,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"hul" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/status_display/evac/directional/north, +/obj/machinery/vending/autodrobe/all_access, +/turf/open/floor/iron, +/area/station/commons/locker) "hun" = ( /obj/structure/disposalpipe/trunk{ dir = 1 @@ -23308,10 +24174,6 @@ /obj/machinery/disposal/bin, /turf/open/floor/plating/snowed/coldroom, /area/station/service/kitchen/coldroom) -"hux" = ( -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/cafeteria, -/area/station/security/prison/mess) "huB" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -23351,6 +24213,25 @@ }, /turf/open/floor/iron, /area/station/service/chapel) +"huM" = ( +/obj/structure/table, +/obj/item/crowbar, +/obj/item/wrench, +/obj/item/assembly/infra{ + pixel_x = 3 + }, +/obj/item/assembly/igniter{ + pixel_y = -2 + }, +/obj/effect/turf_decal/trimline/neutral/warning, +/obj/effect/turf_decal/trimline/neutral/mid_joiner, +/obj/item/assembly/signaler, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/iron/dark/smooth_edge, +/area/station/ai_monitored/command/storage/eva) "huN" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -23364,6 +24245,12 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"huS" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/port/lesser) "huT" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -23460,6 +24347,21 @@ }, /turf/open/floor/iron, /area/station/cargo/office) +"hwM" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/chair/sofa/corp/left{ + dir = 4; + pixel_x = -4; + pixel_y = 8 + }, +/obj/effect/landmark/start/hangover, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/sign/poster/random/directional/west, +/turf/open/floor/iron/grimy, +/area/station/service/bar/atrium) "hwR" = ( /obj/machinery/camera/directional/west{ c_tag = "Security - Equipment Room" @@ -23480,14 +24382,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/security/brig/upper) -"hxg" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/siding/white{ - dir = 6 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "hxs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -23508,18 +24402,6 @@ dir = 5 }, /area/station/service/chapel) -"hxT" = ( -/obj/structure/railing{ - dir = 9 - }, -/obj/machinery/light/small/directional/east, -/obj/machinery/button/door/directional/east{ - id = "drone_bay"; - name = "Shutter Control"; - pixel_y = -8 - }, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) "hyd" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -23529,6 +24411,12 @@ }, /turf/open/floor/iron/white, /area/station/medical/break_room) +"hyj" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/station/maintenance/disposal) "hyt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -23550,17 +24438,15 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/engineering/lobby) +"hyL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/maintenance/aft/greater) "hyV" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance/testlab) -"hyW" = ( -/obj/item/toy/snowball{ - pixel_x = -6; - pixel_y = -3 - }, -/mob/living/simple_animal/pet/penguin/baby, -/turf/open/misc/asteroid/snow/standard_air, -/area/station/science/research) "hyY" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -23571,11 +24457,6 @@ /obj/structure/stairs/north, /turf/open/floor/iron, /area/station/service/chapel) -"hzk" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood/parquet, -/area/station/commons/lounge) "hzz" = ( /obj/structure/table/glass, /obj/item/clothing/gloves/latex, @@ -23621,6 +24502,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/commons/locker) +"hzN" = ( +/obj/machinery/camera/motion/directional/south{ + c_tag = "Armory - Internal - Upper" + }, +/turf/open/openspace, +/area/station/ai_monitored/security/armory/upper) "hzQ" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -23642,11 +24529,23 @@ dir = 4 }, /area/station/science/research) +"hAo" = ( +/obj/machinery/photocopier, +/obj/effect/turf_decal/siding/wood/corner, +/obj/structure/sign/calendar/directional/west, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) "hAq" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/corner, /area/station/command/heads_quarters/rd) +"hAG" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/large, +/area/station/hallway/secondary/entry) "hAO" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -23677,10 +24576,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/genetics) -"hAY" = ( -/obj/machinery/telecomms/processor/preset_one, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) +"hBc" = ( +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/structure/chair{ + dir = 8 + }, +/obj/structure/sign/poster/random/directional/north, +/obj/effect/turf_decal/tile/red/full, +/turf/open/floor/iron/large, +/area/station/service/kitchen/diner) "hBd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -23708,6 +24614,12 @@ /obj/effect/spawner/random/structure/girder, /turf/open/floor/plating, /area/station/security/prison/safe) +"hBF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/prison/workout) "hBG" = ( /obj/effect/turf_decal/siding/green{ dir = 8 @@ -23725,6 +24637,13 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/wood, /area/station/hallway/secondary/service) +"hCa" = ( +/obj/effect/decal/cleanable/dirt, +/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/locker) "hCn" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -23770,9 +24689,34 @@ /area/station/commons/lounge) "hCV" = ( /obj/structure/table/wood, -/obj/item/hand_tele, +/obj/item/hand_tele{ + pixel_y = 11 + }, +/obj/item/melee/chainofcommand, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) +"hCY" = ( +/obj/structure/table/wood, +/obj/item/folder/yellow{ + pixel_y = 8; + pixel_x = 3 + }, +/obj/item/folder/white{ + pixel_y = 12; + pixel_x = -3 + }, +/obj/structure/sign/poster/contraband/random/directional/south, +/obj/item/folder/blue{ + pixel_y = 3; + pixel_x = -3 + }, +/obj/item/folder/red{ + pixel_x = 5; + pixel_y = 2 + }, +/obj/item/folder, +/turf/open/floor/iron/grimy, +/area/station/commons/vacant_room/office) "hDb" = ( /obj/effect/turf_decal/tile/purple/half/contrasted, /turf/open/floor/iron, @@ -23782,25 +24726,12 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/catwalk_floor/iron_dark, /area/station/maintenance/port/fore) -"hDf" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 1; - piping_layer = 2 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/science/ordnance) "hDh" = ( /obj/machinery/computer/atmos_alert{ dir = 8 }, /turf/open/floor/iron/dark, /area/station/engineering/atmos/storage/gas) -"hDj" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "hDp" = ( /turf/open/floor/engine, /area/station/science/genetics) @@ -23834,11 +24765,6 @@ "hDK" = ( /turf/open/floor/iron, /area/mine/laborcamp) -"hDT" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron, -/area/station/commons/locker) "hDU" = ( /turf/closed/wall/r_wall, /area/station/command/gateway) @@ -23850,27 +24776,6 @@ /obj/structure/closet/emcloset, /turf/open/floor/iron/dark, /area/mine/eva) -"hEr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/light_construct/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"hEy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) -"hEC" = ( -/obj/structure/table, -/obj/machinery/recharger, -/obj/machinery/light/directional/south, -/obj/machinery/light_switch/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/smooth_edge{ - dir = 1 - }, -/area/station/security/lockers) "hEG" = ( /obj/machinery/door/airlock/security/glass{ name = "Brig Control" @@ -23949,6 +24854,10 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/general, /turf/open/floor/plating, /area/station/cargo/storage) +"hFW" = ( +/obj/machinery/vending/wardrobe/det_wardrobe, +/turf/open/floor/iron/grimy, +/area/station/security/detectives_office) "hGf" = ( /obj/item/clothing/suit/hooded/wintercoat, /obj/effect/decal/remains/human, @@ -23984,6 +24893,12 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/service/hydroponics) +"hGZ" = ( +/obj/structure/table, +/obj/item/analyzer, +/obj/item/healthanalyzer, +/turf/open/floor/plating, +/area/station/engineering/storage/tech) "hHb" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/aisat/hallway) @@ -24014,6 +24929,13 @@ }, /turf/open/floor/iron, /area/station/commons/fitness) +"hHs" = ( +/obj/structure/cable, +/obj/structure/sign/warning/gas_mask/directional/south, +/obj/machinery/light/small/dim/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "hHu" = ( /obj/structure/disposalpipe/segment, /obj/structure/extinguisher_cabinet/directional/west, @@ -24028,6 +24950,16 @@ }, /turf/open/floor/plating, /area/station/construction) +"hHF" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"hHG" = ( +/turf/open/cliff/snowrock, +/area/icemoon/surface/outdoors/nospawn) "hHI" = ( /obj/machinery/chem_dispenser, /obj/effect/turf_decal/tile/yellow/full, @@ -24073,13 +25005,10 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"hII" = ( -/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, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) +"hIN" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "hIS" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/blue/half/contrasted{ @@ -24116,6 +25045,12 @@ }, /turf/open/floor/wood/tile, /area/station/service/theater) +"hJp" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal) "hJx" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -24133,16 +25068,37 @@ /obj/structure/ladder, /turf/open/floor/wood, /area/station/maintenance/space_hut/cabin) -"hJL" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/gas_mask, -/turf/open/floor/plating, -/area/station/construction/mining/aux_base) +"hJE" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"hJG" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/locker) "hJY" = ( /obj/structure/closet/l3closet/janitor, /obj/machinery/airalarm/directional/north, /turf/open/floor/iron, /area/station/service/janitor) +"hKj" = ( +/obj/machinery/atmospherics/components/binary/pump/off, +/obj/machinery/airlock_sensor/incinerator_ordmix{ + pixel_x = 24 + }, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/science/ordnance/burnchamber) "hKr" = ( /obj/structure/table/glass, /obj/item/book/manual/wiki/infections{ @@ -24163,12 +25119,22 @@ /obj/effect/turf_decal/tile/blue/full, /turf/open/floor/iron/dark/smooth_large, /area/station/command/heads_quarters/cmo) +"hKu" = ( +/obj/structure/sign/poster/official/cleanliness/directional/east, +/obj/structure/closet/secure_closet/medical2, +/turf/open/floor/iron, +/area/station/maintenance/port/fore) "hKI" = ( /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, /turf/open/floor/iron, /area/station/security/prison/garden) +"hKJ" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/tcommsat/computer) "hKT" = ( /obj/machinery/light/floor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24183,20 +25149,20 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/station/security/brig/upper) -"hLm" = ( -/obj/machinery/airalarm/directional/east, -/obj/machinery/light/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Auxillary Base Construction" - }, -/obj/machinery/computer/camera_advanced/base_construction/aux{ - dir = 8 +"hLk" = ( +/obj/structure/table, +/obj/item/paper, +/obj/item/pen, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/directional/west{ + c_tag = "Labor Camp Cell 2"; + network = list("labor") }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 +/obj/machinery/flasher/directional/west{ + id = "GulagCell 1" }, /turf/open/floor/iron, -/area/station/construction/mining/aux_base) +/area/mine/laborcamp) "hLw" = ( /obj/item/radio/intercom/directional/north, /obj/structure/table/wood, @@ -24225,6 +25191,10 @@ }, /turf/open/floor/iron/white/corner, /area/station/engineering/atmos) +"hLZ" = ( +/obj/machinery/telecomms/bus/preset_three, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) "hMc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_dark, @@ -24246,23 +25216,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/service/chapel) -"hMu" = ( -/obj/structure/table, -/obj/item/razor{ - pixel_y = 5 - }, -/turf/open/floor/iron, -/area/station/commons/locker) -"hMv" = ( -/obj/machinery/airalarm/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/sofa/right/brown{ - dir = 1 - }, -/obj/machinery/newscaster/directional/east, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/break_room) "hMw" = ( /obj/structure/bookcase/random/fiction, /turf/open/floor/plating, @@ -24296,8 +25249,9 @@ /obj/effect/turf_decal/trimline/yellow/filled/end{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/iron/textured, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) "hMJ" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -24343,6 +25297,11 @@ name = "Holodeck Projector Floor" }, /area/station/holodeck/rec_center) +"hNz" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/large, +/area/station/hallway/primary/port) "hNF" = ( /obj/structure/fence{ dir = 4 @@ -24366,13 +25325,6 @@ }, /turf/open/floor/iron, /area/station/engineering/storage) -"hNX" = ( -/obj/structure/closet/toolcloset, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) "hOc" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -24381,10 +25333,6 @@ }, /turf/open/floor/plating, /area/station/engineering/lobby) -"hOi" = ( -/obj/machinery/telecomms/processor/preset_four, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) "hOk" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -24410,16 +25358,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"hOA" = ( -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/security/prison/rec) -"hOJ" = ( -/obj/machinery/vending/coffee, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/break_room) "hOU" = ( /obj/machinery/camera/directional/west{ c_tag = "Xenobiology Pens - Port Fore"; @@ -24443,11 +25381,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit, /area/station/science/robotics/mechbay) -"hPc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/department/chapel) "hPe" = ( /obj/structure/cable/multilayer/connected, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24485,12 +25418,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) -"hPD" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) "hPK" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -24509,6 +25436,12 @@ }, /turf/open/floor/iron, /area/station/command/teleporter) +"hPX" = ( +/obj/structure/frame/computer, +/obj/structure/sign/poster/official/help_others/directional/north, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/port/fore) "hQc" = ( /obj/structure/cable/multilayer/multiz, /obj/effect/turf_decal/stripes/line{ @@ -24569,6 +25502,10 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) +"hRe" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/station/maintenance/aft/greater) "hRp" = ( /obj/machinery/button/door/directional/north{ id = "visitation"; @@ -24585,6 +25522,11 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron, /area/station/security/prison/visit) +"hRt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/maintenance/port/fore) "hRw" = ( /obj/structure/chair/wood{ dir = 8 @@ -24647,10 +25589,11 @@ /obj/effect/landmark/start/medical_doctor, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"hRV" = ( -/obj/item/radio/intercom/directional/west, -/turf/open/floor/carpet, -/area/station/service/theater) +"hRX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/generic, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) "hSb" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 8 @@ -24659,16 +25602,6 @@ /obj/structure/sign/poster/random/directional/north, /turf/open/floor/carpet, /area/station/service/theater) -"hSi" = ( -/obj/item/shard{ - icon_state = "medium" - }, -/obj/item/circuitboard/computer/operating, -/obj/structure/mirror/directional/north{ - icon_state = "mirror_broke" - }, -/turf/open/floor/iron, -/area/station/maintenance/port/fore) "hSl" = ( /obj/effect/turf_decal/trimline/neutral/mid_joiner{ dir = 8 @@ -24685,20 +25618,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron/dark/smooth_corner, /area/station/ai_monitored/command/storage/eva) -"hSp" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/table/reinforced, -/obj/item/clothing/glasses/science{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/clothing/glasses/science{ - pixel_x = 4; - pixel_y = -4 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/science/xenobiology) "hSq" = ( /obj/effect/turf_decal/siding/wood, /obj/effect/turf_decal/siding/wood{ @@ -24710,6 +25629,15 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured_half, /area/station/service/bar/atrium) +"hSt" = ( +/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, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "hSy" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/brigdoor/left/directional/north{ @@ -24721,6 +25649,7 @@ id = "medsecprivacy"; name = "Privacy Shutters" }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/station/security/checkpoint/medical) "hSF" = ( @@ -24746,18 +25675,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/mix) -"hTa" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/light/directional/west, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "hTm" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/meter, @@ -24765,17 +25682,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"hTt" = ( -/obj/machinery/conveyor_switch/oneway{ - dir = 8; - id = "garbage"; - name = "disposal conveyor" - }, -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/maintenance/disposal) "hTw" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/red/half{ @@ -24795,15 +25701,14 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/fore) -"hTH" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) -"hTL" = ( -/obj/machinery/vending/cigarette, -/turf/open/floor/iron, -/area/station/commons/locker) +"hTJ" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Solar Maintenance - North West Access" + }, +/obj/machinery/light/small/dim/directional/north, +/obj/effect/spawner/random/engineering/tank, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "hUe" = ( /obj/effect/landmark/start/hangover, /obj/machinery/status_display/evac/directional/south, @@ -24816,16 +25721,6 @@ /obj/effect/decal/cleanable/blood/drip, /turf/open/floor/iron, /area/station/maintenance/starboard/fore) -"hUj" = ( -/turf/open/floor/carpet, -/area/station/hallway/secondary/entry) -"hUo" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 5 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "hUx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24852,6 +25747,10 @@ "hUD" = ( /turf/closed/wall, /area/station/service/library) +"hUI" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "hUK" = ( /obj/structure/railing{ dir = 4 @@ -24873,6 +25772,7 @@ /obj/effect/turf_decal/loading_area{ dir = 8 }, +/obj/machinery/digital_clock/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/central) "hVo" = ( @@ -24880,6 +25780,26 @@ /obj/structure/table, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"hVq" = ( +/obj/effect/turf_decal/stripes/asteroid/corner{ + dir = 1 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/dark{ + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/white/side{ + dir = 6 + }, +/area/mine/living_quarters) +"hVu" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/smooth, +/area/station/maintenance/port/lesser) "hVB" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, @@ -24901,6 +25821,12 @@ /obj/effect/spawner/structure/window/hollow/reinforced/middle, /turf/open/floor/plating, /area/station/security/prison/garden) +"hWd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/maintenance/port/fore) "hWh" = ( /obj/structure/sink/directional/west, /obj/effect/turf_decal/tile/green{ @@ -24915,19 +25841,13 @@ /obj/machinery/teleport/hub, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat_interior) -"hWs" = ( -/obj/structure/flora/grass/jungle/b/style_random, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/item/throwing_star/toy, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" - }, -/area/station/security/prison/rec) -"hWu" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/engine, -/area/station/science/xenobiology) +"hWI" = ( +/obj/effect/turf_decal/box, +/obj/structure/closet/crate/maint, +/obj/effect/spawner/random/maintenance/six, +/obj/structure/sign/poster/official/wtf_is_co2/directional/north, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/aft) "hWP" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -24947,17 +25867,20 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/plating, /area/station/medical/virology) +"hWW" = ( +/obj/structure/sign/warning/directional/south, +/obj/structure/sign/warning/directional/south, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "hWX" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/window/reinforced/spawner/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"hXk" = ( -/obj/machinery/light/directional/west, -/obj/structure/cable, -/turf/open/floor/carpet/red, -/area/station/security/prison/work) "hXC" = ( /obj/structure/chair{ dir = 8 @@ -24969,27 +25892,38 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"hXL" = ( -/obj/effect/spawner/random/entertainment/arcade{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms/laundry) "hXU" = ( /obj/machinery/newscaster/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/iron/white, /area/station/medical/cryo) -"hYu" = ( -/obj/machinery/light/directional/west, -/obj/machinery/camera/motion/directional/south{ - c_tag = "Armory - Internal - Upper" +"hYb" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Disposal Access" }, -/turf/open/openspace, -/area/station/ai_monitored/security/armory/upper) +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + 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/landmark/navigate_destination/disposals, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) +"hYs" = ( +/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/siding/white/end{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/service/bar) "hYy" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -24998,10 +25932,6 @@ /obj/item/kirbyplants/random, /turf/open/floor/wood, /area/station/security/prison/rec) -"hYA" = ( -/obj/machinery/telecomms/relay/preset/mining, -/turf/open/floor/circuit, -/area/mine/living_quarters) "hYC" = ( /obj/structure/closet/athletic_mixed, /obj/effect/landmark/start/hangover/closet, @@ -25040,13 +25970,6 @@ /obj/item/stack/sheet/iron/five, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"hZR" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/grimy, -/area/station/commons/vacant_room/office) "iag" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, @@ -25092,15 +26015,8 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/cargo/storage) -"iaQ" = ( -/obj/structure/table, -/obj/item/analyzer, -/obj/item/healthanalyzer, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/engineering/storage/tech) "iaS" = ( -/obj/machinery/modular_computer/console/preset/id, +/obj/machinery/modular_computer/preset/id, /obj/item/paper/fluff/ids_for_dummies, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 8 @@ -25111,6 +26027,16 @@ /obj/effect/spawner/random/trash/mess, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"iaU" = ( +/obj/machinery/door/airlock/command/glass{ + name = "Emergency EVA Storage" + }, +/obj/effect/mapping_helpers/airlock/access/all/command/eva, +/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/dark/textured, +/area/station/hallway/secondary/entry) "iaV" = ( /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, @@ -25140,18 +26066,6 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/office) -"ibc" = ( -/obj/effect/turf_decal/siding/brown/corner{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/sign/warning/gas_mask/directional/south{ - desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals." - }, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "ibi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25222,15 +26136,6 @@ }, /turf/open/floor/wood, /area/station/security/prison/rec) -"ibB" = ( -/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/plating, -/area/station/maintenance/port/greater) "ibI" = ( /obj/structure/chair/stool/directional/south, /obj/machinery/camera/directional/north{ @@ -25250,17 +26155,6 @@ }, /turf/open/floor/plating, /area/station/service/chapel) -"ibR" = ( -/obj/docking_port/stationary{ - dir = 8; - dwidth = 2; - height = 13; - name = "port bay 2"; - shuttle_id = "ferry_home"; - width = 5 - }, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/surface/outdoors/nospawn) "ica" = ( /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, @@ -25313,11 +26207,12 @@ }, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"icL" = ( -/obj/machinery/vending/coffee, -/obj/structure/sign/poster/official/science/directional/south, +"icI" = ( +/obj/structure/table, +/obj/item/retractor, +/obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron/dark, -/area/station/science/breakroom) +/area/station/science/robotics/lab) "icQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25331,6 +26226,16 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/range) +"icU" = ( +/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/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal) "icV" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -25339,14 +26244,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/external, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) -"icX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/rack_parts, -/obj/effect/spawner/random/clothing/beret_or_rabbitears, -/obj/effect/spawner/random/clothing/kittyears_or_rabbitears, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/maintenance/port/fore) "icY" = ( /obj/machinery/door/airlock/maintenance{ name = "Garden Maintenance" @@ -25358,6 +26255,13 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, /area/station/service/hydroponics/garden) +"ida" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/structure/sign/departments/chemistry/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "idi" = ( /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters{ @@ -25428,11 +26332,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/port) -"iep" = ( -/obj/effect/decal/cleanable/oil, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "ieq" = ( /obj/effect/turf_decal/siding/white{ dir = 4 @@ -25444,39 +26343,12 @@ }, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"ieF" = ( -/obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{ - color = "#0000ff"; - name = "Supply multi deck pipe adapter" - }, -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/morgue) "ieG" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"ieW" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Port Hallway Center" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"ieZ" = ( -/obj/item/radio/intercom/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "ifa" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -25531,9 +26403,7 @@ /turf/open/floor/iron/showroomfloor, /area/station/security/prison/toilet) "igi" = ( -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, +/obj/item/kirbyplants/organic/plant10, /obj/machinery/camera/directional/west{ c_tag = "Service Bar Staircase" }, @@ -25547,12 +26417,11 @@ /obj/structure/railing, /turf/open/floor/iron, /area/station/engineering/atmos/storage) -"igo" = ( -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, +"igq" = ( +/obj/machinery/recharge_station, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, -/area/station/construction) +/area/mine/eva/lower) "igx" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 5 @@ -25591,6 +26460,12 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark, /area/station/security/interrogation) +"ihc" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/wood/large, +/area/station/commons/vacant_room/office) "ihf" = ( /obj/effect/turf_decal/siding/white{ dir = 10 @@ -25599,6 +26474,12 @@ /obj/effect/turf_decal/tile/red/full, /turf/open/floor/iron/large, /area/station/service/kitchen/diner) +"ihk" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/chair/stool/directional/south, +/turf/open/floor/iron, +/area/station/commons/locker) "ihr" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -25623,10 +26504,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/security/armory/upper) -"ihz" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/recharge_floor, -/area/station/maintenance/department/electrical) "ihB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -25637,6 +26514,11 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, +/obj/machinery/status_display/door_timer{ + id = "Isolation_Cell"; + name = "Isolation Cell"; + pixel_x = -32 + }, /turf/open/floor/iron/smooth, /area/station/security/execution/transfer) "ihG" = ( @@ -25654,14 +26536,6 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"iig" = ( -/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/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/department/chapel) "iih" = ( /obj/effect/spawner/xmastree, /obj/effect/turf_decal/tile/neutral{ @@ -25709,6 +26583,15 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/medical/virology) +"iiT" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/station/engineering/storage/tech) +"ijb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) "iji" = ( /obj/structure/table, /obj/item/multitool/circuit{ @@ -25758,10 +26641,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) -"ijA" = ( -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "ijC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -25776,14 +26655,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"ijN" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/light/small/directional/north, -/obj/structure/sign/departments/chemistry/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "ijT" = ( /obj/structure/transit_tube/horizontal, /turf/open/floor/plating, @@ -25849,11 +26720,11 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"ikp" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Arrivals Hallway" - }, -/turf/open/floor/iron, +"iku" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/white, +/turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) "ikw" = ( /obj/structure/disposalpipe/segment{ @@ -25870,6 +26741,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/medical/general, /obj/effect/turf_decal/tile/blue/full, +/obj/machinery/door/firedoor, /turf/open/floor/iron/large, /area/station/maintenance/aft/greater) "ikz" = ( @@ -25931,13 +26803,19 @@ /obj/structure/table/wood, /turf/open/floor/wood, /area/station/security/courtroom) +"ilv" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "ily" = ( /turf/open/openspace, /area/station/science/xenobiology) -"ilH" = ( -/obj/machinery/light/directional/east, -/turf/open/openspace, -/area/station/security/prison) +"ilD" = ( +/obj/structure/lattice/catwalk, +/turf/open/openspace/icemoon/keep_below, +/area/station/maintenance/port/lesser) "ilJ" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "MiniSat Maintenance" @@ -25952,13 +26830,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) -"ilQ" = ( -/obj/machinery/conveyor{ - id = "garbage" - }, -/obj/structure/sign/warning/vacuum/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "ilZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25971,30 +26842,17 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter) -"imh" = ( -/obj/structure/cable, -/obj/machinery/camera/directional/south{ - c_tag = "Labor Camp Security Office"; - network = list("labor") - }, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/mine/laborcamp/security) "imi" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) -"imr" = ( -/obj/structure/table, -/obj/item/hand_labeler, -/obj/item/storage/box/shipping, -/obj/structure/sign/poster/official/fruit_bowl/directional/south, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ +"imu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, -/turf/open/floor/iron, -/area/station/commons/storage/art) +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "imy" = ( /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/dark, @@ -26006,6 +26864,18 @@ /obj/item/clothing/mask/breath, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) +"imO" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/commons/storage/art) "imV" = ( /obj/structure/stairs/east, /obj/structure/railing{ @@ -26023,17 +26893,58 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/iron/white, /area/station/science/ordnance) +"ini" = ( +/obj/structure/falsewall, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "inw" = ( /obj/machinery/door/airlock/engineering{ name = "Port Bow Solar Access" }, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/solars/port/fore) "inE" = ( /turf/open/floor/iron/corner, /area/station/engineering/lobby) +"inJ" = ( +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"inQ" = ( +/obj/structure/table/wood, +/obj/item/paper_bin/carbon{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/newspaper{ + pixel_x = 8; + pixel_y = 8 + }, +/turf/open/floor/iron/grimy, +/area/station/commons/vacant_room/office) +"iog" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/table, +/obj/item/storage/medkit/emergency{ + pixel_y = 5 + }, +/obj/item/radio/off, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) "ioi" = ( /obj/structure/bed/dogbed/lia, /obj/structure/cable, @@ -26054,13 +26965,19 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"ion" = ( -/obj/item/storage/box/lights/mixed, -/obj/structure/table, -/obj/item/crowbar, -/obj/item/wrench, -/turf/open/floor/iron/dark, -/area/station/maintenance/department/medical/morgue) +"ior" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/newscaster/directional/north, +/obj/machinery/light/directional/north, +/obj/structure/cable, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) "iot" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -26072,6 +26989,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"iox" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/closet/crate/bin, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) "ioz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26081,14 +27005,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/mix) -"ioC" = ( -/obj/machinery/light/warm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/prison/mess) "ioK" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle, /turf/open/floor/plating, @@ -26105,20 +27021,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) -"ipa" = ( -/obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2{ - color = "#ff0000"; - dir = 4; - name = "Scrubbers multi deck pipe adapter" - }, -/obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{ - color = "#0000ff"; - dir = 4; - name = "Supply multi deck pipe adapter" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "ipd" = ( /obj/machinery/light/small/directional/south, /obj/machinery/camera/directional/south{ @@ -26156,11 +27058,30 @@ "ipE" = ( /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) -"ipJ" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/chair/stool/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) +"ipF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/pen/red, +/obj/item/pen{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/folder/yellow, +/obj/machinery/keycard_auth/directional/west{ + pixel_x = -25; + pixel_y = -5 + }, +/obj/machinery/button/door/directional/west{ + id = "qmprivacy"; + name = "Privacy Shutters Control"; + pixel_y = 5; + req_access = list("qm") + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/qm) "ipM" = ( /obj/structure/transit_tube/curved{ dir = 4 @@ -26168,8 +27089,11 @@ /obj/structure/cable, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) -"ipZ" = ( -/obj/effect/landmark/event_spawn, +"iqn" = ( +/obj/structure/rack, +/obj/effect/spawner/random/clothing/costume, +/obj/machinery/light/small/directional/south, +/obj/item/toy/foamblade, /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, @@ -26295,12 +27219,18 @@ dir = 8 }, /area/station/service/chapel) -"isa" = ( -/obj/structure/chair/stool/directional/north, -/obj/structure/sign/poster/official/report_crimes/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) +"irX" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/sign/warning/pods/directional/west, +/obj/machinery/light/directional/north, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/cafeteria{ + dir = 8 + }, +/area/station/hallway/secondary/entry) "isb" = ( /obj/machinery/atmospherics/components/binary/pump/off{ dir = 1; @@ -26336,12 +27266,27 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"isE" = ( -/obj/machinery/vending/wardrobe/sec_wardrobe, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/smooth_edge, -/area/station/security/lockers) +"ist" = ( +/obj/structure/chair/sofa/left/brown, +/obj/effect/landmark/start/psychologist, +/obj/machinery/light/small/directional/north, +/turf/open/floor/carpet/blue, +/area/station/medical/psychology) +"isu" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible/layer2, +/obj/machinery/air_sensor/incinerator_tank, +/turf/open/floor/engine/vacuum, +/area/station/maintenance/disposal/incinerator) +"isz" = ( +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/structure/table, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/customs/auxiliary) "isP" = ( /obj/effect/landmark/start/medical_doctor, /turf/open/floor/iron/white, @@ -26361,11 +27306,6 @@ }, /turf/open/floor/iron, /area/station/engineering/main) -"iti" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron/textured, -/area/station/security/brig) "itj" = ( /turf/open/floor/iron/white, /area/station/science/genetics) @@ -26382,15 +27322,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/command/heads_quarters/rd) -"itC" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) "itE" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 10 @@ -26408,6 +27339,14 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) +"ium" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/mine/eva) "iuq" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 9 @@ -26450,10 +27389,24 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) +"iuH" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "iuS" = ( /obj/machinery/airalarm/directional/north, /turf/open/floor/glass/reinforced, /area/station/ai_monitored/security/armory/upper) +"ivi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron, +/area/station/maintenance/port/fore) "ivo" = ( /obj/machinery/airalarm/directional/east, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -26479,15 +27432,6 @@ "ivF" = ( /turf/closed/wall, /area/station/maintenance/disposal) -"ivG" = ( -/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/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "ivH" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -26502,6 +27446,13 @@ "iwf" = ( /turf/closed/wall/r_wall, /area/mine/mechbay) +"iwj" = ( +/obj/structure/table, +/obj/structure/frame/machine, +/obj/item/stack/cable_coil/five, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "iwx" = ( /obj/machinery/door/airlock/maintenance{ name = "Xenobiology Maintenance" @@ -26529,11 +27480,13 @@ "iwC" = ( /turf/closed/wall/r_wall, /area/station/hallway/primary/central/fore) -"iwD" = ( -/obj/structure/cable, +"iwO" = ( +/obj/structure/closet/secure_closet/personal{ + anchored = 1 + }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) "iwS" = ( /turf/closed/wall, /area/station/commons/dorms/laundry) @@ -26541,6 +27494,15 @@ /obj/structure/railing, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"ixb" = ( +/obj/machinery/button/door/directional/south{ + id = "vacantofficemaintshutter"; + pixel_x = 4; + name = "Privacy Shutters"; + pixel_y = -28 + }, +/turf/open/floor/iron/grimy, +/area/station/commons/vacant_room/office) "ixu" = ( /obj/machinery/camera/directional/north{ c_tag = "Teleporter" @@ -26563,6 +27525,16 @@ }, /turf/open/floor/sepia, /area/station/security/prison/rec) +"ixG" = ( +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/engine_smes) "ixH" = ( /obj/structure/railing/corner{ dir = 1 @@ -26635,15 +27607,6 @@ /obj/machinery/photocopier, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"iyM" = ( -/obj/structure/table, -/obj/item/food/sandwich/cheese/grilled{ - name = "idiot sandwich"; - pixel_y = 8 - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron, -/area/mine/living_quarters) "iyP" = ( /obj/structure/table, /obj/item/aicard, @@ -26663,6 +27626,15 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"izc" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/science/ordnance/burnchamber) "izn" = ( /obj/effect/spawner/random/decoration/generic, /turf/open/floor/plating, @@ -26732,6 +27704,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/engine_smes) +"izI" = ( +/obj/machinery/door/airlock/maintenance, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "izJ" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -26761,6 +27743,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"iAp" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera{ + c_tag = "Mining B-1 Hallway South"; + dir = 10 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/mine/eva) "iAt" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -26793,10 +27792,6 @@ /obj/effect/turf_decal/tile/red/full, /turf/open/floor/iron/large, /area/station/service/kitchen/diner) -"iAK" = ( -/obj/effect/turf_decal/tile/dark/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/virology) "iAO" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 1 @@ -26814,6 +27809,14 @@ dir = 4 }, /area/station/service/chapel) +"iBa" = ( +/obj/structure/table, +/obj/item/circular_saw, +/obj/item/scalpel{ + pixel_y = 12 + }, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) "iBd" = ( /obj/structure/fireplace{ pixel_x = -32 @@ -26832,6 +27835,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/command/bridge) +"iBg" = ( +/obj/structure/rack, +/obj/effect/spawner/random/clothing/costume, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/maintenance/port/fore) "iBj" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -26863,7 +27876,7 @@ /turf/open/floor/iron, /area/station/cargo/sorting) "iBO" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 4 }, /turf/open/floor/iron/white/side{ @@ -26882,6 +27895,17 @@ /obj/item/stack/rods/ten, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) +"iCw" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/nanotrasen{ + pixel_x = 32 + }, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) "iCz" = ( /obj/structure/table/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -26928,14 +27952,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"iCN" = ( -/obj/effect/mapping_helpers/turn_off_lights_with_lightswitch, -/turf/open/floor/iron/smooth_large, -/area/station/cargo/warehouse) -"iCO" = ( -/obj/machinery/vending/cola/red, -/turf/open/floor/iron/dark/textured, -/area/station/security/prison) "iCQ" = ( /obj/structure/closet/lasertag/red, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ @@ -26997,21 +28013,6 @@ /obj/structure/sign/warning/radiation, /turf/closed/wall/r_wall, /area/station/engineering/supermatter) -"iEh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms/laundry) -"iEr" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/commons/locker) "iEA" = ( /obj/structure/table/glass, /obj/item/storage/box/gloves{ @@ -27053,6 +28054,14 @@ }, /turf/open/floor/iron, /area/station/science/xenobiology) +"iES" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) "iFc" = ( /obj/effect/turf_decal/tile/red/half{ dir = 4 @@ -27086,13 +28095,6 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/dark, /area/station/command/gateway) -"iFm" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/station/maintenance/port/aft) "iFs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -27100,6 +28102,11 @@ }, /turf/open/floor/iron, /area/station/command/bridge) +"iFL" = ( +/obj/structure/bed/dogbed/renault, +/mob/living/basic/pet/fox/renault, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain) "iFX" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -27124,15 +28131,6 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron, /area/mine/laborcamp/security) -"iGv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/mine/eva/lower) "iGH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -27143,13 +28141,6 @@ }, /turf/open/floor/iron, /area/station/command/bridge) -"iGW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/iron/dark/smooth_corner{ - dir = 1 - }, -/area/station/command/gateway) "iHc" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -27187,6 +28178,27 @@ /obj/structure/cable, /turf/open/floor/carpet/red, /area/station/security/prison/work) +"iHZ" = ( +/obj/structure/table/glass, +/obj/item/storage/medkit/fire{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/medkit/fire, +/obj/item/storage/medkit/regular{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/machinery/door/window/left/directional/north{ + dir = 4; + name = "First-Aid Supplies"; + red_alert_access = 1; + req_access = list("medical") + }, +/obj/effect/turf_decal/tile/blue/full, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/storage) "iIa" = ( /obj/structure/cable, /obj/structure/railing, @@ -27211,19 +28223,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"iIw" = ( -/obj/docking_port/stationary{ - dheight = 4; - dir = 8; - dwidth = 4; - height = 9; - name = "Aux Base Zone"; - roundstart_template = /datum/map_template/shuttle/aux_base/default; - shuttle_id = "aux_base_zone"; - width = 9 - }, -/turf/open/floor/plating, -/area/station/construction/mining/aux_base) "iIA" = ( /obj/effect/turf_decal/bot, /turf/open/floor/iron, @@ -27236,6 +28235,7 @@ /obj/effect/mapping_helpers/airlock/unres, /obj/effect/mapping_helpers/airlock/access/all/medical/general, /obj/effect/turf_decal/tile/blue/full, +/obj/machinery/door/firedoor, /turf/open/floor/iron/large, /area/station/medical/medbay/lobby) "iIF" = ( @@ -27246,15 +28246,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"iII" = ( -/obj/structure/table, -/obj/item/circular_saw, -/obj/item/scalpel{ - pixel_y = 12 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) "iIW" = ( /obj/structure/table, /obj/item/plant_analyzer, @@ -27262,21 +28253,23 @@ /turf/open/floor/plating, /area/station/engineering/storage/tech) "iJl" = ( -/obj/structure/filingcabinet/chestdrawer, -/turf/open/floor/iron/grimy, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/spawner/random/engineering/tracking_beacon, +/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/vacant_room/office) -"iJt" = ( -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) -"iJv" = ( -/obj/machinery/computer/mechpad, -/obj/machinery/light/small/directional/north, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron/textured, -/area/mine/mechbay) +"iJr" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/iron, +/area/station/security/prison/mess) "iJC" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -27302,6 +28295,10 @@ }, /turf/open/openspace, /area/station/engineering/atmos/storage) +"iJL" = ( +/obj/effect/landmark/start/hangover, +/turf/open/floor/plastic, +/area/station/commons/dorms/laundry) "iJM" = ( /obj/structure/stairs/south{ dir = 1 @@ -27335,12 +28332,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/cargo/warehouse) -"iKr" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/firealarm/directional/east, -/obj/machinery/status_display/ai/directional/north, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "iKw" = ( /obj/item/kitchen/fork/plastic, /obj/structure/table, @@ -27356,21 +28347,6 @@ /obj/machinery/status_display/evac/directional/east, /turf/open/openspace, /area/station/service/chapel) -"iKR" = ( -/obj/machinery/door/firedoor, -/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 = "Arrivals" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"iKS" = ( -/obj/structure/bookcase, -/obj/machinery/light/directional/north, -/turf/open/floor/carpet, -/area/station/security/processing) "iKX" = ( /obj/machinery/door/airlock{ id_tag = "AuxToilet1"; @@ -27387,17 +28363,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/fore) -"iLe" = ( -/obj/item/radio/intercom/directional/north, -/obj/structure/table/glass, -/obj/machinery/computer/records/medical/laptop, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/white/textured, -/area/station/security/medical) "iLf" = ( /obj/machinery/atmospherics/pipe/smart/simple/brown/visible, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"iLh" = ( +/turf/closed/wall, +/area/station/maintenance/port/lesser) "iLi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_edge{ @@ -27435,6 +28407,23 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/processing) +"iLy" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/security/prison) +"iLA" = ( +/obj/effect/turf_decal/loading_area, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "iLK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -27465,17 +28454,6 @@ /obj/machinery/duct, /turf/open/floor/wood/tile, /area/station/service/theater) -"iMh" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/glass_large{ - name = "The Girly Boar" - }, -/turf/open/floor/iron/dark/textured_half, -/area/station/service/bar/atrium) "iMj" = ( /obj/structure/closet/lasertag/blue, /obj/effect/landmark/start/hangover/closet, @@ -27491,6 +28469,10 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"iMp" = ( +/obj/machinery/status_display/ai/directional/east, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai) "iMu" = ( /obj/machinery/camera/directional/east{ c_tag = "Arrivals Escape Pod 1" @@ -27569,20 +28551,28 @@ dir = 1 }, /area/station/service/hydroponics) -"iNH" = ( -/obj/structure/table/wood, -/obj/item/taperecorder{ - pixel_x = 9; - pixel_y = 9 +"iNy" = ( +/obj/structure/chair{ + dir = 4 }, -/obj/item/folder/blue{ - pixel_x = -8; - pixel_y = -2 +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"iNE" = ( +/obj/structure/rack, +/obj/effect/spawner/random/clothing/costume, +/obj/effect/spawner/random/clothing/costume, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/blue{ + dir = 4 }, -/obj/item/pen/blue{ - pixel_y = -2 +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/maintenance/port/fore) +"iNH" = ( +/obj/structure/chair/office{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) "iNQ" = ( @@ -27682,16 +28672,6 @@ }, /turf/open/floor/iron/dark, /area/station/commons/storage/mining) -"iPD" = ( -/obj/machinery/atmospherics/components/binary/pump/off, -/obj/machinery/airlock_sensor/incinerator_ordmix{ - pixel_x = 24 - }, -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/science/ordnance/burnchamber) "iPR" = ( /obj/structure/closet/emcloset, /turf/open/floor/plating, @@ -27702,13 +28682,6 @@ dir = 4 }, /area/station/security/brig/entrance) -"iPY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood/parquet, -/area/station/commons/lounge) "iQf" = ( /obj/machinery/door/airlock/external{ name = "Service Hall Exit" @@ -27723,24 +28696,23 @@ /obj/effect/mapping_helpers/airlock/access/all/service/general, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/service) -"iQl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"iQr" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) +"iQj" = ( +/obj/item/radio/intercom/directional/north, +/obj/structure/table/glass, +/obj/machinery/computer/records/medical/laptop, +/turf/open/floor/iron/white/textured, +/area/station/security/medical) "iQt" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/plating, /area/station/service/chapel) +"iQw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/maintenance/aft/greater) "iQx" = ( /obj/effect/turf_decal/stripes/asteroid/line{ dir = 1 @@ -27787,6 +28759,16 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"iQX" = ( +/obj/structure/chair/sofa/bench{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/entry) "iRc" = ( /obj/structure/table, /obj/item/stack/cable_coil{ @@ -27802,6 +28784,7 @@ /obj/effect/mapping_helpers/airlock/unres{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "iRo" = ( @@ -27823,6 +28806,13 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/checkpoint/engineering) +"iRw" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Atmospherics - West" + }, +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/iron, +/area/station/engineering/atmos) "iRx" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -27846,6 +28836,12 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron, /area/station/engineering/atmos) +"iRM" = ( +/obj/structure/rack, +/obj/item/stack/sheet/iron/twenty, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark/textured, +/area/station/security/interrogation) "iRN" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -27868,39 +28864,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/security/prison) -"iSd" = ( -/obj/structure/rack, -/obj/item/clothing/suit/armor/riot{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/suit/armor/riot, -/obj/item/clothing/suit/armor/riot{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/clothing/head/helmet/toggleable/riot{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/head/helmet/toggleable/riot, -/obj/item/clothing/head/helmet/toggleable/riot{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/shield/riot{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/shield/riot, -/obj/item/shield/riot{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) "iSf" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -27941,6 +28904,14 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/white, /area/station/medical/virology) +"iSA" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "packageSort2" + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/station/cargo/sorting) "iSE" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /obj/structure/cable, @@ -27953,6 +28924,16 @@ dir = 8 }, /area/station/engineering/lobby) +"iSQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock{ + name = "Unisex Showers" + }, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/effect/mapping_helpers/airlock/unres, +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) "iST" = ( /obj/structure/chair/office, /obj/structure/extinguisher_cabinet/directional/east, @@ -27976,6 +28957,22 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) +"iTJ" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/pen{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/folder/white{ + pixel_x = 2 + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/dark, +/area/station/science/genetics) "iTP" = ( /obj/item/reagent_containers/cup/bucket, /obj/effect/turf_decal/trimline/green/filled/line, @@ -27999,15 +28996,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/mine/production) -"iUg" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron/dark/side, -/area/mine/eva) "iUm" = ( /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, @@ -28064,15 +29052,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/command/bridge) -"iUY" = ( -/obj/structure/table, -/obj/item/toy/foamblade, -/obj/effect/spawner/random/clothing/kittyears_or_rabbitears, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms/laundry) "iVb" = ( /obj/structure/railing/corner{ dir = 8 @@ -28083,12 +29062,12 @@ /turf/open/floor/iron, /area/station/commons/storage/primary) "iVi" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/tile/blue{ dir = 8 }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/cafeteria, +/area/station/hallway/secondary/entry) "iVm" = ( /obj/structure/stairs/north, /obj/structure/railing{ @@ -28119,6 +29098,19 @@ /obj/structure/stairs/south, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"iWb" = ( +/obj/structure/sign/nanotrasen{ + pixel_x = 32 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) +"iWq" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/department/chapel) "iWr" = ( /turf/closed/wall, /area/station/service/kitchen/diner) @@ -28132,6 +29124,15 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) +"iWN" = ( +/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/dim/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "iWO" = ( /obj/structure/table, /obj/machinery/cell_charger, @@ -28258,11 +29259,14 @@ }, /turf/open/floor/plating, /area/station/cargo/storage) +"iYy" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "iYA" = ( -/obj/machinery/telecomms/relay/preset/mining, -/obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/circuit/green, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/plating/snowed/smoothed/icemoon, /area/mine/mechbay) "iYG" = ( /obj/structure/cable, @@ -28283,13 +29287,6 @@ }, /turf/open/floor/iron/textured, /area/station/security/brig) -"iZc" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Xenobiology Lab Access"; - network = list("ss13","rd","xeno") - }, -/turf/open/openspace, -/area/station/science/xenobiology) "iZl" = ( /obj/effect/spawner/structure/window, /obj/machinery/door/poddoor/shutters/preopen{ @@ -28331,6 +29328,14 @@ /obj/item/kitchen/spoon/plastic, /turf/open/floor/iron, /area/station/security/prison/mess) +"iZx" = ( +/obj/machinery/portable_atmospherics/canister/anesthetic_mix, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/cryo) "iZy" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 1 @@ -28341,11 +29346,6 @@ "iZz" = ( /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/labor_camp) -"iZJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/light_construct/directional/west, -/turf/open/floor/plating, -/area/station/construction) "iZO" = ( /obj/machinery/status_display/ai/directional/west, /obj/effect/turf_decal/tile/yellow/opposingcorners, @@ -28409,11 +29409,6 @@ }, /turf/open/floor/iron, /area/station/security/brig/upper) -"jaN" = ( -/obj/machinery/vending/wardrobe/atmos_wardrobe, -/obj/effect/turf_decal/stripes/end, -/turf/open/floor/iron/showroomfloor, -/area/station/engineering/atmos) "jaO" = ( /obj/machinery/door/airlock/atmos/glass{ name = "Turbine Access" @@ -28453,6 +29448,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/department/electrical) +"jaY" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/science/ordnance) "jba" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -28466,16 +29468,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark/textured, /area/station/security/prison/rec) -"jbh" = ( -/obj/structure/chair/comfy/beige, -/turf/open/floor/iron/grimy, -/area/station/hallway/secondary/entry) -"jbt" = ( -/obj/machinery/light/directional/north, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) "jbu" = ( /obj/structure/railing/corner, /turf/open/floor/iron/dark/side{ @@ -28521,6 +29513,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/courtroom) +"jbJ" = ( +/obj/effect/turf_decal/siding/thinplating_new/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "jbT" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -28543,15 +29544,11 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) -"jcw" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external{ - name = "Port Docking Bay 3" - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) "jcC" = ( -/obj/machinery/requests_console/directional/north, +/obj/machinery/requests_console/directional/north{ + department = "Ordnance"; + name = "Ordnance Lab Requests Console" + }, /turf/open/floor/iron/white, /area/station/science/ordnance) "jcP" = ( @@ -28571,18 +29568,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/prison/mess) -"jdj" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp, -/turf/open/floor/iron/grimy, -/area/station/commons/vacant_room/office) -"jdB" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs/auxiliary) "jdJ" = ( /obj/structure/chair/wood, /turf/open/floor/carpet, @@ -28597,6 +29582,7 @@ /area/station/hallway/secondary/exit/departure_lounge) "jdP" = ( /obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) "jdQ" = ( @@ -28619,6 +29605,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"jdY" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "jeh" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/oxygen_input{ dir = 1 @@ -28652,6 +29644,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/mix) +"jez" = ( +/obj/machinery/light/small/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "jeF" = ( /obj/effect/landmark/start/security_officer, /turf/open/floor/glass/reinforced, @@ -28665,46 +29662,16 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/wood, /area/station/service/lawoffice) -"jfc" = ( -/turf/closed/wall, -/area/station/command/heads_quarters/hop) -"jfq" = ( -/obj/machinery/telecomms/bus/preset_two, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) -"jft" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"jeK" = ( /obj/structure/disposalpipe/segment{ - dir = 4 + dir = 9 }, -/obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"jfz" = ( -/obj/effect/turf_decal/trimline/green/filled/line, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"jfD" = ( -/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/atmospherics/pipe/bridge_pipe/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/cyan, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/checker, -/area/station/engineering/atmos) +"jfc" = ( +/turf/closed/wall, +/area/station/command/heads_quarters/hop) "jfN" = ( /obj/structure/stairs/south, /obj/structure/railing{ @@ -28716,6 +29683,12 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/command/gateway) +"jfZ" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/iron/white/smooth_large, +/area/station/service/kitchen/diner) "jgh" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -28746,19 +29719,27 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/glass, /area/station/security/lockers) +"jgx" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal) +"jgD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/wardrobe/pjs{ + anchored = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/maintenance/port/fore) "jgG" = ( /obj/structure/closet/secure_closet/security/sec, /turf/open/floor/iron/smooth_edge, /area/station/security/lockers) -"jgV" = ( -/obj/machinery/light/dim/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/dark, -/area/station/medical/morgue) "jhf" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron/white, @@ -28815,47 +29796,6 @@ /obj/structure/tank_holder/extinguisher, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"jik" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/maintenance/port/fore) -"jiI" = ( -/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/greater) -"jiZ" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "MiniSat Service Bay"; - network = list("minisat"); - start_active = 1 - }, -/obj/machinery/airalarm/directional/east, -/obj/structure/rack, -/obj/item/storage/toolbox/electrical{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/storage/toolbox/mechanical, -/obj/item/multitool, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/service) -"jja" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/machinery/light/small/red/directional/south, -/obj/item/radio/intercom/chapel/directional/east, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "jjk" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -28863,16 +29803,6 @@ }, /turf/open/openspace, /area/station/cargo/storage) -"jjo" = ( -/obj/machinery/light/warm/directional/south, -/turf/open/floor/iron/dark/textured, -/area/station/security/prison) -"jjp" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "jjq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/dark_green{ @@ -28947,6 +29877,18 @@ }, /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/security/armory/upper) +"jkx" = ( +/obj/machinery/computer/security/telescreen/engine{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Security Post - Engineering" + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/engineering) "jkH" = ( /obj/structure/training_machine, /obj/effect/landmark/blobstart, @@ -28991,11 +29933,6 @@ /obj/machinery/atmospherics/components/tank, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"jlq" = ( -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/machinery/light/directional/east, -/turf/open/floor/grass, -/area/station/service/hydroponics) "jlu" = ( /obj/structure/railing/corner, /turf/open/lava/plasma/ice_moon, @@ -29044,23 +29981,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/range) -"jmb" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/north, -/obj/machinery/camera{ - c_tag = "Mining B-2 Hallway"; - dir = 9 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/mine/eva/lower) "jmc" = ( /obj/structure/table, /obj/structure/bedsheetbin, @@ -29074,6 +29994,20 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/plating, /area/station/medical/virology) +"jmy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/white/textured, +/area/station/security/medical) +"jmC" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/table, +/obj/item/pen/red, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/large, +/area/mine/eva/lower) "jmI" = ( /turf/closed/wall/r_wall, /area/station/security/prison/workout) @@ -29086,30 +30020,13 @@ }, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) -"jnn" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"jnw" = ( -/obj/structure/rack, -/obj/item/clothing/mask/gas{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/clothing/mask/gas, -/obj/item/clothing/mask/gas{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 +"jnR" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 }, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "jnS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -29164,25 +30081,24 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) -"joB" = ( -/obj/item/beacon, -/obj/effect/turf_decal/stripes/line{ +"joG" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/siding/wideplating/dark{ dir = 1 }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"joW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/firealarm/directional/east, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +/area/station/service/hydroponics) "jpd" = ( /obj/machinery/vending/coffee, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"jpe" = ( +/obj/structure/rack, +/obj/machinery/light_switch/directional/north, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/smooth_large, +/area/station/cargo/warehouse) "jpi" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/structure/sign/warning/gas_mask{ @@ -29203,6 +30119,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"jpx" = ( +/obj/structure/railing{ + dir = 10 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "jpy" = ( /obj/structure/table/wood, /obj/item/paper_bin{ @@ -29212,6 +30134,13 @@ /obj/item/pen, /turf/open/floor/wood, /area/station/service/lawoffice) +"jpC" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced/tinted, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "jpE" = ( /obj/structure/closet/l3closet/security, /obj/machinery/airalarm/directional/north, @@ -29233,6 +30162,20 @@ /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) +"jqj" = ( +/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/sign/poster/contraband/random/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) +"jqn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/directional/north, +/obj/structure/sign/poster/official/here_for_your_safety/directional/north, +/turf/open/floor/iron, +/area/station/security/prison/visit) "jqr" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29273,21 +30216,18 @@ dir = 1 }, /area/station/service/hydroponics) -"jqS" = ( -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/requests_console/directional/south{ - department = "Bridge"; - name = "Bridge Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/wood, -/area/station/command/meeting_room) "jqT" = ( /turf/closed/wall/r_wall, /area/station/engineering/storage/tech) +"jrc" = ( +/obj/machinery/button/door/directional/east{ + id = "xenobio6"; + layer = 4; + name = "Xenobio Pen 6 Blast DOors"; + req_access = list("xenobiology") + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "jre" = ( /turf/closed/wall, /area/station/maintenance/starboard/lesser) @@ -29317,16 +30257,14 @@ }, /turf/open/floor/iron, /area/station/science/robotics/lab) -"jse" = ( -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 9 +"jsh" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_y = 5 }, -/turf/open/floor/iron/dark, -/area/station/medical/virology) +/obj/machinery/mining_weather_monitor/directional/east, +/turf/open/floor/iron/grimy, +/area/station/hallway/secondary/entry) "jsp" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, @@ -29344,6 +30282,14 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"jss" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/contraband/random/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "jsB" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/iron, @@ -29364,15 +30310,41 @@ dir = 1 }, /area/station/hallway/primary/port) -"jtl" = ( -/obj/machinery/light/directional/north, -/obj/machinery/meter/monitored/waste_loop, -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ - dir = 8 +"jth" = ( +/obj/structure/table, +/obj/item/assembly/prox_sensor{ + pixel_x = -8; + pixel_y = 4 }, -/obj/effect/turf_decal/siding/wideplating/corner, +/obj/item/assembly/prox_sensor{ + pixel_x = -8; + pixel_y = 4 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = -8; + pixel_y = 4 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = -8; + pixel_y = 4 + }, +/obj/item/stock_parts/cell/high, +/obj/item/stock_parts/cell/high, +/obj/item/crowbar, +/obj/item/radio/headset/headset_sci{ + pixel_x = -3 + }, +/obj/machinery/newscaster/directional/east, +/obj/machinery/light/directional/east, /turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) +/area/station/science/robotics/lab) +"jtm" = ( +/obj/machinery/porta_turret/ai{ + dir = 4; + installation = /obj/item/gun/energy/e_gun + }, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/aisat/hallway) "jtn" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/unres, @@ -29392,15 +30364,6 @@ /obj/effect/mapping_helpers/requests_console/assistance, /turf/open/floor/iron, /area/station/service/janitor) -"jtu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/half{ - dir = 4 - }, -/turf/open/floor/iron/half{ - dir = 1 - }, -/area/station/hallway/secondary/service) "jtx" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/red, @@ -29517,25 +30480,31 @@ "jug" = ( /turf/open/floor/glass/reinforced, /area/station/engineering/atmos/pumproom) -"jui" = ( -/obj/structure/filingcabinet, -/obj/structure/sign/poster/official/space_cops/directional/west, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ +"jul" = ( +/obj/machinery/conveyor{ + id = "garbage" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/science) +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "jum" = ( /obj/effect/turf_decal/tile/brown, /turf/open/floor/iron/dark/corner, /area/mine/eva) -"jun" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 +"juq" = ( +/obj/structure/closet/secure_closet/personal{ + anchored = 1 }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/locker) "jur" = ( /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/broken_floor, @@ -29545,35 +30514,26 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) +"juu" = ( +/turf/open/floor/iron/grimy, +/area/station/hallway/secondary/entry) "juw" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 1 }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"juE" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/tank/oxygen, -/turf/open/floor/iron/dark, -/area/station/science/ordnance) "juQ" = ( /obj/structure/rack, /obj/item/stack/rods/fifty, /obj/item/stack/sheet/glass/fifty, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"juZ" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/mine/eva/lower) +"juS" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) "jvc" = ( /obj/machinery/door/firedoor/border_only, /turf/open/openspace, @@ -29585,12 +30545,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"jvm" = ( -/obj/structure/closet/secure_closet/courtroom, -/obj/item/gavelhammer, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/iron, -/area/station/security/courtroom) "jvs" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, @@ -29600,6 +30554,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/medical/morgue) +"jvD" = ( +/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, +/turf/open/floor/iron, +/area/mine/production) "jvL" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/hollow/reinforced/middle{ @@ -29632,15 +30593,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/central) -"jwm" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics) "jwn" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/conveyor{ @@ -29670,10 +30622,22 @@ }, /turf/open/floor/iron, /area/station/security/brig/upper) +"jwB" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal) "jwF" = ( /obj/effect/spawner/random/trash/mess, /turf/open/floor/iron, /area/station/maintenance/starboard/fore) +"jwH" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "jwN" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/structure/cable, @@ -29711,38 +30675,38 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/storage) -"jxG" = ( -/obj/machinery/conveyor{ - dir = 1; - id = "QMLoad" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/plating, -/area/station/cargo/storage) -"jxJ" = ( -/obj/machinery/atmospherics/components/tank, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/station/science/ordnance) -"jxK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/hidden, -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) +"jyg" = ( +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "jyh" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/wood{ dir = 8 }, /obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/digital_clock/directional/south, /turf/open/floor/iron, /area/station/service/bar) +"jyl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/holopad, +/turf/open/floor/iron/dark/textured, +/area/station/security/execution/transfer) +"jyo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"jyp" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "jyz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -29754,6 +30718,16 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/medical/virology) +"jyL" = ( +/obj/structure/cable, +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/closet/crate/preopen, +/obj/item/stack/sheet/mineral/plasma/thirty, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/smooth, +/area/mine/laborcamp/security) "jyR" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -29767,24 +30741,6 @@ /obj/structure/closet/secure_closet/captains, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) -"jzr" = ( -/obj/item/reagent_containers/spray/plantbgone, -/obj/item/reagent_containers/spray/pestspray{ - pixel_x = 3; - pixel_y = 4 - }, -/obj/item/reagent_containers/cup/bottle/nutrient/ez, -/obj/item/reagent_containers/cup/bottle/nutrient/rh{ - pixel_x = 2; - pixel_y = 1 - }, -/obj/structure/table/glass, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden) "jzy" = ( /obj/machinery/computer/exodrone_control_console{ dir = 1 @@ -29839,6 +30795,11 @@ }, /turf/open/floor/iron, /area/station/science/xenobiology) +"jAI" = ( +/obj/machinery/module_duplicator, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/science/explab) "jAO" = ( /obj/effect/turf_decal/siding/yellow{ dir = 8 @@ -29852,6 +30813,19 @@ }, /turf/open/floor/plating, /area/station/maintenance/space_hut/cabin) +"jBb" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/parquet, +/area/station/commons/lounge) +"jBc" = ( +/obj/machinery/dna_infuser, +/obj/item/infuser_book, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/science/genetics) "jBf" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29870,14 +30844,6 @@ }, /turf/open/floor/plating, /area/station/science/xenobiology) -"jBl" = ( -/obj/structure/training_machine, -/obj/item/target, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/fitness) "jBn" = ( /obj/docking_port/stationary{ dir = 4; @@ -29894,21 +30860,25 @@ /obj/structure/flora/bush/jungle/a/style_random, /turf/open/floor/grass, /area/station/service/hydroponics) -"jBw" = ( -/obj/structure/chair/sofa/corp/right, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/wood, -/area/station/hallway/secondary/service) +"jBr" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "jBB" = ( /obj/structure/kitchenspike, /turf/open/floor/plating/snowed/coldroom, /area/station/service/kitchen/coldroom) -"jBH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/maintenance/port/fore) +"jBK" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/effect/landmark/start/hangover/closet, +/obj/machinery/mining_weather_monitor/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "jBR" = ( /obj/machinery/atmospherics/components/unary/thermomachine/heater{ dir = 8 @@ -29938,6 +30908,21 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) +"jCA" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/machinery/duct, +/obj/machinery/camera{ + c_tag = "Virology Module North"; + dir = 9; + network = list("ss13","medbay") + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) "jCD" = ( /obj/structure/table/wood, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -29948,6 +30933,11 @@ }, /turf/open/floor/carpet, /area/station/security/detectives_office) +"jCE" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/smartfridge/petri/preloaded, +/turf/open/openspace, +/area/station/science/xenobiology) "jCF" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/chair/wood{ @@ -29967,16 +30957,6 @@ /obj/machinery/computer/security/telescreen/entertainment/directional/west, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) -"jCY" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/structure/chair/sofa/corp/right{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/aft) "jDc" = ( /obj/effect/spawner/random/vending/snackvend, /obj/structure/sign/departments/restroom/directional/south, @@ -30030,6 +31010,29 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"jDS" = ( +/obj/structure/chair/sofa/bench/left, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) +"jDT" = ( +/obj/structure/table/reinforced, +/obj/item/computer_disk/engineering, +/obj/item/computer_disk/engineering, +/obj/item/computer_disk/engineering, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/ce) "jDW" = ( /obj/effect/turf_decal/bot_white/left, /obj/structure/closet/crate/silvercrate, @@ -30042,11 +31045,20 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) -"jDY" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) +"jEf" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 5 + }, +/obj/structure/bed/medical/anchored{ + dir = 8 + }, +/obj/item/bedsheet/medical{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/virology) "jEr" = ( /obj/structure/table/wood, /obj/item/camera, @@ -30064,6 +31076,14 @@ }, /turf/open/floor/iron, /area/mine/laborcamp) +"jEB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/newscaster/directional/north, +/obj/machinery/light/small/dim/directional/north{ + pixel_y = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "jFf" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 1 @@ -30076,16 +31096,6 @@ /obj/structure/rack, /turf/open/floor/iron, /area/station/command/gateway) -"jFi" = ( -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen, -/obj/structure/table, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs/auxiliary) "jFA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -30127,33 +31137,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/tcommsat/computer) -"jGq" = ( -/obj/structure/sign/warning/electric_shock/directional/east, -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) -"jGr" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/external, +"jGo" = ( +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, -/area/station/commons/dorms/laundry) +/area/station/maintenance/port/lesser) "jGB" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, /turf/open/floor/iron/large, /area/station/engineering/lobby) -"jGE" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/light/directional/west, -/obj/item/kirbyplants/random, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/service/chapel) "jGN" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 9 @@ -30184,10 +31177,6 @@ /obj/item/clothing/suit/hazardvest, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"jHm" = ( -/obj/machinery/computer/warrant, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "jHE" = ( /obj/effect/turf_decal/siding/white/corner, /obj/machinery/firealarm/directional/south, @@ -30216,13 +31205,6 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron, /area/station/service/hydroponics) -"jHN" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) "jHQ" = ( /obj/machinery/atmospherics/components/trinary/filter/atmos/co2{ dir = 1 @@ -30232,6 +31214,25 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"jHV" = ( +/obj/machinery/mineral/stacking_machine{ + stack_amt = 10; + output_dir = 2 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal) +"jHX" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/landmark/navigate_destination/dockescpod1, +/turf/open/floor/iron/cafeteria{ + dir = 8 + }, +/area/station/hallway/secondary/entry) "jIg" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -30257,32 +31258,33 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_half, /area/station/security/office) +"jIn" = ( +/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/security/checkpoint/customs/auxiliary) +"jIp" = ( +/obj/item/beacon, +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/large, +/area/station/hallway/secondary/entry) +"jIr" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "jIv" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) -"jIA" = ( -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, -/obj/machinery/firealarm/directional/east, -/obj/structure/table/reinforced, -/obj/item/stack/wrapping_paper{ - pixel_x = 3; - pixel_y = 4 - }, -/obj/item/stack/package_wrap{ - pixel_x = -1; - pixel_y = -1 - }, -/obj/item/dest_tagger, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "jIE" = ( /obj/structure/sign/warning/gas_mask, /turf/closed/wall, @@ -30323,9 +31325,12 @@ /obj/structure/cable/multilayer/connected, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) -"jJa" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 +"jJd" = ( +/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/blue{ + dir = 8 }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) @@ -30350,14 +31355,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"jJm" = ( -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron/dark, -/area/station/maintenance/disposal) -"jJu" = ( -/obj/machinery/airalarm/directional/north, -/turf/closed/wall/r_wall, -/area/station/maintenance/aft/greater) "jJF" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/effect/turf_decal/stripes/line{ @@ -30424,13 +31421,6 @@ /obj/effect/turf_decal/tile/dark/fourcorners, /turf/open/floor/iron, /area/mine/living_quarters) -"jKC" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/wood, -/area/station/service/lawoffice) "jKG" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/machinery/light/directional/south, @@ -30468,10 +31458,29 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"jKP" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"jKV" = ( +/obj/item/training_toolbox{ + pixel_y = 5 + }, +/obj/structure/table, +/obj/item/training_toolbox{ + pixel_y = -2 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/fitness) "jKY" = ( -/obj/structure/closet/secure_closet/cytology, -/turf/open/floor/glass/reinforced, -/area/station/science/xenobiology) +/turf/closed/mineral/random/snow/high_chance, +/area/icemoon/underground/unexplored/rivers/deep/shoreline) "jLa" = ( /obj/structure/sign/poster/contraband/random/directional/north, /turf/open/openspace, @@ -30480,6 +31489,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/mine/production) +"jLf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "jLl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/effect/turf_decal/siding/yellow{ @@ -30508,39 +31522,22 @@ }, /turf/open/floor/iron, /area/mine/laborcamp) -"jLD" = ( -/obj/structure/cable, +"jLB" = ( +/obj/structure/sign/warning/electric_shock/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 4 - }, -/obj/structure/disposalpipe/trunk{ +/obj/effect/turf_decal/tile/red, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"jLM" = ( +/obj/effect/turf_decal/tile/blue, +/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/corner{ dir = 8 }, -/obj/machinery/disposal/bin, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms/laundry) -"jLK" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/machinery/duct, -/obj/machinery/camera{ - c_tag = "Virology Module North"; - dir = 9; - network = list("ss13","medbay") - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/virology) +/area/station/hallway/secondary/entry) "jLO" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/plating/snowed/smoothed/icemoon, @@ -30570,6 +31567,12 @@ /obj/effect/mapping_helpers/mail_sorting/science/ordnance, /turf/open/floor/iron, /area/station/science/ordnance/testlab) +"jLX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "jLZ" = ( /obj/structure/table/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -30597,13 +31600,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/atmos) -"jMp" = ( -/obj/machinery/vending/tool, -/obj/machinery/light/directional/east, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/engineering/lobby) "jMw" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -30641,15 +31637,17 @@ "jNp" = ( /turf/closed/wall/r_wall, /area/station/security/holding_cell) -"jNA" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/junction{ +"jNB" = ( +/obj/structure/chair/comfy/beige{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/blue, +/area/station/hallway/secondary/entry) +"jNS" = ( +/obj/effect/mapping_helpers/burnt_floor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, -/area/station/maintenance/port/greater) +/area/station/maintenance/starboard/fore) "jNZ" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 9 @@ -30672,14 +31670,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"jOe" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/food_or_drink/snack, -/turf/open/floor/plating, -/area/station/maintenance/department/chapel) "jOi" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -30742,7 +31732,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/modular_computer/console/preset/cargochat/service{ +/obj/machinery/modular_computer/preset/cargochat/service{ dir = 4 }, /turf/open/floor/plating, @@ -30800,17 +31790,20 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/mix) +"jPv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore) "jPx" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/breakroom) -"jPK" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) +"jPV" = ( +/obj/structure/sign/poster/random/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "jPY" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -30913,6 +31906,22 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/brig/entrance) +"jRd" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/mine/eva) +"jRg" = ( +/obj/structure/table, +/obj/machinery/camera/motion/directional/west{ + c_tag = "AI Upload West"; + network = list("aiupload") + }, +/obj/item/ai_module/supplied/freeform, +/obj/effect/turf_decal/tile/dark_green, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) "jRm" = ( /obj/machinery/light/small/directional/east, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -30934,7 +31943,7 @@ "jRB" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table_frame, -/obj/item/wirerod, +/obj/item/melee/baton/security/cattleprod, /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) @@ -30942,6 +31951,17 @@ /obj/structure/cable, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) +"jRI" = ( +/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/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) "jRM" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 6 @@ -30949,6 +31969,10 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"jRP" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark/textured, +/area/station/security/interrogation) "jRS" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 8 @@ -30978,28 +32002,12 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) -"jSk" = ( -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron, -/area/station/command/bridge) "jSl" = ( /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/station/engineering/storage/tech) -"jSm" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/door/window/brigdoor/right/directional/south{ - name = "Research Director Observation"; - req_access = list("rd") - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/command/heads_quarters/rd) "jSt" = ( /obj/machinery/door/airlock/external{ name = "Security Yard"; @@ -31017,6 +32025,11 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"jSC" = ( +/obj/structure/bookcase/random/reference, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, +/area/station/service/library) "jSL" = ( /obj/structure/stairs/east, /turf/open/floor/plating, @@ -31027,6 +32040,10 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"jSQ" = ( +/obj/structure/sign/poster/official/here_for_your_safety/directional/east, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) "jST" = ( /obj/machinery/door/window/right/directional/east{ dir = 1; @@ -31076,6 +32093,13 @@ }, /turf/open/floor/plating, /area/station/science/genetics) +"jTT" = ( +/obj/structure/chair/stool/directional/east, +/obj/machinery/light/floor, +/turf/open/floor/iron/half{ + dir = 1 + }, +/area/station/engineering/atmos) "jTV" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -31090,15 +32114,6 @@ /obj/effect/mapping_helpers/airlock/access/all/science/rd, /turf/open/floor/iron/dark, /area/station/science/server) -"jUe" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, -/turf/open/floor/iron, -/area/mine/laborcamp) "jUn" = ( /obj/structure/table, /obj/item/folder/red{ @@ -31141,6 +32156,23 @@ dir = 8 }, /area/station/science/ordnance/office) +"jUY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/personal{ + anchored = 1 + }, +/obj/item/clothing/gloves/boxing, +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) +"jUZ" = ( +/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/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "jVb" = ( /obj/machinery/space_heater, /obj/machinery/light/small/directional/north, @@ -31166,21 +32198,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/cargo/drone_bay) -"jVD" = ( -/obj/docking_port/stationary{ - dir = 2; - dwidth = 11; - height = 24; - name = "SS13: Auxiliary Dock, Station-Port"; - shuttle_id = "whiteship_home"; - width = 35 - }, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/surface/outdoors/nospawn) "jVE" = ( /obj/effect/turf_decal/box/white, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) +"jVL" = ( +/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/structure/sign/departments/rndserver/directional/south, +/turf/open/floor/iron/white, +/area/station/science/research) "jWl" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -31201,6 +32232,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) +"jWt" = ( +/obj/structure/cable, +/obj/structure/closet/radiation, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal/incinerator) "jWJ" = ( /obj/machinery/light/small/directional/west, /obj/structure/closet/emcloset/anchored, @@ -31220,33 +32257,44 @@ }, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) -"jWU" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall, -/area/station/commons/vacant_room/commissary) -"jWX" = ( -/obj/effect/spawner/structure/window/hollow/middle, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "jXc" = ( /obj/structure/sign/poster/official/help_others, /turf/closed/wall/ice, /area/icemoon/underground/explored) +"jXe" = ( +/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/dust, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/port/lesser) "jXl" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) -"jXw" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/hallway) -"jXB" = ( -/obj/effect/landmark/blobstart, -/obj/effect/mapping_helpers/burnt_floor, -/obj/effect/landmark/generic_maintenance_landmark, +"jXm" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"jXr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"jXC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/storage/box, +/obj/effect/spawner/random/bureaucracy/birthday_wrap, +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/effect/spawner/random/bureaucracy/birthday_wrap, +/obj/machinery/light/small/directional/west, /turf/open/floor/plating, -/area/station/maintenance/port/fore) +/area/station/maintenance/port/greater) "jXD" = ( /obj/machinery/light/directional/north, /turf/open/floor/iron, @@ -31289,15 +32337,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"jYg" = ( -/obj/machinery/light/directional/west, -/obj/structure/sign/departments/chemistry/directional/west, -/obj/machinery/holopad, -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/medical/treatment_center) "jYj" = ( /obj/structure/sign/warning/secure_area/directional/north, /obj/effect/turf_decal/stripes/red/line{ @@ -31325,11 +32364,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/port/aft) -"jYP" = ( -/obj/effect/spawner/random/structure/crate, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/fore) "jYS" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/plating, @@ -31384,6 +32418,12 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"jZD" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/carpet/red, +/area/station/commons/vacant_room/office) "jZI" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 @@ -31402,6 +32442,10 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"jZU" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/construction) "jZY" = ( /obj/structure/tank_holder/extinguisher, /obj/effect/turf_decal/stripes/line{ @@ -31415,6 +32459,17 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, /area/station/cargo/office) +"kax" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 5 + }, +/obj/machinery/light_switch/directional/north{ + pixel_x = -5 + }, +/obj/structure/closet/secure_closet/medical1, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/virology) "kaK" = ( /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron, @@ -31426,22 +32481,12 @@ }, /turf/open/floor/iron, /area/mine/laborcamp) -"kaW" = ( -/obj/machinery/light/directional/east, -/obj/machinery/button/door/directional/east{ - id = "xenobio9"; - layer = 4; - name = "Xenobio Pen 9 Blast DOors"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"kaX" = ( -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/iron/white/side{ - dir = 6 - }, -/area/station/science/research) +"kbd" = ( +/obj/structure/closet, +/obj/effect/spawner/random/maintenance, +/obj/item/clothing/shoes/workboots, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "kbn" = ( /obj/effect/decal/cleanable/food/pie_smudge, /turf/open/floor/iron, @@ -31451,6 +32496,16 @@ /obj/structure/fluff/fokoff_sign, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) +"kbq" = ( +/obj/machinery/conveyor{ + id = "garbage"; + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "kbs" = ( /obj/effect/turf_decal/loading_area{ dir = 1 @@ -31540,30 +32595,6 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron, /area/station/engineering/storage/tech) -"kcA" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 8 - }, -/obj/machinery/button/door/directional/west{ - id = "xenobiomain"; - name = "Containment Blast Doors"; - pixel_y = -6; - req_access = list("xenobiology") - }, -/obj/machinery/button/door/directional/west{ - id = "misclab"; - name = "Test Chamber Blast Doors"; - pixel_y = 6; - req_access = list("xenobiology") - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "kcC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -31594,18 +32625,10 @@ }, /turf/open/floor/plating, /area/station/security/prison/visit) -"kcV" = ( -/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/modular_computer/console/preset/civilian{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) +"kcW" = ( +/obj/structure/sign/warning/directional/south, +/turf/open/genturf/blue, +/area/icemoon/underground/unexplored/rivers/deep/shoreline) "kdc" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ dir = 8 @@ -31619,6 +32642,13 @@ /obj/structure/sign/warning/test_chamber/directional/south, /turf/open/floor/iron, /area/station/science/ordnance/testlab) +"kdD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "kdF" = ( /obj/effect/spawner/random/vending/snackvend, /turf/open/floor/iron, @@ -31634,17 +32664,15 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white/textured, /area/station/security/medical) -"kdW" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Customs Security Checkpoint" - }, -/obj/machinery/airalarm/directional/west, -/obj/machinery/light_switch/directional/south, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ +"kdU" = ( +/obj/effect/turf_decal/siding/thinplating_new{ dir = 8 }, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, /turf/open/floor/iron, -/area/station/security/checkpoint/customs/auxiliary) +/area/station/hallway/secondary/entry) "kdY" = ( /obj/machinery/camera/directional/north{ c_tag = "Atmospherics Waste Tank" @@ -31691,14 +32719,6 @@ /obj/item/canvas/nineteen_nineteen, /turf/open/floor/sepia, /area/station/security/prison/rec) -"keF" = ( -/obj/structure/sign/warning/secure_area/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 4 - }, -/area/station/command/gateway) "keL" = ( /obj/machinery/light_switch/directional/south, /obj/effect/turf_decal/tile/neutral/half/contrasted, @@ -31719,6 +32739,21 @@ dir = 1 }, /area/station/hallway/primary/central) +"keT" = ( +/obj/machinery/atmospherics/components/trinary/filter{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/maintenance/port/fore) "keV" = ( /turf/open/floor/engine/vacuum, /area/station/science/ordnance/burnchamber) @@ -31787,10 +32822,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/mine/laborcamp) -"kfF" = ( -/obj/structure/sign/poster/official/no_erp/directional/west, -/turf/closed/wall, -/area/station/maintenance/starboard/fore) "kfP" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/east, @@ -31813,6 +32844,14 @@ /obj/structure/sign/poster/random/directional/west, /turf/open/floor/iron, /area/station/engineering/atmos) +"kfX" = ( +/obj/structure/table/wood, +/obj/item/toy/cards/deck{ + pixel_y = 4 + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/carpet, +/area/station/service/theater) "kfY" = ( /obj/effect/turf_decal/siding/white{ dir = 1 @@ -31885,6 +32924,13 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"kgy" = ( +/obj/structure/cable, +/obj/effect/spawner/random/structure/steam_vent, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "kgz" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/hollow/reinforced/middle, @@ -31918,6 +32964,13 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) +"kgY" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "khb" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -31950,6 +33003,22 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"khu" = ( +/obj/structure/closet/toolcloset, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/construction) +"khy" = ( +/obj/structure/rack, +/obj/item/wrench, +/obj/item/crowbar/red, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/station/ai_monitored/turret_protected/aisat/atmos) +"khz" = ( +/obj/structure/marker_beacon/cerulean, +/turf/open/genturf, +/area/icemoon/surface/outdoors/unexplored/rivers/no_monsters) "khA" = ( /obj/machinery/firealarm/directional/west, /obj/item/kirbyplants/random, @@ -31972,12 +33041,25 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit, /area/station/ai_monitored/command/nuke_storage) +"khV" = ( +/obj/structure/table, +/obj/item/ai_module/reset, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_green, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) "khW" = ( /obj/effect/decal/cleanable/cobweb, /obj/effect/spawner/random/structure/crate, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/port/fore) +"kii" = ( +/obj/effect/spawner/random/trash/food_packaging, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "kin" = ( /obj/machinery/pdapainter/supply, /turf/open/floor/carpet, @@ -32036,6 +33118,44 @@ }, /turf/open/floor/iron/dark, /area/station/tcommsat/computer) +"kiY" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/effect/spawner/random/armory/bulletproof_armor, +/obj/effect/spawner/random/armory/bulletproof_helmet, +/turf/open/floor/iron/dark/textured, +/area/station/ai_monitored/security/armory) +"kjh" = ( +/obj/machinery/modular_computer/preset/engineering, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/engine_smes) +"kjo" = ( +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, +/obj/machinery/door/airlock/engineering{ + name = "Utilities Room" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"kjr" = ( +/obj/structure/sign/warning/test_chamber/directional/south, +/turf/open/floor/engine, +/area/station/science/genetics) +"kjt" = ( +/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, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "kjw" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/machinery/camera/directional/south{ @@ -32111,11 +33231,11 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) -"kku" = ( -/obj/machinery/airalarm/directional/east, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/commons/locker) +"kkA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "kkB" = ( /obj/machinery/light/small/directional/south, /obj/structure/closet/secure_closet/brig{ @@ -32172,11 +33292,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/break_room) -"kln" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/dark, -/area/station/maintenance/disposal) "klo" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/table/reinforced, @@ -32197,6 +33312,10 @@ /obj/effect/spawner/random/contraband/prison, /turf/open/floor/carpet/blue, /area/station/security/prison/work) +"klP" = ( +/obj/structure/dresser, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain) "klX" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/public/glass{ @@ -32239,7 +33358,9 @@ /turf/open/floor/iron/dark/side, /area/station/service/chapel) "kmA" = ( -/obj/structure/bed, +/obj/structure/bed/medical/anchored{ + dir = 4 + }, /obj/item/bedsheet/medical, /obj/machinery/camera/directional/east{ c_tag = "Labor Camp Infirmary"; @@ -32253,6 +33374,25 @@ }, /turf/open/floor/iron/white, /area/mine/laborcamp) +"kmD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/electrolyzer, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"kmG" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/cup/bottle/epinephrine, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = 6 + }, +/obj/item/reagent_containers/syringe, +/obj/machinery/defibrillator_mount/directional/north, +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/blue/full, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/large, +/area/station/medical/treatment_center) "kmH" = ( /obj/effect/spawner/random/entertainment/cigar, /obj/structure/table, @@ -32262,6 +33402,11 @@ /obj/effect/decal/cleanable/generic, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) +"kmO" = ( +/obj/machinery/computer/mechpad, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/textured, +/area/mine/mechbay) "kmQ" = ( /obj/structure/railing/corner{ dir = 8 @@ -32284,7 +33429,7 @@ /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "kna" = ( -/obj/machinery/modular_computer/console/preset/cargochat/engineering, +/obj/machinery/modular_computer/preset/cargochat/engineering, /obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/lobby) @@ -32293,6 +33438,17 @@ /obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/lobby) +"knd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/commons/dorms/laundry) +"knf" = ( +/obj/effect/spawner/random/trash/mess, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/contraband/random/directional/east, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) "knl" = ( /turf/open/floor/engine{ name = "Holodeck Projector Floor" @@ -32320,14 +33476,39 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/project) -"koB" = ( -/obj/effect/landmark/start/hangover, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/blue/half/contrasted{ +"kod" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/blue{ dir = 1 }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) +/obj/machinery/light/directional/north, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/cafeteria{ + dir = 8 + }, +/area/station/hallway/secondary/entry) +"koA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/industrial_lift{ + radial_travel = 0 + }, +/obj/effect/landmark/lift_id{ + specific_lift_id = "publicElevator" + }, +/obj/machinery/light/floor, +/obj/effect/abstract/elevator_music_zone{ + linked_elevator_id = "publicElevator" + }, +/turf/open/floor/plating/elevatorshaft, +/area/mine/storage) +"koH" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/station/commons/locker) "koO" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ @@ -32335,6 +33516,17 @@ }, /turf/closed/wall/r_wall, /area/station/engineering/atmos) +"koQ" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/secondary/entry) "koX" = ( /obj/structure/sign/warning/secure_area/directional/west, /obj/structure/cable, @@ -32357,22 +33549,12 @@ }, /turf/open/floor/iron/smooth, /area/station/security/holding_cell) -"kpp" = ( -/obj/structure/table/wood, -/obj/item/storage/box/matches, -/obj/item/razor{ - pixel_x = -4; - pixel_y = 2 - }, -/obj/item/clothing/mask/cigarette/cigar, -/obj/item/reagent_containers/cup/glass/flask/gold, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain) "kpu" = ( /obj/effect/spawner/random/trash/mess, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/port/fore) "kpC" = ( @@ -32398,11 +33580,6 @@ }, /turf/open/floor/iron, /area/mine/laborcamp) -"kpM" = ( -/obj/machinery/status_display/ai/directional/north, -/obj/machinery/light/directional/north, -/turf/open/openspace, -/area/station/engineering/atmos/storage) "kpO" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 8 @@ -32412,14 +33589,15 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"kpU" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 +"kpX" = ( +/obj/structure/bed/medical{ + dir = 4 }, -/obj/machinery/light/small/directional/west, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/carpet, -/area/station/service/library) +/obj/item/clothing/suit/jacket/straight_jacket, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/turf/open/floor/iron/white/textured, +/area/station/security/medical) "kqc" = ( /turf/closed/wall, /area/station/security/medical) @@ -32473,6 +33651,11 @@ }, /turf/open/floor/iron/white/corner, /area/station/engineering/atmos) +"kqs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/sustenance/labor_camp, +/turf/open/floor/iron, +/area/mine/laborcamp) "kqw" = ( /obj/effect/spawner/random/vending/colavend, /obj/effect/turf_decal/tile/red{ @@ -32480,12 +33663,25 @@ }, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/exit/departure_lounge) +"kqx" = ( +/obj/structure/sign/warning/secure_area/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 4 + }, +/area/station/command/gateway) "kqA" = ( /obj/effect/turf_decal/tile/neutral/diagonal_edge, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) +"kqK" = ( +/obj/effect/spawner/random/trash/mess, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/random/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) "kqN" = ( /obj/effect/turf_decal/trimline/green/filled/warning{ dir = 1 @@ -32557,7 +33753,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "krx" = ( -/obj/machinery/atmospherics/components/unary/cryo_cell, +/obj/machinery/cryo_cell, /obj/effect/turf_decal/stripes/line{ dir = 10 }, @@ -32575,10 +33771,6 @@ }, /turf/open/floor/plating, /area/mine/laborcamp/security) -"krH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/hidden, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "krN" = ( /obj/structure/sign/poster/official/random/directional/south, /obj/structure/window/reinforced/spawner/directional/west, @@ -32605,19 +33797,14 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark/textured, /area/station/security/prison) +"krW" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "krY" = ( /turf/closed/wall/r_wall, /area/station/science/breakroom) -"ksa" = ( -/obj/structure/table, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) "kse" = ( /obj/structure/chair/sofa/bench/left{ dir = 8 @@ -32694,7 +33881,7 @@ "ksU" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, -/obj/machinery/modular_computer/console/preset/civilian, +/obj/machinery/modular_computer/preset/civilian, /obj/effect/turf_decal/bot_white, /obj/machinery/newscaster/directional/north, /obj/effect/turf_decal/tile/blue/opposingcorners, @@ -32715,6 +33902,16 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron, /area/station/command/bridge) +"ktp" = ( +/obj/machinery/washing_machine, +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/dorms/laundry) "ktt" = ( /obj/structure/sign/warning/electric_shock, /turf/closed/wall/r_wall, @@ -32746,6 +33943,8 @@ /area/station/maintenance/department/medical/central) "ktC" = ( /obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth, /area/station/maintenance/fore/lesser) "ktD" = ( @@ -32766,16 +33965,25 @@ "ktU" = ( /turf/open/floor/carpet, /area/station/command/meeting_room) +"ktW" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/radio/intercom/directional/south, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) +"kub" = ( +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "kum" = ( /obj/structure/table, /obj/item/trash/can/food/beans, /obj/item/reagent_containers/cup/glass/waterbottle/empty, /turf/open/floor/iron, /area/station/maintenance/starboard/fore) -"kuu" = ( -/obj/item/kirbyplants/random/dead, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) "kuy" = ( /obj/machinery/computer/pod/old/mass_driver_controller/ordnancedriver{ pixel_x = 28 @@ -32834,12 +34042,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"kvn" = ( -/obj/effect/spawner/random/trash/mess, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/maintenance/aft/greater) "kvs" = ( /obj/effect/turf_decal/tile/neutral/diagonal_edge, /obj/structure/disposalpipe/segment{ @@ -32859,6 +34061,22 @@ /obj/structure/closet/firecloset, /turf/open/floor/iron/smooth, /area/station/maintenance/port/fore) +"kvG" = ( +/obj/structure/sign/warning/secure_area/directional/south, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"kvH" = ( +/obj/structure/ladder, +/obj/structure/sign/warning/cold_temp/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/station/engineering/lobby) "kvI" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -32915,6 +34133,12 @@ /obj/effect/turf_decal/tile/purple/half, /turf/open/floor/iron/half, /area/station/hallway/primary/starboard) +"kwM" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/tank/oxygen, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/science/ordnance) "kwU" = ( /obj/machinery/computer/records/security, /obj/structure/cable, @@ -32950,21 +34174,14 @@ /obj/effect/turf_decal/tile/red/full, /turf/open/floor/iron/dark/smooth_large, /area/station/security/brig/entrance) +"kxs" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "kxv" = ( /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) -"kxy" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/item/kirbyplants/random, -/obj/machinery/light/small/directional/west, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/starboard) "kxN" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -32973,20 +34190,34 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/freezer, /area/station/commons/toilet) -"kxX" = ( -/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, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/station/commons/fitness) "kxY" = ( /obj/effect/turf_decal/stripes/corner, /turf/open/floor/iron, /area/station/engineering/storage_shared) +"kyc" = ( +/obj/effect/turf_decal/tile/blue, +/obj/item/kirbyplants/random, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/warning/electric_shock/directional/east, +/obj/structure/cable, +/obj/machinery/status_display/evac/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/white/corner{ + dir = 8 + }, +/area/station/hallway/secondary/entry) +"kyg" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/landmark/navigate_destination/dockescpod2, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/station/hallway/secondary/entry) "kyi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/stripes/line, @@ -33010,14 +34241,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"kyO" = ( -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"kyS" = ( -/obj/structure/closet/secure_closet/freezer/meat/all_access, -/turf/open/floor/iron/showroomfloor, -/area/station/security/prison/mess) +"kyU" = ( +/obj/machinery/modular_computer/preset/id, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/customs/auxiliary) "kyW" = ( /obj/machinery/computer/records/medical, /obj/structure/cable, @@ -33028,13 +34260,13 @@ /obj/effect/turf_decal/tile/red/full, /turf/open/floor/iron/dark/smooth_large, /area/station/security/checkpoint/medical) -"kzr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 4 +"kyZ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 }, -/turf/open/floor/iron/dark/textured, -/area/station/security/prison/rec) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "kzv" = ( /obj/structure/bed, /obj/item/bedsheet/random, @@ -33079,6 +34311,10 @@ /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 4 }, +/obj/item/multitool{ + pixel_x = 9; + pixel_y = 4 + }, /turf/open/floor/iron, /area/station/command/bridge) "kzG" = ( @@ -33087,15 +34323,6 @@ dir = 10 }, /area/station/science/research) -"kzI" = ( -/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 = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "kzO" = ( /obj/structure/table, /obj/machinery/cell_charger{ @@ -33123,12 +34350,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"kAl" = ( -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) "kAm" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/plating, @@ -33164,52 +34385,17 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) -"kAO" = ( -/obj/machinery/washing_machine, -/obj/structure/sign/poster/official/random/directional/north, -/obj/effect/turf_decal/tile/blue/opposingcorners{ +"kAW" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms/laundry) -"kAP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/industrial_lift{ - radial_travel = 0 - }, -/obj/effect/landmark/lift_id{ - specific_lift_id = "publicElevator" - }, -/obj/machinery/light/floor, -/obj/effect/abstract/elevator_music_zone{ - linked_elevator_id = "publicElevator" - }, -/turf/open/floor/plating/elevatorshaft, -/area/mine/storage) -"kAT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/binary/pressure_valve/on{ - dir = 4; - name = "Output Release" - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/dark/textured_edge, +/area/station/security/prison) "kAZ" = ( /obj/structure/tank_holder/extinguisher, /turf/open/floor/iron/white, /area/station/medical/cryo) -"kBh" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/dark/textured, -/area/station/security/execution/transfer) "kBi" = ( /obj/effect/mapping_helpers/airlock/abandoned, /obj/machinery/door/airlock/atmos{ @@ -33230,7 +34416,9 @@ /area/station/science/robotics/mechbay) "kBr" = ( /obj/structure/table/reinforced, -/obj/item/storage/medkit/regular, +/obj/item/storage/medkit/regular{ + pixel_y = 5 + }, /turf/open/floor/iron, /area/station/command/bridge) "kBL" = ( @@ -33243,28 +34431,27 @@ /obj/structure/sink/directional/south, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"kBP" = ( -/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") +"kBU" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_y = 5 }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"kBT" = ( -/obj/structure/table, -/obj/item/retractor, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) +/turf/open/floor/carpet/blue, +/area/station/hallway/secondary/entry) "kBV" = ( /obj/structure/table, /obj/item/circuitboard/machine/chem_dispenser/drinks, /turf/open/floor/wood, /area/station/maintenance/port/aft) +"kBX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/mine/eva/lower) "kCb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -33274,6 +34461,16 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"kCg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/obj/item/radio/intercom/directional/north, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, +/area/station/service/library) "kCh" = ( /obj/structure/closet, /obj/effect/spawner/random/maintenance, @@ -33302,6 +34499,11 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/commons/dorms) +"kCv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/cigbutt, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "kCx" = ( /obj/structure/table/wood, /obj/item/book/granter/action/spell/smoke/lesser{ @@ -33342,12 +34544,23 @@ "kCV" = ( /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/service) -"kDa" = ( -/obj/machinery/light/small/directional/west, -/obj/item/radio/intercom/directional/west, -/obj/machinery/chem_dispenser, -/turf/open/floor/glass/reinforced, -/area/station/medical/treatment_center) +"kCY" = ( +/obj/structure/rack, +/obj/item/clothing/shoes/winterboots/ice_boots/eva{ + pixel_y = 2 + }, +/obj/item/clothing/suit/hooded/wintercoat/eva{ + pixel_y = 5; + pixel_x = 1 + }, +/obj/machinery/light/small/directional/east, +/obj/machinery/mining_weather_monitor/directional/north, +/obj/effect/turf_decal/delivery/red, +/obj/machinery/camera/directional/north{ + c_tag = "Arrivals Emergency EVA" + }, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/secondary/entry) "kDb" = ( /obj/machinery/atmospherics/components/trinary/filter/flipped{ dir = 4; @@ -33362,25 +34575,36 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/mix) +"kDc" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/incinerator_input{ + dir = 8 + }, +/turf/open/floor/engine/vacuum, +/area/station/maintenance/disposal/incinerator) "kDj" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/cargo/sorting) +"kDm" = ( +/obj/structure/closet/crate/trashcart/laundry, +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) +"kDs" = ( +/turf/closed/mineral/snowmountain/cavern/icemoon, +/area/icemoon/surface/outdoors/nospawn) "kDu" = ( /obj/machinery/reagentgrinder, /obj/structure/table, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) -"kDx" = ( -/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/machinery/light/dim/directional/north, +"kDv" = ( +/obj/effect/spawner/random/trash/bin, /turf/open/floor/plating, -/area/station/maintenance/department/crew_quarters/bar) +/area/station/maintenance/port/greater) "kDz" = ( /obj/structure/toilet{ pixel_y = 8 @@ -33424,10 +34648,6 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"kDW" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/white, -/area/mine/living_quarters) "kEj" = ( /obj/machinery/computer/libraryconsole/bookmanagement, /obj/structure/table, @@ -33444,6 +34664,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/prison/visit) +"kEo" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore) "kEq" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, @@ -33468,10 +34693,12 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) -"kFk" = ( -/obj/machinery/newscaster/directional/north, -/turf/open/floor/wood, -/area/station/command/meeting_room) +"kEY" = ( +/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/station/maintenance/port/fore) "kFu" = ( /obj/structure/table, /obj/item/stack/sheet/iron/fifty, @@ -33490,12 +34717,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) -"kFG" = ( -/obj/structure/table/wood, -/obj/machinery/microwave, -/obj/machinery/light/small/directional/south, -/turf/open/floor/stone, -/area/mine/eva/lower) "kFH" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 10 @@ -33517,21 +34738,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/mine/eva) -"kFU" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) -"kFZ" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/directional/south, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "kGc" = ( /obj/structure/table/wood, /obj/structure/cable, @@ -33553,6 +34759,29 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/lobby) +"kGF" = ( +/obj/structure/table, +/obj/item/camera_film, +/obj/item/camera, +/obj/machinery/firealarm/directional/south, +/obj/machinery/camera/directional/east{ + c_tag = "Art Storage" + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/commons/storage/art) +"kGP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/security/prison/mess) "kGQ" = ( /obj/structure/table, /obj/item/stamp/head/qm, @@ -33565,31 +34794,83 @@ /obj/item/clothing/head/costume/pirate/bandana, /turf/open/floor/iron, /area/station/maintenance/starboard/fore) +"kHj" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/kirbyplants/random/fullysynthetic{ + pixel_x = -8; + pixel_y = 21 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/stone, +/area/mine/eva/lower) "kHk" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 8 }, /turf/open/floor/carpet, /area/station/service/theater) +"kHl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "kHn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/showroomfloor, /area/station/security/prison/toilet) +"kHq" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/status_display/shuttle{ + pixel_x = -32; + shuttle_id = "arrival" + }, +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/iron/white/corner{ + dir = 8 + }, +/area/station/hallway/secondary/entry) "kHr" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmos/project) -"kHu" = ( -/obj/machinery/firealarm/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, +"kHI" = ( +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/blue, /turf/open/floor/iron, -/area/station/hallway/primary/port) +/area/station/hallway/primary/starboard) +"kHL" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/cafeteria, +/area/station/security/prison/mess) "kHN" = ( /obj/machinery/firealarm/directional/north, /turf/open/openspace, /area/station/science/xenobiology) +"kHP" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/railing{ + 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/white/corner{ + dir = 1 + }, +/area/station/hallway/secondary/entry) "kHU" = ( /obj/structure/table, /obj/item/stack/sheet/iron/fifty, @@ -33608,6 +34889,18 @@ /obj/structure/flora/bush/jungle/a/style_random, /turf/open/floor/grass, /area/station/service/hydroponics) +"kIh" = ( +/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/landmark/start/hangover, +/obj/structure/cable, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/hallway/secondary/entry) "kIi" = ( /obj/machinery/door/airlock{ name = "Perma Overlook Entrance" @@ -33645,6 +34938,17 @@ /obj/machinery/space_heater, /turf/open/floor/iron/smooth_large, /area/station/cargo/warehouse) +"kIU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/mine/eva) "kIX" = ( /obj/structure/fence/corner{ dir = 6 @@ -33695,26 +34999,18 @@ /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "kJO" = ( -/obj/structure/table, -/obj/item/storage/box/firingpins, -/obj/item/storage/box/firingpins, -/obj/item/key/security, -/obj/machinery/light/directional/east, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory/upper) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced/tinted, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "kJP" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 }, /turf/open/floor/iron, /area/station/command/bridge) -"kJQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/station/service/lawoffice) "kJU" = ( /obj/structure/girder, /turf/open/floor/iron/dark, @@ -33744,6 +35040,7 @@ /obj/item/mod/module/plasma_stabilizer, /obj/item/mod/module/thermal_regulator, /obj/effect/turf_decal/tile/blue/full, +/obj/item/mod/module/signlang_radio, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/storage) "kKa" = ( @@ -33753,14 +35050,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"kKe" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/effect/spawner/random/structure/steam_vent, -/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/greater) "kKl" = ( /obj/structure/table/glass, /obj/item/plant_analyzer, @@ -33783,44 +35072,20 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) -"kKE" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/computer/mech_bay_power_console{ - dir = 8 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/mine/mechbay) "kKH" = ( /obj/item/radio/intercom/directional/south, /obj/effect/turf_decal/tile/yellow/half/contrasted, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"kKI" = ( -/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/table, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/robotics/lab) "kKL" = ( /turf/closed/wall, /area/station/maintenance/starboard/fore) +"kKU" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "kKX" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/blue{ @@ -33876,23 +35141,6 @@ /obj/effect/mapping_helpers/airlock/access/all/science/xenobio, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"kLH" = ( -/obj/structure/chair/stool/directional/south, -/obj/machinery/flasher/directional/west{ - id = "GulagCell 3" - }, -/obj/structure/sign/poster/official/obey/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"kLI" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "kLZ" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -33906,15 +35154,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"kMu" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) "kMv" = ( /obj/effect/turf_decal/trimline/yellow/filled/shrink_cw{ dir = 4 @@ -33929,19 +35168,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/freezer, /area/station/commons/toilet) -"kMF" = ( -/obj/effect/turf_decal/box, -/obj/structure/closet/crate, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/iron/dark, -/area/station/maintenance/port/greater) -"kMM" = ( -/turf/open/floor/iron/grimy, -/area/station/hallway/secondary/entry) "kMN" = ( /obj/machinery/space_heater, /turf/open/floor/plating, /area/station/maintenance/department/chapel) +"kMP" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/rack, +/obj/item/storage/backpack/satchel/leather/withwallet, +/obj/item/toy/figure/assistant, +/obj/structure/sign/calendar/directional/west, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/dorms/laundry) "kMY" = ( /obj/effect/turf_decal/siding/yellow{ dir = 6 @@ -33983,6 +35224,13 @@ /obj/structure/cable, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) +"kNz" = ( +/obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore) "kNA" = ( /obj/structure/disposalpipe/segment, /obj/structure/girder, @@ -34027,6 +35275,17 @@ }, /turf/open/floor/iron, /area/station/security/brig/upper) +"kOB" = ( +/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, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/commons/fitness) "kOF" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor, @@ -34093,6 +35352,11 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"kPq" = ( +/obj/effect/spawner/random/structure/steam_vent, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "kPv" = ( /obj/machinery/vending/cigarette, /turf/open/floor/wood, @@ -34101,6 +35365,15 @@ /obj/structure/flora/bush/flowers_yw/style_random, /turf/open/floor/grass, /area/station/maintenance/starboard/aft) +"kPy" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) "kPL" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, @@ -34115,6 +35388,11 @@ }, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) +"kPS" = ( +/obj/structure/railing, +/obj/structure/marker_beacon/cerulean, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "kQc" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -34163,11 +35441,21 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/station/maintenance/fore) +"kQJ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/machinery/light/cold/directional/south, +/obj/structure/sign/warning/bodysposal/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) "kQL" = ( -/obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, +/obj/structure/chair, +/obj/effect/landmark/start/shaft_miner, /turf/open/floor/iron, -/area/station/cargo/miningdock) +/area/station/cargo/storage) "kQM" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 5 @@ -34181,12 +35469,13 @@ /obj/item/pipe_dispenser, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"kQS" = ( -/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/port) +"kQV" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/random/maintenance/three, +/obj/structure/sign/departments/maint/directional/west, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "kQW" = ( /obj/structure/closet/crate/hydroponics, /obj/item/shovel/spade, @@ -34223,25 +35512,24 @@ }, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) +"kRc" = ( +/obj/machinery/light/directional/west, +/obj/structure/closet/wardrobe/grey, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/status_display/ai/directional/west, +/turf/open/floor/iron, +/area/station/commons/locker) "kRd" = ( /obj/structure/bookcase, /turf/open/floor/iron, /area/mine/laborcamp) -"kRm" = ( -/obj/machinery/light/directional/north, -/obj/structure/cable, -/obj/item/radio/intercom/prison/directional/north, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/prison/garden) "kRr" = ( /obj/machinery/door/airlock/engineering{ name = "Port Quarter Solar Access" }, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) "kRw" = ( @@ -34290,6 +35578,18 @@ }, /turf/open/floor/iron, /area/station/science/xenobiology) +"kRJ" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Atmospherics Distribution Loop" + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Distro to Waste" + }, +/obj/effect/turf_decal/siding/wideplating, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "kRP" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/medical/central) @@ -34301,16 +35601,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/cargo/office) -"kSh" = ( -/obj/machinery/conveyor/inverted{ - dir = 5; - id = "garbage" - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "kSn" = ( /obj/structure/cable/multilayer/multiz, /obj/effect/turf_decal/stripes/line, @@ -34326,6 +35616,10 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) +"kSv" = ( +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron, +/area/mine/laborcamp/security) "kSw" = ( /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, @@ -34361,6 +35655,12 @@ "kTz" = ( /turf/open/floor/iron/smooth_half, /area/station/security/brig/upper) +"kTC" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/large, +/area/station/hallway/primary/port) "kTD" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -34368,6 +35668,13 @@ /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron/dark/side, /area/mine/eva) +"kTF" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/steam_vent, +/turf/open/floor/plating, +/area/mine/eva/lower) "kTO" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/tile/blue, @@ -34389,6 +35696,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/lobby) +"kTX" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/plastic, +/area/station/commons/dorms/laundry) "kUb" = ( /obj/effect/turf_decal/stripes/red/line{ dir = 8 @@ -34396,6 +35709,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/fore/lesser) +"kUn" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "kUu" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ dir = 4 @@ -34416,6 +35740,8 @@ /area/mine/eva) "kUG" = ( /obj/item/trash/popcorn, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/plating, /area/station/maintenance/fore) "kUJ" = ( @@ -34434,6 +35760,19 @@ /obj/structure/railing/corner, /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) +"kUU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/spawner/random/structure/steam_vent, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/smooth, +/area/station/maintenance/port/lesser) +"kVl" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/cargo/storage) "kVx" = ( /obj/structure/cable/multilayer/multiz, /obj/effect/turf_decal/stripes/line, @@ -34452,6 +35791,13 @@ /obj/effect/spawner/random/structure/table_fancy, /turf/open/floor/wood, /area/station/service/library) +"kVF" = ( +/obj/structure/closet/secure_closet/courtroom, +/obj/item/gavelhammer, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/security/courtroom) "kVM" = ( /obj/structure/chair/sofa/corp/right{ dir = 1 @@ -34459,6 +35805,12 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/engineering/lobby) +"kVW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) "kWa" = ( /obj/structure/fireplace, /turf/open/floor/plating, @@ -34528,7 +35880,7 @@ /turf/open/floor/iron/dark/textured_edge{ dir = 8 }, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) "kWN" = ( /obj/structure/disposalpipe/sorting/mail/flip{ dir = 8 @@ -34606,6 +35958,21 @@ "kXA" = ( /turf/open/floor/iron, /area/station/cargo/office) +"kXB" = ( +/obj/structure/table, +/obj/item/pai_card, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/station/commons/locker) +"kXD" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/corner{ + dir = 8 + }, +/turf/open/floor/iron/large, +/area/station/hallway/secondary/entry) "kXE" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, @@ -34616,16 +35983,11 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "kXI" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, /turf/open/floor/plating/icemoon, /area/icemoon/surface/outdoors/nospawn) -"kXL" = ( -/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/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron/dark/side, -/area/mine/eva/lower) "kXM" = ( /obj/structure/closet/secure_closet/security/med, /obj/machinery/firealarm/directional/south, @@ -34650,12 +36012,6 @@ /obj/machinery/meter/layer4, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"kYh" = ( -/obj/machinery/vending/wardrobe/sec_wardrobe, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/engineering) "kYi" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 5 @@ -34681,9 +36037,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"kYA" = ( -/turf/open/floor/circuit, -/area/mine/living_quarters) "kYF" = ( /obj/structure/light_construct/directional/west, /mob/living/simple_animal/hostile/retaliate/goose/vomit, @@ -34699,15 +36052,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/large, /area/station/engineering/engine_smes) -"kYQ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white/corner, -/area/station/hallway/secondary/entry) "kZa" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -34732,10 +36076,6 @@ /obj/effect/landmark/start/clown, /turf/open/floor/wood/tile, /area/station/service/theater) -"kZd" = ( -/obj/machinery/light/directional/north, -/turf/open/openspace, -/area/station/science/xenobiology) "kZh" = ( /obj/structure/cable, /obj/structure/sign/poster/contraband/random/directional/west, @@ -34745,6 +36085,11 @@ /obj/machinery/space_heater, /turf/open/floor/iron/dark/textured, /area/station/security/prison) +"kZn" = ( +/obj/structure/cable, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/security/prison/rec) "kZt" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -34754,6 +36099,14 @@ "kZu" = ( /turf/closed/wall, /area/mine/production) +"kZw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "kZz" = ( /obj/machinery/computer/order_console/cook{ dir = 1 @@ -34775,13 +36128,13 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/vault, /area/station/security/prison/rec) -"kZQ" = ( -/obj/structure/rack, -/obj/item/pickaxe, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/clothing/mask/breath, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) +"laa" = ( +/obj/machinery/atmospherics/components/tank, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/science/ordnance) "lab" = ( /obj/machinery/door/window/brigdoor/left/directional/north{ name = "Secure Weapons Storage"; @@ -34819,6 +36172,10 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/smooth, /area/station/security/processing) +"laB" = ( +/obj/effect/spawner/random/engineering/atmospherics_portable, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "laD" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -34832,14 +36189,6 @@ }, /turf/open/floor/iron, /area/station/service/janitor) -"laN" = ( -/obj/structure/sign/poster/official/work_for_a_future/directional/north, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/prison/visit) "laP" = ( /obj/machinery/door/airlock/public/glass{ name = "Canteen" @@ -34847,16 +36196,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/textured_half, /area/station/hallway/primary/starboard) -"laQ" = ( -/obj/effect/turf_decal/siding/white{ - dir = 6 - }, -/obj/machinery/duct, -/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/white/smooth_large, -/area/station/service/kitchen/diner) "laV" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 @@ -34904,17 +36243,6 @@ /obj/structure/sign/warning/fire/directional/north, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"lbC" = ( -/obj/machinery/firealarm/directional/south, -/obj/machinery/camera{ - c_tag = "Medbay Stasis Center North"; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "lca" = ( /obj/structure/railing/corner{ dir = 1 @@ -34951,20 +36279,9 @@ /obj/structure/table/wood, /turf/open/floor/carpet, /area/station/commons/dorms) -"lcG" = ( -/obj/structure/rack, -/obj/item/crowbar, -/obj/item/pickaxe, -/obj/machinery/light/dim/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "lcY" = ( -/obj/machinery/door/window{ - dir = 1; - name = "Station Communications Relay" - }, /obj/structure/sign/poster/official/random/directional/west, -/turf/open/floor/circuit/green, +/turf/open/floor/iron/dark, /area/mine/mechbay) "ldi" = ( /obj/structure/table, @@ -34981,6 +36298,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"ldw" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "ldz" = ( /obj/structure/rack, /obj/item/reagent_containers/dropper, @@ -35036,9 +36360,23 @@ /area/station/science/xenobiology) "lei" = ( /obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) +"lek" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "packageSort2" + }, +/obj/machinery/requests_console/directional/west{ + department = "Cargo Bay"; + name = "Cargo Bay Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) "let" = ( /obj/machinery/duct, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -35054,12 +36392,6 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"leI" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/commons/locker) "leM" = ( /obj/structure/railing{ dir = 8 @@ -35069,6 +36401,11 @@ }, /turf/open/floor/glass/reinforced, /area/station/hallway/primary/starboard) +"leW" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/cargo/storage) "lfp" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, @@ -35120,18 +36457,18 @@ }, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) +"lge" = ( +/obj/structure/sign/poster/contraband/random/directional/east, +/obj/machinery/light/small/dim/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "lgk" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 4 }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"lgr" = ( -/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/station/maintenance/port/greater) "lgz" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -35158,6 +36495,11 @@ }, /turf/open/floor/iron/textured, /area/station/security/brig) +"lgH" = ( +/obj/structure/flora/tree/pine/style_random, +/obj/structure/marker_beacon/cerulean, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "lgK" = ( /turf/closed/wall, /area/station/security/prison/visit) @@ -35188,6 +36530,14 @@ }, /turf/open/floor/plating/icemoon, /area/station/science/ordnance/bomb) +"lhu" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Xenobiology Lab Access"; + network = list("ss13","rd","xeno") + }, +/obj/machinery/light/small/directional/north, +/turf/open/openspace, +/area/station/science/xenobiology) "lhv" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -35213,39 +36563,11 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) -"lim" = ( -/obj/machinery/conveyor{ - dir = 4; - id = "garbage" - }, -/obj/machinery/light/small/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, +"lil" = ( +/obj/structure/cable, +/obj/structure/sign/poster/random/directional/west, /turf/open/floor/plating, -/area/station/maintenance/disposal) -"lio" = ( -/obj/machinery/light/directional/west, -/obj/structure/table/glass, -/obj/item/assembly/signaler{ - pixel_x = 6; - pixel_y = 5 - }, -/obj/item/reagent_containers/dropper{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/stock_parts/cell/high, -/obj/item/stack/cable_coil, -/obj/item/pen{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/iron/cafeteria{ - dir = 8 - }, -/area/station/science/research) +/area/station/maintenance/port/fore) "lis" = ( /obj/structure/closet/secure_closet/miner, /turf/open/floor/iron, @@ -35290,20 +36612,12 @@ dir = 1 }, /area/station/hallway/secondary/exit/departure_lounge) -"liQ" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp, -/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/commons/vacant_room/office) -"liW" = ( +"liS" = ( +/obj/structure/closet/crate/coffin, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/obj/item/toy/figure/chaplain, +/turf/open/floor/plating, +/area/station/maintenance/department/chapel) "ljj" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -35332,6 +36646,13 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron, /area/station/hallway/primary/central) +"ljx" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L1" + }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "ljz" = ( /obj/structure/closet/crate, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -35341,15 +36662,43 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/smooth_large, /area/station/cargo/warehouse) +"ljD" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"ljE" = ( +/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/stripes/white/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/line, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark/textured, +/area/station/commons/locker) "ljF" = ( /obj/effect/turf_decal/siding/purple{ dir = 8 }, /turf/open/floor/iron/white, /area/station/science/lab) +"ljK" = ( +/obj/structure/disposalpipe/trunk/multiz/down{ + dir = 4 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/port/greater) "ljL" = ( /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) +"ljP" = ( +/obj/machinery/space_heater, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/mine/eva/lower) "ljT" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -35357,6 +36706,7 @@ }, /obj/effect/landmark/navigate_destination, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron/textured, /area/station/commons/storage/primary) "lka" = ( @@ -35418,13 +36768,6 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron, /area/station/command/bridge) -"lkP" = ( -/obj/structure/flora/grass/green/style_random, -/mob/living/simple_animal/pet/penguin/emperor{ - name = "Club" - }, -/turf/open/misc/asteroid/snow/standard_air, -/area/station/science/research) "lkS" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/food/pie_smudge, @@ -35453,16 +36796,16 @@ "lli" = ( /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"llv" = ( -/obj/machinery/light_switch/directional/north, -/obj/structure/sign/poster/official/help_others/directional/west, -/turf/open/floor/iron/checker, -/area/station/commons/storage/emergency/port) "llw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"llC" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) "llD" = ( /obj/structure/table/wood, /obj/item/paper_bin/carbon, @@ -35472,13 +36815,17 @@ }, /turf/open/floor/iron/white, /area/station/medical/psychology) -"llR" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/effect/turf_decal/bot, -/obj/machinery/light/directional/north, -/obj/structure/sign/poster/contraband/atmosia_independence/directional/north, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/atmos/storage/gas) +"llG" = ( +/obj/effect/turf_decal/siding/white{ + dir = 6 + }, +/obj/machinery/duct, +/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/firealarm/directional/east, +/turf/open/floor/iron/white/smooth_large, +/area/station/service/kitchen/diner) "llT" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 1 @@ -35520,11 +36867,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"lmo" = ( -/obj/structure/bed/dogbed/renault, -/mob/living/simple_animal/pet/fox/renault, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain) "lms" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, @@ -35541,6 +36883,13 @@ }, /turf/open/floor/iron/dark, /area/station/cargo/office) +"lmy" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 5 + }, +/obj/machinery/igniter/incinerator_atmos, +/turf/open/floor/engine/vacuum, +/area/station/maintenance/disposal/incinerator) "lmA" = ( /obj/effect/turf_decal/trimline/dark_green/corner, /obj/effect/decal/cleanable/dirt, @@ -35559,13 +36908,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/mine/laborcamp) -"lmM" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/cmo) "lmY" = ( /obj/machinery/newscaster/directional/west, /obj/machinery/camera{ @@ -35586,12 +36928,21 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/commons/storage/tools) +"lnd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "lnk" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, /turf/open/floor/carpet, /area/station/command/meeting_room) +"lnp" = ( +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/grimy, +/area/station/hallway/secondary/entry) "lnq" = ( /obj/effect/turf_decal/siding/white{ dir = 8 @@ -35634,8 +36985,19 @@ /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, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) +"lnL" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/large, +/area/station/hallway/secondary/entry) "lnY" = ( /obj/structure/table/glass, /obj/structure/bedsheetbin, @@ -35685,16 +37047,13 @@ /obj/item/screwdriver, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/cmo) -"loI" = ( -/obj/structure/cable, -/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/wood/large, -/area/station/command/heads_quarters/hos) "loQ" = ( /obj/effect/turf_decal/trimline/green/filled/corner, /obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) "loV" = ( @@ -35710,12 +37069,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"loW" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "lpj" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -35736,14 +37089,31 @@ /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) "lpH" = ( -/obj/effect/turf_decal/tile/yellow/half/contrasted{ +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ dir = 8 }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) +/obj/item/kirbyplants/random, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/entry) +"lpL" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/department/chapel) "lpM" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/captain) +"lpS" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/machinery/light/directional/north, +/turf/open/floor/wood, +/area/station/service/lawoffice) "lpW" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating, @@ -35778,13 +37148,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"lqv" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "lqz" = ( /obj/structure/cable, /turf/closed/wall, @@ -35825,31 +37188,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"lqH" = ( -/obj/machinery/computer/records/security, -/obj/machinery/requests_console/directional/north{ - department = "Security"; - name = "Security Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs/auxiliary) -"lqL" = ( -/obj/structure/closet/crate, -/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/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/science/explab) +"lqP" = ( +/obj/effect/decal/cleanable/insectguts, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "lqU" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -35869,17 +37214,6 @@ /obj/effect/mapping_helpers/mail_sorting/medbay/cmo_office, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"lrw" = ( -/obj/effect/turf_decal/siding/wideplating_new/light, -/obj/item/trash/bee, -/obj/machinery/light/directional/west, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/sign/poster/official/moth_piping/directional/west, -/turf/open/floor/iron/showroomfloor, -/area/station/security/prison/work) "lry" = ( /obj/structure/table, /obj/item/storage/box/bodybags{ @@ -35891,6 +37225,11 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) +"lrz" = ( +/obj/effect/spawner/random/structure/crate, +/obj/effect/spawner/random/trash/janitor_supplies, +/turf/open/floor/iron/smooth, +/area/station/maintenance/port/lesser) "lrD" = ( /obj/machinery/shower/directional/north, /obj/item/soap/deluxe, @@ -35898,10 +37237,6 @@ /obj/structure/curtain, /turf/open/floor/iron/freezer, /area/station/command/heads_quarters/captain) -"lrL" = ( -/obj/machinery/barsign/all_access/directional/south, -/turf/open/floor/wood/parquet, -/area/station/commons/lounge) "lrN" = ( /obj/effect/landmark/start/hangover, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -35917,12 +37252,15 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/science/robotics/lab) -"lsh" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ - dir = 8 +"lsi" = ( +/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 }, -/area/station/maintenance/port/fore) +/turf/open/floor/iron, +/area/station/hallway/primary/port) "lso" = ( /turf/open/floor/iron, /area/station/hallway/primary/starboard) @@ -35942,13 +37280,18 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/service) -"ltj" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/trimline/purple/filled/corner{ +"lti" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 8 }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) +/obj/machinery/requests_console/directional/west{ + department = "Mining"; + name = "Mining Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "ltk" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -35957,28 +37300,18 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/external, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"ltl" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/landmark/start/bitrunner, +/obj/machinery/light/small/directional/south, +/obj/effect/decal/cleanable/robot_debris, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "lts" = ( /obj/structure/extinguisher_cabinet/directional/south, /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"lty" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"ltz" = ( -/obj/structure/table, -/obj/item/clothing/gloves/latex, -/obj/item/surgical_drapes, -/obj/item/razor, -/obj/machinery/status_display/evac/directional/west, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) "ltE" = ( /obj/structure/closet/crate/freezer, /obj/item/reagent_containers/blood/random, @@ -35991,35 +37324,19 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/commons/fitness) +"ltW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "lub" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/project) -"lui" = ( -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/structure/cable, -/obj/structure/table, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/grenade/chem_grenade/smart_metal_foam, -/obj/item/grenade/chem_grenade/smart_metal_foam, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/engine_smes) -"lun" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/mine/eva/lower) "lup" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 8 @@ -36047,6 +37364,10 @@ /turf/open/floor/iron/white/side, /area/station/science/ordnance/office) "luK" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) "lva" = ( @@ -36069,6 +37390,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/fitness) +"lvm" = ( +/obj/machinery/camera/motion/directional/north{ + c_tag = "EVA Storage North" + }, +/obj/structure/sign/warning/secure_area/directional/north, +/obj/structure/tank_dispenser/oxygen, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/iron/dark/smooth_half{ + dir = 1 + }, +/area/station/ai_monitored/command/storage/eva) "lvt" = ( /turf/open/openspace/icemoon, /area/icemoon/underground/explored) @@ -36087,14 +37419,6 @@ dir = 1 }, /area/station/hallway/secondary/service) -"lvv" = ( -/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/commons/vacant_room/office) "lvB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -36142,6 +37466,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/mine/eva) +"lvW" = ( +/obj/structure/table, +/obj/effect/spawner/random/trash/food_packaging, +/obj/effect/spawner/random/trash/food_packaging, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/radio/intercom/directional/north, +/obj/item/radio/intercom/directional/north, +/obj/item/newspaper, +/obj/machinery/camera/directional/north{ + c_tag = "Arrivals Lobby North" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "lvY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -36181,6 +37518,12 @@ "lwR" = ( /turf/closed/wall/r_wall, /area/mine/living_quarters) +"lwT" = ( +/obj/machinery/mechpad, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/textured, +/area/mine/mechbay) "lxb" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -36289,6 +37632,19 @@ dir = 1 }, /area/station/security/office) +"lyq" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/bot, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/atmos/storage/gas) +"lyu" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lantern, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/stone, +/area/mine/eva/lower) "lyw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -36307,6 +37663,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible/layer2, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) +"lyW" = ( +/obj/structure/chair/sofa/corp/left, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/wood, +/area/station/hallway/secondary/service) "lyX" = ( /obj/structure/chair{ dir = 4 @@ -36366,24 +37727,19 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"lzV" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/table, -/obj/item/clothing/head/utility/welding{ - pixel_x = 4; - pixel_y = 5 - }, -/obj/item/clothing/head/utility/welding{ - pixel_x = 2; - pixel_y = 3 +"lzO" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/junction/flip{ + dir = 4 }, -/obj/item/clothing/head/utility/welding, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/sign/poster/official/safety_internals/directional/east, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"lzX" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/white, +/area/station/medical/virology) "lAc" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -36393,13 +37749,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured, /area/station/medical/chemistry) -"lAr" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "lAu" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -36419,6 +37768,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) +"lAB" = ( +/obj/structure/rack, +/obj/item/crowbar, +/obj/item/pickaxe, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) "lAC" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -36465,6 +37820,11 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"lBy" = ( +/obj/effect/turf_decal/siding/white, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/white/smooth_large, +/area/station/service/kitchen/diner) "lBD" = ( /obj/structure/flora/grass/green/style_random, /turf/open/misc/asteroid/snow/icemoon, @@ -36476,22 +37836,6 @@ /obj/structure/grille/broken, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"lBT" = ( -/obj/machinery/light/directional/north, -/obj/item/radio/intercom/prison/directional/north, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark/textured_edge, -/area/station/security/prison) -"lBX" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/table, -/obj/item/storage/box/bodybags, -/obj/item/pen, -/obj/item/clothing/mask/breath/medical, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) "lBZ" = ( /obj/machinery/door/window/left/directional/north{ base_state = "right"; @@ -36610,6 +37954,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"lDp" = ( +/obj/machinery/duct, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/service/bar/backroom) "lDq" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -36635,6 +37985,13 @@ }, /turf/open/floor/iron, /area/mine/laborcamp) +"lDE" = ( +/obj/structure/sign/poster/official/safety_report/directional/north, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/prison/visit) "lDF" = ( /obj/structure/table, /obj/item/wrench, @@ -36650,6 +38007,19 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/medical/cryo) +"lDX" = ( +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "lEa" = ( /obj/structure/chair/sofa/corner/brown, /obj/structure/cable, @@ -36758,6 +38128,10 @@ /obj/structure/bookcase/random/adult, /turf/open/floor/iron/dark/textured, /area/station/security/prison/safe) +"lFg" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/large, +/area/station/hallway/secondary/entry) "lFp" = ( /obj/structure/railing{ dir = 10 @@ -36771,16 +38145,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"lFr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 +"lFA" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 }, -/obj/structure/sign/poster/contraband/random/directional/north, +/obj/machinery/light/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/half/contrasted, /obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal) "lFL" = ( /obj/effect/turf_decal/trimline/red/warning, /obj/effect/turf_decal/stripes/red/line, @@ -36792,18 +38166,29 @@ dir = 8 }, /area/station/command/heads_quarters/rd) -"lGj" = ( -/obj/structure/table/glass, -/obj/machinery/reagentgrinder{ - pixel_y = 8 +"lGd" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 }, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 6 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"lGh" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 }, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/machinery/light/directional/south, +/obj/effect/turf_decal/trimline/yellow/filled/warning, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/light/directional/east, /turf/open/floor/iron/white, -/area/station/medical/virology) +/area/station/medical/treatment_center) +"lGo" = ( +/obj/machinery/hydroponics/soil, +/obj/structure/sign/poster/contraband/kudzu/directional/east, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden) "lGp" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -36840,6 +38225,19 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/interrogation) +"lGL" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Arrivals Hallway South" + }, +/obj/machinery/newscaster/directional/west, +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/hallway/secondary/entry) "lGY" = ( /obj/structure/chair/stool/directional/south, /obj/effect/landmark/start/hangover, @@ -36892,6 +38290,10 @@ /obj/structure/sink/directional/west, /obj/structure/mirror/directional/east, /obj/machinery/light/small/directional/north, +/obj/item/razor{ + pixel_x = 8; + pixel_y = 8 + }, /turf/open/floor/iron/freezer, /area/station/command/heads_quarters/captain) "lIs" = ( @@ -36912,14 +38314,6 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"lIH" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/maintenance/port/fore) "lII" = ( /obj/machinery/door/airlock/engineering{ name = "Telecommunications" @@ -36955,13 +38349,32 @@ /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron/dark/side, /area/mine/eva/lower) +"lIT" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/firealarm/directional/north, +/obj/structure/cable, +/turf/open/floor/iron/cafeteria{ + dir = 8 + }, +/area/station/hallway/secondary/entry) +"lIU" = ( +/obj/machinery/light/small/directional/west, +/obj/structure/table, +/obj/structure/bedsheetbin, +/obj/structure/sign/clock/directional/west, +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/dorms/laundry) "lIW" = ( /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat_interior) -"lJj" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating/icemoon, -/area/station/hallway/secondary/entry) "lJO" = ( /turf/closed/wall, /area/station/maintenance/port/fore) @@ -36972,6 +38385,15 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/prison) +"lKc" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) "lKk" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -36995,13 +38417,6 @@ /obj/structure/closet/radiation, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) -"lKF" = ( -/obj/machinery/bluespace_vendor/directional/north, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "lKZ" = ( /obj/structure/railing/corner{ dir = 8 @@ -37016,6 +38431,19 @@ /obj/item/storage/dice, /turf/open/floor/iron, /area/station/commons/dorms) +"lLl" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "lLm" = ( /turf/open/floor/iron/cafeteria, /area/station/maintenance/port/aft) @@ -37028,15 +38456,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/recharge_floor, /area/mine/mechbay) -"lMa" = ( -/obj/machinery/light/dim/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"lMg" = ( +/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, -/obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "lMh" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/engine/o2, @@ -37076,10 +38503,23 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/mine/mechbay) +"lNc" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "lNi" = ( /obj/effect/spawner/random/trash/moisture_trap, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"lNj" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "lNk" = ( /obj/structure/sign/painting/library{ pixel_y = -32 @@ -37089,23 +38529,6 @@ }, /turf/open/floor/wood, /area/station/service/library) -"lNn" = ( -/obj/machinery/bluespace_vendor/directional/north, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark/textured_edge, -/area/station/security/prison) -"lNo" = ( -/obj/machinery/light/directional/east, -/obj/machinery/button/door/directional/east{ - id = "xenobio6"; - layer = 4; - name = "Xenobio Pen 6 Blast DOors"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "lNy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -37125,6 +38548,12 @@ /obj/structure/cable/layer3, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) +"lNE" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "lNG" = ( /obj/machinery/door/airlock/security/glass{ name = "Security Office" @@ -37162,28 +38591,19 @@ }, /turf/open/floor/iron/dark, /area/station/commons/storage/primary) -"lOg" = ( -/obj/machinery/conveyor{ - dir = 4; - id = "garbage" +"lOq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, +/obj/machinery/light/small/dim/directional/east, /turf/open/floor/plating, -/area/station/maintenance/disposal) +/area/station/maintenance/starboard/aft) "lOt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/window/left/directional/east, /obj/structure/sign/warning/gas_mask/directional/north, /turf/open/floor/plating/snowed/coldroom, /area/station/service/kitchen/coldroom) -"lOx" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/mine/eva) "lOz" = ( /obj/machinery/door/airlock{ id_tag = "Dorm2"; @@ -37200,6 +38620,20 @@ /obj/machinery/atmospherics/pipe/smart/simple/orange/visible, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) +"lOP" = ( +/obj/structure/table, +/obj/item/paper, +/obj/item/pen, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/directional/west{ + c_tag = "Labor Camp Cell 1"; + network = list("labor") + }, +/obj/machinery/flasher/directional/west{ + id = "GulagCell 1" + }, +/turf/open/floor/iron, +/area/mine/laborcamp) "lOU" = ( /obj/machinery/recharge_station, /obj/effect/decal/cleanable/dirt, @@ -37335,6 +38769,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/atmos) +"lQG" = ( +/obj/structure/table/glass, +/obj/item/flashlight/lamp, +/obj/effect/turf_decal/tile/blue/full, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/heads_quarters/cmo) "lQN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /obj/structure/cable, @@ -37345,6 +38786,13 @@ /obj/structure/mineral_door/wood, /turf/open/floor/wood, /area/station/maintenance/space_hut/cabin) +"lQV" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/commons/fitness) "lRd" = ( /obj/structure/chair, /obj/effect/turf_decal/stripes/line{ @@ -37356,6 +38804,12 @@ /obj/machinery/teleport/station, /turf/open/floor/plating, /area/station/command/teleporter) +"lRg" = ( +/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/dark, +/area/station/hallway/secondary/entry) "lRs" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, @@ -37386,6 +38840,19 @@ }, /turf/open/floor/iron/white, /area/station/medical/storage) +"lRE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/mine/laborcamp/security) +"lRF" = ( +/obj/structure/rack, +/obj/machinery/syndicatebomb/training, +/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/smooth_half, +/area/station/security/office) "lRI" = ( /obj/machinery/door/airlock/external{ glass = 1; @@ -37432,6 +38899,14 @@ }, /turf/open/floor/iron, /area/station/commons/storage/tools) +"lSl" = ( +/obj/structure/chair/stool/bar/directional/south, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/stone, +/area/station/commons/lounge) "lSu" = ( /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/surface/outdoors/nospawn) @@ -37451,17 +38926,19 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, /area/station/engineering/atmos/storage/gas) -"lSC" = ( -/obj/structure/cable, +"lSF" = ( +/obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/small/directional/north, -/obj/structure/disposalpipe/segment{ +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/line{ dir = 4 }, -/obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) +/turf/open/floor/iron/dark/textured, +/area/station/hallway/secondary/entry) "lSP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -37488,13 +38965,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/space_hut/cabin) -"lTG" = ( -/obj/machinery/portable_atmospherics/canister/anesthetic_mix, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/cryo) "lTJ" = ( /obj/structure/railing, /obj/structure/disposalpipe/segment{ @@ -37502,21 +38972,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"lTL" = ( -/obj/machinery/dna_infuser, -/obj/item/infuser_book, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"lTN" = ( -/obj/structure/table, -/obj/machinery/recharger, -/obj/machinery/light/directional/south, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/turf/open/floor/iron/smooth_edge{ - dir = 1 - }, -/area/station/security/lockers) "lUa" = ( /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 1 @@ -37538,6 +38993,14 @@ /obj/effect/turf_decal/tile/blue/full, /turf/open/floor/iron/large, /area/station/medical/medbay/lobby) +"lUf" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white/side{ + dir = 10 + }, +/area/station/science/research) "lUw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -37550,11 +39013,6 @@ /obj/structure/table/wood, /turf/open/floor/iron, /area/station/service/theater) -"lUA" = ( -/obj/machinery/light/directional/north, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron, -/area/station/cargo/storage) "lUC" = ( /turf/closed/wall, /area/station/maintenance/department/electrical) @@ -37608,6 +39066,11 @@ /obj/item/clothing/mask/surgical, /turf/open/floor/engine, /area/station/science/xenobiology) +"lVt" = ( +/obj/machinery/firealarm/directional/west, +/obj/machinery/light/floor, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "lVu" = ( /obj/machinery/power/emitter/welded{ dir = 8 @@ -37635,14 +39098,17 @@ }, /turf/open/floor/wood, /area/station/service/library) -"lVI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/generic_maintenance_landmark, -/obj/effect/landmark/blobstart, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/maintenance/port/fore) +"lVY" = ( +/obj/effect/turf_decal/siding/thinplating_new/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/white/side{ + dir = 8 + }, +/area/station/hallway/secondary/entry) "lVZ" = ( /obj/structure/table/wood, /obj/item/radio/intercom/command, @@ -37668,6 +39134,29 @@ }, /turf/open/floor/iron/smooth_half, /area/station/security/brig/upper) +"lWj" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/structure/closet/secure_closet/medical3, +/obj/item/defibrillator/loaded{ + pixel_y = 3 + }, +/obj/item/clothing/gloves/latex/nitrile, +/obj/item/clothing/gloves/latex/nitrile, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"lWy" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/mine/laborcamp) "lWI" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -37675,37 +39164,17 @@ }, /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) -"lWK" = ( -/obj/structure/chair/sofa/left/brown, -/obj/machinery/light/directional/north, -/obj/effect/landmark/start/psychologist, -/turf/open/floor/carpet/blue, -/area/station/medical/psychology) -"lWU" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white/corner{ - dir = 1 - }, -/area/station/hallway/secondary/entry) "lXi" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"lXj" = ( -/obj/structure/table, -/obj/item/rcl/pre_loaded, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms/laundry) "lXm" = ( /obj/item/trash/pistachios, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, /turf/open/floor/plating, /area/station/maintenance/aft/greater) "lXn" = ( @@ -37747,15 +39216,6 @@ dir = 8 }, /area/station/security/brig/entrance) -"lYJ" = ( -/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/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "lYR" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -37772,6 +39232,13 @@ /obj/structure/closet/chefcloset, /turf/open/floor/plating, /area/station/service/kitchen/coldroom) +"lZe" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "lZi" = ( /obj/structure/railing, /turf/open/floor/iron, @@ -37800,6 +39267,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/cargo/office) +"lZU" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/maintenance/port/fore) "lZX" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -37852,12 +39324,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/cargo/storage) -"maU" = ( -/obj/machinery/light/directional/south, -/obj/structure/sign/warning/chem_diamond/directional/south, -/obj/effect/turf_decal/trimline/yellow/filled/line, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "maY" = ( /obj/item/wrench, /obj/item/weldingtool, @@ -37868,6 +39334,25 @@ /obj/structure/rack, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) +"mbb" = ( +/obj/structure/cable, +/obj/machinery/button/door/directional/west{ + id = "xenobio1"; + layer = 4; + name = "Xenobio Pen 1 Blast Door"; + req_access = list("xenobiology") + }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/science/xenobiology) +"mbk" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "mbn" = ( /obj/machinery/light/directional/north, /obj/structure/chair, @@ -37902,7 +39387,7 @@ /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 1 }, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) @@ -37929,19 +39414,6 @@ /obj/structure/sign/warning/electric_shock, /turf/closed/wall/r_wall, /area/station/maintenance/starboard/aft) -"mbV" = ( -/obj/structure/table, -/obj/item/stack/spacecash/c10, -/obj/item/stack/spacecash/c1{ - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/maintenance/port/fore) "mbZ" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/machinery/door/airlock/security{ @@ -37960,18 +39432,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/plating, /area/station/engineering/storage_shared) -"mcl" = ( -/obj/machinery/light/directional/north, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/structure/table, -/obj/item/pai_card, -/obj/item/taperecorder{ - pixel_x = -3; - pixel_y = 2 - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/rd) "mco" = ( /obj/structure/closet/emcloset, /turf/open/floor/plating, @@ -38008,14 +39468,13 @@ "mcW" = ( /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"mcX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/maintenance/port/fore) -"mde" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/hidden, -/turf/closed/wall, -/area/station/maintenance/port/fore) +"mdl" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/structure/closet/crate/mod, +/turf/open/floor/iron/white, +/area/station/science/robotics/lab) "mdo" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -38074,19 +39533,13 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/supply) +"mdV" = ( +/obj/structure/sign/warning/electric_shock/directional/west, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) "mdZ" = ( /turf/closed/wall, /area/station/hallway/secondary/service) -"meg" = ( -/obj/machinery/modular_computer/console/preset/cargochat/science{ - dir = 1 - }, -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/brown/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/lab) "men" = ( /obj/machinery/duct, /obj/structure/disposalpipe/segment, @@ -38138,16 +39591,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"meQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock{ - name = "Unisex Showers" - }, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres, -/turf/open/floor/iron, -/area/station/maintenance/starboard/fore) "meT" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -38158,6 +39601,28 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"mfc" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/north, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/iron/dark, +/area/mine/eva/lower) +"mfe" = ( +/obj/structure/plasticflaps, +/obj/machinery/conveyor{ + dir = 8; + id = "mining_internal" + }, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/mine/production) "mfz" = ( /obj/machinery/door/airlock{ name = "Unit B" @@ -38181,27 +39646,25 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"mgb" = ( -/obj/structure/table/wood, -/obj/item/paper_bin/carbon{ - pixel_x = -3; - pixel_y = 7 +"mga" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Xenobiology Pens - Port Mid"; + network = list("ss13","rd","xeno") }, -/obj/item/reagent_containers/cup/glass/bottle/whiskey{ - pixel_x = 9; - pixel_y = 7 +/turf/open/floor/engine, +/area/station/science/xenobiology) +"mgc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/item/hand_labeler{ - pixel_x = -6; - pixel_y = -6 +/obj/structure/chair/sofa/bench/right, +/obj/effect/turf_decal/tile/blue{ + dir = 1 }, -/obj/machinery/airalarm/directional/south, -/obj/item/lighter{ - pixel_x = 8; - pixel_y = -9 +/turf/open/floor/iron/white/corner{ + dir = 4 }, -/turf/open/floor/carpet, -/area/station/security/detectives_office) +/area/station/hallway/secondary/entry) "mgj" = ( /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron, @@ -38282,20 +39745,12 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/iron, /area/station/maintenance/starboard/upper) -"mhr" = ( -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "mhx" = ( /obj/effect/turf_decal/bot, /obj/effect/landmark/secequipment, /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/dark/textured_half, /area/station/security/office) -"mhK" = ( -/obj/structure/sign/warning/docking, -/turf/closed/wall, -/area/station/maintenance/port/greater) "mhQ" = ( /turf/closed/wall/r_wall, /area/station/command/teleporter) @@ -38306,15 +39761,6 @@ /obj/structure/flora/grass/both/style_random, /turf/open/misc/asteroid/snow/standard_air, /area/station/hallway/secondary/exit/departure_lounge) -"miq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/landmark/generic_maintenance_landmark, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/department/chapel) "miw" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -38353,13 +39799,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/engine/n2o, /area/station/engineering/atmos) -"mjj" = ( -/obj/structure/cable, -/obj/machinery/camera/directional/east{ - c_tag = "Locker Room East" - }, -/turf/open/floor/iron, -/area/station/commons/locker) "mjs" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -38385,6 +39824,19 @@ /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"mjO" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/table/reinforced, +/obj/item/clothing/glasses/science{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/clothing/glasses/science{ + pixel_x = 4; + pixel_y = -4 + }, +/turf/open/floor/iron, +/area/station/science/xenobiology) "mjQ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -38485,13 +39937,16 @@ }, /turf/open/floor/iron/white, /area/station/medical/storage) -"mlX" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/red/half/contrasted{ +"mlS" = ( +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/turf_decal/weather/snow/corner{ dir = 1 }, -/turf/open/floor/iron/dark/textured_edge, -/area/station/security/prison) +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "mmh" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -38502,6 +39957,14 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/cargo/storage) +"mmk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/light/directional/east, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "mml" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -38510,14 +39973,12 @@ /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/iron/smooth_large, /area/station/cargo/warehouse) -"mmo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) +"mmn" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/binary/pump, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "mmA" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -38539,6 +40000,15 @@ /obj/effect/turf_decal/tile/blue/full, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/aft) +"mmC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/maintenance/aft/greater) "mmR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -38563,6 +40033,13 @@ }, /turf/open/floor/iron/textured_half, /area/station/hallway/secondary/service) +"mnu" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external/glass, +/turf/open/floor/plating, +/area/station/hallway/secondary/entry) "mny" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -38576,6 +40053,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"mnE" = ( +/obj/item/vending_refill/cigarette, +/obj/structure/table/wood, +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar/backroom) "mnF" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -38636,6 +40120,13 @@ /obj/effect/decal/cleanable/blood/drip, /turf/open/floor/iron, /area/station/maintenance/starboard/fore) +"moG" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/cmo) "moJ" = ( /turf/open/floor/iron/white, /area/station/science/lab) @@ -38702,11 +40193,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/command/bridge) -"mpR" = ( -/obj/machinery/gulag_teleporter, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/showroomfloor, -/area/station/security/processing) "mpU" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -38748,30 +40234,6 @@ /obj/machinery/shower/directional/west, /turf/open/floor/iron/freezer, /area/station/commons/toilet) -"mqz" = ( -/obj/machinery/button/door/directional/east{ - id = "armory"; - name = "Armory Shutters"; - pixel_x = -9; - pixel_y = 30; - req_access = list("armory") - }, -/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/light/directional/north, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory/upper) "mqD" = ( /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/wood, @@ -38826,6 +40288,13 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/service) +"mrw" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "mry" = ( /obj/structure/table, /obj/effect/spawner/random/trash/food_packaging, @@ -38957,6 +40426,21 @@ /obj/machinery/requests_console/auto_name/directional/south, /turf/open/floor/plating, /area/station/engineering/storage/tech) +"mtm" = ( +/obj/effect/spawner/random/structure/steam_vent, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) +"mtn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/mine/eva/lower) "mts" = ( /obj/effect/turf_decal/loading_area{ dir = 4 @@ -38964,6 +40448,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/mine/laborcamp) +"mtt" = ( +/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/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/splatter, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "mtI" = ( /turf/closed/wall, /area/station/science/robotics/lab) @@ -38981,6 +40476,15 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"mua" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal) "mue" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39000,6 +40504,17 @@ }, /turf/open/floor/wood/parquet, /area/station/commons/lounge) +"mut" = ( +/obj/machinery/hydroponics/soil, +/obj/machinery/light/directional/east, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden) +"muv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/stool/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "muy" = ( /turf/open/openspace, /area/station/commons/locker) @@ -39016,6 +40531,7 @@ /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "mvl" = ( @@ -39024,6 +40540,7 @@ "mvp" = ( /obj/machinery/space_heater, /obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) "mvv" = ( @@ -39055,12 +40572,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/cmo) -"mvX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "mwh" = ( /obj/structure/table, /obj/item/storage/fancy/donut_box, @@ -39086,6 +40597,13 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/station/ai_monitored/turret_protected/aisat_interior) +"mwp" = ( +/obj/structure/disposalpipe/trunk/multiz{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/random/directional/west, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/port/lesser) "mwu" = ( /obj/structure/closet/firecloset, /obj/effect/mapping_helpers/burnt_floor, @@ -39095,16 +40613,6 @@ /obj/structure/tank_holder/extinguisher, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"mwU" = ( -/obj/effect/turf_decal/siding/wood, -/obj/item/kirbyplants/random/fullysynthetic{ - pixel_x = 10; - pixel_y = 19 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/stone, -/area/mine/eva/lower) "mxc" = ( /obj/machinery/atmospherics/components/binary/valve/digital{ dir = 4 @@ -39120,23 +40628,39 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"mxu" = ( +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron, +/area/station/commons/locker) "mxD" = ( /obj/machinery/holopad, /obj/structure/cable, /turf/open/floor/iron, /area/station/science/robotics/mechbay) -"mxG" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/warm/directional/south, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/item/gun/energy/laser/practice{ - pixel_x = 3; - pixel_y = -3 +"mxM" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Central Hallway North" }, -/obj/item/gun/energy/laser/practice, -/obj/item/clothing/ears/earmuffs, -/turf/open/floor/iron/dark/textured, -/area/station/security/range) +/obj/structure/sign/directions/supply{ + dir = 8; + pixel_y = 32 + }, +/obj/structure/sign/directions/vault{ + dir = 8; + pixel_y = 24 + }, +/obj/structure/sign/directions/command{ + pixel_y = 40 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"mxQ" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/east, +/turf/open/floor/iron/grimy, +/area/station/hallway/secondary/entry) "mye" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/disposalpipe/segment, @@ -39161,13 +40685,11 @@ }, /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/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/dark, /area/station/security/checkpoint/engineering) "myE" = ( -/obj/structure/disposalpipe/segment, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -39205,6 +40727,27 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/department/cargo) +"myU" = ( +/obj/structure/table/glass, +/obj/item/assembly/signaler{ + pixel_x = 6; + pixel_y = 5 + }, +/obj/item/reagent_containers/dropper{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/stock_parts/cell/high, +/obj/item/stack/cable_coil, +/obj/item/pen{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron/cafeteria{ + dir = 8 + }, +/area/station/science/research) "myX" = ( /obj/machinery/light/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39269,6 +40812,14 @@ dir = 8 }, /area/station/engineering/atmos/storage/gas) +"mzM" = ( +/obj/structure/punching_bag, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/sign/poster/contraband/punch_shit/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) "mzP" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -39289,12 +40840,6 @@ "mAe" = ( /turf/open/floor/glass/reinforced, /area/station/security/lockers) -"mAl" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/smooth, -/area/station/security/brig/upper) "mAz" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -39304,6 +40849,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/fitness) +"mAM" = ( +/obj/structure/ladder, +/obj/machinery/light/small/red/directional/west, +/turf/open/floor/iron/smooth, +/area/station/maintenance/port/lesser) "mAN" = ( /obj/machinery/requests_console/directional/west{ department = "Cargo Bay"; @@ -39320,17 +40870,6 @@ /obj/structure/cable, /turf/open/floor/carpet, /area/station/security/prison/rec) -"mAV" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Garden" - }, -/obj/machinery/airalarm/directional/east, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden) "mBa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39338,6 +40877,18 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/smooth, /area/station/security/execution/transfer) +"mBh" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "mBB" = ( /obj/machinery/door/poddoor/preopen{ id = "ceprivacy"; @@ -39347,15 +40898,10 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/command/heads_quarters/ce) -"mBE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/event_spawn, -/obj/effect/decal/cleanable/crayon{ - pixel_x = -5; - pixel_y = -5 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/chapel) +"mBP" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "mBQ" = ( /obj/structure/table/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -39386,9 +40932,8 @@ "mBX" = ( /obj/structure/table/wood, /obj/machinery/airalarm/directional/east, -/obj/item/camera, /obj/item/storage/photo_album{ - pixel_y = -10 + pixel_y = -1 }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) @@ -39405,6 +40950,12 @@ /obj/structure/cable/layer3, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) +"mCK" = ( +/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/station/construction) "mCT" = ( /obj/machinery/hydroponics/soil, /turf/open/floor/grass, @@ -39416,15 +40967,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"mCZ" = ( -/obj/machinery/light/directional/east, -/obj/item/radio/intercom/directional/east, -/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/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "mDf" = ( /obj/machinery/telecomms/server/presets/common, /turf/open/floor/iron/dark/telecomms, @@ -39433,14 +40975,6 @@ /obj/structure/sign/warning/electric_shock, /turf/closed/wall/r_wall, /area/station/maintenance/aft/lesser) -"mDn" = ( -/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/secondary/entry) "mDo" = ( /obj/structure/bed/double, /obj/item/bedsheet/black/double, @@ -39499,6 +41033,16 @@ }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) +"mEv" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/firealarm/directional/east, +/obj/machinery/status_display/ai/directional/south, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "mEw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39517,23 +41061,14 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"mEI" = ( -/obj/machinery/button/flasher{ - id = "cell4"; - pixel_y = -22 - }, +"mEB" = ( /obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/brig/upper) +/obj/structure/cable, +/turf/open/floor/iron/showroomfloor, +/area/station/security/warden) "mEJ" = ( /turf/closed/wall/r_wall, /area/station/science/genetics) -"mEK" = ( -/obj/structure/rack, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) "mEL" = ( /obj/machinery/atmospherics/components/binary/valve/digital{ dir = 4 @@ -39583,20 +41118,6 @@ "mFE" = ( /turf/closed/wall, /area/station/medical/surgery/aft) -"mFK" = ( -/obj/machinery/firealarm/directional/east, -/obj/structure/closet/secure_closet/engineering_welding, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"mFP" = ( -/obj/machinery/light/directional/east, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "mFQ" = ( /obj/machinery/flasher/portable, /obj/machinery/door/window/brigdoor{ @@ -39620,21 +41141,26 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"mFY" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/landmark/start/assistant, +/obj/structure/chair/stool/directional/north, +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/status_display/ai/directional/south, +/obj/machinery/camera/directional/south{ + c_tag = "Laundry Room" + }, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "mGf" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) -"mGl" = ( -/obj/machinery/door/airlock/maintenance, -/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/mapping_helpers/airlock/access/all/engineering/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "mGm" = ( /obj/structure/rack, /obj/effect/spawner/random/techstorage/rnd_secure_all, @@ -39649,29 +41175,14 @@ /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/medical/pharmacy, /obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/structure/cable, /turf/open/floor/iron/textured, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) "mGu" = ( /obj/machinery/rnd/server, /obj/structure/lattice/catwalk, /turf/open/openspace/icemoon, /area/station/science/server) -"mGw" = ( -/obj/machinery/light/directional/north, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, -/turf/open/floor/circuit, -/area/station/ai_monitored/command/nuke_storage) -"mGB" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white/side{ - dir = 10 - }, -/area/station/science/research) "mGJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -39701,14 +41212,6 @@ /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, /area/station/maintenance/starboard/aft) -"mHx" = ( -/obj/structure/punching_bag, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/sign/poster/contraband/punch_shit/directional/east, -/turf/open/floor/iron, -/area/station/maintenance/starboard/fore) "mHB" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/fore) @@ -39726,13 +41229,6 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) -"mHX" = ( -/obj/item/flashlight/lantern, -/obj/machinery/light/directional/south, -/obj/structure/table/wood, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "mIk" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible, @@ -39741,9 +41237,9 @@ "mIt" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; id = "pharmacy_shutters3"; - name = "Pharmacy Shutters"; - dir = 1 + name = "Pharmacy Shutters" }, /turf/open/floor/plating, /area/station/medical/pharmacy) @@ -39804,6 +41300,10 @@ dir = 4 }, /area/station/service/chapel) +"mJv" = ( +/obj/item/paper/fluff/ids_for_dummies, +/turf/open/genturf, +/area/icemoon/underground/unexplored/rivers/deep) "mJD" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral{ @@ -39811,19 +41311,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"mJE" = ( -/obj/structure/rack, -/obj/item/clothing/glasses/sunglasses/big{ - pixel_x = 4; - pixel_y = 8 - }, -/obj/item/clothing/glasses/sunglasses/big{ - pixel_x = 4; - pixel_y = 2 - }, -/obj/item/taperecorder, -/turf/open/floor/wood, -/area/station/service/lawoffice) "mJM" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 @@ -39855,16 +41342,13 @@ /obj/structure/sign/nanotrasen, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"mKd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/siding/white, -/obj/machinery/camera/directional/south{ - c_tag = "Service Bar" +"mKa" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/cafeteria{ + dir = 8 }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) +/area/station/hallway/secondary/entry) "mKh" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -39884,14 +41368,17 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark/textured_edge, /area/station/security/evidence) -"mKS" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "mLa" = ( /obj/item/kirbyplants/random, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"mLm" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/port/lesser) "mLo" = ( /obj/structure/rack, /obj/item/crowbar, @@ -39916,15 +41403,20 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) -"mLK" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ - dir = 4 +"mLO" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Xenobiology Pens - Port Aft"; + network = list("ss13","rd","xeno") }, /turf/open/floor/engine, -/area/station/science/ordnance/burnchamber) +/area/station/science/xenobiology) +"mLT" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/textured, +/area/station/security/execution/transfer) "mLV" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, @@ -39938,19 +41430,21 @@ /obj/machinery/telecomms/message_server/preset, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"mMl" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 +"mMy" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Security - Permabrig Upper Hallway South"; + network = list("ss13","prison") }, -/obj/machinery/light/directional/north, -/obj/structure/closet/secure_closet/medical3, -/obj/item/defibrillator/loaded{ - pixel_y = 3 +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/dark/textured, +/area/station/security/prison) +"mMD" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 }, -/obj/item/clothing/gloves/latex/nitrile, -/obj/item/clothing/gloves/latex/nitrile, -/turf/open/floor/iron/dark, -/area/station/medical/storage) +/obj/machinery/firealarm/directional/west, +/turf/open/floor/carpet, +/area/station/service/library) "mMM" = ( /turf/closed/wall/r_wall, /area/station/security/prison) @@ -39979,6 +41473,15 @@ }, /turf/open/floor/plating/icemoon, /area/station/science/ordnance/bomb) +"mMX" = ( +/obj/machinery/airalarm/directional/north, +/obj/structure/table, +/obj/machinery/fax{ + fax_name = "Security Office"; + name = "Security Office Fax Machine" + }, +/turf/open/floor/iron/dark/textured, +/area/station/security/office) "mNj" = ( /obj/machinery/computer/security{ dir = 4 @@ -39989,12 +41492,12 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/security/warden) -"mNE" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 +"mNy" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 }, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) +/turf/open/floor/iron, +/area/station/hallway/primary/port) "mNF" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 4 @@ -40034,15 +41537,12 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"mOw" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/machinery/camera{ - c_tag = "Medbay Chemistry Lab - South"; - dir = 5; - network = list("ss13","medbay") - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) +"mOx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "mOA" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40060,18 +41560,6 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron, /area/station/command/bridge) -"mOY" = ( -/obj/structure/closet/secure_closet/chemical, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/line{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/no_smoking/circle/directional/west, -/turf/open/floor/iron/white, -/area/station/maintenance/port/fore) "mPh" = ( /obj/structure/rack, /obj/item/crowbar, @@ -40161,7 +41649,7 @@ /turf/open/floor/iron/smooth, /area/mine/laborcamp/security) "mQr" = ( -/obj/machinery/modular_computer/console/preset/id, +/obj/machinery/modular_computer/preset/id, /obj/item/radio/intercom/directional/east, /obj/machinery/camera{ c_tag = "Chief Medical Office North"; @@ -40175,11 +41663,6 @@ /obj/effect/decal/cleanable/glass, /turf/open/floor/iron/dark, /area/station/maintenance/department/medical/central) -"mQV" = ( -/obj/structure/chair/pew/right, -/obj/machinery/light/warm/directional/east, -/turf/open/floor/wood, -/area/station/security/prison/rec) "mQW" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -40210,10 +41693,7 @@ /obj/structure/railing{ dir = 1 }, -/obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{ - color = "#0000ff"; - name = "Supply multi deck pipe adapter" - }, +/obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) "mRG" = ( @@ -40282,18 +41762,15 @@ /obj/structure/sign/warning/secure_area, /turf/closed/wall/ice, /area/icemoon/surface/outdoors/nospawn) +"mTc" = ( +/obj/effect/spawner/random/engineering/atmospherics_portable, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "mTh" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/tile/yellow/anticorner/contrasted, /turf/open/floor/iron, /area/station/commons/storage/tools) -"mTk" = ( -/obj/structure/chair/plastic{ - dir = 0 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/starboard/fore) "mTm" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/air_input{ dir = 1 @@ -40333,11 +41810,17 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) -"mUr" = ( -/obj/structure/frame/computer, -/obj/structure/sign/poster/official/help_others/directional/north, -/turf/open/floor/iron, -/area/station/maintenance/port/fore) +"mUf" = ( +/obj/structure/railing{ + dir = 9 + }, +/obj/machinery/button/door/directional/east{ + id = "drone_bay"; + name = "Shutter Control"; + pixel_y = -8 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/underground/explored) "mUs" = ( /obj/machinery/light/directional/south, /turf/open/floor/plating, @@ -40347,8 +41830,18 @@ /obj/effect/mapping_helpers/airlock/abandoned, /obj/effect/mapping_helpers/airlock/unres, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"mUz" = ( +/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/insectguts, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/sign/warning/cold_temp/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "mUM" = ( /obj/item/radio/intercom/directional/north, /obj/effect/turf_decal/tile/red/anticorner{ @@ -40358,6 +41851,16 @@ dir = 4 }, /area/station/security/office) +"mUR" = ( +/obj/machinery/firealarm/directional/north{ + pixel_x = -26 + }, +/obj/structure/chair, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "mUU" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/wood/parquet, @@ -40394,6 +41897,11 @@ /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"mVE" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/hallway/secondary/entry) "mVI" = ( /obj/structure/table, /obj/structure/bedsheetbin, @@ -40403,6 +41911,13 @@ }, /turf/open/floor/iron/cafeteria, /area/station/security/prison/work) +"mVN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/broken/directional/north, +/obj/machinery/vending/dinnerware, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "mVY" = ( /obj/effect/turf_decal/tile/neutral/diagonal_edge, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -40442,11 +41957,6 @@ dir = 1 }, /area/station/service/hydroponics) -"mWq" = ( -/obj/structure/rack, -/obj/item/stack/sheet/iron/twenty, -/turf/open/floor/iron/dark/textured, -/area/station/security/interrogation) "mWs" = ( /obj/structure/table, /obj/item/storage/toolbox/emergency, @@ -40456,6 +41966,15 @@ }, /turf/open/floor/iron, /area/station/commons/storage/tools) +"mWw" = ( +/obj/machinery/porta_turret/ai{ + dir = 4 + }, +/obj/structure/sign/warning/secure_area/directional/east, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) "mWz" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/plating, @@ -40474,6 +41993,13 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"mWK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_large, +/area/station/security/checkpoint/customs/auxiliary) "mWM" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -40483,6 +42009,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/brig/upper) +"mWN" = ( +/obj/structure/disposalpipe/trunk/multiz{ + dir = 4 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/port/lesser) "mWU" = ( /obj/machinery/light/directional/west, /obj/machinery/status_display/evac/directional/west, @@ -40494,6 +42026,11 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"mWY" = ( +/obj/structure/chair/office, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/customs/auxiliary) "mXa" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating, @@ -40514,6 +42051,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) "mXi" = ( @@ -40535,15 +42073,6 @@ }, /turf/open/floor/iron, /area/mine/laborcamp) -"mXm" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "mXq" = ( /obj/structure/table, /obj/machinery/recharger, @@ -40552,41 +42081,57 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/iron, /area/station/science/explab) -"mXu" = ( -/obj/machinery/light/directional/south, -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 1 +"mXt" = ( +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/siding/white{ + dir = 6 }, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/station/commons/locker) +/area/station/service/bar) +"mXA" = ( +/obj/effect/landmark/blobstart, +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "mXD" = ( /obj/structure/rack, /obj/item/mecha_parts/mecha_equipment/drill, /obj/structure/sign/poster/official/random/directional/east, /turf/open/floor/iron/smooth, /area/mine/mechbay) +"mXH" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/station/hallway/secondary/entry) "mXK" = ( /obj/structure/table, /obj/structure/reagent_dispensers/servingdish, /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron, /area/station/security/prison/mess) -"mXP" = ( -/obj/structure/showcase/cyborg/old{ - dir = 4; - pixel_x = -9; - pixel_y = 2 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/blue{ - dir = 1 +"mXN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"mXT" = ( +/obj/item/radio/intercom/directional/west, +/obj/structure/chair{ + pixel_y = -2 }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/turf/open/floor/plating, +/area/station/hallway/secondary/entry) +"mYc" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "mYd" = ( /obj/machinery/air_sensor/ordnance_burn_chamber, /turf/open/floor/engine/vacuum, @@ -40627,6 +42172,22 @@ }, /turf/open/floor/wood, /area/station/hallway/secondary/service) +"mYs" = ( +/obj/machinery/computer/records/security{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/mapping_helpers/requests_console/information, +/obj/machinery/requests_console/directional/east{ + department = "Security"; + name = "Security Requests Console" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) "mYG" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -40643,13 +42204,6 @@ }, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) -"mYZ" = ( -/obj/machinery/shower/directional/west, -/obj/effect/turf_decal/stripes/red/line{ - dir = 6 - }, -/turf/open/floor/iron/textured, -/area/station/engineering/atmos) "mZf" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 5 @@ -40662,6 +42216,25 @@ }, /turf/open/floor/iron, /area/mine/laborcamp) +"mZm" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) +"mZn" = ( +/obj/structure/sign/poster/official/soft_cap_pop_art/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/light/built/directional/east, +/turf/open/floor/iron/white, +/area/station/maintenance/port/fore) "mZu" = ( /obj/structure/table/glass, /obj/item/cultivator, @@ -40729,12 +42302,6 @@ /obj/effect/turf_decal/tile/yellow/full, /turf/open/floor/iron/white/smooth_large, /area/station/medical/pharmacy) -"nap" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/sign/poster/contraband/random/directional/north, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "naq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -40746,14 +42313,22 @@ dir = 8 }, /area/mine/eva) -"naO" = ( -/obj/structure/rack, -/obj/item/shovel{ - pixel_x = -5 +"nav" = ( +/obj/machinery/firealarm/directional/north, +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/engineering/storage) +"naO" = ( /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 8 }, +/obj/machinery/computer/security/mining{ + dir = 1 + }, /turf/open/floor/iron, /area/station/cargo/miningdock) "naP" = ( @@ -40762,12 +42337,15 @@ }, /turf/open/floor/wood, /area/station/service/library) -"naW" = ( -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/white/side{ - dir = 10 +"naU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/area/station/science/research) +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "naX" = ( /turf/closed/wall/mineral/iron, /area/station/engineering/atmos/mix) @@ -40922,14 +42500,11 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos/project) -"ncp" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Arrivals Bay 3 & 4" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/spawner/random/vending/snackvend, +"nct" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/kirbyplants/random, /turf/open/floor/iron, -/area/station/hallway/secondary/entry) +/area/station/commons/locker) "ncB" = ( /obj/machinery/door/airlock/security/glass{ name = "Brig Walkway" @@ -40970,6 +42545,13 @@ }, /turf/open/floor/iron, /area/station/science/ordnance) +"ndl" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal) "ndz" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -41026,6 +42608,10 @@ }, /turf/open/floor/plating, /area/station/cargo/storage) +"ndO" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/west, +/turf/open/floor/wood, +/area/station/service/library) "nea" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -41065,6 +42651,12 @@ /obj/structure/sign/warning/cold_temp/directional/south, /turf/open/floor/plating/snowed/coldroom, /area/station/service/kitchen/coldroom) +"neq" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/effect/turf_decal/siding/thinplating, +/turf/open/floor/iron, +/area/station/commons/locker) "ner" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -41084,6 +42676,27 @@ }, /turf/open/floor/wood, /area/station/security/courtroom) +"neF" = ( +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/table, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/grenade/chem_grenade/smart_metal_foam, +/obj/item/grenade/chem_grenade/smart_metal_foam, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/clothing/shoes/magboots{ + pixel_x = -11; + pixel_y = 1 + }, +/obj/item/clothing/shoes/magboots{ + pixel_x = -9; + pixel_y = -4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/engine_smes) "neM" = ( /obj/machinery/hydroponics/soil, /turf/open/misc/asteroid/snow/icemoon, @@ -41093,6 +42706,11 @@ /obj/machinery/meter, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"nfd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron, +/area/station/cargo/sorting) "nfj" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -41107,6 +42725,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/central) +"nfn" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "nfr" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -41126,12 +42750,6 @@ }, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) -"nfR" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "nfU" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -41141,6 +42759,19 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"nfW" = ( +/obj/machinery/computer/mecha{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/machinery/keycard_auth/directional/south, +/obj/machinery/camera/autoname/directional/south{ + c_tag = "Research Director's Office"; + network = list("ss13","rd") + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/command/heads_quarters/rd) "ngj" = ( /obj/effect/turf_decal/stripes/asteroid/line{ dir = 9 @@ -41159,48 +42790,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/mine/production) -"ngx" = ( -/obj/structure/table, -/obj/structure/sign/plaques/kiddie{ - pixel_x = 32 - }, -/obj/machinery/camera/motion/directional/east{ - c_tag = "AI Upload East"; - network = list("aiupload") - }, -/obj/item/folder/blue, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) -"ngC" = ( -/obj/structure/rack, -/obj/item/clothing/suit/armor/bulletproof{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/suit/armor/bulletproof, -/obj/item/clothing/suit/armor/bulletproof{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/clothing/head/helmet/alt{ - layer = 3.00001; - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/head/helmet/alt{ - layer = 3.00001 - }, -/obj/item/clothing/head/helmet/alt{ - layer = 3.00001; - pixel_x = 3; - pixel_y = -3 - }, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) "ngH" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/effect/turf_decal/stripes/line{ @@ -41268,6 +42857,12 @@ /mob/living/carbon/human/species/monkey, /turf/open/floor/engine, /area/station/science/genetics) +"nhS" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) "nhT" = ( /obj/machinery/door/airlock/external{ glass = 1; @@ -41279,12 +42874,6 @@ }, /turf/open/floor/plating, /area/mine/laborcamp) -"nhU" = ( -/obj/machinery/computer/scan_consolenew, -/obj/machinery/light/directional/north, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/iron/dark, -/area/station/science/genetics) "nia" = ( /obj/machinery/door/poddoor/shutters/window{ dir = 8; @@ -41307,14 +42896,17 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/white, /area/station/medical/virology) -"nio" = ( -/obj/item/radio/intercom/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/blue/half/contrasted{ +"nit" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "garbage" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/fore) +/turf/open/floor/plating, +/area/station/maintenance/disposal) "niu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -41336,6 +42928,7 @@ name = "Blast Door Control A"; pixel_y = -6 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "niC" = ( @@ -41350,34 +42943,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/mine/eva) -"niK" = ( -/obj/effect/turf_decal/trimline/green/filled/line, -/obj/effect/turf_decal/trimline/blue/filled/warning, -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Service Botany - Lower South" - }, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics) -"niL" = ( -/obj/structure/chair/stool/directional/south, -/obj/machinery/flasher/directional/west{ - id = "GulagCell 2" - }, -/obj/structure/sign/poster/official/work_for_a_future/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/laborcamp) "niN" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle, /turf/open/floor/plating, /area/mine/eva/lower) +"niY" = ( +/obj/effect/spawner/random/trash/bin, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "niZ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -41435,6 +43008,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"nka" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/status_display/ai/directional/west, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "nkb" = ( /obj/machinery/computer/communications{ dir = 8 @@ -41485,10 +43067,6 @@ /obj/structure/cable, /turf/open/floor/iron/freezer, /area/station/commons/toilet) -"nkX" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/closed/wall/r_wall, -/area/station/maintenance/department/medical/central) "nll" = ( /obj/structure/table, /obj/item/stack/sheet/iron/fifty{ @@ -41510,6 +43088,17 @@ }, /turf/open/floor/iron, /area/station/security/brig/upper) +"nlr" = ( +/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/station/construction) +"nlI" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron, +/area/station/commons/dorms) "nlJ" = ( /obj/structure/railing{ dir = 5 @@ -41530,6 +43119,13 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/medical/chemistry) +"nlO" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "nlP" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, @@ -41584,10 +43180,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/science/xenobiology) -"nmk" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/engine, -/area/station/science/genetics) "nmm" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/north, @@ -41610,6 +43202,19 @@ /obj/effect/spawner/random/contraband/cannabis, /turf/open/floor/grass, /area/station/security/prison/garden) +"nmu" = ( +/obj/structure/sign/warning/xeno_mining/directional/east, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/smooth_large, +/area/station/cargo/warehouse) +"nmx" = ( +/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, +/area/station/hallway/primary/port) "nmz" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -41617,6 +43222,23 @@ }, /turf/open/openspace, /area/station/science/ordnance/office) +"nmA" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/secondary/entry) "nmC" = ( /obj/machinery/iv_drip, /obj/effect/turf_decal/tile/blue/half/contrasted{ @@ -41642,11 +43264,14 @@ /obj/effect/landmark/navigate_destination/library, /turf/open/floor/wood, /area/station/service/library) -"nnk" = ( -/obj/item/chair/plastic, +"nmS" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "nnl" = ( /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, /obj/effect/spawner/structure/window/reinforced/plasma, @@ -41678,19 +43303,22 @@ /obj/machinery/vending/assist, /turf/open/floor/plating, /area/station/engineering/storage/tech) -"nnK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "nnR" = ( /obj/machinery/holopad, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) +"nnW" = ( +/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/turf_decal/tile/red/half{ + dir = 4 + }, +/turf/open/floor/iron/half{ + dir = 1 + }, +/area/station/hallway/secondary/service) "noi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/airalarm/directional/east, @@ -41723,6 +43351,27 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/chapel) +"noF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/command/heads_quarters/qm) +"noM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/turf_decal/siding/yellow{ + dir = 8 + }, +/obj/item/kirbyplants/random, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) "noQ" = ( /obj/structure/sign/warning/cold_temp/directional/north, /obj/structure/sign/warning/gas_mask/directional/south, @@ -41777,6 +43426,20 @@ }, /turf/open/floor/iron/white, /area/station/medical/psychology) +"npq" = ( +/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, +/area/station/hallway/secondary/entry) +"npr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "npu" = ( /obj/structure/rack, /obj/effect/turf_decal/delivery/red, @@ -41795,6 +43458,14 @@ /obj/item/clothing/mask/breath, /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/command/storage/eva) +"npy" = ( +/obj/structure/chair/comfy/beige{ + dir = 8 + }, +/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/hallway/secondary/entry) "npB" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -41844,14 +43515,6 @@ }, /turf/open/floor/iron/white, /area/station/science/explab) -"npV" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/machinery/light/warm/directional/north, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" - }, -/area/station/security/prison/rec) "nqb" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /turf/open/floor/plating/snowed/icemoon, @@ -41876,12 +43539,27 @@ /obj/structure/sign/nanotrasen, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) +"nqw" = ( +/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, +/turf/open/floor/iron, +/area/station/commons/storage/mining) "nqy" = ( /obj/structure/stairs/east, /obj/structure/railing, /obj/machinery/door/firedoor/border_only, /turf/open/floor/iron/white, /area/station/science/ordnance) +"nqD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) "nqL" = ( /obj/machinery/food_cart, /obj/effect/turf_decal/tile/brown/diagonal_edge, @@ -41931,6 +43609,22 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/stone, /area/station/commons/lounge) +"nrq" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/textured, +/area/station/security/brig) +"nrt" = ( +/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/structure/disposalpipe/sorting/mail/flip{ + dir = 4 + }, +/obj/effect/mapping_helpers/mail_sorting/service/theater, +/turf/open/floor/wood/parquet, +/area/station/commons/lounge) "nry" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -41950,11 +43644,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"nrB" = ( -/obj/machinery/light/directional/west, -/obj/machinery/status_display/evac/directional/west, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) "nrC" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 6 @@ -42008,25 +43697,25 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/wood, /area/station/hallway/secondary/service) -"nsi" = ( -/obj/machinery/door/airlock/external{ - name = "Construction Zone" - }, -/turf/open/floor/plating, -/area/station/construction/mining/aux_base) "nsp" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) -"nsr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/wood{ - dir = 4 +"nsq" = ( +/obj/structure/window/reinforced/spawner/directional/north{ + layer = 2.9 }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 +/obj/structure/filingcabinet/filingcabinet, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 }, -/turf/open/floor/wood, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"nsr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) "nst" = ( /obj/item/trash/sosjerky, @@ -42039,6 +43728,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"nsz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/south, +/obj/structure/rack, +/turf/open/floor/iron/smooth, +/area/station/maintenance/department/chapel) "nsK" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, @@ -42097,21 +43792,20 @@ }, /turf/open/floor/iron, /area/station/security/processing) +"ntx" = ( +/obj/structure/sign/nanotrasen{ + pixel_x = 32 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/structure/marker_beacon/burgundy, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "ntK" = ( /obj/structure/flora/rock/icy/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) -"ntN" = ( -/obj/machinery/light/directional/west, -/obj/structure/bookcase{ - name = "Holy Bookcase" - }, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "ntT" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/wood, @@ -42121,6 +43815,11 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) +"nud" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "nuj" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, @@ -42136,27 +43835,28 @@ }, /turf/open/floor/iron/dark, /area/mine/storage) -"nuo" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood/parquet, -/area/station/commons/lounge) "nup" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison/visit) -"nuw" = ( -/obj/structure/chair/comfy/black{ +"nuM" = ( +/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/neutral/fourcorners, +/obj/effect/turf_decal/stripes/white/line{ dir = 8 }, -/obj/effect/turf_decal/siding/wood/corner{ +/obj/effect/turf_decal/stripes/white/line{ dir = 4 }, -/obj/machinery/light/small/directional/east, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/wood, -/area/station/service/library) +/obj/machinery/door/airlock/multi_tile/public/glass{ + name = "Arrivals Dock"; + dir = 4 + }, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/secondary/entry) "nuN" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -42177,14 +43877,6 @@ /obj/structure/flora/bush/snow/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) -"nva" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/machinery/light/small/directional/east, -/obj/structure/closet/crate, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) "nvr" = ( /obj/effect/turf_decal/weather/snow/corner, /obj/machinery/light/small/directional/north, @@ -42197,9 +43889,7 @@ /turf/open/floor/iron, /area/station/command/heads_quarters/hop) "nvt" = ( -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, +/obj/item/kirbyplants/organic/plant10, /turf/open/floor/wood/parquet, /area/station/commons/lounge) "nvE" = ( @@ -42213,6 +43903,21 @@ }, /turf/open/floor/iron/cafeteria, /area/station/security/prison/work) +"nvI" = ( +/obj/effect/turf_decal/tile/blue{ + 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/corner, +/area/station/hallway/secondary/entry) +"nvU" = ( +/obj/effect/mapping_helpers/airlock/access/all/command/eva, +/obj/machinery/door/airlock/external{ + name = "Port Docking Bay 1" + }, +/turf/open/floor/iron/textured, +/area/station/hallway/secondary/entry) "nvW" = ( /obj/machinery/duct, /turf/open/floor/iron, @@ -42236,11 +43941,15 @@ }, /turf/open/floor/iron/white, /area/station/science/genetics) -"nwd" = ( -/obj/machinery/mech_bay_recharge_port, +"nwr" = ( +/obj/effect/turf_decal/tile/red/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, -/turf/open/floor/plating, -/area/station/maintenance/department/electrical) +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/customs/auxiliary) "nwF" = ( /obj/structure/chair/sofa/bench{ dir = 4 @@ -42263,12 +43972,11 @@ dir = 9 }, /area/station/science/research) -"nxf" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L13" - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) +"nxe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "nxm" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -42291,15 +43999,11 @@ "nxM" = ( /turf/closed/wall, /area/station/maintenance/department/medical/morgue) -"nxV" = ( -/obj/effect/spawner/random/engineering/tracking_beacon, -/obj/effect/turf_decal/siding/green{ - dir = 1 - }, -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) +"nxU" = ( +/obj/machinery/status_display/evac/directional/east, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/iron/white, +/area/station/science/robotics/lab) "nxW" = ( /obj/effect/turf_decal/plaque{ icon_state = "L2" @@ -42316,13 +44020,12 @@ /obj/structure/chair/stool/directional/north, /turf/open/floor/iron, /area/station/commons/fitness) -"nyd" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) +"nyg" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/random/directional/south, +/turf/open/floor/plating, +/area/station/construction) "nyl" = ( /obj/machinery/door/morgue{ name = "Private Study"; @@ -42341,19 +44044,24 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"nyy" = ( -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/hop) "nyA" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ dir = 4 }, /turf/closed/wall/r_wall, /area/station/engineering/transit_tube) +"nyB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/line, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 1 + }, +/obj/machinery/holopad, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "nyC" = ( /turf/open/floor/iron/dark/smooth_half, /area/station/service/chapel) @@ -42408,12 +44116,11 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"nzf" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/purple/visible, -/turf/open/floor/iron/dark, -/area/station/engineering/supermatter/room) +"nza" = ( +/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/garden) "nzj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -42421,13 +44128,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/smooth, /area/station/security/execution/transfer) -"nzk" = ( -/obj/effect/turf_decal/bot, -/obj/effect/landmark/start/hangover, -/obj/machinery/light/directional/east, -/obj/structure/sign/warning/electric_shock/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "nzq" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -42460,14 +44160,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/eva) -"nzF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/laborcamp) "nzG" = ( /obj/structure/railing{ dir = 10 @@ -42522,6 +44214,13 @@ /obj/item/wrench, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"nAg" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/lattice/catwalk, +/turf/open/openspace/icemoon/keep_below, +/area/station/maintenance/port/lesser) "nAr" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating, @@ -42538,16 +44237,20 @@ }, /turf/open/floor/iron, /area/station/security/prison/workout) -"nAI" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"nAH" = ( +/turf/open/openspace/icemoon/keep_below, +/area/station/hallway/secondary/entry) +"nAM" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/effect/landmark/start/botanist, /obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/turf_decal/tile/green{ + dir = 8 }, -/turf/open/floor/wood/parquet, -/area/station/commons/lounge) +/turf/open/floor/iron, +/area/station/service/hydroponics) "nAN" = ( /obj/effect/landmark/start/paramedic, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -42559,6 +44262,18 @@ }, /turf/open/floor/iron/white, /area/station/medical/break_room) +"nAX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Arrivals Dock South" + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/entry) "nBe" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -42607,6 +44322,9 @@ /area/station/maintenance/solars/starboard/aft) "nBE" = ( /obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) "nBG" = ( @@ -42621,6 +44339,13 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, /area/station/maintenance/starboard/aft) +"nBQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/tank/air{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "nBV" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/engine/vacuum, @@ -42657,7 +44382,7 @@ /turf/open/floor/iron/dark/textured_edge{ dir = 8 }, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) "nCh" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light/directional/east, @@ -42735,12 +44460,6 @@ /obj/structure/closet/radiation, /turf/open/floor/iron/dark, /area/station/maintenance/disposal/incinerator) -"nDk" = ( -/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/goonplaque, -/area/station/hallway/secondary/entry) "nDl" = ( /obj/structure/railing/corner, /obj/machinery/door/firedoor/border_only, @@ -42759,19 +44478,19 @@ "nDq" = ( /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"nDv" = ( -/obj/structure/table, -/obj/item/folder, -/obj/item/pen, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/locker) "nDw" = ( /obj/structure/railing/corner{ dir = 8 }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"nDy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/fruit_bowl/directional/north, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/station/maintenance/port/aft) "nDz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -42805,6 +44524,17 @@ "nDE" = ( /turf/closed/wall/r_wall, /area/station/security/prison/garden) +"nDJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) "nDV" = ( /obj/machinery/shower/directional/south, /obj/effect/spawner/random/contraband/permabrig_weapon, @@ -42820,19 +44550,6 @@ }, /turf/open/floor/iron/white/corner, /area/station/commons/storage/art) -"nEb" = ( -/obj/machinery/light_switch/directional/west, -/obj/structure/sign/warning/bodysposal/directional/north, -/obj/machinery/disposal/bin{ - desc = "A pneumatic waste disposal unit. This one leads to the morgue."; - name = "corpse disposal" - }, -/obj/structure/disposalpipe/trunk, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/fore) "nEc" = ( /obj/structure/table/glass, /obj/effect/decal/cleanable/dirt, @@ -42854,19 +44571,31 @@ /obj/effect/mapping_helpers/mail_sorting/supply/cargo_bay, /turf/open/floor/iron, /area/station/cargo/office) -"nEX" = ( +"nEq" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, -/obj/structure/rack, -/turf/open/floor/iron/smooth, -/area/station/maintenance/department/chapel) -"nEZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) +/obj/effect/spawner/random/trash/garbage, +/obj/effect/spawner/random/trash/caution_sign, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"nEs" = ( +/obj/item/kirbyplants/random, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark/textured, +/area/station/security/processing) +"nEA" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/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/hallway/secondary/entry) +"nEV" = ( +/obj/machinery/vending/wardrobe/sec_wardrobe, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/engineering) "nFc" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/engineering{ @@ -42883,16 +44612,6 @@ /obj/effect/mapping_helpers/airlock/access/any/engineering/general, /turf/open/floor/iron/dark, /area/station/engineering/main) -"nFg" = ( -/obj/structure/table, -/obj/item/paper_bin/carbon{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, -/obj/item/stamp/head/hop, -/turf/open/floor/iron, -/area/station/command/heads_quarters/hop) "nFk" = ( /obj/effect/landmark/start/cyborg, /obj/structure/cable, @@ -42940,6 +44659,11 @@ }, /turf/open/floor/iron/dark, /area/station/commons/storage/primary) +"nFL" = ( +/obj/machinery/door/airlock/external/glass, +/obj/effect/mapping_helpers/airlock/access/all/engineering/external, +/turf/open/floor/plating, +/area/station/hallway/secondary/entry) "nFN" = ( /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, @@ -42949,18 +44673,13 @@ /obj/structure/cable, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) -"nFR" = ( -/obj/structure/table, -/obj/item/clothing/glasses/meson, -/obj/item/storage/bag/ore, -/obj/item/pickaxe, -/obj/item/mining_scanner, -/obj/item/flashlight, -/obj/machinery/light/directional/west, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/gps/mining, +"nFU" = ( +/obj/structure/chair/stool/directional/west, +/obj/item/trash/energybar, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/poster/official/work_for_a_future/directional/south, /turf/open/floor/iron, -/area/station/commons/storage/mining) +/area/station/security/prison/work) "nGb" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /obj/effect/turf_decal/tile/red/full, @@ -42999,6 +44718,14 @@ }, /turf/open/floor/glass/reinforced, /area/station/engineering/atmos/pumproom) +"nGK" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/effect/spawner/random/armory/barrier_grenades, +/turf/open/floor/iron/dark/textured, +/area/station/ai_monitored/security/armory/upper) "nGQ" = ( /obj/machinery/flasher/directional/north{ id = "Cell 3" @@ -43079,6 +44806,11 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) +"nIa" = ( +/obj/structure/cable, +/obj/machinery/light/floor, +/turf/open/floor/plating, +/area/station/engineering/storage/tech) "nId" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -43111,22 +44843,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"nIN" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, -/area/mine/eva/lower) -"nIS" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/red{ - dir = 8 - }, -/obj/effect/spawner/random/clothing/costume, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/maintenance/port/fore) "nJd" = ( /obj/structure/grille, /turf/open/floor/plating, @@ -43160,13 +44876,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/engine_equipment, /turf/open/floor/iron, /area/station/engineering/storage) -"nJs" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Solar Maintenance - North East Access" - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "nJy" = ( /obj/structure/chair/pew{ dir = 1 @@ -43175,6 +44884,10 @@ dir = 8 }, /area/station/service/chapel) +"nJC" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/parquet, +/area/station/commons/lounge) "nJI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /obj/effect/turf_decal/siding/wideplating/corner{ @@ -43195,14 +44908,17 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/security/checkpoint/science) +"nJZ" = ( +/obj/machinery/light/small/red/directional/south, +/obj/structure/chair{ + dir = 1 + }, +/obj/item/radio/intercom/chapel/directional/east, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "nKa" = ( /turf/closed/wall, /area/station/security/checkpoint/medical) -"nKe" = ( -/obj/structure/table, -/obj/item/hand_tele, -/turf/open/floor/iron, -/area/station/command/teleporter) "nKj" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/machinery/rnd/production/circuit_imprinter, @@ -43214,21 +44930,18 @@ /obj/effect/mapping_helpers/requests_console/assistance, /turf/open/floor/iron/dark, /area/station/engineering/lobby) +"nKk" = ( +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "nKl" = ( /obj/structure/railing{ dir = 6 }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"nKn" = ( -/obj/machinery/hydroponics/constructable, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) "nKr" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -43294,23 +45007,23 @@ }, /turf/open/floor/iron/dark, /area/mine/mechbay) +"nKW" = ( +/obj/item/shard{ + icon_state = "medium" + }, +/obj/item/circuitboard/computer/operating, +/obj/structure/mirror/broken/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/port/fore) "nLb" = ( /obj/machinery/blackbox_recorder, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"nLd" = ( -/obj/machinery/mineral/processing_unit{ - dir = 1 - }, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/production) +"nLe" = ( +/obj/effect/turf_decal/tile/dark/half/contrasted, +/obj/machinery/light/floor, +/turf/open/floor/iron/white, +/area/station/medical/virology) "nLg" = ( /obj/item/wrench, /obj/effect/turf_decal/stripes/line{ @@ -43334,12 +45047,24 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"nMb" = ( +/obj/structure/toilet{ + pixel_y = 12 + }, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/landmark/start/psychologist, +/turf/open/floor/iron/freezer, +/area/station/medical/break_room) "nMc" = ( /obj/structure/disposalpipe/trunk/multiz{ dir = 1 }, /turf/closed/wall/r_wall, /area/station/medical/virology) +"nMj" = ( +/obj/structure/sign/warning/docking/directional/north, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "nMu" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 1 @@ -43374,9 +45099,9 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/all/supply/mining, +/obj/effect/mapping_helpers/airlock/access/all/supply/general, /turf/open/floor/iron, -/area/station/cargo/miningdock) +/area/station/cargo/storage) "nME" = ( /obj/item/clothing/head/utility/hardhat, /turf/open/floor/plating/snowed/icemoon, @@ -43447,10 +45172,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/starboard/fore) -"nNw" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "nNy" = ( /obj/structure/sign/warning/xeno_mining{ pixel_x = 29 @@ -43470,29 +45191,11 @@ /obj/structure/chair/stool/directional/east, /turf/open/floor/iron/dark, /area/station/medical/virology) -"nNG" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/structure/chair/sofa/corp/right{ - dir = 4; - pixel_x = -4 - }, -/obj/machinery/firealarm/directional/west, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/grimy, -/area/station/service/bar/atrium) "nNQ" = ( /obj/machinery/duct, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar/backroom) -"nNY" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) "nOb" = ( /obj/machinery/door/airlock/external{ name = "Labor Camp Shuttle Airlock" @@ -43502,26 +45205,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/processing) -"nOi" = ( -/obj/structure/table, -/obj/item/assembly/signaler{ - pixel_y = 8 - }, -/obj/item/assembly/signaler{ - pixel_x = -8; - pixel_y = 5 - }, -/obj/item/assembly/signaler{ - pixel_x = -2; - pixel_y = -2 - }, -/obj/item/assembly/signaler{ - pixel_x = 6; - pixel_y = 5 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/office) "nOk" = ( /obj/item/chair/wood, /obj/structure/sign/poster/contraband/random/directional/east, @@ -43541,24 +45224,10 @@ /obj/item/pillow/random, /turf/open/floor/carpet, /area/station/commons/dorms) -"nOw" = ( -/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/small/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/department/chapel) -"nOB" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/wood/parquet, -/area/station/service/bar/atrium) +"nOx" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/maintenance/port/fore) "nOG" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -43575,12 +45244,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/command/bridge) -"nOK" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/sign/warning/xeno_mining/directional/east, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron/smooth_large, -/area/station/cargo/warehouse) "nOQ" = ( /obj/machinery/suit_storage_unit/security, /obj/machinery/camera/directional/north{ @@ -43595,10 +45258,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/mix) -"nOU" = ( -/obj/structure/tank_holder/anesthetic, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) "nPt" = ( /obj/structure/chair/stool/directional/east, /obj/effect/mapping_helpers/burnt_floor, @@ -43609,15 +45268,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) -"nPU" = ( -/obj/structure/chair/stool/bar/directional/south, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/light/small/directional/east, -/obj/machinery/status_display/evac/directional/east, -/turf/open/floor/stone, -/area/station/commons/lounge) "nQd" = ( /obj/effect/turf_decal/trimline/green/filled/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -43654,26 +45304,6 @@ }, /turf/open/floor/iron/white/corner, /area/station/commons/storage/art) -"nQI" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"nQM" = ( -/obj/structure/extinguisher_cabinet/directional/south{ - pixel_x = 4 - }, -/obj/machinery/light/directional/south, -/obj/machinery/light_switch/directional/south{ - pixel_x = -6 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron, -/area/station/command/bridge) "nQO" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=AIW"; @@ -43727,6 +45357,16 @@ /obj/effect/turf_decal/trimline/blue/filled/corner, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"nRm" = ( +/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, +/turf/open/floor/iron, +/area/station/security/brig/upper) "nRq" = ( /obj/structure/closet/crate, /obj/effect/spawner/random/bureaucracy/birthday_wrap, @@ -43735,14 +45375,24 @@ }, /turf/open/floor/iron, /area/station/cargo/office) +"nRv" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/port/lesser) "nRx" = ( -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/siding/wood/corner{ +/obj/machinery/washing_machine, +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/wood, -/area/station/service/library) +/obj/structure/sign/poster/official/nanotrasen_logo/directional/east, +/turf/open/floor/iron, +/area/station/commons/dorms/laundry) "nRO" = ( /obj/structure/cable/multilayer/multiz, /obj/structure/sign/poster/contraband/random/directional/north, @@ -43775,18 +45425,12 @@ /obj/structure/flora/bush/snow/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) -"nSs" = ( -/obj/effect/turf_decal/stripes/asteroid/corner{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/dark{ +"nSr" = ( +/obj/effect/spawner/random/entertainment/arcade{ dir = 1 }, -/turf/open/floor/iron/white/side{ - dir = 6 - }, -/area/mine/living_quarters) +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "nSw" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/layer_manifold/brown/visible, @@ -43834,21 +45478,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/orange/visible, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) -"nSX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"nTf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet/personal{ - anchored = 1 - }, -/obj/item/clothing/under/costume/jabroni, -/turf/open/floor/iron, -/area/station/maintenance/starboard/fore) "nTp" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43856,15 +45485,6 @@ /obj/effect/turf_decal/tile/red/full, /turf/open/floor/iron/dark/textured_large, /area/station/security/brig/entrance) -"nTv" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/random/food_or_drink/cups, -/obj/effect/spawner/random/food_or_drink/booze, -/obj/effect/spawner/random/food_or_drink/booze, -/obj/machinery/light/small/directional/north, -/obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/department/chapel) "nTA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -43877,14 +45497,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"nTI" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/machinery/processor{ - pixel_y = 6 - }, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "nTK" = ( /obj/structure/table/glass, /obj/machinery/barsign{ @@ -43920,12 +45532,27 @@ "nTO" = ( /turf/closed/wall/r_wall, /area/mine/laborcamp/security) +"nTV" = ( +/obj/structure/table/reinforced, +/obj/item/screwdriver{ + pixel_y = 10 + }, +/obj/item/radio/off, +/obj/item/radio/intercom/directional/north, +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/red/full, +/turf/open/floor/iron/dark/smooth_large, +/area/station/security/checkpoint/medical) "nUg" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 }, /turf/open/floor/iron/dark/side, /area/station/security/processing) +"nUh" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "nUi" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle, /turf/open/floor/plating, @@ -43940,12 +45567,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/smooth_half, /area/station/ai_monitored/command/storage/eva) -"nUw" = ( -/obj/machinery/conveyor{ - id = "garbage" - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "nUJ" = ( /obj/machinery/flasher/directional/east{ id = "brigentry" @@ -43962,31 +45583,6 @@ }, /turf/open/floor/iron/dark/textured_edge, /area/station/security/prison) -"nUO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/west, -/obj/structure/table, -/obj/item/pen/red, -/obj/item/pen{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/folder/yellow, -/obj/machinery/keycard_auth/directional/west{ - pixel_x = -25; - pixel_y = -5 - }, -/obj/machinery/button/door/directional/west{ - id = "qmprivacy"; - name = "Privacy Shutters Control"; - pixel_y = 5; - req_access = list("qm") - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) "nVc" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/yellow/filled/corner{ @@ -44036,6 +45632,12 @@ dir = 5 }, /area/station/maintenance/port/aft) +"nVX" = ( +/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/wood/parquet, +/area/station/commons/lounge) "nVZ" = ( /obj/machinery/door/airlock/command{ name = "Captain's Office" @@ -44055,19 +45657,22 @@ /obj/item/plate, /turf/open/floor/iron/checker, /area/station/maintenance/port/fore) -"nWy" = ( -/obj/structure/sign/poster/official/work_for_a_future, -/turf/closed/wall, -/area/station/maintenance/port/greater) -"nWB" = ( -/obj/structure/closet, -/obj/item/clothing/under/suit/black, -/obj/item/clothing/under/rank/civilian/lawyer/black/skirt, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 +"nWn" = ( +/obj/structure/tank_holder/extinguisher, +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/spawner/random/trash/graffiti{ + pixel_y = -32; + spawn_loot_chance = 50 }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms/laundry) +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) +"nWw" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/wood/parquet, +/area/station/commons/lounge) "nWH" = ( /turf/closed/wall, /area/station/maintenance/department/cargo) @@ -44076,22 +45681,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"nWP" = ( -/obj/effect/turf_decal/stripes/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/hallway/secondary/entry) -"nWQ" = ( -/obj/structure/closet/secure_closet/medical2, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/surgery/fore) "nXb" = ( /turf/closed/wall, /area/icemoon/surface/outdoors/nospawn) @@ -44125,15 +45714,6 @@ /obj/item/storage/box/monkeycubes, /turf/open/floor/iron, /area/station/science/xenobiology) -"nXu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet/personal{ - anchored = 1 - }, -/obj/item/clothing/under/pants/track, -/obj/item/clothing/suit/costume/ianshirt, -/turf/open/floor/iron, -/area/station/maintenance/starboard/fore) "nXH" = ( /obj/structure/bodycontainer/crematorium{ id = "crematoriumChapel" @@ -44147,12 +45727,6 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/plating, /area/station/commons/vacant_room/commissary) -"nXR" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "nXV" = ( /obj/machinery/door/airlock/security{ name = "Permabrig Visitation" @@ -44179,14 +45753,6 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/service) -"nYY" = ( -/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/edge{ - dir = 4 - }, -/area/station/engineering/lobby) "nYZ" = ( /obj/item/storage/bag/trash, /turf/open/floor/plating, @@ -44228,11 +45794,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/security/prison/work) -"nZj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "nZA" = ( /obj/structure/table, /obj/item/stock_parts/subspace/amplifier, @@ -44259,13 +45820,6 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"oal" = ( -/obj/machinery/light/directional/south, -/obj/machinery/computer/records/security{ - dir = 1 - }, -/turf/open/floor/iron/showroomfloor, -/area/station/security/warden) "oaG" = ( /obj/effect/turf_decal/stripes/asteroid/line{ dir = 9 @@ -44309,13 +45863,6 @@ /obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"obd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "obj" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -44461,6 +46008,11 @@ /obj/machinery/computer/arcade/orion_trail, /turf/open/floor/iron, /area/station/security/prison/work) +"odC" = ( +/obj/structure/cable, +/obj/item/radio/intercom/prison/directional/east, +/turf/open/floor/carpet/red, +/area/station/security/prison/work) "odN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, @@ -44480,6 +46032,7 @@ /area/station/science/robotics/lab) "oef" = ( /obj/structure/grille/broken, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/aft) "oeh" = ( @@ -44493,15 +46046,15 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/plating, /area/station/hallway/secondary/exit/departure_lounge) -"oel" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "oex" = ( /turf/open/openspace/icemoon/keep_below, /area/station/maintenance/department/medical/morgue) +"oeB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/plastic, +/area/station/commons/dorms/laundry) "oeM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -44581,16 +46134,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) -"ofS" = ( -/obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "ofT" = ( /obj/structure/closet/secure_closet/hydroponics, /obj/effect/turf_decal/siding/thinplating/dark, @@ -44600,10 +46143,6 @@ }, /turf/open/floor/plating, /area/station/service/hydroponics) -"ogc" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/station/engineering/supermatter/room) "ogd" = ( /obj/structure/chair/office{ dir = 8 @@ -44643,14 +46182,6 @@ dir = 9 }, /area/station/security/prison) -"ogM" = ( -/obj/effect/turf_decal/stripes/corner{ - 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/hallway/secondary/entry) "oha" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -44663,15 +46194,6 @@ "ohp" = ( /turf/open/floor/glass, /area/station/maintenance/department/medical/central) -"ohs" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "oht" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -44683,13 +46205,15 @@ /obj/effect/turf_decal/caution{ dir = 8 }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) -"ohG" = ( -/obj/effect/landmark/start/prisoner, -/obj/effect/landmark/event_spawn, -/turf/open/floor/carpet/red, -/area/station/security/prison/work) +"ohM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) "ohS" = ( /obj/structure/railing{ dir = 8 @@ -44703,10 +46227,6 @@ }, /turf/open/openspace, /area/station/security/prison) -"ohV" = ( -/obj/structure/chair/office, -/turf/open/floor/iron/grimy, -/area/station/commons/vacant_room/office) "oic" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -44748,6 +46268,12 @@ /obj/structure/sign/warning/electric_shock, /turf/open/floor/plating, /area/station/science/xenobiology) +"oiv" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/table/reinforced, +/obj/item/surgery_tray/full/morgue, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "oiy" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/aisat/service) @@ -44765,8 +46291,24 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/chemistry, /turf/open/floor/iron/smooth, /area/station/maintenance/department/medical/central) +"oiD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/camera/directional/north{ + c_tag = "Arrivals Dock North" + }, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) "oiH" = ( /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "oiK" = ( @@ -44827,6 +46369,16 @@ /obj/structure/lattice/catwalk, /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) +"oji" = ( +/obj/structure/table, +/obj/item/radio{ + pixel_x = -3 + }, +/obj/item/pickaxe, +/obj/item/flashlight, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/medical/morgue) "ojk" = ( /obj/item/stack/ore/iron, /obj/effect/turf_decal/stripes/line{ @@ -44885,6 +46437,11 @@ }, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"okg" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/aft) "okk" = ( /obj/structure/cable, /obj/structure/sign/departments/aisat/directional/east, @@ -44893,19 +46450,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/corner, /area/station/engineering/storage_shared) +"okl" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron, +/area/mine/laborcamp/security) "oko" = ( /obj/effect/turf_decal/siding/wood/end, /obj/structure/bookcase/random/fiction, /turf/open/floor/iron/dark, /area/station/commons/lounge) -"okq" = ( -/obj/machinery/medical_kiosk, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "okx" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/brigdoor{ @@ -44942,6 +46499,11 @@ }, /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) +"okU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "olf" = ( /turf/open/floor/carpet, /area/station/commons/dorms) @@ -44973,6 +46535,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"olQ" = ( +/obj/structure/sign/nanotrasen{ + pixel_y = 32 + }, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/circuit, +/area/station/ai_monitored/command/nuke_storage) "olV" = ( /obj/machinery/light/small/directional/west, /obj/structure/cable, @@ -45019,6 +46588,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"omH" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/locker) "omJ" = ( /obj/machinery/door/airlock{ name = "Perma Overlook Closet" @@ -45026,15 +46602,6 @@ /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/vault, /area/station/security/prison/rec) -"omN" = ( -/obj/machinery/light/directional/east, -/obj/machinery/status_display/evac/directional/east, -/obj/structure/bookcase{ - name = "Holy Bookcase" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "omP" = ( /obj/machinery/door/airlock{ name = "Cleaning Closet" @@ -45067,15 +46634,6 @@ dir = 9 }, /area/station/science/research) -"onj" = ( -/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, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "ons" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -45096,10 +46654,15 @@ }, /turf/open/floor/plating, /area/station/security/courtroom) -"onW" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/command/heads_quarters/rd) +"onQ" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"ooa" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) "ooe" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -45130,6 +46693,21 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/external, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"oor" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/machinery/door/airlock/multi_tile/public/glass{ + name = "Arrivals Dock"; + dir = 4 + }, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/secondary/entry) "oot" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 4 @@ -45145,14 +46723,6 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) -"ooO" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/landmark/blobstart, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "ooR" = ( /obj/structure/table, /obj/machinery/cell_charger, @@ -45177,12 +46747,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/cmo) -"opl" = ( -/obj/structure/rack, -/obj/item/clothing/suit/hazardvest, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/construction) "opm" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -45226,14 +46790,6 @@ dir = 1 }, /area/station/service/chapel) -"opx" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/poster/official/wtf_is_co2/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "opB" = ( /obj/structure/table, /obj/item/raw_anomaly_core/random{ @@ -45265,6 +46821,14 @@ }, /turf/open/floor/iron, /area/station/science/ordnance/testlab) +"opS" = ( +/obj/machinery/vending/wardrobe/sec_wardrobe, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/customs/auxiliary) "oqb" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/machinery/power/apc/auto_name/directional/west, @@ -45278,6 +46842,22 @@ /obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1, /turf/open/floor/iron/dark, /area/station/engineering/atmos/storage) +"oqd" = ( +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas{ + pixel_x = -8; + pixel_y = 4 + }, +/obj/structure/table, +/obj/machinery/door_buttons/access_button, +/obj/item/clothing/mask/gas{ + pixel_x = 6; + pixel_y = 2 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/science/xenobiology) "oqg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -45285,6 +46865,15 @@ }, /turf/open/floor/wood, /area/station/commons/dorms) +"oqj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plastic, +/area/station/commons/dorms/laundry) "oqy" = ( /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/delivery, @@ -45307,6 +46896,11 @@ /obj/effect/landmark/start/station_engineer, /turf/open/floor/iron, /area/station/engineering/main) +"oqJ" = ( +/obj/structure/sign/warning/docking/directional/north, +/obj/structure/flora/grass/green/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "oqL" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/hollow/reinforced/middle, @@ -45333,6 +46927,16 @@ }, /turf/open/floor/iron/dark, /area/mine/storage) +"oqT" = ( +/obj/machinery/airalarm/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/sofa/right/brown{ + dir = 1 + }, +/obj/machinery/newscaster/directional/east, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/break_room) "orf" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -45394,20 +46998,10 @@ /turf/open/floor/iron/dark/textured_edge{ dir = 4 }, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) "orK" = ( /turf/open/floor/iron/grimy, /area/station/ai_monitored/turret_protected/aisat_interior) -"orP" = ( -/obj/effect/landmark/blobstart, -/obj/machinery/camera{ - c_tag = "Virology Pen"; - dir = 9; - network = list("ss13","medbay") - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply, -/turf/open/floor/grass, -/area/station/medical/virology) "orS" = ( /obj/effect/turf_decal/stripes/asteroid/line{ dir = 10 @@ -45432,6 +47026,23 @@ /obj/effect/landmark/start/hangover/closet, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"osd" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/wood, +/area/station/service/library) +"ose" = ( +/obj/machinery/vending/tool, +/obj/effect/turf_decal/bot, +/obj/structure/sign/poster/official/build/directional/north, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron/dark, +/area/station/commons/storage/primary) "osm" = ( /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/dark, @@ -45452,6 +47063,7 @@ /obj/effect/mapping_helpers/airlock/unres{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "osr" = ( @@ -45464,11 +47076,6 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/virology) -"osD" = ( -/obj/structure/chair/stool/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/maintenance/disposal) "osI" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/purple/visible, @@ -45515,6 +47122,24 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/courtroom) +"otC" = ( +/obj/structure/railing, +/turf/open/genturf, +/area/icemoon/surface/outdoors/unexplored/rivers/no_monsters) +"otG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/entry) +"otK" = ( +/obj/machinery/light_switch/directional/west, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/station/science/robotics/lab) "otQ" = ( /obj/structure/sign/poster/official/random/directional/east, /turf/open/floor/iron, @@ -45538,6 +47163,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/mine/eva) +"oul" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/treatment_center) "ous" = ( /obj/machinery/door/airlock/security/glass{ name = "N2O Storage" @@ -45575,13 +47207,16 @@ }, /turf/open/floor/iron/white, /area/station/science/genetics) -"ouZ" = ( -/obj/machinery/computer/cargo, -/obj/effect/turf_decal/tile/brown/half/contrasted{ +"ovm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue{ dir = 1 }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) "ovt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -45592,15 +47227,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"ovF" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron/dark/side, -/area/mine/eva/lower) "ovP" = ( /turf/open/genturf/orange, /area/icemoon/underground/unexplored/no_rivers) @@ -45615,22 +47241,6 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/security/lockers) -"ovX" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/end, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/textured, -/area/station/medical/medbay/central) -"owe" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) "owf" = ( /obj/effect/turf_decal/stripes/white/line, /obj/effect/decal/cleanable/dirt, @@ -45640,6 +47250,20 @@ /obj/machinery/newscaster/directional/east, /turf/open/floor/iron, /area/station/security/prison/workout) +"owk" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/customs/auxiliary) +"owr" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "owv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -45657,11 +47281,6 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark, /area/station/commons/fitness) -"oxa" = ( -/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) "oxe" = ( /obj/machinery/computer/cargo/request, /obj/effect/turf_decal/tile/brown/half/contrasted, @@ -45752,15 +47371,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/dark, /area/station/engineering/atmos/storage/gas) -"oyl" = ( -/obj/structure/table, -/obj/structure/bedsheetbin, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms/laundry) "oyp" = ( /obj/machinery/recharger{ pixel_y = 4 @@ -45768,6 +47378,13 @@ /obj/structure/table, /turf/open/floor/wood, /area/station/command/meeting_room) +"oyv" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/commons/dorms) "oyy" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 1 @@ -45819,6 +47436,12 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"ozb" = ( +/obj/structure/table/reinforced, +/obj/item/folder/white, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "ozn" = ( /obj/machinery/photocopier, /turf/open/floor/iron/dark, @@ -45841,12 +47464,6 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/smooth_half, /area/station/command/heads_quarters/rd) -"ozC" = ( -/obj/effect/turf_decal/bot_white, -/obj/structure/sign/warning/secure_area/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/gateway) "ozD" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/brown/half/contrasted, @@ -45879,14 +47496,17 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 6 }, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"ozU" = ( +"ozV" = ( +/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/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/maintenance/port/fore) +/turf/open/floor/plating, +/area/station/maintenance/department/chapel) "ozX" = ( /obj/machinery/hydroponics/soil, /turf/open/floor/grass, @@ -45910,12 +47530,6 @@ "oAh" = ( /turf/open/floor/glass/reinforced, /area/station/security/brig/entrance) -"oAk" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "oAl" = ( /obj/machinery/door/airlock/atmos/glass{ name = "Atmospherics" @@ -45946,6 +47560,14 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"oAA" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/effect/turf_decal/box/red, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/office) "oAD" = ( /obj/effect/turf_decal/trimline/dark_green/arrow_ccw{ dir = 4 @@ -45967,15 +47589,21 @@ /obj/machinery/portable_atmospherics/canister/bz, /turf/open/floor/plating, /area/station/security/prison/safe) +"oAY" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Armory - Internal - Lower" + }, +/obj/structure/rack, +/obj/item/storage/toolbox/drone, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/ai_monitored/security/armory) "oBg" = ( /obj/structure/table/wood, /obj/item/book/bible, /turf/open/floor/iron/dark, /area/station/service/chapel/office) -"oBi" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/starboard/upper) "oBl" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -45994,17 +47622,26 @@ }, /turf/open/floor/iron/dark, /area/mine/eva/lower) +"oBo" = ( +/obj/machinery/button/flasher{ + id = "transferflash"; + pixel_x = 23; + pixel_y = 9 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/item/radio/intercom/directional/east{ + pixel_y = -6 + }, +/turf/open/floor/iron/smooth, +/area/station/security/execution/transfer) "oBp" = ( -/obj/machinery/disposal/bin, /obj/effect/turf_decal/stripes/line{ dir = 9 }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, /obj/machinery/camera/directional/south{ c_tag = "Service Hallway - Upper West" }, +/obj/structure/table, /turf/open/floor/plating, /area/station/hallway/secondary/service) "oBs" = ( @@ -46030,6 +47667,10 @@ }, /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) +"oBI" = ( +/obj/machinery/light/floor, +/turf/open/floor/carpet, +/area/station/service/library) "oBP" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -46040,14 +47681,12 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) -"oCj" = ( -/obj/structure/table/wood, -/obj/item/camera_film{ - pixel_x = -4; - pixel_y = 4 - }, -/turf/open/floor/iron/grimy, -/area/station/commons/vacant_room/office) +"oCl" = ( +/obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore) "oCs" = ( /obj/structure/table, /obj/item/toy/figure/virologist{ @@ -46080,6 +47719,22 @@ /obj/item/stack/cable_coil/five, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"oCA" = ( +/obj/structure/closet/secure_closet/cytology, +/obj/machinery/button/door/directional/north{ + id = "xenobiomain"; + name = "Containment Blast Doors"; + pixel_y = 32; + req_access = list("xenobiology") + }, +/obj/machinery/button/door/directional/north{ + id = "misclab"; + name = "Test Chamber Blast Doors"; + pixel_y = 23; + req_access = list("xenobiology") + }, +/turf/open/floor/glass/reinforced, +/area/station/science/xenobiology) "oCF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -46088,13 +47743,6 @@ "oCO" = ( /turf/closed/wall, /area/station/service/hydroponics/garden) -"oCR" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) "oCT" = ( /obj/item/instrument/harmonica, /obj/structure/flora/bush/fullgrass/style_random, @@ -46180,6 +47828,12 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/plating, /area/mine/laborcamp) +"oDH" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white/side{ + dir = 8 + }, +/area/station/maintenance/port/fore) "oDJ" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -46194,6 +47848,16 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/medical/chemistry) +"oDV" = ( +/obj/structure/closet, +/obj/item/radio/intercom/directional/east, +/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover/closet, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "oEh" = ( /obj/effect/turf_decal/tile/neutral/diagonal_edge, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -46244,6 +47908,10 @@ /obj/machinery/meter, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"oFl" = ( +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/department/chapel) "oFp" = ( /obj/structure/sign/warning/docking/directional/west, /obj/effect/decal/cleanable/dirt, @@ -46308,6 +47976,21 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) +"oGn" = ( +/obj/structure/reagent_dispensers/watertank/high, +/obj/effect/turf_decal/stripes/line, +/obj/item/reagent_containers/cup/watering_can, +/obj/effect/turf_decal/tile/blue/half{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green/half{ + dir = 8 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/half{ + dir = 1 + }, +/area/station/service/hydroponics) "oGs" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -46321,6 +48004,24 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"oGy" = ( +/obj/structure/rack, +/obj/item/clothing/mask/gas{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) "oGB" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -46332,18 +48033,6 @@ dir = 8 }, /area/station/security/prison) -"oGE" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white/corner{ - dir = 1 - }, -/area/station/commons/storage/art) "oGF" = ( /obj/structure/closet/crate/bin, /obj/effect/decal/cleanable/dirt, @@ -46362,32 +48051,6 @@ }, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) -"oGR" = ( -/obj/item/radio/intercom/directional/north, -/obj/structure/reagent_dispensers/plumbed{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/service) -"oGS" = ( -/obj/structure/table/wood, -/obj/machinery/libraryscanner{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/effect/turf_decal/siding/wood/corner, -/obj/machinery/light/small/directional/east, -/turf/open/floor/wood, -/area/station/service/library) -"oGX" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/locker) "oHh" = ( /obj/machinery/shower/directional/north, /obj/structure/window/reinforced/spawner/directional/west, @@ -46397,19 +48060,18 @@ /obj/item/soap/nanotrasen, /turf/open/floor/iron/freezer, /area/station/maintenance/starboard/fore) +"oHo" = ( +/obj/machinery/atmospherics/components/binary/pump/on/supply/hidden/layer4{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "oHp" = ( /obj/machinery/camera/directional/west{ c_tag = "Engineering Escape Pod" }, /turf/open/floor/plating, /area/station/engineering/storage_shared) -"oHG" = ( -/obj/item/flashlight/lantern, -/obj/machinery/light/directional/south, -/obj/structure/table/wood, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "oHH" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -46417,26 +48079,28 @@ "oHK" = ( /turf/closed/wall/r_wall, /area/station/science/lab) -"oHU" = ( -/obj/structure/closet/toolcloset, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) "oHV" = ( /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/dark, /area/station/service/chapel) -"oId" = ( -/obj/machinery/light/directional/north, -/obj/machinery/recharge_station, -/obj/effect/turf_decal/stripes/box, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/medbay/aft) +"oHY" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/status_display/shuttle{ + pixel_x = -32; + shuttle_id = "arrival" + }, +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/hallway/secondary/entry) "oIB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -46483,6 +48147,13 @@ /obj/structure/flora/bush/snow/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) +"oJH" = ( +/obj/structure/marker_beacon/burgundy, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "oJP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/dark_green, @@ -46491,23 +48162,30 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) -"oJS" = ( -/obj/structure/hoop{ - dir = 4 +"oJT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron/dark/smooth_corner{ + dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/warm/directional/west, -/turf/open/floor/iron, -/area/station/security/prison/workout) +/area/station/command/gateway) "oKb" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; id = "pharmacy_shutters3"; - name = "Pharmacy Shutters"; - dir = 1 + name = "Pharmacy Shutters" }, /turf/open/floor/plating, /area/station/service/kitchen) +"oKu" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/warning/docking/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "oKv" = ( /obj/item/trash/popcorn, /turf/open/floor/plating, @@ -46527,6 +48205,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"oKL" = ( +/obj/machinery/door/airlock/public/glass/incinerator/atmos_exterior, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/turf/open/floor/engine/vacuum, +/area/station/maintenance/disposal/incinerator) "oKY" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/plating, @@ -46542,6 +48229,13 @@ "oLg" = ( /turf/open/floor/iron/white/corner, /area/station/science/research) +"oLj" = ( +/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/north, +/turf/open/floor/iron, +/area/mine/laborcamp) "oLn" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -46551,6 +48245,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"oLo" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/spawner/random/structure/closet_private, +/turf/open/floor/iron/grimy, +/area/station/commons/vacant_room/office) "oLs" = ( /obj/effect/turf_decal/stripes/asteroid/line{ dir = 5 @@ -46577,16 +48279,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"oLC" = ( +/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, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "oLG" = ( /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) -"oLI" = ( -/obj/structure/table/wood, -/turf/open/floor/iron/grimy, -/area/station/hallway/secondary/entry) "oLJ" = ( /obj/machinery/door/airlock/hatch{ name = "MiniSat Foyer" @@ -46621,6 +48328,13 @@ dir = 8 }, /area/station/security/brig/entrance) +"oMa" = ( +/obj/structure/marker_beacon/burgundy, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "oMd" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -46637,18 +48351,29 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"oMq" = ( +/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/corner{ + dir = 1 + }, +/area/station/hallway/secondary/entry) "oMs" = ( /obj/effect/spawner/random/trash/mess, /turf/open/floor/iron/grimy, /area/station/maintenance/aft/greater) -"oMN" = ( -/obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{ - color = "#0000ff"; - dir = 8; - name = "Supply multi deck pipe adapter" +"oMG" = ( +/obj/effect/turf_decal/trimline/green/filled/line, +/obj/effect/turf_decal/trimline/blue/filled/warning, +/obj/effect/turf_decal/siding/white{ + dir = 4 }, -/turf/open/floor/plating, -/area/station/medical/chemistry) +/obj/machinery/camera/directional/south{ + c_tag = "Service Botany - Lower South" + }, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics) "oMO" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -46681,17 +48406,12 @@ "oMT" = ( /turf/open/floor/iron, /area/station/command/heads_quarters/rd) -"oNj" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/table/reinforced, -/obj/item/storage/backpack/duffelbag/med/surgery, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "oNp" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 9 }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) "oNA" = ( @@ -46702,6 +48422,17 @@ /obj/machinery/light/small/directional/west, /turf/open/openspace, /area/station/service/chapel) +"oNE" = ( +/obj/structure/closet/crate, +/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/sign/poster/official/random/directional/south, +/turf/open/floor/iron, +/area/station/science/explab) "oNO" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/meter, @@ -46718,20 +48449,10 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"oOj" = ( -/obj/machinery/light/directional/west, -/obj/structure/closet/secure_closet/freezer/gulag_fridge, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"oOk" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +"oOb" = ( +/obj/structure/sign/warning/fire/directional/north, +/turf/open/floor/glass/reinforced, +/area/station/science/ordnance/office) "oOo" = ( /obj/structure/closet/firecloset, /obj/machinery/light/directional/west, @@ -46762,6 +48483,23 @@ /obj/structure/sign/warning/secure_area/directional/south, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat_interior) +"oOP" = ( +/obj/effect/turf_decal/siding/thinplating_new/corner, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/white/side{ + dir = 8 + }, +/area/station/hallway/secondary/entry) +"oOQ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/turf/open/floor/iron/dark/side, +/area/mine/eva) "oPa" = ( /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, @@ -46778,21 +48516,6 @@ /obj/item/soap/nanotrasen, /turf/open/floor/iron/dark, /area/station/security/execution/education) -"oPo" = ( -/obj/machinery/firealarm/directional/west, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/closet/firecloset, -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/main) "oPq" = ( /obj/machinery/cell_charger{ pixel_y = 5 @@ -46817,12 +48540,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"oPx" = ( -/obj/machinery/rnd/production/protolathe/department/engineering, -/obj/machinery/airalarm/directional/east, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/lobby) "oPI" = ( /turf/open/floor/circuit, /area/station/ai_monitored/command/nuke_storage) @@ -46838,15 +48555,14 @@ /area/station/engineering/lobby) "oQa" = ( /obj/structure/table, -/obj/item/food/cheesiehonkers, /obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/item/storage/box/bandages{ + pixel_y = 6; + pixel_x = -6 + }, +/obj/item/food/cheesiehonkers, /turf/open/floor/iron, /area/station/cargo/office) -"oQg" = ( -/obj/structure/chair/pew/left, -/obj/machinery/light/warm/directional/west, -/turf/open/floor/wood, -/area/station/security/prison/rec) "oQn" = ( /obj/structure/chair/sofa/corp/left{ dir = 8 @@ -46869,10 +48585,11 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"oQv" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/maintenance/disposal) +"oQt" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/icemoon, +/area/station/maintenance/port/lesser) "oQx" = ( /turf/open/floor/iron/smooth_half, /area/station/command/heads_quarters/rd) @@ -46918,6 +48635,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) +"oRu" = ( +/obj/item/stack/medical/mesh, +/obj/item/wrench/medical, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/structure/table/glass, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/cryo) "oRw" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -46937,6 +48662,17 @@ }, /turf/open/floor/iron, /area/station/cargo/office) +"oRE" = ( +/obj/machinery/conveyor{ + dir = 10; + id = "garbage" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "oRM" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -46987,6 +48723,20 @@ /obj/structure/stairs/south, /turf/open/floor/iron/dark/textured, /area/station/security/prison) +"oSI" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/station/hallway/secondary/service) +"oSQ" = ( +/obj/machinery/camera{ + c_tag = "Medbay Stasis Center North"; + network = list("ss13","medbay") + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "oSR" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -47022,6 +48772,23 @@ /obj/structure/flora/grass/green/style_random, /turf/open/misc/asteroid/snow/standard_air, /area/station/hallway/secondary/exit/departure_lounge) +"oTc" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/radio/intercom/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/entry) +"oTd" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Research Division Testing Lab - Chamber"; + network = list("test","rd") + }, +/turf/open/floor/engine, +/area/station/science/explab) "oTe" = ( /obj/structure/table/wood, /obj/item/trapdoor_remote/preloaded{ @@ -47069,33 +48836,26 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"oTK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/maintenance/starboard/fore) -"oUi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/flashlight/lamp{ - on = 0 +"oTM" = ( +/obj/item/flashlight/lantern, +/obj/structure/table/wood, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"oTS" = ( +/obj/structure/showcase/cyborg/old{ + dir = 8; + pixel_x = 9; + pixel_y = 2 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 }, -/turf/open/floor/wood, -/area/station/maintenance/aft/greater) -"oUr" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/turf/open/floor/iron/white/corner, -/area/station/hallway/secondary/entry) -"oUE" = ( -/obj/item/radio/intercom/directional/west, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/commons/storage/mining) +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) "oUG" = ( /obj/machinery/door/airlock{ id_tag = "Toilet2"; @@ -47144,10 +48904,22 @@ /turf/open/floor/iron/freezer, /area/station/commons/toilet) "oVf" = ( -/obj/effect/landmark/start/shaft_miner, +/obj/machinery/door/airlock/mining/glass{ + id_tag = "innercargo"; + name = "Bitrunning Den" + }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, /turf/open/floor/iron, -/area/station/cargo/miningdock) +/area/station/bitrunning/den) +"oVt" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/construction) "oVy" = ( /obj/machinery/door/airlock/security{ name = "Permabrig Lab" @@ -47164,21 +48936,31 @@ }, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) -"oVK" = ( -/obj/structure/chair/plastic{ - dir = 8 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Mining B-1 Crater Observatory Access" +"oVG" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Art Storage" }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron, -/area/mine/living_quarters) +/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, +/turf/open/floor/iron/textured, +/area/station/commons/storage/art) "oVR" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, /area/station/command/bridge) +"oVX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/newscaster/directional/south, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/entry) "oVY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47189,19 +48971,6 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark/textured, /area/station/security/prison/rec) -"oWj" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/north{ - c_tag = "Atmospherics Storage Room - North" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage) "oWk" = ( /obj/machinery/door/firedoor/border_only{ dir = 8 @@ -47215,16 +48984,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/closed/wall/r_wall, /area/station/engineering/atmos/storage/gas) -"oWP" = ( -/obj/structure/disposalpipe/segment, -/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, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/red, +"oWu" = ( +/obj/structure/closet/wardrobe/grey, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/calendar/directional/west, /turf/open/floor/iron, -/area/station/hallway/primary/central/fore) +/area/station/commons/locker) +"oWN" = ( +/obj/machinery/requests_console/auto_name/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/chair/stool/directional/west, +/turf/open/floor/iron, +/area/station/commons/locker) "oWQ" = ( /obj/structure/table, /obj/item/stack/sheet/iron/fifty, @@ -47258,6 +49029,25 @@ /obj/structure/table/wood, /turf/open/floor/stone, /area/station/service/bar) +"oXf" = ( +/obj/structure/closet/secure_closet/medical1, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/station/maintenance/port/fore) +"oXg" = ( +/obj/effect/turf_decal/tile/dark_green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) "oXk" = ( /turf/open/floor/carpet, /area/station/service/theater) @@ -47266,6 +49056,10 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"oXo" = ( +/obj/effect/mapping_helpers/turn_off_lights_with_lightswitch, +/turf/open/floor/iron/smooth_large, +/area/station/cargo/warehouse) "oXq" = ( /turf/open/floor/iron/white, /area/station/medical/cryo) @@ -47291,11 +49085,26 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/white, /area/station/medical/virology) +"oXB" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/storage/medkit/regular, +/obj/item/razor{ + pixel_y = 5 + }, +/turf/open/floor/iron, +/area/station/commons/locker) "oXJ" = ( /obj/machinery/newscaster/directional/north, /obj/item/kirbyplants/random, /turf/open/floor/iron/dark, /area/station/science/breakroom) +"oXL" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/hallway/primary/starboard) "oXS" = ( /obj/structure/chair/stool/directional/north, /turf/open/floor/wood/parquet, @@ -47320,6 +49129,17 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"oYa" = ( +/obj/structure/closet/secure_closet/personal{ + anchored = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/thinplating_new/corner{ + dir = 4 + }, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron, +/area/station/commons/locker) "oYc" = ( /obj/structure/chair/wood/wings{ dir = 8 @@ -47350,10 +49170,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) -"oYv" = ( -/obj/machinery/bluespace_vendor/directional/south, -/turf/open/floor/iron, -/area/station/commons/locker) "oYx" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, @@ -47362,6 +49178,7 @@ /obj/effect/mapping_helpers/airlock/unres{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "oYH" = ( @@ -47397,12 +49214,42 @@ dir = 4 }, /area/station/security/prison) +"oZL" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Mix to Engine" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "oZR" = ( /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/textured_edge, /area/station/security/prison) +"oZW" = ( +/obj/machinery/newscaster/directional/south, +/obj/machinery/computer/department_orders/science{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/science/lab) +"pac" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark/textured_edge{ + dir = 4 + }, +/area/station/security/prison) +"pao" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) "par" = ( /obj/structure/toilet/greyscale, /obj/machinery/airalarm/directional/east, @@ -47428,22 +49275,12 @@ "paM" = ( /turf/closed/wall, /area/station/engineering/storage/tech) -"paR" = ( -/obj/machinery/space_heater, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/mine/eva/lower) "paT" = ( /obj/machinery/door/poddoor/preopen{ id = "maint3" }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"paV" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "paZ" = ( /obj/structure/closet/wardrobe/black, /obj/item/clothing/shoes/jackboots, @@ -47465,13 +49302,6 @@ "pbs" = ( /turf/closed/wall, /area/station/ai_monitored/turret_protected/aisat/maint) -"pbu" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "pbv" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/machinery/conveyor_switch/oneway{ @@ -47497,6 +49327,19 @@ }, /turf/open/floor/iron, /area/station/security/prison/garden) +"pbD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/duct, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/station/hallway/secondary/service) +"pbE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron, +/area/station/construction) "pbH" = ( /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, @@ -47523,6 +49366,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"pcc" = ( +/obj/item/stack/spacecash/c10{ + pixel_y = 4; + pixel_x = 4 + }, +/obj/item/toy/plush/beeplushie{ + pixel_y = -6; + name = "Coolidge" + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/commons/dorms/laundry) "pcg" = ( /obj/machinery/computer/apc_control{ dir = 4 @@ -47587,13 +49442,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/mine/laborcamp/security) +"pdd" = ( +/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, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "pdf" = ( /turf/open/floor/plating, /area/station/maintenance/port/greater) "pdx" = ( -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, +/obj/item/kirbyplants/organic/plant10, /turf/open/floor/sepia, /area/station/security/prison/rec) "pdy" = ( @@ -47691,6 +49551,18 @@ dir = 1 }, /area/station/security/prison) +"peG" = ( +/obj/effect/spawner/random/structure/girder, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) +"peM" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) "peV" = ( /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, @@ -47703,33 +49575,14 @@ /obj/structure/grille/broken, /turf/open/openspace/icemoon/keep_below, /area/icemoon/underground/explored) -"pfj" = ( -/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{ +"pfn" = ( +/obj/structure/sign/poster/official/work_for_a_future/directional/north, +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms/laundry) -"pfs" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/turf/open/floor/iron, +/area/station/security/prison/visit) "pfw" = ( /obj/structure/flora/grass/green/style_random, /turf/open/misc/asteroid/snow/icemoon, @@ -47741,6 +49594,22 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"pfD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/station/engineering/storage/tech) +"pfJ" = ( +/obj/structure/sink/directional/east, +/obj/machinery/button/door/directional/west{ + id = "xenobio2"; + layer = 4; + name = "Xenobio Pen 2 Blast Door"; + req_access = list("xenobiology") + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "pfO" = ( /obj/structure/chair/stool/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47752,11 +49621,6 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/maintenance/department/electrical) -"pgi" = ( -/obj/machinery/status_display/evac/directional/west, -/obj/machinery/light/small/directional/west, -/turf/open/floor/wood, -/area/station/service/library) "pgo" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 10 @@ -47765,6 +49629,23 @@ initial_gas_mix = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored) +"pgw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/requests_console/directional/south{ + department = "Bridge"; + name = "Bridge Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/wood, +/area/station/command/meeting_room) +"pgE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/steam_vent, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "pgG" = ( /obj/structure/table, /obj/item/clothing/gloves/color/orange, @@ -47784,6 +49665,14 @@ /obj/effect/decal/cleanable/blood/splatter, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"phf" = ( +/obj/item/assembly/timer{ + pixel_x = -3; + pixel_y = 15 + }, +/obj/structure/table, +/turf/open/floor/wood, +/area/station/command/meeting_room) "phj" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -47793,6 +49682,25 @@ }, /turf/open/floor/iron/white, /area/station/medical/break_room) +"phu" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/station/hallway/secondary/entry) +"phB" = ( +/obj/machinery/vending/coffee, +/obj/structure/sign/poster/official/science/directional/south, +/turf/open/floor/iron/dark, +/area/station/science/breakroom) "phK" = ( /obj/effect/spawner/random/contraband/prison, /turf/open/floor/plating, @@ -47822,6 +49730,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/carpet, /area/station/service/theater) +"pib" = ( +/obj/machinery/camera/motion/directional/south{ + c_tag = "Vault"; + network = list("vault") + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) "pie" = ( /obj/machinery/camera/directional/north{ c_tag = "Engineering Access" @@ -47829,6 +49747,13 @@ /obj/structure/closet/radiation, /turf/open/floor/iron/dark, /area/station/engineering/main) +"pig" = ( +/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/commons/locker) "pii" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -47850,16 +49775,6 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/service/hydroponics) -"piy" = ( -/obj/machinery/door/airlock/external{ - name = "Common Mining Shuttle Bay"; - space_dir = 8 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) "piB" = ( /obj/structure/sign/warning/electric_shock/directional/north, /obj/effect/turf_decal/stripes/corner{ @@ -47884,6 +49799,15 @@ /obj/item/pillow/random, /turf/open/floor/carpet, /area/station/commons/dorms) +"piD" = ( +/obj/machinery/computer/security/labor, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/mine/laborcamp/security) "piI" = ( /obj/machinery/airalarm/directional/south, /obj/machinery/camera{ @@ -47924,15 +49848,11 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/office) -"piU" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Armory - Internal - Lower" - }, -/obj/structure/rack, -/obj/item/storage/toolbox/drone, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +"piP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/grimy, +/area/station/hallway/secondary/entry) "piV" = ( /obj/machinery/button/door/directional/south{ id = "Cargo_Store_In"; @@ -47941,6 +49861,13 @@ }, /turf/open/floor/iron/smooth_large, /area/station/cargo/warehouse) +"piX" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Cargo Bay North" + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/cargo/storage) "pja" = ( /obj/structure/rack, /obj/item/pickaxe, @@ -47958,6 +49885,26 @@ /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/iron/dark, /area/station/science/ordnance/freezerchamber) +"pjg" = ( +/obj/item/instrument/saxophone, +/obj/machinery/computer/security/telescreen/entertainment/directional/north, +/obj/item/instrument/piano_synth, +/obj/structure/table/wood, +/obj/machinery/camera{ + c_tag = "Service Theater"; + dir = 9 + }, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"pji" = ( +/obj/structure/cable, +/obj/machinery/camera/directional/east{ + c_tag = "Locker Room East" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron, +/area/station/commons/locker) "pjj" = ( /obj/structure/chair, /turf/open/floor/plating/snowed/icemoon, @@ -48022,12 +49969,6 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"pkM" = ( -/obj/machinery/light/directional/south, -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/station/commons/dorms) "pkN" = ( /obj/structure/railing, /obj/effect/mapping_helpers/burnt_floor, @@ -48038,6 +49979,14 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"pkQ" = ( +/obj/machinery/atmospherics/components/unary/bluespace_sender, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/showroomfloor, +/area/station/engineering/atmos) "pkW" = ( /obj/effect/turf_decal/plaque{ icon_state = "L4" @@ -48082,15 +50031,16 @@ }, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"pmb" = ( -/obj/machinery/door/airlock/public/glass/incinerator/atmos_exterior, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 +"plX" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 4 }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/iron/dark, +/area/station/science/ordnance) "pmg" = ( /obj/effect/turf_decal/siding/white{ dir = 1 @@ -48143,6 +50093,10 @@ /obj/structure/flora/grass/brown/style_random, /turf/open/misc/asteroid/snow/standard_air, /area/station/science/research) +"pnz" = ( +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron, +/area/station/commons/storage/mining) "pnA" = ( /obj/machinery/airalarm/directional/north, /obj/structure/rack, @@ -48182,6 +50136,34 @@ /obj/structure/sign/poster/contraband/random/directional/north, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"poe" = ( +/obj/machinery/door/airlock/security/glass{ + id_tag = "permainner"; + name = "Permabrig Transfer" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "perma-entrance" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/security/brig, +/turf/open/floor/iron/dark/textured, +/area/station/security/execution/transfer) +"pog" = ( +/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/directional/north, +/obj/machinery/light_switch/directional/north{ + pixel_x = 6 + }, +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/dorms/laundry) "pou" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, @@ -48196,14 +50178,23 @@ "poy" = ( /turf/open/floor/carpet/green, /area/station/service/library) +"poK" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 8 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron, +/area/station/commons/locker) "poY" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, /obj/effect/landmark/event_spawn, /obj/machinery/door/window/brigdoor/left/directional/west{ - req_access = list("morgue_secure"); - name = "Coroner's Office" + name = "Coroner's Office"; + req_access = list("morgue_secure") }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -48252,14 +50243,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/cargo/drone_bay) -"ppt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) "ppD" = ( /obj/structure/chair/office{ dir = 8 @@ -48267,15 +50250,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/tcommsat/computer) -"ppE" = ( -/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/plating, -/area/station/maintenance/port/greater) "ppK" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/tile/yellow{ @@ -48283,10 +50257,15 @@ }, /turf/open/floor/iron, /area/station/command/bridge) -"ppN" = ( -/obj/structure/sign/warning/pods, -/turf/closed/wall, -/area/station/hallway/secondary/entry) +"ppQ" = ( +/obj/structure/table, +/obj/item/clothing/gloves/latex, +/obj/item/surgical_drapes, +/obj/item/razor, +/obj/machinery/status_display/evac/directional/west, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) "ppS" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -48297,18 +50276,6 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"ppU" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Security - Permabrig Observation Prep"; - network = list("ss13","prison") - }, -/obj/structure/sign/poster/official/safety_internals/directional/west, -/turf/open/floor/vault, -/area/station/security/prison/rec) -"pqa" = ( -/obj/structure/table/wood, -/turf/open/floor/carpet, -/area/station/hallway/secondary/entry) "pqc" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 6 @@ -48316,12 +50283,6 @@ /obj/machinery/meter, /turf/open/floor/iron, /area/station/engineering/atmos) -"pqk" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/directional/west, -/obj/machinery/pipedispenser/disposal, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "pql" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -48357,11 +50318,6 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"pqD" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/cargo/storage) "pqK" = ( /obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/plating, @@ -48369,11 +50325,6 @@ "pra" = ( /turf/open/floor/iron/dark, /area/station/science/robotics/lab) -"prb" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/locker) "prf" = ( /obj/structure/closet/crate, /obj/effect/spawner/random/maintenance/two, @@ -48382,14 +50333,18 @@ "prg" = ( /turf/open/floor/wood, /area/station/service/library) -"pry" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +"prs" = ( +/obj/docking_port/stationary{ + dir = 8; + dwidth = 3; + height = 15; + name = "arrivals"; + roundstart_template = /datum/map_template/shuttle/arrival/box; + shuttle_id = "arrival_stationary"; + width = 7 }, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "prE" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -48409,18 +50364,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/science/xenobiology) -"prX" = ( -/obj/structure/chair/stool/directional/south, -/obj/machinery/flasher/directional/west{ - id = "GulagCell 1" - }, -/obj/structure/sign/poster/official/obey/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/laborcamp) "psb" = ( /turf/closed/wall/ice, /area/icemoon/underground/explored) @@ -48435,17 +50378,10 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"psr" = ( -/obj/item/storage/bag/plants/portaseeder, -/obj/structure/table/glass, -/obj/item/plant_analyzer, -/obj/item/radio/intercom/directional/east, -/obj/machinery/light_switch/directional/south, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden) +"psp" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron, +/area/station/commons/locker) "pst" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, @@ -48531,7 +50467,7 @@ /turf/open/floor/plating, /area/station/engineering/engine_smes) "ptB" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 8 }, /turf/open/floor/wood, @@ -48563,6 +50499,15 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"puc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/iron, +/area/station/security/prison/mess) "pue" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/effect/turf_decal/tile/red, @@ -48589,6 +50534,17 @@ /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/open/floor/plating, /area/station/engineering/atmos) +"puB" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Medbay Maintenance" + }, +/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/mapping_helpers/airlock/access/all/medical/cmo, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "puN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48599,6 +50555,26 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"puX" = ( +/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 + }, +/obj/machinery/light/small/directional/east, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/dark, +/area/station/cargo/drone_bay) "pve" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -48650,17 +50626,12 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) -"pvT" = ( -/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/structure/disposalpipe/sorting/mail/flip{ - dir = 4 +"pvJ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 }, -/obj/effect/mapping_helpers/mail_sorting/service/theater, -/turf/open/floor/wood/parquet, -/area/station/commons/lounge) +/turf/open/floor/eighties/red, +/area/station/security/prison/safe) "pvU" = ( /obj/item/toy/snowball{ pixel_x = 6; @@ -48699,6 +50670,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/command/teleporter) +"pwg" = ( +/obj/effect/spawner/random/structure/closet_maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "pwn" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -48714,13 +50689,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron/dark/smooth_large, /area/station/security/processing) -"pwu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) "pwv" = ( /obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{ color = "#0000ff"; @@ -48754,6 +50722,12 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) +"pwG" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/construction) "pwH" = ( /obj/structure/chair/stool/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48859,22 +50833,15 @@ /obj/effect/spawner/random/techstorage/security_all, /turf/open/floor/plating, /area/station/engineering/storage/tech) -"pyf" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 6 - }, -/obj/structure/bed{ - dir = 4 - }, -/obj/item/bedsheet/medical{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +"pyc" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/medical/virology) +/obj/effect/landmark/start/depsec/supply, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) "pyj" = ( /obj/effect/turf_decal/siding/white{ dir = 8 @@ -48900,6 +50867,21 @@ }, /turf/open/floor/iron/freezer, /area/station/maintenance/starboard/fore) +"pyG" = ( +/obj/machinery/button/door/directional/east{ + id = "armory"; + name = "Armory Shutters"; + pixel_x = -9; + pixel_y = 30; + req_access = list("armory") + }, +/obj/structure/rack, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/effect/spawner/random/armory/e_gun, +/turf/open/floor/iron/dark/textured, +/area/station/ai_monitored/security/armory/upper) "pyJ" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -48926,6 +50908,10 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/openspace, /area/station/engineering/atmos/storage) +"pza" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/aisat/hallway) "pzb" = ( /obj/machinery/firealarm/directional/north, /turf/open/floor/iron, @@ -48994,16 +50980,6 @@ }, /turf/open/floor/iron/cafeteria, /area/mine/laborcamp) -"pzQ" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "garbage" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "pzV" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -49022,10 +50998,31 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"pAc" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Ordnance Lab Maintenance" + }, +/obj/machinery/door/firedoor/heavy, +/obj/effect/mapping_helpers/airlock/access/all/science/ordnance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/science/ordnance) +"pAp" = ( +/obj/machinery/deepfryer, +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "pAM" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating/snowed/coldroom, /area/station/service/kitchen/coldroom) +"pAN" = ( +/obj/structure/ladder, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/iron/dark/textured_large, +/area/station/maintenance/department/medical/central) "pAT" = ( /obj/machinery/airalarm/directional/north, /obj/effect/decal/cleanable/dirt, @@ -49044,6 +51041,7 @@ /area/station/security/prison/mess) "pBk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/primary/port) "pBr" = ( @@ -49116,21 +51114,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/mine/eva) -"pCU" = ( -/obj/machinery/conveyor_switch/oneway{ - id = "packageSort2" - }, -/obj/machinery/requests_console/directional/west{ - department = "Cargo Bay"; - name = "Cargo Bay Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "pDe" = ( /obj/structure/closet/secure_closet/personal{ anchored = 1 @@ -49153,14 +51136,13 @@ dir = 1 }, /area/station/science/lab) -"pDr" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Aft Primary Hallway South"; - pixel_y = -22 +"pDt" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 }, -/obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron, -/area/station/hallway/primary/aft) +/area/station/hallway/primary/central) "pDy" = ( /obj/structure/table, /obj/structure/cable, @@ -49206,6 +51188,19 @@ "pDW" = ( /turf/open/floor/plating, /area/mine/laborcamp/security) +"pEg" = ( +/obj/machinery/light/small/directional/east, +/obj/structure/table, +/obj/structure/bedsheetbin/empty, +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron, +/area/station/commons/dorms/laundry) "pEq" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/medical{ @@ -49233,6 +51228,37 @@ }, /turf/open/floor/iron/large, /area/station/service/hydroponics/garden) +"pEE" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/structure/table, +/obj/item/pai_card, +/obj/item/taperecorder{ + pixel_x = -3; + pixel_y = 2 + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/rd) +"pER" = ( +/obj/structure/table/wood, +/obj/item/paper_bin/carbon{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/reagent_containers/cup/glass/bottle/whiskey{ + pixel_x = 9; + pixel_y = 7 + }, +/obj/item/hand_labeler{ + pixel_x = -6; + pixel_y = -6 + }, +/obj/item/lighter{ + pixel_x = 8; + pixel_y = -9 + }, +/turf/open/floor/carpet, +/area/station/security/detectives_office) "pEX" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49253,21 +51279,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"pFi" = ( -/obj/machinery/light/directional/east, -/obj/structure/table, -/obj/item/toner, -/obj/item/hand_labeler, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/storage/box, -/obj/item/storage/box, -/obj/item/storage/box, -/obj/effect/spawner/random/bureaucracy/birthday_wrap, -/obj/effect/turf_decal/tile/brown, -/turf/open/floor/iron, -/area/station/cargo/lobby) "pFl" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -49280,30 +51291,14 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/office) -"pFD" = ( -/obj/structure/cable, -/obj/machinery/light/small/directional/south, -/obj/structure/sign/warning/gas_mask/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"pFN" = ( -/obj/structure/chair/stool/directional/east, -/obj/effect/spawner/random/trash/mess, -/obj/machinery/light/small/directional/north, -/obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/iron, -/area/station/maintenance/starboard/fore) "pFV" = ( /obj/structure/railing/corner, /turf/open/floor/iron/smooth, /area/station/maintenance/fore/lesser) "pFW" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/wood, +/obj/structure/filingcabinet/chestdrawer, +/obj/machinery/computer/security/telescreen/entertainment/directional/north, +/turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) "pFZ" = ( /obj/item/target/syndicate, @@ -49312,6 +51307,13 @@ /obj/effect/turf_decal/bot_red, /turf/open/floor/iron/dark/textured, /area/station/security/range) +"pGd" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) "pGf" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 10 @@ -49346,9 +51348,21 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) +"pGy" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden) +"pGJ" = ( +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "pGM" = ( /obj/structure/girder, /obj/structure/grille, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "pGQ" = ( @@ -49387,27 +51401,9 @@ }, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) -"pHi" = ( -/obj/structure/rack, -/obj/item/storage/box/rubbershot{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/storage/box/rubbershot, -/obj/item/storage/box/rubbershot{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) "pHy" = ( /obj/structure/rack, /obj/item/clothing/mask/breath, @@ -49458,7 +51454,7 @@ /turf/open/floor/iron/dark/textured_edge{ dir = 8 }, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) "pHX" = ( /obj/effect/turf_decal/tile/purple{ dir = 8 @@ -49489,6 +51485,10 @@ dir = 10 }, /area/station/science/research) +"pIw" = ( +/obj/machinery/vending/wardrobe/curator_wardrobe, +/turf/open/floor/engine/cult, +/area/station/service/library) "pIF" = ( /obj/structure/rack, /obj/item/lighter, @@ -49500,31 +51500,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) -"pIQ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/duct, -/turf/open/floor/plating, -/area/station/hallway/secondary/service) -"pIX" = ( -/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/commons/vacant_room/office) -"pIZ" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 +"pJb" = ( +/obj/structure/sign/nanotrasen{ + pixel_x = -32 }, -/obj/item/radio/intercom/prison/directional/west, -/turf/open/floor/iron/dark/side{ - dir = 8 +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 }, -/area/station/security/prison) +/obj/structure/marker_beacon/burgundy, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "pJc" = ( /obj/machinery/component_printer, /obj/machinery/camera/directional/west{ @@ -49566,6 +51551,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/access/all/command/hop, +/obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) "pJQ" = ( @@ -49576,6 +51562,15 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos/storage/gas) +"pJU" = ( +/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_smooth, +/area/station/maintenance/port/lesser) "pJV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49611,15 +51606,6 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/plating/snowed/coldroom, /area/station/service/kitchen/coldroom) -"pKs" = ( -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/structure/reagent_dispensers/watertank, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/engine_smes) "pKu" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -49633,6 +51619,14 @@ /obj/effect/landmark/start/chief_medical_officer, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/cmo) +"pKB" = ( +/obj/structure/filingcabinet, +/obj/structure/sign/poster/official/space_cops/directional/west, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/science) "pKJ" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -49667,6 +51661,18 @@ /obj/structure/sign/warning/xeno_mining, /turf/closed/wall/ice, /area/icemoon/surface/outdoors/nospawn) +"pLn" = ( +/obj/effect/turf_decal/tile/blue, +/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/white/corner{ + dir = 8 + }, +/area/station/hallway/secondary/entry) "pLr" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -49705,19 +51711,15 @@ }, /turf/open/floor/iron/freezer, /area/station/commons/toilet/locker) -"pLE" = ( -/obj/effect/spawner/random/trash/graffiti, -/obj/structure/sign/poster/contraband/free_drone/directional/east, +"pLZ" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/food_or_drink/seed, +/obj/structure/closet, +/obj/effect/spawner/random/food_or_drink/seed, +/obj/effect/spawner/random/trash/botanical_waste, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"pLO" = ( -/obj/machinery/status_display/evac/directional/east, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "pMg" = ( /obj/machinery/door/airlock/external{ name = "Labor Camp Shuttle Airlock"; @@ -49729,17 +51731,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron/dark/smooth_large, /area/station/security/processing) -"pMj" = ( -/obj/structure/sign/warning/electric_shock/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Security - Lower Hallway North"; - network = list("ss13","prison") - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "pMq" = ( /obj/machinery/camera/directional/south{ c_tag = "Atmospherics Storage Room - South" @@ -49757,6 +51748,14 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/storage) +"pMu" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "pMv" = ( /turf/closed/wall, /area/station/commons/storage/emergency/port) @@ -49776,14 +51775,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/science/xenobiology) -"pNj" = ( -/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/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "pNm" = ( /turf/closed/wall/r_wall, /area/station/security/execution/education) @@ -49823,6 +51814,11 @@ /obj/item/tank/internals/emergency_oxygen, /turf/open/floor/iron/white, /area/station/medical/virology) +"pNz" = ( +/obj/structure/closet/secure_closet/warden, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/showroomfloor, +/area/station/security/warden) "pNB" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ dir = 8 @@ -49835,6 +51831,12 @@ }, /turf/open/floor/iron/large, /area/station/commons/storage/tools) +"pNM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "pNO" = ( /obj/machinery/duct, /obj/structure/disposalpipe/segment, @@ -49845,11 +51847,6 @@ dir = 1 }, /area/station/engineering/lobby) -"pNV" = ( -/obj/effect/turf_decal/siding/white, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white/smooth_large, -/area/station/service/kitchen/diner) "pNY" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -49882,22 +51879,6 @@ /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) -"pOf" = ( -/obj/structure/table, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/scanning_module, -/obj/item/stock_parts/scanning_module, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white/side{ - dir = 10 - }, -/area/station/science/lab) "pOk" = ( /obj/structure/cable, /turf/closed/wall/r_wall, @@ -49908,14 +51889,16 @@ /obj/effect/landmark/start/hangover/closet, /turf/open/floor/carpet, /area/station/commons/dorms) +"pOq" = ( +/obj/machinery/airalarm/directional/north, +/obj/structure/closet/firecloset, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "pOy" = ( /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos/storage) -"pOC" = ( -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "pOJ" = ( /obj/structure/displaycase/forsale/kitchen{ pixel_y = 8 @@ -50018,6 +52001,15 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics/garden) +"pPY" = ( +/obj/machinery/light/small/dim/directional/west, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/spawner/random/trash/grime, +/obj/effect/decal/cleanable/generic, +/obj/structure/sign/departments/maint/directional/west, +/obj/structure/sign/departments/maint/directional/west, +/turf/open/floor/iron/smooth, +/area/station/maintenance/port/lesser) "pQa" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -50044,16 +52036,9 @@ /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/iron/textured, -/area/station/medical/medbay/central) -"pQs" = ( -/obj/machinery/space_heater, -/obj/effect/spawner/random/trash/graffiti{ - pixel_y = -32; - spawn_loot_chance = 50 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) +/area/station/medical/chem_storage) "pQv" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -50075,17 +52060,6 @@ /obj/effect/turf_decal/stripes/box, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) -"pQI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 1 - }, -/obj/machinery/washing_machine, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms/laundry) "pQK" = ( /obj/structure/closet/secure_closet/evidence, /turf/open/floor/iron/dark/textured_edge{ @@ -50104,23 +52078,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"pQQ" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/burnt_floor, -/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/greater) "pRa" = ( /turf/closed/wall, /area/station/science/ordnance/bomb) "pRj" = ( /turf/closed/wall, /area/station/maintenance/port/aft) -"pRp" = ( -/obj/machinery/telecomms/bus/preset_three, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) "pRB" = ( /obj/machinery/camera/directional/north{ c_tag = "Security - Lower Brig Hallway" @@ -50140,12 +52103,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/hallway/secondary/exit/departure_lounge) -"pRI" = ( -/obj/structure/table/glass, -/obj/item/flashlight/lamp, -/obj/effect/turf_decal/tile/blue/full, -/turf/open/floor/iron/dark/smooth_large, -/area/station/command/heads_quarters/cmo) "pRL" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -50157,6 +52114,22 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/freezer, /area/mine/laborcamp) +"pSd" = ( +/obj/machinery/digital_clock/directional/east, +/turf/open/floor/iron/grimy, +/area/station/hallway/secondary/entry) +"pSk" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/directional/north{ + c_tag = "Atmospherics Storage Room - North" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage) "pSn" = ( /obj/machinery/seed_extractor, /obj/structure/window/reinforced/spawner/directional/west, @@ -50174,6 +52147,14 @@ dir = 1 }, /area/station/ai_monitored/command/storage/eva) +"pSy" = ( +/obj/machinery/modular_computer/preset/curator{ + dir = 8 + }, +/obj/item/radio/intercom/directional/south, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/station/service/library) "pSz" = ( /turf/open/openspace, /area/station/maintenance/starboard/upper) @@ -50214,15 +52195,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/fore) -"pTh" = ( -/obj/structure/table, -/obj/machinery/light/directional/east, -/obj/effect/spawner/round_default_module, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) "pTB" = ( /obj/effect/turf_decal/tile/brown{ dir = 8 @@ -50279,10 +52251,6 @@ }, /turf/open/floor/iron/white, /area/station/science/genetics) -"pVi" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/starboard/fore) "pVl" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, @@ -50314,19 +52282,9 @@ /obj/effect/mapping_helpers/requests_console/supplies, /obj/structure/table, /obj/item/hand_labeler, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, /obj/item/folder/yellow, /turf/open/floor/iron, /area/station/cargo/storage) -"pVG" = ( -/obj/structure/chair/stool/directional/west, -/obj/item/trash/energybar, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/poster/official/work_for_a_future/directional/south, -/turf/open/floor/iron, -/area/station/security/prison/work) "pVH" = ( /turf/closed/wall/mineral/wood, /area/station/maintenance/aft/lesser) @@ -50338,6 +52296,12 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/solars/port/fore) +"pVQ" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors/nospawn) "pVV" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -50356,6 +52320,22 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/office) +"pWb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/rack_parts, +/obj/effect/spawner/random/clothing/beret_or_rabbitears, +/obj/effect/spawner/random/clothing/kittyears_or_rabbitears, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/maintenance/port/fore) +"pWf" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/random/food_or_drink/cups, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/structure/sign/poster/contraband/random/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/department/chapel) "pWi" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -50396,6 +52376,12 @@ /obj/effect/decal/cleanable/blood, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"pXh" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "pXj" = ( /obj/machinery/power/shieldwallgen/xenobiologyaccess, /obj/structure/cable, @@ -50422,6 +52408,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"pXz" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/hydroponics/soil, +/turf/open/floor/grass, +/area/station/service/hydroponics) "pXB" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -50441,6 +52432,13 @@ /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"pXU" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Arrivals Lounge" + }, +/obj/machinery/status_display/ai/directional/east, +/turf/open/floor/iron/grimy, +/area/station/hallway/secondary/entry) "pXY" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /turf/open/floor/plating/snowed/smoothed/icemoon, @@ -50540,6 +52538,10 @@ }, /turf/open/floor/engine/plasma, /area/station/engineering/atmos) +"qaf" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "qai" = ( /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/plating/snowed/icemoon, @@ -50555,6 +52557,11 @@ }, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) +"qaD" = ( +/obj/machinery/light_switch/directional/north, +/obj/structure/sign/poster/official/help_others/directional/west, +/turf/open/floor/iron/checker, +/area/station/commons/storage/emergency/port) "qaE" = ( /obj/effect/turf_decal/arrows/red{ dir = 8 @@ -50569,6 +52576,19 @@ }, /turf/open/floor/iron/dark/textured, /area/station/engineering/main) +"qaI" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/radio/intercom/directional/east{ + pixel_y = -6 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply, +/obj/machinery/light/floor, +/turf/open/floor/iron/white, +/area/station/medical/virology) "qaL" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 5 @@ -50617,12 +52637,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) -"qbl" = ( -/obj/machinery/vending/sustenance, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/mine/laborcamp) "qbq" = ( /obj/structure/cable, /obj/machinery/door/poddoor/preopen{ @@ -50656,6 +52670,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"qbU" = ( +/obj/structure/sign/warning/electric_shock/directional/south, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) "qbW" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance/three, @@ -50676,11 +52694,6 @@ "qck" = ( /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) -"qcr" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/chair/stool/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "qcu" = ( /obj/effect/turf_decal/tile/red, /turf/open/floor/iron, @@ -50697,10 +52710,6 @@ /obj/machinery/plumbing/sender, /turf/open/floor/plating, /area/station/medical/chemistry) -"qcZ" = ( -/obj/machinery/vending/modularpc, -/turf/open/floor/iron, -/area/station/commons/locker) "qde" = ( /obj/structure/table, /obj/machinery/cell_charger, @@ -50718,13 +52727,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/range) -"qdo" = ( -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/service/hydroponics) "qdx" = ( /obj/structure/stairs/north{ dir = 4 @@ -50742,6 +52744,18 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/ai_monitored/command/storage/eva) +"qdF" = ( +/obj/machinery/vending/wardrobe/sec_wardrobe, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/smooth_edge, +/area/station/security/lockers) +"qdH" = ( +/obj/structure/bookcase/random, +/obj/structure/sign/poster/official/nanomichi_ad/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/carpet/red, +/area/station/security/prison/work) "qdK" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -50750,13 +52764,11 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/fore) -"qdR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/iron/dark/smooth_corner{ - dir = 4 - }, -/area/station/command/gateway) +"qdY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/station/service/lawoffice) "qea" = ( /obj/structure/rack, /obj/item/storage/toolbox/mechanical{ @@ -50775,24 +52787,32 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /turf/closed/wall/r_wall, /area/station/security/checkpoint/engineering) +"qen" = ( +/obj/structure/table/wood, +/obj/machinery/microwave, +/turf/open/floor/stone, +/area/mine/eva/lower) "qeF" = ( -/obj/structure/railing/corner{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 +/obj/machinery/camera/directional/north{ + c_tag = "Arrivals Aux Dock" }, -/turf/open/floor/iron/dark/side{ - dir = 1 +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/white/corner{ + dir = 4 }, -/area/mine/eva/lower) +/area/station/hallway/secondary/entry) "qeJ" = ( /obj/structure/chair/plastic{ dir = 1 }, /obj/effect/decal/cleanable/blood/splatter, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron, /area/station/maintenance/starboard/fore) "qeL" = ( @@ -50810,6 +52830,13 @@ /obj/item/flashlight/lantern, /turf/open/floor/plating, /area/station/maintenance/department/cargo) +"qeQ" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Xenobiology Pens Observation - Port Fore"; + network = list("ss13","rd","xeno") + }, +/turf/open/openspace, +/area/station/science/xenobiology) "qeR" = ( /obj/structure/chair/pew{ dir = 1 @@ -50849,16 +52876,6 @@ /obj/item/staff/broom, /turf/open/floor/wood/tile, /area/station/service/theater) -"qfy" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "qfE" = ( /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 4 @@ -50868,6 +52885,14 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"qgm" = ( +/obj/machinery/meter/monitored/waste_loop, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating/corner, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "qgn" = ( /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/stripes/corner{ @@ -50887,12 +52912,6 @@ /obj/effect/landmark/start/medical_doctor, /turf/open/floor/iron/white, /area/station/medical/surgery/fore) -"qgM" = ( -/obj/effect/spawner/structure/window/hollow/directional{ - dir = 10 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "qgO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -50909,19 +52928,6 @@ /mob/living/simple_animal/bot/cleanbot, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/service) -"qhy" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"qhG" = ( -/obj/structure/sign/warning/secure_area/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 4 - }, -/area/station/command/gateway) "qhL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -50934,6 +52940,16 @@ /obj/machinery/space_heater, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"qhP" = ( +/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{ + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/side, +/area/station/security/processing) "qhS" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -50954,39 +52970,35 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/parquet, /area/station/commons/lounge) -"qiu" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Bridge Conference Room" - }, -/turf/open/floor/wood, -/area/station/command/meeting_room) -"qix" = ( -/obj/structure/rack, -/obj/item/clothing/suit/hooded/wintercoat/eva{ - pixel_y = 9 - }, -/obj/item/clothing/shoes/winterboots/ice_boots/eva{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/delivery/red, -/obj/item/clothing/gloves/color/grey/protects_cold, -/obj/item/clothing/mask/gas, -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, -/turf/open/floor/iron/textured, -/area/station/ai_monitored/command/storage/eva) +"qiF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/turf/open/floor/iron/dark/side, +/area/mine/eva/lower) "qiJ" = ( /obj/structure/closet/secure_closet/freezer/kitchen/maintenance, /obj/effect/spawner/random/contraband/prison, /turf/open/floor/iron/showroomfloor, /area/station/security/prison/mess) +"qiK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron, +/area/station/command/heads_quarters/qm) "qiN" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"qiP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/qm) "qiT" = ( /obj/structure/reagent_dispensers/watertank, /obj/effect/turf_decal/tile/green/anticorner/contrasted{ @@ -51005,14 +53017,28 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) -"qjj" = ( -/obj/effect/turf_decal/tile/blue{ +"qjg" = ( +/obj/effect/landmark/observer_start, +/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, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron/white/corner{ +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"qji" = ( +/obj/structure/sign/poster/official/no_erp/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, -/area/station/hallway/secondary/entry) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/freezer, +/area/station/maintenance/starboard/fore) "qjm" = ( /obj/machinery/camera/directional/south{ c_tag = "Bridge West Access" @@ -51021,11 +53047,30 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron, /area/station/hallway/primary/central) +"qjp" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/thinplating_new, +/turf/open/floor/iron, +/area/station/commons/locker) +"qjq" = ( +/obj/machinery/telecomms/processor/preset_four, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) +"qjr" = ( +/obj/structure/girder, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "qjx" = ( /obj/structure/cable, /obj/machinery/holopad/secure, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) +"qjC" = ( +/obj/structure/sign/nanotrasen{ + pixel_x = -32 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "qjF" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 @@ -51063,26 +53108,20 @@ /obj/structure/disposalpipe/trunk/multiz/down, /turf/open/floor/iron/dark, /area/station/medical/medbay/aft) -"qkn" = ( -/obj/machinery/requests_console/directional/south{ - department = "Atmospherics"; - name = "Atmospherics Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/siding/yellow{ +"qku" = ( +/obj/structure/chair/comfy/beige{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/blue, +/area/station/hallway/secondary/entry) +"qky" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/red/half{ dir = 1 }, -/turf/open/floor/iron/dark/corner, -/area/station/engineering/atmos/storage/gas) -"qku" = ( -/obj/item/kirbyplants/random, -/turf/open/floor/iron/grimy, -/area/station/commons/vacant_room/office) +/turf/open/floor/iron/smooth_half, +/area/station/security/brig/upper) "qkB" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 1 @@ -51094,14 +53133,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/virology) -"qkG" = ( -/obj/machinery/duct, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "qkH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/side{ @@ -51112,10 +53143,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/security/lockers) -"qkP" = ( -/obj/item/trash/semki, -/turf/open/floor/iron, -/area/station/maintenance/port/fore) "qkT" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -51164,6 +53191,14 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron, /area/station/science/explab) +"qlP" = ( +/obj/machinery/door/airlock/external/glass, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/all/engineering/external, +/obj/structure/cable, +/turf/open/floor/iron/textured, +/area/station/hallway/secondary/entry) "qlU" = ( /obj/structure/closet/crate, /turf/open/floor/plating/snowed/icemoon, @@ -51189,6 +53224,14 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) +"qmN" = ( +/obj/item/radio/intercom/directional/north, +/obj/structure/reagent_dispensers/plumbed, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/service) "qmT" = ( /obj/structure/bed{ dir = 4 @@ -51245,6 +53288,18 @@ /obj/machinery/status_display/evac/directional/east, /turf/open/floor/wood, /area/station/service/library) +"qnr" = ( +/obj/structure/table, +/obj/item/clothing/glasses/meson, +/obj/item/storage/bag/ore, +/obj/item/pickaxe, +/obj/item/mining_scanner, +/obj/item/flashlight, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/gps/mining, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/commons/storage/mining) "qnt" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 6 @@ -51277,6 +53332,23 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"qnV" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/emergency{ + pixel_y = 9 + }, +/obj/item/assembly/timer, +/obj/item/assembly/signaler{ + pixel_x = 7; + pixel_y = -7 + }, +/obj/item/assembly/signaler{ + pixel_x = -8; + pixel_y = -12 + }, +/obj/machinery/status_display/ai/directional/east, +/turf/open/floor/iron, +/area/station/command/bridge) "qob" = ( /obj/structure/table, /obj/effect/decal/cleanable/cobweb, @@ -51304,6 +53376,11 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"qoK" = ( +/obj/structure/flora/rock/style_random, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/misc/asteroid/snow/icemoon, +/area/station/maintenance/port/aft) "qoM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/burnt_floor, @@ -51321,6 +53398,21 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/mix) +"qpb" = ( +/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/light_switch/directional/west, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) "qpd" = ( /obj/effect/landmark/blobstart, /obj/structure/disposalpipe/segment{ @@ -51330,10 +53422,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/starboard/fore) -"qpe" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/commons/locker) "qpp" = ( /obj/machinery/camera/directional/west{ c_tag = "Quartermaster's Office" @@ -51357,6 +53445,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/mix) +"qpt" = ( +/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/blue{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "qpu" = ( /obj/machinery/button/door/directional/west{ id = "gene_shutters"; @@ -51390,13 +53487,6 @@ dir = 4 }, /area/station/service/chapel) -"qpy" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/laborcamp/security) "qpB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -51426,6 +53516,26 @@ /obj/machinery/recharge_station, /turf/open/floor/wood, /area/station/command/meeting_room) +"qpZ" = ( +/obj/structure/table, +/obj/item/folder/blue{ + pixel_x = -6; + pixel_y = 3 + }, +/obj/item/pen{ + pixel_x = -1; + pixel_y = 1 + }, +/obj/item/paper_bin/carbon{ + pixel_x = 5; + pixel_y = 18 + }, +/obj/item/stamp/head/hop{ + pixel_x = 8; + pixel_y = 5 + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/hop) "qqh" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8; @@ -51438,32 +53548,19 @@ /obj/structure/tank_dispenser/oxygen, /turf/open/floor/iron/smooth, /area/mine/eva/lower) -"qqq" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/structure/sign/poster/official/obey/directional/west, -/turf/open/floor/iron/dark/textured, -/area/station/security/execution/transfer) +"qqv" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance/two, +/obj/item/storage/toolbox/emergency, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) "qqx" = ( /obj/structure/sign/painting/library{ pixel_y = 32 }, -/obj/item/kirbyplants{ - icon_state = "applebush" - }, +/obj/item/kirbyplants/organic/applebush, /turf/open/floor/wood, /area/station/hallway/secondary/service) -"qqz" = ( -/obj/machinery/door/airlock/security{ - name = "Security Checkpoint" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/all/security/general, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs/auxiliary) "qqB" = ( /obj/machinery/button/door/directional/north{ id = "maint3"; @@ -51474,6 +53571,7 @@ /area/station/maintenance/starboard/fore) "qqC" = ( /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "qqJ" = ( @@ -51538,23 +53636,37 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron, /area/station/hallway/primary/central) -"qsk" = ( -/obj/structure/disposalpipe/segment, -/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, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) -"qsl" = ( -/obj/structure/table, -/obj/item/clothing/mask/gas, -/obj/machinery/light/directional/south, -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) +"qrQ" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/service/chapel) +"qrT" = ( +/obj/machinery/status_display/evac/directional/east, +/obj/structure/bookcase{ + name = "Holy Bookcase" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"qsh" = ( +/obj/structure/plaque/static_plaque/golden/commission/icebox, +/obj/effect/landmark/navigate_destination/dockarrival, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/iron/large, +/area/station/hallway/secondary/entry) +"qsq" = ( +/obj/structure/sign/warning/directional/south, +/turf/open/openspace/icemoon/keep_below, +/area/icemoon/underground/explored) "qsy" = ( /obj/effect/landmark/event_spawn, /obj/structure/cable, @@ -51562,18 +53674,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/central) -"qsE" = ( -/obj/machinery/door/firedoor, -/obj/structure/table/reinforced, -/obj/item/paper, -/obj/machinery/door/window/right/directional/west{ - dir = 1; - name = "Security Checkpoint"; - req_access = list("security") - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs/auxiliary) "qsG" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 9 @@ -51620,6 +53720,13 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, /area/station/security/prison/garden) +"qtH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/mine/laborcamp) "qtM" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -51634,13 +53741,28 @@ /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) "qtT" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Mining Dock" +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/supply/mining, -/turf/open/floor/iron, -/area/station/cargo/miningdock) +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/line, +/obj/effect/turf_decal/trimline/brown/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) +"que" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Chapel South" + }, +/obj/structure/closet/crate/bin, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "qum" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -51651,6 +53773,7 @@ /obj/machinery/door/window/left/directional/north{ name = "Armory Desk" }, +/obj/item/hand_labeler, /turf/open/floor/iron, /area/station/ai_monitored/security/armory/upper) "quB" = ( @@ -51680,17 +53803,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/cargo/drone_bay) -"quZ" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/effect/landmark/start/botanist, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) "qvh" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -51704,6 +53816,24 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"qvE" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine, +/area/station/science/genetics) +"qvF" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood/corner, +/obj/item/flashlight/lamp/green{ + pixel_x = 1; + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/station/service/library) +"qvM" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) "qvQ" = ( /obj/structure/closet/secure_closet/atmospherics, /turf/open/floor/iron/dark, @@ -51729,14 +53859,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos/storage/gas) -"qvZ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/trimline/yellow/filled/end{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/textured, -/area/station/medical/medbay/central) "qwa" = ( /obj/machinery/door/window/brigdoor/right/directional/west{ name = "Shooting Range" @@ -51780,6 +53902,11 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/eva) +"qwn" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/vending/cigarette, +/turf/open/floor/iron, +/area/station/commons/locker) "qwB" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/wood, @@ -51847,6 +53974,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/chair/stool/directional/south, /obj/effect/mapping_helpers/broken_floor, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "qxb" = ( @@ -51872,6 +54000,13 @@ /obj/effect/mapping_helpers/requests_console/supplies, /turf/open/floor/iron, /area/station/science/explab) +"qxm" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/smooth, +/area/station/maintenance/port/lesser) "qxo" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ @@ -51907,17 +54042,18 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/engineering/lobby) +"qxI" = ( +/turf/open/floor/plastic, +/area/station/commons/dorms/laundry) "qxQ" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/cargo/lobby) -"qxW" = ( -/obj/structure/rack, -/obj/item/storage/briefcase, -/obj/item/pai_card, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/commons/locker) +"qxY" = ( +/obj/item/chair/plastic, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "qyn" = ( /obj/machinery/light/small/directional/east, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -51932,6 +54068,22 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos/pumproom) +"qyL" = ( +/obj/structure/closet/secure_closet/personal{ + anchored = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/poster/official/random/directional/south, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/commons/locker) +"qyO" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "qyR" = ( /turf/open/openspace, /area/station/medical/treatment_center) @@ -51942,12 +54094,6 @@ }, /turf/open/floor/iron/dark, /area/station/cargo/miningdock) -"qyU" = ( -/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/secondary/entry) "qzq" = ( /obj/structure/sign/departments/cargo, /turf/closed/wall/r_wall, @@ -51989,12 +54135,6 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"qzR" = ( -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/supermatter/room) "qzT" = ( /obj/structure/closet/firecloset, /obj/effect/mapping_helpers/burnt_floor, @@ -52015,22 +54155,18 @@ /obj/effect/landmark/start/medical_doctor, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"qAr" = ( -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/light/directional/north, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, +"qAq" = ( +/obj/structure/closet/toolcloset, +/obj/machinery/status_display/evac/directional/south, +/obj/structure/sign/poster/official/random/directional/west, +/obj/machinery/light/small/directional/west, /turf/open/floor/iron/dark, -/area/station/service/hydroponics) -"qAz" = ( -/obj/structure/disposalpipe/trunk/multiz{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) +/area/station/engineering/storage) +"qAB" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp, +/turf/open/floor/iron/grimy, +/area/station/commons/vacant_room/office) "qAI" = ( /obj/effect/decal/cleanable/food/flour, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -52039,6 +54175,23 @@ "qAQ" = ( /turf/open/floor/engine/vacuum, /area/station/engineering/atmos) +"qAS" = ( +/obj/item/stack/rods/fifty, +/obj/structure/rack, +/obj/item/stack/cable_coil{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/stack/cable_coil{ + amount = 5 + }, +/obj/item/stack/sheet/mineral/plasma{ + amount = 10 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/random/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/department/electrical) "qAT" = ( /obj/machinery/light/small/directional/south, /obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ @@ -52106,15 +54259,6 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) -"qCE" = ( -/obj/machinery/door/firedoor, -/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, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "qCF" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -52180,14 +54324,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/engine, /area/station/engineering/supermatter) -"qDy" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/dark_green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) "qDD" = ( /obj/machinery/washing_machine, /obj/effect/decal/cleanable/dirt, @@ -52284,19 +54420,20 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron/dark, /area/station/science/breakroom) -"qEC" = ( -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/siding/white{ - dir = 6 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "qEJ" = ( /turf/closed/wall, /area/station/service/chapel/office) +"qEK" = ( +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 4 + }, +/obj/item/pen, +/obj/structure/table, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/customs/auxiliary) "qEM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -52318,6 +54455,7 @@ }, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/iron/white, /area/station/science/research) "qFn" = ( @@ -52338,6 +54476,23 @@ /obj/item/crowbar/red, /turf/open/floor/glass/reinforced, /area/station/science/xenobiology) +"qFq" = ( +/obj/machinery/computer/security/telescreen/interrogation{ + pixel_y = 30 + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark/corner{ + dir = 8 + }, +/area/station/security/processing) +"qFs" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "qFt" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -52361,11 +54516,14 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) -"qFU" = ( -/obj/structure/cable/multilayer/multiz, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/plating/snowed/icemoon, -/area/station/maintenance/port/aft) +"qFJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/holopad, +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/bot, +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_large, +/area/station/security/checkpoint/customs/auxiliary) "qFX" = ( /obj/machinery/door/airlock{ name = "Custodial Closet" @@ -52406,13 +54564,13 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"qGj" = ( -/obj/machinery/airalarm/directional/north, -/obj/structure/chair{ - dir = 8 +"qGJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/obj/effect/spawner/random/trash/grime, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/port/lesser) "qGQ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -52448,6 +54606,18 @@ /obj/structure/cable, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) +"qHj" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/red{ + dir = 8 + }, +/obj/effect/spawner/random/clothing/costume, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/maintenance/port/fore) "qHl" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -52466,12 +54636,19 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, /area/station/science/breakroom) -"qHt" = ( -/obj/machinery/light/directional/east, -/obj/machinery/status_display/evac/directional/east, -/obj/structure/reagent_dispensers/fueltank, +"qHz" = ( +/obj/machinery/light_switch/directional/west, +/obj/machinery/disposal/bin{ + desc = "A pneumatic waste disposal unit. This one leads to the morgue."; + name = "corpse disposal" + }, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/obj/item/radio/intercom/directional/north, /turf/open/floor/iron/white, -/area/station/science/robotics/lab) +/area/station/medical/surgery/fore) "qHD" = ( /obj/machinery/computer/prisoner/management, /obj/effect/turf_decal/tile/red/anticorner/contrasted{ @@ -52479,6 +54656,15 @@ }, /turf/open/floor/iron, /area/station/command/bridge) +"qHO" = ( +/obj/machinery/bluespace_vendor/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/chair/sofa/bench/right{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "qIf" = ( /obj/machinery/power/smes, /obj/structure/cable, @@ -52553,16 +54739,6 @@ "qIU" = ( /turf/open/floor/iron, /area/station/commons/dorms) -"qIV" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Art Storage" - }, -/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, -/turf/open/floor/iron, -/area/station/commons/storage/art) "qJh" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -52580,6 +54756,13 @@ /area/mine/eva/lower) "qJJ" = ( /obj/machinery/firealarm/directional/east, +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/folder/yellow, +/obj/item/pen, /turf/open/floor/iron, /area/station/cargo/miningdock) "qJT" = ( @@ -52618,6 +54801,18 @@ /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/plating, /area/station/security/prison/safe) +"qKk" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/mine/eva/lower) "qKq" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -52656,6 +54851,13 @@ /obj/effect/spawner/structure/window/hollow/reinforced/end, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) +"qKJ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/secondary/entry) "qKQ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -52690,31 +54892,36 @@ }, /turf/open/floor/wood, /area/station/service/library) +"qLg" = ( +/obj/effect/spawner/random/contraband/narcotics, +/obj/structure/sign/poster/contraband/syndiemoth/directional/west, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/security/prison/safe) +"qLi" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron/dark/textured, +/area/station/security/prison/rec) "qLm" = ( /obj/machinery/suit_storage_unit/mining, /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, /area/mine/eva) -"qLo" = ( -/obj/machinery/light/directional/east, -/obj/machinery/holopad, -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/medical/treatment_center) "qLt" = ( /obj/effect/landmark/start/hangover, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/hallway/primary/central) -"qLw" = ( -/obj/machinery/conveyor{ - dir = 4; - id = "packageSort2" - }, -/turf/open/floor/plating, -/area/station/cargo/sorting) +"qLy" = ( +/obj/structure/closet/secure_closet/medical2, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/surgery/fore) "qLB" = ( /obj/structure/filingcabinet/employment, /turf/open/floor/wood, @@ -52749,6 +54956,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /turf/open/floor/engine, /area/station/science/xenobiology) +"qLQ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/mine/eva/lower) "qLX" = ( /obj/effect/decal/cleanable/dirt, /obj/item/toy/basketball, @@ -52806,14 +55017,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/engineering/supermatter) -"qMQ" = ( -/obj/machinery/porta_turret/ai{ - dir = 4; - installation = /obj/item/gun/energy/e_gun - }, -/obj/machinery/light/directional/east, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat/hallway) "qMT" = ( /turf/closed/wall, /area/station/commons/lounge) @@ -52843,9 +55046,6 @@ dir = 1 }, /area/station/hallway/secondary/service) -"qNk" = ( -/turf/open/floor/plating, -/area/station/construction/mining/aux_base) "qNl" = ( /obj/structure/plasticflaps/opaque, /obj/effect/turf_decal/delivery, @@ -52895,10 +55095,13 @@ /obj/effect/spawner/random/trash/mess, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"qNL" = ( -/obj/effect/spawner/random/vending/colavend, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/entry) +"qNF" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 9 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/engineering/atmos) "qNV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /obj/effect/decal/cleanable/dirt, @@ -52917,11 +55120,6 @@ /obj/effect/mapping_helpers/airlock/access/all/science/xenobio, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"qOk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/electrolyzer, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "qOl" = ( /turf/open/floor/wood, /area/station/maintenance/port/aft) @@ -52981,6 +55179,26 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/smooth, /area/station/security/holding_cell) +"qPq" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Security Maintenance" + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/security/checkpoint/customs/auxiliary) +"qPs" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/dorms/laundry) "qPt" = ( /obj/structure/closet/secure_closet/chemical, /obj/item/radio/headset/headset_med, @@ -53001,13 +55219,6 @@ }, /turf/open/floor/wood, /area/station/maintenance/port/aft) -"qPC" = ( -/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/plating, -/area/station/maintenance/port/greater) "qPE" = ( /obj/structure/closet/secure_closet/freezer/meat, /turf/open/misc/asteroid/snow/coldroom, @@ -53023,6 +55234,13 @@ "qPL" = ( /turf/closed/wall/r_wall, /area/station/hallway/secondary/exit/departure_lounge) +"qPX" = ( +/obj/structure/sink/directional/west, +/obj/structure/mirror/directional/east, +/obj/machinery/light/small/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/freezer, +/area/mine/eva/lower) "qPY" = ( /obj/structure/bookcase/random/fiction, /turf/open/floor/wood, @@ -53050,15 +55268,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /turf/closed/wall/r_wall, /area/station/engineering/atmos) -"qQs" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/obj/machinery/status_display/evac/directional/east, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "qQt" = ( /obj/machinery/light/small/directional/west, /turf/open/misc/asteroid/snow/icemoon, @@ -53111,21 +55320,31 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/command/meeting_room) -"qRH" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/mapping_helpers/burnt_floor, +"qRt" = ( +/obj/effect/spawner/random/trash/mess, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"qRv" = ( +/obj/structure/railing, +/obj/structure/marker_beacon/cerulean, +/obj/structure/flora/tree/pine/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "qRO" = ( /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/ordnance) -"qRT" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/port) +"qRR" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/random/directional/south, +/obj/effect/spawner/random/structure/steam_vent, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "qSb" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/west, @@ -53246,12 +55465,33 @@ /turf/open/floor/plating, /area/station/maintenance/port/aft) "qTe" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/structure/railing{ - dir = 1 +/obj/structure/railing/corner/end/flip{ + dir = 4 }, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"qTj" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/sign/warning/pods/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/hallway/secondary/entry) +"qTm" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) "qTs" = ( /turf/open/floor/iron/showroomfloor, /area/station/security/prison/mess) @@ -53262,13 +55502,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/carpet/red, /area/station/security/prison/work) -"qTJ" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/department/chapel) "qTS" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -53304,15 +55537,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible/layer2, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"qUv" = ( -/obj/structure/rack, -/obj/item/wirecutters, -/obj/item/screwdriver, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) "qUw" = ( /obj/structure/closet/secure_closet/brig, /obj/effect/decal/cleanable/dirt, @@ -53344,10 +55568,28 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"qVg" = ( +/obj/structure/cable, +/obj/structure/chair/stool/directional/south, +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/station/commons/locker) +"qVk" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "qVo" = ( /obj/effect/turf_decal/weather/snow/corner, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) +"qVp" = ( +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/command/bridge) "qVz" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -53355,6 +55597,17 @@ /obj/structure/rack, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"qVD" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/cable, +/obj/effect/spawner/random/trash/graffiti{ + pixel_y = -32; + spawn_loot_chance = 50 + }, +/turf/open/floor/iron/smooth, +/area/station/maintenance/port/lesser) "qVJ" = ( /obj/machinery/disposal/bin, /obj/machinery/light_switch/directional/south, @@ -53363,6 +55616,12 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/command/heads_quarters/hos) +"qVN" = ( +/obj/structure/table/glass, +/obj/item/stock_parts/matter_bin, +/obj/effect/spawner/random/food_or_drink/booze, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "qWh" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -53401,6 +55660,10 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/virology) +"qWI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/closed/wall/r_wall, +/area/station/maintenance/starboard/aft) "qWJ" = ( /obj/item/crowbar/large, /obj/structure/rack, @@ -53448,14 +55711,6 @@ /obj/machinery/light/small/directional/south, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"qXk" = ( -/obj/machinery/light/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/atmos_control/nocontrol/incinerator{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/maintenance/disposal/incinerator) "qXp" = ( /obj/machinery/camera/directional/north{ c_tag = "Research Division Access"; @@ -53486,14 +55741,6 @@ /obj/structure/flora/bush/jungle/c/style_random, /turf/open/floor/grass, /area/station/medical/virology) -"qXW" = ( -/obj/structure/ladder, -/obj/structure/sign/warning/cold_temp/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/engineering/lobby) "qXY" = ( /obj/effect/spawner/random/trash, /turf/open/floor/plating, @@ -53506,6 +55753,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) +"qYc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "qYh" = ( /obj/structure/chair/pew{ dir = 1 @@ -53536,6 +55790,14 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/entry) +"qYA" = ( +/obj/machinery/computer/security, +/obj/structure/reagent_dispensers/wall/peppertank/directional/north, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/customs/auxiliary) "qYD" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -53565,13 +55827,6 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"qYR" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "qYZ" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/machinery/newscaster/directional/south, @@ -53584,27 +55839,6 @@ /obj/item/pen, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"qZl" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"qZs" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 5 - }, -/obj/machinery/light/directional/north, -/obj/structure/bed{ - dir = 4 - }, -/obj/item/bedsheet/medical{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/iron/dark, -/area/station/medical/virology) "qZv" = ( /obj/machinery/chem_heater/withbuffer, /obj/effect/turf_decal/stripes/line{ @@ -53625,21 +55859,17 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) -"qZL" = ( -/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) "qZN" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance/freezerchamber) +"qZQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "qZT" = ( /obj/machinery/computer/mech_bay_power_console{ dir = 1 @@ -53758,6 +55988,11 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/station/ai_monitored/turret_protected/aisat/maint) +"rbs" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "rbC" = ( /turf/closed/wall, /area/station/command/heads_quarters/qm) @@ -53802,11 +56037,6 @@ }, /turf/open/floor/iron, /area/station/science/explab) -"rcq" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/hidden, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "rcx" = ( /obj/machinery/light/directional/west, /obj/structure/window/reinforced/spawner/directional/north, @@ -53871,12 +56101,38 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"rdn" = ( +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"rdw" = ( +/obj/structure/bookcase, +/obj/machinery/light/small/directional/north, +/turf/open/floor/carpet, +/area/station/security/processing) +"rdB" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/chair/sofa/corp/right{ + dir = 4; + pixel_x = -4 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/grimy, +/area/station/service/bar/atrium) "rdG" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 }, /turf/open/floor/iron/white, /area/station/medical/storage) +"rdR" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/iron/textured, +/area/station/security/brig) "rea" = ( /obj/structure/table, /obj/effect/turf_decal/tile/brown/half/contrasted{ @@ -53923,16 +56179,26 @@ dir = 5 }, /area/mine/living_quarters) +"reA" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/chair/sofa/left/brown{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) "reJ" = ( /obj/machinery/navbeacon{ codes_txt = "delivery;dir=8"; location = "Tool Storage" }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, /turf/open/floor/iron, /area/station/commons/storage/primary) "reM" = ( @@ -53976,14 +56242,15 @@ "rfu" = ( /turf/closed/wall/r_wall, /area/station/security/prison/rec) -"rfz" = ( -/obj/machinery/light/small/directional/west, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms/laundry) +"rfF" = ( +/obj/effect/spawner/random/trash/mess, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"rfR" = ( +/obj/machinery/telecomms/bus/preset_two, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) "rfS" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -54041,6 +56308,12 @@ /obj/item/stack/package_wrap, /turf/open/floor/wood/large, /area/mine/eva/lower) +"rgs" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "rgB" = ( /obj/structure/cable, /obj/item/radio/intercom/directional/south, @@ -54090,24 +56363,6 @@ dir = 8 }, /area/station/science/ordnance/office) -"rho" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/green/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"rhE" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Pod Two"; - space_dir = 8 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) "rhF" = ( /obj/machinery/camera/directional/north{ c_tag = "Security - Permabrig Observation North"; @@ -54147,6 +56402,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/department/medical/central) +"rin" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/station/hallway/secondary/entry) "riv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -54218,6 +56487,24 @@ /obj/structure/fluff/tram_rail, /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) +"rjH" = ( +/obj/machinery/camera/directional/west{ + c_tag = "MiniSat Antechamber"; + network = list("minisat"); + start_active = 1 + }, +/obj/machinery/turretid{ + control_area = "/area/station/ai_monitored/turret_protected/aisat/atmos"; + name = "Atmospherics Turret Control"; + pixel_x = -27; + req_access = list("minisat") + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) "rjK" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -54245,6 +56532,16 @@ }, /turf/open/floor/iron, /area/station/engineering/storage) +"rkd" = ( +/obj/effect/spawner/random/structure/chair_flipped, +/obj/effect/spawner/random/trash/cigbutt, +/obj/effect/spawner/random/trash/cigbutt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/plaques/kiddie/perfect_drone{ + pixel_x = 32 + }, +/turf/open/floor/iron/checker, +/area/station/maintenance/port/fore) "rki" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -54264,12 +56561,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) -"rkm" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "rkt" = ( /obj/structure/cable, /obj/machinery/light/directional/east, @@ -54310,13 +56601,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"rkT" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Security - Permabrig Upper Hallway South"; - network = list("ss13","prison") - }, -/turf/open/floor/iron/dark/textured, -/area/station/security/prison) "rlb" = ( /obj/structure/sign/warning/secure_area/directional/west, /obj/structure/disposalpipe/segment, @@ -54331,10 +56615,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) -"rlh" = ( -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/dark/textured, -/area/station/security/prison/rec) "rlj" = ( /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, @@ -54350,11 +56630,22 @@ /obj/structure/table/wood, /turf/open/floor/wood, /area/station/commons/dorms) +"rlX" = ( +/obj/structure/closet/secure_closet/chemical, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/no_smoking/circle/directional/west, +/turf/open/floor/iron/white, +/area/station/maintenance/port/fore) "rmh" = ( -/obj/structure/ladder, -/obj/machinery/light/small/directional/north, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured_large, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/showroomfloor, /area/station/maintenance/department/medical/morgue) "rmn" = ( /obj/structure/chair/stool/directional/north, @@ -54363,6 +56654,10 @@ }, /turf/open/floor/carpet, /area/station/commons/dorms) +"rmp" = ( +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/white, +/area/station/science/ordnance) "rmv" = ( /obj/structure/rack, /obj/item/wrench, @@ -54394,14 +56689,25 @@ }, /turf/open/floor/wood, /area/station/command/meeting_room) +"rmU" = ( +/obj/effect/spawner/random/trash/graffiti, +/obj/structure/sign/poster/contraband/free_drone/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"rmZ" = ( +/obj/machinery/iv_drip, +/obj/structure/mirror/broken/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/port/fore) "rnb" = ( /obj/effect/turf_decal/tile/red, /turf/open/floor/iron/textured, /area/station/security/brig) "rns" = ( /obj/structure/table/reinforced, -/obj/item/aicard, -/obj/item/multitool, +/obj/item/aicard{ + pixel_y = 6 + }, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 8 }, @@ -54456,6 +56762,10 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"rop" = ( +/obj/machinery/telecomms/processor/preset_one, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) "roq" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/closet, @@ -54463,6 +56773,14 @@ /obj/effect/spawner/random/trash/janitor_supplies, /turf/open/floor/plating, /area/station/maintenance/department/chapel) +"rox" = ( +/obj/structure/table, +/obj/effect/spawner/round_default_module, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) "roA" = ( /obj/machinery/door/window/left/directional/north{ dir = 4; @@ -54486,6 +56804,11 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"roX" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/security/checkpoint/customs/auxiliary) "rpa" = ( /obj/structure/closet/athletic_mixed, /turf/open/floor/plating, @@ -54497,6 +56820,16 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) +"rpC" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/starboard) "rpF" = ( /obj/effect/turf_decal/bot{ dir = 1 @@ -54523,6 +56856,15 @@ /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"rpT" = ( +/obj/structure/closet/emcloset, +/obj/machinery/camera/directional/north{ + c_tag = "Security - Access" + }, +/obj/effect/turf_decal/tile/red/half, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/smooth_half, +/area/station/security/brig/upper) "rpU" = ( /obj/machinery/iv_drip, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -54544,6 +56886,21 @@ dir = 1 }, /area/station/science/explab) +"rqi" = ( +/obj/item/crowbar{ + pixel_y = 3 + }, +/obj/item/assembly/flash/handheld{ + pixel_y = 3; + pixel_x = -19 + }, +/obj/structure/table, +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/obj/item/radio/off{ + pixel_y = 6 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/customs/auxiliary) "rqq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -54605,6 +56962,11 @@ /obj/structure/table/wood, /turf/open/floor/iron/dark, /area/station/service/chapel/office) +"rrn" = ( +/obj/structure/closet/emcloset, +/obj/structure/sign/poster/contraband/random/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "rrp" = ( /obj/structure/railing{ dir = 4 @@ -54637,19 +56999,17 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/service/theater) -"rrY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/hidden, -/obj/effect/landmark/generic_maintenance_landmark, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"rsC" = ( -/obj/machinery/light/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Xenobiology Pens - Port Mid"; - network = list("ss13","rd","xeno") +"rsw" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 }, -/turf/open/floor/engine, -/area/station/science/xenobiology) +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/hallway/secondary/entry) "rsL" = ( /obj/structure/cable, /turf/open/floor/circuit, @@ -54713,6 +57073,11 @@ /obj/effect/mapping_helpers/airlock/access/all/service/crematorium, /turf/open/floor/plating, /area/station/maintenance/department/chapel) +"rtq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/iron/checker, +/area/station/maintenance/port/fore) "rtt" = ( /obj/effect/turf_decal/trimline/dark_green/line, /obj/effect/turf_decal/trimline/dark_green/line{ @@ -54724,23 +57089,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/mix) -"rtv" = ( -/obj/structure/table/glass, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/item/storage/medkit/o2{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/medkit/o2, -/obj/item/storage/medkit/regular{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/blue/full, -/turf/open/floor/iron/dark/smooth_large, -/area/station/medical/storage) "rty" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -54749,19 +57097,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/cargo/storage) -"rtP" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Engineering West" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/main) "rtR" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -54805,6 +57140,20 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"ruO" = ( +/obj/machinery/firealarm/directional/west, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/closet/firecloset, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/main) "ruZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, @@ -54821,10 +57170,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/mine/laborcamp) -"rvE" = ( -/obj/structure/sign/warning/docking, -/turf/closed/wall/r_wall, -/area/station/hallway/secondary/entry) +"rvS" = ( +/obj/structure/rack, +/obj/item/poster/random_contraband, +/obj/effect/spawner/random/maintenance/two, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"rvW" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/port/greater) "rvZ" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/iron, @@ -54864,12 +57222,6 @@ dir = 1 }, /area/station/security/prison) -"rwv" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/hydroponics/soil, -/obj/machinery/light/directional/east, -/turf/open/floor/grass, -/area/station/service/hydroponics) "rwB" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/orange/visible, /obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ @@ -54890,26 +57242,22 @@ /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) "rwG" = ( +/obj/effect/landmark/generic_maintenance_landmark, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 + dir = 8 }, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) +"rwR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/iron, +/area/mine/laborcamp) "rwW" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/gas_mask, /turf/open/floor/plating, /area/station/hallway/secondary/entry) -"rwX" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Arrivals Bay 1 Hallway" - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white/corner, -/area/station/hallway/secondary/entry) "rxa" = ( /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible{ dir = 1 @@ -54975,11 +57323,6 @@ /obj/structure/cable/layer3, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"ryl" = ( -/obj/machinery/vending/wardrobe/det_wardrobe, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) "ryu" = ( /turf/open/floor/iron/dark/textured, /area/station/security/execution/transfer) @@ -54990,20 +57333,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) -"ryF" = ( -/obj/machinery/light/directional/south, -/obj/structure/plasticflaps, -/obj/machinery/conveyor{ - dir = 8; - id = "mining_internal" - }, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/mine/production) "ryG" = ( /obj/structure/chair{ dir = 1 @@ -55012,16 +57341,19 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/security/holding_cell) -"ryL" = ( +"ryM" = ( +/obj/structure/rack, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/shovel, +/obj/item/flashlight, +/obj/item/flashlight, +/obj/item/radio/off, /obj/item/radio/intercom/directional/east, -/obj/machinery/computer/records/security{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) +/obj/structure/cable, +/obj/effect/turf_decal/delivery/red, +/turf/open/floor/iron/textured, +/area/station/hallway/secondary/entry) "ryO" = ( /obj/item/kirbyplants/random, /turf/open/floor/wood, @@ -55033,14 +57365,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/fitness) -"rzc" = ( -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/service/library) "rzj" = ( /obj/structure/table, /obj/item/stack/sheet/iron/fifty{ @@ -55069,8 +57393,9 @@ "rzr" = ( /obj/structure/table, /obj/item/mod/module/plasma_stabilizer, -/obj/item/mod/module/thermal_regulator, /obj/item/assembly/flash/handheld, +/obj/item/mod/module/signlang_radio, +/obj/item/mod/module/thermal_regulator, /turf/open/floor/iron/dark/textured_half{ dir = 1 }, @@ -55132,6 +57457,7 @@ /area/icemoon/surface/outdoors/nospawn) "rzS" = ( /obj/structure/sign/departments/chemistry/pharmacy/directional/west, +/obj/machinery/digital_clock/directional/south, /turf/open/openspace, /area/station/medical/medbay/lobby) "rAr" = ( @@ -55172,15 +57498,6 @@ }, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) -"rAN" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/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/brig/upper) "rAO" = ( /obj/structure/closet/emcloset, /turf/open/floor/plating, @@ -55204,11 +57521,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/dark/smooth_large, /area/station/ai_monitored/command/storage/eva) -"rBj" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/binary/pump, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "rBn" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -55224,13 +57536,6 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos) -"rBt" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/turf/open/floor/iron/white/smooth_large, -/area/station/service/kitchen/diner) "rBv" = ( /obj/structure/chair/stool/directional/north, /obj/item/storage/toolbox/artistic{ @@ -55246,14 +57551,18 @@ /obj/item/stack/license_plates/empty/fifty, /turf/open/floor/iron/dark/smooth_half, /area/station/security/prison/work) -"rBI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/engineering/storage/tech) "rBL" = ( /obj/machinery/light/directional/west, /turf/open/openspace, /area/station/commons/storage/mining) +"rBM" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/external, +/turf/open/floor/plating, +/area/station/commons/dorms/laundry) "rBQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ dir = 1 @@ -55263,12 +57572,13 @@ "rBV" = ( /turf/closed/wall, /area/station/tcommsat/computer) -"rCb" = ( -/obj/docking_port/stationary/public_mining_dock{ - dir = 8 +"rCe" = ( +/obj/structure/toilet{ + dir = 4 }, -/turf/open/floor/plating, -/area/station/construction/mining/aux_base) +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron/freezer, +/area/mine/laborcamp) "rCf" = ( /turf/open/floor/iron, /area/station/maintenance/starboard/fore) @@ -55282,11 +57592,39 @@ }, /turf/open/floor/iron/textured_half, /area/station/service/hydroponics) +"rCj" = ( +/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/locker) "rCu" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"rCx" = ( +/obj/item/clothing/glasses/sunglasses, +/obj/item/stack/spacecash/c10, +/obj/item/stack/spacecash/c10, +/obj/item/grenade/smokebomb, +/obj/item/poster/random_contraband{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/clothing/head/soft/yellow, +/obj/effect/spawner/random/maintenance/four, +/obj/item/crowbar/red, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/cardboard, +/obj/effect/turf_decal/siding/blue{ + dir = 5 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/decal/cleanable/wrapping, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/maintenance/port/fore) "rCB" = ( /obj/effect/decal/cleanable/oil, /obj/effect/decal/cleanable/dirt, @@ -55325,6 +57663,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) +"rCU" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/machinery/mining_weather_monitor/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "rCW" = ( /obj/machinery/door/airlock/external{ name = "Atmospherics Internal Airlock" @@ -55356,7 +57703,7 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 }, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) @@ -55370,6 +57717,16 @@ dir = 1 }, /area/mine/eva) +"rDj" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/chair/office{ + dir = 8 + }, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/wood, +/area/station/service/lawoffice) "rDn" = ( /obj/machinery/light/small/directional/south, /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ @@ -55379,13 +57736,34 @@ dir = 10 }, /area/mine/eva) -"rDE" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/hallway/secondary/service) +"rDq" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/table, +/obj/item/clothing/head/utility/welding{ + pixel_x = 4; + pixel_y = 5 + }, +/obj/item/clothing/head/utility/welding{ + pixel_x = 2; + pixel_y = 3 + }, +/obj/item/clothing/head/utility/welding, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/poster/official/safety_internals/directional/east, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/eva) "rDF" = ( /turf/open/floor/iron/white/smooth_large, /area/station/service/kitchen/diner) +"rDH" = ( +/obj/structure/flora/grass/green/style_random, +/mob/living/basic/pet/penguin/emperor{ + name = "Club" + }, +/turf/open/misc/asteroid/snow/standard_air, +/area/station/science/research) "rDJ" = ( /obj/structure/ladder{ name = "upper dispenser access" @@ -55405,19 +57783,11 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/storage) -"rDR" = ( -/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, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "rDZ" = ( /turf/open/floor/engine, /area/station/science/explab) "rEd" = ( -/obj/machinery/modular_computer/console/preset/research{ +/obj/machinery/modular_computer/preset/research{ dir = 4 }, /obj/effect/turf_decal/stripes/line{ @@ -55466,11 +57836,6 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/iron/dark, /area/station/engineering/atmos/project) -"rEB" = ( -/obj/structure/closet, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "rEG" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -55478,11 +57843,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"rEN" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) "rEP" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -55490,25 +57850,29 @@ }, /turf/open/floor/iron/dark/side, /area/station/security/processing) -"rET" = ( -/obj/machinery/atmospherics/components/unary/bluespace_sender, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron/showroomfloor, -/area/station/engineering/atmos) -"rEX" = ( -/obj/effect/spawner/random/trash/mess, +"rEU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/poster/contraband/random/directional/east, -/turf/open/floor/iron, -/area/station/maintenance/starboard/fore) +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) +"rFb" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/grimy, +/area/station/hallway/secondary/entry) "rFf" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 6 }, /turf/open/floor/iron/dark, /area/station/commons/storage/mining) +"rFr" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/service/hydroponics) "rFD" = ( /obj/machinery/firealarm/directional/east, /turf/open/floor/iron, @@ -55544,14 +57908,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/security/armory) -"rGk" = ( -/obj/item/radio/intercom/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) "rGl" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/brown{ @@ -55573,34 +57929,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/engineering/main) -"rGw" = ( -/obj/item/stack/rods/fifty, -/obj/structure/rack, -/obj/item/stack/cable_coil{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/stack/cable_coil{ - amount = 5 - }, -/obj/item/stack/sheet/mineral/plasma{ - amount = 10 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/iron, -/area/station/maintenance/department/electrical) -"rGR" = ( -/obj/machinery/light/directional/east, -/obj/machinery/airalarm/directional/north, -/obj/structure/table, -/obj/machinery/fax{ - fax_name = "Security Office"; - name = "Security Office Fax Machine" - }, -/turf/open/floor/iron/dark/textured, -/area/station/security/office) "rHc" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/red{ @@ -55608,11 +57936,36 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"rHk" = ( +/obj/machinery/exodrone_launcher, +/obj/item/exodrone{ + pixel_y = 8 + }, +/obj/effect/turf_decal/trimline/yellow/end, +/obj/effect/turf_decal/trimline/yellow/mid_joiner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/mid_joiner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/mid_joiner, +/turf/open/floor/iron/smooth_large, +/area/station/cargo/drone_bay) "rHo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/sign/poster/random/directional/south, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"rHr" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 9 + }, +/obj/machinery/duct, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply, +/obj/structure/sign/warning/electric_shock/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/virology) "rHz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/blue/filled/line, @@ -55628,12 +57981,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/virology) -"rHN" = ( -/obj/machinery/light/directional/north, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/circuit/telecomms/mainframe, -/area/station/tcommsat/server) "rHQ" = ( /obj/machinery/computer/message_monitor{ dir = 4 @@ -55643,6 +57990,15 @@ }, /turf/open/floor/iron/dark, /area/station/tcommsat/computer) +"rHZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/department/chapel) "rIc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -55656,11 +58012,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"rIw" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "rIF" = ( /obj/effect/turf_decal/trimline/dark_blue/line, /obj/machinery/camera/directional/south{ @@ -55669,6 +58020,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/mix) +"rII" = ( +/obj/machinery/vending/wardrobe/atmos_wardrobe, +/obj/effect/turf_decal/stripes/end, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/showroomfloor, +/area/station/engineering/atmos) "rIU" = ( /turf/open/floor/iron/white, /area/station/science/robotics/lab) @@ -55694,12 +58051,24 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/science/xenobiology) +"rJr" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/white, +/obj/structure/closet/firecloset, +/obj/machinery/mining_weather_monitor/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "rJv" = ( /obj/machinery/bluespace_beacon, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/command/teleporter) +"rJL" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/parquet, +/area/station/commons/lounge) "rKd" = ( /obj/effect/landmark/start/hangover, /obj/effect/spawner/random/entertainment/gambling, @@ -55722,6 +58091,24 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"rKs" = ( +/obj/structure/chair/stool/directional/south, +/obj/structure/sign/poster/official/work_for_a_future/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/iron, +/area/mine/laborcamp) +"rKv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/supply/visible{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "rKQ" = ( /obj/structure/mineral_door/wood{ name = "Maintenance Bar" @@ -55757,16 +58144,6 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/iron, /area/station/science/xenobiology) -"rLb" = ( -/obj/structure/chair/comfy/beige, -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron/grimy, -/area/station/hallway/secondary/entry) -"rLe" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/dresser, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain) "rLo" = ( /turf/open/floor/plating, /area/station/cargo/miningdock) @@ -55782,6 +58159,14 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/cargo/office) +"rLw" = ( +/obj/machinery/mass_driver/trash{ + dir = 1 + }, +/obj/structure/sign/warning/cold_temp/directional/east, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "rLV" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/effect/turf_decal/siding/thinplating/dark{ @@ -55815,6 +58200,11 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/lobby) +"rMu" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "rME" = ( /obj/structure/railing{ dir = 4 @@ -55839,6 +58229,21 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"rMS" = ( +/obj/structure/table/glass, +/obj/item/toy/figure/cmo{ + pixel_x = -17; + pixel_y = -1 + }, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 5 + }, +/obj/item/pen, +/obj/effect/turf_decal/tile/blue/full, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/heads_quarters/cmo) "rMY" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -55870,6 +58275,17 @@ dir = 4 }, /area/mine/living_quarters) +"rNE" = ( +/obj/docking_port/stationary{ + dir = 2; + dwidth = 2; + height = 13; + name = "port bay 2"; + shuttle_id = "ferry_home"; + width = 5 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "rNQ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -55880,28 +58296,19 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"rNR" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - pixel_x = 1; - pixel_y = 5 +"rOb" = ( +/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/grimy, -/area/station/hallway/secondary/entry) +/turf/open/floor/iron, +/area/station/hallway/primary/port) "rOe" = ( /obj/structure/closet/toolcloset, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"rOj" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "rOA" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -55950,26 +58357,14 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/engineering/lobby) -"rOV" = ( -/obj/item/storage/backpack{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/storage/backpack, -/obj/structure/table, -/turf/open/floor/iron, -/area/station/commons/locker) "rOX" = ( /obj/structure/chair, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"rPd" = ( -/obj/effect/turf_decal/stripes/red/line{ - dir = 8 - }, -/obj/structure/sign/warning/no_smoking/directional/east, -/turf/open/floor/iron/textured, -/area/station/engineering/atmos) "rPe" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/closet/toolcloset, @@ -55991,6 +58386,13 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"rPp" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/fake_stairs/wood/directional/north, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "rPu" = ( /obj/machinery/power/smes, /obj/structure/cable, @@ -56085,16 +58487,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/maintenance/department/chapel) -"rRd" = ( -/obj/machinery/conveyor{ - dir = 6; - id = "garbage" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "rRk" = ( /obj/structure/table, /obj/item/storage/belt/utility, @@ -56123,16 +58515,13 @@ }, /turf/open/floor/wood/parquet, /area/station/service/bar/atrium) -"rRA" = ( -/obj/machinery/button/flasher{ - id = "transferflash"; - pixel_x = 23; - pixel_y = 9 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/light/directional/east, +"rRM" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/event_spawn, +/obj/machinery/light/floor, /turf/open/floor/iron/smooth, -/area/station/security/execution/transfer) +/area/station/security/brig/upper) "rSe" = ( /obj/structure/rack, /obj/effect/spawner/random/clothing/costume, @@ -56146,12 +58535,6 @@ }, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/starboard/fore) -"rSn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/commons/locker) "rSq" = ( /obj/structure/closet, /obj/effect/spawner/random/maintenance, @@ -56204,20 +58587,20 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) +"rST" = ( +/obj/structure/marker_beacon/cerulean, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "rSW" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 }, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"rSY" = ( -/obj/docking_port/stationary/random/icemoon{ - dir = 8; - name = "lavaland"; - shuttle_id = "pod_2_lavaland" - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/unexplored/rivers/no_monsters) +"rTs" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "rTt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56226,15 +58609,6 @@ }, /turf/open/floor/iron, /area/station/cargo/office) -"rTD" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Pod One" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) "rTO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral/opposingcorners, @@ -56258,6 +58632,16 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/security/processing) +"rUa" = ( +/obj/structure/cable/multilayer/multiz, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/sign/nanotrasen{ + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "rUb" = ( /obj/structure/railing, /obj/machinery/flasher/portable, @@ -56275,6 +58659,15 @@ }, /turf/open/floor/iron, /area/station/command/bridge) +"rUv" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) "rUz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -56286,13 +58679,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"rUP" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "rUR" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -56317,17 +58703,6 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"rVb" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/chair/sofa/left/brown{ - desc = "Hey, did you know you can get a pineapple on your burger here?"; - dir = 1; - name = "The Regular's Sofa" - }, -/turf/open/floor/stone, -/area/station/commons/lounge) "rVd" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -56356,10 +58731,16 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"rVy" = ( -/obj/item/kirbyplants/random, -/turf/open/floor/iron/dark/textured, -/area/station/security/processing) +"rVt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/table_or_rack, +/obj/effect/spawner/random/engineering/toolbox, +/obj/effect/spawner/random/engineering/toolbox, +/obj/effect/turf_decal/siding/wood, +/obj/effect/spawner/random/trash/janitor_supplies, +/turf/open/floor/iron/grimy, +/area/station/commons/vacant_room/office) "rVA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -56376,6 +58757,15 @@ }, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) +"rVC" = ( +/obj/structure/table, +/obj/item/storage/backpack{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/storage/backpack, +/turf/open/floor/plastic, +/area/station/commons/dorms/laundry) "rVO" = ( /obj/structure/reagent_dispensers/beerkeg, /obj/item/stack/package_wrap{ @@ -56441,24 +58831,15 @@ /area/station/medical/storage) "rWZ" = ( /obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"rXd" = ( -/obj/effect/turf_decal/siding/wood{ +/obj/effect/turf_decal/stripes/white/line{ dir = 4 }, -/obj/structure/chair/sofa/corp/left{ - dir = 4; - pixel_x = -4; - pixel_y = 8 +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 }, -/obj/effect/landmark/start/hangover, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/sign/poster/random/directional/west, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/grimy, -/area/station/service/bar/atrium) +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/port) "rXe" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 9 @@ -56491,14 +58872,6 @@ }, /turf/open/floor/iron/large, /area/station/commons/storage/primary) -"rXw" = ( -/obj/machinery/mech_bay_recharge_port{ - dir = 1 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/turf_decal/siding/white, -/turf/open/floor/iron/smooth, -/area/mine/mechbay) "rXD" = ( /obj/machinery/button/door/directional/east{ id = "xenobio7"; @@ -56611,20 +58984,13 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) "rYZ" = ( -/obj/machinery/modular_computer/console/preset/civilian, +/obj/machinery/modular_computer/preset/civilian, /turf/open/floor/iron/dark, /area/station/science/ordnance/office) "rZa" = ( /obj/structure/table, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"rZg" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/carpet/red, -/area/station/commons/vacant_room/office) "rZm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56634,14 +59000,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/storage) -"rZn" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"rZs" = ( -/obj/machinery/holopad, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "rZE" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8 @@ -56696,16 +59054,10 @@ dir = 4 }, /area/station/service/chapel) -"sbc" = ( -/obj/machinery/conveyor{ - id = "garbage" - }, -/obj/machinery/door/poddoor/preopen{ - id = "Disposal Exit"; - name = "Disposal Exit Vent" - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) +"sbd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/science/ordnance) "sbf" = ( /obj/structure/sign/plaques/kiddie/devils_tooth{ pixel_y = 32 @@ -56717,6 +59069,15 @@ /obj/machinery/photocopier, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) +"sbv" = ( +/obj/structure/closet/secure_closet/personal{ + anchored = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/south, +/obj/structure/sign/clock/directional/south, +/turf/open/floor/iron, +/area/station/commons/locker) "sby" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -56757,6 +59118,14 @@ /obj/effect/turf_decal/tile/green/anticorner/contrasted, /turf/open/floor/iron/dark, /area/mine/laborcamp) +"sbT" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "sbU" = ( /obj/machinery/vending/cigarette, /turf/open/floor/iron/dark, @@ -56778,25 +59147,19 @@ }, /turf/open/floor/plating, /area/station/science/genetics) -"sce" = ( -/obj/effect/turf_decal/siding/brown{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt{ - pixel_x = -9 - }, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "scl" = ( /obj/structure/bookcase/random, /turf/open/floor/carpet/red, /area/station/security/prison/work) +"scm" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/turf/open/floor/iron/dark/side, +/area/mine/eva/lower) "sco" = ( /obj/effect/turf_decal/trimline/blue/filled/warning, /obj/structure/cable, @@ -56815,16 +59178,16 @@ "scw" = ( /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) -"scH" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/white{ - dir = 4 +"scx" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/tcomms, +/obj/item/radio/off, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 8 }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/airalarm/directional/south, /turf/open/floor/iron, -/area/station/service/bar) +/area/station/tcommsat/computer) "scQ" = ( /obj/structure/tank_holder/oxygen, /obj/effect/decal/cleanable/wrapping, @@ -56838,42 +59201,10 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) -"scY" = ( -/obj/machinery/light/directional/east, -/obj/machinery/button/door/directional/east{ - id = "pharmacy_shutters2"; - name = "Pharmacy Shutter Control"; - req_access = list("pharmacy") - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) "sdc" = ( /obj/structure/sign/departments/cargo, /turf/closed/wall/r_wall, /area/mine/eva) -"sde" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/door/airlock/external{ - name = "Port Docking Bay 1" - }, -/obj/effect/landmark/navigate_destination{ - location = "Arrival Shuttle" - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) -"sdi" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/structure/sign/poster/contraband/random/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "sdk" = ( /obj/structure/extinguisher_cabinet/directional/west, /obj/effect/turf_decal/tile/neutral/half/contrasted, @@ -56891,14 +59222,11 @@ /obj/structure/transit_tube/horizontal, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) -"sdP" = ( -/obj/machinery/light/warm/directional/east, -/obj/structure/chair/sofa/bench/right{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron, -/area/station/security/prison/mess) +"sdE" = ( +/obj/structure/chair/pew/left, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, +/area/station/security/prison/rec) "sdW" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -56929,23 +59257,18 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/eva) +"sez" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "seA" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, /area/station/security/courtroom) -"seE" = ( -/obj/structure/table/reinforced, -/obj/item/screwdriver{ - pixel_y = 10 - }, -/obj/item/radio/off, -/obj/machinery/light/directional/north, -/obj/item/radio/intercom/directional/north, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/red/full, -/turf/open/floor/iron/dark/smooth_large, -/area/station/security/checkpoint/medical) "seH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56955,6 +59278,13 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"seN" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/service/chapel) "seR" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -56978,11 +59308,11 @@ /obj/structure/cable, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) -"sfi" = ( -/obj/item/radio/intercom/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/service/chapel) +"sfr" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/large, +/area/station/hallway/secondary/entry) "sfv" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, @@ -57059,14 +59389,17 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"sgJ" = ( -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Mix to Engine" +"sgT" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/railing/corner/end, +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 8 }, /turf/open/floor/iron, -/area/station/engineering/atmos) +/area/station/commons/locker) "sgV" = ( /obj/effect/turf_decal/siding/brown/corner, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -57142,8 +59475,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/all/command/hop, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) +"shT" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/cafeteria{ + dir = 8 + }, +/area/station/hallway/secondary/entry) "sib" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -57167,6 +59510,7 @@ id = "maint3" }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "siu" = ( @@ -57174,6 +59518,18 @@ /obj/item/storage/toolbox/emergency, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"siv" = ( +/obj/structure/sign/warning/electric_shock/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Security - Lower Hallway North"; + network = list("ss13","prison") + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "six" = ( /obj/structure/table/wood, /obj/item/paper_bin{ @@ -57202,24 +59558,33 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/mine/eva) -"siX" = ( -/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) "sjb" = ( /turf/closed/wall/r_wall, /area/station/cargo/drone_bay) -"sjc" = ( -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) "sjk" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 6 }, /turf/open/floor/glass/reinforced, /area/station/engineering/atmos/pumproom) +"sjx" = ( +/obj/effect/turf_decal/trimline/yellow/end{ + dir = 1 + }, +/obj/machinery/exodrone_launcher, +/obj/item/fuel_pellet, +/obj/effect/turf_decal/trimline/yellow/mid_joiner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/mid_joiner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/mid_joiner{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/smooth_large, +/area/station/cargo/drone_bay) "sjL" = ( /obj/effect/landmark/generic_maintenance_landmark, /obj/item/bikehorn/rubberducky, @@ -57227,6 +59592,10 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/freezer, /area/station/commons/toilet) +"sjU" = ( +/obj/structure/sign/warning/docking/directional/east, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "sjX" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -57248,6 +59617,12 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/station/hallway/secondary/entry) +"skf" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/hallway/secondary/service) "skj" = ( /obj/structure/table, /obj/machinery/light/directional/east, @@ -57344,32 +59719,38 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/atmos) +"skZ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "slc" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 10 }, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"sle" = ( -/obj/structure/table, -/obj/item/stack/sheet/plasteel{ - amount = 10 +"sll" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Arrivals" }, -/obj/item/stack/rods/fifty, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ +/obj/effect/turf_decal/stripes/white/line{ dir = 4 }, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) -"slf" = ( -/obj/machinery/light/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/secondary/entry) "slp" = ( /obj/structure/cable, /obj/machinery/door/poddoor/preopen{ @@ -57379,14 +59760,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/science/xenobiology) -"slv" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/green/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) "slx" = ( /obj/structure/sign/warning/fire/directional/west, /obj/machinery/atmospherics/components/unary/passive_vent/layer2{ @@ -57400,22 +59773,20 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/project) -"slI" = ( -/obj/structure/sign/warning/electric_shock/directional/north, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "slK" = ( -/obj/machinery/atmospherics/components/unary/cryo_cell, +/obj/machinery/cryo_cell, /obj/effect/turf_decal/stripes/line{ dir = 6 }, /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/dark/textured, /area/station/medical/cryo) +"slX" = ( +/obj/structure/fans/tiny, +/obj/effect/turf_decal/stripes/red/box, +/obj/machinery/door/poddoor/massdriver_trash, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "smg" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -57429,6 +59800,29 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) +"smn" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/thinplating_new/corner{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/commons/locker) +"smw" = ( +/obj/structure/closet/emcloset, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) +"smx" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=8"; + location = "QM #3" + }, +/obj/effect/turf_decal/bot, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/cargo/storage) "smC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -57452,6 +59846,13 @@ }, /turf/open/floor/iron, /area/station/command/bridge) +"snd" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "sng" = ( /obj/structure/table, /obj/item/wrench, @@ -57498,19 +59899,6 @@ /obj/machinery/microwave, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"snE" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/half{ - dir = 4 - }, -/turf/open/floor/iron/half{ - dir = 1 - }, -/area/station/hallway/secondary/service) "snI" = ( /obj/structure/extinguisher_cabinet/directional/west, /obj/machinery/vending/modularpc, @@ -57525,11 +59913,6 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"snQ" = ( -/obj/machinery/light/directional/east, -/obj/structure/sign/warning/fire/directional/north, -/turf/open/floor/glass/reinforced, -/area/station/science/ordnance/office) "snW" = ( /obj/machinery/computer/atmos_control/oxygen_tank{ dir = 1 @@ -57591,6 +59974,13 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"soM" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "spg" = ( /obj/structure/table, /obj/item/storage/box/monkeycubes{ @@ -57617,14 +60007,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/genetics) -"spq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/supply/visible{ - dir = 1 - }, -/obj/machinery/newscaster/directional/north, -/obj/effect/turf_decal/siding/wideplating, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) "spv" = ( /obj/structure/window/reinforced/plasma/spawner/directional/east, /obj/structure/cable, @@ -57632,13 +60014,6 @@ /obj/machinery/power/energy_accumulator/tesla_coil/anchored, /turf/open/floor/engine, /area/station/engineering/supermatter) -"spM" = ( -/obj/machinery/light/directional/east, -/obj/effect/landmark/start/hangover, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "spV" = ( /obj/machinery/recharger, /obj/structure/sign/warning/biohazard/directional/east, @@ -57660,6 +60035,22 @@ /obj/effect/spawner/random/structure/table_fancy, /turf/open/floor/wood, /area/station/service/library) +"sqb" = ( +/obj/item/coin/iron{ + pixel_y = -5 + }, +/obj/item/coin/plasma{ + pixel_y = -2; + pixel_x = 3 + }, +/obj/item/toy/plush/lizard_plushie{ + pixel_x = 11; + pixel_y = -4; + name = "Cassius" + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/commons/dorms/laundry) "sqn" = ( /obj/machinery/computer/records/security{ dir = 1 @@ -57673,11 +60064,12 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) -"sqs" = ( -/obj/machinery/skill_station, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/wood, -/area/station/service/library) +"sqq" = ( +/obj/structure/table, +/obj/item/electronics/apc, +/obj/item/electronics/airlock, +/turf/open/floor/plating, +/area/station/engineering/storage/tech) "sqt" = ( /turf/open/floor/iron/dark, /area/station/science/ordnance/office) @@ -57720,6 +60112,22 @@ /obj/machinery/status_display/ai/directional/west, /turf/open/floor/plating, /area/station/engineering/storage/tech) +"srb" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/cold/directional/north, +/obj/structure/sign/warning/bodysposal/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/surgery/fore) +"sre" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "srk" = ( /obj/machinery/door/window/right/directional/north{ dir = 8; @@ -57773,10 +60181,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/office) -"srY" = ( -/obj/machinery/deepfryer, -/turf/open/floor/iron/cafeteria, -/area/station/security/prison/mess) "srZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -57809,14 +60213,11 @@ /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, /area/station/engineering/storage/tech) -"ssB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, +"ssv" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/thinplating_new/corner, /turf/open/floor/iron, -/area/station/hallway/secondary/entry) +/area/station/commons/locker) "ssF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -57843,13 +60244,16 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/white, /area/station/science/ordnance) -"std" = ( -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/stripes/line{ +"sth" = ( +/obj/item/radio/intercom/directional/east, +/obj/structure/disposalpipe/trunk{ dir = 1 }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) +/obj/machinery/disposal/bin, +/obj/machinery/computer/security/telescreen/entertainment/directional/south, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/storage) "sto" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -57881,6 +60285,15 @@ dir = 1 }, /area/station/security/lockers) +"stw" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics) "stA" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -57912,6 +60325,18 @@ /obj/structure/flora/grass/brown/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) +"stL" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"stP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/crate_abandoned, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/iron/grimy, +/area/station/commons/vacant_room/office) "stQ" = ( /obj/machinery/camera/directional/west{ c_tag = "Security Post - Science"; @@ -57949,6 +60374,13 @@ /obj/structure/sign/warning/gas_mask, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"suA" = ( +/obj/structure/closet/crate/coffin, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/random/directional/north, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/department/chapel) "suE" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/effect/landmark/start/hangover, @@ -57994,10 +60426,6 @@ /obj/effect/turf_decal/tile/blue/full, /turf/open/floor/iron/large, /area/station/medical/treatment_center) -"svw" = ( -/obj/structure/closet/secure_closet/brig, -/turf/open/floor/iron/smooth, -/area/station/security/execution/transfer) "svy" = ( /obj/effect/decal/cleanable/oil, /obj/item/stack/ore/glass, @@ -58014,26 +60442,15 @@ /obj/structure/dresser, /turf/open/floor/wood, /area/station/commons/dorms) -"svL" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Cargo Bay North" - }, -/obj/machinery/vending/wardrobe/cargo_wardrobe, -/turf/open/floor/iron, -/area/station/cargo/storage) -"svO" = ( -/obj/structure/cable, +"svN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark/textured, -/area/station/security/warden) -"svP" = ( -/obj/machinery/light/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/station/engineering/storage/tech) +"swa" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/engine, +/area/station/science/explab) "swc" = ( /obj/machinery/light/directional/south, /obj/effect/decal/cleanable/dirt, @@ -58068,6 +60485,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/security/prison/rec) +"swr" = ( +/obj/machinery/recharger, +/obj/structure/table, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/ai_monitored/security/armory) "sws" = ( /obj/machinery/door/airlock/security{ name = "Permabrig Library" @@ -58088,12 +60512,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/orange/visible, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) -"sww" = ( -/obj/machinery/light/directional/south, -/obj/machinery/light_switch/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/security/prison/visit) "swx" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/portable_atmospherics/canister, @@ -58102,23 +60520,24 @@ }, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"swz" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Locker Room West" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/locker) "swF" = ( /turf/closed/wall, /area/station/ai_monitored/turret_protected/aisat_interior) -"swQ" = ( -/obj/structure/table, -/obj/item/electronics/apc, -/obj/item/electronics/airlock, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/engineering/storage/tech) +"swI" = ( +/obj/machinery/medical_kiosk, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"swK" = ( +/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/white/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) "swS" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, @@ -58148,6 +60567,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"sxw" = ( +/obj/structure/table/glass, +/obj/item/storage/medkit/regular, +/obj/machinery/newscaster/directional/east, +/obj/effect/turf_decal/tile/green/full, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron/white/smooth_large, +/area/station/medical/medbay/aft) "sxF" = ( /obj/structure/chair/stool/directional/north, /turf/open/floor/plating, @@ -58159,6 +60586,10 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/fore) +"sxQ" = ( +/obj/structure/sign/warning/electric_shock/directional/east, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "sxT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -58173,6 +60604,11 @@ /obj/structure/sign/poster/random/directional/east, /turf/open/floor/wood/parquet, /area/station/commons/lounge) +"sxY" = ( +/obj/structure/cable/multilayer/multiz, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/plating/snowed/icemoon, +/area/station/maintenance/port/aft) "sxZ" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/stripes/line{ @@ -58223,28 +60659,30 @@ /turf/open/floor/iron/dark, /area/station/service/hydroponics) "syL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sink/directional/south, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/white/corner{ + dir = 8 + }, +/area/station/hallway/secondary/entry) +"syT" = ( +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) +"syU" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 5 + }, +/obj/effect/landmark/start/station_engineer, +/obj/machinery/light/floor, /turf/open/floor/iron, -/area/station/hallway/secondary/service) +/area/station/engineering/lobby) "syW" = ( /obj/effect/spawner/structure/window/hollow/reinforced/end, /turf/open/floor/plating, /area/station/medical/morgue) -"syY" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "MiniSat Atmospherics"; - network = list("minisat"); - start_active = 1 - }, -/obj/machinery/airalarm/directional/west, -/obj/machinery/space_heater, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/atmos) "szo" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -58254,18 +60692,11 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"szp" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) -"szx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 1 - }, -/area/station/command/gateway) +"szu" = ( +/obj/structure/sign/poster/official/obey/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/mine/laborcamp) "szz" = ( /obj/machinery/newscaster/directional/north, /obj/effect/turf_decal/tile/red{ @@ -58285,6 +60716,19 @@ /obj/structure/sign/warning/cold_temp/directional/north, /turf/open/floor/iron/smooth, /area/station/cargo/warehouse) +"szR" = ( +/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/floor, +/turf/open/floor/iron/edge{ + dir = 4 + }, +/area/station/engineering/lobby) +"szX" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/commons/dorms/laundry) "sAa" = ( /obj/structure/stairs/north, /obj/structure/railing{ @@ -58340,45 +60784,12 @@ }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) -"sAV" = ( -/obj/machinery/firealarm/directional/west, -/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, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "sBi" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/department/electrical) -"sBt" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/cup/glass/bottle/vodka/badminka{ - pixel_x = 7; - pixel_y = 20 - }, -/obj/item/taperecorder{ - pixel_x = -5; - pixel_y = 1 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ - pixel_x = 7; - pixel_y = 8 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ - pixel_x = 6 - }, -/obj/item/storage/secure/safe/hos{ - pixel_x = 35 - }, -/obj/machinery/light/directional/south, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/dark/smooth_large, -/area/station/command/heads_quarters/hos) "sBu" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -58394,6 +60805,13 @@ }, /turf/open/floor/iron/dark/smooth_edge, /area/station/ai_monitored/command/storage/eva) +"sBw" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/iron, +/area/station/security/prison/workout) "sBx" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/lattice/catwalk, @@ -58412,21 +60830,6 @@ /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron/dark/textured, /area/station/engineering/atmos/storage/gas) -"sBL" = ( -/obj/structure/sink/directional/west, -/obj/structure/sign/poster/official/cleanliness/directional/east, -/turf/open/floor/iron, -/area/station/maintenance/port/fore) -"sBS" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Aft Primary Hallway North" - }, -/obj/machinery/newscaster/directional/west, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) "sBV" = ( /obj/machinery/computer/security/telescreen/entertainment/directional/south, /obj/effect/spawner/random/vending/snackvend, @@ -58435,11 +60838,13 @@ }, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/exit/departure_lounge) -"sCg" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood/large, -/area/mine/eva/lower) +"sCa" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 5 + }, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/security/prison/rec) "sCm" = ( /obj/machinery/power/terminal{ dir = 1 @@ -58510,6 +60915,11 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/plating, /area/station/commons/storage/mining) +"sDr" = ( +/obj/structure/chair/stool/directional/south, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "sDs" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -58521,6 +60931,13 @@ /obj/machinery/igniter/incinerator_ordmix, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/burnchamber) +"sDQ" = ( +/obj/item/radio/intercom/prison/directional/north, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured_edge, +/area/station/security/prison) "sDT" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, @@ -58532,11 +60949,21 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"sEg" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/sign/poster/random/directional/west, +/turf/open/floor/iron/large, +/area/station/hallway/secondary/entry) "sEi" = ( /turf/open/floor/carpet, /area/station/service/library) "sEl" = ( /obj/structure/table, +/obj/item/hand_labeler{ + pixel_y = 2 + }, /turf/open/floor/wood, /area/station/command/meeting_room) "sEp" = ( @@ -58552,10 +60979,6 @@ }, /turf/open/floor/plating, /area/mine/living_quarters) -"sEx" = ( -/obj/structure/closet/secure_closet/medical2, -/turf/open/floor/iron, -/area/station/maintenance/port/fore) "sEz" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -58622,18 +61045,10 @@ /obj/effect/turf_decal/tile/blue/full, /turf/open/floor/iron/large, /area/station/medical/treatment_center) -"sEM" = ( -/obj/structure/table/wood, -/obj/item/phone{ - pixel_x = -5; - pixel_y = 6 - }, -/obj/item/reagent_containers/cup/glass/mug/britcup{ - pixel_x = 8; - pixel_y = 8 - }, -/turf/open/floor/carpet/red, -/area/station/commons/vacant_room/office) +"sEO" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/smooth, +/area/mine/living_quarters) "sEU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /turf/closed/wall/r_wall, @@ -58647,6 +61062,20 @@ }, /turf/open/floor/iron/white/corner, /area/station/engineering/atmos) +"sFd" = ( +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/structure/closet/crate/trashcart/laundry, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "sFj" = ( /obj/structure/chair/office/light{ dir = 4 @@ -58658,16 +61087,6 @@ }, /turf/open/floor/iron, /area/station/science/explab) -"sFu" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Security - Upper Permabrig Hallway North"; - network = list("ss13","prison") - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark/textured_edge, -/area/station/security/prison) "sFA" = ( /obj/machinery/sparker/directional/west{ id = "testigniter" @@ -58735,6 +61154,17 @@ }, /turf/open/floor/iron, /area/station/security/brig/upper) +"sGq" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden) "sGv" = ( /obj/structure/ladder, /obj/machinery/light/small/directional/east, @@ -58777,6 +61207,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) +"sGM" = ( +/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/directional/east, +/obj/structure/sign/warning/directional/east, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/port/lesser) "sGZ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/crate, @@ -58803,25 +61241,15 @@ /obj/machinery/disposal/bin, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"sHf" = ( -/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/structure/sign/warning/bodysposal/directional/south, -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) "sHh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/service/chapel) +"sHl" = ( +/obj/machinery/vending/coffee, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/stone, +/area/mine/eva/lower) "sHB" = ( /obj/effect/turf_decal/tile/red/full, /turf/open/floor/iron/large, @@ -58834,6 +61262,15 @@ /obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) +"sHK" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/structure/steam_vent, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "sHM" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -58843,6 +61280,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) +"sHO" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/end, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron, +/area/station/maintenance/port/fore) +"sHV" = ( +/obj/machinery/atmospherics/components/tank/air{ + initialize_directions = 2 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "sHX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -58867,6 +61318,14 @@ /obj/machinery/hydroponics/soil, /turf/open/floor/grass, /area/station/service/hydroponics) +"sIp" = ( +/obj/structure/closet/radiation, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/engineering/main) "sIt" = ( /turf/closed/wall, /area/station/maintenance/central/lesser) @@ -58874,18 +61333,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/mix) -"sIC" = ( -/obj/effect/turf_decal/siding/white{ - dir = 1 - }, -/obj/structure/chair{ - dir = 8 - }, -/obj/structure/sign/poster/random/directional/north, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/red/full, -/turf/open/floor/iron/large, -/area/station/service/kitchen/diner) "sIJ" = ( /obj/machinery/firealarm/directional/west, /turf/open/floor/carpet/blue, @@ -58920,19 +61367,26 @@ /obj/structure/cable, /turf/open/floor/plating, /area/mine/storage) -"sIV" = ( -/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/neutral/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) +"sJe" = ( +/obj/machinery/deepfryer, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/iron/cafeteria, +/area/station/security/prison/mess) "sJi" = ( /obj/machinery/vending/donksofttoyvendor, /turf/open/floor/iron/dark/textured, /area/station/security/prison/safe) +"sJk" = ( +/obj/structure/cable, +/obj/machinery/camera/directional/west{ + c_tag = "Dormitory South" + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/commons/dorms) "sJn" = ( /obj/structure/closet/emcloset, /obj/structure/sign/warning/gas_mask/directional/west, @@ -58941,6 +61395,13 @@ }, /turf/open/floor/iron/dark, /area/station/cargo/miningdock) +"sJq" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "sJr" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -59028,6 +61489,17 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/wood, /area/station/command/meeting_room) +"sKV" = ( +/obj/machinery/computer/security/telescreen{ + name = "Test Chamber Monitor"; + network = list("xeno"); + pixel_y = 26 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white/side{ + dir = 1 + }, +/area/station/command/heads_quarters/rd) "sKW" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -59048,6 +61520,12 @@ }, /turf/open/floor/iron, /area/mine/laborcamp/security) +"sLj" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark/corner, +/area/station/security/processing) "sLD" = ( /obj/structure/table/reinforced, /obj/item/stack/sheet/iron/fifty, @@ -59062,6 +61540,26 @@ dir = 1 }, /area/station/medical/chemistry) +"sLR" = ( +/obj/machinery/conveyor{ + id = "garbage"; + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"sMb" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/processor{ + pixel_y = 6 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "sMg" = ( /turf/open/floor/engine/air, /area/station/engineering/atmos) @@ -59085,6 +61583,11 @@ dir = 1 }, /area/station/security/prison) +"sML" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/aisat/hallway) "sMS" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/left/directional/north{ @@ -59107,9 +61610,10 @@ req_access = list("hop") }, /obj/machinery/flasher/directional/south{ - pixel_y = -23; - id = "hopflash" + id = "hopflash"; + pixel_y = -23 }, +/obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) "sMY" = ( @@ -59122,11 +61626,21 @@ dir = 1 }, /area/station/security/office) -"sNb" = ( -/obj/machinery/airalarm/directional/west, -/obj/machinery/light/small/directional/west, +"sNr" = ( +/obj/machinery/door/airlock/security/glass{ + id_tag = "permainner"; + name = "Permabrig Transfer" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "perma-entrance" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/siding/red/corner{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron/dark/textured, -/area/station/security/interrogation) +/area/station/security/execution/transfer) "sNs" = ( /obj/structure/closet/crate/hydroponics, /obj/effect/turf_decal/trimline/green/filled, @@ -59139,6 +61653,14 @@ /obj/item/seeds/potato, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) +"sNt" = ( +/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/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/mine/production) "sNu" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, @@ -59149,6 +61671,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/atmos) +"sNA" = ( +/obj/structure/sign/nanotrasen{ + pixel_x = 32 + }, +/obj/structure/marker_beacon/burgundy, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "sNI" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59172,10 +61701,6 @@ /obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/iron, /area/station/command/bridge) -"sOl" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "sOm" = ( /obj/structure/railing{ dir = 4 @@ -59188,11 +61713,6 @@ "sOn" = ( /turf/closed/wall, /area/station/cargo/lobby) -"sOo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) "sOz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59238,22 +61758,6 @@ /obj/item/storage/bag/trash, /turf/open/floor/iron, /area/station/maintenance/port/fore) -"sPu" = ( -/obj/structure/table, -/obj/item/paper{ - pixel_y = 7 - }, -/obj/item/paper{ - pixel_x = 4; - pixel_y = 2 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood/large, -/area/mine/eva/lower) -"sPx" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/maintenance/aft/greater) "sPA" = ( /obj/structure/rack, /obj/item/storage/bag/ore, @@ -59308,25 +61812,15 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/general, /turf/open/floor/iron, /area/station/cargo/storage) -"sQm" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/door/airlock/external{ - name = "Port Docking Bay 3" +"sQc" = ( +/obj/structure/table, +/obj/item/food/sandwich/cheese/grilled{ + name = "idiot sandwich"; + pixel_y = 8 }, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) -"sQv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/event_spawn, -/turf/open/floor/carpet, -/area/station/service/chapel) -"sQx" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron/icemoon, -/area/icemoon/surface/outdoors/nospawn) +/obj/effect/turf_decal/tile/purple/fourcorners, +/turf/open/floor/iron, +/area/mine/living_quarters) "sQB" = ( /turf/closed/wall, /area/station/security/brig/upper) @@ -59336,17 +61830,6 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"sRc" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 10 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics) "sRp" = ( /obj/structure/fence, /obj/effect/turf_decal/weather/snow/corner{ @@ -59358,6 +61841,14 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"sRL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/machinery/incident_display/delam/directional/north, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "sRQ" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/table/wood, @@ -59370,6 +61861,14 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central) +"sSh" = ( +/obj/effect/turf_decal/siding/white{ + dir = 6 + }, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/red/full, +/turf/open/floor/iron/large, +/area/station/service/kitchen/diner) "sSj" = ( /obj/machinery/light/small/directional/south, /obj/structure/chair/sofa/left/brown{ @@ -59378,28 +61877,17 @@ /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron/white, /area/station/medical/break_room) -"sSn" = ( -/obj/structure/sign/poster/official/work_for_a_future/directional/north, +"sSl" = ( +/obj/structure/hoop{ + dir = 4 + }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/mine/laborcamp) +/area/station/security/prison/workout) "sSA" = ( /obj/structure/sign/warning/secure_area/directional/south, /turf/open/openspace/icemoon/keep_below, /area/icemoon/surface/outdoors/nospawn) -"sSD" = ( -/obj/effect/landmark/observer_start, -/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, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "sSE" = ( /obj/machinery/door/firedoor/heavy, /turf/open/floor/iron/white/side{ @@ -59423,6 +61911,17 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/security/brig) +"sSR" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "sSS" = ( /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark, @@ -59435,6 +61934,11 @@ /obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible, /turf/open/floor/plating, /area/station/engineering/atmos/pumproom) +"sTh" = ( +/obj/structure/table, +/obj/item/storage/toolbox/emergency, +/turf/open/floor/plastic, +/area/station/commons/dorms/laundry) "sTi" = ( /obj/effect/turf_decal/box/white{ color = "#52B4E9" @@ -59548,7 +62052,7 @@ /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/structure/disposalpipe/junction/flip, /turf/open/floor/iron, /area/station/hallway/secondary/service) "sUS" = ( @@ -59584,12 +62088,6 @@ /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/freezer, /area/station/commons/toilet/locker) -"sVr" = ( -/obj/effect/spawner/random/trash/mess, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) "sVL" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, @@ -59599,14 +62097,14 @@ /obj/item/screwdriver, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) -"sWa" = ( -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/iron/dark, -/area/mine/eva/lower) +"sVW" = ( +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/obj/effect/turf_decal/box/corners, +/obj/effect/landmark/bitrunning/station_reward_spawn, +/turf/open/floor/iron/dark/smooth_large, +/area/station/bitrunning/den) "sWl" = ( /obj/machinery/door/airlock/command{ name = "Chief Medical Officer" @@ -59640,19 +62138,10 @@ /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_smooth, /area/station/maintenance/fore/lesser) -"sWx" = ( -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/science/ordnance) "sWB" = ( /obj/machinery/door/airlock/mining/glass{ name = "Mining Smeltery" @@ -59671,15 +62160,6 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/service/theater) -"sWQ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Central Hallway South" - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "sXb" = ( /obj/machinery/status_display/ai/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -59701,11 +62181,27 @@ }, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) -"sXz" = ( -/obj/machinery/light/directional/north, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/chemistry) +"sXf" = ( +/obj/structure/window/reinforced/spawner/directional/north{ + layer = 2.9 + }, +/obj/structure/table/reinforced, +/obj/item/stack/wrapping_paper{ + pixel_x = 3; + pixel_y = 4 + }, +/obj/item/stack/package_wrap{ + pixel_x = -1; + pixel_y = -1 + }, +/obj/item/dest_tagger, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/cargo/sorting) "sXC" = ( /obj/structure/table, /obj/machinery/button/ignition{ @@ -59751,24 +62247,20 @@ /obj/effect/turf_decal/tile/neutral/anticorner/contrasted, /turf/open/floor/iron, /area/station/commons/dorms) -"sYg" = ( -/obj/machinery/light/directional/east, -/obj/item/radio/intercom/directional/east, -/obj/structure/disposalpipe/trunk{ - dir = 1 +"sYe" = ( +/obj/structure/table/wood, +/obj/item/clothing/under/suit/red, +/obj/item/flashlight/flare/candle{ + pixel_x = -8; + pixel_y = 4 }, -/obj/machinery/disposal/bin, -/obj/machinery/computer/security/telescreen/entertainment/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/storage) -"sYl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/wardrobe/pjs{ - anchored = 1 +/obj/item/flashlight/flare/candle{ + pixel_x = 8; + pixel_y = 4 }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/maintenance/port/fore) +/obj/machinery/light/small/directional/north, +/turf/open/floor/engine/cult, +/area/station/service/library) "sYu" = ( /obj/machinery/door/firedoor, /obj/effect/landmark/event_spawn, @@ -59873,27 +62365,11 @@ }, /turf/open/floor/iron/dark, /area/station/commons/storage/primary) -"tao" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron, -/area/station/maintenance/department/electrical) "tau" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/green/half/contrasted, /turf/open/floor/iron, /area/station/security/prison/garden) -"taK" = ( -/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 - }, -/obj/machinery/duct, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "taN" = ( /obj/item/radio/intercom/directional/west, /obj/effect/turf_decal/tile/yellow/opposingcorners, @@ -59903,6 +62379,13 @@ /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, /area/station/security/prison/safe) +"tba" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "tbb" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ @@ -59924,9 +62407,34 @@ /obj/structure/flora/bush/sunny/style_random, /turf/open/floor/grass, /area/station/service/hydroponics) +"tbN" = ( +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, +/obj/machinery/door/airlock/engineering{ + name = "Utilities Room" + }, +/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/unres{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "tbQ" = ( /turf/open/floor/iron/grimy, /area/station/maintenance/aft/greater) +"tbR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/cafeteria{ + dir = 8 + }, +/area/station/hallway/secondary/entry) "tbX" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 4 @@ -59951,21 +62459,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply, /turf/open/floor/iron/dark, /area/station/medical/virology) -"tcO" = ( -/obj/structure/rack, -/obj/item/clothing/suit/hooded/wintercoat/eva{ - pixel_y = 9 - }, -/obj/item/clothing/shoes/winterboots/ice_boots/eva{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/effect/turf_decal/delivery/red, -/obj/item/clothing/gloves/color/grey/protects_cold, -/obj/item/clothing/mask/gas, -/obj/machinery/status_display/evac/directional/west, -/turf/open/floor/iron/textured, -/area/station/ai_monitored/command/storage/eva) "tcQ" = ( /obj/machinery/camera/directional/west{ c_tag = "Security - Permabrig Recreation"; @@ -59976,6 +62469,21 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/prison/rec) +"tcR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/maintenance/port/fore) +"tda" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/qm) "tdb" = ( /obj/effect/landmark/event_spawn, /obj/structure/cable, @@ -59984,17 +62492,12 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"tdi" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/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/port/greater) +"tdp" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "tdE" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -60018,10 +62521,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/service/chapel) -"tdY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/closed/wall/r_wall, -/area/station/science/ordnance/burnchamber) "ted" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -60043,6 +62542,15 @@ /obj/structure/fence, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) +"teE" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters{ + id = "vacantofficemaintshutter"; + name = "Privacy Shutters"; + dir = 8 + }, +/turf/open/floor/plating, +/area/station/commons/vacant_room/office) "teN" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -60114,6 +62622,9 @@ name = "Garden" }, /obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron/dark, /area/station/commons/storage/primary) "tge" = ( @@ -60136,13 +62647,6 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"tgu" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "tgw" = ( /obj/machinery/door/airlock/maintenance{ name = "Research Delivery Access" @@ -60152,6 +62656,7 @@ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "tgx" = ( @@ -60176,6 +62681,17 @@ /mob/living/simple_animal/bot/secbot/beepsky/armsky, /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/security/armory) +"thc" = ( +/obj/structure/table/reinforced, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/item/gun/energy/laser/practice{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/gun/energy/laser/practice, +/obj/item/clothing/ears/earmuffs, +/turf/open/floor/iron/dark/textured, +/area/station/security/range) "thA" = ( /turf/open/genturf/blue, /area/icemoon/underground/unexplored/rivers/deep/shoreline) @@ -60183,6 +62699,22 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"thE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"thI" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Fore Primary Hallway - Courtroom Hallway" + }, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "thK" = ( /obj/item/screwdriver{ pixel_y = 10 @@ -60203,6 +62735,21 @@ /obj/effect/spawner/random/trash/mess, /turf/open/floor/wood, /area/station/maintenance/port/aft) +"thX" = ( +/obj/effect/turf_decal/tile/blue, +/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/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) +"thY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "tia" = ( /obj/structure/table, /obj/item/stack/sheet/glass/fifty{ @@ -60229,6 +62776,11 @@ dir = 8 }, /area/mine/eva) +"tip" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/fore) "tis" = ( /obj/structure/window/reinforced/fulltile, /obj/structure/transit_tube/horizontal, @@ -60242,16 +62794,6 @@ /obj/structure/chair/stool/directional/west, /turf/open/floor/carpet, /area/station/service/theater) -"tiQ" = ( -/obj/structure/sink/directional/east, -/obj/machinery/button/door/directional/west{ - id = "xenobio2"; - layer = 4; - name = "Xenobio Pen 2 Blast Door"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "tiV" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -60323,14 +62865,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/fore) -"tjV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet/personal{ - anchored = 1 - }, -/obj/item/clothing/gloves/boxing, -/turf/open/floor/iron, -/area/station/maintenance/starboard/fore) "tjY" = ( /obj/effect/turf_decal/siding/yellow{ dir = 4 @@ -60342,14 +62876,11 @@ /turf/open/floor/iron/dark/corner, /area/station/engineering/atmos/storage/gas) "tkc" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/turf/open/floor/wood, +/obj/machinery/airalarm/directional/north, +/obj/item/kirbyplants/random, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) "tkf" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -60357,24 +62888,25 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"tkk" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/machinery/light/directional/north, +"tki" = ( +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/station/cargo/storage) -"tkB" = ( -/obj/machinery/camera/motion/directional/north{ - c_tag = "EVA Storage North" +/area/station/hallway/secondary/service) +"tku" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 }, -/obj/structure/sign/warning/secure_area/directional/north, -/obj/structure/tank_dispenser/oxygen, -/obj/effect/turf_decal/bot_white, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/smooth_half{ - dir = 1 +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 }, -/area/station/ai_monitored/command/storage/eva) +/obj/machinery/door/airlock/multi_tile/public/glass{ + name = "Auxiliary Dock"; + dir = 4 + }, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/secondary/entry) "tkP" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -60387,6 +62919,9 @@ dir = 9 }, /area/station/science/research) +"tkU" = ( +/turf/open/lava/plasma/ice_moon, +/area/icemoon/surface/outdoors/nospawn) "tkV" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/west, @@ -60401,6 +62936,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/storage_shared) +"tlm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/random/structure/steam_vent, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "tln" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/engine/o2, @@ -60438,6 +62979,14 @@ "tlH" = ( /turf/open/openspace/icemoon, /area/icemoon/surface/outdoors/nospawn) +"tlO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "tlP" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -60461,14 +63010,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/security/prison/safe) -"tmb" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Ordnance Lab Maintenance" +"tma" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/white/line, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 }, -/obj/machinery/door/firedoor/heavy, -/obj/effect/mapping_helpers/airlock/access/all/science/ordnance, -/turf/open/floor/plating, -/area/station/science/ordnance) +/turf/open/floor/iron/dark/textured, +/area/station/hallway/secondary/entry) "tml" = ( /obj/structure/grille, /turf/open/floor/plating, @@ -60501,6 +63051,19 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/dark, /area/mine/eva/lower) +"tmL" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/kirbyplants/random, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/hallway/secondary/entry) "tmQ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -60628,12 +63191,28 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/hallway/secondary/exit/departure_lounge) -"tpj" = ( -/obj/machinery/firealarm/directional/south, +"tpk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/binary/pressure_valve/on{ + dir = 4; + name = "Output Release" + }, /obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/brig/upper) +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"tpG" = ( +/obj/machinery/door/firedoor, +/obj/effect/landmark/navigate_destination, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/line, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark/textured, +/area/station/commons/locker) "tpH" = ( /turf/closed/wall, /area/station/security/execution/education) @@ -60668,9 +63247,9 @@ }, /obj/effect/turf_decal/tile/yellow/fourcorners, /obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; id = "pharmacy_shutters2"; - name = "Pharmacy Shutters"; - dir = 4 + name = "Pharmacy Shutters" }, /turf/open/floor/iron, /area/station/medical/pharmacy) @@ -60685,12 +63264,10 @@ /turf/open/floor/iron, /area/station/service/janitor) "tqC" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/miningdock) +/obj/machinery/netpod, +/obj/machinery/camera/directional/south, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/bitrunning/den) "tqQ" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -60724,13 +63301,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/science/explab) -"trf" = ( -/obj/structure/cable, -/obj/machinery/light/directional/north, -/obj/structure/closet/radiation, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/station/maintenance/disposal/incinerator) +"trc" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "garbage" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "trl" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/iron/white/smooth_large, @@ -60744,6 +63322,13 @@ }, /turf/open/floor/glass/reinforced, /area/station/hallway/primary/starboard) +"trA" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/structure/sign/poster/official/obey/directional/west, +/turf/open/floor/iron/dark/textured, +/area/station/security/execution/transfer) "trK" = ( /obj/structure/disposalpipe/junction/flip, /turf/open/floor/iron/dark, @@ -60785,13 +63370,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/dark/textured, /area/station/security/interrogation) -"tsJ" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "tsK" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 9 @@ -60822,23 +63400,6 @@ /obj/effect/decal/cleanable/oil/slippery, /turf/open/floor/plating, /area/station/maintenance/department/electrical) -"tta" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/pen{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/folder/white{ - pixel_x = 2 - }, -/obj/machinery/light/directional/west, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/dark, -/area/station/science/genetics) "ttb" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -60868,6 +63429,17 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/security/prison/rec) +"ttO" = ( +/obj/structure/closet/secure_closet/medical2, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/machinery/button/door/directional/south{ + id = "surgery"; + name = "Surgery Shutter Control" + }, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) "ttT" = ( /obj/machinery/door/airlock/mining/glass{ id_tag = "innercargo"; @@ -60935,6 +63507,10 @@ pixel_x = 5; pixel_y = 2 }, +/obj/item/storage/wallet/random{ + pixel_x = 6; + pixel_y = -24 + }, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) "tuH" = ( @@ -60943,6 +63519,10 @@ /obj/effect/landmark/start/prisoner, /turf/open/floor/iron, /area/station/security/prison/mess) +"tva" = ( +/obj/machinery/light/small/directional/south, +/turf/open/openspace, +/area/station/service/chapel) "tvd" = ( /obj/machinery/door/poddoor/preopen{ id = "atmos"; @@ -60953,6 +63533,18 @@ }, /turf/open/floor/iron/dark/corner, /area/station/engineering/atmos) +"tvm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/newscaster/directional/north, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) "tvv" = ( /obj/machinery/door/airlock/command/glass{ name = "Research Director" @@ -60978,6 +63570,11 @@ dir = 1 }, /area/station/engineering/engine_smes) +"tvI" = ( +/obj/structure/chair/sofa/corp/right, +/obj/machinery/light/directional/north, +/turf/open/floor/wood, +/area/station/hallway/secondary/service) "tvJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60991,12 +63588,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark/textured_edge, /area/station/security/evidence) -"tvT" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/machinery/light/small/directional/south, -/obj/structure/sign/poster/official/safety_eye_protection/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "tvW" = ( /obj/machinery/computer/telecomms/monitor{ dir = 4; @@ -61011,11 +63602,28 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"twb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/mine/laborcamp) "twt" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, /area/station/engineering/engine_smes) +"tww" = ( +/obj/effect/landmark/start/prisoner, +/obj/effect/landmark/event_spawn, +/obj/machinery/holopad, +/turf/open/floor/carpet/red, +/area/station/security/prison/work) "twK" = ( /obj/machinery/porta_turret/ai{ dir = 8 @@ -61085,15 +63693,22 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/construction, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"txh" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/maintenance{ - name = "Locker Room Maintenance" +"txd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/warning/cold_temp/directional/west, +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"txe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/blobstart, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/maintenance/port/fore) "txj" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -61105,10 +63720,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"txk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/closed/wall/r_wall, -/area/station/maintenance/starboard/aft) "txo" = ( /obj/effect/turf_decal/siding/yellow/end{ dir = 4 @@ -61141,20 +63752,25 @@ /obj/machinery/holopad, /turf/open/floor/iron, /area/station/engineering/atmos) -"tyf" = ( -/obj/structure/table/reinforced, -/obj/machinery/light_switch/directional/east, -/obj/machinery/reagentgrinder{ - pixel_y = 8 +"tyi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/event_spawn, +/obj/machinery/light/floor, +/turf/open/floor/carpet, +/area/station/service/chapel) +"tyj" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, -/turf/open/floor/iron/dark/textured_edge{ - dir = 4 +/obj/structure/chair/sofa/left/brown{ + desc = "Hey, did you know you can get a pineapple on your burger here?"; + dir = 1; + name = "The Regular's Sofa" }, -/area/station/medical/medbay/central) -"tyg" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/construction) +/obj/machinery/barsign/all_access/directional/south, +/turf/open/floor/stone, +/area/station/commons/lounge) "tyl" = ( /obj/structure/ladder, /obj/machinery/light/small/directional/north, @@ -61174,7 +63790,11 @@ /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/machinery/door/airlock/mining{ + name = "Mining Dock" + }, +/obj/effect/mapping_helpers/airlock/access/all/supply/mining, +/obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/cargo/miningdock) "tyK" = ( @@ -61206,12 +63826,27 @@ }, /turf/open/floor/plating, /area/mine/eva) -"tzR" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L1" +"tzH" = ( +/obj/structure/rack, +/obj/item/clothing/suit/hazardvest, +/obj/structure/sign/warning/no_smoking/directional/north, +/obj/item/clothing/suit/hazardvest, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/clothing/glasses/meson/engine, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 }, /turf/open/floor/iron, -/area/station/hallway/primary/central) +/area/station/engineering/main) +"tzM" = ( +/obj/structure/filingcabinet, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/newscaster/directional/west, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) "tAe" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -61232,16 +63867,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/virology) -"tAh" = ( -/obj/structure/table, -/obj/item/ai_module/reset, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/dark_green, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) "tAi" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -61250,13 +63875,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, /area/station/commons/storage/mining) -"tAk" = ( -/obj/structure/closet/secure_closet/hop, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/hop) "tAx" = ( /obj/effect/turf_decal/trimline/blue/filled/warning, /obj/structure/disposalpipe/segment, @@ -61277,15 +63895,11 @@ }, /turf/open/floor/iron/white, /area/mine/laborcamp) -"tAR" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Port Hallway West" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) +"tAO" = ( +/obj/machinery/space_heater, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron/smooth, +/area/station/maintenance/port/lesser) "tAS" = ( /obj/machinery/door/airlock/mining/glass{ name = "Mining Dock" @@ -61335,6 +63949,11 @@ /obj/structure/sign/warning/biohazard/directional/west, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"tBY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "tCe" = ( /obj/effect/turf_decal/bot{ dir = 1 @@ -61347,15 +63966,6 @@ /obj/structure/sign/warning, /turf/closed/wall/r_wall, /area/icemoon/surface/outdoors/nospawn) -"tCn" = ( -/obj/structure/closet/secure_closet/security, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs/auxiliary) "tCr" = ( /obj/structure/grille, /turf/open/misc/asteroid/snow/icemoon, @@ -61366,6 +63976,13 @@ /obj/item/watertank, /turf/open/floor/iron, /area/station/service/hydroponics) +"tCu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/maintenance/port/fore) "tCx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -61376,27 +63993,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/engine/air, /area/station/engineering/atmos) -"tCE" = ( -/obj/structure/table/glass, -/obj/item/storage/medkit/fire{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/medkit/fire, -/obj/item/storage/medkit/regular{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/machinery/door/window/left/directional/north{ - dir = 4; - name = "First-Aid Supplies"; - red_alert_access = 1; - req_access = list("medical") - }, -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/tile/blue/full, -/turf/open/floor/iron/dark/smooth_large, -/area/station/medical/storage) "tCF" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/dark_blue/line{ @@ -61447,6 +64043,14 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) +"tCV" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Security - Permabrig Observation Prep"; + network = list("ss13","prison") + }, +/obj/structure/sign/poster/official/safety_internals/directional/west, +/turf/open/floor/vault, +/area/station/security/prison/rec) "tCW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, /obj/machinery/meter, @@ -61502,18 +64106,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"tDF" = ( -/obj/machinery/disposal/bin, -/obj/machinery/light/directional/west, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/central) -"tDG" = ( -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms/laundry) "tDL" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/red/anticorner/contrasted{ @@ -61528,17 +64120,6 @@ /obj/effect/landmark/start/lawyer, /turf/open/floor/wood, /area/station/security/courtroom) -"tDO" = ( -/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 - }, -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/maintenance/port/fore) "tDU" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -61550,6 +64131,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison/visit) +"tEc" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "tEd" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, @@ -61566,6 +64154,10 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/carpet, /area/station/service/theater) +"tEi" = ( +/obj/structure/sink/directional/south, +/turf/open/floor/iron, +/area/station/maintenance/port/fore) "tEj" = ( /obj/machinery/conveyor{ dir = 9; @@ -61576,6 +64168,16 @@ }, /turf/open/floor/plating, /area/station/cargo/storage) +"tEu" = ( +/obj/structure/table, +/obj/item/hand_labeler, +/obj/item/storage/box/shipping, +/obj/structure/sign/poster/official/fruit_bowl/directional/south, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/storage/art) "tEw" = ( /turf/open/genturf/blue, /area/icemoon/underground/unexplored/rivers) @@ -61583,10 +64185,6 @@ /obj/structure/ore_box, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) -"tEG" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "tEK" = ( /obj/structure/table, /obj/item/tank/internals/emergency_oxygen{ @@ -61631,11 +64229,24 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) +"tFf" = ( +/obj/structure/chair/plastic{ + dir = 0 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) "tFs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"tFt" = ( +/obj/effect/spawner/random/trash/mess, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/maintenance/aft/greater) "tFw" = ( /obj/machinery/camera/directional/north{ c_tag = "Central Hallway North-West" @@ -61652,15 +64263,6 @@ dir = 8 }, /area/station/science/lab) -"tFP" = ( -/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/miningdock) "tFV" = ( /obj/structure/cable, /obj/machinery/light/directional/south, @@ -61677,13 +64279,6 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/mining, /turf/open/floor/iron/smooth, /area/mine/eva/lower) -"tGm" = ( -/obj/machinery/computer/prisoner/management{ - dir = 1 - }, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/showroomfloor, -/area/station/security/warden) "tGr" = ( /turf/closed/mineral/random/snow, /area/icemoon/surface/outdoors/nospawn) @@ -61729,17 +64324,6 @@ dir = 1 }, /area/station/engineering/lobby) -"tGO" = ( -/obj/machinery/airalarm/directional/east, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/light/directional/east, -/obj/structure/table/glass, -/obj/item/folder/white, -/obj/item/stamp/head/cmo, -/obj/item/clothing/neck/stethoscope, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/cmo) "tGP" = ( /obj/machinery/conveyor{ id = "gulag" @@ -61767,6 +64351,10 @@ /obj/effect/mapping_helpers/requests_console/assistance, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) +"tHj" = ( +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/iron, +/area/station/engineering/atmos) "tHr" = ( /turf/closed/wall/r_wall, /area/station/medical/treatment_center) @@ -61774,6 +64362,16 @@ /obj/effect/turf_decal/trimline/blue/filled/warning, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"tHB" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/sign/warning/pods/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/white/corner{ + dir = 8 + }, +/area/station/hallway/secondary/entry) "tHK" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/railing{ @@ -61809,6 +64407,22 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/office) +"tHX" = ( +/obj/structure/railing{ + dir = 6 + }, +/obj/effect/decal/cleanable/generic, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal) +"tIc" = ( +/obj/structure/sign/warning/electric_shock/directional/south, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "tIf" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -61824,16 +64438,6 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/iron/dark, /area/station/science/ordnance/office) -"tIt" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/obj/structure/sign/warning/chem_diamond/directional/west, -/obj/machinery/light/directional/west, -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "tIu" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -61844,15 +64448,20 @@ /obj/structure/sink/directional/west, /turf/open/floor/iron/white, /area/station/medical/virology) -"tIv" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobiomain"; - name = "Containment Blast Door" +"tIw" = ( +/obj/structure/table/wood, +/obj/item/food/grown/harebell{ + pixel_x = -3; + pixel_y = 3 }, -/turf/open/floor/plating, -/area/station/science/xenobiology) +/obj/item/food/grown/harebell{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/food/grown/harebell, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "tIS" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 6 @@ -61887,6 +64496,10 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) +"tJu" = ( +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "tJv" = ( /obj/machinery/portable_atmospherics/scrubber, /obj/effect/turf_decal/stripes/line{ @@ -61957,7 +64570,7 @@ /turf/open/floor/iron/dark/textured_edge{ dir = 4 }, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) "tKf" = ( /obj/structure/closet, /obj/machinery/light/small/directional/north, @@ -61969,16 +64582,15 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/engineering/lobby) -"tKm" = ( -/obj/effect/decal/cleanable/generic, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/department/chapel) -"tKn" = ( -/obj/machinery/light/directional/north, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/white, -/area/station/science/ordnance) +"tKq" = ( +/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, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/port/lesser) "tKz" = ( /obj/structure/closet/wardrobe/mixed, /turf/open/floor/plating, @@ -62036,6 +64648,10 @@ /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) +"tLj" = ( +/obj/structure/flora/rock/pile/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) "tLp" = ( /obj/machinery/computer/records/medical{ dir = 4 @@ -62043,6 +64659,13 @@ /obj/effect/turf_decal/tile/blue/full, /turf/open/floor/iron/dark/smooth_large, /area/station/command/heads_quarters/cmo) +"tLB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/visible, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/maintenance/port/fore) "tLF" = ( /turf/closed/wall, /area/station/hallway/primary/starboard) @@ -62074,13 +64697,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/engine, /area/station/engineering/supermatter) -"tLX" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 +"tMa" = ( +/obj/structure/sign/nanotrasen{ + pixel_y = 32 }, -/turf/open/floor/iron, -/area/station/cargo/miningdock) +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "tMe" = ( /obj/machinery/computer/mechpad{ dir = 1 @@ -62100,42 +64722,12 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/virology, /turf/open/floor/plating, /area/station/medical/virology) -"tMl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"tMo" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, -/obj/structure/chair/stool/directional/north, -/obj/machinery/light/directional/west{ - name = "Gateway Control"; - req_access = list("gateway") - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/command/gateway) -"tMu" = ( -/obj/structure/sign/departments/medbay/alt/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/mine/laborcamp) "tMD" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 }, /turf/open/floor/iron, /area/station/engineering/engine_smes) -"tMG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron, -/area/mine/laborcamp/security) "tMI" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -62153,6 +64745,18 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"tNd" = ( +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/effect/turf_decal/siding/green{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) "tNi" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -62168,13 +64772,11 @@ /obj/effect/turf_decal/tile/dark/half/contrasted, /turf/open/floor/iron/white, /area/station/medical/virology) -"tNu" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 4 - }, -/obj/structure/sign/warning/electric_shock/directional/west, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) +"tNx" = ( +/obj/structure/cable, +/obj/machinery/light/floor, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "tNA" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -62279,12 +64881,6 @@ /obj/item/trash/energybar, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"tPg" = ( -/obj/structure/table/wood, -/obj/item/food/chips, -/obj/item/reagent_containers/cup/soda_cans/cola, -/turf/open/floor/carpet, -/area/station/hallway/secondary/entry) "tPz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/side{ @@ -62305,17 +64901,11 @@ /obj/machinery/meter, /turf/open/floor/iron, /area/station/science/ordnance) -"tPM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/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, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/morgue) +"tPH" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "tPV" = ( /obj/effect/landmark/blobstart, /turf/open/floor/plating, @@ -62342,15 +64932,31 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/medical/storage) +"tQE" = ( +/obj/effect/turf_decal/siding/brown/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/cargo/drone_bay) "tQM" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) +"tQS" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/landmark/start/assistant, +/obj/structure/chair/stool/directional/west, +/obj/machinery/status_display/ai/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/commons/locker) "tQW" = ( -/obj/item/kirbyplants{ - icon_state = "plant-05" - }, +/obj/item/kirbyplants/organic/plant5, /turf/open/floor/iron/dark, /area/mine/eva) "tQX" = ( @@ -62376,14 +64982,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"tRE" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/obj/effect/turf_decal/siding/wood/corner, -/obj/machinery/light/small/directional/east, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/wood, -/area/station/service/library) "tRX" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 @@ -62397,6 +64995,10 @@ /obj/effect/turf_decal/siding/yellow, /turf/open/floor/iron, /area/station/engineering/atmos/storage/gas) +"tSi" = ( +/obj/machinery/suit_storage_unit/security, +/turf/open/floor/iron/smooth, +/area/station/security/brig/upper) "tSs" = ( /obj/item/flashlight/lantern{ on = 1 @@ -62417,6 +65019,16 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) +"tTc" = ( +/obj/item/storage/bag/plants/portaseeder, +/obj/structure/table/glass, +/obj/item/plant_analyzer, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden) "tTw" = ( /obj/structure/stairs/east, /obj/structure/railing, @@ -62466,6 +65078,11 @@ /obj/effect/spawner/random/trash/moisture_trap, /turf/open/floor/plating, /area/station/maintenance/department/chapel) +"tUC" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/light/floor, +/turf/open/floor/iron/white, +/area/mine/living_quarters) "tUK" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 4 @@ -62536,13 +65153,6 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron/dark, /area/station/science/server) -"tVz" = ( -/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/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs/auxiliary) "tVA" = ( /obj/effect/turf_decal/bot, /obj/structure/closet/radiation, @@ -62620,11 +65230,6 @@ /obj/structure/cable, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) -"tWL" = ( -/obj/machinery/computer/operating, -/obj/effect/turf_decal/tile/blue/full, -/turf/open/floor/iron/large, -/area/station/medical/treatment_center) "tWO" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62667,26 +65272,11 @@ }, /turf/open/floor/iron/white, /area/station/science/robotics/lab) -"tXn" = ( -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white/corner{ - dir = 1 - }, -/area/station/hallway/secondary/entry) -"tXw" = ( -/obj/machinery/conveyor{ - dir = 10; - id = "garbage" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) +"tXs" = ( +/obj/structure/ladder, +/obj/machinery/light/small/red/directional/west, +/turf/open/floor/iron/smooth, +/area/station/maintenance/port/greater) "tXB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -62705,12 +65295,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) -"tXW" = ( -/obj/structure/cable, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/commons/locker) "tXY" = ( /obj/structure/rack, /obj/item/storage/toolbox/electrical{ @@ -62728,28 +65312,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/server) -"tYm" = ( -/obj/structure/rack, -/obj/item/storage/box/evidence, -/obj/item/storage/box/evidence, -/obj/machinery/button/door{ - id = "Trial Transfer"; - name = "Trial Transfer Lockdown"; - pixel_x = -7; - pixel_y = -23; - req_access = list("brig") - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron/textured, -/area/station/security/brig) -"tYs" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only, -/turf/open/floor/iron/cafeteria{ - dir = 8 - }, -/area/station/science/ordnance/office) "tYz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -62764,12 +65326,14 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/white, /area/station/medical/surgery/fore) -"tYJ" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) +"tYE" = ( +/obj/machinery/biogenerator, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/security/prison/garden) "tYZ" = ( /obj/machinery/door/airlock/external{ name = "External Airlock" @@ -62820,6 +65384,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/storage) +"tZO" = ( +/obj/machinery/modular_computer/preset/civilian{ + dir = 8 + }, +/obj/structure/sign/poster/official/build/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/lobby) "tZR" = ( /obj/machinery/conveyor{ dir = 4; @@ -62844,6 +65415,25 @@ /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /turf/open/floor/iron/dark/textured_large, /area/station/ai_monitored/turret_protected/ai_upload) +"uac" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/stone, +/area/station/commons/lounge) +"uah" = ( +/obj/machinery/light_switch/directional/west, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal) "uan" = ( /obj/structure/disposalpipe/trunk/multiz, /obj/effect/turf_decal/stripes/line, @@ -62871,12 +65461,10 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/engineering/storage) -"uaP" = ( -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/showroomfloor, -/area/station/security/warden) +"uaI" = ( +/obj/structure/closet/secure_closet/brig, +/turf/open/floor/iron/smooth, +/area/station/security/execution/transfer) "uaT" = ( /obj/machinery/rnd/experimentor, /turf/open/floor/engine, @@ -62924,6 +65512,16 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white, /area/station/medical/storage) +"ubx" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/directional/east, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) "ubE" = ( /obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2{ dir = 1 @@ -62937,13 +65535,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/purple/visible, /turf/open/floor/iron, /area/station/engineering/atmos) -"ubG" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) "ubH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62986,14 +65577,12 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) -"ucp" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) +"ucs" = ( +/obj/effect/spawner/random/structure/grille, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "ucD" = ( /obj/machinery/plate_press, /obj/structure/window/reinforced/spawner/directional/west, @@ -63006,19 +65595,6 @@ /obj/structure/sign/warning/electric_shock, /turf/closed/wall/r_wall, /area/station/engineering/supermatter) -"udd" = ( -/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/closet/crate/trashcart/laundry, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms/laundry) "udj" = ( /obj/effect/turf_decal/stripes/asteroid/line, /obj/structure/cable, @@ -63035,10 +65611,6 @@ /obj/effect/landmark/start/hangover/closet, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"udE" = ( -/obj/effect/spawner/random/vending/snackvend, -/turf/open/floor/iron/dark, -/area/mine/eva) "udK" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -63080,13 +65652,6 @@ /obj/structure/cable, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) -"ueo" = ( -/obj/machinery/light/warm/directional/south, -/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/cafeteria, -/area/station/security/prison/mess) "uep" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -63114,19 +65679,6 @@ /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) -"ueE" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/radio/intercom/directional/east{ - pixel_y = -6 - }, -/obj/structure/cable, -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply, -/turf/open/floor/iron/white, -/area/station/medical/virology) "ueP" = ( /obj/structure/table, /obj/structure/reagent_dispensers/servingdish, @@ -63153,12 +65705,6 @@ }, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) -"ueX" = ( -/obj/structure/closet/wardrobe/pjs, -/obj/effect/landmark/start/hangover/closet, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/station/commons/dorms) "ufm" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -63170,22 +65716,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/primary/central) -"ufy" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/large, -/area/station/security/checkpoint/customs/auxiliary) -"ufE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/mine/eva/lower) "ufF" = ( /obj/structure/table, /obj/item/storage/box/prisoner{ @@ -63271,6 +65801,14 @@ /obj/structure/cable, /turf/open/floor/iron/showroomfloor, /area/station/engineering/atmos) +"uhb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal) "uhk" = ( /obj/structure/beebox, /turf/open/floor/grass, @@ -63315,6 +65853,13 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/hallway/secondary/entry) +"uhA" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/landmark/navigate_destination/dockaux, +/turf/open/floor/iron/large, +/area/station/hallway/secondary/entry) "uhE" = ( /obj/effect/turf_decal/stripes/asteroid/line{ dir = 9 @@ -63335,22 +65880,15 @@ /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"uhP" = ( +"uhX" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ dir = 8 }, /obj/structure/sign/warning/deathsposal/directional/north, +/obj/machinery/light/small/directional/north, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"uie" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Research Division Testing Lab - Chamber"; - network = list("test","rd") - }, -/obj/machinery/light/directional/south, -/turf/open/floor/engine, -/area/station/science/explab) "uif" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -63398,25 +65936,10 @@ /obj/effect/spawner/random/maintenance/three, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"uiK" = ( -/obj/machinery/light/directional/south, -/obj/machinery/camera/directional/south, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white/corner, -/area/station/hallway/secondary/entry) "uiM" = ( /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, /area/station/ai_monitored/command/nuke_storage) -"uiN" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/turf_decal/box/red, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/office) "uja" = ( /turf/closed/wall, /area/station/commons/toilet) @@ -63442,15 +65965,6 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron/smooth, /area/station/engineering/lobby) -"ujI" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "ujP" = ( /obj/structure/table, /obj/machinery/computer/security/telescreen/research, @@ -63459,6 +65973,14 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) +"ukd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/cigbutt, +/obj/effect/spawner/random/trash/cigbutt, +/obj/effect/spawner/random/trash/cigbutt, +/obj/effect/decal/cleanable/plastic, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "ukf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /turf/open/floor/iron/dark, @@ -63471,6 +65993,16 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/service/chapel) +"ukv" = ( +/obj/machinery/computer/exoscanner_control{ + dir = 1 + }, +/obj/machinery/light_switch/directional/east{ + pixel_x = 22; + pixel_y = 8 + }, +/turf/open/floor/iron/dark, +/area/station/cargo/drone_bay) "ukw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -63501,23 +66033,10 @@ /turf/open/floor/iron/cafeteria, /area/station/maintenance/port/aft) "ukD" = ( -/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) -"ukJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/corner{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, +/turf/open/floor/iron/grimy, /area/station/hallway/secondary/entry) "ukN" = ( /obj/structure/table, @@ -63530,14 +66049,6 @@ /obj/machinery/door/window/left/directional/south, /turf/open/floor/iron, /area/station/security/prison/visit) -"ukR" = ( -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/structure/table, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs/auxiliary) "ukV" = ( /obj/structure/closet/crate/freezer, /obj/item/reagent_containers/blood/random, @@ -63583,6 +66094,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/security/prison/safe) +"ulE" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 1; + piping_layer = 2 + }, +/turf/open/floor/iron, +/area/station/science/ordnance) "uma" = ( /obj/item/chisel, /obj/item/storage/toolbox/artistic, @@ -63590,6 +66108,19 @@ /obj/item/storage/crayons, /turf/open/floor/sepia, /area/station/security/prison/rec) +"umb" = ( +/obj/structure/sign/warning/docking/directional/south, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) +"umv" = ( +/obj/effect/turf_decal/siding/white{ + dir = 9 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/tile/red/full, +/turf/open/floor/iron/large, +/area/station/service/kitchen/diner) "umz" = ( /obj/effect/turf_decal/siding/yellow{ dir = 1 @@ -63610,23 +66141,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"umD" = ( -/obj/effect/turf_decal/trimline/yellow/end{ - dir = 1 - }, -/obj/machinery/exodrone_launcher, -/obj/item/fuel_pellet, -/obj/effect/turf_decal/trimline/yellow/mid_joiner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/mid_joiner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/mid_joiner{ - dir = 1 - }, -/turf/open/floor/iron/smooth_large, -/area/station/cargo/drone_bay) "umF" = ( /obj/structure/stairs/north, /obj/structure/railing{ @@ -63638,6 +66152,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/lobby) +"umS" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/service/bar) "una" = ( /obj/machinery/door/window/left/directional/west, /obj/structure/cable, @@ -63654,6 +66179,23 @@ /obj/structure/cable, /turf/open/floor/iron/showroomfloor, /area/station/security/prison/work) +"uno" = ( +/obj/structure/closet/secure_closet/freezer/gulag_fridge, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/mine/laborcamp/security) +"unq" = ( +/obj/structure/light_construct/directional/north, +/obj/effect/spawner/random/structure/closet_private, +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/structure/sign/poster/ripped/directional/north, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/maintenance/port/fore) "unu" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -63667,6 +66209,10 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) +"unC" = ( +/obj/machinery/gulag_teleporter, +/turf/open/floor/iron/showroomfloor, +/area/station/security/processing) "unM" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair{ @@ -63723,6 +66269,13 @@ }, /turf/open/floor/iron/textured, /area/station/engineering/atmos) +"uoz" = ( +/obj/machinery/door/airlock/multi_tile/public/glass{ + name = "Hydroponics" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/hydroponics, +/turf/open/floor/iron/textured_half, +/area/station/service/hydroponics) "uoB" = ( /obj/structure/disposalpipe/junction/yjunction{ dir = 1 @@ -63839,6 +66392,11 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, /area/station/engineering/atmos/project) +"upY" = ( +/obj/structure/chair/pew/right, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/station/security/prison/rec) "uqg" = ( /obj/machinery/conveyor_switch/oneway{ dir = 8; @@ -63849,16 +66407,16 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"uqk" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "uqn" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, /turf/open/floor/iron, /area/station/cargo/storage) +"uqz" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/mine/eva/lower) "uqB" = ( /obj/effect/turf_decal/tile/neutral/diagonal_edge, /obj/effect/turf_decal/tile/blue/diagonal_edge, @@ -63875,12 +66433,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) -"uqH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, -/obj/structure/extinguisher_cabinet/directional/east, +"uqS" = ( +/obj/structure/chair/stool/directional/east, +/obj/effect/spawner/random/trash/mess, +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/machinery/light/small/directional/north, /turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/area/station/maintenance/starboard/fore) "uqV" = ( /obj/structure/sign/warning/directional/east{ desc = "A sign warning of a sudden drop below."; @@ -63896,6 +66455,12 @@ /obj/effect/spawner/random/structure/closet_private, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"uri" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central) "uro" = ( /obj/machinery/requests_console/directional/east{ department = "Telecomms Admin"; @@ -63906,11 +66471,6 @@ /obj/effect/mapping_helpers/requests_console/assistance, /turf/open/floor/iron, /area/station/tcommsat/computer) -"urt" = ( -/obj/machinery/hydroponics/soil, -/obj/machinery/light/directional/east, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden) "urw" = ( /obj/structure/railing/corner{ dir = 4 @@ -63946,9 +66506,7 @@ /turf/open/floor/plating, /area/station/security/prison/safe) "usx" = ( -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, +/obj/item/kirbyplants/organic/plant10, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/mine/laborcamp) @@ -63970,21 +66528,6 @@ "usP" = ( /turf/open/misc/asteroid/snow/standard_air, /area/station/science/research) -"usQ" = ( -/obj/structure/showcase/cyborg/old{ - dir = 8; - pixel_x = 9; - pixel_y = 2 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) "usS" = ( /obj/structure/bed{ dir = 1 @@ -64022,6 +66565,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"utN" = ( +/obj/machinery/firealarm/directional/east, +/turf/open/floor/wood, +/area/station/command/meeting_room) "utR" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -64125,15 +66672,6 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat/hallway) -"uwh" = ( -/obj/machinery/vending/security{ - onstation_override = 1 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/laborcamp/security) "uwj" = ( /obj/machinery/duct, /obj/structure/disposalpipe/segment, @@ -64157,17 +66695,6 @@ dir = 8 }, /area/station/security/brig/entrance) -"uwG" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/tile/blue/opposingcorners, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/treatment_center) "uwH" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -64175,6 +66702,20 @@ }, /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) +"uwM" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/computer/mech_bay_power_console{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/mine/mechbay) "uwO" = ( /obj/machinery/door/airlock/maintenance{ name = "Custodial Maintenance" @@ -64209,16 +66750,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/cargo/office) -"uxm" = ( -/obj/effect/spawner/random/structure/chair_flipped, -/obj/effect/spawner/random/trash/cigbutt, -/obj/effect/spawner/random/trash/cigbutt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/plaques/kiddie/perfect_drone{ - pixel_x = 32 - }, -/turf/open/floor/iron/checker, -/area/station/maintenance/port/fore) "uxp" = ( /turf/open/floor/iron/stairs/medium{ dir = 4 @@ -64237,12 +66768,6 @@ }, /turf/open/floor/iron/white, /area/station/science/research) -"uxF" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible/layer2, -/obj/machinery/air_sensor/incinerator_tank, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) "uxK" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/engine/vacuum, @@ -64261,6 +66786,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth, /area/mine/eva/lower) +"uyx" = ( +/obj/effect/spawner/random/structure/chair_maintenance, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/engineering/flashlight, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "uyH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/broken_floor, @@ -64289,17 +66820,16 @@ }, /turf/open/floor/plating/icemoon, /area/station/science/ordnance/bomb) -"uza" = ( -/obj/machinery/computer/exoscanner_control{ - dir = 1 +"uyW" = ( +/obj/machinery/washing_machine, +/obj/effect/turf_decal/siding/blue{ + dir = 8 }, -/obj/machinery/light_switch/directional/east{ - pixel_x = 22; - pixel_y = 8 +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/dark, -/area/station/cargo/drone_bay) +/turf/open/floor/iron, +/area/station/commons/dorms/laundry) "uzc" = ( /obj/effect/decal/cleanable/food/flour, /obj/effect/turf_decal/tile/bar/opposingcorners, @@ -64312,12 +66842,12 @@ }, /turf/open/floor/iron/smooth, /area/mine/mechbay) -"uzh" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/maintenance/port/fore) +"uzf" = ( +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/effect/turf_decal/bot, +/obj/structure/sign/poster/contraband/atmosia_independence/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/atmos/storage/gas) "uzi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, @@ -64335,12 +66865,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"uzK" = ( -/obj/machinery/light_switch/directional/west, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/robotics/lab) "uzM" = ( /obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 1 @@ -64389,6 +66913,11 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured, /area/station/security/range) +"uAF" = ( +/obj/effect/decal/cleanable/oil, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "uAJ" = ( /obj/machinery/space_heater, /turf/open/floor/plating, @@ -64442,10 +66971,36 @@ "uBA" = ( /turf/closed/wall, /area/station/engineering/atmos/project) +"uBL" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/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/east, +/obj/structure/cable, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/station/hallway/secondary/entry) "uBP" = ( /obj/effect/decal/cleanable/glass, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) +"uBX" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/closet/cardboard, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/maintenance/port/fore) "uCe" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 1 @@ -64505,6 +67060,11 @@ /obj/effect/mapping_helpers/airlock/access/all/science/research, /turf/open/floor/engine, /area/station/science/explab) +"uCK" = ( +/obj/machinery/rnd/production/protolathe/department/engineering, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/lobby) "uCN" = ( /obj/structure/grille/broken, /turf/open/misc/asteroid/snow/icemoon, @@ -64525,6 +67085,12 @@ /obj/machinery/door/window/left/directional/south, /turf/open/floor/plating/icemoon, /area/station/security/execution/education) +"uDc" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "uDi" = ( /obj/structure/closet/emcloset/anchored, /obj/machinery/light/small/directional/west, @@ -64577,22 +67143,6 @@ /obj/structure/table, /turf/open/floor/iron, /area/station/cargo/office) -"uDt" = ( -/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 = 4 - }, -/turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) "uDy" = ( /obj/item/book/bible, /obj/structure/cable, @@ -64625,15 +67175,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/iron/white, /area/station/medical/virology) -"uDP" = ( -/obj/structure/cable/multilayer/multiz, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) -"uDR" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "uDV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -64648,6 +67189,14 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"uEk" = ( +/obj/structure/closet/wardrobe/miner, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/cargo/miningdock) "uEm" = ( /turf/open/floor/wood, /area/station/command/heads_quarters/captain) @@ -64695,6 +67244,11 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/processing) +"uFg" = ( +/obj/structure/railing, +/obj/structure/marker_beacon/cerulean, +/turf/open/genturf, +/area/icemoon/surface/outdoors/unexplored/rivers/no_monsters) "uFh" = ( /turf/open/floor/plating, /area/station/construction) @@ -64779,10 +67333,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"uGG" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) "uGT" = ( /obj/machinery/light/directional/east, /obj/item/radio/intercom/directional/east, @@ -64798,16 +67348,12 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/service/theater) -"uHi" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Pod One"; - space_dir = 8 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 +"uHc" = ( +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 8 }, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "uHv" = ( /obj/structure/chair/stool/directional/north, /obj/structure/cable, @@ -64820,21 +67366,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/fore) -"uHG" = ( -/obj/machinery/requests_console/directional/south{ - department = "Security"; - name = "Security Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/landmark/start/depsec/supply, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "uHS" = ( /obj/structure/disposaloutlet{ dir = 8 @@ -64942,29 +67473,26 @@ "uJt" = ( /turf/open/floor/carpet, /area/station/service/chapel) +"uJH" = ( +/obj/structure/tank_holder/extinguisher, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"uJI" = ( +/obj/structure/table/wood, +/obj/structure/noticeboard/directional/north, +/obj/item/flashlight/lantern, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "uJX" = ( /obj/structure/closet/firecloset, /obj/item/radio/intercom/directional/north, /obj/effect/turf_decal/tile/red/half, /turf/open/floor/iron/smooth_half, /area/station/security/brig/upper) -"uJZ" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"uKg" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/station/service/hydroponics) "uKj" = ( /obj/machinery/portable_atmospherics/canister/anesthetic_mix, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -64991,19 +67519,6 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) -"uKB" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/mine/eva) "uKJ" = ( /obj/machinery/newscaster/directional/east, /obj/structure/sink/directional/west, @@ -65023,6 +67538,9 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/dark/smooth_large, /area/station/command/heads_quarters/ce) +"uKO" = ( +/turf/open/floor/glass, +/area/station/commons/locker) "uKP" = ( /obj/structure/table/wood, /obj/item/radio{ @@ -65048,18 +67566,6 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/engineering/supermatter) -"uLo" = ( -/obj/structure/table, -/obj/item/clothing/glasses/meson, -/obj/item/storage/bag/ore, -/obj/item/pickaxe, -/obj/item/mining_scanner, -/obj/item/flashlight, -/obj/machinery/light/directional/east, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/gps/mining, -/turf/open/floor/iron, -/area/station/commons/storage/mining) "uLp" = ( /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/preopen{ @@ -65088,6 +67594,15 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"uLU" = ( +/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/junction{ + dir = 4 + }, +/turf/open/floor/wood/parquet, +/area/station/commons/lounge) "uLV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -65108,6 +67623,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/commons/storage/emergency/port) +"uMm" = ( +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) "uMq" = ( /obj/structure/sign/warning/cold_temp{ pixel_x = -29 @@ -65122,6 +67642,15 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/hallway/primary/starboard) +"uMD" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "garbage" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "uME" = ( /turf/closed/wall/r_wall, /area/station/security/execution/transfer) @@ -65136,6 +67665,16 @@ dir = 4 }, /area/station/command/heads_quarters/rd) +"uMM" = ( +/obj/structure/cable, +/obj/machinery/camera/directional/south{ + c_tag = "Labor Camp Security Office"; + network = list("labor") + }, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/mine/laborcamp/security) "uMN" = ( /turf/open/openspace, /area/station/commons/storage/mining) @@ -65148,10 +67687,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"uNt" = ( -/obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "uNu" = ( /obj/effect/turf_decal/siding/yellow/corner{ dir = 8 @@ -65176,15 +67711,19 @@ }, /turf/open/floor/iron, /area/station/commons/fitness) -"uNG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"uNE" = ( +/obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/junction{ +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/aisat/hallway) +"uNV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/wideplating/dark{ dir = 4 }, -/turf/open/floor/wood/parquet, -/area/station/commons/lounge) +/obj/machinery/holopad, +/turf/open/floor/iron/dark/textured, +/area/station/security/prison/rec) "uNX" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -65288,6 +67827,12 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"uOW" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/landmark/start/paramedic, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "uPa" = ( /obj/machinery/disposal/bin, /obj/structure/window/reinforced/spawner/directional/east, @@ -65319,18 +67864,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron, /area/mine/laborcamp) -"uPn" = ( -/obj/structure/sign/poster/official/twelve_gauge/directional/north, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"uPq" = ( -/obj/structure/sign/poster/official/here_for_your_safety/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/prison/visit) "uPt" = ( /obj/structure/closet/crate/bin, /turf/open/floor/iron/dark, @@ -65340,6 +67873,15 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron/smooth, /area/station/maintenance/fore/lesser) +"uPB" = ( +/obj/structure/table/wood, +/obj/machinery/recharger, +/obj/item/coin/plasma{ + pixel_x = -6; + pixel_y = 13 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain) "uPE" = ( /obj/effect/turf_decal/trimline/neutral/warning{ dir = 8 @@ -65363,20 +67905,15 @@ /obj/structure/noticeboard/directional/east, /turf/open/floor/wood, /area/station/command/meeting_room) -"uPZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white/corner{ - dir = 1 - }, -/area/station/hallway/secondary/entry) "uQl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/mine/production) +"uQu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/locker) "uQx" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -65390,24 +67927,6 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron/textured, /area/station/security/brig) -"uQK" = ( -/obj/effect/decal/cleanable/generic, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"uQL" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white/corner, -/area/station/hallway/secondary/entry) -"uQS" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external{ - name = "Port Docking Bay 4" - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) "uQV" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -65451,6 +67970,16 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/prison) +"uRx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/sign/poster/official/wtf_is_co2/directional/north, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) "uRz" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -65459,6 +67988,13 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/stone, /area/station/commons/lounge) +"uRL" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white/side{ + dir = 10 + }, +/area/station/science/research) "uRV" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 5 @@ -65503,6 +68039,12 @@ /obj/effect/mapping_helpers/airalarm/mixingchamber_access, /turf/open/floor/iron/dark, /area/station/science/ordnance/freezerchamber) +"uSS" = ( +/obj/machinery/recharge_station, +/obj/effect/turf_decal/stripes/box, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "uTc" = ( /obj/machinery/chem_heater/withbuffer, /obj/structure/window/reinforced/spawner/directional/north{ @@ -65518,11 +68060,37 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/pharmacy) +"uTo" = ( +/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, +/obj/structure/sign/poster/official/do_not_question/directional/north, +/turf/open/floor/iron, +/area/mine/laborcamp) +"uTp" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark/textured_edge, +/area/station/security/prison) "uTr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/department/cargo) +"uTI" = ( +/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/structure/cable, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/hallway/secondary/entry) "uTL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -65546,6 +68114,17 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/engine, /area/station/science/xenobiology) +"uUu" = ( +/obj/structure/sign/nanotrasen{ + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/hallway/secondary/entry) "uUH" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer1{ dir = 10 @@ -65561,21 +68140,6 @@ }, /turf/open/floor/wood/parquet, /area/station/service/bar/atrium) -"uVa" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sink/kitchen/directional/east{ - desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; - name = "old sink" - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"uVf" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "uVj" = ( /obj/effect/turf_decal/arrows/white, /obj/effect/turf_decal/stripes/line{ @@ -65625,10 +68189,6 @@ dir = 1 }, /area/station/security/lockers) -"uWn" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/r_wall, -/area/station/maintenance/aft/lesser) "uWp" = ( /obj/structure/sign/warning/secure_area, /turf/closed/wall, @@ -65649,27 +68209,6 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) -"uWD" = ( -/obj/machinery/disposal/delivery_chute{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/door/window{ - base_state = "right"; - dir = 4; - icon_state = "right"; - layer = 3 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "uWE" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/plating/snowed/smoothed/icemoon, @@ -65699,12 +68238,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"uXr" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Chapel East" - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "uXu" = ( /obj/machinery/power/terminal{ dir = 4 @@ -65712,6 +68245,20 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/electrical) +"uXy" = ( +/obj/machinery/light_switch/directional/east, +/obj/structure/table, +/obj/item/paper_bin/construction, +/obj/item/stack/pipe_cleaner_coil/random, +/obj/item/stack/pipe_cleaner_coil/random, +/obj/item/stack/pipe_cleaner_coil/random, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/commons/storage/art) "uXC" = ( /obj/structure/table/reinforced, /obj/item/tank/internals/emergency_oxygen/engi{ @@ -65731,7 +68278,7 @@ /turf/open/floor/iron/white/smooth_large, /area/station/medical/chemistry) "uXW" = ( -/obj/machinery/modular_computer/console/preset/cargochat/security{ +/obj/machinery/modular_computer/preset/cargochat/security{ dir = 4 }, /obj/machinery/power/apc/auto_name/directional/north, @@ -65739,16 +68286,6 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/dark/textured, /area/station/security/office) -"uXY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white/corner{ - dir = 1 - }, -/area/station/hallway/secondary/entry) "uYj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -65813,18 +68350,31 @@ dir = 9 }, /area/station/science/research) +"uZD" = ( +/obj/machinery/recharge_station, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/station/ai_monitored/turret_protected/aisat/service) "uZL" = ( /obj/structure/table, /obj/effect/spawner/random/maintenance/two, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/fore) -"uZP" = ( -/obj/structure/chair/wood{ +"uZT" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/railing/corner/end{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood/parquet, -/area/station/commons/lounge) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/event_spawn, +/obj/structure/cable, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/hallway/secondary/entry) "vaa" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -65834,6 +68384,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/ordnance/office) +"vad" = ( +/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/neutral/opposingcorners{ + dir = 1 + }, +/obj/structure/sign/poster/contraband/random/directional/north, +/turf/open/floor/iron, +/area/station/commons/dorms/laundry) "vah" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/barricade/wooden, @@ -65847,46 +68410,47 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"vao" = ( +/obj/structure/rack, +/obj/item/storage/box/evidence, +/obj/item/storage/box/evidence, +/obj/machinery/button/door{ + id = "Trial Transfer"; + name = "Trial Transfer Lockdown"; + pixel_x = -7; + pixel_y = -23; + req_access = list("brig") + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/textured, +/area/station/security/brig) "vav" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/dark, /area/station/science/genetics) -"vaw" = ( -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron/white, -/area/station/science/robotics/lab) "vaA" = ( /obj/effect/turf_decal/siding/purple{ dir = 1 }, /turf/open/floor/iron/white, /area/station/science/lab) +"vaE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, +/area/station/service/library) "vaM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron/dark/side, /area/mine/eva) -"vaO" = ( -/obj/machinery/light/directional/east, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel) -"vaQ" = ( -/obj/item/radio/intercom/directional/south, -/obj/machinery/computer/robotics{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white/side{ - dir = 6 - }, -/area/station/command/heads_quarters/rd) "vaZ" = ( /obj/item/book/manual/wiki/plumbing{ pixel_x = 4; @@ -65909,6 +68473,17 @@ dir = 1 }, /area/station/medical/chemistry) +"vbb" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red/full, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/large, +/area/station/service/kitchen/diner) "vbd" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/arrows/white{ @@ -65928,12 +68503,6 @@ }, /turf/open/floor/iron/smooth, /area/mine/laborcamp/security) -"vbj" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "vbn" = ( /obj/machinery/power/smes{ charge = 5e+006 @@ -65950,6 +68519,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"vbC" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/food_or_drink/snack, +/turf/open/floor/plating, +/area/station/maintenance/department/chapel) "vbF" = ( /obj/structure/table/wood, /obj/structure/cable, @@ -65984,6 +68561,14 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"vcc" = ( +/obj/structure/table/optable{ + name = "Robotics Operating Table" + }, +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/maintenance/port/fore) "vcj" = ( /turf/closed/wall/r_wall, /area/mine/storage) @@ -65997,15 +68582,6 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/dark, /area/station/commons/fitness) -"vcx" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "vcH" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 9 @@ -66057,13 +68633,6 @@ }, /turf/open/floor/carpet, /area/station/command/meeting_room) -"vdo" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/cargo/miningdock) "vdr" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -66088,6 +68657,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/service) +"vdI" = ( +/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/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood/parquet, +/area/station/commons/lounge) "vdM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -66111,10 +68690,7 @@ /turf/open/floor/iron/grimy, /area/station/security/prison/work) "veh" = ( -/obj/machinery/rnd/bepis, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, +/obj/machinery/vending/wardrobe/cargo_wardrobe, /turf/open/floor/iron, /area/station/cargo/storage) "vek" = ( @@ -66140,36 +68716,14 @@ }, /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) +"ves" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/grimy, +/area/station/maintenance/aft/greater) "vey" = ( /turf/closed/wall, /area/station/command/heads_quarters/captain) -"veH" = ( -/obj/structure/table, -/obj/item/assembly/prox_sensor{ - pixel_x = -8; - pixel_y = 4 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = -8; - pixel_y = 4 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = -8; - pixel_y = 4 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = -8; - pixel_y = 4 - }, -/obj/item/stock_parts/cell/high, -/obj/item/stock_parts/cell/high, -/obj/item/crowbar, -/obj/item/radio/headset/headset_sci{ - pixel_x = -3 - }, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/iron, -/area/station/science/robotics/lab) "veK" = ( /turf/open/floor/iron/white, /area/mine/living_quarters) @@ -66186,17 +68740,13 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, /area/station/commons/storage/primary) -"veT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron, -/area/station/construction) "veU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 }, +/obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "veX" = ( @@ -66209,6 +68759,14 @@ /obj/structure/lattice/catwalk, /turf/open/openspace/icemoon, /area/station/science/server) +"vfe" = ( +/obj/machinery/atmospherics/components/unary/passive_vent, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/freezer, +/area/station/science/xenobiology) "vfg" = ( /obj/structure/stairs/north, /turf/open/floor/iron, @@ -66249,6 +68807,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/tcommsat/computer) +"vfU" = ( +/obj/machinery/vending/tool, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/engineering/lobby) "vfW" = ( /turf/open/floor/iron, /area/station/commons/fitness) @@ -66256,6 +68820,14 @@ /obj/structure/grille, /turf/open/floor/plating, /area/station/science/xenobiology) +"vgj" = ( +/obj/structure/filingcabinet, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/random/directional/west, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) "vgu" = ( /obj/structure/table, /obj/item/toy/plush/beeplushie{ @@ -66264,14 +68836,22 @@ }, /turf/open/floor/plating, /area/station/commons/storage/mining) +"vgw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/station/maintenance/port/aft) "vgx" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) "vgC" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/miningdock) +/obj/machinery/netpod, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/bitrunning/den) "vgD" = ( /obj/structure/rack, /obj/item/stack/sheet/iron/fifty, @@ -66298,6 +68878,8 @@ /area/station/maintenance/port/greater) "vhg" = ( /obj/structure/sign/poster/random/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron/smooth, /area/station/maintenance/fore/lesser) "vhm" = ( @@ -66306,10 +68888,10 @@ /turf/open/floor/iron/dark, /area/station/service/chapel) "vhr" = ( -/mob/living/simple_animal/hostile/retaliate/goat{ - atmos_requirements = list("min_oxy"=1,"max_oxy"=0,"min_plas"=0,"max_plas"=1,"min_co2"=0,"max_co2"=5,"min_n2"=0,"max_n2"=0); +/mob/living/basic/goat/pete{ desc = "Not known for their pleasant disposition. This one seems a bit more hardy to the cold."; - minbodytemp = 150; + habitable_atmos = list("min_oxy"=1,"max_oxy"=0,"min_plas"=0,"max_plas"=1,"min_co2"=0,"max_co2"=5,"min_n2"=0,"max_n2"=0); + minimum_survivable_temperature = 150; name = "Snowy Pete" }, /turf/open/misc/asteroid/snow/coldroom, @@ -66340,40 +68922,11 @@ }, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"vhX" = ( -/obj/structure/rack, -/obj/item/electronics/airlock, -/obj/item/electronics/airlock, -/obj/item/electronics/airlock, -/obj/item/electronics/airlock, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil, -/obj/item/wallframe/camera, -/obj/item/wallframe/camera, -/obj/item/wallframe/camera, -/obj/item/wallframe/camera, -/obj/item/assault_pod/mining, -/obj/machinery/computer/security/telescreen/auxbase{ - dir = 8; - pixel_x = 30 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) "via" = ( /turf/open/floor/iron/white/side{ dir = 6 }, /area/station/science/research) -"vip" = ( -/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, -/turf/open/floor/iron, -/area/mine/eva/lower) "viH" = ( /obj/machinery/power/emitter/welded{ dir = 4 @@ -66381,23 +68934,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"viO" = ( -/obj/machinery/light/directional/north, -/obj/machinery/computer/security/telescreen/interrogation{ - pixel_y = 30 - }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner{ - dir = 8 - }, -/area/station/security/processing) -"viP" = ( -/obj/machinery/door/firedoor, -/obj/machinery/status_display/evac/directional/east, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "viQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -66408,6 +68944,18 @@ /obj/effect/spawner/random/medical/two_percent_xeno_egg_spawner, /turf/open/floor/engine, /area/station/science/xenobiology) +"viV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 1 + }, +/area/station/command/gateway) +"vja" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/construction) "vjh" = ( /turf/closed/wall/r_wall, /area/mine/laborcamp) @@ -66441,14 +68989,6 @@ /obj/machinery/light/floor, /turf/open/floor/iron, /area/station/cargo/storage) -"vjP" = ( -/obj/structure/table/wood, -/obj/machinery/light/directional/east, -/obj/structure/noticeboard/directional/north, -/obj/item/flashlight/lantern, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "vjS" = ( /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron/white, @@ -66463,36 +69003,13 @@ /obj/effect/turf_decal/trimline/blue/filled/warning, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"vky" = ( -/obj/machinery/computer/pod/old/mass_driver_controller/trash{ - pixel_x = -24; - pixel_y = -6 - }, -/obj/machinery/button/door/directional/west{ - id = "Disposal Exit"; - name = "Disposal Vent Control"; - pixel_y = 4; - req_access = list("maint_tunnels") - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "vkz" = ( /obj/machinery/suit_storage_unit/ce, /obj/effect/turf_decal/stripes/line{ dir = 6 }, -/obj/structure/sign/delamination_counter/directional/north, /turf/open/floor/iron/white/textured, /area/station/command/heads_quarters/ce) -"vkC" = ( -/obj/effect/decal/cleanable/insectguts, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "vkD" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 1 @@ -66524,6 +69041,11 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron, /area/station/security/prison/mess) +"vkN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/station/construction) "vkW" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -66543,29 +69065,38 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/storage_shared) +"vle" = ( +/obj/item/radio/intercom/chapel/directional/east, +/obj/structure/chair, +/obj/machinery/light/small/red/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "vlf" = ( /obj/structure/disposalpipe/junction/yjunction{ dir = 8 }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"vlh" = ( -/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/service/hydroponics/garden) -"vlt" = ( -/obj/machinery/conveyor{ - dir = 1; - id = "QMLoad" +"vlq" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 }, -/obj/effect/turf_decal/stripes/line{ +/obj/structure/chair, +/obj/effect/turf_decal/tile/red/full, +/obj/structure/sign/poster/random/directional/west, +/turf/open/floor/iron/large, +/area/station/service/kitchen/diner) +"vlI" = ( +/obj/effect/turf_decal/siding/white{ dir = 4 }, -/obj/structure/sign/warning/cold_temp/directional/west, -/turf/open/floor/plating, -/area/station/cargo/storage) +/obj/effect/turf_decal/tile/green/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "vlL" = ( /obj/machinery/computer/cargo/request, /turf/open/floor/iron, @@ -66647,6 +69178,17 @@ }, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) +"vmx" = ( +/obj/machinery/door/airlock/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "vmA" = ( /obj/structure/fluff/tram_rail{ pixel_y = 17 @@ -66654,10 +69196,16 @@ /obj/structure/fluff/tram_rail, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"vmH" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/eva/lower) +"vmC" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Arrivals Hallway North" + }, +/obj/structure/cable, +/turf/open/floor/iron/large, +/area/station/hallway/secondary/entry) "vmP" = ( /obj/effect/spawner/structure/window/hollow/reinforced/end, /turf/open/floor/plating, @@ -66731,23 +69279,11 @@ dir = 4 }, /turf/open/floor/iron/textured, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) "vnY" = ( /obj/structure/closet/crate/critter, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"vod" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/cold_temp{ - pixel_x = -2; - pixel_y = -32 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron/dark/side, -/area/mine/eva/lower) "voj" = ( /obj/structure/disposalpipe/sorting/mail/flip{ dir = 8 @@ -66756,6 +69292,13 @@ /obj/effect/mapping_helpers/mail_sorting/medbay/general, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) +"vol" = ( +/obj/structure/table, +/obj/item/clothing/mask/gas, +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "vov" = ( /obj/structure/extinguisher_cabinet/directional/west, /obj/effect/turf_decal/tile/yellow/half/contrasted{ @@ -66763,6 +69306,14 @@ }, /turf/open/floor/iron, /area/station/commons/storage/tools) +"voA" = ( +/obj/machinery/button/flasher{ + id = "cell4"; + pixel_y = -22 + }, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron, +/area/station/security/brig/upper) "voH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66773,15 +69324,14 @@ "voK" = ( /turf/closed/wall/r_wall, /area/station/tcommsat/computer) -"voS" = ( -/obj/structure/cable, +"voM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/table, -/obj/item/pen/red, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood/large, -/area/mine/eva/lower) +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "voY" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -66815,16 +69365,22 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/smooth, /area/station/security/execution/transfer) -"vps" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood/parquet, -/area/station/commons/lounge) -"vpx" = ( -/obj/effect/turf_decal/tile/yellow/half/contrasted{ +"vpl" = ( +/obj/effect/turf_decal/siding/brown{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ dir = 8 }, +/obj/effect/decal/cleanable/dirt{ + pixel_x = -9 + }, +/obj/structure/sign/warning/gas_mask/directional/west, /turf/open/floor/iron, -/area/station/construction/mining/aux_base) +/area/station/cargo/drone_bay) "vpR" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, @@ -66843,12 +69399,14 @@ /obj/machinery/requests_console/auto_name/directional/south, /turf/open/floor/iron/dark, /area/station/medical/virology) -"vqg" = ( -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/locker) +"vqf" = ( +/obj/item/radio/intercom/directional/east, +/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/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "vqi" = ( /obj/structure/disposalpipe/trunk/multiz{ dir = 1 @@ -66879,10 +69437,6 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/dark, /area/station/medical/virology) -"vqM" = ( -/obj/machinery/light/small/directional/west, -/turf/open/openspace/icemoon/keep_below, -/area/icemoon/underground/explored) "vqN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66905,7 +69459,7 @@ /area/station/medical/treatment_center) "vra" = ( /obj/machinery/firealarm/directional/west, -/obj/machinery/modular_computer/console/preset/cargochat/cargo{ +/obj/machinery/modular_computer/preset/cargochat/cargo{ dir = 4 }, /obj/effect/decal/cleanable/dirt, @@ -66914,6 +69468,10 @@ }, /turf/open/floor/iron, /area/station/cargo/office) +"vrc" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/security/courtroom) "vry" = ( /obj/machinery/requests_console/directional/south{ department = "Head of Personnel's Desk"; @@ -66965,6 +69523,13 @@ /obj/effect/turf_decal/trimline/red/line, /turf/open/floor/iron/dark/textured, /area/station/security/range) +"vsz" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "vsI" = ( /obj/structure/marker_beacon/burgundy, /turf/open/floor/plating/snowed/icemoon, @@ -66980,6 +69545,15 @@ dir = 1 }, /area/station/hallway/secondary/exit/departure_lounge) +"vsT" = ( +/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, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/port/greater) "vsZ" = ( /obj/structure/table, /turf/open/floor/plating, @@ -67011,6 +69585,7 @@ dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/mining_weather_monitor/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/central) "vtA" = ( @@ -67019,10 +69594,6 @@ dir = 10 }, /area/station/science/research) -"vtD" = ( -/obj/effect/spawner/random/trash/mess, -/turf/open/floor/iron, -/area/station/maintenance/port/fore) "vuh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -67038,8 +69609,12 @@ /obj/effect/turf_decal/tile/blue/full, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/aft) +"vuk" = ( +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/service/lawoffice) "vuq" = ( -/obj/machinery/modular_computer/console/preset/civilian, +/obj/machinery/modular_computer/preset/civilian, /obj/structure/fireaxecabinet/mechremoval/directional/north, /turf/open/floor/iron/white, /area/station/science/robotics/lab) @@ -67060,6 +69635,10 @@ /obj/structure/sign/warning/fire, /turf/closed/wall/r_wall, /area/station/engineering/supermatter) +"vuN" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood/tile, +/area/station/service/theater) "vuR" = ( /obj/structure/extinguisher_cabinet/directional/south, /obj/effect/turf_decal/trimline/yellow/filled/warning{ @@ -67095,18 +69674,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) -"vvs" = ( -/obj/structure/closet/secure_closet/medical1, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/line{ - dir = 4 - }, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/station/maintenance/port/fore) "vvu" = ( /obj/structure/railing, /obj/effect/turf_decal/trimline/neutral/warning{ @@ -67130,18 +69697,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/engineering) -"vvy" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/science/ordnance) "vvE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -67182,6 +69737,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"vwj" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Port Mix to West Ports" + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron, +/area/station/engineering/atmos) "vwl" = ( /obj/machinery/light_switch/directional/south, /obj/structure/disposalpipe/segment{ @@ -67223,6 +69785,16 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/security/prison/rec) +"vwG" = ( +/obj/machinery/vending/security{ + onstation_override = 1 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/mine/laborcamp/security) "vwJ" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, @@ -67297,6 +69869,14 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"vxO" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/wood, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) "vxV" = ( /obj/structure/cable, /obj/machinery/duct, @@ -67313,7 +69893,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "vyd" = ( -/obj/machinery/modular_computer/console/preset/id, +/obj/machinery/modular_computer/preset/id, /turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/hos) "vyg" = ( @@ -67372,15 +69952,12 @@ /obj/structure/sign/poster/contraband/random/directional/north, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"vzf" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/potato{ - name = "\improper Beepsky's emergency battery" - }, +"vzn" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/external, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, -/area/station/maintenance/fore) +/area/station/commons/dorms/laundry) "vzo" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -67406,12 +69983,6 @@ "vzD" = ( /turf/closed/wall, /area/station/maintenance/starboard/aft) -"vzE" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "vzI" = ( /obj/structure/sign/directions/engineering{ desc = "A sign that shows there are doors here. There are doors everywhere!"; @@ -67427,18 +69998,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/cryo) -"vzR" = ( -/obj/structure/closet/secure_closet/medical2, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/machinery/light/directional/east, -/obj/machinery/button/door/directional/south{ - id = "surgery"; - name = "Surgery Shutter Control" - }, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) "vzS" = ( /obj/effect/mapping_helpers/mail_sorting/science/experimentor_lab, /obj/structure/disposalpipe/sorting/mail{ @@ -67457,21 +70016,10 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/engineering/lobby) -"vzW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) "vzX" = ( /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/recharge_floor, /area/station/science/robotics/mechbay) -"vzY" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance/two, -/obj/item/storage/toolbox/emergency, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/morgue) "vAj" = ( /obj/effect/turf_decal/bot, /obj/structure/closet/crate, @@ -67544,6 +70092,25 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/white, /area/station/science/genetics) +"vAU" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "MiniSat Service Bay"; + network = list("minisat"); + start_active = 1 + }, +/obj/structure/rack, +/obj/item/storage/toolbox/electrical{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/storage/toolbox/mechanical, +/obj/item/multitool, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/ai_monitored/turret_protected/aisat/service) "vAY" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -67634,16 +70201,6 @@ "vBG" = ( /turf/closed/wall, /area/station/command/heads_quarters/cmo) -"vCe" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/mine/eva) "vCn" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -67657,6 +70214,14 @@ }, /turf/open/floor/iron, /area/station/security/prison/mess) +"vCy" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/port/lesser) "vCz" = ( /obj/effect/landmark/start/medical_doctor, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, @@ -67706,6 +70271,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/science/xenobiology) +"vDx" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/effect/spawner/random/armory/disablers, +/turf/open/floor/iron/dark/textured, +/area/station/ai_monitored/security/armory) +"vDy" = ( +/obj/structure/sign/poster/official/safety_report/directional/west, +/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) "vDS" = ( /obj/machinery/computer/department_orders/security{ dir = 4 @@ -67716,17 +70296,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/office) -"vEg" = ( -/obj/effect/turf_decal/stripes/asteroid/line, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/dark/half/contrasted, -/turf/open/floor/iron/white/side{ - dir = 1 - }, -/area/mine/living_quarters) "vEi" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -67737,13 +70306,6 @@ }, /turf/open/floor/iron, /area/station/commons/fitness) -"vEu" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "vEw" = ( /obj/machinery/camera/directional/west{ c_tag = "Atmospherics Access" @@ -67752,11 +70314,14 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/engineering/atmos) -"vEE" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/fore) +"vEy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "vEJ" = ( /obj/effect/turf_decal/tile/green{ dir = 8 @@ -67770,6 +70335,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth_half, /area/station/maintenance/department/medical/central) +"vEQ" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/structure/sign/warning/chem_diamond/directional/west, +/obj/structure/bed/medical/emergency, +/obj/machinery/iv_drip, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "vEU" = ( /obj/machinery/door/airlock/external{ glass = 1; @@ -67785,12 +70360,15 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/general, /turf/open/floor/iron/smooth, /area/station/cargo/drone_bay) -"vFe" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) +"vFb" = ( +/obj/structure/table/wood, +/obj/item/clothing/mask/cigarette/cigar{ + pixel_x = 7; + pixel_y = 10 + }, +/obj/item/storage/box/matches, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain) "vFg" = ( /obj/structure/falsewall, /turf/open/floor/plating, @@ -67815,14 +70393,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"vFM" = ( -/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/landmark/event_spawn, -/turf/open/floor/iron, -/area/mine/eva/lower) "vFO" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/east, @@ -67842,18 +70412,6 @@ /obj/effect/mapping_helpers/mail_sorting/medbay/virology, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"vGh" = ( -/obj/machinery/firealarm/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/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/neutral/half/contrasted, -/turf/open/floor/iron, -/area/station/commons/fitness) "vGi" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/cold_temp, @@ -67883,30 +70441,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/department/chapel) -"vGM" = ( -/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/greater) -"vGX" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera{ - c_tag = "Mining B-1 Hallway South"; - dir = 10 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/mine/eva) "vGY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -67943,10 +70477,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"vHE" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "vHI" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -67963,17 +70493,23 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) +"vHM" = ( +/obj/structure/rack, +/obj/structure/window/reinforced/spawner/directional/north{ + layer = 2.9 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/effect/spawner/random/armory/rubbershot, +/turf/open/floor/iron/dark/textured, +/area/station/ai_monitored/security/armory) "vHR" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/chemistry) -"vHT" = ( -/obj/effect/spawner/random/trash/mess, -/obj/item/storage/box, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "vHU" = ( /obj/item/radio/intercom/prison/directional/south, /obj/effect/turf_decal/tile/red/half/contrasted, @@ -67987,6 +70523,13 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/chemistry) +"vIe" = ( +/obj/item/soap/deluxe, +/obj/item/bikehorn/rubberducky, +/obj/structure/curtain, +/obj/machinery/shower/directional/south, +/turf/open/floor/iron/freezer, +/area/station/medical/break_room) "vIg" = ( /obj/structure/table, /obj/item/computer_disk{ @@ -68002,21 +70545,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/office) -"vIk" = ( -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/components/unary/passive_vent, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/freezer, -/area/station/science/xenobiology) -"vIm" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "vIH" = ( /obj/structure/closet{ name = "evidence closet 1" @@ -68078,6 +70606,10 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/rd) +"vKk" = ( +/obj/machinery/vending/security, +/turf/open/floor/iron/smooth_edge, +/area/station/security/lockers) "vKn" = ( /obj/item/radio/intercom/directional/north, /obj/structure/table/wood, @@ -68087,10 +70619,20 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"vKA" = ( -/obj/machinery/light/small/directional/east, -/turf/open/openspace/icemoon/keep_below, -/area/icemoon/underground/explored) +"vKo" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) +"vKq" = ( +/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/commons/locker) "vKC" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -68123,14 +70665,18 @@ }, /turf/open/floor/iron, /area/station/commons/fitness) +"vLj" = ( +/obj/machinery/suit_storage_unit/rd, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/smooth_half, +/area/station/command/heads_quarters/rd) "vLk" = ( /obj/structure/sign/warning/gas_mask, /turf/closed/wall, /area/station/maintenance/starboard/fore) -"vLl" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/construction/mining/aux_base) "vLn" = ( /obj/machinery/camera/directional/south{ c_tag = "Service Hallway - Upper East" @@ -68157,6 +70703,7 @@ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) "vMa" = ( @@ -68176,10 +70723,10 @@ /obj/effect/turf_decal/siding/thinplating/dark/corner{ dir = 8 }, -/obj/item/roller{ +/obj/item/emergency_bed{ pixel_x = -1 }, -/obj/item/roller{ +/obj/item/emergency_bed{ pixel_x = 4 }, /obj/item/storage/medkit/regular{ @@ -68196,16 +70743,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) -"vMi" = ( -/obj/effect/turf_decal/siding/white{ - dir = 9 - }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/red/full, -/turf/open/floor/iron/large, -/area/station/service/kitchen/diner) "vMl" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -68232,20 +70769,36 @@ /obj/structure/cable/layer3, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat_interior) +"vMN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/flashlight/lamp{ + on = 0 + }, +/turf/open/floor/wood, +/area/station/maintenance/aft/greater) "vMR" = ( /obj/structure/table/glass, /obj/item/seeds/glowshroom, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"vNk" = ( -/obj/effect/landmark/start/hangover, -/obj/structure/chair/wood{ - dir = 8 +"vNe" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/white/line, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 }, -/obj/machinery/newscaster/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood/parquet, -/area/station/commons/lounge) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/secondary/entry) +"vNs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "vND" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -68257,6 +70810,12 @@ /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/closed/wall/r_wall, /area/station/engineering/atmos/mix) +"vNK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/port/fore) "vNM" = ( /obj/machinery/atmospherics/components/unary/passive_vent{ dir = 1 @@ -68298,26 +70857,12 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/grille_or_waste, /obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) -"vOY" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/industrial_lift{ - radial_travel = 0 - }, -/obj/structure/railing{ - dir = 5 - }, -/obj/machinery/elevator_control_panel/directional/north{ - linked_elevator_id = "publicElevator"; - preset_destination_names = list("3"="Icemoon Level","4"="Station Level") - }, -/turf/open/floor/plating/elevatorshaft, -/area/mine/storage) "vPh" = ( /obj/machinery/light/directional/north, +/obj/machinery/digital_clock/directional/north, /turf/open/floor/iron, /area/station/cargo/lobby) "vPi" = ( @@ -68325,6 +70870,10 @@ /obj/effect/spawner/random/maintenance/four, /turf/open/floor/wood, /area/station/maintenance/port/aft) +"vPt" = ( +/obj/structure/closet/secure_closet/freezer/meat/all_access, +/turf/open/floor/iron/showroomfloor, +/area/station/security/prison/mess) "vPx" = ( /turf/open/floor/iron/dark/textured, /area/station/security/prison/workout) @@ -68380,13 +70929,14 @@ }, /turf/open/floor/iron/dark, /area/station/commons/storage/mining) -"vQL" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "garbage" +"vQN" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) +/obj/machinery/firealarm/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "vQO" = ( /obj/machinery/camera/directional/east{ c_tag = "Locker Room Toilets" @@ -68405,11 +70955,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/cargo/lobby) -"vQY" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/vending/wardrobe/curator_wardrobe, -/turf/open/floor/engine/cult, -/area/station/service/library) "vRo" = ( /obj/machinery/shower/directional/north, /obj/effect/turf_decal/trimline/blue/line{ @@ -68516,12 +71061,25 @@ }, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) +"vSx" = ( +/obj/structure/sign/warning/chem_diamond/directional/south, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "vSE" = ( /obj/machinery/door/window/right/directional/east{ name = "Bar Access" }, /turf/open/floor/wood, /area/station/maintenance/port/aft) +"vSK" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/iron, +/area/station/security/prison/mess) "vSM" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 10 @@ -68558,23 +71116,31 @@ }, /turf/open/floor/iron/dark, /area/station/medical/storage) -"vTi" = ( -/obj/structure/table/reinforced, -/obj/item/computer_disk/engineering, -/obj/item/computer_disk/engineering, -/obj/item/computer_disk/engineering, -/obj/item/computer_disk/atmos, -/obj/structure/disposalpipe/segment{ - dir = 4 +"vTb" = ( +/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/turf_decal/tile/brown/half/contrasted, +/turf/open/floor/iron/dark/side, +/area/mine/eva/lower) +"vTc" = ( +/turf/closed/wall, +/area/station/medical/chem_storage) +"vTg" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 }, +/obj/item/radio/intercom/directional/south, /turf/open/floor/iron, -/area/station/command/heads_quarters/ce) +/area/station/hallway/primary/fore) "vTl" = ( /obj/machinery/door/airlock/engineering{ name = "Starboard Quarter Solar Access" }, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) "vTo" = ( @@ -68591,6 +71157,11 @@ /obj/structure/closet/firecloset, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"vTA" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/commons/dorms) "vTJ" = ( /obj/structure/table, /obj/item/toy/plush/slimeplushie{ @@ -68599,6 +71170,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/science/xenobiology) "vTN" = ( @@ -68611,6 +71183,12 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/white, /area/station/security/checkpoint/science) +"vTP" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "vUi" = ( /obj/structure/sign/picture_frame/portrait/bar{ pixel_y = -32 @@ -68619,10 +71197,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) -"vUj" = ( -/obj/machinery/light/dim/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/department/crew_quarters/bar) "vUr" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 4 @@ -68635,6 +71209,12 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/sepia, /area/station/security/prison/rec) +"vUz" = ( +/obj/structure/table, +/obj/item/clothing/suit/apron/chef, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "vUW" = ( /obj/item/stack/cable_coil{ amount = 7; @@ -68672,10 +71252,6 @@ "vVH" = ( /turf/closed/wall, /area/station/security/prison/safe) -"vVN" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/cargo/storage) "vVP" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -68767,10 +71343,10 @@ /turf/open/floor/iron/chapel, /area/station/service/chapel) "vWV" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/landmark/start/shaft_miner, +/obj/structure/cable, +/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/west, /turf/open/floor/iron, /area/station/cargo/miningdock) "vWW" = ( @@ -68870,6 +71446,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark/textured, /area/station/commons/storage/primary) +"vYc" = ( +/obj/machinery/light_switch/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/security/prison/visit) "vYd" = ( /obj/machinery/portable_atmospherics/canister, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -68877,6 +71458,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"vYg" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Chapel West" + }, +/obj/structure/cable, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "vYm" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -68930,11 +71519,31 @@ /obj/effect/spawner/random/structure/crate, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"vZa" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) +"vZg" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/table, +/obj/effect/spawner/random/entertainment/dice, +/turf/open/floor/iron, +/area/station/commons/locker) +"vZp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sink/kitchen/directional/east{ + desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; + name = "old sink" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "vZq" = ( /obj/structure/chair/plastic{ dir = 8 }, /obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/department/cargo) "vZt" = ( @@ -68982,11 +71591,10 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/station/maintenance/port/aft) -"waa" = ( -/obj/machinery/door/poddoor/massdriver_trash, -/obj/structure/fans/tiny, -/turf/open/floor/plating, -/area/station/maintenance/disposal) +"vZY" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/wood/parquet, +/area/station/commons/lounge) "wab" = ( /obj/structure/cable, /obj/machinery/holopad, @@ -69000,11 +71608,6 @@ "wam" = ( /turf/open/openspace, /area/station/cargo/storage) -"wau" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/mine/laborcamp/security) "wav" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/warning{ @@ -69022,6 +71625,14 @@ }, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"waH" = ( +/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) "waL" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -69036,6 +71647,10 @@ /obj/item/reagent_containers/blood/random, /turf/open/floor/iron, /area/station/maintenance/port/fore) +"waT" = ( +/obj/structure/sign/warning/docking/directional/south, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "waZ" = ( /obj/structure/table, /obj/item/assembly/igniter{ @@ -69049,10 +71664,6 @@ }, /turf/open/floor/iron/dark, /area/station/commons/storage/primary) -"wba" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) "wbe" = ( /obj/structure/cable/multilayer/multiz, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -69079,17 +71690,21 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"wbB" = ( -/obj/effect/turf_decal/siding/white{ - dir = 1 - }, -/obj/structure/table, -/obj/effect/spawner/random/food_or_drink/donkpockets{ - pixel_y = 8 +"wbG" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/white/smooth_large, -/area/station/service/kitchen/diner) +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark/textured, +/area/station/security/interrogation) +"wbH" = ( +/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/landmark/event_spawn, +/turf/open/floor/iron, +/area/mine/eva/lower) "wbN" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -69125,12 +71740,16 @@ /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"wch" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, +"wck" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/obj/machinery/bluespace_vendor/directional/east, /turf/open/floor/iron, -/area/station/commons/locker) +/area/station/hallway/primary/starboard) "wcx" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, @@ -69164,24 +71783,38 @@ }, /turf/open/floor/plating, /area/mine/eva) -"wcV" = ( -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"wda" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "wdg" = ( /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/station/maintenance/central/lesser) +"wdo" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/railing/corner/end/flip{ + 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/corner{ + dir = 1 + }, +/area/station/hallway/secondary/entry) +"wds" = ( +/obj/structure/chair/stool/directional/west, +/obj/machinery/light/small/directional/south, +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron, +/area/station/commons/dorms/laundry) "wdI" = ( /obj/effect/turf_decal/trimline/neutral/warning{ dir = 6 @@ -69209,44 +71842,29 @@ }, /turf/open/floor/iron/smooth, /area/mine/mechbay) -"wet" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock/external{ - name = "Port Docking Bay 2" - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) "weF" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"weK" = ( -/obj/structure/table/wood, -/obj/item/food/grown/harebell{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/food/grown/harebell{ - pixel_x = 2; - pixel_y = 4 +"weL" = ( +/obj/structure/chair/stool/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 }, -/obj/item/food/grown/harebell, -/turf/open/floor/iron/dark, -/area/station/service/chapel) +/turf/open/floor/iron, +/area/station/maintenance/port/fore) "weR" = ( /turf/open/floor/wood, /area/station/maintenance/space_hut/cabin) -"weT" = ( -/obj/structure/rack, -/obj/machinery/syndicatebomb/training, -/obj/structure/cable, -/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/dark/smooth_half, -/area/station/security/office) +"weW" = ( +/obj/docking_port/stationary/random/icemoon{ + dir = 8; + name = "lavaland"; + shuttle_id = "pod_lavaland" + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "weY" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/table/glass, @@ -69289,14 +71907,19 @@ }, /turf/open/floor/iron, /area/station/security/brig/upper) -"wfs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "wfu" = ( /obj/structure/sign/poster/official/wtf_is_co2, /turf/closed/wall/r_wall, /area/station/maintenance/aft/greater) +"wfF" = ( +/obj/effect/turf_decal/tile/blue, +/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/white/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) "wfK" = ( /obj/item/folder/blue, /obj/structure/table/wood, @@ -69390,6 +72013,17 @@ }, /turf/open/floor/iron, /area/station/science/research) +"wgU" = ( +/obj/machinery/modular_computer/preset/cargochat/science{ + dir = 1 + }, +/obj/item/radio/intercom/directional/south, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/brown/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/science/lab) "whb" = ( /obj/machinery/recharge_station, /obj/effect/decal/cleanable/dirt, @@ -69455,8 +72089,27 @@ dir = 10 }, /obj/machinery/duct, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, /turf/open/floor/plating, /area/station/hallway/secondary/service) +"whz" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/decal/cleanable/dirt, +/obj/item/seeds/redbeet, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/mine/laborcamp) +"whC" = ( +/obj/structure/destructible/cult/item_dispenser/archives/library, +/obj/item/book/codex_gigas, +/obj/machinery/computer/security/telescreen/entertainment/directional/east, +/turf/open/floor/engine/cult, +/area/station/service/library) "whP" = ( /obj/structure/table, /obj/effect/spawner/random/food_or_drink/donkpockets, @@ -69503,13 +72156,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/cargo/storage) -"wiA" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/rack, -/obj/item/poster/random_contraband, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "wiD" = ( /obj/effect/turf_decal/tile/dark{ dir = 8 @@ -69522,23 +72168,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/engine_smes) -"wjj" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Vacant Office" - }, -/obj/machinery/photocopier, -/turf/open/floor/iron/grimy, -/area/station/commons/vacant_room/office) -"wjr" = ( -/obj/structure/table, -/obj/machinery/camera/motion/directional/west{ - c_tag = "AI Upload West"; - network = list("aiupload") - }, -/obj/item/ai_module/supplied/freeform, -/obj/effect/turf_decal/tile/dark_green, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) "wjv" = ( /obj/machinery/computer/cargo{ dir = 4 @@ -69588,12 +72217,6 @@ }, /turf/open/floor/iron, /area/station/cargo/miningdock) -"wkj" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "wkl" = ( /obj/machinery/camera/directional/west{ c_tag = "Telecomms Server Room"; @@ -69601,6 +72224,11 @@ }, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) +"wkq" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/parquet, +/area/station/commons/lounge) "wkr" = ( /turf/open/floor/iron/showroomfloor, /area/station/security/warden) @@ -69608,13 +72236,44 @@ /obj/machinery/power/emitter, /turf/open/floor/plating, /area/station/engineering/engine_smes) +"wkB" = ( +/obj/structure/sign/nanotrasen{ + pixel_y = 32 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) "wkC" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ name = "Central Access" }, -/turf/open/floor/iron, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) +"wkH" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/table, +/obj/item/storage/box/bodybags, +/obj/item/pen, +/obj/item/clothing/mask/breath/medical, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"wkO" = ( +/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/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/department/chapel) "wkV" = ( /obj/structure/fence/corner{ dir = 1 @@ -69637,23 +72296,19 @@ }, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"wkZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +"wlr" = ( +/obj/structure/table, +/obj/item/stack/spacecash/c10, +/obj/item/stack/spacecash/c1{ + pixel_y = 5 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/maintenance/aft/greater) -"wlc" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/turf_decal/siding/red{ + dir = 8 }, -/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/greater) +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/maintenance/port/fore) "wls" = ( /obj/item/trash/sosjerky, /obj/effect/mapping_helpers/broken_floor, @@ -69665,12 +72320,6 @@ }, /turf/open/floor/iron/freezer, /area/station/commons/toilet/locker) -"wlx" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Arrivals Bay 2" - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "wlz" = ( /obj/structure/filingcabinet, /turf/open/floor/iron/dark, @@ -69683,27 +72332,21 @@ /obj/structure/closet/boxinggloves, /turf/open/floor/iron, /area/station/security/prison/workout) +"wlW" = ( +/obj/item/radio/intercom/directional/south, +/obj/machinery/computer/robotics{ + dir = 1 + }, +/turf/open/floor/iron/white/side{ + dir = 6 + }, +/area/station/command/heads_quarters/rd) "wlY" = ( /obj/machinery/door/airlock/freezer, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/showroomfloor, /area/station/security/prison/mess) -"wlZ" = ( -/obj/machinery/atmospherics/pipe/smart/simple/pink/visible{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark_red/line, -/obj/effect/turf_decal/trimline/dark_red/line{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/dark_blue/mid_joiner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/mix) "wma" = ( /obj/structure/cable, /turf/open/floor/carpet, @@ -69716,13 +72359,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/mine/eva) -"wmy" = ( -/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, +"wml" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue, +/obj/structure/railing/corner/end/flip, +/obj/effect/turf_decal/siding/thinplating/corner, /turf/open/floor/iron, -/area/station/service/hydroponics) +/area/station/commons/locker) "wmG" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -69738,15 +72381,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"wmM" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/tcomms, -/obj/item/radio/off, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/tcommsat/computer) "wmN" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -69782,14 +72416,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/command/bridge) -"wng" = ( -/obj/item/vending_refill/cigarette, -/obj/machinery/light/small/directional/east, -/obj/structure/table/wood, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar/backroom) "wnm" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/table/reinforced, @@ -69797,6 +72423,19 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/iron/dark/textured, /area/station/security/range) +"wnp" = ( +/obj/item/toy/snowball{ + pixel_x = -6; + pixel_y = -3 + }, +/mob/living/basic/pet/penguin/baby/permanent, +/turf/open/misc/asteroid/snow/standard_air, +/area/station/science/research) +"wnq" = ( +/obj/item/paper/fluff/jobs/security/beepsky_mom, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/fore) "wnv" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -69819,6 +72458,11 @@ }, /turf/open/floor/iron/white, /area/station/science/genetics) +"wnR" = ( +/obj/machinery/computer/scan_consolenew, +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/iron/dark, +/area/station/science/genetics) "wnT" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -69828,6 +72472,11 @@ }, /turf/open/floor/plating, /area/station/science/lab) +"wnX" = ( +/obj/structure/sink/directional/south, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/science/xenobiology) "woa" = ( /obj/machinery/airalarm/directional/east, /obj/machinery/disposal/bin, @@ -69847,7 +72496,7 @@ /area/station/security/brig) "wog" = ( /obj/item/food/fried_chicken, -/turf/open/floor/plating/snowed/smoothed/icemoon, +/turf/open/floor/plating/snowed/smoothed, /area/station/maintenance/fore/lesser) "wol" = ( /obj/effect/decal/cleanable/dirt, @@ -69873,8 +72522,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"woC" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/structure/sign/poster/official/safety_eye_protection/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "woF" = ( -/obj/machinery/modular_computer/console/preset/cargochat/medical{ +/obj/machinery/modular_computer/preset/cargochat/medical{ dir = 1 }, /obj/effect/turf_decal/trimline/brown/filled/end{ @@ -69882,17 +72536,6 @@ }, /turf/open/floor/iron/large, /area/station/medical/medbay/aft) -"woJ" = ( -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "woP" = ( /obj/structure/fluff/tram_rail/end{ dir = 4; @@ -69922,15 +72565,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/freezer, /area/station/commons/toilet/locker) -"wpg" = ( -/obj/structure/rack, -/obj/item/hand_labeler, -/obj/item/hand_labeler, -/obj/machinery/light/directional/east, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron/textured, -/area/station/security/brig) "wpi" = ( /obj/structure/table, /obj/item/holosign_creator/atmos{ @@ -69942,6 +72576,11 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/office) +"wpp" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/pipedispenser/disposal, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "wpu" = ( /obj/structure/table, /obj/item/stock_parts/micro_laser, @@ -69972,17 +72611,21 @@ dir = 8 }, /area/mine/eva) -"wpy" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, +"wpC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, -/area/station/hallway/secondary/entry) +/area/station/commons/locker) "wpO" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/port) +"wpQ" = ( +/obj/machinery/bluespace_vendor/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/station/commons/locker) "wpV" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -70004,6 +72647,15 @@ /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"wpZ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/end, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/turf/open/floor/iron/textured, +/area/station/medical/chem_storage) "wqb" = ( /obj/structure/cable, /obj/machinery/camera/directional/east{ @@ -70063,13 +72715,20 @@ }, /turf/open/floor/iron/dark, /area/mine/storage) -"wqZ" = ( -/obj/machinery/deepfryer, -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/machinery/light/directional/east, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) +"wqU" = ( +/obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{ + dir = 1 + }, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2{ + dir = 1 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "wrc" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, @@ -70081,6 +72740,14 @@ }, /turf/open/floor/iron, /area/station/engineering/storage) +"wrl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal) "wrA" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -70088,6 +72755,7 @@ }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron/textured, /area/station/commons/storage/primary) "wrE" = ( @@ -70133,11 +72801,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"wsx" = ( -/obj/structure/closet, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/disposal) +"wsD" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "wsF" = ( /obj/structure/table/glass, /obj/item/book/manual/wiki/infections{ @@ -70157,21 +72828,12 @@ /obj/effect/landmark/blobstart, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"wsT" = ( -/obj/machinery/button/door/directional/west{ - id = "chemistry_lower_shutters"; - name = "Chemistry Exterior Shutter Control"; - req_access = list("plumbing") - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) +"wsV" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/thinplating_new, +/turf/open/floor/iron, +/area/station/commons/locker) "wta" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -70197,17 +72859,39 @@ /obj/structure/flora/grass/brown/style_2, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) -"wtw" = ( -/obj/machinery/camera/motion/directional/south{ - c_tag = "Vault"; - network = list("vault") - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral{ +"wtr" = ( +/obj/structure/table/glass, +/obj/item/food/grown/wheat, +/obj/item/food/grown/watermelon, +/obj/item/food/grown/watermelon, +/obj/item/food/grown/watermelon, +/obj/item/food/grown/citrus/orange, +/obj/item/food/grown/grapes, +/obj/item/food/grown/cocoapod, +/obj/effect/turf_decal/tile/green/half/contrasted{ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/service/hydroponics/garden) +"wtC" = ( +/obj/structure/chair/stool/directional/south, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"wtP" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"wtT" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white/side{ + dir = 5 + }, +/area/station/science/research) "wtX" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/cold_temp, @@ -70236,6 +72920,12 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/white, /area/station/medical/surgery/fore) +"wuA" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "wuC" = ( /obj/structure/grille, /turf/open/floor/plating, @@ -70258,10 +72948,6 @@ /obj/effect/spawner/random/trash/cigbutt, /turf/open/floor/iron, /area/station/engineering/lobby) -"wva" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/engine, -/area/station/science/xenobiology) "wvb" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -70273,6 +72959,15 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured_half, /area/station/service/bar/atrium) +"wvc" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/service/hydroponics) "wve" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/white, @@ -70341,15 +73036,6 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"wvN" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/siding/white{ - dir = 6 - }, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/red/full, -/turf/open/floor/iron/large, -/area/station/service/kitchen/diner) "wvV" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmos/pumproom) @@ -70360,13 +73046,6 @@ /mob/living/simple_animal/pet/cat/runtime, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/cmo) -"wwo" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/wood, -/area/station/hallway/secondary/service) "wws" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -70380,20 +73059,10 @@ /area/station/engineering/atmos) "wwB" = ( /obj/structure/table/wood, -/obj/item/pinpointer/nuke, -/obj/item/disk/nuclear, /obj/item/storage/secure/safe/directional/east, /obj/machinery/light/directional/east, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) -"wwG" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 1 - }, -/obj/item/seeds/berry, -/turf/open/floor/grass, -/area/station/maintenance/starboard/fore) "wwI" = ( /obj/structure/chair, /obj/effect/turf_decal/stripes/line{ @@ -70458,12 +73127,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/department/chapel) -"wxA" = ( +"wxy" = ( +/obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "wxH" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -70474,18 +73142,6 @@ "wxN" = ( /turf/closed/wall/r_wall, /area/station/maintenance/solars/port/fore) -"wxR" = ( -/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/turf_decal/tile/red/half{ - dir = 4 - }, -/turf/open/floor/iron/half{ - dir = 1 - }, -/area/station/hallway/secondary/service) "wxT" = ( /obj/structure/railing{ dir = 1 @@ -70509,6 +73165,14 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"wyr" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "wyB" = ( /obj/machinery/conveyor{ dir = 1; @@ -70540,14 +73204,17 @@ }, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) -"wyU" = ( -/obj/machinery/light/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Xenobiology Pens - Port Aft"; - network = list("ss13","rd","xeno") +"wyQ" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/turf/open/floor/engine, -/area/station/science/xenobiology) +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/multi_tile/public/glass{ + name = "The Girly Boar" + }, +/turf/open/floor/iron/dark/textured_half, +/area/station/service/bar/atrium) "wzc" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -70580,6 +73247,16 @@ }, /turf/open/floor/iron, /area/mine/laborcamp) +"wzz" = ( +/obj/structure/rack, +/obj/machinery/light/cold/directional/north, +/obj/item/storage/box/bandages{ + pixel_y = 6; + pixel_x = -6 + }, +/obj/item/healthanalyzer, +/turf/open/floor/iron/white/textured, +/area/station/security/medical) "wAq" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -70627,18 +73304,6 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/station/security/brig/upper) -"wAU" = ( -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white/corner{ - dir = 1 - }, -/area/station/hallway/secondary/entry) "wAW" = ( /obj/structure/table, /obj/item/knife/kitchen, @@ -70708,75 +73373,29 @@ }, /turf/closed/wall, /area/station/cargo/sorting) -"wBS" = ( -/obj/structure/table/wood, -/obj/machinery/light/directional/west, -/obj/machinery/newscaster/directional/north, -/obj/item/flashlight/lantern, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel) +"wBR" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/hallway/secondary/service) +"wBT" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Port Hallway Center" + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "wBV" = ( /obj/structure/closet/crate, /turf/open/floor/iron, /area/station/cargo/miningdock) -"wBZ" = ( -/obj/machinery/conveyor{ - dir = 4; - id = "garbage" - }, -/obj/machinery/recycler, -/obj/structure/sign/warning/secure_area/directional/north{ - name = "\improper STAY CLEAR HEAVY MACHINERY" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"wCg" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/light_switch/directional/east, -/obj/structure/table, -/obj/item/paper_bin/construction, -/obj/item/stack/pipe_cleaner_coil/random, -/obj/item/stack/pipe_cleaner_coil/random, -/obj/item/stack/pipe_cleaner_coil/random, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white/corner{ - dir = 1 - }, -/area/station/commons/storage/art) -"wCn" = ( -/obj/item/clothing/mask/gas, -/obj/item/clothing/mask/gas{ - pixel_x = -8; - pixel_y = 4 - }, -/obj/structure/table, -/obj/machinery/door_buttons/access_button, -/obj/item/clothing/mask/gas{ - pixel_x = 6; - pixel_y = 2 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/science/xenobiology) "wCo" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 1 }, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) -"wCx" = ( -/obj/effect/turf_decal/siding/yellow{ - dir = 5 - }, -/obj/effect/landmark/start/station_engineer, -/turf/open/floor/iron, -/area/station/engineering/lobby) "wCK" = ( /obj/effect/turf_decal/trimline/dark_blue/corner{ dir = 8 @@ -70784,6 +73403,24 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/mix) +"wCL" = ( +/obj/item/reagent_containers/spray/plantbgone, +/obj/item/reagent_containers/spray/pestspray{ + pixel_x = 3; + pixel_y = 4 + }, +/obj/item/reagent_containers/cup/bottle/nutrient/ez, +/obj/item/reagent_containers/cup/bottle/nutrient/rh{ + pixel_x = 2; + pixel_y = 1 + }, +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden) "wCV" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -70791,16 +73428,6 @@ dir = 8 }, /area/station/science/explab) -"wCZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, -/obj/machinery/status_display/ai/directional/east, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "wDc" = ( /obj/structure/cable, /obj/machinery/door/airlock/engineering{ @@ -70889,11 +73516,6 @@ }, /turf/open/floor/iron/dark, /area/mine/laborcamp) -"wDu" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/engineering/storage/tech) "wDB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -70940,11 +73562,32 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/cargo/sorting) +"wEG" = ( +/obj/structure/extinguisher_cabinet/directional/south{ + pixel_x = 4 + }, +/obj/machinery/light_switch/directional/south{ + pixel_x = -6 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron, +/area/station/command/bridge) "wEL" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) +"wEM" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "wET" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71000,6 +73643,10 @@ }, /turf/open/floor/iron/dark, /area/station/tcommsat/computer) +"wGa" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "wGc" = ( /obj/machinery/door/poddoor/preopen{ id = "testlab"; @@ -71012,22 +73659,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/service/chapel) -"wGw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/official/fruit_bowl/directional/north, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/station/maintenance/port/aft) -"wGD" = ( -/obj/machinery/vending/assist, -/obj/effect/turf_decal/bot, -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/commons/storage/primary) "wGE" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -71159,19 +73790,6 @@ /obj/structure/chair/stool/directional/west, /turf/open/floor/wood/parquet, /area/station/commons/lounge) -"wIO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply, -/obj/effect/turf_decal/tile/dark{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) "wIR" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -71183,24 +73801,10 @@ /obj/structure/table, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"wJa" = ( -/obj/machinery/light/warm/directional/north, -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 5 - }, -/turf/open/floor/iron/dark/textured, -/area/station/security/prison/rec) -"wJd" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/glass_large{ - name = "The Girly Boar" - }, -/turf/open/floor/iron/dark/textured_half, -/area/station/service/bar/atrium) +"wIZ" = ( +/obj/effect/decal/remains/plasma, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) "wJe" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 4 @@ -71227,15 +73831,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/primary/central) -"wJz" = ( -/obj/machinery/light/directional/north, -/obj/structure/sign/warning/electric_shock/directional/north, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "wJD" = ( /obj/structure/sign/departments/maint/alt, /turf/closed/wall, @@ -71299,18 +73894,15 @@ /area/station/hallway/secondary/exit/departure_lounge) "wKw" = ( /obj/structure/table/wood, -/obj/item/flashlight/lamp/green, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain) -"wKA" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/item/flashlight/lamp/green{ + pixel_y = 14 }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 +/obj/item/reagent_containers/cup/glass/flask/gold{ + pixel_x = 6; + pixel_y = 5 }, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain) "wKC" = ( /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) @@ -71321,6 +73913,11 @@ }, /turf/open/floor/iron, /area/station/command/bridge) +"wKY" = ( +/obj/machinery/vending/games, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/wood, +/area/station/service/library) "wLk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers, /obj/machinery/portable_atmospherics/canister/carbon_dioxide, @@ -71336,23 +73933,10 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/command/bridge) -"wLI" = ( -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"wLK" = ( +/obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, -/area/station/engineering/supermatter/room) -"wLJ" = ( -/obj/item/circuitboard/machine/stasis, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/item/wrench/medical, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) +/area/station/ai_monitored/turret_protected/ai) "wLO" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -71439,6 +74023,17 @@ "wMt" = ( /turf/closed/wall, /area/station/hallway/primary/central/fore) +"wMw" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron, +/area/station/commons/dorms/laundry) "wMz" = ( /obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{ color = "#0000ff"; @@ -71487,13 +74082,6 @@ "wNt" = ( /turf/open/floor/iron/smooth, /area/station/security/brig/upper) -"wNC" = ( -/obj/structure/disposalpipe/junction/flip{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "wND" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -71514,6 +74102,12 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) +"wNR" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "wNT" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -71530,17 +74124,20 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured, /area/station/security/processing) +"wOh" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics) "wOn" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/engineering/atmos/storage) -"wOp" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/eighties/red, -/area/station/security/prison/safe) "wOy" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -71639,6 +74236,10 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/station/security/evidence) +"wPE" = ( +/obj/machinery/status_display/ai/directional/north, +/turf/open/openspace, +/area/station/engineering/atmos/storage) "wPN" = ( /obj/structure/railing{ dir = 4 @@ -71648,6 +74249,23 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) +"wPX" = ( +/obj/structure/table, +/obj/item/storage/belt/medical{ + pixel_y = 2 + }, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/storage/belt/medical{ + pixel_y = 2 + }, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/blood_filter, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/storage) "wPZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71682,12 +74300,19 @@ /obj/item/assembly/flash, /turf/open/floor/plating/icemoon, /area/station/security/execution/education) -"wQx" = ( -/obj/structure/chair, -/obj/machinery/light/small/red/directional/north, -/obj/item/radio/intercom/chapel/directional/east, +"wQC" = ( +/obj/item/flashlight/lantern, +/obj/structure/table/wood, +/obj/machinery/airalarm/directional/south, /turf/open/floor/iron/dark, /area/station/service/chapel) +"wQF" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1; + name = "N2 to Airmix" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "wQI" = ( /obj/structure/closet, /obj/effect/spawner/random/maintenance/four, @@ -71700,6 +74325,7 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 }, +/obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark/side{ dir = 8 }, @@ -71745,27 +74371,12 @@ }, /turf/open/floor/iron, /area/station/cargo/office) -"wRC" = ( -/obj/machinery/light/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Central Hallway North" - }, -/obj/structure/sign/directions/supply{ - dir = 8; - pixel_y = 32 - }, -/obj/structure/sign/directions/vault{ - dir = 8; - pixel_y = 24 - }, -/obj/structure/sign/directions/command{ - pixel_y = 40 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) +"wRG" = ( +/obj/machinery/computer/operating, +/obj/effect/turf_decal/tile/blue/full, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/large, +/area/station/medical/treatment_center) "wRI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -71789,6 +74400,10 @@ }, /turf/open/floor/wood, /area/station/commons/vacant_room/office) +"wRN" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/freezer, +/area/mine/eva/lower) "wRO" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71807,13 +74422,6 @@ /obj/effect/spawner/structure/window/hollow/reinforced/middle, /turf/open/floor/plating, /area/station/medical/chemistry) -"wRU" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "wSd" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71821,6 +74429,23 @@ /obj/structure/sign/warning/secure_area/directional/north, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"wSf" = ( +/obj/machinery/vending/assist, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/status_display/ai/directional/west, +/turf/open/floor/iron/dark, +/area/station/commons/storage/primary) +"wSk" = ( +/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, +/obj/effect/spawner/random/structure/steam_vent, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "wSo" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71843,13 +74468,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison/work) -"wSE" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/rack, -/obj/item/healthanalyzer, -/turf/open/floor/iron/white/textured, -/area/station/security/medical) "wSM" = ( /obj/machinery/conveyor{ dir = 4; @@ -71883,12 +74501,6 @@ "wTg" = ( /turf/closed/wall, /area/station/engineering/main) -"wTh" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "wTw" = ( /obj/effect/turf_decal/trimline/neutral/warning{ dir = 10 @@ -71947,13 +74559,6 @@ "wUj" = ( /turf/closed/wall, /area/station/service/lawoffice) -"wUq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/warm/directional/east, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/prison/workout) "wUt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -71963,14 +74568,14 @@ }, /turf/open/floor/iron/white, /area/station/science/research) -"wUw" = ( -/obj/machinery/door/poddoor/shutters{ - id = "aux_base_shutters"; - name = "Auxillary Base Shutters" +"wUu" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) +/obj/structure/disposalpipe/segment, +/obj/structure/lattice/catwalk, +/turf/open/openspace/icemoon/keep_below, +/area/station/maintenance/port/lesser) "wUz" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/machinery/camera/directional/east{ @@ -71985,6 +74590,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"wUD" = ( +/obj/structure/fake_stairs/wood/directional/north, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "wUE" = ( /obj/machinery/light_switch/directional/north{ pixel_x = -7 @@ -72072,12 +74681,33 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/station/service/library) +"wVq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/spawner/random/trash/caution_sign, +/obj/effect/decal/cleanable/glass, +/obj/structure/sign/warning/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "wVu" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 }, /turf/open/floor/iron, /area/station/command/teleporter) +"wVw" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/structure/sign/departments/chemistry/directional/west, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/dark, +/area/station/medical/treatment_center) "wVz" = ( /turf/open/floor/iron/dark, /area/mine/storage) @@ -72101,29 +74731,27 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/central) +"wWa" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"wWc" = ( +/obj/effect/decal/cleanable/oil, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/tank_holder, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "wWm" = ( /obj/item/trash/raisins, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"wWt" = ( -/obj/machinery/light/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Atmospherics - Central" - }, -/obj/machinery/atmospherics/components/binary/pump{ - name = "Port to Infiltrate" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "wWJ" = ( -/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"wWL" = ( -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron, -/area/mine/living_quarters) "wWM" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ dir = 4 @@ -72136,14 +74764,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/storage_shared) -"wWO" = ( -/obj/machinery/light/directional/south, -/obj/structure/closet/secure_closet/personal{ - anchored = 1 +"wWS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, -/area/station/commons/locker) +/area/station/hallway/secondary/entry) "wWU" = ( /obj/structure/cable, /turf/open/floor/iron/showroomfloor, @@ -72157,8 +74784,15 @@ "wXc" = ( /obj/structure/sign/warning/cold_temp/directional/east, /obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"wXf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "wXh" = ( /obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/co2{ dir = 8 @@ -72185,6 +74819,7 @@ "wXW" = ( /obj/structure/sign/warning/gas_mask/directional/south, /obj/effect/spawner/random/trash/grille_or_waste, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) "wXX" = ( @@ -72201,15 +74836,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/science/xenobiology) -"wYb" = ( -/obj/structure/table, -/obj/effect/turf_decal/stripes/red/line{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/trash/waffles, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "wYf" = ( /obj/effect/turf_decal/loading_area{ dir = 1 @@ -72224,12 +74850,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"wYm" = ( -/obj/machinery/atmospherics/components/binary/valve{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "wYp" = ( /obj/structure/sign/nanotrasen, /turf/closed/wall/ice, @@ -72259,6 +74879,14 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron/white, /area/mine/living_quarters) +"wYz" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/structure/chair/stool/directional/south, +/obj/machinery/requests_console/auto_name/directional/north, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "wYJ" = ( /turf/closed/wall, /area/station/engineering/storage_shared) @@ -72268,6 +74896,14 @@ }, /turf/open/floor/plating, /area/station/security/courtroom) +"wYZ" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "wZj" = ( /turf/open/floor/iron/dark/textured, /area/station/security/warden) @@ -72297,6 +74933,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/eva) +"wZq" = ( +/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, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood/parquet, +/area/station/commons/lounge) "wZr" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -72320,6 +74967,14 @@ /obj/structure/sign/xenobio_guide/directional/north, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"wZD" = ( +/obj/machinery/computer/records/security{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/turf/open/floor/iron/showroomfloor, +/area/station/security/warden) "wZK" = ( /obj/structure/chair/stool/bar/directional/south, /obj/effect/turf_decal/siding/wood{ @@ -72328,20 +74983,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/stone, /area/station/commons/lounge) -"wZL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"wZT" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron, -/area/station/security/prison/mess) "wZV" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/portable_atmospherics/canister/oxygen, @@ -72402,6 +75043,21 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, /area/mine/living_quarters) +"xau" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external/glass, +/turf/open/floor/plating, +/area/station/hallway/secondary/entry) +"xaA" = ( +/obj/structure/closet/secure_closet/hop, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron, +/area/station/command/heads_quarters/hop) "xaF" = ( /obj/machinery/navbeacon{ codes_txt = "delivery;dir=8"; @@ -72424,6 +75080,11 @@ "xaI" = ( /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) +"xaO" = ( +/obj/effect/spawner/random/trash/moisture_trap, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "xaV" = ( /obj/effect/turf_decal/stripes/asteroid/line{ dir = 4 @@ -72439,6 +75100,28 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/commons/fitness) +"xbf" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/item/seeds/berry, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/grass, +/area/station/maintenance/starboard/fore) +"xbj" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/structure/chair/sofa/corp/left{ + dir = 4; + pixel_x = -4 + }, +/obj/effect/landmark/start/hangover, +/obj/machinery/computer/security/telescreen/entertainment/directional/west, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/grimy, +/area/station/service/bar/atrium) "xbn" = ( /obj/effect/turf_decal/tile/neutral/diagonal_edge, /obj/structure/disposalpipe/segment{ @@ -72489,6 +75172,12 @@ /obj/structure/ladder, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) +"xce" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/white, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "xcp" = ( /obj/item/trash/pistachios, /turf/open/floor/plating, @@ -72519,6 +75208,13 @@ }, /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) +"xcJ" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "xcW" = ( /obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2{ dir = 1 @@ -72550,12 +75246,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/storage) -"xdz" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "xdA" = ( /obj/effect/turf_decal/siding/white{ dir = 4 @@ -72563,10 +75253,26 @@ /obj/structure/chair/stool/bar/directional/east, /turf/open/floor/iron/white/smooth_large, /area/station/service/kitchen/diner) +"xdH" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/entry) "xdM" = ( /obj/structure/sign/warning/cold_temp, /turf/closed/wall, /area/station/hallway/secondary/exit/departure_lounge) +"xdU" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "xdW" = ( /obj/machinery/camera/directional/east{ c_tag = "Central Hallway South-East" @@ -72574,12 +75280,20 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/central) +"xdY" = ( +/obj/structure/sign/warning/directional/west, +/turf/open/genturf/blue, +/area/icemoon/underground/unexplored/rivers/deep/shoreline) "xdZ" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 6 }, /turf/open/floor/iron/dark/textured, /area/station/security/prison/rec) +"xeg" = ( +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "xei" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -72620,6 +75334,13 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/wood, /area/station/service/library) +"xeJ" = ( +/obj/machinery/light/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Chapel East" + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "xeM" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/carbon_output{ dir = 8 @@ -72650,8 +75371,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/iron/white, /area/station/science/research) +"xfg" = ( +/obj/structure/showcase/cyborg/old{ + dir = 4; + pixel_x = -9; + pixel_y = 2 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) "xfn" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -72659,6 +75395,10 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"xft" = ( +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "xfB" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible, /turf/open/floor/iron, @@ -72773,18 +75513,6 @@ "xgy" = ( /turf/open/openspace, /area/station/service/hydroponics) -"xgB" = ( -/obj/structure/flora/rock/style_random, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/misc/asteroid/snow/icemoon, -/area/station/maintenance/port/aft) -"xgH" = ( -/obj/structure/closet/crate/coffin, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/department/chapel) "xgI" = ( /obj/structure/sign/warning/secure_area{ desc = "A warning sign which reads 'BOMB RANGE"; @@ -72816,6 +75544,16 @@ }, /turf/open/floor/iron/dark/textured_edge, /area/station/security/prison) +"xgM" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/airalarm/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "xgO" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/yellow/corner{ @@ -72832,6 +75570,38 @@ }, /turf/open/floor/iron/smooth_large, /area/station/cargo/drone_bay) +"xgQ" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"xgX" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/deck{ + pixel_y = 15; + pixel_x = -2 + }, +/obj/effect/spawner/random/food_or_drink/snack{ + pixel_x = 5; + pixel_y = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/blue, +/area/station/hallway/secondary/entry) +"xhg" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Garden" + }, +/obj/item/kirbyplants/random, +/obj/machinery/status_display/ai/directional/east, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden) "xhk" = ( /turf/open/floor/iron/dark, /area/station/commons/storage/primary) @@ -72869,6 +75639,10 @@ dir = 1 }, /area/station/hallway/primary/central) +"xhx" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "xhz" = ( /obj/structure/ladder{ name = "Kitchen Access" @@ -72899,24 +75673,15 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) -"xio" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Disposal Access" - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, -/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, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "xit" = ( /obj/item/book/manual/wiki/security_space_law, /obj/structure/table/wood, /turf/open/floor/carpet, /area/station/command/meeting_room) +"xiu" = ( +/obj/structure/marker_beacon/burgundy, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/underground/explored) "xiC" = ( /obj/structure/table/wood, /obj/effect/spawner/random/food_or_drink/snack, @@ -72947,10 +75712,6 @@ /obj/structure/sign/departments/medbay/alt, /turf/closed/wall, /area/station/medical/medbay/lobby) -"xji" = ( -/obj/machinery/vending/cigarette, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/entry) "xjj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -72990,13 +75751,6 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) -"xjL" = ( -/obj/machinery/computer/shuttle/labor{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/showroomfloor, -/area/station/security/processing) "xjO" = ( /obj/machinery/power/port_gen/pacman{ anchored = 1 @@ -73012,19 +75766,6 @@ }, /turf/open/floor/plating, /area/station/cargo/sorting) -"xjQ" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"xjY" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms/laundry) "xjZ" = ( /obj/structure/tank_dispenser/oxygen, /turf/open/floor/iron/dark, @@ -73044,13 +75785,31 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/commons/dorms) +"xkG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/confetti, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/iron/white, +/area/station/maintenance/port/fore) +"xkH" = ( +/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/siding/thinplating/corner{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/item/kirbyplants/random, +/turf/open/floor/plastic, +/area/station/commons/dorms/laundry) "xkZ" = ( /obj/machinery/teleport/station, /obj/machinery/light/small/directional/east, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat_interior) "xlf" = ( -/obj/machinery/lapvend, /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 8 }, @@ -73086,6 +75845,28 @@ }, /turf/open/floor/iron/dark/smooth_half, /area/station/security/office) +"xlA" = ( +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/mine/eva/lower) +"xlC" = ( +/obj/structure/table, +/obj/machinery/recharger, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/smooth_edge{ + dir = 1 + }, +/area/station/security/lockers) "xlH" = ( /obj/effect/mapping_helpers/broken_floor, /mob/living/basic/mouse/white{ @@ -73126,21 +75907,17 @@ dir = 9 }, /area/station/science/research) +"xmo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "xmx" = ( /obj/structure/sink/kitchen/directional/south, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) -"xmB" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 5 - }, -/obj/machinery/light_switch/directional/north{ - pixel_x = -5 - }, -/obj/structure/closet/secure_closet/medical1, -/turf/open/floor/iron/white, -/area/station/medical/virology) "xmK" = ( /obj/structure/table, /obj/item/stack/sheet/iron/fifty, @@ -73201,14 +75978,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) -"xnk" = ( -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/prison/garden) "xnt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -73233,16 +76002,20 @@ dir = 9 }, /area/station/science/research) -"xnQ" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"xnS" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/south, +/turf/open/floor/stone, +/area/mine/eva/lower) +"xnV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_large, +/area/station/security/checkpoint/customs/auxiliary) "xnX" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -73250,35 +76023,22 @@ }, /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) +"xoq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/siding/white, +/obj/machinery/camera/directional/south{ + c_tag = "Service Bar" + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "xow" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/atmos) -"xoy" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/light/directional/south, -/obj/effect/landmark/start/paramedic, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"xoB" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"xoZ" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/machinery/disposal/bin, -/obj/machinery/light/directional/west, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/stone, -/area/station/commons/lounge) "xpo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -73292,28 +76052,6 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) -"xps" = ( -/obj/item/clothing/glasses/sunglasses, -/obj/item/stack/spacecash/c10, -/obj/item/stack/spacecash/c10, -/obj/item/grenade/smokebomb, -/obj/item/poster/random_contraband{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/clothing/head/soft/yellow, -/obj/effect/spawner/random/maintenance/four, -/obj/item/crowbar/red, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/cardboard, -/obj/effect/turf_decal/siding/blue{ - dir = 5 - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/decal/cleanable/wrapping, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/maintenance/port/fore) "xpt" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/effect/turf_decal/trimline/brown/filled/end{ @@ -73325,14 +76063,26 @@ /turf/open/floor/iron/large, /area/station/medical/medbay/aft) "xpw" = ( -/obj/machinery/power/terminal{ - dir = 8 - }, +/obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, -/obj/structure/sign/poster/contraband/missing_gloves/directional/east, -/obj/machinery/light/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/department/electrical) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron, +/area/station/command/bridge) +"xpA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/door/window/brigdoor/right/directional/south{ + name = "Research Director Observation"; + req_access = list("rd") + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/command/heads_quarters/rd) "xpE" = ( /obj/structure/table, /obj/item/knife/kitchen, @@ -73352,19 +76102,16 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/atmos) -"xpQ" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron, -/area/mine/production) "xpT" = ( /obj/effect/spawner/random/trash/mess, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"xqj" = ( +/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_smooth, +/area/station/maintenance/port/greater) "xqu" = ( /obj/machinery/door/window/left/directional/north{ dir = 4; @@ -73403,6 +76150,13 @@ /obj/effect/mapping_helpers/airlock/access/all/service/general, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/service) +"xqX" = ( +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "xqY" = ( /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark, @@ -73419,15 +76173,27 @@ /obj/machinery/door/window/right/directional/south, /turf/open/floor/plating/icemoon, /area/station/security/execution/education) +"xrg" = ( +/obj/machinery/firealarm/directional/east, +/obj/structure/closet/secure_closet/engineering_welding, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/engineering/main) "xri" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/commons/dorms) -"xrm" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/department/electrical) +"xrs" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/lattice/catwalk, +/turf/open/openspace/icemoon/keep_below, +/area/station/maintenance/port/lesser) "xry" = ( /obj/machinery/newscaster/directional/west, /turf/open/floor/wood, @@ -73444,21 +76210,35 @@ }, /turf/open/floor/iron/dark, /area/mine/storage) +"xrL" = ( +/obj/machinery/washing_machine, +/obj/structure/sign/poster/official/no_erp/directional/west, +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/dorms/laundry) "xrS" = ( /obj/structure/ladder, /obj/effect/turf_decal/stripes/box, /turf/open/floor/plating, /area/station/maintenance/department/chapel) -"xsq" = ( -/obj/machinery/atmospherics/components/trinary/filter{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 +"xse" = ( +/obj/machinery/newscaster/directional/east, +/obj/machinery/light/blacklight/directional/east, +/turf/open/floor/wood, +/area/station/service/library) +"xsm" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron, -/area/station/maintenance/port/fore) +/area/station/maintenance/port/aft) "xss" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/yellow/half/contrasted, @@ -73475,19 +76255,15 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, /turf/open/floor/plating, /area/station/engineering/storage/tech) +"xsA" = ( +/obj/structure/rack, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "xsD" = ( /obj/item/food/grown/carrot, /turf/open/misc/asteroid/snow/standard_air, /area/station/science/research) -"xsE" = ( -/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/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/maintenance/disposal) "xtc" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 1 @@ -73514,13 +76290,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/cargo/miningdock) -"xtz" = ( -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark/textured_edge, -/area/station/security/prison) "xtG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -73546,12 +76315,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/white, /area/station/medical/virology) -"xtS" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/science/ordnance) "xtX" = ( /obj/structure/sign/warning/secure_area/directional/east, /obj/structure/cable, @@ -73623,13 +76386,15 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) -"xvc" = ( -/obj/structure/chair/wood{ - dir = 4 +"xuW" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/obj/machinery/light/directional/north, -/turf/open/floor/wood/parquet, -/area/station/commons/lounge) +/obj/item/kirbyplants/random, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/station/hallway/secondary/entry) "xvj" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 5 @@ -73643,6 +76408,21 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"xvk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/landmark/blobstart, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"xvl" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/siding/thinplating_new/corner{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/station/hallway/secondary/entry) "xvn" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -73694,6 +76474,21 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/storage) +"xwr" = ( +/obj/structure/rack, +/obj/item/clothing/suit/hooded/wintercoat/eva{ + pixel_y = 9 + }, +/obj/item/clothing/shoes/winterboots/ice_boots/eva{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/effect/turf_decal/delivery/red, +/obj/item/clothing/gloves/color/grey/protects_cold, +/obj/item/clothing/mask/gas, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/textured, +/area/station/ai_monitored/command/storage/eva) "xws" = ( /obj/structure/table, /obj/machinery/light/small/directional/north, @@ -73708,11 +76503,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"xwt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/construction) "xwu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -73749,31 +76539,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"xwG" = ( -/obj/structure/table, -/obj/machinery/light/directional/south, -/obj/item/storage/crayons, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms/laundry) "xwM" = ( /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/maintenance/aft/greater) -"xxc" = ( -/obj/structure/cable, -/obj/machinery/power/terminal{ - dir = 8 - }, -/obj/structure/closet/crate/preopen, -/obj/machinery/light/directional/south, -/obj/item/stack/sheet/mineral/plasma/thirty, -/turf/open/floor/iron/smooth, -/area/mine/laborcamp/security) "xxg" = ( /obj/structure/cable, /turf/open/floor/iron/white, @@ -73806,10 +76577,31 @@ /obj/structure/cable, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) +"xxC" = ( +/obj/effect/turf_decal/trimline/yellow/filled/shrink_ccw, +/obj/machinery/camera/directional/south{ + c_tag = "Atmospherics - HFR South" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "xxI" = ( -/obj/structure/filingcabinet, +/obj/machinery/airalarm/directional/north, +/obj/item/kirbyplants/random, /turf/open/floor/iron/grimy, -/area/station/commons/vacant_room/office) +/area/station/hallway/secondary/entry) +"xxQ" = ( +/obj/structure/table, +/obj/item/screwdriver{ + pixel_y = 16 + }, +/obj/item/wirecutters, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/station/engineering/storage/tech) +"xxV" = ( +/obj/structure/flora/grass/brown/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) "xyc" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -73859,6 +76651,14 @@ }, /turf/open/floor/iron/smooth_large, /area/station/command/heads_quarters/hos) +"xyy" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/treatment_center) "xyz" = ( /obj/machinery/light_switch/directional/north{ pixel_x = 4 @@ -73888,6 +76688,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"xyN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/commons/storage/mining) "xyO" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -73914,16 +76721,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/showroomfloor, /area/station/security/prison/mess) -"xyY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs/auxiliary) -"xza" = ( -/obj/structure/closet/crate, -/obj/effect/landmark/blobstart, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/construction) "xzd" = ( /obj/machinery/camera/directional/east{ c_tag = "Library South" @@ -73938,17 +76735,17 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"xzo" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "xzp" = ( /obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron, /area/mine/laborcamp/security) -"xzI" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/effect/spawner/random/vending/colavend, -/turf/open/floor/iron, -/area/station/commons/locker) "xzO" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/maintenance/three, @@ -73969,15 +76766,21 @@ /obj/structure/sign/poster/contraband/random/directional/east, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"xAf" = ( -/obj/machinery/firealarm/directional/north, -/obj/structure/cable, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 +"xAk" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/turf/open/floor/iron, -/area/station/engineering/storage) +/turf/open/floor/iron/large, +/area/station/hallway/secondary/entry) +"xAm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/atmos_control/nocontrol/incinerator{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal/incinerator) "xAs" = ( /turf/closed/wall/r_wall, /area/icemoon/surface/outdoors/nospawn) @@ -74053,23 +76856,18 @@ /obj/effect/turf_decal/trimline/red/line, /turf/open/floor/iron/dark/textured, /area/station/security/range) -"xBF" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/steam_vent, +"xBL" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Solar Maintenance - North East Access" + }, +/obj/machinery/light/small/dim/directional/north, /turf/open/floor/plating, -/area/mine/eva/lower) +/area/station/maintenance/starboard/fore) "xBN" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/textured, /area/station/engineering/atmos/storage/gas) -"xBO" = ( -/obj/machinery/light/directional/east, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "xBU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -74108,9 +76906,19 @@ "xCl" = ( /turf/open/floor/iron, /area/station/science/robotics/lab) +"xCr" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/dorms/laundry) "xCv" = ( /obj/machinery/computer/security, /obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/digital_clock/directional/north, /turf/open/floor/iron, /area/station/command/bridge) "xCz" = ( @@ -74148,12 +76956,25 @@ "xDb" = ( /turf/closed/wall/r_wall, /area/station/medical/virology) +"xDh" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Locker Room West" + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/station/commons/locker) "xDr" = ( /obj/effect/turf_decal/siding/white, /obj/effect/spawner/random/vending/snackvend, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"xDw" = ( +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "xDG" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ @@ -74167,6 +76988,13 @@ /obj/effect/landmark/start/prisoner, /turf/open/floor/iron, /area/station/security/prison/workout) +"xDQ" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/fake_stairs/wood/directional/north, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "xDU" = ( /obj/structure/table, /obj/effect/spawner/random/entertainment/drugs, @@ -74203,17 +77031,6 @@ /obj/effect/turf_decal/tile/green/full, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/virology) -"xEs" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/light/directional/south, -/obj/machinery/firealarm/directional/south, -/obj/structure/table/glass, -/obj/machinery/fax{ - fax_name = "Chief Medical Officer's Office"; - name = "Chief Medical Officer's Fax Machine" - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/cmo) "xEt" = ( /obj/structure/closet/bombcloset, /turf/open/floor/plating, @@ -74228,6 +77045,10 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar/backroom) +"xEE" = ( +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "xEF" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -74266,18 +77087,18 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/iron/dark, /area/station/maintenance/disposal/incinerator) -"xEP" = ( -/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/station/hallway/secondary/entry) "xEQ" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/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/science/ordnance) +"xEW" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/mine/living_quarters) "xFi" = ( /obj/structure/sign/warning/cold_temp/directional/south, /obj/structure/sign/warning/gas_mask/directional/north, @@ -74300,6 +77121,20 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/security/brig/upper) +"xFs" = ( +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"xFv" = ( +/obj/effect/turf_decal/siding/white{ + dir = 6 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron, +/area/station/service/bar) "xFA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -74324,13 +77159,8 @@ /turf/open/floor/iron/dark, /area/station/engineering/storage) "xFM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/structure/sign/delamination_counter/directional/north, -/turf/open/floor/engine, +/obj/machinery/incident_display/delam, +/turf/closed/wall/r_wall, /area/station/engineering/supermatter/room) "xFU" = ( /obj/structure/barricade/wooden, @@ -74374,14 +77204,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/engineering/atmos/storage/gas) -"xGr" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=8"; - location = "QM #3" - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/cargo/storage) "xGt" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -74408,14 +77230,9 @@ id = "medsecprivacy"; name = "Privacy Shutters" }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/station/security/checkpoint/medical) -"xGF" = ( -/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/station/construction) "xGI" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{ dir = 4 @@ -74438,15 +77255,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"xGQ" = ( -/obj/structure/sign/poster/official/soft_cap_pop_art/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/maintenance/port/fore) "xGX" = ( /obj/machinery/door/airlock/public/glass{ name = "Trial Transfer" @@ -74477,14 +77285,6 @@ /obj/machinery/griddle, /turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) -"xHk" = ( -/obj/machinery/light/small/directional/west, -/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, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/morgue) "xHq" = ( /obj/machinery/door/airlock/security/glass{ name = "Brig Entrance" @@ -74516,6 +77316,14 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/carpet, /area/station/security/processing) +"xIp" = ( +/obj/structure/closet/secure_closet/brig, +/obj/machinery/camera/directional/north{ + c_tag = "Security - Transport" + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/showroomfloor, +/area/station/security/processing) "xIz" = ( /obj/effect/turf_decal/trimline/neutral/mid_joiner{ dir = 4 @@ -74543,13 +77351,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark, /area/station/science/server) -"xII" = ( -/obj/structure/closet/secure_closet/personal{ - anchored = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/starboard/fore) "xIS" = ( /obj/item/radio/intercom/directional/east, /obj/effect/turf_decal/tile/blue, @@ -74566,12 +77367,6 @@ "xJj" = ( /turf/open/floor/iron, /area/station/science/xenobiology) -"xJv" = ( -/obj/structure/sign/map/right{ - pixel_y = 32 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "xJw" = ( /obj/machinery/camera/directional/south{ c_tag = "Atmospherics Project Room" @@ -74611,6 +77406,20 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"xJT" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room) +"xKb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron/dark/smooth_corner{ + dir = 4 + }, +/area/station/command/gateway) "xKd" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/simple/green/visible, @@ -74638,22 +77447,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/external, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) -"xKA" = ( -/obj/machinery/conveyor{ - dir = 4; - id = "packageSort2" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/cargo/sorting) -"xKG" = ( -/obj/structure/closet, -/obj/effect/spawner/random/maintenance/two, -/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/hidden, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "xKJ" = ( /turf/closed/wall, /area/station/command/meeting_room) @@ -74675,13 +77468,6 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/dark/textured_half, /area/station/security/office) -"xLn" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "xLq" = ( /turf/open/floor/glass/reinforced, /area/station/science/ordnance/office) @@ -74731,15 +77517,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/security/prison/work) -"xMg" = ( -/obj/machinery/computer/security, -/obj/structure/reagent_dispensers/wall/peppertank/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs/auxiliary) "xMh" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, @@ -74768,10 +77545,6 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"xMy" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/security/prison/visit) "xMM" = ( /obj/machinery/computer/operating{ dir = 8 @@ -74818,6 +77591,13 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"xNC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "xNE" = ( /obj/structure/stairs/west, /obj/structure/railing, @@ -74914,6 +77694,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/freezer, /area/station/commons/toilet/locker) +"xQg" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L13" + }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "xQh" = ( /obj/machinery/power/terminal{ dir = 1 @@ -74922,6 +77709,19 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) +"xQm" = ( +/obj/machinery/airalarm/directional/west, +/obj/structure/closet/secure_closet/freezer/fridge/all_access, +/turf/open/floor/iron/showroomfloor, +/area/station/security/prison/mess) +"xQs" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/customs/auxiliary) "xQu" = ( /obj/machinery/light/directional/north, /turf/open/floor/plating/snowed/smoothed/icemoon, @@ -74933,16 +77733,6 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron/white, /area/station/maintenance/port/fore) -"xQD" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/mine/eva/lower) "xQG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -74955,19 +77745,15 @@ dir = 1 }, /area/station/security/processing) -"xQO" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "xQT" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply, /turf/open/floor/plating, /area/station/medical/virology) +"xQU" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) "xRw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -74976,6 +77762,19 @@ }, /turf/open/floor/iron, /area/station/command/bridge) +"xRF" = ( +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/obj/machinery/light/dim/directional/south, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"xRI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "xRP" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -74995,14 +77794,23 @@ /obj/effect/mapping_helpers/mail_sorting/service/kitchen, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"xRZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room) +"xSj" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/carpet, +/area/station/service/theater) "xSl" = ( -/obj/item/radio/intercom/directional/south, /obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 + dir = 1 }, +/obj/item/radio/intercom/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/east, /turf/open/floor/wood, /area/station/commons/vacant_room/office) "xSn" = ( @@ -75012,6 +77820,11 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/security/brig) +"xSt" = ( +/obj/effect/spawner/random/structure/crate, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/fore) "xSu" = ( /obj/structure/table/glass, /obj/machinery/reagentgrinder, @@ -75035,17 +77848,12 @@ "xSA" = ( /turf/open/floor/wood, /area/station/service/lawoffice) -"xSM" = ( -/obj/structure/table, -/obj/item/flashlight{ - pixel_x = 1; - pixel_y = 5 +"xSL" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 }, -/obj/item/wirecutters, -/obj/machinery/status_display/ai/directional/east, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, -/turf/open/floor/iron/dark, -/area/station/commons/storage/primary) +/turf/open/floor/iron/large, +/area/station/hallway/primary/port) "xTp" = ( /obj/machinery/camera/directional/south{ c_tag = "Solar Maintenance - North East" @@ -75060,6 +77868,7 @@ c_tag = "Atmospherics Incinerator" }, /obj/machinery/atmospherics/components/tank/plasma, +/obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "xTw" = ( @@ -75075,15 +77884,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) -"xTP" = ( -/obj/machinery/computer/shuttle/mining{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) "xTQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -75093,6 +77893,23 @@ }, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"xTU" = ( +/obj/structure/closet/wardrobe/pjs, +/obj/effect/landmark/start/hangover/closet, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/commons/dorms) +"xTV" = ( +/obj/structure/table, +/obj/machinery/firealarm/directional/east, +/obj/item/pipe_dispenser, +/obj/item/pipe_dispenser{ + pixel_x = 3; + pixel_y = 7 + }, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/office) "xTX" = ( /obj/effect/turf_decal/siding/wood, /obj/effect/turf_decal/siding/wood{ @@ -75142,6 +77959,15 @@ /obj/structure/sign/departments/maint/directional/west, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) +"xUF" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal) "xUG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -75176,48 +78002,36 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"xUW" = ( -/obj/machinery/airalarm/directional/south, -/obj/machinery/light/directional/south, -/obj/structure/filingcabinet/chestdrawer, +"xUV" = ( +/obj/machinery/portable_atmospherics/canister, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/machinery/light/directional/west, /turf/open/floor/iron, -/area/station/tcommsat/computer) +/area/station/engineering/atmos) "xVf" = ( /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/cargo) -"xVB" = ( +"xVq" = ( /obj/machinery/light/directional/north, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"xVD" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 10 - }, -/obj/machinery/hydroponics/constructable, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics) +/turf/open/floor/wood, +/area/station/command/meeting_room) "xVG" = ( /turf/open/floor/plating, /area/station/hallway/secondary/exit/departure_lounge) "xVK" = ( /turf/closed/wall, /area/station/service/janitor) -"xVL" = ( -/obj/structure/closet/secure_closet/personal{ - anchored = 1 +"xVN" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/commons/locker) +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/entry) "xVO" = ( /obj/structure/table/wood, /obj/item/reagent_containers/cup/glass/mug/coco{ @@ -75227,25 +78041,12 @@ }, /turf/open/floor/wood, /area/station/maintenance/space_hut/cabin) -"xVS" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lantern, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/stone, -/area/mine/eva/lower) "xVT" = ( /obj/structure/railing{ dir = 9 }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"xVU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/bookcase/random, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) "xVX" = ( /obj/structure/closet/crate, /obj/machinery/light/small/directional/south, @@ -75279,21 +78080,6 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"xWu" = ( -/obj/structure/rack, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = 5; - pixel_y = -2 - }, -/obj/item/tank/internals/emergency_oxygen{ - pixel_y = 3 - }, -/obj/item/tank/internals/emergency_oxygen, -/obj/structure/sign/warning/cold_temp/directional/west, -/obj/item/clothing/mask/gas, -/obj/item/clothing/mask/gas, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/exit/departure_lounge) "xWA" = ( /obj/structure/table, /obj/item/plate, @@ -75328,6 +78114,16 @@ }, /turf/open/floor/iron, /area/station/commons/storage/primary) +"xXd" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/multi_tile/public/glass{ + name = "Laundry Room" + }, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "xXf" = ( /obj/machinery/portable_atmospherics/pump, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -75340,11 +78136,11 @@ dir = 1 }, /area/station/engineering/atmos/storage/gas) -"xXm" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/morgue) +"xXk" = ( +/obj/structure/railing, +/obj/structure/flora/grass/green/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "xXt" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/delivery, @@ -75414,11 +78210,19 @@ dir = 10 }, /area/station/science/research) -"xYv" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) +"xYr" = ( +/obj/machinery/mineral/stacking_unit_console{ + pixel_x = -32 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Disposals" + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal) "xYw" = ( /obj/structure/flora/bush/leavy/style_random, /turf/open/floor/grass, @@ -75428,20 +78232,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/electrical) -"xYB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/railing{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/commons/locker) "xYI" = ( /obj/machinery/telecomms/server/presets/science, /turf/open/floor/iron/dark/telecomms, @@ -75509,6 +78299,16 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/science/robotics/lab) +"yas" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Central Hallway South" + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "yav" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 4 @@ -75550,12 +78350,6 @@ "yaL" = ( /turf/closed/wall/r_wall, /area/station/engineering/engine_smes) -"yaR" = ( -/obj/structure/disposalpipe/trunk/multiz/down{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "yaT" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/oxygen_output{ dir = 1 @@ -75612,11 +78406,6 @@ /obj/effect/decal/cleanable/insectguts, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"ybD" = ( -/obj/machinery/suit_storage_unit/security, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/smooth, -/area/station/security/brig/upper) "ybE" = ( /obj/structure/extinguisher_cabinet/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -75652,6 +78441,13 @@ /obj/effect/mapping_helpers/airlock/access/all/security/court, /turf/open/floor/iron, /area/station/security/courtroom) +"ybO" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) "ybQ" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/command/nuke_storage) @@ -75669,6 +78465,7 @@ "ycc" = ( /obj/structure/plasticflaps, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/fore) "ych" = ( @@ -75676,14 +78473,6 @@ /obj/effect/turf_decal/bot_red, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) -"ycj" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/flora/bush/jungle/a/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" - }, -/area/station/security/prison/rec) "yco" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -75711,6 +78500,13 @@ }, /turf/open/floor/wood/tile, /area/station/service/theater) +"ycA" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/entry) "ycB" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -75753,36 +78549,40 @@ }, /turf/open/floor/iron, /area/station/engineering/lobby) -"ydi" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/red{ - dir = 8 - }, -/obj/effect/spawner/random/maintenance, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/maintenance/port/fore) "ydt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/prison/mess) -"ydw" = ( -/obj/machinery/modular_computer/console/preset/id, -/obj/machinery/light/directional/north, -/obj/item/radio/intercom/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half/contrasted{ +"ydu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 1 }, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs/auxiliary) +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/mine/eva/lower) +"ydA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/event_spawn, +/obj/effect/decal/cleanable/crayon{ + pixel_x = -5; + pixel_y = -5 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/chapel) "ydD" = ( /obj/effect/spawner/random/structure/crate_abandoned, /obj/machinery/light/small/directional/south, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/fore) +"ydH" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/glass, +/obj/structure/sign/warning/no_smoking/circle/directional/west, +/turf/open/floor/plating/icemoon, +/area/station/maintenance/port/lesser) "ydI" = ( /turf/closed/wall/r_wall, /area/station/hallway/secondary/entry) @@ -75818,18 +78618,22 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"yel" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "yep" = ( /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) -"yew" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/firealarm/directional/south, -/obj/machinery/light/directional/south, -/turf/open/openspace, -/area/station/science/xenobiology) +"yev" = ( +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron, +/area/station/commons/storage/mining) "yey" = ( /obj/effect/landmark/start/hangover, /obj/effect/decal/cleanable/dirt, @@ -75859,13 +78663,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/wood, /area/station/service/library) -"yfb" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "yfp" = ( /obj/machinery/firealarm/directional/north, /turf/open/floor/wood/parquet, @@ -75884,6 +78681,11 @@ /obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) +"yfY" = ( +/obj/machinery/skill_station, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood, +/area/station/service/library) "ygd" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 4 @@ -75897,29 +78699,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"ygs" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 9 - }, -/obj/machinery/light/directional/north, -/obj/machinery/duct, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply, -/obj/structure/sign/warning/electric_shock/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"ygu" = ( -/obj/item/instrument/saxophone, -/obj/machinery/light/directional/north, -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/obj/item/instrument/piano_synth, -/obj/structure/table/wood, -/obj/machinery/camera{ - c_tag = "Service Theater"; - dir = 9 - }, -/turf/open/floor/wood/tile, -/area/station/service/theater) "ygv" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -75940,16 +78719,6 @@ "ygB" = ( /turf/closed/wall, /area/station/commons/dorms) -"ygE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/structure/cable, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/closet/secure_closet/medical2, -/turf/open/floor/iron, -/area/station/science/xenobiology) "ygF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -75966,19 +78735,11 @@ }, /turf/open/floor/iron/smooth_half, /area/station/security/brig/upper) -"ygX" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"yhe" = ( +/obj/structure/cable, +/obj/machinery/light/directional/south, /turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"yhp" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/closed/wall, -/area/station/maintenance/port/greater) +/area/station/cargo/sorting) "yhw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -76026,7 +78787,7 @@ /turf/open/floor/iron/dark/textured_edge{ dir = 4 }, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) "yiL" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/security/armory) @@ -76036,12 +78797,11 @@ /turf/open/floor/iron/dark/textured, /area/station/security/prison) "yjn" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Solar Maintenance - North West Access" +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 }, -/obj/machinery/light/small/directional/north, /turf/open/floor/plating, -/area/station/maintenance/port/fore) +/area/station/maintenance/port/greater) "yju" = ( /obj/structure/table, /obj/effect/spawner/random/maintenance/two, @@ -76056,12 +78816,6 @@ }, /turf/open/floor/plating, /area/station/science/xenobiology) -"yjK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/generic, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/morgue) "yjP" = ( /obj/effect/turf_decal/siding/wood{ dir = 9 @@ -76080,10 +78834,21 @@ /obj/structure/chair/stool/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"ykb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) "ykn" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, /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/smooth, /area/station/maintenance/fore/lesser) "ykw" = ( @@ -76132,6 +78897,12 @@ /obj/structure/sign/warning/cold_temp/directional/south, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) +"ylt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/visible, +/obj/structure/sign/poster/official/safety_internals/directional/east, +/obj/structure/sign/poster/official/safety_internals/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "ylz" = ( /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/trimline/neutral/warning, @@ -76146,14 +78917,6 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark/textured, /area/station/security/prison/workout) -"ylD" = ( -/obj/machinery/computer/security/labor, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/laborcamp/security) "ylF" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -76187,11 +78950,30 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"ylY" = ( +"ylV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/binary/valve{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"ymb" = ( +/obj/structure/railing/corner{ + dir = 4 + }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/maintenance/starboard/fore) +/obj/machinery/firealarm/directional/north, +/obj/machinery/camera{ + c_tag = "Mining B-2 Hallway"; + dir = 9 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/mine/eva/lower) (1,1,1) = {" oSU @@ -79192,90 +81974,90 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -fqJ -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +fqJ +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +mJv +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU "} (13,1,1) = {" oSU @@ -88642,10 +91424,10 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU +thA +thA +thA +thA oSU oSU oSU @@ -88898,12 +91680,12 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU +thA +thA +thA +thA +thA +thA oSU oSU oSU @@ -89154,15 +91936,15 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +thA +thA +thA +jAv +iDt +thA +thA +thA +thA oSU oSU oSU @@ -89411,15 +92193,15 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +thA +thA +iDt +ghx +ghx +iDt +thA +thA +thA oSU oSU oSU @@ -89667,17 +92449,17 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +thA +thA +thA +ghx +ghx +ghx +ghx +ghx +thA +thA +thA oSU oSU oSU @@ -89924,18 +92706,18 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +thA +thA +iDt +ghx +ghx +ghx +ghx +ghx +iDt +thA +thA +thA oSU oSU oSU @@ -90181,18 +92963,18 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +thA +jAv +ghx +ghx +ghx +wIZ +ghx +ghx +xxV +thA +thA +thA oSU oSU oSU @@ -90437,19 +93219,19 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +thA +thA +cCb +ghx +ghx +euI +ijY +ghx +ghx +ghx +iDt +thA +thA oSU oSU oSU @@ -90694,19 +93476,19 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +thA +thA +iDt +ghx +ghx +ghx +ghx +ghx +ghx +ghx +iDt +thA +thA oSU oSU oSU @@ -90951,19 +93733,19 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +thA +iDt +ghx +ghx +ghx +ghx +ghx +ghx +ghx +iDt +iDt +thA +thA oSU oSU oSU @@ -91207,20 +93989,20 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +thA +thA +xxV +ghx +ghx +ghx +ghx +ghx +pfw +iDt +thA +thA +thA +thA oSU oSU oSU @@ -91464,19 +94246,19 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +thA +thA +ghx +ghx +ghx +ghx +iDt +iDt +iDt +thA +thA +thA +thA oSU oSU oSU @@ -91720,19 +94502,19 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +thA +thA +thA +ghx +ghx +ghx +ghx +thA +thA +thA +thA +thA +thA oSU oSU oSU @@ -91977,17 +94759,17 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +thA +thA +iDt +ghx +ghx +ghx +thA +thA +thA +thA +thA oSU oSU oSU @@ -92234,16 +95016,16 @@ thA thA oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +thA +thA +iDt +ghx +ghx +thA +thA +thA +thA +thA oSU oSU oSU @@ -92490,15 +95272,15 @@ thA thA thA thA -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +thA +thA +thA +ghx +ghx +ghx +thA +thA +thA oSU oSU oSU @@ -92748,21 +95530,21 @@ thA thA thA thA -ipf -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +thA +thA +ghx +ghx +ghx +thA +thA +thA oSU oSU oSU oSU +thA +thA +thA oSU oSU oSU @@ -92955,81 +95737,81 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +thA +ghx +ghx +ghx +thA +thA +thA +thA +thA +thA +thA +thA +pfw +thA +thA +thA +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU thA thA thA @@ -93264,21 +96046,21 @@ thA thA thA thA -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +ghx +ghx +ghx +thA +thA +thA +thA +thA +thA +jAv +iDt +iDt +thA +iDt +thA oSU oSU oSU @@ -93301,8 +96083,8 @@ ghx ghx ghx ghx -hMz -hMz +ghx +ghx ghx ghx rjE @@ -93521,21 +96303,21 @@ thA thA thA thA +ghx +ghx +ghx +thA +iDt +iDt +thA +thA +ghx +ghx +ghx +ghx +ghx +iDt thA -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU oSU oSU oSU @@ -93778,21 +96560,21 @@ thA thA thA thA +ghx +ghx +ghx +ijY +iDt +ghx +ghx +ghx +ghx +ghx +ghx +ghx +tLj +iDt thA -thA -thA -thA -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU oSU oSU oSU @@ -94035,21 +96817,21 @@ thA thA thA thA +iDt +ghx +ghx +ghx +ghx +ghx +thA +thA +xxV +thA +thA thA thA thA thA -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU oSU thA thA @@ -94078,8 +96860,8 @@ xuo qlU wDU roa -nIN -fob +wRN +qPX wDU xlq ghx @@ -94292,16 +97074,16 @@ ghx thA thA thA +iDt +ghx +ghx +ghx +ghx thA thA thA thA thA -thA -oSU -oSU -oSU -oSU oSU oSU oSU @@ -94549,10 +97331,10 @@ ghx thA thA thA -thA -thA -thA -thA +iDt +ghx +ghx +iDt thA thA thA @@ -94592,7 +97374,7 @@ wDU tbX qmt nAa -vmH +qLQ vBg qmt tbX @@ -94805,11 +97587,11 @@ ghx thA thA thA -thA -thA -thA -thA -thA +iDt +iDt +ghx +ghx +iDt thA thA thA @@ -94848,9 +97630,9 @@ xuo dBY moc tGi -iGv +kBX fdp -bod +qiF dBY moc tGi @@ -95061,12 +97843,12 @@ ghx ghx ghx ghx -thA -thA +iDt +iDt ghx ghx ghx -thA +iDt thA thA thA @@ -95107,7 +97889,7 @@ qmt qmt jpi tYz -vod +gle qmt qmt qmt @@ -95323,7 +98105,7 @@ ghx ghx ghx ghx -thA +iDt thA thA thA @@ -95364,14 +98146,14 @@ qmt dzL fHZ tYz -bod +qiF oBm qmt -bhs +kHj dLe dLe -sCg -fas +ezl +sHl wDU ghx ghx @@ -95580,7 +98362,7 @@ ghx ghx ghx ghx -thA +iDt thA thA thA @@ -95620,15 +98402,15 @@ nfr kLa giV aZD -vip +eVa gSO tmE qmt iBd chO -sPu -sCg -hor +doM +ezl +xnS wDU ghx ghx @@ -95836,8 +98618,8 @@ ghx ghx ghx ghx -thA -thA +iDt +iDt thA thA thA @@ -95876,16 +98658,16 @@ xvO nfr qmt qmt -jmb -vip +ymb +eVa rnx fYH fEV -cVc -voS +atj +jmC rgm qJv -xVS +lyu wDU ver ghx @@ -96094,8 +98876,8 @@ ghx ghx ghx ghx -thA -thA +iDt +iDt thA thA thA @@ -96128,21 +98910,21 @@ thA iDt xuo wDU -haq -xBF +uqz +kTF nfr qmt iVm -lun -vip +xlA +eVa gSO uPt qmt -mwU -fOV +aQy +fLC dLe wzl -kFG +qen wDU scw ghx @@ -96351,9 +99133,9 @@ ghx ghx ghx ghx -thA -thA -thA +iDt +iDt +iDt thA thA thA @@ -96390,8 +99172,8 @@ kLa qmt qmt sAa -juZ -vFM +qKk +wbH lIR uUT uUT @@ -96611,7 +99393,7 @@ ghx hpE xuo xuo -thA +iDt thA thA thA @@ -96644,12 +99426,12 @@ wDU btB gfw nfr -ecR +igq qmt qmt -qeF +gSK tYz -kXL +vTb rmB agk bjN @@ -96898,19 +99680,19 @@ thA thA iDt wDU -haq +uqz bRC nfr jAu qmt ofz -xQD +ydu tYz -ovF +scm uUT hRD nKV -kKE +uwM dsn iYA nUi @@ -97155,19 +99937,19 @@ thA thA iDt wDU -paR -haq +ljP +uqz bQN tnb qmt -sWa -ufE +mfc +mtn tYz -bod +qiF gIu hOo sgA -rXw +ceS xOb eLS iwf @@ -100173,7 +102955,7 @@ lBR kZI hap rfu -kuu +bPV dFF dFF xuo @@ -100423,7 +103205,7 @@ kHn lBR xrC tcQ -egG +qLi cur gQE nNn @@ -100685,7 +103467,7 @@ fWa beQ nNn hYy -oQg +sdE bAk mAO kXY @@ -100935,7 +103717,7 @@ ifZ amx ddz lBR -rlh +fIb fnj egz hsr @@ -101202,7 +103984,7 @@ bwi vyO dEz uDy -hOA +kZn mJX xuo xuo @@ -101706,14 +104488,14 @@ uOb lBR lBR lBR -wJa +sCa jRu -kzr +uNV khb xdZ nNn iDu -mQV +upY qna dEz gxx @@ -101976,7 +104758,7 @@ gzV nNn nNn axb -ppU +tCV cFc mJX ghx @@ -102737,12 +105519,12 @@ vVH dWn wPg fHg -jjo +bol vVH vVH vVH vVH -hWs +dHb kqR ugd nNn @@ -102991,7 +105773,7 @@ xhK taV kZh vVH -iCO +bub wPg fHg hnt @@ -102999,14 +105781,14 @@ vVH fps usS vVH -npV +gwy ixw kqR gzV xUG kcC -ddd -ioC +puc +kGP sEC dbH ghx @@ -103256,7 +106038,7 @@ eTv dFX nbm vVH -ycj +akZ pdx uma nNn @@ -103517,7 +106299,7 @@ ldH ldH ldH ldH -fTb +eMG iKw iZs sOT @@ -103769,7 +106551,7 @@ lJS bol oSD ldH -cmV +xQm yaZ dNH xyU @@ -104028,7 +106810,7 @@ oSD ldH qiJ qTs -kyS +vPt hfv ldH pEX @@ -104275,7 +107057,7 @@ ghx xby lFe rvj -gcE +bSo vVH gZP mbZ @@ -104531,13 +107313,13 @@ ghx ghx xby sJi -wOp +pvJ gaS vVH fQG lsN -pIZ -fwn +iLy +eDg oGB sKu rAR @@ -105045,7 +107827,7 @@ ghx axF dcw fGI -oJS +sSl etw lXJ xbv @@ -105061,8 +107843,8 @@ mXK ueP bZK gOS -wZT -sdP +iJr +vSK kse dbH ghx @@ -105831,7 +108613,7 @@ ldH gNP pBb gbu -ueo +kHL dbH psb psb @@ -106083,7 +108865,7 @@ xtG xtG vyw bdJ -mxG +thc ldH opI daE @@ -106330,19 +109112,19 @@ ghx ghx dcw bDd -wUq +hBF owf bkX -cJI +sBw uDk -fIH +bht iUw wlR sbJ vyw fuX ldH -srY +sJe wKC pYa gcZ @@ -106600,7 +109382,7 @@ qwa qts ldH fwL -hux +wKC kDu vXn ots @@ -109387,7 +112169,7 @@ iDt iDt iDt vjh -enH +szu hdV jLo bJx @@ -109651,7 +112433,7 @@ dqx njJ cVD njJ -hTH +eCz oFp dqx vjh @@ -109905,16 +112687,16 @@ dqx dqx pfO dqx -agO +vDy hDK -dqx +rwR hDK wzn -bxW +qtH vjh sLa -uwh -oOj +vwG +uno pDy nTO kAG @@ -110174,7 +112956,7 @@ xcx jvM ifa nTO -qpy +okl tmB jvM nTO @@ -110415,7 +113197,7 @@ vjh aYQ bLL njJ -qbl +kqs dqx rVX dqx @@ -110426,12 +113208,12 @@ usx qUw qUw vjh -uPn +aCj cqz tmB -imh +uMM nTO -tMG +lRE tmB jvM sJR @@ -110673,7 +113455,7 @@ njJ njJ njJ njJ -sSn +bEi rVX dqx pSn @@ -110683,7 +113465,7 @@ wDs vjh vjh vjh -xVB +fEX cqz ccx wHH @@ -110927,8 +113709,8 @@ bml msi njJ pDI -isa -nzF +bxX +wzn njJ mZJ rVX @@ -111183,7 +113965,7 @@ dLN uCk tAL njJ -jUe +lWy jlG rQx duS @@ -111191,8 +113973,8 @@ lmK rVX fez lxn -gvV -cfR +bVY +whz sbO vjh drP @@ -111203,7 +113985,7 @@ pXB eSr fcY tmB -rZn +tmB tmB bAM rmv @@ -111454,10 +114236,10 @@ njJ vjh nTO nTO -ylD +piD cdd tmB -wau +kSv nTO nTO nTO @@ -111700,13 +114482,13 @@ njJ njJ njJ njJ -eST +rCe njJ pnG cWH njJ -prX -kBP +bsd +lOP dLN ghx ghx @@ -111978,7 +114760,7 @@ iDt nTO kJw mQq -xxc +jyL nTO iDt xMq @@ -112216,7 +114998,7 @@ dqx njJ njJ njJ -kfz +oLj dqx njJ njJ @@ -112466,18 +115248,18 @@ vjh vjh vjh fXP -tMu +eQH hDK dqx dqx dqx rXg njJ -eqb +uTo dqx njJ -niL -glz +rKs +hLk dLN ghx ghx @@ -112728,9 +115510,9 @@ gUx gUx wWY mZk -dqx +bJx njJ -ukD +rVX rQx gXy lmK @@ -113235,7 +116017,7 @@ iDt iDt uEA dLN -bRJ +hlE dqx kSU dqx @@ -113247,8 +116029,8 @@ njJ isc dqx njJ -kLH -qZL +bsd +fBs dLN ghx ghx @@ -113497,11 +116279,11 @@ dqx aGr dqx jEs -eUD +dqx hDK kaO njJ -rVX +fWo rQx oSa rQx @@ -113758,7 +116540,7 @@ njJ njJ wRK vjh -ggk +twb pzD vjh vjh @@ -114009,7 +116791,7 @@ dLN rbT lLN vRO -tGP +ggV eYz tGP tGP @@ -151890,286 +154672,27 @@ thA thA thA thA -gjq -gjq -thA -thA -thA -thA -thA -thA -iDt -ebd -iDt -iDt -iDt -iDt -ijY -iDt -iDt -iDt -iDt -iDt -ijY -iDt -iDt -iDt -thA -thA -thA -thA -thA -thA -thA -thA -thA -gjq -gjq -gjq -gjq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -"} -(41,1,2) = {" -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -thA -thA -thA -thA -thA +gjq gjq thA thA +thA +thA +thA +thA iDt -pfw -iDt -iDt -iDt -ijY -iDt +ebd iDt -cCb iDt iDt iDt +ijY iDt -pfw iDt iDt iDt iDt +ijY iDt iDt iDt @@ -152178,14 +154701,16 @@ thA thA thA thA +thA +thA +thA +thA gjq gjq gjq gjq -gjq -gjq -thA -thA +tjo +tjo tjo tjo tjo @@ -152266,7 +154791,7 @@ tjo tjo tjo "} -(42,1,2) = {" +(41,1,2) = {" tjo tjo tjo @@ -152407,34 +154932,34 @@ thA thA thA gjq -gjq -gjq -gjq +thA +thA iDt pfw iDt iDt iDt +ijY iDt iDt -ebd +cCb iDt iDt -ebd iDt iDt -ulj +pfw +iDt iDt iDt iDt -cCb iDt -ijY iDt iDt thA thA -gjq +thA +thA +thA gjq gjq gjq @@ -152443,7 +154968,6 @@ gjq gjq thA thA -thA tjo tjo tjo @@ -152522,9 +155046,9 @@ tjo tjo tjo tjo -"} -(43,1,2) = {" tjo +"} +(42,1,2) = {" tjo tjo tjo @@ -152663,34 +155187,35 @@ thA thA thA thA +thA gjq gjq gjq gjq iDt -iDt -cCb -iDt +pfw iDt iDt iDt iDt -cCb -pfw iDt +ebd iDt iDt +ebd iDt iDt +ulj iDt iDt iDt -ebd -pfw +cCb iDt +ijY iDt iDt -gjq +thA +thA gjq gjq gjq @@ -152780,7 +155305,7 @@ tjo tjo tjo "} -(44,1,2) = {" +(43,1,2) = {" tjo tjo tjo @@ -152920,32 +155445,33 @@ thA thA thA thA -thA +gjq gjq gjq gjq iDt iDt +cCb iDt -ijY iDt -scw iDt -scw -scw -scw iDt iDt -scw -scw +cCb +pfw iDt iDt iDt -scw -scw -scw iDt -gjq +iDt +iDt +iDt +iDt +ebd +pfw +iDt +iDt +iDt gjq gjq gjq @@ -152957,7 +155483,6 @@ gjq thA thA thA -thA tjo tjo tjo @@ -153037,7 +155562,7 @@ tjo tjo tjo "} -(45,1,2) = {" +(44,1,2) = {" tjo tjo tjo @@ -153178,28 +155703,30 @@ thA thA thA thA -thA gjq gjq gjq iDt iDt iDt +ijY iDt scw iDt scw scw +scw +iDt iDt -lwR -tUK -tUK -lwR scw scw +iDt +iDt +iDt scw scw scw +iDt gjq gjq gjq @@ -153207,8 +155734,6 @@ gjq gjq gjq gjq -iDt -iDt gjq gjq thA @@ -153294,7 +155819,7 @@ tjo tjo tjo "} -(46,1,2) = {" +(45,1,2) = {" tjo tjo tjo @@ -153436,38 +155961,38 @@ thA thA thA thA -thA gjq gjq gjq +iDt +iDt +iDt +iDt scw iDt scw scw iDt -scw lwR -lwR -sJH -ngj -orS +tUK +tUK igm -lwR -lwR -lwR +scw +iDt +iDt +scw scw gjq gjq gjq gjq gjq -iDt -ebd -iDt +gjq +gjq iDt iDt -thA -thA +gjq +gjq thA thA thA @@ -153551,7 +156076,7 @@ tjo tjo tjo "} -(47,1,2) = {" +(46,1,2) = {" tjo tjo tjo @@ -153697,32 +156222,32 @@ thA gjq gjq gjq -gjq -gjq +scw iDt scw -pfw +scw iDt -bOz -gpU -oaG -nSs -xuB -dMu -kYA -hYA +scw +lwR lwR +sJH +ngj +orS +igm +scw +iDt +iDt +scw +gjq gjq gjq gjq gjq iDt -iDt -ijY +ebd iDt iDt iDt -cCb thA thA thA @@ -153808,7 +156333,7 @@ tjo tjo tjo "} -(48,1,2) = {" +(47,1,2) = {" tjo tjo tjo @@ -153951,36 +156476,36 @@ thA thA thA thA -thA -thA gjq gjq gjq gjq gjq +iDt scw -scw +pfw +iDt bOz -rja -iQx -vXH -udj -sJH -riL -riL -sJH -lwR -lwR +gpU +oaG +hVq +xuB +igm scw scw scw +gjq +gjq +gjq +gjq iDt iDt -pfw -iDt +ijY iDt iDt iDt +cCb +thA thA thA thA @@ -154065,7 +156590,70 @@ tjo tjo tjo "} -(49,1,2) = {" +(48,1,2) = {" +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo tjo tjo tjo @@ -154138,6 +156726,136 @@ tjo tjo tjo tjo +thA +thA +thA +thA +thA +thA +thA +thA +thA +gjq +gjq +gjq +gjq +gjq +scw +scw +bOz +rja +iQx +vXH +udj +sJH +riL +riL +sJH +sJH +sJH +scw +scw +scw +iDt +iDt +pfw +iDt +iDt +iDt +iDt +thA +thA +thA +thA +thA +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +"} +(49,1,2) = {" +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo tjo tjo tjo @@ -154201,6 +156919,70 @@ tjo tjo tjo tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +iDt +tjo +iDt +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo thA thA thA @@ -154220,7 +157002,7 @@ gjq bOz xar chQ -hiF +veK rex rNc icu @@ -154436,9 +157218,9 @@ tjo tjo tjo tjo -tjo -tjo -tjo +xxV +jAv +iDt tjo tjo tjo @@ -154478,7 +157260,7 @@ lwR sJH irM veK -kDW +tUC fjQ vXC xuB @@ -154693,9 +157475,9 @@ tjo tjo tjo tjo -tjo -tjo -tjo +iDt +pfw +ebd tjo tjo tjo @@ -154743,7 +157525,7 @@ jKA jkn vFq xCD -xCD +sEO bdu scw scw @@ -154949,10 +157731,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo +iDt +iDt +iDt +iDt tjo tjo tjo @@ -155206,11 +157988,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +iDt +gjq +gjq +gjq +iDt tjo tjo tjo @@ -155462,12 +158244,12 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo +iDt +gjq +gjq +gjq +gjq +iDt tjo tjo tjo @@ -155719,20 +158501,20 @@ tjo tjo tjo tjo +iDt +gjq +gjq +gjq +gjq +jAv tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +thA +thA +thA +thA +thA thA thA thA @@ -155976,15 +158758,15 @@ tjo tjo tjo tjo +iDt +xxV +gjq +gjq +gjq +gjq tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +thA thA thA thA @@ -156022,7 +158804,7 @@ gjq lwR sJH chQ -vxd +bTl xuB lwR eJf @@ -156233,21 +159015,21 @@ tjo tjo tjo tjo +iDt +iDt +gjq +gjq +gjq +gjq tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -thA -thA -thA -thA -thA thA thA +iLh +iLh +iLh +iLh +iLh +iLh thA thA thA @@ -156279,8 +159061,8 @@ gjq bOz wcD hsy -bTl -vEg +vxd +drD sJH lwR gjq @@ -156492,19 +159274,19 @@ tjo tjo tjo tjo +gjq +gjq +gjq tjo tjo -tjo -tjo -tjo -tjo -thA -thA -thA -thA -thA thA thA +iLh +mWN +mAM +mwp +fSi +iLh thA thA thA @@ -156534,11 +159316,11 @@ gjq gjq gjq bOz -iyM +sQc chQ vxd xuB -wWL +xEW lwR gjq gjq @@ -156753,15 +159535,15 @@ tjo tjo tjo tjo -tjo -tjo -thA -thA -thA -thA thA thA thA +iLh +eoy +dHk +pJU +wqU +iLh thA thA thA @@ -156791,7 +159573,7 @@ gjq gjq gjq bOz -oVK +aVp icB sGE diV @@ -157010,15 +159792,15 @@ tjo tjo tjo tjo -tjo -thA -thA thA thA -tKI -tKI -tKI -tKI +iLh +iLh +jpC +tbN +jpC +iLh +iLh thA thA szG @@ -157266,16 +160048,16 @@ tjo tjo tjo tjo -tjo -tjo thA thA thA -thA -tKI -ipa -uDP -tKI +iLh +gga +eoy +dHk +eoy +pPY +iLh thA thA szG @@ -157518,21 +160300,21 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo thA thA thA thA -tKI -ibB -qAz -tKI +thA +thA +thA +thA +iLh +xgM +mLm +dxE +ccB +gcu +iLh thA thA gjq @@ -157774,22 +160556,22 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo thA thA thA thA -tKI -lSC -kcE -tKI +thA +thA +thA +thA +thA +iLh +qxm +nRv +dHk +vCy +qVD +iLh szG thA gjq @@ -157821,7 +160603,7 @@ gjq eJf gjq gOU -yep +jvD gOU gjq eJf @@ -158030,23 +160812,23 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -thA thA thA thA -tKI -jft -pQs -tKI +iLh +iLh +iLh +iLh +iLh +iLh +iLh +iLh +gif +huS +jXe +fmg +tAO +iLh szG szG myZ @@ -158286,24 +161068,24 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo thA thA thA thA -tKI -lFr -cwK -tKI +iLh +pwg +peG +ucs +crT +xaO +jGo +iLh +hVu +eoy +dHk +qGJ +nWn +iLh szG szG nzG @@ -158538,29 +161320,29 @@ thA thA thA thA -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo thA thA thA thA -tKI -gyc -afz -tKI +thA +thA +thA +thA +thA +iLh +jqj +aiA +wVq +dcW +kjt +mUz +kUU +hSt +tKq +sGM +haD +lrz +iLh szG szG eId @@ -158592,7 +161374,7 @@ gjq keu eJf cMk -eKB +yep cMk eJf keu @@ -158796,28 +161578,28 @@ thA thA thA thA -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo thA thA thA thA -tKI -mGl -tKI -tKI +thA +thA +thA +thA +iLh +gAd +ukd +iLh +aBX +aBX +iLh +iLh +bPs +bPs +iLh +bjv +iLh +iLh iwS iwS sbf @@ -159054,28 +161836,28 @@ thA thA thA thA -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo thA thA thA thA -iwS -pfj -ehc -rfz -hXL +thA +thA +thA +iLh +dcW +niY +ini +dwo +eKN +oQt +ydH +wUu +xrs +iLh +vad +kMP +wMw +hoZ iwS iDt iDt @@ -159088,11 +161870,11 @@ gjq gjq gjq gjq -hxT +mUf aFG hZe xuo -jnn +fLK odW wqN gjq @@ -159312,27 +162094,27 @@ thA thA thA thA -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -thA thA thA thA thA -iwS -udd -gwz -tDG -gri +ivF +ivF +iLh +hYb +iLh +iLh +fGJ +nAg +fkt +oQt +xrs +ilD +iLh +pog +qPs +xCr +wds iwS iDt iDt @@ -159363,7 +162145,7 @@ nzG eJf gjq gOU -yep +jvD gOU gjq eJf @@ -159570,26 +162352,26 @@ thA thA thA thA -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -thA -thA -thA -thA -iwS -iwS -jLD -xjY -tDG -iUY +iDt +kcW +ivF +ivF +xUF +uah +icU +jgx +iLh +bPs +bPs +iLh +iLh +iLh +iLh +iLh +xkH +oeB +qxI +sTh qMo iDt cCb @@ -159826,27 +162608,27 @@ thA thA thA thA -thA -thA -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -thA -thA -thA -thA +iDt +iDt +iDt +snd +kkA +erw +wrl +aOa +uhb +aSC +cQi +boS +ivF +sqb +gVm iwS iJM -iEh -tDG -nMH -lXj +dNl +qxI +qxI +rVC qMo iDt iDt @@ -159860,9 +162642,9 @@ gjq gjq gjq sjb -umD +sjx xgO -grz +rHk wQr vEU vSi @@ -160083,27 +162865,27 @@ gjq thA thA thA -thA -thA -thA -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -thA -thA -thA -thA +iDt +iDt +scw +snd +ndl +lFA +ivF +ivF +dER +fFD +bYz +trc +ivF +pcc +fdX iwS iJM -iEh -tDG -ipZ -xwG +dNl +qxI +qxI +coT qMo iDt iDt @@ -160120,8 +162902,8 @@ sjb qEu jIX sgV -sce -ibc +vpl +tQE vSi qLm qLm @@ -160340,27 +163122,27 @@ gjq gjq thA thA -thA -thA -thA -thA -thA -thA -tjo -tjo -tjo -tjo -tjo -thA -thA -thA -thA +iDt +iDt +scw +snd +hJp +hby +czz +xYr +jwB +bIo +nit +uMD +ivF iwS iwS -pQI -bIq -gwz -dKl +iwS +iwS +oqj +kTX +iJL +dwI qMo iDt iDt @@ -160597,32 +163379,32 @@ gjq gjq gjq gjq -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA +iDt +iDt +iDt +snd +cmT +fxd +bEd +mua +nfn +tHX +nit +ebC +ivF +ktp +lIU +xrL iwS -oyl -tDG -tDG -nWB +sFd +iuH +iuH +mFY iwS -tKI -wkj -tKI -iDt +iwS +gJK +iwS +wkB iDt jZN gjq @@ -160854,31 +163636,31 @@ gjq gjq gjq gjq -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -iwS -kAO -nMH -efR -tDG -jGr -pdf -pdf -aFr +gjq +nfG +qbU +ivF +jwH +jwH +jwH +jHV +aLz +jul +oRE +uMD +ivF +wYz +jIr +lZe +xXd +ltW +nlO +wEM +nlO +vzn +knd +grk +qMo iDt iDt iDt @@ -160888,10 +163670,10 @@ gjq gjq gjq sjb -dTu +puX uig hPK -uza +ukv pve hEm ksn @@ -160900,14 +163682,14 @@ vaM tQW uQx uQl -xpQ +dSj uQl ajr uQx vQy ngl fFI -ryF +mfe cMk gjq gjq @@ -161101,7 +163883,7 @@ thA thA thA thA -thA +jKY gjq gjq thA @@ -161112,30 +163894,30 @@ gjq gjq gjq gjq -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -iwS -iwS -iwS -iwS -iwS +gjq +scw +hyj +slX +rLw +ceY +kbq +sLR +awR +sLR +dsR +ivF +bUW +kgY +bar +nlO +nlO +gwz +nMH +ciH iwS -kZQ -vHE -aFr +fpC +szX +qMo iDt scw scw @@ -161156,7 +163938,7 @@ pZD qPm aOf qFn -pql +sNt tDa tDa tDa @@ -161370,29 +164152,29 @@ gjq gjq gjq gjq -gjq -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -tKI -aqy -tKI +qsq +ivF +ivF +ivF +ivF +ivF +jnR +jnR +jnR +ivF +ivF +nRx +pEg +uyW +iwS +kDm +ePn +oDV +iqn +iwS +iwS +aBT +iwS iDt iDt iDt @@ -161418,7 +164200,7 @@ pAT xlQ lCA kZu -aNg +afl pbv xOM izq @@ -161629,27 +164411,27 @@ gjq gjq gjq gjq -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -thA -tKI -pdf -aFr +iDt +iDt +iDt +mdV +scw +scw +iDt +xdY +iwS +iwS +iwS +iwS +iwS +iwS +iwS +iwS +iwS +iwS +iwS +dYq +qMo iDt scw gjq @@ -161677,7 +164459,7 @@ nWH nWH iUd gbH -nLd +ear dTF nWH qeP @@ -161888,6 +164670,12 @@ gjq gjq gjq gjq +scw +iDt +iDt +iDt +iDt +iDt thA thA thA @@ -161898,15 +164686,9 @@ thA thA thA thA -thA -thA -thA -thA -thA -thA -tKI -czV -tKI +iwS +rBM +iwS iDt scw gjq @@ -162702,7 +165484,7 @@ nWH nWH nWH tCO -udE +jRd sbU nWH nWH @@ -162874,9 +165656,9 @@ ucD eaw jsp wSz -pVG +nFU jNf -xnk +cWq tau cPE cPE @@ -162944,8 +165726,8 @@ gjq gjq gjq jpS -bzN -iCN +jpe +oXo piV fPB qUa @@ -162956,17 +165738,17 @@ cQw gLF wpx unT -vGX +iAp til naq mzu gLF unT -uKB +dZq cvB tzE -gEQ -cKl +gMw +ggv rsY urG iDt @@ -163390,7 +166172,7 @@ fAV tGs obv jNf -dID +tYE tau cPE cPE @@ -163471,7 +166253,7 @@ kDI mDq lzq hCn -lOx +ium kDI nHj kDI @@ -163717,13 +166499,13 @@ gjq jpS kuC kII -nOK +nmu clz mml kNW lxT bgt -iUg +oOQ vSi vSi pCM @@ -163922,7 +166704,7 @@ wUj gjq ucN ucN -jHN +cdg ovQ ucN ucN @@ -163978,7 +166760,7 @@ kNW aOE kqV kNW -vCe +kIU stZ kTD cYL @@ -164161,7 +166943,7 @@ nvE uKJ tCL jNf -kRm +fDP ijC cXy cXy @@ -164668,7 +167450,7 @@ iDt iDt oqL unm -lrw +cvG ldz fvK cIc @@ -164685,9 +167467,9 @@ iDt iDt iDt wUj -jKC -kJQ -eLs +lpS +qdY +cNq qSj wUj gjq @@ -164695,7 +167477,7 @@ ucN scV jIv jCD -mgb +pER ucN iDt ijY @@ -164753,7 +167535,7 @@ mqs dTs oeP uUT -iJv +kmO rtR lLY nUi @@ -164768,7 +167550,7 @@ iDt iDt iDt iDt -cjT +jSQ cmZ xuo iDt @@ -164942,14 +167724,14 @@ iDt iDt iDt wUj -mJE -xSA +gOi +vuk iMD -hdW +rDj wUj gjq ucN -ryl +hFW nfj hzJ gpt @@ -165010,7 +167792,7 @@ rsY czq rsY uUT -efa +lwT pXE lqA nUi @@ -165186,9 +167968,9 @@ vdW sTP jhH cIc -lBT +sDQ oVY -eCs +bXI vVH vVH vVH @@ -165437,17 +168219,17 @@ iDt iDt oqL eaq -hXk +dck tei fTF fTF fTF cIc -lNn +uTp oVY pez ccX -fcR +qLg vVH vVH vVH @@ -165469,7 +168251,7 @@ uRk dDt dDt wYh -dDt +dvw dDt dDt psm @@ -165711,7 +168493,7 @@ nKL ukN nCs bZk -dBJ +gRZ kmg vOw eGW @@ -165725,14 +168507,14 @@ ykM ykM ykM waL -oWP +jUZ fzD waL waL waL -qsk +waL cxP -nEZ +wsD wMt iDt thA @@ -165950,10 +168732,10 @@ iDt iDt iDt hPs -exx +qdH dck scl -ohG +tww scl ilZ sws @@ -165963,7 +168745,7 @@ oCU vVH vVH vVH -dmu +lDE nKL hpF pXZ @@ -166220,7 +169002,7 @@ bLc diN diN lgK -uPq +jqn lWb eDq tDY @@ -166229,10 +169011,10 @@ izY eND qpB qpB -jGq +jLB qpB qpB -pMj +siv qpB qpB iwC @@ -166465,7 +169247,7 @@ iDt iDt oqL kEj -hke +odC jwN iHV iHV @@ -166497,7 +169279,7 @@ gjq gjq gjq gKQ -jbt +awM cBT dyf iOs @@ -166728,7 +169510,7 @@ pzu sRQ una cIc -mlX +kAW oVY nyP tVf @@ -166739,7 +169521,7 @@ nKL hpF uHv nup -sww +vYc dAZ nek qKS @@ -166757,7 +169539,7 @@ cwr bqF bqF dyf -bqF +iNy gKQ eGW qQN @@ -166985,14 +169767,14 @@ gBc erY clR cIc -xtz +uTp oVY pez tVf izn lgK -laN -xMy +pfn +lWb eDq iXh lWb @@ -167268,7 +170050,7 @@ gjq gjq gjq ncR -jvm +kVF aiX oPl oYi @@ -167503,7 +170285,7 @@ dHw qhS jaW yiL -ngC +kiY oqb uBs uBs @@ -167529,7 +170311,7 @@ aiX aiX lQq aiX -bPe +vrc gKQ thA thA @@ -167760,13 +170542,13 @@ oZR oVY pez yiL -iSd +egj cxO xuA tuc pPK yiL -dOF +aVF rQZ bSk uQC @@ -167775,8 +170557,8 @@ bcm uQC nSk wQR -wpg -tYm +fJG +vao lyg gjq gjq @@ -168017,7 +170799,7 @@ nUL oVY pez yiL -avW +swr cxO xuA tuc @@ -168270,15 +171052,15 @@ xhK vVH vVH vVH -mlX +kqn oVY pez yiL -apL +vDx cxO xuA -dpX -uDt +dkB +bYg yiL qLD bbY @@ -168527,20 +171309,20 @@ xhK taV qfs vVH -sFu +fKW oVY vHU yiL -piU +oAY cxO pgL lab -gIk +cbz yiL -aym -iti +rdR +rnb hgM -svw +uaI hBg hgM tvK @@ -168784,20 +171566,20 @@ xhK nCQ swf vVH -xtz +kqn oVY pez yiL agF tgP rGh -pHi +vHM wyF yiL szz -rnb +nrq hgM -fvO +uaI nrF hgM cEP @@ -169041,7 +171823,7 @@ xhK oAP oua vVH -kqn +uTp oVY tjC yiL @@ -169054,8 +171836,8 @@ yiL xHE xHE hgM -svw -eHK +fvO +mBa hgM mKq xEd @@ -169312,7 +172094,7 @@ uME uME uME bYB -mBa +hBg hgM xhK xhK @@ -169562,11 +172344,11 @@ tVf wJi rME bol -rkT +mMy uME uME doq -qqq +trA uME xge hBg @@ -169811,16 +172593,16 @@ gjq upw uzM iRV -eia +cvq xgL oVY bWh -gIx +pac hUz hUz bjp bjp -bBn +poe ryu kZt ryu @@ -170079,12 +172861,12 @@ ate ate fgJ cpw -ihB +jyl ihB ddp hBg nzj -dhT +dFr pOk par rsM @@ -170132,8 +172914,8 @@ iDt vcj vcj vcj -vOY -kAP +bfa +koA uFw vcj aVq @@ -170334,12 +173116,12 @@ syB syB syB syB -fTz +sNr pdz eic -kBh +mLT dha -rRA +oBo vpi uME xhK @@ -171110,7 +173892,7 @@ vVH dbL ulz pNm -bdF +eUB bQS pNm ovP @@ -171629,7 +174411,7 @@ fdG uCU gjq gjq -vqM +gjq gjq gjq gjq @@ -171867,12 +174649,12 @@ gjq mMM wRa wRa -ilH +wRa wRa wRa wSZ wRa -ilH +wRa wRa wRa vVH @@ -172143,7 +174925,7 @@ paL xrf gjq lzx -vKA +gjq gjq gjq gjq @@ -173972,12 +176754,12 @@ rcY scw xMq hmb -gbF +hlP eYX sCZ sCZ lmm -sRc +boV hmb gjq gjq @@ -174007,7 +176789,7 @@ qck owG owG qoM -xXm +qvM nxM xMq xMq @@ -174231,7 +177013,7 @@ exw exw ksO syE -jwm +eIY pqx hml vkg @@ -174260,7 +177042,7 @@ iDt iDt rxW nxM -eix +oji bvS bbv qck @@ -174498,7 +177280,7 @@ hmb iDt qau iDt -jZN +iDt neM qau xMq @@ -174517,14 +177299,14 @@ iDt iDt iDt nxM -ion +gWf vAq ngZ pnf rQG pNZ rQG -xHk +rQG kgl rQG jJV @@ -174741,7 +177523,7 @@ iDt xMq xMq exw -gAN +oGn qXz gAy rhR @@ -174750,7 +177532,7 @@ lEH lgA gAy bqH -xVD +dIc exw hmb exw @@ -175003,7 +177785,7 @@ sCZ sCZ lmm jOc -bTI +wOh fKy kWR sCZ @@ -175029,9 +177811,9 @@ cjJ cjJ cjJ cjJ -wsT +cih gKn -hTa +sSR txj nyX jjx @@ -175041,7 +177823,7 @@ lAA lAA lAA nxM -tPM +aRn mep iDt iDt @@ -175260,11 +178042,11 @@ fKd gyw sIh exw -qAr +stw gXe ieq mow -niK +oMG exw hmb exw @@ -175279,7 +178061,7 @@ iDt iDt iDt eXH -hUo +gGK bjU aJr vHZ @@ -175292,7 +178074,7 @@ pHD pHD uXV pHD -biN +qVk hjM oex oex @@ -175771,7 +178553,7 @@ oYc lvc exw ivr -jlq +gcm cSc hmb eoq @@ -175806,7 +178588,7 @@ nRc nRc bCt pHD -mOw +djB hjM oex oex @@ -176050,7 +178832,7 @@ iDt iDt iDt eXH -oMN +hmX kjx yco ldR @@ -176320,7 +179102,7 @@ pHD pHD pHD pHD -jKG +qMz hjM lAA lAA @@ -176790,15 +179572,15 @@ mdZ wUY iZp mdZ -oGR -pIQ +qmN +pbD let sBy jjG vlP -bJy +vuN qMT -dQF +edD ocf rZT jCF @@ -177054,12 +179836,12 @@ sBy jWO xUm mRa -bAD +efh ydZ jBU mqr mqr -fWU +reA dMS rZN cjK @@ -177078,7 +179860,7 @@ jvw jvw bja eXH -sXz +cAT oDQ xvn msp @@ -177091,13 +179873,13 @@ bCq bCq fPh pHD -qMz +jKG hjM xDU aBx -sBJ +rmh vLY -qck +ohM bHF eos jol @@ -177305,10 +180087,10 @@ nIL uWv let let -qkG +let let sBy -ygu +pjg ycz hJm kwu @@ -177320,7 +180102,7 @@ bIH dMS dre dMS -vUj +hHU nCJ dMS xMq @@ -177348,7 +180130,7 @@ imV fuS plS pHD -jKG +qMz hjM gHP uBP @@ -177570,7 +180352,7 @@ tEf kHk fqK cjj -nAI +vdI eDP oko dMS @@ -177600,10 +180382,10 @@ hjM hCC iXP pHD -tvT +woC eXH eXH -ijN +ida pHD qMz hjM @@ -177815,19 +180597,19 @@ thA thA xMq mdZ -fjm +jXD mCX pwB mdZ -epX -hRV +kfX +xSj oXk tiF cSu ebq phU fjC -pvT +nrt shD jfN dMS @@ -178084,7 +180866,7 @@ wJe rLV iXF doJ -nAI +vdI uRz aak dMS @@ -178103,7 +180885,7 @@ btU sGf lca kme -slf +dYr nxM nxM nxM @@ -178329,7 +181111,7 @@ thA thA xMq mdZ -jXD +fjm mCX pmg etV @@ -178341,7 +181123,7 @@ oXS gUB xqv doJ -dlT +wZq qMT qMT dMS @@ -178384,7 +181166,7 @@ lAA nxM vOI nxM -vzY +qqv xzO hjM hjM @@ -178598,8 +181380,8 @@ dkO qis wIF qis -uNG -xoZ +uLU +uac cBL dMS dMS @@ -178616,8 +181398,8 @@ btU oYm kht wqi -qhy -dYX +tBY +efz sAI hjM hjM @@ -178854,12 +181636,12 @@ qis qis qis doJ -vps -iPY +nJC +cgz doJ -lrL +vZY dMS -kDx +dyw sEp sEp sEp @@ -178878,7 +181660,7 @@ btU ako xDb jms -cFT +dHl xDb hjM hjM @@ -178899,7 +181681,7 @@ nxM jdP jdP jdP -cFJ +cBw oiT xUe hjM @@ -179105,8 +181887,8 @@ agt wJf mdZ rKd -nuo -dVN +rJL +nVX uEE nvt yjP @@ -179114,7 +181896,7 @@ hzQ hzQ nro hzQ -rVb +tyj dMS dEB dMS @@ -179127,10 +181909,10 @@ fwB fwB btU nTA -lMa +kJm nyQ meL -evv +efo hJC ako hWV @@ -179361,8 +182143,8 @@ shh cvz ihG mdZ -vNk -vps +gRl +nJC mui doJ yjP @@ -179395,11 +182177,11 @@ xQT xQT qmU xDb -qZs +jEf qnt pGS dIZ -pyf +aRr xDb xMq iDt @@ -179413,12 +182195,12 @@ nxM wEU jtD rBv -owG -yjK +qHl +hRX oiT -mco +smw hjM -gzd +gZT nVc uVj sZa @@ -179426,7 +182208,7 @@ wUR jVE vbd eoP -eTL +xxC kHr kHr kHr @@ -179618,7 +182400,7 @@ esn agt auN mdZ -xvc +nWw mUU csg doJ @@ -179640,15 +182422,15 @@ fwB fwB fwB btU -eEN +mtt tHe aCl tHe tHe -tHe +xRF ako hSF -dsA +hSF jUB tMk xDb @@ -179667,15 +182449,15 @@ xMq xMq xMq nxM -rmh -ieF -qHl +bvS +vKo +owG rwG cmQ skJ owG hjM -fBA +soM ljL mYJ oIN @@ -179876,9 +182658,9 @@ agt mYr mdZ hLw -vps -uZP -vps +nJC +jBb +nJC wZK wNQ lPm @@ -179897,7 +182679,7 @@ fwB fwB btU btU -eex +iWN ofm nHc nHc @@ -179907,7 +182689,7 @@ ako xDb xDb xDb -ygs +rHr mrU rQw xEb @@ -180134,14 +182916,14 @@ ryO mdZ sxW doJ -hzk +wkq doJ -nPU +lSl aTm fYh oXe miR -gGJ +nmS vUi dMS twX @@ -180154,7 +182936,7 @@ fwB fwB fwB btU -jgV +waH qnv iyF xyG @@ -180399,7 +183181,7 @@ bjZ tAe mgR qYo -hxg +xFv dMS eHW dMS @@ -180418,17 +183200,17 @@ xMv wav pWi uHV -orP +cqv gZb xwu cAr -wIO +gls drR jyz +lzX oQY oQY -oQY -cTt +hoM xDb xMq iDt @@ -180648,14 +183430,14 @@ let let kWs uFW -nNQ +lDp nNQ pNp xTX ikT qCz gQj -mKd +xoq dMS dMS kbU @@ -180675,7 +183457,7 @@ goc hai csV ako -fDH +goJ jeI pGS cDb @@ -180910,9 +183692,9 @@ iHy rVO xGZ ukw -scH +umS vVh -qEC +mXt jre tjs vbz @@ -181162,13 +183944,13 @@ tGZ gVn rxY dmD -wng +mnE xEx jjW jre tRA jre -dLk +hYs jre jre nNe @@ -181192,12 +183974,12 @@ xDb xDb xDb xDb -jLK -iAK +jCA +nLe nQd oeT hzz -lGj +gmf jUB gyY tCM @@ -181416,7 +184198,7 @@ mdZ mdZ kgs tGZ -gVn +kdD jre jre jre @@ -181427,7 +184209,7 @@ xjj jre jre jre -lcG +lAB lqs jre xhz @@ -181440,7 +184222,7 @@ fwB btU cJa fDp -oNj +oiv vAO jUB oXs @@ -181456,7 +184238,7 @@ pwn pwn pwn jUB -jse +cuJ rpU xDb thA @@ -181964,8 +184746,8 @@ vXD xDb qSN atl -oQY -jfz +lzX +dRz jUB cAM nNB @@ -181990,7 +184772,7 @@ wJD eJf eJf kpC -wlZ +awL jes qdx sIA @@ -182258,9 +185040,9 @@ nsp fWO tRd tRd -jOp -oxO -oxO +mtm +tRd +tRd alM alM oxO @@ -182509,7 +185291,7 @@ sIA sIA sIA lVw -eAs +jPu ffe oxO alM @@ -182517,7 +185299,7 @@ tRd alM alM iry -oxO +tRd lms alM oxO @@ -182735,7 +185517,7 @@ bwe cxQ vJB wgI -ueE +qaI wDk jUB vjJ @@ -182774,7 +185556,7 @@ tRd alM alM fuD -oxO +dAq eEY oxO fWO @@ -182989,7 +185771,7 @@ pPD tIu toG jUB -xmB +kax anK nrC xDb @@ -183528,9 +186310,9 @@ oxO oxO oxO oxO -oxO -oxO -oxO +gyC +tRd +tRd nPI wjy nPI @@ -183745,7 +186527,7 @@ thA thA thA xMq -hpx +scw iDt iDt iDt @@ -184296,19 +187078,19 @@ lZX dPy qLY hOU -wva +abe abe cKA abe abe cKA -rsC +mga abe cKA abe abe cKA -wyU +mLO abe rnQ nPI @@ -184518,7 +187300,7 @@ thA thA xMq xuo -xuo +xiu xuo xMq thA @@ -184548,7 +187330,7 @@ uUn xNa eOS qLY -vIk +vfe tsa wHb qLY @@ -185030,7 +187812,7 @@ iDt iDt scw iDt -hpx +scw iDt iDt iDt @@ -185579,22 +188361,22 @@ sfv xyn dmj wPd -fwC +lVt asb pMF xCh -kaW +cbP pMF ihN doK -pMF +mBP rjT rXD pMF -tiQ -lNo +pfJ +jrc pMF -clW +mbb rkl nPI oxO @@ -185782,12 +188564,12 @@ xMq tBs pwv sAu -nEX +nsz tBs nHQ oik -wMj -vGJ +oFl +auX uDl feQ tBs @@ -186042,8 +188824,8 @@ glk qDF tBs iXC -nOw -iig +moB +ozV baR kAn kMN @@ -186083,13 +188865,13 @@ iDt alM oxO ffe -hSp +mjO llw wPd nWK qWS wPd -ygE +fiq qLY prH bjn @@ -186340,7 +189122,7 @@ iDt alM oxO ffe -wCn +oqd vHq aZk pMF @@ -186552,7 +189334,7 @@ thA thA tBs bxJ -bNx +wkO tBs eTa lns @@ -186815,7 +189597,7 @@ moB wta tBs nXH -acM +fHS kTk gSV qEJ @@ -186866,19 +189648,19 @@ abe abe gLj aey -hWu +abe gLj abe abe gLj abe -hWu +abe wUz abe abe gLj abe -hWu +abe wnB pjr tRd @@ -187076,13 +189858,13 @@ uII kTk hhz qEJ -ntN +eAk dzy bWZ -foS +vYg bWZ oTA -biX +eNC wrX wrX wrX @@ -187342,7 +190124,7 @@ epB oTA wrX wrX -jGE +seN nBe tiV mjQ @@ -187587,9 +190369,9 @@ quB jmR vrC hbR -oxa +gNJ qEJ -wBS +eog lUa dtC bAF @@ -187625,7 +190407,7 @@ alM alM alM oxO -oxO +cNG tNJ tNJ nyJ @@ -187834,9 +190616,9 @@ thA thA thA tBs -dXb +liS pxg -czt +fdN tBs deP oBg @@ -187887,11 +190669,11 @@ oLa pvh oxO oxO +aqK oxO +foo oxO -iKG -oxO -oxO +imu oxO oxO oxO @@ -188091,15 +190873,15 @@ thA thA xMq tBs -xgH +suA roq -miq +rHZ tBs dit bDH rYt rrf -ejq +wAv jvs qEJ qEJ @@ -188115,7 +190897,7 @@ uJt uJt rcD smC -oHG +oTM wrX wrX xMq @@ -188349,7 +191131,7 @@ thA xMq tBs iUm -tKm +fjz wMj tBs vcO @@ -188404,7 +191186,7 @@ ffe ffe ffe meH -uWn +ffe ffe ffe ffe @@ -188618,18 +191400,18 @@ sdk aIe wBA uJq -smC +vNs aLy hMr aUO aUO -sQv +tyi aUO aUO aUO aUO oHV -gQd +que wrX xMq xMq @@ -188658,7 +191440,7 @@ iDt iDt kAH mHu -juE +kwM sdl qRO fgx @@ -188864,7 +191646,7 @@ xMq tBs ccV wMj -fsO +lpL tBs tWc tBs @@ -189119,8 +191901,8 @@ xMq xMq xMq tBs -nTv -mBE +pWf +ydA iUm bEN pmn @@ -189143,7 +191925,7 @@ uJt uJt rcD oTA -mHX +wQC wrX xMq xMq @@ -189171,7 +191953,7 @@ uIf uIf uIf uIf -jxJ +laa qKt tUo aQn @@ -189378,10 +192160,10 @@ xMq tBs tUx nou -nou +iWq tBs wMj -hPc +lpL wMj tBs lry @@ -189400,7 +192182,7 @@ uJt uJt oTA oTA -weK +tIw wrX xMq xMq @@ -189645,7 +192427,7 @@ etH etH eyU wrX -vjP +uJI xBt iih sab @@ -189895,8 +192677,8 @@ xuo xuo xuo tBs -jOe -qTJ +vbC +aOz tBs cPq etH @@ -189912,7 +192694,7 @@ syh oTA wrX wrX -vaO +hfm orU wrX xMq @@ -189937,7 +192719,7 @@ thA rcY iDt uIf -tKn +rmp pOL pOL pOL @@ -190160,12 +192942,12 @@ wrX wrX wrX wrX -omN +qrT dtC -pOC oTA -uXr -xBO +xeJ +oTA +kub aZL wrX wrX @@ -190418,13 +193200,13 @@ lvt wrX wrX wrX +wrX daj wrX crg wrX wrX wrX -wrX xMq xMq xMq @@ -190463,7 +193245,7 @@ fcj rRl ndb bnZ -hDf +ulE uIf thA thA @@ -190674,10 +193456,11 @@ lvt lvt lvt xMq +xMq wrX -wQx +vle bWp -jja +nJZ wrX xMq xMq @@ -190685,7 +193468,6 @@ xMq xMq xMq xMq -xMq thA thA thA @@ -190711,13 +193493,13 @@ egf egf egf egf -tdY -tdY -vvy +fSG +fSG +bId gcy jJG jJG -sWx +plX qZN akk qZN @@ -190931,6 +193713,7 @@ lvt lvt lvt xMq +xMq wrX wrX wrX @@ -190939,7 +193722,6 @@ wrX xMq xMq xMq -xMq thA thA thA @@ -190968,10 +193750,10 @@ inb keV gWZ wHd -mLK +izc wHd vcH -gxn +gnq xEF qSk oFd @@ -191225,10 +194007,10 @@ inb sDA mYd mIC -aWs +dJk wPC qSk -qSk +sbd rEh qSk jwj @@ -191482,11 +194264,11 @@ inb keV nBV iao -iPD +hKj iao odf -qSk -xtS +sbd +jaY rhY uSq pjc @@ -191739,10 +194521,10 @@ bgx bgx bgx bgx -txk +qWI bgx bgx -tmb +pAc bgx uIf uIf @@ -191994,12 +194776,12 @@ vzD vzD vzD jdd -xEt -jCl -jCl -jCl -qXY -coH +sHV +rTs +rEU +oHo +gOq +bBb vzD thA thA @@ -192510,7 +195292,7 @@ jCl bFq axu dVq -jCl +xEt jCl jCl iVY @@ -207283,10 +210065,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -207540,10 +210322,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -207798,9 +210580,9 @@ wNO wNO wNO wNO -wNO -wNO -wNO +hHG +hHG +hHG wNO wNO wNO @@ -208055,9 +210837,9 @@ wNO wNO wNO wNO -wNO -wNO -wNO +hHG +hHG +hHG wNO wNO wNO @@ -208312,9 +211094,9 @@ wNO wNO wNO wNO -wNO -wNO -wNO +hHG +hHG +hHG wNO wNO wNO @@ -208569,9 +211351,9 @@ wNO wNO wNO wNO -wNO -wNO -wNO +hHG +hHG +hHG wNO wNO wNO @@ -208826,9 +211608,9 @@ wNO wNO wNO wNO -wNO -wNO -wNO +hHG +hHG +hHG wNO wNO wNO @@ -209083,9 +211865,9 @@ wNO wNO wNO wNO -wNO -wNO -wNO +hHG +hHG +hHG wNO wNO wNO @@ -209340,9 +212122,9 @@ wNO wNO wNO wNO -wNO -wNO -wNO +hHG +hHG +hHG wNO wNO wNO @@ -209597,9 +212379,9 @@ wNO wNO wNO wNO -wNO -wNO -wNO +hHG +hHG +hHG wNO wNO wNO @@ -209853,10 +212635,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -210110,10 +212892,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -210367,10 +213149,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -210624,10 +213406,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -210881,10 +213663,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -211138,10 +213920,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -211395,10 +214177,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -211652,10 +214434,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -211909,10 +214691,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -212166,10 +214948,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -212423,10 +215205,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -212680,6 +215462,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -212914,163 +215700,8 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -"} -(23,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +"} +(23,1,3) = {" wNO wNO wNO @@ -213088,6 +215719,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -213175,8 +215810,6 @@ wNO wNO wNO wNO -"} -(24,1,3) = {" wNO wNO wNO @@ -213324,6 +215957,8 @@ wNO wNO wNO wNO +"} +(24,1,3) = {" wNO wNO wNO @@ -213340,6 +215975,11 @@ wNO wNO wNO wNO +uer +otC +hHG +hHG +hHG wNO wNO wNO @@ -213432,8 +216072,6 @@ wNO wNO wNO wNO -"} -(25,1,3) = {" wNO wNO wNO @@ -213576,6 +216214,8 @@ wNO wNO wNO wNO +"} +(25,1,3) = {" wNO wNO wNO @@ -213592,6 +216232,11 @@ wNO wNO wNO wNO +aaX +otC +hHG +hHG +hHG wNO wNO wNO @@ -213689,8 +216334,6 @@ wNO wNO wNO wNO -"} -(26,1,3) = {" wNO wNO wNO @@ -213828,6 +216471,8 @@ wNO wNO wNO wNO +"} +(26,1,3) = {" wNO wNO wNO @@ -213844,6 +216489,11 @@ wNO wNO wNO wNO +fhB +otC +hHG +hHG +hHG wNO wNO wNO @@ -213927,6 +216577,11 @@ wNO wNO wNO wNO +bln +bln +lSu +bln +bln wNO wNO wNO @@ -213938,6 +216593,13 @@ wNO wNO wNO wNO +bln +bln +lSu +lSu +bln +bln +bln wNO wNO wNO @@ -213946,8 +216608,6 @@ wNO wNO wNO wNO -"} -(27,1,3) = {" wNO wNO wNO @@ -214068,6 +216728,8 @@ wNO wNO wNO wNO +"} +(27,1,3) = {" wNO wNO wNO @@ -214083,6 +216745,12 @@ wNO wNO wNO wNO +bln +bln +bln +xDQ +xDQ +bln wNO wNO wNO @@ -214165,6 +216833,13 @@ wNO wNO wNO wNO +bln +gnZ +bln +hcw +lSu +gnZ +bln wNO wNO wNO @@ -214174,6 +216849,15 @@ wNO wNO wNO wNO +bln +gnZ +lSu +weW +bln +gnZ +bln +bln +bln wNO wNO wNO @@ -214203,8 +216887,6 @@ wNO wNO wNO wNO -"} -(28,1,3) = {" wNO wNO wNO @@ -214303,6 +216985,8 @@ wNO wNO wNO wNO +"} +(28,1,3) = {" wNO wNO wNO @@ -214318,6 +217002,12 @@ wNO wNO wNO wNO +bln +bln +bln +rPp +rPp +bln wNO wNO wNO @@ -214399,6 +217089,33 @@ wNO wNO wNO wNO +bln +bln +bln +sEB +sEB +sEB +lSu +bln +bln +lSu +bln +bln +bln +bln +bln +lSu +bln +lSu +lSu +sEB +sEB +sEB +lSu +bln +bln +bln +bln wNO wNO wNO @@ -214460,8 +217177,6 @@ wNO wNO wNO wNO -"} -(29,1,3) = {" wNO wNO wNO @@ -214527,6 +217242,8 @@ wNO wNO wNO wNO +"} +(29,1,3) = {" wNO wNO wNO @@ -214544,6 +217261,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -214565,7 +217286,6 @@ wNO wNO wNO wNO -rSY wNO wNO wNO @@ -214579,7 +217299,6 @@ wNO wNO wNO wNO -fPx wNO wNO wNO @@ -214626,6 +217345,35 @@ wNO wNO wNO wNO +bln +bln +lSu +eqn +sEB +sEB +sEB +sjU +bln +lSu +bln +bln +jNZ +kKU +rzO +lSu +bln +lSu +bln +eqn +sEB +sEB +sEB +sjU +bln +mQb +bln +bln +bln wNO wNO wNO @@ -214717,8 +217465,6 @@ wNO wNO wNO wNO -"} -(30,1,3) = {" wNO wNO wNO @@ -214753,6 +217499,8 @@ wNO wNO wNO wNO +"} +(30,1,3) = {" wNO wNO wNO @@ -214770,6 +217518,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -214819,7 +217571,6 @@ wNO wNO wNO wNO -sEB wNO wNO wNO @@ -214850,6 +217601,37 @@ wNO wNO wNO wNO +bln +bln +bln +bln +fUR +sEB +sEB +sEB +fUR +bln +bln +bln +jNZ +sEB +sEB +sEB +rzO +bln +bln +bln +fUR +sEB +sEB +sEB +fUR +bln +bln +bln +bln +bln +bln wNO wNO wNO @@ -214993,6 +217775,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -215071,43 +217857,39 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO +bln +bln +bln +mQb +bln +fUR sEB -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +tqR +sEB +fUR +lSu +gnZ +jNZ +sEB +sEB +sEB +sEB +sEB +rzO +gnZ +lSu +fUR +sEB +tqR +sEB +fUR +lSu +ntK +bln +uer +bln +bln +bln wNO wNO wNO @@ -215250,6 +218032,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -215327,45 +218113,41 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -sEB -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +bln +bln +mQb +bln +ntK +bln +fUR +fUR +mnu +fUR +fUR +lSu +bln +miY +sEB +sEB +sEB +sEB +sEB +qVo +bln +bln +fUR +fUR +mnu +fUR +fUR +bln +bln +lBD +bln +fsm +stJ +bln +bln wNO wNO wNO @@ -215507,6 +218289,13 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG +wNO +wNO +wNO wNO wNO wNO @@ -215583,48 +218372,41 @@ bln bln bln bln +uer bln bln +umb +fUR +mXT +cJt +eWF +fUR +htd +jNZ sEB -bln -bln -bln -bln -sEB -bln sEB -tqR sEB -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln sEB -tqR sEB -bln -bln -bln -bln -bln -bln -bln -vsI sEB -vsI -bln +qVo +lSu +umb +fUR +mXT +cJt +iMu +fUR +oqJ +iWb +lSu +lSu bln bln bln bln bln +gnZ bln bln bln @@ -215636,7 +218418,7 @@ aBR aBR aBR aBR -aBR +gnZ aBR aBR aBR @@ -215764,6 +218546,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -215834,60 +218620,56 @@ wNO wNO wNO wNO -wNO bln bln bln bln bln bln +bln +bln +stJ +bln +bln +lSu +bln +fUR +fUR +xau +fUR +fUR +gSE +sNA sEB sEB sEB sEB sEB -bln sEB -ydI +sEB +ntx +lSu fUR -rhE fUR -ydI -bln -bln -bln -bln -bln -bln -bln -bln -bln -ydI +xau fUR -uHi fUR -ydI -bln -bln -bln -bln -bln bln fUR -piy fUR +fUR +fUR +fUR +htd bln bln bln +lSu bln bln bln -bln -bln -bln -bln -bln -bln +lSu +gnZ aBR aBR aBR @@ -216021,6 +218803,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -216089,59 +218875,55 @@ wNO wNO wNO wNO -wNO -wNO -wNO -bln -bln -bln -hsI -hsI -hsI -hsI -hsI -hsI -hsI -hsI -hsI -hsI -hsI -ack -cJt -eWF -rvE -bln -bln -bln -bln -bln -bln -bln -bln -bln -rvE -ack -cJt -iMu -ydI -bln bln bln bln +mQb bln bln -lJj -cJt -lJj -bln -bln +lBD bln bln bln bln bln +gnZ +lSu +fBN +fUR +irX +kyg +rwW +uhx +uhx +uhx +sEB +sEB +sEB +sEB +sEB +sEB +sEB +uhx +uhx +uhx +rwW +jHX +fJd +fUR +lSu +fUR +kod +gFL +rwW +uhx +uhx +uhx +tMa +lSu bln bln +lSu bln bln bln @@ -216278,6 +219060,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -216346,61 +219132,58 @@ wNO wNO wNO wNO -wNO -wNO -wNO -bln -bln -bln -hsI -qNk -qNk -qNk -qNk -qNk -qNk -qNk -qNk -qNk -hsI -ppN -bRt -fUR -ydI -bln -bln -bln -bln -bln -bln -bln -bln -bln -ydI -fUR -rTD -ppN -ydI -bln bln bln bln bln -ydI -ydI -fNj -fUR -rvE -bln -bln bln bln bln bln +lBD bln +lSu +hjU +kKU +kKU +rzO +uhx +ykb +hAG +dDp +cJt +cJt +jMw +sEB +sEB +sEB +sEB +sEB +sEB +sEB +skc +cJt +cJt +qYz +lnL +otG +uhx +lSu +uhx +ykb +hAG +skc +cJt +cJt +qYz +lSu +lSu +lSu bln +lSu bln bln +lSu bln bln aBR @@ -216429,18 +219212,6 @@ aBR aBR aBR aBR -aBR -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO wNO wNO wNO @@ -216516,41 +219287,53 @@ wNO wNO wNO wNO -"} -(37,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +"} +(37,1,3) = {" +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +otC +hHG +hHG +hHG +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO wNO wNO wNO @@ -216608,53 +219391,54 @@ wNO wNO bln bln -sEB -hsI -qNk -qNk -qNk -qNk -qNk -qNk -qNk -qNk -qNk -hsI -lWU -tEG -rwW -uhx -uhx -sEB +uer +bln +stJ bln bln bln bln bln +jNZ +fUR +fUR +nFL +fUR +fUR +ykb +wOy +fHb +uhx +uhx +uhx +sEB +sEB +sEB +sEB +sEB +sEB sEB uhx uhx -rwW -fdO -uiK -ydI -bln -bln -bln -bln -bln -ydI -qjj -tEG -rwW uhx +fHb +bzg +otG uhx -sEB -bln -bln -bln -bln +lSu +uhx +ykb +wOy +fHb +uhx +uhx +uhx +lSu +lSu +lSu +lSu bln +lSu bln bln bln @@ -216685,8 +219469,6 @@ aBR aBR aBR aBR -aBR -aBR wNO wNO wNO @@ -216792,9 +219574,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -216865,57 +219648,58 @@ wNO wNO bln bln -sEB -hsI -qNk -qNk -qNk -qNk -qNk -qNk -qNk -qNk -qNk -hsI -qjj -abu -dDp -cJt -jMw -sEB bln bln bln bln bln -sEB -skc -cJt -qYz -mXm -wOy -uhx bln bln bln +miY +fUR +fNy +xAk +txd +fUR +uRx +jdY +rsw +rin +uhx +caX +sEB +sEB +sEB +sEB +sEB +sEB +sEB +oMa +uhx +tbR +dcG +jXm +otG +uhx +lSu +uhx +ykb +jdY +rsw +phu +uhx +dsg bln -bln -ydI -lWU -uVf -uQS -cJt -dBj -jVD -bln -bln -bln +lSu bln bln bln +lSu bln bln bln +lSu bln bln aBR @@ -216942,8 +219726,6 @@ aBR aBR aBR aBR -aBR -aBR wNO wNO wNO @@ -217049,9 +219831,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -217122,53 +219905,55 @@ wNO wNO bln bln -sEB -hsI -qNk -qNk -qNk -qNk -qNk -qNk -qNk -qNk -qNk -hsI -qjj -tEG -fHb -uhx -uhx -sEB bln bln +lBD +bln bln +mQb bln bln -sEB -uhx +miY +mVE +ryM +uee +dJY +qlP +nDJ +sfr +fsv +aZK uhx -fHb -fdO -wOy +sEB +sEB +sEB +sEB +sEB +sEB +sEB +sEB +sEB uhx -bln -bln -bln -bln -bln +iog +fsv +lFg +dvO uhx -qjj -tEG -fHb +lSu uhx +ykb +sfr +fsv +iQX uhx -sEB -bln +qVo bln bln +lSu bln +lSu bln +lSu bln bln bln @@ -217198,9 +219983,6 @@ aBR aBR aBR aBR -aBR -aBR -aBR wNO wNO wNO @@ -217306,9 +220088,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -217379,63 +220162,62 @@ wNO wNO bln bln -bln -hsI -qNk -qNk -qNk -qNk -iIw -qNk -qNk -qNk -qNk -hsI -qjj -ohs -bPP -cSb -uhx -bln +lBD bln bln bln bln bln +fsm bln +tIc +fUR +fUR +mXH +wWS +mVE +nDJ +fYW +fsv +xdH uhx -dgk -bPP -nXR -wOy +sEB +sEB +sEB +sEB +sEB +sEB +sEB +sEB +qVo uhx -bln -bln -bln -bln -bln +mgc +fsv +sfr +dvO uhx -qjj -oAk -bPP -cSb +lSu uhx +ovm +fYW +fsv +asm +uhx +qVo bln +lSu bln +lSu bln bln +lSu bln +lSu bln bln bln bln -bln -bln -bln -aBR -aBR -aBR -aBR +gnZ aBR aBR aBR @@ -217563,6 +220345,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -217631,55 +220417,56 @@ wNO wNO wNO wNO -wNO -wNO -wNO -bln bln bln -hsI -qNk -qNk -qNk -qNk -qNk -qNk -qNk -qNk -qNk -hsI -qjj -wfs -fsv -jDY -uhx bln bln bln bln bln bln +uer bln +miY +sEB +ydI +nvU +ydI +ydI +btm +fld +ycA +lpH uhx -joB -fsv -loW -wOy +oJH +sEB +sEB +sEB +sEB +sEB +sEB +sEB +fiv uhx -bln -bln -bln -bln -bln +jDS +lKc +uMm +dvO uhx -qjj -fsv -fsv -jDY +lSu uhx +ovm +fld +ycA +lpH +uhx +hgx bln +lSu bln bln +lSu +lSu bln bln bln @@ -217688,11 +220475,6 @@ bln bln bln bln -bln -aBR -aBR -aBR -aBR aBR aBR aBR @@ -217820,9 +220602,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -217894,62 +220677,61 @@ wNO bln bln bln -hsI -qNk -qNk -qNk -qNk -qNk -qNk -qNk -qNk -qNk -hsI -dtY -wfs -fsv -tEG -uhx -bln bln bln +stJ bln bln bln bln +hWW +ydI +ydI +qKJ +kHl +mVE +nDJ +wOy +rwW uhx -eVn -fsv -wfs +uhx +uhx +sEB +sEB +sEB +sEB +sEB +sEB +sEB +uhx +uhx +uhx +fHb +bzg +dvO +uhx +lSu +uhx +ovm wOy +fHb uhx -bln -bln -bln -bln -bln uhx -ceh -fsv -fsv -ncp uhx bln +lSu +lSu bln bln bln +lSu bln +lSu bln bln +lSu bln bln -bln -bln -bln -aBR -aBR -aBR -aBR aBR aBR aBR @@ -218077,9 +220859,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -218150,63 +220933,62 @@ wNO wNO bln bln -sEB -hsI -qNk -qNk -qNk -qNk -qNk -qNk -qNk -qNk -qNk -hsI -qjj -uDR -dhJ -gaa -uhx -bln -bln -bln -bln -bln -bln -bln -uhx -yfb -dhJ -iQr -wOy -uhx -bln bln +lBD bln bln bln +hjU +kKU +kKU +sEB +mVE +azN +xft +lRg +iaU +nDJ +hAG +dDp +cJt +cJt +jMw +sEB +sEB +sEB +sEB +sEB +sEB +sEB +lAC +cJt +cJt +qYz +lnL +dvO uhx -uPZ -kyO -dhJ -vEu +lSu uhx +ovm +uhA +lAC +cJt +cJt +qYz +rNE +lSu +lSu bln +ozo bln bln bln bln bln +lSu +lSu bln -bln -bln -bln -bln -bln -aBR -aBR -aBR -aBR +lSu aBR aBR aBR @@ -218334,10 +221116,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -218407,58 +221189,62 @@ wNO wNO bln bln -bln -hsI -qNk -qNk -qNk -qNk -rCb -qNk -qNk -qNk -qNk -hsI -qjj -jPK -rwW -uhx -uhx -sEB +lBD bln bln bln bln bln +lJO +hEI +hEI +biY +biY +kCY +bLs +xRI +ydI +ior +wOy +fHb +uhx +uhx +uhx +sEB +sEB +sEB +sEB +sEB +sEB sEB uhx uhx -fHb -nSX -wOy uhx -bln -bln -bln -bln -bln +rwW +bzg +oVX +fUR +lSu +fUR +tvm +wOy +rwW uhx -uPZ -tEG -fHb uhx uhx -sEB -bln -bln -bln -bln -bln -bln +tMa +lSu +lSu +lSu bln +lSu bln bln +lSu +lSu +lSu bln +lSu bln aBR aBR @@ -218482,10 +221268,6 @@ aBR aBR aBR aBR -aBR -aBR -aBR -aBR wNO wNO wNO @@ -218591,6 +221373,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -218658,63 +221444,63 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -bln bln bln -hsI -hsI -hsI -vLl -fxe -nsi -hJL -vLl -vLl -vLl -hsI -wAU -mmo -dDp -cJt -jMw -sEB bln bln bln bln +stJ bln +lJO +cyV +muv +qVN +biY +biY +biY +biY +ydI +oiD +xVN +fUR +fUR +nMj +chP sEB -lAC -cJt -sde -rOj -kYQ -uhx -bln sEB -ibR sEB -bln -uhx -uPZ -uVf -jcw -cJt -sQm +prs +sEB +sEB sEB +pJb +waT +fUR +fUR +bAo +nAX +fUR +fUR +fUR +qeF +xVN +fUR +fUR +oqJ bln bln +lSu bln bln +lSu bln bln +lSu bln bln bln +lSu bln bln aBR @@ -218739,10 +221525,6 @@ aBR aBR aBR aBR -aBR -aBR -aBR -aBR wNO wNO wNO @@ -218848,6 +221630,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -218915,65 +221701,65 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -bln -bln bln bln -sEB -hsI -hNX -vpx -vpx -itC -vpx -vpx -kAl -wUw -wZL -jPK -fHb -uhx -uhx -sEB -bln bln bln +mQb bln bln +lJO +lJO +jEB +nOx +cwe +dIx +laB +laB +lJO +iku +nDJ +wOy +jBK +fUR +rzO +lSu +mZf +ooL +sEB sEB -uhx -uhx -rwW -nSX -gdx -ydI -bln -uhx -wet -uhx -bln -ydI -tXn -tEG -rwW -uhx -uhx sEB +ooL +rwt +lSu +lSu +fUR +rJr +bzg +dvO +clT +fUR +xce +ovm +wOy +rCU +fUR bln +uer bln +gnZ +lSu bln bln bln -ozo +lSu +gnZ bln bln bln bln bln +gnZ aBR aBR aBR @@ -218996,13 +221782,6 @@ aBR aBR aBR aBR -aBR -aBR -aBR -aBR -wNO -wNO -wNO wNO wNO wNO @@ -219086,43 +221865,46 @@ wNO wNO wNO wNO -"} -(47,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +wNO +wNO +wNO +"} +(47,1,3) = {" +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +otC +hHG +hHG +hHG +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO wNO wNO wNO @@ -219181,43 +221963,46 @@ bln bln bln bln -vLl -oHU -sjc -sjc -vzW -hEy -nNY -cjG -bGn -ivG -ygX -exl -uhx -bln -bln -bln -bln -dLv -bln -bln -bln bln -uhx -jJa -wda -bFP -ydI +lBD +lJO +kQg +tLB +bIl +ivi +sbD +hjI +heg +lJO +htq +nDJ +wOy +eyk +fUR +fUR +fUR +fUR uhx uhx -cJt uhx uhx -ydI -uPZ -oAk -exl uhx +fUR +fUR +fUR +fUR +dWl +bzg +dvO +mEv +fUR +gCq +ovm +wOy +eyk +fUR +bln +iWb bln bln bln @@ -219231,9 +222016,6 @@ bln bln bln bln -aBR -aBR -aBR aBR aBR aBR @@ -219362,10 +222144,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -219435,48 +222217,50 @@ wNO wNO bln bln +lBD bln bln +uer bln -hsI -ubG -xTP -hLm -vhX -ksa -sle -cRS -hsI -ssB -wfs -efP -ydI -ydI -ydI -uhx -uhx -uhx -uhx -uhx -ydI -ydI -ydI -std -wfs -aDN +lJO +kQg +ylt +ylV +gfY +lJO +lJO +lJO +lJO fUR -cSb -fHb -fnL -rwW -vIm +nmA +oor fUR -dnD -fsv -bGL -ydI -bln -bln +fUR +fUR +shT +kHq +oOP +ccS +ccS +ccS +lVY +oHY +xuW +fUR +fUR +fUR +gjN +nuM +fUR +fUR +fUR +lSF +tku +fUR +fUR +fUR +fUR +stJ bln bln bln @@ -219512,8 +222296,6 @@ aBR aBR aBR aBR -aBR -aBR wNO wNO wNO @@ -219619,6 +222401,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -219686,60 +222472,58 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO bln bln bln bln bln -hsI -hsI -hsI -hsI +bln +bln +lJO lJO lJO +fRb lJO lJO +fjF +qhO lJO -uXY -gDO -nWP -qCE -hlJ -rDR -rDR -rDR -rDR -rDR -rDR -sAV -hlJ -rDR -ogM -gDO -gDO -xEP -nWP -rDR -ukJ -rDR -mDn -gXS -gXS +lIT +qpt +fBQ +tHB +vmC +syL +dwb fsv -fMJ -rvE -bln -bln -bln -bln -bln -bln -bln +cuc +hgr +qsh +hgr +xFs +fsv +cmV +bXx +aui +qTj +btW +jJd +eyj +lGL +bXx +oMq +tEc +uUu +sEg +iVi +tKI +tKI +tKI +tKI +htd +ntK bln +lBD bln bln bln @@ -219769,8 +222553,6 @@ aBR aBR aBR aBR -aBR -aBR wNO wNO wNO @@ -219876,10 +222658,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -219952,51 +222734,51 @@ bln bln bln bln -sEB -sEB -sEB +bln +jNZ mGf lJO -sbD -qhO -vFe -aHL -bFL -oUr -uQL -emL -uQL -rwX -aLK -uQL -pLO -qyU -fsv -fsv -rZs -fsv -fsv -wfs -fsv -viP -wlx +rrn +nud +hjI +ndz +hjI +xmo +vmx +uBL +nvI +nvI +oTc +cQa +nvI +fwM fsv -nfR -qyU -bZu -uee -dkN +cuc +hgr +hgr +hgr +xFs fsv -fMJ -fUR -bln -bln -bln -bln -bln -bln -bln +dpU +swK +iCw +ubx +swK +swK +swK +wfF +rUv +nqD +thX +peM +iES +mKa +ldw +bCQ +bCQ +tKI bln +uer bln bln bln @@ -220133,11 +222915,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -220205,57 +222986,58 @@ wNO wNO wNO bln -ozo bln +ozo bln bln +ntK bln -sEB -lJO -lJO -lJO -paV -aDx -eUf -lJO -lJO lJO lJO lJO +pOq +cKe +thY +hjI +ilv +xmo lJO -iRo -iRo -iRo -iRo -hII -uJZ -uGG -uGG -uGG -uGG -eMF -cSM -nwT +fUR +fUR +mVE +fUR +fUR +fUR +kIh +fsv +cuc +hgr +jIp +hgr +xFs +fsv +jLM +fUR +fUR +fUR +koQ +koQ +fUR +fUR +fUR +krW +nEA nwT nwT nwT -fxJ nwT tKI -tdi +pgE tKI -ivF -ivF -ivF -ivF -ivF -ivF -ivF -bln -bln -bln -bln +iWb +lBD bln +mQb bln bln bln @@ -220371,52 +223153,51 @@ wNO wNO wNO wNO -"} -(52,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +"} +(52,1,3) = {" +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +otC +hHG +hHG +hHG +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO wNO wNO wNO @@ -220464,54 +223245,55 @@ wNO bln bln bln +stJ bln bln bln -sEB cyH hjI nbj -eUf +hjI +uDc xyO eUf -eUf -hpN -anl -anl -anl -lJO -tCn -eaS -kdW -iRo -aUr -nNw -rLb -oLI -apz -dHG -anG -fsv +aUm +kEY +kEY +qPq +gsN +nwr +owk +gjZ +abv +wdo +alD +ael +kdU +kdU +kdU +jbJ +xvl +jLM +buF +fUR +xxI +juu +juu +lnp +gel +fUR +teE +bKA nwT -bPw -wjj -hle -pIX -esj +hAo +tzM +vgj +tKI +bCQ tKI -lgr tKI -dRm -kSh -nUw -ilQ -sbc -ftg -waa -bln -bln -bln bln +mQb bln bln bln @@ -220647,11 +223429,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -220719,54 +223500,55 @@ wNO wNO wNO bln +lBD bln bln -bln +uer bln bln lJO lJO lJO lJO -eUf +uDc lJO lJO -cya +fsZ lJO lJO lJO -anl -lJO -bqR -ufy -tVz -qqz -aUr -nNw -jbh -tPg -pqa -ejW -anG -fsv -nwT -ohV -jdj -eye -lvv -gBs -tKI -lgr +opS +jIn +byd +iRo +bvq +kHP +cuc +mVE +mVE +mVE +mVE +mVE +xFs +jLM +dvf +fUR +juu +jNB +qku +ukD +hrh +fUR +wtP +gMt +cut +pGd +bPw +ixb tKI -lOg -pzQ -ivF -oQv -ivF -oQv -oQv -bln -bln +jLX +fbY +teN bln bln bln @@ -220904,6 +223686,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -220950,11 +223736,6 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -bln bln bln bln @@ -220982,50 +223763,51 @@ bln bln bln lJO -cTK -asO -bBr -eUf lJO -sEx -mcX -awh -aaI +fEd +weL lJO -anl +uDc lJO -xMg -xyY -jFi -gbt -aUr -nNw -kMM -hUj -hUj -kMM -nnK -ijA -nwT -bPw -oCj -dAO -liQ +tEi +dxu +nUh +qjr +lJO +qYA +xnV +qEK +roX +rMu +kHP +cuc +mVE +nAH +nAH +nAH +mVE +xFs +jLM +qHO +fUR +juu +kBU +xgX +juu +gNL +fUR +qAB +cTh iJl -tKI -lgr -tKI -lim -aqT -uWD -bJZ -vky -hTt -oQv -bln -bln -bln -bln +ooa +dWP +bam +erK +rfF +brM +teN +stJ +fsm bln bln bln @@ -221161,10 +223943,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -221236,57 +224018,58 @@ bln bln bln bln -sEB -lJO +bln lJO -cCV -rrY +cKB +tcR +hjI lJO -hpN +kgy lJO -dqd -wLJ +rmZ +egT xiW -qkP -lJO -iwD +lnY lJO -ydw -dZG -cmm -qsE -aUr -nNw -jbh -hUj -hUj -dHG -vzE -fsv -nwT -oCR -wRM +kyU +qFJ +mWY +hmt +xzo +kHP +cuc +mVE +nAH +nAH +nAH +mVE +xFs +jLM +fnC +vNe +piP +npy +npy +rFb +hrh +fUR pFW iNH -hZR -tKI -lgr -tKI -wBZ -pzQ -vQL -obd -jJm -osD -oQv -bln -bln -bln +aVb +onQ +inQ +jZD +erK +bCQ +pdf +teN bln bln +stJ bln bln bln +ozo bln bln bln @@ -221307,7 +224090,6 @@ aBR aBR aBR aBR -aBR bln bln bln @@ -221418,10 +224200,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -221490,52 +224272,54 @@ tCr tCr bln bln -bln +uer bln bln bln lJO -lIH -hjI -wYm -cnz -iwD +gwM +xdU +nxe +kUn +tba lJO -mUr -fZk -jXB -vtD -lJO -anl +hPX +vcc +mXA +waM lJO -lqH -coB -ukR -gbt -qyU -lqv -rNR -aWX -aWX -rNR -vzE -egK -nwT -ccD -aCJ +gwq +mWK +isz +roX +iLA +uZT +cuc +mVE +nAH +nAH +nAH +mVE +xFs +jLM +iYy +tma +agG +mxQ +pXU +pSd +jsh +fUR tkc nsr xSl +vxO +qAB +hCY tKI -lgr -tKI -rRd -tXw -eZJ -xsE -nQI -kln -ivF +npr +uyx +teN bln bln bln @@ -221562,8 +224346,6 @@ aBR aBR aBR aBR -aBR -aBR bln bln bln @@ -221675,10 +224457,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -221747,57 +224529,57 @@ bln tCr bln bln -bln +mQb bln bln bln lJO -xsq -eZw -cLM +keT +sHO +hjI lJO -anl +eUf lJO -hSi -fhL -uPS +nKW +dak +byv sOY lJO -anl -bFe -jdB -cAl -eov +bpm +xQs +rqi iRo -cyW -nNw -fUR -fUR -fUR -fUR -lKF -fsv +lvW +uTI +cuc +mVE +nAH +nAH +nAH +mVE +xFs +bwn +ktW +tKI +tKI +tKI +tKI +tKI +tKI nwT -qku -bPw -bPw -bPw -bPw +goI +nwT +nwT +aLO +wRM +iox +tKI +bCQ tKI -lgr tKI -yhp -yhp -elr -kzI -dZj -wsx -ivF -bln -bln -bln -bln bln +stJ +fsm bln bln bln @@ -221932,10 +224714,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -222006,52 +224788,52 @@ bln bln bln bln -bln +mQb bln lJO -cLy +uBX +hjI hjI -xKG lJO -anl +eUf lJO jvj -sBL -lnY -waM -lJO +hKu +aaI lJO lJO -iRo -iRo -iRo -iRo -emO -nNw -xji -bOL -qNL -bIB -vzE -fsv -nwT -hkb -aaT -fFT -sEM -bPw +oCO +oCO +oCO +oCO +gyH +uTI +cuc +mVE +mVE +mVE +mVE +mVE +xFs +pLn +aDy tKI -lgr -hbm -onj -dxV +ljK +tXs +ljK +rUa tKI -xio +hbt +cTD +akK tKI -ivF -ivF -bln -bln +tKI +cyA +tKI +tKI +kPq +tKI +qjC bln bln bln @@ -222189,10 +224971,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -222268,43 +225050,46 @@ bln lJO lJO lJO -mde lJO -erk lJO +erk lJO lJO lJO lJO lJO mCT -eLm +blA mCT -gbS -mZu +sGq oCO -hed -lYJ -awk -awk -wpy -wpy -bcn -adW -nwT -xxI -bam -rZg -bam -bPw +tdp +uTI +kXD +nKk +nKk +sre +nKk +nKk +aWN +pLn +qFs +tKI +rvW +xqj +vsT +gXr +tKI +rVt +ihc +bod tKI hsQ +bCQ +eVp +eVp +bCQ tKI -jNA -gPF -cFR -jiI -teN bln bln bln @@ -222312,9 +225097,6 @@ bln bln bln bln -sEB -bln -bln bln bln bln @@ -222446,10 +225228,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -222517,55 +225299,55 @@ uei bln bln bln +mQb bln bln +uer bln -bln -bln -sEB -sEB +mZm hEI -jxK -iwD -anl -anl -anl +qhO +eUf +rgs +eUf anl -iwD +lil anl +pLZ lJO geZ aPM aPM -kMu -esB +qTm oCO -xJv -hnV -fsv -nDk -fsv -fsv -ddt -ikp +oCO +tmL +arG +cIa +dJY +npq +ecU +gkZ +tlO +kyc tKI tKI +kJO +kjo +kJO tKI tKI +stP +dVX +oLo tKI +eae +bCQ tKI tKI tKI tKI -lAr -jWX -wlc -cUy -teN -bln -bln -bln -sEB +htd bln bln bln @@ -222703,10 +225485,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -222776,61 +225558,61 @@ bln bln bln bln +sxQ bln bln -bln -sEB -sEB +miY hEI -krH +flD +eUf +hjI +hjt +hjI +hjI +hjI anl -lJO -lJO -lJO -lJO -lJO -iwD icY esv lCb ddZ -slv -rEN +eUA +nhS +oCO oCO oCO oCO -aPI -iKR -aPI +sll +eyf +sll tKI tKI tKI tKI -kEs -qgM -fzu -ofS -uDP +jXC +wBb +xvk +wBb +kQV tKI -xYv tKI -ooO -mhr -cFL tKI tKI +tKI +jez +bCQ +tKI +lSu bln bln -bln -fBN -bln +gnZ bln bln -vsI bln +gnZ bln bln bln +gnZ bln bln bln @@ -222960,10 +225742,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -223039,53 +225821,53 @@ biY lJO lJO lJO -eXk -anl +dYj +hjI +lJO +lJO +lJO lJO -sQx -kXI -sQx lJO -anl lJO dZJ eUi eBB -nxV +tNd nor qiT cgw +mZu hjv +pXh +rOb gpp -ons -eVy tKI dat -gJM -fPM -pdf -eyD -vHT -pQQ -yaR -fVq -pdf -elu -dXT -kcE -dAT -duW +kDv tKI -bln -bln -bln -sEB +kEs +wBb +fgo +aSI +nEq +tKI +kCv +gvp +nSr +tKI +xDw +bCQ +tKI +lSu bln bln bln bln +lSu bln bln +lSu +lSu bln bln bln @@ -223217,10 +225999,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -223293,54 +226075,54 @@ nhb sxF kjw biY -yjn -flD +hTJ +gks qDI -krH -cKM +eUf +jPV lJO -kXI -bDp +pVQ bln -lJO -iwD +efI +efI lJO jaS hBG pEs -rho -eMu -vlh -vlh +aFH +jRI +nza +nza +nza cNS -kQS +doW awz -eRK -coa -qPC -qPC -qPC -qPC -qPC -qPC -qPC -bmK -qPC -bDZ -kKe -ppE -jiI -jiI -cAs -mhK -bln -bln -bln -bln -bln -bln +nmx +izI +pdd +lMg +wSk +pdd +oLC +bVn +cHs +fLS +fLS +yel +edN +jLf +tlm +jLf +dpZ +tKI +htd bln -sEB +lSu +lSu +lSu +lSu +lSu +lSu bln bln bln @@ -223474,10 +226256,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -223548,38 +226330,37 @@ pVN kJe pVN eSg -pVN +cat inw -iwD -anl -anl -rcq -anl -lJO -hoO -sQx -sQx +rgs +eUf +eUf +eUf +hjI lJO -anl +efI +bln +mQb +kXI lJO wDf sAR sAR cBD -wKA +kPy dQI pPT +pPT hjv +vTP +lsi gpp -oRM -oel -tKI -tKI -tKI -tKI -tKI tKI +kii +cEG tKI +afz +mTc tKI tKI tKI @@ -223588,18 +226369,19 @@ tKI tKI tKI tKI -vGM tKI +dBJ +teN bln +lSu +lSu +lSu +lSu +lSu bln bln -vsI -bln -bln -bln -fBN -bln -bln +lSu +lSu bln bln bln @@ -223731,10 +226513,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -223807,35 +226589,35 @@ pVN bvd eAh aiT -krH -krH -krH -krH +hjI +hjI +hjI +eUf nst lJO lJO -hEI -lJO +lNj +qDI lJO -anl lJO mCT -urt -mCT -fzF -mAV -jzr -psr +mut +lGo +xhg +pGy +wCL +tTc +wtr oCO -wpO -oRM -oel +kxs +lsi +gpp +qnj +qnj +qnj +qnj +qnj qnj -omg -hzL -aAu -cNQ -paZ tOw xan tOw @@ -223845,20 +226627,20 @@ pLw tOw orq tKI -vGM -tKI -bln -bln -bln -bln -bln -bln -bln -sEB +dBJ +teN bln +lSu +lSu bln bln +lSu +lSu +lSu +lSu +lSu bln +gnZ bln bln bln @@ -223989,9 +226771,9 @@ wNO wNO wNO wNO -wNO -wNO -wNO +hHG +hHG +hHG wNO wNO wNO @@ -224060,21 +226842,21 @@ bln bln bln eGr +wxN biY biY biY -biY -wYm -hjI -qDI -hjI hjI hjI +qDI +eUf hjI +dIx +kEq ndz -hjI -iep -anl +hdh +wWc +lJO lJO lJO lJO @@ -224084,15 +226866,15 @@ fYS fYS fYS fYS -gpp -oRM -oel +wpO +lsi +kTC qnj -wch -ykG -ykG -ykG -mXu +omg +hzL +kRc +oWu +paZ tOw iKX tOw @@ -224102,18 +226884,18 @@ hce tOw wbY tKI -vGM -tKI -bln -bln -bln -bln -bln -bln -bln -bln +dBJ +teN bln bln +lSu +lSu +lSu +lSu +lSu +lSu +lSu +lSu bln bln bln @@ -224226,64 +227008,64 @@ wNO wNO wNO wNO -"} -(67,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +"} +(67,1,3) = {" +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +hHG +hHG +hHG +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO wNO wNO wNO @@ -224317,39 +227099,39 @@ bln bln bln bln -lJO -kQg -krH -krH -krH -jnV -lJO +miY +hEI +dYC hjI hjI -dIx -kEq -hdh -flD hjI -anl -rEB +lJO +eUf +eUf +eUf +eUf +eUf +eUf +eUf +eUf +cKD gks lJO -wGD -xhk +wSf +tak bPr dRc bVS vQt -etx -oRM -qYR +gpp +lsi +xhx qnj -bfa +nct +gAB ykG ykG -vqg -oYv +wpQ tOw sVn wlt @@ -224357,20 +227139,20 @@ kEM bLn kEM vkW -kEM +gak tKI -vGM -mhK -bln -bln -bln -vsI +oKu +tKI +nMj bln +lSu +lSu bln bln -fBN bln +lSu bln +lSu bln bln bln @@ -224503,9 +227285,9 @@ wNO wNO wNO wNO -wNO -wNO -wNO +hHG +hHG +hHG wNO wNO wNO @@ -224574,39 +227356,39 @@ bln bln bln bln -lJO -kQg -hjI +miY +hEI +kbd hjI lJO lJO lJO fzJ qDI -lJO +qDI qDI lJO lJO lJO -eUf +dva lFq -glN +dix lJO veN -iMT +ekn dTD eMH dTD ljT pBk -aJA -kHu +lzO +tJu qnj -czs -ykG +hul ykG -dVj -siX +gwp +hCa +pig wpc xBn jjO @@ -224616,16 +227398,16 @@ xQf vQO hlv tKI -vGM +dBJ tKI bln bln bln -sEB -bln +lSu bln +lSu bfP -sEB +lSu bln bln bln @@ -224760,9 +227542,9 @@ wNO wNO wNO wNO -wNO -wNO -wNO +hHG +hHG +hHG wNO wNO wNO @@ -224834,14 +227616,14 @@ hEI lJO lJO lJO -vcx +adq lJO -uzh -ozU -ozU +lZU +fIx +hRt kWr -aiN -ozU +okU +hRt mro kUJ lJO @@ -224849,21 +227631,21 @@ eUf gDS wTX lJO -hbV +ose iMT wIR uAl wQh vQt gpp -aJA -svP +bAB +xEE qnj -cQb +hlW ykG -vqg -ubH -swz +ykG +rCj +xDh tOw tOw tOw @@ -224873,10 +227655,10 @@ tKI tKI tKI tKI -vGM +jss tKI -bln -bln +mZf +ooL maT wSM oMd @@ -224884,9 +227666,9 @@ maT oMd bNo maT +sEB bln -bln -bln +gnZ bln bln bln @@ -225017,9 +227799,9 @@ wNO wNO wNO wNO -wNO -wNO -wNO +hHG +hHG +hHG wNO wNO wNO @@ -225093,12 +227875,12 @@ ghN lJO hjI qDI -icX -iQl +pWb +okU rSe -lVI +txe rSe -ozU +hRt lJO lJO lJO @@ -225112,25 +227894,25 @@ fjD gOx nbT fYS -gpp -aJA -tAR +rdn +bAB +aaW qnj -gYR -vqg -oGX +mxu +awx +koH ubH -fAW -bJa +wml +bvg bJa -brC +btG ehp tKI plg huj qjO tKI -vGM +sHK tKI maT maT @@ -225141,8 +227923,8 @@ jIE bde ksf maT -bln -bln +miY +xeg bln bln bln @@ -225274,9 +228056,9 @@ wNO wNO wNO wNO -wNO -wNO -wNO +hHG +hHG +hHG wNO wNO wNO @@ -225350,12 +228132,12 @@ uPS cnz ndz qDI -sYl -ozU +jgD +hRt vxi -jBH +hWd ppq -ozU +hRt mro cyI lJO @@ -225369,25 +228151,25 @@ nQu gOx vYa fYS -gpp -aJA -bBe -fDv -blq -blq -blq -ubH -hDT +hNz +bAB +gdY +ljE +vKq +vKq +vKq +eTC +neq muy muy gRp -xVL +sbv tKI plg jdW -rBj +mmn ggn -vGM +dBJ tKI cYo tEL @@ -225398,10 +228180,10 @@ kXr hFU bNo maT -bln -bln -bln -bln +mZf +kKU +kKU +dPX bln bln bln @@ -225531,9 +228313,9 @@ wNO wNO wNO wNO -wNO -wNO -wNO +hHG +hHG +hHG wNO wNO wNO @@ -225608,9 +228390,9 @@ lJO hjI qDI xQB -ozU +hRt rSe -jBH +hWd ckQ xJD lJO @@ -225627,24 +228409,24 @@ iVb xWU vQt gpp -aJA -lty -bCl +bAB +fWN +tpG awx jsB -awx -dfj -hDT +uQu +psp +neq muy muy gRp -xVL +geq tKI -kMF -vbj +bsO +jyo pXR tKI -lAr +dBJ tKI grr kLZ @@ -225788,9 +228570,9 @@ wNO wNO wNO wNO -wNO -wNO -wNO +hHG +hHG +hHG wNO wNO wNO @@ -225865,12 +228647,12 @@ lJO uPS lJO ndz -ozU +hRt jhf uyH nGC -tMl -jik +mOx +tCu cHB lJO qzs @@ -225878,49 +228660,49 @@ jnV lJO iWO gHS -jjp +iMT hqx myE reJ wrA djr -aJA -oel +lzO +mNy qnj -erE +etY awx -arO -nDv -fbK -xYB +bjQ +awx +sgT +dmk sua frd -wWO +qyL tKI tKI tKI tKI tKI -lAr +wyr tKI kMh ajw ajw wbW ajw -aEO +kVl czv cCW wyB -vlt -jxG +gTb +wyB tEj maT bln bln bln bln -nBE +gsK ohx nBE bln @@ -226044,10 +228826,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -226106,12 +228888,12 @@ bln vbG bln bln +uer bln +mQb bln bln -bln -bln -bln +stJ bln bln bln @@ -226119,13 +228901,13 @@ bln lJO cIq lJO -hjI +hjt lJO csf xht -mbV -nIS -ydi +wlr +qHj +gQD lJO lCV lJO @@ -226134,34 +228916,34 @@ eUf iPR lJO ejo -xSM -tak +cSe +xhk skj kkK lNP vQt gpp -aJA -oel +bAB +gpp qnj -xzI -awx -hMu -cIu -prb -dxj -qxW +hjJ ykG -xVL +aUi +kXB +ihk +ssv +omH +hJG +oYa tKI dzl -jJX -jun -hDj -cpj -bzh -vlN -pqD +bCQ +jKP +fLS +jeK +cse +ajw +bff otd otd ajw @@ -226195,7 +228977,7 @@ sEB bln pRj dMO -uVa +vZp dcQ wAW pRj @@ -226301,10 +229083,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -226362,8 +229144,8 @@ bln bln vbG bln -bln -bln +fsm +lBD bln bln bln @@ -226378,10 +229160,10 @@ lJO lJO xbr lJO -adT -xGQ +unq +mZn uSd -cAT +xkG tIh lJO ovt @@ -226397,28 +229179,28 @@ lJO lJO lJO lJO -gpp -aJA -oel +kxs +bAB +fSv qnj -hTL -awx -aoK -erJ -dvR -agh -cVq +gtG ykG -xVL +dVb +oXB +qVg +wsV +uKO +uKO +juq tKI -cWn -gJM -lAr +stL +thE +hbY tKI tKI tKI -lUA -vlN +ghl +ajw ajw otd otd @@ -226558,10 +229340,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -226628,7 +229410,7 @@ bln bln bln bln -bln +lBD bln bln bln @@ -226637,9 +229419,9 @@ dGe lJO lJO lJO -xps -gtt -amD +rCx +iNE +iBg lJO ovt cAJ @@ -226656,26 +229438,26 @@ ygk jKJ hMg cke -wTh +kTC qnj -qcZ -qpe -hub -awx -eNA -iEr -iEr -rSn -xVL +qwn +wpC +vZg +gta +ihk +qjp +uKO +uKO +juq tKI -uNt -pdf -lAr +xqX +lnd +wBb tKI veh -gzN ajw -vlN +ajw +ajw mmi aUA mmi @@ -226708,14 +229490,14 @@ daS ptf bln pRj -eNR -sOl -vkC +mVN +hUI +lqP qAI snw mNY kkp -ipE +fCA ipE glh bln @@ -226815,10 +229597,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -226880,14 +229662,14 @@ bln bln bln bln +stJ bln bln bln +mQb bln bln -bln -bln -bln +fsm bln hEI hjI @@ -226911,28 +229693,28 @@ lJO lJO lJO lJO -wJz +gZc aJA gpp qnj -rOV -awx -kku -bkK -mjj -boL -tXW -gUj -leI -txh -sIM +nct +ykG +tQS +oWN +pji +apq +eoY +poK +smn +cUd sIM -lAr +yjn +wBb tKI pVC -xdz +ajw kXs -vlN +ajw mmi wiz mmi @@ -226965,14 +229747,14 @@ lDr sup ptf pRj -sVr +kqK dnM swS -nZj -bvs +mXN +vUz mNY qIf -smj +fcs czR glh bln @@ -227072,10 +229854,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -227134,17 +229916,17 @@ bln vbG bln bln +stJ bln bln bln bln bln +stJ bln bln bln -bln -bln -bln +uer bln hEI ndz @@ -227168,7 +229950,7 @@ sDl sDl sDl jOt -wRU +rWZ auc rWZ sAS @@ -227184,12 +229966,12 @@ tKI tKI kcE pdf -lAr +aSI tKI ooR ajw ajw -vlN +ajw mmi wiz mmi @@ -227224,7 +230006,7 @@ vYd pRj pRj kuR -wYb +bGf lDh pRj mNY @@ -227329,10 +230111,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -227431,22 +230213,22 @@ gpp gJz nQv nDY -imr +tEu tKI -jun -iJt -hDj -hDj -hDj -hDj -hDj -hDj -cpj +wuA +nAr +nAr +nAr +nAr +nAr +nAr +nAr +wNR tKI -svL +piX +ajw ajw ajw -vlN mmi wiz mmi @@ -227464,7 +230246,7 @@ eGw ewI pPl hoD -gTH +uEk qjQ bln ptf @@ -227479,14 +230261,14 @@ wEW hth hjH pRj -gbq +vgw rlj -iFm +bKZ aPV gFH apj cqL -eAj +xHe ptf bln bln @@ -227586,10 +230368,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -227685,12 +230467,12 @@ jOt ozw aJA oRM -qIV +oVG pRL gfF hqm tKI -lAr +wBb tKI tKI tKI @@ -227700,7 +230482,7 @@ tKI tKI tKI tKI -tkk +leW vlN fya vlN @@ -227721,7 +230503,7 @@ qyT qcE aFz hoD -gnQ +rea qjQ bln ptf @@ -227730,7 +230512,7 @@ ace ybu thW pRj -uhP +uhX dnM aBQ wEW @@ -227740,10 +230522,10 @@ iaT bFY aZq ukA -sOl +hUI apj daS -eAj +xHe ptf bln bln @@ -227843,10 +230625,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -227927,7 +230709,7 @@ hEI hEI hEI lJO -dNi +hjI wPr oSy sDl @@ -227935,22 +230717,22 @@ ybQ oPI khR khR -szp +eRh uiM jOt jOt ozw aJA -gpp +xSL gJz -wCg -oGE -gbl +uXy +imO +kGF tKI -lAr +wBb tKI skw -nUO +ipF qpp dsf xjF @@ -227970,7 +230752,7 @@ irD irD pzX gdN -ajw +gfu maT bln qjQ @@ -227987,20 +230769,20 @@ eGX qOl ujj pRj -xoB +dOH hjH qTS dNC xBX pRj wls -nnk +qxY tKV cjL -hEr +gfC pRj -eAj -pFD +daS +hHs pRj pRj pRj @@ -228100,10 +230882,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -228187,9 +230969,9 @@ hjI hjI wPr oSy -bXR +sDl ybQ -mGw +olQ bnz jxq sOz @@ -228198,15 +230980,15 @@ ptk lEE idO aJA -ieW +wBT tKI tKI tKI tKI tKI -sdi +qRR tKI -ouZ +aes alT taf kGQ @@ -228226,12 +231008,12 @@ iaF iaF ajw ajw -vVN -kXr -kXr -bln -qjQ -qjQ +ajw +bsx +bsx +gMV +bsx +bsx ojk bVJ dSO @@ -228241,7 +231023,7 @@ bln pRj jzk kYF -csE +llC qzM pRj dOH @@ -228250,9 +231032,9 @@ osI osI hjH pRj -wGw -sOl -eVR +nDy +hUI +xsm nVR iWZ bse @@ -228357,10 +231139,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -228441,7 +231223,7 @@ hEI hEI hEI lJO -dNi +hjI wPr oSy sDl @@ -228449,19 +231231,19 @@ ybQ oPI xWN xWN -wtw +pib ybQ jOt jOt ozw aJA -qRT -kFU -sIM -sIM -sIM -sIM -lAr +gpp +bpK +pdf +pdf +pdf +pdf +wBb tKI cnU alT @@ -228478,18 +231260,18 @@ lxb eWV kXr xaF -bdi -xGr +aET +smx qqJ gjP ajw ajw -maT -bln -bln -bln -qjQ -tFP +gMV +cWa +sVW +ltl +bsx +qYc hxE xtr qjQ @@ -228510,7 +231292,7 @@ pRj bxV uKP iaT -sOl +hUI lLm mLa qSY @@ -228614,10 +231396,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -228712,7 +231494,7 @@ sDl jOt ozw ons -eVy +eNE tKI tKI tKI @@ -228720,12 +231502,12 @@ tKI tKI wBb bcx -pwu -gPu +qiK +tda lit -ppt -bRA -kcV +qiP +noF +dqV nxD rbC kXr @@ -228739,13 +231521,13 @@ kXr kXr kXr kXr -ajw -ajw -kXr -bln -bln -qjQ -qjQ +dgf +eMa +oVf +fss +qtT +tqC +bsx qjQ rVe qjQ @@ -228871,10 +231653,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -228972,7 +231754,7 @@ ons gpp lGz pMv -llv +qaD dBB tKI wBb @@ -228981,7 +231763,7 @@ tKI tKI tKI tKI -nWy +tKI tKI tKI tKI @@ -228995,15 +231777,15 @@ mAN vra lZQ wXR -qjQ -aOd -qtT -aOd -qjQ -qjQ -qjQ -tqC -tLX +kXr +eAe +eMa +bsx +fNx +dPW +vgC +bsx +lti jBf naO qjQ @@ -229013,7 +231795,7 @@ pRj daS tut qai -xgB +qoK pXv exy pXv @@ -229129,9 +231911,9 @@ wNO wNO wNO wNO -wNO -wNO -wNO +hHG +hHG +hHG wNO wNO wNO @@ -229224,7 +232006,7 @@ sDl sDl sDl jOt -ozw +caH ons oRM oRM @@ -229232,10 +232014,10 @@ uLX rmA qGW tKI -mNE -nAr -nAr +lGd +wxy nAr +wxy axz dzl tKI @@ -229252,15 +232034,15 @@ kXA oDt kRU oQa -qjQ +kXr kQL -vgC -hoD -flq -ehG +ewq +bsx +dVs +nyB dUK -hoD -hoD +bsx +fqY hxE dPn aOd @@ -229270,7 +232052,7 @@ ptf daS jSe xcW -qFU +sxY tFs pRj ptf @@ -229386,9 +232168,9 @@ wNO wNO wNO wNO -wNO -wNO -wNO +hHG +hHG +hHG wNO wNO wNO @@ -229481,7 +232263,7 @@ hDU hDU hDU hDU -slI +gRs ons gpp tmw @@ -229490,10 +232272,10 @@ bcT iTy tKI afz -wiA +rvS kfe pdf -tgu +aCU jJX tKI tKI @@ -229509,14 +232291,14 @@ cXl uxl oRy aHC -qjQ +kXr +ghl ewq -oVf -hoD -hoD -vWV -fNx -hoD +bsx +gMV +gMV +bsx +bsx iVA hxE aCh @@ -229643,9 +232425,9 @@ wNO wNO wNO wNO -wNO -wNO -wNO +hHG +hHG +hHG wNO wNO wNO @@ -229735,7 +232517,7 @@ uqV sDl hDU ksU -tMo +cFX fHY hDU gpp @@ -229767,13 +232549,13 @@ cHb psW psW nMB -hxE -hxE +ewq +ewq tyH hxE hxE -hxE -hxE +vWV +dAt hxE hxE wBV @@ -229782,7 +232564,7 @@ bln bln ptf jYS -jSe +pNM jSe oxB jQC @@ -229900,9 +232682,9 @@ wNO wNO wNO wNO -wNO -wNO -wNO +hHG +hHG +hHG wNO wNO wNO @@ -229984,7 +232766,7 @@ lJO pKS iSX lJO -tDO +bOX hos biY hDU @@ -230023,16 +232805,16 @@ ljl kXA rLu nRq +maT +ajw +eMa aOd -hoD -bsx -hoD qJJ hxE +iVA hoD hoD -hoD -vdo +abz qjQ qjQ sEB @@ -230157,9 +232939,9 @@ wNO wNO wNO wNO -wNO -wNO -wNO +hHG +hHG +hHG wNO wNO wNO @@ -230244,9 +233026,9 @@ hEI qGU biY biY -qhG +kqx mQh -qdR +xKb vMc xMW apI @@ -230267,10 +233049,10 @@ rTO fsS aqQ gst -xKA -pCU +dKe +lek jak -cnM +nfd jIg wEh uuP @@ -230283,12 +233065,12 @@ uuP tue nZh lNG -nZh tue +qjQ hxE feB lis -lis +aud lis qjQ bln @@ -230414,9 +233196,9 @@ wNO wNO wNO wNO -wNO -wNO -wNO +hHG +hHG +hHG wNO wNO wNO @@ -230503,7 +233285,7 @@ biY rcP jXN vVj -szx +dRD jFf uOj bgF @@ -230511,7 +233293,7 @@ vPM esI cVz ons -gpp +xSL lnc qRq pNK @@ -230671,9 +233453,9 @@ wNO wNO wNO wNO -wNO -wNO -wNO +hHG +hHG +hHG wNO wNO wNO @@ -230757,7 +233539,7 @@ lJO lJO lXn biY -ozC +dXv lck ocu vwQ @@ -230781,7 +233563,7 @@ vWW tnO kPL gst -qLw +iSA vHK kDj dBZ @@ -230802,7 +233584,7 @@ pRj kCn daS pRj -ipJ +wtC tXb pRj kNZ @@ -230928,9 +233710,9 @@ wNO wNO wNO wNO -wNO -wNO -wNO +hHG +hHG +hHG wNO wNO wNO @@ -231007,8 +233789,8 @@ bln bln bln lJO -vvs -mOY +oXf +rlX fdF lJO vqS @@ -231017,7 +233799,7 @@ biY vVj jXN rcP -dhj +viV gbd uOj pdW @@ -231039,10 +233821,10 @@ ozH bZg gst tZR -hsu -dBZ -dBZ -wcV +nsq +dOw +dOw +yhe rCC vPh vQQ @@ -231054,7 +233836,7 @@ fhw nZh lzt cQh -uHG +pyc pRj kCn daS @@ -231086,14 +233868,14 @@ pRj poc oef wWm -fSj -daS -bnY -daS -rlj -daS +uAF +pXv +lge +pXv +mYc +pXv fIL -daS +pXv rOX nkO ptf @@ -231184,10 +233966,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -231265,16 +234047,16 @@ bln dvY lJO eKX -gqV -lsh +erl +oDH fVm ndz oIB biY biY -keF +hhN iLi -iGW +oJT spV gad gAk @@ -231292,11 +234074,11 @@ gst sto lpj gst -jWU +gst oiK bLW xjP -jIA +sXf gxO dKK xmN @@ -231307,10 +234089,10 @@ qmi kGx rqJ rMr -pFi +bgK nZh iOS -ryL +mYs fxn pRj kCn @@ -231343,7 +234125,7 @@ blO xHe pRj glX -daS +xgQ kNZ pRj lDF @@ -231441,10 +234223,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -231549,7 +234331,7 @@ sAC eBd eBd wJR -tDF +uri tKZ gst rCC @@ -231698,10 +234480,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -231778,14 +234560,14 @@ wPN aeV lJO lJO -wxA +vNK hDc wGG psR vHA cJH sCE -opx +cGe gYG iLK iLK @@ -231797,11 +234579,11 @@ lJO dnq iuv xgm -eit dnq dnq dnq -xjQ +dnq +tPH dnq dnq fTx @@ -231820,7 +234602,7 @@ pTB dnq dyN rGl -rGl +hJE kzC wLU rGl @@ -231866,7 +234648,7 @@ gBv tjH aUK gGs -aIK +qAq aUj aUj bln @@ -231955,10 +234737,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -232033,17 +234815,17 @@ sDl sDl sDl hEI -cBp +iwj kEB kpu -ebs +rtq lJO lJO lJO lJO baE apX -uqk +hjI hdh mFy fjF @@ -232102,11 +234884,11 @@ fhW mNY csT csT -xaI +csT xaI fiY wkl -xaI +csT csT csT mNY @@ -232212,10 +234994,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -232262,11 +235044,11 @@ tGr tGr tGr bDu -grh +vKk hwR igB wRs -lTN +xlC bDu dvl cuq @@ -232291,8 +235073,8 @@ sDl sDl hEI giR -uxm -pLE +rkd +rmU ure lJO bZx @@ -232469,10 +235251,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -232555,12 +235337,12 @@ lJO wrN bZx bWn -dVD +huM nUr ibk -tcO +xwr xgg -qix +aFx whQ kka fmm @@ -232572,9 +235354,9 @@ jII pAZ pAZ jII -nbZ +inJ dnq -wIm +wGa dxK dxK iOF @@ -232596,7 +235378,7 @@ hVc jII dnq ylU -pua +dnq jII bln hcL @@ -232615,13 +235397,13 @@ kkD fhW mNY krU -hOi +qjq cEM aQR csT aQR eTi -jfq +rfR aGB mNY kCn @@ -232633,7 +235415,7 @@ mNY mNY mNY mNY -xAf +nav gfo nNs rDO @@ -232726,10 +235508,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -232835,7 +235617,7 @@ qjm dxK hbp oyp -doT +phf sEl qRs jST @@ -232846,14 +235628,14 @@ dpH gfb ydT iIA -nzk +fSC iIA iIA -eAV +cvg jII okb ylU -dnq +jwl jII bln hcL @@ -232871,7 +235653,7 @@ pRj pRj fhW mNY -rHN +juS aQR aQR aQR @@ -232879,7 +235661,7 @@ fxR aQR csT csT -anY +cQH mNY kCn mNY @@ -232983,10 +235765,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -233039,11 +235821,11 @@ jJM mAe stt qum -diC +eeD aSH lyG rUb -hYu +hzN feJ cRg pBN @@ -233067,7 +235849,7 @@ bZx bZx snv krQ -woJ +skZ bWn eOK xMX @@ -233094,7 +235876,7 @@ wvw wzk wzk wzk -jqS +pgw iYb iYb msb @@ -233110,7 +235892,7 @@ sMS cpm pzb cRF -jwl +pua jII bln hcL @@ -233129,13 +235911,13 @@ obj vvX mNY ctI -pRp +hLZ qNv csT csT aQR eso -hAY +rop wTA mNY kCn @@ -233151,7 +235933,7 @@ wrc eVV rat dNG -sYg +sth aUj aUj stI @@ -233240,6 +236022,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -233280,11 +236066,7 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO +aBR aBR aBR aBR @@ -233308,7 +236090,7 @@ brx rai twP sPK -oal +wZD iDq bln bln @@ -233326,7 +236108,7 @@ snv krQ gYp bWn -tkB +lvm egL ssF pSu @@ -233347,7 +236129,7 @@ oVR jOi oVR dxK -kFk +xVq lnk pNs pNs @@ -233357,8 +236139,8 @@ iYb dkb kmi iYb -tAk -nyy +xaA +gnA wjv pec fJl @@ -233497,6 +236279,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -233537,35 +236323,31 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO +aBR aBR aBR aBR lbc bDu -isE +qdF cno oSC ovV -hEC +hkY feJ -mqz +pyG pdK lyG apS uCs gbJ pTN -svO +aPN hEG eRO eRO fDc -tGm +eGA iDq jSt kvh @@ -233581,7 +236363,7 @@ bZx bZx snv krQ -dHg +thI bWn oQE xMX @@ -233604,7 +236386,7 @@ aDZ mpP uLp dxK -qiu +fbw hue lVZ eYT @@ -233622,7 +236404,7 @@ cgC jaq vry cpm -gQZ +dnq ylU dnq paM @@ -233635,8 +236417,8 @@ wpu gmL paM clm -iZJ -xwt +gGH +vja smg dlR pRj @@ -233754,6 +236536,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -233793,12 +236579,8 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO +aBR +aBR aBR aBR aBR @@ -233838,7 +236620,7 @@ bZx bZx snv krQ -iVi +gYp bWn ylz xMX @@ -233875,27 +236657,27 @@ rpu ybI nnR tuz -nFg -bhK +eRZ +qpZ rAA cpm mpy sYu ckc paM -swQ +sqq nBk nBk -wDu +nIa nBk nBk -dxq +aCX paM -fgS -cFl +gZk +jZU uFh hwx -dvf +nyg pRj daS mNY @@ -233916,8 +236698,8 @@ tvF tvF izF gTK -oPo -rtP +ruO +fKe rGu aQW pVK @@ -234011,6 +236793,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -234050,12 +236836,8 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO +aBR +aBR aBR aBR aBR @@ -234065,13 +236847,13 @@ uXW vDS ijj uLV -weT +lRF feJ mgZ tDL lyG lok -eLE +nGK feJ uVu aKq @@ -234079,7 +236861,7 @@ iDq jUn eRO gIF -dUd +pNz kyy vvc lbk @@ -234103,7 +236885,7 @@ vvu joh mdM bZB -lzV +rDq iMw wZp bWn @@ -234118,7 +236900,7 @@ bMZ paK aVH xKJ -fRx +dhj kiL tOF tOF @@ -234140,7 +236922,7 @@ dVF ylU bep paM -cpO +xxQ keX kzO gdP @@ -234148,11 +236930,11 @@ ykL nZA toV paM -cFl +vkN bbo -xza -xGF -fdJ +deO +mCK +pwG pRj daS mNY @@ -234164,14 +236946,14 @@ kJV cOa che tvW -wmM +scx mNY kCn mNY gmR tMD rMG -lui +neF twt mwm btC @@ -234268,6 +237050,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -234306,14 +237092,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +aBR +aBR +aBR +bln aBR aBR nbp @@ -234328,14 +237110,14 @@ feJ cqW wHe aPW -kJO +hsN feJ uGr uGr iDq qlw cFZ -uaP +mEB iDq iDq ciG @@ -234352,7 +237134,7 @@ bZx bZx snv lwO -gYp +vTg bWn tgn bEz @@ -234390,26 +237172,26 @@ nDA vvi xpJ vYs -nDA +aol gCn pJN dZQ aNs dnq paM -cuT +fum nBk nBk gdP nBk nBk -nBk +iiT paM -fhF +jZU hFi -tyg -emi -igo +bts +nlr +oVt pRj swS mNY @@ -234436,7 +237218,7 @@ fDn fDn aMb yjV -yjV +wWa yjV nOG haf @@ -234525,6 +237307,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -234562,17 +237348,13 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO aBR aBR +aBR +aBR +bln +bln +aBR nbp mhx jeF @@ -234630,12 +237412,12 @@ qWZ bpf xRw nYv -jSk +qVp xKJ rmM pZh oYI -wzk +utN uPY knU kPv @@ -234678,7 +237460,7 @@ vHa alv vHa mbt -xUW +hKJ mNY kCn mNY @@ -234702,7 +237484,7 @@ vWr neR vWr uLH -mvX +xNC gka miS nrH @@ -234782,6 +237564,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -234819,16 +237605,12 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +aBR +aBR +aBR +bln +lBD +bln aBR nbp xKY @@ -234866,7 +237648,7 @@ mqG hzY jpd lwO -iVi +gYp bWn glP nzB @@ -234911,7 +237693,7 @@ dnq iuv gLk paM -iaQ +hGZ nBk cMS ecJ @@ -234920,10 +237702,10 @@ nBk tXY paM bbo -xwt +vja kaK bbo -opl +bOk pRj daS mNY @@ -234952,11 +237734,11 @@ eEO nMx azg azg -wCZ +fKO azg azg pJy -qQs +vEy ban wdL dso @@ -235039,6 +237821,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -235076,17 +237862,13 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO aBR +aBR +aBR +bln +uer +bln +lBD nbp mhx jeF @@ -235143,11 +237925,11 @@ wUJ ppK wna lCg -nQM +wEG ybv ybv -tAh -wjr +khV +jRg qCP aAi ybv @@ -235176,10 +237958,10 @@ pjl uOn msU paM -eWK +khu bbo -eWi -xwt +pbE +vja iRc pRj daS @@ -235196,7 +237978,7 @@ voK mNY kCn mNY -pKs +ixG aPf dzJ bAO @@ -235296,6 +238078,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -235332,18 +238118,14 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO aBR +aBR +aBR +lBD +bln +bln +bln +lBD nbp nbp mUM @@ -235365,7 +238147,7 @@ kyy bKN kyy iDq -gLl +rpT ygM mfH sDl @@ -235378,7 +238160,7 @@ lYz dkY oLW hzY -jHm +bRn fng lBt bWn @@ -235392,7 +238174,7 @@ mae pAZ usz eZL -tzR +ljx nxW utR tmQ @@ -235406,7 +238188,7 @@ xzT cHO aer cHO -dpi +rOC ybv ybv bln @@ -235416,7 +238198,7 @@ rBL fYF clE jQI -nFR +qnr jQI kta bln @@ -235426,28 +238208,28 @@ iuv atv paM nBk -nQh +svN nQh jSl cxg -rBI +pfD nnB paM -eWK +khu loq -tyg -veT +bts +erA qll pRj dPT pRj -foN +pMu gVD dxJ ajF qwe -apZ -lpH +uJH +hHF roj rIr pRj @@ -235460,7 +238242,7 @@ gTK gTK myX sSJ -gka +xFM eEh fab eDC @@ -235469,9 +238251,9 @@ nXl wuo agm fNN -esE +gbh wuo -cSH +sRL oyz mLV fDn @@ -235553,6 +238335,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -235589,21 +238375,17 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +aBR +aBR +aBR +bln +bln +bln +tGr +bln lbc nbp -rGR +mMX pVX dlK pbI @@ -235623,7 +238405,7 @@ nlp dNt mfH uJX -eKk +qky mfH sDl sDl @@ -235636,10 +238418,10 @@ jLZ jQU psN pfe -cow +aeQ gYp pfe -tNu +duq pyW stp raL @@ -235647,7 +238429,7 @@ rxA pfe pfe jII -wRC +mxM qLt uom pkW @@ -235696,11 +238478,11 @@ bCs vym vym vym -nyd +bbr wou bbr cLN -qsl +vol fmc jtM cLN @@ -235720,7 +238502,7 @@ sSJ gka uXC fab -oOk +fNv iEd wuo nnw @@ -235728,11 +238510,11 @@ spv dwy spv wuo -xFM +cSH kUz mLV -gka -ogc +fDn +lhC lhC lhC lhC @@ -235810,6 +238592,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -235846,18 +238632,14 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +aBR +aBR +aBR +bln +lBD +tGr +tGr +tGr lbc nbp nbp @@ -235933,7 +238715,7 @@ wDi qQC jtN aYq -oUE +pnz kta qQG nlT @@ -235945,10 +238727,10 @@ fdy dxU fdy nbi -sBS +cUF nQW -fdy -baO +vsz +sJq fdy fdy nbi @@ -235967,7 +238749,7 @@ kKH pRj eAj sro -aLS +kjh qkT kzA whW @@ -236067,6 +238849,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -236103,21 +238889,17 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -lbc +aBR +aBR +aBR +uer bln +tGr +tGr +tGr +lbc bln +lBD bln npb bln @@ -236164,12 +238946,12 @@ rki gOy gOy fKF -sSD +qjg utR tmQ lkI smI -gER +aog ktl dEI uab @@ -236183,13 +238965,13 @@ ybv wMz sDp tAi -aWY +xyN xGJ tsQ lSP wqj vGY -vGY +nqw vGY xXt gET @@ -236233,7 +239015,7 @@ fcg eTx fDn jQz -fab +tNx tfR iNa tLW @@ -236243,7 +239025,7 @@ uey esE uLe lGp -nzf +efV iaV fDn efE @@ -236324,6 +239106,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -236360,18 +239146,14 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +aBR +aBR +aBR +aBR +bln +tGr +tGr +tGr lbc bln bln @@ -236412,9 +239194,9 @@ csB kOF tny dLo -spM +fBF xUU -wNC +wYZ aKI xUU nKG @@ -236447,7 +239229,7 @@ tEK qQC hNg rFD -gRa +yev kta vtz fuM @@ -236466,12 +239248,12 @@ mFU cLN rWn rWn -rWn +rbs eQX rWn rWn gDV -pDr +cSP dAk jRV uOL @@ -236493,7 +239275,7 @@ fkj fab nsK dfq -dSI +ghj xBp imd imd @@ -236581,6 +239363,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -236618,17 +239404,13 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +aBR +aBR +aBR +bln +bln +tGr +tGr lbc bln bln @@ -236639,16 +239421,16 @@ oot rhf jDt wtg -loI +diq ehy -sBt +eJC mgU fUj kcc tpX oIC jjt -tpj +bvY jNp jNp jNp @@ -236675,7 +239457,7 @@ skl skl skl skl -koB +pDt tsk wLX eJz @@ -236748,7 +239530,7 @@ oEt gka gFR fab -kFZ +fyQ wuo vuK nnw @@ -236756,11 +239538,11 @@ cDK uvk cDK wuo -pry +cSH kUz mLV -gka -ogc +fDn +lhC lhC lhC lhC @@ -236838,6 +239620,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -236875,17 +239661,13 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +aBR +aBR +aBR +bln +bln +lBD +tGr lbc bln bln @@ -236900,11 +239682,11 @@ bUx bUx bUx bUx -fmL -eGj +kpX +jmy xMn cAC -jjt +nRm bRG hfA idv @@ -236934,7 +239716,7 @@ deY wAZ oAz uLC -nxf +xQg fwm utR tmQ @@ -236948,7 +239730,7 @@ pPN oqz kOX oqz -qDy +oXg ybv ybv bln @@ -236958,14 +239740,14 @@ sGv rFf clE jQI -uLo +drE jQI kta bln pAZ bep iuv -pbu +vXh xVK flI evb @@ -236999,7 +239781,7 @@ sOE wcx mGV qnC -efU +sIp uif wRd gka @@ -237009,11 +239791,11 @@ iag loc hNI wuo -esE +fRv fNN esE wuo -cSH +hqE iam mLV fDn @@ -237076,40 +239858,29 @@ wNO wNO wNO wNO -"} -(117,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +"} +(117,1,3) = {" +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO +wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -237143,6 +239914,17 @@ wNO wNO wNO wNO +wNO +wNO +wNO +wNO +aBR +aBR +aBR +bln +bln +lBD +tGr lbc bln bln @@ -237150,14 +239932,14 @@ bln lbc bln bln -bln +lBD bln lSu bUx jOQ bxQ bUx -wSE +wzz vxc aKt tDk @@ -237199,11 +239981,11 @@ dtr gKG iBe lhv -dyQ +xpw ybv ybv -pTh -ngx +rox +cBU twK aES ybv @@ -237222,7 +240004,7 @@ bln pAZ dnq iuv -sWQ +yas xVK hJY eUW @@ -237245,7 +240027,7 @@ tKi kna ydg dAm -nYY +szR dcC jGB akz @@ -237352,6 +240134,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -237389,32 +240175,28 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -mZf -oot -oot -ajx -rwt -aBR aBR aBR aBR aBR +bln +bln +bln +mZf +oot +oot +ajx +qVo +bln +bln +bln +bln +bln bUx xmO ubE bUx -iLe +iQj aOS rud cAC @@ -237452,7 +240234,7 @@ dnq nfk utR tmQ -gZj +qnV gKk kBr lhv @@ -237493,9 +240275,9 @@ aRR tRZ oyj gwK -kYh +nEV bry -cte +jkx fLq hro tKi @@ -237511,7 +240293,7 @@ bup ojv htc mDw -vTi +jDT qKQ aTj uif @@ -237522,11 +240304,11 @@ fab bjl shB shB -gVr +naU cll shB yeD -anI +nka iCg kql oNO @@ -237609,6 +240391,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -237647,26 +240433,22 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -aBR -aBR -aBR -aBR -aBR -aBR -aBR aBR aBR aBR +bln +uer +bln +lBD +bln +bln +bln +npb +bln +bln +bln +tGr +tGr bUx xmO deY @@ -237714,7 +240496,7 @@ qWZ dWX wKI iFs -jSk +qVp lpM mjs hsx @@ -237744,7 +240526,7 @@ pGZ cvS gDp kRP -llR +lyq xBN bfU aSu @@ -237767,7 +240549,7 @@ sCA rSP uKM uaz -mCZ +vqf dfa ixZ rGu @@ -237786,7 +240568,7 @@ vWr kQt vWr nsv -kAT +tpk gka oWQ dcO @@ -237866,6 +240648,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -237904,26 +240690,22 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -aBR -aBR -aBR -aBR -aBR -aBR -aBR aBR aBR aBR +bln +bln +bln +tGr +tGr +bln +bln +npb +bln +tGr +tGr +tGr +tGr bUx hJe xmO @@ -237933,7 +240715,7 @@ kzw kzw cAC xAQ -mEI +voA jNp jNp jNp @@ -237967,7 +240749,7 @@ xwC utR pAZ bln -qWZ +aAf oxe vmj aqB @@ -237982,7 +240764,7 @@ ghJ uEm sqU lpM -rLe +klP euf jzn mhQ @@ -238001,7 +240783,7 @@ lIQ cvS gDp kRP -pcs +uzf pcs bfU ecs @@ -238027,15 +240809,15 @@ sCA qnC qnC qnC -aPr +tzH uif wRd fDn fDn bfL dXn -joW -ner +mmk +qZQ ead xwE ner @@ -238123,15 +240905,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -238176,6 +240953,11 @@ aBR aBR bln bln +tGr +tGr +lBD +bln +mlS bln xAs nXb @@ -238185,11 +240967,11 @@ ykw eyb gck ykw -fXi +sLj vhL law eqI -rAN +ewM wAT lbk bln @@ -238243,7 +241025,7 @@ anu jly fXb mhQ -nKe +eeq jUD nZb lRf @@ -238264,19 +241046,19 @@ cAR kNk tmA bNE -jfD +hht gMN xnE tvd egV ozn -wCx +syU vYJ fGn iSL vzU pZn -cOZ +bBd xSv aIg rjh @@ -238380,6 +241162,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -238419,18 +241205,14 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO aBR aBR aBR +aBR +lBD +tGr +tGr +tGr bln bln bln @@ -238439,7 +241221,7 @@ bln bln sEB ykw -rVy +nEs wOc lEj cKv @@ -238462,16 +241244,16 @@ jOQ yab npa rMN +oyv alO -gmn rMN agp alO rMN -gmn +alO alO qCI -eXM +sJk uGa rKe iMo @@ -238493,12 +241275,12 @@ xbo anu fue dmG -cyF +uPB xLF lpM oGQ wKw -kpp +vFb mhQ hUV aks @@ -238519,7 +241301,7 @@ qNl fkO tjY aMr -qkn +cwj keP cRO guU @@ -238548,7 +241330,7 @@ eZP gKl tlh tCW -jnw +oGy fDn lhC hte @@ -238556,7 +241338,7 @@ hte hte bEa dCy -qzR +dMK gka bln bln @@ -238637,14 +241419,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -238690,16 +241468,20 @@ aBR aBR bln bln -xiI -bln -bln +tGr +tGr bln +lSu +xiI +mBh +oot +oot kei pDC clq qgO qgO -qgO +bqx xQG ykw mfH @@ -238731,7 +241513,7 @@ iPm iPm iPm rzk -xnQ +hay cfr dct iuv @@ -238779,18 +241561,18 @@ hDh vnt keP kRw -eJn +ctr avk gxP bID -eVz -oPx +tZO +uCK nKj fwW uxp afK bOy -jMp +vfU pdV hqV pie @@ -238799,7 +241581,7 @@ qWy pna hqV uge -mFK +xrg dxn aPD aPD @@ -238807,9 +241589,9 @@ vlb fKf pst bWQ -dCy +xRZ jer -wLI +xJT eCp eCp uYO @@ -238894,14 +241676,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -238945,21 +241723,25 @@ wNO aBR aBR aBR +aBR +bln bln bln +lBD +bln bln bln bln bln sEB ykw -rVy +dtz lEj fCW nUg dKP ykw -ybD +tSi kfc dcX lbk @@ -239044,7 +241826,7 @@ bID bID bID cfT -qXW +kvH uIz bID bID @@ -239151,6 +241933,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -239192,18 +241978,14 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +aBR aBR aBR aBR bln bln +lBD +bln bln bln bln @@ -239213,7 +241995,7 @@ mvl mvl mvl kkl -ezO +nUg qOP ykw nOQ @@ -239287,7 +242069,7 @@ lBS aTp lvB kRP -pqk +wpp rzj mRG bIU @@ -239316,7 +242098,7 @@ qwF qwF qwF aPD -eYA +cht eiI bum wWM @@ -239408,6 +242190,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -239449,13 +242235,8 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +aBR +aBR aBR aBR aBR @@ -239464,17 +242245,18 @@ bln bln bln bln +lBD tCR lGK -sNb +jRP bLd -dAa +wbG kkl dhU xQG olY hQi -mAl +rRM mFQ lbk bln @@ -239504,7 +242286,7 @@ bwr qKX hsB uja -gQZ +dnq iuv utR pAZ @@ -239517,7 +242299,7 @@ tEd lpM eEC aTw -lmo +iFL hpe wwB mBX @@ -239665,13 +242447,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -239716,9 +242495,12 @@ wNO aBR aBR aBR +aBR +aBR +aBR bln bln -bln +uer bln bln tCR @@ -239727,7 +242509,7 @@ gWX bEf iME tsH -bLb +qhP xQG ykw pDB @@ -239752,7 +242534,7 @@ kCb gya tfO urd -ueX +xTU uja aty ehm @@ -239810,17 +242592,17 @@ sVL jlV hHN hHN -axM -mYZ -rPd +iRw +cYf +bSG uop -caS +tHj hHN wAB jkW laV hHN -eBT +cDz tBL hpI sEB @@ -239922,12 +242704,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -239973,10 +242753,12 @@ wNO aBR aBR aBR +aBR +aBR bln bln bln -bln +lBD bln tCR nKR @@ -240018,7 +242800,7 @@ kDz chB twU uja -dnq +gQZ iuv dnq mny @@ -240030,17 +242812,17 @@ wVR mfW kXE mfW -mfW -gBk -xQO +sbT +eta +brp mfW mfW ccs amN hHu +tZZ vBh vBh -tZZ dqs aVw gxq @@ -240066,13 +242848,13 @@ tTY hHN jlV hHN -rET +pkQ cEw cEw cEw cEw cEw -jaN +rII fwq hHN lRR @@ -240087,7 +242869,7 @@ mDX mDX qwF aPD -alD +noM tjk ydc nyA @@ -240175,15 +242957,14 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +bln +bln +bln +bln +fuZ +hHG +hHG +hHG wNO wNO wNO @@ -240230,6 +243011,7 @@ wNO aBR aBR aBR +aBR bln bln bln @@ -240239,9 +243021,9 @@ tCR dcx ihb bnM -mWq +iRM kkl -viO +qFq gUs ykw lbk @@ -240265,7 +243047,7 @@ ygB ybE eKJ ulk -pkM +nlI uja uja uja @@ -240273,7 +243055,7 @@ eQN uja uja uja -xWG +hsB uja ise lyh @@ -240326,7 +243108,7 @@ aap dUv cEw rLs -rLs +xUV xmL cEw cmJ @@ -240335,7 +243117,7 @@ tyb nrA flH lxu -dAg +wQF qxo eVC qwF @@ -240431,16 +243213,15 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +lBD +lBD +bln +tkU +bln +vbG +hHG +hHG +hHG wNO wNO wNO @@ -240487,9 +243268,10 @@ wNO aBR aBR aBR +aBR bln bln -bln +lBD bln ykw mvl @@ -240522,7 +243304,7 @@ ipx seH lvY mmA -gHj +vTA uja vmp vmp @@ -240530,13 +243312,13 @@ kxN uja oUO oUG -hsB +xWG uja fbt aPo qnf xzh -bWL +otQ dnq apb dby @@ -240559,9 +243341,9 @@ mpy dnq dnq ivo -dnq -xdW ikC +xdW +dnq dnq dnq sAC @@ -240569,10 +243351,10 @@ cvS sxu kwX pNq -pNq +kVW gDp rxa -jtl +qgm kdc mFt kdc @@ -240581,11 +243363,11 @@ kjy grI ruI ubF -fFv +vwj wwu kwm wwu -wWt +ekh eVI gmJ npJ @@ -240607,7 +243389,7 @@ oHp nyA ybq lhO -bRZ +fFi duh bln bln @@ -240686,17 +243468,17 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +bln +bln +lBD +vbG +tkU +tkU +tkU +vbG +hHG +hHG +hHG wNO wNO wNO @@ -240750,11 +243532,11 @@ aBR aBR ykw ftA -mpR +unC cLB arT eyb -iKS +rdw xIk bYF ykw @@ -240765,10 +243547,10 @@ bln bln fsm bUx -vzf -jOQ -ykA -ykA +cCC +kEo +kNz +oCl skl iHz jOQ @@ -240776,7 +243558,7 @@ skl pOo piC ygB -sIV +fXo aos rBn sYb @@ -240809,11 +243591,11 @@ azw mao azw azw -gIY -gIY -gIY -gIY -gIY +vTc +vTc +vTc +vTc +vTc cvS cvS cvS @@ -240829,7 +243611,7 @@ uiI qzF gDp kRP -csZ +kRJ gcV jug lwi @@ -240840,7 +243622,7 @@ iSl gdv yiv tbh -bIs +jTT tbh yiv vtv @@ -240848,7 +243630,7 @@ hHN hHN nrA hQu -eBT +cDz snW hpI sEB @@ -240943,19 +243725,19 @@ wNO wNO wNO wNO +bln +uer +bln +enX +tkU +tkU +tkU +xXk +hHG +hHG +hHG wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +tkU wNO wNO wNO @@ -241022,13 +243804,13 @@ bUx bUx bUx bUx -aJi +wnq dqv cKn -ykA +oCl skl kUG -ykA +oCl skl gmW gmW @@ -241050,7 +243832,7 @@ idw eZj iuE bPg -cKp +uoz kDP kmQ xgy @@ -241079,7 +243861,7 @@ bEB kNA mOo jPh -tYJ +ljD azf kRP kRP @@ -241200,21 +243982,21 @@ wNO wNO wNO wNO +bln +aaX +vbG +tkU +tkU +tkU +tkU +xXk +hHG +hHG +hHG wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +tkU +tkU +tkU wNO wNO wNO @@ -241263,7 +244045,7 @@ aBR aBR aBR ykw -fhV +xIp kYI kYI bOg @@ -241304,11 +244086,11 @@ uja uja uja pBr -wmy +csR njn pix reh -eqL +joG jVq xgy xgy @@ -241323,11 +244105,11 @@ rEp fTC blU azw -qvZ +eul hhT vnN pQp -ovX +wpZ cvS ril eHe @@ -241343,7 +244125,7 @@ vnY kRP sqN kRP -spq +rKv tyS whf sjk @@ -241457,21 +244239,21 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +bln +fhB +vbG +tkU +tkU +tkU +tkU +xXk +hHG +hHG +hHG +tkU +tkU +tkU +tkU wNO wNO wNO @@ -241561,12 +244343,12 @@ oYH eBi duV fKw -wmy +csR vRE weY mpU -qdo -quZ +rFr +nAM toH toH bEq @@ -241574,7 +244356,7 @@ kHV hmb lso dEV -ieZ +kHI azw feU fTC @@ -241582,7 +244364,7 @@ qEj azw tJV orE -tyf +aTE hMH yiK cvS @@ -241714,22 +244496,22 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +bln +lBD +vbG +tkU +tkU +tkU +tkU +bln +hHG +hHG +hHG +tkU +tkU +tkU +tkU +tkU wNO wNO wNO @@ -241780,7 +244562,7 @@ ykw kON rax wWU -xjL +esS evw aML iLv @@ -241799,7 +244581,7 @@ xNk byP mOf fhz -vEE +jPv skl hYC eOl @@ -241808,7 +244590,7 @@ owU owU tkV qwP -kxX +kOB gmW ofT ePl @@ -241817,16 +244599,16 @@ ojD ykZ vqD keq -uKg +asJ qYD oUK gEL mpU qFC -nKn kTO +wvc kTO -rwv +pXz sIm hmb lso @@ -241841,7 +244623,7 @@ azw azw azw mGs -gIY +vTc cvS kSn vEN @@ -241853,7 +244635,7 @@ ohp ohp ohp pNq -uQK +dXU kRP gDp kRP @@ -241864,19 +244646,19 @@ dFp nJI hoV oyX -xfB +bWy khe oSX oyX -xfB +bWy cHm xfB oyX -xfB +bWy jHQ xfB gBx -rkm +qNF sEX hpI sEB @@ -241971,22 +244753,22 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +lBD +lBD +vbG +tkU +tkU +tkU +tkU +bln +hHG +hHG +hHG +tkU +tkU +tkU +tkU +tkU wNO wNO wNO @@ -242051,7 +244833,7 @@ rFP rFP rFP skl -jYP +xSt deY skl eYL @@ -242088,7 +244870,7 @@ exw exw cwh dEV -bai +jyp azw mEi eyc @@ -242098,18 +244880,18 @@ biR dmI tdE veU -tIt +vEQ kRP kRP oiB kRP +pao cGA -wba ohp ohp ohp ohp -nva +ghz ktB kRP gDp @@ -242123,7 +244905,7 @@ hIA iXq hLS ifY -sgJ +oZL rxf sEF nom @@ -242132,7 +244914,7 @@ meT xGM gHl flH -bOY +afR rPn kqq cnq @@ -242228,22 +245010,22 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +lBD +lBD +vbG +tkU +tkU +tkU +tkU +bln +hHG +hHG +hHG +tkU +tkU +tkU +tkU +tkU wNO wNO wNO @@ -242322,7 +245104,7 @@ iay dCF xbc nxY -vGh +eBk gmW exw exw @@ -242332,14 +245114,14 @@ exw jPa enG mdZ -nHa +vlI nHa izC -rXd -aAc +hwM +aUY igi -bOu -nNG +xbj +rdB lEO khA lso @@ -242350,11 +245132,11 @@ mIt xni hBd aMP -scY +dQo oQD hHI ihr -niu +fBR fKi tHr euR @@ -242485,21 +245267,21 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +bln +bln +vbG +tkU +tkU +tkU +tkU +bln +hHG +hHG +hHG +tkU +tkU +tkU +tkU wNO wNO wNO @@ -242582,7 +245364,7 @@ vfW sfA dIe sUO -pNj +dIn xFA aTV rQt @@ -242591,13 +245373,13 @@ tGZ tqZ mrF iFc -wJd +bJA mIB uUV fmD fmD fmD -iMh +wyQ lso lso lCi @@ -242616,7 +245398,7 @@ tZm pBA aQZ uNq -ujI +dTW vND exe kRP @@ -242742,21 +245524,21 @@ wNO wNO wNO wNO +bln +bln +vbG +tkU +tkU +tkU +tkU +fuZ +hHG +hHG +hHG wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +tkU +tkU +tkU wNO wNO wNO @@ -242842,12 +245624,12 @@ whu rtc rtc jJf -dlV +voM etA jFA mnj uVn -wxR +nnW wvb meB meB @@ -242859,7 +245641,7 @@ mVh mVh vwO hHg -kLI +bai azw nbd uTk @@ -242874,7 +245656,7 @@ gTi whh pQL nCV -qfy +lGh txo kRP kRP @@ -242999,20 +245781,20 @@ wNO wNO wNO wNO +bln +bln +lBD +jpx +tkU +tkU +tkU +vbG +hHG +hHG +hHG wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +tkU +tkU wNO wNO wNO @@ -243103,10 +245885,10 @@ tGZ oBp mdZ mdZ -snE -jtu +dqd +bfZ izC -nOB +bHG rRy rRy mdy @@ -243134,8 +245916,8 @@ art tHr tHr tHr -kDa -gZz +bpZ +chW pBA xfb dpB @@ -243256,17 +246038,17 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +bln +bln +lBD +vbG +tkU +tkU +tkU +vbG +hHG +hHG +hHG wNO wNO wNO @@ -243356,7 +246138,7 @@ mdZ gzw kiB kQX -xLn +kyZ kZz mdZ rth @@ -243367,7 +246149,7 @@ jRA jRA jRA ixH -fmD +aWI ptO ibI lso @@ -243388,14 +246170,14 @@ lwQ sEK eHg ahL -uwG -jYg +wVw +xyy bCr bYK srn pBA drH -maU +vSx kRP gDp cvS @@ -243513,17 +246295,17 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +bln +uer +lBD +bln +jpx +tkU +tkU +vbG +hHG +hHG +hHG wNO wNO wNO @@ -243622,7 +246404,7 @@ iFc izC jRA jRA -dGP +jRA fZo nGz izC @@ -243641,7 +246423,7 @@ iBj mcW sFG lwQ -fIu +kmG cyo kpO lup @@ -243770,17 +246552,17 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +bln +bln +lBD +bln +bln +bSz +bSz +vbG +hHG +hHG +hHG wNO wNO wNO @@ -243870,7 +246652,7 @@ mdZ mdZ nsf dCk -wwo +wBR mdZ iWr iWr @@ -243887,7 +246669,7 @@ tLF lso qGV dEV -bai +jyp hgh czS fVo @@ -243903,7 +246685,7 @@ evp juw tkf ikz -lbC +oSQ tHr pBA pBA @@ -244027,21 +246809,21 @@ wNO wNO wNO wNO +bln +bln +lBD +bln +rST +bln +bln +qRv +hHG +hHG +hHG wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +khz wNO wNO wNO @@ -244127,18 +246909,18 @@ mdZ qqx shh fgE -rDE +oSI mdZ -vMi +umv pyj lnq hnf -bdP +vlq rga -fAc +vbb pxs iAJ -eCA +afv ihf uMu lso @@ -244161,10 +246943,10 @@ lux eHZ lux fUL +qyO evp evp -evp -ucp +owr eWT hpp kRP @@ -244227,7 +247009,7 @@ sEB mfD mfD xow -syY +gOg aFi mfD ptY @@ -244284,18 +247066,18 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +lBD +bln +bln +bln +lBD +bln +bln +bln +xDQ +xDQ +bln +khz wNO wNO wNO @@ -244381,7 +247163,7 @@ knl knl knl mdZ -jBw +tvI shh hBR bxv @@ -244401,9 +247183,9 @@ laP lso rvZ dEV -kLI +bai xjg -beh +mUR mnF lKZ xGh @@ -244454,9 +247236,9 @@ mIE mdQ xTu kJK -qOk +kmD nDq -liW +jXr aLJ puf haC @@ -244482,7 +247264,7 @@ bln bln bln mfD -bRO +khy xpP ghY ccw @@ -244541,17 +247323,17 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +lBD +lBD +bln +bln +lBD +bln +lBD +bln +wUD +wUD +bln wNO wNO wNO @@ -244638,7 +247420,7 @@ knl knl hNx mdZ -eCq +lyW shh fgE shh @@ -244798,17 +247580,17 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +bln +bln +bln +bln +bln +bln +lBD +lBD +wUD +wUD +bln wNO wNO wNO @@ -244903,14 +247685,14 @@ mdZ uOH rDF rSK -rBt +jfZ gyr xdA gyr xdA gyr xdA -wvN +sSh uMu lso lso @@ -244922,7 +247704,7 @@ jOz dEg vBD hgh -qPu +eei niu pZm bEL @@ -244939,7 +247721,7 @@ mmh ikz piI cvS -nkX +kRP kRP kRP kRP @@ -244952,7 +247734,7 @@ uep cvS lUU kRP -oWj +pSk pOy pOy njA @@ -244963,7 +247745,7 @@ hGs gOY ylM vep -trf +jWt cXV nDq etB @@ -245016,12 +247798,12 @@ iHp iHp iHp iJO -nrB +cxl oVz iJO mYh oVz -nrB +cxl iJO iHp iHp @@ -245055,17 +247837,17 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +bln +bln +bln +bln +lBD +lBD +bln +bln +wUD +wUD +bln wNO wNO wNO @@ -245155,11 +247937,11 @@ mdZ mdZ tDv lqB -fRI +skf mdZ -fWr +btp ggD -pNV +lBy cpY pxF iYi @@ -245199,18 +247981,18 @@ mPv cIU mlR rWW -rtv -tCE +atb +iHZ uOg kRP -auq +pAN mRu uep vsZ hnd kRP lop -aJL +don gJs gJs vZD @@ -245261,16 +248043,16 @@ pnR hHb oyW oyW -act +jtm hzH oyW bqt -act +jtm oyW oyW iHp -pfs -ejO +lLl +ozb ujs iJO ogF @@ -245312,17 +248094,17 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +lBD +bln +bln +lBD +bln +lBD +bln +bln +rPp +rPp +bln wNO wNO wNO @@ -245410,11 +248192,11 @@ knl knl mdZ wEa -gOR +tki kQX vLn mdZ -wbB +gHR lxf eBa qZB @@ -245429,24 +248211,24 @@ cpY cGZ lCi vwO -qZl +pxn xjg -okq +swI mTS obu mjI fCM qPu niu -xoy +uOW lwQ -cck +ade oeW aTZ fle pyu -qLo -tWL +oul +wRG rsR svq vtk @@ -245462,7 +248244,7 @@ cwu kRP kRP kRP -owe +ybO hlp cGA kRP @@ -245511,22 +248293,22 @@ nFk fQu aiY pnR -mXP -dab +xfg +rjH iAk aRD hHb -aqU -aqU -aqU -aqU -aqU -jXw -jXw -jXw -aqU +pza +pza +pza +pza +pza +sML +sML +sML +pza iHp -qGj +lNc euc ujs mYh @@ -245569,21 +248351,21 @@ wNO wNO wNO wNO +lBD +lBD +uer +lBD +bln +bln +bln +kPS +hHG +hHG +hHG +khz wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +khz wNO wNO wNO @@ -245668,8 +248450,8 @@ knl mdZ aWS tGZ -taK -djT +ayk +vQN mdZ acx xlv @@ -245744,8 +248526,8 @@ iDQ msN gVC lyH -uxF -bZf +isu +lmy wvI bln bln @@ -245826,17 +248608,17 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +lBD +lBD +lBD +lBD +bln +bln +uer +vbG +hHG +hHG +hHG wNO wNO wNO @@ -245924,9 +248706,9 @@ gmW gmW mdZ mdZ -syL +fCY kQX -tGZ +qaf mdZ ptp ggD @@ -245968,13 +248750,13 @@ iyK tOO qQp qQp -mMl +lWj rZm sOO lRD gbP jxv -cHs +wPX cvS cvS cvS @@ -245994,15 +248776,15 @@ vep pBI sCm gGo -uqH -qXk +bTQ +xAm qSC ldr oOx mgD -pmb -hPD -haQ +oKL +elT +kDc pKY tZa bln @@ -246025,22 +248807,22 @@ iqu fcu uOk pnR -usQ +oTS oPv iAk -aeg +mWw hHb -aqU -aXM -aXM -aXM -aqU -aqU -aqU -aqU -aqU +pza +uNE +uNE +uNE +pza +pza +pza +pza +pza rcO -mYh +wLK mEx ujs mYh @@ -246089,11 +248871,11 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO +bln +bln +hHG +hHG +hHG wNO wNO wNO @@ -246200,7 +248982,7 @@ oKb uXm lso qEM -pJC +mbk nKa dhk cDT @@ -246289,15 +249071,15 @@ pnR hHb oyW oyW -qMQ +jtm oyW rsL uvX -qMQ +jtm oyW oyW iHp -iKr +eoE iST ujs iJO @@ -246346,11 +249128,11 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG +hHG wNO wNO wNO @@ -246432,7 +249214,7 @@ dGO vKE uNA kXu -jBl +dNZ gmW bln kKL @@ -246442,7 +249224,7 @@ kKL mKh kKL kKL -sIC +hBc xlv iXH qZB @@ -246459,7 +249241,7 @@ lso cbs nGA nKa -seE +nTV jPl bjm kXM @@ -246503,12 +249285,12 @@ nZH msT npD npD -sPx -sPx +hRe +hRe alq -gKq +dFA sZF -uNw +nBQ sZF bln bln @@ -246558,12 +249340,12 @@ iHp iHp iHp iJO -avr +iMp oVz iJO mYh oVz -avr +iMp iJO iHp iHp @@ -246603,11 +249385,11 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG +hHG wNO wNO wNO @@ -246686,10 +249468,10 @@ bln bln bln dGO -bHL +lQV vKG kXu -aEk +jKV gmW bln kKL @@ -246747,7 +249529,7 @@ iML iML nHX hRA -lWK +ist rkL uFz tFV @@ -246759,13 +249541,13 @@ bPY rwe wGO npD -oUi -sPx -fjp -gKq +vMN +hRe +ves +dFA iye sZF -eZu +lNE sZF bln bln @@ -246860,11 +249642,11 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG +hHG wNO wNO wNO @@ -246950,21 +249732,21 @@ kKL kKL kKL kKL -mTk -bZG +tFf +baq kKL lli iCC kKL fbm -gjh -laQ +bQP +llG bzn fyh -nTI +sMb wKm -wqZ -fRF +pAp +haN kqA tUS cpY @@ -246973,11 +249755,11 @@ lso brj pJC vBG -eWn +dkg tLp eLn hKr -pRI +lQG oxU pxX bCf @@ -247016,13 +249798,13 @@ ebr iJK iBz npD -coK -kvn -sPx +gMT +tFt +hRe tbQ iye sZF -sOo +ddA vjZ bln bln @@ -247052,7 +249834,7 @@ swF swF swF oiy -wRJ +uZD hsh kCV bkr @@ -247117,11 +249899,11 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG +hHG wNO wNO wNO @@ -247208,7 +249990,7 @@ lli lli bMF ojV -gbB +fYe kKL lli lAG @@ -247230,7 +250012,7 @@ rqT pfB gBq vBG -dcZ +rMS pKw xcu jQd @@ -247276,10 +250058,10 @@ npD fWL qUM fZT -gKq -xVU +dFA +axC sZF -eZu +uNw vjZ bln bln @@ -247311,7 +250093,7 @@ bln oiy oiy kHU -jiZ +vAU alK oiy ptY @@ -247374,11 +250156,11 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG +hHG wNO wNO wNO @@ -247526,13 +250308,13 @@ sZF hil mlo npD -kpM +wPE iJK pyY npD vBa vLo -aVg +hyL tbQ iye sZF @@ -247631,11 +250413,11 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG +hHG wNO wNO wNO @@ -247735,14 +250517,14 @@ hao kKL cSQ kKL -eie lli lli -wwG +lli +xbf kKL rjP qEM -pxn +xcJ vBG vBG vBG @@ -247762,23 +250544,23 @@ krx ufN vCz ufN -lTG +iZx dDw -nEb +qHz ekE fzo czF qaU jtH -sHf +qpb mFE iZR nuN tMO -hOJ +hpB jDc tMO -gSa +nMb sZF qwO wRr @@ -247788,9 +250570,9 @@ hcG bEH npD vtr -wkZ -dEi -gKq +mmC +iQw +dFA oMs sZF eZu @@ -247888,11 +250670,11 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG +hHG wNO wNO wNO @@ -248007,7 +250789,7 @@ oeM vBG rjt wLY -xEs +aBi vBG oEF bZb @@ -248021,21 +250803,21 @@ xCQ ufN sVm dDw -nio +srb dUr wuv vds nmC cEo -rGk +kQJ mFE dRe -dmO +bsi cmy nAN kCo ezf -asL +cnb sZF sKf wRr @@ -248146,10 +250928,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -248260,13 +251042,13 @@ lso bGT vBG wvW -lmM +moG vBG -tGO +ayR oMR hsC vBG -oId +uSS xrb qhN amE @@ -248274,7 +251056,7 @@ lei klc slK hXU -bba +oRu hIe uKj dDw @@ -248403,10 +251185,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -248480,12 +251262,12 @@ kxv fIs kxv gHv -kxv +tip pHd -tvZ -tvZ -tvZ -tvZ +gbf +gbf +gbf +gbf kKL gAt orf @@ -248520,11 +251302,11 @@ loG iOu sZF sZF -dcz +puB sZF sZF -fUb -jCY +sxw +ayI ktD mSM ozN @@ -248537,21 +251319,21 @@ sZF sZF fLQ mjH -nWQ +qLy obr xMM nqd -vzR +ttO mFE xZo pWY rQI phj -hMv +oqT tMO -cAA +vIe sZF -mEK +xsA wRr lXm sKf @@ -248660,10 +251442,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -248739,10 +251521,10 @@ lQf swt xTp pDQ -nJs +xBL wJM wJM -tvZ +gbf kKL dnL orf @@ -248810,7 +251592,7 @@ sZF sZF hEZ mlo -sKf +sez sKf sZF sZF @@ -248917,10 +251699,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -248999,7 +251781,7 @@ mHB pVl kKL bqe -tvZ +gbf kKL hOu orf @@ -249174,10 +251956,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -249256,7 +252038,7 @@ cvF lli kKL mwu -tvZ +gbf kKL kKL lAG @@ -249431,10 +252213,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -249513,7 +252295,7 @@ oCv gGF kKL qqB -tvZ +gbf kKL weF orf @@ -249547,9 +252329,9 @@ tlP wIg vzX bJJ -gzB +cyX sZF -jJu +npD npD npD npD @@ -249688,10 +252470,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -249775,7 +252557,7 @@ kKL hOu orf hJx -mHx +mzM hUi kKL uar @@ -249787,9 +252569,9 @@ kKL kKL cIP dtb -dgm -dtb -pgi +ndO +jSC +bdS dtb hUD iko @@ -249807,7 +252589,7 @@ hOY dbx uvt awK -ltz +ppQ mrA mtI axc @@ -249823,7 +252605,7 @@ dAB ily ily ily -rSz +ily ily ily qLY @@ -249832,15 +252614,15 @@ qFp fvk bfN ily -gOM -ily +qeQ ily +rSz ily ily ily -rSz ily ily +rSz ily hnN ily @@ -249945,10 +252727,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -250027,7 +252809,7 @@ rSq raH kKL lli -tvZ +gbf kKL kKL orf @@ -250063,18 +252845,18 @@ vvP mxD cgZ uvt -iII +iBa pra dyW mtI -mGB +lUf keZ owC jIP qOH veX wHc -eEb +sKV pTU itt ily @@ -250202,10 +252984,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -250284,7 +253066,7 @@ kKL kKL kKL xcp -tvZ +gbf sin niB iOc @@ -250318,11 +253100,11 @@ aID ddk ddk dry -apM +edq uvt -kBT +icI pra -nOU +ctY mtI uxj eNK @@ -250331,7 +253113,7 @@ wAx jTZ ftt wHc -onW +oMT emK uvU ily @@ -250341,7 +253123,7 @@ ily ily ily qLY -jKY +oCA fvk fvk rMY @@ -250459,10 +253241,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -250537,11 +253319,11 @@ bln bln kKL hTB -qRH +sRI jwF kKL lli -sRI +jNS paT lli lli @@ -250560,12 +253342,12 @@ blV sEi sEi fQz +oBI sEi -sEi -kpU +mMD nVr wFO -nRx +bzA hUD lso byK @@ -250579,9 +253361,9 @@ cLo uvt fJF oed -lBX +wkH mtI -naW +uRL xmf owC tVn @@ -250597,7 +253379,7 @@ dfe dfe dfe ehO -kcA +lDX cpg cpg cpg @@ -250616,8 +253398,8 @@ bCL ofr sBx hfc -giH -qLY +jCE +adY tmR sZF pHR @@ -250716,10 +253498,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -250793,12 +253575,12 @@ bln bln bln kKL -eTY +cjO qeJ -lRs +heW osq -lli -gGF +tDy +qRt kKL kKL kKL @@ -250808,13 +253590,13 @@ kKL kKL gkP kKL -bjE +wKY eSn bJQ qCA vvL prg -sEi +oBI sEi sEi fQz @@ -250826,7 +253608,7 @@ vfo hUD lso cYE -lso +mpZ ult bsG wGF @@ -250848,8 +253630,8 @@ wHc ccW nhf mfV -jSm -ltj +xpA +uHc cpg qGi cpg @@ -250874,8 +253656,8 @@ ffz bzB diL vTJ -tIv -tmR +apT +sEB vjZ laf wEV @@ -250973,10 +253755,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -251065,7 +253847,7 @@ nqn kKL gkP kKL -sqs +yfY huB ogd hff @@ -251083,13 +253865,13 @@ cLJ iQQ lso cYE -mpZ +lso ult wjz tXh shG shG -uzK +otK iIe pKJ rIU @@ -251130,8 +253912,8 @@ wPd wPd wPd ega -qUv -apT +bcE +qLY sEB vjZ dAP @@ -251230,10 +254012,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -251322,7 +254104,7 @@ ydD kKL gkP kKL -tRE +flV ivH lVF pup @@ -251338,11 +254120,11 @@ pDS sEi bwl hUD -lso +jyg cYE acw ult -fcC +hpC rIU rIU tJI @@ -251353,7 +254135,7 @@ fiS uTL mtI nRX -dQO +jVL owC owC owC @@ -251363,10 +254145,10 @@ mYq nyH lFW rEd -cUT +dnU gSN jbU -ejZ +wnX drr hvm pvB @@ -251385,11 +254167,11 @@ drr pvB ehd orv -rUP -rUP +aCb +aCb vfq -tIv -tmR +apT +sEB vjZ pHR wEV @@ -251487,10 +254269,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -251607,14 +254389,14 @@ qYw fPA cOC pVV -vaw +aEG mtI nRX eNK aHT dfw stQ -jui +pKB jbU ozA gqT @@ -251644,8 +254426,8 @@ hfc hfc hfc hfc -yew -qLY +hfc +adY eAw sZF pHR @@ -251744,10 +254526,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -251836,17 +254618,17 @@ kKL kKL vXb kKL -gUo +kCg gjc bLQ -rzc +vaE tSt hUD hUD hUD hUD srk -kgm +dal ssq sEi sEi @@ -251873,14 +254655,14 @@ xyz idj eoO jbU -gEw +vLj bHa oMT gaT bZc iOO jbU -kZd +ily hdH qhL dkK @@ -252001,10 +254783,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -252100,7 +254882,7 @@ vvJ hUD ybr bpL -vQY +pIw hUD ktz prg @@ -252114,7 +254896,7 @@ rNQ lso aop yar -kKI +mdl rIU rCX lWc @@ -252130,14 +254912,14 @@ pHa fca vsk jbU -mcl +pEE cAG nbq hAq nDB -gcx +nfW jbU -iZc +lhu hdH urJ ppp @@ -252258,10 +255040,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -252347,7 +255129,7 @@ wsO bcC bcC bcC -bcC +czx unu kKL hno @@ -252355,18 +255137,18 @@ poy poy vvJ hUD -htN +sYe xUH dYt nyl prg tyv -oGS +qvF cHh cHh -nuw +osd hUD -lso +dFO cYE lso hDb @@ -252392,13 +255174,13 @@ dUe ank wgH fUM -vaQ +wlW jbU kHN kra qhL ppp -xJG +ily ily ily oqM @@ -252515,10 +255297,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -252591,12 +255373,12 @@ bln bln bln kKL -nap +pGJ fDl jwF pLv tjN -oTK +hbI vah tDy oXm @@ -252604,7 +255386,7 @@ bcC lli hJx weF -lli +bPy aME kKL qLf @@ -252614,10 +255396,10 @@ lNk hUD jEr rGd -hrd +whC hUD qnm -btQ +pSy hUD uum uum @@ -252629,10 +255411,10 @@ lso hDb yar gqK -qHt +nxU gjg dxg -veH +jth mgu dkr cHQ @@ -252772,10 +255554,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -252850,10 +255632,10 @@ bln iyY kbn rCf -ylY +vZa qxa sxO -fYj +ijb kKL iin iin @@ -252894,7 +255676,7 @@ lsa iCz mtI mtI -kaX +cKk eNK nJX nJX @@ -252913,8 +255695,8 @@ pMY kLy bGA lKq -dWu -lio +bNu +myU bKm xMT hjE @@ -252943,7 +255725,7 @@ vzD vzD vzD uZc -uZc +kZw sGZ gQw bln @@ -253029,10 +255811,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -253105,11 +255887,11 @@ bln bln bln iyY -fOz -fOz +fQk +fQk rCf pwH -xII +iwO uYR kKL kKL @@ -253131,11 +255913,11 @@ oNC gEE gEE gEE -gEE oNC gEE gEE gEE +tva wrX hpm cYE @@ -253149,7 +255931,7 @@ wLl axc oLg eLr -eLr +wtT mbK jQS eNK @@ -253191,16 +255973,16 @@ eBz eBz eBz fxV -jCl -jCl -jCl -rIw -jCl -nuj -jCl +rEU +rEU +rEU +bIS +rEU +bIS +rEU mUt -uZc -uZc +wXf +wXf fNa gQw bln @@ -253286,10 +256068,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -253362,17 +256144,17 @@ bln bln bln iyY -nXu -nTf +cxp +eHj gzY -rEX +knf rCf rCf kKL lOU glI buY -xrm +hkd uXu kKL pzV @@ -253381,7 +256163,7 @@ kKL xXU spW kVE -goi +xse iQQ gEE gEE @@ -253393,8 +256175,8 @@ gEE gEE gEE gEE -kxy -emp +rpC +oXL dEV voH thM @@ -253543,10 +256325,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -253619,14 +256401,14 @@ bln bln bln kKL -pFN -fOz +uqS +fQk oXm kKL kKL kKL kKL -rGw +qAS fUc jaX glI @@ -253654,7 +256436,7 @@ gqj emp cYE lso -eaI +kvG wLl qXp uxA @@ -253663,7 +256445,7 @@ wLl dzg fXr dFj -gYm +dFj uZB oni nxa @@ -253800,10 +256582,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -253878,9 +256660,9 @@ bln iyY kHb pDe -fYj -meQ -aDm +ijb +iSQ +qji pyD kKL mqO @@ -253949,9 +256731,9 @@ hjE vWo fOl cyL -cSo +jAI bgx -aOo +hWI xxv dOK vzD @@ -254057,10 +256839,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -254134,8 +256916,8 @@ bln bln iyY nPt -fOz -gsH +fQk +rCf kKL qNu hRG @@ -254184,7 +256966,7 @@ vvE tJG oHK goq -hyW +wnp kdJ usP wLl @@ -254200,7 +256982,7 @@ awa awa xUk cQs -nOi +bdQ nsZ bkF cSw @@ -254314,10 +257096,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -254390,14 +257172,14 @@ bln bln bln iyY -tjV +jUY dxs -pVi +xQU kKL fLb oHh kKL -nwd +bpQ epd oih dmL @@ -254438,18 +257220,18 @@ gHY xZA vaA gXJ -meg +wgU oHK pnq xsD -lkP +rDH pvU wLl jUX wbR uXh tur -tYs +aJz iqx awa awa @@ -254463,7 +257245,7 @@ qxl cSw pwK yeC -lqL +oNE bgx nBN xPI @@ -254571,10 +257353,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -254650,11 +257432,11 @@ kKL kKL kKL kKL -kfF +eOm kKL kKL kKL -ihz +dvS pwd glI tsR @@ -254664,7 +257446,7 @@ tXV kvX brL cYY -cYY +qrQ wrX wrX wrX @@ -254695,7 +257477,7 @@ ljF ljF sDg gXJ -hjU +oZW oHK iZl iZl @@ -254828,10 +257610,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -254914,15 +257696,15 @@ lUC pfP apD ugG -tao -xpw +gIt +fkc lUC ccT nyC opw oTA oTA -sfi +hIN gvK jbG gEE @@ -254935,8 +257717,8 @@ gEE gEE gEE gEE -frL -emp +rpC +oXL cYE lso eha @@ -254971,7 +257753,7 @@ awa awa xUk sqt -uiN +oAA nsZ geg eVY @@ -255085,10 +257867,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -255187,11 +257969,11 @@ cpq gEE gEE iKQ -gEE cpq gEE gEE gEE +tva wrX bQh dEV @@ -255214,7 +257996,7 @@ wgO fTT bUa wgL -icL +phB krY awa awa @@ -255342,10 +258124,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -255453,19 +258235,19 @@ jbG nzV cYE dfB -bfH +wck pFg hXC -bTZ +mrw kuV cAi qWn oPq -aWH +fOR tFF tia qNn -pOf +hek gNi krY clo @@ -255599,10 +258381,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -255697,7 +258479,7 @@ oHH oHH qPL nCa -xWu +erI gGE qPL pRG @@ -255856,10 +258638,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -255975,11 +258757,11 @@ tZe nvY qpu oPP -gXl +gGx jxc aFt oPP -tta +iTJ mEJ kCz vJS @@ -256113,10 +258895,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -256211,7 +258993,7 @@ tlH sEB tpd jtG -mFP +myJ myJ jbT wLS @@ -256266,7 +259048,7 @@ rDZ rDZ bgx qUY -jCl +afn juQ vzD geJ @@ -256370,10 +259152,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -256520,10 +259302,10 @@ sFA rDZ vyx uaT -uie +oTd bgx jCl -jCl +rEU jCl vzD geJ @@ -256625,12 +259407,12 @@ wNO wNO wNO wNO +khz wNO -wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -256750,7 +259532,7 @@ ouX ero itj vAP -lTL +jBc mEJ oXJ fbl @@ -256780,8 +259562,8 @@ rDZ rDZ bgx vzb -jCl -nuj +rEU +bIS tgw pTW vzD @@ -256884,14 +259666,14 @@ wNO wNO wNO wNO +uFg +hHG +hHG +hHG +khz wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO +khz wNO wNO wNO @@ -257003,7 +259785,7 @@ cRy cRy qCF elw -nhU +wnR iNn jKl caC @@ -257015,24 +259797,24 @@ whP mOc gYt krY -snQ -xLq +oOb +ezJ iba gas rjK nlP -gaz +xTV imy -auK +ejD auK vaa xLq -ezJ +xLq nsZ rDZ pxu rDZ -rDZ +swa pxu rDZ bgx @@ -257140,13 +259922,13 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +bln +bln +xDQ +xDQ +bln +bln +bln wNO wNO wNO @@ -257264,7 +260046,7 @@ aFt hAT xyE hDp -bkR +kjr elw omh omh @@ -257300,7 +260082,7 @@ jCl geJ oiH vTl -xCz +okg luK xCz qYP @@ -257397,13 +260179,13 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +bln +bln +wUD +wUD +bln +bln +bln wNO wNO wNO @@ -257519,7 +260301,7 @@ sHM elw sVf axN -nmk +qvE nhI hDp elw @@ -257654,13 +260436,13 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +bln +bln +rPp +rPp +bln +bln +bln wNO wNO wNO @@ -257781,7 +260563,7 @@ elw elw elw rft -dbw +bkw idt fMq pSz @@ -257794,7 +260576,7 @@ hyV bgx gti bhk -jCl +fQx jCl jCl jCl @@ -257911,11 +260693,11 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO +uer +otC +hHG +hHG +hHG wNO wNO wNO @@ -258050,7 +260832,7 @@ kuy qQa bgx gti -tsJ +lOq jCl xWo axu @@ -258065,9 +260847,9 @@ ibw iQT qob rZa -jCl +rEU vzD -qcr +sDr twZ vzD bln @@ -258166,17 +260948,17 @@ wNO wNO wNO wNO +khz wNO +aaX +otC +hHG +hHG +hHG +khz wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +khz wNO wNO wNO @@ -258297,7 +261079,7 @@ jYc fTW cJs fTW -oBi +fTW omh elw mWf @@ -258321,8 +261103,8 @@ tKN qZh vzD twZ -jCl -jCl +jBr +rEU vXd jCl mwQ @@ -258407,13 +261189,8 @@ wNO wNO wNO wNO -"} -(200,1,3) = {" -wNO -wNO -wNO -wNO -wNO +"} +(200,1,3) = {" wNO wNO wNO @@ -258430,6 +261207,11 @@ wNO wNO wNO wNO +fhB +otC +hHG +hHG +hHG wNO wNO wNO @@ -258579,7 +261361,7 @@ jCl gUT jCl jCl -mKS +syT vzD jCl ibj @@ -258683,10 +261465,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -258940,10 +261722,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -259197,10 +261979,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -259454,10 +262236,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -259711,10 +262493,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -259968,10 +262750,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -260225,10 +263007,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -260464,268 +263246,7 @@ wNO wNO wNO "} -(208,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -bln -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -bln -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -"} -(209,1,3) = {" -wNO -wNO -wNO -wNO +(208,1,3) = {" wNO wNO wNO @@ -260743,6 +263264,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -260862,7 +263387,7 @@ bln bln bln bln -ozo +bln bln bln bln @@ -260978,21 +263503,17 @@ wNO wNO wNO "} -(210,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +(209,1,3) = {" +tkU +tkU +tkU +tkU +tkU +tkU +tkU +tkU +tkU +tkU wNO wNO wNO @@ -261000,6 +263521,10 @@ wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -261084,7 +263609,6 @@ wNO wNO wNO bln -fBN bln bln bln @@ -261115,12 +263639,13 @@ bln bln bln bln -fBN bln bln bln bln bln +ozo +bln bln bln bln @@ -261149,7 +263674,7 @@ wNO wNO wNO wNO -wNO +bln wNO wNO wNO @@ -261235,28 +263760,28 @@ wNO wNO wNO "} -(211,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +(210,1,3) = {" +tkU +tkU +tkU +tkU +tkU +tkU +tkU +tkU +tkU +tkU +tkU wNO wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -261341,6 +263866,7 @@ wNO wNO wNO bln +fBN bln bln bln @@ -261371,8 +263897,7 @@ bln bln bln bln -bln -bln +fBN bln bln bln @@ -261492,28 +264017,28 @@ wNO wNO wNO "} -(212,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +(211,1,3) = {" +tkU +tkU +tkU +tkU +tkU +tkU +tkU +tkU +tkU +tkU +tkU wNO wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -261749,28 +264274,28 @@ wNO wNO wNO "} -(213,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +(212,1,3) = {" +kDs +kDs +kDs +kDs +kDs +kDs wNO wNO +tkU +tkU +tkU wNO wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -262006,28 +264531,28 @@ wNO wNO wNO "} -(214,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +(213,1,3) = {" +kDs +kDs +kDs +kDs +kDs +kDs +kDs wNO wNO +tkU +tkU wNO wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -262263,28 +264788,28 @@ wNO wNO wNO "} -(215,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +(214,1,3) = {" +kDs +kDs +kDs +kDs +kDs +kDs +kDs +kDs wNO wNO +tkU +tkU +tkU wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -262369,7 +264894,6 @@ wNO wNO wNO bln -fBN bln bln bln @@ -262400,7 +264924,8 @@ bln bln bln bln -fBN +bln +bln bln bln bln @@ -262520,28 +265045,28 @@ wNO wNO wNO "} -(216,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +(215,1,3) = {" wNO wNO wNO wNO +lgH +kDs +kDs +kDs wNO wNO wNO +tkU +tkU wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -262626,6 +265151,7 @@ wNO wNO wNO bln +fBN bln bln bln @@ -262656,8 +265182,7 @@ bln bln bln bln -bln -bln +fBN bln bln bln @@ -262777,28 +265302,28 @@ wNO wNO wNO "} -(217,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +(216,1,3) = {" wNO wNO wNO wNO wNO +kDs +kDs +kDs +kDs +kDs wNO +tkU +tkU +tkU wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -263034,28 +265559,28 @@ wNO wNO wNO "} -(218,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +(217,1,3) = {" wNO wNO wNO wNO wNO wNO +hHG +hHG +hHG +hHG +hHG +hHG +tkU +tkU wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -263291,28 +265816,28 @@ wNO wNO wNO "} -(219,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +(218,1,3) = {" wNO wNO wNO +tkU +tkU +lgH +hHG +hHG +hHG +hHG +hHG +hHG +tkU +tkU wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -263548,28 +266073,28 @@ wNO wNO wNO "} -(220,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +(219,1,3) = {" wNO wNO +tkU +tkU +tkU wNO +hHG +hHG +hHG +hHG +hHG +hHG +tkU +tkU wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -263654,7 +266179,6 @@ wNO wNO wNO bln -fBN bln bln bln @@ -263685,7 +266209,8 @@ bln bln bln bln -fBN +bln +bln bln bln bln @@ -263805,28 +266330,28 @@ wNO wNO wNO "} -(221,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +(220,1,3) = {" wNO wNO +tkU +tkU +tkU wNO +hHG +hHG +hHG +hHG +hHG +hHG +tkU wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -263911,6 +266436,7 @@ wNO wNO wNO bln +fBN bln bln bln @@ -263941,6 +266467,7 @@ bln bln bln bln +fBN bln bln bln @@ -263958,21 +266485,6 @@ bln bln bln bln -bln -bln -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO wNO wNO wNO @@ -264061,8 +266573,6 @@ wNO wNO wNO wNO -"} -(222,1,3) = {" wNO wNO wNO @@ -264076,14 +266586,29 @@ wNO wNO wNO wNO +"} +(221,1,3) = {" wNO wNO +tkU +tkU +tkU wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -264319,28 +266844,28 @@ wNO wNO wNO "} -(223,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +(222,1,3) = {" wNO wNO +tkU +tkU +tkU +lgH +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -264576,28 +267101,28 @@ wNO wNO wNO "} -(224,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +(223,1,3) = {" wNO wNO wNO +tkU +tkU wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -264833,28 +267358,28 @@ wNO wNO wNO "} -(225,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +(224,1,3) = {" wNO wNO wNO +tkU +tkU wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -264939,7 +267464,6 @@ wNO wNO wNO bln -fBN bln bln bln @@ -264970,7 +267494,6 @@ bln bln bln bln -fBN bln bln bln @@ -264985,9 +267508,10 @@ bln bln bln bln -fBN bln -fBN +bln +bln +bln bln wNO wNO @@ -265089,29 +267613,30 @@ wNO wNO wNO wNO -"} -(226,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO wNO +"} +(225,1,3) = {" wNO wNO wNO +tkU +tkU wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -265196,6 +267721,7 @@ wNO wNO wNO bln +fBN bln bln bln @@ -265226,6 +267752,7 @@ bln bln bln bln +fBN bln bln bln @@ -265240,15 +267767,10 @@ bln bln bln bln +fBN bln +fBN bln -mvE -oDd -mvE -bln -bln -wNO -wNO wNO wNO wNO @@ -265346,29 +267868,32 @@ wNO wNO wNO wNO -"} -(227,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO wNO wNO wNO +"} +(226,1,3) = {" wNO wNO wNO +tkU +tkU wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -265498,11 +268023,10 @@ bln bln bln bln -xgI +bln mvE -anO +oDd mvE -xgI bln bln wNO @@ -265603,29 +268127,30 @@ wNO wNO wNO wNO -"} -(228,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO wNO +"} +(227,1,3) = {" wNO wNO wNO +tkU +tkU wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -265754,13 +268279,12 @@ bln bln bln bln +bln +xgI mvE +anO mvE -cJB -oDd -aWb -mvE -mvE +xgI bln bln wNO @@ -265860,29 +268384,30 @@ wNO wNO wNO wNO -"} -(229,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO wNO +"} +(228,1,3) = {" wNO wNO wNO +tkU +tkU +lgH +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -266002,23 +268527,23 @@ bln bln bln bln -wNO -wNO -wNO -wNO -wNO -wNO bln bln -pRa -pRa -lRd -evT -evT -evT -iJI -pRa -pRa +bln +bln +bln +bln +bln +bln +bln +mvE +mvE +cJB +oDd +aWb +mvE +mvE +bln bln wNO wNO @@ -266118,27 +268643,28 @@ wNO wNO wNO "} -(230,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +(229,1,3) = {" wNO wNO wNO +tkU +tkU wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -266224,7 +268750,6 @@ wNO wNO bln bln -fBN bln bln bln @@ -266255,10 +268780,10 @@ bln bln bln bln -fBN bln bln -wNO +bln +bln wNO wNO wNO @@ -266267,15 +268792,15 @@ wNO wNO bln bln -mvE -iJX -mps +pRa +pRa +lRd evT -byB evT -hDA -bqr -mvE +evT +iJI +pRa +pRa bln wNO wNO @@ -266375,27 +268900,28 @@ wNO wNO wNO "} -(231,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +(230,1,3) = {" wNO wNO wNO wNO +tkU wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -266480,6 +269006,7 @@ wNO wNO bln bln +fBN bln bln bln @@ -266510,9 +269037,7 @@ bln bln bln bln -bln -bln -bln +fBN bln bln wNO @@ -266524,15 +269049,15 @@ wNO wNO bln bln -pRa -pRa -qKB -evT +mvE +iJX +mps evT +byB evT -oLt -pRa -pRa +hDA +bqr +mvE bln wNO wNO @@ -266631,61 +269156,29 @@ wNO wNO wNO wNO -"} -(232,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +"} +(231,1,3) = {" wNO wNO wNO wNO +tkU wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -266736,8 +269229,6 @@ wNO wNO wNO wNO -bln -bln wNO wNO wNO @@ -266771,24 +269262,39 @@ wNO wNO bln bln -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO bln bln -mvE -mvE -mMU -uyV -lhf -mvE -mvE +bln +bln +bln +bln +bln +bln +bln +bln +bln +bln +bln +bln +bln +bln +bln +bln +bln +bln +bln +bln +bln +bln +bln +bln +bln +bln +bln +bln +bln +bln +bln bln bln wNO @@ -266798,6 +269304,18 @@ wNO wNO wNO wNO +bln +bln +pRa +pRa +qKB +evT +evT +evT +oLt +pRa +pRa +bln wNO wNO wNO @@ -266888,12 +269406,6 @@ wNO wNO wNO wNO -"} -(233,1,3) = {" -wNO -wNO -wNO -wNO wNO wNO wNO @@ -266901,16 +269413,29 @@ wNO wNO wNO wNO +"} +(232,1,3) = {" wNO wNO wNO wNO +tkU wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -266994,6 +269519,7 @@ wNO wNO wNO bln +bln wNO wNO wNO @@ -267025,10 +269551,8 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +bln +bln wNO wNO wNO @@ -267040,11 +269564,13 @@ wNO wNO bln bln -xgI mvE -beZ mvE -xgI +mMU +uyV +lhf +mvE +mvE bln bln wNO @@ -267144,32 +269670,29 @@ wNO wNO wNO wNO -wNO "} -(234,1,3) = {" -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +(233,1,3) = {" wNO wNO wNO wNO +tkU wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -267252,6 +269775,7 @@ wNO wNO wNO wNO +bln wNO wNO wNO @@ -267298,9 +269822,11 @@ wNO wNO bln bln +xgI mvE -pRa +beZ mvE +xgI bln bln wNO @@ -267401,19 +269927,29 @@ wNO wNO wNO wNO -wNO "} -(235,1,3) = {" +(234,1,3) = {" wNO wNO wNO wNO wNO +lgH +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -267542,6 +270078,13 @@ wNO wNO wNO wNO +bln +bln +mvE +pRa +mvE +bln +bln wNO wNO wNO @@ -267554,11 +270097,6 @@ wNO wNO wNO wNO -bln -bln -bln -bln -bln wNO wNO wNO @@ -267646,21 +270184,32 @@ wNO wNO wNO wNO +"} +(235,1,3) = {" wNO wNO +lgH wNO wNO wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO -"} -(236,1,3) = {" wNO wNO wNO @@ -267787,6 +270336,11 @@ wNO wNO wNO wNO +bln +bln +bln +bln +bln wNO wNO wNO @@ -267812,9 +270366,6 @@ wNO wNO wNO wNO -bln -bln -bln wNO wNO wNO @@ -267890,16 +270441,29 @@ wNO wNO wNO wNO +"} +(236,1,3) = {" wNO wNO +aaX wNO wNO wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -267916,8 +270480,6 @@ wNO wNO wNO wNO -"} -(237,1,3) = {" wNO wNO wNO @@ -268032,6 +270594,9 @@ wNO wNO wNO wNO +bln +bln +bln wNO wNO wNO @@ -268133,16 +270698,29 @@ wNO wNO wNO wNO +"} +(237,1,3) = {" wNO wNO +fhB wNO wNO wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -268173,8 +270751,6 @@ wNO wNO wNO wNO -"} -(238,1,3) = {" wNO wNO wNO @@ -268379,16 +270955,29 @@ wNO wNO wNO wNO +"} +(238,1,3) = {" wNO wNO wNO wNO wNO +lgH +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -268430,8 +271019,6 @@ wNO wNO wNO wNO -"} -(239,1,3) = {" wNO wNO wNO @@ -268625,17 +271212,29 @@ wNO wNO wNO wNO +"} +(239,1,3) = {" wNO wNO wNO wNO wNO wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -268687,8 +271286,6 @@ wNO wNO wNO wNO -"} -(240,1,3) = {" wNO wNO wNO @@ -268872,17 +271469,29 @@ wNO wNO wNO wNO +"} +(240,1,3) = {" wNO wNO wNO wNO wNO wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -268944,8 +271553,6 @@ wNO wNO wNO wNO -"} -(241,1,3) = {" wNO wNO wNO @@ -269119,17 +271726,29 @@ wNO wNO wNO wNO +"} +(241,1,3) = {" wNO wNO wNO wNO wNO wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -269201,8 +271820,6 @@ wNO wNO wNO wNO -"} -(242,1,3) = {" wNO wNO wNO @@ -269366,17 +271983,30 @@ wNO wNO wNO wNO +"} +(242,1,3) = {" wNO wNO wNO wNO wNO wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG +uer wNO wNO wNO @@ -269458,8 +272088,6 @@ wNO wNO wNO wNO -"} -(243,1,3) = {" wNO wNO wNO @@ -269612,16 +272240,30 @@ wNO wNO wNO wNO +"} +(243,1,3) = {" wNO wNO wNO wNO wNO +lgH +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG +aaX wNO wNO wNO @@ -269715,8 +272357,6 @@ wNO wNO wNO wNO -"} -(244,1,3) = {" wNO wNO wNO @@ -269857,17 +272497,30 @@ wNO wNO wNO wNO +"} +(244,1,3) = {" wNO wNO wNO wNO wNO wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG +fhB wNO wNO wNO @@ -269972,8 +272625,6 @@ wNO wNO wNO wNO -"} -(245,1,3) = {" wNO wNO wNO @@ -270103,17 +272754,31 @@ wNO wNO wNO wNO +"} +(245,1,3) = {" wNO wNO wNO wNO wNO wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG +bln +wNO wNO wNO wNO @@ -270229,8 +272894,6 @@ wNO wNO wNO wNO -"} -(246,1,3) = {" wNO wNO wNO @@ -270348,15 +273011,30 @@ wNO wNO wNO wNO +"} +(246,1,3) = {" wNO wNO wNO wNO wNO +lgH +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO +bln +bln +xDQ +xDQ +bln +bln wNO wNO wNO @@ -270486,8 +273164,6 @@ wNO wNO wNO wNO -"} -(247,1,3) = {" wNO wNO wNO @@ -270592,16 +273268,31 @@ wNO wNO wNO wNO +"} +(247,1,3) = {" wNO wNO wNO wNO wNO wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO +bln +bln +wUD +wUD +bln +bln +bln wNO wNO wNO @@ -270743,8 +273434,6 @@ wNO wNO wNO wNO -"} -(248,1,3) = {" wNO wNO wNO @@ -270836,16 +273525,31 @@ wNO wNO wNO wNO +"} +(248,1,3) = {" wNO wNO wNO wNO wNO wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO +bln +bln +rPp +rPp +bln +bln +bln wNO wNO wNO @@ -271000,8 +273704,6 @@ wNO wNO wNO wNO -"} -(249,1,3) = {" wNO wNO wNO @@ -271080,17 +273782,31 @@ wNO wNO wNO wNO +"} +(249,1,3) = {" wNO wNO wNO wNO wNO wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG +bln +wNO wNO wNO wNO @@ -271257,8 +273973,6 @@ wNO wNO wNO wNO -"} -(250,1,3) = {" wNO wNO wNO @@ -271325,15 +274039,30 @@ wNO wNO wNO wNO +"} +(250,1,3) = {" +wNO wNO wNO wNO wNO +lgH +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG +bln wNO wNO wNO @@ -271514,8 +274243,6 @@ wNO wNO wNO wNO -"} -(251,1,3) = {" wNO wNO wNO @@ -271569,17 +274296,29 @@ wNO wNO wNO wNO +"} +(251,1,3) = {" wNO wNO wNO wNO wNO wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -271771,8 +274510,6 @@ wNO wNO wNO wNO -"} -(252,1,3) = {" wNO wNO wNO @@ -271816,17 +274553,29 @@ wNO wNO wNO wNO +"} +(252,1,3) = {" wNO wNO wNO wNO wNO wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -272028,8 +274777,6 @@ wNO wNO wNO wNO -"} -(253,1,3) = {" wNO wNO wNO @@ -272063,16 +274810,29 @@ wNO wNO wNO wNO +"} +(253,1,3) = {" wNO wNO wNO wNO wNO +lgH +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -272285,8 +275045,6 @@ wNO wNO wNO wNO -"} -(254,1,3) = {" wNO wNO wNO @@ -272309,17 +275067,29 @@ wNO wNO wNO wNO +"} +(254,1,3) = {" wNO wNO wNO wNO wNO wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO @@ -272542,8 +275312,6 @@ wNO wNO wNO wNO -"} -(255,1,3) = {" wNO wNO wNO @@ -272556,15 +275324,29 @@ wNO wNO wNO wNO +"} +(255,1,3) = {" +wNO +wNO wNO wNO wNO wNO +hHG +hHG +hHG +hHG +hHG +hHG wNO wNO wNO wNO wNO +otC +hHG +hHG +hHG wNO wNO wNO diff --git a/_maps/map_files/Mafia/mafia_ayylmao.dmm b/_maps/map_files/Mafia/mafia_ayylmao.dmm index d4c42cec0f7fe..0f0a9c0e43301 100644 --- a/_maps/map_files/Mafia/mafia_ayylmao.dmm +++ b/_maps/map_files/Mafia/mafia_ayylmao.dmm @@ -28,6 +28,7 @@ /area/centcom/mafia) "l" = ( /obj/structure/closet/abductor, +/obj/item/abductor/gizmo, /turf/open/floor/plating/abductor, /area/centcom/mafia) "m" = ( @@ -42,6 +43,7 @@ /area/centcom/mafia) "o" = ( /obj/structure/closet/abductor, +/obj/item/abductor/gizmo, /turf/open/floor/plating/abductor2, /area/centcom/mafia) "p" = ( diff --git a/_maps/map_files/Mafia/mafia_lavaland.dmm b/_maps/map_files/Mafia/mafia_lavaland.dmm index 41e2a1524387a..a3729fe8a6ee2 100644 --- a/_maps/map_files/Mafia/mafia_lavaland.dmm +++ b/_maps/map_files/Mafia/mafia_lavaland.dmm @@ -50,12 +50,9 @@ /turf/open/floor/plating, /area/centcom/mafia) "al" = ( -/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, +/obj/item/shovel, +/obj/item/pickaxe, +/obj/structure/closet/secure_closet/miner/unlocked, /turf/open/floor/fakebasalt, /area/centcom/mafia) "am" = ( @@ -74,12 +71,9 @@ /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, +/obj/item/shovel, +/obj/item/pickaxe, +/obj/structure/closet/secure_closet/miner/unlocked, /turf/open/floor/iron, /area/centcom/mafia) "ap" = ( @@ -98,12 +92,9 @@ /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, +/obj/item/shovel, +/obj/item/pickaxe, +/obj/structure/closet/secure_closet/miner/unlocked, /turf/open/floor/iron, /area/centcom/mafia) "as" = ( @@ -112,20 +103,6 @@ }, /turf/open/floor/iron, /area/centcom/mafia) -"at" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/centcom/mafia) -"au" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron/dark, -/area/centcom/mafia) "av" = ( /obj/mafia_game_board, /obj/effect/mapping_helpers/burnt_floor, @@ -155,12 +132,9 @@ /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, +/obj/item/shovel, +/obj/item/pickaxe, +/obj/structure/closet/secure_closet/miner/unlocked, /turf/open/floor/iron, /area/centcom/mafia) "aA" = ( @@ -220,24 +194,18 @@ /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, +/obj/item/shovel, +/obj/item/pickaxe, +/obj/structure/closet/secure_closet/miner/unlocked, /turf/open/floor/iron, /area/centcom/mafia) "aI" = ( /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, +/obj/item/shovel, +/obj/item/pickaxe, +/obj/structure/closet/secure_closet/miner/unlocked, /turf/open/floor/iron, /area/centcom/mafia) "aJ" = ( @@ -254,12 +222,9 @@ /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, +/obj/item/shovel, +/obj/item/pickaxe, +/obj/structure/closet/secure_closet/miner/unlocked, /turf/open/floor/iron, /area/centcom/mafia) "aL" = ( @@ -334,24 +299,6 @@ }, /turf/open/floor/iron, /area/centcom/mafia) -"aW" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/centcom/mafia) -"aX" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/centcom/mafia) "aY" = ( /turf/closed/indestructible/reinforced, /area/centcom/mafia) diff --git a/_maps/map_files/Mafia/mafia_snow.dmm b/_maps/map_files/Mafia/mafia_snow.dmm index ad20d97371c38..0a4001a6b0f99 100644 --- a/_maps/map_files/Mafia/mafia_snow.dmm +++ b/_maps/map_files/Mafia/mafia_snow.dmm @@ -144,15 +144,13 @@ /area/centcom/mafia) "D" = ( /obj/structure/closet/crate/science, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/suit/hooded/wintercoat/miner, /turf/open/floor/holofloor/snow, /area/centcom/mafia) "E" = ( /obj/structure/lattice/catwalk, /obj/structure/closet/crate/critter, /obj/item/clothing/suit/hooded/wintercoat/miner, -/obj/item/clothing/shoes/winterboots, /turf/open/lava/plasma/mafia, /area/centcom/mafia) "F" = ( diff --git a/_maps/map_files/Mafia/mafia_syndie.dmm b/_maps/map_files/Mafia/mafia_syndie.dmm index fee565ed19ab3..e8e49e65c10d5 100644 --- a/_maps/map_files/Mafia/mafia_syndie.dmm +++ b/_maps/map_files/Mafia/mafia_syndie.dmm @@ -7,8 +7,7 @@ desc = "A storage closet for syndicate conflict resolution operatives."; name = "red closet" }, -/obj/item/clothing/under/syndicate/tacticool, -/obj/item/clothing/under/syndicate/tacticool/skirt, +/obj/effect/spawner/random/clothing/syndie, /turf/open/floor/mineral/plastitanium, /area/centcom/mafia) "c" = ( @@ -46,16 +45,6 @@ /obj/mafia_game_board, /turf/open/floor/plating, /area/centcom/mafia) -"m" = ( -/obj/structure/closet/syndicate{ - desc = "A storage closet for syndicate conflict resolution operatives."; - name = "red closet" - }, -/obj/item/clothing/under/syndicate/tacticool, -/obj/item/clothing/under/syndicate/tacticool/skirt, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/mafia) "n" = ( /obj/effect/landmark/mafia, /turf/open/floor/mineral/plastitanium, @@ -84,12 +73,6 @@ "r" = ( /turf/open/floor/mineral/plastitanium, /area/centcom/mafia) -"s" = ( -/turf/open/floor/mineral/plastitanium/red, -/area/centcom/mafia) -"t" = ( -/turf/open/floor/circuit/red, -/area/centcom/mafia) "u" = ( /obj/effect/baseturf_helper/asteroid, /obj/effect/landmark/mafia/town_center, @@ -155,13 +138,12 @@ /turf/open/floor/mineral/plastitanium, /area/centcom/mafia) "G" = ( -/obj/item/clothing/under/syndicate/tacticool, /obj/structure/closet/syndicate{ desc = "A storage closet for syndicate conflict resolution operatives."; name = "red closet" }, -/obj/item/clothing/under/syndicate/tacticool/skirt, /obj/effect/turf_decal/tile/red/fourcorners, +/obj/effect/spawner/random/clothing/syndie, /turf/open/floor/iron/dark, /area/centcom/mafia) "H" = ( @@ -169,6 +151,12 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/centcom/mafia) +"Q" = ( +/turf/open/floor/circuit/red, +/area/centcom/mafia) +"S" = ( +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/mafia) (1,1,1) = {" a @@ -309,7 +297,7 @@ b r w o -m +G w j w @@ -327,7 +315,7 @@ c c d w -m +G o p n @@ -413,7 +401,7 @@ p p w p -m +G w d c @@ -431,9 +419,9 @@ r r y p -s -t -s +S +Q +S p q o @@ -456,9 +444,9 @@ p w p p -t +Q u -t +Q p p w @@ -481,9 +469,9 @@ o o z p -s -t -s +S +Q +S p E r @@ -501,7 +489,7 @@ w c d w -m +G p w p @@ -605,7 +593,7 @@ w w j w -m +G o w r diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index feea3269dffa0..df3e1b7490a2a 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -13,10 +13,6 @@ "aag" = ( /turf/closed/wall, /area/station/commons/fitness) -"aah" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "aal" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60,18 +56,12 @@ dir = 8 }, /turf/open/floor/iron/textured, -/area/station/medical/medbay/central) -"aaB" = ( -/obj/machinery/shower/directional/west, -/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) +/area/station/medical/chem_storage) +"aaD" = ( +/obj/effect/spawner/random/entertainment/arcade, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "abI" = ( /obj/structure/chair/stool/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -143,6 +133,22 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/carpet, /area/station/service/library) +"acU" = ( +/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, +/obj/machinery/requests_console/directional/south{ + department = "Engineering"; + name = "Engineering Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/main) "adp" = ( /turf/closed/wall, /area/station/hallway/primary/starboard) @@ -178,6 +184,9 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"aec" = ( +/turf/closed/wall, +/area/station/medical/chem_storage) "aef" = ( /obj/structure/lattice/catwalk, /turf/open/space/basic, @@ -191,8 +200,7 @@ /area/station/ai_monitored/security/armory) "aeu" = ( /obj/effect/decal/cleanable/cobweb, -/obj/item/kirbyplants{ - icon_state = "plant-20"; +/obj/item/kirbyplants/organic/plant20{ pixel_y = 3 }, /obj/effect/turf_decal/bot{ @@ -214,40 +222,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/iron/dark/textured, /area/station/medical/cryo) -"aeB" = ( -/obj/machinery/door/airlock/grunge{ - name = "Morgue" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, -/obj/effect/mapping_helpers/airlock/access/all/medical/morgue, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"aeF" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/beaker{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/reagent_containers/cup/beaker/large, -/obj/item/reagent_containers/dropper, -/obj/item/reagent_containers/cup/bottle/epinephrine{ - pixel_x = -4; - pixel_y = 12 - }, -/obj/item/reagent_containers/cup/bottle/multiver{ - pixel_x = 7; - pixel_y = 12 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "afj" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -311,7 +285,6 @@ "agN" = ( /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") @@ -321,6 +294,21 @@ /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 8 }, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_x = -6; + pixel_y = 22 + }, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = 4; + pixel_y = 17 + }, +/obj/item/food/tofu{ + pixel_y = 6 + }, +/obj/item/food/tofu, +/obj/item/food/tofu{ + pixel_y = -6 + }, /turf/open/floor/iron/white, /area/station/science/cytology) "agQ" = ( @@ -353,6 +341,15 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"ahe" = ( +/obj/machinery/airalarm/directional/east, +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/entry) "ahg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/machinery/duct, @@ -458,23 +455,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/office) -"ajq" = ( -/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/execution/transfer) "ajI" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -482,10 +462,21 @@ /obj/machinery/vending/drugs, /turf/open/floor/iron/dark, /area/station/medical/medbay/central) -"ajM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) +"ajK" = ( +/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 + }, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 1 + }, +/turf/open/floor/iron/white/smooth_half, +/area/station/medical/cryo) "aks" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral{ @@ -497,6 +488,41 @@ /obj/structure/chair/stool/directional/east, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"akA" = ( +/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 + }, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/virology) "akE" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -522,6 +548,24 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai_upload) +"akT" = ( +/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") + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "akZ" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 4 @@ -558,13 +602,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) -"amb" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) "amc" = ( /obj/structure/chair{ dir = 4; @@ -653,6 +690,17 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/ai_monitored/security/armory) +"anv" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/east, +/obj/machinery/skill_station, +/turf/open/floor/wood, +/area/station/service/library) +"anE" = ( +/obj/machinery/vending/clothing, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "anL" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -676,12 +724,20 @@ "anT" = ( /obj/structure/chair/sofa/corp/right{ desc = "Looks like someone threw it out. Covered in donut crumbs."; - name = "couch"; - dir = 1 + dir = 1; + name = "couch" }, /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) +"anW" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron, +/area/station/construction/storage_wing) "aok" = ( /turf/open/floor/iron, /area/station/cargo/storage) @@ -696,12 +752,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/atmos) -"apq" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/obj/item/clothing/suit/hooded/wintercoat/engineering, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/engineering/main) "aps" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -728,10 +778,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"apB" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/central) "apJ" = ( /obj/structure/cable, /turf/open/floor/iron/dark, @@ -772,6 +818,14 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/command/heads_quarters/qm) +"aqa" = ( +/obj/machinery/portable_atmospherics/pump, +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/commons/locker) "aqh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -836,17 +890,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"ari" = ( -/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/plating, -/area/station/maintenance/starboard/lesser) "ark" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -859,28 +902,26 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) -"arl" = ( -/obj/machinery/firealarm/directional/west, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "art" = ( /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) -"arD" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/siding/wood, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/wood/large, -/area/station/service/theater) +"asi" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/lights/mixed, +/obj/item/stack/sheet/iron{ + amount = 30 + }, +/obj/item/radio{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/item/stack/cable_coil, +/obj/structure/sign/poster/random/directional/east, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "asm" = ( /obj/effect/turf_decal/siding/white, /obj/effect/turf_decal/trimline/brown/warning, @@ -915,30 +956,6 @@ /obj/effect/turf_decal/tile/bar, /turf/open/floor/iron, /area/station/hallway/primary/central) -"asL" = ( -/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) "asM" = ( /obj/machinery/computer/prisoner/management{ dir = 4 @@ -946,10 +963,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/wood, /area/station/command/heads_quarters/hos) -"asX" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/security/brig) "atf" = ( /obj/structure/table/glass, /obj/item/clothing/gloves/latex, @@ -959,10 +972,17 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) -"ati" = ( -/obj/effect/spawner/random/vending/colavend, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/aft) +"atk" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "atN" = ( /obj/structure/cable, /obj/machinery/computer/records/security{ @@ -973,13 +993,10 @@ }, /turf/open/floor/iron, /area/station/security/office) -"atU" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/wood, -/area/station/service/bar/backroom) +"auc" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "auh" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -1003,11 +1020,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"aun" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/gateway) "auw" = ( /obj/machinery/door/airlock{ id_tag = "Cabin7"; @@ -1017,28 +1029,39 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/commons/dorms) -"auH" = ( -/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) "auJ" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/plating, /area/station/hallway/secondary/entry) +"auO" = ( +/obj/machinery/light_switch/directional/east, +/obj/structure/cable, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/cargo/storage) "ava" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/item/storage/box/lights/mixed, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"avb" = ( +/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 + }, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 1 + }, +/turf/open/floor/iron/white/smooth_half, +/area/station/medical/cryo) "avc" = ( /obj/machinery/airalarm/directional/east, /obj/machinery/camera/directional/east{ @@ -1047,17 +1070,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/command/gateway) -"avo" = ( -/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/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "avq" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, @@ -1074,6 +1086,17 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"avx" = ( +/obj/machinery/computer/camera_advanced/xenobio{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/iron, +/area/station/science/xenobiology) "avA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, @@ -1102,14 +1125,6 @@ /obj/item/pillow/random, /turf/open/floor/carpet, /area/station/commons/dorms) -"aww" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/obj/machinery/light/directional/east, -/obj/machinery/photocopier, -/turf/open/floor/iron/white, -/area/station/medical/office) "awy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1117,12 +1132,6 @@ /obj/structure/sign/warning/test_chamber/directional/south, /turf/open/floor/iron/white, /area/station/science/ordnance/testlab) -"awF" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "awO" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -1166,6 +1175,10 @@ dir = 1 }, /area/station/engineering/atmos) +"axJ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) "axK" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -1186,18 +1199,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/security/prison) -"axR" = ( -/obj/machinery/light_switch/directional/east, -/obj/structure/table/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/obj/machinery/fax{ - fax_name = "Psychology Office"; - name = "Psychology Office Fax Machine" - }, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) "axW" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -1253,26 +1254,6 @@ /obj/item/stack/cable_coil, /turf/open/floor/plating/airless, /area/space/nearstation) -"azn" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/locker) -"azs" = ( -/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) "azv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, @@ -1283,6 +1264,53 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"azF" = ( +/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, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/station/science/research) +"azZ" = ( +/obj/structure/closet/crate, +/obj/item/reagent_containers/cup/bowl, +/obj/effect/spawner/random/contraband/prison, +/obj/item/reagent_containers/cup/bowl, +/obj/item/reagent_containers/cup/bowl, +/obj/item/reagent_containers/cup/bowl, +/obj/item/reagent_containers/cup/bowl, +/obj/item/reagent_containers/cup/bowl, +/obj/item/reagent_containers/cup/bowl, +/obj/item/reagent_containers/cup/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/opposingcorners, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white, +/area/station/security/prison/mess) +"aAb" = ( +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) "aAg" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral, @@ -1326,6 +1354,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/command/gateway) +"aAS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/status_display/evac/directional/north, +/obj/machinery/light/small/directional/north, +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "aAT" = ( /obj/machinery/firealarm/directional/east, /obj/machinery/camera/directional/east{ @@ -1408,6 +1445,8 @@ /obj/item/stack/sheet/glass/fifty, /obj/item/stack/rods/fifty, /obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/obj/item/wallframe/digital_clock, +/obj/item/wallframe/digital_clock, /turf/open/floor/iron, /area/station/commons/storage/tools) "aCE" = ( @@ -1424,6 +1463,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"aCM" = ( +/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) "aCQ" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -1463,6 +1508,14 @@ }, /turf/open/floor/iron/checker, /area/station/science/research) +"aDo" = ( +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "aDA" = ( /obj/machinery/light/small/directional/south, /obj/item/folder, @@ -1475,16 +1528,6 @@ /obj/item/pen, /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) -"aDK" = ( -/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) "aDQ" = ( /obj/structure/chair/comfy/black{ dir = 4 @@ -1517,11 +1560,6 @@ /obj/item/poster/random_official, /turf/open/floor/iron/dark, /area/station/security/office) -"aEl" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white, -/area/station/security/prison) "aEr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1534,6 +1572,17 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"aEA" = ( +/obj/structure/table/wood, +/obj/item/staff/broom, +/obj/item/wrench, +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/structure/sign/poster/random/directional/north, +/turf/open/floor/wood/large, +/area/station/service/theater) "aEH" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -1652,6 +1701,16 @@ }, /turf/open/floor/iron/dark/airless, /area/station/science/ordnance/freezerchamber) +"aHr" = ( +/obj/machinery/light_switch/directional/west, +/obj/structure/table/wood, +/obj/machinery/fax{ + fax_name = "Detective's Office"; + name = "Detective's Fax Machine" + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/grimy, +/area/station/security/detectives_office) "aHt" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -1689,10 +1748,25 @@ /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron, /area/station/science/research) +"aHN" = ( +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/bot, +/obj/effect/landmark/event_spawn, +/obj/effect/landmark/start/hangover, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) "aHR" = ( /obj/structure/sign/warning/biohazard, /turf/closed/wall/r_wall, /area/station/science/research) +"aIl" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "aIm" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=7.5-Starboard-Aft-Corner"; @@ -1717,15 +1791,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"aID" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) "aIE" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 8 @@ -1736,20 +1801,19 @@ }, /turf/open/floor/iron, /area/station/construction/storage_wing) -"aII" = ( -/obj/machinery/hydroponics/soil, -/obj/item/cultivator, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/grass, -/area/station/security/prison/garden) -"aIX" = ( -/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) +"aIO" = ( +/obj/machinery/dna_scannernew, +/obj/effect/turf_decal/siding/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/requests_console/directional/east{ + department = "Genetics"; + name = "Genetics Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/turf/open/floor/iron/dark, +/area/station/science/genetics) "aJa" = ( /obj/item/radio/intercom/directional/south, /obj/structure/disposalpipe/segment{ @@ -1758,6 +1822,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) +"aJb" = ( +/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/machinery/status_display/evac/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "aJd" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -1781,9 +1857,10 @@ /turf/open/floor/iron, /area/station/engineering/main) "aJm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/station/maintenance/starboard/lesser) +/obj/effect/spawner/random/structure/grille, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) "aJn" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -1940,11 +2017,26 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) +"aLx" = ( +/obj/structure/mop_bucket, +/obj/item/mop, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) "aLA" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central) +"aLF" = ( +/obj/machinery/disposal/bin, +/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) "aMb" = ( /obj/structure/table, /obj/item/cultivator, @@ -1986,6 +2078,12 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/dark, /area/station/command/bridge) +"aMG" = ( +/obj/structure/table, +/obj/item/clothing/under/costume/buttondown/slacks/service, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "aMW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -2015,6 +2113,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"aNu" = ( +/obj/structure/bed, +/obj/item/clothing/suit/jacket/straight_jacket, +/obj/item/clothing/glasses/blindfold, +/obj/item/clothing/mask/muzzle, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "aNB" = ( /obj/machinery/camera/directional/east{ c_tag = "Atmospherics Tank - Mix" @@ -2028,6 +2133,14 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/dark, /area/station/command/bridge) +"aNL" = ( +/obj/effect/spawner/random/trash/garbage, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "aNN" = ( /obj/machinery/airalarm/directional/south, /obj/machinery/disposal/bin, @@ -2053,13 +2166,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"aNT" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/construction/storage_wing) "aNZ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -2091,12 +2197,13 @@ /obj/effect/turf_decal/trimline/brown/warning, /turf/open/floor/iron/white, /area/station/science/lobby) -"aOA" = ( -/obj/machinery/vending/tool, -/obj/effect/turf_decal/delivery, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/storage_shared) +"aOC" = ( +/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, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/security/brig) "aOH" = ( /obj/structure/table, /obj/item/clothing/mask/gas/sechailer{ @@ -2113,16 +2220,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/office) -"aPe" = ( -/obj/machinery/defibrillator_mount/directional/south, -/obj/machinery/light/directional/south, -/obj/structure/bed/pod{ - desc = "An old medical bed, just waiting for replacement with something up to date."; - name = "medical bed" - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "aPk" = ( /obj/structure/closet/crate/preopen, /turf/open/floor/plating, @@ -2167,28 +2264,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) -"aPA" = ( -/obj/structure/table/reinforced, -/obj/item/wheelchair{ - pixel_y = -3 - }, -/obj/item/wheelchair, -/obj/item/wheelchair{ - pixel_y = 3 - }, -/obj/structure/window/spawner/directional/north, -/obj/structure/window/spawner/directional/west, -/turf/open/floor/iron/dark, -/area/station/medical/office) -"aPO" = ( -/obj/machinery/light/directional/west, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"aPV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/commons/lounge) "aPX" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ dir = 1 @@ -2295,11 +2370,36 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/cryo) +"aSk" = ( +/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/airalarm/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "aSm" = ( /obj/machinery/light/small/directional/west, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/hallway/secondary/entry) +"aSQ" = ( +/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 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) "aST" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -2323,20 +2423,10 @@ }, /turf/open/floor/plating, /area/station/cargo/storage) -"aTc" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Port Primary Hallway - Mining Shuttle" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "aTi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/obj/machinery/destructive_scanner, /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 1 }, @@ -2348,10 +2438,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) -"aTN" = ( -/obj/machinery/light/no_nightlight/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "aTU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2461,6 +2547,14 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) +"aVv" = ( +/obj/machinery/suit_storage_unit/atmos, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/engineering/atmos) "aVX" = ( /obj/machinery/door/airlock/hatch{ name = "Telecomms Server Room" @@ -2543,6 +2637,22 @@ }, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) +"aWR" = ( +/obj/structure/table/glass, +/obj/machinery/light_switch/directional/north, +/obj/item/storage/secure/briefcase{ + pixel_x = 3; + pixel_y = 5 + }, +/obj/item/storage/medkit/regular{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) "aXa" = ( /turf/closed/wall, /area/station/security/prison/mess) @@ -2574,20 +2684,6 @@ /obj/item/bedsheet, /turf/open/floor/iron, /area/station/security/brig) -"aXI" = ( -/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/yellow{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos) "aXK" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -2625,6 +2721,31 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) +"aYl" = ( +/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") + }, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/engine, +/area/station/science/xenobiology) "aYw" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod Three"; @@ -2679,19 +2800,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) -"aZq" = ( -/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/smooth_edge, -/area/station/medical/cryo) "aZr" = ( /obj/structure/table, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2740,6 +2848,17 @@ }, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) +"aZA" = ( +/obj/structure/cable, +/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 = list("brig") + }, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "aZL" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -2756,6 +2875,27 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/central) +"bar" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/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, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"bas" = ( +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/chapel, +/area/station/service/chapel) "bau" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -2867,17 +3007,26 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"bcr" = ( +"bcw" = ( +/obj/structure/cable, +/obj/structure/sign/poster/official/random/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"bcx" = ( /obj/structure/table, -/obj/machinery/reagentgrinder, -/obj/item/stack/sheet/mineral/plasma{ - pixel_y = 10 - }, -/obj/machinery/light/directional/south, -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) +/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, +/obj/structure/window/spawner/directional/south, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/dark, +/area/station/command/teleporter) "bcT" = ( /obj/machinery/door/poddoor/preopen{ id = "bridge blast"; @@ -2918,19 +3067,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white/smooth_large, /area/station/medical/surgery/theatre) -"bdK" = ( -/obj/machinery/light/directional/east, -/obj/structure/sign/poster/random/directional/east, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/closet/secure_closet/freezer/kitchen, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 10 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "bdP" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -2942,17 +3078,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) -"bec" = ( -/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, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "bep" = ( /obj/machinery/air_sensor/oxygen_tank, /turf/open/floor/engine/o2, @@ -3040,17 +3165,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"bfF" = ( -/obj/machinery/shower/directional/west, -/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) "bfM" = ( /obj/machinery/door/airlock/public/glass{ name = "Art Storage" @@ -3151,17 +3265,16 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) +"bhl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/maintenance/three, +/obj/structure/closet/crate/medical, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) "bhu" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, /area/station/security/execution/education) -"bhy" = ( -/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) "bhM" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -3204,13 +3317,6 @@ }, /turf/open/floor/iron/white, /area/station/security/prison/visit) -"biw" = ( -/obj/item/kirbyplants/random, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/iron, -/area/station/science/research) "bix" = ( /obj/machinery/component_printer, /turf/open/floor/iron/white, @@ -3224,18 +3330,6 @@ /obj/structure/window/spawner/directional/north, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) -"biI" = ( -/obj/effect/decal/cleanable/dirt, -/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/cup/rag, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) "biV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3249,12 +3343,34 @@ /turf/open/floor/iron, /area/station/hallway/primary/starboard) "bje" = ( -/obj/structure/closet/emcloset, -/obj/structure/disposalpipe/segment{ - dir = 5 +/obj/effect/turf_decal/box/corners{ + dir = 8 }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, +/obj/effect/decal/cleanable/oil/streak, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/effect/landmark/bitrunning/station_reward_spawn, +/turf/open/floor/iron/dark/smooth_large, +/area/station/bitrunning/den) +"bjl" = ( +/obj/machinery/rnd/production/techfab/department/service, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 6 + }, +/obj/effect/turf_decal/box, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "bjs" = ( /obj/structure/closet{ anchored = 1; @@ -3269,6 +3385,15 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron, /area/station/science/xenobiology) +"bjy" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/effect/turf_decal/tile/blue{ + 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/medical/chemistry) "bjB" = ( /obj/structure/sign/directions/security{ dir = 1; @@ -3276,17 +3401,15 @@ }, /turf/closed/wall, /area/station/security/courtroom) -"bjD" = ( -/obj/effect/turf_decal/stripes/line{ +"bjF" = ( +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/machinery/light/directional/east, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "bjH" = ( -/obj/machinery/modular_computer/console/preset/cargochat/engineering, +/obj/machinery/modular_computer/preset/cargochat/engineering, /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 }, @@ -3308,6 +3431,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/science/research) +"bjK" = ( +/obj/structure/tank_holder/extinguisher, +/obj/machinery/camera/directional/east{ + c_tag = "Medbay Cryogenics"; + network = list("ss13","medbay") + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/cryo) "bjP" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/aisat/foyer) @@ -3319,17 +3452,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/warden) -"bkm" = ( -/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) "bkF" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3359,6 +3481,11 @@ }, /turf/open/floor/plating, /area/station/medical/treatment_center) +"bkZ" = ( +/obj/structure/filingcabinet, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/grimy, +/area/station/security/detectives_office) "bla" = ( /obj/effect/spawner/random/vending/snackvend, /turf/open/floor/wood, @@ -3406,21 +3533,6 @@ }, /turf/open/floor/iron, /area/station/command/gateway) -"bmz" = ( -/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 - }, -/obj/item/pillow/random, -/turf/open/floor/carpet, -/area/station/commons/dorms) "bmB" = ( /obj/machinery/light_switch/directional/south, /obj/effect/turf_decal/tile/red/opposingcorners, @@ -3441,12 +3553,16 @@ /obj/effect/mapping_helpers/airlock/access/any/command/captain, /turf/open/floor/plating, /area/station/maintenance/central) -"bmX" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/sink/directional/south, -/mob/living/basic/mouse/brown/tom, -/turf/open/floor/plating, -/area/station/security/prison/safe) +"bnl" = ( +/obj/structure/sign/departments/chemistry/pharmacy/directional/west, +/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 = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "bno" = ( /obj/structure/transit_tube/diagonal, /turf/open/space, @@ -3566,42 +3682,36 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"bnH" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Chapel - Funeral Parlour" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +"bnM" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/access/all/service/bar, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 }, -/obj/machinery/computer/pod/old/mass_driver_controller/chapelgun{ - pixel_x = 24 +/obj/machinery/door/airlock/glass{ + name = "Bar" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) -"bnM" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/machinery/smartfridge/drinks, /turf/open/floor/iron, /area/station/service/bar) +"bnO" = ( +/obj/effect/decal/cleanable/dirt, +/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) "bnQ" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"bnU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/office/light, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"bnX" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white/corner, -/area/station/hallway/secondary/entry) "boc" = ( /obj/effect/decal/cleanable/dirt, /obj/item/storage/belt/utility, @@ -3609,32 +3719,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/storage/primary) -"bod" = ( -/obj/structure/closet, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/aft) -"bor" = ( -/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/command/heads_quarters/qm) "boD" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -3659,6 +3743,26 @@ dir = 4 }, /area/station/service/chapel) +"bpq" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 3 + }, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "kitchen_counter"; + name = "Kitchen Counter Shutters" + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/kitchen) "bpu" = ( /obj/machinery/airalarm/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -3668,25 +3772,24 @@ /obj/machinery/rnd/production/circuit_imprinter/department/science, /turf/open/floor/iron/dark, /area/station/science/lab) -"bpD" = ( -/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) +"bpB" = ( +/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 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/security/office) "bpG" = ( /obj/machinery/firealarm/directional/east, -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, +/obj/item/kirbyplants/organic/plant10, /obj/effect/turf_decal/tile/purple, /turf/open/floor/iron, /area/station/hallway/primary/central) -"bpK" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/medical/abandoned) "bpY" = ( /obj/machinery/light/small/directional/west, /obj/item/clothing/mask/animal/horsehead, @@ -3697,6 +3800,14 @@ /obj/structure/sign/poster/contraband/random/directional/west, /turf/open/floor/wood, /area/station/service/theater) +"bqg" = ( +/obj/structure/cable, +/obj/structure/sign/poster/official/random/directional/east, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/entry) "bqk" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/atmos/glass{ @@ -3705,6 +3816,11 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) +"bqC" = ( +/obj/structure/table/wood, +/obj/item/clothing/mask/cigarette/pipe, +/turf/open/floor/wood, +/area/station/commons/lounge) "bqJ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3712,6 +3828,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/siding/purple/corner{ + dir = 4 + }, /turf/open/floor/iron/white, /area/station/science/cytology) "bqX" = ( @@ -3750,6 +3869,15 @@ /obj/structure/transit_tube/diagonal/topleft, /turf/open/space, /area/space/nearstation) +"brX" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/structure/steam_vent, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) "brY" = ( /obj/machinery/camera/motion/directional/east{ c_tag = "MiniSat Foyer"; @@ -3944,6 +4072,30 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) +"buE" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/window/spawner/directional/west, +/obj/effect/turf_decal/trimline/dark_red/line{ + dir = 8 + }, +/obj/effect/turf_decal/arrows/red{ + dir = 4 + }, +/obj/effect/landmark/start/hangover, +/obj/structure/cable, +/turf/open/floor/iron/white/smooth_edge{ + dir = 4 + }, +/area/station/commons/fitness) +"buF" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/entry) "buH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4013,18 +4165,15 @@ }, /turf/open/floor/iron/white, /area/station/science/explab) -"bwm" = ( -/obj/machinery/light/directional/west, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/siding/blue/corner{ - dir = 4 - }, -/obj/machinery/pdapainter/research, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 +"bwh" = ( +/obj/machinery/light_switch/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Chapel Office" }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) +/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) "bwr" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -4074,6 +4223,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/locker) +"bxq" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "bxr" = ( /obj/structure/sign/warning/electric_shock/directional/east, /turf/open/space/basic, @@ -4134,6 +4292,16 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"byQ" = ( +/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{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "byR" = ( /obj/structure/sign/warning/secure_area/directional/north, /obj/structure/cable, @@ -4156,13 +4324,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison) -"bzG" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "bzH" = ( /turf/closed/wall, /area/station/cargo/sorting) @@ -4205,6 +4366,14 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/carpet, /area/station/commons/dorms) +"bAI" = ( +/obj/machinery/disposal/bin, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "bAR" = ( /obj/effect/turf_decal/plaque{ icon_state = "L4" @@ -4275,6 +4444,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"bCr" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/station/service/library) "bCt" = ( /obj/machinery/status_display/evac/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -4363,7 +4540,6 @@ "bDS" = ( /obj/structure/chair/office/light, /obj/structure/cable, -/obj/item/stamp/head/cmo, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) "bDW" = ( @@ -4377,6 +4553,14 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/security/office) +"bEh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/light/floor, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "bEv" = ( /obj/machinery/door/airlock/research/glass/incinerator/ordmix_exterior{ name = "Burn Chamber Exterior Airlock" @@ -4385,12 +4569,33 @@ /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/burnchamber) -"bEL" = ( -/obj/effect/decal/cleanable/dirt, +"bEA" = ( /obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, +/obj/machinery/camera/directional/south{ + c_tag = "Chief Medical Officer's Office"; + network = list("ss13","medbay") + }, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/machinery/requests_console/directional/south{ + department = "Chief Medical Officer's Desk"; + name = "Chief Medical Officer's Requests Console" + }, /turf/open/floor/iron/white, -/area/station/medical/abandoned) +/area/station/command/heads_quarters/cmo) +"bEC" = ( +/obj/machinery/computer/scan_consolenew{ + dir = 4 + }, +/obj/effect/turf_decal/siding/purple{ + dir = 8 + }, +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/science/genetics) "bER" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, @@ -4399,6 +4604,19 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"bEW" = ( +/obj/machinery/light/small/directional/north, +/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 + }, +/obj/machinery/modular_computer/preset/id, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) "bFr" = ( /obj/item/paper_bin{ pixel_x = -2; @@ -4416,6 +4634,15 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/engineering/break_room) +"bFH" = ( +/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) "bFN" = ( /obj/machinery/chem_dispenser{ layer = 2.7 @@ -4429,6 +4656,13 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron/white, /area/station/medical/pharmacy) +"bGo" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/spawner/random/structure/crate_loot, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "bGt" = ( /obj/machinery/newscaster/directional/east, /turf/open/floor/iron, @@ -4439,10 +4673,10 @@ "bGJ" = ( /obj/structure/chair/stool/bar/directional/south, /obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar/opposingcorners, /obj/effect/turf_decal/siding/wood{ - dir = 1 + dir = 9 }, -/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/commons/lounge) "bGL" = ( @@ -4460,8 +4694,9 @@ /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/any/supply/mining, +/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, /obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/access/all/supply/mining, /turf/open/floor/iron, /area/station/cargo/miningoffice) "bHb" = ( @@ -4475,6 +4710,10 @@ /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 1 }, +/obj/item/storage/box/bandages{ + pixel_y = 6; + pixel_x = 4 + }, /turf/open/floor/iron, /area/station/cargo/miningoffice) "bHr" = ( @@ -4500,6 +4739,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"bHN" = ( +/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) "bHQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/sorting/mail{ @@ -4552,16 +4798,6 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/storage) -"bJc" = ( -/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, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "bJk" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -4569,6 +4805,19 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"bJp" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "bJq" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -4576,6 +4825,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"bJG" = ( +/obj/machinery/modular_computer/preset/id{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) "bJQ" = ( /obj/machinery/vending/coffee, /obj/effect/turf_decal/bot, @@ -4638,19 +4897,6 @@ "bLd" = ( /turf/closed/wall, /area/station/maintenance/starboard/aft) -"bLg" = ( -/obj/structure/fireaxecabinet/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Atmospherics - Port" - }, -/obj/machinery/light/no_nightlight/directional/west, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos) "bLh" = ( /obj/effect/turf_decal/trimline/green/line{ dir = 1 @@ -4680,6 +4926,10 @@ /obj/effect/turf_decal/trimline/brown/filled/warning, /turf/open/floor/iron, /area/station/cargo/sorting) +"bLm" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/carpet/green, +/area/station/maintenance/port/aft) "bLC" = ( /obj/machinery/conveyor{ dir = 1; @@ -4720,21 +4970,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"bMh" = ( -/obj/effect/turf_decal/trimline/neutral/filled/warning{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"bMp" = ( -/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/backroom) "bMA" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -4761,20 +4996,36 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/execution/education) -"bMP" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ - dir = 8; - initialize_directions = 4; - name = "euthanization chamber freezer" +"bMS" = ( +/obj/structure/table/glass, +/obj/item/scalpel{ + pixel_y = 12 }, -/obj/machinery/light/small/directional/north, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/iron, -/area/station/science/xenobiology) +/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) "bMY" = ( /turf/closed/wall, /area/station/medical/office) +"bNa" = ( +/obj/machinery/shower/directional/west, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white/textured, +/area/station/medical/surgery/theatre) +"bNc" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) "bNf" = ( /obj/structure/closet/secure_closet/bar, /obj/machinery/light/small/directional/west, @@ -4788,17 +5039,9 @@ pixel_y = 7 }, /obj/structure/table, -/obj/machinery/firealarm/directional/east, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) -"bNk" = ( -/obj/machinery/photocopier, -/obj/machinery/camera/directional/east{ - c_tag = "Law Office" - }, -/turf/open/floor/wood, -/area/station/service/lawoffice) "bNl" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -4857,29 +5100,17 @@ /obj/item/stack/rods, /turf/open/space/basic, /area/station/solars/port/fore) -"bOA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/table, -/obj/machinery/fax{ - fax_name = "Service Hallway"; - name = "Service Fax Machine" - }, -/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) "bOH" = ( /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/maintenance/port/aft) +"bPa" = ( +/obj/machinery/computer/security/qm{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/command/heads_quarters/qm) "bPi" = ( /obj/structure/chair/office{ dir = 8 @@ -4928,18 +5159,11 @@ /obj/item/bodypart/arm/left, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) -"bQs" = ( -/obj/structure/flora/bush/flowers_pp/style_random, -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/machinery/light/directional/east, -/turf/open/floor/grass, -/area/station/science/ordnance/office) -"bQM" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) +"bQN" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/computer/security/telescreen/entertainment/directional/north, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) "bQO" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/machinery/camera/directional/north{ @@ -4963,6 +5187,30 @@ /obj/effect/landmark/start/scientist, /turf/open/floor/engine, /area/station/science/explab) +"bRq" = ( +/obj/structure/table/wood, +/obj/item/food/grown/harebell{ + pixel_x = -6; + pixel_y = 10 + }, +/obj/item/food/grown/harebell{ + pixel_x = 8; + pixel_y = 12 + }, +/obj/item/food/grown/harebell{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/food/grown/harebell{ + pixel_y = 7 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"bRF" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/security/brig) "bRG" = ( /obj/machinery/shower/directional/west, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -5012,10 +5260,9 @@ /turf/open/floor/iron, /area/station/security/prison/garden) "bSj" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 4 }, -/obj/item/paper/fluff/ids_for_dummies, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) "bSm" = ( @@ -5033,13 +5280,30 @@ dir = 8 }, /area/station/commons/fitness) -"bSu" = ( +"bSs" = ( /obj/effect/turf_decal/stripes/line{ - dir = 9 + dir = 5 }, -/obj/machinery/light/directional/west, +/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/structure/window/reinforced/spawner/directional/north, +/obj/machinery/requests_console/directional/west{ + department = "Pharmacy"; + name = "Pharmacy Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/ore_update, /turf/open/floor/iron/white, -/area/station/science/xenobiology) +/area/station/medical/pharmacy) "bSY" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance, @@ -5056,17 +5320,26 @@ /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/tile/bar/opposingcorners, /obj/effect/turf_decal/siding/wood{ - dir = 1 + dir = 5 }, -/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/commons/lounge) -"bTn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/medical/abandoned) +"bTm" = ( +/obj/structure/table/reinforced, +/obj/item/wheelchair{ + pixel_y = -3 + }, +/obj/item/wheelchair, +/obj/item/wheelchair{ + pixel_y = 3 + }, +/obj/structure/window/spawner/directional/north, +/obj/structure/window/spawner/directional/west, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/medical/office) "bTq" = ( /obj/machinery/camera/motion/directional/south{ c_tag = "AI Upload Chamber - Port"; @@ -5077,16 +5350,6 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) -"bTP" = ( -/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) "bUc" = ( /obj/machinery/shower/directional/west, /obj/effect/landmark/start/assistant, @@ -5118,6 +5381,27 @@ }, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"bUo" = ( +/obj/structure/table/reinforced, +/obj/item/stack/sheet/plasteel{ + amount = 15 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = 5; + pixel_y = 7 + }, +/obj/structure/fireaxecabinet/mechremoval/directional/east, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/science/robotics/lab) +"bUt" = ( +/obj/structure/table/wood, +/obj/machinery/computer/security/telescreen/entertainment/directional/north, +/obj/item/radio/intercom/directional/west, +/obj/item/pinpointer/nuke, +/obj/item/disk/nuclear, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) "bUC" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, @@ -5143,11 +5427,29 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron, /area/station/commons/storage/primary) +"bVp" = ( +/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) "bVs" = ( /obj/item/radio/intercom/directional/west, /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/dark, /area/station/command/bridge) +"bVx" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) "bVz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -5233,6 +5535,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) +"bWw" = ( +/obj/structure/chair/stool/directional/south, +/obj/machinery/computer/pod/old/mass_driver_controller/trash{ + pixel_x = -24 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "bWM" = ( /obj/item/radio/intercom/directional/south, /obj/effect/turf_decal/tile/blue, @@ -5287,14 +5596,8 @@ /obj/item/stack/sheet/mineral/plasma{ pixel_y = 4 }, -/obj/item/reagent_containers/cup/beaker{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/reagent_containers/dropper, -/obj/item/reagent_containers/cup/beaker/large{ - pixel_x = -3; - pixel_y = 3 +/obj/item/reagent_containers/dropper{ + pixel_y = -4 }, /obj/structure/cable, /obj/machinery/light_switch/directional/west, @@ -5309,19 +5612,11 @@ name = "hyper-reinforced wall" }, /area/station/science/ordnance/bomb) -"bXT" = ( -/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) +"bXQ" = ( +/obj/structure/bookcase/random/nonfiction, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, +/area/station/service/library) "bXX" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -5430,16 +5725,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/security/courtroom) -"caC" = ( -/obj/machinery/portable_atmospherics/canister/anesthetic_mix, -/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) +"caO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "cbg" = ( /obj/effect/turf_decal/tile/purple{ dir = 1 @@ -5459,6 +5752,14 @@ "cbz" = ( /turf/closed/wall, /area/station/cargo/storage) +"ccc" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "ccD" = ( /mob/living/carbon/human/species/monkey, /turf/open/floor/grass, @@ -5469,19 +5770,25 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"ccV" = ( +"ccP" = ( +/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/item/radio/intercom/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"cdq" = ( -/obj/machinery/mech_bay_recharge_port{ - dir = 8 +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 4 }, -/obj/machinery/light/directional/east, -/turf/open/floor/plating, -/area/station/science/robotics/mechbay) +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"cdk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "cdv" = ( /obj/machinery/door/airlock{ id_tag = "AuxToilet1"; @@ -5489,13 +5796,6 @@ }, /turf/open/floor/iron, /area/station/commons/toilet/auxiliary) -"cdB" = ( -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/commons/lounge) "cdC" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp/green{ @@ -5596,10 +5896,6 @@ /obj/machinery/holopad, /turf/open/floor/iron, /area/station/commons/dorms) -"cft" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "cfv" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate/preopen, @@ -5638,12 +5934,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"cgJ" = ( -/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) "cgL" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -5656,21 +5946,6 @@ /obj/machinery/air_sensor/ordnance_burn_chamber, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/burnchamber) -"cgR" = ( -/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, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "cha" = ( /obj/machinery/door/airlock/research/glass{ name = "Ordnance Lab" @@ -5688,6 +5963,7 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 }, +/obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, /area/station/medical/break_room) "chH" = ( @@ -5724,10 +6000,6 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/space/nearstation) -"ciq" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "ciG" = ( /obj/structure/table/wood, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -5763,18 +6035,27 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/maintenance/fore) +"cjv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "cjJ" = ( /turf/open/floor/carpet/red, /area/station/command/heads_quarters/qm) -"cke" = ( -/obj/structure/showcase/machinery/tv{ - dir = 1; - pixel_x = 2; - pixel_y = 3 - }, -/obj/structure/table/wood, -/turf/open/floor/carpet, -/area/station/command/corporate_showroom) +"cky" = ( +/obj/machinery/power/shieldwallgen, +/obj/machinery/light/cold/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/window/spawner/directional/north, +/turf/open/floor/iron/dark, +/area/station/command/teleporter) "ckz" = ( /obj/effect/landmark/generic_maintenance_landmark, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -5788,13 +6069,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"ckG" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/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) "ckI" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -5804,56 +6078,16 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"ckU" = ( -/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) -"ckZ" = ( -/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"; - name = "Janitorial Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/iron, -/area/station/service/janitor) -"cli" = ( -/obj/machinery/light/directional/north, -/obj/structure/table/wood, -/obj/machinery/microwave{ - pixel_x = 1; - pixel_y = 6 - }, -/turf/open/floor/iron/dark, -/area/station/service/cafeteria) "clj" = ( /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"cln" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/iron, +/area/station/science/research) "clp" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, @@ -5861,6 +6095,15 @@ "clq" = ( /turf/open/floor/carpet, /area/station/security/detectives_office) +"cly" = ( +/obj/machinery/computer/quantum_console, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/camera/directional/north{ + c_tag = "Mining Dock" + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "clA" = ( /obj/structure/sign/departments/cargo, /turf/closed/wall, @@ -5897,16 +6140,6 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/storage) -"cms" = ( -/obj/machinery/light/directional/east, -/obj/structure/sign/departments/science/directional/east{ - name = "\improper ROBOTICS!" - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) "cmB" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -5961,17 +6194,6 @@ }, /turf/open/floor/iron, /area/station/science/explab) -"cnv" = ( -/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) "cnA" = ( /obj/machinery/status_display/evac/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -5984,13 +6206,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"cnE" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/commons/lounge) "cnF" = ( /obj/structure/cable, /obj/item/solar_assembly, @@ -6045,10 +6260,6 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/wood, /area/station/maintenance/port/aft) -"coX" = ( -/obj/machinery/light/no_nightlight/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) "cpi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit/green{ @@ -6114,6 +6325,28 @@ }, /turf/open/floor/iron/white, /area/station/science/research) +"cqd" = ( +/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/station/security/holding_cell) "cqk" = ( /obj/structure/cable, /turf/open/floor/plating/airless, @@ -6148,16 +6381,6 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"cqw" = ( -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ - dir = 10 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "cqD" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -6197,7 +6420,7 @@ /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, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "crk" = ( /obj/machinery/airalarm/directional/east, @@ -6237,23 +6460,13 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/white, /area/station/security/prison) -"csi" = ( -/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, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/north, -/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 = list("ordnance") +"css" = ( +/obj/structure/chair/comfy{ + dir = 4 }, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) +/obj/machinery/light/small/red/directional/west, +/turf/open/floor/plating/airless, +/area/space/nearstation) "cst" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Engineering Foyer" @@ -6265,6 +6478,7 @@ }, /obj/effect/mapping_helpers/airlock/access/any/engineering/general, /obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/obj/effect/landmark/navigate_destination, /turf/open/floor/iron, /area/station/engineering/break_room) "csz" = ( @@ -6324,13 +6538,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) -"ctO" = ( -/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) "cuc" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -6341,6 +6548,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) +"cuk" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/smooth_corner{ + dir = 1 + }, +/area/station/medical/morgue) "cur" = ( /turf/open/floor/plating, /area/station/maintenance/fore) @@ -6350,6 +6569,24 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) +"cuM" = ( +/obj/machinery/newscaster/directional/south, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/obj/structure/table, +/obj/item/reagent_containers/cup/beaker/large, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/item/reagent_containers/cup/rag{ + pixel_x = -4 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "cuO" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -6358,46 +6595,12 @@ /obj/structure/sign/warning/secure_area/directional/west, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) -"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) "cuZ" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 }, /turf/open/floor/iron, /area/station/engineering/main) -"cvd" = ( -/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/structure/window/spawner/directional/south, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "cve" = ( /obj/machinery/biogenerator, /turf/closed/wall, @@ -6409,6 +6612,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /turf/open/floor/engine, /area/station/science/cytology) +"cvs" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/lockers) "cvt" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ @@ -6416,6 +6627,16 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"cvw" = ( +/obj/machinery/recharge_station, +/turf/open/floor/iron/dark, +/area/station/security/lockers) +"cvy" = ( +/obj/item/storage/crayons, +/obj/structure/table/wood, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) "cvE" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6530,19 +6751,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/science/robotics/lab) -"cwu" = ( -/obj/item/cigbutt, -/obj/machinery/light/small/directional/east, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/wood, -/area/station/command/corporate_showroom) "cwF" = ( /obj/structure/sink/directional/west, /obj/structure/mirror/directional/east, /obj/effect/landmark/start/hangover, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) +"cwK" = ( +/obj/structure/closet/wardrobe/grey, +/obj/effect/landmark/start/hangover/closet, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "cwM" = ( /obj/structure/chair/stool/directional/east, /obj/effect/turf_decal/trimline/red/warning{ @@ -6626,9 +6847,24 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron/white, /area/station/medical/office) +"cxw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/showcase/machinery/cloning_pod{ + desc = "An old decommissioned scanner, permanently scuttled."; + icon_state = "scanner"; + name = "decommissioned cloning scanner" + }, +/obj/structure/sign/poster/contraband/random/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) "cxz" = ( /turf/closed/wall, /area/station/science/ordnance/bomb) +"cxC" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/wood, +/area/station/service/library) "cxU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -6648,6 +6884,15 @@ }, /turf/open/floor/wood, /area/station/service/library) +"cyp" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/turf_decal/siding/purple{ + dir = 6 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/storage) "cyG" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -6698,6 +6943,14 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"czt" = ( +/obj/machinery/flasher/portable, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/lockers) "czG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6720,11 +6973,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"czQ" = ( -/obj/machinery/telecomms/server/presets/service, -/obj/machinery/light/small/directional/south, -/turf/open/floor/circuit/telecomms/mainframe, -/area/station/tcommsat/server) "czT" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -6743,20 +6991,12 @@ c_tag = "Science Lobby"; network = list("ss13","rd") }, -/obj/machinery/vending/modularpc, /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 1 }, +/obj/machinery/destructive_scanner, /turf/open/floor/iron/white, /area/station/science/lobby) -"cAB" = ( -/obj/machinery/light/directional/west, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "cAG" = ( /obj/effect/turf_decal/tile/green/opposingcorners{ dir = 1 @@ -6795,13 +7035,24 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/locker) -"cBJ" = ( -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +"cBV" = ( +/obj/machinery/mech_bay_recharge_port{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/science/robotics/mechbay) +"cCx" = ( +/obj/machinery/modular_computer/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/security/courtroom) +/area/station/science/explab) "cCM" = ( /obj/structure/lattice/catwalk, /obj/item/reagent_containers/cup/glass/bottle/rum{ @@ -6854,15 +7105,6 @@ }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) -"cDA" = ( -/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) "cDD" = ( /obj/structure/lattice/catwalk, /obj/item/instrument/guitar, @@ -6902,6 +7144,14 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"cDX" = ( +/obj/structure/chair/stool/bar/directional/south, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) "cEv" = ( /obj/item/food/grown/wheat, /obj/item/food/grown/watermelon, @@ -6914,6 +7164,10 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"cEx" = ( +/obj/structure/dresser, +/turf/open/floor/wood, +/area/station/service/theater) "cFa" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 4 @@ -6927,34 +7181,26 @@ "cFl" = ( /obj/structure/table, /obj/structure/cable, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap{ - pixel_x = 6 - }, -/obj/item/hand_labeler, -/obj/item/book/manual/chef_recipes{ - pixel_x = 2; - pixel_y = 6 - }, +/obj/item/kitchen/rollingpin, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) "cFp" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/commons/storage/primary) +"cFr" = ( +/obj/structure/table, +/obj/machinery/status_display/evac/directional/east, +/obj/machinery/flasher/directional/south{ + id = "AI" + }, +/obj/effect/spawner/round_default_module, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) "cFu" = ( /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, /area/station/engineering/supermatter/room) -"cFv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, -/obj/structure/cable, -/obj/machinery/light/small/directional/east, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "cGj" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -6966,41 +7212,37 @@ /turf/open/floor/plating, /area/station/security/brig) "cGL" = ( +/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 1 - }, -/obj/effect/mapping_helpers/mail_sorting/supply/disposals, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"cGS" = ( -/obj/machinery/airalarm/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Atmospherics - Port-Aft" - }, -/obj/machinery/light/no_nightlight/directional/west, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, -/obj/effect/turf_decal/tile/yellow{ +/obj/structure/cable, +/obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 8 }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos) +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "cGV" = ( /obj/machinery/air_sensor/plasma_tank, /turf/open/floor/engine/plasma, /area/station/engineering/atmos) +"cGX" = ( +/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/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/central) "cHb" = ( /obj/structure/filingcabinet{ pixel_x = 3 }, /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) -"cHj" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall, -/area/station/commons/toilet/auxiliary) "cHE" = ( /obj/effect/landmark/event_spawn, /obj/structure/cable, @@ -7077,9 +7319,7 @@ /turf/open/floor/iron, /area/station/security/brig) "cJm" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, +/obj/item/kirbyplants/organic/plant21, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 8 }, @@ -7143,6 +7383,17 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/carpet, /area/station/commons/dorms) +"cKN" = ( +/obj/structure/table/wood, +/obj/structure/cable, +/obj/item/storage/backpack/satchel/leather/withwallet{ + pixel_x = -1; + pixel_y = 4 + }, +/obj/item/stack/package_wrap, +/obj/item/hand_labeler, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "cLa" = ( /obj/structure/weightmachine, /obj/effect/turf_decal/tile/dark_red/half/contrasted, @@ -7158,11 +7409,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/command/heads_quarters/qm) -"cLe" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/commons/locker) "cLj" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -7212,6 +7458,13 @@ /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"cMg" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/entry) "cMG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7240,6 +7493,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/medical/psychology, /obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/landmark/navigate_destination, /turf/open/floor/iron/white, /area/station/medical/psychology) "cNk" = ( @@ -7359,6 +7613,12 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/white, /area/station/science/ordnance/office) +"cPU" = ( +/obj/item/cigbutt, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) "cQc" = ( /obj/machinery/door/airlock/public/glass{ name = "Space Bridge Access" @@ -7380,43 +7640,6 @@ /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"cQd" = ( -/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) -"cQm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/generic_maintenance_landmark, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/white/smooth_large, -/area/station/medical/abandoned) -"cQq" = ( -/obj/machinery/status_display/door_timer{ - id = "Cell 2"; - name = "Cell 2"; - pixel_y = -32 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/security/brig) -"cQr" = ( -/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) "cQx" = ( /obj/machinery/computer/atmos_control/nitrous_tank{ dir = 1 @@ -7445,12 +7668,6 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"cRj" = ( -/obj/machinery/vending/hydronutrients, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/service/hydroponics) "cRo" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -7465,31 +7682,25 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"cRW" = ( -/obj/machinery/light/directional/south, -/obj/machinery/button/door/directional/south{ - id = "roboticsprivacy2"; - name = "Robotics Privacy Control"; - req_access = list("robotics") - }, -/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" +"cRw" = ( +/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/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"cRU" = ( +/obj/structure/bed, +/obj/item/bedsheet/captain, +/obj/effect/landmark/start/captain, +/obj/machinery/camera/directional/east{ + c_tag = "Captain's Quarters" }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) "cSb" = ( /obj/structure/plasticflaps, /obj/machinery/disposal/delivery_chute, @@ -7572,11 +7783,6 @@ /obj/effect/mapping_helpers/mail_sorting/science/genetics, /turf/open/floor/iron/white, /area/station/science/research) -"cSW" = ( -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "cTj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -7620,6 +7826,14 @@ }, /turf/open/floor/engine, /area/station/science/cytology) +"cTA" = ( +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/effect/spawner/random/armory/riot_armor, +/obj/effect/spawner/random/armory/bulletproof_armor, +/obj/structure/rack, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "cTC" = ( /obj/structure/chair, /obj/effect/landmark/start/assistant, @@ -7657,6 +7871,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/security/prison) +"cUk" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/wood, +/area/station/security/office) "cUw" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, @@ -7794,6 +8015,11 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/service/hydroponics) +"cXg" = ( +/obj/machinery/recharge_station, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/science/robotics/mechbay) "cXw" = ( /obj/machinery/holopad, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -7806,6 +8032,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/office) +"cXH" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/obj/structure/sign/poster/official/safety_eye_protection/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "cXP" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/engine, @@ -7831,14 +8064,6 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) -"cYd" = ( -/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) "cYg" = ( /obj/effect/turf_decal/bot_white, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -7870,16 +8095,19 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central) -"cYX" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/security/prison) "cYY" = ( /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) +"cZi" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/wood/parquet, +/area/station/medical/psychology) "cZk" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/east, @@ -7909,6 +8137,7 @@ /obj/machinery/atmospherics/components/unary/thermomachine/heater{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "cZK" = ( @@ -7923,6 +8152,11 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) +"daa" = ( +/obj/structure/table/reinforced, +/obj/machinery/computer/records/medical/laptop, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "dac" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -7940,20 +8174,6 @@ "daC" = ( /turf/open/floor/wood, /area/station/service/lawoffice) -"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) "daT" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /turf/open/floor/iron, @@ -8015,6 +8235,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"dbD" = ( +/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 + }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/cmo) "dbX" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8045,7 +8278,7 @@ anchored = 1; dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/engine/vacuum, /area/space/nearstation) "dcN" = ( @@ -8154,6 +8387,19 @@ /obj/machinery/vending/wardrobe/law_wardrobe, /turf/open/floor/wood, /area/station/service/lawoffice) +"deH" = ( +/obj/machinery/button/door/directional/south{ + id = "roboticsprivacy2"; + name = "Robotics Privacy Control"; + req_access = list("robotics") + }, +/obj/structure/closet/crate/mod, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) "deO" = ( /obj/effect/spawner/random/maintenance, /obj/structure/disposalpipe/segment{ @@ -8226,21 +8472,6 @@ "dfC" = ( /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) -"dfE" = ( -/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) -"dfG" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) "dfO" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -8363,16 +8594,6 @@ /obj/machinery/rnd/production/techfab/department/security, /turf/open/floor/iron/dark, /area/station/security/office) -"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) "dhi" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8384,7 +8605,7 @@ /turf/closed/wall/r_wall, /area/station/command/bridge) "dhp" = ( -/obj/machinery/modular_computer/console/preset/engineering, +/obj/machinery/modular_computer/preset/engineering, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 }, @@ -8470,24 +8691,27 @@ }, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"dim" = ( +/obj/effect/decal/cleanable/dirt, +/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/cup/rag, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) "diq" = ( /obj/effect/turf_decal/delivery, -/obj/machinery/door/window/left/directional/south{ - dir = 8; - name = "Maximum Security Test Chamber"; +/obj/machinery/door/window/left/directional/west{ + name = "Containment Pen #5"; req_access = list("xenobiology") }, /turf/open/floor/iron, /area/station/science/xenobiology) -"dis" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/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) "diC" = ( /obj/machinery/door/airlock/maintenance{ name = "Atmospherics Maintenance" @@ -8506,6 +8730,11 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"diJ" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/construction/mining/aux_base) "diX" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /turf/open/floor/iron/dark, @@ -8528,18 +8757,6 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/iron, /area/station/cargo/storage) -"dks" = ( -/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) "dkx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, @@ -8586,14 +8803,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/engineering/break_room) -"dli" = ( -/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) "dlr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/broken_floor, @@ -8614,6 +8823,11 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"dlL" = ( +/obj/structure/sign/warning/vacuum/external/directional/west, +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/plating, +/area/station/maintenance/port) "dmJ" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ @@ -8655,15 +8869,6 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating/airless, /area/space/nearstation) -"dnV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, -/obj/machinery/light/directional/north, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "dnW" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ dir = 4 @@ -8676,6 +8881,13 @@ /obj/structure/window/spawner/directional/south, /turf/open/floor/iron, /area/station/engineering/atmos) +"dob" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/obj/machinery/computer/order_console/bitrunning, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "dox" = ( /obj/structure/rack, /obj/item/screwdriver{ @@ -8714,6 +8926,19 @@ }, /turf/open/floor/iron/white, /area/station/science/robotics/lab) +"dpl" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/obj/structure/table, +/obj/machinery/reagentgrinder{ + pixel_x = 2; + pixel_y = 9 + }, +/obj/item/stack/sheet/mineral/plasma{ + pixel_y = 3 + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "dpn" = ( /obj/effect/spawner/random/food_or_drink/donkpockets, /obj/structure/table/glass, @@ -8738,22 +8963,38 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"dpN" = ( +"dpx" = ( +/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/machinery/light/floor, +/turf/open/floor/iron, +/area/station/commons/locker) +"dpI" = ( +/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 = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"dpN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) -"dpT" = ( -/obj/structure/table/reinforced, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = -3; - pixel_y = 5 +"dpU" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ + dir = 4 }, -/obj/machinery/light_switch/directional/north, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 1 +/obj/machinery/camera/directional/south{ + c_tag = "Atmospherics - Central Aft" }, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs) +/obj/machinery/light/no_nightlight/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "dqc" = ( /obj/machinery/door/airlock/security/glass{ name = "N2O Storage" @@ -8772,17 +9013,36 @@ }, /turf/open/floor/plating, /area/station/maintenance/disposal) -"dqs" = ( -/obj/structure/chair/wood{ - dir = 4 +"dqu" = ( +/obj/item/book/manual/wiki/security_space_law{ + name = "space law"; + pixel_y = 2 }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/commons/dorms) +/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) "dqx" = ( /obj/structure/closet/emcloset, /turf/open/floor/plating, /area/station/hallway/secondary/entry) +"dqE" = ( +/obj/structure/closet/toolcloset, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/engineering/storage_shared) "dqI" = ( /obj/effect/turf_decal/bot, /obj/machinery/vending/cigarette, @@ -8802,31 +9062,6 @@ /obj/structure/sign/poster/contraband/random/directional/west, /turf/open/floor/wood, /area/station/service/theater) -"dra" = ( -/obj/machinery/modular_computer/console/preset/id{ - dir = 4 - }, -/obj/machinery/requests_console/directional/west{ - department = "Chief Medical Officer's Desk"; - name = "Chief Medical Officer's Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"dri" = ( -/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) "drm" = ( /turf/open/floor/plating, /area/station/maintenance/aft/greater) @@ -8861,13 +9096,6 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"drW" = ( -/obj/machinery/vending/wardrobe/chem_wardrobe, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "dsb" = ( /obj/effect/turf_decal/plaque{ icon_state = "L13" @@ -8902,6 +9130,7 @@ }, /obj/machinery/door/firedoor/heavy, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance_storage, +/obj/effect/landmark/navigate_destination, /turf/open/floor/plating, /area/station/science/ordnance/storage) "dss" = ( @@ -8916,22 +9145,6 @@ dir = 1 }, /area/station/engineering/atmos/storage/gas) -"dsE" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/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) "dsI" = ( /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/tile/blue, @@ -8996,6 +9209,19 @@ dir = 1 }, /area/station/engineering/atmos/pumproom) +"dub" = ( +/obj/machinery/modular_computer/preset/cargochat/medical{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) +"duk" = ( +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) "duu" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -9013,20 +9239,6 @@ "duI" = ( /turf/closed/wall, /area/station/command/bridge) -"dvk" = ( -/obj/structure/table, -/obj/machinery/light/directional/west, -/obj/machinery/status_display/ai/directional/west, -/obj/machinery/flasher/directional/south{ - id = "AI" - }, -/obj/item/ai_module/reset{ - pixel_x = 2; - pixel_y = 8 - }, -/obj/item/ai_module/supplied/freeform, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) "dvn" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -9079,11 +9291,19 @@ /obj/machinery/holopad, /turf/open/floor/iron, /area/station/engineering/atmos) -"dwl" = ( -/obj/structure/flora/bush/jungle/c/style_random, -/obj/machinery/light/directional/east, -/turf/open/floor/grass, -/area/station/medical/virology) +"dwk" = ( +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Morgue"; + network = list("ss13","medbay") + }, +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) "dwm" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance, @@ -9101,7 +9321,12 @@ /turf/open/floor/iron/cafeteria, /area/station/engineering/atmos) "dwA" = ( -/obj/structure/disposalpipe/segment, +/obj/effect/spawner/random/maintenance, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, /turf/open/floor/plating, /area/station/maintenance/port/fore) "dwJ" = ( @@ -9120,13 +9345,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/white, /area/station/medical/pharmacy) -"dxc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "dxe" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -9155,17 +9373,6 @@ /obj/structure/marker_beacon/purple, /turf/open/space/basic, /area/space/nearstation) -"dxO" = ( -/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/blue{ - dir = 4 - }, -/turf/open/floor/iron/white/corner, -/area/station/hallway/secondary/entry) "dyd" = ( /obj/machinery/vending/assist, /obj/effect/turf_decal/stripes/line{ @@ -9180,14 +9387,16 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"dyh" = ( -/obj/machinery/light_switch/directional/north, -/obj/structure/closet{ - name = "janitorial supplies" - }, -/obj/item/storage/box/bodybags, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) +"dyq" = ( +/obj/structure/table/glass, +/obj/item/retractor, +/obj/item/hemostat, +/obj/item/cautery, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/status_display/evac/directional/west, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) "dyr" = ( /obj/machinery/status_display/door_timer{ id = "Cell 3"; @@ -9212,28 +9421,21 @@ }, /turf/open/floor/plating, /area/station/science/lab) -"dzq" = ( -/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, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 4 +"dzh" = ( +/obj/machinery/quantum_server, +/obj/effect/turf_decal/bot/left, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 6 }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) +/obj/machinery/light/directional/north, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "dzw" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/iron, /area/station/science/robotics/mechbay) -"dzM" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "dzY" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/engine/n2o, @@ -9260,45 +9462,23 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/storage) -"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 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"dAu" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 8 - }, -/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) -"dAx" = ( -/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) "dBb" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron, /area/station/science/research) +"dBv" = ( +/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 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/cargo/storage) "dBV" = ( /obj/docking_port/stationary/escape_pod{ dir = 4 @@ -9348,12 +9528,6 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/security/courtroom) -"dCp" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "dCx" = ( /obj/machinery/computer/shuttle/mining{ dir = 4 @@ -9363,14 +9537,6 @@ }, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"dCN" = ( -/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) "dDe" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security{ @@ -9401,15 +9567,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"dDz" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "dDE" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock{ @@ -9453,26 +9610,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/science/robotics/mechbay) -"dEp" = ( -/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, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "dEx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -9483,6 +9620,14 @@ }, /turf/open/floor/iron, /area/station/engineering/gravity_generator) +"dEF" = ( +/obj/machinery/atmospherics/components/binary/pump/on, +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/science/ordnance/burnchamber) "dEH" = ( /obj/effect/landmark/generic_maintenance_landmark, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -9507,6 +9652,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/library) +"dFi" = ( +/obj/structure/closet/l3closet/virology, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/virology) "dFo" = ( /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/stripes/line{ @@ -9529,13 +9682,15 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) -"dFJ" = ( -/obj/machinery/light_switch/directional/east, -/obj/machinery/modular_computer/console/preset/curator{ - dir = 8 +"dFW" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Brig - Hallway - Entrance" }, -/turf/open/floor/wood, -/area/station/service/library) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/security/brig) "dGa" = ( /obj/structure/flora/bush/pale/style_random, /obj/structure/flora/bush/ferny/style_random, @@ -9545,12 +9700,6 @@ /obj/structure/window/spawner/directional/west, /turf/open/floor/grass, /area/station/science/research) -"dGi" = ( -/obj/structure/bodycontainer/morgue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "dGq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/stairs/left{ @@ -9584,6 +9733,10 @@ /obj/effect/turf_decal/trimline/green/filled/corner, /turf/open/floor/iron, /area/station/hallway/primary/central) +"dGQ" = ( +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) "dGW" = ( /obj/machinery/holopad, /obj/effect/decal/cleanable/dirt, @@ -9604,11 +9757,6 @@ /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) "dHg" = ( -/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/computer/atmos_alert, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -9637,27 +9785,14 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/pharmacy) -"dHQ" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/obj/structure/cable, -/obj/item/radio/intercom/prison/directional/north, -/turf/open/floor/iron, -/area/station/security/prison/garden) -"dIe" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/obj/effect/spawner/random/trash/soap{ - spawn_scatter_radius = 1 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) +"dHY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/medical/patient_stretcher, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/medical/abandoned) "dIm" = ( -/obj/machinery/modular_computer/console/preset/id, +/obj/machinery/modular_computer/preset/id, /obj/machinery/requests_console/directional/north{ department = "Chief Engineer's Desk"; name = "Chief Engineer's Requests Console" @@ -9671,14 +9806,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/central) -"dIA" = ( -/obj/structure/rack, -/obj/item/wrench/medical, -/obj/effect/turf_decal/siding/white, -/obj/item/food/popsicle/creamsicle_orange, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/kitchen_coldroom, -/area/station/medical/coldroom) "dIK" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -9687,13 +9814,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"dIL" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/white/smooth_edge, -/area/station/medical/medbay/central) "dIO" = ( /turf/closed/wall, /area/station/commons/toilet/restrooms) @@ -9711,6 +9831,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"dIS" = ( +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "dIV" = ( /obj/machinery/door/window/right/directional/west, /turf/open/floor/wood, @@ -9726,6 +9850,15 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark, /area/station/science/ordnance/freezerchamber) +"dJk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/chem_master, +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "dJo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -9749,7 +9882,6 @@ /obj/item/computer_disk/engineering, /obj/item/computer_disk/engineering, /obj/item/computer_disk/engineering, -/obj/item/computer_disk/atmos, /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) @@ -9792,17 +9924,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"dKL" = ( -/obj/structure/closet/toolcloset, -/obj/effect/turf_decal/bot, -/obj/structure/sign/poster/official/random/directional/north, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/storage_shared) "dKO" = ( /obj/structure/urinal/directional/north, /obj/structure/cable, @@ -9836,6 +9957,15 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"dLn" = ( +/obj/structure/rack, +/obj/item/wrench/medical, +/obj/effect/turf_decal/siding/white, +/obj/item/food/popsicle/creamsicle_orange, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/turf/open/floor/iron/kitchen_coldroom, +/area/station/medical/coldroom) "dLq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -9848,13 +9978,6 @@ /obj/effect/mapping_helpers/mail_sorting/service/theater, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"dLs" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/cup/glass/bottle/vodka, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) "dLu" = ( /obj/machinery/newscaster/directional/north, /obj/machinery/disposal/bin, @@ -9883,20 +10006,10 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"dLO" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/gravity_generator) "dLQ" = ( /obj/item/clothing/suit/hazardvest, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"dLR" = ( -/obj/machinery/light/directional/south, -/obj/machinery/bluespace_vendor/directional/south, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/commons/locker) "dLT" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -9922,6 +10035,13 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) +"dMk" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/west, +/obj/structure/reagent_dispensers/beerkeg, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) "dMv" = ( /obj/machinery/holopad, /obj/structure/cable, @@ -9952,6 +10072,13 @@ }, /turf/open/floor/iron/dark, /area/station/medical/storage) +"dMO" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/courtroom) "dMY" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/blue/half/contrasted, @@ -10044,6 +10171,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/entry) +"dPm" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 5 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) "dPy" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -10152,6 +10287,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"dRj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/structure/closet/secure_closet/atmospherics, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "dRp" = ( /obj/machinery/holopad, /obj/effect/spawner/random/engineering/tracking_beacon, @@ -10207,6 +10348,12 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) +"dRX" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/obj/effect/spawner/random/armory/riot_shield, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "dRY" = ( /obj/structure/chair/office, /obj/effect/landmark/start/hangover, @@ -10227,6 +10374,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/prison/safe) +"dSE" = ( +/obj/structure/table/wood, +/obj/machinery/newscaster/directional/north, +/obj/effect/spawner/random/entertainment/lighter, +/turf/open/floor/wood, +/area/station/commons/dorms) "dSF" = ( /obj/structure/punching_bag, /obj/effect/turf_decal/trimline/dark_red, @@ -10237,6 +10390,11 @@ /obj/effect/turf_decal/tile/brown/anticorner/contrasted, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"dSJ" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/sign/poster/random/directional/north, +/turf/open/floor/wood/large, +/area/station/service/theater) "dTi" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -10247,6 +10405,12 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"dTp" = ( +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/dark, +/area/station/command/gateway) "dTq" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/hatch{ @@ -10269,25 +10433,6 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) -"dTs" = ( -/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/structure/extinguisher_cabinet/directional/east, -/obj/machinery/light/directional/east, -/obj/structure/table/glass, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) "dTv" = ( /obj/structure/closet/secure_closet/personal, /obj/item/clothing/under/misc/assistantformal, @@ -10301,15 +10446,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/locker) -"dTH" = ( -/obj/effect/decal/cleanable/dirt, -/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) "dTQ" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 4 @@ -10324,6 +10460,19 @@ /obj/structure/reagent_dispensers/wall/peppertank/directional/east, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) +"dTV" = ( +/obj/item/folder/red{ + pixel_y = 3 + }, +/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) "dTX" = ( /obj/effect/landmark/start/chemist, /turf/open/floor/iron/white, @@ -10334,6 +10483,14 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) +"dUo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "dUB" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -10381,12 +10538,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"dVR" = ( -/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) "dVT" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -10396,6 +10547,23 @@ /obj/machinery/door/firedoor/heavy, /turf/open/floor/iron/dark/textured, /area/station/engineering/atmos) +"dVX" = ( +/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, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/north, +/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 = list("ordnance") + }, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "dWd" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -10437,18 +10605,6 @@ /obj/structure/chair/stool/directional/west, /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) -"dWF" = ( -/obj/machinery/light/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Port Primary Hallway - Middle" - }, -/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/hallway/primary/port) "dWG" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -10456,6 +10612,10 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/main) +"dWI" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "dWN" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{ dir = 4 @@ -10502,6 +10662,11 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plating, /area/station/security/prison) +"dXp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/turn_off_lights_with_lightswitch, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "dXA" = ( /obj/structure/closet/crate/trashcart, /obj/effect/spawner/random/contraband/prison, @@ -10519,12 +10684,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"dXP" = ( -/obj/effect/decal/cleanable/oil, -/obj/machinery/light/small/directional/west, -/obj/effect/spawner/random/engineering/tank, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "dXQ" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/effect/turf_decal/tile/neutral, @@ -10592,6 +10751,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) +"dYG" = ( +/obj/structure/sign/poster/official/anniversary_vintage_reprint/directional/north, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "dYK" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/wood{ @@ -10660,31 +10827,13 @@ }, /turf/open/floor/plating, /area/station/cargo/storage) -"dZU" = ( -/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 = list("brig_entrance") - }, -/obj/item/folder/red{ - pixel_x = 4; - pixel_y = 2 - }, -/obj/item/paper, -/turf/open/floor/plating, -/area/station/security/checkpoint/medical) -"dZY" = ( -/obj/machinery/computer/security/telescreen/interrogation{ - dir = 8; - pixel_x = 30 +"eaa" = ( +/obj/structure/sign/painting/library{ + pixel_y = -32 }, -/obj/effect/turf_decal/trimline/red/filled/corner, -/turf/open/floor/iron, -/area/station/security/brig) +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/station/service/library) "eal" = ( /obj/structure/table/wood, /obj/item/book/manual/wiki/security_space_law{ @@ -10731,28 +10880,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) -"ebn" = ( -/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) -"ebq" = ( -/obj/structure/table/wood/fancy/royalblue, -/obj/machinery/door/window{ - dir = 8; - name = "Secure Art Exhibition"; - req_access = list("library") - }, -/obj/structure/sign/painting/library_secure{ - pixel_x = 32 - }, -/obj/effect/spawner/random/decoration/statue{ - spawn_loot_chance = 50 - }, -/obj/structure/window/spawner/directional/south, -/turf/open/floor/carpet/royalblue, -/area/station/service/library) "ebr" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=0-SecurityDesk"; @@ -10882,8 +11009,31 @@ /obj/item/clipboard, /obj/item/toy/figure/cmo, /obj/structure/cable, +/obj/item/stamp/head/cmo{ + pixel_x = -9 + }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) +"edq" = ( +/obj/machinery/light/small/directional/west, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron, +/area/station/commons/dorms) +"edr" = ( +/obj/item/flashlight/flare/candle{ + pixel_x = 1; + pixel_y = 10 + }, +/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) "edu" = ( /turf/closed/wall/r_wall, /area/station/maintenance/solars/starboard/aft) @@ -10921,12 +11071,14 @@ /turf/open/floor/plating, /area/station/cargo/sorting) "edP" = ( -/obj/structure/disposalpipe/segment, /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 = 5 + }, /turf/open/floor/plating, /area/station/maintenance/port/fore) "edQ" = ( @@ -10967,6 +11119,16 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"eeT" = ( +/obj/machinery/vending/hydroseeds{ + slogan_delay = 700 + }, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "efa" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, @@ -10997,6 +11159,17 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"efN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/button/door/directional/east{ + id = "atmoshfr"; + name = "Radiation Shutters Control"; + req_access = list("atmospherics") + }, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/obj/machinery/light/no_nightlight/directional/east, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/atmos) "efY" = ( /obj/structure/chair/office{ dir = 1 @@ -11033,7 +11206,7 @@ dir = 8 }, /turf/open/floor/iron/textured, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) "egg" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -11042,8 +11215,8 @@ /turf/open/floor/iron/dark, /area/station/security/prison/safe) "egk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) "egn" = ( @@ -11070,16 +11243,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"egO" = ( -/obj/machinery/mineral/stacking_unit_console{ - pixel_x = 32 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "egP" = ( /obj/item/radio/intercom/directional/north, /obj/effect/turf_decal/stripes/line{ @@ -11088,16 +11251,20 @@ /obj/machinery/atmospherics/components/unary/bluespace_sender, /turf/open/floor/iron, /area/station/engineering/atmos) -"egZ" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Medbay Main Hallway - South"; - network = list("ss13","medbay") - }, +"egR" = ( +/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, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/medical/abandoned) +"egS" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/light/directional/south, /turf/open/floor/iron/white, -/area/station/medical/medbay/central) +/area/station/science/xenobiology) "ehg" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 6 @@ -11129,6 +11296,13 @@ }, /turf/open/floor/plating, /area/station/security/execution/education) +"ehE" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/machinery/photocopier, +/turf/open/floor/iron/white, +/area/station/medical/office) "ehG" = ( /obj/effect/landmark/generic_maintenance_landmark, /obj/effect/decal/cleanable/blood/old, @@ -11173,14 +11347,6 @@ /mob/living/simple_animal/bot/cleanbot/medbay, /turf/open/floor/iron/white, /area/station/medical/storage) -"eio" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall, -/area/station/maintenance/starboard/greater) -"eiq" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) "eiO" = ( /obj/structure/table, /obj/item/storage/backpack/duffelbag/sec{ @@ -11208,20 +11374,6 @@ /obj/machinery/duct, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/storage) -"eji" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos/storage/gas) "ejl" = ( /obj/structure/chair/stool/directional/north, /turf/open/floor/iron, @@ -11274,6 +11426,19 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/white, /area/station/science/research) +"ejL" = ( +/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, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/science/server) "ejP" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -11290,16 +11455,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/security/prison) -"ejS" = ( -/obj/machinery/light/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "ejX" = ( /obj/machinery/holopad, /obj/structure/disposalpipe/segment{ @@ -11320,6 +11475,22 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"eks" = ( +/obj/effect/decal/cleanable/oil, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"eky" = ( +/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/dark_blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "ekB" = ( /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, @@ -11334,6 +11505,10 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/iron, /area/station/maintenance/starboard/lesser) +"ekI" = ( +/obj/structure/broken_flooring/singular/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "ekP" = ( /obj/machinery/door/window/brigdoor/security/cell{ id = "Cell 2"; @@ -11345,6 +11520,22 @@ /obj/effect/turf_decal/trimline/red/filled/line, /turf/open/floor/iron, /area/station/security/brig) +"ekQ" = ( +/obj/effect/turf_decal/siding{ + dir = 4 + }, +/obj/item/kirbyplants/random/dead/research_director, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/rd) +"ekR" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/computer/security/telescreen/entertainment/directional/north, +/turf/open/floor/iron, +/area/station/commons/lounge) "ekV" = ( /obj/machinery/mass_driver/ordnance, /turf/open/floor/plating, @@ -11479,16 +11670,17 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) -"enw" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/obj/machinery/camera/directional/north{ - c_tag = "Science Research Office"; +"enF" = ( +/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, -/area/station/science/lab) +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/science) "enK" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -11512,20 +11704,6 @@ /obj/item/compact_remote, /turf/open/floor/iron/white, /area/station/science/explab) -"enZ" = ( -/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/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/central) "eoj" = ( /obj/machinery/meter{ name = "Mixed Air Tank Out" @@ -11581,6 +11759,9 @@ /obj/effect/turf_decal/stripes/corner{ dir = 4 }, +/obj/effect/turf_decal/siding/purple{ + dir = 8 + }, /turf/open/floor/iron/white, /area/station/science/cytology) "epv" = ( @@ -11606,13 +11787,6 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) -"epB" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) "epF" = ( /obj/machinery/chem_master/condimaster{ desc = "Used to separate out liquids - useful for purifying botanical extracts. Also dispenses condiments."; @@ -11660,6 +11834,11 @@ /obj/structure/cable, /turf/open/space/basic, /area/station/solars/port/fore) +"eqn" = ( +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) "eqt" = ( /obj/effect/spawner/random/maintenance, /obj/structure/cable, @@ -11667,10 +11846,12 @@ /obj/structure/sign/poster/contraband/random/directional/west, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"eqz" = ( -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) +"eqS" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/mob/living/basic/spider/giant/sgt_araneus, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hos) "eqU" = ( /obj/machinery/light/small/directional/north, /obj/machinery/firealarm/directional/north, @@ -11718,14 +11899,6 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/general, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"erG" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "erM" = ( /obj/structure/table/wood, /obj/effect/mapping_helpers/broken_floor, @@ -11816,6 +11989,12 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) +"esK" = ( +/obj/machinery/firealarm/directional/east, +/obj/structure/cable, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/execution/education) "esR" = ( /obj/machinery/button/flasher{ id = "secentranceflasher"; @@ -11835,6 +12014,14 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron, /area/station/security/brig) +"esT" = ( +/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) "etn" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -11867,7 +12054,7 @@ /turf/open/floor/iron/dark/textured_edge{ dir = 8 }, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) "etv" = ( /obj/item/kirbyplants/random, /obj/structure/light_construct/small/directional/east, @@ -11894,33 +12081,15 @@ dir = 1 }, /area/station/engineering/atmos) -"etT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/east{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) -"euc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/l3closet/janitor, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron, -/area/station/service/janitor) -"eug" = ( -/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{ +"etV" = ( +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/iron, -/area/station/security/office) +/obj/machinery/chem_heater/withbuffer, +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "euj" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/machinery/light_switch/directional/north, @@ -11966,6 +12135,13 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/white, /area/station/science/research) +"euT" = ( +/obj/structure/lattice/catwalk, +/obj/structure/sign/nanotrasen{ + pixel_x = 32 + }, +/turf/open/space/basic, +/area/space/nearstation) "euX" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, @@ -12105,17 +12281,6 @@ /obj/structure/cable, /turf/open/floor/iron/freezer, /area/station/security/prison/shower) -"ewU" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Air to Mix" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"exf" = ( -/obj/machinery/holopad, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "exr" = ( /obj/structure/table/wood, /obj/item/paper_bin{ @@ -12125,11 +12290,6 @@ /obj/item/pen, /turf/open/floor/wood, /area/station/service/lawoffice) -"exu" = ( -/obj/effect/turf_decal/stripes/line, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "exC" = ( /obj/effect/turf_decal/plaque{ icon_state = "L3" @@ -12159,28 +12319,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) -"eyy" = ( -/obj/machinery/computer/operating{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"eyz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/reagent_dispensers/watertank, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/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) "eyD" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, @@ -12194,11 +12332,6 @@ }, /turf/open/floor/iron/white, /area/station/security/prison) -"eze" = ( -/obj/structure/closet/emcloset, -/obj/structure/sign/warning/vacuum/external/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/port) "ezg" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -12207,6 +12340,22 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"ezP" = ( +/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 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "ezT" = ( /obj/machinery/door/airlock/research{ name = "Research Division Access" @@ -12231,16 +12380,26 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/service/bar) +"eAq" = ( +/obj/structure/closet/wardrobe/white, +/obj/effect/landmark/start/hangover/closet, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/dark, +/area/station/commons/locker) +"eAr" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/mob/living/basic/pet/dog/corgi/puppy/void{ + dir = 4 + }, +/turf/open/floor/grass, +/area/station/science/research) "eAL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"eBe" = ( -/obj/structure/sign/warning/radiation/rad_area/directional/north, -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/gravity_generator) "eBn" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance/two, @@ -12290,13 +12449,6 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/fore) -"eCx" = ( -/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/execution/transfer) "eCB" = ( /obj/machinery/door/airlock/silver{ name = "Bathroom" @@ -12347,11 +12499,29 @@ }, /turf/closed/wall/r_wall, /area/station/command/heads_quarters/captain/private) +"eDX" = ( +/obj/structure/sign/departments/science/directional/east, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "eEb" = ( +/obj/effect/turf_decal/trimline/brown/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/corner{ + dir = 8 + }, /obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/mining{ + name = "Bitrunning Den" + }, +/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, +/turf/open/floor/iron/dark/textured_half, +/area/station/bitrunning/den) "eEf" = ( /obj/machinery/camera/directional/north{ c_tag = "Bar - Backroom" @@ -12364,12 +12534,27 @@ }, /turf/open/floor/wood, /area/station/service/bar/backroom) +"eEn" = ( +/obj/structure/closet/crate/coffin, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/station/service/chapel/funeral) "eEx" = ( /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) +"eEG" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/morgue) "eEH" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -12380,6 +12565,10 @@ /obj/effect/mapping_helpers/airlock/access/any/command/maintenance, /turf/open/floor/plating, /area/station/maintenance/central) +"eEP" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "eER" = ( /obj/structure/rack, /obj/item/storage/box/gloves{ @@ -12395,28 +12584,38 @@ /obj/item/clothing/mask/breath/medical, /turf/open/floor/iron/white, /area/station/science/robotics/lab) -"eEV" = ( -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" +"eFC" = ( +/obj/machinery/bluespace_vendor/directional/south, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/commons/locker) +"eFG" = ( +/obj/item/storage/medkit/regular{ + pixel_x = 3; + pixel_y = -3 }, -/obj/machinery/portable_atmospherics/canister/anesthetic_mix, -/obj/effect/turf_decal/siding/white{ - dir = 1 +/obj/item/storage/medkit/fire{ + pixel_x = 3; + pixel_y = 3 }, -/turf/open/floor/iron/kitchen_coldroom, -/area/station/medical/coldroom) -"eFD" = ( -/obj/machinery/disposal/bin, -/obj/machinery/airalarm/directional/east, -/obj/machinery/light/directional/east, -/obj/structure/disposalpipe/trunk{ - dir = 1 +/obj/item/storage/medkit/fire, +/obj/item/storage/medkit/fire{ + pixel_x = -3; + pixel_y = -3 }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 +/obj/structure/table/reinforced, +/obj/structure/window/spawner/directional/south, +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"eFJ" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/item/kirbyplants/organic/plant3, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, /turf/open/floor/iron, -/area/station/cargo/storage) +/area/station/commons/locker) "eFR" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ @@ -12425,10 +12624,16 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, /area/station/commons/storage/tools) -"eFU" = ( -/obj/structure/chair/sofa/left/brown, -/turf/open/floor/carpet, -/area/station/medical/psychology) +"eFX" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) "eGd" = ( /obj/machinery/door/window{ dir = 1; @@ -12493,11 +12698,11 @@ "eHS" = ( /obj/structure/chair/stool/bar/directional/south, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, /turf/open/floor/iron, /area/station/commons/lounge) "eIy" = ( @@ -12508,6 +12713,29 @@ "eIO" = ( /turf/closed/wall, /area/station/maintenance/department/medical/central) +"eIV" = ( +/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/segment, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white, +/area/station/science/research) +"eJh" = ( +/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/structure/sign/poster/contraband/random/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) "eJo" = ( /obj/machinery/firealarm/directional/east, /obj/structure/table/wood, @@ -12544,13 +12772,6 @@ }, /turf/open/floor/plating, /area/station/science/research) -"eJI" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/box, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/iron, -/area/station/science/xenobiology) "eJM" = ( /obj/machinery/camera/directional/east{ c_tag = "Atmospherics Tank - CO2" @@ -12569,20 +12790,22 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/qm) -"eKr" = ( -/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) "eKv" = ( /obj/machinery/portable_atmospherics/canister, /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) +"eKw" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/modular_computer/preset/civilian{ + dir = 8 + }, +/obj/structure/sign/poster/official/random/directional/east, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron/dark/corner, +/area/station/engineering/storage_shared) "eKA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12608,12 +12831,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"eLd" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/light/directional/east, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) "eLh" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -12732,14 +12949,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"eMU" = ( -/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) "eMW" = ( /obj/structure/flora/bush/pale/style_random, /obj/structure/flora/bush/ferny/style_random, @@ -12770,26 +12979,30 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/general, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"eNl" = ( +/obj/machinery/newscaster/directional/north, +/obj/machinery/vending/wardrobe/coroner_wardrobe, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "eNq" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, /obj/effect/mapping_helpers/broken_floor, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"eNz" = ( -/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) "eNR" = ( /turf/closed/wall, /area/station/ai_monitored/aisat/exterior) +"eNU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "eNV" = ( /obj/effect/turf_decal/delivery, /obj/effect/spawner/random/structure/crate, @@ -12802,6 +13015,28 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"eOo" = ( +/obj/machinery/computer/scan_consolenew{ + dir = 8 + }, +/obj/effect/turf_decal/siding/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/button/door/directional/east{ + id = "rdgene"; + name = "Primary Genetics Shutters Control"; + pixel_y = 6; + req_access = list("science") + }, +/obj/machinery/button/door/directional/east{ + id = "rdgene2"; + name = "Secondary Genetics Shutters Control"; + pixel_y = -6; + req_access = list("science") + }, +/turf/open/floor/iron/dark, +/area/station/science/genetics) "eOs" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ @@ -12813,16 +13048,25 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron, /area/station/security/brig) +"eOv" = ( +/obj/structure/table/reinforced, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 8 + }, +/obj/machinery/light/small/directional/north, +/obj/item/surgery_tray/full/morgue, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 8 + }, +/area/station/medical/morgue) "eOJ" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/gravity_generator) "eOP" = ( -/obj/machinery/door/window/left/directional/north{ - base_state = "right"; - dir = 8; - icon_state = "right"; +/obj/machinery/door/window/left/directional/west{ name = "Containment Pen #6"; req_access = list("xenobiology") }, @@ -12834,6 +13078,13 @@ }, /turf/open/floor/engine/co2, /area/station/engineering/atmos) +"ePg" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "ePu" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, @@ -12850,13 +13101,16 @@ }, /turf/open/floor/iron/freezer, /area/station/commons/fitness/recreation) -"ePM" = ( -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 +"ePN" = ( +/obj/structure/chair{ + dir = 8 }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "ePX" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/medical/glass{ @@ -12908,6 +13162,10 @@ dir = 1 }, /area/station/engineering/atmos/pumproom) +"eQL" = ( +/obj/machinery/camera/directional/east, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "eQO" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -12938,16 +13196,9 @@ /turf/open/floor/iron/white, /area/station/medical/cryo) "eRn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/r_wall, /area/station/science/ordnance/burnchamber) -"eRx" = ( -/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) "eRR" = ( /obj/structure/table, /obj/item/screwdriver{ @@ -12973,17 +13224,6 @@ /obj/effect/turf_decal/stripes/box, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) -"eSd" = ( -/obj/machinery/computer/robotics{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) "eSl" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/purple{ @@ -13027,13 +13267,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/virology) -"eSZ" = ( -/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) "eTn" = ( /obj/structure/chair{ dir = 4 @@ -13048,6 +13281,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"eTI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "eTU" = ( /obj/machinery/airalarm/directional/west, /obj/effect/turf_decal/stripes/line{ @@ -13087,12 +13326,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white/smooth_large, /area/station/medical/treatment_center) -"eUO" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "eUW" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -13178,6 +13411,15 @@ }, /turf/open/floor/iron, /area/station/command/teleporter) +"eWp" = ( +/obj/machinery/suit_storage_unit/cmo, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/machinery/light/small/directional/east, +/obj/machinery/vending/wallmed/directional/east, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/cmo) "eWq" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 @@ -13185,6 +13427,19 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) +"eWu" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8; + name = "Air to External Air Ports" + }, +/obj/machinery/light_switch/directional/north, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/engineering/atmos) "eWy" = ( /obj/item/reagent_containers/cup/bucket, /obj/structure/reagent_dispensers/watertank, @@ -13203,10 +13458,6 @@ }, /turf/open/floor/engine, /area/station/engineering/atmospherics_engine) -"eWG" = ( -/obj/item, -/turf/open/space/basic, -/area/space) "eWO" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -13250,33 +13501,6 @@ /obj/structure/bookcase/random/adult, /turf/open/floor/wood, /area/station/service/library) -"eXD" = ( -/obj/item/crowbar, -/obj/item/wrench, -/obj/structure/table, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"eXO" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Locker Room Entrance" - }, -/obj/structure/cable, -/obj/structure/sign/departments/lawyer/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/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/locker) "eXT" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock/maintenance{ @@ -13356,12 +13580,19 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) -"eZb" = ( -/obj/effect/landmark/event_spawn, +"eYT" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, /obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +/obj/machinery/newscaster/directional/east, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/lockers) "eZe" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -13369,6 +13600,11 @@ /obj/machinery/restaurant_portal/bar, /turf/open/floor/wood, /area/station/commons/lounge) +"eZf" = ( +/obj/machinery/libraryscanner, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/wood, +/area/station/service/library) "eZz" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -13379,6 +13615,7 @@ /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/access/all/science/genetics, /obj/effect/turf_decal/tile/purple/fourcorners, +/obj/effect/landmark/navigate_destination, /turf/open/floor/iron/white, /area/station/science/genetics) "eZI" = ( @@ -13428,15 +13665,6 @@ dir = 1 }, /area/station/science/lobby) -"faq" = ( -/obj/structure/disposaloutlet{ - dir = 1 - }, -/obj/structure/disposalpipe/trunk, -/obj/structure/window/spawner/directional/east, -/obj/structure/window/spawner/directional/west, -/turf/open/floor/plating, -/area/station/cargo/sorting) "faD" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -13445,6 +13673,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"faL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/medical/patient_stretcher, +/obj/item/food/pizzaslice/moldy/bacteria, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) "fbf" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -13462,36 +13696,44 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) +"fbl" = ( +/mob/living/basic/pet/penguin/baby/permanent{ + dir = 8 + }, +/turf/open/floor/grass, +/area/station/science/research) "fbs" = ( /obj/structure/chair{ dir = 8 }, /turf/open/floor/wood, /area/station/service/lawoffice) +"fbE" = ( +/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/cup/glass/coffee{ + pixel_x = -3; + pixel_y = 9 + }, +/obj/item/reagent_containers/cup/glass/coffee{ + pixel_x = 5; + pixel_y = 12 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/modular_computer/laptop/preset/civilian, +/turf/open/floor/wood, +/area/station/service/cafeteria) "fbI" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/holopad, /obj/structure/cable, /turf/open/floor/carpet, /area/station/command/corporate_showroom) -"fbM" = ( -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 5 - }, -/obj/machinery/light/directional/south, -/obj/structure/sign/poster/random/directional/east, -/obj/machinery/requests_console/directional/south{ - department = "Kitchen"; - name = "Kitchen Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/obj/machinery/deepfryer, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "fbP" = ( /obj/structure/cable, /obj/machinery/newscaster/directional/south, @@ -13506,6 +13748,16 @@ /obj/machinery/light_switch/directional/north, /turf/open/floor/iron, /area/station/security/prison/garden) +"fck" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 8 + }, +/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) "fcq" = ( /turf/closed/wall, /area/station/maintenance/port/greater) @@ -13547,6 +13799,24 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"fdI" = ( +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) +"fdQ" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/effect/spawner/random/armory/disablers, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/machinery/requests_console/directional/west{ + department = "Security"; + name = "Security Requests Console" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "fdX" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -13656,6 +13926,13 @@ /obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/white, /area/station/science/ordnance/storage) +"fgJ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/central) "fgN" = ( /obj/structure/chair/stool/directional/east, /obj/effect/decal/cleanable/blood/old, @@ -13701,6 +13978,17 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"fhn" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/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) "fhp" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -13779,11 +14067,11 @@ /obj/effect/mapping_helpers/airlock/access/any/command/minisat, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) -"fie" = ( +"fii" = ( +/obj/machinery/firealarm/directional/south, /obj/structure/cable, -/obj/effect/landmark/event_spawn, /turf/open/floor/iron, -/area/station/security/checkpoint/customs) +/area/station/security/office) "fip" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -13794,13 +14082,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/storage) -"fiu" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) "fix" = ( /obj/structure/chair{ dir = 1 @@ -13873,14 +14154,22 @@ /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/port) +"fjq" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/aft) +"fjv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, +/obj/machinery/light/directional/east, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "fjD" = ( /turf/closed/wall, /area/station/commons/toilet/auxiliary) -"fjV" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/iron, -/area/station/cargo/sorting) "fkb" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 10 @@ -13925,6 +14214,12 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"fky" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/courtroom) "fkC" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -14036,6 +14331,23 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"flE" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "flN" = ( /obj/machinery/power/port_gen/pacman/pre_loaded, /turf/open/floor/plating, @@ -14049,17 +14361,28 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/port) +"flX" = ( +/obj/structure/disposaloutlet{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/effect/turf_decal/tile/neutral/half, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 1 + }, +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 4 + }, +/area/station/medical/morgue) "fma" = ( /turf/closed/wall/r_wall, /area/station/science/robotics/lab) -"fmc" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/junction{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "fmn" = ( /obj/machinery/airalarm/directional/south, /obj/machinery/holopad, @@ -14130,6 +14453,13 @@ }, /turf/closed/wall, /area/station/medical/medbay/lobby) +"fmX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "fnc" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white/smooth_large, @@ -14156,6 +14486,56 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/holding_cell) +"fnO" = ( +/obj/structure/rack, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/effect/spawner/random/armory/e_gun, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"fnT" = ( +/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/requests_console/directional/west{ + department = "Atmospherics"; + name = "Atmospherics Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/engineering/atmos/storage/gas) +"fod" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/white/smooth_large, +/area/station/medical/medbay/central) +"foB" = ( +/obj/structure/closet/secure_closet/hydroponics, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/light_switch/directional/west, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/service/hydroponics) "foP" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -14166,29 +14546,6 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/storage) -"foV" = ( -/obj/machinery/door/window/right/directional/south{ - name = "First Aid Supplies"; - req_access = list("medical") - }, -/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, -/obj/machinery/light/directional/north, -/obj/structure/window/spawner/directional/west, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "fpd" = ( /obj/machinery/door/window{ base_state = "right"; @@ -14200,6 +14557,15 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) +"fpg" = ( +/obj/structure/table/glass, +/obj/item/retractor, +/obj/item/hemostat, +/obj/item/cautery, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) "fpj" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -14241,27 +14607,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/disposal) -"fpK" = ( -/obj/structure/chair/comfy{ - dir = 4 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Science Break Room"; - network = list("ss13","rd") - }, -/obj/machinery/light/small/directional/west, -/obj/machinery/light_switch/directional/south, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron, -/area/station/science/research) -"fqp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/west, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/research) "fqB" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/cable, @@ -14281,17 +14626,6 @@ /obj/structure/chair/stool/directional/south, /turf/open/floor/wood, /area/station/commons/lounge) -"fqF" = ( -/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, -/obj/structure/window/spawner/directional/south, -/turf/open/floor/iron/dark, -/area/station/command/teleporter) "fqR" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, @@ -14302,6 +14636,27 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"frm" = ( +/obj/structure/bodycontainer/crematorium{ + dir = 1; + id = "crematoriumChapel" + }, +/obj/effect/turf_decal/trimline/dark_red/mid_joiner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_red/mid_joiner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_red/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_red/line{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/service/chapel/office) "frs" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -14317,6 +14672,23 @@ "fru" = ( /turf/closed/wall, /area/station/cargo/drone_bay) +"frw" = ( +/obj/effect/decal/cleanable/dirt, +/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) +"frE" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/engineering/atmos) "frH" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ @@ -14345,9 +14717,7 @@ /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) "fsb" = ( -/obj/item/kirbyplants{ - icon_state = "plant-18" - }, +/obj/item/kirbyplants/organic/plant18, /obj/effect/turf_decal/stripes/line{ dir = 9 }, @@ -14405,12 +14775,13 @@ /obj/structure/sign/warning/pods, /turf/closed/wall, /area/station/commons/locker) -"ftY" = ( -/obj/machinery/light/directional/south, -/obj/machinery/firealarm/directional/south, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/office) +"fuc" = ( +/obj/structure/frame/machine{ + anchored = 1 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/circuit/green/off, +/area/station/science/research) "fuu" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -14424,11 +14795,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"fvx" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/engine, -/area/station/science/explab) "fvE" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/medical/central) @@ -14501,23 +14867,6 @@ /obj/structure/marker_beacon/olive, /turf/open/space/basic, /area/space/nearstation) -"fxs" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/directional/south, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/requests_console/directional/south{ - department = "Engineering"; - name = "Engineering Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/main) "fxI" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -14558,14 +14907,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/atmos) -"fyo" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/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) "fyz" = ( /obj/structure/plasticflaps, /obj/machinery/conveyor{ @@ -14577,6 +14918,20 @@ }, /turf/open/floor/plating, /area/station/cargo/storage) +"fyJ" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) +"fyK" = ( +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "fyY" = ( /obj/machinery/atmospherics/components/binary/pump/on{ dir = 1; @@ -14631,16 +14986,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"fAd" = ( -/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) "fAe" = ( /obj/machinery/door/airlock/security/glass{ name = "Engineering Security Post" @@ -14653,13 +14998,24 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) -"fAG" = ( -/obj/structure/reagent_dispensers/watertank/high, -/obj/item/reagent_containers/cup/watering_can, -/obj/effect/turf_decal/stripes/line, -/obj/structure/window/reinforced/spawner/directional/east, +"fAt" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"fAE" = ( +/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/light/directional/north, /turf/open/floor/iron, -/area/station/service/hydroponics) +/area/station/hallway/secondary/entry) "fAI" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/decal/cleanable/dirt, @@ -14674,18 +15030,10 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/engineering/atmos) -"fBi" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "fBl" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/maintenance/port/fore) +/area/station/bitrunning/den) "fBo" = ( /obj/machinery/door/window/left/directional/north{ dir = 8; @@ -14707,66 +15055,22 @@ /obj/structure/window/spawner/directional/north, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/eva) -"fBt" = ( -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "fBz" = ( /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) -"fBG" = ( -/obj/item/book/manual/wiki/chemistry{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/book/manual/wiki/grenades, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil, -/obj/item/clothing/glasses/science, -/obj/item/clothing/glasses/science, -/obj/item/book/manual/wiki/plumbing{ - pixel_x = 4; - pixel_y = -4 - }, -/obj/item/reagent_containers/dropper, -/obj/structure/table, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "fBJ" = ( /obj/effect/turf_decal/siding/white{ dir = 8 }, /turf/open/floor/iron/dark, /area/station/medical/storage) -"fBX" = ( -/obj/structure/table/wood, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/obj/structure/reagent_dispensers/beerkeg, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) "fBY" = ( /turf/open/floor/iron/dark/side{ dir = 4 }, /area/station/security/prison) -"fCh" = ( -/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) "fCn" = ( /obj/machinery/door/airlock/security/glass{ name = "Firing Range" @@ -14789,6 +15093,11 @@ /obj/effect/turf_decal/tile/green/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/central) +"fCO" = ( +/obj/structure/cable, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/construction/storage_wing) "fDc" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment{ @@ -14836,6 +15145,20 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) +"fEC" = ( +/obj/structure/table/wood, +/obj/item/cigbutt/cigarbutt{ + pixel_x = 5; + pixel_y = -1 + }, +/obj/item/radio/intercom/directional/north, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) "fEK" = ( /turf/closed/wall, /area/station/medical/medbay/central) @@ -14847,10 +15170,10 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) -"fEU" = ( -/obj/machinery/bci_implanter, -/turf/open/floor/iron, -/area/station/science/explab) +"fEO" = ( +/obj/structure/cable, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai_upload) "fEW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -14897,14 +15220,6 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/testlab) -"fFp" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "fFq" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -14947,17 +15262,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark/textured, /area/station/engineering/atmos) -"fGb" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Prison Sanitarium" - }, -/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, -/obj/effect/mapping_helpers/airlock/access/all/security/brig, -/turf/open/floor/iron/white, -/area/station/security/execution/transfer) "fGp" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/cable, @@ -14967,6 +15271,20 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"fGs" = ( +/obj/machinery/pdapainter{ + pixel_y = 2 + }, +/obj/machinery/requests_console/directional/north{ + department = "Head of Personnel's Desk"; + name = "Head of Personnel's Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "fGv" = ( /obj/structure/cable, /obj/effect/landmark/start/scientist, @@ -15013,9 +15331,10 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "fGN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ + dir = 8 + }, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "fGP" = ( @@ -15048,14 +15367,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"fHa" = ( -/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) "fHd" = ( /obj/machinery/power/shieldwallgen, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -15112,16 +15423,10 @@ /obj/machinery/telecomms/server/presets/supply, /turf/open/floor/circuit/telecomms/mainframe, /area/station/tcommsat/server) -"fIG" = ( -/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) +"fIR" = ( +/obj/structure/sign/warning/secure_area/directional/north, +/turf/open/space/basic, +/area/space) "fIS" = ( /obj/machinery/airalarm/directional/south, /obj/structure/disposalpipe/segment{ @@ -15192,12 +15497,11 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"fKi" = ( -/obj/structure/mop_bucket, -/obj/machinery/light/small/directional/west, -/obj/item/mop, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +"fKv" = ( +/obj/machinery/light_switch/directional/south, +/obj/machinery/light/no_nightlight/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) "fKG" = ( /obj/effect/landmark/blobstart, /turf/open/floor/engine/cult, @@ -15207,6 +15511,7 @@ name = "Customs Desk" }, /obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/effect/landmark/navigate_destination, /turf/open/floor/iron, /area/station/security/checkpoint/customs) "fKP" = ( @@ -15228,17 +15533,6 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) -"fLc" = ( -/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/directional/east, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "fLd" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral{ @@ -15272,6 +15566,9 @@ /obj/machinery/atmospherics/pipe/layer_manifold/cyan/visible, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"fLz" = ( +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) "fLI" = ( /obj/structure/chair{ name = "Bailiff" @@ -15324,6 +15621,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/central) +"fMy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "fMN" = ( /obj/machinery/firealarm/directional/west, /obj/structure/disposalpipe/segment{ @@ -15361,20 +15667,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) -"fNx" = ( -/obj/effect/decal/cleanable/dirt, -/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) +"fNE" = ( +/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/small/directional/north, +/turf/open/floor/iron/white, +/area/station/science/explab) "fNH" = ( /obj/machinery/door/airlock/maintenance{ name = "Mining Dock Maintenance" }, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/supply/mining, +/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, +/obj/effect/mapping_helpers/airlock/access/any/supply/mining, /turf/open/floor/plating, /area/station/maintenance/port/fore) "fNI" = ( @@ -15407,16 +15715,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/iron, /area/station/cargo/warehouse) -"fOd" = ( -/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) "fOf" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -15473,34 +15771,6 @@ "fPD" = ( /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"fPR" = ( -/obj/machinery/door/window/right/directional/south{ - dir = 1; - name = "First Aid Supplies"; - req_access = list("medical") - }, -/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, -/obj/machinery/light/directional/south, -/obj/structure/window/spawner/directional/west, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"fQe" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/gravity_generator) "fQj" = ( /obj/docking_port/stationary{ dir = 2; @@ -15706,11 +15976,6 @@ /obj/machinery/smartfridge/organ, /turf/open/floor/iron, /area/station/science/xenobiology) -"fUM" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/libraryscanner, -/turf/open/floor/wood, -/area/station/service/library) "fVa" = ( /obj/structure/cable, /obj/machinery/light_switch/directional/west, @@ -15721,11 +15986,11 @@ }, /turf/open/floor/iron/white, /area/station/medical/surgery/aft) -"fVh" = ( -/obj/structure/filingcabinet/filingcabinet, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron, -/area/station/cargo/sorting) +"fVc" = ( +/obj/effect/spawner/random/structure/crate, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) "fVt" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, @@ -15774,6 +16039,23 @@ /obj/structure/closet/secure_closet/chemical, /turf/open/floor/iron/white, /area/station/medical/pharmacy) +"fWc" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"fWl" = ( +/obj/machinery/restaurant_portal/restaurant, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/wood, +/area/station/commons/lounge) "fWm" = ( /obj/item/toy/plush/beeplushie{ desc = "Maybe hugging this will make you feel better about yourself."; @@ -15785,6 +16067,16 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/white, /area/station/security/prison/safe) +"fWw" = ( +/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/turf_decal/tile/dark_blue/half/contrasted, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "fWA" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/greater) @@ -15883,20 +16175,19 @@ }, /turf/open/floor/circuit/green, /area/station/science/robotics/mechbay) -"fYh" = ( -/obj/structure/table/wood, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/food_or_drink/booze{ - spawn_random_offset = 1 - }, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) "fYm" = ( /obj/structure/table, /obj/structure/cable, /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/dark, /area/station/security/office) +"fYq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) "fYx" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15905,17 +16196,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"fYI" = ( -/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/sign/poster/random/directional/east, +"fYC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red, +/obj/machinery/light/directional/east, /turf/open/floor/iron, -/area/station/service/hydroponics) +/area/station/hallway/primary/fore) "fYJ" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/structure/cable, @@ -15924,21 +16211,6 @@ }, /turf/open/floor/iron, /area/station/security/brig) -"fYL" = ( -/obj/structure/table, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/item/disk/tech_disk{ - pixel_x = -6 - }, -/obj/item/disk/tech_disk{ - pixel_x = 6 - }, -/obj/item/disk/tech_disk{ - pixel_y = 6 - }, -/turf/open/floor/iron, -/area/station/science/lab) "fYX" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -15950,15 +16222,18 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/service/library) -"fZG" = ( -/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 +"fZw" = ( +/obj/structure/table, +/obj/item/clothing/gloves/latex, +/obj/item/clothing/gloves/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, -/area/station/security/checkpoint/customs) +/turf/open/floor/iron/white, +/area/station/science/robotics/lab) "fZL" = ( /obj/machinery/door/airlock/highsecurity{ name = "Gravity Generator Room" @@ -16002,29 +16277,6 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/storage) -"gaw" = ( -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/table/reinforced, -/obj/machinery/microwave{ - pixel_y = 6 - }, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/station/engineering/storage_shared) -"gax" = ( -/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/bluespace_vendor/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "gaG" = ( /obj/effect/spawner/random/maintenance, /obj/structure/cable, @@ -16058,16 +16310,6 @@ }, /turf/closed/wall, /area/station/security/courtroom) -"gaX" = ( -/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) "gbf" = ( /obj/machinery/duct, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -16075,28 +16317,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/storage) -"gbq" = ( -/obj/machinery/vending/wardrobe/chef_wardrobe, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 6 - }, -/obj/machinery/light/directional/south, -/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 = list("kitchen") - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "gbG" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/item/storage/box/lights/mixed, @@ -16104,6 +16324,10 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"gbJ" = ( +/obj/structure/broken_flooring/singular/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "gbS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -16123,13 +16347,6 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plating, /area/station/science/research) -"gcc" = ( -/obj/machinery/light/directional/north, -/obj/machinery/photocopier{ - pixel_y = 3 - }, -/turf/open/floor/wood, -/area/station/service/library) "gcA" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=5-Customs"; @@ -16148,6 +16365,7 @@ }, /obj/machinery/door/firedoor, /obj/structure/cable, +/obj/effect/landmark/navigate_destination, /turf/open/floor/iron/white, /area/station/science/robotics/lab) "gcV" = ( @@ -16156,18 +16374,27 @@ }, /turf/open/floor/grass, /area/station/science/research) +"gda" = ( +/obj/structure/sign/nanotrasen{ + pixel_x = 32 + }, +/turf/open/space/basic, +/area/space) "gdb" = ( /turf/closed/wall/r_wall, /area/station/security/range) -"gdz" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 6 +"gdp" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 1 + }, +/turf/open/floor/iron/white/smooth_half, +/area/station/medical/cryo) "gdF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/stripes/line, @@ -16195,19 +16422,6 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron/white, /area/station/security/prison/visit) -"geg" = ( -/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) "gen" = ( /obj/structure/table/glass, /obj/item/folder/blue{ @@ -16246,21 +16460,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/grass, /area/station/medical/virology) -"geJ" = ( -/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/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "geV" = ( /obj/structure/sink/directional/east, /obj/machinery/light_switch/directional/west, @@ -16292,11 +16491,6 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/command/heads_quarters/hos) -"gfo" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "gfD" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -16322,17 +16516,28 @@ }, /turf/open/floor/iron/white, /area/station/science/research) -"ggi" = ( -/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) "ggj" = ( /turf/closed/wall, /area/station/security/evidence) +"ggq" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"ggw" = ( +/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) "ggH" = ( /obj/effect/spawner/random/structure/chair_maintenance, /turf/open/floor/iron/checker, @@ -16343,6 +16548,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"ggO" = ( +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "ggU" = ( /obj/machinery/firealarm/directional/south, /obj/structure/disposalpipe/segment{ @@ -16378,6 +16587,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"ghJ" = ( +/obj/machinery/netpod, +/obj/machinery/light/directional/west, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/bitrunning/den) "ghK" = ( /obj/structure/rack, /obj/item/tank/internals/oxygen, @@ -16402,20 +16617,23 @@ /obj/machinery/atmospherics/components/binary/pump{ dir = 1 }, -/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ - dir = 4 - }, /obj/machinery/airlock_sensor/incinerator_ordmix{ pixel_x = -24 }, +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) -"gin" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/broken_flooring/corner/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) +"gip" = ( +/obj/structure/table/wood, +/obj/machinery/fax{ + fax_name = "Quartermaster's Office"; + name = "Quartermaster's Fax Machine" + }, +/obj/machinery/light/directional/west, +/turf/open/floor/wood, +/area/station/command/heads_quarters/qm) "giz" = ( /obj/machinery/conveyor/inverted{ dir = 10; @@ -16434,6 +16652,15 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/engineering/main) +"giR" = ( +/obj/machinery/computer/security/telescreen/minisat{ + dir = 1; + pixel_y = -29 + }, +/obj/structure/bed/dogbed/renault, +/mob/living/basic/pet/fox/renault, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) "giT" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance/two, @@ -16472,11 +16699,8 @@ /turf/open/floor/wood, /area/station/commons/lounge) "gjv" = ( -/obj/machinery/door/window/left/directional/north{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Containment Pen #5"; +/obj/machinery/door/window/left/directional/west{ + name = "Maximum Security Test Chamber"; req_access = list("xenobiology") }, /turf/open/floor/engine, @@ -16536,6 +16760,18 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) +"gkM" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/structure/cable, +/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, +/obj/machinery/duct, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "gkS" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -16584,14 +16820,6 @@ }, /turf/open/floor/wood, /area/station/service/theater) -"glW" = ( -/obj/structure/showcase/machinery/microwave{ - dir = 1; - pixel_y = 2 - }, -/obj/structure/table/wood, -/turf/open/floor/carpet, -/area/station/command/corporate_showroom) "gma" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, @@ -16616,11 +16844,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/fore) -"gmp" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "gms" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -16633,47 +16856,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"gmz" = ( -/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) -"gmG" = ( -/obj/structure/table, -/obj/item/plate, -/obj/item/flashlight/flare/candle, -/obj/effect/decal/cleanable/dirt, -/obj/item/radio{ - 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) "gmH" = ( /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, @@ -16686,6 +16868,12 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central) +"gmN" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "gmS" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -16761,10 +16949,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"gnT" = ( -/obj/machinery/vending/wardrobe/atmos_wardrobe, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "gog" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -16774,12 +16958,6 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) -"goj" = ( -/obj/effect/turf_decal/siding/white{ - dir = 1 - }, -/turf/open/floor/iron/kitchen_coldroom, -/area/station/medical/coldroom) "gon" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/machinery/airalarm/directional/west, @@ -16871,10 +17049,6 @@ dir = 4 }, /area/station/commons/fitness) -"gpO" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "gpQ" = ( /turf/open/floor/iron/stairs/medium{ dir = 1 @@ -16886,6 +17060,13 @@ }, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) +"gqa" = ( +/obj/structure/frame/machine{ + anchored = 1 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/circuit/green/off, +/area/station/science/research) "gqj" = ( /obj/structure/sink/directional/west, /obj/machinery/light_switch/directional/east, @@ -16894,22 +17075,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) -"gql" = ( -/obj/machinery/portable_atmospherics/scrubber, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "gqm" = ( /obj/effect/spawner/structure/window, /obj/machinery/door/poddoor/shutters/preopen{ @@ -16982,11 +17147,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/central) -"grp" = ( -/obj/machinery/vending/wardrobe/sec_wardrobe, -/obj/effect/turf_decal/tile/red/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs) +"grm" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/medical/cryo) "grw" = ( /obj/structure/chair{ dir = 1 @@ -17094,6 +17264,15 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"gtR" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron, +/area/station/service/hydroponics) "gtU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -17119,13 +17298,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"gui" = ( -/obj/structure/bodycontainer/morgue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "guo" = ( /obj/machinery/door/poddoor/incinerator_atmos_main, /turf/open/floor/engine, @@ -17155,6 +17327,10 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/reagent_containers/cup/bucket{ + pixel_x = -6; + pixel_y = 27 + }, /turf/open/floor/iron, /area/station/service/janitor) "guR" = ( @@ -17202,11 +17378,9 @@ /turf/closed/wall, /area/station/commons/storage/primary) "guZ" = ( -/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) +/obj/machinery/netpod, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/bitrunning/den) "gva" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/iron, @@ -17229,6 +17403,16 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood, /area/station/commons/lounge) +"gvC" = ( +/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) "gvG" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/unres, @@ -17252,6 +17436,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/locker) +"gvS" = ( +/obj/machinery/bci_implanter, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/science/explab) +"gvZ" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "gwc" = ( /obj/structure/chair/stool/bar/directional/south, /obj/effect/turf_decal/siding/wood{ @@ -17275,10 +17468,6 @@ /obj/effect/spawner/random/engineering/tank, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"gwN" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) "gwS" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -17343,19 +17532,32 @@ /area/station/engineering/main) "gyI" = ( /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 = list("xenobiology") - }, /obj/machinery/door/poddoor/preopen{ id = "xenobio8"; name = "Xenobio Pen 8 Blast Door" }, +/obj/machinery/door/window/left/directional/east{ + name = "Containment Pen #8"; + req_access = list("xenobiology") + }, /turf/open/floor/iron, /area/station/science/xenobiology) +"gyJ" = ( +/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 + }, +/obj/machinery/light/no_nightlight/directional/west, +/turf/open/floor/iron, +/area/station/engineering/atmos) "gyK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /turf/open/floor/engine, @@ -17440,10 +17642,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/service/hydroponics) -"gAz" = ( -/obj/structure/broken_flooring/pile/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "gAB" = ( /obj/structure/table/glass, /obj/item/hand_labeler, @@ -17454,6 +17652,19 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) +"gAH" = ( +/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, +/obj/machinery/light/floor, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "gAT" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/closed/wall/r_wall, @@ -17476,12 +17687,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/command/bridge) -"gBz" = ( -/obj/structure/table, -/obj/item/flashlight/flare/candle, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "gBD" = ( /turf/closed/wall/r_wall, /area/station/command/teleporter) @@ -17491,15 +17696,6 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) -"gBX" = ( -/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) "gBY" = ( /obj/structure/closet/emcloset, /obj/machinery/light/small/directional/west, @@ -17546,16 +17742,22 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/wood, /area/station/commons/vacant_room/office) +"gDh" = ( +/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/blue/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "gDv" = ( /obj/item/kirbyplants, /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/central) -"gDA" = ( -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/turf/open/floor/iron/dark, -/area/station/engineering/supermatter/room) "gDT" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -17620,6 +17822,13 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"gEN" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "gES" = ( /obj/machinery/computer/shuttle/labor{ dir = 4 @@ -17668,22 +17877,10 @@ "gFi" = ( /turf/open/floor/iron, /area/station/hallway/primary/fore) -"gFp" = ( -/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) -"gFD" = ( -/obj/structure/table, -/obj/item/book/manual/hydroponics_pod_people, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) +"gFy" = ( +/obj/machinery/rnd/production/protolathe/department/science, +/turf/open/floor/iron/dark, +/area/station/science/lab) "gFL" = ( /obj/effect/turf_decal/tile/green{ dir = 4 @@ -17724,6 +17921,11 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/primary/central) +"gGf" = ( +/obj/structure/sign/poster/official/random/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) "gGh" = ( /obj/structure/closet/crate/coffin, /turf/open/floor/plating, @@ -17737,6 +17939,17 @@ "gGy" = ( /turf/open/floor/iron/dark, /area/station/command/bridge) +"gGK" = ( +/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, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) "gHo" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -17752,6 +17965,15 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) +"gHA" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/effect/spawner/random/armory/shotgun, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "gHC" = ( /obj/structure/table/wood, /obj/machinery/light_switch/directional/west, @@ -17878,6 +18100,11 @@ /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron, /area/station/security/prison) +"gJl" = ( +/obj/effect/turf_decal/siding/purple, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white, +/area/station/science/ordnance/storage) "gJm" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 9 @@ -17885,12 +18112,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) -"gJn" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "gJu" = ( /obj/structure/rack, /obj/item/stack/rods{ @@ -17899,14 +18120,19 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"gJN" = ( -/obj/effect/turf_decal/stripes/line{ +"gJD" = ( +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +/obj/structure/noticeboard/directional/north, +/obj/item/paper/guides/jobs/medical/morgue{ + pixel_y = 31 + }, +/obj/structure/bed/medical/emergency, +/obj/machinery/iv_drip, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "gJV" = ( /obj/machinery/light/small/directional/south, /obj/effect/turf_decal/tile/purple, @@ -17983,6 +18209,12 @@ /obj/structure/cable, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) +"gLm" = ( +/obj/effect/decal/cleanable/oil, +/obj/effect/spawner/random/engineering/tank, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) "gLo" = ( /obj/machinery/power/terminal, /obj/structure/extinguisher_cabinet/directional/west, @@ -17992,25 +18224,17 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/main) -"gLy" = ( -/obj/machinery/portable_atmospherics/pump/lil_pump, -/obj/effect/turf_decal/siding/purple{ - dir = 5 - }, -/obj/machinery/airalarm/directional/east, -/obj/machinery/light/directional/north, -/obj/machinery/button/door/directional/north{ - id = "rdordnance"; - name = "Ordnance Containment Control"; - req_access = list("rd") +"gLr" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/storage) +/obj/structure/cable, +/obj/machinery/light/floor, +/turf/open/floor/iron/white, +/area/station/science/xenobiology/hallway) "gLF" = ( /obj/structure/sink/kitchen/directional/west, -/mob/living/simple_animal/hostile/retaliate/goat{ - name = "Pete" - }, +/mob/living/basic/goat/pete, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "gLI" = ( @@ -18037,30 +18261,44 @@ /obj/item/stock_parts/micro_laser, /turf/open/floor/iron, /area/station/science/lab) +"gLY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/emergency_bed, +/obj/item/emergency_bed, +/obj/item/toy/figure/md, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) "gMg" = ( /obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/item/reagent_containers/cup/bottle/epinephrine, -/obj/item/reagent_containers/cup/bottle/multiver, -/obj/item/reagent_containers/syringe, /obj/structure/extinguisher_cabinet/directional/west, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 }, +/obj/item/storage/box/bandages{ + pixel_y = 6; + pixel_x = -6 + }, +/obj/item/storage/medkit/regular, +/obj/item/reagent_containers/cup/bottle/multiver, +/obj/item/reagent_containers/cup/bottle/epinephrine, +/obj/item/reagent_containers/syringe, /turf/open/floor/iron/white, /area/station/security/medical) -"gMi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/command/corporate_showroom) "gMt" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible{ dir = 4 }, /turf/open/floor/iron, /area/station/engineering/atmos) +"gMy" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "gMB" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -18103,16 +18341,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"gNk" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/light/small/directional/east, -/obj/structure/sign/poster/random/directional/east, -/obj/structure/table/wood, -/obj/item/food/pie/cream, -/turf/open/floor/wood/large, -/area/station/service/theater) "gNl" = ( /obj/machinery/door/airlock/medical/glass{ name = "Medbay Storage" @@ -18142,21 +18370,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/engine, /area/station/science/explab) -"gND" = ( -/obj/machinery/iv_drip, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) -"gNF" = ( -/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, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "gNP" = ( /obj/machinery/light/small/directional/west, /obj/machinery/camera/directional/west{ @@ -18179,6 +18392,15 @@ /obj/effect/spawner/random/maintenance/three, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"gOa" = ( +/obj/structure/table, +/obj/item/book/manual/hydroponics_pod_people, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/sign/poster/random/directional/east, +/turf/open/floor/iron, +/area/station/service/hydroponics) "gOb" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -18193,9 +18415,7 @@ /area/station/maintenance/aft/greater) "gOr" = ( /obj/machinery/airalarm/directional/north, -/obj/item/kirbyplants{ - icon_state = "applebush" - }, +/obj/item/kirbyplants/organic/applebush, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 1 }, @@ -18230,17 +18450,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) -"gOX" = ( -/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, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "gOY" = ( /obj/structure/chair{ dir = 8 @@ -18250,24 +18459,22 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, /area/station/security/courtroom) -"gPa" = ( -/obj/structure/chair/comfy/black{ - dir = 8 - }, -/turf/open/floor/iron/chapel{ - dir = 4 - }, -/area/station/service/chapel) "gPh" = ( /obj/item/clothing/head/fedora, /obj/structure/table/wood, /turf/open/floor/wood, /area/station/commons/lounge) -"gPz" = ( -/obj/item/hand_labeler_refill, -/obj/structure/rack, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) +"gPl" = ( +/obj/structure/table/optable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/requests_console/directional/west{ + department = "Morgue"; + name = "Morgue Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "gPA" = ( /obj/structure/table/wood, /obj/structure/cable, @@ -18291,8 +18498,10 @@ /turf/open/space/basic, /area/space/nearstation) "gQv" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1 }, /turf/open/floor/plating, /area/station/maintenance/port/fore) @@ -18316,17 +18525,6 @@ "gQQ" = ( /turf/closed/wall, /area/station/engineering/break_room) -"gQT" = ( -/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) "gRb" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -18346,34 +18544,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) -"gSx" = ( -/obj/machinery/suit_storage_unit/hos, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hos) -"gSD" = ( -/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) -"gSF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/medical/memeorgans, -/obj/structure/closet/crate/freezer, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) "gSH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /obj/machinery/rnd/server/master, /turf/open/floor/circuit/telecomms/server, /area/station/science/server) -"gSN" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) +"gSW" = ( +/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, +/area/station/hallway/primary/aft) "gTh" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -18488,22 +18669,11 @@ "gUY" = ( /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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"gVb" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/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) "gVj" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/blue, @@ -18512,6 +18682,12 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"gVl" = ( +/obj/machinery/recharge_station, +/obj/machinery/light_switch/directional/west, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/science/robotics/mechbay) "gVn" = ( /obj/effect/turf_decal/siding/white{ dir = 6 @@ -18582,7 +18758,7 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 }, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /turf/open/floor/iron/white, /area/station/security/medical) "gXd" = ( @@ -18660,34 +18836,6 @@ /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"gXI" = ( -/obj/structure/table, -/obj/machinery/light/directional/north, -/obj/item/folder/white{ - pixel_x = 3; - pixel_y = 4 - }, -/obj/item/reagent_containers/cup/beaker/large{ - pixel_x = -4; - pixel_y = 7 - }, -/obj/item/reagent_containers/cup/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) -"gXP" = ( -/obj/structure/sign/warning/secure_area/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/engineering/main) "gXW" = ( /obj/machinery/light_switch/directional/north, /obj/machinery/pipedispenser/disposal, @@ -18772,12 +18920,6 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/white, /area/station/science/lab) -"gZD" = ( -/obj/structure/table/glass, -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "gZG" = ( /obj/effect/turf_decal/delivery, /obj/structure/closet/secure_closet/engineering_electrical, @@ -18829,16 +18971,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"hao" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/mob/living/basic/pet/dog/corgi/puppy/void{ - dir = 4 - }, -/turf/open/floor/grass, -/area/station/science/research) "haq" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron, @@ -18882,15 +19014,6 @@ "hbv" = ( /turf/closed/wall/r_wall, /area/station/medical/coldroom) -"hbC" = ( -/obj/structure/table, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/item/reagent_containers/cup/glass/mug/britcup{ - pixel_y = 2 - }, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron, -/area/station/science/research) "hbK" = ( /turf/closed/wall, /area/station/maintenance/department/science/xenobiology) @@ -18903,6 +19026,17 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) +"hbO" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + 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/medical/chemistry) "hbQ" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/effect/turf_decal/bot, @@ -18921,6 +19055,14 @@ }, /turf/open/floor/iron/dark/corner, /area/station/engineering/atmos/storage/gas) +"hcc" = ( +/obj/structure/sign/warning/secure_area/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/engineering/main) "hcl" = ( /obj/item/target, /obj/effect/turf_decal/stripes/line{ @@ -18963,9 +19105,9 @@ /turf/open/floor/plating, /area/station/maintenance/port/fore) "hcP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/closed/wall/r_wall, -/area/station/maintenance/starboard/greater) +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "hcR" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -19004,6 +19146,10 @@ }, /turf/open/floor/engine, /area/station/engineering/atmospherics_engine) +"hdk" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "hdp" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /turf/closed/wall, @@ -19018,11 +19164,6 @@ /obj/structure/sign/warning/electric_shock, /turf/open/floor/engine, /area/station/science/xenobiology) -"hdF" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/suit_storage_unit/medical, -/turf/open/floor/iron/white, -/area/station/medical/storage) "hdI" = ( /obj/machinery/light_switch/directional/north, /obj/effect/turf_decal/tile/yellow/half/contrasted{ @@ -19046,6 +19187,13 @@ /obj/machinery/meter, /turf/open/floor/iron, /area/station/engineering/atmos) +"hei" = ( +/obj/item/stack/sheet/cardboard{ + amount = 14 + }, +/obj/item/stack/package_wrap, +/turf/open/floor/iron, +/area/station/security/prison/work) "hen" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19118,17 +19266,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"hfv" = ( -/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/sorting) "hfA" = ( /obj/machinery/door/airlock/grunge{ name = "Cell 1" @@ -19145,6 +19282,13 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"hgu" = ( +/obj/machinery/defibrillator_mount/directional/south, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light/cold/directional/south, +/obj/structure/bed/medical, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "hgA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -19152,6 +19296,14 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/white, /area/station/science/ordnance/testlab) +"hgB" = ( +/obj/machinery/vending/wardrobe/chem_wardrobe, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "hgE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/railing, @@ -19200,18 +19352,11 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/commons/lounge) -"hhU" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/obj/structure/sign/departments/psychology/directional/west, -/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/medical/medbay/central) +"hif" = ( +/obj/structure/mannequin/skeleton, +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "hio" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -19236,7 +19381,7 @@ "hiy" = ( /obj/machinery/igniter/incinerator_atmos, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "hiB" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -19268,42 +19413,6 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) -"hja" = ( -/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) -"hjo" = ( -/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 = list("rd") - }, -/obj/machinery/button/door/directional/north{ - id = "rdordnance"; - name = "Ordnance Containment Control"; - pixel_x = 6; - req_access = list("rd") - }, -/obj/machinery/button/door/directional/north{ - id = "rdoffice"; - name = "Privacy Control"; - pixel_y = 34; - req_access = list("rd") - }, -/obj/machinery/computer/security/telescreen/rd{ - pixel_x = 31; - pixel_y = 30 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/rd) "hjp" = ( /obj/item/clothing/mask/gas, /obj/effect/spawner/random/structure/table_or_rack, @@ -19311,22 +19420,34 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "hjw" = ( -/turf/open/floor/iron/white, -/area/station/science/cytology) -"hjF" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/door/window/right/directional/west{ - name = "Corpse Arrivals"; - req_access = list("morgue_secure") +/obj/structure/table/glass, +/obj/item/book/manual/wiki/cytology{ + pixel_x = -4; + pixel_y = 4 }, -/obj/effect/turf_decal/delivery/white{ - color = "#52B4E9" +/obj/item/biopsy_tool{ + pixel_x = 8; + pixel_y = 2 }, -/obj/structure/disposalpipe/segment{ +/obj/effect/turf_decal/siding/purple{ dir = 4 }, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/iron/dark, +/turf/open/floor/iron/white, +/area/station/science/cytology) +"hjx" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"hjG" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Morgue Maintenance" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/access/all/medical/morgue, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/medical/morgue) "hjH" = ( /obj/machinery/light/small/directional/north, @@ -19475,45 +19596,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) -"hlK" = ( -/obj/structure/chair, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/security/office) "hlN" = ( /obj/structure/frame/machine{ anchored = 1 }, /turf/open/floor/engine/vacuum, /area/space/nearstation) -"hlU" = ( -/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/records/medical{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/medical) -"hlX" = ( -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/machinery/vending/wardrobe/medi_wardrobe, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "hmf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -19627,22 +19715,6 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron/white, /area/station/medical/pharmacy) -"hoQ" = ( -/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/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms) "hoY" = ( /obj/structure/chair/office{ dir = 4 @@ -19671,39 +19743,14 @@ }, /turf/open/floor/iron, /area/station/science/robotics/mechbay) -"hpF" = ( -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/structure/table/reinforced, -/obj/machinery/requests_console/directional/north{ - department = "Security"; - name = "Security Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/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) +"hqb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/medical/abandoned) "hqj" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance/burnchamber) -"hqo" = ( -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 8 - }, -/obj/machinery/light/small/directional/north, -/obj/structure/table/wood, -/obj/structure/noticeboard/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "hqr" = ( /obj/machinery/atmospherics/pipe/smart/simple/supply/visible{ dir = 10 @@ -19762,14 +19809,22 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) -"hsi" = ( -/obj/effect/turf_decal/siding/wood{ +"hse" = ( +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/trimline/dark_red/end{ dir = 1 }, -/obj/machinery/light_switch/directional/south, -/obj/machinery/light/small/directional/south, -/turf/open/floor/wood/large, -/area/station/service/theater) +/obj/effect/turf_decal/trimline/dark_red/mid_joiner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_red/mid_joiner{ + dir = 8 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/service/chapel/office) "hsp" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -19904,7 +19959,7 @@ /turf/closed/wall/r_wall, /area/station/maintenance/starboard/greater) "huq" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 4 }, /obj/machinery/airalarm/directional/west, @@ -19913,14 +19968,20 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) -"hur" = ( -/obj/machinery/light/floor, -/turf/open/floor/iron, -/area/station/engineering/atmos) "hux" = ( /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, /area/station/command/teleporter) +"huy" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "huF" = ( /obj/item/clothing/suit/costume/snowman, /obj/item/clothing/head/costume/snowman, @@ -19942,6 +20003,14 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/plating, /area/station/security/checkpoint/customs) +"hvo" = ( +/obj/structure/filingcabinet, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) "hvr" = ( /obj/machinery/camera/directional/south{ c_tag = "Central Primary Hallway - Fore - Courtroom" @@ -20095,6 +20164,17 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/xenobiology/hallway) +"hxw" = ( +/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 + }, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron, +/area/station/service/hydroponics) "hxz" = ( /obj/item/reagent_containers/spray/plantbgone{ pixel_y = 3 @@ -20120,9 +20200,7 @@ /turf/open/floor/iron, /area/station/service/hydroponics) "hxB" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, +/obj/item/kirbyplants/organic/plant21, /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) "hxD" = ( @@ -20132,23 +20210,6 @@ }, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/entry) -"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) "hxV" = ( /obj/structure/chair, /obj/effect/turf_decal/stripes/line{ @@ -20183,6 +20244,16 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"hyh" = ( +/obj/machinery/shower/directional/south{ + name = "emergency shower" + }, +/obj/effect/turf_decal/trimline/blue/end, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "hyn" = ( /obj/machinery/airalarm/directional/west, /obj/effect/spawner/random/vending/snackvend, @@ -20236,13 +20307,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"hzi" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/chair/office/tactical{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "hzt" = ( /obj/structure/transit_tube/curved/flipped, /obj/effect/turf_decal/tile/blue{ @@ -20275,16 +20339,29 @@ /obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) +"hAq" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/obj/structure/window/spawner/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "hAu" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/commons/locker) -"hAE" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) +"hAF" = ( +/obj/machinery/camera/directional/south{ + c_tag = "MiniSat Exterior Access"; + network = list("minisat") + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) "hAL" = ( /obj/machinery/door/poddoor/shutters{ dir = 4; @@ -20311,14 +20388,6 @@ }, /turf/open/floor/engine, /area/station/command/heads_quarters/rd) -"hBh" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/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) "hBm" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/south, @@ -20353,6 +20422,10 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/hallway/secondary/entry) +"hBH" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/space/basic, +/area/space/nearstation) "hBI" = ( /obj/structure/table, /obj/effect/turf_decal/bot, @@ -20383,20 +20456,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"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) "hBY" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 10 @@ -20422,6 +20481,16 @@ }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) +"hCG" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Port Primary Hallway - Mining Shuttle" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "hCK" = ( /obj/effect/decal/cleanable/oil/slippery, /obj/effect/turf_decal/siding/purple{ @@ -20431,6 +20500,15 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron/white, /area/station/science/research) +"hCT" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/effect/turf_decal/box/red, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "hDa" = ( /obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, /obj/effect/turf_decal/tile/yellow{ @@ -20439,6 +20517,23 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"hDd" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ + dir = 8 + }, +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/line, +/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/dark/textured_half, +/area/station/bitrunning/den) "hDe" = ( /obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/engine/plasma, @@ -20464,6 +20559,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"hDE" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/floor/iron/white, +/area/station/security/prison) "hDX" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -20478,6 +20577,17 @@ }, /turf/open/floor/plating, /area/station/medical/pharmacy) +"hEq" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/mining_weather_monitor/directional/east, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/entry) "hEr" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20500,18 +20610,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/cryo) -"hEO" = ( -/obj/machinery/suit_storage_unit/rd, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Research Director's Office"; - network = list("ss13","rd") - }, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron, -/area/station/command/heads_quarters/rd) "hET" = ( /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)."; @@ -20574,14 +20672,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) -"hGm" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/effect/turf_decal/box/red, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) "hGv" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -20688,6 +20778,15 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"hJi" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/directional/south, +/obj/machinery/camera/directional/south{ + c_tag = "Engineering Supermatter Aft"; + network = list("ss13","engine") + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "hJv" = ( /obj/structure/chair/stool/directional/south, /obj/structure/disposalpipe/segment{ @@ -20785,17 +20884,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"hKE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ +"hKB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ dir = 1 }, -/obj/effect/turf_decal/siding/purple{ - dir = 9 - }, -/obj/machinery/light/directional/north, -/obj/machinery/light_switch/directional/north, /turf/open/floor/iron/dark, -/area/station/science/ordnance) +/area/station/medical/morgue) "hKG" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -20804,16 +20899,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"hKP" = ( -/obj/machinery/firealarm/directional/north, -/obj/structure/tank_holder/extinguisher, -/obj/machinery/camera/directional/east{ - c_tag = "Medbay Cryogenics"; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/cryo) "hKV" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -20822,17 +20907,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"hLj" = ( -/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) "hLs" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/mapping_helpers/burnt_floor, @@ -20886,16 +20960,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"hMc" = ( -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/structure/sign/poster/official/moth_piping/directional/north, -/turf/open/floor/iron/dark, -/area/station/science/ordnance) "hMn" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 @@ -20924,15 +20988,14 @@ /area/station/medical/treatment_center) "hMv" = ( /obj/effect/turf_decal/delivery, -/obj/machinery/door/window/left/directional/north{ - dir = 4; - name = "Containment Pen #1"; - req_access = list("xenobiology") - }, /obj/machinery/door/poddoor/preopen{ id = "xenobio1"; name = "Xenobio Pen 1 Blast Door" }, +/obj/machinery/door/window/left/directional/east{ + name = "Containment Pen #1"; + req_access = list("xenobiology") + }, /turf/open/floor/iron, /area/station/science/xenobiology) "hMy" = ( @@ -20963,14 +21026,11 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/security/office) -"hNw" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/airalarm/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"hNn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/commons/dorms) +/obj/machinery/light/floor, +/turf/open/floor/wood, +/area/station/commons/lounge) "hNz" = ( /obj/structure/chair, /obj/effect/landmark/start/depsec/science, @@ -20996,45 +21056,12 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) -"hNN" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Medbay Break Room"; - network = list("ss13","medbay") - }, -/obj/machinery/light/directional/west, -/obj/item/radio/intercom/directional/west, -/obj/machinery/vending/coffee, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) -"hNV" = ( -/obj/machinery/chem_master, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, -/turf/open/floor/iron/white/smooth_large, -/area/station/medical/chemistry) -"hOd" = ( -/obj/structure/table, -/obj/machinery/microwave, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron, -/area/station/science/research) "hOh" = ( /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) -"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) "hOp" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -21055,6 +21082,15 @@ }, /turf/open/floor/iron/freezer, /area/station/security/prison/shower) +"hPk" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "hPu" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/hidden{ dir = 5 @@ -21062,6 +21098,20 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/engineering/break_room) +"hPv" = ( +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 8 + }, +/obj/structure/table/wood, +/obj/structure/noticeboard/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"hPG" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "hPK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/duct, @@ -21104,41 +21154,6 @@ dir = 1 }, /area/station/service/chapel) -"hQH" = ( -/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 = list("shipping") - }, -/obj/structure/plasticflaps/opaque{ - name = "Service Deliveries" - }, -/obj/structure/window/spawner/directional/west, -/turf/open/floor/iron, -/area/station/cargo/storage) -"hQT" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "hQY" = ( /obj/machinery/door/window/right/directional/north{ name = "Petting Zoo" @@ -21171,6 +21186,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/landmark/navigate_destination, /turf/open/floor/iron, /area/station/engineering/main) "hRv" = ( @@ -21184,13 +21200,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/brig) -"hRy" = ( -/obj/machinery/atmospherics/components/binary/pump/on, -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/science/ordnance/burnchamber) "hRD" = ( /obj/structure/chair/office{ dir = 4 @@ -21226,18 +21235,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central) -"hSd" = ( -/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 = list("brig") - }, -/turf/open/floor/iron, -/area/station/security/execution/transfer) "hSe" = ( /obj/machinery/light/small/directional/east, /obj/item/radio/intercom/directional/north, @@ -21265,6 +21262,17 @@ }, /turf/open/floor/wood, /area/station/service/cafeteria) +"hSl" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 4 + }, +/obj/effect/turf_decal/siding/purple{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/obj/structure/sign/poster/official/moth_piping/directional/north, +/turf/open/floor/iron/dark, +/area/station/science/ordnance) "hSr" = ( /obj/machinery/holopad/secure, /obj/structure/window/reinforced/spawner/directional/west, @@ -21302,6 +21310,21 @@ /obj/structure/sign/warning/vacuum/external/directional/north, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"hSQ" = ( +/obj/structure/bodycontainer/morgue/beeper_off{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/warning, +/obj/effect/turf_decal/trimline/neutral/mid_joiner, +/turf/open/floor/iron/dark/smooth_half{ + dir = 4 + }, +/area/station/medical/morgue) +"hTb" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/iron, +/area/station/command/gateway) "hTn" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -21379,24 +21402,11 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) -"hUG" = ( -/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) -"hUM" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) +"hUB" = ( +/obj/machinery/suit_storage_unit/hos, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hos) "hUN" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -21413,8 +21423,7 @@ /turf/open/floor/engine, /area/station/engineering/supermatter/room) "hVn" = ( -/obj/machinery/door/window/left/directional/north{ - dir = 4; +/obj/machinery/door/window/right/directional/east{ name = "Containment Pen #8"; req_access = list("xenobiology") }, @@ -21454,15 +21463,9 @@ }, /obj/effect/mapping_helpers/airlock/access/all/medical/virology, /obj/machinery/door/firedoor, +/obj/effect/landmark/navigate_destination, /turf/open/floor/iron/white, /area/station/medical/virology) -"hVW" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/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) "hVX" = ( /obj/structure/toilet{ pixel_y = 8 @@ -21538,17 +21541,6 @@ /obj/structure/bookcase/random, /turf/open/floor/iron, /area/station/security/prison) -"hXc" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "hXd" = ( /obj/effect/turf_decal/trimline/blue/line{ dir = 1 @@ -21594,22 +21586,21 @@ }, /turf/open/floor/iron/dark, /area/station/security/lockers) -"hXK" = ( -/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) "hXQ" = ( /obj/machinery/vending/cola/red, /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/white, /area/station/security/prison/mess) +"hYd" = ( +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 + }, +/obj/structure/table, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/office) "hYr" = ( /obj/machinery/holopad, /obj/structure/cable, @@ -21689,14 +21680,29 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) -"hYN" = ( -/obj/item/kirbyplants/random, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ +"hZn" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) +/obj/machinery/light/floor, +/turf/open/floor/wood/large, +/area/station/commons/lounge) +"hZy" = ( +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) +"hZA" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/morgue) "hZO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21718,6 +21724,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"iam" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) "iar" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -21730,12 +21743,11 @@ /obj/machinery/seed_extractor, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"iaO" = ( -/obj/effect/turf_decal/siding/purple, -/obj/item/kirbyplants/random, -/obj/machinery/firealarm/directional/south, +"iaK" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/machinery/light/directional/south, /turf/open/floor/iron/white, -/area/station/science/ordnance/office) +/area/station/medical/chemistry) "iaQ" = ( /obj/machinery/light/small/directional/east, /obj/effect/turf_decal/delivery, @@ -21750,8 +21762,18 @@ name = "Kitchen Counter Shutters" }, /obj/machinery/door/firedoor, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, /turf/open/floor/iron, /area/station/service/kitchen) +"iaT" = ( +/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/machinery/status_display/evac/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "iaZ" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=16-Fore"; @@ -21794,6 +21816,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"ica" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/chapel{ + dir = 1 + }, +/area/station/service/chapel) "icb" = ( /obj/machinery/door/window/brigdoor{ name = "Justice Chamber"; @@ -21868,6 +21896,12 @@ /obj/structure/sign/warning/electric_shock, /turf/open/floor/engine, /area/station/science/xenobiology) +"idL" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "idR" = ( /obj/structure/table, /obj/item/food/dough, @@ -21901,19 +21935,6 @@ /obj/structure/disposalpipe/segment, /turf/closed/wall, /area/station/cargo/sorting) -"iez" = ( -/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) "ieH" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 @@ -21923,6 +21944,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"ieI" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/cyan/visible, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron/dark/corner, +/area/station/engineering/atmos/pumproom) "ieV" = ( /turf/closed/wall/r_wall, /area/station/security/holding_cell) @@ -21984,6 +22012,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/command/gateway) +"igi" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) "ign" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -22089,15 +22122,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) -"ihB" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/computer/department_orders/medical{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) "ihF" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -22117,14 +22141,6 @@ }, /turf/open/floor/iron, /area/station/science/robotics/mechbay) -"ihV" = ( -/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) "ihW" = ( /obj/structure/lattice/catwalk, /obj/structure/disposalpipe/trunk{ @@ -22151,6 +22167,7 @@ /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/access/all/science/rd, /obj/effect/turf_decal/tile/purple/fourcorners, +/obj/effect/landmark/navigate_destination, /turf/open/floor/iron, /area/station/command/heads_quarters/rd) "iix" = ( @@ -22194,6 +22211,11 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"iji" = ( +/obj/machinery/vending/hydronutrients, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/service/hydroponics) "ijv" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -22208,6 +22230,35 @@ "ikb" = ( /turf/open/floor/iron, /area/station/commons/dorms) +"iki" = ( +/obj/structure/table, +/obj/structure/reagent_dispensers/wall/peppertank/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = 5 + }, +/obj/item/clothing/mask/balaclava, +/obj/item/storage/backpack/duffelbag/sec/surgery{ + pixel_y = 5 + }, +/turf/open/floor/iron/dark, +/area/station/security/execution/education) +"ikr" = ( +/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/south, +/turf/open/floor/iron/checker, +/area/station/science/research) "iks" = ( /obj/effect/landmark/start/clown, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -22290,18 +22341,15 @@ }, /turf/open/floor/carpet, /area/station/medical/psychology) +"ikY" = ( +/obj/structure/sign/warning/secure_area/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "ikZ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, /area/station/security/range) -"ilc" = ( -/obj/machinery/suit_storage_unit/atmos, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "ilg" = ( /obj/machinery/hydroponics/soil, /obj/effect/decal/cleanable/dirt, @@ -22346,21 +22394,6 @@ }, /turf/open/floor/wood, /area/station/service/library) -"ilH" = ( -/obj/item/radio/intercom/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Command Hallway - Starboard" - }, -/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{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) "ilJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/yellow/half/contrasted{ @@ -22409,14 +22442,40 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron, /area/station/cargo/warehouse) +"ims" = ( +/obj/machinery/vending/wardrobe/medi_wardrobe, +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"imt" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 9 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) "imw" = ( -/obj/machinery/door/window/left/directional/north{ - dir = 8; +/obj/machinery/door/window/left/directional/west{ name = "Containment Pen #3"; req_access = list("xenobiology") }, /turf/open/floor/engine, /area/station/science/xenobiology) +"imy" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave{ + pixel_y = 6 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) "imU" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -22425,13 +22484,15 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"ink" = ( -/obj/item/kirbyplants/random, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/iron, -/area/station/science/research) +"ina" = ( +/obj/machinery/stasis{ + dir = 4 + }, +/obj/machinery/defibrillator_mount/directional/north, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "inw" = ( /obj/machinery/disposal/bin{ desc = "A pneumatic waste disposal unit. This one leads into space!"; @@ -22449,13 +22510,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/brig) -"inG" = ( -/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) "inH" = ( /obj/structure/table/wood, /obj/item/pai_card, @@ -22471,23 +22525,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"inO" = ( -/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/window/reinforced/spawner/directional/west, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) -"inP" = ( -/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) "inQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ @@ -22532,15 +22569,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/medical/storage) -"iow" = ( -/obj/effect/turf_decal/siding/purple/corner{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/research) "iox" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -22559,14 +22587,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/sorting) -"ioK" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) "ioZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -22667,22 +22687,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"iqK" = ( -/obj/structure/table/glass, -/obj/item/scalpel{ - pixel_y = 12 - }, -/obj/item/circular_saw, -/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" - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) "iqN" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command{ @@ -22706,16 +22710,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"irh" = ( -/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/garden) "irm" = ( /obj/structure/plasticflaps/opaque, /obj/effect/turf_decal/delivery, @@ -22756,30 +22750,11 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"irW" = ( -/obj/machinery/vending/coffee, -/obj/structure/sign/map/left{ - desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; - icon_state = "map-left-MS"; - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) "irY" = ( /obj/machinery/power/emitter/welded, /obj/structure/cable, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"isa" = ( -/obj/structure/table, -/obj/machinery/fax{ - fax_name = "Cargo Office"; - name = "Cargo Office Fax Machine" - }, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron, -/area/station/cargo/sorting) "isc" = ( /obj/docking_port/stationary/random{ name = "lavaland"; @@ -22793,6 +22768,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) +"isk" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "isl" = ( /obj/machinery/light/small/broken/directional/south, /turf/open/floor/plating, @@ -22803,18 +22790,6 @@ }, /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/structure/cable, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) "isr" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /obj/machinery/door/poddoor/shutters/radiation/preopen{ @@ -22833,6 +22808,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, /turf/open/floor/iron/checker, /area/station/maintenance/aft/lesser) "isO" = ( @@ -22849,22 +22827,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/disposal) -"isQ" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Central Primary Hallway - Aft-Port Corner" - }, -/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 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "isV" = ( /turf/open/floor/engine/n2, /area/station/engineering/atmos) @@ -22912,6 +22874,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/port/aft) "itr" = ( @@ -22956,7 +22919,6 @@ name = "Engineering Security Doors" }, /obj/effect/turf_decal/caution/stand_clear, -/obj/structure/sign/delamination_counter/directional/north, /turf/open/floor/iron/dark, /area/station/engineering/break_room) "iug" = ( @@ -22981,6 +22943,14 @@ /obj/effect/spawner/random/food_or_drink/donkpockets, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"iuE" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/glass/drinkingglass, +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white, +/area/station/security/prison/mess) "iva" = ( /obj/machinery/door/airlock/maintenance{ name = "Security Maintenance" @@ -23064,16 +23034,12 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"iwf" = ( -/obj/structure/table/wood, -/obj/item/clothing/head/costume/sombrero/green, -/obj/structure/sign/poster/random/directional/east, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood/large, -/area/station/service/theater) +"iwj" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "iwt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall, @@ -23096,6 +23062,14 @@ /obj/item/clothing/glasses/welding, /turf/open/floor/iron, /area/station/science/robotics/lab) +"iwL" = ( +/obj/effect/spawner/structure/window/reinforced/tinted, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/medical/morgue) "iwO" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -23181,16 +23155,6 @@ /obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) -"iyi" = ( -/obj/effect/spawner/random/entertainment/arcade, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"iyj" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "iym" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -23199,6 +23163,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"iyv" = ( +/obj/structure/table, +/obj/machinery/fax{ + fax_name = "Cargo Office"; + name = "Cargo Office Fax Machine" + }, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/cargo/sorting) "iyy" = ( /obj/structure/table, /obj/item/folder/white{ @@ -23331,6 +23305,17 @@ }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) +"iAj" = ( +/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 + }, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "iAk" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -23364,6 +23349,11 @@ /obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/white, /area/station/science/ordnance/testlab) +"iAu" = ( +/obj/machinery/iv_drip, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) "iAA" = ( /obj/item/toy/beach_ball/branded{ pixel_y = 7 @@ -23435,6 +23425,14 @@ /obj/machinery/door/airlock/public/glass/incinerator/atmos_interior, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) +"iCr" = ( +/obj/structure/rack, +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/effect/spawner/random/armory/riot_helmet, +/obj/effect/spawner/random/armory/bulletproof_helmet, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "iCz" = ( /obj/effect/mapping_helpers/airlock/locked, /obj/machinery/door/airlock/vault{ @@ -23521,11 +23519,6 @@ }, /turf/open/floor/wood, /area/station/security/office) -"iDU" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "iEj" = ( /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/plating/airless, @@ -23534,6 +23527,11 @@ /obj/structure/reagent_dispensers/plumbed, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"iEv" = ( +/obj/structure/closet, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/aft) "iEE" = ( /obj/structure/table, /obj/effect/spawner/random/entertainment/deck, @@ -23556,14 +23554,6 @@ }, /turf/open/floor/wood/large, /area/station/service/theater) -"iFe" = ( -/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) "iFh" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -23595,6 +23585,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/command/heads_quarters/hos) +"iFI" = ( +/obj/item/radio/intercom/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) "iFR" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ dir = 4 @@ -23624,42 +23621,32 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"iGt" = ( -/obj/structure/closet/wardrobe/white, -/obj/effect/landmark/start/hangover/closet, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/locker) +"iGy" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood, +/area/station/commons/dorms) "iGA" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) +"iGT" = ( +/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) "iHc" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/commons/fitness) -"iHf" = ( -/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/cup/glass/coffee{ - pixel_x = -3; - pixel_y = 9 - }, -/obj/item/reagent_containers/cup/glass/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) "iHn" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 4 @@ -23696,22 +23683,25 @@ "iHD" = ( /turf/closed/wall/r_wall, /area/station/security/courtroom) -"iHF" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/firealarm/directional/south, -/obj/structure/table/wood, -/obj/item/stack/sheet/cloth/ten, -/obj/item/toy/crayon/spraycan, -/obj/item/stack/rods/ten, -/turf/open/floor/wood/large, -/area/station/service/theater) "iHH" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/engine, /area/station/science/xenobiology) +"iIf" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Locker Room Entrance" + }, +/obj/structure/cable, +/obj/structure/sign/departments/lawyer/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/neutral{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/commons/locker) "iIq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/chapel{ @@ -23732,20 +23722,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) -"iIW" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) -"iJb" = ( -/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) "iJd" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp/green{ @@ -23779,18 +23755,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/plating, /area/station/maintenance/solars/port/fore) -"iJt" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Science Ordnance Test Lab"; - network = list("ss13","rd") - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/siding/purple{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/science/ordnance/testlab) "iJx" = ( /obj/structure/cable, /obj/structure/table, @@ -23819,12 +23783,6 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron, /area/station/security/execution/transfer) -"iJB" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) "iJC" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -23851,6 +23809,19 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"iKj" = ( +/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 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/brig) "iKL" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -23959,12 +23930,10 @@ }, /turf/open/floor/carpet/red, /area/station/command/heads_quarters/qm) -"iMc" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) "iMd" = ( -/obj/structure/bed, +/obj/structure/bed/medical/emergency{ + dir = 4 + }, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) "iMi" = ( @@ -23994,23 +23963,6 @@ /obj/effect/mapping_helpers/mail_sorting/security/detectives_office, /turf/open/floor/iron, /area/station/security/brig) -"iMp" = ( -/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) "iMr" = ( /obj/machinery/door/poddoor/shutters/preopen{ dir = 8; @@ -24036,12 +23988,24 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"iME" = ( -/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) +"iMF" = ( +/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, +/obj/machinery/requests_console/directional/north{ + department = "Janitorial"; + name = "Janitorial Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/iron, +/area/station/service/janitor) "iMG" = ( /obj/structure/chair/stool/directional/south, /obj/structure/disposalpipe/junction/flip{ @@ -24079,20 +24043,34 @@ /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) -"iNh" = ( -/obj/structure/sign/warning/cold_temp/directional/north{ - name = "\improper CRYOGENICS" - }, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/turf/open/floor/iron/dark/textured, -/area/station/medical/cryo) "iNi" = ( /obj/item/shard, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating/airless, /area/space/nearstation) +"iNk" = ( +/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/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/command/heads_quarters/qm) "iNo" = ( /obj/structure/filingcabinet/filingcabinet, /obj/machinery/camera/directional/south{ @@ -24102,18 +24080,6 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/parquet, /area/station/medical/psychology) -"iNy" = ( -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/firealarm/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue/opposingcorners, -/turf/open/floor/iron, -/area/station/service/hydroponics) "iNB" = ( /obj/machinery/firealarm/directional/east, /obj/structure/table/glass, @@ -24161,15 +24127,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"iOf" = ( -/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) "iOm" = ( /obj/machinery/portable_atmospherics/canister, /turf/open/floor/plating, @@ -24187,6 +24144,18 @@ "iOr" = ( /turf/closed/wall/r_wall, /area/station/security/prison/garden) +"iOt" = ( +/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, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/virology) "iOD" = ( /obj/machinery/atmospherics/components/binary/tank_compressor{ dir = 8 @@ -24266,6 +24235,10 @@ }, /turf/open/floor/iron/white, /area/station/medical/office) +"iPT" = ( +/obj/machinery/light/floor, +/turf/open/floor/wood, +/area/station/commons/lounge) "iPX" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/secure_closet/brig{ @@ -24325,10 +24298,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/commons/dorms) -"iQB" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron, -/area/station/engineering/atmos) "iQF" = ( /obj/machinery/door/poddoor/shutters{ id = "supplybridge" @@ -24360,6 +24329,17 @@ }, /turf/open/floor/iron/white, /area/station/science/research) +"iRc" = ( +/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, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron/white, +/area/station/science/research) "iRg" = ( /obj/structure/chair/stool/directional/west, /obj/effect/mapping_helpers/broken_floor, @@ -24391,37 +24371,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"iRD" = ( -/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_access = list("engineering") - }, -/obj/machinery/button/door/directional/east{ - id = "atmos"; - name = "Atmospherics Lockdown"; - pixel_y = 24; - req_access = list("atmospherics") - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/engineering) +"iRy" = ( +/obj/structure/table/reinforced, +/obj/machinery/cell_charger, +/obj/item/radio/intercom/directional/west, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "iRR" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24485,8 +24441,8 @@ pixel_y = 2 }, /obj/item/reagent_containers/cup/soda_cans/monkey_energy{ - pixel_y = 7; - pixel_x = -7 + pixel_x = -7; + pixel_y = 7 }, /turf/open/floor/iron/white/smooth_half, /area/station/commons/fitness) @@ -24568,6 +24524,18 @@ }, /turf/open/floor/wood, /area/station/service/lawoffice) +"iUe" = ( +/obj/structure/table/wood, +/obj/item/lipstick{ + pixel_y = 5 + }, +/obj/effect/spawner/random/entertainment/musical_instrument, +/obj/structure/sign/poster/random/directional/east, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/station/service/theater) "iUf" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24578,14 +24546,6 @@ "iUm" = ( /turf/closed/wall, /area/station/hallway/secondary/exit/departure_lounge) -"iUq" = ( -/obj/machinery/light/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "iUs" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -24622,6 +24582,21 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"iUV" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/effect/turf_decal/trimline/brown/line, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/bitrunner, +/obj/machinery/holopad, +/turf/open/floor/iron/dark/textured_half, +/area/station/bitrunning/den) "iVi" = ( /obj/machinery/door/airlock{ id_tag = "Cabin6"; @@ -24650,14 +24625,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"iVB" = ( -/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) "iVE" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -24690,25 +24657,38 @@ }, /turf/open/floor/iron, /area/station/security/office) -"iWn" = ( -/obj/item/dice/d20, -/obj/item/dice, -/obj/structure/table/wood, -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/dice, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +"iWk" = ( +/obj/structure/chair/comfy/black{ + dir = 8 }, -/obj/structure/light_construct/small/directional/south, -/obj/structure/sign/poster/contraband/random/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) +/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 = 4 + }, +/area/station/service/chapel) "iWy" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /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/ordnance/storage) +"iWB" = ( +/obj/structure/rack{ + icon = 'icons/obj/fluff/general.dmi'; + icon_state = "minibar"; + name = "skeletal minibar" + }, +/obj/item/storage/fancy/candle_box, +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine/cult, +/area/station/service/library) "iWD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -24722,15 +24702,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"iWT" = ( +/obj/effect/turf_decal/siding/purple{ + dir = 6 + }, +/obj/structure/table, +/obj/item/clipboard, +/obj/item/holosign_creator/atmos, +/obj/item/holosign_creator/atmos, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/white, +/area/station/science/ordnance/office) "iWU" = ( /turf/closed/wall/r_wall, /area/station/engineering/break_room) -"iXa" = ( -/obj/structure/table, -/obj/structure/cable, -/obj/item/kirbyplants/photosynthetic, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) "iXb" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -24755,10 +24740,14 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/iron, /area/station/hallway/primary/central) -"iXS" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/engine, -/area/station/science/xenobiology) +"iXC" = ( +/obj/item/tank/internals/oxygen, +/obj/item/tank/internals/oxygen, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/port) "iXT" = ( /obj/structure/cable, /obj/machinery/door/airlock{ @@ -24803,6 +24792,15 @@ }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) +"iYE" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/obj/effect/turf_decal/siding/purple{ + dir = 6 + }, +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/mixingchamber_access, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/burnchamber) "iYG" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/neutral{ @@ -24828,6 +24826,17 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/construction/mining/aux_base) +"iYW" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "iZd" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 10 @@ -24877,11 +24886,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"iZN" = ( -/obj/machinery/light/directional/east, -/obj/machinery/status_display/ai/directional/east, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) "iZS" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 @@ -24892,6 +24896,15 @@ /obj/machinery/portable_atmospherics/canister/anesthetic_mix, /turf/open/floor/iron/dark, /area/station/medical/cryo) +"jaj" = ( +/obj/structure/chair, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood, +/area/station/security/office) "jaq" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 10 @@ -24962,15 +24975,14 @@ /obj/item/shard, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"jcd" = ( -/obj/machinery/firealarm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ +"jcc" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) +/obj/effect/spawner/random/armory/laser_gun, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "jcw" = ( /obj/machinery/atmospherics/components/tank, /turf/open/floor/iron/dark, @@ -24985,6 +24997,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 8 }, +/obj/machinery/light/small/directional/west, /turf/open/floor/wood/parquet, /area/station/medical/psychology) "jcJ" = ( @@ -25007,13 +25020,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/courtroom) -"jcW" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/commons/dorms) "jdg" = ( /obj/structure/flora/bush/ferny/style_random, /obj/structure/flora/bush/fullgrass/style_random, @@ -25029,6 +25035,12 @@ }, /turf/open/floor/iron, /area/station/construction/storage_wing) +"jdv" = ( +/obj/machinery/airalarm/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/directional/east, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) "jdB" = ( /obj/structure/table, /obj/machinery/cell_charger, @@ -25036,12 +25048,16 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/engineering/main) -"jdF" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) +"jdH" = ( +/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") + }, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/turf/open/floor/iron/kitchen_coldroom, +/area/station/medical/coldroom) "jdR" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -25049,6 +25065,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/fore) +"jdX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/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) "jdZ" = ( /obj/docking_port/stationary/random{ dir = 4; @@ -25071,14 +25098,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/primary/central) -"jet" = ( -/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) "jew" = ( /obj/effect/turf_decal/stripes/red/line{ dir = 4 @@ -25101,15 +25120,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/iron/dark, /area/station/medical/cryo) -"jeX" = ( -/obj/machinery/light/directional/east, -/obj/structure/disposalpipe/segment, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "jfa" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/machinery/vending/games, @@ -25132,6 +25142,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/medical/general, /obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/landmark/navigate_destination, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "jfr" = ( @@ -25289,15 +25300,6 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/station/solars/starboard/fore) -"jhf" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/firealarm/directional/west, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) "jhk" = ( /obj/structure/chair{ dir = 1 @@ -25333,7 +25335,7 @@ dir = 4 }, /obj/structure/disposalpipe/segment, -/mob/living/simple_animal/sloth/citrus, +/mob/living/basic/sloth/citrus, /turf/open/floor/iron, /area/station/cargo/storage) "jhD" = ( @@ -25399,6 +25401,9 @@ dir = 4 }, /obj/effect/turf_decal/tile/purple/fourcorners, +/obj/effect/turf_decal/siding/purple/corner{ + dir = 1 + }, /turf/open/floor/iron/white, /area/station/science/cytology) "jjn" = ( @@ -25412,6 +25417,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) +"jjv" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "jjy" = ( /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/dark, @@ -25427,12 +25439,17 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) -"jjL" = ( -/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) +"jjG" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Recreation Area - Fore" + }, +/obj/machinery/airalarm/directional/north, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "jjM" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/green/filled/line, @@ -25447,9 +25464,7 @@ /turf/open/floor/iron, /area/station/commons/dorms) "jjS" = ( -/obj/item/kirbyplants{ - icon_state = "plant-06" - }, +/obj/item/kirbyplants/organic/plant6, /obj/effect/turf_decal/stripes/line{ dir = 9 }, @@ -25461,6 +25476,14 @@ }, /turf/open/floor/iron, /area/station/security/office) +"jku" = ( +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/engineering/atmos) "jkG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25491,6 +25514,7 @@ dir = 5 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/item/soap, /turf/open/floor/iron/white, /area/station/science/xenobiology/hallway) "jld" = ( @@ -25581,15 +25605,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"jmB" = ( -/obj/machinery/restaurant_portal/restaurant, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/light/directional/north, -/turf/open/floor/wood, -/area/station/commons/lounge) "jmJ" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ @@ -25597,12 +25612,31 @@ }, /turf/open/floor/plating, /area/station/maintenance/port) +"jmN" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Port Primary Hallway - Middle" + }, +/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/hallway/primary/port) "jmR" = ( /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) +"jmT" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "jmY" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -25695,12 +25729,20 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"jov" = ( -/obj/machinery/shower/directional/west, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) +"joP" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/wood, +/area/station/commons/lounge) +"jpj" = ( +/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, +/area/station/security/brig) "jpr" = ( /obj/structure/rack, /obj/effect/spawner/random/techstorage/command_all, @@ -25722,15 +25764,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/space_hut) -"jpE" = ( -/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) "jpG" = ( /obj/structure/closet/secure_closet/miner, /obj/machinery/camera/directional/north{ @@ -25739,6 +25772,19 @@ /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"jpI" = ( +/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 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "jpO" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper, @@ -25748,22 +25794,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"jpY" = ( -/obj/machinery/smartfridge/chemistry/preloaded, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 8; - id = "chem_lockdown"; - name = "Chemistry Shutters" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) +"jpX" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "jqa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"jqd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "jql" = ( /obj/machinery/door/airlock{ id_tag = "AuxToilet2"; @@ -25771,6 +25818,22 @@ }, /turf/open/floor/iron, /area/station/commons/toilet/auxiliary) +"jqp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/effect/spawner/random/maintenance/two, +/turf/open/floor/plating, +/area/station/maintenance/port) +"jqr" = ( +/obj/machinery/computer/security/mining{ + dir = 4 + }, +/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) "jqQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -25820,30 +25883,6 @@ /obj/machinery/cell_charger, /turf/open/floor/iron, /area/station/science/robotics/lab) -"jrT" = ( -/obj/machinery/light/directional/west, -/obj/structure/cable, -/obj/structure/table, -/obj/effect/turf_decal/stripes/line, -/obj/item/clothing/head/utility/welding{ - pixel_y = 9 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/item/clothing/head/utility/welding{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/clothing/head/utility/welding{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos/storage/gas) "jrY" = ( /obj/machinery/door/airlock/external{ name = "Transport Airlock" @@ -25875,8 +25914,18 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/effect/turf_decal/siding/purple/corner{ + dir = 8 + }, /turf/open/floor/iron/white, /area/station/science/cytology) +"jsj" = ( +/obj/machinery/shower/directional/west, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/iron/white/textured, +/area/station/medical/surgery/theatre) "jso" = ( /obj/structure/cable, /obj/machinery/door/firedoor, @@ -25901,19 +25950,13 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/service/chapel/funeral) -"jsv" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/directional/north, +"jsH" = ( /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) +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "jsL" = ( /obj/structure/rack, /obj/item/extinguisher, @@ -25921,14 +25964,6 @@ /obj/effect/spawner/random/trash/janitor_supplies, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"jsO" = ( -/obj/machinery/light/directional/north, -/obj/structure/chair/sofa/corp/right, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) "jsP" = ( /obj/structure/chair{ dir = 1 @@ -25938,11 +25973,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"jtb" = ( -/obj/machinery/vending/clothing, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/locker) "jtf" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -25959,6 +25989,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) +"jty" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/cargo/storage) "jtA" = ( /obj/structure/table/glass, /obj/effect/turf_decal/siding/white{ @@ -25984,14 +26021,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/science/lab) -"jtL" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Cargo Bay - Mailroom" - }, -/obj/effect/turf_decal/trimline/brown/filled/shrink_ccw, -/obj/effect/turf_decal/trimline/white/filled/warning, -/turf/open/floor/iron, -/area/station/cargo/sorting) "jtS" = ( /obj/structure/table/reinforced, /obj/machinery/power/apc/auto_name/directional/east, @@ -26004,14 +26033,6 @@ /obj/item/circuitboard/mecha/ripley/peripherals, /turf/open/floor/iron, /area/station/science/robotics/lab) -"jtZ" = ( -/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) "juf" = ( /obj/machinery/telecomms/bus/preset_two, /turf/open/floor/circuit/telecomms/mainframe, @@ -26072,13 +26093,6 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/maintenance/port/aft) -"jvh" = ( -/obj/item/storage/crayons, -/obj/machinery/light/small/directional/west, -/obj/structure/table/wood, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) "jvj" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 4 @@ -26089,7 +26103,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ dir = 1 }, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "jvo" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, @@ -26109,6 +26123,14 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) +"jvu" = ( +/obj/machinery/newscaster/directional/west, +/obj/structure/filingcabinet, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) "jvv" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26207,6 +26229,20 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/medical/cryo) +"jws" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_x = 3; + pixel_y = -2 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/science/ordnance) "jwv" = ( /obj/structure/toilet{ pixel_y = 8 @@ -26236,6 +26272,11 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"jwE" = ( +/obj/structure/cable, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/station/service/library) "jwP" = ( /obj/structure/table, /obj/item/paper_bin, @@ -26288,12 +26329,6 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) -"jxA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "jxH" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -26306,6 +26341,24 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"jxM" = ( +/obj/item/radio/intercom/directional/west{ + pixel_y = -10 + }, +/obj/machinery/light_switch/directional/west{ + pixel_y = 6 + }, +/obj/structure/table/reinforced, +/obj/machinery/fax{ + fax_name = "Engineering Lobby"; + name = "Engineering Lobby Fax Machine" + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/engineering/break_room) "jxS" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -26450,6 +26503,11 @@ /obj/machinery/holopad, /turf/open/floor/iron, /area/station/science/robotics/lab) +"jAN" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron, +/area/station/security/office) "jAO" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -26493,6 +26551,31 @@ /obj/structure/cable, /turf/open/floor/grass, /area/station/medical/virology) +"jBO" = ( +/obj/item/dice/d20, +/obj/item/dice, +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt, +/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) +"jBU" = ( +/obj/structure/chair/office/tactical{ + dir = 1 + }, +/obj/effect/landmark/start/coroner, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 8 + }, +/area/station/medical/morgue) "jBY" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/bot, @@ -26518,11 +26601,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/central) -"jCq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) "jCw" = ( /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, @@ -26533,6 +26611,7 @@ /obj/machinery/atmospherics/components/tank/plasma{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "jCM" = ( @@ -26550,21 +26629,11 @@ /obj/effect/landmark/blobstart, /turf/open/floor/iron, /area/station/cargo/warehouse) -"jDk" = ( -/obj/effect/spawner/random/entertainment/arcade, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "jDB" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/prison/work) -"jDP" = ( -/obj/machinery/airalarm/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/chapel, -/area/station/service/chapel) "jEc" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -26576,12 +26645,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/fore) -"jEf" = ( -/obj/structure/chair/comfy{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) "jEh" = ( /obj/structure/table/reinforced, /obj/machinery/cell_charger, @@ -26601,34 +26664,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"jEx" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"jEF" = ( -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/effect/turf_decal/bot, -/obj/machinery/light/small/directional/south, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/iron, -/area/station/science/xenobiology) "jEI" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 }, /turf/open/floor/plating, /area/station/security/execution/transfer) -"jEN" = ( -/obj/machinery/light/directional/west, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "jER" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -26642,14 +26683,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"jEY" = ( -/obj/structure/table, -/obj/item/phone{ - pixel_x = 6; - pixel_y = -2 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "jFi" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -26700,6 +26733,13 @@ /obj/effect/landmark/start/hangover/closet, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) +"jFZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "jGa" = ( /obj/structure/table/reinforced, /obj/item/paper_bin{ @@ -26723,6 +26763,14 @@ "jGr" = ( /turf/closed/wall/r_wall, /area/station/tcommsat/server) +"jGt" = ( +/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) "jGv" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -26756,6 +26804,13 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/treatment_center) +"jGO" = ( +/obj/machinery/hydroponics/soil, +/obj/item/cultivator, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/south, +/turf/open/floor/grass, +/area/station/security/prison/garden) "jHg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -26804,6 +26859,16 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/security/office) +"jHQ" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) "jHW" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/effect/turf_decal/trimline/brown/filled/warning, @@ -26814,7 +26879,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, -/turf/open/floor/holofloor/dark, +/turf/open/floor/iron/dark/textured_large, /area/station/science/cytology) "jIg" = ( /obj/structure/table, @@ -26843,20 +26908,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/maintenance/space_hut) -"jIU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/item/storage/box/lights/mixed, -/obj/item/cigbutt/cigarbutt, -/obj/item/flashlight/flare/candle{ - pixel_x = -5 - }, -/obj/item/storage/box/matches{ - pixel_x = 1; - pixel_y = -1 - }, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) "jIV" = ( /obj/effect/spawner/random/structure/chair_maintenance, /obj/effect/mapping_helpers/burnt_floor, @@ -26900,12 +26951,29 @@ /obj/effect/spawner/random/maintenance/three, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"jJl" = ( +/obj/structure/table/reinforced, +/obj/structure/reagent_dispensers/servingdish, +/obj/effect/turf_decal/tile/red/opposingcorners, +/turf/open/floor/iron/white, +/area/station/security/prison/mess) "jJm" = ( /obj/effect/spawner/random/trash/garbage{ spawn_scatter_radius = 1 }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"jJp" = ( +/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/execution/transfer) "jJC" = ( /obj/structure/disposalpipe/segment, /obj/structure/lattice/catwalk, @@ -26926,12 +26994,12 @@ /turf/open/floor/iron/white, /area/station/science/research) "jJY" = ( -/obj/structure/cable, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 +/obj/structure/table/reinforced, +/obj/item/storage/box/beakers{ + pixel_y = 7 }, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) +/turf/open/floor/iron/dark/textured, +/area/station/medical/chem_storage) "jKa" = ( /obj/machinery/door/airlock/research{ name = "Testing Labs" @@ -27014,16 +27082,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"jLm" = ( -/obj/machinery/light/directional/north, -/obj/machinery/door/window/right/directional/north{ - dir = 4; - name = "Research Delivery"; - req_access = list("science") - }, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron/white, -/area/station/science/lab) "jLo" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron, @@ -27033,6 +27091,13 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space/nearstation) +"jLy" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "jLD" = ( /obj/effect/landmark/event_spawn, /obj/structure/cable, @@ -27045,6 +27110,13 @@ /obj/structure/railing/corner, /turf/open/floor/plating/airless, /area/space/nearstation) +"jLI" = ( +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "jMo" = ( /obj/structure/chair/stool/directional/north, /turf/open/floor/iron, @@ -27072,6 +27144,22 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/detectives_office) +"jMJ" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe, +/obj/item/reagent_containers/cup/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 + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/white, +/area/station/security/execution/transfer) "jML" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 4 @@ -27111,7 +27199,6 @@ /area/station/hallway/secondary/entry) "jNl" = ( /obj/structure/table, -/obj/machinery/light/directional/south, /obj/item/storage/medkit/regular{ pixel_x = 4; pixel_y = 4 @@ -27119,8 +27206,20 @@ /obj/item/storage/medkit/regular, /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/machinery/light/cold/directional/south, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"jNm" = ( +/obj/effect/landmark/blobstart, +/obj/machinery/camera/directional/north{ + c_tag = "Security - 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/evidence) "jNo" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -27148,6 +27247,15 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"jNZ" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Telecomms - Server Room - Aft-Port"; + network = list("ss13","tcomms") + }, +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/tlv_no_checks, +/turf/open/floor/iron/dark/telecomms, +/area/station/tcommsat/server) "jOb" = ( /obj/docking_port/stationary/mining_home/common{ dir = 2 @@ -27169,6 +27277,11 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) +"jOw" = ( +/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) "jOF" = ( /obj/structure/rack, /obj/item/gun/energy/laser/practice{ @@ -27227,6 +27340,19 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/engineering/main) +"jPf" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Starboard Primary Hallway - Engineering" + }, +/obj/structure/sign/directions/engineering{ + dir = 4; + pixel_y = -24 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "jPi" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -27235,10 +27361,25 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"jPo" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/central) +"jPm" = ( +/obj/machinery/atmospherics/components/tank/air, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"jPp" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/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) "jPE" = ( /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)."; @@ -27326,32 +27467,16 @@ dir = 1 }, /area/station/engineering/storage_shared) +"jRc" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "jRg" = ( /turf/open/floor/engine/co2, /area/station/engineering/atmos) -"jRh" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/syringe, -/obj/item/reagent_containers/cup/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/execution/transfer) -"jRv" = ( -/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) "jRz" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance, @@ -27380,6 +27505,16 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) +"jSb" = ( +/obj/machinery/light_switch/directional/west, +/obj/effect/landmark/start/hangover, +/obj/machinery/duct, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) "jSf" = ( /obj/structure/chair/stool/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -27422,20 +27557,19 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) -"jSV" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ - dir = 1 +"jTi" = ( +/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/small/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/turf/open/floor/grass, +/area/station/security/prison/garden) "jTs" = ( /obj/item/kirbyplants/potty, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, +/turf/open/floor/wood/large, /area/station/commons/lounge) "jTy" = ( /obj/structure/table/wood, @@ -27478,6 +27612,11 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) +"jTR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) "jTS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/camera/directional/south{ @@ -27499,12 +27638,33 @@ /area/station/science/lobby) "jUi" = ( /obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/airlock_sensor/incinerator_atmos{ pixel_y = 24 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) +"jUj" = ( +/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) +"jUm" = ( +/obj/structure/closet/secure_closet/bar/all_access{ + pixel_x = -3; + pixel_y = -1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) "jUq" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -27532,6 +27692,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"jUA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/office/light, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) "jUH" = ( /obj/machinery/door/window/right/directional/east{ dir = 8; @@ -27546,6 +27711,30 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/dark, /area/station/security/execution/education) +"jUT" = ( +/obj/structure/table, +/obj/effect/turf_decal/delivery, +/obj/item/clothing/glasses/meson, +/obj/item/clothing/glasses/meson, +/obj/item/clothing/glasses/meson, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/item/storage/belt/utility, +/obj/item/storage/belt/utility, +/obj/item/storage/belt/utility, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/engineering/main) +"jUW" = ( +/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/yellow{ + dir = 8 + }, +/turf/open/floor/iron/dark/corner, +/area/station/engineering/atmos/storage/gas) "jVb" = ( /obj/effect/spawner/random/trash/garbage{ spawn_scatter_radius = 1 @@ -27572,6 +27761,19 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"jVy" = ( +/obj/machinery/portable_atmospherics/pump/lil_pump, +/obj/effect/turf_decal/siding/purple{ + dir = 5 + }, +/obj/machinery/airalarm/directional/east, +/obj/machinery/button/door/directional/north{ + id = "rdordnance"; + name = "Ordnance Containment Control"; + req_access = list("rd") + }, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/storage) "jVG" = ( /obj/structure/table, /obj/item/storage/box/bodybags{ @@ -27597,14 +27799,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"jWd" = ( -/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) "jWg" = ( /obj/structure/extinguisher_cabinet/directional/west, /obj/structure/disposalpipe/segment, @@ -27615,36 +27809,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"jWj" = ( -/obj/structure/cable, -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"jWk" = ( -/obj/machinery/light/directional/west, -/obj/machinery/button/door/directional/west{ - id = "Engineering"; - name = "Engineering Lockdown"; - pixel_y = -6; - req_access = list("engineering") - }, -/obj/machinery/button/door/directional/west{ - id = "atmos"; - name = "Atmospherics Lockdown"; - pixel_y = 6; - req_access = list("atmospherics") - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "jWE" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, @@ -27683,6 +27847,12 @@ "jXu" = ( /turf/closed/wall, /area/station/maintenance/port/fore) +"jXw" = ( +/obj/machinery/firealarm/directional/south, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) "jXy" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/carpet, @@ -27714,21 +27884,26 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/execution/transfer) +"jXO" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "jXQ" = ( /obj/structure/closet/secure_closet/medical2, /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /turf/open/floor/iron/white, /area/station/medical/surgery/aft) -"jXU" = ( -/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/garden) +"jYr" = ( +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/iron/dark, +/area/station/command/gateway) "jYu" = ( /mob/living/basic/cow{ name = "Betsy"; @@ -27780,15 +27955,6 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark, /area/station/command/bridge) -"jZl" = ( -/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) "jZz" = ( /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible, /turf/open/floor/iron, @@ -27892,22 +28058,35 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/engine, /area/station/science/xenobiology) +"kbB" = ( +/obj/structure/chair/sofa/corp/right, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) "kbN" = ( /obj/effect/decal/cleanable/dirt, /obj/item/storage/box/mousetraps{ - pixel_x = -3; - pixel_y = 8 + pixel_x = -5; + pixel_y = 14 }, /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 + pixel_x = 12; + pixel_y = 15 }, /obj/item/radio/intercom/directional/north, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = -7; + pixel_y = 6 + }, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = -1; + pixel_y = 3 + }, /turf/open/floor/iron, /area/station/service/janitor) "kbR" = ( @@ -27939,6 +28118,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/command/heads_quarters/hos) +"kch" = ( +/obj/structure/table, +/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/costume/buttondown/slacks/service, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms) "kcn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -27974,6 +28168,19 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"kcZ" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/gloves/latex/nitrile, +/obj/item/clothing/gloves/latex/nitrile, +/obj/item/clothing/gloves/latex/nitrile, +/obj/item/clothing/gloves/latex/nitrile, +/obj/item/wrench/medical, +/obj/machinery/camera/directional/north{ + c_tag = "Medbay Storage"; + network = list("ss13","medbay") + }, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "kdx" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=8.1-Aft-to-Escape"; @@ -28002,6 +28209,11 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"kdL" = ( +/obj/structure/cable, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "kdN" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -28023,15 +28235,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) -"keq" = ( -/obj/effect/decal/cleanable/dirt, -/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) "keK" = ( /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ dir = 4 @@ -28086,18 +28289,6 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) -"kfK" = ( -/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) "kfL" = ( /turf/closed/wall/mineral/plastitanium, /area/station/commons/fitness/recreation) @@ -28124,6 +28315,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/gateway) +"kgx" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/medical/morgue) "kgy" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -28263,12 +28458,6 @@ /obj/effect/mapping_helpers/mail_sorting/science/rd_office, /turf/open/floor/iron/white, /area/station/science/research) -"kjL" = ( -/obj/structure/table, -/obj/item/clothing/under/suit/sl, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "kjO" = ( /obj/structure/table, /obj/item/restraints/handcuffs/cable/white, @@ -28277,17 +28466,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"kjX" = ( -/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) "kka" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28295,18 +28473,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/carpet, /area/station/service/theater) -"kkf" = ( -/obj/item/radio/intercom/directional/west, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 5 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos) "kkr" = ( /obj/structure/plasticflaps/opaque, /obj/machinery/door/poddoor/preopen{ @@ -28330,6 +28496,26 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/central) +"kkX" = ( +/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) "klf" = ( /obj/item/folder, /obj/item/folder, @@ -28448,12 +28634,6 @@ /obj/machinery/status_display/evac, /turf/closed/wall, /area/station/commons/lounge) -"kms" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/mob/living/basic/giant_spider/sgt_araneus, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hos) "kmN" = ( /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) @@ -28466,6 +28646,12 @@ /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, /area/station/command/gateway) +"knd" = ( +/obj/effect/landmark/start/assistant, +/obj/structure/chair/comfy/black, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood, +/area/station/service/library) "knf" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28488,6 +28674,16 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"knI" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "knK" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -28496,16 +28692,6 @@ }, /turf/open/floor/wood, /area/station/service/library) -"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) "knQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, @@ -28520,16 +28706,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron, /area/station/security/checkpoint/supply) -"knU" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 10 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner, -/area/station/engineering/atmos/pumproom) "knY" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -28594,6 +28770,16 @@ "kor" = ( /turf/closed/wall, /area/station/maintenance/department/science/central) +"kou" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "koW" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=10.2-Aft-Port-Corner"; @@ -28605,16 +28791,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central) -"kpu" = ( -/obj/machinery/light/directional/north, -/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{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) +"kpi" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/status_display/ai/directional/west, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "kpB" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -28641,6 +28824,14 @@ /obj/structure/sign/warning/vacuum/external/directional/north, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"kpV" = ( +/obj/machinery/computer/operating{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) "kqm" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/blue/filled/warning{ @@ -28675,6 +28866,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/security/prison) +"krt" = ( +/obj/item/storage/bag/plants/portaseeder, +/obj/structure/table, +/obj/item/plant_analyzer, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) "krL" = ( /turf/open/floor/wood, /area/station/command/corporate_showroom) @@ -28715,17 +28916,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/commons/storage/tools) -"ksl" = ( -/obj/machinery/chem_heater/withbuffer, -/obj/machinery/light/directional/south, -/obj/machinery/button/door/directional/south{ - id = "pharmacy_shutters_2"; - name = "pharmacy shutters control"; - req_access = list("pharmacy") - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) "kso" = ( /obj/effect/turf_decal/bot_white/right, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -28741,14 +28931,25 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) -"ksU" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 +"ksZ" = ( +/obj/machinery/recharger{ + pixel_y = 4 }, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) +/obj/machinery/camera/directional/north{ + c_tag = "Security Post - Medbay"; + network = list("ss13","medbay") + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/light/small/directional/north, +/obj/structure/table/reinforced, +/obj/machinery/requests_console/directional/north{ + department = "Security"; + name = "Security Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/mapping_helpers/requests_console/supplies, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/medical) "ktl" = ( /obj/structure/sink/directional/east, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ @@ -28786,6 +28987,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload_foyer) +"ktw" = ( +/obj/structure/sign/warning/electric_shock/directional/north, +/turf/open/space/basic, +/area/space) "ktz" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -28831,15 +29036,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) -"kua" = ( -/obj/structure/table, -/obj/effect/turf_decal/siding/white/corner, -/obj/machinery/firealarm/directional/north, -/obj/item/clipboard, -/obj/item/paper, -/obj/item/pen, -/turf/open/floor/iron/dark, -/area/station/medical/office) "kud" = ( /obj/structure/sign/warning/vacuum/external/directional/south, /obj/effect/turf_decal/stripes/line, @@ -28851,10 +29047,6 @@ /obj/effect/turf_decal/trimline/blue/filled/corner, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"kul" = ( -/obj/machinery/vending/cigarette, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/aft) "kuD" = ( /obj/structure/lattice, /obj/machinery/atmospherics/components/unary/passive_vent{ @@ -28922,6 +29114,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"kwb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "kwi" = ( /obj/effect/spawner/random/structure/crate_empty, /obj/item/clothing/gloves/color/fyellow, @@ -28947,6 +29146,13 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/white, /area/station/science/research) +"kwC" = ( +/obj/machinery/airalarm/directional/south, +/obj/machinery/camera/directional/south{ + c_tag = "Brig - Hallway - Starboard" + }, +/turf/open/floor/iron, +/area/station/security/brig) "kwF" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -28970,6 +29176,12 @@ "kwZ" = ( /turf/open/floor/engine/vacuum, /area/station/engineering/atmos) +"kxa" = ( +/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) "kxq" = ( /obj/machinery/status_display/evac/directional/north, /obj/machinery/porta_turret/ai, @@ -29029,27 +29241,12 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) -"kyf" = ( -/obj/machinery/light/directional/west, -/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/aft) "kyh" = ( /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) -"kyl" = ( -/obj/item/radio/intercom/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) "kym" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -29059,6 +29256,16 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"kys" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"kyt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) "kyQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29093,17 +29300,6 @@ /obj/effect/turf_decal/tile/yellow/anticorner/contrasted, /turf/open/floor/iron, /area/station/engineering/break_room) -"kzb" = ( -/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) "kzg" = ( /obj/machinery/ntnet_relay, /turf/open/floor/circuit/green/telecomms/mainframe, @@ -29147,6 +29343,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/port/aft) +"kAc" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "kAp" = ( /obj/machinery/door/window/left/directional/north{ dir = 8; @@ -29224,15 +29427,11 @@ /area/station/science/genetics) "kBQ" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/electrolyzer, /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, +/obj/structure/closet/radiation, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"kBR" = ( -/obj/structure/bodycontainer/morgue/beeper_off, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "kBS" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/spawner/random/structure/closet_maintenance, @@ -29247,21 +29446,28 @@ /turf/open/floor/iron, /area/station/command/teleporter) "kCq" = ( -/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/machinery/modular_computer/console/preset/engineering, +/obj/machinery/modular_computer/preset/engineering, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/incident_display/delam/directional/north, /turf/open/floor/iron/dark, /area/station/engineering/main) "kCr" = ( /obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/holofloor/dark, +/obj/machinery/plumbing/input{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured_large, /area/station/science/cytology) +"kCt" = ( +/obj/machinery/status_display/door_timer{ + id = "Cell 2"; + name = "Cell 2"; + pixel_y = -32 + }, +/turf/open/floor/iron, +/area/station/security/brig) "kCC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, @@ -29282,6 +29488,17 @@ "kCZ" = ( /turf/closed/wall, /area/station/service/hydroponics) +"kDa" = ( +/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, +/obj/machinery/camera/directional/west{ + c_tag = "Medbay Main Hallway - South"; + network = list("ss13","medbay") + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "kDk" = ( /obj/machinery/door/airlock/security/glass{ name = "Permabrig Visitation" @@ -29398,9 +29615,7 @@ /turf/open/floor/iron, /area/station/science/robotics/lab) "kFT" = ( -/obj/item/kirbyplants{ - icon_state = "plant-13" - }, +/obj/item/kirbyplants/organic/plant13, /obj/effect/turf_decal/stripes/line{ dir = 9 }, @@ -29427,6 +29642,8 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/port/aft) "kGs" = ( @@ -29446,13 +29663,16 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"kGM" = ( -/obj/structure/filingcabinet, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 8 +"kGJ" = ( +/obj/machinery/door/window/right/directional/north{ + dir = 4; + name = "Research Delivery"; + req_access = list("science") }, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) +/obj/machinery/light_switch/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white, +/area/station/science/lab) "kHg" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -29491,18 +29711,16 @@ /turf/open/floor/engine, /area/station/science/explab) "kHU" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/structure/disposalpipe/segment{ +/obj/effect/turf_decal/box/corners, +/obj/effect/turf_decal/box/corners{ dir = 4 }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"kHV" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/table/reinforced, -/obj/machinery/computer/records/medical/laptop, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light_switch/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/landmark/bitrunning/station_reward_spawn, +/turf/open/floor/iron/dark/smooth_large, +/area/station/bitrunning/den) "kIG" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance/two, @@ -29533,11 +29751,15 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood, /area/station/service/library) -"kJH" = ( -/obj/structure/table/wood, -/obj/machinery/light/directional/south, -/turf/open/floor/wood, -/area/station/service/library) +"kJO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/no_nightlight/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos) "kKd" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -29550,6 +29772,17 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"kKh" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/structure/chair{ + dir = 4 + }, +/obj/structure/sign/poster/official/help_others/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "kKk" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -29670,30 +29903,6 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/white, /area/station/science/xenobiology/hallway) -"kLF" = ( -/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) -"kLZ" = ( -/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) "kMd" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -29708,6 +29917,28 @@ }, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) +"kMk" = ( +/obj/item/book/manual/wiki/chemistry{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/book/manual/wiki/grenades, +/obj/item/stack/cable_coil, +/obj/item/stack/cable_coil, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science, +/obj/item/book/manual/wiki/plumbing{ + pixel_x = 4; + pixel_y = -4 + }, +/obj/item/reagent_containers/dropper, +/obj/structure/table, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/obj/structure/sign/poster/official/periodic_table/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "kMl" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -29744,24 +29975,23 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"kNy" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/directional/north, +"kNA" = ( +/obj/structure/cable, /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) +/turf/open/floor/wood/parquet, +/area/station/medical/psychology) "kNO" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/trimline/yellow/filled/end, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/structure/cable, /turf/open/floor/iron/textured, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) "kNV" = ( /obj/machinery/door/airlock/engineering{ name = "Port Quarter Solar Access" @@ -29787,10 +30017,6 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/checkpoint/medical) -"kOt" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall, -/area/station/maintenance/starboard/lesser) "kOB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -29803,10 +30029,6 @@ "kOK" = ( /turf/open/floor/plating, /area/station/hallway/primary/port) -"kOM" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/medical/morgue) "kON" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -29823,9 +30045,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"kOR" = ( -/turf/closed/wall, -/area/station/hallway/primary/aft) "kOX" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -29904,11 +30123,6 @@ "kQe" = ( /turf/closed/wall, /area/station/science/genetics) -"kQi" = ( -/obj/machinery/light_switch/directional/east, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/storage) "kQm" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 @@ -29924,12 +30138,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"kQx" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/item/weldingtool, -/obj/item/clothing/head/utility/welding, -/turf/open/floor/iron, -/area/station/construction/storage_wing) "kQz" = ( /obj/structure/table, /obj/item/storage/box/prisoner{ @@ -29941,18 +30149,6 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) -"kQD" = ( -/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) "kQP" = ( /turf/closed/wall, /area/station/command/heads_quarters/qm) @@ -29970,6 +30166,11 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/locker) +"kQZ" = ( +/obj/effect/spawner/random/structure/grille, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "kRc" = ( /obj/structure/table, /obj/item/multitool{ @@ -30026,13 +30227,6 @@ /obj/machinery/announcement_system, /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) -"kRx" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "kRA" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /obj/effect/mapping_helpers/broken_floor, @@ -30053,6 +30247,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) +"kRV" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "kSo" = ( /obj/structure/chair{ dir = 1 @@ -30130,9 +30330,7 @@ /turf/open/floor/iron/dark, /area/station/service/cafeteria) "kSP" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, +/obj/item/kirbyplants/organic/plant21, /obj/structure/sign/departments/botany/directional/east, /obj/effect/turf_decal/trimline/green/filled/line, /obj/effect/turf_decal/tile/neutral{ @@ -30149,9 +30347,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/commons/locker) -"kTK" = ( -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "kTO" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -30186,12 +30381,6 @@ /obj/structure/cable/layer3, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) -"kUq" = ( -/obj/structure/table, -/obj/structure/cable, -/obj/item/kirbyplants/photosynthetic, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) "kUJ" = ( /obj/effect/turf_decal/box/white{ color = "#52B4E9" @@ -30208,15 +30397,6 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/station/service/hydroponics/garden) -"kUX" = ( -/obj/structure/closet/emcloset, -/obj/structure/sign/warning/pods{ - pixel_y = 30 - }, -/obj/effect/landmark/start/hangover/closet, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) "kUZ" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -30246,15 +30426,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"kVJ" = ( -/obj/machinery/newscaster/directional/west, -/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) "kVN" = ( /turf/open/floor/carpet, /area/station/service/chapel) @@ -30274,6 +30445,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) +"kWd" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/locker) "kWg" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -30292,6 +30470,11 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/foyer) +"kWE" = ( +/obj/machinery/smartfridge/organ, +/obj/effect/turf_decal/tile/dark_blue/full, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/morgue) "kWL" = ( /obj/structure/sign/directions/command{ dir = 4; @@ -30343,6 +30526,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/bridge) +"kWZ" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 1 + }, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) "kXa" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -30350,16 +30542,20 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron, /area/station/commons/toilet/auxiliary) -"kXl" = ( -/obj/item/radio/intercom/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 +"kXp" = ( +/obj/machinery/camera/autoname{ + dir = 5 }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/landmark/start/depsec/engineering, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/security/checkpoint/engineering) "kXt" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/cable, @@ -30380,7 +30576,7 @@ /turf/open/floor/plating, /area/station/maintenance/port/fore) "kXD" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/item/radio/intercom/directional/south, /obj/machinery/camera/directional/south{ c_tag = "Medbay Foyer"; @@ -30461,17 +30657,6 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/general, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"kYx" = ( -/obj/structure/weightmachine/weightlifter, -/obj/effect/turf_decal/tile/dark_red/half/contrasted, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/landmark/start/hangover, -/obj/machinery/light/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/white/textured_edge{ - dir = 1 - }, -/area/station/commons/fitness) "kYD" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -30479,6 +30664,18 @@ "kYG" = ( /turf/closed/wall/r_wall, /area/station/engineering/supermatter/room) +"kYH" = ( +/obj/machinery/light/directional/east, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"kYP" = ( +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "kYU" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -30507,13 +30704,6 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"kZs" = ( -/obj/structure/sign/warning/secure_area/directional/north, -/obj/structure/closet/radiation, -/obj/effect/turf_decal/delivery, -/obj/item/clothing/glasses/meson/engine, -/turf/open/floor/iron, -/area/station/engineering/main) "kZx" = ( /turf/closed/wall, /area/station/science/lab) @@ -30534,23 +30724,12 @@ }, /turf/open/floor/iron, /area/station/security/office) -"kZK" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 10 - }, -/obj/effect/turf_decal/siding/purple{ - dir = 5 - }, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/machinery/light/directional/north, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 +"laa" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/iron/chapel{ + dir = 1 }, -/obj/structure/sign/poster/official/wtf_is_co2/directional/north, -/turf/open/floor/iron/dark, -/area/station/science/ordnance) +/area/station/service/chapel) "laf" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -30684,15 +30863,6 @@ /obj/effect/spawner/random/trash/janitor_supplies, /turf/open/floor/plating, /area/station/maintenance/port) -"lcM" = ( -/obj/machinery/light/directional/west, -/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) "ldc" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -30765,6 +30935,14 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) +"lew" = ( +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/obj/structure/cable, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "leP" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/junction{ dir = 4 @@ -30799,22 +30977,13 @@ /turf/open/floor/iron, /area/station/engineering/break_room) "lfk" = ( -/obj/structure/rack, -/obj/item/reagent_containers/cup/bottle/phosphorus{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/potassium{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/sodium{ - pixel_x = 1 - }, -/turf/open/floor/iron/dark/textured_edge{ - dir = 4 +/obj/effect/turf_decal/trimline/yellow/filled/end{ + dir = 8 }, -/area/station/medical/medbay/central) +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/turf/open/floor/iron/textured, +/area/station/medical/chem_storage) "lfm" = ( /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/freezer, @@ -30855,8 +31024,8 @@ /turf/open/floor/iron, /area/station/construction/storage_wing) "lgj" = ( -/obj/structure/bed{ - dir = 4 +/obj/structure/bed/medical{ + dir = 8 }, /obj/item/clothing/suit/jacket/straight_jacket, /obj/item/clothing/glasses/blindfold, @@ -30873,6 +31042,18 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"lgw" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/machinery/camera/directional/east{ + c_tag = "Medbay Main Hallway - CMO"; + network = list("ss13","medbay") + }, +/obj/structure/noticeboard/cmo{ + dir = 4; + pixel_x = 32 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "lgC" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/co2{ @@ -30899,21 +31080,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"lhc" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/iv_drip, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/security/medical) "lhk" = ( /obj/structure/table, /obj/item/storage/medkit/brute, @@ -30924,6 +31090,14 @@ /obj/effect/spawner/random/trash/janitor_supplies, /turf/open/floor/plating, /area/station/maintenance/fore) +"lhF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/security/prison) "lhT" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -31017,11 +31191,6 @@ /obj/machinery/syndicatebomb/training, /turf/open/floor/iron, /area/station/security/office) -"lji" = ( -/obj/machinery/newscaster/directional/north, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) "ljm" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -31056,64 +31225,11 @@ /obj/machinery/barsign, /turf/closed/wall, /area/station/commons/lounge) -"lkh" = ( -/obj/machinery/modular_computer/console/preset/id, -/obj/machinery/light/directional/north, -/obj/machinery/requests_console/directional/north{ - department = "Security"; - name = "Security Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/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) "lku" = ( /obj/structure/cable, /obj/structure/sign/poster/contraband/random/directional/west, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"lkL" = ( -/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 = list("science") - }, -/obj/machinery/button/door/directional/east{ - id = "rdgene"; - name = "Primary Genetics Shutters Control"; - pixel_y = 6; - req_access = list("science") - }, -/obj/item/storage/box/monkeycubes{ - pixel_x = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) "lkW" = ( /obj/machinery/light/small/directional/east, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -31121,7 +31237,6 @@ /area/station/engineering/storage/tech) "lkZ" = ( /obj/structure/cable, -/obj/effect/landmark/generic_maintenance_landmark, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, @@ -31171,29 +31286,44 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/break_room) -"lme" = ( -/obj/machinery/firealarm/directional/west, -/obj/machinery/light/directional/west, -/obj/item/banner/cargo/mundane, -/obj/structure/disposalpipe/segment{ - dir = 5 +"lmk" = ( +/obj/item/radio/intercom/directional/south, +/obj/structure/bodycontainer/morgue{ + dir = 1 }, -/obj/effect/turf_decal/trimline/brown/filled/corner, -/turf/open/floor/iron, -/area/station/cargo/storage) +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) "lmn" = ( /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) -"lmA" = ( -/obj/machinery/power/smes{ - capacity = 9e+006; - charge = 10000 +"lmx" = ( +/obj/machinery/light_switch/directional/west, +/obj/effect/decal/cleanable/cobweb, +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/food/grown/poppy{ + pixel_x = -3; + pixel_y = 3 }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/obj/item/food/grown/poppy{ + pixel_x = 7; + pixel_y = 7 + }, +/obj/item/flashlight/flare/candle{ + pixel_x = 12; + pixel_y = 4 + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "lmF" = ( /obj/effect/turf_decal/bot_white/right, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -31314,6 +31444,16 @@ }, /turf/open/floor/plating, /area/station/maintenance/fore) +"loY" = ( +/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/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "lpo" = ( /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 4 @@ -31333,18 +31473,6 @@ /obj/machinery/air_sensor/nitrogen_tank, /turf/open/floor/engine/n2, /area/station/engineering/atmos) -"lpB" = ( -/obj/structure/bodycontainer/morgue{ - dir = 1 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Morgue"; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "lpD" = ( /obj/machinery/biogenerator, /turf/open/floor/plating, @@ -31384,39 +31512,12 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"lqd" = ( -/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) "lqh" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) -"lqC" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/landmark/blobstart, -/obj/machinery/camera/directional/north{ - c_tag = "Security - 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/evidence) "lqL" = ( /obj/effect/turf_decal/siding{ dir = 1 @@ -31434,6 +31535,21 @@ }, /turf/open/floor/iron, /area/station/commons/locker) +"lqW" = ( +/obj/structure/table/optable, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/white, +/area/station/science/robotics/lab) +"lrh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/white/line{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/security/prison) "lro" = ( /obj/structure/showcase/cyborg/old{ dir = 4; @@ -31475,7 +31591,7 @@ /area/station/service/library) "lrR" = ( /obj/machinery/light/directional/south, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 1 }, @@ -31505,20 +31621,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"lsq" = ( -/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, -/area/station/engineering/atmos) "lsu" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate/freezer, @@ -31543,6 +31645,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) +"lsV" = ( +/obj/effect/turf_decal/siding/purple{ + dir = 10 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/west, +/obj/machinery/dna_scannernew, +/turf/open/floor/iron/dark, +/area/station/science/genetics) +"lta" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/meter, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "ltb" = ( /obj/machinery/vending/security, /obj/machinery/firealarm/directional/east, @@ -31567,12 +31686,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) -"ltt" = ( -/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) "ltv" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -31645,6 +31758,24 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) +"lus" = ( +/obj/structure/closet/athletic_mixed, +/obj/effect/landmark/start/hangover/closet, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"luB" = ( +/obj/machinery/computer/department_orders/medical{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) "luE" = ( /obj/structure/rack, /obj/item/integrated_circuit/loaded/hello_world, @@ -31661,11 +31792,12 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central) -"luL" = ( -/obj/effect/landmark/start/assistant, -/obj/structure/chair/comfy/black, -/turf/open/floor/wood, -/area/station/service/library) +"luN" = ( +/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) "luV" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -31703,6 +31835,11 @@ }, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) +"lvY" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/vending/boozeomat/all_access, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) "lvZ" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, @@ -31749,19 +31886,6 @@ }, /turf/open/floor/grass, /area/station/medical/virology) -"lwR" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = 3; - pixel_y = -2 - }, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/science/ordnance) "lxf" = ( /obj/structure/bed, /obj/item/bedsheet/dorms, @@ -31800,23 +31924,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) -"lxw" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) -"lxC" = ( -/obj/item/radio/intercom/directional/south, -/obj/structure/chair/sofa/corp/left{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) "lxM" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -31825,18 +31932,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, /area/station/maintenance/port) -"lxT" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"lyf" = ( -/obj/structure/closet/l3closet, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) "lyu" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -31844,6 +31939,13 @@ }, /turf/open/floor/iron/cafeteria, /area/station/security/prison) +"lyx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/bed/medical/emergency, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "lyF" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -31869,16 +31971,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"lyR" = ( -/obj/structure/table/reinforced, -/obj/structure/displaycase/forsale/kitchen{ - pixel_y = 8 - }, -/obj/machinery/computer/security/telescreen/entertainment/directional/west, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/service/bar) "lzJ" = ( /obj/structure/cable, /turf/open/floor/iron/solarpanel/airless, @@ -31905,15 +31997,6 @@ /obj/item/pen/red, /turf/open/floor/iron/white, /area/station/medical/virology) -"lzV" = ( -/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) "lAe" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/engine, @@ -31952,6 +32035,18 @@ "lAM" = ( /turf/closed/wall/r_wall, /area/station/security/brig) +"lAY" = ( +/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 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/evidence) "lBm" = ( /obj/machinery/conveyor{ dir = 4; @@ -31972,28 +32067,8 @@ /turf/open/floor/iron, /area/station/cargo/sorting) "lBA" = ( -/obj/structure/chair/stool/bar/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, +/turf/open/floor/wood/large, /area/station/commons/lounge) -"lBN" = ( -/obj/structure/table, -/obj/effect/turf_decal/delivery, -/obj/item/clothing/glasses/meson, -/obj/item/clothing/glasses/meson, -/obj/item/clothing/glasses/meson, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/item/storage/belt/utility, -/obj/item/storage/belt/utility, -/obj/item/storage/belt/utility, -/turf/open/floor/iron, -/area/station/engineering/main) "lCb" = ( /obj/structure/cable, /obj/structure/sign/poster/ripped/directional/south, @@ -32025,6 +32100,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"lDj" = ( +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 8 + }, +/obj/structure/closet/l3closet, +/turf/open/floor/iron/white, +/area/station/medical/virology) "lDo" = ( /obj/item/radio/off, /obj/effect/turf_decal/stripes/line{ @@ -32056,7 +32138,6 @@ /turf/open/floor/plating, /area/station/maintenance/port) "lEB" = ( -/obj/effect/landmark/generic_maintenance_landmark, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, @@ -32085,10 +32166,8 @@ }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/computer/order_console/cook{ - dir = 8 - }, /obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/vending/cigarette, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "lFq" = ( @@ -32099,19 +32178,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/commons/vacant_room/office) -"lFV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "lFZ" = ( /obj/structure/chair/pew/right, /turf/open/floor/iron/chapel{ dir = 4 }, /area/station/service/chapel) +"lGj" = ( +/obj/machinery/vending/wardrobe/det_wardrobe, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/grimy, +/area/station/security/detectives_office) "lGL" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, @@ -32129,6 +32206,15 @@ /obj/docking_port/stationary/public_mining_dock, /turf/open/floor/plating, /area/station/construction/mining/aux_base) +"lGT" = ( +/obj/structure/sign/departments/science/directional/east{ + name = "\improper ROBOTICS!" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "lHe" = ( /obj/machinery/reagentgrinder{ pixel_y = 4 @@ -32177,6 +32263,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/spawner/random/entertainment/lighter, /obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, /turf/open/floor/iron, /area/station/service/bar) "lIM" = ( @@ -32241,6 +32330,12 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) +"lJo" = ( +/obj/structure/closet/emcloset, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "lJr" = ( /obj/structure/chair{ dir = 1 @@ -32272,23 +32367,10 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/engine) -"lKJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "lKN" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/engineering/gravity_generator) -"lKS" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Chapel Office - Backroom" - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) "lKZ" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/red{ @@ -32319,18 +32401,6 @@ /obj/structure/curtain, /turf/open/floor/iron/freezer, /area/station/commons/fitness/recreation) -"lLz" = ( -/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, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/main) "lLB" = ( /obj/structure/table/glass, /obj/item/wrench, @@ -32348,6 +32418,14 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) +"lLC" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room) "lLF" = ( /obj/machinery/camera/directional/east{ c_tag = "Central Primary Hallway - Port" @@ -32373,16 +32451,19 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"lMb" = ( -/obj/effect/turf_decal/stripes/line{ +"lMh" = ( +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/trimline/neutral/end, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ dir = 4 }, -/obj/machinery/camera/directional/north{ - c_tag = "Atmospherics - External Airlock" +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) +/area/station/service/chapel/office) "lMq" = ( /turf/open/misc/asteroid/basalt/airless, /area/space/nearstation) @@ -32448,9 +32529,21 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) +"lNh" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Prison Sanitarium" + }, +/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, +/obj/effect/mapping_helpers/airlock/access/all/security/brig, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "lNF" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/landmark/event_spawn, +/obj/effect/landmark/navigate_destination, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) "lNH" = ( @@ -32490,12 +32583,6 @@ /obj/machinery/meter, /turf/open/floor/iron, /area/station/engineering/atmos) -"lOf" = ( -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) "lOg" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -32517,6 +32604,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/genetics) +"lOA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Atmospherics - External Airlock" + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "lOK" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -32534,24 +32631,6 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"lOV" = ( -/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) -"lOY" = ( -/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) "lOZ" = ( /obj/machinery/power/port_gen/pacman/pre_loaded, /turf/open/floor/plating, @@ -32578,12 +32657,6 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/station/security/office) -"lPp" = ( -/obj/structure/closet/wardrobe/grey, -/obj/effect/landmark/start/hangover/closet, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/locker) "lPt" = ( /obj/machinery/door/window/left/directional/north{ dir = 8; @@ -32645,6 +32718,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"lPJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/white/line{ + dir = 6 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron, +/area/station/security/prison) "lPS" = ( /obj/structure/table, /obj/machinery/button/door{ @@ -32726,6 +32807,13 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/science/cytology) +"lSy" = ( +/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, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) "lSz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -32789,23 +32877,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/eva) -"lTP" = ( -/obj/structure/table/glass, -/obj/machinery/light_switch/directional/north, -/obj/machinery/vending/wallmed/directional/west, -/obj/item/storage/secure/briefcase{ - pixel_x = 3; - pixel_y = 5 - }, -/obj/item/storage/medkit/regular{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) "lTR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -32821,12 +32892,15 @@ /area/station/medical/treatment_center) "lTZ" = ( /obj/effect/decal/cleanable/dirt, -/obj/vehicle/sealed/mecha/working/ripley/cargo, +/obj/vehicle/sealed/mecha/ripley/cargo, /turf/open/floor/plating, /area/station/cargo/warehouse) "lUe" = ( /obj/structure/reagent_dispensers/fueltank, /obj/structure/sign/poster/contraband/random/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, /turf/open/floor/plating, /area/station/maintenance/port/fore) "lUj" = ( @@ -32872,10 +32946,10 @@ /turf/open/floor/iron, /area/station/engineering/break_room) "lUD" = ( -/obj/machinery/space_heater, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/effect/spawner/random/structure/chair_flipped, /turf/open/floor/iron/checker, /area/station/maintenance/aft/lesser) "lUI" = ( @@ -32898,14 +32972,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"lUP" = ( -/obj/machinery/button/crematorium{ - id = "crematoriumChapel"; - pixel_x = -26 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) "lUS" = ( /obj/structure/table, /turf/open/floor/plating, @@ -32934,14 +33000,6 @@ }, /turf/open/floor/iron, /area/station/command/gateway) -"lVn" = ( -/obj/structure/bed, -/obj/item/clothing/suit/jacket/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) "lVq" = ( /obj/machinery/light/small/directional/south, /obj/structure/table/wood, @@ -33022,12 +33080,6 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"lWI" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) "lWM" = ( /obj/machinery/camera/directional/east{ c_tag = "Xenobiology Lab - Pen #6"; @@ -33041,6 +33093,12 @@ /obj/structure/sign/warning/vacuum/directional/east, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) +"lWS" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/effect/turf_decal/box, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/iron, +/area/station/science/xenobiology) "lXl" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/bot, @@ -33074,12 +33132,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) -"lXC" = ( -/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) "lXG" = ( /obj/machinery/door/airlock/external/glass{ name = "Supply Door Airlock" @@ -33189,15 +33241,6 @@ }, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) -"lZC" = ( -/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/secondary/exit/departure_lounge) "lZM" = ( /obj/structure/table/wood, /obj/item/reagent_containers/cup/glass/shaker, @@ -33234,13 +33277,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"mav" = ( -/obj/machinery/door/airlock/medical{ - name = "Medical Cold Room" +"mao" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/science/xenobiology) +"mar" = ( +/obj/machinery/computer/camera_advanced/base_construction/aux{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/all/medical/surgery, /turf/open/floor/iron, -/area/station/medical/coldroom) +/area/station/construction/mining/aux_base) "maB" = ( /obj/structure/destructible/cult/item_dispenser/archives/library, /obj/item/clothing/under/suit/red, @@ -33283,6 +33333,20 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"mbt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/reinforced, +/obj/item/storage/box/lights/mixed, +/obj/item/cigbutt/cigarbutt, +/obj/item/flashlight/flare/candle{ + pixel_x = -5 + }, +/obj/item/storage/box/matches{ + pixel_x = 1; + pixel_y = -1 + }, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) "mbC" = ( /obj/structure/rack, /obj/item/electronics/apc, @@ -33322,19 +33386,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/cryo) -"mce" = ( -/obj/machinery/light/directional/north, -/obj/machinery/door/window{ - name = "Secure Art Exhibition"; - req_access = list("library") - }, -/obj/structure/table/wood/fancy/royalblue, -/obj/structure/sign/painting/large/library{ - dir = 1 - }, -/obj/structure/window/spawner/directional/west, -/turf/open/floor/wood, -/area/station/service/library) "mcl" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -33377,12 +33428,6 @@ }, /turf/open/floor/iron/white, /area/station/security/prison/visit) -"mda" = ( -/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) "mdk" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -33397,6 +33442,17 @@ /obj/effect/mapping_helpers/airlock/access/all/science/xenobio, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) +"mdu" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/siding/blue/corner{ + dir = 4 + }, +/obj/machinery/pdapainter/research, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/rd) "mdy" = ( /obj/effect/landmark/blobstart, /obj/structure/cable, @@ -33426,19 +33482,34 @@ /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /turf/open/floor/iron, /area/station/engineering/atmos) -"meu" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/status_display/evac/directional/south, -/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/secondary/exit/departure_lounge) "mez" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /obj/structure/sign/warning/electric_shock, /turf/open/floor/engine, /area/station/science/cytology) +"meJ" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Air to Mix" + }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"meK" = ( +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) "meL" = ( /obj/machinery/light_switch/directional/south, /obj/structure/cable, @@ -33457,6 +33528,36 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/library) +"mgb" = ( +/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/light/directional/south, +/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 = list("shipping") + }, +/obj/structure/plasticflaps/opaque{ + name = "Service Deliveries" + }, +/obj/structure/window/spawner/directional/west, +/turf/open/floor/iron, +/area/station/cargo/storage) "mgc" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -33532,9 +33633,14 @@ /turf/open/floor/iron, /area/station/maintenance/department/science/xenobiology) "mhl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/closed/wall/r_wall, /area/station/service/janitor) +"mhm" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/storage) "mhA" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, @@ -33583,6 +33689,20 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/command/heads_quarters/hop) +"mij" = ( +/obj/machinery/door/airlock/research{ + name = "Research Division Access" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sci-entrance" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/iron/white, +/area/station/science/research) "mil" = ( /obj/structure/table/wood, /obj/machinery/newscaster/directional/east, @@ -33608,6 +33728,21 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"miW" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Command Hallway - Starboard" + }, +/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{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) "miX" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 @@ -33686,7 +33821,6 @@ dir = 4; name = "Gas to Chamber" }, -/obj/structure/sign/delamination_counter/directional/north, /turf/open/floor/engine, /area/station/engineering/supermatter) "mkO" = ( @@ -33698,7 +33832,7 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/pharmacy, /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron/textured, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) "mlu" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -33750,6 +33884,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"mmA" = ( +/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, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white, +/area/station/security/prison) "mmF" = ( /obj/machinery/light/small/directional/east, /obj/item/solar_assembly, @@ -33772,6 +33916,16 @@ /obj/structure/closet/crate/engineering/electrical, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) +"mmK" = ( +/obj/machinery/shower/directional/west, +/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) "mmR" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -33864,14 +34018,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"mnF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/west, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/research) "mnN" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -33881,27 +34027,19 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"mnU" = ( +/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, +/turf/open/floor/iron, +/area/station/security/brig) "mos" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 }, /turf/open/floor/iron, /area/station/service/hydroponics/garden) -"mow" = ( -/obj/structure/table, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) -"moD" = ( -/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/plating, -/area/station/maintenance/port/aft) "moF" = ( /obj/effect/turf_decal/siding/purple{ dir = 5 @@ -33946,39 +34084,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai_upload) -"mpp" = ( -/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 +"mpk" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/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) +"mpw" = ( +/obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/security/lockers) -"mpC" = ( -/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) +/area/station/medical/morgue) "mpJ" = ( /obj/item/radio/intercom/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -34006,6 +34124,15 @@ /obj/machinery/duct, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) +"mqz" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "mqK" = ( /obj/effect/landmark/blobstart, /obj/structure/cable, @@ -34022,6 +34149,13 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) +"mru" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/medical/abandoned) "mrC" = ( /obj/machinery/door/airlock/maintenance{ name = "Hydroponics Maintenance" @@ -34076,6 +34210,26 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/engine, /area/station/engineering/supermatter) +"msC" = ( +/obj/machinery/computer/operating{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) +"msJ" = ( +/obj/structure/table/reinforced, +/obj/item/folder/red, +/obj/structure/cable, +/obj/machinery/requests_console/directional/south{ + department = "Security"; + name = "Security Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/science) "msN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/reagent_dispensers/watertank, @@ -34089,13 +34243,7 @@ "msT" = ( /obj/structure/table, /obj/item/food/mint, -/obj/item/kitchen/rollingpin, -/obj/item/reagent_containers/condiment/enzyme{ - layer = 5 - }, -/obj/item/reagent_containers/cup/beaker{ - pixel_x = 5 - }, +/obj/item/reagent_containers/cup/beaker/large, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) "msW" = ( @@ -34129,6 +34277,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"mtb" = ( +/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) "mtj" = ( /obj/machinery/medical_kiosk, /obj/effect/turf_decal/siding/white, @@ -34138,12 +34296,6 @@ dir = 1 }, /area/station/medical/treatment_center) -"mtm" = ( -/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) "mtu" = ( /turf/open/floor/engine, /area/station/science/xenobiology) @@ -34206,6 +34358,16 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"mun" = ( +/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) "mup" = ( /obj/machinery/door/airlock/maintenance{ name = "Storage Room" @@ -34250,6 +34412,17 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/research) +"muZ" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Departure Lounge - Port Fore" + }, +/obj/item/kirbyplants/organic/plant24, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "mvg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -34258,6 +34431,20 @@ }, /turf/open/floor/carpet, /area/station/service/library) +"mvo" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"mvN" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood/parquet, +/area/station/medical/psychology) "mvR" = ( /turf/closed/wall/r_wall, /area/station/science/lab) @@ -34278,10 +34465,10 @@ }, /obj/item/wrench, /obj/item/multitool, -/obj/machinery/newscaster/directional/south, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 }, +/obj/machinery/incident_display/delam/directional/south, /turf/open/floor/iron/dark, /area/station/command/bridge) "mwj" = ( @@ -34303,6 +34490,13 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/hos) +"mwm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "mww" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -34401,7 +34595,7 @@ dir = 8 }, /obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/holofloor/dark, +/turf/open/floor/iron/dark/textured_large, /area/station/science/cytology) "myB" = ( /obj/structure/chair, @@ -34428,14 +34622,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/security/prison) -"myS" = ( -/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) "myY" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -34480,6 +34666,9 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/broken_floor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plating, /area/station/maintenance/port/fore) "mzu" = ( @@ -34491,11 +34680,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/engine) -"mzD" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced/tinted, -/turf/open/floor/plating, -/area/station/security/prison/safe) "mzI" = ( /obj/machinery/door/airlock/grunge{ name = "Prison Workshop" @@ -34527,17 +34711,6 @@ }, /turf/open/floor/iron/freezer, /area/station/security/prison/shower) -"mAf" = ( -/obj/machinery/holopad, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white/corner, -/area/station/hallway/secondary/entry) "mAm" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ @@ -34547,10 +34720,15 @@ /obj/effect/mapping_helpers/airlock/access/all/security/armory, /turf/open/floor/iron, /area/station/security/brig) +"mAs" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/port) "mAy" = ( -/obj/machinery/computer/order_console/mining, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 8 +/obj/effect/turf_decal/tile/brown{ + dir = 4 }, /turf/open/floor/iron, /area/station/cargo/miningoffice) @@ -34559,28 +34737,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"mAV" = ( -/obj/machinery/rnd/production/techfab/department/service, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 6 - }, -/obj/effect/turf_decal/box, -/obj/structure/extinguisher_cabinet/directional/east, -/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) -"mBb" = ( -/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) "mBf" = ( /obj/structure/table/wood, /obj/machinery/recharger, @@ -34653,6 +34809,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/bridge) +"mBW" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/food/grown/poppy{ + pixel_x = -8; + pixel_y = 7 + }, +/obj/item/food/grown/poppy{ + pixel_y = 2 + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "mCi" = ( /obj/effect/turf_decal/bot_white/left, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -34687,6 +34855,19 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron, /area/station/science/xenobiology) +"mCJ" = ( +/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) "mCL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -34811,6 +34992,18 @@ /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"mEO" = ( +/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) "mES" = ( /obj/structure/rack, /obj/item/aicard, @@ -34892,8 +35085,8 @@ /turf/open/floor/iron/dark/airless, /area/station/science/ordnance/freezerchamber) "mFu" = ( -/obj/structure/bed{ - dir = 4 +/obj/structure/bed/medical/anchored{ + dir = 8 }, /obj/item/bedsheet/medical{ dir = 4 @@ -34930,9 +35123,7 @@ c_tag = "Departure Lounge - Starboard Fore" }, /obj/structure/extinguisher_cabinet/directional/east, -/obj/item/kirbyplants{ - icon_state = "plant-14" - }, +/obj/item/kirbyplants/organic/plant14, /obj/effect/turf_decal/stripes/line{ dir = 4 }, @@ -35034,6 +35225,13 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) +"mIu" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) "mIH" = ( /obj/machinery/status_display/ai/directional/north, /obj/structure/disposalpipe/segment{ @@ -35042,13 +35240,6 @@ /obj/machinery/recharge_station, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) -"mIP" = ( -/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) "mJa" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ dir = 4 @@ -35059,7 +35250,7 @@ /area/station/engineering/atmos) "mJk" = ( /obj/structure/cable, -/obj/structure/table, +/obj/machinery/holopad, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) "mJo" = ( @@ -35075,24 +35266,6 @@ }, /turf/open/floor/iron, /area/station/construction/storage_wing) -"mJp" = ( -/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, -/obj/structure/window/spawner/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "mJE" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -35116,6 +35289,13 @@ "mJI" = ( /turf/open/space, /area/space/nearstation) +"mJL" = ( +/obj/machinery/airalarm/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/commons/dorms) "mJN" = ( /obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/tile/neutral{ @@ -35153,6 +35333,13 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/white, /area/station/science/lab) +"mKf" = ( +/obj/structure/table, +/obj/item/flashlight/flare/candle, +/obj/effect/turf_decal/delivery, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "mKu" = ( /obj/machinery/light_switch/directional/west, /obj/structure/cable, @@ -35164,12 +35351,6 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"mKv" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron/chapel{ - dir = 8 - }, -/area/station/service/chapel) "mKD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/purple/anticorner/contrasted{ @@ -35198,12 +35379,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/research) -"mLv" = ( -/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) "mLx" = ( /obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 8 @@ -35253,15 +35428,35 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/library) -"mLW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +"mMc" = ( +/obj/structure/table, +/obj/item/folder/red, +/obj/item/restraints/handcuffs, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 }, -/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) +/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, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/lockers) "mMl" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -35270,15 +35465,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) -"mMr" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/meter, -/obj/machinery/light/directional/south, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/status_display/evac/directional/south, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "mMu" = ( /obj/machinery/camera/directional/south{ c_tag = "Theater - Backstage" @@ -35297,6 +35483,27 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"mME" = ( +/obj/structure/table, +/obj/item/folder/white{ + pixel_x = 3; + pixel_y = 4 + }, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_x = -4; + pixel_y = 7 + }, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = 7 + }, +/obj/item/reagent_containers/dropper{ + pixel_x = -3; + pixel_y = -6 + }, +/obj/machinery/airalarm/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/science/lab) "mMK" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -35339,6 +35546,12 @@ /obj/machinery/camera/directional/north, /turf/open/floor/iron, /area/station/commons/storage/tools) +"mNx" = ( +/obj/structure/filingcabinet/filingcabinet, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/cargo/sorting) "mNO" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/light_construct/directional/west, @@ -35357,6 +35570,13 @@ /obj/machinery/holopad, /turf/open/floor/iron, /area/station/cargo/storage) +"mOl" = ( +/obj/structure/closet/boxinggloves, +/obj/effect/landmark/start/hangover/closet, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) "mOt" = ( /obj/effect/landmark/start/detective, /obj/structure/chair/office{ @@ -35364,15 +35584,6 @@ }, /turf/open/floor/carpet, /area/station/security/detectives_office) -"mOx" = ( -/obj/structure/table/glass, -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/research) "mOD" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, @@ -35436,11 +35647,6 @@ }, /turf/open/floor/iron, /area/station/construction/storage_wing) -"mPO" = ( -/obj/machinery/vending/boozeomat/all_access, -/obj/effect/decal/cleanable/cobweb, -/turf/closed/wall, -/area/station/maintenance/port/aft) "mPT" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -35455,16 +35661,39 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/deepfryer, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 9 + }, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) -"mQa" = ( -/obj/structure/filingcabinet, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) "mQe" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/station/maintenance/fore) +"mQi" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"mQo" = ( +/obj/structure/table/wood, +/obj/machinery/fax{ + fax_name = "Law Office"; + name = "Law Office Fax Machine" + }, +/obj/machinery/light/small/directional/south, +/obj/machinery/button/door/directional/west{ + id = "lawyer_shutters"; + name = "Privacy Shutters" + }, +/turf/open/floor/wood, +/area/station/service/lawoffice) "mQr" = ( /turf/open/floor/iron/dark/side{ dir = 1 @@ -35539,6 +35768,13 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) +"mRw" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/entry) "mRy" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -35617,23 +35853,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/medical/medbay/lobby) -"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) -"mTs" = ( -/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) "mTy" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, /obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ @@ -35685,27 +35904,11 @@ }, /turf/open/floor/engine, /area/station/engineering/atmospherics_engine) -"mUr" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Gas to Filter" - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter) "mUz" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/brown/filled/line, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"mUD" = ( -/obj/structure/closet/secure_closet/bar/all_access{ - pixel_x = -3; - pixel_y = -1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) "mUF" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -35724,17 +35927,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) -"mVb" = ( -/obj/machinery/defibrillator_mount/directional/south, -/obj/machinery/light/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" - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "mVf" = ( /obj/structure/table/glass, /obj/item/reagent_containers/dropper, @@ -35777,7 +35969,6 @@ /turf/open/floor/plating, /area/station/engineering/atmos) "mVS" = ( -/obj/effect/landmark/generic_maintenance_landmark, /obj/effect/decal/cleanable/cobweb, /obj/effect/spawner/random/trash/janitor_supplies, /turf/open/floor/plating, @@ -35804,14 +35995,6 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/service/bar/backroom) -"mWa" = ( -/obj/machinery/computer/records/medical{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/iron/dark, -/area/station/medical/office) "mWd" = ( /obj/structure/railing{ dir = 4 @@ -35830,6 +36013,29 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"mWC" = ( +/obj/machinery/door/window/right/directional/south{ + name = "First Aid Supplies"; + req_access = list("medical") + }, +/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, +/obj/machinery/light/cold/directional/north, +/obj/structure/window/spawner/directional/west, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "mWE" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -35839,16 +36045,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"mWS" = ( -/obj/machinery/status_display/evac/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Central Primary Hallway - Starboard - Art Storage" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "mWU" = ( /turf/open/floor/iron, /area/station/maintenance/space_hut) @@ -35860,6 +36056,20 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"mWY" = ( +/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/structure/cable, +/obj/machinery/light/small/directional/west, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) "mWZ" = ( /obj/item/folder/red, /obj/item/pen, @@ -35905,6 +36115,15 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"mXn" = ( +/obj/machinery/door/airlock/grunge{ + name = "Morgue" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/medical/general, +/obj/effect/mapping_helpers/airlock/access/all/medical/morgue, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "mXz" = ( /obj/effect/landmark/generic_maintenance_landmark, /obj/effect/turf_decal/stripes/line, @@ -35912,24 +36131,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"mXE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/east, -/obj/effect/mapping_helpers/turn_off_lights_with_lightswitch, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"mXK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "mXX" = ( /obj/structure/table/reinforced, /obj/item/paper_bin{ @@ -35975,21 +36176,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"mYJ" = ( -/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 = list("command") - }, -/turf/open/floor/carpet, -/area/station/command/corporate_showroom) "mYV" = ( /obj/machinery/door/airlock/research{ name = "Ordnance Lab" @@ -36025,6 +36211,17 @@ }, /turf/open/floor/iron/dark, /area/station/security/office) +"mZc" = ( +/obj/structure/table/wood, +/obj/item/clothing/head/costume/sombrero/green, +/obj/structure/sign/poster/random/directional/east, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/landmark/start/hangover, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood/large, +/area/station/service/theater) "mZy" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -36035,6 +36232,27 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"mZz" = ( +/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 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/eva) "mZC" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -36052,7 +36270,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "mZL" = ( -/obj/machinery/modular_computer/console/preset/id, +/obj/machinery/modular_computer/preset/id, /obj/effect/turf_decal/tile/green/anticorner/contrasted{ dir = 1 }, @@ -36091,6 +36309,11 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"nao" = ( +/obj/structure/easel, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "nau" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 4 @@ -36105,23 +36328,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/central) -"naM" = ( -/obj/item/radio/intercom/directional/west{ - pixel_y = -10 - }, -/obj/machinery/light_switch/directional/west{ - pixel_y = 6 - }, -/obj/structure/table/reinforced, -/obj/machinery/fax{ - fax_name = "Engineering Lobby"; - name = "Engineering Lobby Fax Machine" - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) "naN" = ( /obj/machinery/button/door/directional/west{ id = "transitlockdown"; @@ -36157,6 +36363,19 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"ncd" = ( +/obj/item/crowbar, +/obj/item/wrench, +/obj/structure/table, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "ncf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -36196,11 +36415,28 @@ "ncx" = ( /turf/open/floor/iron, /area/station/engineering/main) +"ncB" = ( +/obj/machinery/newscaster/directional/south, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/commons/locker) "ncG" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, /area/station/maintenance/port) +"ncV" = ( +/obj/machinery/vending/coffee, +/obj/structure/sign/map/left{ + desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; + icon_state = "map-left-MS"; + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) "ndk" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -36238,35 +36474,31 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "ndI" = ( -/obj/item/kirbyplants{ - icon_state = "plant-20" - }, +/obj/item/kirbyplants/organic/plant20, /obj/effect/turf_decal/stripes/line{ dir = 9 }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"ndN" = ( +/obj/structure/rack, +/obj/item/poster/random_contraband, +/obj/effect/spawner/random/maintenance, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port) "ndS" = ( /turf/closed/wall/r_wall, /area/station/hallway/secondary/command) -"ndZ" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/small/directional/east, -/obj/item/storage/backpack/duffelbag/med/surgery, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"neA" = ( -/obj/machinery/computer/scan_consolenew{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple{ - dir = 8 +"ner" = ( +/obj/machinery/door/airlock/grunge{ + name = "Morgue" }, -/obj/machinery/light/directional/west, -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/medical/morgue, +/obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/science/genetics) +/area/station/medical/morgue) "neG" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -36301,6 +36533,12 @@ "nfs" = ( /turf/open/floor/engine, /area/station/command/heads_quarters/rd) +"nft" = ( +/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) "nfy" = ( /obj/structure/table, /obj/item/paper_bin, @@ -36417,6 +36655,17 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/rd) +"nht" = ( +/obj/machinery/disposal/bin, +/obj/machinery/firealarm/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) "nhP" = ( /turf/open/floor/circuit/green, /area/station/ai_monitored/turret_protected/ai_upload) @@ -36446,20 +36695,28 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light_switch/directional/east, /obj/effect/mapping_helpers/airlock/access/all/engineering/ce, +/obj/effect/landmark/navigate_destination, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) "niw" = ( /obj/structure/closet/emcloset, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"niG" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/conveyor{ - dir = 9; - id = "garbage" +"niz" = ( +/obj/item/radio/intercom/directional/west, +/obj/structure/bodycontainer/morgue{ + dir = 1 }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) "niY" = ( /obj/structure/disposalpipe/segment, /obj/structure/lattice/catwalk, @@ -36492,7 +36749,7 @@ /area/station/maintenance/port/aft) "njs" = ( /obj/item/stack/cable_coil/five, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/engine/vacuum, /area/space/nearstation) "njB" = ( @@ -36505,19 +36762,6 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"njC" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Bar" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/access/all/service/bar, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/bar) "njE" = ( /obj/structure/chair/office, /turf/open/floor/wood, @@ -36573,18 +36817,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"nkD" = ( -/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) "nkG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /obj/machinery/meter, @@ -36606,31 +36838,6 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/station/security/office) -"nlE" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/directional/south, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/status_display/evac/directional/south, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) -"nlL" = ( -/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/atmos) "nlP" = ( /obj/structure/table, /obj/item/stock_parts/subspace/treatment, @@ -36649,18 +36856,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/research) -"nmb" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/light/small/directional/east, -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 8 - }, -/obj/structure/sign/poster/official/random/directional/east, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner, -/area/station/engineering/storage_shared) "nmf" = ( /obj/machinery/smartfridge, /obj/machinery/door/poddoor/shutters/preopen{ @@ -36687,15 +36882,6 @@ /obj/effect/mapping_helpers/airlock/access/any/command/general, /turf/open/floor/wood, /area/station/command/corporate_showroom) -"nmt" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/machinery/light/directional/north, -/obj/machinery/light_switch/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/teleporter) "nmF" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/plating, @@ -36768,6 +36954,14 @@ /obj/item/reagent_containers/cup/glass/flask/gold, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) +"nnl" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood, +/area/station/service/bar/backroom) "nnn" = ( /obj/structure/chair/office/light{ dir = 8 @@ -36804,6 +36998,16 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"nnR" = ( +/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/central) "noj" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -36811,12 +37015,17 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/science/explab) -"nor" = ( -/obj/structure/sink/directional/east, -/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) +"non" = ( +/obj/machinery/shower/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 10 + }, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/checker, +/area/station/science/research) "nov" = ( /obj/structure/cable, /obj/structure/lattice/catwalk, @@ -36891,15 +37100,16 @@ /obj/structure/window/spawner/directional/east, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"npD" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/rnd/production/circuit_imprinter/department/science, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/west, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/robotics/lab) +"npO" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/item/surgery_tray/full, +/obj/item/clothing/gloves/latex, +/obj/item/clothing/suit/apron/surgical, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) "npY" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -36961,6 +37171,35 @@ }, /turf/open/floor/engine, /area/station/engineering/atmospherics_engine) +"nqV" = ( +/obj/structure/closet/emcloset, +/obj/structure/sign/warning/pods{ + pixel_y = 30 + }, +/obj/effect/landmark/start/hangover/closet, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"nra" = ( +/obj/machinery/newscaster/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Chapel - Fore" + }, +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/food/grown/poppy{ + pixel_y = 11 + }, +/obj/item/book/bible{ + pixel_y = 3 + }, +/obj/item/food/grown/harebell{ + pixel_x = -11; + pixel_y = 2 + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "nre" = ( /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/broken_floor, @@ -36985,11 +37224,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"nrG" = ( -/obj/machinery/light/directional/west, -/obj/machinery/recharge_station, -/turf/open/floor/iron, -/area/station/science/robotics/mechbay) "nrV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /turf/open/floor/iron/dark, @@ -37014,6 +37248,7 @@ /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/medical/cmo, /obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/landmark/navigate_destination, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) "nse" = ( @@ -37119,16 +37354,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) -"nte" = ( -/obj/structure/sign/poster/official/anniversary_vintage_reprint/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "nth" = ( /obj/machinery/door/airlock/research{ name = "Research and Development Lab" @@ -37140,6 +37365,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/science/general, /obj/effect/turf_decal/tile/purple/fourcorners, +/obj/effect/landmark/navigate_destination, /turf/open/floor/iron/white, /area/station/science/lab) "ntk" = ( @@ -37204,6 +37430,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"nue" = ( +/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{ + dir = 4 + }, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) "nui" = ( /obj/effect/turf_decal/stripes/corner, /turf/open/floor/iron/white, @@ -37274,7 +37512,7 @@ /turf/open/floor/iron/dark, /area/station/security/office) "nvI" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/central) @@ -37419,16 +37657,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/command/bridge) -"nxQ" = ( -/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, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron, -/area/station/security/office) "nxU" = ( /obj/machinery/light/small/directional/south, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -37485,6 +37713,13 @@ }, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/entry) +"nyV" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "nyX" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/visible, /obj/effect/spawner/structure/window/reinforced, @@ -37505,20 +37740,32 @@ }, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, +/obj/effect/landmark/navigate_destination, /turf/open/floor/plating, /area/station/cargo/drone_bay) -"nzh" = ( -/obj/structure/table/optable, -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) "nzo" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 4 }, /turf/open/floor/iron, /area/station/engineering/atmos) +"nzz" = ( +/obj/structure/rack, +/obj/effect/spawner/random/clothing/costume, +/obj/effect/spawner/random/clothing/costume, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) +"nzD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"nzN" = ( +/obj/effect/landmark/navigate_destination, +/turf/closed/wall/r_wall, +/area/station/engineering/storage/tech) "nzP" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 10 @@ -37526,8 +37773,8 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "nzQ" = ( -/obj/structure/bed{ - dir = 4 +/obj/structure/bed/medical/anchored{ + dir = 8 }, /obj/item/bedsheet/medical{ dir = 4 @@ -37548,18 +37795,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/engineering/atmos) -"nAi" = ( -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/light/small/directional/north, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/iron, -/area/station/science/xenobiology) "nAC" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -37582,6 +37817,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/prison/safe) +"nAW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/landmark/start/hangover, +/obj/machinery/light/small/directional/south, +/turf/open/floor/carpet, +/area/station/commons/dorms) "nBa" = ( /obj/structure/cable, /turf/open/floor/iron/solarpanel/airless, @@ -37643,11 +37886,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/iron/white, /area/station/medical/virology) -"nBU" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "nCa" = ( /obj/machinery/meter/layer2, /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible/layer2{ @@ -37668,6 +37906,10 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/surgery/aft) +"nCr" = ( +/obj/machinery/status_display/ai/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "nCu" = ( /obj/structure/chair/office{ dir = 1 @@ -37688,7 +37930,7 @@ /turf/open/floor/plating, /area/station/maintenance/port/aft) "nCB" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 8 }, /obj/machinery/light/small/directional/east, @@ -37701,11 +37943,31 @@ /obj/effect/mapping_helpers/requests_console/assistance, /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) +"nCG" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Science Ordnance Test Lab"; + network = list("ss13","rd") + }, +/obj/effect/turf_decal/siding/purple{ + dir = 6 + }, +/turf/open/floor/iron/white, +/area/station/science/ordnance/testlab) "nCI" = ( /obj/structure/chair/stool/directional/west, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/security/prison) +"nCL" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "nCQ" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible{ dir = 4 @@ -37725,6 +37987,10 @@ }, /turf/open/floor/iron/dark, /area/station/security/office) +"nDr" = ( +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) "nDw" = ( /obj/machinery/atmospherics/components/tank, /obj/effect/turf_decal/siding/purple{ @@ -37788,14 +38054,34 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/obj/structure/chair/stool/directional/east, +/obj/machinery/computer/order_console/cook{ + dir = 4 + }, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) +"nEB" = ( +/obj/structure/sign/poster/random/directional/east, +/obj/machinery/requests_console/directional/south{ + department = "Kitchen"; + name = "Kitchen Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/chem_master/condimaster{ + name = "CondiMaster Neo" + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "nEC" = ( /turf/open/floor/carpet, /area/station/command/bridge) "nEF" = ( -/obj/structure/bed, +/obj/structure/bed/medical/anchored{ + dir = 4 + }, /obj/item/clothing/suit/jacket/straight_jacket, /obj/item/clothing/glasses/blindfold, /obj/item/clothing/mask/muzzle, @@ -37803,16 +38089,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/execution/education) -"nEL" = ( -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 4 +"nET" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 }, -/obj/item/pen, -/obj/structure/table/wood, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) +/obj/machinery/portable_atmospherics/canister, +/obj/effect/turf_decal/box, +/turf/open/floor/iron, +/area/station/science/xenobiology) "nEZ" = ( /obj/machinery/plate_press, /obj/effect/turf_decal/bot, @@ -37841,6 +38125,12 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) +"nGd" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white/smooth_large, +/area/station/medical/medbay/central) "nGp" = ( /obj/structure/table, /obj/effect/spawner/random/entertainment/dice, @@ -37883,6 +38173,18 @@ }, /turf/open/floor/iron, /area/station/security/office) +"nGA" = ( +/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 + }, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "nGE" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -37900,13 +38202,6 @@ /obj/structure/chair/stool/directional/east, /turf/open/floor/wood, /area/station/commons/lounge) -"nHn" = ( -/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) "nHB" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -37918,17 +38213,9 @@ /obj/structure/chair/office/light{ dir = 8 }, +/obj/effect/turf_decal/siding/purple/corner, /turf/open/floor/iron/white, /area/station/science/cytology) -"nHK" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "nIj" = ( /obj/structure/easel, /turf/open/floor/plating, @@ -38012,11 +38299,23 @@ /turf/open/floor/iron/white, /area/station/science/robotics/lab) "nJL" = ( -/obj/structure/closet, -/obj/effect/spawner/random/maintenance/two, /obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/machinery/atmospherics/components/tank/air, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) +"nJM" = ( +/obj/effect/turf_decal/bot, +/obj/structure/rack, +/obj/item/mod/module/plasma_stabilizer, +/obj/item/mod/module/thermal_regulator, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/engineering/storage_shared) "nJW" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -38045,9 +38344,7 @@ /turf/open/floor/iron/white, /area/station/medical/treatment_center) "nKG" = ( -/obj/item/kirbyplants{ - icon_state = "plant-05" - }, +/obj/item/kirbyplants/organic/plant5, /obj/effect/turf_decal/stripes/line{ dir = 10 }, @@ -38064,6 +38361,13 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) +"nKM" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "nKO" = ( /obj/structure/toilet{ dir = 4 @@ -38135,6 +38439,9 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/item/storage/toolbox/emergency, /obj/effect/spawner/random/maintenance, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, /turf/open/floor/plating, /area/station/maintenance/port/fore) "nMF" = ( @@ -38150,6 +38457,12 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/service/hydroponics/garden) +"nMP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "nMV" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -38242,20 +38555,13 @@ }, /turf/open/floor/iron, /area/station/commons/locker) -"nOl" = ( -/obj/machinery/light/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Departure Lounge - Port Fore" - }, -/obj/item/kirbyplants{ - icon_state = "plant-24" - }, -/obj/effect/turf_decal/stripes/line{ +"nOj" = ( +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/structure/sign/poster/official/random/directional/west, +/obj/machinery/status_display/evac/directional/west, /turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) +/area/station/hallway/primary/central) "nOp" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 6 @@ -38286,17 +38592,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"nOz" = ( -/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) "nOK" = ( /obj/effect/turf_decal/stripes/white/line, /obj/effect/turf_decal/stripes/white/line{ @@ -38387,6 +38682,17 @@ }, /turf/open/floor/iron/dark, /area/station/security/range) +"nQQ" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 10 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light/no_nightlight/directional/east, +/turf/open/floor/iron/dark/corner, +/area/station/engineering/atmos/pumproom) "nQX" = ( /turf/open/floor/iron/white, /area/station/science/robotics/lab) @@ -38434,11 +38740,17 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) -"nRR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) +"nRU" = ( +/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/dark_blue{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "nRZ" = ( /turf/closed/wall/r_wall, /area/station/security/medical) @@ -38466,14 +38778,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) -"nSC" = ( -/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) "nTd" = ( /obj/structure/rack, /obj/effect/spawner/random/food_or_drink/seed, @@ -38483,6 +38787,11 @@ /obj/item/food/grown/mushroom/glowshroom, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"nTk" = ( +/obj/structure/flora/bush/jungle/c/style_random, +/obj/machinery/light/small/directional/east, +/turf/open/floor/grass, +/area/station/medical/virology) "nTn" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -38492,15 +38801,6 @@ /obj/structure/sign/poster/contraband/random/directional/north, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"nTs" = ( -/obj/machinery/light/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/blue/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "nTA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, /turf/open/floor/iron/dark, @@ -38513,14 +38813,6 @@ /obj/effect/turf_decal/trimline/dark_red/filled/line, /turf/open/floor/iron, /area/station/security/warden) -"nTK" = ( -/obj/machinery/newscaster/directional/south, -/obj/machinery/light/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Courtroom - Gallery" - }, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) "nTP" = ( /obj/machinery/door/airlock/maintenance{ name = "Brig Maintenance" @@ -38535,7 +38827,6 @@ /turf/open/floor/plating, /area/station/maintenance/port/fore) "nTU" = ( -/obj/effect/landmark/generic_maintenance_landmark, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, @@ -38546,10 +38837,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"nUt" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "nUF" = ( /obj/structure/closet/secure_closet/security/sec, /obj/structure/cable, @@ -38587,18 +38874,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"nVH" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Recreation Area - Fore" - }, -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "nVJ" = ( /obj/structure/table/glass, /obj/item/reagent_containers/chem_pack{ @@ -38697,11 +38972,6 @@ /obj/effect/spawner/random/entertainment/deck, /turf/open/floor/wood, /area/station/maintenance/port/aft) -"nXT" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/easel, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "nYa" = ( /obj/machinery/door/airlock/research{ name = "Ordnance Lab" @@ -38723,6 +38993,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) +"nYy" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/closet/secure_closet/freezer/kitchen/maintenance, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "nYJ" = ( /obj/structure/lattice, /obj/structure/grille/broken, @@ -38785,6 +39061,17 @@ /obj/effect/turf_decal/box, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) +"nZq" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/station/service/library) +"nZt" = ( +/obj/structure/closet/secure_closet/engineering_personal, +/obj/item/clothing/suit/hooded/wintercoat/engineering, +/obj/effect/turf_decal/delivery, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/engineering/main) "nZz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -38808,28 +39095,22 @@ /area/station/service/library) "nZL" = ( /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_ordmix{ - dir = 4 + dir = 8 }, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) -"nZZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 +"nZQ" = ( +/obj/machinery/airalarm/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/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/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 }, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) +/turf/open/floor/iron, +/area/station/cargo/sorting) "oae" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, @@ -38888,6 +39169,7 @@ }, /obj/effect/turf_decal/tile/blue/fourcorners, /obj/structure/window/reinforced/spawner/directional/west, +/obj/machinery/light/small/directional/east, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) "oar" = ( @@ -39029,12 +39311,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"oca" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/closet_maintenance, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating, -/area/station/maintenance/port) "ocg" = ( /obj/structure/extinguisher_cabinet/directional/south, /obj/structure/cable, @@ -39053,6 +39329,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/office) +"ocn" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"ocB" = ( +/obj/structure/table/wood, +/obj/machinery/microwave{ + pixel_x = 1; + pixel_y = 6 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/cafeteria) "ocC" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39079,15 +39370,36 @@ dir = 4 }, /area/station/security/prison) -"ocL" = ( -/obj/structure/chair/stool/directional/south, -/obj/item/radio/intercom/prison/directional/north, -/turf/open/floor/iron, -/area/station/security/prison) +"ocN" = ( +/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 + }, +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/virology) "ocP" = ( /obj/machinery/airalarm/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"ocQ" = ( +/obj/machinery/chem_heater/withbuffer, +/obj/machinery/light/small/directional/south, +/obj/machinery/button/door/directional/south{ + id = "pharmacy_shutters_2"; + name = "pharmacy shutters control"; + req_access = list("pharmacy") + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) "odh" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -39125,19 +39437,6 @@ /obj/effect/mapping_helpers/airlock/access/all/service/hydroponics, /turf/open/floor/iron, /area/station/service/hydroponics) -"odP" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) -"odW" = ( -/obj/effect/decal/cleanable/dirt, -/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) "oet" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 @@ -39155,20 +39454,6 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) -"ofc" = ( -/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) "ofe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, @@ -39187,6 +39472,21 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/main) +"ofm" = ( +/obj/structure/table, +/obj/structure/cable, +/obj/item/disk/tech_disk{ + pixel_x = -6 + }, +/obj/item/disk/tech_disk{ + pixel_x = 6 + }, +/obj/item/disk/tech_disk{ + pixel_y = 6 + }, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/iron, +/area/station/science/lab) "ofQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, @@ -39203,21 +39503,18 @@ /obj/effect/mapping_helpers/airlock/access/all/security/armory, /turf/open/floor/iron/dark, /area/station/security/lockers) -"ofZ" = ( -/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) "ogb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/window/spawner/directional/west, /turf/open/floor/carpet, /area/station/service/theater) +"ogk" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/machinery/light_switch/directional/south, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "ogL" = ( /obj/structure/mirror/directional/north, /obj/structure/sink/directional/south, @@ -39227,14 +39524,6 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/captain/private) -"ohf" = ( -/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) "ohm" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -39242,31 +39531,26 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"ohw" = ( -/obj/machinery/light/small/directional/east, +"oho" = ( /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/structure/disposalpipe/segment{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) +/turf/open/floor/iron/white, +/area/station/medical/abandoned) "ohD" = ( /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 = list("xenobiology") - }, /obj/machinery/door/poddoor/preopen{ id = "xenobio6"; name = "Xenobio Pen 6 Blast Door" }, +/obj/machinery/door/window/right/directional/west{ + name = "Containment Pen #6"; + req_access = list("xenobiology") + }, /turf/open/floor/iron, /area/station/science/xenobiology) "ohE" = ( @@ -39297,6 +39581,36 @@ /obj/effect/turf_decal/tile/green/fourcorners, /turf/open/floor/iron/showroomfloor, /area/station/maintenance/starboard/lesser) +"ohZ" = ( +/obj/machinery/suit_storage_unit/rd, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Research Director's Office"; + network = list("ss13","rd") + }, +/obj/item/radio/intercom/directional/west, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/command/heads_quarters/rd) +"oic" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/skub{ + name = "medicinal skub" + }, +/obj/item/toy/cattoy, +/turf/open/floor/plating, +/area/station/medical/abandoned) +"oif" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "oip" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, @@ -39311,13 +39625,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/genetics) -"oiD" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/carpet, -/area/station/commons/dorms) "oiI" = ( /obj/machinery/air_sensor/nitrous_tank, /turf/open/floor/engine/n2o, @@ -39347,6 +39654,12 @@ }, /turf/open/floor/engine/plasma, /area/station/engineering/atmos) +"okd" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "okP" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -39458,42 +39771,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/foyer) -"omJ" = ( -/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) -"omP" = ( -/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/machinery/requests_console/directional/west{ - department = "Atmospherics"; - name = "Atmospherics Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos/storage/gas) "onf" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, @@ -39503,16 +39780,13 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) -"onp" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) +"onv" = ( +/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/medical/medbay/central) "onD" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -39549,6 +39823,12 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"onN" = ( +/obj/structure/table/wood, +/obj/structure/sign/poster/official/random/directional/south, +/obj/effect/spawner/random/bureaucracy/paper, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) "onU" = ( /mob/living/basic/chicken{ name = "Kentucky"; @@ -39612,13 +39892,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"opa" = ( -/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) "oph" = ( /obj/structure/chair/wood/wings{ dir = 8 @@ -39653,9 +39926,7 @@ /turf/open/floor/engine/n2, /area/station/engineering/atmos) "oqc" = ( -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, +/obj/effect/spawner/random/structure/table, /turf/open/floor/iron/checker, /area/station/maintenance/aft/lesser) "oqe" = ( @@ -39716,6 +39987,11 @@ /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, /area/station/cargo/sorting) +"orp" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/commons/locker) "orv" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -39745,21 +40021,6 @@ }, /turf/open/floor/carpet, /area/station/command/corporate_showroom) -"orC" = ( -/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{ - pixel_x = -5; - pixel_y = 5 - }, -/obj/item/stack/cable_coil, -/obj/structure/sign/poster/random/directional/east, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "orT" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /turf/open/floor/iron/dark, @@ -39796,34 +40057,6 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/space, /area/space/nearstation) -"osC" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line, -/obj/structure/disposalpipe/trunk, -/obj/structure/cable, -/obj/machinery/light/small/directional/east, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/iron, -/area/station/science/robotics/lab) -"osD" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"osM" = ( -/obj/machinery/shower/directional/south{ - name = "emergency shower" - }, -/obj/effect/turf_decal/trimline/blue/end, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "ota" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39876,15 +40109,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"otk" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/iron/cafeteria, -/area/station/security/prison) "otn" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -39902,6 +40126,15 @@ /obj/structure/window/spawner/directional/north, /turf/open/floor/grass, /area/station/service/hydroponics/garden) +"otI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/holopad, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "otM" = ( /obj/structure/closet/crate, /obj/item/stack/license_plates/empty/fifty, @@ -39931,11 +40164,15 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, -/turf/open/floor/holofloor/dark, +/obj/item/plunger{ + pixel_x = -7; + pixel_y = 20 + }, +/turf/open/floor/iron/dark/textured_large, /area/station/science/cytology) "ouj" = ( -/obj/structure/bed/roller, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, +/obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, /obj/machinery/iv_drip, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -39957,14 +40194,6 @@ /obj/effect/turf_decal/tile/bar, /turf/open/floor/iron, /area/station/hallway/primary/central) -"oum" = ( -/obj/item/flashlight/flare/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) "out" = ( /obj/structure/lattice, /obj/item/reagent_containers/cup/glass/bottle/goldschlager, @@ -40020,15 +40249,6 @@ }, /turf/open/floor/iron, /area/station/security/warden) -"ouV" = ( -/obj/structure/sign/warning/fire/directional/east, -/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) "ouX" = ( /obj/effect/turf_decal/box, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -40037,6 +40257,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"ouY" = ( +/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, +/obj/machinery/mining_weather_monitor/directional/east, +/turf/open/floor/iron, +/area/station/construction/mining/aux_base) "ouZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/siding/purple{ @@ -40073,39 +40304,8 @@ /obj/structure/closet/secure_closet/hop, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) -"ovL" = ( -/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/work) -"ovV" = ( -/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"; - name = "Security Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "ovX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) "owf" = ( @@ -40174,6 +40374,10 @@ /obj/item/reagent_containers/cup/beaker/large, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"oxj" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/medical/abandoned) "oxk" = ( /obj/machinery/door/window/right/directional/south{ dir = 4; @@ -40190,6 +40394,16 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"oxR" = ( +/obj/structure/table, +/obj/item/pipe_dispenser{ + pixel_x = 3; + pixel_y = 7 + }, +/obj/item/pipe_dispenser, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/science/ordnance) "oxT" = ( /obj/structure/table/wood, /obj/structure/cable, @@ -40236,20 +40450,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"ozi" = ( +"oyY" = ( /obj/machinery/disposal/bin, -/obj/machinery/camera/directional/east{ - c_tag = "Garden" - }, /obj/structure/disposalpipe/trunk{ - dir = 8 + dir = 4 }, -/obj/machinery/light/directional/east, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/light/directional/west, /turf/open/floor/iron, -/area/station/service/hydroponics/garden) +/area/station/service/bar) "ozm" = ( /obj/effect/turf_decal/siding/purple{ dir = 1 @@ -40266,21 +40476,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) -"ozB" = ( -/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) "ozX" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -40292,19 +40487,9 @@ /area/station/hallway/primary/central) "oAa" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/item/kirbyplants{ - icon_state = "plant-14" - }, +/obj/item/kirbyplants/organic/plant14, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) -"oAj" = ( -/obj/structure/chair/sofa/corp/left, -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) "oAu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40330,6 +40515,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/space, /area/space/nearstation) +"oBn" = ( +/obj/structure/flora/bush/jungle/b/style_random, +/obj/structure/flora/bush/flowers_pp/style_random, +/obj/machinery/light/small/directional/east, +/turf/open/floor/grass, +/area/station/medical/virology) "oBq" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/disposalpipe/segment, @@ -40344,6 +40535,14 @@ "oBz" = ( /turf/closed/wall, /area/station/security/checkpoint/science) +"oBA" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/food_or_drink/booze{ + spawn_random_offset = 1 + }, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) "oBD" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -40379,11 +40578,6 @@ /obj/item/radio/intercom/chapel/directional/west, /turf/open/floor/iron/dark, /area/station/service/chapel/office) -"oCw" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) "oCE" = ( /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/grass, @@ -40498,13 +40692,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) -"oEt" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 10 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white, -/area/station/security/prison) "oEu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40515,6 +40702,24 @@ /obj/effect/spawner/random/trash/garbage, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) +"oED" = ( +/obj/structure/rack, +/obj/item/reagent_containers/cup/bottle/ethanol{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/bottle/carbon{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/bottle/chlorine{ + pixel_x = 1 + }, +/obj/machinery/light/cold/dim/directional/east, +/turf/open/floor/iron/dark/textured_edge{ + dir = 8 + }, +/area/station/medical/chem_storage) "oEM" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -40549,26 +40754,30 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"oFn" = ( -/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) "oFt" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/orange/hidden, /turf/open/floor/iron/stairs/medium{ dir = 8 }, /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/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 = list("brig_entrance") + }, +/obj/item/folder/red{ + pixel_x = 4; + pixel_y = 2 + }, +/obj/item/paper, +/obj/item/pen, +/turf/open/floor/plating, +/area/station/security/checkpoint/medical) "oFH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -40733,6 +40942,17 @@ }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) +"oHJ" = ( +/obj/structure/closet/secure_closet/security/sec, +/obj/machinery/airalarm/directional/north, +/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) "oHO" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance, @@ -40760,6 +40980,15 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"oIO" = ( +/obj/machinery/computer/security/telescreen/interrogation{ + dir = 8; + pixel_x = 30 + }, +/obj/effect/turf_decal/trimline/red/filled/corner, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/security/brig) "oIW" = ( /obj/structure/sign/warning/vacuum/directional/east, /obj/effect/turf_decal/delivery, @@ -40876,34 +41105,20 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/tcommsat/computer) -"oKD" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/disposaloutlet{ - dir = 8 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "oKI" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"oKO" = ( -/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 +"oKM" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/cmo) +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "oKU" = ( /turf/open/floor/circuit/green/telecomms/mainframe, /area/station/tcommsat/server) @@ -40934,6 +41149,15 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"oLL" = ( +/obj/item/storage/secure/safe/hos{ + pixel_x = 36; + pixel_y = 28 + }, +/obj/machinery/status_display/evac/directional/north, +/obj/structure/cable, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hos) "oLS" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance/testlab) @@ -40977,15 +41201,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"oNf" = ( -/obj/structure/rack, -/obj/effect/spawner/random/clothing/costume, -/obj/item/clothing/mask/balaclava, -/obj/machinery/airalarm/directional/east, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/commons/locker) "oNl" = ( /obj/machinery/holopad, /turf/open/floor/iron, @@ -40993,15 +41208,17 @@ "oNs" = ( /turf/open/floor/engine, /area/station/engineering/supermatter) -"oND" = ( -/obj/structure/sign/departments/chemistry/pharmacy/directional/west, -/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 = 8 +"oNy" = ( +/obj/machinery/smartfridge/chemistry/preloaded, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "chem_lockdown"; + name = "Chemistry Shutters" }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/yellow/full, +/turf/open/floor/iron/white/smooth_large, +/area/station/medical/chemistry) "oNP" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -41013,6 +41230,15 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/circuit/green, /area/station/ai_monitored/turret_protected/ai_upload) +"oOz" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_x = 1; + pixel_y = 5 + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) "oOB" = ( /obj/structure/table, /obj/effect/turf_decal/siding{ @@ -41031,18 +41257,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) -"oOO" = ( -/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) "oOU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -41155,11 +41369,11 @@ /turf/open/floor/iron, /area/station/hallway/primary/fore) "oQk" = ( -/obj/effect/turf_decal/box/corners, -/obj/effect/turf_decal/box/corners{ - dir = 8 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/floor/holofloor/dark, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/textured_large, /area/station/science/cytology) "oQx" = ( /obj/effect/decal/cleanable/dirt, @@ -41180,6 +41394,13 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron, /area/station/science/xenobiology) +"oQN" = ( +/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/smooth_large, +/area/station/service/chapel/office) "oQS" = ( /obj/machinery/cell_charger, /obj/item/stock_parts/cell/crap, @@ -41222,16 +41443,24 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/storage) -"oRT" = ( -/obj/machinery/light/directional/south, -/obj/machinery/computer/security/telescreen/minisat{ - dir = 1; - pixel_y = -29 +"oRV" = ( +/obj/structure/table, +/obj/machinery/newscaster/directional/east, +/obj/machinery/camera/directional/south{ + c_tag = "Departure Lounge - Security Post" }, -/obj/structure/bed/dogbed/renault, -/mob/living/simple_animal/pet/fox/renault, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) +/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, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "oSc" = ( /obj/structure/closet/toolcloset, /obj/effect/turf_decal/tile/yellow/half/contrasted{ @@ -41246,14 +41475,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/execution/education) -"oSh" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "oSo" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -41348,9 +41569,9 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "oUB" = ( -/obj/machinery/status_display/evac/directional/north, /obj/effect/turf_decal/bot, /obj/effect/landmark/start/hangover, +/obj/machinery/digital_clock/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/command) "oUE" = ( @@ -41360,6 +41581,13 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/white, /area/station/security/prison/mess) +"oUK" = ( +/obj/structure/table, +/obj/item/electronics/apc, +/obj/item/electronics/airlock, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "oUU" = ( /obj/structure/weightmachine/weightlifter, /obj/structure/cable, @@ -41379,6 +41607,16 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"oVL" = ( +/obj/structure/table, +/obj/item/folder, +/obj/item/pen, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/photo_album/prison, +/obj/item/camera, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/security/prison) "oVY" = ( /obj/structure/chair{ dir = 8; @@ -41396,6 +41634,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/landmark/navigate_destination, /turf/open/floor/iron/white, /area/station/science/xenobiology) "oWc" = ( @@ -41418,6 +41657,16 @@ }, /turf/open/floor/wood, /area/station/service/bar/backroom) +"oWQ" = ( +/obj/structure/rack, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/stack/sheet/iron/twenty, +/obj/structure/sign/poster/contraband/random/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) "oWT" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command{ @@ -41481,14 +41730,6 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/dark, /area/station/security/office) -"oXM" = ( -/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) "oXR" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -41498,27 +41739,6 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/fore) -"oXT" = ( -/obj/machinery/button/door/directional/north{ - id = "hop"; - name = "Privacy Shutters Control"; - req_access = list("kitchen") - }, -/obj/machinery/computer/accounting, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) -"oYd" = ( -/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) "oYg" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -41529,18 +41749,6 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/fore) -"oYn" = ( -/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" - }, -/turf/open/floor/iron, -/area/station/security/brig) "oYp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -41558,6 +41766,29 @@ /obj/machinery/light/small/red/directional/west, /turf/open/floor/plating/airless, /area/space/nearstation) +"oYv" = ( +/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 + }, +/obj/item/pillow/random, +/turf/open/floor/carpet, +/area/station/commons/dorms) +"oYz" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Cargo Bay - Mailroom" + }, +/obj/effect/turf_decal/trimline/brown/filled/shrink_ccw, +/obj/effect/turf_decal/trimline/white/filled/warning, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/cargo/sorting) "oYM" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/tile/yellow/half/contrasted{ @@ -41568,16 +41799,6 @@ "oYZ" = ( /turf/closed/wall, /area/station/command/heads_quarters/rd) -"oZi" = ( -/obj/effect/spawner/random/vending/snackvend, -/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/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) "oZj" = ( /obj/structure/table/wood, /obj/item/storage/photo_album/library, @@ -41588,7 +41809,9 @@ /turf/open/floor/engine/cult, /area/station/service/library) "oZs" = ( -/obj/structure/bed, +/obj/structure/bed/medical/emergency{ + dir = 4 + }, /obj/effect/decal/cleanable/blood/gibs/old, /obj/effect/decal/cleanable/blood/old, /obj/effect/turf_decal/tile/green/fourcorners, @@ -41638,13 +41861,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall/r_wall, /area/station/ai_monitored/aisat/exterior) -"pap" = ( -/obj/machinery/vending/wardrobe/coroner_wardrobe, -/obj/effect/turf_decal/trimline/neutral/filled/warning{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "pav" = ( /obj/structure/chair/stool/directional/west, /obj/machinery/camera/directional/north{ @@ -41656,11 +41872,13 @@ }, /turf/open/floor/iron, /area/station/security/brig) -"paQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) +"pbb" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/science/research) "pbf" = ( /obj/effect/turf_decal/siding/blue/corner{ dir = 1 @@ -41692,14 +41910,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/white/side, /area/station/medical/medbay/lobby) -"pbQ" = ( -/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) "pbS" = ( /obj/structure/rack, /obj/item/clothing/suit/hazardvest, @@ -41742,12 +41952,6 @@ /obj/structure/table/wood, /turf/open/floor/iron/dark, /area/station/service/chapel) -"pcH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/obj/structure/closet/radiation, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "pcM" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -41889,19 +42093,18 @@ /obj/structure/cable/layer3, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/foyer) -"pfK" = ( -/obj/machinery/light/directional/north, -/obj/structure/table, -/obj/item/clothing/gloves/latex, -/obj/item/clothing/gloves/latex, -/obj/item/clothing/mask/surgical, -/obj/item/clothing/mask/surgical, -/obj/item/reagent_containers/spray/cleaner{ - pixel_x = -10; - pixel_y = -1 +"pfs" = ( +/obj/structure/closet/secure_closet{ + name = "contraband locker"; + req_access = list("armory") }, -/turf/open/floor/iron/white, -/area/station/science/robotics/lab) +/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) "pfP" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/light_switch/directional/south, @@ -41935,13 +42138,6 @@ /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"pgI" = ( -/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) "pgJ" = ( /obj/structure/chair/stool/directional/north, /obj/machinery/camera/directional/west{ @@ -41952,8 +42148,8 @@ "pgK" = ( /obj/structure/table, /obj/structure/cable, -/obj/machinery/reagentgrinder{ - pixel_x = 6; +/obj/item/book/manual/chef_recipes{ + pixel_x = 2; pixel_y = 6 }, /turf/open/floor/iron/cafeteria, @@ -41967,13 +42163,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"pgP" = ( -/obj/machinery/stasis, -/obj/machinery/defibrillator_mount/directional/north, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "pgU" = ( /obj/structure/chair{ dir = 4 @@ -42006,6 +42195,18 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central) +"phJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/camera/directional/south{ + c_tag = "Engineering - Desk" + }, +/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) "phN" = ( /obj/machinery/camera/directional/west{ c_tag = "AI Chamber - Port"; @@ -42045,6 +42246,19 @@ }, /turf/open/floor/iron, /area/station/command/gateway) +"piv" = ( +/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, +/obj/machinery/light/no_nightlight/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos) "piw" = ( /obj/effect/landmark/start/cyborg, /obj/machinery/holopad/secure, @@ -42067,16 +42281,14 @@ "piB" = ( /turf/open/floor/iron, /area/station/cargo/sorting) -"piC" = ( -/obj/machinery/status_display/evac/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ +"piJ" = ( +/obj/machinery/suit_storage_unit/medical, +/obj/effect/turf_decal/bot_red, +/obj/effect/turf_decal/siding/white{ dir = 8 }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) +/turf/open/floor/iron/dark, +/area/station/medical/storage) "piM" = ( /obj/structure/rack, /obj/item/clothing/under/color/red, @@ -42102,13 +42314,7 @@ /turf/open/floor/iron/dark/textured_edge{ dir = 8 }, -/area/station/medical/medbay/central) -"pjb" = ( -/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) +/area/station/medical/chem_storage) "pjd" = ( /turf/open/floor/plating, /area/station/commons/fitness/recreation) @@ -42134,10 +42340,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) -"pjX" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "pke" = ( /obj/effect/turf_decal/siding/red{ dir = 6 @@ -42146,6 +42348,15 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron, /area/station/security/checkpoint/science) +"pkx" = ( +/obj/machinery/modular_computer/preset/research{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/rd) "pkH" = ( /obj/structure/rack, /obj/item/restraints/handcuffs, @@ -42187,26 +42398,6 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) -"plu" = ( -/obj/effect/decal/cleanable/dirt, -/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) -"plw" = ( -/obj/machinery/light/directional/south, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) "plD" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 4; @@ -42217,6 +42408,26 @@ "pma" = ( /turf/closed/wall/r_wall, /area/station/maintenance/solars/port/fore) +"pmb" = ( +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/obj/machinery/portable_atmospherics/canister/anesthetic_mix, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/machinery/light/cold/dim/directional/south, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/kitchen_coldroom, +/area/station/medical/coldroom) +"pmc" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/landmark/start/chaplain, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark/smooth_large, +/area/station/service/chapel/office) "pmj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, @@ -42237,32 +42448,32 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) -"pmw" = ( -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "pmA" = ( -/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/smartfridge/food, /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/effect/turf_decal/siding/wood{ - dir = 8 + dir = 1 }, /obj/machinery/door/poddoor/shutters/preopen{ dir = 1; id = "kitchen_counter"; name = "Kitchen Counter Shutters" }, -/obj/machinery/door/firedoor, -/obj/item/holosign_creator/robot_seat/restaurant, /turf/open/floor/iron, /area/station/service/kitchen) "pmK" = ( /obj/effect/landmark/start/mime, /turf/open/floor/carpet, /area/station/service/theater) +"pmW" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/status_display/evac/directional/south, +/obj/machinery/light/small/directional/south, +/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/secondary/exit/departure_lounge) "pmZ" = ( /obj/machinery/light_switch/directional/west{ pixel_y = 26 @@ -42274,6 +42485,11 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 }, +/obj/structure/rack, +/obj/item/hand_labeler, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/holosign_creator/robot_seat/restaurant, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) "pnk" = ( @@ -42368,27 +42584,38 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/genetics) +"ppm" = ( +/obj/structure/cable, +/obj/machinery/computer/security/telescreen/interrogation{ + name = "isolation room monitor"; + network = list("isolation"); + pixel_y = 31 + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "ppB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/station/command/bridge) "ppC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, +/obj/machinery/hydroponics/soil, +/turf/open/floor/grass, /area/station/science/cytology) -"ppD" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron, -/area/station/engineering/atmos) "ppG" = ( /obj/structure/table/glass, /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"ppI" = ( +/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/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "ppJ" = ( /obj/machinery/door/morgue{ name = "Chapel Garden" @@ -42430,11 +42657,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"pqh" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron, -/area/station/security/office) "pqi" = ( /obj/structure/chair, /obj/machinery/light/directional/north, @@ -42458,15 +42680,13 @@ }, /turf/open/floor/iron, /area/station/engineering/gravity_generator) -"pqp" = ( -/obj/effect/decal/cleanable/dirt, +"pqt" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/machinery/module_duplicator, /turf/open/floor/iron/white, -/area/station/medical/abandoned) -"pqu" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/landmark/start/chaplain, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) +/area/station/science/explab) "pqz" = ( /obj/machinery/door/airlock/maintenance{ name = "Storage Room" @@ -42483,19 +42703,17 @@ /obj/item/fish_feed, /turf/open/space/basic, /area/space/nearstation) -"pqN" = ( -/obj/structure/table/reinforced, -/obj/item/folder/red, -/obj/machinery/light/directional/south, -/obj/structure/cable, -/obj/machinery/requests_console/directional/south{ - department = "Security"; - name = "Security Requests Console" +"prc" = ( +/obj/machinery/firealarm/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Chemistry North"; + network = list("ss13","medbay") }, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/science) +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "prg" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -42505,13 +42723,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) -"pri" = ( -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/structure/closet/l3closet, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "prv" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -42526,21 +42737,16 @@ /obj/effect/turf_decal/tile/green/anticorner/contrasted, /turf/open/floor/iron/white, /area/station/medical/virology) +"pry" = ( +/obj/effect/turf_decal/stripes/line, +/obj/item/radio/intercom/directional/south, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "prD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/library) -"prE" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/structure/cable, -/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, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "prT" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -42636,14 +42842,19 @@ /obj/machinery/keycard_auth/directional/east, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) +"psz" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/dorms) "psT" = ( /turf/open/floor/iron/dark, /area/station/science/lab) "psU" = ( -/obj/machinery/door/window/left/directional/north{ - base_state = "right"; - dir = 4; - icon_state = "right"; +/obj/machinery/door/window/right/directional/east{ name = "Containment Pen #1"; req_access = list("xenobiology") }, @@ -42673,27 +42884,24 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron/dark, /area/station/security/lockers) +"pts" = ( +/obj/machinery/light_switch/directional/west, +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 9 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) "ptH" = ( /obj/effect/turf_decal/siding/purple{ dir = 4 }, /turf/open/floor/iron/white, /area/station/science/research) -"ptV" = ( -/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) "pua" = ( /obj/machinery/vending/assist, +/obj/effect/landmark/navigate_destination, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) "pui" = ( @@ -42744,6 +42952,17 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/virology, /turf/open/floor/iron/white, /area/station/medical/virology) +"puP" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/mecha_part_fabricator{ + dir = 4 + }, +/obj/structure/noticeboard/directional/west, +/turf/open/floor/iron, +/area/station/science/robotics/lab) "puQ" = ( /obj/machinery/door/poddoor/preopen{ id = "Prison Gate"; @@ -42773,10 +42992,6 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/iron, /area/station/commons/storage/tools) -"pvC" = ( -/obj/structure/broken_flooring/singular/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "pvL" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -42885,19 +43100,25 @@ /obj/item/gavelhammer, /turf/open/floor/iron, /area/station/security/courtroom) -"pyd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"pyh" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, /obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"pyv" = ( -/obj/machinery/vending/wardrobe/cargo_wardrobe, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/security/office) +"pyy" = ( +/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/cargo/storage) +/area/station/security/prison/garden) "pyI" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -42926,6 +43147,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) +"pyU" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/status_display/ai/directional/east, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "pyY" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -42955,9 +43183,7 @@ /turf/open/floor/carpet, /area/station/commons/vacant_room/office) "pzz" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, +/obj/item/kirbyplants/organic/plant21, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/disposalpipe/segment{ @@ -42985,14 +43211,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) -"pzW" = ( -/obj/structure/closet/secure_closet/medical1, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) "pzY" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -43039,16 +43257,6 @@ "pBa" = ( /turf/closed/wall, /area/station/medical/medbay/lobby) -"pBd" = ( -/obj/effect/turf_decal/siding{ - dir = 4 - }, -/obj/item/kirbyplants/random/dead/research_director, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) "pBi" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -43056,6 +43264,14 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood, /area/station/commons/lounge) +"pBs" = ( +/obj/structure/sign/warning/cold_temp/directional/north{ + name = "\improper CRYOGENICS" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/medical/cryo) "pBG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -43111,6 +43327,14 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/cafeteria, /area/station/security/prison) +"pCl" = ( +/obj/structure/chair/sofa/corp/left, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) "pCt" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -43121,6 +43345,12 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) +"pCw" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "pCJ" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 4 @@ -43150,11 +43380,18 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) +"pDh" = ( +/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) "pDl" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/window/left/directional/north{ - base_state = "right"; - icon_state = "right"; name = "Containment Pen #7"; req_access = list("xenobiology") }, @@ -43249,13 +43486,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/service/library) -"pEW" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) +"pEI" = ( +/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, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/plating, +/area/station/security/prison/work) "pFd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -43315,12 +43556,6 @@ /obj/structure/cable, /turf/open/floor/circuit/green, /area/station/science/robotics/mechbay) -"pGt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/maintenance/three, -/obj/structure/closet/crate/medical, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) "pGu" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/corner{ @@ -43364,25 +43599,6 @@ }, /turf/open/floor/iron/white, /area/station/commons/fitness) -"pHg" = ( -/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) -"pHh" = ( -/obj/structure/broken_flooring/singular/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "pHi" = ( /obj/machinery/telecomms/server/presets/security, /turf/open/floor/circuit/telecomms/mainframe, @@ -43459,11 +43675,12 @@ /obj/effect/mapping_helpers/airlock/access/any/command/eva, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) -"pIv" = ( -/obj/item/radio/intercom/directional/west, -/obj/structure/closet/secure_closet/security/science, +"pIs" = ( +/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/security/checkpoint/science) +/area/station/service/chapel/funeral) "pIw" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -43498,6 +43715,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"pIU" = ( +/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) "pJf" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -43523,14 +43747,6 @@ }, /turf/open/floor/iron/white, /area/station/science/research) -"pJt" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/item/radio/intercom/directional/north, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/white, -/area/station/science/explab) "pJu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -43554,6 +43770,11 @@ "pJE" = ( /turf/open/floor/iron, /area/station/commons/locker) +"pJN" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/east, +/obj/machinery/vending/wardrobe/curator_wardrobe, +/turf/open/floor/engine/cult, +/area/station/service/library) "pJR" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/hop) @@ -43589,7 +43810,7 @@ /area/station/command/bridge) "pKa" = ( /obj/structure/cable, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/effect/turf_decal/stripes/corner{ dir = 1 }, @@ -43655,17 +43876,18 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) +"pLz" = ( +/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) "pMd" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/engine/n2, /area/station/engineering/atmos) -"pMs" = ( -/obj/structure/table/reinforced, -/obj/machinery/cell_charger, -/obj/machinery/firealarm/directional/north, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "pMy" = ( /obj/machinery/computer/prisoner/management{ dir = 8 @@ -43893,11 +44115,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron, /area/station/security/prison/safe) -"pPU" = ( -/obj/effect/landmark/start/paramedic, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "pQj" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -43930,15 +44147,13 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"pQx" = ( -/obj/structure/cable, -/obj/machinery/computer/security/telescreen/interrogation{ - name = "isolation room monitor"; - network = list("isolation"); - pixel_y = 31 - }, +"pQy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/tank/air, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/maintenance/disposal/incinerator) "pQC" = ( /obj/structure/table/wood, /obj/machinery/firealarm/directional/south, @@ -43983,11 +44198,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/central) -"pQT" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/engine, -/area/station/science/explab) "pQW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -44016,6 +44226,19 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"pRM" = ( +/obj/machinery/disposal/bin, +/obj/machinery/camera/directional/east{ + c_tag = "Garden" + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/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) "pSa" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -44079,13 +44302,15 @@ }, /turf/open/floor/iron, /area/station/engineering/main) -"pTx" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 +"pTL" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "pTS" = ( /turf/closed/wall, /area/station/service/bar) @@ -44141,6 +44366,16 @@ /obj/effect/mapping_helpers/airlock/access/all/service/hydroponics, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"pUM" = ( +/obj/structure/table, +/obj/effect/turf_decal/siding/white/corner, +/obj/machinery/firealarm/directional/north, +/obj/item/clipboard, +/obj/item/paper, +/obj/item/pen, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/office) "pUS" = ( /obj/item/paper_bin{ pixel_x = -3; @@ -44255,6 +44490,17 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/iron/white, /area/station/science/explab) +"pXl" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Hydroponics - Aft" + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/iron, +/area/station/service/hydroponics) "pXA" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -44274,22 +44520,6 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) -"pXQ" = ( -/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) "pYn" = ( /obj/structure/sign/plaques/kiddie/library{ pixel_y = -32 @@ -44299,11 +44529,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"pYo" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/smartfridge/organ, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "pYw" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -44365,14 +44590,16 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) -"qaf" = ( -/obj/structure/chair/stool/bar/directional/south, -/obj/effect/turf_decal/siding/wood{ - dir = 9 +"pZW" = ( +/obj/structure/lattice, +/obj/structure/sign/nanotrasen{ + pixel_x = 32 }, -/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/space/basic, +/area/space/nearstation) +"qaf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, +/turf/open/floor/wood/large, /area/station/commons/lounge) "qag" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, @@ -44385,6 +44612,16 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"qaw" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "qaA" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -44402,6 +44639,38 @@ }, /turf/open/floor/plating, /area/station/maintenance/central) +"qaN" = ( +/obj/structure/table/wood, +/obj/machinery/button/ticket_machine{ + pixel_x = 32 + }, +/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 = list("hop") + }, +/obj/item/paper_bin/carbon{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/stamp/head/hop{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/machinery/button/door/directional/south{ + id = "hopqueue"; + name = "Queue Shutters Control"; + pixel_x = -6; + pixel_y = -34; + req_access = list("hop") + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "qaP" = ( /obj/effect/turf_decal/plaque{ icon_state = "L3" @@ -44415,7 +44684,9 @@ /turf/open/floor/plating, /area/station/maintenance/department/medical/central) "qbr" = ( -/obj/structure/bed, +/obj/structure/bed/medical{ + dir = 4 + }, /obj/item/clothing/suit/jacket/straight_jacket, /obj/item/clothing/glasses/blindfold, /obj/item/clothing/mask/muzzle, @@ -44467,6 +44738,13 @@ "qcd" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmos/pumproom) +"qcy" = ( +/obj/machinery/newscaster/directional/south, +/obj/machinery/camera/directional/south{ + c_tag = "Courtroom - Gallery" + }, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) "qcP" = ( /obj/effect/landmark/blobstart, /obj/effect/mapping_helpers/burnt_floor, @@ -44484,24 +44762,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/security/execution/transfer) -"qdr" = ( -/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) "qdw" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -44510,6 +44770,14 @@ /obj/machinery/door/airlock/external, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) +"qdy" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/obj/effect/landmark/start/hangover, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/wood, +/area/station/commons/dorms) "qdI" = ( /obj/structure/table, /obj/machinery/microwave, @@ -44523,6 +44791,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/firealarm/directional/west, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) "qdT" = ( @@ -44537,21 +44806,11 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/plating, /area/station/maintenance/central) -"qem" = ( -/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/atmos) +"qeo" = ( +/obj/machinery/newscaster/directional/north, +/obj/structure/dresser, +/turf/open/floor/carpet, +/area/station/commons/dorms) "qeq" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -44600,23 +44859,6 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/command/corporate_showroom) -"qfc" = ( -/obj/machinery/light/directional/south, -/obj/effect/landmark/generic_maintenance_landmark, -/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) -"qfi" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "qfp" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -44639,14 +44881,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/security/courtroom) -"qfK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/status_display/evac/directional/north, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "qfL" = ( /obj/machinery/power/port_gen/pacman/pre_loaded, /turf/open/floor/plating, @@ -44786,6 +45020,22 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"qhw" = ( +/obj/machinery/button/door/directional/west{ + id = "Engineering"; + name = "Engineering Lockdown"; + pixel_y = -6; + req_access = list("engineering") + }, +/obj/machinery/button/door/directional/west{ + id = "atmos"; + name = "Atmospherics Lockdown"; + pixel_y = 6; + req_access = list("atmospherics") + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "qhx" = ( /obj/item/radio/intercom/directional/east, /obj/effect/turf_decal/tile/purple, @@ -44804,6 +45054,19 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, /area/station/security/holding_cell) +"qhA" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 1 + }, +/obj/effect/mapping_helpers/dead_body_placer, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) +"qhE" = ( +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "qhF" = ( /obj/item/radio/intercom/directional/north, /obj/effect/turf_decal/stripes/line{ @@ -44848,28 +45111,12 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/checkpoint/customs) -"qid" = ( -/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) "qig" = ( /obj/structure/cable, /turf/open/floor/iron/dark/side{ dir = 4 }, /area/station/security/prison) -"qin" = ( -/obj/machinery/light/directional/south, -/obj/machinery/firealarm/directional/south, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) "qiw" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/stripes/white/line, @@ -44888,6 +45135,15 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"qiY" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/sign/poster/random/directional/east, +/obj/structure/table/wood, +/obj/item/food/pie/cream, +/turf/open/floor/wood/large, +/area/station/service/theater) "qjf" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -44898,6 +45154,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) +"qjl" = ( +/obj/machinery/vending/tool, +/obj/effect/turf_decal/delivery, +/obj/machinery/light_switch/directional/west, +/obj/machinery/incident_display/delam/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/storage_shared) "qjr" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/blue/filled/line, @@ -44961,17 +45224,11 @@ /obj/effect/landmark/start/psychologist, /turf/open/floor/wood/parquet, /area/station/medical/psychology) -"qkW" = ( -/obj/machinery/light/directional/south, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) "qkX" = ( /obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/airlock/maintenance/glass, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) "qlc" = ( @@ -44981,17 +45238,12 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) -"qli" = ( -/obj/structure/closet/athletic_mixed, -/obj/effect/landmark/start/hangover/closet, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) "qlr" = ( -/obj/structure/cable, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "qlG" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -45022,7 +45274,7 @@ /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hos) "qmu" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 8 }, /turf/open/floor/iron/dark, @@ -45055,17 +45307,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"qnb" = ( -/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) "qno" = ( /obj/structure/table, /obj/machinery/microwave{ @@ -45160,6 +45401,18 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"qpf" = ( +/obj/structure/table/reinforced, +/obj/item/defibrillator/loaded{ + pixel_y = 6 + }, +/obj/item/defibrillator/loaded{ + pixel_y = 3 + }, +/obj/item/defibrillator/loaded, +/obj/structure/window/spawner/directional/west, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "qph" = ( /obj/effect/decal/cleanable/blood/old, /obj/effect/spawner/random/medical/patient_stretcher, @@ -45169,14 +45422,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"qpn" = ( -/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) "qpr" = ( /obj/machinery/button/door/directional/west{ id = "bridge blast"; @@ -45185,14 +45430,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) -"qpu" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/airalarm/directional/south, -/obj/structure/bodycontainer/morgue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "qpD" = ( /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, @@ -45201,16 +45438,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/wood, /area/station/commons/lounge) -"qpT" = ( -/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, -/obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "qqg" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -45242,6 +45469,13 @@ dir = 1 }, /area/station/service/chapel) +"qrj" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/south, +/obj/machinery/suit_storage_unit/ce, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "qrn" = ( /turf/open/floor/iron/dark, /area/station/security/interrogation) @@ -45254,13 +45488,6 @@ }, /turf/open/floor/engine/co2, /area/station/engineering/atmos) -"qrD" = ( -/obj/structure/bodycontainer/crematorium{ - dir = 1; - id = "crematoriumChapel" - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) "qrF" = ( /obj/machinery/computer/exodrone_control_console{ dir = 1 @@ -45350,11 +45577,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) -"qsQ" = ( -/obj/machinery/light/directional/north, -/obj/machinery/computer/security/wooden_tv, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) "qsV" = ( /obj/structure/table/reinforced, /obj/item/phone{ @@ -45396,19 +45618,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) -"qtH" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/light/small/directional/north, -/obj/structure/rack, -/obj/item/mod/module/plasma_stabilizer, -/obj/item/mod/module/thermal_regulator, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/storage_shared) "qua" = ( /obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ dir = 1 @@ -45426,15 +45635,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/main) -"quv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/west, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) "quz" = ( /obj/structure/table, /obj/structure/bedsheetbin{ @@ -45455,9 +45655,17 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/disposal) +"qvP" = ( +/obj/item/kirbyplants/random, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/structure/sign/calendar/directional/west, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) "qvQ" = ( -/obj/machinery/door/window/left/directional/north{ - dir = 8; +/obj/machinery/door/window/left/directional/west{ name = "Containment Pen #4"; req_access = list("xenobiology") }, @@ -45613,6 +45821,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"qyQ" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/closet/secure_closet/engineering_welding, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/engineering/main) "qyT" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -45852,17 +46066,18 @@ /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"qDt" = ( -/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 - }, -/turf/open/floor/iron/dark/corner{ +"qDg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/area/station/engineering/atmos) +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/iron/cafeteria, +/area/station/security/prison) +"qDi" = ( +/obj/machinery/status_display/ai/directional/east, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai) "qDy" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -45874,6 +46089,16 @@ /obj/machinery/hydroponics/constructable, /turf/open/floor/iron, /area/station/service/hydroponics) +"qDD" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Arrivals - Fore Arm" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/entry) "qDS" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -45902,15 +46127,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/commons/dorms) -"qEF" = ( -/obj/machinery/atmospherics/components/trinary/filter{ - dir = 4 - }, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) "qEG" = ( /obj/structure/table, /obj/effect/spawner/random/entertainment/deck, @@ -45926,26 +46142,6 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/general, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"qEP" = ( -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) -"qFj" = ( -/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/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/item/pipe_dispenser, -/obj/item/pipe_dispenser, -/obj/item/pipe_dispenser, -/turf/open/floor/iron, -/area/station/engineering/main) "qFo" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -45968,14 +46164,6 @@ }, /turf/open/floor/iron, /area/station/cargo/warehouse) -"qFA" = ( -/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) "qFF" = ( /obj/effect/turf_decal/trimline/brown/warning{ dir = 5 @@ -46088,6 +46276,21 @@ /obj/structure/sign/warning/docking, /turf/closed/wall, /area/station/hallway/secondary/entry) +"qHC" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/effect/turf_decal/trimline/brown/line, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 1 + }, +/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/effect/landmark/start/bitrunner, +/turf/open/floor/iron/dark/textured_half, +/area/station/bitrunning/den) "qHK" = ( /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, @@ -46170,7 +46373,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/atmospherics/components/unary/cryo_cell, +/obj/machinery/cryo_cell, /turf/open/floor/iron/dark/textured, /area/station/medical/cryo) "qIS" = ( @@ -46184,6 +46387,20 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/range) +"qJb" = ( +/obj/machinery/requests_console/directional/west{ + department = "Detective"; + name = "Detective Requests Console" + }, +/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) "qJd" = ( /obj/machinery/status_display/ai/directional/north, /obj/machinery/computer/station_alert, @@ -46202,15 +46419,13 @@ /obj/structure/table, /turf/open/floor/iron, /area/station/security/prison/visit) -"qJx" = ( -/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, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) +"qJn" = ( +/obj/machinery/chem_master, +/obj/structure/noticeboard/directional/east, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) "qJH" = ( /obj/machinery/vending/autodrobe/all_access, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -46246,10 +46461,6 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"qKw" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet/green, -/area/station/maintenance/port/aft) "qKy" = ( /obj/machinery/navbeacon{ codes_txt = "delivery;dir=1"; @@ -46268,16 +46479,23 @@ }, /turf/open/floor/plating, /area/station/maintenance/disposal) +"qKD" = ( +/obj/structure/sign/poster/random/directional/east, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/closet/secure_closet/freezer/kitchen, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 10 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "qKR" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /turf/open/floor/plating, /area/station/engineering/atmos) -"qKS" = ( -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) "qLe" = ( /obj/structure/cable, /obj/machinery/door/firedoor, @@ -46309,6 +46527,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/theater) +"qLu" = ( +/obj/effect/turf_decal/siding/purple{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white, +/area/station/science/research) "qLw" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -46332,18 +46558,39 @@ /turf/open/floor/wood, /area/station/commons/vacant_room/office) "qLR" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/cup/beaker/large{ - pixel_y = 5 +/obj/structure/rack, +/obj/machinery/airalarm/directional/west, +/obj/item/reagent_containers/cup/bottle/mercury{ + pixel_x = -5; + pixel_y = 3 }, -/obj/item/reagent_containers/dropper{ - pixel_y = -4 +/obj/item/reagent_containers/cup/bottle/nitrogen{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/bottle/oxygen{ + pixel_x = 1 }, -/obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark/textured_edge{ dir = 4 }, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) +"qLU" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 8 + }, +/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/atmos) "qLY" = ( /obj/machinery/camera/directional/south{ c_tag = "Arrivals - Middle Arm - Far" @@ -46389,6 +46636,13 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) +"qMm" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/engineering/atmos) "qMA" = ( /obj/machinery/computer/cargo{ dir = 4 @@ -46421,6 +46675,12 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating/airless, /area/space/nearstation) +"qMW" = ( +/obj/effect/turf_decal/bot_white/left, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/command/gateway) "qNb" = ( /obj/machinery/door/airlock/external{ name = "Labor Camp Shuttle Airlock" @@ -46498,6 +46758,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/command/bridge) +"qOk" = ( +/obj/structure/table/optable, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) "qOs" = ( /obj/machinery/door/airlock/maintenance{ name = "Genetics Maintenance" @@ -46534,6 +46801,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"qOO" = ( +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/disposal/bin, +/obj/machinery/light/cold/directional/west, +/obj/machinery/status_display/ai/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) "qOP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -46596,6 +46873,10 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/virology, /turf/open/floor/iron/white, /area/station/medical/virology) +"qPF" = ( +/obj/machinery/computer/security/wooden_tv, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) "qPJ" = ( /turf/closed/wall, /area/station/security/checkpoint/medical) @@ -46628,13 +46909,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/primary/central) -"qQs" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) "qQu" = ( /obj/structure/chair/sofa/corp/right{ dir = 1 @@ -46644,6 +46918,15 @@ }, /turf/open/floor/iron/dark, /area/station/medical/break_room) +"qQJ" = ( +/obj/machinery/computer/camera_advanced/xenobio{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/effect/turf_decal/bot, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/iron, +/area/station/science/xenobiology) "qQX" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/line{ @@ -46655,6 +46938,27 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/medical/medbay/central) +"qQY" = ( +/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/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"qRa" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"qRe" = ( +/obj/effect/turf_decal/siding/purple, +/obj/item/kirbyplants/random, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/white, +/area/station/science/ordnance/office) "qRf" = ( /obj/machinery/firealarm/directional/east, /turf/open/floor/wood, @@ -46779,10 +47083,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/commons/storage/primary) -"qSJ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall, -/area/station/commons/vacant_room/commissary) +"qSP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ + dir = 1 + }, +/obj/effect/turf_decal/siding/purple{ + dir = 9 + }, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/dark, +/area/station/science/ordnance) "qST" = ( /turf/open/floor/iron, /area/station/cargo/drone_bay) @@ -46845,9 +47155,7 @@ }, /obj/machinery/light/directional/west, /obj/structure/extinguisher_cabinet/directional/west, -/obj/item/kirbyplants{ - icon_state = "plant-04" - }, +/obj/item/kirbyplants/organic/plant4, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -46866,32 +47174,25 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) +"qTU" = ( +/obj/item/retractor, +/obj/item/hemostat{ + pixel_x = -10 + }, +/obj/structure/table, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted, +/turf/open/floor/iron/white, +/area/station/science/robotics/lab) "qTX" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/firealarm/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"qUm" = ( -/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) "qUz" = ( /obj/effect/turf_decal/tile/purple/half/contrasted, /turf/open/floor/iron/white, /area/station/science/lobby) -"qUE" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/light/small/directional/east, -/obj/effect/spawner/random/structure/crate_loot, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "qUQ" = ( /obj/structure/chair{ dir = 8 @@ -46932,22 +47233,25 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/service/hydroponics/garden) -"qVM" = ( -/obj/structure/table, -/obj/item/storage/bag/plants, -/obj/item/reagent_containers/cup/watering_can, -/obj/machinery/light/directional/north, -/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 +"qVD" = ( +/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 }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) +"qWg" = ( +/obj/structure/lattice, +/obj/structure/sign/warning/secure_area/directional/east, +/turf/open/space/basic, +/area/space/nearstation) "qWm" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -46956,12 +47260,6 @@ dir = 9 }, /area/station/commons/fitness) -"qWw" = ( -/obj/structure/closet/boxinggloves, -/obj/effect/landmark/start/hangover/closet, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) "qWF" = ( /turf/closed/wall/r_wall, /area/station/hallway/primary/fore) @@ -47052,6 +47350,28 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, /area/station/maintenance/port) +"qXt" = ( +/obj/structure/sign/warning/vacuum/external/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"qXu" = ( +/obj/machinery/light_switch/directional/east, +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/machinery/fax{ + fax_name = "Psychology Office"; + name = "Psychology Office Fax Machine" + }, +/obj/machinery/light/small/directional/south, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/wood/parquet, +/area/station/medical/psychology) "qXw" = ( /obj/structure/filingcabinet/chestdrawer, /mob/living/simple_animal/parrot/poly, @@ -47077,13 +47397,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"qXU" = ( -/obj/machinery/light/small/directional/north, -/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) "qXV" = ( /obj/effect/spawner/structure/window, /obj/machinery/door/poddoor/shutters/preopen{ @@ -47093,9 +47406,8 @@ /turf/open/floor/plating, /area/station/service/lawoffice) "qXW" = ( -/obj/effect/spawner/random/structure/chair_maintenance{ - dir = 1 - }, +/obj/effect/spawner/random/maintenance/two, +/obj/structure/closet, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) "qYd" = ( @@ -47128,16 +47440,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/research) -"qYY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/button/door/directional/east{ - id = "atmoshfr"; - name = "Radiation Shutters Control"; - req_access = list("atmospherics") - }, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/atmos) "qZa" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -47183,17 +47485,6 @@ "qZI" = ( /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"qZM" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Morgue Maintenance" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/access/all/medical/morgue, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/medical/morgue) "qZO" = ( /obj/effect/landmark/event_spawn, /obj/structure/cable, @@ -47242,6 +47533,26 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"rar" = ( +/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, +/obj/structure/window/spawner/directional/north, +/obj/machinery/status_display/ai/directional/east, +/obj/structure/sign/clock/directional/south, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "raz" = ( /obj/structure/cable, /turf/open/floor/plating/airless, @@ -47263,21 +47574,19 @@ /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) +"raL" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/obj/machinery/computer/order_console/mining, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "raT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/chair/stool/directional/west, /turf/open/floor/wood, /area/station/commons/lounge) -"rbe" = ( -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "rbi" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance, @@ -47301,6 +47610,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/warden) +"rbD" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 10 + }, +/obj/effect/turf_decal/siding/purple{ + dir = 5 + }, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/structure/sign/poster/official/wtf_is_co2/directional/north, +/turf/open/floor/iron/dark, +/area/station/science/ordnance) "rbF" = ( /obj/machinery/mass_driver/chapelgun, /obj/structure/sign/warning/vacuum/external/directional/north, @@ -47312,6 +47637,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/service/chapel/funeral) +"rbG" = ( +/obj/structure/rack, +/obj/effect/spawner/random/clothing/costume, +/obj/item/clothing/mask/balaclava, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/commons/locker) "rbH" = ( /obj/machinery/door/airlock{ name = "Port Emergency Storage" @@ -47319,11 +47652,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port) -"rbI" = ( -/obj/machinery/vending/tool, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "rbL" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -47362,6 +47690,22 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) +"rdk" = ( +/obj/structure/table/reinforced, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/obj/item/book/manual/wiki/surgery{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/book/manual/wiki/medicine{ + pixel_x = 2; + pixel_y = 3 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) "rdt" = ( /obj/structure/sign/warning/vacuum/external/directional/north, /turf/open/floor/plating, @@ -47393,30 +47737,47 @@ }, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) -"rdU" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Engineering - Foyer - Shared Storage" - }, -/obj/structure/sign/poster/official/random/directional/west, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/storage_shared) "rea" = ( /obj/effect/turf_decal/stripes/red/line{ dir = 5 }, /turf/open/floor/engine, /area/station/science/cytology) +"rem" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/fax{ + fax_name = "Service Hallway"; + name = "Service Fax Machine" + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "ret" = ( /obj/effect/spawner/random/trash/garbage{ spawn_scatter_radius = 1 }, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"rew" = ( +/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{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "rez" = ( /obj/machinery/newscaster/directional/south, /obj/structure/cable, @@ -47445,17 +47806,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) -"reQ" = ( -/obj/structure/table, -/obj/item/pipe_dispenser{ - pixel_x = 3; - pixel_y = 7 - }, -/obj/item/pipe_dispenser, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/science/ordnance) "rfb" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47506,7 +47856,7 @@ /turf/open/floor/iron, /area/station/cargo/storage) "rgS" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -47567,6 +47917,13 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) +"rhW" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/item/weldingtool, +/obj/item/clothing/head/utility/welding, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/construction/storage_wing) "riz" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -47601,6 +47958,20 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/wood, /area/station/commons/lounge) +"rjl" = ( +/obj/structure/weightmachine/weightlifter, +/obj/effect/turf_decal/tile/dark_red/half/contrasted, +/obj/effect/landmark/start/hangover, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white/textured_edge{ + dir = 1 + }, +/area/station/commons/fitness) +"rjy" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/recharge_station, +/turf/open/floor/iron/white, +/area/station/medical/storage) "rjz" = ( /obj/machinery/power/shieldwallgen, /obj/structure/extinguisher_cabinet/directional/west, @@ -47620,6 +47991,21 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"rjZ" = ( +/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) "rke" = ( /obj/machinery/recharge_station, /turf/open/floor/plating, @@ -47659,12 +48045,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"rkQ" = ( -/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) "rkT" = ( /obj/item/target/syndicate, /turf/open/floor/engine, @@ -47721,17 +48101,10 @@ "rlU" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/command/nuke_storage) -"rmD" = ( -/obj/effect/turf_decal/trimline/neutral/filled/warning{ - 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/dark, -/area/station/medical/morgue) +"rmj" = ( +/obj/structure/table, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "rmF" = ( /obj/machinery/door/airlock/maintenance{ name = "Law Office Maintenance" @@ -47826,6 +48199,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/eva) +"roe" = ( +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ + dir = 10 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "roj" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -47839,15 +48223,14 @@ }, /turf/open/floor/iron, /area/station/science/explab) -"rpb" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/table/wood, -/obj/effect/spawner/random/trash/soap, -/obj/structure/sign/poster/random/directional/east, -/turf/open/floor/wood/large, -/area/station/service/theater) +"roF" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/effect/landmark/event_spawn, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/construction/mining/aux_base) "rps" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -47856,6 +48239,15 @@ /obj/machinery/duct, /turf/open/floor/iron/white/smooth_large, /area/station/medical/surgery/theatre) +"rpw" = ( +/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, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "rpx" = ( /obj/machinery/suit_storage_unit/engine, /obj/effect/turf_decal/bot{ @@ -47898,6 +48290,24 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"rqc" = ( +/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/records/medical{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/medical) "rqs" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -47919,11 +48329,6 @@ }, /turf/open/floor/plating, /area/station/command/heads_quarters/hos) -"rrh" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/closet/secure_closet/engineering_welding, -/turf/open/floor/iron, -/area/station/engineering/main) "rrj" = ( /obj/structure/closet/firecloset, /turf/open/floor/plating, @@ -47933,19 +48338,26 @@ /obj/effect/spawner/random/structure/grille, /turf/open/space/basic, /area/space/nearstation) +"rrz" = ( +/obj/machinery/chem_dispenser/drinks/beer{ + dir = 1 + }, +/obj/structure/table, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/light/small/directional/south, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron, +/area/station/service/bar) "rrL" = ( /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 = list("xenobiology") - }, /obj/machinery/door/poddoor/preopen{ id = "xenobio4"; name = "Xenobio Pen 4 Blast Door" }, +/obj/machinery/door/window/right/directional/west{ + name = "Containment Pen #4"; + req_access = list("xenobiology") + }, /turf/open/floor/iron, /area/station/science/xenobiology) "rrT" = ( @@ -47955,15 +48367,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"rrW" = ( -/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) "rrZ" = ( /obj/machinery/telecomms/processor/preset_one, /obj/machinery/camera/directional/north{ @@ -48025,6 +48428,10 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"rsR" = ( +/obj/structure/railing, +/turf/open/floor/plating/airless, +/area/space/nearstation) "rtd" = ( /obj/machinery/camera/motion/directional/east{ c_tag = "E.V.A. Storage" @@ -48043,22 +48450,17 @@ /obj/machinery/igniter/incinerator_ordmix, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/burnchamber) -"rtn" = ( -/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/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"rtG" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, +"rtD" = ( +/obj/effect/turf_decal/tile/purple, +/obj/machinery/light/directional/east, /turf/open/floor/iron, -/area/station/hallway/primary/port) +/area/station/hallway/primary/aft) +"rtI" = ( +/obj/effect/landmark/secequipment, +/obj/effect/turf_decal/bot, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/office) "rtN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48073,17 +48475,6 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) -"rtP" = ( -/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/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark/corner, -/area/station/engineering/storage_shared) "rtQ" = ( /obj/machinery/door/poddoor/shutters/radiation/preopen{ id = "engsm"; @@ -48102,7 +48493,7 @@ "rtX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "rul" = ( @@ -48180,14 +48571,13 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/medical/storage) -"rvj" = ( -/obj/structure/chair/stool/directional/south, -/obj/machinery/light/small/directional/west, -/obj/machinery/computer/pod/old/mass_driver_controller/trash{ - pixel_x = -24 +"rvq" = ( +/obj/machinery/computer/records/medical{ + dir = 4 }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron/dark, +/area/station/medical/office) "rvx" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /turf/open/floor/engine/n2o, @@ -48212,8 +48602,7 @@ /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; +/obj/machinery/door/window/left/directional/east{ name = "Maximum Security Test Chamber"; req_access = list("xenobiology") }, @@ -48232,6 +48621,21 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) +"rwa" = ( +/obj/structure/table, +/obj/item/storage/bag/plants, +/obj/item/reagent_containers/cup/watering_can, +/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) "rwd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/green{ @@ -48268,17 +48672,14 @@ /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 = list("xenobiology") - }, /obj/machinery/door/poddoor/preopen{ id = "xenobio3"; name = "Xenobio Pen 3 Blast Door" }, +/obj/machinery/door/window/right/directional/west{ + name = "Containment Pen #3"; + req_access = list("xenobiology") + }, /turf/open/floor/iron, /area/station/science/xenobiology) "rwE" = ( @@ -48293,6 +48694,12 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"rwF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) "rxa" = ( /obj/machinery/door/poddoor/preopen{ id = "medsecprivacy"; @@ -48317,11 +48724,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit/green, /area/station/ai_monitored/turret_protected/ai_upload) -"rxz" = ( -/obj/structure/closet/crate/coffin, -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/station/service/chapel/funeral) "rxA" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 10 @@ -48330,28 +48732,29 @@ /area/station/medical/storage) "rxG" = ( /obj/machinery/door/airlock/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /obj/effect/mapping_helpers/airlock/unres{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) "rxH" = ( /obj/structure/cable, /turf/open/floor/plating/airless, /area/station/solars/starboard/aft) -"rxR" = ( -/obj/machinery/duct, -/obj/effect/turf_decal/trimline/blue/filled/corner, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 +"rxP" = ( +/obj/machinery/computer/security, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/turf/open/floor/iron/white, -/area/station/medical/cryo) +/obj/machinery/requests_console/directional/north{ + department = "Security"; + name = "Security Requests Console" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) "rxY" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -48402,12 +48805,22 @@ /obj/item/stock_parts/cell/high, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) -"ryv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/medical/patient_stretcher, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/medical/abandoned) +"ryA" = ( +/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 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/engineering/break_room) "ryJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -48422,12 +48835,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/security/prison/visit) -"ryQ" = ( -/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) "rza" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -48504,6 +48911,12 @@ }, /turf/closed/wall/r_wall, /area/station/engineering/atmos/pumproom) +"rzY" = ( +/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/security/brig) "rAa" = ( /obj/machinery/door/airlock/maintenance{ name = "Storage Room" @@ -48577,13 +48990,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"rBs" = ( -/obj/structure/table, -/obj/effect/spawner/random/food_or_drink/donkpockets, -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron, -/area/station/science/research) "rBU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -48602,27 +49008,21 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"rCJ" = ( -/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/stripes/line{ - dir = 4 +"rCW" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Gas to Filter" }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) +/obj/machinery/light/small/directional/south, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "rDf" = ( /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) "rDm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_atmos{ - dir = 8 + dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/engine, @@ -48663,6 +49063,11 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"rDM" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "rDT" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48710,11 +49115,14 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron, /area/station/commons/storage/tools) -"rEy" = ( -/obj/machinery/light/directional/west, -/obj/machinery/recharge_station, -/turf/open/floor/iron/dark, -/area/station/security/lockers) +"rEt" = ( +/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) "rEz" = ( /obj/machinery/light/directional/east, /obj/machinery/firealarm/directional/east, @@ -48725,6 +49133,10 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) +"rEK" = ( +/obj/machinery/telecomms/server/presets/service, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) "rEO" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -48732,6 +49144,13 @@ "rES" = ( /turf/closed/wall/r_wall, /area/station/security/office) +"rFq" = ( +/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) "rFB" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -48745,6 +49164,8 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/effect/turf_decal/bot, +/obj/structure/sink/directional/east, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) "rFR" = ( @@ -48765,15 +49186,6 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron, /area/station/security/holding_cell) -"rGb" = ( -/obj/machinery/washing_machine, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/security/prison) "rGd" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -48813,20 +49225,6 @@ "rGC" = ( /turf/open/floor/iron/dark, /area/station/security/courtroom) -"rGE" = ( -/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) -"rGK" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "rHh" = ( /obj/structure/table/reinforced, /obj/item/book/manual/wiki/security_space_law{ @@ -48878,28 +49276,6 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"rHr" = ( -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"rHv" = ( -/obj/effect/decal/cleanable/dirt, -/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) "rHz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48993,25 +49369,13 @@ 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, /obj/item/papercutter{ pixel_x = -4 }, +/obj/item/paper/fluff/ids_for_dummies, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) -"rJz" = ( -/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) "rJA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -49036,8 +49400,17 @@ /obj/structure/disposalpipe/junction/yjunction{ dir = 8 }, +/obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"rJQ" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/security/brig) "rJS" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -49135,12 +49508,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/brig) -"rLm" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/firealarm/directional/west, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/wood, -/area/station/service/library) "rLo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -49149,18 +49516,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/science/lab) -"rLr" = ( -/obj/structure/rack, -/obj/item/poster/random_contraband, -/obj/effect/spawner/random/maintenance, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/port) -"rLu" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/power/port_gen/pacman/pre_loaded, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "rLv" = ( /turf/open/floor/plating/foam{ initial_gas_mix = "TEMP=2.7" @@ -49178,13 +49533,10 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"rLN" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Engineering Supermatter Chamber"; - network = list("engine") - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter) +"rLZ" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "rMe" = ( /obj/structure/table, /obj/machinery/button/door{ @@ -49252,6 +49604,23 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/carpet, /area/station/service/library) +"rMJ" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"rMT" = ( +/obj/machinery/power/smes{ + capacity = 9e+006; + charge = 10000 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "rMZ" = ( /obj/structure/table, /obj/item/folder/blue{ @@ -49303,10 +49672,14 @@ /turf/open/floor/plating, /area/station/maintenance/port/fore) "rNV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 6 +/obj/machinery/door/airlock/maintenance{ + name = "Mining Dock Maintenance" }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, +/obj/effect/mapping_helpers/airlock/access/any/supply/mining, /turf/open/floor/plating, /area/station/maintenance/port/fore) "rOz" = ( @@ -49351,13 +49724,6 @@ /obj/machinery/shower/directional/west, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) -"rPc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/medical/abandoned) "rPe" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49379,6 +49745,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload_foyer) +"rPA" = ( +/obj/structure/flora/bush/flowers_pp/style_random, +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/structure/flora/bush/fullgrass/style_random, +/turf/open/floor/grass, +/area/station/science/ordnance/office) "rPF" = ( /obj/machinery/shower/directional/south{ name = "emergency shower" @@ -49435,24 +49807,14 @@ "rQw" = ( /turf/open/floor/plating/airless, /area/station/solars/starboard/fore) -"rQB" = ( -/obj/item/flashlight/flare/candle, -/obj/machinery/light_switch/directional/west, -/obj/effect/decal/cleanable/cobweb, +"rQz" = ( +/obj/item/storage/secure/briefcase, /obj/structure/table/wood, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel) -"rQL" = ( -/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) +/obj/item/folder/blue, +/obj/item/storage/secure/briefcase, +/obj/item/assembly/flash/handheld, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "rQS" = ( /obj/structure/table, /obj/item/storage/box/evidence{ @@ -49486,26 +49848,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/brig) -"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) "rRm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -49547,6 +49889,15 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) +"rRJ" = ( +/obj/machinery/dna_scannernew, +/obj/effect/turf_decal/siding/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/dark, +/area/station/science/genetics) "rRR" = ( /obj/structure/sign/warning/vacuum/external/directional/south, /obj/machinery/light/small/directional/north, @@ -49567,18 +49918,8 @@ /turf/open/floor/plating, /area/station/service/chapel) "rSa" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"rSb" = ( -/obj/machinery/computer/security/telescreen/entertainment/directional/south, -/obj/machinery/suit_storage_unit/ce, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) +/turf/closed/wall, +/area/station/bitrunning/den) "rSi" = ( /obj/effect/landmark/start/chief_engineer, /obj/structure/chair/office/light{ @@ -49656,17 +49997,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) -"rTT" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/closet/secure_closet/freezer/fridge, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 9 - }, -/obj/effect/turf_decal/tile/bar, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "rTV" = ( /obj/machinery/firealarm/directional/west, /obj/structure/table, @@ -49692,6 +50022,10 @@ /obj/item/pillow/random, /turf/open/floor/wood, /area/station/commons/dorms) +"rUp" = ( +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "rUE" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -49746,11 +50080,11 @@ /turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) "rUU" = ( -/obj/machinery/light/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 1 }, +/obj/machinery/light/cold/directional/north, /turf/open/floor/iron/white, /area/station/medical/virology) "rVb" = ( @@ -49765,12 +50099,6 @@ "rVn" = ( /turf/open/floor/iron, /area/station/construction/storage_wing) -"rVC" = ( -/obj/machinery/airalarm/directional/east, -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) "rVG" = ( /obj/machinery/door/window/left/directional/east{ dir = 8; @@ -49789,17 +50117,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"rVJ" = ( -/obj/machinery/light/floor, -/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) "rVK" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -49818,6 +50135,13 @@ /obj/structure/cable, /turf/open/floor/grass, /area/station/medical/virology) +"rWf" = ( +/obj/structure/urinal/directional/north, +/obj/structure/cable, +/obj/machinery/duct, +/obj/machinery/light/floor, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) "rWi" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /turf/open/floor/engine/n2, @@ -49860,15 +50184,9 @@ /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /obj/machinery/door/firedoor/heavy, +/obj/effect/landmark/navigate_destination, /turf/open/floor/plating, /area/station/science/ordnance/testlab) -"rXB" = ( -/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) "rXJ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/stool/directional/east, @@ -49877,6 +50195,23 @@ }, /turf/open/floor/iron, /area/station/security/prison/visit) +"rXW" = ( +/obj/item/radio/intercom/directional/west, +/obj/structure/table/glass, +/obj/machinery/camera/directional/west{ + c_tag = "Medbay Pharmacy"; + network = list("ss13","medbay") + }, +/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) "rXX" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, @@ -49887,12 +50222,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/engineering/gravity_generator) -"rYm" = ( -/obj/machinery/light/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "rYo" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -49936,24 +50265,6 @@ /obj/machinery/door/firedoor/heavy, /turf/open/floor/plating, /area/station/science/ordnance/storage) -"rYN" = ( -/obj/item/radio/intercom/directional/west, -/obj/structure/table/glass, -/obj/machinery/camera/directional/west{ - c_tag = "Medbay 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) "rYR" = ( /obj/structure/table, /obj/item/reagent_containers/cup/glass/drinkingglass{ @@ -49974,16 +50285,6 @@ /obj/item/reagent_containers/syringe, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"rZf" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, -/obj/effect/turf_decal/siding/purple{ - dir = 6 - }, -/obj/machinery/light/directional/south, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/mixingchamber_access, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/burnchamber) "rZt" = ( /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ dir = 8 @@ -50032,16 +50333,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/medical/storage) -"saa" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "sab" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -50075,21 +50366,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/supply/general, +/obj/effect/landmark/navigate_destination, /turf/open/floor/iron, /area/station/construction/storage_wing) -"saj" = ( -/obj/structure/table/wood, -/obj/item/lipstick{ - pixel_y = 5 - }, -/obj/machinery/light/small/directional/east, -/obj/effect/spawner/random/entertainment/musical_instrument, -/obj/structure/sign/poster/random/directional/east, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/wood/large, -/area/station/service/theater) "sal" = ( /obj/machinery/door/poddoor/shutters{ dir = 4; @@ -50160,6 +50439,13 @@ /obj/item/storage/toolbox/electrical, /turf/open/floor/iron, /area/station/security/brig) +"sbs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet, +/obj/item/surgicaldrill, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) "sbG" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/east, @@ -50180,6 +50466,18 @@ dir = 8 }, /area/station/medical/medbay/lobby) +"sbM" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/closet/secure_closet/freezer/fridge, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 9 + }, +/obj/effect/turf_decal/tile/bar, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "sbX" = ( /obj/machinery/hydroponics/soil, /obj/effect/decal/cleanable/dirt, @@ -50187,16 +50485,6 @@ /obj/item/plant_analyzer, /turf/open/floor/grass, /area/station/security/prison/garden) -"scb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash/box, -/obj/effect/spawner/random/maintenance/two, -/obj/structure/sign/poster/contraband/lizard/directional/west, -/obj/item/toy/plush/lizard_plushie/green{ - name = "Tends-the-Wounds" - }, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) "sch" = ( /turf/closed/wall, /area/station/security/medical) @@ -50210,12 +50498,16 @@ }, /turf/open/floor/iron, /area/station/science/robotics/lab) -"scy" = ( -/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) +"scq" = ( +/obj/machinery/computer/robotics{ + dir = 4 + }, +/obj/machinery/light_switch/directional/west, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/rd) "scB" = ( /obj/structure/chair/office/light, /turf/open/floor/iron/white, @@ -50287,14 +50579,13 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"sdL" = ( -/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) +"sdW" = ( +/obj/structure/sign/warning/radiation/rad_area/directional/north, +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/gravity_generator) "see" = ( /obj/machinery/door/airlock/maintenance, /obj/machinery/atmospherics/pipe/smart/simple/orange/hidden{ @@ -50325,13 +50616,6 @@ /obj/structure/sign/warning/electric_shock/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"sfl" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/structure/bodycontainer/morgue{ - dir = 2 - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) "sfn" = ( /obj/effect/spawner/random/structure/grille, /obj/effect/mapping_helpers/broken_floor, @@ -50372,15 +50656,15 @@ }, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"sfO" = ( -/obj/structure/rack{ - icon = 'icons/obj/stationobjs.dmi'; - icon_state = "minibar"; - name = "skeletal minibar" +"sfK" = ( +/obj/structure/closet{ + name = "evidence closet 1" }, -/obj/item/storage/fancy/candle_box, -/turf/open/floor/engine/cult, -/area/station/service/library) +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/evidence) "sgc" = ( /obj/structure/table/reinforced, /obj/item/paper_bin{ @@ -50390,18 +50674,18 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"sgk" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +"sgh" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 5 }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/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, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/engineering/atmos) "sgv" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -50418,16 +50702,6 @@ /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron, /area/station/science/research) -"sgS" = ( -/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) "sgX" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 4 @@ -50444,6 +50718,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/fore) "shl" = ( @@ -50493,13 +50768,6 @@ }, /turf/open/floor/iron, /area/station/engineering/main) -"shY" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/landmark/start/coroner, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "sie" = ( /obj/effect/turf_decal/stripes/corner, /obj/structure/cable, @@ -50513,6 +50781,11 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"siy" = ( +/obj/machinery/vending/wardrobe/atmos_wardrobe, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "siz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, @@ -50574,6 +50847,13 @@ }, /turf/open/floor/wood/parquet, /area/station/medical/psychology) +"sjB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/l3closet/janitor, +/obj/machinery/light/small/directional/east, +/obj/item/clothing/gloves/color/orange, +/turf/open/floor/iron, +/area/station/service/janitor) "sjM" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -50608,6 +50888,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/science/lab) +"skW" = ( +/obj/effect/spawner/structure/window/reinforced/tinted, +/turf/open/floor/plating, +/area/station/medical/morgue) "slc" = ( /obj/effect/decal/cleanable/dirt, /obj/vehicle/ridden/janicart, @@ -50620,6 +50904,12 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/medical) +"sls" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/light/floor, +/turf/open/floor/iron/white, +/area/station/science/xenobiology/hallway) "sly" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -50658,7 +50948,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /obj/machinery/door/airlock/public/glass/incinerator/atmos_exterior, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "smt" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{ @@ -50804,24 +51094,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"sqb" = ( -/obj/structure/rack, -/obj/item/reagent_containers/cup/bottle/ethanol{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/carbon{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/chlorine{ - pixel_x = 1 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark/textured_edge{ - dir = 8 - }, -/area/station/medical/medbay/central) "sqt" = ( /obj/machinery/disposal/delivery_chute{ dir = 1; @@ -50873,13 +51145,8 @@ /turf/open/floor/plating, /area/station/maintenance/port/aft) "sri" = ( -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/turf/open/floor/holofloor/dark, +/obj/machinery/duct, +/turf/open/floor/iron/dark/textured_large, /area/station/science/cytology) "srk" = ( /obj/structure/sign/warning/electric_shock, @@ -50896,21 +51163,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/central) -"sru" = ( -/obj/item/radio/intercom/directional/west, -/obj/structure/bodycontainer/morgue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"srx" = ( -/obj/machinery/light/no_nightlight/directional/east, -/obj/machinery/atmospherics/pipe/layer_manifold/cyan/visible, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner, -/area/station/engineering/atmos/pumproom) "srK" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 8 @@ -50966,12 +51218,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/grimy, /area/station/security/office) -"ssw" = ( -/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) "ssI" = ( /obj/machinery/power/emitter, /turf/open/floor/plating, @@ -50981,35 +51227,12 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/fore) -"stk" = ( -/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) "stl" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"stq" = ( -/obj/machinery/firealarm/directional/north, -/obj/machinery/light/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Chemistry North"; - network = list("ss13","medbay") - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "stw" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/reagent_dispensers/watertank, @@ -51050,6 +51273,16 @@ }, /turf/open/floor/carpet, /area/station/commons/vacant_room/office) +"stZ" = ( +/obj/structure/table/glass, +/obj/machinery/light_switch/directional/west, +/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) "suj" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/binary/pump{ @@ -51058,14 +51291,6 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"suz" = ( -/obj/effect/decal/cleanable/dirt, -/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) "suD" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -51130,6 +51355,23 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/engine) +"svp" = ( +/obj/effect/landmark/start/paramedic, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/white/smooth_large, +/area/station/medical/medbay/central) +"svK" = ( +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 6 + }, +/obj/structure/sign/warning/fire/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "svP" = ( /obj/machinery/conveyor{ dir = 1; @@ -51199,6 +51441,11 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"swP" = ( +/obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "swR" = ( /obj/machinery/door/airlock{ name = "Cleaning Closet" @@ -51215,15 +51462,6 @@ }, /turf/open/floor/iron/white, /area/station/science/research) -"sxd" = ( -/obj/machinery/light/directional/east, -/obj/structure/cable, -/obj/structure/sign/poster/official/random/directional/east, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white/corner, -/area/station/hallway/secondary/entry) "sxf" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -51245,13 +51483,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) -"sxs" = ( -/obj/machinery/power/shieldwallgen, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/window/spawner/directional/north, -/turf/open/floor/iron/dark, -/area/station/command/teleporter) "sxA" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/cable, @@ -51270,6 +51501,18 @@ /obj/machinery/computer/security/wooden_tv, /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) +"sxX" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/firealarm/directional/south, +/obj/structure/table/wood, +/obj/item/stack/sheet/cloth/ten, +/obj/item/toy/crayon/spraycan, +/obj/item/stack/rods/ten, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood/large, +/area/station/service/theater) "syc" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -51284,12 +51527,6 @@ "syo" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/captain/private) -"syr" = ( -/obj/structure/table, -/obj/item/electronics/apc, -/obj/item/electronics/airlock, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "syC" = ( /obj/structure/table/glass, /obj/effect/turf_decal/trimline/purple/corner, @@ -51363,15 +51600,14 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/white, /area/station/science/cytology) -"syX" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Engineering Supermatter Fore"; - network = list("ss13","engine") - }, -/obj/machinery/firealarm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, -/turf/open/floor/iron/dark, -/area/station/engineering/supermatter/room) +"sza" = ( +/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/item/radio/intercom/directional/west, +/turf/open/floor/iron/white, +/area/station/science/research) "szk" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -51384,6 +51620,16 @@ "szp" = ( /turf/closed/wall, /area/station/commons/fitness/recreation) +"szu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=8"; + location = "QM #2" + }, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "szJ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/start/janitor, @@ -51397,11 +51643,13 @@ /obj/machinery/telecomms/server/presets/engineering, /turf/open/floor/circuit/telecomms/mainframe, /area/station/tcommsat/server) -"sAs" = ( -/obj/machinery/light/directional/west, -/obj/machinery/status_display/evac/directional/west, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) +"sAv" = ( +/obj/machinery/stasis, +/obj/machinery/defibrillator_mount/directional/north, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "sAz" = ( /obj/machinery/computer/monitor{ name = "Bridge Power Monitoring Console" @@ -51426,13 +51674,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/genetics) -"sAX" = ( -/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, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "sBa" = ( /obj/structure/bed, /obj/effect/decal/cleanable/cobweb/cobweb2, @@ -51499,14 +51740,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, /area/station/security/lockers) -"sCk" = ( -/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) "sCl" = ( /obj/structure/lattice/catwalk, /obj/structure/chair/stool/bar/directional/south, @@ -51519,15 +51752,14 @@ /area/station/engineering/atmospherics_engine) "sCv" = ( /obj/effect/turf_decal/delivery, -/obj/machinery/door/window/left/directional/north{ - dir = 8; - name = "Containment Pen #5"; - req_access = list("xenobiology") - }, /obj/machinery/door/poddoor/preopen{ id = "xenobio5"; name = "Xenobio Pen 5 Blast Door" }, +/obj/machinery/door/window/right/directional/west{ + name = "Containment Pen #5"; + req_access = list("xenobiology") + }, /turf/open/floor/iron, /area/station/science/xenobiology) "sCz" = ( @@ -51569,22 +51801,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"sDj" = ( -/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/machinery/light/small/directional/east, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/command/corporate_showroom) "sDo" = ( /obj/structure/cable, /obj/effect/landmark/event_spawn, @@ -51598,22 +51814,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"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) "sDC" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -51646,6 +51846,21 @@ /obj/effect/mapping_helpers/airlock/access/any/command/hop, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) +"sDK" = ( +/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 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/lockers) "sDQ" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, @@ -51661,6 +51876,18 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/warden) +"sDT" = ( +/obj/machinery/door/window{ + name = "Secure Art Exhibition"; + req_access = list("library") + }, +/obj/structure/table/wood/fancy/royalblue, +/obj/structure/sign/painting/large/library{ + dir = 1 + }, +/obj/structure/window/spawner/directional/west, +/turf/open/floor/wood, +/area/station/service/library) "sEk" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/structure/cable, @@ -51672,13 +51899,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"sEn" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/tile/neutral{ +"sEv" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) +/obj/structure/extinguisher_cabinet/directional/south, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "sEx" = ( /obj/machinery/button/door/directional/east{ id = "kitchen_counter"; @@ -51738,25 +51967,56 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"sFo" = ( +/obj/machinery/button/crematorium{ + id = "crematoriumChapel"; + pixel_x = -26 + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) "sFw" = ( /turf/open/floor/iron/chapel, /area/station/service/chapel) +"sFz" = ( +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/disposaloutlet{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "sFB" = ( -/turf/open/floor/wood/large, -/area/station/commons/lounge) -"sGc" = ( -/obj/machinery/pdapainter{ - pixel_y = 2 +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/navigate_destination/kitchen, +/obj/effect/mapping_helpers/airlock/access/any/service/bar, +/obj/effect/mapping_helpers/airlock/access/any/service/kitchen, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/obj/machinery/requests_console/directional/north{ - department = "Head of Personnel's Desk"; - name = "Head of Personnel's Requests Console" +/obj/machinery/door/airlock/public{ + name = "Kitchen" }, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) +/turf/open/floor/iron, +/area/station/service/kitchen) +"sFY" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/structure/sign/departments/psychology/directional/west, +/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/medical/medbay/central) "sGm" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -51791,6 +52051,16 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/engineering/supermatter/room) +"sGH" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "sGL" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -51931,8 +52201,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/holofloor/dark, +/obj/machinery/plumbing/growing_vat{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_large, /area/station/science/cytology) "sKs" = ( /obj/structure/closet/bombcloset/security, @@ -51948,16 +52220,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/storage/tools) -"sKG" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/disposalpipe/segment{ +"sKD" = ( +/obj/effect/turf_decal/stripes/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/dark, -/area/station/medical/morgue) +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) "sKJ" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -51992,6 +52263,22 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/hallway/primary/central) +"sLF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Science Research"; + network = list("ss13","rd") + }, +/obj/machinery/light/small/directional/south, +/obj/structure/noticeboard/rd{ + pixel_y = -32 + }, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/science/lab) "sLN" = ( /obj/effect/landmark/start/ai/secondary, /obj/item/radio/intercom/directional/north{ @@ -52024,6 +52311,19 @@ }, /turf/open/floor/circuit/green, /area/station/ai_monitored/turret_protected/ai) +"sMb" = ( +/obj/machinery/airalarm/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Atmospherics - Port-Aft" + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/engineering/atmos) "sMe" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 4 @@ -52038,13 +52338,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) -"sMu" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ +"sMo" = ( +/obj/structure/sign/poster/official/cleanliness/directional/west, +/obj/structure/sink/directional/south, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ dir = 1 }, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron, -/area/station/security/brig) +/obj/structure/mirror/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/virology) "sMB" = ( /obj/machinery/door/window/brigdoor/security/cell{ id = "Cell 1"; @@ -52095,20 +52397,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"sNw" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Air to External Air Ports" - }, -/obj/machinery/light_switch/directional/north, -/obj/machinery/light/no_nightlight/directional/north, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos) "sNx" = ( /obj/machinery/telecomms/receiver/preset_left, /turf/open/floor/circuit/green/telecomms/mainframe, @@ -52171,6 +52459,12 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"sOw" = ( +/obj/structure/sink/directional/south, +/mob/living/basic/mouse/brown/tom, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/plating, +/area/station/security/prison/safe) "sOF" = ( /obj/structure/light_construct/directional/east, /turf/open/floor/wood, @@ -52223,8 +52517,28 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/security/hos, +/obj/effect/landmark/navigate_destination, /turf/open/floor/wood, /area/station/command/heads_quarters/hos) +"sPq" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"sPy" = ( +/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/sign/xenobio_guide/directional/north, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "sPB" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/delivery, @@ -52235,24 +52549,6 @@ /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/white, /area/station/science/explab) -"sPL" = ( -/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/plating, -/area/station/maintenance/port/fore) -"sPU" = ( -/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) "sPV" = ( /obj/structure/closet/secure_closet/captains, /obj/structure/window/reinforced/spawner/directional/north, @@ -52325,6 +52621,7 @@ /area/station/maintenance/port) "sRa" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/white, /area/station/science/cytology) "sRf" = ( @@ -52357,15 +52654,21 @@ /area/station/command/heads_quarters/qm) "sRJ" = ( /obj/structure/extinguisher_cabinet/directional/east, -/obj/item/kirbyplants{ - icon_state = "plant-16" - }, +/obj/item/kirbyplants/organic/plant16, /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) +"sRL" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "sRT" = ( /obj/structure/cable, /turf/open/floor/wood, @@ -52382,11 +52685,30 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) -"sRZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/iv_drip, -/turf/open/floor/plating, -/area/station/medical/abandoned) +"sRY" = ( +/obj/machinery/vending/dinnerware, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 5 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"sSh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/bluespace_vendor/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "sSn" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock/maintenance, @@ -52444,35 +52766,12 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"sSN" = ( -/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) "sSV" = ( /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) -"sTe" = ( -/obj/structure/table, -/obj/machinery/camera/directional/north{ - c_tag = "Medbay Paramedic Dispatch"; - name = "medical camera"; - network = list("ss13","medical") - }, -/obj/machinery/fax{ - fax_name = "Medical"; - name = "Medical Fax Machine" - }, -/turf/open/floor/iron/dark, -/area/station/medical/office) "sTh" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -52481,15 +52780,6 @@ }, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/entry) -"sTi" = ( -/obj/machinery/light_switch/directional/west, -/obj/structure/table/wood, -/obj/machinery/fax{ - fax_name = "Detective's Office"; - name = "Detective's Fax Machine" - }, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) "sTq" = ( /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, @@ -52503,18 +52793,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"sTI" = ( -/obj/machinery/light/no_nightlight/directional/east, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, -/obj/structure/window/spawner/directional/north, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"sTN" = ( -/obj/effect/turf_decal/siding/purple, +"sTK" = ( +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/white, -/area/station/science/ordnance/storage) +/area/station/command/heads_quarters/cmo) "sTQ" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 1 }, @@ -52524,6 +52809,13 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"sTW" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "sTY" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -52533,13 +52825,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"sUi" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/obj/machinery/newscaster/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) "sUm" = ( /obj/structure/cable, /obj/effect/landmark/start/hangover, @@ -52548,14 +52833,14 @@ "sUo" = ( /turf/open/floor/engine/air, /area/station/engineering/atmos) -"sUp" = ( -/obj/structure/table/optable, -/obj/structure/noticeboard/directional/east, -/obj/effect/turf_decal/tile/purple/half/contrasted{ +"sUx" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/turf/open/floor/iron/white, -/area/station/science/robotics/lab) +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "sUy" = ( /obj/structure/table/wood, /obj/structure/sign/picture_frame/showroom/one{ @@ -52650,7 +52935,7 @@ /area/station/ai_monitored/command/storage/satellite) "sVz" = ( /obj/machinery/airalarm/directional/west, -/obj/machinery/modular_computer/console/preset/command, +/obj/machinery/modular_computer/preset/command, /obj/structure/cable, /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ dir = 1 @@ -52774,14 +53059,15 @@ }, /turf/open/floor/iron, /area/station/engineering/main) -"sXq" = ( +"sXm" = ( +/obj/machinery/seed_extractor, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/obj/machinery/computer/atmos_control/nocontrol/incinerator{ - dir = 4 +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 }, +/obj/machinery/light/small/directional/north, /turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/area/station/security/prison/garden) "sXr" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -52803,12 +53089,9 @@ /obj/machinery/door/airlock/command{ name = "Quartermaster's Office" }, +/obj/effect/landmark/navigate_destination, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) -"sXE" = ( -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/service/library) "sXF" = ( /obj/effect/turf_decal/trimline/purple/line{ dir = 1 @@ -52863,15 +53146,33 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) -"sYH" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/turf_decal/tile/blue{ +"sZa" = ( +/obj/machinery/light_switch/directional/north, +/obj/effect/turf_decal/siding/wood, +/obj/effect/landmark/start/clown, +/obj/structure/chair/wood/wings{ dir = 8 }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood/large, +/area/station/service/theater) +"sZi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/modular_computer/preset/cargochat/service{ + dir = 8 + }, +/obj/structure/sign/poster/random/directional/east, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) +"sZo" = ( +/obj/machinery/light/directional/north, +/obj/structure/reagent_dispensers/watertank/high, +/obj/item/reagent_containers/cup/watering_can, +/obj/effect/turf_decal/stripes/line, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/iron, +/area/station/service/hydroponics) "sZH" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 1 @@ -52928,6 +53229,24 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/port) +"taq" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/effect/turf_decal/trimline/brown/line, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/landmark/start/bitrunner, +/turf/open/floor/iron/dark/textured_half, +/area/station/bitrunning/den) "tar" = ( /obj/machinery/medical_kiosk, /obj/effect/turf_decal/tile/blue/half/contrasted, @@ -52972,6 +53291,8 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/aft/greater) "taZ" = ( @@ -52985,6 +53306,15 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"tbl" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Kitchen" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/commons/lounge) "tbp" = ( /obj/machinery/door/airlock/command/glass{ name = "Server Access" @@ -53030,6 +53360,10 @@ /obj/machinery/coffeemaker/impressa, /turf/open/floor/iron/dark, /area/station/service/cafeteria) +"tcu" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/security/courtroom) "tcx" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -53088,18 +53422,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/cargo/drone_bay) -"tdj" = ( -/obj/effect/landmark/start/hangover, -/obj/machinery/bluespace_vendor/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"tdl" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "tds" = ( /obj/effect/turf_decal/box/corners{ dir = 8 @@ -53122,14 +53444,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/disposal) -"tem" = ( -/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) "tep" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/cable, @@ -53167,12 +53481,6 @@ dir = 4 }, /area/station/service/chapel) -"teR" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/table/optable, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "teY" = ( /obj/machinery/light/directional/east, /obj/machinery/camera/autoname/directional/east, @@ -53185,18 +53493,6 @@ /obj/machinery/field/generator, /turf/open/floor/plating, /area/station/engineering/main) -"tfn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "tfs" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ @@ -53264,38 +53560,19 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"tgn" = ( +/obj/machinery/vending/medical, +/obj/machinery/light/cold/directional/south, +/obj/machinery/newscaster/directional/south, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "tgo" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"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/machinery/light/directional/west, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "tgC" = ( /obj/structure/noticeboard/directional/south, /obj/structure/table/wood, @@ -53317,6 +53594,12 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) +"tgI" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central) "thc" = ( /obj/machinery/camera/directional/east{ c_tag = "Gravity Generator Room" @@ -53335,6 +53618,22 @@ dir = 1 }, /area/station/engineering/atmos/pumproom) +"thw" = ( +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) "thQ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -53517,6 +53816,12 @@ /obj/structure/sign/warning/docking, /turf/closed/wall, /area/space/nearstation) +"tlI" = ( +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/chapel{ + dir = 8 + }, +/area/station/service/chapel) "tlK" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -53596,20 +53901,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/toilet/auxiliary) -"tmJ" = ( -/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) "tmK" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -53665,16 +53956,16 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) -"tnN" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Medbay Storage"; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 +"tnG" = ( +/obj/effect/decal/cleanable/dirt, +/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/storage) +/area/station/medical/abandoned) "tnP" = ( /obj/machinery/firealarm/directional/east, /obj/machinery/camera/directional/east{ @@ -53685,19 +53976,6 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"tok" = ( -/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) "tot" = ( /obj/structure/table/wood, /obj/item/paper_bin{ @@ -53721,7 +53999,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/holofloor/dark, +/turf/open/floor/iron/dark/textured_large, /area/station/science/cytology) "toV" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, @@ -53753,20 +54031,6 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"tpr" = ( -/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) -"tpC" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/junction{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "tpD" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -53799,6 +54063,12 @@ /obj/effect/mapping_helpers/airlock/access/all/service/kitchen, /turf/open/floor/iron/cafeteria, /area/station/hallway/secondary/service) +"tqh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/dim/directional/east, +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) "tql" = ( /obj/structure/rack, /obj/item/clothing/mask/animal/horsehead, @@ -53814,20 +54084,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"tqI" = ( -/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) "tqU" = ( /obj/structure/cable, /obj/machinery/door/firedoor, @@ -53886,16 +54142,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) -"trM" = ( -/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) "tsd" = ( /turf/closed/wall, /area/station/maintenance/space_hut) @@ -53933,10 +54179,13 @@ /obj/item/knife/kitchen, /turf/open/floor/iron/white, /area/station/science/cytology) -"tsP" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) +"tsT" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "tsZ" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/visible, /obj/structure/lattice/catwalk, @@ -53955,22 +54204,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/orange/visible, /turf/closed/wall/r_wall, /area/station/engineering/atmos) -"ttA" = ( -/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) "ttE" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -53979,13 +54212,30 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"ttF" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 6 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Kitchen" + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "ttG" = ( -/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) +/obj/machinery/netpod, +/obj/effect/decal/cleanable/robot_debris, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/bitrunning/den) "ttM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -53996,9 +54246,11 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "ttW" = ( -/obj/effect/spawner/random/structure/chair_flipped, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/atmospherics/components/binary/pump/on/supply/hidden/layer4{ + dir = 8 + }, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) "ttX" = ( @@ -54033,13 +54285,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"tuo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible/layer5, -/obj/machinery/light/no_nightlight/directional/south, -/obj/structure/sign/poster/official/wtf_is_co2/directional/south, -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "tuu" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -54122,19 +54367,15 @@ /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 4 }, +/obj/effect/turf_decal/siding/purple{ + dir = 1 + }, /turf/open/floor/iron/white, /area/station/science/cytology) "twy" = ( /obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"twF" = ( -/obj/effect/turf_decal/siding/white{ - dir = 8 - }, -/obj/machinery/recharge_station, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "twN" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -54191,13 +54432,6 @@ }, /turf/open/floor/iron, /area/station/commons/locker) -"txv" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "txz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -54228,7 +54462,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/holofloor/dark, +/turf/open/floor/iron/dark/textured_large, /area/station/science/cytology) "tyy" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -54238,7 +54472,7 @@ dir = 1 }, /turf/open/floor/iron/textured, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) "tyE" = ( /obj/structure/table/glass, /obj/item/phone{ @@ -54260,18 +54494,6 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/grass, /area/station/science/genetics) -"tzi" = ( -/obj/structure/table/wood, -/obj/item/staff/broom, -/obj/item/wrench, -/obj/machinery/airalarm/directional/east, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/wood/large, -/area/station/service/theater) "tzq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -54301,11 +54523,11 @@ /area/station/medical/medbay/central) "tzI" = ( /obj/structure/table/reinforced, -/obj/item/roller, -/obj/item/roller{ +/obj/item/emergency_bed, +/obj/item/emergency_bed{ pixel_y = 3 }, -/obj/item/roller{ +/obj/item/emergency_bed{ pixel_y = 6 }, /obj/structure/window/spawner/directional/west, @@ -54346,6 +54568,14 @@ }, /turf/open/floor/iron/white/corner, /area/station/hallway/primary/aft) +"tAy" = ( +/obj/machinery/photocopier, +/obj/machinery/camera/directional/east{ + c_tag = "Law Office" + }, +/obj/machinery/light/directional/east, +/turf/open/floor/wood, +/area/station/service/lawoffice) "tAD" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -54405,14 +54635,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/structure/table, -/obj/item/reagent_containers/cup/beaker/large, -/obj/item/reagent_containers/cup/beaker{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/reagent_containers/cup/rag{ - pixel_x = -4 +/obj/machinery/deepfryer, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 5 }, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) @@ -54434,12 +54659,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/central) -"tBB" = ( -/obj/machinery/light/directional/west, -/obj/machinery/recharge_station, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron, -/area/station/science/robotics/mechbay) "tBJ" = ( /turf/closed/wall, /area/station/medical/abandoned) @@ -54482,13 +54701,9 @@ /turf/open/floor/iron, /area/station/security/prison/garden) "tCG" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, /obj/effect/landmark/navigate_destination, /turf/open/floor/iron, -/area/station/security/brig) +/area/station/engineering/atmos) "tCJ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -54516,15 +54731,10 @@ /obj/effect/spawner/random/techstorage/engineering_all, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) -"tDz" = ( -/obj/machinery/light/directional/south, -/obj/machinery/status_display/door_timer{ - id = "Cell 1"; - name = "Cell 1"; - pixel_y = -32 - }, -/turf/open/floor/iron, -/area/station/security/brig) +"tDn" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) "tDN" = ( /obj/structure/chair{ dir = 8 @@ -54547,6 +54757,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"tDZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/box, +/obj/effect/spawner/random/maintenance/two, +/obj/structure/sign/poster/contraband/lizard/directional/west, +/obj/item/toy/plush/lizard_plushie/green{ + name = "Tends-the-Wounds" + }, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) "tEj" = ( /obj/machinery/firealarm/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -54562,6 +54782,10 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"tEm" = ( +/obj/structure/broken_flooring/pile/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "tEr" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -54578,8 +54802,6 @@ /turf/open/floor/plating, /area/station/science/research) "tEy" = ( -/obj/structure/sink/kitchen/directional/west, -/obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -54603,13 +54825,13 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"tGu" = ( -/obj/machinery/computer/operating{ - dir = 1 +"tGI" = ( +/obj/machinery/light_switch/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) +/turf/open/floor/wood, +/area/station/service/lawoffice) "tGL" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -54622,8 +54844,7 @@ /area/station/hallway/primary/central) "tGS" = ( /obj/structure/cable, -/obj/machinery/door/window/left/directional/north{ - dir = 2; +/obj/machinery/door/window/left/directional/south{ name = "Containment Pen #2"; req_access = list("xenobiology") }, @@ -54678,6 +54899,21 @@ /obj/structure/cable/multilayer/connected, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) +"tIb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/watertank, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "tId" = ( /obj/effect/decal/cleanable/blood/old, /obj/machinery/camera/directional/east{ @@ -54778,14 +55014,14 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"tJd" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ +"tJo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/light/directional/south, -/obj/machinery/module_duplicator, -/turf/open/floor/iron/white, -/area/station/science/explab) +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/medical/coldroom) "tJr" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -54874,13 +55110,6 @@ "tKE" = ( /turf/closed/wall, /area/station/security/checkpoint/engineering) -"tKM" = ( -/obj/machinery/airalarm/directional/south, -/obj/machinery/computer/mech_bay_power_console{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/science/robotics/mechbay) "tKN" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -54949,26 +55178,6 @@ }, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) -"tLo" = ( -/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 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) "tLv" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -55044,6 +55253,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"tMS" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/contraband/random/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "tNg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55056,16 +55272,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/warden) +"tNt" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/modular_computer/preset/curator{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/service/library) "tNu" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/engine, /area/station/science/xenobiology) -"tNw" = ( -/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) "tNC" = ( /obj/structure/table/wood, /obj/structure/sign/picture_frame/showroom/three{ @@ -55131,6 +55349,14 @@ }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) +"tOd" = ( +/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/engineering/gravity_generator) "tOg" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -55163,13 +55389,37 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/medical/virology) -"tOQ" = ( -/obj/structure/reagent_dispensers/watertank/high, -/obj/item/reagent_containers/cup/watering_can, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/service/hydroponics) +"tOT" = ( +/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/north{ + id = "main_surgery"; + name = "privacy shutters control" + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"tOV" = ( +/obj/effect/decal/cleanable/dirt, +/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) +"tOX" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) "tOZ" = ( /obj/item/radio/intercom/directional/west, /obj/structure/frame/computer{ @@ -55192,6 +55442,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/main) +"tPe" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/wood, +/area/station/service/library) "tPw" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -55245,11 +55502,6 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/virology, /turf/open/floor/iron/white, /area/station/medical/virology) -"tRb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port) "tRt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -55323,19 +55575,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"tTo" = ( -/obj/machinery/computer/atmos_alert{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/sign/poster/official/safety_internals/directional/south, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/dark/corner, -/area/station/engineering/atmos/storage/gas) "tTB" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/on/layer2, /obj/structure/window/reinforced/spawner/directional/south, @@ -55365,6 +55604,14 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron/dark, /area/station/command/bridge) +"tTP" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/effect/spawner/random/armory/barrier_grenades, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "tTT" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, @@ -55410,6 +55657,17 @@ "tUn" = ( /turf/closed/wall, /area/station/maintenance/starboard/lesser) +"tUt" = ( +/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/item/radio/intercom/directional/east, +/turf/open/floor/iron, +/area/station/service/hydroponics) "tUu" = ( /obj/structure/disposalpipe/junction{ dir = 4 @@ -55518,16 +55776,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"tVv" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 6 - }, -/obj/structure/table, -/obj/item/clipboard, -/obj/item/holosign_creator/atmos, -/obj/item/holosign_creator/atmos, -/turf/open/floor/iron/white, -/area/station/science/ordnance/office) "tVy" = ( /obj/structure/noticeboard/directional/north{ desc = "A memorial wall for pinning mementos upon."; @@ -55537,6 +55785,24 @@ /obj/structure/table/wood, /turf/open/floor/carpet, /area/station/service/chapel/funeral) +"tVC" = ( +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/flasher/directional/north{ + id = "AI"; + pixel_x = -22 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"tVG" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room) "tVP" = ( /obj/machinery/light/no_nightlight/directional/east, /turf/open/floor/iron/dark, @@ -55568,6 +55834,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"tWj" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "tWq" = ( /obj/effect/spawner/random/trash/janitor_supplies, /obj/effect/mapping_helpers/broken_floor, @@ -55585,15 +55861,6 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, /area/station/maintenance/fore) -"tWJ" = ( -/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) "tWL" = ( /obj/structure/rack, /obj/effect/spawner/random/clothing/costume, @@ -55619,6 +55886,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) +"tXl" = ( +/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, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "tXx" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 8 @@ -55656,17 +55934,6 @@ /obj/machinery/vending/dinnerware, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"tYc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, -/obj/machinery/status_display/evac/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "tYi" = ( /turf/open/floor/plating, /area/station/maintenance/port) @@ -55766,12 +56033,11 @@ /obj/item/canvas/twentythree_twentythree, /turf/open/floor/iron, /area/station/commons/storage/tools) -"tZS" = ( -/obj/structure/flora/bush/jungle/b/style_random, -/obj/structure/flora/bush/flowers_pp/style_random, -/obj/machinery/light/directional/east, -/turf/open/floor/grass, -/area/station/medical/virology) +"tZX" = ( +/obj/structure/window/spawner/directional/west, +/obj/machinery/light/floor, +/turf/open/floor/carpet, +/area/station/service/theater) "uac" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -55830,6 +56096,16 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) +"uaG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/machinery/computer/atmos_control/nocontrol/incinerator{ + dir = 4 + }, +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "uaN" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -55840,6 +56116,27 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/engine, /area/station/science/cytology) +"uaS" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/service/chapel/office) "ubd" = ( /obj/structure/sink/directional/west, /turf/open/floor/iron/white, @@ -55869,6 +56166,7 @@ /turf/open/floor/plating, /area/station/maintenance/port) "ubs" = ( +/obj/structure/cable, /turf/open/floor/iron/white/side{ dir = 4 }, @@ -55900,6 +56198,34 @@ }, /turf/open/floor/iron, /area/station/commons/storage/tools) +"ubF" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/item/reagent_containers/cup/beaker/large, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/cup/bottle/epinephrine{ + pixel_x = -4; + pixel_y = 12 + }, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = 7; + pixel_y = 12 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/machinery/light/small/directional/south, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"ubQ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "ucc" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 1 @@ -55909,7 +56235,7 @@ c_tag = "Medbay Virology Wing"; network = list("ss13","medbay") }, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "ucd" = ( @@ -55944,29 +56270,6 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) -"ucE" = ( -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"ucI" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) -"ucU" = ( -/obj/machinery/light/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Starboard Primary Hallway - Engineering" - }, -/obj/structure/sign/directions/engineering{ - dir = 4; - pixel_y = -24 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "ude" = ( /obj/machinery/holopad, /obj/effect/turf_decal/box/white{ @@ -56088,6 +56391,18 @@ }, /turf/open/floor/iron, /area/station/security/office) +"uew" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave{ + pixel_y = 6 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/checker, +/area/station/engineering/storage_shared) "ueB" = ( /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/tile/yellow/half/contrasted, @@ -56113,24 +56428,6 @@ /obj/effect/mapping_helpers/requests_console/assistance, /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) -"ueG" = ( -/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) -"ueR" = ( -/obj/item/book/bible, -/obj/machinery/light/small/directional/north, -/obj/machinery/newscaster/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) "ufv" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -56139,18 +56436,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"ufX" = ( -/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) "uga" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, @@ -56177,28 +56462,6 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/entry) -"ugE" = ( -/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) -"ugJ" = ( -/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) "ugP" = ( /obj/effect/turf_decal/box/corners{ dir = 4 @@ -56229,6 +56492,10 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) +"uht" = ( +/obj/machinery/vending/tool, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "uhu" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -56243,6 +56510,15 @@ /obj/machinery/meter, /turf/open/floor/iron, /area/station/engineering/atmos) +"uhI" = ( +/obj/structure/cable, +/obj/effect/landmark/event_spawn, +/obj/machinery/requests_console/directional/north{ + department = "Security"; + name = "Security Requests Console" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) "uhP" = ( /obj/structure/chair/stool/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56287,6 +56563,12 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) +"uiw" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/morgue) "uiB" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -56302,6 +56584,30 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) +"uiM" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"uiR" = ( +/obj/machinery/portable_atmospherics/canister/anesthetic_mix, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/kitchen_coldroom, +/area/station/medical/coldroom) "ujk" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /obj/effect/turf_decal/siding/purple{ @@ -56374,32 +56680,13 @@ /turf/open/floor/iron, /area/station/hallway/secondary/service) "uky" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/condiment/saltshaker{ - pixel_x = -3 - }, -/obj/item/reagent_containers/condiment/peppermill{ - pixel_x = 3 - }, +/obj/machinery/smartfridge/drinks, +/obj/effect/turf_decal/tile/bar/opposingcorners, /obj/effect/turf_decal/siding/wood{ - dir = 4 + dir = 1 }, -/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) -"ukN" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white/smooth_large, -/area/station/medical/medbay/central) -"ulb" = ( -/obj/item, -/turf/closed/wall/r_wall, -/area/station/maintenance/solars/port/aft) "ulv" = ( /obj/effect/turf_decal/stripes/white/line, /obj/effect/turf_decal/stripes/white/line{ @@ -56429,51 +56716,13 @@ /turf/open/floor/iron/white, /area/station/medical/chemistry) "ulX" = ( -/obj/machinery/lapvend, /obj/structure/cable, /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 1 }, +/obj/machinery/vending/modularpc, /turf/open/floor/iron/white, /area/station/science/lobby) -"umI" = ( -/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) -"umN" = ( -/obj/structure/closet/crate, -/obj/item/reagent_containers/cup/bowl, -/obj/effect/spawner/random/contraband/prison, -/obj/item/reagent_containers/cup/bowl, -/obj/item/reagent_containers/cup/bowl, -/obj/item/reagent_containers/cup/bowl, -/obj/item/reagent_containers/cup/bowl, -/obj/item/reagent_containers/cup/bowl, -/obj/item/reagent_containers/cup/bowl, -/obj/item/reagent_containers/cup/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/machinery/light/directional/west, -/obj/effect/turf_decal/tile/red/opposingcorners, -/turf/open/floor/iron/white, -/area/station/security/prison/mess) "umS" = ( /obj/item/radio/intercom/directional/west, /obj/machinery/computer/records/security{ @@ -56509,6 +56758,23 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"unt" = ( +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/obj/machinery/light/directional/east, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"unw" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/carpet, +/area/station/commons/dorms) "uny" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral{ @@ -56536,14 +56802,6 @@ }, /turf/open/floor/wood, /area/station/commons/vacant_room/office) -"uod" = ( -/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) "uoe" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -56576,6 +56834,31 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/cargo/storage) +"uou" = ( +/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) "uoM" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/secure_closet/brig{ @@ -56593,15 +56876,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"upm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/skub{ - name = "medicinal skub" - }, -/obj/item/toy/cattoy, -/turf/open/floor/plating, -/area/station/medical/abandoned) "upR" = ( /obj/structure/table, /obj/machinery/recharger{ @@ -56621,13 +56895,6 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/iron/white, /area/station/science/explab) -"upZ" = ( -/obj/item/radio/intercom/directional/north, -/obj/machinery/light/small/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) "uqi" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -56640,6 +56907,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/engineering/aux_base, /obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/effect/landmark/navigate_destination, /turf/open/floor/iron, /area/station/construction/mining/aux_base) "uqp" = ( @@ -56659,6 +56927,10 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/white, /area/station/science/research) +"uqA" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "uqL" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -56792,13 +57064,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating, /area/station/engineering/atmos) -"usw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) "usA" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56820,6 +57085,16 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/storage) +"usD" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Departure Lounge - Starboard Aft" + }, +/obj/item/kirbyplants/organic/plant16, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "usK" = ( /obj/structure/table, /obj/item/storage/toolbox/emergency, @@ -56889,6 +57164,19 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) +"utE" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Theater - Stage" + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/item/radio/intercom/directional/east, +/obj/structure/table/wood, +/obj/item/clothing/glasses/monocle, +/obj/structure/sign/poster/random/directional/south, +/turf/open/floor/wood/large, +/area/station/service/theater) "utM" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=13.3-Engineering-Central"; @@ -56904,6 +57192,7 @@ /obj/effect/landmark/start/hangover, /obj/structure/cable, /obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/firealarm/directional/east, /turf/open/floor/iron, /area/station/service/bar) "uuc" = ( @@ -56929,6 +57218,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) +"uuz" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/station/commons/dorms) "uuD" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56947,14 +57243,6 @@ }, /turf/open/floor/plating, /area/station/cargo/storage) -"uvx" = ( -/obj/machinery/airalarm/directional/east, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white/corner, -/area/station/hallway/secondary/entry) "uvC" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -57004,40 +57292,11 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/engineering/main) -"uwg" = ( -/obj/structure/rack, -/obj/machinery/light/directional/west, -/obj/item/clothing/head/helmet/toggleable/riot{ - pixel_x = 3; - pixel_y = 2 - }, -/obj/item/clothing/head/helmet/toggleable/riot{ - pixel_y = 2 - }, -/obj/item/clothing/head/helmet/toggleable/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) "uwh" = ( /obj/structure/chair/comfy{ dir = 1 }, -/obj/item/clothing/suit/costume/nerdshirt, +/obj/item/clothing/suit/costume/wellworn_shirt/messy/graphic/gamer, /obj/item/clothing/head/fedora, /turf/open/floor/plating, /area/station/maintenance/port/aft) @@ -57083,15 +57342,6 @@ /obj/effect/landmark/start/roboticist, /turf/open/floor/iron, /area/station/science/robotics/lab) -"uwP" = ( -/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) "uwQ" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmos) @@ -57136,16 +57386,26 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) +"uxm" = ( +/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/yellow{ + dir = 4 + }, +/obj/machinery/light/no_nightlight/directional/north, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/engineering/atmos) "uxt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /obj/machinery/meter, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"uxI" = ( -/obj/machinery/vending/medical, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "uxS" = ( /turf/open/floor/wood, /area/station/maintenance/port/aft) @@ -57168,9 +57428,9 @@ /turf/open/floor/iron/dark, /area/station/security/execution/education) "uyj" = ( -/obj/machinery/rnd/bepis, -/obj/effect/turf_decal/stripes/end{ - dir = 4 +/obj/machinery/vending/wardrobe/cargo_wardrobe, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 }, /turf/open/floor/iron, /area/station/cargo/storage) @@ -57189,6 +57449,12 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) +"uyY" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/directional/north, +/turf/open/floor/wood, +/area/station/service/library) "uza" = ( /turf/closed/wall/r_wall, /area/station/security/prison/visit) @@ -57209,8 +57475,8 @@ /obj/structure/lattice, /obj/structure/chair/sofa/corp/left{ desc = "Looks like someone threw it out. Covered in donut crumbs."; - name = "couch"; - dir = 4 + dir = 4; + name = "couch" }, /turf/open/space/basic, /area/space/nearstation) @@ -57349,18 +57615,6 @@ dir = 8 }, /area/station/medical/medbay/lobby) -"uBP" = ( -/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) "uCq" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -57373,18 +57627,16 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"uCH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) "uCS" = ( /obj/structure/chair/stool/directional/south, /turf/open/floor/iron, /area/station/security/prison) -"uCW" = ( -/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/evidence) "uDn" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/yellow{ @@ -57442,12 +57694,6 @@ }, /turf/open/floor/engine, /area/station/science/explab) -"uEn" = ( -/obj/machinery/light/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/cigarette, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) "uEo" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -57476,13 +57722,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"uEA" = ( -/obj/structure/table/reinforced, -/obj/structure/reagent_dispensers/servingdish, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/red/opposingcorners, -/turf/open/floor/iron/white, -/area/station/security/prison/mess) "uEC" = ( /obj/machinery/conveyor{ dir = 4; @@ -57495,6 +57734,18 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/station/maintenance/port) +"uET" = ( +/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, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "uFf" = ( /obj/machinery/holopad, /obj/effect/spawner/random/engineering/tracking_beacon, @@ -57521,6 +57772,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"uFr" = ( +/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 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) "uFw" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -57583,16 +57847,6 @@ }, /turf/open/floor/iron, /area/station/cargo/warehouse) -"uGb" = ( -/obj/structure/table, -/obj/machinery/light/directional/east, -/obj/machinery/status_display/evac/directional/east, -/obj/machinery/flasher/directional/south{ - id = "AI" - }, -/obj/effect/spawner/round_default_module, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) "uGf" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 5 @@ -57664,17 +57918,24 @@ /obj/effect/spawner/random/techstorage/ai_all, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) +"uGx" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/freezer, +/area/station/security/prison/shower) "uGD" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, /turf/open/floor/iron, /area/station/security/brig) -"uGQ" = ( -/obj/machinery/light/directional/south, -/obj/machinery/newscaster/directional/south, -/obj/effect/turf_decal/tile/neutral, +"uGE" = ( +/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/structure/cable, /turf/open/floor/iron, -/area/station/commons/locker) +/area/station/hallway/primary/aft) "uGX" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, @@ -57695,6 +57956,17 @@ /obj/effect/spawner/random/engineering/flashlight, /turf/open/floor/iron, /area/station/command/gateway) +"uHo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/firealarm/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/iron, +/area/station/service/hydroponics) "uHp" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -57726,15 +57998,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"uId" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) +"uHE" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "uIe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -57793,6 +58063,15 @@ /obj/item/storage/fancy/cigarettes, /turf/open/floor/carpet, /area/station/security/detectives_office) +"uJx" = ( +/obj/machinery/button/door/directional/north{ + id = "hop"; + name = "Privacy Shutters Control"; + req_access = list("hop") + }, +/obj/machinery/computer/accounting, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "uJz" = ( /obj/effect/turf_decal/bot, /obj/structure/rack, @@ -57809,6 +58088,12 @@ /obj/structure/chair/stool/directional/east, /turf/open/floor/iron, /area/station/commons/locker) +"uJL" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/incident_display/delam/directional/south, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "uKa" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 6 @@ -57845,19 +58130,21 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white, /area/station/medical/virology) -"uKA" = ( -/obj/machinery/light/directional/west, -/obj/machinery/modular_computer/console/preset/cargochat/science{ - dir = 4 +"uKz" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 }, -/obj/effect/turf_decal/trimline/brown/filled/line{ +/obj/item/pen, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ dir = 1 }, -/obj/effect/turf_decal/trimline/purple/filled/warning{ +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark/corner{ dir = 1 }, -/turf/open/floor/iron, -/area/station/science/explab) +/area/station/engineering/atmos/storage/gas) "uKL" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral{ @@ -57868,30 +58155,16 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"uKR" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/small/directional/south, -/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) "uKW" = ( /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 = list("xenobiology") - }, /obj/machinery/door/poddoor/preopen{ id = "xenobio2"; name = "Xenobio Pen 2 Blast Door" }, +/obj/machinery/door/window/right/directional/south{ + name = "Containment Pen #2"; + req_access = list("xenobiology") + }, /turf/open/floor/iron, /area/station/science/xenobiology) "uLa" = ( @@ -57912,6 +58185,19 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark, /area/station/medical/storage) +"uLv" = ( +/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{ + department = "AI Chamber"; + name = "AI Chamber Requests Console" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "uLz" = ( /obj/machinery/light/small/directional/east, /obj/machinery/camera/directional/east{ @@ -57942,15 +58228,6 @@ /obj/structure/window/spawner/directional/north, /turf/open/floor/grass, /area/station/science/research) -"uLP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/north, -/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) "uMb" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -57959,18 +58236,23 @@ }, /area/station/security/prison) "uMi" = ( -/obj/structure/table/reinforced, -/obj/item/storage/box/beakers{ - pixel_y = 7 +/obj/structure/rack, +/obj/machinery/firealarm/directional/north, +/obj/item/reagent_containers/cup/bottle/potassium{ + pixel_x = 7; + pixel_y = 3 }, -/obj/item/assembly/igniter{ - pixel_y = -3 +/obj/item/reagent_containers/cup/bottle/phosphorus{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/bottle/sodium{ + pixel_x = 1 }, -/obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark/textured_edge{ dir = 4 }, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) "uMR" = ( /obj/machinery/holopad, /turf/open/floor/iron/white/side{ @@ -58015,14 +58297,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/engine) -"uNq" = ( -/obj/structure/sign/poster/official/get_your_legs/directional/north, -/obj/structure/chair/sofa/right/brown, -/obj/item/toy/plush/moth{ - name = "Mender Moff" - }, -/turf/open/floor/carpet, -/area/station/medical/psychology) "uNs" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor, @@ -58041,9 +58315,14 @@ /area/station/science/xenobiology) "uND" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/restraints/legcuffs/beartrap, -/obj/item/restraints/legcuffs/beartrap, /obj/structure/cable, +/obj/item/restraints/legcuffs/beartrap{ + pixel_x = -5 + }, +/obj/item/restraints/legcuffs/beartrap{ + pixel_x = 2; + pixel_y = -5 + }, /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron, /area/station/service/janitor) @@ -58063,6 +58342,28 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/command/corporate_showroom) +"uOi" = ( +/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, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"uOo" = ( +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/machinery/light_switch/directional/east, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/kitchen_coldroom, +/area/station/medical/coldroom) "uOp" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -58081,14 +58382,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port) -"uOS" = ( -/obj/machinery/door/airlock/grunge{ - name = "Morgue" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/medical/morgue, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "uOX" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -58104,27 +58397,41 @@ /turf/open/floor/iron, /area/station/hallway/primary/starboard) "uPi" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/stripes/corner{ +/obj/machinery/duct, +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/effect/turf_decal/trimline/blue/filled/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, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/machinery/light/floor, +/obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, -/area/station/science/lobby) +/area/station/medical/cryo) "uPp" = ( /obj/effect/spawner/random/structure/chair_maintenance{ dir = 4 }, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"uPJ" = ( +/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 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) "uQe" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -58134,15 +58441,13 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"uQu" = ( -/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/sign/xenobio_guide/directional/north, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) +"uQk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/obj/structure/cable, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "uQF" = ( /obj/structure/lattice, /obj/item/stack/rods, @@ -58163,7 +58468,9 @@ /turf/open/floor/iron, /area/station/engineering/main) "uQH" = ( -/obj/structure/reagent_dispensers/watertank, +/obj/effect/spawner/random/structure/chair_maintenance{ + dir = 1 + }, /turf/open/floor/iron/checker, /area/station/maintenance/aft/lesser) "uQK" = ( @@ -58201,11 +58508,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/sorting) +"uRw" = ( +/obj/structure/closet/toolcloset, +/obj/effect/turf_decal/delivery, +/obj/item/clothing/glasses/meson/engine, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/engineering/main) "uRA" = ( /obj/structure/extinguisher_cabinet/directional/west, -/obj/item/kirbyplants{ - icon_state = "applebush" - }, +/obj/item/kirbyplants/organic/applebush, /obj/effect/turf_decal/tile/blue{ dir = 8 }, @@ -58243,11 +58555,33 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"uSn" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +"uSz" = ( +/obj/structure/table, +/obj/item/phone{ + pixel_x = 6; + pixel_y = -2 + }, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"uSL" = ( +/obj/machinery/camera/motion/directional/south{ + c_tag = "Vault"; + network = list("vault") + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) +"uSM" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ + dir = 1 + }, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "uTj" = ( /obj/effect/landmark/start/medical_doctor, /turf/open/floor/iron/dark, @@ -58312,6 +58646,16 @@ /obj/effect/mapping_helpers/airlock/access/any/command/minisat, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) +"uUb" = ( +/obj/machinery/reagentgrinder, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/obj/structure/table/glass, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) "uUg" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, @@ -58334,6 +58678,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/structure/cable, /turf/open/floor/iron/dark/corner, /area/station/engineering/storage_shared) "uUX" = ( @@ -58399,6 +58744,22 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"uVx" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/blue/filled/warning, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"uVE" = ( +/obj/effect/turf_decal/siding/purple/corner{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white, +/area/station/science/research) "uVJ" = ( /obj/effect/spawner/random/structure/grille, /obj/structure/girder, @@ -58410,18 +58771,6 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) -"uWj" = ( -/obj/structure/table/reinforced, -/obj/item/defibrillator/loaded{ - pixel_y = 6 - }, -/obj/item/defibrillator/loaded{ - pixel_y = 3 - }, -/obj/item/defibrillator/loaded, -/obj/structure/window/spawner/directional/west, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "uWk" = ( /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, @@ -58453,6 +58802,23 @@ /obj/effect/turf_decal/bot/left, /turf/open/floor/engine, /area/station/engineering/atmospherics_engine) +"uWA" = ( +/obj/structure/table/wood/fancy/royalblue, +/obj/machinery/door/window{ + dir = 8; + name = "Secure Art Exhibition"; + req_access = list("library") + }, +/obj/machinery/light/directional/east, +/obj/structure/sign/painting/library_secure{ + pixel_x = 32 + }, +/obj/effect/spawner/random/decoration/statue{ + spawn_loot_chance = 50 + }, +/obj/structure/window/spawner/directional/south, +/turf/open/floor/carpet/royalblue, +/area/station/service/library) "uWK" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -58469,29 +58835,56 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/maintenance/port/aft) -"uWM" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"uWQ" = ( -/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 +"uWN" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -1; + pixel_y = 5 }, -/obj/effect/turf_decal/tile/yellow{ +/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_access = list("engineering") + }, +/obj/machinery/button/door/directional/east{ + id = "atmos"; + name = "Atmospherics Lockdown"; + pixel_y = 24; + req_access = list("atmospherics") + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 }, +/obj/machinery/light/small/directional/east, /turf/open/floor/iron, -/area/station/hallway/primary/starboard) +/area/station/security/checkpoint/engineering) "uWS" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) +"uWU" = ( +/obj/structure/table/reinforced, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/obj/machinery/computer/security/telescreen/entertainment/directional/west, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/bar) "uXd" = ( /turf/closed/wall/r_wall, /area/station/engineering/main) @@ -58511,14 +58904,6 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/psychology, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"uXO" = ( -/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/command/heads_quarters/qm) "uXS" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/closet/secure_closet/hydroponics, @@ -58562,17 +58947,31 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port) -"uYG" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "uYH" = ( /obj/structure/reflector/double/anchored{ dir = 5 }, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) +"uYI" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + 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/medical/chemistry) +"uYL" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 5 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) "uYP" = ( /obj/structure/cable, /obj/machinery/door/window/left/directional/north{ @@ -58688,6 +59087,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/security/medical) +"vaI" = ( +/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, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/engineering/main) "vbq" = ( /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)."; @@ -58705,6 +59117,28 @@ }, /turf/open/floor/iron/checker, /area/station/engineering/atmos/storage/gas) +"vbt" = ( +/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/item/radio/off, +/obj/machinery/requests_console/directional/east{ + department = "Security"; + name = "Security Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "vbL" = ( /obj/machinery/door/airlock/research{ name = "Ordnance Lab" @@ -58761,54 +59195,10 @@ }, /turf/open/floor/iron, /area/station/security/office) -"vdo" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/machinery/portable_atmospherics/scrubber, -/obj/effect/turf_decal/siding/purple{ - dir = 6 - }, -/obj/structure/cable, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/storage) "vdx" = ( /obj/machinery/rnd/experimentor, /turf/open/floor/engine, /area/station/science/explab) -"vdJ" = ( -/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) "vdL" = ( /obj/machinery/camera{ c_tag = "Xenobiology Lab - Pen #8"; @@ -58819,13 +59209,21 @@ /area/station/science/xenobiology) "veo" = ( /obj/structure/weightmachine/weightlifter{ + color = "#f5a183"; desc = "A rusty old bench press machine, who dumped this out here?"; - name = "rusty bench press"; - color = "#f5a183" + name = "rusty bench press" }, /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating/airless, /area/space/nearstation) +"ver" = ( +/obj/structure/closet/l3closet, +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "veO" = ( /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ dir = 8 @@ -58908,6 +59306,14 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"vgu" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) "vgv" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -58939,7 +59345,6 @@ /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) "vhb" = ( -/obj/machinery/light/directional/west, /obj/machinery/chem_dispenser{ layer = 2.7 }, @@ -58948,6 +59353,20 @@ }, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"vhj" = ( +/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 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/security/courtroom) "vht" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -58980,12 +59399,25 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/evidence) -"vhS" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/airalarm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"vhU" = ( +/obj/machinery/mineral/stacking_unit_console{ + pixel_x = 32 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"via" = ( +/obj/machinery/door/airlock/medical{ + name = "Medical Cold Room" + }, +/obj/effect/mapping_helpers/airlock/access/all/medical/surgery, +/obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/service/chapel/office) +/area/station/medical/coldroom) "vif" = ( /obj/machinery/holopad, /turf/open/floor/iron, @@ -59031,32 +59463,17 @@ /turf/open/floor/iron, /area/station/security/prison/garden) "viS" = ( -/obj/machinery/reagentgrinder, -/obj/machinery/requests_console/directional/west{ - department = "Pharmacy"; - name = "Pharmacy Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/ore_update, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/machinery/newscaster/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) "viU" = ( /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) -"vjd" = ( -/obj/machinery/light/directional/north, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "vjk" = ( /obj/effect/turf_decal/siding/purple{ dir = 10 @@ -59086,14 +59503,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/library) -"vjw" = ( -/obj/structure/table/wood, -/obj/machinery/fax{ - fax_name = "Quartermaster's Office"; - name = "Quartermaster's Fax Machine" - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/qm) "vjB" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/cable, @@ -59120,17 +59529,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"vjI" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Kitchen" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/navigate_destination/kitchen, -/obj/effect/mapping_helpers/airlock/access/any/service/bar, -/obj/effect/mapping_helpers/airlock/access/any/service/kitchen, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "vjU" = ( /obj/machinery/disposal/delivery_chute{ dir = 1; @@ -59159,15 +59557,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) -"vke" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "vkj" = ( /obj/structure/chair{ dir = 8 @@ -59226,20 +59615,8 @@ }, /turf/open/floor/iron/white, /area/station/security/medical) -"vkP" = ( -/obj/structure/table/reinforced, -/obj/item/stack/sheet/plasteel{ - amount = 15 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = 5; - pixel_y = 7 - }, -/obj/structure/fireaxecabinet/mechremoval/directional/east, -/turf/open/floor/iron, -/area/station/science/robotics/lab) "vkR" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 1 }, /turf/open/floor/wood, @@ -59303,6 +59680,10 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) +"vmk" = ( +/obj/machinery/status_display/ai/directional/west, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai) "vmm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -59361,6 +59742,7 @@ "vmY" = ( /obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/port/aft) "vnk" = ( @@ -59405,13 +59787,7 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) -"vnP" = ( -/obj/item/kirbyplants/random/dead, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating/airless, -/area/space/nearstation) "vnV" = ( -/obj/machinery/light/directional/west, /obj/machinery/airalarm/directional/west, /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -59428,16 +59804,6 @@ /obj/item/bedsheet, /turf/open/floor/iron, /area/station/security/brig) -"vok" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/directional/north, -/obj/item/clothing/gloves/latex/nitrile, -/obj/item/clothing/gloves/latex/nitrile, -/obj/item/clothing/gloves/latex/nitrile, -/obj/item/clothing/gloves/latex/nitrile, -/obj/item/wrench/medical, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "vol" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59446,6 +59812,26 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) +"vow" = ( +/obj/machinery/door/window/right/directional/west{ + name = "Corpse Arrivals"; + req_access = list("morgue_secure") + }, +/obj/effect/turf_decal/delivery/white{ + color = "#52B4E9" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/effect/turf_decal/tile/neutral/half, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 4 + }, +/area/station/medical/morgue) "voQ" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -59502,27 +59888,13 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/customs) -"vpB" = ( -/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) "vpM" = ( /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/item/kirbyplants/organic/plant3, /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -59551,7 +59923,7 @@ "vpU" = ( /obj/effect/spawner/random/structure/crate, /obj/structure/disposalpipe/segment{ - dir = 4 + dir = 5 }, /turf/open/floor/plating, /area/station/maintenance/port/fore) @@ -59562,16 +59934,20 @@ }, /turf/open/floor/iron, /area/station/construction/storage_wing) -"vqi" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Hydroponics - Aft" +"vqj" = ( +/obj/machinery/computer/atmos_alert{ + dir = 1 }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/green{ +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/sign/poster/official/safety_internals/directional/south, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/turf/open/floor/iron, -/area/station/service/hydroponics) +/turf/open/floor/iron/dark/corner, +/area/station/engineering/atmos/storage/gas) "vqk" = ( /obj/structure/cable, /obj/machinery/door/firedoor, @@ -59603,16 +59979,43 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"vrn" = ( +/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/structure/extinguisher_cabinet/directional/east, +/obj/structure/table/glass, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/service/hydroponics) "vro" = ( /obj/structure/sink/directional/west, /turf/open/floor/iron/white, /area/station/science/research) +"vru" = ( +/obj/machinery/chem_master, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "vrF" = ( /obj/structure/table/reinforced, /obj/structure/desk_bell{ pixel_x = -11 }, /obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, /turf/open/floor/iron, /area/station/service/bar) "vrJ" = ( @@ -59635,11 +60038,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/toilet/auxiliary) -"vsy" = ( -/obj/structure/railing, -/obj/machinery/light/small/red/directional/west, -/turf/open/floor/plating/airless, -/area/space/nearstation) "vsG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ @@ -59650,6 +60048,23 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"vsI" = ( +/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, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white, +/area/station/science/lobby) "vsO" = ( /obj/machinery/conveyor{ dir = 1; @@ -59660,12 +60075,39 @@ }, /turf/open/floor/plating, /area/station/cargo/storage) +"vsU" = ( +/obj/structure/table/wood, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/pen, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "vth" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/central) +"vtm" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"vtn" = ( +/obj/machinery/vending/wardrobe/sec_wardrobe, +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/machinery/requests_console/directional/east{ + department = "Security"; + name = "Security Requests Console" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) "vtp" = ( /obj/structure/disposalpipe/sorting/mail, /obj/effect/landmark/start/station_engineer, @@ -59675,6 +60117,17 @@ /obj/effect/mapping_helpers/mail_sorting/engineering/general, /turf/open/floor/iron, /area/station/engineering/main) +"vtu" = ( +/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, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "vtx" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -59682,12 +60135,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"vtD" = ( -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/chapel{ - dir = 1 - }, -/area/station/service/chapel) "vtF" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/reinforced, @@ -59706,6 +60153,27 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) +"vtI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/lights/mixed{ + pixel_x = -4; + pixel_y = 18 + }, +/obj/item/storage/box/lights/mixed{ + pixel_x = 6; + pixel_y = 12 + }, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = -7; + pixel_y = 12 + }, +/obj/structure/table, +/turf/open/floor/iron, +/area/station/service/janitor) "vtK" = ( /obj/machinery/reagentgrinder{ pixel_x = 6; @@ -59770,13 +60238,16 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"vvd" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/disposalpipe/segment{ - dir = 4 +"vva" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ + dir = 8; + initialize_directions = 4; + name = "euthanization chamber freezer" }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron, +/area/station/science/xenobiology) "vvp" = ( /obj/machinery/firealarm/directional/south, /obj/effect/turf_decal/tile/neutral{ @@ -59828,14 +60299,8 @@ /turf/open/floor/plating, /area/station/maintenance/port) "vwn" = ( -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, +/obj/item/kirbyplants/organic/plant10, +/turf/open/floor/wood/large, /area/station/commons/lounge) "vwp" = ( /obj/machinery/door/airlock{ @@ -59871,7 +60336,7 @@ /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/entry) "vxB" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/camera/directional/west{ c_tag = "Gateway - Atrium" }, @@ -59905,6 +60370,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/machinery/digital_clock/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/central) "vxJ" = ( @@ -59922,19 +60388,41 @@ /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron, /area/station/science/research) +"vye" = ( +/obj/effect/decal/cleanable/dirt, +/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) "vyi" = ( /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, /area/station/command/corporate_showroom) -"vyK" = ( -/obj/machinery/light_switch/directional/north, -/obj/effect/turf_decal/siding/wood, -/obj/effect/landmark/start/clown, -/obj/structure/chair/wood/wings{ - dir = 8 +"vyv" = ( +/obj/structure/table, +/obj/machinery/status_display/ai/directional/west, +/obj/machinery/flasher/directional/south{ + id = "AI" }, -/turf/open/floor/wood/large, -/area/station/service/theater) +/obj/item/ai_module/reset{ + pixel_x = 2; + pixel_y = 8 + }, +/obj/item/ai_module/supplied/freeform, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) +"vyy" = ( +/obj/machinery/washing_machine, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/cafeteria, +/area/station/security/prison) "vyM" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60023,8 +60511,15 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"vzW" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/rnd/production/circuit_imprinter/department/science, +/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) "vzX" = ( -/obj/effect/landmark/generic_maintenance_landmark, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, @@ -60047,22 +60542,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"vAc" = ( -/obj/structure/sign/poster/official/cleanliness/directional/west, -/obj/structure/sink/directional/south, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"vAF" = ( -/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) "vAH" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -60079,6 +60558,19 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/storage) +"vAX" = ( +/obj/structure/chair/sofa/left/brown, +/obj/structure/sign/poster/official/get_your_legs/directional/north, +/turf/open/floor/carpet, +/area/station/medical/psychology) +"vBe" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "vBf" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor, @@ -60118,13 +60610,12 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/space, /area/space/nearstation) -"vBW" = ( -/obj/machinery/light/small/directional/south, -/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) +"vCc" = ( +/obj/effect/spawner/random/entertainment/arcade, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) "vCh" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60147,6 +60638,16 @@ /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/iron, /area/station/commons/toilet/auxiliary) +"vCC" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/structure/sign/poster/contraband/random/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "vCN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -60158,13 +60659,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) -"vDa" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "vDc" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -60198,13 +60692,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/office) -"vDC" = ( -/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) "vDV" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -60258,7 +60745,7 @@ /turf/open/floor/engine/air, /area/station/engineering/atmos) "vEo" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 4 }, /obj/effect/turf_decal/siding/purple{ @@ -60275,6 +60762,41 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/atmos/storage/gas) +"vEu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/port) +"vEw" = ( +/obj/structure/chair/stool/directional/south, +/obj/item/radio/intercom/prison/directional/north, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/security/prison) +"vEC" = ( +/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/item/storage/box/monkeycubes{ + pixel_x = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/science/genetics) "vEH" = ( /obj/machinery/door/window/right/directional/east{ name = "Danger: Conveyor Access"; @@ -60383,6 +60905,10 @@ /obj/structure/sign/warning/biohazard, /turf/closed/wall, /area/station/science/xenobiology) +"vGt" = ( +/obj/effect/turf_decal/tile/red, +/turf/open/floor/iron, +/area/station/security/office) "vGw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -60424,12 +60950,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"vHl" = ( -/mob/living/simple_animal/pet/penguin/baby{ - dir = 8 - }, -/turf/open/floor/grass, -/area/station/science/research) "vHs" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/engineering/glass{ @@ -60449,12 +60969,19 @@ /obj/machinery/button/door/directional/south{ id = "qmprivacy"; name = "Privacy Shutters Control"; - req_access = list("qm"); + pixel_x = 8; pixel_y = -26; - pixel_x = 8 + req_access = list("qm") }, /turf/open/floor/wood, /area/station/command/heads_quarters/qm) +"vHM" = ( +/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/machinery/light/directional/south, +/turf/open/floor/iron/white, +/area/station/security/prison) "vHO" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, @@ -60471,9 +60998,30 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "vIm" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/station/maintenance/starboard/greater) +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/space_heater, +/turf/open/floor/iron/checker, +/area/station/maintenance/aft/lesser) +"vIn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/white, +/area/station/medical/office) +"vIt" = ( +/obj/structure/disposaloutlet{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk, +/obj/structure/window/spawner/directional/east, +/obj/structure/window/spawner/directional/west, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/station/cargo/sorting) "vIz" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ dir = 8 @@ -60539,11 +61087,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"vJt" = ( -/obj/structure/cable, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron, -/area/station/construction/storage_wing) "vJy" = ( /obj/structure/rack, /obj/item/stack/sheet/cardboard, @@ -60588,6 +61131,13 @@ /obj/effect/spawner/random/clothing/costume, /turf/open/floor/plating, /area/station/maintenance/port) +"vKd" = ( +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "vKm" = ( /obj/structure/rack, /obj/item/clothing/suit/hazardvest, @@ -60643,6 +61193,14 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"vLo" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) "vLA" = ( /obj/structure/disposalpipe/junction/flip{ dir = 4 @@ -60653,37 +61211,11 @@ }, /turf/open/floor/iron, /area/station/commons/locker) -"vLK" = ( -/obj/structure/window/spawner/directional/west, -/obj/effect/turf_decal/trimline/dark_red/line{ - dir = 8 - }, -/obj/effect/turf_decal/arrows/red{ - dir = 4 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/white/smooth_edge{ - dir = 4 - }, -/area/station/commons/fitness) "vLM" = ( /obj/structure/table/wood/poker, /obj/item/storage/dice, /turf/open/floor/wood, /area/station/commons/lounge) -"vLU" = ( -/obj/machinery/dna_scannernew, -/obj/effect/turf_decal/siding/purple{ - dir = 10 - }, -/obj/machinery/requests_console/directional/west{ - department = "Genetics"; - name = "Genetics Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) "vLX" = ( /obj/item/wrench, /turf/open/floor/iron/dark, @@ -60727,6 +61259,18 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/break_room) +"vMV" = ( +/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 + }, +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "vMX" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -60759,6 +61303,13 @@ /obj/machinery/newscaster/directional/west, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) +"vNM" = ( +/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, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "vNT" = ( /obj/structure/lattice, /obj/machinery/atmospherics/components/unary/passive_vent{ @@ -60803,17 +61354,19 @@ /obj/machinery/duct, /turf/closed/wall, /area/station/commons/fitness/recreation) +"vPf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "vPm" = ( /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) -"vPp" = ( -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/obj/structure/sign/poster/official/safety_eye_protection/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "vPq" = ( /obj/structure/chair{ dir = 8 @@ -60824,6 +61377,15 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"vPu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/machinery/electrolyzer, +/obj/machinery/atmospherics/components/binary/pump/on/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "vPy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -60836,13 +61398,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/engineering/atmos) -"vPH" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "vPO" = ( /obj/machinery/computer/crew{ dir = 4 @@ -60865,6 +61420,18 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) +"vPV" = ( +/obj/structure/rack, +/obj/effect/turf_decal/bot, +/obj/effect/spawner/random/maintenance, +/obj/item/storage/belt/utility, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/turf/open/floor/iron/dark/corner, +/area/station/engineering/storage_shared) "vPW" = ( /obj/item/extinguisher, /turf/open/floor/plating, @@ -60898,7 +61465,7 @@ /turf/closed/wall, /area/station/service/chapel/office) "vQh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) "vQs" = ( @@ -60935,13 +61502,6 @@ }, /turf/open/floor/iron, /area/station/security/brig) -"vQP" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/carpet, -/area/station/commons/dorms) "vQR" = ( /obj/machinery/power/port_gen/pacman/pre_loaded, /obj/effect/mapping_helpers/burnt_floor, @@ -60987,12 +61547,18 @@ "vRi" = ( /obj/structure/lattice, /obj/structure/chair/sofa/corp/corner{ + desc = "Looks like someone threw it out. Covered in donut crumbs."; dir = 1; - name = "couch"; - desc = "Looks like someone threw it out. Covered in donut crumbs." + name = "couch" }, /turf/open/space/basic, /area/space/nearstation) +"vRj" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/commons/locker) "vRk" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -61002,14 +61568,6 @@ /obj/structure/disposalpipe/junction/flip, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"vRz" = ( -/obj/structure/sign/departments/chemistry/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Medbay Main Hallway - Virology Junction"; - network = list("ss13","medbay") - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "vRN" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -61049,6 +61607,19 @@ "vRU" = ( /turf/open/floor/carpet, /area/station/service/theater) +"vSh" = ( +/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 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "vSo" = ( /obj/machinery/light/small/directional/south, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -61083,6 +61654,16 @@ dir = 9 }, /area/station/medical/treatment_center) +"vSC" = ( +/obj/machinery/rnd/production/protolathe/department/engineering, +/obj/effect/turf_decal/bot, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/corner, +/area/station/engineering/storage_shared) "vSI" = ( /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) @@ -61099,6 +61680,35 @@ }, /turf/open/floor/plating, /area/station/maintenance/fore) +"vTs" = ( +/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/landmark/start/hangover/closet, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) +"vTC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/iv_drip, +/turf/open/floor/plating, +/area/station/medical/abandoned) +"vTK" = ( +/obj/item/radio/intercom/directional/west, +/obj/structure/closet/secure_closet/security/science, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/science) +"vTV" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 10 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 4 + }, +/area/station/medical/morgue) "vTX" = ( /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) @@ -61110,6 +61720,24 @@ }, /turf/open/floor/iron, /area/station/cargo/drone_bay) +"vUC" = ( +/obj/structure/bed/medical/anchored{ + dir = 4 + }, +/obj/item/bedsheet, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/iv_drip, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/white, +/area/station/security/medical) "vUH" = ( /obj/structure/table/glass, /obj/structure/cable, @@ -61131,25 +61759,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"vVm" = ( -/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) +"vVc" = ( +/obj/structure/closet/crate/freezer/blood, +/obj/effect/turf_decal/siding/white, +/obj/machinery/status_display/ai/directional/north, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/turf/open/floor/iron/kitchen_coldroom, +/area/station/medical/coldroom) "vVr" = ( /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"vVu" = ( -/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) "vVw" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -61234,16 +61854,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"vWt" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white/corner, -/area/station/hallway/secondary/entry) "vWv" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 @@ -61289,15 +61899,6 @@ }, /turf/open/floor/circuit/green/off, /area/station/science/research) -"vXc" = ( -/obj/structure/table/glass, -/obj/machinery/camera/directional/west{ - c_tag = "Medbay Primary Treatment Centre West"; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "vXt" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 9 @@ -61371,6 +61972,14 @@ /obj/effect/mapping_helpers/airlock/access/all/security/entrance, /turf/open/floor/iron, /area/station/security/brig) +"vYI" = ( +/obj/structure/sign/warning/secure_area/directional/north, +/obj/structure/closet/radiation, +/obj/effect/turf_decal/delivery, +/obj/item/clothing/glasses/meson/engine, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/engineering/main) "vYJ" = ( /obj/machinery/airalarm/directional/south, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -61409,6 +62018,19 @@ "vZm" = ( /turf/closed/wall, /area/station/security/lockers) +"vZt" = ( +/obj/structure/table, +/obj/item/plate, +/obj/item/flashlight/flare/candle, +/obj/effect/decal/cleanable/dirt, +/obj/item/radio{ + 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) "vZB" = ( /obj/structure/sign/directions/evac, /turf/closed/wall, @@ -61501,6 +62123,31 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/general, /turf/open/floor/plating, /area/station/cargo/storage) +"waD" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/structure/closet_maintenance, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"waF" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Central Primary Hallway - Aft-Port Corner" + }, +/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 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "waH" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -61537,6 +62184,12 @@ /obj/effect/spawner/random/trash/bin, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"wcf" = ( +/obj/structure/closet/crate/coffin, +/obj/structure/window/spawner/directional/east, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/station/service/chapel/funeral) "wcr" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral{ @@ -61630,11 +62283,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/construction/storage_wing) -"wek" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash/mess, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) "wen" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -61648,6 +62296,15 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"wep" = ( +/obj/structure/sign/departments/chemistry/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Medbay Main Hallway - Virology Junction"; + network = list("ss13","medbay") + }, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "weq" = ( /obj/structure/sign/warning/secure_area{ desc = "A warning sign which reads 'BOMB RANGE"; @@ -61661,7 +62318,7 @@ /turf/open/floor/plating, /area/station/maintenance/port) "wew" = ( -/obj/machinery/modular_computer/console/preset/cargochat/cargo{ +/obj/machinery/modular_computer/preset/cargochat/cargo{ dir = 8 }, /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ @@ -61692,11 +62349,6 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/service/hydroponics/garden) -"wfa" = ( -/obj/effect/mapping_helpers/dead_body_placer, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "wfm" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -61718,6 +62370,17 @@ }, /turf/open/floor/carpet, /area/station/commons/vacant_room/office) +"wfA" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/mech_bay_power_console{ + dir = 8 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/science/robotics/mechbay) "wfC" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -61744,15 +62407,6 @@ /obj/structure/table/glass, /turf/open/floor/iron/dark, /area/station/command/bridge) -"wfN" = ( -/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/landmark/start/hangover/closet, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/dorms) "wfU" = ( /obj/machinery/computer/records/security{ dir = 4 @@ -61819,18 +62473,6 @@ }, /turf/closed/wall, /area/station/maintenance/port/fore) -"wgB" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/flasher/directional/north{ - id = "AI"; - pixel_x = -22 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "wgJ" = ( /obj/structure/sign/map/right, /turf/closed/wall, @@ -61840,6 +62482,16 @@ /obj/item/stock_parts/matter_bin, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"whr" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) "whx" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -61852,6 +62504,7 @@ /obj/effect/mapping_helpers/airlock/access/any/medical/general, /obj/effect/mapping_helpers/airlock/access/any/medical/pharmacy, /obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/effect/landmark/navigate_destination, /turf/open/floor/iron/white, /area/station/medical/pharmacy) "why" = ( @@ -61883,6 +62536,12 @@ /obj/structure/window/spawner/directional/south, /turf/open/floor/iron, /area/station/engineering/atmos) +"whJ" = ( +/obj/structure/reagent_dispensers/watertank/high, +/obj/item/reagent_containers/cup/watering_can, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/service/hydroponics) "whN" = ( /obj/docking_port/stationary{ dheight = 4; @@ -61932,15 +62591,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) -"wjD" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) "wjH" = ( /obj/effect/spawner/random/maintenance, /obj/structure/rack, @@ -61967,28 +62617,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) -"wjW" = ( -/obj/structure/table/wood, -/obj/item/cigbutt/cigarbutt{ - pixel_x = 5; - pixel_y = -1 - }, -/obj/machinery/light/directional/north, -/obj/item/radio/intercom/directional/north, -/obj/item/reagent_containers/cup/glass/mug{ - pixel_x = -4; - pixel_y = 4 - }, -/turf/open/floor/wood, -/area/station/command/corporate_showroom) -"wkb" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/camera/directional/south{ - c_tag = "Engineering Supermatter Aft"; - network = list("ss13","engine") - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "wkh" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -62007,17 +62635,6 @@ /obj/item/laser_pointer/red, /turf/open/space/basic, /area/space/nearstation) -"wkC" = ( -/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/segment, -/turf/open/floor/iron/white, -/area/station/science/research) "wkL" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -62062,15 +62679,18 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) -"wlt" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/warning, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +"wlx" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Engineering - Foyer - Shared Storage" + }, +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white/smooth_large, -/area/station/medical/medbay/central) +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/engineering/storage_shared) "wlL" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 @@ -62126,18 +62746,6 @@ }, /turf/open/floor/iron/grimy, /area/station/security/interrogation) -"wnN" = ( -/obj/effect/decal/cleanable/dirt, -/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) "wnQ" = ( /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)."; @@ -62155,15 +62763,6 @@ dir = 1 }, /area/station/engineering/atmos/storage/gas) -"wnR" = ( -/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) "wnT" = ( /obj/machinery/light/small/directional/east, /obj/machinery/door/window{ @@ -62176,6 +62775,14 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) +"wnW" = ( +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) "wnY" = ( /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/engine, @@ -62194,6 +62801,20 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"wov" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white/smooth_large, +/area/station/medical/abandoned) +"woz" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/iron/chapel{ + dir = 4 + }, +/area/station/service/chapel) "woG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -62292,11 +62913,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) -"wqj" = ( -/obj/machinery/rnd/production/protolathe/department/science, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/science/lab) "wqA" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -62304,12 +62920,6 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) -"wqI" = ( -/obj/structure/table/wood, -/obj/item/clothing/mask/cigarette/pipe, -/obj/machinery/light/directional/north, -/turf/open/floor/wood, -/area/station/commons/lounge) "wqJ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -62320,17 +62930,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) -"wrb" = ( -/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/evidence) "wrc" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -62347,13 +62946,6 @@ "wrn" = ( /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"wrE" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron/white/smooth_large, -/area/station/medical/chemistry) "wrG" = ( /obj/structure/rack, /obj/item/circuitboard/machine/exoscanner{ @@ -62395,6 +62987,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"wss" = ( +/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 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "wst" = ( /obj/machinery/door/airlock{ name = "Unisex Showers" @@ -62423,16 +63030,6 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/iron, /area/station/science/robotics/mechbay) -"wsF" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "wsI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -62458,6 +63055,16 @@ }, /turf/open/floor/iron, /area/station/science/robotics/lab) +"wsQ" = ( +/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 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) "wsS" = ( /obj/machinery/door/airlock/external{ name = "Departure Lounge Airlock"; @@ -62470,22 +63077,17 @@ /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "wsW" = ( -/obj/structure/rack, -/obj/item/reagent_containers/cup/bottle/mercury{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/nitrogen{ - pixel_x = 7; - pixel_y = 3 +/obj/structure/table/reinforced, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_y = 5 }, -/obj/item/reagent_containers/cup/bottle/oxygen{ - pixel_x = 1 +/obj/item/reagent_containers/dropper{ + pixel_y = -4 }, -/turf/open/floor/iron/dark/textured_edge{ - dir = 4 +/turf/open/floor/iron/dark/textured_corner{ + dir = 1 }, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) "wsX" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -62533,6 +63135,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/security/prison) +"wtB" = ( +/obj/structure/cable, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai_upload) "wtP" = ( /obj/effect/turf_decal/siding{ dir = 4 @@ -62563,16 +63169,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"wuh" = ( -/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/work) "wuj" = ( /obj/machinery/light/small/directional/east, /obj/effect/decal/cleanable/dirt, @@ -62595,6 +63191,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/commons/dorms) +"wvh" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/aft) "wvo" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -62611,6 +63212,27 @@ }, /turf/open/floor/plating, /area/station/maintenance/port) +"wvB" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/firealarm/directional/north, +/obj/item/storage/box/bodybags, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/pushbroom, +/obj/structure/closet{ + name = "janitorial supplies" + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"wvF" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/landmark/start/hangover, +/obj/machinery/light/small/directional/south, +/turf/open/floor/carpet, +/area/station/commons/dorms) "wvP" = ( /obj/machinery/iv_drip, /obj/machinery/airalarm/directional/north, @@ -62654,20 +63276,6 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, /area/station/science/robotics/mechbay) -"wwD" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Theater - Stage" - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/obj/machinery/light/small/directional/south, -/obj/item/radio/intercom/directional/east, -/obj/structure/table/wood, -/obj/item/clothing/glasses/monocle, -/obj/structure/sign/poster/random/directional/south, -/turf/open/floor/wood/large, -/area/station/service/theater) "wwW" = ( /obj/effect/turf_decal/trimline/purple/line{ dir = 1 @@ -62698,6 +63306,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/primary/central) +"wxh" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "wxj" = ( /turf/open/floor/iron/dark, /area/station/security/office) @@ -62724,39 +63339,21 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"wya" = ( -/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 +"wxG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/obj/machinery/requests_console/directional/north{ - department = "Security"; - name = "Security Requests Console" +/obj/machinery/light/floor, +/turf/open/floor/wood/large, +/area/station/commons/lounge) +"wxM" = ( +/obj/machinery/status_display/door_timer{ + id = "Cell 1"; + name = "Cell 1"; + pixel_y = -32 }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/turf/open/floor/iron, +/area/station/security/brig) "wyn" = ( /obj/machinery/hydroponics/soil, /obj/item/shovel/spade, @@ -62795,10 +63392,24 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) +"wyC" = ( +/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/dark, +/area/station/service/chapel/funeral) "wyG" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"wzd" = ( +/obj/item/radio/intercom/directional/west, +/obj/structure/table, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/item/flashlight/lamp, +/turf/open/floor/iron/dark, +/area/station/security/execution/education) "wzy" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -62811,19 +63422,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"wzF" = ( -/obj/structure/closet/secure_closet{ - name = "contraband locker"; - req_access = list("armory") - }, -/obj/effect/spawner/random/maintenance/three, -/obj/effect/spawner/random/contraband/armory, -/obj/machinery/light/directional/north, -/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, @@ -62836,20 +63434,27 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"wAp" = ( -/obj/item/radio/intercom/directional/west, -/obj/structure/table, -/obj/item/storage/backpack/duffelbag/sec/surgery{ - pixel_y = 5 +"wAk" = ( +/obj/machinery/status_display/evac/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/item/clothing/mask/balaclava, -/obj/item/reagent_containers/spray/cleaner{ - pixel_x = 5 +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/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) +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"wAt" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/effect/spawner/random/trash/soap, +/obj/structure/sign/poster/random/directional/east, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood/large, +/area/station/service/theater) "wAA" = ( /obj/machinery/firealarm/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -62947,6 +63552,13 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"wCb" = ( +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/donkpockets, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/science/research) "wCe" = ( /obj/structure/rack, /obj/effect/turf_decal/bot, @@ -62974,13 +63586,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/science/server) -"wCH" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "wCL" = ( /obj/structure/chair/stool/directional/south, /obj/effect/turf_decal/siding/wood{ @@ -63008,6 +63613,27 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/sorting) +"wDh" = ( +/obj/machinery/vending/wardrobe/chef_wardrobe, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 6 + }, +/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 = list("kitchen") + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "wDq" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 10 @@ -63029,6 +63655,10 @@ dir = 1 }, /area/station/engineering/atmos/pumproom) +"wDH" = ( +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/wood, +/area/station/service/library) "wEf" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/plasma_output{ dir = 1 @@ -63065,15 +63695,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) -"wEW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=8"; - location = "QM #2" - }, -/turf/open/floor/iron, -/area/station/cargo/warehouse) "wFa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/stripes/line{ @@ -63133,11 +63754,16 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"wGk" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +"wGa" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Central Primary Hallway - Starboard - Art Storage" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "wGz" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/light_construct/directional/east, @@ -63178,15 +63804,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/commons/dorms) -"wGS" = ( -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/obj/structure/bodycontainer/morgue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "wHd" = ( /obj/machinery/space_heater, /turf/open/floor/plating, @@ -63211,6 +63828,11 @@ }, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/entry) +"wHL" = ( +/obj/machinery/vending/wardrobe/bar_wardrobe, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/wood, +/area/station/service/bar/backroom) "wHW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -63218,6 +63840,10 @@ luminosity = 2 }, /area/station/ai_monitored/command/nuke_storage) +"wIa" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron, +/area/station/engineering/atmos) "wIr" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 10 @@ -63225,7 +63851,7 @@ /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 10 }, -/obj/machinery/modular_computer/console/preset/cargochat/security{ +/obj/machinery/modular_computer/preset/cargochat/security{ dir = 8 }, /turf/open/floor/iron, @@ -63234,28 +63860,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall/r_wall, /area/station/engineering/atmos) +"wIF" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "wIM" = ( /obj/machinery/holopad, /turf/open/floor/iron, /area/station/security/prison) -"wIN" = ( -/obj/machinery/light/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/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/dark/corner, -/area/station/engineering/atmos/storage/gas) -"wIW" = ( -/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) "wJw" = ( /turf/open/floor/engine/plasma, /area/station/engineering/atmos) @@ -63287,7 +63904,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/atmospherics/components/unary/cryo_cell, +/obj/machinery/cryo_cell, /turf/open/floor/iron/dark/textured, /area/station/medical/cryo) "wKu" = ( @@ -63320,6 +63937,13 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"wLu" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/wood, +/area/station/service/library) "wLw" = ( /obj/machinery/duct, /turf/open/floor/plating, @@ -63346,7 +63970,7 @@ /turf/open/floor/iron/dark/textured_edge{ dir = 8 }, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) "wMx" = ( /obj/effect/turf_decal/bot, /obj/effect/landmark/start/hangover, @@ -63356,13 +63980,6 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) -"wMM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet, -/obj/item/surgicaldrill, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) "wMT" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -63441,6 +64058,16 @@ }, /turf/open/floor/iron/white, /area/station/science/cytology) +"wOf" = ( +/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) "wOl" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners{ dir = 1 @@ -63464,7 +64091,6 @@ "wOy" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sink/directional/west, -/obj/item/reagent_containers/cup/bucket, /obj/item/mop, /turf/open/floor/iron, /area/station/service/janitor) @@ -63533,10 +64159,6 @@ /obj/effect/mapping_helpers/airlock/access/all/science/robotics, /turf/open/floor/plating, /area/station/science/robotics/lab) -"wPi" = ( -/obj/machinery/vending/wardrobe/det_wardrobe, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) "wPo" = ( /obj/item/radio/intercom/directional/west{ freerange = 1; @@ -63637,6 +64259,14 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/science/lab) +"wQb" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/landmark/start/hangover, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/station/commons/dorms) "wQj" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ dir = 8 @@ -63702,16 +64332,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) -"wRt" = ( -/obj/machinery/light_switch/directional/east, -/obj/machinery/light/small/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) "wRB" = ( /obj/item/radio/intercom/directional/north, /obj/machinery/firealarm/directional/west, @@ -63744,7 +64364,7 @@ c_tag = "Cytology Lab - Worklab"; network = list("ss13","rd","xeno") }, -/turf/open/floor/holofloor/dark, +/turf/open/floor/iron/dark/textured_large, /area/station/science/cytology) "wRP" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ @@ -63776,6 +64396,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"wSq" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/photocopier, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hos) "wSs" = ( /obj/structure/table/wood/poker, /obj/effect/spawner/random/entertainment/deck, @@ -63849,10 +64478,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/evidence) -"wUc" = ( -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "wUj" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/white, @@ -63883,6 +64508,42 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"wUH" = ( +/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/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) +"wUM" = ( +/obj/structure/cable, +/obj/structure/table, +/obj/effect/turf_decal/stripes/line, +/obj/item/clothing/head/utility/welding{ + pixel_y = 9 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/item/clothing/head/utility/welding{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/clothing/head/utility/welding{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/engineering/atmos/storage/gas) "wUQ" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -63890,6 +64551,13 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"wVa" = ( +/obj/machinery/conveyor{ + dir = 9; + id = "garbage" + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "wVc" = ( /obj/structure/table/reinforced, /obj/item/folder/white{ @@ -63928,16 +64596,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"wVf" = ( -/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) "wVo" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -63948,6 +64606,15 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/dark, /area/station/security/office) +"wVy" = ( +/obj/structure/sink/directional/east, +/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) "wVO" = ( /obj/item/reagent_containers/cup/bottle/toxin{ pixel_x = 4; @@ -63985,6 +64652,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"wWo" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 9 + }, +/obj/machinery/light/small/directional/north, +/obj/structure/sign/poster/official/report_crimes/directional/north, +/turf/open/floor/iron/dark/smooth_half{ + dir = 4 + }, +/area/station/medical/morgue) "wWs" = ( /obj/effect/turf_decal/siding/white{ dir = 8 @@ -63992,14 +64669,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/medical/storage) -"wWG" = ( -/obj/machinery/light/directional/east, -/obj/structure/sign/departments/science/directional/east, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) "wWN" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/hidden{ dir = 9 @@ -64031,16 +64700,6 @@ /obj/machinery/duct, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) -"wXr" = ( -/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) "wXF" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/lesser) @@ -64050,18 +64709,11 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"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 - }, +"wXT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/directional/west, /turf/open/floor/iron, -/area/station/construction/mining/aux_base) +/area/station/security/courtroom) "wYe" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64074,26 +64726,44 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"wYi" = ( +/obj/machinery/door/window/right/directional/south{ + dir = 1; + name = "First Aid Supplies"; + req_access = list("medical") + }, +/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, +/obj/structure/window/spawner/directional/west, +/obj/machinery/requests_console/directional/south{ + department = "Medbay"; + name = "Medbay Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "wYl" = ( /obj/effect/spawner/random/trash/mess, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"wYn" = ( -/obj/machinery/chem_dispenser/drinks/beer{ - dir = 1 - }, -/obj/structure/table, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) -"wYo" = ( -/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) +"wYs" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/broken_flooring/corner/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "wYx" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -64103,38 +64773,14 @@ "wYB" = ( /turf/closed/wall, /area/station/hallway/secondary/service) -"wYG" = ( -/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/head/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 = list("hop") - }, -/obj/machinery/button/door/directional/south{ - id = "hopqueue"; - name = "Queue Shutters Control"; - pixel_x = -6; - pixel_y = -34; - req_access = list("hop") +"wZb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) +/obj/structure/cable, +/obj/machinery/light/floor, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "wZe" = ( /obj/machinery/door/airlock/public/glass{ name = "Chapel Office" @@ -64191,14 +64837,37 @@ }, /turf/open/floor/iron, /area/station/security/warden) -"wZX" = ( -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) +"xac" = ( +/obj/machinery/firealarm/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) "xaj" = ( -/obj/effect/spawner/random/structure/closet_maintenance, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) +/obj/structure/table/reinforced, +/obj/item/storage/box/gloves{ + pixel_x = 2; + pixel_y = 9 + }, +/obj/item/assembly/igniter{ + pixel_y = -3 + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/dark/textured_edge{ + dir = 4 + }, +/area/station/medical/chem_storage) +"xap" = ( +/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/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) "xar" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -64206,14 +64875,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"xaB" = ( -/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, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "xaL" = ( /obj/effect/turf_decal/trimline/red/filled/corner, /obj/item/kirbyplants/random, @@ -64245,6 +64906,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/main) +"xbb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) "xbd" = ( /obj/structure/extinguisher_cabinet/directional/south, /obj/structure/disposalpipe/segment{ @@ -64273,9 +64943,6 @@ /obj/structure/cable, /turf/open/floor/iron/white/smooth_large, /area/station/command/heads_quarters/cmo) -"xcp" = ( -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "xcz" = ( /obj/effect/turf_decal/stripes/corner, /obj/structure/reagent_dispensers/watertank, @@ -64318,6 +64985,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall, /area/station/engineering/atmos/pumproom) +"xdx" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat/foyer) "xdF" = ( /obj/structure/girder, /turf/open/floor/plating, @@ -64329,13 +65003,6 @@ /obj/structure/sign/warning/hot_temp/directional/south, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"xdR" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/glass/drinkingglass, -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/tile/red/opposingcorners, -/turf/open/floor/iron/white, -/area/station/security/prison/mess) "xdV" = ( /obj/item/reagent_containers/cup/glass/bottle/wine/unlabeled, /obj/effect/mapping_helpers/broken_floor, @@ -64354,7 +65021,8 @@ }, /obj/structure/cable, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/supply/mining, +/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, +/obj/effect/mapping_helpers/airlock/access/any/supply/mining, /turf/open/floor/iron, /area/station/cargo/miningoffice) "xel" = ( @@ -64380,11 +65048,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port) -"xeT" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/mannequin/skeleton, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "xff" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -64400,26 +65063,9 @@ 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 - }, +/obj/structure/microscope, /turf/open/floor/iron/white, /area/station/science/cytology) -"xfn" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - id = "kitchen_counter"; - name = "Kitchen Counter Shutters" - }, -/obj/machinery/smartfridge/food, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "xfx" = ( /obj/structure/table/glass, /obj/item/stack/medical/mesh, @@ -64585,15 +65231,6 @@ /obj/structure/window/spawner/directional/south, /turf/open/floor/iron, /area/station/engineering/atmos) -"xgR" = ( -/obj/machinery/rnd/production/protolathe/department/engineering, -/obj/effect/turf_decal/bot, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner, -/area/station/engineering/storage_shared) "xgV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64637,9 +65274,7 @@ /turf/open/floor/plating, /area/station/maintenance/department/medical/central) "xiv" = ( -/obj/item/kirbyplants{ - icon_state = "plant-11" - }, +/obj/item/kirbyplants/organic/plant11, /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 1 }, @@ -64652,6 +65287,13 @@ "xiL" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/science/xenobiology) +"xiW" = ( +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "xjb" = ( /obj/effect/landmark/start/ai/secondary, /obj/item/radio/intercom/directional/north{ @@ -64727,6 +65369,12 @@ }, /turf/open/floor/wood/parquet, /area/station/medical/psychology) +"xkb" = ( +/obj/item/hand_labeler_refill, +/obj/structure/rack, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "xko" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -64757,16 +65405,16 @@ /obj/structure/cable/layer3, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/satellite) -"xkT" = ( -/obj/structure/table/reinforced, -/obj/item/folder/blue{ - pixel_y = 2 +"xkE" = ( +/obj/machinery/recharge_station, +/obj/effect/landmark/start/hangover, +/obj/effect/spawner/random/trash/graffiti{ + pixel_y = -32; + spawn_loot_chance = 50 }, -/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) +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) "xkV" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, /turf/open/floor/iron, @@ -64777,42 +65425,29 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) -"xln" = ( -/obj/machinery/requests_console/directional/west{ - department = "Detective"; - name = "Detective Requests Console" +"xld" = ( +/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/light/small/directional/west, -/obj/structure/disposalpipe/trunk{ +/obj/machinery/atmospherics/pipe/smart/simple/supply/visible{ 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) -"xlw" = ( -/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/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"xlv" = ( +/obj/machinery/airalarm/directional/south, +/obj/machinery/computer/mech_bay_power_console{ + dir = 8 }, -/obj/item/stack/cable_coil, -/obj/item/gps, -/obj/structure/cable, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/light/directional/east, -/obj/item/clothing/gloves/color/fyellow, -/obj/item/gps, -/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/light/small/directional/south, /turf/open/floor/iron, -/area/station/commons/storage/primary) +/area/station/science/robotics/mechbay) "xly" = ( /obj/machinery/door/morgue{ name = "Confession Booth" @@ -64861,6 +65496,12 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) +"xmD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/medical/memeorgans, +/obj/structure/closet/crate/freezer, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) "xmT" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ @@ -64904,22 +65545,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) -"xnA" = ( -/obj/structure/cable, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) -"xnS" = ( -/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/execution/transfer) "xnT" = ( /obj/structure/cable, /obj/machinery/airalarm/directional/south, @@ -64946,25 +65571,15 @@ /turf/open/floor/iron/dark, /area/station/science/genetics) "xoc" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Mining Dock Maintenance" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/access/all/supply/mining, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"xoj" = ( -/obj/structure/table/reinforced, -/obj/machinery/microwave{ - pixel_y = 6 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "xor" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -64973,11 +65588,6 @@ }, /turf/open/floor/iron/white, /area/station/science/explab) -"xoE" = ( -/obj/structure/dresser, -/obj/machinery/light/small/directional/north, -/turf/open/floor/wood, -/area/station/service/theater) "xoK" = ( /obj/effect/landmark/start/botanist, /obj/effect/turf_decal/tile/green{ @@ -64991,7 +65601,6 @@ "xpb" = ( /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/side{ dir = 1 }, @@ -65020,12 +65629,22 @@ /obj/structure/window/spawner/directional/west, /turf/open/floor/iron, /area/station/engineering/atmos) -"xpO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/medical/patient_stretcher, -/obj/item/food/pizzaslice/moldy/bacteria, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) +"xpH" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/bluespace_vendor/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"xpL" = ( +/obj/structure/closet/secure_closet/chief_medical, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/item/screwdriver, +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/cmo) "xpX" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/iron, @@ -65034,8 +65653,17 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/incinerator_input{ dir = 1 }, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) +"xpZ" = ( +/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) "xqc" = ( /obj/machinery/atmospherics/components/trinary/filter/atmos/n2o{ dir = 4 @@ -65047,14 +65675,6 @@ /obj/structure/window/spawner/directional/south, /turf/open/floor/iron, /area/station/engineering/atmos) -"xqm" = ( -/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) "xqn" = ( /obj/effect/spawner/random/trash/mess, /obj/structure/sign/poster/contraband/random/directional/north, @@ -65101,17 +65721,22 @@ /obj/effect/landmark/navigate_destination, /turf/open/floor/engine/cult, /area/station/service/library) -"xrf" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "xrr" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) +"xrG" = ( +/obj/structure/fireaxecabinet/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Atmospherics - Port" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/engineering/atmos) "xrN" = ( /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, @@ -65147,20 +65772,6 @@ /obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/white, /area/station/science/ordnance/testlab) -"xst" = ( -/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) -"xsv" = ( -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "xsy" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/yellow{ @@ -65195,6 +65806,9 @@ /obj/structure/displaycase/forsale/kitchen{ pixel_y = 8 }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, /turf/open/floor/iron, /area/station/service/kitchen) "xte" = ( @@ -65309,7 +65923,8 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "xuV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/closed/wall/r_wall, /area/station/maintenance/aft/lesser) "xvd" = ( @@ -65423,11 +66038,48 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"xxh" = ( +/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 = list("rd") + }, +/obj/machinery/button/door/directional/north{ + id = "rdordnance"; + name = "Ordnance Containment Control"; + pixel_x = 6; + req_access = list("rd") + }, +/obj/machinery/button/door/directional/north{ + id = "rdoffice"; + name = "Privacy Control"; + pixel_y = 34; + req_access = list("rd") + }, +/obj/machinery/computer/security/telescreen/rd{ + pixel_x = 31; + pixel_y = 30 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/rd) "xxk" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) +"xxn" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/machinery/light_switch/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/teleporter) "xxp" = ( /obj/machinery/airalarm/directional/west, /obj/effect/mapping_helpers/burnt_floor, @@ -65452,6 +66104,16 @@ /obj/structure/sign/poster/contraband/random/directional/north, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"xxQ" = ( +/obj/structure/table, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/item/reagent_containers/cup/glass/mug/britcup{ + pixel_y = 2 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/science/research) "xxU" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -65530,14 +66192,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port) -"xyR" = ( -/obj/item/tank/internals/oxygen, -/obj/item/tank/internals/oxygen, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/port) "xyT" = ( /obj/machinery/door/airlock/external{ name = "Atmospherics External Access" @@ -65581,13 +66235,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"xzs" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/engineering/main) "xzu" = ( /obj/machinery/door/airlock/medical{ name = "Primary Surgical Theatre" @@ -65635,6 +66282,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"xAp" = ( +/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, +/turf/open/floor/iron, +/area/station/science/lab) "xAt" = ( /obj/machinery/door/window/right/directional/east{ base_state = "left"; @@ -65651,6 +66305,17 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/fore) +"xAT" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/commons/locker) "xAW" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -65687,19 +66352,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"xBz" = ( -/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) "xBF" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 }, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) +"xBX" = ( +/obj/machinery/firealarm/directional/east, +/turf/closed/wall, +/area/station/security/checkpoint/customs) "xCf" = ( /obj/item/clothing/suit/jacket/straight_jacket, /obj/item/electropack, @@ -65823,6 +66485,13 @@ /obj/item/pen, /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) +"xCT" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Chapel Office - Backroom" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) "xDa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, @@ -65878,6 +66547,17 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/engine/plasma, /area/station/engineering/atmos) +"xEr" = ( +/obj/effect/spawner/random/vending/snackvend, +/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/neutral/fourcorners, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) "xEt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -65972,13 +66652,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/courtroom) -"xGk" = ( -/obj/machinery/computer/operating{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) "xGm" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -66021,14 +66694,16 @@ }, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"xHg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +"xIp" = ( +/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/light/directional/east, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/brig) "xIx" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -66051,6 +66726,16 @@ /obj/structure/sign/departments/medbay/alt, /turf/closed/wall, /area/station/medical/medbay/lobby) +"xII" = ( +/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, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron, +/area/station/service/hydroponics) "xIK" = ( /obj/structure/table, /obj/item/reagent_containers/condiment/enzyme{ @@ -66085,13 +66770,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"xJi" = ( -/obj/machinery/flasher/portable, -/obj/effect/turf_decal/tile/blue/half/contrasted{ +"xJl" = ( +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/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/security/lockers) +/area/station/command/bridge) "xJA" = ( /obj/structure/sign/warning/docking, /turf/closed/wall, @@ -66154,19 +66844,6 @@ "xKK" = ( /turf/closed/wall, /area/station/science/research) -"xLq" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "MiniSat Exterior Access"; - network = list("minisat") - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) "xLu" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -66184,13 +66861,17 @@ }, /turf/open/floor/wood, /area/station/commons/vacant_room/office) -"xLI" = ( -/obj/structure/rack, -/obj/effect/spawner/random/clothing/costume, -/obj/effect/spawner/random/clothing/costume, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) +"xLR" = ( +/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/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/construction/mining/aux_base) "xMl" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=15-Court"; @@ -66258,10 +66939,6 @@ }, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) -"xNu" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) "xNv" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -66372,24 +67049,6 @@ /obj/machinery/status_display/ai/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"xPh" = ( -/obj/structure/table, -/obj/machinery/microwave, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 6 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Kitchen" - }, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "xPm" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, @@ -66421,18 +67080,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"xQb" = ( -/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) "xQh" = ( /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/white, @@ -66450,6 +67097,15 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"xQI" = ( +/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) "xQJ" = ( /obj/machinery/status_display/evac/directional/north, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -66470,13 +67126,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/security/office) -"xQV" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/station/commons/dorms) "xQY" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -66490,7 +67139,6 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "xRf" = ( -/obj/effect/spawner/random/structure/table, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) @@ -66505,21 +67153,64 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/plating, /area/station/engineering/atmos) +"xRR" = ( +/obj/structure/bodycontainer/morgue/beeper_off, +/obj/structure/bodycontainer/morgue/beeper_off{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 1 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/iron/dark/smooth_half{ + dir = 4 + }, +/area/station/medical/morgue) +"xRY" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "xRZ" = ( /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"xSO" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/wood/large, +/area/station/service/theater) "xSQ" = ( /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) -"xTs" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/landmark/blobstart, -/obj/structure/closet/secure_closet/detective, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) +"xST" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/radio/intercom/directional/west, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"xTg" = ( +/obj/structure/chair/comfy{ + dir = 4 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Science Break Room"; + network = list("ss13","rd") + }, +/obj/machinery/light_switch/directional/south, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron, +/area/station/science/research) "xTw" = ( /turf/closed/wall/r_wall, /area/station/medical/medbay/central) @@ -66554,6 +67245,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/dorms) +"xUm" = ( +/obj/machinery/computer/operating{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/clock/directional/west, +/obj/item/radio/intercom/directional/north, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "xUu" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -66635,6 +67336,15 @@ "xVu" = ( /turf/closed/wall, /area/station/science/xenobiology) +"xVx" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Engineering Supermatter Fore"; + network = list("ss13","engine") + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room) "xVA" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 1; @@ -66647,19 +67357,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/research) -"xVY" = ( -/obj/structure/table/wood, -/obj/machinery/button/door/directional/south{ - id = "lawyer_shutters"; - name = "law office shutter control"; - req_access = list("lawyer") - }, -/obj/machinery/fax{ - fax_name = "Law Office"; - name = "Law Office Fax Machine" - }, -/turf/open/floor/wood, -/area/station/service/lawoffice) "xWm" = ( /obj/structure/rack, /obj/item/restraints/handcuffs{ @@ -66712,14 +67409,19 @@ /area/station/hallway/primary/port) "xWY" = ( /obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 9 - }, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/deepfryer, +/obj/structure/table, +/obj/machinery/reagentgrinder{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/reagent_containers/condiment/enzyme{ + layer = 5; + pixel_x = -6 + }, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) "xXf" = ( @@ -66778,6 +67480,11 @@ }, /turf/open/floor/iron, /area/station/command/teleporter) +"xXC" = ( +/obj/effect/landmark/blobstart, +/obj/structure/closet/secure_closet/detective, +/turf/open/floor/iron/grimy, +/area/station/security/detectives_office) "xXG" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible, /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ @@ -66805,6 +67512,7 @@ name = "Captain's Quarters" }, /obj/effect/mapping_helpers/airlock/access/any/command/captain, +/obj/effect/landmark/navigate_destination, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/captain/private) "xXW" = ( @@ -66833,16 +67541,40 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"xYy" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "xYD" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/engineering/supermatter/room) +"xYH" = ( +/obj/item/kirbyplants/random/dead, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, +/area/space/nearstation) "xYQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) +"xYV" = ( +/obj/structure/table/glass, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white, +/area/station/science/research) "xYW" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -66858,14 +67590,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, /area/station/security/courtroom) -"xZi" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/item/radio/intercom/directional/south, -/obj/structure/bodycontainer/morgue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "xZu" = ( /obj/structure/sink/kitchen/directional/east{ desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; @@ -66874,6 +67598,15 @@ /obj/structure/mirror/directional/west, /turf/open/floor/wood, /area/station/maintenance/port/aft) +"xZv" = ( +/obj/machinery/newscaster/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/toolbox/mechanical, +/obj/machinery/camera/directional/north, +/obj/structure/cable, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "xZx" = ( /obj/machinery/space_heater, /turf/open/floor/plating, @@ -66891,23 +67624,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"xZJ" = ( -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/disposal/bin, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"xZR" = ( -/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) "xZW" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -66927,21 +67643,6 @@ /obj/machinery/monkey_recycler, /turf/open/floor/iron, /area/station/science/xenobiology) -"yaj" = ( -/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 - }, -/turf/open/floor/iron/checker, -/area/station/science/research) "yaD" = ( /obj/structure/table, /obj/item/stack/rods/fifty, @@ -66967,6 +67668,20 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"yaF" = ( +/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/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/item/pipe_dispenser, +/obj/item/pipe_dispenser, +/obj/item/pipe_dispenser, +/turf/open/floor/iron, +/area/station/engineering/main) "yaH" = ( /obj/structure/chair/office{ dir = 8 @@ -66979,29 +67694,11 @@ }, /turf/open/floor/iron, /area/station/science/explab) -"yaM" = ( -/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/machinery/light/small/directional/west, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/command/corporate_showroom) "yaO" = ( /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) -"ybb" = ( -/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) "ybi" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -67016,16 +67713,9 @@ "ybl" = ( /obj/structure/closet/secure_closet/engineering_personal, /obj/effect/turf_decal/delivery, +/obj/machinery/incident_display/delam/directional/north, /turf/open/floor/iron, /area/station/engineering/main) -"ybm" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "ybn" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -67034,10 +67724,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"ybs" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron/freezer, -/area/station/security/prison/shower) "ybu" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -67050,6 +67736,13 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/chapel, /area/station/service/chapel) +"ybN" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "yce" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -67110,6 +67803,16 @@ "ycv" = ( /turf/open/floor/iron/white, /area/station/science/xenobiology) +"ycw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, +/obj/machinery/status_display/evac/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "ycz" = ( /obj/machinery/firealarm/directional/east, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -67126,16 +67829,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/locker) -"ycX" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Telecomms - Server Room - Aft-Port"; - network = list("ss13","tcomms") - }, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/tlv_no_checks, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) "ydb" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 1; @@ -67170,13 +67863,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"ydz" = ( -/obj/structure/closet/l3closet/virology, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) "ydG" = ( /obj/effect/turf_decal/arrows/red{ dir = 4; @@ -67187,6 +67873,20 @@ }, /turf/open/floor/engine, /area/station/engineering/atmospherics_engine) +"ydM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible/layer5, +/obj/structure/sign/poster/official/wtf_is_co2/directional/south, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"yec" = ( +/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) "yeq" = ( /obj/machinery/conveyor{ dir = 1; @@ -67211,22 +67911,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/execution/transfer) +"yeA" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) "yeI" = ( /obj/structure/mop_bucket, /obj/item/mop, /obj/structure/sign/poster/random/directional/north, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"yeS" = ( -/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) "yeV" = ( /obj/structure/closet/secure_closet/hos, /obj/item/clothing/shoes/cowboy/black, @@ -67264,25 +67962,8 @@ "yfm" = ( /obj/effect/turf_decal/trimline/dark_red/mid_joiner, /obj/effect/turf_decal/trimline/dark_red/line, -/obj/structure/cable, /turf/open/floor/iron/white/smooth_half, /area/station/commons/fitness) -"yfn" = ( -/obj/machinery/vending/dinnerware, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 5 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "yfq" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -67290,22 +67971,23 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"yft" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/newscaster/directional/north, -/obj/structure/dresser, -/turf/open/floor/carpet, -/area/station/commons/dorms) +"yfw" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/obj/effect/spawner/random/trash/soap{ + spawn_scatter_radius = 1 + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/light/floor, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) "yfx" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrous_input{ dir = 1 }, /turf/open/floor/engine/n2o, /area/station/engineering/atmos) -"yfI" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, -/turf/closed/wall/r_wall, -/area/station/maintenance/disposal/incinerator) "yfL" = ( /turf/closed/wall, /area/station/ai_monitored/command/storage/eva) @@ -67341,6 +68023,22 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) +"ygt" = ( +/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 = list("command") + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) "ygR" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 4 @@ -67350,6 +68048,12 @@ /obj/effect/turf_decal/tile/bar, /turf/open/floor/iron, /area/station/construction/storage_wing) +"ygS" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central) "yhm" = ( /obj/machinery/airalarm/directional/west, /obj/structure/disposaloutlet{ @@ -67421,16 +68125,39 @@ /obj/structure/marker_beacon/purple, /turf/open/space/basic, /area/space/nearstation) -"yih" = ( -/obj/machinery/shower/directional/west, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) +"yij" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/white/smooth_large, +/area/station/medical/chemistry) +"yim" = ( +/obj/structure/table, +/obj/machinery/camera/directional/north{ + c_tag = "Medbay Paramedic Dispatch"; + name = "medical camera"; + network = list("ss13","medical") + }, +/obj/machinery/fax{ + fax_name = "Medical"; + name = "Medical Fax Machine" + }, +/obj/structure/noticeboard/directional/north, +/obj/structure/sign/clock/directional/west, +/turf/open/floor/iron/dark, +/area/station/medical/office) "yis" = ( /obj/machinery/mech_bay_recharge_port, /obj/structure/sign/poster/official/safety_report/directional/south, /turf/open/floor/plating, /area/station/cargo/warehouse) +"yiJ" = ( +/obj/structure/chair/sofa/right/brown, +/obj/item/toy/plush/moth{ + name = "Mender Moff" + }, +/turf/open/floor/carpet, +/area/station/medical/psychology) "yiN" = ( /obj/effect/spawner/random/maintenance, /obj/structure/cable, @@ -67451,23 +68178,19 @@ "yjd" = ( /turf/closed/wall, /area/station/command/gateway) +"yje" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/cup/glass/bottle/vodka, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) "yjw" = ( /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) -"yjN" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/carpet, -/area/station/commons/dorms) -"yjW" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) "ykn" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -67486,11 +68209,6 @@ /obj/structure/window/spawner/directional/west, /turf/open/floor/carpet, /area/station/service/theater) -"ykH" = ( -/obj/effect/turf_decal/bot, -/obj/effect/landmark/blobstart, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "ykI" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/engine{ @@ -67552,13 +68270,6 @@ /obj/item/clothing/suit/jacket/straight_jacket, /turf/open/floor/iron/dark, /area/station/medical/office) -"yli" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/supermatter/room) "ylt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -67574,10 +68285,14 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"ylO" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall, -/area/station/maintenance/port/aft) +"ylM" = ( +/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, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/commons/dorms) "ylQ" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -67599,15 +68314,6 @@ }, /turf/open/floor/iron, /area/station/security/brig) -"ymd" = ( -/obj/machinery/stasis{ - dir = 4 - }, -/obj/machinery/defibrillator_mount/directional/north, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "yme" = ( /obj/structure/sign/warning/pods, /turf/closed/wall, @@ -78514,7 +79220,7 @@ aDa aDa aDa iYU -knP +mar dCx aDb inL @@ -79029,7 +79735,7 @@ aDa aDa iYU kFg -eVm +diJ cYL qAN wpw @@ -79085,7 +79791,7 @@ tsd tsd tsd hUN -gmG +vZt jIR lMJ gQK @@ -79802,7 +80508,7 @@ iYU oSc oQc aDb -kpu +rew lGL qEt qEt @@ -79818,7 +80524,7 @@ qEt qEt qEt sCZ -xaB +vNM wdr aaf lXm @@ -79826,7 +80532,7 @@ jrY qEt aaf wdr -kRx +sCZ eOm qEt aaa @@ -80057,9 +80763,9 @@ aDa aDa iYU oYM -dfG +roF aDb -tHZ +fAE lGL ykn hBD @@ -80075,7 +80781,7 @@ mxV auJ riz sCZ -sAX +ppI wdr qEt qEt @@ -80083,7 +80789,7 @@ usB qEt qEt wdr -uZK +qXt dPh pOa pOa @@ -80092,7 +80798,7 @@ pOa aox aox aox -aox +euT aox aaa aaa @@ -80570,8 +81276,8 @@ aDa aDa aDa iYU -wYc -dhb +xLR +ouY aDb dIP nPf @@ -80604,7 +81310,7 @@ nQz xyM sTq pOa -eze +dlL qgf uTw jUb @@ -80851,8 +81557,8 @@ cUd sCz oHw xOO -sxd -uvx +bqg +ahe slD nyF vpM @@ -80865,12 +81571,12 @@ pOa rJS pOa jUb -mPO +lvY sZK heE kzZ xZu -fBX +dMk nBy oiQ tfD @@ -81122,10 +81828,10 @@ kIG xeN vXH jUb -mUD +jUm cXW cXW -qKw +bLm cXW uxS uxS @@ -81143,19 +81849,19 @@ aox lMJ aaa aaa -lMJ -aaa +qWg aaa aaa aaa aaa aaa +bxr aaa aaa lZV aaa aaa -lMJ +qWg aaa aaa aaa @@ -81321,7 +82027,7 @@ lMJ aaa nmg nwi -nOz +wOf jXu jXu jXu @@ -81345,18 +82051,18 @@ sHu aPk jXu vzG -dxO +qDD crk slD +cMg +buF aid -vWt -aid -bnX +mRw hxD rBU rzq xOV -mAf +hEq dXg dXg dXg @@ -81374,21 +82080,21 @@ uOH uOH uOH cMb -tRb +vEu xyM xyM clp jUb uke -qKw +bLm cXW cXW cXW -fYh +oBA ruz ehn ehn -tsP +axJ uxS fgN nBy @@ -81606,7 +82312,7 @@ wdr fcq xfI fcq -xjh +xBX qhW xjh yme @@ -81658,7 +82364,7 @@ lMJ aaa aaa xjH -vdJ +akA wpi kVg tgD @@ -81835,7 +82541,7 @@ aaa aaa lMJ qGV -qCC +bEh tvR aaa aaa @@ -81863,11 +82569,11 @@ aaa fcq nJG fcq -dpT +aSQ oaw vSs xjh -gax +sSh mjg xJA kOK @@ -81876,11 +82582,11 @@ kOK kOK kOK xJA -hXc -aTc +xXi +hCG pOa qag -xyR +iXC hJH pOa lHk @@ -81903,7 +82609,7 @@ uxS ehn uxS uxS -tsP +axJ sBL nBy aaa @@ -81911,15 +82617,15 @@ aaa aaa lMJ aox -lMJ +pZW aaa aaa xjH -pzW +pIU dno uKy oPY -kjX +iOt xjH nzQ vol @@ -82148,7 +82854,7 @@ aDl pOa vZE tYi -rLr +ndN jUb ebG fQD @@ -82172,7 +82878,7 @@ jUb lMJ lMJ xjH -ydz +dFi dno tIl bYm @@ -82185,7 +82891,7 @@ qPC rKQ xjH xjH -aaa +fIR aaa aaa lMJ @@ -82377,8 +83083,8 @@ aaa fcq uEw fcq -fZG -fie +rxP +uhI vrP hve dRH @@ -82395,7 +83101,7 @@ vvp jzp xLv unR -jWd +iFI gCW nOZ fkd @@ -82418,7 +83124,7 @@ uxS uxS uxS uxS -iWn +jBO jUb jUb jUb @@ -82429,7 +83135,7 @@ nBy aaa aaa xjH -ybb +jPm nBF tOP bYm @@ -82634,7 +83340,7 @@ aaa kzI fxQ fcq -lkh +bEW pBJ vGx ngf @@ -82650,12 +83356,12 @@ htE xxg nMY jzp -lXS +dGQ kEm ifF olq njE -ckU +onN pOa lEu uOH @@ -82917,19 +83623,19 @@ pOa jVb uOH pOa -oca +jqp pOa pOa jUb -jDk +aaD hWD etv jUb -usw +fYq wZl jUb dyd -ybm +jXO jUb wgl jUb @@ -82943,10 +83649,10 @@ rjB jUb aaa xjH -tmJ +ocN ark uGq -wIW +iam kHk gqI gqj @@ -83148,11 +83854,11 @@ aaa kzI fxQ fcq -uwP +wsQ pTm -grp +vtn xjh -dzq +ccP bTj htE kOK @@ -83213,7 +83919,7 @@ rKQ rKQ xjH xjH -aaa +ktw aaa aaa lMJ @@ -83377,7 +84083,7 @@ aaa aaa lMJ rqa -lFV +wZb iQd aaa aaa @@ -83418,7 +84124,7 @@ kOK kOK kOK xJA -hXc +xXi uIO eHf jzp @@ -83444,11 +84150,11 @@ pAe jUb cBc aFf -pHh +ekI eNV -hUM +duk oOZ -pvC +gbJ cBc jUb tkn @@ -83891,15 +84597,15 @@ lMJ lMJ nmg vEV -qfc +jPp jXu -aaa -aaa -aaa -pnI +rSa +rSa +rSa +hKg bUm kRe -qfi +qRa pnI lMJ lMJ @@ -83946,12 +84652,12 @@ pOa uOH jUb xIK -dsE +bar nBp -ciq +dqN pqz iuB -ylO +jUb oSy gwK lCb @@ -83977,12 +84683,12 @@ rKQ aaa aaa xjH -dwl +nTk taW xNi ccD gXl -tZS +oBn rKQ lMJ lMJ @@ -84150,9 +84856,9 @@ jXu kXA ufv jXu -aaa -aaa -aaa +cly +taq +ghJ hKg hKg fQW @@ -84181,15 +84887,15 @@ cJQ fcq fcq iSk -ebn +nzD uxa bVz bNQ -gOX +aal sEk aal dPQ -rtG +xYy vJB fjD pUl @@ -84207,7 +84913,7 @@ qKs dPJ hBC jUb -lXC +nYy jUb ifh jUb @@ -84241,7 +84947,7 @@ rKQ rKQ xjH xjH -aaa +fIR aaa aaa aaa @@ -84401,20 +85107,20 @@ lVe dqo eXy wCf -niG -kfK +wVa +sFz jXu jXu hWS jXu -jXu -jXu -jXu -jXu +dzh +iUV +guZ +fBl qvY kRe -dCp -sAs +wxh +dIS mdL hKg hxo @@ -84430,12 +85136,12 @@ hxo hxo cbz uyj -pyv +jty jLb tTa kQP fSw -vjw +gip kQP dHc dHc @@ -84447,8 +85153,8 @@ fjD usk fjD fjD -cHj -cHj +fjD +fjD vsr bRG pOa @@ -84473,7 +85179,7 @@ lmL vCh vCh hVY -gin +wYs xsB qOu dqN @@ -84485,9 +85191,9 @@ shK jUb tzt xjH -vAc +sMo sOM -lyf +lDj xjH aaa aaa @@ -84661,13 +85367,13 @@ jfG gYE lBm qKy -ugJ +ybN edP -dwA -bje jXu +bje +qHC ttG -jXu +fBl pPh aFd nVG @@ -84730,11 +85436,11 @@ jUb lnR sYf dqN -gAz +tEm dqN oKI cNS -pvC +gbJ nqP syh gsn @@ -84912,7 +85618,7 @@ aaa aaa qvJ nxi -rvj +bWw hTn tVr iPE @@ -84920,11 +85626,11 @@ vfv cTQ xte mzs -sHu -kHU -jXu -jXu jXu +kHU +hDd +rSa +rSa jpG kRe nVG @@ -84956,7 +85662,7 @@ kKr hyW xOw iOc -rcW +mAs fjD aOo haE @@ -84985,8 +85691,8 @@ fhv liC jUb aRz -jEY -vVu +uSz +oWQ vJy njc ctq @@ -85176,11 +85882,11 @@ gYE uEC wgw twr -uuD -qlr +bSm +jXu fBl eEb -jXu +rSa ouc dSG cLj @@ -85201,7 +85907,7 @@ ejo jRM uKm thQ -lme +xac qIK sRD nre @@ -85270,7 +85976,7 @@ gAf tSw tSw aaa -aaa +gda aaa aaa sGL @@ -85433,12 +86139,12 @@ pQu vEH jXu lUe -uuD +gQv rNV cGL -guZ xoc -xyz +xoc +tWj xyz kdC btt @@ -85464,7 +86170,7 @@ qTx qTx fHX nDS -uXO +bPa kQP kQP hyW @@ -85503,17 +86209,17 @@ xUu mue xUu kIR +tMS xUu -moD gjk kIR ecq xUu xUu -xUu +nCL iCX oGf -ryQ +sPq rab iTH bhS @@ -85683,18 +86389,18 @@ aaa aaa qvJ adD -scy +eks fpH -egO -tWJ +vhU +eNU aQE jXu nME -iUE -gQv -jXu -jXu +dwA jXu +dob +qlr +raL mAy cLj kRe @@ -85724,7 +86430,7 @@ cjJ cLc vkR kQP -dWF +jmN xOw mux pOa @@ -85772,7 +86478,7 @@ jUb gll azE xxU -iVB +bxq lpN sWZ qEf @@ -85783,9 +86489,9 @@ tSw aBQ qEf qEf -qEf +aIl gXF -gmS +atk bhS cxi uAC @@ -85947,18 +86653,18 @@ jXu jXu jXu jXu -uuD -gQv +bSm +jXu +jXu jXu -gVb jXu -eRx +lJo xJV -oOO +jpI uxd sfG oor -qnb +jqr wfU hDX hDX @@ -85975,7 +86681,7 @@ mmR nyk qIK hKq -bor +iNk iLV mQR lud @@ -86012,27 +86718,27 @@ rke jUb nTn jUb -vAF +fpg snb -tGu -xZJ -rGE +kpV +qOO +gGK snb -vAF +dyq jUb iEm kym jUb -dIA -paQ -caC +dLn +tJo +uiR hbv xTw erF xTw bhS fqR -ajM +mwm fje tSw jsq @@ -86047,8 +86753,8 @@ kNV gnL ckz dWA -ulb -aaa +ecz +fIR aaa lMJ aaa @@ -86184,7 +86890,7 @@ cmB cmB opF sbX -irh +jTi wyn iOr aaa @@ -86204,10 +86910,10 @@ mVS xxp twr sxn -uuD +oif vpU twr -rSa +fhn jXu jXu fNH @@ -86229,7 +86935,7 @@ aok aok bgx mmR -hQH +mgb kQP kQP kQP @@ -86280,9 +86986,9 @@ jUb iEm kym jUb -cgJ +vVc cqD -eEV +pmb bLQ tXx tzE @@ -86466,13 +87172,13 @@ aps xgB jZW jXu -gPz +xkb xgB nsM twr mdW jXu -kGM +hvo cHN mXX oor @@ -86489,7 +87195,7 @@ mmR pyZ pOb xOj -hfv +sVp sVp sVp sVp @@ -86497,7 +87203,7 @@ bLC eVh hKw xOw -piC +wAk pOa pOa pOa @@ -86526,35 +87232,35 @@ cIS jUb rvI jUb -iqK +tOT tJr vSI ude jSA oZO -pXQ +bMS jUb dqN -kym +vCC jUb -iOf +jdH oBv -goj -mav +uOo +via myc wSv fuA aPq fVa -wVf +uFr vZb tBJ -rHv -bEL -keq -scb -suz -jIU +tnG +rwF +egR +tDZ +bnO +mbt tSw vUM bhS @@ -86695,7 +87401,7 @@ lMJ aaa aaa cmB -jXU +sXm fiA fiA bSb @@ -86715,7 +87421,7 @@ srk qGP sHu gib -nUt +sHu rMp cVL jXu @@ -86730,14 +87436,14 @@ twr twr jXu jmR -ohf +xap oUx knT ivX bgx edA fkC -eFD +dBv cdY wUC dfk @@ -86750,7 +87456,7 @@ cSb hYx yhL hYx -faq +vIt iev mkb sly @@ -86763,10 +87469,10 @@ ahD wki jIY mjr -tbK -rLm +bXQ +cxC saN -bpD +tPe sVY ivM sdC @@ -86781,7 +87487,7 @@ dqN qKs jUb jUb -tpC +mqz pHv veS dGv @@ -86798,20 +87504,20 @@ jUb jUb jUb jUb -tfn +aJb oBO ieH vDc miX bfg -gND +iAu tBJ -plu -bpK +cxw +oxj gms -cQm -bnU -biI +wov +jUA +dim tSw vUM tSw @@ -86957,7 +87663,7 @@ rVb viQ dTQ rOP -aII +jGO iOr aUn aUn @@ -87001,7 +87707,7 @@ jLf iqt mmR kaf -kQi +auO xXf gOb jld @@ -87023,12 +87729,12 @@ mjr tbK fZa eXA -sXE +jwE sVY mjr kUZ mfp -xqm +bCr pOa bAA pOa @@ -87040,8 +87746,8 @@ jUb kpB dIK jUb -jov -yih +jsj +bNa ixv jml wRZ @@ -87061,19 +87767,19 @@ nMf bIv miX hIx -nzh +qOk tBJ gIB -bpK -wnN -upm -bTn -dLs +oxj +tOV +oic +hqb +yje tSw gOp bCM -lOf -drm +vKd +ikY tSw lMJ aaa @@ -87212,7 +87918,7 @@ rft aXa aXa aXa -dHQ +pyy jjM ilg cmB @@ -87243,7 +87949,7 @@ rNP rNP mgv mWE -sPL +lpS lpS bkF jXu @@ -87260,7 +87966,7 @@ mJo bzH bzH bzH -fjV +ocn aOg piB hvB @@ -87313,19 +88019,19 @@ jUb sje jUb tck -tFr +kHg nMf vDc -amb +npO nCc -xGk +msC tBJ -dTH -wek -rPc -xpO -bpK -wMM +gLY +jTR +mru +faL +oxj +sbs tSw lah mPH @@ -87458,14 +88164,14 @@ aaa suD suD iUv -gQT +oVL aXa jMx -umN +azZ fdl aht ivu -uEA +jJl iAR dhW aXa @@ -87515,8 +88221,8 @@ aUj rVK baW bzH -fVh -aPO +mNx +gOb wCT qMi ioz @@ -87542,47 +88248,47 @@ dEX mLS dRY kwX -kJH +nZq pOa iar uYD sSn nDT lYG -fmc +uiM nVq dIK jUb -vXc -gZD +kpi +stZ tuC rDJ guC fTE hBY vVI -ppG +gmN vun -pMs +iRy uLs wFa iov nwl vun -rtX -wGk -ukN +lyx +tFr +nGd vDc -jtZ +rdk pFg jXQ tBJ -fNx -odW -rPc -ryv -bpK -sRZ +frw +vye +mru +dHY +oxj +vTC tSw kPZ vUM @@ -87593,9 +88299,9 @@ vQg vQg vQg vQg -pjb +eEn +gGh gGh -rxz gYU wlj rIG @@ -87796,10 +88502,10 @@ mjr nxz nLq sVY -pEH +uyY vWF utt -utt +wLu pOa uAM vZE @@ -87810,7 +88516,7 @@ fYc jUb jUb jUb -ymd +ina drE vfa gXz @@ -87818,13 +88524,13 @@ rSw vJe jfO wDq -mVb +hgu vun -vok +kcZ dMN ejg ehX -uxI +tgn vun rtX tFr @@ -87836,23 +88542,23 @@ xdJ tBJ tBJ tBJ -qQs -bpK -pqp -pGt +oho +oxj +tDn +bhl tSw tSw vUM tSw -sfl -eqz -lUP -vhS -qrD +uaS +lMh +sFo +hse +frm vQg kvN aGD -kvN +wcf gYU ppJ gYU @@ -88039,10 +88745,10 @@ hld iev rKI rEO -ejS +iOc sVY hlu -ouM +eaa sVY cIU cWr @@ -88053,7 +88759,7 @@ mjr nxz ueD sVY -mjr +wDH rSx pEH pEH @@ -88065,7 +88771,7 @@ jwp qCL uIM ahg -sSN +grm sSp wvP wUQ @@ -88077,38 +88783,38 @@ oPv nKE xtu rvb -pri +ver elb sja elb -hlX +ims rvb -nTs +jGt tFr pDU ngl duw hyn -hNN +wUH lYx -hYN +qvP cyX jhv -nRR -pqp -gSF +tqh +tDn +xmD tSw qjy sMD khD pvm -pqu -lKS -hBh +pmc +xCT +oQN jVG vQg gYU -lji +nDr klt fkP mhR @@ -88226,7 +88932,7 @@ aaa rrt aaa suD -cYX +iFz jmv iFz fhP @@ -88235,13 +88941,13 @@ aXa kKZ aXa aXa -xdR +iuE oUE aij oGZ aXa myH -kre +vHM wZz gEl egg @@ -88311,7 +89017,7 @@ yfT klf sVY jfa -mda +anv rur knK sQx @@ -88320,7 +89026,7 @@ vXH pOa wKe aez -vpB +ajK aSe jeL jxc @@ -88487,7 +89193,7 @@ tGX tYm pZp tGX -cYX +iFz kKF vjF kZF @@ -88525,7 +89231,7 @@ rlU qrg cpi cpi -ucI +fdI qpD aEH aEH @@ -88548,24 +89254,24 @@ piB bnv cOB gBN -jtL +oYz bzH bzH unj ivB -iOc +qaw sVY hlu ouM sVY -luL +knd cWr ecO mjr inH flQ mjr -fUM +eZf sVY sVY sVY @@ -88575,10 +89281,10 @@ pOa sQY nPt qSk -iNh +pBs lgC -aZq -rxR +avb +uPi sfF wsv hcU @@ -88591,11 +89297,11 @@ wUQ jGG agZ rvb -tnN +mhm eih foP sRm -hdF +rjy rvb myc tFr @@ -88605,7 +89311,7 @@ nGr aST tBs vRN -xoj +imy rOF ryf vnV @@ -88617,7 +89323,7 @@ vpP tSw wRB iix -jvh +cvy xvf qKi vQg @@ -88740,7 +89446,7 @@ aaa rrt lMJ iUv -ocL +vEw bBK qEG wBn @@ -88762,7 +89468,7 @@ ejR cji vjF ejR -oEt +kZF sjP sjP sjP @@ -88791,8 +89497,8 @@ jSm vQs pVi kod -mXE -wEW +dXp +szu voS vQs cyR @@ -88800,13 +89506,13 @@ rVn uwx mgJ aqG -isa +iyv bGt uRu piB gBN haq -nkD +nht aqG nQw tEr @@ -88815,7 +89521,7 @@ sVY hlu ouM sVY -gcc +rIa cWr ecO gsO @@ -88834,7 +89540,7 @@ tWq pOa qIP jkT -eKr +gdp eRc qNi jxc @@ -88865,9 +89571,9 @@ gKO uYp rOF uaj -lWI -xnA -jZl +cZi +kNA +mvN uXG efC hLZ @@ -88876,11 +89582,11 @@ bzN afo aMf xUX -yjW +fAt vQg tVy hto -bnH +jUj dLy tPI rIG @@ -89011,7 +89717,7 @@ tcW tcW tcW tcW -axO +tcW tcW odh tcW @@ -89039,12 +89745,12 @@ rlU cTU wHW wHW -isp +uSL rlU aEH aEH lpt -mTp +uwx vQs kdA kdA @@ -89069,7 +89775,7 @@ sXr ybn fLp sVY -mce +sDT mjr mjr mjr @@ -89078,7 +89784,7 @@ ecO mjr erS oMR -dFJ +tNt qRf xrd fKG @@ -89089,7 +89795,7 @@ clp etn ayH pOa -hKP +bjK jqQ mbV hEA @@ -89105,22 +89811,22 @@ iMv nKE xtu rvb -uod +wIF wWs fOu fBJ -twF +piJ rvb nsD tFr nMf -lOV +dub uYp -jsO +kbB cpR -lxC +jHQ uYp -uNq +yiJ sfA eQO xjI @@ -89136,7 +89842,7 @@ hrG lPB vQg gYU -upZ +pIs gYU kho gEk @@ -89305,8 +90011,8 @@ uwx aIE aMA aMA -aNT -vJt +anW +fCO hIE suE sUm @@ -89316,7 +90022,7 @@ vpX sIQ fwZ bzH -kNy +nZQ wew gBN udI @@ -89327,7 +90033,7 @@ xOw iOc sVY vKt -ebq +uWA mjr mjr cWr @@ -89338,8 +90044,8 @@ sVY sVY sVY sVY -dVR -sfO +pJN +iWB uJm sVY pOa @@ -89352,7 +90058,7 @@ odu oNP bMY sSp -pgP +sAv pSl eUN jpU @@ -89360,24 +90066,24 @@ jpU vJe qXh ehg -aPe +hgu vun -foV +mWC uTj usC ehX -fPR +wYi vun gQG tFr oqi -ihB +luB uYp -oAj +pCl qOV qQu uYp -eFU +vAX sfA dvn qkJ @@ -89386,14 +90092,14 @@ tSw tAH ifQ tSw -xNu -jjL +bQN +igi sMl -wRt +bwh wEn wZe jsr -hto +wyC gYU rbF rxY @@ -89525,7 +90231,7 @@ nyf uZa nEZ wZz -bmX +sOw qOT swR tGX @@ -89533,7 +90239,7 @@ iFz oDX dfB aCQ -xst +mmA wZz wZz wZz @@ -89557,7 +90263,7 @@ rlU rlU lMJ aEH -kQx +rhW grR xAZ wcs @@ -89591,8 +90297,8 @@ flx ntX xyq sVY -jPo -apB +uCq +ygS ooP sVY sVY @@ -89602,28 +90308,28 @@ sVY xxk ahr bMY -sTe -mWa +yim +rvq fFi iWD vDz pBN sSp -ppG +iwj ppG nuO xQC -kLZ +ckE iUJ bJk -ppG -ppG +mpk +pyU vun -cvd -uWj +eFG +qpf hwe iZn -mJp +rar vun uzJ aUt @@ -89638,7 +90344,7 @@ ikS cnc igP sjx -axR +qXu tSw tAH fKP @@ -89649,7 +90355,7 @@ vQg vQg gzm vQg -iez +bVp lTA gYU gYU @@ -89772,15 +90478,15 @@ iUv vjZ dAc lyu -otk +qDg ihb lfm hOR -ybs +uGx ihb -wuh +pEI jDB -ovL +hei wZz dXA lnM @@ -89859,7 +90565,7 @@ bBA txz wYe bMY -kua +pUM mna gVn cXz @@ -89898,7 +90604,7 @@ rOF tSw tSw tAH -ifQ +waD tSw jTy vQg @@ -90028,7 +90734,7 @@ aaa iUv iUv pCh -rGb +vyy jFK ihb mxg @@ -90042,7 +90748,7 @@ wZz wOm fpE wZz -rrW +lPJ vtx jxS mQr @@ -90071,7 +90777,7 @@ aaa aaa aaa guX -rbI +uht nZh hSf pID @@ -90114,47 +90820,47 @@ gUt gUt dvZ qQm -isQ +waF bMY bMY nur jfr -mBb +vIn pYw irL oNP -sgS -ccV -nor -eMU +rEt +xST +wVy +dpI ttE aPm sZH wUG eGJ -dCN +rpw gQG gQG gQG gQG gQG -lcM +pLz lgT hDp sOn xUb -rtn +ePg eMI jfN eMI -ctO -egZ -hhU +kDa +onv +sFY xar -xBz +kKh tSw fje -tAH +swP ixY tSw tSw @@ -90299,12 +91005,12 @@ tdW tdW tdW tdW -qNI +lhF uRT gQw mQr aCQ -aEl +hDE wZz wZz wZz @@ -90328,13 +91034,13 @@ aaa aaa aaa guX -jRv +xZv boc xnt ifn -kzb +uOi guX -cli +ocB kSN qTF euo @@ -90362,9 +91068,9 @@ mPh cmC fDk fDk -oSh +sUx fDk -jeX +kYH avq wcN uyr @@ -90386,8 +91092,8 @@ jCn uHt uHt gTn -eZb -wlt +fod +uVx jso qWR iFi @@ -90410,16 +91116,16 @@ fYx xSQ rGB qEK -pyd -bsZ +fMy +pTL rJI taX tSw -rQB +lmx gmX lHK -tey -jDP +woz +bas tey mqe tey @@ -90551,8 +91257,8 @@ tUX drq why cwa -rXB -wAp +iki +wzd ybu wPM tdW @@ -90585,17 +91291,17 @@ aaa aaa aaa guX -xlw +kkX ddP bVk bNP -orC +asi guX qIp mLD sEM jWR -iHf +fbE pAk ykS hPM @@ -90637,42 +91343,42 @@ bax ghc cxt oNP -auH +gDh tFr nmQ ije -sdL +lgw pFS uEz nWy ejp poM -uSn +xQh dNB nmQ nmQ nmQ nmQ nmQ -vRz +wep xwD dVt iHn ubd -wUc -nmQ +rUp +ggO nmQ nmQ qZa -xQh -wYo +nCr +sEv +tSw +tSw +tSw tSw -xaj -jJY -iDN xtz tSw -ueR +nra iJj uZD hKv @@ -90856,16 +91562,16 @@ avK avK tEj jPU -uoe +oKM +oIa oIa -qSJ lVH vtF -qSJ +oIa pJR -oXT +uJx sRT -nEL +vsU gaU flu jbd @@ -90878,7 +91584,7 @@ tOh lTM dYb psv -tLo +mZz cCN dYb dYb @@ -90888,13 +91594,13 @@ htd xAb nvI oNP -aww +ehE rlw -aPA +bTm ylf tzI bMY -dAx +uET iZF qyr pKP @@ -90914,22 +91620,22 @@ yfg bqX iMr pyM -jpY +oNy bqX bqX bqX iHn nmQ qZa -fEK -fEK -tSw -tSw -tSw +aec +aec +aec +jJY +xaj tSw xtz tSw -dEp +mBW iJj jAm lFZ @@ -91070,7 +91776,7 @@ tzJ hxW cTp tdW -iFe +lrh ncv cez mQr @@ -91120,12 +91826,12 @@ wvo xCl nMz pJR -qJx +rQz kfA rWH oOE aVd -nHn +cKN mig wMx cMQ @@ -91155,11 +91861,11 @@ ePX svQ duu pKP -lTP +aWR rQd cJm jGw -dra +bJG vPO bqX ulR @@ -91178,7 +91884,7 @@ lrZ kiz nmQ oDW -fEK +aec uMi qLR wsW @@ -91399,12 +92105,12 @@ ukk rGm gqX htd -oGK +vMV qPJ -rkQ +luN wde jJd -hlU +rqc umS qPJ bgS @@ -91417,10 +92123,9 @@ xbY scB rHk sXT -kyl +sTK bqX -pEW -iqz +jYy iqz iqz iqz @@ -91428,12 +92133,13 @@ iqz iqz iqz dVN -uqL -jgT +dVN +iqz +iqz vZF xCR -dIL -pPU +kiz +svp fxW mkO tyy @@ -91443,7 +92149,7 @@ kNO hav xGX tSw -bJc +bRq iZi kVN hKv @@ -91579,7 +92285,7 @@ ahS fWm tdW urf -eLd +esK qNj tdW cTl @@ -91600,7 +92306,7 @@ sch kSs xUH euX -uKR +gvC nRZ gES cGu @@ -91627,7 +92333,7 @@ ihq uCq hZZ htd -iUq +uoe oIa nnq vnE @@ -91658,7 +92364,7 @@ gqX htd oGK qPJ -hpF +ksZ waH vbV ixr @@ -91676,31 +92382,31 @@ edo pXM iNc bqX -jYy +nKM iqz bgt dkx dkx dkx dkx -dkx -dVN -tqd -aeF -hNV +jOw +uqL +hdk +jgT +vru lrZ -kiz +jRc nmQ -dAu -fEK +fck +aec ett -sqb +oED piT wLz tSw xtz tSw -hqo +hPv iZi kVN lFZ @@ -91842,7 +92548,7 @@ gEg ikO pNY qjr -fGb +lNh yey cWI gYi @@ -91857,9 +92563,9 @@ sch oWZ oPn oPn -lhc +vUC sch -asX +bRF tjh uTF tjh @@ -91898,7 +92604,7 @@ kEp aVd kfC pJR -mIP +aHN qRI urA tYW @@ -91920,7 +92626,7 @@ nsb izD evY sli -dZU +oFG lsJ gQG tFr @@ -91930,7 +92636,7 @@ jgs uyw pcM cNk -fIG +bEA bqX bqX jYy @@ -91940,15 +92646,15 @@ iqz iqz iqz iqz -iqz dVN -vPp -hZV -hZV +iqz +iqz +iqz +ubF hZV -nZm -nZm -aeB +skW +mXn +iwL nZm nZm tSw @@ -91957,16 +92663,16 @@ tSw tSw xWF tSw -oum +edr iZi kVN -vtD -mKv +laa +tlI qri iIq qfZ fkW -kLF +ica otu aaa aaa @@ -92093,16 +92799,16 @@ dcN vae slI pPR -xnS +jJp gYi jTZ -jRh +jMJ qbr ouj aBL yey cWI -hSd +aZA tjh tjh mAm @@ -92133,8 +92839,8 @@ aJS aJS akF pQG -kUq -dvk +wtB +vyv aJS aaa ihq @@ -92150,7 +92856,7 @@ siL grl noA pJR -sGc +fGs mIl fJp bSj @@ -92183,13 +92889,13 @@ gQG oBO jNl pKP -jet -myS +xpL +eWp hGl kha -oKO +dbD bqX -saa +ulR ffj iqz iqz @@ -92197,17 +92903,17 @@ iqz iqz wOl skx -lxw -dVN -jtl +bjy +iqz +tqd +pbz +dpl hZV -kBR -kBR -nZm -dyh +bAI +idL iJC -gfo -sru +pts +niz tSw juV bsZ @@ -92223,7 +92929,7 @@ pPp sFw rmO yby -gPa +iWk otu aaa aaa @@ -92348,9 +93054,9 @@ qrr sjP sjP sjP -mzD -mzD -pQx +sjP +sjP +ppm yey jTZ aBL @@ -92372,7 +93078,7 @@ iRW jff iRW hRv -sMu +rJQ pHb vMX lsP @@ -92418,7 +93124,7 @@ dhX nIR gBD twl -fqF +bcx rhK rKJ wFe @@ -92446,35 +93152,35 @@ xga eIO eIO fvE -osM +hyh iqz tqd -iIW +hFD pbz vfU mAb mAb -ePM -dVN -jtl +uYI +iqz +hjx +hZV hZV -gSN -gSN -kOM -xsv -wsF -gSN -dGi +hZV +nZm +gJD +eEG +dPm +thw tSw vpP tSw tSw sGA tSw -gBz +mKf fgl btx -gBz +mKf otu otu otu @@ -92633,7 +93339,7 @@ uGD rlg keL nsZ -tDz +wxM tjh wsX wsX @@ -92667,14 +93373,14 @@ pJR lJn psy htG -wYG +qaN pJR uwC ndS urA pFG gBD -nmt +xxn fRu hVE xXw @@ -92703,7 +93409,7 @@ iQj qaT tAD fvE -kXl +xiW iqz jtl iqz @@ -92711,23 +93417,23 @@ iqz iqz mAb mAb -ePM -dVN +uYI +iqz bxE hZV -cft -xcp -kOM -osD +xUm +gPl +nZm +wvB hvR fgA -vPH -qZM -aID +vtm +hjG +isk iUm -qKS -vke -nOl +bVx +fWc +muZ jay mRy wBW @@ -92879,8 +93585,8 @@ fNh sUC mtG uyd -ltt -mLv +cJj +aOC eyd iMs cJj @@ -92905,7 +93611,7 @@ dWf nhP aOc aPw -ome +lSy ome wpJ iUf @@ -92960,7 +93666,7 @@ eIO eIO xit fvE -stq +prc iqz fmo vfU @@ -92968,22 +93674,22 @@ qXL hFD mAb mAb -ePM -dVN -qEP +uYI +iqz +iaK hZV -pap -bMh -kOM -kOM -rmD -gSN -wGS +eOv +jBU +kgx +kgx +nRU +imt +meK tSw nNJ iUm -iJB -hQT +bNc +hPk nSe nSe xMz @@ -93125,12 +93831,12 @@ pKa gYi cUw gYi -eCx +gYi gYi gYi gYi cWI -ajq +akT lAM osw lAM @@ -93144,12 +93850,12 @@ rQS xqI gWc oAN -ufX +iKj vQI -oYn +mCJ lsP ekP -ohw +xIp iPX wkL rsI @@ -93193,7 +93899,7 @@ ilq kAp jnI ghK -sxs +cky fHd gBD eMH @@ -93210,14 +93916,14 @@ xJI tIx wmT hCt -viS -rYN -nZZ +uUb +rXW +bSs rla eIO sGn fvE -nte +dYG iqz iqz iqz @@ -93225,22 +93931,22 @@ iqz iqz lWd cBg -uId -dVN -cSW +hbO +iqz +ogk hZV -xeT -lxT -pYo -kOM -sKG -uWM -gui +daa +uiw +kys +kWE +eky +kWZ +wnW tSw oBD iUm -iyi -hQT +vCc +hPk xMz xMz xMz @@ -93394,7 +94100,7 @@ aaa rJB kaU nqD -uCW +sfK rTw aeq aeq @@ -93404,7 +94110,7 @@ sKs lQC wsX bPk -cQq +kCt tjh wsX wsX @@ -93474,30 +94180,30 @@ kzj qhG iqq qWK -mXK -iqz -iqz -iqz -iqz -iqz +cdk +uqA +uqA +uqA +uqA +uqA +pCw iqz +jOw iqz -iqz -dVN -wrE +fyK hZV -kHV -shY -gdz +hif +otI +fWw pdV -nHK -ykH -lpB +cjv +qhA +dwk tSw agR iUm iUm -erG +iYW tMA nSe nSe @@ -93649,12 +94355,12 @@ aaa aaa aaa rJB -lqC +jNm dxe wTO xxZ anl -uwg +iCr apJ lDe qGQ @@ -93675,8 +94381,8 @@ aJS aJS hlB vrJ -iXa -uGb +fEO +cFr aJS aaa ihq @@ -93688,7 +94394,7 @@ tKN aaf dsQ mZL -geg +xJl aGQ acf hmq @@ -93706,9 +94412,9 @@ aaf aaf inX pRh -gMi -hUG -yaM +uCH +mWY +mtb oSo nNY htd @@ -93727,7 +94433,7 @@ dHN fVY mVf fhe -ksl +ocQ eIO deO fvE @@ -93737,26 +94443,26 @@ iqz fnc bCo bCo +vPf bCo -bCo -bCo -bCo +dVN +yij jtl hZV -teR -hzi -vvd -kOM -uYG -wfa -gui +eNl +hZA +jLy +kgx +hKB +vLo +aAb tSw dbX iUm -sUi -dzM +viS +huy iWJ -izG +ePN izG xPb izG @@ -93907,11 +94613,11 @@ uzi vRi rJB wmc -wrb +lAY uQK dPL aeq -wya +cTA apJ lDe qGQ @@ -93920,7 +94626,7 @@ jKS oLK dyr qyt -fOd +vYD axe wkL rsI @@ -93957,7 +94663,7 @@ kcn qsL dho bCt -plw +whr ndS qRI qRI @@ -93984,7 +94690,7 @@ mVE hxq nJn nqB -mtm +kxa eIO hKG fvE @@ -93994,31 +94700,31 @@ iqz iqz iqz iqz -tqd +sTW cYx -pmw +cXH joj -nBU +dWI hZV -eyy -ndZ -hjF -kOM -pTx -gSN -qpu +wWo +vTV +vow +nZm +cuk +vLo +hZy tSw iDN iUm -irW -gmp -meu +ncV +sRL +pmW iUm jdg iUm bxX iUm -qfK +aAS dDo biA gRb @@ -94168,10 +94874,10 @@ aeq aeq aeq aeq -hBR +dRX riY aeq -qid +vDh ewj ycM bHr @@ -94235,7 +94941,7 @@ nxy aYJ hEc bFN -opa +qJn hYA jsh rvE @@ -94246,35 +94952,35 @@ eIO wKC fvE kKT -fBG +kMk wPH xyA -drW +hgB jxm -bcr +unt bqX bqX bqX bqX hZV +xRR +hSQ +flX nZm -nZm -oKD -kOM -rGK -gSN -xZi +mpw +uYL +lmk tSw fdX iUm -oZi -bfl +xEr +xRY chV eje eje hlq eje -eje +knI ewB dDo hQu @@ -94421,14 +95127,14 @@ aaa aaa aeq xCo -dAr -rRf -cuY -tgy +loY +tTP +fdQ +uou agc apM aeq -dfE +dFW fYJ ycM rOA @@ -94458,7 +95164,7 @@ uoe tKN aaf dho -ofc +wss gGy qVc dMY @@ -94473,13 +95179,13 @@ lPZ lyN cem fix -epB +yeA tnm jzN sUy dkL uOd -glW +pDh jzN qyI qaP @@ -94510,22 +95216,22 @@ bqX bqX bqX cJL -kul -ati -kOR -bod -bod +fjq +wvh +iEv +nZm +nZm nZm nZm nZm -uOS +ner nZm nZm tSw tmL iUm -lZC -bfl +aDo +kou dbA nSe nSe @@ -94704,7 +95410,7 @@ iVA mlK dNX dNX -cAB +nyV dNX lKZ amy @@ -94733,7 +95439,7 @@ lLk fix haP jzN -wjW +fEC eQe oQS iAA @@ -94747,12 +95453,12 @@ jgE jgE jgE jgE -kyf +njX njX njX njX tug -oND +bnl iEK iEK iEK @@ -94766,17 +95472,17 @@ aCE dLN mpJ eGm +qQY njX njX njX -jcd -tNw +gSW oAu bxf njX +cRw +uGE njX -njX -jcd vNv oAu wrg @@ -95001,7 +95707,7 @@ mYq htd rkg wVo -wVo +kdL mYs wVo sDo @@ -95192,11 +95898,11 @@ aaa aaa aaa aeq -wzF -sDw +pfs +jcc eew -hxF -daO +fnO +gHA kaC anl vDh @@ -95208,7 +95914,7 @@ ouU orx eeq sDS -vDa +rsI rCo gGo gGo @@ -95216,7 +95922,7 @@ goX gGo gGo gGo -gGo +fYC tnP oKc gGo @@ -95261,12 +95967,12 @@ sVH jON kFK kFK -bQM +rtD kFK -ceZ +kAc lTB cbi -wWG +eDX kFK ceZ ceZ @@ -95284,12 +95990,12 @@ gmt qhx ceZ ceZ -cms +lGT gmt xDz gmt +rDM gmt -oCw gmt gmt dXQ @@ -95303,8 +96009,8 @@ izG tDU vkj vPq -rCJ -awF +usD +jFZ oIW sou iaQ @@ -95456,7 +96162,7 @@ aeq aeq aeq aeq -bhy +jpj ewj ycM mMM @@ -95486,7 +96192,7 @@ tGL tKN aaf dho -oYd +vSh gGy gGy dMY @@ -95501,13 +96207,13 @@ lPZ lyN cem fix -fix +mIu haP jzN tNC nvc nBs -cke +mun jzN bcq sRf @@ -95560,12 +96266,12 @@ lYc tew iUm gRb -iUm gRb iUm -gRb -gRb -gRb +iUm +iUm +iUm +iUm aaa aaa aaa @@ -95709,9 +96415,9 @@ eft upR nJu pti -rEy -ggi -gmz +cvw +cvs +mMc ahj jxV ayV @@ -95728,9 +96434,9 @@ gGo olw pxT xEt -xEt +wXT jcR -cBJ +fky vWI txH urs @@ -95748,7 +96454,7 @@ dUj qVc wNh veO -hXK +iAj duI duI wtX @@ -95777,9 +96483,9 @@ suW hJF cZK ihF -nrG +cXg nyy -tBB +gVl usg fma ebV @@ -95789,7 +96495,7 @@ fma xgi sck iwA -sck +puP wsL wOS orv @@ -95800,25 +96506,25 @@ cId rQl oIg wBq -neA -vLU +bEC +lsV kZf jxW svS rhU -pjX +kYP mGI jjs dKC xLu dKC -lqd +ezP ctL oPD iUm lMJ lMJ -aaa +lMJ aaa aaa aaa @@ -96013,7 +96719,7 @@ sLd mRn dho rLy -qkW +vQe ndS qRI qRI @@ -96042,7 +96748,7 @@ eut nZC cwq rgS -npD +vzW tKl ose tzq @@ -96064,7 +96770,7 @@ jxW svS tjE rDB -nFa +gvZ lqh dKC mHK @@ -96215,12 +96921,12 @@ rrt lMJ iTZ iTZ -xJi +czt wPG -pHg +sDK iTZ -mpp -uBP +oHJ +eYT nUF tNn ltb @@ -96258,7 +96964,7 @@ tKN aaf dsQ kGc -tqI +dTV gkD nXm wNh @@ -96276,9 +96982,9 @@ aaf aaf inX sxA -cwu -mYJ -sDj +cPU +ygt +dqu oSo wpx htd @@ -96307,7 +97013,7 @@ ekB aJa eut gle -mOx +xYV syC gqm fHD @@ -96486,7 +97192,7 @@ vZm kYg mLL kYg -ueG +rzY jVv esR ieV @@ -96505,7 +97211,7 @@ dCo vWI wwY wwY -nTK +qcy olw olw wEG @@ -96584,8 +97290,8 @@ kZk kZk dKC tVR -ovV -iMp +vbt +oRV iUm lMJ lMJ @@ -96743,18 +97449,18 @@ ljf kYg nnt kYg -vVm +mnU pXC pHb qwh mrL fnN -mpC +cqd ieV qhz juj iHD -ugE +vhj nhh rzJ dYh @@ -96763,7 +97469,7 @@ mmZ xCg iaZ xCg -mow +rFq olw wEG htd @@ -96802,18 +97508,18 @@ xdX pZc fak jUh -uPi +vsI cZK -mTs -cdq +wfA +cBV wsD -cdq -tKM +cBV +xlv eut -vkP +bUo jrR jtS -osC +bFH mMl lhT cqT @@ -96825,11 +97531,11 @@ gwf gfZ gqm jZP -cDA +aIO jrb -lkL -bkm -cDA +vEC +eOo +rRJ edH mHL svS @@ -96990,7 +97696,7 @@ jOF iDq mPT fCn -nxQ +pyh aja lyF woG @@ -97001,7 +97707,7 @@ lPl prY mLL jxV -tCG +pXC pHb qwh iQg @@ -97059,7 +97765,7 @@ ghk aTi fak jUh -wXr +aLF cZK sGm ola @@ -97075,7 +97781,7 @@ uBy kiy qDy reL -cRW +deH eut kwy gwf @@ -97248,7 +97954,7 @@ fOf eZI dgD kYg -pqh +vGt fYb mYX aEj @@ -97266,7 +97972,7 @@ htb xdm fxj wJL -wJL +jpX iHD alE lpo @@ -97297,7 +98003,7 @@ wBs apw eVX syo -lSz +nue vQe tvE kWg @@ -97319,14 +98025,14 @@ nuS vGz uqp eKA -mnF +sza eKA -fqp +azF eKA uqp kaF bse -wkC +eIV gcU noN bCc @@ -97522,7 +98228,7 @@ mrL gHo rFU ieV -lVn +aNu wJL kdO fHU @@ -97540,7 +98246,7 @@ sey hPM hvr syo -onp +bUt vNG tIR tyY @@ -97580,7 +98286,7 @@ ljm cOQ mFQ cOQ -ezT +mij obN gwf dMz @@ -97609,7 +98315,7 @@ nCa sIX svS gma -jxA +nMP dKC uGg uGg @@ -97784,9 +98490,9 @@ fAL olw rGC dFz +tcu alE -alE -gSD +dMO vWI vfC rGC @@ -97797,7 +98503,7 @@ wEG htd kGq syo -vDC +oOz tLi nnh tyY @@ -97809,10 +98515,10 @@ njP gLe cSg uYl -hlD +tOX syo -ilH -qin +miW +jXw tvE tvE bUO @@ -97833,20 +98539,20 @@ ibw nIP gFQ aDm -aaB +non vro -bfF -yaj +mmK +ikr xKK gVO gwf hCK eut -pfK +fZw wRD -sUp +lqW xIM -yeS +qTU eut beZ gwf @@ -98018,7 +98724,7 @@ ksg aGM rpz dgD -jGl +rtI kxA kAT wVt @@ -98030,12 +98736,12 @@ kYg kYg ylZ rKZ -cYd +kwC sWV sWV sWV sWV -xln +qJb fEn hME olw @@ -98054,7 +98760,7 @@ ozX kON vjn syo -qsQ +qPF hlD iox tyY @@ -98066,7 +98772,7 @@ jxv sqJ gPA lZM -oRT +giR syo lSz vQe @@ -98074,7 +98780,7 @@ vZQ tvE kso fIo -wNH +qMW lcG iVE vYg @@ -98095,7 +98801,7 @@ wQI kZx wQI kZx -uLP +esT gwf vBG eut @@ -98115,12 +98821,12 @@ uBF raK dOA gyQ -hKE +qSP dIW iTc qfQ cLk -reQ +oxR svS dKC qkX @@ -98129,7 +98835,7 @@ uGg uGg uGg dKC -iDU +nFa uGg lMJ aaa @@ -98290,19 +98996,19 @@ sOZ uWo jMy jOQ -sTi +aHr mhA xNo woV -mQa +bkZ xNU iJd nVy -stk +tGI daC -xVY +mQo xNU -hLj +eFJ usP spd usP @@ -98329,27 +99035,27 @@ cnA nNw dmK tvE -iME +dTp fPh kgr mnq mGh -vYg +hTb kwp wZw htd saU -ooP +tgI mvR -enw +iGT bPi gpB sky -ihV +xAp ipM -vPm -sQB sxB +sQB +vPm ipM wQa hkH @@ -98377,7 +99083,7 @@ fhi fhi fhi bft -lwR +jws gyQ iVt iNi @@ -98533,7 +99239,7 @@ nuI qJa dgD kYg -tpr +jAN wxj wxj wxj @@ -98551,7 +99257,7 @@ iOS iOS jAP fEn -xTs +xXC xNU iUb exr @@ -98579,7 +99285,7 @@ nCB wll gpS xuH -rVC +jdv ljD syo kBl @@ -98587,9 +99293,9 @@ vQe iJl tvE wNH -fIo +jYr kso -aun +lcG ngg avc kwp @@ -98598,7 +99304,7 @@ htd saU ooP mvR -gXI +mME iQi fGv knY @@ -98621,7 +99327,7 @@ xVD swV ili cpW -iow +uVE pxt oRM gal @@ -98629,7 +99335,7 @@ fMn gal fgH gyQ -hMc +hSl fhi fhi fhi @@ -98789,14 +99495,14 @@ ikZ gdb ikZ gdb -lzV +hYd olD mLx eiO aOH nvA nWu -ftY +fii kYg kYg pHb @@ -98806,7 +99512,7 @@ jMy uJs sOi pKs -sCk +bHN ilh ilh ilh @@ -98850,13 +99556,13 @@ tvE aan tvE kmZ -eUO +tsT htd dhU dkW mvR bgn -fYL +ofm rHE dbd aBJ @@ -98871,7 +99577,7 @@ bjJ rWL htn muB -sPU +iRc ulv qWX fke @@ -99056,7 +99762,7 @@ pyY sNB xWm mLL -dZY +oIO vkb cLl sWV @@ -99083,7 +99789,7 @@ htd qBC syo aEP -gBX +cRU oRn sjS xNd @@ -99093,7 +99799,7 @@ syo tHE kkU qaG -rJz +fgJ srp eEH xPN @@ -99109,7 +99815,7 @@ srp eEH uDK dbk -enZ +cGX tUn wXF wXF @@ -99121,7 +99827,7 @@ dlG ipM rsD qos -cQr +sLF kZx oBz gTo @@ -99141,7 +99847,7 @@ fmM iWy rpG qKn -sTN +gJl gyQ ozm fhi @@ -99309,7 +100015,7 @@ fgY rFR lNW jkj -eug +bpB kgy nGz rES @@ -99320,17 +100026,17 @@ sWV ovz dbj jyQ -wPi +lGj ilh sNK rmF lHx jhY -bNk +tAy ylU deG xNU -eXO +iIf pJE uUl cBf @@ -99384,7 +100090,7 @@ beQ iTO jyr qdT -pIv +vTK tEt xKk jHg @@ -99598,18 +100304,18 @@ qBC sqM kwQ jZR -sqM -sEn -sqM -mWS +xpH +ubQ +nOj +wGa kwQ mmS vLb -tdj +jmT jZR mJN cwP -bzG +sqM hBr jef diE @@ -99617,13 +100323,13 @@ gIC diE dYg hwF -jEN diE -arl +ggq +nnR wah wpx htd -saU +iaT tUn tUn tUn @@ -99631,11 +100337,11 @@ tUn tUn hKV wXF -jLm +kGJ sQB lqL psT -wqj +gFy tzQ hNz iTO @@ -99651,20 +100357,20 @@ afZ sds cVn pxt -gLy +jVy jTN vAH kIY -vdo +cyp gyQ -kZK +rbD jwj ujk jvo aHH -rZf +iYE pCa -hRy +dEF pCa cOT dXU @@ -99819,7 +100525,7 @@ shs qbC tLN mxn -hlK +jaj tji gMZ cju @@ -99884,7 +100590,7 @@ ddO sLE cEv iQO -ofZ +eeT tUn hKV fWK @@ -99898,7 +100604,7 @@ myB vWz hkE pke -pqN +msJ xKK xKK rJA @@ -100115,7 +100821,7 @@ wQP ibz fMp oul -avo +smG jyq xCD asB @@ -100124,13 +100830,13 @@ xCD xCD xCD xCD -bec +byQ hio -xCD +vtu cWT xBx bdb -fLc +smG smG gtU sXR @@ -100155,7 +100861,7 @@ olG ohH dTS gtV -fAd +enF tEt rMr xff @@ -100183,8 +100889,8 @@ xRf qXW dKC rzx -nFa -pjX +hcP +kYP tvg dKC aaa @@ -100327,14 +101033,14 @@ aaa rrt aaa rrg -kms +eqS lfu ilR kcg meL mxn iDP -qUm +cUk gMZ gTk ilh @@ -100359,7 +101065,7 @@ qRk pJE nFn qsK -dcF +vRj sHg qXB jXq @@ -100376,7 +101082,7 @@ myG rac bvJ bvJ -qFo +tbl cNA bvJ bvJ @@ -100402,11 +101108,11 @@ qOM tUn ftj wXF -pJt +fNE tZo -uKA +cCx rop -fEU +gvS oYZ oYZ oYZ @@ -100436,7 +101142,7 @@ rxG dpN dpN egk -oEx +aNL bIa vYl nFa @@ -100584,11 +101290,11 @@ aaa rrt lMJ mxn -gaX +oLL gTt sdu fad -gFp +wSq gMZ gMZ gMZ @@ -100617,7 +101323,7 @@ nFn uJB qsK pJE -dLR +eFC qXB xNv mqK @@ -100637,8 +101343,8 @@ xEJ yjc crf vwn -lyR -dDz +uWU +oyY dfp tRL hrM @@ -100665,12 +101371,12 @@ cnu yaH gZQ vQb -bwm +mdu xPm -hEO +ohZ sac huq -eSd +scq vQb sWB gwf @@ -100678,9 +101384,9 @@ pOv kYU bZB efZ -iaO +qRe svS -qUE +bGo iLw nFa svS @@ -100688,16 +101394,16 @@ mHy mHy kVq pdi -txv +kRV svS -xLI +nzz tWL gma oJu dKC lUD isI -isI +vIm dKC qdw dKC @@ -100842,7 +101548,7 @@ aaa aaa mxn yeV -gSx +hUB qmf jTH gMZ @@ -100864,12 +101570,12 @@ qnS uxb hAk gzO -jCq -fCh +eqn +jSb kAF pGH usP -qRk +xAT kKw nGp vME @@ -100935,7 +101641,7 @@ fnh mMX moF klT -tVv +iWT svS dKC lMW @@ -101121,7 +101827,7 @@ eCn ilh dKO lNf -jEx +fLz ujM cwF pGH @@ -101144,7 +101850,7 @@ vFB fRS twN rac -cdB +ekR wCL gPh hkG @@ -101163,7 +101869,7 @@ eQE rVG kqZ wYB -cRj +iji cAG hbM hbM @@ -101177,7 +101883,7 @@ sPB upT noj yia -tJd +pqt vQb pbf oEq @@ -101191,7 +101897,7 @@ gwf pOv mMX rhe -bQs +rPA mmW oWk fPD @@ -101376,8 +102082,8 @@ ilh ilh ilh ilh -dKO -vBW +rWf +nft dIO dIO dIO @@ -101389,7 +102095,7 @@ cBy cBy oNl uUl -lPp +cwK qXB gaG qXB @@ -101412,7 +102118,7 @@ pof owi nxA hyX -wYn +rrz eQE eEf rOM @@ -101436,7 +102142,7 @@ jwP cbg bix vQb -pBd +ekQ uhT wtP bDm @@ -101634,19 +102340,19 @@ mgE xnU dIO jlY -tem -iMc +vgu +fLz lvU nKO dIO -aIX +aqa rNJ bxm pJE uJB nFn uUl -iGt +eAq qXB wzK qXB @@ -101659,11 +102365,11 @@ fRS tLx bvJ dYK -hkG +iPT gae uFf qVt -fGH +wxG gwc jjF vfm @@ -101671,7 +102377,7 @@ gWl epO qrO eQE -atU +nnl qfB dDH pkK @@ -101683,15 +102389,15 @@ xlF xlF xlF pdl -rHr +hxw tUn hKV wXF -fvx +kHN kHN jvL vfh -pQT +kHN tAg tcx nhr @@ -101712,7 +102418,7 @@ oFS aqh uGX oWk -qEF +jNp lPC guG iAs @@ -101886,13 +102592,13 @@ shg cur sab ilh -qXU -dIe +aCM +yfw eek wst mPE knf -wZX +gGf dIO dIO dIO @@ -101924,14 +102630,14 @@ bIi bTl lIB dDq -rbe +dUo utS bNh eQE mFC -bMp +wHL eQE -bOA +rem eLI ltW jyF @@ -101940,7 +102646,7 @@ byW byW byW nDO -eur +gtR tUn hKV wXF @@ -101950,7 +102656,7 @@ sIW bRb cKm tAg -hjo +xxh poq vYE lAH @@ -101964,8 +102670,8 @@ oWk xuD fFa xdF +qkl fPD -tdl fPD xZx oWk @@ -102151,7 +102857,7 @@ eYz kdX xvZ wHj -aDK +xkE dIO mHO jrL @@ -102182,13 +102888,13 @@ lBA uky bnM pTS -njC +pTS pTS eQE eQE eQE eQE -eyz +tIb ndk cve xEe @@ -102208,7 +102914,7 @@ jSk rkT tAg yfa -bTP +pkx hBB wnY nfs @@ -102216,17 +102922,17 @@ nfs tAg sWB gwf -cQd +qLu oWk xuD sip bLd -clj +kQZ bLd bLd bLd oWk -hGm +hCT sEZ evE xsn @@ -102417,7 +103123,7 @@ dcF cON jMo uUl -jtb +anE qXB wzK qXB @@ -102437,13 +103143,13 @@ mgo fGH fhQ sFB -vjI +mal rFO pmZ qdI -xPh -yfn -gbq +ttF +sRY +wDh uIs amu gsr @@ -102478,8 +103184,8 @@ oWk lPc qZg bLd -fPD -fPD +qkl +qkl fPD uGX oWk @@ -102644,18 +103350,18 @@ oAa peF liO sSs -prE -gNF +gkM +bcw uKL uKL mKu bWV hSG lnc -pgI +dSE noW lnc -yft +qeo xpo lnc kMX @@ -102673,7 +103379,7 @@ qsK nFn qFU nFn -uGQ +ncB cBf qXB qnK @@ -102687,15 +103393,15 @@ fRS mjs bvJ pIz -aPV +hNn fSd fSd raT -fGH +wxG qaf pmA -xfn mal +ccc hqM wXc xzj @@ -102711,9 +103417,9 @@ rwd xlF xlF was -ioK +eur tUn -ari +eJh wXF wXF wXF @@ -102736,7 +103442,7 @@ xuD qZg bLd yeI -fPD +okd fPD nYU oWk @@ -102910,12 +103616,12 @@ lOU piM lnc piA -jcW +wQb lnc cqp -oiD +wvF lnc -hoQ +kch wcr ikb urK @@ -102926,7 +103632,7 @@ ikb iVN nFn kls -dri +dpx pJE pJE nFn @@ -102943,19 +103649,19 @@ jhp fRS mjs rac -jmB +fWl pCJ hkG qpM qVt fGH eHS -bUk -mal +bpq mal +gMy hPK xqv -idR +rmj fWW rTQ vEi @@ -102963,7 +103669,7 @@ jER rMA ukv wYB -tOQ +whJ rwd byW byW @@ -102972,14 +103678,14 @@ xAg tUn hKV ruX -fKi +aLx tUn -dXP +gLm tUn pSz -mOD +fVc wXF -omJ +jdX ohI tbp uzc @@ -103001,8 +103707,8 @@ oWk csz guG fJc -csi -inO +dVX +jsH uFq hNA nsA @@ -103150,7 +103856,7 @@ rrt lMJ blx aag -kYx +rjl htk ubs cfy @@ -103158,7 +103864,7 @@ jlJ eZN ewf ewf -kjL +aMG lhk rwE tgo @@ -103167,10 +103873,10 @@ lOU nmI lnc sBa -hVW +obw lnc avU -ckG +cKC lnc crL wcr @@ -103181,13 +103887,13 @@ qEy aAg aAg uKx -azn +kWd txk nOi tKn -oNf +rbG vQY -cLe +orp wLx qXB eHR @@ -103212,34 +103918,34 @@ mal cfA hPK pgK -exf +idR dVm xWY uIs -qVM +rwa aJI iJK wYB -fAG +sZo rwd cOa cOa eKD -vqi +pXl tUn -qpT +brX tUn tUn tUn oGn tUn kmN -gpO +kmN wXF mRs tBp sbK -azs +ejL aPX elJ wGH @@ -103257,7 +103963,7 @@ pNp oWk pIF qBF -iJt +nCG tqx bOm jPi @@ -103409,10 +104115,10 @@ aaa iHc gpF pHe -vLK +buE aag szp -nVH +jjG ewf jUH fMm @@ -103430,11 +104136,11 @@ lnc tiA lnc lnc -wjD +psz cfi fRl ejl -hNw +mJL lnc lqQ lqQ @@ -103471,7 +104177,7 @@ hPK cFl msT lPi -cgR +cuM uIs jui oLF @@ -103487,7 +104193,7 @@ tUn eLh lQI mOD -rLu +urE kmN tUn tUn @@ -103505,7 +104211,7 @@ gFQ oWk xuD qZg -fBt +jJm bLd eJZ uGX @@ -103682,7 +104388,7 @@ ewk dtg wcr mMx -jhf +edq wcr mMx qTz @@ -103708,18 +104414,18 @@ wzK tCS xww hht +nzN xww -xww -vFB +mEO fRS tUv rac bQO -cnE +joP wKu wKu jIk -pHE +hZn cgl uZu mal @@ -103728,9 +104434,9 @@ mqu mJk itg tEy -fbM +nEB uIs -mAV +bjl vqp wen bMa @@ -103768,7 +104474,7 @@ fPD fPD bLd ojt -iyj +eQY bLd tjf tjf @@ -103925,7 +104631,7 @@ iHc iHc aag aag -qli +lus clE byz biF @@ -103949,7 +104655,7 @@ ikb qwK mtO pFd -wfN +vTs lqQ nMK mos @@ -103976,8 +104682,8 @@ kSw nGK nGK nZz -gZV -gwc +pHE +cDX iaS mal bDK @@ -103992,7 +104698,7 @@ huG amj gEe kCZ -iNy +uHo beO lXr cZm @@ -104182,8 +104888,8 @@ aaa lMJ aaa nvn -qWw -xrf +mOl +tgo mnl biF cxU @@ -104199,7 +104905,7 @@ qEy qSf vxD qEy -ueh +ylM mCM iQy jHm @@ -104214,7 +104920,7 @@ jBY knZ jBY weS -qdr +uPJ qXB ool dVb @@ -104224,11 +104930,11 @@ lxv lNF lkW xww -jsv +aSk tlZ lje klZ -wqI +bqC fqD wSs pur @@ -104251,13 +104957,13 @@ qFF kCZ nKI bZq -dTs -fYI -gFD +vrn +tUt +gOa +unL unL -eio ouR -kOt +tUn tUn gNW nQA @@ -104282,7 +104988,7 @@ vXO qkl bLd ias -fPD +hPG nMj pPN fPD @@ -104440,7 +105146,7 @@ lMJ aaa szp szp -vjd +gEN sqH jAs aiw @@ -104488,12 +105194,12 @@ obG lbX yks okX -yks +tZX ogb uhW eSC obG -etT +jqd jzT ivy ebK @@ -104526,10 +105232,10 @@ qph wXF vWT tOZ -vWT -ink +fuc +cln aHM -fpK +xTg oWk mEL fwP @@ -104696,7 +105402,7 @@ szp nvn szp szp -kUX +nqV tgo xsH sqH @@ -104708,7 +105414,7 @@ kZq gNh aTD lnc -bmz +oYv cKC lnc lxf @@ -104728,7 +105434,7 @@ qgy ldg ivb bYN -iJb +krt qXB psZ qXB @@ -104742,27 +105448,27 @@ biV fRS tUv obG -vyK +sZa vRU gpf ouk jTM wBT -iHF +sxX obG sEx gIm -rTT -bdK +sbM +qKD aNN huG gLF leP apt huG -jWj +bJp wYB -oXM +foB siz pCL unL @@ -104781,12 +105487,12 @@ qXb mBK tUn wXF -hao +eAr gcV nNe dBb aHM -hbC +xxQ oWk ddu fwP @@ -104966,18 +105672,18 @@ gNh fgu lnc qwl -xQV +unw lnc elV -fyo +uuz qXB vIa qXB pnD -vQP +nAW lnc -dis -dqs +iGy +qdy lqQ wRF jzC @@ -104999,13 +105705,13 @@ vFB fRS tUv obG -arD +dSJ wrZ aWq oph yaO gyO -hsi +xSO obG rIb obG @@ -105046,12 +105752,12 @@ yhu rnn oWk nPJ -jJm +jLI fwP fwP fwP qkl -jSV +uSM bLd bLd bLd @@ -105231,7 +105937,7 @@ qXB cgL qXB bAD -yjN +xpo lnc cUP mil @@ -105239,7 +105945,7 @@ lqQ lbH lJa mie -ozi +pRM otG jYu lJa @@ -105282,7 +105988,7 @@ bnE unL kTZ unL -ptV +iMF guI uND slc @@ -105296,7 +106002,7 @@ nTU kjO wXF tAQ -vHl +fbl vkq hQY xGD @@ -105511,15 +106217,15 @@ rwn cdX vFB fRS -tUv +sGH obG -tzi -iwf -saj +aEA +mZc +iUe dLT -gNk -rpb -wwD +qiY +wAt +utE xXW nst lih @@ -105533,7 +106239,7 @@ cCR unL aLu unL -wnR +xII ltX kbR vOK @@ -105557,7 +106263,7 @@ wZg ojo xfV sBS -rBs +wCb oWk bLd bLd @@ -105755,12 +106461,12 @@ ldO vKm tbd cPQ -nXT +nao wyG qXB psZ qXB -ttA +rjZ uWS kyc can @@ -105780,7 +106486,7 @@ unL unL unL unL -xoE +cEx vRU iks cwb @@ -105796,7 +106502,7 @@ unL unL fGW unL -ckZ +vtI mma iMQ rAo @@ -105811,10 +106517,10 @@ ohW tUn vWT pOw -vWT -biw +gqa +cln sgB -hOd +pbb gFQ aaa aaa @@ -106018,8 +106724,8 @@ psZ psZ qXB gAU -kQD -syr +tXl +oUK eRR ryp cdX @@ -106044,7 +106750,7 @@ deX rJk ofe nEf -uEn +kyt aBM unL lPy @@ -106054,7 +106760,7 @@ fhA gub unL gjF -euc +sjB wOy vMc tUn @@ -106250,7 +106956,7 @@ afD afD qXB gbG -aah +qhE mXk oPZ qXB @@ -106280,7 +106986,7 @@ sqE sqE sqE sqE -uWQ +rKS gnS rlm fWA @@ -106308,13 +107014,13 @@ tXk itW kGv izp -hcP -vIm +fWA +fWA mhl mhl mhl mhl -aJm +wXF lMJ lMJ lMJ @@ -106532,12 +107238,12 @@ ofk uXd fDL hSt -jWk +qhw naN fMN icR sqE -rKS +nGA gnS rlm esk @@ -106558,19 +107264,19 @@ gIS xNG gYV lFo -qpn +sZi tHk unL hLs enf -izp -xZb -hcP +hCl +aJm +hum jCx cZF -sXq -pcH -inG +uaG +vPu +pQy ovX xYQ pnH @@ -106792,7 +107498,7 @@ nLz vGl cYc iIP -rSb +qrj sqE rKS gnS @@ -106822,7 +107528,7 @@ xZb fFq izp jJk -hcP +fWA kBQ lWq lWq @@ -106841,7 +107547,7 @@ aaa aaa aaa tOg -qnq +gLr tOg aaa aaa @@ -107051,9 +107757,9 @@ rSi pCt aRS sqE -vFB +mEO gnS -ucU +jPf esk esk esk @@ -107079,10 +107785,10 @@ mEx mWA isl fWA -hcP -rYm +fWA +dRj +lWq lWq -fBi lWq tLg pnH @@ -107313,13 +108019,13 @@ pYE rlm iiN mbJ -eXD +ncd gYO -gql +flE fcA cVj -eji -omP +uKz +fnT dss pMH fWA @@ -107355,7 +108061,7 @@ aaa aaa aaa tOg -pbQ +qnq gUS tOg tOg @@ -107600,7 +108306,7 @@ tLv lWq ldc xpB -dli +caO huZ uaB xrr @@ -107613,11 +108319,11 @@ aaa aaa tOg hxu -gJn +vRg +sls vRg vRg vRg -jdF oJj tOg aaa @@ -107817,8 +108523,8 @@ xUY fbf nie qtm -fFp -geJ +fyJ +qVD cuc fqC tUw @@ -107826,7 +108532,7 @@ rHq peX kRi klw -cqw +roe uAg xrN hDa @@ -107850,11 +108556,11 @@ unL sfz wao hum -lmA -cnv -ouV +rMT +svK +yec xhb -cFv +uQk lYM vzc gUY @@ -107875,7 +108581,7 @@ tOg tOg tOg gUS -umI +gLr tOg aaa aaa @@ -108070,7 +108776,7 @@ blG tBz lia ncx -fxs +acU cnK sqE sqE @@ -108095,7 +108801,7 @@ htP vGF ecp qXk -xZR +mQi fWA wac kQT @@ -108113,7 +108819,7 @@ wIB viH nng nng -yfI +pnH fGN pnH guo @@ -108312,7 +109018,7 @@ qXB qXB cgL tCS -apq +nZt gLK gyH mKV @@ -108328,19 +109034,19 @@ ncx cOs ncx pTw -rrh +qyQ cnK -kZs +vYI cDQ -inP +xQI dOQ cnK itY uMU mGX kfp -naM -kVJ +jxM +jvu eSy juJ cZL @@ -108362,8 +109068,8 @@ guD fWA dBZ qRM -cGS -kkf +sMb +sgh kLp wxe uwQ @@ -108569,7 +109275,7 @@ jUu kCN lCN tCS -xzs +dPy vQV lnT fbf @@ -108832,13 +109538,13 @@ wbF qaA bMA rao -lLz -qFj +vaI +yaF qaA fTL qaA wgf -lBN +jUT rao qaA haR @@ -108847,7 +109553,7 @@ cnK doD vIT siA -dOQ +uRw cnK qGK fzd @@ -108863,16 +109569,16 @@ tYF jPH wfC jIz -tTo +vqj peM -lsq +xld dkC dwz dwz -afz +frE afz uwQ -gnT +siy lgL lrK heV @@ -109115,26 +109821,26 @@ heL mBi ayr nck -tok +phJ peM peM opG lEH -wIN +jUW peM -sNw +eWu vWB hta vXt ecB ecB -bLg +xrG prT prT fVA jAV wmz -wmz +mvo oJL gyg lAh @@ -109338,7 +110044,7 @@ tCS jhD pql nqL -gXP +hcc eaN cuZ pTw @@ -109351,19 +110057,19 @@ vyZ vyZ eGC vyZ -vyZ +fmX vyZ vyZ aRt xAl kYG -aOA -rdU +qjl +wlx qPT jRb -gaw +uew qsv -rQL +sKD lUz sWs ruu @@ -109371,10 +110077,10 @@ uTH dFH ygb pEG -ozB +ryA ssk peM -jrT +wUM cZw hUn pQK @@ -109585,11 +110291,11 @@ aaa aox nqL hHK -dLO +hHK hHK qhb gTh -jpE +tOd dEx fZL snB @@ -109608,13 +110314,13 @@ dRN wdB oET kKk -bjD +qLw vQt qLw tdf mdk kYG -dKL +dqE oFH oFH sSz @@ -109641,7 +110347,7 @@ iUs mCZ mHT dKE -ilc +aVv dKE mHT tJF @@ -109871,7 +110577,7 @@ mYE uLp mdk kYG -qtH +nJM lOg pom pom @@ -110098,7 +110804,7 @@ aaa aaa aox nqL -eBe +sdW hHK dLc lJh @@ -110121,7 +110827,7 @@ aXL rHn mkr oNs -mUr +rCW rHn hko hko @@ -110130,9 +110836,9 @@ qTX kYG uJz iHy -xgR -nmb -rtP +vSC +eKw +vPV qsv lfd eup @@ -110142,7 +110848,7 @@ khu nsO efY mRm -bXT +kXp cVJ peM mSM @@ -110150,21 +110856,21 @@ mSM peM ovf peM -aXI +uxm ruP oqK mHT hQB -hQB +jku hQB mHT egP gMt vuU jvj -nnD +qMm lMC -aTN +smZ lAh aaf gWn @@ -110183,7 +110889,7 @@ aaa oMA sKf sri -oQk +sri kCr tsy sRa @@ -110368,11 +111074,11 @@ cOX tCS eVi bwE -syX +xVx nTA cKx fXi -nlE +uHE rHn rHn kww @@ -110382,8 +111088,8 @@ cAm fec rHn fJP -tYc -mdk +ycw +uJL fJy bDW bDW @@ -110397,8 +111103,8 @@ dRA wCe khu hUu -iRD -xQb +uWN +ggw mEG nRp dtY @@ -110410,11 +111116,11 @@ wDG udD sCN cyW -ppD +wIa +cyW cyW cyW cyW -iQB tds nzo vuU @@ -110439,7 +111145,7 @@ aaa aaa uaR jHX -toR +oQk toR toR syV @@ -110613,13 +111319,13 @@ aaa aox nqL hHK -fQe +hHK thc bhM gTh oTR jYI -fiu +lew tCS psZ tCS @@ -110637,7 +111343,7 @@ qZB oNs hRl jWE -rLN +auc rtQ uLp lLu @@ -110880,7 +111586,7 @@ rYc tCS kbo tCS -gDA +tVG sph owp tmq @@ -110911,7 +111617,7 @@ wsI fia sRW hKi -quv +xbb lLB aJz rzT @@ -110925,7 +111631,7 @@ ahV ruP cyW cyW -cyW +tCG vlq cyW cyW @@ -111131,7 +111837,7 @@ aaa aaa aaa gTh -fHa +rMJ oww xvR tCS @@ -111145,16 +111851,16 @@ sGC stl qOz wBE -oNs +eEP eyD qZB oNs hRl jWE -oNs +eQL rtQ mBo -wkb +hJi fJy fJy gHI @@ -111178,7 +111884,7 @@ ago nud gto aej -qDt +ahV ruP cyW cyW @@ -111190,7 +111896,7 @@ cyW nzo vuU dwf -nnD +qMm xcW smZ lAh @@ -111395,12 +112101,12 @@ qXB mSB tCS xGr -yli +lLC pmj pmj bgs pWB -mMr +lta rHn rHn rHn @@ -111410,7 +112116,7 @@ muu rHn rHn fJP -dnV +vBe wBV aUP dgd @@ -111473,7 +112179,7 @@ dVv gog jjj jNo -sgk +gAH klK aDQ hFz @@ -111678,7 +112384,7 @@ ack fJy mhW uNl -kTK +rLZ fJy ygp tyE @@ -111728,11 +112434,11 @@ bus hMv iTQ vGq -nAi +avx vBf uNs tIP -jEF +qQJ vGq bjs gyI @@ -111916,12 +112622,12 @@ lXN dQP jmq gWv -gMB -xHg +fjv +gWv cRq mYE mDX -gJN +gMB unk qXj sgv @@ -111945,8 +112651,8 @@ iRh qcd bMC fkb -srx -knU +ieI +nQQ efd nwK fFC @@ -111963,7 +112669,7 @@ dVT jhn svj rhx -tuo +ydM uwQ aaf aaf @@ -111984,13 +112690,13 @@ xiL jCO fdZ mMK -mLW +mMK mMK mMK jxH tMI pwZ -dxc +fdZ fdZ fdZ jvX @@ -112220,7 +112926,7 @@ xpi kUb dfj agw -oFn +dpU uwQ lMJ eoU @@ -112449,7 +113155,7 @@ dgB fJy xcz mzu -ksU +bjF nyX tsZ hns @@ -112463,8 +113169,8 @@ oGw iLe uwQ vRS -qem -nlL +gyJ +qLU fFA nGq kRf @@ -112498,13 +113204,13 @@ xiL idA xVu dgz -tIe +egS xVu -hja +dJk vDV -nSC +etV xVu -pJf +jjv pfP xVu idA @@ -112732,7 +113438,7 @@ cQQ sCW lNY sCW -nnD +qMm afp oIM lAh @@ -112986,7 +113692,7 @@ uQe pul nzo jms -rVJ +sCW fzM sCW qua @@ -113500,10 +114206,10 @@ uQe pul nzo fiE -hur +cyW uel cyW -nnD +qzK mDb xXG oqT @@ -113525,15 +114231,15 @@ xiL xiL idA xVu -uQu +sPy iWc xVu -bMP +vva jSj rzz xVu lVB -exu +pry xVu idA xiL @@ -113750,7 +114456,7 @@ tts sfu oFt hgE -qYY +efN fXj vPy tjG @@ -113760,9 +114466,9 @@ jZz vlq gTC cyW -qzK +qMm mxv -eSZ +oIM lAh lMJ gWn @@ -113781,7 +114487,7 @@ oyj oyj xiL nEb -bSu +jCO caf tgm gKD @@ -113791,7 +114497,7 @@ fdZ iMR bnQ psc -wCH +eTI rKg xiL lmn @@ -114008,7 +114714,7 @@ mUL isr eDc vhv -isr +vhv ldK tqY pul @@ -114262,7 +114968,7 @@ sZI trG hEX vTX -coX +vTX gSu saB isr @@ -114524,8 +115230,8 @@ lYP vTX vTX isr -isr -dks +vhv +piv nzo qVi uhx @@ -114551,7 +115257,7 @@ aaa wrc oyj xiL -mtu +eSr mtu kbz tNu @@ -114563,7 +115269,7 @@ gjv iHH fff mtu -mtu +ljF xiL lmn wrc @@ -114780,7 +115486,7 @@ nBu gHY das vTX -ucE +fKv vhv bYo xRc @@ -114788,7 +115494,7 @@ qTA jZz nnD cyW -nnD +qMm cQx oIM lAh @@ -114809,7 +115515,7 @@ hbK oyj xiL rTi -iXS +mtu kbz fff mtu @@ -114819,7 +115525,7 @@ fff vxa kbz fff -iXS +mtu lWM xiL lmn @@ -115296,7 +116002,7 @@ dmP guV vTX isr -trM +boD qwi jvj pul @@ -115328,7 +116034,7 @@ xiL jlU rRo lyL -gva +mao mCu kgW jlU @@ -115583,11 +116289,11 @@ rDf uhs fjd jlU -eJI +lWS sZN msR xkv -lOY +nET jlU iOJ lmn @@ -115810,13 +116516,13 @@ oog vTX jTS sCp -qFA +kJO cyW jvj pul cyW cyW -ewU +meJ dct oIM lAh @@ -116588,7 +117294,7 @@ tmQ tmQ nkj kaS -sTI +hAq wez gAT kuD @@ -116611,11 +117317,11 @@ pWT rDf uLa jlU -eSr +mtu mtu jQz nJr -ljF +mtu jlU lUS pHt @@ -116841,9 +117547,9 @@ nsC lMJ uwQ uwQ -lMb +lOA mcl -lKJ +kwb uwQ uwQ uwQ @@ -117103,8 +117809,8 @@ xyT uwQ uwQ rWS -jEf -vsy +css +rsR aaa nYJ aaa @@ -117127,7 +117833,7 @@ lMJ jlU jlU bPu -asL +aYl kcu jlU jlU @@ -117841,7 +118547,7 @@ lMJ aaa aaa lMJ -vnP +xYH lMJ lMJ lMJ @@ -118662,7 +119368,7 @@ aaa aaa aaa aaa -eWG +aaa aaa aaa aaa @@ -119391,8 +120097,8 @@ beq blx qZX hml -xLq -blx +hAF +hBH aaa lMJ aaa @@ -120162,7 +120868,7 @@ nWS moI fJt neG -sYH +eFX eNR nWS moI @@ -121190,7 +121896,7 @@ bjP omF bnx kWn -hOl +xdx gfU gfU gfU @@ -121456,7 +122162,7 @@ giA jGr rrZ aWH -hAE +tUA fnf gfU gfU @@ -121692,14 +122398,14 @@ aaa gfU aTV aVl -oFC +vmk phN jEr lro -odP +aWN aVl jGa -xkT +uLv bjQ bjQ bjQ @@ -121716,7 +122422,7 @@ tUA tUA juf uRp -ycX +jNZ ubl gfU aaa @@ -122227,7 +122933,7 @@ hxB hJJ hJJ hJJ -gwN +tUA tUA tUA tUA @@ -122461,7 +123167,7 @@ qyc jZC pan mbS -wgB +tVC mCL aWO aYz @@ -122741,11 +123447,11 @@ cHb hJJ hJJ hJJ -ssw dlb dlb dlb -czQ +dlb +rEK jGr gfU gfU @@ -123234,11 +123940,11 @@ aaa gfU aTV aVr -iZN +qDi oDc hyZ rZy -iZN +qDi aVr qsV ubB @@ -123258,7 +123964,7 @@ tUA tUA hqE oln -eNz +xpZ kOf gfU aaa @@ -123512,7 +124218,7 @@ giA jGr dQH fKf -eiq +tUA ceF gfU gfU diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index 0d8ea59bac902..e26ac494a0f87 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -69,7 +69,7 @@ /area/mine/maintenance/living/south) "aq" = ( /obj/machinery/camera/autoname/directional/east{ - network = list("labor") + network = list("mine") }, /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 5 @@ -244,18 +244,6 @@ }, /turf/open/floor/iron/textured_large, /area/mine/lounge) -"bP" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/trimline/red/filled/line, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 1 - }, -/area/mine/laborcamp/security) "bQ" = ( /obj/structure/stone_tile/cracked{ dir = 8 @@ -271,6 +259,7 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 }, +/obj/machinery/mining_weather_monitor/directional/north, /turf/open/floor/iron/dark/smooth_edge, /area/mine/production) "cb" = ( @@ -319,6 +308,15 @@ }, /turf/open/floor/iron/dark/textured_large, /area/mine/laborcamp/security) +"cj" = ( +/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, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 1 + }, +/area/mine/laborcamp/security) "ck" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, @@ -360,7 +358,7 @@ /turf/open/floor/plating, /area/mine/maintenance/production) "cy" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/trimline/blue/filled/line, @@ -626,14 +624,6 @@ dir = 8 }, /area/mine/laborcamp/production) -"eq" = ( -/obj/structure/table, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/mine/production) "et" = ( /obj/structure/stone_tile/block/cracked{ dir = 4 @@ -643,6 +633,26 @@ }, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"ez" = ( +/obj/structure/chair/comfy/teal{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/camera/autoname/directional/west{ + network = list("mine") + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/siding/yellow{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/edge{ + dir = 4 + }, +/area/mine/lounge) "eA" = ( /turf/closed/wall, /area/mine/maintenance/public/south) @@ -1095,6 +1105,17 @@ /obj/effect/turf_decal/sand/plating/volcanic, /turf/open/floor/plating/lavaland_atmos, /area/mine/maintenance/service/disposals) +"gZ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 1 + }, +/area/mine/laborcamp/security) "hd" = ( /obj/machinery/door/airlock/security/glass{ name = "Labor Camp Shuttle Security Airlock" @@ -1377,6 +1398,15 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/smooth, /area/mine/laborcamp/quarters) +"ix" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/iron/edge{ + dir = 1 + }, +/area/mine/living_quarters) "iB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1478,6 +1508,13 @@ /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /turf/open/floor/plating, /area/mine/maintenance/public/north) +"jk" = ( +/obj/structure/table, +/obj/item/storage/box/bandages{ + pixel_y = 6 + }, +/turf/open/floor/iron/white, +/area/mine/laborcamp/production) "jm" = ( /obj/machinery/door/airlock/public/glass{ name = "Showers" @@ -1770,6 +1807,7 @@ /obj/effect/turf_decal/tile/bar/opposingcorners{ dir = 1 }, +/obj/machinery/mining_weather_monitor/directional/west, /turf/open/floor/iron/checker, /area/mine/cafeteria) "kV" = ( @@ -1901,6 +1939,17 @@ }, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) +"lA" = ( +/obj/machinery/recycler{ + dir = 8 + }, +/obj/machinery/conveyor{ + dir = 4; + id = "mining_disposals" + }, +/obj/effect/turf_decal/sand/plating/volcanic, +/turf/open/floor/plating/lavaland_atmos, +/area/mine/maintenance/service/disposals) "lC" = ( /obj/structure/stone_tile/block/cracked{ dir = 1 @@ -1975,6 +2024,28 @@ /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /turf/open/floor/plating, /area/mine/maintenance/living/south) +"lO" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/obj/structure/sign/directions/dorms/directional/north, +/obj/structure/sign/directions/security/directional/north{ + pixel_y = 24 + }, +/obj/structure/sign/directions/supply/directional/north{ + pixel_y = 40 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/red/corner{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/mine/lounge) "lQ" = ( /obj/structure/stone_tile/surrounding/cracked{ dir = 6 @@ -1993,14 +2064,6 @@ }, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) -"lT" = ( -/obj/item/kirbyplants/random, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/mine/lounge) "lV" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -2125,19 +2188,6 @@ }, /turf/open/indestructible/boss, /area/lavaland/surface/outdoors) -"mu" = ( -/obj/structure/table, -/obj/item/storage/pill_bottle/epinephrine{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/turf/open/floor/iron/white/smooth_corner{ - dir = 8 - }, -/area/mine/medical) "mv" = ( /obj/structure/stone_tile{ dir = 4 @@ -2196,30 +2246,6 @@ dir = 1 }, /area/mine/laborcamp/security) -"mF" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 2 - }, -/obj/structure/sign/directions/dorms/directional/north, -/obj/structure/sign/directions/security/directional/north{ - pixel_y = 24 - }, -/obj/structure/sign/directions/supply/directional/north{ - pixel_y = 40 - }, -/obj/machinery/camera/autoname/directional/east{ - network = list("mine") - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/red/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/lounge) "mJ" = ( /obj/docking_port/stationary{ dwidth = 2; @@ -2271,6 +2297,16 @@ }, /turf/open/indestructible/boss, /area/lavaland/surface/outdoors) +"mR" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/turf/open/floor/iron, +/area/mine/lounge) "mS" = ( /obj/structure/stone_tile/cracked{ dir = 1 @@ -2298,6 +2334,16 @@ }, /turf/open/floor/iron/dark, /area/mine/eva) +"mU" = ( +/obj/structure/rack, +/obj/item/storage/bag/ore, +/obj/item/pickaxe, +/obj/item/mining_scanner, +/obj/item/flashlight, +/obj/item/clothing/glasses/meson, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/smooth, +/area/mine/laborcamp/production) "mV" = ( /obj/structure/stone_tile/block{ dir = 4 @@ -2412,6 +2458,12 @@ /obj/structure/cable, /turf/open/floor/plating, /area/mine/maintenance/service) +"nk" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/mine/production) "nl" = ( /obj/structure/fence{ dir = 8 @@ -2433,6 +2485,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/mine/laborcamp) +"nt" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/mine/production) "nv" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -2449,6 +2508,7 @@ /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 }, +/obj/machinery/mining_weather_monitor/directional/south, /turf/open/floor/iron/dark, /area/mine/laborcamp/security) "nA" = ( @@ -2647,6 +2707,17 @@ /obj/item/cigbutt, /turf/open/floor/iron/smooth, /area/mine/laborcamp/quarters) +"oJ" = ( +/obj/structure/closet/secure_closet/engineering_welding{ + req_access = list("mining_station") + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 4 + }, +/area/mine/mechbay) "oN" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/decal/cleanable/dirt, @@ -2707,13 +2778,6 @@ /obj/structure/stone_tile/center/cracked, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"pe" = ( -/obj/structure/chair/sofa/middle/brown, -/obj/effect/turf_decal/tile/bar/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/checker, -/area/mine/cafeteria) "pg" = ( /obj/effect/spawner/random/trash/hobo_squat, /turf/open/floor/plating, @@ -2961,22 +3025,6 @@ }, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"qs" = ( -/obj/structure/table/wood, -/obj/machinery/light/directional/east, -/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ - pixel_x = 6; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/checker, -/area/mine/cafeteria) "qw" = ( /obj/structure/bed, /obj/effect/decal/cleanable/dirt, @@ -3059,16 +3107,6 @@ dir = 8 }, /area/mine/lounge) -"qZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/trimline/blue/filled/line, -/turf/open/floor/iron/edge{ - dir = 1 - }, -/area/mine/living_quarters) "ra" = ( /obj/effect/turf_decal/sand/plating/volcanic, /obj/structure/marker_beacon/teal, @@ -3118,20 +3156,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/mine/maintenance/service) -"rB" = ( -/obj/machinery/computer/shuttle/mining/common, -/obj/structure/sign/directions/evac/directional/east{ - pixel_x = 0; - pixel_y = 24 - }, -/obj/machinery/camera/autoname/directional/north{ - network = list("mine") - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/mine/lounge) "rF" = ( /turf/closed/wall/r_wall, /area/mine/maintenance/labor) @@ -3160,6 +3184,13 @@ }, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"rP" = ( +/obj/machinery/conveyor{ + id = "mining_internal" + }, +/obj/machinery/light/directional/east, +/turf/open/floor/plating, +/area/mine/production) "rS" = ( /obj/structure/sign/warning/docking/directional/north, /obj/effect/decal/cleanable/dirt, @@ -3327,17 +3358,6 @@ }, /turf/open/floor/iron/dark, /area/mine/mechbay) -"sZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/mine/lounge) "tc" = ( /obj/structure/bed{ dir = 4 @@ -3484,8 +3504,8 @@ /turf/open/floor/carpet/neon/simple/red/nodots, /area/mine/cafeteria) "tZ" = ( -/obj/machinery/vending/sustenance, /obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/sustenance/labor_camp, /turf/open/floor/iron/smooth_edge{ dir = 8 }, @@ -3667,6 +3687,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth, /area/mine/laborcamp/quarters) +"vi" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/yellow{ + dir = 8 + }, +/obj/structure/sign/poster/official/high_class_martini/directional/east, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/edge{ + dir = 8 + }, +/area/mine/lounge) "vk" = ( /obj/effect/spawner/random/trash/garbage{ spawn_loot_count = 3; @@ -3679,13 +3715,21 @@ /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/plating, /area/mine/maintenance/living/south) +"vn" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/machinery/mining_weather_monitor/directional/north, +/turf/open/floor/iron/dark, +/area/mine/laborcamp/security) "vp" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/mine/hydroponics) "vu" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, @@ -3704,6 +3748,17 @@ }, /turf/open/floor/plating, /area/mine/maintenance/service) +"vB" = ( +/obj/structure/rack, +/obj/item/storage/bag/ore, +/obj/item/pickaxe, +/obj/item/mining_scanner, +/obj/item/flashlight, +/obj/item/clothing/glasses/meson, +/obj/machinery/airalarm/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/smooth, +/area/mine/laborcamp/production) "vD" = ( /turf/closed/wall, /area/mine/laborcamp/security/maintenance) @@ -3833,6 +3888,21 @@ dir = 8 }, /area/mine/lounge) +"wq" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_x = 6; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/checker, +/area/mine/cafeteria) "wr" = ( /obj/item/seeds/plump, /obj/machinery/hydroponics/soil, @@ -3907,21 +3977,6 @@ /obj/item/seeds/banana, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"wR" = ( -/obj/structure/chair/sofa/corp/right{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/siding/yellow{ - dir = 8 - }, -/obj/structure/sign/poster/official/high_class_martini/directional/east, -/turf/open/floor/iron/edge{ - dir = 8 - }, -/area/mine/lounge) "wU" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -4289,15 +4344,6 @@ }, /turf/open/floor/plating/lavaland_atmos, /area/lavaland/surface/outdoors) -"zn" = ( -/obj/item/kirbyplants/random, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/obj/effect/turf_decal/siding/red/corner, -/turf/open/floor/iron, -/area/mine/lounge) "zq" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -4337,6 +4383,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/mine/maintenance/living/north) +"zF" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/turf/open/floor/iron, +/area/mine/lounge) "zH" = ( /obj/structure/sign/directions/arrival/directional/south{ pixel_y = -40 @@ -4375,10 +4428,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_edge, /area/mine/laborcamp/quarters) -"zS" = ( -/mob/living/simple_animal/hostile/asteroid/goliath/beast, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) "zU" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4386,31 +4435,6 @@ /obj/structure/cable, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"zW" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 10 - }, -/obj/item/storage/bag/ore, -/obj/item/pickaxe, -/obj/structure/rack, -/obj/item/mining_scanner, -/obj/item/flashlight, -/obj/item/clothing/glasses/meson, -/turf/open/floor/iron/dark, -/area/mine/storage/public) -"zX" = ( -/obj/structure/rack, -/obj/machinery/light/small/directional/north, -/obj/item/storage/bag/ore, -/obj/item/pickaxe, -/obj/item/mining_scanner, -/obj/item/flashlight, -/obj/item/clothing/glasses/meson, -/obj/machinery/airalarm/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/mine/laborcamp/production) "Ac" = ( /obj/effect/turf_decal/bot, /obj/structure/ore_box, @@ -4546,6 +4570,15 @@ /obj/structure/railing/corner, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"Bs" = ( +/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 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/edge, +/area/mine/living_quarters) "By" = ( /obj/machinery/door/poddoor/preopen{ id = "labor"; @@ -4568,15 +4601,6 @@ }, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"BE" = ( -/obj/structure/table, -/obj/machinery/recharger, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 5 - }, -/turf/open/floor/iron/dark, -/area/mine/laborcamp/security) "BH" = ( /obj/structure/window/spawner/directional/south, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -4728,24 +4752,6 @@ dir = 1 }, /area/mine/living_quarters) -"CJ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/item/radio/intercom/prison/directional/south, -/turf/open/floor/iron/edge{ - dir = 1 - }, -/area/mine/lounge) -"CL" = ( -/obj/machinery/recharge_station, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 5 - }, -/turf/open/floor/iron/dark, -/area/mine/mechbay) "CM" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/dark/textured_large, @@ -4753,6 +4759,14 @@ "CO" = ( /turf/open/floor/iron/textured_large, /area/mine/lounge) +"CQ" = ( +/obj/machinery/recharge_station, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 5 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/mine/mechbay) "CS" = ( /obj/machinery/door/airlock/maintenance{ name = "Mining Station Maintenance" @@ -4794,17 +4808,6 @@ }, /turf/open/floor/iron/dark, /area/mine/production) -"Dh" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/trimline/red/filled/line, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 1 - }, -/area/mine/laborcamp/security) "Di" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/trimline/green/filled/line, @@ -5019,15 +5022,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/mine/maintenance/service) -"EL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/edge, -/area/mine/living_quarters) "EM" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -5041,15 +5035,6 @@ dir = 1 }, /area/mine/production) -"EN" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/smooth_edge{ - dir = 1 - }, -/area/mine/laborcamp/production) "EQ" = ( /turf/open/floor/iron/smooth_edge{ dir = 8 @@ -5060,17 +5045,6 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/plating, /area/mine/maintenance/service) -"EU" = ( -/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/trimline/brown/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 4 - }, -/area/mine/production) "EX" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -5115,6 +5089,14 @@ }, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"Fp" = ( +/obj/structure/table, +/obj/machinery/recharger, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/mine/laborcamp/security) "Fs" = ( /obj/effect/turf_decal/sand/plating/volcanic, /obj/effect/spawner/random/maintenance/two, @@ -5236,6 +5218,16 @@ /obj/effect/turf_decal/trimline/green/filled/line, /turf/open/floor/iron/dark, /area/mine/laborcamp) +"Gx" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/item/radio/intercom/prison/directional/south, +/turf/open/floor/iron, +/area/mine/lounge) "Gz" = ( /obj/machinery/shower/directional/west, /obj/machinery/door/window/right/directional/west, @@ -5404,10 +5396,6 @@ }, /turf/open/floor/iron/dark, /area/mine/laborcamp/security) -"HE" = ( -/obj/structure/table, -/turf/open/floor/iron/white, -/area/mine/laborcamp/production) "HF" = ( /obj/structure/stone_tile{ dir = 1 @@ -5426,13 +5414,6 @@ /obj/machinery/space_heater, /turf/open/floor/plating, /area/mine/maintenance/service) -"HH" = ( -/obj/machinery/telecomms/relay/preset/mining, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/mine/maintenance/service/comms) "HI" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, @@ -5652,11 +5633,6 @@ }, /turf/open/floor/iron/dark/smooth_edge, /area/mine/production) -"IZ" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron/dark, -/area/mine/production) "Je" = ( /obj/machinery/door/airlock/maintenance{ name = "Labor Camp Maintenance" @@ -5728,6 +5704,29 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_large, /area/mine/mechbay) +"Jw" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "gulag" + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/mine/laborcamp/production) +"JA" = ( +/obj/machinery/computer/shuttle/mining/common, +/obj/structure/sign/directions/evac/directional/east{ + pixel_x = 0; + pixel_y = 24 + }, +/obj/machinery/camera/autoname/directional/north{ + network = list("mine") + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/mine/lounge) "JB" = ( /obj/structure/stone_tile/slab/cracked{ dir = 5 @@ -5811,6 +5810,23 @@ dir = 1 }, /area/mine/living_quarters) +"JQ" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/item/storage/box/bandages{ + pixel_y = 6; + pixel_x = 4 + }, +/obj/item/storage/pill_bottle/epinephrine{ + pixel_x = -6; + pixel_y = 4 + }, +/turf/open/floor/iron/white/smooth_corner{ + dir = 8 + }, +/area/mine/medical) "JR" = ( /obj/structure/stone_tile, /obj/structure/stone_tile{ @@ -5840,14 +5856,6 @@ /obj/structure/stone_tile, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"JY" = ( -/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/smooth_edge{ - dir = 1 - }, -/area/mine/laborcamp/security) "JZ" = ( /obj/structure/displaycase, /turf/open/floor/carpet/executive, @@ -5900,6 +5908,24 @@ /obj/structure/girder, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"Kn" = ( +/obj/machinery/telecomms/relay/preset/mining, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/mine/maintenance/service/comms) +"Ko" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 10 + }, +/obj/item/storage/bag/ore, +/obj/item/pickaxe, +/obj/structure/rack, +/obj/item/mining_scanner, +/obj/item/flashlight, +/obj/item/clothing/glasses/meson, +/turf/open/floor/iron/dark, +/area/mine/storage/public) "Kp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, @@ -5959,6 +5985,15 @@ /obj/structure/lattice/catwalk/mining, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) +"KJ" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/effect/turf_decal/siding/red/corner, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/iron, +/area/mine/lounge) "KL" = ( /obj/effect/turf_decal/tile/bar/opposingcorners{ dir = 1 @@ -6268,17 +6303,6 @@ }, /turf/open/floor/iron, /area/mine/living_quarters) -"MG" = ( -/obj/item/kirbyplants/random, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/obj/effect/turf_decal/siding/yellow/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/lounge) "MH" = ( /obj/machinery/door/airlock/external/glass{ name = "Mining External Airlock" @@ -6333,14 +6357,6 @@ "MS" = ( /turf/open/floor/carpet/executive, /area/mine/lounge) -"MT" = ( -/obj/machinery/light/directional/north, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/turf/open/floor/iron/dark, -/area/mine/laborcamp/security) "MW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6531,6 +6547,21 @@ }, /turf/open/floor/iron/dark, /area/mine/eva) +"Og" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 9 + }, +/obj/item/storage/bag/ore, +/obj/item/pickaxe, +/obj/structure/rack, +/obj/item/mining_scanner, +/obj/item/flashlight, +/obj/item/clothing/glasses/meson, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/mine/storage/public) "Oh" = ( /obj/machinery/computer/security/labor, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -6559,6 +6590,16 @@ }, /turf/open/floor/iron/dark, /area/mine/mechbay) +"Om" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/obj/effect/turf_decal/siding/yellow/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/mine/lounge) "Op" = ( /obj/structure/stone_tile/slab, /turf/open/misc/asteroid/basalt/lava_land_surface, @@ -6580,35 +6621,6 @@ dir = 4 }, /area/mine/laborcamp/security) -"OE" = ( -/obj/structure/tank_holder/extinguisher, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/trimline/yellow/filled/arrow_ccw{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/filled/arrow_ccw{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/filled/mid_joiner{ - dir = 4 - }, -/turf/open/floor/iron/textured_edge{ - dir = 8 - }, -/area/mine/lounge) -"OF" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/turf/open/floor/iron, -/area/mine/lounge) "OH" = ( /obj/item/storage/fancy/cigarettes/cigpack_robust{ pixel_x = -8; @@ -6728,6 +6740,25 @@ /obj/item/toy/beach_ball, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"PA" = ( +/obj/structure/tank_holder/extinguisher, +/obj/effect/turf_decal/trimline/yellow/filled/arrow_ccw{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/arrow_ccw{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/mid_joiner{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/textured_edge{ + dir = 8 + }, +/area/mine/lounge) "PD" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/maintenance/two, @@ -6759,15 +6790,6 @@ }, /turf/open/floor/plating, /area/mine/production) -"PL" = ( -/obj/machinery/recycler, -/obj/machinery/conveyor{ - dir = 4; - id = "mining_disposals" - }, -/obj/effect/turf_decal/sand/plating/volcanic, -/turf/open/floor/plating/lavaland_atmos, -/area/mine/maintenance/service/disposals) "PR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet/executive, @@ -6796,6 +6818,17 @@ }, /turf/open/floor/iron, /area/mine/lounge) +"PW" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/power/apc/auto_name/directional/south, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 1 + }, +/area/mine/laborcamp/security) "PY" = ( /obj/structure/table, /obj/effect/spawner/random/entertainment/toy, @@ -6838,20 +6871,6 @@ }, /turf/open/floor/iron/dark, /area/mine/mechbay) -"Qp" = ( -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 9 - }, -/obj/item/storage/bag/ore, -/obj/item/pickaxe, -/obj/structure/rack, -/obj/item/mining_scanner, -/obj/item/flashlight, -/obj/item/clothing/glasses/meson, -/turf/open/floor/iron/dark, -/area/mine/storage/public) "Qw" = ( /obj/structure/stone_tile/cracked, /obj/structure/stone_tile{ @@ -6908,14 +6927,6 @@ }, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"QK" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/obj/effect/turf_decal/siding/yellow/corner, -/turf/open/floor/iron, -/area/mine/lounge) "QN" = ( /obj/structure/girder, /obj/effect/turf_decal/sand/plating/volcanic, @@ -6998,6 +7009,13 @@ }, /turf/open/floor/plating, /area/mine/production) +"Rt" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/effect/turf_decal/siding/yellow/corner, +/turf/open/floor/iron, +/area/mine/lounge) "Ru" = ( /obj/structure/sink/kitchen/directional/east{ desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; @@ -7007,6 +7025,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/freezer, /area/mine/laborcamp) +"Rv" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/mining_weather_monitor/directional/south, +/turf/open/floor/iron/smooth_edge{ + dir = 1 + }, +/area/mine/laborcamp/production) "Rw" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/toolcloset, @@ -7328,12 +7355,6 @@ /obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron/dark, /area/mine/production) -"TM" = ( -/obj/machinery/conveyor{ - id = "mining_internal" - }, -/turf/open/floor/plating, -/area/mine/production) "TQ" = ( /obj/structure/table, /obj/item/storage/toolbox/mechanical{ @@ -7472,15 +7493,6 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/mine/laborcamp/security) -"Uw" = ( -/obj/structure/rack, -/obj/item/storage/bag/ore, -/obj/item/pickaxe, -/obj/item/mining_scanner, -/obj/item/flashlight, -/obj/item/clothing/glasses/meson, -/turf/open/floor/iron/smooth, -/area/mine/laborcamp/production) "Ux" = ( /obj/structure/stone_tile{ dir = 1 @@ -7735,18 +7747,6 @@ }, /turf/open/floor/iron/dark/textured_large, /area/mine/laborcamp) -"VZ" = ( -/obj/structure/closet/secure_closet/engineering_welding{ - req_access = list("mining_station") - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 4 - }, -/area/mine/mechbay) "Wb" = ( /obj/structure/cable, /turf/open/floor/iron/dark/textured_large, @@ -8000,6 +8000,17 @@ dir = 4 }, /area/mine/lounge) +"XD" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/edge{ + dir = 1 + }, +/area/mine/lounge) "XH" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -8031,6 +8042,10 @@ }, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"XQ" = ( +/mob/living/basic/mining/goliath, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "XT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8231,6 +8246,14 @@ }, /turf/open/floor/iron/checker, /area/mine/cafeteria) +"Zj" = ( +/obj/structure/chair/sofa/middle/brown, +/obj/effect/turf_decal/tile/bar/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/checker, +/area/mine/cafeteria) "Zl" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8301,25 +8324,6 @@ dir = 8 }, /area/mine/lounge) -"ZD" = ( -/obj/structure/chair/comfy/teal{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/camera/autoname/directional/west{ - network = list("mine") - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/siding/yellow{ - dir = 4 - }, -/turf/open/floor/iron/edge{ - dir = 4 - }, -/area/mine/lounge) "ZH" = ( /obj/structure/closet/secure_closet/labor_camp_security, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -10149,7 +10153,7 @@ aj uU uU uU -zS +XQ ul uU aj @@ -10407,7 +10411,7 @@ pU pU uU uU -zS +XQ uU uU aj @@ -23492,7 +23496,7 @@ eR eR ff ff -zX +vB AN pp vJ @@ -23747,13 +23751,13 @@ aj aj eR Kw -HE +jk ff -Uw +mU Fv pP Nq -EN +Rv ff KA ff @@ -24012,7 +24016,7 @@ Nz Ez pQ uq -jU +Jw ff Gc RV @@ -31723,7 +31727,7 @@ he he Ia TT -bP +gZ Ia Ia Ia @@ -31976,7 +31980,7 @@ pU pU Ia Ia -MT +vn Po Ia Gm @@ -32491,7 +32495,7 @@ pU he Oh GW -JY +cj Eq uW St @@ -32751,7 +32755,7 @@ Oy IU he Zl -Dh +PW Ia Ia Ia @@ -33004,7 +33008,7 @@ aj pU Ia Ia -BE +Fp jq Ia np @@ -36324,7 +36328,7 @@ pU mA su xG -PL +lA Sd pU aj @@ -37130,7 +37134,7 @@ SP JI cM Zq -zn +KJ LM uN Mt @@ -37899,9 +37903,9 @@ pq Vp Zq Me -OE +PA Zq -mF +lO Zz FT Qa @@ -38384,7 +38388,7 @@ vc YR xI DF -HH +Kn xD aj aj @@ -38417,7 +38421,7 @@ Sz xr yX PV -OF +Gx Zq cX Wg @@ -38911,7 +38915,7 @@ kY Mc wJ kY -pe +Zj US DW ui @@ -39169,7 +39173,7 @@ kY kY kY eP -qs +wq DW qg kY @@ -39188,10 +39192,10 @@ yj yj yj bw -CJ +XD rU -Qp -zW +Og +Ko Ly dJ aj @@ -39442,7 +39446,7 @@ yp yp Dz LG -mu +JQ It Xp Ss @@ -40198,7 +40202,7 @@ iu tc xi iu -EL +Up Cf NE In @@ -40473,7 +40477,7 @@ ae tB It yf -sZ +mR rU rU rU @@ -40712,7 +40716,7 @@ iu iu iu iu -Uf +Bs iZ iu gE @@ -41484,7 +41488,7 @@ iu iu iu iN -qZ +ix iu Zw UD @@ -41495,10 +41499,10 @@ aj aj Zq Zq -QK +Rt bK Xi -ZD +ez EE XB Zb @@ -42525,10 +42529,10 @@ SP ti DZ FD -wR +vi WK qW -MG +Om Zq Zq pU @@ -42779,9 +42783,9 @@ tF aj aj Zq -rB +JA wp -lT +zF Zq SP SP @@ -45335,7 +45339,7 @@ tM QX sX ht -VZ +oJ Ok QX Vh @@ -45847,7 +45851,7 @@ tV Tp WU QX -CL +CQ TF Ju OZ @@ -46619,7 +46623,7 @@ Yl XT NU ld -IZ +nk ld NU WB @@ -46874,11 +46878,11 @@ cc ov Rh Xj -EU GL GL GL -EU +GL +GL GL Jl rv @@ -48418,7 +48422,7 @@ RY RY dQ Cg -eq +nt pK Ob IL @@ -48671,7 +48675,7 @@ aj pU NU Rs -TM +rP JG fT op diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index 8058677f938e1..535f37974bad5 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -44,12 +44,6 @@ /obj/structure/chair/comfy, /turf/open/floor/iron/dark, /area/station/science/breakroom) -"aaz" = ( -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/multiz/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/multiz/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor2/fore) "aaC" = ( /obj/structure/grille/broken, /obj/effect/decal/cleanable/glass, @@ -57,6 +51,19 @@ /obj/structure/barricade/wooden, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) +"aaI" = ( +/obj/effect/landmark/start/quartermaster, +/obj/structure/bed/double/pod, +/obj/item/bedsheet/qm/double, +/obj/machinery/requests_console/directional/north{ + department = "Quartermaster's Desk"; + name = "Quartermaster's Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/machinery/light/small/directional/east, +/turf/open/floor/carpet/orange, +/area/station/command/heads_quarters/qm) "aaM" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, @@ -101,19 +108,6 @@ }, /turf/open/floor/iron/white/small, /area/station/commons/fitness/recreation) -"aaX" = ( -/obj/structure/table/wood, -/obj/item/folder/yellow{ - pixel_x = 3; - pixel_y = 2 - }, -/obj/item/folder/blue, -/obj/machinery/light/small/directional/west, -/obj/item/hand_labeler{ - pixel_y = 8 - }, -/turf/open/floor/wood/large, -/area/station/command/heads_quarters/hop) "aba" = ( /obj/structure/railing/corner, /obj/structure/cable, @@ -121,6 +115,23 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) +"abk" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Genetics Desk" + }, +/obj/effect/turf_decal/siding/purple{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/airalarm/directional/east, +/obj/item/storage/box/gloves{ + pixel_x = 5; + pixel_y = 1 + }, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "abl" = ( /obj/effect/mapping_helpers/airlock/access/all/science/rd, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -139,11 +150,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/explab) -"abn" = ( -/obj/effect/spawner/random/vending/snackvend, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/secondary/entry) "abs" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -162,13 +168,6 @@ /obj/effect/spawner/structure/window/hollow/reinforced/directional, /turf/open/floor/plating, /area/station/science/xenobiology/hallway) -"abz" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/ai_monitored/command/nuke_storage) "abA" = ( /obj/machinery/door/airlock/external{ name = "Atmospherics External Access" @@ -183,16 +182,13 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos/project) -"abD" = ( -/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/red/directional/north, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port/aft) "abJ" = ( /obj/machinery/light_switch/directional/north, /obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /turf/open/floor/wood, /area/station/maintenance/floor3/starboard/aft) "abP" = ( @@ -224,14 +220,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"aca" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/machinery/light/cold/no_nightlight/directional/north, -/obj/structure/flora/bush/sparsegrass/style_random, -/turf/open/floor/grass, -/area/station/medical/virology) "acj" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/holopad, @@ -244,6 +232,14 @@ }, /turf/open/space/openspace, /area/space) +"acq" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron, +/area/station/hallway/floor2/aft) "act" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron/white/textured_large, @@ -406,18 +402,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard) -"aey" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 8 - }, -/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/hallway) "aeF" = ( /obj/machinery/conveyor_switch/oneway{ id = "coffinbelt"; @@ -427,13 +411,6 @@ }, /turf/open/floor/carpet/orange, /area/station/service/chapel/funeral) -"aeI" = ( -/obj/effect/turf_decal/siding/white/corner{ - color = null - }, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/rd) "aeL" = ( /obj/effect/spawner/random/trash/botanical_waste, /turf/open/floor/pod/light, @@ -481,6 +458,24 @@ }, /turf/open/floor/plating, /area/station/construction) +"afg" = ( +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 4 + }, +/obj/item/stack/sheet/iron/five{ + pixel_x = -6 + }, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/structure/frame/machine, +/obj/item/stack/sheet/glass{ + amount = 12 + }, +/obj/item/stack/cable_coil/five, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/corner{ + dir = 4 + }, +/area/station/engineering/lobby) "afs" = ( /obj/machinery/portable_atmospherics/canister/plasma, /obj/effect/turf_decal/trimline/purple, @@ -503,20 +498,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) -"afY" = ( -/obj/structure/railing, -/obj/machinery/light/cold/directional/west, -/obj/machinery/door/firedoor/border_only, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen/abandoned) -"agh" = ( -/obj/machinery/computer/security/telescreen/rd{ - pixel_y = 30 - }, -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/rd) "agi" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/structure/disposalpipe/segment, @@ -562,7 +543,7 @@ /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/fore) "agJ" = ( -/obj/machinery/modular_computer/console/preset/cargochat/science, +/obj/machinery/modular_computer/preset/cargochat/science, /obj/effect/turf_decal/tile/brown/opposingcorners, /obj/effect/turf_decal/tile/brown/opposingcorners, /obj/effect/turf_decal/stripes/white/line, @@ -594,7 +575,6 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron/dark, /area/station/medical/morgue) "ahd" = ( @@ -605,19 +585,6 @@ /obj/machinery/duct, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/starboard) -"ahe" = ( -/obj/effect/turf_decal/tile/dark/half/contrasted{ - dir = 8 - }, -/obj/effect/turf_decal/siding/purple, -/obj/machinery/camera/directional/south{ - c_tag = "Genetics Lab" - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "aho" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ @@ -635,13 +602,24 @@ /turf/open/floor/wood, /area/station/command/heads_quarters/hop) "ahG" = ( -/obj/machinery/modular_computer/console/preset/research{ +/obj/machinery/modular_computer/preset/research{ dir = 4 }, /obj/machinery/airalarm/directional/west, /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron/white, /area/station/command/heads_quarters/rd) +"ahO" = ( +/obj/machinery/vending/clothing, +/obj/effect/turf_decal/siding/wood, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/library/lounge) +"ahS" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/structure/window/hollow/reinforced/directional, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard) "ahT" = ( /obj/machinery/camera/directional/west, /turf/open/floor/wood, @@ -659,12 +637,6 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port/aft) -"ahY" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "aib" = ( /obj/machinery/firealarm/directional/east, /obj/machinery/door/firedoor/border_only{ @@ -715,6 +687,15 @@ /obj/structure/sign/departments/restroom/directional/east, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/floor3/fore) +"aip" = ( +/obj/effect/turf_decal/siding/wideplating_new{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/corner{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "air" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -732,6 +713,15 @@ /obj/machinery/light/red/dim/directional/west, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port/aft) +"aiF" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/white/arrow_ccw{ + 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/hallway/secondary/entry) "aiL" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -755,12 +745,6 @@ }, /turf/open/floor/iron/white, /area/station/maintenance/floor3/starboard/aft) -"aiP" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) "aiR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -777,13 +761,6 @@ /obj/structure/sign/poster/random/directional/east, /turf/open/floor/carpet/neon/simple/white, /area/station/commons/dorms/room3) -"aiT" = ( -/obj/effect/turf_decal/trimline/brown/arrow_ccw, -/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/side, -/area/station/cargo/lobby) "ajb" = ( /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) @@ -859,11 +836,6 @@ /obj/structure/disposalpipe/trunk, /turf/open/space/basic, /area/space/nearstation) -"akl" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/machinery/hydroponics/constructable, -/turf/open/floor/iron/white, -/area/station/science/research/abandoned) "akr" = ( /obj/machinery/button/door/directional/south{ id = "captain_privacy"; @@ -947,35 +919,34 @@ dir = 4 }, /area/station/engineering/storage/tech) -"alE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) -"alF" = ( -/obj/machinery/suit_storage_unit/rd, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 8 +"aln" = ( +/obj/effect/turf_decal/trimline/white/arrow_ccw, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 10 + }, +/area/station/hallway/secondary/entry) +"alr" = ( +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 4 }, -/obj/machinery/light/cold/no_nightlight/directional/east, /turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) +/area/station/hallway/floor2/fore) +"alu" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/science/xenobiology) "alK" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 4 }, /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron/white, /area/station/command/heads_quarters/rd) -"amf" = ( -/obj/machinery/light/directional/south, -/obj/effect/decal/cleanable/blood/footprints{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/floor3/starboard/aft) "amg" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, @@ -985,6 +956,14 @@ dir = 1 }, /area/station/maintenance/solars/starboard/fore) +"ami" = ( +/obj/effect/turf_decal/trimline/brown/arrow_ccw{ + dir = 8 + }, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/cargo/lobby) "amm" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -1006,16 +985,6 @@ "amt" = ( /turf/closed/wall, /area/station/service/library/lounge) -"amA" = ( -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/paper_bin, -/obj/item/pen, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/effect/turf_decal/siding/white/corner{ - color = null - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/rd) "amK" = ( /obj/machinery/door/poddoor/shutters{ id = "aux_base_shutters"; @@ -1023,13 +992,10 @@ }, /turf/open/floor/plating, /area/station/construction/mining/aux_base) -"amU" = ( -/obj/structure/closet/secure_closet/research_director, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) +"amM" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "anb" = ( /obj/machinery/vending/wardrobe/hydro_wardrobe, /obj/effect/turf_decal/tile/green/full, @@ -1128,6 +1094,11 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron, /area/station/maintenance/floor1/port/aft) +"anU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/cargo/storage) "anW" = ( /obj/structure/railing/corner{ dir = 4 @@ -1175,6 +1146,22 @@ /obj/effect/landmark/start/scientist, /turf/open/floor/iron/dark/smooth_large, /area/station/science/lobby) +"aoG" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/white{ + 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/chair/office/light{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "aoM" = ( /obj/structure/grille, /turf/open/floor/plating, @@ -1233,44 +1220,16 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/security/detectives_office) -"apr" = ( -/obj/structure/rack, -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/item/storage/toolbox/electrical{ - pixel_y = 5 - }, -/turf/open/floor/iron/dark, -/area/station/science/circuits) "apt" = ( /obj/structure/table/reinforced, /obj/effect/spawner/random/maintenance, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) -"apu" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Science - Radshelter" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/smooth_large, -/area/station/maintenance/radshelter/sci) "apw" = ( /obj/effect/turf_decal/stripes, /obj/structure/sign/departments/psychology/directional/west, /turf/open/floor/iron/dark, /area/station/medical/psychology) -"apx" = ( -/obj/machinery/light/directional/west, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "apy" = ( /obj/effect/turf_decal/siding/thinplating_new{ dir = 4 @@ -1322,12 +1281,6 @@ /obj/item/clothing/mask/facehugger/toy, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard) -"aqj" = ( -/obj/machinery/light/blacklight/directional/east, -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/reagent_containers/cup/blastoff_ampoule, -/turf/open/floor/carpet/neon/simple/pink/nodots, -/area/station/maintenance/floor2/port/fore) "aqw" = ( /obj/structure/stairs/south, /turf/open/floor/iron/smooth, @@ -1338,6 +1291,15 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor3/port) +"aqz" = ( +/obj/structure/table, +/obj/item/storage/box/beakers{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/storage/box/syringes, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics) "aqO" = ( /obj/machinery/door/airlock/security/glass{ name = "Brig Fore Entrance" @@ -1366,11 +1328,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port/aft) -"aqU" = ( -/obj/effect/decal/cleanable/oil, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/circuit/telecomms, -/area/station/tcommsat/server/upper) "aqW" = ( /obj/effect/turf_decal/trimline/green/filled/arrow_cw{ dir = 1 @@ -1383,14 +1340,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured, /area/station/medical/virology/isolation) -"ari" = ( -/obj/effect/turf_decal/trimline/white/arrow_ccw{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/station/hallway/secondary/entry) "arq" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sink/kitchen/directional/east, @@ -1409,21 +1358,16 @@ }, /turf/open/floor/plating, /area/station/engineering/lobby) -"arA" = ( -/obj/structure/cable, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/maintenance/solars/starboard/fore) -"arC" = ( -/obj/structure/chair/sofa/bench/right, -/turf/open/floor/grass, -/area/station/service/library/garden) "arE" = ( /obj/machinery/light/small/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/small, /area/station/commons/fitness/recreation) +"arG" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/floor1/fore) "arI" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/engine, @@ -1468,13 +1412,6 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) -"asg" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/service/hydroponics) "ask" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -1509,14 +1446,13 @@ /obj/machinery/telecomms/server/presets/science, /turf/open/floor/circuit/telecomms, /area/station/tcommsat/server) -"asz" = ( -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 8 +"asF" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/structure/filingcabinet/chestdrawer, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor1/fore) "asI" = ( /obj/structure/industrial_lift/public, /turf/open/floor/plating/elevatorshaft, @@ -1545,6 +1481,17 @@ }, /turf/open/floor/iron/dark, /area/station/service/kitchen) +"asZ" = ( +/obj/effect/turf_decal/trimline/green/line, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1 + }, +/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/hallway/floor3/aft) "ata" = ( /obj/structure/railing/corner{ dir = 1 @@ -1577,18 +1524,6 @@ /obj/effect/mapping_helpers/airlock/access/all/science/general, /turf/open/floor/iron/white, /area/station/science/lobby) -"atn" = ( -/obj/effect/turf_decal/siding/white{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "ato" = ( /obj/effect/decal/cleanable/dirt, /obj/item/rack_parts, @@ -1599,10 +1534,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/wood/large, /area/station/service/library/lounge) -"atx" = ( -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) "atB" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external, @@ -1619,14 +1550,6 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/wood/large, /area/station/service/library/artgallery) -"atP" = ( -/obj/effect/turf_decal/trimline/green/corner, -/obj/structure/sign/poster/official/random/directional/west, -/obj/machinery/light_switch/directional/north, -/obj/machinery/light/directional/north, -/obj/structure/closet/secure_closet/personal, -/turf/open/floor/iron/white/small, -/area/station/commons/fitness/recreation) "atT" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/flora/bush/flowers_br/style_random, @@ -1675,12 +1598,14 @@ /area/station/construction) "auv" = ( /obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/components/unary/outlet_injector{ - dir = 8 - }, /obj/effect/turf_decal/stripes{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + volume_rate = 200; + dir = 8; + initialize_directions = 8 + }, /turf/open/floor/engine, /area/station/science/cytology) "aux" = ( @@ -1796,17 +1721,23 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"avt" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/item/toy/plush/moth{ + color = "#8e2e87"; + desc = "A strange moth plushie named Edict, it's dyed purple."; + name = "Edict" + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, +/area/station/medical/psychology) "avH" = ( /obj/structure/table/glass, /obj/item/experi_scanner, /turf/open/floor/iron/white, /area/station/science/lower) -"avJ" = ( -/obj/machinery/light/directional/east, -/obj/structure/table, -/obj/item/storage/box/donkpockets, -/turf/open/floor/catwalk_floor/iron, -/area/station/cargo/storage) "avM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1851,23 +1782,23 @@ /obj/item/screwdriver, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard/aft) +"awD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/engineering/atmos/office) "awH" = ( /obj/effect/decal/cleanable/glass, /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) -"awT" = ( -/obj/structure/window/spawner/directional/west, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 8 - }, -/obj/structure/disposalpipe/trunk, -/obj/machinery/disposal/bin, -/turf/open/floor/wood, -/area/station/science/research/abandoned) +"awR" = ( +/obj/structure/flora/bush/flowers_br/style_random, +/obj/machinery/light/directional/west, +/turf/open/floor/grass, +/area/station/security/courtroom) "awU" = ( /obj/structure/closet/emcloset, /turf/open/floor/pod/dark, @@ -1951,6 +1882,14 @@ }, /turf/open/floor/iron, /area/station/security/prison/work) +"ayc" = ( +/obj/effect/turf_decal/trimline/purple/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/lobby) "ayi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1985,16 +1924,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/green/visible, /turf/open/space/basic, /area/space/nearstation) -"ayD" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "ayJ" = ( /obj/structure/sign/warning/docking, /turf/closed/wall/r_wall, @@ -2040,15 +1969,17 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port/fore) -"azi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/status_display/ai/directional/north, -/turf/open/floor/iron/white/side{ +"azj" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 4 }, -/area/station/science/lobby) +/obj/effect/turf_decal/arrows{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/disposalpipe/trunk/multiz, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "azu" = ( /obj/structure/table/wood, /obj/item/gun/ballistic/shotgun/doublebarrel, @@ -2057,23 +1988,6 @@ /obj/item/ammo_casing/shotgun/dart, /turf/open/floor/iron/checker, /area/station/service/bar) -"azC" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/siding/purple{ - dir = 9 - }, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) -"azF" = ( -/obj/effect/turf_decal/siding/purple/corner{ - dir = 1 - }, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "azI" = ( /obj/machinery/camera/autoname/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2091,11 +2005,6 @@ /obj/structure/bookcase/random/religion, /turf/open/floor/iron/white/textured_large, /area/station/service/chapel) -"azX" = ( -/obj/effect/turf_decal/box, -/obj/machinery/light/cold/no_nightlight/directional/west, -/turf/open/floor/engine, -/area/station/science/cytology) "aAc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2105,26 +2014,11 @@ dir = 4 }, /area/station/security/office) -"aAi" = ( -/obj/machinery/chem_master, -/obj/item/radio/intercom/directional/north{ - broadcasting = 1; - frequency = 1451; - listening = 0; - name = "Virology Private Channel" - }, -/turf/open/floor/iron/dark, -/area/station/medical/virology) "aAj" = ( /turf/open/floor/iron/dark/side{ dir = 4 }, /area/station/hallway/floor3/aft) -"aAl" = ( -/obj/effect/turf_decal/tile/green/opposingcorners, -/obj/machinery/iv_drip, -/turf/open/floor/iron/white, -/area/station/medical/virology) "aAx" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -2139,6 +2033,11 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos) +"aAE" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/mob/living/basic/cow, +/turf/open/floor/grass, +/area/station/science/cytology) "aAK" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/trimline/purple/warning, @@ -2174,36 +2073,26 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/disposal/incinerator) -"aBC" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "aBK" = ( /turf/closed/wall/r_wall, /area/station/medical/virology) -"aBN" = ( -/obj/machinery/computer/department_orders/science{ - department_delivery_areas = list(/area/station/science/lobby,/area/station/science/robotics/lab) - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/effect/turf_decal/stripes/white/line, -/turf/open/floor/iron/dark, -/area/station/science/circuits) "aBR" = ( /obj/item/wrench, /obj/structure/rack, /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) +"aBS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white/smooth_edge{ + dir = 8 + }, +/area/station/science/robotics/lab) "aBV" = ( /obj/effect/turf_decal/trimline/blue/end, /obj/effect/mapping_helpers/airlock/access/any/command/general, @@ -2217,6 +2106,15 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor4/fore) +"aCd" = ( +/obj/effect/turf_decal/siding/white, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/science/cytology) "aCl" = ( /obj/structure/table/reinforced, /obj/item/book/manual/wiki/chemistry, @@ -2284,6 +2182,15 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"aDf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "aDi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -2326,20 +2233,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/floor4/port/aft) -"aDr" = ( -/obj/structure/chair/office, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/entry) -"aDs" = ( -/obj/effect/turf_decal/tile/dark/half/contrasted{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "aDx" = ( /turf/open/floor/iron, /area/station/engineering/atmos/hfr_room) @@ -2385,12 +2278,6 @@ /obj/item/wrench, /turf/open/floor/pod, /area/station/maintenance/floor4/port/fore) -"aEf" = ( -/obj/structure/chair/office/light{ - dir = 1 - }, -/turf/open/floor/iron/smooth_edge, -/area/station/science/research/abandoned) "aEh" = ( /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, @@ -2410,23 +2297,27 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/security/detectives_office) +"aEq" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/camera/directional/east{ + c_tag = "Security - Interrogation Monitoring" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/interrogation) "aEA" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/fore) -"aEE" = ( -/obj/machinery/door/airlock/science{ - name = "Cytology" - }, -/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, -/obj/effect/mapping_helpers/airlock/access/all/science/xenobio, -/turf/open/floor/iron/white, -/area/station/science/cytology) "aEH" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -2452,17 +2343,6 @@ /obj/structure/chair/sofa/corp/left, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) -"aER" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/dark/fourcorners, -/obj/effect/turf_decal/siding/purple, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "aES" = ( /obj/structure/table/wood, /obj/effect/spawner/random/food_or_drink/seed, @@ -2499,17 +2379,20 @@ /obj/structure/filingcabinet/chestdrawer, /turf/open/floor/iron/large, /area/station/science/robotics/lab) -"aFt" = ( -/obj/structure/table/reinforced, -/obj/machinery/microwave, -/turf/open/floor/iron/dark/smooth_large, -/area/station/science/robotics/lab) "aFB" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 8 }, /turf/open/floor/iron/dark, /area/station/science/lab) +"aFI" = ( +/obj/machinery/computer/department_orders/medical{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/white/textured, +/area/station/medical/break_room) "aFJ" = ( /obj/machinery/button/door/directional/north{ id = "sm_bolt"; @@ -2519,11 +2402,12 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter) -"aFV" = ( -/obj/machinery/rnd/destructive_analyzer, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/station/science/lab) +"aFQ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/maintenance/floor2/port/aft) "aFY" = ( /obj/effect/spawner/random/trash/garbage{ spawn_scatter_radius = 1 @@ -2531,10 +2415,10 @@ /turf/open/floor/pod, /area/station/maintenance/floor4/port/fore) "aGj" = ( -/obj/structure/rack, /obj/effect/turf_decal/tile/brown/opposingcorners, /obj/effect/turf_decal/tile/brown/opposingcorners, /obj/effect/turf_decal/stripes/white/line, +/obj/machinery/bci_implanter, /turf/open/floor/iron/dark, /area/station/science/circuits) "aGm" = ( @@ -2549,10 +2433,6 @@ }, /turf/open/floor/carpet/blue, /area/station/command/meeting_room) -"aGq" = ( -/obj/machinery/airalarm/directional/north, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "aGr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -2619,14 +2499,6 @@ }, /turf/open/floor/wood/tile, /area/station/service/library) -"aGM" = ( -/obj/structure/rack, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/effect/turf_decal/stripes/white/line, -/obj/machinery/light/cold/no_nightlight/directional/north, -/turf/open/floor/iron/dark, -/area/station/science/circuits) "aGQ" = ( /turf/open/openspace, /area/station/maintenance/floor3/port) @@ -2657,28 +2529,12 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/pod/light, /area/station/maintenance/solars/port/aft) "aHk" = ( /turf/closed/wall, /area/station/medical/medbay/lobby) -"aHl" = ( -/obj/machinery/light/directional/south, -/obj/item/trash/champagne_cork{ - pixel_x = 8; - pixel_y = 5 - }, -/obj/item/trash/energybar, -/obj/item/stack/cannonball/trashball{ - pixel_x = -7; - pixel_y = 4 - }, -/obj/item/trash/cheesie, -/obj/effect/decal/cleanable/garbage, -/obj/effect/decal/cleanable/food/plant_smudge, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/port/aft) "aHn" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 1 @@ -2749,6 +2605,14 @@ name = "treated water" }, /area/station/maintenance/floor1/port/aft) +"aHY" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable, +/obj/machinery/vending/wardrobe/chem_wardrobe, +/obj/structure/sign/poster/official/plasma_effects/directional/west, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) "aId" = ( /obj/effect/turf_decal/trimline/blue/line{ dir = 4 @@ -2782,10 +2646,27 @@ }, /turf/open/floor/iron/dark/textured, /area/station/medical/morgue) +"aIJ" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/floor2/aft) +"aIU" = ( +/obj/machinery/firealarm/directional/north, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/port) "aIV" = ( /obj/structure/grille, /turf/open/floor/plating, /area/station/maintenance/floor1/port) +"aIY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/checker{ + dir = 1 + }, +/area/station/science/genetics) "aJb" = ( /obj/effect/mapping_helpers/mail_sorting/service/chapel, /obj/effect/mapping_helpers/mail_sorting/service/dormitories, @@ -2806,13 +2687,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) -"aJm" = ( -/obj/machinery/light/directional/west, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/security/office) "aJE" = ( /obj/effect/turf_decal/delivery, /obj/effect/decal/cleanable/dirt, @@ -2875,17 +2749,6 @@ }, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) -"aKo" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/machinery/light/cold/no_nightlight/directional/east, -/obj/machinery/status_display/ai/directional/east, -/turf/open/floor/iron/dark, -/area/station/science/auxlab) "aKq" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/flora/bush/sparsegrass/style_random, @@ -2928,17 +2791,6 @@ "aKQ" = ( /turf/open/floor/iron/textured_half, /area/station/cargo/sorting) -"aKY" = ( -/obj/machinery/chem_master{ - name = "Hydroanalysis Device" - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/obj/structure/sign/poster/random/directional/south, -/turf/open/floor/iron/white, -/area/station/cargo/miningdock) "aKZ" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 4 @@ -2971,13 +2823,6 @@ /obj/effect/landmark/start/depsec/supply, /turf/open/floor/iron, /area/station/cargo/lobby) -"aLu" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/turf_decal/tile/dark_red/fourcorners, -/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) "aLv" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/turf_decal/tile/green/full, @@ -3043,6 +2888,10 @@ }, /turf/open/floor/wood, /area/station/service/bar/atrium) +"aLX" = ( +/obj/effect/spawner/random/vending/colavend, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor2/aft) "aLZ" = ( /obj/structure/disposalpipe/junction{ dir = 8 @@ -3080,15 +2929,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor3/port/aft) -"aNk" = ( -/obj/structure/table, -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/item/paper_bin, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/dark, -/area/station/science/lab) "aNm" = ( /obj/structure/chair{ dir = 1 @@ -3112,21 +2952,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/third) -"aNB" = ( -/obj/machinery/light/directional/south, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) -"aNH" = ( -/obj/structure/table, -/obj/item/plate, -/obj/item/food/donkpocket/warm/berry, -/obj/item/knife/plastic{ - pixel_x = 16 - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/kitchen, -/area/station/command/heads_quarters/rd) "aNQ" = ( /obj/structure/transit_tube/station/dispenser{ dir = 4 @@ -3165,13 +2990,11 @@ }, /turf/open/floor/iron/dark/textured, /area/station/commons/fitness) -"aOB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/contraband/landmine, -/turf/open/floor/engine{ - icon_state = "podfloor_light" - }, -/area/station/maintenance/floor4/port) +"aOx" = ( +/obj/machinery/griddle, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "aOD" = ( /obj/effect/turf_decal/stripes{ dir = 5 @@ -3217,10 +3040,20 @@ /obj/structure/cable, /turf/open/floor/circuit/green, /area/station/science/robotics/mechbay) -"aPe" = ( -/obj/structure/hedge/opaque, -/turf/open/floor/plating, -/area/station/science/genetics) +"aPf" = ( +/obj/effect/turf_decal/siding/white, +/obj/effect/turf_decal/trimline/purple/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/cytology) +"aPg" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/delivery, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/storage/primary) "aPh" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -3233,18 +3066,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"aPq" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron, -/area/station/science/genetics) -"aPt" = ( -/obj/structure/chair/sofa/corp{ - dir = 8 - }, -/obj/structure/sign/poster/official/random/directional/east, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/wood, -/area/station/command/meeting_room) "aPu" = ( /obj/effect/turf_decal/stripes/end, /turf/open/floor/plating/reinforced{ @@ -3285,33 +3106,24 @@ dir = 1 }, /area/station/hallway/secondary/entry) -"aPR" = ( -/obj/machinery/camera/directional/south{ - c_tag = "AI Chamber - Port"; - network = list("aicore") - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/firealarm/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"aQi" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/machinery/turretid{ - control_area = "/area/station/ai_monitored/turret_protected/aisat_interior"; - name = "Antechamber Turret Control"; - pixel_y = -32 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/service) "aQk" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/table/wood, /turf/open/floor/carpet/red, /area/station/service/library/lounge) +"aQt" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 5 + }, +/obj/machinery/light/small/directional/west, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/hallway/floor2/fore) "aQA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /obj/effect/turf_decal/trimline/yellow/line, @@ -3400,14 +3212,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload_foyer) -"aRx" = ( -/obj/machinery/rnd/production/circuit_imprinter/department/science, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/iron/dark, -/area/station/science/auxlab) "aRz" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -3417,6 +3221,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"aRF" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable, +/obj/machinery/atmospherics/components/tank/plasma, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal/incinerator) "aRG" = ( /obj/structure/table, /obj/machinery/cell_charger, @@ -3437,12 +3248,20 @@ /turf/open/floor/iron/dark/textured, /area/station/command/heads_quarters/ce) "aRK" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 4 }, /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/white, /area/station/science/lab) +"aRM" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/commons/dorms/apartment2) "aRP" = ( /obj/machinery/power/turbine/core_rotor, /obj/structure/cable, @@ -3473,6 +3292,14 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/white, /area/station/science/lab) +"aSg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "aSj" = ( /obj/structure/railing{ dir = 1 @@ -3511,7 +3338,7 @@ /obj/machinery/shower/directional/west, /obj/structure/fluff{ desc = "What, you think the water just magically soaks into the metallic flooring?"; - icon = 'icons/obj/lavaland/survival_pod.dmi'; + icon = 'icons/obj/mining_zones/survival_pod.dmi'; icon_state = "fan_tiny"; name = "shower drain" }, @@ -3537,18 +3364,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron, /area/station/commons/toilet) -"aSR" = ( -/obj/effect/turf_decal/trimline/purple/line, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) "aSU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3574,18 +3389,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"aTg" = ( -/obj/effect/turf_decal/trimline/blue/line, -/obj/effect/turf_decal/trimline/blue/line{ - dir = 1 - }, -/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/delivery, -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/aft) "aTh" = ( /obj/structure/chair/office{ dir = 8 @@ -3623,26 +3426,6 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) -"aTn" = ( -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/science/auxlab) -"aTy" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/machinery/disposal/bin, -/obj/machinery/light/cold/no_nightlight/directional/south, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/science/lab) "aTK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/red/fourcorners, @@ -3654,6 +3437,21 @@ }, /turf/open/floor/plating/airless, /area/space) +"aTU" = ( +/obj/effect/turf_decal/trimline/purple/line, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 1 + }, +/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/hallway/floor2/fore) +"aUb" = ( +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron, +/area/station/hallway/floor1/aft) "aUe" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -3680,17 +3478,6 @@ /obj/effect/mapping_helpers/airlock/access/any/medical/psychology, /turf/open/floor/catwalk_floor, /area/station/hallway/floor2/fore) -"aUy" = ( -/obj/machinery/light/directional/north, -/obj/machinery/fax{ - fax_name = "Service Hallway"; - name = "Service Fax Machine" - }, -/obj/structure/table/reinforced, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/hallway/secondary/service) "aUG" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/table_or_rack, @@ -3733,10 +3520,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"aVg" = ( -/obj/machinery/rnd/production/circuit_imprinter/department/science, -/turf/open/floor/iron/dark/smooth_large, -/area/station/science/robotics/lab) "aVk" = ( /obj/machinery/door/airlock/freezer{ name = "Rec Room Showers" @@ -3770,22 +3553,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/large, /area/station/medical/virology/isolation) -"aVE" = ( -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) -"aVF" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/iron/textured_edge{ - dir = 8 - }, -/area/station/medical/chemistry) "aVJ" = ( /turf/open/floor/iron/dark/corner, /area/station/hallway/floor2/aft) @@ -3896,10 +3663,6 @@ }, /turf/open/misc/beach/sand, /area/station/hallway/floor2/fore) -"aWG" = ( -/obj/structure/lattice, -/turf/open/openspace, -/area/station/maintenance/floor3/starboard) "aWH" = ( /obj/machinery/door/airlock/grunge{ name = "Mech Bay" @@ -3912,13 +3675,10 @@ /turf/open/floor/iron/smooth, /area/station/science/robotics/mechbay) "aWJ" = ( -/obj/effect/turf_decal/trimline/blue/warning{ - dir = 1 - }, -/obj/effect/spawner/random/structure/tank_holder, -/obj/machinery/light/small/directional/west, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor2/port) +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/science/cytology) "aWO" = ( /obj/effect/turf_decal/trimline/green/filled/arrow_cw{ dir = 9 @@ -3942,25 +3702,44 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port/aft) +"aXh" = ( +/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, +/obj/structure/disposalpipe/segment, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/carpet/red, +/area/station/service/theater) "aXj" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 }, /turf/open/floor/iron, /area/station/hallway/floor3/aft) -"aXr" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/stripes, -/obj/item/storage/box/monkeycubes{ - pixel_x = -5 +"aXk" = ( +/obj/structure/table/wood, +/obj/item/plate/large{ + pixel_y = 2 }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/item/storage/box/monkeycubes, -/obj/item/storage/box/monkeycubes{ - pixel_x = 5 +/obj/item/food/pizza/dank{ + pixel_y = 6 }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) +/obj/structure/sign/poster/contraband/pwr_game/directional/east, +/obj/machinery/light/small/directional/east, +/turf/open/floor/carpet/purple, +/area/station/maintenance/floor1/port/aft) +"aXq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/light/cold/no_nightlight/directional/north, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/station/science/lobby) "aXC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -4010,24 +3789,26 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/medical/abandoned) -"aXW" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/white/smooth_edge{ - dir = 1 - }, -/area/station/cargo/miningoffice) "aYa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/textured_large, /area/station/hallway/secondary/exit/departure_lounge) +"aYb" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/line, +/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 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Public Airlock" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/aft) "aYd" = ( /obj/effect/turf_decal/trimline/yellow/line{ dir = 1 @@ -4038,6 +3819,13 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) +"aYe" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor3/aft) "aYk" = ( /obj/structure/industrial_lift/public, /obj/effect/landmark/lift_id{ @@ -4070,6 +3858,14 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port/aft) +"aYs" = ( +/obj/machinery/power/shieldwallgen/xenobiologyaccess, +/obj/effect/turf_decal/stripes{ + dir = 5 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "aYv" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -4106,33 +3902,16 @@ dir = 6 }, /area/station/hallway/floor2/fore) +"aYB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/medical/cryo) "aYJ" = ( /obj/structure/cable, /obj/machinery/duct, /turf/open/floor/wood, /area/station/service/bar/atrium) -"aYP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/machinery/light/directional/north, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/smooth_large, -/area/station/science/robotics/mechbay) -"aYQ" = ( -/obj/effect/turf_decal/trimline/green/line, -/obj/effect/turf_decal/trimline/green/line{ - dir = 1 - }, -/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/hallway/floor3/fore) "aYS" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -4157,17 +3936,17 @@ /obj/effect/decal/cleanable/glass, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard) -"aZj" = ( -/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/smooth_half, -/area/station/maintenance/radshelter/sci) "aZl" = ( /obj/structure/sign/poster/official/do_not_question/directional/south, /obj/effect/turf_decal/tile/dark_red/fourcorners, /turf/open/floor/iron, /area/station/security/brig) +"aZm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/grown/bananapeel, +/obj/machinery/light/cold/no_nightlight/directional/south, +/turf/open/floor/grass, +/area/station/medical/virology) "aZn" = ( /turf/open/floor/circuit/green, /area/station/science/robotics/mechbay) @@ -4232,15 +4011,12 @@ }, /turf/open/space/openspace, /area/space/nearstation) -"aZS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/closet/secure_closet/brig{ - name = "Prisoner Locker" +"aZX" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 9 }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) +/area/station/hallway/floor4/fore) "baa" = ( /obj/structure/railing/corner{ dir = 1 @@ -4256,22 +4032,6 @@ /obj/structure/cable, /turf/open/floor/wood/tile, /area/station/service/library) -"bad" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"bae" = ( -/obj/effect/turf_decal/siding/wood{ - 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/wood/parquet, -/area/station/service/lawoffice) "bag" = ( /obj/structure/table, /obj/item/paper/fluff/holodeck/disclaimer, @@ -4320,6 +4080,18 @@ dir = 4 }, /area/station/science/robotics/mechbay) +"baN" = ( +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + 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/cytology) "bbb" = ( /obj/effect/decal/cleanable/blood/tracks{ dir = 6 @@ -4380,14 +4152,6 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron/dark/textured, /area/station/command/heads_quarters/ce) -"bbU" = ( -/obj/machinery/computer/records/security{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/entry) "bbW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -4410,32 +4174,16 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port/aft) -"bcf" = ( -/obj/effect/turf_decal/trimline/brown/arrow_cw{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/miningdock) "bcm" = ( -/obj/machinery/lapvend, /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron/dark/side{ dir = 8 }, /area/station/hallway/floor2/aft) -"bcp" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/smooth_large, -/area/station/science/robotics/mechbay) +"bcr" = ( +/obj/item/shard, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/floor2/starboard/aft) "bcx" = ( /obj/effect/turf_decal/trimline/purple/warning{ dir = 1 @@ -4445,6 +4193,17 @@ dir = 1 }, /area/station/hallway/floor2/fore) +"bcC" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "bcD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -4474,10 +4233,12 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/textured_large, /area/station/cargo/storage) -"bdj" = ( -/obj/effect/turf_decal/trimline/brown/arrow_ccw, -/turf/open/floor/iron/dark/side, -/area/station/cargo/lobby) +"bde" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/wood/parquet, +/area/station/commons/dorms/room2) "bdx" = ( /obj/structure/railing/corner, /obj/structure/chair/stool/bar/directional/east, @@ -4490,6 +4251,14 @@ /obj/structure/chair/bronze, /turf/open/floor/bronze/filled, /area/station/maintenance/floor1/starboard) +"bdD" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/paper_bin, +/obj/item/pen, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/corner, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/rd) "bdN" = ( /obj/structure/table, /obj/item/stack/sheet/iron/fifty, @@ -4502,6 +4271,17 @@ }, /turf/open/floor/iron, /area/station/construction/mining/aux_base) +"bdR" = ( +/obj/effect/turf_decal/trimline/green/line, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/hallway/floor3/fore) "beh" = ( /turf/open/floor/iron, /area/station/commons/toilet) @@ -4590,12 +4370,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/white, /area/station/medical/abandoned) -"bfe" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/turf_decal/bot, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/iron/dark/smooth_large, -/area/station/science/robotics/mechbay) "bff" = ( /obj/effect/turf_decal/siding/green{ dir = 4 @@ -4667,11 +4441,32 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/science/robotics/mechbay) -"bfD" = ( -/obj/machinery/recharger, -/obj/structure/table, -/turf/open/floor/iron/dark, -/area/station/security/brig) +"bfC" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor1/aft) +"bfM" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/requests_console/directional/west{ + department = "Chief Medical Officer's Desk"; + name = "Chief Medical Officer's Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/iron/stairs/left{ + dir = 1 + }, +/area/station/command/heads_quarters/cmo) "bfT" = ( /obj/effect/turf_decal/trimline/blue/line{ dir = 8 @@ -4715,6 +4510,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured_corner, /area/station/maintenance/floor1/starboard/aft) +"bgs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/textured, +/area/station/command/heads_quarters/ce) "bgz" = ( /obj/machinery/mech_bay_recharge_port{ dir = 1 @@ -4733,6 +4534,14 @@ /obj/machinery/power/emitter/welded, /turf/open/floor/plating/airless, /area/space/nearstation) +"bgH" = ( +/obj/structure/rack, +/obj/item/toy/plush/plasmamanplushie{ + desc = "A stuffed toy that resembles your plasma coworkers. It is cute despite itself."; + name = "Nitrous II" + }, +/turf/open/floor/plating, +/area/station/maintenance/floor1/port/fore) "bgI" = ( /obj/machinery/button/elevator/directional/south{ id = "com_vator" @@ -4757,14 +4566,6 @@ /obj/structure/reflector/double, /turf/open/floor/plating/airless, /area/space/nearstation) -"bgX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/wood/tile, -/area/station/command/heads_quarters/captain/private) "bhb" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4775,15 +4576,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/aft) -"bhj" = ( -/obj/effect/turf_decal/siding/white{ - dir = 8 - }, -/obj/structure/table/reinforced/rglass, -/obj/machinery/light/directional/west, -/obj/item/screwdriver, -/turf/open/floor/iron/large, -/area/station/science/robotics/lab) "bho" = ( /obj/item/statuebust, /turf/open/misc/beach/sand, @@ -4796,6 +4588,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/corner, /area/station/engineering/lobby) +"bhy" = ( +/obj/structure/sign/warning/biohazard/directional/east, +/obj/machinery/light/cold/no_nightlight/directional/east, +/turf/open/floor/engine{ + initial_gas_mix = "o2=22;bz=82;TEMP=293.15" + }, +/area/station/science/xenobiology) "bhz" = ( /obj/effect/turf_decal/trimline/brown/warning{ dir = 4 @@ -4819,18 +4618,6 @@ }, /turf/open/floor/iron, /area/station/hallway/floor3/fore) -"bhQ" = ( -/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, -/obj/item/radio/intercom/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/duct, -/turf/open/floor/iron/white, -/area/station/medical/medbay/aft) "bhW" = ( /obj/machinery/conveyor{ dir = 4; @@ -4868,7 +4655,7 @@ /turf/open/floor/iron/dark, /area/station/security/prison/visit) "bif" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 4 }, /turf/open/floor/iron/dark/smooth_large, @@ -4888,11 +4675,13 @@ dir = 1 }, /area/station/hallway/floor3/aft) -"biu" = ( -/obj/effect/turf_decal/trimline/red, -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/turf/open/floor/engine/n2o, -/area/station/engineering/atmos) +"bir" = ( +/obj/effect/turf_decal/trimline/purple/warning{ + dir = 6 + }, +/obj/effect/spawner/random/engineering/canister, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor2/starboard) "biz" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/machinery/door/airlock/medical{ @@ -4923,7 +4712,9 @@ /turf/open/floor/iron, /area/station/science/robotics/lab) "biF" = ( -/obj/machinery/recycler, +/obj/machinery/recycler{ + dir = 8 + }, /obj/machinery/conveyor{ dir = 4; id = "disposals" @@ -4938,6 +4729,12 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) +"biJ" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/misc/sandy_dirt, +/area/station/science/cytology) "biM" = ( /obj/structure/railing{ dir = 1 @@ -4983,6 +4780,22 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/commons/dorms/apartment2) +"biW" = ( +/obj/machinery/modular_computer/preset/civilian{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron/dark, +/area/station/science/auxlab) +"bja" = ( +/obj/machinery/vending/cigarette, +/obj/machinery/camera/autoname/directional/west, +/obj/machinery/light/directional/west, +/turf/open/floor/wood, +/area/station/command/meeting_room) "bjb" = ( /obj/structure/cable, /turf/open/floor/plating/airless, @@ -5004,15 +4817,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/engine, /area/station/maintenance/floor4/starboard/aft) -"bjh" = ( -/obj/machinery/light/directional/north, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 8 - }, -/obj/item/wrench, -/turf/open/floor/iron/dark/textured_corner, -/area/station/engineering/supermatter) "bjw" = ( /obj/structure/table, /obj/machinery/computer/libraryconsole/bookmanagement, @@ -5022,6 +4826,11 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard) +"bjC" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/maintenance/floor2/port/fore) "bjF" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -5063,6 +4872,12 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark/smooth_large, /area/station/science/lobby) +"bkd" = ( +/obj/structure/table/glass, +/obj/item/hand_tele, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/command/teleporter) "bkh" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -5131,6 +4946,12 @@ name = "treated water" }, /area/station/maintenance/floor1/port/aft) +"bkH" = ( +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/item/kirbyplants/random, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) "bkM" = ( /obj/effect/landmark/start/ai/secondary, /obj/item/radio/intercom/directional/north{ @@ -5264,13 +5085,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/hallway/floor1/fore) -"blL" = ( -/obj/machinery/light/cold/no_nightlight/directional/north, -/obj/machinery/newscaster/directional/north, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "blN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5303,17 +5117,28 @@ /obj/structure/railing, /turf/open/floor/iron/white/side, /area/station/science/robotics/lab) +"bmf" = ( +/obj/structure/window/spawner/directional/south, +/obj/structure/closet/secure_closet/research_director, +/turf/open/floor/carpet/green, +/area/station/command/heads_quarters/rd) "bml" = ( /obj/structure/lattice/catwalk, /obj/structure/ladder, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) -"bmr" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 +"bmx" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 8 }, -/turf/open/floor/iron/white/textured_large, -/area/station/service/chapel/office) +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/rnd/production/techfab/department/cargo, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/smooth, +/area/station/cargo/office) "bmA" = ( /obj/effect/turf_decal/siding/white/corner{ dir = 8 @@ -5332,6 +5157,12 @@ dir = 1 }, /area/station/hallway/floor4/fore) +"bmE" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/floor2/starboard/aft) "bmG" = ( /obj/effect/turf_decal/tile/green/half, /obj/structure/table, @@ -5374,14 +5205,6 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron, /area/station/science/robotics/lab) -"bnu" = ( -/obj/machinery/light/blacklight/directional/west, -/obj/structure/table, -/obj/item/stack/arcadeticket, -/obj/item/stack/arcadeticket, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/eighties, -/area/station/commons/fitness/recreation/entertainment) "bnz" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -5405,6 +5228,12 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/dark/smooth_large, /area/station/science/robotics/lab) +"bnL" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hos) "bnN" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -5436,6 +5265,15 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) +"boa" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/effect/turf_decal/trimline/brown/filled/mid_joiner, +/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/north, +/turf/open/floor/carpet/red, +/area/station/service/theater) "bof" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -5444,6 +5282,23 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) +"boq" = ( +/obj/structure/table/wood, +/obj/item/storage/photo_album/chapel, +/obj/effect/turf_decal/siding/yellow{ + dir = 1 + }, +/obj/item/storage/fancy/candle_box{ + pixel_x = -19; + pixel_y = 5 + }, +/obj/machinery/requests_console/directional/north{ + department = "Chapel"; + name = "Chapel Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/carpet/orange, +/area/station/service/chapel/office) "bor" = ( /obj/effect/spawner/random/vending/colavend, /turf/open/floor/iron/dark/side{ @@ -5477,6 +5332,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/stairs/right, /area/station/science/robotics/lab) +"boL" = ( +/obj/machinery/rnd/destructive_analyzer, +/obj/effect/turf_decal/bot, +/obj/machinery/requests_console/directional/east{ + department = "Research Lab"; + name = "Research Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/ore_update, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/information, +/turf/open/floor/iron/dark, +/area/station/science/lab) "boP" = ( /obj/machinery/duct, /turf/open/floor/iron/dark/textured, @@ -5508,16 +5376,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) -"bpz" = ( -/obj/effect/turf_decal/trimline/green/filled/corner{ - 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/decal/cleanable/wrapping, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) "bpA" = ( /obj/effect/turf_decal/siding/white{ dir = 10 @@ -5548,51 +5406,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/starboard) -"bpI" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 10 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"bpL" = ( -/obj/effect/turf_decal/siding/white{ - dir = 6 - }, -/obj/structure/railing{ - dir = 6 - }, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/structure/table/reinforced/rglass, -/turf/open/floor/iron/large, -/area/station/science/robotics/lab) -"bpU" = ( -/obj/effect/turf_decal/trimline/brown/arrow_ccw{ - dir = 10 - }, -/obj/structure/reagent_dispensers/water_cooler, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/station/cargo/lobby) -"bpV" = ( -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/cargo/miningdock) -"bqb" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/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/smooth_edge{ - dir = 8 +"bpY" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 5 }, -/area/station/science/robotics/lab) +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white, +/area/station/science/xenobiology/hallway) "bqn" = ( /obj/structure/closet/crate, /obj/item/reagent_containers/cup/bowl, @@ -5667,26 +5487,14 @@ /obj/effect/decal/cleanable/blood/footprints, /turf/open/floor/iron/kitchen, /area/station/service/kitchen/abandoned) +"bqH" = ( +/obj/machinery/vending/cola, +/turf/open/floor/iron/checker, +/area/station/service/bar/atrium) "bqI" = ( /obj/structure/window/spawner/directional/east, /turf/open/floor/grass, /area/station/maintenance/floor3/starboard) -"bqO" = ( -/obj/effect/turf_decal/trimline/red/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/red/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 8 - }, -/obj/effect/mapping_helpers/mail_sorting/security/general, -/obj/effect/mapping_helpers/mail_sorting/security/hos_office, -/obj/effect/mapping_helpers/mail_sorting/security/detectives_office, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/fore) "bqQ" = ( /obj/structure/closet/crate/freezer/blood{ anchored = 1 @@ -5696,6 +5504,13 @@ }, /turf/open/floor/iron/dark/textured, /area/station/medical/office) +"bqU" = ( +/obj/effect/turf_decal/trimline/blue, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "brj" = ( /turf/closed/wall, /area/station/hallway/secondary/entry) @@ -5744,45 +5559,24 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/science/robotics/lab) -"brG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/mechanical{ - pixel_y = 10 - }, -/obj/item/storage/toolbox/electrical{ - pixel_x = 3; - pixel_y = 1 - }, -/obj/item/clothing/glasses/welding{ - pixel_x = -1; - pixel_y = -3 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white/smooth_large, -/area/station/science/robotics/lab) "brL" = ( -/obj/effect/turf_decal/stripes{ - dir = 6 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/stairs{ + dir = 1 }, -/obj/structure/disposalpipe/segment, +/area/station/bitrunning/den) +"brM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, -/area/station/maintenance/floor1/starboard/fore) +/area/station/maintenance/floor4/port/fore) "brN" = ( /obj/effect/spawner/structure/window/hollow/reinforced/directional, /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/cargo/miningdock) -"brO" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/service/hydroponics) "brT" = ( /obj/structure/railing{ dir = 8 @@ -5793,25 +5587,30 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/port/fore) -"bsi" = ( -/obj/structure/table, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "bsl" = ( /obj/item/stack/tile/iron/white, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/medical/abandoned) "bsq" = ( -/obj/effect/turf_decal/stripes, -/turf/open/floor/plating, -/area/station/maintenance/floor1/starboard/fore) +/obj/machinery/computer/order_console/bitrunning{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "bsu" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/hallway/secondary/entry) +"bsv" = ( +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/hallway/floor2/aft) "bsw" = ( /obj/structure/railing{ dir = 8 @@ -5831,6 +5630,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/science/lobby) +"bsB" = ( +/obj/machinery/door/airlock/science{ + name = "Changing Room" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/turf/open/floor/iron/white, +/area/station/science/lower) "bsC" = ( /obj/effect/landmark/start/hangover, /obj/structure/disposalpipe/segment{ @@ -5901,18 +5709,24 @@ }, /turf/open/floor/iron/dark/corner, /area/station/security/brig) +"bsX" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/clothing/gloves/latex, +/obj/item/clothing/glasses/science, +/obj/item/healthanalyzer, +/obj/item/clothing/glasses/hud/health, +/obj/machinery/requests_console/directional/north{ + department = "Virology"; + name = "Virology Requests Console" + }, +/turf/open/floor/iron/dark, +/area/station/medical/virology) "bta" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 }, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"bto" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 10 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "btp" = ( /obj/structure/table, /obj/item/storage/backpack/science{ @@ -5945,29 +5759,12 @@ dir = 4 }, /area/station/science/robotics/lab) -"bty" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green, -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/turf/open/floor/carpet, -/area/station/medical/psychology) "btC" = ( /obj/effect/turf_decal/trimline/green/warning{ dir = 1 }, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/fore) -"btD" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/landmark/start/geneticist, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "btL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/stripes/corner{ @@ -6099,11 +5896,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"bva" = ( -/obj/structure/ladder, -/obj/effect/turf_decal/trimline/purple/warning, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor3/starboard) "bvc" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -6135,6 +5927,28 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard) +"bvx" = ( +/obj/structure/table, +/obj/item/clothing/under/plasmaman/science{ + pixel_x = 2; + pixel_y = -7 + }, +/obj/item/clothing/suit/hooded/wintercoat/science{ + pixel_x = 6; + pixel_y = -3 + }, +/obj/item/clothing/suit/hooded/wintercoat/science, +/obj/item/clothing/suit/hooded/wintercoat/science{ + pixel_x = -6; + pixel_y = 3 + }, +/obj/item/clothing/head/helmet/space/plasmaman/science{ + pixel_x = 6; + pixel_y = 9 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white, +/area/station/science/lower) "bvB" = ( /obj/structure/sign/directions/medical/directional/north{ dir = 2 @@ -6246,7 +6060,7 @@ /obj/effect/turf_decal/trimline/blue/arrow_cw{ dir = 8 }, -/obj/machinery/light/small/directional/west, +/obj/machinery/light/directional/west, /turf/open/floor/iron/dark, /area/station/hallway/floor4/fore) "bwx" = ( @@ -6303,6 +6117,17 @@ /obj/structure/girder, /turf/open/floor/plating, /area/station/maintenance/floor1/port/aft) +"bxb" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/ai_monitored/command/storage/eva) "bxc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/airalarm/directional/south, @@ -6379,53 +6204,20 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/hallway/secondary/exit/departure_lounge) -"byj" = ( -/obj/structure/table/reinforced, -/obj/machinery/ecto_sniffer{ - pixel_x = -5; - pixel_y = -7 - }, -/obj/item/assembly/flash/handheld{ - pixel_x = 10; - pixel_y = 10 - }, -/obj/item/assembly/flash/handheld{ - pixel_x = 7; - pixel_y = 6 - }, -/obj/item/assembly/flash/handheld{ - pixel_x = 10; - pixel_y = 3 - }, -/obj/item/assembly/flash/handheld{ - pixel_x = 7 +"byk" = ( +/obj/effect/turf_decal/tile/blue/half{ + dir = 8 }, -/obj/item/assembly/flash/handheld{ - pixel_x = 10; - pixel_y = -5 +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron/textured_edge{ + dir = 8 }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark/smooth_large, -/area/station/science/robotics/lab) +/area/station/medical/chemistry) "byl" = ( /obj/structure/ladder, /obj/effect/turf_decal/trimline/neutral/warning, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/starboard/aft) -"byx" = ( -/obj/structure/rack, -/obj/item/mod/core/standard{ - pixel_x = 4; - pixel_y = -4 - }, -/obj/item/mod/core/standard, -/obj/item/mod/core/standard{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark/smooth_large, -/area/station/science/robotics/lab) "byE" = ( /obj/structure/table, /turf/open/floor/iron, @@ -6458,6 +6250,10 @@ /obj/effect/turf_decal/trimline/blue/filled/corner, /turf/open/floor/iron/white, /area/station/medical/storage) +"byX" = ( +/obj/machinery/computer/monitor, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/aisat/service) "byY" = ( /obj/structure/dresser, /obj/machinery/camera/directional/west{ @@ -6525,13 +6321,6 @@ }, /turf/open/floor/pod, /area/station/maintenance/floor4/port/aft) -"bzN" = ( -/obj/machinery/newscaster/directional/east, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/textured_corner{ - dir = 8 - }, -/area/station/cargo/office) "bzO" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -6553,15 +6342,6 @@ dir = 1 }, /area/station/hallway/floor3/aft) -"bzY" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/mecha_part_fabricator{ - dir = 4 - }, -/turf/open/floor/iron/white/smooth_large, -/area/station/science/robotics/lab) "bAb" = ( /obj/structure/sign/poster/contraband/atmosia_independence/directional/west, /obj/machinery/light/small/directional/west, @@ -6593,13 +6373,9 @@ }, /area/station/hallway/floor3/aft) "bAh" = ( -/obj/machinery/door/firedoor/border_only{ - 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, +/obj/effect/spawner/random/structure/table_or_rack, +/obj/effect/spawner/random/trash/soap, +/turf/open/floor/plating, /area/station/maintenance/floor1/starboard/fore) "bAj" = ( /obj/machinery/conveyor{ @@ -6608,15 +6384,17 @@ }, /turf/open/floor/iron/white, /area/station/science/robotics/lab) -"bAn" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/mecha_part_fabricator{ - dir = 8 +"bAk" = ( +/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/yellow/line, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 }, -/turf/open/floor/iron/white/smooth_large, -/area/station/science/robotics/lab) +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/aft) "bAq" = ( /obj/effect/turf_decal/trimline/green/filled/arrow_cw{ dir = 5 @@ -6626,21 +6404,10 @@ }, /turf/open/floor/iron/dark/textured, /area/station/medical/virology/isolation) -"bAu" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 1; - piping_layer = 2 - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/pumproom) -"bAv" = ( -/obj/machinery/light/directional/north, -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/iron/checker, -/area/station/commons/vacant_room/commissary) +"bAx" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "bAG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6667,6 +6434,13 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/dark/side, /area/station/hallway/secondary/entry) +"bBg" = ( +/obj/structure/bed/medical/emergency, +/obj/machinery/iv_drip, +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/white, +/area/station/security/medical) "bBw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6681,15 +6455,12 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/floor1/fore) -"bBA" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/hallway/floor4/aft) +"bBK" = ( +/obj/effect/turf_decal/trimline/green/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/commons/vacant_room/commissary) "bBP" = ( /obj/effect/turf_decal/trimline/green/warning{ dir = 8 @@ -6729,22 +6500,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"bCh" = ( -/obj/structure/table/reinforced, -/obj/item/mmi{ - pixel_x = -5; - pixel_y = 8 - }, -/obj/item/mmi{ - pixel_y = 4 - }, -/obj/item/mmi{ - pixel_x = 5 - }, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/robotics/lab) "bCk" = ( /obj/structure/rack, /obj/effect/spawner/random/engineering/tool, @@ -6762,6 +6517,14 @@ }, /turf/open/floor/wood/tile, /area/station/service/library/lounge) +"bCp" = ( +/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, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "bCq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6773,17 +6536,12 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron, /area/station/cargo/lobby) -"bCC" = ( -/obj/machinery/ai_slipper{ - uses = 10 +"bCG" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 }, -/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, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/turf/open/floor/iron, +/area/station/service/hydroponics) "bCT" = ( /obj/structure/railing/corner{ dir = 8 @@ -6854,7 +6612,6 @@ dir = 4 }, /obj/machinery/status_display/evac/directional/north, -/obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "bDU" = ( @@ -6878,6 +6635,15 @@ /obj/structure/cable, /turf/open/floor/iron/dark/side, /area/station/command/bridge) +"bEp" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners{ + dir = 1 + }, +/obj/structure/table, +/obj/item/storage/box/donkpockets, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "bEK" = ( /obj/structure/holosign/barrier, /turf/open/floor/iron/dark, @@ -6917,14 +6683,6 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, /area/station/science/auxlab) -"bFv" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "bFD" = ( /obj/structure/cable, /turf/open/floor/catwalk_floor, @@ -6951,14 +6709,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/prison/safe) -"bFZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/aft) "bGb" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -7008,43 +6758,24 @@ /obj/machinery/duct, /turf/open/floor/iron/dark, /area/station/security/lockers) -"bGv" = ( -/obj/machinery/door/airlock/hatch{ - name = "Shelter" - }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/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/effect/mapping_helpers/airlock/unres{ - dir = 1 +"bGt" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 8 }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/radshelter/sci) -"bGy" = ( -/obj/machinery/light/red/dim/directional/north, -/turf/open/openspace, -/area/station/maintenance/floor4/port/aft) -"bGP" = ( -/obj/machinery/vending/cigarette, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/wood, -/area/station/command/meeting_room) -"bHh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"bHr" = ( -/obj/structure/chair/sofa/corp/left{ +/turf/open/floor/iron/dark/side{ dir = 8 }, -/turf/open/floor/wood, -/area/station/command/meeting_room) +/area/station/ai_monitored/command/storage/eva) +"bGV" = ( +/obj/machinery/door/window/brigdoor{ + dir = 1 + }, +/mob/living/basic/pet/fox, +/turf/open/floor/noslip, +/area/station/maintenance/floor1/port) "bHw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -7055,17 +6786,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/construction, /turf/open/floor/iron/dark, /area/station/engineering/gravity_generator) -"bHL" = ( -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/machinery/airalarm/directional/east, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/structure/table/reinforced, -/turf/open/floor/iron/dark, -/area/station/command/gateway) "bHU" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, @@ -7094,14 +6814,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/solars/port/aft) -"bIs" = ( -/obj/machinery/light/directional/south, -/obj/machinery/light_switch/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/command/meeting_room) "bIx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -7121,12 +6833,11 @@ /turf/open/floor/iron/dark, /area/station/medical/virology) "bID" = ( -/obj/machinery/light/directional/west, -/obj/structure/chair/sofa/bench/left{ +/obj/effect/turf_decal/stripes{ dir = 4 }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) +/turf/open/floor/engine, +/area/station/science/cytology) "bIG" = ( /obj/effect/turf_decal/tile/green/half, /obj/machinery/newscaster/directional/north, @@ -7168,6 +6879,12 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/storage) +"bJj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/security/range) "bJm" = ( /obj/machinery/airalarm/directional/west, /obj/effect/turf_decal/tile/red{ @@ -7210,6 +6927,19 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/port/fore) +"bJU" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/atmospherics, +/obj/item/t_scanner, +/obj/item/storage/belt/utility, +/obj/machinery/requests_console/directional/west{ + department = "Atmospherics"; + name = "Atmospherics Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/mapping_helpers/requests_console/supplies, +/turf/open/floor/iron, +/area/station/engineering/atmos/office) "bJV" = ( /obj/structure/chair/comfy/black{ dir = 8 @@ -7245,13 +6975,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/neon/simple/pink/nodots, /area/station/maintenance/floor2/port/fore) -"bKs" = ( -/obj/machinery/smartfridge/organ, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "bKv" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/visible/layer4{ dir = 6 @@ -7259,6 +6982,13 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/on/layer2, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) +"bKz" = ( +/obj/item/restraints/handcuffs/cable/zipties/used, +/obj/structure/table/optable, +/obj/effect/landmark/blobstart, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white, +/area/station/maintenance/floor3/starboard/aft) "bKG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/sign/poster/contraband/random/directional/north, @@ -7299,6 +7029,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/smooth_large, /area/station/service/kitchen/abandoned) +"bLi" = ( +/obj/effect/turf_decal/siding/wideplating_new{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "bLm" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -7326,34 +7065,11 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/floor3/fore) -"bLF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) -"bLX" = ( -/obj/machinery/door/window/left/directional/north{ - name = "Hydroponics Garden"; - req_access = list("hydroponics") - }, -/obj/structure/flora/bush/sparsegrass/style_random, -/turf/open/floor/grass, -/area/station/service/hydroponics) "bMa" = ( /obj/structure/tank_dispenser/oxygen, /obj/effect/turf_decal/siding/thinplating_new, /turf/open/floor/catwalk_floor/iron_dark, /area/station/ai_monitored/command/storage/eva) -"bMb" = ( -/obj/machinery/door/airlock/science{ - name = "Genetics Office" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/science/genetics, -/turf/open/floor/iron, -/area/station/science/genetics) "bMd" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Bulkhead" @@ -7392,6 +7108,22 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/carpet/royalblack, /area/station/service/kitchen/diner) +"bMt" = ( +/obj/machinery/door/firedoor/border_only, +/obj/effect/turf_decal/siding/wood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor, +/turf/open/floor/wood/tile, +/area/station/service/library) +"bMu" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/computer/security/telescreen/rd{ + pixel_x = -30 + }, +/obj/machinery/pdapainter/research, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/rd) "bMz" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/girder, @@ -7433,16 +7165,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) -"bNc" = ( -/obj/structure/sign/poster/official/random/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/cold/no_nightlight/directional/north, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/floor2/aft) "bNg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7477,14 +7199,14 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron/smooth, /area/station/construction) -"bNw" = ( -/obj/machinery/light/directional/north, -/obj/item/folder/blue, -/obj/item/paper/monitorkey, -/obj/effect/spawner/random/bureaucracy/pen, -/obj/structure/table, -/turf/open/floor/iron/smooth, -/area/station/tcommsat/computer) +"bND" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "bNL" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -7513,6 +7235,7 @@ /obj/machinery/atmospherics/components/binary/pump{ name = "Atmospherics-Supermatter Connection" }, +/obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "bNU" = ( @@ -7594,14 +7317,6 @@ /obj/structure/grille, /turf/open/floor/iron/smooth, /area/station/hallway/floor2/fore) -"bPr" = ( -/obj/structure/mirror/directional/north, -/obj/machinery/camera/directional/west{ - c_tag = "Science - Equipment Closet" - }, -/obj/structure/sink/directional/south, -/turf/open/floor/iron/white, -/area/station/science/lower) "bPv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7620,6 +7335,17 @@ }, /turf/open/floor/grass, /area/station/service/hydroponics/garden/abandoned) +"bPK" = ( +/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/trimline/blue/filled/line{ + dir = 5 + }, +/obj/machinery/duct, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "bPO" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -7671,6 +7397,11 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"bQA" = ( +/obj/effect/turf_decal/trimline/red, +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/turf/open/floor/engine/n2o, +/area/station/engineering/atmos) "bQG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7720,17 +7451,13 @@ /obj/machinery/door/firedoor/border_only{ dir = 8 }, +/obj/machinery/atmospherics/components/tank/air, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/starboard/fore) "bRl" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/pod, /area/station/maintenance/floor4/starboard/aft) -"bRm" = ( -/obj/machinery/light/directional/north, -/obj/effect/spawner/random/vending/snackvend, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/aft) "bRq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -7749,11 +7476,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) -"bRH" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/iron/white, -/area/station/science/cytology) +"bRx" = ( +/obj/structure/frame/machine, +/obj/item/circuitboard/machine/telecomms/receiver, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "bRI" = ( /obj/effect/turf_decal/stripes{ dir = 4 @@ -7795,11 +7523,17 @@ "bRZ" = ( /turf/open/floor/iron/dark/textured_large, /area/station/engineering/atmos/pumproom) -"bSc" = ( -/obj/machinery/light/cold/no_nightlight/directional/north, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/research/abandoned) +"bSa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"bSb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/griddle, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen/abandoned) "bSd" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -7811,9 +7545,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/service/chapel/funeral) -"bSh" = ( -/turf/open/floor/grass, -/area/station/hallway/secondary/service) "bSi" = ( /obj/machinery/door/airlock/external{ name = "Labor Camp Shuttle Airlock"; @@ -7843,6 +7574,12 @@ dir = 8 }, /area/station/hallway/floor1/aft) +"bSE" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) "bSH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7852,6 +7589,20 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) +"bSJ" = ( +/obj/structure/rack, +/obj/item/storage/secure/safe/directional/east, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/effect/spawner/random/armory/bulletproof_armor, +/obj/effect/spawner/random/armory/bulletproof_helmet, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"bSR" = ( +/obj/structure/closet/crate/freezer, +/obj/effect/spawner/random/medical/memeorgans, +/obj/effect/spawner/random/medical/surgery_tool, +/turf/open/floor/iron/white, +/area/station/maintenance/floor3/starboard/aft) "bSV" = ( /obj/machinery/door/airlock/medical{ name = "Psychologist's Office" @@ -7886,16 +7637,6 @@ }, /turf/open/floor/iron/white/textured_large, /area/station/service/chapel) -"bTk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/east, -/obj/machinery/newscaster/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/side{ - dir = 8 - }, -/area/station/security/prison) "bTm" = ( /obj/effect/turf_decal/trimline/blue/filled/corner, /obj/effect/turf_decal/trimline/white/filled/corner{ @@ -7918,6 +7659,10 @@ "bTu" = ( /turf/open/floor/iron, /area/station/service/chapel) +"bTy" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "bTK" = ( /obj/machinery/door/window/brigdoor/right/directional/west{ name = "Judge's Stand"; @@ -8025,15 +7770,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"bUR" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/airalarm/directional/north, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron/smooth_large, -/area/station/maintenance/disposal) "bUW" = ( /obj/machinery/computer/records/security{ dir = 4 @@ -8076,11 +7812,10 @@ /obj/machinery/duct, /turf/open/floor/wood, /area/station/service/kitchen/diner) -"bVo" = ( -/mob/living/simple_animal/bot/floorbot, -/obj/structure/cable, +"bVu" = ( +/obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/hallway/floor3/fore) "bVy" = ( /turf/open/floor/iron/dark/side{ dir = 1 @@ -8137,15 +7872,21 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) +"bVZ" = ( +/obj/structure/table, +/obj/item/hfr_box/corner, +/obj/item/hfr_box/corner, +/obj/item/hfr_box/corner, +/obj/item/hfr_box/corner, +/obj/item/hfr_box/core, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "bWd" = ( /obj/machinery/shieldgen, /turf/open/floor/iron/textured_large, /area/station/engineering/lobby) -"bWl" = ( -/obj/machinery/computer/warrant, -/obj/machinery/status_display/ai/directional/north, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/aft) "bWn" = ( /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 4 @@ -8154,6 +7895,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard) +"bWu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/iron/half, +/area/station/engineering/atmos/hfr_room) "bWz" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/machinery/vending/cigarette, @@ -8171,6 +7918,17 @@ /obj/machinery/duct, /turf/open/floor/iron/dark/textured, /area/station/commons/fitness) +"bXd" = ( +/obj/effect/turf_decal/trimline/purple/line, +/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 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/iron/white, +/area/station/science/xenobiology/hallway) "bXe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -8218,12 +7976,25 @@ }, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat/hallway) +"bXB" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "bXD" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/layer4{ dir = 8 }, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) +"bYb" = ( +/obj/effect/turf_decal/tile/blue/full, +/obj/structure/table/glass, +/obj/item/storage/box/hug/medical, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/white/textured, +/area/station/medical/treatment_center) "bYg" = ( /obj/effect/turf_decal/trimline/blue, /obj/machinery/airalarm/directional/north, @@ -8240,13 +8011,11 @@ }, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/freezerchamber) -"bYn" = ( -/obj/structure/closet/crate/freezer/blood, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/light/cold/directional/west, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/surgery/fore) +"bYp" = ( +/obj/structure/rack, +/obj/effect/spawner/random/engineering/material, +/turf/open/floor/pod/light, +/area/station/maintenance/floor2/port/fore) "bYq" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -8263,6 +8032,13 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/medical/storage) +"bYJ" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Xenobio - Port Pens" + }, +/obj/structure/sign/poster/official/nanotrasen_logo/directional/south, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "bYP" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 4 @@ -8271,8 +8047,8 @@ /turf/open/floor/iron/dark, /area/station/hallway/floor3/aft) "bYX" = ( -/obj/structure/bed{ - dir = 4 +/obj/structure/bed/medical/anchored{ + dir = 8 }, /obj/item/bedsheet/medical{ dir = 4 @@ -8294,16 +8070,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"bZj" = ( -/obj/structure/table/wood, -/obj/item/newspaper{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/folder/red, -/obj/item/pen, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) "bZr" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/brown{ @@ -8371,10 +8137,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/command/teleporter) -"cas" = ( -/obj/structure/cable, +"can" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 8 + }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/white, -/area/station/science/lower) +/area/station/science/cytology) "cau" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/hidden/layer1{ dir = 10 @@ -8413,6 +8182,14 @@ dir = 4 }, /area/station/hallway/floor2/aft) +"caP" = ( +/obj/structure/rack, +/obj/effect/spawner/random/bureaucracy/briefcase{ + spawn_loot_count = 2; + spawn_loot_split = 1 + }, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "caQ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -8486,31 +8263,12 @@ dir = 8 }, /area/station/hallway/secondary/exit/departure_lounge) -"cbJ" = ( -/obj/effect/turf_decal/trimline/blue/corner{ - 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/dark/side{ - dir = 1 - }, -/area/station/command/teleporter) "cbM" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/decal/cleanable/cobweb, /obj/effect/turf_decal/trimline/yellow/warning, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/aft) -"cbN" = ( -/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/science/research/abandoned) "ccc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8587,9 +8345,30 @@ /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/dark/textured, /area/station/hallway/floor2/aft) +"cdd" = ( +/obj/effect/turf_decal/stripes{ + dir = 6 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/button/ignition{ + id = "Xenobio"; + pixel_x = 24; + pixel_y = 5 + }, +/obj/machinery/button/door/directional/east{ + id = "Xenolab"; + name = "Test Chamber Blast Doors"; + pixel_y = -5; + req_access = list("xenobiology") + }, +/obj/machinery/light/cold/no_nightlight/directional/east, +/obj/machinery/power/shieldwallgen/xenobiologyaccess, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "cdf" = ( /obj/structure/chair/office, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8609,6 +8388,12 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/floor3/starboard) +"cdm" = ( +/obj/machinery/light/cold/no_nightlight/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/hallway/floor2/aft) "cdo" = ( /obj/effect/turf_decal/arrows/red{ dir = 4; @@ -8705,16 +8490,6 @@ /mob/living/basic/rabbit, /turf/open/floor/grass, /area/station/hallway/secondary/entry) -"ceC" = ( -/obj/structure/table, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/reagentgrinder{ - pixel_x = 6; - pixel_y = 6 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "ceF" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -8733,6 +8508,10 @@ /obj/effect/spawner/random/trash/moisture_trap, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) +"ceL" = ( +/obj/machinery/vending/cola, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "cfa" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -8769,17 +8548,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor3/port/fore) -"cfs" = ( -/obj/effect/turf_decal/trimline/blue/line, -/obj/effect/turf_decal/trimline/blue/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/aft) "cfu" = ( /obj/structure/railing{ dir = 1 @@ -8855,16 +8623,6 @@ "cgi" = ( /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/fore) -"cgj" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/sign/departments/telecomms/alt/directional/south, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor1/aft) "cgm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -8916,6 +8674,12 @@ icon_state = "stairs-m" }, /area/station/science/lobby) +"cgR" = ( +/obj/structure/closet/secure_closet/hydroponics, +/obj/effect/turf_decal/tile/green/full, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/service/hydroponics) "cgT" = ( /obj/machinery/plumbing/sender, /obj/effect/turf_decal/tile/blue/half{ @@ -8937,6 +8701,14 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/warden) +"chd" = ( +/obj/structure/railing, +/obj/effect/turf_decal/trimline/purple/warning, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) "chk" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Bulkhead" @@ -8953,6 +8725,13 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port/fore) +"chn" = ( +/obj/machinery/airalarm/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/service/theater) "chs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8969,15 +8748,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/medical/pharmacy) -"chA" = ( -/obj/effect/turf_decal/trimline/blue/corner, -/obj/item/wrench, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server/upper) "chF" = ( /obj/machinery/holopad, /obj/effect/turf_decal/tile/red/opposingcorners{ @@ -8985,9 +8755,26 @@ }, /turf/open/floor/iron/dark, /area/station/security/office) +"chO" = ( +/obj/structure/table/wood, +/obj/item/folder/yellow{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/item/folder/blue, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/hop) "chP" = ( /turf/closed/wall/mineral/plastitanium, /area/station/maintenance/floor4/starboard/aft) +"chT" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Xenobio - Holding Pen" + }, +/turf/open/floor/engine{ + initial_gas_mix = "o2=22;bz=82;TEMP=293.15" + }, +/area/station/science/xenobiology) "chY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -9082,24 +8869,6 @@ /obj/structure/cable, /turf/open/floor/wood/large, /area/station/service/library/artgallery) -"ciP" = ( -/obj/structure/rack, -/obj/item/reagent_containers/cup/bottle/ethanol{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/carbon{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/chlorine{ - pixel_x = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark/textured_edge{ - dir = 8 - }, -/area/station/medical/chemistry) "ciQ" = ( /obj/structure/reagent_dispensers/wall/peppertank/directional/east, /obj/structure/table/reinforced, @@ -9117,17 +8886,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/security/prison/safe) -"ciV" = ( -/obj/effect/turf_decal/siding/wood{ +"ciU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light/warm/directional/south, -/obj/effect/landmark/start/psychologist, -/obj/structure/chair/sofa/right/brown{ - dir = 1 - }, -/turf/open/floor/carpet, -/area/station/medical/psychology) +/turf/open/floor/wood/parquet, +/area/station/service/lawoffice) "ciW" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -9184,14 +8949,12 @@ }, /turf/open/floor/catwalk_floor/iron, /area/station/engineering/atmos) -"cjF" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/smooth_large, -/area/station/tcommsat/server) +"cjK" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/kirbyplants/organic/plant21, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/wood/parquet, +/area/station/service/lawoffice) "cjM" = ( /obj/effect/turf_decal/tile/blue/half{ dir = 1 @@ -9233,6 +8996,18 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/project) +"ckt" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/closet/bombcloset/security, +/obj/machinery/status_display/door_timer{ + id = "cell-1"; + name = "Floor 1 Cell"; + pixel_x = 32 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "ckv" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -9243,10 +9018,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) -"ckP" = ( -/obj/machinery/smartfridge/extract/preloaded, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "ckQ" = ( /obj/item/kirbyplants/random, /turf/open/floor/wood/parquet, @@ -9306,6 +9077,11 @@ /obj/structure/cable, /turf/open/floor/iron/smooth_large, /area/station/maintenance/disposal) +"cly" = ( +/obj/machinery/atmospherics/pipe/multiz/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/multiz/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor2/fore) "clF" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -9334,8 +9110,8 @@ /turf/open/floor/iron/kitchen, /area/station/service/kitchen/abandoned) "clP" = ( -/obj/machinery/airalarm/directional/north, /obj/machinery/chem_master, +/obj/machinery/digital_clock/directional/north, /turf/open/floor/iron/textured_large, /area/station/medical/chemistry) "clT" = ( @@ -9424,11 +9200,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/security/courtroom) -"cmP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/half, -/area/station/engineering/atmos/hfr_room) "cmT" = ( /obj/effect/turf_decal/siding/wood{ dir = 9 @@ -9458,15 +9229,6 @@ /obj/effect/spawner/random/entertainment/arcade, /turf/open/floor/iron/dark, /area/station/commons/locker) -"cnm" = ( -/obj/structure/flora/bush/flowers_br/style_random, -/turf/open/floor/grass, -/area/station/medical/medbay/lobby) -"cnn" = ( -/obj/machinery/airalarm/directional/south, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) "cnq" = ( /obj/structure/railing{ dir = 1 @@ -9492,25 +9254,10 @@ /obj/structure/sign/poster/official/cleanliness/directional/east, /turf/open/floor/iron/dark/textured, /area/station/medical/surgery/fore) -"cnA" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/obj/machinery/newscaster/directional/west, -/obj/structure/frame/machine, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "cnI" = ( /obj/effect/spawner/structure/window/hollow/reinforced/directional, /turf/open/floor/plating, /area/station/maintenance/floor1/starboard) -"cnK" = ( -/obj/effect/turf_decal/tile/blue/opposingcorners, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/hallway/floor2/aft) "cnL" = ( /obj/effect/turf_decal/trimline/purple/warning{ dir = 8 @@ -9550,20 +9297,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/command/heads_quarters/ce) -"coU" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/turf_decal/siding/thinplating_new, -/obj/structure/water_source/puddle{ - pixel_y = 3 - }, -/obj/effect/landmark/start/hangover, -/turf/open/misc/beach/sand, -/area/station/hallway/secondary/entry) "coZ" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/machinery/defibrillator_mount/directional/south, -/obj/structure/bed{ - dir = 4 +/obj/structure/bed/medical{ + dir = 8 }, /turf/open/floor/iron/white/textured, /area/station/medical/treatment_center) @@ -9692,16 +9430,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/smooth_edge, /area/station/science/robotics/mechbay) -"cqT" = ( -/obj/effect/turf_decal/siding/purple, -/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, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "cqV" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/delivery, @@ -9715,6 +9443,17 @@ /obj/structure/sign/poster/official/random/directional/east, /turf/open/floor/iron/dark, /area/station/commons/locker) +"cqY" = ( +/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/yellow/line, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/aft) "crd" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/corner{ dir = 1 @@ -9725,13 +9464,6 @@ /obj/structure/window/reinforced/tinted/fulltile, /turf/open/floor/plating, /area/station/maintenance/floor1/starboard) -"crl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light/red/dim/directional/north, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/starboard) "crn" = ( /obj/structure/table/reinforced, /turf/open/floor/iron/dark, @@ -9746,14 +9478,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/office) -"cru" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/structure/closet/radiation, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/hfr_room) "crK" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, @@ -9818,6 +9542,17 @@ "css" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmos/project) +"csw" = ( +/obj/structure/chair{ + name = "Judge" + }, +/obj/machinery/camera/directional/north{ + c_tag = "Courtroom" + }, +/obj/effect/landmark/start/hangover, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) "csz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -9872,8 +9607,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/item/radio/intercom/directional/south, -/obj/structure/railing/corner{ - dir = 1 +/obj/structure/railing/corner/end{ + dir = 8 }, /turf/open/floor/iron, /area/station/cargo/miningdock) @@ -9898,6 +9633,11 @@ /obj/effect/spawner/random/engineering/tank, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard/fore) +"ctv" = ( +/obj/machinery/computer/warrant, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/aft) "ctI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -9935,12 +9675,6 @@ dir = 8 }, /area/station/command/teleporter) -"cue" = ( -/obj/machinery/light/warm/directional/south, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/turf/open/floor/carpet/orange, -/area/station/service/chapel/funeral) "cuf" = ( /obj/structure/sign/poster/contraband/eat/directional/east, /turf/open/floor/pod/light, @@ -9956,6 +9690,18 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/carpet, /area/station/cargo/miningdock) +"cuk" = ( +/obj/effect/turf_decal/tile/red/full, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Atmospherics Cam #2"; + network = list("ss13","engine") + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/textured_large, +/area/station/engineering/atmos) "cun" = ( /obj/machinery/camera/motion/directional/east{ c_tag = "MiniSat - Fore"; @@ -9964,11 +9710,6 @@ /obj/structure/lattice/catwalk, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) -"cup" = ( -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/machinery/light/directional/east, -/turf/open/floor/grass, -/area/station/hallway/secondary/entry) "cus" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/light, @@ -9996,6 +9737,10 @@ }, /turf/open/floor/iron/white, /area/station/medical/office) +"cuK" = ( +/obj/machinery/photocopier, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hop) "cuL" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -10014,6 +9759,29 @@ /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, /area/station/hallway/secondary/entry) +"cuT" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) +"cuX" = ( +/obj/effect/turf_decal/trimline/green/line, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/public/glass{ + name = "Public Airlock" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor3/aft) "cvf" = ( /obj/effect/spawner/structure/window/hollow/middle, /turf/open/floor/plating, @@ -10084,6 +9852,21 @@ /obj/structure/ladder, /turf/open/floor/plating/airless, /area/space/nearstation) +"cvE" = ( +/obj/effect/decal/cleanable/dirt, +/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, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/service) +"cvK" = ( +/obj/structure/water_source/puddle, +/turf/open/floor/grass, +/area/station/science/cytology) "cvM" = ( /obj/machinery/door/airlock/public/glass{ name = "Garden" @@ -10099,15 +9882,6 @@ dir = 8 }, /area/station/service/hydroponics/garden) -"cvR" = ( -/obj/item/radio/intercom/directional/east, -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/pump, -/obj/structure/railing, -/turf/open/floor/iron/dark/textured_large, -/area/station/hallway/floor1/aft) "cvW" = ( /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/machinery/door/airlock/hatch{ @@ -10124,16 +9898,15 @@ }, /turf/open/floor/wood/tile, /area/station/service/library/printer) -"cwb" = ( -/obj/effect/turf_decal/trimline/green/filled/corner{ - dir = 4 - }, -/obj/machinery/shower/directional/north, -/obj/effect/turf_decal/trimline/green/end{ - dir = 1 - }, -/turf/open/floor/iron/dark/textured, -/area/station/medical/virology/isolation) +"cvZ" = ( +/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/cyborg, +/obj/structure/cable/layer3, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat) "cwl" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/fakebasalt, @@ -10166,6 +9939,20 @@ }, /turf/open/floor/iron/dark, /area/station/security/courtroom) +"cwF" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/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/structure/cable, +/obj/effect/landmark/navigate_destination/library, +/obj/machinery/light/floor, +/turf/open/floor/wood/tile, +/area/station/service/library) "cwG" = ( /obj/machinery/door/airlock{ id_tag = "nsminingdorm2"; @@ -10206,19 +9993,6 @@ dir = 1 }, /area/station/hallway/secondary/entry) -"cxC" = ( -/obj/machinery/door/airlock/science{ - name = "Abandoned Science Lab" - }, -/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, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/access/all/science/general, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "cxH" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/machinery/door/airlock/hatch{ @@ -10246,15 +10020,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/floor1/port/aft) -"cxP" = ( -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 4 - }, -/obj/machinery/light/cold/directional/west, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/station/ai_monitored/turret_protected/ai) "cxQ" = ( /obj/structure/table_frame, /obj/effect/spawner/random/maintenance, @@ -10278,17 +10043,6 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/starboard/aft) -"cxY" = ( -/obj/structure/chair/comfy/brown{ - dir = 4 - }, -/obj/item/toy/plush/moth{ - color = "#8e2e87"; - desc = "A strange moth plushie named Edict, it's dyed purple."; - name = "Edict" - }, -/turf/open/floor/wood, -/area/station/medical/psychology) "cyb" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -10314,14 +10068,6 @@ }, /turf/open/floor/iron, /area/station/hallway/floor1/aft) -"cyz" = ( -/obj/structure/sink/greyscale{ - dir = 8; - pixel_x = 12; - pixel_y = -5 - }, -/turf/open/floor/iron/kitchen, -/area/station/command/heads_quarters/rd) "cyF" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, @@ -10361,19 +10107,27 @@ /obj/structure/closet/firecloset/full, /turf/open/floor/iron/dark/textured_large, /area/station/hallway/secondary/exit/escape_pod) -"czK" = ( -/obj/machinery/hydroponics/constructable, -/turf/open/floor/iron/white, -/area/station/cargo/miningdock) +"czu" = ( +/obj/structure/rack, +/obj/item/toner/large, +/obj/item/toner/large, +/obj/item/toner/large, +/obj/item/toner/large, +/obj/item/toner/large, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/bamboo/tatami/black, +/area/station/commons/storage/art) "czP" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/service/bar) -"czW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/smooth_half, -/area/station/maintenance/radshelter/sci) +"czZ" = ( +/obj/machinery/door/window/left/directional/north{ + name = "Pen 1"; + req_access = list("xenobiology") + }, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "cAf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, /obj/item/radio/intercom/directional/east, @@ -10389,6 +10143,21 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) +"cAO" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/item/radio/intercom/directional/west, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/hop) +"cAU" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/service/theater) "cBb" = ( /obj/effect/spawner/random/structure/chair_maintenance{ dir = 8 @@ -10458,36 +10227,26 @@ }, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/freezerchamber) -"cBQ" = ( -/obj/machinery/light/directional/south, -/obj/structure/disposalpipe/segment{ +"cBT" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 4 }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor3/aft) -"cBT" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 8 +/obj/effect/turf_decal/arrows{ + dir = 4 }, -/obj/machinery/firealarm/directional/east, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/starboard/fore) +/obj/structure/railing{ + layer = 3.1 + }, +/obj/effect/decal/cleanable/robot_debris, +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/start/bitrunner, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "cBU" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/flora/bush/sunny/style_random, /turf/open/floor/grass, /area/station/security/courtroom) -"cCb" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "cCc" = ( /obj/structure/railing{ dir = 1 @@ -10496,6 +10255,18 @@ dir = 1 }, /area/station/hallway/floor2/aft) +"cCd" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/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/side{ + dir = 4 + }, +/area/station/hallway/secondary/entry) "cCf" = ( /obj/effect/turf_decal/trimline/brown/warning{ dir = 6 @@ -10532,6 +10303,13 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) +"cCK" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/light_switch/directional/west, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/service) "cCO" = ( /obj/structure/railing{ dir = 8 @@ -10544,16 +10322,6 @@ dir = 4 }, /area/station/maintenance/solars/starboard/fore) -"cCR" = ( -/obj/effect/turf_decal/trimline/red/warning{ - dir = 6 - }, -/obj/structure/railing{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/pod/dark, -/area/station/hallway/secondary/entry) "cCS" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 8 @@ -10564,18 +10332,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/service/hydroponics) -"cCT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/turretid{ - icon_state = "control_stun"; - name = "AI Chamber turret control"; - pixel_x = 3; - pixel_y = -23 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "cCV" = ( /obj/machinery/light/red/dim/directional/north, /turf/open/floor/pod/light, @@ -10595,35 +10351,20 @@ /turf/open/floor/iron/dark/textured, /area/station/medical/pharmacy) "cDe" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 +/obj/machinery/computer/quantum_console{ + dir = 4 }, -/turf/open/floor/plating, -/area/station/maintenance/floor1/starboard/fore) +/turf/open/floor/iron/dark/smooth_corner, +/area/station/bitrunning/den) +"cDh" = ( +/obj/item/broken_bottle, +/turf/open/floor/carpet/neon/simple/pink/nodots, +/area/station/maintenance/floor2/port/fore) "cDj" = ( /obj/effect/turf_decal/delivery, /obj/structure/sign/departments/cargo/directional/north, /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) -"cDo" = ( -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 8 - }, -/obj/machinery/keycard_auth/directional/east{ - pixel_y = 20 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Command - Research Director's Office" - }, -/obj/machinery/requests_console/directional/east{ - department = "Research Director's Desk"; - name = "Research Director's Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) "cDq" = ( /obj/effect/turf_decal/trimline/green/warning{ dir = 10 @@ -10634,11 +10375,6 @@ /obj/effect/spawner/random/structure/tank_holder, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard) -"cDt" = ( -/obj/machinery/light/cold/no_nightlight/directional/east, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor2/fore) "cDu" = ( /obj/structure/chair/comfy/brown, /obj/effect/turf_decal/tile/bar/opposingcorners, @@ -10661,13 +10397,6 @@ dir = 4 }, /area/station/service/hydroponics/garden) -"cEl" = ( -/obj/machinery/door/window/left/directional/south{ - name = "Pen 4"; - req_access = list("xenobiology") - }, -/turf/open/floor/grass, -/area/station/science/xenobiology) "cEt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -10716,6 +10445,10 @@ dir = 1 }, /area/station/engineering/lobby) +"cFg" = ( +/obj/machinery/chem_master, +/turf/open/floor/circuit, +/area/station/science/xenobiology) "cFq" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/reagent_dispensers/fueltank, @@ -10728,19 +10461,21 @@ /obj/effect/turf_decal/trimline/brown/corner, /turf/open/floor/engine/hull, /area/space/nearstation) -"cFC" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/item/storage/pill_bottle/mutadone{ - pixel_x = -9 - }, -/obj/item/toy/figure/geneticist, -/obj/machinery/camera/directional/east{ - c_tag = "Genetics Desk" - }, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/iron, -/area/station/science/genetics) +"cFB" = ( +/obj/machinery/camera/autoname/directional/south, +/obj/item/kirbyplants/random, +/obj/structure/sign/poster/official/random/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) +"cFF" = ( +/obj/effect/turf_decal/tile/red/diagonal_edge, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/textured_large, +/area/station/security/checkpoint/escape) "cFK" = ( /obj/structure/table/wood/poker, /obj/effect/spawner/random/entertainment/dice, @@ -10762,17 +10497,6 @@ "cFQ" = ( /turf/closed/wall, /area/station/science/auxlab/firing_range) -"cFY" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/supply/visible/layer4{ - dir = 4 - }, -/obj/effect/landmark/navigate_destination/incinerator, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "cGh" = ( /obj/effect/spawner/random/structure/grille, /turf/open/floor/pod/light, @@ -10801,29 +10525,14 @@ }, /turf/open/floor/iron/white, /area/station/science/lab) -"cGF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash/grime, -/obj/effect/spawner/random/trash/graffiti, -/obj/machinery/light/directional/north, -/turf/open/floor/pod/light, -/area/station/maintenance/floor2/port/aft) "cGI" = ( /obj/structure/table, /obj/item/paper_bin/construction, -/obj/item/pen/fountain{ - pixel_x = -3; - pixel_y = -3 - }, /obj/item/pen/fountain, -/obj/item/pen/fountain{ - pixel_x = 3; - pixel_y = 3 - }, /turf/open/floor/carpet/blue, /area/station/command/heads_quarters/hop) "cGQ" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 4 }, /turf/open/floor/iron/dark, @@ -10858,6 +10567,17 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"cHd" = ( +/obj/effect/turf_decal/siding/white, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/science/cytology) "cHf" = ( /obj/structure/sign/poster/official/random/directional/south, /obj/effect/turf_decal/siding/wood{ @@ -10874,6 +10594,13 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plating, /area/station/hallway/floor2/aft) +"cHm" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/floor3/fore) "cHr" = ( /obj/machinery/atmospherics/pipe/multiz/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/multiz/scrubbers/hidden/layer2, @@ -10922,18 +10649,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/hallway) -"cIf" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) -"cIi" = ( -/obj/structure/bed, -/obj/item/bedsheet/random, -/obj/machinery/light/directional/east, -/turf/open/floor/wood, -/area/station/medical/psychology) "cIl" = ( /obj/machinery/vending/hydronutrients, /obj/effect/turf_decal/siding/green{ @@ -10963,12 +10678,6 @@ /obj/structure/chair/stool/bar/directional/east, /turf/open/floor/wood, /area/station/service/bar/atrium) -"cIy" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/hallway/floor1/fore) "cIE" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -11024,15 +10733,6 @@ }, /turf/open/floor/iron, /area/station/engineering/gravity_generator) -"cJf" = ( -/obj/effect/turf_decal/bot, -/obj/structure/rack, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/item/gun/energy/laser, -/obj/item/gun/energy/laser, -/obj/item/gun/energy/laser, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "cJh" = ( /obj/machinery/light/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -11085,6 +10785,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/floor2/aft) +"cJR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/roboticist, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/science/robotics/lab) "cJY" = ( /obj/structure/railing{ dir = 4 @@ -11132,6 +10839,16 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) +"cKC" = ( +/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/yellow/line, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/aft) "cKE" = ( /obj/effect/turf_decal/trimline/purple/line{ dir = 1 @@ -11145,20 +10862,26 @@ }, /turf/open/floor/iron/white, /area/station/science/lobby) -"cKO" = ( -/obj/effect/turf_decal/trimline/red/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/red/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/holopad, -/obj/structure/disposalpipe/segment{ +"cKH" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/floor3/aft) +"cKJ" = ( +/obj/structure/chair{ dir = 4 }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/checker, +/area/station/commons/vacant_room/commissary) +"cKM" = ( +/obj/structure/railing/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/trimline/purple/warning, /turf/open/floor/iron/dark, -/area/station/hallway/floor4/fore) +/area/station/hallway/floor2/fore) "cKS" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -11187,6 +10910,10 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) +"cLA" = ( +/obj/structure/railing, +/turf/open/floor/grass, +/area/station/science/cytology) "cLC" = ( /obj/structure/table, /obj/machinery/newscaster/directional/north, @@ -11198,6 +10925,16 @@ /obj/effect/decal/remains/human, /turf/open/floor/pod/dark, /area/station/service/kitchen/abandoned) +"cLI" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/white, +/area/station/science/cytology) "cLQ" = ( /obj/machinery/door/airlock{ name = "Locker Room" @@ -11238,10 +10975,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port) -"cMm" = ( -/obj/structure/table/reinforced, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/maintenance/radshelter/sci) +"cMi" = ( +/obj/effect/turf_decal/trimline/white/arrow_cw{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/white/mid_joiner{ + dir = 8 + }, +/turf/open/floor/iron/smooth_large, +/area/station/hallway/secondary/entry) "cMA" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -11277,6 +11022,13 @@ /obj/item/stack/tile/pod/light, /turf/open/floor/plating, /area/station/maintenance/floor2/starboard/fore) +"cNl" = ( +/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, +/turf/open/floor/iron, +/area/station/hallway/floor1/aft) "cNx" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/cable, @@ -11301,14 +11053,6 @@ }, /turf/open/floor/mineral/silver, /area/station/service/chapel/funeral) -"cNP" = ( -/obj/machinery/nuclearbomb/selfdestruct, -/obj/machinery/camera/motion/directional/south{ - c_tag = "Vault"; - network = list("vault") - }, -/turf/open/floor/circuit, -/area/station/ai_monitored/command/nuke_storage) "cNQ" = ( /obj/structure/extinguisher_cabinet/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -11329,6 +11073,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"cNZ" = ( +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/machinery/disposal/delivery_chute{ + dir = 8; + name = "Space Chute" + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/sign/warning/vacuum/external/directional/south{ + name = "WARNING: CHUTE LEADS DIRECTLY TO SPACE" + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "cOt" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -11336,15 +11097,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood/tile, /area/station/service/library) +"cOx" = ( +/turf/open/floor/iron/dark/side{ + dir = 5 + }, +/area/station/security/prison/garden) "cOz" = ( /obj/machinery/vending/wardrobe/chap_wardrobe, /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/white/textured_large, /area/station/service/chapel/office) -"cOC" = ( -/obj/effect/spawner/random/vending/snackvend, -/turf/open/floor/iron/dark, -/area/station/hallway/floor3/fore) "cOD" = ( /obj/machinery/atmospherics/components/binary/pump/layer2, /turf/open/floor/plating, @@ -11354,17 +11116,6 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/air_input, /turf/open/floor/engine/air, /area/station/engineering/atmos) -"cOG" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/obj/machinery/status_display/ai/directional/south, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor1/aft) "cOI" = ( /obj/effect/turf_decal/trimline/yellow/line{ dir = 4 @@ -11383,18 +11134,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/neon/simple/pink/nodots, /area/station/maintenance/floor2/port/fore) -"cOX" = ( -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 8 - }, -/obj/machinery/modular_computer/console/preset/engineering{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/airalarm/directional/east, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/dark/textured_large, -/area/station/engineering/lobby) +"cOS" = ( +/mob/living/simple_animal/bot/cleanbot, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) "cPg" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/machinery/atmospherics/components/binary/pump/on{ @@ -11408,11 +11152,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"cPj" = ( -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/turf/open/floor/grass, -/area/station/hallway/floor1/aft) "cPQ" = ( /obj/structure/railing{ dir = 5 @@ -11426,6 +11165,32 @@ planetary_atmos = 0 }, /area/station/maintenance/floor1/port/aft) +"cPR" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/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_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 + }, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/engineering/atmos) "cQa" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 1 @@ -11436,12 +11201,6 @@ }, /turf/open/floor/iron, /area/station/hallway/floor3/aft) -"cQg" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/science/cytology) "cQj" = ( /obj/effect/spawner/random/structure/chair_maintenance{ dir = 8 @@ -11455,6 +11214,13 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) +"cQo" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/wood/tile, +/area/station/science/xenobiology/hallway) "cQr" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11551,10 +11317,6 @@ /obj/machinery/recharge_station, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat/service) -"cRw" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall, -/area/station/security/prison/garden) "cRA" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, @@ -11582,6 +11344,15 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel/funeral) +"cRU" = ( +/obj/machinery/sparker/directional/north{ + id = "Xenobio" + }, +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/science/cytology) "cRY" = ( /obj/machinery/door/airlock/public/glass/incinerator/atmos_interior, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer2{ @@ -11627,42 +11398,16 @@ /obj/structure/cable, /turf/open/floor/circuit/green, /area/station/science/robotics/mechbay) -"cSf" = ( -/obj/machinery/seed_extractor, -/obj/effect/turf_decal/tile/green/full, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics) "cSk" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/maintenance/two, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard) -"cSq" = ( -/obj/item/storage/box/teargas{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/handcuffs, -/obj/item/storage/box/flashbangs{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "cSu" = ( /obj/machinery/light/directional/north, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/service/chapel) -"cSw" = ( -/obj/effect/turf_decal/siding/white/corner, -/obj/structure/chair/stool/bar/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/large, -/area/station/command/heads_quarters/rd) "cSF" = ( /obj/effect/turf_decal/siding/wood{ dir = 9 @@ -11723,21 +11468,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) -"cTp" = ( -/obj/machinery/computer/atmos_control/nocontrol/master{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 1 - }, -/obj/machinery/requests_console/directional/west{ - department = "Atmospherics"; - name = "Atmospherics Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/office) "cTw" = ( /obj/structure/table/reinforced, /obj/machinery/airalarm/directional/south, @@ -11761,6 +11491,7 @@ }, /obj/machinery/airalarm/directional/west, /obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, /turf/open/floor/pod/light, /area/station/maintenance/floor2/starboard) "cTV" = ( @@ -11846,15 +11577,6 @@ /obj/structure/sign/poster/contraband/random/directional/north, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard) -"cUZ" = ( -/obj/machinery/computer/operating{ - dir = 1 - }, -/obj/machinery/light/cold/directional/west, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/robotics/lab) "cVb" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -11863,22 +11585,17 @@ /obj/effect/decal/cleanable/blood/splatter, /turf/open/floor/engine, /area/station/maintenance/floor4/starboard/aft) -"cVm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) +"cVl" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/turf/open/floor/carpet/orange, +/area/station/service/chapel/funeral) "cVo" = ( /obj/machinery/door/airlock/command{ name = "Fuel Storage" }, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) -"cVp" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/camera/autoname/directional/east, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron/chapel, -/area/station/service/chapel) "cVz" = ( /obj/machinery/door/airlock/security{ name = "Gulag" @@ -11901,6 +11618,11 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/external, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/port) +"cVK" = ( +/obj/machinery/vending/cigarette, +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/iron/checker, +/area/station/service/bar/atrium) "cVL" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -11910,6 +11632,10 @@ dir = 1 }, /area/station/commons/locker) +"cVR" = ( +/obj/machinery/light/small/directional/west, +/turf/open/openspace, +/area/station/service/chapel) "cVT" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -11924,6 +11650,7 @@ /obj/effect/mapping_helpers/airlock/unres{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/aft) "cVX" = ( @@ -12015,15 +11742,17 @@ }, /turf/open/floor/plating, /area/station/medical/abandoned) -"cWQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white/side{ +"cWO" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/effect/turf_decal/trimline/white/line{ dir = 4 }, -/area/station/hallway/floor2/fore) +/obj/effect/turf_decal/trimline/white/line{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark/telecomms, +/area/station/tcommsat/server) "cWR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12070,6 +11799,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/port) +"cXq" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/poster/official/random/directional/south, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor2/fore) "cXr" = ( /obj/effect/turf_decal/tile/red/diagonal_edge, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -12084,14 +11821,6 @@ /obj/structure/closet/firecloset/full, /turf/open/floor/iron, /area/station/hallway/floor1/aft) -"cXA" = ( -/obj/structure/bed{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/structure/sign/poster/official/random/directional/east, -/turf/open/floor/iron/white/textured, -/area/station/medical/office) "cXC" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/effect/turf_decal/bot, @@ -12113,6 +11842,30 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) +"cXJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/toy/plush/lizard_plushie/green{ + desc = "A stuffed toy which resembles a wayward Ashlander. This one fills you with hope for the future."; + name = "Bites-The-Wires" + }, +/obj/effect/turf_decal/trimline/green/line{ + dir = 10 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor2/port/fore) +"cXK" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/green/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/hallway/floor3/fore) "cXP" = ( /obj/machinery/telecomms/bus/preset_three, /turf/open/floor/circuit/telecomms, @@ -12132,6 +11885,13 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard) +"cYu" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/computer/security/telescreen/entertainment/directional/south, +/turf/open/floor/wood, +/area/station/commons/dorms/apartment2) "cYx" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/rack, @@ -12152,19 +11912,6 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/iron/dark, /area/station/engineering/atmos/pumproom) -"cYN" = ( -/obj/effect/turf_decal/trimline/green/line, -/obj/effect/turf_decal/trimline/green/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/public/glass{ - name = "Public Airlock" - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor3/aft) "cYP" = ( /obj/structure/closet/wardrobe/black, /obj/effect/spawner/random/contraband/permabrig_weapon, @@ -12194,27 +11941,19 @@ dir = 9 }, /area/station/security/prison) -"cYY" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/airalarm/directional/east, -/obj/machinery/holopad, -/turf/open/floor/iron/white, -/area/station/science/cytology) +"cYZ" = ( +/obj/structure/chair/sofa/bench{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) "cZe" = ( /obj/effect/turf_decal/tile/green/half, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/side, /area/station/hallway/secondary/exit/escape_pod) -"cZk" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/obj/structure/disposalpipe/trunk/multiz, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron/white, -/area/station/science/lobby) "cZm" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/effect/mapping_helpers/airlock/access/any/medical/general, @@ -12243,23 +11982,44 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/white, /area/station/security/prison/safe) +"cZB" = ( +/obj/structure/sign/painting/library{ + pixel_x = -32 + }, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/large, +/area/station/service/library/artgallery) "cZG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) +"cZI" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/firealarm/directional/west, +/obj/structure/sink/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "cZK" = ( /obj/structure/chair/sofa/bench/left{ dir = 1 }, /turf/open/floor/iron, /area/station/security/prison) -"cZW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/floor1/port/fore) +"cZS" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "daa" = ( /obj/machinery/camera/motion/directional/north{ c_tag = "Minisat North" @@ -12286,11 +12046,11 @@ "dad" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /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/hatch{ name = "Emergency Power" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/dark, /area/station/maintenance/floor4/port/fore) "daf" = ( @@ -12304,6 +12064,15 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics/garden) +"daz" = ( +/obj/machinery/light/directional/north, +/mob/living/basic/pet/penguin/baby/permanent{ + dir = 8 + }, +/turf/open/misc/snow/actually_safe{ + icon_state = "snow6" + }, +/area/station/hallway/floor2/fore) "daD" = ( /obj/effect/turf_decal/tile/red/half/contrasted, /obj/structure/disposalpipe/segment, @@ -12338,22 +12107,6 @@ /obj/item/stack/rods/fifty, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"dbv" = ( -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 8 - }, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/station/ai_monitored/turret_protected/ai) -"dbx" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine/air, -/area/station/engineering/atmos/pumproom) "dby" = ( /turf/open/floor/iron/dark/side{ dir = 4 @@ -12491,11 +12244,6 @@ }, /turf/open/floor/iron, /area/station/hallway/floor3/aft) -"ddB" = ( -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/hallway/secondary/entry) "ddH" = ( /obj/effect/turf_decal/tile/neutral/full, /obj/machinery/portable_atmospherics/scrubber, @@ -12513,6 +12261,19 @@ initial_gas_mix = "TEMP=2.7" }, /area/station/science/ordnance/bomb) +"ddO" = ( +/obj/effect/turf_decal/siding/wideplating_new/corner, +/obj/effect/turf_decal/siding/wideplating_new/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/corner{ + dir = 8 + }, +/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/white, +/area/station/science/cytology) "ddT" = ( /obj/structure/closet/radiation, /obj/effect/turf_decal/siding/thinplating_new/dark, @@ -12582,12 +12343,6 @@ /obj/machinery/duct, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/cmo) -"dfd" = ( -/obj/effect/turf_decal/trimline/blue/line, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server/upper) "dff" = ( /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark/side{ @@ -12607,6 +12362,19 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/starboard/fore) +"dfm" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/line, +/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/dark, +/area/station/hallway/floor4/fore) "dfn" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -12662,15 +12430,6 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/dark, /area/station/medical/virology) -"dfY" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "dgb" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -12724,23 +12483,6 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/commons/dorms/apartment2) -"dgB" = ( -/obj/item/radio/intercom/directional/south{ - frequency = 1423; - name = "Interrogation Intercom" - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/security/interrogation) "dgJ" = ( /obj/structure/railing, /obj/structure/cable, @@ -12748,11 +12490,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) -"dgQ" = ( -/obj/machinery/door/airlock/highsecurity, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/starboard) "dgU" = ( /obj/structure/cable, /obj/machinery/light/red/dim/directional/north, @@ -12760,14 +12497,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) -"dgV" = ( -/obj/machinery/light/directional/east, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron, -/area/station/commons/locker) "dgZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -12775,6 +12504,17 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/abandoned) +"dhb" = ( +/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, +/obj/machinery/door/airlock/public/glass{ + name = "Petting Zoo" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white, +/area/station/science/cytology) "dhs" = ( /obj/structure/table/wood/fancy/royalblack, /obj/item/modular_computer/laptop/preset/civilian, @@ -12787,13 +12527,6 @@ }, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) -"dhF" = ( -/obj/structure/girder/reinforced, -/obj/effect/spawner/structure/window/hollow/reinforced/middle, -/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/floor2/starboard) "dhJ" = ( /obj/effect/turf_decal/trimline/purple/line, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -12826,6 +12559,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/starboard/aft) +"dim" = ( +/obj/structure/chair/stool/bar/directional/east, +/obj/machinery/light/cold/no_nightlight/directional/west, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/science/auxlab) "din" = ( /obj/structure/cable, /obj/structure/sign/poster/official/random/directional/south, @@ -12851,6 +12592,12 @@ }, /turf/open/floor/plating, /area/station/medical/abandoned) +"diW" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor2/port/aft) "djc" = ( /obj/structure/railing{ dir = 4 @@ -12908,6 +12655,17 @@ /obj/effect/turf_decal/trimline/green/warning, /turf/open/floor/pod, /area/station/maintenance/floor3/starboard) +"djH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/science/genetics, +/obj/structure/cable, +/obj/machinery/door/airlock/science{ + name = "Genetics" + }, +/turf/open/floor/iron, +/area/station/science/genetics) "djJ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, @@ -12927,6 +12685,10 @@ /obj/machinery/holopad, /turf/open/floor/circuit/green, /area/station/science/server) +"dkf" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/cargo/storage) "dkh" = ( /obj/machinery/camera/motion/directional/south{ name = "Minisat - Starboard"; @@ -12962,6 +12724,15 @@ }, /turf/open/floor/iron/dark, /area/station/security/execution/education) +"dkQ" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 8 + }, +/obj/structure/filingcabinet/chestdrawer, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/rd) "dla" = ( /obj/effect/spawner/random/structure/girder, /turf/open/floor/plating, @@ -12975,7 +12746,6 @@ /turf/open/floor/iron, /area/station/engineering/storage/tcomms) "dlt" = ( -/obj/machinery/airalarm/directional/south, /turf/open/floor/wood, /area/station/command/heads_quarters/hos) "dly" = ( @@ -12983,13 +12753,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/prison/safe) -"dlI" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hos) "dlW" = ( /turf/closed/wall, /area/station/maintenance/floor4/starboard/aft) @@ -13016,6 +12779,13 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) +"dmQ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "dmR" = ( /obj/structure/railing{ dir = 4 @@ -13044,7 +12814,7 @@ /turf/open/floor/iron/dark/side, /area/station/hallway/secondary/entry) "dmZ" = ( -/obj/machinery/modular_computer/console/preset/cargochat/medical{ +/obj/machinery/modular_computer/preset/cargochat/medical{ dir = 1 }, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -13059,22 +12829,12 @@ dir = 1 }, /area/station/cargo/office) -"dnI" = ( -/obj/structure/rack, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/red/fourcorners, -/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/structure/cable, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +"dnH" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/cup/beaker/large, +/obj/item/reagent_containers/dropper, +/turf/open/floor/iron/dark/textured, +/area/station/medical/pharmacy) "dnJ" = ( /obj/structure/railing{ dir = 4 @@ -13085,6 +12845,7 @@ /obj/machinery/door/firedoor/border_only{ dir = 4 }, +/obj/structure/disposalpipe/segment, /turf/open/floor/pod/light, /area/station/maintenance/floor2/starboard) "dnM" = ( @@ -13136,13 +12897,6 @@ /obj/structure/stairs/south, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port) -"dos" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/stripes, -/turf/open/floor/iron/white, -/area/station/science/auxlab/firing_range) "dou" = ( /obj/effect/decal/cleanable/ash, /obj/effect/mapping_helpers/broken_floor, @@ -13154,18 +12908,13 @@ /turf/open/floor/iron/freezer, /area/station/service/chapel) "doC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/spawner/structure/window/hollow/plasma/middle{ dir = 4 }, /obj/structure/girder/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) -"doH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible, -/obj/structure/cable, -/turf/open/floor/iron/dark/textured_large, -/area/station/engineering/supermatter/room) "doJ" = ( /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, @@ -13175,13 +12924,23 @@ /obj/effect/turf_decal/trimline/blue, /turf/open/floor/iron/dark/side, /area/station/hallway/floor4/fore) -"dpb" = ( -/obj/effect/turf_decal/tile/red/half/contrasted, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 +"doT" = ( +/obj/structure/table/reinforced, +/obj/item/grenade/chem_grenade{ + pixel_x = -4 }, -/turf/open/floor/iron/dark, -/area/station/security/brig) +/obj/item/grenade/chem_grenade{ + pixel_x = 5 + }, +/obj/item/grenade/chem_grenade, +/obj/item/stack/cable_coil, +/obj/item/screwdriver{ + pixel_y = 10 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) "dpd" = ( /obj/structure/chair{ dir = 4 @@ -13198,6 +12957,14 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/wood/tile, /area/station/service/library) +"dpC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark/textured_edge{ + dir = 8 + }, +/area/station/medical/chemistry) "dpH" = ( /turf/closed/wall/r_wall, /area/station/cargo/miningdock) @@ -13216,25 +12983,33 @@ name = "boxing ring" }, /area/station/commons/fitness) -"dpN" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wideplating_new{ - dir = 8 - }, -/obj/machinery/shieldgen, -/turf/open/floor/engine, -/area/station/maintenance/floor2/starboard) +"dpP" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/closet/firecloset/full, +/turf/open/floor/iron, +/area/station/science/cytology) "dpQ" = ( /obj/structure/filingcabinet/security, /turf/open/floor/iron/dark/corner{ dir = 4 }, /area/station/service/lawoffice) +"dpR" = ( +/obj/item/paper{ + default_raw_text = "The SM DOES IN FACT LOOP
The gas goes in from the top side of the SM, and comes out of the bottom side
once out of the SM and into the orange pipes it goes out into space.
The gas cools in space and then comes back to the filters to be put into the SM again.
Remember, the gas is not sent to space but is sent to a room north of the SM to be recycled. You'll need to set that up."; + name = "HOW TO SET UP THE SM" + }, +/obj/structure/table/reinforced, +/obj/machinery/light/directional/west, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"dqe" = ( +/obj/effect/turf_decal/siding/wood/corner, +/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/parquet, +/area/station/service/lawoffice) "dqm" = ( /obj/structure/closet/crate/freezer, /obj/item/reagent_containers/blood/random, @@ -13288,28 +13063,6 @@ /obj/machinery/duct, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/port) -"dqz" = ( -/obj/structure/table, -/obj/item/clothing/under/plasmaman/science{ - pixel_x = 2; - pixel_y = -7 - }, -/obj/item/clothing/suit/hooded/wintercoat/science{ - pixel_x = 6; - pixel_y = -3 - }, -/obj/item/clothing/suit/hooded/wintercoat/science, -/obj/item/clothing/suit/hooded/wintercoat/science{ - pixel_x = -6; - pixel_y = 3 - }, -/obj/item/clothing/head/helmet/space/plasmaman/science{ - pixel_x = 6; - pixel_y = 9 - }, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/white, -/area/station/science/lower) "dqB" = ( /obj/item/clothing/mask/breath{ pixel_x = -4 @@ -13329,19 +13082,9 @@ "dqJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) -"dqN" = ( -/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, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "dqQ" = ( /turf/closed/wall/r_wall, /area/station/security/medical) @@ -13366,12 +13109,32 @@ dir = 4 }, /area/station/hallway/floor3/fore) +"drm" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/chair/office{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/science/cytology) +"dro" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/iron, +/area/station/hallway/floor3/aft) "drp" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/turf_decal/bot, /turf/open/floor/engine, /area/station/maintenance/floor1/starboard/fore) +"drw" = ( +/obj/structure/closet/secure_closet/captains, +/obj/item/camera, +/obj/machinery/status_display/evac/directional/north, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood/tile, +/area/station/command/heads_quarters/captain/private) "drA" = ( /obj/effect/turf_decal/trimline/purple/line, /obj/structure/cable, @@ -13424,7 +13187,7 @@ /area/station/maintenance/floor3/port/fore) "dss" = ( /obj/effect/mapping_helpers/broken_floor, -/obj/item/wirerod, +/obj/item/melee/baton/security/cattleprod, /turf/open/floor/plating, /area/station/maintenance/floor1/port/aft) "dsv" = ( @@ -13435,14 +13198,31 @@ /obj/structure/chair/office{ dir = 8 }, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/wood, /area/station/maintenance/floor2/starboard) -"dsI" = ( -/obj/machinery/light/cold/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/oven, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen/abandoned) +"dsz" = ( +/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/red/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"dsB" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/effect/turf_decal/trimline/white/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/white/line{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/telecomms, +/area/station/tcommsat/server) "dsJ" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -13481,10 +13261,6 @@ name = "boxing ring" }, /area/station/commons/fitness) -"dti" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white/textured_large, -/area/station/service/chapel) "dtj" = ( /obj/structure/window/reinforced/tinted/spawner/directional/west, /obj/structure/filingcabinet, @@ -13497,6 +13273,15 @@ /obj/effect/mapping_helpers/airlock/access/all/service/crematorium, /turf/open/floor/mineral/silver, /area/station/service/chapel/funeral) +"dtm" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Cytology - Cytology Containment" + }, +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/science/cytology) "dts" = ( /obj/effect/turf_decal/trimline/purple/arrow_ccw, /obj/effect/turf_decal/trimline/green/arrow_cw{ @@ -13531,7 +13316,6 @@ /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 }, -/obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/textured, /area/station/hallway/floor2/aft) "dtM" = ( @@ -13553,6 +13337,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"dtY" = ( +/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, +/obj/effect/turf_decal/trimline/yellow/line, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) "dui" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/wideplating_new/dark{ @@ -13588,12 +13384,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet/purple, /area/station/maintenance/floor1/port/aft) -"duI" = ( -/obj/structure/chair{ - dir = 8 +"duC" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 }, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/floor2/fore) "duZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -13638,6 +13435,17 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/service/hydroponics/garden) +"dvF" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/white/arrow_ccw{ + 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/side{ + dir = 5 + }, +/area/station/hallway/secondary/entry) "dvJ" = ( /obj/machinery/airalarm/directional/south, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -13646,6 +13454,16 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/range) +"dvP" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 1 + }, +/obj/machinery/status_display/ai/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/lobby) "dvT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -13671,11 +13489,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) -"dwD" = ( -/obj/machinery/light/cold/no_nightlight/directional/north, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron/dark, -/area/station/hallway/floor3/fore) "dwE" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -13691,18 +13504,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) +"dwN" = ( +/obj/machinery/chem_master, +/obj/machinery/light/cold/no_nightlight/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/virology) "dxd" = ( /turf/open/floor/engine/o2, /area/station/engineering/atmos) -"dxn" = ( -/obj/structure/disposalpipe/trunk, -/obj/machinery/disposal/bin, -/obj/machinery/light/cold/directional/north, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "dxr" = ( /obj/effect/spawner/random/trash/graffiti{ pixel_y = 32 @@ -13733,30 +13542,12 @@ }, /turf/open/floor/iron/kitchen/herringbone, /area/station/service/kitchen) -"dxx" = ( -/obj/effect/turf_decal/trimline/green/line, -/obj/effect/turf_decal/trimline/green/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/public/glass{ - name = "Public Airlock" - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor3/fore) "dxz" = ( /obj/effect/spawner/structure/window/hollow/reinforced/end{ dir = 8 }, /turf/open/floor/plating, /area/station/cargo/sorting) -"dxB" = ( -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/telecomms/relay, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/fore) "dxD" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 9 @@ -13824,15 +13615,19 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor3/starboard/aft) -"dys" = ( -/obj/machinery/holopad, -/turf/open/floor/wood, -/area/station/science/research/abandoned) "dyt" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"dyE" = ( +/obj/machinery/plumbing/growing_vat{ + dir = 4 + }, +/obj/machinery/light/cold/no_nightlight/directional/north, +/obj/machinery/status_display/ai/directional/north, +/turf/open/misc/dirt/jungle, +/area/station/science/cytology) "dyG" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/disposalpipe/segment, @@ -13939,16 +13734,6 @@ /obj/structure/cable, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) -"dzL" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Security Entrance" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/engine{ - icon_state = "textured_dark" - }, -/area/station/maintenance/floor2/starboard/aft) "dzM" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -13969,12 +13754,6 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/starboard/aft) -"dzT" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "dzY" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/hollow/directional, @@ -14024,6 +13803,10 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/floor2/starboard/fore) +"dAo" = ( +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/maintenance/solars/starboard/fore) "dAp" = ( /obj/item/radio/intercom/directional/east, /obj/structure/bookcase/random/nonfiction, @@ -14062,6 +13845,10 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"dAN" = ( +/obj/machinery/light_switch/directional/west, +/turf/open/floor/iron, +/area/station/commons/locker) "dAU" = ( /obj/effect/decal/cleanable/blood/tracks, /turf/open/floor/plating, @@ -14114,13 +13901,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/floor3/aft) -"dBI" = ( -/obj/effect/turf_decal/stripes, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/turf_decal/trimline/purple/line, -/obj/machinery/chem_master, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) +"dBO" = ( +/obj/effect/turf_decal/siding/wideplating, +/obj/structure/table/reinforced, +/obj/item/stack/sheet/mineral/plasma/five, +/obj/item/clothing/glasses/science, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/dark/textured, +/area/station/medical/pharmacy) "dBY" = ( /obj/machinery/door/airlock{ name = "Janitor's Closet" @@ -14168,18 +13956,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) -"dCO" = ( -/obj/structure/chair/sofa/corp/right{ - dir = 8 - }, -/obj/effect/turf_decal/siding/white/corner{ - dir = 8 - }, -/obj/structure/sign/poster/official/random/directional/east, -/obj/structure/sign/poster/random/directional/north, -/obj/effect/landmark/start/paramedic, -/turf/open/floor/iron/dark/textured, -/area/station/medical/paramedic) "dCU" = ( /turf/closed/wall, /area/station/commons/dorms/room2) @@ -14222,6 +13998,13 @@ /obj/effect/landmark/start/detective, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) +"dDz" = ( +/obj/machinery/computer/records/security{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "dDC" = ( /obj/structure/chair/comfy/shuttle{ dir = 8 @@ -14256,12 +14039,6 @@ /obj/structure/barricade/wooden/crude, /turf/open/floor/plating, /area/station/maintenance/floor2/port/aft) -"dDP" = ( -/obj/item/shard, -/turf/open/floor/engine{ - icon_state = "textured_dark" - }, -/area/station/maintenance/floor2/starboard/aft) "dDR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -14340,16 +14117,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) -"dER" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/carpet/red, -/area/station/service/theater) "dFb" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -14363,18 +14130,6 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/floor3/fore) -"dFf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/science{ - name = "Science Hall" - }, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock_note_placer{ - note_info = "THIS IS PUBLIC. IT'S MEANT TO BE. PLEASE. GOD. WE KNOW. STOP. TELLING US. - Yours Truly and Forever Faithfully, The Desk Of The Chief Engineer" - }, -/turf/open/floor/catwalk_floor, -/area/station/science/lower) "dFj" = ( /obj/effect/turf_decal/tile/green/full, /obj/machinery/button/door/directional/east{ @@ -14430,17 +14185,6 @@ /obj/machinery/hydroponics/constructable, /turf/open/floor/iron, /area/station/service/hydroponics) -"dFO" = ( -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 8 - }, -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/status_display/ai/directional/east, -/turf/open/floor/iron/smooth_large, -/area/station/maintenance/radshelter/sci) "dFR" = ( /obj/machinery/power/emitter, /obj/machinery/camera{ @@ -14463,6 +14207,11 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/starboard/fore) +"dGa" = ( +/obj/effect/turf_decal/stripes, +/obj/effect/decal/cleanable/xenoblood, +/turf/open/floor/engine, +/area/station/science/cytology) "dGe" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/reinforced, @@ -14473,18 +14222,14 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark, /area/station/security/lockers) +"dGo" = ( +/turf/open/floor/engine/hull/reinforced, +/area/station/science/xenobiology) "dGp" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) -"dGB" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/stripes, -/turf/open/floor/iron/white, -/area/station/science/auxlab/firing_range) "dGF" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -14507,14 +14252,20 @@ /obj/structure/lattice, /turf/open/openspace, /area/station/hallway/floor2/fore) -"dHd" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/airalarm/directional/north, -/obj/machinery/status_display/ai/directional/east, -/obj/structure/cable, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/textured_large, -/area/station/engineering/engine_smes) +"dGS" = ( +/obj/effect/turf_decal/trimline/green/warning{ + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/side{ + dir = 5 + }, +/area/station/hallway/floor3/fore) +"dHa" = ( +/obj/structure/closet/boxinggloves, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) "dHf" = ( /turf/open/floor/catwalk_floor/iron, /area/station/hallway/floor1/aft) @@ -14524,21 +14275,12 @@ /obj/item/pipe_dispenser, /turf/open/floor/iron, /area/station/engineering/atmos) -"dHA" = ( -/obj/structure/table, -/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/siding/purple, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) +"dHn" = ( +/obj/structure/closet/emcloset, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "dHD" = ( /obj/structure/grille, /obj/effect/decal/cleanable/dirt, @@ -14550,17 +14292,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"dHS" = ( -/obj/effect/turf_decal/trimline/green/filled/arrow_cw{ - dir = 10 - }, -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/machinery/light/cold/no_nightlight/directional/west, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron/dark/textured, -/area/station/medical/virology/isolation) "dHY" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -14622,16 +14353,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/ordnance/testlab) -"dIL" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/structure/table/wood, -/obj/item/flashlight/lamp/bananalamp{ - pixel_y = 5 - }, -/turf/open/floor/iron/grimy, -/area/station/science/xenobiology/hallway) "dIO" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -14684,13 +14405,6 @@ /obj/structure/cable, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard/aft) -"dJt" = ( -/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/south, -/turf/open/floor/iron/textured_large, -/area/station/cargo/storage) "dJu" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -14718,7 +14432,7 @@ /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) "dJC" = ( -/obj/machinery/light/small/directional/east, +/obj/machinery/light/small/dim/directional/east, /turf/open/openspace, /area/station/command/heads_quarters/hop) "dJF" = ( @@ -14746,6 +14460,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/port) +"dJV" = ( +/obj/effect/turf_decal/trimline/yellow/line, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/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/dark, +/area/station/hallway/floor1/fore) "dKb" = ( /obj/structure/kitchenspike, /turf/open/floor/pod/dark, @@ -14790,9 +14514,6 @@ /turf/open/floor/iron/dark, /area/station/command/teleporter) "dKJ" = ( -/obj/structure/railing/corner{ - dir = 4 - }, /obj/effect/turf_decal/trimline/blue/filled/line, /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 4 @@ -14802,6 +14523,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, /turf/open/floor/iron, /area/station/hallway/floor4/fore) "dKL" = ( @@ -14811,6 +14535,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, /area/station/medical/abandoned) +"dKS" = ( +/obj/machinery/camera/autoname/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/hallway/floor2/aft) +"dKU" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/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/science/cytology) "dLe" = ( /obj/structure/chair/sofa/bench/left{ dir = 4 @@ -14823,40 +14561,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) -"dLt" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 1 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Science Foyer - #1" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/landmark/navigate_destination/research, -/turf/open/floor/iron/white, -/area/station/science/lobby) "dLu" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/cigbutt, /obj/structure/sign/poster/contraband/random/directional/west, /turf/open/floor/plating, /area/station/maintenance/floor2/port/aft) -"dLx" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white/textured_large, -/area/station/service/chapel) -"dLI" = ( -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 6 - }, -/obj/machinery/light/directional/south, -/obj/structure/closet/secure_closet/brig{ - name = "Prisoner Locker" - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/third) "dLL" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -14925,32 +14635,11 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/hallway/secondary/exit/departure_lounge) -"dMs" = ( -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"dMu" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/stripes/line, -/obj/item/assembly/flash, -/obj/item/restraints/handcuffs, -/obj/machinery/camera/directional/east{ - name = "Checkpoint - Engineering Deck" - }, -/obj/machinery/status_display/door_timer{ - id = "cell-1"; - name = "Floor 1 Cell"; - pixel_x = 32 - }, -/obj/machinery/recharger, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) +"dMt" = ( +/obj/structure/rack, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white/textured_large, +/area/station/service/chapel/office) "dMw" = ( /obj/effect/turf_decal/trimline/red/filled/end{ dir = 4 @@ -15007,6 +14696,22 @@ /obj/machinery/duct, /turf/open/floor/iron/dark/smooth_large, /area/station/service/bar) +"dNp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/wood/tile, +/area/station/service/library) +"dNw" = ( +/obj/structure/bed/dogbed/renault, +/mob/living/basic/pet/fox/renault, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/west, +/obj/structure/cable, +/turf/open/floor/wood/tile, +/area/station/command/heads_quarters/captain/private) "dNx" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Engineering" @@ -15118,10 +14823,6 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/carpet, /area/station/service/lawoffice) -"dOL" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/floor1/fore) "dOM" = ( /obj/effect/turf_decal/trimline/purple/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15140,18 +14841,6 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"dOY" = ( -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing/corner{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) "dPf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -15160,10 +14849,14 @@ dir = 4 }, /area/station/security/office) -"dPi" = ( -/obj/machinery/light/cold/no_nightlight/directional/west, -/turf/open/floor/engine, -/area/station/command/heads_quarters/rd) +"dPh" = ( +/obj/effect/turf_decal/siding/blue/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/carpet/neon/simple/pink/nodots, +/area/station/maintenance/floor2/port/fore) "dPk" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -15178,13 +14871,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"dPB" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 5 - }, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron, -/area/station/hallway/floor1/aft) "dPC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -15192,41 +14878,11 @@ "dPH" = ( /turf/closed/wall/r_wall, /area/station/security/brig) -"dPN" = ( -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/commons/storage/primary) "dPT" = ( /obj/machinery/light/small/red/directional/east, /obj/effect/spawner/random/trash/mess, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard) -"dQb" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/table, -/obj/item/transfer_valve{ - pixel_x = -5 - }, -/obj/item/transfer_valve{ - pixel_x = 5 - }, -/obj/item/transfer_valve, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) -"dQd" = ( -/obj/effect/turf_decal/trimline/yellow/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, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) "dQg" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/side{ @@ -15238,10 +14894,6 @@ /obj/structure/grille/broken, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"dQj" = ( -/obj/structure/dresser, -/turf/open/floor/carpet/royalblue, -/area/station/commons/dorms/room4) "dQn" = ( /obj/structure/sign/poster/contraband/power, /turf/closed/wall, @@ -15272,6 +14924,15 @@ /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/carbon_output, /turf/open/floor/engine/co2, /area/station/engineering/atmos) +"dQQ" = ( +/obj/effect/turf_decal/tile/blue/anticorner{ + dir = 4 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark/side{ + dir = 5 + }, +/area/station/ai_monitored/turret_protected/ai) "dQU" = ( /obj/structure/rack, /obj/effect/spawner/random/techstorage/engineering_all, @@ -15285,15 +14946,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) -"dRf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" +"dRn" = ( +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 1 }, -/area/station/science/genetics) +/area/station/hallway/floor1/aft) "dRs" = ( /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/dark, @@ -15369,6 +15027,15 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/wood, /area/station/service/kitchen/diner) +"dSl" = ( +/obj/structure/table, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/reagentgrinder{ + pixel_x = 6; + pixel_y = 6 + }, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "dSn" = ( /obj/structure/closet{ name = "Evidence Closet 5" @@ -15434,6 +15101,17 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/wood/parquet, /area/station/medical/psychology) +"dTB" = ( +/obj/structure/table/wood, +/obj/item/newspaper{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/folder/red, +/obj/item/pen, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "dTF" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -15441,12 +15119,6 @@ /obj/effect/turf_decal/trimline/red/filled/corner, /turf/open/floor/iron/dark/side, /area/station/hallway/floor4/fore) -"dTG" = ( -/obj/item/storage/toolbox/mechanical, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "dTJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15480,15 +15152,6 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/security/checkpoint) -"dTZ" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ - dir = 6 - }, -/turf/open/floor/engine/airless, -/area/station/engineering/atmos/pumproom) "dUh" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -15516,6 +15179,13 @@ }, /turf/open/floor/iron/dark/textured, /area/station/medical/paramedic) +"dUq" = ( +/mob/living/simple_animal/bot/secbot/pingsky, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/aisat_interior) "dUr" = ( /obj/structure/disposalpipe/junction{ dir = 8 @@ -15583,6 +15253,9 @@ /obj/effect/turf_decal/trimline/green/warning{ dir = 9 }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, /turf/open/floor/pod/light, /area/station/maintenance/floor2/starboard) "dUW" = ( @@ -15595,6 +15268,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/smooth_large, /area/station/hallway/secondary/entry) +"dUY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/half, +/area/station/command/gateway) "dVf" = ( /obj/structure/grille, /turf/open/floor/plating, @@ -15616,6 +15299,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/item/storage/medkit/regular, /turf/open/floor/iron/white, /area/station/security/medical) "dVt" = ( @@ -15630,6 +15314,12 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port/fore) +"dVx" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/security/prison) "dVy" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -15663,6 +15353,17 @@ /obj/effect/turf_decal/tile/green/opposingcorners, /turf/open/floor/iron/white, /area/station/medical/virology) +"dVW" = ( +/obj/effect/turf_decal/trimline/blue/line, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/aft) "dWg" = ( /turf/open/floor/iron/dark, /area/station/security/courtroom) @@ -15697,6 +15398,14 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark, /area/station/service/hydroponics/garden) +"dWn" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/status_display/ai/directional/west, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/engineering/lobby) "dWt" = ( /obj/machinery/camera/directional/north{ name = "Law Backroom" @@ -15767,7 +15476,6 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "viro" }, -/obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/virology) "dWZ" = ( @@ -15823,17 +15531,6 @@ dir = 4 }, /area/station/hallway/floor2/fore) -"dXR" = ( -/obj/effect/turf_decal/trimline/blue/corner{ - dir = 4 - }, -/obj/machinery/light/small/blacklight/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server/upper) "dXX" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/rnd/production/techfab/department/security, @@ -15864,21 +15561,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/fore) -"dYr" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/newscaster/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/maintenance/disposal/incinerator) -"dYx" = ( -/obj/structure/bodycontainer/morgue{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ +"dYl" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/engineering/atmos/project) +"dYq" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/stripes{ dir = 1 }, -/turf/open/floor/plating, -/area/station/science/genetics) +/turf/open/floor/mineral/plastitanium, +/area/station/maintenance/floor2/starboard) "dYB" = ( /obj/effect/turf_decal/tile/green/anticorner, /obj/structure/rack, @@ -15917,12 +15611,6 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/starboard) -"dZk" = ( -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/psychology) "dZt" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -15949,10 +15637,6 @@ /obj/structure/cable, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/cmo) -"dZP" = ( -/obj/machinery/photocopier, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hop) "dZQ" = ( /obj/effect/turf_decal/trimline/blue/line, /obj/machinery/air_sensor/oxygen_tank, @@ -16057,6 +15741,10 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) +"ebC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/starboard) "ebE" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -16142,6 +15830,14 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) +"ecK" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/iv_drip, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "ecN" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -16149,32 +15845,6 @@ /obj/machinery/light/red/dim/directional/south, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/aft) -"ecO" = ( -/obj/machinery/light/directional/west, -/obj/structure/sign/warning/docking/directional/west, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"ecU" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/obj/machinery/light/cold/no_nightlight/directional/south, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor2/aft) -"ecV" = ( -/obj/effect/turf_decal/trimline/purple/warning{ - dir = 6 - }, -/obj/effect/turf_decal/stripes{ - dir = 6 - }, -/obj/machinery/light/red/dim/directional/north, -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor2/starboard) "ede" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -16201,6 +15871,11 @@ /obj/structure/ladder, /turf/open/floor/plating/airless, /area/space/nearstation) +"edI" = ( +/obj/structure/dresser, +/obj/structure/sign/poster/random/directional/north, +/turf/open/floor/carpet/red, +/area/station/commons/dorms/room1) "edO" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/trimline/green/warning{ @@ -16311,6 +15986,21 @@ /obj/effect/decal/cleanable/blood, /turf/open/floor/pod/dark, /area/station/maintenance/floor4/starboard) +"eeP" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/floor1/aft) +"eeQ" = ( +/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, +/turf/open/floor/iron, +/area/station/hallway/floor1/aft) "efa" = ( /obj/structure/railing/corner{ dir = 8 @@ -16334,6 +16024,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/wood, /area/station/service/bar/atrium) +"efn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/mecha_part_fabricator{ + dir = 4 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white/smooth_large, +/area/station/science/robotics/lab) "efp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/start/depsec/engineering, @@ -16374,6 +16074,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/floor3/fore) +"efX" = ( +/obj/effect/turf_decal/siding/wideplating_new{ + dir = 8 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/white, +/area/station/science/cytology) "efY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -16388,10 +16095,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/aft) -"egy" = ( -/obj/structure/ladder, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor3/fore) "egz" = ( /obj/effect/turf_decal/trimline/purple/corner{ dir = 4 @@ -16405,14 +16108,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/lobby) -"egC" = ( -/obj/structure/closet/secure_closet/personal, -/obj/item/clothing/under/misc/assistantformal, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/winterboots, -/obj/machinery/bluespace_vendor/directional/east, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "egD" = ( /obj/structure/railing{ dir = 10 @@ -16432,17 +16127,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"egV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light_switch/directional/north, -/obj/effect/turf_decal/tile/dark_red/fourcorners, -/turf/open/floor/iron, -/area/station/security/brig) -"eha" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) +"ehg" = ( +/obj/machinery/fax{ + fax_name = "Cargo Office"; + name = "Cargo Office Fax Machine" + }, +/obj/structure/table, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 1 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/smooth, +/area/station/cargo/office) "ehh" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 4 @@ -16461,6 +16161,15 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/dark, /area/station/security/courtroom) +"ehl" = ( +/obj/effect/turf_decal/trimline/purple/warning, +/obj/machinery/light/red/dim/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/effect/spawner/random/maintenance, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor2/starboard) "ehm" = ( /obj/structure/railing{ dir = 4 @@ -16559,7 +16268,7 @@ /obj/machinery/elevator_control_panel/directional/west{ linked_elevator_id = "fore_vator"; pixel_x = -24; - preset_destination_names = list("2"="Supply-Engi Floor","3"="Med-Sci Floor","4"="Service Floor") + preset_destination_names = list("2"="Supply-Engi Floor","3"="Med-Sci Floor","4"="Service Floor") }, /obj/machinery/lift_indicator/directional/west{ linked_elevator_id = "fore_vator"; @@ -16572,6 +16281,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/side, /area/station/command/teleporter) +"ehZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/table/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/end{ + dir = 8 + }, +/obj/item/storage/toolbox/emergency, +/turf/open/floor/iron/dark, +/area/station/commons/storage/tools) "eir" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Access" @@ -16603,12 +16326,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload_foyer) -"eiF" = ( -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/hallway/floor2/fore) "eiJ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/closet_maintenance, @@ -16787,13 +16504,6 @@ dir = 1 }, /area/station/engineering/atmos/hfr_room) -"ekO" = ( -/obj/machinery/light/directional/south, -/obj/structure/closet/crate/freezer, -/obj/effect/spawner/random/medical/memeorgans, -/obj/effect/spawner/random/medical/surgery_tool, -/turf/open/floor/iron/white, -/area/station/maintenance/floor3/starboard/aft) "ekY" = ( /obj/machinery/atmospherics/pipe/smart/manifold/green/visible{ dir = 4 @@ -16803,26 +16513,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/project) -"elb" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/camera/autoname/directional/south, -/obj/item/fuel_pellet{ - pixel_x = -4; - pixel_y = -2 - }, -/obj/item/fuel_pellet, -/obj/item/fuel_pellet{ - pixel_x = 4; - pixel_y = 2 - }, -/obj/structure/rack, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/corner{ - dir = 1 - }, -/area/station/cargo/drone_bay) "ell" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -16839,22 +16529,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor4/aft) -"elp" = ( -/obj/effect/turf_decal/stripes{ - dir = 4 - }, -/obj/structure/rack, -/obj/item/storage/box/petridish{ - pixel_x = -5; - pixel_y = 8 - }, -/obj/item/storage/box/beakers, -/obj/item/storage/box/gloves{ - pixel_x = 5; - pixel_y = -8 - }, -/turf/open/floor/plating, -/area/station/science/cytology) "elB" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor/heavy, @@ -16949,6 +16623,21 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/floor3/starboard) +"emp" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/reagent_containers/cup/blastoff_ampoule, +/turf/open/floor/carpet/neon/simple/pink/nodots, +/area/station/maintenance/floor2/port/fore) +"emu" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/effect/turf_decal/siding/wideplating, +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/medical/medbay/central) "emv" = ( /obj/machinery/camera{ c_tag = "Atmos Tank #3 - Mixed Air"; @@ -17036,33 +16725,6 @@ /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/engine, /area/station/maintenance/floor4/starboard/aft) -"ena" = ( -/obj/machinery/door/window/left/directional/south{ - name = "Pen 2"; - req_access = list("xenobiology") - }, -/obj/effect/turf_decal/stripes, -/obj/effect/turf_decal/trimline/purple/line, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"enj" = ( -/obj/structure/table/reinforced, -/obj/item/grenade/chem_grenade{ - pixel_x = -4 - }, -/obj/item/grenade/chem_grenade{ - pixel_x = 5 - }, -/obj/item/grenade/chem_grenade, -/obj/item/stack/cable_coil, -/obj/item/screwdriver{ - pixel_y = 10 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/light/cold/directional/south, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) "enl" = ( /obj/effect/turf_decal/delivery, /obj/machinery/disposal/bin, @@ -17082,16 +16744,6 @@ }, /turf/open/floor/iron, /area/station/hallway/floor2/fore) -"env" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/light/cold/no_nightlight/directional/north, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) "enB" = ( /obj/machinery/door/window/brigdoor{ dir = 1 @@ -17149,13 +16801,6 @@ dir = 4 }, /area/station/hallway/floor3/fore) -"eoc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/chair/plastic{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/hallway/floor2/fore) "eod" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -17178,17 +16823,27 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, -/obj/structure/railing/corner{ - dir = 4 - }, /obj/effect/turf_decal/stripes/corner{ dir = 4 }, /obj/structure/disposalpipe/segment{ dir = 5 }, +/obj/structure/railing/corner/end{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/storage) +"eop" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/white/textured_large, +/area/station/service/chapel/office) "eov" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -17297,6 +16952,14 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) +"eqs" = ( +/obj/effect/turf_decal/stripes, +/obj/machinery/conveyor_switch/oneway{ + id = "disposals" + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/textured_large, +/area/station/maintenance/disposal) "eqF" = ( /obj/effect/turf_decal/trimline/dark_blue/line{ dir = 9 @@ -17313,10 +16976,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/smooth_large, /area/station/hallway/secondary/entry) -"eqO" = ( -/obj/structure/flora/tree/jungle/small/style_random, -/turf/open/floor/grass, -/area/station/science/genetics) "eqQ" = ( /obj/structure/cable, /turf/open/floor/iron/smooth, @@ -17350,17 +17009,19 @@ /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/starboard) "erV" = ( -/obj/machinery/door/firedoor/border_only{ +/obj/effect/turf_decal/trimline/brown/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/structure/disposalpipe/segment{ - dir = 5 +/obj/effect/turf_decal/stripes{ + dir = 1 }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/starboard/fore) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/turf_decal/stripes, +/obj/effect/turf_decal/trimline/brown/line, +/turf/open/floor/iron/dark/smooth_half, +/area/station/bitrunning/den) "erY" = ( /obj/machinery/vending/wardrobe/bar_wardrobe, /turf/open/floor/wood, @@ -17389,15 +17050,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/medical/virology/isolation) -"esw" = ( -/obj/machinery/computer/security/telescreen/entertainment/directional/south, -/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, -/area/station/science/research/abandoned) "esx" = ( /obj/machinery/suit_storage_unit/atmos, /obj/machinery/light/directional/east, @@ -17470,17 +17122,18 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) -"etJ" = ( -/obj/structure/chair/office{ +"etV" = ( +/obj/structure/chair/sofa/bench/right{ dir = 4 }, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"etU" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/engineering/atmos) +/obj/effect/turf_decal/trimline/purple/line{ + dir = 6 + }, +/obj/machinery/status_display/ai/directional/west, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/hallway/floor2/fore) "eub" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -17500,19 +17153,23 @@ /turf/open/floor/pod/dark, /area/station/maintenance/floor3/starboard) "eul" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = 8 + }, +/obj/item/cigbutt/cigarbutt{ + pixel_x = 7 + }, /obj/effect/turf_decal/stripes{ dir = 8 }, -/turf/open/floor/plating, -/area/station/maintenance/floor1/starboard/fore) -"eur" = ( -/obj/effect/mapping_helpers/airlock/access/any/supply/mining, -/obj/machinery/door/airlock/glass_large{ - name = "Xenoflora" +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/textured_large, -/area/station/cargo/miningdock) +/obj/effect/decal/cleanable/glass, +/turf/open/floor/iron/dark/smooth_half, +/area/station/bitrunning/den) "euu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -17561,6 +17218,17 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/port) +"evi" = ( +/obj/machinery/door/airlock/science{ + name = "Monkey Atrium" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/access/all/science/genetics, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "evn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/light, @@ -17581,6 +17249,13 @@ }, /turf/open/floor/iron, /area/station/hallway/floor2/fore) +"evB" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/smooth_large, +/area/station/tcommsat/server) "evI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -17590,13 +17265,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/starboard/aft) -"evJ" = ( -/obj/effect/turf_decal/trimline/green/filled/corner, -/obj/machinery/light/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/wood/tile, -/area/station/service/library/lounge) "evN" = ( /obj/structure/rack, /obj/effect/decal/cleanable/dirt, @@ -17698,18 +17366,18 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port) -"ewI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"ewK" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 4 + }, /obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/duct, -/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/white, -/area/station/medical/medbay/aft) +/area/station/science/cytology) "ewM" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrogen_output, /obj/effect/turf_decal/trimline/red/line, @@ -17718,10 +17386,12 @@ "ewW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing/corner, /obj/effect/turf_decal/trimline/blue/filled/corner, /obj/structure/cable, /obj/structure/disposalpipe/segment, +/obj/structure/railing/corner/end{ + dir = 4 + }, /turf/open/floor/iron, /area/station/hallway/floor4/fore) "ewY" = ( @@ -17761,13 +17431,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) -"exK" = ( -/obj/machinery/light/cold/no_nightlight/directional/east, -/obj/effect/turf_decal/trimline/green/warning, -/turf/open/floor/iron/dark/side{ - dir = 6 - }, -/area/station/hallway/floor3/fore) "exL" = ( /obj/structure/railing{ dir = 4 @@ -17811,6 +17474,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"eyB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/girder, +/obj/machinery/light/red/dim/directional/west, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/port) "eyJ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -17902,6 +17571,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) +"ezQ" = ( +/obj/structure/railing/corner/end{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "ezR" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, @@ -17988,6 +17666,25 @@ /obj/structure/sign/poster/official/random/directional/east, /turf/open/floor/carpet/blue, /area/station/cargo/miningdock) +"eBf" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/purple{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/storage/box/beakers{ + pixel_x = 12; + pixel_y = 6 + }, +/obj/item/flashlight/lamp{ + pixel_x = -7; + pixel_y = 5 + }, +/turf/open/floor/iron, +/area/station/science/cytology) "eBg" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -18071,6 +17768,19 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/aft) +"eCz" = ( +/obj/machinery/door/window/left/directional/south{ + name = "Pen 4"; + req_access = list("xenobiology") + }, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) +"eCJ" = ( +/obj/structure/railing, +/obj/structure/table, +/obj/effect/turf_decal/trimline/purple/warning, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) "eCK" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -18099,19 +17809,21 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/fore) -"eCR" = ( -/obj/machinery/light/directional/north, -/obj/structure/rack, -/obj/effect/spawner/random/engineering/tool, -/obj/structure/railing{ +"eCQ" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 }, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor1/fore) +/obj/item/clothing/glasses/meson, +/obj/item/clothing/glasses/meson, +/obj/item/clothing/glasses/meson, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room) "eCZ" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 1 }, +/obj/structure/table, /turf/open/floor/iron, /area/station/hallway/secondary/service) "eDe" = ( @@ -18140,6 +17852,15 @@ }, /turf/open/floor/iron/dark/textured, /area/station/medical/surgery/fore) +"eDt" = ( +/obj/effect/turf_decal/trimline/purple/warning, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/light, +/area/station/maintenance/floor2/starboard) +"eDC" = ( +/obj/machinery/light/cold/directional/south, +/turf/open/openspace, +/area/station/medical/pharmacy) "eEd" = ( /obj/machinery/door/airlock/command/glass{ name = "Ancient Office" @@ -18255,13 +17976,14 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) -"eFj" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 +"eFq" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 8 }, -/turf/open/floor/iron/dark, -/area/station/security/brig) +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/ai_monitored/command/storage/eva) "eFr" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -18270,17 +17992,6 @@ /obj/machinery/light/dim/directional/east, /turf/open/floor/carpet/red, /area/station/service/theater) -"eFx" = ( -/obj/effect/turf_decal/trimline/purple/corner{ - dir = 1 - }, -/obj/machinery/light/cold/no_nightlight/directional/south, -/obj/item/radio/intercom/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/lobby) "eFC" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -18288,21 +17999,14 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard) +"eFO" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/floor/grass, +/area/station/science/cytology) "eFY" = ( /turf/open/floor/plating, /area/station/maintenance/floor1/starboard) -"eGg" = ( -/obj/item/stack/sheet/iron, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/engine{ - icon_state = "textured_dark" - }, -/area/station/maintenance/floor2/starboard/aft) "eGl" = ( -/obj/machinery/space_heater, -/obj/machinery/firealarm/directional/north, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port) "eGp" = ( @@ -18326,6 +18030,14 @@ }, /turf/open/floor/iron/smooth_large, /area/station/hallway/secondary/entry) +"eGF" = ( +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 8 + }, +/obj/machinery/light/cold/no_nightlight/directional/south, +/obj/structure/closet/radiation, +/turf/open/floor/iron/white, +/area/station/science/lower) "eGK" = ( /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) @@ -18352,6 +18064,10 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/science/genetics) +"eHf" = ( +/obj/machinery/light/floor, +/turf/open/floor/engine, +/area/station/science/cytology) "eHk" = ( /obj/effect/decal/cleanable/oil, /obj/effect/turf_decal/stripes{ @@ -18407,6 +18123,24 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/pod/light, /area/station/maintenance/floor3/port) +"eHU" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + 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/wood/tile, +/area/station/service/library) "eHW" = ( /obj/effect/spawner/random/vending/snackvend, /turf/open/floor/iron/smooth_large, @@ -18441,6 +18175,13 @@ }, /turf/open/floor/iron/dark, /area/station/security/prison/visit) +"eIr" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/status_display/ai/directional/west, +/turf/open/floor/iron, +/area/station/hallway/floor1/aft) "eIs" = ( /obj/machinery/airlock_sensor/incinerator_ordmix{ pixel_x = 24 @@ -18457,17 +18198,6 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/atmos/hfr_room) -"eIv" = ( -/obj/effect/turf_decal/trimline/purple/line, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 1 - }, -/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/hallway/floor2/fore) "eIw" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/blue/filled/line, @@ -18481,14 +18211,14 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/hallway/floor3/aft) -"eIP" = ( +"eIU" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/corner, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/red/dim/directional/east, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port/fore) +/obj/machinery/duct, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "eIW" = ( /obj/effect/decal/cleanable/blood/old, /obj/effect/spawner/random/maintenance, @@ -18500,6 +18230,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/solars/starboard/aft) +"eJd" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/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) "eJl" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18526,12 +18266,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) -"eJK" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/atmospherics/components/tank/plasma, -/turf/open/floor/iron/dark, -/area/station/maintenance/disposal/incinerator) "eJU" = ( /obj/effect/spawner/random/trash/grille_or_waste, /turf/open/floor/pod/light, @@ -18592,9 +18326,29 @@ dir = 8 }, /area/station/hallway/floor3/fore) +"eKB" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/sink/directional/north, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "eKC" = ( /turf/closed/wall, /area/station/science/xenobiology/hallway) +"eKD" = ( +/obj/structure/railing{ + dir = 5 + }, +/turf/open/floor/grass, +/area/station/science/cytology) +"eKY" = ( +/obj/effect/turf_decal/trimline/purple/corner{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology/hallway) "eLd" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron/dark/side{ @@ -18645,6 +18399,15 @@ /obj/structure/disposalpipe/junction, /turf/open/floor/iron/white, /area/station/science/lobby) +"eLF" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer2{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/station/engineering/supermatter/waste) "eLK" = ( /obj/structure/railing{ dir = 6 @@ -18735,7 +18498,7 @@ /area/station/service/chapel) "eNM" = ( /obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/fake_snow{ +/turf/open/misc/snow/actually_safe{ icon_state = "snow4" }, /area/station/hallway/floor2/fore) @@ -18783,10 +18546,6 @@ /obj/structure/cable, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"eOZ" = ( -/obj/structure/closet/emcloset/anchored, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) "ePa" = ( /turf/closed/wall/r_wall, /area/station/science/lab) @@ -18820,6 +18579,19 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/wood/tile, /area/station/service/library) +"ePJ" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/fore) "ePM" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=3-3"; @@ -18845,17 +18617,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"ePX" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/chair/comfy/shuttle{ - dir = 8 +"ePY" = ( +/obj/effect/turf_decal/trimline/red/warning{ + dir = 4 }, -/turf/open/floor/iron/smooth_large, -/area/station/maintenance/radshelter/sci) -"eQa" = ( -/obj/effect/landmark/navigate_destination/dockesc, +/obj/machinery/light/floor, +/turf/open/floor/pod, +/area/station/hallway/secondary/entry) +"eQd" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/pdapainter/security, /turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) +/area/station/command/heads_quarters/hos) "eQe" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -18871,10 +18644,16 @@ /obj/machinery/prisongate, /turf/open/floor/plating, /area/station/security/holding_cell) -"eQw" = ( -/obj/machinery/firealarm/directional/north, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor3/starboard) +"eQm" = ( +/obj/structure/chair/sofa/left{ + dir = 8 + }, +/obj/item/toy/plush/beeplushie{ + desc = "A cute bee toy to calm down hysteric patients."; + name = "Bee Haave" + }, +/turf/open/floor/wood, +/area/station/medical/psychology) "eQD" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/turf_decal/bot, @@ -18903,14 +18682,6 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/office) -"eQW" = ( -/obj/effect/turf_decal/trimline/purple/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/junction/yjunction, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "eQZ" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer2{ dir = 4 @@ -18925,17 +18696,6 @@ dir = 8 }, /area/station/engineering/atmos) -"eRd" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/machinery/vending/wallmed/directional/east, -/obj/machinery/light/directional/east, -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "eRe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -18961,12 +18721,6 @@ dir = 1 }, /area/station/security/brig) -"eRW" = ( -/obj/structure/rack, -/obj/effect/spawner/random/clothing/costume, -/obj/item/clothing/mask/balaclava, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "eRZ" = ( /obj/effect/spawner/random/maintenance/two, /obj/effect/decal/cleanable/dirt, @@ -19009,6 +18763,15 @@ /obj/structure/girder, /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) +"eSJ" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "eSX" = ( /obj/structure/flora/bush/sparsegrass/style_random, /obj/structure/flora/bush/flowers_br/style_random, @@ -19032,11 +18795,31 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor3/starboard) +"eTr" = ( +/obj/structure/chair/sofa/corner/brown{ + dir = 1 + }, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/wood, +/area/station/hallway/secondary/entry) "eTH" = ( /obj/structure/flora/bush/sparsegrass/style_random, /mob/living/carbon/human/species/monkey, /turf/open/floor/grass, /area/station/science/genetics) +"eTJ" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 8 + }, +/obj/effect/turf_decal/siding/white/corner{ + dir = 8 + }, +/obj/structure/sign/poster/official/random/directional/east, +/obj/structure/sign/poster/random/directional/north, +/obj/effect/landmark/start/paramedic, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/textured, +/area/station/medical/paramedic) "eTQ" = ( /obj/structure/chair/stool/directional/north, /obj/structure/cable, @@ -19071,10 +18854,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/ordnance/testlab) -"eUj" = ( -/obj/item/radio/intercom/directional/east, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +"eUn" = ( +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/line, +/turf/open/floor/iron/white, +/area/station/science/cytology) "eUp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19085,23 +18871,37 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/floor3/fore) -"eUB" = ( -/obj/item/paper_bin, -/obj/structure/table/wood/fancy/royalblack, -/turf/open/floor/carpet/neon/simple/white, -/area/station/commons/dorms/room3) -"eUI" = ( -/obj/effect/turf_decal/siding/wood{ +"eUq" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 4 + }, +/obj/machinery/shower/directional/north, +/obj/effect/turf_decal/trimline/green/end{ dir = 1 }, -/turf/open/floor/wood, -/area/station/commons/dorms/apartment2) +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/dark/textured, +/area/station/medical/virology/isolation) +"eUx" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/closet/l3closet/scientist, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "eUJ" = ( /obj/effect/turf_decal/trimline/neutral/warning{ dir = 1 }, /obj/machinery/camera/autoname/directional/west, /obj/item/radio/intercom/directional/west, +/obj/structure/railing/corner/end/flip{ + dir = 1 + }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) "eUM" = ( @@ -19125,6 +18925,11 @@ /obj/structure/railing, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) +"eUX" = ( +/obj/item/kirbyplants/random, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/station/medical/psychology) "eUZ" = ( /obj/structure/table, /obj/effect/spawner/random/food_or_drink/snack, @@ -19134,12 +18939,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard) -"eVe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/roboticist, -/turf/open/floor/iron, -/area/station/science/robotics/lab) "eVh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -19151,6 +18950,27 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) +"eVl" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 6 + }, +/obj/structure/closet/crate/science{ + name = "Protein Collection Supplies" + }, +/obj/item/clothing/gloves/butchering, +/obj/item/knife/hunting, +/obj/item/gun/energy/laser/retro/old, +/obj/item/paper{ + default_raw_text = "Just do what comes natural -J"; + name = "odd note" + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) +"eVo" = ( +/obj/machinery/suit_storage_unit/captain, +/obj/machinery/light/directional/north, +/turf/open/floor/wood/tile, +/area/station/command/heads_quarters/captain/private) "eVN" = ( /obj/structure/grille/broken, /obj/effect/decal/cleanable/dirt, @@ -19165,19 +18985,6 @@ /obj/effect/landmark/start/chemist, /turf/open/floor/iron/white/small, /area/station/medical/chemistry) -"eVY" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 8; - volume_rate = 200 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer4{ - dir = 8 - }, -/turf/open/floor/engine/airless, -/area/station/engineering/atmos/pumproom) "eWb" = ( /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/structure/barricade/wooden/crude, @@ -19186,19 +18993,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard) -"eWe" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Security - Warden's Office" - }, -/obj/structure/bed/dogbed/mcgriff, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/mob/living/basic/pet/dog/pug/mcgriff, -/turf/open/floor/iron/dark, -/area/station/security/warden) "eWg" = ( /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 8 @@ -19216,6 +19010,14 @@ }, /turf/open/floor/iron/dark, /area/station/security/brig) +"eWC" = ( +/obj/machinery/airalarm/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/white/textured_large, +/area/station/service/chapel/office) "eWI" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -19238,19 +19040,14 @@ /obj/machinery/duct, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) -"eWY" = ( -/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/plating, -/area/station/science/genetics) "eXg" = ( /obj/effect/turf_decal/trimline/neutral/warning{ dir = 1 }, /obj/effect/decal/cleanable/dirt, +/obj/structure/railing/corner/end{ + dir = 1 + }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) "eXi" = ( @@ -19258,37 +19055,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"eXn" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 8 - }, -/obj/machinery/door/window/left/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/wood, -/area/station/science/research/abandoned) "eXp" = ( /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/textured_large, /area/station/medical/chemistry) -"eXs" = ( -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/machinery/holopad, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "eXy" = ( /turf/closed/wall, /area/station/science/breakroom) @@ -19297,11 +19067,6 @@ /obj/structure/closet/emcloset/anchored, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port/aft) -"eXI" = ( -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/lavendergrass/style_random, -/turf/open/floor/grass, -/area/station/security/courtroom) "eXL" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "ai_sat" @@ -19313,6 +19078,20 @@ /obj/effect/mapping_helpers/airlock/access/any/command/minisat, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat) +"eXR" = ( +/obj/effect/turf_decal/trimline/brown/arrow_cw{ + dir = 1 + }, +/obj/machinery/door/firedoor/heavy, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/mid_joiner{ + dir = 1 + }, +/turf/open/floor/iron/textured_large, +/area/station/cargo/miningdock) "eXT" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -19362,6 +19141,23 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark, /area/station/security/brig) +"eYL" = ( +/obj/structure/table/reinforced, +/obj/item/mmi{ + pixel_x = -5; + pixel_y = 8 + }, +/obj/item/mmi{ + pixel_y = 4 + }, +/obj/item/mmi{ + pixel_x = 5 + }, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/robotics/lab) "eYN" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -19411,24 +19207,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/floor4/port/fore) -"eZH" = ( -/obj/machinery/rnd/production/techfab/department/service, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) -"eZN" = ( -/obj/structure/table, -/obj/item/folder/white, -/obj/item/folder/yellow{ - pixel_x = 4; - pixel_y = 2 - }, -/obj/item/folder/red{ - pixel_x = -3; - pixel_y = 4 - }, -/turf/open/floor/iron/smooth_edge, -/area/station/science/research/abandoned) "eZQ" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -19481,11 +19259,6 @@ /obj/machinery/disposal/bin, /turf/open/floor/iron/dark, /area/station/security/checkpoint/first) -"faE" = ( -/obj/structure/tank_holder/emergency_oxygen, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "faL" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate/freezer, @@ -19514,22 +19287,28 @@ }, /turf/open/floor/iron/dark, /area/station/commons/storage/tools) -"faW" = ( -/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) +"fbd" = ( +/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/red/directional/west, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/starboard) "fbe" = ( /obj/structure/disposalpipe/trunk/multiz/down{ dir = 1 }, /turf/open/openspace, /area/station/science/xenobiology/hallway) +"fbl" = ( +/obj/machinery/power/smes, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/station/engineering/gravity_generator) "fbo" = ( /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 @@ -19537,16 +19316,6 @@ /obj/structure/rack, /turf/open/floor/iron/dark, /area/station/security/brig) -"fbq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/structure/table/glass, -/obj/item/storage/box/syringes{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/reagent_containers/dropper, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "fbt" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 5 @@ -19598,13 +19367,6 @@ /obj/effect/spawner/random/structure/girder, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"fcf" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark/textured, -/area/station/commons/fitness) "fcp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/machinery/meter, @@ -19618,6 +19380,9 @@ }, /obj/machinery/door/firedoor/border_only, /obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, /turf/open/floor/pod/light, /area/station/maintenance/floor2/starboard) "fcC" = ( @@ -19634,11 +19399,13 @@ }, /turf/open/floor/engine/n2o, /area/station/engineering/atmos) -"fdk" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/hallway/floor1/aft) +"fdp" = ( +/obj/effect/turf_decal/stripes, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "fdr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -19668,10 +19435,6 @@ dir = 9 }, /area/station/command/bridge) -"fdV" = ( -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) "fdW" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -19689,14 +19452,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/floor3/starboard/aft) -"feh" = ( -/obj/effect/turf_decal/trimline/white/arrow_ccw, -/obj/machinery/camera/autoname/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/secondary/entry) "fey" = ( /obj/effect/turf_decal/trimline/yellow/warning, /obj/machinery/button/elevator/directional/west{ @@ -19708,13 +19463,13 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/floor1/fore) -"feF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/effect/turf_decal/stripes/end{ +"feP" = ( +/obj/effect/turf_decal/trimline/purple/line, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, /turf/open/floor/iron/white, -/area/station/science/xenobiology) +/area/station/science/cytology) "feR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/side{ @@ -19724,39 +19479,22 @@ "feX" = ( /turf/open/openspace, /area/station/hallway/floor2/fore) -"feZ" = ( -/obj/machinery/firealarm/directional/west, -/obj/machinery/light/directional/north, -/obj/machinery/camera{ - c_tag = "Atmospherics Cam #4"; - dir = 8; - network = list("ss13","engine") - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "ffb" = ( /turf/open/floor/iron, /area/station/service/hydroponics/garden) "ffe" = ( /turf/closed/wall/r_wall, /area/station/security/holding_cell) -"ffh" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 1 - }, -/obj/machinery/airalarm/directional/south, -/obj/structure/table, -/obj/item/dest_tagger{ - pixel_x = 7; - pixel_y = 5 +"ffi" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 4 }, -/obj/item/folder/yellow, -/turf/open/floor/iron/smooth, -/area/station/cargo/office) +/obj/structure/table/glass, +/obj/item/cultivator, +/obj/item/stack/cable_coil, +/obj/item/clothing/glasses/science, +/turf/open/floor/iron/white, +/area/station/science/cytology) "ffv" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 @@ -19867,6 +19605,19 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/carpet/purple, /area/station/commons/dorms/apartment1) +"fho" = ( +/obj/machinery/computer/crew{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/port) +"fhp" = ( +/obj/effect/turf_decal/trimline/blue/warning{ + dir = 1 + }, +/obj/effect/spawner/random/structure/tank_holder, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor2/port) "fhr" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -19893,7 +19644,6 @@ /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/dark, /area/station/medical/virology) "fhA" = ( @@ -19916,24 +19666,19 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/dark, /area/station/security/courtroom) +"fhN" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/floor/grass, +/area/station/medical/virology) "fhO" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port/aft) -"fhT" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/delivery, -/obj/structure/sign/poster/official/random/directional/west, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/storage/primary) -"fhW" = ( -/obj/structure/chair/sofa/corner/brown{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/hallway/secondary/entry) "fhZ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -19941,6 +19686,11 @@ /obj/structure/cable, /turf/open/floor/iron/dark/side, /area/station/hallway/floor1/fore) +"fij" = ( +/obj/effect/spawner/structure/window/hollow/middle, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard) "fio" = ( /obj/structure/railing/corner, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -19948,15 +19698,23 @@ }, /turf/open/floor/wood/tile, /area/station/service/library) -"fiu" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/carpet/red, -/area/station/commons/dorms/room1) +"fiw" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/hallway/floor4/aft) "fiz" = ( /obj/effect/decal/cleanable/dirt, /obj/item/stack/tile/light, /turf/open/floor/carpet/neon/simple/pink/nodots, /area/station/maintenance/floor2/port/fore) +"fiA" = ( +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "fiI" = ( /obj/structure/closet, /obj/effect/turf_decal/trimline/green/line{ @@ -20005,13 +19763,6 @@ }, /turf/open/floor/iron/white/small, /area/station/medical/chemistry) -"fjk" = ( -/obj/machinery/light/directional/south, -/obj/structure/chair/sofa/middle/brown{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/hallway/secondary/entry) "fjo" = ( /turf/open/floor/iron/dark/side{ dir = 1 @@ -20055,6 +19806,14 @@ }, /turf/open/floor/wood, /area/station/hallway/secondary/entry) +"fjF" = ( +/obj/effect/spawner/random/engineering/tank, +/obj/effect/turf_decal/trimline/dark_blue/end{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/commons/storage/tools) "fjG" = ( /obj/machinery/computer/atmos_control/nitrogen_tank, /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ @@ -20085,17 +19844,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/detectives_office/private_investigators_office) -"fkd" = ( -/obj/effect/turf_decal/trimline/green/line, -/obj/effect/turf_decal/trimline/green/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/turf/open/floor/iron/dark, -/area/station/hallway/floor3/fore) "fkf" = ( /obj/effect/spawner/random/vending/colavend, /turf/open/floor/iron/dark, @@ -20194,23 +19942,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/psychology) -"flg" = ( -/obj/structure/rack, -/obj/item/stock_parts/micro_laser{ - pixel_y = 7 - }, -/obj/item/stock_parts/cell/high{ - pixel_x = -4; - pixel_y = -6 - }, -/obj/item/vending_refill/wardrobe/science_wardrobe{ - pixel_y = 18 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 +"fli" = ( +/obj/structure/railing/corner{ + dir = 1 }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/duct, /turf/open/floor/iron/white, -/area/station/science/lower) +/area/station/science/xenobiology) "flk" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/thinplating_new{ @@ -20250,22 +19990,17 @@ "flS" = ( /turf/open/floor/carpet/orange, /area/station/service/chapel/office) +"flX" = ( +/obj/item/radio/intercom/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) "fmb" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/structure/grille, /turf/open/floor/plating, /area/station/maintenance/floor1/port) -"fmf" = ( -/obj/effect/turf_decal/trimline/red/warning{ - dir = 5 - }, -/obj/structure/railing{ - dir = 4 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/pod/dark, -/area/station/hallway/secondary/entry) "fmg" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, @@ -20289,10 +20024,6 @@ pixel_x = -2; pixel_y = 4 }, -/obj/item/stamp/head/hop{ - pixel_x = -4; - pixel_y = 4 - }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) "fmE" = ( @@ -20305,6 +20036,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor3/port/fore) +"fmG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/airalarm/directional/west, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hos) "fmK" = ( /obj/structure/mirror/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -20313,17 +20052,6 @@ /obj/structure/sink/directional/west, /turf/open/floor/iron, /area/station/commons/toilet) -"fmL" = ( -/obj/machinery/light/directional/west, -/obj/structure/table/wood, -/obj/effect/spawner/random/entertainment/cigar, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/machinery/newscaster/directional/west, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/iron/checker, -/area/station/service/bar/atrium) "fmN" = ( /obj/effect/spawner/structure/electrified_grille, /turf/open/floor/pod/light, @@ -20337,15 +20065,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor1/starboard/aft) -"fmQ" = ( -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/light/cold/no_nightlight/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) "fna" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -20359,31 +20078,12 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) -"fnf" = ( -/obj/effect/turf_decal/trimline/green/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/green/line{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor3/fore) -"fns" = ( -/obj/structure/lattice, -/obj/effect/spawner/random/maintenance, -/turf/open/openspace, -/area/station/maintenance/floor3/starboard) "fnB" = ( /obj/effect/turf_decal/bot, /obj/machinery/light/small/directional/west, /obj/machinery/hydroponics/constructable, /turf/open/floor/iron/dark, /area/station/service/hydroponics/garden) -"fnJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/griddle, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen/abandoned) "fnL" = ( /obj/machinery/status_display/evac/directional/north, /obj/machinery/power/terminal{ @@ -20402,6 +20102,16 @@ "fnM" = ( /turf/open/floor/catwalk_floor/iron_dark, /area/station/maintenance/floor3/starboard/fore) +"fnO" = ( +/obj/effect/turf_decal/trimline/red/warning{ + dir = 5 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/pod/dark, +/area/station/hallway/secondary/entry) "fnS" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ dir = 8 @@ -20503,6 +20213,12 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"foT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/station/commons/dorms/apartment1) "fpb" = ( /obj/structure/table/wood, /turf/open/floor/carpet/green, @@ -20514,16 +20230,18 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) -"fpk" = ( -/obj/structure/filingcabinet, -/obj/structure/filingcabinet, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/iron/dark/smooth_large, -/area/station/service/library/printer) "fpn" = ( /obj/structure/chair/office, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) +"fpp" = ( +/obj/structure/table/wood, +/obj/item/paint_palette, +/obj/item/paint_palette, +/obj/item/paint_palette, +/obj/machinery/light/directional/north, +/turf/open/floor/bamboo/tatami/black, +/area/station/commons/storage/art) "fps" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, @@ -20555,13 +20273,6 @@ }, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat/service) -"fpK" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 6 - }, -/obj/machinery/light/cold/no_nightlight/directional/east, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "fpN" = ( /obj/effect/turf_decal/stripes, /obj/effect/mapping_helpers/broken_floor, @@ -20637,6 +20348,29 @@ /obj/structure/sign/poster/random/directional/west, /turf/open/floor/catwalk_floor/iron, /area/station/cargo/miningdock) +"frv" = ( +/obj/effect/turf_decal/box/corners, +/turf/open/floor/engine{ + initial_gas_mix = "o2=22;bz=82;TEMP=293.15" + }, +/area/station/science/xenobiology) +"frw" = ( +/obj/effect/turf_decal/siding/wideplating_new{ + dir = 8 + }, +/obj/machinery/plumbing/input{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) +"fry" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/hallway/floor3/fore) "frz" = ( /obj/effect/turf_decal/tile/green/opposingcorners, /obj/structure/rack, @@ -20647,28 +20381,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/virology) -"frD" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 8 - }, -/obj/item/radio/intercom/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Science - Cytology - Deck 3" - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"frE" = ( -/obj/effect/turf_decal/trimline/blue/line{ - dir = 4 - }, -/obj/machinery/light/small/blacklight/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server/upper) "frL" = ( /turf/closed/wall, /area/station/engineering/gravity_generator) @@ -20699,11 +20411,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) -"fsp" = ( -/obj/machinery/light/directional/west, -/obj/structure/flora/bush/lavendergrass/style_random, -/turf/open/floor/grass, -/area/station/security/courtroom) "fst" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -20715,6 +20422,9 @@ /obj/structure/girder/displaced, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) +"fsv" = ( +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) "fsD" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -20746,13 +20456,6 @@ dir = 1 }, /area/station/hallway/floor4/fore) -"fti" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) "ftp" = ( /obj/structure/table, /obj/item/grenade/chem_grenade/antiweed, @@ -20789,6 +20492,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria, /area/station/security/prison) +"ftv" = ( +/obj/effect/turf_decal/trimline/green/line, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1 + }, +/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/dark, +/area/station/hallway/floor3/aft) "ftD" = ( /obj/structure/table/reinforced/rglass, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -20806,21 +20519,12 @@ }, /turf/open/floor/iron/checker, /area/station/commons/vacant_room/commissary) -"ftN" = ( -/obj/effect/turf_decal/trimline/white/arrow_ccw, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/secondary/entry) -"ftW" = ( -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ +"ftT" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/side{ dir = 4 }, -/turf/open/floor/wood/parquet, -/area/station/service/lawoffice) +/area/station/hallway/floor2/aft) "ftZ" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -20850,12 +20554,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) -"fuD" = ( -/obj/effect/turf_decal/tile/blue/full, -/obj/structure/table/glass, -/obj/item/storage/box/hug/medical, -/turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) "fuH" = ( /obj/effect/turf_decal/trimline/green/warning{ dir = 4 @@ -20905,21 +20603,19 @@ /obj/machinery/shieldgen, /turf/open/floor/iron/smooth, /area/station/cargo/warehouse) -"fvp" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/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/wood, -/area/station/service/kitchen/diner) "fvr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/side{ dir = 8 }, /area/station/hallway/floor1/fore) +"fvx" = ( +/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, +/turf/open/floor/iron, +/area/station/hallway/floor3/aft) "fvy" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /obj/effect/turf_decal/trimline/red, @@ -20939,14 +20635,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) -"fvI" = ( -/obj/effect/turf_decal/trimline/green/corner{ - dir = 1 - }, -/obj/structure/closet/secure_closet/personal, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white/small, -/area/station/commons/fitness/recreation) "fvJ" = ( /obj/effect/turf_decal/siding/white{ dir = 8 @@ -20957,16 +20645,6 @@ /obj/structure/sign/departments/cargo/directional/west, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/floor1/aft) -"fvP" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/obj/item/clothing/gloves/color/yellow, -/turf/open/floor/iron/dark/textured_corner{ - dir = 1 - }, -/area/station/engineering/lobby) -"fvR" = ( -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) "fvS" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -20993,6 +20671,12 @@ }, /turf/open/floor/wood, /area/station/commons/vacant_room/office) +"fwj" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/command/teleporter) "fws" = ( /obj/machinery/button/door/directional/north{ id = "radshutsouth" @@ -21000,27 +20684,6 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"fww" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 1; - piping_layer = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/pumproom) -"fwC" = ( -/obj/machinery/light/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron, -/area/station/security/range) -"fwF" = ( -/obj/effect/turf_decal/trimline/blue/corner, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server/upper) "fwJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/spawner/random/trash/graffiti{ @@ -21055,24 +20718,6 @@ dir = 1 }, /area/station/service/chapel) -"fxa" = ( -/obj/effect/turf_decal/trimline/red/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/line{ - dir = 8 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/aft) -"fxc" = ( -/obj/machinery/camera/autoname/directional/north, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/structure/mannequin/skeleton, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "fxd" = ( /obj/structure/closet/firecloset, /obj/effect/decal/cleanable/dirt, @@ -21089,17 +20734,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/atmos) -"fxC" = ( -/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/yellow/line, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/aft) +"fxG" = ( +/obj/machinery/vending/cola/pwr_game, +/turf/open/floor/eighties, +/area/station/commons/fitness/recreation/entertainment) "fxI" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -21111,18 +20749,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/tile, /area/station/service/chapel/office) -"fxM" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/heavy, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) "fxS" = ( /obj/effect/landmark/carpspawn, /turf/open/space/basic, @@ -21147,32 +20773,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, /area/station/cargo/drone_bay) -"fyp" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/structure/table, -/obj/item/storage/box/monkeycubes{ - pixel_x = 6; - pixel_y = 9 - }, -/obj/item/storage/box/gloves{ - pixel_x = 5; - pixel_y = 1 - }, -/obj/item/radio/headset/headset_medsci{ - pixel_x = -7; - pixel_y = 4 - }, -/obj/machinery/airalarm/directional/north, -/obj/item/sequence_scanner{ - pixel_x = -2; - pixel_y = -1 - }, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "fyQ" = ( /obj/effect/turf_decal/trimline/red/warning{ dir = 1 @@ -21183,20 +20783,13 @@ /area/station/hallway/floor1/aft) "fyT" = ( /obj/structure/cable, -/obj/machinery/modular_computer/console/preset/engineering{ +/obj/machinery/modular_computer/preset/engineering{ dir = 8 }, /obj/machinery/light_switch/directional/north, /obj/machinery/newscaster/directional/east, /turf/open/floor/iron/dark, /area/station/engineering/gravity_generator) -"fzf" = ( -/obj/machinery/computer/crew{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/port) "fzr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21233,6 +20826,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor2/starboard) +"fzL" = ( +/obj/effect/turf_decal/trimline/yellow/corner, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/hallway/floor1/fore) "fzR" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "aband_armour"; @@ -21276,14 +20879,9 @@ /obj/effect/turf_decal/trimline/yellow/corner{ dir = 1 }, -/obj/item/stock_parts/matter_bin{ - pixel_x = 2; - pixel_y = -5 - }, -/obj/item/stock_parts/micro_laser{ - pixel_y = 7 - }, -/obj/item/trash/boritos/green, +/obj/item/mod/module/plasma_stabilizer, +/obj/item/mod/module/signlang_radio, +/obj/item/mod/module/thermal_regulator, /turf/open/floor/iron/corner{ dir = 1 }, @@ -21302,13 +20900,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/escape_pod) -"fAw" = ( -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/delivery, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/floor2/port/aft) "fAz" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -21347,15 +20938,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port) -"fBd" = ( -/obj/structure/rack, -/obj/effect/spawner/random/bureaucracy/briefcase{ - spawn_loot_count = 2; - spawn_loot_split = 1 - }, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "fBf" = ( /obj/effect/turf_decal/trimline/yellow/warning, /obj/machinery/button/elevator/directional/east{ @@ -21389,14 +20971,17 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/carpet/blue, /area/station/command/heads_quarters/hop) -"fBy" = ( -/obj/structure/railing{ +"fBA" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/turf_decal/trimline/white/filled/line{ + color = "#065C93" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/dark/side{ dir = 1 }, -/obj/structure/railing, -/obj/effect/turf_decal/stripes/box, -/turf/open/floor/pod/light, -/area/station/science/cytology) +/area/station/command/bridge) "fBM" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, @@ -21437,12 +21022,13 @@ /turf/open/floor/plating/airless, /area/space) "fCw" = ( -/obj/effect/turf_decal/stripes{ - dir = 4 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 }, -/obj/structure/disposalpipe/trunk/multiz, -/turf/open/floor/plating, -/area/station/maintenance/floor1/starboard/fore) +/obj/machinery/holopad, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "fCx" = ( /obj/structure/rack, /turf/open/floor/pod/dark, @@ -21526,13 +21112,6 @@ }, /turf/open/floor/plating, /area/station/security/prison/work) -"fCY" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/science/genetics) "fDq" = ( /obj/structure/sign/poster/contraband/atmosia_independence/directional/west, /turf/open/floor/pod/light, @@ -21543,6 +21122,20 @@ }, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"fDA" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/ai_slipper{ + uses = 10 + }, +/turf/open/floor/iron/dark, +/area/station/security/brig) "fDF" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 10 @@ -21617,6 +21210,10 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"fEn" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor2/fore) "fEp" = ( /obj/machinery/door/airlock/public/glass{ name = "Worship Hall" @@ -21629,13 +21226,6 @@ /obj/effect/decal/cleanable/robot_debris/down, /turf/open/floor/engine, /area/station/maintenance/floor4/starboard/aft) -"fEu" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "fEv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21656,21 +21246,11 @@ /obj/machinery/door/firedoor/heavy, /turf/open/floor/bamboo/tatami/black, /area/station/commons/storage/art) -"fEI" = ( -/obj/effect/turf_decal/trimline/purple/arrow_ccw, -/obj/effect/turf_decal/trimline/green/arrow_cw{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/miningdock) "fES" = ( /obj/effect/turf_decal/siding/white{ dir = 8 }, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, /turf/open/floor/iron/dark/textured, /area/station/medical/office) @@ -21683,15 +21263,6 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/floor3/fore) -"fFj" = ( -/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, -/obj/machinery/firealarm/directional/south, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "fFo" = ( /obj/structure/closet/firecloset/full, /turf/open/floor/iron, @@ -21738,12 +21309,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/carpet/orange, /area/station/command/heads_quarters/qm) -"fFR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "fFY" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -21810,6 +21375,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/aft) +"fGP" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "fGW" = ( /obj/effect/turf_decal/tile/green/full, /obj/structure/rack, @@ -21838,7 +21409,6 @@ /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/dark/textured, /area/station/hallway/floor2/aft) "fHe" = ( @@ -21888,14 +21458,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port/aft) -"fHG" = ( -/obj/machinery/atmospherics/components/binary/pump/layer4{ - name = "Distro to External Ports" - }, -/obj/machinery/light/directional/east, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos) "fHM" = ( /obj/machinery/light/small/red/directional/east, /turf/open/floor/pod/light, @@ -21925,6 +21487,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"fIs" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/aft) "fIv" = ( /obj/item/clothing/gloves/color/yellow, /obj/item/storage/toolbox/electrical{ @@ -22024,6 +21599,13 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos/pumproom) +"fJy" = ( +/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/floor, +/turf/open/floor/iron, +/area/station/hallway/floor1/aft) "fJz" = ( /obj/effect/decal/cleanable/cobweb, /obj/effect/decal/cleanable/dirt, @@ -22042,6 +21624,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible/layer4, /turf/open/floor/plating, /area/station/engineering/supermatter) +"fJT" = ( +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "fJU" = ( /obj/structure/bodycontainer/morgue{ dir = 8 @@ -22059,14 +21649,6 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) -"fKb" = ( -/obj/structure/closet/crate/internals, -/obj/effect/turf_decal/trimline/dark_blue/end{ - dir = 8 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/station/commons/storage/tools) "fKd" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/window/reinforced/spawner/directional/south, @@ -22079,6 +21661,12 @@ "fKi" = ( /turf/open/floor/iron/textured_large, /area/station/engineering/gravity_generator) +"fKr" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/station/command/heads_quarters/rd) "fKs" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -22086,14 +21674,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) -"fKA" = ( -/obj/machinery/light/directional/east, -/obj/machinery/computer/department_orders/service{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "fKC" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -22101,12 +21681,6 @@ dir = 8 }, /area/station/medical/chemistry) -"fKD" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green, -/obj/machinery/light/directional/east, -/turf/open/floor/wood, -/area/station/command/meeting_room) "fKH" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/hidden/layer1{ dir = 4 @@ -22160,6 +21734,21 @@ /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on, /turf/open/floor/plating, /area/station/science/server) +"fLv" = ( +/obj/machinery/airalarm/directional/west, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/hallway/floor2/fore) +"fLx" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposaloutlet{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk, +/turf/open/space/openspace, +/area/space/nearstation) "fLz" = ( /obj/effect/turf_decal/stripes/end, /obj/effect/turf_decal/stripes/white/end, @@ -22169,10 +21758,6 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron/large, /area/station/command/gateway) -"fLI" = ( -/obj/machinery/light/cold/no_nightlight/directional/north, -/turf/open/floor/iron/dark, -/area/station/hallway/floor3/fore) "fLR" = ( /obj/effect/turf_decal/trimline/green/warning{ dir = 6 @@ -22213,6 +21798,18 @@ "fMs" = ( /turf/open/floor/plating/airless, /area/station/maintenance/floor3/port/aft) +"fMu" = ( +/obj/structure/girder/reinforced, +/obj/structure/cable, +/obj/effect/spawner/structure/window/hollow/reinforced/plasma/middle{ + dir = 4 + }, +/obj/machinery/door/poddoor/preopen{ + id = "Xenolab"; + name = "Test Chamber Blast Door" + }, +/turf/open/floor/plating, +/area/station/science/cytology) "fMB" = ( /obj/effect/turf_decal/trimline/red/line{ dir = 8 @@ -22221,17 +21818,6 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) -"fMC" = ( -/obj/item/radio/intercom/directional/west, -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/turf/open/floor/iron/smooth_large, -/area/station/maintenance/radshelter/sci) -"fME" = ( -/obj/structure/closet/boxinggloves, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) "fMY" = ( /obj/effect/turf_decal/tile/green/full, /obj/structure/railing/corner{ @@ -22280,6 +21866,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/ordnance/testlab) +"fNy" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 5 + }, +/obj/machinery/status_display/ai/directional/west, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/floor1/fore) "fNA" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -22293,6 +21889,14 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, /area/station/engineering/gravity_generator) +"fNL" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/hallway/floor4/aft) "fNT" = ( /turf/closed/wall, /area/station/hallway/floor2/fore) @@ -22302,13 +21906,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/prison/garden) -"fNW" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/iron/textured_large, -/area/station/cargo/storage) "fNY" = ( /obj/effect/decal/cleanable/robot_debris/up, /turf/open/floor/iron/dark, @@ -22338,17 +21935,6 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron, /area/station/science/robotics/lab) -"fOl" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/effect/turf_decal/trimline/white/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/white/line{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) "fOq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -22379,6 +21965,15 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/cafeteria, /area/station/commons/locker) +"fOB" = ( +/obj/structure/chair/plastic, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) +"fOH" = ( +/obj/machinery/monkey_recycler, +/turf/open/floor/circuit, +/area/station/science/xenobiology) "fOI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -22473,10 +22068,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/commons/locker) -"fQh" = ( -/obj/machinery/light/cold/directional/south, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/service) "fQi" = ( /obj/effect/turf_decal/trimline/green/line, /obj/machinery/door/firedoor/border_only{ @@ -22525,16 +22116,18 @@ }, /turf/open/floor/iron/dark, /area/station/security/office) -"fQG" = ( -/obj/structure/table/wood, -/obj/item/paper/fluff/ids_for_dummies, -/obj/machinery/light/small/directional/north, -/obj/machinery/newscaster/directional/north, -/obj/item/storage/crayons{ - pixel_x = 16 +"fQF" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/ai_monitored/command/storage/eva) "fQH" = ( /obj/structure/cable, /obj/machinery/door/window/brigdoor/left/directional/south{ @@ -22545,16 +22138,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"fQI" = ( -/obj/machinery/light/cold/no_nightlight/directional/east, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor3/fore) -"fQJ" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/turf/open/floor/plating/airless, -/area/space/nearstation) "fQQ" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -22579,16 +22162,6 @@ /obj/effect/turf_decal/trimline/neutral/filled/corner, /turf/open/floor/iron, /area/station/hallway/floor2/fore) -"fRc" = ( -/obj/machinery/computer/scan_consolenew, -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "fRd" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/effect/turf_decal/trimline/neutral/filled/corner{ @@ -22677,13 +22250,6 @@ }, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) -"fRV" = ( -/obj/effect/turf_decal/trimline/green/filled/line, -/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/commons/vacant_room/commissary) "fSi" = ( /obj/structure/table/reinforced, /obj/item/paper_bin{ @@ -22713,6 +22279,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/engineering/gravity_generator) +"fSV" = ( +/obj/effect/turf_decal/trimline/purple/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/junction/yjunction, +/obj/structure/noticeboard/directional/north, +/turf/open/floor/iron/white, +/area/station/science/xenobiology/hallway) "fSX" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -22842,29 +22417,13 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/command/meeting_room) -"fUs" = ( -/obj/effect/turf_decal/siding/white{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"fUC" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ - dir = 5 - }, -/turf/open/floor/engine/airless, -/area/station/engineering/atmos/pumproom) -"fUD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"fUq" = ( /obj/structure/cable, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/navigate_destination/det, +/obj/structure/sign/poster/official/report_crimes/directional/west, +/turf/open/floor/wood, +/area/station/hallway/floor4/fore) "fUM" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -22896,21 +22455,6 @@ /obj/structure/sign/poster/random/directional/east, /turf/open/floor/iron, /area/station/service/hydroponics/garden/abandoned) -"fVh" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/cold/directional/west, -/obj/structure/sign/poster/official/random/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"fVk" = ( -/obj/effect/turf_decal/stripes{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) "fVq" = ( /obj/structure/chair/sofa/bench/right{ dir = 8 @@ -22941,11 +22485,6 @@ /obj/structure/grille/broken, /turf/open/floor/plating, /area/station/hallway/floor2/aft) -"fVT" = ( -/obj/machinery/computer/security, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/dark/textured, -/area/station/security/checkpoint/second) "fVV" = ( /turf/closed/wall, /area/station/service/chapel/funeral) @@ -22960,6 +22499,21 @@ /obj/machinery/camera/directional/south, /turf/open/floor/iron/dark, /area/station/medical/virology) +"fWc" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 1 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"fWf" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/engine/air, +/area/station/engineering/supermatter/waste) "fWh" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 5 @@ -22975,11 +22529,6 @@ /obj/machinery/duct, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) -"fWp" = ( -/obj/effect/turf_decal/bot, -/obj/structure/punching_bag, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) "fWr" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -23023,6 +22572,18 @@ /obj/structure/cable, /turf/open/floor/carpet/royalblue, /area/station/medical/break_room) +"fXd" = ( +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 8 + }, +/obj/machinery/modular_computer/preset/engineering{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/airalarm/directional/east, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/lobby) "fXm" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/brown{ @@ -23075,6 +22636,12 @@ /obj/machinery/door/firedoor, /turf/open/floor/plating, /area/station/engineering/atmos/office) +"fXR" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "fXU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -23327,6 +22894,16 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) +"gaJ" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/vending/wallmed/directional/east, +/obj/machinery/modular_computer/preset/civilian{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "gaL" = ( /turf/closed/wall, /area/station/medical/patients_rooms) @@ -23377,21 +22954,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"gby" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1 - }, -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/obj/effect/turf_decal/stripes{ - dir = 4 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Xenobiology" - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "gbL" = ( /obj/structure/chair/plastic{ dir = 4 @@ -23495,33 +23057,6 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/security/detectives_office) -"gcQ" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/hallway/floor1/aft) -"gcS" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/west, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/starboard) -"gcT" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/vending/clothing, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/white/herringbone, -/area/station/medical/patients_rooms) -"gdd" = ( -/mob/living/simple_animal/pet/penguin/emperor{ - desc = "Spaghetti."; - name = "Spaghetti" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "gdg" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 4 @@ -23531,17 +23066,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"gdk" = ( -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/ai_monitored/command/storage/eva) "gdm" = ( /obj/structure/reagent_dispensers/plumbed, /turf/open/floor/pod/light, @@ -23586,6 +23110,12 @@ /obj/effect/spawner/random/contraband/landmine, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) +"gdY" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/machinery/light/directional/north, +/turf/open/floor/grass, +/area/station/service/bar/atrium) "gdZ" = ( /obj/structure/cable, /obj/effect/landmark/navigate_destination/disposals, @@ -23598,6 +23128,7 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /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/floor2/starboard) "gec" = ( @@ -23625,10 +23156,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/wood/tile, /area/station/service/library) -"get" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall, -/area/station/maintenance/floor3/port/aft) "geA" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/item/kirbyplants/random, @@ -23659,13 +23186,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port) -"geW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/west, -/obj/machinery/status_display/ai/directional/west, -/turf/open/floor/iron, -/area/station/hallway/floor3/aft) "geY" = ( /turf/open/floor/iron/dark/side{ dir = 5 @@ -23690,10 +23210,12 @@ dir = 10 }, /area/station/hallway/floor4/fore) -"gfi" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/r_wall, -/area/station/medical/storage) +"gfg" = ( +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "gfn" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -23706,12 +23228,11 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/hallway/floor3/fore) -"gfI" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/light_switch/directional/east, -/obj/machinery/hydroponics/constructable, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden) +"gfD" = ( +/obj/machinery/atmospherics/pipe/multiz/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/multiz/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor2/aft) "gfP" = ( /obj/effect/turf_decal/siding/wood/end{ dir = 4 @@ -23781,6 +23302,15 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/cargo/storage) +"ggQ" = ( +/obj/effect/turf_decal/trimline/brown/arrow_cw{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "ggS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -23825,13 +23355,6 @@ }, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/disposal) -"ghz" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/firealarm/directional/west, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/hydroponics/constructable, -/turf/open/floor/iron/white, -/area/station/science/research/abandoned) "ghF" = ( /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 4 @@ -23860,10 +23383,6 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/carpet, /area/station/commons/vacant_room/office) -"ghR" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/wood, -/area/station/service/kitchen/diner) "ghZ" = ( /obj/structure/table, /obj/item/inspector{ @@ -23884,6 +23403,13 @@ /obj/effect/spawner/random/trash/mess, /turf/open/floor/engine, /area/station/maintenance/floor4/starboard/aft) +"gih" = ( +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard) "gip" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/status_display/ai/directional/south, @@ -23898,6 +23424,17 @@ /obj/item/food/boiledrice, /turf/open/floor/iron/kitchen/herringbone, /area/station/service/kitchen) +"giq" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/cable, +/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/item/radio/intercom/directional/south, +/turf/open/floor/iron, +/area/station/science/cytology) "gir" = ( /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/dark/side{ @@ -23916,14 +23453,11 @@ dir = 1 }, /area/station/command/heads_quarters/cmo) -"giM" = ( -/obj/machinery/airalarm/directional/west, -/obj/structure/table, -/obj/machinery/processor{ - pixel_y = 6 - }, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) +"giC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/floor1/port/fore) "giQ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -23935,6 +23469,18 @@ /obj/structure/grille, /turf/open/floor/plating, /area/station/maintenance/floor2/port/aft) +"gjb" = ( +/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, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/duct, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "gjd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -23954,10 +23500,6 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/pod/light, /area/station/maintenance/floor2/starboard/fore) -"gjm" = ( -/obj/effect/spawner/random/maintenance/two, -/turf/closed/wall/r_wall, -/area/station/maintenance/floor1/port) "gjn" = ( /obj/structure/table, /obj/item/stock_parts/matter_bin, @@ -23982,10 +23524,6 @@ /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/iron/dark/side, /area/station/hallway/floor1/fore) -"gjz" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) "gjC" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -24012,12 +23550,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"gkp" = ( -/obj/machinery/light/directional/east, -/obj/machinery/computer/apc_control, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/command/heads_quarters/ce) "gkq" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -24084,10 +23616,6 @@ /obj/structure/window/spawner/directional/south, /turf/open/floor/grass, /area/station/hallway/secondary/exit/departure_lounge) -"glt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark/side, -/area/station/commons/locker) "glu" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -24140,6 +23668,12 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"glW" = ( +/obj/structure/table, +/obj/item/toy/cards/deck, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "glY" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -24147,16 +23681,10 @@ /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) -"gme" = ( -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/engine, -/area/station/science/xenobiology) "gmg" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port/fore) "gmj" = ( @@ -24238,11 +23766,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/solars/port/aft) -"gmV" = ( -/obj/structure/chair/comfy/carp, -/obj/effect/decal/cleanable/glitter, -/turf/open/floor/carpet/neon/simple/pink/nodots, -/area/station/maintenance/floor2/port/fore) +"gmW" = ( +/obj/effect/turf_decal/trimline/brown/arrow_ccw, +/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/side, +/area/station/cargo/lobby) "gni" = ( /obj/structure/rack, /obj/effect/spawner/random/techstorage/arcade_boards, @@ -24268,6 +23798,7 @@ /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/pod/dark, /area/station/maintenance/floor2/starboard) "gnx" = ( @@ -24302,6 +23833,15 @@ /obj/machinery/duct, /turf/open/floor/iron/dark/side, /area/station/security/office) +"gnY" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/station_engineer, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/lobby) "goe" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -24321,17 +23861,6 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"gos" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/light/small/directional/west, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/port) -"got" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/carpet/royalblue, -/area/station/commons/dorms/room4) "goy" = ( /obj/structure/sign/poster/official/random/directional/north, /obj/item/wallframe/light_fixture{ @@ -24400,7 +23929,6 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor3/port/aft) "gpt" = ( -/obj/structure/cable, /obj/structure/lattice/catwalk, /turf/open/floor/plating/airless, /area/space/nearstation) @@ -24507,6 +24035,16 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/floor2/starboard/fore) +"gqU" = ( +/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/yellow/line, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) "gqV" = ( /obj/effect/turf_decal/tile/red/diagonal_edge, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24533,6 +24071,12 @@ /obj/effect/landmark/start/roboticist, /turf/open/floor/iron, /area/station/science/robotics/lab) +"grm" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "grv" = ( /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/dark/side{ @@ -24583,19 +24127,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) -"gsg" = ( -/obj/machinery/microwave{ - pixel_x = -3; - pixel_y = 6 - }, -/obj/structure/table, -/obj/machinery/light/directional/south, -/obj/structure/sign/poster/official/random/directional/south, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/office) "gsn" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/structure/chair/stool/bar/directional/east, @@ -24609,7 +24140,9 @@ dir = 4 }, /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/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/cargo/storage) "gsp" = ( @@ -24772,11 +24305,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_large, /area/station/cargo/storage) -"guA" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/effect/landmark/start/scientist, +"gup" = ( +/obj/structure/frame/machine{ + anchored = 1 + }, +/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, +/turf/open/floor/circuit, /area/station/science/cytology) "guF" = ( /obj/machinery/camera/autoname/directional/west, @@ -24801,11 +24336,11 @@ "guQ" = ( /turf/open/floor/engine/hull, /area/station/maintenance/floor1/starboard/aft) -"guV" = ( -/obj/machinery/newscaster/directional/north, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat) +"guT" = ( +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/machinery/light/cold/no_nightlight/directional/east, +/turf/open/floor/grass, +/area/station/science/genetics) "gvh" = ( /obj/machinery/vending/snack/blue, /obj/effect/turf_decal/siding/wood{ @@ -24813,14 +24348,10 @@ }, /turf/open/floor/iron/cafeteria, /area/station/service/theater) -"gvk" = ( -/obj/structure/cable, -/obj/structure/table/reinforced, -/obj/item/storage/fancy/donut_box, -/turf/open/floor/iron/half{ - dir = 1 - }, -/area/station/engineering/lobby) +"gvj" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/directional, +/turf/open/floor/plating, +/area/station/science/xenobiology) "gvn" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24840,6 +24371,13 @@ /obj/effect/turf_decal/trimline/blue/filled/corner, /turf/open/floor/iron/white, /area/station/medical/office) +"gvM" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/table, +/obj/item/folder/white, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/science/explab) "gvN" = ( /obj/effect/mapping_helpers/airlock/unres, /obj/machinery/door/firedoor, @@ -24872,9 +24410,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plastic, /area/station/security/prison/shower) -"gvW" = ( -/turf/closed/wall, -/area/station/science/cytology) "gvX" = ( /obj/structure/sign/poster/official/random/directional/east, /turf/open/floor/iron/dark/side{ @@ -24901,6 +24436,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) +"gws" = ( +/obj/structure/railing, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/station/science/cytology) "gwz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24911,11 +24453,6 @@ dir = 6 }, /area/station/hallway/floor2/aft) -"gwD" = ( -/obj/structure/frame/machine, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/circuit/telecomms, -/area/station/tcommsat/server/upper) "gwH" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -24924,11 +24461,14 @@ "gwL" = ( /turf/closed/wall, /area/station/maintenance/floor3/port/fore) -"gwS" = ( -/obj/structure/sign/poster/official/random/directional/east, -/obj/structure/chair/plastic, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) +"gwN" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/machinery/hydroponics/constructable{ + anchored = 0 + }, +/obj/machinery/light/small/broken/directional/south, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden/abandoned) "gwT" = ( /obj/structure/railing{ dir = 1 @@ -25003,12 +24543,6 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology/hallway) -"gxL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/crate_abandoned, -/turf/open/floor/plating, -/area/station/maintenance/floor2/port/aft) "gxP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25025,42 +24559,6 @@ }, /turf/open/floor/iron/dark, /area/station/commons/storage/tools) -"gxS" = ( -/obj/structure/table, -/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 = list("armory") - }, -/obj/machinery/button/flasher{ - id = "secentranceflasher"; - name = "Brig Entrance Flasher"; - pixel_y = -3; - req_access = list("armory") - }, -/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 = list("armory") - }, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/requests_console/directional/north{ - department = "Security"; - name = "Security Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/iron/dark, -/area/station/security/warden) "gxT" = ( /obj/structure/rack, /obj/effect/turf_decal/tile/yellow/half/contrasted, @@ -25081,6 +24579,11 @@ /obj/item/storage/box/mousetraps, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) +"gxX" = ( +/obj/structure/flora/bush/flowers_br/style_random, +/obj/machinery/light/floor, +/turf/open/floor/grass, +/area/station/medical/medbay/lobby) "gyd" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -25091,6 +24594,10 @@ /obj/structure/closet/crate/cardboard, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) +"gyf" = ( +/obj/machinery/firealarm/directional/west, +/turf/open/floor/carpet/royalblue, +/area/station/medical/break_room) "gyp" = ( /obj/structure/railing/corner{ dir = 4 @@ -25103,6 +24610,19 @@ "gyr" = ( /turf/closed/wall, /area/station/service/kitchen) +"gyu" = ( +/obj/effect/turf_decal/trimline/white/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/white/arrow_ccw, +/obj/effect/turf_decal/trimline/red/corner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/secondary/entry) "gyy" = ( /turf/open/floor/iron/dark/side, /area/station/hallway/floor2/aft) @@ -25123,15 +24643,15 @@ name = "padded floor" }, /area/station/medical/psychology) -"gyO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/grown/bananapeel, -/turf/open/floor/grass, -/area/station/medical/virology) "gyS" = ( /obj/machinery/light/red/dim/directional/west, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/aft) +"gyW" = ( +/obj/structure/weightmachine/weightlifter, +/obj/machinery/light/directional/east, +/turf/open/floor/noslip, +/area/station/commons/fitness) "gyX" = ( /obj/structure/chair/sofa/left/brown{ dir = 1 @@ -25177,20 +24697,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port) -"gzD" = ( -/obj/machinery/light/directional/west, -/obj/structure/flora/bush/sparsegrass/style_random, -/turf/open/floor/grass, -/area/station/security/courtroom) -"gzL" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/firealarm/directional/west, -/obj/structure/sink/directional/east, -/obj/machinery/light/cold/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "gzM" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -25212,6 +24718,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/tcommsat/computer) +"gzU" = ( +/obj/effect/decal/cleanable/garbage, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "gAd" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/structure/cable, @@ -25252,12 +24763,6 @@ dir = 8 }, /area/station/security/brig) -"gAp" = ( -/obj/effect/turf_decal/trimline/neutral/filled/end, -/obj/machinery/light/small/directional/south, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/iron, -/area/station/hallway/floor2/fore) "gAt" = ( /obj/structure/chair/sofa/bench/left{ dir = 8 @@ -25268,6 +24773,11 @@ /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/wood/tile, /area/station/service/library) +"gAD" = ( +/obj/structure/closet/secure_closet/personal/patient, +/obj/machinery/vending/wallmed/directional/south, +/turf/open/floor/iron/white, +/area/station/security/medical) "gAP" = ( /obj/item/reagent_containers/spray/syndicate, /obj/effect/decal/cleanable/dirt, @@ -25351,10 +24861,6 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/engineering/supermatter) -"gBI" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron/textured_large, -/area/station/cargo/storage) "gBK" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate{ @@ -25363,6 +24869,12 @@ /obj/effect/spawner/random/entertainment/plushie, /turf/open/floor/plating, /area/station/maintenance/floor1/port/fore) +"gBN" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/grass, +/area/station/science/cytology) "gBU" = ( /obj/item/radio/intercom/directional/north, /obj/structure/sign/poster/official/random/directional/west, @@ -25374,6 +24886,14 @@ dir = 9 }, /area/station/hallway/floor4/fore) +"gBV" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/obj/machinery/firealarm/directional/south, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "gBX" = ( /obj/effect/turf_decal/trimline/blue/corner, /obj/structure/window/spawner/directional/east, @@ -25392,13 +24912,6 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"gCm" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/red/dim/directional/south, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/starboard) "gCv" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -25430,6 +24943,13 @@ }, /turf/open/floor/iron, /area/station/hallway/floor2/aft) +"gCE" = ( +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/pod/dark, +/area/station/cargo/storage) "gCG" = ( /obj/structure/railing{ dir = 8 @@ -25448,6 +24968,13 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/starboard/fore) +"gCM" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/green/filled/arrow_cw{ + dir = 10 + }, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/floor2/aft) "gCP" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 @@ -25457,12 +24984,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"gCU" = ( -/obj/machinery/light/blacklight/directional/west, -/obj/item/stack/arcadeticket, -/obj/effect/decal/cleanable/confetti, -/turf/open/floor/eighties, -/area/station/commons/fitness/recreation/entertainment) "gCV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -25490,17 +25011,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/medical/medbay/central) -"gDN" = ( -/obj/machinery/keycard_auth/directional/west{ - pixel_y = -8 - }, -/obj/machinery/button/door/directional/west{ - id = "hosprivacy"; - name = "Privacy Shutters Control"; - pixel_y = 6 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hos) "gDO" = ( /obj/effect/decal/cleanable/blood/footprints{ dir = 4 @@ -25552,15 +25062,27 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/cmo) -"gEs" = ( -/obj/machinery/light/directional/south, -/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, -/turf/open/floor/iron, -/area/station/engineering/atmos) +"gEo" = ( +/obj/structure/table/reinforced, +/obj/item/stock_parts/cell/high, +/obj/machinery/cell_charger, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"gEv" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Genetics Lab" + }, +/obj/effect/turf_decal/siding/purple{ + dir = 10 + }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "gEB" = ( /obj/structure/railing{ dir = 8 @@ -25586,16 +25108,6 @@ /obj/effect/turf_decal/siding/white, /turf/open/floor/iron/dark/textured, /area/station/medical/cryo) -"gFb" = ( -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/noticeboard/directional/south, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/iron/white, -/area/station/science/cytology) "gFh" = ( /obj/effect/spawner/random/engineering/tank, /obj/effect/turf_decal/trimline/dark_blue/end{ @@ -25606,11 +25118,6 @@ "gFk" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/engine/atmos) -"gFq" = ( -/obj/machinery/light/directional/south, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) "gFy" = ( /obj/structure/weightmachine, /obj/effect/turf_decal/bot, @@ -25647,12 +25154,54 @@ /area/station/maintenance/floor2/starboard/aft) "gFU" = ( /obj/machinery/computer/exodrone_control_console, +/obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/dark, /area/station/cargo/drone_bay) "gGe" = ( /obj/machinery/telecomms/bus/preset_one, /turf/open/floor/circuit/telecomms, /area/station/tcommsat/server) +"gGi" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/line, +/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/iron/dark, +/area/station/hallway/floor4/aft) +"gGp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/commons/dorms/apartment1) +"gGr" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/line{ + dir = 8 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/aft) +"gGt" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ + dir = 4 + }, +/obj/effect/baseturf_helper/reinforced_plating/ceiling, +/turf/open/floor/engine/airless, +/area/station/engineering/supermatter/waste) "gGx" = ( /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -25706,23 +25255,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/checker, /area/station/cargo/miningdock) -"gGZ" = ( -/obj/effect/turf_decal/trimline/green/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/green/line{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor3/fore) -"gHh" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/flora/bush/lavendergrass/style_random, -/turf/open/floor/grass, -/area/station/service/bar/atrium) "gHi" = ( /obj/structure/table/wood, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25757,6 +25289,19 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/side, /area/station/hallway/floor4/fore) +"gHu" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/white/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "gHw" = ( /obj/machinery/exodrone_launcher, /obj/item/exodrone, @@ -25781,6 +25326,12 @@ /obj/structure/sign/warning/pods/directional/south, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port/aft) +"gHO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "gHU" = ( /obj/structure/rack, /obj/item/storage/box/syringes, @@ -25816,6 +25367,12 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor2/starboard) +"gIb" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "gId" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -25823,6 +25380,11 @@ /obj/structure/sign/warning/pods/directional/east, /turf/open/floor/eighties, /area/station/commons/fitness/recreation/entertainment) +"gIf" = ( +/obj/structure/sign/poster/official/random/directional/north, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, +/area/station/service/theater) "gIg" = ( /obj/structure/table/wood, /obj/item/airlock_painter/decal/tile{ @@ -25883,17 +25445,6 @@ /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/floor/grass, /area/station/security/courtroom) -"gIL" = ( -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 5 - }, -/obj/machinery/light/directional/west, -/obj/machinery/status_display/ai/directional/west, -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/floor1/fore) "gJg" = ( /obj/structure/chair/comfy/brown{ dir = 4 @@ -25912,6 +25463,16 @@ /obj/machinery/holopad, /turf/open/floor/iron/grimy, /area/station/science/xenobiology/hallway) +"gJp" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/flashlight/lamp{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/effect/spawner/random/entertainment/coin, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/carpet/black, +/area/station/hallway/secondary/service) "gJq" = ( /obj/effect/turf_decal/trimline/green/filled/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25919,6 +25480,14 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) +"gJr" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/camera/autoname/directional/west, +/obj/machinery/light/directional/west, +/turf/open/floor/wood, +/area/station/service/kitchen/diner) "gJs" = ( /obj/machinery/door/airlock/hatch{ name = "External Path Access" @@ -25947,7 +25516,7 @@ /area/station/maintenance/floor2/port/aft) "gJz" = ( /obj/effect/turf_decal/tile/green/opposingcorners, -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 1 }, /turf/open/floor/iron/white, @@ -25978,12 +25547,13 @@ /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"gJM" = ( -/obj/item/restraints/handcuffs/cable/zipties/used, -/obj/structure/table/optable, -/obj/effect/landmark/blobstart, +"gKa" = ( +/obj/effect/turf_decal/tile/dark/half/contrasted, +/obj/effect/turf_decal/tile/dark/half/contrasted, +/obj/structure/disposalpipe/segment, +/obj/machinery/firealarm/directional/east, /turf/open/floor/iron/white, -/area/station/maintenance/floor3/starboard/aft) +/area/station/science/xenobiology/hallway) "gKg" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, @@ -26032,6 +25602,14 @@ dir = 6 }, /area/station/hallway/floor1/fore) +"gKN" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/firealarm/directional/east, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/commons/locker) "gKO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -26042,16 +25620,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port/aft) -"gKR" = ( -/obj/effect/turf_decal/trimline/green/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/green/filled/corner{ - dir = 8 - }, -/obj/structure/reagent_dispensers/water_cooler, -/turf/open/floor/iron, -/area/station/hallway/floor3/fore) "gKV" = ( /obj/machinery/light/red/dim/directional/east, /turf/open/floor/pod/dark, @@ -26071,13 +25639,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/floor3/aft) -"gLg" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/cold/directional/west, -/obj/item/reagent_containers/cup/beaker/large, -/obj/item/reagent_containers/dropper, -/turf/open/floor/iron/dark/textured, -/area/station/medical/pharmacy) "gLA" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -26097,15 +25658,6 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plating, /area/station/maintenance/floor2/port/fore) -"gLF" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 5 - }, -/obj/machinery/chem_master/condimaster, -/obj/machinery/light/directional/north, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron/dark/smooth_large, -/area/station/service/bar) "gLI" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26117,13 +25669,19 @@ dir = 1 }, /area/station/hallway/floor2/fore) -"gMd" = ( -/obj/effect/turf_decal/trimline/blue/line{ - dir = 1 +"gLK" = ( +/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/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server/upper) +/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/mining/aux_base) "gMe" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -26141,6 +25699,13 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) +"gMi" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen/fountain, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain) "gMo" = ( /obj/structure/rack, /obj/item/gun/energy/ionrifle, @@ -26170,11 +25735,6 @@ /obj/machinery/duct, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) -"gMG" = ( -/obj/machinery/light/directional/south, -/obj/machinery/status_display/ai/directional/south, -/turf/open/floor/wood, -/area/station/command/meeting_room) "gMQ" = ( /obj/structure/cable/multilayer/multiz, /obj/effect/turf_decal/stripes/box, @@ -26191,12 +25751,6 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/pod/light, /area/station/maintenance/department/engine/atmos) -"gNd" = ( -/obj/structure/table/wood, -/obj/structure/sign/poster/official/random/directional/east, -/obj/item/storage/fancy/donut_box, -/turf/open/floor/wood, -/area/station/command/meeting_room) "gNi" = ( /obj/machinery/conveyor{ dir = 4; @@ -26213,21 +25767,6 @@ /obj/item/reagent_containers/spray/cleaner, /turf/open/floor/carpet/royalblue, /area/station/medical/break_room) -"gNq" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/status_display/ai/directional/west, -/turf/open/floor/iron, -/area/station/engineering/lobby) -"gNs" = ( -/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/cyborg, -/obj/structure/cable/layer3, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat) "gNN" = ( /turf/open/floor/pod/dark, /area/station/maintenance/floor1/starboard) @@ -26236,6 +25775,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/fakebasalt, /area/station/maintenance/floor3/port) +"gNU" = ( +/obj/machinery/modular_computer/preset/id, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/qm) "gOd" = ( /obj/effect/turf_decal/bot, /obj/machinery/camera/autoname/directional/west, @@ -26293,6 +25836,13 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) +"gOZ" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable, +/obj/machinery/chem_mass_spec, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) "gPb" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 9 @@ -26332,25 +25882,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port) -"gPN" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood{ - 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/wood/tile, -/area/station/service/library) "gPR" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Bulkhead" @@ -26365,13 +25896,20 @@ /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port/fore) "gQa" = ( -/obj/machinery/light/directional/south, -/obj/structure/disposalpipe/segment{ +/obj/machinery/firealarm/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/engineering/canister, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor3/starboard) +"gQh" = ( +/obj/effect/turf_decal/trimline/red/line{ dir = 4 }, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor2/fore) +/obj/effect/turf_decal/trimline/red/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/aft) "gQx" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -26421,6 +25959,13 @@ name = "padded floor" }, /area/station/medical/psychology) +"gQO" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/floor3/aft) "gQU" = ( /obj/structure/table/wood, /obj/machinery/coffeemaker/impressa, @@ -26444,6 +25989,11 @@ dir = 9 }, /area/station/hallway/floor1/aft) +"gRh" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/starboard) "gRj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26451,18 +26001,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/fore) -"gRl" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 9 - }, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/service/janitor) "gRw" = ( /obj/machinery/atmospherics/pipe/smart/simple/supply/visible/layer4{ dir = 10 @@ -26490,15 +26028,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet/green, /area/station/service/abandoned_gambling_den) -"gRJ" = ( -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer2{ - dir = 8 - }, -/turf/closed/wall/r_wall, -/area/station/engineering/atmos/pumproom) "gRQ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/broken/directional/west, @@ -26507,14 +26036,6 @@ }, /turf/open/floor/pod/dark, /area/station/service/kitchen/abandoned) -"gRT" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/structure/table, -/obj/item/folder/white, -/obj/structure/cable, -/obj/machinery/light/cold/no_nightlight/directional/east, -/turf/open/floor/iron/white, -/area/station/science/explab) "gRW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -26527,6 +26048,11 @@ /obj/effect/mapping_helpers/airalarm/engine_access, /turf/open/floor/engine, /area/station/engineering/supermatter) +"gSf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/supermatter/room) "gSj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26573,6 +26099,14 @@ /obj/machinery/duct, /turf/open/floor/iron/dark/textured, /area/station/medical/medbay/central) +"gSD" = ( +/obj/structure/rack, +/obj/structure/sign/poster/official/random/directional/east, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/effect/spawner/random/armory/bulletproof_armor, +/obj/effect/spawner/random/armory/bulletproof_helmet, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "gSS" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, @@ -26638,6 +26172,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) +"gTT" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 10 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/service/hydroponics) "gTW" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer2{ dir = 5 @@ -26657,14 +26198,6 @@ /obj/effect/spawner/random/trash/grille_or_waste, /turf/open/floor/plating, /area/station/maintenance/floor2/starboard/aft) -"gUg" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) "gUp" = ( /obj/effect/turf_decal/siding/thinplating_new{ dir = 4 @@ -26674,32 +26207,16 @@ }, /turf/open/floor/wood, /area/station/hallway/secondary/entry) -"gUr" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 6 - }, -/obj/machinery/computer/records/security{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/obj/machinery/status_display/evac/directional/south, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "gUs" = ( /turf/open/floor/engine/air, /area/station/engineering/atmos) -"gUD" = ( -/obj/effect/turf_decal/siding/white/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 5 - }, -/obj/effect/turf_decal/siding/white{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) +"gUH" = ( +/obj/effect/turf_decal/bot, +/obj/structure/rack, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/effect/spawner/random/armory/laser_gun, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "gUO" = ( /obj/structure/rack, /obj/effect/turf_decal/tile/purple, @@ -26743,6 +26260,7 @@ dir = 8 }, /obj/machinery/recharge_station, +/obj/machinery/digital_clock/directional/north, /turf/open/floor/iron, /area/station/cargo/storage) "gVw" = ( @@ -26776,6 +26294,17 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/grass, /area/station/service/chapel) +"gWg" = ( +/obj/effect/turf_decal/trimline/green/line, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1 + }, +/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/hallway/floor3/fore) "gWj" = ( /obj/structure/weightmachine/weightlifter, /obj/effect/turf_decal/bot, @@ -26845,6 +26374,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"gXd" = ( +/obj/machinery/camera/autoname/directional/north, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/structure/table/reinforced/rglass, +/obj/item/surgery_tray/full/morgue, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "gXi" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -26872,23 +26411,17 @@ /obj/structure/flora/bush/grassy/style_random, /turf/open/floor/grass, /area/station/service/library/garden) -"gXx" = ( -/obj/structure/cable, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/trimline/white/arrow_ccw{ - dir = 4 - }, -/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/dark, -/area/station/hallway/secondary/entry) "gXG" = ( /obj/structure/chair/sofa/bench{ dir = 4 }, /turf/open/floor/iron/textured_large, /area/station/hallway/secondary/exit/departure_lounge) +"gXH" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "gXM" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26930,6 +26463,14 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/station/solars/port/aft) +"gYc" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/structure/table/reinforced/rglass, +/obj/item/screwdriver, +/turf/open/floor/iron/large, +/area/station/science/robotics/lab) "gYe" = ( /obj/structure/table, /obj/item/paper_bin, @@ -26982,7 +26523,7 @@ "gYI" = ( /obj/structure/fluff{ desc = "What, you think the water just magically soaks into the metallic flooring?"; - icon = 'icons/obj/lavaland/survival_pod.dmi'; + icon = 'icons/obj/mining_zones/survival_pod.dmi'; icon_state = "fan_tiny"; name = "shower drain" }, @@ -27042,12 +26583,6 @@ }, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) -"gZJ" = ( -/obj/structure/closet/secure_closet/captains, -/obj/item/camera, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/wood/tile, -/area/station/command/heads_quarters/captain/private) "gZL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -27064,21 +26599,23 @@ /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/iron, /area/station/engineering/atmos) -"hae" = ( -/obj/effect/decal/cleanable/oil, -/obj/structure/sign/poster/official/random/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "hah" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/smooth_corner{ dir = 4 }, /area/station/cargo/miningdock) +"hai" = ( +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/structure/rack, +/obj/item/stack/sheet/iron/ten, +/obj/item/circuitboard/machine/exoscanner, +/obj/item/circuitboard/machine/exoscanner, +/obj/item/circuitboard/machine/exoscanner, +/turf/open/floor/iron/corner, +/area/station/cargo/drone_bay) "haj" = ( /obj/effect/landmark/start/psychologist, /turf/open/floor/iron/white/small{ @@ -27112,9 +26649,21 @@ /obj/item/flashlight/lamp/green, /turf/open/floor/wood/tile, /area/station/service/library) +"haB" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/iv_drip, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/white/herringbone, +/area/station/medical/patients_rooms) "haK" = ( /turf/open/floor/plating, /area/station/engineering/lobby) +"haL" = ( +/obj/structure/flora/bush/flowers_pp/style_random, +/obj/machinery/light/cold/no_nightlight/directional/west, +/turf/open/floor/grass, +/area/station/science/genetics) "haS" = ( /obj/structure/fluff/paper/stack{ desc = "A stack of various papers, absolutely unreadable due to scorch marks and aging."; @@ -27192,18 +26741,13 @@ /obj/effect/spawner/random/structure/tank_holder, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/fore) -"hbr" = ( -/obj/machinery/atmospherics/components/binary/valve/layer2{ - name = "scrubbers access" - }, -/obj/machinery/atmospherics/components/binary/valve/layer4{ - name = "distro access" - }, -/obj/effect/turf_decal/stripes/end{ - dir = 8 +"hbs" = ( +/obj/effect/turf_decal/trimline/green/corner{ + dir = 1 }, -/turf/open/floor/plating, -/area/station/science/cytology) +/obj/structure/closet/secure_closet/personal, +/turf/open/floor/iron/white/small, +/area/station/commons/fitness/recreation) "hbw" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -27357,36 +26901,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) -"hdJ" = ( -/obj/machinery/light/directional/south, -/turf/open/openspace, -/area/station/service/library) -"hdK" = ( -/obj/structure/rack, -/obj/item/clothing/suit/armor/riot{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/suit/armor/riot, -/obj/item/clothing/suit/armor/riot{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/shield/riot{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/shield/riot, -/obj/item/shield/riot{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "hdL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -27431,15 +26945,29 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard) -"heh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +"hem" = ( +/obj/effect/turf_decal/trimline/brown/arrow_ccw{ + dir = 8 }, -/obj/effect/turf_decal/stripes/white/line{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/cargo/lobby) +"hep" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer4{ dir = 1 }, -/turf/open/floor/iron/half, -/area/station/command/gateway) +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ + dir = 10 + }, +/turf/open/floor/engine/airless, +/area/station/engineering/supermatter/waste) "heq" = ( /obj/machinery/light/red/dim/directional/north, /turf/open/floor/plating/foam, @@ -27455,14 +26983,19 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor3/fore) -"heP" = ( -/obj/structure/window/spawner/directional/south, -/obj/structure/bed/roller, -/obj/structure/sign/gym/mirrored/right{ - pixel_y = 32 +"heC" = ( +/obj/structure/rack, +/obj/effect/spawner/random/clothing/costume, +/obj/item/clothing/mask/balaclava, +/turf/open/floor/iron/dark, +/area/station/commons/locker) +"heF" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 }, -/turf/open/floor/iron/dark/textured, -/area/station/commons/fitness) +/obj/machinery/hydroponics/constructable, +/turf/open/floor/iron, +/area/station/service/hydroponics) "heR" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -27492,13 +27025,6 @@ name = "boxing ring" }, /area/station/commons/fitness) -"heZ" = ( -/obj/machinery/modular_computer/console/preset/id{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hos) "hfb" = ( /obj/effect/spawner/structure/window/hollow/middle{ dir = 4 @@ -27508,7 +27034,7 @@ /turf/open/floor/plating, /area/station/maintenance/floor3/starboard) "hfd" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/white, @@ -27522,19 +27048,6 @@ "hfm" = ( /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/aft) -"hfo" = ( -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 9 - }, -/obj/machinery/light/directional/east, -/obj/machinery/status_display/ai/directional/east, -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/hallway/floor1/aft) "hfy" = ( /obj/structure/bed/double, /obj/item/bedsheet/dorms_double, @@ -27551,6 +27064,17 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard) +"hfC" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/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) "hfD" = ( /obj/machinery/atmospherics/components/binary/pump, /turf/open/floor/plating, @@ -27575,26 +27099,12 @@ "hge" = ( /turf/open/floor/engine, /area/station/command/heads_quarters/rd) -"hgi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "hgn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/spawner/random/maintenance, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard/fore) -"hgp" = ( -/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 = 1 - }, -/area/station/hallway/floor2/aft) "hgB" = ( /obj/effect/turf_decal/trimline/green/warning, /obj/effect/turf_decal/stripes, @@ -27650,20 +27160,16 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) -"hgU" = ( -/obj/effect/turf_decal/stripes{ +"hhb" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ dir = 4 }, -/obj/machinery/button/door/directional/south{ - id = "mine_bhz_lock"; - name = "Biohazard Lockdown"; - normaldoorcontrol = 1; - pixel_x = -6; - specialfunctions = 4 +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ + dir = 4 }, -/obj/structure/closet/wardrobe/miner, -/turf/open/floor/iron/smooth_large, -/area/station/cargo/miningoffice) +/obj/machinery/light/cold/directional/north, +/turf/open/floor/engine/airless, +/area/station/engineering/supermatter/waste) "hhf" = ( /obj/structure/cable, /turf/open/floor/catwalk_floor, @@ -27734,6 +27240,11 @@ /obj/effect/spawner/random/medical/surgery_tool, /turf/open/floor/pod/light, /area/station/maintenance/department/engine/atmos) +"hid" = ( +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/hallway/floor4/aft) "hio" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ dir = 4 @@ -27762,11 +27273,13 @@ /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/pod/light, /area/station/maintenance/department/engine/atmos) -"hiN" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron, -/area/station/security/prison) +"hiJ" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/bot, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark/smooth_large, +/area/station/science/robotics/mechbay) "hiQ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -27797,12 +27310,6 @@ /obj/structure/cable, /turf/open/floor/wood/tile, /area/station/service/library) -"hjo" = ( -/obj/effect/spawner/random/structure/tank_holder, -/obj/effect/turf_decal/trimline/purple/warning, -/obj/effect/turf_decal/stripes, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor2/starboard) "hjr" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, @@ -27835,6 +27342,15 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /turf/open/space/basic, /area/space/nearstation) +"hjF" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/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/wood/tile, +/area/station/service/library) "hjH" = ( /obj/structure/chair/comfy, /obj/effect/turf_decal/trimline/red/filled/line, @@ -27847,6 +27363,15 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/medical/psychology) +"hjN" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "hjP" = ( /obj/structure/chair/office{ dir = 4 @@ -27864,6 +27389,7 @@ /obj/effect/turf_decal/tile/red/anticorner{ dir = 4 }, +/obj/vehicle/ridden/secway, /turf/open/floor/iron/dark, /area/station/security/eva) "hke" = ( @@ -27872,15 +27398,6 @@ dir = 1 }, /area/station/hallway/floor1/aft) -"hkj" = ( -/obj/structure/bed/dogbed/renault, -/mob/living/simple_animal/pet/fox/renault, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/west, -/obj/structure/cable, -/turf/open/floor/wood/tile, -/area/station/command/heads_quarters/captain/private) "hkk" = ( /obj/structure/railing{ dir = 4 @@ -27888,6 +27405,15 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/catwalk_floor, /area/station/hallway/floor2/fore) +"hko" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/green/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor3/fore) "hkq" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmos) @@ -27906,6 +27432,18 @@ }, /turf/open/floor/iron/white, /area/station/science/lab) +"hkV" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/green/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor3/fore) "hkZ" = ( /obj/machinery/door/airlock{ name = "Service Hall" @@ -27933,20 +27471,12 @@ /area/station/service/hydroponics) "hlG" = ( /obj/structure/closet/mini_fridge{ - desc = "A small contraption designed to imbue a few drinks with a pleasant chill."; - name = "mini-fridge"; pixel_x = 6; pixel_y = 5 }, /obj/structure/table, /turf/open/floor/iron/checker, /area/station/commons/dorms/apartment2) -"hlM" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/hallway/floor2/fore) "hlP" = ( /obj/machinery/button/door/directional/north{ id = "mechbay"; @@ -27955,6 +27485,14 @@ }, /turf/open/floor/iron/smooth_large, /area/station/science/robotics/mechbay) +"hlU" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/wood/tile, +/area/station/service/library) "hlX" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/effect/landmark/start/assistant, @@ -28016,6 +27554,13 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/dark/side, /area/station/hallway/floor1/aft) +"hmM" = ( +/obj/effect/turf_decal/tile/neutral/full, +/obj/machinery/portable_atmospherics/pump, +/obj/effect/turf_decal/bot, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/science/ordnance/testlab) "hmN" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -28071,7 +27616,7 @@ /obj/effect/turf_decal/trimline/neutral/warning{ dir = 8 }, -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 8 }, /obj/effect/turf_decal/bot_white, @@ -28110,13 +27655,13 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white/textured, /area/station/medical/break_room) -"hnK" = ( -/obj/machinery/camera/autoname/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"hnL" = ( +/obj/structure/table/reinforced, +/obj/item/flashlight/lamp, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/station/science/research/abandoned) +/area/station/maintenance/floor2/port/aft) "hnS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -28177,10 +27722,14 @@ dir = 8 }, /area/station/hallway/floor2/aft) -"hou" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/disposal) +"hoo" = ( +/obj/effect/turf_decal/siding/white/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "hoy" = ( /obj/structure/table/reinforced, /obj/item/paper_bin{ @@ -28214,6 +27763,13 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) +"hoM" = ( +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/security/glass{ + name = "Security Entrance" + }, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/floor2/starboard/aft) "hoW" = ( /obj/machinery/door/airlock/silver/glass{ name = "Kitchen" @@ -28221,16 +27777,6 @@ /obj/effect/mapping_helpers/airlock/access/any/service/kitchen, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) -"hoX" = ( -/obj/effect/decal/cleanable/dirt, -/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, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "hpc" = ( /obj/effect/turf_decal/box/white, /obj/effect/turf_decal/arrows/white{ @@ -28280,6 +27826,11 @@ dir = 8 }, /area/station/hallway/secondary/exit) +"hpz" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) "hpF" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, @@ -28327,23 +27878,12 @@ }, /turf/open/floor/carpet/red, /area/station/service/library/lounge) -"hqF" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/obj/machinery/button/door/directional/west{ - id = "surg_a_privacy"; - name = "Surgery Privacy Shutters"; - req_access = list("medical") - }, -/obj/machinery/light_switch/directional/west{ - pixel_x = -24; - pixel_y = -10 +"hqD" = ( +/obj/machinery/atmospherics/components/unary/passive_vent{ + name = "killroom vent" }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/fore) +/turf/open/floor/engine/hull/reinforced, +/area/station/science/xenobiology) "hqG" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -28362,6 +27902,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/starboard) +"hrc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/green/half{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/hallway/secondary/exit/escape_pod) "hre" = ( /obj/machinery/vending/wardrobe/law_wardrobe, /turf/open/floor/iron/dark/corner{ @@ -28407,14 +27958,11 @@ /obj/structure/sign/poster/contraband/syndicate_pistol, /turf/closed/wall, /area/station/maintenance/floor3/port/aft) -"hrO" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/atmospherics, -/obj/item/t_scanner, -/obj/item/storage/belt/utility, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/engineering/atmos/office) +"hrL" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "hse" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -28564,9 +28112,12 @@ /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port/fore) "htK" = ( -/obj/effect/spawner/random/maintenance, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/starboard/fore) +/obj/machinery/netpod, +/obj/structure/railing{ + layer = 3.1 + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/bitrunning/den) "htW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron, @@ -28578,6 +28129,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/science/robotics/lab) +"hug" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/machinery/duct, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/captain/private) "huh" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 @@ -28596,28 +28154,16 @@ /obj/structure/stairs/east, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) -"hux" = ( -/obj/item/radio/intercom/directional/south{ - broadcasting = 1; - frequency = 1447; - listening = 0; - name = "Private Channel" +"huz" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/reagent_dispensers/plumbed{ + dir = 8 }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) -"huA" = ( -/obj/effect/turf_decal/trimline/red/line{ +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/turf_decal/trimline/red/line, -/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/iron/dark, -/area/station/hallway/floor4/aft) +/turf/open/floor/plating, +/area/station/science/genetics) "huJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -28717,13 +28263,6 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/fore) -"hvN" = ( -/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 = 1 - }, -/area/station/security/checkpoint) "hvY" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 4 @@ -28777,17 +28316,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/carpet/red, /area/station/service/theater) -"hwB" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/obj/machinery/newscaster/directional/east, -/obj/machinery/light/directional/east, -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "hwL" = ( /obj/structure/chair/office{ dir = 1 @@ -28806,6 +28334,15 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) +"hwN" = ( +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/turretid{ + control_area = "/area/station/ai_monitored/turret_protected/aisat_interior"; + name = "Antechamber Turret Control"; + pixel_y = -32 + }, +/turf/open/openspace, +/area/station/ai_monitored/turret_protected/aisat/service) "hwQ" = ( /obj/effect/turf_decal/tile/green/opposingcorners, /turf/open/floor/iron/white, @@ -28833,29 +28370,13 @@ /obj/machinery/shower/directional/south, /turf/open/floor/iron/white, /area/station/command/heads_quarters/rd) -"hxt" = ( -/obj/structure/table, -/obj/machinery/button/ticket_machine{ - pixel_x = -32 - }, -/obj/item/flashlight/lamp, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hop) -"hxu" = ( -/obj/machinery/light/blacklight/directional/east, -/obj/item/stack/arcadeticket, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/turf/open/floor/eighties, -/area/station/commons/fitness/recreation/entertainment) -"hxv" = ( -/obj/machinery/computer/crew{ - dir = 8 - }, -/obj/structure/sign/painting/library{ - pixel_y = 32 +"hxy" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 }, -/turf/open/floor/iron/dark, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) "hxz" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -28905,16 +28426,6 @@ "hxP" = ( /turf/open/floor/carpet/royalblue, /area/station/commons/dorms/apartment2) -"hyo" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron/dark/corner{ - dir = 8 - }, -/area/station/cargo/lobby) "hyp" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -28929,6 +28440,13 @@ /obj/item/chair, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard) +"hyt" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron, +/area/station/hallway/floor2/aft) "hyx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -28978,11 +28496,28 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/commons/storage/tools) +"hzf" = ( +/obj/machinery/computer/rdconsole{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/science/lab) "hzu" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat) +"hzv" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk/multiz, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white, +/area/station/science/lobby) "hzE" = ( /obj/structure/chair/comfy/brown, /obj/effect/turf_decal/siding/wood/end{ @@ -29054,6 +28589,10 @@ dir = 8 }, /area/station/medical/chemistry) +"hzX" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/station/service/theater) "hAc" = ( /obj/effect/decal/cleanable/blood/tracks, /turf/open/floor/pod/light, @@ -29176,8 +28715,6 @@ /area/station/maintenance/floor2/port/aft) "hBR" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/broken/directional/north, -/obj/item/radio/intercom/directional/north, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/cargo/warehouse) "hBT" = ( @@ -29189,10 +28726,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/commons/locker) -"hBX" = ( -/mob/living/simple_animal/slime, -/turf/open/floor/grass, -/area/station/science/xenobiology) "hCh" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/trimline/blue/warning, @@ -29223,6 +28756,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor2/starboard/aft) +"hCD" = ( +/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, +/turf/open/floor/iron, +/area/station/engineering/atmos) "hCJ" = ( /obj/structure/railing/corner{ dir = 1 @@ -29235,6 +28776,21 @@ }, /turf/open/floor/iron, /area/station/maintenance/floor3/starboard/aft) +"hCK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/light/red/dim/directional/south, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor2/port/fore) +"hCM" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark/textured, +/area/station/commons/fitness) "hCT" = ( /obj/item/stack/sheet/iron/fifty, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -29242,10 +28798,28 @@ /obj/structure/table, /turf/open/floor/iron/dark, /area/station/commons/storage/primary) +"hCV" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/item/storage/pill_bottle/mutadone{ + pixel_x = -9 + }, +/obj/item/toy/figure/geneticist, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron, +/area/station/science/genetics) "hDa" = ( /obj/effect/turf_decal/stripes, /turf/open/floor/plating/elevatorshaft, /area/station/cargo/drone_bay) +"hDb" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/machinery/duct, +/turf/open/floor/grass, +/area/station/science/cytology) "hDf" = ( /obj/structure/cable, /turf/open/floor/iron/textured_large, @@ -29263,16 +28837,24 @@ /obj/structure/cable, /turf/open/floor/iron/white/small, /area/station/commons/fitness/recreation) -"hDC" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 +"hDI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/obj/machinery/camera/autoname/directional/west, -/obj/structure/sign/departments/psychology/directional/west{ - name = "Asylum Entrance" +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 10 }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +/obj/item/storage/toolbox/electrical{ + pixel_x = 3; + pixel_y = 1 + }, +/obj/item/clothing/glasses/welding{ + pixel_x = -1; + pixel_y = -3 + }, +/turf/open/floor/iron/white/smooth_large, +/area/station/science/robotics/lab) "hDK" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -29299,24 +28881,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/starboard/fore) -"hEA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/door/airlock/science/glass{ - name = "Slime Enrichment Center" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/science/xenobio, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "hED" = ( /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/warden) +"hEM" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Xenobio - Kill Room" + }, +/obj/structure/sign/warning/cold_temp/directional/east, +/turf/open/floor/engine/hull/reinforced, +/area/station/science/xenobiology) "hEO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29371,12 +28946,6 @@ dir = 8 }, /area/station/hallway/secondary/entry) -"hFr" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/hallway/floor1/aft) "hFA" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -29426,6 +28995,22 @@ /obj/effect/spawner/random/food_or_drink/donkpockets, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) +"hGa" = ( +/obj/machinery/light_switch/directional/south, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/command/meeting_room) +"hGj" = ( +/obj/effect/turf_decal/tile/blue/half{ + dir = 1 + }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/textured_edge{ + dir = 1 + }, +/area/station/medical/chemistry) "hGp" = ( /obj/structure/bookcase/random/reference, /turf/open/floor/wood/tile, @@ -29439,6 +29024,15 @@ /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/pod, /area/station/maintenance/floor4/port/fore) +"hGz" = ( +/obj/effect/turf_decal/tile/green/half, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/pods/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/secondary/exit/escape_pod) "hGA" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -29491,6 +29085,15 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/maintenance/floor2/starboard/fore) +"hHc" = ( +/obj/effect/turf_decal/trimline/green/filled/line, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/commons/vacant_room/commissary) "hHe" = ( /obj/structure/table/reinforced/rglass, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -29570,6 +29173,24 @@ "hIb" = ( /turf/closed/wall, /area/station/hallway/floor4/fore) +"hIe" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 10 + }, +/obj/machinery/status_display/ai/directional/east, +/turf/open/floor/iron, +/area/station/hallway/floor2/aft) +"hIj" = ( +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/machinery/exoscanner, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/corner{ + dir = 1 + }, +/area/station/cargo/drone_bay) "hIk" = ( /obj/effect/turf_decal/trimline/brown/warning{ dir = 8 @@ -29581,12 +29202,27 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) +"hIn" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/grass, +/area/station/science/genetics) "hIp" = ( /obj/item/skillchip/light_remover, /obj/structure/closet/crate, /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) +"hIB" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 9 + }, +/turf/open/floor/iron/large, +/area/station/command/gateway) "hII" = ( /obj/structure/chair/sofa/bench{ dir = 1 @@ -29673,6 +29309,13 @@ /obj/item/kirbyplants/random, /turf/open/floor/wood/large, /area/station/command/heads_quarters/hop) +"hJK" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/checker, +/area/station/commons/vacant_room/commissary) "hJP" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 @@ -29753,11 +29396,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard/aft) -"hKI" = ( -/obj/machinery/smartfridge/organ, -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/station/science/cytology) "hKN" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/qm) @@ -29815,6 +29453,22 @@ /obj/structure/sign/poster/official/random/directional/east, /turf/open/floor/iron/cafeteria, /area/station/commons/locker) +"hLo" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/carpet/red, +/area/station/service/theater) +"hLq" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hos) "hLs" = ( /obj/structure/cable, /turf/open/floor/iron/dark/smooth_half, @@ -29878,14 +29532,6 @@ "hMd" = ( /turf/closed/wall, /area/station/security/prison/visit) -"hMe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "hMg" = ( /obj/effect/turf_decal/trimline/blue/warning, /obj/structure/disposalpipe/segment, @@ -29909,11 +29555,12 @@ /obj/effect/spawner/random/food_or_drink/refreshing_beverage, /turf/open/floor/pod/light, /area/station/maintenance/solars/port/aft) -"hMw" = ( -/obj/machinery/light/directional/east, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +"hML" = ( +/obj/structure/railing{ + dir = 9 + }, +/turf/open/floor/grass, +/area/station/science/cytology) "hMU" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/contraband/random/directional/west, @@ -29922,15 +29569,6 @@ "hMV" = ( /turf/open/floor/iron/stairs/medium, /area/station/science/lobby) -"hMX" = ( -/obj/machinery/portable_atmospherics/canister/bz, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/end, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "hNf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29938,7 +29576,7 @@ /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/starboard/fore) "hNg" = ( -/obj/machinery/modular_computer/console/preset/cargochat/cargo{ +/obj/machinery/modular_computer/preset/cargochat/cargo{ dir = 1 }, /turf/open/floor/iron/textured_corner, @@ -29953,11 +29591,6 @@ /obj/structure/fans/tiny, /turf/open/floor/plating, /area/station/science/ordnance/storage) -"hNx" = ( -/obj/machinery/light/cold/no_nightlight/directional/south, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/iron/dark, -/area/station/hallway/floor3/fore) "hNz" = ( /obj/effect/turf_decal/tile/brown{ dir = 8 @@ -30009,13 +29642,6 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/carpet, /area/station/service/lawoffice) -"hOc" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) "hOs" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -30044,9 +29670,7 @@ }, /area/station/command/gateway) "hOP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/obj/structure/cable, -/obj/structure/sign/delamination_counter/directional/east, +/obj/machinery/incident_display/delam/directional/south, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "hOR" = ( @@ -30069,15 +29693,17 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"hOZ" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/power/shieldwallgen/xenobiologyaccess, -/turf/open/floor/iron/white, -/area/station/science/cytology) "hPf" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"hPk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/white, +/area/station/science/server) "hPl" = ( /obj/machinery/door/airlock/public/glass{ name = "Public Airlock" @@ -30094,6 +29720,18 @@ /obj/structure/ladder, /turf/open/floor/catwalk_floor, /area/station/hallway/floor1/fore) +"hPK" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/aft) +"hPL" = ( +/obj/machinery/airalarm/directional/west, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/hallway/floor3/fore) "hPX" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -30106,6 +29744,15 @@ /obj/item/healthanalyzer, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"hQg" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/segment, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/cargo/storage) "hQj" = ( /obj/machinery/door/airlock/hatch{ name = "MiniSat Access" @@ -30116,6 +29763,14 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/hallway) +"hQl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor2/starboard) "hQp" = ( /obj/structure/girder/reinforced, /obj/structure/cable, @@ -30124,17 +29779,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/engineering/storage/tcomms) -"hQq" = ( -/obj/structure/table/wood, -/obj/machinery/fax{ - fax_name = "Psychology Office"; - name = "Psychology Office Fax Machine" - }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/station/medical/psychology) "hQy" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmos/hfr_room) @@ -30165,9 +29809,6 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "viro" }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /turf/open/floor/iron/white, /area/station/medical/virology) "hQK" = ( @@ -30201,24 +29842,12 @@ /obj/effect/spawner/random/entertainment/money_small, /turf/open/floor/wood, /area/station/hallway/floor3/fore) -"hRc" = ( -/obj/structure/table/glass, -/obj/item/stack/sheet/mineral/plasma/five, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/circuit/telecomms, -/area/station/tcommsat/server/upper) "hRd" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/carpet/royalblue, /area/station/medical/break_room) -"hRf" = ( -/obj/structure/weightmachine/weightlifter, -/obj/effect/turf_decal/stripes, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/smooth_large, -/area/station/medical/psychology) "hRg" = ( /obj/structure/closet/secure_closet/hydroponics, /obj/effect/turf_decal/tile/green/full, @@ -30229,6 +29858,14 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) +"hRp" = ( +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "hRH" = ( /obj/structure/table, /turf/open/floor/iron/checker, @@ -30244,13 +29881,6 @@ dir = 4 }, /area/station/security/prison) -"hRO" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/junction{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/lower) "hRP" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 @@ -30304,6 +29934,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"hSD" = ( +/obj/structure/closet/secure_closet/hos, +/obj/machinery/button/door/directional/west{ + id = "hosprivacy"; + name = "Privacy Shutters Control"; + pixel_y = 6 + }, +/obj/machinery/keycard_auth/directional/west{ + pixel_y = -8 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hos) "hSH" = ( /obj/machinery/door/airlock{ id_tag = "CabinS"; @@ -30338,6 +29980,15 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/catwalk_floor, /area/station/hallway/floor2/fore) +"hSP" = ( +/obj/structure/railing/corner, +/obj/machinery/door/firedoor/border_only, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/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) "hSQ" = ( /obj/structure/filingcabinet/employment, /obj/machinery/status_display/ai/directional/east, @@ -30358,13 +30009,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/checker, /area/station/commons/vacant_room/commissary) -"hTf" = ( -/obj/effect/landmark/start/medical_doctor, -/obj/structure/chair{ - dir = 8 +"hTj" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 10 }, -/turf/open/floor/iron/checker, -/area/station/commons/vacant_room/commissary) +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "hTr" = ( /obj/structure/closet/firecloset/full, /obj/effect/decal/cleanable/dirt, @@ -30474,6 +30125,12 @@ /obj/effect/mapping_helpers/airlock/access/any/command/teleporter, /turf/open/floor/iron/dark, /area/station/command/teleporter) +"hUT" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/science/xenobiology) "hUX" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -30524,12 +30181,25 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/starboard) -"hWh" = ( -/obj/effect/turf_decal/box/corners{ +"hVK" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 8 }, -/turf/open/floor/engine, -/area/station/science/xenobiology) +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/science/lobby) +"hVZ" = ( +/obj/effect/turf_decal/trimline/white/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "hWn" = ( /obj/effect/spawner/random/vending/colavend, /turf/open/floor/iron/dark/side{ @@ -30543,11 +30213,6 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/dark, /area/station/hallway/floor4/fore) -"hWq" = ( -/obj/machinery/light/cold/no_nightlight/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/grass, -/area/station/science/genetics) "hWr" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/components/unary/passive_vent/layer2, @@ -30563,17 +30228,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/floor2/aft) -"hWB" = ( -/obj/structure/showcase/cyborg/old{ - dir = 4; - pixel_x = -9; - pixel_y = 2 - }, -/obj/machinery/camera/autoname/directional/west, -/obj/machinery/power/terminal, -/obj/structure/cable, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat_interior) "hWD" = ( /obj/effect/turf_decal/tile/green/half{ dir = 1 @@ -30582,6 +30236,15 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/textured_half, /area/station/hallway/secondary/entry) +"hWF" = ( +/obj/effect/turf_decal/trimline/purple/arrow_ccw, +/obj/effect/turf_decal/trimline/green/arrow_cw{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "hWG" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/structure/cable, @@ -30636,6 +30299,22 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard/aft) +"hXp" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/obj/structure/girder, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/turf/open/floor/engine/hull/reinforced, +/area/station/science/xenobiology) +"hXr" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 9 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/floor2/aft) "hXs" = ( /obj/structure/chair/plastic{ dir = 4 @@ -30644,7 +30323,7 @@ /turf/open/floor/iron/dark, /area/station/security/interrogation) "hXt" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, /turf/open/floor/iron/dark, /area/station/medical/morgue) @@ -30680,15 +30359,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/closed/wall/r_wall, /area/station/engineering/atmos) -"hXR" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "hYb" = ( /obj/machinery/light/small/red/directional/east, /turf/open/floor/catwalk_floor, @@ -30722,15 +30392,19 @@ /obj/structure/cable, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) -"hYB" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/table/reinforced/rglass, -/obj/item/storage/backpack/duffelbag/med/surgery, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, +"hYo" = ( +/obj/effect/landmark/navigate_destination/dockesc, +/obj/machinery/light/directional/west, +/obj/structure/sign/warning/docking/directional/west, /turf/open/floor/iron/dark, -/area/station/medical/morgue) +/area/station/hallway/secondary/exit/departure_lounge) +"hYz" = ( +/obj/structure/bed, +/obj/item/bedsheet, +/obj/effect/landmark/start/depsec/medical, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/textured, +/area/station/security/checkpoint/second) "hYN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -30746,24 +30420,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/first) -"hYU" = ( -/obj/effect/turf_decal/trimline/purple/corner{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/noticeboard/directional/north, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) -"hZe" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/wood/large, -/area/station/command/heads_quarters/hop) "hZm" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 1 @@ -30792,7 +30448,7 @@ /turf/open/floor/iron/dark, /area/station/commons/locker) "hZt" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 1 }, /obj/structure/cable, @@ -30818,6 +30474,28 @@ /obj/effect/turf_decal/siding/blue, /turf/open/floor/carpet/neon/simple/pink/nodots, /area/station/maintenance/floor2/port/fore) +"iaf" = ( +/obj/structure/table, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/item/knife/shiv, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/checker{ + dir = 1 + }, +/area/station/science/genetics) +"iag" = ( +/obj/machinery/computer/records/security{ + dir = 4 + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hop) +"iah" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/camera/autoname/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/chapel, +/area/station/service/chapel) "iaq" = ( /obj/machinery/light/cold/no_nightlight/directional/north, /obj/effect/turf_decal/trimline/purple/filled/line, @@ -30857,17 +30535,27 @@ /turf/open/floor/iron/dark, /area/station/commons/dorms/room4) "iaJ" = ( +/obj/machinery/netpod, +/obj/effect/decal/cleanable/vomit/old{ + pixel_x = -12; + pixel_y = -13 + }, +/obj/item/radio/intercom/directional/north, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/bitrunning/den) +"iaO" = ( /obj/structure/rack, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/starboard/fore) -"iaM" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 6 +/obj/structure/sign/nanotrasen{ + pixel_x = 32 }, -/obj/machinery/hydroponics/constructable, -/turf/open/floor/iron, -/area/station/service/hydroponics) +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/effect/spawner/random/armory/riot_armor, +/obj/effect/spawner/random/armory/riot_helmet, +/obj/effect/spawner/random/armory/riot_shield, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "iaS" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -30899,13 +30587,17 @@ "ibw" = ( /turf/closed/wall, /area/station/science/genetics) -"ibz" = ( -/turf/open/openspace, -/area/station/science/cytology) "ibE" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/floor1/aft) +"ibJ" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/light/cold/no_nightlight/directional/north, +/turf/open/floor/iron, +/area/station/hallway/floor2/aft) "ibK" = ( /obj/docking_port/stationary{ dir = 8; @@ -30917,6 +30609,18 @@ }, /turf/open/space/openspace, /area/space) +"ibL" = ( +/obj/structure/cable, +/obj/machinery/power/smes/engineering, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron, +/area/station/engineering/engine_smes) +"ibT" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/floor2/port/aft) "ibW" = ( /obj/machinery/camera/autoname/directional/west, /obj/structure/sign/departments/medbay/alt/directional/west, @@ -30992,12 +30696,22 @@ /obj/structure/ladder, /turf/open/floor/pod/light, /area/station/maintenance/floor2/starboard/fore) +"icE" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/box, +/turf/open/floor/iron/white, +/area/station/medical/psychology) "icY" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, /area/station/maintenance/floor3/starboard/fore) "idf" = ( -/mob/living/simple_animal/sloth/paperwork, +/mob/living/basic/sloth/paperwork, /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/brown{ dir = 4 @@ -31068,21 +30782,11 @@ }, /turf/open/floor/wood/tile, /area/station/service/library/lounge) -"idH" = ( -/obj/structure/table/glass, -/obj/item/hand_tele, -/turf/open/floor/iron/dark, -/area/station/command/teleporter) "idM" = ( /obj/structure/table, /obj/machinery/status_display/evac/directional/north, -/obj/item/paper_bin/construction{ - pixel_x = -6 - }, -/obj/item/paper_bin, -/obj/item/storage/box/pdas{ - pixel_x = 10 - }, +/obj/item/papercutter, +/obj/machinery/light/cold/directional/north, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) "iea" = ( @@ -31090,16 +30794,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard) -"ieu" = ( -/obj/structure/chair/stool/directional/north, -/obj/structure/railing{ - dir = 8 - }, -/obj/effect/turf_decal/siding/white{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/maintenance/solars/starboard/fore) "ieC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -31132,12 +30826,6 @@ /obj/structure/sign/poster/contraband/eat/directional/west, /turf/open/floor/carpet/royalblue, /area/station/medical/break_room) -"ieY" = ( -/obj/machinery/atmospherics/components/binary/valve/digital{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) "iff" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -31159,6 +30847,11 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor3/starboard) +"ifq" = ( +/obj/structure/sign/poster/official/random/directional/south, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/fore) "ift" = ( /obj/structure/closet/wardrobe/white, /obj/item/radio/intercom/directional/east, @@ -31209,6 +30902,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/gravity_generator) +"ifZ" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/stripes/white/line, +/turf/open/floor/iron/dark, +/area/station/science/circuits) "iga" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -31229,6 +30929,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) +"igw" = ( +/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/yjunction{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood/tile, +/area/station/command/heads_quarters/captain) "igy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -31256,36 +30966,17 @@ }, /turf/open/floor/iron, /area/station/hallway/floor1/aft) -"igR" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/arrows{ - dir = 1 - }, -/obj/structure/railing/corner{ +"igS" = ( +/obj/structure/table, +/obj/item/clothing/neck/tie/red, +/obj/item/clothing/under/suit/black_really/skirt, +/obj/structure/sign/poster/official/random/directional/south, +/obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/turf/open/floor/wood/tile, -/area/station/service/library/lounge) -"igX" = ( -/obj/machinery/light/cold/directional/north, -/obj/machinery/keycard_auth/directional/north{ - pixel_x = 9 - }, -/obj/machinery/button/door/directional/north{ - id = "cmo_privacy"; - name = "Robotics Privacy Control"; - pixel_x = -6; - pixel_y = 25; - req_access = list("cmo") - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/cmo) +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/cafeteria, +/area/station/commons/locker) "ihj" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/landmark/start/chemist, @@ -31333,19 +31024,6 @@ /obj/structure/closet/crate/engineering, /turf/open/floor/plating, /area/station/engineering/lobby) -"ihB" = ( -/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/access/any/engineering/general, -/obj/machinery/door/airlock/engineering{ - name = "Science Substation" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/turf/open/floor/iron/smooth_large, -/area/station/maintenance/floor2/starboard) "ihC" = ( /obj/item/stack/sheet/iron, /turf/open/floor/plating, @@ -31404,6 +31082,12 @@ }, /turf/open/floor/grass, /area/station/science/genetics) +"iil" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/status_display/ai/directional/west, +/turf/open/floor/iron, +/area/station/hallway/floor3/aft) "iim" = ( /obj/machinery/shower/directional/east, /turf/open/floor/iron/showroomfloor, @@ -31427,10 +31111,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/floor2/port) -"iiF" = ( -/obj/machinery/suit_storage_unit/captain, -/turf/open/floor/wood/tile, -/area/station/command/heads_quarters/captain/private) "iiQ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/green/line{ @@ -31446,6 +31126,19 @@ /obj/effect/spawner/random/maintenance/three, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/starboard/aft) +"iiT" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 4 + }, +/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, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) "iiW" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, @@ -31486,29 +31179,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/science/auxlab) -"ijU" = ( -/obj/machinery/atmospherics/components/binary/valve/layer2{ - name = "scrubbers access" - }, -/obj/machinery/atmospherics/components/binary/valve/layer4{ - name = "distro access" - }, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/box, -/turf/open/floor/plating, -/area/station/science/cytology) -"ijV" = ( -/obj/effect/landmark/start/quartermaster, -/obj/structure/bed/double/pod, -/obj/item/bedsheet/qm/double, -/obj/machinery/requests_console/directional/north{ - department = "Quartermaster's Desk"; - name = "Quartermaster's Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/supplies, -/turf/open/floor/carpet/orange, -/area/station/command/heads_quarters/qm) "ijX" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/hollow/directional, @@ -31558,17 +31228,6 @@ }, /turf/open/floor/iron/textured_large, /area/station/engineering/lobby) -"ikr" = ( -/obj/effect/landmark/navigate_destination/engineering, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron, -/area/station/hallway/floor1/aft) -"ikt" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/science/research/abandoned) "iky" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -31576,15 +31235,6 @@ /obj/structure/sign/poster/random/directional/east, /turf/open/floor/iron, /area/station/commons/toilet) -"ikF" = ( -/obj/effect/turf_decal/trimline/blue/corner{ - dir = 1 - }, -/obj/item/stack/cable_coil/five, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server/upper) "ikG" = ( /obj/effect/turf_decal/trimline/purple/warning{ dir = 8 @@ -31594,11 +31244,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port) -"ikM" = ( -/obj/effect/turf_decal/tile/blue/half/contrasted, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) "ikT" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/sofa/bench/left, @@ -31611,6 +31256,21 @@ /obj/structure/grille, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"ikY" = ( +/obj/structure/hedge, +/obj/machinery/light/cold/no_nightlight/directional/west, +/turf/open/floor/plating, +/area/station/science/genetics) +"ilb" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/white, +/area/station/science/xenobiology/hallway) "ilg" = ( /obj/structure/table/reinforced, /obj/machinery/reagentgrinder, @@ -31637,7 +31297,7 @@ /turf/open/floor/circuit/green/telecomms, /area/station/tcommsat/server) "ilx" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 8 }, /obj/machinery/newscaster/directional/east, @@ -31678,7 +31338,9 @@ "ilI" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/machinery/defibrillator_mount/directional/south, -/obj/structure/bed, +/obj/structure/bed/medical{ + dir = 4 + }, /turf/open/floor/iron/white/textured, /area/station/medical/treatment_center) "ilK" = ( @@ -31739,13 +31401,11 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/service) -"imx" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/science/research/abandoned) +"imt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille/broken, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/starboard/aft) "imI" = ( /obj/effect/turf_decal/trimline/blue/warning{ dir = 1 @@ -31764,6 +31424,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth_half, /area/station/cargo/warehouse) +"imR" = ( +/obj/structure/sign/poster/official/random/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor2/fore) "imS" = ( /obj/machinery/status_display/ai/directional/north, /turf/open/floor/circuit, @@ -31772,6 +31440,11 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/commons/fitness/recreation) +"imZ" = ( +/obj/structure/chair/sofa/bench/right, +/obj/machinery/light/directional/north, +/turf/open/floor/grass, +/area/station/service/library/garden) "inj" = ( /obj/machinery/computer/records/security{ dir = 1 @@ -31779,13 +31452,21 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/warden) +"inl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/turretid{ + icon_state = "control_stun"; + name = "AI Chamber turret control"; + pixel_x = 3; + pixel_y = -23 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai) "inq" = ( /turf/closed/wall, /area/station/security/checkpoint/escape) -"ins" = ( -/obj/structure/mop_bucket/janitorialcart, -/turf/open/floor/iron, -/area/station/service/janitor) "inE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -31795,10 +31476,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/aft) -"inG" = ( -/obj/effect/turf_decal/box/corners, -/turf/open/floor/engine, -/area/station/science/xenobiology) "inJ" = ( /obj/machinery/washing_machine, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -31807,23 +31484,15 @@ /turf/open/floor/iron/cafeteria, /area/station/commons/locker) "inK" = ( -/obj/structure/ladder, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server/upper) +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "inM" = ( /obj/structure/sign/poster/official/random/directional/west, /obj/machinery/camera/autoname/directional/west, /obj/item/kirbyplants/random, /turf/open/floor/wood, /area/station/hallway/secondary/entry) -"inO" = ( -/obj/machinery/light/directional/west, -/obj/structure/table, -/obj/machinery/recharger, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/warden) "inR" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 10 @@ -31832,6 +31501,11 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron, /area/station/hallway/floor1/fore) +"inS" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/aft) "iog" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -31847,16 +31521,12 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) "ioi" = ( -/obj/machinery/exoscanner, -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 +/obj/machinery/quantum_server, +/obj/effect/turf_decal/bot/left, +/turf/open/floor/iron/dark/smooth_corner{ + dir = 4 }, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron/corner, -/area/station/cargo/drone_bay) +/area/station/bitrunning/den) "iom" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -31870,6 +31540,27 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/starboard) +"ion" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/carpet, +/area/station/medical/psychology) +"iot" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/door/window/left/directional/west{ + name = "Xenocytology Desk"; + req_access = list("xenobiology") + }, +/obj/structure/desk_bell{ + pixel_x = 6; + pixel_y = 10 + }, +/turf/open/floor/iron, +/area/station/science/cytology) "iow" = ( /obj/structure/table/wood, /obj/structure/disposalpipe/segment{ @@ -31878,13 +31569,6 @@ /obj/machinery/computer/records/medical/laptop, /turf/open/floor/carpet, /area/station/security/detectives_office) -"ioD" = ( -/obj/effect/turf_decal/stripes, -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor2/starboard) "ioL" = ( /obj/effect/decal/cleanable/ash, /turf/open/floor/plating/foam, @@ -31940,14 +31624,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/security/prison) -"ipB" = ( -/obj/structure/sign/poster/official/random/directional/north, -/obj/effect/landmark/start/medical_doctor, -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/station/commons/vacant_room/commissary) +"ipI" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) "ipQ" = ( /obj/effect/spawner/random/vending/snackvend, /turf/open/floor/iron/dark, @@ -31982,6 +31665,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/tcommsat/server) +"iqu" = ( +/obj/effect/turf_decal/trimline/green/filled/corner, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/floor3/aft) "iqv" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32001,7 +31689,7 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) "iqy" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 4 }, /obj/machinery/button/door/directional/west{ @@ -32028,6 +31716,15 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat_interior) +"iqC" = ( +/obj/effect/turf_decal/siding/purple{ + dir = 4 + }, +/obj/machinery/dna_scannernew, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "iqD" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/portable_atmospherics/scrubber, @@ -32039,6 +31736,29 @@ }, /turf/open/floor/iron/dark, /area/station/security/lockers) +"ira" = ( +/obj/effect/turf_decal/bot, +/obj/structure/rack, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/effect/spawner/random/armory/shotgun, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"irb" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/rack, +/obj/item/mop, +/obj/item/reagent_containers/cup/bucket, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/item/storage/box/gloves{ + pixel_x = 5; + pixel_y = -8 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "irf" = ( /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/dark/side{ @@ -32065,11 +31785,35 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"irm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/suit_storage_unit/standard_unit, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "irp" = ( -/obj/effect/landmark/generic_maintenance_landmark, /obj/effect/baseturf_helper/reinforced_plating/ceiling, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"irx" = ( +/obj/machinery/door/window/left/directional/south{ + name = "Robotics Lab"; + req_access = list("robotics") + }, +/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/stairs{ + dir = 1 + }, +/area/station/science/robotics/mechbay) +"irI" = ( +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/machinery/status_display/ai/directional/east, +/turf/open/floor/iron/white, +/area/station/hallway/floor2/aft) "irK" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -32087,10 +31831,6 @@ }, /turf/open/floor/wood/large, /area/station/command/heads_quarters/qm) -"irT" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/carpet, -/area/station/commons/vacant_room/office) "irV" = ( /obj/effect/spawner/random/structure/grille, /turf/open/floor/pod/light, @@ -32120,16 +31860,6 @@ /obj/structure/railing/corner, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard/aft) -"isl" = ( -/obj/machinery/door/airlock/hatch{ - name = "Shelter" - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/maintenance/radshelter/sci) "isp" = ( /obj/machinery/computer/security/telescreen{ name = "\improper Engine Waste Monitor"; @@ -32181,13 +31911,6 @@ dir = 6 }, /area/station/hallway/secondary/exit) -"isM" = ( -/obj/effect/turf_decal/stripes, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/newscaster/directional/south, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/cytology) "isO" = ( /obj/machinery/firealarm/directional/south, /obj/effect/turf_decal/trimline/green/warning{ @@ -32221,13 +31944,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/second) -"itu" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) "ity" = ( /obj/structure/mirror/directional/east, /obj/structure/sink/directional/west, @@ -32313,6 +32029,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/item/mod/module/plasma_stabilizer, +/obj/item/mod/module/signlang_radio, +/obj/item/mod/module/thermal_regulator, /turf/open/floor/iron/dark, /area/station/security/eva) "iuE" = ( @@ -32364,6 +32083,12 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) +"ivo" = ( +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "ivs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32378,16 +32103,6 @@ dir = 8 }, /area/station/hallway/floor3/fore) -"ivA" = ( -/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, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/commons/vacant_room/commissary) "ivD" = ( /obj/effect/turf_decal/trimline/purple/line{ dir = 6 @@ -32440,26 +32155,6 @@ /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron/white, /area/station/command/heads_quarters/rd) -"iwf" = ( -/obj/machinery/light/directional/north, -/obj/structure/railing{ - dir = 4 - }, -/obj/effect/turf_decal/stripes{ - dir = 4 - }, -/obj/structure/chair/plastic, -/obj/effect/landmark/start/cargo_technician, -/turf/open/floor/iron, -/area/station/cargo/storage) -"iwh" = ( -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/structure/chair/stool/bar/directional/west, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/large, -/area/station/command/heads_quarters/rd) "iwj" = ( /turf/open/floor/iron/smooth_large, /area/station/science/robotics/mechbay) @@ -32473,6 +32168,13 @@ /obj/machinery/duct, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/starboard/fore) +"iwD" = ( +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "iwJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/stripes{ @@ -32481,6 +32183,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/psychology) +"iwN" = ( +/obj/structure/table/wood, +/obj/item/toy/plush/moth{ + desc = "Unique and incredibly special, just like you, love yourself."; + name = "Unique Moth" + }, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/carpet, +/area/station/medical/psychology) "iwP" = ( /obj/effect/turf_decal/trimline/purple/line, /obj/effect/turf_decal/trimline/purple/filled/corner{ @@ -32518,14 +32229,6 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/starboard/fore) -"ixr" = ( -/obj/structure/sign/poster/official/random/directional/north, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/light/cold/no_nightlight/directional/north, -/turf/open/floor/iron, -/area/station/hallway/floor2/aft) "ixD" = ( /turf/open/floor/plating, /area/station/maintenance/floor1/port/aft) @@ -32558,43 +32261,14 @@ dir = 1 }, /area/station/hallway/floor4/fore) -"iyr" = ( -/obj/structure/table, -/obj/item/clothing/neck/tie/red, -/obj/item/clothing/under/suit/black_really/skirt, -/obj/machinery/light/directional/south, -/obj/structure/sign/poster/official/random/directional/south, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) "iyt" = ( /obj/structure/closet/secure_closet/personal/cabinet, /turf/open/floor/iron, /area/station/commons/dorms/room1) -"iyD" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/cargo/storage) -"iyF" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/light/cold/no_nightlight/directional/east, -/obj/machinery/power/shieldwallgen/xenobiologyaccess, -/turf/open/floor/iron/white, -/area/station/science/cytology) "iyK" = ( /obj/structure/table/reinforced, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/floor1/fore) -"iyP" = ( -/obj/structure/rack, -/obj/item/storage/bag/construction, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "iyR" = ( /obj/effect/turf_decal/tile/red/diagonal_edge, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -32632,10 +32306,17 @@ /area/station/cargo/miningdock) "iyZ" = ( /obj/structure/flora/bush/snow/style_random, -/turf/open/floor/fake_snow{ +/turf/open/misc/snow/actually_safe{ icon_state = "snow8" }, /area/station/hallway/floor2/fore) +"izj" = ( +/obj/effect/turf_decal/bot, +/obj/structure/rack, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/effect/spawner/random/armory/e_gun, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "izl" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32705,19 +32386,21 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/aft) +"izy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/smooth_large, +/area/station/science/robotics/mechbay) "izz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/fore) -"izE" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/obj/machinery/light/cold/directional/north, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "izF" = ( /obj/effect/turf_decal/siding/wood, /obj/machinery/holopad, @@ -32768,10 +32451,38 @@ /obj/structure/table/glass, /turf/open/floor/iron/white, /area/station/maintenance/floor3/starboard/aft) +"iAk" = ( +/obj/effect/turf_decal/trimline/purple/corner{ + dir = 1 + }, +/obj/item/radio/intercom/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/lobby) "iAq" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hos) +"iAt" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/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, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "iAH" = ( /obj/machinery/power/shuttle_engine/heater{ icon_state = "router" @@ -32795,6 +32506,10 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/engineering/atmos/office) +"iAZ" = ( +/obj/machinery/smartfridge/extract/preloaded, +/turf/open/floor/circuit, +/area/station/science/xenobiology) "iBb" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 @@ -32807,6 +32522,13 @@ /obj/structure/cable/layer3, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"iBj" = ( +/obj/effect/turf_decal/siding/wideplating_new{ + dir = 8 + }, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/white, +/area/station/science/cytology) "iBl" = ( /obj/machinery/airalarm/directional/north, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -32870,6 +32592,20 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/iron/white/textured_large, /area/station/service/chapel) +"iCi" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/landmark/start/geneticist, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/science/genetics) "iCk" = ( /obj/machinery/door/poddoor/shutters/radiation/preopen{ id = "radshutnorth" @@ -32898,6 +32634,12 @@ /obj/item/toy/beach_ball, /turf/open/floor/grass, /area/station/medical/virology) +"iCE" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/grass, +/area/station/science/cytology) "iCG" = ( /turf/open/floor/iron/dark, /area/station/security/holding_cell) @@ -32961,6 +32703,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/solars/port/aft) +"iDr" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "iDw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -32971,16 +32721,19 @@ /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/starboard/fore) "iDJ" = ( -/obj/effect/turf_decal/stripes{ - dir = 10 - }, -/obj/effect/mapping_helpers/broken_floor, +/obj/structure/rack, +/obj/item/stack/sheet/leather, /turf/open/floor/plating, /area/station/maintenance/floor1/starboard/fore) "iDP" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, /area/station/maintenance/floor1/port/fore) +"iDZ" = ( +/obj/structure/sign/poster/official/random/directional/north, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) "iEa" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/mess, @@ -32992,6 +32745,19 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor3/port/fore) +"iEl" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/railing/corner/end/flip{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "iEm" = ( /obj/structure/closet/firecloset/full, /turf/open/floor/plating, @@ -33102,17 +32868,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/fore) -"iGy" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "iGz" = ( /obj/structure/spider/stickyweb, /obj/structure/chair/stool, @@ -33165,15 +32920,6 @@ /obj/effect/mapping_helpers/airlock/access/any/medical/general, /turf/open/floor/wood/parquet, /area/station/medical/break_room) -"iHa" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ - dir = 4 - }, -/turf/open/floor/engine/airless, -/area/station/engineering/atmos/pumproom) "iHk" = ( /turf/open/floor/catwalk_floor, /area/station/hallway/floor1/fore) @@ -33187,6 +32933,20 @@ "iHm" = ( /turf/closed/wall/r_wall, /area/station/maintenance/floor3/starboard) +"iHw" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/hallway/floor1/fore) +"iHx" = ( +/obj/structure/table, +/obj/machinery/processor{ + pixel_y = 6 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "iHG" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ dir = 8 @@ -33237,22 +32997,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"iIc" = ( -/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/yellow/line, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) -"iIe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/iron/dark/textured, -/area/station/medical/cryo) "iIm" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Hatch" @@ -33314,11 +33058,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/brig) -"iJr" = ( -/obj/structure/closet/secure_closet/freezer/meat, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "iJt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -33326,13 +33065,6 @@ dir = 8 }, /area/station/hallway/floor2/fore) -"iJu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light/cold/no_nightlight/directional/north, -/turf/open/floor/iron, -/area/station/science/lobby) "iJz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -33357,6 +33089,10 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/command/bridge) +"iJP" = ( +/obj/structure/hedge, +/turf/open/floor/plating, +/area/station/science/genetics) "iJX" = ( /obj/machinery/door_buttons/airlock_controller{ idExterior = "asylum_airlock_exterior"; @@ -33373,6 +33109,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/psychology) +"iKb" = ( +/obj/effect/turf_decal/trimline/purple/arrow_ccw, +/obj/effect/turf_decal/trimline/green/arrow_cw{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "iKc" = ( /obj/structure/chair/office, /obj/effect/landmark/start/lawyer, @@ -33385,34 +33132,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor2/starboard/fore) -"iKy" = ( -/obj/structure/rack, -/obj/item/clothing/suit/armor/bulletproof{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/suit/armor/bulletproof, -/obj/item/clothing/suit/armor/bulletproof{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/clothing/head/helmet/alt{ - layer = 3.00001; - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/head/helmet/alt{ - layer = 3.00001 - }, -/obj/item/clothing/head/helmet/alt{ - layer = 3.00001; - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/storage/secure/safe/directional/east, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "iKz" = ( /obj/structure/ladder, /obj/structure/disposalpipe/segment{ @@ -33427,6 +33146,10 @@ "iKD" = ( /turf/open/floor/mineral/silver, /area/station/service/chapel/funeral) +"iKR" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron/dark, +/area/station/security/execution/education) "iKT" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, @@ -33504,15 +33227,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) -"iMf" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron/checker, -/area/station/cargo/miningdock) "iMu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -33525,14 +33239,9 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/storage) -"iMz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/light/cold/no_nightlight/directional/west, -/turf/open/floor/circuit/telecomms, -/area/station/science/server) "iMF" = ( -/obj/structure/bed{ - dir = 4 +/obj/structure/bed/medical/anchored{ + dir = 8 }, /obj/item/bedsheet/medical{ dir = 4 @@ -33581,20 +33290,26 @@ "iMV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/machinery/status_display/evac/directional/south, -/obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"iNs" = ( -/obj/structure/table/reinforced/rglass, -/obj/item/flashlight/lamp{ - pixel_x = -5; - pixel_y = 3 +"iMX" = ( +/obj/effect/turf_decal/trimline/purple/warning{ + dir = 6 }, -/obj/effect/spawner/random/entertainment/coin, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/turf/open/floor/carpet/black, -/area/station/hallway/secondary/service) +/obj/effect/decal/cleanable/garbage, +/turf/open/floor/pod/light, +/area/station/maintenance/floor2/starboard) +"iNp" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/machinery/camera/autoname/directional/west, +/obj/structure/sign/departments/psychology/directional/west{ + name = "Asylum Entrance" + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "iNz" = ( /obj/structure/sign/directions/upload/directional/east, /obj/structure/sign/directions/medical/directional/east{ @@ -33792,17 +33507,6 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) -"iOU" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) "iOV" = ( /obj/effect/turf_decal/siding/blue{ dir = 4 @@ -33818,6 +33522,17 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor3/starboard) +"iPh" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/service/janitor) "iPm" = ( /obj/machinery/food_cart, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, @@ -33837,6 +33552,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard) +"iPG" = ( +/obj/structure/rack, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/item/multitool/circuit{ + pixel_x = 7 + }, +/obj/item/multitool/circuit, +/obj/item/multitool/circuit{ + pixel_x = -8 + }, +/turf/open/floor/iron/dark, +/area/station/science/circuits) "iPH" = ( /obj/machinery/camera/directional/north{ c_tag = "Permabrig - Isolation A"; @@ -33921,29 +33650,28 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor3/fore) -"iQy" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/hallway/floor2/aft) +"iQB" = ( +/obj/machinery/space_heater, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/port) "iQF" = ( /obj/machinery/hydroponics/soil, /obj/item/plant_analyzer, /turf/open/misc/dirt/jungle, /area/station/security/prison/garden) -"iQG" = ( -/obj/machinery/light/directional/south, -/obj/structure/railing/corner{ - dir = 1 - }, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor3/fore) "iQH" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/side, /area/station/commons/locker) +"iQK" = ( +/obj/structure/cable, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/structure/sign/warning/deathsposal/directional/south, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor1/fore) "iQU" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -33974,8 +33702,31 @@ }, /turf/open/floor/mineral/plastitanium/airless, /area/space/nearstation) +"iRg" = ( +/obj/effect/turf_decal/trimline/purple/line, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/public/glass{ + name = "Public Airlock" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) +"iRm" = ( +/obj/machinery/vending/autodrobe, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/library/lounge) "iRo" = ( /obj/machinery/firealarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/starboard) "iRr" = ( @@ -34027,13 +33778,6 @@ /obj/item/stack/rods/two, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) -"iSr" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/medipen_refiller, -/turf/open/floor/plating/elevatorshaft, -/area/station/science/research/abandoned) "iSs" = ( /obj/structure/rack, /obj/item/weldingtool, @@ -34070,16 +33814,6 @@ /obj/structure/closet/crate/cardboard, /turf/open/floor/iron, /area/station/maintenance/floor3/starboard/aft) -"iSO" = ( -/obj/effect/turf_decal/tile/green/half, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/pods/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark/side, -/area/station/hallway/secondary/exit/escape_pod) "iSP" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -34158,15 +33892,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard/aft) -"iTM" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/red/half{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/security/brig) "iTN" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 6 @@ -34190,10 +33915,6 @@ }, /turf/open/floor/wood, /area/station/service/theater) -"iUt" = ( -/mob/living/basic/butterfly, -/turf/open/floor/grass, -/area/station/hallway/secondary/entry) "iUP" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -34213,7 +33934,7 @@ /turf/open/floor/iron/dark/side, /area/station/hallway/secondary/exit/escape_pod) "iUS" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ name = "Captain's Computer" }, /obj/item/radio/intercom/directional/north, @@ -34244,12 +33965,6 @@ /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/wood/parquet, /area/station/service/lawoffice) -"iVh" = ( -/obj/structure/closet/secure_closet/brig/genpop, -/obj/effect/turf_decal/tile/red/half, -/obj/item/card/id/advanced/prisoner/four, -/turf/open/floor/iron/dark/side, -/area/station/security/brig) "iVs" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -34281,25 +33996,16 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/science/robotics/lab) +"iVP" = ( +/obj/structure/closet/emcloset, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "iVY" = ( /obj/structure/mirror/directional/west, /obj/structure/sink/directional/east, /turf/open/floor/iron/freezer, /area/station/hallway/secondary/service) -"iWd" = ( -/obj/effect/turf_decal/trimline/red/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/red/line, -/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 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/fore) "iWf" = ( /obj/machinery/power/smes, /obj/structure/cable, @@ -34398,13 +34104,6 @@ /obj/item/restraints/legcuffs/beartrap/prearmed, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"iXh" = ( -/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 = 1 - }, -/area/station/science/robotics/lab) "iXk" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -34468,25 +34167,11 @@ "iXS" = ( /turf/closed/wall/r_wall, /area/station/command/gateway) -"iYo" = ( -/turf/open/floor/engine{ - icon_state = "textured_dark" - }, -/area/station/maintenance/floor2/starboard/aft) -"iYq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/item/seeds/random, -/obj/structure/rack, -/obj/item/cultivator, -/turf/open/floor/iron, -/area/station/science/research/abandoned) -"iYu" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/iron/dark, -/area/station/science/auxlab) +"iYb" = ( +/obj/machinery/hydroponics/constructable, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/station/cargo/miningdock) "iYA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -34496,6 +34181,14 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/starboard) +"iYC" = ( +/obj/effect/turf_decal/tile/red/half{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/security/brig) "iYE" = ( /obj/effect/turf_decal/trimline/brown/line{ dir = 4 @@ -34698,16 +34391,10 @@ /obj/effect/spawner/random/structure/furniture_parts, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/starboard) -"jaR" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/carpet/royalblue, -/area/station/command/heads_quarters/cmo) +"jaK" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/pink/visible, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/pumproom) "jbc" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/pod/light, @@ -34718,12 +34405,6 @@ /obj/machinery/duct, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet) -"jbi" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/structure/cable, -/obj/effect/landmark/start/depsec/supply, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "jbl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -34809,35 +34490,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/engine, /area/station/engineering/lobby) -"jcw" = ( -/obj/effect/turf_decal/trimline/red/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/red/line, -/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/turf_decal/delivery, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/aft) -"jcI" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ - dir = 8; - initialize_directions = 4; - name = "euthanization chamber freezer" - }, -/obj/effect/turf_decal/stripes{ - dir = 4 - }, -/obj/machinery/airalarm/directional/north, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/light/cold/no_nightlight/directional/north, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "jcN" = ( /obj/effect/turf_decal/tile/green{ dir = 8 @@ -34892,6 +34544,11 @@ /obj/machinery/chem_dispenser/drinks, /turf/open/floor/iron/dark/smooth_large, /area/station/service/bar) +"jdp" = ( +/obj/effect/spawner/random/structure/table_or_rack, +/obj/effect/spawner/random/maintenance/two, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/port) "jds" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -34980,6 +34637,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/science/robotics/lab) +"jeQ" = ( +/obj/structure/table/reinforced, +/obj/machinery/camera/directional/south{ + c_tag = "Armory - Interior" + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/cable, +/obj/effect/spawner/random/armory/barrier_grenades, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "jeR" = ( /obj/structure/filingcabinet/chestdrawer, /turf/open/floor/iron/dark/smooth_large, @@ -35069,6 +34736,20 @@ /obj/effect/mapping_helpers/airlock/access/any/medical/morgue, /turf/open/floor/plating, /area/station/maintenance/floor2/port) +"jgd" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/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/structure/disposalpipe/segment, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/aft) "jgx" = ( /obj/effect/turf_decal/trimline/green/filled/arrow_cw, /obj/structure/railing{ @@ -35129,11 +34810,12 @@ /obj/structure/closet/firecloset, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"jhe" = ( -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/telecomms/receiver, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/fore) +"jhk" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/hydroponics/constructable, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden) "jhw" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -35162,9 +34844,14 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) "jhP" = ( -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/starboard/fore) +/obj/effect/turf_decal/box/corners, +/obj/effect/turf_decal/box/corners{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/landmark/bitrunning/station_reward_spawn, +/turf/open/floor/iron/dark/smooth_large, +/area/station/bitrunning/den) "jhU" = ( /turf/open/floor/iron/white, /area/station/science/robotics/lab) @@ -35189,22 +34876,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard/aft) -"jiu" = ( -/obj/machinery/dna_scannernew, -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) -"jiz" = ( -/obj/effect/turf_decal/siding/wood, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/wood/parquet, -/area/station/service/lawoffice) "jiD" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 @@ -35286,15 +34957,16 @@ /obj/machinery/vending/coffee, /turf/open/floor/wood, /area/station/command/meeting_room) -"jjt" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/station/engineering/supermatter) "jju" = ( /obj/structure/table/reinforced, /obj/item/restraints/handcuffs/fake, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) +"jjA" = ( +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/closet/secure_closet/armory2, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "jjB" = ( /obj/structure/table/wood, /obj/item/flashlight/lantern{ @@ -35348,16 +35020,6 @@ }, /turf/open/floor/mineral/silver, /area/station/service/chapel) -"jkv" = ( -/obj/effect/turf_decal/trimline/blue/corner, -/obj/structure/cable, -/obj/machinery/light/small/blacklight/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server/upper) "jkH" = ( /obj/machinery/holopad, /turf/open/floor/iron/white, @@ -35369,17 +35031,6 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) -"jlq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/toy/plush/lizard_plushie/green{ - desc = "A stuffed toy which resembles a wayward Ashlander. This one fills you with hope for the future."; - name = "Bites-The-Wires" - }, -/obj/effect/turf_decal/trimline/green/line{ - dir = 10 - }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor2/port/fore) "jlx" = ( /obj/effect/turf_decal/trimline/red/warning{ dir = 4 @@ -35403,6 +35054,14 @@ /obj/effect/spawner/random/trash/garbage, /turf/open/floor/pod/light, /area/station/maintenance/floor3/port/aft) +"jlE" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "jlJ" = ( /obj/structure/railing{ dir = 8 @@ -35439,15 +35098,9 @@ "jmc" = ( /turf/closed/wall, /area/station/service/hydroponics/garden) -"jme" = ( -/obj/structure/rack, -/obj/item/soap, -/turf/open/floor/iron/smooth_large, -/area/station/cargo/miningoffice) -"jmf" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/holopad, -/turf/open/floor/iron/white, +"jml" = ( +/obj/effect/turf_decal/box/corners, +/turf/open/floor/iron/dark, /area/station/science/cytology) "jmm" = ( /obj/structure/railing/corner{ @@ -35480,20 +35133,6 @@ /obj/item/stack/sheet/cardboard, /turf/open/floor/iron, /area/station/maintenance/floor3/starboard/aft) -"jmI" = ( -/obj/effect/turf_decal/trimline/blue/arrow_cw{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/arrow_ccw{ - dir = 8 - }, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/fore) -"jmM" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/hallway/floor2/fore) "jmR" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -35545,6 +35184,16 @@ /obj/structure/chair, /turf/open/floor/iron/kitchen/herringbone, /area/station/service/kitchen/diner) +"jnp" = ( +/obj/effect/turf_decal/trimline/yellow/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, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) "jnv" = ( /obj/structure/closet/crate/preopen, /obj/effect/spawner/random/maintenance/two, @@ -35576,10 +35225,21 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"jnM" = ( -/obj/structure/closet/secure_closet/injection, -/turf/open/floor/iron/white/small, -/area/station/security/execution/education) +"jnS" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 4 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/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/dark, +/area/station/hallway/floor1/fore) "jnV" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -35593,19 +35253,10 @@ /obj/machinery/shower/directional/west, /turf/open/floor/iron/freezer, /area/station/hallway/secondary/service) -"jon" = ( -/obj/effect/turf_decal/siding/wood/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/wood/parquet, -/area/station/service/lawoffice) -"joy" = ( -/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/abandoned) +"jom" = ( +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/textured_large, +/area/station/medical/chemistry) "joE" = ( /obj/structure/railing{ dir = 1 @@ -35653,37 +35304,20 @@ /turf/open/floor/iron/dark, /area/station/medical/virology) "joU" = ( -/obj/machinery/light/directional/north, -/obj/structure/table/reinforced, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = 9; - pixel_y = 4 - }, -/obj/item/radio{ - pixel_x = -6; - pixel_y = -3 +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 }, -/obj/machinery/recharger{ - pixel_y = 3 +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/checker{ + dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/third) +/area/station/science/genetics) "joV" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 8 }, /turf/open/floor/iron/white/small, /area/station/medical/chemistry) -"jps" = ( -/obj/effect/turf_decal/trimline/blue/corner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server/upper) "jpy" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible, @@ -35752,15 +35386,17 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/lobby) -"jpS" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 9 +"jpT" = ( +/obj/machinery/flasher/portable, +/obj/item/radio/intercom/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 }, -/obj/machinery/modular_computer/console/preset/cargochat/security{ +/obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/iron, -/area/station/security/office) +/turf/open/floor/plating, +/area/station/security/brig) "jqh" = ( /obj/machinery/plumbing/bottler, /obj/effect/decal/cleanable/dirt, @@ -35770,40 +35406,22 @@ /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/maintenance/floor3/starboard/fore) -"jqz" = ( -/obj/effect/turf_decal/trimline/purple/line, -/obj/structure/disposalpipe/junction/flip{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "jqD" = ( /turf/open/floor/iron/dark/smooth_large, /area/station/science/lobby) -"jqF" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/machinery/computer/records/security{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "jqJ" = ( /turf/open/floor/plating/foam, /area/station/maintenance/floor2/port) -"jrh" = ( -/obj/effect/turf_decal/siding/purple/corner{ - dir = 4 +"jqP" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Xenobio - Computers Pens" }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" +/obj/machinery/computer/camera_advanced/xenobio{ + dir = 4 }, -/area/station/science/genetics) +/obj/machinery/newscaster/directional/west, +/turf/open/floor/circuit, +/area/station/science/xenobiology) "jrl" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/structure/cable, @@ -35883,12 +35501,11 @@ /turf/open/floor/iron, /area/station/maintenance/floor1/starboard/fore) "jsb" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/light/directional/north, -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/grass, -/area/station/service/bar/atrium) +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/maintenance/floor3/starboard/aft) "jse" = ( /obj/machinery/door/airlock{ name = "Bartender's Backroom" @@ -35996,9 +35613,24 @@ name = "lab floor" }, /area/station/science/robotics/lab) +"jtF" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/line{ + dir = 8 + }, +/obj/machinery/door/firedoor/heavy, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor{ + elevator_linked_id = "com_vator"; + elevator_mode = 1 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/aft) "jtJ" = ( /obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/fake_snow{ +/turf/open/misc/snow/actually_safe{ icon_state = "snow9" }, /area/station/hallway/floor2/fore) @@ -36007,10 +35639,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/floor2/port/aft) -"jtQ" = ( -/obj/machinery/light/cold/no_nightlight/directional/south, -/turf/open/floor/grass, -/area/station/hallway/secondary/service) "juf" = ( /obj/machinery/door/poddoor/shutters/radiation/preopen{ id = "radshutsouth" @@ -36057,6 +35685,14 @@ /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/cafeteria, /area/station/security/prison) +"juI" = ( +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/light/small/directional/west, +/turf/open/floor/catwalk_floor/iron, +/area/station/engineering/engine_smes) "juW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -36092,11 +35728,6 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/floor2/fore) -"jvz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/security/range) "jvM" = ( /turf/closed/wall, /area/station/command/heads_quarters/captain/private) @@ -36118,14 +35749,6 @@ }, /turf/open/floor/iron, /area/station/service/janitor) -"jvW" = ( -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/ai_monitored/command/storage/eva) "jvX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -36140,10 +35763,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"jwc" = ( -/obj/machinery/holopad, -/turf/open/floor/wood, -/area/station/service/kitchen/diner) "jwi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -36166,6 +35785,26 @@ dir = 1 }, /area/station/hallway/floor3/fore) +"jwu" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/green/corner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/service/bar) +"jwC" = ( +/obj/structure/cable, +/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/machinery/light/directional/south, +/turf/open/floor/iron/textured_large, +/area/station/cargo/storage) "jwG" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -36190,12 +35829,6 @@ }, /turf/open/floor/iron/white/small, /area/station/commons/fitness/recreation) -"jwY" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/science/research/abandoned) "jxa" = ( /obj/structure/railing{ dir = 1 @@ -36237,6 +35870,16 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) +"jxk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/smooth_large, +/area/station/science/robotics/mechbay) "jxy" = ( /obj/structure/table, /obj/item/taperecorder/empty{ @@ -36259,16 +35902,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) -"jxA" = ( -/obj/machinery/computer/records/medical/laptop{ - dir = 1; - pixel_y = 4 - }, -/obj/structure/table/glass, -/obj/machinery/light/directional/east, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron/white, -/area/station/security/medical) "jxD" = ( /obj/machinery/door/airlock/virology/glass{ name = "Test Subject Cell" @@ -36333,6 +35966,18 @@ /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) +"jxP" = ( +/obj/effect/turf_decal/bot, +/obj/structure/punching_bag, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) +"jyc" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/structure/sign/poster/random/directional/north, +/turf/open/floor/grass, +/area/station/service/bar/atrium) "jye" = ( /obj/structure/table, /obj/item/clothing/glasses/sunglasses{ @@ -36392,6 +36037,14 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port/aft) +"jzc" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/construction/mining/aux_base) "jzd" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/brown{ @@ -36555,18 +36208,27 @@ /turf/open/floor/carpet/royalblack, /area/station/service/kitchen/diner) "jAr" = ( -/obj/structure/railing{ +/obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 4 }, -/obj/effect/turf_decal/stripes{ +/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, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 +/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, +/obj/machinery/door/airlock/mining/glass{ + name = "Bitrunning Den" }, -/turf/open/floor/iron, -/area/station/cargo/storage) +/turf/open/floor/pod/dark, +/area/station/bitrunning/den) +"jAB" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/hallway/secondary/entry) "jAF" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -36631,18 +36293,6 @@ /obj/item/bot_assembly/floorbot, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard/aft) -"jBi" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ - dir = 10 - }, -/turf/open/floor/engine/airless, -/area/station/engineering/atmos/pumproom) "jBm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -36656,6 +36306,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor2/port) +"jBR" = ( +/obj/effect/turf_decal/trimline/purple/line, +/obj/effect/turf_decal/siding/white/corner{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "jCi" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor/heavy, @@ -36689,6 +36346,12 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) +"jCK" = ( +/obj/machinery/recharger, +/obj/structure/table, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/brig) "jCM" = ( /obj/machinery/light/broken/directional/south, /obj/effect/mapping_helpers/broken_floor, @@ -36698,20 +36361,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) -"jCY" = ( -/obj/effect/turf_decal/trimline/blue/line{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/heavy, -/obj/effect/turf_decal/trimline/purple/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/dark, -/area/station/hallway/floor2/fore) "jDc" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/folder/white, @@ -36789,12 +36438,6 @@ }, /turf/open/floor/iron/white/textured_large, /area/station/cargo/miningoffice) -"jEf" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "jEk" = ( /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/dark/side{ @@ -36845,11 +36488,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/robotics/lab) -"jEI" = ( -/obj/machinery/light/cold/no_nightlight/directional/east, -/obj/effect/turf_decal/tile/green/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/floor2/aft) "jEO" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/decal/cleanable/dirt, @@ -36859,6 +36497,19 @@ /obj/machinery/atmospherics/components/binary/valve, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"jES" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/corner{ + dir = 8 + }, +/obj/machinery/light/cold/no_nightlight/directional/south, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor2/aft) "jEU" = ( /obj/structure/canister_frame/machine, /turf/open/floor/engine, @@ -36867,13 +36518,20 @@ /obj/effect/turf_decal/trimline/purple/line, /turf/open/floor/iron/white, /area/station/science/lobby) -"jFb" = ( -/obj/effect/turf_decal/siding/wood{ +"jEY" = ( +/obj/effect/decal/cleanable/dirt, +/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/dark/side{ dir = 8 }, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/wood, -/area/station/service/kitchen/diner) +/area/station/security/prison) +"jEZ" = ( +/obj/structure/window/spawner/directional/south, +/obj/structure/bed/medical/emergency, +/turf/open/floor/iron/dark/textured, +/area/station/commons/fitness) "jFh" = ( /obj/effect/spawner/random/trash/moisture_trap, /turf/open/floor/pod/dark, @@ -36972,17 +36630,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) -"jGb" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, -/obj/machinery/recharge_station, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/red/half{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/eva) "jGe" = ( /obj/machinery/camera{ c_tag = "Technical Storage"; @@ -36992,6 +36639,16 @@ /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/iron/dark/side, /area/station/engineering/storage/tech) +"jGf" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 1 + }, +/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/cytology) "jGg" = ( /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/pod/light, @@ -37001,6 +36658,13 @@ /obj/structure/sign/poster/random/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/service/library/printer) +"jGl" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "jGn" = ( /obj/structure/table/wood/poker, /obj/effect/turf_decal/trimline/blue/filled/line, @@ -37052,10 +36716,6 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) -"jHn" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/textured_large, -/area/station/medical/chemistry) "jHr" = ( /obj/structure/railing{ dir = 1 @@ -37121,6 +36781,11 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/carpet/royalblack, /area/station/service/kitchen/diner) +"jHW" = ( +/obj/structure/weightmachine/weightlifter, +/obj/effect/turf_decal/stripes, +/turf/open/floor/iron/smooth_large, +/area/station/medical/psychology) "jIc" = ( /obj/structure/lattice/catwalk, /obj/structure/cable/multilayer/connected, @@ -37225,6 +36890,12 @@ dir = 1 }, /area/station/security/checkpoint) +"jJa" = ( +/obj/effect/decal/cleanable/confetti, +/obj/effect/turf_decal/siding/blue/corner, +/obj/machinery/light/blacklight/directional/north, +/turf/open/floor/carpet/neon/simple/pink/nodots, +/area/station/maintenance/floor2/port/fore) "jJm" = ( /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/starboard) @@ -37232,10 +36903,6 @@ /obj/effect/landmark/navigate_destination/chemfactory, /turf/open/floor/iron/white/small, /area/station/medical/chemistry) -"jJs" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron/textured_large, -/area/station/medical/chemistry) "jJu" = ( /turf/closed/wall, /area/station/service/kitchen/abandoned) @@ -37267,15 +36934,6 @@ /obj/effect/decal/cleanable/glass, /turf/open/floor/engine, /area/station/maintenance/floor1/port/aft) -"jJU" = ( -/obj/structure/statue/silver/sec{ - desc = "Dedicated to those who died in the First Contact."; - name = "statue of a militia member" - }, -/obj/effect/turf_decal/siding/wood, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/carpet/royalblack, -/area/station/service/library) "jJV" = ( /obj/structure/grille/broken, /turf/open/floor/pod/light, @@ -37364,10 +37022,27 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/dark, /area/station/command/gateway) +"jLF" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/execution/education) "jLI" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"jLQ" = ( +/obj/effect/turf_decal/trimline/blue/line, +/obj/effect/turf_decal/trimline/blue/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/dark, +/area/station/hallway/floor2/aft) "jLT" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 4 @@ -37375,6 +37050,13 @@ /obj/structure/grille, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"jLX" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/floor3/aft) "jMc" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -37486,6 +37168,14 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/port/fore) +"jNH" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/white, +/area/station/hallway/floor2/aft) "jNL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/side{ @@ -37512,12 +37202,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/fore) -"jNY" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/hallway/floor3/aft) "jOc" = ( /obj/item/storage/box/firingpins, /obj/item/storage/box/firingpins, @@ -37555,12 +37239,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"jOL" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/fore) "jON" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron/white, @@ -37610,12 +37288,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"jPn" = ( -/obj/structure/table/wood, -/obj/item/storage/wallet/random, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) "jPp" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/gibs/torso, @@ -37708,18 +37380,6 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard) -"jQJ" = ( -/obj/effect/turf_decal/trimline/blue/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 8 - }, -/obj/structure/disposalpipe/junction{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) "jQK" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -37729,27 +37389,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port) -"jQP" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/cup/bottle/syrup_bottle/korta_nectar{ - pixel_x = 5; - pixel_y = 16 - }, -/obj/item/reagent_containers/cup/bottle/syrup_bottle/liqueur{ - pixel_x = -5; - pixel_y = 16 - }, -/obj/item/reagent_containers/cup/bottle/syrup_bottle/caramel{ - pixel_y = 16 - }, -/obj/machinery/newscaster/directional/west, -/obj/item/reagent_containers/cup/rag, -/obj/item/reagent_containers/cup/glass/coffee{ - pixel_x = -3; - pixel_y = 9 - }, -/turf/open/floor/wood, -/area/station/hallway/secondary/entry) "jQS" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/yellow, @@ -37771,10 +37410,6 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) -"jRb" = ( -/obj/structure/disposalpipe/junction, -/turf/open/floor/iron, -/area/station/hallway/floor2/aft) "jRe" = ( /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/dark/side{ @@ -37815,6 +37450,17 @@ dir = 8 }, /area/station/commons/storage/primary) +"jRx" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/departments/telecomms/alt/directional/south, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor1/aft) "jRB" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/built/directional/east, @@ -37869,6 +37515,11 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) +"jSj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "jSt" = ( /obj/machinery/computer/prisoner/gulag_teleporter_computer, /obj/effect/turf_decal/tile/red/anticorner/contrasted{ @@ -37908,11 +37559,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) -"jST" = ( -/obj/machinery/vending/cola, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/checker, -/area/station/service/bar/atrium) "jSW" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -37947,12 +37593,6 @@ /obj/structure/sign/departments/medbay/alt/directional/south, /turf/open/floor/iron/dark, /area/station/hallway/floor2/aft) -"jTG" = ( -/obj/machinery/vending/clothing, -/obj/effect/turf_decal/siding/wood, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/dark, -/area/station/service/library/lounge) "jTH" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/girder, @@ -37966,12 +37606,24 @@ /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"jTM" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/purple{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/science/cytology) "jTO" = ( /obj/machinery/airalarm/directional/east, /obj/structure/table/wood, /obj/structure/reagent_dispensers/beerkeg, /turf/open/floor/wood, /area/station/service/bar) +"jTS" = ( +/obj/effect/spawner/random/contraband/landmine, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/floor2/starboard/aft) "jUf" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor/heavy, @@ -37999,16 +37651,10 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/floor2/fore) -"jUE" = ( -/obj/machinery/computer/security/mining{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/corner{ - dir = 1 - }, -/area/station/cargo/miningdock) +"jUC" = ( +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/wood, +/area/station/command/meeting_room) "jUJ" = ( /obj/effect/turf_decal/trimline/green/warning, /obj/structure/tank_dispenser/oxygen, @@ -38023,14 +37669,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron, /area/station/engineering/lobby) -"jUT" = ( -/obj/structure/statue/gold/cmo{ - desc = "Dedicated to those who cured the plague of 2709." - }, -/obj/effect/turf_decal/siding/wood, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/carpet/royalblack, -/area/station/service/library) "jVe" = ( /obj/structure/ladder, /turf/open/floor/plating/airless, @@ -38081,12 +37719,13 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) -"jVJ" = ( -/obj/effect/turf_decal/siding/white/corner{ - dir = 8 +"jVG" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Security - Cell" }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) +/obj/structure/sign/poster/official/random/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "jVK" = ( /turf/closed/wall/r_wall, /area/station/security/prison) @@ -38110,11 +37749,15 @@ /turf/open/floor/iron/dark, /area/station/cargo/lobby) "jVT" = ( -/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/turf/open/floor/iron/dark/textured, -/area/station/commons/fitness) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/science/genetics) "jVW" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/pew/right{ @@ -38155,8 +37798,25 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) +"jWv" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer4{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/station/engineering/supermatter/waste) +"jWz" = ( +/obj/structure/railing/corner, +/obj/effect/turf_decal/trimline/purple/warning, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) "jWJ" = ( /obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /turf/open/floor/iron, /area/station/cargo/storage) "jWR" = ( @@ -38191,6 +37851,13 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/warden) +"jXl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/crate_abandoned, +/obj/structure/sign/poster/contraband/random/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/floor2/port/aft) "jXu" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, @@ -38212,6 +37879,16 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) +"jXH" = ( +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/obj/structure/closet/secure_closet/brig{ + name = "Prisoner Locker" + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/third) "jXX" = ( /obj/machinery/camera/directional/north{ c_tag = "Holodeck - Fore"; @@ -38262,19 +37939,21 @@ }, /turf/open/floor/carpet/royalblack, /area/station/service/kitchen/diner) -"jYH" = ( -/obj/effect/turf_decal/trimline/green/filled/line, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/commons/vacant_room/commissary) "jYS" = ( /obj/effect/spawner/random/vending/colavend, /obj/effect/turf_decal/trimline/white/warning, /turf/open/floor/iron/dark, /area/station/hallway/floor1/aft) +"jYY" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) "jZa" = ( /obj/effect/spawner/random/maintenance, /obj/effect/decal/cleanable/dirt, @@ -38320,14 +37999,6 @@ /obj/structure/cable, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) -"jZP" = ( -/obj/machinery/door/airlock/hydroponics/glass, -/obj/effect/mapping_helpers/airlock/access/any/service/hydroponics, -/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/service/hydroponics) "jZS" = ( /turf/open/floor/iron/dark/side{ dir = 4 @@ -38376,6 +38047,18 @@ }, /turf/open/floor/iron/white, /area/station/science/lobby) +"kaZ" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/clothing/glasses/regular, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/commons/dorms/room1) "kba" = ( /obj/structure/chair/comfy/brown{ dir = 1 @@ -38393,12 +38076,6 @@ /obj/effect/spawner/random/structure/crate_abandoned, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/port) -"kbl" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/hallway/floor2/fore) "kbp" = ( /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/any/security/general, @@ -38448,6 +38125,10 @@ dir = 8 }, /area/station/medical/chemistry) +"kbI" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/wood, +/area/station/hallway/floor4/fore) "kbL" = ( /obj/effect/turf_decal/siding/white{ dir = 8 @@ -38519,6 +38200,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/structure/barricade/wooden/crude, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard) "kca" = ( @@ -38596,6 +38278,29 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/plating, /area/station/engineering/supermatter) +"kcC" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 8 + }, +/obj/structure/reagent_dispensers/water_cooler, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/hallway/floor3/fore) +"kcK" = ( +/obj/effect/turf_decal/trimline/purple/line, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) "kcZ" = ( /obj/effect/turf_decal/delivery, /obj/structure/table/reinforced, @@ -38658,6 +38363,22 @@ /obj/structure/window/spawner/directional/west, /turf/open/floor/catwalk_floor/iron_dark, /area/station/ai_monitored/command/storage/eva) +"kdy" = ( +/obj/structure/table, +/obj/machinery/microwave, +/turf/open/floor/catwalk_floor/iron, +/area/station/cargo/storage) +"kdA" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/structure/table/wood, +/obj/item/flashlight/lamp/bananalamp{ + pixel_y = 5 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/grimy, +/area/station/science/xenobiology/hallway) "kdK" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Hatch" @@ -38683,6 +38404,17 @@ }, /turf/open/floor/iron, /area/station/maintenance/floor1/port/aft) +"kdU" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/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/white, +/area/station/science/xenobiology) "keg" = ( /obj/machinery/light_switch/directional/south, /obj/structure/cable, @@ -38706,6 +38438,12 @@ /obj/structure/table/wood, /turf/open/floor/carpet/red, /area/station/service/library) +"ket" = ( +/obj/machinery/light/warm/directional/south, +/turf/open/floor/iron/white/side{ + dir = 10 + }, +/area/station/hallway/floor2/fore) "key" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -38755,6 +38493,10 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) +"keN" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/aft) "keP" = ( /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, @@ -38786,6 +38528,13 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/plating, /area/station/medical/abandoned) +"keX" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor4/starboard/fore) "kfb" = ( /obj/effect/turf_decal/trimline/yellow/line{ dir = 8 @@ -38798,10 +38547,6 @@ dir = 1 }, /area/station/hallway/floor1/aft) -"kff" = ( -/obj/structure/closet/secure_closet/freezer/empty, -/turf/open/floor/iron/kitchen, -/area/station/command/heads_quarters/rd) "kfg" = ( /obj/machinery/atmospherics/components/unary/thermomachine/heater{ dir = 1; @@ -38810,20 +38555,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/engineering/atmos) -"kfj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light/cold/no_nightlight/directional/south, -/obj/effect/turf_decal/trimline/purple/corner{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/structure/sign/departments/xenobio/directional/south, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "kfm" = ( /obj/effect/turf_decal/trimline/purple, /obj/machinery/airalarm/directional/south, @@ -38832,31 +38563,28 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/floor2/fore) -"kfn" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/box, -/obj/structure/sign/poster/official/random/directional/north, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/psychology) "kfo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"kfA" = ( -/obj/machinery/vending/cola, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) +"kfq" = ( +/obj/structure/sign/departments/vault/directional/west, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/hallway/floor4/aft) "kfF" = ( /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/floor1/aft) +"kfL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/oven, +/obj/machinery/light/broken/directional/north, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen/abandoned) "kga" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -38881,6 +38609,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/tile, /area/station/service/library) +"kgL" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/structure/railing/corner/end/flip{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor3/fore) "kgT" = ( /turf/open/floor/pod/dark, /area/station/maintenance/floor3/starboard) @@ -38954,6 +38692,19 @@ }, /turf/open/floor/iron, /area/station/hallway/floor2/aft) +"khn" = ( +/obj/item/storage/box/chemimp{ + pixel_x = 6 + }, +/obj/item/storage/box/trackimp{ + pixel_x = -3 + }, +/obj/item/storage/lockbox/loyalty, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "khr" = ( /turf/closed/wall, /area/station/maintenance/disposal/incinerator) @@ -39077,28 +38828,21 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/white, /area/station/science/lobby) -"kjm" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/siding/wood{ +"kjo" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/science/genetics, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/purple/opposingcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/wood/tile, -/area/station/service/library) -"kjp" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/siding/wood{ - dir = 1 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/science/glass{ + name = "Genetics Office" }, -/obj/machinery/newscaster/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood/tile, -/area/station/service/library) +/turf/open/floor/iron, +/area/station/science/genetics) "kjz" = ( /obj/machinery/door/airlock/grunge{ name = "Cell 1" @@ -39119,6 +38863,13 @@ /obj/effect/decal/cleanable/oil/streak, /turf/open/floor/iron/textured_large, /area/station/engineering/lobby) +"kjW" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 5 + }, +/obj/machinery/light/cold/no_nightlight/directional/east, +/turf/open/floor/iron, +/area/station/hallway/floor3/fore) "kkg" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -39128,12 +38879,6 @@ }, /turf/open/floor/iron, /area/station/hallway/floor3/aft) -"kkr" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/entertainment/cigar, -/obj/effect/spawner/random/entertainment/cigarette_pack, -/turf/open/floor/wood, -/area/station/hallway/floor3/fore) "kkw" = ( /obj/structure/cable, /obj/machinery/power/floodlight{ @@ -39161,6 +38906,19 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/security/brig) +"kkN" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/floor1/aft) +"kkQ" = ( +/obj/structure/punching_bag, +/obj/effect/turf_decal/stripes, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/smooth_large, +/area/station/medical/psychology) "klc" = ( /obj/structure/railing{ dir = 4 @@ -39277,6 +39035,10 @@ "kmR" = ( /turf/closed/wall, /area/station/science/lab) +"knd" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor2/aft) "knf" = ( /obj/effect/turf_decal/trimline/brown/line{ dir = 4 @@ -39363,6 +39125,22 @@ icon_state = "textured_dark" }, /area/station/science/robotics/lab) +"knY" = ( +/obj/structure/showcase/cyborg/old{ + dir = 4; + pixel_x = -9; + pixel_y = 2 + }, +/obj/machinery/camera/autoname/directional/west, +/obj/structure/cable, +/obj/item/radio/intercom/directional/south{ + broadcasting = 1; + frequency = 1447; + listening = 0; + name = "Private Channel" + }, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/aisat_interior) "koc" = ( /obj/structure/railing{ dir = 1 @@ -39376,6 +39154,12 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/port/fore) +"kod" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/smartfridge/organ, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/white/textured, +/area/station/medical/office) "kok" = ( /obj/effect/turf_decal/trimline/dark_blue/line{ dir = 6 @@ -39411,18 +39195,14 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/aft) -"koQ" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/iron/dark, -/area/station/hallway/floor3/fore) -"koS" = ( -/obj/machinery/light/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white/textured_large, -/area/station/service/chapel/office) +"koN" = ( +/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/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/science/robotics/lab) "koU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -39470,6 +39250,19 @@ /obj/machinery/telecomms/server/presets/supply, /turf/open/floor/circuit/telecomms, /area/station/tcommsat/server) +"kpl" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/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/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/aft) "kpt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -39497,14 +39290,6 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/carpet/royalblue, /area/station/medical/break_room) -"kpS" = ( -/obj/structure/closet/boxinggloves, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/radio/intercom/directional/north, -/obj/machinery/duct, -/turf/open/floor/iron/dark/textured, -/area/station/commons/fitness) "kpT" = ( /obj/machinery/duct, /turf/open/floor/pod/light, @@ -39698,11 +39483,6 @@ /obj/item/holosign_creator/atmos, /turf/open/floor/iron, /area/station/engineering/atmos) -"kso" = ( -/obj/machinery/light/red/dim/directional/west, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/floor2/port/fore) "ksr" = ( /obj/effect/turf_decal/bot, /obj/structure/table, @@ -39744,6 +39524,16 @@ }, /turf/open/floor/iron/white, /area/station/science/lobby) +"ksB" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/duct, +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "ksD" = ( /obj/effect/turf_decal/tile/bar/opposingcorners{ dir = 1 @@ -39754,6 +39544,19 @@ /obj/structure/cable, /turf/open/floor/iron/checker, /area/station/cargo/miningdock) +"ksH" = ( +/obj/structure/closet/crate/freezer/blood, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/surgery/fore) +"ksJ" = ( +/obj/item/radio/intercom/directional/west, +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/hallway/floor2/fore) "ksN" = ( /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -39817,6 +39620,18 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/xenobiology/hallway) +"ktM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock_note_placer{ + note_info = "THIS IS PUBLIC. IT'S MEANT TO BE. PLEASE. GOD. WE KNOW. STOP. TELLING US. - Yours Truly and Forever Faithfully, The Desk Of The Chief Engineer" + }, +/obj/machinery/door/airlock/science/glass{ + name = "Science Hall" + }, +/turf/open/floor/catwalk_floor, +/area/station/science/lower) "ktN" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/structure/disposalpipe/segment{ @@ -39848,6 +39663,17 @@ name = "boxing ring" }, /area/station/commons/fitness) +"kuh" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 8 + }, +/obj/effect/turf_decal/siding/white/corner, +/obj/machinery/airalarm/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "kum" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39896,19 +39722,6 @@ }, /turf/open/floor/wood/parquet, /area/station/service/lawoffice) -"kvk" = ( -/obj/effect/turf_decal/bot, -/obj/structure/rack, -/obj/item/gun/ballistic/shotgun/riot, -/obj/item/gun/ballistic/shotgun/riot{ - pixel_y = 3 - }, -/obj/item/gun/ballistic/shotgun/riot{ - pixel_y = 6 - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "kvw" = ( /obj/machinery/igniter/incinerator_ordmix, /turf/open/floor/engine/vacuum, @@ -39966,6 +39779,10 @@ /obj/structure/stairs/north, /turf/open/floor/iron/smooth, /area/station/hallway/floor3/fore) +"kwf" = ( +/obj/machinery/light/cold/no_nightlight/directional/south, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "kwl" = ( /turf/open/floor/iron/dark/side{ dir = 9 @@ -40009,6 +39826,15 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/textured_large, /area/station/cargo/storage) +"kwL" = ( +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/machinery/recharger, +/obj/structure/table, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "kxf" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -40032,14 +39858,6 @@ /obj/machinery/light/broken/directional/west, /turf/open/floor/carpet/green, /area/station/service/abandoned_gambling_den) -"kxA" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/camera/directional/south{ - c_tag = "Science - Cytology Lower" - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/white, -/area/station/science/cytology) "kxJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -40054,16 +39872,18 @@ name = "padded floor" }, /area/station/medical/psychology) -"kxL" = ( -/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/green/opposingcorners, -/obj/structure/disposalpipe/segment{ +"kxM" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 4 }, -/turf/open/floor/iron/white, -/area/station/medical/virology) +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 8 + }, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/ai_monitored/command/storage/eva) "kxP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40109,17 +39929,22 @@ }, /turf/open/floor/iron/dark/smooth_half, /area/station/hallway/floor4/fore) -"kyn" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/disposalpipe/segment, -/obj/machinery/shieldgen, -/turf/open/floor/iron/corner, -/area/station/cargo/miningdock) "kyo" = ( /obj/structure/lattice/catwalk, /obj/structure/cable/layer3, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"kyv" = ( +/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/yellow/line, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) "kyw" = ( /obj/machinery/gulag_teleporter, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -40169,24 +39994,29 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/maintenance/floor1/port/aft) +"kzr" = ( +/obj/structure/rack, +/obj/item/reagent_containers/cup/bottle/ethanol{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/bottle/carbon{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/bottle/chlorine{ + pixel_x = 1 + }, +/turf/open/floor/iron/dark/textured_edge{ + dir = 8 + }, +/area/station/medical/chemistry) "kzE" = ( /turf/closed/wall/r_wall, /area/station/maintenance/floor1/port) "kzK" = ( /turf/open/floor/iron, /area/station/hallway/floor2/aft) -"kzN" = ( -/obj/machinery/door/airlock/science{ - name = "Genetics" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/science/genetics, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/science/genetics) "kzP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40215,14 +40045,15 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/third) -"kAk" = ( -/obj/effect/turf_decal/trimline/blue/filled/end{ - dir = 8 +"kAe" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Science - Equipment Closet" }, -/obj/machinery/light/cold/directional/west, -/obj/machinery/firealarm/directional/west, /turf/open/floor/iron/white, -/area/station/medical/office) +/area/station/science/lower) "kAm" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -40235,16 +40066,6 @@ /obj/item/storage/box/masks, /turf/open/floor/iron/dark/textured, /area/station/medical/virology/isolation) -"kAq" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner, -/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/hallway) "kAu" = ( /obj/structure/disposalpipe/trunk{ dir = 4 @@ -40350,6 +40171,17 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/detectives_office/private_investigators_office) +"kBh" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 + }, +/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/science/robotics/lab) "kBi" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/machinery/computer/atmos_alert{ @@ -40417,16 +40249,11 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard/aft) -"kBI" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/station_engineer, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/lobby) +"kBK" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/orange/visible, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/station/engineering/supermatter) "kBL" = ( /obj/machinery/airalarm/directional/west, /turf/open/floor/eighties, @@ -40449,22 +40276,17 @@ /obj/structure/railing/corner, /turf/open/floor/wood/tile, /area/station/service/library) -"kCm" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/holopad, -/turf/open/floor/iron, -/area/station/science/genetics) "kCA" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, /area/station/medical/office) -"kCF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/starboard) +"kCR" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Xenobio - Starboard Pens" + }, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "kDg" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2{ dir = 1 @@ -40472,6 +40294,12 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/iron, /area/station/engineering/atmos) +"kDh" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal/incinerator) "kDq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -40500,18 +40328,17 @@ }, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"kDK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/smooth_corner{ + dir = 8 + }, +/area/station/commons/fitness/recreation) "kDN" = ( /obj/machinery/door/window/left/directional/south, /turf/open/floor/iron/dark/textured, /area/station/science/ordnance/storage) -"kDP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/light/directional/west, -/obj/machinery/status_display/ai/directional/west, -/turf/open/floor/iron, -/area/station/hallway/floor3/aft) "kDQ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -40578,10 +40405,6 @@ }, /turf/open/floor/engine/n2, /area/station/engineering/atmos) -"kEP" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall, -/area/station/maintenance/floor1/starboard/aft) "kET" = ( /obj/effect/turf_decal/tile/blue/half{ dir = 1 @@ -40611,6 +40434,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard) +"kEZ" = ( +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/hallway/floor1/fore) "kFb" = ( /obj/structure/chair/stool/bar/directional/north, /turf/open/floor/iron/kitchen, @@ -40619,6 +40448,15 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/floor2/port) +"kFi" = ( +/obj/effect/turf_decal/trimline/brown/arrow_cw{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/poster/official/random/directional/west, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "kFk" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/hidden/layer1{ dir = 4 @@ -40684,6 +40522,19 @@ }, /turf/open/floor/iron, /area/station/science/robotics/lab) +"kGe" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/carpet, +/area/station/commons/vacant_room/office) +"kGf" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/item/paper_bin, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/science/lab) "kGg" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/atmospherics/components/unary/thermomachine/freezer, @@ -40713,11 +40564,6 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/dark/textured_large, /area/station/service/library/printer) -"kGy" = ( -/obj/effect/turf_decal/trimline/blue/line, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server/upper) "kGz" = ( /obj/effect/decal/cleanable/glitter, /obj/effect/turf_decal/siding/blue{ @@ -40852,6 +40698,14 @@ /obj/structure/table/wood, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hos) +"kHP" = ( +/obj/machinery/computer/shuttle/mining{ + dir = 8 + }, +/obj/machinery/camera/autoname/directional/east, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/qm) "kHQ" = ( /obj/structure/chair/office{ dir = 1 @@ -40878,6 +40732,19 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/dark, /area/station/security/checkpoint) +"kHS" = ( +/obj/structure/closet/secure_closet/engineering_personal, +/obj/item/clothing/gloves/color/yellow, +/obj/machinery/requests_console/directional/south{ + department = "Engineering"; + name = "Engineering Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/mapping_helpers/requests_console/supplies, +/turf/open/floor/iron/dark/textured_corner{ + dir = 1 + }, +/area/station/engineering/lobby) "kHV" = ( /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/dark/side{ @@ -40950,11 +40817,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/atmos/pumproom) -"kIV" = ( -/obj/structure/filingcabinet/medical, -/obj/machinery/status_display/ai/directional/east, -/turf/open/floor/wood, -/area/station/science/research/abandoned) "kJg" = ( /obj/effect/turf_decal/trimline/purple/line{ dir = 1 @@ -40997,6 +40859,17 @@ /obj/effect/spawner/random/structure/girder, /turf/open/floor/plating, /area/station/maintenance/floor2/starboard/aft) +"kJY" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/fax{ + fax_name = "Psychology Office"; + name = "Psychology Office Fax Machine" + }, +/turf/open/floor/carpet, +/area/station/medical/psychology) "kKa" = ( /obj/machinery/status_display/ai/directional/south, /obj/structure/disposalpipe/segment{ @@ -41074,15 +40947,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/starboard/aft) -"kKM" = ( -/obj/effect/turf_decal/siding/white{ - dir = 8 - }, -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron/dark/textured, -/area/station/medical/office) "kKO" = ( /obj/machinery/atmospherics/components/binary/tank_compressor{ dir = 8 @@ -41090,6 +40954,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"kKQ" = ( +/obj/item/radio/intercom/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) "kKU" = ( /obj/structure/railing{ dir = 1 @@ -41191,15 +41060,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/pod, /area/station/maintenance/floor4/port/fore) -"kMh" = ( -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer4{ - dir = 8 - }, -/turf/closed/wall/r_wall, -/area/station/engineering/atmos/pumproom) "kMk" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/machinery/door/airlock/hatch{ @@ -41208,6 +41068,33 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard) +"kMl" = ( +/obj/structure/table, +/obj/item/ai_module/reset/purge, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/effect/spawner/random/aimodule/neutral{ + pixel_x = 15 + }, +/obj/machinery/computer/security/telescreen{ + desc = "Used for watching the AI Upload."; + dir = 4; + name = "AI Upload Monitor"; + network = list("aiupload"); + pixel_x = -29 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload_foyer) +"kMv" = ( +/obj/machinery/plumbing/receiver, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) "kMC" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 6 @@ -41235,13 +41122,14 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) -"kNd" = ( -/obj/machinery/vending/wallmed/directional/south, -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/iron/white, -/area/station/security/medical) +"kMX" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/newscaster/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/tile, +/area/station/service/library) "kNh" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/fluff/paper/stack{ @@ -41250,6 +41138,17 @@ }, /turf/open/floor/iron, /area/station/maintenance/floor4/starboard) +"kNn" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/duct, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "kNA" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -41259,6 +41158,25 @@ dir = 4 }, /area/station/hallway/floor2/aft) +"kNJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/mecha_part_fabricator{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white/smooth_large, +/area/station/science/robotics/lab) +"kNN" = ( +/obj/structure/cable, +/obj/structure/table/reinforced, +/obj/item/storage/fancy/donut_box, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/half{ + dir = 1 + }, +/area/station/engineering/lobby) "kNO" = ( /turf/closed/wall/r_wall, /area/station/security/prison/work) @@ -41291,19 +41209,6 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"kOj" = ( -/obj/effect/turf_decal/trimline/purple/line, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/public/glass{ - name = "Public Airlock" - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) "kOk" = ( /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/dark, @@ -41349,6 +41254,11 @@ /obj/structure/cable, /turf/open/floor/iron/textured_large, /area/station/cargo/storage) +"kOU" = ( +/obj/machinery/rnd/production/circuit_imprinter/department/science, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark/smooth_large, +/area/station/science/robotics/lab) "kPk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/stripes/line{ @@ -41474,6 +41384,14 @@ /obj/structure/cable, /turf/open/floor/iron/dark/side, /area/station/service/lawoffice) +"kQS" = ( +/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/side{ + dir = 1 + }, +/area/station/security/checkpoint) "kQW" = ( /obj/item/trench_tool, /obj/effect/decal/cleanable/molten_object/large{ @@ -41498,6 +41416,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) +"kRn" = ( +/obj/structure/mirror/directional/west, +/obj/machinery/light/small/directional/south, +/obj/structure/sink/directional/east, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/rd) "kRo" = ( /obj/item/stock_parts/subspace/analyzer, /obj/item/stock_parts/subspace/amplifier, @@ -41520,6 +41445,11 @@ /obj/structure/sink/kitchen/directional/west, /turf/open/floor/iron/dark, /area/station/security/execution/education) +"kRG" = ( +/obj/effect/spawner/random/structure/tank_holder, +/obj/effect/turf_decal/trimline/purple/warning, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor2/starboard) "kRI" = ( /obj/structure/chair/plastic{ dir = 4 @@ -41606,9 +41536,6 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/floor1/aft) -"kSR" = ( -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor2/aft) "kSU" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -41645,12 +41572,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron, /area/station/engineering/atmos/pumproom) -"kTf" = ( -/obj/structure/table, -/obj/item/clothing/glasses/welding, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/white, -/area/station/science/lower) "kTg" = ( /obj/effect/turf_decal/siding/wood, /obj/effect/turf_decal/trimline/green/filled/warning{ @@ -41688,6 +41609,11 @@ /obj/structure/sign/poster/random/directional/west, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"kTV" = ( +/obj/structure/bookcase/random/religion, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white/textured_large, +/area/station/service/chapel/office) "kTZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -41756,6 +41682,13 @@ /obj/machinery/vending/wallmed/directional/north, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"kUC" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron/dark, +/area/station/hallway/floor3/aft) "kUO" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/structure/cable, @@ -41763,6 +41696,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/pharmacy) +"kUU" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/machinery/camera/directional/north, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/service/hydroponics) "kUW" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -41844,7 +41785,6 @@ /area/station/medical/abandoned) "kVT" = ( /obj/machinery/light/small/directional/north, -/obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/floor2/port/aft) "kVY" = ( @@ -41895,12 +41835,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/floor3/starboard/fore) -"kWq" = ( -/obj/structure/closet/emcloset, -/obj/machinery/light/directional/south, -/obj/item/storage/toolbox/mechanical, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "kWr" = ( /obj/machinery/door/airlock/external{ name = "Construction Zone" @@ -41922,13 +41856,22 @@ /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) "kWD" = ( -/obj/structure/fireaxecabinet/directional/north, /obj/machinery/keycard_auth/directional/north{ pixel_x = -22 }, /obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/incident_display/delam/directional/north, /turf/open/floor/iron/dark, /area/station/command/bridge) +"kWJ" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/smooth_large, +/area/station/maintenance/disposal) "kWM" = ( /obj/item/stack/tile/wood, /obj/effect/decal/cleanable/dirt, @@ -41972,6 +41915,14 @@ name = "padded floor" }, /area/station/medical/psychology) +"kXs" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/cable, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/chapel{ + dir = 4 + }, +/area/station/service/chapel) "kXt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -41988,6 +41939,24 @@ /obj/effect/landmark/blobstart, /turf/open/floor/mineral/plastitanium/red, /area/station/maintenance/floor4/starboard/aft) +"kXN" = ( +/obj/structure/table/wood, +/obj/item/folder/red, +/obj/item/pen, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/obj/item/radio/intercom/directional/south{ + frequency = 1423; + name = "Interrogation Intercom" + }, +/turf/open/floor/iron/dark, +/area/station/security/interrogation) "kXP" = ( /obj/machinery/vending/wardrobe/chef_wardrobe, /turf/open/floor/wood/large, @@ -42052,6 +42021,11 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron, /area/station/cargo/storage) +"kZe" = ( +/obj/machinery/camera/autoname/directional/west, +/obj/machinery/light_switch/directional/west, +/turf/open/floor/carpet/orange, +/area/station/service/chapel/funeral) "kZg" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 9 @@ -42088,16 +42062,21 @@ }, /turf/open/floor/iron/white, /area/station/medical/storage) +"kZp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/clothing/glasses/regular, +/obj/machinery/light/directional/north, +/turf/open/floor/eighties, +/area/station/commons/dorms/room2) "kZv" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, /turf/open/floor/wood, /area/station/service/bar/atrium) -"kZF" = ( -/obj/machinery/light/warm/directional/west, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/carpet/royalblue, -/area/station/medical/break_room) "kZG" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -42105,6 +42084,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet, /area/station/service/abandoned_gambling_den) +"kZH" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/green/line{ + 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/dark, +/area/station/hallway/floor3/fore) "kZS" = ( /obj/effect/turf_decal/siding/wood, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -42112,16 +42103,6 @@ }, /turf/open/floor/wood/tile, /area/station/service/library) -"kZT" = ( -/obj/effect/turf_decal/trimline/purple/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, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "kZV" = ( /obj/structure/railing/corner, /obj/structure/cable, @@ -42152,12 +42133,6 @@ /obj/structure/cable, /turf/open/floor/iron/white/herringbone, /area/station/medical/patients_rooms) -"lag" = ( -/obj/structure/closet/crate/freezer/blood, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/light/cold/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) "laj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -42229,23 +42204,6 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard) -"lbg" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/disposal/delivery_chute{ - dir = 8; - name = "Space Chute" - }, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/structure/sign/warning/vacuum/external/directional/south{ - name = "WARNING: CHUTE LEADS DIRECTLY TO SPACE" - }, -/obj/structure/sign/warning/deathsposal/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "lbi" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -42253,10 +42211,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"lbj" = ( -/obj/effect/turf_decal/tile/yellow/half, -/turf/open/floor/iron/edge, -/area/station/engineering/atmos) "lbm" = ( /obj/machinery/camera/preset/ordnance{ dir = 1 @@ -42268,6 +42222,12 @@ initial_gas_mix = "TEMP=2.7" }, /area/station/science/ordnance/bomb) +"lbp" = ( +/obj/machinery/vending/wardrobe/sec_wardrobe, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/lockers) "lbq" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/chair/sofa/corner/brown{ @@ -42284,6 +42244,13 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/pod/light, /area/station/maintenance/solars/port/aft) +"lbt" = ( +/obj/structure/closet/secure_closet/brig/genpop, +/obj/effect/turf_decal/tile/red/half, +/obj/item/card/id/advanced/prisoner/four, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark/side, +/area/station/security/brig) "lbu" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -42299,6 +42266,10 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"lbJ" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end, +/turf/open/floor/plating, +/area/station/science/xenobiology) "lbK" = ( /obj/structure/chair/stool/bar/directional/south, /obj/effect/decal/cleanable/confetti, @@ -42307,10 +42278,23 @@ }, /turf/open/floor/eighties, /area/station/commons/fitness/recreation/entertainment) -"lbM" = ( -/obj/structure/weightmachine/weightlifter, -/turf/open/floor/noslip, -/area/station/commons/fitness) +"lbO" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/syringes{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/item/storage/box/beakers{ + pixel_x = -3; + pixel_y = 4 + }, +/obj/item/reagent_containers/dropper, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "lbT" = ( /obj/structure/table, /obj/machinery/computer/libraryconsole/bookmanagement{ @@ -42352,6 +42336,26 @@ "lcv" = ( /turf/closed/wall/r_wall, /area/station/maintenance/floor2/port) +"lcB" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/structure/rack, +/obj/item/stock_parts/matter_bin{ + pixel_x = 2; + pixel_y = -5 + }, +/obj/item/stock_parts/matter_bin{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Science - R&D Lab" + }, +/obj/machinery/firealarm/directional/north, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/science/lab) "lcF" = ( /obj/effect/turf_decal/tile/green/half{ dir = 4 @@ -42376,6 +42380,12 @@ }, /turf/open/floor/carpet/orange, /area/station/service/chapel/office) +"lcT" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/grass, +/area/station/science/cytology) "lcU" = ( /obj/effect/landmark/carpspawn, /turf/open/floor/engine/hull/reinforced, @@ -42458,12 +42468,21 @@ }, /turf/open/floor/wood, /area/station/service/bar/atrium) -"ldQ" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 +"ldV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/holopad, +/turf/open/floor/wood, +/area/station/service/kitchen/diner) +"lem" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/maintenance/radshelter/sci) +/obj/structure/closet/secure_closet/brig{ + name = "Prisoner Locker" + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "len" = ( /obj/machinery/status_display/evac/directional/west, /obj/effect/decal/cleanable/dirt, @@ -42525,17 +42544,6 @@ /obj/structure/closet/emcloset, /turf/open/floor/iron, /area/station/hallway/floor3/fore) -"leJ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 8 - }, -/turf/open/floor/iron/smooth_edge{ - dir = 1 - }, -/area/station/science/research/abandoned) "leY" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 6 @@ -42578,21 +42586,6 @@ "lfy" = ( /turf/open/floor/plating, /area/station/maintenance/floor2/port) -"lfF" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/ai_slipper{ - uses = 10 - }, -/obj/effect/landmark/navigate_destination/sec, -/obj/effect/spawner/random/engineering/tracking_beacon, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/security/brig) "lfG" = ( /obj/machinery/light/small/red/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -42612,10 +42605,6 @@ /obj/structure/disposalpipe/segment, /turf/open/openspace, /area/station/maintenance/floor4/starboard/fore) -"lfQ" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/commons/locker) "lfU" = ( /turf/open/floor/plating/airless, /area/station/solars/starboard/aft) @@ -42650,25 +42639,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"lgk" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 6 - }, -/obj/machinery/status_display/ai/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/hallway/floor2/fore) "lgs" = ( -/obj/effect/turf_decal/stripes{ - dir = 5 +/obj/structure/sign/poster/random/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/decal/cleanable/oil, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 }, -/turf/open/floor/plating, -/area/station/maintenance/floor1/starboard/fore) +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "lgv" = ( /obj/structure/rack, /obj/item/book/manual/nuclear, @@ -42695,13 +42674,22 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) -"lgI" = ( -/obj/machinery/light/small/red/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"lgD" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/line, /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, -/area/station/maintenance/floor1/starboard) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Public Airlock" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/fore) "lgO" = ( /obj/structure/closet/emcloset/anchored, /obj/effect/turf_decal/trimline/blue/warning, @@ -42718,6 +42706,12 @@ /obj/effect/mapping_helpers/airlock/access/any/command/teleporter, /turf/open/floor/iron/dark, /area/station/command/teleporter) +"lgY" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/science/xenobiology/hallway) "lgZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -42727,26 +42721,12 @@ dir = 8 }, /area/station/cargo/miningdock) -"lhc" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner, -/obj/structure/sign/departments/rndserver/directional/south, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "lhh" = ( /obj/structure/closet/radiation, /turf/open/floor/plating, /area/station/engineering/supermatter/room) "lhi" = ( -/obj/machinery/modular_computer/console/preset/command, +/obj/machinery/modular_computer/preset/command, /turf/open/floor/carpet/blue, /area/station/command/bridge) "lhl" = ( @@ -42755,13 +42735,17 @@ /obj/structure/rack, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/aft) -"lhq" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/closet/firecloset/full, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron/white, -/area/station/science/cytology) +"lhv" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/structure/rack, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/obj/item/wrench, +/turf/open/floor/iron, +/area/station/commons/vacant_room/commissary) "lhy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -42777,29 +42761,33 @@ }, /turf/open/floor/iron/checker, /area/station/commons/vacant_room/commissary) -"lhB" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/machinery/computer/records/medical/laptop, -/obj/structure/table, -/turf/open/floor/iron, -/area/station/science/genetics) "lhO" = ( /obj/structure/chair{ dir = 1 }, /turf/open/floor/iron/dark, /area/station/security/courtroom) -"lhP" = ( -/obj/effect/turf_decal/trimline/blue/line{ +"lhR" = ( +/obj/machinery/computer/operating{ + dir = 1 + }, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/robotics/lab) +"lhS" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/white/corner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server/upper) +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/science/cytology) "lhT" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ @@ -42872,17 +42860,16 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/robotics/lab) +"ljf" = ( +/obj/machinery/rnd/production/techfab/department/service, +/obj/effect/turf_decal/bot, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/service) "ljh" = ( /obj/machinery/light/dim/directional/west, /turf/open/floor/grass, /area/station/maintenance/floor3/starboard) -"lji" = ( -/obj/machinery/door/window/brigdoor{ - dir = 1 - }, -/mob/living/simple_animal/pet/fox, -/turf/open/floor/noslip, -/area/station/maintenance/floor1/port) "ljs" = ( /obj/machinery/flasher/portable, /obj/machinery/camera/directional/east{ @@ -42933,19 +42920,6 @@ dir = 4 }, /area/station/hallway/floor1/fore) -"lkl" = ( -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 6 - }, -/obj/machinery/light/directional/west, -/obj/machinery/status_display/ai/directional/west, -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/hallway/floor1/fore) "lks" = ( /obj/effect/spawner/random/maintenance/two, /turf/open/floor/pod/light, @@ -42973,6 +42947,17 @@ dir = 1 }, /area/station/medical/chemistry) +"lkI" = ( +/obj/structure/table, +/obj/item/storage/box/bandages{ + pixel_y = 6; + pixel_x = -6 + }, +/obj/item/storage/box/donkpockets{ + pixel_x = 6 + }, +/turf/open/floor/catwalk_floor/iron, +/area/station/cargo/storage) "lkP" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -42981,15 +42966,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/commons/dorms/apartment2) -"lkQ" = ( -/turf/closed/wall/r_wall, -/area/station/maintenance/radshelter/sci) "lkV" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ dir = 9 }, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"lkX" = ( +/obj/machinery/chem_heater/withbuffer, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/textured_large, +/area/station/medical/chemistry) "lkY" = ( /obj/structure/hedge/opaque, /obj/structure/window/reinforced/spawner/directional/east, @@ -43015,18 +43002,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/science/lobby) -"lli" = ( -/obj/machinery/door/firedoor/heavy, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/hallway/floor2/aft) "llm" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/effect/mapping_helpers/airlock/cyclelink_helper, @@ -43080,14 +43055,6 @@ }, /turf/open/floor/iron, /area/station/hallway/floor2/fore) -"llO" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron/white, -/area/station/science/cytology) "llQ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -43107,15 +43074,6 @@ }, /turf/open/floor/iron, /area/station/cargo/miningdock) -"llS" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner, -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/ai_monitored/command/storage/eva) "llT" = ( /obj/item/storage/fancy/donut_box, /obj/structure/table/glass, @@ -43139,18 +43097,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) -"lmg" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/ai_monitored/command/storage/eva) "lmk" = ( /obj/effect/turf_decal/trimline/red/warning{ dir = 8 @@ -43194,11 +43140,6 @@ /obj/machinery/door/window/right, /turf/open/misc/beach/sand, /area/station/hallway/secondary/entry) -"lmP" = ( -/obj/structure/bonfire, -/obj/item/melee/moonlight_greatsword, -/turf/open/floor/stone, -/area/station/maintenance/floor3/starboard/fore) "lmU" = ( /obj/structure/table/reinforced, /obj/effect/spawner/random/entertainment/lighter, @@ -43231,14 +43172,6 @@ dir = 8 }, /area/station/security/office) -"lnr" = ( -/obj/effect/turf_decal/trimline/green/filled/corner{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron/dark, -/area/station/hallway/floor3/aft) "lnA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43264,16 +43197,19 @@ /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/floor/grass, /area/station/service/bar/atrium) +"lnN" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/red/dim/directional/east, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/port) "lnU" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/effect/spawner/random/structure/tank_holder, /turf/open/floor/pod/light, /area/station/maintenance/floor2/starboard/fore) -"lnV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/broken/directional/east, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen/abandoned) "lnX" = ( /obj/structure/railing{ dir = 4 @@ -43392,34 +43328,23 @@ /obj/structure/bookcase/random/nonfiction, /turf/open/floor/carpet/royalblack, /area/station/service/library) -"lpv" = ( -/obj/effect/turf_decal/siding/white/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/purple/corner, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"lpA" = ( -/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/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "lpB" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 4 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/maintenance/floor2/starboard) +"lpF" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/duct, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/chapel{ + dir = 8 + }, +/area/station/service/chapel) "lpH" = ( /obj/structure/chair/comfy/carp{ dir = 1 @@ -43457,17 +43382,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/light/colour_cycle/dancefloor_a, /area/station/maintenance/floor2/port/fore) -"lqi" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/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, -/obj/effect/landmark/start/depsec/engineering, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "lqu" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -43479,27 +43393,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/surgery/fore) -"lqB" = ( -/obj/effect/spawner/random/structure/table_or_rack, -/obj/effect/spawner/random/maintenance/two, -/obj/machinery/light/red/dim/directional/south, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/port) -"lqE" = ( -/obj/effect/turf_decal/siding/white/corner{ - dir = 4 - }, -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/purple/corner{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "lqI" = ( /obj/machinery/light/small/directional/east, /obj/structure/toilet{ @@ -43515,18 +43408,13 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard/aft) -"lqU" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/structure/cable, -/obj/machinery/chem_mass_spec, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) "lrA" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, /area/station/maintenance/floor2/port) "lrM" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/pod/light, /area/station/maintenance/solars/starboard/aft) "lrN" = ( @@ -43536,19 +43424,14 @@ }, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"lrV" = ( -/obj/effect/turf_decal/trimline/red/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/red/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"lrR" = ( /obj/structure/cable, -/obj/structure/disposalpipe/junction/flip{ - dir = 8 +/obj/structure/disposalpipe/segment{ + dir = 10 }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/fore) +/obj/machinery/light/small/directional/north, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/disposal) "lsm" = ( /obj/structure/railing/corner{ dir = 1 @@ -43613,6 +43496,18 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/dark/side, /area/station/hallway/floor1/fore) +"ltb" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/item/paper_bin/carbon{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/item/pen, +/turf/open/floor/carpet, +/area/station/medical/psychology) "lti" = ( /obj/machinery/door/airlock/grunge{ name = "Morgue" @@ -43637,6 +43532,10 @@ }, /turf/open/floor/iron/white, /area/station/science/robotics/lab) +"lty" = ( +/obj/structure/flora/bush/lavendergrass/style_random, +/turf/open/floor/grass, +/area/station/security/courtroom) "ltC" = ( /obj/structure/table/wood, /obj/item/paper_bin, @@ -43758,10 +43657,26 @@ "luI" = ( /turf/open/floor/engine/vacuum, /area/station/engineering/atmos) -"luK" = ( -/obj/machinery/light/directional/north, +"luJ" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/computer/records/security{ + dir = 4 + }, +/obj/machinery/newscaster/directional/west, /turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) +/area/station/security/checkpoint/first) +"luS" = ( +/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/wood/end{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/floor/carpet/red, +/area/station/service/library/artgallery) "luZ" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/dirt, @@ -43797,12 +43712,6 @@ }, /turf/open/floor/carpet, /area/station/commons/vacant_room/office) -"lvy" = ( -/obj/machinery/light/directional/west, -/obj/structure/table, -/obj/machinery/microwave, -/turf/open/floor/catwalk_floor/iron, -/area/station/cargo/storage) "lvC" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -43812,14 +43721,6 @@ }, /turf/open/floor/carpet/royalblack, /area/station/service/kitchen/diner) -"lvE" = ( -/obj/effect/landmark/start/prisoner, -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/wood/large, -/area/station/security/prison/safe) "lvJ" = ( /obj/machinery/door/firedoor, /obj/structure/table/reinforced, @@ -43883,6 +43784,19 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"lwD" = ( +/obj/item/wheelchair{ + pixel_y = -3 + }, +/obj/item/wheelchair, +/obj/item/wheelchair{ + pixel_y = 3 + }, +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white/textured, +/area/station/medical/storage) "lwP" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -44022,12 +43936,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) -"lyN" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) "lyP" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -44059,6 +43967,10 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) +"lzp" = ( +/obj/structure/sign/poster/official/wtf_is_co2/directional/west, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "lzq" = ( /obj/structure/railing{ dir = 6 @@ -44113,6 +44025,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/checker, /area/station/cargo/miningdock) +"lAD" = ( +/obj/effect/turf_decal/trimline/green/filled/arrow_cw{ + dir = 10 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/iron/dark/textured, +/area/station/medical/virology/isolation) "lAH" = ( /obj/structure/flora/bush/sparsegrass/style_random, /obj/item/stack/rods{ @@ -44143,28 +44065,10 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos) -"lBs" = ( -/obj/effect/landmark/blobstart, -/turf/open/floor/engine, -/area/station/science/cytology) "lBv" = ( /obj/effect/spawner/random/structure/table, /turf/open/floor/plating, /area/station/maintenance/floor1/port) -"lBy" = ( -/obj/effect/turf_decal/trimline/green/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/green/line{ - dir = 8 - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/heavy, -/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/hallway/floor3/fore) "lBB" = ( /obj/structure/rack, /obj/item/reagent_containers/cup/bottle/phosphorus{ @@ -44222,12 +44126,19 @@ /obj/item/bikehorn/rubberducky, /obj/structure/fluff{ desc = "What, you think the water just magically soaks into the metallic flooring?"; - icon = 'icons/obj/lavaland/survival_pod.dmi'; + icon = 'icons/obj/mining_zones/survival_pod.dmi'; icon_state = "fan_tiny"; name = "shower drain" }, /turf/open/floor/iron/white/small, /area/station/commons/fitness/recreation) +"lCf" = ( +/obj/effect/turf_decal/trimline/green/warning, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/side{ + dir = 6 + }, +/area/station/hallway/floor3/fore) "lCg" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -44282,13 +44193,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/aft) -"lCW" = ( -/obj/machinery/light/small/red/directional/east, -/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, -/area/station/maintenance/floor1/starboard) "lCZ" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/siding/thinplating_new{ @@ -44419,6 +44323,15 @@ /obj/effect/spawner/random/trash/grille_or_waste, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) +"lEy" = ( +/obj/effect/turf_decal/trimline/green/arrow_ccw{ + dir = 1 + }, +/obj/machinery/shower/directional/north, +/obj/effect/decal/cleanable/vomit/old, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white/small, +/area/station/commons/fitness/recreation) "lEz" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -44433,32 +44346,10 @@ /obj/structure/cable, /turf/open/floor/eighties, /area/station/commons/dorms/room2) -"lEC" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "lEI" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/aft) -"lEJ" = ( -/obj/machinery/light/directional/north, -/obj/machinery/airalarm/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/smooth, -/area/station/tcommsat/computer) -"lES" = ( -/obj/effect/turf_decal/trimline/purple/line, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 1 - }, -/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/dark, -/area/station/hallway/floor2/fore) "lET" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -44515,6 +44406,14 @@ /obj/machinery/duct, /turf/open/floor/iron/showroomfloor, /area/station/service/kitchen/diner) +"lFJ" = ( +/obj/structure/sign/poster/official/random/directional/north, +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/iron/checker, +/area/station/commons/vacant_room/commissary) "lFL" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 4 @@ -44529,6 +44428,13 @@ /obj/effect/turf_decal/bot, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) +"lFY" = ( +/obj/structure/chair/sofa/left/brown{ + dir = 4 + }, +/obj/effect/landmark/start/cook, +/turf/open/floor/wood/large, +/area/station/service/kitchen/kitchen_backroom) "lGb" = ( /obj/structure/toilet{ dir = 8 @@ -44537,14 +44443,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/freezer, /area/station/service/chapel) -"lGe" = ( -/obj/machinery/newscaster/directional/east, -/obj/machinery/light/directional/north, -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/station/commons/vacant_room/commissary) "lGh" = ( /obj/structure/railing{ dir = 4 @@ -44590,19 +44488,6 @@ }, /turf/open/floor/iron, /area/station/hallway/floor2/aft) -"lGH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/table/glass, -/obj/item/storage/box/beakers, -/obj/item/knife, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/item/biopsy_tool{ - pixel_x = 8; - pixel_y = 2 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) "lGJ" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -44640,17 +44525,6 @@ dir = 1 }, /area/station/medical/chemistry) -"lHG" = ( -/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, -/obj/machinery/light/dim/directional/west, -/obj/structure/disposalpipe/segment, -/turf/open/floor/carpet/red, -/area/station/service/theater) "lHQ" = ( /obj/effect/spawner/random/structure/grille, /turf/open/floor/pod/light, @@ -44671,6 +44545,26 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/starboard/fore) +"lIh" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 8 + }, +/obj/machinery/keycard_auth/directional/east{ + pixel_x = 25; + pixel_y = 16 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Command - Research Director's Office" + }, +/obj/machinery/requests_console/directional/east{ + department = "Research Director's Desk"; + name = "Research Director's Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/rd) "lIm" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/white/corner, @@ -44690,17 +44584,6 @@ }, /turf/open/floor/engine/cult, /area/station/service/library/private) -"lIr" = ( -/obj/structure/chair{ - name = "Judge" - }, -/obj/machinery/camera/directional/north{ - c_tag = "Courtroom" - }, -/obj/machinery/status_display/ai/directional/north, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) "lIt" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Bulkhead" @@ -44832,12 +44715,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/aft) -"lJG" = ( -/obj/structure/window/spawner/directional/south, -/obj/structure/rack, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/iron/smooth, -/area/station/science/research/abandoned) "lJN" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -44845,12 +44722,6 @@ /obj/effect/turf_decal/box, /turf/open/floor/wood, /area/station/medical/psychology) -"lJS" = ( -/obj/effect/turf_decal/trimline/neutral/filled/end, -/obj/machinery/light/small/directional/south, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron, -/area/station/hallway/floor2/fore) "lJZ" = ( /obj/structure/cable/multilayer/multiz, /obj/effect/turf_decal/stripes/line{ @@ -44948,11 +44819,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) -"lLe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/circuit/green, -/area/station/science/robotics/mechbay) "lLm" = ( /obj/effect/turf_decal/caution/stand_clear/white{ dir = 4 @@ -44977,6 +44843,19 @@ /obj/machinery/disposal/bin, /turf/open/floor/iron, /area/station/service/chapel) +"lLy" = ( +/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/yellow/line, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Public Airlock" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/aft) "lLB" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -44992,6 +44871,17 @@ }, /turf/open/floor/iron/dark/textured, /area/station/medical/pharmacy) +"lLL" = ( +/obj/effect/turf_decal/siding/white/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/table/glass, +/obj/machinery/fax{ + fax_name = "Research Director's Office"; + name = "Research Director's Fax Machine" + }, +/turf/open/floor/iron/large, +/area/station/command/heads_quarters/rd) "lLO" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -45000,21 +44890,25 @@ /obj/machinery/door/airlock/external{ name = "External Airlock" }, -/obj/structure/cable, /obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/plating, /area/station/maintenance/floor2/port/aft) -"lMp" = ( -/obj/item/kirbyplants/random/dead/research_director, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/rd) -"lMt" = ( -/obj/structure/cable, -/turf/open/floor/iron/white/smooth_corner, -/area/station/commons/fitness/recreation) +"lLW" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) +"lMj" = ( +/obj/effect/turf_decal/trimline/white/arrow_ccw, +/obj/machinery/camera/autoname/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/secondary/entry) "lMx" = ( /obj/structure/railing/corner{ dir = 4 @@ -45024,17 +44918,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard/fore) -"lMz" = ( -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 8 - }, -/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/smooth_edge{ - dir = 1 - }, -/area/station/science/research/abandoned) "lMC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/trimline/blue/filled/warning{ @@ -45053,26 +44936,10 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/fore) -"lMH" = ( -/obj/machinery/light/directional/west, -/obj/machinery/chem_heater/withbuffer, -/turf/open/floor/iron/textured_large, -/area/station/medical/chemistry) "lMN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/lobby) -"lMQ" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/ai_monitored/command/storage/eva) "lMR" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/machinery/light/cold/no_nightlight/directional/south, @@ -45100,6 +44967,10 @@ dir = 1 }, /area/station/hallway/floor3/fore) +"lNs" = ( +/obj/machinery/light/red/dim/directional/east, +/turf/open/openspace, +/area/station/maintenance/floor3/port/fore) "lNx" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 4 @@ -45123,11 +44994,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/floor3/starboard/aft) -"lNE" = ( -/obj/machinery/modular_computer/console/preset/id, -/obj/machinery/light/directional/north, -/turf/open/floor/wood/large, -/area/station/command/heads_quarters/qm) "lNN" = ( /obj/structure/table, /obj/effect/turf_decal/tile/purple/opposingcorners, @@ -45158,14 +45024,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/commons/fitness) -"lNY" = ( -/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/smooth_corner{ - dir = 8 - }, -/area/station/commons/fitness/recreation) "lOc" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/structure/cable, @@ -45221,6 +45079,14 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"lOq" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/vending/clothing, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/white/herringbone, +/area/station/medical/patients_rooms) "lOz" = ( /obj/structure/closet/secure_closet/personal/patient, /turf/open/floor/iron/white, @@ -45254,14 +45120,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/command/heads_quarters/ce) -"lOS" = ( -/obj/machinery/light/directional/west, -/obj/structure/table, -/obj/item/clothing/mask/cigarette/candy{ - pixel_x = 4 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/floor1/aft) "lPb" = ( /obj/structure/railing{ dir = 1 @@ -45277,18 +45135,20 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron/dark, /area/station/security/holding_cell) -"lPg" = ( -/obj/structure/cable, -/obj/structure/chair/sofa/left/brown{ +"lPj" = ( +/obj/effect/turf_decal/trimline/blue/line{ dir = 4 }, -/obj/effect/landmark/start/cook, -/turf/open/floor/wood/large, -/area/station/service/kitchen/kitchen_backroom) -"lPi" = ( -/obj/machinery/light/broken/directional/north, -/turf/open/misc/dirt/jungle, -/area/station/service/hydroponics/garden/abandoned) +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/obj/effect/turf_decal/trimline/purple/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/dark, +/area/station/hallway/floor2/fore) "lPl" = ( /obj/structure/reagent_dispensers/plumbed/fuel, /obj/effect/decal/cleanable/dirt, @@ -45301,18 +45161,6 @@ /obj/machinery/duct, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port) -"lPs" = ( -/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, -/obj/effect/turf_decal/trimline/yellow/line, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) "lPt" = ( /obj/effect/spawner/structure/window/hollow/reinforced/directional{ dir = 8 @@ -45320,11 +45168,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/prison) -"lPw" = ( -/obj/effect/turf_decal/trimline/green/filled/corner, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/hallway/floor3/aft) "lPz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -45386,6 +45229,14 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/carpet/red, /area/station/service/theater) +"lQb" = ( +/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/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "lQc" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -45408,6 +45259,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"lQn" = ( +/obj/machinery/computer/security, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/security/checkpoint/second) "lQo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -45442,10 +45298,12 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood/tile, /area/station/service/library) -"lQD" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/orange/visible, -/turf/open/floor/plating, -/area/station/engineering/supermatter) +"lQv" = ( +/obj/effect/landmark/navigate_destination/engineering, +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/hallway/floor1/aft) "lQI" = ( /turf/open/openspace, /area/station/maintenance/floor2/port/fore) @@ -45522,12 +45380,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/floor3/aft) -"lRO" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/entertainment/musical_instrument, -/obj/machinery/light/directional/south, -/turf/open/floor/wood/tile, -/area/station/commons/fitness/recreation) "lRP" = ( /obj/machinery/door/airlock/highsecurity{ name = "Electrical Maintenance" @@ -45535,12 +45387,6 @@ /obj/effect/mapping_helpers/airlock/access/any/engineering/general, /turf/open/floor/iron, /area/station/engineering/engine_smes) -"lRQ" = ( -/obj/structure/lattice/catwalk, -/obj/structure/hedge, -/obj/machinery/light/cold/no_nightlight/directional/east, -/turf/open/openspace, -/area/station/science/cytology) "lRR" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -45658,6 +45504,13 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos/hfr_room) +"lTg" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet/red, +/area/station/service/theater) "lTl" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 6 @@ -45686,11 +45539,6 @@ /obj/machinery/holopad/secure, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat/hallway) -"lTw" = ( -/obj/machinery/light/directional/south, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "lTA" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Access" @@ -45745,12 +45593,6 @@ /obj/effect/decal/cleanable/blood/footprints, /turf/open/floor/iron/kitchen, /area/station/service/kitchen/abandoned) -"lUh" = ( -/obj/structure/chair/sofa/bench{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) "lUo" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/table_or_rack, @@ -45781,6 +45623,20 @@ dir = 4 }, /area/station/medical/chemistry) +"lUO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/door/airlock/science/glass{ + name = "Slime Enrichment Center" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/science/xenobio, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology/hallway) "lUY" = ( /obj/effect/turf_decal/bot, /obj/effect/spawner/random/structure/crate, @@ -45837,6 +45693,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/checkpoint/third) +"lVR" = ( +/obj/structure/chair/sofa/right{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/medical/psychology) "lVU" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 4 @@ -45871,10 +45733,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard) -"lWl" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/cargo/storage) "lWA" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 9 @@ -45884,37 +45742,27 @@ "lWH" = ( /turf/closed/wall, /area/station/command/heads_quarters/qm) +"lWN" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/monkeycubes{ + pixel_x = -5; + pixel_y = 1 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard) "lWQ" = ( /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, /area/station/maintenance/floor1/port) -"lWR" = ( -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/airalarm/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) -"lWU" = ( -/obj/machinery/door/window/left/directional/south{ - name = "Pen 3"; - req_access = list("xenobiology") - }, -/obj/effect/turf_decal/stripes{ - dir = 6 - }, -/obj/structure/sink/directional/west, -/obj/machinery/requests_console/directional/east{ - department = "Xenobiology"; - name = "Xenobiology Requests Console" +"lXb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/gym/mirrored{ + pixel_y = 32 }, -/obj/effect/mapping_helpers/requests_console/ore_update, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) +/turf/open/floor/iron/dark/textured, +/area/station/commons/fitness) "lXj" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -45983,14 +45831,6 @@ /obj/structure/sign/poster/random/directional/west, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port/aft) -"lXQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/sign/departments/medbay/alt/directional/south, -/obj/effect/turf_decal/trimline/blue/filled/line, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "lXT" = ( /obj/structure/railing, /obj/effect/decal/cleanable/dirt, @@ -46064,11 +45904,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, -/obj/machinery/camera{ - c_tag = "Atmospherics Cam #5"; - dir = 5; - network = list("ss13","engine") - }, /turf/open/floor/iron, /area/station/engineering/atmos) "lYu" = ( @@ -46124,10 +45959,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark/smooth_large, /area/station/commons/storage/primary) -"lYW" = ( -/obj/item/kirbyplants/random, -/turf/open/floor/wood, -/area/station/medical/psychology) "lYX" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet/blue, @@ -46145,6 +45976,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) +"lZi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "lZl" = ( /obj/structure/reagent_dispensers/plumbed, /obj/effect/decal/cleanable/dirt, @@ -46165,13 +46000,21 @@ /obj/item/experi_scanner, /turf/open/floor/iron/dark/smooth_large, /area/station/science/lobby) -"lZQ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/starboard) +"lZH" = ( +/obj/effect/turf_decal/trimline/neutral/filled/end, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron, +/area/station/hallway/floor2/fore) +"lZS" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) +"maf" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "map" = ( /obj/structure/door_assembly/door_assembly_med, /obj/machinery/door/firedoor, @@ -46195,6 +46038,13 @@ "mau" = ( /turf/closed/wall/r_wall, /area/station/security/lockers) +"maD" = ( +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/dark/textured, +/area/station/medical/morgue) "maL" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/machinery/door/airlock/hatch{ @@ -46251,12 +46101,6 @@ /obj/machinery/space_heater, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard) -"mbt" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/science/cytology) "mbv" = ( /obj/machinery/vending/coffee, /obj/effect/turf_decal/siding/wood, @@ -46308,6 +46152,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) +"mbM" = ( +/obj/machinery/fax{ + fax_name = "Service Hallway"; + name = "Service Fax Machine" + }, +/obj/structure/table/reinforced, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/hallway/secondary/service) "mbS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /obj/effect/spawner/structure/window/hollow/reinforced/plasma/middle, @@ -46343,7 +46197,6 @@ }, /obj/structure/table/reinforced, /obj/item/storage/medkit/regular, -/obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/window/right/directional/south{ name = "First Aid Supplies"; @@ -46361,6 +46214,12 @@ }, /turf/open/floor/iron/white, /area/station/science/lobby) +"mcj" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) "mcm" = ( /obj/structure/chair{ dir = 1 @@ -46424,6 +46283,11 @@ /obj/effect/turf_decal/tile/green/opposingcorners, /turf/open/floor/iron/white, /area/station/medical/virology) +"mcO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/garbage, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "mcU" = ( /obj/structure/closet/athletic_mixed, /obj/effect/landmark/start/hangover/closet, @@ -46443,15 +46307,13 @@ /obj/effect/turf_decal/trimline/green/filled/corner, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) -"mdc" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/commons/dorms/apartment2) +"mdd" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/disposalpipe/segment, +/obj/machinery/shieldgen, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/corner, +/area/station/cargo/miningdock) "mdl" = ( /obj/effect/turf_decal/trimline/yellow/warning, /obj/effect/turf_decal/trimline/yellow/warning{ @@ -46467,19 +46329,11 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/space/nearstation) -"mds" = ( -/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/machinery/status_display/ai/directional/west, -/turf/open/floor/iron, -/area/station/hallway/floor1/aft) "mdB" = ( /turf/open/floor/iron, /area/station/commons/fitness/recreation) "mdC" = ( -/turf/open/floor/fake_snow{ +/turf/open/misc/snow/actually_safe{ icon_state = "snow7" }, /area/station/hallway/floor2/fore) @@ -46529,6 +46383,14 @@ }, /turf/open/floor/iron, /area/station/hallway/floor1/aft) +"mdU" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/item/flashlight/lamp/green, +/turf/open/floor/carpet, +/area/station/medical/psychology) "mdZ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -46537,27 +46399,6 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/office) -"mea" = ( -/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/yellow/line, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 1 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/aft) -"mee" = ( -/obj/effect/turf_decal/trimline/white/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 4 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "mek" = ( /turf/closed/wall, /area/station/security/prison/shower) @@ -46571,11 +46412,6 @@ /obj/machinery/shower/directional/east, /turf/open/floor/noslip, /area/station/science/lobby) -"meo" = ( -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/pipe/layer_manifold/pink/visible, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/pumproom) "mew" = ( /obj/machinery/camera/autoname/directional/west, /obj/machinery/firealarm/directional/west, @@ -46616,11 +46452,6 @@ /obj/machinery/duct, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/cmo) -"meK" = ( -/obj/structure/closet/emcloset, -/obj/structure/cable, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/fore) "meU" = ( /obj/machinery/airalarm/directional/west, /turf/open/floor/pod/dark, @@ -46647,14 +46478,6 @@ dir = 4 }, /area/station/hallway/floor3/fore) -"mfw" = ( -/obj/machinery/vending/autodrobe, -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/iron/dark, -/area/station/service/library/lounge) "mfC" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -46684,6 +46507,16 @@ /obj/effect/spawner/random/contraband/cannabis, /turf/open/floor/iron, /area/station/maintenance/floor1/port/aft) +"mfM" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/pai_card, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/checker, +/area/station/service/bar/atrium) "mfQ" = ( /obj/structure/reagent_dispensers/fueltank, /obj/machinery/door/window/left/directional/south{ @@ -46714,6 +46547,18 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/starboard) +"mge" = ( +/obj/effect/turf_decal/trimline/blue/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/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/dark, +/area/station/hallway/floor2/fore) "mgf" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -46753,13 +46598,6 @@ /obj/machinery/duct, /turf/open/floor/pod/dark, /area/station/maintenance/floor4/port) -"mgz" = ( -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) "mgA" = ( /obj/structure/sign/warning/radiation/rad_area, /turf/closed/wall, @@ -46785,6 +46623,12 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark, /area/station/security/warden) +"mgY" = ( +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/machinery/light/directional/south, +/turf/open/floor/grass, +/area/station/hallway/floor1/aft) "mha" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -46808,6 +46652,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/textured_large, /area/station/cargo/sorting) +"mho" = ( +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/security/brig) "mhp" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -46832,6 +46684,10 @@ /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/iron/dark/side, /area/station/hallway/floor1/aft) +"mhu" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) "mhE" = ( /obj/structure/chair/wood{ dir = 8 @@ -46918,6 +46774,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/textured_large, /area/station/hallway/secondary/exit/departure_lounge) +"miF" = ( +/obj/effect/turf_decal/trimline/purple/line, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 1 + }, +/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/dark, +/area/station/hallway/floor2/fore) "miH" = ( /obj/machinery/holopad, /turf/open/floor/carpet/red, @@ -46958,6 +46824,14 @@ }, /turf/open/floor/iron/white, /area/station/medical/storage) +"mjM" = ( +/obj/machinery/modular_computer/preset/id{ + 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/hos) "mjQ" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/brown{ @@ -47003,6 +46877,13 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat) +"mkO" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor1/aft) "mkZ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -47090,20 +46971,6 @@ /obj/structure/lattice/catwalk, /turf/open/space/openspace, /area/station/solars/starboard/aft) -"mlV" = ( -/obj/item/kirbyplants/random, -/obj/machinery/light/small/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Command - Research Director's Quarters #1" - }, -/obj/effect/baseturf_helper/reinforced_plating/ceiling, -/turf/open/floor/iron/large, -/area/station/command/heads_quarters/rd) -"mlW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/purple/visible, -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/engine/air, -/area/station/engineering/atmos/pumproom) "mlX" = ( /obj/structure/chair/comfy/brown, /obj/effect/landmark/start/assistant, @@ -47121,21 +46988,6 @@ /obj/structure/sign/poster/contraband/clown, /turf/closed/wall, /area/station/service/theater) -"mmj" = ( -/obj/structure/chair/sofa/left{ - dir = 8 - }, -/obj/item/toy/plush/beeplushie{ - desc = "A cute bee toy to calm down hysteric patients."; - name = "Bee Haave" - }, -/turf/open/floor/wood, -/area/station/medical/psychology) -"mmq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_white, -/area/station/science/cytology) "mms" = ( /obj/machinery/space_heater/improvised_chem_heater, /obj/effect/turf_decal/tile/blue/half, @@ -47162,6 +47014,14 @@ }, /turf/open/floor/iron, /area/station/cargo/miningdock) +"mmz" = ( +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/floor2/starboard/aft) +"mmA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/wood/large, +/area/station/service/library/lounge) "mmI" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark/side{ @@ -47176,6 +47036,20 @@ dir = 4 }, /area/station/security/checkpoint) +"mmL" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/interrogation) "mmR" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -47192,16 +47066,18 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark/textured, /area/station/commons/fitness) -"mng" = ( -/obj/machinery/plumbing/synthesizer{ - reagent_id = /datum/reagent/water - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +"mni" = ( +/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, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron, -/area/station/science/research/abandoned) +/obj/machinery/duct, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "mnj" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -47226,42 +47102,12 @@ dir = 4 }, /area/station/hallway/secondary/exit/departure_lounge) -"mnq" = ( -/obj/effect/decal/cleanable/blood/gibs/old, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/engine{ - icon_state = "textured_dark" - }, -/area/station/maintenance/floor2/starboard/aft) -"mnB" = ( -/obj/effect/turf_decal/trimline/green/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/green/filled/corner, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/sign/departments/custodian/directional/north, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/iron, -/area/station/hallway/floor3/fore) "mnE" = ( /obj/structure/table/wood, /obj/item/folder/red, /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/courtroom) -"mnG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/item/radio/intercom/directional/west, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/range) "mnH" = ( /obj/effect/turf_decal/loading_area/white{ dir = 8 @@ -47269,17 +47115,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/commons/fitness) -"mnI" = ( -/obj/machinery/door/window/left/directional/south{ - name = "Pen 1"; - req_access = list("xenobiology") - }, -/obj/effect/turf_decal/stripes, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 10 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "mnM" = ( /obj/machinery/door_buttons/access_button{ idDoor = "virology_airlock_interior"; @@ -47301,9 +47136,6 @@ /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/dark, /area/station/medical/virology) "mnQ" = ( @@ -47324,11 +47156,6 @@ /obj/item/food/grown/coffee, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard) -"mof" = ( -/obj/machinery/light/directional/east, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/wood, -/area/station/service/kitchen/diner) "moj" = ( /obj/effect/turf_decal/trimline/red/filled/corner, /turf/open/floor/iron/dark/side, @@ -47344,6 +47171,10 @@ "moq" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/station/maintenance/floor4/starboard/aft) +"mor" = ( +/obj/effect/spawner/random/vending/snackvend, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/secondary/entry) "mou" = ( /obj/structure/railing{ dir = 4 @@ -47387,29 +47218,25 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/service/hydroponics) +"mph" = ( +/obj/structure/closet/secure_closet/injection, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white/small, +/area/station/security/execution/education) "mpp" = ( /obj/structure/stairs/south, /turf/open/floor/wood/parquet, /area/station/service/library) -"mpr" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/machinery/bookbinder, -/turf/open/floor/carpet/red, -/area/station/service/library) -"mpv" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "mpy" = ( /obj/machinery/newscaster/directional/west, /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard) +"mpC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/side, +/area/station/commons/locker) "mpF" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/catwalk_floor, @@ -47447,6 +47274,17 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/floor4/port/fore) +"mqc" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/obj/structure/girder/reinforced, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "viro-inner"; + name = "Virology Inner Shutters" + }, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard) "mqd" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -47482,12 +47320,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/textured_large, /area/station/cargo/storage) -"mqv" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/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/genetics) "mqx" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -47534,10 +47366,6 @@ /obj/machinery/duct, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet) -"mqQ" = ( -/obj/machinery/vending/cola/pwr_game, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "mra" = ( /obj/structure/rack, /obj/item/storage/toolbox/mechanical{ @@ -47572,11 +47400,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/white, /area/station/science/lower) -"mrq" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth_corner, -/area/station/maintenance/floor2/starboard) "mrs" = ( /obj/structure/grille, /obj/item/shard, @@ -47655,7 +47478,6 @@ /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) "msf" = ( -/obj/machinery/lapvend, /obj/machinery/light/directional/north, /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 1 @@ -47680,6 +47502,17 @@ /obj/effect/spawner/random/structure/girder, /turf/open/floor/plating, /area/station/maintenance/floor2/starboard/fore) +"mso" = ( +/obj/effect/turf_decal/trimline/green/line, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/turf/open/floor/iron/dark, +/area/station/hallway/floor3/fore) "msu" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/green/half{ @@ -47702,19 +47535,6 @@ /obj/effect/decal/cleanable/blood/drip, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/aft) -"msW" = ( -/obj/item/storage/box/chemimp{ - pixel_x = 6 - }, -/obj/item/storage/box/trackimp{ - pixel_x = -3 - }, -/obj/item/storage/lockbox/loyalty, -/obj/structure/table/reinforced, -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "mta" = ( /obj/structure/railing, /obj/machinery/door/firedoor/border_only, @@ -47730,14 +47550,6 @@ }, /turf/open/floor/mineral/silver, /area/station/service/chapel) -"mtj" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/machinery/newscaster/directional/north, -/obj/machinery/iv_drip, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "mtx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47856,12 +47668,6 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard/fore) -"muO" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/hallway/floor3/fore) "muP" = ( /obj/structure/closet/firecloset, /obj/machinery/light/red/dim/directional/east, @@ -47949,12 +47755,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) -"mwc" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/station/commons/vacant_room/commissary) "mwe" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 @@ -47973,15 +47773,16 @@ /obj/structure/cable, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) -"mww" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners{ - dir = 1 +"mwB" = ( +/obj/structure/railing{ + dir = 4 }, -/obj/structure/table, -/obj/item/storage/box/donkpockets, -/obj/structure/sign/poster/random/directional/east, -/turf/open/floor/iron/checker, -/area/station/cargo/miningdock) +/obj/machinery/duct, +/obj/machinery/camera/directional/south{ + c_tag = "Cytology - Petting Zoo" + }, +/turf/open/misc/sandy_dirt, +/area/station/science/cytology) "mwD" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -47991,6 +47792,11 @@ }, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"mwK" = ( +/obj/effect/landmark/start/hangover, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) "mwL" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron/white, @@ -48031,6 +47837,13 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/execution/transfer) +"mxi" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/textured_large, +/area/station/cargo/storage) "mxx" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -48049,6 +47862,14 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"mxJ" = ( +/obj/effect/turf_decal/siding/white/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "mxN" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/structure/closet/secure_closet/medical3, @@ -48076,14 +47897,16 @@ "myr" = ( /turf/open/floor/iron/textured_large, /area/station/hallway/secondary/entry) -"myx" = ( -/obj/structure/chair/stool/bamboo, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white/textured_large, -/area/station/service/chapel/office) "myO" = ( /turf/closed/wall, /area/station/hallway/secondary/exit/escape_pod) +"myQ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/wood, +/area/station/commons/dorms/apartment1) "myR" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -48113,13 +47936,6 @@ dir = 8 }, /area/station/hallway/secondary/exit/departure_lounge) -"myU" = ( -/obj/machinery/airalarm/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/hallway/floor3/fore) "myV" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/trimline/purple/line{ @@ -48165,11 +47981,40 @@ /obj/machinery/duct, /turf/open/floor/wood, /area/station/service/bar/atrium) +"mzh" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/machinery/button/door/directional/west{ + id = "surg_a_privacy"; + name = "Surgery Privacy Shutters"; + req_access = list("medical") + }, +/obj/machinery/light_switch/directional/west{ + pixel_x = -24; + pixel_y = -10 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/fore) "mzk" = ( /obj/structure/sign/warning/no_smoking/directional/east, /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) +"mzr" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/wood/tile, +/area/station/service/library) "mzv" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/effect/turf_decal/trimline/white/filled/line{ @@ -48206,6 +48051,13 @@ /obj/structure/cable, /turf/open/floor/pod/light, /area/station/maintenance/floor3/port) +"mzB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/smooth_edge{ + dir = 4 + }, +/area/station/commons/fitness/recreation) "mzC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48222,6 +48074,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/wood/tile, /area/station/command/heads_quarters/captain/private) +"mAk" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/commons/vacant_room/commissary) "mAr" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -48236,6 +48095,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) +"mAI" = ( +/obj/effect/turf_decal/siding/white{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/research_director, +/obj/structure/chair/stool/bar/directional/west, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/large, +/area/station/command/heads_quarters/rd) "mAJ" = ( /obj/structure/railing{ dir = 8 @@ -48249,26 +48119,10 @@ }, /turf/open/floor/wood/tile, /area/station/service/library) -"mAQ" = ( -/obj/effect/turf_decal/trimline/purple/warning{ - dir = 10 - }, -/obj/effect/turf_decal/stripes{ - dir = 10 - }, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor2/starboard) "mAZ" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) -"mBb" = ( -/obj/machinery/computer/security/telescreen/entertainment/directional/south, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/commons/dorms/apartment2) "mBg" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -48296,6 +48150,14 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/iron/dark, /area/station/command/gateway) +"mBM" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/ai_monitored/command/storage/eva) "mBP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48314,13 +48176,6 @@ }, /turf/open/floor/iron, /area/station/science/lobby) -"mCg" = ( -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 8 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/white, -/area/station/science/lower) "mCo" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48364,16 +48219,6 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/service/janitor) -"mCG" = ( -/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/red/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/brig) "mCI" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 1 @@ -48388,20 +48233,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor4/fore) -"mCK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 4 - }, -/obj/item/kirbyplants/photosynthetic{ - pixel_y = 10 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) "mCQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -48412,24 +48243,19 @@ }, /turf/open/floor/wood/tile, /area/station/service/library/lounge) -"mCS" = ( -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"mDd" = ( -/obj/effect/spawner/random/engineering/tank, -/obj/effect/turf_decal/trimline/dark_blue/end{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/commons/storage/tools) "mDe" = ( /obj/structure/lattice, /turf/open/openspace, /area/station/maintenance/floor3/starboard/fore) +"mDl" = ( +/obj/effect/turf_decal/tile/blue/half{ + dir = 8 + }, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/command/teleporter) "mDm" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -48463,6 +48289,12 @@ }, /turf/open/floor/iron/dark, /area/station/service/library/garden) +"mDs" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/hydroponics/constructable, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden) "mDD" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/ordnance_burn_chamber_input, /turf/open/floor/engine/vacuum, @@ -48535,13 +48367,6 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/wood, /area/station/command/heads_quarters/ce) -"mEF" = ( -/obj/machinery/atmospherics/components/unary/passive_vent{ - name = "killroom vent" - }, -/obj/structure/window/reinforced/plasma/spawner/directional/south, -/turf/open/floor/engine/telecomms, -/area/station/science/xenobiology) "mEK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -48580,6 +48405,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/command/bridge) +"mFf" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/side{ + dir = 6 + }, +/area/station/hallway/floor3/fore) "mFp" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -48650,37 +48484,11 @@ dir = 1 }, /area/station/hallway/secondary/exit) -"mFS" = ( -/obj/machinery/light/directional/north, -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen/fountain, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain) -"mFU" = ( -/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/yellow/line, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 1 - }, -/obj/machinery/door/airlock/public/glass{ - name = "Public Airlock" - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/aft) -"mFW" = ( -/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/yellow/line, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/aft) +"mFV" = ( +/obj/structure/bodycontainer/morgue, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark/textured, +/area/station/medical/morgue) "mGd" = ( /obj/structure/chair, /obj/machinery/camera/directional/north{ @@ -48699,11 +48507,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"mGs" = ( -/obj/machinery/light/cold/no_nightlight/directional/east, -/obj/structure/flora/bush/sparsegrass/style_random, -/turf/open/floor/grass, -/area/station/science/genetics) "mGy" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/mining, @@ -48719,7 +48522,10 @@ }, /obj/machinery/computer/pod/old/mass_driver_controller/ordnancedriver, /obj/structure/table, -/obj/item/binoculars, +/obj/item/binoculars{ + pixel_x = 6; + pixel_y = 6 + }, /obj/effect/turf_decal/siding/thinplating/dark{ dir = 5 }, @@ -48732,6 +48538,12 @@ }, /turf/open/floor/iron/white, /area/station/science/circuits) +"mGN" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 1 + }, +/turf/open/floor/carpet/purple, +/area/station/maintenance/floor1/port/aft) "mGP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_edge{ @@ -48755,23 +48567,33 @@ "mHa" = ( /turf/closed/wall, /area/station/commons/fitness/recreation/entertainment) -"mHc" = ( -/obj/structure/rack, -/obj/item/storage/briefcase{ - pixel_x = -3; - pixel_y = 2 +"mHf" = ( +/obj/structure/table/reinforced, +/obj/machinery/ecto_sniffer{ + pixel_x = -5; + pixel_y = -7 }, -/obj/item/storage/secure/briefcase{ - pixel_x = 2; - pixel_y = -2 +/obj/item/assembly/flash/handheld{ + pixel_x = 10; + pixel_y = 10 }, -/obj/item/clothing/glasses/sunglasses, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 +/obj/item/assembly/flash/handheld{ + pixel_x = 7; + pixel_y = 6 }, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/wood/parquet, -/area/station/service/lawoffice) +/obj/item/assembly/flash/handheld{ + pixel_x = 10; + pixel_y = 3 + }, +/obj/item/assembly/flash/handheld{ + pixel_x = 7 + }, +/obj/item/assembly/flash/handheld{ + pixel_x = 10; + pixel_y = -5 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/science/robotics/lab) "mHh" = ( /obj/machinery/portable_atmospherics/canister/anesthetic_mix, /obj/machinery/door/window/brigdoor/left/directional/east{ @@ -48788,13 +48610,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_large, /area/station/engineering/lobby) -"mHm" = ( -/obj/structure/chair/office{ +"mHl" = ( +/obj/machinery/light_switch/directional/west, +/obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, -/obj/machinery/light/directional/east, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) +/turf/open/floor/iron/dark, +/area/station/security/execution/education) "mHo" = ( /obj/structure/rack, /obj/item/mod/core/standard, @@ -48813,17 +48635,10 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/service/janitor) -"mHz" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/trimline/white/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/white/line{ - dir = 8 - }, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) +"mHx" = ( +/obj/structure/flora/bush/sunny/style_random, +/turf/open/floor/grass, +/area/station/security/courtroom) "mHQ" = ( /obj/effect/turf_decal/tile/red/anticorner/contrasted, /obj/machinery/computer/shuttle/labor{ @@ -48969,12 +48784,6 @@ /obj/item/pai_card, /turf/open/floor/wood/tile, /area/station/service/library) -"mJz" = ( -/obj/structure/table/reinforced/plastitaniumglass, -/obj/machinery/light/blacklight/directional/east, -/obj/effect/spawner/random/contraband/prison, -/turf/open/floor/carpet/neon/simple/pink/nodots, -/area/station/maintenance/floor2/port/fore) "mJH" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, @@ -48989,20 +48798,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/side, /area/station/hallway/floor2/aft) -"mJL" = ( -/obj/machinery/light/directional/west, -/turf/open/openspace, -/area/station/hallway/floor3/aft) -"mJP" = ( -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/sign/painting/library{ - pixel_x = 32 - }, -/turf/open/floor/wood/large, -/area/station/service/library/artgallery) "mKf" = ( /obj/item/radio/intercom/directional/west, /obj/structure/chair/sofa/corner/maroon{ @@ -49010,19 +48805,22 @@ }, /turf/open/floor/carpet/royalblack, /area/station/service/kitchen/diner) +"mKg" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/directional/west, +/obj/structure/disposalpipe/segment, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/service/library/lounge) "mKm" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/flora/bush/lavendergrass/style_random, /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, /area/station/service/bar/atrium) -"mKn" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "mKs" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -49036,19 +48834,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"mKw" = ( -/obj/effect/decal/cleanable/xenoblood, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/engine, -/area/station/science/cytology) -"mKH" = ( -/obj/machinery/light/directional/south, -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/checker, -/area/station/service/bar/atrium) "mKO" = ( /obj/machinery/door/airlock/research/glass/incinerator/ordmix_interior{ name = "Burn Chamber Interior Airlock" @@ -49068,6 +48853,19 @@ /obj/effect/spawner/structure/electrified_grille, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/aft) +"mLb" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/fore) "mLk" = ( /obj/machinery/door/firedoor, /obj/structure/railing/corner{ @@ -49100,16 +48898,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/catwalk_floor/iron_dark, /area/station/hallway/secondary/exit/escape_pod) -"mLq" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/item/radio/intercom/directional/south, -/obj/machinery/exoscanner, -/turf/open/floor/iron/corner{ - dir = 1 - }, -/area/station/cargo/drone_bay) "mLH" = ( /obj/structure/closet/firecloset/full, /turf/open/floor/pod/light, @@ -49253,15 +49041,6 @@ /obj/item/shard/plasma, /turf/open/floor/plating/foam, /area/station/maintenance/floor1/port/aft) -"mMC" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/machinery/dna_scannernew, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "mMD" = ( /obj/structure/closet/firecloset/full, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -49404,6 +49183,11 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/science/robotics/lab) +"mOK" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/flowers_yw/style_random, +/turf/open/floor/grass, +/area/station/hallway/secondary/service) "mOO" = ( /obj/structure/window/reinforced/tinted/spawner/directional/south, /obj/structure/mirror/directional/east, @@ -49413,47 +49197,19 @@ /obj/structure/sink/directional/west, /turf/open/floor/iron/showroomfloor, /area/station/commons/dorms/apartment2) -"mOV" = ( -/obj/structure/railing, -/obj/effect/turf_decal/trimline/purple/warning, -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) -"mPn" = ( -/obj/structure/sign/poster/official/random/directional/east, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/machinery/rnd/production/techfab/department/cargo, -/turf/open/floor/iron/smooth, -/area/station/cargo/office) -"mPo" = ( -/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/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner, -/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 +"mOT" = ( +/obj/machinery/light/directional/north, +/obj/machinery/airalarm/directional/north, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"mPs" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 }, +/obj/machinery/computer/monitor, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/command/bridge) "mPv" = ( /obj/effect/turf_decal/siding/wood{ dir = 9 @@ -49495,18 +49251,6 @@ dir = 4 }, /area/station/security/office) -"mPV" = ( -/obj/machinery/flasher/portable, -/obj/machinery/light/small/directional/east, -/obj/item/radio/intercom/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/security/brig) "mPW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -49561,6 +49305,13 @@ /obj/structure/bookcase/random/nonfiction, /turf/open/floor/wood/tile, /area/station/service/library) +"mQm" = ( +/obj/effect/turf_decal/tile/red/full, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 1 + }, +/turf/open/floor/iron/textured_large, +/area/station/engineering/atmos) "mQz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -49587,6 +49338,15 @@ initial_gas_mix = "TEMP=2.7" }, /area/station/science/ordnance/bomb) +"mQW" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/box, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/psychology) "mRa" = ( /obj/structure/table, /obj/item/storage/fancy/egg_box, @@ -49628,10 +49388,11 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) "mRQ" = ( -/obj/structure/noticeboard/directional/north, /obj/effect/turf_decal/tile/green/opposingcorners, /obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, /turf/open/floor/iron/white, /area/station/medical/virology) "mSa" = ( @@ -49644,6 +49405,12 @@ /obj/machinery/light/red/dim/directional/north, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/aft) +"mSj" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/lighter, +/obj/machinery/light/cold/no_nightlight/directional/south, +/turf/open/floor/wood, +/area/station/hallway/floor3/fore) "mSl" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 4 @@ -49653,6 +49420,10 @@ /obj/item/knife/shiv, /turf/open/floor/iron, /area/station/maintenance/floor4/port/fore) +"mSm" = ( +/obj/structure/flora/bush/flowers_yw/style_random, +/turf/open/floor/grass, +/area/station/service/hydroponics) "mSG" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance/burnchamber) @@ -49701,22 +49472,29 @@ dir = 1 }, /area/station/service/chapel) +"mTh" = ( +/obj/effect/turf_decal/siding/white{ + dir = 6 + }, +/obj/structure/railing{ + dir = 6 + }, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/structure/table/reinforced/rglass, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/large, +/area/station/science/robotics/lab) "mTi" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, /area/station/maintenance/floor4/port/fore) -"mTl" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 5 - }, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/hallway/floor2/fore) +"mTo" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/closet/secure_closet/cytology, +/turf/open/floor/iron, +/area/station/science/cytology) "mTs" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, @@ -49778,16 +49556,26 @@ /obj/item/bedsheet/red, /turf/open/floor/iron/checker, /area/station/service/bar) +"mUd" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 5 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "mUe" = ( /obj/structure/railing, /obj/effect/turf_decal/siding/wideplating_new, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"mUg" = ( -/obj/machinery/light/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/hallway/floor3/aft) +"mUh" = ( +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/obj/structure/closet/wardrobe/miner, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/smooth_large, +/area/station/cargo/miningoffice) "mUl" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49913,16 +49701,6 @@ /obj/structure/closet/emcloset/anchored, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"mVz" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/machinery/computer/scan_consolenew, -/obj/machinery/light/cold/no_nightlight/directional/north, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "mVC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -49933,13 +49711,6 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"mVI" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "mailbelt" - }, -/turf/open/floor/iron/textured_large, -/area/station/cargo/sorting) "mVL" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 4 @@ -49952,10 +49723,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_corner, /area/station/maintenance/floor1/starboard/aft) -"mVP" = ( -/obj/item/toy/beach_ball, -/turf/open/floor/pod/light, -/area/station/maintenance/floor2/starboard) "mVR" = ( /obj/effect/spawner/structure/window/hollow/end{ dir = 1 @@ -50054,6 +49821,13 @@ /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) +"mWW" = ( +/obj/item/stack/sheet/iron, +/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/dark/textured, +/area/station/maintenance/floor2/starboard/aft) "mXg" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -50081,6 +49855,12 @@ }, /turf/open/floor/iron, /area/station/science/robotics/lab) +"mXn" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/plastic, +/area/station/security/prison/shower) "mXq" = ( /obj/structure/window/reinforced/plasma/spawner/directional/south, /obj/structure/window/reinforced/plasma/spawner/directional/north, @@ -50094,6 +49874,10 @@ /obj/effect/spawner/random/trash/mess, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/port/aft) +"mXD" = ( +/obj/structure/tank_holder/emergency_oxygen, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "mXH" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/closed/wall/r_wall, @@ -50160,6 +49944,11 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron/white, /area/station/medical/office) +"mYu" = ( +/obj/item/kirbyplants/random, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/floor3/fore) "mYA" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -50201,14 +49990,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) -"mZh" = ( -/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/red/directional/south, -/obj/structure/sign/directions/evac/directional/south, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port/aft) "mZj" = ( /obj/machinery/door/airlock/maintenance{ name = "Maintenance" @@ -50218,17 +49999,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) -"mZq" = ( -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 8 - }, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) "mZy" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -50269,6 +50039,14 @@ name = "Holodeck Projector Floor" }, /area/station/holodeck/rec_center) +"mZS" = ( +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "mZT" = ( /obj/machinery/atmospherics/pipe/smart/simple/general/visible{ dir = 10 @@ -50276,6 +50054,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"mZV" = ( +/obj/machinery/airalarm/directional/north, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/tcommsat/computer) "mZZ" = ( /obj/machinery/power/emitter, /obj/effect/turf_decal/stripes/line{ @@ -50307,10 +50090,6 @@ }, /turf/open/floor/carpet, /area/station/security/detectives_office) -"nav" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/floor1/port/fore) "naz" = ( /obj/effect/turf_decal/siding/wideplating_new/corner{ dir = 8 @@ -50333,6 +50112,13 @@ }, /turf/open/floor/plating, /area/station/medical/abandoned) +"naW" = ( +/obj/machinery/computer/department_orders/service{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/service) "nba" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 10 @@ -50370,12 +50156,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/hallway/floor1/aft) -"nbq" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) "nbu" = ( /obj/machinery/button/curtain{ id = "restaurant_booth_a"; @@ -50386,12 +50166,6 @@ }, /turf/open/floor/carpet/royalblack, /area/station/service/kitchen/diner) -"nbw" = ( -/obj/effect/turf_decal/siding/wood, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/dim/directional/south, -/turf/open/floor/carpet/red, -/area/station/service/theater) "nbN" = ( /obj/effect/turf_decal/trimline/purple/line{ dir = 1 @@ -50453,6 +50227,19 @@ "ncB" = ( /turf/closed/wall, /area/station/maintenance/floor4/port/aft) +"ncC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/chapel{ + dir = 8 + }, +/area/station/service/chapel) +"ncD" = ( +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) "ncL" = ( /obj/structure/railing{ dir = 8 @@ -50463,31 +50250,15 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"ncS" = ( -/obj/structure/chair/office{ +"ncX" = ( +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/effect/landmark/start/geneticist, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) -"ncW" = ( -/obj/effect/turf_decal/trimline/red/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/red/line, -/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 - }, -/obj/machinery/door/airlock/public/glass{ - name = "Public Airlock" +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/dark/corner{ + dir = 8 }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/fore) +/area/station/cargo/lobby) "ndc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -50497,13 +50268,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall, /area/station/hallway/floor2/fore) -"ndf" = ( -/obj/machinery/light/directional/west, -/obj/machinery/conveyor{ - id = "mailbelt" - }, -/turf/open/floor/iron/textured_large, -/area/station/cargo/sorting) "ndg" = ( /obj/machinery/air_sensor/plasma_tank, /obj/effect/turf_decal/trimline/purple/line, @@ -50532,6 +50296,16 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor1/aft) +"ndG" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/machinery/status_display/ai/directional/east, +/turf/open/floor/iron/dark, +/area/station/science/auxlab) "ndL" = ( /obj/effect/turf_decal/trimline/green/warning{ dir = 1 @@ -50588,12 +50362,6 @@ /obj/structure/girder, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) -"nek" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash/grime, -/obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/pod/light, -/area/station/maintenance/floor2/port/aft) "nel" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor/heavy, @@ -50674,11 +50442,14 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/medical/virology/isolation) -"nfk" = ( -/obj/structure/table/wood, -/obj/item/instrument/violin, -/turf/open/floor/wood/tile, -/area/station/commons/fitness/recreation) +"neZ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "nfm" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -50724,6 +50495,10 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/holding_cell) +"nfR" = ( +/obj/machinery/shower/directional/west, +/turf/open/floor/noslip, +/area/station/science/genetics) "nfU" = ( /obj/structure/railing{ dir = 1 @@ -50802,13 +50577,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/wood/tile, /area/station/service/library) -"ngy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "ngD" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2{ dir = 8 @@ -50819,22 +50587,18 @@ /obj/machinery/ntnet_relay, /turf/open/floor/circuit/green/telecomms, /area/station/tcommsat/server) -"ngL" = ( -/obj/machinery/camera/autoname/directional/north, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/holopad, -/turf/open/floor/carpet, -/area/station/commons/vacant_room/office) -"ngQ" = ( -/obj/structure/railing/corner, -/obj/structure/railing/corner{ - dir = 4 +"ngK" = ( +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 }, -/obj/effect/turf_decal/stripes{ - dir = 4 +/obj/structure/table, +/obj/structure/sign/poster/official/random/directional/south, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 }, -/turf/open/floor/engine, -/area/station/science/cytology) +/turf/open/floor/iron/dark, +/area/station/security/office) "ngT" = ( /obj/structure/dresser, /turf/open/floor/wood/tile, @@ -50870,6 +50634,11 @@ /obj/item/instrument/trumpet, /turf/open/floor/wood/tile, /area/station/commons/fitness/recreation) +"nhl" = ( +/obj/machinery/atmospherics/pipe/multiz/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/multiz/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor3/aft) "nhm" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -50955,15 +50724,6 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/station/hallway/floor3/aft) -"nhP" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/trimline/green/warning{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/station/hallway/floor3/fore) "nhU" = ( /obj/structure/alien/weeds/creature{ desc = "This is in our water? Gross!"; @@ -50975,11 +50735,18 @@ planetary_atmos = 0 }, /area/station/maintenance/floor1/port/aft) +"nhV" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark/side{ + dir = 5 + }, +/area/station/hallway/floor4/aft) "nhZ" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer, -/obj/machinery/light/directional/north, -/turf/open/misc/asteroid/snow/standard_air, -/area/station/maintenance/floor2/port/aft) +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/table, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hos) "nih" = ( /obj/machinery/computer/communications, /obj/item/radio/intercom/directional/north{ @@ -51009,9 +50776,6 @@ /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat) "niA" = ( -/obj/structure/railing/corner{ - dir = 4 - }, /obj/effect/turf_decal/trimline/green/corner{ dir = 4 }, @@ -51019,6 +50783,9 @@ /obj/machinery/door/firedoor/border_only{ dir = 8 }, +/obj/structure/railing/corner/end{ + dir = 1 + }, /turf/open/floor/iron/dark, /area/station/hallway/floor3/fore) "niD" = ( @@ -51035,27 +50802,28 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/fore) -"niF" = ( -/obj/machinery/light/directional/north, -/obj/structure/sign/directions/dorms/directional/north{ - dir = 2 - }, -/obj/structure/railing/corner, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor4/aft) "niG" = ( /obj/effect/decal/cleanable/food/tomato_smudge, /turf/open/floor/iron, /area/station/security/prison) -"niL" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 +"niK" = ( +/obj/structure/table, +/obj/item/storage/box/monkeycubes{ + pixel_x = 6; + pixel_y = 9 }, -/obj/machinery/modular_computer/console/preset/engineering, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/obj/item/radio/headset/headset_medsci{ + pixel_x = -7; + pixel_y = 4 + }, +/obj/item/sequence_scanner{ + pixel_x = -2; + pixel_y = -1 + }, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "niM" = ( /obj/machinery/light_switch/directional/north, /obj/effect/landmark/start/assistant, @@ -51069,31 +50837,25 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor3/port/fore) -"niS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron/white, -/area/station/science/lower) -"niT" = ( -/obj/effect/turf_decal/trimline/purple/line, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 +"njc" = ( +/obj/structure/stairs/north, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/plating, +/area/station/science/lobby) +"nje" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) -"njj" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 9 +/obj/effect/turf_decal/tile/neutral{ + dir = 4 }, -/obj/machinery/dna_scannernew, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" +/obj/structure/table, +/obj/item/toy/cards/deck/wizoff{ + pixel_x = -4; + pixel_y = 5 }, -/area/station/science/genetics) +/turf/open/floor/iron/dark, +/area/station/science/breakroom) "njk" = ( /obj/machinery/door/airlock/public/glass{ name = "Cafeteria" @@ -51196,19 +50958,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/starboard/fore) -"nkr" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/structure/closet/secure_closet/armory2, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"nkw" = ( -/obj/machinery/light/directional/east, -/obj/machinery/computer/accounting{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hop) "nkL" = ( /obj/structure/chair{ dir = 1 @@ -51216,32 +50965,32 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/floor2/starboard/aft) -"nkM" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/hallway/floor3/fore) "nkO" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/hallway/floor3/aft) "nkT" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 4 +/obj/effect/turf_decal/trimline/brown/line{ + dir = 1 }, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Access" +/obj/effect/turf_decal/stripes{ + dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/any/supply/general, -/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/brown/line, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor1/starboard/fore) +/obj/effect/landmark/start/bitrunner, +/turf/open/floor/iron/dark/smooth_corner{ + dir = 8 + }, +/area/station/bitrunning/den) "nla" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/wood{ @@ -51251,6 +51000,14 @@ /obj/item/pen, /turf/open/floor/carpet/royalblack, /area/station/service/kitchen/diner) +"nlc" = ( +/obj/machinery/smartfridge/organ, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "nld" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -51271,25 +51028,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor3/starboard) -"nlm" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/structure/rack, -/obj/item/stock_parts/matter_bin{ - pixel_x = 2; - pixel_y = -5 - }, -/obj/item/stock_parts/matter_bin{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Science - R&D Lab" - }, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/dark, -/area/station/science/lab) "nln" = ( /obj/effect/turf_decal/trimline/red/line, /obj/machinery/camera{ @@ -51300,17 +51038,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/engineering/lobby) -"nlo" = ( -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/stripes{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) "nlu" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -51344,57 +51071,15 @@ }, /turf/open/floor/wood/parquet, /area/station/medical/break_room) -"nlM" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 6 - }, -/obj/machinery/vending/wardrobe/gene_wardrobe, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "nlN" = ( /turf/closed/wall, /area/station/maintenance/floor2/port/aft) -"nlZ" = ( -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/window/right/directional/west{ - name = "Containment"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"nmb" = ( -/obj/effect/turf_decal/trimline/brown/arrow_ccw{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/cargo/lobby) -"nmc" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 5 - }, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) "nmq" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/tank_holder, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) -"nmw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/smooth_edge{ - dir = 1 - }, -/area/station/science/research/abandoned) "nmB" = ( /obj/structure/table/wood, /obj/effect/spawner/random/entertainment/musical_instrument, @@ -51454,17 +51139,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/hallway) -"nnu" = ( -/obj/effect/turf_decal/tile/red/full, -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Atmospherics Cam #2"; - network = list("ss13","engine") - }, -/turf/open/floor/iron/textured_large, -/area/station/engineering/atmos) "nnJ" = ( /obj/structure/filingcabinet, /turf/open/floor/iron/dark/smooth_large, @@ -51523,23 +51197,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/cargo/storage) -"noo" = ( -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) -"nop" = ( -/obj/effect/turf_decal/trimline/purple/end{ - dir = 4 - }, -/obj/effect/turf_decal/siding/white, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "nor" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -51578,6 +51235,7 @@ "noF" = ( /obj/effect/spawner/random/trash/grime, /obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/medical/abandoned) "noM" = ( @@ -51611,6 +51269,29 @@ }, /turf/open/floor/iron/textured_large, /area/station/hallway/secondary/exit/departure_lounge) +"nps" = ( +/obj/structure/rack, +/obj/item/soulstone/anybody/chaplain, +/obj/item/nullrod{ + pixel_x = -6 + }, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron/white/textured_large, +/area/station/service/chapel/office) +"npu" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/purple{ + dir = 9 + }, +/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/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "npD" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -51620,6 +51301,14 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/port/aft) +"npF" = ( +/obj/effect/turf_decal/siding/wideplating_new{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating_new, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/science/cytology) "npK" = ( /obj/structure/closet/firecloset/full, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -51668,6 +51357,13 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/explab) +"nqi" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "nqj" = ( /turf/open/floor/wood/tile, /area/station/commons/fitness/recreation) @@ -51676,22 +51372,24 @@ dir = 5 }, /area/station/hallway/floor3/fore) -"nqo" = ( -/turf/closed/wall, -/area/station/science/research/abandoned) "nqr" = ( /turf/closed/wall, /area/station/hallway/floor3/aft) -"nqs" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/fore) "nqt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/floor2/port/aft) +"nqx" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor3/aft) "nqE" = ( /obj/machinery/door/airlock/atmos{ name = "Crystallizer" @@ -51751,6 +51449,12 @@ /obj/item/modular_computer/laptop/preset/civilian, /turf/open/floor/iron/smooth, /area/station/cargo/office) +"nre" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/service/theater) "nrh" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -51786,6 +51490,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port/fore) "nrB" = ( @@ -51797,16 +51502,10 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/hallway/secondary/service) -"nrM" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/clothing/glasses/regular, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/eighties, -/area/station/commons/dorms/room2) +"nrL" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/directional, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard) "nrX" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/white, @@ -51824,6 +51523,11 @@ "nsh" = ( /turf/open/floor/pod, /area/station/maintenance/floor4/port/fore) +"nsi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "nsn" = ( /obj/effect/turf_decal/trimline/brown/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -51867,22 +51571,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) -"nsu" = ( -/obj/structure/table/wood, -/obj/machinery/light/small/directional/east, -/obj/item/paper_bin, -/obj/item/pen, -/obj/machinery/camera/directional/east{ - c_tag = "Security - Interrogation Monitoring" - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/interrogation) "nsw" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Hatch" @@ -51900,15 +51588,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/textured_half, /area/station/cargo/office) -"nsL" = ( -/obj/effect/turf_decal/trimline/purple/corner, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 4 - }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/iron/white, -/area/station/science/lobby) "nsM" = ( /obj/structure/table, /turf/open/floor/eighties, @@ -51926,6 +51605,10 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor4/starboard) +"ntl" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end, +/turf/open/floor/plating, +/area/station/science/cytology) "ntn" = ( /obj/machinery/door/airlock/command/glass{ name = "Abandoned Ship Storage" @@ -51964,6 +51647,10 @@ /obj/structure/cable/layer3, /turf/open/floor/iron/dark, /area/space/nearstation) +"ntM" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/floor2/fore) "ntO" = ( /obj/effect/turf_decal/trimline/purple/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -51990,6 +51677,17 @@ /obj/item/food/grown/mushroom/reishi, /turf/open/floor/iron/kitchen, /area/station/service/kitchen/abandoned) +"ntU" = ( +/obj/machinery/light/cold/no_nightlight/directional/east, +/obj/effect/turf_decal/siding/purple{ + dir = 4 + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/machinery/requests_console/auto_name/directional/east, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "ntW" = ( /obj/structure/altar_of_gods, /obj/effect/turf_decal/siding/white, @@ -52030,14 +51728,6 @@ /obj/machinery/duct, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"nuM" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer2{ - dir = 5 - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/turf/open/floor/iron/dark/side, -/area/station/engineering/atmos) "nuR" = ( /obj/structure/table, /obj/structure/sign/poster/random/directional/north, @@ -52078,9 +51768,6 @@ /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/eva) "nvv" = ( -/obj/structure/railing/corner{ - dir = 1 - }, /obj/effect/turf_decal/trimline/blue/corner{ dir = 1 }, @@ -52088,6 +51775,9 @@ /obj/machinery/door/firedoor/border_only{ dir = 4 }, +/obj/structure/railing/corner/end/flip{ + dir = 1 + }, /turf/open/floor/iron/dark, /area/station/hallway/floor2/aft) "nvw" = ( @@ -52101,14 +51791,6 @@ "nvy" = ( /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"nvA" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/structure/table/glass, -/obj/item/experi_scanner, -/turf/open/floor/iron/white, -/area/station/science/lower) "nvE" = ( /obj/machinery/autolathe, /obj/effect/turf_decal/siding/thinplating_new{ @@ -52126,14 +51808,13 @@ /obj/structure/cable, /turf/open/floor/bamboo/tatami/black, /area/station/commons/storage/art) -"nvR" = ( -/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/dark/corner{ - dir = 1 +"nvT" = ( +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 1; + name = "killroom vent" }, -/area/station/security/prison) +/turf/open/floor/engine/hull/reinforced, +/area/station/science/xenobiology) "nwa" = ( /obj/effect/turf_decal/siding/wideplating_new{ dir = 8 @@ -52156,14 +51837,6 @@ /obj/structure/sign/warning/vacuum/external/directional/south, /turf/open/floor/iron/dark, /area/station/security/execution/transfer) -"nwg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sink/directional/east, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "nwh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/stripes/corner{ @@ -52202,13 +51875,37 @@ }, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat) -"nxe" = ( -/mob/living/simple_animal/bot/secbot/pingsky, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"nwV" = ( /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/structure/reagent_dispensers/wall/peppertank/directional/east, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/security/checkpoint/first) +"nwW" = ( +/obj/machinery/camera/directional/south{ + c_tag = "AI Chamber - Port"; + network = list("aicore") + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/firealarm/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai) +"nxe" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/purple{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/iron, +/area/station/science/cytology) "nxm" = ( /obj/structure/chair/sofa/bench/left{ dir = 1 @@ -52283,31 +51980,23 @@ /obj/item/storage/bag/trash, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) -"nyc" = ( -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"nyd" = ( -/obj/machinery/fax{ - fax_name = "Cargo Office"; - name = "Cargo Office Fax Machine" - }, -/obj/structure/table, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/siding/thinplating_new{ +"nyg" = ( +/obj/structure/chair/office/light{ dir = 1 }, -/turf/open/floor/iron/smooth, -/area/station/cargo/office) +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "nyh" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/engine/air, /area/station/engineering/atmos) +"nyn" = ( +/obj/structure/industrial_lift/public, +/obj/machinery/light/directional/south, +/turf/open/floor/plating/elevatorshaft, +/area/station/hallway/floor2/fore) "nys" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -52339,21 +52028,6 @@ /obj/effect/landmark/blobstart, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/starboard) -"nyI" = ( -/obj/effect/turf_decal/trimline/red/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/heavy, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor{ - elevator_linked_id = "com_vator"; - elevator_mode = 1 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor3/fore) "nyL" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -52467,6 +52141,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) +"nzV" = ( +/obj/structure/rack, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/cable, +/obj/effect/spawner/random/armory/disablers, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "nAb" = ( /obj/effect/turf_decal/tile/yellow/fourcorners, /obj/effect/decal/cleanable/dirt, @@ -52481,9 +52163,6 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/pod, /area/station/maintenance/floor3/starboard) -"nAj" = ( -/turf/closed/wall, -/area/station/science/xenobiology) "nAm" = ( /obj/effect/turf_decal/bot, /obj/effect/spawner/random/structure/crate, @@ -52497,12 +52176,6 @@ dir = 4 }, /area/station/commons/storage/primary) -"nAv" = ( -/obj/item/storage/toolbox/electrical, -/obj/structure/table/glass, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/circuit/telecomms, -/area/station/tcommsat/server/upper) "nAC" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/flora/bush/lavendergrass/style_random, @@ -52528,6 +52201,11 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/textured_half, /area/station/cargo/office) +"nAU" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/rd) "nAV" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 @@ -52539,9 +52217,6 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/white, /area/station/medical/psychology) -"nBg" = ( -/turf/open/floor/grass, -/area/station/science/xenobiology) "nBh" = ( /obj/structure/dresser, /turf/open/floor/carpet/neon/simple/white, @@ -52622,15 +52297,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/side, /area/station/hallway/secondary/exit/departure_lounge) -"nCd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/starboard) "nCg" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/reagent_containers/pill/happinesspsych{ @@ -52673,10 +52339,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/dark, /area/station/maintenance/floor4/port/aft) -"nCD" = ( -/obj/structure/flora/bush/flowers_br/style_random, -/turf/open/floor/grass, -/area/station/security/courtroom) "nCG" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/cmo) @@ -52705,22 +52367,14 @@ }, /turf/open/floor/iron/corner, /area/station/command/gateway) -"nCQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/obj/structure/closet/secure_closet/quartermaster, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/carpet/orange, -/area/station/command/heads_quarters/qm) -"nDa" = ( -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ +"nDf" = ( +/obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/machinery/firealarm/directional/west, +/obj/effect/landmark/start/station_engineer, +/obj/machinery/light/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/engineering/lobby) "nDg" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -52741,6 +52395,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_dark, /area/station/maintenance/floor3/port) +"nDm" = ( +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/turf/open/floor/engine{ + initial_gas_mix = "o2=22;bz=82;TEMP=293.15" + }, +/area/station/science/xenobiology) "nDn" = ( /obj/effect/turf_decal/trimline/green/warning, /obj/effect/turf_decal/stripes/line{ @@ -52817,20 +52479,32 @@ /obj/effect/spawner/random/structure/girder, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) +"nEi" = ( +/obj/effect/turf_decal/box/corners{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "nEj" = ( /obj/structure/curtain/cloth, /turf/open/floor/eighties, /area/station/service/janitor) +"nEl" = ( +/obj/effect/turf_decal/trimline/green/filled/arrow_cw{ + dir = 8 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark/textured, +/area/station/medical/virology/isolation) "nEs" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/structure/cable, /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark, /area/station/command/gateway) -"nEC" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/grass, -/area/station/science/xenobiology) "nED" = ( /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/dark/side{ @@ -52964,6 +52638,7 @@ /area/station/service/chapel) "nGm" = ( /obj/structure/cable/multilayer/multiz, +/obj/machinery/digital_clock/directional/north, /turf/open/floor/catwalk_floor, /area/station/hallway/floor3/fore) "nGx" = ( @@ -52985,6 +52660,14 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) +"nGK" = ( +/obj/effect/landmark/start/hangover, +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor1/fore) "nGL" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/chapel, @@ -53016,13 +52699,6 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/dark, /area/station/command/bridge) -"nHd" = ( -/obj/machinery/duct, -/obj/structure/sign/departments/botany{ - pixel_x = -32 - }, -/turf/open/floor/catwalk_floor/iron_white, -/area/station/science/research/abandoned) "nHf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -53035,14 +52711,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/starboard/aft) -"nHq" = ( -/obj/structure/table, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 4 - }, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/iron/dark, -/area/station/commons/dorms/room4) "nHr" = ( /obj/structure/chair{ dir = 8 @@ -53110,16 +52778,6 @@ dir = 4 }, /area/station/medical/abandoned) -"nHL" = ( -/obj/item/book/manual/wiki/tcomms, -/obj/item/radio/off{ - pixel_y = 4 - }, -/obj/structure/table, -/obj/item/multitool, -/obj/item/storage/toolbox/electrical, -/turf/open/floor/iron/smooth, -/area/station/tcommsat/computer) "nHT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -53188,15 +52846,22 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/floor2/starboard/aft) -"nIL" = ( -/obj/effect/turf_decal/siding/purple, -/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/showroomfloor{ - name = "lab floor" +"nII" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/hop) +"nIJ" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ + dir = 6 }, -/area/station/science/genetics) +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ + dir = 6 + }, +/turf/open/floor/engine/airless, +/area/station/engineering/supermatter/waste) "nIQ" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 @@ -53242,20 +52907,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron/checker, /area/station/service/bar/atrium) -"nJp" = ( -/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/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/construction/mining/aux_base) "nJt" = ( /obj/structure/foamedmetal, /turf/open/floor/engine, @@ -53300,15 +52951,15 @@ dir = 4 }, /obj/structure/cable, -/obj/structure/railing/corner{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor/border_only, /obj/machinery/door/firedoor/border_only{ dir = 8 }, +/obj/structure/railing/corner/end{ + dir = 1 + }, /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) "nJY" = ( @@ -53409,20 +53060,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard/fore) -"nLF" = ( -/obj/effect/turf_decal/trimline/purple/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/camera/directional/north{ - c_tag = "Science - Deck 3 Hall" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "nLL" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -53445,19 +53082,36 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"nMj" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/service/theater) "nMn" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/emcloset, /turf/open/floor/iron/dark/textured_large, /area/station/hallway/secondary/exit/escape_pod) +"nMu" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/depsec/engineering, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) +"nMz" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/line{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/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/dark, +/area/station/hallway/floor4/aft) "nMI" = ( /obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, /obj/structure/cable, @@ -53478,16 +53132,6 @@ /obj/structure/disposalpipe/trunk/multiz/down, /turf/open/openspace, /area/station/maintenance/floor4/starboard/fore) -"nMV" = ( -/obj/effect/turf_decal/trimline/blue/corner{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server/upper) "nMX" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 @@ -53534,10 +53178,6 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/starboard/fore) -"nNQ" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/grass, -/area/station/science/xenobiology) "nNT" = ( /obj/machinery/door/airlock/public{ name = "Showers" @@ -53554,39 +53194,26 @@ /turf/open/floor/iron, /area/station/security/prison) "nOj" = ( -/obj/vehicle/sealed/mecha/working/ripley/cargo, +/obj/vehicle/sealed/mecha/ripley/cargo, /obj/effect/turf_decal/siding/thinplating_new{ dir = 4 }, /obj/effect/turf_decal/bot_red, /turf/open/floor/iron/textured_large, /area/station/cargo/warehouse) +"nOw" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 5 + }, +/obj/machinery/chem_master/condimaster, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark/smooth_large, +/area/station/service/bar) "nOB" = ( /obj/structure/kitchenspike, /obj/structure/sign/poster/random/directional/north, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port) -"nOD" = ( -/obj/structure/table, -/obj/item/ai_module/reset/purge, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/item/radio/intercom/directional/south{ - broadcasting = 1; - frequency = 1447; - listening = 0; - name = "Private Channel" - }, -/obj/effect/spawner/random/aimodule/neutral{ - pixel_x = 15 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) "nOH" = ( /obj/effect/turf_decal/trimline/green/warning{ dir = 4 @@ -53603,6 +53230,14 @@ }, /turf/open/floor/plating, /area/station/hallway/floor2/aft) +"nOR" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/dark/fourcorners, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "nOX" = ( /obj/machinery/camera/directional/east{ c_tag = "Law Office" @@ -53645,10 +53280,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/iron, /area/station/engineering/engine_smes) -"nPn" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/science/xenobiology) "nPp" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/yellow, @@ -53667,16 +53298,6 @@ }, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) -"nPy" = ( -/obj/effect/turf_decal/trimline/purple/arrow_ccw, -/obj/effect/turf_decal/trimline/green/arrow_cw{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/obj/item/radio/intercom/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/cargo/miningdock) "nPE" = ( /turf/closed/wall/r_wall, /area/station/maintenance/floor4/starboard) @@ -53686,15 +53307,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark/textured, /area/station/medical/pharmacy) -"nPH" = ( -/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/xenobiology) "nPN" = ( /obj/machinery/computer/message_monitor{ dir = 4 @@ -53708,9 +53320,6 @@ }, /turf/open/floor/iron/smooth, /area/station/tcommsat/computer) -"nPQ" = ( -/turf/open/floor/engine, -/area/station/science/xenobiology) "nPS" = ( /obj/structure/mirror/directional/south, /obj/machinery/duct, @@ -53755,31 +53364,6 @@ dir = 1 }, /area/station/security/prison) -"nQG" = ( -/obj/machinery/power/smes/engineering{ - input_attempt = 0; - input_level = 60000; - inputting = 0; - output_attempt = 0; - output_level = 60000; - outputting = 0 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth_large, -/area/station/maintenance/floor2/starboard) -"nQI" = ( -/obj/machinery/light/directional/north, -/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/item/radio/intercom/directional/north, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/station/hallway/floor3/fore) "nQN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -53806,17 +53390,6 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron/dark, /area/station/security/checkpoint/second) -"nQP" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/white/arrow_ccw{ - 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/side{ - dir = 5 - }, -/area/station/hallway/secondary/entry) "nQQ" = ( /obj/machinery/shower/directional/west, /turf/open/floor/noslip, @@ -53825,26 +53398,34 @@ /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/floor/grass, /area/station/science/genetics) +"nQT" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/hallway/secondary/exit/departure_lounge) "nQU" = ( /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) -"nQV" = ( -/obj/machinery/computer/apc_control, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 +"nQX" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 }, -/obj/machinery/airalarm/directional/north, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"nQY" = ( -/obj/machinery/door/firedoor/heavy, +/obj/effect/turf_decal/trimline/red/line, /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/lobby) +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/aft) "nQZ" = ( /obj/effect/turf_decal/trimline/yellow/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -53941,14 +53522,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/engine, /area/station/maintenance/floor4/starboard/aft) -"nSD" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/stripes, -/obj/machinery/conveyor_switch/oneway{ - id = "disposals" - }, -/turf/open/floor/iron/dark/textured_large, -/area/station/maintenance/disposal) "nSS" = ( /obj/structure/chair/sofa/corp/right{ dir = 8 @@ -53984,20 +53557,22 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/iron/dark, /area/station/command/gateway) -"nTv" = ( -/obj/machinery/light/directional/north, -/obj/machinery/newscaster/directional/north, -/obj/machinery/fax{ - fax_name = "Law Office"; - name = "Law Office Fax Machine" - }, -/obj/structure/table/wood, -/turf/open/floor/carpet, -/area/station/service/lawoffice) "nTB" = ( /obj/structure/fluff/oldturret, /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/station/maintenance/floor4/starboard/aft) +"nTC" = ( +/obj/effect/turf_decal/trimline/white/line{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) +"nTF" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) "nTI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -54011,6 +53586,7 @@ "nTJ" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/digital_clock/directional/south, /turf/open/floor/iron/dark, /area/station/command/gateway) "nTO" = ( @@ -54045,6 +53621,17 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) +"nUp" = ( +/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/item/radio/intercom/directional/north, +/obj/machinery/duct, +/turf/open/floor/iron, +/area/station/hallway/floor3/fore) "nUt" = ( /obj/effect/landmark/start/hangover, /obj/item/kirbyplants/random, @@ -54063,7 +53650,7 @@ /obj/machinery/elevator_control_panel/directional/east{ linked_elevator_id = "aft_vator"; pixel_x = 24; - preset_destination_names = list("2"="Supply-Engi Floor","3"="Med-Sci Floor","4"="Service Floor") + preset_destination_names = list("2"="Supply-Engi Floor","3"="Med-Sci Floor","4"="Service Floor") }, /turf/open/floor/plating/elevatorshaft, /area/station/hallway/floor1/aft) @@ -54102,11 +53689,6 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port) -"nVe" = ( -/obj/machinery/light/directional/east, -/obj/structure/window/spawner/directional/south, -/turf/open/floor/iron/dark/textured, -/area/station/commons/fitness) "nVi" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -54126,6 +53708,16 @@ /obj/machinery/newscaster/directional/west, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) +"nVm" = ( +/obj/effect/turf_decal/trimline/white/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/white/mid_joiner{ + dir = 8 + }, +/turf/open/floor/iron/smooth_large, +/area/station/hallway/secondary/entry) "nVp" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, @@ -54154,6 +53746,13 @@ /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, /area/station/maintenance/floor3/port) +"nVT" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/computer/records/medical/laptop, +/obj/structure/table, +/obj/machinery/light/cold/no_nightlight/directional/north, +/turf/open/floor/iron, +/area/station/science/genetics) "nVW" = ( /obj/structure/chair/office{ dir = 1 @@ -54166,6 +53765,19 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/checkpoint) +"nVZ" = ( +/obj/structure/table/wood, +/obj/item/storage/backpack/satchel/leather/withwallet{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/paper/fluff/ids_for_dummies, +/obj/machinery/light/directional/north, +/obj/item/storage/crayons{ + pixel_x = 16 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "nWc" = ( /obj/structure/extinguisher_cabinet/directional/north, /obj/machinery/light/small/directional/west, @@ -54211,6 +53823,10 @@ }, /turf/open/floor/iron, /area/station/hallway/floor2/fore) +"nWH" = ( +/obj/structure/table/reinforced, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/floor3/fore) "nWI" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/structure/disposalpipe/segment{ @@ -54233,16 +53849,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/science/breakroom) -"nWK" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ - dir = 4 - }, -/obj/effect/baseturf_helper/reinforced_plating/ceiling, -/turf/open/floor/engine/airless, -/area/station/engineering/atmos/pumproom) "nWM" = ( /obj/structure/table, /obj/item/stack/medical/suture/emergency, @@ -54380,12 +53986,6 @@ }, /turf/open/floor/plating, /area/station/cargo/sorting) -"nYm" = ( -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/wood/large, -/area/station/service/library/lounge) "nYo" = ( /obj/structure/table, /obj/machinery/light/small/directional/south, @@ -54394,12 +53994,6 @@ "nYw" = ( /turf/open/floor/iron, /area/station/cargo/miningdock) -"nYB" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/hallway/floor2/fore) "nYE" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/carpet/royalblack, @@ -54416,11 +54010,6 @@ name = "bathroom tiles" }, /area/station/security/lockers) -"nYO" = ( -/obj/machinery/light/directional/south, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/fore) "nYP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -54435,17 +54024,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/side, /area/station/hallway/floor4/aft) -"nZa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) "nZe" = ( /obj/structure/dresser, /turf/open/floor/carpet/green, @@ -54491,12 +54069,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) -"nZJ" = ( -/obj/structure/table/glass, -/obj/item/multitool, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/circuit/telecomms, -/area/station/tcommsat/server/upper) "nZR" = ( /obj/machinery/light_switch/directional/north, /obj/effect/landmark/start/assistant, @@ -54593,17 +54165,18 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"obH" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/catwalk_floor/iron, +/area/station/engineering/atmos/pumproom) "obK" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) -"obM" = ( -/obj/machinery/plumbing/receiver, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) "obQ" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=1-8"; @@ -54611,15 +54184,6 @@ }, /turf/open/floor/iron, /area/station/hallway/floor1/fore) -"obS" = ( -/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer4{ - dir = 4 - }, -/obj/machinery/airalarm/directional/north{ - req_access = list("engineering") - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/pumproom) "obT" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /obj/effect/turf_decal/stripes/line{ @@ -54638,6 +54202,26 @@ }, /turf/open/floor/iron/dark/textured, /area/station/medical/storage) +"oce" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood, +/area/station/service/theater) +"och" = ( +/obj/structure/sign/poster/official/random/directional/east, +/obj/structure/sign/directions/dorms/directional/north, +/obj/structure/sign/directions/security/directional/north{ + pixel_y = 40 + }, +/obj/structure/sign/directions/command/directional/north{ + pixel_y = 24 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor2/fore) "ocl" = ( /obj/machinery/portable_atmospherics/canister, /turf/open/floor/engine, @@ -54675,19 +54259,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/atmos) -"ocB" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 8 - }, -/turf/open/floor/iron/textured_large, -/area/station/cargo/storage) "ocH" = ( /obj/machinery/light/cold/directional/west, /turf/open/floor/iron/dark, /area/station/medical/psychology) "ocO" = ( /obj/effect/turf_decal/tile/green/opposingcorners, -/obj/structure/bed, +/obj/structure/bed/medical/anchored{ + dir = 4 + }, /obj/item/bedsheet/green, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white, @@ -54719,25 +54299,12 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard/fore) -"ocW" = ( -/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, -/obj/item/radio/intercom/directional/west, -/obj/structure/disposalpipe/segment, -/turf/open/floor/carpet/red, -/area/station/service/theater) -"ode" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 +"ocX" = ( +/obj/effect/turf_decal/trimline/purple/warning{ + dir = 4 }, -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/turf/open/floor/pod/light, +/area/station/maintenance/floor2/starboard) "odk" = ( /obj/machinery/light/directional/east, /obj/machinery/status_display/ai/directional/east, @@ -54761,13 +54328,21 @@ /obj/structure/window/reinforced/spawner/directional/west, /obj/item/storage/medkit/regular, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/window/left/directional/south{ - name = "First Aid Supplies"; - req_access = list("medical") - }, /obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/white/textured, /area/station/medical/storage) +"odz" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/button/door/directional/north{ + id = "rdoffice"; + name = "Privacy Control"; + pixel_y = 34; + req_access = list("rd") + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/rd) "odJ" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 6 @@ -54783,6 +54358,15 @@ /obj/item/plunger, /turf/open/floor/iron/textured_large, /area/station/medical/chemistry) +"odP" = ( +/obj/machinery/newscaster/directional/north, +/obj/machinery/fax{ + fax_name = "Law Office"; + name = "Law Office Fax Machine" + }, +/obj/structure/table/wood, +/turf/open/floor/carpet, +/area/station/service/lawoffice) "odS" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet/purple, @@ -54811,13 +54395,12 @@ }, /turf/open/floor/iron, /area/station/hallway/floor3/fore) -"oez" = ( -/obj/effect/turf_decal/trimline/white/line{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) +"oeu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/railing/corner/end/flip, +/obj/structure/railing/corner/end, +/turf/open/floor/plating, +/area/station/maintenance/floor1/port/fore) "oeQ" = ( /obj/machinery/shower/directional/east, /turf/open/floor/noslip, @@ -54831,17 +54414,6 @@ }, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) -"ofg" = ( -/obj/effect/turf_decal/trimline/green/filled/arrow_cw{ - dir = 8 - }, -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/sign/poster/official/random/directional/west, -/obj/structure/cable, -/turf/open/floor/iron/dark/textured, -/area/station/medical/virology/isolation) "ofh" = ( /obj/structure/railing{ dir = 8 @@ -54893,6 +54465,11 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/wood, /area/station/commons/dorms/apartment2) +"ofI" = ( +/mob/living/basic/butterfly, +/obj/machinery/light/small/directional/east, +/turf/open/floor/grass, +/area/station/hallway/secondary/entry) "ogc" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -54919,6 +54496,14 @@ /obj/effect/spawner/random/trash/graffiti, /turf/open/floor/pod/light, /area/station/maintenance/solars/port/aft) +"ogt" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/bookbinder, +/obj/machinery/light/directional/south, +/turf/open/floor/carpet/red, +/area/station/service/library) "ogA" = ( /obj/effect/turf_decal/trimline/green/warning, /obj/effect/spawner/random/structure/tank_holder, @@ -55015,28 +54600,12 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/white, /area/station/medical/storage) -"ohL" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/structure/cable, -/obj/machinery/vending/wardrobe/chem_wardrobe, -/obj/structure/sign/poster/official/plasma_effects/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) "ohO" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark/side{ dir = 1 }, /area/station/hallway/floor1/fore) -"ohW" = ( -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/trimline/blue/line{ - dir = 10 - }, -/obj/machinery/status_display/ai/directional/east, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/hallway/floor2/aft) "oic" = ( /turf/closed/wall, /area/station/maintenance/floor1/starboard/fore) @@ -55047,6 +54616,15 @@ }, /turf/open/floor/iron/smooth, /area/station/hallway/floor1/fore) +"oig" = ( +/obj/effect/turf_decal/siding/purple, +/obj/structure/chair/office/light{ + dir = 4 + }, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "oih" = ( /obj/structure/rack, /obj/item/storage/toolbox/mechanical, @@ -55083,6 +54661,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hos) +"oiv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/starboard) "oiw" = ( /obj/structure/cable, /obj/machinery/door/airlock/grunge{ @@ -55169,6 +54753,15 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat) +"ojp" = ( +/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, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/range) "ojx" = ( /obj/effect/turf_decal/trimline/green/warning{ dir = 9 @@ -55187,11 +54780,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/library/lounge) -"ojK" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/floor2/port/aft) "ojM" = ( /obj/structure/chair/comfy{ dir = 4 @@ -55215,13 +54803,6 @@ /obj/item/flashlight/lamp/green, /turf/open/floor/wood/tile, /area/station/service/library) -"okb" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/machinery/light/red/dim/directional/south, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor2/port/aft) "oke" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -55242,13 +54823,6 @@ /obj/effect/spawner/random/structure/chair_comfy, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port/fore) -"okH" = ( -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/obj/machinery/light/red/dim/directional/north, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/port) "okI" = ( /obj/machinery/firealarm/directional/west, /obj/effect/decal/cleanable/dirt, @@ -55292,10 +54866,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/port/fore) -"okX" = ( -/obj/effect/decal/cleanable/glass, -/turf/closed/wall/r_wall, -/area/station/maintenance/floor2/port/aft) "ola" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted, /obj/effect/turf_decal/tile/blue/half/contrasted{ @@ -55303,10 +54873,11 @@ }, /turf/open/floor/iron/white/small, /area/station/medical/chemistry) -"olg" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/wood/parquet, -/area/station/commons/dorms/room2) +"olj" = ( +/obj/item/cultivator/rake, +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/floor/grass, +/area/station/service/library/garden) "olt" = ( /obj/structure/railing/corner{ dir = 4 @@ -55322,16 +54893,25 @@ /obj/effect/spawner/random/engineering/material_cheap, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"olv" = ( -/obj/effect/turf_decal/stripes/line{ +"olC" = ( +/obj/effect/landmark/blobstart, +/obj/effect/turf_decal/stripes{ dir = 8 }, -/obj/structure/railing{ +/turf/open/floor/engine, +/area/station/science/cytology) +"olM" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 9 + }, +/obj/machinery/status_display/ai/directional/east, +/obj/structure/chair{ dir = 8 }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/cargo/storage) +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/hallway/floor1/aft) "olR" = ( /obj/machinery/door/airlock/public{ id_tag = "public_toilets_a"; @@ -55351,6 +54931,11 @@ /obj/structure/ladder, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) +"ome" = ( +/obj/effect/spawner/random/maintenance, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor3/starboard) "omg" = ( /obj/structure/safe/floor, /obj/effect/spawner/random/entertainment/money_large, @@ -55395,24 +54980,10 @@ dir = 8 }, /area/station/hallway/floor4/fore) -"omv" = ( -/obj/machinery/light/directional/south, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) "omA" = ( /obj/effect/spawner/random/structure/table_fancy, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) -"omE" = ( -/obj/machinery/light/directional/west, -/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/chapel{ - dir = 1 - }, -/area/station/service/chapel) "omF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55424,11 +54995,6 @@ /obj/machinery/photocopier, /turf/open/floor/iron/dark/textured_large, /area/station/service/library/printer) -"omH" = ( -/obj/machinery/suit_storage_unit/hos, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hos) "omK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, @@ -55439,6 +55005,14 @@ }, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) +"omP" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/tile/dark_red/fourcorners, +/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/brig) "omS" = ( /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/dark/side, @@ -55484,7 +55058,7 @@ /turf/open/floor/iron, /area/station/hallway/secondary/exit) "onz" = ( -/obj/item/storage/backpack/duffelbag/med/surgery{ +/obj/item/surgery_tray/full{ pixel_y = 13 }, /obj/item/reagent_containers/medigel/sterilizine{ @@ -55541,14 +55115,6 @@ }, /turf/open/floor/iron/white, /area/station/science/lobby) -"onY" = ( -/mob/living/simple_animal/pet/penguin/baby{ - dir = 8 - }, -/turf/open/floor/fake_snow{ - icon_state = "snow6" - }, -/area/station/hallway/floor2/fore) "ool" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55571,13 +55137,6 @@ "ooy" = ( /turf/open/floor/iron/chapel, /area/station/service/chapel) -"ooC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark/textured_edge{ - dir = 8 - }, -/area/station/medical/chemistry) "ooE" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor/heavy, @@ -55598,7 +55157,6 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/fore) "ooN" = ( -/obj/item/storage/fancy/donut_box, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/table, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -55610,10 +55168,14 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/crate, /obj/machinery/camera/autoname/directional/south, +/obj/machinery/suit_storage_unit/industrial/loader, /turf/open/floor/iron/smooth, /area/station/cargo/warehouse) +"ooQ" = ( +/obj/machinery/light/warm/directional/north, +/turf/open/floor/carpet/orange, +/area/station/service/chapel/funeral) "ooV" = ( /obj/effect/decal/cleanable/dirt, /obj/item/ammo_casing/c38{ @@ -55629,6 +55191,7 @@ /obj/structure/cable, /obj/machinery/newscaster/directional/north, /obj/effect/turf_decal/tile/red/fourcorners, +/obj/item/key/security, /turf/open/floor/iron/dark, /area/station/security/warden) "ooY" = ( @@ -55643,17 +55206,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/floor2/port/aft) -"opo" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/security/detectives_office/private_investigators_office) +"opn" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, +/area/station/engineering/atmos/project) "opr" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -55726,7 +55282,7 @@ "oqc" = ( /obj/structure/fluff{ desc = "What, you think the water just magically soaks into the metallic flooring?"; - icon = 'icons/obj/lavaland/survival_pod.dmi'; + icon = 'icons/obj/mining_zones/survival_pod.dmi'; icon_state = "fan_tiny"; name = "shower drain" }, @@ -55769,12 +55325,6 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"oqD" = ( -/obj/structure/table, -/obj/machinery/vending/wallmed/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/station/hallway/floor2/fore) "oqK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55804,6 +55354,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/security/execution/education) +"oqU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/food/popcorn, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor2/starboard) "oqW" = ( /obj/machinery/conveyor/inverted{ dir = 9; @@ -55854,6 +55410,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/station/medical/psychology) +"osk" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/carpet/red, +/area/station/service/theater) "osu" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -55881,11 +55443,6 @@ /obj/structure/hedge, /turf/open/floor/carpet/green, /area/station/service/kitchen/diner) -"ota" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/effect/turf_decal/siding/white, -/turf/open/floor/iron/white, -/area/station/science/cytology) "ote" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -55932,6 +55489,13 @@ dir = 8 }, /area/station/maintenance/solars/starboard/fore) +"otR" = ( +/obj/machinery/door/window/left/directional/south{ + name = "Pen 5"; + req_access = list("xenobiology") + }, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "otX" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/effect/turf_decal/siding/white/end{ @@ -55959,12 +55523,6 @@ /obj/structure/kitchenspike, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) -"oue" = ( -/obj/structure/mirror/directional/west, -/obj/machinery/light/small/directional/south, -/obj/structure/sink/directional/east, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/rd) "ouk" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -55992,12 +55550,6 @@ dir = 1 }, /area/station/hallway/floor3/aft) -"ouI" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/effect/landmark/navigate_destination/det, -/turf/open/floor/wood, -/area/station/hallway/floor4/fore) "ouR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_edge, @@ -56047,6 +55599,10 @@ }, /turf/open/floor/iron/textured_large, /area/station/cargo/sorting) +"ovJ" = ( +/obj/machinery/light/cold/no_nightlight/directional/north, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "ovK" = ( /turf/open/floor/carpet/neon/simple/white, /area/station/commons/dorms/room3) @@ -56059,13 +55615,10 @@ /obj/structure/broken_flooring/pile/directional/east, /turf/open/floor/plating, /area/station/maintenance/floor1/port/aft) -"ovU" = ( -/obj/effect/turf_decal/trimline/white/line{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) +"ovP" = ( +/obj/machinery/newscaster/directional/north, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/aisat) "ovY" = ( /obj/structure/table/reinforced/rglass, /obj/effect/turf_decal/box/white, @@ -56079,17 +55632,6 @@ /obj/structure/grille, /turf/open/floor/plating, /area/station/maintenance/floor4/port) -"owf" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/turf_decal/stripes/end{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/portables_connector{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/canister/hydrogen, -/turf/open/floor/iron/white, -/area/station/science/cytology) "owh" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -56098,14 +55640,21 @@ /turf/open/floor/iron/dark/side, /area/station/security/checkpoint) "owk" = ( -/obj/structure/cable, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes{ + 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/stripes, +/obj/effect/turf_decal/trimline/brown/line, /obj/structure/disposalpipe/segment{ - dir = 4 + dir = 5 }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/starboard/fore) +/turf/open/floor/iron/dark/smooth_half, +/area/station/bitrunning/den) "owo" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -56113,14 +55662,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) -"ows" = ( -/obj/effect/spawner/random/vending/snackvend, -/obj/effect/turf_decal/trimline/green/arrow_cw{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/cargo/miningdock) "owB" = ( /turf/open/floor/catwalk_floor, /area/station/science/xenobiology/hallway) @@ -56175,6 +55716,14 @@ "oxn" = ( /turf/closed/wall, /area/station/medical/office) +"oxo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/plastic{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white, +/area/station/hallway/floor2/fore) "oxs" = ( /obj/structure/industrial_lift/public, /turf/open/floor/plating/elevatorshaft, @@ -56212,6 +55761,17 @@ /obj/machinery/light/red/dim/directional/west, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/starboard/aft) +"oxQ" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/obj/machinery/recharge_station, +/obj/effect/turf_decal/tile/red/half{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/eva) "oxX" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/flora/bush/sparsegrass/style_random, @@ -56225,15 +55785,16 @@ "oyh" = ( /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) -"oyo" = ( -/obj/effect/turf_decal/siding/wood/corner{ +"oyv" = ( +/obj/machinery/light_switch/directional/east, +/obj/effect/turf_decal/siding/purple{ dir = 4 }, -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/machinery/restaurant_portal/bar, -/turf/open/floor/iron/checker, -/area/station/service/bar/atrium) +/obj/machinery/dna_scannernew, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "oyy" = ( /obj/machinery/duct, /obj/machinery/light_switch/directional/south{ @@ -56278,6 +55839,16 @@ /obj/structure/sign/warning/biohazard/directional/west, /turf/open/floor/iron/white, /area/station/hallway/floor2/aft) +"oyT" = ( +/turf/closed/wall, +/area/station/bitrunning/den) +"oyW" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/iron/checker, +/area/station/commons/vacant_room/commissary) "oyZ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -56313,49 +55884,34 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) +"ozs" = ( +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/floor/pod/dark, +/area/station/cargo/storage) "ozt" = ( /turf/open/openspace, /area/station/medical/psychology) -"ozE" = ( -/obj/item/storage/box/rubbershot{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/storage/box/rubbershot{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/storage/box/rubbershot, -/obj/item/storage/box/rubbershot, -/obj/item/storage/box/rubbershot{ - pixel_x = 3; - pixel_y = -3 +"ozy" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 8 }, -/obj/item/storage/box/rubbershot{ - pixel_x = 3; - pixel_y = -3 +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 }, -/obj/structure/table/reinforced, -/obj/structure/sign/poster/official/random/directional/south, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"ozF" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/light/small/directional/east, -/obj/machinery/hydroponics/constructable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/light/cold/no_nightlight/directional/north, /turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden) +/area/station/security/detectives_office/private_investigators_office) "ozJ" = ( /obj/structure/disposalpipe/junction/yjunction{ dir = 8 }, /turf/open/floor/iron, /area/station/hallway/floor2/aft) -"ozK" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/carpet/neon/simple/white, -/area/station/commons/dorms/room3) "ozL" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -56378,6 +55934,14 @@ /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port/aft) +"oAc" = ( +/obj/effect/turf_decal/trimline/purple/line, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/structure/railing/corner/end/flip, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) "oAd" = ( /obj/structure/flora/bush/sparsegrass/style_random, /obj/structure/window/spawner/directional/south, @@ -56396,18 +55960,6 @@ }, /turf/open/floor/carpet/royalblack, /area/station/service/kitchen/diner) -"oAn" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/obj/structure/rack, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 - }, -/obj/item/wrench, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/commons/vacant_room/commissary) "oAv" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -56429,13 +55981,13 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/mineral/silver, /area/station/service/chapel) -"oAN" = ( -/obj/machinery/light/directional/west, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/dark/side{ +"oAH" = ( +/obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 8 }, -/area/station/hallway/floor2/aft) +/obj/machinery/light/floor, +/turf/open/floor/iron/white, +/area/station/medical/psychology) "oAO" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ @@ -56515,6 +56067,16 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/port) +"oCb" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 8 + }, +/obj/machinery/airalarm/directional/east, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/structure/table/reinforced, +/turf/open/floor/iron/dark, +/area/station/command/gateway) "oCc" = ( /obj/effect/turf_decal/tile/red/anticorner/contrasted, /obj/machinery/flasher/directional/east{ @@ -56627,16 +56189,6 @@ /obj/effect/spawner/random/maintenance/three, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"oDQ" = ( -/obj/machinery/airalarm/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/white/textured_large, -/area/station/service/chapel/office) "oDS" = ( /obj/machinery/holopad, /obj/machinery/duct, @@ -56654,15 +56206,6 @@ "oEk" = ( /turf/closed/wall, /area/station/service/library/artgallery) -"oEo" = ( -/obj/machinery/power/smes, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/light/directional/west, -/turf/open/floor/plating, -/area/station/engineering/gravity_generator) "oEr" = ( /obj/machinery/vending/wardrobe/jani_wardrobe, /obj/effect/turf_decal/tile/green/full, @@ -56694,17 +56237,6 @@ }, /turf/open/floor/wood, /area/station/command/meeting_room) -"oEN" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 1 - }, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "oET" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56752,15 +56284,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard/aft) -"oFw" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/effect/turf_decal/stripes{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/science/cytology) "oFF" = ( /obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -56772,25 +56295,60 @@ }, /turf/open/floor/iron/smooth_half, /area/station/tcommsat/server) +"oFH" = ( +/obj/structure/frame/machine{ + anchored = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/circuit, +/area/station/science/cytology) +"oFI" = ( +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "oFM" = ( /obj/effect/spawner/structure/window/hollow/reinforced/directional, /obj/structure/cable, /turf/open/floor/plating, /area/station/security/prison/shower) -"oFN" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/terminal{ - dir = 4 - }, -/turf/open/floor/circuit/telecomms, -/area/station/tcommsat/server/upper) "oFS" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/side{ dir = 1 }, /area/station/hallway/floor3/aft) +"oFT" = ( +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/hallway/floor2/aft) +"oFX" = ( +/obj/item/trash/champagne_cork{ + pixel_x = 8; + pixel_y = 5 + }, +/obj/item/trash/energybar, +/obj/item/stack/cannonball/trashball{ + pixel_x = -7; + pixel_y = 4 + }, +/obj/item/trash/cheesie, +/obj/effect/decal/cleanable/garbage, +/obj/effect/decal/cleanable/food/plant_smudge, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/south, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/port/aft) +"oFY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron, +/area/station/science/lobby) "oGc" = ( /obj/effect/turf_decal/trimline/red/warning{ dir = 4 @@ -56807,21 +56365,20 @@ dir = 4 }, /area/station/hallway/floor3/aft) -"oGm" = ( -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 8 +"oGk" = ( +/obj/machinery/atmospherics/components/binary/pump/layer4{ + name = "Distro to External Ports" }, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/airalarm/directional/east, +/obj/structure/cable, /turf/open/floor/iron, -/area/station/science/genetics) +/area/station/engineering/atmos) "oGo" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/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, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor2/starboard) "oGt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56835,21 +56392,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/starboard/aft) -"oGE" = ( -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 +"oGF" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/mapping_helpers/airlock/access/all/science/genetics, +/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, +/obj/machinery/door/airlock/science/glass{ + name = "Genetics Office" }, -/obj/machinery/light/directional/east, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/iron/dark/side{ - dir = 8 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/area/station/command/teleporter) -"oGK" = ( -/obj/machinery/space_heater, -/obj/machinery/light/red/dim/directional/south, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/port) +/turf/open/floor/iron, +/area/station/science/genetics) "oGL" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor/heavy, @@ -56923,18 +56480,6 @@ /obj/structure/broken_flooring/singular/directional/south, /turf/open/floor/plating, /area/station/maintenance/floor1/port) -"oHz" = ( -/obj/structure/girder/reinforced, -/obj/structure/cable, -/obj/effect/spawner/structure/window/hollow/reinforced/plasma/middle{ - dir = 4 - }, -/obj/machinery/door/poddoor/preopen{ - id = "Xenolab"; - name = "Test Chamber Blast Door" - }, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) "oHC" = ( /obj/structure/hedge/opaque, /obj/structure/window/reinforced/spawner/directional/east, @@ -56954,20 +56499,6 @@ /obj/machinery/porta_turret/ai, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) -"oHX" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/light/small/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "AI Upload Foyer"; - network = list("aiupload") - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) "oId" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 1 @@ -57056,6 +56587,20 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/maintenance/floor2/starboard/aft) +"oJf" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner, +/obj/machinery/light/cold/no_nightlight/directional/south, +/turf/open/floor/iron/white, +/area/station/science/xenobiology/hallway) "oJk" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -57081,6 +56626,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/grass, /area/station/medical/virology) +"oJr" = ( +/obj/structure/sign/poster/official/terragov/directional/north, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "oJs" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -57091,15 +56640,14 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/command/heads_quarters/cmo) -"oJF" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 +"oJH" = ( +/obj/effect/turf_decal/box/corners{ + dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/turf/open/floor/engine{ + initial_gas_mix = "o2=22;bz=82;TEMP=293.15" }, -/turf/open/floor/plating, -/area/station/science/genetics) +/area/station/science/xenobiology) "oJO" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/pod/dark, @@ -57108,13 +56656,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) -"oKc" = ( -/obj/effect/turf_decal/trimline/green/filled/corner{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/hallway/floor3/aft) "oKq" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/captain/private) @@ -57133,6 +56674,18 @@ }, /turf/open/floor/wood, /area/station/security/detectives_office) +"oKK" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 6 + }, +/obj/machinery/status_display/ai/directional/west, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/hallway/floor1/fore) "oKL" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -57161,6 +56714,17 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"oKT" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/obj/structure/chair/plastic, +/obj/effect/landmark/start/cargo_technician, +/turf/open/floor/iron, +/area/station/cargo/storage) "oKY" = ( /turf/open/floor/grass, /area/station/hallway/floor4/fore) @@ -57200,6 +56764,13 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/smooth_large, /area/station/cargo/miningoffice) +"oLB" = ( +/obj/structure/stairs/north, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "oLG" = ( /obj/structure/beebox, /turf/open/floor/grass, @@ -57211,13 +56782,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/showroomfloor, /area/station/command/heads_quarters/qm) -"oLS" = ( -/obj/structure/chair/sofa/bench{ - dir = 8 - }, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/textured_large, -/area/station/cargo/storage) "oMd" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 4 @@ -57225,28 +56789,11 @@ /obj/structure/railing, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) -"oMn" = ( -/obj/item/grenade/barrier{ - pixel_x = -3; - pixel_y = 1 - }, -/obj/item/grenade/barrier, -/obj/item/grenade/barrier{ - pixel_x = 3; - pixel_y = -1 - }, -/obj/item/grenade/barrier{ - pixel_x = 6; - pixel_y = -2 - }, -/obj/structure/table/reinforced, -/obj/machinery/camera/directional/south{ - c_tag = "Armory - Interior" - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +"oMv" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/garbage, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "oMz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/camera/directional/west, @@ -57272,17 +56819,6 @@ dir = 8 }, /area/station/hallway/secondary/exit/departure_lounge) -"oMU" = ( -/obj/structure/rack, -/obj/item/circuitboard/machine/biogenerator{ - pixel_y = 6 - }, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/servo, -/obj/item/stack/cable_coil, -/obj/item/stack/sheet/glass/fifty, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "oMV" = ( /obj/structure/cable, /obj/machinery/light/red/dim/directional/east, @@ -57339,11 +56875,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood/large, /area/station/maintenance/floor4/starboard/aft) -"oNs" = ( -/obj/machinery/vending/hydronutrients, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics) "oNI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, @@ -57407,14 +56938,6 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/security/medical) -"oOr" = ( -/obj/effect/turf_decal/trimline/blue/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/oil, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server/upper) "oOA" = ( /obj/machinery/atmospherics/pipe/smart/manifold/dark/visible{ dir = 1 @@ -57426,6 +56949,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/grass, /area/station/science/genetics) +"oOK" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/hallway/floor1/fore) +"oOR" = ( +/obj/structure/table/glass, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron/white, +/area/station/science/lower) "oOW" = ( /obj/structure/rack, /obj/item/gun/energy/e_gun/dragnet, @@ -57455,6 +56989,20 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/secondary/entry) +"oPm" = ( +/obj/effect/landmark/start/prisoner, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/sign/poster/official/random/directional/west, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/wood/large, +/area/station/security/prison/safe) +"oPv" = ( +/obj/machinery/component_printer, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/white, +/area/station/science/circuits) "oPA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -57597,6 +57145,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/textured_large, /area/station/cargo/storage) +"oRq" = ( +/obj/machinery/door/window/left/directional/north{ + name = "Pen 3"; + req_access = list("xenobiology") + }, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "oRw" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -57638,17 +57193,11 @@ /obj/structure/cable/multilayer/multiz, /turf/open/floor/catwalk_floor, /area/station/hallway/floor2/fore) -"oRK" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 9 - }, -/area/station/hallway/floor2/fore) -"oRM" = ( -/obj/effect/baseturf_helper/reinforced_plating/ceiling, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) +"oRS" = ( +/obj/machinery/teleport/station, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat) "oRX" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -57668,30 +57217,6 @@ }, /turf/open/floor/iron/white, /area/station/science/lower) -"oSf" = ( -/obj/structure/rack, -/obj/item/clothing/suit/armor/vest{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/suit/armor/vest, -/obj/item/clothing/suit/armor/vest{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/clothing/head/helmet/sec{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/head/helmet/sec, -/obj/item/clothing/head/helmet/sec{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/structure/sign/poster/official/random/directional/east, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "oSg" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -57705,6 +57230,25 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"oSj" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/button/door/directional/south{ + id = "mine_bhz_lock"; + name = "Biohazard Lockdown"; + normaldoorcontrol = 1; + pixel_x = -6; + specialfunctions = 4 + }, +/turf/open/floor/iron/white/smooth_edge{ + dir = 1 + }, +/area/station/cargo/miningoffice) "oSt" = ( /turf/closed/wall, /area/station/engineering/lobby) @@ -57740,15 +57284,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) -"oSD" = ( -/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/machinery/holopad, -/turf/open/floor/iron/white, -/area/station/science/cytology) "oSL" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Bulkhead" @@ -57829,14 +57364,6 @@ /obj/effect/turf_decal/tile/purple/full, /turf/open/floor/iron/dark/smooth_large, /area/station/engineering/storage/tech) -"oTw" = ( -/obj/effect/turf_decal/tile/green/half, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark/side, -/area/station/hallway/secondary/exit/escape_pod) "oTx" = ( /obj/structure/table/wood, /obj/item/storage/box/drinkingglasses, @@ -57902,6 +57429,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/silver, /area/station/service/chapel/funeral) +"oUu" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "oUE" = ( /obj/machinery/vending/wallmed/directional/north, /obj/structure/disposalpipe/segment{ @@ -57918,18 +57455,6 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/iron, /area/station/cargo/storage) -"oUN" = ( -/obj/machinery/door/airlock/science{ - name = "Genetics" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/science/genetics, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "oVa" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -57939,18 +57464,20 @@ }, /turf/open/floor/iron/white, /area/station/medical/storage) -"oVf" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/hallway/floor1/fore) "oVj" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 5 }, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) +"oVy" = ( +/obj/structure/bed/medical/emergency, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/gym/mirrored/right{ + pixel_y = 32 + }, +/turf/open/floor/iron/dark/textured, +/area/station/commons/fitness) "oVB" = ( /obj/effect/decal/cleanable/oil, /turf/open/floor/iron/textured_large, @@ -57969,6 +57496,20 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) +"oVY" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/machinery/light/cold/no_nightlight/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/floor3/fore) +"oVZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/sign/departments/medbay/alt/directional/south, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "oWe" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/wood/tile, @@ -58005,13 +57546,6 @@ name = "boxing ring" }, /area/station/commons/fitness) -"oWv" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) "oWA" = ( /obj/machinery/light/red/dim/directional/west, /turf/open/floor/plating, @@ -58064,6 +57598,10 @@ /obj/structure/railing/corner, /turf/open/space/openspace, /area/space/nearstation) +"oXE" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron, +/area/station/science/cytology) "oXN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/siding/white{ @@ -58077,13 +57615,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/small, /area/station/medical/chemistry) -"oXR" = ( -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/wood/tile, -/area/station/service/library) "oXV" = ( /obj/machinery/holopad, /turf/open/floor/carpet, @@ -58092,10 +57623,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/commons/storage/art) -"oYb" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/grass, -/area/station/service/library/garden) "oYi" = ( /obj/machinery/door/firedoor/heavy, /obj/structure/cable, @@ -58141,6 +57668,14 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/carpet/green, /area/station/commons/dorms/apartment1) +"oYI" = ( +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "oYL" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -58192,6 +57727,11 @@ dir = 1 }, /area/station/science/robotics/lab) +"oZk" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer, +/obj/machinery/light/cold/directional/north, +/turf/open/misc/asteroid/snow/standard_air, +/area/station/maintenance/floor2/port/aft) "oZo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -58216,6 +57756,12 @@ /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/iron/dark, /area/station/security/checkpoint/second) +"oZB" = ( +/obj/structure/sign/departments/aiupload/directional/east, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/hallway/floor2/aft) "oZE" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Hatch" @@ -58271,10 +57817,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) -"pbd" = ( -/obj/machinery/light/cold/directional/south, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) "pbe" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -58292,6 +57834,21 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/dorms/room1) +"pbj" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 9 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white, +/area/station/science/xenobiology/hallway) +"pbk" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/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/science/cytology) "pbr" = ( /obj/machinery/light/directional/east, /obj/machinery/deepfryer, @@ -58324,6 +57881,15 @@ }, /turf/open/floor/wood/large, /area/station/security/prison/safe) +"pbF" = ( +/obj/machinery/computer/piratepad_control/civilian, +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 6 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/smooth_large, +/area/station/cargo/lobby) "pbG" = ( /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/dark, @@ -58337,17 +57903,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/office) -"pbU" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/lobby) +"pbX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/status_display/ai/directional/west, +/turf/open/floor/iron, +/area/station/hallway/floor1/aft) "pcf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -58382,17 +57943,20 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard) -"pcC" = ( -/turf/open/openspace, -/area/station/ai_monitored/turret_protected/aisat/hallway) -"pcL" = ( -/obj/structure/table/wood, -/obj/item/toy/plush/moth{ - desc = "Unique and incredibly special, just like you, love yourself."; - name = "Unique Moth" +"pcy" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/light/warm/directional/south, +/obj/effect/landmark/start/psychologist, +/obj/structure/chair/sofa/right/brown{ + dir = 1 }, /turf/open/floor/carpet, /area/station/medical/psychology) +"pcC" = ( +/turf/open/openspace, +/area/station/ai_monitored/turret_protected/aisat/hallway) "pcO" = ( /obj/structure/railing{ dir = 4 @@ -58408,6 +57972,17 @@ "pcR" = ( /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/floor1/aft) +"pdd" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/obj/structure/cable, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat/hallway) +"pdf" = ( +/obj/structure/closet/secure_closet/chief_medical, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/cmo) "pdh" = ( /turf/closed/wall/r_wall, /area/station/science/server) @@ -58431,12 +58006,24 @@ }, /turf/open/floor/glass/reinforced, /area/station/service/library) +"pdU" = ( +/obj/machinery/airalarm/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "pdW" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/sign/poster/contraband/have_a_puff/directional/north, /obj/machinery/vending/snack/blue, /turf/open/floor/iron/white, /area/station/medical/break_room) +"pdY" = ( +/obj/structure/sign/painting/library{ + pixel_y = 32 + }, +/obj/machinery/light/small/directional/east, +/obj/machinery/pdapainter/medbay, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/cmo) "peg" = ( /obj/machinery/light/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -58461,6 +58048,13 @@ }, /turf/open/floor/iron/checker, /area/station/commons/vacant_room/commissary) +"pep" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "per" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -58480,10 +58074,14 @@ /obj/item/stock_parts/cell/high, /turf/open/floor/iron/white, /area/station/science/circuits) -"peU" = ( -/obj/machinery/light/cold/no_nightlight/directional/west, -/turf/open/floor/grass, -/area/station/science/xenobiology) +"pfc" = ( +/obj/machinery/camera/autoname/directional/south, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor3/fore) "pfd" = ( /obj/structure/cable, /obj/effect/decal/cleanable/blood/old, @@ -58537,10 +58135,6 @@ dir = 8 }, /area/station/security/prison/garden) -"pfM" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/commons/locker) "pfN" = ( /obj/effect/spawner/random/trash/garbage{ spawn_scatter_radius = 1 @@ -58576,6 +58170,10 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"pgv" = ( +/obj/machinery/light/floor, +/turf/open/floor/wood/large, +/area/station/service/library/artgallery) "pgE" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/blue/line{ @@ -58605,15 +58203,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard/fore) -"pgT" = ( -/obj/machinery/photocopier, -/obj/structure/window/spawner/directional/south, -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 8 - }, -/turf/open/floor/iron/smooth, -/area/station/science/research/abandoned) "pgU" = ( /obj/effect/turf_decal/trimline/brown/filled/corner, /obj/structure/cable, @@ -58625,18 +58214,20 @@ "phd" = ( /turf/open/misc/sandy_dirt, /area/station/maintenance/floor3/starboard) +"phj" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/station/command/heads_quarters/captain/private) "pht" = ( /obj/effect/turf_decal/trimline/blue, /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/engine/o2, /area/station/engineering/atmos) -"phE" = ( -/obj/machinery/light/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/service/theater) "phI" = ( /obj/effect/turf_decal/stripes{ dir = 10 @@ -58660,14 +58251,6 @@ dir = 8 }, /area/station/hallway/floor1/aft) -"phZ" = ( -/obj/machinery/computer/records/security{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hop) "pie" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 @@ -58737,15 +58320,20 @@ /turf/open/floor/iron/white, /area/station/medical/virology) "piA" = ( -/obj/machinery/modular_computer/console/preset/curator{ +/obj/machinery/modular_computer/preset/curator{ dir = 4 }, /turf/open/floor/engine/cult, /area/station/service/library/private) -"piE" = ( -/obj/structure/closet/secure_closet/hos, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hos) +"piG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/carpet/royalblue, +/area/station/command/heads_quarters/cmo) "piI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -58754,6 +58342,11 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) +"piJ" = ( +/turf/open/floor/engine{ + initial_gas_mix = "o2=22;bz=82;TEMP=293.15" + }, +/area/station/science/xenobiology) "piO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -58785,15 +58378,11 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"pjm" = ( -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) +"pjs" = ( +/obj/machinery/vending/hydronutrients, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics) "pjB" = ( /obj/effect/decal/cleanable/blood/old, /obj/structure/chair{ @@ -58815,7 +58404,7 @@ /turf/open/floor/plating, /area/station/security/execution/transfer) "pjR" = ( -/obj/item/storage/backpack/duffelbag/med/surgery{ +/obj/item/surgery_tray/full{ pixel_y = 13 }, /obj/item/reagent_containers/medigel/sterilizine{ @@ -58882,6 +58471,14 @@ /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, /area/station/service/kitchen/abandoned) +"pkH" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/stripes, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/white, +/area/station/science/auxlab/firing_range) "pkR" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -58910,6 +58507,10 @@ dir = 1 }, /area/station/security/courtroom) +"plz" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "plC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -58919,14 +58520,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/fore) -"plE" = ( -/obj/effect/turf_decal/trimline/blue/line{ - dir = 8 - }, -/obj/machinery/light/small/blacklight/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server/upper) "plI" = ( /obj/structure/table, /obj/item/food/pizzaslice/moldy, @@ -58969,11 +58562,6 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/dark, /area/station/hallway/floor4/fore) -"pmt" = ( -/obj/machinery/light/directional/south, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) "pmw" = ( /obj/effect/turf_decal/siding/wood, /obj/machinery/holopad, @@ -59011,9 +58599,7 @@ "pmG" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, -/mob/living/simple_animal/hostile/retaliate/goat{ - name = "Pete" - }, +/mob/living/basic/goat/pete, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "pmO" = ( @@ -59089,13 +58675,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/security/range) -"pnD" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) "pnF" = ( /obj/structure/railing{ dir = 1 @@ -59122,14 +58701,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/service/janitor) -"pnO" = ( -/obj/structure/bed/roller, -/obj/structure/sign/gym/mirrored{ - pixel_y = 32 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark/textured, -/area/station/commons/fitness) "pnV" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer{ dir = 4; @@ -59144,6 +58715,13 @@ "pog" = ( /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard) +"pov" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/duct, +/turf/open/floor/grass, +/area/station/science/cytology) "poD" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -59195,16 +58773,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/aft) -"ppf" = ( -/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/yellow/line, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) "ppi" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -59255,6 +58823,11 @@ dir = 4 }, /area/station/engineering/storage/tech) +"ppO" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/cyan/visible, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/station/engineering/supermatter) "ppQ" = ( /obj/machinery/camera/directional/south{ c_tag = "Holodeck - Aft"; @@ -59287,6 +58860,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor/iron_dark, /area/station/maintenance/floor3/port) +"pqd" = ( +/obj/structure/rack, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/item/storage/toolbox/electrical{ + pixel_y = 5 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/science/circuits) "pqe" = ( /obj/effect/turf_decal/siding/white, /obj/item/kirbyplants/random/fullysynthetic, @@ -59311,6 +58895,12 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port) +"pqo" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard) "pqy" = ( /obj/machinery/camera{ c_tag = "Power Storage"; @@ -59329,6 +58919,13 @@ dir = 4 }, /area/station/hallway/secondary/exit/departure_lounge) +"pqH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "pqO" = ( /obj/effect/decal/cleanable/glass, /obj/item/shard, @@ -59385,6 +58982,8 @@ }, /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, /turf/open/floor/iron, /area/station/cargo/storage) "pro" = ( @@ -59466,10 +59065,6 @@ dir = 6 }, /area/station/security/office) -"psg" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/cyan/visible, -/turf/open/floor/plating, -/area/station/engineering/supermatter) "psh" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -59484,21 +59079,10 @@ dir = 5 }, /area/station/security/checkpoint) -"pso" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) -"psv" = ( -/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_white, -/area/station/science/cytology) +"psq" = ( +/obj/machinery/airalarm/directional/east, +/turf/open/floor/wood, +/area/station/service/kitchen/diner) "psJ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -59564,24 +59148,6 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron/dark, /area/station/security/lockers) -"pug" = ( -/obj/structure/table/wood, -/obj/item/storage/photo_album/chapel, -/obj/effect/turf_decal/siding/yellow{ - dir = 1 - }, -/obj/item/storage/fancy/candle_box{ - pixel_x = -19; - pixel_y = 5 - }, -/obj/machinery/light/directional/north, -/obj/machinery/requests_console/directional/north{ - department = "Chapel"; - name = "Chapel Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/carpet/orange, -/area/station/service/chapel/office) "pui" = ( /turf/open/floor/iron, /area/station/engineering/atmos/project) @@ -59691,10 +59257,17 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/floor2/aft) -"pvA" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +"pvD" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/vacant_room/commissary) "pvE" = ( /obj/structure/lattice/catwalk, /turf/open/openspace, @@ -59706,26 +59279,28 @@ /turf/open/floor/iron/dark/corner, /area/station/commons/storage/primary) "pvO" = ( -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, +/obj/item/kirbyplants/organic/plant10, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/office) -"pvT" = ( -/obj/structure/rack, -/obj/item/toy/plush/plasmamanplushie{ - desc = "A stuffed toy that resembles your plasma coworkers. It is cute despite itself."; - name = "Nitrous II" - }, -/turf/open/floor/plating, -/area/station/maintenance/floor1/port/fore) "pvZ" = ( /obj/structure/chair/sofa/bench/left, /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/floor/grass, /area/station/service/library/garden) +"pwf" = ( +/obj/machinery/door/firedoor/heavy, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/textured_large, +/area/station/cargo/miningdock) +"pwv" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/hallway/floor3/fore) "pwA" = ( /obj/structure/railing{ dir = 4 @@ -59740,14 +59315,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet/red, /area/station/maintenance/floor3/port/aft) -"pwE" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 - }, -/obj/machinery/newscaster/directional/east, -/obj/machinery/hydroponics/constructable, -/turf/open/floor/iron, -/area/station/service/hydroponics) "pwF" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 10 @@ -59759,6 +59326,19 @@ /obj/structure/railing/corner, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"pwI" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/fore) "pwL" = ( /obj/effect/turf_decal/siding/blue{ dir = 4 @@ -59773,6 +59353,11 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) +"pwY" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/effect/landmark/start/depsec/supply, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "pxb" = ( /obj/machinery/grill, /turf/open/floor/pod/light, @@ -59788,6 +59373,12 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron, /area/station/cargo/lobby) +"pxt" = ( +/obj/item/restraints/handcuffs, +/obj/structure/table/optable, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white/small, +/area/station/security/execution/education) "pxu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59804,7 +59395,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "pxw" = ( @@ -59821,19 +59411,6 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/iron, /area/station/maintenance/floor4/port/fore) -"pxz" = ( -/obj/effect/turf_decal/stripes/full, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/railing{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general, -/obj/machinery/door/poddoor/preopen{ - id = "Xenolab"; - name = "Test Chamber Blast Door" - }, -/turf/open/floor/engine, -/area/station/science/cytology) "pxC" = ( /obj/item/radio/intercom/directional/east, /obj/effect/turf_decal/trimline/dark_blue/filled/corner{ @@ -59850,31 +59427,28 @@ /obj/structure/cable, /turf/open/floor/carpet/orange, /area/station/service/chapel/funeral) -"pxG" = ( -/obj/effect/turf_decal/trimline/green/arrow_ccw{ - dir = 1 - }, -/obj/machinery/shower/directional/north, -/obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/iron/white/small, -/area/station/commons/fitness/recreation) "pxK" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, /obj/machinery/camera/autoname/directional/north, /turf/open/floor/pod/light, /area/station/maintenance/solars/port/aft) +"pxL" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 9 + }, +/obj/structure/railing/corner/end/flip{ + dir = 1 + }, +/obj/machinery/light/cold/no_nightlight/directional/west, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/white, +/area/station/science/cytology) "pxQ" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /turf/open/space/basic, /area/space/nearstation) -"pxU" = ( -/obj/machinery/camera/autoname/directional/south, -/obj/item/kirbyplants/random, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) "pxX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59913,6 +59487,15 @@ }, /turf/open/floor/plating, /area/station/maintenance/disposal) +"pyg" = ( +/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/dark/side{ + dir = 5 + }, +/area/station/hallway/floor3/fore) "pyt" = ( /obj/effect/spawner/random/structure/table_fancy, /obj/machinery/door/window/brigdoor/right/directional/north{ @@ -59920,6 +59503,25 @@ }, /turf/open/floor/wood/large, /area/station/service/library/artgallery) +"pyL" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) +"pyO" = ( +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "pyQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59960,6 +59562,12 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/security/prison) +"pzb" = ( +/obj/effect/turf_decal/siding/wideplating_new{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "pzd" = ( /obj/effect/turf_decal/bot_white/left, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -59984,6 +59592,12 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) +"pzm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, +/obj/machinery/light/small/directional/north, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "pzu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/morgue{ @@ -60009,14 +59623,6 @@ /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/plating, /area/station/construction) -"pzH" = ( -/obj/effect/turf_decal/trimline/blue/corner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server/upper) "pzK" = ( /obj/structure/chair/wood{ dir = 1 @@ -60055,6 +59661,12 @@ /obj/item/stack/sheet/iron, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/aft) +"pAb" = ( +/obj/structure/cable, +/obj/machinery/firealarm/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/smooth, +/area/station/cargo/sorting) "pAn" = ( /obj/effect/mapping_helpers/airlock/access/any/medical/general, /obj/machinery/door/airlock/medical{ @@ -60065,10 +59677,15 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/aft) +"pAv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/port/fore) "pAy" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/flora/bush/snow/style_random, -/turf/open/floor/fake_snow{ +/turf/open/misc/snow/actually_safe{ icon_state = "snow7" }, /area/station/hallway/floor2/fore) @@ -60092,6 +59709,11 @@ /obj/machinery/meter, /turf/closed/wall/r_wall, /area/station/engineering/atmos) +"pAV" = ( +/obj/structure/flora/rock/pile/style_2, +/obj/machinery/duct, +/turf/open/misc/sandy_dirt, +/area/station/science/cytology) "pAY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60100,24 +59722,27 @@ dir = 4 }, /area/station/service/bar/atrium) -"pBh" = ( -/obj/machinery/component_printer, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/light/cold/no_nightlight/directional/west, -/turf/open/floor/iron/white, -/area/station/science/circuits) -"pBw" = ( -/mob/living/simple_animal/slime, -/obj/machinery/camera/directional/south{ - c_tag = "Xenobiology - Slime Pens" +"pBg" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 }, -/turf/open/floor/grass, -/area/station/science/xenobiology) +/obj/effect/landmark/start/depsec/supply, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "pBy" = ( /obj/machinery/light/broken/directional/south, /obj/effect/spawner/random/structure/crate, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/aft) +"pBA" = ( +/obj/machinery/netpod, +/obj/machinery/airalarm/directional/east, +/obj/machinery/airalarm/directional/east, +/obj/machinery/airalarm/directional/east, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/bitrunning/den) "pBJ" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=1-7"; @@ -60125,29 +59750,6 @@ }, /turf/open/floor/iron, /area/station/hallway/floor1/fore) -"pBK" = ( -/obj/machinery/light/directional/south, -/obj/effect/spawner/random/vending/colavend, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor2/aft) -"pBM" = ( -/obj/machinery/computer/department_orders/medical{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white/textured, -/area/station/medical/break_room) -"pBQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/airalarm/directional/east, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/ordnance/storage) "pBS" = ( /obj/machinery/deepfryer, /turf/open/floor/iron/kitchen, @@ -60171,6 +59773,10 @@ }, /turf/open/floor/wood/tile, /area/station/service/library/lounge) +"pBZ" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat/hallway) "pCb" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 6 @@ -60184,6 +59790,17 @@ "pCc" = ( /turf/open/floor/iron/showroomfloor, /area/station/service/theater) +"pCf" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/purple/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/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "pCg" = ( /obj/machinery/door/firedoor/heavy, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -60193,14 +59810,6 @@ dir = 8 }, /area/station/hallway/floor2/aft) -"pCi" = ( -/obj/machinery/computer/piratepad_control/civilian, -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 6 - }, -/turf/open/floor/iron/smooth_large, -/area/station/cargo/lobby) "pCr" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/table/wood, @@ -60254,7 +59863,6 @@ /area/station/medical/virology) "pCW" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/machinery/rnd/bepis, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/cargo/warehouse) @@ -60266,11 +59874,6 @@ }, /turf/open/floor/carpet/red, /area/station/maintenance/floor3/port/aft) -"pDk" = ( -/obj/machinery/light/directional/east, -/obj/structure/cable, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "pDq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60280,21 +59883,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/starboard) -"pDu" = ( -/obj/effect/turf_decal/trimline/red/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/red/line, -/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/delivery, -/obj/machinery/door/firedoor/heavy, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/fore) "pDv" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -60311,15 +59899,11 @@ }, /turf/open/floor/iron, /area/station/hallway/floor3/fore) -"pDz" = ( -/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) "pDB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/airalarm/directional/east, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/wood/parquet, /area/station/maintenance/floor2/port/aft) "pDK" = ( @@ -60329,6 +59913,14 @@ /obj/machinery/duct, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) +"pDL" = ( +/obj/structure/closet/secure_closet/personal, +/obj/item/clothing/under/misc/assistantformal, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/shoes/winterboots, +/obj/machinery/bluespace_vendor/directional/east, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "pDQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60376,6 +59968,11 @@ /obj/structure/cable, /turf/open/floor/wood/large, /area/station/command/heads_quarters/hop) +"pEz" = ( +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/machinery/light/directional/east, +/turf/open/floor/grass, +/area/station/security/courtroom) "pEA" = ( /obj/machinery/door/airlock/medical{ name = "Patient Containment" @@ -60386,13 +59983,12 @@ name = "padded floor" }, /area/station/medical/psychology) -"pED" = ( -/obj/machinery/light/directional/south, -/obj/structure/chair/sofa/corp/left{ - dir = 1 - }, -/turf/open/floor/carpet/purple, -/area/station/maintenance/floor1/port/aft) +"pEE" = ( +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/holopad, +/obj/machinery/light/small/directional/north, +/turf/open/floor/carpet, +/area/station/commons/vacant_room/office) "pEJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -60419,14 +60015,6 @@ /obj/structure/emergency_shield/regenerating, /turf/open/floor/plating, /area/station/cargo/drone_bay) -"pFi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark/textured_edge{ - dir = 8 - }, -/area/station/medical/chemistry) "pFy" = ( /obj/structure/railing/corner{ dir = 1 @@ -60449,18 +60037,20 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/aft) "pGb" = ( -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 8 - }, -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/stripes{ - dir = 6 +/obj/structure/table/glass, +/obj/item/camera_film{ + pixel_x = -6; + pixel_y = 5 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 +/obj/item/camera, +/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, /turf/open/floor/iron/white, -/area/station/science/ordnance/testlab) +/area/station/science/cytology) "pGf" = ( /obj/structure/curtain/cloth/fancy, /obj/effect/mapping_helpers/airlock/access/any/service/kitchen, @@ -60500,16 +60090,6 @@ dir = 8 }, /area/station/security/office) -"pGA" = ( -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 8 - }, -/obj/machinery/rnd/production/protolathe/department/engineering, -/obj/machinery/light/directional/east, -/obj/structure/cable, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/iron/dark/textured_large, -/area/station/engineering/lobby) "pGG" = ( /obj/structure/ladder, /obj/structure/lattice/catwalk, @@ -60564,6 +60144,13 @@ /obj/effect/turf_decal/tile/green/opposingcorners, /turf/open/floor/iron/white, /area/station/medical/virology) +"pHD" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "pHI" = ( /obj/effect/landmark/blobstart, /obj/structure/railing, @@ -60687,11 +60274,6 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"pJi" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/textured_large, -/area/station/cargo/storage) "pJj" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -60775,12 +60357,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) -"pJZ" = ( -/obj/effect/spawner/random/contraband/landmine, -/turf/open/floor/engine{ - icon_state = "textured_dark" - }, -/area/station/maintenance/floor2/starboard/aft) "pKd" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -60808,6 +60384,12 @@ dir = 4 }, /area/station/hallway/floor1/aft) +"pKA" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/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/genetics) "pKD" = ( /obj/effect/turf_decal/trimline/red/line{ dir = 4 @@ -60821,25 +60403,30 @@ }, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) +"pKO" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/corner, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/rd) "pLe" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"pLp" = ( -/obj/machinery/light/directional/east, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/wood/large, -/area/station/service/kitchen/kitchen_backroom) "pLy" = ( /obj/effect/spawner/random/trash/cigbutt, /obj/machinery/shower/directional/west, /turf/open/floor/iron/freezer, /area/station/hallway/secondary/service) +"pLJ" = ( +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 8 + }, +/obj/machinery/rnd/production/protolathe/department/engineering, +/obj/structure/cable, +/obj/machinery/newscaster/directional/east, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/lobby) "pLK" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/plating, @@ -60856,6 +60443,12 @@ /obj/structure/reagent_dispensers/plumbed, /turf/open/floor/wood/large, /area/station/service/kitchen/kitchen_backroom) +"pLY" = ( +/obj/machinery/vending/cola/pwr_game, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "pMa" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -60865,7 +60458,6 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible, /obj/machinery/camera/autoname/directional/west, -/obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/supermatter/room) "pMe" = ( @@ -60876,13 +60468,12 @@ }, /turf/open/floor/plating, /area/station/science/robotics/lab) -"pMn" = ( -/obj/structure/table/wood, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/item/knife, -/turf/open/floor/wood/large, -/area/station/service/kitchen/kitchen_backroom) +"pMf" = ( +/obj/structure/closet/secure_closet/medical2, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/surgery/fore) "pMo" = ( /obj/effect/spawner/structure/window/hollow/directional{ dir = 4 @@ -60944,7 +60535,6 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor2/port) "pMW" = ( -/obj/structure/railing/corner, /obj/effect/turf_decal/trimline/purple/corner, /obj/machinery/door/firedoor/border_only{ dir = 1 @@ -60952,6 +60542,7 @@ /obj/machinery/door/firedoor/border_only{ dir = 8 }, +/obj/structure/railing/corner/end/flip, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) "pMZ" = ( @@ -60988,24 +60579,6 @@ "pNj" = ( /turf/open/floor/carpet/red, /area/station/service/library) -"pNA" = ( -/obj/structure/rack, -/obj/machinery/light/cold/no_nightlight/directional/north, -/obj/effect/turf_decal/stripes, -/obj/item/gun/energy/laser/practice{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/gun/energy/laser/practice{ - pixel_x = 2; - pixel_y = 5 - }, -/obj/item/gun/energy/laser/practice{ - pixel_x = 2; - pixel_y = 1 - }, -/turf/open/floor/plating, -/area/station/science/auxlab/firing_range) "pNH" = ( /turf/open/floor/carpet, /area/station/service/lawoffice) @@ -61075,6 +60648,13 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port/aft) +"pOv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/hallway/floor3/aft) "pOG" = ( /turf/closed/wall/r_wall, /area/station/security/eva) @@ -61173,6 +60753,18 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/carpet, /area/station/medical/psychology) +"pPJ" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/hallway/secondary/exit/departure_lounge) "pPL" = ( /obj/machinery/door/window/brigdoor/security/cell/left/directional/south{ id = "cell-2"; @@ -61232,6 +60824,10 @@ }, /turf/open/floor/iron/white/small, /area/station/commons/fitness/recreation) +"pQP" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/light, +/area/station/maintenance/floor2/starboard) "pQW" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -61305,15 +60901,6 @@ /obj/item/knife/shiv, /turf/open/floor/plating, /area/station/maintenance/floor1/port/aft) -"pRO" = ( -/obj/effect/turf_decal/trimline/blue/line{ - dir = 8 - }, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server/upper) "pRS" = ( /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron/dark/side, @@ -61392,11 +60979,6 @@ /obj/machinery/griddle, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) -"pTv" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/turf_decal/siding/white, -/turf/open/floor/carpet/orange, -/area/station/service/chapel/funeral) "pTI" = ( /obj/structure/railing/corner{ dir = 4 @@ -61422,14 +61004,6 @@ }, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"pTW" = ( -/obj/machinery/door/airlock/external{ - name = "External Airlock" - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server/upper) "pUa" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -61446,6 +61020,7 @@ /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 9 }, +/obj/structure/cable, /turf/open/floor/iron/dark/textured_corner, /area/station/engineering/supermatter/room) "pUl" = ( @@ -61453,6 +61028,15 @@ /obj/machinery/air_sensor/mix_tank, /turf/open/floor/engine/vacuum, /area/station/engineering/atmos) +"pUn" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 8 + }, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/ai_monitored/command/storage/eva) "pUp" = ( /obj/effect/turf_decal/trimline/blue/line{ dir = 4 @@ -61464,6 +61048,13 @@ dir = 1 }, /area/station/engineering/lobby) +"pUq" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat/service) "pUr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -61492,27 +61083,40 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/floor3/fore) +"pUH" = ( +/obj/effect/turf_decal/tile/blue/half{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron/textured_edge{ + dir = 4 + }, +/area/station/medical/chemistry) "pUI" = ( /obj/structure/chair/comfy, /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, /turf/open/floor/wood/parquet, /area/station/commons/dorms/room2) -"pUT" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/clothing/glasses/regular, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 8 - }, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/commons/dorms/room1) "pUV" = ( /turf/open/floor/plating/airless, /area/station/solars/port/aft) +"pVd" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/machinery/vending/coffee, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/floor3/aft) +"pVe" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "mailbelt" + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/textured_large, +/area/station/cargo/sorting) "pVi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -61537,28 +61141,28 @@ /obj/effect/mapping_helpers/airlock/access/any/service/kitchen, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port/fore) -"pVN" = ( -/turf/open/floor/iron, -/area/station/maintenance/floor4/starboard) +"pVK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/station/hallway/floor2/fore) "pVP" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/medical/medbay/central) -"pVT" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "pVZ" = ( /obj/effect/turf_decal/trimline/yellow/line, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/half, /area/station/engineering/lobby) +"pWa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "pWf" = ( /obj/effect/turf_decal/bot, /obj/structure/reagent_dispensers/watertank/high, @@ -61608,20 +61212,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/floor3/aft) -"pXb" = ( -/obj/structure/punching_bag, -/obj/effect/turf_decal/stripes, -/turf/open/floor/iron/smooth_large, -/area/station/medical/psychology) -"pXd" = ( -/obj/structure/table/reinforced, -/obj/item/storage/box/monkeycubes{ - pixel_x = -5; - pixel_y = 1 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard) "pXh" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -61629,28 +61219,41 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port/aft) -"pXi" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/light/directional/north, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/grass, -/area/station/service/bar/atrium) "pXr" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating/airless, /area/station/solars/port/aft) +"pXG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/effect/turf_decal/arrows{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/station/service/library/lounge) "pXL" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/dark_blue/filled/corner, /turf/open/floor/iron/dark/corner, /area/station/hallway/floor3/aft) -"pXQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +"pXR" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/checker{ dir = 1 }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/port) +/area/station/science/genetics) "pXT" = ( /obj/structure/chair/plastic{ dir = 4 @@ -61685,38 +61288,36 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/catwalk_floor/iron_dark, /area/station/maintenance/floor2/port) -"pYh" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 10 +"pYj" = ( +/obj/machinery/computer/apc_control, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 }, -/obj/machinery/power/apc/auto_name/directional/west, +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, -/obj/effect/landmark/start/depsec/supply, /turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) +/area/station/command/bridge) "pYl" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/carpet/blue, /area/station/command/heads_quarters/hop) +"pYs" = ( +/obj/machinery/computer/atmos_control/nocontrol/master{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/office) "pYw" = ( /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/lawoffice) -"pYz" = ( -/obj/effect/turf_decal/trimline/red/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/red/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/junction{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/fore) "pYC" = ( /obj/machinery/atmospherics/pipe/smart/simple/supply/visible/layer4{ dir = 10 @@ -61728,10 +61329,6 @@ /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible, /turf/open/floor/iron, /area/station/engineering/atmos) -"pYE" = ( -/obj/machinery/vending/cigarette, -/turf/open/floor/iron/checker, -/area/station/service/bar/atrium) "pYK" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron, @@ -61747,10 +61344,6 @@ /obj/item/kirbyplants/random, /turf/open/floor/carpet, /area/station/commons/vacant_room/office) -"pYX" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/hallway/floor3/aft) "pZc" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/yellow/warning, @@ -61771,15 +61364,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) -"pZk" = ( -/obj/effect/turf_decal/trimline/white/arrow_ccw, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/station/hallway/secondary/entry) "pZm" = ( /obj/effect/turf_decal/trimline/green/filled/line, /turf/open/floor/iron/dark, @@ -61874,31 +61458,10 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/service/hydroponics/garden) -"qas" = ( -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/multiz/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/multiz/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor2/aft) "qat" = ( /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/checker, /area/station/commons/vacant_room/commissary) -"qaD" = ( -/obj/effect/turf_decal/trimline/red/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/heavy, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor{ - elevator_linked_id = "com_vator"; - elevator_mode = 1 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/aft) "qaE" = ( /obj/structure/cable, /turf/open/floor/iron/textured_half{ @@ -61937,12 +61500,6 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/wood, /area/station/service/kitchen/diner) -"qbc" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/structure/closet/secure_closet/chemical, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) "qbg" = ( /obj/machinery/camera/autoname/directional/south, /turf/open/openspace, @@ -61984,12 +61541,16 @@ "qbG" = ( /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard/aft) -"qbO" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 8 +"qcd" = ( +/obj/effect/turf_decal/trimline/green/line, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1 }, -/area/station/hallway/floor4/aft) +/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/dark, +/area/station/hallway/floor3/fore) "qcj" = ( /obj/effect/turf_decal/trimline/green/warning{ dir = 6 @@ -61997,11 +61558,12 @@ /obj/effect/spawner/random/structure/tank_holder, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port) -"qcm" = ( -/obj/structure/closet/secure_closet/chief_medical, -/obj/machinery/light/small/directional/south, -/turf/open/floor/wood/parquet, -/area/station/command/heads_quarters/cmo) +"qck" = ( +/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/dark/smooth_large, +/area/station/science/robotics/lab) "qcp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -62046,8 +61608,8 @@ /turf/open/floor/iron, /area/station/service/hydroponics/garden) "qcI" = ( -/obj/structure/bed{ - dir = 1 +/obj/structure/bed/medical/anchored{ + dir = 8 }, /obj/effect/turf_decal/tile/blue/fourcorners, /obj/structure/sign/poster/official/random/directional/west, @@ -62129,6 +61691,22 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/iron/checker, /area/station/service/bar) +"qdz" = ( +/obj/structure/table/reinforced, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = 9; + pixel_y = 4 + }, +/obj/item/radio{ + pixel_x = -6; + pixel_y = -3 + }, +/obj/machinery/recharger{ + pixel_y = 3 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/third) "qdB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62148,11 +61726,6 @@ }, /turf/open/floor/iron, /area/station/hallway/floor1/aft) -"qdO" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) "qdV" = ( /turf/open/floor/plating/airless, /area/station/solars/starboard/fore) @@ -62204,33 +61777,12 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/carbon_input, /turf/open/floor/engine/co2, /area/station/engineering/atmos) -"qel" = ( -/obj/effect/turf_decal/stripes{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/closet/secure_closet/cytology, -/turf/open/floor/plating, -/area/station/science/cytology) "qem" = ( /obj/machinery/door/airlock/wood{ name = "Bedroom" }, /turf/open/floor/carpet/green, /area/station/commons/dorms/apartment2) -"qer" = ( -/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, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/office) "qeu" = ( /obj/effect/landmark/start/hangover, /obj/structure/chair/sofa/middle/brown{ @@ -62238,6 +61790,10 @@ }, /turf/open/floor/wood/large, /area/station/service/library/lounge) +"qey" = ( +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor4/aft) "qez" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, @@ -62369,22 +61925,6 @@ /obj/item/toy/nuke, /turf/open/floor/pod/light, /area/station/security/execution/education) -"qgy" = ( -/obj/structure/railing/corner, -/obj/effect/turf_decal/trimline/purple/warning, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) -"qgA" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/line{ - dir = 9 - }, -/obj/machinery/status_display/ai/directional/east, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/hallway/floor2/aft) "qgE" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor/heavy, @@ -62405,13 +61945,6 @@ }, /turf/open/floor/iron/white, /area/station/science/circuits) -"qgR" = ( -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/engine, -/area/station/science/xenobiology) "qgT" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/heat_exchanging/manifold, @@ -62429,25 +61962,12 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/port/fore) -"qhn" = ( -/obj/effect/turf_decal/stripes, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "qhp" = ( /obj/machinery/camera/directional/east{ c_tag = "MiniSAT Access Staircase" }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/hallway) -"qht" = ( -/obj/machinery/status_display/ai/directional/east, -/obj/structure/flora/bush/lavendergrass/style_random, -/turf/open/floor/grass, -/area/station/security/courtroom) "qhC" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -62469,6 +61989,11 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/starboard) +"qhN" = ( +/obj/structure/cable/multilayer/multiz, +/obj/machinery/light/small/directional/north, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor3/aft) "qhP" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/effect/landmark/start/chemist, @@ -62482,10 +62007,6 @@ /obj/structure/railing, /turf/open/misc/beach/sand, /area/station/hallway/floor2/fore) -"qik" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/grass, -/area/station/service/library/garden) "qiw" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/structure/sign/poster/official/moth_meth/directional/south, @@ -62515,14 +62036,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/dark, /area/station/service/kitchen/abandoned) -"qjg" = ( -/obj/effect/turf_decal/trimline/purple/line, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) +"qiU" = ( +/obj/machinery/atmospherics/pipe/multiz/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/multiz/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor3/fore) "qjj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62685,15 +62203,6 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/port/fore) -"qln" = ( -/obj/structure/railing/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/trimline/purple/warning, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) "qlo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62732,22 +62241,6 @@ }, /turf/open/floor/iron, /area/station/cargo/miningdock) -"qlQ" = ( -/obj/machinery/light/directional/north, -/obj/structure/sign/directions/evac/directional/north{ - dir = 2; - pixel_y = 40 - }, -/obj/structure/sign/directions/engineering/directional/north{ - dir = 2 - }, -/obj/structure/sign/directions/supply/directional/north{ - dir = 2; - pixel_y = 24 - }, -/obj/structure/railing/corner, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor2/fore) "qmb" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -62767,6 +62260,10 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/lockers) +"qmg" = ( +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "qmj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -62792,13 +62289,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"qmH" = ( -/obj/effect/turf_decal/siding/blue/corner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet/neon/simple/pink/nodots, -/area/station/maintenance/floor2/port/fore) "qmM" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -62806,6 +62296,10 @@ /obj/structure/cable, /turf/open/floor/carpet/neon/simple/white, /area/station/commons/dorms/room3) +"qna" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/medical/abandoned) "qnc" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -62893,6 +62387,15 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/engine/atmos) +"qot" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "qov" = ( /obj/structure/chair/comfy, /obj/machinery/power/apc/auto_name/directional/east, @@ -62947,34 +62450,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/atmos) -"qpa" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/button/ignition{ - id = "Xenobio"; - pixel_x = -4; - pixel_y = 24 - }, -/obj/machinery/button/door/directional/north{ - id = "Xenolab"; - name = "Test Chamber Blast Doors"; - pixel_x = 6; - req_access = list("xenobiology") - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) +"qoW" = ( +/obj/machinery/airalarm/directional/west, +/obj/structure/cable, +/obj/machinery/light/directional/west, +/turf/open/floor/wood, +/area/station/service/kitchen/diner) "qpb" = ( /obj/structure/window/reinforced/plasma/spawner/directional/south, /obj/structure/foamedmetal, /turf/open/floor/plating, /area/station/maintenance/floor1/port/aft) -"qpp" = ( -/obj/machinery/atmospherics/components/binary/valve/digital{ - name = "Waste Release" - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/engineering/atmos) "qpt" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -63007,6 +62493,14 @@ }, /turf/open/floor/engine, /area/station/maintenance/floor1/port/aft) +"qqf" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/pump, +/obj/structure/railing, +/turf/open/floor/iron/dark/textured_large, +/area/station/hallway/floor1/aft) "qqp" = ( /obj/structure/toilet/greyscale{ dir = 4 @@ -63033,14 +62527,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) -"qqI" = ( -/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, -/area/station/science/research/abandoned) "qqY" = ( /obj/effect/turf_decal/trimline/green/line{ dir = 4 @@ -63077,10 +62563,10 @@ }, /turf/open/floor/engine/co2, /area/station/engineering/atmos) -"qrw" = ( -/obj/structure/cable/multilayer/multiz, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor3/aft) +"qrx" = ( +/obj/machinery/hydroponics/constructable, +/turf/open/floor/circuit, +/area/station/science/cytology) "qry" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -63111,6 +62597,33 @@ dir = 8 }, /area/station/service/chapel) +"qrZ" = ( +/obj/structure/table, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = -7; + pixel_y = 12 + }, +/obj/effect/turf_decal/tile/green/full, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = -7; + pixel_y = 8 + }, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = -7; + pixel_y = 4 + }, +/obj/item/storage/box/lights/mixed{ + pixel_x = 6; + pixel_y = 10 + }, +/obj/item/storage/box/lights/mixed{ + pixel_x = 6; + pixel_y = 8 + }, +/obj/item/reagent_containers/spray/cleaner, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/service/janitor) "qse" = ( /obj/structure/closet/secure_closet/personal, /turf/open/floor/iron/dark, @@ -63186,19 +62699,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/abandoned) -"qsN" = ( -/obj/effect/turf_decal/bot, -/obj/structure/rack, -/obj/item/gun/energy/e_gun, -/obj/item/gun/energy/e_gun{ - pixel_y = 3 - }, -/obj/item/gun/energy/e_gun{ - pixel_y = 6 - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "qsP" = ( /obj/effect/turf_decal/tile/blue, /obj/machinery/status_display/ai/directional/east, @@ -63213,16 +62713,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured_large, /area/station/medical/abandoned) -"qsS" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/cold/no_nightlight/directional/east, -/obj/machinery/duct, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/station/hallway/floor3/fore) "qtf" = ( /obj/effect/turf_decal/siding/thinplating_new, /obj/machinery/door/airlock/external, @@ -63233,11 +62723,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) -"qth" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/machinery/duct, -/turf/open/floor/iron/chapel, -/area/station/service/chapel) "qtj" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/spawner/random/structure/crate_abandoned, @@ -63251,13 +62736,16 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port) -"qtt" = ( -/obj/machinery/camera/autoname/directional/south, -/obj/structure/railing/corner{ +"qtp" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/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/smooth, -/area/station/hallway/floor3/fore) +/turf/open/floor/iron, +/area/station/science/genetics) "qty" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -63294,6 +62782,21 @@ /obj/item/storage/pill_bottle/mining, /turf/open/floor/iron/white, /area/station/command/heads_quarters/captain/private) +"qtL" = ( +/obj/structure/sign/directions/evac/directional/north{ + dir = 2; + pixel_y = 40 + }, +/obj/structure/sign/directions/engineering/directional/north{ + dir = 2 + }, +/obj/structure/sign/directions/supply/directional/north{ + dir = 2; + pixel_y = 24 + }, +/obj/structure/railing/corner, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor2/fore) "qtM" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -63318,24 +62821,10 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) -"qtR" = ( -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/machinery/light/broken/directional/south, -/obj/machinery/hydroponics/constructable{ - anchored = 0 - }, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden/abandoned) "qtS" = ( /obj/effect/turf_decal/tile/red/half, /turf/open/floor/iron/dark, /area/station/security/eva) -"qtU" = ( -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/multiz/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/multiz/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor3/fore) "qtV" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -63344,15 +62833,6 @@ dir = 1 }, /area/station/hallway/floor3/fore) -"qtY" = ( -/obj/structure/cable, -/obj/machinery/power/smes/engineering{ - input_level = 60000; - output_level = 60000 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth_large, -/area/station/maintenance/floor2/starboard) "qun" = ( /turf/closed/wall/r_wall, /area/station/science/genetics) @@ -63402,15 +62882,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/psychology) -"qvb" = ( -/obj/effect/turf_decal/trimline/purple/line{ +"quW" = ( +/obj/machinery/button/ignition{ + id = "Xenobio"; + pixel_x = -4; + pixel_y = 24 + }, +/obj/machinery/button/door/directional/north{ + id = "Xenolab"; + name = "Test Chamber Blast Doors"; + pixel_x = 6; + req_access = list("xenobiology") + }, +/obj/effect/turf_decal/stripes{ 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/white, -/area/station/science/xenobiology/hallway) +/turf/open/floor/iron/dark, +/area/station/science/cytology) "qvc" = ( /obj/structure/chair/stool/bar/directional/north, /obj/item/stack/arcadeticket, @@ -63437,6 +62925,18 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard) +"qvl" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) "qvn" = ( /obj/structure/railing{ dir = 4 @@ -63448,16 +62948,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"qvs" = ( -/obj/effect/turf_decal/trimline/white/arrow_cw{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/white/mid_joiner{ - dir = 8 - }, -/turf/open/floor/iron/smooth_large, -/area/station/hallway/secondary/entry) "qvv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -63512,13 +63002,6 @@ "qvN" = ( /turf/closed/wall/r_wall, /area/station/medical/treatment_center) -"qvO" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/machinery/iv_drip, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "qwc" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -63587,36 +63070,10 @@ dir = 8 }, /area/station/engineering/atmos/office) -"qwJ" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/hallway/floor4/fore) "qwK" = ( /obj/item/stack/cable_coil, /turf/open/floor/plating/airless, /area/station/solars/starboard/fore) -"qwM" = ( -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/structure/sign/poster/official/random/directional/west, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/item/pai_card, -/turf/open/floor/iron/checker, -/area/station/service/bar/atrium) -"qwR" = ( -/obj/effect/turf_decal/trimline/purple/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/machinery/light/cold/no_nightlight/directional/south, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "qwS" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -63639,6 +63096,9 @@ initial_gas_mix = "TEMP=2.7" }, /area/station/science/ordnance/bomb) +"qxh" = ( +/turf/closed/wall/r_wall, +/area/station/science/lower) "qxr" = ( /obj/machinery/door/firedoor/border_only{ dir = 1 @@ -63664,6 +63124,12 @@ dir = 6 }, /area/station/service/library/private) +"qxI" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "qxJ" = ( /obj/effect/turf_decal/siding/white{ dir = 10 @@ -63671,27 +63137,6 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/wood/tile, /area/station/science/xenobiology/hallway) -"qxO" = ( -/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/effect/turf_decal/tile/red/diagonal_edge, -/obj/machinery/requests_console/directional/east{ - department = "Security"; - name = "Security Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/iron/dark/textured_large, -/area/station/security/checkpoint/escape) "qxQ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/old, @@ -63709,15 +63154,6 @@ name = "boxing ring" }, /area/station/commons/fitness) -"qxV" = ( -/obj/effect/landmark/start/prisoner, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/structure/sign/poster/official/random/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/wood/large, -/area/station/security/prison/safe) "qxW" = ( /obj/structure/railing{ dir = 4 @@ -63734,15 +63170,6 @@ /obj/machinery/computer/crew, /turf/open/floor/iron/white, /area/station/security/medical) -"qyi" = ( -/obj/structure/railing, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light/red/dim/directional/north, -/obj/machinery/door/firedoor/border_only, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor4/port/fore) "qyk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -63802,11 +63229,17 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"qyH" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ - dir = 4 +"qyG" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners{ + dir = 1 }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) +"qyH" = ( /obj/machinery/atmospherics/components/binary/pump/off/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) "qyJ" = ( @@ -63828,6 +63261,14 @@ }, /turf/open/floor/iron/dark/corner, /area/station/security/prison) +"qyP" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/closet/secure_closet/quartermaster, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/carpet/orange, +/area/station/command/heads_quarters/qm) "qza" = ( /obj/structure/closet/emcloset, /turf/open/floor/pod/dark, @@ -63851,11 +63292,23 @@ }, /turf/open/floor/plating, /area/station/construction) +"qzh" = ( +/obj/structure/table/wood, +/obj/machinery/light/small/directional/south, +/turf/open/floor/bamboo/tatami/black, +/area/station/commons/storage/art) "qzm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/smooth_corner, /area/station/cargo/miningdock) +"qzo" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white, +/area/station/science/cytology) "qzx" = ( /obj/structure/bookcase/random/fiction, /turf/open/floor/carpet/royalblack, @@ -63895,13 +63348,6 @@ dir = 9 }, /area/station/security/prison/garden) -"qzR" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/storage) "qzX" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/effect/turf_decal/stripes/line{ @@ -63913,6 +63359,13 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/starboard) +"qAa" = ( +/obj/machinery/door/window/left/directional/north{ + name = "Pen 2"; + req_access = list("xenobiology") + }, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "qAd" = ( /obj/structure/railing{ dir = 4 @@ -64067,36 +63520,11 @@ "qBx" = ( /turf/closed/wall, /area/station/service/hydroponics) -"qBy" = ( -/obj/effect/turf_decal/trimline/white/arrow_ccw, -/obj/effect/turf_decal/trimline/red/warning, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/secondary/entry) -"qBz" = ( -/obj/structure/table/wood, -/obj/item/paper_bin/carbon{ - pixel_x = 3; - pixel_y = 2 - }, -/obj/item/pen, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/station/medical/psychology) "qBP" = ( /obj/effect/turf_decal/tile/green/half, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/side, /area/station/hallway/secondary/exit/escape_pod) -"qBR" = ( -/obj/effect/spawner/structure/window/reinforced/tinted, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) "qBW" = ( /obj/structure/table, /obj/item/ai_module/reset, @@ -64206,37 +63634,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/office) -"qCR" = ( -/obj/machinery/light/directional/east, -/obj/structure/sign/painting/library{ - pixel_x = -32 - }, -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/large, -/area/station/service/library/artgallery) -"qCW" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/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, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"qCY" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Auxillary Slime Pen" - }, -/obj/machinery/door/window/left/directional/south{ - name = "Pen 5"; - req_access = list("xenobiology") - }, -/turf/open/floor/grass, -/area/station/science/xenobiology) "qCZ" = ( /obj/structure/table/reinforced, /obj/item/surgical_drapes{ @@ -64259,17 +63656,6 @@ }, /turf/open/floor/engine/airless, /area/station/solars/port/aft) -"qDq" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) -"qDs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/textured_large, -/area/station/engineering/engine_smes) "qDt" = ( /obj/structure/chair/sofa/bench/left{ dir = 8 @@ -64343,35 +63729,22 @@ /obj/effect/mapping_helpers/airlock/access/any/engineering/construction, /turf/open/floor/iron, /area/station/engineering/lobby) -"qDR" = ( -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 - }, -/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, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/robotics/lab) "qDS" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/openspace, /area/station/maintenance/floor2/port/aft) -"qDV" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/stripes/corner{ +"qEb" = ( +/obj/effect/turf_decal/siding/white{ dir = 1 }, -/turf/open/floor/iron, -/area/station/cargo/storage) +/obj/effect/turf_decal/trimline/purple/line, +/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/cytology) "qEe" = ( /obj/structure/table, /obj/effect/spawner/random/food_or_drink/donkpockets, @@ -64398,6 +63771,21 @@ dir = 10 }, /area/station/security/courtroom) +"qEw" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ + dir = 4 + }, +/turf/open/floor/engine/airless, +/area/station/engineering/supermatter/waste) +"qEy" = ( +/obj/effect/turf_decal/trimline/purple/warning{ + dir = 9 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor2/starboard) "qEA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -64407,9 +63795,6 @@ }, /area/station/security/checkpoint) "qEB" = ( -/obj/structure/railing/corner{ - dir = 8 - }, /obj/effect/turf_decal/trimline/green/corner{ dir = 8 }, @@ -64419,6 +63804,7 @@ /obj/machinery/door/firedoor/border_only{ dir = 4 }, +/obj/structure/railing/corner/end, /turf/open/floor/iron/dark, /area/station/hallway/floor3/aft) "qEE" = ( @@ -64426,6 +63812,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/floor2/starboard/aft) +"qEG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/aisat_interior) "qEH" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/barricade/wooden{ @@ -64534,14 +63925,11 @@ /obj/effect/mapping_helpers/airlock/access/any/medical/general, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) -"qFW" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 5 - }, -/obj/machinery/computer/monitor, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +"qFU" = ( +/obj/structure/closet/secure_closet/security, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/security/checkpoint/second) "qFX" = ( /obj/structure/cable, /obj/structure/firelock_frame/heavy, @@ -64555,9 +63943,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/machinery/light/cold/no_nightlight/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, /turf/open/floor/iron/dark, /area/station/medical/virology) "qGb" = ( @@ -64577,19 +63962,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) -"qGi" = ( -/obj/effect/turf_decal/trimline/blue/line, -/obj/effect/turf_decal/trimline/blue/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/public/glass{ - name = "Public Airlock" - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/aft) "qGk" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/green/half/contrasted{ @@ -64619,6 +63991,7 @@ /obj/machinery/recharger, /obj/effect/turf_decal/tile/purple/fourcorners, /obj/item/multitool, +/obj/machinery/digital_clock/directional/south, /turf/open/floor/iron/dark, /area/station/command/bridge) "qGV" = ( @@ -64629,6 +64002,17 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor2/aft) +"qHf" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/green/line, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/maintenance/floor1/port/aft) "qHi" = ( /obj/structure/ladder, /turf/open/floor/pod/dark, @@ -64674,14 +64058,6 @@ dir = 8 }, /area/station/medical/chemistry) -"qHK" = ( -/obj/structure/closet/secure_closet/freezer/kitchen{ - req_access = list("bar") - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/checker, -/area/station/service/bar) "qHR" = ( /obj/machinery/smartfridge, /obj/machinery/door/firedoor, @@ -64690,10 +64066,6 @@ "qHW" = ( /turf/closed/wall/r_wall, /area/station/medical/pharmacy) -"qIc" = ( -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) "qIf" = ( /obj/structure/chair/office{ dir = 1 @@ -64713,30 +64085,19 @@ /turf/open/floor/iron/dark/textured, /area/station/command/heads_quarters/ce) "qIv" = ( -/obj/machinery/door/window/left/directional/south{ - name = "Robotics Lab"; - req_access = list("robotics") +/obj/effect/turf_decal/trimline/purple/warning, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor3/starboard) +"qIz" = ( +/obj/effect/turf_decal/trimline/yellow/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/stairs{ - dir = 1 +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 4 }, -/area/station/science/robotics/mechbay) -"qID" = ( /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/holopad, -/turf/open/floor/iron/smooth_half, -/area/station/maintenance/radshelter/sci) -"qII" = ( -/obj/effect/turf_decal/trimline/blue, -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/light/cold/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/hallway/floor1/fore) "qIM" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64744,12 +64105,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/fore) -"qIS" = ( -/obj/structure/table/wood, -/obj/item/radio/intercom/directional/south, -/obj/effect/spawner/random/entertainment/lighter, -/turf/open/floor/wood, -/area/station/hallway/floor3/fore) "qIT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64759,18 +64114,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/engineering/lobby) -"qIU" = ( -/obj/effect/turf_decal/trimline/green/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/green/line{ - 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/dark, -/area/station/hallway/floor3/fore) "qIY" = ( /obj/structure/closet/secure_closet/freezer/meat{ req_access = list("bar") @@ -64779,15 +64122,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron/checker, /area/station/service/bar) -"qJa" = ( -/obj/structure/closet{ - name = "janitorial supplies" - }, -/obj/item/pushbroom, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "qJj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -64795,27 +64129,13 @@ /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/port/aft) -"qJk" = ( -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 4 - }, -/obj/structure/disposalpipe/junction/flip{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) -"qJr" = ( -/obj/structure/table/reinforced/rglass, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 4 +"qJq" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 }, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/dark, -/area/station/commons/dorms/room3) +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron, +/area/station/service/chapel) "qJA" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -64823,6 +64143,14 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port/fore) +"qJD" = ( +/obj/effect/turf_decal/trimline/yellow/line, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/structure/railing/corner/end/flip, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/aft) "qJT" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -64865,6 +64193,15 @@ /obj/effect/spawner/random/mod/maint, /turf/open/floor/wood, /area/station/maintenance/floor3/starboard/aft) +"qKI" = ( +/obj/item/stack/sheet/iron, +/obj/effect/spawner/random/structure/furniture_parts, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/floor2/starboard/aft) +"qKN" = ( +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/floor3/fore) "qKR" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64872,6 +64209,9 @@ /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard) +"qLb" = ( +/turf/open/floor/plating, +/area/station/engineering/supermatter) "qLg" = ( /obj/structure/flora/bush/sparsegrass/style_random, /obj/item/radio/intercom/directional/south, @@ -64896,12 +64236,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor1/starboard/fore) -"qLN" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/red/dim/directional/east, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port) "qLP" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, @@ -64964,10 +64298,26 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos/pumproom) +"qNh" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 10 + }, +/obj/machinery/status_display/ai/directional/east, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/hallway/floor1/aft) "qNu" = ( /obj/structure/displaycase/trophy, /turf/open/floor/carpet/royalblack, /area/station/service/library) +"qNw" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard) "qNx" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -64988,6 +64338,13 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/carpet/red, /area/station/commons/dorms/room1) +"qNG" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/modular_computer/preset/civilian, +/obj/machinery/airalarm/directional/west, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/science/genetics) "qNK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -65012,6 +64369,16 @@ }, /turf/open/floor/carpet/red, /area/station/service/theater) +"qNY" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/obj/machinery/newscaster/directional/east, +/obj/machinery/modular_computer/preset/civilian{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "qOf" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/structure/cable, @@ -65054,6 +64421,7 @@ dir = 4 }, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/storage) "qOs" = ( @@ -65068,6 +64436,14 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) +"qOH" = ( +/obj/machinery/status_display/ai/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor2/aft) "qOJ" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -65102,19 +64478,6 @@ /obj/machinery/light/red/dim/directional/south, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard) -"qOS" = ( -/obj/effect/turf_decal/trimline/red/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/red/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/junction{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/fore) "qOV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -65125,12 +64488,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/starboard/aft) -"qPb" = ( -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/multiz/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/multiz/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor3/aft) "qPi" = ( /obj/effect/turf_decal/siding/wood{ dir = 9 @@ -65244,10 +64601,6 @@ /obj/structure/table, /turf/open/floor/iron/white, /area/station/security/prison/safe) -"qQa" = ( -/obj/machinery/light/blacklight/directional/west, -/turf/open/floor/light/colour_cycle/dancefloor_a, -/area/station/maintenance/floor2/port/fore) "qQb" = ( /obj/structure/mirror/directional/west, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -65272,17 +64625,6 @@ /obj/effect/spawner/random/medical/surgery_tool, /turf/open/floor/iron/white, /area/station/maintenance/floor3/starboard/aft) -"qQp" = ( -/obj/effect/turf_decal/trimline/purple/arrow_ccw, -/obj/machinery/door/firedoor/heavy, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/trimline/green/arrow_cw{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron/textured_large, -/area/station/cargo/miningdock) "qQr" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -65290,11 +64632,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/iron, /area/station/hallway/secondary/exit/escape_pod) -"qQs" = ( -/obj/machinery/light/directional/east, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) "qQt" = ( /obj/structure/railing{ dir = 9 @@ -65331,14 +64668,11 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/wood/parquet, /area/station/commons/dorms/room2) -"qQZ" = ( -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/ai_monitored/command/storage/eva) +"qQS" = ( +/obj/effect/landmark/start/cyborg, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat) "qRi" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor/heavy, @@ -65415,9 +64749,11 @@ /turf/open/floor/iron/dark/side, /area/station/hallway/floor4/fore) "qRS" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/circuit/telecomms, -/area/station/tcommsat/server/upper) +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/space/openspace, +/area/space) "qRW" = ( /obj/structure/disposalpipe/junction{ dir = 8 @@ -65425,11 +64761,6 @@ /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/iron/dark/side, /area/station/hallway/floor1/aft) -"qSa" = ( -/obj/item/broken_bottle, -/obj/machinery/light/blacklight/directional/west, -/turf/open/floor/carpet/neon/simple/pink/nodots, -/area/station/maintenance/floor2/port/fore) "qSf" = ( /obj/structure/musician/piano/minimoog, /turf/open/floor/wood/tile, @@ -65448,6 +64779,16 @@ /obj/structure/ladder, /turf/open/floor/catwalk_floor, /area/station/hallway/floor2/aft) +"qSv" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/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) "qSz" = ( /obj/effect/turf_decal/trimline/purple/filled/corner, /obj/machinery/camera/directional/south{ @@ -65459,30 +64800,24 @@ /turf/open/floor/iron/white, /area/station/science/lobby) "qSD" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, +/obj/item/kirbyplants/organic/plant21, /turf/open/floor/wood/parquet, /area/station/service/lawoffice) "qSJ" = ( /obj/structure/sign/poster/official/random/directional/east, /turf/open/floor/iron/checker, /area/station/commons/vacant_room/commissary) +"qSR" = ( +/obj/structure/displaycase/trophy, +/obj/machinery/light/small/directional/north, +/turf/open/floor/carpet/royalblack, +/area/station/service/library) "qSW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light/red/dim/directional/east, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/fore) -"qTd" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/obj/structure/closet/bombcloset/security, -/obj/structure/reagent_dispensers/wall/peppertank/directional/east, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "qTg" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/item/radio/intercom/directional/east, @@ -65504,6 +64839,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) +"qTw" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/white, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "qTA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -65511,14 +64851,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/prison/visit) -"qTD" = ( -/obj/machinery/camera/autoname/directional/west, -/obj/item/radio/intercom/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/hallway/floor3/fore) "qTF" = ( /obj/structure/disposalpipe/segment, /obj/item/radio/intercom/directional/west, @@ -65531,11 +64863,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/medical/abandoned) -"qTI" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/turf/open/floor/wood/parquet, -/area/station/commons/dorms/room2) "qTK" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -65635,13 +64962,17 @@ }, /turf/open/floor/wood/large, /area/station/medical/virology/isolation) -"qVx" = ( -/obj/machinery/newscaster/directional/west, -/obj/structure/chair/comfy/shuttle{ - dir = 4 +"qVO" = ( +/obj/structure/railing{ + dir = 1 }, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/maintenance/radshelter/sci) +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "qVV" = ( /obj/machinery/mecha_part_fabricator, /turf/open/floor/iron/dark, @@ -65660,16 +64991,9 @@ /area/station/hallway/floor1/aft) "qWe" = ( /obj/machinery/vending/wardrobe/chem_wardrobe, +/obj/machinery/airalarm/directional/north, /turf/open/floor/iron/textured_large, /area/station/medical/chemistry) -"qWi" = ( -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 9 - }, -/area/station/ai_monitored/turret_protected/ai) "qWm" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/space_heater, @@ -65695,6 +65019,20 @@ /obj/effect/spawner/random/structure/table_or_rack, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard) +"qWv" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 1 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Science Foyer - #1" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/landmark/navigate_destination/research, +/obj/machinery/light/cold/no_nightlight/directional/south, +/turf/open/floor/iron/white, +/area/station/science/lobby) "qWJ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -65704,6 +65042,12 @@ /obj/structure/lattice, /turf/open/openspace, /area/station/maintenance/floor2/port/aft) +"qWQ" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/duct, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/checker, +/area/station/service/bar) "qWR" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -65724,13 +65068,21 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plating, /area/station/maintenance/floor1/port/fore) -"qXg" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/wood/large, -/area/station/command/heads_quarters/hop) +"qXi" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/corner, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/rd) +"qXj" = ( +/obj/structure/railing{ + dir = 10 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/station/science/cytology) "qXk" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 4 @@ -65801,25 +65153,34 @@ }, /turf/open/floor/carpet/royalblack, /area/station/service/theater) +"qXv" = ( +/obj/structure/ladder, +/obj/machinery/light/small/directional/north, +/turf/open/floor/catwalk_floor, +/area/station/hallway/floor3/fore) "qXw" = ( /obj/machinery/biogenerator, /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/prison/garden) -"qXx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) "qXy" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/layer3, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat) +"qXE" = ( +/obj/structure/table, +/obj/item/plate, +/obj/item/knife/plastic{ + pixel_x = 16 + }, +/obj/item/food/donkpocket/warm/berry{ + pixel_y = 7 + }, +/turf/open/floor/iron/kitchen, +/area/station/command/heads_quarters/rd) "qXQ" = ( /mob/living/carbon/human/species/monkey{ name = "Banana" @@ -65827,6 +65188,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/grass, /area/station/medical/virology) +"qXW" = ( +/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/red/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/brig) "qXX" = ( /obj/structure/railing/corner, /obj/effect/turf_decal/trimline/blue/filled/corner, @@ -65863,12 +65234,33 @@ }, /turf/open/floor/plating, /area/station/security/eva) +"qYJ" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 5 + }, +/obj/machinery/status_display/ai/directional/west, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/hallway/floor2/fore) +"qYM" = ( +/obj/structure/dresser, +/obj/structure/sign/poster/random/directional/north, +/turf/open/floor/carpet/royalblue, +/area/station/commons/dorms/room4) "qYQ" = ( /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/side, /area/station/hallway/floor3/fore) +"qYZ" = ( +/obj/machinery/atmospherics/components/binary/valve/digital{ + name = "Waste Release" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "qZc" = ( /obj/effect/turf_decal/trimline/yellow/line{ dir = 8 @@ -65903,6 +65295,15 @@ /obj/structure/cable, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port/fore) +"qZA" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/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/lower) "qZF" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, @@ -65942,10 +65343,6 @@ "rac" = ( /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/cmo) -"rad" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron/white, -/area/station/science/cytology) "rag" = ( /obj/machinery/atmospherics/pipe/layer_manifold/purple/visible, /obj/machinery/camera{ @@ -65992,6 +65389,18 @@ name = "lab floor" }, /area/station/science/robotics/lab) +"raE" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hos) +"raN" = ( +/obj/structure/sign/poster/official/random/directional/south, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/security/checkpoint) "raO" = ( /obj/machinery/vending/cigarette, /obj/structure/sign/departments/security/directional/east, @@ -66049,6 +65458,13 @@ "rbr" = ( /turf/closed/wall/r_wall, /area/station/security/execution/transfer) +"rbs" = ( +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 8 + }, +/obj/structure/closet/emcloset, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "rbx" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -66104,12 +65520,28 @@ }, /turf/open/floor/iron/dark, /area/station/commons/storage/tools) +"rcc" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/plating, +/area/station/tcommsat/computer) "rcd" = ( /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, /area/station/engineering/lobby) +"rce" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/starboard/fore) "rci" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -66152,6 +65584,14 @@ "rcO" = ( /turf/open/floor/plating/airless, /area/space/nearstation) +"rcT" = ( +/obj/effect/turf_decal/trimline/white/arrow_ccw{ + dir = 1 + }, +/turf/open/floor/iron/dark/side{ + dir = 5 + }, +/area/station/hallway/secondary/entry) "rcV" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -66196,11 +65636,6 @@ }, /turf/open/floor/glass/reinforced, /area/station/service/library) -"rdv" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/grass, -/area/station/science/xenobiology) "rdx" = ( /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible{ dir = 4 @@ -66256,17 +65691,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) -"rdK" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/wood, -/area/station/service/bar/atrium) -"rdV" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/floor2/aft) "rdW" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -66276,23 +65700,6 @@ }, /turf/open/floor/glass/reinforced, /area/station/service/library) -"rdY" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/structure/disposalpipe/junction{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/hallway/secondary/exit/departure_lounge) -"rdZ" = ( -/obj/structure/cable, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/hallway/secondary/exit) "rec" = ( /obj/structure/cable, /turf/open/floor/iron/dark/side{ @@ -66335,11 +65742,6 @@ }, /turf/open/floor/mineral/silver, /area/station/service/chapel/office) -"ren" = ( -/obj/effect/turf_decal/tile/green/opposingcorners, -/obj/machinery/light/cold/no_nightlight/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/virology) "rep" = ( /obj/structure/chair/sofa/corp{ dir = 8 @@ -66366,14 +65768,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/hallway/floor4/aft) -"reC" = ( -/obj/structure/disposalpipe/junction/flip{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/hallway/floor2/aft) "reD" = ( /obj/effect/spawner/random/structure/chair_maintenance{ dir = 8 @@ -66382,12 +65776,26 @@ /obj/structure/sign/poster/contraband/random/directional/east, /turf/open/floor/plating, /area/station/medical/abandoned) -"reK" = ( -/obj/machinery/light/directional/east, -/obj/structure/window/spawner/directional/south, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron/dark/textured, -/area/station/commons/fitness) +"reI" = ( +/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/item/radio/off, +/obj/effect/turf_decal/tile/red/diagonal_edge, +/obj/machinery/requests_console/directional/east{ + department = "Security"; + name = "Security Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/iron/dark/textured_large, +/area/station/security/checkpoint/escape) "reN" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66457,14 +65865,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard) -"rfR" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, -/area/station/service/library) "rfT" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/structure/cable, @@ -66544,6 +65944,13 @@ /obj/effect/mapping_helpers/airlock/access/any/service/kitchen, /turf/open/floor/iron/dark, /area/station/service/bar) +"rgM" = ( +/obj/structure/closet/boxinggloves, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/radio/intercom/directional/north, +/obj/machinery/duct, +/turf/open/floor/iron/dark/textured, +/area/station/commons/fitness) "rgR" = ( /obj/effect/turf_decal/tile/green/half{ dir = 8 @@ -66567,17 +65974,20 @@ /obj/structure/closet/secure_closet/bar, /turf/open/floor/iron/checker, /area/station/service/bar) +"rho" = ( +/obj/structure/table/reinforced, +/obj/item/book/manual/wiki/chemistry, +/obj/item/hand_labeler, +/obj/effect/turf_decal/siding/wideplating, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/dark/textured, +/area/station/medical/pharmacy) "rhs" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/effect/landmark/start/cargo_technician, /turf/open/floor/iron, /area/station/cargo/warehouse) -"rhu" = ( -/obj/machinery/light/directional/east, -/obj/structure/flora/bush/flowers_yw/style_random, -/turf/open/floor/grass, -/area/station/service/hydroponics) "rhw" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/white/line, @@ -66588,6 +65998,10 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, /area/station/cargo/lobby) +"rhC" = ( +/obj/machinery/light/cold/no_nightlight/directional/east, +/turf/open/floor/engine, +/area/station/command/heads_quarters/rd) "rhJ" = ( /obj/structure/railing{ dir = 4 @@ -66637,12 +66051,10 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/miningdock) -"rio" = ( -/obj/structure/marker_beacon/burgundy, -/obj/effect/decal/cleanable/dirt, -/obj/structure/grille/broken, +"rip" = ( +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/pod/light, -/area/station/maintenance/floor4/starboard/aft) +/area/station/maintenance/floor3/starboard/fore) "riy" = ( /obj/effect/turf_decal/trimline/yellow/warning, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66695,10 +66107,13 @@ dir = 4 }, /area/station/maintenance/floor1/starboard/aft) +"rjm" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/light_switch/directional/south, +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/science/genetics) "rjp" = ( -/obj/structure/railing/corner{ - dir = 8 - }, /obj/effect/turf_decal/trimline/yellow/corner{ dir = 8 }, @@ -66708,6 +66123,7 @@ /obj/machinery/door/firedoor/border_only{ dir = 1 }, +/obj/structure/railing/corner/end, /turf/open/floor/iron/dark, /area/station/hallway/floor1/aft) "rjD" = ( @@ -66736,7 +66152,7 @@ /turf/open/floor/iron/dark, /area/station/medical/psychology) "rku" = ( -/obj/machinery/atmospherics/components/unary/cryo_cell{ +/obj/machinery/cryo_cell{ dir = 4 }, /turf/open/floor/iron/dark/textured, @@ -66745,6 +66161,8 @@ /obj/structure/disposalpipe/trunk/multiz{ dir = 1 }, +/obj/structure/railing/corner/end, +/obj/structure/railing/corner/end/flip, /turf/open/floor/plating, /area/station/maintenance/floor2/port/fore) "rkM" = ( @@ -66806,9 +66224,6 @@ dir = 9 }, /area/station/hallway/floor4/fore) -"rlI" = ( -/turf/open/floor/iron/dark/textured, -/area/station/security/checkpoint/second) "rlJ" = ( /obj/structure/chair/comfy/shuttle{ dir = 4 @@ -66818,9 +66233,20 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) -"rlN" = ( -/turf/open/floor/circuit/telecomms, -/area/station/tcommsat/server/upper) +"rlP" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/line, +/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 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/fore) "rlX" = ( /obj/structure/railing/corner{ dir = 4 @@ -66836,11 +66262,6 @@ /area/station/medical/paramedic) "rmm" = ( /obj/structure/table, -/obj/item/storage/box/ids{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/silver_ids, /obj/machinery/camera/autoname/directional/north, /obj/machinery/requests_console/directional/north{ department = "Head of Personnel's Desk"; @@ -66849,13 +66270,28 @@ /obj/effect/mapping_helpers/requests_console/announcement, /obj/effect/mapping_helpers/requests_console/information, /obj/effect/mapping_helpers/requests_console/assistance, +/obj/item/hand_labeler{ + pixel_y = 3 + }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) -"rmu" = ( -/obj/machinery/airalarm/directional/west, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/service/kitchen/diner) +"rms" = ( +/obj/effect/spawner/random/structure/crate, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) +"rmz" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 8 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/textured_large, +/area/station/cargo/storage) +"rmD" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/closet/secure_closet/chemical, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) "rmF" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark/side{ @@ -66874,6 +66310,17 @@ dir = 1 }, /area/station/hallway/secondary/exit/escape_pod) +"rmZ" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/ai_monitored/command/storage/eva) "rnd" = ( /obj/effect/turf_decal/trimline/white/warning{ dir = 1 @@ -66905,10 +66352,6 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) -"rnu" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall, -/area/station/security/prison) "rnv" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 1 @@ -66981,13 +66424,23 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/hallway/floor2/aft) +"rom" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/closet/radiation, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "roo" = ( /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/floor3/aft) "rov" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/r_wall, -/area/station/maintenance/floor4/starboard) +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace, +/area/station/maintenance/floor3/starboard) "roy" = ( /obj/item/toy/plush/beeplushie{ desc = "Maybe hugging this will make you feel better about yourself."; @@ -67001,16 +66454,10 @@ /obj/structure/closet/firecloset, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) -"roJ" = ( -/turf/open/openspace, -/area/station/medical/pharmacy) -"roP" = ( -/obj/structure/chair/sofa/right{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/wood, -/area/station/medical/psychology) +"roZ" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/commons/locker) "rpa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -67045,8 +66492,8 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/structure/cable, /turf/open/floor/plating, /area/station/engineering/supermatter/room) "rpA" = ( @@ -67088,12 +66535,6 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/iron, /area/station/engineering/gravity_generator) -"rpY" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/closet/l3closet/scientist, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "rqa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -67182,20 +66623,22 @@ dir = 10 }, /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/cargo/storage) -"rqC" = ( -/obj/effect/turf_decal/trimline/white/arrow_cw{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 +"rqK" = ( +/obj/effect/turf_decal/stripes/full, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/railing{ + dir = 6 }, -/obj/effect/turf_decal/trimline/white/mid_joiner{ - dir = 8 +/obj/machinery/door/poddoor/preopen{ + id = "Xenolab"; + name = "Test Chamber Blast Door" }, -/turf/open/floor/iron/smooth_large, -/area/station/hallway/secondary/entry) +/turf/open/floor/engine, +/area/station/science/cytology) "rqM" = ( /obj/structure/chair/sofa/bench{ dir = 8 @@ -67258,6 +66701,10 @@ "rrR" = ( /turf/open/floor/iron, /area/station/commons/locker) +"rrW" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "rrX" = ( /turf/open/floor/iron/dark, /area/station/command/bridge) @@ -67298,12 +66745,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/office) -"rsr" = ( -/obj/machinery/light/directional/south, -/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/dorms/apartment1) "rsz" = ( /obj/structure/chair/wood{ dir = 1 @@ -67312,17 +66753,21 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet/green, /area/station/service/abandoned_gambling_den) -"rsI" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Security - Cell" - }, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "rsL" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard/aft) +"rsT" = ( +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer4{ + dir = 4 + }, +/obj/item/paper{ + default_raw_text = "Once you have gas coming in from the SM to the containment chamber, you'll need to cool it.-
To set up the waste gas cooling loop, follow these steps:
  1. Wrench in the plasma can.
2. Turn on the waste Cooling Gas pump and set the thermomachines to cold.
3. Set up the scrubbers in the chamber using the air alarm.
4. Turn on the filter to the canisters or replace it.
5. Turn on the Supermatter Waste To Port pump.

Once everything on that list is complete, make sure that gas isn't building up inside the chamber or the pipes and you are done."; + name = "HOW TO SET UP THE SM WASTE" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/pumproom) "rsW" = ( /turf/open/floor/carpet/blue, /area/station/maintenance/floor3/port/aft) @@ -67336,12 +66781,6 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) -"rta" = ( -/obj/effect/turf_decal/tile/blue/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/command/teleporter) "rtb" = ( /obj/machinery/conveyor{ id = "coffinbelt" @@ -67353,12 +66792,20 @@ /obj/effect/spawner/structure/window/hollow/end, /turf/open/floor/plating, /area/station/maintenance/floor3/port/aft) -"rth" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 8 +"rti" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 }, -/turf/open/floor/iron/textured_large, -/area/station/cargo/storage) +/obj/effect/turf_decal/trimline/red/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/holopad, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/fore) "rtl" = ( /turf/closed/wall/r_wall, /area/station/science/xenobiology/hallway) @@ -67385,15 +66832,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) -"rtG" = ( -/obj/item/radio/intercom/directional/south, -/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, -/area/station/science/research/abandoned) "rtH" = ( /obj/machinery/vending/boozeomat/all_access, /obj/effect/decal/cleanable/dirt, @@ -67440,28 +66878,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/service/hydroponics) -"ruS" = ( -/obj/effect/turf_decal/trimline/green/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/green/filled/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/east, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"ruV" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/duct, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/aft) "rve" = ( /obj/effect/spawner/structure/window/hollow/reinforced/end{ dir = 8 @@ -67470,6 +66886,7 @@ /area/station/cargo/storage) "rvh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/floor2/starboard/aft) "rvD" = ( @@ -67480,11 +66897,6 @@ }, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/cmo) -"rvE" = ( -/obj/machinery/telecomms/relay/preset/station, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/circuit/telecomms, -/area/station/tcommsat/server/upper) "rvL" = ( /turf/closed/wall/r_wall, /area/station/maintenance/floor2/port/fore) @@ -67494,6 +66906,14 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/floor4/fore) +"rwc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/moisture_trap, +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/station/maintenance/floor2/starboard) "rwh" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/wood, @@ -67566,15 +66986,9 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) -"rwP" = ( -/obj/effect/turf_decal/siding/white/corner{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "rwY" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 1 }, /turf/open/floor/pod/light, @@ -67584,6 +66998,23 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) +"rxd" = ( +/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, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/wood/parquet, +/area/station/service/lawoffice) "rxe" = ( /obj/effect/decal/cleanable/blood/old, /obj/structure/chair{ @@ -67633,14 +67064,6 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/surgery/aft) -"rxF" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) "rxJ" = ( /obj/structure/chair/pew/left{ dir = 8 @@ -67720,6 +67143,12 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor4/fore) +"ryK" = ( +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor3/fore) "ryQ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/hydroponics/constructable, @@ -67744,17 +67173,16 @@ "rze" = ( /turf/closed/wall, /area/station/cargo/lobby) -"rzs" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/trimline/yellow/corner, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 1 +"rzg" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark/side{ +/obj/machinery/computer/records/security{ dir = 1 }, -/area/station/hallway/floor1/fore) +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "rzu" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -67794,35 +67222,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/large, /area/station/command/heads_quarters/rd) -"rzY" = ( -/obj/effect/turf_decal/trimline/red/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/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/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/aft) "rAe" = ( /obj/machinery/firealarm/directional/north, /turf/open/floor/wood, /area/station/command/meeting_room) -"rAl" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 6 +"rAm" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ + dir = 5 }, -/obj/machinery/light/cold/directional/north, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ + dir = 5 }, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/break_room) +/turf/open/floor/engine/airless, +/area/station/engineering/supermatter/waste) "rAu" = ( /obj/structure/cable, /obj/machinery/computer/operating{ @@ -67848,18 +67260,17 @@ /obj/effect/turf_decal/trimline/red/filled, /turf/open/floor/iron/dark, /area/station/security/checkpoint/third) -"rAW" = ( -/obj/effect/turf_decal/trimline/green/line, -/obj/effect/turf_decal/trimline/green/line{ - dir = 1 +"rAP" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/heavy, +/obj/machinery/light/directional/north, /turf/open/floor/iron/dark, -/area/station/hallway/floor3/fore) +/area/station/ai_monitored/security/armory) "rBm" = ( /obj/machinery/camera/autoname/directional/east, /turf/open/floor/catwalk_floor, @@ -67888,6 +67299,13 @@ /obj/structure/table/wood/fancy/red, /turf/open/floor/carpet/royalblack, /area/station/service/kitchen/diner) +"rBF" = ( +/obj/structure/stairs/north, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "rBI" = ( /obj/machinery/door/airlock/science/glass{ name = "Laboratory B" @@ -67903,13 +67321,23 @@ /turf/open/floor/iron/white, /area/station/science/circuits) "rBK" = ( -/obj/structure/closet/secure_closet/medical2, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/surgery/fore) +/obj/machinery/atmospherics/pipe/smart/manifold4w/purple/visible, +/obj/effect/spawner/structure/window/reinforced/plasma, +/turf/open/floor/engine/air, +/area/station/engineering/supermatter/waste) "rBP" = ( /turf/closed/wall/r_wall, /area/station/engineering/lobby) +"rBT" = ( +/obj/effect/turf_decal/trimline/green/filled/arrow_cw{ + dir = 8 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/light/cold/no_nightlight/directional/west, +/turf/open/floor/iron/dark/textured, +/area/station/medical/virology/isolation) "rBU" = ( /obj/structure/rack, /obj/machinery/button/door/directional/south{ @@ -67939,6 +67367,12 @@ /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/iron/smooth, /area/station/construction) +"rCj" = ( +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/effect/turf_decal/bot, +/obj/structure/sign/warning/directional/south, +/turf/open/floor/iron/dark/textured, +/area/station/science/ordnance/storage) "rCk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/side{ @@ -68013,24 +67447,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/construction) -"rCU" = ( -/obj/effect/turf_decal/trimline/yellow/corner{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/obj/item/stack/sheet/iron/five{ - pixel_x = -6 - }, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/structure/frame/machine, -/obj/item/stack/sheet/glass{ - amount = 12 - }, -/obj/item/stack/cable_coil/five, -/turf/open/floor/iron/corner{ - dir = 4 - }, -/area/station/engineering/lobby) "rCW" = ( /obj/effect/turf_decal/tile/green/opposingcorners, /turf/open/floor/iron/white, @@ -68042,16 +67458,6 @@ dir = 8 }, /area/station/hallway/floor1/aft) -"rDi" = ( -/obj/effect/turf_decal/trimline/yellow/line, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 1 - }, -/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/dark, -/area/station/hallway/floor1/fore) "rDw" = ( /turf/open/floor/iron/dark/side{ dir = 4 @@ -68101,6 +67507,13 @@ "rDL" = ( /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"rDQ" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "rDR" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68117,11 +67530,6 @@ }, /turf/open/floor/plating, /area/station/security/brig) -"rEi" = ( -/obj/machinery/light/directional/east, -/obj/structure/flora/bush/sunny/style_random, -/turf/open/floor/grass, -/area/station/security/courtroom) "rEm" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=1-2"; @@ -68171,6 +67579,10 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/project) +"rFG" = ( +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/floor3/port/fore) "rFW" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/grille/broken, @@ -68185,6 +67597,13 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark/side, /area/station/security/brig) +"rGd" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/wood, +/area/station/service/bar/atrium) "rGe" = ( /obj/machinery/camera{ c_tag = "Engineering Foyer #3"; @@ -68207,6 +67626,12 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) +"rGv" = ( +/obj/structure/table/wood, +/obj/item/knife, +/obj/machinery/light/directional/east, +/turf/open/floor/wood/large, +/area/station/service/kitchen/kitchen_backroom) "rGC" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/structure/cable, @@ -68223,13 +67648,9 @@ /area/station/medical/abandoned) "rGF" = ( /obj/effect/turf_decal/bot, -/obj/structure/sign/poster/random/directional/north, +/obj/machinery/light/broken/directional/north, /turf/open/floor/iron/smooth, /area/station/cargo/warehouse) -"rGH" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/kitchen, -/area/station/command/heads_quarters/rd) "rGI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -68298,6 +67719,13 @@ /obj/machinery/light/directional/south, /turf/open/floor/wood/tile, /area/station/service/chapel/office) +"rHI" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "rHP" = ( /obj/structure/railing/corner{ dir = 1 @@ -68314,6 +67742,14 @@ }, /turf/open/floor/iron, /area/station/engineering/gravity_generator) +"rHY" = ( +/obj/structure/table, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/commons/dorms/room4) "rIa" = ( /obj/effect/turf_decal/tile/red, /obj/machinery/duct, @@ -68346,23 +67782,26 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/virology) -"rIs" = ( -/obj/effect/turf_decal/trimline/white/arrow_ccw, -/obj/effect/turf_decal/trimline/red/corner, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/iron/dark/side, -/area/station/hallway/secondary/entry) "rIt" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port) -"rIK" = ( -/obj/effect/spawner/random/vending/colavend, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/aft) +"rIy" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/cargo/storage) +"rIL" = ( +/obj/structure/rack, +/obj/effect/spawner/random/engineering/tool, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor1/fore) "rIS" = ( /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) @@ -68383,30 +67822,6 @@ /obj/effect/spawner/random/medical/memeorgans, /turf/open/floor/iron/kitchen, /area/station/service/kitchen/abandoned) -"rJp" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/table, -/obj/item/toy/cards/deck/wizoff{ - pixel_x = -4; - pixel_y = 5 - }, -/obj/machinery/light/cold/no_nightlight/directional/west, -/turf/open/floor/iron/dark, -/area/station/science/breakroom) -"rJr" = ( -/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, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/station/maintenance/floor2/starboard) "rJv" = ( /obj/structure/table/glass, /obj/item/storage/box/rxglasses, @@ -68416,6 +67831,13 @@ "rJy" = ( /turf/open/floor/pod, /area/station/cargo/miningdock) +"rJC" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/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/science/cytology) "rJF" = ( /turf/closed/wall, /area/station/security/prison/safe) @@ -68448,6 +67870,13 @@ }, /turf/open/floor/iron, /area/station/science/auxlab) +"rKc" = ( +/obj/structure/cable, +/obj/machinery/mining_weather_monitor/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/hallway/secondary/exit) "rKg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -68509,10 +67938,6 @@ "rKM" = ( /turf/open/floor/wood, /area/station/commons/vacant_room/office) -"rKN" = ( -/obj/machinery/camera/autoname/directional/south, -/turf/open/openspace, -/area/station/ai_monitored/turret_protected/aisat/service) "rKQ" = ( /obj/structure/railing, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68535,17 +67960,6 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) -"rLe" = ( -/obj/machinery/light/directional/south, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/stripes/end{ - dir = 1 - }, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/ordnance/testlab) "rLf" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 9 @@ -68565,6 +67979,12 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/engineering/atmos) +"rLB" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 6 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology/hallway) "rLE" = ( /obj/structure/rack, /obj/item/stack/sheet/iron/five, @@ -68632,6 +68052,24 @@ }, /turf/open/floor/plastic, /area/station/security/prison/shower) +"rMx" = ( +/obj/machinery/conveyor{ + id = "mailbelt" + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/textured_large, +/area/station/cargo/sorting) +"rMC" = ( +/obj/effect/turf_decal/siding/white/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "rMD" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/textured_large, @@ -68644,6 +68082,11 @@ dir = 5 }, /area/station/hallway/floor3/fore) +"rMR" = ( +/obj/structure/closet/l3closet/virology, +/obj/effect/turf_decal/tile/green/opposingcorners, +/turf/open/floor/iron/white, +/area/station/medical/virology) "rMX" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -68679,38 +68122,15 @@ /obj/machinery/status_display/ai/directional/north, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) -"rNm" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/engine{ - icon_state = "textured_dark" - }, -/area/station/maintenance/floor2/starboard/aft) "rNo" = ( /turf/closed/wall, /area/station/service/chapel) -"rNr" = ( -/obj/structure/table, -/obj/item/hfr_box/corner, -/obj/item/hfr_box/corner, -/obj/item/hfr_box/corner, -/obj/item/hfr_box/corner, -/obj/item/hfr_box/core, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/hfr_room) -"rNw" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/item/bedsheet/hop{ - dir = 4 +"rNG" = ( +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron/textured_corner{ + dir = 8 }, -/obj/machinery/light/directional/south, -/obj/effect/landmark/start/head_of_personnel, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) +/area/station/cargo/office) "rNL" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/red/dim/directional/north, @@ -68793,6 +68213,12 @@ "rOY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/table/reinforced, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/item/mod/module/plasma_stabilizer, +/obj/item/mod/module/signlang_radio, +/obj/item/mod/module/thermal_regulator, /turf/open/floor/iron/white/textured, /area/station/medical/storage) "rPi" = ( @@ -68815,15 +68241,6 @@ /obj/machinery/duct, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) -"rPB" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/obj/machinery/computer/security{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/first) "rPC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68876,6 +68293,24 @@ /obj/item/shard, /turf/open/floor/engine, /area/station/maintenance/floor1/port/aft) +"rQc" = ( +/obj/machinery/computer/camera_advanced/xenobio{ + dir = 4 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/circuit, +/area/station/science/xenobiology) +"rQd" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 9 + }, +/obj/item/kirbyplants/random, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white, +/area/station/science/server) "rQf" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -68903,13 +68338,25 @@ /turf/open/floor/iron, /area/station/hallway/floor3/aft) "rQx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor/border_only{ dir = 8 }, +/obj/machinery/atmospherics/components/binary/pump/on/supply/hidden/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/starboard/fore) +"rQG" = ( +/obj/machinery/chem_master{ + name = "CytoMaster 3000" + }, +/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/science/cytology) "rQV" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/aisat/hallway) @@ -68985,13 +68432,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/service/hydroponics) -"rSf" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/cold/directional/east, -/obj/item/reagent_containers/cup/beaker/large, -/obj/item/reagent_containers/dropper, -/turf/open/floor/iron/dark/textured, -/area/station/medical/pharmacy) +"rSc" = ( +/obj/effect/spawner/random/maintenance, +/obj/machinery/light/red/dim/directional/east, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/port) "rSk" = ( /obj/structure/rack, /obj/effect/spawner/random/techstorage/command_all, @@ -69002,19 +68447,6 @@ dir = 4 }, /area/station/engineering/storage/tech) -"rSp" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/landmark/start/station_engineer, -/obj/machinery/requests_console/directional/south{ - department = "Engineering"; - name = "Engineering Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/iron/dark, -/area/station/engineering/lobby) "rSu" = ( /obj/structure/railing/corner{ dir = 1 @@ -69035,6 +68467,9 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"rSD" = ( +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "rSJ" = ( /obj/structure/chair/plastic{ dir = 8 @@ -69093,6 +68528,12 @@ }, /turf/open/floor/iron/dark, /area/station/security/brig) +"rTg" = ( +/obj/item/paper_bin, +/obj/structure/table/wood/fancy/royalblack, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/carpet/neon/simple/white, +/area/station/commons/dorms/room3) "rTk" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -69132,6 +68573,22 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/plating, /area/station/maintenance/floor1/port/fore) +"rTB" = ( +/obj/effect/turf_decal/trimline/green/filled/line, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"rTE" = ( +/obj/machinery/camera/autoname/directional/west, +/obj/item/radio/intercom/directional/west, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/hallway/floor3/fore) "rTL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -69170,13 +68627,17 @@ }, /turf/open/floor/engine, /area/station/science/cytology) -"rUr" = ( -/obj/effect/turf_decal/tile/red/diagonal_edge, -/obj/effect/decal/cleanable/dirt, +"rUi" = ( +/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, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/dark/textured_large, -/area/station/security/checkpoint/escape) +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "rUD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -69204,6 +68665,24 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) +"rUJ" = ( +/obj/effect/turf_decal/siding/purple{ + dir = 1 + }, +/obj/structure/table, +/obj/item/storage/box/monkeycubes{ + pixel_x = 4 + }, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) +"rUN" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/railing/corner/end/flip, +/obj/structure/railing/corner/end, +/turf/open/floor/plating, +/area/station/maintenance/floor4/port/fore) "rUW" = ( /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/trimline/yellow, @@ -69212,6 +68691,17 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/floor1/aft) +"rVi" = ( +/obj/machinery/firealarm/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/range) "rVk" = ( /turf/open/floor/iron, /area/station/security/courtroom) @@ -69241,6 +68731,11 @@ /obj/machinery/door/firedoor, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard) +"rVN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) "rVQ" = ( /turf/closed/wall, /area/station/service/library/private) @@ -69251,6 +68746,13 @@ /obj/machinery/duct, /turf/open/floor/iron/dark/side, /area/station/security/office) +"rVY" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/checker, +/area/station/service/bar/atrium) "rWm" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, @@ -69300,6 +68802,19 @@ "rWT" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/rd) +"rWV" = ( +/obj/effect/turf_decal/trimline/red/warning{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/floor/pod, +/area/station/hallway/secondary/entry) +"rXg" = ( +/obj/effect/turf_decal/stripes{ + dir = 5 + }, +/turf/open/floor/engine, +/area/station/science/cytology) "rXp" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/random/directional/north, @@ -69321,10 +68836,23 @@ /obj/machinery/duct, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) -"rXG" = ( -/obj/machinery/teleport/station, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat) +"rXx" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/table/wood, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/service/theater) +"rXC" = ( +/obj/effect/turf_decal/trimline/red/warning{ + dir = 6 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/pod/dark, +/area/station/hallway/secondary/entry) "rXH" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/crate, @@ -69357,6 +68885,18 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/floor1/port) +"rYf" = ( +/obj/structure/closet/secure_closet/security/sec, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/lockers) +"rYq" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/floor3/fore) "rYw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -69368,25 +68908,19 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/iron/smooth, /area/station/cargo/warehouse) -"rYI" = ( +"rYR" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/paramedic) -"rYM" = ( -/obj/effect/turf_decal/trimline/white/line{ - dir = 4 + dir = 1 }, +/obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/cable, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "AI Upload Foyer"; + network = list("aiupload") }, -/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/entry) +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload_foyer) "rYS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/status_display/ai/directional/north, @@ -69432,21 +68966,18 @@ /obj/structure/reagent_dispensers/watertank/high, /turf/open/floor/iron, /area/station/service/janitor) -"rZu" = ( -/obj/effect/landmark/start/cyborg, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat) -"rZA" = ( -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 4 +"rZC" = ( +/obj/structure/showcase/cyborg/old{ + dir = 4; + pixel_x = -9; + pixel_y = 2 }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) +/obj/machinery/camera/autoname/directional/west, +/obj/machinery/power/terminal, +/obj/structure/cable, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/aisat_interior) "rZS" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -69518,15 +69049,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/floor3/starboard/fore) -"saK" = ( -/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/yjunction{ - dir = 1 - }, -/turf/open/floor/wood/tile, -/area/station/command/heads_quarters/captain) "saW" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/engine/vacuum, @@ -69542,23 +69064,42 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port) -"sbq" = ( -/obj/effect/turf_decal/trimline/green/line, -/obj/effect/turf_decal/trimline/green/line{ - dir = 1 - }, -/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/dark, -/area/station/hallway/floor3/aft) "sbw" = ( /obj/item/storage/toolbox/emergency, /turf/open/floor/plating, /area/station/maintenance/floor2/starboard/fore) +"sby" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 6 + }, +/obj/machinery/hydroponics/constructable, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"sbB" = ( +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/machinery/camera/autoname/directional/south, +/obj/item/fuel_pellet{ + pixel_x = -4; + pixel_y = -2 + }, +/obj/item/fuel_pellet, +/obj/item/fuel_pellet{ + pixel_x = 4; + pixel_y = 2 + }, +/obj/structure/rack, +/obj/machinery/firealarm/directional/east, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/corner{ + dir = 1 + }, +/area/station/cargo/drone_bay) "sbI" = ( /obj/structure/flora/bush/snow/style_random, -/turf/open/floor/fake_snow{ +/turf/open/misc/snow/actually_safe{ icon_state = "snow5" }, /area/station/hallway/floor2/fore) @@ -69646,18 +69187,32 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron, /area/station/maintenance/floor2/starboard/aft) -"sde" = ( -/obj/effect/turf_decal/stripes/line{ +"sdg" = ( +/obj/effect/turf_decal/box/corners{ dir = 1 }, -/obj/machinery/suit_storage_unit/standard_unit, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +/turf/open/floor/engine{ + initial_gas_mix = "o2=22;bz=82;TEMP=293.15" + }, +/area/station/science/xenobiology) "sdh" = ( /obj/structure/cable, /obj/effect/spawner/random/structure/grille, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port) +"sdi" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/white{ + 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/white, +/area/station/science/xenobiology) "sdo" = ( /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/siding/thinplating_new/dark, @@ -69673,7 +69228,6 @@ "sdt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible, /obj/machinery/meter, -/obj/structure/cable, /turf/open/floor/iron/dark/textured_half, /area/station/engineering/supermatter/room) "sdA" = ( @@ -69709,15 +69263,6 @@ }, /turf/open/floor/catwalk_floor/iron_dark, /area/station/ai_monitored/command/storage/eva) -"sdD" = ( -/obj/machinery/button/curtain{ - id = "theater"; - pixel_x = -26 - }, -/obj/machinery/light/directional/west, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/wood, -/area/station/service/theater) "sdL" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Engineering" @@ -69752,17 +69297,22 @@ }, /turf/open/floor/engine, /area/station/hallway/secondary/entry) -"sdV" = ( +"sdX" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 + dir = 5 }, -/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/east, -/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"sdZ" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/turf_decal/siding/white, +/obj/machinery/button/crematorium{ + id = "crematorium_chapel"; + pixel_y = -28 + }, +/turf/open/floor/carpet/orange, +/area/station/service/chapel/funeral) "see" = ( /obj/effect/turf_decal/tile/green/full, /obj/effect/decal/cleanable/dirt, @@ -69780,6 +69330,12 @@ dir = 8 }, /area/station/hallway/floor3/fore) +"sfe" = ( +/obj/structure/chair/comfy/carp, +/obj/effect/decal/cleanable/glitter, +/obj/machinery/light/blacklight/directional/east, +/turf/open/floor/carpet/neon/simple/pink/nodots, +/area/station/maintenance/floor2/port/fore) "sff" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -69817,15 +69373,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) -"sfA" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners{ - dir = 1 - }, -/obj/machinery/camera/autoname/directional/south, -/obj/machinery/reagentgrinder, -/obj/structure/table, -/turf/open/floor/iron/checker, -/area/station/cargo/miningdock) "sfB" = ( /obj/effect/landmark/start/warden, /obj/effect/turf_decal/tile/red/anticorner{ @@ -69858,6 +69405,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/hallway/floor3/fore) +"sgc" = ( +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/line, +/obj/machinery/firealarm/directional/south, +/obj/machinery/camera/directional/south{ + c_tag = "Cytology - Lab" + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "sgm" = ( /obj/structure/chair/office{ dir = 1 @@ -69903,6 +69461,15 @@ }, /turf/open/floor/iron/white, /area/station/medical/abandoned) +"sgT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sink/directional/east, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/checker{ + dir = 1 + }, +/area/station/science/genetics) "shd" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -69925,6 +69492,13 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) +"shy" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron/checker, +/area/station/commons/vacant_room/commissary) "shz" = ( /obj/machinery/status_display/ai/directional/east, /turf/open/openspace, @@ -69961,11 +69535,11 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/science/lab) -"sig" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +"sih" = ( +/obj/structure/table, +/obj/item/clothing/glasses/welding, +/turf/open/floor/iron/white, +/area/station/science/lower) "sil" = ( /obj/item/restraints/legcuffs/beartrap/prearmed, /obj/effect/decal/cleanable/dirt, @@ -69977,15 +69551,20 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark, /area/station/engineering/atmos/project) +"siq" = ( +/obj/effect/turf_decal/trimline/blue/line, +/obj/effect/turf_decal/trimline/blue/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/dark, +/area/station/hallway/floor2/fore) "siu" = ( /obj/structure/chair/sofa/bench/right, /turf/open/floor/iron/textured_large, /area/station/hallway/secondary/exit/departure_lounge) -"siv" = ( -/obj/machinery/vending/cola/starkist, -/obj/machinery/light/directional/west, -/turf/open/floor/wood, -/area/station/command/meeting_room) "siA" = ( /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible, /obj/structure/cable, @@ -69995,16 +69574,6 @@ "siB" = ( /turf/open/floor/engine, /area/station/science/auxlab/firing_range) -"siE" = ( -/obj/effect/turf_decal/trimline/blue/line, -/obj/effect/turf_decal/trimline/blue/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/dark, -/area/station/hallway/floor2/fore) "siK" = ( /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/pod/light, @@ -70028,15 +69597,14 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/bamboo/tatami/black, /area/station/commons/storage/art) -"sjr" = ( -/obj/effect/turf_decal/trimline/red/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/line{ - dir = 8 +"sjf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/checker{ + dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/aft) +/area/station/science/genetics) "sjs" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/ce, /obj/machinery/door/airlock/engineering{ @@ -70044,6 +69612,14 @@ }, /turf/open/floor/iron/dark/textured, /area/station/command/heads_quarters/ce) +"sjD" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 8 + }, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/cargo/sorting) "sjH" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Bulkhead" @@ -70059,6 +69635,11 @@ /obj/effect/mapping_helpers/airlock/access/any/service/theatre, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port/aft) +"sjW" = ( +/obj/structure/closet, +/obj/effect/spawner/random/maintenance/five, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor2/starboard) "sjX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -70078,11 +69659,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) -"sko" = ( -/obj/structure/cable, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/smooth, -/area/station/cargo/sorting) "skv" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -70108,6 +69684,22 @@ }, /turf/open/floor/iron/dark, /area/station/security/brig) +"skM" = ( +/obj/structure/table/wood, +/obj/machinery/fax{ + fax_name = "Quartermaster's Office"; + name = "Quartermaster's Fax Machine" + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/station/command/heads_quarters/qm) +"skQ" = ( +/obj/structure/table, +/obj/machinery/recharger, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/warden) "skU" = ( /turf/open/floor/iron/dark/side{ dir = 8 @@ -70167,13 +69759,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/medical/treatment_center) -"smf" = ( -/obj/machinery/light/directional/south, -/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/dark/side, -/area/station/hallway/floor2/aft) "smi" = ( /turf/open/floor/grass, /area/station/service/hydroponics) @@ -70191,12 +69776,6 @@ }, /turf/open/floor/iron/dark, /area/station/commons/dorms/room3) -"smr" = ( -/obj/effect/turf_decal/siding/wood, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/service/theater) "smv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -70205,6 +69784,13 @@ }, /turf/open/floor/iron/white, /area/station/science/lower) +"smx" = ( +/obj/structure/table, +/obj/item/pai_card{ + pixel_y = 6 + }, +/turf/open/floor/iron/checker, +/area/station/commons/vacant_room/commissary) "smJ" = ( /turf/open/floor/plating, /area/station/maintenance/floor3/port/fore) @@ -70278,12 +69864,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) -"sod" = ( -/obj/structure/sign/poster/official/random/directional/west, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/smartfridge/organ, -/turf/open/floor/iron/white/textured, -/area/station/medical/office) "soq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -70381,13 +69961,6 @@ /obj/effect/turf_decal/tile/blue/full, /turf/open/floor/iron/dark/smooth_large, /area/station/engineering/storage/tech) -"spo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/engine{ - icon_state = "textured_dark" - }, -/area/station/maintenance/floor2/starboard/aft) "spr" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/station/maintenance/floor2/starboard/aft) @@ -70400,6 +69973,17 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/storage/tcomms) +"spF" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/junction/flip, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/fore) "spI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -70460,19 +70044,9 @@ /obj/effect/turf_decal/stripes{ dir = 4 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/cargo/storage) -"srq" = ( -/obj/effect/turf_decal/trimline/blue/corner{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server/upper) "srz" = ( /obj/machinery/door/airlock/atmos{ name = "Atmospherics" @@ -70486,6 +70060,13 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/office) +"srC" = ( +/obj/effect/turf_decal/trimline/white/arrow_ccw, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/secondary/entry) "srK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -70548,16 +70129,6 @@ }, /turf/open/floor/plating, /area/station/medical/psychology) -"sst" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/turf/open/floor/plating, -/area/station/tcommsat/computer) "ssw" = ( /obj/structure/table/glass, /obj/item/modular_computer/laptop/preset/civilian, @@ -70629,19 +70200,6 @@ /obj/effect/turf_decal/trimline/green/arrow_ccw, /turf/open/floor/iron/white/small, /area/station/commons/fitness/recreation) -"stf" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 5 - }, -/obj/machinery/status_display/ai/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/hallway/floor2/fore) "stj" = ( /turf/open/floor/iron/dark/side{ dir = 8 @@ -70693,11 +70251,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) -"suh" = ( -/obj/structure/table, -/obj/machinery/microwave, -/turf/open/floor/iron/kitchen, -/area/station/command/heads_quarters/rd) "sui" = ( /obj/structure/railing{ dir = 4 @@ -70742,6 +70295,13 @@ /obj/effect/spawner/random/trash/grime, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) +"suv" = ( +/obj/machinery/processor/slime, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/circuit, +/area/station/science/xenobiology) "suB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -70821,14 +70381,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) -"svP" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/cable, -/turf/open/floor/iron/chapel{ - dir = 4 - }, -/area/station/service/chapel) "svR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/chair/plastic{ @@ -70838,33 +70390,33 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/floor1/port/fore) +"svW" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/machinery/computer/security{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "svX" = ( /turf/closed/wall, /area/station/commons/locker) -"swe" = ( -/obj/machinery/modular_computer/console/preset/engineering{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating_new/corner{ +"swk" = ( +/obj/item/kirbyplants/random, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/noticeboard/directional/west, -/obj/structure/cable, -/turf/open/floor/iron/smooth_edge, -/area/station/science/research/abandoned) +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white, +/area/station/science/lower) "swm" = ( /obj/machinery/air_sensor/nitrogen_tank, /obj/effect/turf_decal/trimline/red/line, /turf/open/floor/engine/n2, /area/station/engineering/atmos) -"swq" = ( -/obj/machinery/light/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor2/fore) "sws" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ dir = 4 @@ -70917,7 +70469,7 @@ /turf/open/floor/engine/hull, /area/space/nearstation) "sxl" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 4 }, /obj/effect/turf_decal/tile/purple/opposingcorners, @@ -70976,17 +70528,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/floor2/starboard/fore) -"sxV" = ( -/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/trimline/blue/filled/line{ - dir = 5 - }, -/obj/machinery/duct, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/aft) "sxZ" = ( /obj/structure/closet/firecloset/full, /turf/open/floor/pod/dark, @@ -71010,13 +70551,6 @@ }, /turf/open/floor/engine/airless, /area/station/solars/port/aft) -"syr" = ( -/obj/machinery/camera/autoname/directional/east, -/obj/structure/sign/departments/aiupload/directional/east, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/hallway/floor2/aft) "syt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -71032,17 +70566,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/floor2/fore) -"syC" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/machinery/computer/scan_consolenew, -/obj/machinery/light/cold/no_nightlight/directional/north, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "syE" = ( /obj/machinery/door/airlock/hatch{ name = "Fighter Airlock" @@ -71071,6 +70594,15 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard/aft) +"syV" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/structure/closet/firecloset, +/obj/machinery/duct, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "szb" = ( /obj/structure/chair/sofa/corp/right, /obj/machinery/light/directional/north, @@ -71092,6 +70624,13 @@ /obj/effect/spawner/random/food_or_drink/cups, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard) +"szo" = ( +/obj/structure/closet/secure_closet/brig{ + name = "Prisoner Locker" + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/brig) "szp" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -71163,13 +70702,6 @@ "szU" = ( /turf/open/floor/plating, /area/station/maintenance/floor3/starboard) -"szY" = ( -/obj/structure/table/reinforced, -/obj/item/stock_parts/cell/high, -/obj/machinery/cell_charger, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "sAa" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -71227,6 +70759,9 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor2/port) +"sAH" = ( +/turf/closed/wall/r_wall, +/area/station/engineering/supermatter/waste) "sAI" = ( /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, @@ -71341,11 +70876,6 @@ /obj/item/stamp/head/hos, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hos) -"sCe" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/station/service/theater) "sCp" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -71365,6 +70895,22 @@ /obj/item/kirbyplants/photosynthetic, /turf/open/floor/pod/dark, /area/station/maintenance/floor4/starboard) +"sCH" = ( +/obj/structure/frame/machine, +/obj/item/circuitboard/machine/telecomms/relay, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) +"sDg" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/rd) "sDo" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -71457,6 +71003,24 @@ /obj/effect/turf_decal/trimline/blue/filled/corner, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"sEq" = ( +/obj/structure/rack, +/obj/effect/turf_decal/stripes, +/obj/item/gun/energy/laser/practice{ + pixel_x = 3; + pixel_y = -3 + }, +/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/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/science/auxlab/firing_range) "sEt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71464,6 +71028,20 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/stairs/old, /area/station/service/theater) +"sEw" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner, +/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 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload_foyer) "sEA" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -71482,31 +71060,27 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/kitchen, /area/station/service/kitchen/abandoned) -"sEN" = ( -/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, -/obj/machinery/light/cold/directional/south, -/obj/machinery/duct, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +"sEL" = ( +/obj/machinery/rnd/production/circuit_imprinter/department/science, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/science/auxlab) "sEP" = ( /obj/item/toy/plush/bubbleplush, /obj/effect/decal/cleanable/dirt, /turf/open/floor/fakebasalt, /area/station/maintenance/floor3/port) +"sEU" = ( +/obj/structure/closet/firecloset, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "sFa" = ( /turf/open/floor/wood, /area/station/command/meeting_room) -"sFb" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/effect/turf_decal/siding/white/corner, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) "sFe" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -71563,6 +71137,13 @@ /obj/structure/sign/nanotrasen, /turf/closed/wall/r_wall, /area/station/command/bridge) +"sGh" = ( +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/xenobio, +/turf/open/floor/plating, +/area/station/science/cytology) "sGu" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -71621,17 +71202,6 @@ /obj/item/stack/medical/gauze, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"sHk" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 1 - }, -/obj/machinery/light/cold/no_nightlight/directional/south, -/obj/machinery/status_display/ai/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/lobby) "sHq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71742,25 +71312,6 @@ }, /turf/open/floor/wood, /area/station/service/theater) -"sIf" = ( -/obj/effect/turf_decal/stripes/full, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/railing{ - dir = 6 - }, -/obj/machinery/door/poddoor/preopen{ - id = "Xenolab"; - name = "Test Chamber Blast Door" - }, -/turf/open/floor/engine, -/area/station/science/cytology) -"sIr" = ( -/obj/machinery/light/small/directional/south, -/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/dark/smooth_large, -/area/station/science/robotics/lab) "sIv" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71789,36 +71340,41 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/showroomfloor, /area/station/service/kitchen/diner) -"sIC" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/newscaster/directional/north, -/obj/machinery/light/warm/directional/north, -/turf/open/floor/carpet, -/area/station/medical/psychology) "sIE" = ( /obj/machinery/power/terminal, /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/floor4/port/fore) +"sIH" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/break_room) "sIN" = ( /obj/structure/curtain, /turf/open/floor/iron/showroomfloor, /area/station/command/heads_quarters/qm) +"sIT" = ( +/obj/effect/landmark/start/captain, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/duct, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/captain/private) "sIX" = ( /obj/structure/barricade/sandbags, /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/maintenance/floor2/starboard/aft) -"sIY" = ( -/obj/structure/cable, -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/plastic, -/area/station/security/prison/shower) "sJg" = ( /obj/machinery/button/door/directional/north{ id = "dorms_lux_1_bolts"; @@ -71850,6 +71406,21 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/catwalk_floor/iron, /area/station/cargo/miningdock) +"sJu" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/line, +/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/delivery, +/obj/machinery/door/firedoor/heavy, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/fore) "sJA" = ( /obj/structure/railing{ dir = 8 @@ -71868,6 +71439,29 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/construction) +"sJK" = ( +/obj/structure/closet/secure_closet/brig{ + name = "Prisoner Locker" + }, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"sJM" = ( +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/stripes{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white, +/area/station/science/ordnance/testlab) "sJO" = ( /turf/open/floor/iron/dark, /area/station/hallway/floor3/fore) @@ -71882,6 +71476,21 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor3/port/fore) +"sKa" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/structure/bed/medical/emergency, +/obj/machinery/iv_drip, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/dark/textured, +/area/station/medical/office) +"sKg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/port) "sKm" = ( /turf/closed/wall, /area/station/medical/virology/isolation) @@ -71892,6 +71501,18 @@ }, /turf/open/space/openspace, /area/space/nearstation) +"sKs" = ( +/obj/effect/turf_decal/trimline/green/line, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/iron/dark, +/area/station/hallway/floor3/fore) "sKt" = ( /turf/closed/wall, /area/station/maintenance/floor1/starboard/aft) @@ -71938,33 +71559,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor3/port/aft) -"sKL" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/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_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 - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/engineering/atmos) "sKN" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/iron/dark/side{ @@ -71978,9 +71572,6 @@ }, /turf/open/floor/wood, /area/station/service/theater) -"sKW" = ( -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/starboard) "sKX" = ( /obj/machinery/power/smes, /obj/structure/cable, @@ -71992,14 +71583,6 @@ }, /turf/open/space/openspace, /area/space) -"sLa" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/wood/tile, -/area/station/service/library) "sLe" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/dirt, @@ -72009,44 +71592,69 @@ /obj/effect/spawner/structure/window/hollow/end, /turf/open/floor/plating, /area/station/maintenance/floor2/starboard) -"sLq" = ( -/obj/machinery/door/firedoor/border_only{ +"sLm" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Science - Deck 3 Hall" + }, +/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/purple/corner{ dir = 8 }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/starboard/fore) -"sLA" = ( -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 +/obj/structure/cable, +/obj/structure/sign/warning/xeno_mining/directional/north, +/turf/open/floor/iron/white, +/area/station/science/xenobiology/hallway) +"sLq" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/dark, -/area/station/security/brig) +/obj/effect/turf_decal/arrows{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/obj/effect/landmark/start/bitrunner, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) +"sLE" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security Entrance" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/floor2/starboard/aft) +"sLF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/corner{ + dir = 4 + }, +/area/station/cargo/miningdock) "sLI" = ( /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark/side{ dir = 1 }, /area/station/hallway/floor2/aft) -"sLL" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -6; - pixel_y = 6 +"sLX" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/purple{ + dir = 10 }, -/obj/item/pen{ - pixel_x = -6; - pixel_y = 7 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/smooth, -/area/station/science/research/abandoned) +/area/station/science/genetics) "sLY" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/broken/directional/east, @@ -72068,6 +71676,26 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/hallway/floor3/fore) +"sMg" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/green/line{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/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/hallway/floor3/fore) +"sMk" = ( +/obj/structure/cable, +/turf/open/floor/iron/white/smooth_edge{ + dir = 8 + }, +/area/station/commons/fitness/recreation) "sMm" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 4 @@ -72080,16 +71708,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"sMo" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "sMp" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -72128,7 +71746,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 8 }, -/obj/machinery/suit_storage_unit/industrial/loader, +/obj/machinery/pdapainter/supply, /turf/open/floor/iron/textured, /area/station/command/heads_quarters/qm) "sMY" = ( @@ -72166,18 +71784,6 @@ }, /turf/open/floor/iron/textured_large, /area/station/cargo/sorting) -"sNA" = ( -/obj/item/wheelchair{ - pixel_y = -3 - }, -/obj/item/wheelchair, -/obj/item/wheelchair{ - pixel_y = 3 - }, -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white/textured, -/area/station/medical/storage) "sNE" = ( /obj/machinery/vending/cigarette, /turf/open/floor/iron, @@ -72192,6 +71798,13 @@ dir = 1 }, /area/station/hallway/floor2/aft) +"sNN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor, +/turf/open/floor/iron/textured_large, +/area/station/hallway/secondary/entry) "sOj" = ( /obj/effect/spawner/random/structure/girder, /turf/open/floor/pod/light, @@ -72224,14 +71837,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port/aft) -"sOG" = ( -/obj/machinery/light/directional/west, -/obj/item/radio/intercom/directional/west, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/hallway/floor2/fore) "sOI" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, @@ -72285,9 +71890,6 @@ }, /obj/effect/turf_decal/tile/green/opposingcorners, /obj/effect/landmark/start/virologist, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, /turf/open/floor/iron/white, /area/station/medical/virology) "sPs" = ( @@ -72357,6 +71959,14 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/openspace, /area/station/command/heads_quarters/hop) +"sQw" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/machinery/modular_computer/preset/engineering, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "sQD" = ( /turf/closed/wall/r_wall, /area/station/engineering/engine_smes) @@ -72367,6 +71977,12 @@ /obj/structure/sign/directions/evac/directional/west, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"sQT" = ( +/obj/effect/turf_decal/stripes, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor2/starboard) "sRd" = ( /obj/effect/mapping_helpers/airlock/access/all/command/captain, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -72379,13 +71995,6 @@ /obj/machinery/duct, /turf/open/floor/wood/tile, /area/station/command/heads_quarters/captain/private) -"sRg" = ( -/obj/machinery/light/cold/directional/east, -/obj/structure/bodycontainer/morgue{ - dir = 8 - }, -/turf/open/floor/iron/dark/textured, -/area/station/medical/morgue) "sRh" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -72401,21 +72010,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"sRs" = ( -/obj/structure/rack, -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/item/multitool/circuit{ - pixel_x = 7 - }, -/obj/item/multitool/circuit, -/obj/item/multitool/circuit{ - pixel_x = -8 - }, -/obj/machinery/light/cold/no_nightlight/directional/south, -/turf/open/floor/iron/dark, -/area/station/science/circuits) "sRz" = ( /obj/effect/turf_decal/trimline/purple/line{ dir = 10 @@ -72428,21 +72022,27 @@ }, /turf/open/floor/iron/white, /area/station/science/lobby) +"sRG" = ( +/obj/effect/turf_decal/trimline/blue/corner{ + 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, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/command/teleporter) "sRH" = ( /obj/machinery/firealarm/directional/north, /obj/effect/turf_decal/tile/red/half{ dir = 1 }, +/obj/vehicle/ridden/secway, /turf/open/floor/iron/dark, /area/station/security/eva) -"sRL" = ( -/obj/effect/turf_decal/siding/wood, -/obj/machinery/light/cold/directional/west, -/obj/machinery/iv_drip, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/turf/open/floor/iron/white/herringbone, -/area/station/medical/patients_rooms) "sRO" = ( /obj/machinery/firealarm/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -72453,14 +72053,6 @@ "sRR" = ( /turf/closed/wall, /area/station/medical/paramedic) -"sRY" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "sRZ" = ( /obj/effect/turf_decal/tile/purple/fourcorners, /obj/item/kirbyplants/random, @@ -72534,11 +72126,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint) -"sTC" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/science/cytology) "sTD" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -72548,24 +72135,6 @@ /obj/structure/table/glass, /turf/open/floor/wood/tile, /area/station/command/heads_quarters/captain/private) -"sTJ" = ( -/obj/machinery/porta_turret/ai, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat_interior) -"sTN" = ( -/obj/effect/turf_decal/siding/white{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/landmark/start/scientist, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "sTQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -72577,6 +72146,14 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/aft) +"sTT" = ( +/obj/structure/table/glass, +/obj/item/food/grown/carrot, +/obj/item/food/grown/wheat, +/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/cytology) "sTU" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -72746,17 +72323,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, /area/station/engineering/atmos) -"sVX" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/security/brig) "sVY" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -72791,6 +72357,15 @@ /obj/structure/marker_beacon/burgundy, /turf/open/space/openspace, /area/space/nearstation) +"sWt" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/structure/table, +/obj/machinery/microwave, +/obj/effect/spawner/random/food_or_drink/donkpockets, +/turf/open/floor/iron/white, +/area/station/medical/psychology) "sWw" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -72806,7 +72381,6 @@ /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/red/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible, -/obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/supermatter/room) "sWC" = ( @@ -73025,6 +72599,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/lobby) +"sYH" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/airalarm/directional/north, +/obj/machinery/status_display/ai/directional/east, +/obj/structure/cable, +/turf/open/floor/iron/textured_large, +/area/station/engineering/engine_smes) "sYI" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -73135,11 +72716,6 @@ /obj/structure/cable, /turf/open/floor/eighties, /area/station/commons/fitness/recreation/entertainment) -"sZF" = ( -/turf/open/floor/iron/dark/side{ - dir = 9 - }, -/area/station/hallway/floor4/fore) "sZH" = ( /obj/structure/mirror/directional/west, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -73194,20 +72770,6 @@ /obj/effect/spawner/random/structure/chair_flipped, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) -"taj" = ( -/obj/structure/sign/poster/official/random/directional/east, -/obj/structure/sign/directions/dorms/directional/north, -/obj/structure/sign/directions/security/directional/north{ - pixel_y = 40 - }, -/obj/structure/sign/directions/command/directional/north{ - pixel_y = 24 - }, -/obj/structure/railing/corner{ - dir = 8 - }, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor2/fore) "tal" = ( /obj/structure/railing, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -73227,6 +72789,7 @@ /obj/machinery/button/door/directional/south{ id = "radshutnorth" }, +/obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "tat" = ( @@ -73248,6 +72811,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) +"taR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/sign/directions/evac/directional/south, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor3/port/aft) "taW" = ( /obj/structure/table/wood, /obj/effect/spawner/random/entertainment/musical_instrument, @@ -73274,14 +72844,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) -"tbp" = ( -/obj/item/kirbyplants/random, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron/white, -/area/station/science/lower) "tbq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -73349,12 +72911,6 @@ /obj/effect/landmark/start/warden, /turf/open/floor/iron/dark, /area/station/security/warden) -"tcv" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/hallway/floor3/fore) "tcA" = ( /obj/machinery/telecomms/server/presets/engineering, /turf/open/floor/circuit/telecomms, @@ -73382,6 +72938,10 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor2/starboard/fore) +"tcP" = ( +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor3/fore) "tda" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/side{ @@ -73398,22 +72958,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/wood/large, /area/station/security/prison/safe) -"tdd" = ( -/obj/structure/table, -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/item/clothing/gloves/latex{ - pixel_x = 4; - pixel_y = 9 - }, -/obj/item/storage/box/monkeycubes{ - pixel_x = 4 - }, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "tde" = ( /obj/effect/spawner/random/trash/garbage{ spawn_scatter_radius = 1 @@ -73433,12 +72977,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white/textured, /area/station/medical/office) -"tdw" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/science/cytology) "tdz" = ( /obj/effect/turf_decal/trimline/brown/filled/line, /obj/effect/turf_decal/trimline/brown/filled/mid_joiner, @@ -73463,6 +73001,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/machinery/light/red/dim/directional/west, +/obj/structure/disposalpipe/segment, /turf/open/floor/pod/light, /area/station/maintenance/floor2/starboard) "tdB" = ( @@ -73483,10 +73022,32 @@ /obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/wood, /area/station/command/meeting_room) +"tdG" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood, +/area/station/service/theater) "tdK" = ( /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/floor2/starboard) +"tdM" = ( +/obj/structure/rack, +/obj/item/stock_parts/micro_laser{ + pixel_y = 7 + }, +/obj/item/stock_parts/cell/high{ + pixel_x = -4; + pixel_y = -6 + }, +/obj/item/vending_refill/wardrobe/science_wardrobe{ + pixel_y = 18 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/white, +/area/station/science/lower) "tec" = ( /obj/machinery/door/airlock/public{ id_tag = "public_toilets_b"; @@ -73567,6 +73128,26 @@ /obj/effect/landmark/start/botanist, /turf/open/floor/iron, /area/station/service/hydroponics) +"tfk" = ( +/obj/machinery/computer/department_orders/science{ + department_delivery_areas = list(/area/station/science/lobby,/area/station/science/robotics/lab) + }, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/stripes/white/line, +/obj/machinery/light/cold/no_nightlight/directional/north, +/turf/open/floor/iron/dark, +/area/station/science/circuits) +"tfo" = ( +/obj/effect/turf_decal/trimline/white/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) +"tfs" = ( +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/starboard) "tfw" = ( /obj/effect/turf_decal/siding/wood, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -73591,6 +73172,11 @@ }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) +"tfD" = ( +/obj/structure/cable, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) "tfE" = ( /obj/structure/railing, /obj/machinery/door/firedoor/border_only, @@ -73628,31 +73214,36 @@ /obj/machinery/door/firedoor/heavy, /turf/open/floor/plating, /area/station/hallway/floor1/aft) -"tgq" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 +"tgz" = ( +/obj/effect/landmark/start/prisoner, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 }, -/turf/open/floor/iron/dark/textured, -/area/station/hallway/floor2/aft) +/obj/machinery/light/dim/directional/east, +/turf/open/floor/wood/large, +/area/station/security/prison/safe) "tgA" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/sign/poster/contraband/random/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/carpet/green, /area/station/service/abandoned_gambling_den) -"tgG" = ( -/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/trimline/blue/filled/line{ - dir = 6 +"tgF" = ( +/obj/effect/turf_decal/stripes{ + dir = 9 }, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/medbay/aft) +/obj/item/stack/sheet/glass{ + amount = 30 + }, +/obj/structure/closet/crate/science{ + name = "Chamber Supplies" + }, +/obj/item/stack/ducts/fifty, +/obj/item/storage/toolbox/mechanical, +/obj/item/electronics/airlock, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "tgP" = ( /obj/effect/turf_decal/tile/green/full, /obj/effect/decal/cleanable/dirt, @@ -73694,17 +73285,6 @@ /obj/structure/closet/firecloset/full, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard/aft) -"thj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "thq" = ( /obj/structure/railing{ dir = 5 @@ -73713,11 +73293,25 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/starboard/fore) +"thu" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/light/small/directional/east, +/turf/open/openspace, +/area/station/service/library) "thw" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) +"thD" = ( +/obj/structure/table/reinforced, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/detectives_office/private_investigators_office) "thM" = ( /obj/structure/railing{ dir = 1 @@ -73749,15 +73343,6 @@ "tic" = ( /turf/open/floor/wood, /area/station/commons/dorms/apartment2) -"tid" = ( -/obj/structure/table/glass, -/obj/machinery/newscaster/directional/west, -/obj/machinery/fax{ - fax_name = "Research Director's Office"; - name = "Research Director's Fax Machine" - }, -/turf/open/floor/iron/large, -/area/station/command/heads_quarters/rd) "til" = ( /obj/structure/sign/poster/contraband/grey_tide, /turf/closed/wall, @@ -73769,25 +73354,9 @@ "tiC" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/oil, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) -"tiN" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/cold/directional/west, -/obj/machinery/requests_console/directional/west{ - department = "Chief Medical Officer's Desk"; - name = "Chief Medical Officer's Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/iron/stairs/left{ - dir = 1 - }, -/area/station/command/heads_quarters/cmo) "tiX" = ( /obj/effect/turf_decal/trimline/green/warning{ dir = 10 @@ -73835,19 +73404,16 @@ dir = 1 }, /area/station/hallway/secondary/exit/escape_pod) -"tjq" = ( -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/service/theater) "tjA" = ( /obj/effect/turf_decal/trimline/yellow/warning, /obj/structure/rack, /obj/effect/spawner/random/engineering/flashlight, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/starboard/aft) +"tjC" = ( +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/security/checkpoint/second) "tjF" = ( /obj/machinery/door/firedoor/border_only, /turf/open/floor/iron/chapel{ @@ -73865,9 +73431,29 @@ /obj/effect/spawner/random/decoration/glowstick, /turf/open/floor/pod, /area/station/maintenance/floor4/starboard/aft) +"tjM" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/table, +/obj/machinery/microwave, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/kitchen, +/area/station/command/heads_quarters/rd) "tjN" = ( /turf/open/floor/iron, /area/station/maintenance/solars/starboard/fore) +"tjP" = ( +/obj/effect/turf_decal/trimline/purple/line, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) "tjS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -73875,6 +73461,16 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/dark/side, /area/station/hallway/floor2/aft) +"tjV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/incident_display/delam/directional/north, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "tkb" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/structure/cable, @@ -73885,13 +73481,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard/fore) -"tko" = ( -/obj/item/stack/sheet/iron, -/obj/effect/spawner/random/structure/furniture_parts, -/turf/open/floor/engine{ - icon_state = "textured_dark" - }, -/area/station/maintenance/floor2/starboard/aft) "tkq" = ( /turf/closed/wall, /area/station/solars/starboard/aft) @@ -73946,6 +73535,12 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/port/aft) +"tlb" = ( +/mob/living/simple_animal/slime, +/turf/open/floor/engine{ + initial_gas_mix = "o2=22;bz=82;TEMP=293.15" + }, +/area/station/science/xenobiology) "tld" = ( /obj/structure/table/reinforced, /obj/item/stack/sheet/mineral/plasma/five, @@ -73973,10 +73568,27 @@ /obj/structure/chair/stool, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"tln" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/engineering/atmos/hfr_room) +"tll" = ( +/obj/structure/sign/poster/official/random/directional/north, +/obj/effect/turf_decal/siding/purple{ + dir = 5 + }, +/obj/machinery/dna_scannernew, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) +"tlq" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east{ + cell_type = /obj/item/stock_parts/cell/hyper + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/smooth_large, +/area/station/tcommsat/server) "tlr" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -73996,28 +73608,19 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/floor4/port) -"tlA" = ( -/obj/structure/table, -/obj/machinery/light/cold/no_nightlight/directional/south, -/obj/effect/turf_decal/trimline/green/filled/arrow_cw{ - dir = 10 - }, -/turf/open/floor/iron/dark/textured, -/area/station/hallway/floor2/aft) -"tlF" = ( -/obj/machinery/atmospherics/components/binary/pump/off{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/effect/landmark/start/scientist, -/turf/open/floor/iron/white, -/area/station/science/cytology) "tlJ" = ( /obj/machinery/camera/autoname/directional/east, /turf/open/space/openspace, /area/space) +"tlK" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/circuit, +/area/station/science/xenobiology) "tlX" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 8 }, /obj/effect/turf_decal/siding/wood{ @@ -74057,7 +73660,7 @@ /turf/open/floor/wood, /area/station/commons/vacant_room/office) "tms" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 4 }, /obj/structure/cable, @@ -74067,17 +73670,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/floor1/aft) -"tmC" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/floor2/port/fore) -"tmE" = ( -/obj/machinery/airalarm/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/lower) "tmM" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Hatch" @@ -74105,6 +73697,22 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor1/port/fore) +"tnj" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 8 + }, +/obj/effect/mapping_helpers/mail_sorting/security/general, +/obj/effect/mapping_helpers/mail_sorting/security/hos_office, +/obj/effect/mapping_helpers/mail_sorting/security/detectives_office, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/fore) "tnm" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -74112,6 +73720,11 @@ /obj/effect/decal/cleanable/glass, /turf/open/floor/plating, /area/station/maintenance/floor2/port/aft) +"tnn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) "tns" = ( /obj/structure/disposalpipe/trunk/multiz{ dir = 4 @@ -74140,6 +73753,19 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/textured_large, /area/station/cargo/miningdock) +"tnA" = ( +/obj/machinery/light/cold/no_nightlight/directional/south, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/station/hallway/secondary/service) +"tnC" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/wood, +/area/station/commons/dorms/apartment2) "tnG" = ( /obj/structure/closet{ name = "Contraband Locker" @@ -74175,6 +73801,19 @@ dir = 1 }, /area/station/hallway/floor4/aft) +"tnV" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/aft) "tnX" = ( /obj/effect/turf_decal/trimline/green/warning{ dir = 6 @@ -74330,6 +73969,11 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/science/lobby) +"tpV" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/science/genetics) "tpW" = ( /obj/effect/turf_decal/tile/green/opposingcorners, /obj/effect/baseturf_helper/reinforced_plating/ceiling, @@ -74453,6 +74097,15 @@ /obj/structure/grille, /turf/open/floor/plating, /area/station/maintenance/floor3/port/aft) +"trP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/camera/emp_proof/directional/east, +/turf/open/floor/iron/dark/textured_edge{ + dir = 8 + }, +/area/station/medical/chemistry) "trV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -74460,25 +74113,6 @@ /obj/machinery/light/red/dim/directional/west, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/port/fore) -"trZ" = ( -/obj/effect/turf_decal/trimline/purple/warning, -/obj/machinery/light/red/dim/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/closet_maintenance, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor2/starboard) -"tsc" = ( -/obj/effect/turf_decal/trimline/green/filled/arrow_cw{ - dir = 8 - }, -/obj/structure/railing{ - dir = 4 - }, -/obj/machinery/light/cold/no_nightlight/directional/west, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/dark/textured, -/area/station/medical/virology/isolation) "tsi" = ( /obj/structure/table/wood, /obj/item/book/manual/wiki/security_space_law, @@ -74648,12 +74282,6 @@ }, /turf/open/floor/iron, /area/station/hallway/floor4/fore) -"tuA" = ( -/obj/machinery/monkey_recycler, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/circuit, -/area/station/science/xenobiology) "tuB" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/grille/broken, @@ -74665,6 +74293,13 @@ /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, /area/station/service/hydroponics) +"tuM" = ( +/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, +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "tuT" = ( /obj/structure/sign/poster/official/random/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -74674,6 +74309,15 @@ }, /turf/open/floor/iron, /area/station/hallway/floor2/fore) +"tuX" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/science/lower) "tve" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -74689,15 +74333,6 @@ }, /turf/open/floor/iron/dark/side, /area/station/security/prison) -"tvu" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light/cold/no_nightlight/directional/east, -/turf/open/floor/iron/dark, -/area/station/security/detectives_office/private_investigators_office) "tvH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -74705,13 +74340,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/textured_large, /area/station/engineering/atmos/office) -"tvJ" = ( -/obj/effect/landmark/start/hangover, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor1/fore) "tvU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -74732,6 +74360,12 @@ /obj/structure/flora/bush/flowers_yw/style_random, /turf/open/floor/grass, /area/station/hallway/floor1/aft) +"tvY" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/bot, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark/textured, +/area/station/science/ordnance/storage) "tvZ" = ( /obj/structure/stairs/south, /turf/open/floor/iron/dark/smooth_large, @@ -74740,6 +74374,16 @@ /obj/structure/disposalpipe/trunk/multiz, /turf/open/openspace, /area/station/maintenance/floor3/starboard/fore) +"twd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/ordnance/storage) "twg" = ( /obj/machinery/holopad, /obj/effect/mapping_helpers/iannewyear, @@ -74759,17 +74403,30 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor2/starboard/aft) +"twv" = ( +/obj/machinery/requests_console/directional/east{ + department = "Xenobiology"; + name = "Xenobiology Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/ore_update, +/obj/machinery/shower/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/noslip, +/area/station/science/xenobiology) "twx" = ( /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) +"twy" = ( +/obj/structure/closet/secure_closet/freezer/meat, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "twz" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) -"twB" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/security/courtroom) "twL" = ( /obj/structure/grille, /turf/open/floor/pod/light, @@ -74807,12 +74464,6 @@ /obj/item/crowbar/red, /turf/open/floor/iron/dark, /area/station/engineering/atmos/office) -"twR" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/effect/turf_decal/bot, -/obj/structure/sign/warning/directional/south, -/turf/open/floor/iron/dark/textured, -/area/station/science/ordnance/storage) "twS" = ( /obj/structure/closet/firecloset/full, /obj/effect/decal/cleanable/dirt, @@ -74839,6 +74490,9 @@ /obj/item/reagent_containers/spray/cleaner, /turf/open/floor/iron/white/textured, /area/station/medical/treatment_center) +"txu" = ( +/turf/open/floor/iron/dark, +/area/station/science/cytology) "txv" = ( /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 4 @@ -74854,24 +74508,24 @@ "txA" = ( /turf/open/floor/plating/foam, /area/station/maintenance/floor2/starboard/fore) +"txB" = ( +/obj/effect/turf_decal/siding/white, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/white/corner{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "txC" = ( /obj/machinery/light/red/dim/directional/east, /turf/open/floor/plating, /area/station/maintenance/floor3/port/fore) -"txM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/effect/decal/cleanable/oil/streak, -/turf/open/floor/plating/elevatorshaft, -/area/station/science/research/abandoned) -"txN" = ( -/obj/machinery/light/directional/north, -/obj/item/kirbyplants/random, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/station/hallway/floor4/aft) +"txF" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance/two, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "txP" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -74920,6 +74574,11 @@ "tyi" = ( /turf/open/floor/wood/parquet, /area/station/medical/psychology) +"tyj" = ( +/obj/machinery/airalarm/directional/south, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) "tyo" = ( /obj/effect/turf_decal/weather/dirt{ dir = 4 @@ -74973,14 +74632,12 @@ }, /turf/open/floor/iron, /area/station/hallway/floor3/aft) -"tzp" = ( -/obj/structure/rack, -/obj/item/soulstone/anybody/chaplain, -/obj/item/nullrod{ - pixel_x = -6 - }, -/turf/open/floor/iron/white/textured_large, -/area/station/service/chapel/office) +"tzf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/grime, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/pod/light, +/area/station/maintenance/floor2/port/aft) "tzs" = ( /obj/machinery/holopad, /turf/open/floor/iron/dark, @@ -75018,12 +74675,13 @@ }, /turf/open/floor/grass, /area/station/service/hydroponics/garden/abandoned) -"tzQ" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 +"tzF" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 }, +/obj/machinery/light/directional/south, /turf/open/floor/iron, -/area/station/hallway/floor2/aft) +/area/station/commons/fitness/recreation) "tzU" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/north, @@ -75063,32 +74721,18 @@ /obj/effect/spawner/random/structure/furniture_parts, /turf/open/floor/iron, /area/station/maintenance/floor2/port/aft) -"tAk" = ( -/obj/machinery/light/red/dim/directional/west, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) -"tAq" = ( -/obj/structure/hedge, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 +"tAs" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"tAv" = ( -/obj/machinery/light/directional/south, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/siding/thinplating_new/dark{ +/obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/item/clothing/glasses/meson, -/obj/item/clothing/glasses/meson, -/obj/item/clothing/glasses/meson, +/obj/effect/landmark/navigate_destination/sec, +/obj/structure/cable, +/obj/machinery/light/floor, /turf/open/floor/iron/dark, -/area/station/engineering/supermatter/room) +/area/station/security/brig) "tAz" = ( /obj/structure/railing/corner{ dir = 8 @@ -75098,6 +74742,16 @@ dir = 8 }, /area/station/hallway/secondary/exit/departure_lounge) +"tAC" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/turf_decal/stripes/end, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"tAE" = ( +/obj/machinery/vending/cola/starkist, +/turf/open/floor/wood, +/area/station/command/meeting_room) "tAL" = ( /obj/structure/railing{ dir = 4 @@ -75175,11 +74829,6 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating/airless, /area/space/nearstation) -"tBD" = ( -/obj/machinery/griddle, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "tBN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, @@ -75188,6 +74837,11 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/floor2/port/aft) +"tBV" = ( +/obj/structure/mop_bucket/janitorialcart, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/service/janitor) "tBY" = ( /obj/machinery/chem_dispenser, /obj/structure/sign/poster/official/periodic_table/directional/west, @@ -75254,6 +74908,12 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port) +"tDp" = ( +/obj/structure/bonfire, +/obj/item/melee/moonlight_greatsword, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone, +/area/station/maintenance/floor3/starboard/fore) "tDs" = ( /turf/open/floor/iron, /area/station/hallway/floor4/aft) @@ -75307,8 +74967,23 @@ dir = 1 }, /area/station/engineering/atmos/office) +"tDV" = ( +/obj/machinery/rnd/production/circuit_imprinter/department/science, +/obj/effect/turf_decal/bot, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/iron/dark, +/area/station/science/lab) +"tDX" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/iv_drip, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "tEb" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron/textured_large, /area/station/maintenance/solars/starboard/fore) "tEc" = ( @@ -75327,6 +75002,12 @@ /obj/effect/turf_decal/siding/white, /turf/open/floor/iron/dark/textured, /area/station/medical/paramedic) +"tEh" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/aft) "tEi" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron/dark, @@ -75338,13 +75019,6 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos/pumproom) -"tEz" = ( -/obj/structure/sign/poster/official/random/directional/east, -/obj/structure/bed, -/obj/item/bedsheet, -/obj/effect/landmark/start/depsec/medical, -/turf/open/floor/iron/dark/textured, -/area/station/security/checkpoint/second) "tEG" = ( /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard/fore) @@ -75365,37 +75039,25 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron/dark/textured, /area/station/medical/virology/isolation) -"tEL" = ( -/obj/effect/turf_decal/trimline/brown/arrow_cw{ +"tEW" = ( +/obj/machinery/camera/autoname/directional/west, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/side{ dir = 8 }, -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/poster/official/random/directional/west, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/miningdock) -"tEN" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/lower) -"tEU" = ( -/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer4{ - dir = 4 - }, -/obj/item/paper{ - default_raw_text = "Once you have gas coming in from the SM to the containment chamber, you'll need to cool it.
In this order:
1. Wrench in the plasma can.
2. Turn on the Waste Cooling Gas pump and turn the thermomachines to cold.
3. Set up the scrubbers in the chamber using the air alarm.
4. Turn on/replace the filter to the canisters.
5. Decide if you want to send the gas to atmos with the Supermatter Waste To Port pump, or waste it by sending it to space with the Emergency Release Valve."; - name = "HOW TO SET UP THE SM WASTE" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/pumproom) +/area/station/hallway/floor2/fore) "tEY" = ( /obj/effect/spawner/random/trash/mopbucket, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard/aft) +"tFc" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/shieldgen, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/corner{ + dir = 8 + }, +/area/station/cargo/miningdock) "tFm" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -75432,11 +75094,6 @@ }, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"tFM" = ( -/obj/effect/turf_decal/stripes, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor2/starboard) "tFO" = ( /obj/effect/turf_decal/tile/red/half/contrasted, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -75444,6 +75101,10 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/execution/transfer) +"tFR" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "tFS" = ( /obj/effect/landmark/navigate_destination/kitchen, /turf/open/floor/wood, @@ -75480,26 +75141,39 @@ dir = 4 }, /area/station/science/robotics/lab) -"tGA" = ( -/obj/machinery/newscaster/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/side{ - dir = 1 +"tGz" = ( +/obj/item/storage/box/teargas{ + pixel_x = 3; + pixel_y = 3 }, -/area/station/hallway/floor3/aft) +/obj/item/storage/box/handcuffs, +/obj/item/storage/box/flashbangs{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/airalarm/directional/south, +/obj/structure/sign/nanotrasen{ + pixel_x = -32 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "tGE" = ( /turf/open/floor/iron/textured, /area/station/command/heads_quarters/qm) -"tGV" = ( -/obj/structure/showcase/cyborg/old{ - dir = 4; - pixel_x = -9; - pixel_y = 2 +"tGS" = ( +/obj/machinery/computer/scan_consolenew{ + dir = 8 }, -/obj/machinery/camera/autoname/directional/west, -/obj/structure/cable, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat_interior) +/obj/effect/turf_decal/siding/purple{ + dir = 6 + }, +/obj/structure/sign/poster/official/random/directional/east, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "tGW" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/caution/stand_clear/white{ @@ -75510,19 +75184,6 @@ }, /turf/open/floor/pod, /area/station/maintenance/floor4/starboard/aft) -"tHh" = ( -/obj/effect/turf_decal/trimline/white/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/white/arrow_ccw, -/obj/effect/turf_decal/trimline/red/corner{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/secondary/entry) "tHn" = ( /obj/machinery/atmospherics/components/binary/pump/layer4{ dir = 1 @@ -75541,23 +75202,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured, /area/station/commons/fitness) -"tHx" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/obj/machinery/button/door/directional/west{ - id = "surg_b_privacy"; - name = "Surgery Privacy Shutters"; - req_access = list("medical") - }, -/obj/machinery/light_switch/directional/west{ - pixel_x = -24; - pixel_y = -10 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) "tHH" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, @@ -75583,6 +75227,7 @@ /area/station/security/prison) "tIa" = ( /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/floor4/port/fore) "tIc" = ( @@ -75620,6 +75265,17 @@ }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) +"tIn" = ( +/obj/machinery/computer/security/mining{ + dir = 8 + }, +/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/corner{ + dir = 1 + }, +/area/station/cargo/miningdock) "tIu" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/structure/closet/secure_closet/medical3, @@ -75630,34 +75286,6 @@ /obj/machinery/shower/directional/west, /turf/open/floor/noslip, /area/station/science/lobby) -"tIy" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/hallway/floor4/fore) -"tIF" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/structure/table, -/obj/item/flashlight/lamp/green{ - pixel_x = 8; - pixel_y = 16 - }, -/obj/item/papercutter, -/obj/item/toy/figure/qm{ - pixel_x = 8; - pixel_y = -2 - }, -/turf/open/floor/iron/smooth, -/area/station/science/research/abandoned) "tIG" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Bulkhead" @@ -75707,10 +75335,16 @@ }, /turf/open/floor/iron/dark, /area/station/security/execution/transfer) -"tJd" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/fore) +"tJi" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/structure/railing/corner/end{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) "tJj" = ( /obj/machinery/airalarm/directional/east, /obj/effect/turf_decal/tile/red/diagonal_edge, @@ -75724,16 +75358,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"tJq" = ( -/obj/effect/turf_decal/siding/white, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/line, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "tJu" = ( /turf/open/floor/iron/dark/side{ dir = 5 @@ -75810,10 +75434,6 @@ dir = 10 }, /area/station/hallway/floor1/fore) -"tKg" = ( -/obj/structure/dresser, -/turf/open/floor/carpet/red, -/area/station/commons/dorms/room1) "tKl" = ( /obj/structure/railing/corner{ dir = 4 @@ -75835,9 +75455,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/effect/turf_decal/tile/green/opposingcorners, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/effect/landmark/start/virologist, /turf/open/floor/iron/white, /area/station/medical/virology) @@ -75865,6 +75482,14 @@ dir = 4 }, /area/station/engineering/storage/tech) +"tKP" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat/hallway) "tKU" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -75883,12 +75508,17 @@ /turf/open/floor/iron, /area/station/hallway/floor1/aft) "tLb" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/turf_decal/siding/white{ + dir = 8 }, -/obj/machinery/status_display/ai/directional/south, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor3/aft) +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) +"tLf" = ( +/obj/effect/spawner/random/contraband/landmine, +/turf/open/floor/iron, +/area/station/maintenance/floor4/starboard) "tLg" = ( /obj/effect/turf_decal/trimline/green/filled/end, /turf/open/floor/iron, @@ -75927,11 +75557,6 @@ /obj/structure/marker_beacon/burgundy, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/aft) -"tLE" = ( -/obj/machinery/light/blacklight/directional/east, -/obj/machinery/vending/cola/pwr_game, -/turf/open/floor/eighties, -/area/station/commons/fitness/recreation/entertainment) "tLF" = ( /obj/structure/closet/emcloset/anchored, /turf/open/floor/pod/dark, @@ -75964,6 +75589,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/locker) +"tMB" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 4 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "tMK" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -75984,12 +75616,27 @@ /obj/effect/turf_decal/tile/red/half, /turf/open/floor/iron/dark/side, /area/station/security/brig) +"tNe" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/security/detectives_office/private_investigators_office) "tNf" = ( /obj/machinery/shieldgen, /obj/effect/decal/cleanable/cobweb, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_large, /area/station/engineering/lobby) +"tNi" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/cigar, +/obj/effect/spawner/random/entertainment/cigarette_pack, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/wood, +/area/station/hallway/floor3/fore) "tNA" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -75997,17 +75644,6 @@ /obj/effect/decal/cleanable/oil, /turf/open/floor/iron, /area/station/engineering/lobby) -"tNB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/south, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/office) "tNC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -76015,6 +75651,16 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron, /area/station/engineering/engine_smes) +"tNG" = ( +/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/trimline/blue/filled/line{ + dir = 6 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "tNK" = ( /obj/machinery/light/directional/south, /obj/machinery/atmospherics/pipe/multiz/supply/hidden/layer4, @@ -76038,6 +75684,56 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/floor1/starboard/fore) +"tNU" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/line, +/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/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/aft) +"tOc" = ( +/obj/structure/table, +/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 = list("armory") + }, +/obj/machinery/button/flasher{ + id = "secentranceflasher"; + name = "Brig Entrance Flasher"; + pixel_y = -3; + req_access = list("armory") + }, +/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 = list("armory") + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/requests_console/directional/north{ + department = "Security"; + name = "Security Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/iron/dark, +/area/station/security/warden) "tOl" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -76079,6 +75775,11 @@ dir = 1 }, /area/station/hallway/floor1/aft) +"tOE" = ( +/obj/machinery/duct, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/chapel, +/area/station/service/chapel) "tOP" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -76088,12 +75789,6 @@ }, /turf/open/floor/carpet/red, /area/station/service/theater) -"tOQ" = ( -/obj/structure/window/spawner/directional/south, -/obj/structure/filingcabinet/employment, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/iron/smooth, -/area/station/science/research/abandoned) "tOS" = ( /obj/effect/mapping_helpers/burnt_floor, /obj/machinery/portable_atmospherics/canister, @@ -76113,12 +75808,20 @@ /obj/machinery/defibrillator_mount/directional/north, /turf/open/floor/iron/white/textured, /area/station/medical/treatment_center) -"tPh" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 +"tPj" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/table/glass, +/obj/effect/turf_decal/siding/purple{ + dir = 1 }, -/turf/open/floor/wood, -/area/station/service/kitchen/diner) +/obj/structure/microscope, +/obj/structure/disposalpipe/segment, +/obj/item/biopsy_tool{ + pixel_x = -10; + pixel_y = 3 + }, +/turf/open/floor/iron, +/area/station/science/cytology) "tPk" = ( /turf/open/misc/sandy_dirt, /area/station/maintenance/floor1/starboard) @@ -76131,17 +75834,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/aft) -"tPv" = ( -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/ai_monitored/command/storage/eva) "tPx" = ( /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/dark, @@ -76177,21 +75869,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/side, /area/station/cargo/miningdock) +"tQk" = ( +/obj/machinery/computer/apc_control, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/command/heads_quarters/ce) "tQl" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod, /area/station/maintenance/floor4/starboard/aft) -"tQq" = ( -/obj/effect/turf_decal/trimline/blue/line, -/obj/effect/turf_decal/trimline/blue/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/dark, -/area/station/hallway/floor2/aft) "tQF" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -76215,6 +75902,12 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/starboard/fore) +"tQK" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor3/aft) "tQM" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -76238,11 +75931,6 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) -"tQV" = ( -/obj/structure/closet/secure_closet/freezer/fridge, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "tRh" = ( /obj/structure/railing{ dir = 1 @@ -76250,6 +75938,11 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/dark, /area/station/security/courtroom) +"tRi" = ( +/obj/structure/filingcabinet, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/dark/smooth_large, +/area/station/service/library/printer) "tRj" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, @@ -76261,18 +75954,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/red, /area/station/service/theater) -"tRp" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/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/dark/side{ - dir = 4 - }, -/area/station/hallway/secondary/entry) "tRq" = ( /obj/effect/turf_decal/trimline/blue/line{ dir = 4 @@ -76339,8 +76020,6 @@ /area/station/cargo/sorting) "tSD" = ( /obj/structure/closet/mini_fridge{ - desc = "A small contraption designed to imbue a few drinks with a pleasant chill."; - name = "mini-fridge"; pixel_x = 6; pixel_y = 5 }, @@ -76360,6 +76039,11 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/iron/dark/textured, /area/station/commons/fitness) +"tTc" = ( +/obj/structure/cable, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/wood, +/area/station/service/kitchen/diner) "tTf" = ( /obj/effect/turf_decal/trimline/brown/warning{ dir = 6 @@ -76382,16 +76066,6 @@ }, /turf/open/floor/iron/dark, /area/station/commons/storage/tools) -"tTp" = ( -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 10 - }, -/obj/machinery/light/directional/east, -/obj/machinery/status_display/ai/directional/east, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/hallway/floor1/aft) "tTw" = ( /obj/effect/turf_decal/trimline/purple/warning{ dir = 8 @@ -76402,10 +76076,16 @@ /obj/structure/closet/emcloset, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard) +"tTy" = ( +/obj/machinery/status_display/ai/directional/east, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/hallway/floor1/fore) "tTB" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/statue/snow/snowman, -/turf/open/floor/fake_snow, +/turf/open/misc/snow/actually_safe, /area/station/hallway/floor2/fore) "tTC" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -76468,11 +76148,17 @@ /obj/effect/mapping_helpers/airlock/access/all/science/research, /turf/open/floor/iron/white, /area/station/science/lab) -"tUn" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/white, -/area/station/science/cytology) +"tUq" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/purple/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/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "tUx" = ( /obj/structure/chair{ dir = 1 @@ -76482,6 +76168,18 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/floor2/aft) +"tUF" = ( +/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/red/half{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/office) "tUG" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -76490,8 +76188,11 @@ /turf/open/floor/iron, /area/station/hallway/secondary/service) "tUT" = ( -/turf/closed/wall/r_wall, -/area/station/tcommsat/server/upper) +/obj/structure/railing{ + dir = 10 + }, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "tVa" = ( /obj/structure/table, /obj/item/folder/red{ @@ -76593,6 +76294,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron, /area/station/engineering/atmos) +"tWI" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/green/filled/corner, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/sign/departments/custodian/directional/north, +/obj/machinery/camera/autoname/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/floor3/fore) "tWK" = ( /obj/machinery/computer/operating{ dir = 1 @@ -76610,6 +76324,12 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) +"tWM" = ( +/obj/machinery/status_display/ai/directional/east, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/hallway/floor2/fore) "tWR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -76626,6 +76346,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor2/starboard/fore) +"tXB" = ( +/obj/effect/turf_decal/siding/white, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/science/cytology) "tXF" = ( /obj/machinery/power/shuttle_engine/propulsion/burst{ dir = 4 @@ -76641,11 +76372,20 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/railing/corner{ +/obj/structure/railing/corner/end/flip{ dir = 4 }, /turf/open/floor/iron, /area/station/cargo/miningdock) +"tXP" = ( +/obj/machinery/door/window/left/directional/north{ + name = "Hydroponics Garden"; + req_access = list("hydroponics") + }, +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/machinery/light/directional/west, +/turf/open/floor/grass, +/area/station/service/hydroponics) "tXR" = ( /obj/machinery/button/door/directional/north{ id = "visitation"; @@ -76666,11 +76406,34 @@ /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/wood/tile, /area/station/service/library) +"tXW" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/storage) +"tYa" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/machinery/status_display/ai/directional/east, +/turf/open/floor/grass, +/area/station/security/courtroom) "tYc" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) +"tYg" = ( +/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, +/turf/open/floor/iron/white, +/area/station/science/lower) "tYl" = ( /obj/machinery/door/poddoor/shutters/radiation/preopen{ id = "radshutnorth" @@ -76715,17 +76478,14 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"tZh" = ( -/obj/machinery/door/airlock/science{ - name = "Monkey Pen" +"tYW" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/all/science/genetics, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" +/turf/open/floor/iron/dark/side{ + dir = 8 }, -/area/station/science/genetics) +/area/station/hallway/floor4/fore) "tZq" = ( /obj/structure/chair/stool/directional/south, /obj/effect/turf_decal/stripes, @@ -76760,15 +76520,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/dark, /area/station/maintenance/floor4/starboard) -"tZR" = ( -/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, -/area/station/science/research/abandoned) "tZX" = ( /obj/machinery/door/airlock/security{ name = "Permabrig Visitation" @@ -76827,13 +76578,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/starboard/aft) -"uaH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash/graffiti, -/turf/open/floor/engine{ - icon_state = "podfloor_light" - }, -/area/station/maintenance/floor2/port/aft) "uaJ" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, @@ -76848,10 +76592,12 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron/white, /area/station/science/server) -"uaL" = ( -/obj/machinery/light/cold/no_nightlight/directional/west, -/obj/structure/flora/bush/sparsegrass/style_random, -/turf/open/floor/grass, +"uaV" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, /area/station/science/genetics) "uaX" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -76869,14 +76615,6 @@ /obj/machinery/duct, /turf/open/floor/iron/showroomfloor, /area/station/service/kitchen/diner) -"ubb" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/effect/turf_decal/siding/white/corner{ - color = null - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/rd) "ubi" = ( /obj/structure/railing/corner{ dir = 1 @@ -76915,6 +76653,15 @@ /obj/structure/table/reinforced, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) +"ubZ" = ( +/obj/effect/turf_decal/trimline/brown/arrow_ccw{ + dir = 10 + }, +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/iron/dark/side{ + dir = 10 + }, +/area/station/cargo/lobby) "ucf" = ( /obj/effect/turf_decal/tile/blue/anticorner, /turf/open/floor/iron/textured_corner{ @@ -76940,15 +76687,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/wood/tile, /area/station/science/xenobiology/hallway) -"ucx" = ( -/obj/effect/turf_decal/siding/white{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/research_director, -/turf/open/floor/iron/large, -/area/station/command/heads_quarters/rd) "ucA" = ( /turf/open/space/openspace, /area/space) @@ -76960,27 +76698,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/neon/simple/pink/nodots, /area/station/maintenance/floor2/port/fore) -"ucD" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/structure/chair/office/light, -/obj/effect/landmark/start/geneticist, -/turf/open/floor/iron, -/area/station/science/genetics) "ucN" = ( /obj/machinery/door/poddoor/massdriver_chapel, /turf/open/floor/mineral/silver, /area/station/service/chapel/funeral) -"ucO" = ( -/obj/effect/turf_decal/trimline/brown/arrow_ccw{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/cargo/lobby) "ucS" = ( /obj/structure/railing/corner{ dir = 1 @@ -76992,18 +76713,6 @@ /obj/structure/cable, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port/fore) -"ucW" = ( -/obj/effect/turf_decal/trimline/green/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/green/line, -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/floor1/port/aft) "ucY" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -77048,17 +76757,22 @@ /obj/machinery/light/red/dim/directional/east, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/fore) +"udF" = ( +/obj/effect/turf_decal/tile/green/anticorner{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/side{ + dir = 5 + }, +/area/station/hallway/secondary/exit/escape_pod) "udU" = ( /obj/machinery/door/firedoor/heavy, /obj/effect/turf_decal/delivery, /obj/structure/cable, /turf/open/floor/iron/textured_large, /area/station/maintenance/disposal/incinerator) -"udV" = ( -/obj/effect/spawner/structure/window, -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/station/maintenance/floor2/port/aft) "udZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -77070,6 +76784,11 @@ }, /turf/open/floor/plating/foam, /area/station/maintenance/floor2/starboard/fore) +"uek" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/station/hallway/secondary/service) "uep" = ( /obj/structure/railing/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -77151,14 +76870,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor3/port) -"ueY" = ( -/obj/machinery/door/airlock/science{ - name = "Changing Room" - }, -/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/lower) "ufl" = ( /turf/closed/wall, /area/station/commons/storage/art) @@ -77172,6 +76883,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/medical/abandoned) +"uft" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Security - Warden's Office" + }, +/obj/structure/bed/dogbed/mcgriff, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/mob/living/basic/pet/dog/pug/mcgriff, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/warden) "ufI" = ( /obj/machinery/firealarm/directional/south, /obj/machinery/camera/directional/south{ @@ -77220,10 +76944,6 @@ /obj/structure/table/wood, /turf/open/floor/bamboo/tatami/black, /area/station/commons/storage/art) -"ufZ" = ( -/obj/structure/cable, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/fore) "ugb" = ( /obj/structure/marker_beacon/burgundy, /obj/effect/turf_decal/trimline/brown/warning{ @@ -77234,6 +76954,13 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) +"ugn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/wood/tile, +/area/station/command/heads_quarters/captain/private) "ugp" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -77275,6 +77002,11 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port) +"ugU" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/cargo/storage) "ugV" = ( /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/starboard/aft) @@ -77298,30 +77030,6 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"uhn" = ( -/obj/machinery/light/directional/east, -/turf/open/openspace, -/area/station/hallway/floor2/fore) -"uho" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/commons/vacant_room/commissary) -"uhp" = ( -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 8 - }, -/obj/structure/closet/emcloset, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/entry) "uhr" = ( /obj/effect/spawner/structure/window/hollow/reinforced/directional{ dir = 1 @@ -77353,6 +77061,14 @@ }, /turf/open/floor/iron/checker, /area/station/commons/vacant_room/commissary) +"uhC" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 1; + piping_layer = 2 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/pumproom) "uhF" = ( /obj/machinery/light/small/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -77375,13 +77091,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) -"uid" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/cold/directional/north, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron, -/area/station/science/robotics/lab) "uif" = ( /obj/effect/decal/cleanable/greenglow, /turf/open/floor/pod/light, @@ -77394,6 +77103,10 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/white/herringbone, /area/station/medical/patients_rooms) +"uim" = ( +/obj/structure/closet/crate/mod, +/turf/open/floor/iron/dark/smooth_large, +/area/station/science/robotics/lab) "uit" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Access" @@ -77490,6 +77203,14 @@ /obj/structure/stairs/east, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) +"ujl" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 1; + piping_layer = 4 + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/pumproom) "ujr" = ( /obj/effect/turf_decal/trimline/green/warning{ dir = 8 @@ -77550,18 +77271,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"ukm" = ( -/obj/machinery/seed_extractor, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/research/abandoned) -"uko" = ( -/obj/structure/table, -/obj/item/pai_card, -/turf/open/floor/iron/checker, -/area/station/commons/vacant_room/commissary) "ukr" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -77573,6 +77282,10 @@ /obj/structure/grille, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) +"ukI" = ( +/obj/structure/flora/tree/jungle/small/style_2, +/turf/open/floor/grass, +/area/station/science/genetics) "ukK" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 10 @@ -77608,13 +77321,11 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"ulj" = ( -/obj/machinery/button/crematorium{ - id = "crematorium_chapel"; - pixel_y = 27 - }, -/turf/open/floor/carpet/orange, -/area/station/service/chapel/funeral) +"ulo" = ( +/obj/structure/closet/emcloset, +/obj/effect/landmark/start/hangover/closet, +/turf/open/floor/iron, +/area/station/commons/fitness) "ulp" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -77671,16 +77382,13 @@ }, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) -"umf" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 1 +"umb" = ( +/obj/machinery/door/window/left/directional/south{ + name = "Pen 6"; + req_access = list("xenobiology") }, -/obj/effect/turf_decal/trimline/purple/filled/line, -/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/hallway) +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "umg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -77705,6 +77413,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/large, /area/station/command/heads_quarters/qm) +"umC" = ( +/obj/effect/turf_decal/trimline/blue/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 8 + }, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) "umG" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 @@ -77737,6 +77457,19 @@ /obj/structure/table/reinforced, /turf/open/floor/iron/kitchen/herringbone, /area/station/service/kitchen) +"una" = ( +/obj/effect/turf_decal/siding/wideplating_new/corner{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating_new/corner{ + dir = 1 + }, +/obj/machinery/light/cold/no_nightlight/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "unb" = ( /obj/structure/cable, /obj/machinery/holopad, @@ -77775,14 +77508,6 @@ /obj/item/bedsheet/patriot, /turf/open/floor/wood/large, /area/station/security/prison/safe) -"unA" = ( -/obj/structure/cable, -/obj/machinery/light/no_nightlight/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port) "unC" = ( /obj/effect/turf_decal/bot, /obj/effect/spawner/random/structure/crate, @@ -77790,6 +77515,20 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/smooth, /area/station/cargo/warehouse) +"unE" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/start/scientist, +/obj/structure/disposalpipe/segment, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/science/breakroom) "unQ" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer{ dir = 4; @@ -77817,16 +77556,6 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/holding_cell) -"uoG" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/iron/white, -/area/station/science/cytology) "uoS" = ( /obj/effect/turf_decal/siding/wood{ dir = 9 @@ -77834,18 +77563,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/tile, /area/station/service/library/printer) -"uoW" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber{ - 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/engine/airless, -/area/station/engineering/atmos/pumproom) "uph" = ( /obj/machinery/door/airlock/hatch{ name = "Elevator Shaft Access" @@ -77906,6 +77623,17 @@ }, /turf/open/floor/eighties, /area/station/commons/fitness/recreation/entertainment) +"uqv" = ( +/obj/effect/turf_decal/siding/wideplating_new{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 8 + }, +/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/cytology) "uqz" = ( /obj/structure/rack, /obj/effect/spawner/random/techstorage/service_all, @@ -77917,6 +77645,26 @@ /obj/structure/sign/poster/random/directional/west, /turf/open/floor/carpet/royalblue, /area/station/commons/dorms/apartment2) +"uqC" = ( +/obj/structure/table, +/obj/machinery/vending/wallmed/directional/west, +/turf/open/floor/iron/white, +/area/station/hallway/floor2/fore) +"uqF" = ( +/obj/structure/table, +/obj/machinery/button/ticket_machine{ + pixel_x = -32 + }, +/obj/item/stamp/head/hop{ + pixel_x = 8; + pixel_y = 5 + }, +/obj/item/flashlight/lamp{ + pixel_x = -4; + pixel_y = 3 + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hop) "uqT" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 6 @@ -77961,15 +77709,20 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos) -"urY" = ( -/obj/effect/turf_decal/stripes{ - dir = 5 - }, -/obj/machinery/sparker/directional/north{ - id = "Xenobio" +"urS" = ( +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"usa" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Command - Research Director's Quarters #1" }, -/turf/open/floor/engine, -/area/station/science/cytology) +/obj/effect/baseturf_helper/reinforced_plating/ceiling, +/obj/machinery/newscaster/directional/west, +/obj/item/kirbyplants/random/dead/research_director, +/turf/open/floor/iron/large, +/area/station/command/heads_quarters/rd) "use" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 @@ -78004,12 +77757,6 @@ /obj/structure/cable, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) -"usk" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "usl" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -78017,6 +77764,13 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/office) +"usp" = ( +/obj/effect/turf_decal/trimline/blue/filled/end{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/office) "usq" = ( /obj/structure/bed, /obj/item/toy/talking/griffin, @@ -78024,13 +77778,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/wood/parquet, /area/station/maintenance/floor2/port/aft) -"usr" = ( -/obj/machinery/light/directional/east, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/hallway/floor2/aft) "ust" = ( /obj/item/radio/intercom/directional/south, /obj/structure/disposalpipe/segment{ @@ -78038,15 +77785,6 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/floor3/fore) -"usx" = ( -/obj/machinery/light/small/directional/west, -/obj/item/paper{ - default_raw_text = "The SM DOES IN FACT LOOP
The gas goes in from the top side of the SM, and comes out of the bottom side
once out of the SM and into the orange pipes it goes out into space.
The gas cools in space and then comes back to the filters to be put into the SM again.
Remember, the gas is not sent to space but is sent to a room north of the SM to be recycled. You'll need to set that up."; - name = "HOW TO SET UP THE SM" - }, -/obj/structure/table/reinforced, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "usB" = ( /obj/effect/turf_decal/tile/green{ dir = 4 @@ -78069,6 +77807,15 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard) +"usK" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor2/aft) "usN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -78109,17 +77856,12 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/fore) -"usZ" = ( -/obj/structure/closet/l3closet/virology, -/obj/machinery/light/cold/no_nightlight/directional/north, -/obj/effect/turf_decal/tile/green/opposingcorners, -/turf/open/floor/iron/white, -/area/station/medical/virology) "utl" = ( /obj/structure/closet/secure_closet/medical1, /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 }, +/obj/structure/noticeboard/directional/north, /turf/open/floor/iron/dark, /area/station/medical/virology) "utm" = ( @@ -78137,6 +77879,12 @@ }, /turf/open/floor/plating, /area/station/cargo/sorting) +"utw" = ( +/obj/item/kirbyplants/random, +/obj/machinery/light/small/directional/south, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/carpet/orange, +/area/station/service/chapel/funeral) "utE" = ( /obj/structure/closet/firecloset, /turf/open/floor/pod/light, @@ -78222,6 +77970,16 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port/aft) +"uuM" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) +"uuO" = ( +/turf/open/floor/iron/white/smooth_corner, +/area/station/commons/fitness/recreation) "uuU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -78273,16 +78031,6 @@ /obj/machinery/oven/range, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) -"uwb" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/light/cold/no_nightlight/directional/east, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark/side{ - dir = 6 - }, -/area/station/hallway/floor3/fore) "uwf" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -78352,9 +78100,6 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"uwU" = ( -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "uxf" = ( /obj/effect/spawner/structure/window/hollow/reinforced/directional, /obj/structure/cable, @@ -78430,6 +78175,14 @@ }, /turf/open/floor/iron, /area/station/engineering/lobby) +"uxZ" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/service/hydroponics) "uya" = ( /obj/structure/railing{ dir = 4 @@ -78490,6 +78243,7 @@ "uyS" = ( /obj/machinery/airalarm/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/catwalk_floor/iron_dark, /area/station/maintenance/floor3/starboard) "uyX" = ( @@ -78528,15 +78282,6 @@ /obj/structure/closet, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) -"uzw" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth_corner{ - dir = 4 - }, -/area/station/maintenance/floor2/starboard) "uzB" = ( /obj/structure/table/reinforced, /obj/item/screwdriver, @@ -78549,6 +78294,13 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor3/fore) +"uzH" = ( +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/machinery/light/cold/no_nightlight/directional/west, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "uzK" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -78603,35 +78355,29 @@ dir = 1 }, /area/station/hallway/secondary/exit/escape_pod) -"uAU" = ( -/obj/machinery/light/directional/west, -/obj/structure/table/reinforced, -/obj/item/flashlight/lamp, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/floor2/port/aft) "uAW" = ( /obj/structure/closet/secure_closet/medical2, /obj/effect/turf_decal/tile/blue/fourcorners, /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/iron/white, /area/station/medical/surgery/aft) -"uBp" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/west, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/service/library/lounge) "uBr" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 }, /turf/open/floor/iron, /area/station/hallway/floor3/fore) +"uBE" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) +"uBG" = ( +/obj/structure/rack, +/obj/item/soap, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/smooth_large, +/area/station/cargo/miningoffice) "uBN" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/effect/turf_decal/trimline/white/filled/line{ @@ -78659,25 +78405,13 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"uBW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/railing{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/starboard) -"uBX" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) +"uCb" = ( +/obj/effect/turf_decal/trimline/green/corner, +/obj/structure/sign/poster/official/random/directional/west, +/obj/machinery/light_switch/directional/north, +/obj/structure/closet/secure_closet/personal, +/turf/open/floor/iron/white/small, +/area/station/commons/fitness/recreation) "uCe" = ( /obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ dir = 4; @@ -78699,6 +78433,11 @@ }, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) +"uCn" = ( +/obj/structure/window/spawner/directional/south, +/obj/machinery/suit_storage_unit/rd, +/turf/open/floor/carpet/green, +/area/station/command/heads_quarters/rd) "uCo" = ( /obj/effect/spawner/structure/window/hollow/reinforced/directional{ dir = 1 @@ -78712,8 +78451,8 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/floor1/port/aft) "uCv" = ( @@ -78780,10 +78519,18 @@ /turf/open/floor/iron, /area/station/hallway/floor2/aft) "uDm" = ( -/obj/effect/spawner/random/structure/table_or_rack, -/obj/effect/spawner/random/trash/soap, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/starboard/fore) +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, +/obj/machinery/firealarm/directional/south, +/obj/machinery/light/directional/south, +/obj/effect/decal/cleanable/oil/streak, +/obj/effect/landmark/bitrunning/station_reward_spawn, +/turf/open/floor/iron/dark/smooth_large, +/area/station/bitrunning/den) "uDr" = ( /obj/machinery/light/small/directional/north, /obj/effect/decal/cleanable/dirt, @@ -78793,8 +78540,22 @@ /area/station/maintenance/floor1/port) "uDx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron/kitchen, /area/station/service/kitchen/abandoned) +"uDA" = ( +/obj/structure/chair/sofa/corp{ + dir = 8 + }, +/obj/machinery/camera/autoname/directional/east, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/station/command/meeting_room) +"uDB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor2/starboard) "uDD" = ( /obj/effect/turf_decal/trimline/white/line{ dir = 4 @@ -78821,6 +78582,12 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/hallway/secondary/exit/escape_pod) +"uDL" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/south, +/obj/machinery/suit_storage_unit/hos, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hos) "uDN" = ( /obj/machinery/door/airlock/engineering/glass/critical{ heat_proof = 1; @@ -78851,16 +78618,6 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat_interior) -"uDW" = ( -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/security/prison/safe) "uEb" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ @@ -78868,13 +78625,6 @@ }, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat/service) -"uEf" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) "uEo" = ( /obj/machinery/door/airlock/external{ name = "External Airlock" @@ -78883,6 +78633,26 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) +"uEu" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer2, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ + dir = 9 + }, +/obj/machinery/camera/preset/ordnance{ + c_tag = "Supermatter Waste"; + light_range = 0; + network = list("waste","engine") + }, +/turf/open/floor/engine/airless, +/area/station/engineering/supermatter/waste) +"uED" = ( +/obj/effect/turf_decal/tile/yellow/half, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/edge, +/area/station/engineering/atmos) "uEF" = ( /turf/closed/wall, /area/station/security/prison/work) @@ -78892,14 +78662,6 @@ }, /turf/open/floor/carpet/royalblack, /area/station/service/theater) -"uEI" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/machinery/duct, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "uEK" = ( /obj/effect/decal/cleanable/blood/tracks, /obj/structure/chair{ @@ -78954,29 +78716,15 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) -"uFy" = ( -/obj/effect/turf_decal/trimline/white/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/white/mid_joiner{ - dir = 8 - }, -/turf/open/floor/iron/smooth_large, -/area/station/hallway/secondary/entry) "uFI" = ( /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) -"uFL" = ( -/obj/machinery/light/cold/no_nightlight/directional/south, -/obj/machinery/status_display/ai/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor2/aft) +"uFO" = ( +/obj/structure/window/spawner/directional/south, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron/dark/textured, +/area/station/commons/fitness) "uFQ" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Bulkhead" @@ -79002,6 +78750,13 @@ /obj/effect/spawner/random/engineering/tool, /turf/open/floor/pod/light, /area/station/maintenance/department/engine/atmos) +"uGc" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/hallway/floor1/aft) "uGe" = ( /obj/structure/railing{ dir = 4 @@ -79013,6 +78768,13 @@ /obj/item/flashlight/lamp/green, /turf/open/floor/wood/tile, /area/station/service/library) +"uGt" = ( +/obj/effect/turf_decal/tile/green/half, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/secondary/exit/escape_pod) "uGO" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/right/directional/west{ @@ -79030,6 +78792,17 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) +"uGP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) "uGQ" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -79040,6 +78813,12 @@ /obj/machinery/vending/coffee, /turf/open/floor/iron/dark, /area/station/science/breakroom) +"uGT" = ( +/mob/living/simple_animal/bot/floorbot, +/obj/structure/cable, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) "uHa" = ( /obj/effect/turf_decal/tile/red, /turf/open/floor/iron/dark/side, @@ -79050,6 +78829,12 @@ }, /turf/open/floor/circuit/telecomms, /area/station/science/server) +"uHf" = ( +/obj/structure/mirror/directional/north, +/obj/structure/sink/directional/south, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/white, +/area/station/science/lower) "uHg" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -79098,6 +78883,16 @@ }, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"uHI" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/wood/parquet, +/area/station/service/lawoffice) "uHQ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -79121,6 +78916,10 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/xenobiology/hallway) +"uHZ" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "uIi" = ( /obj/effect/turf_decal/bot, /obj/machinery/portable_atmospherics/pump, @@ -79206,6 +79005,11 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/fore) +"uIL" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green, +/turf/open/floor/wood, +/area/station/command/meeting_room) "uIM" = ( /obj/machinery/light/red/dim/directional/west, /obj/effect/turf_decal/trimline/red/line{ @@ -79231,6 +79035,12 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/science/xenobiology/hallway) +"uJa" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/structure/sign/poster/random/directional/north, +/turf/open/floor/grass, +/area/station/service/bar/atrium) "uJb" = ( /obj/structure/grille, /turf/open/floor/pod/dark, @@ -79278,6 +79088,21 @@ }, /turf/open/floor/wood/tile, /area/station/command/heads_quarters/captain/private) +"uJD" = ( +/obj/structure/table/wood, +/obj/item/food/grown/banana/bunch, +/turf/open/floor/grass, +/area/station/science/genetics) +"uJE" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/turf_decal/siding/thinplating_new, +/obj/structure/water_source/puddle{ + pixel_y = 3 + }, +/obj/effect/landmark/start/hangover, +/obj/machinery/light/small/directional/west, +/turf/open/misc/beach/sand, +/area/station/hallway/secondary/entry) "uJG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -79292,6 +79117,15 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"uJN" = ( +/obj/machinery/computer/records/medical/laptop{ + dir = 1; + pixel_y = 4 + }, +/obj/structure/table/glass, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/iron/white, +/area/station/security/medical) "uJR" = ( /obj/effect/turf_decal/trimline/brown/warning{ dir = 4 @@ -79301,19 +79135,6 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) -"uJT" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/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/structure/cable, -/obj/effect/landmark/navigate_destination/library, -/turf/open/floor/wood/tile, -/area/station/service/library) "uJX" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -79344,6 +79165,7 @@ /area/station/maintenance/floor1/port) "uKt" = ( /obj/structure/cable/multilayer/multiz, +/obj/machinery/digital_clock/directional/north, /turf/open/floor/catwalk_floor, /area/station/hallway/floor1/fore) "uKz" = ( @@ -79398,6 +79220,23 @@ }, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) +"uKT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"uKW" = ( +/obj/effect/turf_decal/trimline/blue/line, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) "uLi" = ( /obj/effect/turf_decal/trimline/green/warning{ dir = 4 @@ -79422,15 +79261,20 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/aft) -"uLA" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 6 +"uLB" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + volume_rate = 200; + dir = 8; + initialize_directions = 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/service/hydroponics) +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer4{ + dir = 8 + }, +/turf/open/floor/engine/airless, +/area/station/engineering/supermatter/waste) "uLH" = ( /obj/structure/table/wood, /obj/item/modular_computer/laptop/preset/civilian, @@ -79494,11 +79338,6 @@ }, /turf/open/floor/carpet/red, /area/station/service/library/lounge) -"uMB" = ( -/obj/structure/table/wood, -/obj/structure/window/spawner/directional/south, -/turf/open/floor/carpet/green, -/area/station/command/heads_quarters/rd) "uMK" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 @@ -79536,6 +79375,13 @@ /obj/machinery/status_display/ai/directional/west, /turf/open/floor/wood/parquet, /area/station/service/lawoffice) +"uMU" = ( +/obj/structure/chair/sofa/bench{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) "uMW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -79553,26 +79399,19 @@ /obj/structure/closet/secure_closet/personal, /turf/open/floor/iron/dark, /area/station/commons/dorms/room4) +"uNd" = ( +/obj/structure/table, +/obj/item/stack/arcadeticket, +/obj/item/stack/arcadeticket, +/obj/machinery/light_switch/directional/west, +/turf/open/floor/eighties, +/area/station/commons/fitness/recreation/entertainment) "uNm" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, /obj/machinery/status_display/ai/directional/west, /turf/open/floor/circuit, /area/station/ai_monitored/command/nuke_storage) -"uNn" = ( -/obj/effect/turf_decal/trimline/brown/arrow_cw{ - dir = 1 - }, -/obj/machinery/door/firedoor/heavy, -/obj/effect/turf_decal/delivery, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/mid_joiner{ - dir = 1 - }, -/turf/open/floor/iron/textured_large, -/area/station/cargo/miningdock) "uNp" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 4 @@ -79650,6 +79489,18 @@ /obj/structure/dresser, /turf/open/floor/wood/large, /area/station/maintenance/floor4/starboard/aft) +"uOh" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/security/detectives_office) "uOl" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -79670,14 +79521,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod, /area/station/maintenance/floor4/starboard/aft) -"uOq" = ( -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) "uOx" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -79734,6 +79577,21 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"uOY" = ( +/obj/structure/railing{ + dir = 6 + }, +/turf/open/floor/grass, +/area/station/science/cytology) +"uPc" = ( +/obj/structure/bed/medical/anchored{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/sign/poster/official/random/directional/east, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/white/textured, +/area/station/medical/office) "uPd" = ( /turf/open/floor/iron/dark/side{ dir = 1 @@ -79769,6 +79627,19 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/catwalk_floor/iron, /area/station/cargo/miningdock) +"uPQ" = ( +/obj/effect/turf_decal/trimline/blue/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/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/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) "uPT" = ( /obj/machinery/firealarm/directional/east, /obj/machinery/camera/autoname/directional/east, @@ -79783,19 +79654,6 @@ /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/iron/dark/side, /area/station/hallway/secondary/entry) -"uPX" = ( -/obj/effect/turf_decal/trimline/red/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/red/line, -/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/dark, -/area/station/hallway/floor4/fore) "uPY" = ( /obj/machinery/light/red/dim/directional/south, /obj/effect/decal/cleanable/dirt, @@ -79812,28 +79670,11 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) -"uQo" = ( -/obj/structure/sign/poster/official/random/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor2/fore) "uQA" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat) -"uQB" = ( -/obj/structure/table, -/obj/item/storage/box/beakers{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/storage/box/syringes, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics) "uQD" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -79854,21 +79695,16 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard/aft) -"uQJ" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 10 - }, -/obj/structure/rack, -/obj/machinery/requests_console/directional/west{ - department = "Genetics"; - name = "Genetics Requests Console" +"uQK" = ( +/obj/structure/bed{ + dir = 4 }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/item/reagent_containers/dropper, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" +/obj/item/bedsheet/hop{ + dir = 4 }, -/area/station/science/genetics) +/obj/effect/landmark/start/head_of_personnel, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "uQL" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -79951,14 +79787,6 @@ /obj/item/storage/toolbox/mechanical, /turf/open/floor/wood, /area/station/commons/vacant_room/office) -"uRS" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/cable, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/catwalk_floor/iron, -/area/station/engineering/engine_smes) "uSm" = ( /obj/machinery/holopad, /obj/effect/turf_decal/trimline/blue, @@ -79970,10 +79798,6 @@ /obj/structure/cable/layer3, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat) -"uSr" = ( -/obj/structure/filingcabinet/security, -/turf/open/floor/wood, -/area/station/science/research/abandoned) "uSw" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/structure/cable, @@ -80007,6 +79831,21 @@ /obj/effect/landmark/blobstart, /turf/open/floor/iron, /area/station/security/prison) +"uTe" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/stripes/line, +/obj/item/assembly/flash, +/obj/item/restraints/handcuffs, +/obj/machinery/camera/directional/east{ + name = "Checkpoint - Engineering Deck" + }, +/obj/machinery/recharger, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/first) "uTh" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, @@ -80075,15 +79914,20 @@ /obj/machinery/light/directional/east, /turf/open/floor/carpet/royalblue, /area/station/commons/dorms/apartment2) -"uUb" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 +"uTX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 }, -/obj/machinery/light/cold/directional/east, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/airalarm/directional/south, /turf/open/floor/iron/white, -/area/station/medical/treatment_center) +/area/station/medical/office) +"uUg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/grass, +/area/station/science/genetics) "uUh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -80108,13 +79952,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) -"uUz" = ( -/obj/structure/chair/sofa/bench{ - dir = 1 - }, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) "uUE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -80165,6 +80002,12 @@ }, /turf/open/floor/iron/checker, /area/station/service/bar/atrium) +"uUY" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/smooth_large, +/area/station/science/robotics/lab) "uVh" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -80183,19 +80026,6 @@ /obj/structure/cable, /turf/open/floor/iron/chapel, /area/station/service/chapel) -"uVr" = ( -/obj/effect/turf_decal/trimline/red/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/red/line, -/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/dark, -/area/station/hallway/floor4/aft) "uVz" = ( /obj/effect/turf_decal/trimline/green/filled/arrow_cw{ dir = 1 @@ -80205,6 +80035,13 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured, /area/station/medical/virology/isolation) +"uVI" = ( +/obj/structure/closet/secure_closet/freezer/kitchen{ + req_access = list("bar") + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/checker, +/area/station/service/bar) "uVK" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/access/any/engineering/external, @@ -80219,6 +80056,21 @@ }, /turf/open/floor/iron/dark, /area/station/commons/storage/tools) +"uVM" = ( +/mob/living/basic/pet/penguin/emperor{ + desc = "Spaghetti."; + name = "Spaghetti" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"uVN" = ( +/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/side{ + dir = 1 + }, +/area/station/science/robotics/lab) "uVR" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/catwalk_floor, @@ -80233,18 +80085,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/tcommsat/computer) -"uVZ" = ( -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/hallway/floor2/fore) -"uWf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/purple/filled/line, -/turf/open/floor/iron/white, -/area/station/science/server) "uWi" = ( /obj/machinery/chem_master{ name = "Hydroanalysis Device" @@ -80307,13 +80147,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/dark, /area/station/security/execution/transfer) -"uWP" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/iron/dark/textured, -/area/station/commons/fitness) "uWU" = ( /obj/structure/falsewall, /turf/open/floor/iron/dark/smooth_large, @@ -80323,16 +80156,14 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/wood, /area/station/medical/psychology) -"uXj" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 +"uXi" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + 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/light/directional/west, -/turf/open/floor/iron, -/area/station/hallway/floor3/aft) +/obj/effect/turf_decal/stripes, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/white, +/area/station/science/auxlab/firing_range) "uXl" = ( /turf/open/floor/iron/showroomfloor{ name = "lab floor" @@ -80369,15 +80200,6 @@ /obj/machinery/vending/coffee, /turf/open/floor/iron/dark/smooth_large, /area/station/science/robotics/lab) -"uXD" = ( -/obj/effect/turf_decal/tile/green/anticorner{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/station/hallway/secondary/exit/escape_pod) "uXG" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -80409,15 +80231,6 @@ /obj/effect/mapping_helpers/ianbirthday, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) -"uXS" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/west, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/commons/dorms/apartment1) "uXX" = ( /turf/closed/wall, /area/station/commons/toilet) @@ -80448,14 +80261,6 @@ /obj/structure/emergency_shield/regenerating, /turf/open/floor/plating, /area/station/cargo/drone_bay) -"uYr" = ( -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/iron, -/area/station/service/chapel) "uYB" = ( /obj/effect/turf_decal/trimline/yellow/line{ dir = 1 @@ -80516,15 +80321,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/kitchen/diner) -"uZq" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/security/glass{ - name = "Security Entrance" - }, -/turf/open/floor/engine{ - icon_state = "textured_dark" - }, -/area/station/maintenance/floor2/starboard/aft) "uZr" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -80555,12 +80351,6 @@ }, /turf/open/floor/iron, /area/station/science/robotics/lab) -"vad" = ( -/obj/structure/rack, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/maintenance/radshelter/sci) "vae" = ( /obj/structure/ladder, /turf/open/floor/pod/dark, @@ -80603,6 +80393,16 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, /area/station/cargo/miningdock) +"vay" = ( +/obj/machinery/chem_master{ + name = "Hydroanalysis Device" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/sign/poster/random/directional/south, +/turf/open/floor/iron/white, +/area/station/cargo/miningdock) "vaA" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -80647,6 +80447,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) +"vaH" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/cigar, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/newscaster/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/iron/checker, +/area/station/service/bar/atrium) "vaN" = ( /obj/machinery/conveyor{ dir = 4; @@ -80656,17 +80466,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/plating, /area/station/service/chapel/funeral) -"vaQ" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 9 - }, -/obj/item/kirbyplants/random, -/obj/item/radio/intercom/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/server) "vaR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -80680,16 +80479,6 @@ /obj/structure/girder/reinforced, /turf/open/floor/plating, /area/station/engineering/atmos) -"vba" = ( -/obj/effect/turf_decal/trimline/blue/corner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server/upper) "vbg" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -80700,15 +80489,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/aft) -"vbx" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/cargo/sorting) "vbB" = ( /obj/effect/turf_decal/tile/green/opposingcorners{ dir = 8 @@ -80717,14 +80497,41 @@ /obj/machinery/holopad, /turf/open/floor/iron/checker, /area/station/commons/vacant_room/commissary) -"vbF" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/grass, -/area/station/science/xenobiology) +"vbD" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 1 + }, +/obj/structure/table, +/obj/item/dest_tagger{ + pixel_x = 7; + pixel_y = 5 + }, +/obj/item/folder/yellow, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/smooth, +/area/station/cargo/office) "vbP" = ( /obj/structure/flora/bush/flowers_yw/style_random, /turf/open/floor/grass, /area/station/science/genetics) +"vbQ" = ( +/obj/machinery/door/airlock/science{ + name = "Xenocytology" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/xenobio, +/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/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/science/cytology) "vbT" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/corner, @@ -80767,6 +80574,27 @@ /obj/structure/sink/kitchen/directional/west, /turf/open/floor/catwalk_floor/iron_white, /area/station/cargo/miningdock) +"vcT" = ( +/obj/structure/cable, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/trimline/white/arrow_ccw{ + dir = 4 + }, +/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/dark, +/area/station/hallway/secondary/entry) +"vdb" = ( +/obj/effect/turf_decal/trimline/white/arrow_cw{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/white/mid_joiner{ + dir = 8 + }, +/turf/open/floor/iron/smooth_large, +/area/station/hallway/secondary/entry) "vdc" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 4 @@ -80824,6 +80652,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/kitchen/diner) +"vej" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/port/fore) "veA" = ( /obj/structure/railing{ dir = 8 @@ -80880,6 +80714,15 @@ dir = 4 }, /area/station/service/chapel) +"vfc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/iron/chapel{ + dir = 1 + }, +/area/station/service/chapel) "vfi" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood, @@ -80897,15 +80740,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/white, /area/station/science/lab) -"vfU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor3/aft) "vfV" = ( /obj/item/radio/intercom/directional/east, /obj/item/stack/sheet/iron/fifty, @@ -80982,21 +80816,18 @@ /obj/machinery/air_sensor/nitrous_tank, /turf/open/floor/engine/n2o, /area/station/engineering/atmos) +"vgZ" = ( +/obj/structure/chair/sofa/bench{ + dir = 8 + }, +/turf/open/floor/iron/textured_large, +/area/station/cargo/storage) "vhd" = ( /obj/machinery/smartfridge, /obj/machinery/door/firedoor, /obj/machinery/duct, /turf/open/floor/plating, /area/station/service/kitchen) -"vhf" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/effect/turf_decal/siding/wideplating, -/obj/effect/turf_decal/siding/wideplating{ - dir = 1 - }, -/turf/open/floor/iron/dark/textured, -/area/station/medical/medbay/central) "vhj" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -81099,12 +80930,6 @@ dir = 1 }, /area/station/hallway/secondary/exit/departure_lounge) -"viV" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/green/opposingcorners, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/virology) "viZ" = ( /turf/open/floor/iron/dark/side{ dir = 10 @@ -81128,11 +80953,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/command/bridge) -"vjo" = ( -/turf/open/floor/iron/white/side{ - dir = 10 - }, -/area/station/hallway/floor2/fore) "vjp" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/kitchen, @@ -81155,10 +80975,6 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/wood/tile, /area/station/command/heads_quarters/captain/private) -"vjF" = ( -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) "vjJ" = ( /obj/machinery/door/airlock/wood{ name = "Bedroom" @@ -81179,16 +80995,19 @@ /obj/item/flashlight/flare/candle, /turf/open/floor/carpet/orange, /area/station/service/chapel/office) -"vka" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 +"vjT" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 10 }, -/obj/structure/table, -/obj/machinery/microwave, -/obj/effect/spawner/random/food_or_drink/donkpockets, -/obj/machinery/light/directional/east, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/white, -/area/station/medical/psychology) +/area/station/science/xenobiology/hallway) +"vjX" = ( +/obj/effect/turf_decal/trimline/purple/corner{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "vkb" = ( /turf/open/floor/iron/dark/side{ dir = 8 @@ -81199,6 +81018,19 @@ dir = 5 }, /area/station/security/office) +"vkr" = ( +/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/yellow/line, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Public Airlock" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) "vkz" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/tracks{ @@ -81241,19 +81073,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/dark, /area/station/maintenance/floor4/port) -"vlc" = ( +"vlf" = ( +/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, -/obj/effect/turf_decal/siding/wood/end{ - dir = 8 +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron/dark/corner{ + dir = 1 }, -/turf/open/floor/carpet/red, -/area/station/service/library/artgallery) +/area/station/security/prison) "vlh" = ( /obj/structure/fluff{ desc = "What, you think the water just magically soaks into the metallic flooring?"; - icon = 'icons/obj/lavaland/survival_pod.dmi'; + icon = 'icons/obj/mining_zones/survival_pod.dmi'; icon_state = "fan_tiny"; name = "shower drain" }, @@ -81327,12 +81159,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) -"vma" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/hallway/floor3/fore) "vmc" = ( /obj/machinery/door/airlock{ id_tag = "nsminingdorm3"; @@ -81343,13 +81169,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/cargo/miningdock) -"vmp" = ( -/obj/machinery/light/directional/east, -/obj/machinery/status_display/ai/directional/east, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/hallway/floor1/fore) "vmr" = ( /turf/closed/wall, /area/station/engineering/atmos/hfr_room) @@ -81383,22 +81202,6 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/floor2/aft) -"vmJ" = ( -/obj/effect/turf_decal/trimline/red/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/red/line, -/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 - }, -/obj/machinery/door/airlock/public/glass{ - name = "Public Airlock" - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/aft) "vmM" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/machinery/door/airlock/hatch{ @@ -81406,13 +81209,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"vmN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/starboard) "vmX" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -81478,6 +81274,17 @@ }, /turf/open/floor/iron/textured_large, /area/station/hallway/secondary/exit/departure_lounge) +"vnG" = ( +/obj/effect/turf_decal/siding/white/corner, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/white/corner{ + 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/white, +/area/station/science/xenobiology) "vnI" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/iron/dark, @@ -81560,22 +81367,12 @@ /obj/item/pen/survival, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port) -"vol" = ( -/obj/structure/rack, -/obj/machinery/light/directional/west, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/iron/white/textured_large, -/area/station/service/chapel/office) "vom" = ( /obj/structure/table, /obj/item/paper_bin, /obj/item/pen, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"vox" = ( -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/carpet/orange, -/area/station/service/chapel/funeral) "voA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -81596,6 +81393,13 @@ /obj/effect/turf_decal/siding/white, /turf/open/floor/iron/dark/textured, /area/station/medical/paramedic) +"voG" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 1 + }, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/fore) "voH" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured_corner{ @@ -81655,6 +81459,9 @@ /area/station/maintenance/floor4/starboard) "vpp" = ( /obj/structure/stairs/north, +/obj/structure/railing{ + dir = 8 + }, /turf/open/floor/iron, /area/station/hallway/secondary/service) "vpy" = ( @@ -81673,6 +81480,20 @@ /obj/effect/baseturf_helper/reinforced_plating/ceiling, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) +"vpD" = ( +/obj/structure/table, +/obj/item/restraints/legcuffs/beartrap{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/restraints/legcuffs/beartrap{ + pixel_x = 4; + pixel_y = 8 + }, +/obj/machinery/newscaster/directional/north, +/obj/effect/turf_decal/tile/green/full, +/turf/open/floor/iron, +/area/station/service/janitor) "vpE" = ( /obj/structure/table, /obj/item/folder/blue{ @@ -81685,16 +81506,6 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron/dark, /area/station/security/office) -"vpJ" = ( -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/iron/white, -/area/station/science/cytology) "vqb" = ( /obj/structure/bed{ dir = 4 @@ -81708,6 +81519,18 @@ }, /turf/open/floor/iron/dark/textured, /area/station/medical/surgery/aft) +"vqe" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/contraband/landmine, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/port) +"vqp" = ( +/obj/structure/closet/secure_closet/hydroponics, +/obj/effect/turf_decal/tile/green/full, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/service/hydroponics) "vqx" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -81771,16 +81594,6 @@ /obj/structure/marker_beacon/burgundy, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) -"vqZ" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/iron/textured_edge{ - dir = 4 - }, -/area/station/medical/chemistry) "vrh" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 4 @@ -81861,6 +81674,12 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/fore) +"vse" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/aft) "vsg" = ( /obj/structure/table/wood, /obj/item/folder/yellow{ @@ -81888,6 +81707,14 @@ dir = 8 }, /area/station/hallway/secondary/exit/departure_lounge) +"vsk" = ( +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/line, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/science/cytology) "vsn" = ( /obj/effect/turf_decal/trimline/purple/line{ dir = 1 @@ -81924,12 +81751,6 @@ }, /turf/open/floor/wood/large, /area/station/service/library/lounge) -"vsz" = ( -/obj/effect/turf_decal/tile/dark/half/contrasted, -/obj/effect/turf_decal/tile/dark/half/contrasted, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "vsK" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/showroomfloor, @@ -81976,14 +81797,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/carpet/red, /area/station/service/theater) -"vtd" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/carpet/red, -/area/station/service/theater) "vtj" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, @@ -82007,13 +81820,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/atmos/office) -"vtE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/west, -/obj/machinery/status_display/ai/directional/west, -/turf/open/floor/iron, -/area/station/hallway/floor1/aft) "vtH" = ( /obj/effect/turf_decal/trimline/white/filled/corner{ color = "#065C93"; @@ -82030,17 +81836,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/parquet, /area/station/medical/psychology) -"vtQ" = ( -/obj/effect/turf_decal/trimline/green/line, -/obj/effect/turf_decal/trimline/green/line{ - dir = 1 - }, -/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/hallway/floor3/aft) "vtS" = ( /obj/effect/turf_decal/tile/brown/fourcorners, /obj/machinery/computer/atmos_control/mix_tank, @@ -82055,6 +81850,15 @@ }, /turf/open/floor/iron, /area/station/hallway/floor1/aft) +"vud" = ( +/obj/machinery/firealarm/directional/west, +/obj/machinery/camera{ + c_tag = "Atmospherics Cam #4"; + dir = 8; + network = list("ss13","engine") + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "vuf" = ( /obj/effect/turf_decal/tile/red/fourcorners, /obj/effect/spawner/random/contraband/cannabis, @@ -82068,6 +81872,12 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"vuk" = ( +/obj/effect/turf_decal/trimline/green/filled/corner, +/obj/effect/decal/cleanable/dirt, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/wood/tile, +/area/station/service/library/lounge) "vuo" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark/side{ @@ -82105,13 +81915,6 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron/dark, /area/station/hallway/floor3/fore) -"vuH" = ( -/obj/effect/turf_decal/trimline/purple/line, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "vuI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -82136,6 +81939,16 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port/fore) +"vuQ" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 9 + }, +/obj/machinery/modular_computer/preset/cargochat/security{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/security/office) "vuV" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=2-13"; @@ -82166,16 +81979,34 @@ /obj/structure/flora/bush/lavendergrass/style_random, /turf/open/floor/grass, /area/station/service/library/garden) -"vvz" = ( -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 4 +"vvm" = ( +/obj/structure/closet{ + name = "janitorial supplies" }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 8 +/obj/item/pushbroom, +/obj/item/mop, +/obj/item/reagent_containers/cup/bucket, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/checker{ + dir = 1 + }, +/area/station/science/genetics) +"vvs" = ( +/obj/machinery/duct, +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, +/obj/structure/closet/radiation, +/turf/open/floor/plating, +/area/station/science/genetics) +"vvx" = ( +/obj/effect/mapping_helpers/airlock/access/any/service/hydroponics, /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/hydroponics/glass, /turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) +/area/station/service/hydroponics) "vvC" = ( /obj/structure/ladder, /obj/effect/turf_decal/stripes/white/box, @@ -82271,9 +82102,6 @@ /turf/open/floor/catwalk_floor/iron_dark, /area/station/maintenance/floor2/starboard/aft) "vwQ" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, /turf/open/floor/iron/dark/textured, /area/station/hallway/floor2/aft) "vwW" = ( @@ -82290,6 +82118,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/security/eva) +"vxq" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white, +/area/station/security/prison/safe) "vxx" = ( /turf/open/floor/iron/dark/textured_edge{ dir = 1 @@ -82321,9 +82159,12 @@ /area/station/science/explab) "vxL" = ( /obj/structure/table/glass, -/obj/item/storage/medkit/regular, -/obj/item/reagent_containers/syringe, /obj/item/radio/intercom/directional/south, +/obj/item/storage/box/bandages{ + pixel_y = 6; + pixel_x = -6 + }, +/obj/item/storage/medkit/regular, /turf/open/floor/iron/white, /area/station/security/medical) "vxT" = ( @@ -82390,14 +82231,12 @@ /obj/item/storage/secure/safe/directional/south, /turf/open/floor/mineral/plastitanium, /area/station/maintenance/floor2/starboard/aft) -"vyy" = ( -/obj/machinery/modular_computer/console/preset/cargochat/service{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) +"vyz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/station/commons/dorms/apartment2) "vyA" = ( /obj/effect/turf_decal/trimline/green/line{ dir = 4 @@ -82427,6 +82266,21 @@ /obj/effect/turf_decal/tile/green/full, /turf/open/floor/iron/dark, /area/station/service/hydroponics) +"vyJ" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/line{ + dir = 8 + }, +/obj/machinery/door/firedoor/heavy, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor{ + elevator_linked_id = "com_vator"; + elevator_mode = 1 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor3/fore) "vyK" = ( /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/white/textured_large, @@ -82466,15 +82320,10 @@ /obj/structure/cable, /turf/open/floor/iron/white/textured_large, /area/station/service/chapel/office) -"vzl" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/obj/machinery/firealarm/directional/south, -/obj/machinery/light/cold/directional/south, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) +"vyZ" = ( +/obj/effect/turf_decal/trimline/brown/arrow_ccw, +/turf/open/floor/iron/dark/side, +/area/station/cargo/lobby) "vzu" = ( /obj/effect/landmark/start/psychologist, /obj/structure/sign/poster/official/random/directional/south, @@ -82505,24 +82354,28 @@ /obj/structure/cable, /turf/open/floor/pod/light, /area/station/maintenance/floor3/port/aft) +"vzN" = ( +/obj/structure/chair/sofa/middle/brown{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/hallway/secondary/entry) "vzO" = ( /obj/machinery/status_display/ai/directional/north, /turf/open/floor/iron/dark/side{ dir = 1 }, /area/station/hallway/floor3/fore) -"vzR" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/item/folder, -/obj/item/pen{ - pixel_x = -2; - pixel_y = 5 +"vzP" = ( +/obj/effect/turf_decal/trimline/blue/arrow_cw{ + dir = 4 }, -/obj/machinery/light/cold/no_nightlight/directional/east, -/obj/item/infuser_book, -/turf/open/floor/iron, -/area/station/science/genetics) +/obj/effect/turf_decal/trimline/blue/arrow_ccw{ + dir = 8 + }, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/fore) "vzS" = ( /obj/structure/table/wood/poker, /turf/open/floor/carpet/green, @@ -82532,6 +82385,22 @@ /obj/structure/bookcase/random/fiction, /turf/open/floor/wood/large, /area/station/medical/virology/isolation) +"vzZ" = ( +/turf/open/misc/dirt/jungle, +/area/station/science/cytology) +"vAd" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/item/kirbyplants/photosynthetic{ + pixel_y = 10 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) "vAe" = ( /obj/machinery/newscaster/directional/west, /obj/effect/turf_decal/siding/wideplating{ @@ -82583,6 +82452,21 @@ /obj/effect/decal/cleanable/wrapping, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) +"vAP" = ( +/obj/machinery/modular_computer/preset/cargochat/service{ + dir = 8 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"vAS" = ( +/obj/effect/mapping_helpers/airlock/access/any/supply/mining, +/obj/machinery/door/airlock/multi_tile/public/glass{ + name = "Xenoflora" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/textured_large, +/area/station/cargo/miningdock) "vAU" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 @@ -82596,14 +82480,6 @@ }, /turf/open/floor/carpet/red, /area/station/service/theater) -"vAX" = ( -/obj/effect/turf_decal/trimline/purple/line, -/obj/item/radio/intercom/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "vBa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -82682,16 +82558,8 @@ linked_elevator_id = "com_vator"; range = 2 }, -/turf/open/openspace, +/turf/open/floor/plating/elevatorshaft, /area/station/hallway/floor2/fore) -"vCm" = ( -/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/lower) "vCy" = ( /obj/effect/spawner/random/structure/table_fancy, /obj/structure/sign/painting/large/library_private{ @@ -82738,11 +82606,15 @@ "vDo" = ( /turf/open/floor/plating/foam, /area/station/maintenance/floor3/starboard/fore) -"vDz" = ( -/obj/machinery/vending/wardrobe/sec_wardrobe, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/lockers) +"vDu" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer2{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark/side, +/area/station/engineering/atmos) "vDC" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark/corner{ @@ -82804,16 +82676,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"vEw" = ( -/obj/effect/turf_decal/trimline/green/line, -/obj/effect/turf_decal/trimline/green/line{ - dir = 1 - }, -/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/dark, -/area/station/hallway/floor3/fore) "vEx" = ( /turf/open/floor/iron/textured_corner{ dir = 1 @@ -82833,22 +82695,19 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor3/port/aft) -"vEZ" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 5 +"vES" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/trimline/green/corner{ +/obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/service/bar) -"vFB" = ( -/turf/open/floor/engine, -/area/station/science/cytology) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/iron/dark, +/area/station/security/brig) "vFC" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 4 @@ -82899,6 +82758,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) +"vGt" = ( +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/structure/railing/corner/end{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/aft) "vGv" = ( /obj/machinery/vending/boozeomat, /obj/structure/window/reinforced/spawner/directional/south, @@ -82925,29 +82794,6 @@ dir = 8 }, /area/station/security/prison) -"vGP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) -"vGQ" = ( -/obj/machinery/computer/rdconsole{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/requests_console/directional/east{ - department = "Research Lab"; - name = "Research Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/ore_update, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/iron/dark, -/area/station/science/lab) "vGT" = ( /obj/structure/railing{ dir = 8 @@ -82957,19 +82803,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor3/port/fore) -"vGW" = ( -/obj/effect/turf_decal/trimline/red/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/red/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/junction{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/aft) "vHd" = ( /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -82979,13 +82812,6 @@ }, /turf/open/floor/carpet/royalblack, /area/station/service/theater) -"vHg" = ( -/obj/structure/cable, -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/hallway/floor1/fore) "vHi" = ( /obj/structure/cable, /turf/open/floor/iron/dark, @@ -83003,11 +82829,6 @@ }, /turf/open/floor/iron/grimy, /area/station/science/xenobiology/hallway) -"vHn" = ( -/obj/machinery/light/cold/no_nightlight/directional/east, -/mob/living/simple_animal/slime, -/turf/open/floor/grass, -/area/station/science/xenobiology) "vHq" = ( /obj/effect/turf_decal/trimline/green/warning{ dir = 8 @@ -83048,7 +82869,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/modular_computer/console/preset/engineering{ +/obj/machinery/modular_computer/preset/engineering{ dir = 1 }, /obj/effect/turf_decal/tile/yellow/half/contrasted, @@ -83060,6 +82881,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) +"vIa" = ( +/obj/effect/turf_decal/trimline/purple/corner, +/turf/open/floor/iron/white, +/area/station/science/cytology) +"vIb" = ( +/obj/effect/turf_decal/trimline/white/line{ + dir = 8 + }, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/trimline/white/mid_joiner{ + dir = 8 + }, +/turf/open/floor/iron/smooth_large, +/area/station/hallway/secondary/entry) "vIe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/sign/poster/contraband/random/directional/east, @@ -83160,20 +82995,6 @@ /obj/structure/cable, /turf/open/floor/wood/tile, /area/station/service/library) -"vJw" = ( -/obj/structure/table/wood, -/obj/item/folder/red, -/obj/item/pen, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/security/interrogation) "vJC" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/girder, @@ -83186,6 +83007,17 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/carpet/royalblack, /area/station/service/theater) +"vJF" = ( +/obj/machinery/light/small/directional/north, +/obj/structure/table/reinforced/rglass, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/machinery/computer/records/medical/laptop{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "vJH" = ( /obj/effect/spawner/random/entertainment/arcade, /turf/open/floor/eighties, @@ -83237,12 +83069,23 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"vKH" = ( -/obj/effect/turf_decal/trimline/blue/line, -/obj/effect/decal/cleanable/oil, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server/upper) +"vKA" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"vKB" = ( +/obj/structure/chair/office/light{ + dir = 4 + }, +/obj/effect/turf_decal/siding/purple/corner{ + dir = 4 + }, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "vKY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -83270,17 +83113,6 @@ /obj/effect/decal/cleanable/xenoblood, /turf/open/floor/engine, /area/station/science/cytology) -"vLj" = ( -/obj/effect/spawner/random/decoration/generic, -/obj/structure/rack, -/obj/structure/railing{ - dir = 8 - }, -/obj/effect/turf_decal/stripes{ - dir = 9 - }, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor2/starboard) "vLx" = ( /obj/machinery/ai_slipper{ uses = 8 @@ -83338,6 +83170,10 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor1/port/fore) +"vMg" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor4/aft) "vMh" = ( /obj/machinery/firealarm/directional/north, /obj/effect/decal/cleanable/dirt, @@ -83376,11 +83212,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/plating, /area/station/maintenance/floor2/starboard/aft) -"vMJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark/textured, -/area/station/command/heads_quarters/ce) "vNa" = ( /obj/effect/decal/cleanable/blood/drip, /turf/open/floor/iron/chapel{ @@ -83409,22 +83240,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet/neon/simple/pink/nodots, /area/station/maintenance/floor2/port/fore) -"vNw" = ( -/obj/machinery/light/directional/west, -/obj/structure/sign/departments/vault/directional/west, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/hallway/floor4/aft) -"vNF" = ( -/obj/machinery/light/directional/west, -/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/chapel{ - dir = 8 - }, -/area/station/service/chapel) "vNM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -83477,6 +83292,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/cargo/warehouse) +"vOf" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/wood/large, +/area/station/service/kitchen/kitchen_backroom) "vOn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -83541,6 +83366,19 @@ }, /turf/open/floor/catwalk_floor/iron_dark, /area/station/ai_monitored/command/storage/eva) +"vOE" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/line, +/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/dark, +/area/station/hallway/floor4/aft) "vOK" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor/heavy, @@ -83600,6 +83438,11 @@ /obj/effect/spawner/structure/window/hollow/reinforced/directional, /turf/open/floor/plating, /area/station/service/chapel/office) +"vPC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/starboard) "vPE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -83628,15 +83471,6 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/freezerchamber) -"vPT" = ( -/obj/structure/chair/stool/bar/directional/east, -/obj/machinery/light/cold/no_nightlight/directional/west, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/obj/machinery/status_display/ai/directional/west, -/turf/open/floor/iron, -/area/station/science/auxlab) "vQb" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -83657,11 +83491,17 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/cafeteria, /area/station/engineering/atmos) -"vQo" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/machinery/light/small/directional/south, +"vQg" = ( +/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/yellow/line, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/obj/machinery/light/floor, /turf/open/floor/iron/dark, -/area/station/security/execution/education) +/area/station/hallway/floor1/aft) "vQs" = ( /obj/effect/turf_decal/siding/white/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -83682,22 +83522,12 @@ /obj/structure/window/spawner/directional/west, /turf/open/floor/grass, /area/station/hallway/secondary/exit/departure_lounge) -"vQB" = ( -/obj/machinery/light/directional/west, -/obj/structure/cable, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/wood, -/area/station/service/kitchen/diner) "vQR" = ( /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/dark/side{ dir = 1 }, /area/station/ai_monitored/command/nuke_storage) -"vQX" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/station/maintenance/floor3/port/fore) "vQZ" = ( /obj/machinery/door/airlock{ id_tag = "dorms_lux_2_bolts"; @@ -83708,6 +83538,29 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/commons/dorms/apartment2) +"vRa" = ( +/obj/structure/railing{ + 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/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/light/red/dim/directional/west, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor4/port/aft) +"vRb" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "vRj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, @@ -83729,13 +83582,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) -"vRp" = ( -/obj/machinery/light/directional/north, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/hallway/floor1/fore) "vRq" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -83752,15 +83598,6 @@ /obj/structure/disposalpipe/trunk/multiz, /turf/open/floor/plating, /area/station/maintenance/floor3/port/fore) -"vRI" = ( -/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/iron, -/area/station/science/research/abandoned) "vRO" = ( /turf/open/openspace, /area/station/hallway/floor4/aft) @@ -83770,6 +83607,13 @@ }, /turf/open/floor/plating, /area/station/construction) +"vRR" = ( +/obj/machinery/newscaster/directional/east, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/iron/checker, +/area/station/commons/vacant_room/commissary) "vRW" = ( /obj/effect/turf_decal/tile/blue/full, /obj/machinery/disposal/bin, @@ -83825,14 +83669,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/floor2/port) -"vSS" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/turf/open/floor/circuit/telecomms, -/area/station/tcommsat/server/upper) "vSW" = ( /obj/structure/sign/poster/official/moth_hardhat/directional/east, /obj/structure/rack, @@ -83884,12 +83720,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/dorms/room1) -"vTq" = ( -/obj/structure/railing, -/obj/structure/table, -/obj/effect/turf_decal/trimline/purple/warning, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/fore) "vTt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -83899,11 +83729,6 @@ }, /turf/open/floor/catwalk_floor/iron_dark, /area/station/cargo/drone_bay) -"vTF" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/smooth_half, -/area/station/maintenance/radshelter/sci) "vTL" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -83966,6 +83791,12 @@ /obj/item/canvas/twentyfour_twentyfour, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/floor3/aft) +"vUK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/half, +/area/station/engineering/atmos/hfr_room) "vUQ" = ( /obj/effect/turf_decal/siding/thinplating_new{ dir = 8 @@ -84051,11 +83882,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark/side, /area/station/security/prison) -"vVZ" = ( -/obj/effect/spawner/random/trash/mess, -/obj/machinery/light/small/red/directional/south, -/turf/open/floor/pod/light, -/area/station/maintenance/floor4/starboard) "vWa" = ( /obj/effect/turf_decal/trimline/yellow/line{ dir = 4 @@ -84070,6 +83896,18 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) +"vWg" = ( +/obj/machinery/computer/scan_consolenew{ + dir = 8 + }, +/obj/effect/turf_decal/siding/purple{ + dir = 5 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "vWj" = ( /obj/structure/railing{ dir = 1 @@ -84165,12 +84003,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) -"vXg" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ - dir = 8 - }, -/turf/open/floor/iron/dark/textured, -/area/station/medical/cryo) "vXh" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/green/line{ @@ -84241,6 +84073,10 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) +"vXY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/wood, +/area/station/service/kitchen/diner) "vYl" = ( /obj/effect/turf_decal/siding/wideplating, /obj/machinery/chem_heater/withbuffer, @@ -84252,40 +84088,25 @@ /obj/effect/mapping_helpers/requests_console/supplies, /turf/open/floor/iron/dark/textured, /area/station/medical/pharmacy) -"vYn" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/kitchen, -/area/station/command/heads_quarters/rd) -"vYr" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/blue/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/fore) "vYw" = ( /obj/effect/turf_decal/trimline/neutral/warning, /obj/effect/spawner/random/trash/moisture_trap, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/starboard/aft) -"vYx" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/obj/structure/rack, -/obj/item/stack/sheet/iron/ten, -/obj/item/circuitboard/machine/exoscanner, -/obj/item/circuitboard/machine/exoscanner, -/obj/item/circuitboard/machine/exoscanner, -/turf/open/floor/iron/corner, -/area/station/cargo/drone_bay) "vYD" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/structure/grille, /turf/open/floor/plating, /area/station/maintenance/floor1/port/aft) +"vYE" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "vYH" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible/layer1{ dir = 6 @@ -84412,19 +84233,24 @@ dir = 8 }, /area/station/hallway/floor1/fore) +"vZF" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "vZK" = ( /obj/effect/spawner/structure/window/hollow/end{ dir = 4 }, /turf/open/floor/plating, /area/station/maintenance/floor3/port/aft) -"vZV" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 1 +"wat" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ + dir = 8 }, -/turf/open/floor/engine, -/area/station/science/xenobiology) +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/dark/textured, +/area/station/medical/cryo) "wau" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -84433,19 +84259,20 @@ /turf/open/floor/iron, /area/station/hallway/floor2/aft) "waA" = ( -/obj/machinery/atmospherics/components/unary/cryo_cell{ +/obj/machinery/cryo_cell{ dir = 8 }, /obj/structure/sign/poster/official/random/directional/east, /turf/open/floor/iron/dark/textured, /area/station/medical/cryo) -"waB" = ( -/obj/effect/turf_decal/siding/wideplating, -/obj/structure/table/reinforced, -/obj/item/stack/sheet/mineral/plasma/five, -/obj/item/clothing/glasses/science, -/turf/open/floor/iron/dark/textured, -/area/station/medical/pharmacy) +"waI" = ( +/obj/effect/turf_decal/stripes, +/obj/machinery/atmospherics/components/binary/pump/off{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "waJ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -84472,12 +84299,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/department/engine/atmos) -"waZ" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/hallway/floor2/fore) "wba" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -84534,6 +84355,13 @@ /obj/effect/turf_decal/stripes, /turf/open/floor/iron, /area/station/maintenance/floor2/starboard/aft) +"wbR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/closet/radiation, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "wbS" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -84546,16 +84374,16 @@ }, /turf/open/space/openspace, /area/space) -"wcf" = ( -/obj/machinery/firealarm/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 +"wci" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 }, -/turf/open/floor/iron/dark, -/area/station/security/range) +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/restaurant_portal/bar, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/checker, +/area/station/service/bar/atrium) "wcm" = ( /obj/structure/chair{ dir = 1 @@ -84584,16 +84412,37 @@ /obj/machinery/light/warm/directional/west, /turf/open/floor/wood/tile, /area/station/science/xenobiology/hallway) -"wcw" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east{ - cell_type = /obj/item/stock_parts/cell/hyper +"wcA" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/table/glass, +/obj/item/paper_bin, +/obj/item/folder/white{ + pixel_x = -4; + pixel_y = 2 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 +/obj/item/folder/white{ + pixel_x = -4; + pixel_y = 2 }, -/turf/open/floor/iron/smooth_large, -/area/station/tcommsat/server) +/obj/item/folder/white{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/pen/red{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/pen{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/pen/blue{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/white/textured, +/area/station/medical/office) "wcC" = ( /obj/effect/spawner/random/trash/moisture_trap, /turf/open/floor/plating, @@ -84615,6 +84464,15 @@ dir = 1 }, /area/station/security/prison) +"wcG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/aft) "wcH" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -84687,20 +84545,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured, /area/station/medical/virology/isolation) -"wdl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"wdo" = ( -/obj/machinery/airalarm/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet/orange, -/area/station/service/chapel/funeral) "wdq" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -84743,6 +84587,22 @@ }, /turf/open/floor/iron, /area/station/cargo/miningdock) +"wdS" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/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/airalarm/directional/north, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) +"wdX" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/spawner/random/contraband/prison, +/turf/open/floor/carpet/neon/simple/pink/nodots, +/area/station/maintenance/floor2/port/fore) "wdZ" = ( /obj/machinery/conveyor{ dir = 6; @@ -84751,12 +84611,6 @@ /obj/structure/closet/crate/coffin, /turf/open/floor/plating, /area/station/service/chapel/funeral) -"wec" = ( -/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/floor1/aft) "weg" = ( /obj/structure/sign/poster/official/random/directional/east, /obj/structure/railing/corner{ @@ -84796,6 +84650,17 @@ }, /turf/open/floor/iron/smooth, /area/station/hallway/floor1/fore) +"weY" = ( +/obj/effect/turf_decal/trimline/purple/arrow_ccw, +/obj/machinery/door/firedoor/heavy, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/trimline/green/arrow_cw{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/textured_large, +/area/station/cargo/miningdock) "wfb" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -84854,6 +84719,14 @@ dir = 4 }, /area/station/command/bridge) +"wfG" = ( +/obj/machinery/plumbing/growing_vat{ + dir = 4 + }, +/obj/machinery/light/cold/no_nightlight/directional/south, +/obj/machinery/status_display/evac/directional/south, +/turf/open/misc/sandy_dirt, +/area/station/science/cytology) "wfI" = ( /obj/machinery/light_switch/directional/west, /turf/open/floor/wood, @@ -84862,13 +84735,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/commons/dorms/apartment2) -"wfS" = ( -/obj/effect/turf_decal/trimline/purple/warning, -/obj/machinery/airalarm/directional/north, -/obj/effect/spawner/random/structure/crate, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor2/starboard) "wfT" = ( /turf/closed/wall, /area/station/engineering/atmos/office) @@ -84888,16 +84754,6 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron/dark/smooth_half, /area/station/engineering/storage/tech) -"wgu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron/corner{ - dir = 4 - }, -/area/station/cargo/miningdock) "wgO" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -84937,6 +84793,12 @@ /obj/machinery/door/window/brigdoor, /turf/open/misc/sandy_dirt, /area/station/maintenance/floor1/starboard) +"whw" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/misc/dirt/jungle, +/area/station/science/cytology) "whF" = ( /obj/machinery/shower/directional/east, /turf/open/floor/catwalk_floor/iron_dark, @@ -84973,11 +84835,9 @@ /turf/open/floor/iron/dark, /area/station/hallway/floor4/aft) "whN" = ( -/obj/effect/turf_decal/stripes{ - dir = 9 - }, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/maintenance/floor1/starboard/fore) +/area/station/bitrunning/den) "whR" = ( /turf/closed/wall, /area/station/service/bar) @@ -85058,14 +84918,6 @@ }, /turf/open/floor/wood/large, /area/station/service/library/lounge) -"wix" = ( -/obj/structure/bed{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/white/textured, -/area/station/medical/office) "wiB" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/structure/cable, @@ -85174,6 +85026,12 @@ }, /turf/open/floor/iron, /area/station/hallway/floor1/fore) +"wjx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/hallway/floor3/aft) "wjy" = ( /obj/structure/rack, /obj/item/clothing/head/helmet/old, @@ -85254,17 +85112,19 @@ /obj/item/book/manual/chef_recipes, /turf/open/floor/iron, /area/station/security/prison) -"wlb" = ( -/obj/machinery/processor/slime, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/circuit, -/area/station/science/xenobiology) "wll" = ( /obj/effect/turf_decal/delivery, /obj/structure/sign/departments/science/alt/directional/north, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) +"wlo" = ( +/obj/structure/bed/medical/anchored{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/white/textured, +/area/station/medical/office) "wlq" = ( /obj/structure/flora/bush/sparsegrass/style_random, /obj/effect/decal/cleanable/glass, @@ -85286,19 +85146,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/open/floor/iron/dark, /area/station/engineering/atmos/pumproom) -"wlD" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/structure/sign/poster/official/report_crimes/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/security/detectives_office) "wlF" = ( /obj/effect/spawner/random/entertainment/arcade{ dir = 1 @@ -85438,6 +85285,7 @@ dir = 1 }, /obj/structure/sign/poster/official/random/directional/north, +/obj/structure/mannequin/skeleton, /turf/open/floor/iron/dark, /area/station/medical/morgue) "wmQ" = ( @@ -85481,6 +85329,19 @@ }, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"wnq" = ( +/obj/effect/baseturf_helper/reinforced_plating/ceiling, +/obj/machinery/light_switch/directional/south, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"wns" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat/hallway) "wnI" = ( /obj/structure/table, /obj/item/storage/toolbox/mechanical{ @@ -85490,6 +85351,18 @@ /obj/item/storage/toolbox/electrical, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) +"wnJ" = ( +/obj/structure/chair/sofa/bench{ + dir = 4 + }, +/obj/structure/sign/poster/official/random/directional/west, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/hallway/floor1/aft) "wnN" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -85526,43 +85399,12 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos/hfr_room) -"wob" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 4 - }, -/obj/effect/turf_decal/caution/red{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wideplating_new{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/maintenance/floor2/starboard) -"woi" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/aft) "won" = ( /obj/machinery/light/broken/directional/north, /obj/effect/decal/cleanable/ash, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/maintenance/floor4/starboard) -"wop" = ( -/obj/structure/rack, -/obj/item/toner/large, -/obj/item/toner/large, -/obj/item/toner/large, -/obj/item/toner/large, -/obj/item/toner/large, -/obj/machinery/airalarm/directional/east, -/obj/machinery/light/directional/east, -/turf/open/floor/bamboo/tatami/black, -/area/station/commons/storage/art) "woq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -85590,14 +85432,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"woB" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/structure/closet/firecloset, -/obj/machinery/duct, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "woE" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white/textured, @@ -85626,17 +85460,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) -"woZ" = ( -/obj/structure/table/wood, -/obj/item/plate/large{ - pixel_y = 2 - }, -/obj/item/food/pizza/dank{ - pixel_y = 6 - }, -/obj/structure/sign/poster/contraband/pwr_game/directional/east, -/turf/open/floor/carpet/purple, -/area/station/maintenance/floor1/port/aft) "wpa" = ( /obj/structure/railing/corner{ dir = 8 @@ -85646,13 +85469,14 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard/fore) -"wpc" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/bodycontainer/morgue{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/science/genetics) +"wpt" = ( +/obj/structure/railing/corner, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/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) "wpE" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 4 @@ -85719,6 +85543,19 @@ }, /turf/open/floor/carpet/green, /area/station/service/bar/atrium) +"wqx" = ( +/obj/effect/turf_decal/stripes/full, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/railing{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general, +/obj/machinery/door/poddoor/preopen{ + id = "Xenolab"; + name = "Test Chamber Blast Door" + }, +/turf/open/floor/engine, +/area/station/science/cytology) "wqD" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -85749,6 +85586,20 @@ dir = 8 }, /area/station/hallway/floor1/aft) +"wqP" = ( +/obj/machinery/computer/accounting{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hop) +"wqQ" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/modular_computer/preset/civilian{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "wqW" = ( /obj/effect/spawner/random/structure/tank_holder, /turf/open/floor/pod/light, @@ -85806,15 +85657,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark, /area/station/command/bridge) -"wsi" = ( -/obj/machinery/light/directional/south, -/obj/structure/sign/poster/official/random/directional/south, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side, -/area/station/security/checkpoint) "wsj" = ( /obj/structure/table, /obj/item/stock_parts/scanning_module{ @@ -85873,10 +85715,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/maintenance/floor2/starboard) -"wsL" = ( -/obj/structure/table/wood, -/turf/open/floor/bamboo/tatami/black, -/area/station/commons/storage/art) "wsO" = ( /obj/structure/table/wood, /obj/machinery/computer/libraryconsole{ @@ -85912,6 +85750,10 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor3/starboard/fore) +"wtg" = ( +/obj/machinery/light/floor, +/turf/open/floor/wood, +/area/station/service/kitchen/diner) "wth" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/small/directional/west, @@ -85964,6 +85806,14 @@ /obj/structure/cable, /turf/open/floor/carpet/green, /area/station/commons/dorms/apartment2) +"wtw" = ( +/obj/effect/turf_decal/siding/purple{ + dir = 9 + }, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "wtC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -86002,6 +85852,12 @@ }, /turf/open/floor/wood, /area/station/commons/dorms/apartment1) +"wuc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/dark_red/fourcorners, +/turf/open/floor/iron, +/area/station/security/brig) "wug" = ( /obj/effect/spawner/random/structure/girder, /turf/open/floor/plating, @@ -86056,12 +85912,6 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/white, /area/station/science/circuits) -"wuQ" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/hallway/floor4/aft) "wuZ" = ( /obj/structure/rack, /obj/effect/decal/cleanable/dirt, @@ -86091,11 +85941,29 @@ /area/station/hallway/floor2/fore) "wvg" = ( /obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, /turf/open/floor/pod/light, /area/station/maintenance/floor2/starboard) +"wvp" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/floor1/aft) "wvq" = ( /turf/open/floor/iron/dark, /area/station/command/teleporter) +"wvv" = ( +/obj/effect/turf_decal/trimline/purple/corner, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/machinery/light/cold/no_nightlight/directional/west, +/turf/open/floor/iron/white, +/area/station/science/lobby) "wvw" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -86143,19 +86011,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/textured_large, /area/station/hallway/secondary/exit/departure_lounge) -"wwm" = ( -/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/yellow/line, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 1 - }, -/obj/machinery/door/airlock/public/glass{ - name = "Public Airlock" - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor1/fore) "wwp" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, @@ -86194,15 +86049,6 @@ "wwL" = ( /turf/open/floor/engine/n2o, /area/station/engineering/atmos) -"wwM" = ( -/obj/machinery/light/directional/north, -/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/chapel{ - dir = 4 - }, -/area/station/service/chapel) "wwN" = ( /obj/effect/turf_decal/stripes{ dir = 8 @@ -86242,6 +86088,7 @@ /area/station/medical/psychology) "wwW" = ( /obj/machinery/airalarm/directional/east, +/obj/machinery/camera/emp_proof/directional/east, /turf/open/floor/iron, /area/station/engineering/atmos) "wxb" = ( @@ -86303,9 +86150,7 @@ /turf/open/floor/iron/dark/side, /area/station/hallway/floor1/fore) "wxF" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, +/obj/item/kirbyplants/organic/plant21, /obj/machinery/status_display/ai/directional/west, /turf/open/floor/iron/dark/side{ dir = 8 @@ -86377,12 +86222,6 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"wyr" = ( -/obj/structure/closet/emcloset, -/obj/machinery/light/directional/west, -/obj/effect/landmark/start/hangover/closet, -/turf/open/floor/iron, -/area/station/commons/fitness) "wys" = ( /obj/effect/turf_decal/tile/green/full, /obj/effect/decal/cleanable/dirt, @@ -86395,14 +86234,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/security/range) -"wyD" = ( -/obj/effect/turf_decal/tile/red/full, -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/textured_large, -/area/station/engineering/atmos) "wyE" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -86503,6 +86334,16 @@ /obj/structure/cable, /turf/open/floor/wood/parquet, /area/station/medical/break_room) +"wzO" = ( +/obj/structure/statue/silver/sec{ + desc = "Dedicated to those who died in the First Contact."; + name = "statue of a militia member" + }, +/obj/effect/turf_decal/siding/wood, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/light/small/directional/west, +/turf/open/floor/carpet/royalblack, +/area/station/service/library) "wzS" = ( /obj/structure/table, /obj/machinery/door/window/left/directional/north{ @@ -86517,6 +86358,12 @@ /obj/effect/spawner/random/aimodule/harmful, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload_foyer) +"wzY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/grime, +/obj/effect/spawner/random/trash/graffiti, +/turf/open/floor/pod/light, +/area/station/maintenance/floor2/port/aft) "wAa" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 4 @@ -86550,14 +86397,6 @@ dir = 8 }, /area/station/medical/chemistry) -"wAt" = ( -/obj/machinery/duct, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "wAz" = ( /obj/machinery/vending/autodrobe, /obj/machinery/light_switch/directional/east, @@ -86589,20 +86428,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/carpet/red, /area/station/service/theater) -"wAV" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber{ - dir = 4 - }, -/obj/machinery/camera/preset/ordnance{ - c_tag = "Supermatter Waste"; - network = list("waste","engine") - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer2, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ - dir = 9 - }, -/turf/open/floor/engine/airless, -/area/station/engineering/atmos/pumproom) "wBg" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/robot_debris/up, @@ -86614,6 +86439,13 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) +"wBB" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/effect/turf_decal/trimline/green/arrow_cw{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "wBF" = ( /obj/structure/closet/secure_closet/courtroom, /turf/open/floor/iron, @@ -86636,6 +86468,13 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/service/chapel) +"wCc" = ( +/obj/structure/stairs/north, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "wCk" = ( /obj/effect/decal/cleanable/glass, /turf/open/floor/plating/foam, @@ -86693,6 +86532,34 @@ dir = 8 }, /area/station/medical/chemistry) +"wCT" = ( +/obj/structure/chair/stool/directional/north, +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/maintenance/solars/starboard/fore) +"wDa" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/machinery/button/door/directional/west{ + id = "surg_b_privacy"; + name = "Surgery Privacy Shutters"; + req_access = list("medical") + }, +/obj/machinery/light_switch/directional/west{ + pixel_x = -24; + pixel_y = -10 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) "wDb" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, @@ -86706,33 +86573,11 @@ /obj/structure/table, /turf/open/floor/iron/checker, /area/station/commons/dorms/apartment1) -"wDg" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/scientist, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/science/breakroom) "wDh" = ( /obj/structure/sign/poster/official/random/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"wDi" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/white/arrow_ccw{ - 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/hallway/secondary/entry) "wDr" = ( /obj/structure/closet/emcloset, /obj/effect/decal/cleanable/dirt, @@ -86753,6 +86598,19 @@ "wDz" = ( /turf/open/openspace, /area/station/science/xenobiology/hallway) +"wDC" = ( +/obj/structure/table/reinforced/rglass, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/commons/dorms/room3) +"wDE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, +/area/station/security/range) "wDF" = ( /obj/structure/table, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -86767,21 +86625,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/maintenance/floor3/port/aft) -"wEw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/structure/table/glass, -/obj/machinery/reagentgrinder{ - pixel_x = -1; - pixel_y = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"wED" = ( -/obj/effect/decal/cleanable/confetti, -/obj/effect/turf_decal/siding/blue/corner, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/carpet/neon/simple/pink/nodots, -/area/station/maintenance/floor2/port/fore) "wEE" = ( /obj/effect/decal/cleanable/ash/large, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -86806,12 +86649,12 @@ /obj/structure/stairs/east, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/starboard/fore) -"wEU" = ( -/obj/machinery/light_switch/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"wES" = ( +/obj/item/stack/arcadeticket, +/obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, -/turf/open/floor/iron/half, -/area/station/engineering/atmos/hfr_room) +/turf/open/floor/eighties, +/area/station/commons/fitness/recreation/entertainment) "wEY" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, @@ -86858,6 +86701,15 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/cargo/storage) +"wFC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/effect/turf_decal/stripes, +/obj/machinery/door/window/right/directional/south{ + name = "containment Exterior"; + req_access = list("xenobiology") + }, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "wFK" = ( /obj/structure/cable, /obj/machinery/door/firedoor, @@ -86886,14 +86738,6 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/dark, /area/station/command/bridge) -"wFV" = ( -/obj/effect/landmark/start/captain, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/duct, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/captain/private) "wFW" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/structure/cable, @@ -86929,6 +86773,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) +"wGz" = ( +/obj/effect/turf_decal/trimline/green/line, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/structure/railing/corner/end, +/turf/open/floor/iron/dark, +/area/station/hallway/floor3/aft) "wGA" = ( /obj/structure/window/spawner/directional/north, /obj/structure/table/reinforced, @@ -86980,21 +86832,19 @@ "wGX" = ( /turf/open/floor/iron/dark, /area/station/security/warden) -"wGZ" = ( -/obj/structure/table, -/obj/item/restraints/legcuffs/beartrap{ - pixel_x = -4; - pixel_y = 2 +"wGY" = ( +/obj/effect/turf_decal/trimline/blue/line, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 }, -/obj/item/restraints/legcuffs/beartrap{ - pixel_x = 4; - pixel_y = 8 +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/public/glass{ + name = "Public Airlock" }, -/obj/machinery/newscaster/directional/north, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/green/full, -/turf/open/floor/iron, -/area/station/service/janitor) +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/aft) "wHa" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -87068,6 +86918,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/item/reagent_containers/syringe, /turf/open/floor/iron/white, /area/station/security/medical) "wHP" = ( @@ -87172,6 +87023,17 @@ "wIN" = ( /turf/open/openspace, /area/station/command/heads_quarters/rd) +"wIP" = ( +/obj/effect/turf_decal/stripes{ + dir = 10 + }, +/obj/machinery/portable_atmospherics/canister/hydrogen, +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "wIQ" = ( /obj/structure/closet/firecloset, /obj/machinery/light/directional/west, @@ -87199,6 +87061,15 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hos) +"wJf" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/sign/painting/library{ + pixel_x = 32 + }, +/turf/open/floor/wood/large, +/area/station/service/library/artgallery) "wJj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -87238,13 +87109,6 @@ }, /turf/open/floor/wood/tile, /area/station/command/heads_quarters/captain) -"wJx" = ( -/obj/structure/table/wood, -/obj/item/paint_palette, -/obj/item/paint_palette, -/obj/item/paint_palette, -/turf/open/floor/bamboo/tatami/black, -/area/station/commons/storage/art) "wJy" = ( /obj/structure/table/reinforced/rglass, /obj/effect/turf_decal/box/white, @@ -87385,7 +87249,6 @@ name = "External Airlock" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/external, -/obj/structure/cable, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -87414,14 +87277,6 @@ dir = 1 }, /area/station/engineering/lobby) -"wLb" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/structure/microscope, -/turf/open/floor/iron/white, -/area/station/science/cytology) "wLd" = ( /obj/structure/flora/bush/style_random, /turf/open/floor/grass, @@ -87469,6 +87324,7 @@ /area/station/science/auxlab) "wLy" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/pod, /area/station/maintenance/floor4/starboard/aft) "wLC" = ( @@ -87477,17 +87333,10 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"wLJ" = ( -/obj/effect/turf_decal/trimline/red/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/red/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/junction/flip, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/fore) +"wLD" = ( +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/kitchen, +/area/station/command/heads_quarters/rd) "wLK" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/engine, @@ -87500,16 +87349,21 @@ dir = 5 }, /area/station/security/prison) -"wLQ" = ( -/obj/structure/closet/secure_closet/security, -/turf/open/floor/iron/dark/textured, -/area/station/security/checkpoint/second) "wLV" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"wMf" = ( +/obj/effect/turf_decal/siding/purple{ + dir = 1 + }, +/obj/machinery/computer/scan_consolenew, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "wMr" = ( /obj/machinery/door/airlock{ id_tag = "dorms_3_bolts"; @@ -87623,10 +87477,6 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/catwalk_floor/iron, /area/station/cargo/storage) -"wNF" = ( -/obj/structure/ladder, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/fore) "wNH" = ( /obj/structure/railing{ dir = 8 @@ -87682,11 +87532,6 @@ dir = 1 }, /area/station/hallway/floor1/fore) -"wOp" = ( -/obj/machinery/light/directional/east, -/obj/structure/table/reinforced, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/floor3/fore) "wOt" = ( /obj/machinery/door/morgue{ name = "Confession Booth" @@ -87706,14 +87551,6 @@ /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard) -"wOx" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/maintenance/disposal) "wOy" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -87733,14 +87570,6 @@ /obj/structure/grille, /turf/open/floor/plating/airless, /area/station/service/chapel/funeral) -"wOP" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) "wPn" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -87777,32 +87606,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/wood/large, /area/station/command/heads_quarters/qm) -"wPN" = ( -/obj/structure/table, -/obj/item/grenade/chem_grenade/cleaner{ - pixel_x = -7; - pixel_y = 12 - }, -/obj/effect/turf_decal/tile/green/full, -/obj/item/grenade/chem_grenade/cleaner{ - pixel_x = -7; - pixel_y = 8 - }, -/obj/item/grenade/chem_grenade/cleaner{ - pixel_x = -7; - pixel_y = 4 - }, -/obj/item/storage/box/lights/mixed{ - pixel_x = 6; - pixel_y = 10 - }, -/obj/item/storage/box/lights/mixed{ - pixel_x = 6; - pixel_y = 8 - }, -/obj/item/reagent_containers/spray/cleaner, -/turf/open/floor/iron, -/area/station/service/janitor) "wPP" = ( /obj/structure/frame/computer{ dir = 4 @@ -87844,6 +87647,11 @@ dir = 1 }, /area/station/hallway/secondary/entry) +"wQh" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/flag/nanotrasen/directional/south, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hos) "wQo" = ( /turf/closed/wall, /area/station/security/prison/garden) @@ -87916,6 +87724,12 @@ /obj/effect/decal/cleanable/oil, /turf/open/floor/iron, /area/station/construction/mining/aux_base) +"wRp" = ( +/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) "wRD" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -87977,6 +87791,24 @@ }, /turf/open/floor/iron/dark, /area/station/security/office) +"wSc" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/supply/visible/layer4{ + dir = 4 + }, +/obj/effect/landmark/navigate_destination/incinerator, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"wSm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/floor, +/turf/open/floor/iron/textured_large, +/area/station/engineering/engine_smes) "wSw" = ( /obj/structure/closet/secure_closet/brig{ name = "Prisoner Locker" @@ -87992,6 +87824,17 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) +"wSG" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron, +/area/station/service/hydroponics) "wSP" = ( /obj/machinery/door/airlock{ name = "Escape Pod A" @@ -88019,14 +87862,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/bar/atrium) -"wTa" = ( -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "wTg" = ( /obj/structure/rack, /obj/item/clothing/under/trek/q, @@ -88042,6 +87877,11 @@ "wTj" = ( /turf/open/floor/iron/dark, /area/station/hallway/floor4/aft) +"wTp" = ( +/obj/structure/ladder, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "wTq" = ( /turf/open/openspace, /area/station/hallway/secondary/service) @@ -88052,13 +87892,6 @@ /obj/machinery/duct, /turf/open/floor/wood, /area/station/service/bar/atrium) -"wTA" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/status_display/ai/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/hallway/floor1/aft) "wTB" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/pod/dark, @@ -88078,6 +87911,13 @@ }, /turf/open/floor/iron/white, /area/station/science/circuits) +"wTO" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/science/genetics) "wTS" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -88089,21 +87929,17 @@ /obj/structure/sign/poster/contraband/random/directional/west, /turf/open/floor/carpet/green, /area/station/service/abandoned_gambling_den) +"wTV" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/engineering/atmos/project) "wTW" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/commons/dorms/apartment1) -"wUq" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/box, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/psychology) "wUu" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -88123,6 +87959,17 @@ dir = 1 }, /area/station/hallway/secondary/exit/escape_pod) +"wUB" = ( +/obj/item/book/manual/wiki/tcomms, +/obj/item/radio/off{ + pixel_y = 4 + }, +/obj/structure/table, +/obj/item/multitool, +/obj/item/storage/toolbox/electrical, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/smooth, +/area/station/tcommsat/computer) "wUF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -88203,6 +88050,10 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/pod/light, /area/station/maintenance/solars/starboard/aft) +"wVz" = ( +/obj/machinery/newscaster/directional/east, +/turf/open/floor/wood, +/area/station/service/kitchen/diner) "wVJ" = ( /obj/effect/turf_decal/tile/green{ dir = 4 @@ -88279,12 +88130,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/aft) -"wWn" = ( -/obj/machinery/light/cold/no_nightlight/directional/east, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/trimline/purple, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "wWo" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, @@ -88300,6 +88145,18 @@ /obj/effect/spawner/random/trash/grille_or_waste, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) +"wWJ" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 5 + }, +/obj/item/radio/intercom/directional/east, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/science/cytology) "wXi" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, @@ -88331,11 +88188,16 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard) -"wXy" = ( -/obj/machinery/airalarm/directional/north, -/mob/living/simple_animal/bot/cleanbot, +"wXC" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/science/lab) "wXD" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -88371,42 +88233,28 @@ /obj/structure/cable, /turf/open/floor/iron/smooth_large, /area/station/maintenance/disposal) -"wXY" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 8 +"wYd" = ( +/obj/effect/turf_decal/tile/blue/anticorner{ + dir = 1 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/side{ + dir = 9 }, +/area/station/ai_monitored/turret_protected/ai) +"wYp" = ( /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/white, -/area/station/science/lobby) -"wYl" = ( -/obj/effect/turf_decal/trimline/blue/line{ - dir = 4 +/obj/machinery/light/cold/no_nightlight/directional/north, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server/upper) +/turf/open/floor/iron, +/area/station/hallway/floor2/aft) "wYs" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) -"wYu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/table/reinforced, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark_blue/end{ - dir = 8 - }, -/obj/item/storage/toolbox/emergency, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/commons/storage/tools) "wYB" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -88428,11 +88276,6 @@ /obj/machinery/power/solar, /turf/open/floor/iron/solarpanel/airless, /area/station/solars/starboard/fore) -"wYL" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/fore) "wYM" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -88446,11 +88289,6 @@ /obj/structure/cable, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) -"wYU" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/grass, -/area/station/science/xenobiology) "wYW" = ( /obj/machinery/light/directional/west, /obj/effect/turf_decal/tile/red/half{ @@ -88460,12 +88298,6 @@ dir = 8 }, /area/station/security/brig) -"wZj" = ( -/obj/machinery/light/red/dim/directional/north, -/obj/structure/rack, -/obj/effect/spawner/random/engineering/material, -/turf/open/floor/pod/light, -/area/station/maintenance/floor2/port/fore) "wZt" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/effect/turf_decal/stripes/line{ @@ -88496,13 +88328,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) -"wZM" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/shieldgen, -/turf/open/floor/iron/corner{ - dir = 8 - }, -/area/station/cargo/miningdock) "wZS" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 4 @@ -88510,6 +88335,19 @@ /obj/structure/closet/emcloset, /turf/open/floor/iron, /area/station/hallway/floor3/fore) +"wZU" = ( +/obj/effect/turf_decal/trimline/white/line{ + dir = 4 + }, +/obj/structure/cable, +/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/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "wZZ" = ( /obj/item/wrench/medical, /obj/item/clothing/glasses/hud/health, @@ -88538,16 +88376,6 @@ dir = 1 }, /area/station/hallway/floor3/aft) -"xam" = ( -/obj/effect/turf_decal/trimline/white/line{ - dir = 8 - }, -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/trimline/white/mid_joiner{ - dir = 8 - }, -/turf/open/floor/iron/smooth_large, -/area/station/hallway/secondary/entry) "xap" = ( /obj/effect/spawner/random/maintenance/two, /turf/open/floor/pod/light, @@ -88562,6 +88390,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/showroomfloor, /area/station/commons/dorms/apartment1) +"xaN" = ( +/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/service/hydroponics) "xaW" = ( /obj/machinery/hydroponics/soil, /obj/item/cultivator, @@ -88601,6 +88437,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/side, /area/station/hallway/floor3/fore) +"xbx" = ( +/obj/structure/table/wood, +/obj/item/storage/wallet/random, +/obj/item/radio/intercom/directional/north, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) "xby" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/dark, @@ -88654,6 +88497,15 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"xbZ" = ( +/obj/structure/statue/gold/cmo{ + desc = "Dedicated to those who cured the plague of 2709." + }, +/obj/effect/turf_decal/siding/wood, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/light/small/directional/east, +/turf/open/floor/carpet/royalblack, +/area/station/service/library) "xcg" = ( /obj/machinery/door/firedoor/heavy, /obj/machinery/door/airlock/public/glass{ @@ -88664,12 +88516,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) -"xcq" = ( -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/components/binary/valve, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "xcw" = ( /obj/machinery/shieldgen, /turf/open/floor/plating, @@ -88753,13 +88599,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/iron/dark/textured, /area/station/medical/cryo) -"xcZ" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "xdc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -88776,16 +88615,52 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) +"xdE" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/stripes/end{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/white, +/area/station/science/ordnance/testlab) "xdJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/effect/turf_decal/trimline/purple/filled/corner, /turf/open/floor/iron/white, /area/station/science/lab) +"xdK" = ( +/obj/effect/turf_decal/trimline/blue/line, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/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/delivery, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/aft) "xdN" = ( /obj/effect/spawner/random/trash/mess, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) +"xdU" = ( +/obj/effect/turf_decal/trimline/green/line, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/public/glass{ + name = "Public Airlock" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/floor3/fore) "xdV" = ( /obj/machinery/vending/coffee, /obj/structure/extinguisher_cabinet/directional/north, @@ -88798,12 +88673,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"xeh" = ( -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/miningdock) +"xel" = ( +/obj/item/folder/blue, +/obj/item/paper/monitorkey, +/obj/effect/spawner/random/bureaucracy/pen, +/obj/structure/table, +/turf/open/floor/iron/smooth, +/area/station/tcommsat/computer) "xen" = ( /obj/structure/table/wood, /obj/item/folder/blue, @@ -88829,14 +88705,13 @@ dir = 8 }, /area/station/cargo/storage) -"xeI" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/directional/south, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/detectives_office/private_investigators_office) +"xeE" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/structure/sign/departments/rndserver/directional/west, +/turf/open/floor/iron/white, +/area/station/science/xenobiology/hallway) "xeM" = ( /obj/effect/turf_decal/trimline/green/warning{ dir = 1 @@ -88846,6 +88721,7 @@ }, /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/pod/dark, /area/station/maintenance/floor2/starboard) "xeO" = ( @@ -88884,6 +88760,18 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos) +"xfD" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/reagentgrinder{ + pixel_x = -1; + pixel_y = 8 + }, +/obj/structure/table/reinforced, +/obj/item/radio/intercom/directional/west, +/obj/item/clothing/glasses/science, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "xfE" = ( /obj/structure/cable, /obj/machinery/power/tracker, @@ -88908,15 +88796,20 @@ }, /turf/open/floor/wood, /area/station/service/theater) +"xfQ" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/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/dark/side{ + dir = 4 + }, +/area/station/science/robotics/lab) "xfT" = ( /turf/open/floor/plating, /area/station/maintenance/floor1/port) -"xfU" = ( -/obj/machinery/light/directional/south, -/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/dorms/apartment2) "xgb" = ( /obj/structure/chair{ dir = 4 @@ -89070,12 +88963,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/starboard/aft) -"xhI" = ( -/obj/machinery/door/firedoor/heavy, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/textured_large, -/area/station/cargo/miningdock) "xhJ" = ( /obj/structure/railing{ dir = 4 @@ -89088,11 +88975,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard) -"xhV" = ( -/obj/item/restraints/handcuffs, -/obj/structure/table/optable, -/turf/open/floor/iron/white/small, -/area/station/security/execution/education) "xhX" = ( /obj/structure/table, /obj/item/stack/sheet/iron/fifty, @@ -89101,6 +88983,14 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) +"xih" = ( +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer4{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/engine_access, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/waste) "xit" = ( /obj/structure/railing/corner{ dir = 4 @@ -89132,27 +89022,15 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) -"xiG" = ( -/obj/effect/turf_decal/trimline/red/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/line{ - dir = 8 - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/heavy, -/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/dark, -/area/station/hallway/floor4/aft) "xiK" = ( /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/floor2/port/aft) +"xiM" = ( +/turf/open/openspace, +/area/station/science/xenobiology) "xiO" = ( /obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer2{ dir = 4 @@ -89213,6 +89091,13 @@ "xjs" = ( /turf/open/floor/iron/dark/textured_half, /area/station/engineering/supermatter/room) +"xjI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/chapel{ + dir = 4 + }, +/area/station/service/chapel) "xjL" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -89247,6 +89132,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) +"xjZ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber{ + 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/engine/airless, +/area/station/engineering/supermatter/waste) "xkh" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -89295,6 +89192,16 @@ /obj/machinery/light/directional/north, /turf/open/floor/carpet/red, /area/station/service/theater) +"xkE" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners{ + dir = 1 + }, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/reagentgrinder, +/obj/structure/table, +/obj/structure/sign/poster/random/directional/east, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "xkN" = ( /obj/structure/flora/bush/sparsegrass/style_random, /obj/item/hatchet, @@ -89335,11 +89242,6 @@ /obj/structure/closet/secure_closet/personal/cabinet, /turf/open/floor/wood, /area/station/cargo/miningdock) -"xld" = ( -/obj/machinery/light/directional/east, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/floor3/aft) "xlj" = ( /obj/machinery/computer{ desc = "You'd think someone had left it in saltwater."; @@ -89385,15 +89287,11 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/dark/smooth_large, /area/station/service/kitchen/abandoned) -"xlO" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/item/kirbyplants/random, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/wood/tile, -/area/station/service/library) +"xlK" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/light/small/directional/west, +/turf/open/misc/grass, +/area/station/maintenance/floor1/starboard) "xmh" = ( /obj/structure/table, /obj/effect/turf_decal/tile/green/opposingcorners, @@ -89408,19 +89306,6 @@ }, /turf/open/floor/wood/tile, /area/station/service/library) -"xmG" = ( -/obj/effect/turf_decal/trimline/red/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/red/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/junction/flip{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor4/aft) "xmM" = ( /obj/effect/turf_decal/trimline/green/filled/end{ dir = 4 @@ -89439,9 +89324,12 @@ /turf/open/floor/wood, /area/station/service/kitchen/diner) "xng" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/obj/effect/decal/cleanable/blood/gibs/old, +/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/dark/textured, +/area/station/maintenance/floor2/starboard/aft) "xni" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 1 @@ -89485,11 +89373,6 @@ /obj/structure/closet/emcloset, /turf/open/floor/iron, /area/station/hallway/floor3/aft) -"xos" = ( -/obj/machinery/light/cold/no_nightlight/directional/east, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/dark/side, -/area/station/hallway/floor4/aft) "xot" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -89527,16 +89410,25 @@ /obj/item/food/cheese/wheel, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) -"xoS" = ( -/obj/machinery/light/no_nightlight/directional/east, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/port) "xoX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/white/herringbone, /area/station/medical/patients_rooms) +"xpi" = ( +/obj/structure/table/wood, +/obj/structure/sign/poster/official/random/directional/east, +/obj/item/storage/fancy/donut_box, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/station/command/meeting_room) +"xpk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/status_display/ai/directional/west, +/turf/open/floor/iron, +/area/station/hallway/floor3/aft) "xpt" = ( /turf/open/floor/mineral/plastitanium, /area/station/maintenance/floor2/starboard/aft) @@ -89664,6 +89556,15 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/engineering/supermatter/room) +"xqV" = ( +/obj/effect/turf_decal/trimline/white/arrow_ccw, +/obj/effect/turf_decal/trimline/red/corner, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/dark/side, +/area/station/hallway/secondary/entry) "xqY" = ( /obj/machinery/door/airlock/public{ name = "Showers" @@ -89706,13 +89607,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/engine, /area/station/maintenance/floor4/starboard/aft) -"xrs" = ( -/obj/machinery/computer/shuttle/mining{ - dir = 8 - }, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/wood/large, -/area/station/command/heads_quarters/qm) "xrB" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, @@ -89729,37 +89623,6 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/execution/education) -"xrP" = ( -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/structure/table/glass, -/obj/item/paper_bin, -/obj/item/folder/white{ - pixel_x = -4; - pixel_y = 2 - }, -/obj/item/folder/white{ - pixel_x = -4; - pixel_y = 2 - }, -/obj/item/folder/white{ - pixel_x = -4; - pixel_y = 2 - }, -/obj/item/pen/red{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/pen{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/pen/blue{ - pixel_x = 6; - pixel_y = 6 - }, -/turf/open/floor/iron/white/textured, -/area/station/medical/office) "xrY" = ( /obj/machinery/button/door/directional/north{ id = "survshop"; @@ -89929,6 +89792,11 @@ }, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/hallway/secondary/entry) +"xtR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/floor2/starboard/aft) "xtX" = ( /obj/machinery/door/airlock/medical{ name = "Storage" @@ -89984,23 +89852,6 @@ "xuv" = ( /turf/closed/wall/r_wall, /area/station/maintenance/floor2/starboard/fore) -"xuC" = ( -/turf/open/floor/catwalk_floor, -/area/station/hallway/floor2/fore) -"xuD" = ( -/obj/structure/table/reinforced, -/obj/item/book/manual/wiki/chemistry, -/obj/item/hand_labeler, -/obj/effect/turf_decal/siding/wideplating, -/turf/open/floor/iron/dark/textured, -/area/station/medical/pharmacy) -"xuI" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/psychology) "xuW" = ( /obj/effect/turf_decal/trimline/red/line, /obj/effect/turf_decal/trimline/white/warning, @@ -90053,19 +89904,6 @@ }, /turf/open/floor/iron/smooth_large, /area/station/hallway/secondary/entry) -"xvK" = ( -/obj/structure/table/reinforced/rglass, -/obj/item/clothing/gloves/latex, -/obj/item/clothing/glasses/science, -/obj/item/healthanalyzer, -/obj/item/clothing/glasses/hud/health, -/obj/machinery/requests_console/directional/north{ - department = "Virology"; - name = "Virology Requests Console" - }, -/obj/machinery/light/cold/no_nightlight/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/virology) "xvL" = ( /obj/machinery/atmospherics/components/trinary/mixer/flipped{ dir = 4 @@ -90272,15 +90110,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) -"xxY" = ( -/obj/effect/turf_decal/stripes{ - dir = 5 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Science - Cytology Containment" - }, -/turf/open/floor/engine, -/area/station/science/cytology) "xyb" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -90338,6 +90167,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard) +"xyO" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + 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/decal/cleanable/wrapping, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) "xyU" = ( /obj/effect/decal/cleanable/dirt, /obj/item/picket_sign, @@ -90375,11 +90215,6 @@ /obj/machinery/light/cold/no_nightlight/directional/west, /turf/open/floor/iron, /area/station/hallway/floor2/aft) -"xzG" = ( -/obj/machinery/camera/autoname/directional/east, -/obj/structure/flora/bush/sparsegrass/style_random, -/turf/open/floor/grass, -/area/station/science/genetics) "xzH" = ( /obj/effect/turf_decal/trimline/yellow/warning, /obj/structure/disposalpipe/segment, @@ -90400,24 +90235,13 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) -"xAb" = ( -/obj/effect/turf_decal/trimline/purple/line{ +"xzT" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, -/obj/machinery/light/cold/no_nightlight/directional/south, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 8 - }, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) -"xAg" = ( -/obj/machinery/light/directional/east, -/obj/machinery/status_display/ai/directional/east, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/hallway/floor2/fore) +/obj/machinery/light/small/directional/south, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/port) "xAk" = ( /obj/effect/turf_decal/trimline/neutral/warning{ dir = 4 @@ -90496,6 +90320,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/psychology) +"xBd" = ( +/obj/effect/turf_decal/trimline/neutral/filled/end, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron, +/area/station/hallway/floor2/fore) "xBe" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -90505,13 +90334,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/commons/dorms/apartment1) -"xBq" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/bodycontainer/morgue/beeper_off{ - dir = 1 - }, -/turf/open/floor/iron/dark/textured, -/area/station/medical/morgue) "xBt" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/effect/turf_decal/trimline/neutral/warning{ @@ -90543,24 +90365,10 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/holding_cell) -"xBX" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/machinery/duct, -/turf/open/floor/iron/chapel{ - dir = 8 - }, -/area/station/service/chapel) "xCg" = ( /obj/structure/curtain, /turf/open/floor/iron/showroomfloor, /area/station/commons/dorms/apartment2) -"xCk" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/hallway/floor1/aft) "xCl" = ( /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ dir = 4 @@ -90602,6 +90410,14 @@ }, /turf/open/floor/wood, /area/station/service/kitchen/diner) +"xCR" = ( +/obj/structure/table/reinforced, +/obj/structure/sign/poster/official/random/directional/south, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/effect/spawner/random/armory/rubbershot, +/obj/effect/spawner/random/armory/rubbershot, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "xCS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -90659,6 +90475,15 @@ }, /turf/open/floor/iron/white, /area/station/science/circuits) +"xDy" = ( +/obj/machinery/nuclearbomb/selfdestruct, +/obj/machinery/camera/motion/directional/south{ + c_tag = "Vault"; + network = list("vault") + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/circuit, +/area/station/ai_monitored/command/nuke_storage) "xDC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -90684,6 +90509,13 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"xDK" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "xDQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -90742,6 +90574,18 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) +"xEj" = ( +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/machinery/iv_drip, +/obj/machinery/light/cold/no_nightlight/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"xEl" = ( +/obj/machinery/computer/records/security, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hos) "xEn" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -90775,6 +90619,28 @@ /obj/effect/turf_decal/siding/thinplating_new/corner, /turf/open/floor/iron/smooth, /area/station/cargo/sorting) +"xEv" = ( +/obj/machinery/keycard_auth/directional/north{ + pixel_x = 9 + }, +/obj/machinery/button/door/directional/north{ + id = "cmo_privacy"; + name = "Robotics Privacy Control"; + pixel_x = -6; + pixel_y = 25; + req_access = list("cmo") + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/cmo) +"xEw" = ( +/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) "xEB" = ( /obj/structure/railing/corner{ dir = 1 @@ -90784,13 +90650,6 @@ dir = 1 }, /area/station/hallway/floor4/fore) -"xEF" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/obj/machinery/camera/directional/north, -/turf/open/floor/iron, -/area/station/service/hydroponics) "xEJ" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 @@ -90881,12 +90740,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/carpet/red, /area/station/service/theater) -"xFm" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/hallway/secondary/exit/departure_lounge) "xFo" = ( /obj/machinery/computer/monitor{ dir = 4 @@ -90907,6 +90760,27 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/checkpoint) +"xFH" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/bottle/syrup_bottle/korta_nectar{ + pixel_x = 5; + pixel_y = 16 + }, +/obj/item/reagent_containers/cup/bottle/syrup_bottle/liqueur{ + pixel_x = -5; + pixel_y = 16 + }, +/obj/item/reagent_containers/cup/bottle/syrup_bottle/caramel{ + pixel_y = 16 + }, +/obj/item/reagent_containers/cup/rag, +/obj/item/reagent_containers/cup/glass/coffee{ + pixel_x = -3; + pixel_y = 9 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, +/area/station/hallway/secondary/entry) "xFJ" = ( /obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible, /turf/open/floor/iron, @@ -90933,13 +90807,18 @@ /obj/machinery/duct, /turf/open/floor/pod/dark, /area/station/maintenance/floor4/port) -"xGk" = ( -/obj/structure/stairs/north, -/turf/open/floor/iron/white, -/area/station/science/cytology) "xGl" = ( /turf/open/floor/plating/foam, /area/station/maintenance/floor1/port/aft) +"xGu" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/hallway/floor2/aft) "xGx" = ( /turf/open/floor/plating, /area/station/medical/abandoned) @@ -90985,6 +90864,7 @@ "xHf" = ( /obj/structure/chair/wood, /obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/carpet/green, /area/station/service/abandoned_gambling_den) "xHg" = ( @@ -91015,6 +90895,13 @@ "xHA" = ( /turf/closed/wall, /area/station/maintenance/disposal) +"xHK" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "xHR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -91054,13 +90941,16 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "xIs" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/light/cold/directional/east, +/obj/effect/spawner/random/structure/tank_holder, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) +"xID" = ( +/obj/structure/closet/crate/freezer/blood, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light/small/directional/west, /turf/open/floor/iron/white, -/area/station/medical/treatment_center) +/area/station/medical/surgery/aft) "xIE" = ( /obj/structure/table_frame, /obj/item/stack/sheet/plastitaniumglass, @@ -91092,13 +90982,12 @@ }, /turf/open/floor/plating, /area/station/security/brig) -"xIX" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/machinery/vending/coffee, -/turf/open/floor/iron, -/area/station/hallway/floor3/aft) +"xJk" = ( +/obj/machinery/seed_extractor, +/obj/effect/turf_decal/tile/green/full, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics) "xJo" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/portable_atmospherics/canister/air, @@ -91176,6 +91065,13 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port) +"xJX" = ( +/obj/structure/table, +/obj/item/clothing/mask/cigarette/candy{ + pixel_x = 4 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/floor1/aft) "xKa" = ( /obj/effect/turf_decal/stripes/white/corner, /turf/open/floor/iron/dark/corner, @@ -91187,6 +91083,12 @@ /obj/machinery/light/blacklight/directional/south, /turf/open/floor/eighties, /area/station/commons/fitness/recreation/entertainment) +"xKj" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/science/cytology) "xKq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -91205,7 +91107,7 @@ /turf/open/space/openspace, /area/space) "xKy" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 8 }, /turf/open/floor/iron/dark, @@ -91274,19 +91176,24 @@ /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /turf/open/floor/plating, /area/station/hallway/floor3/fore) +"xLJ" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/dark, +/area/station/science/auxlab) +"xLO" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/maintenance/floor3/starboard/aft) "xLU" = ( /obj/effect/turf_decal/tile/purple/fourcorners, /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) -"xLV" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/machinery/light/small/directional/east, -/obj/machinery/duct, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/captain/private) "xLZ" = ( /obj/structure/railing{ dir = 1 @@ -91304,12 +91211,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"xMG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/power/port_gen/pacman, -/turf/open/floor/circuit/telecomms, -/area/station/tcommsat/server/upper) "xMH" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/machinery/door/airlock/hatch{ @@ -91368,7 +91269,6 @@ /obj/machinery/airalarm/directional/west, /obj/structure/cable, /obj/effect/turf_decal/tile/green/opposingcorners, -/obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/virology) "xND" = ( @@ -91432,22 +91332,16 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard/fore) -"xOa" = ( -/obj/machinery/light/directional/west, -/obj/structure/chair/sofa/corp/left{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +"xOd" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/siding/thinplating_new{ dir = 4 }, -/turf/open/floor/wood/tile, -/area/station/command/heads_quarters/captain/private) -"xOd" = ( -/obj/machinery/modular_computer/console/preset/civilian, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/cargo/drone_bay) +/obj/effect/decal/cleanable/dirt, +/obj/machinery/shieldgen, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/smooth, +/area/station/cargo/warehouse) "xOe" = ( /obj/machinery/light/cold/no_nightlight/directional/north, /turf/open/floor/engine, @@ -91472,13 +91366,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/dark, /area/station/security/prison) -"xOW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron/white, -/area/station/science/cytology) "xOY" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -91567,16 +91454,19 @@ /obj/effect/decal/cleanable/oil/streak, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) -"xQc" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/wood, -/area/station/service/theater) "xQg" = ( /obj/machinery/portable_atmospherics/canister/plasma, /obj/effect/turf_decal/bot, /obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron/dark/textured, /area/station/science/ordnance/storage) +"xQk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/commons/storage/primary) "xQo" = ( /obj/effect/turf_decal/siding/wood, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -91610,17 +91500,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port) -"xQU" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 9 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/large, -/area/station/command/gateway) +"xQL" = ( +/obj/structure/closet/emcloset/anchored, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/engineering/atmos/project) "xRf" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -91643,12 +91527,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/floor2/port/aft) -"xRp" = ( -/obj/machinery/light/directional/east, -/obj/item/cultivator/rake, -/obj/structure/flora/bush/sparsegrass/style_random, -/turf/open/floor/grass, -/area/station/service/library/garden) "xRs" = ( /obj/structure/rack, /obj/item/reagent_containers/spray/cleaner{ @@ -91665,6 +91543,14 @@ /obj/structure/marker_beacon/burgundy, /turf/open/space/openspace, /area/space/nearstation) +"xRH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/checker{ + dir = 1 + }, +/area/station/science/genetics) "xRJ" = ( /obj/effect/decal/cleanable/blood/old, /obj/item/screwdriver, @@ -91697,6 +91583,7 @@ dir = 4 }, /obj/structure/chair/sofa/bench/left, +/obj/machinery/digital_clock/directional/north, /turf/open/floor/iron, /area/station/cargo/lobby) "xSb" = ( @@ -91750,12 +91637,31 @@ /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/glass/reinforced, /area/station/service/library) +"xSM" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 8 + }, +/obj/structure/sign/poster/official/random/directional/east, +/turf/open/floor/wood, +/area/station/command/meeting_room) "xSQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/wood, /area/station/security/detectives_office) +"xSW" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/monkeycubes{ + pixel_x = -5 + }, +/obj/item/storage/box/monkeycubes, +/obj/item/storage/box/monkeycubes{ + pixel_x = 5 + }, +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/circuit, +/area/station/science/xenobiology) "xTa" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "aband_armour"; @@ -91776,12 +91682,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"xTF" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/station/security/prison/garden) "xTG" = ( /obj/machinery/door/firedoor/border_only{ dir = 1 @@ -91793,17 +91693,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/ordnance/testlab) +"xTH" = ( +/obj/structure/table/wood, +/obj/item/instrument/violin, +/obj/machinery/light/directional/west, +/turf/open/floor/wood/tile, +/area/station/commons/fitness/recreation) "xTI" = ( /obj/structure/transit_tube/curved/flipped, /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat) -"xTR" = ( -/obj/machinery/computer/monitor, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat/service) "xUc" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer2{ dir = 4 @@ -91814,13 +91715,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"xUj" = ( -/obj/structure/closet/secure_closet/hydroponics, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/turf_decal/tile/green/full, -/turf/open/floor/iron, -/area/station/service/hydroponics) "xUk" = ( /obj/structure/railing/corner{ dir = 1 @@ -91865,12 +91759,20 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "xVl" = ( -/mob/living/simple_animal/crab, +/mob/living/basic/crab, /obj/structure/railing{ dir = 1 }, /turf/open/misc/beach/sand, /area/station/hallway/floor2/fore) +"xVn" = ( +/obj/effect/decal/cleanable/garbage, +/obj/effect/decal/cleanable/vomit/old, +/obj/effect/turf_decal/trimline/purple/warning{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor2/starboard) "xVo" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle, /obj/structure/girder, @@ -91892,13 +91794,6 @@ /obj/structure/cable, /turf/open/floor/iron/white/textured_large, /area/station/service/chapel) -"xVJ" = ( -/obj/structure/table, -/obj/item/toy/cards/deck, -/obj/machinery/light/directional/south, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) "xVR" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/structure/cable, @@ -91923,6 +91818,14 @@ /obj/machinery/light/red/dim/directional/north, /turf/open/floor/pod/dark, /area/station/maintenance/floor4/starboard) +"xVX" = ( +/obj/effect/turf_decal/trimline/white/arrow_ccw, +/obj/effect/turf_decal/trimline/red/warning, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side, +/area/station/hallway/secondary/entry) "xWe" = ( /turf/closed/wall/r_wall, /area/station/science/auxlab) @@ -92077,17 +91980,21 @@ }, /turf/open/floor/carpet, /area/station/commons/vacant_room/office) +"xXF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor2/starboard) "xXK" = ( /obj/machinery/airalarm/directional/north, /turf/open/floor/wood/large, /area/station/service/library/artgallery) -"xXY" = ( -/obj/machinery/newscaster/directional/west, -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/iron/checker, -/area/station/commons/vacant_room/commissary) +"xXU" = ( +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/dark/side, +/area/station/hallway/floor2/fore) "xYb" = ( /obj/structure/railing{ dir = 1 @@ -92107,9 +92014,6 @@ "xYg" = ( /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/fore) -"xYm" = ( -/turf/open/floor/wood, -/area/station/service/theater) "xYo" = ( /turf/closed/wall, /area/station/hallway/secondary/exit/departure_lounge) @@ -92175,6 +92079,10 @@ /obj/machinery/atmospherics/pipe/multiz/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/hallway/floor1/aft) +"xYO" = ( +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) "xYQ" = ( /obj/structure/railing/corner{ dir = 1 @@ -92197,18 +92105,6 @@ }, /turf/open/floor/iron, /area/station/engineering/lobby) -"xYY" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/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, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/science/robotics/lab) "xZb" = ( /obj/structure/chair/comfy{ dir = 8 @@ -92271,15 +92167,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"xZS" = ( -/obj/structure/table/wood, -/obj/item/radio/intercom/directional/east, -/obj/machinery/fax{ - fax_name = "Quartermaster's Office"; - name = "Quartermaster's Fax Machine" - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/qm) +"xZX" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/light/cold/no_nightlight/directional/west, +/obj/structure/rack, +/obj/item/soap/nanotrasen, +/turf/open/floor/iron, +/area/station/science/cytology) "yag" = ( /obj/effect/turf_decal/tile/green/half{ dir = 4 @@ -92289,11 +92183,23 @@ dir = 1 }, /area/station/hallway/secondary/entry) -"yau" = ( -/obj/item/kirbyplants/random, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/carpet/orange, -/area/station/service/chapel/funeral) +"yal" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/curtain/cloth, +/obj/structure/closet/secure_closet/personal/patient, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/wood/parquet, +/area/station/medical/patients_rooms) +"yaq" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 10 + }, +/obj/effect/turf_decal/siding/white/corner{ + dir = 4 + }, +/obj/machinery/light/cold/no_nightlight/directional/west, +/turf/open/floor/iron/white, +/area/station/science/cytology) "yaK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -92321,6 +92227,13 @@ /obj/item/storage/secure/safe/directional/east, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) +"yba" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/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/west, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "ybe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -92394,19 +92307,6 @@ "ybL" = ( /turf/open/floor/plating/airless, /area/station/maintenance/disposal) -"ybP" = ( -/obj/structure/chair/sofa/bench{ - dir = 4 - }, -/obj/structure/sign/poster/official/random/directional/west, -/obj/machinery/light/directional/west, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/hallway/floor1/aft) "ybQ" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor/heavy, @@ -92433,18 +92333,6 @@ dir = 1 }, /area/station/security/office) -"ycc" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/ai_monitored/command/storage/eva) "ycg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /turf/open/floor/circuit/telecomms, @@ -92487,19 +92375,20 @@ /obj/effect/landmark/navigate_destination/chapel, /turf/open/floor/iron/chapel, /area/station/service/chapel) -"ydj" = ( -/obj/effect/turf_decal/trimline/blue/line{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server/upper) "ydm" = ( /turf/open/floor/plating, /area/station/construction/mining/aux_base) "ydt" = ( /turf/closed/wall/r_wall, /area/station/cargo/miningoffice) +"ydG" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/bodycontainer/morgue/beeper_off{ + dir = 1 + }, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/dark/textured, +/area/station/medical/morgue) "ydL" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -92521,6 +92410,12 @@ /obj/structure/flora/bush/lavendergrass/style_random, /turf/open/floor/grass, /area/station/security/courtroom) +"yee" = ( +/obj/structure/chair/office, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "yef" = ( /obj/structure/railing, /obj/effect/turf_decal/stripes, @@ -92583,16 +92478,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron/checker, /area/station/service/bar/atrium) -"yeS" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/turf_decal/trimline/white/filled/line{ - color = "#065C93" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/command/bridge) "yeU" = ( /obj/structure/grille, /turf/open/floor/plating, @@ -92607,6 +92492,13 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard) +"yfm" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "yfn" = ( /obj/structure/table/wood, /obj/item/pen, @@ -92633,6 +92525,21 @@ dir = 10 }, /area/station/security/prison/garden) +"yfs" = ( +/obj/structure/sign/directions/dorms/directional/north{ + dir = 2 + }, +/obj/structure/railing/corner, +/turf/open/floor/iron/smooth, +/area/station/hallway/floor4/aft) +"yft" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/item/wrench, +/turf/open/floor/iron/dark/textured_corner, +/area/station/engineering/supermatter) "yfx" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, @@ -92649,6 +92556,14 @@ /obj/effect/decal/cleanable/confetti, /turf/open/floor/eighties, /area/station/commons/fitness/recreation/entertainment) +"yfT" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/button/curtain{ + id = "theater"; + pixel_x = -26 + }, +/turf/open/floor/wood, +/area/station/service/theater) "yfU" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/brigdoor/right/directional/north{ @@ -92678,6 +92593,16 @@ /obj/machinery/light/small/red/directional/north, /turf/open/floor/engine, /area/station/maintenance/floor1/starboard/fore) +"ygn" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/reagent_dispensers/plumbed{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "ygq" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 9 @@ -92687,18 +92612,14 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron, /area/station/engineering/atmos) -"ygC" = ( -/obj/effect/turf_decal/trimline/blue/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"ygH" = ( +/obj/machinery/door/firedoor/heavy, /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/dark, -/area/station/hallway/floor2/fore) +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/engineering/lobby) "ygI" = ( /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark, @@ -92706,17 +92627,20 @@ "ygT" = ( /turf/open/floor/wood, /area/station/service/bar/atrium) -"yhn" = ( -/obj/machinery/light/cold/no_nightlight/directional/north, +"ygU" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, /obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/button/door/directional/north{ - id = "rdoffice"; - name = "Privacy Control"; - pixel_y = 34; - req_access = list("rd") +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/office/light{ + dir = 8 }, /turf/open/floor/iron/white, -/area/station/command/heads_quarters/rd) +/area/station/science/xenobiology) "yhr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -92741,9 +92665,16 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron, /area/station/service/hydroponics) +"yhM" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat/hallway) "yhO" = ( /obj/machinery/suit_storage_unit/engine, /obj/structure/window/spawner/directional/east, +/obj/machinery/incident_display/delam/directional/south, /turf/open/floor/iron/dark/textured_corner{ dir = 1 }, @@ -92753,6 +92684,10 @@ /obj/effect/spawner/random/trash/hobo_squat, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) +"yhT" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/turf/open/floor/plating, +/area/station/science/xenobiology) "yhX" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured_half{ @@ -92762,17 +92697,6 @@ "yhZ" = ( /turf/open/floor/iron/dark/smooth_large, /area/station/service/library/printer) -"yib" = ( -/obj/machinery/modular_computer/console/preset/cargochat/engineering, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating_new, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/lobby) "yil" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -92794,6 +92718,17 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/floor2/aft) +"yiA" = ( +/mob/living/basic/pig{ + desc = "The best friend of any cytologist."; + name = "Oug" + }, +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/floor/grass, +/area/station/science/cytology) "yiB" = ( /obj/machinery/status_display/ai/directional/south, /obj/structure/disposalpipe/segment{ @@ -92817,6 +92752,7 @@ /area/station/service/library/artgallery) "yiV" = ( /obj/effect/landmark/blobstart, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/grass/fairy, /area/station/maintenance/floor2/port/fore) "yiZ" = ( @@ -92832,13 +92768,6 @@ /obj/structure/sign/poster/contraband/random/directional/east, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) -"yjG" = ( -/obj/machinery/rnd/production/circuit_imprinter/department/science, -/obj/effect/turf_decal/bot, -/obj/machinery/light/cold/no_nightlight/directional/south, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/iron/dark, -/area/station/science/lab) "yjJ" = ( /obj/effect/turf_decal/siding/wideplating_new/dark/corner, /turf/open/floor/engine/co2, @@ -92891,6 +92820,13 @@ /obj/effect/spawner/random/trash/graffiti, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port/fore) +"ykn" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/psychology) "yko" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -92911,6 +92847,14 @@ dir = 4 }, /area/station/hallway/floor3/aft) +"ykC" = ( +/obj/structure/closet/crate/internals, +/obj/effect/turf_decal/trimline/dark_blue/end{ + dir = 8 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/commons/storage/tools) "ykL" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/firecloset/full, @@ -92937,12 +92881,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/service) -"ykW" = ( -/obj/machinery/computer/records/security, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hos) "ykZ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -93008,6 +92946,18 @@ }, /turf/open/floor/iron/textured_large, /area/station/hallway/secondary/exit/departure_lounge) +"ylG" = ( +/obj/machinery/modular_computer/preset/cargochat/engineering, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/lobby) "ylK" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=3-4"; @@ -106782,10 +106732,10 @@ eSx dcG dRY dcG -xYo dcG xYo dcG +dcG dRY dcG eSx @@ -107039,9 +106989,9 @@ ref wZH ref sAa -ecO -eQa -ecO +fsv +hYo +fsv qUo ref wZH @@ -107283,7 +107233,7 @@ hpI hpI hpI hpI -nfk +xTH nqj oQy qSf @@ -107536,9 +107486,9 @@ hpI hpI hpI hpI -mqQ +pLY mFp -mKn +fGP mSM nhf nqj @@ -107546,7 +107496,7 @@ oWe rpr tCS nqj -lRO +taW xYo bIG ycy @@ -107562,7 +107512,7 @@ eSX ylE qiy hhx -rdZ +rKc bfX tqx svs @@ -107791,9 +107741,9 @@ imY lBR hpI jZE -lEC -mdB +jSj mdB +qmg mGq mMr mUe @@ -108047,10 +107997,10 @@ hpI hpI aaV hpI -kfA -lMt -mhQ +ceL +uuO mhQ +sMk mGP mhQ naz @@ -108305,8 +108255,8 @@ hpI arE aVk kws -lNY -mme +kDK +mzB mme mme mme @@ -108317,7 +108267,7 @@ nhL nhL nhL ciK -usk +tzF xYo psK ycy @@ -108590,9 +108540,9 @@ ocn ycy nBW wBR -faW +xEw +jzc ePV -tAk xCS uRE mFP @@ -109086,7 +109036,7 @@ xLb xLb xLb hpI -atP +uCb aKc aLz xYo @@ -109106,7 +109056,7 @@ ehR wBR dbe gbU -nJp +gLK ciH wBR dzs @@ -109349,11 +109299,11 @@ aXN xYo dyQ cbG -rdY +pPJ wIC vsj tAz -lPR +nQT lPR iUP inq @@ -109614,7 +109564,7 @@ gdr jLI keF inq -rUr +cFF pqP oRw wBR @@ -109862,17 +109812,17 @@ fRA oJl xYo bor -xFm +dby bJo wbg mxT feR dby -xFm +dby eYa inq tJj -qxO +reI vrk wBR bdN @@ -110373,7 +110323,7 @@ xLb imY snI hDy -pxG +lEy hpI voj axe @@ -110386,7 +110336,7 @@ tKe voj hJy xtY -nav +oWA xtY xtY qxr @@ -110887,7 +110837,7 @@ xLb hpI xgV rwM -fvI +hbs hpI dRs ohO @@ -110916,7 +110866,7 @@ ydm ydm ydm wBR -pvT +bgH hJy hJy hJy @@ -111156,7 +111106,7 @@ aYd nBn rUH rUH -bID +nTF rNO tSK hJy @@ -111399,7 +111349,7 @@ oic oic oic oic -bpz +xyO ayv oiF umg @@ -111409,13 +111359,13 @@ aQR nFK nFK nFK -udq +tJi mMt vZC sZI vZC oNP -lUh +cYZ hJy ofp hJy @@ -111664,7 +111614,7 @@ vsP iVL oKP eWV -vpb +arG vpb udq pBJ @@ -111687,7 +111637,7 @@ ydm ydm ydm wBR -cZW +giC ciW hJy kAY @@ -111917,15 +111867,15 @@ rLs aUJ vWF pxu -vmp +tTy grg mrU cim -dOL +vpb fGc pPe uPT -vmp +tTy hyD vWF crO @@ -112703,7 +112653,7 @@ eoQ hJy tns ciW -ciW +oeu uID eiM srO @@ -113459,7 +113409,7 @@ cdq bjI btV pxX -gIL +fNy lfj kyR oQx @@ -113467,7 +113417,7 @@ oQx oQx kyR lNQ -lkl +oKK sZI pSE kLH @@ -114234,9 +114184,9 @@ grg grg qaS jXY -ppf +gqU iIV -rzs +fzL qww jax hqv @@ -114484,14 +114434,14 @@ hmn oic oic kyR -qIc +iDZ geY lkh dQg hgE gKG btV -iIc +kyv jpM hJy hJy @@ -114746,9 +114696,9 @@ rhx rhx xBe rze -luK +gVw rpj -ppf +gqU uOT hJy fTb @@ -114997,15 +114947,15 @@ oic jrx ncc xPB -hyo +ncX xuX -nmb -ucO -bpU +ami +hem +ubZ xBe gVw rpj -ppf +gqU xWO hJy fZZ @@ -115253,17 +115203,17 @@ oic oic jrx ncc -pCi +pbF iir pxk aLo fbO -bdj +vyZ rhx gVw rpj -ppf -imJ +gqU +asF hJy hwt fqx @@ -115271,7 +115221,7 @@ qIM ffD hJy lMG -eIP +qIM qIM qIM qIM @@ -115491,13 +115441,13 @@ owI owI owI owI -oic -oic -whN -eul -iDJ +oyT +oyT +oyT +oyT +oyT bAh -oic +iDJ oic oic oic @@ -115515,11 +115465,11 @@ iir mJH jmB vSg -aiT +gmW jVS rUH hVB -ppf +gqU kAG hJy huk @@ -115748,14 +115698,14 @@ owI owI owI owI -oic -oic +oyT +oyT cDe -oic -bsq -bAh -htK -oic +ioi +oyT +oyT +oyT +oyT gUS nOj dzo @@ -115776,7 +115726,7 @@ prw rze rLs rpj -ppf +gqU vsv hJy hwt @@ -115784,10 +115734,10 @@ hwt hwt hJy icp -jQP +xFH inM pIH -fhW +eTr hJy vwB hJy @@ -116005,14 +115955,14 @@ owI owI owI owI -oic -oic +oyT +oyT lgs fCw brL erV uDm -oic +oyT rGF yiZ yiZ @@ -116033,7 +115983,7 @@ nsp rze kyR jZA -ppf +gqU gjy hJy hFW @@ -116044,7 +115994,7 @@ gQU cnj pka cnj -fjk +vzN hJy hJy hJy @@ -116262,14 +116212,14 @@ owI owI owI owI -oic -oic -sLq +oyT +oyT sLq +azj cBT owk jhP -oic +whN hBR qWJ qWJ @@ -116289,8 +116239,8 @@ dny txP nqX rPi -wOn -ppf +rpj +gqU lXX hJy bvU @@ -116519,19 +116469,19 @@ owI owI owI owI -oic -oic +oyT +oyT iaJ -oic -oic +pBA +htK nkT -oic -oic +eul +whN rYA eEB lUY bUC -yiZ +rYA yiZ mMH ncc @@ -116547,7 +116497,7 @@ nsB nRx fgN ohO -ppf +gqU kRg hJy hJy @@ -116571,7 +116521,7 @@ qsh qsh qsh qsh -qsh +ePY qsh qsh lCo @@ -116776,15 +116726,15 @@ owI owI owI owI -oic -oic -oic -oic +oyT +oyT +oyT +oyT +oyT +jAr +whN +oyT xOd -xxQ -ioi -aQK -fve fve aSL iCn @@ -116801,14 +116751,14 @@ nUM nAT mMd kFP -ffh +vbD rPi rpj -ppf +gqU imJ iWK brj -wTa +fJT uPU bDm pPh @@ -117039,7 +116989,7 @@ gHw yef gFU kHQ -mLq +hIj aQK vtj tLt @@ -117049,10 +116999,10 @@ wqF jUP gVm kYR -iyD +rIy jzP sAI -dMs +bXB npD nUM kFP @@ -117061,7 +117011,7 @@ dVQ jPv fgN rpj -ppf +gqU imJ kHs brj @@ -117296,7 +117246,7 @@ lyB yef wZu vTt -vYx +hai aQK pCW rhs @@ -117315,18 +117265,18 @@ lxU nsB mMd kFP -nyd +ehg rPi -rpj -ppf +wOn +gqU imJ -jFZ +gVw brj -tRp +cCd lIm -gXx -wDi -nQP +vcT +aiF +dvF rwn pkR xhA @@ -117342,7 +117292,7 @@ tEI tEI tEI tEI -tEI +rWV tEI tEI lCo @@ -117553,7 +117503,7 @@ gHw hDa fyg xxQ -elb +sbB aQK jUP prt @@ -117569,13 +117519,13 @@ idf oUH npD lyw -bzN +rNG dny gPr lju fgN rpj -ppf +gqU fhZ jQS brj @@ -117583,9 +117533,9 @@ btN bvG brj bWH -abn -ari -ddB +mor +rcT +jAB fYi brj uzn @@ -117814,7 +117764,7 @@ aQK aQK cfO jWJ -lWl +bsq mnk mnR aHb @@ -117827,17 +117777,17 @@ cUL cUL rPi rPi -mPn +bmx nvE nXl rPi rpj -ppf +gqU imJ gVw brj hFi -pZk +aln brj brj brj @@ -117847,12 +117797,12 @@ gmF brj brj brj -fmf +fnO jlx jDL oGc jlx -cCR +rXC brj xgH xgH @@ -118063,12 +118013,12 @@ owI owI cUL cUL -iwf +oKT xsL sqK rqB prm -jAr +gso gso qOr eoo @@ -118076,28 +118026,28 @@ myW myW myW myW -mnR +dkf bvf pxh cUL ovG -sNr +rMx oqW rPi rPi fgN rPi rPi -vRp -ppf +kEZ +gqU imJ qvy brj qGk -ftN +srC fpD oar -coU +uJE oYv oYA xsC @@ -118322,38 +118272,38 @@ rbQ uvv uEL qnq +ozs qnq qnq qnq -qnq -qnq +ozs kOQ vzv xNx -xNx +ugU xNx bwx mnR bvf pxh cUL -mVI +pVe xEp nrt sNr -ndf +sNr sNr sUC ncc jZA -ppf +gqU imJ gVw bsu qGk -ftN +srC cez -cup +clb lmG jbu usB @@ -118588,7 +118538,7 @@ oCK fgr cJt jfa -avJ +lkI cMA mnR bvf @@ -118603,12 +118553,12 @@ tSs epb apC rpj -ppf +gqU imJ gVw bsu qGk -feh +lMj brj brj brj @@ -118860,15 +118810,15 @@ aKQ aaP qEi rpj -ppf +gqU imJ gVw bsu qGk -rIs +xqV brj fqJ -bbU +dDz bsu sgL vWG @@ -119101,7 +119051,7 @@ dOs oCK qkr cJt -lvy +kdy gXl cMA mnR @@ -119117,18 +119067,18 @@ aKQ aaP lTV oqa -ppf +gqU imJ -gVw +jFZ brj -cCb -qBy +qGk +xVX tML wQe -aDr +yee sqy jKO -vWG +sNN acj brj brj @@ -119358,7 +119308,7 @@ dOs oCK sWf non -non +anU non hNB myW @@ -119374,12 +119324,12 @@ vEx xPs dxz rpj -ppf +gqU wxE -oez +nTC brj -rYM -tHh +wZU +gyu brj vTN ciQ @@ -119618,20 +119568,20 @@ izq iJG izq abU -wOg +hQg wOg jFN wFB hWN egG -vbx +sjD mir lCZ kmQ mTU apC rpj -ppf +gqU cBk rUH eHX @@ -119645,10 +119595,10 @@ gSk rtV nrB jAF -uFy -qvs -rqC -xam +nVm +vdb +cMi +vIb xgH xgH rLU @@ -119877,18 +119827,18 @@ nAm hLP rbT tHL -gBI +tHL cUL ggO ulv ncc jhV -sko +pAb wCl din ncc kzU -ppf +gqU wpP iXA ras @@ -120145,18 +120095,18 @@ wwN vMk ncc rpj -ppf +gqU tqE -ovU +tfo brj -mee +hVZ bAQ jMc owS -iUt +ofI bKp xiC -uhp +rbs jiE duu dFj @@ -120396,13 +120346,13 @@ htW htW tHL xHA -bUR +kWJ xHA wdq xHA xHA uKC -ppf +gqU kRg xgH xgH @@ -120649,17 +120599,17 @@ hLP hBw tHL oIq -rth -oLS -ocB +mxi +vgZ +rmz xHA -wOx +lrR tNO gNi pye xHA bzw -ppf +gqU gjy xgH pfN @@ -120902,7 +120852,7 @@ mjQ nAm ijL rbT -dJt +hLP ydt mVL kbM @@ -120913,10 +120863,10 @@ xHA uWC oMX mYB -jNb +pdU xHA jZA -ppf +gqU lXX xgH fce @@ -121159,28 +121109,28 @@ bZr hBw tHL hBw -fNW +jwC ydt oYn kVu oLv -jme +uBG scv tZq gdZ oMX biF -hou +jNb xHA tOo -ppf +gqU mun uZV dyS oMV dyS dyS -qLN +dyS nWf ema ema @@ -121197,8 +121147,8 @@ fJA apw jjC nAV -wUq -dZk +icE +oAH mty cmG cmG @@ -121406,11 +121356,11 @@ rbQ uvv jHH qgr +gCE qgr qgr qgr -qgr -qgr +gCE gcE fXm mqt @@ -121421,16 +121371,16 @@ ydt oYn oZV aOD -hgU +mUh scv -nSD +eqs wXU hUN mYB -jNb +tFR xHA rpj -ppf +gqU imJ xgH eKk @@ -121664,12 +121614,12 @@ hKN hKN hKN hKN -olv xbV xbV xbV -dfY -qDV +xbV +xbV +iEl kwK tHL aJE @@ -121677,7 +121627,7 @@ hLP ydt oYn ktd -aXW +oSj scv scv xHA @@ -121687,7 +121637,7 @@ mYB jNb xHA rpj -ppf +gqU uOT xgH ymj @@ -121927,7 +121877,7 @@ mar mar hKN hKN -pJi +rbT tHL rbT hLP @@ -121944,7 +121894,7 @@ bhW xHA xHA lKz -wwm +vkr irK xgH xgH @@ -122197,11 +122147,11 @@ ybL xHA gCv hiD -lbg +cNZ xHA vOK vOK -lPs +dtY pRG vOK xgH @@ -122221,10 +122171,10 @@ xgH sYP wVn xgH -xuI +ykn fae cmG -hRf +jHW jLr ipa iOL @@ -122433,9 +122383,9 @@ owI hKN lWH qlb -nCQ +qyP lWH -lNE +gNU pZU vsg cmT @@ -122457,8 +122407,8 @@ clv xHA xHA kyR -oVf -rDi +oOK +dJV gpZ kyR xgH @@ -122481,7 +122431,7 @@ xgH ctT wnN cmG -pXb +kkQ hST niD vyn @@ -122706,25 +122656,25 @@ kLn ehG llR pEv -fEI +iKb dpH adk weT -vHg +iQK kyR vOK mgl grg -dQd +jnp vLP oyf cQm nCi -rPB -jqF +svW +luJ faA -pYh -aZS +pBg +lem kzE xgH dyS @@ -122739,7 +122689,7 @@ cmG cmG cmG cmG -kfn +mQW nze jGn ssr @@ -122946,16 +122896,16 @@ owI owI hKN lWH -ijV +aaI fFI lWH tud -xrs -xZS +kHP +skM jdT mfR xGR -ujC +tuM ujC dpH anf @@ -122963,24 +122913,24 @@ hXa vmc qly pEv -nPy +hWF dpH -eCR -tvJ +rIL +nGK oid cSN -fxM -noo -vvz +pyL +qIz +jYY ptd -qJk -rZA -iOU +jnS +iiT +qvl kbp tpD -lqi -pVT -jbi +nMu +qot +pwY bnN kzE ilD @@ -122994,7 +122944,7 @@ wVn xgH kbO nWu -cxY +avt hjK hST nze @@ -123226,10 +123176,10 @@ vni mnQ rMq kyR -vOK +bSE hVG bBx -dQd +jnp vLP lsZ bwS @@ -123240,12 +123190,12 @@ csg hYT xjS kzE -okH +tCB dyS xgH bvi eVk -lji +bGV xgH wVn xgH @@ -123460,24 +123410,24 @@ owI akk aug brN -kyn +mdd uPM sJt -xeh +nsi oQa uPM tIK -xeh +nsi uPM fqP -wgu +sLF ehG ehG ehG ehG -uNn +eXR hUk -qQp +weY dpH dpH dpH @@ -123485,8 +123435,8 @@ dpH dpH dpH kyR -cIy -rDi +iHw +dJV nwi kyR wdL @@ -123507,10 +123457,10 @@ xgH wVn xgH ttF -cIi +qCn lJN cmG -vka +sWt eGp wNd cmG @@ -123737,20 +123687,20 @@ pGW oqO yiw lIU -czK +iYb flN eNN dpH vOK vOK -lPs +dtY pRG vOK wdL wDs -oEN -qTd -dMu +nwV +ckt +uTe wZt lJb kzE @@ -123992,7 +123942,7 @@ cwG qly pEv pnr -eur +vAS tQf qzm gtX @@ -124000,7 +123950,7 @@ gUO dpH rjD gRf -mFU +lLy jau rjD kzE @@ -124026,7 +123976,7 @@ xgH kbO nWu gPt -lYW +eUX cmG cmG owI @@ -124253,11 +124203,11 @@ bgO lJq fdx hah -aKY +vay dpH jYS cax -mFW +cKC mhr xgH dgU @@ -124514,7 +124464,7 @@ kHN dpH pCG cax -mFW +cKC kSN xgH wVn @@ -124539,8 +124489,8 @@ wVn xgH qGp qCn -roP -mmj +lVR +eQm cmG cmG owI @@ -124757,8 +124707,8 @@ rJy aWr dgp lmv -bcf -tEL +ggQ +kFi tnz khh pEv @@ -124771,7 +124721,7 @@ dpH dpH rjD dVB -mFW +cKC hGW xgH wVn @@ -124781,14 +124731,14 @@ eVk jxy kzE clP -lMH +lkX mew vAA kOR eXp kOR kOR -jHn +kOR kOR kzE dQi @@ -125013,10 +124963,10 @@ rJy rJy aWr wdP -xhI +pwf mRt hpi -xhI +pwf mRt bAL vOx @@ -125028,7 +124978,7 @@ dpH ylD rjD cax -mFW +cKC kSN xgH wVn @@ -125285,8 +125235,8 @@ gha fvS tqo sAK -mFW -cOG +cKC +bfC xgH wVn xgH @@ -125537,20 +125487,20 @@ nYw ehG gGP nsr -iMf +qyG dpH fvS rjD asu -mFW -kSN +cKC +mkO xgH wVn bMz eXi kzE cgT -vqZ +pUH lUH ucf kLc @@ -125799,7 +125749,7 @@ gha fvS tqo cax -mFW +cKC kSN xgH wVn @@ -126046,17 +125996,17 @@ qBh cui ehG bBV -ows +wBB xxx yiw iyY -mww -sfA +bEp +xkE dpH dsJ rjD cax -mea +cqY kSN xgH wVn @@ -126074,7 +126024,7 @@ dTm uRn qhP ola -lkE +hGj kzE uhl twx @@ -126287,17 +126237,17 @@ owI owI dpH ehG -wZM +tFc yim yim -bpV +mRt yim vIe vyN -bpV +mRt yim qcW -jUE +tIn bMD bMD bMD @@ -126312,8 +126262,8 @@ bMD bMD bMD bMD -hFr -mFW +cax +cKC kSN xgH wVn @@ -126321,7 +126271,7 @@ cAu mgf kzE okL -aVF +byk lfL bOB kLc @@ -126336,7 +126286,7 @@ kzE xgH xgH xgH -xoS +rSc tCB twx gXM @@ -126556,7 +126506,7 @@ bMD bMD trb bMD -nDp +xlK axS whV nJm @@ -126564,13 +126514,13 @@ whV clp clp bel -sKW -kCF +gRh +tRj osQ pPZ whV mie -mFW +cKC kSN xgH wVn @@ -126827,7 +126777,7 @@ erU erU iuM jrV -mFW +cKC mhr xgH wVn @@ -127062,10 +127012,10 @@ bdC ddv mST dui -tRj -tRj +oiv +vPC kbW -jJm +ebC wsE whV lYR @@ -127083,8 +127033,8 @@ unf unf dPT whV -cax -mFW +dRn +cKC kSN xgH wVn @@ -127094,14 +127044,14 @@ oHy aHM kzE qWe -jJs +jom eRe vKv vKv vfV mrW kOR -jJs +kOR kOR wCn fKC @@ -127322,7 +127272,7 @@ dui rxJ jVW whV -jJm +ebC jFT whV whV @@ -127340,8 +127290,8 @@ whV whV whV whV -wTA -mFW +uGc +cKC hUE xgH wVn @@ -127356,14 +127306,14 @@ iun xgH kzE kzE -gjm +kzE kzE kzE kzE kzE wAe mYo -ciP +kzr xgH wVn wVn @@ -127579,12 +127529,12 @@ whV whV whV whV -jJm +ebC yfi wJB eFY cmk -lgI +fbd erU erU erU @@ -127598,7 +127548,7 @@ wpE gYt mdp lHv -mFW +cKC kSN xgH wVn @@ -127608,9 +127558,9 @@ sWQ sWQ xgH sgH -fce +eyB wVn -oGK +rTt xgH aki kbk @@ -127618,8 +127568,8 @@ xgH ljE jCU xMH -ooC -pFi +trP +dpC qHH xgH oBQ @@ -127855,7 +127805,7 @@ hSd uqz mdp irf -mFW +cKC kSN xgH wVn @@ -128093,7 +128043,7 @@ nho qKt aqd whV -jJm +ebC yfi vqN eFY @@ -128112,10 +128062,10 @@ hSd lKD mdp cax -mFW +cKC kSN xgH -unA +lnN wVn wVn wVn @@ -128124,7 +128074,7 @@ wVn wVn iXe trD -lqB +jdp xgH hqh wmG @@ -128350,7 +128300,7 @@ whV whV whV whV -jJm +ebC bCT nSv vWS @@ -128368,8 +128318,8 @@ fkG ldl oKr mdp -hFr -mFW +cax +cKC lYu xgH xgH @@ -128609,7 +128559,7 @@ spa bcK bcK kSp -lCW +kSp kSp kSp whV @@ -128626,7 +128576,7 @@ gSw vNj mdp cax -mFW +cKC kSN xgH fmb @@ -128636,10 +128586,10 @@ fmb kzE xqs pCb -mHz ess ess -mHz +cWO +ess tFK nvj kzE @@ -128883,7 +128833,7 @@ piT pfg mdp bsQ -mFW +cKC rUW kzE kzE @@ -129133,14 +129083,14 @@ stl pRY nhu lYV -fhT +aPg mdp mdp ppN mdp mdp cax -mFW +cKC mhr jKt fPB @@ -129391,16 +129341,16 @@ pRY nhu eyY qDv -dPN +xQk bcR ezi vdt bbo sAK -mFW -cgj +cKC +jRx jKt -bNw +xel uVY nfn dRE @@ -129654,13 +129604,13 @@ kyx raW bbo cax -mFW +cKC kSN jKt llt uVY dqB -nHL +wUB mNh ejZ snO @@ -129911,7 +129861,7 @@ unb bbo bbo cax -mFW +cKC kbw mgM ryA @@ -130143,7 +130093,7 @@ owI owI rIS rIS -hgi +aSg rIS fRS bXD @@ -130168,14 +130118,14 @@ pvF bbo ylb cax -mFW +cKC kSN jKt -lEJ +mZV gzT jIG nMI -cjF +evB oFF snO pNb @@ -130191,7 +130141,7 @@ mtH pan tqj sXV -pXQ +xzT kzE eVh xgH @@ -130425,7 +130375,7 @@ qRn wmj oRX gSj -mFW +cKC jxi jKt gwH @@ -130448,7 +130398,7 @@ wuZ kzE uHQ eSw -fzf +fho kzE hdA xgH @@ -130682,14 +130632,14 @@ wXL qXm bJg hke -fxC +bAk qRW jKt nor -sst +rcc sHG uxT -wcw +tlq qkL snO jRp @@ -130920,7 +130870,7 @@ irp kxq nJK nBx -cFY +wSc rIS cEP kqP @@ -130939,7 +130889,7 @@ qsy nhu fkf cax -mFW +cKC kSN kzE kzE @@ -131170,10 +131120,10 @@ owI owI owI rIS -eJK +aRF gtt lyP -hMw +lyP cdS siA xUc @@ -131194,9 +131144,9 @@ nhu aKq atT nhu -bRm +lfq cax -mFW +vQg hmJ xgH aIV @@ -131206,10 +131156,10 @@ aIV aIV kzE gzO -fOl ess ess -fOl +dsB +ess trf kzE ukC @@ -131427,7 +131377,7 @@ owI owI owI rIS -dYr +kDh lyP eAm khr @@ -131437,7 +131387,7 @@ ukf aWy bpu uXL -nuM +vDu mxD mxD mxD @@ -131453,7 +131403,7 @@ aBd rjD rjD iWG -mFW +cKC xcV xgH xgH @@ -131704,17 +131654,17 @@ iqa qSl xQp uQe -ybP +wnJ nvh nvh hJc xzH bJg -fxC +bAk iII hbk ibE -xCk +ibE qTF woP aBd @@ -131964,13 +131914,13 @@ ylb bsC kfF kfF -kfF +cNl pZc esG uIq pyR bIx -yhr +eeQ yhr yhr wVQ @@ -132216,7 +132166,7 @@ hkq hiF iqa qSl -lfq +inS ylb siY kfF @@ -132232,7 +132182,7 @@ avm yhr cLX aBd -cPj +mgY xgH hdA xgH @@ -132461,14 +132411,14 @@ hkq hkq wsS hXQ -qpp +qYZ bFI wbf sAv eQZ fnS jai -sKL +cPR hkq ilq iqa @@ -132477,7 +132427,7 @@ iWB agi dUr mUl -hfo +olM qZc rjD hoc @@ -132485,7 +132435,7 @@ hoc hoc rjD lxc -tTp +qNh wUL rcV aBd @@ -133007,7 +132957,7 @@ rDh usS tkE rjD -lPi +mRq mRq lwW lwW @@ -133235,7 +133185,7 @@ wMy xFJ ams fbt -gdd +uVM lBo pyS gdg @@ -133502,7 +133452,7 @@ rgi qos waY qSl -dPB +eeP fGn mUl lTl @@ -133529,7 +133479,7 @@ lwW lwW yey lwW -qtR +gwN xgH hdA olu @@ -133754,7 +133704,7 @@ hHB gmw hOy lHR -wyD +mQm hkq gNc gFk @@ -134011,7 +133961,7 @@ bKa gmw rdx aAB -nnu +cuk hkq gFk gFk @@ -134019,15 +133969,15 @@ kUw aOI fyQ kfF -mds +eIr oyH xnr fvO -lOS +xJX oaa uYB tLa -vtE +pbX qdD cLX wGA @@ -134278,9 +134228,9 @@ fyQ rxn rxn yhr -eEp -aOV +qJD aOV +wvp oBK uYB eTa @@ -134517,14 +134467,14 @@ hkq hkq mMu hkq -rLx +xeO cYR qXk eyO eyO gmw isd -fHG +oGk anq vaW tgc @@ -134787,10 +134737,10 @@ kbu kbu kbu cNb -cvR +qqf eyo avm -rxn +aUb yhr eEp pcR @@ -134798,9 +134748,9 @@ pcR tvZ ndF bnz -fdk kYH -mdQ +ibE +kkN dHf dHf xgH @@ -135301,20 +135251,20 @@ fHz xNi wfT bxd -hrO -cTp +bJU +pYs uyu kbu yhr -yhr +eeQ mdR gpf igQ -wec +fJy fOq sQD -iAS -uRS +ibL +juI mfC sQD lOI @@ -135576,7 +135526,7 @@ rCO cjc aRI bVQ -vMJ +bgs hZt kzE fmb @@ -135815,21 +135765,21 @@ vwW tDK wfT rHq -uVV +awD twQ nIw iAY gTd -gcQ +rxn qdD -ikr +lQv pIT -gcQ +rxn lfZ sQD pqy nPb -qDs +wSm kSF cpE lTo @@ -136059,13 +136009,13 @@ hkq hkq mMu hkq -feZ +vud cYR bVG bSq xWm tdf -gEs +hCD wfT tbG esx @@ -136085,11 +136035,11 @@ rBP nag rBP oSt -dHd +sYH tNC sQD uMP -gkp +tQk qFa ndR nvk @@ -136340,7 +136290,7 @@ bhp jPh wmU emj -rCU +afg oSt oSt fzB @@ -136591,7 +136541,7 @@ jUo dFT hur wmU -yib +ylG nDw obA jPh @@ -136836,7 +136786,7 @@ kIe fxo uvD ocv -nJb +kfg rBP iTu iko @@ -136859,7 +136809,7 @@ tof fAf wWw eEA -rSp +nDf dEc dEc dEc @@ -137093,7 +137043,7 @@ blI gkx xeO vsL -kfg +nJb rBP fxd haK @@ -137104,12 +137054,12 @@ jUR qXq fFA rcd -gNq +dWn oYi hKU wiN qIT -nQY +ygH mLZ rcd pgE @@ -137617,11 +137567,11 @@ rBP kIG uxX rBP -gvk +kNN cFc rBP -cOX -pGA +fXd +pLJ eLQ rBP aGG @@ -137630,7 +137580,7 @@ rBP uMl oOd otD -kBI +gnY dEc gqO vcr @@ -137887,7 +137837,7 @@ rBP sZb xYU fYg -fvP +kHS dEc bhb vcr @@ -138115,13 +138065,13 @@ hkq hkq mMu hkq -rLx +xeO cYR bVG uJM xeO qoV -etU +xeO rBP rBP rBP @@ -138131,11 +138081,11 @@ rBP jcr rBP rBP -wOP xgW xgW xgW -usx +xgW +dpR xgW xgW xgW @@ -138391,7 +138341,7 @@ oqA bNR klY klY -hOP +klY nHv cAf klY @@ -138624,7 +138574,7 @@ owI owI hkq vhy -biu +bQA vgX uAf aux @@ -138636,23 +138586,23 @@ avp xeO lYt wwW -lbj +uED oIy oIy bIW oIy oIy -pso -xgW +tjV xgW +mVF pUf -tAv +eCQ uyD uyD uDN uyD uyD -bjh +yft iXt mVF wOm @@ -138899,9 +138849,9 @@ gtQ bRZ whF oIy -pso -xgW +aDf xgW +mVF wmC sly uyD @@ -138915,7 +138865,7 @@ mVF wOm wOm hZm -lrN +fWc dEc tKc dAU @@ -139170,7 +139120,7 @@ uyD uyD fws wOm -xgW +unW dEc dEc dEc @@ -139408,26 +139358,26 @@ aof tZD iMe xIL -oIy -oIy -dbx -oIy -oIy -aGq +sAH +sAH +fWf +sAH +sAH +mOT jSD iyT tYl -jjt +qLb fJE iGJ ueu hds esV -jjt +qLb mVf mVF wOm -unW +bAx dEc mSe uov @@ -139665,12 +139615,12 @@ itP gnx nnb bZE -oIy -dTZ -eVY -fUC -oIy -xgW +sAH +nIJ +uLB +rAm +sAH +tAC jSD fcp iCk @@ -139684,7 +139634,7 @@ xyb aVM pEq wOm -xgW +hOP dEc wus uov @@ -139922,24 +139872,24 @@ rkf tZD jHQ kTc -oIy -iHa -iHa -iHa -oIy +sAH +qEw +qEw +qEw +sAH xgW kfo -iyT +lZi kcB -psg +ppO fJE jxc lET wCu vap -lQD +kBK juf -klY +wOm kfo wfl dEc @@ -140179,11 +140129,11 @@ vmr vmr skj kFk -oIy -iHa -nWK -iHa -oIy +sAH +hhb +gGt +qEw +sAH isp jSD iMV @@ -140436,24 +140386,24 @@ eIt vmr jsZ fLn -oIy -jBi -uoW -wAV -oIy +sAH +hep +xjZ +uEu +sAH bQz uCe -iyT -apx -alE -doH +lZi +xgW +pIZ +gSf sWB sdt pMa -doH +gSf pxv -xcq -klY +jER +wOm rpD tyQ dEc @@ -140693,11 +140643,11 @@ eQe vmr wul fKH -oIy -kMh -mlW -gRJ -oIy +sAH +jWv +rBK +eLF +sAH oIy hsG hOR @@ -140708,8 +140658,8 @@ jWm xjs lPX ajg -sde -eUj +irm +xgW pEq wiF rpu @@ -140936,7 +140886,7 @@ owI owI css css -eOZ +xQL qzy fYz lTb @@ -140951,7 +140901,7 @@ vmr ykP npP tZD -obS +xih iLF xiO fKL @@ -141197,7 +141147,7 @@ lwc dQI vmr vmr -tln +aDx eWI omL wNh @@ -141205,16 +141155,16 @@ omL lLB xFN vmr -qwS +obH npP fJw -tEU +rsT qyN mPE cYF oIy mVy -cVm +bSa tyQ kVp oyh @@ -141224,7 +141174,7 @@ oyh oyh kVp tyQ -bLF +pzm mVy dEc dEc @@ -141232,7 +141182,7 @@ dEc uov vcr vWX -ucW +qHf cxO vcr uov @@ -141468,7 +141418,7 @@ vxz csf buQ nPZ -bAu +uhC oIy tyQ iPN @@ -141498,7 +141448,7 @@ uov hXB lJE aXO -aHl +oFX vcr pcg oSz @@ -141708,24 +141658,24 @@ css lwc vEN vEN -omv +tGq vmr -rNr +bVZ wpJ fHf aos lFW hpc arI -wEU +vUK vmr qwS xIL eNk qNf -meo +jaK aLh -fww +ujl oIy yli jCD @@ -141974,9 +141924,9 @@ xJL eKg cNR arI -cmP +bWu vmr -bad +pHD nZm tZD tZD @@ -142271,7 +142221,7 @@ lEI pBy dEc dFq -oEo +fbl oHx dEc vYD @@ -142490,7 +142440,7 @@ hyL sTD nxH vmr -pjm +neZ uUh uOM iEs @@ -142520,7 +142470,7 @@ vcr ido odS hAO -pED +mGN vcr uov uov @@ -142736,13 +142686,13 @@ lwc ehL wVS bQU -qDq +wTV vmr ggH ngm oni myR -cru +wbR cXG xhX wHj @@ -142776,7 +142726,7 @@ oSz vcr duw odS -woZ +aXk pCv vcr deF @@ -143764,7 +143714,7 @@ tOS qzy gHJ pui -pmt +opn sKt xJv ajp @@ -143803,7 +143753,7 @@ kVp kVp eYj fPW -fPW +eYj eYj kVp kVp @@ -144032,7 +143982,7 @@ sKt ieM jLi ieM -kEP +sKt xqr ugV xqr @@ -144057,11 +144007,11 @@ oyh kVp kVp kVp -eYj +fPW eYj kVp kVp -eYj +fPW eYj eYj kVp @@ -144275,8 +144225,8 @@ owI css lwc pui -gHJ -qQs +dYl +opn ctX hvv tmM @@ -144313,15 +144263,15 @@ owI oyh kVp kVp -fPW +eYj eYj kVp kVp kVp kVp kVp -eYj fPW +eYj kVp dEc bOq @@ -144570,7 +144520,7 @@ cHX oyh kVp kVp -eYj +fPW kVp kVp kVp @@ -175913,11 +175863,11 @@ fPH wwu rtm kwl -eiF +fLv skU -sOG +ksJ skU -uVZ +tEW ugs qHv fNT @@ -176159,7 +176109,7 @@ vNO vNO vNO uDP -ieu +wCT cCO vNO rbh @@ -176433,7 +176383,7 @@ jzt jzt ate eRu -gFq +ncD fNT hLz hLz @@ -176673,26 +176623,26 @@ vNO vNO vNO otQ -arA +dAo amg vNO kEI wwu sbI jtJ -gjz +qfv hat qfv lXq oCg pre -pre +ntM tvW rns eRu qfv qfv -uEf +lLW kMQ skz hLz @@ -176935,13 +176885,13 @@ vNO vNO ocU wwu -onY +daz eNM skU aiR aiR gxP -oCg +oAc dyW dyW jUu @@ -176951,7 +176901,7 @@ aiR aiR skU ugs -uUz +uMU hLz mwN uXA @@ -177208,7 +177158,7 @@ shi atU hLv xLs -nbq +voG hLz vmA uXA @@ -177453,15 +177403,15 @@ iyZ pAy veG ptu -xAg +tWM fQl oCg tnx -uhn +feX uvE rns veG -xAg +tWM ptu veG qnu @@ -178230,7 +178180,7 @@ tTS feX feX feX -aaz +cly ndd tuT lxD @@ -178487,7 +178437,7 @@ qMe feX feX feX -xuC +fEn fNT llN jKK @@ -178992,23 +178942,23 @@ tqw sbK wwu qRx -vTq +eCJ kwl aKC -stf +qYJ myV fNT woV woV woV fNT -mTl -lgk +aQt +etV shi tqW shi wRN -fME +dHa gtO hLz uXA @@ -179249,7 +179199,7 @@ roe pFy gaf vlo -qln +cKM lDE tqW shi @@ -179266,7 +179216,7 @@ tqW shi ewd fRa -gAp +lZH hLz uXA hLz @@ -179506,7 +179456,7 @@ grA wwu wwu ujT -qgy +jWz utV tqW tqW @@ -179762,15 +179712,15 @@ jBm jBm jBm wwu -lyN -mOV +uuM +chd rtv -jmM +shi cml -hlM +duC gTL mhb -eIv +aTU pfn bfW rrm @@ -179780,7 +179730,7 @@ kIR hLf ffS fUf -pxU +cFB hLz uXA hLz @@ -180026,8 +179976,8 @@ xWe xWe xWe fNT -oRK -lES +kwl +miF bam rKB uCU @@ -180043,9 +179993,9 @@ uXA hLz hLz hje -tmC -kso -tmC +bjC +bjC +bjC qFA jJu cLG @@ -180276,15 +180226,15 @@ bDD wwu jBm xuv -iYu +xLJ fYw -vPT +dim rJU gGA xWe xHT rtv -lES +miF jvv aWE bho @@ -180294,7 +180244,7 @@ dhX shi ewd fWh -lJS +xBd hLz uXA gjr @@ -180541,7 +180491,7 @@ stp vlm tMK rtv -lES +miF mII xVl bjf @@ -180550,7 +180500,7 @@ shi dsb shi ugv -fWp +jxP gXo hLz uXA @@ -180779,7 +180729,7 @@ xWf xuv xuv enP -pBh +oPv kJp sxl naI @@ -180798,7 +180748,7 @@ afb vlm tMK rtv -lES +miF yiB jmc jmc @@ -181055,8 +181005,8 @@ ieE vlm tMK rtv -lES -gxr +miF +cXq jmc bkj ccP @@ -181078,7 +181028,7 @@ hoK jJu kxh lvM -afY +llX lAh guk mmY @@ -181291,7 +181241,7 @@ wwu heq ctI xuv -aBN +tfk hKm qgQ gsn @@ -181312,7 +181262,7 @@ cfh xWe fAP mmI -lES +miF jvv qao blS @@ -181557,19 +181507,19 @@ vIC mHS mGK xDx -apr +pqd qAG -iJu +oFY mBZ ijS obj -aKo -aRx -aTn +ndG +sEL +biW xWe rPZ rtv -lES +miF jvv qao bmG @@ -181805,7 +181755,7 @@ rua rua cwq xuv -aGM +ifZ hKm qTK qTK @@ -181814,9 +181764,9 @@ wxi lcZ grW iXk -sRs +iPG qAG -azi +aXq sOs qAG qAG @@ -181826,16 +181776,16 @@ fja xWe wlu rtv -lES -swq +miF +jvv jmc cIl dWl cEb dFy eAv -gfI -ozF +jhk +mDs ksr hLz rwN @@ -182083,7 +182033,7 @@ fja sRZ tMK rtv -lES +miF gxr jmc jmc @@ -182102,7 +182052,7 @@ jIy hvE vRq jJu -fnJ +bSb clJ kEf ejl @@ -182325,8 +182275,8 @@ jON jON jON vxK -nsL -pbU +wvv +hVK eLC tpU eAa @@ -182340,16 +182290,16 @@ pOU foh vTY lXq -lES +miF jvv mcY svX cnk -rrR +roZ tMp oFa fwK -lfQ +dAN gYN ewq hVq @@ -182359,7 +182309,7 @@ hLz chk hLz jJu -dsI +kfL vjp mDV ntS @@ -182597,7 +182547,7 @@ cRd pbG tMK rtv -lES +miF jvv dIX bzF @@ -182854,7 +182804,7 @@ fja sRZ tMK rtv -lES +miF mII dIX bDU @@ -182863,11 +182813,11 @@ dfn fQf svX hZs -glt +mpC jnh hBT idw -iyr +igS hLz cUh lep @@ -182877,7 +182827,7 @@ jJu jJu bzm vjp -lnV +vjp pkr mjr pkr @@ -183093,7 +183043,7 @@ qyx qyx vxK abm -gRT +gvM mbA vxK dhJ @@ -183102,7 +183052,7 @@ aow aow aow jFJ -sHk +dvP kmR kmR kmR @@ -183111,7 +183061,7 @@ ePa ePa msf rtv -lES +miF jvv dIX kcZ @@ -183361,23 +183311,23 @@ vio jFJ kJg kmR -nlm -aNk +lcB +kGf aRG -aTy +wXC ePa rNg rtv -lES +miF jvv vjl svX cqV -dgV +gKN ebE mtA rrR -pfM +rrR hcO hLg ift @@ -183606,7 +183556,7 @@ cwq wwu qAq aax -rJp +nje acJ dZW noe @@ -183625,15 +183575,15 @@ hkK ePa bpq rtv -lES +miF ksw hLz hLz hLz hLz -egC -eRW -fBd +pDL +heC +caP jjF hkZ jjF @@ -183863,7 +183813,7 @@ cwq wwu brn nWJ -wDg +unE rDF rDF dtb @@ -183882,8 +183832,8 @@ jnV sif fur rtv -lES -swq +miF +jvv hLz roz fGJ @@ -183895,9 +183845,9 @@ jjF mxd jjF iit -iNs +gJp jjF -bSh +uek hLz uXA rLd @@ -184139,7 +184089,7 @@ jnV sif qfv rtv -lES +miF wKr rZi uXA @@ -184147,14 +184097,14 @@ uXA hLz vpp eUJ -fEu +cCK glY -hoX +cvE jjF ilG iPr jgJ -jtQ +tnA hLz uXA hLz @@ -184387,7 +184337,7 @@ jqD bjZ jqD jFJ -dLt +qWv kmR iaq iOe @@ -184396,13 +184346,13 @@ jnV lCz iON rtv -lES -uQo +miF +imR hLz -wZj -uXA +bYp +hCK hLz -vpp +oLB eXg fED hbz @@ -184411,15 +184361,15 @@ hSH ilV iTn jjF -bSh +mOK hLz uXA hLz dOv -qSa +cDh cvm kvE -qQa +pjf kvE hLz ssM @@ -184653,7 +184603,7 @@ jnV tVz qfv rtv -lES +miF kbx hLz hLz @@ -184893,7 +184843,7 @@ wwu qdC cwq xuv -uKn +njc cgM lIL fFu @@ -184910,15 +184860,15 @@ oId hFS qfv rtv -lES +miF wmW hLz uXA uXA hLz enl -eZH -fKA +ljf +naW gqN qbr nNT @@ -185150,7 +185100,7 @@ wwu lkZ cwq xuv -cZk +hzv xLc mZJ viL @@ -185167,7 +185117,7 @@ aFB sif qfv rtv -lES +miF yiB hLz uXA @@ -185186,7 +185136,7 @@ hLz aQU uXA hLz -wED +jJa pwL vVD qmC @@ -185410,24 +185360,24 @@ ihW pUr nVB sYD -wXY +ayc ryu ryu ryu fTd -eFx +iAk kmR -aFV -vGQ +boL +hzf aSq -yjG +tDV ePa bom rtv -lES -gQa +miF +gxr hLz -tWL +uXA uXA uXA uXA @@ -185679,9 +185629,9 @@ kmR kmR ePa ePa -pnD +alr rtv -lES +miF kfm hLz hLz @@ -185700,7 +185650,7 @@ uXA uXA uXA hLz -qmH +dPh kGz xYC ucB @@ -185921,7 +185871,7 @@ xEo tXg cwq xuv -agh +odz ahG alK anA @@ -185938,11 +185888,11 @@ fja sRZ tMK mmI -lES +miF jvv gZf kRI -oqD +uqC pXT hLz hLz @@ -185954,7 +185904,7 @@ tWL sil fIX vXh -jlq +cXJ uXA hLz eaB @@ -186195,14 +186145,14 @@ qdc xLU htr hZL -eIv +aTU nys iJt pEJ mJg mJg mJg -vjo +ket hLz vXT vXT @@ -186215,10 +186165,10 @@ mvN uXA hLz eaB -mJz +wdX lpH -gmV -aqj +sfe +emp lpH hLz uXA @@ -186435,9 +186385,9 @@ xuv xuv xuv xuv -yhn +nAU ivY -amA +bdD iXa ape aoW @@ -186452,13 +186402,13 @@ ssL mYV wmz rhR -lES +miF jvv fgD lVk gqi gqi -cWQ +pVK hkw hLz lQI @@ -186688,16 +186638,16 @@ wwu muI xuv hge -dPi +hge hge oiO -lMp -aeI +bMu +pKO aiN jDc anN vIp -asz +dkQ wIJ fsI cTV @@ -186706,13 +186656,13 @@ iMK bsz ksx fja -sRZ +bkH tMK rtv -lES +miF wIG jzq -eoc +oxo qAv oWY eQH @@ -186948,12 +186898,12 @@ wUU dJI hge gKp -ubb +qXi agl cLt rdJ jRI -mZq +sDg rWT rWT ati @@ -186966,7 +186916,7 @@ qAG dpL iVH rtv -lES +miF jvv fNT fNT @@ -186978,7 +186928,7 @@ dCx mWd dRX axQ -pcL +iwN cmG gjP quV @@ -187217,13 +187167,13 @@ qyk oSb qUO dpL -bPr -tmE +uHf +kAe vgo dpL lCh rtv -lES +miF jvv aUl iKU @@ -187459,11 +187409,11 @@ wwu dKz xuv hge -hge +rhC hge oiO afz -cDo +lIh mis txR dDk @@ -187473,26 +187423,26 @@ uaX puG smv cyb -ueY +bsB iOp rUD -kTf +sih dpL fNT xJs -kOj +iRg aYA fNT fNT dGP qGm -sIC -hQq -qBz -bty +ion +mdU +kJY +ltb vtO bjF -ciV +pcy cmG kqy uHu @@ -187501,7 +187451,7 @@ wVY pdW nlL ieP -kZF +gyf qFO wVO uXA @@ -187711,33 +187661,33 @@ ucA ucA vnK vnK -hjo +kRG sUj sUj -iOA rkM rkM rkM -iOA -iOA -iOA -alF -amU +rkM +rkM +rkM +rkM +fKr +fKr rWT ujc rWT mCI kXZ wbS -mCg +eGF dpL -flg -dqz +tdM +bvx btp dpL fqo fqo -aSR +kcK oGL fqo fNT @@ -187968,21 +187918,21 @@ ucA ucA vnK vnK -ecV -uZg -vLj -iOA -gvW -xGk -tUn -iOA -mVP -lkQ -lkQ -lkQ -lkQ -lkQ -lkQ +bir +sUj +qEy +rkM +rBF +pxL +can +kuh +cLI +yaq +nxe +mTo +rkM +rkM +rkM mrh ivs iNO @@ -187993,8 +187943,8 @@ dpL dpL dpL fNT -kbl -lES +skU +tjP jVt fNT fNT @@ -188223,39 +188173,39 @@ ucA ucA ucA ucA -erN -erN -uZg -lZQ -iOA -iOA -owf -lhq -rad -iOA vnK -lkQ -fMC -vad -qVx -apu -lkQ +vnK +sUj +sUj +xVn +rkM +wCc +ezQ +qzo +aPf +qrx +eUn +jTM +oXE +xZX +dpP +rkM mGd shk wbS dpL -qlQ +qtL feX gPH fNT -fqo +lZS idn shi -lES +miF nWz nIh vsw -waZ +rtv oxs oxs oxs @@ -188267,12 +188217,12 @@ cmG cmG gCP mhp -hDC +iNp wVY -rAl +sIH hWV kpR -pBM +aFI lcv aal ydS @@ -188482,42 +188432,42 @@ ucA ucA vnK vnK -qKR -iOA -iOA -qpa -xOW -llO -jmf -iOA sUj -bGv -aZj -czW -qID -vTF -isl -cas +rkM +rkM +rkM +xKj +xKj +ntl +aCd +rQG +qEb +eBf +rJC +pbk +dKU +rkM +oOR kvB eao -dFf +ktM sWU tAb glA knA -jCY -ygC -ygC +lPj +uPQ +mge loK -jQJ +umC bBT cuB bBT oxs vCf -oxs +nyn qGm -dxn +mZS vKz oHs vXP @@ -188739,35 +188689,35 @@ ucA ucA vnK vnK -uZg -dhF -lGH -hbr -mmq -tlF -kxA -iOA sUj -lkQ -dFO -cMm -ldQ -ePX -lkQ +rkM +tgF +uzH +fiA +fiA +wIP +tXB +gup +vsk +tPj +drm +aWJ +giq +rkM ueO puG eep dpL -taj +och aqw bPm fNT fqo iNz shi -siE +siq nWz -cDt +xXU vsw rtv oxs @@ -188996,22 +188946,22 @@ ucA ucA vnK vnK -uZg -iOA -hOZ -qXx -oSD -bHh -iyF -iOA sUj -lkQ -lkQ -lkQ -lkQ -lkQ -lkQ -dpL +rkM +kwL +oFI +txu +gfg +waI +cHd +oFH +sgc +rkM +gzM +iot +vbQ +rkM +qxh lhW wbS dpL @@ -189021,8 +188971,8 @@ qun qun qun fNT -nYB -siE +veG +uKW gEa fNT fNT @@ -189031,7 +188981,7 @@ fNT fNT fNT qGm -woB +syV wPX xKq nCG @@ -189253,33 +189203,33 @@ ucA ucA vnK vnK -gCm -iOA -rkM -sIf -hNA -pxz -rkM -iOA -crl -vnK -akl -nHd -ghz -cnA -ukm -nqo -niS -vCm -nvA +sUj +sGh +ivo +txu +uHZ +txu +wFC +lhS +eSJ +jBR +gzM +vIa +gIb +ewK +vjX +gzM +kXZ +tuX +avH maW -tKA -uaL +haL +nQS qBg qun elB elB -aTg +xdK khx elB ldb @@ -189295,7 +189245,7 @@ lTO rac srK keJ -tiN +bfM jxj pwF nCG @@ -189508,35 +189458,35 @@ ucA ucA ucA ucA -erN -erN -uZg -iOA -vlQ -vLd -lBs -auv -rUh -iOA -vmN vnK -mng -wAt -iYq -vRI -cbN -cxC +vnK +sUj +rkM +quW +nEi +txu +jml +fdp +wWJ +ffi +eVl +gzM +feP +sTT +pGb +jGf +dhb puG -hRO +qZA avH maW -aUh -eqO +nQS +uJD eTH qun qun wrb -qGi +wGY bap qHW qHW @@ -189767,24 +189717,24 @@ ucA ucA vnK vnK -uZg -iOA -urY -tdw -iuW -mKw -tRU -iOA sUj -vnK -dTG -xcZ -sRY -tZR -oMU -nqo -tbp -tEN +rkM +aYs +pyO +pyO +oYI +cdd +rkM +gzM +gzM +rkM +ddO +uqv +bLi +aip +gzM +swk +tYg nXJ maW rxL @@ -189793,28 +189743,28 @@ emI vbP qun jyD -tQq +jLQ sGu heR tBY nhJ vYl pDS -enj +doT kKr tam wyE -fFj +bCp nCG pwS uCv cgb cgb ybe -oRM +wnq nCG -jaR -qcm +piG +pdf lcv qqY lxG @@ -190024,40 +189974,40 @@ ucA ucA vnK vnK -qKR -iOA -iOA -xxY -jdC -tRU -iOA -iOA sUj -vnK -bSc -iSr -txM -qqI -iyP -qun +rkM +rkM +rqK +hNA +wqx +rkM +rkM +whw +whw +qXj +npF +hML +iCE +iCE qun -kzN qun +kjo +tpV qun -hWq +uUg nQS nQS nQS qun tKl -tQq +jLQ sGu heR qRy cht sYb kUO -pDS +hpz kKr hPX wyE @@ -190068,7 +190018,7 @@ gEl wRD vPN cvn -vjF +tyj nCG qiF vLL @@ -190281,33 +190231,33 @@ ucA ucA vnK vnK -uZg -gcS -iOA -iOA -oHz -iOA -iOA -sUj sUj -vnK -hae -jwY -ikt -esw -qun +rkM +vlQ +vLd +olC +auv +rUh +rkM +vzZ +vzZ +gws +npF +lcT +cvK +eFO qun -azC -aBC -uQJ -maW +qNG +qtp +rjm +ibw lRu dEb tKA nQS eHc cCc -tQq +jLQ sGu heR ilg @@ -190320,7 +190270,7 @@ tam oKR xKq nCG -igX +xEv rBt aDp xug @@ -190538,25 +190488,25 @@ ucA ucA vnK vnK -mAQ -uZg -uZg -uZg -uZg -uZg -sUj sUj -vnK -vnK -hnK -joy -joy -rtG +rkM +cRU +eHf +iuW +eHf +dGa +rkM +dyE +yiA +cLA +npF +lcT +aAE +wfG qun -njj -azF -hXR -dHA +nVT +iCi +wTO maW rxL doJ @@ -190564,12 +190514,12 @@ dEb doJ eHc cCc -tQq +jLQ sGu heR -rSf +dnH tld -xuD +rho noh aFm kKr @@ -190577,12 +190527,12 @@ xIk wyE xKq nCG -hxv +pdY lGp xKy wHq uwI -tAq +hxy nCG nzJ nzJ @@ -190795,33 +190745,33 @@ ucA ucA vnK vnK -fov -vnK -qKR -vnK -vnK -ihB -vnK -vnK -vnK -swe -lMz -pgT -awT -eXn +sUj +rkM +rXg +dtm +jdC +bID +tRU +rkM +hDb +cvK +cLA +npF +lcT +eFO +pAV qun -syC -btD -dqN -lpA -tZh +lYU +qtp +pKA +evi oOE iie nQS tKA eHc cCc -tQq +jLQ vmH qHW kKr @@ -190840,7 +190790,7 @@ ceF ceF ceF nfv -gfi +nfv mHh obX lcv @@ -191052,46 +191002,46 @@ ucA ucA vnK vnK -gjC -hJU -uZg -vnK -mrq -rJr -uzw -vnK -sLL -aEf -nmw -lJG -dys -imx +sUj +rkM +rkM +rkM +fMu +rkM +rkM +rkM +pov +gBN +uOY +npF +eKD +biJ +mwB qun -tdd -fFR -dqN -aDs +hCV +jVT +uaV maW aUh aUh -eqO +ukI dEb eHc cCc -tQq +jLQ sGu nOO -ohL +aHY ihp iFi noh -obM +kMv kKr iuu wyE -lXQ +oVZ nUa -sNA +lwD kyO sKw mxN @@ -191309,40 +191259,40 @@ ucA ucA vnK vnK -trZ -tFM -mOb -vnK -fmQ -uOq -lWR -vnK -tIF -eZN -leJ -tOQ -uSr -kIV +sUj +sUj +sUj +fij +hQl +oqU +dYq +rkM +frw +iBj +pzb +una +efX +pzb +frw qun -mVz -rfn -thj -aER maW -xzG -mGs +oGF +maW +ibw nQS -vbP +hIn +nQS +guT eHc hBG -tQq +jLQ sGu nOO cbu xsi xsi epO -roJ +eDC kKr jYe wPX @@ -191566,33 +191516,33 @@ ucA ucA vnK vnK -wfS -ioD -uZg -vnK -nlo -fVk -nlo -vnK -vnK -vnK +fov vnK +qKR vnK -ibw -ibw +iDh +iDh +dYq +rkM +rkM +rkM +baN +rkM +rkM +rkM +rkM qun -jiu -btD -dRf -ahe -ibw -ibw +nOR +npu +gEv ibw +maW ibw +maW ibw ibw ubi -tQq +jLQ sGu nOO ihj @@ -191823,40 +191773,40 @@ ucA ucA vnK vnK -fov -vnK -qKR -vnK -nQG -qdO -qtY +gjC +hJU +uZg +fij +sjW +pog +rwc vnK -dpN -wob -dpN +pQP +eDt +uDB vnK -bsi -nwg +iaf +sgT +xRH lti -ayD -jrh -fUD +wtw +tUq hFL maW -aPe -aPe -aPe +iJP +ikY +iJP ibw ehh xYM -tQq +jLQ sGu nOO -lqU +gOZ xVR tfA htD -qbc +rmD kKr tam wyE @@ -192080,34 +192030,34 @@ ucA ucA vnK vnK -ggg -pro -kpt -vnK -vnK -qBR +ehl +sQT +mOb vnK vnK +gih vnK -dgQ vnK +ocX +iMX +uDB vnK -sMo -ngy -qun +pXR +aIY +joU qun -fyp -fUD -nIL -oUN -mqv -mqv -mqv -bMb -bFZ -hgp -tQq -vmH +rUJ +lQb +pCf +bcC +bcC +bcC +sLX +djH +wcG +ybm +jLQ +jES qHW kKr pQW @@ -192339,42 +192289,42 @@ vnK vnK vnK vnK -uBW -nCd +uZg +oGo sHv kpt kRS -kRS hvf kRS kRS +kRS mQz -ngy -eWY -oJF +sjf +aIY +vvs qun -mMC -bFv -nIL -maW -lhB -kCm -fCY +wMf +nyg +rfn +rfn +rfn +rfn +hFL maW roa xYM -tQq +jLQ aWc qGb -gLg +dnH kgl -waB +dBO nxN kKr -vhf +emu jdP wyE -sEN +oOa nUa iRF scD @@ -192594,9 +192544,9 @@ ucA ucA vnK vnK -fvR -fvR -fvR +fov +pro +uZg gQA wJI vnK @@ -192606,21 +192556,21 @@ wug uKz cgc vnK -qJa -dYx -wpc +vvm +nfR +huz qun -fRc -ncS -cqT -ibw -lYU -ucD -aPq +tll +ntU +vKB +rfn +niK +rfn +oig bQY wTS xYM -tQq +jLQ aWc qGb ilg @@ -192851,9 +192801,9 @@ ucA ucA vnK vnK -fvR -fvR -fvR +ggg +pro +kpt cYh qOQ vnK @@ -192869,15 +192819,15 @@ qun qun qun qun -nlM -ibw -cFC -vzR -oGm +vWg +oyv +abk +iqC +tGS maW xni xYM -tQq +jLQ aWc qGb cDa @@ -192892,9 +192842,9 @@ oOa beM oxn bna -kAk -xrP -sod +usp +wcA +kod crr pbJ tdn @@ -193120,7 +193070,7 @@ vnK wGl wGl iOA -aAl +xEj ffN iLJ win @@ -193134,13 +193084,13 @@ ibw ibw vsx bYg -tQq +jLQ aWc qGb aCl lLC lzb -rxF +ipI jSC gDM jna @@ -193377,7 +193327,7 @@ erN wGl wGl iOA -ren +hwQ rIp aBK kiA @@ -193388,11 +193338,11 @@ oMz aBK fjQ oDI -xeI +thD vsx jEk -tQq -uFL +jLQ +qOH qHW tIm xoM @@ -193412,7 +193362,7 @@ udb oIl iYM tdn -wix +wlo lcv aSs nca @@ -193643,20 +193593,20 @@ sJn iCD qXQ aBK -opo +ozy fYj kBc vsx xYM -tQq +jLQ yka ilR -uBX +grm hOX qob dyP aHk -izE +rHI tia cwz ael @@ -193878,8 +193828,8 @@ ucA ucA ucA ucA -erN -erN +pqo +nrL wJI vnK vnK @@ -193897,15 +193847,15 @@ aBK aBK jxD aBK -aca -gyO +fhN +aZm aBK mDm vrs cTw vsx xYM -tQq +jLQ tDb gvp hYk @@ -193926,7 +193876,7 @@ ssw fnW iYM tdn -cXA +uPc lcv lph nca @@ -194135,208 +194085,61 @@ ucA ucA ucA ucA -vnK -vnK -wJI -ndL -vnK -vaC -dUU -tdA -dnJ -cTJ -wvg -iOA -mRQ -viV -xNy -sPp -mcI -rPC -sJn -lJu -dPk -aBK -vnR -tvu -sIz -bSX -ybm -tQq -mJJ -mFz -suB -mve -uwU -dfB -ask -jIs -buR -cnm -aGr -hBe -dxY -mdZ -iVs -usl -usl -eQP -tNB -oxn -oxn -lcv -lcv -lcv -lcv -lcv -aal -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -"} -(140,1,2) = {" -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA -ucA +vnK +vnK +wJI +ndL +vnK +vaC +dUU +tdA +dnJ +cTJ +wvg +mqc +mRQ +dVV +xNy +sPp +mcI +rPC +sJn +lJu +dPk +aBK +vnR +tNe +sIz +bSX +ybm +jLQ +mJJ +mFz +suB +mve +amM +dfB +ask +jIs +buR +gxX +aGr +hBe +dxY +mdZ +iVs +usl +usl +eQP +uTX +oxn +oxn +lcv +lcv +lcv +lcv +lcv +aal ucA ucA ucA @@ -194392,9 +194195,156 @@ ucA ucA ucA ucA -vnK -vnK -wJI +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +"} +(140,1,2) = {" +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +fLx +qNw +ahS +xXF xeM geb gns @@ -194404,10 +194354,10 @@ wGl xZl lba iOA -usZ +rMR kpx gHU -kxL +rPC dqm aBK wRc @@ -194418,8 +194368,8 @@ sKm sKm sKm sKm -xYM -tQq +cdm +jLQ aYU gvp hYk @@ -194441,10 +194391,10 @@ mMi mMi fYa jpB -hqF +mzh jZe -bYn -rBK +ksH +pMf lcv aal ucA @@ -194649,8 +194599,8 @@ ucA ucA ucA ucA -vnK -vnK +pqo +nrL wJI vnK vnK @@ -194668,18 +194618,18 @@ tKr hwQ piz aWO -tsc +nEl edT +rBT tEK -ofg -dHS -cwb +lAD +eUq ttb wQu -tQq +jLQ yka ilR -mpv +xlu jIi csR vfW @@ -194688,10 +194638,10 @@ xlu bez puH gYa -vzl +gBV oxn fES -kKM +sKa fES bqQ gvx @@ -194918,10 +194868,10 @@ jlJ eYp wXs iOA -aAi +dwN eDl ovY -kxL +rPC tpW flD bAq @@ -194933,8 +194883,8 @@ jgx fgz hUA xYM -tQq -ecU +jLQ +usK ilR ojg hHe @@ -195163,8 +195113,8 @@ ucA ucA ucA ucA -erN -erN +pqo +nrL wJI vnK lCR @@ -195190,7 +195140,7 @@ jgx kAm hUA xYM -tQq +jLQ jay grN cqy @@ -195198,12 +195148,12 @@ ouD dUj sRR vSA -gzL +cZI bCd vNV gRW -pDz -fVh +gHO +yba lfW wdd rku @@ -195432,10 +195382,10 @@ iDh vnK dVf iOA -xvK +bsX bIy riF -kxL +rPC hwQ bLm coH @@ -195447,7 +195397,7 @@ jgx uae hUA xYM -tQq +jLQ aWc grN wMN @@ -195463,7 +195413,7 @@ xkh fDL coZ wdd -iIe +aYB xcY gEZ kUW @@ -195692,7 +195642,7 @@ iOA joT pCU pHu -kxL +rPC xyd aBK gef @@ -195704,27 +195654,27 @@ esu pRD ttb iTw -tQq +jLQ dUh grN rmd sFG loQ sRR -mtj +tDX kRM gQE wLC nVp txp aaU -qvO +ecK wdd qcr otX gEZ dHR -ewI +gjb ivL ivL ivL @@ -195961,7 +195911,7 @@ neX sKm sKm jEk -tQq +jLQ aje grN sRR @@ -195983,9 +195933,9 @@ mjg ehO iux quC -tHx +wDa jXv -lag +xID uAW lcv aal @@ -196215,10 +196165,10 @@ yix yix kBX yix -tlA +gCM ttb xYM -tQq +jLQ lCG grN voB @@ -196238,7 +196188,7 @@ sOT rEp gEZ dHR -bhQ +mni ivL xbN pOi @@ -196475,12 +196425,12 @@ vwQ aNm fXr xYM -tQq +jLQ pGs kMN tEe fYt -rYI +loQ sRR qPu sEl @@ -196491,7 +196441,7 @@ aRz fEj ilI wdd -iIe +aYB xcY gEZ wcH @@ -196728,28 +196678,28 @@ dJx fRN wlZ mqx -tgq +wlZ tUx ttb sLI -tQq +jLQ pps grN -dCO +eTJ rep tVi sRR qsj -xIs +iDr thd -fuD +bYb bnC dXy -uUb +bND aHK wdd waA -vXg +wat mVm tfX iux @@ -196985,11 +196935,11 @@ ttb ttb pCg lYd -lli +pCg ttb ttb uUF -tQq +jLQ tWv grN grN @@ -197234,7 +197184,7 @@ vnK dVf vnK qiJ -nYm +mmA pei vsy ttb @@ -197242,11 +197192,11 @@ okr oyR bFH esk -jRb +bFH dUi hMg sUy -cfs +dVW fzy rES kzK @@ -197257,12 +197207,12 @@ fou eAV hrw jRO -hYB -bKs +vJF +nlc gCw slI fqu -omk +mFV omk vrA ibk @@ -197490,7 +197440,7 @@ wOv sKC dVf vnK -jTG +ahO dVi gHi qeu @@ -197512,7 +197462,7 @@ rpa nhA dQH jdx -cnK +jNH jRO aeS rlB @@ -197527,7 +197477,7 @@ dUF gaL iMF jzN -sRL +haB bYX lcv aal @@ -197747,7 +197697,7 @@ oSL vnK vnK amt -mfw +iRm atv wiv lbq @@ -197771,7 +197721,7 @@ jSW nrX mkE gQx -fxc +gXd xWy pfd fQH @@ -197785,7 +197735,7 @@ sCp ecl lSw nce -ecl +yal lcv aal ucA @@ -197999,9 +197949,9 @@ ehA xtF dEt deG -qik +xPu gXs -qik +xPu oSw amt lyv @@ -198010,10 +197960,10 @@ udZ uTL amt qlq -jEI +irI jZS kNA -qgA +hXr pYf ttb mIA @@ -198021,7 +197971,7 @@ mIA mIA ttb tRw -ohW +hIe wGg jZS hbj @@ -198036,13 +197986,13 @@ hXt qAh oyy vrA -ruV +ksB blN dyo laf iOr ylV -gcT +lOq lcv aal ucA @@ -198291,10 +198241,10 @@ nuE sWW nCK nCK -uEI +nCK vrA -sxV -tgG +bPK +tNG sCp lct oET @@ -198524,7 +198474,7 @@ lYe aQC mwO ttb -tzQ +hyt hoj nVi uZm @@ -198533,7 +198483,7 @@ uVR xmQ xmQ xmQ -kSR +knd ttb khm wFq @@ -198545,10 +198495,10 @@ lcv vce ltZ oXb -xBq +ydG aII -sRg fJU +maD vrA jVg lcv @@ -198781,7 +198731,7 @@ aQk dVi kbq ttb -ixr +ibJ kzK xEh pMq @@ -198790,9 +198740,9 @@ roh xmQ xmQ xmQ -qas +gfD tLq -bNc +wYp cJI ldI cqh @@ -198808,7 +198758,7 @@ lcv lcv lcv lDY -aWJ +fhp ezd pqn mbi @@ -199049,19 +198999,19 @@ xmQ xmQ rBm ttb -iQy +acq wGg jZS sFQ aal ybG -gos ybG ybG ybG ybG ybG -gos +ybG +ybG nnf gmp lDY @@ -199283,7 +199233,7 @@ dEt dEt hgQ dEt -arC +imZ cpu dLe mgo @@ -199552,21 +199502,21 @@ eyJ eyJ amt nUt -xzA +kzK hoj nVi huT szS qGV bbI -rdV +aIJ ibW aEW wau soy hnB hoj -oAN +oFT bcm bet iAb @@ -199804,7 +199754,7 @@ iTI bUv kUo bCo -uBp +mKg gAg jjW sTU @@ -199818,7 +199768,7 @@ qGV pvx hWx hWx -aEW +vGt ldI kzK kzK @@ -200089,7 +200039,7 @@ tGv jeR lIJ tRM -sIr +qck iAb faq knT @@ -200351,7 +200301,7 @@ iVN bUh uXl uXl -cUZ +lhR aal pnc lfy @@ -200569,13 +200519,13 @@ dEt mcp dEt deG -oYb +xPu pKg -xRp +olj xpO amt vUc -evJ +vuk mDq xgg kca @@ -200851,19 +200801,19 @@ hoB aVJ pqg jZS -jZS +ftT jZS ifG iAb -aFt +uUY uXB jEA -qDR +kBh eGN mXh iVN kHJ -bCh +eYL fTo qCZ aal @@ -201093,7 +201043,7 @@ aPc sPu ucm kca -fVT +lQn shd hjH yfU @@ -201105,7 +201055,7 @@ kzK gCD kzK xcW -pBK +aLX igE aYy aYy @@ -201115,7 +201065,7 @@ iAb iVN iVN iAb -xYY +xfQ buc iAb iAb @@ -201347,10 +201297,10 @@ wbx pJs dEt nmF -igR +pXG jmu kca -wLQ +qFU fsD gnm xZc @@ -201367,16 +201317,16 @@ igE hlP nIQ iwj -bfe -bhj +hiJ +gYc kbL bku iAb -bqb +aBS bsK bsK bxr -bzY +efn aal oVH oVH @@ -201612,10 +201562,10 @@ kif puj pZW wCG -jZS +oZB caF -syr -usr +dKS +bsv qAU uDc hoB @@ -201889,7 +201839,7 @@ boI brC ltt jXc -byj +mHf lcv lcv hAg @@ -202119,34 +202069,34 @@ edO awA jBf uZF -rlI +tjC pPL itc sBb ybB rkY nyE -mPo +sEw eiD -nOD +kMl nyE sgJ kzK juq igE igE -aYP +izy baA -bcp +jxk igE iAb -uid +koN blX dNG oZj jja jXc -aVg +kOU lcv jer hAg @@ -202376,14 +202326,14 @@ kJU dEt dEt uZF -tEz +hYz lyR uZF uZF uZF uZF uZF -oHX +rYR ogD wzS nyE @@ -202397,7 +202347,7 @@ cSe aZn bgz bid -eVe +cJR blX bxk iaC @@ -202644,23 +202594,23 @@ wxY hsI qBW nyE -reC +xGu jhw rnP igE aWR aZn bbE -lLe -qIv -iXh -jeF +cSe +irx +uVN +wRp bmA bpA bfs cVT jXc -byx +uim lcv lcv bHU @@ -202903,7 +202853,7 @@ nyE nyE hpg gCD -smf +qYb igE aWR fYf @@ -203154,7 +203104,7 @@ svu uZF noO ijZ -nZa +uGP wJG noO fsJ @@ -203170,12 +203120,12 @@ nlN nlN bnf fOk -bpL -brG +mTh +hDI btt opr byI -bAn +kNJ lcv rzA gFz @@ -203925,11 +203875,11 @@ svu uZF noO jiD -mCK +vAd fJY noO fsJ -nDa +tKP lNh nno tPm @@ -203951,7 +203901,7 @@ kQI nlN qza meU -okb +diW nlN ybG aal @@ -204440,12 +204390,12 @@ svu svu uZF cfH -hOc +yhM cId rQV aVq fuI -ikM +kOk tPm gSu tPm @@ -204697,15 +204647,15 @@ uZF svu uZF cfH -aVq +wns kOk qVp wmw bXz sZo -okX +tPm tnm -okX +tPm xui nlN bvC @@ -204959,7 +204909,7 @@ xYr rQV xCl qkI -aVE +pdd tPm gSu tPm @@ -205211,10 +205161,10 @@ uZF svu uZF tPm -okX tPm -okX -okX +tPm +tPm +tPm tPm tPm tPm @@ -205486,7 +205436,7 @@ aGI xui ijX xui -udV +aGI cWo nlN nlN @@ -205979,10 +205929,10 @@ mPw svy nvw fhA -fAw +aFQ fBO dNI -uAU +hnL gYe tPm rfq @@ -206750,7 +206700,7 @@ mPw kLF tAc rfD -ojK +ibT esH maq aGE @@ -206766,7 +206716,7 @@ xui xui xui nlN -nhZ +oZk ckl qhE nlN @@ -206995,10 +206945,10 @@ dEt fsu mzC mzC -dzL -spo -iYo -uZq +sLE +xtR +mmz +hoM nzM hZJ vaG @@ -207253,8 +207203,8 @@ oIk sIX hZJ uNZ -mnq -eGg +xng +mWW pqO jXE sBp @@ -207508,11 +207458,11 @@ dEt dEt hZJ sIX -pJZ -uZq -rNm -dDP -tko +jTS +hoM +bmE +bcr +qKI luw ezI hZJ @@ -207537,11 +207487,11 @@ pnk rZe xui nlN -gxL +jXl qEH dLu hsK -uaH +jEs dXz nlN xui @@ -207794,7 +207744,7 @@ xui xui qcp nlN -nek +tzf dDH tBN txb @@ -208309,7 +208259,7 @@ nlN nlN nlN nlN -cGF +wzY abu rkd mFv @@ -209070,7 +209020,7 @@ oyh oyh oyh oyh -fQJ +gpt oyh oyh oyh @@ -209327,7 +209277,7 @@ oyh oyh oyh oyh -fQJ +gpt hQT oyh oyh @@ -209584,7 +209534,7 @@ oyh oyh oyh edA -fQJ +gpt fPW eYj eYj @@ -209838,12 +209788,12 @@ oyh oyh oyh oyh -tUT -tUT -tUT -pTW -tUT -tUT +oyh +oyh +oyh +oyh +oyh +oyh tUT eYj fPW @@ -210094,15 +210044,15 @@ oyh oyh oyh oyh -tUT -tUT -nAv -jkv -wYl -dXR -hRc -tUT -tUT +oyh +oyh +oyh +oyh +oyh +oyh +oyh +oyh +oyh eYj oyh oyh @@ -210351,15 +210301,15 @@ oyh oyh oyh oyh -tUT -rlN -rvE -dfd +oyh +oyh +oyh +oyh inK -oOr -oFN -xMG -tUT +oyh +oyh +oyh +oyh fPW eYj eYj @@ -210608,15 +210558,15 @@ oyh oyh oyh oyh -tUT -tUT -aqU -srq -pRO -nMV -vSS -tUT -tUT +oyh +oyh +oyh +oyh +oyh +oyh +oyh +oyh +oyh itT oyh oyh @@ -210866,13 +210816,13 @@ oyh oyh oyh oyh -tUT -tUT -tUT -tUT -tUT -tUT -tUT +oyh +oyh +oyh +oyh +oyh +oyh +oyh oyh oyh oyh @@ -241449,11 +241399,11 @@ dfl wRJ vpa gec -qTD +rTE bks bks bks -myU +hPL viZ vpa gwL @@ -241715,7 +241665,7 @@ eUp uzE gwL toH -toH +lNs liT xvo joE @@ -241961,7 +241911,7 @@ wRJ wRJ wRJ wRJ -dwD +bVu kKX blO sUI @@ -241969,7 +241919,7 @@ sUI sUI niA eub -hNx +qKN gwL gwL gwL @@ -242209,7 +242159,7 @@ kVp wRJ wRJ eCP -wPF +vRb wPF xkX ooF @@ -242230,7 +242180,7 @@ sJO sJO teN sVh -kkr +tNi gwL oRB cQr @@ -242471,7 +242421,7 @@ aEA aEA jNQ wRJ -cOC +oVY gec vuo oon @@ -242487,7 +242437,7 @@ oon oon sKN wFY -qIS +mSj gwL fqE oQS @@ -242728,7 +242678,7 @@ wRJ wRJ wRJ wRJ -fLI +sJO fjo ePM xxF @@ -242736,9 +242686,9 @@ wdb ylK iQp gCG +cHm gCG -gCG -reW +kgL qwC wdb huJ @@ -242983,24 +242933,24 @@ iwu iwu sDK bUH -bUH +fry gfr eJs -qsS +pyg uJX uJX oHT drk iQp hGP -wOp +nWH aim reW xwg ttk enZ mfk -uwb +mFf pDx gwL gwL @@ -243766,7 +243716,7 @@ lUZ oZx oZx oZx -qtU +qiU kPq efW xxF @@ -244009,17 +243959,17 @@ wRJ wRJ iwu ccH -joU +qdz aNA iia jat aCx -tcv +kjW drk uJX leI eDe -egy +qXv oZx oZx oZx @@ -244268,7 +244218,7 @@ iwu ccH ccH iOE -dLI +jXH uIN ltq eDe @@ -244550,7 +244500,7 @@ wiB gwL gwL gwL -vQX +rFG cXC gwL gwL @@ -245304,11 +245254,11 @@ drk mkZ drk drk -exK +lCf uQE -fkd +mso rMX -nhP +dGS drk drk kHV @@ -245552,8 +245502,8 @@ hEu wRJ mKm ggi -jST -pYE +bqH +cVK tQd tQd dJh @@ -245563,7 +245513,7 @@ tQd tQd tQd gec -fkd +mso uMu jWT awt @@ -245807,30 +245757,30 @@ hEu hEu hEu wRJ -pXi +jyc tVC tVC tVC cDu -qwM +mfM uUV ybY -fmL +vaH poL -oyo +wci tQd -spd -fkd +fjo +mso dFd awt cix gjf -ghR +gjf qoa gjf jDe -rmu -vQB +qoW +tTc xyc ahT ddx @@ -246063,7 +246013,7 @@ cee wRJ wRJ wRJ -wRJ +fPj jMv iGI vUS @@ -246077,7 +246027,7 @@ ygT wVm dJh fjo -fkd +mso dFd awt gjf @@ -246312,15 +246262,15 @@ jsF jsF jsF hEu -klw -klw +rip +rip wRJ -meK -ufZ -tJd +dHn +gXH +sEU wRJ jsY -fPj +wRJ lnM bjK jYt @@ -246334,7 +246284,7 @@ luD lXL ooE qUr -fkd +mso laJ jWT tRT @@ -246569,8 +246519,8 @@ nVq nVq mDe wsA -klw -wNF +rip +wTp wRJ eLe wRJ @@ -246578,7 +246528,7 @@ wRJ wRJ jsY wRJ -gHh +gdY hJC vzS sWC @@ -246591,7 +246541,7 @@ wTw qDu wSW faP -aYQ +gWg iOh awt gjf @@ -246601,7 +246551,7 @@ rBC pzK jDe gjf -tPh +wtg gjf gjf uCW @@ -246826,12 +246776,12 @@ nVq wRJ nVq wsA -klw -klw +rip +rip wRJ kWo wRJ -lmP +tDp wRJ jsY wRJ @@ -246848,7 +246798,7 @@ sjX kOu dJh fjo -vEw +qcd ccF awt gjf @@ -246857,10 +246807,10 @@ mQg rBC pzK jDe -jwc -vRj -vRj +gjf +vXY vRj +ldV jHJ hVt hVt @@ -247092,7 +247042,7 @@ wRJ wRJ jsY wRJ -jsb +uJa upT upT upT @@ -247102,10 +247052,10 @@ ccp pDX upT sjX -rdK +rGd tQd -fjo -vEw +spd +qcd nsn rSS xDS @@ -247123,7 +247073,7 @@ vWQ vWQ vWQ rnv -jFb +gJr vWQ wXH bVl @@ -247362,7 +247312,7 @@ pAY mOj tQd fjo -vEw +qcd ceh dMj gjf @@ -247380,7 +247330,7 @@ xna xna xna pcf -fvp +xna dSf jRP uZo @@ -247595,10 +247545,10 @@ cFQ oBy xzd wDb -dos -siB +uXi udx siB +siB ccH igy wRJ @@ -247619,7 +247569,7 @@ pDQ dpd tQd fjo -vEw +qcd fOu awt gjf @@ -247849,7 +247799,7 @@ ucA ucA ucA cFQ -pNA +sEq isA ihV dbK @@ -247859,8 +247809,8 @@ txT ccH igy wRJ -hbm -klw +xIs +rip wsZ usX nbc @@ -247876,7 +247826,7 @@ pFA qHE dJh fjo -vEw +qcd dFd awt gjf @@ -247886,7 +247836,7 @@ xDS qaY jDe gjf -gjf +wtg gjf gjf jnm @@ -248109,10 +248059,10 @@ cFQ vqz efF jkH -dGB -siB +pkH wLK siB +siB ccH igy igy @@ -248120,7 +248070,7 @@ igy igy igy igy -klw +rip wRJ tIH lyd @@ -248130,10 +248080,10 @@ vGv yeR qHE bmO -mKH +rVY tQd iYL -vEw +qcd nCL jWT rZS @@ -248377,9 +248327,9 @@ ccH wRJ wRJ igy -klw +gzU wRJ -gLF +nOw lFL mfE uDb @@ -248390,7 +248340,7 @@ lok gaA whR fjo -vEw +qcd dFd awt ubR @@ -248411,8 +248361,8 @@ pZt gyr puY fSX -pLp -lPg +vOf +lFY pXU gwL gwL @@ -248624,17 +248574,17 @@ eKC gxH sCu gUX -vaQ +rQd wUS fLu -iMz +ycg uHe vDg ccH -dxB +sCH wRJ igy -klw +rip wRJ tpS kwG @@ -248646,8 +248596,8 @@ woH lPA tDB whR -spd -vEw +fjo +qcd dFd awt jPR @@ -248657,9 +248607,9 @@ xDS jDe jDe iwU -mof +psq eEr -gjf +wVz ouk ycW ssj @@ -248669,7 +248619,7 @@ gyr gyr pHU jGF -pMn +rGv cbi tGn pSl @@ -248882,16 +248832,16 @@ ntO nJk xDC uaK -uWf +hPk dke ycg uHe vVo ccH -klw +rip wRJ igy -klw +rip wRJ bzy lGJ @@ -248901,10 +248851,10 @@ kwc mPW bvF lPA -qHK +uVI whR fjo -vEw +qcd dFd eDe jjF @@ -249136,7 +249086,7 @@ ucA uhr abx ntO -lhc +oJf rtl rtl rtl @@ -249145,27 +249095,27 @@ rtl rtl ccH ccH -jhe +bRx wRJ igy -klw +rip wRJ bIQ -vEZ +jwu lFe gYh qHR woH nLp -lPA +qWQ qIY whR jwo -vEw +qcd dFd -vpa +mYu jjF -aUy +mbM gBr sRh tUG @@ -249173,8 +249123,8 @@ eCZ vuC gyr sng -giM -tBD +iHx +aOx rRu sFt sFt @@ -249394,15 +249344,15 @@ eKC eKC sFz pMK -fok -ahY +xeE +pbj gMv -bto +vjT gTk rtl jgK -jOL -klw +xDK +rip oYT igy igy @@ -249418,7 +249368,7 @@ whR whR whR dff -vEw +qcd dFd sJO nrC @@ -249652,14 +249602,14 @@ eKC dOM vsn fok -dzT +bpY xAo -fpK +rLB gTk rtl bGl -klw -nqs +oMv +txF wRJ dab igy @@ -249669,13 +249619,13 @@ lXK csP qcA whR -gKR +kcC nMX wAM rIc sJO fjo -vEw +qcd aJb sMb fkj @@ -249695,7 +249645,7 @@ sFt sFt rXs bQG -iJr +twy tGn tGn tGn @@ -249907,7 +249857,7 @@ ucA uhr abx ntO -xAb +ilb eKC eKC eKC @@ -249932,7 +249882,7 @@ qYQ qNe jVN riC -vEw +qcd fEZ ezC rWu @@ -249952,7 +249902,7 @@ sFt xvN fWl bQG -tQV +vZF tGn dKb rxi @@ -250170,7 +250120,7 @@ cgB fFF xnL wcs -xnL +cQo qxJ wDz wDz @@ -250189,7 +250139,7 @@ xCy gsS sMb qtV -vEw +qcd dFd sJO nrC @@ -250420,9 +250370,9 @@ ucA ucA eKC eKC -eQW +fSV gsD -vsz +gKa uIQ uco vgb @@ -250441,12 +250391,12 @@ giv giv giv giv -nQI +nUp pHf rIc -koQ +pwv dnR -aYQ +gWg blw vpa jjF @@ -250455,12 +250405,12 @@ wxM sVv ogg wuC -vyy +vAP gyr vwc gMz pSV -ceC +dSl gOO pBS sFt @@ -250677,8 +250627,8 @@ ucA ucA eKC eKC -ntO -nbN +bXd +cjp wRJ wRJ wRJ @@ -250694,7 +250644,7 @@ igy wRJ cSc nEj -ins +tBV rZn iWm giv @@ -250703,7 +250653,7 @@ pMI eDe eDe oSx -vEw +qcd cGU qBx qBx @@ -250722,7 +250672,7 @@ gyr pbr sFt sxt -pDk +sal mhO tGn qCv @@ -250937,9 +250887,9 @@ abx ntO kXc wRJ -usX +rms wRJ -dIL +kdA bzO vHm owB @@ -250951,7 +250901,7 @@ igy wRJ giv giv -gRl +iPh mCD mHu dBY @@ -250960,7 +250910,7 @@ gct bNs eDe lNm -vEw +qcd gCC qBx nVE @@ -250973,8 +250923,8 @@ hlo qBx iBF swI -aiP -hRg +gTT +vqp diA diA diA @@ -251212,15 +251162,15 @@ qPn rNa cpk giv -mnB +tWI ool wZS eDe -spd -vEw +fjo +qcd nCL qBx -oNs +pjs akD fNg sWw @@ -251228,10 +251178,10 @@ fNg nBC mOh qBx -asg +bCG nzd xsQ -xUj +cgR diA sGW pmG @@ -251449,7 +251399,7 @@ ucA eKC eKC ntO -cjp +nbN wRJ igy igy @@ -251463,7 +251413,7 @@ igy wRJ xns wRJ -wGZ +vpD lqu pnK liQ @@ -251473,8 +251423,8 @@ liQ pZi liQ liQ -fjo -vEw +spd +qcd dFd nIv pjh @@ -251484,7 +251434,7 @@ sWw uiE uYg fDF -jZP +vvx ruo ftp pzi @@ -251705,22 +251655,22 @@ ucA ucA eKC eKC -nLF -cjp -wRJ -wYL -wYL -wRJ -wRJ +sLm +eKY wRJ +qxI +qxI wRJ +mcO +rrW +qxI wRJ wRJ wRJ wRJ eAE wRJ -wPN +qrZ ffZ rPw liQ @@ -251731,7 +251681,7 @@ gMf eJF liQ fjo -vEw +qcd dFd jSy jHm @@ -251740,9 +251690,9 @@ kBj dOg kXj qWo -uLA +xaN qBx -xEF +kUU tGc jzV twO @@ -251960,20 +251910,20 @@ ucA ucA ucA ucA -uhr -abx -ntO -qwR -wRJ -wRJ -wRJ -wRJ -vFB -azX -vFB +rtl +rtl +lUO +lgY +ccH +ccH +ccH +ccH +ccH +ccH +ccH rWT hxl -oue +kRn ccH wEQ wRJ @@ -251988,7 +251938,7 @@ aht xvk liQ fjo -vEw +qcd toO ouZ uOl @@ -251997,11 +251947,11 @@ fNg mZy fNg rRX -cSf +xJk qBx dFN -pwE -iaM +heF +sby anb tGn tGn @@ -252217,17 +252167,17 @@ ucA ucA ucA ucA -uhr -abx -vuH -qvb -hKI -elp -qel -gvW -oFw -ngQ -oFw +nAH +nAH +wdS +qTw +rQc +xSW +jqP +lbO +xfD +plz +lzp rWT rWT gpu @@ -252238,14 +252188,14 @@ qrd qrd qrd iHm -fQG +nVZ bQe twg pPf -rNw +uQK liQ xtI -vEw +qcd dFd nIv dPv @@ -252474,38 +252424,38 @@ ucA ucA ucA ucA -eKC -eKC -qjg -kAq -gzM -rad -isM -gvW -mbt -fBy -cQg +alu +gvj +eJd +vnG +aoG +sdi +ygU +gHu +mxJ +czZ +kwf rWT byY dzQ -uMB +bmf wIN iHm oiH ljh yjU iHm -bZj +dTB hDZ uXR pPf vBI liQ etv -vEw +qcd ust qBx -uQB +aqz bkh kOA dOg @@ -252514,7 +252464,7 @@ rOJ wSz xDX tLg -bLX +tXP nKa oLG tGn @@ -252731,21 +252681,21 @@ ucA ucA ucA ucA -eKC -eKC -vAX -umf -aEE -ijU -psv -dOY -vpJ -nlZ -gFb +alu +gvj +eUx +txB +iAZ +suv +qnN +cFg +hRp +plz +rSD rWT uhF vhL -uMB +uCn wIN iHm bqI @@ -252759,7 +252709,7 @@ eHG xjh liQ vzO -vEw +qcd dFd qBx qUs @@ -252988,17 +252938,17 @@ ucA ucA ucA ucA -uhr -abx -niT -aey -gzM -rad -guA -cYY -oWv -etJ -bRH +alu +gvj +tlK +rMC +tLb +qSv +jGl +jGl +hoo +uBE +maf rWT sNd evW @@ -253016,11 +252966,11 @@ vIh liQ liQ rMM -dxx +xdU tQF qBx qBx -grb +rTB fNg tff fNg @@ -253245,24 +253195,24 @@ ucA ucA ucA ucA -uhr -abx -jqz -kZT -sTC -fti -sFb -gvW -uoG -wLb -frD +nAH +nAH +fOH +oUu +xHK +wpt +cuT +cuT +vYE +qAa +kwf rWT rWT oLk rWT wIN iHm -pXd +lWN xwa sSB ajE @@ -253273,20 +253223,20 @@ dIU liQ ybQ ybQ -rAW +sKs bsN ybQ qBx cCS -brO -ruS +uxZ +wSG umG yhz fNg xmM fNg nGG -rhu +mSm aPH oZE lxK @@ -253502,19 +253452,19 @@ ucA ucA ucA ucA -eKC -eKC -hYU -kfj -gvW -env -ota -ibz -ibz -lRQ -rWT +nAH +nAH +hUT +lbJ +nqi +hfC +xiM +xiM +qVO +plz +bYJ rWT -mlV +usa vQs rWT lEo @@ -253529,8 +253479,8 @@ liQ liQ liQ eDe -muO -vEw +bks +bdR cKS eDe eDe @@ -253759,19 +253709,19 @@ ucA ucA ucA ucA -nAj -nAj -nPn -hEA -gvW -gzM -gzM -gvW -gvW -gvW +nAH +nAH +oJr +bTy +nqi +hSP +xiM +xiM +qVO +uBE +maf rWT -tid -cSw +lLL rzW abl nnT @@ -253782,16 +253732,16 @@ sSB qrd xvX kwe -qtt +pfc eDe ybQ gzc wdb -vEw +qcd riD sNq ifH -vma +fjo oZx oZx oZx @@ -254016,19 +253966,19 @@ ucA ucA ucA ucA -nAj -nAj -rpY -nPH -ckP -nyc -aXr -nBg -peU -nBg +nAH +nAH +ovJ +eCz +jlE +kdU +kNn +kNn +fli +oRq +kwf rWT -iwh -ucx +mAI tCj iHm iHm @@ -254041,14 +253991,14 @@ lDh pbv dZw uHg -lBy -qIU -qIU +sMg +cXK +kZH uNx -gGZ -fnf -nyI -fnf +hkV +hko +vyJ +hko oZx oZx oZx @@ -254273,20 +254223,20 @@ ucA ucA ucA ucA -nAj -nAj -blL -lpv -eXs -lqE -mnI -hBX -nBg -nBg +nAH +nAH +rSD +bTy +cZS +eIU +twv +yfm +ygn +plz +rSD rWT -rGH -vYn -aNH +tjM +wLD iHm oDe qrd @@ -254296,14 +254246,14 @@ dIv qrd bvB oZx -iQG +ryK eDe -ybQ +rYq nKn wdb -vEw +qcd riD -fQI +tcP ifH fjo oZx @@ -254313,7 +254263,7 @@ eDe xGx diU ufs -xGx +qna dDu ufs uZc @@ -254530,20 +254480,20 @@ ucA ucA ucA ucA -nAj -mEF -fbq -tJq -wlb -atn -dBI -nNQ -nNQ -nNQ +nAH +nAH +maf +hrL +nqi +eKB +nAH +hUT +hUT +hUT +iHm rWT -kff -cyz -suh +rWT +qXE iHm kgT qrd @@ -254557,8 +254507,8 @@ qrd qrd qrd eDe -nkM -vEw +drk +bdR mZI eDe eDe @@ -254787,20 +254737,20 @@ ucA ucA ucA ucA -nAj -mEF -wEw -tJq -tuA -sTN -ena -nBg -nBg -pBw +nAH +nAH +ovJ +otR +nqi +pep +yhT +sdg +tlb +nDm +iHm +ejP +iHm iHm -qrd -qrd -qrd iHm lga qrd @@ -254815,7 +254765,7 @@ cbt qrd ybQ ybQ -rAW +sKs bsN ybQ xLG @@ -255044,16 +254994,16 @@ ucA ucA ucA ucA -nAj -nAj -jcI -nop -qnN -gUD -qhn -nNQ -nNQ -nNQ +nAH +nAH +kCR +bTy +nqi +pep +yhT +piJ +tlb +piJ iHm sSB sSB @@ -255072,7 +255022,7 @@ qrd qrd bxl oSu -cYN +cuX auD eDe eDe @@ -255301,16 +255251,16 @@ ucA ucA ucA ucA -nAj -nBg -cEl -jVJ -fUs -rwP -lWU -nBg -vHn -nBg +nAH +nAH +maf +hrL +nqi +hjN +yhT +piJ +tlb +chT iHm sSB ccV @@ -255324,17 +255274,17 @@ isU isU qrd nZR -fiu +nWo bvR qNF bxl vSa -sbq +ftv jiL -lPw +iqu iuo cnx -uXS +gGp uXG wAa vjJ @@ -255559,15 +255509,15 @@ ucA ucA ucA nAH -nBg -vbF -hMe -gby -hMX -iHm -iHm -iHm -iHm +nAH +ovJ +umb +nqi +fXR +yhT +oJH +bhy +frv iHm sSB ccV @@ -255580,13 +255530,13 @@ iKT iKT isU qrd -tKg +edI nWo pRU qOs bxl gGH -sbq +ftv hTu tve cyc @@ -255816,16 +255766,16 @@ ucA ucA ucA nAH -nEC -wYU -wdl -nPn -nPn +nAH +rSD +bTy +rom +irb +iHm +iHm +iHm +iHm iHm -ejP -ejP -sSB -sSB sSB ccV qrd @@ -255837,20 +255787,20 @@ qrd qrd isU qrd -pUT +kaZ wbk hKZ bxl bxl orN -sbq +ftv jiL krT wTW izF qAY oYG -har +myQ iuo iuo iuo @@ -256073,23 +256023,23 @@ ucA ucA ucA nAH -nNQ -rdv -wdl -gme -hWh +nAH +hUT +hUT +hUT +hUT iHm sSB sSB sSB -ejP +sSB qrd qrd qrd sNE wIQ vip -wyr +ulo avP qrd eml @@ -256100,14 +256050,14 @@ vTo pbg rcm bzW -sbq +ftv mSJ iuo iuo sJg wKj laC -wtX +har iuo fhl ebG @@ -256329,12 +256279,12 @@ ucA ucA ucA ucA -nAH -nBg -vbF -feF -vZV -nPQ +hqD +hXp +nvT +dGo +dGo +dGo iHm sSB qrd @@ -256357,7 +256307,7 @@ iyt bxl qJU cdF -sbq +ftv jiL wTW tSD @@ -256586,12 +256536,12 @@ ucA ucA ucA ucA -nAH -nBg -qCY -wWn -qgR -inG +hqD +hXp +nvT +hEM +dGo +dGo iHm sSB qrd @@ -256606,20 +256556,20 @@ lNX lNX pcO qAM -fcf +oQN nWe bxl bxl bxl bxl bxl -oFS -sbq +pOv +ftv jiL wTW bZA ykb -rsr +xBl iuo iuo iuo @@ -256845,9 +256795,9 @@ ucA ucA nAH nAH +hUT nAH -nAH -nAH +hUT nAH iHm sSB @@ -256866,17 +256816,17 @@ aOt oQN nWe niM -olg +lof pUI qQN dCU hHr -sbq +ftv jiL wTW rhY ykb -xBl +foT iuo nzw iLR @@ -257102,9 +257052,9 @@ ucA ucA qrd qrd -iOY +ome qrd -eQw +gQa qrd sSB sSB @@ -257112,7 +257062,7 @@ qrd nQQ dfP nWe -kpS +rgM hwr sAi yek @@ -257125,10 +257075,10 @@ nWe nlG lof pVk -qTI +bde dCU -tGA -sbq +oFS +ftv jiL wTW wDc @@ -257377,15 +257327,15 @@ fvy apm heY aOt -uWP +hCM nWe -nrM +kZp opC lEz dCU dCU haV -sbq +ftv jiL eLw eLw @@ -257616,7 +257566,7 @@ ucA ucA qrd qrd -bva +qIv kgT tkB lTA @@ -257626,7 +257576,7 @@ qrd oeQ xgb nWe -jVT +mkl hwr oWt wJH @@ -257642,12 +257592,12 @@ pWj tZz rcm bzW -sbq -jiL +ftv +aYe eLw -bAv +shy qat -xXY +cKJ yaW peo uZc @@ -257873,7 +257823,7 @@ ucA ucA qrd qrd -nlg +kgT qrd mLk qrd @@ -257891,18 +257841,18 @@ dtc xcP qxT aOt -fcf +oQN nWe nuR otr qff dCU -lnr +kUC cdF -sbq +ftv jiL qbz -uko +smx qxy qnw vcg @@ -258130,8 +258080,8 @@ ucA ucA qrd qrd -aWG -aVs +kgT +rov vnv qrd sSB @@ -258140,7 +258090,7 @@ qrd xCX mcU nWe -omK +lXb aWd ofh mLm @@ -258156,26 +258106,26 @@ dCU dCU dCU orN -sbq +ftv jiL eLw -ipB +lFJ qxy -hTf +oyW ofa uKR nXk uKR ttt aap -uKR +mAk tLr mHa -bnu +uNd nWp uqu kBL -gCU +yfN tGn tbq tGn @@ -258387,8 +258337,8 @@ ucA ucA qrd qrd -fns -aVs +cmu +rov vnv qrd vEr @@ -258397,7 +258347,7 @@ qrd qrd qrd qrd -pnO +oVy omK mnH eCg @@ -258413,15 +258363,15 @@ fFo nqr aIs cdF -sbq -cBQ +ftv +jiL eLw jQY uKR dcZ emx gJq -ivA +hyp hyp hyp lpZ @@ -258654,11 +258604,11 @@ nDx qrd iOY qrd -heP +jEZ dXo -nVe -lbM -reK +fLf +gyW +uFO dxP fLf oqw @@ -258670,14 +258620,14 @@ gDe sYc nkO jNc -vtQ +asZ njK clf krq pSn sfv rRp -fRV +bBK eLw eLw eLw @@ -258927,7 +258877,7 @@ dwi nel gEc neh -sbq +ftv xMW wpI kNT @@ -258938,7 +258888,7 @@ dDF eLw nVl sZy -oAn +lhv pik dIi mHa @@ -259180,12 +259130,12 @@ oQN oqw nqr puI -mUg +dro nqr aIs cdF -sbq -cBQ +ftv +jiL eLw kQF qeA @@ -259441,7 +259391,7 @@ rfU rfU rfU orN -sbq +ftv jiL eLw lhA @@ -259454,7 +259404,7 @@ xhd uhB dus sul -jYH +hHc mHa vJH aHa @@ -259696,9 +259646,9 @@ kUh pzV qse rfU -bYP +tQK cdF -sbq +ftv jiL qbz hRH @@ -259713,11 +259663,11 @@ kry hTd qQe mHa -tLE +fxG yfN gId fOI -hxu +wES tGn aoM aoM @@ -259955,18 +259905,18 @@ wNL wMr rcm neh -sbq -tLb +ftv +aYe eLw -lGe +vRR qSJ -mwc +hJK hdX sZX eLw vaD vmX -uho +pvD wrJ uaE piR @@ -260206,14 +260156,14 @@ uXX beh plX uXX -qJr +wDC oTW smq rfU rfU rbm -sbq -vfU +ftv +nqx eLw eLw eLw @@ -260228,7 +260178,7 @@ ilk eLw piR npZ -qSg +pOn pOn qSg pOn @@ -260466,10 +260416,10 @@ uXX nBh ovK qmM -eUB +rTg rfU -xak -sbq +cdF +ftv jiL wfR lDi @@ -260485,7 +260435,7 @@ vRn fYH piR jlC -pOn +qSg piR rbz piR @@ -260721,17 +260671,17 @@ qrd qrd qrd aiS -ozK +ovK qov dhs rfU ouF -sbq +ftv jiL wfR wAJ tic -lnA +vyz wuL xFg mOO @@ -260742,7 +260692,7 @@ kSU yjm piR piR -abD +pOn piR piR piR @@ -260982,13 +260932,13 @@ rfU rfU rfU rfU -cdF -sbq +xak +ftv jiL wfR wJR tic -xfU +lnA wuL wuL wuL @@ -261240,7 +261190,7 @@ uNb kDB bYP cdF -sbq +ftv jiL wfR hlG @@ -261256,7 +261206,7 @@ jRM ebn piR tnX -pOn +qSg piR msu iUQ @@ -261497,14 +261447,14 @@ ssP auN rcm bzW -sbq +ftv mSJ wuL wuL sXf lzA fpb -eUI +cYu wuL mcV nZe @@ -261512,7 +261462,7 @@ piR xyz tKq vjK -qSg +pOn pOn piR uAi @@ -261748,20 +261698,20 @@ qrd tZY moe qrd -nHq +rHY dWv iaF kDB kDB nED -sbq +ftv jiL uNC wfR jtu kVF bEQ -mBb +tnC wuL wuL wuL @@ -261773,7 +261723,7 @@ pOn ojx piR iwZ -oTw +uGt myO mLp ioP @@ -261997,7 +261947,7 @@ xWr kYD iJl cvX -fpk +tRi qrd sSB lWa @@ -262005,13 +261955,13 @@ qrd qrd fiT qrd -dQj +qYM ryx qwc tqi kDB cdF -sbq +ftv kbR iCQ vQZ @@ -262026,10 +261976,10 @@ piR piR tUc vZK -abD +pOn tUc piR -msu +uAi mVj fBt exN @@ -262263,17 +262213,17 @@ pIu cmu qrd nIt -got +ryx qAI uLH kDB gGH -sbq +ftv jiL -oKc +gQO wuL tJY -mdc +aRM hWS hSo jtm @@ -262286,7 +262236,7 @@ cJi pOn ozS piR -uAi +hrc xWV fAp yhX @@ -262525,7 +262475,7 @@ kDB kDB kDB jRe -sbq +ftv glu wuL wuL @@ -262760,15 +262710,15 @@ qrd sSB ejP qrd -jJU +wzO dps fFB -kjm +mzr hUX -rfR +hjF tbd agp -gPN +eHU gAC qrd hdx @@ -262782,7 +262732,7 @@ gLf gLf hQK nkO -vtQ +asZ rId bin vRv @@ -262797,11 +262747,11 @@ syH wMX vrw piR -pOn +qSg myO tto anH -iSO +hGz myO mLp ioP @@ -263054,7 +263004,7 @@ nHW nlf rKM piR -mZh +taR myO vMm yaK @@ -263275,7 +263225,7 @@ kRw hng kRw iMN -sLa +dNp jWR klc qAd @@ -263284,7 +263234,7 @@ qAd jIA kKk vNP -oXR +vNP vJu iMN hJV @@ -263305,13 +263255,13 @@ qNK ddg nzj lRY -irT +kGe fZX gwb cFM -aNB +mwK piR -qSg +pOn uDH qRE qQr @@ -263562,7 +263512,7 @@ nIT aAj jXb lRY -ngL +pEE fZX pCr fwb @@ -263570,7 +263520,7 @@ qFz piR gHN myO -uXD +udF vSW dYB wkL @@ -263823,7 +263773,7 @@ ghQ kux joL tmq -cnn +tfD piR pOn piR @@ -264045,7 +263995,7 @@ kRw cYS onl kRw -qNu +qSR rCq kch fpU @@ -264065,7 +264015,7 @@ ogW xMJ rQl nqr -qrw +qhN oCF oCF oCF @@ -264082,7 +264032,7 @@ wkH uRQ bCk piR -qSg +pOn pOn pOn pOn @@ -264315,7 +264265,7 @@ xmk tup kes miH -mpr +ogt iMN eIK nEX @@ -264326,7 +264276,7 @@ mjZ oCF oCF oCF -qPb +nhl mtx xeZ xlE @@ -264590,11 +264540,11 @@ usN aAj krw lRY -jPn -mHm +xbx +mcj lRY nhG -xIX +pVd mwD bvc sQG @@ -264817,14 +264767,14 @@ nvo cIM kRw iMN -xlO -blF +hlU +bMt iRc lOA rdt iCS pmw -uJT +cwF bTe jlS bGb @@ -265091,31 +265041,31 @@ nGj kTL ogW iQi -geW +iil ibs fQi now -mJL +oCF qjK ajX bUZ -kDP +xpk trq rDR cmH nzr pWQ tzb -uXj +pWQ cTb oGt rbp -sdV +foL foL leY piR awU -get +piR fHE piR mom @@ -265587,7 +265537,7 @@ kRw cIM jrM kRw -qNu +qSR rCq kch fpU @@ -265607,7 +265557,7 @@ fAT ddg wSR aSu -fQi +wGz ggd ggd oaS @@ -265617,7 +265567,7 @@ ddg bAf grv kYM -jNY +sdX fIk aXj awn @@ -265859,18 +265809,18 @@ nZu iMN iMN ifh -otO +jLX eKf -xld +gLf uzK aSu fQi roo -roo +cKH vUG ajX nXA -pYX +ddg frW frW frW @@ -266359,7 +266309,7 @@ izw cIM kRw iMN -kjp +kMX kgK mAJ fll @@ -266377,13 +266327,13 @@ jhx hGp nqr aAx -aSu +wjx aSu aSu kXt nXA nXA -nXA +fvx ddg frW tkF @@ -266395,9 +266345,9 @@ frW pZB xAL frW -yll +boa qNW -dER +hLo piR xRs bKR @@ -266627,7 +266577,7 @@ wjm kEv hLd bfj -hdJ +bfj iMN kFJ oqd @@ -266872,7 +266822,7 @@ kRw cIM cIM kRw -jUT +xbZ wJS blF pQk @@ -266882,7 +266832,7 @@ hjg dBj aib weg -hLd +thu bfj bfj iMN @@ -267154,8 +267104,8 @@ eqF cHE gFh frW -sdD -smr +gIf +yfT frW frW frW @@ -267390,7 +267340,7 @@ kKG kRw aNz ciM -qCR +cZB stx dFL yiK @@ -267403,20 +267353,20 @@ kRw axP hdg kRw -fKb +ykC uVL tTn tTn fGx jjg -mDd +fjF frW iTX sqi sEt tzA -lHG -ocW +vsY +aXh vsY wAO iqv @@ -267646,16 +267596,16 @@ iSD uaG kRw xXK -vlc +luS oEk hdN uCP vCy kRw -gJM +bKz kWa wQX -ekO +bSR kRw ihn rQf @@ -267665,10 +267615,10 @@ faS fXB quO cgm -wYu +ehZ frW frW -nMj +chn suP sFe tOl @@ -267681,7 +267631,7 @@ xkC vlP hww xFl -dER +hLo piR pOn gSS @@ -267906,7 +267856,7 @@ mLO aRX oEk gfP -uCP +pgv pyt kRw iGo @@ -267924,7 +267874,7 @@ shV kok wcQ frW -xYm +tdG pyU sxm sFf @@ -267932,7 +267882,7 @@ kba qwg uEG vJE -nbw +wKE frW jPD xHw @@ -268161,7 +268111,7 @@ ata kRw qgh ciM -mJP +wJf atL dBf yiK @@ -268189,7 +268139,7 @@ hip uEG uEG vJE -wKE +osk frW frW xLd @@ -268683,7 +268633,7 @@ kRw pJq pwA rlX -amf +xLO kRw abJ sBE @@ -268693,9 +268643,9 @@ wvw dTe jzv asS -wsL +qzh frW -xYm +tdG sKR sxm sFf @@ -268703,10 +268653,10 @@ ttG qXs uEG vJE -nbw +wKE frW -ugW -tjq +oce +cAU ycu piR bGh @@ -268942,7 +268892,7 @@ xJM hCJ vXH kRw -sBE +jsb iMM kRw cpa @@ -268953,7 +268903,7 @@ sjc kRw kRw kRw -phE +nre sxv sId tOP @@ -269202,7 +269152,7 @@ kRw cVU kRw kRw -wJx +fpp asS asS rbD @@ -269214,8 +269164,8 @@ mbD hzL frW tRo +lTg eFr -vtd sqj wKL xfI @@ -269461,14 +269411,14 @@ cIM kRw ufW gIg -wop +czu xwX xwX kRw evI kRw -xQc -sCe +hzX +rXx piR piR piR @@ -269974,7 +269924,7 @@ cIM cIM aKx cfH -xng +nmV pcC dfw aKx @@ -270231,7 +270181,7 @@ kRw kRw aKx cfH -nmV +pBZ pcC pcC aKx @@ -275374,13 +275324,13 @@ ucA ucA ucA ucA -tUT -tUT -tUT -tUT -tUT -tUT -oyh +ucA +ujI +pRs +pRs +pRs +wbT +ucA ucA ucA ucA @@ -275630,15 +275580,15 @@ ucA ucA ucA ucA -tUT -tUT +ucA +ucA qRS -fwF -frE -vba -tUT -oyh -oyh +acl +pRs +acl +xUk +ucA +ucA ucA ucA ucA @@ -275887,15 +275837,15 @@ ucA ucA ucA ucA -tUT -rlN -rvE -kGy -inK -oOr -tUT -oyh -oyh +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA ucA ucA ucA @@ -276144,15 +276094,15 @@ ucA ucA ucA ucA -tUT -tUT -nZJ -jps -ydj -pzH -tUT -oyh -oyh +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA +ucA ucA ucA ucA @@ -276402,13 +276352,13 @@ ucA ucA ucA ucA -tUT -tUT -tUT -tUT -tUT -tUT -oyh +ucA +ucA +ucA +ucA +ucA +ucA +ucA ucA ucA ucA @@ -306216,7 +306166,7 @@ gMe gMe cGQ dkD -pvA +rrX iJM tms gMe @@ -306469,7 +306419,7 @@ xHe xHe aNs sGb -faE +mXD ijQ izV rrX @@ -306477,7 +306427,7 @@ rrX rrX dDC sAw -kWq +iVP sGb uIx voT @@ -306728,11 +306678,11 @@ aNs cRe rrX djJ -twM +pWa rrX kbS rrX -sig +uKT bDC rrX fxT @@ -307239,10 +307189,10 @@ qox qox qox aNs -nQV -bpI -rrX -yeS +pYj +hTj +vjm +fBA lhi wri gEW @@ -307496,9 +307446,9 @@ gEB cmw cHz aNs -niL -ode -vjm +sQw +rDQ +rrX ewp eIb uBN @@ -307506,7 +307456,7 @@ mzv wvA rrX nss -oGo +wqQ uIx sVi wJq @@ -307753,7 +307703,7 @@ yiI uxw pkm aNs -qFW +mPs ivk rrX rrX @@ -307763,7 +307713,7 @@ bDC rrX rrX iBb -gUr +rzg uIx sow kMb @@ -308002,7 +307952,7 @@ ucA xHe xHe ioM -uxw +rce xjQ iqD euv @@ -308267,15 +308217,15 @@ mwr eGK onE aNs -szY +gEo wFT -eRd +gaJ qOq twM njS piI kcr -hwB +qNY iTN qGF uIx @@ -308792,7 +308742,7 @@ eCM nET eCM uNm -abz +vQR hEQ uIx rhJ @@ -309050,7 +309000,7 @@ fst mWn uFw vQR -cNP +xDy uIx nDu nDu @@ -309311,7 +309261,7 @@ uIz uIx oqx mpZ -mpZ +rUN rSK rao hVk @@ -310071,7 +310021,7 @@ iPY iPY wbr agK -wLJ +spF bCq abS fsY @@ -310328,7 +310278,7 @@ wQU hJF rEU gxn -uPX +dfm ogl rEU gxn @@ -310575,7 +310525,7 @@ sTG qlp qlp oKq -mFS +gMi ciz dWu wfx @@ -310585,7 +310535,7 @@ vLW gYS gYS bmD -ncW +lgD hPl hIb fKZ @@ -310840,10 +310790,10 @@ wJt mIT vLW kHl -vYr +hJF gxn -iWd -eha +rlP +ogl czp czp wgO @@ -311094,17 +311044,17 @@ wnO pIS lRR vPj -saK +igw vLW pmo wtt gxn -uPX -jEf +dfm +dmQ czp -siv +tAE jjs -bGP +bja bcD mtW uIx @@ -311356,7 +311306,7 @@ oKq bJV hWp mdE -uPX +dfm ogl czp sFa @@ -311599,13 +311549,13 @@ lJp aNs glw aNs -gZJ +drw per -hkj +dNw jvM nSV pHT -xOa +phj ehu qOO ced @@ -311613,14 +311563,14 @@ oKq dWL oKY cfu -uPX +dfm ogl wgO apT aGm aGm gtw -bIs +hGa uIx uIx uIx @@ -311870,7 +311820,7 @@ hxJ cWf cWf cfu -uPX +dfm ogl wgO xYS @@ -311882,7 +311832,7 @@ oTx uqc nYe jAe -rta +fwj lOe uIx aaO @@ -311890,7 +311840,7 @@ xFo lBG gmg tIa -wkF +brM dad qlh nDu @@ -312115,9 +312065,9 @@ glw aNs mGY mUm -bgX +ugn jvM -iiF +eVo lYP fzU fzU @@ -312127,7 +312077,7 @@ hxJ oKY cWf cfu -cKO +rti prf wgO rZb @@ -312143,13 +312093,13 @@ xMF kBi uIx rao -rao -rao +vej +pAv nry eiO wkF voT -qyi +qlh nDu nDu nDu @@ -312360,7 +312310,7 @@ xHe xHe exe xHe -exe +qox mhY uxw epQ @@ -312384,7 +312334,7 @@ oKq cWf vlD qND -uPX +dfm ogl wgO xYS @@ -312392,7 +312342,7 @@ ltC mpL joH oEC -gNd +xpi uqc bru wQR @@ -312641,7 +312591,7 @@ jCA jCA jCA xEB -uPX +dfm ogl wgO xwx @@ -312873,7 +312823,7 @@ ucA xHe xHe bRh -bRh +keX rQx uEY uxw @@ -312898,14 +312848,14 @@ usF kti jCA jib -uPX +dfm ogl czp rAe sFa sFa sFa -gMG +jUC uqc fOj ghH @@ -313146,22 +313096,22 @@ nPE nPE nPE asb -wFV +sIT oKq -lmg -jvW -gdk -jvW -llS +kxM +eFq +bGt +eFq +pUn dVk gxn -uPX -nYO +dfm +ifq czp -fKD +uIL nSS -aPt -bHr +uDA +xSM auK uqc eJX @@ -313178,7 +313128,7 @@ vEa iZA fTa fTa -aOB +vqe fXs dek dek @@ -313391,9 +313341,9 @@ mXH qyH mXH pSI -nmc +mUd xJx -rov +nPE bvM fUk rXJ @@ -313403,7 +313353,7 @@ eRZ uIr nPE tKs -xLV +hug oKq fpg rQj @@ -313412,7 +313362,7 @@ pQG wMM nvs ixZ -uPX +dfm doQ uqc uqc @@ -313650,7 +313600,7 @@ mKO rDL fPd jha -rov +nPE xVV gsy uwf @@ -313669,7 +313619,7 @@ vOy lKn dVk gxn -lrV +ePJ gHt hUR aId @@ -313677,7 +313627,7 @@ aId dKF tRq hUR -cbJ +sRG lOk wPw scH @@ -313925,8 +313875,8 @@ vNq bMa ngX jCA -qwJ -uPX +gxn +dfm rvZ lgX wFA @@ -314161,7 +314111,7 @@ mSG mSG aSX aSX -vGP +pqH obC mKu hHi @@ -314183,7 +314133,7 @@ wwE lKn bOE gxn -uPX +dfm wVl uqc uqc @@ -314198,7 +314148,7 @@ ubt xZb tPx rJI -idH +bkd vEa owb fXs @@ -314425,7 +314375,7 @@ jjj dIJ oTq jjT -jjT +hmM nPE pDq iea @@ -314440,9 +314390,9 @@ piw hQQ kVZ dmc -lrV +ePJ qRM -ouI +fUq jzF nFH bkT @@ -314452,7 +314402,7 @@ uqc xrh krU uTB -oGE +mDl efb qsP llT @@ -314461,7 +314411,7 @@ owb fXs dIh wtL -wtL +sKg bAG wtL fXs @@ -314690,18 +314640,18 @@ nPE nPE nPE jCA -ycc -qQZ -tPv -qQZ -lMQ +fQF +mBM +bxb +mBM +rmZ bOE gxn -uPX +dfm gRe -raq +kbI oAe -wlD +uOh scI jwj aYl @@ -314937,7 +314887,7 @@ xgo kFy xTG xxA -rLe +xdE nPE uZr moL @@ -314954,7 +314904,7 @@ hNh sdB jCA yeq -uPX +dfm gRe raq vIr @@ -315211,7 +315161,7 @@ iXS gYS gYS rPF -uPX +dfm mSP tLk vIr @@ -315441,7 +315391,7 @@ ucA ucA ucA sJm -ieY +iwD rDL sab vuB @@ -315451,7 +315401,7 @@ hfE bep hnG pNa -pGb +sJM nPE pDq cSk @@ -315466,9 +315416,9 @@ iLH mBt iXS gBU -tIy +tYW lui -uPX +dfm gRe raq vIr @@ -315489,7 +315439,7 @@ vEa vEa vEa vEa -owb +vEa vEa bAG bAG @@ -315725,7 +315675,7 @@ whb pNW oCx oCx -uPX +dfm gRe hbg oAe @@ -315742,13 +315692,13 @@ xqY mau mau mau -piE -gDN +hSD +raE pke +fmG +nhZ vEa -owb -vEa -vEa +aIU wtL bAG wtL @@ -315961,7 +315911,7 @@ rhw kKO sRn sRn -dQb +iAt sJm sJm sJm @@ -315982,7 +315932,7 @@ tuc dJo wJT wJT -qOS +pwI mVq oAe oAe @@ -315997,16 +315947,16 @@ nEZ qmf xAn ygI -vDz +lbp lXx ltD nah jLm -vEa -owb -owb +hLq +eQd vEa eEN +wtL bAG tqr fXs @@ -316213,7 +316163,7 @@ ucA ucA sJm sJm -mgz +mcr rhw mZT xLo @@ -316227,7 +316177,7 @@ moL moL xZu nPE -heh +dUY axF jUg aMo @@ -316239,7 +316189,7 @@ hhI hRP euu euu -cKO +rti kTm bDL dHD @@ -316259,10 +316209,10 @@ lXx dAe hhX dlt +hLq +wQh vEa -vEa -vEa -vEa +iQB eGl fPD jbV @@ -316487,16 +316437,16 @@ nPE hKt nWP xvr -xQU +hIB nTo hns -bHL +oCb jbr iXS eHr wGb mvw -uPX +dfm moj bDL ebK @@ -316516,8 +316466,8 @@ sWm qHo wtF wtF -dlI -omH +bnL +uDL vEa jbV guI @@ -316753,7 +316703,7 @@ iXS gYS gYS gir -bqO +tnj bOZ cBl xFp @@ -317001,8 +316951,8 @@ sCz nPE qPv pJV -phZ -hxt +iag +uqF iqy mKs ryE @@ -317010,7 +316960,7 @@ bwu wwT aBV kyj -uPX +dfm pzw aqO eeq @@ -317031,7 +316981,7 @@ rHf cdf ooN hwL -heZ +mjM vEa jbV qZh @@ -317245,7 +317195,7 @@ bkU bJi aWw blj -twR +tvY nPE pDq gAd @@ -317267,16 +317217,16 @@ dNU btT hIb uSW -uPX +dfm cjo bDL jgG jgG bDL -hvN -wsi +kQS +raN lXx -apg +rYf dtM ptW mdL @@ -317286,7 +317236,7 @@ apg lXx wIW iTA -ykW +xEl jtb oiu vEa @@ -317502,7 +317452,7 @@ mGF eNX bNP nQj -nQj +rCj nPE pDq gDy @@ -317520,11 +317470,11 @@ geD fmx mKs lif -jmI +vzP vGy vFV ibi -uPX +dfm dTF jgG bUW @@ -317758,7 +317708,7 @@ lln anK jxz iMu -pBQ +twd qbl rVJ pDq @@ -317780,8 +317730,8 @@ liQ liQ liQ liQ -sZF -uPX +aZX +dfm pIG buI nVW @@ -317793,7 +317743,7 @@ auJ pGy fTn eOy -aJm +eOy iGA eOy exp @@ -318033,12 +317983,12 @@ qLH geD wHu jmR -aaX -qXg -hZe +chO +nII +cAO liQ gxn -uPX +dfm cjo jgG sTs @@ -318269,7 +318219,7 @@ ucA ucA lln lln -qzR +tXW vnI vnI lln @@ -318284,7 +318234,7 @@ stk spI rLM nPE -dZP +cuK ipn fBw tPG @@ -318295,7 +318245,7 @@ pEx ccc mrZ lGi -pYz +mLb xat bDL sXM @@ -318305,7 +318255,7 @@ lvT meV lvT vWw -rny +tUF eBy eQN dXX @@ -318552,7 +318502,7 @@ hJJ liQ liQ xUQ -ncW +lgD nfY bDL lvT @@ -318570,7 +318520,7 @@ fQA fQA fNA ebz -jpS +vuQ lku vEa owb @@ -318789,7 +318739,7 @@ lln lln gDy bpF -vVZ +tfs gDy szn wLj @@ -318800,7 +318750,7 @@ oaU nPE qPv yaY -nkw +wqP iNA obK kpI @@ -318809,7 +318759,7 @@ sQv liQ rEU rEU -pDu +sJu rEU rEU lvT @@ -319065,8 +319015,8 @@ liQ liQ liQ nWW -qbO -uVr +hid +nQX bgI eOP eOP @@ -319085,9 +319035,9 @@ wcm ede dgq mXU -mnG +ojp fDI -wcf +rVi vEa owb fXs @@ -319298,7 +319248,7 @@ ucA gDy gDy won -pVN +tLf bew jCM gDy @@ -319316,18 +319266,18 @@ moL moL hMp gDy -niF +yfs vRO qbg nWW -uIk +tEh bVy vVu -uVr +vOE tDs pRS elo -vNw +kfq vRO vRO vRO @@ -319577,27 +319527,27 @@ qCq nuw bBw gTM -xiG -rzY -rzY +nMz +jgd +kpl tFp -sjr -fxa -qaD -sjr +gQh +gGr +jtF +gQh vRO vRO vRO eOP vWw -qer +rny kIO qXn sMp wSb wcm fQA -gsg +ngK dnU sQj otJ @@ -319831,15 +319781,15 @@ bpF bpF gDy erp -erp +vMg dzD nWW uIk pjU tDs -uVr +vOE dYh -xos +qey elo ptg vRO @@ -320093,8 +320043,8 @@ txa txa txa nWW -wuQ -uVr +kQk +nQX kQk eOP eOP @@ -320342,16 +320292,16 @@ gDy gDy txa gIK -fsp +lty wLd uxF -nCD -gzD +awR +gIK gbR txa uIk uIk -jcw +tNU uIk uIk dPH @@ -320608,7 +320558,7 @@ rqU txa txa qCH -vmJ +aYb wxw dPH dPH @@ -320627,7 +320577,7 @@ xYz cfD vWw vWw -fwC +wDE cWK sWo ycM @@ -320864,12 +320814,12 @@ dWg dWg fYr txa -bVy -uVr +fiw +vOE uHa dPH rWz -mCS +vKA dyX dPH tbX @@ -321112,21 +321062,21 @@ chP cgw lad txa -twB +rVk yfx rCk rCk sqv lhO lhO -dWg +cGT txa mlH -uVr +vOE nYZ jfr hxz -qCW +vES uyX aCB vBa @@ -321135,14 +321085,14 @@ adT krW sHY dPH -iGy +rAP rTw nhm qQG puQ qjr sWo -jvz +bJj wyv ycM nXQ @@ -321376,15 +321326,15 @@ vVB pll lhO lhO -fdV +flX txa bVy -uVr +vOE rBY uiv yfq -lfF -dpb +tAs +mho uiv neR mZH @@ -321394,7 +321344,7 @@ sHY rDZ cbw lOp -kvk +ira dtX oOW qjr @@ -321633,14 +321583,14 @@ mnE pll lhO pux -cGT +tnn cmM bVy -xmG +tnV daD hLN kkK -sVX +fDA emk wmr hHq @@ -321651,16 +321601,16 @@ sHY xIP cbw lOp -qsN +izj cUd lXm kdh -cSq +tGz iXF sPs ycM dmR -tkM +vRa tkM pze ncB @@ -321893,7 +321843,7 @@ lhO hbS oho rRP -uVr +vOE mcq dPH sEk @@ -321908,15 +321858,15 @@ sHY hAP qtQ owC -cJf +gUH fCS mqB lOp -ozE +xCR iXF sPs ycM -bGy +sOU sOU sOU gWN @@ -322140,7 +322090,7 @@ mIQ moq nqI txa -lIr +csw fQv jFK tpy @@ -322150,7 +322100,7 @@ gJu cwD txa bVy -uVr +vOE nXw dPH dPH @@ -322165,11 +322115,11 @@ sHY cAt cbw xOY -dnI +nzV xDG qqE eLg -oMn +jeQ uXo sPs orf @@ -322397,7 +322347,7 @@ moq chP lad txa -dWg +urS xkR tRh suD @@ -322407,10 +322357,10 @@ nRU pOY wtM qdY -uVr +vOE aUR xEP -gxS +tOc hED xhp xEP @@ -322426,7 +322376,7 @@ smY eoG syd qnv -msW +khn iXF sPs ycM @@ -322661,16 +322611,16 @@ fhG nLc lhO nRU -pDv +rVN cmM bVy -uVr +vOE aUR wiT cWy tcm inj -inO +skQ hED bNg dPH @@ -322678,10 +322628,10 @@ nSg oDd dPH vuf -nkr -oSf -iKy -hdK +jjA +gSD +bSJ +iaO gMo jOc iXF @@ -322918,10 +322868,10 @@ tha nLc pux nRU -fdV +kKQ txa -bVy -uVr +fGm +vOE wDy gaC hED @@ -323168,17 +323118,17 @@ sHQ uOo aUH txa -twB +rVk rVk uOd snp qzH lhO nRU -dWg +pDv txa mlH -uVr +vOE scG wiT anj @@ -323435,13 +323385,13 @@ djd ejK txa bVy -uVr +vOE aUR xEP ooW wyY mra -eWe +uft vkZ cgZ dPH @@ -323691,8 +323641,8 @@ meD vCI txa txa -fGm -uVr +bVy +vOE omS ffe ffe @@ -323708,9 +323658,9 @@ bsI oOi dOD dVq -kNd +bBg qFI -aLu +omP uOL nGS ycM @@ -323942,20 +323892,20 @@ dlW ram txa wLd -eXI -qht -rEi +tYa +pEz +mHx wLd txa -woi +vse tnT -vGW +fIs aUR ffe mrc rMl rMl -cIf +tMB ffe lPf jOA @@ -323963,11 +323913,11 @@ ejn tNd qxZ uHT -jxA -lOz +uJN lOz +gAD qFI -egV +wuc xZL xZL ycM @@ -324186,7 +324136,7 @@ sOB hJG cVo oGD -rio +imt xPX dlW dlW @@ -324204,15 +324154,15 @@ txa txa txa txa -bWl +ctv bVy -uVr +vOE aUR wrj oWR fVw fVw -lTw +xYO ffe sfB oQn @@ -324456,14 +324406,14 @@ mWq pYw pYw utJ -jon -bae +dqe +uHI uMS iUZ vxy hUe tzV -uVr +vOE aUR wrj oWR @@ -324477,15 +324427,15 @@ jsH jak amm oYW -eFj +kTI cBE guF jiM dSF -sLA +kTI wkv kTI -eWl +sJK ycM rCx sBN @@ -324713,14 +324663,14 @@ vxy khs vxy vxy -jiz +cjK dWK hTz lQo kvi kmG xWF -vGW +fIs wDy wrj wpV @@ -324733,7 +324683,7 @@ kxP jsH bwF xkw -skD +qXW skD skD skD @@ -324952,11 +324902,11 @@ ucA ucA sxo sxo -wlX +kTV wlX sxo -tzp -vol +nps +dMt cOz mqd sxo @@ -324970,14 +324920,14 @@ hre shW ofD vxy -mHc +rxd oWC rbR -ftW +ciU vxy sds qxb -uVr +vOE aUR wrj gbL @@ -324988,7 +324938,7 @@ wrj vTj fhv jsH -iVh +lbt gDx gDx vrM @@ -325233,14 +325183,14 @@ rKk drD vxy vxy -bBA -uVr +fNL +vOE aUR wrj hmv fVw sVV -xVJ +glW ffe emV uwA @@ -325471,7 +325421,7 @@ flS nPp vyW dje -bmr +eop xRf sxo ngT @@ -325484,23 +325434,23 @@ eET hSQ dpQ vxy -nTv +odP tme ohm upx sfR dJF bVy -uVr +vOE oct ffe kHa -rsI -gwS +jVG +fOB onk ffe nxU -iTM +iYC uUE kTh gDx @@ -325723,12 +325673,12 @@ ucA ucA sxo sxo -pug +boq kem uOS vyW -myx -oDQ +dje +eWC sxo sxo sxo @@ -325748,7 +325698,7 @@ pgL qSD dJF bVy -uVr +vOE aUR ffe ffe @@ -325766,7 +325716,7 @@ rNT tBj vWE idu -dgB +mmL tBk qTA cXr @@ -326005,7 +325955,7 @@ weQ nXm dJF rmF -uVr +vOE bZd pOG gEk @@ -326014,7 +325964,7 @@ cXD gEk loF dPH -wSw +szo uxl lOB gDx @@ -326022,8 +325972,8 @@ aPh rSJ izn gDx -nsu -vJw +aEq +kXN tBk kwt wKi @@ -326242,7 +326192,7 @@ sSl lcN vyW jjo -koS +cqm sxo xiA xiA @@ -326262,7 +326212,7 @@ dlW dlW vxy fkL -uVr +vOE aUR pOG iqg @@ -326494,7 +326444,7 @@ ucA ucA sxo sxo -wlX +kTV wlX sxo vyW @@ -326519,8 +326469,8 @@ qAw dlW ipQ bVy -uVr -aUR +vOE +keN pOG faM iuA @@ -326774,9 +326724,9 @@ eWW pKD fuy dlW -rIK +hPK bVy -uVr +vOE dBZ pOG sRH @@ -326791,7 +326741,7 @@ twZ gll rTa rTa -mCG +dsz tBk kbN jHI @@ -327014,14 +326964,14 @@ mTg qrN veQ ycq -omE +vfc qrN veQ -vNF +ncC veQ qrN veQ -vNF +qrN lJB kTZ ydL @@ -327033,22 +326983,22 @@ qOV uvJ wJj rgc -huA +gGi bYq pOG hkd qfG -jGb +oxQ isg tUa dPH -bfD +jCK uxl eYw dPH tTJ ljs -mPV +jpT tBk poY bie @@ -327267,14 +327217,14 @@ oXa kSA vfa ooy -svP +kXs uVk rPX kvR jYy nGL mvM -cVp +iah mvM nGL mvM @@ -327289,7 +327239,7 @@ tEc dlW dlW nWW -txN +nhV mMS vvY pOG @@ -327556,10 +327506,10 @@ noj fkA fkA pJz -gUg +mHl wPW -itu -jnM +sTr +mph qkP jVK opP @@ -327785,7 +327735,7 @@ aLe xVF deM deM -dLx +deM deM act rNo @@ -327794,7 +327744,7 @@ haW vQt rNo mBP -qth +tOE dlW jTo dlW @@ -327812,7 +327762,7 @@ qYq pOG fkA fkA -xhV +pxt sTr wPW dvT @@ -327822,7 +327772,7 @@ jVK gqI bqs cSQ -hiN +dVx mMw kPy xko @@ -328051,7 +328001,7 @@ moO eHN wGL xLw -xBX +lpF dlW dlW dlW @@ -328085,7 +328035,7 @@ vZb xko tDG qPV -uDW +vxq cZA wtp wtp @@ -328305,9 +328255,9 @@ deM rNo moB ayl -uYr +qJq rNo -wwM +xjI ydi rNo gVS @@ -328336,7 +328286,7 @@ jVK ozO ozO ozO -rnu +ozO ozO xXd qry @@ -328566,7 +328516,7 @@ rKJ jks veQ tjF -nGl +cVR nGl rNo rNo @@ -328588,7 +328538,7 @@ fkA kUZ wcL oqQ -vQo +iKR jVK lum arq @@ -328599,7 +328549,7 @@ sUP xko rJF qqp -qxV +oPm tdb wtp wtp @@ -328844,7 +328794,7 @@ qgw fkA dkP oqQ -duI +jLF iMc jVK pfj @@ -329841,7 +329791,7 @@ fsR xVF deM deM -dti +deM deM act rNo @@ -330141,7 +330091,7 @@ aWv owo rJF bjw -lvE +tgz vhr wtp wtp @@ -330355,9 +330305,9 @@ bIl kkA aDi gxc -vox +kZe gxc -yau +utw fVV lGb ity @@ -330614,7 +330564,7 @@ kqk pxF fkp apl -cue +cVl fVV fVV fVV @@ -330649,13 +330599,13 @@ gjH cYW wcW dWj -bTk -nvR +jEY +vlf cib owo rwq hWH -sIY +mXn gvU qkS qkS @@ -330871,7 +330821,7 @@ aDi aDi aDi aDi -wdo +aDi oUl jDq psh @@ -330898,10 +330848,10 @@ oyh wMF wMF wMF -xTF +cOx kDz icn -cRw +wQo uEF uEF oiw @@ -331127,7 +331077,7 @@ gxc cNH fvJ bvP -pTv +sdZ fVV fVV tVU @@ -331158,7 +331108,7 @@ wMF wMF ttw oEB -cRw +wQo tun mSN siT @@ -331380,7 +331330,7 @@ fVV fVV fVV fVV -ulj +ooQ nxV gbZ pqe @@ -332944,7 +332894,7 @@ xHg nbP hzu nJR -gNs +cvZ mDn nwR nbP @@ -333456,9 +333406,9 @@ tzU hKw nFT nbP -guV +ovP mDn -rZu +qQS nus mkL nbP @@ -333715,7 +333665,7 @@ oyh nbP nbP xRQ -rXG +oRS lFj nbP nbP @@ -334228,9 +334178,9 @@ aFj aFj aFj sOy -hWB +rZC uDR -tGV +knY sOy vyR vyR @@ -334486,7 +334436,7 @@ fpH aFj mWh oTA -oiP +nEI dWG mWh vyR @@ -334745,10 +334695,10 @@ fzr iBc jPj onI -pbd +oiP vyR imS -cxP +dQQ edZ rOj jth @@ -334996,7 +334946,7 @@ clH wvd trB ykV -fQh +hzI aFj wmt nEI @@ -335253,19 +335203,19 @@ fnL ykV tOV szK -aQi +pUq aFj -bVo -onI +uGT +iqz cNT -dWG -hux +qEG +mhu vyR xEZ vyR vyR urf -cCT +inl vyR vyR vyR @@ -335510,19 +335460,19 @@ daa kZZ tOV knH -rKN +hwN aFj -wXy -onI +cOS +iqz mIX -nxe +dUq xZM vYJ -bCC +rUi vyR vYX rOW -qII +bqU vyR vyR vyR @@ -335773,13 +335723,13 @@ hSt iqz lbx nEI -atx +oiP vyR ldv vyR vyR rOj -aPR +nwW vyR vyR vyR @@ -336020,7 +335970,7 @@ oyh aFj aFj aFj -xTR +byX vPg uNq knH @@ -336028,7 +335978,7 @@ knH aFj oha dWG -lbx +pIf oiP bNh vyR @@ -336285,14 +336235,14 @@ ims aFj mWh oiP -pIf +nEI fNY mWh vyR imS -qWi +wYd col -dbv +urf mqG vyR vyR @@ -336542,7 +336492,7 @@ uEb aFj sOy dog -sTJ +mWh dog sOy vyR @@ -340910,12 +340860,12 @@ ucA ucA ucA ucA -tUT -tUT -tUT -tUT -tUT -tUT +ucA +ujI +pRs +pRs +ucA +ucA ucA ucA ucA @@ -341166,13 +341116,13 @@ ucA ucA ucA ucA -tUT -tUT -gwD -chA -lhP -vba -tUT +ucA +ucA +ucA +ucA +ucA +ucA +ucA ucA ucA ucA @@ -341423,13 +341373,13 @@ ucA ucA ucA ucA -tUT -rlN -rvE -vKH -inK -gMd -tUT +ucA +ucA +ucA +ucA +ucA +ucA +ucA ucA ucA ucA @@ -341680,13 +341630,13 @@ ucA ucA ucA ucA -tUT -tUT -qRS -jps -plE -ikF -tUT +ucA +ucA +ucA +ucA +ucA +ucA +ucA ucA ucA ucA @@ -341938,12 +341888,12 @@ ucA ucA ucA ucA -tUT -tUT -tUT -tUT -tUT -tUT +ucA +ucA +ucA +ucA +ucA +ucA ucA ucA ucA diff --git a/_maps/map_files/debug/gateway_test.dmm b/_maps/map_files/debug/gateway_test.dmm new file mode 100644 index 0000000000000..d3cc2563d47e5 --- /dev/null +++ b/_maps/map_files/debug/gateway_test.dmm @@ -0,0 +1,392 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/indestructible/reinforced, +/area/misc/testroom/gateway_room) +"c" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/white/full, +/turf/open/indestructible/dark, +/area/misc/testroom/gateway_room) +"d" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/turf/open/indestructible/dark, +/area/misc/testroom/gateway_room) +"f" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 9 + }, +/turf/open/indestructible, +/area/misc/testroom/gateway_room) +"g" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/indestructible, +/area/misc/testroom/gateway_room) +"h" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/vending/wallmed/directional/west, +/turf/open/indestructible, +/area/misc/testroom/gateway_room) +"j" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/white/full, +/obj/effect/turf_decal/stripes/red/line{ + dir = 6 + }, +/obj/structure/sign/flag/ssc/directional/north, +/turf/open/indestructible/dark, +/area/misc/testroom/gateway_room) +"l" = ( +/obj/machinery/computer/communications{ + dir = 8 + }, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/indestructible, +/area/misc/testroom/gateway_room) +"m" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 4 + }, +/turf/open/indestructible, +/area/misc/testroom/gateway_room) +"n" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/white/full, +/obj/effect/turf_decal/stripes/red/line{ + dir = 4 + }, +/turf/open/indestructible/dark, +/area/misc/testroom/gateway_room) +"p" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/white/full, +/obj/effect/turf_decal/stripes/red/line{ + dir = 10 + }, +/obj/structure/sign/flag/nanotrasen/directional/north, +/turf/open/indestructible/dark, +/area/misc/testroom/gateway_room) +"q" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/white/full, +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/misc/testroom/gateway_room) +"r" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/shutters/indestructible, +/turf/open/floor/iron, +/area/misc/testroom/gateway_room) +"t" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 5 + }, +/turf/open/indestructible, +/area/misc/testroom/gateway_room) +"u" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/white/full, +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/obj/structure/sign/flag/terragov/directional/north, +/turf/open/indestructible/dark, +/area/misc/testroom/gateway_room) +"v" = ( +/obj/machinery/gateway/centerstation, +/obj/effect/turf_decal/stripes/white/box, +/obj/effect/turf_decal/trimline/blue, +/turf/open/indestructible/dark, +/area/misc/testroom/gateway_room) +"y" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/red/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/turf/open/indestructible/dark, +/area/misc/testroom/gateway_room) +"z" = ( +/obj/effect/landmark/blobstart, +/obj/effect/turf_decal/stripes/red/line, +/turf/open/indestructible, +/area/misc/testroom/gateway_room) +"B" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/indestructible, +/area/misc/testroom/gateway_room) +"C" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/turf/open/indestructible, +/area/misc/testroom/gateway_room) +"D" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/sign/warning/secure_area/directional/south, +/obj/effect/landmark/latejoin, +/obj/effect/landmark/observer_start, +/obj/effect/landmark/start, +/turf/open/indestructible, +/area/misc/testroom/gateway_room) +"E" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Gateway Chamber" + }, +/turf/open/indestructible, +/area/misc/testroom/gateway_room) +"G" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/table, +/obj/item/toy/figure/curator{ + pixel_y = 5 + }, +/obj/item/card/id/advanced/debug, +/turf/open/indestructible, +/area/misc/testroom/gateway_room) +"H" = ( +/turf/open/space/basic, +/area/space) +"I" = ( +/obj/machinery/computer/gateway_control{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/full, +/turf/open/indestructible, +/area/misc/testroom/gateway_room) +"J" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/turf/open/indestructible/dark, +/area/misc/testroom/gateway_room) +"K" = ( +/obj/structure/closet/crate/preopen, +/obj/item/stack/sheet/rglass{ + amount = 50 + }, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/rods/fifty, +/obj/item/toy/plush/lizard_plushie/space/green{ + name = "Travels-The-Stars"; + desc = "The greatest gateway explorer ever created." + }, +/obj/effect/spawner/random/engineering/flashlight, +/obj/item/storage/toolbox/emergency, +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/sign/calendar/directional/north, +/turf/open/indestructible, +/area/misc/testroom/gateway_room) +"M" = ( +/obj/structure/chair/stool/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/keycard_auth/directional/west{ + pixel_y = 7 + }, +/obj/machinery/keycard_auth/directional/west{ + pixel_y = -7 + }, +/turf/open/indestructible, +/area/misc/testroom/gateway_room) +"N" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/white/full, +/obj/effect/turf_decal/stripes/red/line{ + dir = 4 + }, +/obj/structure/sign/warning/radiation/directional/east, +/turf/open/indestructible/dark, +/area/misc/testroom/gateway_room) +"O" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/suit_storage_unit/centcom, +/obj/structure/sign/warning/engine_safety/directional/south, +/obj/structure/sign/warning/no_smoking/circle/directional/west, +/turf/open/indestructible, +/area/misc/testroom/gateway_room) +"P" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/sign/poster/official/corporate_perks_vacation/directional/west, +/turf/open/indestructible, +/area/misc/testroom/gateway_room) +"Q" = ( +/turf/open/indestructible, +/area/misc/testroom/gateway_room) +"R" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/table, +/obj/item/paper/pamphlet/gateway{ + desc = "The Iris and You: How Not To Smash Against Steel At The End of the Event Horizon" + }, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/item/radio/intercom/directional/north, +/turf/open/indestructible, +/area/misc/testroom/gateway_room) +"W" = ( +/turf/closed/indestructible/fakeglass, +/area/misc/testroom/gateway_room) + +(1,1,1) = {" +H +H +H +H +H +H +H +H +H +H +"} +(2,1,1) = {" +H +a +a +a +a +a +a +a +a +H +"} +(3,1,1) = {" +H +a +K +M +g +P +h +O +a +H +"} +(4,1,1) = {" +H +a +R +I +l +G +B +D +a +H +"} +(5,1,1) = {" +H +a +W +W +W +W +E +W +a +H +"} +(6,1,1) = {" +H +a +j +q +q +d +C +t +r +H +"} +(7,1,1) = {" +H +a +u +v +c +J +Q +z +r +H +"} +(8,1,1) = {" +H +a +p +N +n +y +m +f +r +H +"} +(9,1,1) = {" +H +a +a +a +a +a +a +a +a +H +"} +(10,1,1) = {" +H +H +H +H +H +H +H +H +H +H +"} diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index 4072ee21a70f5..3b86ffcfc20d5 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -80,6 +80,11 @@ "aA" = ( /turf/open/floor/iron, /area/station/engineering/main) +"aB" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "aC" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -662,6 +667,7 @@ "cK" = ( /obj/machinery/light/directional/south, /obj/structure/table/glass, +/obj/item/disk/surgery/debug, /obj/item/storage/box/monkeycubes{ pixel_x = 6; pixel_y = 1 @@ -676,8 +682,7 @@ /turf/open/floor/iron/white/corner, /area/station/medical/medbay) "cL" = ( -/obj/item/storage/backpack/duffelbag/syndie/surgery, -/obj/item/disk/surgery/debug, +/obj/item/surgery_tray/full/advanced, /obj/structure/table/glass, /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -1747,6 +1752,9 @@ }, /turf/open/floor/iron, /area/station/medical/chemistry) +"hU" = ( +/turf/open/floor/circuit/green, +/area/station/bitrunning/den) "ii" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -1769,6 +1777,9 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos) +"jR" = ( +/turf/open/floor/iron, +/area/station/bitrunning/den) "jU" = ( /obj/structure/table, /obj/item/melee/energy/axe, @@ -1817,6 +1828,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"mi" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "mE" = ( /obj/structure/cable, /obj/machinery/chem_mass_spec, @@ -1871,6 +1888,10 @@ /obj/machinery/door/airlock, /turf/open/floor/plating, /area/station/engineering/atmos) +"qp" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/bitrunning/den) "qx" = ( /obj/machinery/airalarm/directional/west, /obj/effect/mapping_helpers/airalarm/unlocked, @@ -1942,6 +1963,9 @@ /obj/machinery/light/directional/north, /turf/open/floor/plating, /area/station/engineering/atmos) +"uI" = ( +/turf/closed/wall/r_wall, +/area/station/bitrunning/den) "uO" = ( /obj/machinery/door/airlock/public/glass, /obj/structure/cable, @@ -2062,6 +2086,10 @@ /obj/structure/closet/syndicate/resources/everything, /turf/open/floor/iron, /area/station/science) +"CD" = ( +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/bitrunning/den) "CQ" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/stripes/line{ @@ -2155,6 +2183,17 @@ /obj/effect/mapping_helpers/airalarm/unlocked, /turf/open/floor/iron, /area/station/command/bridge) +"FW" = ( +/obj/effect/landmark/bitrunning/station_reward_spawn, +/turf/open/floor/circuit/green, +/area/station/bitrunning/den) +"Ht" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/item/storage/part_replacer/bluespace/tier4, +/turf/open/floor/iron, +/area/station/bitrunning/den) "HW" = ( /obj/machinery/airalarm/directional/east, /obj/effect/mapping_helpers/airalarm/unlocked, @@ -2179,6 +2218,10 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron, /area/station/command/bridge) +"IB" = ( +/obj/machinery/quantum_server, +/turf/open/floor/iron, +/area/station/bitrunning/den) "IH" = ( /obj/structure/closet/secure_closet/engineering_welding{ locked = 0 @@ -2271,6 +2314,10 @@ /obj/machinery/rnd/production/protolathe/department, /turf/open/floor/iron, /area/station/science) +"Oq" = ( +/obj/machinery/netpod, +/turf/open/floor/iron, +/area/station/bitrunning/den) "Ot" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, @@ -2292,6 +2339,12 @@ /obj/item/stock_parts/cell/bluespace, /turf/open/floor/iron/dark, /area/station/science/explab) +"OA" = ( +/obj/machinery/door/airlock, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron, +/area/station/bitrunning/den) "OU" = ( /obj/item/disk/tech_disk/debug, /turf/open/floor/iron, @@ -2301,6 +2354,11 @@ /obj/effect/mapping_helpers/airalarm/unlocked, /turf/open/floor/iron/dark, /area/station/science/explab) +"Pw" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron, +/area/station/bitrunning/den) "Px" = ( /obj/structure/table, /obj/machinery/reagentgrinder, @@ -2365,6 +2423,11 @@ }, /turf/open/floor/iron/white/corner, /area/station/medical/medbay) +"SN" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/bitrunning/den) "Td" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/stripes/line{ @@ -2467,6 +2530,13 @@ }, /turf/open/floor/iron, /area/station/medical/chemistry) +"Xo" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/machinery/airalarm/directional/east, +/obj/machinery/computer/quantum_console, +/turf/open/floor/iron, +/area/station/bitrunning/den) "Xp" = ( /obj/machinery/light/directional/south, /obj/structure/tank_dispenser{ @@ -3033,12 +3103,12 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa +uI +uI +uI +uI +uI +uI aa aa aa @@ -3125,12 +3195,12 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa +uI +FW +hU +jR +Oq +uI aa aa aa @@ -3217,12 +3287,12 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa +uI +FW +hU +jR +Oq +uI aa aa aa @@ -3309,12 +3379,12 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa +uI +IB +jR +Ht +Oq +uI aa aa aa @@ -3401,12 +3471,12 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa +uI +Xo +CD +Pw +SN +uI aa aa aa @@ -3493,12 +3563,12 @@ em em em em -em -em -em -dY -en -dY +uI +uI +uI +OA +qp +uI Tj Tj Tj @@ -3588,7 +3658,7 @@ rK rK vy em -eh +aB eh LW lc @@ -3680,7 +3750,7 @@ qQ qQ ME em -eh +aB eh LW lc @@ -3772,7 +3842,7 @@ qQ qQ ME em -eh +aB eh LW lc @@ -3864,7 +3934,7 @@ qQ qQ CQ em -eh +mi eh LW lc @@ -3956,7 +4026,7 @@ qQ qQ ME em -eh +aB eh LW lc @@ -4048,7 +4118,7 @@ qQ qQ YL em -eh +aB eh LW lc @@ -4140,7 +4210,7 @@ II gl gD kj -wM +aB wM LW lc diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 6d376da1b98ef..c93798ef02aad 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -5,6 +5,32 @@ "ad" = ( /turf/open/space, /area/space) +"ak" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/tdome/observation) +"al" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/centcom/tdome/observation) +"am" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/floor, +/turf/open/indestructible/dark, +/area/centcom/central_command_areas/prison/cells) +"ap" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supplypod/loading/ert) "ar" = ( /obj/structure/chair/office{ dir = 8 @@ -60,6 +86,20 @@ /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/iron, /area/centcom/central_command_areas/admin/storage) +"az" = ( +/obj/machinery/modular_computer/preset/id/centcom{ + dir = 1 + }, +/turf/open/floor/iron/grimy, +/area/centcom/central_command_areas/briefing) +"aA" = ( +/obj/effect/landmark/thunderdome/one, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "aB" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/yellow{ @@ -82,11 +122,13 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron, /area/centcom/central_command_areas/admin/storage) -"aI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark/herringbone, -/area/centcom/central_command_areas/evacuation/ship) +"aG" = ( +/obj/structure/noticeboard/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/prison) "aK" = ( /obj/structure/table/reinforced, /obj/item/stack/package_wrap, @@ -141,15 +183,19 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron, /area/centcom/central_command_areas/evacuation) -"aR" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/machinery/light/directional/south, -/obj/structure/noticeboard/directional/south, +"aS" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) +"aU" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/courtroom) "aV" = ( /obj/structure/table/wood, /obj/item/clipboard, @@ -157,6 +203,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) +"aW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/centcom/tdome/administration) +"aX" = ( +/obj/structure/flora/tree/palm, +/turf/open/floor/grass, +/area/centcom/central_command_areas/evacuation/ship) "aZ" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/table/reinforced, @@ -251,11 +308,6 @@ /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, -/turf/open/floor/iron, -/area/centcom/tdome/arena) "bp" = ( /obj/item/trash/sosjerky, /obj/effect/decal/cleanable/dirt, @@ -266,6 +318,13 @@ desc = "This is a plaque commemorating the thunderdome and all those who have died at its pearly blast doors." }, /area/centcom/tdome/observation) +"bz" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/tdome/observation) "bA" = ( /obj/structure/table/reinforced, /obj/item/storage/medkit/regular{ @@ -294,6 +353,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) +"bC" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/courtroom) "bD" = ( /obj/effect/turf_decal/tile/green/anticorner/contrasted{ dir = 8 @@ -313,12 +377,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/armory) -"bJ" = ( -/obj/machinery/light/directional/north, -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +"bL" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/evacuation) "bM" = ( /obj/structure/flora/bush/lavendergrass/style_random, /obj/structure/flora/bush/fullgrass/style_random, @@ -333,6 +398,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/centcom/central_command_areas/evacuation/ship) +"bO" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) "bP" = ( /obj/machinery/door/window/brigdoor{ base_state = "rightsecure"; @@ -343,27 +414,25 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) -"bU" = ( -/obj/structure/bookcase/random, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) +"bR" = ( +/obj/effect/landmark/thunderdome/two, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "bV" = ( /obj/structure/table/reinforced, /obj/machinery/computer/records/medical/laptop, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) -"ca" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/pale/style_random, -/obj/machinery/light/directional/west, -/turf/open/misc/asteroid, -/area/centcom/tdome/administration) +"bZ" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "cb" = ( /obj/item/storage/briefcase{ pixel_x = -3; @@ -418,7 +487,7 @@ /turf/open/floor/iron, /area/centcom/tdome/observation) "cl" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, /obj/effect/turf_decal/tile/blue/fourcorners, /obj/effect/decal/cleanable/cobweb, @@ -437,13 +506,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/centcom/central_command_areas/briefing) -"co" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) "cq" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -457,6 +519,14 @@ }, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) +"cs" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen/fourcolor, +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/tdome/administration) "ct" = ( /obj/machinery/door/airlock/centcom{ name = "CentCom Security" @@ -490,6 +560,12 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/admin/storage) +"cB" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/turf/open/floor/wood, +/area/centcom/central_command_areas/admin) "cD" = ( /obj/structure/table/wood, /obj/item/folder/red, @@ -517,6 +593,16 @@ }, /turf/open/space/basic, /area/space) +"cK" = ( +/obj/effect/turf_decal/siding/wideplating_new/dark/corner, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/full, +/obj/item/kirbyplants/organic/plant21, +/obj/structure/sign/poster/official/ian/directional/west, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/central_command_areas/evacuation/ship) "cL" = ( /obj/item/gun/energy/pulse/carbine/loyalpin, /obj/item/flashlight/seclite, @@ -536,6 +622,12 @@ /obj/structure/window/reinforced/survival_pod/spawner/directional/north, /turf/open/floor/plating, /area/centcom/central_command_areas/evacuation/ship) +"cR" = ( +/obj/item/kirbyplants/organic/plant10, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/clock/directional/north, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/evacuation/ship) "cS" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, @@ -547,6 +639,14 @@ /obj/structure/sign/poster/random/directional/east, /turf/open/floor/iron/smooth_large, /area/centcom/central_command_areas/evacuation/ship) +"cV" = ( +/obj/effect/landmark/thunderdome/one, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "cW" = ( /obj/structure/table/wood, /obj/machinery/reagentgrinder{ @@ -556,6 +656,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/tdome/observation) +"cX" = ( +/obj/structure/table/reinforced, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supplypod) "cY" = ( /obj/machinery/icecream_vat, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -586,6 +690,13 @@ /obj/effect/landmark/start/new_player, /turf/closed/indestructible/start_area, /area/misc/start) +"dh" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/centcom/central_command_areas/evacuation) "di" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -593,6 +704,28 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/centcom/tdome/observation) +"dj" = ( +/obj/effect/landmark/thunderdome/one, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) +"dl" = ( +/obj/structure/rack, +/obj/item/clothing/under/color/red, +/obj/item/clothing/shoes/sneakers/brown, +/obj/item/clothing/suit/armor/tdome/red, +/obj/item/clothing/head/helmet/thunderdome, +/obj/item/melee/baton/security/loaded, +/obj/item/melee/energy/sword/saber/red, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "dn" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -614,6 +747,14 @@ /obj/machinery/status_display/evac/directional/east, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/courtroom) +"dq" = ( +/obj/machinery/computer/security{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/control) "dv" = ( /obj/structure/railing/corner{ dir = 8 @@ -639,6 +780,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/admin) +"dy" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/centcom/central_command_areas/evacuation/ship) "dz" = ( /obj/item/clipboard, /obj/structure/table/reinforced, @@ -654,6 +807,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/admin) +"dC" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/control) "dG" = ( /obj/structure/table/wood, /obj/machinery/chem_dispenser/drinks{ @@ -687,6 +847,12 @@ /obj/effect/turf_decal/loading_area, /turf/open/floor/iron, /area/centcom/tdome/observation) +"dU" = ( +/obj/structure/bookcase/random, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/courtroom) "dV" = ( /obj/structure/table/wood, /obj/item/storage/box/beanbag, @@ -710,23 +876,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) -"dX" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) -"dZ" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) "ea" = ( /obj/item/flashlight/lamp, /obj/structure/table/reinforced, @@ -744,28 +893,16 @@ }, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) -"ef" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" +"eg" = ( +/obj/structure/table/wood, +/obj/item/storage/box/drinkingglasses, +/obj/item/reagent_containers/cup/glass/bottle/whiskey{ + pixel_y = 5 }, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/newscaster/directional/north, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) -"ei" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, /area/centcom/tdome/observation) -"el" = ( -/obj/structure/filingcabinet/medical, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) "em" = ( /obj/structure/table/reinforced, /obj/machinery/recharger, @@ -789,6 +926,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor, /area/centcom/central_command_areas/evacuation/ship) +"eq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/filingcabinet/filingcabinet, +/obj/effect/turf_decal/bot, +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supply) "et" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/directions/engineering{ @@ -798,11 +942,34 @@ }, /turf/open/floor/plating, /area/centcom/central_command_areas/courtroom) +"eu" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/control) +"ev" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/control) "ey" = ( /obj/structure/flora/bush/leavy, /obj/effect/decal/cleanable/cobweb, /turf/open/floor/grass, /area/centcom/central_command_areas/evacuation/ship) +"eA" = ( +/obj/machinery/status_display/ai/directional/north, +/obj/item/kirbyplants/organic/plant15{ + pixel_x = -6; + pixel_y = 12 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) "eB" = ( /obj/structure/bookcase/random, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -876,16 +1043,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) -"eQ" = ( -/obj/machinery/newscaster{ - pixel_x = -32 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) "eR" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -925,6 +1082,34 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) +"fc" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) +"fe" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/item/kirbyplants/organic/plant21, +/turf/open/floor/iron/grimy, +/area/centcom/central_command_areas/courtroom) +"ff" = ( +/obj/structure/rack, +/obj/item/clothing/under/color/green, +/obj/item/clothing/shoes/sneakers/brown, +/obj/item/clothing/suit/armor/vest, +/obj/item/clothing/head/helmet/swat, +/obj/item/gun/energy/laser, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) +"fh" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/effect/turf_decal/tile/green/half/contrasted, +/turf/open/floor/iron, +/area/centcom/tdome/observation) "fi" = ( /obj/structure/chair/office{ dir = 8 @@ -945,19 +1130,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/tdome/observation) +"fl" = ( +/obj/effect/landmark/thunderdome/two, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "fm" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/centcom/central_command_areas/evacuation) -"fv" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/machinery/newscaster/directional/west, -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) "fw" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, @@ -973,17 +1157,24 @@ planetary_atmos = 0 }, /area/awaymission/errorroom) -"fz" = ( -/obj/machinery/power/smes/magical, -/obj/structure/sign/warning/electric_shock/directional/east, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/smooth_large, -/area/centcom/central_command_areas/evacuation/ship) "fA" = ( /obj/machinery/vending/cola, /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/centcom/central_command_areas/fore) +"fC" = ( +/obj/effect/turf_decal/siding/wideplating_new/dark{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/full, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/central_command_areas/evacuation/ship) "fE" = ( /obj/structure/chair, /obj/effect/turf_decal/stripes/line{ @@ -1015,10 +1206,13 @@ }, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) -"fJ" = ( +"fM" = ( +/obj/structure/filingcabinet/medical, +/obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/centcom/tdome/arena) +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/control) "fN" = ( /obj/structure/closet/crate/bin, /obj/machinery/light_switch/directional/south, @@ -1033,6 +1227,11 @@ }, /turf/open/floor/iron/white, /area/centcom/central_command_areas/admin) +"fQ" = ( +/obj/machinery/power/smes/magical, +/obj/structure/sign/warning/electric_shock/directional/east, +/turf/open/floor/iron/smooth_large, +/area/centcom/central_command_areas/evacuation/ship) "fR" = ( /obj/item/food/egg/rainbow{ desc = "I bet you think you're pretty clever... well you are."; @@ -1086,6 +1285,14 @@ /obj/machinery/door/airlock/maintenance_hatch, /turf/open/floor/catwalk_floor, /area/centcom/central_command_areas/evacuation/ship) +"gf" = ( +/obj/machinery/vending/security, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/centcom/central_command_areas/prison) "gh" = ( /turf/closed/indestructible/fakedoor{ name = "Thunderdome Admin" @@ -1125,26 +1332,6 @@ /obj/item/storage/dice, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/admin) -"gn" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen/fourcolor, -/obj/machinery/light/directional/south, -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/administration) -"gp" = ( -/obj/structure/table/wood, -/obj/item/storage/box/drinkingglasses, -/obj/item/reagent_containers/cup/glass/bottle/whiskey{ - pixel_y = 5 - }, -/obj/machinery/light/directional/south, -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/administration) "gs" = ( /obj/item/paper/pamphlet/centcom/visitor_info, /obj/item/paper/pamphlet/centcom/visitor_info, @@ -1160,6 +1347,15 @@ "gu" = ( /turf/closed/indestructible/splashscreen, /area/misc/start) +"gv" = ( +/obj/effect/turf_decal/tile/neutral/full, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/central_command_areas/evacuation/ship) "gw" = ( /obj/structure/table/reinforced, /obj/item/grenade/c4{ @@ -1200,45 +1396,35 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) -"gD" = ( -/obj/structure/bookcase/random, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) "gE" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 }, /turf/open/floor/iron, /area/centcom/tdome/observation) -"gF" = ( -/obj/structure/filingcabinet/medical, -/obj/machinery/status_display/ai/directional/south, +"gH" = ( +/obj/structure/closet/secure_closet/security, +/obj/item/storage/belt/security/full, +/obj/item/gun/ballistic/automatic/wt550, +/obj/item/clothing/head/helmet/swat/nanotrasen, +/obj/item/crowbar/red, +/obj/machinery/status_display/evac/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) +/area/centcom/central_command_areas/control) "gI" = ( /obj/machinery/status_display/evac/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/admin) +"gL" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/centcom/central_command_areas/control) "gO" = ( /turf/closed/indestructible/riveted, /area/centcom/central_command_areas/briefing) -"gQ" = ( -/obj/structure/rack, -/obj/item/clothing/under/color/red, -/obj/item/clothing/shoes/sneakers/brown, -/obj/item/clothing/suit/armor/tdome/red, -/obj/item/clothing/head/helmet/thunderdome, -/obj/item/melee/baton/security/loaded, -/obj/item/melee/energy/sword/saber/red, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) "gR" = ( /obj/item/wrench, /obj/item/restraints/handcuffs, @@ -1252,13 +1438,6 @@ /obj/structure/sign/warning/secure_area, /turf/closed/indestructible/riveted, /area/centcom/central_command_areas/ferry) -"gT" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/centcom/tdome/observation) "gU" = ( /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 8 @@ -1273,6 +1452,13 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/armory) +"gZ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/centcom/tdome/observation) "hc" = ( /obj/structure/table/reinforced, /obj/item/clipboard, @@ -1320,15 +1506,6 @@ /obj/machinery/light/directional/north, /turf/open/misc/asteroid, /area/centcom/central_command_areas/evacuation) -"hn" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) "ho" = ( /obj/structure/table/wood, /obj/item/folder/red, @@ -1338,15 +1515,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) -"ht" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) "hv" = ( /obj/structure/table/reinforced, /obj/machinery/microwave{ @@ -1366,15 +1534,31 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supply) -"hE" = ( -/obj/structure/chair/comfy/black, -/obj/machinery/computer/security/telescreen/entertainment/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +"hA" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/status_display/evac/directional/east, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ dir = 4 }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/admin) +/turf/open/floor/iron, +/area/centcom/central_command_areas/control) +"hB" = ( +/obj/machinery/status_display/evac/directional/east, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/centcom/central_command_areas/control) +"hD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/centcom/tdome/administration) "hF" = ( /obj/structure/table/reinforced, /obj/item/folder/red{ @@ -1402,6 +1586,11 @@ "hH" = ( /turf/open/floor/holofloor/hyperspace, /area/space) +"hI" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/iron, +/area/centcom/tdome/observation) "hJ" = ( /obj/machinery/computer/security/telescreen, /obj/structure/table/reinforced, @@ -1447,28 +1636,20 @@ }, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/admin) -"ib" = ( -/obj/structure/bookcase/random, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) "ie" = ( /obj/item/soap/nanotrasen, /turf/open/floor/iron/white, /area/centcom/tdome/observation) -"ig" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) "ih" = ( /obj/structure/bookcase/random, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/tdome/administration) +"ij" = ( +/obj/machinery/atmospherics/components/tank/air, +/obj/effect/turf_decal/stripes/white/line, +/turf/open/floor/iron/smooth_large, +/area/centcom/central_command_areas/evacuation/ship) "ik" = ( /turf/open/misc/ashplanet/wateryrock{ initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; @@ -1631,20 +1812,6 @@ /obj/structure/sign/nanotrasen, /turf/closed/indestructible/riveted, /area/centcom/central_command_areas/prison) -"iI" = ( -/obj/structure/flora/tree/palm{ - icon_state = "palm2" - }, -/obj/machinery/light/directional/north, -/turf/open/floor/grass, -/area/centcom/central_command_areas/evacuation/ship) -"iJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) "iK" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -1657,13 +1824,6 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/prison) -"iM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) "iN" = ( /obj/machinery/status_display/supply, /turf/closed/indestructible/riveted, @@ -1777,18 +1937,6 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) -"je" = ( -/obj/machinery/button/door/indestructible{ - id = "thunderdome"; - name = "Main Blast Doors Control"; - req_access = list("cent_thunder") - }, -/obj/structure/table/reinforced, -/obj/machinery/light/directional/south, -/obj/machinery/status_display/ai/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/administration) "jf" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/tile/brown/half/contrasted{ @@ -1796,14 +1944,6 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) -"jg" = ( -/obj/structure/reagent_dispensers/wall/peppertank/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) "jh" = ( /obj/structure/table/reinforced, /obj/machinery/recharger, @@ -1812,22 +1952,6 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/prison) -"ji" = ( -/obj/machinery/vending/security, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) -"jj" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) "jk" = ( /obj/machinery/door/poddoor{ id = "XCCQMLoaddoor2"; @@ -1954,26 +2078,10 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) -"jz" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) "jA" = ( /obj/structure/fans/tiny/invisible, /turf/open/floor/holofloor/hyperspace, /area/space) -"jB" = ( -/obj/structure/noticeboard/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) "jC" = ( /obj/structure/chair/comfy/shuttle/tactical{ dir = 1 @@ -2084,25 +2192,11 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) -"jT" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/directional/north, -/obj/machinery/computer, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) "jU" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/computer, /turf/open/floor/iron, /area/centcom/central_command_areas/prison) -"jV" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) "kd" = ( /obj/structure/table/reinforced, /obj/machinery/button/showtime{ @@ -2115,6 +2209,16 @@ /obj/machinery/telecomms/allinone/nuclear, /turf/open/indestructible/hierophant, /area/centcom/central_command_areas/admin) +"ki" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/filingcabinet{ + pixel_x = 9 + }, +/obj/item/kirbyplants/organic/plant22{ + pixel_x = -4 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/evacuation/ship) "kj" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 8 @@ -2127,14 +2231,27 @@ "km" = ( /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/control) -"kr" = ( -/obj/effect/turf_decal/tile/neutral/full, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 +"kq" = ( +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/obj/structure/flora/bush/generic/style_random, +/obj/machinery/light/directional/west, +/turf/open/floor/grass, +/area/centcom/central_command_areas/control) +"ks" = ( +/obj/machinery/modular_computer/preset/id/centcom, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/grimy, +/area/centcom/central_command_areas/admin) +"kv" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/tile/red{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark/textured_large, -/area/centcom/central_command_areas/evacuation/ship) +/turf/open/floor/iron, +/area/centcom/tdome/observation) "kx" = ( /obj/structure/filingcabinet/medical, /obj/effect/turf_decal/stripes/line{ @@ -2169,20 +2286,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/centcom/central_command_areas/prison) -"kC" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) -"kD" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) "kE" = ( /obj/structure/chair, /obj/structure/window/reinforced/spawner/directional/north, @@ -2209,13 +2312,11 @@ /obj/item/stamp/law, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/courtroom) -"kI" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) +"kO" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/briefing) "kR" = ( /obj/structure/sign/warning/secure_area, /turf/closed/indestructible/riveted, @@ -2272,16 +2373,6 @@ /obj/effect/mapping_helpers/airlock/access/all/admin/general, /turf/open/floor/iron, /area/centcom/central_command_areas/control) -"la" = ( -/obj/machinery/door/window/brigdoor{ - base_state = "rightsecure"; - name = "CentCom Stand"; - req_access = list("cent_captain") - }, -/obj/machinery/light/directional/west, -/obj/machinery/status_display/evac/directional/west, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) "lb" = ( /obj/structure/table/wood, /obj/machinery/door/window, @@ -2319,16 +2410,6 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/courtroom) -"lf" = ( -/obj/machinery/door/window/brigdoor{ - base_state = "rightsecure"; - name = "CentCom Stand"; - req_access = list("cent_captain") - }, -/obj/machinery/light/directional/east, -/obj/machinery/status_display/evac/directional/east, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) "lg" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/chair/comfy/shuttle/tactical{ @@ -2474,6 +2555,12 @@ /obj/effect/mapping_helpers/airlock/access/all/admin/general, /turf/open/floor/iron, /area/centcom/central_command_areas/control) +"lU" = ( +/obj/structure/closet/crate/bin, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/briefing) "lV" = ( /obj/structure/chair{ dir = 8 @@ -2491,6 +2578,14 @@ }, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/courtroom) +"lZ" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/centcom/central_command_areas/evacuation) +"mc" = ( +/obj/effect/light_emitter/podbay, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supplypod/loading/four) "md" = ( /obj/machinery/computer/shuttle/labor, /obj/effect/turf_decal/stripes/line{ @@ -2550,13 +2645,16 @@ /obj/structure/table/wood, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/courtroom) -"mB" = ( -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, +"ms" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/sign/clock/directional/north, -/turf/open/floor/iron/dark, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supplypod/loading/ert) +"mC" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/computer/operating, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/white, /area/centcom/central_command_areas/evacuation/ship) "mD" = ( /turf/closed/indestructible/riveted, @@ -2569,13 +2667,6 @@ /obj/effect/turf_decal/tile/green/fourcorners, /turf/open/floor/iron/dark, /area/centcom/tdome/administration) -"mF" = ( -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) "mG" = ( /obj/machinery/computer/cargo{ dir = 4 @@ -2622,26 +2713,6 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/fore) -"mL" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/fore) -"mM" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/fore) "mN" = ( /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 1 @@ -2701,14 +2772,6 @@ /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron, /area/centcom/central_command_areas/prison) -"mU" = ( -/obj/structure/flora/tree/palm, -/obj/item/toy/plush/beeplushie{ - pixel_y = 5; - pixel_x = -3 - }, -/turf/open/floor/grass, -/area/centcom/central_command_areas/evacuation/ship) "mW" = ( /obj/structure/reagent_dispensers/wall/peppertank/directional/west, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -2744,16 +2807,20 @@ /obj/structure/sign/poster/official/enlist/directional/east, /turf/open/floor/iron/dark/textured_large, /area/centcom/central_command_areas/evacuation/ship) -"ni" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/red/fourcorners, +"ne" = ( +/obj/effect/turf_decal/tile/green, +/obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron, -/area/centcom/tdome/observation) +/area/centcom/central_command_areas/ferry) "nj" = ( /obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/tdome/observation) +"nk" = ( +/obj/machinery/light_switch/directional/east, +/turf/open/floor/iron/grimy, +/area/centcom/central_command_areas/admin) "nl" = ( /obj/machinery/computer/security/mining{ dir = 4 @@ -2824,6 +2891,22 @@ /obj/effect/mapping_helpers/airlock/access/all/admin/general, /turf/open/floor/iron, /area/centcom/tdome/observation) +"nD" = ( +/obj/machinery/status_display/evac/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/prison) +"nF" = ( +/obj/machinery/door/poddoor{ + id = "thunderdomegen"; + name = "General Supply" + }, +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "nG" = ( /obj/machinery/computer/security/mining{ dir = 1 @@ -2866,6 +2949,13 @@ /obj/structure/chair/office, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/control) +"nP" = ( +/obj/machinery/modular_computer/preset/id/centcom{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/control) "nS" = ( /obj/structure/bookcase/random, /obj/machinery/light/directional/north, @@ -2929,17 +3019,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/centcom/central_command_areas/ferry) -"of" = ( -/obj/effect/turf_decal/siding/wideplating_new/dark{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/full, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark/textured_large, -/area/centcom/central_command_areas/evacuation/ship) "oh" = ( /obj/structure/table/wood, /obj/item/paper_bin, @@ -2954,27 +3033,6 @@ }, /turf/open/floor/iron, /area/centcom/tdome/observation) -"oj" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) -"ol" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Red Team"; - network = list("thunder"); - pixel_x = 11; - pixel_y = -9; - resistance_flags = 64 - }, -/obj/effect/landmark/thunderdome/two, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/centcom/tdome/arena) "on" = ( /obj/docking_port/stationary{ dir = 4; @@ -3051,42 +3109,12 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/centcom/central_command_areas/fore) -"oy" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/fore) -"oA" = ( -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) "oB" = ( /obj/machinery/airalarm/directional/east, /obj/machinery/vending/wardrobe/cent_wardrobe, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/admin) -"oD" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) -"oE" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron, -/area/centcom/tdome/observation) "oF" = ( /obj/structure/closet/secure_closet/freezer/fridge/open, /obj/item/food/grown/potato, @@ -3183,19 +3211,6 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) -"oU" = ( -/obj/structure/closet/emcloset, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/clothing/mask/gas, -/obj/item/clothing/mask/gas, -/obj/item/clothing/mask/gas, -/obj/effect/turf_decal/delivery, -/obj/machinery/light/directional/south, -/obj/machinery/status_display/evac/directional/south, -/turf/open/floor/iron, -/area/centcom/central_command_areas/ferry) "oV" = ( /obj/structure/table/wood, /obj/item/storage/secure/briefcase{ @@ -3209,6 +3224,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/admin) +"oW" = ( +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/structure/flora/bush/grassy/style_random, +/obj/structure/flora/bush/pale/style_random, +/obj/machinery/light/floor, +/turf/open/misc/asteroid, +/area/centcom/central_command_areas/control) "oX" = ( /obj/structure/chair/comfy/brown{ color = "#596479" @@ -3225,6 +3249,12 @@ }, /turf/open/floor/stone, /area/centcom/central_command_areas/evacuation/ship) +"pb" = ( +/obj/effect/landmark/thunderdome/two, +/obj/effect/turf_decal/stripes/line, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "pc" = ( /obj/structure/sign/nanotrasen, /turf/closed/indestructible/riveted, @@ -3278,12 +3308,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) -"pm" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/directional/south, -/obj/machinery/status_display/evac/directional/south, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) "pr" = ( /obj/structure/chair, /obj/machinery/newscaster/directional/north, @@ -3296,15 +3320,23 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) -"pB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 +"px" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 }, /turf/open/floor/iron, -/area/centcom/central_command_areas/supplypod/loading/ert) -"pC" = ( +/area/centcom/central_command_areas/fore) +"py" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/machinery/light/directional/east, +/obj/structure/mirror/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) +"pB" = ( /obj/effect/turf_decal/stripes/line{ - dir = 1 + dir = 9 }, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/ert) @@ -3342,13 +3374,6 @@ }, /turf/open/space/basic, /area/space) -"pM" = ( -/obj/structure/bookcase/random, -/obj/machinery/light/directional/north, -/obj/machinery/status_display/ai/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) "pN" = ( /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron, @@ -3428,6 +3453,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/tdome/administration) +"qe" = ( +/obj/structure/flora/tree/palm, +/obj/item/toy/plush/beeplushie{ + pixel_y = 5; + pixel_x = -3 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/grass, +/area/centcom/central_command_areas/evacuation/ship) "qf" = ( /obj/structure/chair/comfy/black{ dir = 4 @@ -3449,6 +3483,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) +"qj" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/centcom/central_command_areas/prison) "qk" = ( /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 1 @@ -3581,20 +3620,17 @@ /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 }, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supplypod) +"qK" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron, +/area/centcom/tdome/observation) "qL" = ( /obj/machinery/door/airlock/centcom{ name = "CentCom Security" @@ -3603,6 +3639,13 @@ /obj/effect/mapping_helpers/airlock/access/all/admin/captain, /turf/open/floor/iron, /area/centcom/central_command_areas/prison) +"qO" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "qR" = ( /obj/structure/sign/nanotrasen, /turf/closed/indestructible/riveted, @@ -3651,6 +3694,19 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/courtroom) +"rf" = ( +/obj/machinery/computer/records/medical{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/control) +"rg" = ( +/obj/machinery/status_display/evac/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/prison) "rk" = ( /turf/open/floor/wood, /area/centcom/central_command_areas/courtroom) @@ -3668,6 +3724,11 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) +"rq" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/centcom/central_command_areas/evacuation) "rs" = ( /obj/effect/landmark/prisonwarp, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -3700,14 +3761,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) -"rx" = ( -/obj/structure/table/reinforced, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/taperecorder, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) "ry" = ( /obj/structure/toilet{ dir = 4 @@ -3737,17 +3790,6 @@ name = "sand" }, /area/centcom/central_command_areas/supply) -"rG" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/filingcabinet{ - pixel_x = 9 - }, -/obj/item/kirbyplants{ - icon_state = "plant-22"; - pixel_x = -4 - }, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/evacuation/ship) "rH" = ( /obj/structure/flora/bush/sparsegrass/style_random, /obj/structure/flora/bush/lavendergrass/style_random, @@ -3784,6 +3826,13 @@ /obj/structure/flora/bush/pointy/style_random, /turf/open/floor/grass, /area/centcom/central_command_areas/control) +"rL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/centcom/tdome/administration) "rM" = ( /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/courtroom) @@ -3796,6 +3845,16 @@ }, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) +"rQ" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/centcom/central_command_areas/evacuation/ship) "rS" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -3859,10 +3918,16 @@ /obj/effect/mapping_helpers/airlock/access/all/admin/general, /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) -"sm" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark/herringbone, -/area/centcom/central_command_areas/evacuation/ship) +"sk" = ( +/obj/structure/table/wood, +/obj/item/storage/box/drinkingglasses, +/obj/item/reagent_containers/cup/glass/bottle/whiskey{ + pixel_y = 5 + }, +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/tdome/administration) "sn" = ( /obj/machinery/door/airlock/centcom{ name = "CentCom Security" @@ -3876,6 +3941,14 @@ /obj/effect/mapping_helpers/airlock/access/all/admin/medical, /turf/open/floor/iron, /area/centcom/central_command_areas/control) +"so" = ( +/obj/effect/landmark/thunderdome/one, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "sq" = ( /obj/machinery/computer/shuttle/white_ship{ dir = 4 @@ -3935,30 +4008,21 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) -"sx" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) "sz" = ( /obj/machinery/status_display/evac/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) -"sB" = ( -/obj/effect/turf_decal/siding/wideplating_new/dark{ +"sA" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/full, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark/textured_large, +/obj/machinery/light/floor, +/turf/open/floor/iron, /area/centcom/central_command_areas/evacuation/ship) "sC" = ( /obj/effect/turf_decal/tile/green/half/contrasted{ @@ -3981,6 +4045,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/tdome/observation) +"sI" = ( +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/prison) "sJ" = ( /obj/machinery/vending/coffee, /obj/machinery/newscaster/directional/south, @@ -4054,11 +4125,6 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/evacuation) -"sU" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) "sV" = ( /obj/machinery/door/poddoor/shuttledock, /obj/effect/turf_decal/delivery, @@ -4078,11 +4144,6 @@ /obj/effect/mapping_helpers/airlock/access/all/admin/storage, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supplypod) -"ta" = ( -/obj/machinery/light/floor, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/centcom/central_command_areas/ferry) "tb" = ( /obj/structure/table/wood, /obj/item/paper_bin, @@ -4108,33 +4169,6 @@ }, /turf/open/floor/wood, /area/centcom/central_command_areas/admin) -"tm" = ( -/obj/effect/turf_decal/siding/wideplating_new/dark{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/full, -/obj/structure/sign/directions/medical{ - pixel_x = 32; - pixel_y = -2; - dir = 1 - }, -/obj/structure/sign/directions/command{ - pixel_x = 32; - pixel_y = 10; - dir = 1 - }, -/obj/structure/sign/directions/engineering{ - pixel_x = 32; - pixel_y = 4; - dir = 1 - }, -/obj/structure/closet/firecloset, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark/textured_large, -/area/centcom/central_command_areas/evacuation/ship) "tn" = ( /obj/structure/chair{ dir = 8 @@ -4200,21 +4234,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) -"tA" = ( -/obj/machinery/atmospherics/components/tank/air, -/obj/effect/turf_decal/stripes/white/line, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/smooth_large, -/area/centcom/central_command_areas/evacuation/ship) -"tD" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/machinery/light/directional/east, -/obj/structure/mirror/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) "tF" = ( /obj/machinery/door/airlock/centcom{ name = "Thunderdome Locker Room" @@ -4246,15 +4265,6 @@ }, /turf/open/floor/plating, /area/centcom/central_command_areas/fore) -"tJ" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) "tK" = ( /obj/effect/turf_decal/tile/green{ dir = 1 @@ -4280,15 +4290,12 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/control) -"tO" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +"tQ" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/courtroom) "tR" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -4296,16 +4303,6 @@ /obj/machinery/status_display/evac/directional/west, /turf/open/floor/iron, /area/centcom/central_command_areas/prison) -"tS" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) "tT" = ( /obj/effect/turf_decal/siding/yellow{ dir = 1 @@ -4412,25 +4409,11 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) -"ux" = ( -/obj/machinery/modular_computer/console/preset/id/centcom{ +"uy" = ( +/obj/machinery/computer/prisoner/management{ dir = 1 }, -/obj/machinery/button/door/indestructible{ - id = "XCCcustoms1"; - layer = 3.5; - name = "CC Customs 1 Control"; - pixel_x = 8; - pixel_y = -24 - }, -/obj/machinery/button/door/indestructible{ - id = "XCCcustoms2"; - layer = 3.5; - name = "CC Customs 2 Control"; - pixel_x = -8; - pixel_y = -24 - }, -/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) "uz" = ( @@ -4454,15 +4437,24 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/evacuation) +"uE" = ( +/obj/effect/light_emitter/thunderdome, +/turf/closed/indestructible/fakeglass, +/area/centcom/tdome/administration) +"uF" = ( +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/grassy/style_random, +/obj/structure/flora/bush/flowers_pp/style_random, +/obj/structure/flora/bush/pointy/style_random, +/obj/machinery/light/directional/east, +/turf/open/floor/grass, +/area/centcom/tdome/observation) "uG" = ( /obj/effect/turf_decal/siding/yellow, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) -"uK" = ( -/obj/machinery/processor, -/obj/effect/turf_decal/stripes/end, -/turf/open/floor/iron, -/area/centcom/tdome/observation) "uM" = ( /obj/machinery/chem_master/condimaster{ name = "HoochMaster 2000" @@ -4490,15 +4482,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/admin) -"uV" = ( -/obj/item/paper_bin, -/obj/item/pen/fourcolor, -/obj/structure/table/reinforced, -/obj/machinery/light/directional/east, -/obj/machinery/newscaster/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) +"uQ" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/centcom/central_command_areas/evacuation/ship) "uX" = ( /obj/machinery/shower/directional/east, /obj/effect/turf_decal/tile/green{ @@ -4540,6 +4530,17 @@ /obj/structure/flora/bush/pointy/style_random, /turf/open/floor/grass, /area/centcom/central_command_areas/ferry) +"vc" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/structure/flora/bush/grassy/style_random, +/obj/structure/flora/bush/ferny/style_random, +/obj/machinery/light/directional/south, +/turf/open/floor/iron{ + dir = 6; + icon_state = "asteroid8"; + name = "sand" + }, +/area/centcom/tdome/administration) "vd" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -4570,9 +4571,18 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/evacuation) -"vh" = ( +"vm" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/light/directional/south, /turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/area/centcom/central_command_areas/ferry) +"vn" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/tdome/observation) "vo" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/shower/directional/south, @@ -4605,6 +4615,13 @@ /obj/effect/mapping_helpers/airlock/access/all/admin/captain, /turf/open/floor/iron, /area/centcom/central_command_areas/courtroom) +"vv" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/machinery/newscaster/directional/west, +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) "vA" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/directions/engineering{ @@ -4681,14 +4698,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/evacuation/ship) -"vO" = ( -/obj/machinery/light/directional/east, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) "vP" = ( /obj/machinery/door/poddoor/shutters{ id = "XCCcustoms2"; @@ -4699,18 +4708,6 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/control) -"vQ" = ( -/obj/structure/table, -/obj/item/paper/pamphlet/centcom/visitor_info, -/obj/item/paper/pamphlet/centcom/visitor_info, -/obj/item/paper/pamphlet/centcom/visitor_info, -/obj/machinery/light/directional/west, -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) "vR" = ( /obj/structure/chair, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -4722,17 +4719,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/centcom/central_command_areas/control) -"vT" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/obj/machinery/light/directional/east, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) "vU" = ( /obj/machinery/door/poddoor/shutters{ id = "XCCcustoms1"; @@ -4743,17 +4729,6 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/evacuation) -"vV" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/machinery/status_display/evac/directional/west, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) "vW" = ( /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 8 @@ -4766,6 +4741,13 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/evacuation) +"vY" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supply) "vZ" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 4 @@ -4778,6 +4760,13 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/evacuation) +"wb" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/centcom/tdome/observation) "wg" = ( /obj/structure/closet/secure_closet/ert_com, /obj/structure/sign/directions/command{ @@ -4811,6 +4800,35 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/smooth_large, /area/centcom/central_command_areas/evacuation/ship) +"wl" = ( +/obj/machinery/modular_computer/preset/id/centcom{ + dir = 1 + }, +/obj/machinery/button/door/indestructible{ + id = "XCCcustoms1"; + layer = 3.5; + name = "CC Customs 1 Control"; + pixel_x = 8; + pixel_y = -24 + }, +/obj/machinery/button/door/indestructible{ + id = "XCCcustoms2"; + layer = 3.5; + name = "CC Customs 2 Control"; + pixel_x = -8; + pixel_y = -24 + }, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/control) +"wm" = ( +/obj/effect/landmark/thunderdome/one, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "wq" = ( /obj/structure/chair/comfy/black{ dir = 1 @@ -4886,13 +4904,6 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) -"wA" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/ferry) "wB" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -4909,6 +4920,11 @@ /obj/effect/mapping_helpers/airlock/access/all/admin/captain, /turf/open/floor/iron, /area/centcom/central_command_areas/control) +"wE" = ( +/obj/effect/turf_decal/bot, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "wG" = ( /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 8 @@ -4980,16 +4996,6 @@ }, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) -"wW" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) "wX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 @@ -5000,14 +5006,6 @@ }, /turf/open/floor/catwalk_floor, /area/centcom/central_command_areas/evacuation/ship) -"wZ" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) "xc" = ( /obj/machinery/door/airlock/external/ruin{ name = "Ferry Airlock" @@ -5054,13 +5052,6 @@ }, /turf/open/floor/plating, /area/centcom/central_command_areas/ferry) -"xi" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/centcom/central_command_areas/ferry) "xj" = ( /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 8 @@ -5083,31 +5074,14 @@ /obj/effect/turf_decal/tile/green, /turf/open/floor/iron, /area/centcom/central_command_areas/control) -"xp" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"xq" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/green/half/contrasted{ +"xr" = ( +/obj/structure/chair{ dir = 4 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"xs" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/status_display/evac/directional/west, /turf/open/floor/iron, /area/centcom/central_command_areas/evacuation) "xt" = ( @@ -5116,6 +5090,17 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/evacuation) +"xv" = ( +/obj/machinery/door/poddoor{ + id = "thunderdome"; + name = "Thunderdome Blast Door" + }, +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "xy" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/dirt, @@ -5127,14 +5112,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/centcom/central_command_areas/admin/storage) -"xB" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) "xD" = ( /obj/machinery/computer/security{ dir = 1 @@ -5142,16 +5119,25 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) +"xE" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/courtroom) +"xF" = ( +/obj/machinery/status_display/evac/directional/east, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/iron, +/area/centcom/central_command_areas/control) +"xG" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/centcom/tdome/observation) "xN" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron, /area/centcom/central_command_areas/control) -"xQ" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/light/directional/south, -/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 @@ -5176,6 +5162,12 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/control) +"xU" = ( +/obj/structure/filingcabinet/medical, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/briefing) "xV" = ( /obj/structure/chair/office{ dir = 8 @@ -5207,6 +5199,13 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/evacuation) +"yb" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/tdome/observation) "yc" = ( /obj/machinery/vending/snack, /obj/effect/turf_decal/delivery, @@ -5218,18 +5217,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supply) -"ye" = ( -/obj/machinery/light/directional/east, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/admin) -"yf" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/supplypod) "yh" = ( /obj/structure/table/wood, /obj/item/storage/fancy/donut_box, @@ -5256,6 +5243,11 @@ /obj/effect/mapping_helpers/airlock/access/all/admin/general, /turf/open/floor/iron, /area/centcom/central_command_areas/control) +"ym" = ( +/obj/machinery/vending/boozeomat, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/tdome/observation) "yn" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum, @@ -5280,20 +5272,32 @@ /obj/effect/mapping_helpers/airlock/access/all/admin/general, /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) -"ys" = ( -/obj/machinery/light/directional/west, -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/tile/green{ +"yx" = ( +/obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 8 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"yy" = ( -/obj/machinery/light/directional/east, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/full, +/obj/structure/sign/directions/medical{ + pixel_x = 32; + pixel_y = -2; + dir = 1 + }, +/obj/structure/sign/directions/command{ + pixel_x = 32; + pixel_y = 10; + dir = 1 + }, +/obj/structure/sign/directions/engineering{ + pixel_x = 32; + pixel_y = 4; + dir = 1 + }, +/obj/structure/closet/firecloset, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/central_command_areas/evacuation/ship) "yz" = ( /obj/structure/chair{ dir = 1 @@ -5301,12 +5305,26 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron, /area/centcom/central_command_areas/control) +"yA" = ( +/obj/effect/landmark/thunderdome/one, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "yB" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 }, /turf/open/floor/iron, /area/centcom/central_command_areas/evacuation) +"yC" = ( +/obj/structure/filingcabinet/security, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/control) "yH" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/siding/wood{ @@ -5376,6 +5394,13 @@ }, /turf/open/space, /area/space) +"yW" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/tdome/observation) "yX" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -5410,10 +5435,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) -"ze" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/indestructible/dark, -/area/centcom/central_command_areas/prison/cells) "zf" = ( /obj/structure/table/reinforced, /obj/item/book/manual/wiki/security_space_law, @@ -5462,14 +5483,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supply) -"zo" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) "zr" = ( /obj/docking_port/stationary{ dir = 4; @@ -5493,6 +5506,13 @@ /obj/effect/turf_decal/tile/green, /turf/open/floor/iron/white, /area/centcom/tdome/observation) +"zu" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/tdome/observation) "zw" = ( /obj/structure/sign/nanotrasen, /turf/closed/indestructible/riveted, @@ -5580,7 +5600,7 @@ /turf/open/floor/iron/white, /area/centcom/central_command_areas/control) "zI" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 @@ -5609,11 +5629,34 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/two) -"zT" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/light/floor, -/turf/open/floor/plating, -/area/centcom/central_command_areas/briefing) +"zR" = ( +/obj/structure/closet/secure_closet/personal, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/centcom/tdome/observation) +"zS" = ( +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/structure/flora/bush/grassy/style_random, +/obj/structure/flora/bush/pale/style_random, +/obj/machinery/light/directional/south, +/turf/open/misc/asteroid, +/area/centcom/tdome/administration) +"zU" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/wood, +/area/centcom/central_command_areas/admin) +"zW" = ( +/obj/structure/table, +/obj/structure/bedsheetbin, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/centcom/tdome/observation) "zZ" = ( /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, @@ -5622,6 +5665,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/centcom/central_command_areas/control) +"Ac" = ( +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "Ad" = ( /obj/effect/turf_decal/tile/green/half/contrasted, /turf/open/floor/iron, @@ -5646,13 +5696,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) -"Ag" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/centcom/tdome/observation) "Ah" = ( /obj/effect/turf_decal/tile/green{ dir = 1 @@ -5664,15 +5707,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) -"Am" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +"Aj" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/courtroom) "An" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/green{ @@ -5685,13 +5725,6 @@ /obj/effect/turf_decal/tile/green, /turf/open/floor/iron, /area/centcom/central_command_areas/control) -"Ap" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) "Aq" = ( /obj/structure/table/optable, /obj/item/surgical_drapes, @@ -5700,6 +5733,11 @@ }, /turf/open/floor/iron/white, /area/centcom/central_command_areas/control) +"Ar" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/courtroom) "As" = ( /obj/machinery/computer/communications{ dir = 8 @@ -5714,6 +5752,13 @@ /obj/effect/turf_decal/siding/yellow, /turf/open/floor/iron, /area/centcom/central_command_areas/evacuation) +"Av" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/control) "AA" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/north, @@ -5724,6 +5769,17 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/centcom/central_command_areas/evacuation/ship) +"AC" = ( +/obj/machinery/door/poddoor{ + id = "thunderdomegen"; + name = "General Supply" + }, +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "AD" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -5827,13 +5883,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/centcom/central_command_areas/evacuation) -"Ba" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) "Bb" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/closet/crate/bin, @@ -5845,17 +5894,24 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/evacuation) -"Bd" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/light/directional/south, +"Bh" = ( +/obj/machinery/processor, +/obj/effect/turf_decal/stripes/end, +/obj/machinery/light/directional/north, /turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/area/centcom/tdome/observation) "Bj" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 }, /turf/open/floor/iron, /area/centcom/tdome/administration) +"Bl" = ( +/obj/structure/bookcase/random, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) "Bm" = ( /obj/structure/reagent_dispensers/fueltank, /obj/item/weldingtool/experimental, @@ -5892,28 +5948,14 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/centcom/tdome/observation) -"Bv" = ( -/obj/machinery/computer/security{ - dir = 1 - }, -/obj/machinery/newscaster/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) -"Bw" = ( -/obj/item/storage/medkit/regular, -/obj/structure/table, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/tile/green/anticorner/contrasted, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"Bx" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" +"Bu" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/machinery/status_display/evac/directional/west, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 4 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/centcom/tdome/administration) +/area/centcom/central_command_areas/briefing) "By" = ( /obj/machinery/light/directional/south, /obj/structure/filingcabinet/chestdrawer, @@ -6019,6 +6061,13 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/control) +"BK" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "BM" = ( /obj/machinery/door/airlock/centcom{ name = "CentCom Security" @@ -6090,13 +6139,36 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/tdome/observation) -"Ca" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" +"BX" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/centcom/tdome/observation) +"BY" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave{ + desc = "Cooks and boils stuff, somehow."; + pixel_x = -3; + pixel_y = 5 + }, +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/centcom/tdome/observation) +"Cb" = ( +/obj/machinery/button/door/indestructible{ + id = "thunderdome"; + name = "Main Blast Doors Control"; + req_access = list("cent_thunder") }, +/obj/structure/table/reinforced, +/obj/machinery/status_display/ai/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) +/area/centcom/tdome/administration) "Cd" = ( /obj/structure/flora/bush/lavendergrass/style_random, /obj/structure/flora/bush/sparsegrass/style_random, @@ -6127,14 +6199,6 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/four) -"Cs" = ( -/obj/machinery/modular_computer/console/preset/command{ - dir = 8 - }, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) "Cx" = ( /obj/structure/table/reinforced, /obj/item/storage/box/handcuffs, @@ -6166,14 +6230,6 @@ }, /turf/open/floor/iron, /area/centcom/tdome/observation) -"CD" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/evacuation) "CE" = ( /obj/item/clipboard, /obj/item/folder/red, @@ -6233,6 +6289,18 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/control) +"CO" = ( +/obj/structure/table, +/obj/item/paper/pamphlet/centcom/visitor_info, +/obj/item/paper/pamphlet/centcom/visitor_info, +/obj/item/paper/pamphlet/centcom/visitor_info, +/obj/machinery/status_display/evac/directional/west, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/centcom/central_command_areas/control) "CT" = ( /obj/structure/table/reinforced, /obj/structure/railing{ @@ -6267,6 +6335,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/admin) +"CW" = ( +/obj/effect/landmark/thunderdome/two, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "CY" = ( /obj/structure/chair{ dir = 4 @@ -6285,15 +6361,6 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/control) -"Da" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/bodycontainer/morgue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white, -/area/centcom/central_command_areas/evacuation/ship) "Di" = ( /turf/closed/indestructible/riveted, /area/centcom/ai_multicam_room) @@ -6306,11 +6373,21 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/admin) -"Dn" = ( -/obj/structure/flora/tree/palm, -/obj/machinery/light/directional/north, -/turf/open/floor/grass, -/area/centcom/central_command_areas/evacuation/ship) +"Dm" = ( +/obj/item/storage/medkit/regular, +/obj/structure/table, +/obj/machinery/status_display/evac/directional/east, +/obj/effect/turf_decal/tile/green/anticorner/contrasted, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/centcom/central_command_areas/control) +"Dp" = ( +/obj/machinery/status_display/evac/directional/west, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/control) "Dq" = ( /obj/machinery/door/airlock/external/ruin, /obj/effect/turf_decal/stripes/line{ @@ -6339,15 +6416,20 @@ }, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) -"Dy" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 +"Dz" = ( +/obj/structure/rack, +/obj/item/clothing/under/color/green, +/obj/item/clothing/shoes/sneakers/brown, +/obj/item/clothing/suit/armor/tdome/green, +/obj/item/clothing/head/helmet/thunderdome, +/obj/item/melee/baton/security/loaded, +/obj/item/melee/energy/sword/saber/green, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, -/area/centcom/tdome/observation) +/area/centcom/tdome/arena) "DA" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 8 @@ -6416,22 +6498,48 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor, /area/centcom/central_command_areas/evacuation/ship) -"DV" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" +"DN" = ( +/obj/effect/turf_decal/loading_area{ + dir = 4 }, -/obj/effect/turf_decal/tile/green{ - dir = 8 +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) +"DT" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Green Team"; + network = list("thunder"); + pixel_x = 12; + pixel_y = -10; + resistance_flags = 64 }, +/obj/effect/landmark/thunderdome/one, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"DW" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" +/area/centcom/tdome/arena) +"DU" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/centcom/central_command_areas/evacuation) +"Eb" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/briefing) +"Ee" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/effect/turf_decal/tile/green, +/obj/machinery/light/floor, /turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/area/centcom/tdome/observation) +"Ef" = ( +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "Eg" = ( /obj/machinery/door/airlock/centcom{ name = "Thunderdome Booth" @@ -6439,13 +6547,36 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/centcom/central_command_areas/control) +"Ej" = ( +/obj/structure/table/reinforced, +/obj/item/storage/medkit/regular, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/control) +"Em" = ( +/obj/item/paper_bin, +/obj/item/pen/fourcolor, +/obj/structure/table/reinforced, +/obj/machinery/newscaster/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) +"En" = ( +/obj/structure/chair/comfy/black, +/obj/machinery/computer/security/telescreen/entertainment/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/iron/grimy, +/area/centcom/central_command_areas/admin) "Eq" = ( /obj/structure/chair/stool/bar/directional/east, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/vomit/old, /turf/open/floor/carpet/red, /area/centcom/central_command_areas/evacuation/ship) -"Ew" = ( +"Er" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 4 }, @@ -6454,10 +6585,29 @@ }, /obj/effect/turf_decal/tile/neutral/full, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/west, /obj/item/kirbyplants, /turf/open/floor/iron/dark/textured_large, /area/centcom/central_command_areas/evacuation/ship) +"Ev" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white, +/area/centcom/central_command_areas/evacuation/ship) +"Ex" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/item/kirbyplants/organic/plant22, +/turf/open/floor/iron/grimy, +/area/centcom/central_command_areas/courtroom) +"Ey" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/control) "Ez" = ( /obj/structure/table/reinforced, /obj/item/restraints/handcuffs/cable/zipties, @@ -6465,10 +6615,29 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) +"EB" = ( +/obj/effect/turf_decal/siding/wideplating_new/dark{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/full, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/central_command_areas/evacuation/ship) "ED" = ( /obj/effect/turf_decal/tile/neutral/anticorner/contrasted, /turf/open/floor/iron, /area/centcom/tdome/observation) +"EE" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/light_emitter/podbay, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supplypod/loading/four) "EH" = ( /obj/machinery/door/window{ dir = 8 @@ -6478,6 +6647,14 @@ }, /turf/open/floor/wood/tile, /area/centcom/central_command_areas/evacuation/ship) +"EI" = ( +/obj/effect/landmark/thunderdome/two, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "EJ" = ( /obj/structure/chair/comfy/brown{ color = "#596479"; @@ -6505,11 +6682,11 @@ /obj/structure/sign/poster/official/obey/directional/west, /turf/open/floor/iron/dark/textured_large, /area/centcom/central_command_areas/evacuation/ship) -"EN" = ( -/obj/structure/flora/bush/sparsegrass, -/obj/machinery/light/directional/south, -/turf/open/floor/grass, -/area/centcom/central_command_areas/evacuation/ship) +"EM" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/light_emitter/podbay, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supplypod/loading/one) "EV" = ( /obj/structure/table/wood, /obj/machinery/microwave{ @@ -6530,11 +6707,6 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/three) -"Fc" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/administration) "Fe" = ( /obj/structure/sink/directional/west, /obj/structure/mirror/directional/east, @@ -6558,6 +6730,11 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/control) +"Fh" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/centcom/central_command_areas/ferry) "Fi" = ( /obj/effect/landmark/basketball/game_area, /turf/open/space/basic, @@ -6591,6 +6768,12 @@ /obj/structure/sign/warning/secure_area, /turf/closed/indestructible/riveted, /area/centcom/central_command_areas/control) +"Fu" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/tdome/administration) "Fv" = ( /obj/machinery/door/airlock/centcom{ name = "CentCom" @@ -6599,6 +6782,20 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/iron, /area/centcom/central_command_areas/fore) +"Fw" = ( +/obj/machinery/door/window/brigdoor{ + base_state = "rightsecure"; + name = "CentCom Stand"; + req_access = list("cent_captain") + }, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/iron/grimy, +/area/centcom/central_command_areas/courtroom) +"Fz" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/briefing) "FB" = ( /obj/structure/table/reinforced, /obj/item/storage/box/syringes, @@ -6609,21 +6806,14 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/armory) -"FE" = ( -/obj/effect/turf_decal/siding/wideplating_new/dark{ - dir = 8 - }, +"FI" = ( +/obj/effect/landmark/thunderdome/two, /obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/full, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark/textured_large, -/area/centcom/central_command_areas/evacuation/ship) +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "FO" = ( /obj/structure/table/reinforced, /obj/item/computer_disk/quartermaster, @@ -6635,6 +6825,10 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) +"FR" = ( +/obj/effect/light_emitter/podbay, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supplypod/pod_storage) "FX" = ( /obj/machinery/computer/auxiliary_base/directional/north, /obj/structure/table/reinforced, @@ -6656,6 +6850,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/ferry) +"Gb" = ( +/obj/effect/light_emitter/thunderdome, +/turf/closed/indestructible/fakeglass, +/area/centcom/tdome/observation) "Gf" = ( /obj/machinery/firealarm/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump{ @@ -6685,6 +6883,23 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/centcom/central_command_areas/evacuation/ship) +"Gm" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = 8; + pixel_y = -4 + }, +/obj/item/pen{ + pixel_x = 8; + pixel_y = -4 + }, +/obj/item/flashlight/lamp{ + pixel_x = -5; + pixel_y = 6 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/control) "Gs" = ( /obj/machinery/power/smes/magical, /obj/effect/turf_decal/stripes/line, @@ -6727,6 +6942,13 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/prison) +"GI" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/centcom/tdome/observation) "GJ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/directions/engineering{ @@ -6759,6 +6981,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) +"GX" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/control) "Ha" = ( /obj/structure/table/wood, /obj/item/paper_bin, @@ -6775,6 +7002,11 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/smooth_edge, /area/centcom/central_command_areas/evacuation/ship) +"Hi" = ( +/obj/effect/turf_decal/tile/green, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/centcom/central_command_areas/ferry) "Hj" = ( /obj/structure/closet/crate/bin, /obj/effect/turf_decal/tile/green/anticorner/contrasted{ @@ -6810,9 +7042,21 @@ /obj/effect/mapping_helpers/airlock/access/all/admin/captain, /turf/open/floor/iron, /area/centcom/central_command_areas/prison) +"Hs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/centcom/central_command_areas/prison) "Hv" = ( /turf/closed/indestructible/riveted, /area/centcom/central_command_areas/courtroom) +"Hw" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) "Hz" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -6825,6 +7069,12 @@ /obj/structure/flora/bush/pale/style_random, /turf/open/misc/asteroid, /area/centcom/tdome/observation) +"HF" = ( +/obj/machinery/igniter/on, +/obj/effect/turf_decal/delivery, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "HG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 @@ -6836,6 +7086,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation) +"HI" = ( +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/effect/landmark/thunderdome/one, +/obj/effect/turf_decal/delivery, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "HJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -6844,6 +7103,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/stone, /area/centcom/central_command_areas/evacuation/ship) +"HK" = ( +/obj/effect/landmark/thunderdome/two, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "HL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -6851,13 +7116,48 @@ }, /turf/open/floor/stone, /area/centcom/central_command_areas/evacuation/ship) +"HM" = ( +/obj/structure/bookcase/random, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/courtroom) "HR" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, /obj/effect/turf_decal/tile/blue/fourcorners, /obj/machinery/light/directional/west, /turf/open/floor/iron/white, /area/centcom/central_command_areas/evacuation/ship) +"HY" = ( +/obj/machinery/photocopier, +/obj/machinery/button/door/indestructible{ + id = "XCCFerry"; + name = "Hanger Bay Shutters"; + pixel_x = -8; + pixel_y = 24 + }, +/obj/machinery/button/door/indestructible{ + id = "XCCsec3"; + name = "CC Main Access Control"; + pixel_x = 8; + pixel_y = 24 + }, +/obj/machinery/button/door/indestructible{ + id = "XCCsec1"; + name = "CC Shutter 1 Control"; + pixel_x = 8; + pixel_y = 38 + }, +/obj/machinery/button/door/indestructible{ + id = "XCCsec3"; + name = "XCC Shutter 3 Control"; + pixel_x = -8; + pixel_y = 38 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/control) "HZ" = ( /obj/structure/railing{ dir = 6; @@ -6869,6 +7169,15 @@ }, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) +"Ic" = ( +/obj/machinery/door/poddoor{ + id = "thunderdomehea"; + name = "Heavy Supply" + }, +/obj/effect/turf_decal/loading_area, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "Id" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -6887,6 +7196,15 @@ /obj/structure/sign/poster/contraband/syndicate_recruitment, /turf/closed/indestructible/riveted, /area/centcom/central_command_areas/admin) +"If" = ( +/obj/machinery/newscaster{ + pixel_x = -32 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/prison) "Io" = ( /obj/docking_port/stationary{ dir = 8; @@ -6915,18 +7233,6 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) -"Is" = ( -/obj/machinery/igniter/on, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"It" = ( -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"Iu" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/centcom/tdome/arena) "Iv" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -6936,75 +7242,12 @@ }, /turf/open/floor/stone, /area/centcom/central_command_areas/evacuation/ship) -"Iz" = ( -/obj/machinery/door/poddoor{ - id = "thunderdomegen"; - name = "General Supply" - }, -/obj/effect/turf_decal/loading_area{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"IA" = ( -/obj/effect/landmark/thunderdome/two, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"IB" = ( -/obj/effect/landmark/thunderdome/two, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"IC" = ( -/obj/effect/landmark/thunderdome/two, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"ID" = ( -/obj/machinery/door/poddoor{ - id = "thunderdome"; - name = "Thunderdome Blast Door" - }, -/obj/effect/turf_decal/loading_area{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"IE" = ( -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"IF" = ( -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"IG" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"II" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"IJ" = ( -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) +"Iw" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/control) "IK" = ( /obj/structure/closet/secure_closet/ert_sec, /obj/effect/turf_decal/stripes/line{ @@ -7013,96 +7256,27 @@ /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron, /area/centcom/central_command_areas/armory) -"IL" = ( -/obj/effect/landmark/thunderdome/one, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"IM" = ( -/obj/effect/landmark/thunderdome/one, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"IN" = ( -/obj/effect/landmark/thunderdome/one, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"IT" = ( -/obj/effect/landmark/thunderdome/two, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"IU" = ( -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/effect/landmark/thunderdome/two, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"IW" = ( -/obj/effect/landmark/thunderdome/two, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"IX" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"IY" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"IZ" = ( -/obj/effect/landmark/thunderdome/one, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"Ja" = ( -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/effect/landmark/thunderdome/one, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/centcom/tdome/arena) +"IO" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/centcom/tdome/observation) +"IR" = ( +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/obj/structure/flora/bush/generic/style_random, +/obj/machinery/light/directional/south, +/turf/open/floor/grass, +/area/centcom/tdome/administration) "Jb" = ( /turf/closed/indestructible/riveted, /area/centcom/central_command_areas/prison/cells) -"Jc" = ( -/obj/effect/landmark/thunderdome/one, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) "Jg" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/centcom/central_command_areas/fore) -"Jh" = ( -/obj/effect/turf_decal/loading_area{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) "Ji" = ( /turf/open/floor/circuit/green, /area/centcom/tdome/arena) @@ -7113,74 +7287,25 @@ }, /turf/open/floor/circuit/green, /area/centcom/tdome/arena) -"Jk" = ( -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, +"Jl" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/tile/green/anticorner/contrasted, /turf/open/floor/iron, -/area/centcom/tdome/arena) +/area/centcom/tdome/observation) "Jq" = ( /obj/machinery/camera/motion/thunderdome{ pixel_x = 10 }, /turf/open/floor/circuit/green, /area/centcom/tdome/arena) -"Js" = ( -/obj/effect/turf_decal/tile/red{ +"JC" = ( +/obj/machinery/modular_computer/preset/command{ dir = 8 }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"Jt" = ( -/obj/effect/turf_decal/tile/green, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"Ju" = ( -/obj/effect/landmark/thunderdome/two, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"Jv" = ( -/obj/effect/landmark/thunderdome/two, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"Jw" = ( -/obj/effect/landmark/thunderdome/two, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"Jx" = ( -/obj/effect/landmark/thunderdome/one, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"Jy" = ( -/obj/effect/landmark/thunderdome/one, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"Jz" = ( -/obj/effect/landmark/thunderdome/one, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) -"JD" = ( -/obj/machinery/door/poddoor{ - id = "thunderdomehea"; - name = "Heavy Supply" - }, -/obj/effect/turf_decal/loading_area, -/turf/open/floor/iron, -/area/centcom/tdome/arena) +/obj/machinery/status_display/evac/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) "JE" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 4 @@ -7194,44 +7319,32 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/dark/textured_large, /area/centcom/central_command_areas/evacuation/ship) -"JH" = ( -/obj/structure/rack, -/obj/item/clothing/under/color/red, -/obj/item/clothing/shoes/sneakers/brown, -/obj/item/clothing/suit/armor/vest, -/obj/item/clothing/head/helmet/swat, -/obj/item/gun/energy/laser, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) "JJ" = ( /obj/structure/table/wood, /obj/item/storage/fancy/donut_box, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/tdome/administration) -"JL" = ( -/obj/structure/rack, -/obj/item/clothing/under/color/green, -/obj/item/clothing/shoes/sneakers/brown, -/obj/item/clothing/suit/armor/vest, -/obj/item/clothing/head/helmet/swat, -/obj/item/gun/energy/laser, +"JO" = ( +/obj/machinery/modular_computer/preset/id/centcom, +/obj/machinery/computer/security/telescreen{ + desc = "Used for watching the RD's goons and the AI's satellite from the safety of his office."; + name = "Research Monitor"; + network = list("rd","minisat"); + pixel_y = 28 + }, +/turf/open/floor/iron/grimy, +/area/centcom/central_command_areas/admin) +"JU" = ( +/obj/structure/chair{ + dir = 4 + }, /obj/effect/turf_decal/stripes/line{ - dir = 1 + dir = 8 }, +/obj/machinery/light/directional/west, /turf/open/floor/iron, -/area/centcom/tdome/arena) -"JT" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/evacuation/ship) +/area/centcom/central_command_areas/evacuation) "JV" = ( /obj/structure/table/wood, /obj/machinery/chem_dispenser/drinks/beer{ @@ -7278,12 +7391,22 @@ /obj/effect/mapping_helpers/airlock/access/all/admin/captain, /turf/open/floor/iron, /area/centcom/central_command_areas/admin) -"Km" = ( -/obj/machinery/light/directional/west, -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/prison) +"Ko" = ( +/obj/structure/table, +/obj/structure/bedsheetbin, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/centcom/tdome/observation) +"KA" = ( +/obj/effect/landmark/thunderdome/two, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "KC" = ( /obj/machinery/status_display/evac/directional/south, /turf/open/floor/wood, @@ -7304,11 +7427,6 @@ "KH" = ( /turf/closed/wall/mineral/titanium, /area/centcom/central_command_areas/evacuation/ship) -"KJ" = ( -/obj/structure/chair/stool/bar/directional/east, -/obj/machinery/light/directional/north, -/turf/open/floor/carpet/red, -/area/centcom/central_command_areas/evacuation/ship) "KK" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/stripes/line{ @@ -7320,6 +7438,25 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron/smooth_large, /area/centcom/central_command_areas/evacuation/ship) +"KL" = ( +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/effect/landmark/thunderdome/two, +/obj/effect/turf_decal/delivery, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) +"KN" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/structure/flora/bush/ferny/style_random, +/obj/machinery/light/directional/north, +/turf/open/floor/iron{ + icon_state = "asteroid5"; + name = "plating" + }, +/area/centcom/tdome/observation) "KO" = ( /obj/effect/turf_decal/siding/wideplating_new/dark/corner{ dir = 8 @@ -7332,18 +7469,6 @@ /obj/machinery/vending/cigarette, /turf/open/floor/iron/dark/textured_large, /area/centcom/central_command_areas/evacuation/ship) -"KP" = ( -/obj/effect/turf_decal/siding/wideplating_new/dark/corner, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/full, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/structure/sign/poster/official/ian/directional/west, -/turf/open/floor/iron/dark/textured_large, -/area/centcom/central_command_areas/evacuation/ship) "KQ" = ( /turf/open/floor/plating, /area/centcom/central_command_areas/evacuation/ship) @@ -7391,6 +7516,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/centcom/central_command_areas/evacuation/ship) +"Lc" = ( +/obj/effect/turf_decal/siding/wideplating_new/dark{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/full, +/obj/structure/closet/emcloset, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/central_command_areas/evacuation/ship) "Ld" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -7478,6 +7614,11 @@ /obj/structure/sign/poster/official/nanotrasen_logo/directional/west, /turf/open/floor/iron/dark/textured_large, /area/centcom/central_command_areas/evacuation/ship) +"Lv" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/iron, +/area/centcom/central_command_areas/control) "Lw" = ( /obj/effect/spawner/structure/window/reinforced/shuttle, /turf/open/floor/plating, @@ -7544,10 +7685,6 @@ /obj/structure/flora/bush/sparsegrass, /turf/open/floor/grass, /area/centcom/central_command_areas/evacuation/ship) -"LH" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/centcom/central_command_areas/evacuation/ship) "LI" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 @@ -7562,6 +7699,11 @@ /obj/effect/decal/cleanable/glass, /turf/open/floor/iron/smooth_large, /area/centcom/central_command_areas/evacuation/ship) +"LK" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/item/kirbyplants/organic/plant21, +/turf/open/floor/iron/grimy, +/area/centcom/central_command_areas/courtroom) "LM" = ( /obj/docking_port/stationary{ dir = 8; @@ -7583,13 +7725,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, /area/centcom/central_command_areas/evacuation/ship) -"LO" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/computer/operating, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/white, -/area/centcom/central_command_areas/evacuation/ship) "LP" = ( /obj/effect/turf_decal/tile/neutral/full, /obj/effect/turf_decal/stripes/corner{ @@ -7635,24 +7770,17 @@ /obj/structure/speaking_tile, /turf/closed/mineral/ash_rock, /area/awaymission/errorroom) -"Mh" = ( -/obj/machinery/door/poddoor{ - id = "thunderdome"; - name = "Thunderdome Blast Door" - }, -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, +"Mf" = ( +/obj/effect/landmark/thunderdome/one, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/centcom/tdome/arena) -"Mi" = ( -/obj/machinery/door/poddoor{ - id = "thunderdomegen"; - name = "General Supply" - }, -/obj/effect/turf_decal/loading_area{ +"Mn" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/centcom/tdome/arena) "Mo" = ( @@ -7726,6 +7854,13 @@ }, /turf/open/floor/grass, /area/centcom/central_command_areas/evacuation/ship) +"ME" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/evacuation/ship) "MF" = ( /obj/structure/fans/tiny, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -7767,24 +7902,15 @@ /obj/machinery/power/shuttle_engine/large, /turf/open/floor/plating, /area/centcom/central_command_areas/evacuation/ship) -"MN" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/green, +"MP" = ( +/obj/effect/light_emitter/podbay, /turf/open/floor/iron, -/area/centcom/tdome/observation) +/area/centcom/central_command_areas/supplypod/loading/two) "MQ" = ( /obj/structure/closet/secure_closet/courtroom, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) -"MR" = ( -/obj/machinery/vending/boozeomat, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) "MS" = ( /obj/machinery/shower/directional/west, /obj/effect/turf_decal/tile/red{ @@ -7837,13 +7963,6 @@ /obj/structure/sign/poster/contraband/syndicate_pistol, /turf/closed/indestructible/riveted, /area/centcom/central_command_areas/admin) -"Nl" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) "Nm" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -7883,11 +8002,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/admin) -"Nt" = ( -/obj/structure/filingcabinet/medical, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +"Nw" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, /area/centcom/central_command_areas/control) "Nx" = ( /obj/structure/fans/tiny, @@ -7903,15 +8023,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) -"ND" = ( -/obj/structure/table, -/obj/structure/bedsheetbin, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) "NE" = ( /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/pod_storage) @@ -7947,28 +8058,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) -"NL" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) "NM" = ( /obj/structure/closet/crate/bin, /obj/machinery/light/directional/south, /turf/open/floor/wood, /area/centcom/central_command_areas/admin) -"NN" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) "NO" = ( /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supplypod) @@ -7978,6 +8072,17 @@ }, /turf/open/floor/iron/white, /area/centcom/tdome/observation) +"NR" = ( +/obj/machinery/door/poddoor{ + id = "thunderdome"; + name = "Thunderdome Blast Door" + }, +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "NU" = ( /obj/machinery/door/airlock/centcom{ name = "CentCom" @@ -7988,16 +8093,16 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/control) -"NV" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) "NW" = ( /obj/structure/bookcase/random, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) +"NY" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "NZ" = ( /obj/structure/table/wood, /obj/item/paper_bin, @@ -8039,6 +8144,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) +"Oi" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/centcom/central_command_areas/evacuation) "Oj" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/centcom{ @@ -8052,23 +8162,6 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/control) -"Ok" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = 8; - pixel_y = -4 - }, -/obj/item/pen{ - pixel_x = 8; - pixel_y = -4 - }, -/obj/item/flashlight/lamp{ - pixel_x = -5; - pixel_y = 6 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) "Om" = ( /obj/structure/table/reinforced, /obj/item/clipboard, @@ -8080,17 +8173,6 @@ "On" = ( /turf/closed/indestructible/riveted, /area/centcom/central_command_areas/admin) -"Op" = ( -/obj/structure/table/reinforced, -/obj/machinery/microwave{ - desc = "Cooks and boils stuff, somehow."; - pixel_x = -3; - pixel_y = 5 - }, -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) "Oq" = ( /obj/effect/turf_decal/tile/brown/anticorner/contrasted, /turf/open/floor/iron, @@ -8109,6 +8191,14 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/centcom/tdome/observation) +"Ou" = ( +/obj/effect/landmark/thunderdome/one, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "Ow" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ dir = 1 @@ -8127,6 +8217,20 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) +"OA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/supplypod) +"OB" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/prison) "OC" = ( /obj/structure/table/reinforced, /obj/item/toy/plush/lizard_plushie/space/green{ @@ -8171,14 +8275,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) -"OG" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/closet/emcloset, -/turf/open/floor/iron/dark/smooth_large, -/area/centcom/central_command_areas/evacuation/ship) "OH" = ( /obj/machinery/computer/records/security{ dir = 4 @@ -8186,11 +8282,24 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) +"OI" = ( +/obj/item/kirbyplants/organic/plant21, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/evacuation/ship) "OM" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supply) +"OO" = ( +/obj/structure/table/reinforced, +/obj/machinery/reagentgrinder{ + desc = "Used to grind things up into raw materials and liquids."; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/tdome/observation) "OP" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/iron, @@ -8218,14 +8327,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) -"OU" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) "OV" = ( /obj/structure/sink/directional/west, /obj/structure/mirror/directional/east, @@ -8256,11 +8357,24 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/admin) +"OZ" = ( +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/structure/flora/bush/grassy/style_random, +/obj/structure/flora/bush/pale/style_random, +/obj/machinery/light/directional/north, +/turf/open/misc/asteroid, +/area/centcom/tdome/observation) "Pc" = ( /obj/structure/fans/tiny, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/tdome/observation) +"Pd" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/briefing) "Pe" = ( /obj/structure/table/wood, /obj/item/phone{ @@ -8290,9 +8404,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supply) -"Pj" = ( -/turf/closed/indestructible/fakeglass, -/area/centcom/tdome/administration) "Pk" = ( /obj/structure/table/wood, /obj/item/storage/fancy/donut_box, @@ -8377,6 +8488,16 @@ /obj/item/paper/pamphlet/centcom/visitor_info, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod) +"PD" = ( +/obj/item/kirbyplants/organic/plant21{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/fore) "PE" = ( /obj/machinery/newscaster{ pixel_x = 32 @@ -8388,6 +8509,13 @@ /obj/structure/sign/nanotrasen, /turf/closed/indestructible/riveted, /area/centcom/central_command_areas/admin) +"PG" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/centcom/central_command_areas/evacuation) "PH" = ( /obj/machinery/firealarm/directional/south, /obj/structure/closet/crate/bin, @@ -8422,15 +8550,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) -"PN" = ( -/obj/structure/table/wood, -/obj/item/book/manual/wiki/barman_recipes, -/obj/item/reagent_containers/cup/glass/shaker, -/obj/item/reagent_containers/cup/rag, -/obj/machinery/newscaster/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) "PR" = ( /obj/structure/table/wood, /obj/item/phone{ @@ -8452,18 +8571,17 @@ }, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/admin) -"PS" = ( -/obj/machinery/newscaster/directional/south, -/obj/machinery/computer/records/medical{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) "PT" = ( /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/centcom/tdome/observation) +"PU" = ( +/obj/structure/table/wood, +/obj/machinery/computer/records/medical/laptop, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/briefing) "PV" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -8491,6 +8609,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/tdome/observation) +"PZ" = ( +/obj/structure/flora/tree/palm{ + icon_state = "palm2" + }, +/obj/machinery/light/directional/west, +/turf/open/floor/grass, +/area/centcom/central_command_areas/evacuation/ship) "Qb" = ( /obj/structure/table/wood, /obj/item/folder/red, @@ -8540,12 +8665,28 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) -"Qr" = ( -/obj/machinery/light/directional/east, -/obj/machinery/status_display/evac/directional/east, +"Qm" = ( +/obj/item/clipboard, +/obj/item/folder/red, +/obj/item/stamp/denied{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/stamp, +/obj/structure/table/reinforced, +/obj/machinery/status_display/ai/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/prison) +/area/centcom/central_command_areas/control) +"Qo" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/tdome/administration) +"Qp" = ( +/obj/effect/light_emitter/podbay, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supplypod/loading/one) "Qt" = ( /obj/structure/table/reinforced, /obj/item/storage/toolbox/electrical{ @@ -8561,20 +8702,6 @@ }, /turf/open/floor/iron, /area/centcom/tdome/observation) -"Qw" = ( -/obj/item/clipboard, -/obj/item/folder/red, -/obj/item/stamp/denied{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/stamp, -/obj/structure/table/reinforced, -/obj/machinery/light/directional/west, -/obj/machinery/status_display/ai/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) "Qx" = ( /obj/effect/turf_decal/siding/yellow{ dir = 1 @@ -8618,12 +8745,6 @@ "QC" = ( /turf/closed/indestructible/riveted, /area/centcom/tdome/observation) -"QD" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/iron/dark/herringbone, -/area/centcom/central_command_areas/evacuation/ship) "QH" = ( /obj/effect/turf_decal/siding/wideplating_new/dark, /obj/effect/turf_decal/tile/neutral/full, @@ -8645,11 +8766,6 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod) -"QP" = ( -/obj/effect/landmark/thunderdome/one, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/centcom/tdome/arena) "QR" = ( /obj/structure/chair/office/light{ dir = 8 @@ -8657,6 +8773,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/centcom/tdome/observation) +"QT" = ( +/obj/structure/table/wood, +/obj/structure/reagent_dispensers/beerkeg, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/centcom/tdome/observation) "QU" = ( /obj/structure/table/wood, /obj/item/phone{ @@ -8680,6 +8803,12 @@ "QV" = ( /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/admin) +"QX" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/courtroom) "QY" = ( /obj/item/storage/box/handcuffs, /obj/item/ammo_box/a357, @@ -8707,19 +8836,40 @@ }, /turf/open/floor/iron/white, /area/centcom/tdome/observation) -"Rg" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" +"Rc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/centcom/tdome/administration) +"Rd" = ( +/obj/structure/bookcase/random, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) +/area/centcom/central_command_areas/briefing) +"Rf" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/evacuation) "Rh" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 }, /turf/open/floor/iron, /area/centcom/tdome/observation) +"Ri" = ( +/obj/structure/table/reinforced, +/obj/item/book/manual/wiki/security_space_law, +/obj/item/taperecorder, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/control) "Rj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 @@ -8730,7 +8880,9 @@ /obj/machinery/door/airlock/vault{ req_access = list("cent_captain") }, -/obj/machinery/door/poddoor/shutters/indestructible, +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "XCCadminstore" + }, /turf/open/floor/iron, /area/centcom/central_command_areas/admin/storage) "Rk" = ( @@ -8768,14 +8920,13 @@ /obj/machinery/computer/communications, /turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/evacuation/ship) -"Rr" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" +"Rq" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 }, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/administration) +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "Rs" = ( /obj/structure/closet/secure_closet/security, /obj/item/storage/belt/security/full, @@ -8785,13 +8936,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation) -"Ru" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/supplypod) "Rw" = ( /obj/structure/table/wood, /obj/item/clipboard, @@ -8831,11 +8975,6 @@ }, /turf/open/floor/iron, /area/centcom/tdome/administration) -"RC" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/tdome/observation) "RF" = ( /obj/structure/table/reinforced, /obj/item/crowbar/red, @@ -8865,19 +9004,17 @@ /obj/effect/decal/cleanable/fuel_pool, /turf/open/floor/grass, /area/centcom/central_command_areas/evacuation/ship) +"RL" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/light_emitter/podbay, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supplypod/loading/two) "RM" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/armory) -"RO" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/green/anticorner/contrasted, -/turf/open/floor/iron, -/area/centcom/tdome/observation) "RP" = ( /obj/structure/bookcase/random, /obj/machinery/status_display/evac/directional/south, @@ -8889,15 +9026,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) -"RT" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/grass, -/area/centcom/central_command_areas/evacuation/ship) -"RU" = ( -/obj/machinery/modular_computer/console/preset/id/centcom, -/obj/machinery/status_display/ai/directional/north, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/admin) "RV" = ( /obj/structure/table/reinforced, /obj/item/restraints/handcuffs, @@ -8914,6 +9042,11 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/centcom/tdome/observation) +"RX" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron, +/area/centcom/central_command_areas/control) "Sd" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/lattice, @@ -8957,12 +9090,13 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/centcom/tdome/observation) -"So" = ( -/obj/structure/table/wood, -/obj/machinery/computer/records/medical/laptop, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) +"Sm" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/prison) "Sp" = ( /obj/machinery/door/airlock/external/ruin, /obj/effect/turf_decal/stripes/line, @@ -8977,35 +9111,22 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/armory) -"Ss" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) "Su" = ( /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod) -"Sv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/supplypod) -"Sw" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/wood, -/area/centcom/central_command_areas/admin) "Sx" = ( /obj/structure/sign/nanotrasen, /turf/closed/indestructible/riveted, /area/centcom/central_command_areas/admin/storage) +"Sy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/evacuation/ship) "Sz" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -9020,6 +9141,11 @@ /obj/structure/window/reinforced/survival_pod/spawner/directional/west, /turf/open/floor/iron/smooth_large, /area/centcom/central_command_areas/evacuation/ship) +"SE" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/light_emitter/podbay, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supplypod/loading/three) "SG" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -9029,20 +9155,20 @@ /obj/structure/closet/secure_closet/personal, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supplypod) -"SI" = ( -/obj/machinery/modular_computer/console/preset/id/centcom{ - dir = 8 +"SJ" = ( +/obj/machinery/computer/records/security{ + dir = 1 }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) -"SM" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" +"SL" = ( +/obj/structure/reagent_dispensers/wall/peppertank/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) +/turf/open/floor/iron, +/area/centcom/central_command_areas/prison) "SO" = ( /obj/machinery/computer/records/security{ dir = 8 @@ -9051,6 +9177,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) +"SP" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/wood, +/area/centcom/central_command_areas/admin) "SQ" = ( /obj/structure/filingcabinet/medical, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -9066,33 +9197,16 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/one) "ST" = ( -/obj/machinery/door/poddoor/ert, +/obj/machinery/door/poddoor/ert{ + id = "XCCertstore" + }, /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/centcom/central_command_areas/armory) -"SU" = ( -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/ferny/style_random, -/obj/machinery/light/directional/east, -/turf/open/floor/iron{ - dir = 6; - icon_state = "asteroid8"; - name = "sand" - }, -/area/centcom/tdome/administration) -"SV" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/administration) "SX" = ( /obj/machinery/computer/shuttle, /turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/evacuation/ship) -"SZ" = ( -/turf/closed/indestructible/fakeglass, -/area/centcom/tdome/observation) "Tb" = ( /obj/structure/railing/corner{ dir = 8 @@ -9118,6 +9232,16 @@ /obj/item/stack/sheet/mineral/plasma/five, /turf/open/floor/iron/smooth_edge, /area/centcom/central_command_areas/evacuation/ship) +"Tf" = ( +/obj/structure/table/wood, +/obj/item/book/manual/wiki/barman_recipes, +/obj/item/reagent_containers/cup/glass/shaker, +/obj/item/reagent_containers/cup/rag, +/obj/machinery/newscaster/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/centcom/tdome/observation) "Tg" = ( /obj/item/storage/briefcase{ pixel_x = -3; @@ -9128,11 +9252,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/admin) -"Ti" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) "Tj" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/cup/glass/bottle/whiskey{ @@ -9159,13 +9278,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet/red, /area/centcom/central_command_areas/evacuation/ship) -"Tn" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/effect/turf_decal/tile/green/half/contrasted, -/turf/open/floor/iron, -/area/centcom/tdome/observation) "To" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 @@ -9199,18 +9311,6 @@ }, /turf/open/floor/iron, /area/centcom/tdome/administration) -"Tu" = ( -/obj/effect/turf_decal/siding/wideplating_new/dark{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/full, -/obj/structure/closet/emcloset, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark/textured_large, -/area/centcom/central_command_areas/evacuation/ship) "Tv" = ( /obj/structure/table/wood, /obj/structure/window/spawner/directional/south, @@ -9221,6 +9321,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood/tile, /area/centcom/central_command_areas/evacuation/ship) +"Tw" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/structure/flora/bush/ferny/style_random, +/obj/machinery/light/floor, +/turf/open/floor/iron{ + icon_state = "asteroid5"; + name = "plating" + }, +/area/centcom/central_command_areas/control) "Ty" = ( /obj/structure/table/reinforced, /obj/item/camera, @@ -9244,6 +9354,12 @@ }, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/briefing) +"TG" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/evacuation) "TI" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, @@ -9256,20 +9372,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) -"TM" = ( -/obj/effect/turf_decal/siding/wideplating_new/dark{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/full, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +"TL" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ dir = 4 }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark/textured_large, -/area/centcom/central_command_areas/evacuation/ship) +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "TO" = ( /obj/machinery/keycard_auth/directional/south, /obj/structure/table/reinforced, @@ -9374,17 +9483,13 @@ name = "sand" }, /area/centcom/tdome/administration) -"Uo" = ( -/obj/structure/closet/secure_closet/security, -/obj/item/storage/belt/security/full, -/obj/item/gun/ballistic/automatic/wt550, -/obj/item/clothing/head/helmet/swat/nanotrasen, -/obj/item/crowbar/red, -/obj/machinery/light/directional/west, -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) +"Un" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "Ur" = ( /obj/structure/closet/secure_closet/personal/cabinet, /obj/item/clothing/under/rank/civilian/curator/treasure_hunter, @@ -9406,6 +9511,13 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/admin) +"Us" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "Uv" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/cup/bottle/multiver{ @@ -9425,6 +9537,13 @@ "Ux" = ( /turf/open/indestructible/hierophant, /area/centcom/central_command_areas/admin) +"Uz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/closet/emcloset, +/turf/open/floor/iron/dark/smooth_large, +/area/centcom/central_command_areas/evacuation/ship) "UA" = ( /obj/item/cardboard_cutout{ starting_cutout = "Private Security Officer" @@ -9432,6 +9551,25 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation) +"UC" = ( +/obj/structure/closet/secure_closet/personal, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/centcom/tdome/observation) +"UE" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Red Team"; + network = list("thunder"); + pixel_x = 11; + pixel_y = -9; + resistance_flags = 64 + }, +/obj/effect/landmark/thunderdome/two, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "UH" = ( /obj/machinery/light/directional/west, /obj/structure/closet/secure_closet/personal, @@ -9503,6 +9641,16 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron, /area/centcom/central_command_areas/evacuation) +"Vf" = ( +/obj/item/kirbyplants/organic/plant21{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/fore) "Vg" = ( /obj/structure/rack, /obj/item/gun/energy/e_gun{ @@ -9520,7 +9668,7 @@ /area/centcom/central_command_areas/armory) "Vh" = ( /obj/structure/table/reinforced, -/obj/item/storage/backpack/duffelbag/med/surgery{ +/obj/item/surgery_tray/full{ pixel_y = 10; pixel_x = 2 }, @@ -9551,14 +9699,6 @@ /obj/structure/flora/bush/pale/style_random, /turf/open/misc/asteroid, /area/centcom/tdome/administration) -"Vm" = ( -/obj/machinery/computer/records/security{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) "Vn" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/iron, @@ -9653,17 +9793,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) +"VG" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/iron, +/area/centcom/tdome/observation) "VK" = ( /obj/structure/table/wood, /obj/item/storage/fancy/donut_box, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/admin) -"VL" = ( -/obj/machinery/modular_computer/console/preset/id/centcom{ - dir = 1 - }, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/briefing) "VM" = ( /obj/structure/closet/secure_closet/ert_sec, /obj/structure/sign/directions/security{ @@ -9677,7 +9816,9 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/armory) "VO" = ( -/obj/machinery/door/poddoor/ert, +/obj/machinery/door/poddoor/ert{ + id = "XCCertstore" + }, /obj/effect/turf_decal/delivery, /obj/structure/cable, /turf/open/floor/iron, @@ -9695,14 +9836,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/tdome/observation) -"VW" = ( -/obj/machinery/computer/prisoner/management{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) "VY" = ( /obj/machinery/computer/records/security{ dir = 8 @@ -9728,6 +9861,12 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/armory) +"Wa" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/structure/noticeboard/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/briefing) "Wc" = ( /obj/machinery/door/airlock/centcom{ name = "CentCom Security" @@ -9754,28 +9893,12 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron, /area/centcom/tdome/observation) -"Wi" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) "Wl" = ( /obj/structure/table/wood, /obj/machinery/recharger, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/admin) -"Wm" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/machinery/light/directional/north, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/wood, -/area/centcom/central_command_areas/admin) "Wn" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -9790,50 +9913,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) -"Wq" = ( -/obj/machinery/modular_computer/console/preset/id/centcom, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the RD's goons and the AI's satellite from the safety of his office."; - name = "Research Monitor"; - network = list("rd","minisat"); - pixel_y = 28 - }, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/admin) "Wt" = ( /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/four) -"Wu" = ( -/obj/machinery/photocopier, -/obj/machinery/light/directional/north, -/obj/machinery/button/door/indestructible{ - id = "XCCFerry"; - name = "Hanger Bay Shutters"; - pixel_x = -8; - pixel_y = 24 - }, -/obj/machinery/button/door/indestructible{ - id = "XCCsec3"; - name = "CC Main Access Control"; - pixel_x = 8; - pixel_y = 24 - }, -/obj/machinery/button/door/indestructible{ - id = "XCCsec1"; - name = "CC Shutter 1 Control"; - pixel_x = 8; - pixel_y = 38 - }, -/obj/machinery/button/door/indestructible{ - id = "XCCsec3"; - name = "XCC Shutter 3 Control"; - pixel_x = -8; - pixel_y = 38 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) "Wv" = ( /obj/structure/chair, /obj/effect/landmark/thunderdome/observe, @@ -9846,15 +9929,6 @@ /obj/effect/landmark/ert_spawn, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) -"WD" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) "WE" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners, /obj/effect/turf_decal/tile/neutral/opposingcorners, @@ -9883,15 +9957,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/centcom/central_command_areas/armory) -"WI" = ( -/obj/structure/table/wood, -/obj/item/storage/box/drinkingglasses, -/obj/item/reagent_containers/cup/glass/bottle/whiskey{ - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) "WK" = ( /obj/structure/chair, /obj/effect/turf_decal/tile/green{ @@ -9906,11 +9971,6 @@ }, /turf/open/floor/iron, /area/centcom/tdome/observation) -"WM" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supplypod) "WN" = ( /obj/structure/table/wood, /obj/item/storage/box/drinkingglasses, @@ -9978,18 +10038,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supply) -"WT" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Green Team"; - network = list("thunder"); - pixel_x = 12; - pixel_y = -10; - resistance_flags = 64 - }, -/obj/effect/landmark/thunderdome/one, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/centcom/tdome/arena) "WU" = ( /obj/machinery/door/airlock/centcom{ name = "Administrative Office" @@ -10054,19 +10102,6 @@ /obj/structure/flora/bush/pointy/style_random, /turf/open/floor/grass, /area/centcom/tdome/observation) -"Xg" = ( -/obj/structure/rack, -/obj/item/clothing/under/color/green, -/obj/item/clothing/shoes/sneakers/brown, -/obj/item/clothing/suit/armor/tdome/green, -/obj/item/clothing/head/helmet/thunderdome, -/obj/item/melee/baton/security/loaded, -/obj/item/melee/energy/sword/saber/green, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/centcom/tdome/arena) "Xh" = ( /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/four) @@ -10182,6 +10217,15 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/one) +"XF" = ( +/obj/machinery/door/window/brigdoor{ + base_state = "rightsecure"; + name = "CentCom Stand"; + req_access = list("cent_captain") + }, +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/iron/grimy, +/area/centcom/central_command_areas/courtroom) "XJ" = ( /obj/structure/flora/bush/lavendergrass/style_random, /obj/structure/flora/bush/sparsegrass/style_random, @@ -10243,6 +10287,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/tdome/observation) +"Yg" = ( +/obj/effect/landmark/thunderdome/two, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "Yi" = ( /obj/machinery/computer/camera_advanced, /turf/open/floor/iron/dark/herringbone, @@ -10253,6 +10305,11 @@ /obj/structure/cable, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/admin) +"Yk" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/prison) "Ym" = ( /obj/structure/flora/bush/lavendergrass/style_random, /obj/structure/flora/bush/fullgrass/style_random, @@ -10277,23 +10334,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/admin) -"Yu" = ( -/obj/structure/table/reinforced, -/obj/machinery/reagentgrinder{ - desc = "Used to grind things up into raw materials and liquids."; - pixel_y = 5 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) -"Yv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/supplypod) "Yx" = ( /turf/open/floor/iron/white/herringbone, /area/centcom/central_command_areas/evacuation/ship) @@ -10313,13 +10353,18 @@ /obj/effect/mapping_helpers/airlock/access/all/admin/general, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) -"YD" = ( -/obj/structure/table/wood, -/obj/structure/reagent_dispensers/beerkeg, -/obj/machinery/newscaster/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) +"YG" = ( +/obj/structure/closet/emcloset, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/effect/turf_decal/delivery, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron, +/area/centcom/central_command_areas/ferry) "YH" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -10330,12 +10375,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) -"YN" = ( -/obj/structure/table/reinforced, -/obj/item/storage/medkit/regular, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) "YO" = ( /obj/item/radio{ pixel_x = 5; @@ -10423,16 +10462,12 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/centcom/central_command_areas/admin) -"Zg" = ( -/obj/machinery/status_display/ai/directional/north, -/obj/item/kirbyplants{ - icon_state = "plant-15"; - pixel_x = -6; - pixel_y = 12 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) +"Zi" = ( +/obj/effect/landmark/thunderdome/one, +/obj/effect/turf_decal/stripes/line, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "Zj" = ( /obj/structure/closet/secure_closet/freezer/kitchen, /obj/item/food/grown/banana, @@ -10458,6 +10493,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/tdome/observation) +"Zk" = ( +/obj/structure/rack, +/obj/item/clothing/under/color/red, +/obj/item/clothing/shoes/sneakers/brown, +/obj/item/clothing/suit/armor/vest, +/obj/item/clothing/head/helmet/swat, +/obj/item/gun/energy/laser, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/light_emitter/thunderdome, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "Zl" = ( /obj/structure/table/reinforced, /obj/item/clipboard, @@ -10491,7 +10539,8 @@ /obj/structure/table/wood, /obj/item/flashlight/lamp, /obj/machinery/requests_console/directional/north{ - department = "Captain's Desk" + department = "Captain's Desk"; + name = "CentCom Requests Console" }, /obj/effect/mapping_helpers/requests_console/announcement, /obj/effect/mapping_helpers/requests_console/information, @@ -10505,6 +10554,23 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) +"Zy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/supplypod) +"Zz" = ( +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/grassy/style_random, +/obj/structure/flora/bush/flowers_pp/style_random, +/obj/structure/flora/bush/pointy/style_random, +/obj/machinery/light/directional/east, +/turf/open/floor/grass, +/area/centcom/central_command_areas/control) "ZA" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 8 @@ -10571,12 +10637,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/ferry) -"ZP" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, +"ZO" = ( +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/obj/structure/flora/bush/generic/style_random, +/obj/machinery/light/directional/west, +/turf/open/floor/grass, /area/centcom/tdome/observation) "ZQ" = ( /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ @@ -10603,15 +10671,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/admin) -"ZV" = ( -/obj/structure/table, -/obj/structure/bedsheetbin, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) "ZX" = ( /obj/machinery/door/airlock/centcom{ name = "CentCom Security" @@ -36278,7 +36337,7 @@ aa aa aa Lt -tA +ij wX HG HG @@ -37828,7 +37887,7 @@ aL Lt Lt aa -LH +Lt LN OW yX @@ -37837,7 +37896,7 @@ Nm Lt ey LG -pH +PZ gj Lt KH @@ -38082,21 +38141,21 @@ QB ec Ae HZ -QD +OI Lt Lt Lt -LO +mC Zq Yx AA -Da +Ev Lt -iI +pH LF BR MC -EN +LG Lt Lt LC @@ -38339,11 +38398,11 @@ Yi fV YW vJ -aI +vJ Lt pZ Lt -mB +cR Lj fI vq @@ -38355,21 +38414,21 @@ Iv NI NI Lw -KP +cK JE Vv -of +LD LD KV EL -Ew +Er Lu KV LD -TM +fC LD JE -Tu +Lc Lt aa aa @@ -38595,10 +38654,10 @@ Lw SX jC Hl -Hl +Sy YW gd -kr +gv dK LQ LQ @@ -38613,19 +38672,19 @@ HJ HJ ci QH -WE +rQ WE Li Lb -Lb +sA WE WE Lb -Li +dy Li Lb bN -bN +uQ bN Lt aa @@ -38853,9 +38912,9 @@ Rp bb MH fV -sm +fV Lt -OG +Uz Lt LR Tm @@ -38872,18 +38931,18 @@ Lw KO LA nb -sB +Lp zx ZA Lp -sB +Lp DA LA Lp -FE +EB Lp LB -tm +yx Lt aa aa @@ -39110,21 +39169,21 @@ CT sw dv Lz -QD +OI Lt Lt Lt -KJ +Ip Eq Ip Ip -JT +ME Lt -Dn +aX BR LG BR -RT +BR Lt Lt LP @@ -39379,7 +39438,7 @@ EH Lt Ll LG -mU +qe RJ Lt KH @@ -39623,7 +39682,7 @@ KH Lt LU Ld -rG +ki Lt aa aa @@ -40904,7 +40963,7 @@ aa aa aa Lt -fz +fQ za MX DL @@ -45752,13 +45811,13 @@ vB oe Xy oe -oU +YG mD -ta +oe oe td oe -ta +oe mD aa aa @@ -46268,10 +46327,10 @@ xf fw yp sd -pC -pU +ap pU pU +ms qG oe aa @@ -46782,11 +46841,11 @@ xh wu mD gO -zT +cn cn gO cn -zT +cn gO gO aa @@ -47041,7 +47100,7 @@ mD yL WN cb -wW +Bu tb aV ho @@ -47281,7 +47340,7 @@ aa On oo Tg -gD +Bl Wl Qb On @@ -47549,16 +47608,16 @@ On PF mD ww -xi +Fh wz qR -ib +Rd eF hx TE -VL +az eF -bU +Rd MY aa aa @@ -47793,14 +47852,14 @@ aa aa aa On -Zg +eA Rl Br Xq -qH +cB On -fv -hE +vv +En gm wq eB @@ -47809,13 +47868,13 @@ ss xj fa mD -So +PU eF PX Ke eV eF -gF +xU gO aa aa @@ -48066,7 +48125,7 @@ ss fw tr gS -SM +kO WR RH WR @@ -48311,13 +48370,13 @@ gI pE ia Mt -Sw +zU On AK Yq Xq Xq -ef +bO mD wx fw @@ -48329,7 +48388,7 @@ JW eE rB RH -oA +lU gO aa aa @@ -48570,7 +48629,7 @@ MU MU NM On -Wm +SP Nq My Od @@ -48578,7 +48637,7 @@ Dk vF wy TK -xQ +vm mD RH Wy @@ -48586,7 +48645,7 @@ Sk Zs RF OX -NL +aS gO aa aa @@ -48831,7 +48890,7 @@ uP dz Nr Xq -Rg +Hw gS wz TK @@ -48861,18 +48920,18 @@ aa aa aa QC -Hm +KN OE Sl -ca +bM Wn eH Um Wn -ca +bM Wn eH -Um +vc uf aa aa @@ -49078,7 +49137,7 @@ On On On On -RU +ks XL Yr CV @@ -49094,13 +49153,13 @@ su fw wh gS -NN +Fz MJ TI Zl zz OX -aR +Wa gO aa aa @@ -49337,13 +49396,13 @@ Ux On yO To -ye +nk Gf oV On -Wq +JO Vz -uV +Em hT TS mD @@ -49351,13 +49410,13 @@ su fw bm mD -SM +kO Ny ar fi ar Ny -sx +Eb gO aa aa @@ -49369,19 +49428,19 @@ wR gy oH QC -ZV +Ko Xu cd Zm Xl QC -gT +xG Vr pI tH Bp RB -UW +hD Bp oI Bp @@ -49609,11 +49668,11 @@ fw ts qR Mp -WR +Pd RH NC RH -WR +Pd dW gO aa @@ -49637,7 +49696,7 @@ Rh pI tH Bp -Tt +Rc Bj Bp oI @@ -49863,7 +49922,7 @@ uY oe su fw -ts +ne mD Ya rY @@ -49885,7 +49944,7 @@ dw QC TB TB -TB +zR TB TB QC @@ -50123,7 +50182,7 @@ fw ts mD WG -Zv +sE sE bH sE @@ -50149,15 +50208,15 @@ QC PT Rh QC -gQ -gQ -gQ -gQ -gQ -gQ +dl +dl +dl +dl +dl +dl uf Sz -Fc +Sz Sz Sz uf @@ -50364,8 +50423,8 @@ nm TO On Ui -Cs -tD +JC +py oB ZF YU @@ -50394,24 +50453,24 @@ aa QC PY QC -oE +hI MK pI ZM ru -tG +al ru tG -co +ru ED oi QC -Iz -Iz -Iz -Iz -Iz -Iz +nF +nF +nF +nF +nF +nF uf uf uf @@ -50631,10 +50690,10 @@ Rj kR YU oe -qR -wA +oe +su fw -ts +Hi mD Wd bH @@ -50663,14 +50722,14 @@ FZ gE cq QC -IA -IT -IT -IT -IT -Ju -JD -JH +KA +FI +FI +FI +FI +fl +Ic +Zk uf Sz Sz @@ -50909,7 +50968,7 @@ QC Sl QC PT -Nl +Rh QC QC hf @@ -50920,14 +50979,14 @@ DF QC QC QC -IB -IU -bo -bo -IU -Jv -JD -JH +bR +KL +HK +HK +KL +pb +Ic +Zk uf Sz Sz @@ -51173,18 +51232,18 @@ BW Rx NH Tp -Yu +OO VT -Op +BY QC -IB -bo -ol -bo -bo -Jv -JD -JH +bR +HK +UE +HK +HK +pb +Ic +Zk uf Sz Sz @@ -51404,7 +51463,7 @@ YU va oe wB -xi +Fh xS mD wg @@ -51412,7 +51471,7 @@ oL fj RM PE -oL +sE VM Ya aa @@ -51434,14 +51493,14 @@ bi eI hv QC -IB -IU -bo -bo -IU -Jv -JD -JH +bR +KL +HK +HK +KL +pb +Ic +Zk uf Sz Sz @@ -51680,9 +51739,9 @@ QC Sl QC Qi -oi +GI QC -uK +Bh eI bi Wf @@ -51691,14 +51750,14 @@ eI bi cY QC -IC -IW -IW -IW -IW -Jw -JD -JH +EI +CW +CW +CW +CW +Yg +Ic +Zk uf Sz Sz @@ -51937,23 +51996,23 @@ eM Ze tG pN -Dy +bz QC Zj bi -ni +eI zw Id Bs di QC QC -ID -ID -ID -ID -ID -ID +xv +xv +xv +xv +xv +xv uf uf uf @@ -52182,7 +52241,7 @@ io iu iu io -mQ +kq io iu io @@ -52194,7 +52253,7 @@ yc bg gE FZ -hn +kv QC bf eI @@ -52203,18 +52262,18 @@ ck BW Kd Kd -SZ -Is -IE -IX -Jh -Jh -Js -IE -Is -Pj +Gb +HF +Mn +BK +DN +DN +qO +Mn +HF +uE YO -Rr +Fu Sz ih uf @@ -52427,24 +52486,24 @@ zh iF iX iF -tJ +ev tK mR vH tK xl xT -ys +Dp mR zF -Am +dC Fq iu io -gl -Uo +yC +gH uc -Qw +Qm Qk io QC @@ -52460,20 +52519,20 @@ QC Wv Kd yY -SZ -It -It -It -It -It -It -It -It -Pj +Gb +Ef +Ef +Ef +Ef +Ef +Ef +Ef +Ef +uE Pr Xw Sz -gn +cs uf uf uf @@ -52659,15 +52718,15 @@ aa iF iS iZ -jf +iZ jq ju -ju -mF +eq +vY jN jQ jN -jf +iZ iZ lq iF @@ -52702,31 +52761,31 @@ uc uc uc uc -Bv +dq io Of rv Sl gE -oj +ak QC Xf -XJ +ZO Xf QC yY Kd yY -SZ -Iu -IF -IF -IF -IF -IF -IF -Iu -Pj +Gb +wE +fc +fc +fc +fc +fc +fc +wE +uE Pr Xw Sz @@ -52923,9 +52982,9 @@ iF iF iF iF +iN iF iF -iN iF iF iF @@ -52955,7 +53014,7 @@ tL io iu io -rx +Ri Qf Ds DG @@ -52965,7 +53024,7 @@ BB YP bd Rh -Ag +qK QC Sl Sl @@ -52974,22 +53033,22 @@ QC hJ Kd sH -SZ -It -IG -IG -IG -IG -IG -IG -It -Pj +Gb +Ef +Un +Un +Un +Un +Un +Un +Ef +uE Xn Sz Sz Rw Wn -zA +IR uf aa aa @@ -53231,16 +53290,16 @@ QC yY Kd yY -SZ -It -fJ -fJ -fJ -fJ -fJ -fJ -It -Pj +Gb +Ef +NY +NY +NY +NY +NY +NY +Ef +uE Pr Xw Sz @@ -53443,7 +53502,7 @@ aa Vx Vx Vx -mL +px Ox Ox Ox @@ -53456,9 +53515,9 @@ Za Vx Za tK -Ab +gL io -Wu +HY uc kl xV @@ -53477,9 +53536,9 @@ oQ iu Ms Mw -WD -cq -wZ +zu +Ee +aB QC Sl Sl @@ -53488,20 +53547,20 @@ QC yY Kd yY -SZ -It -fJ -fJ -fJ -fJ -fJ -fJ -It -Pj +Gb +Ef +NY +NY +NY +NY +NY +NY +Ef +uE Pr Xw Sz -Bx +Qo Wn zA uf @@ -53700,7 +53759,7 @@ aa Vx lM tI -mM +Vf Ox Ox Ox @@ -53719,7 +53778,7 @@ GN hF km nN -VW +uy io vt xT @@ -53730,7 +53789,7 @@ CJ Ab Ab Ab -DV +Av iu WL Mu @@ -53740,21 +53799,21 @@ aB DF BW BW -NV +BW zw yY Kd yY -SZ -It -fJ -fJ +Gb +Ef +NY +NY Ji Ji -fJ -fJ -It -Pj +NY +NY +Ef +uE Xn pY Sz @@ -53996,26 +54055,26 @@ Mu dL hN BW -BW +IO BW Cz BW Kd yY -SZ -It -fJ -fJ +Gb +Ef +NY +NY Jj Jq -fJ -fJ -It -Pj +NY +NY +Ef +uE mE qk Sz -je +Cb uf Wn uf @@ -54214,7 +54273,7 @@ aa Vx lM Jg -mM +Vf Ox Ox Ox @@ -54233,7 +54292,7 @@ Qf bV km nN -Vm +SJ io vt xo @@ -54244,7 +54303,7 @@ CK Ab Ab Ab -DW +Lv iu WK Mu @@ -54254,21 +54313,21 @@ aB zw BW BW -NV +BW QC yY Kd yY -SZ -It -fJ -fJ +Gb +Ef +NY +NY Ji Ji -fJ -fJ -It -Pj +NY +NY +Ef +uE Pl kd Sz @@ -54484,9 +54543,9 @@ Za Vx Za tN -Ab +gL io -Nt +SQ uc kl xW @@ -54505,9 +54564,9 @@ nW iu Hj Mw -MN -MK -wZ +VG +gZ +aB QC Sl Sl @@ -54516,20 +54575,20 @@ QC yY Kd yY -SZ -It -fJ -fJ -fJ -fJ -fJ -fJ -It -Pj +Gb +Ef +NY +NY +NY +NY +NY +NY +Ef +uE Pr Xw Sz -Bx +Qo Wn zA uf @@ -54732,7 +54791,7 @@ hi nr nL nX -oy +PD nX nL nr @@ -54745,7 +54804,7 @@ Ab iu gl uc -SI +nP AO em iu @@ -54773,16 +54832,16 @@ QC yY Kd yY -SZ -It -fJ -fJ -fJ -fJ -fJ -fJ -It -Pj +Gb +Ef +NY +NY +NY +NY +NY +NY +Ef +uE Pr Xw Sz @@ -55011,7 +55070,7 @@ tL io iu io -el +fM Uv Dv DJ @@ -55021,7 +55080,7 @@ BB QR bd Rh -Tn +fh QC Sl Sl @@ -55030,22 +55089,22 @@ QC hJ Kd sH -SZ -It -II -II -II -II -II -II -It -Pj +Gb +Ef +Rq +Rq +Rq +Rq +Rq +Rq +Ef +uE Xn Sz Sz Sg Wn -wj +ga uf aa aa @@ -55225,22 +55284,22 @@ aa aa Jb rs -ze +am Dj rs -ze +am Dj rs -ze +am Dj rs -ze +am Dj rs -ze +am Dj rs -ze +am Jb uj il @@ -55272,31 +55331,31 @@ uc uc uc uc -PS +rf io Of av Sl Vs -RO +Jl QC XJ -Xf +uF XJ QC Wv Kd yY -SZ -Iu -IF -IF -IF -IF -IF -IF -Iu -Pj +Gb +wE +fc +fc +fc +fc +fc +fc +wE +uE Pr Xw Sz @@ -55509,26 +55568,26 @@ Mz io TU WP -Ok +Gm io -tO +eu tN mR -vO +hB tN xo xo -yy +xF mR zG -Ap +RX AT iu io -YN -OU +Ej +Qf +uc uc -Ti VB io QC @@ -55544,20 +55603,20 @@ QC yY Kd yY -SZ -It -It -It -It -It -It -It -It -Pj +Gb +Ef +Ef +Ef +Ef +Ef +Ef +Ef +Ef +uE Pr Xw Sz -gp +sk uf uf uf @@ -55740,24 +55799,24 @@ aa il is lL -iJ +iL iT iT -jg +SL iT iT -jz +Sm iT iT -eQ +If +iT iT iT -kS ls lL Ra kB -Km +nD iL iT iT @@ -55780,7 +55839,7 @@ io iu iu io -rK +Zz io iu io @@ -55792,7 +55851,7 @@ eM ZM Vs tG -dX +yb QC cW cS @@ -55801,18 +55860,18 @@ ck BW Kd Kd -SZ -Is -IJ -IY -Jk -Jk -Jt -IJ -Is -Pj +Gb +HF +TL +Us +Ac +Ac +bZ +TL +HF +uE YO -Bx +Qo Sz ih uf @@ -55998,7 +56057,7 @@ iH it lL im -iU +kV iU iU iU @@ -56008,13 +56067,13 @@ jF iU iU iU -iU +kV rS lt lL Ra kB -lL +Yk iK iU iU @@ -56049,23 +56108,23 @@ yc Bo FZ bD -Dy +bz QC dV cS -RC +cS zw Ot Ot di QC QC -Mh -Mh -Mh -Mh -Mh -Mh +NR +NR +NR +NR +NR +NR uf uf uf @@ -56276,7 +56335,7 @@ Mz Mz Mz jw -pm +qj io iu io @@ -56306,9 +56365,9 @@ QC Sl QC Qi -cZ +wb QC -YD +QT cS cS AE @@ -56317,14 +56376,14 @@ cS cS Pn QC -IL -IZ -IZ -IZ -IZ -Jx -JD -JL +cV +wm +wm +wm +wm +Ou +Ic +ff uf Sz Sz @@ -56537,14 +56596,14 @@ jG iu Ym iu -xB +Iw sK sz Vq io -vQ +CO wG -xp +Ey wG Fg io @@ -56574,14 +56633,14 @@ cS cS Xd QC -IM -Ja -QP -QP -Ja -Jy -JD -JL +dj +HI +Mf +Mf +HI +Zi +Ic +ff uf Sz Sz @@ -56771,17 +56830,17 @@ lL lL lL lL -ji +gf il -jE +Hs lL nT il -jT -lL +jU lL lL lL +Yk lL qL lL @@ -56810,7 +56869,7 @@ Ab xN BG iu -qw +Tw iu uc io @@ -56822,23 +56881,23 @@ Sl Qi cZ QC -WI +eg BW uM JV dG -MR +ym TV -PN +Tf QC -IM -QP -WT -QP -QP -Jy -JD -JL +dj +Mf +DT +Mf +Mf +Zi +Ic +ff uf Sz Sz @@ -57077,7 +57136,7 @@ QC Sl QC Ad -Nl +Rh QC QC hf @@ -57088,14 +57147,14 @@ QC QC QC QC -IM -Ja -QP -QP -Ja -Jy -JD -JL +dj +HI +Mf +Mf +HI +Zi +Ic +ff uf Sz Sz @@ -57304,7 +57363,7 @@ Mz Mz Mz jw -pm +qj io iu io @@ -57345,14 +57404,14 @@ tG Vs MK QC -IN -Jc -Jc -Jc -Jc -Jz -JD -JL +so +aA +aA +aA +aA +yA +Ic +ff uf Sz Sz @@ -57540,7 +57599,7 @@ iH iy lL ip -iT +kS iT iT iT @@ -57550,13 +57609,13 @@ jv iT iT iT -iT +kS tR ls lL Ra kB -lL +Yk iL iT iT @@ -57567,8 +57626,8 @@ qw iu ZS sK -Ca -ux +GX +wl iu vR Ab @@ -57590,24 +57649,24 @@ uc QC Ye QC -ht +yW cq pI bg sC -FZ +BX sC FZ -ZP +sC gU cZ QC -Mi -Mi -Mi -Mi -Mi -Mi +AC +AC +AC +AC +AC +AC uf uf uf @@ -57796,24 +57855,24 @@ aa il iz lL -iM +iK iU iU -jj +OB iU iU -jB +aG iU iU -jV +sI +iU iU iU -kV lt lL Ra kB -Qr +rg iK iU iU @@ -57838,7 +57897,7 @@ Ab xN Ry iu -zC +oW iu uc io @@ -57859,15 +57918,15 @@ QC Ad Rh QC -Xg -Xg -Xg -Xg -Xg -Xg +Dz +Dz +Dz +Dz +Dz +Dz uf Sz -SV +Sz Sz Sz uf @@ -58084,11 +58143,11 @@ uc SO bG iu -vT +hA wI -xq +Nw wI -Bw +Dm iu zK As @@ -58109,7 +58168,7 @@ oH QC TB TB -TB +UC TB TB QC @@ -58309,28 +58368,28 @@ aa aa Jb rs -ze +am Dj rs -ze +am Dj rs -ze +am Dj rs -ze +am Dj rs -ze +am Dj rs -ze +am Jb Vi Af qf ps -ig +Ar ps yh Hv @@ -58375,7 +58434,7 @@ Rh pI tH Bp -RB +rL UW Bp oI @@ -58621,19 +58680,19 @@ Qy Rb dw QC -ND +zW OV op zt Fe QC -ei +vn Ah pI tH Bp Tt -Bj +aW Bp oI Bp @@ -58834,11 +58893,11 @@ aa aa Hv uN -ig +Ar ps Ai ps -dZ +aU Hv nS rM @@ -59109,17 +59168,17 @@ qy qz cg sN -tS +bL uA -uA -vV +JU +xr wK -xs +Rf wK -vV -uA +xr +JU uA -tS +bL AV cg qz @@ -59130,7 +59189,7 @@ Yn Pz Su qI -NO +Uw PV PV NO @@ -59139,20 +59198,20 @@ NO Uw NO ly -WM +cX Yn -pO +OZ HE Sl -SU +Um Wn Vl bM Wn -SU +Um Wn Vl -bM +zS uf Sz uf @@ -59863,7 +59922,7 @@ aa Hv bB ps -Ss +tQ pc hP lR @@ -59874,7 +59933,7 @@ bP ps ps ps -dZ +aU Hv qy qz @@ -60131,7 +60190,7 @@ RI ps rk rk -ig +Ar Hv qy qz @@ -60156,24 +60215,24 @@ cg sL Yn AH -AH +Qp AH AH OP PK Yn -Yv -yf +PV +PV Yn Vn PW Vn PW -Vn +SE zZ Yn NE -NE +FR NE XT aa @@ -60375,9 +60434,9 @@ aa aa aa Hv -pM +nS rM -kC +LK Hv RI nq @@ -60385,7 +60444,7 @@ RI RI RI Hv -bJ +xE mY rM OS @@ -60393,23 +60452,23 @@ Hv cg fm cg -sR +sQ tT us ve vZ vZ -vZ +PG vZ vZ yB us At -AZ +AY cg pg Uf -CD +TG HH Yn OP @@ -60632,10 +60691,10 @@ aa aa aa Hv -NW +dU rk -kD -la +Ex +Fw rk rk rk @@ -60645,7 +60704,7 @@ RI MV mY rM -RP +HM Hv qB qW @@ -60910,16 +60969,16 @@ rU sO tT us -vh +lZ vg Vd Vd Vd yB -vh +lZ us At -Ba +DU BO Cg HH @@ -60930,14 +60989,14 @@ AH AH AH AH -OP +EM PK Yn -Sv -Ru +OA +Zy Yn Vn -Vn +SE Vn Vn Vn @@ -61403,7 +61462,7 @@ aa aa aa pc -oD +bC rk kG ld @@ -61421,19 +61480,19 @@ Hv cg fm cg -sR +sQ tT us vg wa wa -wa +dh wa wa zl us At -AZ +AY cg VY Xb @@ -61678,7 +61737,7 @@ pc qz qy cg -sQ +sR tT us us @@ -61690,7 +61749,7 @@ Vd zm us At -AY +AZ cg fm cg @@ -61955,7 +62014,7 @@ Nh Ro Yn Se -Si +MP Se Se Se @@ -61968,7 +62027,7 @@ Pm Pm Pm Xh -Xh +mc Wt Yn NE @@ -62174,10 +62233,10 @@ aa aa aa Hv -NW +dU rk -kD -lf +Ex +XF rk rk rk @@ -62198,7 +62257,7 @@ us us us us -us +rq us xt zl @@ -62431,9 +62490,9 @@ aa aa aa Hv -pM +nS rM -kI +fe Hv up SB @@ -62441,7 +62500,7 @@ eS NZ SB Hv -bJ +xE mY rM NW @@ -62486,7 +62545,7 @@ Xh Wt Yn NE -NE +FR NE Yn aa @@ -62701,7 +62760,7 @@ RI ps rk rk -Wi +Aj Hv qz qy @@ -62729,14 +62788,14 @@ Se Se Se Si -Se +RL Tc Yn aa aa Yn Pm -Pm +EE Pm Pm Pm @@ -62947,7 +63006,7 @@ aa Hv Wp xX -zo +QX pc Xc KD @@ -62958,24 +63017,24 @@ gC ps Ha gA -oD +bC Hv cg cg cg -sU -tV tV tV +Oi tV tV tV +Oi tV tV tV +Oi tV tV -Bd cg cg cg diff --git a/_maps/map_files/tramstation/maintenance_modules/atmoscilower_2.dmm b/_maps/map_files/tramstation/maintenance_modules/atmoscilower_2.dmm index 0b7c716c43bef..63b01e5ed5ad0 100644 --- a/_maps/map_files/tramstation/maintenance_modules/atmoscilower_2.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/atmoscilower_2.dmm @@ -13,6 +13,17 @@ /obj/item/stack/ore/glass, /turf/open/misc/asteroid/dug, /area/station/maintenance/starboard/lesser) +"dr" = ( +/obj/effect/decal/cleanable/dirt, +/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, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) "dH" = ( /obj/structure/railing{ dir = 4 @@ -83,7 +94,8 @@ /obj/structure/disposalpipe/junction{ dir = 8 }, -/turf/open/floor/catwalk_floor, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating, /area/station/maintenance/starboard/lesser) "lw" = ( /obj/item/shovel, @@ -187,6 +199,17 @@ }, /turf/open/misc/asteroid, /area/station/maintenance/starboard/lesser) +"xF" = ( +/obj/item/plate{ + pixel_x = -7; + pixel_y = -10 + }, +/obj/item/food/sandwich/cheese/grilled{ + pixel_x = -5; + pixel_y = -9 + }, +/turf/open/misc/asteroid, +/area/station/maintenance/starboard/lesser) "yl" = ( /turf/open/floor/catwalk_floor, /area/station/maintenance/starboard/lesser) @@ -207,13 +230,6 @@ /obj/structure/ore_box, /turf/open/misc/asteroid, /area/station/asteroid) -"AA" = ( -/obj/modular_map_root/tramstation{ - key = "atmoscilower_attachment_a"; - name = "atmoscilower_attachment_a" - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "AY" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -257,6 +273,10 @@ /obj/structure/holosign/barrier/engineering, /turf/open/floor/catwalk_floor, /area/station/maintenance/starboard/lesser) +"Eb" = ( +/obj/item/storage/bag/ore, +/turf/open/misc/asteroid, +/area/station/maintenance/starboard/lesser) "EA" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -327,6 +347,17 @@ "HJ" = ( /turf/closed/mineral/random/stationside/asteroid/porus, /area/station/maintenance/starboard/lesser) +"Iu" = ( +/obj/structure/rack, +/obj/item/stack/sheet/iron/twenty, +/obj/item/stack/sheet/glass{ + amount = 20; + pixel_y = 3; + pixel_x = 3 + }, +/obj/item/stack/rods/twentyfive, +/turf/open/misc/asteroid, +/area/station/maintenance/starboard/lesser) "KP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -375,9 +406,29 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"Nn" = ( +/obj/item/stack/ore/iron, +/turf/open/misc/asteroid, +/area/station/maintenance/starboard/lesser) +"NV" = ( +/obj/structure/chair/stool/directional/east, +/mob/living/basic/lizard{ + dir = 4; + name = "Takes-Their-Mandated-Breaks" + }, +/obj/item/reagent_containers/cup/soda_cans/lemon_lime{ + pixel_x = 11; + pixel_y = 8 + }, +/turf/open/misc/asteroid, +/area/station/maintenance/starboard/lesser) "OK" = ( /turf/open/misc/asteroid/dug, /area/station/maintenance/starboard/lesser) +"Pl" = ( +/obj/item/flashlight/flare, +/turf/open/misc/asteroid, +/area/station/maintenance/starboard/lesser) "Qz" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -388,6 +439,13 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/starboard/lesser) +"QF" = ( +/obj/item/pickaxe{ + pixel_x = 5 + }, +/obj/item/stack/ore/iron, +/turf/open/misc/asteroid, +/area/station/maintenance/starboard/lesser) "Rw" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -409,6 +467,11 @@ /obj/structure/railing/corner, /turf/open/misc/asteroid, /area/station/maintenance/starboard/lesser) +"Tq" = ( +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/head/utility/hardhat, +/turf/open/misc/asteroid, +/area/station/maintenance/starboard/lesser) "UB" = ( /obj/structure/railing/corner{ dir = 1 @@ -903,12 +966,12 @@ MO MO Rw MO -Dw -Dw -Dw -Dw -Dw -Dw +HJ +HJ +HJ +HJ +HJ +HJ Dw Dw Dw @@ -923,13 +986,13 @@ CX MO Qz MO -Dw -Dw -Dw -Dw -Dw -Dw -Dw +HJ +Iu +HJ +HJ +Nn +HJ +HJ Dw Dw Dw @@ -942,14 +1005,14 @@ CX CX MO dY -AA -Dw -Dw -Dw -Dw -Dw -Dw -Dw +MO +nt +nt +NV +HJ +nt +QF +HJ Dw Dw Dw @@ -962,14 +1025,14 @@ CX CX MO Qz -MO -Dw -Dw -Dw -Dw -Dw -Dw -Dw +Gr +nt +Pl +xF +nt +Nn +Eb +HJ Dw Dw Dw @@ -981,15 +1044,15 @@ CX CX CX MO -Qz -MO -Dw -Dw -Dw -Dw -Dw -Dw -Dw +dr +GQ +cq +OK +nt +nt +nt +HJ +HJ Dw Dw Dw @@ -1002,13 +1065,13 @@ CX CX yl kI -MO -Dw -Dw -Dw -Dw -Dw -Dw +GQ +OK +nt +Tq +HJ +HJ +HJ Dw Dw Dw @@ -1023,10 +1086,10 @@ CX MO oV MO -Dw -Dw -Dw -Dw +HJ +HJ +HJ +HJ Dw Dw Dw diff --git a/_maps/map_files/tramstation/maintenance_modules/atmoscilower_attachment_a_3.dmm b/_maps/map_files/tramstation/maintenance_modules/atmoscilower_attachment_a_3.dmm index 2319ef729b08f..a634a8e5896ed 100644 --- a/_maps/map_files/tramstation/maintenance_modules/atmoscilower_attachment_a_3.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/atmoscilower_attachment_a_3.dmm @@ -104,7 +104,7 @@ /area/station/maintenance/starboard/lesser) "y" = ( /obj/effect/decal/cleanable/dirt, -/obj/vehicle/sealed/mecha/working/ripley, +/obj/vehicle/sealed/mecha/ripley, /obj/effect/decal/cleanable/oil, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) diff --git a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_1.dmm b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_1.dmm index a34ab0e6fcf36..eab9280b8fa79 100644 --- a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_1.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_1.dmm @@ -1845,10 +1845,10 @@ gb gb gb gb -gb -gb -gb -gb +eJ +eJ +eJ +eJ eJ eJ eJ @@ -1882,10 +1882,10 @@ gb gb gb gb -gb -gb -gb -gb +eJ +eJ +eJ +eJ eJ eJ eJ @@ -1918,7 +1918,7 @@ eJ gb gb gb -eJ +gb eJ eJ eJ diff --git a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_2.dmm b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_2.dmm index b5273b4c845fa..0901318e30143 100644 --- a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_2.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_2.dmm @@ -154,10 +154,6 @@ /obj/structure/flora/bush/grassy, /turf/open/floor/grass, /area/station/asteroid) -"oi" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall, -/area/station/maintenance/department/cargo) "pU" = ( /obj/effect/turf_decal/trimline/yellow/arrow_cw, /obj/effect/decal/cleanable/dirt, @@ -1980,7 +1976,7 @@ se Fz nK AS -oi +Fz CC CW CW @@ -2004,10 +2000,10 @@ se se se se -se -se -se -se +dx +dx +dx +dx dx dx dx @@ -2041,10 +2037,10 @@ se se se se -se -se -se -se +dx +dx +dx +dx dx dx dx @@ -2077,7 +2073,7 @@ dx se se se -dx +se dx dx dx diff --git a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_3.dmm b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_3.dmm index 63b18a69e7528..775e31e6b9d8a 100644 --- a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_3.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_3.dmm @@ -1918,10 +1918,10 @@ cK cK cK cK -cK -cK -cK -cK +Hu +Hu +Hu +Hu Hu Hu Hu @@ -1955,10 +1955,10 @@ cK cK cK cK -cK -cK -cK -cK +Hu +Hu +Hu +Hu Hu Hu Hu @@ -1991,7 +1991,7 @@ Hu cK cK cK -Hu +cK Hu Hu Hu diff --git a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_1.dmm b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_1.dmm index 202e850684a51..ae78ae6731f9b 100644 --- a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_1.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_1.dmm @@ -1079,10 +1079,10 @@ V V V V -V -V -V -V +l +l +l +l l l l @@ -1105,10 +1105,10 @@ V V V V -V -V -V -V +l +l +l +l l l l diff --git a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_2.dmm b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_2.dmm index 939d8bb0aafc2..0e8deac0a590a 100644 --- a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_2.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_2.dmm @@ -1013,10 +1013,10 @@ V V l V -V -V -V -V +b +b +b +b b b b @@ -1039,10 +1039,10 @@ V V V V -V -V -V -V +b +b +b +b b b b diff --git a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_3.dmm b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_3.dmm index 5831bc047d394..544d9a870759c 100644 --- a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_3.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_3.dmm @@ -115,7 +115,7 @@ /area/station/maintenance/department/cargo) "y" = ( /obj/item/gps/mining, -/turf/open/misc/asteroid, +/turf/open/misc/asteroid/dug, /area/station/asteroid) "z" = ( /obj/item/storage/bag/ore{ @@ -1048,7 +1048,7 @@ b i i I -I +y Y i Y @@ -1100,10 +1100,10 @@ B I I P -y -i -i -i +Q +Q +Q +Q Q Q Q @@ -1126,10 +1126,10 @@ Y Y I Y -i -i -i -i +Q +Q +Q +Q Q Q Q diff --git a/_maps/map_files/tramstation/maintenance_modules/cargoscilower_1.dmm b/_maps/map_files/tramstation/maintenance_modules/cargoscilower_1.dmm index 76c1929c04fd8..4e78a2717afed 100644 --- a/_maps/map_files/tramstation/maintenance_modules/cargoscilower_1.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/cargoscilower_1.dmm @@ -181,10 +181,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/starboard/central) -"jX" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/mineral/random/stationside/asteroid/porus, -/area/station/asteroid) "kD" = ( /obj/structure/chair/comfy/shuttle, /obj/effect/decal/cleanable/dirt, @@ -918,7 +914,7 @@ DE DE DE DE -jX +WE WE WE WE @@ -957,7 +953,7 @@ DE DE DE DE -jX +WE WE WE WE @@ -996,7 +992,7 @@ DE DE DE DE -jX +WE WE WE WE @@ -1035,7 +1031,7 @@ DE DE DE DE -jX +WE WE WE WE diff --git a/_maps/map_files/tramstation/maintenance_modules/cargoscilower_2.dmm b/_maps/map_files/tramstation/maintenance_modules/cargoscilower_2.dmm index 6b9e6ebacc36f..b87596b583e7c 100644 --- a/_maps/map_files/tramstation/maintenance_modules/cargoscilower_2.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/cargoscilower_2.dmm @@ -30,6 +30,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/central) +"ei" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille, +/obj/structure/window/spawner/directional/north, +/obj/structure/window/spawner/directional/south, +/turf/open/floor/iron/smooth, +/area/station/maintenance/starboard/central) "eG" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -89,13 +96,6 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/central) -"nh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/grille, -/obj/structure/window/spawner/directional/north, -/obj/structure/window/spawner/directional/south, -/turf/open/floor/iron/smooth, -/area/station/maintenance/starboard/central) "ni" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment, @@ -385,10 +385,6 @@ "Qh" = ( /turf/open/misc/asteroid/airless, /area/station/asteroid) -"Qz" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/mineral/random/stationside/asteroid/porus, -/area/station/asteroid) "Rl" = ( /obj/effect/decal/cleanable/dirt, /obj/item/mop, @@ -801,7 +797,7 @@ gb gb gb gb -Qz +ia ia ia ia @@ -840,7 +836,7 @@ gb gb gb gb -Qz +ia ia ia ia @@ -879,7 +875,7 @@ gb gb gb gb -Qz +ia ia ia ia @@ -918,7 +914,7 @@ gb gb gb gb -Qz +ia ia ia ia @@ -1000,7 +996,7 @@ Uw VL DJ fj -nh +ei RR eG dS diff --git a/_maps/map_files/tramstation/maintenance_modules/cargoscilower_3.dmm b/_maps/map_files/tramstation/maintenance_modules/cargoscilower_3.dmm index b21f395dce833..12b320b284492 100644 --- a/_maps/map_files/tramstation/maintenance_modules/cargoscilower_3.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/cargoscilower_3.dmm @@ -150,10 +150,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/starboard/central) -"of" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/mineral/random/stationside/asteroid/porus, -/area/station/asteroid) "pk" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/cigbutt, @@ -907,7 +903,7 @@ gb gb gb gb -of +ia ia ia ia @@ -946,7 +942,7 @@ gb gb gb gb -of +ia ia ia ia @@ -985,7 +981,7 @@ gb gb gb gb -of +ia ia ia ia diff --git a/_maps/map_files/tramstation/maintenance_modules/cargoscilower_attachment_b_1.dmm b/_maps/map_files/tramstation/maintenance_modules/cargoscilower_attachment_b_1.dmm index fa4acfb4906c2..fb90b76e1db38 100644 --- a/_maps/map_files/tramstation/maintenance_modules/cargoscilower_attachment_b_1.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/cargoscilower_attachment_b_1.dmm @@ -26,7 +26,7 @@ /area/station/maintenance/starboard/central) "v" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/mini_fridge, +/obj/structure/closet/mini_fridge/grimy, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/central) "z" = ( diff --git a/_maps/map_files/tramstation/maintenance_modules/dormmedupper_attachment_b_3.dmm b/_maps/map_files/tramstation/maintenance_modules/dormmedupper_attachment_b_3.dmm index 98e314091c239..8dcce8fec6823 100644 --- a/_maps/map_files/tramstation/maintenance_modules/dormmedupper_attachment_b_3.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/dormmedupper_attachment_b_3.dmm @@ -70,7 +70,7 @@ /turf/open/floor/iron/smooth, /area/station/maintenance/department/crew_quarters/dorms) "w" = ( -/obj/structure/closet/mini_fridge, +/obj/structure/closet/mini_fridge/grimy, /turf/open/misc/asteroid, /area/station/asteroid) "y" = ( diff --git a/_maps/map_files/tramstation/maintenance_modules/medsciupper_attachment_a_2.dmm b/_maps/map_files/tramstation/maintenance_modules/medsciupper_attachment_a_2.dmm index 6683f8a23e38c..1b839b3bc32a0 100644 --- a/_maps/map_files/tramstation/maintenance_modules/medsciupper_attachment_a_2.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/medsciupper_attachment_a_2.dmm @@ -23,7 +23,7 @@ /turf/open/floor/iron/white, /area/station/maintenance/department/science) "m" = ( -/mob/living/simple_animal/crab{ +/mob/living/basic/crab{ name = "la creatura"; desc = "ay dios mios..." }, diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index db5dfa0d12e9f..638f7512d6780 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -15,12 +15,6 @@ "aac" = ( /turf/open/misc/asteroid/airless, /area/station/asteroid) -"aad" = ( -/obj/structure/cable, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating, -/area/station/maintenance/central/greater) "aae" = ( /obj/structure/cable, /obj/machinery/door/airlock/external{ @@ -105,12 +99,6 @@ /obj/structure/marker_beacon/burgundy, /turf/open/misc/asteroid/airless, /area/station/asteroid) -"aar" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/cable, -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating/airless, -/area/station/solars/starboard/fore) "aas" = ( /obj/effect/turf_decal/sand/plating, /obj/machinery/light/small/directional/west, @@ -125,19 +113,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/plating/airless, /area/station/solars/starboard/fore) -"aav" = ( -/obj/structure/table, -/obj/machinery/light/small/directional/west, -/obj/item/radio/intercom/prison/directional/west, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Security - Prison Cell 5"; - network = list("ss13","Security","prison","pcell") - }, -/turf/open/floor/iron, -/area/station/security/prison/safe) "aaw" = ( /obj/item/storage/toolbox/electrical, /turf/open/misc/asteroid/airless, @@ -146,13 +121,6 @@ /obj/item/stack/ore/glass, /turf/open/misc/asteroid/airless, /area/station/asteroid) -"aay" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "aaz" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -164,20 +132,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/plating, /area/station/commons/vacant_room) -"aaB" = ( -/obj/structure/table, -/obj/machinery/light/small/directional/east, -/obj/item/radio/intercom/prison/directional/east, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 5 - }, -/obj/machinery/camera{ - c_tag = "Security - Prison Cell 6"; - dir = 6; - network = list("ss13","Security","prison","pcell") - }, -/turf/open/floor/iron, -/area/station/security/prison/safe) "aaC" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/cable/layer1, @@ -291,14 +245,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison/workout) -"aaU" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/obj/machinery/status_display/ai/directional/east, -/turf/open/floor/iron, -/area/station/security/prison/safe) "aaV" = ( /obj/effect/spawner/structure/window/reinforced, /obj/effect/turf_decal/trimline/blue/warning{ @@ -306,33 +252,6 @@ }, /turf/open/floor/plating, /area/station/escapepodbay) -"aaX" = ( -/obj/structure/table, -/obj/machinery/light/small/directional/west, -/obj/item/radio/intercom/prison/directional/west, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Security - Prison Cell 3"; - network = list("ss13","Security","prison","pcell") - }, -/turf/open/floor/iron, -/area/station/security/prison/safe) -"aaY" = ( -/obj/structure/table, -/obj/machinery/light/small/directional/east, -/obj/item/radio/intercom/prison/directional/east, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 5 - }, -/obj/machinery/camera{ - c_tag = "Security - Prison Cell 4"; - dir = 6; - network = list("ss13","Security","prison","pcell") - }, -/turf/open/floor/iron, -/area/station/security/prison/safe) "aaZ" = ( /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, @@ -352,11 +271,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/escapepodbay) -"abc" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/prison) "abd" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/marker_beacon/burgundy, @@ -468,33 +382,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/escapepodbay) -"aby" = ( -/obj/structure/table, -/obj/machinery/light/small/directional/west, -/obj/item/radio/intercom/prison/directional/west, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Security - Prison Cell 1"; - network = list("ss13","Security","prison","pcell") - }, -/turf/open/floor/iron, -/area/station/security/prison/safe) -"abz" = ( -/obj/structure/table, -/obj/machinery/light/small/directional/east, -/obj/item/radio/intercom/prison/directional/east, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 5 - }, -/obj/machinery/camera{ - c_tag = "Security - Prison Cell 2"; - dir = 6; - network = list("ss13","Security","prison","pcell") - }, -/turf/open/floor/iron, -/area/station/security/prison/safe) "abA" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 8 @@ -508,14 +395,6 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron, /area/station/escapepodbay) -"abC" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/escapepodbay) "abE" = ( /turf/closed/wall/r_wall, /area/station/hallway/primary/tram/center) @@ -573,18 +452,16 @@ /turf/open/misc/asteroid, /area/station/asteroid) "abN" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=1"; - location = "QM #6" - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #6"; - suffix = "#6" +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/trimline/brown/line, +/obj/effect/turf_decal/stripes, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 }, -/turf/open/floor/iron, -/area/station/cargo/storage) +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "abO" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -609,13 +486,6 @@ }, /turf/open/floor/iron/white, /area/station/security/execution/education) -"abR" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/escapepodbay) "abS" = ( /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/floor/grass, @@ -718,14 +588,6 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, /area/station/escapepodbay) -"ace" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 9 - }, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "acf" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -905,10 +767,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/tram/left) -"acD" = ( -/obj/machinery/light/small/directional/west, -/turf/open/misc/asteroid, -/area/station/asteroid) "acE" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -963,10 +821,6 @@ /obj/effect/spawner/random/trash/food_packaging, /turf/open/misc/asteroid, /area/station/asteroid) -"acL" = ( -/obj/machinery/light/small/directional/east, -/turf/open/misc/asteroid, -/area/station/asteroid) "acN" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/white/full, @@ -1017,18 +871,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/prison/garden) -"acW" = ( -/obj/structure/chair{ - dir = 4; - name = "Judge" - }, -/obj/machinery/airalarm/directional/west, -/obj/machinery/light/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Civilian - Courtroom" - }, -/turf/open/floor/iron, -/area/station/security/courtroom) "acX" = ( /obj/structure/table/wood, /obj/item/gavelblock, @@ -1245,14 +1087,6 @@ /obj/effect/spawner/random/trash/cigbutt, /turf/open/misc/asteroid, /area/station/asteroid) -"adt" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating, -/area/station/escapepodbay) "adu" = ( /obj/machinery/duct, /obj/machinery/door/firedoor, @@ -1378,19 +1212,6 @@ dir = 4 }, /area/station/escapepodbay) -"adJ" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 4 - }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/machinery/bluespace_vendor/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/escapepodbay) "adK" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 4 @@ -1492,24 +1313,6 @@ }, /turf/open/floor/iron, /area/station/escapepodbay) -"aed" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Hallway - Service Wing Left Middle Hall" - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"aee" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Hallway - Service Wing Right Middle Hall" - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "aef" = ( /turf/closed/wall/rust, /area/station/engineering/atmos) @@ -1633,10 +1436,6 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) -"aez" = ( -/obj/machinery/light/small/directional/east, -/turf/open/misc/asteroid/airless, -/area/station/asteroid) "aeB" = ( /obj/machinery/airalarm/directional/south, /obj/structure/cable, @@ -1654,12 +1453,6 @@ }, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) -"aeE" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/cable, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating/airless, -/area/station/solars/port) "aeF" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, @@ -1692,10 +1485,6 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) -"aeK" = ( -/obj/machinery/light/small/directional/north, -/turf/open/misc/asteroid/airless, -/area/station/asteroid) "aeL" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /obj/structure/lattice, @@ -1760,12 +1549,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) -"aeU" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/cable, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating/airless, -/area/station/solars/port) "aeV" = ( /obj/effect/turf_decal/sand/plating, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, @@ -1895,35 +1678,6 @@ /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, /area/station/asteroid) -"afp" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"afq" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"afr" = ( -/obj/structure/flora/bush/grassy, -/obj/machinery/light/small/directional/north, -/turf/open/floor/grass, -/area/station/asteroid) -"afs" = ( -/obj/machinery/duct, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/security/prison) "aft" = ( /obj/effect/turf_decal/trimline/brown/filled/line, /obj/machinery/bluespace_vendor/directional/south, @@ -2019,18 +1773,6 @@ }, /turf/open/openspace, /area/station/asteroid) -"afH" = ( -/obj/machinery/light/directional/west, -/obj/structure/lattice, -/turf/open/openspace, -/area/station/asteroid) -"afI" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/trimline/white/line{ - dir = 10 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) "afJ" = ( /obj/structure/lattice, /obj/structure/railing/corner{ @@ -2038,14 +1780,6 @@ }, /turf/open/openspace, /area/station/asteroid) -"afK" = ( -/obj/machinery/light/directional/north, -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/lattice, -/turf/open/openspace, -/area/station/asteroid) "afL" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/cafeteria, @@ -2064,11 +1798,6 @@ }, /turf/open/openspace, /area/station/asteroid) -"afO" = ( -/obj/machinery/light/directional/east, -/obj/structure/lattice, -/turf/open/openspace, -/area/station/asteroid) "afP" = ( /obj/structure/fluff/tram_rail, /turf/open/openspace, @@ -2126,14 +1855,6 @@ }, /turf/open/openspace, /area/station/asteroid) -"afZ" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 6 - }, -/obj/structure/closet/l3closet/virology, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/virology) "aga" = ( /obj/structure/fluff/tram_rail{ dir = 1 @@ -2146,12 +1867,6 @@ /obj/structure/railing/corner, /turf/open/openspace, /area/station/asteroid) -"agc" = ( -/obj/machinery/light/directional/south, -/obj/structure/railing, -/obj/structure/lattice, -/turf/open/openspace, -/area/station/asteroid) "agd" = ( /obj/structure/lattice, /obj/structure/railing/corner{ @@ -2244,20 +1959,6 @@ }, /turf/open/floor/iron/dark/small, /area/station/commons/vacant_room) -"agu" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/white/warning{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/maintenance/tram/mid) "agv" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -2391,15 +2092,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/plating/airless, /area/station/asteroid) -"agO" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch/directional/west{ - pixel_x = -22; - pixel_y = 9 - }, -/turf/open/floor/iron/smooth, -/area/station/maintenance/disposal) "agP" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/decal/cleanable/dirt, @@ -2479,15 +2171,6 @@ }, /turf/open/floor/glass/reinforced, /area/station/security/warden) -"aha" = ( -/obj/effect/landmark/start/depsec/supply, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/structure/chair, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "ahb" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/disposalpipe/segment{ @@ -2521,27 +2204,6 @@ }, /turf/open/floor/plating/airless, /area/station/asteroid) -"ahg" = ( -/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/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/obj/item/radio/intercom/directional/east, -/obj/machinery/camera/directional/east{ - network = list("ss13","rd","xeno"); - c_tag = "Science - Cytology East" - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "ahh" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/disposalpipe/junction/yjunction, @@ -2617,12 +2279,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/plating/airless, /area/station/asteroid) -"ahs" = ( -/obj/machinery/newscaster/directional/north, -/obj/machinery/modular_computer/console/preset/id, -/obj/structure/sign/calendar/directional/west, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hos) "ahu" = ( /obj/structure/disposaloutlet, /obj/effect/turf_decal/sand/plating, @@ -2771,6 +2427,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"aiH" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/noslip/tram, +/area/station/hallway/primary/tram/center) "aiK" = ( /obj/structure/toilet{ pixel_y = 18 @@ -2825,18 +2485,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/exit) -"ajk" = ( -/obj/effect/turf_decal/trimline/white/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/white/filled/corner, -/obj/effect/turf_decal/trimline/white/filled/corner{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "ajl" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -2921,18 +2569,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/execution/transfer) -"ajQ" = ( -/obj/effect/turf_decal/trimline/white/filled/line, -/obj/effect/turf_decal/trimline/white/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/white/filled/corner{ - dir = 1 - }, -/obj/machinery/light/directional/west, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "ajV" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 10 @@ -2940,21 +2576,13 @@ /turf/open/floor/wood/large, /area/station/service/theater) "aka" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"akb" = ( -/obj/structure/toilet{ - dir = 1 - }, -/obj/machinery/light/small/directional/east, -/obj/structure/mirror/directional/east, -/turf/open/floor/iron/freezer, -/area/station/security/prison) "ake" = ( /obj/machinery/airalarm/directional/east, /turf/open/floor/iron, @@ -2976,6 +2604,23 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) +"akv" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1; + name = "N2 Outlet Pump" + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/engineering/atmos) "akC" = ( /obj/structure/industrial_lift/public, /obj/effect/turf_decal/caution/stand_clear/red, @@ -3087,18 +2732,6 @@ "alg" = ( /turf/closed/wall, /area/station/commons/storage/tools) -"alh" = ( -/obj/structure/table/reinforced, -/obj/item/storage/box/pdas{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/storage/box/pdas, -/obj/machinery/camera/directional/east{ - c_tag = "Command - Bridge South" - }, -/turf/open/floor/iron, -/area/station/command/bridge) "alu" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/line, @@ -3134,11 +2767,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/smooth, /area/station/maintenance/disposal) -"alO" = ( -/obj/machinery/light/dim/directional/west, -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet) "alP" = ( /obj/effect/spawner/random/trash/soap{ spawn_scatter_radius = 1 @@ -3280,25 +2908,13 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) -"amW" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating{ +"anj" = ( +/obj/effect/turf_decal/stripes/end{ dir = 8 }, -/obj/machinery/light/directional/east, -/obj/machinery/firealarm/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/machinery/light/floor, /turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"anq" = ( -/obj/machinery/light/dim/directional/south, -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet) +/area/station/ai_monitored/security/armory) "anr" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -3337,12 +2953,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) -"anx" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "any" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner, /turf/open/floor/iron, @@ -3358,17 +2968,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/engineering/engine_smes) -"anJ" = ( -/obj/machinery/modular_computer/console/preset/engineering{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/engine_smes) "anN" = ( /obj/structure/chair/sofa/corp/corner{ dir = 1 @@ -3395,6 +2994,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/central/greater) +"anY" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "aob" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /turf/open/floor/iron, @@ -3431,6 +3035,11 @@ /obj/structure/cable/multilayer/connected, /turf/open/floor/iron, /area/station/engineering/engine_smes) +"aou" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/turf/open/floor/circuit, +/area/station/command/teleporter) "aow" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -3466,55 +3075,15 @@ /obj/structure/kitchenspike, /turf/open/floor/iron/kitchen_coldroom, /area/station/service/kitchen/coldroom) -"apm" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 5 - }, -/obj/machinery/light_switch/directional/north{ - pixel_x = -9 - }, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) "apr" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 6 }, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) -"apv" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"apw" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/structure/filingcabinet, -/obj/machinery/requests_console/directional/south{ - department = "Security" - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/engineering) "apC" = ( /turf/closed/wall, /area/station/maintenance/department/crew_quarters/dorms) -"apD" = ( -/obj/structure/fluff{ - desc = "What, you think the water just magically soaks into the metallic flooring?"; - icon = 'icons/obj/lavaland/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, -/obj/machinery/duct, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet) "apG" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 5 @@ -3585,32 +3154,11 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron, /area/station/tcommsat/computer) -"apZ" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 - }, -/obj/machinery/button/door/directional/west{ - id = "atmos"; - name = "Atmospherics Lockdown"; - pixel_y = 8; - req_access = list("atmospherics") - }, -/obj/machinery/button/door/directional/west{ - id = "Secure Storage"; - name = "Engineering Secure Storage"; - req_access = list("engine_equip") - }, -/obj/machinery/button/door/directional/west{ - id = "Engineering"; - name = "Engineering Lockdown"; - pixel_y = -8; - req_access = list("engineering") - }, -/obj/structure/sign/clock/directional/north, -/mob/living/simple_animal/parrot/poly, -/turf/open/floor/iron, -/area/station/command/heads_quarters/ce) +"aqb" = ( +/obj/effect/turf_decal/sand, +/obj/structure/ladder, +/turf/open/floor/iron/smooth, +/area/station/maintenance/tram/mid) "aqf" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/yellow/warning{ @@ -3660,6 +3208,10 @@ /obj/machinery/meter, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"aqr" = ( +/obj/machinery/computer/security/hos, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hos) "aqz" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3677,13 +3229,6 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron, /area/station/commons/fitness) -"aqY" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/light/directional/south, -/obj/structure/closet/wardrobe/mixed, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/iron, -/area/station/commons/fitness) "aqZ" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 6 @@ -3713,29 +3258,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/engineering/atmospherics_engine) -"arI" = ( -/obj/structure/closet/crate/hydroponics, -/obj/item/paper/guides/jobs/hydroponics, -/obj/item/seeds/onion, -/obj/item/seeds/garlic, -/obj/item/seeds/potato, -/obj/item/seeds/tomato, -/obj/item/seeds/carrot, -/obj/item/seeds/grass, -/obj/item/seeds/ambrosia, -/obj/item/seeds/wheat, -/obj/item/seeds/pumpkin, -/obj/effect/spawner/random/contraband/prison, -/obj/machinery/light/directional/east, -/obj/item/radio/intercom/prison/directional/east, -/obj/machinery/camera{ - c_tag = "Security - Prison Garden"; - dir = 6; - network = list("ss13","Security","prison") - }, -/obj/item/seeds/tower, -/turf/open/floor/iron/dark, -/area/station/security/prison/garden) "arO" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -3780,6 +3302,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/service/theater) +"arZ" = ( +/obj/machinery/light/dim/directional/south, +/turf/open/floor/wood, +/area/station/service/lawoffice) "asc" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 4 @@ -3789,13 +3315,6 @@ }, /turf/open/floor/iron/white, /area/station/science/lower) -"ash" = ( -/obj/machinery/porta_turret/ai{ - dir = 4 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) "asm" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3832,16 +3351,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/science/xenobiology) -"asz" = ( -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/mechanical, -/obj/item/flashlight, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/item/pipe_dispenser, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "asA" = ( /obj/structure/table/reinforced, /obj/item/tank/internals/emergency_oxygen/engi{ @@ -3864,15 +3373,6 @@ /obj/structure/sign/warning/no_smoking, /turf/closed/wall, /area/station/engineering/atmos) -"asU" = ( -/obj/machinery/firealarm/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/miningdock/cafeteria) "asY" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 4 @@ -3905,6 +3405,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"atV" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Security - Prison Main North-West"; + network = list("ss13","Security","prison") + }, +/turf/open/floor/iron, +/area/station/security/prison) "atX" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/computer/turbine_computer{ @@ -3926,13 +3436,6 @@ }, /turf/open/floor/iron/white, /area/station/science/research) -"auf" = ( -/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, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "auh" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -3981,16 +3484,25 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron/grimy, /area/station/ai_monitored/turret_protected/aisat/foyer) -"auy" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Hallway - Port Tram Platform South"; - pixel_y = -23 - }, -/turf/open/floor/noslip/tram, -/area/station/hallway/primary/tram/left) "auz" = ( /turf/closed/wall, /area/station/commons/vacant_room) +"auA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/white/warning{ + dir = 1 + }, +/obj/effect/spawner/random/trash/graffiti{ + pixel_y = -32; + spawn_loot_chance = 50 + }, +/turf/open/floor/iron, +/area/station/maintenance/tram/right) "auG" = ( /obj/structure/sign/poster/official/safety_report/directional/north, /obj/machinery/camera{ @@ -4041,11 +3553,6 @@ }, /turf/open/floor/iron, /area/station/security/office) -"avf" = ( -/obj/item/storage/toolbox/drone, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron, -/area/station/ai_monitored/security/armory) "avg" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -4105,13 +3612,6 @@ }, /turf/open/floor/iron, /area/station/security/office) -"avp" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/processing) "avq" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -4175,16 +3675,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"avH" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 10 - }, -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/iron, -/area/station/security/processing) "avP" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 9 @@ -4196,14 +3686,6 @@ /obj/structure/sign/clock/directional/north, /turf/open/floor/iron/showroomfloor, /area/station/security/warden) -"avQ" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/showroomfloor, -/area/station/security/warden) "avR" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -4261,10 +3743,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/security/office) -"awx" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/security/interrogation) "awy" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -4341,7 +3819,6 @@ /obj/item/computer_disk/engineering, /obj/item/computer_disk/engineering, /obj/item/computer_disk/engineering, -/obj/item/computer_disk/atmos, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) "axp" = ( @@ -4364,6 +3841,19 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/drone_bay) +"axC" = ( +/obj/structure/table, +/obj/item/airlock_painter, +/obj/item/rcl/pre_loaded, +/obj/item/chisel{ + pixel_y = 7 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/machinery/light/dim/directional/east, +/turf/open/floor/iron, +/area/station/commons/storage/art) "axE" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/effect/turf_decal/trimline/neutral/warning, @@ -4373,6 +3863,10 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 }, +/obj/effect/landmark/start/bitrunner, +/obj/structure/chair{ + dir = 4 + }, /turf/open/floor/iron, /area/station/cargo/storage) "axG" = ( @@ -4391,21 +3885,6 @@ /obj/structure/closet/crate/preopen, /turf/open/floor/iron, /area/station/cargo/storage) -"axJ" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) -"axN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/station/cargo/warehouse) "axS" = ( /turf/open/floor/iron/stairs/medium{ dir = 4 @@ -4416,15 +3895,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/service/theater) -"axX" = ( -/obj/machinery/light/directional/south, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/corner{ - dir = 4 - }, -/area/station/service/kitchen) "ayb" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -4511,10 +3981,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"ayN" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/engine, -/area/station/science/xenobiology) "ayR" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/eva) @@ -4530,13 +3996,6 @@ }, /turf/open/floor/wood, /area/station/commons/vacant_room/office) -"azl" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) "azo" = ( /obj/effect/turf_decal/trimline/blue/filled/corner, /turf/open/floor/iron, @@ -4552,14 +4011,6 @@ /obj/effect/turf_decal/siding/thinplating, /turf/open/floor/glass/reinforced, /area/station/security/brig) -"azM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/light/small/directional/south, -/obj/structure/table, -/obj/machinery/coffeemaker, -/turf/open/floor/iron, -/area/station/cargo/warehouse) "azN" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -4600,19 +4051,6 @@ }, /turf/open/floor/wood, /area/station/command/meeting_room) -"aAB" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/airalarm/directional/north, -/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, -/turf/open/floor/iron, -/area/station/command/bridge) "aAE" = ( /obj/effect/turf_decal/trimline/dark_blue/line{ dir = 1 @@ -4622,29 +4060,6 @@ "aAJ" = ( /turf/open/floor/carpet, /area/station/command/heads_quarters/qm) -"aAK" = ( -/obj/machinery/light/directional/north, -/obj/structure/table, -/obj/item/storage/medkit/regular{ - pixel_x = 6; - pixel_y = -5 - }, -/obj/machinery/status_display/supply{ - pixel_y = 32 - }, -/obj/machinery/camera{ - c_tag = "Cargo - Main Office"; - dir = 9; - network = list("ss13","cargo") - }, -/obj/item/multitool, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 9 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/office) "aAN" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 9 @@ -4673,29 +4088,6 @@ "aBg" = ( /turf/open/floor/glass, /area/station/cargo/sorting) -"aBl" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Science - Monkey Pit"; - network = list("ss13","rd") - }, -/turf/open/misc/dirt/jungle{ - baseturfs = /turf/open/misc/dirt - }, -/area/station/science/explab) -"aBo" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/machinery/light_switch/directional/east{ - pixel_x = 21; - pixel_y = 8 - }, -/obj/machinery/firealarm/directional/east{ - pixel_y = -5 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/command/bridge) "aBq" = ( /obj/structure/sign/nanotrasen{ pixel_x = -32 @@ -4722,19 +4114,6 @@ /obj/structure/chair/comfy/brown, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) -"aBG" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/obj/item/radio/intercom/directional/west, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/station/security/checkpoint/arrivals) -"aBH" = ( -/obj/machinery/teleport/station, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/command/teleporter) "aBI" = ( /obj/machinery/computer/security{ dir = 4 @@ -4745,6 +4124,26 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) +"aBL" = ( +/obj/effect/turf_decal/trimline/dark_green/filled/line, +/obj/effect/turf_decal/trimline/dark_green/filled/corner{ + dir = 1 + }, +/obj/machinery/firealarm/directional/south{ + pixel_x = 4 + }, +/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 + }, +/obj/machinery/light_switch/directional/south{ + pixel_x = -8; + pixel_y = -25 + }, +/turf/open/floor/iron/white, +/area/station/science/genetics) "aBN" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -4895,12 +4294,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit) -"aCO" = ( -/obj/structure/table/wood, -/obj/item/hand_labeler, -/obj/item/stack/package_wrap, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) "aCR" = ( /obj/effect/turf_decal/tile/blue/half/contrasted, /obj/effect/turf_decal/tile/neutral{ @@ -4929,13 +4322,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/dorms) -"aDe" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) "aDk" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ @@ -5000,14 +4386,6 @@ /obj/effect/turf_decal/trimline/neutral/filled/corner, /turf/open/floor/iron, /area/station/hallway/secondary/exit) -"aDJ" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/light/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Hallway - North-West Escape Wing Entry" - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) "aDK" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/machinery/camera/directional/south{ @@ -5019,32 +4397,6 @@ /obj/effect/turf_decal/trimline/red/filled/line, /turf/open/floor/iron, /area/station/security/checkpoint/escape) -"aDR" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/siding/thinplating, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/white/warning, -/turf/open/floor/iron, -/area/station/maintenance/tram/right) -"aDT" = ( -/obj/structure/railing, -/obj/effect/turf_decal/trimline/tram/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/tram/filled/warning{ - dir = 8 - }, -/obj/effect/spawner/random/vending/colavend{ - pixel_x = -5 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/right) "aDV" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -5144,6 +4496,14 @@ }, /turf/open/openspace, /area/station/hallway/primary/tram/center) +"aEu" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/commons/fitness) "aEv" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor, @@ -5212,6 +4572,10 @@ /obj/effect/turf_decal/trimline/red/filled/line, /turf/open/floor/iron, /area/station/security/prison) +"aEL" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/cult, +/area/station/service/chapel/office) "aEN" = ( /obj/machinery/door/airlock/hatch{ name = "Ladder Access Hatch" @@ -5276,20 +4640,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"aFA" = ( -/obj/structure/table, -/obj/item/storage/box/rubbershot{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/storage/box/rubbershot, -/obj/item/storage/box/rubbershot{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "aFP" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 8 @@ -5310,6 +4660,17 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/commons/dorms) +"aFV" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/status_display/ai/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/security/brig) "aFZ" = ( /obj/effect/landmark/event_spawn, /obj/effect/landmark/start/hangover, @@ -5409,16 +4770,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"aGy" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Arrivals - South Hall" - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "aGA" = ( /obj/machinery/static_signal/southwest, /obj/effect/turf_decal/stripes/white/line{ @@ -5712,13 +5063,6 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/medical) -"aIr" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 5 - }, -/obj/item/radio/intercom/prison/directional/east, -/turf/open/floor/iron, -/area/station/security/checkpoint/medical) "aIt" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -5759,6 +5103,21 @@ }, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"aIU" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 5 + }, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/light_switch/directional/north{ + pixel_x = -8 + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/qm) "aIX" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 4 @@ -5815,11 +5174,6 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/white, /area/station/science/lab) -"aJM" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/janitor) "aJN" = ( /obj/machinery/disposal/bin, /obj/structure/sign/painting/large/library_private{ @@ -5903,12 +5257,6 @@ }, /turf/open/floor/iron, /area/station/science/lab) -"aKB" = ( -/obj/structure/ladder, -/obj/effect/landmark/event_spawn, -/obj/machinery/light/dim/directional/south, -/turf/open/floor/iron/dark, -/area/station/service/bar) "aKL" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /obj/machinery/door/firedoor/border_only, @@ -5977,16 +5325,6 @@ /obj/machinery/bluespace_vendor/directional/north, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"aLc" = ( -/obj/machinery/iv_drip, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "aLd" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -6017,6 +5355,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"aLr" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/machinery/status_display/ai/directional/east, +/turf/open/floor/iron, +/area/station/security/prison/safe) "aLw" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -6060,13 +5405,6 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"aLI" = ( -/obj/machinery/computer/operating{ - dir = 8 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/white, -/area/station/science/robotics/lab) "aLQ" = ( /obj/structure/railing{ dir = 8 @@ -6104,25 +5442,6 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"aMm" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 4 - }, -/obj/machinery/light/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Civilian - Recreational Area South" - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "aMn" = ( /obj/structure/railing/corner{ dir = 1 @@ -6149,11 +5468,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"aMz" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/food_or_drink/refreshing_beverage, -/turf/open/floor/iron/grimy, -/area/station/hallway/secondary/entry) "aMD" = ( /obj/machinery/destination_sign/indicator{ dir = 1 @@ -6178,13 +5492,16 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"aMK" = ( -/obj/machinery/light/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Civilian - Library South" +"aML" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Science - Monkey Pit"; + network = list("ss13","rd") }, -/turf/open/floor/carpet, -/area/station/service/library) +/obj/machinery/light/warm/directional/north, +/turf/open/misc/dirt/jungle{ + baseturfs = /turf/open/misc/dirt + }, +/area/station/science/explab) "aMM" = ( /obj/effect/turf_decal/delivery, /obj/machinery/portable_atmospherics/scrubber, @@ -6219,11 +5536,6 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"aMY" = ( -/obj/structure/industrial_lift/tram, -/obj/structure/window/reinforced/tram/mid/directional/south, -/turf/open/openspace, -/area/station/hallway/primary/tram/center) "aNa" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 9 @@ -6243,10 +5555,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /turf/closed/wall/r_wall, /area/station/engineering/atmos) -"aNk" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) "aNp" = ( /obj/structure/chair/office/light, /obj/effect/turf_decal/tile/green, @@ -6275,10 +5583,6 @@ /obj/structure/sign/poster/official/cleanliness/directional/west, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"aNP" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/wood/tile, -/area/station/service/chapel) "aNQ" = ( /turf/open/floor/wood/tile, /area/station/service/chapel) @@ -6297,12 +5601,6 @@ dir = 6 }, /area/station/service/chapel) -"aNT" = ( -/obj/machinery/light/warm/directional/north, -/obj/structure/sign/clock/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "aNU" = ( /obj/machinery/airalarm/directional/north, /obj/structure/cable, @@ -6324,14 +5622,6 @@ dir = 4 }, /area/station/service/chapel) -"aOk" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/obj/machinery/status_display/evac/directional/west, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/virology) "aOn" = ( /turf/closed/wall, /area/station/engineering/storage/tech) @@ -6378,13 +5668,6 @@ dir = 9 }, /area/station/service/chapel) -"aOE" = ( -/obj/structure/bed/dogbed/runtime, -/obj/machinery/light/directional/north, -/obj/structure/sign/clock/directional/north, -/mob/living/simple_animal/pet/cat/runtime, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/cmo) "aOF" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -6430,12 +5713,6 @@ /obj/effect/turf_decal/stripes/white/full, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"aOP" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) "aOQ" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/machinery/camera/directional/south{ @@ -6444,27 +5721,11 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"aOR" = ( -/obj/machinery/airalarm/directional/east, -/obj/machinery/light_switch/directional/north, -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/processing) "aOS" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"aOU" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/light/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Medical - Main South-East"; - network = list("ss13","medbay") - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "aOV" = ( /obj/effect/turf_decal/trimline/red/filled/corner, /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, @@ -6496,6 +5757,14 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"aPl" = ( +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "aPm" = ( /obj/structure/table/glass, /obj/machinery/fax{ @@ -6519,16 +5788,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/white, /area/station/medical/virology) -"aPB" = ( -/obj/machinery/firealarm/directional/east{ - pixel_y = 6 - }, -/obj/machinery/light_switch/directional/east{ - pixel_x = 21; - pixel_y = -10 - }, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) "aPI" = ( /obj/structure/rack, /obj/item/reagent_containers/cup/bottle/acidic_buffer{ @@ -6578,27 +5837,20 @@ dir = 4 }, /area/station/medical/medbay/central) -"aPL" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "aPM" = ( /obj/structure/stairs/south, /turf/open/floor/iron/stairs/right{ dir = 1 }, /area/station/hallway/secondary/service) -"aPP" = ( -/obj/effect/turf_decal/siding/wood, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ +"aPS" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 }, -/turf/open/floor/wood, -/area/station/command/meeting_room) +/obj/structure/disposalpipe/segment, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/dark, +/area/station/medical/virology) "aPV" = ( /obj/effect/turf_decal/bot, /obj/structure/transit_tube/station/reverse{ @@ -6624,13 +5876,6 @@ /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/white, /area/station/medical/pharmacy) -"aQj" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 6 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "aQk" = ( /obj/machinery/vending/coffee, /obj/machinery/power/apc/auto_name/directional/west, @@ -6700,19 +5945,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"aQN" = ( -/obj/structure/table, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/obj/machinery/reagentgrinder, -/obj/item/stack/sheet/mineral/plasma{ - pixel_y = 10 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "aQO" = ( /turf/closed/wall/r_wall, /area/station/command/bridge) @@ -6731,6 +5963,15 @@ /obj/machinery/vending/security, /turf/open/floor/iron/showroomfloor, /area/station/security/lockers) +"aRr" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit) "aRx" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6802,19 +6043,6 @@ /obj/effect/turf_decal/siding/wideplating, /turf/open/floor/iron/dark, /area/station/cargo/miningdock/oresilo) -"aSo" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 9 - }, -/obj/machinery/status_display/supply{ - pixel_y = 32 - }, -/obj/machinery/conveyor{ - dir = 5; - id = "QMLoad" - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "aSt" = ( /turf/open/openspace, /area/station/science/xenobiology) @@ -6830,21 +6058,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"aSI" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) -"aSK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/right) "aSM" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -6883,13 +6096,6 @@ }, /turf/open/floor/iron/white, /area/station/science/lower) -"aTl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/reagent_dispensers/fueltank/large, -/turf/open/floor/iron, -/area/station/engineering/atmos) "aTt" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -6905,20 +6111,6 @@ }, /turf/open/floor/iron/checker, /area/station/commons/lounge) -"aTF" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 5 - }, -/obj/machinery/shower/directional/west, -/obj/effect/turf_decal/box, -/obj/structure/fluff{ - desc = "What, you think the water just magically soaks into the metallic flooring?"; - icon = 'icons/obj/lavaland/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) "aTY" = ( /obj/structure/lattice/catwalk, /obj/machinery/power/solar{ @@ -6982,13 +6174,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/service/chapel) -"aUP" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 9 - }, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron, -/area/station/commons/dorms) +"aVb" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/structure/flora/bush/grassy/style_random, +/obj/machinery/light/floor, +/turf/open/floor/grass, +/area/station/science/lower) "aVj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7003,21 +6194,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/science/lower) -"aVn" = ( -/obj/machinery/light/directional/north, -/obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Atmospherics Distribution Loop"; - dir = 9; - network = list("ss13","engineering") - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Air to Distro" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) +"aVt" = ( +/obj/structure/table/wood, +/obj/item/clothing/glasses/monocle, +/obj/item/food/pie/cream, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/wood, +/area/station/service/theater) "aVD" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/line, @@ -7039,6 +6222,13 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"aWs" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/white, +/area/station/science/lower) "aWJ" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -7053,6 +6243,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/storage/primary) +"aWL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 5 + }, +/obj/machinery/airalarm/directional/north, +/obj/machinery/suit_storage_unit/industrial/loader, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "aWY" = ( /obj/structure/stairs/west, /turf/open/floor/iron/stairs/right{ @@ -7122,20 +6321,6 @@ /obj/structure/sign/clock/directional/north, /turf/open/floor/iron, /area/station/service/janitor) -"aYg" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/white/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, -/area/station/maintenance/tram/right) "aYn" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -7160,27 +6345,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"aZc" = ( -/obj/effect/landmark/lift_id{ - specific_lift_id = "tram_cargo_lift" - }, -/obj/structure/railing{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 8 - }, -/obj/structure/industrial_lift/public, -/obj/machinery/elevator_control_panel/directional/west{ - linked_elevator_id = "tram_cargo_lift"; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck"); - req_access = list("mining") - }, -/obj/effect/abstract/elevator_music_zone{ - linked_elevator_id = "tram_cargo_lift" - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/cargo/miningdock) "aZo" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 4 @@ -7216,6 +6380,20 @@ }, /turf/open/floor/iron/dark, /area/station/medical/storage) +"bbu" = ( +/obj/structure/railing, +/obj/effect/turf_decal/trimline/tram/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/tram/filled/warning{ + dir = 8 + }, +/obj/machinery/vending/cigarette{ + pixel_x = -5 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "bbD" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 1 @@ -7228,20 +6406,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"bbS" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/engine/o2, -/area/station/science/ordnance/storage) +"bbM" = ( +/obj/machinery/photocopier{ + pixel_y = 3 + }, +/obj/structure/sign/clock/directional/west, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/wood/large, +/area/station/service/library) "bck" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor, /area/station/solars/starboard/fore) -"bcl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) "bcq" = ( /obj/effect/landmark/secequipment, /obj/effect/turf_decal/bot, @@ -7298,28 +6475,54 @@ /obj/item/kirbyplants/photosynthetic, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) -"bdJ" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) -"bdQ" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 +"bde" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = 9; + pixel_y = 4 }, -/obj/effect/turf_decal/trimline/neutral/filled/warning{ - dir = 4 +/obj/item/radio{ + pixel_x = -6; + pixel_y = -3 }, -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 1 +/obj/item/key/security, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/security/checkpoint/science) +"bdh" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 }, -/obj/effect/turf_decal/trimline/neutral/corner{ - dir = 1 +/obj/machinery/button/door/directional/west{ + id = "atmos"; + name = "Atmospherics Lockdown"; + pixel_y = 8; + req_access = list("atmospherics") }, -/obj/structure/sign/departments/security{ - pixel_x = 32 +/obj/machinery/button/door/directional/west{ + id = "Secure Storage"; + name = "Engineering Secure Storage"; + req_access = list("engine_equip") + }, +/obj/machinery/button/door/directional/west{ + id = "Engineering"; + name = "Engineering Lockdown"; + pixel_y = -8; + req_access = list("engineering") }, +/mob/living/simple_animal/parrot/poly, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, /turf/open/floor/iron, -/area/station/hallway/secondary/command) +/area/station/command/heads_quarters/ce) +"bdT" = ( +/obj/effect/turf_decal/trimline/white/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) "bej" = ( /obj/machinery/newscaster/directional/north, /obj/effect/turf_decal/trimline/green/filled/line, @@ -7465,6 +6668,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"bgT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) "bhf" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /obj/effect/landmark/event_spawn, @@ -7488,17 +6696,6 @@ /obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"bhA" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/item/radio/intercom/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Medical - Main East"; - network = list("ss13","medbay") - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "bhG" = ( /obj/machinery/door/airlock/centcom{ desc = "Truly, a marvel of modern engineering."; @@ -7507,13 +6704,15 @@ /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/iron/grimy, /area/station/commons/vacant_room) -"bia" = ( -/obj/machinery/light/directional/east, -/obj/machinery/modular_computer/console/preset/engineering{ - dir = 8 +"bhY" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Arrivals - South Hall" }, /turf/open/floor/iron, -/area/station/engineering/atmos) +/area/station/hallway/secondary/entry) "bid" = ( /obj/structure/table, /obj/item/grenade/chem_grenade/smart_metal_foam{ @@ -7538,29 +6737,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"biu" = ( -/obj/machinery/firealarm/directional/south, -/obj/machinery/light/directional/south, -/obj/machinery/conveyor_switch/oneway{ - id = "lawyerdropoff"; - name = "Shipment Delivery Chute Activator"; - pixel_x = 10 - }, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"bix" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/landmark/navigate_destination/dockescpod, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"biI" = ( -/obj/structure/closet/toolcloset, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 10 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) "biS" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 6 @@ -7593,17 +6769,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/security/medical) -"bjv" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 10 - }, -/obj/structure/closet/secure_closet/warden, -/obj/item/radio/intercom/directional/west, -/obj/structure/disposalpipe/segment{ - dir = 5 +"bje" = ( +/obj/effect/spawner/random/structure{ + loot = list(/obj/structure/statue/snow/snowman); + name = "random snowman spawner"; + spawn_loot_chance = 10 }, -/turf/open/floor/iron/showroomfloor, -/area/station/security/warden) +/obj/machinery/light_switch/directional/south, +/turf/open/misc/asteroid/snow/coldroom, +/area/station/service/kitchen/coldroom) "bjK" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 @@ -7621,6 +6795,16 @@ }, /turf/open/floor/iron/cafeteria, /area/station/science/breakroom) +"bjS" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/obj/item/storage/toolbox/mechanical, +/obj/item/clothing/head/utility/welding, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "bjX" = ( /obj/structure/extinguisher_cabinet/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7629,15 +6813,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"bkh" = ( -/obj/structure/window/reinforced/spawner/directional/west{ - pixel_y = 2 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) "blg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/trimline/tram/filled/line{ @@ -7678,6 +6853,25 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"blx" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 9 + }, +/obj/machinery/status_display/supply{ + pixel_y = 32 + }, +/obj/machinery/conveyor{ + dir = 5; + id = "QMLoad" + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/cargo/storage) +"bly" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/right) "blN" = ( /obj/machinery/button/door/directional/west{ id = "private_r"; @@ -7697,13 +6891,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor, /area/station/hallway/primary/tram/center) -"blS" = ( -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/captain/private) "bmp" = ( /obj/effect/turf_decal/trimline/green/corner{ dir = 1 @@ -7724,6 +6911,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/office) +"bmz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/science/server) "bmG" = ( /obj/structure/chair/greyscale{ dir = 4 @@ -7854,21 +7049,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) -"bpv" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = -3 - }, -/obj/item/pen{ - pixel_x = -3 - }, -/obj/item/folder/yellow{ - pixel_x = 4 - }, -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron, -/area/station/cargo/sorting) "bpD" = ( /obj/structure/table, /obj/item/razor, @@ -7947,10 +7127,29 @@ /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) +"bqY" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/box, +/obj/structure/sign/warning/directional/west{ + desc = "A sign warning you to be cautious of falling packages."; + name = "FALLING HAZARD sign" + }, +/obj/item/stack/sheet/cardboard, +/turf/open/floor/plating, +/area/station/engineering/main) "bra" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/commons/lounge) +"brf" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/item/pai_card, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "brm" = ( /turf/open/openspace, /area/station/hallway/primary/tram/right) @@ -7979,13 +7178,6 @@ "bso" = ( /turf/closed/wall/r_wall, /area/station/tcommsat/computer) -"bsE" = ( -/obj/structure/table/glass, -/obj/item/storage/secure/briefcase, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) "bsM" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/structure/sign/gym{ @@ -8015,16 +7207,13 @@ /obj/item/radio/off, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"bsR" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/structure/sign/clock/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Command - Bridge North" - }, -/turf/open/floor/iron, -/area/station/command/bridge) +"bsU" = ( +/obj/structure/cable, +/obj/structure/cable/layer1, +/obj/effect/turf_decal/sand/plating, +/obj/machinery/light/floor, +/turf/open/floor/plating, +/area/station/solars/starboard/fore) "bsW" = ( /obj/machinery/duct, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8052,21 +7241,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/misc/asteroid/snow/coldroom, /area/station/service/kitchen/coldroom) -"btw" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/trimline/yellow/filled/corner, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"btx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible/layer2, -/obj/machinery/meter/layer2, -/turf/open/floor/iron/dark, -/area/station/science/ordnance) "btC" = ( /obj/structure/closet/wardrobe/green, /obj/effect/landmark/start/hangover/closet, @@ -8088,6 +7262,11 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/dorms) +"btR" = ( +/obj/effect/turf_decal/sand/plating, +/obj/machinery/light/floor, +/turf/open/floor/plating, +/area/station/security/prison/workout) "btV" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/trimline/red/filled/corner, @@ -8130,12 +7309,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"buQ" = ( -/obj/structure/closet/secure_closet/security/sec, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/showroomfloor, -/area/station/security/lockers) "buW" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -8188,32 +7361,6 @@ /obj/machinery/computer/mech_bay_power_console, /turf/open/floor/circuit/green, /area/station/science/robotics/mechbay) -"bwg" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 5 - }, -/obj/structure/cable, -/obj/machinery/computer/records/security{ - dir = 8 - }, -/turf/open/floor/iron/showroomfloor, -/area/station/security/warden) -"bwk" = ( -/obj/effect/landmark/navigate_destination/dockescpod2, -/obj/effect/turf_decal/trimline/red/filled/corner, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/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/window/brigdoor/left/directional/west{ - name = "Security Delivery Chute"; - req_access = list("security") - }, -/turf/open/floor/plating, -/area/station/security/office) "bwp" = ( /obj/structure/lattice/catwalk, /obj/machinery/power/solar{ @@ -8270,16 +7417,6 @@ /obj/structure/flora/bush/fullgrass/style_random, /turf/open/misc/grass/jungle, /area/station/science/explab) -"bwV" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/main) "bxd" = ( /obj/structure/table, /obj/item/radio/intercom/directional/east{ @@ -8339,13 +7476,6 @@ "bya" = ( /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/foyer) -"byc" = ( -/obj/machinery/light/directional/west, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/command/bridge) "byh" = ( /obj/structure/table/glass, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -8360,11 +7490,6 @@ }, /turf/open/floor/iron/grimy, /area/station/ai_monitored/command/nuke_storage) -"byp" = ( -/obj/machinery/modular_computer/console/preset/research, -/obj/effect/landmark/event_spawn, -/turf/open/floor/glass/reinforced, -/area/station/command/heads_quarters/rd) "byw" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -8394,11 +7519,6 @@ }, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat_interior) -"byG" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/engineering/atmos) "byH" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner{ @@ -8453,6 +7573,15 @@ /obj/item/pillow/random, /turf/open/floor/carpet, /area/station/commons/dorms) +"bzt" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/machinery/status_display/evac/directional/west, +/obj/structure/cable, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/virology) "bzA" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 4 @@ -8527,20 +7656,14 @@ /obj/structure/sign/departments/telecomms/directional/south, /turf/open/floor/iron, /area/station/engineering/main) -"bBy" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/obj/structure/table/reinforced, -/obj/item/reagent_containers/spray/cleaner, -/obj/item/blood_filter, -/obj/machinery/light_switch/directional/east{ - pixel_x = 22; - pixel_y = -9 +"bBB" = ( +/obj/effect/turf_decal/trimline/green/filled/corner, +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ + dir = 1 }, -/obj/item/clothing/gloves/latex/nitrile, -/turf/open/floor/iron/white, -/area/station/medical/surgery/fore) +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "bBI" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -8559,11 +7682,6 @@ /obj/machinery/status_display/evac/directional/north, /turf/open/misc/asteroid, /area/station/security/prison/workout) -"bCm" = ( -/obj/structure/chair/plastic, -/obj/machinery/light/blacklight/directional/north, -/turf/open/floor/eighties/red, -/area/station/commons/fitness/recreation/entertainment) "bCu" = ( /obj/structure/mirror/directional/north, /obj/structure/sink{ @@ -8571,24 +7689,6 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/captain/private) -"bCK" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/white, -/area/station/science/lower) -"bCT" = ( -/obj/machinery/computer/security/mining{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/miningdock) "bDf" = ( /obj/structure/table/reinforced, /obj/item/folder/yellow, @@ -8598,28 +7698,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) -"bDj" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 9 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) -"bDk" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 10 - }, -/obj/machinery/firealarm/directional/south{ - pixel_x = 4 - }, -/obj/machinery/light_switch/directional/south{ - pixel_x = -9 - }, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/disposal/bin, -/turf/open/floor/iron/white, -/area/station/science/explab) "bDq" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -8657,10 +7735,6 @@ }, /turf/open/floor/iron, /area/station/commons/storage/primary) -"bEi" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/engine/o2, -/area/station/engineering/atmos) "bEo" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 9 @@ -8685,15 +7759,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) -"bEA" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/light/small/directional/west, -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/structure/railing/corner, -/turf/open/space/openspace, -/area/station/solars/starboard/fore) "bEM" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 10 @@ -8716,6 +7781,18 @@ }, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat_interior) +"bFo" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/camera/directional/south{ + c_tag = "Security - Main Office South"; + network = list("ss13","Security") + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/security/office) "bFq" = ( /turf/closed/wall, /area/station/medical/psychology) @@ -8830,6 +7907,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation/entertainment) +"bHf" = ( +/obj/machinery/computer/operating, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) "bHn" = ( /turf/open/floor/iron/stairs/medium{ dir = 1 @@ -8893,6 +7978,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/service/library) +"bIm" = ( +/obj/machinery/door/airlock{ + name = "Barber Storage" + }, +/turf/open/floor/plating, +/area/station/service/barber) "bIp" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -8945,12 +8036,6 @@ }, /turf/open/floor/glass/reinforced, /area/station/ai_monitored/turret_protected/aisat/hallway) -"bJT" = ( -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/miningdock) "bKb" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 4 @@ -8961,15 +8046,10 @@ /obj/effect/landmark/start/botanist, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"bKe" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 8 - }, -/obj/structure/railing/corner, -/obj/machinery/light/small/directional/east, -/turf/open/space/basic, -/area/space/nearstation) +"bKg" = ( +/obj/machinery/light/warm/directional/east, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "bKl" = ( /obj/structure/rack, /obj/item/clothing/suit/hooded/ablative, @@ -8987,6 +8067,10 @@ "bKt" = ( /turf/open/floor/engine, /area/station/engineering/supermatter) +"bKu" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/engineering/gravity_generator) "bKy" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner, @@ -8995,6 +8079,12 @@ }, /turf/open/space/openspace, /area/station/solars/starboard/fore) +"bKE" = ( +/obj/machinery/modular_computer/preset/curator{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/service/library) "bKF" = ( /obj/structure/table/wood, /obj/machinery/chem_master/condimaster{ @@ -9015,10 +8105,37 @@ "bKM" = ( /turf/open/floor/iron/dark, /area/station/commons/lounge) +"bKN" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 10 + }, +/obj/effect/turf_decal/bot_white, +/obj/machinery/computer/piratepad_control/civilian{ + dir = 4 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron, +/area/station/cargo/lobby) "bKT" = ( /obj/machinery/portable_atmospherics/canister, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) +"bKY" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 6 + }, +/obj/machinery/camera{ + c_tag = "Cargo - Lobby"; + dir = 6; + network = list("ss13","cargo") + }, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron, +/area/station/cargo/lobby) "bLd" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 8 @@ -9036,6 +8153,21 @@ "bLe" = ( /turf/open/floor/carpet, /area/station/service/library) +"bLj" = ( +/obj/structure/table/glass, +/obj/item/book/manual/wiki/surgery{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/book/manual/wiki/medicine, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/item/radio/intercom/directional/west, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "bLk" = ( /obj/structure/table, /turf/open/floor/iron/cafeteria, @@ -9115,20 +8247,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/interrogation) +"bLO" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) "bLQ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, /turf/open/floor/iron, /area/station/hallway/secondary/exit) -"bLR" = ( -/obj/structure/closet/lasertag/red, -/obj/effect/landmark/start/hangover/closet, -/obj/machinery/light/blacklight/directional/east, -/obj/structure/sign/poster/official/random/directional/east, -/obj/effect/turf_decal/tile/red/full, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/fitness/recreation/entertainment) "bLT" = ( /obj/effect/turf_decal/siding/thinplating/corner{ dir = 1 @@ -9234,21 +8362,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"bNs" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/machinery/button/elevator/directional/north{ - id = "tram_xeno_lift" - }, -/obj/machinery/lift_indicator/directional/north{ - linked_elevator_id = "tram_xeno_lift" - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "bNx" = ( /obj/structure/railing, /obj/machinery/door/firedoor/border_only, @@ -9344,16 +8457,13 @@ /obj/item/clothing/gloves/latex/nitrile, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"bNZ" = ( -/obj/machinery/modular_computer/console/preset/civilian, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 +"bNY" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 }, -/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/cold/directional/east, /turf/open/floor/iron, -/area/station/engineering/break_room) +/area/station/commons/dorms) "bOi" = ( /obj/structure/flora/bush/lavendergrass/style_random, /turf/open/floor/grass, @@ -9377,12 +8487,21 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/dark, /area/station/medical/medbay/lobby) +"bPm" = ( +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/engine, +/area/station/science/xenobiology) "bPo" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 8 }, /turf/open/floor/iron, /area/station/commons/fitness) +"bPp" = ( +/obj/machinery/vending/coffee, +/obj/machinery/status_display/ai/directional/east, +/turf/open/floor/wood/parquet, +/area/station/command/meeting_room) "bPr" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -9428,15 +8547,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"bPZ" = ( -/obj/machinery/camera/motion{ - c_tag = "Secure - AI Upper External South"; - dir = 9; - network = list("aicore") - }, -/obj/structure/lattice, -/turf/open/space/openspace, -/area/space/nearstation) "bQt" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -9462,14 +8572,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) -"bRX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/maintenance/port/central) "bSd" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/large, @@ -9525,13 +8627,6 @@ /obj/effect/turf_decal/siding/thinplating, /turf/open/floor/iron, /area/station/cargo/storage) -"bTJ" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet, -/area/station/commons/vacant_room/office) "bTN" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/structure/disposalpipe/segment{ @@ -9539,17 +8634,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"bTR" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 - }, -/obj/structure/table, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/item/storage/box/lights/mixed, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron, -/area/station/commons/storage/tools) "bTT" = ( /obj/structure/fluff/tram_rail/anchor{ dir = 1 @@ -9717,6 +8801,14 @@ }, /turf/open/space/openspace, /area/station/solars/port) +"bWk" = ( +/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/white, +/area/station/medical/virology) "bWv" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ @@ -9872,12 +8964,6 @@ }, /turf/open/floor/iron/white, /area/station/science/lower) -"bXQ" = ( -/obj/machinery/light/warm/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/large, -/area/station/service/theater) "bYa" = ( /obj/structure/chair{ dir = 1 @@ -9893,6 +8979,17 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/eighties, /area/station/commons/fitness/recreation/entertainment) +"bYe" = ( +/obj/machinery/button/door/directional/west{ + id = "Toilet6"; + name = "Lock Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/machinery/recharge_station, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet) "bYA" = ( /obj/structure/table, /obj/item/storage/fancy/donut_box, @@ -9944,6 +9041,13 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"bYW" = ( +/obj/structure/table, +/obj/structure/closet/mini_fridge, +/obj/item/reagent_containers/condiment/milk, +/obj/item/reagent_containers/cup/soda_cans/cola, +/turf/open/floor/iron/white, +/area/station/service/kitchen) "bYY" = ( /obj/effect/turf_decal/sand, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -10014,8 +9118,8 @@ /area/station/service/hydroponics/garden) "bZI" = ( /obj/machinery/door/window/brigdoor/left/directional/south{ - req_access = list("morgue_secure"); - name = "Secure Morgue Trays" + name = "Secure Morgue Trays"; + req_access = list("morgue_secure") }, /turf/open/floor/iron/dark, /area/station/medical/morgue) @@ -10068,39 +9172,21 @@ }, /turf/open/floor/catwalk_floor, /area/station/hallway/primary/tram/right) -"caD" = ( -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/structure/chair{ +"caN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/siding/thinplating{ dir = 1 }, -/obj/effect/landmark/start/assistant, -/obj/machinery/camera/directional/south{ - c_tag = "Science - Front Lobby"; - network = list("ss13","rd") - }, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"caF" = ( -/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/trimline/white/warning{ + dir = 1 }, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/dim/directional/south, /turf/open/floor/iron, -/area/station/ai_monitored/security/armory) -"caP" = ( -/obj/structure/cable, -/obj/structure/cable/layer1, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating, -/area/station/solars/starboard/fore) +/area/station/maintenance/tram/right) "caR" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -10110,17 +9196,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"cbc" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 10 - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/bot_white, -/obj/machinery/computer/piratepad_control/civilian{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) "cbe" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/trimline/neutral/filled/warning, @@ -10139,16 +9214,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/commons/dorms) -"cbs" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/machinery/light/small/directional/east, -/obj/structure/sign/poster/contraband/d_day_promo/directional/east, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/cargo/warehouse) "cbG" = ( /obj/effect/landmark/start/security_officer, /obj/structure/chair{ @@ -10185,6 +9250,29 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) +"ccF" = ( +/obj/structure/table, +/obj/item/storage/medkit/regular{ + pixel_x = 6; + pixel_y = -5 + }, +/obj/machinery/status_display/supply{ + pixel_y = 32 + }, +/obj/machinery/camera{ + c_tag = "Cargo - Main Office"; + dir = 9; + network = list("ss13","cargo") + }, +/obj/item/multitool, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 9 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/cargo/office) "ccH" = ( /obj/machinery/shower/directional/west, /turf/open/floor/iron/freezer, @@ -10197,12 +9285,6 @@ }, /turf/open/floor/plating, /area/station/science/robotics/lab) -"ccQ" = ( -/obj/machinery/computer/atmos_control/nocontrol/master{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "ccT" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -10231,6 +9313,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/medical/virology) +"cdr" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/obj/machinery/newscaster/directional/south, +/obj/machinery/light_switch/directional/east{ + pixel_x = 23; + pixel_y = 8 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/arrivals) "cdy" = ( /turf/open/floor/plating, /area/station/cargo/storage) @@ -10284,6 +9377,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/office) +"cea" = ( +/obj/structure/table, +/obj/item/radio/intercom/prison/directional/south, +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/prison/workout) "ceb" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -10333,24 +9433,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) -"ceC" = ( -/obj/structure/table, -/obj/item/radio{ - pixel_x = -6; - pixel_y = -3 - }, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = 9; - pixel_y = 4 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 10 - }, -/obj/machinery/firealarm/directional/west{ - pixel_y = 5 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/medical) "ceF" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -10406,12 +9488,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"cfg" = ( -/obj/structure/ladder, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/smooth, -/area/station/maintenance/tram/mid) "cfp" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner, @@ -10438,26 +9514,18 @@ /obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron, /area/station/cargo/sorting) -"cfY" = ( -/obj/structure/table/wood, -/obj/machinery/light/dim/directional/north, -/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 +"cfC" = ( +/obj/effect/turf_decal/trimline/brown/line, +/obj/effect/turf_decal/stripes, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 }, -/obj/item/food/grown/poppy{ - pixel_y = 2 +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 }, -/turf/open/floor/carpet, -/area/station/service/chapel/monastery) +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "cga" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 8 @@ -10493,14 +9561,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) -"cge" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/light/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "cgl" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 4 @@ -10517,17 +9577,21 @@ }, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"cgN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light_switch/directional/south{ - pixel_x = 11; - pixel_y = -23 - }, -/obj/machinery/firealarm/directional/south{ - pixel_x = -1 +"cgD" = ( +/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/camera{ + c_tag = "Security - Prison Workshop"; + dir = 6; + network = list("ss13","Security","prison") }, -/turf/open/floor/wood, -/area/station/command/meeting_room) +/obj/item/stack/license_plates/empty/fifty, +/obj/item/stack/license_plates/empty/fifty, +/obj/machinery/light/directional/east, +/turf/open/floor/plating, +/area/station/security/prison/work) "cgR" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -10576,6 +9640,11 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) +"chr" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/ai_monitored/security/armory) "cht" = ( /obj/effect/turf_decal/bot, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -10591,6 +9660,14 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/science/server) +"cia" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "civ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -10665,11 +9742,38 @@ }, /turf/open/floor/plating, /area/station/solars/starboard/fore) +"ckr" = ( +/obj/structure/table, +/obj/item/assembly/timer{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/assembly/timer{ + pixel_x = 6; + pixel_y = -4 + }, +/obj/item/assembly/timer{ + pixel_x = 5; + pixel_y = 4 + }, +/obj/item/assembly/timer, +/obj/machinery/camera/directional/west{ + c_tag = "Science - Ordnance Launch Bay"; + network = list("ss13","rd") + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "ckt" = ( /obj/structure/table/wood, /obj/item/radio/intercom/directional/west, /turf/open/floor/wood/large, /area/station/service/library) +"ckC" = ( +/obj/machinery/modular_computer/preset/research, +/obj/effect/landmark/event_spawn, +/turf/open/floor/glass/reinforced, +/area/station/command/heads_quarters/rd) "ckH" = ( /obj/machinery/door/airlock/highsecurity{ name = "Secure Tech Storage" @@ -10702,14 +9806,6 @@ }, /turf/open/floor/iron/white, /area/station/science/lab) -"clR" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics) "clT" = ( /turf/closed/wall, /area/station/security/checkpoint/medical) @@ -10742,23 +9838,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"cmY" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Atmos to Loop" - }, -/obj/effect/turf_decal/stripes/line{ +"cnt" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/effect/turf_decal/trimline/red/corner{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/east, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) -"cnA" = ( -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/turf/open/floor/engine/n2o, -/area/station/engineering/atmos) +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) "cnV" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -10766,13 +9857,6 @@ /obj/machinery/vending/modularpc, /turf/open/floor/iron/white, /area/station/science/lobby) -"cnX" = ( -/obj/machinery/power/smes, -/obj/machinery/light/small/directional/south, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/catwalk_floor, -/area/station/solars/port) "cow" = ( /obj/effect/turf_decal/trimline/dark_red/warning{ dir = 6 @@ -10819,11 +9903,6 @@ }, /turf/open/floor/wood, /area/station/service/library) -"coX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/smooth, -/area/station/maintenance/tram/mid) "cpl" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, @@ -10863,11 +9942,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"cpN" = ( -/obj/machinery/light/warm/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "cpY" = ( /obj/machinery/duct, /obj/structure/cable, @@ -10978,6 +10052,34 @@ /obj/structure/table/reinforced, /turf/open/floor/iron/dark, /area/station/service/bar) +"crV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/white/warning, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/tram/right) +"csc" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/glass/reinforced, +/area/station/security/brig) "csg" = ( /obj/structure/table/glass, /obj/item/stack/sheet/mineral/plasma{ @@ -10995,6 +10097,23 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron/white, /area/station/medical/pharmacy) +"csh" = ( +/obj/structure/cable, +/obj/machinery/firealarm/directional/west{ + pixel_y = -5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/cafeteria, +/area/station/command/heads_quarters/rd) +"csn" = ( +/obj/machinery/elevator_control_panel{ + layer = 3.1; + linked_elevator_id = "tram_xeno_lift"; + pixel_y = 2; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") + }, +/turf/closed/wall, +/area/station/science/xenobiology) "csA" = ( /turf/closed/wall, /area/station/solars/starboard/fore) @@ -11006,12 +10125,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos) -"csR" = ( -/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/dark, -/area/station/service/chapel/office) "cta" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -11048,6 +10161,15 @@ /obj/structure/industrial_lift/public, /turf/open/floor/plating/elevatorshaft, /area/station/maintenance/tram/mid) +"cuM" = ( +/obj/structure/table, +/obj/item/radio/intercom/prison/directional/north, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "cuN" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 @@ -11115,19 +10237,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"cvI" = ( -/obj/structure/table, -/obj/item/airlock_painter, -/obj/item/rcl/pre_loaded, -/obj/item/chisel{ - pixel_y = 7 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron, -/area/station/commons/storage/art) "cwg" = ( /obj/structure/stairs/north, /turf/open/floor/iron/stairs/medium, @@ -11143,6 +10252,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /turf/open/floor/iron/dark, /area/station/science/xenobiology) +"cwr" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Medical - Main West"; + network = list("ss13","medbay") + }, +/obj/machinery/firealarm/directional/west, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "cwy" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -11162,18 +10283,6 @@ }, /turf/open/misc/grass/jungle, /area/station/science/explab) -"cwX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/end{ - dir = 1 - }, -/obj/structure/closet/secure_closet/research_director, -/obj/machinery/camera/directional/south{ - c_tag = "Science - Research Director's Office"; - network = list("ss13","rd") - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/rd) "cxc" = ( /obj/structure/chair, /turf/open/floor/iron/checker, @@ -11200,6 +10309,15 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"cxt" = ( +/obj/vehicle/ridden/wheelchair, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "cxx" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -11221,16 +10339,6 @@ /obj/effect/turf_decal/trimline/purple/filled/warning, /turf/open/floor/iron, /area/station/service/janitor) -"cxV" = ( -/obj/machinery/light/directional/east, -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/processing) "cya" = ( /obj/structure/railing{ dir = 4 @@ -11257,26 +10365,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/checker, /area/station/commons/lounge) -"cyh" = ( -/obj/structure/closet/secure_closet/brig{ - id = "medcell"; - name = "Medical Cell Locker" - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/station/security/checkpoint/medical) -"cyp" = ( -/obj/effect/turf_decal/trimline/red/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/security/prison) "cyq" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -11286,6 +10374,19 @@ /obj/structure/railing, /turf/open/space/openspace, /area/station/solars/port) +"cyt" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/green/corner{ + dir = 4 + }, +/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, +/area/station/hallway/secondary/service) "cyu" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/structure/disposalpipe/segment, @@ -11302,6 +10403,15 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron, /area/station/engineering/main) +"cyL" = ( +/obj/machinery/newscaster/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) "cyN" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -11353,10 +10463,15 @@ }, /turf/open/floor/plating, /area/station/science/xenobiology) -"cyZ" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/turf/open/floor/engine/n2, -/area/station/engineering/atmos) +"czg" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) "czp" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -11366,15 +10481,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plating, /area/station/maintenance/tram/mid) -"czu" = ( -/obj/structure/ladder, -/obj/effect/turf_decal/siding/thinplating_new/end, -/obj/effect/turf_decal/siding/thinplating_new/end{ - dir = 1 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, -/area/station/science/explab) "czB" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 10 @@ -11462,15 +10568,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"cBi" = ( -/obj/structure/closet/emcloset/anchored, -/obj/effect/turf_decal/sand/plating, -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/commons/vacant_room) +"cAK" = ( +/obj/effect/spawner/random/medical/two_percent_xeno_egg_spawner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/obj/machinery/light/directional/north, +/turf/open/floor/engine, +/area/station/science/xenobiology) "cBo" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -11507,6 +10610,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor, /area/station/solars/starboard/fore) +"cCr" = ( +/obj/structure/cable, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/wood, +/area/station/service/theater) "cCD" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/machinery/duct, @@ -11515,10 +10623,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/prison) -"cCR" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/catwalk_floor, -/area/station/command/teleporter) "cDd" = ( /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, @@ -11541,6 +10645,16 @@ }, /turf/open/floor/iron/white, /area/station/science/lower) +"cDw" = ( +/obj/machinery/firealarm/directional/east{ + pixel_y = 6 + }, +/obj/machinery/light_switch/directional/east{ + pixel_x = 23; + pixel_y = -8 + }, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) "cDD" = ( /obj/effect/turf_decal/weather/snow, /obj/effect/turf_decal/weather/snow/corner, @@ -11561,11 +10675,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/main) -"cDN" = ( -/obj/machinery/telecomms/bus/preset_four, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) "cDP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11628,7 +10737,7 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "cEy" = ( -/obj/machinery/atmospherics/components/unary/cryo_cell{ +/obj/machinery/cryo_cell{ dir = 4 }, /turf/open/floor/iron/dark, @@ -11643,14 +10752,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/hallway/primary/tram/right) -"cFe" = ( -/obj/machinery/light/warm/directional/south, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood/large, -/area/station/service/theater) "cFg" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -11663,13 +10764,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/exit) -"cFl" = ( -/obj/machinery/light/directional/north, -/obj/structure/closet/secure_closet/freezer/kitchen, -/obj/effect/turf_decal/bot_white, -/obj/item/reagent_containers/condiment/rice, -/turf/open/floor/iron/white/side, -/area/station/service/kitchen) +"cFh" = ( +/obj/machinery/modular_computer/preset/engineering{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/engine_smes) "cFn" = ( /obj/structure/table/wood, /obj/item/storage/photo_album{ @@ -11723,6 +10827,14 @@ /obj/item/clothing/mask/cigarette/cigar/cohiba, /turf/open/floor/wood, /area/station/command/meeting_room) +"cFP" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 10 + }, +/obj/machinery/newscaster/directional/south, +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/iron, +/area/station/engineering/break_room) "cFQ" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/disposal/bin, @@ -11731,6 +10843,24 @@ }, /turf/open/floor/iron/dark, /area/station/science/xenobiology) +"cFS" = ( +/obj/structure/railing, +/obj/effect/turf_decal/trimline/tram/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/tram/filled/warning{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) +"cFV" = ( +/obj/structure/rack, +/obj/effect/spawner/random/techstorage/engineering_all, +/obj/effect/turf_decal/trimline/white/filled/line, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "cFW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -11771,6 +10901,15 @@ }, /turf/open/floor/iron, /area/station/science/robotics/mechbay) +"cGN" = ( +/obj/structure/table/wood, +/obj/item/pai_card{ + 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" + }, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/carpet, +/area/station/command/meeting_room) "cGU" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/sign/departments/medbay/alt{ @@ -12004,15 +11143,6 @@ /obj/item/weldingtool, /turf/open/floor/iron/smooth, /area/station/maintenance/port/central) -"cLp" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Civilian - Dormitories South-East" - }, -/turf/open/floor/iron, -/area/station/commons/dorms) "cLs" = ( /obj/effect/turf_decal/siding/thinplating, /obj/structure/disposalpipe/segment{ @@ -12048,6 +11178,14 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) +"cMB" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) "cNc" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 4 @@ -12057,21 +11195,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) -"cNd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Maintenance - East Tram Tunnel 3"; - dir = 9 - }, -/obj/effect/turf_decal/siding/thinplating, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/white/warning, -/turf/open/floor/iron, -/area/station/maintenance/tram/right) "cNg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12148,6 +11271,13 @@ }, /turf/open/floor/iron/white, /area/station/science/genetics) +"cOc" = ( +/obj/machinery/porta_turret/ai{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai) "cOe" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/yellow/warning{ @@ -12182,15 +11312,32 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"cOs" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, -/obj/structure/disposalpipe/segment{ +"cOC" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/left) +/obj/machinery/camera/directional/east{ + c_tag = "Civilian - Dormitories South-East" + }, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron, +/area/station/commons/dorms) +"cOE" = ( +/obj/item/radio/intercom/directional/west{ + pixel_y = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/arrow_cw{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/dark_blue/corner, +/obj/structure/railing/corner, +/obj/machinery/light/small/directional/west, +/obj/machinery/flasher/directional/west{ + pixel_x = -24; + pixel_y = -8 + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hop) "cOF" = ( /obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ dir = 8; @@ -12256,6 +11403,24 @@ /obj/effect/turf_decal/trimline/purple/filled/corner, /turf/open/floor/iron/dark, /area/station/science/lower) +"cPH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"cPI" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Hallway - Port Tram Platform South"; + pixel_y = -23 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/noslip/tram, +/area/station/hallway/primary/tram/left) "cPK" = ( /obj/structure/bed{ dir = 4 @@ -12271,6 +11436,12 @@ "cPM" = ( /turf/closed/wall, /area/station/engineering/atmos) +"cPS" = ( +/obj/effect/turf_decal/sand/plating, +/obj/item/stack/ore/glass, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/station/engineering/main) "cQb" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/transit_tube, @@ -12357,16 +11528,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/atmospherics_engine) -"cRs" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/firealarm/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/main) "cRu" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -12404,16 +11565,6 @@ /obj/machinery/light/directional/north, /turf/open/misc/asteroid, /area/station/security/prison/workout) -"cRT" = ( -/obj/machinery/camera{ - c_tag = "Security - Detective's Office"; - dir = 9; - network = list("ss13","Security") - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) "cRW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -12434,10 +11585,12 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"cSe" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +"cSh" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/captain/private) "cSj" = ( /obj/effect/turf_decal/delivery, /obj/structure/disposalpipe/segment{ @@ -12473,6 +11626,14 @@ "cSr" = ( /turf/closed/wall, /area/station/service/library) +"cSC" = ( +/obj/machinery/modular_computer/preset/id{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/cafeteria, +/area/station/command/heads_quarters/rd) "cSR" = ( /obj/structure/table, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -12493,6 +11654,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison/garden) +"cTl" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"cTw" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/freezer, +/area/station/medical/coldroom) "cTM" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -12508,8 +11682,8 @@ dir = 1 }, /obj/machinery/door/window/elevator/left/directional/south{ - elevator_mode = 1; - elevator_linked_id = "tram_perma_lift" + elevator_linked_id = "tram_perma_lift"; + elevator_mode = 1 }, /turf/open/floor/iron, /area/station/security/brig) @@ -12540,6 +11714,32 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/main) +"cUL" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"cVd" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/freezer, +/area/station/security/prison/shower) +"cVk" = ( +/obj/effect/turf_decal/box, +/obj/machinery/shower/directional/east, +/obj/structure/fluff{ + desc = "Ew, I think I see a hairball."; + icon = 'icons/obj/mining_zones/survival_pod.dmi'; + icon_state = "fan_tiny"; + name = "shower drain" + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "cVl" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -12575,6 +11775,16 @@ }, /turf/open/floor/iron/kitchen_coldroom, /area/station/service/kitchen/coldroom) +"cVw" = ( +/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/opposingcorners{ + dir = 1 + }, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) "cVz" = ( /obj/effect/landmark/start/hangover, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -12603,23 +11813,6 @@ "cVW" = ( /turf/open/floor/engine, /area/station/science/auxlab/firing_range) -"cVX" = ( -/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 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "cWj" = ( /obj/structure/railing{ dir = 1 @@ -12643,13 +11836,6 @@ dir = 9 }, /area/station/service/chapel) -"cWx" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "cWF" = ( /turf/closed/wall, /area/station/security/execution/transfer) @@ -12660,19 +11846,6 @@ /obj/item/clothing/shoes/clown_shoes, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) -"cWV" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/structure/cable, -/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/dark, -/area/station/security/courtroom/holding) "cWZ" = ( /turf/closed/wall, /area/station/service/bar/backroom) @@ -12729,6 +11902,16 @@ }, /turf/open/floor/iron, /area/station/science/ordnance/storage) +"cXX" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/warning{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/right) "cYi" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 8 @@ -12765,8 +11948,8 @@ /obj/effect/turf_decal/stripes/white/line, /obj/effect/turf_decal/tile/neutral/tram, /turf/open/floor/noslip/tram_plate/energized{ - outbound = 2; - inbound = 1 + inbound = 1; + outbound = 2 }, /area/station/hallway/primary/tram/center) "cYx" = ( @@ -12834,43 +12017,41 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/checker, /area/station/service/kitchen) -"cZo" = ( -/obj/structure/sign/collision_counter{ - pixel_x = -4; - pixel_y = 2 - }, -/turf/closed/wall, -/area/station/medical/medbay/lobby) "cZz" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/iron/textured_large, /area/station/security/execution/education) -"cZE" = ( -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "cZH" = ( /obj/effect/turf_decal/trimline/purple/filled/corner, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"cZN" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/sign/warning/directional/north{ + desc = "A sign warning you to be cautious of falling packages."; + name = "FALLING HAZARD sign" + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/station/engineering/atmos) "cZT" = ( /obj/structure/alien/weeds, /obj/item/clothing/mask/facehugger/dead, /turf/open/misc/asteroid/airless, /area/station/asteroid) -"dab" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 +"cZY" = ( +/obj/machinery/computer/security/mining{ + dir = 8 }, -/obj/machinery/firealarm/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "dai" = ( /obj/structure/chair/sofa/corp/corner{ dir = 4 @@ -12912,32 +12093,6 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"daM" = ( -/obj/structure/sign/directions/supply{ - dir = 4; - pixel_y = 28 - }, -/obj/structure/sign/directions/security{ - dir = 8; - pixel_y = 34 - }, -/obj/structure/sign/directions/command{ - dir = 8; - pixel_y = 40 - }, -/obj/machinery/light/directional/north, -/obj/structure/sign/directions/vault{ - dir = 8; - pixel_y = 22 - }, -/obj/effect/turf_decal/trimline/tram/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/tram/filled/warning{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "daQ" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -12953,6 +12108,12 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"dbo" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/storage/toolbox/drone, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "dbr" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -12966,8 +12127,8 @@ /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 }, -/obj/structure/bed{ - dir = 4 +/obj/structure/bed/medical/anchored{ + dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -13048,6 +12209,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/cargo) +"dcP" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/smooth, +/area/station/maintenance/disposal) "ddf" = ( /obj/effect/landmark/start/cook, /turf/open/floor/iron/white/side{ @@ -13058,13 +12225,22 @@ /obj/structure/railing/corner, /turf/open/floor/glass, /area/station/commons/fitness/recreation) -"ddz" = ( -/obj/machinery/modular_computer/console/preset/cargochat/service{ - dir = 1 +"ddk" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Civilian - Library South" }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) +/turf/open/floor/carpet, +/area/station/service/library) +"ddn" = ( +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"dds" = ( +/obj/machinery/computer/slot_machine{ + pixel_y = 2 + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/dark, +/area/station/commons/lounge) "ddM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -13128,17 +12304,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/cargo/drone_bay) -"deK" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/obj/structure/closet/secure_closet/brig{ - id = "medcell"; - name = "Medical Cell Locker" - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/station/security/checkpoint/science) "deQ" = ( /obj/structure/ladder, /obj/effect/turf_decal/stripes/box, @@ -13155,6 +12320,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/commons/dorms) +"dfj" = ( +/obj/structure/closet/emcloset, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/smooth, +/area/station/hallway/primary/tram/right) "dfw" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/neutral/filled/line, @@ -13192,6 +12362,14 @@ }, /turf/open/floor/iron, /area/station/command/teleporter) +"dgc" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/railing/corner, +/turf/open/space/basic, +/area/space/nearstation) "dgd" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -13252,10 +12430,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"dgR" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/engine, -/area/station/science/xenobiology) "dgV" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/mix_input{ dir = 8 @@ -13275,6 +12449,14 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/medical/virology) +"dhI" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Hallway - Central Tram Platform South"; + pixel_y = -23 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/noslip/tram, +/area/station/hallway/primary/tram/center) "dhL" = ( /turf/closed/wall, /area/station/security/prison/work) @@ -13296,16 +12478,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"diq" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "diy" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -13357,26 +12529,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/cargo/miningdock) -"djJ" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/bed/roller, -/obj/machinery/light/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Medical - Lobby"; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/bot, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"djL" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +"dka" = ( +/obj/structure/chair/sofa/right{ + dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/left) +/obj/machinery/light/warm/directional/south, +/turf/open/floor/iron/cafeteria, +/area/station/science/breakroom) "dkf" = ( /obj/effect/turf_decal/trimline/brown/filled/corner, /obj/effect/turf_decal/trimline/brown/filled/corner{ @@ -13396,6 +12555,14 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat_interior) +"dkl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/storage/toolbox/emergency, +/obj/item/crowbar, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/station/maintenance/port/central) "dkm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall, @@ -13468,6 +12635,13 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/commons/fitness/recreation) +"dml" = ( +/obj/structure/closet/lasertag/red, +/obj/effect/landmark/start/hangover/closet, +/obj/structure/sign/poster/official/random/directional/east, +/obj/effect/turf_decal/tile/red/full, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/fitness/recreation/entertainment) "dmx" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ @@ -13550,20 +12724,6 @@ /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/plating, /area/station/hallway/primary/tram/center) -"dnD" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/machinery/firealarm/directional/east, -/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/medical/pharmacy) "dnE" = ( /obj/machinery/telecomms/server/presets/service, /turf/open/floor/iron/dark/telecomms, @@ -13577,19 +12737,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"dnQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/obj/item/radio/intercom/directional/south{ - freerange = 1; - frequency = 1447; - listening = 0; - name = "Private Channel" - }, -/turf/open/floor/iron/grimy, -/area/station/ai_monitored/turret_protected/aisat/foyer) "doa" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /obj/effect/spawner/structure/window/reinforced, @@ -13618,6 +12765,14 @@ /obj/effect/mapping_helpers/mail_sorting/science/research, /turf/open/floor/iron/white, /area/station/science/lab) +"doF" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron, +/area/station/security/office) "doH" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 1 @@ -13676,10 +12831,14 @@ /obj/machinery/holopad, /turf/open/floor/iron/grimy, /area/station/hallway/secondary/entry) -"dpU" = ( +"dpN" = ( /obj/structure/cable, -/turf/open/floor/wood, -/area/station/service/theater) +/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/light/small/dim/directional/north, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/greater) "dqe" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 @@ -13703,6 +12862,12 @@ }, /turf/open/floor/iron/grimy, /area/station/service/library/lounge) +"dqK" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) "dqW" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -13718,17 +12883,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/courtroom/holding) -"drl" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/light/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, -/area/station/hallway/secondary/exit/departure_lounge) "drq" = ( /obj/structure/table, /obj/item/flashlight/lamp, @@ -13789,6 +12943,15 @@ /obj/machinery/telecomms/hub/preset, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) +"drW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/left) "dsl" = ( /obj/structure/chair/pew/right, /obj/effect/landmark/start/assistant, @@ -13801,6 +12964,20 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"dsw" = ( +/obj/machinery/modular_computer/preset/id{ + dir = 8 + }, +/obj/machinery/keycard_auth/directional/north, +/obj/machinery/button/door/directional/north{ + id = "cmoshutter"; + name = "CMO Privacy Shutters"; + pixel_y = 38; + req_access = list("cmo") + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/cmo) "dsF" = ( /turf/open/floor/iron/smooth, /area/station/command/gateway) @@ -13811,15 +12988,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"dsN" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 10 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) "dsP" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 4 @@ -13875,6 +13043,14 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white/side, /area/station/science/lobby) +"dtY" = ( +/obj/structure/industrial_lift/tram, +/obj/structure/window/reinforced/tram/directional/south, +/obj/structure/chair/sofa/bench/tram/right{ + dir = 4 + }, +/turf/open/openspace, +/area/station/hallway/primary/tram/center) "dur" = ( /obj/structure/chair{ dir = 1 @@ -13984,24 +13160,10 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"dwp" = ( -/obj/machinery/light/directional/north, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/flora/bush/grassy/style_random, -/turf/open/floor/grass, -/area/station/commons/dorms) "dww" = ( /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) -"dwy" = ( -/obj/machinery/light/blacklight/directional/south, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/eighties, -/area/station/commons/fitness/recreation/entertainment) "dwA" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 5 @@ -14041,6 +13203,22 @@ /obj/machinery/oven/range, /turf/open/floor/iron/white, /area/station/commons/vacant_room) +"dyb" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"dyf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/wood, +/area/station/service/theater) "dyl" = ( /obj/structure/flora/bush/leavy/style_random, /turf/open/floor/grass, @@ -14078,6 +13256,16 @@ /obj/effect/turf_decal/trimline/yellow/corner, /turf/open/floor/iron/dark, /area/station/service/hydroponics) +"dyD" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Civilian - Skill Games" + }, +/obj/effect/turf_decal/trimline/dark_green/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/corner, +/turf/open/floor/iron/dark, +/area/station/commons/lounge) "dyE" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -14088,10 +13276,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"dyH" = ( -/obj/structure/table/reinforced, -/turf/open/floor/iron, -/area/station/command/bridge) "dyI" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -14153,6 +13337,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/commons/fitness) +"dzY" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/showroomfloor, +/area/station/security/warden) "dAl" = ( /obj/machinery/computer/shuttle/mining{ dir = 8; @@ -14171,6 +13362,23 @@ /obj/structure/lattice/catwalk, /turf/open/space/openspace, /area/space/nearstation) +"dAx" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/item/radio/intercom/directional/west, +/obj/machinery/modular_computer/preset/id{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/qm) +"dAL" = ( +/obj/structure/closet/crate/silvercrate, +/obj/effect/turf_decal/bot_white/right, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) "dAR" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/bot, @@ -14216,6 +13424,21 @@ /obj/machinery/destination_sign/indicator, /turf/closed/wall, /area/station/hallway/primary/tram/right) +"dCk" = ( +/obj/structure/table/wood, +/obj/machinery/recharger{ + pixel_x = 5 + }, +/obj/item/paper_bin{ + pixel_x = -5; + pixel_y = 4 + }, +/obj/item/pen{ + pixel_x = -4 + }, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "dCq" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -14230,18 +13453,6 @@ }, /turf/open/floor/plating, /area/station/command/heads_quarters/rd) -"dCr" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Security - Rec Room West"; - network = list("ss13","Security","prison") - }, -/turf/open/floor/iron, -/area/station/security/prison/workout) "dCD" = ( /obj/structure/bookcase/random/reference, /turf/open/floor/wood/large, @@ -14252,14 +13463,23 @@ dir = 1 }, /obj/item/radio/intercom/directional/north, -/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/item/surgery_tray/full, /turf/open/floor/iron/white, /area/station/medical/surgery/aft) -"dDe" = ( -/obj/machinery/holopad, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/grimy, -/area/station/service/library/lounge) +"dCG" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 6 + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"dCU" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/security/prison) "dDi" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 4 @@ -14297,10 +13517,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/security/courtroom) -"dDZ" = ( -/obj/structure/filingcabinet/chestdrawer, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "dEc" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -14331,26 +13547,6 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/disposal) -"dEn" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/light/small/directional/north, -/obj/machinery/button/door/directional/north{ - id = "trammaintdock"; - name = "Tram Maintenance Dock Access"; - pixel_x = -8 - }, -/obj/effect/turf_decal/siding/thinplating, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/white/warning, -/turf/open/floor/iron, -/area/station/maintenance/tram/left) "dEv" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/security/armory) @@ -14366,6 +13562,32 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) +"dER" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/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/security/brig) +"dEU" = ( +/obj/structure/table/wood, +/obj/item/disk/data{ + pixel_x = 9; + pixel_y = -1 + }, +/obj/item/disk/design_disk{ + name = "component design disk"; + pixel_y = 6 + }, +/obj/item/disk/tech_disk{ + pixel_x = -2; + pixel_y = -3 + }, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/carpet, +/area/station/command/meeting_room) "dFc" = ( /obj/structure/table/wood/fancy/royalblue, /obj/structure/sign/painting/library_secure{ @@ -14386,10 +13608,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"dFC" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/engine, -/area/station/science/xenobiology) "dFI" = ( /obj/structure/table/wood, /obj/item/storage/box/seccarts{ @@ -14429,14 +13647,6 @@ }, /turf/open/floor/plating/elevatorshaft, /area/station/maintenance/tram/left) -"dFY" = ( -/obj/structure/sign/poster/official/here_for_your_safety/directional/south, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "dGh" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Tunnel Access Hatch" @@ -14461,6 +13671,19 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"dGn" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/light/dim/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/evidence) "dGs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, @@ -14471,13 +13694,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel/monastery) -"dGK" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 5 - }, -/obj/machinery/space_heater, -/turf/open/floor/iron, -/area/station/engineering/atmos) "dHc" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/table, @@ -14490,17 +13706,6 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"dHn" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/machinery/status_display/ai/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/brig) "dHr" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner, /obj/effect/turf_decal/trimline/yellow/filled/corner{ @@ -14534,6 +13739,17 @@ }, /turf/open/floor/plating/elevatorshaft, /area/station/security/execution/transfer) +"dHF" = ( +/obj/machinery/camera{ + c_tag = "Arrivals - Lounge"; + dir = 6 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/turf/open/floor/iron/grimy, +/area/station/hallway/secondary/entry) "dHO" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -14543,15 +13759,6 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/supply) -"dIa" = ( -/obj/structure/closet/secure_closet/captains, -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Command - Captain's Quarters" - }, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) "dIn" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 4 @@ -14624,6 +13831,13 @@ }, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) +"dJm" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/light/red/directional/west, +/turf/open/floor/iron/dark, +/area/station/maintenance/radshelter/civil) "dJp" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -14663,14 +13877,22 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) -"dJS" = ( -/obj/structure/bed, +"dJV" = ( +/obj/machinery/gulag_item_reclaimer{ + pixel_x = 32 + }, /obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 + dir = 5 }, -/obj/effect/landmark/start/prisoner, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/light/directional/east, /turf/open/floor/iron, -/area/station/security/prison/safe) +/area/station/security/processing) "dKv" = ( /obj/machinery/camera/emp_proof{ c_tag = "Engineering - Atmospherics Mixing Chamber"; @@ -14778,6 +14000,13 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) +"dMv" = ( +/obj/machinery/power/smes, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/dim/directional/south, +/turf/open/floor/catwalk_floor, +/area/station/solars/port) "dME" = ( /turf/closed/wall, /area/station/service/theater) @@ -14788,6 +14017,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"dNa" = ( +/obj/machinery/bookbinder, +/obj/machinery/newscaster/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Civilian - Library North" + }, +/turf/open/floor/wood/large, +/area/station/service/library) "dNi" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 6 @@ -14871,12 +14108,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) -"dOn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/ladder, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/smooth, -/area/station/maintenance/tram/right) "dOq" = ( /obj/structure/table/glass, /obj/machinery/reagentgrinder{ @@ -14981,20 +14212,6 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"dPS" = ( -/obj/machinery/modular_computer/console/preset/id{ - dir = 8 - }, -/obj/machinery/keycard_auth/directional/north, -/obj/machinery/button/door/directional/north{ - id = "cmoshutter"; - name = "CMO Privacy Shutters"; - pixel_y = 38; - req_access = list("cmo") - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/cmo) "dPT" = ( /obj/structure/table/wood, /obj/item/radio/intercom/directional/north, @@ -15040,14 +14257,6 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"dQt" = ( -/obj/effect/spawner/random/structure{ - loot = list(/obj/structure/statue/snow/snowman); - name = "random snowman spawner"; - spawn_loot_chance = 10 - }, -/turf/open/misc/asteroid/snow/coldroom, -/area/station/service/kitchen/coldroom) "dQw" = ( /obj/structure/rack, /obj/item/clothing/shoes/magboots{ @@ -15110,6 +14319,13 @@ }, /turf/open/floor/cult, /area/station/service/chapel/office) +"dRa" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/freezer, +/area/station/security/prison/shower) "dRu" = ( /obj/effect/turf_decal/sand/plating, /obj/machinery/door/airlock/external, @@ -15156,6 +14372,13 @@ }, /turf/open/floor/engine, /area/station/science/auxlab/firing_range) +"dSI" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) "dSM" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 10 @@ -15194,6 +14417,19 @@ /obj/effect/turf_decal/stripes/white/full, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"dTx" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/tram/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/tram/filled/warning{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "dTE" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -15207,6 +14443,20 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"dTS" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + 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/structure/cable, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron, +/area/station/tcommsat/computer) "dTZ" = ( /obj/machinery/door/airlock/medical/glass{ name = "Medbay Storage" @@ -15269,6 +14519,13 @@ "dUT" = ( /turf/closed/wall, /area/station/science/lower) +"dVj" = ( +/obj/structure/table/glass, +/obj/machinery/reagentgrinder, +/obj/structure/sign/clock/directional/west, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) "dVo" = ( /obj/structure/table/wood, /turf/open/floor/iron/dark, @@ -15442,26 +14699,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"dYn" = ( -/obj/structure/table, -/obj/item/stack/cable_coil{ - pixel_x = 2; - pixel_y = -2 - }, -/obj/item/stack/cable_coil{ - pixel_x = 3; - pixel_y = -7 - }, -/obj/item/screwdriver{ - pixel_y = 16 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/machinery/firealarm/directional/west, -/obj/item/storage/belt/utility, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "dYv" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, @@ -15546,6 +14783,28 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) +"eaU" = ( +/obj/structure/window/spawner/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/structure/rack, +/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/machinery/status_display/ai/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Secure - Teleporter" + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/dark, +/area/station/command/teleporter) "eaZ" = ( /obj/structure/rack, /obj/item/storage/toolbox/mechanical{ @@ -15559,16 +14818,6 @@ /obj/structure/sign/clock/directional/east, /turf/open/floor/iron, /area/station/commons/storage/primary) -"ebe" = ( -/obj/structure/sink{ - pixel_y = 15 - }, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 5 - }, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics) "ebq" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 @@ -15594,6 +14843,12 @@ }, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) +"ebY" = ( +/obj/structure/ladder, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/iron/smooth, +/area/station/hallway/primary/tram/right) "ecg" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -15603,16 +14858,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/xenobiology) -"ecn" = ( -/obj/structure/table/glass, -/obj/item/stack/medical/gauze, -/obj/item/stack/medical/suture, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/obj/machinery/status_display/ai/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "eco" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -15651,6 +14896,19 @@ /obj/item/holosign_creator/robot_seat/bar, /turf/open/floor/wood, /area/station/service/bar/backroom) +"ecV" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 6 + }, +/obj/machinery/firealarm/directional/east{ + pixel_y = 4 + }, +/obj/machinery/light_switch/directional/east{ + pixel_x = 24; + pixel_y = -8 + }, +/turf/open/floor/iron, +/area/station/science/robotics/lab) "ecW" = ( /obj/structure/table/glass, /obj/machinery/cell_charger, @@ -15658,12 +14916,29 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"ecX" = ( +/obj/structure/ladder, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/smooth, +/area/station/maintenance/tram/mid) "edg" = ( /obj/machinery/duct, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) +"edu" = ( +/obj/machinery/seed_extractor, +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/light_switch/directional/north{ + pixel_x = -8; + pixel_y = 23 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) "edx" = ( /obj/effect/turf_decal/stripes/box, /obj/structure/ladder, @@ -15680,13 +14955,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"edK" = ( -/obj/structure/table/wood, -/obj/machinery/light/small/directional/south, -/turf/open/floor/wood/parquet, -/area/station/service/library) "edP" = ( -/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/ordnance) "eep" = ( @@ -15699,19 +14969,6 @@ dir = 9 }, /area/station/service/chapel) -"eew" = ( -/obj/machinery/light_switch/directional/south, -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/machinery/light/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Security - Main Office South"; - network = list("ss13","Security") - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/office) "eeE" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -15734,6 +14991,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit) +"eeP" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron, +/area/station/commons/dorms) "efB" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 @@ -15742,15 +15006,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/checkpoint/science) -"efV" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/obj/structure/sign/clock/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/security/checkpoint/medical) "egb" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -15842,14 +15097,6 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"ehM" = ( -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/machinery/light/directional/south, -/obj/machinery/firealarm/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/cargo/miningdock) "ehS" = ( /obj/effect/turf_decal/trimline/white/line{ dir = 1 @@ -15858,12 +15105,6 @@ /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"ehV" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Hallway - Port Tram Platform North" - }, -/turf/open/floor/noslip/tram, -/area/station/hallway/primary/tram/left) "eiR" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -15949,13 +15190,6 @@ }, /turf/open/floor/iron/checker, /area/station/service/kitchen) -"ejO" = ( -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/freezer, -/area/station/security/prison/shower) "ejR" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ @@ -16007,16 +15241,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison/work) -"ekj" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "ekB" = ( /turf/closed/wall, /area/station/service/janitor) @@ -16038,15 +15262,13 @@ /obj/structure/plasticflaps, /turf/open/floor/plating, /area/station/cargo/storage) -"ekN" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 9 +"ekQ" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 }, -/obj/structure/table, -/obj/item/phone, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/dark, -/area/station/science/lower) +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/cargo/storage) "ekU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/checker, @@ -16065,33 +15287,11 @@ "elr" = ( /turf/closed/wall, /area/station/commons/dorms) -"els" = ( -/obj/structure/closet/lasertag/blue, -/obj/effect/landmark/start/hangover/closet, -/obj/machinery/light/blacklight/directional/east, -/obj/structure/sign/poster/official/random/directional/east, -/obj/effect/turf_decal/tile/blue/full, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/fitness/recreation/entertainment) "elB" = ( /obj/effect/turf_decal/bot, /obj/structure/rack, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) -"elG" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Civilian - Recreational Area West" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "elM" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/blue/opposingcorners, @@ -16154,17 +15354,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/disposal) -"eng" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 10 - }, -/obj/structure/ore_box, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/warehouse) "enj" = ( /obj/structure/weightmachine/weightlifter, /obj/effect/turf_decal/sand, @@ -16202,19 +15391,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"enV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/small/directional/east, -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/pen, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/vacant_room/commissary) "eor" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 8 @@ -16295,32 +15471,10 @@ }, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) -"epT" = ( -/obj/effect/turf_decal/stripes/end{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/ai_monitored/security/armory) "eqi" = ( /obj/effect/landmark/navigate_destination/tcomms, /turf/open/floor/iron, /area/station/tcommsat/computer) -"eqq" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"equ" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 10 - }, -/obj/machinery/newscaster/directional/south, -/obj/structure/reagent_dispensers/water_cooler, -/obj/structure/sign/delamination_counter/directional/west, -/turf/open/floor/iron, -/area/station/engineering/break_room) "eqJ" = ( /obj/structure/cable/layer1, /obj/structure/cable, @@ -16364,20 +15518,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/atmospherics_engine) -"erb" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/light_switch/directional/north, -/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, -/turf/open/floor/iron, -/area/station/tcommsat/computer) "ers" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -16399,6 +15539,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/science/lower) +"erx" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Hallway - Upper Right Command"; + dir = 10 + }, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) "erO" = ( /obj/machinery/holopad, /obj/structure/disposalpipe/segment{ @@ -16429,6 +15580,20 @@ /mob/living/simple_animal/bot/cleanbot, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"esr" = ( +/obj/machinery/netpod, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/bitrunning/den) +"esA" = ( +/obj/machinery/iv_drip, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "esC" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/machinery/disposal/bin, @@ -16498,10 +15663,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"etC" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "etG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -16523,12 +15684,6 @@ }, /turf/open/floor/glass/reinforced, /area/station/security/warden) -"etQ" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/machinery/light/directional/south, -/obj/structure/sign/clock/directional/south, -/turf/open/floor/iron/dark, -/area/station/security/courtroom/holding) "euC" = ( /turf/open/floor/wood/parquet, /area/station/medical/psychology) @@ -16547,18 +15702,8 @@ /turf/open/floor/wood, /area/station/service/theater) "euR" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=2"; - location = "QM #3" - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #3"; - suffix = "#3" - }, -/turf/open/floor/iron, -/area/station/cargo/storage) +/turf/closed/wall, +/area/station/bitrunning/den) "euS" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -16571,26 +15716,18 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"euZ" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 +"evd" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 }, -/obj/effect/turf_decal/trimline/green/corner{ +/obj/machinery/camera/directional/north{ + c_tag = "Science - AI Station Access" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/obj/machinery/light/directional/east, -/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, -/area/station/hallway/secondary/service) -"evh" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/captain/private) +/area/station/science/lower) "evq" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 9 @@ -16626,21 +15763,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/large, /area/station/service/theater) -"ewk" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/obj/structure/table/glass, -/obj/item/book/manual/wiki/infections{ - pixel_y = 7 - }, -/obj/item/reagent_containers/dropper, -/obj/item/reagent_containers/spray/cleaner, -/obj/item/reagent_containers/syringe/antiviral, -/obj/machinery/light/directional/west, -/obj/machinery/status_display/ai/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/virology) +"ewh" = ( +/obj/structure/ladder, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/smooth, +/area/station/maintenance/tram/left) "ewo" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -16652,6 +15779,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/prison) +"ewt" = ( +/obj/machinery/chem_heater/withbuffer, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "ewK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -16729,6 +15862,45 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"exT" = ( +/obj/structure/table, +/obj/item/radio{ + pixel_x = -6; + pixel_y = -3 + }, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = 9; + pixel_y = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/obj/machinery/firealarm/directional/west{ + pixel_y = 5 + }, +/obj/machinery/light_switch/directional/west{ + pixel_x = -22; + pixel_y = -9 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/medical) +"exV" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/structure/flora/bush/grassy/style_random, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/grass, +/area/station/commons/dorms) +"exZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/yellow/warning, +/obj/item/screwdriver, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/port/central) "eye" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -16749,6 +15921,12 @@ /obj/effect/turf_decal/trimline/white/warning, /turf/open/floor/iron, /area/station/maintenance/tram/left) +"eyg" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/freezer, +/area/station/medical/coldroom) "eyy" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -16817,6 +15995,11 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) +"ezh" = ( +/obj/structure/table/wood, +/obj/machinery/light/small/blacklight/directional/south, +/turf/open/floor/wood/parquet, +/area/station/service/library) "ezL" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -16850,26 +16033,6 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"eAr" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) -"eAz" = ( -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 8 - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel) -"eAD" = ( -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "eAE" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -16886,18 +16049,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron, /area/station/engineering/atmos) -"eAS" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/tram/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/tram/filled/warning{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/right) "eAX" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -16961,15 +16112,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/security/prison) -"eBz" = ( -/obj/structure/bed, -/obj/effect/spawner/random/contraband/prison, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/effect/landmark/start/prisoner, -/turf/open/floor/iron, -/area/station/security/prison/safe) "eBF" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -16977,6 +16119,17 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/cargo/lobby) +"eBI" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/obj/machinery/camera{ + c_tag = "Security - Prison Main South-East"; + dir = 6; + network = list("ss13","Security","prison") + }, +/turf/open/floor/iron, +/area/station/security/prison) "eCk" = ( /obj/machinery/door/airlock/public/glass{ name = "Library" @@ -17028,13 +16181,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/warehouse) -"eCQ" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/light/directional/south, -/obj/structure/closet/masks, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/iron, -/area/station/commons/fitness) "eCR" = ( /obj/machinery/door/airlock{ id_tag = "private_h"; @@ -17064,18 +16210,6 @@ /obj/structure/table, /turf/open/floor/iron, /area/station/commons/dorms) -"eDH" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/tram/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/tram/filled/warning{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/left) "eDV" = ( /obj/structure/closet/secure_closet/freezer/cream_pie, /obj/effect/turf_decal/tile/red/opposingcorners, @@ -17084,16 +16218,6 @@ }, /turf/open/floor/iron, /area/station/service/theater) -"eDZ" = ( -/obj/machinery/light_switch/directional/east{ - pixel_x = 21; - pixel_y = 8 - }, -/obj/machinery/firealarm/directional/east{ - pixel_y = -5 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) "eEl" = ( /obj/machinery/meter/monitored/distro_loop, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, @@ -17137,21 +16261,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"eFk" = ( -/obj/machinery/bluespace_beacon, -/obj/effect/turf_decal/trimline/yellow/filled/warning, -/obj/structure/cable, -/obj/effect/landmark/navigate_destination/teleporter, -/turf/open/floor/iron, -/area/station/command/teleporter) -"eFo" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/structure/table, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "eFs" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, @@ -17193,12 +16302,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/atmospherics_engine) -"eGk" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "eGl" = ( /obj/structure/table/wood, /obj/item/flashlight/lantern{ @@ -17217,6 +16320,15 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"eGU" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=1"; + location = "QM #4" + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "eHj" = ( /obj/machinery/vending/tool, /obj/machinery/airalarm/directional/east, @@ -17243,11 +16355,6 @@ /obj/structure/sign/poster/official/cleanliness/directional/west, /turf/open/floor/iron/freezer, /area/station/security/prison/shower) -"eHN" = ( -/obj/structure/closet/secure_closet/chemical, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) "eHR" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -17267,18 +16374,40 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/r_wall, /area/station/engineering/supermatter) +"eIA" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/newscaster/directional/south, +/obj/machinery/fax{ + fax_name = "Psychology Office"; + name = "Psychology Office Fax Machine" + }, +/turf/open/floor/wood/parquet, +/area/station/medical/psychology) "eIM" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrogen_input{ dir = 1 }, /turf/open/floor/engine/n2, /area/station/engineering/atmos) -"eIR" = ( -/obj/effect/turf_decal/stripes/corner{ +"eIS" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/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, +/obj/structure/cable, +/obj/machinery/light_switch/directional/east{ + pixel_x = 22; + pixel_y = -8 + }, /turf/open/floor/iron, -/area/station/ai_monitored/security/armory) +/area/station/security/checkpoint/escape) "eIZ" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ dir = 9 @@ -17289,10 +16418,14 @@ /obj/structure/sign/calendar/directional/south, /turf/open/floor/wood/large, /area/station/service/library) -"eJA" = ( -/obj/machinery/light/very_dim/directional/south, -/turf/open/floor/iron/dark/herringbone, -/area/station/commons/vacant_room) +"eJG" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/spawner/random/armory/riot_armor, +/obj/effect/spawner/random/armory/riot_helmet, +/obj/effect/spawner/random/armory/riot_shield, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "eJQ" = ( /turf/open/floor/glass/reinforced, /area/station/science/xenobiology) @@ -17371,13 +16504,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/atmos) -"eME" = ( -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/freezer, -/area/station/security/prison/shower) "eMF" = ( /obj/structure/chair/office{ dir = 4 @@ -17478,17 +16604,6 @@ "eOk" = ( /turf/open/floor/glass, /area/station/cargo/storage) -"eOn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/white/warning, -/turf/open/floor/iron, -/area/station/maintenance/tram/left) "eOs" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/effect/turf_decal/trimline/neutral/filled/corner{ @@ -17531,14 +16646,29 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"eOU" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/engine/o2, -/area/station/engineering/atmos) +"eOP" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "eOZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply, /turf/closed/wall/r_wall, /area/station/science/ordnance/burnchamber) +"ePd" = ( +/obj/structure/sink{ + pixel_y = 15 + }, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 5 + }, +/obj/machinery/light_switch/directional/east{ + pixel_x = 23; + pixel_y = -8 + }, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics) "ePi" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, @@ -17547,7 +16677,7 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/incinerator_input{ dir = 1 }, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "ePw" = ( /obj/structure/filingcabinet, @@ -17558,14 +16688,21 @@ /obj/structure/sign/clock/directional/west, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) -"ePx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/right) "ePG" = ( /turf/closed/wall/r_wall, /area/station/science/auxlab/firing_range) +"ePS" = ( +/obj/machinery/shower/directional/west, +/obj/structure/fluff{ + desc = "What, you think the water just magically soaks into the metallic flooring?"; + icon = 'icons/obj/mining_zones/survival_pod.dmi'; + icon_state = "fan_tiny"; + name = "shower drain" + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/purple/fourcorners, +/turf/open/floor/iron/white, +/area/station/science/research) "eQm" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -17581,6 +16718,29 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"eQL" = ( +/obj/structure/sign/directions/evac{ + dir = 4; + pixel_y = 28 + }, +/obj/structure/sign/directions/medical{ + pixel_y = 34 + }, +/obj/structure/sign/directions/engineering{ + pixel_y = 40 + }, +/obj/structure/sign/directions/upload{ + dir = 4; + pixel_y = 22 + }, +/obj/effect/turf_decal/trimline/tram/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/tram/filled/warning{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "eQN" = ( /obj/effect/turf_decal/sand/plating, /obj/machinery/airalarm/directional/west, @@ -17627,23 +16787,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"eRn" = ( -/obj/structure/table/glass, -/obj/item/stack/medical/mesh, -/obj/item/stack/medical/gauze, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Medical - Treatment South-East"; - network = list("ss13","medbay") - }, -/obj/machinery/vending/wallmed/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "eRw" = ( /obj/machinery/hydroponics/soil, /obj/machinery/firealarm/directional/west, @@ -17652,6 +16795,17 @@ }, /turf/open/floor/iron/dark, /area/station/security/prison/garden) +"eRI" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/thinplating, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/white/warning, +/turf/open/floor/iron, +/area/station/maintenance/tram/mid) "eRQ" = ( /obj/machinery/camera{ c_tag = "Hallway - Starboard Tram Platform South-East"; @@ -17667,21 +16821,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) -"eRU" = ( -/obj/structure/table/wood, -/obj/machinery/firealarm/directional/north{ - pixel_x = -2 - }, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 8 - }, -/obj/machinery/light_switch/directional/north{ - pixel_x = 11; - pixel_y = 23 - }, -/turf/open/floor/carpet, -/area/station/service/chapel/monastery) "eSj" = ( /obj/structure/table, /obj/item/storage/box/firingpins, @@ -17702,6 +16841,10 @@ "eSx" = ( /turf/closed/wall, /area/station/service/kitchen) +"eSy" = ( +/obj/effect/landmark/tram/nav/immovable_rod, +/turf/open/floor/carpet, +/area/station/hallway/secondary/entry) "eSz" = ( /turf/open/openspace, /area/station/hallway/primary/tram/center) @@ -17747,6 +16890,20 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/security/courtroom) +"eTG" = ( +/obj/machinery/power/smes/engineering, +/obj/structure/sign/warning/electric_shock{ + pixel_x = -32 + }, +/obj/machinery/camera/emp_proof{ + c_tag = "Engineering - SMES"; + dir = 10; + network = list("ss13","engineering") + }, +/obj/structure/cable, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/engineering/engine_smes) "eTQ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -17878,6 +17035,11 @@ "eVz" = ( /turf/open/floor/grass, /area/station/service/hydroponics) +"eVC" = ( +/obj/effect/spawner/random/decoration/showcase, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/carpet/royalblack, +/area/station/command/meeting_room) "eVK" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -17915,6 +17077,22 @@ /obj/effect/turf_decal/trimline/white/warning, /turf/open/floor/iron, /area/station/maintenance/tram/left) +"eWr" = ( +/obj/machinery/shower/directional/north, +/turf/open/floor/iron/freezer, +/area/station/security/prison) +"eWx" = ( +/obj/machinery/duct, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/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/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "eWO" = ( /obj/machinery/door/airlock/engineering{ name = "Power Access Hatch" @@ -17930,10 +17108,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria, /area/station/security/prison) -"eXb" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) "eXB" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ @@ -18011,6 +17185,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"eYS" = ( +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/obj/machinery/camera/directional/south{ + c_tag = "Science - Front Lobby"; + network = list("ss13","rd") + }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/white, +/area/station/science/lobby) "eYZ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/yellow/corner, @@ -18025,6 +17212,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/port/central) +"eZO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/white/warning, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/tram/right) "eZS" = ( /obj/machinery/door/airlock/grunge{ name = "Entertainment Center" @@ -18107,14 +17306,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"fbx" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/hallway/secondary/exit/departure_lounge) -"fbH" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/carpet, -/area/station/cargo/miningdock) "fbR" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/trimline/yellow/filled/line, @@ -18182,26 +17373,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/port/central) -"fem" = ( -/obj/structure/rack, -/obj/effect/spawner/random/techstorage/engineering_all, -/obj/effect/turf_decal/trimline/white/filled/line, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"feo" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 9 - }, -/obj/structure/industrial_lift/public, -/obj/structure/railing{ - dir = 9 - }, -/obj/machinery/elevator_control_panel/directional/west{ - linked_elevator_id = "tram_sci_lift"; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/science/lower) "fez" = ( /obj/structure/chair{ dir = 8 @@ -18267,13 +17438,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"ffk" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/science/server) "ffE" = ( /obj/machinery/door/airlock{ id_tag = "Toilet1"; @@ -18339,6 +17503,13 @@ /obj/machinery/food_cart, /turf/open/floor/iron/kitchen_coldroom, /area/station/service/kitchen/coldroom) +"fhc" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Hallway - Central Tram Platform North" + }, +/obj/machinery/light/directional/west, +/turf/open/floor/noslip/tram, +/area/station/hallway/primary/tram/center) "fhg" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -18400,19 +17571,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) -"fhB" = ( -/obj/structure/toilet{ - dir = 1 - }, -/obj/machinery/light/small/directional/east, -/obj/machinery/button/door/directional/west{ - id = "Toilet5"; - name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet) "fhG" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 4 @@ -18487,12 +17645,19 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/science/lower) -"fiA" = ( -/obj/effect/decal/cleanable/dirt, +"fiP" = ( +/obj/structure/table, +/obj/item/storage/toolbox/electrical{ + pixel_x = -2; + pixel_y = 10 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 + }, /obj/machinery/light/directional/west, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/smooth, -/area/station/maintenance/disposal) +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) "fja" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -18552,34 +17717,24 @@ /obj/structure/grille, /turf/closed/wall/r_wall, /area/station/engineering/atmos) -"fkc" = ( -/obj/structure/safe, -/obj/item/clothing/head/costume/bearpelt, -/obj/item/gun/ballistic/revolver/russian, -/obj/item/ammo_box/a357, -/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) -"fkg" = ( -/obj/machinery/biogenerator, -/obj/effect/turf_decal/tile/green/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics) +"fke" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating{ + 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/light/cold/directional/east, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "fkh" = ( /obj/structure/sign/warning/docking, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/hallway/secondary/exit/departure_lounge) -"fkq" = ( -/obj/machinery/light/directional/south, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/machinery/modular_computer/console/preset/engineering{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "fkL" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -18591,6 +17746,15 @@ /obj/machinery/atmospherics/pipe/bridge_pipe/green/visible, /turf/open/floor/iron, /area/station/engineering/atmos) +"fkQ" = ( +/obj/structure/table/wood, +/obj/machinery/libraryscanner, +/obj/effect/turf_decal/siding/wood, +/obj/machinery/camera/directional/west{ + c_tag = "Civilian - Library West" + }, +/turf/open/floor/wood, +/area/station/service/library) "fkR" = ( /obj/machinery/chem_master, /obj/effect/turf_decal/tile/yellow/fourcorners, @@ -18728,22 +17892,12 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/hallway/primary/tram/center) -"fng" = ( -/turf/open/floor/grass, -/area/station/science/lower) "fni" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 }, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"fnl" = ( -/obj/machinery/light/directional/east, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/command/bridge) "fnu" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/north, @@ -18752,6 +17906,17 @@ dir = 8 }, /area/station/command/bridge) +"fnv" = ( +/obj/structure/table/wood, +/obj/machinery/firealarm/directional/south{ + pixel_x = 3 + }, +/obj/machinery/light_switch/directional/south{ + pixel_x = -8; + pixel_y = -23 + }, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) "fnz" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 10 @@ -18785,18 +17950,6 @@ /obj/structure/sign/warning/cold_temp/directional/south, /turf/open/floor/circuit/telecomms, /area/station/science/xenobiology) -"fog" = ( -/obj/machinery/vending/cigarette, -/obj/machinery/light/directional/north, -/obj/machinery/airalarm/directional/north, -/obj/machinery/camera{ - c_tag = "Cargo - Mining Break Room"; - dir = 9; - network = list("ss13","cargo") - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/miningdock/cafeteria) "foh" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white, @@ -18870,8 +18023,19 @@ /area/station/science/ordnance) "foU" = ( /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/cargo/storage) +"foV" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=1"; + location = "QM #5" + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "foY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -18992,14 +18156,30 @@ /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /turf/open/floor/plating, /area/station/engineering/atmos/pumproom) +"frB" = ( +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"frL" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/machinery/status_display/door_timer{ + id = "Isolation_C"; + name = "Isolation Cell C"; + pixel_y = 32 + }, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "frN" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/engineering/supermatter) "frT" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, -/turf/closed/wall/r_wall, -/area/station/maintenance/disposal/incinerator) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/closed/wall, +/area/station/science/ordnance) "frV" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance/testlab) @@ -19033,17 +18213,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/break_room) -"fsB" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "fsC" = ( /turf/closed/wall, /area/station/commons/fitness/recreation) @@ -19105,22 +18274,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/dorms) -"ftt" = ( -/obj/structure/table/glass, -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/spawner/random/food_or_drink/seed{ - spawn_all_loot = 1; - spawn_random_offset = 1 - }, -/obj/machinery/light_switch/directional/north{ - pixel_x = 11; - pixel_y = 22 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) "ftv" = ( /obj/effect/turf_decal/sand, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -19176,34 +18329,10 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"fup" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) "fur" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/cargo/sorting) -"fuA" = ( -/obj/effect/turf_decal/trimline/red/corner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet/brig{ - id = "engcell"; - name = "Engineering Cell Locker" - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/machinery/light/small/directional/south, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/checkpoint/engineering) "fuB" = ( /obj/machinery/duct, /obj/structure/disposalpipe/segment, @@ -19229,9 +18358,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/mob/living/simple_animal/hostile/retaliate/goat{ - name = "Pete" - }, +/mob/living/basic/goat/pete, /turf/open/floor/iron/kitchen_coldroom, /area/station/service/kitchen/coldroom) "fvn" = ( @@ -19282,13 +18409,6 @@ }, /turf/open/floor/iron, /area/station/commons/fitness) -"fwd" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/dim/directional/south, -/obj/machinery/computer/security/telescreen/entertainment/directional/south, -/obj/effect/spawner/random/entertainment/lighter, -/turf/open/floor/iron/dark, -/area/station/service/bar) "fwk" = ( /obj/structure/table, /obj/machinery/microwave{ @@ -19395,6 +18515,17 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/wood/large, /area/station/service/library) +"fxS" = ( +/obj/machinery/firealarm/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/item/kirbyplants/random, +/obj/machinery/light_switch/directional/south{ + pixel_x = -8 + }, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/service/kitchen) "fxV" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -19443,14 +18574,8 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ dir = 1 }, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) -"fzm" = ( -/obj/structure/table/wood, -/obj/machinery/light/dim/directional/east, -/obj/item/reagent_containers/cup/glass/shaker, -/turf/open/floor/wood, -/area/station/service/bar/backroom) "fzo" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/engine{ @@ -19511,13 +18636,6 @@ /obj/item/stack/license_plates/empty/fifty, /turf/open/floor/plating, /area/station/security/prison/work) -"fBf" = ( -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/prison/work) "fBk" = ( /obj/effect/landmark/start/security_officer, /obj/structure/chair{ @@ -19525,12 +18643,18 @@ }, /turf/open/floor/iron, /area/station/security/office) -"fCB" = ( -/obj/effect/turf_decal/sand/plating, -/obj/machinery/light/small/directional/west, -/obj/structure/cable, -/turf/open/floor/plating/airless, -/area/station/solars/starboard/fore) +"fBJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/machinery/microwave{ + pixel_y = 6 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "fCO" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -19539,6 +18663,35 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/wood, /area/station/commons/vacant_room/office) +"fCS" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/iron, +/area/station/cargo/miningdock/cafeteria) +"fDd" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"fDg" = ( +/obj/structure/table, +/obj/item/clothing/gloves/boxing, +/obj/item/clothing/gloves/boxing/blue{ + pixel_x = 4; + pixel_y = 5 + }, +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/airalarm/directional/south, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/security/prison/workout) "fDm" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 4 @@ -19592,12 +18745,14 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit) -"fEe" = ( -/obj/machinery/light/dim/directional/north, -/obj/machinery/duct, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet) +"fEf" = ( +/obj/structure/table/wood, +/obj/item/papercutter{ + pixel_x = -4 + }, +/obj/item/paper/fluff/ids_for_dummies, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "fEi" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door_buttons/airlock_controller{ @@ -19632,6 +18787,27 @@ dir = 8 }, /area/station/service/kitchen) +"fEK" = ( +/obj/effect/turf_decal/trimline/white/filled/line, +/obj/effect/turf_decal/trimline/white/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/white/filled/corner{ + dir = 1 + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"fEM" = ( +/obj/machinery/light/warm/directional/south, +/turf/open/misc/grass/jungle, +/area/station/science/explab) +"fEQ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/dark/herringbone, +/area/station/commons/vacant_room) "fEZ" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/machinery/disposal/bin, @@ -19640,6 +18816,16 @@ /obj/structure/noticeboard/directional/north, /turf/open/floor/wood, /area/station/service/lawoffice) +"fFa" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "fFg" = ( /obj/machinery/button/elevator/directional/north{ id = "tram_sci_lift" @@ -19734,35 +18920,16 @@ "fGo" = ( /turf/closed/wall/r_wall, /area/station/security/checkpoint/escape) +"fGr" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron, +/area/station/commons/dorms) "fGK" = ( /obj/structure/window/reinforced/spawner/directional/west, /mob/living/carbon/human/species/monkey, /turf/open/misc/grass/jungle, /area/station/science/explab) -"fGM" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron, -/area/station/commons/dorms) -"fGS" = ( -/obj/machinery/modular_computer/console/preset/id{ - dir = 1 - }, -/obj/structure/sign/clock/directional/south, -/turf/open/floor/iron/cafeteria, -/area/station/command/heads_quarters/rd) -"fGZ" = ( -/obj/structure/table, -/obj/item/razor{ - pixel_x = 9; - pixel_y = 4 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/freezer, -/area/station/science/lower) "fHg" = ( /obj/structure/chair{ dir = 1; @@ -19819,10 +18986,15 @@ }, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) -"fIb" = ( -/obj/machinery/light/blacklight/directional/west, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation/entertainment) +"fHV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/d_day_promo/directional/east, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "fIc" = ( /obj/effect/turf_decal/stripes/white/full, /obj/effect/turf_decal/trimline/purple/filled/line, @@ -19834,17 +19006,17 @@ dir = 8 }, /area/station/science/lobby) -"fIl" = ( -/obj/structure/reagent_dispensers/watertank/high, -/obj/structure/railing{ - dir = 4 +"fIB" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 4 +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 }, -/obj/effect/turf_decal/tile/green/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics) +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/security/checkpoint/medical) "fIH" = ( /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -19852,30 +19024,20 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) +"fIV" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/flashlight/lamp, +/turf/open/floor/iron/dark, +/area/station/escapepodbay) "fJe" = ( /obj/effect/turf_decal/siding/thinplating, /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"fJf" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Security - Main East"; - network = list("ss13","Security") - }, -/obj/structure/table, -/obj/item/storage/fancy/coffee_cart_rack{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/food/donut/plain{ - pixel_x = -4; - pixel_y = 6 - }, -/turf/open/floor/iron, -/area/station/security/brig) "fJo" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19889,10 +19051,26 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"fJA" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/machinery/modular_computer/preset/cargochat/cargo, +/turf/open/floor/iron, +/area/station/cargo/office) "fJF" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/carpet, /area/station/service/library) +"fJH" = ( +/obj/structure/table/reinforced, +/obj/machinery/computer/security/telescreen/entertainment/directional/north, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/bar) "fJN" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -19913,6 +19091,14 @@ /obj/machinery/air_sensor/nitrogen_tank, /turf/open/floor/engine/n2, /area/station/engineering/atmos) +"fKk" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, +/obj/machinery/space_heater, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos) "fKn" = ( /obj/machinery/oven/range, /turf/open/floor/iron/white, @@ -19974,6 +19160,16 @@ }, /turf/open/floor/wood, /area/station/service/library) +"fLB" = ( +/obj/structure/closet/emcloset{ + anchored = 1 + }, +/obj/effect/turf_decal/bot, +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/station/ai_monitored/turret_protected/aisat/foyer) "fLE" = ( /obj/structure/table, /obj/machinery/camera/directional/north{ @@ -20008,6 +19204,18 @@ /obj/effect/turf_decal/stripes/white/full, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"fLO" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 8 + }, +/obj/item/radio/intercom/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/dorms) "fLP" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -20030,7 +19238,7 @@ /obj/machinery/door/airlock/public/glass/incinerator/atmos_exterior, /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "fMm" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ @@ -20038,15 +19246,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"fMu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) "fMK" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 4 @@ -20065,6 +19264,31 @@ /obj/machinery/air_sensor/ordnance_burn_chamber, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/burnchamber) +"fMS" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/thinplating, +/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, +/obj/effect/turf_decal/trimline/white/warning, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/tram/mid) +"fMZ" = ( +/obj/machinery/vending/drugs, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/structure/noticeboard/directional/south, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "fNa" = ( /obj/effect/turf_decal/trimline/brown/filled/line, /obj/structure/cable, @@ -20075,17 +19299,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/sorting) -"fNb" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/obj/machinery/firealarm/directional/west, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) "fNs" = ( /obj/structure/industrial_lift/tram/subfloor/window, /obj/structure/fluff/tram_rail, @@ -20099,6 +19312,26 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/freezer, /area/station/commons/toilet) +"fNG" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=2"; + location = "QM #1" + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/mob/living/simple_animal/bot/mulebot{ + home_destination = "QM #1"; + suffix = "#1" + }, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"fNR" = ( +/obj/structure/closet/lasertag/blue, +/obj/effect/landmark/start/hangover/closet, +/obj/structure/sign/poster/official/random/directional/east, +/obj/effect/turf_decal/tile/blue/full, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/fitness/recreation/entertainment) "fNV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -20129,15 +19362,6 @@ /obj/item/flashlight/lamp, /turf/open/floor/wood, /area/station/commons/dorms) -"fOv" = ( -/obj/structure/table, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 - }, -/obj/item/storage/toolbox/mechanical, -/obj/item/clothing/head/utility/welding, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "fOG" = ( /obj/structure/toilet{ pixel_y = 13 @@ -20157,14 +19381,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) -"fPh" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/machinery/firealarm/directional/south, -/obj/item/kirbyplants/random, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/processing) "fPv" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/window/left/directional/north{ @@ -20211,14 +19427,6 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) -"fQB" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/dim/directional/east, -/obj/structure/displaycase/forsale/kitchen{ - pixel_y = 8 - }, -/turf/open/floor/iron/dark, -/area/station/service/bar) "fQI" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, @@ -20230,17 +19438,6 @@ /obj/effect/turf_decal/trimline/yellow/arrow_ccw, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"fQK" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Medical - Main West"; - network = list("ss13","medbay") - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "fQV" = ( /obj/machinery/button/door/directional/east{ id = "offstationaccess"; @@ -20281,6 +19478,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/disposal) +"fQX" = ( +/obj/machinery/component_printer, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron, +/area/station/science/explab) "fRs" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -20298,6 +19500,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) +"fSf" = ( +/obj/structure/railing, +/obj/effect/turf_decal/trimline/tram/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/tram/filled/warning{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/right) "fSp" = ( /obj/effect/landmark/start/depsec/engineering, /obj/structure/chair/office, @@ -20384,6 +19597,13 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/dark, /area/station/maintenance/radshelter/civil) +"fUm" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "fUy" = ( /obj/structure/chair/comfy/beige{ dir = 8 @@ -20397,6 +19617,32 @@ }, /turf/closed/wall/r_wall, /area/station/science/xenobiology) +"fUP" = ( +/obj/structure/table, +/obj/item/stack/cable_coil{ + pixel_x = 2; + pixel_y = -2 + }, +/obj/item/stack/cable_coil{ + pixel_x = 3; + pixel_y = -7 + }, +/obj/item/screwdriver{ + pixel_y = 16 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west{ + pixel_y = -3 + }, +/obj/item/storage/belt/utility, +/obj/machinery/light_switch/directional/west{ + pixel_x = -23; + pixel_y = 8 + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "fUQ" = ( /obj/machinery/door/airlock/hatch{ name = "Ladder Access Hatch" @@ -20416,6 +19662,15 @@ /obj/machinery/shieldgen, /turf/open/floor/plating, /area/station/engineering/engine_smes) +"fVH" = ( +/obj/structure/table, +/obj/item/razor{ + pixel_x = 9; + pixel_y = 4 + }, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/freezer, +/area/station/science/lower) "fVI" = ( /turf/open/floor/plating, /area/station/engineering/supermatter/room) @@ -20437,13 +19692,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/genetics) -"fWb" = ( -/obj/structure/table, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/janitor) "fWi" = ( /obj/structure/rack, /obj/structure/window/spawner/directional/north, @@ -20465,6 +19713,26 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation/entertainment) +"fWD" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/machinery/firealarm/directional/south, +/obj/item/kirbyplants/random, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light_switch/directional/south{ + pixel_x = -8; + pixel_y = -23 + }, +/turf/open/floor/iron/dark, +/area/station/security/processing) +"fWK" = ( +/obj/machinery/computer/atmos_control/oxygen_tank{ + atmos_chambers = list("o2ordance"="Oxygen Supply") + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/storage) "fWM" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/item/kirbyplants/random, @@ -20475,6 +19743,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) +"fWO" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "fWT" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /turf/open/floor/iron/white, @@ -20485,6 +19758,27 @@ }, /turf/open/openspace, /area/station/hallway/primary/tram/center) +"fXb" = ( +/obj/machinery/door/airlock{ + name = "Barber Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/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/catwalk_floor, +/area/station/service/barber) +"fXd" = ( +/obj/machinery/firealarm/directional/north{ + pixel_x = 5 + }, +/obj/machinery/light_switch/directional/north{ + pixel_x = -8; + pixel_y = 23 + }, +/turf/open/floor/wood/large, +/area/station/service/barber) "fXf" = ( /obj/structure/sign/warning/vacuum/external{ pixel_y = 32 @@ -20505,16 +19799,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) -"fXP" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/structure/table, -/obj/machinery/recharger, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/turf/open/floor/iron/showroomfloor, -/area/station/security/warden) "fXQ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -20640,6 +19924,11 @@ "gaH" = ( /turf/open/floor/catwalk_floor, /area/station/hallway/primary/tram/right) +"gaO" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/science/ordnance) "gaY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -20735,18 +20024,6 @@ "gcp" = ( /turf/closed/wall/r_wall, /area/station/commons/vacant_room) -"gcq" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/tram/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/tram/filled/warning{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "gcx" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/purple/fourcorners, @@ -20762,10 +20039,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"gdd" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/engine/plasma, -/area/station/engineering/atmos) "gdn" = ( /obj/machinery/air_sensor/nitrous_tank, /turf/open/floor/engine/n2o, @@ -20890,10 +20163,14 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/tcommsat/computer) -"ggt" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall, -/area/station/maintenance/disposal) +"ggm" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/trinary/filter{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "ggw" = ( /obj/machinery/door/poddoor{ id = "QMLoaddoor2"; @@ -20904,6 +20181,12 @@ }, /turf/open/floor/plating, /area/station/cargo/storage) +"ggE" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/spawner/random/armory/barrier_grenades, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "ggH" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -20915,13 +20198,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/cargo/miningdock/oresilo) -"ggI" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/command/heads_quarters/ce) "ggL" = ( /obj/structure/closet/crate/trashcart/laundry, /obj/item/clothing/under/rank/prisoner/skirt, @@ -20931,6 +20207,17 @@ /obj/effect/spawner/random/contraband/prison, /turf/open/floor/iron/cafeteria, /area/station/security/prison) +"ggQ" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Science - Entrance Airlock"; + network = list("ss13","rd") + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/white, +/area/station/science/research) "ggV" = ( /obj/structure/table/wood, /obj/item/food/grown/poppy{ @@ -20971,21 +20258,27 @@ }, /turf/open/floor/plating, /area/station/maintenance/tram/mid) -"ghY" = ( -/obj/machinery/light/directional/west, -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/trimline/dark_blue/arrow_cw{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/dark_blue/corner, -/obj/structure/railing/corner, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hop) "gij" = ( /obj/structure/table, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"giK" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/directional/south{ + c_tag = "Maintenance - West Tram Tunnel 1" + }, +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/white/warning{ + dir = 1 + }, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/iron, +/area/station/maintenance/tram/left) "giR" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -20998,6 +20291,30 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) +"giW" = ( +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 9 + }, +/obj/structure/industrial_lift/public, +/obj/structure/railing{ + dir = 9 + }, +/obj/machinery/elevator_control_panel/directional/west{ + linked_elevator_id = "tram_sci_lift"; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/science/lower) +"giZ" = ( +/obj/structure/bed, +/obj/effect/spawner/random/contraband/prison, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/effect/landmark/start/prisoner, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/security/prison/safe) "gjb" = ( /obj/machinery/door/airlock{ name = "Water Closet" @@ -21034,11 +20351,6 @@ }, /turf/open/floor/iron/white, /area/station/science/explab) -"gju" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/dim/directional/south, -/turf/open/floor/iron/dark, -/area/station/service/bar) "gjx" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 8 @@ -21055,6 +20367,25 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"gjH" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"gjL" = ( +/obj/structure/bookcase/random/reference, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/wood/large, +/area/station/service/library) "gjM" = ( /obj/structure/industrial_lift/tram/subfloor/window, /obj/structure/window/reinforced/tram/front{ @@ -21089,6 +20420,11 @@ "gki" = ( /turf/closed/wall, /area/station/security/brig) +"gkn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/smooth, +/area/station/maintenance/disposal) "gkz" = ( /obj/structure/table, /obj/item/radio/intercom/prison, @@ -21165,20 +20501,31 @@ }, /turf/open/floor/plating, /area/station/science/xenobiology) -"glA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/machinery/microwave{ - pixel_y = 6 +"glv" = ( +/obj/structure/sign/directions/supply{ + dir = 1; + pixel_y = -28 }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 +/obj/structure/sign/directions/security{ + dir = 8; + pixel_y = -34 }, -/obj/machinery/light_switch/directional/north{ - pixel_x = 10 +/obj/structure/sign/directions/command{ + dir = 8; + pixel_y = -40 + }, +/obj/structure/sign/directions/vault{ + dir = 8; + pixel_y = -22 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/tram/filled/line, +/obj/effect/turf_decal/trimline/tram/filled/warning, /turf/open/floor/iron, -/area/station/cargo/warehouse) +/area/station/hallway/primary/tram/right) "glP" = ( /obj/structure/chair/plastic, /turf/open/floor/eighties/red, @@ -21255,17 +20602,6 @@ }, /turf/closed/wall/r_wall, /area/station/science/xenobiology) -"gmP" = ( -/obj/structure/rack, -/obj/item/storage/box/lights/tubes{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/storage/box/lights/tubes, -/obj/item/wrench, -/obj/item/stack/cable_coil, -/turf/open/misc/asteroid, -/area/station/medical/chemistry) "gnj" = ( /obj/modular_map_root/tramstation{ key = "medsciupper"; @@ -21313,6 +20649,29 @@ /obj/structure/sign/calendar/directional/east, /turf/open/floor/carpet, /area/station/medical/psychology) +"gnK" = ( +/obj/structure/sign/directions/evac{ + dir = 4; + pixel_y = -28 + }, +/obj/structure/sign/directions/medical{ + pixel_y = -34 + }, +/obj/structure/sign/directions/engineering{ + pixel_y = -40 + }, +/obj/structure/sign/directions/upload{ + dir = 4; + pixel_y = -22 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/tram/filled/line, +/obj/effect/turf_decal/trimline/tram/filled/warning, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "gnL" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/structure/disposalpipe/segment{ @@ -21320,6 +20679,17 @@ }, /turf/open/floor/iron, /area/station/security/office) +"gnM" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/obj/structure/table/reinforced, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/blood_filter, +/obj/item/clothing/gloves/latex/nitrile, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) "gnQ" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -21328,6 +20698,26 @@ /obj/machinery/status_display/ai/directional/north, /turf/open/floor/iron, /area/station/commons/dorms) +"gnW" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/corner, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/security/brig) +"gov" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/item/radio/intercom/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Medical - Main East"; + network = list("ss13","medbay") + }, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "goC" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -21392,36 +20782,6 @@ }, /turf/open/openspace/airless, /area/station/asteroid) -"gps" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Gas to Filter" - }, -/obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Engine Room Airlock"; - dir = 10; - network = list("ss13","engine","engineering") - }, -/obj/structure/sign/delamination_counter/directional/south, -/turf/open/floor/engine, -/area/station/engineering/supermatter) -"gpD" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 5 - }, -/obj/machinery/light/directional/north, -/obj/machinery/requests_console/directional/north{ - department = "Cargo Bay"; - name = "Cargo Bay Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/office) "gpH" = ( /obj/effect/turf_decal/siding/thinplating, /obj/structure/cable, @@ -21441,7 +20801,9 @@ dir = 4; id = "cargolower" }, -/obj/machinery/recycler, +/obj/machinery/recycler{ + dir = 8 + }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/disposal) @@ -21468,6 +20830,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"grb" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/security/brig) "grc" = ( /obj/effect/turf_decal/trimline/white/warning{ dir = 5 @@ -21505,15 +20874,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"gsg" = ( -/obj/machinery/iv_drip, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "gsu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -21570,6 +20930,15 @@ /obj/effect/turf_decal/trimline/red/filled/corner, /turf/open/floor/iron, /area/station/security/courtroom) +"gtH" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/item/reagent_containers/cup/bottle/multiver, +/obj/item/reagent_containers/cup/bottle/epinephrine, +/turf/open/floor/iron/white, +/area/station/security/medical) "gtN" = ( /obj/structure/table, /obj/item/storage/bag/tray, @@ -21586,6 +20955,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"gtU" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/openspace, +/area/station/solars/starboard/fore) "gtZ" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/machinery/airalarm/directional/south, @@ -21686,18 +21067,6 @@ /obj/effect/turf_decal/trimline/tram/corner, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) -"gwe" = ( -/obj/machinery/light/dim/directional/north, -/obj/effect/turf_decal/trimline/dark_green/corner{ - dir = 8 - }, -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/trimline/dark_blue/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/station/commons/lounge) "gwy" = ( /obj/structure/sign/warning/no_smoking{ pixel_x = -28 @@ -21708,6 +21077,11 @@ }, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"gwK" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/engine, +/area/station/science/xenobiology) "gwP" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/ladder, @@ -21760,14 +21134,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron, /area/station/cargo/miningdock) -"gxA" = ( -/obj/structure/industrial_lift/tram, -/obj/structure/window/reinforced/tram/right/directional/north, -/obj/structure/chair/sofa/bench/tram/right{ - dir = 8 - }, -/turf/open/openspace, -/area/station/hallway/primary/tram/center) "gxO" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 9 @@ -21779,6 +21145,17 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"gxV" = ( +/obj/machinery/mech_bay_recharge_port{ + dir = 2 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Science - Mech Bay"; + network = list("ss13","rd") + }, +/obj/machinery/light/directional/north, +/turf/open/floor/plating, +/area/station/science/robotics/mechbay) "gxY" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 10 @@ -21869,21 +21246,6 @@ /obj/structure/closet/secure_closet/hydroponics, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"gzT" = ( -/obj/machinery/portable_atmospherics/canister/plasma, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light_switch/directional/south{ - pixel_x = 9; - pixel_y = -24 - }, -/obj/machinery/firealarm/directional/south{ - pixel_x = -3 - }, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/storage) "gzY" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 @@ -21901,17 +21263,6 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) -"gAk" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/button/door/directional/west{ - id = "Toilet6"; - name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/machinery/recharge_station, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet) "gAv" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 1 @@ -21962,17 +21313,6 @@ }, /turf/open/floor/plating, /area/station/commons/vacant_room/commissary) -"gAS" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 10 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Security - Prison Main South-West"; - network = list("ss13","Security","prison") - }, -/turf/open/floor/iron, -/area/station/security/prison) "gAY" = ( /obj/structure/chair/stool/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21998,6 +21338,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/tram/right) +"gBz" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/table/glass, +/obj/item/storage/box/beakers{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/storage/box/bodybags, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "gBL" = ( /obj/structure/chair/comfy/beige, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -22045,16 +21396,6 @@ /obj/effect/turf_decal/siding/thinplating/dark, /turf/open/floor/iron/white, /area/station/science/research) -"gCd" = ( -/obj/structure/table, -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/item/folder/yellow, -/obj/item/clothing/ears/earmuffs{ - pixel_x = -3; - pixel_y = -2 - }, -/turf/open/floor/iron, -/area/station/engineering/main) "gCq" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -22118,6 +21459,13 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"gDq" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "gDr" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -22151,6 +21499,12 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"gEx" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/poster/contraband/pwr_game/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/janitor) "gEC" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door_buttons/airlock_controller{ @@ -22197,6 +21551,20 @@ "gFf" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/aisat/hallway) +"gFk" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/cargo/miningdock) +"gFm" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/plumbing/input{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "gFt" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, @@ -22251,13 +21619,6 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/science) -"gFV" = ( -/obj/machinery/computer/operating{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/line, -/turf/open/floor/iron/white, -/area/station/medical/surgery/fore) "gGb" = ( /obj/structure/sign/warning/secure_area{ desc = "A warning sign which reads 'BOMB RANGE"; @@ -22265,6 +21626,14 @@ }, /turf/closed/wall, /area/station/science/ordnance/bomb) +"gGi" = ( +/obj/machinery/modular_computer/preset/civilian, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/white, +/area/station/science/ordnance/office) "gGv" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/turf_decal/siding/thinplating/dark{ @@ -22285,6 +21654,11 @@ }, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"gGy" = ( +/obj/effect/turf_decal/sand/plating, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating/airless, +/area/station/solars/port) "gGI" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -22334,6 +21708,14 @@ }, /turf/open/floor/iron/cafeteria, /area/station/commons/dorms/laundry) +"gHE" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/white, +/area/station/science/lower) "gIf" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{ dir = 1 @@ -22378,16 +21760,14 @@ }, /turf/open/floor/wood, /area/station/command/meeting_room) -"gIN" = ( -/obj/structure/railing, -/obj/effect/turf_decal/trimline/tram/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/tram/filled/warning{ +"gIO" = ( +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/right) +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, +/obj/machinery/light/directional/east, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "gIV" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -22415,17 +21795,6 @@ }, /turf/open/floor/iron, /area/station/security/prison/garden) -"gJU" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Science - Entrance Airlock"; - network = list("ss13","rd") - }, -/turf/open/floor/iron/white, -/area/station/science/research) "gJY" = ( /obj/structure/railing{ dir = 8 @@ -22435,25 +21804,6 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"gKc" = ( -/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/firealarm/directional/south{ - pixel_x = 1 - }, -/obj/machinery/light_switch/directional/south{ - pixel_x = -10; - pixel_y = -24 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/science/ordnance/testlab) "gKh" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 @@ -22486,6 +21836,17 @@ }, /turf/open/floor/iron/dark, /area/station/cargo/drone_bay) +"gKF" = ( +/obj/machinery/firealarm/directional/east{ + pixel_y = -5 + }, +/obj/structure/reagent_dispensers/fueltank, +/obj/machinery/light_switch/directional/east{ + pixel_x = 23; + pixel_y = 8 + }, +/turf/open/floor/iron/dark, +/area/station/command/teleporter) "gKJ" = ( /obj/machinery/suit_storage_unit/ce, /obj/machinery/airalarm/directional/north, @@ -22518,15 +21879,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/engineering/engine_smes) -"gLC" = ( -/obj/machinery/firealarm/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Medical - Psychologist's Office"; - network = list("ss13","medbay") - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) "gLY" = ( /obj/structure/table/wood, /obj/structure/window/reinforced/spawner/directional/east{ @@ -22534,14 +21886,6 @@ }, /turf/open/floor/carpet, /area/station/commons/vacant_room/office) -"gLZ" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/machinery/duct, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/south, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/prison) "gMi" = ( /obj/machinery/air_sensor/air_tank, /turf/open/floor/engine/air, @@ -22646,10 +21990,8 @@ /turf/open/floor/iron/dark/herringbone, /area/station/commons/vacant_room) "gNE" = ( -/obj/structure/bed/pod{ - desc = "An old medical bed, just waiting for replacement with something up to date."; - dir = 8; - name = "medical bed" +/obj/structure/bed/medical{ + dir = 4 }, /obj/machinery/defibrillator_mount/directional/east, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -22691,6 +22033,22 @@ /obj/item/clothing/shoes/sneakers/orange, /turf/open/floor/iron/cafeteria, /area/station/security/prison) +"gOg" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 8 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/obj/structure/sign/poster/official/here_for_your_safety/directional/south, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) "gOh" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -22701,6 +22059,19 @@ }, /turf/open/floor/circuit, /area/station/ai_monitored/command/nuke_storage) +"gOA" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/firealarm/directional/south{ + pixel_x = 3 + }, +/obj/machinery/light_switch/directional/south{ + pixel_x = -8; + pixel_y = -23 + }, +/turf/open/floor/iron/showroomfloor, +/area/station/security/lockers) "gOF" = ( /obj/structure/fluff/tram_rail/floor{ dir = 1 @@ -22724,14 +22095,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white/side, /area/station/science/research) -"gOL" = ( -/obj/machinery/atmospherics/components/trinary/mixer/flipped{ - dir = 1 - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/storage) "gPA" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -22804,14 +22167,6 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) -"gQE" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Civilian - Theatre Backstage" - }, -/turf/open/floor/iron/white/side{ - dir = 4 - }, -/area/station/service/theater) "gQO" = ( /turf/closed/mineral/random/stationside/asteroid/porus, /area/station/security/prison) @@ -22858,6 +22213,18 @@ }, /turf/open/floor/iron, /area/station/security/office) +"gRQ" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/structure/rack, +/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/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/engineering/main) "gRY" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -22869,6 +22236,19 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"gSa" = ( +/obj/structure/table, +/obj/item/radio/intercom/prison/directional/east, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/obj/machinery/camera{ + c_tag = "Security - Prison Cell 6"; + dir = 6; + network = list("ss13","Security","prison","pcell") + }, +/turf/open/floor/iron, +/area/station/security/prison/safe) "gSf" = ( /obj/structure/rack, /obj/effect/spawner/random/techstorage/service_all, @@ -22890,12 +22270,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/glass, /area/station/cargo/sorting) -"gSr" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 10 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) "gSF" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -22903,6 +22277,14 @@ /obj/effect/landmark/start/roboticist, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) +"gSJ" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/white, +/area/station/science/research) "gSQ" = ( /obj/machinery/door/airlock{ name = "Custodial Closet" @@ -22923,13 +22305,6 @@ }, /turf/open/floor/iron, /area/station/service/janitor) -"gSR" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/white, -/area/station/science/research) "gTu" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -22967,13 +22342,6 @@ /obj/structure/disposalpipe/junction/flip, /turf/open/floor/carpet, /area/station/service/library) -"gTC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/left) "gTJ" = ( /obj/structure/railing{ dir = 1 @@ -23002,6 +22370,11 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"gUE" = ( +/obj/machinery/power/emitter, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) "gUF" = ( /obj/structure/industrial_lift/tram/white, /obj/structure/fluff/tram_rail{ @@ -23024,6 +22397,8 @@ "gUL" = ( /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/iron, /area/station/cargo/storage) "gUO" = ( @@ -23042,16 +22417,6 @@ }, /turf/open/floor/glass/reinforced, /area/station/ai_monitored/turret_protected/aisat/hallway) -"gVB" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood, -/obj/machinery/light/directional/west, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) "gVI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -23060,10 +22425,55 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/medical/break_room) +"gVW" = ( +/obj/effect/turf_decal/stripes/white/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 8 + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/escapepodbay) +"gWd" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + 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/structure/cable, +/obj/structure/fireaxecabinet/directional/north, +/turf/open/floor/iron, +/area/station/command/bridge) +"gWe" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/iron, +/area/station/security/checkpoint/science) "gWo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"gWt" = ( +/obj/effect/turf_decal/box, +/obj/structure/fluff{ + desc = "Ew, I think I see a hairball."; + icon = 'icons/obj/mining_zones/survival_pod.dmi'; + icon_state = "fan_tiny"; + name = "shower drain" + }, +/obj/machinery/shower/directional/west, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "gWu" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/effect/turf_decal/trimline/yellow/filled/corner{ @@ -23114,14 +22524,6 @@ /obj/structure/flora/bush/fullgrass/style_random, /turf/open/misc/grass/jungle, /area/station/science/explab) -"gXu" = ( -/obj/machinery/light/directional/south, -/obj/machinery/power/apc/auto_name/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/wood, -/area/station/command/heads_quarters/captain/private) "gXA" = ( /obj/effect/turf_decal/trimline/blue/filled/corner, /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -23134,6 +22536,26 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"gXH" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 10 + }, +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/landmark/start/hangover, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"gYd" = ( +/obj/machinery/rnd/production/techfab/department/security, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/structure/reagent_dispensers/wall/peppertank/directional/west, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/security/office) "gYl" = ( /obj/structure/chair/stool/bar/directional/west, /obj/effect/landmark/start/prisoner, @@ -23216,6 +22638,24 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/checker, /area/station/commons/lounge) +"haf" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/command/teleporter) +"haq" = ( +/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, +/turf/open/floor/iron, +/area/station/cargo/storage) "hay" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -23288,10 +22728,6 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/station/command/bridge) -"hce" = ( -/obj/machinery/light/warm/directional/south, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "hcv" = ( /obj/effect/spawner/random/entertainment/arcade{ dir = 1 @@ -23348,13 +22784,23 @@ /obj/item/storage/box/prisoner, /turf/open/floor/iron, /area/station/security/processing) -"hdP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +"hdM" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 }, -/turf/open/floor/iron/smooth, -/area/station/maintenance/tram/left) +/obj/machinery/reagentgrinder, +/obj/item/stack/sheet/mineral/plasma{ + pixel_y = 10 + }, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"hdT" = ( +/obj/structure/bed/dogbed/renault, +/mob/living/basic/pet/fox/renault, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain) "hee" = ( /turf/closed/wall/r_wall, /area/station/asteroid) @@ -23411,6 +22857,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) +"hfs" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Secure - AI Upper Ring West"; + dir = 6; + network = list("aicore") + }, +/turf/open/floor/glass/reinforced, +/area/station/ai_monitored/turret_protected/aisat/hallway) "hft" = ( /obj/structure/bed{ dir = 8 @@ -23420,18 +22877,6 @@ /obj/item/pillow/random, /turf/open/floor/wood, /area/station/commons/dorms) -"hfx" = ( -/obj/machinery/airalarm/directional/east, -/obj/machinery/camera{ - c_tag = "Arrivals - Lounge"; - dir = 6 - }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 2 - }, -/turf/open/floor/iron/grimy, -/area/station/hallway/secondary/entry) "hfy" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -23470,23 +22915,24 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"hgG" = ( +/obj/structure/sign/warning/secure_area/directional/north, +/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, +/obj/machinery/camera/directional/north{ + c_tag = "Hallway - Mid Right Command" + }, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) "hgN" = ( /mob/living/carbon/human/species/monkey, /turf/open/misc/asteroid, /area/station/science/explab) -"hgX" = ( -/obj/machinery/vending/drugs, -/obj/effect/turf_decal/siding/white{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Medical - Main Storage"; - network = list("ss13","medbay") - }, -/obj/structure/noticeboard/directional/south, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "hhc" = ( /turf/open/floor/iron/dark, /area/station/command/bridge) @@ -23536,6 +22982,15 @@ }, /turf/open/floor/glass/reinforced, /area/station/security/warden) +"hhO" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/table, +/obj/item/radio/intercom/directional/east, +/obj/machinery/coffeemaker, +/turf/open/floor/iron, +/area/station/security/brig) "hic" = ( /obj/structure/railing{ dir = 4 @@ -23599,20 +23054,6 @@ }, /turf/open/floor/wood, /area/station/command/meeting_room) -"hiu" = ( -/obj/structure/closet/l3closet/janitor, -/obj/machinery/firealarm/directional/south, -/obj/machinery/light_switch/directional/east, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 6 - }, -/obj/item/restraints/legcuffs/beartrap, -/obj/item/restraints/legcuffs/beartrap, -/turf/open/floor/iron, -/area/station/service/janitor) "hiB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /turf/closed/wall/r_wall, @@ -23623,6 +23064,18 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter) +"hiG" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Security - Rec Room East"; + dir = 6; + network = list("ss13","Security","prison") + }, +/turf/open/floor/iron, +/area/station/security/prison/workout) "hiR" = ( /obj/machinery/door/airlock{ name = "Bathroom" @@ -23661,22 +23114,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) -"hji" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - 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/trimline/purple/filled/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/white, -/area/station/science/ordnance) "hjo" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 8 @@ -23686,6 +23123,20 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) +"hjv" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Engineering - Atmospherics Distribution Loop"; + dir = 9; + network = list("ss13","engineering") + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8; + name = "Air to Distro" + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "hjx" = ( /obj/effect/turf_decal/siding/thinplating/dark, /obj/machinery/duct, @@ -23707,10 +23158,15 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"hki" = ( -/obj/structure/sink/directional/south, -/turf/open/floor/iron/freezer, -/area/station/security/prison) +"hkt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/port/central) "hkB" = ( /obj/effect/turf_decal/siding/thinplating/dark, /obj/machinery/duct, @@ -23756,21 +23212,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) -"hlh" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/components/trinary/filter{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) -"hli" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/station/security/prison) +"hlb" = ( +/obj/machinery/newscaster/directional/north, +/obj/machinery/modular_computer/preset/id, +/obj/structure/sign/calendar/directional/west, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hos) "hlk" = ( /obj/structure/table, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -23798,19 +23245,13 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/eva) -"hly" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/white/warning{ - dir = 1 - }, +"hlB" = ( /obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/structure/table, +/obj/machinery/coffeemaker, /turf/open/floor/iron, -/area/station/maintenance/tram/right) +/area/station/cargo/warehouse) "hlD" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot/right, @@ -23834,6 +23275,25 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/station/solars/starboard/fore) +"hmb" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/escapepodbay) +"hmd" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "hmA" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -23880,6 +23340,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/miningdock) +"hng" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "hnH" = ( /obj/machinery/newscaster/directional/north, /turf/open/floor/wood/large, @@ -23962,18 +23431,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos) -"hpp" = ( -/obj/effect/turf_decal/box, -/obj/machinery/shower/directional/east, -/obj/structure/fluff{ - desc = "Ew, I think I see a hairball."; - icon = 'icons/obj/lavaland/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "hpE" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -24139,10 +23596,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/command/bridge) -"htx" = ( -/obj/machinery/teleport/hub, -/turf/open/floor/plating, -/area/station/command/teleporter) "htI" = ( /obj/machinery/button/elevator{ id = "tram_upper_center_lift"; @@ -24214,32 +23667,24 @@ /area/station/maintenance/tram/left) "hvt" = ( /obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/effect/turf_decal/bot, /obj/structure/disposalpipe/segment{ dir = 9 }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"hvC" = ( -/obj/structure/table/wood, -/obj/machinery/light_switch/directional/north{ - pixel_x = 11; - pixel_y = 23 - }, -/turf/open/floor/iron/chapel{ +"hvv" = ( +/obj/machinery/portable_atmospherics/canister/plasma, +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/area/station/service/chapel) -"hvF" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 +/obj/machinery/firealarm/directional/south{ + pixel_x = -3 }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/storage) "hvJ" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -24296,6 +23741,13 @@ dir = 1 }, /area/station/hallway/secondary/service) +"hwQ" = ( +/obj/effect/turf_decal/box/red, +/obj/machinery/plumbing/growing_vat{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "hyE" = ( /obj/structure/table/glass, /obj/item/book/manual/wiki/security_space_law{ @@ -24313,6 +23765,17 @@ }, /turf/open/floor/iron/dark/smooth_corner, /area/station/commons/fitness) +"hze" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 9 + }, +/obj/machinery/light_switch/directional/west{ + pixel_x = -22; + pixel_y = -8 + }, +/turf/open/floor/iron, +/area/station/cargo/drone_bay) "hzk" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -24342,31 +23805,6 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics/garden) -"hzV" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/camera{ - c_tag = "Security - Pre-Trial Holding"; - dir = 9; - network = list("ss13","Security") - }, -/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/courtroom/holding) -"hAf" = ( -/obj/machinery/mech_bay_recharge_port{ - dir = 2 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Science - Mech Bay"; - network = list("ss13","rd") - }, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/plating, -/area/station/science/robotics/mechbay) "hAv" = ( /obj/effect/turf_decal/bot, /obj/structure/closet/l3closet/scientist, @@ -24410,7 +23848,7 @@ /turf/open/floor/iron/grimy, /area/station/security/detectives_office) "hBl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/r_wall, /area/station/science/ordnance/burnchamber) "hBr" = ( @@ -24451,6 +23889,14 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"hBJ" = ( +/obj/machinery/camera{ + c_tag = "Secure - AI Upper Ring South"; + dir = 9; + network = list("aicore") + }, +/turf/open/floor/glass/reinforced, +/area/station/ai_monitored/turret_protected/aisat/hallway) "hBK" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 10 @@ -24474,13 +23920,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"hCm" = ( -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 8 - }, -/obj/structure/window/spawner/directional/north, -/turf/open/floor/iron/dark/small, -/area/station/commons/vacant_room) "hCp" = ( /obj/structure/chair/stool/bar/directional/north, /obj/effect/turf_decal/siding/thinplating/dark{ @@ -24503,16 +23942,24 @@ /obj/machinery/vending/cigarette, /turf/open/floor/iron/cafeteria, /area/station/science/breakroom) -"hCZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 5 +"hCA" = ( +/obj/machinery/chem_master/condimaster{ + desc = "Looks like a knock-off chem-master. Perhaps useful for separating liquids when mixing drinks precisely. Also dispenses condiments."; + name = "HoochMaster Deluxe"; + pixel_x = -4 }, -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/small/directional/east, -/obj/machinery/suit_storage_unit/industrial/loader, -/turf/open/floor/iron, -/area/station/cargo/warehouse) +/obj/structure/sign/clock/directional/north, +/obj/machinery/light_switch/directional/north{ + pixel_x = -8; + pixel_y = 23 + }, +/turf/open/floor/wood, +/area/station/service/bar/backroom) +"hCN" = ( +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/machinery/light/floor, +/turf/open/floor/engine/n2o, +/area/station/engineering/atmos) "hDj" = ( /obj/machinery/door/airlock/atmos/glass{ name = "Atmospherics Testing Room" @@ -24551,9 +23998,13 @@ /obj/effect/turf_decal/siding/thinplating/corner{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/cargo/storage) +"hDZ" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/turf_decal/box, +/turf/open/floor/plating, +/area/station/service/hydroponics) "hEb" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -24609,13 +24060,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/showroomfloor, /area/station/security/warden) -"hES" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/station/science/research) "hEV" = ( /obj/effect/turf_decal/trimline/dark_green/filled/corner{ dir = 4 @@ -24707,6 +24151,16 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"hGt" = ( +/obj/structure/table, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/rods/fifty, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron, +/area/station/commons/storage/tools) "hGy" = ( /obj/effect/turf_decal/siding/thinplating, /obj/structure/disposalpipe/segment{ @@ -24715,6 +24169,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"hGD" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) "hGG" = ( /obj/structure/closet/secure_closet/hos, /obj/item/storage/secure/safe/hos{ @@ -24746,14 +24207,36 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"hHu" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, +"hHn" = ( +/obj/structure/bed/dogbed/runtime, +/obj/structure/sign/clock/directional/north, +/mob/living/simple_animal/pet/cat/runtime, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/cmo) +"hHB" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/computer/prisoner/management, +/obj/structure/reagent_dispensers/wall/peppertank/directional/north, +/obj/machinery/light/directional/north, /turf/open/floor/iron, -/area/station/commons/fitness) +/area/station/security/checkpoint/escape) "hHI" = ( /turf/open/floor/glass, /area/station/command/meeting_room) +"hHM" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/button/door/directional/east{ + id = "cargowarehouse"; + name = "Cargo Warehouse Shutters" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "hHY" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -24761,6 +24244,14 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/arrivals) +"hIg" = ( +/obj/structure/table, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/flashlight/lamp, +/turf/open/floor/iron/dark, +/area/station/service/janitor) "hIE" = ( /obj/structure/closet/secure_closet/engineering_electrical, /obj/effect/decal/cleanable/dirt, @@ -24800,14 +24291,6 @@ "hJd" = ( /turf/open/floor/iron, /area/station/engineering/main) -"hJf" = ( -/obj/machinery/computer/department_orders/service, -/obj/machinery/camera/directional/north{ - c_tag = "Service - Autolathe Room" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "hJl" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/ai_upload) @@ -24849,12 +24332,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/tram/right) -"hKz" = ( -/obj/structure/bed, -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/white, -/area/station/security/medical) "hKL" = ( /obj/item/storage/secure/safe/directional/east, /obj/machinery/airalarm/directional/north, @@ -24883,12 +24360,6 @@ }, /turf/open/floor/carpet, /area/station/commons/vacant_room/office) -"hLn" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Hallway - Starboard Tram Platform North" - }, -/turf/open/floor/noslip/tram, -/area/station/hallway/primary/tram/right) "hLr" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -24909,17 +24380,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/prison/safe) -"hMd" = ( -/obj/structure/table, -/obj/item/clipboard, -/obj/item/wrench, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Science - Server Room"; - network = list("ss13","rd") - }, -/turf/open/floor/iron/dark, -/area/station/science/server) "hMg" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -24937,17 +24397,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos) -"hMo" = ( -/obj/structure/table, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Civilian - Recreational Area North-West" - }, -/obj/item/toy/plush/lizard_plushie/space/green, +"hMq" = ( +/obj/structure/rack, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/spawner/random/armory/shotgun, /turf/open/floor/iron, -/area/station/commons/fitness/recreation) +/area/station/ai_monitored/security/armory) "hMs" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, @@ -24956,11 +24412,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/break_room) -"hMx" = ( -/obj/effect/spawner/random/vending/colavend, -/obj/machinery/light/dim/directional/west, -/turf/open/floor/wood, -/area/station/service/bar/backroom) "hMA" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 6 @@ -25073,6 +24524,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/engineering/atmos) +"hNI" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/light/floor, +/turf/open/floor/engine/air, +/area/station/engineering/atmos) +"hNR" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "hOd" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 1 @@ -25126,6 +24590,36 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"hOS" = ( +/obj/structure/table, +/obj/item/radio/intercom/prison/directional/east, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/obj/machinery/camera{ + c_tag = "Security - Prison Cell 2"; + dir = 6; + network = list("ss13","Security","prison","pcell") + }, +/turf/open/floor/iron, +/area/station/security/prison/safe) +"hOZ" = ( +/obj/effect/turf_decal/trimline/red/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, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/security/prison) +"hPi" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/camera/directional/south{ + c_tag = "Hallway - North-West Escape Wing Entry" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "hPs" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25189,16 +24683,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) -"hQv" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/item/radio/intercom/directional/west, -/obj/machinery/modular_computer/console/preset/id{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) "hQE" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, /obj/structure/cable, @@ -25207,6 +24691,19 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/science/ordnance/storage) +"hRa" = ( +/obj/machinery/computer/scan_consolenew{ + dir = 4 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Science - Genetics"; + network = list("ss13","rd") + }, +/obj/structure/sign/clock/directional/west, +/obj/effect/turf_decal/tile/dark_green/fourcorners, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/station/science/genetics) "hRi" = ( /obj/machinery/power/emitter, /obj/effect/turf_decal/stripes/corner{ @@ -25233,15 +24730,13 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) -"hRF" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, +"hRC" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/firealarm/directional/south, /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) +/turf/open/floor/iron, +/area/station/security/brig) "hRK" = ( /obj/structure/bed, /obj/item/bedsheet/dorms, @@ -25250,16 +24745,6 @@ /obj/item/pillow/random, /turf/open/floor/carpet, /area/station/commons/dorms) -"hSi" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/emergency, -/obj/item/wrench, -/obj/item/assembly/signaler, -/turf/open/floor/iron, -/area/station/command/bridge) "hSs" = ( /obj/effect/turf_decal/trimline/brown/filled/corner, /obj/effect/turf_decal/trimline/brown/filled/corner{ @@ -25272,6 +24757,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/storage) +"hSt" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Hallway - Central Escape Wing Entry" + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/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/secondary/exit) "hSH" = ( /obj/structure/chair{ dir = 1 @@ -25285,19 +24785,18 @@ /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) "hSM" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 +/obj/effect/turf_decal/delivery, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=1"; + location = "QM #6" }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 +/obj/effect/turf_decal/tile/brown/fourcorners, +/mob/living/simple_animal/bot/mulebot{ + home_destination = "QM #6"; + suffix = "#6" }, -/obj/machinery/light/directional/west, -/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, -/area/station/commons/fitness/recreation) +/area/station/cargo/warehouse) "hTa" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /turf/open/floor/iron, @@ -25312,34 +24811,41 @@ }, /turf/open/floor/iron/white, /area/station/science/explab) +"hTk" = ( +/obj/machinery/shower/directional/south, +/turf/open/floor/iron/freezer, +/area/station/security/prison) "hTn" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"hTF" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/light/directional/south, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "hTL" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 }, /turf/open/floor/iron, /area/station/commons/dorms) -"hTV" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/security/office) "hTX" = ( /obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ dir = 8 }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"hUa" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/tank/air{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal/incinerator) "hUf" = ( /obj/machinery/camera/emp_proof{ c_tag = "Engineering - Atmospherics Incinerator"; @@ -25352,6 +24858,7 @@ /obj/item/radio/intercom/directional/north, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "hUr" = ( @@ -25362,6 +24869,24 @@ dir = 8 }, /area/station/security/execution/education) +"hUs" = ( +/obj/machinery/computer/bank_machine{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/machinery/door/window/left/directional/west{ + dir = 1; + name = "Terminal Access"; + req_access = list("qm") + }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/dark, +/area/station/cargo/miningdock/oresilo) "hUz" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/turf_decal/stripes/asteroid/full, @@ -25380,6 +24905,11 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/maint) +"hUQ" = ( +/obj/machinery/teleport/station, +/obj/structure/cable, +/turf/open/floor/circuit, +/area/station/command/teleporter) "hUY" = ( /obj/machinery/door/airlock/external{ autoclose = 0; @@ -25415,12 +24945,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison/safe) -"hVD" = ( -/obj/machinery/computer/teleporter{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/command/teleporter) +"hVy" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/machinery/light/floor, +/turf/open/floor/engine/n2, +/area/station/engineering/atmos) "hVG" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -25469,21 +24998,19 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/radshelter/civil) -"hXC" = ( -/obj/machinery/light_switch/directional/west{ - pixel_y = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) "hXJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/status_display/ai/directional/north, /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat_interior) +"hXK" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron, +/area/station/security/prison) "hXS" = ( /obj/structure/railing, /obj/machinery/door/window/left/directional/north{ @@ -25504,13 +25031,6 @@ }, /turf/open/floor/iron, /area/station/science/explab) -"hYh" = ( -/obj/machinery/light/warm/directional/south, -/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/service/chapel) "hYn" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, @@ -25531,18 +25051,6 @@ /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) -"hYx" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "hYK" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, @@ -25604,6 +25112,19 @@ /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) +"hZe" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/head/utility/radiation, +/obj/item/clothing/glasses/meson, +/obj/item/clothing/glasses/meson, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/firealarm/directional/north, +/obj/structure/cable, +/obj/machinery/light/directional/north, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "hZr" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmos) @@ -25797,6 +25318,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"ict" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/security/checkpoint/engineering) "icx" = ( /obj/structure/chair/stool/directional/north, /turf/open/floor/iron, @@ -25817,20 +25350,11 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"idq" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ +"idg" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 }, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "O2 Outlet Pump" - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ - dir = 4 - }, +/obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/engineering/atmos) "idz" = ( @@ -25848,21 +25372,14 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"idO" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/firealarm/directional/south{ - pixel_x = 3 - }, -/obj/machinery/light_switch/directional/south{ - pixel_x = -11 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark/corner{ - dir = 8 +"idI" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Hallway - Starboard Tram Platform South"; + pixel_y = -23 }, -/area/station/science/robotics/mechbay) +/obj/machinery/light/directional/east, +/turf/open/floor/noslip/tram, +/area/station/hallway/primary/tram/right) "idW" = ( /obj/structure/railing/corner, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -25899,6 +25416,13 @@ }, /turf/open/floor/iron, /area/station/commons/fitness) +"iez" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "ieH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -25991,14 +25515,6 @@ /obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/plating, /area/station/engineering/engine_smes) -"igk" = ( -/obj/structure/table, -/obj/item/storage/box/donkpockets, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) "ign" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -26023,6 +25539,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/service/hydroponics/garden) +"igV" = ( +/obj/structure/closet/emcloset/anchored, +/obj/effect/turf_decal/sand/plating, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/commons/vacant_room) "ihb" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 9 @@ -26037,6 +25561,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"ihl" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/obj/item/radio/intercom/prison/directional/east, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/security/checkpoint/medical) "ihu" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/grimy, @@ -26134,14 +25666,6 @@ }, /turf/open/floor/iron, /area/station/security/processing) -"ijf" = ( -/obj/machinery/seed_extractor, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) "ijj" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/structure/sign/departments/holy{ @@ -26158,6 +25682,17 @@ /obj/structure/table/reinforced, /turf/open/floor/iron/dark, /area/station/science/xenobiology) +"ikc" = ( +/obj/machinery/vending/cigarette, +/obj/machinery/airalarm/directional/north, +/obj/machinery/camera{ + c_tag = "Cargo - Mining Break Room"; + dir = 9; + network = list("ss13","cargo") + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/cargo/miningdock/cafeteria) "iko" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -26195,13 +25730,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/service/hydroponics/garden) -"ili" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/commons/dorms) "ilj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26211,37 +25739,20 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"ilS" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Civilian - Dormitories South-West" + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron, +/area/station/commons/dorms) "ilX" = ( /obj/effect/turf_decal/trimline/purple/filled/corner, /turf/open/floor/iron/white, /area/station/science/lower) -"ilZ" = ( -/obj/structure/sign/directions/supply{ - dir = 4; - pixel_y = -28 - }, -/obj/structure/sign/directions/security{ - dir = 8; - pixel_y = -34 - }, -/obj/structure/sign/directions/command{ - dir = 8; - pixel_y = -40 - }, -/obj/machinery/light/directional/south, -/obj/structure/sign/directions/vault{ - dir = 8; - pixel_y = -22 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/tram/filled/line, -/obj/effect/turf_decal/trimline/tram/filled/warning, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "ima" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -26272,21 +25783,6 @@ }, /turf/open/floor/glass, /area/station/command/meeting_room) -"imB" = ( -/obj/structure/rack, -/obj/item/gun/ballistic/shotgun/riot{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/gun/ballistic/shotgun/riot, -/obj/item/gun/ballistic/shotgun/riot{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/iron, -/area/station/ai_monitored/security/armory) "ina" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -26307,20 +25803,6 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"inG" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/green/corner{ - dir = 1 - }, -/obj/machinery/duct, -/obj/machinery/light/directional/west, -/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/secondary/service) "inK" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Recreation Area Maintenance Access" @@ -26356,6 +25838,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"ioh" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/thinplating, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/trimline/white/warning, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/tram/mid) "ioi" = ( /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) @@ -26378,6 +25872,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/checker, /area/station/commons/lounge) +"ioA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "ioC" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 @@ -26400,8 +25899,8 @@ dir = 8 }, /obj/machinery/door/window/elevator/left/directional/east{ - elevator_mode = 1; - elevator_linked_id = "tram_dorm_lift" + elevator_linked_id = "tram_dorm_lift"; + elevator_mode = 1 }, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) @@ -26443,13 +25942,10 @@ }, /turf/open/floor/iron, /area/station/science/explab) -"ipU" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 6 - }, -/obj/machinery/smartfridge/organ, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) +"iqg" = ( +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/freezer, +/area/station/security/prison) "iqH" = ( /obj/effect/turf_decal/sand, /turf/open/floor/iron, @@ -26491,6 +25987,20 @@ }, /turf/open/floor/glass/reinforced, /area/station/security/brig) +"irf" = ( +/obj/machinery/button/door/directional/east{ + id = "armory"; + name = "Armory Shutters"; + req_access = list("armory") + }, +/obj/machinery/status_display/ai/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light_switch/directional/east{ + pixel_x = 23; + pixel_y = -8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "irv" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 9 @@ -26549,14 +26059,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/service/janitor) -"isg" = ( -/obj/machinery/disposal/bin, -/obj/machinery/light/directional/east, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/iron/grimy, -/area/station/service/library/lounge) "isM" = ( /obj/machinery/door/airlock/medical/glass{ name = "Break Room" @@ -26572,6 +26074,16 @@ }, /turf/open/floor/iron/dark, /area/station/medical/break_room) +"isP" = ( +/obj/structure/table, +/obj/item/radio/intercom/directional/east{ + freerange = 1; + listening = 0; + name = "Custom Channel"; + pixel_x = 0 + }, +/turf/open/floor/iron/dark/small, +/area/station/commons/vacant_room) "isV" = ( /obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -26588,14 +26100,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/courtroom/holding) -"itk" = ( -/obj/machinery/medical_kiosk, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "itn" = ( /obj/structure/stairs/north, /obj/structure/railing{ @@ -26610,21 +26114,6 @@ }, /turf/open/misc/asteroid, /area/station/asteroid) -"itM" = ( -/obj/machinery/gulag_item_reclaimer{ - pixel_x = 32 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 5 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/processing) "itN" = ( /obj/effect/turf_decal/stripes/white/corner{ dir = 1 @@ -26653,17 +26142,6 @@ /obj/effect/turf_decal/stripes/white/full, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"iuh" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Security - Prison Main North-West"; - network = list("ss13","Security","prison") - }, -/turf/open/floor/iron, -/area/station/security/prison) "iuz" = ( /obj/machinery/door/airlock/external{ name = "Port Docking Bay 1"; @@ -26672,15 +26150,6 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/station/hallway/secondary/entry) -"iuI" = ( -/obj/machinery/bookbinder, -/obj/machinery/light/directional/north, -/obj/machinery/newscaster/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Civilian - Library North" - }, -/turf/open/floor/wood/large, -/area/station/service/library) "iuJ" = ( /obj/structure/bed/double, /obj/item/bedsheet/dorms_double, @@ -26791,13 +26260,6 @@ }, /turf/open/floor/plating, /area/station/science/robotics/mechbay) -"iwz" = ( -/obj/machinery/computer/rdservercontrol{ - dir = 1 - }, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/dark, -/area/station/science/server) "iwP" = ( /obj/structure/sign/departments/vault/directional/north, /obj/effect/turf_decal/stripes/end, @@ -26849,24 +26311,13 @@ /turf/open/floor/catwalk_floor, /area/station/maintenance/port/central) "ixu" = ( -/obj/structure/closet/crate/science{ - name = "MOD core crate" - }, -/obj/item/mod/core/standard{ - pixel_x = -4 - }, -/obj/item/mod/core/standard{ - pixel_x = -4 - }, -/obj/item/mod/core/standard{ - pixel_x = -4 - }, /obj/structure/noticeboard/directional/north, /obj/machinery/camera/directional/north{ c_tag = "Science - Robotics"; network = list("ss13","rd") }, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/closet/crate/mod, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) "ixC" = ( @@ -26887,13 +26338,6 @@ }, /turf/open/space/openspace, /area/space) -"ixL" = ( -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/miningdock) "ixO" = ( /obj/structure/chair/comfy/brown{ buildstackamount = 0; @@ -26930,7 +26374,6 @@ /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 }, -/obj/effect/landmark/generic_maintenance_landmark, /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/evidence) @@ -26938,6 +26381,17 @@ /obj/machinery/telecomms/bus/preset_two, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) +"iyQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/south{ + pixel_x = -1 + }, +/obj/machinery/light_switch/directional/south{ + pixel_x = 8; + pixel_y = -23 + }, +/turf/open/floor/wood, +/area/station/command/meeting_room) "iyS" = ( /obj/structure/cable, /obj/structure/disposalpipe/junction{ @@ -26947,6 +26401,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"izd" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/machinery/firealarm/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "izy" = ( /obj/structure/filingcabinet/chestdrawer, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26975,16 +26436,6 @@ "izU" = ( /turf/closed/wall, /area/station/hallway/primary/tram/center) -"izV" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "iAb" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -27017,25 +26468,24 @@ /obj/structure/lattice/catwalk, /turf/open/openspace/airless, /area/station/asteroid) -"iAU" = ( -/obj/structure/rack, -/obj/item/gun/energy/laser{ - pixel_x = -3; - pixel_y = 3 +"iAI" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 }, -/obj/item/gun/energy/laser, -/obj/item/gun/energy/laser{ - pixel_x = 3; - pixel_y = -3 +/obj/machinery/camera/directional/east{ + c_tag = "Hallway - Service Wing Right Middle Hall" }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"iAW" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Arrivals - Central Docking Wing" }, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/cable, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/light/directional/south, /turf/open/floor/iron, -/area/station/ai_monitored/security/armory) +/area/station/hallway/secondary/entry) "iBa" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -27048,13 +26498,6 @@ }, /turf/open/floor/iron, /area/station/cargo/miningdock) -"iBm" = ( -/obj/machinery/light/directional/west, -/obj/structure/bed{ - dir = 4 - }, -/turf/open/floor/iron/textured_large, -/area/station/security/execution/education) "iBx" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -27119,6 +26562,18 @@ /obj/structure/cable, /turf/open/space/openspace, /area/station/solars/starboard/fore) +"iCF" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/security/office) "iDb" = ( /obj/item/crowbar/large, /obj/structure/rack, @@ -27156,17 +26611,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/commons/lounge) -"iEm" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/machinery/status_display/evac/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/brig) "iEz" = ( /obj/structure/lattice, /obj/machinery/camera/motion{ @@ -27218,10 +26662,13 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"iFN" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/solars/port) +"iFH" = ( +/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/light/dim/directional/east, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/port/central) "iFP" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -27266,29 +26713,16 @@ "iGG" = ( /turf/open/floor/iron/dark, /area/station/security/execution/transfer) -"iGL" = ( +"iGJ" = ( /obj/structure/table, -/obj/item/assembly/timer{ - pixel_x = -4; - pixel_y = 2 - }, -/obj/item/assembly/timer{ - pixel_x = 6; - pixel_y = -4 - }, -/obj/item/assembly/timer{ - pixel_x = 5; - pixel_y = 4 - }, -/obj/item/assembly/timer, -/obj/machinery/camera/directional/west{ - c_tag = "Science - Ordnance Launch Bay"; - network = list("ss13","rd") +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/item/storage/box/prisoner{ + pixel_y = 8 }, -/obj/machinery/light/directional/west, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) +/obj/item/storage/box/prisoner, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/security/brig) "iGM" = ( /obj/structure/table/wood, /obj/item/bodypart/chest/robot{ @@ -27301,6 +26735,11 @@ }, /turf/open/floor/carpet, /area/station/command/meeting_room) +"iHh" = ( +/obj/machinery/portable_atmospherics/canister/plasma, +/obj/machinery/light/floor, +/turf/open/floor/engine/plasma, +/area/station/engineering/atmos) "iHr" = ( /obj/structure/sink{ dir = 4; @@ -27400,6 +26839,31 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/engine_smes) +"iIS" = ( +/obj/structure/sign/directions/evac{ + dir = 4; + pixel_y = -28 + }, +/obj/structure/sign/directions/medical{ + dir = 8; + pixel_y = -34 + }, +/obj/structure/sign/directions/engineering{ + dir = 8; + pixel_y = -40 + }, +/obj/structure/sign/directions/upload{ + pixel_y = -22 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/trimline/tram/filled/line, +/obj/effect/turf_decal/trimline/tram/filled/warning, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/right) "iJd" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -27418,17 +26882,16 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/grass, /area/station/service/hydroponics) -"iJW" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"iJM" = ( +/obj/machinery/light/warm/directional/north, +/turf/open/floor/grass, +/area/station/service/hydroponics) +"iJY" = ( +/obj/structure/table, +/obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat/maint) "iKg" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 1 @@ -27442,20 +26905,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/gravity_generator) -"iKC" = ( -/obj/effect/turf_decal/siding/thinplating/dark, -/obj/machinery/light/directional/south, -/obj/machinery/disposal/bin, -/obj/machinery/airalarm/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Departures - South Main" - }, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) "iKN" = ( /obj/docking_port/stationary/syndicate/northwest{ dir = 8 @@ -27474,17 +26923,6 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/white, /area/station/science/research) -"iLf" = ( -/obj/machinery/firealarm/directional/east{ - pixel_y = -5 - }, -/obj/structure/reagent_dispensers/fueltank, -/obj/machinery/light_switch/directional/east{ - pixel_x = 21; - pixel_y = 9 - }, -/turf/open/floor/iron/dark, -/area/station/command/teleporter) "iLn" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, @@ -27518,29 +26956,11 @@ }, /turf/open/floor/wood, /area/station/service/bar/backroom) -"iLD" = ( -/obj/machinery/chem_mass_spec, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) "iLP" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/turf_decal/stripes/asteroid/box, /turf/open/floor/plating/airless, /area/space/nearstation) -"iLR" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/white/warning{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/maintenance/tram/left) "iMd" = ( /obj/structure/table, /obj/item/folder/white{ @@ -27647,6 +27067,15 @@ }, /turf/open/floor/eighties/red, /area/station/commons/fitness/recreation/entertainment) +"iNZ" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/processing) "iOc" = ( /obj/machinery/stasis{ dir = 8 @@ -27687,6 +27116,16 @@ }, /turf/open/misc/asteroid/airless, /area/station/asteroid) +"iOy" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/turf_decal/trimline/neutral/filled/warning, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/incident_display/dual/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "iOC" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, @@ -27711,6 +27150,21 @@ "iON" = ( /turf/open/floor/iron/stairs/left, /area/station/science/lower) +"iOS" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/table/glass, +/obj/item/storage/medkit/regular{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/storage/medkit/regular, +/obj/machinery/camera/directional/south{ + c_tag = "Medical - Main North"; + network = list("ss13","medbay") + }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "iOT" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -27718,6 +27172,22 @@ }, /turf/open/floor/iron/cafeteria, /area/station/commons/dorms/laundry) +"iPd" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/light_switch/directional/south{ + pixel_x = -8; + pixel_y = -23 + }, +/obj/machinery/firealarm/directional/south{ + pixel_x = 3 + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hos) "iPi" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -27727,16 +27197,6 @@ }, /turf/open/floor/iron, /area/station/security/brig) -"iPp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/ladder, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/smooth, -/area/station/maintenance/tram/right) -"iPs" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/catwalk_floor, -/area/station/command/teleporter) "iPy" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -27753,22 +27213,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"iPU" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 6 - }, -/obj/machinery/firealarm/directional/east{ - pixel_y = 3 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/machinery/light_switch/directional/east{ - pixel_x = 22; - pixel_y = -11 - }, -/turf/open/floor/iron/white, -/area/station/science/auxlab/firing_range) "iQC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/sorting/mail/flip{ @@ -27784,6 +27228,22 @@ /obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible, /turf/open/floor/iron, /area/station/engineering/atmos) +"iQG" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/button/elevator/directional/north{ + id = "tram_xeno_lift" + }, +/obj/machinery/lift_indicator/directional/north{ + linked_elevator_id = "tram_xeno_lift" + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 5 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "iQH" = ( /obj/machinery/computer/security/mining{ dir = 1 @@ -27803,6 +27263,15 @@ /obj/structure/reagent_dispensers/foamtank, /turf/open/floor/plating, /area/station/engineering/engine_smes) +"iRn" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/science/research) "iRC" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron/grimy, @@ -27856,20 +27325,34 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat_interior) -"iSo" = ( -/obj/machinery/light_switch/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hos) +"iSt" = ( +/obj/structure/table/wood, +/obj/item/staff/broom, +/obj/item/clothing/head/costume/sombrero/green, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/service/theater) "iSw" = ( /obj/machinery/griddle, /turf/open/floor/iron/white, /area/station/commons/vacant_room) +"iSC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Maintenance - East Tram Tunnel 3"; + dir = 9 + }, +/obj/effect/turf_decal/siding/thinplating, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/white/warning, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/tram/right) "iSF" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 5 @@ -27891,16 +27374,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/iron/dark, /area/station/medical/treatment_center) -"iTo" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/obj/machinery/firealarm/directional/east{ - pixel_y = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/white, -/area/station/science/research) "iTr" = ( /obj/machinery/door/airlock/public/glass{ name = "Chapel Office" @@ -27992,6 +27465,18 @@ /obj/effect/turf_decal/trimline/neutral/filled/corner, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"iUv" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/effect/landmark/start/prisoner, +/obj/structure/cable, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/security/prison/safe) "iUw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28025,20 +27510,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) -"iUK" = ( -/obj/structure/table/glass, -/obj/item/storage/box/beakers, -/obj/item/storage/box/bodybags{ - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/obj/item/radio/intercom/directional/east, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "iUO" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/cable, @@ -28075,6 +27546,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/atmospherics_engine) +"iVt" = ( +/obj/structure/bed, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/effect/landmark/start/prisoner, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/security/prison/safe) "iVy" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -28115,21 +27595,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"iWm" = ( -/obj/structure/sign/collision_counter{ - pixel_x = -32 - }, -/obj/structure/table/reinforced, -/obj/item/storage/medkit/regular{ - pixel_x = -5; - pixel_y = -3 - }, -/obj/item/reagent_containers/cup/glass/coffee{ - pixel_x = 8; - pixel_y = 4 - }, -/turf/open/floor/iron, -/area/station/command/bridge) "iWz" = ( /obj/machinery/door/airlock/external/glass{ name = "Supply Door Airlock" @@ -28157,6 +27622,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"iWQ" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/machinery/light/small/built/directional/north, +/turf/open/floor/carpet, +/area/station/commons/vacant_room/office) "iWZ" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -28193,17 +27665,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/break_room) -"iXT" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/effect/landmark/start/prisoner, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/prison/safe) "iXW" = ( /obj/machinery/static_signal/southeast, /obj/effect/turf_decal/stripes/white/line{ @@ -28218,6 +27679,28 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) +"iYa" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/effect/turf_decal/trimline/red/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) +"iYd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/left) "iYv" = ( /obj/structure/chair/office/light{ dir = 4 @@ -28259,13 +27742,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/medical/medbay/lobby) -"iZj" = ( -/obj/structure/table/wood, -/obj/machinery/light/small/directional/west, -/obj/item/storage/photo_album/library, -/obj/item/camera, -/turf/open/floor/engine/cult, -/area/station/service/library) "iZk" = ( /obj/machinery/vending/wardrobe/chap_wardrobe, /obj/machinery/camera/directional/south{ @@ -28339,6 +27815,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) +"iZY" = ( +/obj/structure/bed/medical/anchored, +/obj/machinery/light/red/directional/west, +/turf/open/floor/iron/textured_large, +/area/station/security/execution/education) +"jai" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/structure/railing/corner, +/turf/open/space/openspace, +/area/station/solars/starboard/fore) "jap" = ( /obj/structure/chair/office, /turf/open/floor/iron/dark/small, @@ -28369,12 +27858,32 @@ }, /turf/open/floor/iron/dark, /area/station/medical/storage) +"jaW" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/pump, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/engineering/atmos) "jba" = ( /obj/structure/chair/pew, /turf/open/floor/iron/chapel{ dir = 9 }, /area/station/service/chapel) +"jbb" = ( +/obj/structure/closet/secure_closet/engineering_electrical, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/engineering/main) "jbg" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 8 @@ -28397,6 +27906,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/miningdock) +"jbt" = ( +/obj/structure/railing, +/obj/machinery/door/firedoor/border_only, +/obj/effect/landmark/event_spawn, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/glass/reinforced, +/area/station/science/research) "jbx" = ( /obj/effect/turf_decal/siding/thinplating/dark/corner{ dir = 8 @@ -28457,6 +27973,27 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating/airless, /area/station/solars/port) +"jde" = ( +/obj/machinery/door/airlock/engineering{ + name = "Vacant Office A" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/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/wood, +/area/station/commons/vacant_room/office) +"jdk" = ( +/obj/structure/table/wood, +/obj/machinery/airalarm/directional/west, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/grimy, +/area/station/hallway/secondary/entry) "jdq" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, @@ -28516,13 +28053,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) -"jea" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) "jed" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -28563,6 +28093,21 @@ }, /turf/open/floor/wood, /area/station/service/bar/backroom) +"jeC" = ( +/obj/machinery/airalarm/directional/north, +/obj/structure/rack, +/obj/item/clipboard, +/obj/item/chair/plastic, +/obj/item/chair/plastic{ + pixel_y = 5 + }, +/obj/effect/spawner/random/bureaucracy/briefcase, +/obj/machinery/light_switch/directional/east{ + pixel_x = 23; + pixel_y = -8 + }, +/turf/open/floor/wood, +/area/station/service/lawoffice) "jeO" = ( /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/freezer, @@ -28594,12 +28139,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) -"jfd" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/station/commons/vacant_room/office) "jff" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -28662,12 +28201,14 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/hallway/primary/tram/right) -"jgk" = ( -/obj/item/radio/intercom/directional/north, -/obj/machinery/computer/order_console/cook, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) +"jgn" = ( +/obj/structure/table/reinforced, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/iron/dark, +/area/station/service/bar) "jgq" = ( /obj/structure/railing/corner, /turf/open/floor/glass/reinforced, @@ -28704,9 +28245,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/exit) -"jhd" = ( -/turf/open/space/openspace, -/area/space) "jhj" = ( /obj/structure/cable, /obj/machinery/airalarm/directional/north, @@ -28742,6 +28280,12 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/disposal) +"jhE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "jhN" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 6 @@ -28833,13 +28377,6 @@ dir = 1 }, /area/station/security/execution/transfer) -"jiO" = ( -/obj/structure/tank_dispenser, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/engine_smes) "jiQ" = ( /turf/closed/wall, /area/station/science/xenobiology) @@ -28849,6 +28386,14 @@ }, /turf/open/floor/iron/dark, /area/station/cargo/drone_bay) +"jjl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/right) "jjy" = ( /obj/structure/table, /obj/machinery/computer/security/telescreen/entertainment/directional/east, @@ -28904,13 +28449,6 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) -"jkd" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/engine, -/area/station/science/xenobiology) "jkt" = ( /turf/open/floor/carpet, /area/station/service/chapel) @@ -29000,6 +28538,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"jlX" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/structure/cable, +/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/machinery/light/cold/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/courtroom/holding) "jmb" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29047,6 +28598,18 @@ /obj/effect/landmark/navigate_destination/hop, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) +"jmY" = ( +/obj/structure/table, +/obj/item/radio/intercom/prison/directional/west, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Security - Prison Cell 1"; + network = list("ss13","Security","prison","pcell") + }, +/turf/open/floor/iron, +/area/station/security/prison/safe) "jne" = ( /obj/effect/turf_decal/siding/wideplating/corner{ dir = 1 @@ -29057,10 +28620,6 @@ "jnq" = ( /turf/closed/wall, /area/station/maintenance/central/lesser) -"jns" = ( -/obj/effect/turf_decal/trimline/yellow/filled/warning, -/turf/open/floor/iron, -/area/station/command/teleporter) "jnC" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 6 @@ -29096,6 +28655,14 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/supply) +"jnL" = ( +/obj/structure/railing{ + layer = 3.1; + dir = 4 + }, +/obj/machinery/netpod, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/bitrunning/den) "jnR" = ( /obj/structure/bed{ dir = 8 @@ -29124,6 +28691,15 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"joq" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 6 + }, +/obj/structure/table, +/obj/machinery/firealarm/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "jos" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 9 @@ -29147,21 +28723,6 @@ /obj/structure/sign/clock/directional/south, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) -"joI" = ( -/obj/structure/chair/office/light{ - dir = 1 - }, -/obj/effect/landmark/start/chief_engineer, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) -"joJ" = ( -/obj/structure/closet/crate/wooden/toy, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/white/side{ - dir = 4 - }, -/area/station/service/theater) "joS" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 @@ -29197,6 +28758,14 @@ }, /turf/open/floor/iron, /area/station/security/prison/work) +"jps" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "jpt" = ( /obj/machinery/duct, /obj/structure/cable, @@ -29204,16 +28773,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"jpw" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/structure/sign/clock/directional/south, -/obj/machinery/conveyor_switch/oneway{ - id = "engineeringchute"; - name = "Shipment Delivery Chute Activator"; - pixel_x = -11 - }, -/turf/open/floor/iron, -/area/station/engineering/main) +"jpB" = ( +/obj/structure/sign/clock/directional/north, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "jpC" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 4 @@ -29354,35 +28918,20 @@ }, /turf/open/floor/iron, /area/station/commons/fitness) -"jsN" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/random/contraband/prison, -/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/machinery/light/directional/south, -/turf/open/floor/iron/cafeteria, -/area/station/security/prison/mess) +"jsT" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Command - Bridge North" + }, +/obj/machinery/incident_display/dual/directional/north, +/turf/open/floor/iron, +/area/station/command/bridge) "jsW" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) -"jsX" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/gravity_generator) "jta" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -29396,24 +28945,23 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) -"jtk" = ( +"jtl" = ( /obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/warning{ - dir = 4 + dir = 8 }, -/obj/machinery/light/directional/east, +/obj/machinery/duct, +/obj/machinery/status_display/evac/directional/west, +/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) +/area/station/security/prison/safe) "jtr" = ( /turf/closed/wall, /area/station/medical/treatment_center) "jts" = ( -/obj/structure/bed/pod{ - desc = "An old medical bed, just waiting for replacement with something up to date."; - dir = 4; - name = "medical bed" +/obj/structure/bed/medical{ + dir = 8 }, /obj/machinery/defibrillator_mount/directional/west, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -29448,15 +28996,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"jtP" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 5 - }, -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, -/turf/open/floor/iron/white, -/area/station/science/lobby) "jud" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/event_spawn, @@ -29503,6 +29042,17 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"juT" = ( +/obj/structure/rack, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/cable, +/obj/effect/spawner/random/armory/laser_gun, +/turf/open/floor/iron, +/area/station/ai_monitored/security/armory) "juV" = ( /obj/structure/chair{ dir = 8 @@ -29529,14 +29079,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"jvy" = ( -/obj/structure/table, -/obj/item/radio/intercom/prison/directional/south, -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/prison/workout) "jvE" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -29585,6 +29127,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/station/service/chapel/monastery) +"jwj" = ( +/obj/machinery/atmospherics/components/trinary/mixer/flipped{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/storage) "jwq" = ( /obj/machinery/button/door/directional/west{ id = "private_o"; @@ -29596,6 +29145,34 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/commons/dorms) +"jwz" = ( +/obj/effect/landmark/secequipment, +/obj/effect/turf_decal/bot, +/obj/structure/sign/clock/directional/north, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/showroomfloor, +/area/station/security/lockers) +"jwP" = ( +/obj/effect/landmark/lift_id{ + specific_lift_id = "tram_cargo_lift" + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 8 + }, +/obj/structure/industrial_lift/public, +/obj/machinery/elevator_control_panel/directional/west{ + linked_elevator_id = "tram_cargo_lift"; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck"); + req_access = list("mining") + }, +/obj/effect/abstract/elevator_music_zone{ + linked_elevator_id = "tram_cargo_lift" + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/cargo/miningdock) "jwT" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -29616,6 +29193,22 @@ }, /turf/open/floor/plating, /area/station/medical/storage) +"jwX" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/tram/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/tram/filled/warning{ + dir = 4 + }, +/obj/effect/spawner/random/vending/colavend{ + pixel_x = 5 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/left) "jwZ" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -29698,6 +29291,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) +"jyU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/incident_display/delam/directional/north, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "jyV" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -29736,6 +29337,21 @@ /obj/effect/landmark/start/depsec/medical, /turf/open/floor/iron, /area/station/security/checkpoint/medical) +"jzW" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Cargo - Warehouse East"; + dir = 6; + network = list("ss13","cargo") + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "jzX" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -29758,6 +29374,25 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/tcommsat/computer) +"jAc" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/warning{ + dir = 8 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) +"jAi" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/command/teleporter) "jAk" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, @@ -29871,6 +29506,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) +"jCn" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/thinplating, +/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, +/obj/effect/turf_decal/trimline/white/warning, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/tram/mid) "jCw" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -29936,15 +29587,6 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"jDE" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 9 - }, -/obj/machinery/airalarm/directional/north, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics) "jDF" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/window/left/directional/east{ @@ -29970,6 +29612,13 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) +"jDV" = ( +/obj/structure/closet/secure_closet/freezer/kitchen, +/obj/effect/turf_decal/bot_white, +/obj/item/reagent_containers/condiment/rice, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/white/side, +/area/station/service/kitchen) "jEc" = ( /obj/structure/fluff/tram_rail/floor{ dir = 1 @@ -30019,23 +29668,6 @@ }, /turf/closed/wall, /area/station/hallway/primary/tram/center) -"jEX" = ( -/obj/machinery/disposal/bin, -/obj/machinery/firealarm/directional/west{ - pixel_y = 5 - }, -/obj/structure/plaque/static_plaque/golden/captain{ - pixel_y = 32 - }, -/obj/structure/disposalpipe/trunk{ - dir = 2 - }, -/obj/machinery/light_switch/directional/west{ - pixel_x = -21; - pixel_y = -10 - }, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain) "jFh" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -30065,9 +29697,23 @@ /obj/structure/tank_dispenser/oxygen, /turf/open/floor/iron/dark/herringbone, /area/station/commons/vacant_room) +"jFC" = ( +/obj/machinery/vending/hydroseeds{ + slogan_delay = 700 + }, +/obj/effect/turf_decal/tile/green/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics) "jFJ" = ( /turf/closed/wall, /area/station/service/chapel/office) +"jFM" = ( +/obj/effect/turf_decal/bot, +/obj/structure/transit_tube/horizontal{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/ai_monitored/turret_protected/aisat/foyer) "jFR" = ( /turf/open/floor/iron/grimy, /area/station/ai_monitored/command/nuke_storage) @@ -30127,6 +29773,14 @@ }, /turf/open/floor/iron, /area/station/security/processing) +"jHb" = ( +/obj/structure/tank_dispenser, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/engine_smes) "jHc" = ( /obj/structure/rack, /turf/open/floor/plating, @@ -30163,6 +29817,7 @@ }, /obj/item/clothing/suit/hooded/wintercoat/engineering, /obj/item/radio/intercom/directional/east, +/obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron, /area/station/engineering/main) "jHR" = ( @@ -30236,6 +29891,22 @@ }, /turf/open/floor/iron/checker, /area/station/commons/lounge) +"jJE" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/camera/emp_proof{ + c_tag = "Engineering - Material Storage"; + dir = 10; + network = list("ss13","engineering") + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/main) "jJO" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -30246,6 +29917,19 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/exit/departure_lounge) +"jJR" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 6 + }, +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/loading_area, +/turf/open/floor/iron, +/area/station/cargo/storage) "jJX" = ( /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/effect/mapping_helpers/airlock/unres{ @@ -30266,6 +29950,26 @@ /obj/structure/plasticflaps, /turf/open/floor/plating, /area/station/cargo/sorting) +"jKg" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/commons/fitness) +"jKi" = ( +/obj/structure/table/glass, +/obj/item/storage/box/beakers, +/obj/item/storage/box/bodybags{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/item/radio/intercom/directional/east, +/obj/machinery/status_display/evac/directional/north, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "jKq" = ( /turf/closed/wall, /area/station/security/interrogation) @@ -30292,10 +29996,15 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) -"jKN" = ( -/obj/machinery/light/small/blacklight/directional/south, -/turf/open/floor/cult, -/area/station/service/chapel/office) +"jKQ" = ( +/obj/machinery/modular_computer/preset/civilian{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/science/robotics/lab) "jKV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ @@ -30320,11 +30029,6 @@ "jLf" = ( /turf/open/floor/iron/chapel, /area/station/service/chapel) -"jLj" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/shower/directional/north, -/turf/open/floor/iron/freezer, -/area/station/security/prison) "jLx" = ( /obj/machinery/ai_slipper{ uses = 10 @@ -30342,8 +30046,8 @@ /turf/open/floor/iron, /area/station/tcommsat/computer) "jLH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/closed/wall/r_wall, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply, +/turf/closed/wall, /area/station/science/ordnance) "jLI" = ( /obj/effect/turf_decal/trimline/dark_green/line{ @@ -30356,6 +30060,18 @@ /obj/machinery/atmospherics/pipe/smart/simple/green/visible, /turf/open/floor/plating, /area/station/engineering/atmos) +"jMe" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/structure/sign/nanotrasen{ + pixel_y = -32 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Civilian - Security Outpost"; + network = list("ss13","Security") + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/security/checkpoint/arrivals) "jMo" = ( /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_atmos{ dir = 8 @@ -30364,6 +30080,26 @@ /obj/machinery/atmospherics/pipe/bridge_pipe/dark/visible, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) +"jMs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/machinery/button/door/directional/west{ + id = "cytologysecure2"; + name = "Secure Pen Lockdown" + }, +/obj/machinery/requests_console/directional/north{ + department = "Cytology"; + name = "Cytology Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/ore_update, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/science/xenobiology) "jMu" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/red/filled/line, @@ -30385,21 +30121,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/tram/right) -"jMM" = ( -/obj/structure/table/reinforced, -/obj/item/storage/fancy/coffee_cart_rack{ - pixel_x = -8; - pixel_y = 6 - }, -/obj/effect/spawner/random/food_or_drink/donkpockets{ - pixel_x = 4; - pixel_y = 6 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) "jNb" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -30409,16 +30130,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"jNw" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/trimline/red/filled/line, -/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/security/brig) "jNy" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -30473,22 +30184,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"jNR" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 6 - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron, -/area/station/security/brig) "jNT" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 @@ -30496,27 +30191,6 @@ /obj/structure/chair, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"jOc" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/commons/dorms) -"jPc" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Security - Warden's Office"; - dir = 9; - network = list("ss13","Security") - }, -/obj/structure/sign/calendar/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/showroomfloor, -/area/station/security/warden) "jPd" = ( /obj/structure/transit_tube, /obj/effect/turf_decal/sand/plating, @@ -30535,19 +30209,6 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"jPw" = ( -/obj/structure/closet{ - name = "Beekeeper Uniform" - }, -/obj/item/clothing/head/utility/beekeeper_head, -/obj/item/melee/flyswatter, -/obj/effect/turf_decal/trimline/green/filled/line, -/obj/item/clothing/suit/utility/beekeeper_suit, -/obj/item/clothing/head/utility/beekeeper_head, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics) "jPx" = ( /obj/machinery/gulag_teleporter, /obj/machinery/camera/directional/south{ @@ -30571,6 +30232,14 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) +"jPY" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/wood, +/area/station/service/library) "jQa" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -30580,17 +30249,6 @@ "jQm" = ( /turf/open/floor/engine/hull, /area/station/solars/port) -"jQw" = ( -/obj/machinery/disposal/bin, -/obj/machinery/firealarm/directional/north, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) "jQE" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment{ @@ -30646,6 +30304,12 @@ }, /turf/open/floor/plating, /area/station/science/lab) +"jRS" = ( +/obj/structure/closet/secure_closet/chemical, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) "jSa" = ( /obj/structure/table/wood, /obj/effect/spawner/random/bureaucracy/briefcase{ @@ -30676,15 +30340,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) -"jSe" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 5 - }, -/obj/structure/sign/warning/rad_shelter{ - pixel_y = 32 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) "jSi" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -30731,6 +30386,11 @@ }, /turf/open/floor/plating/elevatorshaft, /area/station/maintenance/tram/mid) +"jSX" = ( +/obj/structure/industrial_lift/tram, +/obj/structure/window/reinforced/tram/directional/south, +/turf/open/openspace, +/area/station/hallway/primary/tram/center) "jTf" = ( /obj/structure/table/wood, /obj/effect/spawner/random/decoration/ornament, @@ -30738,12 +30398,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/grimy, /area/station/hallway/secondary/entry) -"jTA" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/cable/layer1, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/solars/port) "jTC" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -30760,12 +30414,13 @@ /turf/open/floor/iron, /area/station/construction/mining/aux_base) "jTQ" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/line, -/turf/open/floor/iron, -/area/station/cargo/storage) +/obj/effect/decal/cleanable/dirt/dust, +/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/bitrunner, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "jUa" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 4 @@ -30776,16 +30431,17 @@ }, /turf/open/floor/iron/white, /area/station/science/research) -"jUs" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ +"jUi" = ( +/obj/structure/industrial_lift/tram, +/obj/machinery/destination_sign/north{ + pixel_y = 10 + }, +/obj/structure/window/reinforced/tram/directional/north, +/obj/structure/chair/sofa/bench/tram/right{ dir = 8 }, -/obj/machinery/light/directional/west, -/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/secondary/exit) +/turf/open/openspace, +/area/station/hallway/primary/tram/center) "jUw" = ( /obj/structure/industrial_lift/tram, /obj/structure/fluff/tram_rail{ @@ -30877,16 +30533,37 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) +"jWg" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/camera/directional/south{ + c_tag = "Arrivals - North Hall" + }, +/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/entry) +"jWn" = ( +/obj/structure/bed/medical/emergency{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/white, +/area/station/security/medical) +"jWp" = ( +/obj/effect/turf_decal/trimline/white/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) "jWs" = ( /turf/closed/wall/r_wall, /area/station/security/execution/transfer) -"jWD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) "jWQ" = ( /obj/effect/turf_decal/tile/neutral/tram, /obj/effect/spawner/random{ @@ -31032,6 +30709,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/grimy, /area/station/service/lawoffice) +"jYb" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, +/obj/machinery/light_switch/directional/west{ + pixel_x = -22; + pixel_y = -8 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "jYe" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -31061,6 +30749,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/security) +"jYz" = ( +/obj/machinery/shieldgen, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) "jYC" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 4 @@ -31099,16 +30792,26 @@ "jYS" = ( /turf/closed/wall, /area/station/medical/chemistry) -"jZa" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/tank_holder/anesthetic, -/turf/open/floor/iron/white, -/area/station/science/robotics/lab) "jZb" = ( /obj/effect/turf_decal/stripes/white/corner, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/disposal) +"jZe" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/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/secondary/exit/departure_lounge) +"jZJ" = ( +/obj/structure/chair/plastic, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/eighties/red, +/area/station/commons/fitness/recreation/entertainment) "jZM" = ( /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, @@ -31144,6 +30847,7 @@ }, /obj/item/stack/rods/fifty, /obj/machinery/light/directional/east, +/obj/machinery/digital_clock/directional/north, /turf/open/floor/iron, /area/station/construction/mining/aux_base) "kaF" = ( @@ -31152,6 +30856,17 @@ }, /turf/open/floor/iron, /area/station/cargo/miningdock) +"kaJ" = ( +/obj/structure/closet/secure_closet/engineering_personal, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/item/clothing/suit/hooded/wintercoat/engineering, +/turf/open/floor/iron, +/area/station/engineering/main) "kaN" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 6 @@ -31178,13 +30893,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"kbe" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/light/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/hallway/secondary/construction/engineering) "kbi" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 4 @@ -31196,6 +30904,39 @@ }, /turf/open/floor/grass, /area/station/hallway/secondary/construction/engineering) +"kbq" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/tram/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/tram/filled/warning{ + dir = 4 + }, +/obj/machinery/vending/coffee{ + pixel_x = 5 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) +"kbz" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/dim/directional/south, +/turf/open/floor/iron/dark, +/area/station/service/bar) +"kbA" = ( +/obj/effect/turf_decal/stripes/white/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 4 + }, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron, +/area/station/escapepodbay) "kbF" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/turf_decal/siding/thinplating/dark{ @@ -31208,6 +30949,30 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) +"kbW" = ( +/obj/structure/table/wood, +/obj/machinery/firealarm/directional/north{ + pixel_x = -2 + }, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 8 + }, +/obj/machinery/light_switch/directional/north{ + pixel_x = 8; + pixel_y = 23 + }, +/turf/open/floor/carpet, +/area/station/service/chapel/monastery) +"kcb" = ( +/obj/structure/table/wood, +/obj/item/storage/secure/briefcase{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "kck" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 1 @@ -31215,10 +30980,50 @@ /obj/effect/turf_decal/stripes/white/line, /obj/effect/turf_decal/tile/neutral/tram, /turf/open/floor/noslip/tram_plate/energized{ - outbound = 3; - inbound = 2 + inbound = 2; + outbound = 3 }, /area/station/hallway/primary/tram/right) +"kcm" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1; + name = "O2 Outlet Pump" + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"kcp" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 1 + }, +/obj/machinery/requests_console/directional/east{ + department = "Atmospherics"; + name = "Atmospherics Requests Console" + }, +/obj/structure/cable, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"kcu" = ( +/obj/machinery/light_switch/directional/east{ + pixel_x = 23; + pixel_y = 6 + }, +/turf/open/floor/iron/dark, +/area/station/service/bar) +"kcw" = ( +/obj/structure/sign/poster/official/love_ian/directional/west, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hop) "kcA" = ( /obj/machinery/atmospherics/pipe/multiz/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/multiz/supply/hidden/layer4, @@ -31276,6 +31081,20 @@ /obj/item/kirbyplants/random, /turf/open/floor/carpet, /area/station/medical/psychology) +"kda" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/table/glass, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "kdb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/trimline/white/filled/line, @@ -31385,6 +31204,14 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"kff" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 9 + }, +/obj/machinery/airalarm/directional/north, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/iron, +/area/station/science/lower) "kfD" = ( /obj/effect/turf_decal/sand, /obj/machinery/door/airlock/external{ @@ -31420,19 +31247,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"kgt" = ( -/obj/machinery/light/directional/east, -/obj/structure/chair/sofa/middle{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/station/medical/psychology) -"kgv" = ( -/obj/structure/table/wood, -/obj/item/clothing/glasses/monocle, -/obj/item/food/pie/cream, -/turf/open/floor/wood, -/area/station/service/theater) "kgw" = ( /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/effect/decal/cleanable/dirt, @@ -31528,18 +31342,6 @@ /obj/structure/sign/clock/directional/north, /turf/open/floor/iron/dark, /area/station/engineering/engine_smes) -"kit" = ( -/obj/machinery/duct, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/light/directional/south, -/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, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "kiC" = ( /obj/structure/table/reinforced, /obj/structure/window/reinforced/spawner/directional/south, @@ -31560,6 +31362,15 @@ }, /turf/open/floor/iron/dark, /area/station/medical/storage) +"kiN" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/machinery/firealarm/directional/west, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "kiT" = ( /obj/structure/chair/office{ dir = 8 @@ -31572,7 +31383,8 @@ dir = 5 }, /obj/machinery/requests_console/directional/north{ - department = "Security" + department = "Security"; + name = "Security Requests Console" }, /turf/open/floor/iron, /area/station/security/checkpoint/supply) @@ -31584,6 +31396,18 @@ /obj/effect/turf_decal/trimline/tram/filled/warning, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) +"kjf" = ( +/obj/structure/table, +/obj/item/folder/white{ + pixel_y = 4 + }, +/obj/item/pen/red, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron, +/area/station/medical/virology) "kjm" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -31600,6 +31424,12 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"kjF" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "kjH" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/white/full, @@ -31643,16 +31473,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) -"kkf" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/white/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) "kkg" = ( /obj/structure/chair{ pixel_y = -2 @@ -31684,6 +31504,14 @@ }, /turf/open/floor/iron, /area/station/cargo/office) +"kkr" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/machinery/firealarm/directional/north, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "kkx" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -31717,17 +31545,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) -"kld" = ( -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/machinery/light_switch/directional/south{ - pixel_x = -10; - pixel_y = -24 - }, -/obj/machinery/firealarm/directional/south{ - pixel_x = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/ordnance/office) "kli" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -31745,10 +31562,6 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) -"kls" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/circuit, -/area/station/ai_monitored/command/nuke_storage) "kly" = ( /obj/structure/cable, /obj/structure/disposalpipe/junction/flip{ @@ -31809,6 +31622,12 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"kmr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible/layer2, +/obj/machinery/meter/layer2, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/science/ordnance) "kmy" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/machinery/airalarm/directional/south, @@ -31835,14 +31654,6 @@ /obj/structure/sink/kitchen/directional/south, /turf/open/floor/iron/white, /area/station/commons/vacant_room) -"knp" = ( -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/service/theater) "knO" = ( /obj/effect/turf_decal/trimline/blue/filled/corner, /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -31964,14 +31775,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"kqy" = ( -/obj/vehicle/sealed/mecha/working/ripley/cargo, -/obj/machinery/requests_console/directional/north{ - department = "Cargo Bay"; - name = "Cargo Bay Requests Console" - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "kqD" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible{ dir = 4 @@ -31991,6 +31794,25 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/port/central) +"kqK" = ( +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 4 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Civilian - Recreational Area South" + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "kqP" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -32021,6 +31843,18 @@ }, /turf/open/floor/iron, /area/station/security/prison/workout) +"krk" = ( +/obj/structure/floodlight_frame, +/obj/machinery/light/directional/north, +/turf/open/misc/asteroid, +/area/station/medical/chemistry) +"krn" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 5 + }, +/obj/item/kirbyplants/organic/plant10, +/turf/open/floor/iron/white, +/area/station/science/lobby) "kro" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -32045,28 +31879,10 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"krG" = ( -/obj/structure/reagent_dispensers/cooking_oil, -/obj/machinery/light/cold/directional/north, -/obj/effect/turf_decal/weather/snow, -/turf/open/floor/iron/kitchen_coldroom, -/area/station/service/kitchen/coldroom) "krH" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/security/brig) -"krT" = ( -/obj/structure/filingcabinet, -/obj/structure/window/spawner/directional/north, -/obj/item/paper{ - default_raw_text = "A crude mapping of the station layout based on leaked internal documents and orbital snapshots taken during construction. I'm not sure how up-to-date this is anymore.."; - icon = 'icons/obj/objects.dmi'; - icon_state = "blueprints"; - inhand_icon_state = "blueprints"; - name = "station layout" - }, -/turf/open/floor/iron/dark/small, -/area/station/commons/vacant_room) "ksa" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -32134,6 +31950,14 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) +"ktb" = ( +/obj/structure/chair/sofa/middle{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/iron, +/area/station/cargo/miningdock/cafeteria) "ktl" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/carpet, @@ -32178,16 +32002,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/entrance, /turf/open/floor/iron, /area/station/security/brig) -"kuf" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/structure/fireaxecabinet/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/station/command/bridge) "kul" = ( /obj/structure/table/reinforced, /obj/structure/window/reinforced/spawner/directional/south, @@ -32234,6 +32048,11 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) +"kuB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/bar) "kuX" = ( /obj/structure/closet/radiation, /obj/effect/turf_decal/bot, @@ -32251,6 +32070,21 @@ "kvt" = ( /turf/closed/wall, /area/station/science/genetics) +"kvO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/button/door/directional/east{ + id = "cytologysecure1"; + name = "Secure Pen Lockdown" + }, +/obj/machinery/light/directional/north, +/obj/item/soap{ + pixel_y = 2 + }, +/obj/structure/table/glass, +/turf/open/floor/iron/dark, +/area/station/science/xenobiology) "kwe" = ( /obj/structure/ladder, /turf/open/floor/iron/grimy, @@ -32287,6 +32121,13 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"kwq" = ( +/obj/structure/rack, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/spawner/random/armory/disablers, +/turf/open/floor/iron, +/area/station/ai_monitored/security/armory) "kwD" = ( /obj/effect/landmark/start/cargo_technician, /turf/open/floor/glass, @@ -32302,6 +32143,7 @@ /area/station/hallway/primary/tram/center) "kwG" = ( /obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/airalarm/directional/south, /turf/open/floor/iron, /area/station/security/execution/transfer) "kwN" = ( @@ -32330,15 +32172,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/command/heads_quarters/rd) -"kyc" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron, -/area/station/cargo/warehouse) "kye" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria, @@ -32348,6 +32181,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) +"kyw" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=2"; + location = "QM #3" + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/mob/living/simple_animal/bot/mulebot{ + home_destination = "QM #3"; + suffix = "#3" + }, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "kyF" = ( /obj/structure/table, /obj/item/storage/backpack/duffelbag/sec{ @@ -32371,6 +32217,23 @@ }, /turf/open/floor/plating, /area/station/maintenance/tram/left) +"kyN" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/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/cable, +/obj/machinery/firealarm/directional/north{ + pixel_x = 3 + }, +/obj/machinery/light_switch/directional/north{ + pixel_x = -8; + pixel_y = 23 + }, +/turf/open/floor/iron/dark, +/area/station/security/evidence) "kyU" = ( /obj/docking_port/stationary{ dir = 4; @@ -32457,13 +32320,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"kBm" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/bar{ - dir = 8 +"kBi" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 6 }, -/turf/open/floor/iron, -/area/station/escapepodbay) +/obj/machinery/firealarm/directional/east{ + pixel_y = 4 + }, +/obj/structure/table, +/obj/item/pai_card, +/turf/open/floor/iron/white, +/area/station/science/lobby) "kBo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -32509,15 +32376,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) -"kCN" = ( -/obj/structure/rack, -/obj/effect/spawner/random/techstorage/command_all, -/obj/effect/turf_decal/trimline/white/filled/line{ - dir = 1 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "kCQ" = ( /obj/machinery/duct, /obj/structure/cable, @@ -32683,14 +32541,17 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/cafeteria, /area/station/security/prison) -"kFJ" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 +"kFH" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger{ + pixel_y = 4 }, -/obj/machinery/light/directional/east, -/obj/machinery/portable_atmospherics/canister/anesthetic_mix, -/turf/open/floor/iron/dark, -/area/station/medical/treatment_center) +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) "kFT" = ( /obj/machinery/door/airlock{ id_tag = "private_f"; @@ -32721,6 +32582,26 @@ }, /turf/open/floor/iron/white, /area/station/science/research) +"kGi" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/item/storage/box/syringes{ + pixel_y = 4 + }, +/obj/item/storage/box/syringes, +/obj/item/mod/module/plasma_stabilizer, +/obj/machinery/door/window/left/directional/west{ + name = "Secure Medical Storage"; + req_access = list("medical") + }, +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/item/mod/module/signlang_radio, +/obj/item/mod/module/thermal_regulator, +/obj/item/gun/syringe, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "kGo" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -32764,11 +32645,6 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/glass, /area/station/commons/fitness/recreation) -"kGC" = ( -/obj/machinery/teleport/station, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/foyer) "kGF" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -32794,18 +32670,6 @@ }, /turf/open/floor/wood/large, /area/station/service/barber) -"kGJ" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/machinery/light/directional/south, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Civilian - Security Outpost"; - network = list("ss13","Security") - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/arrivals) "kGR" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/thinplating{ @@ -32828,6 +32692,21 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/entry) +"kHd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/shower/directional/west, +/obj/effect/turf_decal/bot, +/obj/structure/fluff{ + desc = "What, you think the water just magically soaks into the metallic flooring?"; + icon = 'icons/obj/mining_zones/survival_pod.dmi'; + icon_state = "fan_tiny"; + name = "shower drain" + }, +/obj/effect/turf_decal/tile/purple/fourcorners, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "kHn" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 1 @@ -32855,14 +32734,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /obj/machinery/air_sensor/incinerator_tank, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) -"kHu" = ( -/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/service/bar) "kHv" = ( /obj/structure/lattice/catwalk, /obj/structure/marker_beacon/burgundy, @@ -32877,23 +32750,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/cmo) -"kHA" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/light/directional/west, -/obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Material Storage"; - dir = 10; - network = list("ss13","engineering") - }, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/main) "kHB" = ( /turf/open/floor/grass, /area/station/medical/virology) @@ -32915,27 +32771,20 @@ /obj/structure/table, /turf/open/floor/iron, /area/station/security/prison) -"kHX" = ( -/obj/structure/table/wood, -/obj/machinery/recharger{ - pixel_x = 5 - }, -/obj/item/paper_bin{ - pixel_x = -5; - pixel_y = 4 - }, -/obj/item/pen{ - pixel_x = -4 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) "kHZ" = ( /obj/structure/railing{ dir = 4 }, /turf/open/floor/catwalk_floor, /area/station/command/gateway) +"kIh" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) "kIi" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -32947,6 +32796,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"kIz" = ( +/obj/structure/closet/secure_closet/security/sec, +/obj/machinery/status_display/evac/directional/east, +/obj/effect/turf_decal/bot, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/showroomfloor, +/area/station/security/lockers) "kIE" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -32979,6 +32835,12 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"kIU" = ( +/obj/machinery/airalarm/directional/east, +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/processing) "kIZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32996,6 +32858,13 @@ }, /turf/open/misc/asteroid/airless, /area/station/asteroid) +"kJA" = ( +/obj/machinery/computer/rdservercontrol{ + dir = 1 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/circuit/green, +/area/station/science/server) "kJU" = ( /obj/structure/chair/comfy/beige, /turf/open/floor/iron/grimy, @@ -33038,14 +32907,6 @@ }, /turf/open/floor/iron/white, /area/station/science/explab) -"kKp" = ( -/obj/structure/closet/wardrobe/mixed, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms/laundry) "kKB" = ( /obj/machinery/door/airlock{ name = "Law Office" @@ -33071,6 +32932,16 @@ "kLz" = ( /turf/closed/wall/r_wall, /area/station/security/prison/work) +"kLI" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "kLJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -33084,33 +32955,6 @@ /obj/effect/turf_decal/box, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"kLV" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"kMa" = ( -/obj/structure/window/spawner/directional/north, -/obj/structure/table/glass, -/obj/item/storage/box/monkeycubes{ - pixel_x = -7; - pixel_y = 7 - }, -/obj/item/infuser_book{ - pixel_x = 5; - pixel_y = 3 - }, -/obj/item/storage/pill_bottle/mutadone{ - pixel_x = 9; - pixel_y = 3 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/dark_green/fourcorners, -/turf/open/floor/iron/white, -/area/station/science/genetics) "kMc" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron, @@ -33136,25 +32980,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/storage) -"kMv" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/trimline/neutral/filled/line, +"kMs" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/white/warning{ - dir = 1 +/obj/structure/disposalpipe/segment{ + dir = 6 }, -/turf/open/floor/iron, -/area/station/maintenance/tram/left) -"kMw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/generic_maintenance_landmark, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "kMD" = ( /obj/machinery/duct, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -33240,6 +33073,11 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"kNo" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/wood, +/area/station/service/bar/backroom) "kNr" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -33256,13 +33094,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/tram/right) -"kNC" = ( -/obj/machinery/light/dim/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) "kNE" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -33289,12 +33120,6 @@ "kNT" = ( /turf/open/floor/glass/reinforced/tram, /area/station/hallway/primary/tram/center) -"kOc" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/miningdock/cafeteria) "kOf" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -33363,19 +33188,6 @@ }, /turf/open/floor/carpet, /area/station/command/heads_quarters/hos) -"kPj" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/obj/machinery/airalarm/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Departures - Security Outpost"; - network = list("ss13","Security") - }, -/obj/machinery/computer/records/security, -/turf/open/floor/iron, -/area/station/security/checkpoint/escape) "kPo" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -33414,18 +33226,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"kQr" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 1 - }, -/obj/machinery/light/directional/east, -/obj/machinery/requests_console/directional/east{ - department = "Atmospherics"; - name = "Atmospherics Requests Console" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos) "kQy" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/machinery/computer/crew{ @@ -33467,11 +33267,6 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron, /area/station/security/checkpoint/arrivals) -"kRi" = ( -/obj/machinery/telecomms/relay/preset/station, -/obj/effect/turf_decal/box, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) "kRm" = ( /obj/machinery/door/airlock/command{ name = "Captain's Quarters" @@ -33512,6 +33307,15 @@ "kRR" = ( /turf/open/misc/grass/jungle, /area/station/science/explab) +"kRW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 4 + }, +/obj/structure/rack, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/iron, +/area/station/maintenance/port/central) "kSa" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -33546,11 +33350,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"kSE" = ( -/obj/structure/closet/crate/coffin, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/service/chapel/monastery) "kSL" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 8 @@ -33582,16 +33381,13 @@ }, /turf/open/floor/iron/stairs/left, /area/station/hallway/secondary/construction/engineering) -"kTw" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 +"kTz" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Hallway - Port Tram Platform North" }, -/obj/effect/landmark/start/prisoner, -/turf/open/floor/iron, -/area/station/security/prison/safe) +/obj/machinery/light/directional/west, +/turf/open/floor/noslip/tram, +/area/station/hallway/primary/tram/left) "kTI" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 5 @@ -33611,6 +33407,36 @@ /obj/structure/cable, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) +"kTR" = ( +/obj/structure/closet{ + name = "Beekeeper Uniform" + }, +/obj/item/clothing/head/utility/beekeeper_head, +/obj/item/melee/flyswatter, +/obj/effect/turf_decal/trimline/green/filled/line, +/obj/item/clothing/suit/utility/beekeeper_suit, +/obj/item/clothing/head/utility/beekeeper_head, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/dim/directional/south, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics) +"kTS" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 4 + }, +/obj/machinery/airalarm/directional/south, +/obj/structure/cable, +/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/white, +/area/station/medical/pharmacy) "kTT" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 4 @@ -33641,6 +33467,18 @@ }, /turf/open/floor/iron/white, /area/station/science/lab) +"kUg" = ( +/obj/structure/reagent_dispensers/watertank/high, +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green/fourcorners, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics) "kUm" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -33658,6 +33496,13 @@ /obj/machinery/shower/directional/west, /turf/open/floor/iron, /area/station/engineering/main) +"kUu" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/security/prison/workout) "kUF" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -33733,16 +33578,6 @@ /obj/effect/turf_decal/trimline/neutral/filled/corner, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"kVw" = ( -/obj/structure/table/wood, -/obj/item/storage/crayons, -/obj/item/toy/crayon/spraycan, -/obj/item/toy/crayon/spraycan{ - pixel_x = -4 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/grimy, -/area/station/service/library/lounge) "kVP" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -33753,6 +33588,15 @@ /obj/effect/turf_decal/trimline/neutral/filled/corner, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"kVQ" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/light/cold/directional/north, +/obj/item/storage/box/bandages, +/turf/open/floor/iron/white, +/area/station/security/medical) "kVV" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -33765,14 +33609,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) -"kWk" = ( -/obj/machinery/portable_atmospherics/canister/plasma, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/sign/warning/no_smoking/circle/directional/west, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/storage) "kWp" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -33923,46 +33759,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/explab) -"kYp" = ( -/obj/structure/industrial_lift/tram, -/obj/structure/window/reinforced/tram/right/directional/south, -/obj/machinery/destination_sign/south{ - pixel_y = -11 - }, -/obj/effect/landmark/start/hangover, -/obj/structure/chair/sofa/bench/tram/right{ - dir = 4 - }, -/turf/open/openspace, -/area/station/hallway/primary/tram/center) -"kYs" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/spawner/random/trash/graffiti{ - pixel_y = -32; - spawn_loot_chance = 50 - }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/white/warning{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/tram/right) -"kYy" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet, -/area/station/commons/vacant_room/office) -"kYH" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) "kYL" = ( /obj/effect/spawner/random/structure/closet_private, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -33983,13 +33779,6 @@ "kZh" = ( /turf/open/floor/eighties/red, /area/station/commons/fitness/recreation/entertainment) -"kZj" = ( -/obj/machinery/shower/directional/north, -/obj/structure/curtain, -/obj/item/soap/syndie, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/showroomfloor, -/area/station/commons/vacant_room) "kZt" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -34078,6 +33867,14 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"lan" = ( +/obj/vehicle/sealed/mecha/ripley/cargo, +/obj/machinery/requests_console/directional/north{ + department = "Cargo Bay"; + name = "Cargo Bay Requests Console" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "lav" = ( /obj/machinery/holopad, /obj/effect/turf_decal/trimline/neutral/corner{ @@ -34099,6 +33896,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/tram/nav/immovable_rod, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "lax" = ( @@ -34108,17 +33906,6 @@ /obj/effect/turf_decal/trimline/yellow/filled/corner, /turf/open/floor/iron, /area/station/engineering/main) -"laz" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/gravity_generator) -"laA" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/machinery/portable_atmospherics/pump, -/turf/open/floor/iron, -/area/station/engineering/atmos) "laM" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 6 @@ -34182,17 +33969,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation/entertainment) -"lcc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/light_switch/directional/north{ - pixel_x = 9 - }, -/turf/open/floor/iron/dark, -/area/station/science/server) "lcf" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Atmospherics Maintenance" @@ -34204,28 +33980,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"lcl" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/structure/disposalpipe/trunk{ - dir = 2 - }, -/obj/structure/sign/collision_counter{ - pixel_x = 32 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"lcn" = ( -/obj/structure/table, -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/item/storage/box/prisoner{ - pixel_y = 8 - }, -/obj/item/storage/box/prisoner, -/turf/open/floor/iron, -/area/station/security/brig) "lco" = ( /obj/machinery/computer/shuttle/mining/common{ dir = 8 @@ -34297,50 +34051,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos) -"ldz" = ( -/obj/machinery/vending/coffee, -/obj/machinery/status_display/ai/directional/east, -/obj/machinery/light/directional/east, -/turf/open/floor/wood/parquet, -/area/station/command/meeting_room) -"ldD" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - 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/small/directional/east, -/turf/open/floor/iron/dark, -/area/station/maintenance/central/greater) -"ldG" = ( -/obj/structure/cable, -/obj/machinery/firealarm/directional/west{ - pixel_y = -5 - }, -/obj/machinery/light_switch/directional/west{ - pixel_x = -22; - pixel_y = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/cafeteria, -/area/station/command/heads_quarters/rd) -"ldL" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/turf_decal/siding/thinplating, -/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, -/obj/effect/turf_decal/trimline/white/warning, -/turf/open/floor/iron, -/area/station/maintenance/tram/mid) "lej" = ( /obj/effect/turf_decal/trimline/tram/filled/line{ dir = 1 @@ -34365,6 +34075,12 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"leO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron/smooth, +/area/station/maintenance/tram/mid) "leZ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door_buttons/airlock_controller{ @@ -34447,6 +34163,11 @@ }, /turf/open/floor/iron/checker, /area/station/commons/lounge) +"lgK" = ( +/obj/structure/railing, +/obj/structure/lattice, +/turf/open/openspace, +/area/station/asteroid) "lgO" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -34467,6 +34188,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/tram/mid) +"lho" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron, +/area/station/maintenance/tram/left) "lhI" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -34506,6 +34232,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor, /area/station/solars/starboard/fore) +"lhV" = ( +/obj/structure/displaycase/trophy, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/wood/large, +/area/station/service/library) "lib" = ( /obj/machinery/telecomms/server/presets/security, /turf/open/floor/iron/dark/telecomms, @@ -34516,13 +34247,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/hallway) -"liH" = ( -/obj/machinery/light/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/wood, -/area/station/command/heads_quarters/captain) "liN" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, @@ -34614,15 +34338,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/engineering/main) -"lkv" = ( -/obj/structure/table, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/item/paper_bin, -/turf/open/floor/iron, -/area/station/tcommsat/computer) "lkD" = ( /obj/structure/table, /obj/item/wirecutters, @@ -34653,16 +34368,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison) -"lkV" = ( -/obj/structure/table/reinforced, -/obj/machinery/firealarm/directional/west, -/obj/item/storage/box, -/obj/item/hand_labeler{ - pixel_y = 8 - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron, -/area/station/cargo/sorting) "lkZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -34761,6 +34466,20 @@ "lml" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmos/pumproom) +"lmn" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating{ + dir = 4 + }, +/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/cold/directional/west, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "lmy" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -34792,6 +34511,7 @@ /area/station/cargo/sorting) "lnh" = ( /obj/machinery/door/poddoor/massdriver_chapel, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/station/service/chapel/monastery) "lnk" = ( @@ -34901,6 +34621,16 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat_interior) +"loG" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/structure/closet/secure_closet/brig{ + id = "medcell"; + name = "Medical Cell Locker" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/science) "loJ" = ( /obj/structure/fireaxecabinet/mechremoval/directional/north, /obj/structure/reagent_dispensers/fueltank, @@ -34915,6 +34645,23 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/checkpoint/escape) +"lpg" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/obj/item/radio/intercom/directional/south, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/security/brig) "lpu" = ( /obj/structure/table, /obj/item/camera, @@ -34958,14 +34705,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/courtroom/holding) -"lpF" = ( -/obj/vehicle/ridden/wheelchair, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "lpS" = ( /obj/effect/turf_decal/bot, /obj/structure/transit_tube, @@ -34981,13 +34720,6 @@ /obj/effect/mapping_helpers/airlock/access/all/science/robotics, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/science) -"lqj" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/trimline/neutral/corner, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) "lqy" = ( /obj/effect/turf_decal/tile/blue/half/contrasted, /obj/effect/turf_decal/tile/neutral{ @@ -35001,6 +34733,12 @@ }, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/foyer) +"lqS" = ( +/obj/structure/table/wood, +/obj/item/book/bible, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/carpet, +/area/station/service/chapel/monastery) "lqT" = ( /turf/open/floor/iron/stairs/right, /area/station/command/gateway) @@ -35019,6 +34757,15 @@ /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/plating, /area/station/hallway/secondary/exit/departure_lounge) +"lrq" = ( +/obj/structure/table, +/obj/item/radio/intercom/prison/directional/south, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "lrt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -35057,6 +34804,26 @@ /obj/structure/cable/multilayer/connected, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) +"lry" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) +"lrA" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/structure/table/glass, +/obj/item/book/manual/wiki/infections{ + pixel_y = 7 + }, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/reagent_containers/syringe/antiviral, +/obj/machinery/status_display/ai/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/virology) "lrG" = ( /obj/effect/turf_decal/sand/plating, /obj/item/flashlight/flare, @@ -35092,6 +34859,26 @@ "lse" = ( /turf/open/floor/carpet, /area/station/service/theater) +"lss" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/random/contraband/prison, +/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, +/turf/open/floor/iron/cafeteria, +/area/station/security/prison/mess) "lst" = ( /obj/machinery/power/terminal, /obj/structure/cable, @@ -35157,6 +34944,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) +"lul" = ( +/obj/structure/table, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron, +/area/station/medical/virology) "luy" = ( /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/dark, @@ -35186,6 +34978,16 @@ }, /turf/open/floor/wood, /area/station/service/library) +"luY" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + 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/dim/directional/east, +/turf/open/floor/iron/dark, +/area/station/maintenance/central/greater) "lvb" = ( /obj/effect/turf_decal/trimline/purple/filled/corner, /obj/effect/turf_decal/trimline/purple/filled/corner{ @@ -35206,6 +35008,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) +"lvg" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Security - Prison Main South-West"; + network = list("ss13","Security","prison") + }, +/turf/open/floor/iron, +/area/station/security/prison) "lvm" = ( /obj/machinery/computer/records/security{ dir = 1 @@ -35213,16 +35025,43 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/office) -"lvo" = ( -/obj/structure/sign/warning/secure_area/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Hallway - Mid Left Command" +"lvz" = ( +/obj/effect/turf_decal/caution/stand_clear/red{ + dir = 1 }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ +/obj/structure/industrial_lift/public, +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/elevator_control_panel/directional/west{ + linked_elevator_id = "tram_perma_lift"; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/security/execution/transfer) +"lvH" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 }, +/obj/machinery/light/directional/north, /turf/open/floor/iron, -/area/station/hallway/secondary/command) +/area/station/security/office) +"lvK" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 5 + }, +/obj/machinery/requests_console/directional/north{ + department = "Cargo Bay"; + name = "Cargo Bay Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/office) "lwd" = ( /obj/machinery/door/airlock/security{ name = "Security Checkpoint" @@ -35243,18 +35082,18 @@ /obj/structure/cable, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"lwt" = ( +/obj/machinery/atmospherics/components/binary/pump/on/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/science/ordnance) "lwx" = ( /obj/structure/disposalpipe/segment{ dir = 6 }, /turf/open/floor/carpet, /area/station/service/library) -"lwy" = ( -/obj/machinery/porta_turret/ai, -/obj/machinery/light/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) "lwB" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -35397,6 +35236,13 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) +"lyH" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/spawner/random/armory/bulletproof_armor, +/obj/effect/spawner/random/armory/bulletproof_helmet, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "lyK" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 4 @@ -35430,10 +35276,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/tram/left) -"lyW" = ( -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "lzc" = ( /obj/machinery/door/airlock/external{ name = "Solar Maintenance" @@ -35471,17 +35313,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/virology) -"lAz" = ( -/obj/machinery/light/dim/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Civilian - Skill Games" - }, -/obj/effect/turf_decal/trimline/dark_green/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/dark_blue/corner, -/turf/open/floor/iron/dark, -/area/station/commons/lounge) "lAA" = ( /obj/structure/chair/stool/bar/directional/west, /turf/open/floor/iron, @@ -35509,6 +35340,19 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"lBb" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/machinery/button/door/directional/west{ + id = "ToiletSci2"; + name = "Lock Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron/freezer, +/area/station/science/lower) "lBF" = ( /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ dir = 8 @@ -35542,18 +35386,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/cargo/storage) -"lBZ" = ( -/obj/structure/table, -/obj/item/storage/toolbox/electrical{ - pixel_x = -2; - pixel_y = 10 - }, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) "lCk" = ( /obj/machinery/door/airlock/atmos{ name = "The Pipe Cave" @@ -35573,27 +35405,37 @@ "lCy" = ( /turf/closed/wall/r_wall, /area/station/hallway/secondary/exit) -"lCE" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/closet/emcloset, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/hallway/primary/tram/right) -"lCO" = ( -/obj/machinery/light/directional/north, -/turf/open/openspace, -/area/station/security/brig) -"lCT" = ( -/obj/effect/turf_decal/trimline/white/filled/line{ +"lCA" = ( +/obj/machinery/chem_mass_spec, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"lDl" = ( +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/light_switch/directional/east{ + pixel_x = 22; + pixel_y = 8 + }, +/turf/open/floor/iron/freezer, +/area/station/medical/coldroom) +"lDo" = ( +/obj/structure/table, +/obj/item/storage/box/prisoner, +/obj/item/storage/box/prisoner{ + pixel_y = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"lDm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/obj/item/paper/fluff/genpop_instructions, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "lDt" = ( /obj/structure/sign/departments/medbay/alt, /turf/closed/wall, @@ -35673,6 +35515,25 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos) +"lEq" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating{ + dir = 8 + }, +/obj/machinery/firealarm/directional/east, +/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/commons/fitness/recreation) +"lEr" = ( +/obj/structure/table/wood, +/turf/open/floor/iron/chapel{ + dir = 4 + }, +/area/station/service/chapel) "lEt" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/oxygen_output{ chamber_id = "o2ordance"; @@ -35680,12 +35541,29 @@ }, /turf/open/floor/engine/o2, /area/station/science/ordnance/storage) +"lED" = ( +/obj/effect/turf_decal/trimline/red/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/brig{ + id = "engcell"; + name = "Engineering Cell Locker" + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/security/checkpoint/engineering) "lEI" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 10 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "lEL" = ( @@ -35756,6 +35634,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/service/bar) +"lGp" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/light/dim/directional/south, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/left) "lGu" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, @@ -35787,20 +35674,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/engine_smes) -"lGV" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 6 - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/turf_decal/loading_area, -/turf/open/floor/iron, -/area/station/cargo/storage) "lHa" = ( /obj/structure/chair/office{ dir = 4 @@ -35812,16 +35685,11 @@ }, /turf/open/floor/iron/grimy, /area/station/ai_monitored/turret_protected/aisat/foyer) -"lHl" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) +"lHp" = ( +/obj/effect/turf_decal/sand/plating, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "lHs" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 @@ -35847,6 +35715,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) +"lHz" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron, +/area/station/commons/dorms) "lHU" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -35910,6 +35785,18 @@ }, /turf/open/floor/catwalk_floor, /area/station/hallway/primary/tram/left) +"lIS" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/bluespace_vendor/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/escapepodbay) "lIZ" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible{ @@ -35979,12 +35866,29 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/security/courtroom) +"lKc" = ( +/obj/structure/table/wood, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/wood/tile, +/area/station/service/chapel) "lKe" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit, /area/station/ai_monitored/command/nuke_storage) +"lKE" = ( +/obj/structure/table, +/obj/item/storage/box/donkpockets, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/machinery/light_switch/directional/east{ + pixel_x = 23; + pixel_y = -8 + }, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) "lKI" = ( /obj/structure/chair/stool/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/violet/visible, @@ -36000,6 +35904,20 @@ /obj/item/pillow/random, /turf/open/floor/wood, /area/station/commons/dorms) +"lLx" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 6 + }, +/obj/machinery/vending/wardrobe/cargo_wardrobe, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/cargo/storage) "lLB" = ( /obj/structure/rack, /obj/item/reagent_containers/cup/bottle/ethanol{ @@ -36032,6 +35950,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos) +"lMa" = ( +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/machinery/firealarm/directional/south{ + pixel_x = 1 + }, +/turf/open/floor/iron/white, +/area/station/science/ordnance/office) "lMg" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -36053,12 +35978,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/gravity_generator) -"lMn" = ( -/obj/structure/table, -/obj/machinery/microwave, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/white/side, -/area/station/service/kitchen) "lMw" = ( /obj/machinery/door/airlock{ id_tag = "Toilet3"; @@ -36134,24 +36053,32 @@ }, /turf/open/floor/iron, /area/station/engineering/main) -"lNd" = ( -/obj/structure/railing{ - dir = 4 +"lNl" = ( +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 1 }, -/obj/machinery/light/directional/west, -/obj/machinery/camera{ - c_tag = "Secure - AI Upper Ring East"; - dir = 10; - network = list("aicore") +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 8 }, -/turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/engineering/atmos) "lNm" = ( /obj/effect/turf_decal/trimline/white/warning{ dir = 9 }, /turf/open/floor/engine/hull, /area/station/solars/port) +"lNp" = ( +/obj/machinery/field/generator, +/obj/machinery/camera/emp_proof{ + c_tag = "Engineering - Secure Storage"; + dir = 9; + network = list("ss13","engineering") + }, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) "lNF" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -36246,18 +36173,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/courtroom/holding) -"lPd" = ( -/obj/structure/table/wood, -/obj/item/storage/box/pdas{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/storage/box/pdas, -/obj/item/papercutter{ - pixel_x = -4 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) "lPl" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron, @@ -36266,16 +36181,6 @@ /obj/machinery/door/poddoor/incinerator_atmos_main, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) -"lPT" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/obj/item/reagent_containers/cup/bottle/multiver, -/obj/item/reagent_containers/cup/bottle/epinephrine, -/turf/open/floor/iron/white, -/area/station/security/medical) "lPU" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -36335,21 +36240,17 @@ /obj/item/cultivator, /turf/open/floor/iron/dark, /area/station/security/prison/garden) -"lQC" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"lQE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/security/courtroom/holding) "lQM" = ( /turf/closed/wall/r_wall, /area/station/maintenance/port/central) +"lQT" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 6 + }, +/obj/structure/closet/l3closet/virology, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/virology) "lRr" = ( /obj/effect/mapping_helpers/iannewyear, /obj/structure/disposalpipe/segment{ @@ -36391,17 +36292,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"lRQ" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/corner, -/obj/machinery/light/directional/west, -/obj/item/radio/intercom/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/dorms) "lSo" = ( /turf/open/floor/glass/reinforced, /area/station/security/brig) @@ -36412,11 +36302,6 @@ }, /turf/open/floor/iron, /area/station/tcommsat/computer) -"lSu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/station/service/lawoffice) "lSv" = ( /obj/structure/table/wood, /obj/structure/mirror/directional/south, @@ -36453,20 +36338,23 @@ /obj/effect/landmark/start/lawyer, /turf/open/floor/wood, /area/station/service/lawoffice) +"lSM" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/cargo/lobby) "lSQ" = ( /obj/structure/disposalpipe/sorting/wrap/flip{ dir = 1 }, /turf/closed/wall, /area/station/cargo/sorting) -"lSW" = ( -/obj/machinery/computer/robotics{ - dir = 1 - }, -/obj/structure/sign/calendar/directional/south, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron/cafeteria, -/area/station/command/heads_quarters/rd) "lTc" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -36475,13 +36363,27 @@ /obj/effect/landmark/start/paramedic, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"lTf" = ( -/obj/machinery/door/airlock{ - id_tag = "commissarydoor"; - name = "Barber Storage" +"lTg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/plating, -/area/station/service/barber) +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) +"lTm" = ( +/obj/structure/table, +/obj/item/radio/intercom/prison/directional/east, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/obj/machinery/camera{ + c_tag = "Security - Prison Cell 4"; + dir = 6; + network = list("ss13","Security","prison","pcell") + }, +/turf/open/floor/iron, +/area/station/security/prison/safe) "lTM" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 8 @@ -36498,6 +36400,9 @@ /obj/effect/turf_decal/stripes/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, /area/station/cargo/storage) "lTP" = ( @@ -36568,18 +36473,20 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/lobby) +"lUe" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/machinery/airalarm/directional/north, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron, +/area/station/engineering/atmos) "lUf" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"lUo" = ( -/obj/effect/turf_decal/stripes/end{ - 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/ai_monitored/security/armory) "lUr" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/trimline/red/filled/corner{ @@ -36594,6 +36501,15 @@ "lUw" = ( /turf/closed/wall, /area/station/security/courtroom) +"lUz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/light/dim/directional/south, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "lUE" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -36625,17 +36541,10 @@ /turf/open/floor/engine/vacuum, /area/station/science/ordnance/burnchamber) "lUP" = ( -/obj/effect/landmark/tram/tramstation/west, /obj/effect/turf_decal/tile/neutral/tram, +/obj/effect/landmark/tram/platform/tramstation/west, /turf/open/floor/noslip/tram_plate, /area/station/hallway/primary/tram/left) -"lUR" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/white, -/area/station/science/lower) "lUZ" = ( /obj/machinery/navbeacon{ codes_txt = "delivery;dir=8"; @@ -36669,6 +36578,11 @@ "lVi" = ( /turf/closed/wall, /area/station/maintenance/department/science) +"lVu" = ( +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/obj/machinery/light/floor, +/turf/open/floor/engine/co2, +/area/station/engineering/atmos) "lVz" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 8 @@ -36692,6 +36606,18 @@ }, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"lVJ" = ( +/obj/machinery/disposal/bin, +/obj/machinery/firealarm/directional/north, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) "lVK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -36712,6 +36638,21 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) +"lWu" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/structure/table/reinforced, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/blood_filter, +/obj/item/clothing/gloves/latex/nitrile, +/obj/machinery/light_switch/directional/east{ + pixel_x = 22; + pixel_y = -9 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/surgery/fore) "lWv" = ( /obj/structure/table, /obj/machinery/button/door{ @@ -36763,6 +36704,16 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/iron/white, /area/station/science/genetics) +"lWZ" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/engineering/main) "lXd" = ( /obj/effect/turf_decal/trimline/dark_green/filled/end, /turf/open/floor/iron/white, @@ -36771,21 +36722,6 @@ /obj/structure/cable, /turf/open/floor/wood/large, /area/station/service/library) -"lXv" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 8 - }, -/obj/structure/railing{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 10 - }, -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "lXC" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -36833,24 +36769,6 @@ }, /turf/open/floor/iron/freezer, /area/station/medical/coldroom) -"lYr" = ( -/obj/structure/table, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/item/stamp{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/stamp/denied{ - pixel_x = 4; - pixel_y = -2 - }, -/obj/machinery/light_switch/directional/east{ - pixel_y = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/office) "lYA" = ( /obj/structure/easel, /obj/item/canvas/twentythree_twentythree, @@ -36866,6 +36784,20 @@ }, /turf/open/floor/iron, /area/station/commons/storage/art) +"lYZ" = ( +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/machinery/button/door/directional/west{ + id = "Toilet3"; + name = "Lock Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/effect/landmark/start/hangover, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet) "lZl" = ( /turf/open/floor/iron/stairs/left, /area/station/command/gateway) @@ -36881,10 +36813,10 @@ /turf/open/floor/iron, /area/station/security/checkpoint/arrivals) "lZJ" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2{ +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 }, -/obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/white, /area/station/science/ordnance) "lZW" = ( @@ -36900,6 +36832,14 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"mad" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/computer/records/medical, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "mai" = ( /obj/machinery/holopad, /obj/effect/landmark/start/scientist, @@ -36913,16 +36853,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/exit) -"mas" = ( -/obj/machinery/mass_driver/trash{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, -/obj/structure/sign/warning/vacuum/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "may" = ( /turf/open/floor/plating, /area/station/hallway/secondary/exit/departure_lounge) @@ -36958,6 +36888,17 @@ }, /turf/open/space/basic, /area/space) +"mbk" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Security - Rec Room West"; + network = list("ss13","Security","prison") + }, +/turf/open/floor/iron, +/area/station/security/prison/workout) "mbm" = ( /obj/structure/rack, /obj/item/pickaxe, @@ -37146,13 +37087,19 @@ }, /turf/open/floor/iron/white, /area/station/science/lobby) -"mew" = ( -/obj/structure/table, -/obj/structure/bedsheetbin, -/obj/machinery/light/directional/east, -/obj/item/radio/intercom/prison/directional/east, -/turf/open/floor/iron/cafeteria, -/area/station/security/prison) +"meA" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 9 + }, +/obj/machinery/airalarm/directional/north, +/obj/structure/disposalpipe/trunk, +/obj/machinery/light_switch/directional/west{ + pixel_x = -23; + pixel_y = -8 + }, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics) "meD" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -37199,20 +37146,6 @@ }, /turf/open/floor/iron/dark, /area/station/commons/lounge) -"mfT" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/obj/structure/showcase/cyborg/old{ - dir = 4; - pixel_x = -9; - pixel_y = 2 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/science/lower) "mfU" = ( /obj/structure/chair/office/light{ dir = 4 @@ -37269,6 +37202,12 @@ /obj/structure/cable, /turf/open/floor/circuit/green, /area/station/ai_monitored/turret_protected/ai) +"mgq" = ( +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/command/bridge) "mgB" = ( /obj/machinery/computer/security/telescreen/entertainment/directional/south, /obj/structure/disposalpipe/segment{ @@ -37345,18 +37284,6 @@ /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/plating, /area/station/hallway/primary/tram/center) -"mhY" = ( -/obj/effect/turf_decal/box, -/obj/structure/fluff{ - desc = "Ew, I think I see a hairball."; - icon = 'icons/obj/lavaland/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, -/obj/machinery/shower/directional/west, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "min" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -37398,11 +37325,17 @@ /obj/machinery/computer/security/telescreen/entertainment/directional/east, /turf/open/floor/wood/large, /area/station/service/barber) -"miQ" = ( -/obj/structure/closet/secure_closet/hop, -/obj/structure/sign/clock/directional/west, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hop) +"miR" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Hallway - Upper Left Command"; + dir = 6 + }, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) "miU" = ( /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/components/binary/pump{ @@ -37411,21 +37344,6 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"miW" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/south{ - c_tag = "Maintenance - West Tram Tunnel 1" - }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/white/warning{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/maintenance/tram/left) "mjd" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/cable, @@ -37433,12 +37351,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) -"mjf" = ( -/obj/structure/ladder, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/smooth, -/area/station/maintenance/tram/mid) +"mjx" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "mjF" = ( /obj/structure/disposalpipe/sorting/mail/flip{ dir = 4 @@ -37459,12 +37378,6 @@ "mjM" = ( /turf/closed/wall, /area/station/security/medical) -"mkf" = ( -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/opposingcorners, -/turf/open/floor/iron/freezer, -/area/station/medical/coldroom) "mki" = ( /obj/machinery/door/airlock/command{ name = "Head of Personnel" @@ -37486,6 +37399,7 @@ /obj/item/stack/package_wrap, /obj/item/hand_labeler, /obj/structure/rack, +/obj/machinery/light/cold/directional/east, /turf/open/floor/iron/white/side{ dir = 8 }, @@ -37523,6 +37437,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/large, /area/station/service/library) +"mld" = ( +/obj/effect/landmark/navigate_destination/dockescpod2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/window/brigdoor/left/directional/west{ + name = "Security Delivery Chute"; + req_access = list("security") + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/smooth, +/area/station/security/office) "mlj" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -37554,18 +37483,6 @@ }, /turf/open/floor/iron, /area/station/science/robotics/mechbay) -"mlE" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/landmark/generic_maintenance_landmark, -/turf/open/floor/carpet, -/area/station/cargo/miningdock) -"mlI" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/fitness) "mlM" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -37577,14 +37494,6 @@ /obj/structure/displaycase/labcage, /turf/open/floor/iron/cafeteria, /area/station/command/heads_quarters/rd) -"mma" = ( -/obj/structure/table/glass, -/obj/machinery/reagentgrinder, -/obj/machinery/light/directional/west, -/obj/structure/sign/clock/directional/west, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) "mmk" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -37618,6 +37527,15 @@ /obj/machinery/meter, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"mmX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/structure/table, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "mng" = ( /obj/structure/window/reinforced/plasma/spawner/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, @@ -37649,40 +37567,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/cargo/miningdock) -"mnJ" = ( -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" - }, -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/turf_decal/tile/blue/opposingcorners, -/turf/open/floor/iron/freezer, -/area/station/medical/coldroom) -"mof" = ( -/obj/machinery/flasher/directional/east{ - id = "hopflash" - }, -/obj/structure/railing, -/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/dark_blue/corner{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hop) -"mon" = ( -/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/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron, -/area/station/science/ordnance/testlab) "moo" = ( /obj/machinery/door/airlock/security{ name = "Security Office" @@ -37727,14 +37611,22 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron, /area/station/security/checkpoint/science) -"moP" = ( -/obj/structure/table/wood, -/obj/effect/turf_decal/siding/wood{ +"moQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/end{ dir = 1 }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/wood, -/area/station/service/library) +/obj/structure/closet/secure_closet/research_director, +/obj/machinery/camera/directional/south{ + c_tag = "Science - Research Director's Office"; + network = list("ss13","rd") + }, +/obj/machinery/light_switch/directional/south{ + pixel_x = -8; + pixel_y = -24 + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/rd) "moU" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 5 @@ -37760,11 +37652,9 @@ /obj/effect/turf_decal/trimline/tram/filled/warning, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) -"mpq" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/secondary/construction/engineering) +"mpd" = ( +/turf/open/floor/engine/o2, +/area/station/science/ordnance/storage) "mpw" = ( /obj/machinery/hydroponics/soil, /turf/open/floor/grass, @@ -37809,12 +37699,6 @@ /obj/item/pen, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) -"mqe" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/power/shieldwallgen, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/command/teleporter) "mqq" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/line, @@ -37828,12 +37712,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/tram/mid) -"mqw" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/ce) "mqK" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/thinplating{ @@ -37855,14 +37733,26 @@ /turf/open/floor/iron/white, /area/station/medical/storage) "mrg" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=1"; - location = "QM #4" +/obj/effect/turf_decal/trimline/brown/line, +/obj/effect/turf_decal/stripes, +/obj/structure/table/reinforced, +/obj/item/reagent_containers/cup/glass/mug/coco{ + pixel_x = -7; + pixel_y = 7 }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron, -/area/station/cargo/storage) +/obj/item/reagent_containers/cup/glass/mug/coco{ + pixel_x = -6; + pixel_y = -1 + }, +/obj/item/folder/yellow{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/item/pen{ + pixel_x = 6 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "mrr" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/line, @@ -37932,18 +37822,15 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"msx" = ( +/obj/machinery/teleport/hub, +/turf/open/floor/circuit, +/area/station/command/teleporter) "msF" = ( /obj/structure/filingcabinet/filingcabinet, /obj/machinery/status_display/evac/directional/south, /turf/open/floor/carpet, /area/station/medical/psychology) -"msM" = ( -/obj/structure/railing, -/obj/machinery/door/firedoor/border_only, -/obj/effect/landmark/event_spawn, -/obj/machinery/light/directional/north, -/turf/open/floor/glass/reinforced, -/area/station/science/research) "msU" = ( /obj/structure/rack, /obj/effect/spawner/random/techstorage/tcomms_all, @@ -37953,6 +37840,18 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) +"msW" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 8 + }, +/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/security/brig) "mtd" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/trimline/red/filled/corner{ @@ -37997,16 +37896,6 @@ /obj/effect/turf_decal/trimline/white/warning, /turf/open/floor/iron, /area/station/maintenance/tram/left) -"mtX" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/light/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Arrivals - North Hall" - }, -/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/entry) "muf" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/window/left/directional/east{ @@ -38134,6 +38023,14 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat_interior) +"mxE" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/broken/directional/south, +/turf/open/floor/carpet, +/area/station/commons/vacant_room/office) "mxR" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 10 @@ -38164,7 +38061,7 @@ /area/station/commons/fitness/recreation/entertainment) "myA" = ( /obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/effect/turf_decal/bot, /obj/structure/disposalpipe/segment{ dir = 5 @@ -38209,6 +38106,14 @@ }, /turf/open/floor/catwalk_floor, /area/station/hallway/primary/tram/right) +"mzg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/dim/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/port/central) "mzs" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -38227,18 +38132,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"mzH" = ( -/obj/machinery/suit_storage_unit/security, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "mzQ" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, /turf/open/floor/iron, /area/station/science/ordnance/testlab) +"mzV" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/item/paper_bin, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/tcommsat/computer) "mAb" = ( /obj/effect/spawner/random/entertainment/arcade{ dir = 4 @@ -38282,20 +38190,25 @@ /obj/structure/cable, /turf/open/floor/circuit/telecomms/server, /area/station/science/server) +"mAS" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = -3 + }, +/obj/item/pen{ + pixel_x = -3 + }, +/obj/item/folder/yellow{ + pixel_x = 4 + }, +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/cargo/sorting) "mAT" = ( /turf/closed/wall, /area/station/command/heads_quarters/hos) -"mAX" = ( -/obj/structure/rack, -/obj/structure/window/spawner/directional/north, -/obj/item/hand_tele, -/obj/effect/spawner/random/engineering/tracking_beacon, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/status_display/evac/directional/east, -/turf/open/floor/iron/dark, -/area/station/command/teleporter) "mBm" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -38304,6 +38217,17 @@ }, /turf/open/floor/plating, /area/station/science/xenobiology) +"mBo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/machinery/incident_display/tram/directional/north{ + desc = "A display that indicates how many dents that'll need fixed after the shift is over."; + name = "darwin award counter" + }, +/turf/open/floor/iron, +/area/station/maintenance/port/central) "mBq" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/crew_quarters/dorms) @@ -38325,6 +38249,10 @@ }, /turf/open/floor/iron/dark/airless, /area/station/science/ordnance/freezerchamber) +"mCu" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/noslip/tram, +/area/station/hallway/primary/tram/left) "mCx" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -38447,6 +38375,22 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) +"mEd" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/tram/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/tram/filled/warning{ + dir = 4 + }, +/obj/effect/spawner/random/vending/snackvend{ + pixel_x = 5 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/right) "mEs" = ( /turf/open/floor/iron/chapel{ dir = 10 @@ -38507,14 +38451,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/courtroom/holding) -"mFQ" = ( -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 1 - }, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/command/teleporter) "mFV" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 1 @@ -38716,16 +38652,6 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"mJc" = ( -/obj/structure/table, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/obj/item/stack/medical/gauze, -/obj/item/stack/medical/mesh, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "mJh" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -38761,21 +38687,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/dark, /area/station/command/bridge) -"mJs" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/tram/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/tram/filled/warning{ - dir = 4 - }, -/obj/effect/spawner/random/vending/colavend{ - pixel_x = 5 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/left) "mJw" = ( /obj/effect/landmark/secequipment, /obj/effect/turf_decal/bot, @@ -38793,6 +38704,13 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/checker, /area/station/commons/lounge) +"mJQ" = ( +/obj/structure/closet/secure_closet/brig, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/brig) "mKe" = ( /obj/machinery/door/airlock/external{ name = "Solar Maintenance" @@ -38825,6 +38743,24 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/main) +"mKj" = ( +/obj/machinery/computer/mech_bay_power_console, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/circuit/green, +/area/station/science/robotics/mechbay) +"mKq" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Security - Warden's Office"; + dir = 9; + network = list("ss13","Security") + }, +/obj/structure/sign/calendar/directional/north, +/obj/structure/cable, +/turf/open/floor/iron/showroomfloor, +/area/station/security/warden) "mKP" = ( /obj/vehicle/ridden/secway, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -38836,6 +38772,15 @@ /obj/effect/turf_decal/tile/dark_green/fourcorners, /turf/open/floor/iron/white, /area/station/science/genetics) +"mLp" = ( +/obj/machinery/portable_atmospherics/canister/plasma, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/sign/warning/no_smoking/circle/directional/west, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/storage) "mLu" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 @@ -38866,11 +38811,6 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"mLQ" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/drone_dispenser, -/turf/open/floor/iron/smooth, -/area/station/maintenance/department/science) "mMc" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/stripes/line{ @@ -38889,27 +38829,11 @@ }, /turf/open/floor/iron/dark, /area/station/medical/storage) -"mMD" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=8"; - location = "Security"; - name = "navigation beacon (Security Delivery)" - }, -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, +"mMK" = ( +/obj/structure/cable, +/obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, -/area/station/maintenance/department/security) -"mMG" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/dim/directional/east, -/turf/open/floor/iron/dark, -/area/station/service/bar) -"mNo" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/turf/open/floor/iron/dark, -/area/station/engineering/supermatter/room) +/area/station/maintenance/central/greater) "mNp" = ( /obj/structure/chair/sofa/middle{ dir = 8 @@ -38945,13 +38869,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/service/hydroponics/garden) -"mNN" = ( -/obj/structure/chair/comfy/brown{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain) "mNV" = ( /obj/machinery/photocopier, /turf/open/floor/iron/grimy, @@ -38965,18 +38882,17 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/wood, /area/station/commons/vacant_room/office) -"mOu" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/obj/machinery/camera{ - c_tag = "Hallway - Upper Left Command"; - dir = 6 +"mOj" = ( +/obj/structure/table/glass, +/obj/item/stack/medical/gauze, +/obj/item/stack/medical/suture, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 }, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) +/obj/machinery/status_display/ai/directional/north, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "mOB" = ( /obj/structure/table, /obj/item/analyzer, @@ -39001,6 +38917,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/pharmacy) +"mOW" = ( +/obj/effect/turf_decal/trimline/white/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/white/filled/corner, +/obj/effect/turf_decal/trimline/white/filled/corner{ + dir = 8 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "mOZ" = ( /obj/machinery/door/airlock/security{ name = "Labor Shuttle" @@ -39071,8 +38998,8 @@ /turf/open/floor/iron, /area/station/security/courtroom/holding) "mQE" = ( -/obj/effect/landmark/tram/tramstation/east, /obj/effect/turf_decal/tile/neutral/tram, +/obj/effect/landmark/tram/platform/tramstation/east, /turf/open/floor/noslip/tram_plate, /area/station/hallway/primary/tram/right) "mQS" = ( @@ -39092,12 +39019,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/exit) -"mRe" = ( -/obj/structure/table/wood, -/obj/item/staff/broom, -/obj/item/clothing/head/costume/sombrero/green, -/turf/open/floor/wood, -/area/station/service/theater) "mRs" = ( /obj/effect/turf_decal/bot, /obj/machinery/portable_atmospherics/scrubber, @@ -39118,6 +39039,14 @@ }, /turf/open/floor/noslip/tram_platform, /area/station/hallway/primary/tram/right) +"mRY" = ( +/obj/machinery/computer/scan_consolenew{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_green/fourcorners, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/station/science/genetics) "mSf" = ( /obj/structure/cable, /obj/structure/disposalpipe/junction/yjunction, @@ -39139,6 +39068,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/tram/mid) +"mSx" = ( +/obj/machinery/computer/teleporter{ + dir = 1 + }, +/turf/open/floor/circuit, +/area/station/command/teleporter) "mSE" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -39150,14 +39085,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/central/greater) -"mTa" = ( -/obj/machinery/rnd/production/techfab/department/security, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/structure/reagent_dispensers/wall/peppertank/directional/west, -/turf/open/floor/iron, -/area/station/security/office) "mTe" = ( /obj/structure/chair/sofa/left{ dir = 8 @@ -39171,15 +39098,6 @@ dir = 6 }, /area/station/service/chapel) -"mTQ" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/structure/reagent_dispensers/wall/peppertank/directional/south, -/obj/machinery/light/directional/south, -/obj/machinery/computer/records/security{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/engineering) "mTR" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -39195,12 +39113,41 @@ /obj/item/extinguisher, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"mTX" = ( +/obj/structure/closet/secure_closet/hop, +/obj/structure/sign/clock/directional/west, +/obj/item/storage/secure/safe/directional/north, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hop) +"mUc" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/elevator_control_panel/directional/north{ + linked_elevator_id = "tram_upper_center_lift"; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") + }, +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 1 + }, +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/maintenance/tram/mid) "mUd" = ( /obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/monitored/air_output{ dir = 1 }, /turf/open/floor/engine/air, /area/station/engineering/atmos) +"mUu" = ( +/obj/machinery/mass_driver/trash{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/vacuum/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "mUL" = ( /obj/effect/turf_decal/siding/thinplating, /obj/structure/cable, @@ -39209,14 +39156,13 @@ dir = 1 }, /area/station/service/kitchen) -"mUP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 +"mVj" = ( +/obj/machinery/modular_computer/preset/civilian{ + dir = 8 }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) +/obj/structure/window/spawner/directional/north, +/turf/open/floor/iron/dark/small, +/area/station/commons/vacant_room) "mVo" = ( /obj/item/book/bible, /obj/structure/altar_of_gods, @@ -39244,6 +39190,12 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/cargo/miningdock/cafeteria) +"mWp" = ( +/obj/machinery/atmospherics/components/tank/air{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/science/ordnance) "mWu" = ( /obj/machinery/door/airlock/external{ name = "Solar Maintenance" @@ -39257,6 +39209,12 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, /area/station/solars/starboard/fore) +"mWC" = ( +/obj/machinery/holopad, +/obj/machinery/firealarm/directional/north, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/iron/grimy, +/area/station/service/library/lounge) "mWK" = ( /obj/structure/chair/stool/directional/south, /obj/effect/landmark/start/hangover, @@ -39310,6 +39268,27 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/atmos) +"mXU" = ( +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"mXY" = ( +/obj/structure/closet/wardrobe/grey, +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) +"mYc" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/wood/large, +/area/station/service/barber) "mYg" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/structure/cable, @@ -39337,12 +39316,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"mYy" = ( -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) "mYB" = ( /obj/structure/table/reinforced, /obj/item/paper_bin{ @@ -39469,19 +39442,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/command/bridge) -"nbi" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 6 - }, -/obj/machinery/firealarm/directional/east{ - pixel_y = 4 - }, -/obj/machinery/light_switch/directional/east{ - pixel_x = 22; - pixel_y = -10 - }, -/turf/open/floor/iron, -/area/station/science/robotics/lab) "nbl" = ( /obj/machinery/atmospherics/pipe/smart/manifold/violet/visible{ dir = 1 @@ -39602,11 +39562,17 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) +"ndz" = ( +/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/station/service/library) "ndN" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/tile/bar{ dir = 8 }, @@ -39697,15 +39663,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/surgery/aft) -"nfd" = ( -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 10 - }, -/obj/machinery/light_switch/directional/south, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "nfB" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -39748,14 +39705,15 @@ /turf/open/floor/iron, /area/station/maintenance/tram/right) "nfZ" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=1"; - location = "QM #5" +/obj/effect/turf_decal/trimline/brown/line, +/obj/effect/turf_decal/stripes, +/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ + dir = 1 }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron, -/area/station/cargo/storage) +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "ngg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/effect/spawner/structure/window/reinforced, @@ -39802,21 +39760,6 @@ }, /turf/open/floor/iron/checker, /area/station/commons/lounge) -"ngO" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/tram/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/tram/filled/warning{ - dir = 4 - }, -/obj/machinery/vending/coffee{ - pixel_x = 5 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "nhc" = ( /obj/machinery/door/airlock/medical/glass{ id_tag = "MedbayFoyer"; @@ -39869,6 +39812,11 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/maintenance/tram/left) +"nhJ" = ( +/obj/structure/sign/poster/official/random/directional/south, +/obj/machinery/light/blacklight/directional/south, +/turf/open/floor/eighties, +/area/station/commons/fitness/recreation/entertainment) "nhL" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -39878,6 +39826,19 @@ /obj/effect/turf_decal/trimline/dark_green/filled/corner, /turf/open/floor/iron/white, /area/station/science/genetics) +"nhV" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/pdas{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/storage/box/pdas, +/obj/machinery/camera/directional/east{ + c_tag = "Command - Bridge South" + }, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron, +/area/station/command/bridge) "nhZ" = ( /obj/structure/railing{ dir = 4 @@ -39967,21 +39928,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/command/meeting_room) -"njt" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/window/reinforced/spawner/directional/north{ - pixel_y = 2 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) -"njv" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/prison) "njx" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/decal/cleanable/dirt, @@ -40032,6 +39978,25 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/miningdock) +"njR" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/warning{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/corner{ + dir = 4 + }, +/obj/structure/sign/departments/security{ + pixel_x = -32 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) "njX" = ( /obj/structure/chair/comfy/beige{ dir = 4 @@ -40102,6 +40067,12 @@ }, /turf/open/floor/plating, /area/station/cargo/sorting) +"nkF" = ( +/obj/machinery/power/smes/engineering, +/obj/structure/cable, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron, +/area/station/engineering/engine_smes) "nkU" = ( /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating/airless, @@ -40157,12 +40128,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/tram/right) -"nlp" = ( -/obj/structure/toilet{ - dir = 8 - }, -/turf/open/floor/iron/freezer, -/area/station/security/prison) "nlD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -40184,11 +40149,10 @@ dir = 4 }, /area/station/command/bridge) -"nlV" = ( -/obj/machinery/firealarm/directional/south, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hos) +"nlS" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/noslip/tram, +/area/station/hallway/primary/tram/left) "nmf" = ( /obj/structure/table/wood, /obj/machinery/computer/security/wooden_tv, @@ -40206,6 +40170,20 @@ /obj/machinery/barsign/directional/south, /turf/open/floor/iron/checker, /area/station/commons/lounge) +"nmk" = ( +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/machinery/button/door/directional/west{ + id = "Toilet1"; + name = "Lock Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet) "nms" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -40345,20 +40323,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/tram/mid) +"not" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/warm/directional/south, +/turf/open/floor/iron/dark, +/area/station/service/bar) "noy" = ( /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation/entertainment) -"noG" = ( -/obj/machinery/button/door/directional/east{ - id = "armory"; - name = "Armory Shutters"; - req_access = list("armory") - }, -/obj/machinery/status_display/ai/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "noI" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -40367,15 +40340,6 @@ /obj/structure/sign/calendar/directional/north, /turf/open/floor/iron, /area/station/security/checkpoint/escape) -"noK" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 5 - }, -/obj/machinery/light/directional/north, -/obj/item/radio/intercom/directional/north, -/obj/machinery/vending/wardrobe/chem_wardrobe, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "npb" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -40415,11 +40379,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/office) -"npH" = ( -/obj/structure/bed/dogbed/renault, -/mob/living/simple_animal/pet/fox/renault, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain) "npX" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -40487,24 +40446,6 @@ }, /turf/open/floor/glass, /area/station/commons/fitness/recreation) -"nqM" = ( -/obj/machinery/airalarm/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/showroomfloor, -/area/station/security/lockers) -"nra" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/engine/vacuum, -/area/station/engineering/atmos) -"nrd" = ( -/obj/machinery/computer/scan_consolenew{ - dir = 8 - }, -/obj/effect/turf_decal/tile/dark_green/fourcorners, -/turf/open/floor/iron/white, -/area/station/science/genetics) "nrf" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/table/wood/fancy/red, @@ -40565,25 +40506,12 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos) -"nrR" = ( -/obj/structure/table/glass, -/obj/item/book/manual/wiki/surgery{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/book/manual/wiki/medicine, -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "nrV" = ( /obj/structure/rack, /obj/item/book/manual/chef_recipes, /obj/item/holosign_creator/robot_seat/restaurant, /obj/item/reagent_containers/condiment/enzyme, +/obj/machinery/light/cold/directional/west, /turf/open/floor/iron/white/side{ dir = 4 }, @@ -40634,6 +40562,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/siding/purple{ + dir = 8 + }, /turf/open/floor/iron/white, /area/station/science/xenobiology) "nti" = ( @@ -40642,18 +40573,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/station/service/library) -"nto" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/stripes/line, -/obj/item/storage/box/gloves{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/bodybags, -/obj/item/healthanalyzer, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) "ntp" = ( /obj/structure/closet/secure_closet/brig, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -40661,6 +40580,22 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"nts" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"ntL" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/effect/turf_decal/trimline/neutral/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/corner, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/construction/engineering) "nug" = ( /obj/structure/table/reinforced, /obj/item/storage/secure/safe/caps_spare/directional/east, @@ -40693,6 +40628,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/chapel, /area/station/service/chapel) +"nvf" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/space/openspace, +/area/station/solars/port) "nvo" = ( /obj/machinery/button/door/directional/west{ id = "private_b"; @@ -40728,6 +40674,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor, /area/station/maintenance/tram/left) +"nvF" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/bitrunning/den) "nvH" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -40737,6 +40687,14 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/dorms) +"nvI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/ai_monitored/security/armory) "nvU" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -40751,21 +40709,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/dorms) -"nwg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "nwq" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 }, /obj/structure/rack, /obj/item/mod/module/plasma_stabilizer, +/obj/item/mod/module/signlang_radio, /obj/item/mod/module/thermal_regulator, /turf/open/floor/iron, /area/station/engineering/engine_smes) @@ -40776,6 +40726,23 @@ /obj/structure/curtain, /turf/open/floor/iron/white, /area/station/command/heads_quarters/captain/private) +"nwz" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/structure/railing/corner, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/siding/thinplating/corner, +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "nwD" = ( /obj/effect/turf_decal/sand/plating, /turf/open/misc/asteroid, @@ -40857,6 +40824,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/office) +"nys" = ( +/obj/structure/table/wood, +/obj/item/clothing/glasses/eyepatch, +/turf/open/floor/wood, +/area/station/service/theater) "nyt" = ( /obj/effect/turf_decal/siding/thinplating/corner{ dir = 8 @@ -41022,6 +40994,14 @@ }, /turf/open/floor/iron, /area/station/service/janitor) +"nAB" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/station/tcommsat/computer) "nAH" = ( /obj/machinery/computer/cargo{ dir = 4 @@ -41034,6 +41014,13 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) +"nAP" = ( +/obj/machinery/modular_computer/preset/id{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "nAS" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -41051,6 +41038,19 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/security/office) +"nBo" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/tram/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/tram/filled/warning{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/left) "nBu" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/stripes/line{ @@ -41110,16 +41110,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/central) -"nDo" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/structure/extinguisher_cabinet/directional/west, -/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/secondary/exit) "nDM" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -41146,18 +41136,6 @@ /obj/item/stock_parts/micro_laser, /turf/open/floor/iron/white, /area/station/science/lab) -"nDV" = ( -/obj/machinery/conveyor{ - id = "QMLoad2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "nDX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -41187,6 +41165,34 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/hallway/primary/tram/center) +"nEu" = ( +/obj/structure/sign/directions/supply{ + dir = 4; + pixel_y = 28 + }, +/obj/structure/sign/directions/security{ + dir = 1; + pixel_y = 34 + }, +/obj/structure/sign/directions/command{ + dir = 1; + pixel_y = 40 + }, +/obj/structure/sign/directions/vault{ + dir = 1; + pixel_y = 22 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/tram/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/tram/filled/warning{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/left) "nEB" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 8 @@ -41242,17 +41248,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/gravity_generator) -"nFD" = ( -/obj/structure/closet/emcloset{ - anchored = 1 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/light/small/directional/west, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, -/turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/foyer) "nFL" = ( /obj/machinery/suit_storage_unit/atmos, /obj/effect/turf_decal/stripes/line{ @@ -41292,10 +41287,6 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/office) -"nGt" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/engine/n2, -/area/station/engineering/atmos) "nGI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/parquet, @@ -41343,6 +41334,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/brig) +"nIc" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/structure/closet/masks, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/iron, +/area/station/commons/fitness) "nIr" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -41359,6 +41356,25 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/virology) +"nIQ" = ( +/obj/effect/landmark/start/depsec/supply, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/chair, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) +"nJd" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/obj/structure/cable, +/obj/machinery/computer/records/security{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/iron/showroomfloor, +/area/station/security/warden) "nJr" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -41386,15 +41402,6 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/office) -"nJV" = ( -/obj/structure/table, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/machinery/newscaster/directional/north, -/obj/item/pai_card, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "nKb" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 @@ -41426,14 +41433,33 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"nKp" = ( -/obj/structure/industrial_lift/tram, -/obj/structure/window/reinforced/tram/left/directional/north, -/obj/structure/chair/sofa/bench/tram/right{ - dir = 8 +"nKo" = ( +/obj/structure/sign/directions/evac{ + dir = 4; + pixel_y = -28 }, -/turf/open/openspace, -/area/station/hallway/primary/tram/center) +/obj/structure/sign/directions/medical{ + dir = 4; + pixel_y = -34 + }, +/obj/structure/sign/directions/engineering{ + dir = 4; + pixel_y = -40 + }, +/obj/structure/sign/directions/upload{ + dir = 4; + pixel_y = -22 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/tram/filled/line, +/obj/effect/turf_decal/trimline/tram/filled/warning, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/left) "nKu" = ( /obj/machinery/telecomms/server/presets/common, /turf/open/floor/iron/dark/telecomms, @@ -41441,6 +41467,21 @@ "nKz" = ( /turf/open/floor/iron/dark, /area/station/service/bar) +"nKQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, +/obj/structure/cable/layer1, +/obj/effect/turf_decal/trimline/yellow/arrow_cw{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "nKU" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -41474,20 +41515,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/lobby) -"nLi" = ( -/obj/machinery/light/small/directional/east, -/turf/open/openspace, -/area/station/security/courtroom/holding) -"nLH" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 9 - }, -/obj/machinery/smartfridge/extract/preloaded, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "nLK" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -41499,18 +41526,6 @@ }, /turf/open/floor/iron, /area/station/cargo/miningdock) -"nLN" = ( -/obj/machinery/computer/scan_consolenew{ - dir = 4 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Science - Genetics"; - network = list("ss13","rd") - }, -/obj/structure/sign/clock/directional/west, -/obj/effect/turf_decal/tile/dark_green/fourcorners, -/turf/open/floor/iron/white, -/area/station/science/genetics) "nMb" = ( /obj/structure/lattice/catwalk, /obj/effect/decal/cleanable/dirt, @@ -41616,6 +41631,11 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat_interior) +"nNs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/ladder, +/turf/open/floor/iron/smooth, +/area/station/maintenance/tram/mid) "nNw" = ( /obj/effect/turf_decal/sand/plating, /turf/open/floor/catwalk_floor, @@ -41629,31 +41649,10 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"nNE" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/medical/virology) "nNM" = ( /obj/structure/girder, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"nNP" = ( -/obj/machinery/status_display/door_timer{ - id = "engcell"; - name = "Engineering Cell"; - pixel_x = -32 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 10 - }, -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/engineering) "nNQ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -41685,6 +41684,14 @@ }, /turf/open/floor/iron, /area/station/security/prison/safe) +"nOj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "nOq" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron, @@ -41698,15 +41705,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/cargo/miningdock/cafeteria) -"nPb" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 1 - }, -/obj/machinery/light/directional/east, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos) "nPe" = ( /turf/open/floor/carpet, /area/station/medical/psychology) @@ -41722,21 +41720,6 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron, /area/station/security/office) -"nPB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/shower/directional/west, -/obj/effect/turf_decal/bot, -/obj/structure/fluff{ - desc = "What, you think the water just magically soaks into the metallic flooring?"; - icon = 'icons/obj/lavaland/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "nPM" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 6 @@ -41770,17 +41753,11 @@ }, /turf/open/floor/iron, /area/station/engineering/main) -"nQc" = ( -/obj/structure/industrial_lift/tram, -/obj/structure/window/reinforced/tram/right/directional/north, -/obj/machinery/destination_sign/north{ - pixel_y = 10 - }, -/obj/structure/chair/sofa/bench/tram/left{ - dir = 4 - }, -/turf/open/openspace, -/area/station/hallway/primary/tram/center) +"nPZ" = ( +/obj/machinery/pdapainter/security, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hos) "nQo" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 @@ -41846,16 +41823,6 @@ /obj/structure/flora/bush/fullgrass/style_random, /turf/open/misc/grass/jungle, /area/station/science/explab) -"nRo" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/structure/table, -/obj/item/radio/intercom/directional/east, -/obj/machinery/coffeemaker, -/turf/open/floor/iron, -/area/station/security/brig) "nRw" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 10 @@ -41876,26 +41843,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"nRT" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/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, -/area/station/security/prison) -"nRV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/east, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "nRW" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -41930,6 +41877,25 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"nSd" = ( +/obj/machinery/button/door/directional/west{ + id = "commissarydeezdoorz"; + name = "Commissary Shutter Access" + }, +/obj/machinery/button/door/directional/west{ + id = "vacant_space"; + name = "Privacy Bolts"; + normaldoorcontrol = 1; + pixel_y = -9; + specialfunctions = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light_switch/directional/west{ + pixel_x = -22; + pixel_y = 9 + }, +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/commissary) "nSf" = ( /obj/structure/table, /obj/item/pai_card, @@ -41940,16 +41906,16 @@ /obj/structure/beebox, /turf/open/floor/grass, /area/station/service/hydroponics) -"nSs" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/security/medical) "nSI" = ( /turf/closed/wall/r_wall, /area/station/commons/vacant_room/commissary) +"nSR" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/plumbing/input{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "nSV" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -41972,16 +41938,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"nSX" = ( -/obj/effect/turf_decal/trimline/dark_red/warning, -/obj/structure/industrial_lift/public, -/obj/machinery/elevator_control_panel/directional/south{ - linked_elevator_id = "tram_dorm_lift"; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") - }, -/obj/structure/railing, -/turf/open/floor/plating/elevatorshaft, -/area/station/maintenance/tram/left) "nTa" = ( /obj/effect/landmark/start/station_engineer, /obj/structure/cable/layer1, @@ -42006,14 +41962,12 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"nTn" = ( -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/storage) +"nTo" = ( +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/structure/flora/bush/grassy/style_random, +/obj/machinery/light/directional/north, +/turf/open/floor/grass, +/area/station/hallway/primary/tram/center) "nTr" = ( /obj/structure/table/wood, /obj/structure/window/reinforced/spawner/directional/west{ @@ -42032,15 +41986,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/cargo/miningdock/cafeteria) -"nTJ" = ( -/obj/structure/chair, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "nUr" = ( /obj/item/target, /obj/structure/window/reinforced/spawner/directional/south, @@ -42061,23 +42006,27 @@ /obj/item/stack/rods/twentyfive, /turf/open/floor/iron, /area/station/maintenance/port/central) +"nUu" = ( +/obj/structure/chair/sofa/middle{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/station/medical/psychology) "nUy" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /turf/open/floor/iron/white, /area/station/science/lobby) "nUF" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=2"; - location = "QM #1" - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #1"; - suffix = "#1" +/obj/effect/turf_decal/box/corners, +/obj/effect/turf_decal/box/corners{ + dir = 4 }, -/turf/open/floor/iron, -/area/station/cargo/storage) +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/directional/north, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/landmark/bitrunning/station_reward_spawn, +/turf/open/floor/iron/dark/smooth_large, +/area/station/bitrunning/den) "nUM" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -42104,17 +42053,23 @@ /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/iron, /area/station/engineering/atmos) -"nUU" = ( -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/machinery/light/small/directional/north, -/turf/open/floor/grass, -/area/station/hallway/primary/tram/center) "nUW" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/simple/green/visible, /turf/open/floor/plating, /area/station/engineering/atmos/pumproom) +"nVd" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/obj/structure/cable, +/obj/machinery/light_switch/directional/south{ + pixel_x = 10; + pixel_y = -24 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) "nVg" = ( /obj/machinery/door/airlock/hatch{ name = "Radstorm Shelter" @@ -42141,14 +42096,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"nVx" = ( -/obj/structure/closet{ - name = "Evidence Closet 1" - }, -/obj/machinery/firealarm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/evidence) "nVL" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -42166,14 +42113,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos) -"nWb" = ( -/obj/effect/turf_decal/bot, -/obj/structure/transit_tube/horizontal{ - dir = 1 +"nVV" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "nWi" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/landmark/event_spawn, @@ -42213,20 +42161,12 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/lower) -"nXd" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/table/glass, -/obj/item/reagent_containers/dropper, -/obj/structure/sign/clock/directional/north, -/obj/item/reagent_containers/cup/beaker/large{ - pixel_x = 6; - pixel_y = 4 - }, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 4 +"nWX" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 9 }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) +/turf/open/floor/iron, +/area/station/command/teleporter) "nXh" = ( /obj/effect/turf_decal/trimline/neutral/warning{ dir = 1 @@ -42241,7 +42181,6 @@ /obj/effect/turf_decal/siding/thinplating{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/cargo/storage) "nXn" = ( @@ -42253,6 +42192,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"nXo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron/smooth, +/area/station/maintenance/tram/left) "nXp" = ( /obj/structure/floodlight_frame, /turf/open/misc/asteroid, @@ -42272,6 +42217,17 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/tcommsat/computer) +"nXI" = ( +/obj/structure/railing, +/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/dark_blue/corner{ + dir = 1 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hop) "nXK" = ( /obj/structure/table/glass, /obj/item/paper_bin, @@ -42292,6 +42248,33 @@ /obj/effect/mapping_helpers/airalarm/all_access, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"nYq" = ( +/obj/structure/sign/directions/supply{ + dir = 4; + pixel_y = -28 + }, +/obj/structure/sign/directions/security{ + dir = 1; + pixel_y = -34 + }, +/obj/structure/sign/directions/command{ + dir = 1; + pixel_y = -40 + }, +/obj/structure/sign/directions/vault{ + dir = 1; + pixel_y = -22 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/tram/filled/line, +/obj/effect/turf_decal/trimline/tram/filled/warning, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/left) "nYr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -42392,6 +42375,13 @@ }, /turf/open/floor/wood/parquet, /area/station/service/library) +"nZY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/captain/private) "oab" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -42403,6 +42393,9 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"oae" = ( +/turf/open/floor/iron/grimy, +/area/station/commons/vacant_room) "oar" = ( /obj/machinery/button/door/directional/west{ id = "private_p"; @@ -42471,16 +42464,6 @@ /obj/effect/turf_decal/trimline/white/warning, /turf/open/floor/iron, /area/station/maintenance/tram/right) -"obw" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/table/wood, -/obj/item/storage/secure/safe/directional/north, -/obj/machinery/fax{ - fax_name = "Head of Personnel's Office"; - name = "Head of Personnel's Fax Machine" - }, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hop) "oby" = ( /obj/machinery/door/window/left/directional/south{ name = "Armory"; @@ -42517,21 +42500,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) -"obH" = ( -/obj/effect/spawner/random/vending/colavend, -/obj/machinery/airalarm/directional/west, -/obj/machinery/light_switch/directional/north{ - pixel_x = 12 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Medical - Breakroom"; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) "obL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -42539,6 +42507,16 @@ dir = 4 }, /area/station/service/theater) +"obW" = ( +/obj/machinery/modular_computer/preset/engineering{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/command/bridge) "oca" = ( /turf/closed/wall, /area/station/construction/mining/aux_base) @@ -42565,30 +42543,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) -"odf" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/item/bedsheet/captain{ - dir = 4 - }, -/obj/structure/sign/clock/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"odl" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/light/small/directional/east, -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/structure/railing/corner{ - dir = 8 - }, -/turf/open/space/openspace, -/area/station/solars/starboard/fore) "odr" = ( /obj/structure/railing{ dir = 4 @@ -42628,6 +42582,12 @@ }, /turf/open/floor/iron/dark, /area/station/medical/storage) +"odK" = ( +/obj/structure/closet/crate/wooden/toy, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/station/service/theater) "odV" = ( /obj/machinery/firealarm/directional/west, /obj/structure/cable, @@ -42653,17 +42613,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/maintenance/radshelter/civil) -"ofx" = ( -/obj/structure/rack, -/obj/item/clothing/under/color/red, -/obj/item/clothing/under/color/red, -/obj/item/clothing/under/color/red, -/obj/item/clothing/head/soft/red, -/obj/item/clothing/head/soft/red, -/obj/item/clothing/head/soft/red, -/obj/effect/turf_decal/tile/red/full, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/fitness/recreation/entertainment) "ofA" = ( /obj/structure/chair/office, /obj/machinery/button/door/directional/south{ @@ -42731,10 +42680,6 @@ }, /turf/open/floor/iron, /area/station/science/robotics/mechbay) -"ogp" = ( -/obj/structure/table/wood, -/turf/open/floor/wood/tile, -/area/station/service/chapel) "ogt" = ( /obj/structure/table/reinforced, /obj/item/clothing/ears/earmuffs{ @@ -42808,6 +42753,35 @@ }, /turf/open/floor/wood, /area/station/commons/dorms) +"oiv" = ( +/obj/structure/sign/directions/supply{ + dir = 1; + pixel_y = 28 + }, +/obj/structure/sign/directions/security{ + dir = 8; + pixel_y = 34 + }, +/obj/structure/sign/directions/command{ + dir = 8; + pixel_y = 40 + }, +/obj/structure/sign/directions/vault{ + dir = 8; + pixel_y = 22 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/trimline/tram/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/tram/filled/warning{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/right) "oiF" = ( /obj/structure/table, /obj/machinery/duct, @@ -42825,6 +42799,33 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"oiI" = ( +/obj/machinery/firealarm/directional/south{ + pixel_x = -3 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/light_switch/directional/south{ + pixel_x = 8; + pixel_y = -23 + }, +/turf/open/floor/iron, +/area/station/cargo/miningdock/cafeteria) +"oiL" = ( +/obj/structure/filingcabinet, +/obj/structure/window/spawner/directional/north, +/obj/item/paper{ + default_raw_text = "A crude mapping of the station layout based on leaked internal documents and orbital snapshots taken during construction. I'm not sure how up-to-date this is anymore.."; + icon = 'icons/obj/scrolls.dmi'; + icon_state = "blueprints"; + inhand_icon_state = "blueprints"; + name = "station layout" + }, +/turf/open/floor/iron/dark/small, +/area/station/commons/vacant_room) "oiV" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 @@ -42880,6 +42881,22 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/hallway/primary/tram/left) +"ojU" = ( +/obj/structure/ladder, +/obj/effect/turf_decal/siding/thinplating_new/end, +/obj/effect/turf_decal/siding/thinplating_new/end{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/science/explab) +"okd" = ( +/obj/structure/closet/wardrobe/mixed, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "okh" = ( /obj/structure/chair/sofa/left{ dir = 1 @@ -42914,6 +42931,20 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"okG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/white/warning{ + dir = 1 + }, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/iron, +/area/station/maintenance/tram/mid) "okK" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -42943,34 +42974,17 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, /area/station/service/library) -"olh" = ( -/obj/structure/rack, -/obj/item/clothing/suit/armor/bulletproof{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/suit/armor/bulletproof, -/obj/item/clothing/suit/armor/bulletproof{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/clothing/head/helmet/alt{ - layer = 3.00001; - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/head/helmet/alt{ - layer = 3.00001 - }, -/obj/item/clothing/head/helmet/alt{ - layer = 3.00001; - pixel_x = 3; - pixel_y = -3 +"ols" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/bed/medical/emergency, +/obj/machinery/camera/directional/south{ + c_tag = "Medical - Lobby"; + network = list("ss13","medbay") }, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/obj/effect/turf_decal/bot, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "olw" = ( /obj/structure/industrial_lift/tram/white, /obj/structure/fluff/tram_rail, @@ -43008,6 +43022,12 @@ "omm" = ( /turf/closed/wall, /area/station/maintenance/department/security) +"omn" = ( +/obj/machinery/biogenerator, +/obj/effect/turf_decal/tile/green/fourcorners, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics) "omu" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/visible, /turf/open/floor/iron, @@ -43022,14 +43042,6 @@ /obj/effect/turf_decal/trimline/dark_blue/corner, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) -"omT" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron, -/area/station/commons/dorms) "ona" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 @@ -43037,6 +43049,11 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, +/obj/machinery/status_display/door_timer{ + id = "Isolation_D"; + name = "Isolation Cell D"; + pixel_y = -32 + }, /turf/open/floor/iron, /area/station/security/execution/transfer) "onc" = ( @@ -43072,20 +43089,19 @@ /obj/effect/mapping_helpers/airlock/access/all/science/research, /turf/open/floor/catwalk_floor, /area/station/science/auxlab/firing_range) -"onB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron, -/area/station/maintenance/port/central) "onW" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, /turf/open/floor/engine, /area/station/engineering/supermatter) +"ooe" = ( +/obj/machinery/computer/quantum_console{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark/smooth_corner, +/area/station/bitrunning/den) "oog" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -43110,17 +43126,6 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) -"oor" = ( -/obj/structure/industrial_lift/tram, -/obj/machinery/destination_sign/north{ - pixel_y = 10 - }, -/obj/structure/window/reinforced/tram/left/directional/north, -/obj/structure/chair/sofa/bench/tram/right{ - dir = 8 - }, -/turf/open/openspace, -/area/station/hallway/primary/tram/center) "ooz" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -43129,18 +43134,6 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/dark, /area/station/security/courtroom/holding) -"ooA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/white/warning{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/maintenance/tram/right) "ooV" = ( /obj/effect/turf_decal/trimline/tram/filled/corner{ dir = 4 @@ -43158,34 +43151,26 @@ }, /turf/open/space/openspace, /area/station/solars/port) -"opB" = ( -/obj/structure/sign/directions/supply{ - dir = 4; - pixel_y = -28 - }, -/obj/structure/sign/directions/security{ - dir = 1; - pixel_y = -34 - }, -/obj/structure/sign/directions/command{ - dir = 1; - pixel_y = -40 +"opT" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 }, -/obj/machinery/light/directional/south, -/obj/structure/sign/directions/vault{ - dir = 1; - pixel_y = -22 +/obj/machinery/camera/directional/east{ + c_tag = "Security - Main East"; + network = list("ss13","Security") }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/table, +/obj/item/storage/fancy/coffee_cart_rack{ + pixel_x = 8; + pixel_y = 2 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 +/obj/item/food/donut/plain{ + pixel_x = -4; + pixel_y = 6 }, -/obj/effect/turf_decal/trimline/tram/filled/line, -/obj/effect/turf_decal/trimline/tram/filled/warning, +/obj/machinery/light/directional/east, /turf/open/floor/iron, -/area/station/hallway/primary/tram/left) +/area/station/security/brig) "oqh" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -43242,14 +43227,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /turf/open/floor/plating, /area/station/engineering/atmos) -"orl" = ( -/obj/machinery/light/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Arrivals - Central Docking Wing" - }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "orQ" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -43310,6 +43287,11 @@ /obj/effect/turf_decal/siding/thinplating, /turf/open/floor/glass/reinforced, /area/station/security/warden) +"osG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/ladder, +/turf/open/floor/iron/smooth, +/area/station/maintenance/tram/right) "osN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /turf/open/floor/engine, @@ -43368,6 +43350,44 @@ }, /turf/open/floor/iron/white, /area/station/science/lower) +"otP" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/glass/reinforced, +/area/station/science/genetics) +"oum" = ( +/obj/machinery/computer/security/qm{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/machinery/requests_console/directional/west{ + department = "Quartermaster's Desk"; + name = "Quartermaster's Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/ore_update, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/machinery/camera{ + c_tag = "Cargo - Quartermaster's Office"; + dir = 10; + network = list("ss13","cargo") + }, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/iron, +/area/station/command/heads_quarters/qm) +"ouz" = ( +/obj/effect/turf_decal/trimline/white/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) "ouE" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 4 @@ -43396,14 +43416,13 @@ }, /turf/open/floor/iron, /area/station/ai_monitored/security/armory) -"ouT" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/glass/reinforced, -/area/station/science/genetics) +"ouW" = ( +/obj/structure/table/wood, +/obj/item/storage/photo_album/library, +/obj/item/camera, +/obj/machinery/light/small/blacklight/directional/west, +/turf/open/floor/engine/cult, +/area/station/service/library) "ovi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall/r_wall, @@ -43415,16 +43434,13 @@ /turf/open/floor/glass/reinforced, /area/station/science/research) "ovK" = ( -/obj/effect/turf_decal/stripes/white/line{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/south{ dir = 1 }, -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/turf_decal/tile/neutral/tram, -/turf/open/floor/noslip/tram_plate/energized{ - outbound = 2; - inbound = 1 - }, -/area/station/hallway/primary/tram/left) +/turf/open/floor/plating, +/area/station/science/ordnance) "ovL" = ( /turf/open/floor/iron, /area/station/hallway/secondary/service) @@ -43451,6 +43467,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/checkpoint/supply) +"ovW" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) "ovY" = ( /obj/machinery/duct, /obj/structure/cable, @@ -43493,12 +43517,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) -"owM" = ( -/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/catwalk_floor, -/area/station/maintenance/port/central) "owO" = ( /turf/open/floor/engine, /area/station/science/explab) @@ -43556,20 +43574,6 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"oxG" = ( -/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/camera{ - c_tag = "Security - Prison Workshop"; - dir = 6; - network = list("ss13","Security","prison") - }, -/obj/item/stack/license_plates/empty/fifty, -/obj/item/stack/license_plates/empty/fifty, -/turf/open/floor/plating, -/area/station/security/prison/work) "oxL" = ( /turf/closed/wall/r_wall, /area/station/science/lab) @@ -43582,14 +43586,14 @@ "oys" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/central) -"oyJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +"oyy" = ( +/obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/turf/open/floor/iron, -/area/station/cargo/warehouse) +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/station/escapepodbay) "oyK" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -43605,19 +43609,12 @@ "oyR" = ( /turf/closed/mineral/random/stationside/asteroid/porus, /area/station/science/explab) -"oyV" = ( -/obj/structure/toilet{ - dir = 4 - }, -/obj/machinery/button/door/directional/west{ - id = "ToiletSci1"; - name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 +"ozd" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 8 }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/freezer, -/area/station/science/lower) +/turf/open/floor/iron, +/area/station/command/heads_quarters/ce) "ozz" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, @@ -43630,7 +43627,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron, /area/station/cargo/miningdock) "ozM" = ( @@ -43638,13 +43634,13 @@ /obj/item/storage/dice, /turf/open/floor/iron/dark, /area/station/commons/lounge) -"ozW" = ( -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 4 +"ozX" = ( +/obj/structure/toilet{ + dir = 8 }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos) +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/iron/freezer, +/area/station/security/prison) "oAf" = ( /obj/structure/industrial_lift/public, /obj/effect/turf_decal/trimline/dark_red/warning{ @@ -43661,10 +43657,20 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/catwalk_floor, /area/station/solars/starboard/fore) -"oAn" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ +"oAi" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/machinery/door/airlock/mining/glass{ + name = "MULE Storage" + }, +/obj/effect/mapping_helpers/airlock/access/all/supply/general, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"oAn" = ( /obj/machinery/airlock_sensor/incinerator_ordmix{ pixel_x = 23; pixel_y = 1 @@ -43672,20 +43678,11 @@ /obj/machinery/atmospherics/components/binary/pump{ dir = 1 }, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ + dir = 4 + }, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) -"oAF" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/machinery/duct, -/obj/machinery/light/directional/west, -/obj/machinery/status_display/evac/directional/west, -/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/safe) "oAG" = ( /obj/effect/turf_decal/trimline/brown/filled/line, /obj/effect/turf_decal/stripes{ @@ -43719,6 +43716,20 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/cargo/miningdock/cafeteria) +"oCj" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating{ + dir = 8 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Civilian - Recreational Area West" + }, +/obj/structure/cable, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "oCk" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -43764,20 +43775,6 @@ }, /turf/open/floor/plating/elevatorshaft, /area/station/science/lower) -"oCM" = ( -/obj/effect/turf_decal/caution/stand_clear/red{ - dir = 1 - }, -/obj/structure/industrial_lift/public, -/obj/structure/railing{ - dir = 8 - }, -/obj/machinery/elevator_control_panel/directional/west{ - linked_elevator_id = "tram_perma_lift"; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/security/execution/transfer) "oCR" = ( /obj/effect/turf_decal/stripes/white/full, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -43813,6 +43810,14 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) +"oDP" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/station/service/kitchen) "oEf" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, @@ -43821,6 +43826,20 @@ }, /turf/open/space/basic, /area/space/nearstation) +"oEl" = ( +/obj/structure/toilet{ + dir = 1 + }, +/obj/machinery/button/door/directional/west{ + id = "Toilet4"; + name = "Lock Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/effect/landmark/blobstart, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet) "oEz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43829,16 +43848,6 @@ }, /turf/open/floor/iron, /area/station/engineering/main) -"oEF" = ( -/obj/structure/railing, -/obj/effect/turf_decal/trimline/tram/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/tram/filled/warning{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/left) "oEI" = ( /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/carpet, @@ -43871,19 +43880,6 @@ }, /turf/open/space/basic, /area/space/nearstation) -"oFJ" = ( -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Telecomms Relay Access" - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) "oGj" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -43915,16 +43911,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/tram/left) -"oGv" = ( -/obj/structure/table, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron, -/area/station/medical/virology) -"oGy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) "oGF" = ( /obj/machinery/rnd/production/techfab/department/cargo, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -43957,20 +43943,6 @@ }, /turf/open/floor/iron/white, /area/station/science/lab) -"oGY" = ( -/obj/structure/toilet{ - pixel_y = 8 - }, -/obj/machinery/light/small/directional/east, -/obj/machinery/button/door/directional/west{ - id = "Toilet2"; - name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet) "oHp" = ( /obj/structure/bookcase/random/nonfiction, /turf/open/floor/wood/large, @@ -43978,8 +43950,8 @@ "oHq" = ( /obj/effect/turf_decal/tile/neutral/tram, /turf/open/floor/noslip/tram_plate/energized{ - outbound = 3; - inbound = 2 + inbound = 2; + outbound = 3 }, /area/station/hallway/primary/tram/right) "oHC" = ( @@ -44004,6 +43976,10 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) +"oHU" = ( +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/engine, +/area/station/science/xenobiology) "oIa" = ( /turf/closed/wall, /area/station/medical/morgue) @@ -44020,15 +43996,6 @@ /obj/effect/turf_decal/trimline/dark_green/filled/line, /turf/open/floor/iron/white, /area/station/science/genetics) -"oIk" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/obj/structure/sign/clock/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics) "oIz" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -44048,16 +44015,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/plating, /area/station/maintenance/tram/left) -"oJu" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/table/glass, -/obj/item/storage/box/beakers{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/storage/box/bodybags, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "oJx" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 @@ -44075,11 +44032,37 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white, /area/station/medical/surgery/fore) +"oKe" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron, +/area/station/security/courtroom/holding) +"oKh" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 + }, +/turf/open/floor/iron/dark, +/area/station/medical/virology) "oKl" = ( /obj/structure/lattice, /obj/structure/grille, /turf/open/space/openspace, /area/space/nearstation) +"oKn" = ( +/obj/machinery/elevator_control_panel{ + layer = 3.1; + linked_elevator_id = "tram_xeno_lift"; + pixel_y = 2; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") + }, +/turf/closed/wall/r_wall, +/area/station/science/xenobiology) "oKZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -44088,6 +44071,18 @@ /mob/living/simple_animal/bot/floorbot, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/maint) +"oLn" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/white/warning{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/maintenance/tram/right) "oLp" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -44122,26 +44117,12 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"oMM" = ( -/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/camera/directional/north{ - c_tag = "Security - Armory"; - network = list("ss13","Security") +"oMP" = ( +/obj/machinery/firealarm/directional/south{ + pixel_x = 3 }, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/ai_monitored/security/armory) +/turf/closed/mineral/random/stationside/asteroid/porus, +/area/station/asteroid) "oMU" = ( /obj/structure/railing/corner{ dir = 4 @@ -44184,6 +44165,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/port/central) +"oNG" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/lattice, +/turf/open/openspace, +/area/station/asteroid) "oNJ" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -44225,6 +44213,35 @@ }, /turf/open/space/openspace, /area/station/solars/port) +"oOP" = ( +/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/station/cargo/warehouse) +"oOT" = ( +/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/machinery/light/cold/directional/north, +/turf/open/floor/carpet, +/area/station/service/chapel/monastery) "oOZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -44251,16 +44268,6 @@ }, /turf/open/floor/iron/white, /area/station/science/genetics) -"oPk" = ( -/obj/effect/turf_decal/trimline/purple/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, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/station/science/lower) "oPs" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -44282,32 +44289,10 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/command/meeting_room) -"oQd" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/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, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) "oQf" = ( /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/station/solars/port) -"oQm" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/machinery/airalarm/directional/east, -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron, -/area/station/cargo/lobby) "oQq" = ( /obj/effect/turf_decal/trimline/neutral/warning{ dir = 1 @@ -44317,13 +44302,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"oQr" = ( -/obj/effect/landmark/secequipment, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/bot, -/obj/structure/sign/clock/directional/north, -/turf/open/floor/iron/showroomfloor, -/area/station/security/lockers) "oQs" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white, @@ -44336,6 +44314,16 @@ /obj/effect/turf_decal/trimline/yellow/filled/warning, /turf/open/floor/iron, /area/station/construction/mining/aux_base) +"oQO" = ( +/obj/structure/safe, +/obj/item/clothing/head/costume/bearpelt, +/obj/item/gun/ballistic/revolver/russian, +/obj/item/ammo_box/a357, +/obj/effect/turf_decal/bot_white/left, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/dim/directional/east, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) "oQU" = ( /obj/structure/window/reinforced/spawner/directional/north, /turf/open/misc/grass/jungle, @@ -44357,30 +44345,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"oRs" = ( -/obj/structure/sign/directions/evac{ - dir = 4; - pixel_y = -28 - }, -/obj/structure/sign/directions/medical{ - pixel_y = -34 - }, -/obj/structure/sign/directions/engineering{ - pixel_y = -40 - }, -/obj/structure/sign/directions/upload{ - dir = 4; - pixel_y = -22 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/tram/filled/line, -/obj/effect/turf_decal/trimline/tram/filled/warning, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "oRz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -44398,14 +44362,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/tram/left) -"oRH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/yellow/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/maintenance/port/central) "oRV" = ( /obj/machinery/firealarm/directional/north, /obj/effect/turf_decal/trimline/green/filled/line, @@ -44430,16 +44386,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/storage) -"oSj" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 5 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Security - Prison Main North-East" +"oSg" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/iron, -/area/station/security/prison) +/obj/machinery/light/warm/directional/south, +/turf/open/floor/wood, +/area/station/service/theater) "oSl" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -44463,18 +44417,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/checkpoint/supply) -"oSE" = ( -/obj/structure/table, -/obj/item/folder/white{ - pixel_y = 4 - }, -/obj/item/pen/red, -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/medical/virology) "oTa" = ( /obj/structure/railing{ dir = 9 @@ -44509,20 +44451,6 @@ dir = 4 }, /area/station/command/bridge) -"oTn" = ( -/obj/structure/toilet{ - dir = 1 - }, -/obj/machinery/light/small/directional/east, -/obj/machinery/button/door/directional/west{ - id = "Toilet4"; - name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/effect/landmark/blobstart, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet) "oTq" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -44531,6 +44459,13 @@ }, /turf/open/floor/plating, /area/station/security/detectives_office) +"oTu" = ( +/obj/machinery/power/apc/auto_name/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/wood, +/area/station/command/heads_quarters/captain/private) "oTA" = ( /turf/closed/wall, /area/station/commons/fitness/recreation/entertainment) @@ -44601,28 +44536,25 @@ /obj/effect/landmark/start/security_officer, /turf/open/floor/iron, /area/station/security/office) -"oUy" = ( -/obj/machinery/elevator_control_panel{ - linked_elevator_id = "tram_xeno_lift"; - pixel_y = 2; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck"); - layer = 3.1 +"oUA" = ( +/obj/structure/railing, +/obj/effect/turf_decal/trimline/tram/filled/line{ + dir = 8 }, -/turf/closed/wall/r_wall, -/area/station/science/xenobiology) -"oUY" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ +/obj/effect/turf_decal/trimline/tram/filled/warning{ dir = 8 }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 +/obj/effect/spawner/random/vending/colavend{ + pixel_x = -5 }, /obj/machinery/light/directional/west, -/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/commons/fitness/recreation) +/area/station/hallway/primary/tram/right) +"oVc" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/iron/dark, +/area/station/service/bar) "oVd" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 9 @@ -44727,21 +44659,12 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/security/checkpoint/medical) -"oYs" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Medical - Surgery B"; - network = list("ss13","medbay") - }, -/obj/machinery/vending/wallmed/directional/north, -/obj/structure/disposalpipe/trunk{ - dir = 2 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) +"oXU" = ( +/obj/machinery/computer/order_console/cook, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "oYE" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ @@ -44792,15 +44715,11 @@ /obj/machinery/door/airlock/public/glass/incinerator/atmos_interior, /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/obj/machinery/airlock_controller/incinerator_atmos{ + pixel_x = -24 + }, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) -"oZm" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/machinery/modular_computer/console/preset/cargochat/cargo, -/turf/open/floor/iron, -/area/station/cargo/office) "oZq" = ( /obj/effect/turf_decal/trimline/neutral/filled/warning{ dir = 8 @@ -44823,18 +44742,11 @@ /area/station/security/brig) "oZC" = ( /obj/structure/industrial_lift/tram/white, -/obj/effect/landmark/tram/tramstation/central, /obj/effect/turf_decal/tile/neutral/tram, +/obj/effect/landmark/tram/nav/tramstation/main, +/obj/effect/landmark/tram/platform/tramstation/central, /turf/open/floor/noslip/tram_plate, /area/station/hallway/primary/tram/center) -"oZU" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 6 - }, -/obj/structure/table, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) "pal" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -44845,6 +44757,13 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/port/central) +"pam" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/service/theater) "paq" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/heat_exchanging/junction{ @@ -44852,6 +44771,20 @@ }, /turf/closed/wall/r_wall, /area/station/engineering/supermatter/room) +"paH" = ( +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/machinery/button/door/directional/west{ + id = "Toilet2"; + name = "Lock Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/effect/landmark/start/assistant, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet) "paS" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -44866,6 +44799,18 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/checker, /area/station/commons/lounge) +"pbo" = ( +/obj/structure/rack, +/obj/machinery/camera/directional/north{ + c_tag = "Security - Armory"; + network = list("ss13","Security") + }, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/cable, +/obj/effect/spawner/random/armory/e_gun, +/turf/open/floor/iron, +/area/station/ai_monitored/security/armory) "pbr" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/stripes/line{ @@ -44873,6 +44818,22 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"pbx" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/item/bedsheet/captain{ + dir = 4 + }, +/obj/structure/sign/clock/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Command - Captain's Quarters" + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) "pby" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -44933,6 +44894,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/courtroom) +"pcI" = ( +/obj/machinery/quantum_server, +/obj/effect/turf_decal/bot/left, +/turf/open/floor/iron/dark/smooth_corner{ + dir = 4 + }, +/area/station/bitrunning/den) "pcO" = ( /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -44947,6 +44915,12 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) +"pcZ" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/cable, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating/airless, +/area/station/solars/starboard/fore) "pdf" = ( /obj/machinery/camera/directional/north{ c_tag = "Engineering - Security Outpost"; @@ -45033,6 +45007,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/prison/safe) +"peB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/binary/pump/on/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/plating, +/area/station/maintenance/disposal/incinerator) "peO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/showroomfloor, @@ -45043,6 +45023,14 @@ }, /turf/open/floor/iron, /area/station/science/ordnance/storage) +"pfj" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/obj/machinery/firealarm/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/showroomfloor, +/area/station/security/warden) "pfm" = ( /obj/item/bedsheet/dorms_double{ dir = 4 @@ -45126,16 +45114,6 @@ /obj/structure/table, /turf/open/floor/iron/dark, /area/station/service/chapel/monastery) -"pgK" = ( -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/turf/open/floor/iron, -/area/station/engineering/atmos) "pgS" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -45217,33 +45195,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"piM" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced/spawner/directional/south, -/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/machinery/door/window/right/directional/east{ - name = "Secure Medical Storage"; - req_access = list("medical") - }, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"piT" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark/herringbone, -/area/station/commons/vacant_room) "piX" = ( /turf/open/floor/engine/n2o, /area/station/engineering/atmos) @@ -45304,6 +45255,13 @@ /obj/structure/cable/layer1, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"pjP" = ( +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/structure/flora/bush/leavy/style_random, +/mob/living/carbon/human/species/monkey, +/obj/machinery/light/directional/east, +/turf/open/floor/grass, +/area/station/medical/virology) "pjQ" = ( /obj/structure/chair/stool/directional/south, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -45364,6 +45322,21 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"pkH" = ( +/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/item/food/meat/rawcutlet/plain, +/obj/item/food/meat/rawcutlet/plain, +/obj/item/food/meat/rawcutlet/plain, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/cafeteria, +/area/station/security/prison/mess) "pkP" = ( /obj/machinery/computer/shuttle/labor{ dir = 1 @@ -45418,18 +45391,19 @@ /turf/open/floor/plating, /area/station/commons/vacant_room) "plH" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=2"; - location = "QM #2" +/obj/effect/turf_decal/box/corners{ + dir = 8 }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #2"; - suffix = "#2" +/obj/effect/turf_decal/box/corners{ + dir = 1 }, -/turf/open/floor/iron, -/area/station/cargo/storage) +/obj/effect/decal/cleanable/oil/streak, +/obj/structure/sign/poster/random/directional/north, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/effect/landmark/bitrunning/station_reward_spawn, +/turf/open/floor/iron/dark/smooth_large, +/area/station/bitrunning/den) "plQ" = ( /obj/effect/turf_decal/trimline/red/filled/corner, /obj/structure/disposalpipe/segment{ @@ -45445,6 +45419,13 @@ /obj/structure/sign/poster/official/here_for_your_safety/directional/south, /turf/open/floor/iron, /area/station/security/prison) +"plW" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) "pmc" = ( /obj/machinery/airalarm/directional/west, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -45467,12 +45448,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/hallway/primary/tram/left) -"pmn" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) "pmq" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 6 @@ -45503,11 +45478,28 @@ /obj/structure/industrial_lift/public, /turf/open/floor/plating/elevatorshaft, /area/station/maintenance/tram/mid) +"pmG" = ( +/obj/structure/sink/directional/south, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/freezer, +/area/station/security/prison) "pmM" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/white, /area/station/science/research) +"pmO" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 6 + }, +/obj/machinery/disposal/bin, +/obj/item/radio/intercom/directional/south, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/iron, +/area/station/engineering/break_room) "pne" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ @@ -45534,28 +45526,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) -"pnu" = ( -/obj/machinery/light/directional/south, -/obj/machinery/light_switch/directional/south{ - pixel_x = -8 - }, -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants/random, -/turf/open/floor/iron/white/corner{ - dir = 1 - }, -/area/station/service/kitchen) -"pnz" = ( -/obj/structure/sign/clock/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/neutral/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) "pnF" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/thinplating, @@ -45608,17 +45578,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) -"poy" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner, -/obj/effect/turf_decal/trimline/neutral/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/corner, -/turf/open/floor/iron, -/area/station/hallway/secondary/construction/engineering) "poE" = ( /obj/structure/industrial_lift/tram/subfloor/window, /obj/structure/window/reinforced/tram/front{ @@ -45698,6 +45657,54 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"ppK" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/iron/grimy, +/area/station/service/library/lounge) +"ppQ" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/cable/layer1, +/obj/structure/cable, +/obj/machinery/light/floor, +/turf/open/floor/plating, +/area/station/solars/port) +"ppU" = ( +/obj/structure/railing, +/obj/effect/turf_decal/trimline/tram/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/tram/filled/warning{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/left) +"pqd" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/warning{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/corner{ + dir = 1 + }, +/obj/structure/sign/departments/security{ + pixel_x = 32 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"pqf" = ( +/obj/machinery/light/warm/directional/west, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "pqU" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door_buttons/airlock_controller{ @@ -45794,6 +45801,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/storage/primary) +"psa" = ( +/obj/structure/tank_holder/anesthetic, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/station/science/robotics/lab) "pso" = ( /obj/machinery/portable_atmospherics/pump, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -45857,26 +45869,13 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"ptp" = ( -/obj/structure/table/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/obj/machinery/newscaster/directional/south, -/obj/machinery/fax{ - fax_name = "Psychology Office"; - name = "Psychology Office Fax Machine" - }, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) "pts" = ( /obj/machinery/power/smes{ capacity = 9e+006; charge = 10000 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "ptu" = ( @@ -45902,6 +45901,11 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating/airless, /area/station/asteroid) +"ptL" = ( +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "ptQ" = ( /turf/open/openspace, /area/station/science/genetics) @@ -45929,8 +45933,8 @@ /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 }, -/obj/structure/bed{ - dir = 4 +/obj/structure/bed/medical/anchored{ + dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, @@ -45952,31 +45956,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/courtroom/holding) -"pum" = ( -/obj/effect/turf_decal/sand/plating, +"puo" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, /obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/box, -/obj/item/stack/sheet/cardboard, -/turf/open/floor/plating, -/area/station/engineering/atmos) +/turf/open/floor/iron, +/area/station/cargo/warehouse) "pur" = ( /obj/effect/turf_decal/trimline/white/line{ dir = 9 }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"puG" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/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, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/checkpoint/escape) "puL" = ( /obj/machinery/door/airlock/research/glass/incinerator/ordmix_exterior{ name = "Burn Chamber Exterior Airlock" @@ -46002,6 +45997,17 @@ /obj/structure/fluff/tram_rail/anchor, /turf/open/openspace, /area/station/hallway/primary/tram/right) +"puZ" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/machinery/firealarm/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/engineering/main) "pvg" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -46015,12 +46021,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) -"pvm" = ( -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/command/teleporter) "pvp" = ( /obj/effect/turf_decal/trimline/yellow/filled/end{ dir = 1 @@ -46044,19 +46044,33 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos) -"pvJ" = ( -/obj/structure/railing, +"pvI" = ( +/obj/structure/sign/directions/evac{ + dir = 4; + pixel_y = 28 + }, +/obj/structure/sign/directions/medical{ + dir = 8; + pixel_y = 34 + }, +/obj/structure/sign/directions/engineering{ + dir = 8; + pixel_y = 40 + }, +/obj/structure/sign/directions/upload{ + pixel_y = 22 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/tram/filled/line{ - dir = 8 + dir = 1 }, /obj/effect/turf_decal/trimline/tram/filled/warning{ - dir = 8 - }, -/obj/machinery/vending/cigarette{ - pixel_x = -5 + dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/hallway/primary/tram/center) +/area/station/hallway/primary/tram/right) "pvU" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -46098,10 +46112,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/command/gateway) -"pwv" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/engine/air, -/area/station/engineering/atmos) "pwx" = ( /obj/structure/chair, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -46181,22 +46191,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/cargo/warehouse) -"pxH" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable/layer1, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ - dir = 5 - }, -/obj/effect/turf_decal/trimline/yellow/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/engine_smes) "pxM" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -46215,6 +46209,22 @@ "pxW" = ( /turf/closed/wall/r_wall, /area/station/security/prison/safe) +"pxY" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/layer1, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/engineering/engine_smes) "pyf" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/trimline/neutral/filled/warning, @@ -46335,14 +46345,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/service/hydroponics/garden) -"pAl" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/plumbing/synthesizer{ - reagent_id = /datum/reagent/water - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/maintenance/central/greater) "pAo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/white/filled/line{ @@ -46356,6 +46358,13 @@ /obj/machinery/shower/directional/north, /turf/open/floor/iron/freezer, /area/station/commons/toilet) +"pAw" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "pAA" = ( /obj/machinery/door/airlock/vault{ name = "High Security Vault" @@ -46463,14 +46472,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/sorting) -"pBV" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/machinery/computer/prisoner/management, -/obj/structure/reagent_dispensers/wall/peppertank/directional/north, -/turf/open/floor/iron, -/area/station/security/checkpoint/escape) "pBZ" = ( /obj/structure/railing/corner{ dir = 4 @@ -46499,6 +46500,13 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/security/checkpoint/supply) +"pCr" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/engineering/main) "pCL" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -46553,30 +46561,12 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"pDB" = ( -/obj/effect/turf_decal/sand/plating, -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/turf_decal/box, -/obj/structure/sign/warning/directional/west{ - desc = "A sign warning you to be cautious of falling packages."; - name = "FALLING HAZARD sign" - }, -/obj/item/stack/sheet/cardboard, -/turf/open/floor/plating, -/area/station/engineering/main) -"pDD" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/head/utility/radiation, -/obj/item/clothing/glasses/meson, -/obj/item/clothing/glasses/meson, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/firealarm/directional/north, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +"pDz" = ( +/obj/structure/rack, +/obj/effect/spawner/random/techstorage/ai_all, +/obj/effect/turf_decal/trimline/white/filled/line, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "pDF" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 @@ -46592,18 +46582,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"pDZ" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/effect/turf_decal/trimline/red/corner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "pEa" = ( /obj/machinery/atmospherics/components/unary/passive_vent{ dir = 8; @@ -46656,6 +46634,12 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/iron/white/side, /area/station/science/research) +"pFm" = ( +/obj/machinery/porta_turret/ai{ + dir = 4 + }, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai_upload) "pFp" = ( /obj/effect/turf_decal/trimline/dark_red/warning{ dir = 6 @@ -46801,18 +46785,20 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) +"pHl" = ( +/obj/machinery/light/floor, +/turf/open/floor/grass, +/area/station/science/lower) "pHM" = ( /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) -"pHS" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/airlock_sensor/incinerator_atmos{ - pixel_y = 24 +"pHX" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ + dir = 1 }, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) +/turf/open/floor/circuit/green, +/area/station/science/server) "pIb" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -46820,10 +46806,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/miningdock) -"pIf" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/grass, -/area/station/service/hydroponics) "pIk" = ( /obj/machinery/duct, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -46843,17 +46825,37 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/maint) -"pIu" = ( +"pIt" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 + dir = 1 }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/directional/west, -/obj/machinery/newscaster/directional/west, +/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, +/obj/machinery/light/directional/north, /turf/open/floor/iron, -/area/station/engineering/atmos) +/area/station/tcommsat/computer) +"pIx" = ( +/obj/structure/table, +/obj/item/clipboard, +/obj/item/wrench, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/machinery/camera/directional/south{ + c_tag = "Science - Server Room"; + network = list("ss13","rd") + }, +/turf/open/floor/circuit/green, +/area/station/science/server) +"pIA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "pIQ" = ( /obj/structure/cable, /turf/closed/wall/r_wall, @@ -46944,6 +46946,25 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/engine_smes) +"pKo" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"pKr" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp, +/obj/machinery/requests_console/directional/north{ + department = "Chapel"; + name = "Chapel Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) "pKC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47054,6 +47075,20 @@ "pMk" = ( /turf/closed/wall/r_wall, /area/station/science/research) +"pMw" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/white, +/area/station/science/lower) "pMz" = ( /obj/structure/table/glass, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -47069,6 +47104,21 @@ /obj/structure/ladder, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"pMS" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/item/radio/intercom/directional/west, +/obj/machinery/airalarm/directional/north, +/obj/machinery/light_switch/directional/west{ + pixel_x = -23; + pixel_y = -8 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/arrivals) +"pMW" = ( +/turf/open/space/openspace, +/area/space) "pNa" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -47088,18 +47138,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"pNd" = ( -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/ai_monitored/command/storage/eva) "pNj" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/machinery/airalarm/directional/south, @@ -47112,6 +47150,18 @@ }, /turf/closed/wall/r_wall, /area/station/engineering/atmos) +"pNv" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 6 + }, +/obj/machinery/firealarm/directional/east{ + pixel_y = 3 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/auxlab/firing_range) "pNz" = ( /obj/effect/landmark/navigate_destination/chapel, /turf/open/floor/carpet, @@ -47191,6 +47241,13 @@ /obj/structure/railing, /turf/open/floor/plating/elevatorshaft, /area/station/maintenance/tram/left) +"pOL" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "pOQ" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -47226,17 +47283,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/science/lower) -"pPr" = ( -/obj/structure/table, -/obj/machinery/light/directional/north, -/obj/machinery/airalarm/directional/north, -/obj/machinery/fax{ - fax_name = "Service Hallway"; - name = "Service Fax Machine" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "pPA" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -47302,11 +47348,6 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/command/meeting_room) -"pRF" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "pRM" = ( /turf/closed/wall, /area/station/cargo/sorting) @@ -47318,16 +47359,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/courtroom) -"pSg" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/trimline/white/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 5 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) "pSr" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 9 @@ -47375,6 +47406,13 @@ /obj/effect/turf_decal/siding/thinplating/corner, /turf/open/floor/iron/dark, /area/station/science/xenobiology) +"pTW" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "pUi" = ( /obj/structure/railing{ dir = 4 @@ -47446,6 +47484,10 @@ }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) +"pUS" = ( +/obj/structure/cable, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hos) "pUV" = ( /obj/structure/table, /obj/item/clipboard, @@ -47471,19 +47513,6 @@ /obj/structure/cable/layer1, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"pVb" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/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) "pVk" = ( /obj/machinery/duct, /obj/structure/cable, @@ -47491,52 +47520,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/surgery/fore) -"pVy" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/machinery/light/very_dim/directional/west, -/turf/open/floor/iron/dark/herringbone, -/area/station/commons/vacant_room) "pVD" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/yellow/warning, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/port/central) -"pVJ" = ( -/obj/machinery/seed_extractor, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/green/fourcorners, +"pVI" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/warm/directional/north, /turf/open/floor/iron/dark, -/area/station/service/hydroponics) -"pVW" = ( -/obj/structure/table/glass, -/obj/item/crowbar, -/obj/item/hatchet, -/obj/item/plant_analyzer, -/obj/item/cultivator, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"pWp" = ( -/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/item/food/meat/rawcutlet/plain, -/obj/item/food/meat/rawcutlet/plain, -/obj/item/food/meat/rawcutlet/plain, -/turf/open/floor/iron/cafeteria, -/area/station/security/prison/mess) +/area/station/service/bar) "pWw" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -47633,6 +47627,18 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/main) +"pYh" = ( +/obj/structure/table/glass, +/obj/item/crowbar, +/obj/item/hatchet, +/obj/item/plant_analyzer, +/obj/item/cultivator, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) "pYt" = ( /obj/structure/table/wood, /obj/item/book/manual/wiki/security_space_law, @@ -47725,17 +47731,15 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/station/solars/starboard/fore) -"pZU" = ( -/obj/structure/rack, -/obj/item/clothing/under/color/blue, -/obj/item/clothing/under/color/blue, -/obj/item/clothing/under/color/blue, -/obj/item/clothing/head/soft/blue, -/obj/item/clothing/head/soft/blue, -/obj/item/clothing/head/soft/blue, -/obj/effect/turf_decal/tile/blue/full, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/fitness/recreation/entertainment) +"pZM" = ( +/obj/machinery/airalarm/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Science - Cytology West"; + network = list("ss13","rd","xeno") + }, +/obj/machinery/hydroponics/soil, +/turf/open/floor/grass, +/area/station/science/xenobiology) "pZW" = ( /turf/closed/wall, /area/station/maintenance/port/central) @@ -47787,29 +47791,12 @@ "qaO" = ( /turf/open/misc/asteroid, /area/station/medical/chemistry) -"qaU" = ( -/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/trimline/red/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 8 - }, -/obj/machinery/firealarm/directional/north{ - pixel_x = 4 - }, -/obj/machinery/light_switch/directional/north{ - pixel_x = -10 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/science) "qaX" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 }, +/obj/machinery/incident_display/tram/directional/north, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "qbp" = ( @@ -47826,14 +47813,12 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit) -"qbP" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/bodycontainer/morgue{ - dir = 2 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) +"qbT" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/structure/filingcabinet, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/security/checkpoint/engineering) "qch" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -47873,6 +47858,18 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/iron/smooth, /area/station/service/hydroponics) +"qcU" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/machinery/airalarm/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Medical - Breakroom"; + network = list("ss13","medbay") + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) "qda" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 6 @@ -47908,6 +47905,16 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"qdF" = ( +/obj/structure/rack, +/obj/item/electronics/apc, +/obj/item/electronics/airlock, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/commons/storage/tools) "qdG" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -47939,10 +47946,17 @@ /area/station/cargo/lobby) "qeg" = ( /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_ordmix{ - dir = 4 + dir = 8 }, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) +"qel" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/wood, +/area/station/service/lawoffice) "qeo" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -47952,6 +47966,16 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plating, /area/station/maintenance/tram/right) +"qeq" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 10 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "qes" = ( /obj/machinery/door/airlock/grunge{ name = "Entertainment Center" @@ -47961,29 +47985,42 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation/entertainment) +"qez" = ( +/obj/machinery/computer/slot_machine{ + pixel_y = 2 + }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/dark, +/area/station/commons/lounge) "qeD" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 }, /turf/open/floor/iron, /area/station/commons/storage/primary) -"qeL" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 +"qeS" = ( +/obj/structure/table/reinforced, +/obj/item/storage/fancy/coffee_cart_rack{ + pixel_x = -8; + pixel_y = 6 }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ +/obj/effect/spawner/random/food_or_drink/donkpockets{ + pixel_x = 4; + pixel_y = 6 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 }, -/obj/machinery/light_switch/directional/east{ - pixel_x = 22; - pixel_y = 9 +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) +"qfc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/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, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) +/obj/machinery/light/directional/west, +/turf/open/floor/engine, +/area/station/science/auxlab/firing_range) "qfg" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -48062,17 +48099,6 @@ "qgt" = ( /turf/closed/wall/rock/porous, /area/station/medical/chemistry) -"qgx" = ( -/obj/machinery/biogenerator, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Civilian - Public Garden" - }, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) "qgB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48095,6 +48121,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"qgS" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) "qha" = ( /obj/machinery/door/poddoor/incinerator_atmos_aux, /turf/open/floor/engine, @@ -48132,6 +48164,11 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/miningdock) +"qid" = ( +/obj/structure/ladder, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/dark, +/area/station/service/bar) "qif" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/freezer, @@ -48172,6 +48209,12 @@ }, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) +"qiO" = ( +/obj/machinery/bluespace_beacon, +/obj/structure/cable, +/obj/effect/landmark/navigate_destination/teleporter, +/turf/open/floor/circuit, +/area/station/command/teleporter) "qiV" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -48182,6 +48225,25 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/courtroom/holding) +"qiW" = ( +/obj/machinery/digital_clock, +/turf/closed/wall/r_wall, +/area/station/command/bridge) +"qjp" = ( +/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/firealarm/directional/south{ + pixel_x = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/science/ordnance/testlab) "qjA" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -48209,13 +48271,19 @@ /obj/item/plant_analyzer, /turf/open/floor/iron/dark, /area/station/security/prison/garden) -"qjJ" = ( -/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) +"qjI" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/recharger, +/obj/structure/cable, +/obj/machinery/light_switch/directional/east{ + pixel_x = 23; + pixel_y = -8 + }, +/turf/open/floor/iron/showroomfloor, +/area/station/security/warden) "qjT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -48282,6 +48350,14 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/greater) +"qkN" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/engineering/atmos) "qkP" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/chem_dispenser, @@ -48320,35 +48396,27 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"qlk" = ( -/obj/machinery/atmospherics/components/unary/cryo_cell{ - dir = 4 +"qmc" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/medical/treatment_center) -"qmd" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/machinery/light/directional/south, -/obj/machinery/firealarm/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/security/brig) -"qmp" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/engine/n2o, -/area/station/engineering/atmos) -"qmq" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 4 +/obj/item/radio/intercom/directional/north, +/obj/machinery/vending/wardrobe/chem_wardrobe, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"qmr" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/machinery/disposal/bin, +/obj/machinery/camera/directional/south{ + c_tag = "Departures - South Main" }, -/obj/effect/turf_decal/trimline/neutral/filled/corner{ +/obj/structure/disposalpipe/trunk{ dir = 1 }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/hallway/secondary/exit/departure_lounge) "qmH" = ( /obj/structure/closet/secure_closet/quartermaster, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -48418,6 +48486,10 @@ }, /turf/open/floor/iron, /area/station/science/explab) +"qnL" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/noslip/tram, +/area/station/hallway/primary/tram/right) "qnU" = ( /obj/effect/turf_decal/trimline/red/filled/corner, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -48470,6 +48542,10 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) +"qoZ" = ( +/obj/item/paper/fluff/ids_for_dummies, +/turf/open/misc/asteroid/airless, +/area/station/asteroid) "qpb" = ( /obj/structure/closet/secure_closet/exile, /obj/effect/turf_decal/bot, @@ -48532,18 +48608,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/commons/fitness/recreation) -"qqn" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 6 - }, -/obj/machinery/camera{ - c_tag = "Security - Prison Main South-East"; - dir = 6; - network = list("ss13","Security","prison") - }, -/turf/open/floor/iron, -/area/station/security/prison) "qqv" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/on, /obj/machinery/light/directional/north, @@ -48553,13 +48617,6 @@ /obj/machinery/pdapainter/supply, /turf/open/floor/carpet, /area/station/command/heads_quarters/qm) -"qqx" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "qqE" = ( /obj/effect/turf_decal/trimline/white/line{ dir = 6 @@ -48581,6 +48638,10 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"qrl" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/noslip/tram, +/area/station/hallway/primary/tram/center) "qrs" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/decal/cleanable/dirt, @@ -48592,11 +48653,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) -"qrR" = ( -/obj/machinery/chem_heater/withbuffer, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "qrW" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -48642,14 +48698,6 @@ /obj/structure/table, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"qsM" = ( -/obj/machinery/light/directional/west, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/atmospherics/components/binary/pump{ - name = "Port Mix to West Ports" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "qsP" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -48659,6 +48707,19 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"qsU" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/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, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) "qtb" = ( /obj/machinery/atmospherics/pipe/smart/manifold/violet/visible{ dir = 8 @@ -48666,6 +48727,17 @@ /obj/machinery/meter, /turf/open/floor/iron, /area/station/engineering/atmos) +"qtc" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/item/stack/medical/gauze, +/obj/item/stack/medical/mesh, +/obj/item/radio/intercom/directional/east, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "qti" = ( /obj/effect/turf_decal/siding/wood{ dir = 9 @@ -48690,6 +48762,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) +"qtM" = ( +/obj/machinery/shower/directional/north, +/obj/structure/curtain, +/obj/item/soap/syndie, +/turf/open/floor/iron/showroomfloor, +/area/station/commons/vacant_room) "qtQ" = ( /obj/effect/turf_decal/trimline/neutral/warning, /obj/structure/table/reinforced, @@ -48697,7 +48775,7 @@ pixel_y = 8 }, /obj/structure/window/reinforced/spawner/directional/north, -/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/item/surgery_tray/full/morgue, /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark, /area/station/medical/morgue) @@ -48756,6 +48834,17 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation/entertainment) +"qvl" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/effect/landmark/start/prisoner, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/security/prison/safe) "qvF" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -48775,23 +48864,12 @@ }, /turf/open/floor/iron, /area/station/command/bridge) -"qvM" = ( -/obj/structure/table/wood, -/turf/open/floor/iron/grimy, -/area/station/hallway/secondary/entry) -"qvU" = ( -/obj/effect/turf_decal/box/red/corners{ - dir = 4 - }, -/obj/effect/turf_decal/box/red/corners{ +"qvV" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, -/obj/effect/turf_decal/box/red/corners{ - dir = 1 - }, -/obj/effect/turf_decal/box/red/corners, -/turf/open/floor/engine, -/area/station/science/xenobiology) +/turf/open/floor/iron, +/area/station/security/prison/work) "qwq" = ( /obj/structure/table/wood, /obj/item/radio/intercom, @@ -48812,13 +48890,6 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/wood, /area/station/service/bar/backroom) -"qwI" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Hallway - Central Tram Platform South"; - pixel_y = -23 - }, -/turf/open/floor/noslip/tram, -/area/station/hallway/primary/tram/center) "qwU" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 6 @@ -48827,6 +48898,15 @@ /obj/item/storage/bag/money, /turf/open/floor/iron/dark, /area/station/cargo/miningdock/oresilo) +"qwV" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/status_display/door_timer{ + id = "Isolation_B"; + name = "Isolation Cell B"; + pixel_y = -32 + }, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "qwX" = ( /obj/structure/flora/bush/grassy/style_random, /turf/open/floor/grass, @@ -48960,14 +49040,6 @@ }, /turf/open/floor/wood/large, /area/station/service/theater) -"qzD" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/line, -/turf/open/floor/iron, -/area/station/cargo/storage) "qzI" = ( /obj/structure/sign/warning/vacuum/external/directional/south, /obj/effect/turf_decal/trimline/yellow/filled/line, @@ -49053,11 +49125,23 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/command/bridge) -"qBE" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/maintenance/tram/right) +"qBA" = ( +/obj/machinery/disposal/bin, +/obj/machinery/firealarm/directional/west{ + pixel_y = 5 + }, +/obj/structure/plaque/static_plaque/golden/captain{ + pixel_y = 32 + }, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/obj/machinery/light_switch/directional/west{ + pixel_x = -23; + pixel_y = -8 + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain) "qBL" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -49110,6 +49194,13 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/port/central) +"qCh" = ( +/obj/structure/closet/secure_closet/captains, +/obj/machinery/computer/security/telescreen/entertainment/directional/north, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) "qCz" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/dark, @@ -49125,6 +49216,34 @@ /obj/structure/cable/layer1, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"qCJ" = ( +/obj/structure/sign/directions/evac{ + dir = 4; + pixel_y = 28 + }, +/obj/structure/sign/directions/medical{ + dir = 4; + pixel_y = 34 + }, +/obj/structure/sign/directions/engineering{ + dir = 4; + pixel_y = 40 + }, +/obj/structure/sign/directions/upload{ + dir = 4; + pixel_y = 22 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/tram/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/tram/filled/warning{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/left) "qCL" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -49181,6 +49300,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/service/chapel/office) +"qDd" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/security/prison/workout) "qDn" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -49238,38 +49365,6 @@ "qEH" = ( /turf/closed/wall, /area/station/solars/port) -"qEM" = ( -/obj/structure/rack, -/obj/item/clothing/suit/armor/riot{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/suit/armor/riot, -/obj/item/clothing/suit/armor/riot{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/clothing/head/helmet/toggleable/riot{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/head/helmet/toggleable/riot, -/obj/item/clothing/head/helmet/toggleable/riot{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/shield/riot{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/shield/riot, -/obj/item/shield/riot{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "qFf" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -49307,62 +49402,10 @@ /obj/machinery/telecomms/processor/preset_four, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"qFM" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/siding/thinplating, -/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, -/obj/effect/turf_decal/trimline/white/warning, -/turf/open/floor/iron, -/area/station/maintenance/tram/mid) -"qFY" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 5 - }, -/obj/structure/table, -/obj/item/holosign_creator/atmos, -/obj/item/holosign_creator/atmos{ - pixel_x = 5; - pixel_y = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/ordnance) -"qGl" = ( -/obj/structure/table, -/obj/machinery/light/small/directional/west, -/obj/item/radio/intercom/prison/directional/north, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/security/execution/transfer) "qGy" = ( /obj/structure/transit_tube/crossing, /turf/open/floor/plating/airless, /area/space/nearstation) -"qGC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/storage/toolbox/emergency, -/obj/item/crowbar, -/obj/structure/sign/collision_counter{ - desc = "A display that indicates how many dents that'll need fixed after the shift is over."; - name = "darwin award counter"; - pixel_x = 32 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/maintenance/port/central) "qGE" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -49372,11 +49415,31 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"qGG" = ( +/obj/item/reagent_containers/cup/bucket{ + pixel_x = 4; + pixel_y = -6 + }, +/obj/item/mop, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb, +/mob/living/basic/mouse/gray{ + dir = 4; + name = "Plaguebearer" + }, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/plating, +/area/station/medical/virology) "qGM" = ( /obj/effect/turf_decal/stripes/white/line, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/disposal) +"qHa" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/storage) "qHe" = ( /obj/machinery/camera/directional/north{ c_tag = "Secure - Gateway" @@ -49426,19 +49489,27 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/dorms) -"qHK" = ( -/obj/structure/toilet{ - dir = 4 +"qHI" = ( +/obj/structure/table/reinforced, +/obj/machinery/firealarm/directional/west, +/obj/item/storage/box, +/obj/item/hand_labeler{ + pixel_y = 8 }, -/obj/machinery/button/door/directional/west{ - id = "ToiletSci2"; - name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/machinery/light_switch/directional/west{ + pixel_x = -22; + pixel_y = 8 }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/freezer, -/area/station/science/lower) +/turf/open/floor/iron, +/area/station/cargo/sorting) +"qHM" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/food_or_drink/refreshing_beverage, +/obj/machinery/newscaster/directional/west, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/grimy, +/area/station/hallway/secondary/entry) "qHN" = ( /obj/item/kirbyplants/random, /obj/machinery/duct, @@ -49475,6 +49546,11 @@ /obj/machinery/computer/crew, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"qIq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/machinery/light/directional/west, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "qIs" = ( /obj/structure/closet/secure_closet/security, /obj/effect/turf_decal/trimline/red/filled/line, @@ -49483,6 +49559,18 @@ /obj/item/clothing/mask/whistle, /turf/open/floor/iron, /area/station/security/checkpoint/arrivals) +"qIt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/right) +"qIA" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/execution/transfer) "qIC" = ( /obj/effect/turf_decal/siding/thinplating/corner{ dir = 4 @@ -49513,24 +49601,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) +"qJf" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain) "qJh" = ( /obj/structure/railing/corner{ dir = 1 }, /turf/open/floor/glass/reinforced, /area/station/ai_monitored/turret_protected/aisat/hallway) -"qJy" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"qJz" = ( -/obj/effect/turf_decal/siding/thinplating/dark, -/obj/structure/table, -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) "qJY" = ( /obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ dir = 8 @@ -49576,17 +49659,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos) -"qKx" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/light/directional/south, -/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 = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/construction/engineering) "qKE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -49597,13 +49669,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/science/server) -"qKW" = ( -/obj/structure/chair/comfy/beige{ - dir = 8 - }, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/iron/grimy, -/area/station/hallway/secondary/entry) "qLD" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -49614,12 +49679,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/port/central) -"qLG" = ( -/obj/structure/table/wood, -/obj/machinery/light/warm/directional/east, -/obj/effect/spawner/random/entertainment/musical_instrument, -/turf/open/floor/wood, -/area/station/service/theater) "qLJ" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -49646,17 +49705,6 @@ }, /turf/open/floor/plating, /area/station/command/heads_quarters/rd) -"qLW" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 - }, -/obj/machinery/light/directional/north, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/table/glass, -/obj/machinery/microwave, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/break_room) "qMb" = ( /obj/structure/table, /obj/item/exodrone{ @@ -49701,12 +49749,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/dorms) -"qMW" = ( -/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, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) "qNa" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -49735,17 +49777,14 @@ }, /turf/open/floor/iron/dark, /area/station/science/xenobiology) -"qNz" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 +"qNv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 }, -/obj/structure/table/reinforced, -/obj/item/papercutter, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/iron/smooth, +/area/station/maintenance/tram/mid) "qNA" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -49873,6 +49912,14 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/office) +"qQa" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 9 + }, +/obj/structure/table, +/obj/item/phone, +/turf/open/floor/iron/dark, +/area/station/science/lower) "qQc" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/structure/table, @@ -49934,16 +49981,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"qRT" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/machinery/airalarm/directional/west, -/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/secondary/exit) "qSg" = ( /obj/machinery/door/airlock/security/glass{ name = "Trial Cell B" @@ -49970,6 +50007,11 @@ /obj/machinery/computer/security/telescreen/interrogation, /turf/open/floor/iron/dark, /area/station/security/interrogation) +"qSQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/left) "qSS" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -49985,8 +50027,8 @@ dir = 8 }, /obj/machinery/door/window/elevator/left/directional/east{ - elevator_mode = 1; - elevator_linked_id = "tram_dorm_lift" + elevator_linked_id = "tram_dorm_lift"; + elevator_mode = 1 }, /turf/open/floor/iron, /area/station/maintenance/tram/left) @@ -49999,6 +50041,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/commons/dorms) +"qTt" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/status_display/door_timer{ + id = "Isolation_A"; + name = "Isolation Cell A"; + pixel_y = 32 + }, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "qTv" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -50029,19 +50082,6 @@ }, /turf/open/floor/engine/co2, /area/station/engineering/atmos) -"qUb" = ( -/obj/machinery/light/directional/north, -/obj/machinery/camera{ - c_tag = "Arrivals - South Docking Wing"; - dir = 9 - }, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "qUg" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -50094,6 +50134,17 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) +"qUS" = ( +/obj/machinery/vending/medical, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Medical - Main Storage"; + network = list("ss13","medbay") + }, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "qUX" = ( /obj/effect/spawner/random/structure/table, /obj/item/paper/pamphlet/radstorm, @@ -50144,15 +50195,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) -"qVJ" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/dim/directional/north, -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/obj/structure/desk_bell{ - pixel_x = 7 - }, -/turf/open/floor/iron/dark, -/area/station/service/bar) "qVL" = ( /obj/structure/table, /obj/item/assembly/igniter{ @@ -50195,7 +50237,6 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/white, @@ -50259,6 +50300,22 @@ /obj/structure/fluff/tram_rail/floor, /turf/open/floor/glass/reinforced/tram, /area/station/hallway/primary/tram/left) +"qXa" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/white/side, +/area/station/service/kitchen) +"qXg" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Hallway - Service Wing Left Middle Hall" + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "qXj" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/corner, @@ -50316,6 +50373,14 @@ /obj/item/stack/sheet/glass/fifty, /turf/open/floor/iron, /area/station/construction/mining/aux_base) +"qYs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/reagent_dispensers/fueltank/large, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos) "qYx" = ( /obj/machinery/door/airlock{ id_tag = "Toilet5"; @@ -50393,6 +50458,21 @@ }, /turf/open/openspace, /area/station/solars/port) +"qZx" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/white/warning{ + dir = 1 + }, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/iron, +/area/station/maintenance/tram/left) "qZy" = ( /obj/structure/table/glass, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -50425,14 +50505,18 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/gravity_generator) -"raf" = ( -/obj/machinery/light/directional/west, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 +"qZZ" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 }, -/turf/open/floor/wood, -/area/station/service/lawoffice) +/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/machinery/light/directional/west, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "ram" = ( /obj/machinery/atmospherics/pipe/smart/manifold/violet/visible{ dir = 4 @@ -50457,6 +50541,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/brig) +"ray" = ( +/obj/structure/industrial_lift/tram, +/obj/machinery/destination_sign/south{ + pixel_y = -11 + }, +/obj/structure/window/reinforced/tram/directional/south, +/obj/effect/landmark/start/hangover, +/obj/structure/chair/sofa/bench/tram/left{ + dir = 8 + }, +/turf/open/openspace, +/area/station/hallway/primary/tram/center) "raD" = ( /obj/effect/turf_decal/caution/stand_clear/white{ dir = 4 @@ -50521,6 +50617,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit) +"rbA" = ( +/obj/machinery/rnd/production/circuit_imprinter/department/science, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/firealarm/directional/south{ + pixel_x = 4 + }, +/obj/machinery/light_switch/directional/south{ + pixel_x = -7; + pixel_y = -27 + }, +/turf/open/floor/iron, +/area/station/science/lab) "rbC" = ( /obj/machinery/suit_storage_unit/cmo, /obj/effect/turf_decal/bot, @@ -50574,15 +50682,25 @@ }, /turf/open/floor/iron, /area/station/cargo/miningdock) -"rcm" = ( -/turf/open/floor/wood, -/area/station/service/lawoffice) "rco" = ( /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, /area/station/security/brig) +"rcx" = ( +/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/south{ + c_tag = "Secure - EVA Storage" + }, +/obj/machinery/light_switch/directional/south{ + pixel_x = 8; + pixel_y = -23 + }, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) "rcA" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -50633,16 +50751,39 @@ }, /turf/open/floor/iron/freezer, /area/station/commons/toilet) +"rdo" = ( +/obj/machinery/computer/shuttle/labor, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/security/processing) +"rdJ" = ( +/obj/structure/table/glass, +/obj/item/stack/medical/mesh, +/obj/item/stack/medical/gauze, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Medical - Treatment South-East"; + network = list("ss13","medbay") + }, +/obj/machinery/vending/wallmed/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "rdO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) -"rdR" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/wood, -/area/station/service/theater) "rdT" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -50663,6 +50804,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"reg" = ( +/obj/effect/turf_decal/trimline/neutral/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, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "rem" = ( /obj/machinery/button/door/directional/west{ id = "private_e"; @@ -50692,6 +50843,15 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/tram/right) +"rfe" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, +/obj/machinery/light/small/directional/south{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal/incinerator) "rff" = ( /obj/effect/turf_decal/trimline/dark_red/warning{ dir = 10 @@ -50702,13 +50862,6 @@ }, /turf/open/floor/plating/elevatorshaft, /area/station/cargo/miningdock) -"rfk" = ( -/obj/machinery/computer/operating, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) "rfQ" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 6 @@ -50719,11 +50872,24 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"rfR" = ( +/obj/structure/table/wood, +/obj/item/storage/crayons, +/obj/item/toy/crayon/spraycan, +/obj/item/toy/crayon/spraycan{ + pixel_x = -4 + }, +/turf/open/floor/iron/grimy, +/area/station/service/library/lounge) "rfU" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/machinery/light/small/directional/south, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"rfW" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/turf/open/floor/iron, +/area/station/engineering/atmos) "rge" = ( /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating/airless, @@ -50735,19 +50901,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/cargo/warehouse) -"rgm" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 8 - }, -/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, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "rgK" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -50767,6 +50920,19 @@ }, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"rgT" = ( +/obj/structure/toilet{ + dir = 1 + }, +/obj/machinery/button/door/directional/west{ + id = "Toilet5"; + name = "Lock Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet) "rgY" = ( /obj/structure/chair{ dir = 4 @@ -50783,6 +50949,10 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"rhd" = ( +/obj/machinery/digital_clock, +/turf/closed/wall, +/area/station/medical/treatment_center) "rhn" = ( /obj/structure/industrial_lift/public, /obj/effect/turf_decal/trimline/dark_red/warning{ @@ -50938,30 +51108,13 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron, /area/station/command/bridge) -"rji" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/ladder, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/smooth, -/area/station/maintenance/tram/mid) -"rju" = ( -/obj/structure/table, -/obj/item/clothing/gloves/color/yellow, -/obj/item/clothing/gloves/color/yellow, -/obj/item/clothing/gloves/color/yellow, -/obj/item/clothing/gloves/color/yellow, -/obj/item/clothing/gloves/color/yellow, -/obj/item/storage/box/lights/mixed, -/obj/item/stack/cable_coil, -/obj/item/stock_parts/cell/emproof, -/obj/item/stock_parts/cell/emproof, -/obj/machinery/camera/emp_proof{ - c_tag = "Engineering - SMES Misc"; - dir = 10; - network = list("ss13","engineering") +"rjs" = ( +/obj/machinery/medical_kiosk, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 }, -/turf/open/floor/iron/dark, -/area/station/engineering/engine_smes) +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "rjw" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -50982,6 +51135,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"rjP" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/machinery/light/floor, +/turf/open/floor/engine/o2, +/area/station/engineering/atmos) +"rjT" = ( +/obj/machinery/porta_turret/ai{ + dir = 4 + }, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai_upload) "rkd" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 @@ -50992,12 +51156,6 @@ /obj/item/clothing/glasses/hud/health, /turf/open/floor/iron/white, /area/station/medical/virology) -"rko" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) "rkp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -51012,15 +51170,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/medical/medbay/lobby) -"rkA" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/light/small/directional/west, -/obj/structure/railing/corner, -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/space/openspace, -/area/station/solars/starboard/fore) "rkI" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -51042,6 +51191,14 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/genetics) +"rll" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/iron/smooth, +/area/station/maintenance/tram/right) "rlo" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -51089,15 +51246,25 @@ }, /turf/open/floor/iron/freezer, /area/station/commons/toilet) -"rmc" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 +"rlZ" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Hallway - Starboard Tram Platform North" }, /obj/machinery/light/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/dorms) +/turf/open/floor/noslip/tram, +/area/station/hallway/primary/tram/right) +"rmi" = ( +/obj/structure/table/wood, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Civilian - Library East" + }, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/wood/large, +/area/station/service/library) "rmm" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -51130,6 +51297,14 @@ /obj/machinery/telecomms/broadcaster/preset_left, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) +"rna" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/light_switch/directional/north{ + pixel_x = -8; + pixel_y = 23 + }, +/turf/open/floor/iron/grimy, +/area/station/service/library/lounge) "rnd" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 @@ -51150,6 +51325,26 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) +"rnh" = ( +/obj/machinery/door/airlock/engineering{ + name = "Auxillary Base Construction" + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/aux_base, +/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/mining/aux_base) "rnm" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 9 @@ -51211,6 +51406,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/storage) +"rom" = ( +/obj/structure/table/reinforced, +/obj/machinery/computer/security/telescreen/entertainment/directional/south, +/obj/effect/spawner/random/entertainment/lighter, +/obj/machinery/light/warm/directional/south, +/turf/open/floor/iron/dark, +/area/station/service/bar) "rov" = ( /obj/machinery/holopad, /obj/structure/disposalpipe/segment{ @@ -51253,22 +51455,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) -"roE" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 8 - }, -/obj/machinery/light/directional/north, -/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, -/turf/open/floor/iron, -/area/station/engineering/main) "roQ" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -51375,6 +51561,23 @@ /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) +"rre" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/landmark/start/hangover, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/construction/engineering) +"rrg" = ( +/obj/structure/industrial_lift/tram, +/obj/structure/window/reinforced/tram/directional/north, +/obj/machinery/destination_sign/north{ + pixel_y = 10 + }, +/obj/structure/chair/sofa/bench/tram/left{ + dir = 4 + }, +/turf/open/openspace, +/area/station/hallway/primary/tram/center) "rrk" = ( /turf/closed/wall/r_wall, /area/station/security/courtroom/holding) @@ -51410,13 +51613,15 @@ }, /turf/open/floor/iron/cafeteria, /area/station/command/heads_quarters/rd) -"rrM" = ( -/obj/machinery/photocopier{ - pixel_y = 3 +"rsd" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 }, -/obj/structure/sign/clock/directional/west, -/turf/open/floor/wood/large, -/area/station/service/library) +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/dorms) "rsh" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, @@ -51439,35 +51644,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) -"rsO" = ( -/obj/structure/sign/directions/evac{ - dir = 4; - pixel_y = 28 - }, -/obj/structure/sign/directions/medical{ - dir = 4; - pixel_y = 34 - }, -/obj/structure/sign/directions/engineering{ - dir = 4; - pixel_y = 40 - }, -/obj/machinery/light/directional/north, -/obj/structure/sign/directions/upload{ - dir = 4; - pixel_y = 22 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/tram/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/tram/filled/warning{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/left) "rsP" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -51478,15 +51654,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) -"rsY" = ( -/obj/machinery/chem_master/condimaster{ - desc = "Looks like a knock-off chem-master. Perhaps useful for separating liquids when mixing drinks precisely. Also dispenses condiments."; - name = "HoochMaster Deluxe"; - pixel_x = -4 - }, -/obj/structure/sign/clock/directional/north, -/turf/open/floor/wood, -/area/station/service/bar/backroom) "rsZ" = ( /obj/machinery/holopad/secure, /turf/open/floor/iron/dark, @@ -51501,17 +51668,30 @@ "rtp" = ( /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation/entertainment) -"rtD" = ( -/obj/structure/rack, -/obj/effect/spawner/random/techstorage/security_all, -/obj/effect/turf_decal/trimline/white/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "run" = ( /turf/closed/wall/r_wall, /area/station/security/medical) +"rup" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/emergency, +/obj/item/wrench, +/obj/item/assembly/signaler, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron, +/area/station/command/bridge) +"ruy" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/structure/sign/warning/secure_area{ + pixel_x = -32 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/security/office) "ruA" = ( /obj/structure/railing{ dir = 1 @@ -51543,8 +51723,8 @@ /obj/effect/turf_decal/stripes/white/line, /obj/effect/turf_decal/tile/neutral/tram, /turf/open/floor/noslip/tram_plate/energized{ - outbound = 3; - inbound = 2 + inbound = 2; + outbound = 3 }, /area/station/hallway/primary/tram/center) "ruV" = ( @@ -51610,6 +51790,9 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 }, +/obj/machinery/computer/order_console/bitrunning{ + dir = 4 + }, /turf/open/floor/iron, /area/station/cargo/storage) "rws" = ( @@ -51632,18 +51815,6 @@ }, /turf/open/floor/iron/white, /area/station/science/lower) -"rwT" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 6 - }, -/obj/machinery/firealarm/directional/east{ - pixel_y = 4 - }, -/obj/structure/table, -/obj/item/pai_card, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white, -/area/station/science/lobby) "rxw" = ( /obj/structure/girder, /obj/structure/grille, @@ -51732,6 +51903,13 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) +"ryK" = ( +/obj/machinery/door/airlock/research{ + name = "Burn Chamber Maintenance" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply, +/turf/open/floor/plating, +/area/station/science/ordnance) "ryS" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 @@ -51744,32 +51922,23 @@ /turf/open/floor/iron/white, /area/station/science/ordnance/office) "rzt" = ( +/obj/structure/rack, +/obj/item/storage/box/gloves{ + pixel_x = -4; + pixel_y = 8 + }, +/obj/item/storage/box/masks{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/wrench, +/obj/item/knife/kitchen, +/obj/effect/turf_decal/siding/purple, /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"rzw" = ( -/obj/structure/window/spawner/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/obj/structure/rack, -/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/machinery/status_display/ai/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Secure - Teleporter" - }, -/turf/open/floor/iron/dark, -/area/station/command/teleporter) "rzO" = ( /obj/structure/chair, /obj/machinery/airalarm/directional/north, @@ -51815,20 +51984,6 @@ /obj/machinery/disposal/bin, /turf/open/floor/iron, /area/station/command/bridge) -"rAy" = ( -/obj/machinery/door/airlock/engineering{ - name = "Vacant Office A" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/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/commons/vacant_room/office) "rAB" = ( /obj/structure/table, /obj/machinery/cell_charger{ @@ -51842,31 +51997,6 @@ "rAS" = ( /turf/closed/wall, /area/station/service/library/lounge) -"rAU" = ( -/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 = list("science") - }, -/obj/item/target/syndicate, -/obj/item/target/syndicate, -/obj/item/target/clown, -/obj/item/target/clown, -/obj/item/target/alien, -/obj/item/target/alien, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/white, -/area/station/science/auxlab/firing_range) -"rAZ" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/prison) "rBb" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -51919,18 +52049,6 @@ }, /turf/open/floor/iron/white, /area/station/science/lower) -"rBK" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/machinery/camera{ - c_tag = "Hallway - Upper Right Command"; - dir = 10 - }, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) "rBS" = ( /obj/effect/turf_decal/sand, /obj/machinery/door/airlock/external{ @@ -51968,6 +52086,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/tram/right) +"rCZ" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/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/machinery/modular_computer/preset/cargochat/medical{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "rDj" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -52051,13 +52184,19 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"rFF" = ( -/obj/structure/bed, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 6 +"rEX" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=2"; + location = "QM #2" }, -/turf/open/floor/iron/white, -/area/station/security/medical) +/obj/effect/turf_decal/tile/brown/fourcorners, +/mob/living/simple_animal/bot/mulebot{ + home_destination = "QM #2"; + suffix = "#2" + }, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "rFW" = ( /obj/effect/turf_decal/delivery/white, /obj/structure/holosign/barrier/atmos/tram, @@ -52139,6 +52278,11 @@ /obj/machinery/teleport/hub, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/foyer) +"rIa" = ( +/obj/machinery/porta_turret/ai, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat/hallway) "rIg" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -52190,25 +52334,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"rIH" = ( -/obj/machinery/shower/directional/west, -/obj/structure/fluff{ - desc = "What, you think the water just magically soaks into the metallic flooring?"; - icon = 'icons/obj/lavaland/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/white, -/area/station/science/research) -"rIP" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/execution/transfer) "rIT" = ( /obj/structure/table/wood, /obj/effect/spawner/random/decoration/ornament, @@ -52289,6 +52414,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) +"rLd" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "rLf" = ( /obj/machinery/door/airlock/security{ name = "Security Office" @@ -52340,20 +52471,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) -"rMa" = ( -/obj/structure/toilet{ - pixel_y = 8 - }, -/obj/machinery/light/small/directional/east, -/obj/machinery/button/door/directional/west{ - id = "Toilet1"; - name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet) "rMl" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -52382,28 +52499,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) -"rME" = ( -/obj/machinery/telecomms/processor/preset_two, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) -"rMJ" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/railing{ - dir = 8 - }, -/obj/machinery/light/floor, -/obj/effect/landmark/event_spawn, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/glass/reinforced, -/area/station/security/brig) "rMS" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -52422,6 +52517,21 @@ /obj/machinery/portable_atmospherics/canister/nitrogen, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"rNk" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/camera{ + c_tag = "Security - Pre-Trial Holding"; + dir = 9; + network = list("ss13","Security") + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/courtroom/holding) "rNl" = ( /obj/machinery/stasis{ dir = 4 @@ -52436,15 +52546,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"rNm" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 10 - }, -/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) "rNt" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 6 @@ -52558,6 +52659,11 @@ /obj/effect/mapping_helpers/requests_console/assistance, /turf/open/floor/engine/cult, /area/station/service/library) +"rPd" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/courtroom/holding) "rPj" = ( /obj/effect/turf_decal/box/white{ color = "#9FED58" @@ -52590,6 +52696,10 @@ }, /turf/open/floor/iron, /area/station/construction/mining/aux_base) +"rPv" = ( +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/engine, +/area/station/science/xenobiology) "rPH" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -52597,6 +52707,18 @@ }, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) +"rPP" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/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, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/security/prison) "rPZ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -52720,20 +52842,18 @@ }, /turf/open/floor/iron, /area/station/engineering/atmospherics_engine) -"rRk" = ( -/obj/structure/table/reinforced, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "rRy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) +"rRH" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics) "rRK" = ( /obj/machinery/atmospherics/pipe/multiz/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/multiz/supply/hidden/layer4, @@ -52805,18 +52925,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) +"rSC" = ( +/obj/machinery/modular_computer/preset/civilian, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/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, +/turf/open/floor/iron, +/area/station/engineering/break_room) "rSH" = ( /obj/structure/closet/secure_closet/freezer/fridge/open, /obj/structure/window/spawner/directional/west, /obj/item/toy/plush/goatplushie, /turf/open/floor/iron/white, /area/station/commons/vacant_room) -"rSY" = ( -/obj/machinery/airalarm/directional/north, -/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/theater) "rTm" = ( /obj/structure/sign/warning/vacuum/external{ pixel_x = 32 @@ -52861,6 +52985,11 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"rUr" = ( +/obj/machinery/module_duplicator, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/science/explab) "rUQ" = ( /obj/structure/window/reinforced/fulltile, /turf/open/floor/grass, @@ -52887,11 +53016,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/commons/dorms/laundry) -"rVB" = ( -/obj/machinery/light/directional/north, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/wood/large, -/area/station/service/barber) "rVD" = ( /obj/effect/turf_decal/trimline/green/corner, /obj/effect/turf_decal/trimline/green/corner{ @@ -52928,12 +53052,39 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/dark, /area/station/command/teleporter) +"rWt" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 6 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"rWB" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "rWJ" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 4 }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"rWT" = ( +/obj/machinery/modular_computer/preset/cargochat/security{ + dir = 4 + }, +/obj/machinery/newscaster/directional/west, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/security/office) "rWV" = ( /obj/structure/chair{ dir = 8 @@ -52943,6 +53094,16 @@ }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) +"rXA" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 8 + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/white, +/area/station/science/lobby) "rXO" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -52963,13 +53124,32 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/iron/dark, /area/station/service/chapel/office) -"rYl" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 9 +"rYq" = ( +/obj/machinery/washing_machine, +/obj/item/radio/intercom/prison/directional/east, +/turf/open/floor/iron/cafeteria, +/area/station/security/prison) +"rYw" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/item/storage/medkit/toxin{ + pixel_x = 3; + pixel_y = 3 }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/station/science/lower) +/obj/item/storage/medkit/toxin, +/obj/item/storage/medkit/toxin{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/machinery/door/window/right/directional/east{ + name = "Secure Medical Storage"; + req_access = list("medical") + }, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "rYL" = ( /obj/structure/chair/comfy/black{ dir = 8 @@ -52979,10 +53159,6 @@ }, /turf/open/floor/wood, /area/station/command/meeting_room) -"rYN" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "rYO" = ( /obj/docking_port/stationary/random{ dir = 8; @@ -52991,31 +53167,45 @@ }, /turf/open/misc/asteroid/airless, /area/station/asteroid) +"rYV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plating, +/area/station/commons/vacant_room) "rYW" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, /turf/open/floor/iron/cafeteria, /area/station/security/prison) -"rZh" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 +"rZq" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 1 }, -/obj/machinery/camera{ - c_tag = "Cargo - Warehouse East"; - dir = 6; - network = list("ss13","cargo") +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/dark/side{ + dir = 1 }, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 +/area/station/ai_monitored/command/storage/eva) +"rZx" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Gas to Filter" }, -/obj/machinery/light_switch/directional/east{ - pixel_x = 20; - pixel_y = -10 +/obj/machinery/camera/emp_proof{ + c_tag = "Engineering - Engine Room Airlock"; + dir = 10; + network = list("ss13","engine","engineering") }, -/turf/open/floor/iron, -/area/station/cargo/storage) +/obj/machinery/light/small/directional/west, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "rZA" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -53032,14 +53222,6 @@ /obj/effect/mapping_helpers/requests_console/assistance, /turf/open/floor/iron/showroomfloor, /area/station/security/warden) -"rZD" = ( -/obj/structure/industrial_lift/tram, -/obj/structure/window/reinforced/tram/left/directional/south, -/obj/structure/chair/sofa/bench/tram/right{ - dir = 4 - }, -/turf/open/openspace, -/area/station/hallway/primary/tram/center) "rZF" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -53058,20 +53240,6 @@ /obj/item/shovel/spade, /turf/open/floor/iron/dark, /area/station/security/prison/garden) -"rZJ" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/machinery/elevator_control_panel/directional/north{ - linked_elevator_id = "tram_upper_center_lift"; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 1 - }, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/maintenance/tram/mid) "rZU" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 4 @@ -53082,18 +53250,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"sab" = ( -/obj/structure/table, -/obj/item/grenade/barrier{ - pixel_x = 4 - }, -/obj/item/grenade/barrier, -/obj/item/grenade/barrier{ - pixel_x = -4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "saj" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, @@ -53149,20 +53305,6 @@ /obj/effect/spawner/random/decoration/ornament, /turf/open/floor/carpet, /area/station/commons/vacant_room/office) -"sbh" = ( -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/engine/air, -/area/station/engineering/atmos) -"sbp" = ( -/obj/machinery/light/directional/east, -/obj/machinery/newscaster/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) "sbx" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -53182,21 +53324,6 @@ /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"sbQ" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = 9; - pixel_y = 4 - }, -/obj/item/radio{ - pixel_x = -6; - pixel_y = -3 - }, -/obj/machinery/light/directional/south, -/obj/item/key/security, -/turf/open/floor/iron, -/area/station/security/checkpoint/science) "sbV" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/yellow/warning{ @@ -53222,6 +53349,15 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) +"sct" = ( +/obj/structure/table/reinforced, +/obj/structure/window/spawner/directional/north, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/iron/dark, +/area/station/service/bar) "scw" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/railing, @@ -53268,19 +53404,6 @@ /obj/structure/lattice, /turf/open/space/openspace, /area/station/solars/port) -"sdl" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 6 - }, -/obj/machinery/vending/wardrobe/cargo_wardrobe, -/turf/open/floor/iron, -/area/station/cargo/storage) "sdo" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -53300,6 +53423,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/theater) +"sdC" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/commons/fitness) "sdK" = ( /obj/machinery/duct, /obj/effect/decal/cleanable/food/flour, @@ -53330,15 +53462,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/hallway/primary/tram/center) -"seO" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/light/directional/west, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/command/bridge) +"seN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/right) "seQ" = ( /obj/machinery/flasher/directional/west{ id = "AI" @@ -53359,28 +53487,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/exit) -"sfa" = ( -/obj/machinery/computer/security/qm{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/machinery/requests_console/directional/west{ - department = "Quartermaster's Desk"; - name = "Quartermaster's Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/ore_update, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/machinery/camera{ - c_tag = "Cargo - Quartermaster's Office"; - dir = 10; - network = list("ss13","cargo") - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) "sfv" = ( /obj/machinery/duct, /obj/structure/railing/corner{ @@ -53409,6 +53515,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/station/ai_monitored/command/nuke_storage) +"sfX" = ( +/obj/structure/table, +/obj/item/radio/intercom/prison/directional/west, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Security - Prison Cell 5"; + network = list("ss13","Security","prison","pcell") + }, +/turf/open/floor/iron, +/area/station/security/prison/safe) "sgf" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -53417,30 +53535,6 @@ /obj/structure/railing, /turf/open/openspace, /area/station/solars/port) -"sgq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/right) -"sgt" = ( -/obj/structure/industrial_lift/tram, -/obj/structure/window/reinforced/tram/right/directional/south, -/obj/structure/chair/sofa/bench/tram/right{ - dir = 4 - }, -/turf/open/openspace, -/area/station/hallway/primary/tram/center) -"sgA" = ( -/obj/structure/table, -/obj/machinery/light/small/directional/west, -/obj/item/radio/intercom/prison/directional/south, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/security/execution/transfer) "sgB" = ( /obj/effect/turf_decal/trimline/red/filled/corner, /obj/structure/cable, @@ -53483,7 +53577,7 @@ /turf/open/floor/iron/white, /area/station/science/lower) "sha" = ( -/mob/living/simple_animal/sloth/paperwork, +/mob/living/basic/sloth/paperwork, /turf/open/floor/glass, /area/station/cargo/storage) "shw" = ( @@ -53501,6 +53595,12 @@ }, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"shQ" = ( +/obj/machinery/modular_computer/preset/engineering{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "shV" = ( /obj/effect/landmark/start/cook, /turf/open/floor/iron/white/side{ @@ -53513,16 +53613,6 @@ }, /turf/closed/wall, /area/station/hallway/primary/tram/right) -"sij" = ( -/obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/medical) "sik" = ( /obj/machinery/airalarm/directional/east, /turf/open/floor/wood, @@ -53541,6 +53631,25 @@ dir = 4 }, /area/station/service/theater) +"siE" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Medical - Surgery B"; + network = list("ss13","medbay") + }, +/obj/machinery/vending/wallmed/directional/north, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/obj/machinery/light_switch/directional/east{ + pixel_x = 22; + pixel_y = -9 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) "siL" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -53580,6 +53689,14 @@ /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/iron, /area/station/engineering/atmos) +"sjk" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/structure/table, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "sjm" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -53591,6 +53708,19 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) +"sjn" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/stripes/line, +/obj/item/storage/box/gloves{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/box/bodybags, +/obj/item/healthanalyzer, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) "sjE" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -53631,6 +53761,14 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"sjT" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/purple/corner{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "skb" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -53717,11 +53855,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/security/prison/garden) -"slo" = ( -/obj/machinery/computer/security/hos, -/obj/machinery/light/directional/north, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hos) "slx" = ( /obj/structure/hoop{ dir = 4 @@ -53738,19 +53871,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"slH" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/item/radio/intercom/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/dorms) "slI" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 1 @@ -53940,6 +54060,12 @@ "spF" = ( /turf/open/floor/engine/vacuum, /area/station/engineering/atmos) +"sqc" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/spawner/random/armory/rubbershot, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "sql" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 1 @@ -54030,6 +54156,18 @@ /obj/structure/sign/calendar/directional/north, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) +"srx" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/modular_computer/preset/civilian{ + dir = 8 + }, +/turf/open/floor/glass/reinforced, +/area/station/science/research) "srz" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 6 @@ -54089,13 +54227,6 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) -"ssi" = ( -/obj/effect/turf_decal/trimline/green/filled/corner, -/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) "ssn" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -54112,6 +54243,24 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/courtroom/holding) +"ssF" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/machinery/firealarm/directional/east, +/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_switch/directional/east{ + pixel_x = 22; + pixel_y = -9 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) "ssH" = ( /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/machinery/door/airlock/maintenance_hatch{ @@ -54130,6 +54279,15 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/starboard/greater) +"ssN" = ( +/obj/machinery/computer/department_orders/service, +/obj/machinery/camera/directional/north{ + c_tag = "Service - Autolathe Room" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "ssT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/chapel, @@ -54171,15 +54329,6 @@ "stk" = ( /turf/open/floor/iron/smooth, /area/station/maintenance/department/science) -"sto" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/iron, -/area/station/engineering/atmos) "stt" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/effect/turf_decal/trimline/neutral/filled/warning, @@ -54191,20 +54340,24 @@ }, /turf/open/floor/iron/white, /area/station/security/medical) -"stC" = ( -/obj/machinery/modular_computer/console/preset/civilian, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/white, -/area/station/science/ordnance/office) "stH" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 }, /turf/open/floor/wood/large, /area/station/service/theater) +"stJ" = ( +/obj/machinery/firealarm/directional/west{ + pixel_y = -3 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light_switch/directional/west{ + pixel_x = -23; + pixel_y = 8 + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) "stK" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner{ @@ -54236,11 +54389,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/tram/right) -"stW" = ( -/obj/machinery/recharge_station, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/foyer) +"stU" = ( +/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/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/science/ordnance/testlab) "sud" = ( /obj/structure/table, /obj/item/food/cakeslice/birthday, @@ -54302,13 +54463,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/hallway/primary/tram/center) -"suy" = ( -/obj/structure/closet/secure_closet/brig, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/security/brig) "suG" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 10 @@ -54345,20 +54499,6 @@ }, /turf/open/floor/carpet, /area/station/commons/vacant_room/office) -"suV" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/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, -/turf/open/floor/iron, -/area/station/maintenance/tram/left) "sva" = ( /obj/structure/table/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -54376,16 +54516,6 @@ dir = 4 }, /area/station/science/lab) -"svb" = ( -/obj/machinery/modular_computer/console/preset/engineering{ - dir = 1 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/command/bridge) "svc" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -54433,22 +54563,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/virology) -"swc" = ( -/obj/structure/table/wood, -/obj/item/storage/secure/briefcase{ - pixel_x = -2; - pixel_y = 6 - }, -/obj/item/storage/box/silver_ids{ - pixel_x = 5; - pixel_y = 3 - }, -/obj/item/assembly/flash/handheld{ - pixel_x = -8 - }, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) "swg" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -54468,14 +54582,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/primary/tram/right) -"swM" = ( -/obj/structure/toilet{ - pixel_y = 13 - }, -/obj/machinery/light/small/directional/east, -/obj/structure/mirror/directional/east, -/turf/open/floor/iron/freezer, -/area/station/security/prison) "swX" = ( /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/dark/smooth_edge{ @@ -54497,23 +54603,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"sxq" = ( -/obj/machinery/porta_turret/ai{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/obj/structure/cable, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) -"sxv" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Civilian - Dormitories South-West" - }, -/turf/open/floor/iron, -/area/station/commons/dorms) "sxA" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ @@ -54554,17 +54643,6 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"syp" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating/dark/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/white, -/area/station/science/lower) "syv" = ( /turf/closed/wall/r_wall, /area/station/security/checkpoint/science) @@ -54593,6 +54671,11 @@ outbound = 2 }, /area/station/hallway/primary/tram/left) +"syR" = ( +/obj/structure/table, +/obj/item/flashlight/lamp, +/turf/open/floor/carpet, +/area/station/cargo/miningdock) "szb" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -54600,6 +54683,18 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron/white, /area/station/science/lower) +"szd" = ( +/obj/structure/table, +/obj/item/radio/intercom/prison/directional/west, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Security - Prison Cell 3"; + network = list("ss13","Security","prison","pcell") + }, +/turf/open/floor/iron, +/area/station/security/prison/safe) "szo" = ( /obj/structure/dresser, /turf/open/floor/carpet, @@ -54662,24 +54757,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"sBa" = ( -/obj/structure/table/reinforced, -/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/machinery/door/window/left/directional/west{ - dir = 2; - name = "Secure Medical Storage"; - req_access = list("medical") - }, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "sBr" = ( /obj/machinery/newscaster/directional/west, /obj/structure/disposalpipe/segment{ @@ -54699,11 +54776,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/maintenance/radshelter/civil) -"sBz" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/dim/directional/west, -/turf/open/floor/iron/dark, -/area/station/service/bar) "sBW" = ( /obj/effect/turf_decal/siding/thinplating/dark/corner{ dir = 8 @@ -54722,12 +54794,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/disposal) -"sCv" = ( -/obj/structure/table/wood, -/obj/machinery/light/dim/directional/north, -/obj/item/book/bible, -/turf/open/floor/carpet, -/area/station/service/chapel/monastery) "sCw" = ( /obj/structure/chair/comfy/beige{ dir = 4 @@ -54735,12 +54801,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/grimy, /area/station/hallway/secondary/entry) -"sCO" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/leavy/style_random, -/mob/living/carbon/human/species/monkey, -/turf/open/floor/grass, -/area/station/medical/virology) "sDe" = ( /obj/structure/table/wood, /obj/item/radio/intercom/directional/south, @@ -54829,6 +54889,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/siding/purple/corner{ + dir = 1 + }, /turf/open/floor/iron/white, /area/station/science/xenobiology) "sEV" = ( @@ -54915,10 +54978,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/station/cargo/miningdock) -"sGx" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/solars/starboard/fore) "sGF" = ( /turf/open/misc/dirt/jungle{ baseturfs = /turf/open/misc/dirt @@ -54933,6 +54992,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"sGN" = ( +/obj/structure/cable, +/obj/machinery/light/floor, +/turf/open/floor/plating, +/area/station/solars/starboard/fore) "sGO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -54993,30 +55057,30 @@ /obj/effect/landmark/start/atmospheric_technician, /obj/effect/landmark/navigate_destination/incinerator, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "sHH" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/ce) -"sHI" = ( -/obj/structure/closet/wardrobe/grey, -/obj/machinery/light/directional/east, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms/laundry) "sHQ" = ( /obj/effect/landmark/start/depsec/medical, /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/medical) +"sHR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/white/warning, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/tram/left) "sHV" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -55029,20 +55093,14 @@ }, /turf/open/floor/iron, /area/station/science/lab) -"sIn" = ( -/obj/structure/table, -/obj/item/clothing/gloves/boxing, -/obj/item/clothing/gloves/boxing/blue{ - pixel_x = 4; - pixel_y = 5 +"sIi" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Port Mix to West Ports" }, -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/machinery/airalarm/directional/south, -/obj/machinery/light/directional/south, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/directional/west, /turf/open/floor/iron, -/area/station/security/prison/workout) +/area/station/engineering/atmos) "sIq" = ( /obj/structure/table/glass, /obj/item/wrench/medical, @@ -55075,17 +55133,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"sJp" = ( -/obj/structure/table, -/obj/item/radio/intercom/directional/east{ - freerange = 1; - listening = 0; - name = "Custom Channel"; - pixel_x = 0 - }, -/obj/structure/sign/clock/directional/south, -/turf/open/floor/iron/dark/small, -/area/station/commons/vacant_room) "sJx" = ( /obj/structure/chair{ dir = 1 @@ -55103,16 +55150,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"sJW" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "sJZ" = ( /obj/structure/table, /obj/effect/turf_decal/stripes/corner{ @@ -55203,6 +55240,11 @@ /obj/structure/railing/corner, /turf/open/space/openspace, /area/station/solars/starboard/fore) +"sLk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron/smooth, +/area/station/hallway/primary/tram/right) "sLm" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/effect/turf_decal/siding/thinplating{ @@ -55215,15 +55257,6 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"sLv" = ( -/obj/machinery/light/directional/north, -/obj/machinery/camera{ - c_tag = "Secure - AI Upper Ring South"; - dir = 9; - network = list("aicore") - }, -/turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) "sLz" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -55249,6 +55282,35 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"sLT" = ( +/obj/structure/rack, +/obj/item/clothing/under/color/red, +/obj/item/clothing/under/color/red, +/obj/item/clothing/under/color/red, +/obj/item/clothing/head/soft/red, +/obj/item/clothing/head/soft/red, +/obj/item/clothing/head/soft/red, +/obj/effect/turf_decal/tile/red/full, +/obj/machinery/light/dim/directional/east, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/fitness/recreation/entertainment) +"sLZ" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/conveyor_switch/oneway{ + id = "engineeringchute"; + name = "Shipment Delivery Chute Activator"; + pixel_x = -11 + }, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron, +/area/station/engineering/main) +"sMi" = ( +/obj/machinery/modular_computer/preset/cargochat/service{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "sMr" = ( /obj/structure/cable, /turf/open/floor/circuit/telecomms/mainframe, @@ -55283,20 +55345,6 @@ /obj/machinery/computer/records/security, /turf/open/floor/carpet, /area/station/command/heads_quarters/hos) -"sNb" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/effect/turf_decal/trimline/red/corner{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "sNe" = ( /obj/machinery/door/airlock/engineering{ name = "Power Access Hatch" @@ -55334,13 +55382,6 @@ "sNs" = ( /turf/closed/wall, /area/station/commons/storage/primary) -"sNv" = ( -/obj/machinery/porta_turret/ai{ - dir = 4 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) "sNQ" = ( /obj/structure/disposalpipe/junction{ dir = 2 @@ -55406,6 +55447,32 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/main) +"sOD" = ( +/obj/structure/sign/directions/supply{ + dir = 4; + pixel_y = -28 + }, +/obj/structure/sign/directions/security{ + dir = 8; + pixel_y = -34 + }, +/obj/structure/sign/directions/command{ + dir = 8; + pixel_y = -40 + }, +/obj/structure/sign/directions/vault{ + dir = 8; + pixel_y = -22 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/tram/filled/line, +/obj/effect/turf_decal/trimline/tram/filled/warning, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "sOI" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -55425,20 +55492,9 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/port/central) -"sOZ" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating/dark/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/light/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/lower) +"sOS" = ( +/turf/open/floor/carpet, +/area/station/cargo/miningdock) "sPo" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -55500,15 +55556,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit) -"sPN" = ( -/obj/structure/cable, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "sPQ" = ( /obj/effect/turf_decal/trimline/purple/filled/corner, /obj/structure/disposalpipe/segment{ @@ -55523,24 +55570,6 @@ /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) -"sQu" = ( -/obj/machinery/modular_computer/console/preset/curator{ - dir = 4 - }, -/obj/machinery/light_switch/directional/west{ - pixel_x = -21; - pixel_y = 9 - }, -/turf/open/floor/wood, -/area/station/service/library) -"sQI" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/sign/warning/directional/north{ - desc = "A sign warning you to be cautious of falling packages."; - name = "FALLING HAZARD sign" - }, -/turf/open/floor/plating, -/area/station/engineering/atmos) "sQJ" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 4 @@ -55589,6 +55618,17 @@ }, /turf/open/floor/plating, /area/station/cargo/warehouse) +"sRW" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/table/glass, +/obj/machinery/microwave, +/obj/structure/cable, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/iron, +/area/station/engineering/break_room) "sRZ" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/structure/chair{ @@ -55620,12 +55660,23 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 }, -/obj/machinery/lapvend, +/obj/machinery/vending/robotics, /turf/open/floor/iron/white, /area/station/science/lobby) "sSH" = ( /turf/open/floor/iron/dark, /area/station/security/courtroom/holding) +"sSL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron/smooth, +/area/station/maintenance/tram/right) +"sST" = ( +/obj/machinery/seed_extractor, +/obj/effect/turf_decal/tile/green/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics) "sTg" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -55633,6 +55684,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"sTn" = ( +/obj/structure/closet/toolcloset, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 10 + }, +/obj/machinery/airalarm/directional/west, +/obj/machinery/firealarm/directional/south{ + pixel_x = -3 + }, +/obj/machinery/light_switch/directional/south{ + pixel_x = 8; + pixel_y = -23 + }, +/turf/open/floor/iron, +/area/station/construction/mining/aux_base) "sTq" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 8 @@ -55697,14 +55763,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/tram/mid) -"sTP" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/structure/railing, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/right) "sTQ" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 8 @@ -55774,30 +55832,29 @@ }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) -"sUV" = ( -/obj/structure/table, -/obj/item/assembly/prox_sensor{ - pixel_x = 5; - pixel_y = 7 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = -4; - pixel_y = 1 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = 2; - pixel_y = -2 +"sUX" = ( +/obj/structure/railing{ + dir = 4 }, -/obj/item/assembly/prox_sensor{ - pixel_x = 9; - pixel_y = -2 +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 }, +/obj/structure/tank_holder/extinguisher, /turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) +/area/station/command/bridge) "sVd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/cafeteria, /area/station/security/prison) +"sVn" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/dorms) "sVq" = ( /obj/structure/ladder, /obj/effect/decal/cleanable/dirt, @@ -55923,6 +55980,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/cargo/drone_bay) +"sXo" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/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/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "sXL" = ( /obj/effect/turf_decal/trimline/white/line{ dir = 10 @@ -55978,23 +56046,6 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, /area/station/asteroid) -"sYh" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) "sYk" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -56018,6 +56069,11 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/supply) +"sYJ" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "sYU" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -56026,15 +56082,19 @@ /obj/effect/turf_decal/stripes/white/full, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"sYW" = ( -/obj/vehicle/ridden/wheelchair, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 +"sZb" = ( +/obj/machinery/firealarm/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Medical - Psychologist's Office"; + network = list("ss13","medbay") }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/light_switch/directional/west{ + pixel_x = -22; + pixel_y = -10 + }, +/turf/open/floor/wood/parquet, +/area/station/medical/psychology) "sZe" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -56086,14 +56146,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/iron/smooth, /area/station/service/hydroponics/garden) -"tac" = ( -/obj/machinery/vending/hydroseeds{ - slogan_delay = 700 - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/green/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics) "tag" = ( /turf/closed/wall/r_wall, /area/station/security/lockers) @@ -56243,19 +56295,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/break_room) -"tdm" = ( -/obj/machinery/rnd/production/circuit_imprinter/department/science, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/firealarm/directional/south{ - pixel_x = 4 - }, -/obj/machinery/light_switch/directional/south{ - pixel_x = -9; - pixel_y = -24 - }, -/turf/open/floor/iron, -/area/station/science/lab) "tdu" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door_buttons/airlock_controller{ @@ -56270,16 +56309,21 @@ }, /turf/open/floor/catwalk_floor, /area/station/hallway/primary/tram/left) +"tdv" = ( +/obj/structure/industrial_lift/tram, +/obj/structure/window/reinforced/tram/directional/south, +/obj/machinery/destination_sign/south{ + pixel_y = -11 + }, +/obj/effect/landmark/start/hangover, +/obj/structure/chair/sofa/bench/tram/right{ + dir = 4 + }, +/turf/open/openspace, +/area/station/hallway/primary/tram/center) "tdx" = ( /turf/closed/wall, /area/station/maintenance/port/aft) -"tdO" = ( -/obj/machinery/power/smes, -/obj/machinery/light/small/directional/north, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/catwalk_floor, -/area/station/solars/starboard/fore) "tdR" = ( /obj/machinery/vending/autodrobe/all_access, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -56380,18 +56424,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"tfk" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/security/office) "tfp" = ( /obj/structure/railing, /obj/effect/turf_decal/siding/thinplating{ @@ -56437,6 +56469,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/command/bridge) +"tga" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/command/heads_quarters/ce) "tgh" = ( /obj/structure/sign/calendar/directional/east, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -56461,12 +56500,14 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/cmo) -"tgE" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Hallway - Central Tram Platform North" +"tgB" = ( +/obj/structure/toilet{ + pixel_y = 13 }, -/turf/open/floor/noslip/tram, -/area/station/hallway/primary/tram/center) +/obj/structure/mirror/directional/east, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/iron/freezer, +/area/station/security/prison) "tgN" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -56499,6 +56540,15 @@ /obj/machinery/shower/directional/south, /turf/open/floor/iron/freezer, /area/station/commons/toilet) +"thD" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "thG" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/trimline/red/filled/corner{ @@ -56506,23 +56556,26 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"thO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/smooth, -/area/station/maintenance/tram/left) "thP" = ( /obj/structure/chair/stool/bar/directional/west, /obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison) -"tis" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 +"thR" = ( +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/wood/large, +/area/station/service/barber) +"tia" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/item/folder/yellow, +/obj/item/clothing/ears/earmuffs{ + pixel_x = -3; + pixel_y = -2 }, -/turf/open/floor/iron/smooth, -/area/station/maintenance/tram/right) +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/engineering/main) "tiz" = ( /obj/structure/disposalpipe/sorting/mail{ dir = 4 @@ -56553,6 +56606,17 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"tiS" = ( +/obj/effect/landmark/navigate_destination/engineering, +/obj/machinery/modular_computer/preset/cargochat/engineering{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/effect/turf_decal/trimline/yellow/filled/warning, +/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) "tiT" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -56573,15 +56637,10 @@ }, /turf/open/floor/iron, /area/station/command/bridge) -"tiV" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/dim/directional/west, -/obj/structure/window/spawner/directional/north, -/obj/structure/displaycase/forsale/kitchen{ - pixel_y = 8 - }, -/turf/open/floor/iron/dark, -/area/station/service/bar) +"tjl" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/noslip/tram, +/area/station/hallway/primary/tram/right) "tjz" = ( /obj/machinery/atmospherics/components/unary/passive_vent{ dir = 4; @@ -56621,18 +56680,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"tkh" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 - }, -/obj/structure/table, -/obj/machinery/light/directional/east, -/obj/machinery/microwave{ - pixel_x = -3; - pixel_y = 6 - }, -/turf/open/floor/iron/dark, -/area/station/medical/virology) "tki" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/machinery/door/poddoor/shutters/preopen{ @@ -56679,6 +56726,22 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/miningdock) +"tkH" = ( +/obj/machinery/firealarm/directional/west{ + pixel_y = 3 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/light_switch/directional/west{ + pixel_x = -23; + pixel_y = -8 + }, +/turf/open/floor/iron, +/area/station/security/processing) "tkP" = ( /obj/structure/railing{ dir = 8 @@ -56779,27 +56842,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/commons/vacant_room/office) -"tmC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/camera/directional/south{ - c_tag = "Maintenance - Central Tram Tunnel 2" - }, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/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/white/warning{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/maintenance/tram/mid) "tnj" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, @@ -56884,6 +56926,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/commons/dorms) +"toT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/left) "toY" = ( /obj/structure/table/wood, /obj/structure/reagent_dispensers/wall/peppertank/directional/east, @@ -56893,24 +56941,20 @@ }, /turf/open/floor/carpet, /area/station/command/heads_quarters/hos) -"tpc" = ( -/obj/structure/closet/crate/silvercrate, -/obj/effect/turf_decal/bot_white/right, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) -"tph" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/station/hallway/secondary/exit/departure_lounge) +"tpm" = ( +/obj/effect/turf_decal/trimline/neutral/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/hallway/secondary/construction/engineering) "tpp" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, -/obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/tile/bar{ dir = 8 }, +/obj/machinery/light/directional/west, /turf/open/floor/iron, /area/station/escapepodbay) "tpB" = ( @@ -56936,10 +56980,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/large, /area/station/service/barber) -"tqm" = ( -/obj/machinery/light/small/directional/west, -/turf/open/misc/asteroid/airless, -/area/station/asteroid) "tqo" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 8 @@ -56957,13 +56997,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/tram/mid) -"tqu" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 5 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "tqA" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/effect/turf_decal/siding/thinplating{ @@ -57032,6 +57065,24 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) +"trw" = ( +/obj/structure/table, +/obj/machinery/airalarm/directional/north, +/obj/machinery/fax{ + fax_name = "Service Hallway"; + name = "Service Fax Machine" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"try" = ( +/obj/machinery/computer/operating{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/surgery/fore) "trK" = ( /obj/machinery/disposal/bin, /obj/item/radio/intercom/directional/west, @@ -57093,6 +57144,11 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"tsf" = ( +/obj/structure/industrial_lift/tram, +/obj/structure/window/reinforced/tram/directional/north, +/turf/open/openspace, +/area/station/hallway/primary/tram/center) "tsg" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 8 @@ -57110,6 +57166,10 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos) +"tsu" = ( +/obj/machinery/light/dim/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/interrogation) "tsw" = ( /obj/machinery/hydroponics/soil, /obj/machinery/airalarm/directional/east, @@ -57120,6 +57180,16 @@ /obj/item/cultivator, /turf/open/floor/iron/dark, /area/station/security/prison/garden) +"tsx" = ( +/obj/effect/turf_decal/trimline/purple/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, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/white, +/area/station/science/lower) "tsP" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -57127,17 +57197,6 @@ /obj/structure/chair, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"tsR" = ( -/obj/item/paper{ - default_raw_text = "Congradulations, agent 'INSERT NAME HERE'! You have been assigned reconnaissance duty among the orbiting rocks of Indecipheres! As this location was previously scouted as a potential build site for a Nanotrasen outpost, one of our benefactors has taken the oppertunity to pre-emptively construct a listening outpost within the region! You have been tasked with monitoring the potentially active future crew and logging all events onboard. If you are a Nanotrasen official who has stumbled upon this outpost before it could be properly established: Please ignore this entire paper."; - name = "initiation paperwork" - }, -/obj/machinery/computer/records/medical/syndie{ - dir = 1; - req_access = list("syndicate") - }, -/turf/open/floor/iron/dark/small, -/area/station/commons/vacant_room) "tsV" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/shower/directional/east, @@ -57145,7 +57204,9 @@ /turf/open/floor/iron/freezer, /area/station/security/prison/shower) "tte" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, /turf/open/floor/iron, /area/station/cargo/storage) "tth" = ( @@ -57166,16 +57227,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"ttr" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/light/directional/west, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/research) "tts" = ( /obj/machinery/atmospherics/pipe/smart/manifold/violet/visible{ dir = 8 @@ -57193,30 +57244,6 @@ /obj/structure/sign/poster/official/obey/directional/south, /turf/open/floor/iron/white, /area/station/security/execution/education) -"tty" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/evidence) -"tub" = ( -/obj/structure/table/wood, -/obj/machinery/light/warm/directional/north, -/obj/item/flashlight/lamp, -/obj/machinery/requests_console/directional/north{ - department = "Chapel"; - name = "Chapel Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) "tuf" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/table, @@ -57252,6 +57279,13 @@ /obj/effect/mapping_helpers/airlock/access/any/command/general, /turf/open/floor/iron, /area/station/tcommsat/computer) +"tuS" = ( +/obj/effect/turf_decal/trimline/white/filled/line{ + dir = 1 + }, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "tuU" = ( /obj/structure/industrial_lift/public, /obj/effect/landmark/lift_id{ @@ -57262,6 +57296,18 @@ }, /turf/open/floor/plating/elevatorshaft, /area/station/maintenance/tram/left) +"tvP" = ( +/obj/structure/rack, +/obj/item/storage/box/lights/tubes{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/storage/box/lights/tubes, +/obj/item/wrench, +/obj/item/stack/cable_coil, +/obj/machinery/light/directional/north, +/turf/open/misc/asteroid, +/area/station/medical/chemistry) "tvQ" = ( /obj/structure/chair/office/light{ dir = 1 @@ -57271,6 +57317,21 @@ }, /turf/open/floor/iron/white, /area/station/science/genetics) +"tvT" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + 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, +/turf/open/floor/iron, +/area/station/engineering/main) "twg" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 @@ -57298,13 +57359,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"twq" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/trimline/white/line{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) "twr" = ( /obj/machinery/disposal/bin, /obj/structure/sign/clock/directional/east, @@ -57313,6 +57367,10 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"twv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply, +/turf/closed/wall/r_wall, +/area/station/science/ordnance) "twz" = ( /turf/open/openspace, /area/station/hallway/secondary/entry) @@ -57346,18 +57404,46 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/hallway/secondary/exit) +"twR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/structure/cable/layer1, +/obj/effect/turf_decal/trimline/yellow/arrow_cw{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"twS" = ( +/obj/structure/table/glass, +/obj/machinery/microwave, +/obj/structure/sign/clock/directional/east, +/obj/machinery/firealarm/directional/north{ + pixel_x = 2 + }, +/turf/open/floor/iron/cafeteria, +/area/station/science/breakroom) "twW" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 10 }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/item/storage/box/bandages{ + pixel_y = 6; + pixel_x = -6 + }, /obj/item/storage/box/bodybags{ pixel_x = 3; pixel_y = 2 }, /obj/item/reagent_containers/syringe, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) "txh" = ( @@ -57365,6 +57451,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/virology) +"txl" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/tram/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/tram/filled/warning{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/right) "txD" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/table/glass, @@ -57401,16 +57500,6 @@ }, /turf/open/floor/engine/o2, /area/station/science/ordnance/storage) -"tyc" = ( -/obj/structure/railing, -/obj/effect/turf_decal/trimline/tram/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/tram/filled/warning{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "tyi" = ( /obj/structure/table, /obj/machinery/button/door{ @@ -57441,35 +57530,19 @@ }, /turf/open/floor/circuit/green, /area/station/ai_monitored/turret_protected/ai_upload) -"tyv" = ( -/obj/structure/sign/directions/supply{ - dir = 4; - pixel_y = 28 - }, -/obj/structure/sign/directions/security{ - dir = 1; - pixel_y = 34 - }, -/obj/structure/sign/directions/command{ - dir = 1; - pixel_y = 40 - }, -/obj/machinery/light/directional/north, -/obj/structure/sign/directions/vault{ - dir = 1; - pixel_y = 22 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/tram/filled/line{ - dir = 1 +"tyt" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 }, -/obj/effect/turf_decal/trimline/tram/filled/warning{ - dir = 1 +/obj/effect/turf_decal/trimline/purple/filled/warning{ + 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, /turf/open/floor/iron, -/area/station/hallway/primary/tram/left) +/area/station/service/janitor) "tyx" = ( /obj/structure/closet{ name = "Evidence Closet 1" @@ -57506,14 +57579,6 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"tzk" = ( -/obj/machinery/computer/atmos_control/oxygen_tank{ - atmos_chambers = list("o2ordance"="Oxygen Supply") - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/storage) "tzq" = ( /obj/structure/disposaloutlet{ dir = 4 @@ -57535,15 +57600,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/medical/pharmacy) -"tzJ" = ( -/obj/machinery/light/directional/north, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/grassy/style_random, -/turf/open/floor/grass, -/area/station/commons/dorms) "tzL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/yellow/filled/corner{ @@ -57559,26 +57615,36 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"tzP" = ( -/obj/machinery/portable_atmospherics/canister/plasma, -/turf/open/floor/engine/plasma, -/area/station/engineering/atmos) +"tzQ" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/light_switch/directional/west{ + pixel_x = -22; + pixel_y = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"tAo" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/status_display/evac/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/security/brig) "tAs" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /turf/open/floor/iron, /area/station/commons/fitness) -"tAC" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/machinery/camera{ - c_tag = "Secure - AI Upper Ring West"; - dir = 6; - network = list("aicore") - }, -/turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) "tAF" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -57678,6 +57744,21 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"tBA" = ( +/obj/structure/chair/comfy/beige{ + dir = 8 + }, +/turf/open/floor/iron/grimy, +/area/station/hallway/secondary/entry) +"tBK" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/structure/cable, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/engineering/atmos) "tBN" = ( /obj/effect/turf_decal/trimline/red/filled/corner, /obj/effect/turf_decal/trimline/red/filled/corner{ @@ -57697,16 +57778,6 @@ }, /turf/open/floor/iron/white, /area/station/security/medical) -"tCa" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 8 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/white, -/area/station/science/lobby) "tCe" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 6 @@ -57726,8 +57797,8 @@ "tCo" = ( /obj/effect/turf_decal/tile/neutral/tram, /turf/open/floor/noslip/tram_plate/energized{ - outbound = 2; - inbound = 1 + inbound = 1; + outbound = 2 }, /area/station/hallway/primary/tram/left) "tCw" = ( @@ -57743,6 +57814,14 @@ "tCT" = ( /turf/open/floor/plating, /area/station/hallway/secondary/entry) +"tCX" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/built/directional/north, +/turf/open/floor/carpet, +/area/station/commons/vacant_room/office) "tDn" = ( /obj/structure/railing{ dir = 8 @@ -57753,26 +57832,10 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"tDB" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/trimline/white/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 9 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) "tDD" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) -"tDJ" = ( -/obj/effect/spawner/random/engineering/tracking_beacon, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/science/robotics/mechbay) "tDP" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -57793,11 +57856,6 @@ }, /turf/open/floor/iron, /area/station/service/theater) -"tEe" = ( -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/grassy/style_random, -/turf/open/floor/grass, -/area/station/science/lower) "tEk" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -57805,6 +57863,13 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"tEl" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/obj/machinery/light/warm/directional/south, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain) "tEw" = ( /obj/machinery/door/airlock/maintenance{ name = "Crematorium" @@ -57836,11 +57901,6 @@ /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp, /turf/open/floor/iron, /area/station/cargo/storage) -"tEI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/smooth, -/area/station/maintenance/tram/right) "tEP" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -57873,13 +57933,40 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) +"tFk" = ( +/obj/structure/closet/secure_closet/brig, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/security/brig) "tFB" = ( /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/lobby) +"tFC" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "tFJ" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/security) +"tFK" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/camera/directional/south{ + c_tag = "Security - Main South"; + network = list("ss13","Security") + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + 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) "tFP" = ( /obj/machinery/chem_master/condimaster{ desc = "Used to separate out liquids - useful for purifying botanical extracts. Also dispenses condiments."; @@ -57912,6 +57999,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/port/central) +"tGc" = ( +/obj/structure/closet/secure_closet/brig/genpop, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/execution/transfer) "tGo" = ( /obj/effect/spawner/random/vending/colavend, /obj/effect/turf_decal/siding/thinplating/dark{ @@ -57952,6 +58046,12 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"tHv" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/command/teleporter) "tIg" = ( /obj/modular_map_root/tramstation{ key = "arrivallibraryupper"; @@ -57959,6 +58059,24 @@ }, /turf/open/misc/asteroid, /area/station/asteroid) +"tIh" = ( +/obj/structure/window/spawner/directional/north, +/obj/structure/table/glass, +/obj/item/storage/box/monkeycubes{ + pixel_x = -7; + pixel_y = 7 + }, +/obj/item/infuser_book{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/item/storage/pill_bottle/mutadone{ + pixel_x = 9; + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/dark_green/fourcorners, +/turf/open/floor/iron/white, +/area/station/science/genetics) "tIi" = ( /mob/living/simple_animal/bot/floorbot, /turf/open/floor/iron/dark, @@ -57999,6 +58117,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"tJe" = ( +/obj/structure/railing, +/obj/effect/turf_decal/trimline/tram/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/tram/filled/warning{ + dir = 8 + }, +/obj/effect/spawner/random/vending/snackvend{ + pixel_x = -5 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/left) "tJh" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -58008,6 +58140,10 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"tJp" = ( +/obj/machinery/teleport/station, +/turf/open/floor/plating, +/area/station/ai_monitored/turret_protected/aisat/foyer) "tJz" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/structure/table, @@ -58108,32 +58244,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/command/heads_quarters/hop) -"tLe" = ( -/obj/structure/sign/directions/supply{ - dir = 1; - pixel_y = -28 - }, -/obj/structure/sign/directions/security{ - dir = 8; - pixel_y = -34 - }, -/obj/structure/sign/directions/command{ - dir = 8; - pixel_y = -40 - }, -/obj/machinery/light/directional/south, -/obj/structure/sign/directions/vault{ - dir = 8; - pixel_y = -22 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/tram/filled/line, -/obj/effect/turf_decal/trimline/tram/filled/warning, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/right) "tLg" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -58152,13 +58262,11 @@ /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /turf/closed/wall/r_wall, /area/station/engineering/atmos) -"tLA" = ( -/obj/machinery/modular_computer/console/preset/id{ - dir = 4 - }, -/obj/structure/cable, +"tLD" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/musical_instrument, /turf/open/floor/wood, -/area/station/command/heads_quarters/hop) +/area/station/service/theater) "tLE" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -58171,10 +58279,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"tLM" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/engine/co2, -/area/station/engineering/atmos) "tMb" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 10 @@ -58245,11 +58349,6 @@ "tMY" = ( /turf/open/floor/iron/stairs/medium, /area/station/cargo/miningdock) -"tNf" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/iron, -/area/station/maintenance/tram/left) "tNk" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -58302,13 +58401,6 @@ /obj/effect/mapping_helpers/turn_off_lights_with_lightswitch, /turf/open/floor/iron, /area/station/cargo/warehouse) -"tNQ" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Hallway - Starboard Tram Platform South"; - pixel_y = -23 - }, -/turf/open/floor/noslip/tram, -/area/station/hallway/primary/tram/right) "tNW" = ( /obj/structure/disposalpipe/segment{ dir = 8 @@ -58409,13 +58501,6 @@ "tPE" = ( /turf/closed/wall, /area/station/hallway/secondary/entry) -"tPV" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/main) "tPW" = ( /obj/machinery/suit_storage_unit/engine, /obj/effect/turf_decal/bot{ @@ -58447,19 +58532,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) -"tQN" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Science - AI Station Access" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/station/science/lower) "tRf" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -58467,6 +58539,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"tRn" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Civilian - Recreational Area North-West" + }, +/obj/item/toy/plush/lizard_plushie/space/green, +/obj/machinery/incident_display/dual/directional/north, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "tRo" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/neutral/filled/line, @@ -58476,23 +58560,10 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"tRq" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 4 - }, -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/industrial_lift/public, -/obj/machinery/elevator_control_panel/directional/east{ - linked_elevator_id = "tram_lower_center_lift"; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/maintenance/tram/mid) +"tRu" = ( +/obj/machinery/drone_dispenser, +/turf/open/floor/iron/smooth, +/area/station/maintenance/department/science) "tRO" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -58515,6 +58586,16 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/dorms) +"tRV" = ( +/obj/machinery/firealarm/directional/east{ + pixel_y = -5 + }, +/obj/machinery/light_switch/directional/east{ + pixel_x = 23; + pixel_y = 8 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "tRX" = ( /obj/machinery/vending/wardrobe/chef_wardrobe, /obj/effect/turf_decal/trimline/yellow/warning{ @@ -58538,6 +58619,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/service/bar) +"tSe" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/sand/plating, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/station/escapepodbay) "tSp" = ( /obj/structure/table/wood, /obj/machinery/airalarm/directional/west, @@ -58549,20 +58638,24 @@ }, /turf/open/floor/iron/white, /area/station/science/lobby) -"tSM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/siding/thinplating{ +"tSz" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/mechanical, +/obj/item/flashlight, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/turf_decal/trimline/white/warning{ - dir = 1 +/obj/item/pipe_dispenser, +/obj/machinery/light/directional/north, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"tTe" = ( +/obj/effect/turf_decal/trimline/yellow/filled/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, /turf/open/floor/iron, -/area/station/maintenance/tram/right) +/area/station/engineering/atmos) "tTg" = ( /obj/machinery/door/airlock/security{ name = "Interrogation Monitoring" @@ -58577,19 +58670,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"tTo" = ( -/obj/structure/railing, -/obj/effect/turf_decal/trimline/tram/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/tram/filled/warning{ - dir = 8 - }, -/obj/effect/spawner/random/vending/snackvend{ - pixel_x = -5 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/left) "tTs" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -58622,25 +58702,6 @@ /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"tTL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/machinery/button/door/directional/west{ - id = "cytologysecure2"; - name = "Secure Pen Lockdown" - }, -/obj/machinery/requests_console/directional/north{ - department = "Cytology"; - name = "Cytology Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/ore_update, -/obj/effect/mapping_helpers/requests_console/supplies, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "tTN" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 4 @@ -58661,6 +58722,14 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"tUk" = ( +/obj/structure/industrial_lift/tram, +/obj/structure/window/reinforced/tram/directional/north, +/obj/structure/chair/sofa/bench/tram/right{ + dir = 8 + }, +/turf/open/openspace, +/area/station/hallway/primary/tram/center) "tUy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -58670,6 +58739,15 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/science/lower) +"tUL" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Security - Prison Main North-East" + }, +/turf/open/floor/iron, +/area/station/security/prison) "tUM" = ( /obj/structure/bed{ dir = 4 @@ -58689,36 +58767,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) -"tVe" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) "tVf" = ( /obj/structure/disposalpipe/segment{ dir = 10 }, /turf/closed/wall, /area/station/hallway/primary/tram/center) -"tVp" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) -"tVq" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/structure/rack, -/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/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/engineering/main) "tVv" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -58728,15 +58782,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/dorms) -"tVA" = ( -/obj/structure/table, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/rods/fifty, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/storage/tools) "tVK" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -58746,6 +58791,11 @@ }, /turf/open/floor/iron, /area/station/science/explab) +"tVO" = ( +/obj/machinery/hydroponics/soil, +/obj/machinery/light/directional/south, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden) "tVZ" = ( /obj/effect/turf_decal/trimline/dark_red/warning{ dir = 6 @@ -58819,12 +58869,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/prison/garden) -"tWG" = ( -/obj/structure/ladder, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/smooth, -/area/station/maintenance/tram/left) "tWX" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -58859,6 +58903,17 @@ "tXz" = ( /turf/closed/wall, /area/station/commons/vacant_room/commissary) +"tXA" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 10 + }, +/obj/structure/table, +/obj/machinery/camera/directional/south{ + c_tag = "Science - AI Station Access Exterior"; + network = list("ss13","rd") + }, +/turf/open/floor/iron/dark, +/area/station/science/lower) "tXI" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron, @@ -58880,20 +58935,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/service/bar) -"tXS" = ( -/obj/machinery/power/smes/engineering, -/obj/machinery/light/directional/west, -/obj/structure/sign/warning/electric_shock{ - pixel_x = -32 - }, -/obj/machinery/camera/emp_proof{ - c_tag = "Engineering - SMES"; - dir = 10; - network = list("ss13","engineering") - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/engine_smes) "tXU" = ( /obj/structure/lattice, /turf/open/openspace, @@ -58990,25 +59031,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/central) -"tYO" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/obj/item/clothing/suit/hooded/wintercoat/engineering, -/turf/open/floor/iron, -/area/station/engineering/main) -"tYQ" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 6 - }, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/iron, -/area/station/security/checkpoint/arrivals) "tYX" = ( /obj/structure/table, /obj/item/toy/cards/deck, @@ -59027,12 +59049,6 @@ /obj/item/clothing/glasses/meson, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"tZt" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "tZO" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrous_input{ dir = 8 @@ -59051,36 +59067,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/lobby) -"tZT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/button/door/directional/east{ - id = "cytologysecure1"; - name = "Secure Pen Lockdown" - }, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) -"uag" = ( -/obj/effect/spawner/random/decoration/showcase, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/light/small/directional/south, -/turf/open/floor/carpet/royalblack, -/area/station/command/meeting_room) "uax" = ( /turf/open/floor/iron, /area/station/cargo/storage) -"uaC" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) "uaJ" = ( /obj/machinery/computer/mechpad, /turf/open/floor/iron, /area/station/science/robotics/mechbay) +"uaK" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 9 + }, +/obj/item/radio/intercom/directional/north, +/obj/structure/table, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "uaM" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/structure/cable, @@ -59103,34 +59104,22 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"ubr" = ( -/obj/structure/sign/directions/evac{ - dir = 4; - pixel_y = 28 - }, -/obj/structure/sign/directions/medical{ - dir = 8; - pixel_y = 34 - }, -/obj/structure/sign/directions/engineering{ - dir = 8; - pixel_y = 40 - }, -/obj/machinery/light/directional/north, -/obj/structure/sign/directions/upload{ - pixel_y = 22 +"ubk" = ( +/obj/effect/turf_decal/stripes/end{ + 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/trimline/tram/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/tram/filled/warning{ +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/ai_monitored/security/armory) +"ubt" = ( +/obj/structure/chair/office/light{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/right) +/obj/effect/landmark/start/chief_engineer, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "ubx" = ( /obj/effect/turf_decal/arrows/red{ pixel_y = 15 @@ -59142,6 +59131,14 @@ /obj/effect/turf_decal/trimline/red/filled/corner, /turf/open/floor/iron, /area/station/security/prison) +"ubD" = ( +/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, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "ubH" = ( /turf/open/floor/iron/chapel{ dir = 6 @@ -59223,6 +59220,18 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/commons/vacant_room/office) +"udq" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/obj/structure/closet/secure_closet/warden, +/obj/item/radio/intercom/directional/west, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/showroomfloor, +/area/station/security/warden) "udr" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -59236,21 +59245,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"udN" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/tram/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/tram/filled/warning{ - dir = 4 - }, -/obj/effect/spawner/random/vending/snackvend{ - pixel_x = 5 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/right) "udO" = ( /obj/structure/chair/stool/bar/directional/south, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -59275,6 +59269,33 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/medical/chemistry) +"udX" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/directional/west, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"udY" = ( +/obj/structure/table/wood, +/obj/item/paper_bin/carbon{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/taperecorder, +/obj/machinery/firealarm/directional/west{ + pixel_y = -3 + }, +/obj/machinery/light_switch/directional/west{ + pixel_x = -23; + pixel_y = 8 + }, +/turf/open/floor/iron/grimy, +/area/station/security/detectives_office) "udZ" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59282,6 +59303,25 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"uel" = ( +/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 = list("science") + }, +/obj/item/target/syndicate, +/obj/item/target/syndicate, +/obj/item/target/clown, +/obj/item/target/clown, +/obj/item/target/alien, +/obj/item/target/alien, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/obj/item/radio/intercom/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/station/science/auxlab/firing_range) "uem" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -59301,22 +59341,25 @@ /obj/structure/table/wood/fancy/royalblue, /turf/open/floor/wood/large, /area/station/service/library) -"ueZ" = ( -/obj/machinery/portable_atmospherics/canister/carbon_dioxide, -/turf/open/floor/engine/co2, -/area/station/engineering/atmos) +"ueG" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/structure/flora/bush/grassy/style_random, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/grass, +/area/station/commons/dorms) +"ufe" = ( +/obj/structure/lattice, +/obj/machinery/light/cold/dim/directional/west, +/turf/open/openspace, +/area/station/asteroid) "ufh" = ( /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) -"ufp" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/computer/records/medical, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "ufC" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/north, @@ -59344,12 +59387,6 @@ "ufO" = ( /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"ufY" = ( -/obj/effect/turf_decal/sand, -/obj/structure/ladder, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/smooth, -/area/station/maintenance/tram/mid) "ugf" = ( /obj/structure/bed{ dir = 8 @@ -59421,6 +59458,7 @@ dir = 9 }, /obj/machinery/light/directional/west, +/obj/machinery/mining_weather_monitor/directional/north, /turf/open/floor/iron, /area/station/construction/mining/aux_base) "uhw" = ( @@ -59430,6 +59468,16 @@ "uid" = ( /turf/open/floor/eighties, /area/station/commons/fitness/recreation/entertainment) +"uip" = ( +/obj/structure/closet/secure_closet/brig{ + id = "medcell"; + name = "Medical Cell Locker" + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/medical) "uiA" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 4 @@ -59463,13 +59511,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"uiP" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/maintenance/radshelter/civil) "uiV" = ( /obj/structure/table, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59542,8 +59583,21 @@ }, /turf/open/floor/iron, /area/station/command/teleporter) +"ujv" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, +/obj/machinery/shower/directional/west, +/obj/effect/turf_decal/box, +/obj/structure/fluff{ + desc = "What, you think the water just magically soaks into the metallic flooring?"; + icon = 'icons/obj/mining_zones/survival_pod.dmi'; + icon_state = "fan_tiny"; + name = "shower drain" + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) "ujw" = ( -/obj/machinery/airalarm/directional/east, /obj/effect/landmark/start/hangover, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/white/line{ @@ -59566,10 +59620,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/disposal) -"ujI" = ( -/obj/structure/table, -/turf/open/floor/carpet, -/area/station/cargo/miningdock) "ujK" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/turf_decal/stripes/asteroid/full, @@ -59652,12 +59702,6 @@ }, /turf/open/floor/iron/white, /area/station/science/robotics/lab) -"ukU" = ( -/obj/machinery/vending/hydronutrients, -/obj/structure/noticeboard/directional/south, -/obj/effect/turf_decal/tile/green/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics) "ukY" = ( /obj/effect/turf_decal/bot, /obj/machinery/power/port_gen/pacman, @@ -59747,6 +59791,29 @@ /obj/machinery/meter, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"ulT" = ( +/obj/structure/closet/crate/hydroponics, +/obj/item/paper/guides/jobs/hydroponics, +/obj/item/seeds/onion, +/obj/item/seeds/garlic, +/obj/item/seeds/potato, +/obj/item/seeds/tomato, +/obj/item/seeds/carrot, +/obj/item/seeds/grass, +/obj/item/seeds/ambrosia, +/obj/item/seeds/wheat, +/obj/item/seeds/pumpkin, +/obj/effect/spawner/random/contraband/prison, +/obj/item/radio/intercom/prison/directional/east, +/obj/machinery/camera{ + c_tag = "Security - Prison Garden"; + dir = 6; + network = list("ss13","Security","prison") + }, +/obj/item/seeds/tower, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/prison/garden) "ulV" = ( /turf/closed/wall/r_wall, /area/station/engineering/break_room) @@ -59761,11 +59828,6 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) -"umh" = ( -/obj/effect/turf_decal/sand/plating, -/obj/item/stack/ore/glass, -/turf/open/floor/plating, -/area/station/engineering/main) "umu" = ( /obj/machinery/rnd/server/master, /turf/open/floor/circuit/telecomms/server, @@ -59787,6 +59849,13 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"umC" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron, +/area/station/commons/dorms) "umK" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 4 @@ -59840,14 +59909,16 @@ "uno" = ( /turf/closed/wall/r_wall, /area/station/maintenance/radshelter/civil) -"unD" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 +"unx" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 5 + }, +/obj/structure/sign/warning/rad_shelter{ + pixel_y = 32 }, /obj/machinery/light/directional/east, -/turf/open/floor/wood/large, -/area/station/service/barber) +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "unS" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -59986,16 +60057,6 @@ /obj/machinery/telecomms/processor/preset_three, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"uqs" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "uqA" = ( /obj/effect/turf_decal/siding/thinplating/dark/corner, /obj/machinery/duct, @@ -60029,6 +60090,21 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) +"urf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 10 + }, +/obj/structure/ore_box, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/light_switch/directional/west{ + pixel_x = -22; + pixel_y = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "urm" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber{ dir = 1 @@ -60046,12 +60122,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible, /turf/open/floor/iron, /area/station/science/ordnance/storage) -"urC" = ( -/obj/structure/table, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "urK" = ( /obj/effect/landmark/start/assistant, /obj/structure/cable, @@ -60062,7 +60132,7 @@ /turf/open/floor/iron/cafeteria, /area/station/commons/dorms/laundry) "urO" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, @@ -60094,6 +60164,14 @@ }, /turf/open/floor/plating, /area/station/science/robotics/mechbay) +"usm" = ( +/obj/machinery/plumbing/synthesizer{ + reagent_id = /datum/reagent/water + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/smooth, +/area/station/maintenance/central/greater) "uss" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -60149,24 +60227,6 @@ }, /turf/open/floor/iron, /area/station/command/teleporter) -"utt" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/warning{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/corner{ - dir = 4 - }, -/obj/structure/sign/departments/security{ - pixel_x = -32 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) "utB" = ( /obj/structure/table, /obj/item/multitool, @@ -60189,13 +60249,6 @@ /obj/structure/cable, /turf/open/floor/circuit/telecomms/mainframe, /area/station/tcommsat/server) -"utU" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/modular_computer/console/preset/id, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "utY" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -60206,6 +60259,23 @@ /obj/effect/spawner/random/maintenance/five, /turf/open/floor/iron, /area/station/cargo/warehouse) +"uud" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/industrial_lift/public, +/obj/machinery/elevator_control_panel/directional/east{ + linked_elevator_id = "tram_lower_center_lift"; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/maintenance/tram/mid) "uue" = ( /obj/machinery/power/turbine/turbine_outlet{ dir = 4 @@ -60219,6 +60289,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/station/service/chapel) +"uuw" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/security/prison) "uuB" = ( /obj/structure/table, /obj/item/storage/bag/tray, @@ -60244,6 +60321,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) +"uuS" = ( +/obj/structure/chair, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "uuZ" = ( /obj/structure/chair/pew, /obj/effect/landmark/start/hangover, @@ -60318,16 +60404,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/port/central) -"uwi" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/white/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) "uwk" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 4 @@ -60345,6 +60421,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) +"uwt" = ( +/obj/machinery/light/warm/directional/west, +/turf/open/floor/wood/parquet, +/area/station/medical/psychology) "uwE" = ( /obj/structure/rack, /obj/item/circuitboard/machine/exoscanner{ @@ -60361,12 +60441,6 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron, /area/station/cargo/drone_bay) -"uxh" = ( -/obj/effect/turf_decal/loading_area, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) "uxj" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -60408,6 +60482,18 @@ /obj/machinery/meter, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"uxL" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/item/radio/intercom/directional/south{ + freerange = 1; + frequency = 1447; + listening = 0; + name = "Private Channel" + }, +/turf/open/floor/iron/grimy, +/area/station/ai_monitored/turret_protected/aisat/foyer) "uxM" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 @@ -60441,11 +60527,17 @@ /obj/effect/turf_decal/trimline/neutral/filled/line, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"uyn" = ( -/obj/structure/sign/poster/official/love_ian/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hop) +"uyf" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/shaker, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/wood, +/area/station/service/bar/backroom) +"uyq" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/iron/dark, +/area/station/service/bar) "uyA" = ( /obj/structure/table, /obj/item/storage/box, @@ -60602,6 +60694,17 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/checkpoint/engineering) +"uBA" = ( +/obj/structure/chair{ + dir = 4; + name = "Judge" + }, +/obj/machinery/airalarm/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Civilian - Courtroom" + }, +/turf/open/floor/iron, +/area/station/security/courtroom) "uBD" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -60615,18 +60718,56 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/supply) -"uBM" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/spawner/random/medical/two_percent_xeno_egg_spawner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/turf/open/floor/engine, -/area/station/science/xenobiology) +"uCf" = ( +/obj/structure/table/reinforced, +/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/machinery/door/window/left/directional/west{ + dir = 2; + name = "Secure Medical Storage"; + req_access = list("medical") + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "uCh" = ( /obj/structure/railing{ dir = 5 }, /turf/open/floor/glass/reinforced, /area/station/ai_monitored/turret_protected/aisat/hallway) +"uCl" = ( +/obj/structure/sign/directions/supply{ + dir = 4; + pixel_y = 28 + }, +/obj/structure/sign/directions/security{ + dir = 8; + pixel_y = 34 + }, +/obj/structure/sign/directions/command{ + dir = 8; + pixel_y = 40 + }, +/obj/structure/sign/directions/vault{ + dir = 8; + pixel_y = 22 + }, +/obj/effect/turf_decal/trimline/tram/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/tram/filled/warning{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "uCo" = ( /obj/effect/turf_decal/siding/thinplating, /turf/open/floor/iron, @@ -60655,6 +60796,20 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance) +"uCB" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/obj/structure/table, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/item/storage/box/lights/mixed, +/obj/machinery/light_switch/directional/west{ + pixel_x = -23; + pixel_y = -8 + }, +/turf/open/floor/iron, +/area/station/commons/storage/tools) "uCC" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/effect/turf_decal/trimline/neutral/filled/corner{ @@ -60672,6 +60827,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"uCQ" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/obj/machinery/firealarm/directional/east{ + pixel_y = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/white, +/area/station/science/research) +"uCY" = ( +/obj/machinery/light/dim/directional/west, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation/entertainment) "uCZ" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/structure/cable, @@ -60725,6 +60895,19 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/central) +"uDT" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/green/corner{ + dir = 1 + }, +/obj/machinery/duct, +/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/secondary/service) "uEo" = ( /obj/effect/turf_decal/tile/neutral/tram, /obj/effect/spawner/random{ @@ -60733,20 +60916,6 @@ }, /turf/open/floor/noslip/tram_plate, /area/station/hallway/primary/tram/right) -"uEr" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/generic_maintenance_landmark, -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/white/warning{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/maintenance/tram/left) "uEw" = ( /obj/machinery/button/door/directional/east{ id = "miningdorm3"; @@ -60758,6 +60927,25 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/station/cargo/miningdock) +"uEx" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/obj/item/storage/box/lights/mixed, +/obj/item/stack/cable_coil, +/obj/item/stock_parts/cell/emproof, +/obj/item/stock_parts/cell/emproof, +/obj/machinery/camera/emp_proof{ + c_tag = "Engineering - SMES Misc"; + dir = 10; + network = list("ss13","engineering") + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/engine_smes) "uEB" = ( /obj/structure/closet/secure_closet/freezer/fridge, /obj/effect/turf_decal/bot_white, @@ -60783,20 +60971,6 @@ /obj/effect/landmark/start/medical_doctor, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"uER" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/obj/structure/table/reinforced, -/obj/item/reagent_containers/spray/cleaner, -/obj/item/blood_filter, -/obj/machinery/light_switch/directional/east{ - pixel_x = 22; - pixel_y = 9 - }, -/obj/item/clothing/gloves/latex/nitrile, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) "uEV" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 8 @@ -60810,6 +60984,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"uFo" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos) "uFr" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -60819,6 +61003,13 @@ }, /turf/open/floor/iron, /area/station/security/prison) +"uFB" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/security/prison/safe) "uFD" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -60916,25 +61107,13 @@ /turf/open/floor/iron/dark, /area/station/science/xenobiology) "uGL" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"uGM" = ( -/obj/structure/industrial_lift/tram, -/obj/machinery/destination_sign/south{ - pixel_y = -11 - }, -/obj/structure/window/reinforced/tram/left/directional/south, -/obj/effect/landmark/start/hangover, -/obj/structure/chair/sofa/bench/tram/left{ - dir = 8 - }, -/turf/open/openspace, -/area/station/hallway/primary/tram/center) "uGU" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ dir = 8; @@ -60963,6 +61142,11 @@ /obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron, /area/station/cargo/sorting) +"uHj" = ( +/obj/machinery/duct, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet) "uHk" = ( /obj/effect/turf_decal/siding/thinplating/corner{ dir = 1 @@ -61036,6 +61220,18 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/engineering/atmos) +"uHQ" = ( +/obj/item/paper{ + default_raw_text = "Congradulations, agent 'INSERT NAME HERE'! You have been assigned reconnaissance duty among the orbiting rocks of Indecipheres! As this location was previously scouted as a potential build site for a Nanotrasen outpost, one of our benefactors has taken the oppertunity to pre-emptively construct a listening outpost within the region! You have been tasked with monitoring the potentially active future crew and logging all events onboard. If you are a Nanotrasen official who has stumbled upon this outpost before it could be properly established: Please ignore this entire paper."; + name = "initiation paperwork" + }, +/obj/machinery/computer/records/medical/syndie{ + dir = 1; + req_access = list("syndicate") + }, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/dark/small, +/area/station/commons/vacant_room) "uHT" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/trimline/neutral/filled/warning, @@ -61052,6 +61248,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/solars/port) +"uIb" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/structure/table, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/service) "uIk" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -61087,18 +61289,25 @@ "uIt" = ( /turf/closed/wall, /area/station/security/evidence) -"uIJ" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ +"uIG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/siding/thinplating, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/white/warning, -/turf/open/floor/iron, -/area/station/maintenance/tram/mid) +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/iron/smooth, +/area/station/maintenance/tram/left) +"uJa" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Secure - AI Upper Ring East"; + dir = 10; + network = list("aicore") + }, +/turf/open/floor/glass/reinforced, +/area/station/ai_monitored/turret_protected/aisat/hallway) "uJf" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door_buttons/airlock_controller{ @@ -61111,25 +61320,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor, /area/station/maintenance/tram/left) -"uJg" = ( -/obj/machinery/door/airlock/engineering{ - name = "Auxillary Base Construction" - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/aux_base, -/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/mining/aux_base) "uJk" = ( /obj/structure/easel, /obj/item/canvas/nineteen_nineteen, @@ -61196,15 +61386,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"uLb" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/obj/machinery/airalarm/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/tcommsat/computer) "uLd" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -61245,27 +61426,6 @@ }, /turf/open/floor/glass/reinforced, /area/station/science/xenobiology) -"uLz" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/shower/directional/south, -/turf/open/floor/iron/freezer, -/area/station/security/prison) -"uLC" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 10 - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron, -/area/station/security/brig) "uLD" = ( /obj/effect/turf_decal/trimline/green/corner{ dir = 8 @@ -61327,6 +61487,26 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"uMu" = ( +/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/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/obj/item/radio/intercom/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Science - Cytology East"; + network = list("ss13","rd","xeno") + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "uME" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -61481,6 +61661,20 @@ }, /turf/open/openspace, /area/station/hallway/primary/tram/center) +"uOQ" = ( +/obj/machinery/biogenerator, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Civilian - Public Garden" + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"uOY" = ( +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet) "uOZ" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -61582,16 +61776,6 @@ /obj/structure/lattice, /turf/open/space/openspace, /area/station/solars/starboard/fore) -"uRA" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/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/cable, -/turf/open/floor/iron/dark, -/area/station/security/evidence) "uRR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/bar/opposingcorners, @@ -61601,18 +61785,16 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/checkpoint/arrivals) -"uSi" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/light/small/directional/east, -/obj/structure/cable, -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/structure/railing/corner{ - dir = 8 +"uSl" = ( +/obj/effect/turf_decal/trimline/dark_red/warning, +/obj/structure/industrial_lift/public, +/obj/machinery/elevator_control_panel/directional/south{ + linked_elevator_id = "tram_dorm_lift"; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") }, -/turf/open/space/openspace, -/area/station/solars/port) +/obj/structure/railing, +/turf/open/floor/plating/elevatorshaft, +/area/station/maintenance/tram/left) "uSL" = ( /obj/effect/turf_decal/delivery/white, /obj/structure/fluff/tram_rail/floor, @@ -61636,23 +61818,6 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/commons/vacant_room/office) -"uSU" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/structure/sign/clock/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/office) -"uSV" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/chem_heater/withbuffer, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 - }, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) "uTg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -61669,11 +61834,28 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter) -"uTu" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, +"uTq" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/machinery/light/directional/west, /turf/open/floor/iron, -/area/station/commons/fitness) +/area/station/engineering/main) +"uTs" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/light/cold/directional/west, +/obj/machinery/firealarm/directional/west{ + pixel_y = -5 + }, +/obj/machinery/light_switch/directional/west{ + pixel_x = -23; + pixel_y = 8 + }, +/turf/open/floor/iron, +/area/station/command/bridge) "uTz" = ( /obj/structure/railing{ dir = 8 @@ -61762,13 +61944,6 @@ dir = 4 }, /area/station/maintenance/central/greater) -"uUR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/smooth, -/area/station/maintenance/tram/mid) "uUX" = ( /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating/airless, @@ -61786,22 +61961,13 @@ "uVo" = ( /turf/open/floor/carpet, /area/station/command/meeting_room) -"uVx" = ( -/obj/structure/rack, -/obj/item/electronics/apc, -/obj/item/electronics/airlock, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron, -/area/station/commons/storage/tools) -"uVA" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +"uVB" = ( +/obj/structure/table/glass, +/obj/item/storage/secure/briefcase, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) "uVC" = ( /obj/effect/turf_decal/caution/stand_clear/white{ dir = 1 @@ -61837,7 +62003,7 @@ /obj/structure/table/glass, /obj/effect/turf_decal/trimline/blue/filled/line, /obj/item/radio/intercom/directional/south, -/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/item/surgery_tray/full, /turf/open/floor/iron/white, /area/station/medical/surgery/fore) "uWn" = ( @@ -61897,79 +62063,31 @@ /area/station/service/library/lounge) "uXn" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 8; - piping_layer = 2 + dir = 8 }, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/camera/directional/south{ c_tag = "Science - Mixing Lab"; network = list("ss13","rd") }, /obj/machinery/airalarm/directional/south, /obj/effect/mapping_helpers/airalarm/mixingchamber_access, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/ordnance/burnchamber) -"uXt" = ( -/obj/machinery/light/directional/south, -/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, -/area/station/security/brig) "uXv" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 }, /turf/open/floor/iron, /area/station/cargo/storage) -"uXx" = ( -/obj/structure/sign/directions/evac{ - dir = 4; - pixel_y = -28 - }, -/obj/structure/sign/directions/medical{ - dir = 8; - pixel_y = -34 - }, -/obj/structure/sign/directions/engineering{ - dir = 8; - pixel_y = -40 - }, -/obj/machinery/light/directional/south, -/obj/structure/sign/directions/upload{ - pixel_y = -22 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/tram/filled/line, -/obj/effect/turf_decal/trimline/tram/filled/warning, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/right) -"uXC" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 6 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/science) "uXD" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor, /area/station/maintenance/tram/right) -"uXL" = ( -/obj/machinery/airalarm/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/freezer, -/area/station/security/prison) "uXM" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner{ @@ -61993,6 +62111,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/office) +"uYe" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/wood/parquet, +/area/station/medical/psychology) "uYj" = ( /obj/machinery/door/morgue{ name = "Private Study"; @@ -62120,15 +62244,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"vaa" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/newscaster/directional/south, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) "vab" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -62139,19 +62254,6 @@ }, /turf/open/floor/wood/parquet, /area/station/medical/psychology) -"vaj" = ( -/obj/structure/sign/warning/secure_area/directional/north, -/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, -/obj/machinery/camera/directional/north{ - c_tag = "Hallway - Mid Right Command" - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) "vaq" = ( /obj/structure/ladder, /obj/effect/decal/cleanable/dirt, @@ -62199,16 +62301,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/commons/storage/art) -"vbb" = ( -/obj/structure/table, -/obj/structure/closet/mini_fridge{ - name = "mini-fridge"; - anchored = 1 - }, -/obj/item/reagent_containers/condiment/milk, -/obj/item/reagent_containers/cup/soda_cans/cola, -/turf/open/floor/iron/white, -/area/station/service/kitchen) "vbg" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -62236,6 +62328,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/office) +"vbP" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/machinery/button/door/directional/west{ + id = "ToiletSci1"; + name = "Lock Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/iron/freezer, +/area/station/science/lower) "vbT" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -62292,12 +62397,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"vcJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/left) "vcS" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -62353,6 +62452,15 @@ "veV" = ( /turf/closed/wall, /area/station/commons/toilet) +"vfi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) "vfp" = ( /obj/structure/window/spawner/directional/north, /obj/effect/turf_decal/stripes/line{ @@ -62378,10 +62486,6 @@ /obj/machinery/power/emitter, /turf/open/floor/plating, /area/station/engineering/engine_smes) -"vfW" = ( -/obj/machinery/component_printer, -/turf/open/floor/iron, -/area/station/science/explab) "vfX" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -62412,6 +62516,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/brig) +"vgD" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/firealarm/directional/south{ + pixel_x = 3 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light_switch/directional/south{ + pixel_x = -8 + }, +/turf/open/floor/iron/dark/corner{ + dir = 8 + }, +/area/station/science/robotics/mechbay) "vgR" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -62494,6 +62613,14 @@ /obj/effect/mapping_helpers/trapdoor_placer, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) +"vhI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/atmos{ + name = "Turbine Maintenance" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/plating, +/area/station/maintenance/disposal/incinerator) "vic" = ( /obj/machinery/lift_indicator{ linked_elevator_id = "tram_lower_center_lift"; @@ -62507,16 +62634,6 @@ }, /turf/closed/wall, /area/station/hallway/primary/tram/center) -"vin" = ( -/obj/structure/table/wood, -/obj/machinery/libraryscanner, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/siding/wood, -/obj/machinery/camera/directional/west{ - c_tag = "Civilian - Library West" - }, -/turf/open/floor/wood, -/area/station/service/library) "viC" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62686,36 +62803,21 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/security/prison/workout) -"vkq" = ( -/obj/structure/table, -/obj/machinery/light/directional/north, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, +"vkA" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 8 + }, +/obj/machinery/light/warm/directional/west, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/service/chapel) "vkE" = ( /obj/machinery/computer/rdconsole{ dir = 4 }, /turf/open/floor/glass/reinforced, /area/station/command/heads_quarters/rd) -"vkG" = ( -/obj/machinery/elevator_control_panel{ - linked_elevator_id = "tram_xeno_lift"; - pixel_y = 2; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck"); - layer = 3.1 - }, -/turf/closed/wall, -/area/station/science/xenobiology) -"vkM" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) "vkO" = ( /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/iron, @@ -62733,6 +62835,13 @@ dir = 1 }, /area/station/service/kitchen) +"vkW" = ( +/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) "vlb" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/machinery/camera{ @@ -62795,13 +62904,6 @@ }, /turf/open/floor/wood/large, /area/station/service/theater) -"vmk" = ( -/obj/structure/chair/sofa/right{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/cafeteria, -/area/station/science/breakroom) "vml" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -62833,6 +62935,11 @@ }, /turf/open/floor/iron/checker, /area/station/commons/lounge) +"vne" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) "vnk" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -62915,19 +63022,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/evidence) -"voN" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Civilian - Recreational Area East" - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "voS" = ( /obj/structure/chair/sofa/corp/corner{ dir = 1 @@ -62970,16 +63064,6 @@ }, /turf/open/floor/iron/white, /area/station/science/genetics) -"vpC" = ( -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "vpG" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 4 @@ -63040,21 +63124,6 @@ /obj/effect/mapping_helpers/airlock/access/all/science/xenobio, /turf/open/floor/catwalk_floor, /area/station/science/xenobiology) -"vqE" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/machinery/light/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Security - Main South"; - network = list("ss13","Security") - }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - 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) "vqH" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -63062,13 +63131,6 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"vqM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/engine, -/area/station/science/auxlab/firing_range) "vqO" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 4 @@ -63085,19 +63147,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/white, /area/station/science/ordnance) -"vqQ" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Security - Rec Room East"; - dir = 6; - network = list("ss13","Security","prison") - }, -/turf/open/floor/iron, -/area/station/security/prison/workout) "vri" = ( /obj/structure/table, /obj/item/storage/toolbox/mechanical{ @@ -63117,20 +63166,6 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/office) -"vrj" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/table/glass, -/obj/item/storage/medkit/regular{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/storage/medkit/regular, -/obj/machinery/camera/directional/south{ - c_tag = "Medical - Main North"; - network = list("ss13","medbay") - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "vro" = ( /obj/structure/filingcabinet/filingcabinet, /obj/structure/window/reinforced/spawner/directional/east, @@ -63161,10 +63196,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/miningdock) -"vrs" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, -/area/station/security/execution/transfer) "vrx" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/white/full, @@ -63200,6 +63231,13 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) +"vrO" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "vrS" = ( /obj/machinery/vending/coffee, /obj/effect/turf_decal/tile/purple/fourcorners, @@ -63219,6 +63257,19 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) +"vsg" = ( +/obj/machinery/conveyor{ + id = "QMLoad2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/cargo/storage) "vsn" = ( /obj/effect/turf_decal/siding/thinplating, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -63233,11 +63284,6 @@ }, /turf/closed/wall, /area/station/maintenance/disposal) -"vsB" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/dim/directional/north, -/turf/open/floor/iron/dark, -/area/station/service/bar) "vsI" = ( /obj/effect/landmark/start/station_engineer, /obj/effect/landmark/event_spawn, @@ -63284,16 +63330,21 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"vto" = ( -/obj/machinery/light_switch/directional/west{ - pixel_y = -8 +"vtd" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/bodycontainer/morgue{ - dir = 2 +/obj/structure/showcase/cyborg/old{ + dir = 4; + pixel_x = -9; + pixel_y = 2 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/light/dim/directional/west, /turf/open/floor/iron/dark, -/area/station/medical/morgue) +/area/station/science/lower) "vtq" = ( /obj/structure/mirror/directional/east, /obj/structure/sink/directional/west, @@ -63308,33 +63359,13 @@ }, /turf/open/openspace, /area/station/hallway/primary/tram/center) -"vtT" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/corner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/checkpoint/engineering) "vua" = ( /turf/open/floor/carpet, /area/station/service/chapel/monastery) -"vud" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/closet/l3closet/scientist, -/obj/machinery/light/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Science - Xenobiology Airlock"; - network = list("ss13","rd") - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) +"vuh" = ( +/obj/machinery/telecomms/processor/preset_two, +/turf/open/floor/iron/dark/telecomms, +/area/station/tcommsat/server) "vuD" = ( /obj/machinery/duct, /obj/structure/railing/corner{ @@ -63346,7 +63377,7 @@ /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) "vuO" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /turf/open/floor/iron/white, /area/station/security/execution/education) "vuT" = ( @@ -63374,35 +63405,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/genetics) -"vvz" = ( -/obj/structure/sign/directions/evac{ - dir = 4; - pixel_y = 28 - }, -/obj/structure/sign/directions/medical{ - pixel_y = 34 - }, -/obj/structure/sign/directions/engineering{ - pixel_y = 40 - }, -/obj/machinery/light/directional/north, -/obj/structure/sign/directions/upload{ - dir = 4; - pixel_y = 22 - }, -/obj/effect/turf_decal/trimline/tram/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/tram/filled/warning{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) -"vvA" = ( -/obj/machinery/light/directional/east, -/obj/structure/flora/bush/lavendergrass/style_random, -/turf/open/floor/grass, -/area/station/medical/virology) "vvC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -63475,6 +63477,11 @@ /obj/structure/railing/corner, /turf/open/space/openspace, /area/station/solars/starboard/fore) +"vwR" = ( +/obj/structure/cable, +/obj/machinery/light/floor, +/turf/open/floor/plating, +/area/station/solars/port) "vwT" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -63484,10 +63491,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"vwZ" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/security/interrogation) "vxe" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -63500,6 +63503,15 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/entry) +"vxv" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/wood, +/area/station/command/meeting_room) "vxC" = ( /obj/structure/railing{ dir = 10 @@ -63578,17 +63590,42 @@ /obj/effect/spawner/random/structure/closet_private, /turf/open/floor/carpet, /area/station/commons/dorms) -"vyY" = ( -/obj/machinery/porta_turret/ai{ - dir = 4 +"vzi" = ( +/obj/structure/table, +/obj/item/assembly/prox_sensor{ + pixel_x = 5; + pixel_y = 7 }, -/obj/machinery/light/directional/east, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/obj/item/assembly/prox_sensor{ + pixel_x = -4; + pixel_y = 1 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = 2; + pixel_y = -2 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = 9; + pixel_y = -2 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "vzo" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/engine, /area/station/science/auxlab/firing_range) +"vzp" = ( +/obj/effect/turf_decal/trimline/dark_green/corner{ + dir = 8 + }, +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/trimline/dark_blue/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark, +/area/station/commons/lounge) "vzx" = ( /obj/machinery/atmospherics/components/binary/valve{ dir = 4; @@ -63620,24 +63657,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/solars/starboard/fore) -"vAm" = ( -/obj/machinery/computer/bank_machine{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/obj/machinery/door/window/left/directional/west{ - dir = 1; - name = "Terminal Access"; - req_access = list("qm") - }, -/turf/open/floor/iron/dark, -/area/station/cargo/miningdock/oresilo) "vAx" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor, @@ -63647,15 +63666,6 @@ /obj/effect/turf_decal/trimline/neutral/filled/line, /turf/open/floor/iron, /area/station/commons/fitness) -"vAM" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 4 - }, -/obj/structure/table, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit) "vAN" = ( /obj/machinery/door/airlock/medical{ name = "Psychology" @@ -63670,12 +63680,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/psychology) -"vAQ" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/box, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/service/hydroponics) "vBa" = ( /obj/structure/chair{ dir = 1; @@ -63705,6 +63709,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/tram/mid) +"vBl" = ( +/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 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "vBn" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -63757,20 +63778,10 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"vCa" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/corner{ - dir = 1 - }, -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/turf/open/floor/iron, -/area/station/engineering/atmos) +"vCh" = ( +/obj/machinery/light/cold/directional/south, +/turf/open/openspace, +/area/station/science/research) "vCl" = ( /obj/effect/turf_decal/delivery/white, /obj/structure/holosign/barrier/atmos/tram, @@ -63867,16 +63878,15 @@ baseturfs = /turf/open/misc/dirt }, /area/station/science/explab) -"vDE" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 6 +"vDu" = ( +/obj/machinery/computer/robotics{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/plating, -/area/station/commons/vacant_room) +/obj/structure/sign/calendar/directional/south, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/cafeteria, +/area/station/command/heads_quarters/rd) "vDH" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -63895,6 +63905,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) +"vDP" = ( +/obj/machinery/computer/operating{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/robotics/lab) "vEc" = ( /obj/machinery/door/airlock/maintenance{ name = "Permabrig Maintenance" @@ -63917,6 +63933,36 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"vEv" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating{ + dir = 4 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Civilian - Recreational Area East" + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"vEy" = ( +/obj/structure/closet/l3closet/janitor, +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 6 + }, +/obj/item/restraints/legcuffs/beartrap, +/obj/item/restraints/legcuffs/beartrap, +/obj/machinery/light_switch/directional/east{ + pixel_x = 23; + pixel_y = 8 + }, +/turf/open/floor/iron, +/area/station/service/janitor) "vEK" = ( /obj/machinery/medical_kiosk, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -63924,6 +63970,10 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"vEV" = ( +/obj/machinery/light/floor, +/turf/open/floor/engine/vacuum, +/area/station/engineering/atmos) "vFb" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/table, @@ -63989,6 +64039,23 @@ }, /turf/open/floor/engine/n2o, /area/station/engineering/atmos) +"vGc" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/surgery/fore) +"vGd" = ( +/obj/machinery/firealarm/directional/south, +/obj/machinery/conveyor_switch/oneway{ + id = "lawyerdropoff"; + name = "Shipment Delivery Chute Activator"; + pixel_x = 10 + }, +/turf/open/floor/wood, +/area/station/service/lawoffice) "vGi" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/effect/turf_decal/trimline/neutral/filled/corner{ @@ -64013,15 +64080,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/tcommsat/computer) -"vGt" = ( -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/science/robotics/lab) "vGB" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -64123,13 +64181,6 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron, /area/station/engineering/break_room) -"vIg" = ( -/obj/structure/rack, -/obj/effect/spawner/random/techstorage/ai_all, -/obj/effect/turf_decal/trimline/white/filled/line, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "vIs" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -64163,20 +64214,6 @@ }, /turf/open/floor/iron, /area/station/science/explab) -"vIK" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/white/warning{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/maintenance/tram/left) "vIM" = ( /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/white, @@ -64203,30 +64240,9 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/white, /area/station/science/ordnance) -"vJF" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 4 - }, -/obj/machinery/airalarm/directional/south, -/obj/machinery/light_switch/directional/south{ - pixel_x = 26 - }, -/obj/structure/cable, -/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/white, -/area/station/medical/pharmacy) "vKd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -64248,10 +64264,19 @@ }, /turf/open/space/openspace, /area/station/solars/port) -"vKr" = ( -/obj/machinery/light/directional/east, -/turf/open/misc/asteroid/dug, -/area/station/science/explab) +"vKv" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/structure/reagent_dispensers/wall/peppertank/directional/south, +/obj/machinery/computer/records/security{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/engineering) +"vKw" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/machinery/light/dim/directional/east, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "vKD" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -64270,6 +64295,22 @@ }, /turf/open/floor/iron, /area/station/cargo/miningdock) +"vLa" = ( +/obj/vehicle/ridden/wheelchair, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"vLB" = ( +/obj/structure/reagent_dispensers/cooking_oil, +/obj/effect/turf_decal/weather/snow, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/kitchen_coldroom, +/area/station/service/kitchen/coldroom) "vLL" = ( /obj/effect/turf_decal/trimline/brown/filled/corner, /obj/effect/turf_decal/trimline/brown/filled/corner{ @@ -64280,26 +64321,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/miningdock) -"vLY" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/item/storage/box/syringes{ - pixel_y = 4 - }, -/obj/item/storage/box/syringes, -/obj/item/mod/module/plasma_stabilizer, -/obj/item/mod/module/thermal_regulator, -/obj/item/gun/syringe, -/obj/machinery/door/window/left/directional/west{ - name = "Secure Medical Storage"; - req_access = list("medical") - }, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/siding/white{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "vMu" = ( /obj/modular_map_root/tramstation{ key = "secbarupper"; @@ -64382,22 +64403,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"vMZ" = ( -/obj/structure/table/wood, -/obj/item/disk/data{ - pixel_x = 9; - pixel_y = -1 - }, -/obj/item/disk/design_disk{ - name = "component design disk"; - pixel_y = 6 - }, -/obj/item/disk/tech_disk{ - pixel_x = -2; - pixel_y = -3 - }, -/turf/open/floor/carpet, -/area/station/command/meeting_room) "vNe" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -64457,16 +64462,6 @@ "vNH" = ( /turf/closed/wall/r_wall, /area/station/tcommsat/server) -"vNM" = ( -/obj/machinery/firealarm/directional/north{ - pixel_x = 5 - }, -/obj/machinery/light_switch/directional/north{ - pixel_x = -8; - pixel_y = 24 - }, -/turf/open/floor/wood/large, -/area/station/service/barber) "vOx" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -64543,6 +64538,7 @@ /obj/machinery/firealarm/directional/west, /obj/machinery/electrolyzer, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "vPB" = ( @@ -64551,16 +64547,16 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit) -"vPD" = ( -/obj/structure/table/wood, -/obj/item/paper_bin/carbon{ - pixel_x = -3; - pixel_y = 7 +"vPC" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 10 }, -/obj/item/taperecorder, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) +/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/south, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "vQd" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/tile/neutral{ @@ -64568,6 +64564,15 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"vQO" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Civilian - Theatre Backstage" + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/station/service/theater) "vQT" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -64650,35 +64655,6 @@ dir = 1 }, /area/station/commons/fitness) -"vSc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/generic_maintenance_landmark, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/white/warning, -/turf/open/floor/iron, -/area/station/maintenance/tram/right) -"vSh" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/structure/railing/corner, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/siding/thinplating/corner, -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/obj/structure/cable, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "vSI" = ( /turf/open/openspace, /area/station/cargo/storage) @@ -64730,6 +64706,20 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/science/lab) +"vTc" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/machinery/modular_computer/preset/id, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) +"vTh" = ( +/obj/machinery/power/smes, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/catwalk_floor, +/area/station/solars/starboard/fore) "vTj" = ( /obj/effect/turf_decal/trimline/neutral/warning, /obj/machinery/door/window/brigdoor/left/directional/north{ @@ -64744,14 +64734,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/corner, /area/station/command/bridge) -"vTo" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/light_switch/directional/north{ - pixel_x = -11; - pixel_y = 23 - }, -/turf/open/floor/iron/grimy, -/area/station/service/library/lounge) "vTp" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /obj/machinery/meter, @@ -64784,6 +64766,17 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) +"vTE" = ( +/obj/machinery/camera{ + c_tag = "Security - Detective's Office"; + dir = 9; + network = list("ss13","Security") + }, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/iron/grimy, +/area/station/security/detectives_office) "vTF" = ( /obj/structure/tank_dispenser{ pixel_x = -1 @@ -64856,6 +64849,10 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"vVq" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/service/lawoffice) "vVY" = ( /obj/structure/fluff/tram_rail{ dir = 1 @@ -64877,12 +64874,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"vWo" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/tram/right) +"vWu" = ( +/obj/structure/toilet{ + dir = 1 + }, +/obj/structure/mirror/directional/east, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/iron/freezer, +/area/station/security/prison) "vWw" = ( /obj/structure/railing{ dir = 6 @@ -64896,6 +64895,14 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/commons/storage/primary) +"vWR" = ( +/obj/machinery/iv_drip, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "vWT" = ( /obj/structure/railing{ dir = 4 @@ -64916,23 +64923,6 @@ "vXM" = ( /turf/open/space/basic, /area/space) -"vXS" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "N2 Outlet Pump" - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "vXT" = ( /obj/structure/chair/sofa/corp/left, /obj/item/radio/intercom/directional/east, @@ -64963,6 +64953,22 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/cargo/office) +"vYo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/firealarm/directional/north{ + pixel_x = -4 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white, +/area/station/science/ordnance) "vYw" = ( /obj/structure/table/reinforced, /obj/structure/window/reinforced/spawner/directional/east, @@ -64979,15 +64985,6 @@ }, /turf/open/floor/carpet, /area/station/command/bridge) -"vYx" = ( -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/trimline/red/filled/corner, -/obj/machinery/light_switch/directional/east{ - pixel_x = 22; - pixel_y = -9 - }, -/turf/open/floor/iron/white, -/area/station/security/execution/education) "vYy" = ( /obj/structure/sign/warning/radiation/rad_area{ pixel_y = 32 @@ -65028,7 +65025,6 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "vZc" = ( -/obj/effect/landmark/generic_maintenance_landmark, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, @@ -65065,10 +65061,29 @@ "waj" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/aisat/maint) +"wao" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/firealarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light_switch/directional/north{ + pixel_x = 10; + pixel_y = 25 + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) "waE" = ( /obj/machinery/computer/records/medical, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) +"waV" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/escapepodbay) "wbb" = ( /turf/open/floor/iron, /area/station/commons/dorms) @@ -65209,18 +65224,6 @@ "wdj" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/cmo) -"wdl" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/button/door/directional/east{ - id = "cargowarehouse"; - name = "Cargo Warehouse Shutters" - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "wdp" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -65236,6 +65239,16 @@ /obj/structure/sign/calendar/directional/east, /turf/open/floor/iron/cafeteria, /area/station/science/breakroom) +"wdw" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/generic, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "wdC" = ( /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, @@ -65309,23 +65322,11 @@ /obj/structure/closet/crate/coffin, /turf/open/floor/plating, /area/station/service/chapel/monastery) -"wfF" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/landmark/start/assistant, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 6 - }, -/obj/machinery/light/directional/south, -/obj/machinery/camera{ - c_tag = "Cargo - Lobby"; - dir = 6; - network = list("ss13","cargo") - }, -/obj/machinery/firealarm/directional/east, +"wfv" = ( +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/trimline/purple/filled/line, /turf/open/floor/iron, -/area/station/cargo/lobby) +/area/station/hallway/secondary/exit) "wfQ" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -65350,6 +65351,24 @@ /obj/item/pickaxe/mini, /turf/open/misc/asteroid, /area/station/medical/chemistry) +"wgB" = ( +/obj/machinery/status_display/door_timer{ + id = "engcell"; + name = "Engineering Cell"; + pixel_x = -32 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/requests_console/directional/south{ + department = "Security"; + name = "Security Requests Console" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/engineering) "wgI" = ( /obj/structure/chair, /obj/effect/landmark/start/assistant, @@ -65357,6 +65376,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/checker, /area/station/commons/lounge) +"wgL" = ( +/obj/machinery/camera{ + c_tag = "Arrivals - South Docking Wing"; + dir = 9 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "wgM" = ( /obj/machinery/door/poddoor/massdriver_ordnance, /obj/structure/fans/tiny, @@ -65417,9 +65449,24 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/engineering/break_room) +"why" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/corner, +/obj/item/radio/intercom/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/dorms) "whz" = ( /turf/closed/wall, /area/station/maintenance/department/medical) +"whC" = ( +/obj/structure/table, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/cafeteria, +/area/station/security/prison/mess) "whF" = ( /obj/structure/table/glass, /obj/item/storage/box/beakers, @@ -65437,18 +65484,6 @@ "whL" = ( /turf/closed/wall/r_wall, /area/station/security/checkpoint/supply) -"whP" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 8 - }, -/turf/open/floor/glass/reinforced, -/area/station/science/research) "whS" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -65526,6 +65561,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) +"wjk" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Security Maintenance Hatch" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/department/eva) "wjP" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -65559,6 +65603,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) +"wky" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/obj/item/radio/intercom/directional/south, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/security/brig) "wkz" = ( /obj/machinery/door/airlock/security/glass{ name = "Security Post - Cargo" @@ -65611,16 +65672,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/central/greater) -"wlK" = ( -/obj/machinery/vending/cigarette, -/obj/machinery/status_display/evac/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/wood, -/area/station/command/meeting_room) "wlM" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "wlQ" = ( @@ -65678,10 +65732,6 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/supply) -"wna" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/station/service/barber) "wng" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 10 @@ -65692,11 +65742,6 @@ "wnh" = ( /turf/open/floor/iron, /area/station/tcommsat/computer) -"wnn" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/maintenance/tram/right) "wnq" = ( /obj/machinery/announcement_system, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -65720,8 +65765,8 @@ dir = 10 }, /obj/machinery/door/window/elevator/left/directional/south{ - elevator_mode = 1; - elevator_linked_id = "tram_perma_lift" + elevator_linked_id = "tram_perma_lift"; + elevator_mode = 1 }, /turf/open/floor/iron, /area/station/security/execution/transfer) @@ -65773,6 +65818,25 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/tram/right) +"wpn" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/ai_monitored/security/armory) +"wpu" = ( +/obj/structure/table/glass, +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/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) "wpK" = ( /turf/closed/wall, /area/station/science/lobby) @@ -65796,6 +65860,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/courtroom) +"wqf" = ( +/obj/structure/table, +/obj/structure/bedsheetbin, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/cafeteria, +/area/station/security/prison) "wqk" = ( /obj/effect/turf_decal/caution/stand_clear/white, /obj/machinery/door/window/elevator/left/directional/north{ @@ -65833,19 +65903,6 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"wqC" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/light/floor, -/turf/open/openspace, -/area/station/solars/starboard/fore) "wqY" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -65869,16 +65926,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/commons/dorms/laundry) -"wrm" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/light/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/hallway/secondary/exit/departure_lounge) "wru" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -65905,33 +65952,54 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron/white, /area/station/medical/pharmacy) -"wrW" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/engine, -/area/station/science/xenobiology) +"wsb" = ( +/obj/structure/rack, +/obj/effect/spawner/random/techstorage/command_all, +/obj/effect/turf_decal/trimline/white/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"wsq" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/structure/sign/clock/directional/north, +/obj/structure/cable, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics) "wsr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"wsw" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 6 - }, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/showroomfloor, -/area/station/security/warden) "wsA" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit, /area/station/ai_monitored/command/nuke_storage) -"wsT" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +"wsI" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/engine, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, /area/station/science/xenobiology) +"wsZ" = ( +/obj/effect/turf_decal/trimline/neutral/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/machinery/light/cold/directional/north, +/turf/open/floor/iron, +/area/station/commons/dorms) "wts" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -65990,13 +66058,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/orange/visible, /turf/open/floor/iron, /area/station/engineering/atmos) -"wuz" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "wuC" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -66036,6 +66097,11 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) +"wuN" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/engine, +/area/station/science/xenobiology) "wuU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/showcase/cyborg/old{ @@ -66090,6 +66156,12 @@ /obj/item/gun/ballistic/shotgun/doublebarrel, /turf/open/floor/wood, /area/station/service/bar/backroom) +"wwA" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/structure/closet/wardrobe/mixed, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/iron, +/area/station/commons/fitness) "wwI" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -66173,14 +66245,6 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/engine, /area/station/science/xenobiology) -"wxJ" = ( -/obj/machinery/suit_storage_unit/engine, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/engine_smes) "wxW" = ( /obj/machinery/disposal/delivery_chute{ dir = 4 @@ -66360,10 +66424,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/checkpoint/escape) -"wAm" = ( -/obj/machinery/pdapainter/security, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hos) "wAr" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/fluff/paper/stack{ @@ -66408,18 +66468,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"wAY" = ( -/obj/machinery/door/airlock{ - id_tag = "commissarydoor"; - name = "Barber Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/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/catwalk_floor, -/area/station/service/barber) "wBb" = ( /obj/effect/turf_decal/trimline/purple/filled/corner, /turf/open/floor/iron/white, @@ -66440,15 +66488,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/tram/mid) -"wBw" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/newscaster/directional/north, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/white, -/area/station/medical/surgery/fore) "wBz" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/structure/cable, @@ -66457,13 +66496,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"wBK" = ( -/obj/effect/decal/cleanable/dirt, -/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/engineering/atmospherics_engine) "wBV" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance) @@ -66522,6 +66554,18 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/plating, /area/station/engineering/atmos) +"wDi" = ( +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/light_switch/directional/east{ + pixel_x = 22; + pixel_y = -8 + }, +/turf/open/floor/iron/freezer, +/area/station/medical/coldroom) "wDt" = ( /obj/effect/landmark/event_spawn, /obj/structure/chair/stool/directional/east, @@ -66575,19 +66619,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"wEp" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/railing/corner, -/obj/structure/railing/corner{ - dir = 8 +"wEu" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/camera/directional/south{ + c_tag = "Medical - Main South-East"; + network = list("ss13","medbay") }, -/obj/machinery/light/floor, -/turf/open/openspace, -/area/station/solars/port) +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "wEx" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/structure/cable, @@ -66679,19 +66719,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/dorms) -"wFS" = ( -/obj/machinery/modular_computer/console/preset/cargochat/security{ - dir = 4 - }, -/obj/machinery/newscaster/directional/west, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/red/filled/warning{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/security/office) "wFT" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 @@ -66710,6 +66737,22 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"wGk" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Engineering - Chief Engineer's Office"; + dir = 10; + network = list("ss13","engineering") + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) +"wGy" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/sign/clock/directional/north, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/station/security/checkpoint/medical) "wGA" = ( /obj/machinery/door/poddoor/shutters/radiation/preopen{ id = "engsm"; @@ -66871,33 +66914,34 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) +"wJy" = ( +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/command/bridge) "wJM" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/space/basic, /area/space/nearstation) -"wJU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/yellow/warning, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/maintenance/port/central) -"wKe" = ( -/obj/machinery/button/door/directional/west{ - id = "commissarydeezdoorz"; - name = "Commissary Shutter Access" +"wJV" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 }, -/obj/machinery/button/door/directional/west{ - id = "vacant_space"; - name = "Privacy Bolts"; - normaldoorcontrol = 1; - pixel_y = -9; - specialfunctions = 4 +/obj/machinery/airalarm/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Departures - Security Outpost"; + network = list("ss13","Security") }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/vacant_room/commissary) +/obj/machinery/computer/records/security, +/turf/open/floor/iron, +/area/station/security/checkpoint/escape) +"wKf" = ( +/obj/machinery/vending/cigarette, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/wood, +/area/station/command/meeting_room) "wKk" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/table/wood, @@ -66908,6 +66952,11 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) +"wKm" = ( +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/trimline/red/filled/corner, +/turf/open/floor/iron/white, +/area/station/security/execution/education) "wKP" = ( /obj/machinery/holopad, /obj/effect/landmark/event_spawn, @@ -67007,6 +67056,13 @@ /obj/structure/cable, /turf/open/floor/carpet, /area/station/service/chapel/monastery) +"wMW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/yellow/warning, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/port/central) "wMZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -67026,7 +67082,7 @@ "wNq" = ( /obj/machinery/igniter/incinerator_atmos, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "wNs" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -67038,15 +67094,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"wNy" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/red/filled/corner, -/obj/machinery/light/small/directional/west, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/security/brig) "wNK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/violet/visible, /turf/open/floor/iron, @@ -67089,20 +67136,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/lobby) -"wOv" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/obj/structure/showcase/cyborg/old{ - dir = 4; - pixel_x = -9; - pixel_y = 2 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/science/lower) "wOw" = ( /turf/open/floor/iron/grimy, /area/station/ai_monitored/turret_protected/aisat/foyer) @@ -67194,20 +67227,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) -"wRq" = ( -/obj/item/reagent_containers/cup/bucket{ - pixel_x = 4; - pixel_y = -6 - }, -/obj/item/mop, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb, -/mob/living/basic/mouse/gray{ - dir = 4; - name = "Plaguebearer" - }, -/turf/open/floor/plating, -/area/station/medical/virology) "wRv" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /turf/open/floor/iron/white, @@ -67218,14 +67237,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"wRQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 4 - }, -/obj/structure/rack, -/turf/open/floor/iron, -/area/station/maintenance/port/central) "wRR" = ( /obj/structure/dresser, /turf/open/floor/iron/white, @@ -67270,6 +67281,11 @@ /obj/structure/weightmachine, /turf/open/floor/iron, /area/station/security/prison/workout) +"wTi" = ( +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/science/robotics/mechbay) "wTl" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 5 @@ -67312,6 +67328,11 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"wUA" = ( +/obj/machinery/netpod, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/bitrunning/den) "wUL" = ( /obj/machinery/status_display/evac/directional/north, /obj/machinery/fax{ @@ -67321,30 +67342,18 @@ /obj/structure/table/wood, /turf/open/floor/wood, /area/station/service/lawoffice) -"wUR" = ( -/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/south{ - c_tag = "Secure - EVA Storage" - }, -/obj/machinery/light_switch/directional/south{ - pixel_x = 10; - pixel_y = -24 - }, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) -"wVn" = ( -/obj/effect/turf_decal/siding/thinplating/dark, -/obj/structure/table, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "wVC" = ( /obj/effect/turf_decal/delivery/white, /obj/structure/holosign/barrier/atmos/tram, /obj/structure/disposalpipe/segment, /turf/open/floor/noslip/tram_platform, /area/station/hallway/primary/tram/center) +"wVV" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "wWa" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -67408,13 +67417,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/checker, /area/station/commons/lounge) -"wWM" = ( -/obj/effect/turf_decal/trimline/white/filled/line{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) "wWS" = ( /obj/machinery/airalarm/directional/north, /obj/machinery/vending/cola/red, @@ -67430,10 +67432,8 @@ /turf/open/floor/glass/reinforced, /area/station/science/research) "wXi" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 10 - }, -/turf/open/floor/iron/white, +/obj/machinery/hydroponics/soil, +/turf/open/floor/grass, /area/station/science/xenobiology) "wXx" = ( /obj/effect/turf_decal/stripes/line{ @@ -67455,6 +67455,13 @@ }, /turf/open/floor/iron, /area/station/commons/storage/primary) +"wXC" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "wXI" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 8 @@ -67558,6 +67565,14 @@ /obj/effect/spawner/random/decoration/ornament, /turf/open/floor/carpet, /area/station/commons/vacant_room/office) +"wZL" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 6 + }, +/obj/machinery/smartfridge/organ, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "wZY" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -67618,30 +67633,27 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"xaT" = ( +/obj/machinery/computer/atmos_control/nocontrol/master{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/engineering/atmos) "xbh" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/r_wall, /area/station/medical/virology) -"xbk" = ( -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) -"xbp" = ( -/obj/machinery/computer/shuttle/labor, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 +"xbw" = ( +/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, /turf/open/floor/iron, -/area/station/security/processing) +/area/station/command/bridge) "xcd" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -67707,6 +67719,13 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/gravity_generator) +"xdF" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/turf_decal/trimline/neutral/corner, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "xdG" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 5 @@ -67716,9 +67735,23 @@ /obj/structure/sign/poster/official/random/directional/east, /turf/open/floor/iron, /area/station/commons/dorms) +"xdJ" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/white/warning{ + dir = 1 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron, +/area/station/maintenance/tram/mid) "xei" = ( /obj/machinery/atmospherics/components/binary/pump/on, -/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ dir = 4 }, /turf/open/floor/engine, @@ -67727,6 +67760,37 @@ /obj/machinery/hydroponics/constructable, /turf/open/floor/grass, /area/station/service/hydroponics) +"xeC" = ( +/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/trimline/red/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 8 + }, +/obj/machinery/firealarm/directional/north{ + pixel_x = 4 + }, +/obj/machinery/light_switch/directional/north{ + pixel_x = -6; + pixel_y = 28 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/science) +"xeE" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=8"; + location = "Security"; + name = "navigation beacon (Security Delivery)" + }, +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/department/security) "xeG" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -67770,6 +67834,9 @@ "xfL" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/purple{ + dir = 8 + }, /turf/open/floor/iron/white, /area/station/science/xenobiology) "xfN" = ( @@ -67786,6 +67853,7 @@ "xfW" = ( /obj/structure/table, /obj/item/mod/module/plasma_stabilizer, +/obj/item/mod/module/signlang_radio, /obj/item/mod/module/thermal_regulator, /turf/open/floor/iron, /area/station/security/office) @@ -67801,10 +67869,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/station/service/lawoffice) -"xgi" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/grimy, -/area/station/commons/vacant_room) "xgp" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/siding/thinplating/dark, @@ -67835,18 +67899,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) -"xhd" = ( -/obj/machinery/airalarm/directional/north, -/obj/structure/rack, -/obj/machinery/light_switch/directional/east, -/obj/item/clipboard, -/obj/item/chair/plastic, -/obj/item/chair/plastic{ - pixel_y = 5 - }, -/obj/effect/spawner/random/bureaucracy/briefcase, -/turf/open/floor/wood, -/area/station/service/lawoffice) +"xgZ" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/cold/directional/west, +/obj/item/papercutter, +/turf/open/floor/iron, +/area/station/command/bridge) "xhk" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -67967,18 +68025,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"xjC" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/white/warning, -/turf/open/floor/iron, -/area/station/maintenance/tram/right) "xjV" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -68001,6 +68047,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/prison/safe) +"xkg" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/structure/showcase/cyborg/old{ + dir = 4; + pixel_x = -9; + pixel_y = 2 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/iron/dark, +/area/station/science/lower) "xks" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -68009,30 +68070,6 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron, /area/station/maintenance/tram/right) -"xkx" = ( -/obj/structure/toilet{ - pixel_y = 8 - }, -/obj/machinery/light/small/directional/east, -/obj/machinery/button/door/directional/west{ - id = "Toilet3"; - name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet) -"xkD" = ( -/obj/machinery/field/generator, -/obj/machinery/light/small/directional/north, -/obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Secure Storage"; - dir = 9; - network = list("ss13","engineering") - }, -/turf/open/floor/plating, -/area/station/engineering/engine_smes) "xkI" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 9 @@ -68059,18 +68096,18 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"xlk" = ( -/obj/structure/table, -/obj/item/storage/box/prisoner, -/obj/item/storage/box/prisoner{ - pixel_y = 8 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/item/paper/fluff/genpop_instructions, -/turf/open/floor/iron, -/area/station/security/execution/transfer) +"xlu" = ( +/obj/structure/rack, +/obj/item/clothing/under/color/blue, +/obj/item/clothing/under/color/blue, +/obj/item/clothing/under/color/blue, +/obj/item/clothing/head/soft/blue, +/obj/item/clothing/head/soft/blue, +/obj/item/clothing/head/soft/blue, +/obj/effect/turf_decal/tile/blue/full, +/obj/machinery/light/dim/directional/east, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/fitness/recreation/entertainment) "xly" = ( /obj/structure/closet/emcloset{ anchored = 1 @@ -68098,6 +68135,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/station/commons/dorms) +"xlZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "xml" = ( /obj/effect/turf_decal/loading_area{ dir = 4 @@ -68145,6 +68187,15 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"xmK" = ( +/obj/machinery/duct, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/security/prison) "xmR" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -68164,35 +68215,12 @@ }, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) -"xna" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Hallway - Central Escape Wing Entry" - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/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/secondary/exit) -"xng" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 8 - }, -/obj/machinery/light/small/directional/east, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"xnH" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/landmark/navigate_destination/dockescpod, +/obj/machinery/light/directional/west, /turf/open/floor/iron, -/area/station/security/brig) +/area/station/hallway/secondary/entry) "xnI" = ( /turf/open/floor/iron, /area/station/maintenance/tram/left) @@ -68315,11 +68343,32 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"xqO" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/chem_heater/withbuffer, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/obj/machinery/light/directional/west, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) "xqY" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"xrf" = ( +/obj/structure/fluff{ + desc = "What, you think the water just magically soaks into the metallic flooring?"; + icon = 'icons/obj/mining_zones/survival_pod.dmi'; + icon_state = "fan_tiny"; + name = "shower drain" + }, +/obj/machinery/duct, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet) "xrl" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -68338,17 +68387,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"xrD" = ( -/obj/effect/landmark/navigate_destination/engineering, -/obj/machinery/modular_computer/console/preset/cargochat/engineering{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/effect/turf_decal/trimline/yellow/filled/warning, -/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) "xrE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/siding/thinplating{ @@ -68385,15 +68423,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/surgery/fore) -"xsl" = ( -/obj/machinery/camera/emp_proof{ - c_tag = "Engineering - Chief Engineer's Office"; - dir = 10; - network = list("ss13","engineering") +"xsq" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 }, +/obj/structure/extinguisher_cabinet/directional/east, /obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) "xst" = ( /obj/structure/rack, /obj/item/storage/toolbox/electrical{ @@ -68406,6 +68450,12 @@ /obj/effect/turf_decal/trimline/white/filled/line, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) +"xsW" = ( +/obj/machinery/porta_turret/ai{ + dir = 4 + }, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai) "xsX" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -68437,11 +68487,6 @@ }, /turf/open/floor/iron/white, /area/station/science/research) -"xtj" = ( -/obj/machinery/light/floor, -/obj/structure/flora/bush/sparsegrass/style_random, -/turf/open/floor/grass, -/area/station/science/lower) "xtn" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 @@ -68453,6 +68498,35 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"xts" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/pen, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/dim/directional/east, +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/commissary) +"xtD" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/item/stamp{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/stamp/denied{ + pixel_x = 4; + pixel_y = -2 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/cargo/office) "xtM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -68497,18 +68571,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/white, /area/station/medical/surgery/aft) -"xuE" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 10 - }, -/obj/structure/table, -/obj/machinery/camera/directional/south{ - c_tag = "Science - AI Station Access Exterior"; - network = list("ss13","rd") - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/dark, -/area/station/science/lower) "xuI" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -68542,6 +68604,17 @@ /obj/effect/landmark/navigate_destination/gateway, /turf/open/floor/iron/stairs/medium, /area/station/command/gateway) +"xvV" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/white, +/area/station/science/lower) "xwa" = ( /obj/structure/railing/corner{ dir = 1 @@ -68567,6 +68640,22 @@ "xwf" = ( /turf/closed/wall/r_wall, /area/station/maintenance/central/greater) +"xwi" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 5 + }, +/obj/structure/table, +/obj/item/holosign_creator/atmos, +/obj/item/holosign_creator/atmos{ + pixel_x = 5; + pixel_y = 9 + }, +/obj/structure/cable, +/obj/machinery/light/directional/east, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/science/ordnance) "xwz" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68611,16 +68700,6 @@ }, /turf/open/floor/iron, /area/station/security/prison/safe) -"xxD" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 5 - }, -/obj/machinery/camera/motion/directional/north{ - c_tag = "Secure - Upper Station Comms Relay"; - network = list("aicore") - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) "xxW" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 9 @@ -68633,6 +68712,13 @@ "xxZ" = ( /turf/closed/wall, /area/station/cargo/drone_bay) +"xyd" = ( +/obj/machinery/light/directional/south, +/obj/machinery/modular_computer/preset/engineering{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "xyk" = ( /obj/machinery/computer/shuttle/mining, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -68640,6 +68726,19 @@ }, /turf/open/floor/iron, /area/station/construction/mining/aux_base) +"xyn" = ( +/obj/structure/table/reinforced, +/obj/item/storage/medkit/regular{ + pixel_x = -5; + pixel_y = -3 + }, +/obj/item/reagent_containers/cup/glass/coffee{ + pixel_x = 8; + pixel_y = 4 + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron, +/area/station/command/bridge) "xyr" = ( /obj/structure/table/wood, /obj/effect/spawner/random/entertainment/cigarette_pack, @@ -68660,29 +68759,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"xyA" = ( -/obj/structure/rack, -/obj/item/storage/box/gloves{ - pixel_x = -4; - pixel_y = 8 - }, -/obj/item/storage/box/masks{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/wrench, -/obj/item/knife/kitchen, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/machinery/airalarm/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Science - Cytology West"; - network = list("ss13","rd","xeno") - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "xzn" = ( /obj/structure/closet/secure_closet/security/engine, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -68702,12 +68778,6 @@ }, /turf/open/floor/wood/large, /area/station/service/barber) -"xzq" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "xzA" = ( /obj/machinery/door/airlock/command/glass{ name = "Secure External Operations" @@ -68721,41 +68791,18 @@ /obj/effect/mapping_helpers/airlock/access/any/command/teleporter, /turf/open/floor/iron, /area/station/command/teleporter) -"xzB" = ( -/obj/structure/sign/directions/supply{ - dir = 1; - pixel_y = 28 - }, -/obj/structure/sign/directions/security{ - dir = 8; - pixel_y = 34 - }, -/obj/structure/sign/directions/command{ - dir = 8; - pixel_y = 40 - }, -/obj/machinery/light/directional/north, -/obj/structure/sign/directions/vault{ - dir = 8; - pixel_y = 22 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/tram/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/tram/filled/warning{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/right) "xzI" = ( /obj/machinery/vending/games, /obj/structure/sign/clock/directional/north, /turf/open/floor/iron/grimy, /area/station/service/library/lounge) +"xzV" = ( +/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/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) "xAc" = ( /obj/machinery/door/airlock/centcom{ desc = "Truly, a marvel of modern engineering."; @@ -68834,14 +68881,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"xAQ" = ( -/obj/structure/table/wood, -/obj/item/pai_card{ - 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/carpet, -/area/station/command/meeting_room) "xAR" = ( /obj/machinery/door/airlock/security{ name = "Prison Workshop" @@ -68852,6 +68891,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison/work) +"xBc" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 10 + }, +/obj/machinery/firealarm/directional/south{ + pixel_x = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/iron/white, +/area/station/science/explab) "xBh" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -68914,6 +68966,17 @@ /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /turf/open/floor/iron/dark, /area/station/command/bridge) +"xCr" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 9 + }, +/obj/machinery/smartfridge/extract/preloaded, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "xCs" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, @@ -68938,48 +69001,27 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/station/solars/starboard/fore) +"xDJ" = ( +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet) "xDQ" = ( /turf/closed/wall, /area/station/security/processing) -"xDS" = ( -/obj/structure/sign/directions/evac{ - dir = 4; - pixel_y = -28 - }, -/obj/structure/sign/directions/medical{ - dir = 4; - pixel_y = -34 - }, -/obj/structure/sign/directions/engineering{ - dir = 4; - pixel_y = -40 - }, -/obj/machinery/light/directional/south, -/obj/structure/sign/directions/upload{ - dir = 4; - pixel_y = -22 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/tram/filled/line, -/obj/effect/turf_decal/trimline/tram/filled/warning, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/left) "xDW" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "MULE Storage" - }, /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 }, /obj/effect/turf_decal/trimline/brown/filled/line, -/obj/effect/mapping_helpers/airlock/access/all/supply/general, +/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/glass{ + name = "Bitrunning Den" + }, +/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, /turf/open/floor/iron, -/area/station/cargo/storage) +/area/station/bitrunning/den) "xDY" = ( /obj/structure/railing{ dir = 8 @@ -69022,14 +69064,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) -"xFf" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "xFh" = ( /obj/structure/chair/pew/left, /turf/open/floor/iron/chapel{ @@ -69050,21 +69084,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/courtroom/holding) +"xFs" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/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 = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/construction/engineering) "xFx" = ( /turf/open/floor/iron, /area/station/commons/fitness) -"xGj" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 6 - }, -/obj/machinery/light/directional/south, -/obj/machinery/disposal/bin, -/obj/item/radio/intercom/directional/south, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) "xGw" = ( /obj/machinery/door/airlock/external{ name = "Labor Camp Shuttle Airlock" @@ -69103,33 +69135,27 @@ /obj/structure/chair/office/tactical, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"xIe" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/yellow/warning, -/obj/machinery/light/directional/north, -/obj/item/screwdriver, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/maintenance/port/central) -"xIj" = ( -/obj/effect/turf_decal/trimline/dark_green/filled/line, -/obj/effect/turf_decal/trimline/dark_green/filled/corner{ - dir = 1 +"xHB" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 }, -/obj/machinery/firealarm/directional/south{ - pixel_x = 4 +/obj/machinery/firealarm/directional/east{ + pixel_y = -5 }, -/obj/machinery/light_switch/directional/south{ - pixel_x = -10 +/obj/machinery/light/cold/directional/east, +/obj/machinery/light_switch/directional/east{ + pixel_x = 23; + pixel_y = 8 }, -/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/iron, +/area/station/command/bridge) +"xHP" = ( +/obj/machinery/medical_kiosk, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 }, /turf/open/floor/iron/white, -/area/station/science/genetics) +/area/station/medical/medbay/central) "xIp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, @@ -69138,12 +69164,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"xIO" = ( -/obj/structure/table/wood, -/obj/machinery/light/warm/directional/east, -/obj/item/clothing/glasses/eyepatch, -/turf/open/floor/wood, -/area/station/service/theater) "xIV" = ( /obj/structure/table, /obj/item/stock_parts/micro_laser{ @@ -69197,6 +69217,14 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"xJD" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) "xJG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -69231,6 +69259,10 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) +"xKN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/closed/wall, +/area/station/maintenance/disposal/incinerator) "xKR" = ( /obj/machinery/button/door/directional/west{ id = "private_q"; @@ -69280,6 +69312,12 @@ /obj/structure/closet/secure_closet/personal, /turf/open/floor/iron, /area/station/commons/dorms) +"xLM" = ( +/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) "xMa" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 @@ -69287,11 +69325,31 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron, /area/station/security/brig) +"xMe" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/closet/l3closet/scientist, +/obj/machinery/camera/directional/west{ + c_tag = "Science - Xenobiology Airlock"; + network = list("ss13","rd") + }, +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "xMg" = ( /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) +"xMl" = ( +/obj/machinery/vending/hydronutrients, +/obj/structure/noticeboard/directional/south, +/obj/effect/turf_decal/tile/green/fourcorners, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics) "xMz" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -69387,6 +69445,16 @@ }, /turf/open/floor/iron/white, /area/station/science/lower) +"xNl" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/table/wood, +/obj/machinery/fax{ + fax_name = "Head of Personnel's Office"; + name = "Head of Personnel's Fax Machine" + }, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hop) "xNm" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /turf/open/floor/iron, @@ -69439,19 +69507,6 @@ "xOn" = ( /turf/open/floor/iron/dark, /area/station/medical/treatment_center) -"xOs" = ( -/obj/structure/table/glass, -/obj/machinery/microwave, -/obj/structure/sign/clock/directional/east, -/obj/machinery/light_switch/directional/north{ - pixel_x = -10; - pixel_y = 23 - }, -/obj/machinery/firealarm/directional/north{ - pixel_x = 2 - }, -/turf/open/floor/iron/cafeteria, -/area/station/science/breakroom) "xOL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, @@ -69505,25 +69560,10 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/exit) -"xPs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/firealarm/directional/north{ - pixel_x = -4 - }, -/obj/machinery/light_switch/directional/north{ - pixel_x = 9; - pixel_y = 23 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/ordnance) +"xPj" = ( +/obj/machinery/telecomms/bus/preset_four, +/turf/open/floor/iron/dark/telecomms, +/area/station/tcommsat/server) "xPB" = ( /obj/effect/turf_decal/siding/thinplating/corner{ dir = 8 @@ -69536,6 +69576,17 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/supply) +"xPI" = ( +/obj/effect/turf_decal/trimline/brown/line, +/obj/effect/turf_decal/stripes, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/decal/cleanable/oil/streak, +/obj/effect/landmark/start/bitrunner, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "xPN" = ( /obj/structure/closet/lasertag/blue, /obj/effect/turf_decal/tile/blue/full, @@ -69576,15 +69627,21 @@ }, /turf/open/floor/glass/reinforced, /area/station/command/heads_quarters/rd) -"xQc" = ( -/obj/structure/ladder, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/smooth, -/area/station/maintenance/tram/left) "xQv" = ( /turf/closed/wall/r_wall, /area/station/construction/mining/aux_base) +"xQw" = ( +/obj/structure/rack, +/obj/structure/window/spawner/directional/north, +/obj/item/hand_tele, +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/status_display/evac/directional/east, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/dark, +/area/station/command/teleporter) "xQG" = ( /obj/structure/showcase/cyborg/old{ dir = 8; @@ -69593,19 +69650,6 @@ }, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat_interior) -"xQK" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/structure/extinguisher_cabinet/directional/north, -/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, -/turf/open/floor/iron, -/area/station/tcommsat/computer) "xQM" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 5 @@ -69621,14 +69665,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/science/lab) -"xQP" = ( -/obj/structure/closet/secure_closet/brig, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/security/brig) "xQS" = ( /turf/open/floor/iron/grimy, /area/station/hallway/secondary/entry) @@ -69638,6 +69674,21 @@ /obj/structure/sign/calendar/directional/west, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) +"xRl" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/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/machinery/light/small/dim/directional/west, +/turf/open/floor/iron, +/area/station/maintenance/tram/left) "xRn" = ( /turf/open/floor/plating, /area/station/hallway/secondary/service) @@ -69655,6 +69706,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit) +"xRJ" = ( +/obj/structure/bed/medical/emergency{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/white, +/area/station/security/medical) "xSr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -69664,6 +69723,16 @@ /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"xSz" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "xSD" = ( /obj/structure/chair/office/light{ dir = 8 @@ -69700,6 +69769,18 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/genetics) +"xTA" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing/corner, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/openspace, +/area/station/solars/port) "xTM" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrogen_output{ dir = 1 @@ -69740,17 +69821,46 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"xUV" = ( -/obj/machinery/vending/medical, -/obj/effect/turf_decal/siding/white{ +"xUL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/camera/directional/south{ + c_tag = "Maintenance - Central Tram Tunnel 2" + }, +/obj/effect/turf_decal/siding/thinplating{ dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/medical/storage) +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/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/white/warning{ + dir = 1 + }, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/iron, +/area/station/maintenance/tram/mid) "xVp" = ( /obj/structure/cable, /turf/open/floor/wood, /area/station/command/meeting_room) +"xVv" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + 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/trimline/purple/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/ordnance) "xVE" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -69787,11 +69897,6 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter) -"xVH" = ( -/obj/structure/industrial_lift/tram, -/obj/structure/window/reinforced/tram/mid/directional/north, -/turf/open/openspace, -/area/station/hallway/primary/tram/center) "xVJ" = ( /obj/machinery/door/airlock/external{ name = "Mining Dock Airlock" @@ -69849,6 +69954,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) +"xXe" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "xXf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -69895,6 +70006,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"xYe" = ( +/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{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "xYk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -69916,13 +70037,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"xYC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/ai_monitored/security/armory) "xYZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -69988,6 +70102,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) +"xZO" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/turf_decal/box, +/obj/item/stack/sheet/cardboard, +/turf/open/floor/plating, +/area/station/engineering/atmos) "xZQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -70037,21 +70157,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"yaA" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/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/machinery/modular_computer/console/preset/cargochat/medical{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "yaB" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot/right, @@ -70061,18 +70166,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/command/heads_quarters/rd) -"yaS" = ( -/obj/structure/table/wood, -/obj/machinery/light/directional/east, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Civilian - Library East" - }, -/turf/open/floor/wood/large, -/area/station/service/library) "ybc" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/delivery/white{ @@ -70100,12 +70193,17 @@ /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /turf/closed/wall/r_wall, /area/station/engineering/atmos) -"ybF" = ( -/obj/machinery/module_duplicator, -/obj/machinery/light/directional/south, -/obj/item/radio/intercom/directional/south, +"ybD" = ( +/obj/structure/sign/warning/secure_area/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Hallway - Mid Left Command" + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/light/small/dim/directional/north, /turf/open/floor/iron, -/area/station/science/explab) +/area/station/hallway/secondary/command) "ybW" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -70151,16 +70249,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) -"ycy" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) "ycB" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 @@ -70197,6 +70285,11 @@ }, /turf/open/floor/plating, /area/station/maintenance/tram/mid) +"ydd" = ( +/obj/structure/lattice, +/obj/machinery/light/cold/dim/directional/east, +/turf/open/openspace, +/area/station/asteroid) "ydh" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -70251,6 +70344,18 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/dorms) +"yeg" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Atmos to Loop" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "yei" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2{ dir = 8 @@ -70316,10 +70421,6 @@ }, /turf/open/floor/iron/white/side, /area/station/science/explab) -"yfa" = ( -/obj/machinery/light/dim/directional/south, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet) "yfd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -70402,6 +70503,26 @@ }, /turf/open/floor/wood, /area/station/service/bar/backroom) +"ygP" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/button/door/directional/north{ + id = "trammaintdock"; + name = "Tram Maintenance Dock Access"; + pixel_x = -8 + }, +/obj/effect/turf_decal/siding/thinplating, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/white/warning, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/tram/left) "ygR" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -70409,15 +70530,6 @@ /obj/effect/turf_decal/trimline/red/filled/corner, /turf/open/floor/iron, /area/station/security/prison) -"ygT" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Security Maintenance Hatch" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/security/general, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/department/eva) "ygY" = ( /obj/effect/turf_decal/siding/thinplating/corner{ dir = 4 @@ -70430,16 +70542,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"yho" = ( -/obj/structure/table, -/obj/item/radio/intercom/prison, -/obj/machinery/duct, -/obj/machinery/light/floor, -/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/prison) +"yhe" = ( +/obj/structure/table/wood, +/obj/item/storage/backpack/satchel/leather/withwallet{ + pixel_y = 4 + }, +/obj/item/hand_labeler, +/obj/item/stack/package_wrap, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "yhR" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -70459,6 +70570,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) +"yih" = ( +/obj/structure/rack, +/obj/effect/spawner/random/techstorage/security_all, +/obj/effect/turf_decal/trimline/white/filled/line{ + dir = 1 + }, +/obj/machinery/light/dim/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "yii" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -70539,6 +70659,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"yjr" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/white/warning{ + dir = 1 + }, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/iron, +/area/station/maintenance/tram/right) "yjz" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment, @@ -70568,14 +70701,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/plating, /area/station/engineering/atmos) -"yjU" = ( -/obj/machinery/medical_kiosk, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "yjY" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -70652,6 +70777,11 @@ }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) +"ylr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/iron/smooth, +/area/station/maintenance/tram/right) "ylt" = ( /obj/machinery/camera/motion{ c_tag = "Secure - AI Upper External East"; @@ -70660,16 +70790,6 @@ }, /turf/open/space/openspace, /area/space/nearstation) -"ylv" = ( -/obj/structure/closet/secure_closet/engineering_electrical, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/main) "ylw" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -75031,13 +75151,13 @@ aaa aaa gcp aiK -kZj +qtM gcp aaa gcp gcp gcp -aac +qoZ aac aaa aaa @@ -75292,7 +75412,7 @@ auz gcp gcp gcp -cBi +igV gcp agK aac @@ -76062,7 +76182,7 @@ fTI agz agz agz -piT +fEQ gcp aaa aaa @@ -76317,7 +76437,7 @@ gcp cKm agF agz -eJA +gNy auz xAc gcp @@ -76577,7 +76697,7 @@ wSx rSH auz agv -vDE +rYV eSI gcp aaa @@ -82107,7 +82227,7 @@ aaa aaa gfK aRM -iBm +iZY fYf gfK aaa @@ -82932,7 +83052,7 @@ apC abM apC thi -alO +uHj pAv veV hAD @@ -82943,7 +83063,7 @@ xft hAD veV thi -alO +uHj pAv apC abM @@ -83134,7 +83254,7 @@ aaa aaa gfK vuO -vYx +wKm xTN abG abQ @@ -83163,25 +83283,25 @@ aac dDk abq abw -abC +oyy dDk aak dDk acd aco -abC +oyy dDk aak dDk abq abw -adt +tSe dDk aak dDk abq aco -abC +oyy dDk aac aac @@ -83446,18 +83566,18 @@ apC abM apC thi -apD +xrf alT amr alT -anq +alT veV veV -fEe +kMD alT amr alT -apD +xrf pAv apC abM @@ -83645,15 +83765,15 @@ aaa aaa aaa jWs -qGl +cuM uUD cWF -rnm +frL ajM ona cWF udO -sgA +lrq jWs aaa aaa @@ -83683,11 +83803,11 @@ dDk dDk mXt abA -itN +gVW dDk dDk dDk -mXt +kbA abA itN dDk @@ -83706,12 +83826,12 @@ thi alR pAv veV -hAD +uOY hAD veV mCQ kMD -hAD +xDJ veV thi alP @@ -83931,13 +84051,13 @@ aaa dDk bmG abF -kBm +abF abf abf abF -abF +hmb lzJ -kBm +abF abf abf abF @@ -83947,13 +84067,13 @@ ndN abf abf abF -kBm +hmb lzJ abF abf abf abF -kBm +hmb abF qPE apC @@ -84162,7 +84282,7 @@ jWs cWF cWF cWF -rIP +fUm eTl kwG cWF @@ -84416,15 +84536,15 @@ aaa aaa aaa jWs -qGl +cuM uUD cWF -fIH +qTt eTl -kwG +qwV cWF udO -sgA +lrq jWs aaa aaa @@ -84444,7 +84564,7 @@ aaa aaa dDk abb -abg +waV pPA abg abB @@ -84475,7 +84595,7 @@ abM abM abM apC -rMa +nmk ffE hAD hAD @@ -84484,7 +84604,7 @@ veV kMD hAD rlX -oTn +oEl apC abM abM @@ -84734,12 +84854,12 @@ abM apC veV veV -hAD +uOY hAD veV fNx kMD -hAD +xDJ veV veV apC @@ -84976,8 +85096,8 @@ dDk adp adA adB -adF -adJ +fIV +lIS adF adK yiI @@ -84989,16 +85109,16 @@ abM abM abM apC -oGY +paH iCe hAD -yfa +hAD veV veV -fEe +kMD hAD qYx -fhB +rgT apC abM abM @@ -85196,7 +85316,7 @@ xog cWF msg kaT -msg +tGc msg jWs jWs @@ -85460,7 +85580,7 @@ jWs fqr iGG iGG -vrs +qIA jWs aaa aaa @@ -85478,7 +85598,7 @@ abM abM pZW abK -abR +waV acc ack acu @@ -85503,7 +85623,7 @@ abM abM abM apC -xkx +lYZ lMw hAD hAD @@ -85512,7 +85632,7 @@ hAD hAD hAD rdk -gAk +bYe apC abM abM @@ -85962,7 +86082,7 @@ aaa aaa aaa jWs -rIP +jvE eLB abU aci @@ -86219,15 +86339,15 @@ aaa aaa aaa jWs -jvE +fUm xgp jiF fea jWs -xlk +lDo ucA wox -oCM +lvz gTv jWs aaa @@ -86279,7 +86399,7 @@ nay toy elr bZi -rnn +fGr elr bPz bop @@ -86519,7 +86639,7 @@ qQq qQq lQM kcA -owM +iFH lQM jAk pZW @@ -86780,29 +86900,29 @@ lQM lQM pZW pZW -aUP +kNn sbD cga -sbD +umC jNM -omT +qyM mYn tNk qyM sbD mYn -ili +sbD hTL sMZ raX mYn -ycy +rsd sbD -sxv +ilS mYn sbD wbS -lRQ +why lEW kkn jiz @@ -87003,7 +87123,7 @@ oVM adN adX dRJ -pWp +pkH oVM aaa aaa @@ -87024,7 +87144,7 @@ abM abM aaa nDm -suV +xRl uzX qQq qQq @@ -87036,7 +87156,7 @@ rOp ncF xxW tOA -rmc +tOA fVg aUi aUi @@ -87238,24 +87358,24 @@ lFk lFk lFk mAB -dCr -nQB +mbk nQB +qDd xcd akN bhr -swM +tgB fZX -uXL +iqg fZX -akb +vWu oEN -iuh +atV sAI uqj abo foy -gAS +lvg dSe llf jPP @@ -87503,7 +87623,7 @@ fwY ryo gvI gvI -hki +pmG gvI gvI oEN @@ -87550,7 +87670,7 @@ ncF nKY xla teM -azd +bNY azd azd uCC @@ -87747,7 +87867,7 @@ aaa abM aal bhr -lFk +cRM lFk lFk lFk @@ -87758,13 +87878,13 @@ iqH uyJ smj ryo -uLz +hTk fZX wkk fZX -jLj +eWr gvI -rAZ +hXK kHT mIN ezb @@ -87774,7 +87894,7 @@ fZm mgS bLk wIJ -jsN +lss oVM aaa aaa @@ -87792,7 +87912,7 @@ eYZ sbV uDI nUt -wRQ +kRW kau ahR pZW @@ -87824,7 +87944,7 @@ nhL npe xmm sKg -hHu +xhL dzF xhL aXo @@ -88015,11 +88135,11 @@ iqH uyJ smj ryo -nlp +ozX gvI wkk gvI -nlp +ozX gvI oih lAA @@ -88045,7 +88165,7 @@ lQM abM abM pZW -wJU +wMW gpp gpp gpp @@ -88059,7 +88179,7 @@ dlZ egh dlZ dlZ -iLR +oRE ncF fOs ajc @@ -88080,7 +88200,7 @@ trd taB xJt aJC -mlI +aEu jsA wPE wPE @@ -88270,7 +88390,7 @@ lFk lFk iqH iqH -jvy +cea ryo gvI gvI @@ -88288,7 +88408,7 @@ cQD adO mgS jBD -bLk +whC rUR rUR rUR @@ -88297,7 +88417,7 @@ rUR aaa rUR bEz -tpc +dAL lQM abM abM @@ -88333,7 +88453,7 @@ apC eAE apC elr -dwp +exV oqT drw wbb @@ -88345,7 +88465,7 @@ eOv jVT aTt hBV -eCQ +nIc apC abM abM @@ -88518,7 +88638,7 @@ aaa abM aal bhr -cRM +lFk lFk lFk lFk @@ -88554,7 +88674,7 @@ rUR rUR rUR hMQ -uaC +dqK lQM lQM abM @@ -88788,7 +88908,7 @@ ftv tBN ruE iVj -afs +xmK fsP mHA vNe @@ -88830,7 +88950,7 @@ qQq hvm qQq qQq -miW +giK ncF apC apC @@ -89039,11 +89159,11 @@ lFk lFk lFk lFk -jZM +btR iqH bYY gWM -abc +abj abi oxN abn @@ -89051,16 +89171,16 @@ abL cVl fdr tPb -yho +gkz oiF fdr fdr cCD abL bFM -gLZ +uuw rUR -kls +gNm gNm afn lKe @@ -89115,8 +89235,8 @@ tKt loh tKt ppb -nXx -kpF +haH +jKg apC abM abM @@ -89302,7 +89422,7 @@ lkk gjx vml gyN -cyp +hOZ lMZ tgN xYp @@ -89344,7 +89464,7 @@ qQq hvm qQq qQq -vIK +qZx ncF apC apC @@ -89373,7 +89493,7 @@ tKt tKt ppb nXx -kzQ +kpF apC abM abM @@ -89546,7 +89666,7 @@ aaa abM aal bhr -cRM +lFk lFk lFk lFk @@ -89582,7 +89702,7 @@ rUR rUR rUR jVG -tVe +lry lQM lQM abM @@ -89812,7 +89932,7 @@ lFk lFk jZM iqH -sIn +fDg ryo gvI abj @@ -89839,7 +89959,7 @@ rUR aaa rUR pnp -fkc +oQO lQM abM abM @@ -89875,7 +89995,7 @@ apC lgu apC elr -tzJ +ueG hVa vHO iFX @@ -89887,7 +90007,7 @@ iev fvR eyQ rnd -aqY +wwA apC abM abM @@ -89900,7 +90020,7 @@ aac aac aac jcT -aez +aac aac aac aac @@ -90087,7 +90207,7 @@ dhL adQ jpd aIi -fBf +qvV kLz aaa aaa @@ -90101,7 +90221,7 @@ lQM abM abM pZW -xIe +exZ gpp gpp gpp @@ -90115,7 +90235,7 @@ dlZ egh dlZ dlZ -kMv +lyV ncF fOs aje @@ -90136,7 +90256,7 @@ sLR sKP wGg tRU -nel +sdC nel nel nel @@ -90156,7 +90276,7 @@ aac aac aac aac -jcT +gGy qEH aac aac @@ -90317,7 +90437,7 @@ aaa abM aal bhr -lFk +cRM lFk lFk lFk @@ -90329,8 +90449,8 @@ uyJ tPz ryo uqc -uPv -mew +rYq +wqf uPv tlZ gvI @@ -90343,7 +90463,7 @@ ptU dhL lDW fAY -oxG +cgD rhP kLz aaa @@ -90358,7 +90478,7 @@ pZW abM abM agP -oRH +hkt sUf sUf sUf @@ -90366,13 +90486,13 @@ aqf cOe ahV pZW -dEn +ygP qQq qQq hvm qQq qQq -uEr +lyV ncF elr elr @@ -90394,7 +90514,7 @@ qPK scx bsM sKg -uTu +xhL hqN xhL aXo @@ -90617,7 +90737,7 @@ abM pZW pZW pZW -onB +mBo uss xir uwf @@ -90634,7 +90754,7 @@ ncF jzz kNn nmW -sbD +eeP sbD sbD nmW @@ -90836,9 +90956,9 @@ lFk lFk lFk lFk -vqQ -kre +hiG kre +kUu aaK aaT ryo @@ -90848,12 +90968,12 @@ gQO gvI ggL gvI -oSj +tUL rmm fdr ubC pJG -qqn +eBI oEN aaa aaa @@ -90875,12 +90995,12 @@ abM aaa pZW fef -qGC -bRX +dkl +mzg oNE pbM pZW -eOn +sHR fid qQq hvm @@ -91351,16 +91471,16 @@ bhr kPC bhr isW -aav -iXT +sfX +iUv gah isW -aaX -kTw +szd +qvl aaL isW -aby -kTw +jmY +qvl aaL isW sFE @@ -91407,28 +91527,28 @@ ncF bZi wbb aob -jOc -ajf azd +ajf +lHz qUF -fGM +kPr teM uJN kPr azd tVv -jOc +azd nvH bTN buL tVv -lHl +sVn azd -cLp +cOC tVv azd aSM -slH +fLO cbn blN jiz @@ -91620,7 +91740,7 @@ ugu xfd nOe isW -nRT +rPP lPU thG vRO @@ -91663,7 +91783,7 @@ luC ncF wLT xnI -tNf +lho elr vay elr @@ -91886,7 +92006,7 @@ ohr ohr ohr ohr -ejO +dRa vRO aaa aaa @@ -91906,7 +92026,7 @@ aaa aaa aaa ncF -tWG +ewh uJf ncF acP @@ -91916,7 +92036,7 @@ acP acP ncF mdI -xQc +ewh ncF nJr qTg @@ -91932,7 +92052,7 @@ uof jwq toy elr -mJi +wsZ glY elr bPz @@ -91956,7 +92076,7 @@ aac aac ncE ncE -aeE +ncE jcT jcT aac @@ -92129,7 +92249,7 @@ hVo hVo xXt hVo -oAF +jtl hVo xXt jcI @@ -92163,7 +92283,7 @@ aaa aaa aaa ncF -thO +nXo nvE ncF abM @@ -92173,7 +92293,7 @@ abM abM ncF nvE -hdP +uIG ncF prD iJi @@ -92371,7 +92491,7 @@ aaa abM sYd aab -aad +mMK aae mST bMV @@ -92381,13 +92501,13 @@ xwf jdt aaz xfd -aaz -aaU +uFB +aLr aaz xfd aaz aaz -aaz +uFB xfd xxv cNl @@ -92434,7 +92554,7 @@ ncF ncF dFS tuU -nSX +uSl elr elr elr @@ -92632,7 +92752,7 @@ hFr xwf aah dQR -pAl +usm vzY xwf pxW @@ -92648,11 +92768,11 @@ isW drE isW isW -hli +abV wkp uBu nhm -eME +cVd ccH ccH ccH @@ -92679,13 +92799,13 @@ aaa aaa aaa acx -acD +abM abM abM ada abM abM -acD +abM acx aaa ncF @@ -92701,12 +92821,12 @@ kZh myz lof iNo -fIb rtp +uCY xXf byx +uCY luy -fIb fWB uid uDs @@ -92907,7 +93027,7 @@ jiv isW abV wkp -njv +dCU vRO vRO vRO @@ -92981,14 +93101,14 @@ aaa aac ael mKe -jTA +ppQ gAC eqJ muV lst -cnX +dMv aST -aeU +ncE ncE ncE bRE @@ -93150,16 +93270,16 @@ abM abM abM xwf -aaB -dJS +gSa +iVt aaM isW -aaY -dJS +lTm +iVt aaM isW -abz -eBz +hOS +giZ aaM isW yie @@ -93211,7 +93331,7 @@ aaa aaa aaa oTA -bCm +jZJ sud qOf hdn @@ -93224,7 +93344,7 @@ kdu eUs uid uid -dwy +nhJ jnq abM abM @@ -94243,12 +94363,12 @@ aaa aaa oTA oTA -els -pZU +fNR +xlu xPN xVQ -ofx -bLR +sLT +dml jnq jnq abM @@ -94705,7 +94825,7 @@ aaa duB duB cIn -arI +ulT tWy duB duB @@ -96566,7 +96686,7 @@ abM abM jIG iDB -lkv +mzV oHC lSp wnq @@ -96575,7 +96695,7 @@ ney lib uqo utP -cDN +xPj sim ney vNH @@ -97786,9 +97906,9 @@ abM abM abM jIN -ldD vUP vUP +luY wlo abM abM @@ -97850,7 +97970,7 @@ abM abM abM jIG -uLb +nAB vAe eqi ocK @@ -98107,7 +98227,7 @@ abM abM abM jIG -xQK +pIt tLs nXA jmL @@ -98303,7 +98423,7 @@ uVO sqw huD bSr -acW +uBA adr adx qcu @@ -98346,19 +98466,19 @@ aaa aaa abM jIG -vIg -lCT +pDz +tuS klI -kCN +wsb jIG abM abM abM jIG -jiO -wxJ +jHb tPW -rju +tPW +uEx jIG abM abM @@ -98621,7 +98741,7 @@ abM abM abM jIG -erb +dTS eaO huz yct @@ -98631,7 +98751,7 @@ ney muK pGS rcG -rME +vuh dnE ney vNH @@ -98837,7 +98957,7 @@ abM abM gjb eco -pVb +tyt iNR sTZ ekB @@ -99081,7 +99201,7 @@ vBa vrG iTz fEZ -raf +qel mrb hPA hFr @@ -99104,52 +99224,52 @@ aaa aaa abM acx -acL +abM abM abM ada abM abM -acL +abM acx aaa abM abM jnq lkD -ajk +mOW iwV nav -ajQ +fEK scn pkp -fVh +jYz kSp lgP pkp anr anH -uQm -tXS +nkF +eTG uQm uYH nPN pkp -roE +tvT wda bBu aYF bXb -apv -kHA +uTq +jJE dLt lax naC -pDB -umh +bqY +cPS siu igy -kYH +lHp igy aey aeI @@ -99340,7 +99460,7 @@ kKB pxs jXY aGk -rcm +xmH hFr abM abM @@ -99400,7 +99520,7 @@ pwX hJd aYn hJd -jpw +sLZ qHs qHs qHs @@ -99597,7 +99717,7 @@ iTz bFc wLP uCv -xmH +arZ hFr abM abM @@ -99616,7 +99736,7 @@ pmE xDY vxC qjU -coX +leO fvQ qjU abM @@ -99626,16 +99746,16 @@ abM abM qjU fvQ -uUR +qNv jnq abM jnq -fem +cFV tsa rEQ bUj kdb -rtD +yih pkp iTL ifX @@ -99661,7 +99781,7 @@ qWE qHs qgj xmJ -xFf +xmJ fdz xmJ xmJ @@ -99669,7 +99789,7 @@ pQO xmJ xmJ iGh -xFf +xmJ xmJ iFY qHs @@ -99864,16 +99984,16 @@ aaa aaa aaa ekB -aJM +gEx uTz hJM nAa ekB -rZJ +mUc jSV uuD qjU -ufY +aqb cDp qjU acQ @@ -99883,7 +100003,7 @@ acQ acQ qjU fEi -rji +nNs jnq abM jnq @@ -99894,7 +100014,7 @@ hkF kdb gSf pkp -xkD +lNp bTm gLd wJt @@ -99914,25 +100034,25 @@ tHb hJd oEz hJd -gCd +tia qHs ldf dJM saC cIw eNM -cIw +nKQ cIw dQs kWr -aay +gIO qrg aqm sZA daJ gqp gqp -mNo +gqp gqp qHs aaa @@ -100098,7 +100218,7 @@ aag abk nMu hFr -fup +ovW pcE pSb pcE @@ -100106,12 +100226,12 @@ nMd tjI fez fez -vkM +cMB iTz bnh xgh fKv -biu +vGd hFr hFr hFr @@ -100122,9 +100242,9 @@ aaa aaa ekB bxX -fWb +hIg hBr -hiu +vEy ekB jkw bgp @@ -100158,7 +100278,7 @@ pkp anu voC doT -pxH +pxY wbd dNB pKk @@ -100190,7 +100310,7 @@ fDS oOd gNX fVI -eAr +fVI qHs aaa aaa @@ -100356,7 +100476,7 @@ hFr nMu hFr kmh -igk +lKE fwk paS lJS @@ -100365,13 +100485,13 @@ kpt haB kEf iTz -xhd +jeC jmk pYt lSI lWF iMC -lSu +vVq hFr aaa aaa @@ -100408,12 +100528,12 @@ aDz enk lye pkp -vfR +gUE vfR vfR pkp kis -anJ +cFh bHP pLH uGy @@ -100430,7 +100550,7 @@ xAB iMH aYF qHs -asz +tSz bWN mCO mmH @@ -100639,7 +100759,7 @@ pjC sbx uWM sbx -ekj +thD jra ovL ahy @@ -100681,7 +100801,7 @@ pXZ lku oxs sna -tVq +gRQ tbC cuQ arO @@ -100699,7 +100819,7 @@ xVG hDI nMX gCH -iEG +hTF qHs ghh gqp @@ -100879,17 +100999,17 @@ sbx sbx sbx sbx -aed +qXg tlP sbx sbx ldd vKD -afp +ldd sbx xxe afT -sbx +heI sbx sbx jra @@ -100900,7 +101020,7 @@ qjT kJY ovL ahy -wVn +uIb qjU gmj pnF @@ -100925,12 +101045,12 @@ cAz cjy dAR pkG -bwV +lWZ vNB vNB vpP aYF -cRs +puZ cQK ffL ffL @@ -100948,7 +101068,7 @@ ltq bWN qCG hiB -gps +rZx lEf jyF jyF @@ -101134,7 +101254,7 @@ rrE dEc sDC mCx -euZ +cyt slD vds kAX @@ -101178,7 +101298,7 @@ pXG hfW oFd dJR -mpq +rre cjy djg rmI @@ -101406,24 +101526,24 @@ xpb hNe xpb xpb -lWj +xpb xpb sKN ovL -dWn +eWx dJJ dJJ dJJ dJJ qjU qjU -qFM +jCn pOI pOI phE pOI pOI -tmC +xUL jnq jnq abM @@ -101447,7 +101567,7 @@ roB uBy fXQ roB -tPV +pCr hJd hJd oYS @@ -101641,7 +101761,7 @@ nUP nUP nUP nUP -jDE +meA cNr pKI qVV @@ -101691,7 +101811,7 @@ oQW oQW ksP iJd -qKx +xFs ulV ulV ulV @@ -101702,14 +101822,14 @@ bbj bbj roB kCB -fuA +lED roB jHP -tYO +kaJ eKn dIn eKn -ylv +jbb cyH eKn eKn @@ -101727,7 +101847,7 @@ uTm hDI aul mIe -iEG +hTF qHs ghh gqp @@ -101898,14 +102018,14 @@ nUP pyQ fFG nUP -clR +rRH sTE idz rVD iig iig wbK -fkg +omn nUP mXo wOx @@ -101913,18 +102033,18 @@ apl iRL snQ iRL -pPr +trw tbm nNZ -ddz +sMi cWZ klk -hMx +kNo xLm cWZ agV jaG -kit +dWn dJJ aaa aaa @@ -101937,7 +102057,7 @@ kFp eYs kFp kFp -mqq +okG jIG jIG jIG @@ -101951,15 +102071,15 @@ akI cJM ulV bbj -qLW +sRW amw ryJ gzZ -equ +cFP bbj roB aoM -vtT +ict roB roB sHH @@ -101972,7 +102092,7 @@ ccX bvI cjy qHs -pDD +hZe fuj fnO miU @@ -102162,7 +102282,7 @@ tto tto feC voF -pVJ +sST nUP fgH aeo @@ -102170,7 +102290,7 @@ btg iRL snQ iRL -jgk +oXU gRY nNZ cWZ @@ -102197,12 +102317,12 @@ kFp mqq pcu bVW -jsX +bKu bVW xdC uKK nFu -dsN +qeq fal akJ tbc @@ -102219,8 +102339,8 @@ fXQ srY roB roB -apZ -mqw +bdh +tga rnf xBD tYe @@ -102229,7 +102349,7 @@ sHH sHH cjy qHs -vqH +jyU fuj xEy miU @@ -102246,7 +102366,7 @@ lnU lRP ssV fVI -eAr +fVI qHs aaa aaa @@ -102419,15 +102539,15 @@ adg ykN qMf dyC -fIl +kUg nUP gvC fvf -dQt +bje iRL snQ iRL -pjC +uaK twg dWn cWZ @@ -102445,7 +102565,7 @@ qjU qjU qjU qjU -ldL +fMS kFp kFp eYs @@ -102474,14 +102594,14 @@ foi fXQ flV sjm -nNP +wgB roB llK kIG pTl -ggI -aSI -xsl +ozd +eOP +wGk pYU sHH ydk @@ -102491,11 +102611,11 @@ fuj lDy cyN umx -cyN +twR hKM jux wPj -wPj +qIq gyC qgB jDx @@ -102663,11 +102783,11 @@ aaa aaa aaa nUP -pIf +iJM ugC lzo bKb -jPw +kTR nUP tFP ale @@ -102678,11 +102798,11 @@ feC twp yka nUP -krG +vLB aeq xCR iRL -snQ +dpN lgi uPV pvU @@ -102724,28 +102844,29 @@ whv dBa hMs pjQ -xrD -bNZ +tiS +rSC tdf uYX sXW pJP dSP -apw +qbT roB gKJ wIg rSj vRv bDf -joI -fkq +ubt +xyd sHH viW qHs jPt sHh -cmY +yeg +sHh sHh sHh sHh @@ -102753,7 +102874,6 @@ sHh sHh sHh sHh -nRV sHh poT qHs @@ -102945,7 +103065,7 @@ dNp ptn xyu cWZ -rsY +hCA jxV iAb iLv @@ -102959,7 +103079,7 @@ qjU gJw qjU qjU -npX +ioh kFp kFp eYs @@ -102988,13 +103108,13 @@ foi fXQ dor fSp -mTQ +vKv roB axh iHK bAK jsW -utU +vTc qzf qcw sHH @@ -103190,7 +103310,7 @@ tto tto feC voF -tac +jFC nUP cDD aeo @@ -103198,7 +103318,7 @@ aeF iRL quF iRL -hJf +ssN sWF iog cWZ @@ -103225,7 +103345,7 @@ kFp mqq pcu bVW -laz +bKu bVW swg uKK @@ -103257,10 +103377,10 @@ sHH sHH hZr hZr -sto +bpl mRs -woR -laA +jaW +mAx hZr aaa aaa @@ -103440,14 +103560,14 @@ nUP gcE mDy nUP -oIk +wsq dXA uLD sqF adh iVG bmp -ukU +xMl nUP wQr owl @@ -103455,18 +103575,18 @@ cVs iRL quF iRL -urC +fWO tbm umN dfP cWZ ocn -fzm +uyf ecJ cWZ pjC jra -eGk +lIe qjU pri hZA @@ -103487,7 +103607,7 @@ fal eSU wSh vyD -oZU +joq fal akI pib @@ -103497,7 +103617,7 @@ jQM irB fdU vOE -xGj +pmO bbj roB lbz @@ -103697,7 +103817,7 @@ nUP sTz nUP nUP -ebe +ePd vCt jQS adi @@ -103747,7 +103867,7 @@ fal fal pcu llU -kbe +tpm vJA vJA ulV @@ -103760,7 +103880,7 @@ roB uUs xzn roB -pIu +lUe vSL nUR cxr @@ -103951,7 +104071,7 @@ aaa aaa aaa nUP -vAQ +hDZ kia nUP nUP @@ -103976,24 +104096,24 @@ sbx aMv sbx sbx -heI +sbx sbx jra ovL -lIe +xXe dJJ dJJ dJJ dJJ qjU qjU -uIJ +eRI qyr qyr mHO qyr qyr -agu +xdJ qjU qjU aaa @@ -104011,7 +104131,7 @@ hZr amA pvC qsP -anx +tTe aog roB fXQ @@ -104218,7 +104338,7 @@ nck rqk pGy dUH -inG +uDT wEl jpt jpt @@ -104263,7 +104383,7 @@ saZ akM wRi oFd -poy +ntL hZr gIu ifk @@ -104278,11 +104398,11 @@ fLg hMh kaN nVP -nPb +tBK mfB mfB mfB -kQr +kcp mfB jKV nrQ @@ -104294,8 +104414,8 @@ oNq pHM ahD fKg -cyZ -nGt +hVy +awE fjQ vXM aaa @@ -104477,17 +104597,17 @@ xpb gRG xpb xpb -aee +iAI xpb xpb dyE xpb fjN -afq +wXC xpb ftC afU -xpb +lWj xpb xpb xpb @@ -104513,7 +104633,7 @@ qjU aaa qjU fok -tRq +uud sNq ceb pcx @@ -104534,7 +104654,7 @@ bZW wQm skM bZW -ozW +qkN cPM dsH nFL @@ -104781,11 +104901,11 @@ ovi hZr fvn lJm -byG +rfW mwK mwK mwK -dGK +fKk jUO hOE oLv @@ -104803,7 +104923,7 @@ ici wQm oaX tsp -vXS +akv gRl gas fjQ @@ -104982,17 +105102,17 @@ aaa aaa aaa sNs -ace +cTl qeD acG bDH -dYn +fUP mOB uAC qeD qxU alg -bTR +uCB aeG tMD aeG @@ -105004,7 +105124,7 @@ abM abM abM mGw -vNM +fXd aFb sKp sKp @@ -105036,7 +105156,7 @@ akP kwp uyA hZr -rBZ +idg kOh dHr lcf @@ -105054,7 +105174,7 @@ lrX hAW lrX cPM -aTl +qYs wQm bZW wQm @@ -105306,7 +105426,7 @@ wUv roD ldy nbl -qsM +sIi ram lAO ram @@ -105322,8 +105442,8 @@ oNq vXM ahD koq -bEi -eOU +rjP +nBA fjQ vXM aaa @@ -105507,8 +105627,8 @@ ive sXV alg bug -tVA -uVx +hGt +qdF fDx wGE iRL @@ -105518,16 +105638,16 @@ abM abM abM mGw -rVB +thR tqd eTW eTW izQ mGw eep -wna +eep mGw -mjf +ecX iaA qjU acP @@ -105537,7 +105657,7 @@ acP acP qjU leZ -cfg +ecX qjU aaa hZr @@ -105774,17 +105894,17 @@ abM abM abM abM -wAY +fXb gpq tqd usz lML fFl -lTf +bIm eep eep mGw -coX +leO fJo qjU abM @@ -105794,18 +105914,18 @@ abM abM qjU fJo -uUR +qNv qjU aaa hZr -eAN vNu +eAN ake twr wNY xfx -ccQ -bia +xaT +shQ hZr gdJ hRj @@ -105831,7 +105951,7 @@ fTi wQm oaX vwz -idq +kcm gRl gas fjQ @@ -106070,7 +106190,7 @@ hZr mwK pgS mwK -aVn +hjv apr oYK dsP @@ -106291,7 +106411,7 @@ abM mGw bpD sYl -unD +mYc sYl miM mGw @@ -106300,13 +106420,13 @@ aaa aaa aaa acx -acD +abM abM abM ada abM abM -acD +abM acx aaa aaa @@ -106322,7 +106442,7 @@ aaa aaa aaa hZr -sQI +cZN hZr mwK xhX @@ -106350,8 +106470,8 @@ oNq pHM ahD gMi -sbh -pwv +hNI +jqS fjQ vXM aac @@ -106509,7 +106629,7 @@ aac aam hlS hlS -fCB +pcZ hlS hlS aam @@ -106584,7 +106704,7 @@ vCS mwK xhX mwK -ssi +bBB jKL gIf apK @@ -106836,7 +106956,7 @@ aaa aaa aaa hin -pum +xZO vCS mwK xhX @@ -106849,16 +106969,16 @@ nUW xVE xuS nPM -vCa +gjH fkL sgN oTO -pgK +lNl uOZ uOg jEd wIY -btw +pKo vaK hZr pHM @@ -107634,7 +107754,7 @@ hif hZr hZr hZr -aeK +aac hYn aac aac @@ -108128,22 +108248,22 @@ abM abM mwK spF -spF +vEV spF fjQ piX -cnA +hCN piX fjQ qBg -tzP +iHh qBg fjQ fjb -ueZ +lVu fjb hZr -diq +uFo csN hZr vXM @@ -108385,19 +108505,19 @@ abM abM mwK dKv -nra +spF spF fjQ vFR -qmp +piX piX fjQ lwV -gdd +qBg qBg fjQ dWj -tLM +fjb fjb hZr bQQ @@ -108908,7 +109028,7 @@ aaa bNz pxj eqY -oGy +eqY eqY eqY vsU @@ -108923,7 +109043,7 @@ cjG aeO oGj oGj -bKe +dgc nqB nqB vXM @@ -109163,7 +109283,7 @@ aaa aaa aaa bNz -eqY +bgT eqY eGg eqY @@ -109173,9 +109293,9 @@ ucn rCd vPw tzL -eAD +gDq gwy -qjJ +xLM cjG ngg qWU @@ -109595,7 +109715,7 @@ aac aam nkU nkU -nkU +aau nkU nkU hlS @@ -109691,7 +109811,7 @@ sHB gqV sPv qWU -pHS +vkW qWU wNq fzg @@ -109942,9 +110062,9 @@ eqY asC hkW rCd -sJW +fFa +gqV gqV -kMw tTK xWj cdN @@ -110197,7 +110317,7 @@ arP eqY eqY lFa -qMW +xzV rCd eRj vde @@ -110205,7 +110325,7 @@ atC gqV atP atP -auf +pIA aum aup hVG @@ -110450,7 +110570,7 @@ abM mwK ibY ibY -wBK +ibY ibY ibY hiT @@ -110624,7 +110744,7 @@ aac aac nkU nkU -aau +nkU nkU nkU aac @@ -110714,11 +110834,11 @@ bNz bNz bNz rRy -rRy -rRy -rRy -rRy -frT +vhI +xKN +xKN +rdO +rdO xOL qWU lPO @@ -110970,11 +111090,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +rRy +peB +rfe +hUa +qWU aaa aeQ aeR @@ -111227,11 +111347,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +qWU +qWU +qWU +qWU +qWU aaa aaa aaa @@ -111648,14 +111768,14 @@ aev aev hlS hlS -aar +hlS plk -tdO +vTh cCk oAg pKX xDy -caP +bsU mWu hDE aaC @@ -112680,7 +112800,7 @@ aac aac nkU nkU -aas +nkU nkU nkU aac @@ -112725,13 +112845,13 @@ aaa aaa abW acx -acL +abM abM abM ada abM abM -acL +abM acx aaa aaa @@ -112768,7 +112888,7 @@ aac aak aak aak -tqm +aac aaa aaa aaa @@ -113237,7 +113357,7 @@ whL aaa aaa mbJ -tEI +sSL uXD mbJ abM @@ -113247,7 +113367,7 @@ abM abM mbJ uXD -tis +rll mbJ aaa aaa @@ -113477,7 +113597,7 @@ aaa aaa uGW jdU -aZc +jwP rff uGW aaa @@ -113485,7 +113605,7 @@ aaa abM abM arE -rRk +kFH uNa pXh gXb @@ -113494,7 +113614,7 @@ whL aaa aaa mbJ -dOn +osG pqU mbJ acQ @@ -113504,7 +113624,7 @@ acQ acQ mbJ fLJ -iPp +osG mbJ aaa aaa @@ -113709,7 +113829,7 @@ aam hlS hlS hlS -nkU +aas nkU hlS aam @@ -113775,7 +113895,7 @@ abM abM abM iix -feo +giW boW iix abM @@ -113798,7 +113918,7 @@ ptD aac qVr bfH -wrW +bPm maC qVr aaa @@ -114244,15 +114364,15 @@ aaa aaa aaa uGW -ujI +syR pYH uGW iBa kDi -cJX +afw uGW pYH -ujI +syR iRL abM arE @@ -114501,7 +114621,7 @@ aaa aaa aaa uGW -fbH +sOS pGj uGW eyR @@ -114509,15 +114629,15 @@ kDi cJX uGW kot -mlE +sOS iRL abM arE arE arE -aha +nIQ xPB -lXv +gOg whL aaa aaa @@ -114543,14 +114663,14 @@ abM abM ePG qCX -vqM +qfc uNs ePG fFg jwZ bwO dUT -fje +fyR dUT vTv iON @@ -114558,12 +114678,12 @@ iON oWA oUg dUT -oyV +vbP dUT -qHK +lBb qVr wxE -fAm +gwK hdA qVr qVr @@ -114575,7 +114695,7 @@ qVr qVr qVr bfH -bfH +bPm tzq qVr aaa @@ -114774,7 +114894,7 @@ abM arE rIp uBH -dFY +xJD whL aaa aaa @@ -114803,7 +114923,7 @@ dSy myo vzo ePG -bCK +gHE xJR fWT fip @@ -114819,7 +114939,7 @@ oNT dUT gdC qVr -ayN +bfH aJT ahk hdA @@ -114833,7 +114953,7 @@ sml bfH bfH aJT -jkd +jTC qVr aaa aaa @@ -115020,7 +115140,7 @@ unl unl ygw gER -ehM +izd uGW uGW uGW @@ -115038,7 +115158,7 @@ abM abM aaa mbJ -vSc +wip hFC hFC dBM @@ -115272,7 +115392,7 @@ aaa unl nTG bvH -kOc +fCS trK unl bJb @@ -115280,7 +115400,7 @@ djI vRK pCL pni -kaF +iez kaF bBs iRL @@ -115295,13 +115415,13 @@ abM abM abM iRL -xjC +crV cch cch rQg cch cch -aYg +gBw mbJ aaa aaa @@ -115326,7 +115446,7 @@ dUT dUT dUT dUT -syp +xvV kWq hiR hfP @@ -115539,7 +115659,7 @@ fmt dcf kJV hne -bJT +tFC iRL iRL kPE @@ -115578,16 +115698,16 @@ vOx xJR fWT fip -xtj +fyR fje bOi -qwX +eNq dUT lyf rin dUT vtq -fGZ +fVH vtq xHw qVr @@ -115595,7 +115715,7 @@ mBm dHc pYZ aqB -cVX +vBl gNr lym pph @@ -115787,7 +115907,7 @@ unl pfT jCH lob -asU +oiI unl eyR djI @@ -115809,7 +115929,7 @@ arE iRL iRL iRL -wip +crV hFC hFC dBM @@ -115851,12 +115971,12 @@ qVr lTS inn xcM -lyQ +ptL jiQ asv asv jiQ -bNs +iQG uHF hjM tjP @@ -116072,7 +116192,7 @@ hFC dBM hFC hFC -tSM +caN qxm abM abM @@ -116102,7 +116222,7 @@ wkR hOf qVr xPQ -vud +xMe tml qVr qCW @@ -116298,7 +116418,7 @@ aaa aaa aaa unl -fog +ikc bvk aeu pzd @@ -116312,18 +116432,18 @@ tMY nZr qCR pIb -pIb +ubD jbp wYz sfE xBU aSi -vAm +hUs vWx aaa aaa mbJ -cNd +iSC hFC hFC qeo @@ -116369,7 +116489,7 @@ hDT keT iEF fof -vkG +csn sXX akC hFP @@ -116378,7 +116498,7 @@ eGt bql bfH bfH -dgR +rPv qVr aaa aaa @@ -116586,7 +116706,7 @@ hFC dBM hFC hFC -kYs +yjr qxm abM abM @@ -116599,8 +116719,8 @@ abM abM ePG ejJ -rAU -iPU +uel +pNv hvJ vOx rwN @@ -116616,7 +116736,7 @@ puT awT qVr kXg -nPB +kHd dGk qVr kkL @@ -116837,7 +116957,7 @@ oys qxm qxm qxm -wip +crV hFC hFC dBM @@ -116879,12 +116999,12 @@ qVr wET eQm cyU -cZE +aPl jiQ asv asv jiQ -nLH +xCr gJY coM bgH @@ -117081,7 +117201,7 @@ chf sOI del vrr -ixL +rLd qxm qxm abM @@ -117100,7 +117220,7 @@ hFC dBM hFC hFC -ooA +auA qxm abM abM @@ -117123,7 +117243,7 @@ fip fyR fje qwX -fng +pHl dUT siL xNk @@ -117137,7 +117257,7 @@ nbI yfH cue qlf -hYx +wsI ulb dOq nho @@ -117327,7 +117447,7 @@ aaa aaa unl flZ -mNp +ktb mNp qal unl @@ -117336,7 +117456,7 @@ gIV cJX pCL dwA -uYs +gFk uYs laM qxm @@ -117351,13 +117471,13 @@ abM abM abM qxm -aDR +eZO fmB fmB ddM fmB fmB -hly +oLn qxm abM abM @@ -117371,7 +117491,7 @@ cJS tyi qnA oRz -vfW +fQX sQZ vOx rwN @@ -117382,7 +117502,7 @@ dUT dUT dUT dUT -sOZ +pMw xNk pnn hCv @@ -117590,7 +117710,7 @@ unl unl eyR bAa -afw +cJX uGW uGW vle @@ -117628,9 +117748,9 @@ cJS nhj hYg oRz -ybF +rUr sQZ -lUR +aWs rwN uJV fip @@ -117644,7 +117764,7 @@ aXN nVm kVf huW -vmk +dka qVr kkx txM @@ -117693,11 +117813,11 @@ oqp oqp oqp ceY -twq +wRy dKV bFl jrR -pSg +jWp ceY oqp oqp @@ -117853,9 +117973,9 @@ afR jrI agi agl -fiA +gkn agC -agO +dcP ahd vle aaa @@ -117903,7 +118023,7 @@ ebs hFH tYB qVr -wsT +jTC aJT bfH bfH @@ -117917,7 +118037,7 @@ uAF ahk hdA aJT -dgR +bfH qVr aaa aaa @@ -118148,7 +118268,7 @@ nhj prI nhj mtI -tEe +aVb dUT kEN eHE @@ -118156,12 +118276,12 @@ eHE vpG rin roR -xOs +twS wdr nrh qVr jcm -bfH +oHU bfH qVr qVr @@ -118173,7 +118293,7 @@ qVr qVr qVr ahk -fAm +wuN fqM qVr aaa @@ -118199,7 +118319,7 @@ vXM vXM xvl lqQ -kGC +tJp rHC xvl dKV @@ -118361,7 +118481,7 @@ bwM dwA dAl afj -bCT +cZY jhN kDF vso @@ -118403,7 +118523,7 @@ cFW nEB vep eYN -bDk +xBc gzw gzw gzw @@ -118459,7 +118579,7 @@ cXe bMz egJ xvl -kkf +xJB sXL nNk nNk @@ -118671,11 +118791,11 @@ dxO rin fip fje -fje +fyR bOi -eNq -fje qwX +fje +eNq bOi dUT aaa @@ -118729,7 +118849,7 @@ waj iTI nNk rDI -aNk +aNq oqp oqp oqp @@ -118881,7 +119001,7 @@ aac vle gqc oNA -ggt +vle mbQ vle xSG @@ -118891,7 +119011,7 @@ aaa abM abM qxm -wnn +hKj hKj myD sVs @@ -118901,7 +119021,7 @@ aiB hKj myD hKj -qBE +hKj qxm abM abM @@ -118917,7 +119037,7 @@ vEl wtR uVa oQU -czu +ojU gzw gzw qPX @@ -118938,7 +119058,7 @@ dUT aaa qVr qiI -dFC +oHU bfH qVr iix @@ -118967,7 +119087,7 @@ vXM vXM mbe xvl -nFD +fLB xly xvl odF @@ -119141,14 +119261,14 @@ azp azp azp oqy -mas +mUu vle aaa aaa abM abM qxm -hKj +ylr sVq myD rOB @@ -119158,7 +119278,7 @@ aCe reU myD sVq -hKj +ylr qxm abM abM @@ -119177,7 +119297,7 @@ gkF kRR nNh gzw -stC +gGi xBC ryT rpQ @@ -119199,7 +119319,7 @@ qVr qVr qVr iix -rYl +kff vwd pRm pRm @@ -119229,7 +119349,7 @@ jqs dBj wOw aur -dnQ +uxL xvl sRL nNk @@ -119409,7 +119529,7 @@ qxm qxm oys utB -vWo +aHO rCL aCe hIE @@ -119436,9 +119556,9 @@ gXo gzw dNH lrt -kld +lMa gzw -vOx +aWs wxc kjH ieu @@ -119449,14 +119569,14 @@ iBX gyw lxW iix -ekN -wOv +qQa +vtd hqx iGF -mfT -xuE +xkg +tXA iix -tQN +evd pPn gEK xxl @@ -119492,7 +119612,7 @@ mxm gWx byF waj -vkq +iJY xeO uTg uTg @@ -119505,7 +119625,7 @@ bhx uQS pMG pAC -wWM +bdT oqp vGk rxw @@ -119682,13 +119802,13 @@ aaa oyR sQZ sQZ -aBl +aML kRR mmy nNh vCY nRd -czu +ojU gzw gzw ulz @@ -119701,7 +119821,7 @@ gpi nWW nWW nWW -oPk +tsx nWW kYP wSj @@ -119943,7 +120063,7 @@ pTj kRR vDg pQx -kRR +fEM sQZ sQZ gzw @@ -119995,7 +120115,7 @@ gjT gjT gjT fVK -nWb +jFM aPV xvl diy @@ -120271,7 +120391,7 @@ waj pXk mwL rDI -aNk +aNq oqp oqp ayI @@ -120461,13 +120581,13 @@ vUz oyR oyR kkK -gOL +jwj aMc cXR sdr gPV -kWk -gzT +mLp +hvv dfz dLp nwI @@ -120515,7 +120635,7 @@ bzA mdr wzE xvl -uwi +uiI vMX mwL mwL @@ -120711,7 +120831,7 @@ aaa oyR oyR oyR -vKr +pQx hgN oyR oyR @@ -120734,12 +120854,12 @@ vjT urm eIZ hJl -ash +rjT keJ vIv gZP wrf -sNv +pFm hJl aaa aaa @@ -120769,7 +120889,7 @@ vXM vXM xvl jHc -stW +tQq tQq xvl dKV @@ -120976,14 +121096,14 @@ kkK jXE lwF dfz -tzk +fWK qCP urA ygC pfh yfU dfz -xPs +vYo foS foS vMP @@ -121228,7 +121348,7 @@ aaa aaa aaa dfz -bbS +mpd lEt glc pHM @@ -121245,7 +121365,7 @@ qOo qOo xZs nyx -btx +kmr hee aaa hJl @@ -121291,11 +121411,11 @@ oqp oqp oqp dnF -afI +ide dKV xQG pur -tDB +ouz dnF oqp oqp @@ -121497,7 +121617,7 @@ ygC ygC fSq dfz -hji +xVv qOo qOo lZJ @@ -121752,7 +121872,7 @@ pUC fXK lyC hox -nTn +hox dfz vqO edP @@ -122008,7 +122128,7 @@ xdw ure bKT bqU -nuu +qHa nuu dfz uCz @@ -122520,9 +122640,9 @@ frV fni qCz mzQ -iGL +ckr bZp -sUV +vzi lkK aeg gPB @@ -122780,9 +122900,9 @@ wMz okA mPV xjx -gKc +qjp frV -qFY +xwi vJC qWf rLG @@ -123031,19 +123151,19 @@ aaa aaa aaa frV -hlh +ggm kLM qHj qME qME qME -mon +stU frV -wBV -wBV -jLH +frT +ryK jLH jLH +twv aaa aaa aaa @@ -123295,12 +123415,12 @@ nMB qAl nMB ryI -ign -aac -aaa -aaa -aaa -aaa +frV +ovK +lwt +gaO +mWp +wBV aaa aaa aaa @@ -123552,12 +123672,12 @@ nMB nMB nMB abh -ign -aac -aac -vXM -vXM -aaa +frV +wBV +wBV +wBV +wBV +wBV aaa aaa aaa @@ -123811,11 +123931,11 @@ dWM ign ign aac -vXM -vXM -vXM -vXM -vXM +aac +aac +aac +aac +aac vXM aaa aaa @@ -136237,4841 +136357,4841 @@ vXM "} (1,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (2,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (3,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (4,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (5,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (6,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW meb -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (7,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (8,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW cAd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (9,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW cAd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (10,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW cAd -jhd +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (11,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd +pMW cAd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (12,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE avE avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (13,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE avE avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (14,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (15,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -jhd -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +pMW +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (16,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (17,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW rOy -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW rOy -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (18,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW rOy -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW rOy -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -aac -jhd -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +aac +pMW +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (19,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW pHM -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aaa aaa @@ -141090,246 +141210,246 @@ aaa aaa aaa aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (20,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -141337,7 +141457,7 @@ aac aaa gcp jFt -pVy +gnq wtK gcp gcp @@ -141347,506 +141467,506 @@ aaa aaa aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (21,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW rOy -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW rOy -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aaa gcp qBq exv gNy -krT +oiL aBI -sJp +isP gcp aaa aaa aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (22,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW rOy -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW rOy -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa gcp @@ -141855,512 +141975,512 @@ exv gNy ydj jap -tsR +uHQ gcp aaa aaa aaa aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (23,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW meb -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE avE rOy rOy oKl -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW oKl rOy rOy avE avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa gcp iOh gNy gNy -hCm +mVj agt bxd gcp aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (24,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW oKl -jhd -jhd -jhd +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd +pMW +pMW +pMW oKl -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW meb -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa gcp @@ -142374,256 +142494,256 @@ gcp aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (25,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW rOy -jhd -jhd -jhd +pMW +pMW +pMW oKl -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW oKl -jhd -jhd -jhd +pMW +pMW +pMW rOy -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa aaa aaa gcp -xgi +oae kFs gcp aaa @@ -142631,250 +142751,250 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (26,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW oKl -jhd -jhd -jhd +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd +pMW +pMW +pMW oKl -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW rOy rOy rOy rOy -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa aaa @@ -142886,253 +143006,253 @@ gcp aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (27,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW meb -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE pHM rOy rOy rOy oKl -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW oKl rOy rOy rOy pHM avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa aaa @@ -143142,23 +143262,23 @@ gcp gcp aaa aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa aaa @@ -143166,901 +143286,901 @@ aaa aaa aaa aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (28,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW oKl -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW rOy -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW rOy -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW oKl -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW oKl rOy rOy pHM rOy rOy -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (29,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW oKl -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW oKl -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (30,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE tPE tPE tPE tPE avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE tPE tPE tPE tPE avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE tPE tPE tPE tPE avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (31,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW oKl oKl oKl @@ -144073,285 +144193,285 @@ tld nmY fXf nmY -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW nmY nmY nmY -nwg -pRF +cPH +dfL nmY avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE nmY -vpC -bix +hng +xnH nmY nmY nmY -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (32,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW tPE rhF jEu mlu tCT kHa -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW iuz tCT hEb nQG dfL nmY -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW nmY oTK vcI @@ -144359,477 +144479,477 @@ gYz tCT oTC pEB -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (33,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW tPE rhF vcI nmY nmY nmY -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW nmY nmY nmY bNA dfL nmY -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW nmY oTK vcI nmY nmY nmY -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (34,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac iyc @@ -144844,255 +144964,255 @@ kqf dFP nBu nmY -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW nmY kzw dFP iZo dfL nmY -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW nmY oTK vcI nmY -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aac -jhd -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aac +pMW +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (35,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aaa iyc uhw wXM -gVB +czg ajo wXM iyc @@ -145101,503 +145221,503 @@ dZw jEu alS nmY -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW nmY gpR jEu nQG dfL nmY -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW nmY oTK vcI nmY -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (36,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW iKN -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac aac aaa iyc -jfd +iWQ suR qnW hKX -kYy +mxE iyc utc jEu jEu vcI nmY -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW nmY pbr jEu nQG -orl +iAW tPE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW tPE -qUb +wgL vcI nmY -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (37,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW meb -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aaa @@ -145615,244 +145735,244 @@ ltt aRA tea nmY -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW nmY mMc aRA baK dfL nmY -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW nmY oTK dFt nmY -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (38,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -145867,249 +145987,249 @@ uSR oXe mOi iyc -sPN +nVV vcI nmY nmY nmY -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW nmY nmY nmY bNA dfL nmY -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW nmY oTK vcI nmY nmY nmY -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (39,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -146129,245 +146249,245 @@ jEu mlu tCT kHa -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW bfM tCT vxe nQG dfL nmY -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW uUB -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW nmY oTK vcI qMx tCT vMC -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (40,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aaa aaa @@ -146380,250 +146500,250 @@ sbe tmz kUm jfN -rAy +jde kIZ aVT nmY fXf nmY -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW nmY nmY nmY kgG qch nmY -jhd -jhd -jhd +pMW +pMW +pMW nmY aaF nmY -jhd -jhd -jhd +pMW +pMW +pMW nmY wQN qNa nmY nmY nmY -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (41,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aaa @@ -146632,31 +146752,31 @@ aaa aaa aaa iyc -bTJ +tCX bUG azk hqi -bdJ +fnv iyc kIZ kqf cRJ nmY -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW eYn -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW nmY uGf xiD dfL nmY -jhd +pMW lQn nmY nmY @@ -146664,219 +146784,219 @@ tCT nmY nmY lQn -jhd +pMW nmY wQN fJv tPE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (42,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -146891,7 +147011,7 @@ aaa iyc ajo wXM -azl +azk jHr jSa iyc @@ -146926,214 +147046,214 @@ lQn mtr hTa tPE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (43,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW meb -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -147157,20 +147277,20 @@ jEu kqf dFP dFP -wuz dFP dFP dFP dFP dFP dFP -qqx +dFP +dFP dFP ste mtr jEu sHu -etC +jEu jEu kqf dFP @@ -147178,7 +147298,7 @@ dFP dFP ste jEu -etC +jEu jEu mtr hTa @@ -147200,190 +147320,190 @@ aac aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (44,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -147412,7 +147532,7 @@ jJX kIZ kIZ kIZ -kIZ +xYe kIZ kZB kIZ @@ -147436,7 +147556,7 @@ pNc quL iOG quL -quL +reg ajv nQM tPE @@ -147458,189 +147578,189 @@ aac aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (45,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -147679,11 +147799,11 @@ oca vvk sYk iUr +rWB yjN yjN yjN -yjN -yjN +rWB dkD udZ nQM @@ -147717,185 +147837,185 @@ aac aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (46,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aac aac @@ -147931,16 +148051,16 @@ rlv oca uhv vyI -biI +sTn oca jNb qsa wdU +tPE jNb jNb jNb -jNb -jNb +tPE fLN tRo jNb @@ -147974,183 +148094,183 @@ aac aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (47,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -148193,19 +148313,19 @@ vTB aSG qgR aFh -aMz +qHM kpC dpG sCw -qvM +jdk aGx cvz blu ckM -pVW +pYh aow mdY -mpw +tVO tdx mQa tdx @@ -148232,182 +148352,182 @@ aaa aac aaa aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (48,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -148459,7 +148579,7 @@ aGx uAp hTa ckM -ftt +wpu igT mdY mpw @@ -148467,7 +148587,7 @@ tdx mQa tdx rnK -iZj +ouW qzn tdx abM @@ -148490,177 +148610,177 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (49,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -148747,177 +148867,177 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (50,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -148960,7 +149080,7 @@ qZA jTF xKe edE -uJg +rnh bTp kDm eVh @@ -149004,176 +149124,176 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (51,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -149201,7 +149321,7 @@ ayR ayR bVG bid -lBZ +fiP qPV hzN rlv @@ -149246,7 +149366,7 @@ gFt cSr gCQ evs -edK +ezh tdx abM aaa @@ -149261,175 +149381,175 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (52,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -149480,24 +149600,24 @@ xIL eVh kJU xQS -ski +eSy xQS pJE aGx uzt hTa ckM -ijf +edu aUh mdY mpw ckM -rrM +bbM puN -moP +jPY wFq -sQu -vin +bKE +fkQ iOi ojI vFC @@ -149520,173 +149640,173 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (53,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -149710,13 +149830,13 @@ aaa abM abM ayR -tVp +bLO mdV tKa bqu dQw hlo -pNd +rZq hzN rlv rlv @@ -149736,18 +149856,18 @@ lyz xIL eVh rIT -qKW -hfx +tBA +dHF xZi jTf pyT kly hTa ckM -qgx +uOQ sMX mdY -mpw +tVO ckM aHD iOi @@ -149756,7 +149876,7 @@ aeh ewK qDu ild -ojI +ndz cSr cSr cSr @@ -149777,173 +149897,173 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (54,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -149989,17 +150109,17 @@ kaD qYj ceW oca -lQC +pAw dDi -mtX -tPE -tPE -tPE +jWg tPE +jNb +jNb +jNb tPE -aGy +bhY emO -nQM +rWt ckM pMz pzw @@ -150017,7 +150137,7 @@ lXe bNV ckt xrn -xrn +lhV xrn tdx tdx @@ -150034,173 +150154,173 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -aaa -aaa -aaa -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +aaa +aaa +aaa +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (55,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -150211,8 +150331,8 @@ aaa aaa aaa yji -suy -xQP +tFk +mJQ dTL yji run @@ -150230,7 +150350,7 @@ hzN hzN exq fTM -wUR +rcx hzN xQv xQv @@ -150263,7 +150383,7 @@ ckM ckM ckM ckM -iuI +dNa iOi fTz aKh @@ -150277,7 +150397,7 @@ iOi eyy eJz rAS -kVw +rfR gsT uJk mNV @@ -150291,172 +150411,172 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (56,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -150475,7 +150595,7 @@ dTL mjM wNj tBO -lPT +gtH qZy run ayR @@ -150490,16 +150610,16 @@ hzN hsb hzN gkU -mqe -rzw +gkU +eaU rWm xMI aBV -iPs +aBV aBV wHT -miQ -uyn +mTX +kcw ruV wHT twz @@ -150548,56 +150668,56 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -150613,107 +150733,107 @@ aaa aaa aaa aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (57,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -150735,7 +150855,7 @@ inO inO awP stz -ygT +wjk gKX ayR eeL @@ -150805,51 +150925,51 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -150871,106 +150991,106 @@ aaa aaa aaa aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (58,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -150978,20 +151098,20 @@ xSX xSX xSX lJu -avp +avq avy -avH +tkH xSX nDj aBK dkO dta mjM -nSs +kVQ vRy gbr kMR -hKz +xRJ ayR gKX ayR @@ -151008,11 +151128,11 @@ wEV hzC gQZ nVq -jns -hVD -pvm +jAi +mSx +tHv wHT -obw +xNl dqm bZZ wHT @@ -151022,7 +151142,7 @@ vhv uba yjN yjN -yjN +rWB yjN sEY xhk @@ -151046,9 +151166,9 @@ bLe bLe bLe dZM -aMK +ddk rAS -dDe +mWC uWW aOt wcr @@ -151062,169 +151182,169 @@ jFJ jFJ jFJ aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (59,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -151248,7 +151368,7 @@ byh nHo bxH aFg -rFF +jWn ayR gKX ayR @@ -151265,9 +151385,9 @@ bNJ bNJ bNJ dIY -eFk -aBH -mFQ +qiO +hUQ +aou wHT jjB cyW @@ -151286,7 +151406,7 @@ jvf tPE tPE tPE -fpg +cUL nXn fUy hdH @@ -151319,169 +151439,169 @@ jFJ ruW jFJ aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (60,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -151491,7 +151611,7 @@ aac xSX xSX xSX -itM +dJV iiN avz fKz @@ -151522,21 +151642,21 @@ dfW fWi nTm jfn -jns -htx -pvm +haf +msx +nWX wHT alB xSr umf qjW -kHX +dCk iDR -swc +kcb wHT omH jKZ -ghY +cOE mHX jtg jvf @@ -151548,21 +151668,21 @@ nXn lUf hdH dCD -dCD +gjL iOi kkP iwY mcX tpR sUs -yaS +rmi uey iuM vbV dFc prt rAS -vTo +rna gwY iRC dqu @@ -151573,171 +151693,171 @@ cVF cxA cxA dQX -jKN +aEL jFJ aaa aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (61,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -151755,7 +151875,7 @@ xSX xDQ iko gvQ -lcn +iGJ gki nca qkr @@ -151776,9 +151896,9 @@ bsP fQV xMK xMK -mAX +xQw nTm -iLf +gKF aBV utk aBV @@ -151789,7 +151909,7 @@ lRr uVb iaT gQz -tLA +nAP sNr jmR oxf @@ -151798,11 +151918,11 @@ qIN gFx jvf tkv -djL +lGp yiM -hMo +tRn nXn -qJy +lUf cSr cSr cSr @@ -151822,10 +151942,10 @@ rAS xzI uYa mHZ -isg +ppK rAS rAS -tub +pKr bLA cxA jDN @@ -151837,164 +151957,164 @@ aaa aac oKl oKl -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (62,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -152005,7 +152125,7 @@ aac xSX xSX xSX -xbp +rdo avq avB jPx @@ -152037,30 +152157,30 @@ ief xzA ief aBV -cCR +aBV aBV wHT -lPd -aCO +fEf +yhe vBn -eDZ +tRV sik iOm ofA lcS vhG jSd -mof +nXI aGh cKd jvf rRK tel yiM -nJV +brf cXc lVz -hSM +lmn vnk vnk vnk @@ -152071,7 +152191,7 @@ eUC eUC eUC eUC -oUY +eUC eUC cFF laT @@ -152091,166 +152211,166 @@ jFJ jFJ jFJ aaa -jhd -jhd +pMW +pMW oKl -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (63,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -152268,10 +152388,10 @@ avC eRi xDQ rOh -qmd +hRC gki gki -lCO +nca nca rQi iNc @@ -152314,7 +152434,7 @@ jvf ook mGQ yiM -fpg +mjx heY ddh mQp @@ -152333,181 +152453,181 @@ wuE mzD lUf pUw -aNP -ogp +aNQ +lKc kzT -ogp -aNP +lKc +aNQ jFJ daQ oVN -aOP +hGD lue tEw -csR +stJ lje jFJ -jhd -jhd -jhd +pMW +pMW +pMW oKl -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (64,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -152537,7 +152657,7 @@ qKd jGL jed oIz -wNy +gnW wiI mcD pDy @@ -152553,7 +152673,7 @@ nSa iTQ idG idG -eON +idG nKm idG gxm @@ -152596,175 +152716,175 @@ kzT aOC aNQ aPf -aPB +cDw oVN jFJ jFJ jFJ aHp -kNC +qgS jFJ avE avE avE avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (65,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -152799,10 +152919,10 @@ dSo rMS psv hTn -mOu +miR maN kPo -maN +plW maN pCg oRl @@ -152845,7 +152965,7 @@ tDT tDT gTJ mzD -qJy +anY pUw aNR pUw @@ -152857,171 +152977,171 @@ pUw iTr pUw rYd -qCZ +vne qCZ wTy jFJ -jhd -jhd -jhd +pMW +pMW +pMW oKl -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (66,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -153034,7 +153154,7 @@ aac aac uov rTm -cxV +iNZ iiN wCo xSX @@ -153053,7 +153173,7 @@ rxE jyR lMR ktX -bdQ +pqd kdV acr qyZ @@ -153062,12 +153182,12 @@ qyZ qyZ qyZ qyZ -lvo +ybD qVN vpa maN dFJ -maN +plW maN maN maN @@ -153075,13 +153195,13 @@ pgm kHS jdZ gwb -oEF +ppU cFs nzh pLL dIB cFs -mJs +jwX dEM wDB qqi @@ -153105,7 +153225,7 @@ mzD oxE pUw wts -kUo +pqf kUo kUo cAp @@ -153122,163 +153242,163 @@ avE avE avE avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (67,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -153292,10 +153412,10 @@ dEv dEv dEv dEv -aOR -fPh +kIU +fWD xDQ -dob +grb lUr awp dob @@ -153305,7 +153425,7 @@ nca nca nca neC -jNw +dER yji ehd awp @@ -153315,9 +153435,9 @@ qyZ qyZ qyZ uVo -xAQ +cGN uVo -uag +eVC qyZ htr sWQ @@ -153331,7 +153451,7 @@ aQO aQO aQO qhM -opB +nYq yiM cFs lNP @@ -153339,19 +153459,19 @@ tCo vVY cFs yiM -tyv +nEu rLP mlj yjQ rEu bBI -fsB +bBI iWj bBI bBI bBI bBI -elG +oCj hlJ mwd tda @@ -153369,173 +153489,173 @@ tfW xFh ivt kUo -eAz +vkA pUw jFJ jFJ jFJ jFJ -jhd -jhd -jhd +pMW +pMW +pMW oKl -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (68,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -153556,7 +153676,7 @@ iUh mbX iUh iUh -iEm +tAo tfp nca nca @@ -153565,12 +153685,12 @@ neC niZ yeG oZA -uLC +wky qyZ hiq pWW oho -wlK +wKf uVo iGM uVo @@ -153582,20 +153702,20 @@ aQO gPA hbV dbJ -iWm +xyn eSH -byc -dyH +wJy +xgZ lPY esd kiU -ehV +kTz cFs lNP lzu vVY cFs -aQm +mCu pow uHT fSr @@ -153618,7 +153738,7 @@ mYw bgN aMN pUw -cpN +nts uuZ jLf fXB @@ -153633,166 +153753,166 @@ ikL tSp buB buB -jhd -jhd +pMW +pMW oKl -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (69,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aaa @@ -153801,17 +153921,17 @@ aaa aaa aaa dEv -qEM +eJG trm -epT +anj hgn mKP -aFA +sqc dEv avP rZA hwv -bjv +udq awz rOh tfp @@ -153831,11 +153951,11 @@ bvq njq xIp xIp -uag +eVC qyZ -bsR +jsT tJE -seO +uTs sKC riZ rHb @@ -153856,13 +153976,13 @@ aQm pow pyf fSr -aBG +pMS ejD gzY fSr qOF btC -kKp +okd wri gHC qOF @@ -153884,172 +154004,172 @@ pxo ivt gHe gHe -hYh +gHe vCZ -sCv +lqS skw kkg buB -jhd -jhd +pMW +pMW oKl oKl -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (70,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aaa @@ -154058,14 +154178,14 @@ dEv dEv dEv dEv -olh +lyH exx ouM iub hgn dQd dEv -avQ +dzY ouJ hhN wOU @@ -154087,10 +154207,10 @@ lmG hHI gIG bxN -cgN +iyQ qyZ qyZ -kuf +xbw vTn oTl cOl @@ -154131,7 +154251,7 @@ tDT tHt jAL pUw -hvC +lEr ssT aOe jLf @@ -154143,170 +154263,170 @@ dVo eGl aUC vCZ -eRU +kbW jwf kkg buB buB -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (71,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aaa @@ -154316,9 +154436,9 @@ gxf gxf gxf dst -xYC -imB -eIR +nvI +hMq +wpn iub hgn lAC @@ -154348,7 +154468,7 @@ njq kVV qjZ nbh -qNz +sUX pdE cNc mEK @@ -154408,174 +154528,174 @@ buB buB buB buB -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (72,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aaa aaa aaa dEv pvi -yjm +kjF yjm hPs -iAU +juT lAC -oMM +pbo aeX yjm oby @@ -154587,15 +154707,15 @@ gNK rOh gAO odr -rMJ +csc odr pBZ lSo lSo azy -vqE +tFK qyZ -aPP +vxv hHI nfR hHI @@ -154629,7 +154749,7 @@ cbe aEa gbl lZz -kGJ +jMe fSr rVp qOF @@ -154638,11 +154758,11 @@ xmR qOF aKL nQN -vSh +nwz fsC fsC fsC -aMm +kqK srN ckb jkt @@ -154665,174 +154785,174 @@ aRE aRI aRL lnh -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (73,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa aaa aaa dEv -sab +ggE uPZ eSj dst -xYC -caF -avf +nvI +kwq +chr avg hgn lAC @@ -154922,162 +155042,162 @@ buB buB buB buB -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (74,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa aaa @@ -155091,9 +155211,9 @@ oBY htq avg hgn -mzH +kkV dEv -jPc +mKq ahc pLO nzz @@ -155176,165 +155296,165 @@ wiU kkg buB buB -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (75,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa aaa @@ -155345,15 +155465,15 @@ aaa dEv jlQ sne -lUo +ubk hgn -uVA +dbo kkV dEv -bwg -fXP +nJd +qjI hzk -wsw +pfj awz rOh tfp @@ -155373,13 +155493,13 @@ cda pRB ayL ayL -uag +eVC qyZ -aAB +gWd azo -aBo +xHB qvK -svb +obW uvu aCC ukE @@ -155400,11 +155520,11 @@ pyf fSr jhs yii -tYQ +cdr fSr qOF aSe -sHI +mXY woJ tdR qOF @@ -155426,172 +155546,172 @@ sxG mTh kUo kUo -hce +kUo vCZ -cfY +oOT vMJ kkg buB -jhd -jhd -jhd +pMW +pMW +pMW sdb sdb sdb -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW kFx kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (76,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa aaa @@ -155601,7 +155721,7 @@ rmB rmB dEv dEv -noG +irf mcU eka dEv @@ -155612,7 +155732,7 @@ iUh hEK iUh iUh -dHn +aFV tfp nca nca @@ -155621,12 +155741,12 @@ neC iBO blo fxK -jNR +lpg qyZ cFH xcH oho -ldz +bPp uVo mDY uVo @@ -155635,23 +155755,23 @@ qyZ xLi meO aQO -hSi +rup wzm rAh nug eUy -fnl -alh +mgq +nhV lPY gBN kiU -aQm +nlS cFs lNP lzu vVY cFs -auy +cPI pow kll fSr @@ -155674,7 +155794,7 @@ gWo tXY aMO pUw -aNT +jpB jba mEs jba @@ -155689,171 +155809,171 @@ vua wMD buB buB -jhd -jhd -jhd +pMW +pMW +pMW sdb qEH sdb -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (77,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +oMP aaa aaa rmB -ahs +hlb dFI wwc rmB @@ -155863,8 +155983,8 @@ ukw pyF dEv tJY -wFS -mTa +rWT +gYd isV mtd awu @@ -155875,7 +155995,7 @@ nca nca nca neC -uXt +rco yji qAB awp @@ -155885,9 +156005,9 @@ qyZ qyZ qyZ uVo -vMZ +dEU uVo -uag +eVC qyZ tfX htr @@ -155896,12 +156016,12 @@ aQO aQO aQO aQO -aQO +qiW aQO aQO aQO qhM -xDS +nKo yiM cFs lNP @@ -155909,19 +156029,19 @@ lzu vVY cFs yiM -rsO +qCJ vNF prs gtQ uKr uZs -izV +uZs ica uZs uZs uZs qdG -voN +vEv feZ llm xMS @@ -155939,7 +156059,7 @@ ubH jIA mTh ieH -kUo +bKg pUw vCZ wAA @@ -155958,153 +156078,153 @@ avE avE avE kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (78,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa aaa @@ -156118,7 +156238,7 @@ auP qxT jkQ tod -hTV +ruy cSq fZe fZe @@ -156137,7 +156257,7 @@ sHw kil axp rUd -utt +njR joB lTV qyZ @@ -156146,12 +156266,12 @@ qyZ qyZ qyZ qyZ -vaj +hgG aBY aBq idG mzs -idG +eON idG idG idG @@ -156159,13 +156279,13 @@ juw sKZ hja kGF -tTo +tJe cFs lNP lzu vVY cFs -eDH +nBo jXd oDj qqi @@ -156189,7 +156309,7 @@ uEE oxE pUw aNV -lyW +frB kUo kUo tFg @@ -156202,175 +156322,175 @@ wfb wfb wfb vCZ -jhd -jhd +pMW +pMW sdb -jhd -jhd +pMW +pMW pik -jhd -jhd +pMW +pMW sdb -jhd -jhd -jhd +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (79,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa aaa aaa rmB -slo +aqr kPf aUa -nlV +pUS mAT voA nKj @@ -156397,10 +156517,10 @@ dSo rMS bPV ubd -rBK +erx idG ayM -idG +eON azN dbY mSf @@ -156419,7 +156539,7 @@ dOb aFm jva qWY -ovK +syI jEc jva bJu @@ -156443,7 +156563,7 @@ tDT tDT gTJ uEE -qJy +anY apC apC apC @@ -156456,11 +156576,11 @@ aqg apC vkd wfb -kSE +wfb wfb vCZ -jhd -jhd +pMW +pMW sdb esT tMW @@ -156468,163 +156588,163 @@ pIS tMW esT sdb -jhd -jhd -jhd +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (80,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa aaa aaa rmB -wAm +nPZ wHI wHI bvl @@ -156649,7 +156769,7 @@ pSG aBN sDO jFh -xng +msW pLg nSV aPk @@ -156665,7 +156785,7 @@ dFJ aBr trZ myc -jtk +nsn nsn nsn hPM @@ -156716,165 +156836,165 @@ vCZ vCZ vCZ vCZ -jhd -jhd +pMW +pMW sdb -jhd -jhd +pMW +pMW pik -jhd -jhd +pMW +pMW sdb -jhd -jhd -jhd +pMW +pMW +pMW kFx kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (81,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW meb -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa aaa @@ -156884,9 +157004,9 @@ rmB auH scC scC -iSo +iPd mAT -auW +lvH uYd avk fBk @@ -156894,7 +157014,7 @@ wbH bYA kyF kMI -eew +bFo iZb gki ylw @@ -156997,141 +157117,141 @@ kFx kFx kFx kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (82,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa aaa @@ -157176,17 +157296,17 @@ ltw xEo xEo xEo -jEX +qBA irG mcg xEo eCp ihu pUJ -vPD +udY yiM ojT -cOs +drW yiM jcr uSL @@ -157194,13 +157314,13 @@ gfP mtQ jcr yiM -vcJ +toT ojT yiM sjN heD nnQ -rgm +fke uMQ uMQ uMQ @@ -157211,7 +157331,7 @@ rXO uMQ uMQ uMQ -amW +lEq uMQ kGo aMQ @@ -157230,28 +157350,28 @@ aaa aaa aaa aac -jhd -jhd +pMW +pMW sdb -jhd -jhd +pMW +pMW cyq -jhd -jhd +pMW +pMW sdb -jhd -jhd -jhd +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE kFx kFx @@ -157262,133 +157382,133 @@ kFx kFx kFx kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (83,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa aaa @@ -157412,8 +157532,8 @@ gRO ppr gki cGg -nRo -fJf +hhO +opT gQk txJ tFJ @@ -157425,9 +157545,9 @@ abM abM tFJ nwv -blS +cSh ltw -odf +pbx pyA ltw tqS @@ -157488,164 +157608,164 @@ aaa aaa aac aac -jhd +pMW sdb tMW tMW -uSi +nvf mAG mAG sdb -jhd -jhd -jhd +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (84,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa aaa @@ -157663,7 +157783,7 @@ avn fAg oUx wbH -uSU +doF jKq jKq jKq @@ -157760,149 +157880,149 @@ sdb sdb sdb esT -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (85,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa aaa @@ -157923,7 +158043,7 @@ xwz lDM jKq cAt -awx +pTr bio crS jKq @@ -157939,24 +158059,24 @@ aaa aaa ltw bCu -evh +nZY ltw -dIa -gXu +qCh +oTu ltw -liH +qJf nmf mpX aBt crE -mNN +tEl xEo -cRT +vTE kyq pIl dUl yiM -gTC +iYd ifS yiM afy @@ -157966,7 +158086,7 @@ afX afy yiM aEP -aEP +qSQ yiM cFs cFs @@ -158013,9 +158133,9 @@ aST mAG mAG mAG -jhd +pMW esT -jhd +pMW tMW sdb sdb @@ -158024,158 +158144,158 @@ sdb sdb sdb esT -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (86,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa aaa aaa tag -oQr +jwz mJw bcq idF dYe auR bLr -bwk +mld nPw lMQ -tfk +iCF uqC pCU jKq @@ -158241,7 +158361,7 @@ ndb ndb fsC lpu -cvI +axC hbg apC abM @@ -158270,16 +158390,16 @@ xCe xCe xCe mAG -jhd +pMW tMW -jhd +pMW tMW -jhd -jhd +pMW +pMW tMW -jhd +pMW esT -jhd +pMW mAG sdb sdb @@ -158293,131 +158413,131 @@ avE avE avE kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (87,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa aaa @@ -158426,10 +158546,10 @@ auG idF idF idF -nqM +gOA tag tFJ -mMD +xeE tFJ nle uIt @@ -158520,166 +158640,166 @@ fxW jQm aST srF -wEp +xTA qZq qZq mnp -iFN +vwR feN bME vKe kXk oOJ uXM -jhd -jhd +pMW +pMW tMW -jhd +pMW mAG -jhd +pMW mAG -jhd -jhd +pMW +pMW tMW -jhd +pMW esT -jhd +pMW tMW -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (88,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa tag -buQ +kIz aJk aJk aJk @@ -158688,8 +158808,8 @@ tag abM abM tFJ -uRA -nVx +kyN +qnr tyx qnr jKq @@ -158700,7 +158820,7 @@ gWD iRZ qSE vOB -vwZ +tsu tFJ abM abM @@ -158720,7 +158840,7 @@ xEo xEo nFZ jXU -npH +hdT xEo aaS aaS @@ -158729,13 +158849,13 @@ aaS afz afA afz -afH +ufe afy afP lzu afX afy -afH +ufe afz age abM @@ -158784,9 +158904,9 @@ xCe xCe xCe tMW -jhd +pMW tMW -jhd +pMW opb oOJ oOJ @@ -158795,144 +158915,144 @@ ixH sOg oOJ uXM -jhd -jhd +pMW +pMW tMW -jhd +pMW tMW -jhd +pMW tMW -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (89,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW meb -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa tag @@ -158948,7 +159068,7 @@ tFJ voL mNy iyC -tty +dGn jKq wqu xrq @@ -159041,16 +159161,16 @@ aST tMW tMW tMW -jhd +pMW esT -jhd +pMW mAG -jhd -jhd +pMW +pMW tMW -jhd +pMW tMW -jhd +pMW opb oOJ oOJ @@ -159061,135 +159181,135 @@ gnp bWi mAG fnI -jhd -jhd +pMW +pMW kFx dAn -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (90,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa aaa @@ -159305,149 +159425,149 @@ esT sdb sdb tMW -jhd +pMW esT -jhd +pMW tMW -jhd -jhd +pMW +pMW tMW -jhd +pMW mAG -jhd +pMW mAG -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (91,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa aaa @@ -159551,16 +159671,16 @@ aac tMW tMW tMW -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW sdb -jhd -jhd +pMW +pMW esT sdb sdb @@ -159569,143 +159689,143 @@ esT sdb sdb tMW -jhd +pMW esT -jhd +pMW mAG -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (92,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa aaa @@ -159725,7 +159845,7 @@ omm ihb jfH cTM -cWV +jlX qEl qiV uxM @@ -159806,25 +159926,25 @@ aac aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW sdb -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW sdb -jhd -jhd +pMW +pMW esT sdb sdb @@ -159835,134 +159955,134 @@ avE avE avE kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aaa aaa aaa gfX aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (93,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aaa aaa @@ -160066,160 +160186,160 @@ aac aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW sdb -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW sdb -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (94,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -160327,156 +160447,156 @@ aac aac aac aac -jhd -jhd +pMW +pMW sdb -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW sdb -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (95,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -160528,13 +160648,13 @@ afv afz afC vFt -afK +oNG afy afP jWQ afX afy -agc +lgK yiM agg afz @@ -160587,153 +160707,153 @@ aac aac aac aai -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW sdb wIP -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW avE -jhd +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (96,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -160750,7 +160870,7 @@ aaa abM abM omm -lQE +oKe grz iwg hmA @@ -160847,9 +160967,9 @@ aac aac aac aac -jhd -jhd -jhd +pMW +pMW +pMW sdb kFx kFx @@ -160860,138 +160980,138 @@ kFx kFx kFx kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (97,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -161108,148 +161228,148 @@ aac aac aac sdb -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (98,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -161267,10 +161387,10 @@ omm oXb oXb oXb -hzV +rNk drh uMg -etQ +rPd omm abM abM @@ -161290,7 +161410,7 @@ acm abW abW abW -afr +afg acm afg abW @@ -161365,148 +161485,148 @@ aac aac aac aai -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (99,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -161619,151 +161739,151 @@ aac aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (100,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -161778,7 +161898,7 @@ aaa abM abM omm -lQE +oKe grz qSg hmA @@ -161875,153 +161995,153 @@ aaa aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (101,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -162132,154 +162252,154 @@ aaa aaa aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (102,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -162327,13 +162447,13 @@ afz afz afC izU -afK +oNG afy afP wJq afX afy -agc +lgK qas agg afz @@ -162389,154 +162509,154 @@ aaa aaa aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (103,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -162646,154 +162766,154 @@ aaa aaa aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (104,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -162903,154 +163023,154 @@ aaa aaa aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (105,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -163161,153 +163281,153 @@ aaa aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (106,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -163323,7 +163443,7 @@ abM abM omm dtA -nLi +dtA dtA omm abM @@ -163418,153 +163538,153 @@ aaa aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (107,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -163637,8 +163757,8 @@ kRL dJG xMU elM -mkf -qif +cTw +eyg viZ apC abM @@ -163675,152 +163795,152 @@ afc afc afc ahw -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (108,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -163932,154 +164052,154 @@ afd afd afd ahx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (109,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -164126,13 +164246,13 @@ afv afz afA afz -afO +ydd afy afP wJq afX afy -afO +ydd afz age afz @@ -164142,7 +164262,7 @@ aaa xBk xBk kul -piM +rYw bUU mPr vcv @@ -164150,9 +164270,9 @@ odH kRL dJG qcj -mnJ +lDl xUb -mnJ +wDi qif apC abM @@ -164189,154 +164309,154 @@ afe afe afe ahz -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (110,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -164397,7 +164517,7 @@ aaa aaa aaa xBk -sBa +uCf sKO sKO mLu @@ -164443,157 +164563,157 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW meb -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (111,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -164656,11 +164776,11 @@ aaa xBk xBk lHW -vLY +kGi kiC mrf aKM -xUV +qUS xRx oJx hoE @@ -164700,158 +164820,158 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (112,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -164895,7 +165015,7 @@ izU izU izU izU -jWD +nOj gGI izU afy @@ -164905,7 +165025,7 @@ afX afy izU ghg -ghg +xlZ jyH jyH jyH @@ -164917,13 +165037,13 @@ jyH jyH wyR aKM -hgX +fMZ xRx bWU pVk -gFV +try xRx -rfk +bHf bVt cpl apC @@ -164957,158 +165077,158 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (113,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -165164,25 +165284,25 @@ izU aGM izU jyH -iLD -eHN +lCA +jRS csg -mma +dVj wrT -uSV +xqO suG bRU ryy aKM jaQ xRx -wBw +vGc vly mXd xRx neE cNs -vaa +kIh apC abM mBq @@ -165214,158 +165334,158 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (114,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -165398,10 +165518,10 @@ abM abM omm omm -gwe +vzp vhA jLI -lAz +dyD bhs bhs izU @@ -165443,7 +165563,7 @@ aNr apC abM mBq -aOE +hHn ojQ iTS eUJ @@ -165471,158 +165591,158 @@ aac aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (115,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -165654,12 +165774,12 @@ abM abM abM omm -diN +dds jEL hht nTz rQl -diN +qez bhs izU eSz @@ -165667,7 +165787,7 @@ eSz eSz izU wYw -mUP +lTg beP rFW mvN @@ -165675,7 +165795,7 @@ iIy sUC rFW cRc -rko +jhE wYw jyH aQi @@ -165690,13 +165810,13 @@ glU aKM oDd xRx -bBy +lWu tTN net xRx -oYs +siE hsh -uER +gnM apC abM mBq @@ -165728,159 +165848,159 @@ aac aac aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (116,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -165938,10 +166058,10 @@ jyH wmy iYv kFf -aTF +ujv mOM -dnD -vJF +ssF +kTS jyH dTZ dVs @@ -165957,7 +166077,7 @@ lBQ apC kZC mBq -dPS +dsw aOJ aPm wWa @@ -165985,159 +166105,159 @@ aac aac aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (117,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -166206,7 +166326,7 @@ dWg ktw aLx uwb -fQK +cwr gNk mIZ hFJ @@ -166217,9 +166337,9 @@ wdj aOF aOF wdj -dab +wao cHU -bsE +uVB wdj oGJ oGJ @@ -166243,160 +166363,160 @@ aaE aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (118,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -166433,7 +166553,7 @@ vyH bhs bhs izU -eFo +sjk rOu rOu rOu @@ -166452,11 +166572,11 @@ mpA xXL cYl sjE -sjE +jAc kkd qNI mrC -yaA +rCZ tOw kGa djz @@ -166474,8 +166594,8 @@ aOv qfg qOY iae -qeL -sYh +qsU +xsq nXK wdj oGJ @@ -166500,161 +166620,161 @@ aac aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (119,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -166696,13 +166816,13 @@ aHA aHA aEl wQW -tyc +cFS eSz tCl wJq wvE eSz -ngO +kbq ooV vcS rOu @@ -166712,7 +166832,7 @@ eSz eSz eSz qNI -hvF +dyb pwd jVw kpd @@ -166722,7 +166842,7 @@ qdK qdK jpC qdK -cWx +qdK dqW aNs eCu @@ -166757,161 +166877,161 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (120,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -166933,7 +167053,7 @@ mgZ fqU uGa nrV -axX +oDP eSx fLE paT @@ -166952,7 +167072,7 @@ izU izU izU tAL -ilZ +sOD izU irw fNs @@ -166960,7 +167080,7 @@ sXj hCt nxf izU -daM +uCl lRC ofT ofT @@ -166972,7 +167092,7 @@ qNI qaX eIb eHr -yjU +xHP jtr jtr jtr @@ -166983,10 +167103,10 @@ jtr jtr jtr kPT -sYW +vLa uGL fza -cge +hNR qNI aPI lLB @@ -167014,161 +167134,161 @@ qgt oGJ oGJ aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (121,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -167210,13 +167330,13 @@ vyH pSr aEk mYI -tgE -nQc +fhc +rrg ujf juu aEq -kYp -ykP +tdv +qrl lej ocU wyd @@ -167231,13 +167351,13 @@ tDP dRM jtr jtr -ecn +mOj kWR dZX lxI xNq jts -nrR +bLj jtr pCV jtr @@ -167248,12 +167368,12 @@ aPo aPJ pFX jYS -fOv +bjS ygi foF jYS qgt -nXp +krk jQJ jQJ jQJ @@ -167271,161 +167391,161 @@ oGJ oGJ oGJ aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (122,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -167441,7 +167561,7 @@ aaa aaa aaa eSx -cFl +jDV sdK uzM jnY @@ -167453,12 +167573,12 @@ lZm mHc uqA aTw -fQB +jgn crT crT crT crT -mMG +oVc mzb wev mHc @@ -167477,7 +167597,7 @@ ykP lej iVr lDt -kLV +kiN xJA gHh cen @@ -167495,7 +167615,7 @@ pIk oIU aMG xdx -qlk +cEy uVW cEy jtr @@ -167528,161 +167648,161 @@ oGJ oGJ qgt aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (123,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -167709,14 +167829,14 @@ fhg mJG mHc hkB -fwd +rom sDo -tSc +kuB tSc nKz nKz sDo -vsB +pVI bXo wWH wWH @@ -167742,9 +167862,9 @@ enB qZa bbD uck -oJu +gBz jtr -aLc +esA oIU aLz dpE @@ -167762,7 +167882,7 @@ jYS jYS jYS jYS -aQN +hdM fzs cjT mbm @@ -167785,160 +167905,160 @@ oGJ oGJ oGJ aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (124,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -167960,7 +168080,7 @@ vuD guL fKn guL -vbb +bYW mUL rBy vJt @@ -167982,11 +168102,11 @@ aEl rOu umT ykP -nKp +tUk ffU gIm jUw -rZD +dtY ykP lej jeW @@ -168004,7 +168124,7 @@ xSZ yfw oIU aLA -mhY +gWt wbT dvQ uZQ @@ -168016,7 +168136,7 @@ xSZ tLE aOQ jYS -aPL +kkr gGx jYS kZI @@ -168042,160 +168162,160 @@ oGJ oGJ oGJ aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (125,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aaa -aaa -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aaa +aaa +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -168226,7 +168346,7 @@ wwK crT nKz tOB -aKB +qid vnI jPK nKz @@ -168239,11 +168359,11 @@ iNr rOu wCl fld -xVH +tsf xXU oZC ycE -aMY +jSX jEO jHR dWi @@ -168252,7 +168372,7 @@ sSt jEK eoE xck -djJ +ols wyd enF aHP @@ -168299,160 +168419,160 @@ qaO oGJ oGJ aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (126,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aaa -aaa -aaa -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aaa +aaa +aaa +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -168481,7 +168601,7 @@ vJt mHc wwK crT -nKz +kcu nBy ahq bKF @@ -168496,11 +168616,11 @@ aEk rOu umT ykP -gxA +tUk hio rPq aEq -sgt +dtY ykP lej pxC @@ -168518,7 +168638,7 @@ xSZ aLd oIU aLA -hpp +cVk krE bvK eGn @@ -168531,7 +168651,7 @@ tLE aOS jYS cPx -aQj +dCG jYS pXL wsr @@ -168556,85 +168676,85 @@ oGJ oGJ qgt aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (127,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -168646,69 +168766,69 @@ aaa aaa aaa aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -168737,14 +168857,14 @@ ejK lgD wWH hjx -gju +not sDo lFQ kki nBy -kHu +kbz sDo -qVJ +fJH xMZ soe soe @@ -168770,9 +168890,9 @@ rjx nhc eYP tIX -vrj +iOS jtr -gsg +vWR oIU aLC dZX @@ -168790,7 +168910,7 @@ jYS jYS jYS jYS -noK +qmc sau aIT tZf @@ -168813,159 +168933,159 @@ oGJ oGJ oGJ aaa -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW meb -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (128,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aaa -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aaa +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -168983,7 +169103,7 @@ aaa aaa aaa eSx -lMn +qXa kWH uzM uuB @@ -168995,12 +169115,12 @@ ngC mHc jbx xLh -sBz +uyq crT crT xpC ivn -tiV +sct ioz tlY ccT @@ -169017,9 +169137,9 @@ gUF rlO ykP lej -fxs -lDt -mJc +iOy +wyd +qtc kin juV uAx @@ -169037,17 +169157,17 @@ bsW bAT brx uem -kFJ +dqe dlN dqe jtr dSZ aOO adM -obH +qcU aQk jYS -nXd +kda lVC xiP jYS @@ -169070,159 +169190,159 @@ oGJ oGJ oGJ aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (129,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -169266,16 +169386,16 @@ vyH moU aEl mpa -ykP -oor +aiH +jUi vtP juu ndX -uGM -qwI +ray +dhI lej fxs -cZo +wyd wyd rks rks @@ -169287,13 +169407,13 @@ gMT uHB jtr jtr -iUK -lcl +jKi +xSz qDF uwk oXz gNE -eRn +rdJ jtr jtr jtr @@ -169302,14 +169422,14 @@ vdX wGF isM gUH -pnz +cVw jYS -qrR +ewt tMg fkR jYS qgt -gmP +tvP jQJ jQJ jQJ @@ -169327,158 +169447,158 @@ oGJ oGJ aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (130,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -169503,7 +169623,7 @@ whs fEG cON mkl -pnu +fxS eSx ayB mHc @@ -169522,7 +169642,7 @@ izU izU izU aEm -oRs +gnK izU gjM fNs @@ -169530,9 +169650,9 @@ poE hCt cNT izU -vvz +eQL ycx -xzq +vrO fnb eSz eSz @@ -169542,10 +169662,10 @@ qIf lEL qPd iTt -itk -jtr +rjs jtr jtr +rhd xSZ xqB xSZ @@ -169553,12 +169673,12 @@ jtr jtr jtr qIM -lpF +cxt aka fxy -aOU +wEu adM -jQw +lVJ kZM jYS jYS @@ -169583,159 +169703,159 @@ oGJ oGJ qgt aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (131,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -169780,13 +169900,13 @@ eSz eSz aEn gfk -pvJ +bbu eSz tCl wJq wvE eSz -gcq +dTx sIM uZb rOu @@ -169795,7 +169915,7 @@ eSz eSz eSz qNI -ufp +mad jVw qPd jVw @@ -169806,7 +169926,7 @@ gNk gNk mFV gNk -eqq +gNk tgU aNv eSv @@ -169818,7 +169938,7 @@ gVO aaj fsv aQB -jMM +qeS adM oGJ oGJ @@ -169840,159 +169960,159 @@ oGJ oGJ aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (132,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aaa aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -170031,7 +170151,7 @@ nMe voS bHq izU -nUU +nTo eSz eSz eSz @@ -170073,7 +170193,7 @@ qdK xom gVO vXT -sbp +cyL nen vPo adM @@ -170096,160 +170216,160 @@ oGJ oGJ oGJ aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (133,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -170278,7 +170398,7 @@ eDV vZc iZn dME -bXQ +evW sRA hrF wLd @@ -170286,7 +170406,7 @@ vGQ sRA hrF wLd -cFe +bHq izU scZ eSz @@ -170318,7 +170438,7 @@ iug xuq knO caR -bhA +gov ojj xav qdK @@ -170353,160 +170473,160 @@ oGJ oGJ oGJ aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (134,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -170564,8 +170684,8 @@ izU wza izU fLb -sij -ceC +fIB +exT cuP iFP qPd @@ -170584,10 +170704,10 @@ ugt ugt ugt ugt -oSE +kjf cqn ugt -oGv +lul iMd ugt oGJ @@ -170610,161 +170730,161 @@ oGJ oGJ qgt aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (135,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -170788,11 +170908,11 @@ aaa abM abM lZW -gQE +vQO fyF otx dME -rSY +dyf fQk oEI oEI @@ -170800,14 +170920,14 @@ pbV oEI oEI fQk -knp +oSg lZW aaa aaa aaa abE wYw -mUP +lTg tVf wVC afQ @@ -170815,7 +170935,7 @@ geR kwF wVC qhP -bcl +ioA wYw gnj wza @@ -170829,17 +170949,17 @@ qPd hrS bFq jzt -gLC +sZb dgi -euC -hXC +uwt +uYe dUm ugt jNz hOu uNN ugt -wRq +qGG ugt cBw dbu @@ -170867,161 +170987,161 @@ oGJ oGJ oGJ aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (136,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -171045,7 +171165,7 @@ aaa abM abM lZW -joJ +odK igA lSv dME @@ -171077,11 +171197,11 @@ seG izU wza izU -efV +wGy sHQ jzK cuP -tqu +wVV dgA sun bFq @@ -171094,7 +171214,7 @@ upx ugt wTl wLl -afZ +lQT ugt beZ ugt @@ -171124,161 +171244,161 @@ oGJ oGJ oGJ aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (137,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -171314,7 +171434,7 @@ jza axU axU clc -rdR +pam lZW aaa aaa @@ -171347,7 +171467,7 @@ fEp vab mEu uOl -ptp +eIA ugt ugt fsN @@ -171357,7 +171477,7 @@ cdi ugt qjF rkd -ewk +lrA ycI fwB ugt @@ -171381,163 +171501,163 @@ oGJ oGJ qgt aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (138,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW uRv uRv uRv -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW aac aac aaa @@ -171563,7 +171683,7 @@ atr fdW euS dME -kgv +aVt hrm bGJ dck @@ -171571,13 +171691,13 @@ uDB lse bGJ hrm -mRe +iSt lZW aaa aaa aaa abE -jea +kMs qtS izU afy @@ -171587,7 +171707,7 @@ afX afy izU ghg -ghg +xlZ izU wza izU @@ -171595,7 +171715,7 @@ xCc wGU xCc oIa -vto +jYb cBP ybc hYX @@ -171608,8 +171728,8 @@ msF ugt aNa gCI -fNb -aOk +tzQ +bzt aOz aOG iKg @@ -171638,163 +171758,163 @@ oGJ oGJ oGJ aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (139,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW uRv csA uRv -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -171822,11 +171942,11 @@ vYO dME dME eOL -xIO +nys sdx -dpU +cCr tWb -qLG +tLD smt lZW lZW @@ -171848,24 +171968,24 @@ aHl izU wza izU -cyh +uip aIH jXH oIa -qbP +jps ifN rgR -hYX +cia bFq qgd gnI -kgt +nUu mTe kcZ ugt aNb kXz -hRF +bWk svF xrG kow @@ -171895,148 +172015,148 @@ oGJ oGJ oGJ aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (140,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx avE avE @@ -172045,7 +172165,7 @@ avE aTY iCA fZL -rkA +bKy fZL fZL aTY @@ -172105,7 +172225,7 @@ mhE izU wza izU -aIr +ihl aIJ aIY oIa @@ -172152,164 +172272,164 @@ oGJ oGJ qgt aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (141,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW uRv ozz uRv -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW aac aac aaa @@ -172350,13 +172470,13 @@ afv afz afA afz -afH +ufe afy afP wJq afX afy -afH +ufe afz age aaS @@ -172379,7 +172499,7 @@ aaa ugt kOL vrJ -nNE +aPS tMb ugt ugt @@ -172409,164 +172529,164 @@ oGJ oGJ oGJ aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (142,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW aTY iCA cfp fZL aTY -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -172666,164 +172786,164 @@ oGJ oGJ oGJ aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (143,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW uRv ozz uRv -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -172884,7 +173004,7 @@ fuo nXh axE ugP -rYN +ddn whz haC whz @@ -172893,7 +173013,7 @@ aaa ugt bGV min -tkh +oKh rNt ugt mDp @@ -172923,153 +173043,153 @@ oGJ oGJ aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (144,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW aTY fZL fZL @@ -173078,9 +173198,9 @@ kUF iCA iCA aTY -jhd -jhd -jhd +pMW +pMW +pMW aac aac aac @@ -173155,8 +173275,8 @@ ugt ugt fpf uWO -vvA -sCO +cHn +pjP dyl cHn ugt @@ -173179,165 +173299,165 @@ oGJ qgt oGJ aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (145,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW uRv xNW uRv -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -173397,7 +173517,7 @@ oIa urO oQq yjl -dDZ +vKw cgw whz iLn @@ -173436,156 +173556,156 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (146,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW aTY fZL cfp @@ -173693,165 +173813,165 @@ aaa aap aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW meb -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (147,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx kFx -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW uRv ozz uRv -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -173950,150 +174070,150 @@ aac aac aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (148,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx avE avE @@ -174107,8 +174227,8 @@ bKy fZL fZL aTY -jhd -jhd +pMW +pMW aac aac aac @@ -174149,13 +174269,13 @@ afv afz afC qas -afK +oNG afy afP wJq afX afy -agc +lgK izU agg afz @@ -174207,165 +174327,165 @@ agX agX agX ahu -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (149,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW uRv ozz uRv -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW aac aac aaa @@ -174464,165 +174584,165 @@ aac aac aeQ ahv -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (150,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW aTY iCA upS fZL aTY -jhd -jhd -jhd +pMW +pMW +pMW aac aac aaa @@ -174721,165 +174841,165 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (151,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW uRv xNW uRv -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW aac aac aac @@ -174978,156 +175098,156 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (152,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW aTY fZL fZL @@ -175234,143 +175354,143 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (153,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx kFx kFx @@ -175380,20 +175500,20 @@ kFx kFx kFx kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW csA rQR uRv -jhd -jhd -jhd +pMW +pMW +pMW aac aac aac @@ -175491,166 +175611,166 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (154,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd +pMW +pMW avE -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW uRv kgS uRv -jhd -jhd -jhd +pMW +pMW +pMW aac aac aac @@ -175748,166 +175868,166 @@ aaa aaa aaa aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (155,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW uRv kgS uRv -jhd -jhd -jhd +pMW +pMW +pMW aac aac aac @@ -175948,13 +176068,13 @@ afv afz afC bMb -afK +oNG afy afP lMF afX afy -agc +lgK bMb agg afz @@ -176005,167 +176125,167 @@ aaa aaa aaa aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (156,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW fZL fZL -odl +tCw fZL fZL -jhd -jhd -jhd +pMW +pMW +pMW aac aac aac @@ -176262,141 +176382,141 @@ aaa aaa aaa aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (157,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx avE avE @@ -176421,8 +176541,8 @@ plk plk fZL fZL -jhd -jhd +pMW +pMW aac aac aac @@ -176519,156 +176639,156 @@ aaa aaa aaa aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (158,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW iCA -jhd -jhd +pMW +pMW aTY -jhd -jhd +pMW +pMW iCA -jhd -jhd -jhd +pMW +pMW +pMW iCA iCA iCA @@ -176678,8 +176798,8 @@ vAj plk plk fZL -jhd -jhd +pMW +pMW aac aac aac @@ -176776,143 +176896,143 @@ aaa aaa aaa aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (159,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd +pMW uRv uRv uRv @@ -176936,8 +177056,8 @@ nOd plk uAZ hNg -jhd -jhd +pMW +pMW aac aac aac @@ -177033,143 +177153,143 @@ aaa aaa aaa aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (160,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kHv kFx -jhd +pMW uRv sIx iCA @@ -177185,16 +177305,16 @@ viR viR bwT lzc -sGx +sGN cko iXe -wqC +gtU nOd plk ceQ rNO -jhd -jhd +pMW +pMW aac aac aac @@ -177290,143 +177410,143 @@ aaa aaa aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (161,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd +pMW uRv uRv uRv @@ -177450,8 +177570,8 @@ nOd plk jPo mdl -jhd -jhd +pMW +pMW aac aac aac @@ -177547,156 +177667,156 @@ aaa aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (162,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW iCA -jhd -jhd +pMW +pMW aTY -jhd -jhd +pMW +pMW fZL -jhd -jhd -jhd +pMW +pMW +pMW iCA iCA iCA @@ -177706,8 +177826,8 @@ neB plk plk fZL -jhd -jhd +pMW +pMW aac aac aac @@ -177747,13 +177867,13 @@ afv afz afA afz -afO +ydd afy afP lMF afX afy -afO +ydd afz age aaS @@ -177764,12 +177884,12 @@ uaJ cIv gyP dZu -uxh +xgO hwM dzu kcF soq -mLQ +tRu stk stk abM @@ -177786,7 +177906,7 @@ aaa aaa aaa aaa -aez +aac aac ahf aac @@ -177804,141 +177924,141 @@ aaa aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (163,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx avE avE @@ -177963,9 +178083,9 @@ plk plk fZL fZL -jhd -jhd -jhd +pMW +pMW +pMW aac aac aac @@ -178024,7 +178144,7 @@ cdB civ mAf dzu -nto +sjn iei iei iei @@ -178061,93 +178181,93 @@ aaa aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (164,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW jjP aac aac @@ -178158,71 +178278,71 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW fZL fZL -bEA +jai fZL fZL -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW aac aac aac @@ -178273,7 +178393,7 @@ aHn lVi abM soq -bvM +mKj icx wEQ gyP @@ -178283,7 +178403,7 @@ muZ dzu doK uJH -jZa +psa eQY nns soq @@ -178318,93 +178438,93 @@ aaa aaa aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (165,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW ioN aac aac @@ -178418,69 +178538,69 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW uRv kgS uRv -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -178516,7 +178636,7 @@ abM abM abM lZW -sgq +qIt mzf bMb afy @@ -178526,7 +178646,7 @@ afX afy bMb gaH -aEv +bly lVi abM soq @@ -178575,93 +178695,93 @@ aaa aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (166,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aak aac aaa @@ -178675,69 +178795,69 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW uRv kgS uRv -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -178750,10 +178870,10 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa +euR +euR +euR +euR cTU cTU cTU @@ -178787,9 +178907,9 @@ bMb lVi abM soq -hAf +gxV gFu -idO +vgD gyP fAA okn @@ -178797,7 +178917,7 @@ muZ uSP jXr uKv -aLI +vDP jSj soq soq @@ -178831,144 +178951,144 @@ aaa aaa aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (167,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx kFx kFx @@ -178980,21 +179100,21 @@ kFx kFx kFx kFx -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW uRv ncv csA -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -179007,10 +179127,10 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa +euR +wUA +xPI +ooe cTU vSI vSI @@ -179046,7 +179166,7 @@ abM soq bvM cGy -tDJ +wTi gyP aUb eeE @@ -179088,159 +179208,159 @@ aaa aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (168,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW aTY fZL fZL @@ -179263,11 +179383,11 @@ aac aaa aaa aaa -cTU -cTU -cTU -cTU -cTU +aaa +euR +esr +cfC +pcI cTU vSI vSI @@ -179283,12 +179403,12 @@ abM abM usY kiT -sNb +iYa usY usY usY rxO -aSK +jjl oGM vCl xPf @@ -179296,7 +179416,7 @@ fMM mRV vCl sig -ePx +seN rxO lVi abM @@ -179345,171 +179465,171 @@ aaa aaa aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (169,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW uRv kgS uRv -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -179520,9 +179640,9 @@ aaa aaa aaa aaa -cTU euR -qzD +euR +jnL abN cTU cTU @@ -179542,7 +179662,7 @@ usY mgh uYZ oSB -nfd +nVd vUE bMb car @@ -179602,171 +179722,171 @@ aaa aaa aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (170,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW aTY iCA cfp fZL aTY -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -179777,9 +179897,9 @@ aac aaa aaa aaa -cTU +euR plH -jTQ +wdw nfZ cTU exr @@ -179790,8 +179910,8 @@ drC kMn qza ePw -hQv -sfa +dAx +oum nAH wuC qmH @@ -179821,7 +179941,7 @@ iws dKM syE jgs -fMu +vfi uje uje uje @@ -179859,171 +179979,171 @@ aaa aaa aaa aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (171,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW uRv kgS uRv -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -180034,12 +180154,12 @@ aac aac aaa aaa -cTU +euR nUF jTQ mrg cTU -kqy +lan pZA uax uax @@ -180070,13 +180190,13 @@ ptB yeB iXX wpK -tCa +rXA jHX ayb meu jxK ccO -vGt +jKQ rlu hBK ccO @@ -180086,7 +180206,7 @@ jpV jpV vlF jpV -ttr +iRn eNX dLO dLO @@ -180103,8 +180223,8 @@ aaa aaa aaa qVr -qvU -wrW +gFm +hwQ soq abM abM @@ -180118,152 +180238,152 @@ aaa aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (172,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW meb -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW kFx avE avE @@ -180278,9 +180398,9 @@ bKy fZL fZL aTY -jhd -jhd -jhd +pMW +pMW +pMW aac aac aac @@ -180291,10 +180411,10 @@ aac aaa aaa cTU -cTU -ohS +euR +nvF xDW -ohS +nvF cTU nnb pZA @@ -180312,18 +180432,18 @@ byL whL ulh vNv -pDZ +cnt whL swC aEz xkX -gIN +fSf brm iOd lMF vPi brm -udN +mEd kuq aHq lfQ @@ -180347,7 +180467,7 @@ tby bJp dLO dLO -dLO +vCh pMk aaa aaa @@ -180375,170 +180495,170 @@ aaa aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (173,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW uRv kgS uRv -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -180548,11 +180668,11 @@ aac aaa aaa cTU -aSo +blx tAJ lTM axF -axF +fDd rwo dij uax @@ -180560,7 +180680,7 @@ uax ufh tEF qza -apm +aIU bXv kOl jAU @@ -180573,7 +180693,7 @@ kNf whL esQ rEB -tLe +glv bMb brm iOd @@ -180581,7 +180701,7 @@ lMF vPi brm bMb -xzB +oiv aHq lfQ cnV @@ -180592,10 +180712,10 @@ nUy ccO sPI piv -nbi +ecV ccO qUA -iTo +uCQ jUa iQC kOu @@ -180632,160 +180752,160 @@ aaa aac aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (174,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx kFx -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW aTY fZL cfp @@ -180807,11 +180927,11 @@ aaa akr tjS hFV -gDr -uax -uax -uax -uax +haq +dzw +dzw +dzw +dzw gUL foU dzw @@ -180831,13 +180951,13 @@ whL bMb rEB oPw -hLn +rlZ brm iOd lMF vPi brm -dfx +tjl bNW aHq lfQ @@ -180873,10 +180993,10 @@ qVr qVr qVr qVr -tTL +jMs tsg rzt -xyA +pZM wXi soq vqe @@ -180889,170 +181009,170 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (175,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW uRv kgS uRv -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -181075,7 +181195,7 @@ dzw sxR skb oAV -aAK +ccF uWi rpY ivy @@ -181084,7 +181204,7 @@ vYl pDa tZP oNJ -cbc +bKN fgi aEA pne @@ -181117,9 +181237,9 @@ qLR iiM izy tPu -ldG +csh pof -fGS +cSC pbH uvU umu @@ -181132,11 +181252,11 @@ qVr gYw cHY aLR -xfL +sjT xfL nsK sEx -rNm +vPC qVr aaa aaa @@ -181146,159 +181266,159 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (176,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW aTY fZL fZL @@ -181307,9 +181427,9 @@ bKy fZL fZL aTY -jhd -jhd -jhd +pMW +pMW +pMW aac aac aac @@ -181330,7 +181450,7 @@ eOk hRs gtr cya -sdl +lLx oAV snK aBc @@ -181359,7 +181479,7 @@ bYP cyu wxu yjY -caD +eYS oxL faH oGO @@ -181368,7 +181488,7 @@ mEt vNk kTU xyt -whP +srx ovC dCq uiV @@ -181404,169 +181524,169 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (177,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW uRv sLi uRv -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -181589,7 +181709,7 @@ oSb vSI vSI vYl -oZm +fJA cwG sFc cwG @@ -181635,8 +181755,8 @@ vkE wcB keh pbH -lcc -hMd +bmz +pIx qVr ttj bfH @@ -181651,179 +181771,179 @@ eJQ bNx aSt aSt -oUy -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +oKn +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (178,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -aaa -aaa -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +aaa +aaa +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW meb -jhd -jhd -jhd +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW aTY fZL cfp iCA aTY -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW aac aac aac @@ -181879,23 +181999,23 @@ lEU ios aKz mai -tdm +rbA wwP -msM +jbt dLO jwe iij yaB tes -byp +ckC dbU tes cjz qKE chE -ffk +pHX qVr -uBM +cAK ttj bhf ttj @@ -181918,170 +182038,170 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (179,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -aaa -aaa -aaa -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +aaa +aaa +aaa +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW uRv kgS uRv -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -182147,10 +182267,10 @@ tes lWv xPR kye -cwX +moQ pbH kBo -iwz +kJA qVr bfH bfH @@ -182175,27 +182295,27 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW meb -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW rxw rxw rxw @@ -182210,117 +182330,117 @@ rxw rxw rxw rxw -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (180,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -aaa -aaa -aaa -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +aaa +aaa +aaa +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx avE avE @@ -182331,7 +182451,7 @@ avE aTY iCA fZL -odl +tCw fZL fZL aTY @@ -182432,171 +182552,171 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW rxw rxw rxw -jhd -jhd +pMW +pMW avE -jhd -jhd -jhd +pMW +pMW +pMW bGh -jhd -jhd +pMW +pMW avE -jhd -jhd +pMW +pMW rxw rxw rxw -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (181,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW uRv csA uRv -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -182607,28 +182727,28 @@ akr xAJ tXK dZY -tZt -wdl +ekQ +hHM njx ftQ sTQ lBW wex -rZh +jzW fhv oAV -gpD +lvK ryS dkf -lYr +xtD vvN vYl vhn -oQm +lSM aDv -wfF +bKY fgi -rEB +cXX eOw dfx brm @@ -182640,11 +182760,11 @@ dfx cey stt lfQ -jtP +krn nBM sPQ ezL -rwT +kBi oxL hMG pmu @@ -182661,7 +182781,7 @@ kye kye rKL jst -lSW +vDu pbH vSa cJR @@ -182678,7 +182798,7 @@ dGs dGs bIf nyv -ipU +wZL qVr aaa aaa @@ -182688,30 +182808,30 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW rxw rxw rxw -jhd -jhd -jhd +pMW +pMW +pMW gFf gFf gFf @@ -182722,138 +182842,138 @@ gFf gFf gFf gFf -jhd -jhd -jhd +pMW +pMW +pMW rxw rxw rxw -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (182,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW uRv uRv uRv -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -182887,13 +183007,13 @@ fgi fgi giR rMl -dfx +qnL brm iOd lMF vPi brm -tNQ +idI xZQ stt wpK @@ -182929,10 +183049,10 @@ qVr qVr qVr qVr -tZT +kvO cZH pWw -ahg +uMu mLO qVr qVr @@ -182945,28 +183065,28 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd +pMW gFf gFf gFf @@ -182981,136 +183101,136 @@ gFf gFf gFf gFf -jhd -jhd -jhd +pMW +pMW +pMW rxw -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (183,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kFx kFx -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -183119,8 +183239,8 @@ aac aac cTU oTc -nDV -lGV +vsg +jJR udQ tNO tKh @@ -183128,14 +183248,14 @@ eVn eVn eVn eCw -eng +urf pRM uHb aAN aBe vCv -bpv -lkV +mAS +qHI fur cJm jjS @@ -183143,7 +183263,7 @@ dOC bIp evu qtF -uXx +iIS bMb brm iOd @@ -183151,7 +183271,7 @@ oHq vPi brm bMb -ubr +pvI aHs aHt sSr @@ -183161,11 +183281,11 @@ sSr sSr pFe dPe -gJU +ggQ xti bNa jpV -gSR +gSJ sql aao jqA @@ -183202,26 +183322,26 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW gFf gFf gFf @@ -183240,152 +183360,152 @@ gFf gFf gFf gFf -jhd +pMW rxw -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (184,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac aac aac aac -cTU -cTU -cTU -cTU udQ -axN +udQ +udQ +udQ +udQ +mmX pxD ayd ayt ayG aET -azM +hlB vQW wxW bNK @@ -183401,13 +183521,13 @@ kdI vrx add wiX -aDT +oUA brm mWR exD qQX brm -eAS +txl bpu wPN uDC @@ -183431,7 +183551,7 @@ qsg bJp dLO dLO -dLO +vCh pMk aaa aaa @@ -183457,25 +183577,25 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW tqN tqN tqN @@ -183488,7 +183608,7 @@ oMI oTa tDn tDn -tAC +hfs tDn tDn bJP @@ -183499,144 +183619,144 @@ gFf gFf avE rxw -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (185,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac aac aac aac -aac -aaa -aaa udQ -glA +hSM +foV +eGU +udQ +fBJ pxD pxD pxD @@ -183674,9 +183794,9 @@ sNQ sPK gYO pMk -rIH +ePS pmM -rIH +ePS pMk dfE gvm @@ -183684,7 +183804,7 @@ hnP lrI txS uWy -hES +uWy wFA dLO dLO @@ -183701,8 +183821,8 @@ aaa aaa aaa qVr -qvU -dFC +nSR +hwQ qVr aaa aaa @@ -183714,25 +183834,25 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW vUu lwj vUu @@ -183754,152 +183874,152 @@ bJP oMI gFf gFf -jhd +pMW rxw rxw rxw rxw -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (186,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac aac aac aac -aac -aaa -aaa -aaa udQ -kyc +puo +oOP +oOP +oAi +pOL kXr aye rgg jqv rgK -oyJ +lUz pRM nky dvn @@ -183911,7 +184031,7 @@ pRM qUB pEe uCO -aDJ +hPi bMb aED rsP @@ -183928,7 +184048,7 @@ tXz tXz tXz tiG -mYy +wfv xNT xNT xNT @@ -183971,25 +184091,25 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW tqN tqN tqN @@ -184011,144 +184131,144 @@ cHZ oMI gFf gFf -jhd -jhd -jhd -jhd -rxw -rxw -rxw -rxw +pMW +pMW +pMW +pMW rxw -rxw -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +mXU +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (187,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac aac aac aac -aaa -aaa -aaa -aaa +udQ +rEX +kyw +fNG udQ kSa cDP @@ -184158,7 +184278,7 @@ cDP cDP alu pRM -aAp +nky jJd aBg gba @@ -184168,7 +184288,7 @@ pRM eeO vPB mRb -fZS +sYJ bMb qDK bMb @@ -184184,22 +184304,22 @@ wkQ tXz oBc tXz -iJW +hmd bHb sed dpB vpp gel -kMa -nLN +tIh +hRa qab lWJ -xIj +aBL kvt kvt kvt syv -qaU +xeC gFO beF syv @@ -184257,7 +184377,7 @@ sDY dVM pcY jkc -sxq +cOc jYn jus cVr @@ -184271,148 +184391,148 @@ gFf gFf gFf gFf -jhd -jhd -avE -jhd -jhd -jhd +pMW +pMW rxw -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (188,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac aac aac -aac -aaa -aaa -aaa udQ -hCZ +udQ +udQ +udQ +udQ +aWL tft hMU qyg utY -cbs +fHV qar pRM nky @@ -184428,17 +184548,17 @@ uCO fZS bMb rxO -lCE +dfj vUE brm vCU -cEC +ebY aGn brm nSI awY vDI -wKe +nSd rMB gAQ eoX @@ -184484,24 +184604,24 @@ aaa aaa aaa aaa -jhd -jhd -jhd +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW tqN tqN tqN @@ -184525,136 +184645,136 @@ cHZ oMI gFf aOH -eXb +uqS uqS gFf gFf -gFf -gFf -gFf -gFf -jhd +pMW rxw -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (189,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -184672,7 +184792,7 @@ xxZ xxZ xxZ pRM -nky +aAp tIU aSS pRM @@ -184684,7 +184804,7 @@ vPB uCO fZS bMb -rxO +sLk cEC vUE brm @@ -184741,24 +184861,24 @@ aaa aaa aaa aaa -jhd -jhd -jhd +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW vUu vUu lwj @@ -184786,142 +184906,142 @@ pnT uqS uqS gFf -bDj -xbk -gSr -gFf -jhd +pMW rxw -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (190,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac aac aaa xxZ -axJ +hze bYD axz uwE @@ -184947,11 +185067,11 @@ vUE brm lbl lDS -sTP +scw brm nSI qrs -enV +xts oNa sJZ tXz @@ -184972,7 +185092,7 @@ ptQ syv vlm gYK -sbQ +bde syv aaa aaa @@ -185023,7 +185143,7 @@ tqN tNG jfu jfu -lwy +rIa sVz bNr aoh @@ -185033,145 +185153,145 @@ mgi pIQ hhf xZx -lDm +rSB dVM -sLv +hBJ uqS kzR rsZ vOD cmo uqS -oFJ -qmq -kRi -njt gFf -bPZ +pMW rxw -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (191,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -185223,7 +185343,7 @@ mKQ poM mfU lXd -ouT +otP aso syv syv @@ -185254,25 +185374,25 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW vUu vUu lwj @@ -185300,135 +185420,135 @@ dNi uqS uqS gFf -xxD -bkh -pmn -gFf -jhd +pMW rxw -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (192,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -185447,23 +185567,23 @@ xxZ aaa uno qUX -uiP +dJm ofv aCy lCy -aDe +vPB omh iSf jha qDn ajg +qZZ ajg -oQd -xna +hSt pgo -nDo -jUs -qRT +kAO +kAO +udX kAO duA bPO @@ -185474,11 +185594,11 @@ fZS pdn xNT kNM -nrd +mRY bDB xNT kNM -nrd +mRY rws xNT xNT @@ -185509,27 +185629,27 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW tqN tqN tqN @@ -185553,140 +185673,140 @@ cHZ oMI gFf uqS -cSe +uqS uqS gFf gFf -gFf -gFf -gFf -gFf -jhd +pMW rxw -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (193,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -185727,7 +185847,7 @@ kDH vPB qbp geG -lqj +xdF lCy xNT xNT @@ -185799,7 +185919,7 @@ bZA dVM uUG lSG -vyY +xsW jJv dtz jJv @@ -185813,137 +185933,137 @@ gFf gFf gFf gFf -jhd -jhd -avE -jhd -jhd -jhd +pMW +pMW rxw -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (194,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -185965,7 +186085,7 @@ azX mBT hWZ lCy -jSe +unx lMg qbu riS @@ -185976,7 +186096,7 @@ wuF cFg aGa aDI -wuF +pTW wuF wuF aHw @@ -185998,7 +186118,7 @@ aaa aaa aaa syv -deK +loG xrl nKb syv @@ -186021,31 +186141,31 @@ aac aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW tqN tqN tqN @@ -186067,140 +186187,140 @@ cHZ oMI gFf gFf -jhd -jhd -jhd -jhd -rxw -rxw -rxw +pMW +pMW +pMW +pMW rxw rxw -rxw -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (195,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -186257,7 +186377,7 @@ aaa syv wzk xNI -uXC +gWe syv aaa aaa @@ -186278,31 +186398,31 @@ aac aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW vUu lwj vUu @@ -186324,142 +186444,142 @@ vWw oMI gFf gFf -jhd +pMW rxw rxw rxw rxw -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (196,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -186493,7 +186613,7 @@ aGr fmy sWq akS -lyR +gXH fmy fmy vPB @@ -186534,32 +186654,32 @@ aac aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW tqN tqN tqN @@ -186572,7 +186692,7 @@ oMI uCh hic hic -lNd +uJa hic hic vWw @@ -186583,147 +186703,147 @@ gFf gFf avE rxw -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (197,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -aac -aac -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +aac +aac +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +pMW +pMW +pMW aac aac aac @@ -186790,36 +186910,36 @@ aaa aaa aaa aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW gFf gFf gFf @@ -186838,162 +186958,162 @@ gFf gFf gFf gFf -jhd +pMW rxw -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (198,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -jhd -jhd -aac -aac -aac -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +pMW +pMW +aac +aac +aac +pMW aac aac aac pSV -pBV +hHB bNi aDN wzg @@ -187008,10 +187128,10 @@ rdT lgO lgO wBz -qJz +dSI fmy ltZ -vAM +aRr xRI qUB aac @@ -187046,39 +187166,39 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd +pMW gFf gFf gFf @@ -187093,164 +187213,164 @@ gFf gFf gFf gFf -jhd -jhd -jhd +pMW +pMW +pMW rxw -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (199,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac pSV -kPj +wJV wXP loQ wAh @@ -187258,7 +187378,7 @@ cpK qSm kIo qSm -drl +sXo fmy aGs kIo @@ -187300,44 +187420,44 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW rxw rxw rxw -jhd -jhd -jhd +pMW +pMW +pMW gFf gFf gFf @@ -187348,164 +187468,164 @@ gFf gFf gFf gFf -jhd -jhd -jhd +pMW +pMW +pMW rxw rxw rxw -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (200,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW pSV wOW fam @@ -187557,216 +187677,216 @@ aaa aaa aaa aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW rxw rxw rxw -jhd -jhd +pMW +pMW avE -jhd -jhd -jhd +pMW +pMW +pMW ylt -jhd -jhd +pMW +pMW avE -jhd -jhd +pMW +pMW rxw rxw rxw -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (201,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -aac -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +aac +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW pSV xpE krq -puG +eIS vQX dJp jrc @@ -187779,7 +187899,7 @@ kIo men qSm fgl -iKC +qmr fmy aac aac @@ -187814,42 +187934,42 @@ aaa aaa aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW rxw rxw rxw @@ -187864,162 +187984,162 @@ rxw rxw rxw rxw -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (202,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -aac -aac -aac -aac -aac -aac -aac -aac -jhd -aac -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +aac +aac +aac +aac +aac +aac +aac +aac +pMW +aac +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW meb -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW pSV pSV pSV @@ -188071,217 +188191,217 @@ aaa aaa aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (203,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac fmy ifU -uqs +kLI kFu uCy tiM @@ -188305,9 +188425,9 @@ aac aac aac aac -jhd -jhd -jhd +pMW +pMW +pMW aaa aaa aaa @@ -188328,213 +188448,213 @@ aac aaa aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (204,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac uCy tsP @@ -188543,9 +188663,9 @@ cHS svC nny cOM -wrm +jZe xWu -nTJ +uuS qSm aDX qSm @@ -188562,10 +188682,10 @@ aac aac aac aac -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW aaa aaa aaa @@ -188584,214 +188704,214 @@ aac aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (205,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac uCy tsP @@ -188814,241 +188934,241 @@ aaa aac aac aac -jhd -jhd -aac -aac -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -aaa -aaa -aac -aac -aac -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +aac +aac +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +aaa +aaa +aac +aac +aac +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (206,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aaa -aaa -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aaa +aaa +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac uCy jNT @@ -189068,245 +189188,245 @@ fmy fmy aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (207,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW uCy uCy uCy @@ -189324,246 +189444,246 @@ pot uCy fmy aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -aaa -aaa -aaa -aaa -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +aaa +aaa +aaa +aaa +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (208,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aaa -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aaa +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW meb -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac uCy @@ -189581,246 +189701,246 @@ may uCy aac aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -aaa -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +aaa +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (209,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac uCy @@ -189837,4651 +189957,4651 @@ uCy may uCy aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (210,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac uCy -fbx +may uCy may uCy aac -jhd +pMW aac uCy may uCy -tph +may uCy -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW iLP tCf iLP -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (211,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac uCy may uCy may uCy -jhd -jhd +pMW +pMW aac uCy may uCy may uCy -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (212,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW uCy lra fkh jJO uCy -jhd -jhd -jhd +pMW +pMW +pMW uCy jJO fkh ugW uCy -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (213,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW kyU -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE avE avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW meb -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (214,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (215,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (216,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -aac -aac -aaa -aaa -aac -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +aac +aac +aaa +aaa +aac +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (217,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE avE avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (218,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (219,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW meb -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (220,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -aac -aac -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +aac +aac +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (221,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -aac -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +aac +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE avE avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (222,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (223,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -aac -aac -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +aac +aac +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (224,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -jhd -jhd -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +pMW +pMW +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd +pMW avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (225,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aaa -aaa -aaa -aaa -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aaa +aaa +aaa +aaa +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE avE avE -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (226,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd +pMW avE -jhd -jhd -aaa -aaa -jhd -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +aaa +aaa +pMW +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (227,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -jhd -jhd -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +pMW +pMW +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd +pMW avE aac aaa @@ -194492,253 +194612,253 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (228,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd +pMW avE aac aac @@ -194749,111 +194869,111 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (229,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -194876,124 +194996,124 @@ aaa aaa aac aac -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE avE avE @@ -195006,108 +195126,108 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (230,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -195137,36 +195257,36 @@ aaa aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -195180,79 +195300,79 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW avE -jhd +pMW avE aac aac @@ -195265,106 +195385,106 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (231,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -195393,34 +195513,34 @@ aaa aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -195435,81 +195555,81 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac avE -jhd +pMW avE aaa aaa @@ -195522,109 +195642,109 @@ aaa aaa aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (232,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -195650,34 +195770,34 @@ aac aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aaa @@ -195692,81 +195812,81 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac aac aac avE -jhd +pMW avE aaa aaa @@ -195779,110 +195899,110 @@ aac aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (233,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -195903,35 +196023,35 @@ aaa aaa aaa aaa -jhd -jhd +pMW +pMW aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -195947,74 +196067,74 @@ aac aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aaa aaa aac @@ -196032,114 +196152,114 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (234,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -196160,33 +196280,33 @@ aaa aaa aaa aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW aac aac aac @@ -196202,5572 +196322,5572 @@ aac aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aaa -aaa -aac -aac -aac -aac -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aaa +aaa +aac +aac +aac +aac +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (235,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -aac -aac -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +aac +aac +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW meb -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -aac -aac -aaa -aaa -aaa -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +aac +aac +aaa +aaa +aaa +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (236,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -aac -aac -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +aac +aac +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (237,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -aaa -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -aac -aac -aac -aac -aac -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +aaa +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +aac +aac +aac +aac +aac +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (238,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -aac -aac -aac -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +aac +aac +aac +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (239,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac -aac -aac -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aac +aac +aac +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (240,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (241,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (242,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aaa -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aaa +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (243,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -aaa -aaa -aaa -aaa -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +aaa +aaa +aaa +aaa +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (244,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -aaa -aac -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +aaa +aac +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (245,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -aac -aac -aac -aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +aac +aac +aac +aac +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (246,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (247,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (248,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (249,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (250,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (251,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (252,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (253,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (254,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} (255,1,2) = {" -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW +pMW "} diff --git a/_maps/multiz_debug.json b/_maps/multiz_debug.json index 5d5f207bd9c6a..2f07130c1f938 100644 --- a/_maps/multiz_debug.json +++ b/_maps/multiz_debug.json @@ -9,17 +9,17 @@ ], "traits": [ { - "Up": 1, + "Up": true, "Linkage": "Cross" }, { - "Up": 1, - "Down": -1, + "Up": true, + "Down": true, "Baseturf": "/turf/open/openspace", "Linkage": "Cross" }, { - "Down": -1, + "Down": true, "Baseturf": "/turf/open/openspace", "Linkage": "Cross" } diff --git a/_maps/northstar.json b/_maps/northstar.json index e8bcb75fbc6a4..bd1a53c562272 100644 --- a/_maps/northstar.json +++ b/_maps/northstar.json @@ -14,23 +14,23 @@ "space_empty_levels": 2, "traits": [ { - "Up": 1, + "Up": true, "Linkage": "Cross" }, { - "Up": 1, - "Down": -1, + "Up": true, + "Down": true, "Baseturf": "/turf/open/openspace", "Linkage": "Cross" }, { - "Up": 1, - "Down": -1, + "Up": true, + "Down": true, "Baseturf": "/turf/open/openspace", "Linkage": "Cross" }, { - "Down": -1, + "Down": true, "Baseturf": "/turf/open/openspace", "Linkage": "Cross" } diff --git a/_maps/safehouses/README.md b/_maps/safehouses/README.md new file mode 100644 index 0000000000000..8027ea38e2110 --- /dev/null +++ b/_maps/safehouses/README.md @@ -0,0 +1,17 @@ +# Safe House + +## Creating a new safe house + +1. Create a new map inside the `_maps\safe_houses` folder using the TGM format. +2. Create a new dm file inside `modules\bitrunning\virtual_domain\safe_houses` folder.. +4. Place exit and goal landmarks (obj/effect/landmark/bitrunning/..). Generally, 3 exits and 2 goals are ok. +5. Ideally, leave 3 spaces for gear. This has usually been xy [1x1] [1x2] [1x3] + +## Notes + +- Safe houses are intended to be 7x6 in size. You're not technically limited to this, but consider maps other maps might be using this size if you want it to be modular. +- Consider that avatars are not invincible and still require air. If you're making a safe house, it should start with an area that accommodates for this. +- For compatibility, your safe house should have a route open from the top center xy [3x0] of the map. +- If you want a custom safehouse for a custom map with no modularity, no problem. Make whatever sizes you want, just ensure there are exit and goal effects placed. +- Some maps can alter what is spawned into the safehouse by placing objects in the safehouse area. I'm using the left corner, starting from the top, for things like space gear. + diff --git a/_maps/safehouses/TEMPLATES/TEMPLATE.dmm b/_maps/safehouses/TEMPLATES/TEMPLATE.dmm new file mode 100644 index 0000000000000..c8e5059f0d013 --- /dev/null +++ b/_maps/safehouses/TEMPLATES/TEMPLATE.dmm @@ -0,0 +1,82 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"c" = ( +/obj/effect/mapping_helpers/airlock/access/all, +/obj/machinery/door/airlock/external/glass, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"p" = ( +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"v" = ( +/obj/effect/bitrunning/exit_spawn, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"N" = ( +/obj/effect/bitrunning/goal_turf, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"R" = ( +/turf/closed/wall, +/area/virtual_domain/safehouse) + +(1,1,1) = {" +R +R +a +a +R +R +"} +(2,1,1) = {" +a +p +p +p +p +R +"} +(3,1,1) = {" +R +p +p +p +v +a +"} +(4,1,1) = {" +c +p +p +p +v +R +"} +(5,1,1) = {" +R +p +p +p +v +a +"} +(6,1,1) = {" +a +p +N +N +p +R +"} +(7,1,1) = {" +R +R +a +a +R +R +"} diff --git a/_maps/safehouses/den.dmm b/_maps/safehouses/den.dmm new file mode 100644 index 0000000000000..235d786d6e9da --- /dev/null +++ b/_maps/safehouses/den.dmm @@ -0,0 +1,224 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/directional/south, +/turf/open/floor/pod, +/area/virtual_domain/safehouse) +"c" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/directional/east, +/obj/effect/landmark/bitrunning/cache_goal_turf, +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/turf/open/floor/bitrunning_transport, +/area/virtual_domain/safehouse) +"e" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/spawner/random/food_or_drink/snack{ + pixel_x = 4; + pixel_y = 2 + }, +/turf/open/floor/pod/dark, +/area/virtual_domain/safehouse) +"i" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "safehouseshutter" + }, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"l" = ( +/obj/structure/railing/corner/end{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/virtual_domain/safehouse) +"p" = ( +/turf/open/floor/pod, +/area/virtual_domain/safehouse) +"r" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 9 + }, +/turf/open/floor/pod/dark, +/area/virtual_domain/safehouse) +"u" = ( +/obj/structure/railing, +/obj/effect/turf_decal/siding/dark, +/obj/structure/sign/poster/contraband/hacking_guide/directional/east, +/obj/effect/landmark/bitrunning/cache_goal_turf, +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/turf/open/floor/bitrunning_transport, +/area/virtual_domain/safehouse) +"z" = ( +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 4 + }, +/obj/effect/landmark/bitrunning/hololadder_spawn, +/turf/open/floor/pod/light, +/area/virtual_domain/safehouse) +"C" = ( +/turf/closed/wall, +/area/virtual_domain/safehouse) +"D" = ( +/obj/effect/decal/cleanable/generic, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 1 + }, +/turf/open/floor/pod, +/area/virtual_domain/safehouse) +"E" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/generic, +/obj/effect/landmark/bitrunning/hololadder_spawn, +/turf/open/floor/pod/light, +/area/virtual_domain/safehouse) +"G" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + id = "safehouseshutter" + }, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"I" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 5 + }, +/obj/effect/landmark/bitrunning/hololadder_spawn, +/turf/open/floor/pod/light, +/area/virtual_domain/safehouse) +"J" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "safehouseshutter" + }, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"K" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/machinery/light/small/directional/south, +/turf/open/floor/pod, +/area/virtual_domain/safehouse) +"M" = ( +/turf/open/floor/pod/dark, +/area/virtual_domain/safehouse) +"O" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 8 + }, +/turf/open/floor/pod/dark, +/area/virtual_domain/safehouse) +"R" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/virtual_domain/safehouse) +"U" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/sign/departments/cargo/directional/west, +/obj/machinery/light/small/directional/west, +/turf/open/floor/pod, +/area/virtual_domain/safehouse) +"W" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "safehouseshutter" + }, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"X" = ( +/obj/machinery/door/airlock/grunge, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"Y" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/machinery/button/door{ + pixel_x = 4; + pixel_y = 4; + id = "safehouseshutter" + }, +/obj/effect/spawner/random/food_or_drink/refreshing_beverage{ + pixel_y = 6; + pixel_x = -10 + }, +/turf/open/floor/pod/dark, +/area/virtual_domain/safehouse) +"Z" = ( +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/virtual_domain/safehouse) + +(1,1,1) = {" +C +C +C +G +G +C +"} +(2,1,1) = {" +W +U +p +M +K +C +"} +(3,1,1) = {" +C +r +O +O +E +i +"} +(4,1,1) = {" +X +D +Z +R +z +i +"} +(5,1,1) = {" +C +M +l +e +I +i +"} +(6,1,1) = {" +W +c +u +Y +a +C +"} +(7,1,1) = {" +C +C +C +J +J +C +"} diff --git a/_maps/safehouses/dig.dmm b/_maps/safehouses/dig.dmm new file mode 100644 index 0000000000000..7fbbd3e554933 --- /dev/null +++ b/_maps/safehouses/dig.dmm @@ -0,0 +1,165 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/turf_decal/siding/yellow/corner, +/obj/effect/turf_decal/sand/plating, +/obj/item/flashlight/glowstick{ + on = 1 + }, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"c" = ( +/obj/effect/turf_decal/siding/yellow/corner{ + dir = 8 + }, +/turf/open/misc/asteroid, +/area/virtual_domain/safehouse) +"h" = ( +/obj/effect/turf_decal/loading_area, +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/obj/effect/landmark/bitrunning/cache_goal_turf, +/turf/open/floor/bitrunning_transport, +/area/virtual_domain/safehouse) +"i" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 8 + }, +/obj/effect/decal/remains/xeno/larva, +/turf/open/misc/asteroid, +/area/virtual_domain/safehouse) +"l" = ( +/obj/structure/table, +/obj/item/coin/gold{ + pixel_x = -6; + pixel_y = 2 + }, +/obj/item/flashlight/lantern{ + pixel_y = 8; + pixel_x = 4; + on = 1 + }, +/turf/open/misc/asteroid, +/area/virtual_domain/safehouse) +"o" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/asteroid, +/area/virtual_domain/safehouse) +"u" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/siding/yellow, +/obj/effect/decal/cleanable/oil/streak, +/turf/open/misc/asteroid, +/area/virtual_domain/safehouse) +"x" = ( +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"A" = ( +/turf/closed/wall/rock, +/area/virtual_domain/safehouse) +"B" = ( +/turf/open/misc/asteroid, +/area/virtual_domain/safehouse) +"H" = ( +/turf/closed/mineral/asteroid, +/area/virtual_domain/safehouse) +"I" = ( +/obj/machinery/door/airlock/maintenance/glass, +/obj/structure/fans/tiny, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"M" = ( +/obj/effect/turf_decal/siding/yellow, +/obj/effect/decal/remains/xeno, +/turf/open/misc/asteroid, +/area/virtual_domain/safehouse) +"N" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/turf_decal/sand/plating, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"S" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/loading_area, +/obj/effect/turf_decal/box/corners, +/obj/effect/landmark/bitrunning/cache_goal_turf, +/turf/open/floor/bitrunning_transport, +/area/virtual_domain/safehouse) +"T" = ( +/obj/effect/landmark/bitrunning/hololadder_spawn, +/turf/open/misc/asteroid, +/area/virtual_domain/safehouse) +"U" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 8 + }, +/turf/open/misc/asteroid, +/area/virtual_domain/safehouse) + +(1,1,1) = {" +H +H +A +A +H +H +"} +(2,1,1) = {" +A +N +x +a +H +A +"} +(3,1,1) = {" +A +i +U +u +h +A +"} +(4,1,1) = {" +I +B +B +M +S +A +"} +(5,1,1) = {" +A +l +B +c +o +H +"} +(6,1,1) = {" +A +A +T +T +T +A +"} +(7,1,1) = {" +H +A +H +H +A +A +"} diff --git a/_maps/safehouses/ice.dmm b/_maps/safehouses/ice.dmm new file mode 100644 index 0000000000000..a8293f9502aa7 --- /dev/null +++ b/_maps/safehouses/ice.dmm @@ -0,0 +1,254 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/spawner/structure/window/ice, +/turf/open/floor/plating/snowed, +/area/virtual_domain/safehouse) +"c" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/directional/east, +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"f" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/snowed, +/area/virtual_domain/safehouse) +"g" = ( +/obj/effect/spawner/structure/window/ice, +/obj/structure/barricade/wooden/crude/snow, +/turf/open/floor/plating/snowed, +/area/virtual_domain/safehouse) +"i" = ( +/turf/closed/wall/ice, +/area/virtual_domain/safehouse) +"m" = ( +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 1 + }, +/obj/effect/landmark/bitrunning/hololadder_spawn, +/turf/open/floor/pod, +/area/virtual_domain/safehouse) +"n" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/rack, +/obj/item/grown/log, +/obj/item/grown/log, +/obj/item/grown/log, +/obj/item/hatchet/wooden, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"o" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/landmark/bitrunning/cache_goal_turf, +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/turf/open/floor/bitrunning_transport, +/area/virtual_domain/safehouse) +"p" = ( +/obj/structure/railing, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/landmark/bitrunning/cache_goal_turf, +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/turf/open/floor/bitrunning_transport, +/area/virtual_domain/safehouse) +"u" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"v" = ( +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 5 + }, +/obj/effect/landmark/bitrunning/hololadder_spawn, +/turf/open/floor/pod, +/area/virtual_domain/safehouse) +"x" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/vending/coffee, +/turf/open/floor/plating/snowed, +/area/virtual_domain/safehouse) +"z" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/generic, +/turf/open/floor/plating/snowed, +/area/virtual_domain/safehouse) +"A" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/obj/structure/railing/corner/end{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/snowed, +/area/virtual_domain/safehouse) +"B" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/snowed, +/area/virtual_domain/safehouse) +"C" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/coffee{ + pixel_x = 7; + pixel_y = 13 + }, +/obj/item/reagent_containers/cup/glass/coffee/no_lid{ + pixel_x = -4; + pixel_y = 14 + }, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"D" = ( +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/generic, +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 9 + }, +/obj/effect/landmark/bitrunning/hololadder_spawn, +/turf/open/floor/pod, +/area/virtual_domain/safehouse) +"I" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"L" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/directional/west, +/obj/machinery/smartfridge/drying_rack, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"O" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/door/airlock/freezer, +/obj/structure/fans/tiny, +/turf/open/floor/plating/snowed, +/area/virtual_domain/safehouse) +"S" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table/wood, +/obj/item/trash/chips{ + pixel_x = 8; + pixel_y = 15 + }, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"W" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/closet/crate/internals, +/obj/item/tank/internals/oxygen, +/obj/item/tank/internals/oxygen, +/obj/item/tank/internals/oxygen, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"Z" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) + +(1,1,1) = {" +i +i +g +a +i +i +"} +(2,1,1) = {" +i +L +n +W +Z +i +"} +(3,1,1) = {" +a +x +u +I +D +i +"} +(4,1,1) = {" +O +z +B +I +m +i +"} +(5,1,1) = {" +a +f +A +C +v +i +"} +(6,1,1) = {" +i +o +p +S +c +i +"} +(7,1,1) = {" +i +i +g +g +i +i +"} diff --git a/_maps/safehouses/lavaland_boss.dmm b/_maps/safehouses/lavaland_boss.dmm new file mode 100644 index 0000000000000..7482846e61f7a --- /dev/null +++ b/_maps/safehouses/lavaland_boss.dmm @@ -0,0 +1,243 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/effect/landmark/bitrunning/hololadder_spawn, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 1 + }, +/area/virtual_domain/safehouse) +"f" = ( +/turf/closed/wall, +/area/virtual_domain/safehouse) +"p" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 5 + }, +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/iron/dark, +/area/virtual_domain/safehouse) +"v" = ( +/obj/structure/table, +/obj/item/borg/upgrade/modkit/damage{ + pixel_x = 8; + pixel_y = 8 + }, +/obj/item/borg/upgrade/modkit/damage{ + pixel_y = 4; + pixel_x = 8 + }, +/obj/item/borg/upgrade/modkit/damage{ + pixel_x = 8 + }, +/obj/item/borg/upgrade/modkit/range{ + pixel_y = 8 + }, +/obj/item/borg/upgrade/modkit/range{ + pixel_y = 4 + }, +/obj/item/borg/upgrade/modkit/range, +/obj/item/borg/upgrade/modkit/cooldown{ + pixel_x = -8; + pixel_y = 8 + }, +/obj/item/borg/upgrade/modkit/cooldown{ + pixel_x = -8; + pixel_y = 4 + }, +/obj/item/borg/upgrade/modkit/cooldown{ + pixel_x = -8 + }, +/obj/item/reagent_containers/hypospray/medipen/survival/luxury{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/reagent_containers/hypospray/medipen/survival/luxury{ + pixel_x = 6 + }, +/turf/open/floor/iron/dark/textured_large, +/area/virtual_domain/safehouse) +"w" = ( +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/obj/structure/railing, +/obj/effect/landmark/bitrunning/cache_goal_turf, +/turf/open/floor/bitrunning_transport, +/area/virtual_domain/safehouse) +"A" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron/dark/smooth_edge, +/area/virtual_domain/safehouse) +"B" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 10 + }, +/obj/structure/table, +/obj/item/flashlight/lantern{ + pixel_x = 8; + pixel_y = null + }, +/obj/item/flashlight/lantern{ + pixel_y = 4 + }, +/obj/item/flashlight/lantern{ + pixel_x = -8; + pixel_y = 8 + }, +/obj/item/clothing/glasses/meson/night, +/obj/item/clothing/glasses/meson/night, +/obj/item/clothing/glasses/meson/night, +/turf/open/floor/iron/dark, +/area/virtual_domain/safehouse) +"C" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/structure/closet, +/obj/item/gun/ballistic/rocketlauncher/unrestricted, +/obj/item/ammo_casing/rocket, +/obj/item/ammo_casing/rocket, +/obj/item/ammo_casing/rocket, +/obj/item/energy_katana, +/obj/item/ammo_box/magazine/m7mm, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 8 + }, +/area/virtual_domain/safehouse) +"H" = ( +/obj/machinery/door/airlock/external/glass{ + name = "Mining External Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all, +/obj/structure/fans/tiny, +/turf/open/floor/iron/dark/textured_large, +/area/virtual_domain/safehouse) +"K" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_edge, +/area/virtual_domain/safehouse) +"O" = ( +/obj/item/gun/energy/recharge/kinetic_accelerator{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/item/gun/energy/recharge/kinetic_accelerator{ + pixel_x = -1; + pixel_y = 1 + }, +/obj/item/gun/energy/recharge/kinetic_accelerator{ + pixel_x = 4; + pixel_y = -4 + }, +/obj/structure/closet, +/obj/item/kinetic_crusher, +/obj/item/kinetic_crusher, +/turf/open/floor/iron/dark/textured_large, +/area/virtual_domain/safehouse) +"P" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"S" = ( +/turf/open/floor/iron/dark/textured_large, +/area/virtual_domain/safehouse) +"T" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 6 + }, +/obj/structure/sign/departments/cargo/directional/south, +/obj/structure/closet, +/obj/item/gun/ballistic/automatic/l6_saw/unrestricted, +/obj/item/ammo_box/magazine/sniper_rounds, +/obj/item/gun/ballistic/rifle/sniper_rifle, +/turf/open/floor/iron/dark, +/area/virtual_domain/safehouse) +"X" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/machinery/suit_storage_unit/mining, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 4 + }, +/area/virtual_domain/safehouse) +"Y" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/machinery/suit_storage_unit/mining, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 4 + }, +/area/virtual_domain/safehouse) +"Z" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 9 + }, +/obj/machinery/suit_storage_unit/mining, +/turf/open/floor/iron/dark, +/area/virtual_domain/safehouse) + +(1,1,1) = {" +f +f +f +P +P +f +"} +(2,1,1) = {" +P +Z +Y +X +B +f +"} +(3,1,1) = {" +f +A +S +S +a +P +"} +(4,1,1) = {" +H +K +O +v +a +P +"} +(5,1,1) = {" +f +A +S +S +a +P +"} +(6,1,1) = {" +P +p +w +C +T +f +"} +(7,1,1) = {" +f +f +f +P +P +f +"} diff --git a/_maps/safehouses/mine.dmm b/_maps/safehouses/mine.dmm new file mode 100644 index 0000000000000..551e2ca0c001a --- /dev/null +++ b/_maps/safehouses/mine.dmm @@ -0,0 +1,164 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/effect/landmark/bitrunning/hololadder_spawn, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 1 + }, +/area/virtual_domain/safehouse) +"f" = ( +/turf/closed/wall, +/area/virtual_domain/safehouse) +"p" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 5 + }, +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/iron/dark, +/area/virtual_domain/safehouse) +"w" = ( +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/obj/effect/landmark/bitrunning/cache_goal_turf, +/turf/open/floor/bitrunning_transport, +/area/virtual_domain/safehouse) +"B" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 10 + }, +/obj/structure/table, +/obj/item/flashlight/lantern{ + pixel_x = 8; + pixel_y = null + }, +/obj/item/flashlight/lantern{ + pixel_y = 4 + }, +/obj/item/flashlight/lantern{ + pixel_x = -8; + pixel_y = 8 + }, +/turf/open/floor/iron/dark, +/area/virtual_domain/safehouse) +"C" = ( +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/obj/structure/railing, +/obj/effect/landmark/bitrunning/cache_goal_turf, +/turf/open/floor/bitrunning_transport, +/area/virtual_domain/safehouse) +"H" = ( +/obj/machinery/door/airlock/external/glass{ + name = "Mining External Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all, +/obj/structure/fans/tiny, +/turf/open/floor/iron/dark/textured_large, +/area/virtual_domain/safehouse) +"K" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_edge, +/area/virtual_domain/safehouse) +"P" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"S" = ( +/turf/open/floor/iron/dark/textured_large, +/area/virtual_domain/safehouse) +"T" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 6 + }, +/obj/item/kirbyplants/random, +/obj/structure/sign/departments/cargo/directional/south, +/turf/open/floor/iron/dark, +/area/virtual_domain/safehouse) +"X" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/machinery/suit_storage_unit/mining, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 4 + }, +/area/virtual_domain/safehouse) +"Y" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/machinery/suit_storage_unit/mining, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 4 + }, +/area/virtual_domain/safehouse) +"Z" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 9 + }, +/obj/machinery/suit_storage_unit/mining, +/turf/open/floor/iron/dark, +/area/virtual_domain/safehouse) + +(1,1,1) = {" +f +f +f +P +P +f +"} +(2,1,1) = {" +P +Z +Y +X +B +f +"} +(3,1,1) = {" +f +K +S +S +a +P +"} +(4,1,1) = {" +H +K +S +S +a +P +"} +(5,1,1) = {" +f +K +S +S +a +P +"} +(6,1,1) = {" +P +p +w +C +T +f +"} +(7,1,1) = {" +f +f +f +P +P +f +"} diff --git a/_maps/safehouses/shuttle.dmm b/_maps/safehouses/shuttle.dmm new file mode 100644 index 0000000000000..92228c95bd3c4 --- /dev/null +++ b/_maps/safehouses/shuttle.dmm @@ -0,0 +1,228 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/wall/mineral/titanium, +/area/virtual_domain/safehouse) +"e" = ( +/obj/effect/spawner/structure/window/reinforced/shuttle, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"f" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"g" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/bitrunning/cache_goal_turf, +/obj/effect/turf_decal/loading_area, +/turf/open/floor/bitrunning_transport, +/area/virtual_domain/safehouse) +"i" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"k" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/table/reinforced, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/toolbox/emergency, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"l" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/landmark/bitrunning/cache_goal_turf, +/obj/effect/turf_decal/loading_area, +/turf/open/floor/bitrunning_transport, +/area/virtual_domain/safehouse) +"q" = ( +/obj/effect/turf_decal/stripes/end, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"r" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"t" = ( +/obj/machinery/power/shuttle_engine/propulsion/burst{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/virtual_domain/safehouse) +"u" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"x" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"y" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/airlock/shuttle/glass, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/sand/volcanic, +/obj/structure/fans/tiny, +/turf/open/floor/iron/white, +/area/virtual_domain/safehouse) +"A" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/computer{ + dir = 8; + name = "shuttle console"; + icon_screen = "shuttle" + }, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"E" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/decal/cleanable/generic, +/obj/effect/landmark/bitrunning/hololadder_spawn, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"G" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/light/small/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/bitrunning/hololadder_spawn, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"H" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"I" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/table/reinforced, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = 3 + }, +/obj/item/clothing/mask/gas, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"L" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 1 + }, +/obj/effect/turf_decal/sand/volcanic, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"M" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"T" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/landmark/bitrunning/hololadder_spawn, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"X" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) + +(1,1,1) = {" +a +t +e +e +t +a +"} +(2,1,1) = {" +e +L +i +q +l +a +"} +(3,1,1) = {" +a +x +r +u +g +e +"} +(4,1,1) = {" +y +f +r +H +E +a +"} +(5,1,1) = {" +a +M +X +H +T +e +"} +(6,1,1) = {" +e +k +A +I +G +a +"} +(7,1,1) = {" +a +a +e +e +a +a +"} diff --git a/_maps/safehouses/shuttle_space.dmm b/_maps/safehouses/shuttle_space.dmm new file mode 100644 index 0000000000000..a5afaa475c654 --- /dev/null +++ b/_maps/safehouses/shuttle_space.dmm @@ -0,0 +1,231 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/spawner/structure/window/reinforced/shuttle, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"b" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"c" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"i" = ( +/turf/closed/wall/mineral/titanium/overspace, +/area/virtual_domain/safehouse) +"l" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/landmark/bitrunning/hololadder_spawn, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"n" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/computer{ + dir = 8; + name = "shuttle console"; + icon_screen = "shuttle" + }, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"o" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"q" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/table/reinforced, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/toolbox/emergency, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"r" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/bitrunning/cache_goal_turf, +/obj/effect/turf_decal/loading_area, +/turf/open/floor/bitrunning_transport, +/area/virtual_domain/safehouse) +"z" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"A" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 1 + }, +/obj/effect/turf_decal/sand/volcanic, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"B" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/light/small/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/bitrunning/hololadder_spawn, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"D" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/landmark/bitrunning/cache_goal_turf, +/obj/effect/turf_decal/loading_area, +/turf/open/floor/bitrunning_transport, +/area/virtual_domain/safehouse) +"E" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/airlock/shuttle/glass, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/sand/volcanic, +/obj/structure/fans/tiny, +/turf/open/floor/iron/white, +/area/virtual_domain/safehouse) +"G" = ( +/turf/closed/wall/mineral/titanium, +/area/virtual_domain/safehouse) +"H" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"I" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"L" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/table/reinforced, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = 3 + }, +/obj/item/clothing/mask/gas, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"N" = ( +/obj/machinery/power/shuttle_engine/propulsion/burst{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/virtual_domain/safehouse) +"O" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"U" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"W" = ( +/obj/effect/turf_decal/stripes/end, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"Y" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/decal/cleanable/generic, +/obj/effect/landmark/bitrunning/hololadder_spawn, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) + +(1,1,1) = {" +i +N +a +a +N +i +"} +(2,1,1) = {" +a +A +o +W +D +G +"} +(3,1,1) = {" +G +I +H +U +r +a +"} +(4,1,1) = {" +E +z +H +b +Y +G +"} +(5,1,1) = {" +G +c +O +b +l +a +"} +(6,1,1) = {" +a +q +n +L +B +G +"} +(7,1,1) = {" +i +G +a +a +G +i +"} diff --git a/_maps/safehouses/test_only_safehouse.dmm b/_maps/safehouses/test_only_safehouse.dmm new file mode 100644 index 0000000000000..c23f8c4a22b49 --- /dev/null +++ b/_maps/safehouses/test_only_safehouse.dmm @@ -0,0 +1,29 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/landmark/bitrunning/cache_goal_turf, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"d" = ( +/obj/effect/landmark/bitrunning/hololadder_spawn, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"u" = ( +/turf/open/floor/plating, +/area/virtual_domain/safehouse) + +(1,1,1) = {" +u +d +"} +(2,1,1) = {" +u +d +"} +(3,1,1) = {" +u +d +"} +(4,1,1) = {" +u +a +"} diff --git a/_maps/safehouses/wood.dmm b/_maps/safehouses/wood.dmm new file mode 100644 index 0000000000000..0bb6b273fceae --- /dev/null +++ b/_maps/safehouses/wood.dmm @@ -0,0 +1,120 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/indestructible/hotelwood, +/area/virtual_domain/safehouse) +"i" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"o" = ( +/turf/open/floor/carpet/green, +/area/virtual_domain/safehouse) +"p" = ( +/obj/item/kirbyplants/random/fullysynthetic, +/turf/open/indestructible/hotelwood, +/area/virtual_domain/safehouse) +"s" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/landmark/bitrunning/cache_goal_turf, +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/turf/open/floor/bitrunning_transport, +/area/virtual_domain/safehouse) +"v" = ( +/obj/machinery/light/small/directional/east, +/obj/structure/table/wood, +/obj/item/newspaper, +/turf/open/indestructible/hotelwood, +/area/virtual_domain/safehouse) +"x" = ( +/obj/structure/railing/corner/end{ + dir = 4 + }, +/turf/open/floor/carpet/green, +/area/virtual_domain/safehouse) +"z" = ( +/obj/structure/sign/poster/random/directional/east, +/turf/open/indestructible/hotelwood, +/area/virtual_domain/safehouse) +"G" = ( +/turf/closed/wall/mineral/wood, +/area/virtual_domain/safehouse) +"J" = ( +/obj/structure/railing, +/obj/effect/landmark/bitrunning/cache_goal_turf, +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/turf/open/floor/bitrunning_transport, +/area/virtual_domain/safehouse) +"T" = ( +/obj/effect/landmark/bitrunning/hololadder_spawn, +/turf/open/indestructible/hotelwood, +/area/virtual_domain/safehouse) +"X" = ( +/obj/machinery/door/airlock/wood/glass, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"Z" = ( +/obj/machinery/light/small/directional/west, +/turf/open/indestructible/hotelwood, +/area/virtual_domain/safehouse) + +(1,1,1) = {" +G +G +i +G +G +G +"} +(2,1,1) = {" +i +Z +a +a +Z +i +"} +(3,1,1) = {" +G +p +o +o +T +G +"} +(4,1,1) = {" +X +a +o +o +T +G +"} +(5,1,1) = {" +G +a +x +o +T +G +"} +(6,1,1) = {" +i +s +J +z +v +i +"} +(7,1,1) = {" +G +G +i +G +G +G +"} diff --git a/_maps/shuttles/arrival_birdshot.dmm b/_maps/shuttles/arrival_birdshot.dmm index 773b811cf8bab..2288db6bbe24d 100644 --- a/_maps/shuttles/arrival_birdshot.dmm +++ b/_maps/shuttles/arrival_birdshot.dmm @@ -10,16 +10,12 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/arrival) -"g" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/obj/machinery/light/dim/directional/west, -/turf/open/floor/mineral/titanium, +"h" = ( +/obj/machinery/light/floor, +/turf/open/floor/mineral/titanium/blue, /area/shuttle/arrival) "i" = ( /obj/structure/closet/wardrobe/black, -/obj/machinery/light/dim/directional/south, /turf/open/floor/mineral/titanium/blue, /area/shuttle/arrival) "n" = ( @@ -47,7 +43,6 @@ /area/shuttle/arrival) "r" = ( /obj/effect/spawner/random/entertainment/arcade, -/obj/machinery/light/cold/directional/west, /turf/open/floor/mineral/titanium, /area/shuttle/arrival) "u" = ( @@ -63,6 +58,10 @@ }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/arrival) +"w" = ( +/obj/machinery/light/cold/directional/north, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) "B" = ( /turf/open/floor/mineral/titanium/blue, /area/shuttle/arrival) @@ -72,11 +71,6 @@ }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/arrival) -"I" = ( -/obj/structure/closet/wardrobe/black, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/arrival) "J" = ( /turf/open/floor/mineral/titanium, /area/shuttle/arrival) @@ -89,20 +83,16 @@ /obj/item/clothing/mask/breath, /turf/open/floor/mineral/titanium/blue, /area/shuttle/arrival) +"L" = ( +/obj/machinery/light/cold/directional/south, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) "M" = ( /obj/structure/table, /obj/item/storage/medkit/regular{ pixel_y = 4 }, /obj/item/storage/toolbox/emergency, -/obj/machinery/light/dim/directional/west, -/turf/open/floor/mineral/titanium, -/area/shuttle/arrival) -"O" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/obj/machinery/light/dim/directional/east, /turf/open/floor/mineral/titanium, /area/shuttle/arrival) "P" = ( @@ -167,7 +157,7 @@ V q r J -B +h J M q @@ -194,7 +184,7 @@ Q Q U B -O +U B U Q @@ -211,9 +201,9 @@ V (9,1,1) = {" a Q -B +L q -B +w Q a "} @@ -230,7 +220,7 @@ V Q U B -g +U B U Q @@ -248,14 +238,14 @@ Q F B B -B +h B B F "} (14,1,1) = {" q -I +i K P K diff --git a/_maps/shuttles/arrival_box.dmm b/_maps/shuttles/arrival_box.dmm index ad77886041a9e..3d4a8769d4cdb 100644 --- a/_maps/shuttles/arrival_box.dmm +++ b/_maps/shuttles/arrival_box.dmm @@ -46,9 +46,9 @@ /area/shuttle/arrival) "l" = ( /obj/machinery/requests_console/directional/north{ - department = "Arrival shuttle" + department = "Arrival shuttle"; + name = "Arrival Shuttle Requests Console" }, -/obj/machinery/light/directional/north, /turf/open/floor/mineral/titanium/blue, /area/shuttle/arrival) "m" = ( @@ -119,11 +119,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/mineral/titanium/blue, /area/shuttle/arrival) -"z" = ( -/obj/item/radio/intercom/directional/south, -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/arrival) "A" = ( /obj/machinery/power/shuttle_engine/propulsion/burst/left{ dir = 4 @@ -133,6 +128,10 @@ "S" = ( /turf/open/floor/mineral/titanium, /area/shuttle/arrival) +"U" = ( +/obj/item/radio/intercom/directional/south, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) (1,1,1) = {" a @@ -194,7 +193,7 @@ g f f f -y +U b "} (8,1,1) = {" @@ -239,7 +238,7 @@ l r r r -z +y b "} (13,1,1) = {" diff --git a/_maps/shuttles/arrival_delta.dmm b/_maps/shuttles/arrival_delta.dmm index 0e1b2c7de78f3..0fca873aaa13e 100644 --- a/_maps/shuttles/arrival_delta.dmm +++ b/_maps/shuttles/arrival_delta.dmm @@ -158,60 +158,10 @@ }, /turf/open/floor/iron/white, /area/shuttle/arrival) -"ao" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/shuttle/arrival) "ap" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/shuttle/arrival) -"aq" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/shuttle/arrival) -"ar" = ( -/obj/machinery/status_display/evac{ - pixel_x = -32 - }, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/shuttle/arrival) -"as" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/bot, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/shuttle/arrival) -"at" = ( -/obj/machinery/status_display/ai{ - pixel_x = 32 - }, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/shuttle/arrival) "au" = ( /obj/structure/chair/comfy/shuttle{ dir = 4 @@ -253,24 +203,6 @@ /obj/structure/sign/nanotrasen, /turf/closed/wall/mineral/titanium, /area/shuttle/arrival) -"aA" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/shuttle/arrival) -"aB" = ( -/obj/structure/table/reinforced, -/obj/item/clipboard, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/shuttle/arrival) "aC" = ( /obj/machinery/computer{ dir = 1; @@ -279,31 +211,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron, /area/shuttle/arrival) -"aD" = ( -/obj/structure/table/reinforced, -/obj/item/folder, -/obj/item/storage/dice, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/shuttle/arrival) -"aE" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/shuttle/arrival) -"aF" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/vending/wallmed/directional/north{ - use_power = 0 - }, -/turf/open/floor/iron, -/area/shuttle/arrival) "aG" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, @@ -312,26 +219,11 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron, /area/shuttle/arrival) -"aH" = ( -/obj/structure/closet/wardrobe/black, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/shuttle/arrival) "aI" = ( /obj/structure/closet/wardrobe/grey, /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron, /area/shuttle/arrival) -"aJ" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron, -/area/shuttle/arrival) "aK" = ( /obj/structure/closet/wardrobe/yellow, /obj/effect/turf_decal/tile/blue{ @@ -372,34 +264,6 @@ /obj/machinery/status_display/ai, /turf/closed/wall/mineral/titanium, /area/shuttle/arrival) -"aQ" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron, -/area/shuttle/arrival) -"aR" = ( -/obj/structure/chair/office, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron, -/area/shuttle/arrival) -"aS" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron, -/area/shuttle/arrival) "aT" = ( /obj/structure/closet/wardrobe/black, /obj/effect/turf_decal/tile/neutral/half/contrasted, @@ -412,30 +276,6 @@ }, /turf/open/floor/iron, /area/shuttle/arrival) -"aV" = ( -/obj/machinery/computer{ - dir = 1; - name = "Shuttle computer" - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron, -/area/shuttle/arrival) -"aW" = ( -/obj/structure/table/reinforced, -/obj/structure/extinguisher_cabinet{ - pixel_y = 32 - }, -/obj/item/storage/medkit/regular{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/medkit/regular, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/shuttle/arrival) "aX" = ( /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron, @@ -454,6 +294,13 @@ }, /turf/open/floor/iron, /area/shuttle/arrival) +"gS" = ( +/obj/structure/table/reinforced, +/obj/item/clipboard, +/obj/effect/turf_decal/delivery, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/shuttle/arrival) "he" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 @@ -466,51 +313,69 @@ }, /turf/open/floor/iron, /area/shuttle/arrival) -"on" = ( -/obj/machinery/status_display/evac{ - pixel_x = -32 - }, -/obj/item/kirbyplants{ - icon_state = "plant-21" +"sq" = ( +/obj/machinery/status_display/ai{ + pixel_x = 32 }, +/obj/item/kirbyplants/organic/plant21, /obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 + dir = 4 }, /turf/open/floor/iron, /area/shuttle/arrival) -"uU" = ( -/obj/machinery/light/directional/north, +"uH" = ( /obj/machinery/vending/wallmed/directional/north{ use_power = 0 }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/shuttle/arrival) -"zb" = ( -/obj/machinery/status_display/ai{ - pixel_x = 32 - }, -/obj/item/kirbyplants{ - icon_state = "plant-21" +"wG" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 }, +/turf/open/floor/iron, +/area/shuttle/arrival) +"DV" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/shuttle/arrival) +"HM" = ( +/obj/structure/table/reinforced, +/obj/item/folder, +/obj/item/storage/dice, +/obj/effect/turf_decal/delivery, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/shuttle/arrival) +"My" = ( +/obj/item/kirbyplants/organic/plant21, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 }, /turf/open/floor/iron, /area/shuttle/arrival) -"Ns" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" +"Nn" = ( +/obj/structure/table/reinforced, +/obj/structure/extinguisher_cabinet{ + pixel_y = 32 }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 +/obj/item/storage/medkit/regular{ + pixel_x = 3; + pixel_y = 3 }, +/obj/item/storage/medkit/regular, +/obj/effect/turf_decal/bot, +/obj/machinery/light/directional/north, /turf/open/floor/iron, /area/shuttle/arrival) -"ZZ" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" +"QU" = ( +/obj/machinery/status_display/evac{ + pixel_x = -32 }, +/obj/item/kirbyplants/organic/plant21, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 }, @@ -542,12 +407,12 @@ ad ag ai hW -on +QU au au au au -ZZ +wG hW aG ag @@ -585,7 +450,7 @@ av av av av -aB +gS ap aI aN @@ -597,15 +462,15 @@ ah ac ad af -aW +Nn ap -as +DV aw ax ay ax af -uU +uH aX aO aZ @@ -623,7 +488,7 @@ au au au au -aD +HM ap aK aP @@ -656,12 +521,12 @@ ad ag ai he -zb +sq av av av av -Ns +My he aM ag diff --git a/_maps/shuttles/arrival_donut.dmm b/_maps/shuttles/arrival_donut.dmm index 73541b6d7b5b5..e8ff316a69e7d 100644 --- a/_maps/shuttles/arrival_donut.dmm +++ b/_maps/shuttles/arrival_donut.dmm @@ -92,7 +92,7 @@ h l h h -l +h h h b @@ -149,7 +149,7 @@ b e h h -n +h h h n diff --git a/_maps/shuttles/arrival_kilo.dmm b/_maps/shuttles/arrival_kilo.dmm index 423c05c936585..3fd328965deae 100644 --- a/_maps/shuttles/arrival_kilo.dmm +++ b/_maps/shuttles/arrival_kilo.dmm @@ -83,22 +83,8 @@ /obj/effect/turf_decal/bot, /obj/structure/chair/comfy/shuttle, /obj/machinery/status_display/evac/directional/north, -/obj/machinery/light/directional/north, /turf/open/floor/mineral/plastitanium, /area/shuttle/arrival) -"am" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/arrival) "an" = ( /obj/machinery/power/shuttle_engine/propulsion/left{ dir = 8 @@ -123,39 +109,6 @@ /obj/item/flashlight, /turf/open/floor/mineral/plastitanium, /area/shuttle/arrival) -"aq" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/arrival) -"ar" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/arrival) -"as" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/machinery/requests_console/directional/east{ - department = "Arrivals shuttle" - }, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/arrival) "at" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/stripes/corner{ @@ -178,46 +131,6 @@ }, /turf/open/floor/plating/airless, /area/shuttle/arrival) -"av" = ( -/obj/structure/rack, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/item/radio{ - pixel_x = -6; - pixel_y = 6 - }, -/obj/item/radio{ - pixel_x = 6; - pixel_y = 6 - }, -/obj/item/radio{ - pixel_y = 4 - }, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/arrival) -"aw" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/arrival) -"ax" = ( -/obj/effect/turf_decal/bot, -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/arrival) "ay" = ( /obj/machinery/requests_console{ department = "Arrival shuttle"; @@ -249,18 +162,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/mineral/plastitanium, /area/shuttle/arrival) -"aC" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/arrival) "aD" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/door/airlock/shuttle{ @@ -272,23 +173,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/mineral/plastitanium, /area/shuttle/arrival) -"aE" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/arrival) -"aF" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/arrival) "aG" = ( /obj/machinery/power/shuttle_engine/propulsion/right{ dir = 8 @@ -304,35 +188,6 @@ /obj/item/crowbar/red, /turf/open/floor/mineral/plastitanium, /area/shuttle/arrival) -"aI" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/arrival) -"aJ" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/arrival) -"aK" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/arrival) "aL" = ( /obj/machinery/status_display/ai, /turf/closed/wall/mineral/titanium, @@ -355,19 +210,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/shuttle/arrival) -"aO" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/arrival) "aP" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -383,23 +225,14 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/mineral/titanium/white, /area/shuttle/arrival) -"aR" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/machinery/vending/wallmed/directional/west{ - use_power = 0 - }, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/arrival) "aS" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/mineral/titanium/white, /area/shuttle/arrival) "aT" = ( /obj/machinery/requests_console/directional/east{ - department = "Arrivals shuttle" + department = "Arrivals shuttle"; + name = "Arrival Shuttle Requests Console" }, /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/mineral/titanium/white, @@ -524,7 +357,7 @@ aj rV aT aV -ax +aN ae "} (6,1,1) = {" diff --git a/_maps/shuttles/arrival_northstar.dmm b/_maps/shuttles/arrival_northstar.dmm index dfa6a54413d13..888a497bc581f 100644 --- a/_maps/shuttles/arrival_northstar.dmm +++ b/_maps/shuttles/arrival_northstar.dmm @@ -16,7 +16,8 @@ /area/shuttle/arrival) "d" = ( /obj/machinery/requests_console/directional/north{ - department = "Arrivals shuttle" + department = "Arrivals shuttle"; + name = "Arrival Shuttle Requests Console" }, /obj/structure/table/reinforced/plastitaniumglass, /obj/item/storage/medkit/regular{ @@ -97,7 +98,6 @@ /obj/effect/turf_decal/trimline/red/warning{ dir = 1 }, -/obj/machinery/light/red/directional/south, /turf/open/floor/pod/dark, /area/shuttle/arrival) "A" = ( @@ -145,7 +145,6 @@ /turf/open/floor/plating/airless, /area/shuttle/arrival) "J" = ( -/obj/item/radio/intercom/directional/south, /obj/effect/turf_decal/trimline/red/warning{ dir = 1 }, @@ -173,6 +172,11 @@ /obj/effect/turf_decal/trimline/red/warning, /turf/open/floor/pod, /area/shuttle/arrival) +"V" = ( +/obj/structure/chair/comfy/shuttle, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/catwalk_floor/iron_dark, +/area/shuttle/arrival) "W" = ( /obj/effect/turf_decal/trimline/red/corner, /turf/open/floor/pod/dark, @@ -240,7 +244,7 @@ Z "} (8,1,1) = {" t -F +V P b J diff --git a/_maps/shuttles/arrival_pubby.dmm b/_maps/shuttles/arrival_pubby.dmm index 1007d9d6495a7..8f2ecdab58c85 100644 --- a/_maps/shuttles/arrival_pubby.dmm +++ b/_maps/shuttles/arrival_pubby.dmm @@ -26,11 +26,6 @@ "f" = ( /turf/open/floor/mineral/titanium/blue, /area/shuttle/arrival) -"g" = ( -/obj/machinery/light/directional/north, -/obj/structure/sign/poster/official/enlist/directional/north, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/arrival) "h" = ( /obj/structure/closet/wardrobe/black, /turf/open/floor/mineral/titanium/blue, @@ -39,13 +34,6 @@ /obj/structure/closet/wardrobe/mixed, /turf/open/floor/mineral/titanium/blue, /area/shuttle/arrival) -"j" = ( -/obj/machinery/light/directional/north, -/obj/machinery/requests_console/directional/north{ - department = "Arrivals shuttle" - }, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/arrival) "k" = ( /obj/machinery/power/shuttle_engine/heater{ dir = 4 @@ -105,11 +93,6 @@ /obj/item/clothing/mask/breath, /turf/open/floor/mineral/titanium/blue, /area/shuttle/arrival) -"t" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/arrival) "u" = ( /obj/item/radio/intercom/directional/south, /obj/machinery/light/directional/south, @@ -121,9 +104,25 @@ }, /turf/open/floor/plating/airless, /area/shuttle/arrival) +"x" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) "C" = ( /turf/open/floor/mineral/titanium, /area/shuttle/arrival) +"P" = ( +/obj/machinery/requests_console/directional/north{ + department = "Arrivals shuttle"; + name = "Arrival Shuttle Requests Console" + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) +"Y" = ( +/obj/machinery/light/directional/north, +/obj/structure/sign/poster/official/enlist/directional/north, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) (1,1,1) = {" a @@ -167,10 +166,10 @@ c "} (6,1,1) = {" b -g +Y C C -t +x b "} (7,1,1) = {" @@ -199,7 +198,7 @@ d "} (10,1,1) = {" b -j +P o o u diff --git a/_maps/shuttles/cargo_birdboat.dmm b/_maps/shuttles/cargo_birdboat.dmm index a156971f6773c..1ebb942895953 100644 --- a/_maps/shuttles/cargo_birdboat.dmm +++ b/_maps/shuttles/cargo_birdboat.dmm @@ -116,11 +116,6 @@ }, /turf/open/floor/plating, /area/shuttle/supply) -"u" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/power/shuttle_engine/heater, -/turf/open/floor/plating/airless, -/area/shuttle/supply) "w" = ( /turf/template_noop, /area/template_noop) @@ -145,9 +140,10 @@ /obj/machinery/light/directional/north, /turf/open/floor/mineral/titanium/blue, /area/shuttle/supply) -"B" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/mineral/titanium, +"C" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/power/shuttle_engine/heater, +/turf/open/floor/plating/airless, /area/shuttle/supply) "G" = ( /obj/machinery/conveyor{ @@ -191,7 +187,7 @@ e P R n -B +n n g b @@ -206,7 +202,7 @@ n n n g -u +C y "} (4,1,1) = {" @@ -218,7 +214,7 @@ n n n g -u +C y "} (5,1,1) = {" @@ -230,7 +226,7 @@ n n n g -u +C y "} (6,1,1) = {" diff --git a/_maps/shuttles/cargo_birdshot.dmm b/_maps/shuttles/cargo_birdshot.dmm index 8ac8daf8f958a..4706a71d082d2 100644 --- a/_maps/shuttles/cargo_birdshot.dmm +++ b/_maps/shuttles/cargo_birdshot.dmm @@ -69,15 +69,6 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/supply) -"o" = ( -/obj/machinery/conveyor{ - dir = 5; - id = "QMLoad2" - }, -/obj/effect/turf_decal/stripes/box, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/mineral/titanium, -/area/shuttle/supply) "t" = ( /turf/closed/wall/mineral/titanium/nosmooth, /area/shuttle/supply) @@ -89,15 +80,6 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/supply) -"y" = ( -/obj/effect/turf_decal/stripes/box, -/obj/machinery/light/cold/directional/south, -/obj/machinery/conveyor{ - dir = 10; - id = "QMLoad" - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/supply) "z" = ( /obj/effect/turf_decal/stripes/box, /obj/machinery/conveyor/inverted{ @@ -156,6 +138,15 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/supply) +"J" = ( +/obj/effect/turf_decal/stripes/box, +/obj/machinery/conveyor{ + dir = 1; + id = "QMLoad" + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/mineral/titanium, +/area/shuttle/supply) "K" = ( /obj/effect/turf_decal/stripes/box, /obj/machinery/conveyor/inverted{ @@ -204,28 +195,19 @@ /obj/effect/turf_decal/stripes/box, /turf/open/floor/mineral/titanium, /area/shuttle/supply) -"S" = ( -/obj/effect/turf_decal/stripes/box, -/obj/machinery/light/cold/directional/south, -/obj/machinery/conveyor{ - dir = 9; - id = "QMLoad" - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/supply) "T" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/supply) "U" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/supply) -"V" = ( +"W" = ( /obj/machinery/conveyor{ - dir = 6; + dir = 1; id = "QMLoad2" }, /obj/effect/turf_decal/stripes/box, -/obj/machinery/light/cold/directional/north, +/obj/machinery/light/cold/directional/west, /turf/open/floor/mineral/titanium, /area/shuttle/supply) "X" = ( @@ -262,13 +244,13 @@ a (2,1,1) = {" T T -o -Z +X +W Z t M -M -S +J +w T T b @@ -304,13 +286,13 @@ a (5,1,1) = {" T T -V +R m i t P e -y +I T T b diff --git a/_maps/shuttles/cargo_box.dmm b/_maps/shuttles/cargo_box.dmm index f71371544df18..875efcf7b3816 100644 --- a/_maps/shuttles/cargo_box.dmm +++ b/_maps/shuttles/cargo_box.dmm @@ -23,20 +23,6 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/general, /turf/open/floor/plating, /area/shuttle/supply) -"h" = ( -/obj/machinery/button/door/directional/east{ - id = "QMLoaddoor2"; - name = "Loading Doors"; - pixel_y = 8 - }, -/obj/machinery/button/door/directional/east{ - id = "QMLoaddoor"; - name = "Loading Doors"; - pixel_y = -8 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/supply) "i" = ( /obj/machinery/door/airlock/titanium{ name = "Supply Shuttle Airlock" @@ -59,7 +45,7 @@ "l" = ( /turf/closed/wall/mineral/titanium/interior, /area/shuttle/supply) -"q" = ( +"p" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/machinery/power/shuttle_engine/heater, /turf/open/floor/plating/airless, @@ -79,14 +65,27 @@ /obj/machinery/power/shuttle_engine/propulsion/burst/right, /turf/open/floor/plating/airless, /area/shuttle/supply) -"w" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/supply) "x" = ( /obj/machinery/light/directional/west, /turf/open/floor/mineral/titanium/blue, /area/shuttle/supply) +"C" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/supply) +"F" = ( +/obj/machinery/button/door/directional/east{ + id = "QMLoaddoor2"; + name = "Loading Doors"; + pixel_y = 8 + }, +/obj/machinery/button/door/directional/east{ + id = "QMLoaddoor"; + name = "Loading Doors"; + pixel_y = -8 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/supply) (1,1,1) = {" b @@ -105,10 +104,10 @@ s (2,1,1) = {" b e +x e e e -x e e e @@ -127,12 +126,11 @@ e e e e -q +p u "} (4,1,1) = {" b -w e e e @@ -141,7 +139,8 @@ e e e e -q +e +p u "} (5,1,1) = {" @@ -155,7 +154,7 @@ e e e e -q +p u "} (6,1,1) = {" @@ -164,10 +163,10 @@ e e e e -h -e +F e e +C l b v diff --git a/_maps/shuttles/cargo_delta.dmm b/_maps/shuttles/cargo_delta.dmm index dee6dbaf44308..75b2b6cb23270 100644 --- a/_maps/shuttles/cargo_delta.dmm +++ b/_maps/shuttles/cargo_delta.dmm @@ -15,14 +15,6 @@ }, /turf/open/floor/iron, /area/shuttle/supply) -"d" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/shuttle/supply) "e" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -98,23 +90,6 @@ }, /turf/open/floor/iron, /area/shuttle/supply) -"p" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/button/door/directional/west{ - id = "cargoload"; - name = "Loading Doors"; - pixel_y = -8 - }, -/obj/machinery/button/door/directional/west{ - id = "cargounload"; - name = "Loading Doors"; - pixel_y = 8 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/shuttle/supply) "q" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -141,13 +116,6 @@ }, /turf/open/floor/plating, /area/shuttle/supply) -"t" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/iron, -/area/shuttle/supply) "u" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line, @@ -172,19 +140,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/shuttle/supply) -"z" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/power/shuttle_engine/heater, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating/airless, -/area/shuttle/supply) -"A" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/power/shuttle_engine/heater, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating/airless, -/area/shuttle/supply) "B" = ( /turf/template_noop, /area/template_noop) @@ -203,6 +158,51 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating/airless, /area/shuttle/supply) +"G" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/power/shuttle_engine/heater, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/shuttle/supply) +"P" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/power/shuttle_engine/heater, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/shuttle/supply) +"T" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/shuttle/supply) +"U" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/shuttle/supply) +"X" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/button/door/directional/west{ + id = "cargoload"; + name = "Loading Doors"; + pixel_y = -8 + }, +/obj/machinery/button/door/directional/west{ + id = "cargounload"; + name = "Loading Doors"; + pixel_y = 8 + }, +/turf/open/floor/iron, +/area/shuttle/supply) (1,1,1) = {" a @@ -221,13 +221,13 @@ B (2,1,1) = {" a b -g +U g o -p +X o o -t +T a a C @@ -243,12 +243,12 @@ h i u x -z +P D "} (4,1,1) = {" a -d +e i i i @@ -257,7 +257,7 @@ i h v x -A +G D "} (5,1,1) = {" @@ -271,7 +271,7 @@ h h v y -A +G D "} (6,1,1) = {" diff --git a/_maps/shuttles/cargo_pubby.dmm b/_maps/shuttles/cargo_pubby.dmm index d928d95ced20a..c3d064bc59d17 100644 --- a/_maps/shuttles/cargo_pubby.dmm +++ b/_maps/shuttles/cargo_pubby.dmm @@ -2,15 +2,6 @@ "a" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/supply) -"d" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/obj/machinery/conveyor{ - dir = 4; - id = "ShuttleLoad" - }, -/turf/open/floor/iron, -/area/shuttle/supply) "e" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/conveyor{ @@ -55,20 +46,10 @@ dir = 4 }, /area/shuttle/supply) -"o" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/chapel{ - dir = 8 - }, -/area/shuttle/supply) "q" = ( /obj/machinery/light/directional/east, /turf/open/floor/iron/dark, /area/shuttle/supply) -"r" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/mineral/titanium, -/area/shuttle/supply) "s" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/oil, @@ -132,6 +113,15 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating/airless, /area/shuttle/supply) +"I" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/conveyor{ + dir = 4; + id = "ShuttleLoad" + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/shuttle/supply) "J" = ( /obj/machinery/door/poddoor{ id = "cargounload"; @@ -148,12 +138,6 @@ dir = 1 }, /area/shuttle/supply) -"N" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/chapel{ - dir = 1 - }, -/area/shuttle/supply) "R" = ( /obj/docking_port/mobile/supply{ dir = 4 @@ -166,6 +150,15 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/general, /turf/open/floor/iron, /area/shuttle/supply) +"T" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/conveyor{ + dir = 8; + id = "ShuttleUnload" + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/shuttle/supply) "U" = ( /turf/open/floor/iron/chapel, /area/shuttle/supply) @@ -180,9 +173,9 @@ a k a a -r +a R -r +a a a J @@ -191,15 +184,15 @@ B "} (2,1,1) = {" a -e +I g s -o +X w -N +K X t -x +T a C "} @@ -219,7 +212,7 @@ D "} (4,1,1) = {" a -d +e j j w diff --git a/_maps/shuttles/emergency_asteroid.dmm b/_maps/shuttles/emergency_asteroid.dmm index 190db4d524078..9bfcf599bb27b 100644 --- a/_maps/shuttles/emergency_asteroid.dmm +++ b/_maps/shuttles/emergency_asteroid.dmm @@ -31,13 +31,6 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"al" = ( -/obj/machinery/door/airlock/titanium{ - name = "Emergency Shuttle Airlock" - }, -/obj/effect/mapping_helpers/airlock/access/all/security/brig, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "am" = ( /obj/machinery/power/shuttle_engine/propulsion{ dir = 8 @@ -64,34 +57,12 @@ "at" = ( /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"av" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) -"aw" = ( -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) -"ax" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "az" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/escape) "aB" = ( /turf/closed/wall/mineral/titanium/interior, /area/shuttle/escape) -"aE" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "aF" = ( /obj/machinery/suit_storage_unit, /turf/open/floor/mineral/titanium/yellow, @@ -135,20 +106,9 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "aN" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"aP" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Emergency Shuttle Brig" - }, -/obj/effect/mapping_helpers/airlock/access/all/security/brig, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) -"aQ" = ( -/obj/structure/bed, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "aR" = ( /obj/machinery/computer/station_alert{ dir = 4 @@ -199,12 +159,6 @@ }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"bb" = ( -/obj/machinery/computer/security{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "bc" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -308,20 +262,6 @@ /obj/structure/closet/emcloset, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"bw" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) -"bx" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "by" = ( /obj/structure/table, /obj/item/extinguisher, @@ -336,10 +276,6 @@ }, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) -"bC" = ( -/obj/item/radio/intercom/directional/west, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/escape) "bD" = ( /obj/structure/closet/secure_closet/medical2, /turf/open/floor/mineral/titanium/white, @@ -351,14 +287,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) -"bF" = ( -/obj/structure/table, -/obj/item/retractor, -/obj/item/hemostat, -/obj/item/scalpel, -/obj/item/surgicaldrill, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/escape) "bG" = ( /obj/structure/table/optable, /turf/open/floor/mineral/titanium/white, @@ -376,27 +304,74 @@ /obj/machinery/light/directional/south, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) -"bK" = ( -/obj/structure/chair/comfy/shuttle, -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) -"bM" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "bN" = ( /obj/machinery/light/directional/north, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) -"bP" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/titanium/blue, +"bR" = ( +/obj/structure/table, +/obj/item/retractor, +/obj/item/hemostat, +/obj/item/scalpel, +/obj/item/surgicaldrill, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/mineral/titanium/white, /area/shuttle/escape) +"fQ" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"hu" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) "hJ" = ( /obj/machinery/status_display/ai/directional/west, /turf/open/floor/mineral/titanium, /area/shuttle/escape) +"ke" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"oI" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Emergency Shuttle Brig" + }, +/obj/effect/mapping_helpers/airlock/access/all/security/brig, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"pA" = ( +/obj/machinery/computer/security{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"tb" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"Ay" = ( +/obj/structure/bed, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"BY" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/item/radio/intercom/directional/south, +/obj/machinery/light/directional/south, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) "Id" = ( /obj/machinery/status_display/evac/directional/west, /turf/open/floor/mineral/titanium, @@ -404,6 +379,13 @@ "Jx" = ( /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) +"JD" = ( +/obj/machinery/door/airlock/titanium{ + name = "Emergency Shuttle Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all/security/brig, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) "JM" = ( /obj/machinery/vending/wallmed{ name = "Emergency NanoMed"; @@ -411,6 +393,25 @@ }, /turf/closed/wall/mineral/titanium, /area/shuttle/escape) +"Mp" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/machinery/light/directional/south, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"Nd" = ( +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"QS" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) +"Te" = ( +/obj/machinery/light/floor, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) (1,1,1) = {" aa @@ -449,7 +450,7 @@ ac ac ac at -at +Te at ac ac @@ -539,7 +540,7 @@ ac aH at hJ -at +Te Id at at @@ -581,13 +582,13 @@ aa ai at at -at +Te at aZ ah aK at -bP +aS ac aa aa @@ -596,13 +597,13 @@ aa ah ah aB -bK +aK at aZ ah aK at -bw +BY ac aa aa @@ -656,13 +657,13 @@ aa ah ah aB -bK +aK at aZ ah aK at -bx +Mp ac aa aa @@ -671,13 +672,13 @@ aa aj at at -at +Te at aZ ah aK at -bP +aS ac aa aa @@ -719,7 +720,7 @@ ac aN at at -at +Te at at aN @@ -732,7 +733,7 @@ ac ac ac ah -aP +oI ah bi ah @@ -744,26 +745,26 @@ ac "} (23,1,1) = {" ac -av -aE -av -aw -bb +ke +fQ +hu +Nd +pA ac bp Jx Jx -bC -bF +QS +bR ac "} (24,1,1) = {" -al -aw -aw -aw -aw -aw +JD +Nd +Nd +Nd +Nd +Nd ah Jx Jx @@ -774,13 +775,13 @@ ah "} (25,1,1) = {" ac -ax -ax -ax -aw -bM +tb +tb +tb +Nd +Nd ac -bN +Jx Jx bz bD @@ -793,7 +794,7 @@ ac ac ac ah -aP +oI ac bq ah @@ -807,8 +808,8 @@ aa aa ac ac -aQ -aw +Ay +Nd ah Jx bs diff --git a/_maps/shuttles/emergency_bar.dmm b/_maps/shuttles/emergency_bar.dmm index 5f248c3846090..de6fad40387dc 100644 --- a/_maps/shuttles/emergency_bar.dmm +++ b/_maps/shuttles/emergency_bar.dmm @@ -130,19 +130,6 @@ /obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"aD" = ( -/obj/machinery/flasher/directional/north{ - id = "cockpit_flasher" - }, -/obj/item/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/shuttle/escape) "aE" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, @@ -272,14 +259,6 @@ /obj/effect/spawner/random/entertainment/gambling, /turf/open/floor/iron/grimy, /area/shuttle/escape) -"bc" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/turf/open/floor/iron/grimy, -/area/shuttle/escape) "bd" = ( /obj/structure/table/wood/shuttle_bar{ boot_dir = 10 @@ -393,16 +372,6 @@ /obj/machinery/power/shuttle_engine/propulsion, /turf/open/floor/plating/airless, /area/shuttle/escape) -"bG" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/shuttle/escape) "bH" = ( /turf/open/floor/iron/grimy, /area/shuttle/escape) @@ -474,13 +443,6 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"bT" = ( -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/shuttle/escape) "bU" = ( /obj/structure/table, /obj/item/storage/medkit/fire, @@ -504,21 +466,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/grimy, /area/shuttle/escape) -"bX" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/shuttle/escape) -"bY" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/shuttle/escape) -"bZ" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/shuttle/escape) "ca" = ( /obj/machinery/light/directional/south, /obj/machinery/vending/wallmed/directional/south{ @@ -540,11 +487,48 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/shuttle/escape) +"eK" = ( +/obj/item/kirbyplants/organic/plant10, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/shuttle/escape) +"zw" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/grimy, +/area/shuttle/escape) "EL" = ( /obj/machinery/status_display/evac/directional/south, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/shuttle/escape) +"Nt" = ( +/obj/machinery/flasher/directional/north{ + id = "cockpit_flasher" + }, +/obj/item/kirbyplants/organic/plant21{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/shuttle/escape) +"UI" = ( +/obj/item/kirbyplants/organic/plant21{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/shuttle/escape) +"ZL" = ( +/obj/item/kirbyplants/organic/plant21{ + pixel_x = -3; + pixel_y = 3 + }, +/turf/open/floor/iron/grimy, +/area/shuttle/escape) (1,1,1) = {" aa @@ -580,13 +564,13 @@ aC aH aL ab -bY -bH +aE +zw aZ -bc +ZL aZ -bH -bZ +zw +aE ab bp bs @@ -672,10 +656,10 @@ ah an at ab -aD +Nt +aE aE aE -bX aE aE aE @@ -720,7 +704,7 @@ ai ao ao ab -bG +UI aE aO aR @@ -777,7 +761,7 @@ aY aj bN be -bT +eK bk ac br diff --git a/_maps/shuttles/emergency_bballhooper.dmm b/_maps/shuttles/emergency_bballhooper.dmm index f8020754ec338..cb5934369714d 100644 --- a/_maps/shuttles/emergency_bballhooper.dmm +++ b/_maps/shuttles/emergency_bballhooper.dmm @@ -1,20 +1,12 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"ae" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/structure/hoop{ - dir = 8; - name = "Hopping Jezzertons" - }, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 4 +"ak" = ( +/obj/structure/chair{ + desc = "Do keep in mind, we will assess your account 2000 credits for sitting in this chair upon arrival."; + dir = 1; + name = "Ringside Seat" }, -/turf/open/floor/iron/dark, -/area/shuttle/escape) -"bc" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/mineral/titanium/blue, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/mineral/titanium, /area/shuttle/escape) "bx" = ( /obj/effect/turf_decal/tile/neutral/anticorner/contrasted, @@ -56,16 +48,6 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"ea" = ( -/obj/machinery/light/cold/directional/south, -/obj/structure/chair{ - desc = "Do keep in mind, we will assess your account 2000 credits for sitting in this chair upon arrival."; - dir = 1; - name = "Ringside Seat" - }, -/obj/machinery/status_display/evac/directional/south, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) "eg" = ( /obj/effect/turf_decal/trimline/blue/filled/corner, /obj/effect/turf_decal/trimline/blue/line{ @@ -80,6 +62,23 @@ }, /turf/open/floor/iron, /area/shuttle/escape) +"eJ" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"eT" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/item/restraints/handcuffs{ + pixel_x = -5; + pixel_y = -7 + }, +/obj/structure/chair/stool/directional/south{ + can_buckle = 1; + desc = "GET THAT BAD PLAYA SAT DOWN. MAKE SURE THEY ARE STILL ORIENTED IN THE DIRECTION OF THE GAME, HOWEVER."; + name = "FOOLS-SIT-DOWNER" + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) "ff" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 4 @@ -93,6 +92,17 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) +"fH" = ( +/obj/machinery/light/cold/directional/south, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"fL" = ( +/obj/machinery/stasis{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) "gl" = ( /obj/machinery/light/small/red/directional/east, /turf/open/floor/mineral/plastitanium/red, @@ -188,6 +198,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) +"ja" = ( +/obj/machinery/computer/emergency_shuttle{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted/frosted/spawner/directional/north, +/turf/open/floor/mineral/titanium/purple, +/area/shuttle/escape) "jw" = ( /obj/machinery/door/airlock/titanium{ name = "Emergency Shuttle Airlock" @@ -197,6 +214,18 @@ }, /turf/open/floor/plating, /area/shuttle/escape) +"jA" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/table, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/clothing/shoes/swagshoes, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"jR" = ( +/obj/structure/chair/comfy/shuttle, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/mineral/titanium/purple, +/area/shuttle/escape) "kL" = ( /obj/effect/turf_decal/stripes/white/line, /obj/effect/turf_decal/trimline/green/warning, @@ -230,12 +259,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) -"mV" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/table, -/obj/item/bonesetter, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "oB" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -283,6 +306,30 @@ /obj/item/storage/fancy/donut_box, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) +"qN" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/table, +/obj/item/bonesetter, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"ra" = ( +/obj/structure/rack{ + name = "SPARE B-BALLS" + }, +/obj/item/toy/basketball{ + pixel_x = 8; + pixel_y = -3 + }, +/obj/item/toy/basketball{ + pixel_x = -5; + pixel_y = -3 + }, +/obj/item/toy/basketball{ + pixel_x = 1; + pixel_y = 6 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) "rb" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/reagent_dispensers/watertank{ @@ -291,18 +338,6 @@ }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"sa" = ( -/obj/structure/table, -/obj/machinery/recharger, -/obj/item/paper/crumpled{ - default_raw_text = "HOLY FUCKING SHIT THIS WAS A MISTAKE -KY"; - name = "The Commisioner's Note"; - pixel_x = -9; - pixel_y = 9 - }, -/obj/structure/fireaxecabinet/directional/east, -/turf/open/floor/mineral/titanium/purple, -/area/shuttle/escape) "st" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 1 @@ -313,9 +348,19 @@ /obj/effect/turf_decal/trimline/blue/filled/shrink_ccw, /turf/open/floor/iron, /area/shuttle/escape) -"su" = ( -/obj/machinery/light/cold/directional/north, -/turf/open/floor/mineral/plastitanium/red, +"sI" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/structure/hoop{ + dir = 8; + name = "Hopping Jezzertons" + }, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, /area/shuttle/escape) "sQ" = ( /obj/machinery/door/airlock/public/glass{ @@ -324,28 +369,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"td" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/item/restraints/handcuffs{ - pixel_x = -5; - pixel_y = -7 - }, -/obj/structure/chair/stool/directional/south{ - can_buckle = 1; - desc = "GET THAT BAD PLAYA SAT DOWN. MAKE SURE THEY ARE STILL ORIENTED IN THE DIRECTION OF THE GAME, HOWEVER."; - name = "FOOLS-SIT-DOWNER" - }, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) -"tQ" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) -"uk" = ( -/obj/structure/window/reinforced/tinted/frosted/spawner/directional/north, -/obj/structure/window/reinforced/tinted/frosted/spawner/directional/west, -/turf/open/floor/mineral/titanium/purple, -/area/shuttle/escape) "uF" = ( /obj/structure/rack, /obj/item/latexballoon{ @@ -353,10 +376,6 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"vt" = ( -/obj/machinery/light/cold/directional/north, -/turf/open/floor/mineral/titanium/purple, -/area/shuttle/escape) "vu" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 8 @@ -391,8 +410,10 @@ }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"yG" = ( +"yb" = ( /obj/structure/window/reinforced/tinted/frosted/spawner/directional/north, +/obj/structure/table, +/obj/item/reagent_containers/cup/glass/trophy/gold_cup, /turf/open/floor/mineral/titanium/purple, /area/shuttle/escape) "yJ" = ( @@ -405,6 +426,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) +"yV" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) "zh" = ( /obj/machinery/flasher/directional/west{ id = "shuttle_flasher"; @@ -445,31 +470,6 @@ }, /turf/open/floor/mineral/titanium/purple, /area/shuttle/escape) -"Ba" = ( -/obj/structure/table, -/obj/machinery/light/small/directional/west, -/obj/item/storage/medkit/fire{ - pixel_x = -4; - pixel_y = 3 - }, -/obj/item/storage/medkit/regular{ - pixel_x = 3; - pixel_y = 3 - }, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) -"By" = ( -/obj/machinery/door/window/left/directional/north{ - name = "MEDICAL INFIRMARY" - }, -/obj/machinery/shower/directional/west{ - name = "emergency shower" - }, -/obj/machinery/vending/wallmed/directional/east{ - name = "Hooper's First Medical Kit" - }, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "BJ" = ( /obj/machinery/status_display/evac/directional/west, /obj/machinery/door/airlock/command/glass{ @@ -506,15 +506,6 @@ /obj/effect/decal/cleanable/oil/slippery, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"Ce" = ( -/obj/machinery/light/cold/directional/south, -/obj/structure/chair{ - desc = "Do keep in mind, we will assess your account 2000 credits for sitting in this chair upon arrival."; - dir = 1; - name = "Ringside Seat" - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) "Cf" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 6 @@ -525,17 +516,92 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) -"Db" = ( -/obj/effect/turf_decal/tile/green/diagonal_edge, -/obj/item/toy/basketball, -/turf/open/floor/iron/diagonal, +"CH" = ( +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = 3 + }, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = 3 + }, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = 3 + }, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = 3 + }, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = 3 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/head/utility/hardhat/orange{ + name = "protective hat"; + pixel_y = 9 + }, +/obj/item/clothing/head/utility/hardhat/orange{ + name = "protective hat"; + pixel_y = 9 + }, +/obj/item/clothing/head/utility/hardhat/orange{ + name = "protective hat"; + pixel_y = 9 + }, +/obj/item/clothing/head/utility/hardhat/orange{ + name = "protective hat"; + pixel_y = 9 + }, +/obj/item/clothing/head/utility/hardhat/orange{ + name = "protective hat"; + pixel_y = 9 + }, +/obj/structure/closet/crate{ + name = "lifejackets" + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/mineral/titanium, /area/shuttle/escape) -"DO" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/table, -/obj/item/reagent_containers/spray/cleaner, -/obj/item/clothing/shoes/swagshoes, -/turf/open/floor/mineral/titanium/blue, +"DP" = ( +/obj/structure/window/reinforced/tinted/frosted/spawner/directional/north, +/obj/structure/window/reinforced/tinted/frosted/spawner/directional/west, +/turf/open/floor/mineral/titanium/purple, /area/shuttle/escape) "DW" = ( /obj/effect/turf_decal/stripes/white/line, @@ -557,23 +623,6 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) -"Fp" = ( -/obj/machinery/light/cold/directional/north, -/obj/structure/rack{ - name = "Referee's Gear" - }, -/obj/item/clothing/suit/hazardvest{ - name = "Referee's Vest" - }, -/obj/item/clothing/mask/whistle{ - name = "Referee's Whistle" - }, -/obj/item/coin/titanium{ - pixel_y = 2 - }, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) "Fs" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 1 @@ -584,12 +633,40 @@ /obj/effect/turf_decal/trimline/red/filled/shrink_cw, /turf/open/floor/iron, /area/shuttle/escape) +"FN" = ( +/obj/structure/table, +/obj/item/storage/medkit/fire{ + pixel_x = -4; + pixel_y = 3 + }, +/obj/item/storage/medkit/regular{ + pixel_x = 3; + pixel_y = 3 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) "GQ" = ( /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 4 }, /turf/open/floor/iron, /area/shuttle/escape) +"HB" = ( +/obj/structure/rack{ + name = "Referee's Gear" + }, +/obj/item/clothing/suit/hazardvest{ + name = "Referee's Vest" + }, +/obj/item/clothing/mask/whistle{ + name = "Referee's Whistle" + }, +/obj/item/coin/titanium{ + pixel_y = 2 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) "HO" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 1 @@ -600,10 +677,9 @@ /obj/effect/turf_decal/trimline/red/filled/arrow_cw, /turf/open/floor/iron, /area/shuttle/escape) -"Ia" = ( -/obj/machinery/stasis{ - dir = 4 - }, +"It" = ( +/obj/structure/closet/emcloset, +/obj/item/crowbar, /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) @@ -618,23 +694,44 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) -"Ja" = ( -/obj/structure/closet/emcloset, -/obj/item/crowbar, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/mineral/titanium/blue, +"Ji" = ( +/obj/structure/window/reinforced/tinted/frosted/spawner/directional/north, +/turf/open/floor/mineral/titanium/purple, /area/shuttle/escape) "Jv" = ( /turf/open/floor/iron, /area/shuttle/escape) -"JR" = ( +"JG" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/structure/hoop{ + dir = 4; + name = "A La Penners" + }, +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"JW" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 10 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"Kq" = ( /obj/structure/table, /obj/item/clothing/head/utility/hardhat/red{ name = "A La Penners' Helmet"; pixel_x = 8; pixel_y = -5 }, -/obj/machinery/light/cold/directional/north, /obj/item/clothing/head/utility/hardhat/red{ name = "A La Penners' Helmet"; pixel_x = 8; @@ -663,16 +760,6 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"JW" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 5 - }, -/obj/effect/turf_decal/trimline/red/filled/warning{ - dir = 10 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "Ku" = ( /obj/effect/turf_decal/stripes/white/line, /obj/effect/turf_decal/trimline/blue/warning, @@ -688,13 +775,11 @@ "KW" = ( /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape) -"MD" = ( -/obj/machinery/light/cold/directional/east, -/obj/machinery/computer/emergency_shuttle{ - dir = 8 - }, -/obj/structure/window/reinforced/tinted/frosted/spawner/directional/north, -/turf/open/floor/mineral/titanium/purple, +"MC" = ( +/obj/effect/turf_decal/tile/green/diagonal_edge, +/obj/item/toy/basketball, +/obj/machinery/light/floor, +/turf/open/floor/iron/diagonal, /area/shuttle/escape) "MH" = ( /obj/machinery/door/airlock/titanium{ @@ -717,29 +802,41 @@ "NO" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/escape) -"Oq" = ( -/obj/machinery/light/cold/directional/north, -/obj/structure/rack{ - name = "SPARE B-BALLS" - }, -/obj/item/toy/basketball{ - pixel_x = 8; - pixel_y = -3 - }, -/obj/item/toy/basketball{ - pixel_x = -5; - pixel_y = -3 - }, -/obj/item/toy/basketball{ - pixel_x = 1; - pixel_y = 6 +"NX" = ( +/obj/structure/table, +/obj/machinery/recharger, +/obj/item/paper/crumpled{ + default_raw_text = "HOLY FUCKING SHIT THIS WAS A MISTAKE -KY"; + name = "The Commisioner's Note"; + pixel_x = -9; + pixel_y = 9 }, -/turf/open/floor/mineral/titanium, +/obj/structure/fireaxecabinet/directional/east, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/mineral/titanium/purple, /area/shuttle/escape) "OK" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/shuttle/escape) +"OX" = ( +/obj/machinery/stasis{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/light/small/directional/west, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"Pd" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/chair/stool/directional/south{ + can_buckle = 1; + desc = "GET THAT BAD PLAYA SAT DOWN. MAKE SURE THEY ARE STILL ORIENTED IN THE DIRECTION OF THE GAME, HOWEVER."; + name = "FOOLS-SIT-DOWNER" + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) "Pe" = ( /obj/effect/turf_decal/stripes/white/line, /obj/effect/turf_decal/trimline/red/filled/warning{ @@ -763,19 +860,6 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/plating/airless, /area/shuttle/escape) -"Rh" = ( -/obj/structure/window/reinforced/tinted/frosted/spawner/directional/north, -/obj/structure/table, -/obj/item/reagent_containers/cup/glass/trophy/gold_cup, -/turf/open/floor/mineral/titanium/purple, -/area/shuttle/escape) -"Sd" = ( -/obj/machinery/stasis{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "Sv" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 8 @@ -833,19 +917,6 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"Tu" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/structure/hoop{ - dir = 4; - name = "A La Penners" - }, -/obj/effect/turf_decal/trimline/red/filled/warning{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "Ty" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -858,10 +929,6 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) -"TH" = ( -/obj/machinery/light/cold/directional/west, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) "Ua" = ( /obj/effect/turf_decal/stripes/white/line, /obj/effect/turf_decal/trimline/blue/filled/warning, @@ -898,6 +965,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) +"XF" = ( +/obj/machinery/door/window/left/directional/north{ + name = "MEDICAL INFIRMARY" + }, +/obj/machinery/shower/directional/west{ + name = "emergency shower" + }, +/obj/machinery/vending/wallmed/directional/east{ + name = "Hooper's First Medical Kit" + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) "YB" = ( /obj/effect/decal/cleanable/blood, /turf/open/floor/mineral/plastitanium/red, @@ -915,16 +995,6 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) -"YS" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/chair/stool/directional/south{ - can_buckle = 1; - desc = "GET THAT BAD PLAYA SAT DOWN. MAKE SURE THEY ARE STILL ORIENTED IN THE DIRECTION OF THE GAME, HOWEVER."; - name = "FOOLS-SIT-DOWNER" - }, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) (1,1,1) = {" NO @@ -952,7 +1022,7 @@ Qy Qy Qy Qy -TH +Qy Qy Qy KL @@ -962,9 +1032,9 @@ Tf "} (3,1,1) = {" NO -KW +yV NO -gY +CH Qy Qy Qy @@ -979,17 +1049,17 @@ Tf "} (4,1,1) = {" NO -su +KW IJ NO IJ -JR +Kq vz vz Qy vz vz -Qy +fH NO QW Tf @@ -999,14 +1069,14 @@ go KW sQ zh -td +eT Qy Cf Sv -Tu +JG BL JW -Ce +bF NO QW Tf @@ -1016,7 +1086,7 @@ go KW ca YB -YS +Pd Qy yJ zC @@ -1051,22 +1121,22 @@ QN IJ NO IJ -Oq +ra Fs Jv Jv Jv DW -Ce +bF NO QW Tf "} (9,1,1) = {" NO -vt +QN BJ -qL +jR go Qy HO @@ -1082,7 +1152,7 @@ Tf (10,1,1) = {" go QN -uk +DP qL go Qy @@ -1099,16 +1169,16 @@ Tf (11,1,1) = {" go QN -Rh +yb qL go Qy pC OK -Db +MC OK kL -ea +ak NO QW Tf @@ -1116,7 +1186,7 @@ Tf (12,1,1) = {" go QN -yG +Ji qL go Qy @@ -1133,8 +1203,8 @@ Tf (13,1,1) = {" NO AW -MD -sa +ja +NX go Qy zB @@ -1153,13 +1223,13 @@ QN IJ NO IJ -Fp +HB st Jv Jv Jv Ku -Ce +bF NO QW Tf @@ -1167,9 +1237,9 @@ Tf (15,1,1) = {" NO Uh -Sd -Ba -Ia +OX +FN +fL Qy Ut vu @@ -1186,7 +1256,7 @@ go Uh QD Uh -bc +eJ Qy pZ eg @@ -1207,10 +1277,10 @@ Uh Qy mq ff -ae +sI YF cD -Ce +bF NO QW Tf @@ -1220,14 +1290,14 @@ go Uh qM Uh -DO +jA Qy df df Qy df df -Qy +fH NO QW Tf @@ -1237,7 +1307,7 @@ NO Uh rb Uh -mV +qN uF Qy Qy @@ -1252,9 +1322,9 @@ Tf (20,1,1) = {" NO Uh -By -tQ -Ja +XF +Uh +It Tg Qy Qy diff --git a/_maps/shuttles/emergency_birdboat.dmm b/_maps/shuttles/emergency_birdboat.dmm index 51619af7e3854..41860e3beabd8 100644 --- a/_maps/shuttles/emergency_birdboat.dmm +++ b/_maps/shuttles/emergency_birdboat.dmm @@ -46,21 +46,10 @@ "aj" = ( /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"ak" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "al" = ( /obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"am" = ( -/obj/structure/chair/comfy/shuttle, -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "an" = ( /obj/structure/table/optable, /obj/item/surgical_drapes, @@ -108,16 +97,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"ax" = ( -/obj/structure/table, -/obj/machinery/recharger{ - active_power_usage = 0; - idle_power_usage = 0; - pixel_y = 4; - use_power = 0 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "ay" = ( /obj/structure/table, /obj/item/storage/box/handcuffs, @@ -134,12 +113,6 @@ /obj/machinery/door/airlock/public/glass, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) -"aB" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) "aC" = ( /turf/open/floor/mineral/titanium, /area/shuttle/escape) @@ -239,13 +212,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) -"aT" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/escape) "aU" = ( /obj/structure/table/glass, /obj/item/storage/medkit/brute{ @@ -282,12 +248,36 @@ /obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/mineral/titanium, /area/shuttle/escape/brig) +"eo" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/machinery/light/directional/south, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) "iP" = ( /obj/machinery/vending/wallmed/directional/south{ use_power = 0 }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) +"Fq" = ( +/obj/item/kirbyplants/organic/plant22, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"Jy" = ( +/obj/item/kirbyplants/organic/plant21, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"SP" = ( +/obj/structure/table, +/obj/machinery/recharger{ + active_power_usage = 0; + idle_power_usage = 0; + pixel_y = 4; + use_power = 0 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) (1,1,1) = {" aa @@ -310,13 +300,13 @@ aa ab ah aq -ak +Fq ac -aB +Jy aH aH aH -aB +Jy ah ab aa @@ -372,16 +362,16 @@ aa (6,1,1) = {" aa ab -ak +Fq aC -ak +Fq ab aF aI aL aC aC -aT +aS ah ab "} @@ -398,7 +388,7 @@ aC aC aC aC -aB +eo ab "} (8,1,1) = {" @@ -408,7 +398,7 @@ al at at ac -aB +Jy aC aC aC @@ -436,7 +426,7 @@ ac (10,1,1) = {" aa ab -am +al at at ac @@ -454,7 +444,7 @@ aa ab al at -ax +SP ab aC aC @@ -478,7 +468,7 @@ aO aP aC aC -aB +Jy ab "} (13,1,1) = {" diff --git a/_maps/shuttles/emergency_birdshot.dmm b/_maps/shuttles/emergency_birdshot.dmm index 282d9e9b9abaf..20ffeb679d7d8 100644 --- a/_maps/shuttles/emergency_birdshot.dmm +++ b/_maps/shuttles/emergency_birdshot.dmm @@ -12,13 +12,6 @@ "ax" = ( /turf/closed/wall/mineral/titanium/overspace, /area/shuttle/escape) -"aJ" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/mineral/titanium/yellow, -/area/shuttle/escape) "aQ" = ( /obj/effect/decal/cleanable/insectguts, /turf/open/floor/mineral/plastitanium/red, @@ -55,13 +48,6 @@ /obj/effect/decal/cleanable/oil/streak, /turf/open/floor/glass/reinforced, /area/shuttle/escape) -"cK" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/mineral/titanium/yellow, -/area/shuttle/escape) "cX" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/mineral/titanium/tiled, @@ -156,6 +142,12 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) +"gn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) "gz" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/mapping_helpers/broken_floor, @@ -169,15 +161,38 @@ /obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/mineral/titanium, /area/shuttle/escape) +"gP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/item/trash/can/food/pine_nuts, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) "ho" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/escape/brig) +"hs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/light/small/directional/west, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) "hF" = ( /obj/machinery/door/airlock/public/glass{ name = "Emergency Shuttle Door" }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) +"ib" = ( +/obj/machinery/light/small/directional/north, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/item/kirbyplants/organic/applebush, +/obj/item/trash/boritos/purple, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) "ig" = ( /turf/open/floor/glass/reinforced, /area/shuttle/escape) @@ -197,12 +212,6 @@ /obj/effect/decal/cleanable/glass, /turf/open/floor/glass/reinforced, /area/shuttle/escape) -"jA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/mineral/titanium/yellow, -/area/shuttle/escape) "kj" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/mineral/titanium, @@ -312,6 +321,12 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) +"oN" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/glass/reinforced, +/area/shuttle/escape) "oZ" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/rack, @@ -373,6 +388,10 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) +"qj" = ( +/obj/machinery/light/floor, +/turf/open/floor/mineral/titanium/tiled/white, +/area/shuttle/escape) "qB" = ( /obj/structure/chair/comfy/shuttle{ dir = 8 @@ -421,7 +440,7 @@ /area/shuttle/escape/brig) "tH" = ( /obj/item/trash/pistachios, -/obj/item/roller{ +/obj/item/emergency_bed{ pixel_x = -5 }, /turf/open/floor/mineral/titanium/white, @@ -440,6 +459,12 @@ }, /turf/open/floor/mineral/titanium/tiled, /area/shuttle/escape) +"uz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) "vk" = ( /obj/machinery/power/shuttle_engine/propulsion, /turf/open/floor/plating/airless, @@ -488,15 +513,6 @@ /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape/brig) -"xN" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/obj/item/trash/boritos/purple, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) "ye" = ( /obj/machinery/computer/security{ dir = 8 @@ -549,23 +565,19 @@ /obj/structure/window/reinforced/survival_pod/spawner/directional/south, /turf/open/floor/glass/reinforced, /area/shuttle/escape) -"AQ" = ( -/obj/machinery/light/small/directional/north, -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/obj/effect/decal/cleanable/garbage{ - pixel_x = -5; - pixel_y = 2 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) "AR" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/table, /obj/item/defibrillator/loaded, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) +"AV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) "AZ" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/light/small/directional/east, @@ -605,23 +617,9 @@ }, /turf/open/floor/mineral/titanium/tiled/blue, /area/shuttle/escape) -"Cv" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/mineral/titanium/yellow, -/area/shuttle/escape) "De" = ( /turf/open/floor/mineral/titanium/tiled, /area/shuttle/escape) -"Dy" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/glass/reinforced, -/area/shuttle/escape) "DH" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/mineral/titanium, @@ -669,14 +667,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"GJ" = ( -/obj/item/trash/peanuts{ - pixel_x = 15; - pixel_y = -9 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/mineral/titanium/tiled/blue, -/area/shuttle/escape) "Hn" = ( /obj/structure/chair/comfy/shuttle{ dir = 8 @@ -739,12 +729,11 @@ /obj/structure/window/reinforced/survival_pod/spawner/directional/north, /turf/open/floor/glass/reinforced, /area/shuttle/escape) -"Jc" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 +"IQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 }, -/obj/machinery/light/small/broken/directional/west, -/turf/open/floor/glass/reinforced, +/turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "Ju" = ( /turf/open/floor/mineral/titanium/blue, @@ -754,9 +743,15 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) +"Kh" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/glass/reinforced, +/area/shuttle/escape) "Ko" = ( /obj/structure/table/optable, -/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/item/surgery_tray/full, /obj/item/clothing/mask/surgical, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/mineral/titanium/white, @@ -771,14 +766,14 @@ "KJ" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/escape/brig) -"Lx" = ( +"Ll" = ( /obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 5 +/obj/item/kirbyplants/organic/applebush, +/obj/effect/decal/cleanable/garbage{ + pixel_x = -5; + pixel_y = 2 }, -/obj/item/trash/can/food/pine_nuts, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/mineral/titanium/yellow, +/turf/open/floor/mineral/titanium, /area/shuttle/escape) "Ly" = ( /obj/effect/mapping_helpers/broken_floor, @@ -869,6 +864,13 @@ "Sm" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/escape) +"Sz" = ( +/obj/item/trash/peanuts{ + pixel_x = 15; + pixel_y = -9 + }, +/turf/open/floor/mineral/titanium/tiled/blue, +/area/shuttle/escape) "SA" = ( /obj/structure/sink/directional/south, /obj/structure/mirror/directional/north, @@ -878,13 +880,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/shuttle/escape) -"Tv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/mineral/titanium/yellow, -/area/shuttle/escape) "TP" = ( /obj/structure/chair/comfy/shuttle{ dir = 8 @@ -1046,10 +1041,10 @@ rZ LX rZ LX -aJ +uz Kp -Tv -cK +hs +IQ LX en LX @@ -1095,7 +1090,7 @@ ax LX LX LX -AQ +Ll DH gN BO @@ -1170,10 +1165,10 @@ rZ LX rZ LX -Lx -jA +gP +AV Xd -Cv +gn LX LX LX @@ -1233,7 +1228,7 @@ mU mU mp ig -Jc +Kh Uh mU nQ @@ -1246,8 +1241,8 @@ nQ (9,1,1) = {" rZ BH -MW -GJ +qj +Sz rZ nQ nQ @@ -1295,7 +1290,7 @@ mU mU Vo jt -Dy +oN IK mU nQ @@ -1405,7 +1400,7 @@ ax LX LX LX -xN +ib ab gN dM diff --git a/_maps/shuttles/emergency_box.dmm b/_maps/shuttles/emergency_box.dmm index 2602fb0c1d31b..38cdf4e6fecd4 100644 --- a/_maps/shuttles/emergency_box.dmm +++ b/_maps/shuttles/emergency_box.dmm @@ -110,20 +110,9 @@ /obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"aB" = ( -/obj/machinery/flasher/directional/north{ - id = "cockpit_flasher" - }, -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "aC" = ( /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"aD" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "aE" = ( /obj/structure/table, /obj/item/storage/medkit/fire, @@ -134,18 +123,6 @@ /obj/item/crowbar, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"aF" = ( -/obj/machinery/button/flasher{ - id = "shuttle_flasher"; - pixel_x = -24; - pixel_y = -6 - }, -/obj/machinery/light/small/directional/west, -/obj/machinery/flasher/directional/west{ - id = "shuttle_flasher" - }, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "aG" = ( /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) @@ -195,20 +172,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"aS" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) -"aT" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "aV" = ( /obj/machinery/door/airlock/titanium{ name = "Emergency Shuttle Airlock" @@ -262,11 +225,6 @@ /obj/structure/closet/crate, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) -"bi" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/power/shuttle_engine/heater, -/turf/open/floor/plating/airless, -/area/shuttle/escape) "bj" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/escape) @@ -274,23 +232,6 @@ /obj/machinery/power/shuttle_engine/propulsion, /turf/open/floor/plating/airless, /area/shuttle/escape) -"bl" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) -"bm" = ( -/obj/structure/table, -/obj/machinery/light/directional/west, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) -"bn" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) -"bo" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) "bp" = ( /obj/machinery/light/directional/south, /obj/machinery/status_display/evac/directional/south, @@ -314,9 +255,21 @@ }, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) +"cY" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/power/shuttle_engine/heater, +/turf/open/floor/plating/airless, +/area/shuttle/escape) "ga" = ( /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) +"iN" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) "jA" = ( /obj/machinery/camera/autoname{ dir = 5 @@ -335,20 +288,68 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) +"qJ" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"rX" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) "Dk" = ( /obj/machinery/vending/wallmed/directional/north{ use_power = 0 }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"Nt" = ( +"Lq" = ( +/obj/machinery/button/flasher{ + id = "shuttle_flasher"; + pixel_x = -24; + pixel_y = -6 + }, +/obj/machinery/flasher/directional/west{ + id = "shuttle_flasher" + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"LQ" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"Rm" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"SX" = ( +/obj/structure/closet/emcloset, /obj/machinery/status_display/evac/directional/north, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) +"Xw" = ( +/obj/machinery/flasher/directional/north{ + id = "cockpit_flasher" + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) "XC" = ( /obj/structure/closet/emcloset, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) +"Yk" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) (1,1,1) = {" aa @@ -381,16 +382,16 @@ ad ad ad aA -aF +Lq pW ad -bn -ao -ao +aC +iN ao ao ao -bo +iN +aC ad bb bq @@ -406,7 +407,7 @@ aq ad aA aG -aJ +qJ ad aQ aC @@ -419,7 +420,7 @@ ad bb bb bf -bi +cY bk "} (4,1,1) = {" @@ -433,17 +434,17 @@ aG aJ ad aC -aS -aS -aS -aS -aS +rX +rX +rX +rX +rX aC aX bb bb bg -bi +cY bk "} (5,1,1) = {" @@ -457,17 +458,17 @@ aH ac bj Dk -aT -aT -aT -aT -aT +Yk +Yk +Yk +Yk +Yk jA ad bc br bg -bi +cY bk "} (6,1,1) = {" @@ -476,10 +477,10 @@ ah aC at ad -aB +Xw aC aK -bm +aM aC aC aC @@ -491,7 +492,7 @@ ad ad ad ad -bi +cY bk "} (7,1,1) = {" @@ -505,17 +506,17 @@ aC ao aM aC -aS -aS -aS -aS -aS +rX +rX +rX +rX +rX aC ac XC bs XC -bi +cY bk "} (8,1,1) = {" @@ -524,22 +525,22 @@ ai ao ao ad -Nt +LQ aC aM aM aC -aT -aT -aT -aT -aT +Yk +Yk +Yk +Yk +Yk aC aZ ga ga ga -bi +cY bk "} (9,1,1) = {" @@ -548,7 +549,7 @@ ae ap au ad -aD +SX aC aC aC @@ -563,7 +564,7 @@ ac ga ga ga -bi +cY bk "} (10,1,1) = {" @@ -573,10 +574,10 @@ ad ad ad aE -bl +an an oY -aR +Rm am am am diff --git a/_maps/shuttles/emergency_casino.dmm b/_maps/shuttles/emergency_casino.dmm index a57202f811309..3992fd2134869 100644 --- a/_maps/shuttles/emergency_casino.dmm +++ b/_maps/shuttles/emergency_casino.dmm @@ -1,14 +1,4 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"ab" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/machinery/status_display/evac/directional/south, -/turf/open/floor/wood, -/area/shuttle/escape) "aj" = ( /obj/structure/chair/stool/bar/directional/east, /obj/effect/turf_decal/siding/wood{ @@ -30,11 +20,6 @@ }, /turf/open/floor/carpet/royalblue, /area/shuttle/escape) -"bl" = ( -/obj/structure/chair/stool/directional/east, -/obj/machinery/light/directional/west, -/turf/open/floor/carpet/green, -/area/shuttle/escape) "bG" = ( /obj/structure/table, /obj/item/defibrillator/loaded, @@ -58,6 +43,11 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/carpet/green, /area/shuttle/escape) +"ct" = ( +/obj/structure/table/reinforced, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/iron, +/area/shuttle/escape) "cu" = ( /obj/structure/chair/comfy/shuttle{ dir = 4 @@ -105,11 +95,6 @@ "dy" = ( /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"dL" = ( -/obj/machinery/space_heater, -/obj/machinery/light/directional/south, -/turf/open/floor/carpet/green, -/area/shuttle/escape) "el" = ( /obj/machinery/stasis, /turf/open/floor/mineral/titanium/blue, @@ -131,6 +116,11 @@ }, /turf/open/floor/wood, /area/shuttle/escape) +"fi" = ( +/obj/structure/bed/dogbed, +/obj/machinery/light/small/directional/east, +/turf/open/floor/mineral/titanium/purple, +/area/shuttle/escape) "fm" = ( /obj/structure/chair/comfy/shuttle{ dir = 4 @@ -138,12 +128,6 @@ /obj/machinery/light/directional/west, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"fI" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/directional/north, -/obj/item/storage/fancy/donut_box, -/turf/open/floor/iron, -/area/shuttle/escape) "fS" = ( /obj/structure/chair/wood, /turf/open/floor/mineral/titanium/purple, @@ -154,10 +138,6 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"ge" = ( -/obj/machinery/status_display/evac/directional/east, -/turf/open/floor/carpet/green, -/area/shuttle/escape) "gm" = ( /obj/structure/chair/stool/bar/directional/south, /turf/open/floor/carpet/green, @@ -250,18 +230,6 @@ }, /turf/open/floor/wood, /area/shuttle/escape) -"gO" = ( -/obj/structure/rack, -/obj/item/canvas/twentyfour_twentyfour, -/obj/item/canvas/twentyfour_twentyfour, -/obj/item/canvas/twentythree_twentythree, -/obj/item/canvas/twentythree_twentythree, -/obj/item/canvas, -/obj/item/canvas, -/obj/item/canvas, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/sepia, -/area/shuttle/escape) "hg" = ( /obj/machinery/suit_storage_unit/standard_unit, /turf/open/floor/mineral/titanium, @@ -282,14 +250,6 @@ /obj/structure/easel, /turf/open/floor/sepia, /area/shuttle/escape) -"iA" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/siding{ - dir = 1 - }, -/turf/open/floor/carpet/royalblue, -/area/shuttle/escape) "iN" = ( /obj/structure/table/wood/poker, /obj/item/storage/wallet, @@ -326,13 +286,6 @@ /obj/structure/chair/stool/directional/south, /turf/open/floor/wood, /area/shuttle/escape) -"kc" = ( -/obj/structure/table/reinforced, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/light/directional/north, -/obj/item/storage/fancy/donut_box, -/turf/open/floor/iron, -/area/shuttle/escape) "kk" = ( /obj/structure/rack, /obj/item/storage/toolbox/electrical{ @@ -346,11 +299,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"kn" = ( -/obj/structure/chair/comfy/shuttle, -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "kz" = ( /obj/structure/chair/stool/directional/west, /turf/open/floor/wood, @@ -397,6 +345,13 @@ }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) +"lr" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/siding{ + dir = 8 + }, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) "lx" = ( /obj/structure/sign/poster/official/help_others/directional/north, /obj/machinery/light/directional/east, @@ -424,6 +379,11 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/carpet/green, /area/shuttle/escape) +"lV" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/turf_decal/delivery, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) "mc" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/shower/directional/west{ @@ -433,11 +393,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"mi" = ( -/obj/structure/chair/stool/bar/directional/south, -/obj/machinery/light/directional/west, -/turf/open/floor/carpet/green, -/area/shuttle/escape) "mm" = ( /obj/structure/table/wood/poker, /obj/item/stack/spacecash/c10, @@ -467,6 +422,13 @@ /obj/item/coin/gold, /turf/open/floor/wood, /area/shuttle/escape) +"mt" = ( +/obj/effect/turf_decal/siding{ + dir = 9 + }, +/obj/item/kirbyplants/organic/plant21, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) "mx" = ( /obj/machinery/computer/slot_machine, /obj/structure/window/reinforced/spawner/directional/east, @@ -477,12 +439,33 @@ /obj/effect/spawner/structure/window/reinforced/shuttle, /turf/open/floor/plating, /area/shuttle/escape) +"mD" = ( +/obj/structure/rack, +/obj/item/canvas/twentyfour_twentyfour, +/obj/item/canvas/twentyfour_twentyfour, +/obj/item/canvas/twentythree_twentythree, +/obj/item/canvas/twentythree_twentythree, +/obj/item/canvas, +/obj/item/canvas, +/obj/item/canvas, +/obj/machinery/vending/wallmed/directional/west, +/obj/machinery/light/directional/north, +/turf/open/floor/sepia, +/area/shuttle/escape) "mT" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/turf_decal/delivery, /obj/structure/sign/poster/random/directional/west, /turf/open/floor/mineral/titanium, /area/shuttle/escape) +"mZ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/item/kirbyplants/organic/plant21, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/wood, +/area/shuttle/escape) "ni" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/south, @@ -586,11 +569,14 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) -"qp" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/siding{ - dir = 8 - }, +"qn" = ( +/obj/machinery/stasis, +/obj/machinery/vending/wallmed/directional/east, +/obj/machinery/light/directional/north, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"qr" = ( +/obj/machinery/light/floor, /turf/open/floor/carpet/royalblue, /area/shuttle/escape) "qx" = ( @@ -626,19 +612,14 @@ }, /turf/open/floor/wood, /area/shuttle/escape) -"rx" = ( -/obj/effect/turf_decal/siding{ - dir = 9 - }, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/carpet/royalblue, -/area/shuttle/escape) "rH" = ( /obj/structure/chair/stool/directional/east, /turf/open/floor/wood, /area/shuttle/escape) +"rV" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/shuttle/escape) "sd" = ( /obj/machinery/door/airlock/security/glass{ name = "Brig" @@ -648,27 +629,32 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"sj" = ( -/obj/effect/spawner/random/entertainment/arcade, -/obj/machinery/light/directional/north, -/turf/open/floor/carpet/green, +"si" = ( +/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/latex, +/obj/item/clothing/mask/surgical, +/obj/item/surgicaldrill, +/obj/item/cautery, +/turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "so" = ( /obj/structure/table, /obj/item/storage/toolbox/emergency, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"su" = ( -/turf/open/floor/iron/dark, -/area/shuttle/escape) -"sx" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/machinery/status_display/evac/directional/south, +"sw" = ( +/obj/structure/chair/stool/directional/north, +/obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, /area/shuttle/escape) "tk" = ( @@ -685,15 +671,6 @@ /obj/item/toy/gun, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"vn" = ( -/obj/effect/turf_decal/siding{ - dir = 10 - }, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/carpet/royalblue, -/area/shuttle/escape) "vv" = ( /obj/structure/table, /obj/machinery/microwave, @@ -704,25 +681,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/shuttle/escape) -"vI" = ( -/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/latex, -/obj/item/clothing/mask/surgical, -/obj/item/surgicaldrill, -/obj/item/cautery, -/obj/machinery/light/directional/west, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "vK" = ( /obj/machinery/door/airlock/security/glass{ name = "Brig" @@ -735,6 +693,11 @@ /obj/item/surgical_drapes, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) +"vM" = ( +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/siding, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) "vP" = ( /obj/structure/rack, /obj/item/soap, @@ -743,6 +706,18 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/mineral/titanium, /area/shuttle/escape) +"vQ" = ( +/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/machinery/status_display/evac/directional/north, +/obj/item/storage/box/drinkingglasses, +/obj/item/reagent_containers/cup/glass/shaker, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/shuttle/escape) "vT" = ( /obj/machinery/computer/emergency_shuttle{ dir = 8 @@ -795,10 +770,6 @@ /obj/machinery/vending/boozeomat, /turf/open/floor/iron/dark, /area/shuttle/escape) -"wZ" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/mineral/titanium/purple, -/area/shuttle/escape) "xc" = ( /obj/item/radio/intercom/directional/east, /turf/open/floor/carpet/green, @@ -811,6 +782,18 @@ /obj/item/toy/crayon/spraycan, /turf/open/floor/sepia, /area/shuttle/escape) +"xl" = ( +/obj/effect/turf_decal/siding, +/obj/machinery/light/floor, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) +"xt" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/siding{ + dir = 1 + }, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) "xI" = ( /obj/structure/sink/directional/north, /obj/structure/extinguisher_cabinet/directional/south, @@ -846,6 +829,11 @@ }, /turf/open/floor/wood, /area/shuttle/escape) +"yF" = ( +/obj/structure/bed/dogbed, +/obj/machinery/light/small/directional/west, +/turf/open/floor/mineral/titanium/purple, +/area/shuttle/escape) "yH" = ( /obj/structure/closet/crate, /obj/item/paint/black, @@ -879,6 +867,13 @@ /obj/item/toy/figure/clown, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) +"zG" = ( +/obj/effect/turf_decal/siding{ + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) "Ab" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, @@ -908,6 +903,11 @@ /obj/structure/chair/stool/directional/north, /turf/open/floor/wood, /area/shuttle/escape) +"Bb" = ( +/obj/structure/reagent_dispensers/wall/peppertank/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) "Bf" = ( /obj/machinery/computer/slot_machine, /turf/open/floor/carpet/green, @@ -915,11 +915,6 @@ "Bj" = ( /turf/template_noop, /area/template_noop) -"Bl" = ( -/obj/machinery/vending/wallmed/directional/east, -/obj/machinery/light/directional/east, -/turf/open/floor/carpet/green, -/area/shuttle/escape) "BY" = ( /obj/effect/spawner/random/entertainment/arcade, /turf/open/floor/carpet/green, @@ -973,11 +968,6 @@ /obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/carpet/green, /area/shuttle/escape) -"Eh" = ( -/obj/machinery/stasis, -/obj/machinery/vending/wallmed/directional/east, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "Ei" = ( /obj/machinery/roulette{ anchored = 1 @@ -985,11 +975,6 @@ /obj/item/clothing/head/costume/sombrero/green, /turf/open/floor/carpet/green, /area/shuttle/escape) -"Ev" = ( -/obj/structure/easel, -/obj/machinery/light/directional/east, -/turf/open/floor/sepia, -/area/shuttle/escape) "Ew" = ( /obj/structure/chair/comfy/black{ dir = 4 @@ -1004,16 +989,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"EL" = ( -/obj/structure/chair/comfy/shuttle, -/obj/machinery/light/directional/north, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) -"Ff" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/carpet/green, -/area/shuttle/escape) "Fi" = ( /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) @@ -1081,18 +1056,25 @@ /obj/structure/chair/stool/bar/directional/north, /turf/open/floor/carpet/green, /area/shuttle/escape) +"HS" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/item/kirbyplants/organic/plant21, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/wood, +/area/shuttle/escape) +"HZ" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/light/directional/west, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) "Ih" = ( /obj/machinery/power/shuttle_engine/propulsion{ dir = 8 }, /turf/open/floor/plating/airless, /area/shuttle/escape) -"JB" = ( -/obj/machinery/status_display/evac/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/siding, -/turf/open/floor/carpet/royalblue, -/area/shuttle/escape) "JZ" = ( /obj/machinery/computer/communications{ dir = 8 @@ -1125,6 +1107,13 @@ }, /turf/open/floor/carpet/green, /area/shuttle/escape) +"Ll" = ( +/obj/effect/turf_decal/siding{ + dir = 10 + }, +/obj/item/kirbyplants/organic/plant21, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) "Lv" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -1218,16 +1207,20 @@ "Oa" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/escape) -"OI" = ( -/obj/machinery/status_display/evac/directional/west, -/turf/open/floor/carpet/green, +"Or" = ( +/obj/machinery/light/floor, +/turf/open/floor/wood, /area/shuttle/escape) -"OR" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/effect/turf_decal/delivery, -/obj/machinery/light/directional/west, -/turf/open/floor/mineral/titanium, +"Ow" = ( +/obj/machinery/status_display/evac/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/carpet/green, /area/shuttle/escape) +"OA" = ( +/obj/structure/chair/comfy/shuttle, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) "Pb" = ( /obj/effect/turf_decal/siding/thinplating, /turf/open/floor/carpet/green, @@ -1239,10 +1232,6 @@ }, /turf/open/floor/carpet/royalblue, /area/shuttle/escape) -"Pg" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "Pj" = ( /obj/machinery/recharge_station, /obj/effect/turf_decal/delivery, @@ -1265,17 +1254,6 @@ }, /turf/open/floor/carpet/royalblue, /area/shuttle/escape) -"Pv" = ( -/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/machinery/status_display/evac/directional/north, -/obj/item/storage/box/drinkingglasses, -/obj/item/reagent_containers/cup/glass/shaker, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/shuttle/escape) "PM" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 1 @@ -1291,15 +1269,17 @@ }, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) +"PQ" = ( +/obj/structure/table/reinforced, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/iron, +/area/shuttle/escape) "PS" = ( /obj/structure/chair/stool/directional/east, /obj/item/radio/intercom/directional/west, /turf/open/floor/carpet/green, /area/shuttle/escape) -"PW" = ( -/obj/structure/reagent_dispensers/wall/peppertank/directional/east, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "Qk" = ( /obj/effect/turf_decal/siding{ dir = 4 @@ -1324,6 +1304,10 @@ "RZ" = ( /turf/open/floor/wood, /area/shuttle/escape) +"Sb" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/carpet/green, +/area/shuttle/escape) "Sk" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -1336,32 +1320,9 @@ /obj/structure/window/reinforced/tinted/spawner/directional/east, /turf/open/floor/iron, /area/shuttle/escape) -"Sp" = ( -/obj/effect/turf_decal/siding{ - dir = 1 - }, -/turf/open/floor/carpet/royalblue, -/area/shuttle/escape) -"SQ" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) -"Tb" = ( -/obj/structure/chair/stool/directional/north, -/obj/effect/turf_decal/siding/wood, -/obj/machinery/light/directional/south, -/turf/open/floor/wood, -/area/shuttle/escape) "Ty" = ( /turf/open/floor/mineral/titanium/purple, /area/shuttle/escape) -"TE" = ( -/obj/effect/turf_decal/siding, -/turf/open/floor/carpet/royalblue, -/area/shuttle/escape) "Uu" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/escape) @@ -1372,11 +1333,6 @@ /obj/structure/chair/stool/directional/north, /turf/open/floor/wood, /area/shuttle/escape) -"Vj" = ( -/obj/machinery/light/directional/north, -/obj/structure/closet/crate/bin, -/turf/open/floor/carpet/green, -/area/shuttle/escape) "Vl" = ( /obj/structure/rack, /obj/item/storage/toolbox/mechanical{ @@ -1396,16 +1352,12 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) -"Wp" = ( +"VT" = ( +/obj/machinery/vending/wallmed/directional/east, /turf/open/floor/carpet/green, /area/shuttle/escape) -"Wq" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/siding{ - dir = 8 - }, -/turf/open/floor/carpet/royalblue, +"Wp" = ( +/turf/open/floor/carpet/green, /area/shuttle/escape) "Ws" = ( /obj/structure/chair/stool/directional/west, @@ -1458,10 +1410,19 @@ /obj/structure/window/reinforced/tinted/spawner/directional/east, /turf/open/floor/carpet/green, /area/shuttle/escape) +"XY" = ( +/obj/machinery/space_heater, +/turf/open/floor/carpet/green, +/area/shuttle/escape) "Yc" = ( /obj/structure/chair/stool/directional/south, /turf/open/floor/wood, /area/shuttle/escape) +"Yl" = ( +/obj/machinery/status_display/evac/directional/west, +/obj/machinery/light/directional/west, +/turf/open/floor/carpet/green, +/area/shuttle/escape) "Yp" = ( /turf/open/floor/mineral/titanium, /area/shuttle/escape) @@ -1596,7 +1557,7 @@ LR Pj vP mT -OR +lV tk Pj MS @@ -1616,7 +1577,7 @@ Ac Fv LR Km -Fv +LR aI LR aI @@ -1648,22 +1609,22 @@ Uu "} (7,1,1) = {" Uu -sj +BY yl Wp -mi +gm iN -OI +Yl mm cb Wp -bl +yo PS -dL +XY Uu bG vL -vI +si pg Uu "} @@ -1745,7 +1706,7 @@ Wp Wp XW Uu -Eh +qn el Fi lo @@ -1764,7 +1725,7 @@ UA Lz Lz Lz -ab +HS Uu Uu Uu @@ -1788,7 +1749,7 @@ RZ Ab mz zp -Pg +HZ dy oc Uu @@ -1811,19 +1772,19 @@ sd dy dy dy -SQ +Lv Uu "} (15,1,1) = {" Uu -kc +PQ aS aS aS aS YS AA -RZ +Or kz kz RZ @@ -1848,9 +1809,9 @@ RZ RZ Yc nx -Tb +sw Uu -EL +OA dy dy Lv @@ -1858,7 +1819,7 @@ mz "} (17,1,1) = {" Uu -Pv +vQ Xr jH Cz @@ -1890,9 +1851,9 @@ RZ RZ Yc YN -Tb +sw Uu -kn +Ru dy dp Lv @@ -1900,14 +1861,14 @@ mz "} (19,1,1) = {" Uu -fI +ct aS aS aS aS Gf AA -RZ +Or rH rH RZ @@ -1937,7 +1898,7 @@ vK dy dy oz -SQ +Lv Uu "} (21,1,1) = {" @@ -1956,7 +1917,7 @@ RZ Ab mz MX -PW +Bb dy vi Uu @@ -1974,7 +1935,7 @@ AS gI gI gI -sx +mZ Uu Uu Uu @@ -1997,7 +1958,7 @@ Wp Wp pp Uu -gO +mD DA DA Ny @@ -2068,22 +2029,22 @@ mz "} (27,1,1) = {" Uu -Vj +Sb xc WW -Bl +VT +Wp +Ow Wp -ge Wp -Ff Wp Wp xc -dL +XY Uu LL iz -Ev +iz iz Uu "} @@ -2115,17 +2076,17 @@ iy fm cu Uu -rx -Wq +mt +lr mn mn mn -qp -vn +mn +Ll Uu wu -wZ -yJ +Ty +yF mz Bj "} @@ -2136,13 +2097,13 @@ Yp Yp Yp Xg -Sp +zG aX et et et cF -TE +xl ye Ty Ty @@ -2167,7 +2128,7 @@ kO Uu fS Ty -yJ +fi mz Bj "} @@ -2178,13 +2139,13 @@ Uu Uu Uu Oa -iA +xt KG Mb -Mb +qr Mb jE -JB +vM Oa Uu Uu @@ -2198,7 +2159,7 @@ Bj Bj mz wK -su +rV jQ Qk Qk @@ -2206,7 +2167,7 @@ Ew Qk Qk dd -su +rV cw mz Bj diff --git a/_maps/shuttles/emergency_cere.dmm b/_maps/shuttles/emergency_cere.dmm index 310413554bb73..07e236344ab93 100644 --- a/_maps/shuttles/emergency_cere.dmm +++ b/_maps/shuttles/emergency_cere.dmm @@ -17,10 +17,6 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark, /area/shuttle/escape) -"ai" = ( -/obj/machinery/modular_computer/console/preset/id, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "aj" = ( /obj/machinery/computer/emergency_shuttle, /turf/open/floor/iron/dark, @@ -138,16 +134,6 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) -"aM" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "aN" = ( /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, @@ -156,16 +142,6 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/dark, /area/shuttle/escape) -"aP" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "aR" = ( /obj/machinery/door/airlock/public/glass{ name = "Emergency Shuttle Cockpit" @@ -278,34 +254,12 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"bs" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/shuttle/escape) "bt" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/iron, /area/shuttle/escape) -"bu" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/closet, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/shuttle/escape) "bv" = ( /obj/machinery/door/airlock/shuttle{ name = "Emergency Shuttle Airlock" @@ -476,12 +430,6 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron, /area/shuttle/escape) -"ca" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/iron, -/area/shuttle/escape) "cb" = ( /obj/structure/sign/departments/medbay/alt/directional/east{ pixel_y = -32 @@ -495,13 +443,6 @@ }, /turf/open/floor/iron, /area/shuttle/escape) -"cd" = ( -/obj/machinery/light/directional/east, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/iron, -/area/shuttle/escape) "ce" = ( /obj/machinery/door/airlock/medical/glass{ name = "Emergency Shuttle Medbay" @@ -509,13 +450,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/shuttle/escape) -"cf" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/shuttle/escape) "cg" = ( /obj/machinery/light/directional/east, /turf/open/floor/iron, @@ -544,7 +478,7 @@ /turf/open/floor/iron/white, /area/shuttle/escape) "ck" = ( -/obj/machinery/atmospherics/components/unary/cryo_cell, +/obj/machinery/cryo_cell, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 }, @@ -930,6 +864,15 @@ }, /turf/open/floor/iron, /area/shuttle/escape) +"ej" = ( +/obj/item/kirbyplants/organic/plant21, +/turf/open/floor/iron, +/area/shuttle/escape) +"gy" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/shuttle/escape) "hS" = ( /obj/structure/table, /obj/item/storage/medkit/o2, @@ -939,6 +882,18 @@ }, /turf/open/floor/iron/white, /area/shuttle/escape) +"hX" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/iron/recharge_floor, +/area/shuttle/escape) +"ja" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/shuttle/escape) "kk" = ( /obj/machinery/computer/aifixer, /obj/effect/turf_decal/tile/purple/fourcorners, @@ -985,23 +940,12 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) -"zj" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular{ - pixel_x = 2; - pixel_y = 3 - }, -/obj/item/storage/medkit/o2, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/dark, -/area/shuttle/escape) -"Ax" = ( +"wQ" = ( /obj/structure/table, /obj/item/storage/toolbox/emergency, /obj/item/crowbar, -/obj/machinery/light/directional/north, /obj/effect/turf_decal/tile/purple/fourcorners, +/obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, /area/shuttle/escape) "CO" = ( @@ -1015,6 +959,17 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) +"Ek" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/closet, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/shuttle/escape) "Ie" = ( /obj/structure/table, /obj/item/storage/medkit/regular{ @@ -1033,6 +988,33 @@ }, /turf/open/floor/iron/white, /area/shuttle/escape) +"IZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/shuttle/escape) +"ME" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/shuttle/escape) +"Ng" = ( +/obj/structure/table, +/obj/item/storage/medkit/regular{ + pixel_x = 2; + pixel_y = 3 + }, +/obj/item/storage/medkit/o2, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/shuttle/escape) "NP" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer, /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ @@ -1040,6 +1022,10 @@ }, /turf/open/floor/iron/white, /area/shuttle/escape) +"NX" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/shuttle/escape) "PD" = ( /obj/structure/chair/comfy/beige{ dir = 1 @@ -1047,6 +1033,14 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) +"Sc" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/iron/recharge_floor, +/area/shuttle/escape) +"Si" = ( +/obj/machinery/modular_computer/preset/id, +/turf/open/floor/iron/dark, +/area/shuttle/escape) "SZ" = ( /obj/structure/table, /obj/item/wrench/medical, @@ -1072,6 +1066,24 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) +"Zi" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"Zw" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/shuttle/escape) +"ZC" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/shuttle/escape) (1,1,1) = {" aa @@ -1177,8 +1189,8 @@ be be be ab +ZC bc -bQ bc bc bc @@ -1186,10 +1198,10 @@ bQ bc bc bc -bQ -ca -ca -cf +bc +ej +gy +Zw aZ aZ aZ @@ -1297,11 +1309,11 @@ dz aa aa ab -Ax +wQ ap ap aH -aM +ja ab aU bg @@ -1473,7 +1485,7 @@ dz aa aa ac -ai +Si at aC aC @@ -1504,7 +1516,7 @@ aZ aZ aZ bc -ca +ej ab dd bc @@ -1547,7 +1559,7 @@ bc bc bc bc -cg +NX bc ab de @@ -1572,7 +1584,7 @@ aZ aZ aZ aZ -aZ +ME bL bc bT @@ -1693,16 +1705,16 @@ dz aa aa ab -zj +Ng rv rv uN -aP +Zi ab bb -bj +hX bo -bs +IZ bB bB bM @@ -1847,7 +1859,7 @@ bc bc bc bc -cd +ej ab NP UA @@ -1876,9 +1888,9 @@ ab ab ab bb -bj +Sc dA -bu +Ek bD bD bP diff --git a/_maps/shuttles/emergency_clown.dmm b/_maps/shuttles/emergency_clown.dmm index 0b3d943ee4f8c..f5c0ca4ea61eb 100644 --- a/_maps/shuttles/emergency_clown.dmm +++ b/_maps/shuttles/emergency_clown.dmm @@ -82,12 +82,6 @@ /obj/item/toy/snappop/phoenix, /turf/open/floor/bluespace, /area/shuttle/escape) -"aq" = ( -/obj/item/toy/snappop/phoenix, -/obj/machinery/light/directional/south, -/obj/machinery/status_display/evac/directional/south, -/turf/open/floor/bluespace, -/area/shuttle/escape) "ar" = ( /obj/machinery/computer/communications{ dir = 8 @@ -103,10 +97,6 @@ "au" = ( /turf/open/chasm, /area/shuttle/escape) -"av" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/bananium, -/area/shuttle/escape) "ay" = ( /obj/structure/table, /obj/item/storage/medkit/fire, @@ -147,12 +137,6 @@ "aF" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/escape) -"aG" = ( -/obj/structure/table, -/obj/item/toy/sword, -/obj/machinery/light/directional/west, -/turf/open/floor/mineral/bananium, -/area/shuttle/escape) "aH" = ( /obj/structure/table, /obj/item/toy/sword, @@ -167,44 +151,22 @@ }, /turf/open/floor/plating, /area/shuttle/escape) -"aJ" = ( -/obj/item/toy/snappop/phoenix, -/obj/machinery/light/small/directional/north, -/turf/open/floor/bluespace, -/area/shuttle/escape) "aK" = ( /obj/structure/extinguisher_cabinet/directional/north, /obj/item/toy/snappop/phoenix, /turf/open/floor/bluespace, /area/shuttle/escape) -"aL" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/item/toy/snappop/phoenix, -/obj/machinery/light/small/directional/east, -/turf/open/floor/bluespace, -/area/shuttle/escape) "aM" = ( /obj/structure/bed, /obj/item/bedsheet/random, /turf/open/floor/mineral/bananium, /area/shuttle/escape) -"aN" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/bed, -/obj/item/bedsheet/random, -/turf/open/floor/mineral/bananium, -/area/shuttle/escape) "aQ" = ( /obj/machinery/door/airlock/bananium{ name = "Emergency Shuttle Airlock" }, /turf/open/floor/plating, /area/shuttle/escape) -"aR" = ( -/obj/item/toy/snappop/phoenix, -/obj/machinery/light/small/directional/south, -/turf/open/floor/bluespace, -/area/shuttle/escape) "aS" = ( /obj/structure/extinguisher_cabinet/directional/south, /obj/item/toy/snappop/phoenix, @@ -273,15 +235,21 @@ }, /turf/open/floor/mineral/bananium, /area/shuttle/escape) -"bf" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/power/shuttle_engine/heater, -/turf/open/floor/plating/airless, -/area/shuttle/escape) "bg" = ( /obj/machinery/power/shuttle_engine/propulsion, /turf/open/floor/plating/airless, /area/shuttle/escape) +"ex" = ( +/obj/item/toy/snappop/phoenix, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/bluespace, +/area/shuttle/escape) +"iU" = ( +/obj/structure/bed, +/obj/item/bedsheet/random, +/obj/machinery/light/small/directional/east, +/turf/open/floor/mineral/bananium, +/area/shuttle/escape) "kT" = ( /obj/structure/bed{ dir = 4 @@ -291,16 +259,43 @@ }, /turf/open/floor/mineral/bananium, /area/shuttle/escape) -"lT" = ( -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/mineral/bananium, +"lG" = ( +/obj/item/toy/snappop/phoenix, +/obj/machinery/light/floor, +/turf/open/floor/bluespace, /area/shuttle/escape) "ns" = ( /obj/item/toy/snappop/phoenix, /obj/machinery/light/directional/south, /turf/open/floor/bluespace, /area/shuttle/escape) -"EM" = ( +"pi" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/power/shuttle_engine/heater, +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"tA" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/item/toy/snappop/phoenix, +/turf/open/floor/bluespace, +/area/shuttle/escape) +"za" = ( +/obj/structure/table, +/obj/item/toy/sword, +/obj/machinery/light/small/directional/west, +/turf/open/floor/mineral/bananium, +/area/shuttle/escape) +"Hv" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/item/bedsheet/random{ + dir = 4 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/mineral/bananium, +/area/shuttle/escape) +"Lb" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/bed{ dir = 4 @@ -317,6 +312,17 @@ }, /turf/open/floor/bluespace, /area/shuttle/escape) +"XT" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/bed, +/obj/item/bedsheet/random, +/turf/open/floor/mineral/bananium, +/area/shuttle/escape) +"YC" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/mineral/bananium, +/area/shuttle/escape) "Zf" = ( /obj/structure/closet/emcloset, /obj/item/toy/sword, @@ -357,13 +363,13 @@ au au au ab -aJ -kT -kT +ak +Hv kT kT kT -aR +Hv +ak ab aV aY @@ -392,7 +398,7 @@ ab aV aV bc -bf +pi bg "} (4,1,1) = {" @@ -406,17 +412,17 @@ au au ab ak -aN -aN -aN -aN -aN +XT +XT +XT +XT +XT ak aT aV aV bd -bf +pi bg "} (5,1,1) = {" @@ -430,17 +436,17 @@ aA ac aF RX -EM -EM -EM -EM -EM +Lb +Lb +Lb +Lb +Lb ak ab aW aZ be -bf +pi bg "} (6,1,1) = {" @@ -449,22 +455,22 @@ ag ak ns ab -av +aV ak aC -aG -ak +za ak ak ak +lG ak ak -aq +ex ab ab ab ab -bf +pi bg "} (7,1,1) = {" @@ -478,17 +484,17 @@ ak aD aH ak -aN -aN -aN -aN -aN +XT +XT +XT +XT +XT ak ac Zf aY Zf -bf +pi bg "} (8,1,1) = {" @@ -497,22 +503,22 @@ ah al al ab -lT +YC ak aE aH ak -EM -EM -EM -EM -EM +Lb +Lb +Lb +Lb +Lb ak aU aV aV aV -bf +pi bg "} (9,1,1) = {" @@ -536,7 +542,7 @@ ac aV aV aV -bf +pi bg "} (10,1,1) = {" @@ -549,13 +555,13 @@ ay aZ aV aV -aL -aM -aM +tA +iU aM aM aM -aL +iU +tA ac aX bb diff --git a/_maps/shuttles/emergency_cruise.dmm b/_maps/shuttles/emergency_cruise.dmm index d488bf896c7a4..804157a5cbac6 100644 --- a/_maps/shuttles/emergency_cruise.dmm +++ b/_maps/shuttles/emergency_cruise.dmm @@ -52,17 +52,6 @@ /obj/machinery/power/shuttle_engine/heater, /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/escape) -"eb" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/head/collectable/welding, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/shuttle/escape) "en" = ( /obj/effect/spawner/structure/window/reinforced/shuttle, /turf/open/floor/plating, @@ -122,13 +111,6 @@ /obj/item/kirbyplants/photosynthetic, /turf/open/floor/iron/white, /area/shuttle/escape) -"jW" = ( -/obj/structure/statue/diamond/ai2{ - anchored = 1; - name = "statue of an AI core." - }, -/turf/open/floor/iron/white, -/area/shuttle/escape) "kd" = ( /turf/template_noop, /area/template_noop) @@ -166,6 +148,19 @@ }, /turf/open/floor/iron/white, /area/shuttle/escape) +"lg" = ( +/obj/machinery/computer/station_alert{ + desc = "Used to access the shuttle's automated alert system."; + dir = 8; + name = "ship alert console" + }, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white, +/area/shuttle/escape) "lJ" = ( /obj/structure/table/reinforced, /obj/item/camera{ @@ -202,22 +197,15 @@ /obj/machinery/light/directional/east, /turf/open/floor/wood, /area/shuttle/escape) -"oH" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white, +"oQ" = ( +/obj/machinery/computer/slot_machine, +/turf/open/floor/wood, /area/shuttle/escape) "oZ" = ( /obj/machinery/computer/crew, /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/white, /area/shuttle/escape) -"pk" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/shuttle/escape) "qd" = ( /obj/machinery/computer/warrant, /obj/effect/turf_decal/tile/red/anticorner/contrasted{ @@ -228,16 +216,12 @@ }, /turf/open/floor/iron/white, /area/shuttle/escape) -"qr" = ( -/obj/machinery/computer/station_alert{ - desc = "Used to access the shuttle's automated alert system."; - dir = 8; - name = "ship alert console" - }, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, -/obj/effect/turf_decal/tile/blue{ - dir = 1 +"qs" = ( +/obj/structure/statue/diamond/ai1{ + anchored = 1; + name = "statue of an AI hologram" }, +/obj/machinery/light/directional/south, /turf/open/floor/iron/white, /area/shuttle/escape) "qw" = ( @@ -258,11 +242,11 @@ }, /turf/open/floor/wood, /area/shuttle/escape) -"rs" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ +"rp" = ( +/obj/structure/chair/comfy/shuttle{ dir = 4 }, +/obj/machinery/light/small/directional/west, /turf/open/floor/iron/white, /area/shuttle/escape) "rw" = ( @@ -312,13 +296,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/shuttle/escape) -"tB" = ( -/obj/structure/statue/diamond/ai1{ - anchored = 1; - name = "statue of an AI hologram" - }, -/turf/open/floor/iron/white, -/area/shuttle/escape) "uV" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/escape) @@ -422,18 +399,6 @@ /obj/machinery/vending/snack/green, /turf/open/floor/wood, /area/shuttle/escape) -"yH" = ( -/obj/machinery/modular_computer/console/preset/research{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/shuttle/escape) "zm" = ( /obj/structure/chair/comfy/shuttle{ dir = 1; @@ -467,11 +432,6 @@ /obj/effect/turf_decal/tile/purple/anticorner/contrasted, /turf/open/floor/iron/white, /area/shuttle/escape) -"BB" = ( -/obj/item/kirbyplants/photosynthetic, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/white, -/area/shuttle/escape) "Cn" = ( /obj/machinery/shuttle_manipulator{ desc = "A holographic display of the cruise shuttle we're on right now."; @@ -486,11 +446,6 @@ /obj/machinery/vending/snack/orange, /turf/open/floor/wood, /area/shuttle/escape) -"CK" = ( -/obj/item/kirbyplants/photosynthetic, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white, -/area/shuttle/escape) "CR" = ( /obj/machinery/door/airlock/shuttle, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -514,13 +469,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/shuttle/escape) -"Do" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/shuttle/escape) "Dq" = ( /obj/structure/table/wood/fancy, /obj/item/food/salad/jungle{ @@ -533,16 +481,15 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/shuttle/escape) +"DZ" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/shuttle/escape) "El" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/shuttle/escape) -"En" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/turf/open/floor/iron/white, -/area/shuttle/escape) "Eo" = ( /obj/structure/table/reinforced, /obj/item/toy/figure{ @@ -567,6 +514,14 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/white, /area/shuttle/escape) +"Fx" = ( +/obj/structure/statue/diamond/ai2{ + anchored = 1; + name = "statue of an AI core." + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white, +/area/shuttle/escape) "FR" = ( /obj/machinery/computer/aifixer{ dir = 4 @@ -628,11 +583,6 @@ /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /turf/open/floor/iron/white, /area/shuttle/escape) -"Iu" = ( -/obj/machinery/computer/slot_machine, -/obj/machinery/light/directional/north, -/turf/open/floor/wood, -/area/shuttle/escape) "IL" = ( /obj/structure/chair/comfy/shuttle{ dir = 4; @@ -644,17 +594,6 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/white, /area/shuttle/escape) -"Js" = ( -/obj/structure/showcase/mecha/marauder{ - desc = "A stand with an empty old Nanotrasen Corporation combat mech bolted to it. The seraph is described as the most valuable unit in defending the VIPs of Nanotrasen."; - dir = 8; - icon_state = "seraph"; - max_integrity = 2500; - name = "seraph mech exhibit" - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/shuttle/escape) "Kc" = ( /obj/item/kirbyplants/photosynthetic, /obj/machinery/light/directional/east, @@ -680,6 +619,35 @@ "KD" = ( /turf/open/floor/iron/white, /area/shuttle/escape) +"KM" = ( +/obj/machinery/modular_computer/preset/research{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white, +/area/shuttle/escape) +"KS" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white, +/area/shuttle/escape) +"KU" = ( +/obj/structure/showcase/mecha/marauder{ + desc = "A stand with an empty old Nanotrasen Corporation combat mech bolted to it. The marauder is described as the premier unit used to defend corporate interests and employees."; + dir = 4; + max_integrity = 2500; + name = "marauder mech exhibit" + }, +/turf/open/floor/iron/white, +/area/shuttle/escape) "Lo" = ( /obj/structure/table/wood/fancy, /obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ @@ -739,33 +707,20 @@ "OJ" = ( /turf/open/floor/light/colour_cycle/dancefloor_a, /area/shuttle/escape) -"Pb" = ( +"Rf" = ( /obj/structure/showcase/mecha/marauder{ - desc = "A stand with an empty old Nanotrasen Corporation combat mech bolted to it. The marauder is described as the premier unit used to defend corporate interests and employees."; - dir = 4; + desc = "A stand with an empty old Nanotrasen Corporation combat mech bolted to it. The seraph is described as the most valuable unit in defending the VIPs of Nanotrasen."; + dir = 8; + icon_state = "seraph"; max_integrity = 2500; - name = "marauder mech exhibit" + name = "seraph mech exhibit" }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/shuttle/escape) -"Pr" = ( -/obj/machinery/light/directional/north, /turf/open/floor/iron/white, /area/shuttle/escape) "So" = ( /obj/item/storage/cans/sixbeer, /turf/open/floor/wood, /area/shuttle/escape) -"Sp" = ( -/obj/structure{ - desc = "A jukebox for playing music. Seems like it ran out of charge."; - icon = 'icons/obj/stationobjs.dmi'; - icon_state = "jukebox"; - name = "jukebox" - }, -/turf/open/floor/wood, -/area/shuttle/escape) "Sx" = ( /obj/structure/table/wood, /obj/item/coin/iron{ @@ -815,10 +770,6 @@ }, /turf/open/floor/iron/white, /area/shuttle/escape) -"UJ" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/wood, -/area/shuttle/escape) "UN" = ( /obj/structure/table/wood/fancy, /obj/item/reagent_containers/cup/rag{ @@ -836,11 +787,6 @@ "Vm" = ( /turf/closed/wall/mineral/titanium/interior, /area/shuttle/escape) -"Vv" = ( -/obj/item/kirbyplants/photosynthetic, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/shuttle/escape) "VO" = ( /obj/structure/table/reinforced, /obj/item/phone{ @@ -869,6 +815,27 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/shuttle/escape) +"YN" = ( +/obj/structure{ + desc = "A jukebox for playing music. Seems like it ran out of charge."; + icon = 'icons/obj/machines/music.dmi'; + icon_state = "jukebox"; + name = "jukebox" + }, +/turf/open/floor/wood, +/area/shuttle/escape) +"YV" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/head/collectable/welding, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white, +/area/shuttle/escape) "YZ" = ( /obj/machinery/light/directional/west, /turf/open/floor/wood, @@ -999,7 +966,7 @@ aY jt WT nU -WT +DZ jt kd kd @@ -1034,7 +1001,7 @@ WT WT WT WT -YZ +WT WT WT WT @@ -1069,7 +1036,7 @@ WT WT WT WT -oo +WT WT WT WT @@ -1135,7 +1102,7 @@ Vm dQ Vm Vm -oo +WT WT WT WT @@ -1156,7 +1123,7 @@ jt en qw FR -yH +KM Vm jT qw @@ -1166,18 +1133,18 @@ TI qw jT Vm -TI -rs -TI +rp +yn TI TI TI -En TI +HA +rp Vm jT qw -Pb +KU qw jT Vm @@ -1204,13 +1171,13 @@ qw Ud Bp Vm -Pr +KD qw qw qw qw qw -oH +KD Vm HA qw @@ -1227,7 +1194,7 @@ qw qw cf KD -Vv +jT Vm Vm WT @@ -1235,7 +1202,7 @@ WT NH NH NH -UJ +DZ uV dR xj @@ -1247,7 +1214,7 @@ en qd KB qw -Uo +qw uV Vm KD @@ -1295,7 +1262,7 @@ qw qw qw Vm -BB +jT KD qw Ki @@ -1303,16 +1270,16 @@ Ki Ki qw KD -CK +jT Vm -DJ +qw Ki Ki Ki Ki Uo Vm -BB +jT Vk Nv xB @@ -1366,9 +1333,9 @@ Cn Dn SK UF -jW +Fx Vm -Iu +oQ WT ni OJ @@ -1412,15 +1379,15 @@ Gv iO SK cf -tB +qs Vm -Iu +oQ WT OJ ni OJ WT -Sp +YN uV So uV @@ -1433,7 +1400,7 @@ qw qw qw Vm -BB +jT KD qw TI @@ -1441,16 +1408,16 @@ TI TI qw KD -CK +jT Vm DJ TI TI TI TI -Uo +qw Vm -BB +jT ju Nv vL @@ -1477,7 +1444,7 @@ en oZ Ho qw -Uo +qw uV Vm KD @@ -1524,15 +1491,15 @@ dd sv qw IL -eb +YV Vm -Pr +KD qw qw qw qw qw -oH +KD Vm rX qw @@ -1557,7 +1524,7 @@ WT nU nU nU -UJ +DZ uV dR xj @@ -1570,7 +1537,7 @@ jt en qw uX -qr +lg Vm jT qw @@ -1580,18 +1547,18 @@ Ki qw jT Vm -Ki -Do -Ki +KS +mv Ki Ki Ki -pk Ki +rX +KS Vm jT qw -Js +Rf qw jT Vm @@ -1641,7 +1608,7 @@ Vm dQ Vm Vm -YZ +WT WT WT EC @@ -1667,7 +1634,7 @@ WT WT WT WT -YZ +WT WT WT WT @@ -1724,7 +1691,7 @@ WT WT WT WT -oo +WT WT WT WT @@ -1781,7 +1748,7 @@ qE jt WT NH -WT +DZ jt kd kd diff --git a/_maps/shuttles/emergency_delta.dmm b/_maps/shuttles/emergency_delta.dmm index a4c9050a73a20..f21021473131a 100644 --- a/_maps/shuttles/emergency_delta.dmm +++ b/_maps/shuttles/emergency_delta.dmm @@ -166,29 +166,6 @@ }, /turf/open/floor/iron/white, /area/shuttle/escape) -"an" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/shuttle/escape) -"ap" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/shuttle/escape) "ar" = ( /obj/item/reagent_containers/cup/bottle/epinephrine{ pixel_x = 6 @@ -332,7 +309,7 @@ /turf/open/floor/iron/white, /area/shuttle/escape) "aL" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/white, @@ -342,7 +319,7 @@ /turf/open/floor/iron/white, /area/shuttle/escape) "aN" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, /obj/structure/extinguisher_cabinet/directional/east, /obj/machinery/light/small/directional/east, @@ -598,29 +575,6 @@ /obj/machinery/recharger, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"bz" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/machinery/button/flasher{ - id = "shuttleflash"; - pixel_x = -26; - pixel_y = 24 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron, -/area/shuttle/escape) -"bA" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/shuttle/escape) "bB" = ( /obj/structure/table, /obj/item/clipboard, @@ -651,14 +605,6 @@ }, /turf/open/floor/iron, /area/shuttle/escape) -"bG" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/shuttle/escape) "bH" = ( /turf/open/floor/iron, /area/shuttle/escape) @@ -746,15 +692,6 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"bW" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/shuttle/escape) "bX" = ( /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron, @@ -845,18 +782,6 @@ }, /turf/open/floor/iron, /area/shuttle/escape) -"cA" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/shuttle/escape) "cB" = ( /obj/structure/chair/comfy/shuttle{ dir = 8 @@ -869,10 +794,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/shuttle/escape) -"cF" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/shuttle/escape) "cG" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -885,6 +806,16 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron, /area/shuttle/escape) +"dY" = ( +/obj/item/kirbyplants/organic/plant21{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/shuttle/escape) "en" = ( /obj/structure/table/reinforced, /obj/item/storage/toolbox/mechanical, @@ -956,6 +887,23 @@ /obj/machinery/camera/autoname, /turf/open/floor/iron, /area/shuttle/escape) +"nL" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/shuttle/escape) +"nU" = ( +/obj/item/kirbyplants/organic/plant21{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/shuttle/escape) "pd" = ( /obj/machinery/camera/autoname{ dir = 9 @@ -995,6 +943,28 @@ /obj/machinery/status_display/ai/directional/west, /turf/open/floor/iron, /area/shuttle/escape) +"zf" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/machinery/button/flasher{ + id = "shuttleflash"; + pixel_x = -26; + pixel_y = 24 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron, +/area/shuttle/escape) +"En" = ( +/obj/item/kirbyplants/organic/plant21{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/machinery/light/directional/north, +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/shuttle/escape) "HJ" = ( /obj/structure/closet/crate/medical, /obj/item/storage/medkit/regular, @@ -1019,21 +989,27 @@ }, /turf/open/floor/iron, /area/shuttle/escape) -"Jl" = ( +"Iu" = ( /obj/structure/table/reinforced, -/obj/item/folder/blue, +/obj/item/paper_bin, /obj/item/pen, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, /area/shuttle/escape) -"Jv" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 +"Ji" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 }, -/obj/machinery/light/directional/north, -/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/shuttle/escape) +"Jl" = ( +/obj/structure/table/reinforced, +/obj/item/folder/blue, +/obj/item/pen, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) @@ -1046,6 +1022,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) +"Nu" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/effect/turf_decal/delivery, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/shuttle/escape) "PO" = ( /obj/structure/table/reinforced, /obj/item/storage/medkit/regular, @@ -1090,9 +1072,8 @@ }, /turf/open/floor/iron, /area/shuttle/escape) -"WT" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21"; +"WG" = ( +/obj/item/kirbyplants/organic/plant21{ pixel_x = -3; pixel_y = 3 }, @@ -1151,19 +1132,19 @@ ab ad af ah -cA +nU av av aH -an +nU aE aU aE -an +nU av av av -cA +nU aE af pd @@ -1326,7 +1307,7 @@ bt hB aT af -WT +WG jU jU Zb @@ -1352,10 +1333,10 @@ aw nD bo hB -bz +zf bF bP -bW +Iu af Ma JT @@ -1445,8 +1426,8 @@ nD nD bo hB -bA -bG +Ji +nL bQ bI af @@ -1461,7 +1442,7 @@ ab ad hB ah -ap +dY aw aE aE @@ -1473,7 +1454,7 @@ aw aw aE aE -ap +dY ah af aT @@ -1481,7 +1462,7 @@ af af bY af -Jv +En lT lT en @@ -1539,7 +1520,7 @@ bl bq af bC -cF +bH ae af af @@ -1603,7 +1584,7 @@ af no bo ai -bZ +Nu hB aa aa diff --git a/_maps/shuttles/emergency_discoinferno.dmm b/_maps/shuttles/emergency_discoinferno.dmm index 80921d4ae193f..d6dedd686af0a 100644 --- a/_maps/shuttles/emergency_discoinferno.dmm +++ b/_maps/shuttles/emergency_discoinferno.dmm @@ -66,13 +66,6 @@ }, /turf/open/floor/mineral/gold, /area/shuttle/escape) -"n" = ( -/obj/structure/table/wood/poker, -/obj/item/storage/box/drinkingglasses, -/obj/item/reagent_containers/cup/glass/bottle/whiskey, -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/gold, -/area/shuttle/escape) "o" = ( /obj/machinery/computer/communications{ dir = 8 @@ -84,13 +77,6 @@ /obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/mineral/gold, /area/shuttle/escape) -"q" = ( -/obj/structure/statue/plasma/scientist{ - anchored = 1; - custom_materials = list(/datum/material/plasma = 100000) - }, -/turf/open/floor/light/colour_cycle/dancefloor_b, -/area/shuttle/escape) "r" = ( /turf/open/floor/mineral/plasma/disco, /area/shuttle/escape) @@ -193,11 +179,6 @@ /obj/item/reagent_containers/cup/glass/bottle/lizardwine, /turf/open/floor/wood, /area/shuttle/escape) -"M" = ( -/obj/machinery/power/shuttle_engine/heater, -/obj/structure/window/reinforced/plasma/spawner/directional/north, -/turf/open/floor/plating/airless, -/area/shuttle/escape) "N" = ( /obj/machinery/power/shuttle_engine/propulsion, /turf/open/floor/plating/airless, @@ -205,9 +186,31 @@ "O" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/shuttle/escape) +"P" = ( +/obj/structure/statue/plasma/scientist{ + anchored = 1; + custom_materials = list(/datum/material/plasma=100000) + }, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/shuttle/escape) "R" = ( /turf/open/floor/light/colour_cycle/dancefloor_b, /area/shuttle/escape) +"U" = ( +/obj/structure/table/wood/poker, +/obj/item/storage/box/drinkingglasses, +/obj/item/reagent_containers/cup/glass/bottle/whiskey, +/turf/open/floor/mineral/gold, +/area/shuttle/escape) +"X" = ( +/obj/machinery/power/shuttle_engine/heater, +/obj/structure/window/reinforced/plasma/spawner/directional/north, +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"Y" = ( +/obj/machinery/light/floor, +/turf/open/floor/mineral/gold, +/area/shuttle/escape) (1,1,1) = {" a @@ -239,7 +242,7 @@ b b b O -q +P r r r @@ -249,7 +252,7 @@ r r r r -q +P c x C @@ -278,7 +281,7 @@ c x D D -M +X N "} (4,1,1) = {" @@ -302,7 +305,7 @@ c x x x -M +X N "} (5,1,1) = {" @@ -326,14 +329,14 @@ c y E y -M +X N "} (6,1,1) = {" c f -j -n +Y +U c r j @@ -350,7 +353,7 @@ c z F J -M +X N "} (7,1,1) = {" @@ -374,7 +377,7 @@ c y G y -M +X N "} (8,1,1) = {" @@ -398,7 +401,7 @@ c x x x -M +X N "} (9,1,1) = {" @@ -422,7 +425,7 @@ c A x K -M +X N "} (10,1,1) = {" @@ -431,7 +434,7 @@ b b b O -q +P r r r @@ -441,7 +444,7 @@ r r r r -q +P c B H diff --git a/_maps/shuttles/emergency_donut.dmm b/_maps/shuttles/emergency_donut.dmm index 795d6bf9efba7..67dc9f62da7ae 100644 --- a/_maps/shuttles/emergency_donut.dmm +++ b/_maps/shuttles/emergency_donut.dmm @@ -37,12 +37,6 @@ /obj/machinery/computer/crew, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"aj" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/machinery/light/directional/east, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "ak" = ( /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) @@ -70,12 +64,6 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"ap" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "aq" = ( /obj/structure/table, /turf/open/floor/mineral/titanium/blue, @@ -167,13 +155,6 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"aG" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "aH" = ( /obj/machinery/status_display/evac, /turf/closed/wall/mineral/titanium/nodiagonal, @@ -185,19 +166,6 @@ /obj/item/storage/box/handcuffs, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"aJ" = ( -/obj/machinery/light/directional/south, -/obj/machinery/vending/wallmed/directional/south{ - use_power = 0 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) -"aK" = ( -/obj/structure/table, -/obj/machinery/recharger, -/obj/structure/reagent_dispensers/wall/peppertank/directional/north, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "aL" = ( /obj/machinery/door/airlock/public/glass{ name = "Emergency Shuttle Brig" @@ -245,32 +213,6 @@ }, /turf/open/floor/plating, /area/shuttle/escape) -"aU" = ( -/obj/machinery/light/directional/south, -/obj/machinery/light/directional/north, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/vending/wallmed/directional/south{ - use_power = 0 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) -"aV" = ( -/obj/machinery/light/directional/north, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) -"aW" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) -"aX" = ( -/obj/structure/chair/comfy/shuttle, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "aY" = ( /obj/structure/sign/departments/medbay/alt/directional/south, /turf/open/floor/mineral/titanium, @@ -330,12 +272,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/shuttle/escape) -"bi" = ( -/obj/machinery/light/directional/south, -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/shuttle/escape) "bj" = ( /obj/structure/sink/directional/east, /turf/open/floor/mineral/titanium/white, @@ -344,7 +280,87 @@ /obj/machinery/shower/directional/west, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) -"bl" = ( +"bm" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/shuttle/escape) +"bo" = ( +/obj/structure/table, +/obj/item/storage/medkit/fire, +/obj/item/storage/medkit/regular{ + pixel_x = 2; + pixel_y = 3 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"bp" = ( +/obj/structure/table, +/obj/item/storage/medkit/toxin, +/obj/item/storage/medkit/o2{ + pixel_x = 3; + pixel_y = 3 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"br" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/recharge_station, +/turf/open/floor/iron, +/area/shuttle/escape) +"bt" = ( +/obj/machinery/power/shuttle_engine/propulsion, +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"ed" = ( +/obj/item/surgery_tray/full, +/obj/item/clothing/suit/apron/surgical, +/obj/item/clothing/mask/surgical, +/obj/structure/table/optable, +/obj/machinery/light/directional/north, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"gT" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"im" = ( +/obj/machinery/stasis{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"ls" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/shuttle/escape) +"mo" = ( +/obj/structure/table, +/obj/item/defibrillator/loaded, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"sE" = ( +/obj/structure/chair/comfy/shuttle, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"wN" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"xg" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"BR" = ( /obj/structure/closet/crate/medical, /obj/item/storage/medkit/regular, /obj/item/storage/medkit/o2{ @@ -361,7 +377,6 @@ }, /obj/item/lazarus_injector, /obj/effect/turf_decal/bot, -/obj/machinery/light/directional/south, /mob/living/simple_animal/bot/medbot{ name = "\improper emergency medibot"; pixel_x = -3; @@ -369,14 +384,44 @@ }, /turf/open/floor/iron, /area/shuttle/escape) -"bm" = ( +"EJ" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/light/directional/west, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"IV" = ( +/obj/machinery/stasis, +/obj/machinery/light/directional/north, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"Je" = ( /obj/structure/closet/emcloset, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/light/directional/north, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"JG" = ( +/obj/machinery/vending/wallmed/directional/south{ + use_power = 0 }, -/turf/open/floor/iron, +/turf/open/floor/mineral/titanium, /area/shuttle/escape) -"bn" = ( +"KN" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/obj/machinery/vending/wallmed/directional/south{ + use_power = 0 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"Ls" = ( +/obj/structure/table, +/obj/machinery/recharger, +/obj/structure/reagent_dispensers/wall/peppertank/directional/north, +/obj/machinery/light/directional/west, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"Pc" = ( /obj/structure/table, /obj/item/reagent_containers/cup/bottle/epinephrine{ pixel_x = 6 @@ -408,60 +453,28 @@ pixel_x = 2; pixel_y = 8 }, -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) -"bo" = ( -/obj/structure/table, -/obj/item/storage/medkit/fire, -/obj/item/storage/medkit/regular{ - pixel_x = 2; - pixel_y = 3 - }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"bp" = ( -/obj/structure/table, -/obj/item/storage/medkit/toxin, -/obj/item/storage/medkit/o2{ - pixel_x = 3; - pixel_y = 3 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) -"bq" = ( -/obj/structure/table, -/obj/item/defibrillator/loaded, -/obj/machinery/light/directional/south, +"Rg" = ( +/obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"br" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/recharge_station, -/turf/open/floor/iron, +"SJ" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"bs" = ( +"TC" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/machinery/power/shuttle_engine/heater, /turf/open/floor/plating/airless, /area/shuttle/escape) -"bt" = ( -/obj/machinery/power/shuttle_engine/propulsion, -/turf/open/floor/plating/airless, -/area/shuttle/escape) -"bS" = ( -/obj/item/storage/backpack/duffelbag/med/surgery, -/obj/item/clothing/suit/apron/surgical, -/obj/item/clothing/mask/surgical, -/obj/structure/table/optable, -/turf/open/floor/mineral/titanium, +"Up" = ( +/obj/structure/table, +/obj/item/storage/medkit/regular, +/turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"im" = ( -/obj/machinery/stasis{ - dir = 4 - }, +"YK" = ( +/obj/machinery/light/directional/west, /turf/open/floor/mineral/titanium, /area/shuttle/escape) @@ -514,7 +527,7 @@ ab ab ab ad -aK +Ls aC ab ak @@ -531,7 +544,7 @@ ab ad ba be -bi +ls ad ab ab @@ -548,7 +561,7 @@ ab ay ay ay -aG +ay aC aC aC @@ -558,19 +571,19 @@ am am am am +YK am am am am am -am -am +YK bb bb bb bm ab -bs +TC bt "} (4,1,1) = {" @@ -579,7 +592,7 @@ ad ak ak an -ap +EJ ab az aC @@ -589,7 +602,7 @@ aC aC aQ ab -ak +SJ am am aM @@ -606,7 +619,7 @@ ac ac ab ab -bs +TC bt "} (5,1,1) = {" @@ -627,22 +640,22 @@ aQ ab ak am -aJ +JG ab ac ab ac ab -aV -aW -aX +Rg +wN +sE aY ab -bS +ed bj -bn +Pc ab -bs +TC bt "} (6,1,1) = {" @@ -670,15 +683,15 @@ aO aO aO am -aW -aX +wN +sE am bc bg bg bg ab -bs +TC bt "} (7,1,1) = {" @@ -706,15 +719,15 @@ am am am am -aW -aX +wN +sE aZ ac bf bg bo ab -bs +TC bt "} (8,1,1) = {" @@ -742,15 +755,15 @@ am am am am -aW -aX +wN +sE aZ ac im bg bp ab -bs +TC bt "} (9,1,1) = {" @@ -758,7 +771,7 @@ ac ai al am -am +xg ad ab ab @@ -778,20 +791,20 @@ aM aM aM am -aW -aX +wN +sE am bc bg bg bg ab -bs +TC bt "} (10,1,1) = {" ab -aj +Up ak am ao @@ -801,28 +814,28 @@ ak ak ak ak -aJ +JG ab ac ab ac ab -aU +KN ab ac ab ac ab -aV -aW -aX +Rg +wN +sE aY ab -bf +IV bk -bq +mo ab -bs +TC bt "} (11,1,1) = {" @@ -858,7 +871,7 @@ ac ac ab ab -bs +TC bt "} (12,1,1) = {" @@ -868,33 +881,33 @@ ac ac ab ad -ax +Je ax aq ak ak +gT am am am am +gT am am am +gT am am am am am -am -am -am -am +gT bb bb bb br ab -bs +TC bt "} (13,1,1) = {" @@ -927,7 +940,7 @@ ab ad bd bh -bl +BR ad ab ab diff --git a/_maps/shuttles/emergency_fame.dmm b/_maps/shuttles/emergency_fame.dmm new file mode 100644 index 0000000000000..c4eeb98834bf2 --- /dev/null +++ b/_maps/shuttles/emergency_fame.dmm @@ -0,0 +1,1949 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aj" = ( +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1; + spawn_loot_count = 2; + spawn_loot_chance = 50 + }, +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"as" = ( +/obj/structure/table/wood/fancy/royalblue, +/obj/item/storage/photo_album/hall_of_fame, +/turf/open/floor/mineral/silver, +/area/shuttle/escape) +"aI" = ( +/obj/machinery/power/shuttle_engine/heater{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"aS" = ( +/obj/structure/chair/sofa/corp/corner{ + dir = 4 + }, +/turf/open/floor/mineral/silver, +/area/shuttle/escape) +"aX" = ( +/obj/machinery/door/airlock/engineering, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) +"bG" = ( +/obj/machinery/space_heater, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/shuttle/escape) +"bR" = ( +/obj/structure/chair/sofa/corp, +/turf/open/floor/mineral/silver, +/area/shuttle/escape) +"bT" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 8 + }, +/turf/open/floor/carpet/red, +/area/shuttle/escape) +"cb" = ( +/obj/effect/turf_decal/siding, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) +"ct" = ( +/obj/effect/spawner/random/trash/hobo_squat{ + spawn_loot_chance = 50 + }, +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"cu" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"cV" = ( +/obj/machinery/space_heater, +/obj/effect/turf_decal/delivery/white, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) +"dd" = ( +/obj/effect/turf_decal/siding{ + dir = 6 + }, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) +"dh" = ( +/obj/effect/spawner/random/trash/graffiti{ + spawn_loot_chance = 50 + }, +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"dp" = ( +/obj/item/kirbyplants/organic/plant16, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood, +/area/shuttle/escape) +"dr" = ( +/obj/effect/turf_decal/siding{ + dir = 4 + }, +/turf/open/floor/carpet/red, +/area/shuttle/escape) +"dy" = ( +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"el" = ( +/obj/machinery/stasis, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"et" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) +"eW" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/shuttle/escape) +"fi" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/box, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"fm" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/effect/turf_decal/box, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"fS" = ( +/obj/structure/mineral_door/silver, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"ga" = ( +/obj/machinery/door/airlock/titanium{ + name = "Emergency Shuttle Airlock" + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"gm" = ( +/obj/structure/sign/departments/medbay/alt, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/escape) +"gE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/gibspawner/human/bodypartless, +/turf/open/floor/fakebasalt, +/area/shuttle/escape/brig) +"gI" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/shuttle/escape) +"hg" = ( +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/donkpockets, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"it" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 4 + }, +/turf/open/floor/mineral/silver, +/area/shuttle/escape) +"iz" = ( +/obj/structure/kitchenspike, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/fakebasalt, +/area/shuttle/escape/brig) +"iN" = ( +/turf/open/floor/catwalk_floor, +/area/shuttle/escape) +"jH" = ( +/obj/effect/mapping_helpers/airlock/access/all/command/general, +/obj/machinery/door/airlock/command/glass{ + name = "Cockpit" + }, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"jQ" = ( +/obj/effect/turf_decal/siding{ + dir = 5 + }, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) +"jS" = ( +/obj/effect/turf_decal/siding{ + dir = 1 + }, +/turf/open/floor/carpet/red, +/area/shuttle/escape) +"kz" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 8 + }, +/turf/open/floor/mineral/silver, +/area/shuttle/escape) +"kA" = ( +/obj/structure/chair/comfy/shuttle, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/shuttle/escape) +"kM" = ( +/obj/item/radio/intercom/directional/north, +/turf/open/floor/wood, +/area/shuttle/escape) +"kR" = ( +/obj/effect/turf_decal/siding{ + dir = 1 + }, +/obj/effect/turf_decal/siding/yellow/corner, +/turf/open/floor/carpet/red, +/area/shuttle/escape) +"la" = ( +/obj/item/reagent_containers/cup/bottle/epinephrine{ + pixel_x = 6 + }, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = -3 + }, +/obj/item/reagent_containers/cup/bottle/epinephrine{ + pixel_x = -3; + pixel_y = 8 + }, +/obj/item/reagent_containers/cup/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 = 4; + pixel_y = 1 + }, +/obj/item/reagent_containers/syringe/epinephrine{ + pixel_x = -2; + pixel_y = 5 + }, +/obj/item/reagent_containers/syringe/epinephrine{ + pixel_x = 2; + pixel_y = 8 + }, +/obj/structure/table/glass, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"lr" = ( +/obj/effect/turf_decal/siding{ + dir = 10 + }, +/turf/open/floor/carpet/red, +/area/shuttle/escape) +"ly" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"lA" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/cigarettes/cigars/havana{ + pixel_y = 3 + }, +/obj/item/storage/fancy/cigarettes/cigars/cohiba{ + pixel_x = -3; + pixel_y = 8 + }, +/obj/item/lighter, +/obj/item/lighter, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) +"lB" = ( +/obj/item/kirbyplants/organic/plant16, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"lV" = ( +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/wood, +/area/shuttle/escape) +"mc" = ( +/obj/machinery/door/airlock/maintenance_hatch, +/turf/open/floor/catwalk_floor, +/area/shuttle/escape) +"mm" = ( +/obj/item/storage/toolbox/emergency, +/obj/item/crowbar, +/obj/item/wrench, +/obj/item/flashlight/flare{ + pixel_x = -6; + pixel_y = -2 + }, +/obj/item/flashlight/flare{ + pixel_x = -6; + pixel_y = -2 + }, +/obj/item/radio, +/obj/item/radio, +/obj/structure/closet, +/obj/effect/turf_decal/bot_white, +/obj/machinery/light/small/directional/west, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) +"mn" = ( +/obj/effect/turf_decal/siding{ + dir = 8 + }, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) +"mr" = ( +/obj/item/defibrillator/loaded, +/obj/structure/table/glass, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"mt" = ( +/obj/effect/turf_decal/siding{ + dir = 8 + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) +"mx" = ( +/obj/effect/mapping_helpers/engraving, +/turf/closed/wall/mineral/silver, +/area/shuttle/escape) +"mz" = ( +/obj/effect/spawner/structure/window/reinforced/shuttle, +/turf/open/floor/plating, +/area/shuttle/escape) +"mT" = ( +/obj/structure/sign/painting/large/library, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/escape) +"mZ" = ( +/obj/item/kirbyplants/organic/plant1, +/turf/open/floor/mineral/silver, +/area/shuttle/escape) +"ni" = ( +/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/latex, +/obj/item/clothing/mask/surgical, +/obj/item/surgicaldrill, +/obj/item/cautery, +/obj/structure/table/glass, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"nx" = ( +/obj/machinery/power/shuttle_engine/huge{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"oc" = ( +/obj/structure/closet/emcloset/anchored, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"ok" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) +"oz" = ( +/obj/structure/kitchenspike, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/fakebasalt, +/area/shuttle/escape/brig) +"oB" = ( +/obj/effect/spawner/structure/window/reinforced/shuttle, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"pg" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/shuttle/escape) +"px" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"pJ" = ( +/obj/effect/turf_decal/siding, +/obj/effect/turf_decal/siding/yellow{ + dir = 1 + }, +/turf/open/floor/carpet/red, +/area/shuttle/escape) +"qd" = ( +/obj/effect/turf_decal/siding{ + dir = 9 + }, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) +"qj" = ( +/obj/machinery/computer/station_alert{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"qn" = ( +/obj/structure/chair/sofa/corp/corner, +/turf/open/floor/mineral/silver, +/area/shuttle/escape) +"qr" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 4 + }, +/turf/open/floor/carpet/red, +/area/shuttle/escape) +"qx" = ( +/obj/structure/curtain/cloth/fancy{ + name = "Hall of Fame" + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"qG" = ( +/obj/structure/chair/sofa/corp{ + dir = 1 + }, +/turf/open/floor/mineral/silver, +/area/shuttle/escape) +"qM" = ( +/obj/structure/sign/nanotrasen, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/escape) +"qW" = ( +/obj/effect/turf_decal/siding{ + dir = 10 + }, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) +"rH" = ( +/obj/structure/chair/sofa/corp/corner{ + dir = 1; + name = "couch"; + desc = "Looks like someone threw it out. Covered in donut crumbs." + }, +/turf/open/floor/mineral/silver, +/area/shuttle/escape) +"rV" = ( +/obj/structure/sign/picture_frame/hall_of_fame/one, +/turf/closed/wall/mineral/gold, +/area/shuttle/escape) +"si" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external, +/turf/open/floor/catwalk_floor, +/area/shuttle/escape) +"so" = ( +/obj/item/radio/intercom/directional/north, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"ss" = ( +/obj/effect/turf_decal/siding, +/obj/effect/turf_decal/siding/yellow/corner{ + dir = 4 + }, +/turf/open/floor/carpet/red, +/area/shuttle/escape) +"th" = ( +/obj/effect/turf_decal/siding{ + dir = 1 + }, +/obj/effect/turf_decal/siding/yellow, +/turf/open/floor/carpet/red, +/area/shuttle/escape) +"vi" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/sink/directional/south, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"vD" = ( +/obj/effect/turf_decal/siding{ + dir = 9 + }, +/turf/open/floor/carpet/red, +/area/shuttle/escape) +"vK" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Brig" + }, +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"vL" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plating, +/area/shuttle/escape) +"vP" = ( +/obj/structure/chair/comfy/shuttle, +/obj/machinery/light/directional/north, +/turf/open/floor/wood, +/area/shuttle/escape) +"vT" = ( +/obj/machinery/computer/emergency_shuttle{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"vZ" = ( +/obj/effect/turf_decal/siding{ + dir = 5 + }, +/turf/open/floor/carpet/red, +/area/shuttle/escape) +"we" = ( +/obj/machinery/recharge_station, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plating, +/area/shuttle/escape) +"wu" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"wv" = ( +/obj/machinery/light/directional/south, +/obj/structure/table/wood/fancy/royalblue, +/obj/effect/spawner/random/decoration/statue, +/turf/open/floor/carpet/black, +/area/shuttle/escape) +"wK" = ( +/obj/machinery/vending/boozeomat, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"xc" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/structure/plaque/static_plaque/golden/captain{ + pixel_y = 29 + }, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"xg" = ( +/obj/structure/sign/painting/library, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/escape) +"xl" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/shuttle/escape) +"xt" = ( +/obj/effect/spawner/random/entertainment/plushie, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) +"xI" = ( +/obj/machinery/door/airlock/titanium{ + name = "Emergency Shuttle Airlock" + }, +/obj/docking_port/mobile/emergency{ + dir = 2; + name = "Hall of fame emergency shuttle" + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"yc" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/shuttle/escape) +"ye" = ( +/obj/structure/fluff/arc, +/turf/open/floor/mineral/gold, +/area/shuttle/escape) +"yo" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/decal/remains/human, +/turf/open/floor/fakebasalt, +/area/shuttle/escape/brig) +"yy" = ( +/obj/machinery/light/directional/north, +/obj/structure/table/wood/fancy/royalblue, +/obj/effect/spawner/random/decoration/statue, +/turf/open/floor/carpet/black, +/area/shuttle/escape) +"yH" = ( +/obj/structure/table, +/obj/item/clothing/mask/whistle, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"yJ" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = 3; + pixel_y = 4 + }, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = -4; + pixel_y = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"zc" = ( +/obj/structure/tank_dispenser/oxygen{ + layer = 2.7; + pixel_x = -1; + pixel_y = 2 + }, +/obj/effect/turf_decal/delivery/white, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) +"zy" = ( +/obj/effect/turf_decal/siding, +/obj/effect/turf_decal/siding/yellow/corner{ + dir = 1 + }, +/turf/open/floor/carpet/red, +/area/shuttle/escape) +"zG" = ( +/obj/effect/turf_decal/siding{ + dir = 6 + }, +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) +"Ab" = ( +/obj/structure/sign/picture_frame/hall_of_fame/four, +/turf/closed/wall/mineral/gold, +/area/shuttle/escape) +"Aw" = ( +/obj/effect/spawner/random/entertainment/arcade, +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"AA" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/glass/reinforced, +/area/shuttle/escape) +"AS" = ( +/obj/effect/turf_decal/siding, +/turf/open/floor/carpet/red, +/area/shuttle/escape) +"Bb" = ( +/obj/structure/chair/sofa/corp/left{ + desc = "Looks like someone threw it out. Covered in donut crumbs."; + name = "couch"; + dir = 4 + }, +/turf/open/floor/mineral/silver, +/area/shuttle/escape) +"Bf" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/closet/toolcloset, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) +"Bj" = ( +/turf/template_noop, +/area/template_noop) +"Cg" = ( +/turf/open/floor/iron/stairs/right{ + dir = 8 + }, +/area/shuttle/escape) +"Cz" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external, +/turf/open/floor/catwalk_floor, +/area/shuttle/escape) +"Dv" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/deck, +/turf/open/floor/wood, +/area/shuttle/escape) +"DA" = ( +/turf/open/floor/fakebasalt, +/area/shuttle/escape/brig) +"DO" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"Ec" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/turf_decal/delivery/white, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) +"Ei" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/glass/reinforced, +/area/shuttle/escape) +"EF" = ( +/obj/item/kirbyplants/organic/plant16, +/turf/open/floor/wood, +/area/shuttle/escape) +"Fi" = ( +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) +"Fl" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_y = 6 + }, +/obj/structure/sign/flag/nanotrasen/directional/south, +/obj/item/megaphone/command{ + pixel_y = 5; + pixel_x = 2 + }, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"FJ" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood, +/area/shuttle/escape) +"FZ" = ( +/obj/structure/sign/picture_frame/hall_of_fame/two, +/turf/closed/wall/mineral/gold, +/area/shuttle/escape) +"Gf" = ( +/turf/open/floor/iron/stairs/left{ + dir = 8 + }, +/area/shuttle/escape) +"Gs" = ( +/obj/structure/table, +/obj/machinery/recharger{ + active_power_usage = 0; + idle_power_usage = 0; + pixel_y = 4; + use_power = 0 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"GU" = ( +/obj/machinery/computer/crew{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"Hy" = ( +/obj/structure/table, +/obj/item/storage/box/handcuffs, +/obj/machinery/light/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"HS" = ( +/obj/structure/table/optable, +/obj/item/surgical_drapes, +/obj/machinery/light/directional/west, +/obj/machinery/defibrillator_mount/directional/west, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"HZ" = ( +/turf/open/floor/glass/reinforced, +/area/shuttle/escape) +"Ih" = ( +/obj/machinery/power/shuttle_engine/propulsion{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"JZ" = ( +/obj/machinery/computer/communications{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"Km" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) +"KG" = ( +/obj/machinery/shower/directional/south, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"Ll" = ( +/obj/effect/turf_decal/siding{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) +"Lv" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"LL" = ( +/obj/structure/chair/sofa/corp/corner{ + dir = 8 + }, +/turf/open/floor/mineral/silver, +/area/shuttle/escape) +"LR" = ( +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) +"Mb" = ( +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) +"Mj" = ( +/obj/structure/table/wood/fancy/royalblue, +/obj/item/hourglass, +/turf/open/floor/carpet/black, +/area/shuttle/escape) +"MO" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/wood, +/area/shuttle/escape) +"MS" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 8 + }, +/turf/open/floor/mineral/silver, +/area/shuttle/escape) +"MT" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/bottle/rum{ + pixel_x = -5; + pixel_y = 7 + }, +/obj/item/reagent_containers/cup/glass/bottle/amaretto{ + pixel_x = 7; + pixel_y = 5 + }, +/obj/item/reagent_containers/cup/glass/bottle/whiskey{ + pixel_y = 4 + }, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) +"MX" = ( +/obj/structure/table, +/obj/machinery/recharger{ + active_power_usage = 0; + idle_power_usage = 0; + use_power = 0 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"Nw" = ( +/obj/item/radio/intercom/directional/east, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"Ny" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/structure/reagent_dispensers/wall/peppertank/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"NN" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/effect/turf_decal/box, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"NU" = ( +/obj/structure/sign/picture_frame/hall_of_fame/three, +/turf/closed/wall/mineral/gold, +/area/shuttle/escape) +"NV" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/wood, +/area/shuttle/escape) +"Oa" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/escape) +"Or" = ( +/mob/living/basic/cockroach, +/turf/open/floor/fakebasalt, +/area/shuttle/escape/brig) +"Ow" = ( +/obj/effect/decal/cleanable/blood/gibs/old, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"OA" = ( +/obj/effect/turf_decal/siding{ + dir = 5 + }, +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) +"Pb" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"Pf" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/wood, +/area/shuttle/escape) +"Pj" = ( +/obj/effect/turf_decal/siding{ + dir = 6 + }, +/turf/open/floor/carpet/red, +/area/shuttle/escape) +"Pu" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/drinkingglass{ + pixel_x = 3; + pixel_y = 12 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass{ + pixel_x = 6; + pixel_y = 2 + }, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) +"PM" = ( +/obj/effect/turf_decal/siding{ + dir = 1 + }, +/obj/effect/turf_decal/siding/yellow/corner{ + dir = 8 + }, +/turf/open/floor/carpet/red, +/area/shuttle/escape) +"PP" = ( +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"PQ" = ( +/obj/structure/displaycase/trophy, +/turf/open/floor/wood, +/area/shuttle/escape) +"Qk" = ( +/obj/effect/turf_decal/siding{ + dir = 4 + }, +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) +"Ru" = ( +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"RZ" = ( +/turf/open/floor/wood, +/area/shuttle/escape) +"Sl" = ( +/obj/effect/turf_decal/siding{ + dir = 8 + }, +/turf/open/floor/carpet/red, +/area/shuttle/escape) +"Ty" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"Uu" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/escape) +"UA" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plating, +/area/shuttle/escape) +"Vl" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/fakebasalt, +/area/shuttle/escape/brig) +"VQ" = ( +/obj/machinery/computer/security{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"Wp" = ( +/obj/machinery/door/window/left/directional/west{ + dir = 4; + name = "Infirmary" + }, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) +"Ws" = ( +/obj/machinery/status_display/evac, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/escape) +"Xg" = ( +/obj/effect/turf_decal/siding{ + dir = 1 + }, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) +"Xl" = ( +/obj/item/kirbyplants/organic/plant16, +/obj/machinery/light/directional/west, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"Xr" = ( +/obj/effect/spawner/random/decoration/statue, +/obj/structure/table/wood/fancy/royalblue, +/turf/open/floor/carpet/black, +/area/shuttle/escape) +"Xv" = ( +/turf/open/floor/carpet/red, +/area/shuttle/escape) +"XW" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/bot, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"Yp" = ( +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"Yt" = ( +/obj/structure/table, +/obj/item/clothing/head/fedora/beige, +/obj/machinery/recharger{ + active_power_usage = 0; + idle_power_usage = 0; + use_power = 0 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"YF" = ( +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"YN" = ( +/turf/open/floor/mineral/silver, +/area/shuttle/escape) +"YS" = ( +/obj/machinery/door/window/brigdoor/security/holding/left/directional/west, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/fakebasalt, +/area/shuttle/escape/brig) +"YX" = ( +/obj/item/kirbyplants/organic/plant21, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"Zj" = ( +/obj/item/storage/medkit/regular{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/item/storage/medkit/fire, +/obj/item/storage/medkit/toxin{ + pixel_x = -3 + }, +/obj/item/storage/medkit/o2{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/table/glass, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) + +(1,1,1) = {" +Bj +Bj +Bj +Bj +Bj +Bj +Bj +Bj +Bj +Bj +YF +YF +nx +Bj +Bj +Bj +Bj +Bj +Bj +Bj +Bj +Bj +Bj +"} +(2,1,1) = {" +Bj +YF +YF +nx +Bj +Bj +Bj +Bj +Bj +Bj +YF +YF +YF +Bj +Bj +Bj +Bj +Bj +Bj +YF +YF +nx +Bj +"} +(3,1,1) = {" +Bj +YF +YF +YF +Bj +Bj +Bj +Bj +Bj +Ih +YF +YF +YF +Ih +Bj +Bj +Bj +Bj +Bj +YF +YF +YF +Bj +"} +(4,1,1) = {" +Bj +YF +YF +YF +Ih +Ih +Bj +Bj +Bj +aI +aI +aI +aI +aI +Bj +Bj +Bj +Ih +Ih +YF +YF +YF +Bj +"} +(5,1,1) = {" +Ih +aI +aI +aI +aI +aI +Bj +Bj +Bj +Uu +Oa +Oa +Oa +Uu +Bj +Bj +Bj +aI +aI +aI +aI +aI +Ih +"} +(6,1,1) = {" +aI +Oa +Oa +Oa +Oa +Oa +Uu +dh +Uu +Oa +mr +HS +ni +Oa +Uu +ct +Uu +Oa +Oa +Oa +Oa +Oa +aI +"} +(7,1,1) = {" +Oa +Oa +LR +Bf +mm +Ec +Oa +Uu +gm +el +Fi +Fi +Fi +DO +gm +Uu +Oa +UA +bG +vL +Oa +pg +Oa +"} +(8,1,1) = {" +Oa +zc +LR +Km +LR +LR +cV +Oa +KG +Fi +Fi +xt +Fi +Fi +la +Oa +we +iN +iN +iN +si +iN +Cz +"} +(9,1,1) = {" +qM +Oa +aX +Uu +Uu +Uu +Uu +Oa +vi +ok +Wp +Oa +Wp +ok +Zj +Oa +Oa +Oa +Oa +mc +Oa +Oa +qM +"} +(10,1,1) = {" +mz +fm +MO +NV +xl +xl +xl +Oa +cu +cu +Yp +Xl +Yp +cu +cu +Oa +cu +cu +cu +Yp +Ty +PP +mz +"} +(11,1,1) = {" +mz +fi +eW +RZ +RZ +RZ +RZ +fS +Yp +Pb +Yp +Yp +Yp +Nw +Yp +fS +Yp +Yp +Yp +Yp +Yp +PP +mz +"} +(12,1,1) = {" +mz +NN +eW +RZ +qM +mz +mz +Ws +Oa +Oa +qx +Oa +qx +Oa +Oa +Ws +mz +mz +qM +Yp +Yp +PP +mz +"} +(13,1,1) = {" +qM +Oa +FJ +RZ +Ws +Bj +Bj +Bj +Bj +mx +HZ +HZ +HZ +mx +Bj +Bj +Bj +Bj +mz +Yp +Yp +oc +qM +"} +(14,1,1) = {" +Oa +EF +RZ +lV +mz +yc +YF +aj +yc +mx +HZ +HZ +HZ +mx +yc +aj +YF +yc +mz +lB +Yp +px +Oa +"} +(15,1,1) = {" +ga +RZ +RZ +lV +mz +yc +YF +YF +yc +mx +HZ +AA +HZ +mx +yc +YF +YF +yc +Oa +Oa +vK +mz +Oa +"} +(16,1,1) = {" +Oa +Oa +Pf +RZ +xg +Bj +Bj +Bj +mz +mz +Cg +rV +Cg +mz +mz +Bj +Bj +Bj +Oa +MX +dy +Yt +Oa +"} +(17,1,1) = {" +ga +RZ +RZ +RZ +xg +Bj +Bj +mz +mz +mZ +vD +Sl +lr +mZ +mz +mz +Bj +Bj +Oa +wu +dy +Lv +Oa +"} +(18,1,1) = {" +mT +lV +RZ +PQ +mz +Bj +mz +mz +aS +it +jS +Xv +AS +Bb +rH +mz +mz +Bj +mz +Ru +dy +Lv +mz +"} +(19,1,1) = {" +Oa +lV +RZ +PQ +mz +yc +mz +Xr +bR +YN +kR +qr +ss +YN +qG +Xr +mz +yc +mz +Ru +dy +Lv +mz +"} +(20,1,1) = {" +Ws +vP +RZ +Dv +mz +yc +FZ +yy +bR +as +th +ye +pJ +Mj +qG +wv +Ab +yc +Ws +dy +dy +Hy +Ws +"} +(21,1,1) = {" +mT +lV +RZ +PQ +mz +yc +mz +Xr +bR +YN +PM +bT +zy +YN +qG +Xr +mz +yc +mz +Ru +dy +Lv +mz +"} +(22,1,1) = {" +Oa +lV +RZ +PQ +mz +Bj +mz +mz +qn +MS +jS +Xv +AS +kz +LL +mz +mz +Bj +mz +Ru +Ow +Lv +mz +"} +(23,1,1) = {" +xI +RZ +RZ +RZ +xg +Bj +Bj +mz +mz +mZ +vZ +dr +Pj +mZ +mz +mz +Bj +Bj +Oa +so +ly +Ny +Oa +"} +(24,1,1) = {" +Oa +Oa +kM +RZ +xg +Bj +Bj +Bj +mz +mz +Gf +NU +Gf +mz +mz +Bj +Bj +Bj +Oa +yJ +ly +yH +Oa +"} +(25,1,1) = {" +ga +RZ +RZ +lV +mz +yc +YF +YF +yc +mx +HZ +Ei +HZ +mx +yc +YF +YF +yc +mz +Vl +YS +yo +Oa +"} +(26,1,1) = {" +Oa +dp +gI +kA +mz +yc +aj +YF +yc +mx +HZ +HZ +HZ +mx +yc +YF +aj +yc +mz +DA +gE +Or +Oa +"} +(27,1,1) = {" +Uu +Oa +oc +XW +Ws +Bj +Bj +Bj +Bj +mx +HZ +HZ +HZ +mx +Bj +Bj +Bj +Bj +Oa +iz +oz +Oa +Uu +"} +(28,1,1) = {" +Bj +Uu +Oa +Oa +Uu +Bj +Bj +Uu +Oa +Oa +Oa +jH +Oa +Oa +Oa +Uu +Bj +Bj +Uu +Oa +Oa +Uu +Bj +"} +(29,1,1) = {" +Bj +Bj +Bj +Bj +Bj +Bj +Bj +Oa +YX +qd +mt +mn +Ll +qW +YX +Oa +Bj +Bj +Bj +Bj +Bj +Bj +Bj +"} +(30,1,1) = {" +Bj +Bj +Bj +Bj +Bj +Bj +Bj +Oa +Aw +Xg +et +et +et +cb +wK +Oa +Bj +Bj +Bj +Bj +Bj +Bj +Bj +"} +(31,1,1) = {" +Bj +Bj +Bj +Bj +Bj +Bj +Bj +Oa +hg +Xg +MT +Pu +lA +cb +Gs +Oa +Bj +Bj +Bj +Bj +Bj +Bj +Bj +"} +(32,1,1) = {" +Bj +Bj +Bj +Bj +Bj +Bj +Bj +Oa +xc +jQ +Mb +Mb +Mb +dd +Fl +Oa +Bj +Bj +Bj +Bj +Bj +Bj +Bj +"} +(33,1,1) = {" +Bj +Bj +Bj +Bj +Bj +Bj +Bj +Uu +Oa +GU +OA +Qk +zG +VQ +Oa +Uu +Bj +Bj +Bj +Bj +Bj +Bj +Bj +"} +(34,1,1) = {" +Bj +Bj +Bj +Bj +Bj +Bj +Bj +Bj +Uu +Oa +JZ +vT +qj +Oa +Uu +Bj +Bj +Bj +Bj +Bj +Bj +Bj +Bj +"} +(35,1,1) = {" +Bj +Bj +Bj +Bj +Bj +Bj +Bj +Bj +Bj +Uu +oB +oB +oB +Uu +Bj +Bj +Bj +Bj +Bj +Bj +Bj +Bj +Bj +"} diff --git a/_maps/shuttles/emergency_fish.dmm b/_maps/shuttles/emergency_fish.dmm index dce5270468a38..99e9848a0b048 100644 --- a/_maps/shuttles/emergency_fish.dmm +++ b/_maps/shuttles/emergency_fish.dmm @@ -21,27 +21,6 @@ /obj/effect/turf_decal/tile/brown/opposingcorners, /turf/open/floor/mineral/titanium/tiled/yellow, /area/shuttle/escape) -"aE" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/titanium/tiled/blue, -/area/shuttle/escape) -"aF" = ( -/obj/structure/chair/pew/right{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/dark/half/contrasted, -/turf/open/floor/wood/tile, -/area/shuttle/escape) -"aR" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/turf/open/misc/beach/coast{ - dir = 4 - }, -/area/shuttle/escape) "aT" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -61,6 +40,13 @@ }, /turf/open/floor/wood/tile, /area/shuttle/escape) +"cf" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/mineral/titanium/tiled/white, +/area/shuttle/escape) "cZ" = ( /obj/effect/turf_decal/stripes, /obj/structure/bed/dogbed/mcgriff, @@ -74,6 +60,10 @@ /obj/effect/turf_decal/tile/dark/fourcorners, /turf/open/floor/wood/tile, /area/shuttle/escape) +"ey" = ( +/obj/machinery/light/floor, +/turf/open/floor/carpet/blue, +/area/shuttle/escape) "eC" = ( /obj/item/toy/plush/lizard_plushie/space/green{ desc = "An adorable stuffed toy that resembles a very determined seafaring lizardperson. To ten thousand leagues and below, little guy."; @@ -81,19 +71,6 @@ }, /turf/open/water/beach, /area/shuttle/escape) -"eQ" = ( -/obj/structure/moisture_trap{ - pixel_x = -5; - pixel_y = 7 - }, -/obj/effect/turf_decal/stripes{ - dir = 4 - }, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/escape) "fh" = ( /obj/machinery/door/airlock/shuttle/glass, /obj/effect/turf_decal/tile/dark/fourcorners, @@ -158,6 +135,17 @@ /obj/effect/turf_decal/tile/dark/fourcorners, /turf/open/floor/wood/tile, /area/shuttle/escape) +"hL" = ( +/obj/machinery/light/directional/south, +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) "iA" = ( /obj/structure/chair/pew/right{ dir = 1 @@ -204,30 +192,13 @@ /obj/item/fishing_rod, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) -"kE" = ( -/obj/structure/closet/crate/internals, -/obj/machinery/light/directional/south, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/head/utility/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = 3 - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/escape) "kX" = ( /turf/open/water/beach, /area/shuttle/escape) +"lR" = ( +/obj/machinery/light/floor, +/turf/open/floor/mineral/titanium/tiled/white, +/area/shuttle/escape) "lW" = ( /turf/open/chasm, /area/shuttle/escape) @@ -239,16 +210,6 @@ /obj/machinery/door/airlock/medical/glass, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"nB" = ( -/obj/machinery/vending/wallmed/directional/north{ - use_power = 0 - }, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/dark/half/contrasted{ - dir = 1 - }, -/turf/open/floor/wood/tile, -/area/shuttle/escape) "nN" = ( /obj/effect/spawner/structure/window/reinforced/shuttle, /turf/open/floor/wood/tile, @@ -260,18 +221,6 @@ }, /turf/open/floor/wood/tile, /area/shuttle/escape) -"oc" = ( -/obj/structure/table/glass, -/obj/item/storage/medkit/regular{ - pixel_x = 2; - pixel_y = 3 - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/shuttle/escape) "og" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/dark/half/contrasted{ @@ -283,12 +232,32 @@ /obj/structure/sign/nanotrasen, /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/escape) -"oI" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 +"oB" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 }, -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/titanium/tiled/white, +/turf/open/floor/iron/white, +/area/shuttle/escape) +"oG" = ( +/obj/structure/closet/crate/internals, +/obj/item/clothing/mask/breath{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/head/utility/hardhat/orange{ + name = "protective hat"; + pixel_y = 9 + }, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = 3 + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/effect/turf_decal/bot, +/obj/machinery/light/small/directional/south, +/turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "pa" = ( /obj/machinery/vending/wallmed/directional/south, @@ -301,13 +270,6 @@ /obj/effect/turf_decal/tile/dark_red/opposingcorners, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) -"pk" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/shuttle/escape) "pQ" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/effect/turf_decal/tile/dark/half/contrasted{ @@ -324,9 +286,28 @@ }, /turf/open/floor/wood/tile, /area/shuttle/escape) +"qj" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) "qA" = ( /turf/open/floor/mineral/titanium/tiled/white, /area/shuttle/escape) +"qG" = ( +/obj/machinery/vending/wallmed/directional/east, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) "qO" = ( /obj/structure/table/wood, /obj/item/fishing_line{ @@ -355,17 +336,6 @@ /obj/effect/turf_decal/tile/dark/fourcorners, /turf/open/floor/wood/tile, /area/shuttle/escape) -"rk" = ( -/obj/machinery/light/directional/south, -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/escape) "sh" = ( /obj/effect/turf_decal/tile/dark/half/contrasted{ dir = 1 @@ -388,12 +358,12 @@ /obj/effect/turf_decal/tile/dark/opposingcorners, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"tR" = ( -/obj/machinery/light/directional/west, -/obj/machinery/computer/atmos_alert{ - dir = 4 +"tE" = ( +/obj/structure/chair/pew/right{ + dir = 1 }, -/turf/open/floor/mineral/titanium/tiled/blue, +/obj/effect/turf_decal/tile/dark/half/contrasted, +/turf/open/floor/wood/tile, /area/shuttle/escape) "ut" = ( /obj/machinery/light/directional/south, @@ -408,17 +378,24 @@ /obj/structure/extinguisher_cabinet/directional/north, /turf/open/water/beach, /area/shuttle/escape) -"wq" = ( -/obj/machinery/light/directional/east, -/obj/machinery/computer/security{ - dir = 8 - }, -/turf/open/floor/mineral/titanium/tiled/blue, -/area/shuttle/escape) "wF" = ( /obj/structure/sign/departments/medbay/alt, /turf/closed/wall/mineral/titanium, /area/shuttle/escape) +"wX" = ( +/obj/structure/moisture_trap{ + pixel_x = -5; + pixel_y = 7 + }, +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) "xx" = ( /obj/machinery/light/directional/west, /obj/effect/turf_decal/stripes/corner, @@ -439,6 +416,17 @@ }, /turf/open/floor/wood/tile, /area/shuttle/escape) +"yn" = ( +/obj/structure/table/glass, +/obj/item/storage/medkit/regular{ + pixel_x = 2; + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/shuttle/escape) "zF" = ( /obj/structure/chair/comfy/shuttle{ dir = 4 @@ -450,14 +438,12 @@ /obj/effect/turf_decal/tile/dark/half/contrasted, /turf/open/floor/wood/tile, /area/shuttle/escape) -"AN" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/light/directional/west, -/obj/structure/chair/comfy/shuttle{ +"Am" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/effect/turf_decal/tile/dark{ dir = 4 }, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/light/floor, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) "AV" = ( @@ -479,27 +465,6 @@ }, /turf/open/floor/wood/tile, /area/shuttle/escape) -"Cu" = ( -/obj/machinery/light/directional/south, -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/escape) -"CG" = ( -/obj/machinery/light/directional/south, -/obj/machinery/stasis{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/shuttle/escape) "CI" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/dark/anticorner/contrasted{ @@ -565,6 +530,13 @@ /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /turf/open/floor/iron/white, /area/shuttle/escape) +"GP" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/obj/effect/turf_decal/tile/dark/half/contrasted{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/shuttle/escape) "Hb" = ( /obj/structure/table/wood, /obj/item/storage/fancy/cigarettes/cigars{ @@ -572,11 +544,8 @@ }, /turf/open/floor/wood/tile, /area/shuttle/escape) -"Hk" = ( -/obj/machinery/light/directional/west, -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, +"Hy" = ( +/obj/item/kirbyplants/organic/plant10, /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, @@ -652,6 +621,12 @@ /obj/effect/turf_decal/tile/dark/opposingcorners, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) +"JN" = ( +/obj/machinery/computer/security{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/tiled/blue, +/area/shuttle/escape) "Kg" = ( /obj/machinery/power/shuttle_engine/propulsion, /turf/open/floor/plating/airless, @@ -691,11 +666,6 @@ "Me" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/escape) -"Ml" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/mineral/titanium/tiled/yellow, -/area/shuttle/escape) "Mp" = ( /obj/machinery/vending/wallmed/directional/north{ use_power = 0 @@ -705,21 +675,6 @@ }, /turf/open/floor/iron/white, /area/shuttle/escape) -"MO" = ( -/obj/machinery/light/directional/north, -/obj/item/fishing_line/bouncy, -/obj/item/fishing_line/bouncy, -/obj/item/fishing_line/cloaked, -/obj/item/fishing_line/cloaked, -/obj/item/fishing_line/reinforced, -/obj/item/fishing_line/reinforced, -/obj/effect/turf_decal/stripes, -/obj/item/fishing_rod, -/obj/structure/closet{ - anchored = 1 - }, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/escape) "Nc" = ( /obj/effect/turf_decal/tile/dark/opposingcorners, /obj/effect/turf_decal/tile/dark{ @@ -752,14 +707,6 @@ /obj/effect/turf_decal/tile/dark, /turf/open/floor/wood/tile, /area/shuttle/escape) -"OF" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/dark/half/contrasted{ - dir = 1 - }, -/turf/open/floor/wood/tile, -/area/shuttle/escape) "OR" = ( /obj/machinery/light/directional/north, /obj/machinery/vending/wallmed/directional/north{ @@ -800,12 +747,20 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) -"Rb" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 +"Ra" = ( +/obj/item/fishing_line/bouncy, +/obj/item/fishing_line/bouncy, +/obj/item/fishing_line/cloaked, +/obj/item/fishing_line/cloaked, +/obj/item/fishing_line/reinforced, +/obj/item/fishing_line/reinforced, +/obj/effect/turf_decal/stripes, +/obj/item/fishing_rod, +/obj/structure/closet{ + anchored = 1 }, -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/titanium/tiled/white, +/obj/machinery/light/small/directional/north, +/turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "Sf" = ( /obj/structure/chair/pew/left{ @@ -825,6 +780,13 @@ /obj/structure/sign/warning/fire, /turf/closed/wall/mineral/titanium, /area/shuttle/escape) +"SS" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/mineral/titanium/tiled/white, +/area/shuttle/escape) "Tn" = ( /turf/open/floor/carpet/blue, /area/shuttle/escape) @@ -864,6 +826,9 @@ dir = 4 }, /area/shuttle/escape) +"UO" = ( +/turf/open/floor/mineral/titanium/tiled/blue, +/area/shuttle/escape) "US" = ( /obj/structure/table/wood, /obj/item/book/random{ @@ -884,7 +849,7 @@ /area/shuttle/escape) "VD" = ( /obj/structure/table/glass, -/obj/item/storage/backpack/duffelbag/med/surgery{ +/obj/item/surgery_tray/full{ pixel_y = 6 }, /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ @@ -908,28 +873,20 @@ /obj/machinery/computer/emergency_shuttle, /turf/open/floor/mineral/titanium/tiled/blue, /area/shuttle/escape) -"WT" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/dark/half/contrasted{ - dir = 8 - }, -/turf/open/floor/wood/tile, -/area/shuttle/escape) "WX" = ( /obj/structure/sign/warning, /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/escape) -"WY" = ( -/obj/machinery/vending/wallmed/directional/east, -/obj/machinery/light/directional/east, +"Xx" = ( /obj/structure/chair/comfy/shuttle{ - dir = 8 + dir = 4 }, /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/tile/dark/opposingcorners, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"Xx" = ( +"XP" = ( +/obj/structure/extinguisher_cabinet/directional/west, /obj/structure/chair/comfy/shuttle{ dir = 4 }, @@ -942,6 +899,15 @@ /obj/effect/turf_decal/tile/dark/full, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) +"Ys" = ( +/obj/machinery/vending/wallmed/directional/north{ + use_power = 0 + }, +/obj/effect/turf_decal/tile/dark/half/contrasted{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/shuttle/escape) "YO" = ( /obj/structure/chair/pew/left, /obj/effect/turf_decal/tile/dark/fourcorners, @@ -961,6 +927,12 @@ /obj/effect/turf_decal/tile/dark/opposingcorners, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) +"ZZ" = ( +/obj/machinery/computer/atmos_alert{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/tiled/blue, +/area/shuttle/escape) (1,1,1) = {" UW @@ -1002,13 +974,13 @@ Lo Id Sf YO -WT +Id xH Me -pk +oB FA VD -CG +FA kd Me UW @@ -1024,7 +996,7 @@ Me UW Me jL -tR +ZZ aa sh Fc @@ -1038,7 +1010,7 @@ Mp DM DM DM -Hk +Hy jL Me UW @@ -1068,7 +1040,7 @@ GK Qw GK GK -oc +yn Me UW Me @@ -1081,7 +1053,7 @@ Kg (5,1,1) = {" Me oA -oI +SS qA aa sh @@ -1090,7 +1062,7 @@ vH ec Wj US -aF +tE jL jL nz @@ -1101,7 +1073,7 @@ wF Me aa PS -AN +XP Xx xA Ie @@ -1111,9 +1083,9 @@ Kg aa Bq NW -aE +UO Me -OF +GP zP Ih iA @@ -1140,7 +1112,7 @@ Kg aa WO aT -qA +lR KW sh Ih @@ -1150,16 +1122,16 @@ Ih Ih Tn Tn +ey Tn Tn Tn -Tn -Tn +ey Tn Tn PQ jw -Nc +Am gX Pd Ie @@ -1169,9 +1141,9 @@ Kg aa Bq ax -aE +UO Me -nB +Ys Ih Ih Ih @@ -1197,7 +1169,7 @@ Kg (9,1,1) = {" Me oA -Rb +cf qA aa qe @@ -1217,7 +1189,7 @@ Me Me nN jL -WY +qG ZT xA Ie @@ -1234,15 +1206,15 @@ gI UL UL gI -aR +UL Me -eQ -rk +wX +qj jL ko az DB -kE +oG Me UW Me @@ -1256,7 +1228,7 @@ Kg UW Me jL -wq +JN aa kX kX @@ -1270,7 +1242,7 @@ pa jL gd sr -Ml +sr jL Me UW @@ -1295,9 +1267,9 @@ kX ut Me lW -Cu +hL jL -MO +Ra jY jL Me diff --git a/_maps/shuttles/emergency_goon.dmm b/_maps/shuttles/emergency_goon.dmm index b21fb973e9d8e..63cbc0dfc80bf 100644 --- a/_maps/shuttles/emergency_goon.dmm +++ b/_maps/shuttles/emergency_goon.dmm @@ -8,16 +8,15 @@ }, /turf/open/floor/plating, /area/shuttle/escape) -"c" = ( -/obj/machinery/power/shuttle_engine/heater{ - dir = 8 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/plating, -/area/shuttle/escape) "d" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/escape) +"e" = ( +/obj/structure/table/reinforced, +/obj/item/storage/medkit/regular, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) "f" = ( /obj/machinery/status_display/evac, /turf/closed/wall/mineral/titanium, @@ -38,15 +37,6 @@ }, /turf/open/floor/plating, /area/shuttle/escape) -"i" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/obj/machinery/vending/wallmed/directional/west{ - use_power = 0 - }, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "j" = ( /obj/structure/chair/comfy/shuttle{ dir = 4 @@ -56,6 +46,20 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) +"k" = ( +/obj/machinery/power/shuttle_engine/propulsion{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/plating, +/area/shuttle/escape) +"l" = ( +/obj/machinery/power/shuttle_engine/heater{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/plating, +/area/shuttle/escape) "m" = ( /obj/effect/spawner/structure/window/reinforced/shuttle, /turf/open/floor/plating, @@ -66,13 +70,6 @@ "o" = ( /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"p" = ( -/obj/machinery/power/shuttle_engine/heater{ - dir = 8 - }, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/plating, -/area/shuttle/escape) "q" = ( /obj/machinery/stasis{ dir = 4 @@ -109,24 +106,31 @@ }, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) -"y" = ( +"x" = ( /obj/structure/table/reinforced, /obj/item/storage/toolbox/emergency, /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) +"z" = ( +/obj/machinery/power/shuttle_engine/heater{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/plating, +/area/shuttle/escape) "A" = ( /obj/structure/chair/comfy/brown{ dir = 4 }, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) -"B" = ( -/obj/structure/window/reinforced/spawner/directional/east, +"C" = ( +/obj/machinery/power/shuttle_engine/heater{ + dir = 8 + }, /obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/table/reinforced, -/obj/item/radio, -/turf/open/floor/mineral/titanium/yellow, +/turf/open/floor/plating, /area/shuttle/escape) "D" = ( /obj/structure/chair/comfy/brown{ @@ -145,26 +149,12 @@ "F" = ( /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) -"G" = ( -/obj/machinery/computer/emergency_shuttle{ - dir = 8 - }, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/mineral/titanium/yellow, -/area/shuttle/escape) "H" = ( /obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"I" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/item/storage/medkit/regular, -/turf/open/floor/mineral/titanium/yellow, -/area/shuttle/escape) "J" = ( /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) @@ -175,15 +165,36 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"L" = ( +"M" = ( /obj/structure/table/reinforced, -/obj/item/storage/medkit/regular, +/obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/south, +/obj/item/storage/medkit/regular, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) -"Q" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/titanium, +"N" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/machinery/vending/wallmed/directional/west{ + use_power = 0 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"O" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/table/reinforced, +/obj/item/radio, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) +"P" = ( +/obj/machinery/computer/emergency_shuttle{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "R" = ( /obj/machinery/light/small/directional/south, @@ -203,28 +214,10 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"V" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) -"W" = ( +"U" = ( /obj/machinery/power/shuttle_engine/propulsion{ dir = 4 }, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/plating, -/area/shuttle/escape) -"X" = ( -/obj/machinery/power/shuttle_engine/propulsion{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/plating, -/area/shuttle/escape) -"Y" = ( -/obj/machinery/power/shuttle_engine/heater{ - dir = 8 - }, /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/plating, /area/shuttle/escape) @@ -249,20 +242,20 @@ d a "} (2,1,1) = {" -W +k d -p -p -p +l +l +l d -p -p -p +l +l +l d -X +U "} (3,1,1) = {" -c +C d q v @@ -272,7 +265,7 @@ H H H d -Y +z "} (4,1,1) = {" d @@ -306,7 +299,7 @@ d s r s -i +N s r s @@ -330,11 +323,11 @@ a d d s -Q +r d m d -V +r s d d @@ -434,11 +427,11 @@ a a a m -y +x A F A -L +e m a a @@ -461,9 +454,9 @@ a a a m -B -G -I +O +P +M m a a diff --git a/_maps/shuttles/emergency_hugcage.dmm b/_maps/shuttles/emergency_hugcage.dmm index 3bbb07ec16251..80211ed6092ea 100644 --- a/_maps/shuttles/emergency_hugcage.dmm +++ b/_maps/shuttles/emergency_hugcage.dmm @@ -27,7 +27,7 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/escape/brig) "cW" = ( -/mob/living/simple_animal/pet/fox, +/mob/living/basic/pet/fox, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "dz" = ( @@ -111,7 +111,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "hH" = ( -/mob/living/simple_animal/pet/penguin/baby, +/mob/living/basic/pet/penguin/baby/permanent, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "iI" = ( diff --git a/_maps/shuttles/emergency_humpback.dmm b/_maps/shuttles/emergency_humpback.dmm new file mode 100644 index 0000000000000..f4c50bf6b84ec --- /dev/null +++ b/_maps/shuttles/emergency_humpback.dmm @@ -0,0 +1,1308 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ao" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"at" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"bL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"bS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"bT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"cK" = ( +/turf/open/floor/iron/smooth_half/airless, +/area/shuttle/escape) +"df" = ( +/obj/machinery/door/airlock/external, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/turf_decal/siding/blue, +/obj/effect/mapping_helpers/airlock/access/all/command/general, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "evac3" + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"dl" = ( +/obj/structure/chair/sofa/right{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/shuttle/escape) +"dF" = ( +/obj/machinery/power/shuttle_engine/propulsion{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/shuttle/escape/brig) +"dP" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/spawner/random/food_or_drink/booze, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"ed" = ( +/obj/structure/table, +/obj/item/storage/medkit/regular, +/obj/item/storage/medkit/toxin{ + pixel_x = 4; + pixel_y = 4 + }, +/turf/open/floor/wood/large, +/area/shuttle/escape) +"ez" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Cyborg Bay" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"eK" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/power/shuttle_engine/heater{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"eU" = ( +/obj/machinery/door/airlock/external/glass, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "evac3" + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"eW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"fu" = ( +/obj/machinery/computer/emergency_shuttle{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"gL" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Escape Shuttle Brig" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"gW" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/east, +/obj/machinery/vending/boozeomat/all_access, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"hd" = ( +/obj/machinery/atmospherics/components/binary/pump/on/supply{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"he" = ( +/obj/machinery/vending/wallmed/directional/east, +/turf/open/floor/wood/large, +/area/shuttle/escape) +"hk" = ( +/obj/machinery/light/directional/north, +/obj/structure/table, +/obj/machinery/recharger, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"hp" = ( +/obj/structure/lattice/catwalk, +/turf/template_noop, +/area/shuttle/escape) +"hs" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/iron/showroomfloor, +/area/shuttle/escape) +"hA" = ( +/turf/open/floor/iron/smooth_half/airless{ + dir = 1 + }, +/area/shuttle/escape) +"ig" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"iW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"ji" = ( +/obj/machinery/door/airlock/external, +/obj/effect/turf_decal/siding/blue, +/obj/effect/mapping_helpers/airlock/access/all/command/general, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "evac3" + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"jJ" = ( +/obj/machinery/computer/arcade/orion_trail{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"kB" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "evac3" + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"kZ" = ( +/obj/structure/table, +/obj/item/storage/medkit/fire, +/obj/item/storage/medkit/brute{ + pixel_x = 4; + pixel_y = 4 + }, +/turf/open/floor/wood/large, +/area/shuttle/escape) +"my" = ( +/obj/machinery/computer/security{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"mF" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/turf/open/floor/plating, +/area/shuttle/escape) +"mI" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/chair/plastic{ + dir = 8 + }, +/turf/template_noop, +/area/shuttle/escape) +"mO" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/light/small/dim/directional/east, +/turf/template_noop, +/area/shuttle/escape) +"nm" = ( +/obj/structure/chair/stool/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"ns" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/machinery/cell_charger, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"nG" = ( +/turf/open/floor/wood/large, +/area/shuttle/escape) +"nQ" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/escape/brig) +"oj" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"oO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron/smooth, +/area/shuttle/escape) +"oP" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/west, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/machinery/chem_dispenser/drinks{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"po" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron/smooth_corner/airless, +/area/shuttle/escape) +"pE" = ( +/obj/machinery/door/window/brigdoor/left/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"qp" = ( +/obj/machinery/recharge_station, +/obj/machinery/light/small/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"qP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"rr" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"rt" = ( +/obj/machinery/power/shuttle_engine/propulsion{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"rw" = ( +/obj/machinery/computer/crew{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"ry" = ( +/obj/structure/table, +/obj/item/trash/chips, +/turf/open/floor/iron/smooth, +/area/shuttle/escape) +"rA" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/machinery/vending/wallmed/directional/west, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"rL" = ( +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon/jade, +/turf/template_noop, +/area/shuttle/escape) +"sQ" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/south, +/obj/structure/window/reinforced/plasma/spawner/directional/east, +/obj/structure/window/reinforced/plasma/spawner/directional/west, +/obj/structure/window/reinforced/plasma/spawner/directional/north, +/obj/structure/bonfire/prelit, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/iron/smooth_corner/airless{ + dir = 1 + }, +/area/shuttle/escape) +"tY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/button/flasher{ + pixel_y = 26; + pixel_x = 26; + id = "evacflash" + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"uw" = ( +/obj/machinery/computer/atmos_control/air_tank{ + atmos_chambers = list("evacair" = "Mixed Air Supply") + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"uW" = ( +/obj/machinery/recharge_station, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"vk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron/smooth_half/airless, +/area/shuttle/escape) +"vn" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/power/shuttle_engine/heater{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/shuttle/escape/brig) +"vw" = ( +/turf/template_noop, +/area/template_noop) +"vF" = ( +/obj/structure/chair/stool/bar/directional/south{ + can_buckle = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"vO" = ( +/obj/structure/closet, +/obj/item/multitool, +/obj/effect/spawner/random/engineering/toolbox, +/obj/machinery/light/small/directional/north, +/obj/effect/spawner/random/contraband/narcotics, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"vR" = ( +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"wf" = ( +/obj/machinery/door/airlock/mining/glass{ + name = "Emergency Shuttle Cargo Hold" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"xb" = ( +/obj/structure/sign/departments/medbay/alt, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/escape/brig) +"xy" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/machinery/light/small/dim/directional/east, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"yc" = ( +/obj/structure/statue/gold/hos, +/obj/machinery/light/floor, +/turf/open/floor/mineral/diamond, +/area/shuttle/escape) +"yh" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/table, +/obj/item/binoculars, +/turf/template_noop, +/area/shuttle/escape) +"yH" = ( +/obj/structure/chair/sofa/middle{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/smooth, +/area/shuttle/escape) +"yN" = ( +/obj/machinery/door/airlock/grunge{ + name = "Emergency Shuttle Airlock" + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"zn" = ( +/obj/structure/table, +/obj/item/surgery_tray/full, +/turf/open/floor/iron/showroomfloor, +/area/shuttle/escape) +"zr" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/iron/smooth_half/airless{ + dir = 1 + }, +/area/shuttle/escape) +"zG" = ( +/obj/machinery/chem_master, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"zH" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"zZ" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/machinery/recharger, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"Af" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"Ax" = ( +/obj/structure/railing/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron/smooth_half/airless{ + dir = 4 + }, +/area/shuttle/escape) +"AA" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"Bu" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"Ch" = ( +/obj/structure/chair/sofa/left{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/shuttle/escape) +"Cl" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay" + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/shuttle/escape) +"CA" = ( +/obj/effect/spawner/random/structure/crate_loot, +/obj/effect/spawner/random/maintenance/seven, +/obj/item/reagent_containers/pill/maintenance, +/obj/item/reagent_containers/pill/maintenance, +/obj/item/reagent_containers/pill/maintenance, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"CH" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"CW" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/table, +/obj/item/binoculars, +/turf/open/floor/iron/smooth_corner/airless{ + dir = 1 + }, +/area/shuttle/escape) +"Df" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"Dj" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/monitored/air_output{ + dir = 1; + chamber_id = "evacair" + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine/air, +/area/shuttle/escape/brig) +"Ef" = ( +/obj/machinery/smartfridge/chemistry/preloaded, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"EJ" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/showroomfloor, +/area/shuttle/escape) +"EO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"Fw" = ( +/obj/machinery/door/airlock/external/glass, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "evac3" + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"FG" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Escape Shuttle Brig" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/effect/turf_decal/stripes/line, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"FZ" = ( +/obj/structure/railing/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron/smooth_half/airless{ + dir = 1 + }, +/area/shuttle/escape) +"GR" = ( +/turf/open/floor/iron/smooth, +/area/shuttle/escape) +"IB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/mineral/diamond, +/area/shuttle/escape) +"JB" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"JW" = ( +/obj/machinery/light/directional/north, +/obj/machinery/computer/operating, +/turf/open/floor/iron/showroomfloor, +/area/shuttle/escape) +"Kf" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/storage/box/drinkingglasses, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"Ko" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"Kv" = ( +/obj/structure/tank_dispenser/oxygen, +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"KP" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/west, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/machinery/reagentgrinder, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"KX" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/turf/open/floor/plating, +/area/shuttle/escape/brig) +"Lk" = ( +/obj/structure/statue/diamond/ai2, +/obj/machinery/light/floor, +/turf/open/floor/mineral/diamond, +/area/shuttle/escape) +"Lp" = ( +/obj/structure/closet/crate/secure/loot, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"LB" = ( +/obj/machinery/door/airlock/command{ + name = "Cockpit" + }, +/obj/effect/mapping_helpers/airlock/access/all/command/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"LC" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"LN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"LY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/flasher/directional/east{ + id = "evacflash" + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"MP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/wood/large, +/area/shuttle/escape) +"MU" = ( +/obj/machinery/door/airlock/external, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "evac3" + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"MY" = ( +/obj/structure/railing/corner/end/flip, +/obj/structure/railing/corner/end{ + dir = 1 + }, +/turf/open/floor/iron/smooth_half/airless{ + dir = 1 + }, +/area/shuttle/escape) +"NR" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"Oj" = ( +/turf/closed/wall/mineral/plastitanium, +/area/shuttle/escape) +"Oo" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"Oq" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, +/turf/open/floor/plating, +/area/shuttle/escape/brig) +"Ot" = ( +/obj/machinery/door/airlock/external, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "evac3" + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"OO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/wood/large, +/area/shuttle/escape) +"Pt" = ( +/obj/machinery/stasis, +/turf/open/floor/iron/showroomfloor, +/area/shuttle/escape) +"PS" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/shuttle/escape) +"PX" = ( +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"Qe" = ( +/obj/machinery/light/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"Sl" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/escape) +"Sx" = ( +/obj/structure/table/optable, +/turf/open/floor/iron/showroomfloor, +/area/shuttle/escape) +"SC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"SJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/light/directional/west, +/obj/machinery/vending/cigarette, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"Ta" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/mineral/diamond, +/area/shuttle/escape) +"Te" = ( +/turf/closed/wall/mineral/plastitanium, +/area/shuttle/escape/brig) +"Ty" = ( +/obj/machinery/door/airlock/grunge{ + name = "Emergency Shuttle Airlock" + }, +/obj/docking_port/mobile/emergency, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"UR" = ( +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/iron/smooth, +/area/shuttle/escape) +"VH" = ( +/obj/structure/railing, +/turf/open/floor/iron/smooth_corner/airless{ + dir = 1 + }, +/area/shuttle/escape) +"VL" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "evac3" + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"WG" = ( +/obj/structure/chair/comfy/shuttle, +/obj/item/restraints/handcuffs, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"Xh" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/west, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/machinery/chem_dispenser/drinks/beer{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"Xi" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/east, +/obj/machinery/light/directional/south, +/obj/structure/closet/cabinet, +/obj/item/reagent_containers/cup/glass/shaker, +/obj/item/storage/fancy/cigarettes/cigars/havana, +/obj/item/instrument/guitar, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"Xv" = ( +/obj/machinery/door/airlock/external/glass, +/turf/open/floor/plating, +/area/shuttle/escape) +"XQ" = ( +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"Ys" = ( +/obj/machinery/computer/communications{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"YF" = ( +/obj/machinery/air_sensor/air_tank{ + chamber_id = "evacair" + }, +/turf/open/floor/engine/air, +/area/shuttle/escape/brig) +"Zs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"ZG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"ZR" = ( +/obj/machinery/light/directional/west, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) + +(1,1,1) = {" +vw +Te +Te +Te +Te +KX +nQ +yN +Sl +Ty +Sl +mI +yh +Sl +Oj +yN +Sl +yN +Sl +Sl +Oj +vw +vw +vw +vw +vw +"} +(2,1,1) = {" +dF +vn +WG +NR +KX +YF +KX +XQ +Oj +XQ +mF +hp +hp +mF +SJ +LN +ez +LN +at +qp +Sl +vw +vw +vw +vw +vw +"} +(3,1,1) = {" +dF +vn +WG +ao +Oq +Dj +KX +XQ +ZR +XQ +mF +hp +mO +mF +iW +XQ +Sl +ns +XQ +uW +Sl +vw +vw +vw +vw +vw +"} +(4,1,1) = {" +Te +nQ +hk +hd +Te +Te +nQ +ZG +ZG +ZG +Sl +Xv +Oj +Sl +bS +ZG +Sl +Xh +oP +KP +Sl +Sl +mF +mF +mF +vw +"} +(5,1,1) = {" +dF +vn +uw +ao +gL +bL +FG +EO +vR +vR +rr +vR +Af +rA +EO +vF +dP +vR +vR +Kf +mF +oj +my +zZ +mF +mF +"} +(6,1,1) = {" +dF +vn +nQ +Te +Te +Te +xb +EO +EO +EO +EO +EO +EO +vR +EO +vF +dP +zH +EO +zG +mF +XQ +ig +XQ +rw +mF +"} +(7,1,1) = {" +rt +eK +Pt +EJ +MP +OO +Cl +EO +CH +vR +vR +vR +EO +EO +EO +Df +Sl +gW +pE +Xi +Sl +Qe +LN +PX +fu +mF +"} +(8,1,1) = {" +rt +eK +Pt +hs +OO +nG +mF +vR +vR +Oo +Bu +Oo +EO +Oo +Ko +EO +EO +eW +EO +LY +LB +tY +Zs +XQ +Ys +mF +"} +(9,1,1) = {" +Oj +Sl +JW +hs +PS +nG +Ef +bT +LC +Sl +Sl +Sl +wf +Sl +Sl +Oj +Oj +Oj +Oj +Oj +Sl +mF +Sl +mF +mF +mF +"} +(10,1,1) = {" +rt +eK +Sx +hs +nG +ed +Sl +nm +jJ +Sl +CA +SC +EO +Sl +ry +Ch +yH +dl +GR +cK +VL +XQ +ji +Ta +Lk +mF +"} +(11,1,1) = {" +rt +eK +zn +hs +he +kZ +Oj +Sl +Sl +Oj +vO +EO +Lp +Oj +UR +GR +oO +oO +oO +vk +MU +LN +df +IB +yc +mF +"} +(12,1,1) = {" +vw +Oj +Oj +Oj +Oj +Oj +Oj +JB +Kv +Oj +Oj +wf +Oj +Sl +GR +po +FZ +zr +MY +CW +Sl +mF +Sl +mF +mF +mF +"} +(13,1,1) = {" +vw +vw +vw +vw +rt +eK +AA +zH +EO +Fw +qP +EO +qP +Ot +oO +Ax +sQ +vw +rL +vw +vw +vw +vw +vw +vw +vw +"} +(14,1,1) = {" +vw +vw +vw +vw +rt +eK +xy +vR +vR +eU +vR +CH +vR +kB +hA +VH +vw +vw +hp +vw +vw +vw +vw +vw +vw +vw +"} +(15,1,1) = {" +vw +vw +vw +vw +vw +Oj +Sl +kB +kB +Sl +mF +mF +mF +Sl +Oj +mF +vw +vw +rL +vw +vw +vw +vw +vw +vw +vw +"} +(16,1,1) = {" +vw +vw +vw +vw +vw +vw +vw +vw +vw +vw +vw +vw +vw +vw +vw +vw +vw +vw +hp +vw +vw +vw +vw +vw +vw +vw +"} +(17,1,1) = {" +vw +vw +vw +vw +vw +vw +vw +vw +vw +vw +vw +vw +vw +vw +vw +vw +vw +vw +rL +vw +vw +vw +vw +vw +vw +vw +"} diff --git a/_maps/shuttles/emergency_imfedupwiththisworld.dmm b/_maps/shuttles/emergency_imfedupwiththisworld.dmm index 632b3d16fac31..82bc9dc7ca373 100644 --- a/_maps/shuttles/emergency_imfedupwiththisworld.dmm +++ b/_maps/shuttles/emergency_imfedupwiththisworld.dmm @@ -12,10 +12,6 @@ "d" = ( /turf/open/floor/wood, /area/shuttle/escape) -"e" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/carpet, -/area/shuttle/escape) "f" = ( /obj/structure/chair/comfy/teal, /turf/open/floor/carpet, @@ -124,7 +120,6 @@ /turf/open/floor/wood, /area/shuttle/escape) "B" = ( -/obj/machinery/light/directional/south, /obj/structure/table/wood, /obj/item/paper_bin, /obj/item/pen, @@ -183,7 +178,7 @@ a "} (3,1,1) = {" a -e +h l h h diff --git a/_maps/shuttles/emergency_kilo.dmm b/_maps/shuttles/emergency_kilo.dmm index 76d3c0b95f71e..39a1a99ea9a7a 100644 --- a/_maps/shuttles/emergency_kilo.dmm +++ b/_maps/shuttles/emergency_kilo.dmm @@ -44,20 +44,6 @@ /obj/structure/sign/nanotrasen, /turf/closed/wall/mineral/titanium, /area/shuttle/escape) -"aj" = ( -/obj/structure/table/reinforced, -/obj/machinery/recharger, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/escape) -"an" = ( -/obj/structure/table/reinforced, -/obj/item/clipboard, -/obj/item/restraints/handcuffs, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/assembly/flash/handheld, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/escape) "ao" = ( /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/stripes/line{ @@ -259,20 +245,6 @@ /obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) -"bv" = ( -/obj/structure/sign/departments/security/directional/north, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/bot, -/obj/structure/chair/comfy/shuttle, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/escape) -"by" = ( -/obj/structure/sign/departments/engineering/directional/north, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/bot, -/obj/structure/chair/comfy/shuttle, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/escape) "bB" = ( /obj/effect/turf_decal/bot, /obj/structure/chair/comfy/shuttle{ @@ -307,6 +279,17 @@ }, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) +"bL" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/shuttle/escape) "bO" = ( /obj/structure/flora/bush/grassy/style_random, /obj/structure/flora/bush/lavendergrass/style_random, @@ -335,6 +318,16 @@ }, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) +"bY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/machinery/keycard_auth/directional/east, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) "bZ" = ( /obj/effect/turf_decal/bot, /obj/structure/chair/comfy/shuttle{ @@ -344,16 +337,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) -"cc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/machinery/camera/autoname{ - dir = 4 - }, -/turf/open/floor/mineral/titanium/tiled/yellow, -/area/shuttle/escape) "cf" = ( /obj/machinery/door/airlock/shuttle{ name = "Emergency Shuttle Airlock" @@ -455,6 +438,15 @@ /obj/machinery/stasis, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) +"cw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) "cz" = ( /obj/effect/turf_decal/delivery, /obj/machinery/recharge_station, @@ -465,59 +457,6 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) -"cD" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/electrical{ - pixel_x = -3; - pixel_y = 1 - }, -/obj/item/storage/toolbox/mechanical{ - pixel_y = -1 - }, -/obj/item/storage/toolbox/emergency{ - pixel_x = 3; - pixel_y = -5 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/light/directional/east, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/escape) -"cJ" = ( -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = 3 - }, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = 3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/head/utility/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/item/clothing/head/utility/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/structure/closet/crate/internals, -/obj/effect/turf_decal/delivery, -/obj/machinery/light/directional/west, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/escape) "cK" = ( /obj/effect/spawner/structure/window/reinforced/shuttle, /obj/machinery/power/shuttle_engine/heater, @@ -527,22 +466,6 @@ /obj/structure/sign/warning/fire, /turf/closed/wall/mineral/titanium, /area/shuttle/escape) -"cM" = ( -/obj/machinery/vending/medical, -/obj/effect/turf_decal/bot, -/obj/machinery/light/directional/west, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/escape) -"cR" = ( -/obj/structure/table, -/obj/item/circular_saw, -/obj/item/scalpel{ - pixel_y = 16 - }, -/obj/item/hemostat, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "cS" = ( /turf/closed/wall/mineral/plastitanium, /area/shuttle/escape) @@ -559,19 +482,6 @@ /obj/item/defibrillator/compact/loaded, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) -"cW" = ( -/obj/structure/table, -/obj/item/storage/medkit/fire{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/storage/medkit/regular{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/storage/medkit/regular, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/escape) "cX" = ( /obj/structure/table, /obj/item/clipboard, @@ -596,11 +506,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) -"da" = ( -/obj/structure/table/optable, -/obj/effect/turf_decal/bot, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/escape) "db" = ( /obj/structure/table, /obj/item/surgical_drapes, @@ -626,16 +531,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating/airless, /area/shuttle/escape) -"dX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/item/kirbyplants{ - icon_state = "plant-05" - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/mineral/titanium/tiled/yellow, -/area/shuttle/escape) "dZ" = ( /obj/effect/turf_decal/stripes/corner, /obj/effect/turf_decal/stripes/corner{ @@ -653,6 +548,30 @@ /obj/effect/turf_decal/tile/brown/opposingcorners, /turf/open/floor/mineral/titanium/tiled/yellow, /area/shuttle/escape) +"hD" = ( +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/shuttle/escape) +"hE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/item/kirbyplants/organic/plant5, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/shuttle/escape) +"ij" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/item/kirbyplants/organic/applebush, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) "is" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/chair/comfy/shuttle{ @@ -660,17 +579,6 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"iA" = ( -/obj/effect/turf_decal/stripes/line, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue/opposingcorners, -/turf/open/floor/mineral/titanium/tiled/white, -/area/shuttle/escape) "jc" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -681,6 +589,22 @@ /obj/effect/turf_decal/tile/brown/opposingcorners, /turf/open/floor/mineral/titanium/tiled/yellow, /area/shuttle/escape) +"je" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/electrical{ + pixel_x = -3; + pixel_y = 1 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_y = -1 + }, +/obj/item/storage/toolbox/emergency{ + pixel_x = 3; + pixel_y = -5 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) "jH" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -727,12 +651,14 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/mineral/titanium/tiled/white, /area/shuttle/escape) -"lH" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 +"lU" = ( +/obj/structure/table, +/obj/item/circular_saw, +/obj/item/scalpel{ + pixel_y = 16 }, -/turf/open/floor/mineral/plastitanium, +/obj/item/hemostat, +/turf/open/floor/iron/dark, /area/shuttle/escape) "lV" = ( /obj/effect/turf_decal/stripes/corner{ @@ -768,13 +694,13 @@ /obj/item/storage/lockbox/loyalty, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"nv" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/machinery/camera/autoname{ +"nq" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/turf/open/floor/mineral/titanium/tiled/yellow, +/obj/machinery/light/floor, +/turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "nR" = ( /obj/structure/table/reinforced, @@ -832,16 +758,6 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/mineral/titanium/tiled/white, /area/shuttle/escape) -"pp" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue/opposingcorners, -/turf/open/floor/mineral/titanium/tiled/white, -/area/shuttle/escape) "pE" = ( /obj/structure/table/reinforced, /obj/item/storage/fancy/donut_box, @@ -874,39 +790,18 @@ /obj/effect/turf_decal/tile/brown/opposingcorners, /turf/open/floor/mineral/titanium/tiled/yellow, /area/shuttle/escape) -"rl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/escape) -"si" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/escape) -"sx" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/obj/machinery/keycard_auth/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +"ru" = ( +/obj/structure/table, +/obj/item/storage/medkit/fire{ + pixel_x = 4; + pixel_y = 4 }, -/obj/machinery/camera/autoname{ - dir = 8 +/obj/item/storage/medkit/regular{ + pixel_x = 2; + pixel_y = 2 }, +/obj/item/storage/medkit/regular, +/obj/machinery/light/directional/south, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "sy" = ( @@ -935,6 +830,16 @@ /obj/machinery/recharger, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) +"vm" = ( +/obj/structure/table/reinforced, +/obj/item/clipboard, +/obj/item/restraints/handcuffs, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/assembly/flash/handheld, +/obj/machinery/light/small/directional/east, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) "wo" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -952,6 +857,28 @@ /obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) +"xG" = ( +/obj/item/kirbyplants/organic/plant10, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/mineral/titanium/tiled/white, +/area/shuttle/escape) +"yp" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/mineral/titanium/tiled/white, +/area/shuttle/escape) +"yr" = ( +/obj/structure/sign/departments/engineering/directional/north, +/obj/effect/turf_decal/bot, +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) "yw" = ( /obj/effect/turf_decal/stripes/corner, /obj/effect/turf_decal/stripes/corner{ @@ -981,6 +908,19 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) +"Br" = ( +/obj/machinery/vending/wallmed/directional/east{ + use_power = 0 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/mineral/titanium/tiled/white, +/area/shuttle/escape) "BB" = ( /obj/effect/turf_decal/tile/brown/opposingcorners, /turf/open/floor/mineral/titanium/tiled/yellow, @@ -999,6 +939,11 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) +"Dr" = ( +/obj/machinery/vending/medical, +/obj/effect/turf_decal/bot, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) "DM" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -1013,19 +958,21 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/mineral/titanium/tiled/white, /area/shuttle/escape) -"EE" = ( -/obj/machinery/light/directional/east, -/obj/machinery/vending/wallmed/directional/east{ - use_power = 0 - }, +"FA" = ( /obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/chair/comfy/shuttle{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ +/obj/machinery/keycard_auth/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/camera/autoname{ dir = 8 }, -/obj/effect/turf_decal/tile/blue/opposingcorners, -/turf/open/floor/mineral/titanium/tiled/white, +/turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "Gq" = ( /obj/effect/turf_decal/stripes/line{ @@ -1044,16 +991,6 @@ /obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"Gu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "GV" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -1071,6 +1008,15 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/mineral/titanium/tiled/white, /area/shuttle/escape) +"Ig" = ( +/obj/effect/turf_decal/stripes/line, +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/mineral/titanium/tiled/white, +/area/shuttle/escape) "Iq" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/tile/blue/opposingcorners, @@ -1110,6 +1056,17 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) +"Ja" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/mineral/titanium/tiled/white, +/area/shuttle/escape) "JM" = ( /obj/structure/chair/office/light, /obj/effect/turf_decal/stripes/line, @@ -1196,17 +1153,6 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/mineral/titanium/tiled/white, /area/shuttle/escape) -"NJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/machinery/keycard_auth/directional/east, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/escape) "NN" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -1245,16 +1191,17 @@ /obj/effect/turf_decal/tile/brown/opposingcorners, /turf/open/floor/mineral/titanium/tiled/yellow, /area/shuttle/escape) -"Py" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) +"Pd" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/light/floor, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"Qi" = ( +/obj/structure/sign/departments/security/directional/north, +/obj/effect/turf_decal/bot, +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) "Re" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/corner{ @@ -1269,25 +1216,15 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/mineral/titanium/tiled/white, /area/shuttle/escape) -"RT" = ( -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue/opposingcorners, -/turf/open/floor/mineral/titanium/tiled/white, +"RH" = ( +/obj/structure/table/optable, +/obj/effect/turf_decal/bot, +/obj/machinery/light/directional/south, +/turf/open/floor/mineral/plastitanium, /area/shuttle/escape) -"SE" = ( -/obj/machinery/light/directional/west, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, +"Su" = ( +/obj/item/kirbyplants/organic/applebush, +/obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/mineral/titanium/tiled/white, /area/shuttle/escape) @@ -1305,14 +1242,23 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/mineral/titanium/tiled/white, /area/shuttle/escape) -"TT" = ( -/obj/item/kirbyplants{ - icon_state = "applebush" +"Uc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/blue/opposingcorners, -/turf/open/floor/mineral/titanium/tiled/white, +/obj/item/kirbyplants/organic/plant22, +/turf/open/floor/mineral/plastitanium, /area/shuttle/escape) +"Us" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) "VD" = ( /obj/effect/turf_decal/stripes/end{ dir = 4 @@ -1337,6 +1283,12 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/mineral/titanium/tiled/white, /area/shuttle/escape) +"WN" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/obj/machinery/light/small/directional/west, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) "Xx" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -1404,7 +1356,7 @@ ac nm Lu Lu -Py +Us Re ac Wu @@ -1416,7 +1368,7 @@ bB Kl ac BB -nv +hD cC cK cT @@ -1437,14 +1389,14 @@ bm Od LM jH -EE +Br jH Le wo cf fN qO -cD +je cL cU cS @@ -1483,7 +1435,7 @@ ab ac ai as -Gu +cw IX Mo zN @@ -1499,7 +1451,7 @@ as ab bg as -cM +Dr cV ac dc @@ -1508,14 +1460,14 @@ dd (6,1,1) = {" ac ad -aj +WN as aD aJ ac as as -bv +Qi pj bK bP @@ -1527,7 +1479,7 @@ cm XD sy Rk -cW +ru cL dc cT @@ -1536,10 +1488,10 @@ cT ac ae oP -sx +FA qv IU -rl +ij bg bn JN @@ -1566,9 +1518,9 @@ wy nR pE KN -lH +nq aN -aO +Pd Kl Cc jH @@ -1576,9 +1528,9 @@ TQ jH oE XM -TT +Su ac -RT +xG XM pa cY @@ -1590,10 +1542,10 @@ cS ac ag GV -NJ +bY kh dZ -si +Uc bh bo Em @@ -1616,14 +1568,14 @@ dd (10,1,1) = {" ac ah -an +vm as as aN ab as as -by +yr MQ bK bO @@ -1635,7 +1587,7 @@ cm cu oZ Wv -da +RH cL dc cT @@ -1661,7 +1613,7 @@ as ab bg as -cR +lU db ac dc @@ -1707,14 +1659,14 @@ bp Ht lG mk -SE +Ja mk Xx NN cf Oz Iu -cJ +aR cL cU cS @@ -1731,16 +1683,16 @@ aR ba bl ac -iA +Ig bH bl bl bl bH -pp +yp ac -dX -cc +hE +bL aR cK cT diff --git a/_maps/shuttles/emergency_lance.dmm b/_maps/shuttles/emergency_lance.dmm index 63625620fabe8..c6c0d9d9c18db 100644 --- a/_maps/shuttles/emergency_lance.dmm +++ b/_maps/shuttles/emergency_lance.dmm @@ -72,17 +72,6 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) -"ce" = ( -/obj/structure/sign/warning/vacuum/external/directional/east, -/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/dark_blue/arrow_cw{ - dir = 4 - }, -/obj/structure/marker_beacon/indigo, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "cw" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/effect/turf_decal/tile/dark_blue/opposingcorners{ @@ -100,6 +89,17 @@ }, /turf/open/floor/iron/dark/textured, /area/shuttle/escape) +"cM" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/rack, +/obj/item/stack/medical/gauze, +/obj/item/stack/medical/bruise_pack, +/obj/item/stack/medical/ointment{ + pixel_x = 5 + }, +/obj/item/stack/medical/bone_gel, +/turf/open/floor/iron/dark/textured, +/area/shuttle/escape) "df" = ( /obj/effect/turf_decal/stripes/red/corner{ dir = 4 @@ -136,23 +136,26 @@ }, /turf/open/floor/iron/dark/textured, /area/shuttle/escape) -"dY" = ( -/obj/effect/turf_decal/bot_white, -/obj/structure/rack, -/obj/item/stack/medical/gauze, -/obj/item/stack/medical/bruise_pack, -/obj/item/stack/medical/ointment{ - pixel_x = 5 - }, -/obj/item/stack/medical/bone_gel, -/turf/open/floor/iron/dark/textured, -/area/shuttle/escape) "eD" = ( /obj/effect/turf_decal/tile/dark_blue/half/contrasted{ dir = 1 }, /turf/open/floor/iron/dark/side, /area/shuttle/escape) +"eW" = ( +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "escape_cockpit_windows"; + name = "Cockpit Window Blast Doors"; + pixel_x = -7; + req_access = list("command") + }, +/obj/machinery/recharger{ + pixel_x = 5 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/dark/textured, +/area/shuttle/escape) "fo" = ( /obj/structure/chair/comfy/shuttle, /obj/structure/window/reinforced/survival_pod/spawner/directional/west, @@ -168,6 +171,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured, /area/shuttle/escape) +"fJ" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"ga" = ( +/obj/machinery/computer/operating{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark/side, +/area/shuttle/escape) "gr" = ( /obj/machinery/door/airlock/grunge{ name = "Shuttle Medical Center" @@ -227,6 +244,16 @@ /obj/effect/turf_decal/trimline/dark_blue/arrow_ccw, /turf/open/floor/iron/dark/textured, /area/shuttle/escape) +"hM" = ( +/obj/machinery/light/floor, +/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/arrow_cw{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/shuttle/escape) "ic" = ( /obj/structure/table/reinforced, /obj/machinery/button/door{ @@ -243,12 +270,6 @@ }, /turf/open/floor/iron/checker, /area/shuttle/escape) -"iy" = ( -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark/textured, -/area/shuttle/escape) "iz" = ( /obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/plastitanium/red, @@ -347,6 +368,15 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) +"kx" = ( +/obj/machinery/iv_drip, +/obj/structure/bed/medical/emergency, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/shuttle/escape) "kz" = ( /obj/effect/turf_decal/stripes/red/line, /obj/effect/turf_decal/stripes/red/line{ @@ -357,7 +387,7 @@ }, /area/shuttle/escape/brig) "kN" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, /obj/structure/extinguisher_cabinet/directional/west, /obj/effect/mapping_helpers/broken_floor, @@ -449,6 +479,16 @@ }, /turf/open/floor/plating/airless, /area/shuttle/escape) +"nE" = ( +/obj/structure/sign/warning/vacuum/external/directional/east, +/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/arrow_cw{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/shuttle/escape) "nS" = ( /obj/structure/lattice, /turf/open/space/basic, @@ -477,6 +517,13 @@ }, /turf/open/floor/iron/white/textured_large, /area/shuttle/escape) +"oY" = ( +/obj/machinery/power/shuttle_engine/heater{ + dir = 1 + }, +/obj/structure/window/reinforced/survival_pod/spawner/directional/south, +/turf/open/floor/plating/airless, +/area/shuttle/escape) "pb" = ( /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ dir = 1 @@ -614,6 +661,17 @@ /obj/machinery/power/shuttle_engine/propulsion, /turf/open/floor/plating/airless, /area/shuttle/escape) +"uy" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 10 + }, +/area/shuttle/escape) "uF" = ( /obj/structure/sign/departments/medbay/alt/directional/south, /obj/effect/turf_decal/tile/dark_blue/half/contrasted{ @@ -713,14 +771,6 @@ dir = 4 }, /area/shuttle/escape) -"xc" = ( -/obj/machinery/iv_drip, -/obj/structure/bed/roller, -/obj/effect/turf_decal/tile/dark_blue/half/contrasted, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/shuttle/escape) "xj" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -729,12 +779,13 @@ /obj/machinery/light/directional/west, /turf/open/floor/plating, /area/shuttle/escape) -"xR" = ( -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark/textured, -/area/shuttle/escape) +"xH" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) "yB" = ( /obj/structure/window/reinforced/survival_pod/spawner/directional/north, /obj/effect/decal/cleanable/blood/old, @@ -784,15 +835,6 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"AE" = ( -/obj/machinery/computer/operating{ - dir = 1 - }, -/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark/side, -/area/shuttle/escape) "AS" = ( /obj/structure/table/optable, /obj/effect/decal/cleanable/blood/splatter, @@ -801,6 +843,11 @@ }, /turf/open/floor/iron/dark/side, /area/shuttle/escape) +"Bp" = ( +/obj/structure/chair/comfy/shuttle, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured, +/area/shuttle/escape) "BC" = ( /obj/machinery/porta_turret/syndicate/energy/raven{ dir = 10 @@ -811,18 +858,6 @@ /obj/structure/chair/comfy/shuttle, /turf/open/floor/iron/dark/textured, /area/shuttle/escape) -"BS" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/dark_blue{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/shuttle/escape) "Cv" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/yellow/half/contrasted{ @@ -862,10 +897,6 @@ /obj/effect/turf_decal/trimline/dark_blue/arrow_ccw, /turf/open/floor/iron/dark, /area/shuttle/escape) -"Dd" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/south, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "Dg" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -884,6 +915,20 @@ icon_state = "darkfull" }, /area/shuttle/escape/brig) +"Ec" = ( +/obj/structure/table/reinforced, +/obj/item/storage/medkit/emergency{ + pixel_x = 2; + pixel_y = 3 + }, +/obj/item/storage/medkit/emergency{ + pixel_x = -2 + }, +/obj/effect/turf_decal/tile/dark_blue, +/turf/open/floor/iron/dark/side{ + dir = 9 + }, +/area/shuttle/escape) "EL" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/turretid{ @@ -917,20 +962,13 @@ dir = 5 }, /area/shuttle/escape) -"FA" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/south, -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "FX" = ( /obj/structure/table/reinforced, /obj/item/book/manual/wiki/surgery{ pixel_x = -15 }, -/obj/item/storage/backpack/duffelbag/med/surgery, -/obj/item/storage/backpack/duffelbag/med/surgery{ +/obj/item/surgery_tray/full, +/obj/item/surgery_tray/full{ pixel_x = 5 }, /obj/effect/turf_decal/tile/dark_blue/half/contrasted{ @@ -994,13 +1032,6 @@ }, /turf/open/floor/iron/checker, /area/shuttle/escape) -"Hp" = ( -/obj/machinery/power/shuttle_engine/heater{ - dir = 1 - }, -/obj/structure/window/reinforced/survival_pod/spawner/directional/south, -/turf/open/floor/plating/airless, -/area/shuttle/escape) "Hq" = ( /obj/machinery/door/airlock/grunge{ name = "Central Entrance" @@ -1014,21 +1045,6 @@ }, /turf/open/floor/iron/dark/textured, /area/shuttle/escape) -"Hv" = ( -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "escape_cockpit_windows"; - name = "Cockpit Window Blast Doors"; - pixel_x = -7; - req_access = list("command") - }, -/obj/machinery/recharger{ - pixel_x = 5 - }, -/obj/machinery/light/directional/north, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/dark/textured, -/area/shuttle/escape) "HJ" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/blood/universal{ @@ -1132,6 +1148,16 @@ dir = 9 }, /area/shuttle/escape) +"Lf" = ( +/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/arrow_cw{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/shuttle/escape) "Lg" = ( /obj/structure/lattice/catwalk, /obj/structure/marker_beacon/indigo, @@ -1183,6 +1209,17 @@ /obj/effect/turf_decal/trimline/dark_blue/arrow_ccw, /turf/open/floor/iron/dark, /area/shuttle/escape) +"LI" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/turf/open/floor/iron/dark/side{ + dir = 6 + }, +/area/shuttle/escape) "Mc" = ( /obj/structure/chair/office{ dir = 4 @@ -1192,6 +1229,15 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) +"Mk" = ( +/obj/machinery/computer/crew, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/turf/open/floor/iron/dark/side{ + dir = 5 + }, +/area/shuttle/escape) "MA" = ( /obj/machinery/vending/wallmed/directional/west, /obj/effect/turf_decal/tile/dark_blue/half/contrasted{ @@ -1204,8 +1250,16 @@ "MC" = ( /obj/structure/extinguisher_cabinet/directional/north, /obj/machinery/iv_drip, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/shuttle/escape) +"MK" = ( +/obj/structure/chair/comfy/shuttle, /obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/machinery/light/directional/north, /turf/open/floor/iron/dark/side{ dir = 1 }, @@ -1242,26 +1296,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured, /area/shuttle/escape) -"NW" = ( -/obj/structure/chair/comfy/shuttle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, -/area/shuttle/escape) -"Of" = ( -/obj/structure/table/reinforced, -/obj/item/storage/medkit/emergency{ - pixel_x = 2; - pixel_y = 3 - }, -/obj/item/storage/medkit/emergency{ - pixel_x = -2 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/dark_blue, -/turf/open/floor/iron/dark/side{ - dir = 9 - }, -/area/shuttle/escape) "Ol" = ( /obj/machinery/power/terminal, /obj/structure/cable, @@ -1296,16 +1330,6 @@ }, /turf/open/floor/iron/dark/side, /area/shuttle/escape) -"OM" = ( -/obj/machinery/computer/crew, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/dark_blue{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/shuttle/escape) "OY" = ( /obj/effect/turf_decal/tile/dark_blue/half/contrasted{ dir = 8 @@ -1327,18 +1351,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/white/textured_large, /area/shuttle/escape) -"Pv" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/dark_blue{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 6 - }, -/area/shuttle/escape) "Px" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/effect/turf_decal/bot_white, @@ -1400,17 +1412,6 @@ dir = 1 }, /area/shuttle/escape) -"Sg" = ( -/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/dark_blue/arrow_cw{ - dir = 4 - }, -/obj/structure/marker_beacon/indigo, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "So" = ( /obj/structure/chair/comfy/shuttle{ dir = 4 @@ -1450,6 +1451,27 @@ /obj/structure/window/reinforced/survival_pod/spawner/directional/west, /turf/open/floor/iron/dark/textured, /area/shuttle/escape) +"TO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/gun/energy/e_gun/mini{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/gun/energy/e_gun/mini, +/obj/item/gun/energy/e_gun/mini{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/structure/window/reinforced/survival_pod/spawner/directional/north, +/obj/structure/window/reinforced/survival_pod/spawner/directional/south, +/obj/machinery/door/window/survival_pod{ + dir = 4; + name = "Emergency Weapons"; + req_access = list("command") + }, +/obj/structure/rack, +/turf/open/floor/iron/dark/textured, +/area/shuttle/escape) "TQ" = ( /obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ dir = 1 @@ -1554,6 +1576,11 @@ /obj/machinery/recharge_station, /turf/open/floor/iron/dark/textured, /area/shuttle/escape) +"Xz" = ( +/obj/structure/bed/medical/emergency, +/obj/machinery/iv_drip, +/turf/open/floor/iron/dark/textured, +/area/shuttle/escape) "XA" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, @@ -1590,27 +1617,6 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"YN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/gun/energy/e_gun/mini{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/gun/energy/e_gun/mini, -/obj/item/gun/energy/e_gun/mini{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/structure/window/reinforced/survival_pod/spawner/directional/north, -/obj/structure/window/reinforced/survival_pod/spawner/directional/south, -/obj/machinery/door/window/survival_pod{ - dir = 4; - name = "Emergency Weapons"; - req_access = list("command") - }, -/obj/structure/rack, -/turf/open/floor/iron/dark/textured, -/area/shuttle/escape) "ZE" = ( /obj/machinery/door/airlock/grunge{ name = "Bridge Hall" @@ -1723,8 +1729,8 @@ vf MZ Lj Gw -YN -mx +TO +vf WQ nS Lg @@ -1770,7 +1776,7 @@ uX uX uX ne -Hp +oY fz pb If @@ -1822,7 +1828,7 @@ uX uX uX ne -Hp +oY cC oe Yt @@ -1874,7 +1880,7 @@ uX uX uX ne -Hp +oY QL kt LA @@ -1884,7 +1890,7 @@ QP WQ ol WQ -Of +Ec Lk GA GA @@ -1930,7 +1936,7 @@ WQ WQ dn WQ -Hv +eW ai UG WQ @@ -1941,7 +1947,7 @@ WI WI WI vy -BS +uy WQ uX uX @@ -1967,7 +1973,7 @@ WQ CR WQ WQ -NW +Bp JN Hu WQ @@ -1993,7 +1999,7 @@ TQ WI WI WI -AE +ga WQ pK Kz @@ -2040,7 +2046,7 @@ gF WQ XA WQ -re +MK eD EX WI @@ -2057,10 +2063,10 @@ qH bV WQ WQ -dY +cM kN So -iy +Xz Px WQ GA @@ -2105,14 +2111,14 @@ cz "} (10,1,1) = {" jo -Sg -Yq -ce +jY +hM +nE jM jY +Lf Yq -Yq -Yq +Lf Yq Hq cw @@ -2162,7 +2168,7 @@ bV WQ WQ mx -xR +Xz zc hp Px @@ -2248,7 +2254,7 @@ nb WQ qH WQ -xc +kx WI WI jG @@ -2305,7 +2311,7 @@ WI WI WI ao -AE +ga WQ pK pK @@ -2347,7 +2353,7 @@ WQ HV WQ iz -Dd +fJ kz yB Ao @@ -2357,7 +2363,7 @@ WI WI WI TQ -Pv +LI WQ uX uX @@ -2394,17 +2400,17 @@ uX uX uX ne -Hp +oY vm rr WQ Oy -FA +xH Dx YM JS WQ -OM +Mk Qv OY OY @@ -2446,7 +2452,7 @@ uX uX uX ne -Hp +oY zh WO WQ @@ -2498,7 +2504,7 @@ uX uX uX ne -Hp +oY Gr Qu sp diff --git a/_maps/shuttles/emergency_luxury.dmm b/_maps/shuttles/emergency_luxury.dmm index a7443d1144673..1d6dfce2664ba 100644 --- a/_maps/shuttles/emergency_luxury.dmm +++ b/_maps/shuttles/emergency_luxury.dmm @@ -1,9 +1,4 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/shard, -/turf/open/floor/iron, -/area/shuttle/escape) "bg" = ( /obj/effect/decal/cleanable/oil, /turf/open/floor/iron, @@ -20,12 +15,6 @@ /obj/structure/table/wood/fancy/black, /turf/open/floor/carpet/red, /area/shuttle/escape/luxury) -"bY" = ( -/obj/structure/grille/broken, -/obj/effect/spawner/random/maintenance/two, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/escape) "cI" = ( /obj/structure/chair/comfy/shuttle, /obj/structure/reagent_dispensers/wall/peppertank/directional/north, @@ -51,10 +40,30 @@ /obj/machinery/light/directional/south, /turf/open/floor/carpet/orange, /area/shuttle/escape/luxury) +"dM" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/medical, +/obj/item/reagent_containers/pill/maintenance, +/obj/item/reagent_containers/pill/maintenance, +/obj/item/reagent_containers/pill/maintenance, +/obj/item/reagent_containers/pill/maintenance, +/obj/item/reagent_containers/pill/maintenance, +/obj/item/reagent_containers/pill/maintenance, +/obj/item/reagent_containers/pill/maintenance, +/obj/item/reagent_containers/pill/maintenance, +/turf/open/floor/iron, +/area/shuttle/escape) "dN" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/shuttle/escape) +"eb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/glass, +/obj/item/stack/tile/iron/base, +/turf/open/floor/plating, +/area/shuttle/escape) "ek" = ( /obj/machinery/vending/wallmed/directional/north, /obj/machinery/iv_drip, @@ -66,12 +75,9 @@ }, /turf/open/floor/mineral/diamond, /area/shuttle/escape/luxury) -"eN" = ( -/obj/machinery/door/airlock{ - name = "Economy Medical" - }, -/obj/effect/decal/cleanable/blood/old, +"et" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/south, /turf/open/floor/plating, /area/shuttle/escape) "eS" = ( @@ -80,16 +86,6 @@ /obj/machinery/recharger, /turf/open/floor/carpet/red, /area/shuttle/escape/brig) -"eY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/generic, -/obj/effect/decal/cleanable/robot_debris, -/turf/open/floor/iron, -/area/shuttle/escape) -"fg" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/shuttle/escape) "fH" = ( /turf/template_noop, /area/template_noop) @@ -97,8 +93,14 @@ /obj/item/stack/tile/iron/base, /turf/open/floor/plating, /area/shuttle/escape) -"fT" = ( -/obj/effect/decal/cleanable/chem_pile, +"ge" = ( +/obj/item/kirbyplants/random, +/obj/machinery/light/directional/west, +/turf/open/floor/carpet/blue, +/area/shuttle/escape/luxury) +"gf" = ( +/obj/structure/grille/broken, +/obj/machinery/light/small/directional/west, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/shuttle/escape) @@ -123,11 +125,13 @@ /obj/structure/window/spawner/directional/north, /turf/open/floor/iron, /area/shuttle/escape) -"gS" = ( +"gQ" = ( +/obj/machinery/light/small/directional/east, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/obj/item/stack/tile/iron/base, -/turf/open/floor/plating, +/turf/open/floor/iron, /area/shuttle/escape) "gU" = ( /obj/machinery/door/airlock/security/glass{ @@ -170,16 +174,20 @@ /obj/item/cautery, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape/luxury) -"iD" = ( +"iS" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, +/obj/item/stack/ore/glass, +/obj/effect/decal/cleanable/vomit/old, +/turf/open/floor/iron, /area/shuttle/escape) -"jc" = ( -/obj/structure/closet/crate/large, -/obj/effect/turf_decal/delivery, +"ja" = ( +/obj/machinery/light/small/directional/east, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/structure/window/spawner/directional/south, /obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/maintenance/eight, -/turf/open/floor/iron, +/turf/open/floor/plating, /area/shuttle/escape) "ji" = ( /obj/structure/chair/comfy/shuttle{ @@ -203,13 +211,6 @@ "jJ" = ( /turf/open/floor/carpet/blue, /area/shuttle/escape/luxury) -"jQ" = ( -/obj/effect/spawner/random/maintenance/six, -/obj/structure/closet/crate/trashcart/filled, -/obj/effect/turf_decal/loading_area, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/shuttle/escape) "jZ" = ( /obj/item/food/spaghetti/chowmein{ pixel_y = 5 @@ -217,14 +218,10 @@ /obj/structure/table/wood/fancy/black, /turf/open/floor/carpet/red, /area/shuttle/escape/luxury) -"kt" = ( -/obj/structure/girder, -/obj/effect/turf_decal/delivery, +"kc" = ( +/obj/effect/decal/cleanable/chem_pile, /obj/effect/decal/cleanable/dirt, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, -/turf/open/floor/iron, +/turf/open/floor/plating, /area/shuttle/escape) "kF" = ( /obj/machinery/light/directional/east, @@ -273,11 +270,6 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/mineral/diamond, /area/shuttle/escape/luxury) -"md" = ( -/obj/structure/frame/machine, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/escape) "mE" = ( /obj/structure/table, /obj/item/storage/medkit/advanced, @@ -317,13 +309,6 @@ /obj/item/bikehorn/rubberducky, /turf/open/floor/holofloor/beach/water, /area/shuttle/escape/luxury) -"nC" = ( -/obj/item/food/sandwich/cheese/grilled{ - pixel_y = 11 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/red, -/area/shuttle/escape/luxury) "od" = ( /obj/item/food/honkdae{ pixel_y = 8 @@ -335,33 +320,40 @@ /obj/machinery/stasis, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape/luxury) -"ot" = ( -/obj/structure/chair/wood{ - dir = 8 - }, -/turf/open/floor/carpet/green, -/area/shuttle/escape/luxury) "oA" = ( /turf/open/floor/carpet/green, /area/shuttle/escape/luxury) +"oH" = ( +/obj/machinery/door/airlock{ + name = "Economy Medical" + }, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/shuttle/escape) "oP" = ( /obj/structure/musician/piano, /turf/open/floor/carpet/green, /area/shuttle/escape/luxury) -"oX" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, +"pW" = ( +/obj/effect/spawner/random/maintenance/eight, +/obj/structure/closet/crate/large, +/obj/effect/turf_decal/delivery, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating, -/area/shuttle/escape) -"qg" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 +/obj/structure/window/reinforced/spawner/directional/east{ + layer = 2.9 }, -/obj/structure/window/spawner/directional/south, +/obj/item/toy/plush/rouny{ + name = "rouny plushie" + }, +/turf/open/floor/iron, +/area/shuttle/escape) +"qc" = ( +/obj/effect/spawner/random/maintenance/eight, +/obj/structure/closet/crate/engineering/electrical, +/obj/effect/decal/cleanable/robot_debris, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/oil, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/shuttle/escape) @@ -378,19 +370,6 @@ /obj/structure/table/wood/fancy/black, /turf/open/floor/carpet/red, /area/shuttle/escape/luxury) -"qv" = ( -/obj/structure/reagent_dispensers/fueltank/large, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/turf_decal/delivery, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/shuttle/escape) -"qC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/ore/glass, -/obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/iron, -/area/shuttle/escape) "qQ" = ( /obj/effect/spawner/random/maintenance/six, /obj/structure/closet/crate/engineering, @@ -402,15 +381,30 @@ /obj/machinery/light/directional/north, /turf/open/floor/carpet/green, /area/shuttle/escape/luxury) +"rh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plating, +/area/shuttle/escape) "rt" = ( /obj/structure/table/wood/fancy/black, /obj/effect/spawner/random/entertainment/plushie_delux, /turf/open/floor/carpet/green, /area/shuttle/escape/luxury) -"rJ" = ( -/obj/structure/girder, +"rH" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/structure/window/spawner/directional/south, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, +/turf/open/floor/iron, +/area/shuttle/escape) +"rN" = ( +/obj/effect/spawner/random/maintenance/eight, +/obj/structure/closet/crate/engineering, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, /area/shuttle/escape) "rP" = ( /obj/structure/extinguisher_cabinet/directional/north, @@ -455,10 +449,26 @@ }, /turf/open/floor/plating, /area/shuttle/escape) +"sH" = ( +/obj/structure/reagent_dispensers/fueltank/large, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/shuttle/escape) "sN" = ( /obj/item/clothing/head/collectable/paper, /turf/open/floor/holofloor/beach/water, /area/shuttle/escape/luxury) +"th" = ( +/obj/machinery/light/floor, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape/luxury) +"ti" = ( +/obj/effect/decal/cleanable/generic, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/shuttle/escape) "ty" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -466,6 +476,35 @@ /obj/structure/window/spawner/directional/south, /turf/open/floor/iron, /area/shuttle/escape) +"ul" = ( +/obj/item/food/sandwich/cheese/grilled{ + pixel_y = 11 + }, +/obj/structure/table/wood/fancy/black, +/turf/open/floor/carpet/red, +/area/shuttle/escape/luxury) +"ur" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plating, +/area/shuttle/escape) +"uC" = ( +/obj/effect/spawner/random/maintenance/eight, +/obj/structure/closet/crate/engineering/electrical, +/obj/effect/decal/cleanable/robot_debris, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/shuttle/escape) +"vj" = ( +/obj/structure/grille/broken, +/obj/effect/spawner/random/maintenance/two, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/shuttle/escape) "vF" = ( /obj/structure/closet/crate/freezer, /obj/item/reagent_containers/blood, @@ -501,16 +540,10 @@ /obj/item/surgical_drapes, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape/luxury) -"vP" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape/luxury) -"wP" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, +"xn" = ( +/obj/structure/girder, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, +/turf/open/floor/plating, /area/shuttle/escape) "xq" = ( /obj/effect/spawner/random/maintenance/six, @@ -518,14 +551,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/shuttle/escape) -"xy" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/structure/window/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/escape) "xK" = ( /obj/item/food/honeybun{ pixel_y = 1 @@ -533,15 +558,6 @@ /obj/structure/table/wood/fancy/black, /turf/open/floor/carpet/red, /area/shuttle/escape/luxury) -"xO" = ( -/obj/structure/closet/crate, -/obj/effect/turf_decal/delivery, -/obj/machinery/light/small/directional/west, -/obj/item/reagent_containers/cup/bucket, -/obj/item/mop, -/obj/item/reagent_containers/cup/glass/waterbottle, -/turf/open/floor/iron, -/area/shuttle/escape) "xV" = ( /obj/machinery/door/window{ dir = 4 @@ -555,6 +571,10 @@ /obj/structure/table/wood/fancy/black, /turf/open/floor/carpet/red, /area/shuttle/escape/luxury) +"yj" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/shuttle/escape) "yk" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -562,11 +582,6 @@ /obj/structure/window/spawner/directional/south, /turf/open/floor/plating, /area/shuttle/escape) -"yy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/iron, -/area/shuttle/escape) "yB" = ( /obj/structure/chair/stool/bar{ can_buckle = 1; @@ -581,14 +596,6 @@ /obj/item/storage/box/drinkingglasses, /turf/open/floor/carpet/green, /area/shuttle/escape/luxury) -"zk" = ( -/obj/effect/spawner/random/maintenance/eight, -/obj/structure/closet/crate/engineering, -/obj/effect/turf_decal/delivery, -/obj/effect/decal/cleanable/dirt, -/obj/item/extinguisher/crafted, -/turf/open/floor/iron, -/area/shuttle/escape) "zq" = ( /obj/machinery/vending/boozeomat/all_access, /turf/closed/indestructible/riveted/plastinum/nodiagonal, @@ -614,24 +621,10 @@ }, /turf/open/floor/carpet/blue, /area/shuttle/escape/luxury) -"Av" = ( -/obj/effect/spawner/random/maintenance/eight, -/obj/structure/closet/crate/preopen, -/obj/effect/turf_decal/delivery, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/iron, -/area/shuttle/escape) -"AB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating, -/area/shuttle/escape) -"AN" = ( -/obj/structure/girder, -/obj/effect/turf_decal/delivery, +"zR" = ( +/obj/structure/chair/comfy/shuttle, +/obj/structure/window/spawner/directional/north, /obj/effect/decal/cleanable/dirt, -/obj/structure/grille/broken, /turf/open/floor/plating, /area/shuttle/escape) "AT" = ( @@ -652,6 +645,29 @@ "Br" = ( /turf/open/floor/iron, /area/shuttle/escape) +"Bt" = ( +/obj/effect/spawner/random/maintenance/eight, +/obj/structure/closet/crate/engineering, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/obj/item/extinguisher/crafted, +/turf/open/floor/iron, +/area/shuttle/escape) +"BK" = ( +/obj/structure/girder, +/obj/structure/window/reinforced/spawner/directional/east{ + layer = 2.9 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/shuttle/escape) +"BV" = ( +/obj/structure/chair/comfy/shuttle, +/obj/structure/window/spawner/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/shuttle/escape) "Ck" = ( /obj/machinery/scanner_gate/luxury_shuttle{ layer = 2.6 @@ -661,15 +677,14 @@ }, /turf/open/floor/carpet/blue, /area/shuttle/escape/luxury) -"CQ" = ( -/turf/closed/wall/mineral/titanium, -/area/shuttle/escape) -"CZ" = ( -/obj/machinery/light/small/directional/east, +"CP" = ( +/obj/item/stack/tile/iron/base, /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, /turf/open/floor/plating, /area/shuttle/escape) +"CQ" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/escape) "Dc" = ( /obj/item/food/spaghetti/boiledspaghetti{ pixel_y = 5 @@ -735,6 +750,19 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/white/herringbone, /area/shuttle/escape/luxury) +"Eb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/vomit/old, +/turf/open/floor/iron, +/area/shuttle/escape) +"Ed" = ( +/obj/structure/closet/crate, +/obj/effect/turf_decal/delivery, +/obj/item/reagent_containers/cup/bucket, +/obj/item/mop, +/obj/item/reagent_containers/cup/glass/waterbottle, +/turf/open/floor/iron, +/area/shuttle/escape) "Eg" = ( /obj/structure/chair/comfy/teal{ dir = 4 @@ -750,71 +778,67 @@ "Ex" = ( /turf/closed/indestructible/riveted/plastinum/nodiagonal, /area/shuttle/escape/luxury) -"Ez" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/iron, -/area/shuttle/escape) "EG" = ( /obj/machinery/power/shuttle_engine/propulsion{ dir = 8 }, /turf/open/floor/plating, /area/shuttle/escape) -"Fl" = ( -/obj/structure/table/wood/fancy/black, -/obj/item/gun/ballistic/revolver/russian, -/turf/open/floor/carpet/green, -/area/shuttle/escape/luxury) -"FC" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/holofloor/beach/coast{ - dir = 4 - }, -/area/shuttle/escape/luxury) -"FD" = ( -/obj/item/food/cherrycupcake{ - pixel_y = 2 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/red, -/area/shuttle/escape/luxury) -"FO" = ( -/obj/structure/girder, +"EL" = ( +/obj/structure/bed, +/obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, +/turf/open/floor/plating, /area/shuttle/escape) -"Gq" = ( -/turf/closed/indestructible/riveted/plastinum/nodiagonal, -/area/shuttle/escape/brig) -"Gs" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/carpet/red, -/area/shuttle/escape/brig) -"Gz" = ( +"ER" = ( /obj/structure/girder, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, /obj/structure/window/reinforced/spawner/directional/east{ layer = 2.9 }, +/turf/open/floor/iron, +/area/shuttle/escape) +"EZ" = ( +/obj/effect/spawner/random/maintenance/eight, +/obj/structure/closet/crate/preopen, +/obj/effect/decal/cleanable/robot_debris, /obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/oil, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/shuttle/escape) -"He" = ( -/obj/structure/chair/comfy/shuttle, -/obj/structure/window/spawner/directional/north, +"Fl" = ( +/obj/structure/table/wood/fancy/black, +/obj/item/gun/ballistic/revolver/russian, +/turf/open/floor/carpet/green, +/area/shuttle/escape/luxury) +"Fq" = ( +/obj/structure/bed, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, +/turf/open/floor/plating, /area/shuttle/escape) -"Hn" = ( -/obj/structure/chair/comfy/shuttle, +"FC" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/holofloor/beach/coast{ + dir = 4 + }, +/area/shuttle/escape/luxury) +"FD" = ( +/obj/item/food/cherrycupcake{ + pixel_y = 2 + }, +/obj/structure/table/wood/fancy/black, +/turf/open/floor/carpet/red, +/area/shuttle/escape/luxury) +"FN" = ( /obj/structure/window/spawner/directional/north, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/shuttle/escape) +"Gq" = ( +/turf/closed/indestructible/riveted/plastinum/nodiagonal, +/area/shuttle/escape/brig) "Hq" = ( /obj/item/kirbyplants/random, /turf/open/floor/carpet/blue, @@ -823,6 +847,13 @@ /obj/structure/girder, /turf/open/floor/plating, /area/shuttle/escape) +"HI" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/carpet/green, +/area/shuttle/escape/luxury) "HU" = ( /obj/structure/toilet{ pixel_y = 8 @@ -830,21 +861,23 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape/luxury) -"In" = ( -/obj/effect/spawner/random/maintenance/eight, -/obj/structure/closet/crate/preopen, -/obj/effect/decal/cleanable/robot_debris, -/obj/effect/turf_decal/delivery, -/obj/effect/decal/cleanable/oil, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/shuttle/escape) "IB" = ( /obj/effect/spawner/random/maintenance/six, /obj/structure/closet/crate/trashcart/filled, /obj/effect/turf_decal/loading_area, /turf/open/floor/iron, /area/shuttle/escape) +"IF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/generic, +/turf/open/floor/iron, +/area/shuttle/escape) +"IT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/generic, +/obj/effect/decal/cleanable/robot_debris, +/turf/open/floor/iron, +/area/shuttle/escape) "Jd" = ( /obj/machinery/vending/wallmed/directional/south, /turf/open/floor/carpet/orange, @@ -857,13 +890,16 @@ }, /turf/open/floor/carpet/blue, /area/shuttle/escape/luxury) -"JF" = ( -/obj/effect/spawner/random/maintenance/eight, -/obj/structure/closet/crate/engineering/electrical, -/obj/effect/decal/cleanable/robot_debris, +"JO" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/shuttle/escape) +"JS" = ( +/obj/structure/girder, /obj/effect/turf_decal/delivery, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, +/obj/structure/grille/broken, +/turf/open/floor/plating, /area/shuttle/escape) "JV" = ( /turf/closed/wall/mineral/titanium/nodiagonal, @@ -879,17 +915,39 @@ /obj/machinery/light/directional/south, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape/luxury) +"Kw" = ( +/obj/machinery/door/poddoor/shutters/indestructible/preopen{ + dir = 4; + id = "gimmemoney" + }, +/turf/closed/indestructible/syndicate, +/area/shuttle/escape/luxury) "Ky" = ( /obj/structure/table/wood/fancy/black, /obj/item/storage/box/fireworks/dangerous, /turf/open/floor/carpet/green, /area/shuttle/escape/luxury) +"KE" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/structure/window/spawner/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/shuttle/escape) "KJ" = ( /obj/machinery/door/airlock/silver{ name = "Flight Control" }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape/luxury) +"KS" = ( +/obj/structure/closet/crate/large, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/maintenance/eight, +/turf/open/floor/iron, +/area/shuttle/escape) "KU" = ( /obj/item/food/kebab/tofu{ pixel_y = 6 @@ -903,15 +961,22 @@ dir = 4 }, /area/shuttle/escape/luxury) -"Li" = ( -/obj/structure/window/spawner/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/escape) "LO" = ( /obj/machinery/light/directional/south, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape/luxury) +"Mb" = ( +/obj/effect/decal/cleanable/oil/slippery, +/obj/structure/door_assembly, +/obj/item/stack/tile/iron/base, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/shuttle/escape) +"Mi" = ( +/obj/structure/girder, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/shuttle/escape) "Mn" = ( /turf/closed/indestructible/opsglass{ desc = "A durable looking window made of an alloy of of plasma and titanium."; @@ -934,6 +999,16 @@ }, /turf/open/floor/carpet/green, /area/shuttle/escape/luxury) +"MX" = ( +/obj/structure/closet/crate/freezer, +/obj/effect/decal/cleanable/blood/old, +/obj/item/reagent_containers/cup/glass/bottle/whiskey, +/obj/item/reagent_containers/cup/bottle/ethanol, +/obj/item/stack/medical/gauze/improvised, +/obj/item/bot_assembly/medbot, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/shuttle/escape) "Na" = ( /obj/item/food/spaghetti/pastatomato{ pixel_y = 5 @@ -951,31 +1026,19 @@ /obj/machinery/vending/wallmed/directional/north, /turf/open/floor/carpet/red, /area/shuttle/escape/brig) -"Oc" = ( -/obj/effect/spawner/random/maintenance/eight, -/obj/structure/closet/crate/engineering/electrical, -/obj/effect/decal/cleanable/robot_debris, -/obj/effect/turf_decal/delivery, -/obj/effect/decal/cleanable/oil, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/shuttle/escape) -"Oe" = ( -/obj/item/food/sandwich/notasandwich{ - pixel_y = 11 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/red, -/area/shuttle/escape/luxury) "Om" = ( /turf/open/floor/holofloor/beach/coast{ dir = 4 }, /area/shuttle/escape/luxury) -"Ow" = ( -/obj/effect/decal/cleanable/oil/slippery, -/obj/structure/door_assembly, -/obj/item/stack/tile/iron/base, +"OC" = ( +/obj/structure/table, +/obj/item/healthanalyzer, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/shuttle/escape) +"OK" = ( +/obj/structure/frame/machine, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/shuttle/escape) @@ -990,12 +1053,6 @@ /obj/structure/table/wood/fancy/black, /turf/open/floor/carpet/red, /area/shuttle/escape/luxury) -"Pr" = ( -/obj/structure/bed, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/escape) "PD" = ( /obj/item/food/melonfruitbowl{ pixel_y = 4 @@ -1003,26 +1060,6 @@ /obj/structure/table/wood/fancy/black, /turf/open/floor/carpet/red, /area/shuttle/escape/luxury) -"PG" = ( -/obj/effect/decal/cleanable/generic, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/shuttle/escape) -"PR" = ( -/obj/structure/table, -/obj/item/knife/kitchen, -/obj/item/hatchet, -/obj/item/wirecutters{ - pixel_y = 6 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/escape) -"PV" = ( -/obj/structure/bed, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/escape) "PY" = ( /obj/structure/chair/comfy/brown{ dir = 1 @@ -1044,24 +1081,6 @@ }, /turf/open/floor/carpet/green, /area/shuttle/escape/luxury) -"QU" = ( -/obj/effect/spawner/random/maintenance/eight, -/obj/structure/closet/crate/large, -/obj/effect/turf_decal/delivery, -/obj/effect/decal/cleanable/dirt, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, -/obj/item/toy/plush/rouny{ - name = "rouny plushie" - }, -/turf/open/floor/iron, -/area/shuttle/escape) -"Rb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/shuttle/escape) "Rk" = ( /obj/machinery/scanner_gate/luxury_shuttle{ layer = 2.6 @@ -1077,18 +1096,6 @@ /obj/effect/spawner/random/entertainment/arcade, /turf/open/floor/carpet/red, /area/shuttle/escape/luxury) -"RM" = ( -/obj/structure/table, -/obj/item/healthanalyzer, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/escape) -"RU" = ( -/obj/structure/grille/broken, -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/escape) "Sm" = ( /obj/structure/table/wood/fancy/black, /obj/item/storage/fancy/cigarettes/cigars/havana{ @@ -1096,6 +1103,16 @@ }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape/luxury) +"Sy" = ( +/obj/structure/table, +/obj/item/knife/kitchen, +/obj/item/hatchet, +/obj/item/wirecutters{ + pixel_y = 6 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/shuttle/escape) "SE" = ( /mob/living/simple_animal/bot/medbot, /obj/structure/extinguisher_cabinet/directional/south, @@ -1116,6 +1133,13 @@ /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/carpet/blue, /area/shuttle/escape/luxury) +"Tz" = ( +/obj/structure/ore_box, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/shuttle/escape) "TD" = ( /turf/open/floor/iron/white/herringbone, /area/shuttle/escape/luxury) @@ -1123,20 +1147,6 @@ /obj/effect/decal/cleanable/generic, /turf/open/floor/iron, /area/shuttle/escape) -"Ue" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/medical, -/obj/item/reagent_containers/pill/maintenance, -/obj/item/reagent_containers/pill/maintenance, -/obj/item/reagent_containers/pill/maintenance, -/obj/item/reagent_containers/pill/maintenance, -/obj/item/reagent_containers/pill/maintenance, -/obj/item/reagent_containers/pill/maintenance, -/obj/item/reagent_containers/pill/maintenance, -/obj/item/reagent_containers/pill/maintenance, -/turf/open/floor/iron, -/area/shuttle/escape) "UK" = ( /obj/structure/chair/comfy/shuttle, /obj/machinery/light/small/directional/north, @@ -1157,21 +1167,26 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape/luxury) -"VO" = ( -/obj/effect/spawner/random/maintenance/eight, -/obj/structure/closet/crate/engineering, -/obj/effect/turf_decal/delivery, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/shuttle/escape) "Wa" = ( /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape/luxury) +"Wd" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/carpet/red, +/area/shuttle/escape/brig) "We" = ( /obj/structure/chair/comfy/brown, /turf/open/floor/carpet/orange, /area/shuttle/escape/luxury) +"Wp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/shard, +/turf/open/floor/iron, +/area/shuttle/escape) "Wx" = ( /obj/machinery/vending/wallmed/directional/north, /turf/open/floor/carpet/blue, @@ -1186,25 +1201,17 @@ "WO" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/shuttle/escape) +"Xj" = ( +/obj/item/food/sandwich/notasandwich{ + pixel_y = 11 + }, +/obj/structure/table/wood/fancy/black, +/turf/open/floor/carpet/red, +/area/shuttle/escape/luxury) "Xz" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/shuttle/escape/luxury) -"XK" = ( -/obj/structure/closet/crate/freezer, -/obj/effect/decal/cleanable/blood/old, -/obj/item/reagent_containers/cup/glass/bottle/whiskey, -/obj/item/reagent_containers/cup/bottle/ethanol, -/obj/item/stack/medical/gauze/improvised, -/obj/item/bot_assembly/medbot, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/escape) -"XU" = ( -/obj/item/stack/tile/iron/base, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/escape) "XY" = ( /obj/effect/decal/cleanable/oil, /turf/open/floor/plating, @@ -1217,12 +1224,6 @@ "Yj" = ( /turf/closed/indestructible/syndicate, /area/shuttle/escape/luxury) -"Ym" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/turf/open/floor/carpet/red, -/area/shuttle/escape/brig) "Yo" = ( /obj/machinery/light/directional/north, /turf/open/floor/carpet/blue, @@ -1249,13 +1250,20 @@ "YV" = ( /turf/open/floor/holofloor/beach/water, /area/shuttle/escape/luxury) -"ZL" = ( -/obj/structure/ore_box, +"Za" = ( +/obj/effect/spawner/random/maintenance/eight, +/obj/structure/closet/crate/preopen, /obj/effect/turf_decal/delivery, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, +/obj/effect/decal/cleanable/vomit/old, /turf/open/floor/iron, /area/shuttle/escape) +"Zo" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/carpet/red, +/area/shuttle/escape/brig) (1,1,1) = {" fH @@ -1303,83 +1311,83 @@ JV "} (3,1,1) = {" CQ -qv -Oc -JF +sH +qc +uC CQ xq qQ YQ -AN -xO +JS +Ed JV -iD -xy +JO +KE gM -RU +gf JV -md -XK -RM +OK +MX +OC CQ "} (4,1,1) = {" CQ -ZL -In -zk -Ow +Tz +EZ +Bt +Mb XY fJ -qg -He -PG -FO -eY -xy -He -XU -eN -fT -iD -Rb +rH +BV +ti +Mi +IT +KE +BV +CP +oH +kc +JO +et CQ "} (5,1,1) = {" CQ -jc -VO -Av +KS +rN +Za CQ -fg +yj TM yk gM -AB -rJ -iD +rh +xn +JO Bo -Ez -yy +Eb +IF JV -PR -Pr -PV +Sy +EL +Fq CQ "} (6,1,1) = {" CQ -jc -Ue -VO +KS +dM +rN CQ IB lq Br gL bg -iD -XU +JO +CP HG fJ DP @@ -1391,68 +1399,68 @@ CQ "} (7,1,1) = {" JV -QU -kt -Gz +pW +ER +BK JV -jQ +IB Br kJ -iD +JO ty -Li -fg +FN +yj TM -iD -iD -aR +JO +JO +Wp Br -gS -bY +eb +vj CQ "} (8,1,1) = {" JV UK -XU +CP Nm ly -iD -fg +JO +yj gM -XU -qg -Hn -gS -xy +CP +rH +zR +eb +KE kJ -Ez +Eb yk kJ -qC -oX +iS +ur CQ "} (9,1,1) = {" jy jH Br -wP +gQ ji fJ bg gM -fg +yj sr -Hn -iD -xy +zR +JO +KE kJ -CZ +rh ty kJ Yb -xy +ja JV "} (10,1,1) = {" @@ -1474,14 +1482,14 @@ Yj gG gG gG -gG +Kw Yj "} (11,1,1) = {" DE la la -Ym +Wd Gq YF ze @@ -1496,7 +1504,7 @@ Du JB jJ jJ -Hq +ge Ex "} (12,1,1) = {" @@ -1525,7 +1533,7 @@ Ex Gq cI la -Gs +Zo Gq ra oA @@ -1540,7 +1548,7 @@ PY We PD Na -dA +PY Ex "} (14,1,1) = {" @@ -1557,7 +1565,7 @@ yB jJ We Pe -Oe +Xj PY We gY @@ -1582,14 +1590,14 @@ xY Ka PY We -nC +ul xK PY Ex "} (16,1,1) = {" Ex -Hq +Yo jJ jJ jJ @@ -1606,7 +1614,7 @@ PY We bS rZ -PY +dA Ex "} (17,1,1) = {" @@ -1633,7 +1641,7 @@ Ex "} (18,1,1) = {" Ex -Yo +Hq SN ho SN @@ -1650,7 +1658,7 @@ PY We UX jZ -dA +PY Ex "} (19,1,1) = {" @@ -1729,7 +1737,7 @@ cP jJ jJ jJ -ot +HI Ex TD TD @@ -1809,10 +1817,10 @@ Ex "} (26,1,1) = {" Ex -vP +th dm dm -Kb +th Ex mE WF diff --git a/_maps/shuttles/emergency_medisim.dmm b/_maps/shuttles/emergency_medisim.dmm index 28007ddd54243..7689bed7306b3 100644 --- a/_maps/shuttles/emergency_medisim.dmm +++ b/_maps/shuttles/emergency_medisim.dmm @@ -45,12 +45,26 @@ }, /turf/open/floor/wood, /area/shuttle/escape/simulation) +"cY" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/template_noop, +/area/shuttle/escape) "eb" = ( /obj/effect/turf_decal/stripes{ dir = 4 }, /turf/open/floor/plating, /area/shuttle/escape) +"eh" = ( +/obj/item/kirbyplants/organic/plant21{ + pixel_x = -3; + pixel_y = 3 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) "em" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/punji_sticks/spikes, @@ -64,6 +78,10 @@ /obj/structure/railing/corner, /turf/template_noop, /area/shuttle/escape) +"eL" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) "eX" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -82,10 +100,6 @@ /obj/machinery/computer/records/medical, /turf/open/floor/mineral/titanium/tiled/blue, /area/shuttle/escape) -"fL" = ( -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/plating, -/area/shuttle/escape) "fW" = ( /obj/item/reagent_containers/cup/bottle/epinephrine{ pixel_x = 6 @@ -215,6 +229,29 @@ dir = 8 }, /area/shuttle/escape/simulation) +"js" = ( +/obj/structure/closet/crate/medical, +/obj/item/storage/medkit/regular, +/obj/item/storage/medkit/o2{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/medkit/toxin{ + pixel_x = -4; + pixel_y = 3 + }, +/obj/item/healthanalyzer{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/lazarus_injector, +/mob/living/simple_animal/bot/medbot{ + name = "\improper emergency medibot"; + pixel_x = -3; + pixel_y = 2 + }, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) "jQ" = ( /obj/structure/rack, /obj/item/toy/crayon/red{ @@ -257,6 +294,12 @@ /obj/item/flashlight/flare/torch, /turf/open/floor/wood, /area/shuttle/escape/simulation) +"ko" = ( +/obj/structure/table, +/obj/machinery/recharger, +/obj/structure/sign/warning/vacuum/external/directional/south, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) "ku" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -275,14 +318,10 @@ }, /turf/template_noop, /area/shuttle/escape) -"kO" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/machinery/light/small/directional/east, -/turf/template_noop, -/area/shuttle/escape) +"kP" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) "kS" = ( /obj/machinery/light/directional/west, /turf/open/floor/mineral/titanium, @@ -342,6 +381,10 @@ /obj/machinery/stasis, /turf/open/floor/mineral/titanium/tiled/blue, /area/shuttle/escape) +"ow" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) "oK" = ( /obj/machinery/teambuilder/blue, /turf/open/indestructible/binary, @@ -476,22 +519,13 @@ /turf/template_noop, /area/shuttle/escape) "un" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, /turf/open/floor/mineral/titanium/tiled/blue, /area/shuttle/escape) -"uo" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/machinery/light/small/directional/east, -/turf/template_noop, -/area/shuttle/escape) "uG" = ( -/obj/structure/bed/pod{ - desc = "An old medical bed, just waiting for replacement with something up to date."; - name = "medical bed" +/obj/structure/bed/medical{ + dir = 4 }, /obj/structure/curtain, /turf/open/floor/mineral/titanium/tiled/blue, @@ -555,6 +589,11 @@ /obj/effect/turf_decal/sand, /turf/open/misc/sandy_dirt, /area/shuttle/escape/simulation) +"zI" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/light/floor, +/turf/open/floor/plating, +/area/shuttle/escape) "Aa" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -582,6 +621,10 @@ /obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) +"AR" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) "Bd" = ( /obj/structure/railing/corner, /obj/structure/railing/corner{ @@ -598,6 +641,13 @@ /obj/structure/sign/departments/medbay/alt, /turf/closed/wall/mineral/titanium, /area/shuttle/escape) +"Bp" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/plating, +/area/shuttle/escape) "BO" = ( /obj/structure/closet/crate{ name = "emergency supplies crate" @@ -627,6 +677,14 @@ }, /turf/open/floor/plating, /area/shuttle/escape) +"Cn" = ( +/obj/structure/rack, +/obj/item/tank/internals/oxygen/red, +/obj/item/clothing/suit/utility/fire/firefighter, +/obj/item/clothing/mask/gas, +/obj/item/clothing/head/utility/hardhat/red, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) "Cr" = ( /obj/structure/railing/corner{ dir = 4 @@ -671,13 +729,9 @@ /obj/structure/table/reinforced, /turf/open/floor/mineral/titanium/tiled/blue, /area/shuttle/escape) -"CT" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/turf/open/floor/mineral/titanium, +"CS" = ( +/obj/machinery/light/floor, +/turf/open/floor/mineral/titanium/white, /area/shuttle/escape) "CY" = ( /obj/machinery/power/shuttle_engine/heater{ @@ -689,6 +743,17 @@ /obj/structure/flora/bush/lavendergrass/style_random, /turf/open/misc/grass, /area/shuttle/escape/simulation) +"DI" = ( +/obj/structure/table, +/obj/item/storage/medkit/regular{ + pixel_x = 2; + pixel_y = 3 + }, +/obj/item/crowbar, +/obj/item/storage/medkit/fire, +/obj/structure/sign/warning/vacuum/external/directional/north, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) "En" = ( /obj/structure/railing, /obj/effect/turf_decal/sand/plating, @@ -709,10 +774,6 @@ "EN" = ( /turf/template_noop, /area/template_noop) -"EV" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/escape) "EZ" = ( /turf/open/floor/mineral/titanium, /area/shuttle/escape) @@ -839,12 +900,6 @@ /obj/effect/turf_decal/sand/plating, /turf/open/misc/sandy_dirt, /area/shuttle/escape/simulation) -"HE" = ( -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/obj/machinery/light/directional/west, -/turf/open/floor/mineral/titanium/tiled/blue, -/area/shuttle/escape) "Io" = ( /obj/item/banner/blue{ anchored = 1 @@ -885,6 +940,10 @@ }, /turf/template_noop, /area/shuttle/escape) +"JV" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) "Ki" = ( /obj/machinery/computer/security{ dir = 8 @@ -958,6 +1017,13 @@ /obj/effect/decal/remains/human, /turf/open/misc/grass, /area/shuttle/escape/simulation) +"MK" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/template_noop, +/area/shuttle/escape) "MX" = ( /obj/structure/flora/bush/reed/style_random, /turf/open/misc/grass, @@ -1014,12 +1080,6 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"Ov" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/plating, -/area/shuttle/escape) "Pa" = ( /obj/structure/railing/corner, /obj/effect/turf_decal/sand/plating, @@ -1041,6 +1101,10 @@ /obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/titanium, /area/shuttle/escape) +"Qf" = ( +/obj/structure/reagent_dispensers/wall/peppertank/directional/west, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) "QH" = ( /obj/structure/rack, /obj/item/food/egg/red, @@ -1085,15 +1149,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"RV" = ( -/obj/structure/rack, -/obj/item/tank/internals/oxygen/red, -/obj/item/clothing/suit/utility/fire/firefighter, -/obj/item/clothing/mask/gas, -/obj/item/clothing/head/utility/hardhat/red, -/obj/machinery/light/directional/west, -/turf/open/floor/mineral/titanium/yellow, -/area/shuttle/escape) "Sf" = ( /obj/structure/rack, /obj/item/storage/toolbox/electrical{ @@ -1176,11 +1231,10 @@ /obj/structure/railing, /turf/template_noop, /area/shuttle/escape) -"Vn" = ( -/obj/structure/reagent_dispensers/wall/peppertank/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) +"Vr" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) "Vv" = ( /obj/structure/rack, /obj/item/documents/syndicate/red, @@ -1209,10 +1263,6 @@ /obj/item/paper/crumpled/retired_designs, /turf/open/floor/plating, /area/shuttle/escape) -"WN" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/escape) "Xb" = ( /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) @@ -1226,6 +1276,10 @@ "Xv" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/escape) +"XK" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/mineral/titanium/tiled/blue, +/area/shuttle/escape) "XR" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 4 @@ -1266,18 +1320,6 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"Yn" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular{ - pixel_x = 2; - pixel_y = 3 - }, -/obj/item/crowbar, -/obj/item/storage/medkit/fire, -/obj/structure/sign/warning/vacuum/external/directional/north, -/obj/machinery/light/directional/east, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "Yp" = ( /obj/machinery/teambuilder/red, /turf/open/indestructible/binary, @@ -1288,13 +1330,6 @@ }, /turf/open/floor/stone, /area/shuttle/escape/simulation) -"YB" = ( -/obj/structure/table, -/obj/machinery/recharger, -/obj/structure/sign/warning/vacuum/external/directional/south, -/obj/machinery/light/directional/east, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "YC" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -1357,30 +1392,6 @@ }, /turf/template_noop, /area/shuttle/escape) -"ZU" = ( -/obj/structure/closet/crate/medical, -/obj/item/storage/medkit/regular, -/obj/item/storage/medkit/o2{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/medkit/toxin{ - pixel_x = -4; - pixel_y = 3 - }, -/obj/item/healthanalyzer{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/lazarus_injector, -/mob/living/simple_animal/bot/medbot{ - name = "\improper emergency medibot"; - pixel_x = -3; - pixel_y = 2 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/mineral/titanium/yellow, -/area/shuttle/escape) (1,1,1) = {" EN @@ -1476,21 +1487,21 @@ eX gj eX Xk -fL +zI eb tP Xv Xv -Yn +DI Ki -Zx +CS Pi -YB +ko Xv Xv Va eb -Ov +Bp WA eX gj @@ -1532,25 +1543,25 @@ Xv aS Zx Xv -kO +MK YC JU YC -uo +cY Xv -CT +eh Zx Zx -cc +EZ Zx Zx -CT +eh Xv -kO +MK YC wX YC -uo +cY Xv Zx aS @@ -1590,11 +1601,11 @@ Xv Zx EZ EZ -kS +AR Zx Zx Zx -kS +EZ Zx Zx EZ @@ -1604,11 +1615,11 @@ Pr EZ Zx EZ -kS -Zx +EZ Zx Zx -kS +Vr +EZ EZ EZ Zx @@ -1625,13 +1636,13 @@ ZB ZB Xv Xv -Zx +eL Zx Kw ZB Pr Zx -Zx +eL Xv Xv ZB @@ -1710,7 +1721,7 @@ ll qM so un -HE +un Xv sS Zx @@ -1720,7 +1731,7 @@ Rl Zx sS Xv -Vn +Qf XX XX XX @@ -1769,15 +1780,15 @@ wY CP uG nA -nA +XK Be -EV +Zx Rl Rl Rl -WN +Zx RB -Xb +kP Xb Yk Yk @@ -1886,13 +1897,13 @@ NS Nm gt aG -ZU +js hw hw hw hw hw -RV +Cn aG Fs Su @@ -1973,13 +1984,13 @@ Yj Ho gt pF -hw +ow FK FK FK FK FK -hw +JV pF Fs jf diff --git a/_maps/shuttles/emergency_meta.dmm b/_maps/shuttles/emergency_meta.dmm index 8191ac47a5811..068ecf465e4df 100644 --- a/_maps/shuttles/emergency_meta.dmm +++ b/_maps/shuttles/emergency_meta.dmm @@ -49,11 +49,6 @@ /obj/machinery/computer/security, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"ao" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "ap" = ( /obj/structure/closet/emcloset, /turf/open/floor/mineral/titanium/blue, @@ -65,12 +60,6 @@ /obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"as" = ( -/obj/item/radio/intercom/directional/north, -/obj/structure/chair/comfy/shuttle, -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "at" = ( /obj/item/clothing/suit/hazardvest{ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; @@ -158,13 +147,6 @@ }, /turf/open/floor/plating/airless, /area/shuttle/escape) -"av" = ( -/obj/machinery/power/shuttle_engine/heater{ - dir = 8 - }, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/plating/airless, -/area/shuttle/escape) "aw" = ( /obj/structure/table, /obj/item/storage/fancy/donut_box, @@ -176,14 +158,6 @@ }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"ay" = ( -/obj/structure/table, -/obj/item/restraints/handcuffs{ - pixel_y = 3 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "aA" = ( /obj/structure/tank_dispenser/oxygen{ layer = 2.7; @@ -258,37 +232,6 @@ }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"aQ" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 8 - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) -"aR" = ( -/obj/structure/table, -/obj/item/folder/blue, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) -"aS" = ( -/obj/item/radio/intercom/directional/south, -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) -"aT" = ( -/obj/structure/table, -/obj/item/stack/medical/gauze, -/obj/item/stack/medical/bruise_pack, -/obj/item/stack/medical/ointment, -/obj/machinery/light/directional/east, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "aW" = ( /obj/machinery/door/airlock/command{ name = "Emergency Recovery Airlock" @@ -480,22 +423,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/shuttle/escape) -"bD" = ( -/obj/structure/table, -/obj/item/folder/red{ - pixel_x = 3 - }, -/obj/item/folder/white{ - pixel_x = -4; - pixel_y = 2 - }, -/obj/item/radio/intercom/directional/south, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = -4; - pixel_y = 4 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "bE" = ( /obj/structure/table, /obj/item/restraints/handcuffs{ @@ -650,97 +577,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"bW" = ( -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = 3 - }, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = 3 - }, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = 3 - }, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = 3 - }, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = 3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/head/utility/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/item/clothing/head/utility/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/item/clothing/head/utility/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/item/clothing/head/utility/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/item/clothing/head/utility/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/structure/closet/crate{ - name = "lifejackets" - }, -/obj/machinery/light/directional/east, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) -"bX" = ( -/obj/machinery/light/directional/west, -/obj/machinery/status_display/evac/directional/west, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) -"bY" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "ca" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -753,19 +589,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/shuttle/escape) -"cc" = ( +"ef" = ( +/obj/structure/table, +/obj/item/storage/medkit/regular, /obj/machinery/light/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, +/turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"cd" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/structure/reagent_dispensers/wall/peppertank/directional/east, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "ek" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -773,6 +602,13 @@ /obj/machinery/camera/autoname, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) +"fx" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/structure/reagent_dispensers/wall/peppertank/directional/east, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) "gO" = ( /obj/machinery/stasis, /obj/machinery/camera/autoname{ @@ -780,6 +616,10 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) +"jw" = ( +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) "qi" = ( /obj/structure/chair/comfy/shuttle, /obj/machinery/vending/wallmed/directional/north{ @@ -787,6 +627,18 @@ }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) +"qs" = ( +/obj/item/radio/intercom/directional/south, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"qL" = ( +/obj/item/radio/intercom/directional/north, +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) "sd" = ( /obj/structure/chair/comfy/shuttle, /obj/structure/extinguisher_cabinet/directional/north, @@ -799,6 +651,31 @@ /obj/machinery/status_display/evac/directional/west, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) +"xx" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/machinery/light/directional/south, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"yn" = ( +/obj/structure/table, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 8 + }, +/obj/item/folder/blue, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"yO" = ( +/obj/structure/table, +/obj/item/restraints/handcuffs{ + pixel_y = 3 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) "GL" = ( /obj/machinery/camera/autoname{ dir = 1 @@ -812,6 +689,13 @@ }, /turf/open/floor/iron, /area/shuttle/escape) +"Ld" = ( +/obj/structure/table, +/obj/item/stack/medical/gauze, +/obj/item/stack/medical/bruise_pack, +/obj/item/stack/medical/ointment, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) "Lk" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -822,6 +706,38 @@ "LY" = ( /turf/open/floor/mineral/titanium, /area/shuttle/escape) +"On" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/shuttle/escape) +"Rj" = ( +/obj/machinery/power/shuttle_engine/heater{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"RT" = ( +/obj/structure/table, +/obj/item/folder/red{ + pixel_x = 3 + }, +/obj/item/folder/white{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/radio/intercom/directional/south, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) "Sb" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -831,6 +747,12 @@ }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) +"Tw" = ( +/obj/structure/table, +/obj/item/radio/intercom/directional/south, +/obj/item/flashlight/lamp/green, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) "TZ" = ( /obj/structure/chair/comfy/shuttle{ dir = 4 @@ -842,6 +764,11 @@ "Vs" = ( /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) +"Xx" = ( +/obj/structure/chair/comfy/shuttle, +/obj/machinery/light/directional/north, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) (1,1,1) = {" aa @@ -862,16 +789,16 @@ aa (2,1,1) = {" aa ad -av -av -av +Rj +Rj +Rj ad -av -av +Rj +Rj ad -av -av -av +Rj +Rj +Rj ad aa "} @@ -903,7 +830,7 @@ aP ad TZ bd -bd +On bC ac "} @@ -915,10 +842,10 @@ aC aG ax aq -aQ +Tw ad be -cc +be be be bf @@ -931,7 +858,7 @@ LY LY LY aC -aR +yn ad bf bT @@ -941,12 +868,12 @@ bf "} (7,1,1) = {" ac -ao -ay +ef +yO LY LY LY -bY +aq aq aW cb @@ -974,17 +901,17 @@ ad (9,1,1) = {" ad ap -bX +jw aq LY aq -bX +jw ap ad bh bh tZ -bD +RT ad "} (10,1,1) = {" @@ -1005,7 +932,7 @@ ac "} (11,1,1) = {" ad -ar +bV LY aE ac @@ -1027,23 +954,23 @@ aE ad qi LY -aE +ca ad -bi -cd +Xx +fx bs bG ad "} (13,1,1) = {" ad -bV +ar LY aE ac ar LY -aS +qs ad ad ad @@ -1133,13 +1060,13 @@ ad "} (19,1,1) = {" ad -as +qL LY aE ac ar LY -ca +aE ad bm bv @@ -1165,13 +1092,13 @@ ad "} (21,1,1) = {" ad -ar +bV LY aE ac ar LY -Lk +xx ad bo be @@ -1213,13 +1140,13 @@ ad "} (24,1,1) = {" ad -bW +at aA at LY aN LY -aT +Ld ag bq bp diff --git a/_maps/shuttles/emergency_meteor.dmm b/_maps/shuttles/emergency_meteor.dmm index a32adfb10ad76..658c290b95684 100644 --- a/_maps/shuttles/emergency_meteor.dmm +++ b/_maps/shuttles/emergency_meteor.dmm @@ -22,7 +22,7 @@ /turf/open/misc/asteroid, /area/shuttle/escape/meteor) "f" = ( -/mob/living/simple_animal/hostile/asteroid/goliath, +/mob/living/basic/mining/goliath/ancient, /turf/open/misc/asteroid, /area/shuttle/escape/meteor) "g" = ( diff --git a/_maps/shuttles/emergency_mini.dmm b/_maps/shuttles/emergency_mini.dmm index 1351cc0dd8d8a..73c5f42b38f06 100644 --- a/_maps/shuttles/emergency_mini.dmm +++ b/_maps/shuttles/emergency_mini.dmm @@ -11,13 +11,6 @@ }, /turf/open/floor/plating/airless, /area/shuttle/escape) -"d" = ( -/obj/machinery/power/shuttle_engine/heater{ - dir = 1 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/plating/airless, -/area/shuttle/escape) "e" = ( /obj/item/storage/medkit/regular{ pixel_x = 2; @@ -52,23 +45,6 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"k" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/escape) -"l" = ( -/obj/machinery/vending/wallmed/directional/east{ - use_power = 0 - }, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/escape) -"m" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "n" = ( /obj/effect/spawner/structure/window/reinforced/shuttle, /turf/open/floor/plating, @@ -123,14 +99,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"A" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "B" = ( /obj/machinery/door/airlock/titanium{ name = "Emergency Shuttle Airlock" @@ -141,6 +109,13 @@ }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) +"C" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) "D" = ( /obj/structure/table, /obj/item/storage/medkit/fire, @@ -152,14 +127,24 @@ /obj/item/extinguisher, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"E" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/titanium/blue, +"F" = ( +/obj/machinery/vending/wallmed/directional/east{ + use_power = 0 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/mineral/titanium/white, /area/shuttle/escape) "G" = ( /obj/structure/table/optable, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) +"H" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) "I" = ( /obj/machinery/door/airlock/command/glass{ name = "Escape Shuttle Cockpit" @@ -232,15 +217,33 @@ /obj/item/crowbar, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) +"U" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/machinery/vending/wallmed/directional/west, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) "W" = ( /obj/structure/table, /obj/item/clothing/suit/apron/surgical, -/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/item/surgery_tray/full, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) "X" = ( /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) +"Y" = ( +/obj/machinery/power/shuttle_engine/heater{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"Z" = ( +/obj/machinery/light/floor, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) (1,1,1) = {" a @@ -269,7 +272,7 @@ a b b e -k +X X p f @@ -277,7 +280,7 @@ M M M M -M +C f M M @@ -290,7 +293,7 @@ b "} (3,1,1) = {" c -d +Y W X X @@ -313,30 +316,30 @@ n "} (4,1,1) = {" c -d +Y G -l +F g n f K K K -y +K K K K f w b -t f +Z R n "} (5,1,1) = {" c -d +Y b b b @@ -359,30 +362,30 @@ n "} (6,1,1) = {" c -d -h +Y h +H n r f M M M -A +U M M M f -E +r b L -f +Z R n "} (7,1,1) = {" c -d +Y i i o @@ -407,7 +410,7 @@ n b b j -m +j n s f @@ -415,7 +418,7 @@ K K K K -K +y f K K diff --git a/_maps/shuttles/emergency_monastery.dmm b/_maps/shuttles/emergency_monastery.dmm index 881692a0e2977..390e4329f5de7 100644 --- a/_maps/shuttles/emergency_monastery.dmm +++ b/_maps/shuttles/emergency_monastery.dmm @@ -85,9 +85,7 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "bc" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, +/obj/item/kirbyplants/organic/plant22, /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark, /area/shuttle/escape) @@ -236,9 +234,7 @@ /turf/closed/wall, /area/shuttle/escape) "do" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, +/obj/item/kirbyplants/organic/plant22, /obj/machinery/power/apc/auto_name/directional/east, /obj/machinery/airalarm/directional/north, /obj/structure/cable, @@ -983,8 +979,7 @@ /obj/structure/sign/picture_frame/portrait{ pixel_y = 28 }, -/obj/item/kirbyplants{ - icon_state = "plant-21"; +/obj/item/kirbyplants/organic/plant21{ pixel_y = 3 }, /turf/open/floor/iron/dark, @@ -1415,9 +1410,7 @@ /turf/open/floor/iron/grimy, /area/shuttle/escape) "vj" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, +/obj/item/kirbyplants/organic/plant21, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 5 @@ -1471,8 +1464,7 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "vU" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21"; +/obj/item/kirbyplants/organic/plant21{ pixel_y = 3 }, /turf/open/floor/iron/dark, @@ -1497,9 +1489,7 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "vY" = ( -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, +/obj/item/kirbyplants/organic/plant10, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 6 @@ -1526,9 +1516,7 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "xd" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, +/obj/item/kirbyplants/organic/plant21, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 10 }, @@ -1548,9 +1536,7 @@ /turf/open/floor/iron/showroomfloor, /area/shuttle/escape) "xt" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, +/obj/item/kirbyplants/organic/plant22, /turf/open/floor/iron/dark, /area/shuttle/escape) "xw" = ( @@ -2396,9 +2382,7 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "IL" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, +/obj/item/kirbyplants/organic/plant22, /obj/machinery/camera/directional/north{ c_tag = "Monastery Archives Fore"; network = list("ss13","monastery") @@ -2459,7 +2443,7 @@ /area/shuttle/escape) "Ju" = ( /obj/structure/rack{ - icon = 'icons/obj/stationobjs.dmi'; + icon = 'icons/obj/fluff/general.dmi'; icon_state = "minibar"; name = "skeletal minibar" }, @@ -2576,9 +2560,7 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "KH" = ( -/obj/item/kirbyplants{ - icon_state = "plant-08" - }, +/obj/item/kirbyplants/organic/plant8, /turf/open/floor/iron/dark, /area/shuttle/escape) "KK" = ( @@ -2820,7 +2802,8 @@ "NV" = ( /obj/item/radio/intercom/directional/north, /obj/machinery/requests_console/directional/west{ - department = "Chapel" + department = "Chapel"; + name = "Monastery Requests Console" }, /obj/effect/mapping_helpers/requests_console/supplies, /obj/structure/closet, @@ -3635,16 +3618,14 @@ /area/shuttle/escape) "Xb" = ( /obj/structure/table/wood, -/obj/item/kirbyplants{ - icon_state = "plant-22"; +/obj/item/kirbyplants/organic/plant22{ pixel_y = 8 }, /turf/open/floor/iron/dark, /area/shuttle/escape) "Xk" = ( /obj/structure/table/wood, -/obj/item/kirbyplants{ - icon_state = "plant-05"; +/obj/item/kirbyplants/organic/plant5{ pixel_y = 10 }, /obj/effect/turf_decal/tile/neutral/fourcorners, diff --git a/_maps/shuttles/emergency_narnar.dmm b/_maps/shuttles/emergency_narnar.dmm index f05479065bc19..835a6054a874e 100644 --- a/_maps/shuttles/emergency_narnar.dmm +++ b/_maps/shuttles/emergency_narnar.dmm @@ -178,14 +178,14 @@ /turf/open/floor/cult, /area/shuttle/escape) "J" = ( -/mob/living/simple_animal/hostile/eyeball{ +/mob/living/basic/eyeball{ faction = list("cult"); name = "left eyeball" }, /turf/open/floor/cult, /area/shuttle/escape) "K" = ( -/mob/living/simple_animal/hostile/eyeball{ +/mob/living/basic/eyeball{ faction = list("cult"); name = "right eyeball" }, diff --git a/_maps/shuttles/emergency_nature.dmm b/_maps/shuttles/emergency_nature.dmm index 486d0ab607073..95eada06cfb40 100644 --- a/_maps/shuttles/emergency_nature.dmm +++ b/_maps/shuttles/emergency_nature.dmm @@ -40,6 +40,13 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/shuttle/escape) +"bR" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 6 + }, +/obj/structure/sign/poster/official/pda_ad/directional/south, +/turf/open/floor/iron/white, +/area/shuttle/escape) "bS" = ( /obj/structure/table/reinforced, /obj/item/storage/box/lights/mixed{ @@ -59,6 +66,14 @@ /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/plating, /area/shuttle/escape) +"cw" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/structure/chair/comfy/shuttle, +/obj/structure/reagent_dispensers/wall/peppertank/directional/north, +/turf/open/floor/iron/dark, +/area/shuttle/escape/brig) "cR" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 5 @@ -127,17 +142,6 @@ /obj/machinery/recharger, /turf/open/floor/iron/dark, /area/shuttle/escape/brig) -"eY" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/emergency{ - pixel_y = 3 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "fD" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -168,6 +172,18 @@ dir = 1 }, /area/shuttle/escape) +"fV" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/structure/tank_dispenser/oxygen{ + layer = 2.7; + pixel_x = -1; + pixel_y = 2 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/shuttle/escape) "gg" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -208,15 +224,6 @@ /obj/machinery/hydroponics/soil, /turf/open/floor/grass, /area/shuttle/escape) -"ht" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/obj/structure/chair/comfy/shuttle, -/obj/machinery/light/directional/west, -/obj/structure/reagent_dispensers/wall/peppertank/directional/north, -/turf/open/floor/iron/dark, -/area/shuttle/escape/brig) "hC" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -258,17 +265,6 @@ }, /turf/open/floor/grass, /area/shuttle/escape) -"iD" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/obj/structure/table/reinforced, -/obj/item/restraints/handcuffs{ - pixel_y = 3 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "iF" = ( /obj/effect/turf_decal/weather/dirt{ dir = 8 @@ -395,12 +391,6 @@ /obj/structure/sign/warning/no_smoking/directional/north, /turf/open/floor/iron/white, /area/shuttle/escape) -"mq" = ( -/mob/living/carbon/human/species/monkey, -/obj/machinery/light/floor, -/obj/structure/flora/bush/sparsegrass/style_random, -/turf/open/floor/grass, -/area/shuttle/escape) "mw" = ( /obj/effect/turf_decal/weather/dirt{ dir = 10 @@ -427,6 +417,16 @@ }, /turf/open/floor/iron/white, /area/shuttle/escape) +"nU" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/emergency{ + pixel_y = 3 + }, +/turf/open/floor/iron/dark, +/area/shuttle/escape) "og" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 4 @@ -498,7 +498,7 @@ /area/shuttle/escape) "sF" = ( /obj/effect/turf_decal/trimline/blue/filled/line, -/obj/item/storage/backpack/duffelbag/med/surgery{ +/obj/item/surgery_tray/full{ pixel_y = 5 }, /obj/structure/rack, @@ -522,6 +522,18 @@ /obj/effect/turf_decal/trimline/green/filled/corner, /turf/open/floor/iron/white, /area/shuttle/escape) +"tn" = ( +/obj/structure/flora/rock/style_random, +/obj/machinery/light/floor, +/turf/open/floor/grass, +/area/shuttle/escape) +"tp" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/machinery/vending/cola/space_up, +/turf/open/floor/iron/white, +/area/shuttle/escape) "tL" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -538,20 +550,28 @@ /obj/structure/flora/bush/fullgrass/style_random, /turf/open/floor/grass, /area/shuttle/escape) -"ur" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ +"uI" = ( +/obj/structure/flora/rock/pile/jungle/style_3, +/turf/open/floor/grass, +/area/shuttle/escape) +"uV" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 }, -/obj/structure/chair/comfy/shuttle{ - dir = 4 +/obj/structure/table/glass, +/obj/item/storage/box/monkeycubes{ + pixel_x = 5; + pixel_y = 10 + }, +/obj/item/food/monkeycube{ + pixel_x = 5 + }, +/obj/item/pai_card{ + pixel_x = -6; + pixel_y = 1 }, /obj/machinery/light/directional/west, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron/dark, -/area/shuttle/escape) -"uI" = ( -/obj/structure/flora/rock/pile/jungle/style_3, -/turf/open/floor/grass, +/turf/open/floor/iron/white, /area/shuttle/escape) "vt" = ( /obj/effect/turf_decal/trimline/red/filled/line{ @@ -585,6 +605,17 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/dark, /area/shuttle/escape/brig) +"wa" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/machinery/status_display/evac/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/shuttle/escape) "wg" = ( /obj/effect/turf_decal/trimline/green/filled/end{ dir = 1 @@ -595,9 +626,14 @@ /obj/machinery/door/window/left/directional/north, /turf/open/floor/iron/white, /area/shuttle/escape) -"wX" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/light/directional/south, +"xe" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/structure/table/reinforced, +/obj/item/restraints/handcuffs{ + pixel_y = 3 + }, /turf/open/floor/iron/dark, /area/shuttle/escape) "xA" = ( @@ -607,17 +643,6 @@ /obj/structure/flora/bush/ferny/style_random, /turf/open/floor/grass, /area/shuttle/escape) -"xZ" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/obj/structure/tank_dispenser/oxygen{ - layer = 2.7; - pixel_x = -1; - pixel_y = 2 - }, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "yc" = ( /turf/open/floor/iron/dark, /area/shuttle/escape/brig) @@ -638,13 +663,6 @@ /obj/machinery/suit_storage_unit/standard_unit, /turf/open/floor/iron/dark, /area/shuttle/escape) -"yZ" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 6 - }, -/obj/structure/sign/poster/official/pda_ad/directional/south, -/turf/open/floor/iron/white, -/area/shuttle/escape) "zf" = ( /obj/structure/flora/bush/pointy/style_random, /turf/open/floor/grass, @@ -679,16 +697,6 @@ }, /turf/open/floor/grass, /area/shuttle/escape) -"Aw" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 - }, -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/obj/machinery/status_display/evac/directional/east, -/turf/open/floor/iron/white, -/area/shuttle/escape) "AM" = ( /obj/structure/flora/bush/flowers_yw/style_random, /turf/open/floor/grass, @@ -742,6 +750,11 @@ /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, /area/shuttle/escape) +"BW" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/machinery/light/floor, +/turf/open/floor/grass, +/area/shuttle/escape) "Cb" = ( /obj/structure/flora/bush/jungle/c/style_2, /turf/open/floor/grass, @@ -765,14 +778,6 @@ /obj/structure/flora/tree/jungle/small/style_random, /turf/open/floor/grass, /area/shuttle/escape) -"CQ" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/obj/machinery/vending/cola/space_up, -/turf/open/floor/iron/white, -/area/shuttle/escape) "Db" = ( /obj/structure/sign/poster/official/help_others, /turf/closed/wall/mineral/titanium/nodiagonal, @@ -798,13 +803,20 @@ }, /turf/open/floor/plating, /area/shuttle/escape) -"EI" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 +"Eb" = ( +/obj/structure/flora/bush/flowers_pp/style_random, +/obj/machinery/light/floor, +/turf/open/floor/grass, +/area/shuttle/escape) +"Eh" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 }, -/obj/machinery/light/directional/north, -/obj/machinery/vending/snack/green, -/turf/open/floor/iron/white, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/dark, /area/shuttle/escape) "Fo" = ( /obj/item/cultivator, @@ -815,30 +827,25 @@ /obj/structure/flora/bush/grassy/style_random, /turf/open/floor/grass, /area/shuttle/escape) +"FK" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/structure/chair, +/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6/directional/east, +/turf/open/floor/iron{ + dir = 1 + }, +/area/shuttle/escape) "Gf" = ( /obj/effect/turf_decal/weather/dirt{ dir = 8 }, /turf/open/floor/grass, /area/shuttle/escape) -"GO" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/obj/structure/table/glass, -/obj/item/storage/box/monkeycubes{ - pixel_x = 5; - pixel_y = 10 - }, -/obj/item/food/monkeycube{ - pixel_x = 5 - }, -/obj/item/pai_card{ - pixel_x = -6; - pixel_y = 1 - }, -/turf/open/floor/iron/white, -/area/shuttle/escape) "GV" = ( /obj/machinery/power/shuttle_engine/huge, /turf/open/floor/plating/airless, @@ -934,13 +941,6 @@ /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/floor/grass, /area/shuttle/escape) -"Kv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/sign/poster/contraband/tools/directional/north, -/turf/open/floor/plating, -/area/shuttle/escape) "Kx" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -954,6 +954,18 @@ }, /turf/open/floor/iron/white, /area/shuttle/escape) +"KY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/sign/poster/contraband/tools/directional/north, +/turf/open/floor/plating, +/area/shuttle/escape) +"Lc" = ( +/obj/structure/flora/bush/generic/style_random, +/obj/machinery/light/floor, +/turf/open/floor/grass, +/area/shuttle/escape) "Lm" = ( /obj/effect/turf_decal/weather/dirt{ dir = 1 @@ -1051,19 +1063,6 @@ }, /turf/open/floor/grass, /area/shuttle/escape) -"QZ" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/structure/chair, -/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6/directional/east, -/turf/open/floor/iron{ - dir = 1 - }, -/area/shuttle/escape) "Ru" = ( /obj/effect/turf_decal/weather/dirt{ dir = 9 @@ -1299,18 +1298,15 @@ /obj/structure/flora/bush/ferny/style_random, /turf/open/floor/grass, /area/shuttle/escape) -"Zt" = ( -/obj/effect/turf_decal/trimline/green/filled/line, -/turf/open/floor/iron/white, -/area/shuttle/escape) -"ZD" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, +"Zp" = ( /obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 + dir = 1 }, -/obj/machinery/light/directional/east, +/obj/machinery/vending/snack/green, +/turf/open/floor/iron/white, +/area/shuttle/escape) +"Zt" = ( +/obj/effect/turf_decal/trimline/green/filled/line, /turf/open/floor/iron/white, /area/shuttle/escape) "ZL" = ( @@ -1318,16 +1314,6 @@ /obj/item/seeds/banana, /turf/open/floor/grass, /area/shuttle/escape) -"ZT" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/shuttle/escape) (1,1,1) = {" WE @@ -1376,11 +1362,11 @@ Yu nA UO yt -ZT UO -GO UO -ZT +uV +UO +UO yt UO zr @@ -1487,7 +1473,7 @@ KT Bv BG Yu -Kv +KY DQ Jw gx @@ -1497,7 +1483,7 @@ gx (6,1,1) = {" VU Yu -ht +cw jZ yc vP @@ -1510,7 +1496,7 @@ Wr Vv Ti Fo -PP +Lc Xm ZL LO @@ -1539,7 +1525,7 @@ Co Zt VI Ru -zs +qD Bt qD Bo @@ -1547,7 +1533,7 @@ aJ fG CE Vv -zs +qD uc VI HV @@ -1595,13 +1581,13 @@ WE "} (9,1,1) = {" VI -eY +nU hJ lT -ur -xZ +Eh +fV Yu -CQ +tp Zt VI Ts @@ -1617,7 +1603,7 @@ gI TT VI HV -Zd +Kx Yu Um DQ @@ -1638,7 +1624,7 @@ HV LG Ob Uy -Xm +tn Vv Fp qD @@ -1646,7 +1632,7 @@ zs XK XK PP -Bt +BW ST wg PG @@ -1667,7 +1653,7 @@ WL WL Zg VI -EI +Zp Zt VI Lm @@ -1683,7 +1669,7 @@ XK Nu VI HV -Zd +Kx Yu Um Hi @@ -1731,13 +1717,13 @@ gM ku WL WL -wX +Zg Yu gg Zt VI UE -zs +qD zf ke zf @@ -1745,7 +1731,7 @@ ay XK ay AM -mq +Ia ex VI HV @@ -1761,7 +1747,7 @@ WE (14,1,1) = {" VU Yu -iD +xe og WL Zg @@ -1774,7 +1760,7 @@ TK Cb Bt qD -BM +Eb Bo Ia XK @@ -1879,7 +1865,7 @@ yt yt yt sV -yZ +bR Yu Yu BA @@ -1903,19 +1889,19 @@ VU Yu lV rI -ZD rI rI -Aw +rI +wa +rI rI rI -ZD rI Sr Yu Yu JD -QZ +FK Iz su Yu diff --git a/_maps/shuttles/emergency_northstar.dmm b/_maps/shuttles/emergency_northstar.dmm index fcf1a731ddbec..20795c72317b9 100644 --- a/_maps/shuttles/emergency_northstar.dmm +++ b/_maps/shuttles/emergency_northstar.dmm @@ -127,7 +127,7 @@ "nC" = ( /obj/structure/table/reinforced/rglass, /obj/item/defibrillator/loaded, -/obj/item/storage/backpack/duffelbag/med/surgery{ +/obj/item/surgery_tray/full{ pixel_y = 13 }, /obj/effect/turf_decal/tile/blue/anticorner{ @@ -645,7 +645,7 @@ Ei AW yq tq -mw +rV rV OL QT @@ -659,7 +659,7 @@ OL QT OL rV -mw +rV tq Wd AW diff --git a/_maps/shuttles/emergency_omega.dmm b/_maps/shuttles/emergency_omega.dmm index 5207f884f85bc..bb2976fc7492e 100644 --- a/_maps/shuttles/emergency_omega.dmm +++ b/_maps/shuttles/emergency_omega.dmm @@ -22,14 +22,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"ak" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/obj/machinery/status_display/evac/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "al" = ( /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) @@ -74,16 +66,6 @@ }, /turf/open/floor/iron, /area/shuttle/escape) -"aC" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/shuttle/escape) "aD" = ( /obj/structure/chair/comfy/shuttle{ dir = 4 @@ -202,26 +184,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/shuttle/escape) -"aK" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/light/small/directional/east, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron, -/area/shuttle/escape) -"aN" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/light/small/directional/west, -/obj/machinery/vending/wallmed/directional/west{ - use_power = 0 - }, -/turf/open/floor/iron, -/area/shuttle/escape) "aO" = ( /obj/structure/flora/bush/grassy/style_random, /obj/structure/flora/bush/lavendergrass/style_random, @@ -246,22 +208,6 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/shuttle/escape) -"aR" = ( -/obj/machinery/light/directional/south, -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/shuttle/escape) -"aS" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/shuttle/escape) "aT" = ( /obj/machinery/door/airlock/shuttle{ name = "Emergency Shuttle Cargo" @@ -323,14 +269,6 @@ }, /turf/open/floor/iron/white, /area/shuttle/escape) -"bd" = ( -/obj/machinery/recharge_station, -/obj/machinery/status_display/evac/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/shuttle/escape) "be" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -374,18 +312,6 @@ }, /turf/open/floor/iron/white, /area/shuttle/escape) -"bj" = ( -/obj/structure/table, -/obj/item/clipboard, -/obj/item/folder/yellow, -/obj/item/pen, -/obj/item/hand_labeler_refill, -/obj/structure/sign/warning/no_smoking/circle/directional/west, -/obj/item/radio/intercom/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/shuttle/escape) "bk" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/decal/cleanable/dirt, @@ -479,19 +405,18 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating/airless, /area/shuttle/escape) -"dO" = ( -/obj/item/storage/medkit/toxin, -/obj/item/storage/medkit/o2{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/structure/table/reinforced, -/obj/machinery/status_display/evac/directional/east, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, +"dv" = ( +/obj/structure/table, +/obj/item/clipboard, +/obj/item/folder/yellow, +/obj/item/pen, +/obj/item/hand_labeler_refill, +/obj/structure/sign/warning/no_smoking/circle/directional/west, +/obj/item/radio/intercom/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, /area/shuttle/escape) "dW" = ( /obj/structure/chair/comfy/shuttle{ @@ -501,12 +426,17 @@ /obj/structure/reagent_dispensers/wall/peppertank/directional/west, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"eA" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/structure/extinguisher_cabinet/directional/west, +"eH" = ( +/obj/structure/table/reinforced, +/obj/item/storage/fancy/donut_box, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"fm" = ( +/obj/machinery/recharge_station, +/obj/machinery/status_display/evac/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/shuttle/escape) "fC" = ( @@ -517,14 +447,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) -"ih" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; +"gu" = ( +/obj/item/storage/medkit/toxin, +/obj/item/storage/medkit/o2{ + pixel_x = 3; pixel_y = 3 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +/obj/structure/table/reinforced, +/obj/machinery/status_display/evac/directional/east, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, /area/shuttle/escape) "iz" = ( /obj/structure/table/reinforced, @@ -539,21 +473,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) -"oY" = ( -/obj/structure/table/reinforced, -/obj/item/storage/fancy/donut_box, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/shuttle/escape) -"qt" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/vending/wallmed/directional/east{ - use_power = 0 +"pj" = ( +/obj/item/kirbyplants/organic/plant21{ + pixel_x = -3; + pixel_y = 3 }, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/shuttle/escape) "qX" = ( @@ -569,10 +495,41 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/white, /area/shuttle/escape/brig) +"rH" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/vending/wallmed/directional/east{ + use_power = 0 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/shuttle/escape) +"sI" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) "sY" = ( /obj/effect/spawner/structure/window/reinforced/shuttle, /turf/open/floor/plating, /area/shuttle/escape) +"tH" = ( +/obj/item/storage/medkit/fire, +/obj/item/storage/medkit/regular{ + pixel_x = 2; + pixel_y = 3 + }, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/shuttle/escape) "vu" = ( /obj/machinery/door/airlock/command/glass{ name = "Cockpit" @@ -609,6 +566,29 @@ }, /turf/open/floor/iron, /area/shuttle/escape) +"yF" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/vending/wallmed/directional/west{ + use_power = 0 + }, +/turf/open/floor/iron, +/area/shuttle/escape) +"zr" = ( +/obj/item/kirbyplants/organic/plant21{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/shuttle/escape) +"Am" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) "Dh" = ( /obj/machinery/computer/communications, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -619,7 +599,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) -"HU" = ( +"Et" = ( /obj/machinery/computer/crew{ dir = 8 }, @@ -627,8 +607,14 @@ pixel_x = 32 }, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/shuttle/escape) +"Ge" = ( +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron, +/area/shuttle/escape) "IX" = ( /obj/machinery/door/airlock/command{ name = "Emergency Recovery Airlock" @@ -646,6 +632,22 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) +"NR" = ( +/obj/item/kirbyplants/organic/plant21{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"Of" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron, +/area/shuttle/escape) "Ou" = ( /obj/structure/chair/comfy/brown{ color = "#596479"; @@ -654,6 +656,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) +"PN" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/shuttle/escape) "TB" = ( /obj/machinery/door/airlock/security/glass{ name = "Holding Area" @@ -661,18 +672,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"UY" = ( -/obj/item/storage/medkit/fire, -/obj/item/storage/medkit/regular{ - pixel_x = 2; - pixel_y = 3 - }, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/shuttle/escape) "UZ" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, @@ -702,9 +701,9 @@ bu (2,1,1) = {" aa dW -ak -al -sY +sI +Am +aZ az aD aJ @@ -714,8 +713,8 @@ aD az sY az -bd -bj +fm +dv aa br bv @@ -725,7 +724,7 @@ sY ae al al -TB +sY aA UZ UZ @@ -746,12 +745,12 @@ sY ae al al -sY +TB aA aF -aK +Of aF -qt +rH aF aQ aT @@ -795,7 +794,7 @@ aG aO aI aH -aR +Ge aZ aZ sY @@ -808,7 +807,7 @@ br aa iI Kj -ih +NR sY aA aI @@ -833,9 +832,9 @@ Kj vu aA aJ -aN +yF aJ -eA +PN aJ aQ aV @@ -851,7 +850,7 @@ sY Dh Kj fC -ab +sY aA UZ UZ @@ -870,20 +869,20 @@ bv (10,1,1) = {" sY iz -oY -HU +eH +Et aa -aC +pj aF aF aF aF aF -aS +zr sY bc -dO -UY +gu +tH aa br bv diff --git a/_maps/shuttles/emergency_pod.dmm b/_maps/shuttles/emergency_pod.dmm index d6a9ff7c5a79e..6f4686fa6533e 100644 --- a/_maps/shuttles/emergency_pod.dmm +++ b/_maps/shuttles/emergency_pod.dmm @@ -29,7 +29,8 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "i" = ( -/obj/machinery/light/directional/west, +/obj/structure/chair/comfy/shuttle, +/obj/machinery/light/small/directional/north, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "j" = ( @@ -42,7 +43,6 @@ /obj/machinery/computer/emergency_shuttle{ dir = 8 }, -/obj/machinery/light/small/directional/east, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "m" = ( @@ -55,6 +55,13 @@ }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) +"I" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) (1,1,1) = {" a @@ -73,16 +80,16 @@ a "} (2,1,1) = {" b -f i +g j b d d d b -f i +g j b "} @@ -105,7 +112,7 @@ c b f g -j +I b d d @@ -113,7 +120,7 @@ d b f g -j +I b "} (5,1,1) = {" diff --git a/_maps/shuttles/emergency_pubby.dmm b/_maps/shuttles/emergency_pubby.dmm index 7fefead21ed56..f346fe323c6e4 100644 --- a/_maps/shuttles/emergency_pubby.dmm +++ b/_maps/shuttles/emergency_pubby.dmm @@ -75,18 +75,6 @@ "ar" = ( /turf/open/floor/carpet/black, /area/shuttle/escape) -"as" = ( -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/obj/item/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "at" = ( /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 8 @@ -139,14 +127,6 @@ /obj/effect/turf_decal/tile/green/half/contrasted, /turf/open/floor/iron/dark, /area/shuttle/escape) -"aB" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/item/kirbyplants{ - icon_state = "plant-11" - }, -/obj/effect/turf_decal/tile/green/anticorner/contrasted, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "aC" = ( /obj/structure/chair/comfy{ dir = 1 @@ -164,15 +144,6 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) -"aE" = ( -/obj/structure/chair/comfy, -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "aF" = ( /obj/structure/chair/comfy{ dir = 1 @@ -180,22 +151,6 @@ /obj/effect/turf_decal/tile/green/anticorner/contrasted, /turf/open/floor/iron/dark, /area/shuttle/escape) -"aG" = ( -/obj/structure/closet/secure_closet/freezer/fridge, -/obj/structure/window/reinforced/spawner/directional/west{ - layer = 2.9 - }, -/obj/machinery/light/directional/north, -/obj/item/food/butterdog, -/obj/item/food/cakeslice/apple, -/obj/item/food/cakeslice/brioche, -/obj/item/food/cakeslice/cheese, -/obj/item/food/cakeslice/chocolate, -/obj/item/food/cakeslice/lemon, -/obj/item/food/cakeslice/lime, -/obj/item/food/cakeslice/orange, -/turf/open/floor/iron/cafeteria, -/area/shuttle/escape) "aH" = ( /turf/open/floor/mineral/titanium, /area/shuttle/escape) @@ -212,14 +167,6 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) -"aK" = ( -/obj/structure/chair/comfy{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/green/half/contrasted, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "aL" = ( /obj/structure/chair/comfy/shuttle, /obj/effect/turf_decal/tile/purple/anticorner/contrasted{ @@ -282,14 +229,6 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) -"aT" = ( -/obj/structure/chair/comfy/shuttle, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "aU" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -322,29 +261,6 @@ }, /turf/open/floor/iron/white, /area/shuttle/escape) -"aY" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/purple/half/contrasted, -/turf/open/floor/iron/dark, -/area/shuttle/escape) -"aZ" = ( -/obj/structure/table/glass, -/obj/machinery/light/directional/north, -/obj/item/storage/medkit/regular, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, -/obj/machinery/vending/wallmed/directional/north{ - use_power = 0 - }, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/shuttle/escape) "ba" = ( /turf/open/floor/iron/cafeteria, /area/shuttle/escape) @@ -377,13 +293,6 @@ }, /turf/open/floor/iron/white, /area/shuttle/escape) -"bf" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/table, -/obj/item/storage/bag/tray, -/obj/item/clothing/under/suit/waiter, -/turf/open/floor/iron/cafeteria, -/area/shuttle/escape) "bg" = ( /obj/structure/closet/crate, /obj/item/storage/toolbox/mechanical, @@ -423,12 +332,6 @@ /obj/machinery/vending/cola, /turf/open/floor/plating, /area/shuttle/escape) -"bn" = ( -/obj/structure/closet/crate/preopen, -/obj/machinery/light/directional/south, -/obj/item/storage/toolbox/mechanical, -/turf/open/floor/plating, -/area/shuttle/escape) "bo" = ( /obj/structure/chair/comfy/shuttle, /obj/structure/window/reinforced/spawner/directional/north{ @@ -459,12 +362,6 @@ }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"bu" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "bv" = ( /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, /turf/open/floor/plating, @@ -518,21 +415,6 @@ /obj/structure/window/reinforced/plasma/plastitanium, /turf/open/floor/plating, /area/shuttle/escape) -"bG" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/plating, -/area/shuttle/escape) -"bH" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) -"bI" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "bK" = ( /obj/machinery/door/airlock/public/glass{ name = "Economy Class" @@ -570,15 +452,140 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/plating, /area/shuttle/escape/brig) +"eL" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/north, +/obj/item/kirbyplants/organic/plant21{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"fa" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"iy" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"jO" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/obj/structure/window/reinforced/spawner/directional/west{ + layer = 2.9 + }, +/obj/item/food/butterdog, +/obj/item/food/cakeslice/apple, +/obj/item/food/cakeslice/brioche, +/obj/item/food/cakeslice/cheese, +/obj/item/food/cakeslice/chocolate, +/obj/item/food/cakeslice/lemon, +/obj/item/food/cakeslice/lime, +/obj/item/food/cakeslice/orange, +/turf/open/floor/iron/cafeteria, +/area/shuttle/escape) +"kE" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/machinery/light/directional/west, +/turf/open/floor/plating, +/area/shuttle/escape) +"lt" = ( +/obj/machinery/light/directional/north, +/obj/item/kirbyplants/organic/plant22, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"na" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"np" = ( +/obj/machinery/light/directional/east, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/item/kirbyplants/organic/plant11, +/obj/effect/turf_decal/tile/green/anticorner/contrasted, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"nK" = ( +/obj/structure/chair/comfy{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"rq" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple/half/contrasted, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"wZ" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) "xt" = ( /obj/structure/window/reinforced/spawner/directional/west{ layer = 2.9 }, /turf/open/floor/plating, /area/shuttle/escape) +"Br" = ( +/obj/structure/chair/comfy{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green/half/contrasted, +/turf/open/floor/iron/dark, +/area/shuttle/escape) "Lu" = ( /turf/closed/wall/mineral/plastitanium, /area/shuttle/escape/brig) +"Pb" = ( +/obj/structure/chair/comfy, +/obj/machinery/computer/security/telescreen/entertainment/directional/north, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"RP" = ( +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/plating, +/area/shuttle/escape) +"Ur" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/table, +/obj/item/storage/bag/tray, +/obj/item/clothing/under/suit/waiter, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/cafeteria, +/area/shuttle/escape) "Uu" = ( /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/plating, @@ -589,6 +596,20 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) +"ZM" = ( +/obj/structure/table/glass, +/obj/item/storage/medkit/regular, +/obj/structure/window/reinforced/spawner/directional/east{ + layer = 2.9 + }, +/obj/machinery/vending/wallmed/directional/north{ + use_power = 0 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/shuttle/escape) (1,1,1) = {" aa @@ -650,7 +671,7 @@ ap aN az at -az +nK at aD ab @@ -658,7 +679,7 @@ aa ab aJ aM -aO +iy aM aO aM @@ -670,13 +691,13 @@ aX bb be bh -bl +kE bg bg ab aa bs -bu +lt bw bw bw @@ -694,43 +715,43 @@ br ab aa ab -aE +Pb aV aA au aA au -aK +Br ab aa ab -aT +fa au aP au aP au -aY +rq ab aa ab -aZ +ZM bb bb bi bl bg -bn +RP ab aa bs -bH +ax ax ax ax bA ax -bI +wZ bE bc "} @@ -838,43 +859,43 @@ bt ab aa ab -aE +Pb av aA au aA au -aK +Br ab aa ab -aT +fa au aP au aP au -aY +rq ab aa ab -aG +jO ba bd bj bj bo -bG +bq ab aa bs -bH +ax ax ax ax bA ax -bI +wZ bE bc "} @@ -886,9 +907,9 @@ ak ab aa ab -as +eL aw -aB +np au aC au @@ -897,18 +918,18 @@ ab aa ab aL -au -aQ -au +aR aQ aR +na +aR aU ab aa ab aW ba -bf +Ur bk bm bo @@ -916,7 +937,7 @@ bq ab aa bs -bu +lt bx bx bx diff --git a/_maps/shuttles/emergency_raven.dmm b/_maps/shuttles/emergency_raven.dmm index 56d4df5299e3b..4b12d66baedfd 100644 --- a/_maps/shuttles/emergency_raven.dmm +++ b/_maps/shuttles/emergency_raven.dmm @@ -219,16 +219,6 @@ /obj/effect/turf_decal/raven/one, /turf/open/floor/iron/dark, /area/shuttle/escape) -"aK" = ( -/obj/machinery/button/door{ - id = "escape_cockpit_blast"; - name = "Cockpit Airlock Blast Doors"; - pixel_y = -26; - req_access = list("command") - }, -/obj/effect/turf_decal/raven/two, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "aL" = ( /obj/effect/turf_decal/raven/three, /turf/open/floor/iron/dark, @@ -442,15 +432,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) -"bm" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "bn" = ( /obj/effect/turf_decal/stripes/white/end{ dir = 4 @@ -530,7 +511,7 @@ /area/shuttle/escape) "by" = ( /obj/machinery/iv_drip, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /turf/open/floor/iron/white/side{ dir = 10 }, @@ -788,31 +769,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) -"ci" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/iron/dark, -/area/shuttle/escape) -"cj" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/iron/dark, -/area/shuttle/escape) -"ck" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/obj/effect/turf_decal/bot_white, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "cl" = ( /obj/effect/turf_decal/stripes/white/corner, /obj/effect/decal/cleanable/dirt, @@ -908,15 +864,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) -"cA" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/obj/effect/turf_decal/bot_white, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "cB" = ( /obj/machinery/holopad, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -974,11 +921,6 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) -"cK" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "cL" = ( /obj/effect/turf_decal/stripes/white/line, /obj/effect/decal/cleanable/dirt, @@ -996,13 +938,6 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) -"cO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "cP" = ( /obj/structure/sign/departments/cargo, /turf/closed/wall/mineral/plastitanium/nodiagonal, @@ -1293,14 +1228,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) -"dp" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "dq" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 4 @@ -1322,14 +1249,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) -"dt" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "du" = ( /obj/effect/turf_decal/bot, /obj/structure/rack, @@ -1510,102 +1429,142 @@ }, /turf/closed/wall/mineral/plastitanium, /area/shuttle/escape) -"dX" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, +"ed" = ( /obj/effect/turf_decal/bot, -/obj/item/stack/sheet/mineral/plastitanium{ - amount = 50; - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/stack/sheet/iron/fifty{ - pixel_x = 4; - pixel_y = -4 +/obj/machinery/computer/monitor{ + dir = 1 }, -/obj/structure/table/reinforced, +/obj/structure/cable, /turf/open/floor/plating, /area/shuttle/escape) -"dY" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/turf_decal/bot, -/obj/item/stack/sheet/plastitaniumglass{ - amount = 20; - pixel_x = -2; - pixel_y = 2 +"ej" = ( +/obj/machinery/porta_turret/syndicate/energy/raven{ + dir = 6 }, -/obj/item/stack/sheet/glass{ - amount = 20; - pixel_x = 2; - pixel_y = -2 +/turf/closed/wall/mineral/plastitanium, +/area/shuttle/escape) +"el" = ( +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"em" = ( +/obj/machinery/power/shuttle_engine/propulsion, +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"en" = ( +/obj/machinery/power/shuttle_engine/large, +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"eo" = ( +/obj/machinery/door/airlock/external/ruin{ + name = "Emegency Shuttle External Airlock" + }, +/obj/docking_port/mobile/emergency{ + name = "CentCom Raven Cruiser" }, -/obj/structure/table/reinforced, /turf/open/floor/plating, /area/shuttle/escape) -"dZ" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/rack, -/obj/effect/turf_decal/bot, -/obj/item/storage/box/metalfoam, -/turf/open/floor/plating, +"ep" = ( +/obj/machinery/turretid{ + desc = "Used to the Raven's automated defenses."; + icon_state = "control_kill"; + lethal = 1; + pixel_x = 5; + pixel_y = 32; + req_access = list("command") + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, /area/shuttle/escape) -"ea" = ( +"fc" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/turf_decal/bot, /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/shuttle/escape) -"eb" = ( +"fn" = ( +/obj/machinery/power/shuttle_engine/heater, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"fD" = ( /obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/bot, +/obj/machinery/space_heater, /turf/open/floor/plating, /area/shuttle/escape) -"ec" = ( +"nK" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/decal/cleanable/dirt, -/obj/machinery/power/port_gen/pacman, /obj/effect/turf_decal/bot, -/obj/structure/cable, -/turf/open/floor/plating, -/area/shuttle/escape) -"ed" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/computer/monitor{ - dir = 1 +/obj/item/stack/sheet/mineral/plastitanium{ + amount = 50; + pixel_x = -2; + pixel_y = 2 }, -/obj/structure/cable, +/obj/item/stack/sheet/iron/fifty{ + pixel_x = 4; + pixel_y = -4 + }, +/obj/structure/table/reinforced, /turf/open/floor/plating, /area/shuttle/escape) -"ee" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/turf_decal/bot, -/obj/machinery/space_heater, -/turf/open/floor/plating, +"ou" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/turf_decal/bot_white, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, /area/shuttle/escape) -"ef" = ( +"qC" = ( /obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/structure/table/reinforced, /turf/open/floor/plating, /area/shuttle/escape) -"eg" = ( +"vw" = ( /obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/rack, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/port_gen/pacman, /obj/effect/turf_decal/bot, -/obj/item/storage/box/lights/tubes, +/obj/structure/cable, /turf/open/floor/plating, /area/shuttle/escape) -"eh" = ( -/obj/structure/window/reinforced/spawner/directional/south, +"zT" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/turf_decal/bot_white, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/bot, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/structure/table/reinforced, -/turf/open/floor/plating, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"Ds" = ( +/obj/machinery/button/door{ + id = "escape_cockpit_blast"; + name = "Cockpit Airlock Blast Doors"; + pixel_y = -26; + req_access = list("command") + }, +/obj/effect/turf_decal/raven/two, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"Jx" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/iron/dark, /area/shuttle/escape) -"ei" = ( +"Ls" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, @@ -1618,51 +1577,84 @@ /obj/item/multitool, /turf/open/floor/plating, /area/shuttle/escape) -"ej" = ( -/obj/machinery/porta_turret/syndicate/energy/raven{ - dir = 6 +"Mm" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/turf_decal/bot, +/obj/item/stack/sheet/plastitaniumglass{ + amount = 20; + pixel_x = -2; + pixel_y = 2 }, -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/escape) -"ek" = ( -/obj/machinery/power/shuttle_engine/heater, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/plating/airless, +/obj/item/stack/sheet/glass{ + amount = 20; + pixel_x = 2; + pixel_y = -2 + }, +/obj/structure/table/reinforced, +/turf/open/floor/plating, /area/shuttle/escape) -"el" = ( -/turf/open/floor/plating/airless, +"Nd" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/rack, +/obj/effect/turf_decal/bot, +/obj/item/storage/box/metalfoam, +/turf/open/floor/plating, /area/shuttle/escape) -"em" = ( -/obj/machinery/power/shuttle_engine/propulsion, -/turf/open/floor/plating/airless, +"NK" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/rack, +/obj/effect/turf_decal/bot, +/obj/item/storage/box/lights/tubes, +/turf/open/floor/plating, /area/shuttle/escape) -"en" = ( -/obj/machinery/power/shuttle_engine/large, -/turf/open/floor/plating/airless, +"Ob" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/bot, +/turf/open/floor/plating, /area/shuttle/escape) -"eo" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Emegency Shuttle External Airlock" +"Pd" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 }, -/obj/docking_port/mobile/emergency{ - name = "CentCom Raven Cruiser" +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"Rw" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/chair/comfy/shuttle{ + dir = 4 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/iron/dark, /area/shuttle/escape) -"ep" = ( -/obj/machinery/turretid{ - desc = "Used to the Raven's automated defenses."; - icon_state = "control_kill"; - lethal = 1; - pixel_x = 5; - pixel_y = 32; - req_access = list("command") +"SA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"Ub" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"ZA" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/effect/turf_decal/stripes/white/line{ dir = 1 }, +/obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) +"ZF" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plating, +/area/shuttle/escape) (1,1,1) = {" aa @@ -1786,7 +1778,7 @@ ax ax cH cJ -cO +SA ax ax cd @@ -1795,7 +1787,7 @@ ax ax dH dJ -dX +nK ax dW aa @@ -1824,12 +1816,12 @@ bP cU br dg -dp +cr dv ax dI dJ -dY +Mm ax el en @@ -1848,23 +1840,23 @@ aY bE bk bX -ci -ci -ci -ci -ci +Jx +Jx +Jx +Jx +Jx bP bP bP da dh -bP +Ub bP dA dJ dJ -dZ -ek +Nd +fn el el "} @@ -1882,11 +1874,11 @@ bv bF br bX -cj -cj -cA -cj -cj +Rw +Rw +zT +Rw +Rw bP bP cV @@ -1897,8 +1889,8 @@ dw dB dK dJ -ea -ek +fc +fn em aa "} @@ -1921,7 +1913,7 @@ bP bP bP bP -cK +bP cP ax ax @@ -1931,8 +1923,8 @@ ax ax dL dT -eb -ek +Ob +fn em aa "} @@ -1950,11 +1942,11 @@ ax ax bO bP -ci -ci -ci -ci -ci +Jx +Jx +Jx +Jx +Jx cl ax cW @@ -1965,8 +1957,8 @@ ax dC dM dD -ec -ek +vw +fn el en "} @@ -1984,11 +1976,11 @@ bx bG bP bP -cj -cj -cj -cA -cj +Rw +Rw +Rw +zT +Rw cL cQ cY @@ -2010,13 +2002,13 @@ af al at aC -aK +Ds ax bc -bm +ZA ax bH -bP +Ub bP bP bQ @@ -2052,11 +2044,11 @@ bx bI bQ bP -ck -ci -ci -ci -ci +ou +Jx +Jx +Jx +Jx cM cS dl @@ -2086,11 +2078,11 @@ ax ax bR bP -cj -cj -cj -cj -cj +Rw +Rw +Rw +Rw +Rw ch ax cZ @@ -2101,8 +2093,8 @@ ax dC dP dD -ec -ek +vw +fn el el "} @@ -2125,7 +2117,7 @@ bP bP bP bP -cK +bP cP ax ax @@ -2135,8 +2127,8 @@ ax ax dL dJ -ee -ek +fD +fn em aa "} @@ -2154,11 +2146,11 @@ bz bJ br bZ -ci -ci -ci -ci -ck +Jx +Jx +Jx +Jx +ou bP bP bO @@ -2169,8 +2161,8 @@ dx dB dK dJ -ef -ek +ZF +fn em aa "} @@ -2188,23 +2180,23 @@ bf bK bT ca -cj -cj -cj -cj -cj +Rw +Rw +Rw +Rw +Rw bP bP bP de dn -bP +Ub bP dA dJ dJ -eg -ek +NK +fn el en "} @@ -2232,12 +2224,12 @@ bP cU br do -dt +cs dy ax dQ dT -eh +qC ax el el @@ -2262,7 +2254,7 @@ ax ax cI cN -cN +Pd ax ax cd @@ -2271,7 +2263,7 @@ ax ax dR dJ -ei +Ls ax ej aa diff --git a/_maps/shuttles/emergency_russiafightpit.dmm b/_maps/shuttles/emergency_russiafightpit.dmm index 8df4602fe42a6..6d8a0e5e8fbcc 100644 --- a/_maps/shuttles/emergency_russiafightpit.dmm +++ b/_maps/shuttles/emergency_russiafightpit.dmm @@ -135,10 +135,6 @@ "ax" = ( /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape) -"ay" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/engine, -/area/shuttle/escape) "az" = ( /obj/item/tank/internals/oxygen, /turf/open/floor/engine, @@ -161,13 +157,6 @@ "aE" = ( /turf/closed/wall/r_wall/rust, /area/shuttle/escape) -"aF" = ( -/obj/machinery/flasher/directional/west{ - id = "shuttle_flasher" - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "aG" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/mineral/plastitanium/red, @@ -206,7 +195,7 @@ /area/shuttle/escape) "aN" = ( /obj/effect/decal/cleanable/blood/old, -/mob/living/simple_animal/hostile/bear/fightpit, +/mob/living/basic/bear/fightpit, /turf/open/floor/engine, /area/shuttle/escape) "aO" = ( @@ -230,11 +219,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape) -"aS" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine, -/area/shuttle/escape) "aT" = ( /obj/effect/decal/cleanable/vomit/old, /turf/open/floor/engine, @@ -248,7 +232,7 @@ /area/shuttle/escape) "aV" = ( /obj/item/kitchen/fork, -/mob/living/simple_animal/hostile/bear/fightpit, +/mob/living/basic/bear/fightpit, /turf/open/floor/engine, /area/shuttle/escape) "aW" = ( @@ -264,11 +248,6 @@ /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape) -"aY" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/engine, -/area/shuttle/escape) "aZ" = ( /obj/effect/decal/cleanable/shreds, /obj/machinery/door/window{ @@ -276,48 +255,11 @@ }, /turf/open/floor/engine, /area/shuttle/escape) -"ba" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/engine, -/area/shuttle/escape) -"bb" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/engine, -/area/shuttle/escape) -"bc" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/escape) -"bd" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/escape) "be" = ( /obj/structure/table, /obj/item/reagent_containers/cup/glass/bottle/vodka, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) -"bf" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/escape) -"bg" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/escape) "bh" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -401,6 +343,11 @@ }, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) +"bv" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/engine, +/area/shuttle/escape) "bw" = ( /obj/machinery/door/airlock/security/glass{ name = "Emergency Shuttle Infirmary" @@ -427,18 +374,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/shuttle/escape) -"bC" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/obj/effect/decal/cleanable/blood/old, -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/shuttle/escape) -"bD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/stasis, -/turf/open/floor/iron, -/area/shuttle/escape) "bF" = ( /obj/structure/table, /obj/item/storage/medkit/brute, @@ -473,23 +408,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/shuttle/escape) -"bK" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/power/shuttle_engine/heater, -/turf/open/floor/plating/airless, -/area/shuttle/escape) "bL" = ( /obj/machinery/power/shuttle_engine/propulsion, /turf/open/floor/plating/airless, /area/shuttle/escape) -"bM" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/engine, -/area/shuttle/escape) -"bN" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape) "bO" = ( /obj/structure/chair/comfy/shuttle{ dir = 4 @@ -502,11 +424,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) -"bQ" = ( -/obj/machinery/light/directional/south, -/obj/machinery/status_display/evac/directional/south, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape) "bR" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/plating, @@ -521,10 +438,62 @@ "iJ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, -/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/item/surgery_tray/full, /obj/item/clothing/gloves/fingerless, /turf/open/floor/iron, /area/shuttle/escape) +"jL" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"jR" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/engine, +/area/shuttle/escape) +"jW" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"kk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/stasis, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/shuttle/escape) +"km" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"lx" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/shuttle/escape) +"lI" = ( +/obj/machinery/light/small/red/directional/east, +/turf/open/floor/engine, +/area/shuttle/escape) +"nQ" = ( +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"wo" = ( +/obj/effect/decal/cleanable/blood/old, +/mob/living/basic/bear/fightpit, +/obj/machinery/light/small/red/dim/directional/east, +/turf/open/floor/engine, +/area/shuttle/escape) "wq" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/optable, @@ -538,11 +507,62 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) +"AM" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/engine, +/area/shuttle/escape) "Jl" = ( /obj/structure/chair/comfy/shuttle, /obj/machinery/status_display/evac/directional/north, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) +"Jo" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/engine, +/area/shuttle/escape) +"KE" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/power/shuttle_engine/heater, +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"Mv" = ( +/obj/machinery/flasher/directional/west{ + id = "shuttle_flasher" + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"Ol" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/engine, +/area/shuttle/escape) +"Pf" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"Vb" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"VJ" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"Yy" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"YM" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/machinery/light/small/red/directional/north, +/turf/open/floor/engine, +/area/shuttle/escape) (1,1,1) = {" aa @@ -575,11 +595,11 @@ aa aa ab wM -aF +Mv aH ad ax -aJ +bO aJ aJ aJ @@ -600,7 +620,7 @@ aa ad Jl aG -aP +Yy ad aX ax @@ -626,12 +646,12 @@ av aH aP ab -ax -bc -bc -bc -bc -bc +Pf +Vb +Vb +Vb +Vb +Vb aR bu bx @@ -650,18 +670,18 @@ ac aI ac ad -bN -bd -bd -bd -bd -bd +ax +km +km +km +km +km ax ad bR by bH -bK +KE bL "} (6,1,1) = {" @@ -685,7 +705,7 @@ ab by bx bI -bK +KE bL "} (7,1,1) = {" @@ -701,15 +721,15 @@ aJ aJ be ax -bc -bc -bc +Vb +Vb +Vb ax ab bz bx bI -bK +KE bL "} (8,1,1) = {" @@ -718,22 +738,22 @@ ag ak ap ab -ay -ay -ay -aS -aY -bf +YM +Ol +Ol +jR +bv +jW ax ax ax ax -bQ +nQ ab ad ad ad -bK +KE bL "} (9,1,1) = {" @@ -752,12 +772,12 @@ ax bl ax ax -ax +VJ ad bA gn bA -bK +KE bL "} (10,1,1) = {" @@ -770,8 +790,8 @@ aA aL aB aK -ba -bg +Jo +jL ax ax ax @@ -781,7 +801,7 @@ ac bB bB bJ -bK +KE bL "} (11,1,1) = {" @@ -794,7 +814,7 @@ aB aA aA aT -bb +AM bh ax bm @@ -805,7 +825,7 @@ bw bB bB bF -bK +KE bL "} (12,1,1) = {" @@ -816,9 +836,9 @@ ad ad aC aK -bM +lI aQ -ba +Jo bh ax bn @@ -828,7 +848,7 @@ ax ac bB bB -bD +kk ad ad "} @@ -850,7 +870,7 @@ ax ax ax ad -bC +lx iJ ad ad @@ -864,7 +884,7 @@ aa ab aE aN -aN +wo aV aD bi diff --git a/_maps/shuttles/emergency_scrapheap.dmm b/_maps/shuttles/emergency_scrapheap.dmm index 5cea443cb7c86..f3ec65b178e2d 100644 --- a/_maps/shuttles/emergency_scrapheap.dmm +++ b/_maps/shuttles/emergency_scrapheap.dmm @@ -12,10 +12,6 @@ "ad" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/escape) -"ae" = ( -/obj/structure/table/wood, -/turf/open/floor/carpet, -/area/shuttle/escape) "af" = ( /obj/structure/chair/comfy/brown{ dir = 1 @@ -26,11 +22,6 @@ /obj/machinery/computer/emergency_shuttle, /turf/open/floor/carpet, /area/shuttle/escape) -"ah" = ( -/obj/structure/table/wood, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/carpet, -/area/shuttle/escape) "ai" = ( /obj/machinery/computer/atmos_alert{ dir = 4 @@ -46,14 +37,6 @@ "ak" = ( /turf/open/floor/carpet, /area/shuttle/escape) -"al" = ( -/obj/structure/chair/comfy/brown{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/carpet, -/area/shuttle/escape) "am" = ( /obj/machinery/computer/crew{ dir = 4 @@ -64,19 +47,6 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/carpet, /area/shuttle/escape) -"ao" = ( -/obj/machinery/button/flasher{ - id = "cockpit_flasher"; - pixel_y = -24 - }, -/obj/structure/table/wood/poker, -/obj/machinery/light/directional/south, -/turf/open/floor/carpet, -/area/shuttle/escape) -"ap" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/carpet, -/area/shuttle/escape) "aq" = ( /obj/machinery/door/airlock/titanium{ name = "Emergency Shuttle Airlock" @@ -115,18 +85,6 @@ "aw" = ( /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"ax" = ( -/obj/machinery/flasher/directional/west{ - id = "shuttle_flasher" - }, -/obj/machinery/button/flasher{ - id = "shuttle_flasher"; - pixel_x = -24; - pixel_y = -6 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "ay" = ( /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) @@ -178,15 +136,6 @@ /obj/item/storage/medkit/regular, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"aI" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) -"aJ" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) "aK" = ( /obj/machinery/door/airlock/titanium{ name = "Emergency Shuttle Airlock" @@ -202,13 +151,6 @@ }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"aM" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "aN" = ( /obj/structure/table/wood, /obj/item/toy/cards/deck/cas/black, @@ -248,15 +190,6 @@ "aU" = ( /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"aV" = ( -/obj/structure/table, -/obj/machinery/recharger, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) -"aW" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "aX" = ( /turf/open/floor/iron/grimy, /area/shuttle/escape) @@ -277,13 +210,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/shuttle/escape) -"bb" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/barricade/wooden, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/shuttle/escape) "bd" = ( /obj/machinery/door/airlock{ name = "Unisex Restrooms" @@ -328,26 +254,10 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/freezer, /area/shuttle/escape) -"bl" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/power/shuttle_engine/heater, -/turf/open/floor/plating/airless, -/area/shuttle/escape) -"bm" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/power/shuttle_engine/heater, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/plating/airless, -/area/shuttle/escape) "bn" = ( /obj/machinery/power/shuttle_engine/propulsion, /turf/open/floor/plating/airless, /area/shuttle/escape) -"bo" = ( -/obj/structure/chair/comfy/shuttle, -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "bp" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -355,11 +265,107 @@ /obj/machinery/light/directional/north, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) +"gx" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"kF" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"mt" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"mv" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"sK" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/power/shuttle_engine/heater, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"zd" = ( +/obj/machinery/button/flasher{ + id = "cockpit_flasher"; + pixel_y = -24 + }, +/obj/structure/table/wood/poker, +/turf/open/floor/carpet, +/area/shuttle/escape) +"zh" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green, +/turf/open/floor/carpet, +/area/shuttle/escape) +"CH" = ( +/obj/structure/table, +/obj/machinery/recharger, +/obj/machinery/light/small/directional/south, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) "Fs" = ( /obj/machinery/status_display/evac/directional/south, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/shuttle/escape) +"GX" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/barricade/wooden, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/shuttle/escape) +"Ka" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"QW" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/carpet, +/area/shuttle/escape) +"Rl" = ( +/obj/structure/table/wood, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/carpet, +/area/shuttle/escape) +"RF" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"Tm" = ( +/obj/machinery/flasher/directional/west{ + id = "shuttle_flasher" + }, +/obj/machinery/button/flasher{ + id = "shuttle_flasher"; + pixel_x = -24; + pixel_y = -6 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"Ty" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/carpet, +/area/shuttle/escape) +"Xo" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/power/shuttle_engine/heater, +/turf/open/floor/plating/airless, +/area/shuttle/escape) (1,1,1) = {" aa @@ -392,7 +398,7 @@ ab ab ac ac -ax +Tm aD ab bp @@ -417,7 +423,7 @@ am aq at ay -aE +Ka ab aL ac @@ -430,12 +436,12 @@ ab be ab ab -bl +Xo bn "} (4,1,1) = {" ac -ae +zh aj ak ac @@ -454,7 +460,7 @@ ab bf bh bj -bl +Xo bn "} (5,1,1) = {" @@ -478,19 +484,19 @@ ab be ab ab -bl +Xo bn "} (6,1,1) = {" ac ag ak -ao +zd ab au aA aF -aw +RF aw aw aw @@ -502,14 +508,14 @@ bd be bi bk -bl +Xo bn "} (7,1,1) = {" ac af ak -ap +Ty ar av ac @@ -521,23 +527,23 @@ aG aw aL ac -bb +GX ad ab ab ab -bm +sK bn "} (8,1,1) = {" ac -ah -al +Rl +QW aa ac ac aB -bo +aG aw aL ac @@ -591,7 +597,7 @@ aL ac aG aw -aV +CH ab aa aa @@ -609,13 +615,13 @@ aa aa aa ab -aI -aJ -aM -aM -aM -aJ -aW +kF +gx +mv +mv +mv +gx +mt ab aa aa diff --git a/_maps/shuttles/emergency_shadow.dmm b/_maps/shuttles/emergency_shadow.dmm index 387b4cdd7828e..15593e7e95661 100644 --- a/_maps/shuttles/emergency_shadow.dmm +++ b/_maps/shuttles/emergency_shadow.dmm @@ -17,12 +17,6 @@ }, /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape) -"at" = ( -/obj/effect/turf_decal/trimline/blue/corner, -/obj/structure/sign/departments/medbay/alt/directional/east, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/escape) "aK" = ( /obj/structure/rack, /obj/item/storage/toolbox/electrical{ @@ -42,12 +36,6 @@ /obj/machinery/status_display/evac/directional/east, /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape) -"bg" = ( -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/siding/dark, -/obj/machinery/light/directional/south, -/turf/open/floor/eighties, -/area/shuttle/escape) "bA" = ( /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /turf/open/floor/iron/dark/smooth_large, @@ -59,6 +47,18 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape) +"bH" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/item/reagent_containers/cup/glass/trophy/gold_cup{ + pixel_x = 16; + pixel_y = 2 + }, +/obj/item/clothing/accessory/medal/gold, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark/smooth_large, +/area/shuttle/escape) "bT" = ( /obj/effect/mob_spawn/corpse/human/clown, /turf/open/floor/engine/plasma, @@ -102,26 +102,9 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating/airless, /area/shuttle/escape/engine) -"da" = ( -/obj/machinery/recharge_station, -/obj/machinery/status_display/evac/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/escape/engine) "dw" = ( /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape) -"dW" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/machinery/door/window/brigdoor/right, -/obj/effect/turf_decal/siding/dark{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/eighties, -/area/shuttle/escape) "ee" = ( /obj/machinery/door/airlock/medical/glass{ name = "Escape Shuttle Infirmary" @@ -129,6 +112,21 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape) +"eJ" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/delivery, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/escape/engine) +"fb" = ( +/obj/machinery/atmospherics/pipe/smart/simple/violet/hidden{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/red/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark/small, +/area/shuttle/escape/engine) "fh" = ( /obj/structure/table, /turf/open/floor/iron/dark/smooth_large, @@ -154,29 +152,10 @@ }, /turf/open/floor/plating/airless, /area/shuttle/escape/engine) -"fI" = ( -/obj/machinery/atmospherics/pipe/smart/simple/violet/hidden{ - dir = 10 - }, -/obj/effect/turf_decal/stripes/red/corner, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/small, -/area/shuttle/escape/engine) -"fO" = ( -/obj/effect/turf_decal/trimline/yellow/corner{ - dir = 1 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 4 - }, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/structure/sign/warning/hot_temp/directional/west, -/obj/item/reagent_containers/pill/maintenance, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/escape) +"gF" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/smooth_large, +/area/shuttle/escape/brig) "gG" = ( /obj/structure/table, /obj/machinery/coffeemaker, @@ -185,42 +164,21 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape) -"gH" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/item/reagent_containers/cup/glass/trophy/gold_cup{ - pixel_x = 16; - pixel_y = 2 - }, -/obj/item/clothing/accessory/medal/gold, -/obj/structure/table/reinforced/plastitaniumglass, -/obj/effect/turf_decal/tile/dark_blue/opposingcorners, -/turf/open/floor/iron/dark/smooth_large, -/area/shuttle/escape) "hm" = ( /obj/structure/extinguisher_cabinet/directional/north, /obj/effect/turf_decal/trimline/neutral/line, /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape) -"hH" = ( -/obj/effect/turf_decal/trimline/dark_blue/corner, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 8 - }, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/item/clothing/head/cone, +"hz" = ( +/obj/structure/tank_dispenser/oxygen, +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/escape/engine) +"ig" = ( +/obj/machinery/light/floor, /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape) -"hZ" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/red/opposingcorners, -/turf/open/floor/iron/dark, -/area/shuttle/escape/brig) "ix" = ( /obj/effect/turf_decal/siding/dark{ dir = 6 @@ -242,11 +200,6 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape) -"js" = ( -/obj/structure/sign/poster/official/there_is_no_gas_giant/directional/west, -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/iron/dark/small, -/area/shuttle/escape/engine) "jB" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 4 @@ -291,6 +244,29 @@ /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape) +"lw" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/glass/drinkingglass{ + pixel_x = -6; + pixel_y = 14 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass{ + pixel_x = -6; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass{ + pixel_x = 7; + pixel_y = 14 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/smooth_large, +/area/shuttle/escape) "lD" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -322,14 +298,6 @@ /obj/machinery/stasis, /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape) -"np" = ( -/obj/effect/turf_decal/siding/dark{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/etherealball, -/turf/open/floor/eighties, -/area/shuttle/escape) "nq" = ( /obj/effect/turf_decal/trimline/red/line{ dir = 4 @@ -367,6 +335,17 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape) +"pi" = ( +/obj/effect/turf_decal/trimline/dark_blue/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 8 + }, +/obj/item/kirbyplants/organic/plant21, +/obj/item/clothing/accessory/clown_enjoyer_pin, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/escape) "qk" = ( /obj/machinery/shower/directional/south, /obj/structure/curtain, @@ -383,6 +362,16 @@ }, /turf/open/floor/eighties, /area/shuttle/escape) +"qr" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/etherealball{ + TurnedOn = 1 + }, +/turf/open/floor/eighties, +/area/shuttle/escape) "rg" = ( /obj/effect/turf_decal/siding/dark{ dir = 9 @@ -400,12 +389,6 @@ /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape) -"rU" = ( -/obj/structure/chair/comfy/shuttle, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/red/opposingcorners, -/turf/open/floor/iron/dark, -/area/shuttle/escape/brig) "sd" = ( /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape/brig) @@ -433,6 +416,12 @@ }, /turf/open/floor/catwalk_floor, /area/shuttle/escape/engine) +"vv" = ( +/obj/machinery/light/directional/west, +/obj/structure/sign/poster/official/there_is_no_gas_giant/directional/west, +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/iron/dark/small, +/area/shuttle/escape/engine) "vw" = ( /obj/machinery/atmospherics/pipe/smart/manifold/violet/hidden{ dir = 4 @@ -470,24 +459,25 @@ }, /turf/open/floor/iron/dark/small, /area/shuttle/escape/engine) -"xl" = ( -/obj/effect/turf_decal/trimline/red/corner{ +"xy" = ( +/obj/effect/turf_decal/trimline/yellow/corner{ dir = 8 }, -/obj/structure/sign/departments/security/directional/west, -/obj/machinery/light/directional/west, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 4 + }, +/obj/item/kirbyplants/organic/plant21, +/obj/structure/sign/warning/hot_temp/directional/west, +/obj/item/clothing/mask/cigarette/rollie/cannabis, /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape) -"yP" = ( -/obj/machinery/atmospherics/pipe/smart/simple/violet/hidden{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/red/corner{ - dir = 4 +"yg" = ( +/obj/effect/turf_decal/trimline/red/corner{ + dir = 1 }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark/small, -/area/shuttle/escape/engine) +/obj/structure/sign/departments/security/directional/west, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/escape) "yQ" = ( /obj/effect/turf_decal/trimline/blue/line{ dir = 4 @@ -518,6 +508,15 @@ }, /turf/open/floor/plating/airless, /area/shuttle/escape/engine) +"zF" = ( +/obj/effect/turf_decal/trimline/dark_blue/corner, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 8 + }, +/obj/item/kirbyplants/organic/plant21, +/obj/item/clothing/head/cone, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/escape) "zI" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -661,14 +660,6 @@ /obj/machinery/status_display/evac/directional/east, /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape) -"Et" = ( -/obj/effect/turf_decal/trimline/red/corner{ - dir = 1 - }, -/obj/structure/sign/departments/security/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/escape) "EM" = ( /obj/machinery/door/firedoor/border_only{ dir = 8 @@ -685,11 +676,6 @@ /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape) -"Fq" = ( -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/escape/engine) "Fu" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/plasma_output{ dir = 8; @@ -731,21 +717,6 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape) -"Gt" = ( -/obj/effect/turf_decal/trimline/yellow/corner{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 4 - }, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/structure/sign/warning/hot_temp/directional/west, -/obj/item/clothing/mask/cigarette/rollie/cannabis, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/escape) "Gx" = ( /obj/structure/extinguisher_cabinet/directional/south, /obj/effect/turf_decal/tile/blue/opposingcorners, @@ -782,10 +753,9 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape) -"Hd" = ( -/obj/structure/tank_dispenser/oxygen, -/obj/machinery/status_display/evac/directional/north, -/obj/machinery/light/directional/north, +"GR" = ( +/obj/machinery/recharge_station, +/obj/machinery/status_display/evac/directional/south, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape/engine) @@ -803,15 +773,6 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape/engine) -"Hx" = ( -/obj/structure/table, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/item/lazarus_injector, -/obj/machinery/light/directional/south, -/obj/item/healthanalyzer, -/obj/effect/turf_decal/tile/blue/opposingcorners, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "HB" = ( /obj/effect/turf_decal/trimline/dark_blue/line{ dir = 4 @@ -899,19 +860,6 @@ /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape) -"MC" = ( -/obj/structure/table, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/item/storage/backpack/duffelbag/med/surgery, -/obj/machinery/light/directional/north, -/obj/item/clothing/suit/apron/surgical, -/obj/item/clothing/mask/surgical, -/obj/item/clothing/gloves/latex/nitrile{ - pixel_y = 4 - }, -/obj/effect/turf_decal/tile/blue/opposingcorners, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "MP" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -921,6 +869,13 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape) +"MT" = ( +/obj/machinery/atmospherics/pipe/smart/simple/violet/hidden{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/red/corner, +/turf/open/floor/iron/dark/small, +/area/shuttle/escape/engine) "Ns" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -937,6 +892,18 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape/brig) +"Oe" = ( +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 4 + }, +/obj/item/kirbyplants/organic/plant21, +/obj/structure/sign/warning/hot_temp/directional/west, +/obj/item/reagent_containers/pill/maintenance, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/escape) "Oi" = ( /turf/open/floor/engine/plasma, /area/shuttle/escape/engine) @@ -1012,6 +979,13 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape) +"RL" = ( +/obj/effect/turf_decal/trimline/red/corner{ + dir = 8 + }, +/obj/structure/sign/departments/security/directional/west, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/escape) "RS" = ( /obj/effect/turf_decal/siding/dark, /turf/open/floor/eighties, @@ -1023,29 +997,40 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape) +"Sb" = ( +/obj/structure/table, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/item/surgery_tray/full, +/obj/item/clothing/suit/apron/surgical, +/obj/item/clothing/mask/surgical, +/obj/item/clothing/gloves/latex/nitrile{ + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"So" = ( +/obj/structure/table, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/item/lazarus_injector, +/obj/item/healthanalyzer, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/shuttle/escape) "Tl" = ( /obj/machinery/vending/boozeomat, /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape) -"Tz" = ( -/obj/effect/turf_decal/trimline/blue/corner{ - dir = 4 +"TW" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/machinery/door/window/brigdoor/right, +/obj/effect/turf_decal/siding/dark{ + dir = 1 }, -/obj/structure/sign/departments/medbay/alt/directional/east, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark/textured_large, +/turf/open/floor/eighties, /area/shuttle/escape) -"Ug" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark/small, -/area/shuttle/escape/engine) "Uk" = ( /obj/effect/turf_decal/trimline/neutral/line, /obj/machinery/newscaster/directional/north, @@ -1104,6 +1089,10 @@ /obj/machinery/door/firedoor/heavy, /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape/engine) +"WQ" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/smooth_large, +/area/shuttle/escape) "WW" = ( /obj/effect/turf_decal/trimline/blue/corner{ dir = 1 @@ -1114,24 +1103,27 @@ "XA" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/shuttle/escape) +"XG" = ( +/obj/effect/turf_decal/trimline/blue/corner, +/obj/structure/sign/departments/medbay/alt/directional/east, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/escape) "XW" = ( /obj/effect/turf_decal/trimline/red/line{ dir = 8 }, /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape) -"YM" = ( -/obj/effect/turf_decal/trimline/dark_blue/corner{ +"Yc" = ( +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/siding/dark, +/turf/open/floor/eighties, +/area/shuttle/escape) +"YL" = ( +/obj/effect/turf_decal/trimline/blue/corner{ dir = 4 }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 8 - }, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/item/clothing/accessory/clown_enjoyer_pin, +/obj/structure/sign/departments/medbay/alt/directional/east, /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape) "YP" = ( @@ -1146,28 +1138,6 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) -"Zg" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/glass/drinkingglass{ - pixel_x = -6; - pixel_y = 14 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass{ - pixel_x = -6; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass{ - pixel_x = 7; - pixel_y = 14 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/dark_blue/opposingcorners, -/turf/open/floor/iron/dark/smooth_large, -/area/shuttle/escape) "Zk" = ( /obj/structure/table, /obj/item/storage/box/handcuffs{ @@ -1237,7 +1207,7 @@ cH uW uW jB -js +vv ow uW uW @@ -1249,13 +1219,13 @@ Cw Cw cH rj -fI +MT vw vw LA vw vw -yP +fb rj cH Cw @@ -1322,7 +1292,7 @@ Qd "} (9,1,1) = {" cH -Hd +hz OL Bu cX @@ -1332,22 +1302,22 @@ cX cX wF OL -da +GR cH "} (10,1,1) = {" Qd -Fq +eJ OL wz EM EM -Ug +EM EM EM nQ OL -Fq +eJ Qd "} (11,1,1) = {" @@ -1367,7 +1337,7 @@ cH "} (12,1,1) = {" US -Gt +xy Dq cV ZM @@ -1377,7 +1347,7 @@ ZM ZM cV QM -fO +Oe US "} (13,1,1) = {" @@ -1445,11 +1415,11 @@ PX AA Rk vU -rU +kx sd BJ sd -hZ +uF vU Uk MP @@ -1462,7 +1432,7 @@ Wc vU IG sd -sd +gF sd GC vU @@ -1504,13 +1474,13 @@ vU US FW Wc -xl +RL XW XW XW XW XW -Et +yg AS Dz US @@ -1520,11 +1490,11 @@ vU gG Wc VR -VR +ig VR RV VR -VR +ig VR AS jl @@ -1534,13 +1504,13 @@ US US cF Wc -at +XG yQ yQ yQ yQ yQ -Tz +YL AS cv US @@ -1582,7 +1552,7 @@ Wc vU qk dw -dw +WQ dw FT vU @@ -1595,11 +1565,11 @@ PX AA Rk vU -MC +Sb dw oK dw -Hx +So vU Uk MP @@ -1667,7 +1637,7 @@ US "} (32,1,1) = {" US -hH +zF ao mj mj @@ -1677,7 +1647,7 @@ Kk mj mj HB -YM +pi US "} (33,1,1) = {" @@ -1698,7 +1668,7 @@ vU (34,1,1) = {" Cw vU -Zg +lw rg Fz qo @@ -1706,7 +1676,7 @@ BB GB Fz Zq -gH +bH vU Cw "} @@ -1729,13 +1699,13 @@ Cw Cw vU XA -dW +TW Wa Wa Wa Wa Wa -bg +Yc XA vU Cw @@ -1747,7 +1717,7 @@ US af Ch jS -np +qr BR Ch ix diff --git a/_maps/shuttles/emergency_supermatter.dmm b/_maps/shuttles/emergency_supermatter.dmm index f0c790575a9d5..ca1b7ea0d272c 100644 --- a/_maps/shuttles/emergency_supermatter.dmm +++ b/_maps/shuttles/emergency_supermatter.dmm @@ -264,7 +264,7 @@ anchored = 1 }, /obj/item/clothing/glasses/meson/engine, -/obj/machinery/light/directional/west, +/obj/machinery/light/small/directional/east, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "bj" = ( @@ -272,21 +272,21 @@ anchored = 1 }, /obj/item/clothing/glasses/meson/engine, -/obj/machinery/light/directional/east, +/obj/machinery/light/small/directional/west, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "bk" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/light/directional/west, +/obj/machinery/light/warm/directional/west, /turf/open/floor/plating, /area/shuttle/escape) "bl" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/light/directional/east, +/obj/machinery/light/warm/directional/east, /turf/open/floor/plating, /area/shuttle/escape) "hD" = ( @@ -370,9 +370,9 @@ be "} (3,1,1) = {" ac +bj ag ag -bi Bi ag ag @@ -514,9 +514,9 @@ aa "} (9,1,1) = {" ac +bi ag ag -bj pb ag ag diff --git a/_maps/shuttles/emergency_tram.dmm b/_maps/shuttles/emergency_tram.dmm index a2252beabb5e2..5ec40d242d670 100644 --- a/_maps/shuttles/emergency_tram.dmm +++ b/_maps/shuttles/emergency_tram.dmm @@ -51,29 +51,12 @@ "ak" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/escape) -"al" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/mineral/titanium/tiled/white, -/area/shuttle/escape) "am" = ( /turf/open/floor/mineral/titanium/tiled, /area/shuttle/escape) "an" = ( /turf/open/floor/mineral/titanium/tiled/blue, /area/shuttle/escape) -"ao" = ( -/obj/machinery/light/directional/east, -/obj/machinery/camera/autoname{ - dir = 4 - }, -/turf/open/floor/mineral/titanium/tiled/white, -/area/shuttle/escape) -"ap" = ( -/obj/machinery/computer/crew{ - dir = 4 - }, -/turf/open/floor/mineral/titanium/tiled/white, -/area/shuttle/escape) "aq" = ( /obj/structure/chair/comfy/shuttle{ dir = 8 @@ -86,12 +69,6 @@ }, /turf/open/floor/mineral/titanium/tiled/white, /area/shuttle/escape) -"as" = ( -/obj/machinery/computer/security{ - dir = 8 - }, -/turf/open/floor/mineral/titanium/tiled/white, -/area/shuttle/escape) "at" = ( /obj/machinery/computer/crew{ dir = 4 @@ -113,11 +90,6 @@ /obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) -"ax" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/machinery/light/small/directional/north, -/turf/open/floor/glass/reinforced, -/area/shuttle/escape) "ay" = ( /obj/machinery/button/flasher{ id = "cockpit_flasher"; @@ -128,12 +100,6 @@ "az" = ( /turf/open/floor/glass/reinforced, /area/shuttle/escape) -"aA" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/closet/emcloset, -/obj/machinery/light/small/directional/north, -/turf/open/floor/glass/reinforced, -/area/shuttle/escape) "aB" = ( /obj/structure/chair/comfy/shuttle, /obj/structure/reagent_dispensers/wall/peppertank/directional/north, @@ -158,25 +124,6 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"aG" = ( -/obj/item/radio/intercom/directional/north, -/obj/machinery/camera/autoname{ - dir = 6 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) -"aH" = ( -/obj/machinery/light/directional/west, -/obj/machinery/button/flasher{ - id = "shuttle_flasher"; - pixel_x = -24; - pixel_y = -6 - }, -/obj/machinery/flasher/directional/west{ - id = "shuttle_flasher" - }, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "aI" = ( /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) @@ -208,12 +155,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"aN" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "aO" = ( /turf/closed/wall/mineral/titanium/interior, /area/shuttle/escape) @@ -246,9 +187,6 @@ }, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) -"aU" = ( -/turf/open/openspace/airless, -/area/template_noop) "aV" = ( /obj/machinery/light/directional/east, /obj/item/radio/intercom/directional/north, @@ -265,7 +203,7 @@ /area/shuttle/escape) "aX" = ( /obj/structure/table/optable, -/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/item/surgery_tray/full, /obj/item/clothing/mask/surgical, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) @@ -363,25 +301,33 @@ /obj/machinery/power/shuttle_engine/propulsion, /turf/open/floor/plating/airless, /area/shuttle/escape) -"bj" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/light/small/directional/north, -/turf/open/floor/glass/reinforced, -/area/shuttle/escape) "bk" = ( /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/glass/reinforced, /area/shuttle/escape) -"bl" = ( +"eV" = ( +/obj/machinery/camera/autoname, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) +"hf" = ( +/obj/machinery/light/floor, +/turf/open/floor/mineral/titanium/tiled/blue, +/area/shuttle/escape) +"jl" = ( +/obj/machinery/computer/security{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/mineral/titanium/tiled/white, +/area/shuttle/escape) +"se" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/light/small/directional/north, /turf/open/floor/glass/reinforced, /area/shuttle/escape) -"eV" = ( -/obj/machinery/camera/autoname, -/turf/open/floor/mineral/titanium/white, +"ue" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/glass/reinforced, /area/shuttle/escape) "uu" = ( /obj/structure/chair/comfy/shuttle{ @@ -390,6 +336,29 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/floor/mineral/titanium/tiled/blue, /area/shuttle/escape) +"vi" = ( +/obj/machinery/button/flasher{ + id = "shuttle_flasher"; + pixel_x = -24; + pixel_y = -6 + }, +/obj/machinery/flasher/directional/west{ + id = "shuttle_flasher" + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"Bv" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/closet/emcloset, +/turf/open/floor/glass/reinforced, +/area/shuttle/escape) +"Ca" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) "Ej" = ( /obj/structure/chair/comfy/shuttle{ dir = 8 @@ -397,6 +366,31 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/floor/mineral/titanium/tiled/white, /area/shuttle/escape) +"Kb" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/glass/reinforced, +/area/shuttle/escape) +"Kv" = ( +/obj/machinery/computer/crew{ + dir = 4 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/mineral/titanium/tiled/white, +/area/shuttle/escape) +"Pk" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/mineral/titanium/tiled/blue, +/area/shuttle/escape) +"Rl" = ( +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/tiled/white, +/area/shuttle/escape) "WP" = ( /obj/structure/chair/comfy/shuttle{ dir = 4 @@ -426,7 +420,7 @@ ak aQ ak aj -aU +aa aj ak aW @@ -435,7 +429,7 @@ aW ak ak aj -aU +aa aj ak ak @@ -448,19 +442,19 @@ aa ab ab ak -ap +Kv at ak aa ak aB -aH +vi aI aO aE -aS +Pk ak -aU +aa ak aE aE @@ -469,7 +463,7 @@ aE aE aP ak -aU +aa ak aX bc @@ -481,20 +475,20 @@ bi ab ab af -al +af aq Ej ak -ax +ue ak aC aI -aN +Ca aO aR uu ak -ax +ue ak aF aK @@ -503,13 +497,13 @@ aK aK WZ ak -ax +ue ak aY aZ eV ak -bj +Kb "} (4,1,1) = {" ab @@ -549,7 +543,7 @@ bk ab ad ah -an +hf an an aw @@ -558,7 +552,7 @@ aw aD aE aE -aP +aE aE aE aT @@ -617,11 +611,11 @@ bk ab ab af -ao +Rl ar WP ak -aA +Bv ak aF aL @@ -630,7 +624,7 @@ aL aL WZ ak -aA +Bv ak aR aL @@ -639,32 +633,32 @@ aL aL WZ ak -aA +Bv ak ba aZ aZ ak -bl +se "} (8,1,1) = {" aa ab ab ak -as +jl au ak aa ak -aG +aV aE aE aE aE aE ak -aU +aa ak aV aE @@ -673,7 +667,7 @@ aE aE aE ak -aU +aa ak bb bd @@ -698,7 +692,7 @@ ab ab ak aj -aU +aa aj ak ab @@ -707,7 +701,7 @@ ab ab ak aj -aU +aa aj ak ak diff --git a/_maps/shuttles/emergency_tranquility.dmm b/_maps/shuttles/emergency_tranquility.dmm index dec610c3a74b3..a8a933b5b702b 100644 --- a/_maps/shuttles/emergency_tranquility.dmm +++ b/_maps/shuttles/emergency_tranquility.dmm @@ -32,16 +32,6 @@ }, /turf/open/water/jungle, /area/shuttle/escape) -"ba" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/obj/item/kirbyplants{ - icon_state = "plant-22"; - pixel_x = -8 - }, -/turf/open/floor/wood, -/area/shuttle/escape) "bq" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -58,6 +48,18 @@ }, /turf/open/water/jungle, /area/shuttle/escape) +"bC" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/candle_box{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/item/lighter, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/turf/open/floor/iron/dark/herringbone, +/area/shuttle/escape) "bS" = ( /obj/structure/railing{ color = "#A47449"; @@ -124,6 +126,16 @@ /obj/structure/bookcase/random, /turf/open/floor/wood, /area/shuttle/escape) +"dB" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/structure/hedge{ + icon_state = "hedge-8" + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/shuttle/escape) "dI" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 8 @@ -208,6 +220,13 @@ }, /turf/open/floor/stone, /area/shuttle/escape) +"fs" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/machinery/light/floor, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) "fv" = ( /obj/machinery/door/airlock/engineering{ name = "Engine Room" @@ -318,10 +337,6 @@ }, /turf/open/floor/carpet/red, /area/shuttle/escape) -"hh" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/carpet/green, -/area/shuttle/escape) "hk" = ( /obj/structure/railing/corner{ dir = 4; @@ -387,6 +402,15 @@ }, /turf/open/floor/stone, /area/shuttle/escape) +"ie" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/item/kirbyplants/organic/plant22{ + pixel_x = -8 + }, +/turf/open/floor/wood, +/area/shuttle/escape) "ij" = ( /obj/structure/railing/corner{ dir = 2; @@ -446,6 +470,14 @@ }, /turf/open/floor/grass, /area/shuttle/escape) +"jp" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/stasis, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/shuttle/escape) "ju" = ( /obj/structure/table/reinforced, /obj/item/newspaper{ @@ -488,6 +520,9 @@ /obj/structure/flora/bush/style_4, /turf/open/floor/grass, /area/shuttle/escape) +"jN" = ( +/turf/open/floor/carpet/green, +/area/shuttle/escape) "kh" = ( /obj/structure/railing/corner{ dir = 2; @@ -515,18 +550,6 @@ /obj/structure/flora/bush/fullgrass/style_random, /turf/open/floor/grass, /area/shuttle/escape) -"kp" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/railing{ - color = "#A47449"; - dir = 2; - layer = 3.1 - }, -/obj/machinery/microwave, -/obj/structure/table/wood, -/obj/machinery/light/small/directional/east, -/turf/open/floor/stone, -/area/shuttle/escape) "kE" = ( /obj/machinery/door/airlock/medical/glass{ name = "Escape Shuttle Infirmary" @@ -595,34 +618,6 @@ }, /turf/open/floor/wood, /area/shuttle/escape) -"mj" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark/textured_half, -/area/shuttle/escape) -"mq" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/carpet/royalblue, -/area/shuttle/escape) -"mL" = ( -/obj/structure/table/wood, -/obj/item/storage/fancy/candle_box{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/lighter, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 8 - }, -/turf/open/floor/iron/dark/herringbone, -/area/shuttle/escape) "mQ" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/wood{ @@ -662,13 +657,11 @@ }, /turf/open/floor/wood, /area/shuttle/escape) -"ni" = ( +"nj" = ( /obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/obj/item/kirbyplants{ - icon_state = "plant-03" + dir = 9 }, +/obj/item/kirbyplants/organic/plant21, /turf/open/floor/wood, /area/shuttle/escape) "nq" = ( @@ -722,21 +715,9 @@ /obj/structure/flora/bush/flowers_pp, /turf/open/floor/grass, /area/shuttle/escape) -"nM" = ( -/obj/structure/table, -/obj/machinery/recharger{ - pixel_x = -7; - pixel_y = 4 - }, -/obj/machinery/recharger{ - pixel_x = 7; - pixel_y = 4 - }, -/obj/item/storage/box/handcuffs{ - pixel_y = 2 - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark/textured_half, +"nQ" = ( +/mob/living/simple_animal/bot/hygienebot, +/turf/open/floor/wood, /area/shuttle/escape) "nV" = ( /obj/structure/chair/comfy/shuttle{ @@ -813,13 +794,15 @@ }, /turf/open/floor/carpet/royalblue, /area/shuttle/escape) -"oK" = ( -/obj/structure/railing/corner{ - dir = 8 +"oQ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 }, -/obj/effect/turf_decal/trimline/blue/line, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark/small, +/obj/structure/sign/nanotrasen{ + pixel_y = -32 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/wood, /area/shuttle/escape) "oV" = ( /obj/effect/turf_decal/siding/wood/end{ @@ -854,38 +837,28 @@ /obj/structure/flora/bush/flowers_br/style_2, /turf/open/floor/grass, /area/shuttle/escape) +"ps" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood, +/obj/item/toy/cards/deck{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/toy/cards/deck/kotahi{ + pixel_x = 5; + pixel_y = 2 + }, +/obj/item/toy/figure/dsquad{ + pixel_x = -9; + pixel_y = 1 + }, +/turf/open/floor/carpet/red, +/area/shuttle/escape) "pK" = ( /obj/structure/reagent_dispensers/foamtank, /obj/effect/turf_decal/delivery, /turf/open/floor/plating, /area/shuttle/escape) -"pN" = ( -/obj/item/paper_bin{ - pixel_x = -4 - }, -/obj/item/pen/fourcolor{ - pixel_x = -4 - }, -/obj/item/stamp{ - pixel_x = 8; - pixel_y = 5 - }, -/obj/item/stamp/denied{ - pixel_x = 8 - }, -/obj/item/stamp/head/qm{ - pixel_y = -5; - pixel_x = 8 - }, -/obj/structure/table/reinforced{ - color = "#c1b6a5" - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "pP" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 1 @@ -940,6 +913,13 @@ "qU" = ( /turf/open/floor/carpet/red, /area/shuttle/escape) +"rb" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/item/kirbyplants/organic/plant3, +/turf/open/floor/wood, +/area/shuttle/escape) "rd" = ( /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -948,14 +928,6 @@ /obj/structure/sign/poster/official/high_class_martini/directional/north, /turf/open/floor/wood, /area/shuttle/escape) -"ri" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark/textured_half, -/area/shuttle/escape) "rK" = ( /obj/machinery/vending/wallmed/directional/south, /turf/open/floor/iron/chapel, @@ -1049,15 +1021,6 @@ }, /turf/open/floor/grass, /area/shuttle/escape) -"ts" = ( -/obj/effect/turf_decal/tile/blue/opposingcorners, -/obj/machinery/stasis, -/obj/machinery/light/directional, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/shuttle/escape) "tB" = ( /obj/structure/railing/corner{ dir = 4 @@ -1081,43 +1044,6 @@ /obj/item/storage/fancy/donut_box, /turf/open/floor/sepia, /area/shuttle/escape) -"tS" = ( -/obj/structure/closet/cardboard, -/obj/structure/sign/poster/official/cohiba_robusto_ad/directional/north, -/obj/item/clothing/suit/hooded/wintercoat/custom, -/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/shoes/sandal{ - pixel_y = -11; - pixel_x = 4 - }, -/obj/item/clothing/shoes/sandal{ - pixel_y = -11; - pixel_x = 4 - }, -/obj/item/clothing/shoes/sandal{ - pixel_y = -11; - pixel_x = 4 - }, -/obj/item/clothing/shoes/sandal{ - pixel_y = -11; - pixel_x = 4 - }, -/obj/item/clothing/shoes/sandal{ - pixel_y = -11; - pixel_x = 4 - }, -/obj/item/clothing/shoes/sandal{ - pixel_y = -11; - pixel_x = 4 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/plating, -/area/shuttle/escape) "ux" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/escape) @@ -1201,10 +1127,6 @@ }, /turf/open/floor/grass, /area/shuttle/escape) -"vX" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/catwalk_floor, -/area/shuttle/escape) "wi" = ( /obj/structure/table/reinforced, /obj/item/storage/medkit/regular, @@ -1213,6 +1135,16 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) +"wl" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/structure/sign/nanotrasen{ + pixel_y = -32 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/wood, +/area/shuttle/escape) "wm" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/structure/table/optable, @@ -1249,10 +1181,9 @@ }, /turf/open/floor/wood/large, /area/shuttle/escape) -"wV" = ( +"xF" = ( /obj/machinery/computer/crew, /obj/structure/sign/flag/nanotrasen/directional/north, -/obj/machinery/light/directional/north, /turf/open/floor/iron/dark/small, /area/shuttle/escape) "xK" = ( @@ -1285,6 +1216,25 @@ }, /turf/open/floor/wood, /area/shuttle/escape) +"ya" = ( +/obj/structure/railing/corner{ + dir = 8; + color = "#A47449"; + layer = 3.1 + }, +/obj/structure/flora/bush/large/style_2{ + pixel_x = -6; + pixel_y = -16 + }, +/obj/structure/flora/rock/pile/jungle{ + pixel_x = -3; + pixel_y = -6 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/grass, +/area/shuttle/escape) "yj" = ( /obj/machinery/recharge_station, /obj/effect/turf_decal/bot/left, @@ -1396,15 +1346,22 @@ /obj/effect/turf_decal/siding/wood/end, /turf/open/floor/glass, /area/shuttle/escape) -"zo" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 6 +"zw" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_x = -7; + pixel_y = 4 }, -/obj/machinery/vending/coffee, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 +/obj/machinery/recharger{ + pixel_x = 7; + pixel_y = 4 }, -/turf/open/floor/wood, +/obj/item/storage/box/handcuffs{ + pixel_y = 2 + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark/textured_half, /area/shuttle/escape) "zB" = ( /obj/machinery/vending/games, @@ -1432,6 +1389,20 @@ /obj/machinery/vending/wallmed/directional/south, /turf/open/floor/wood, /area/shuttle/escape) +"Ac" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/item/kirbyplants/organic/plant22, +/turf/open/floor/carpet/red, +/area/shuttle/escape) +"Al" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/line, +/turf/open/floor/iron/dark/small, +/area/shuttle/escape) "At" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -1453,10 +1424,6 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) -"AC" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/wood, -/area/shuttle/escape) "AF" = ( /turf/open/floor/wood/tile, /area/shuttle/escape) @@ -1484,6 +1451,42 @@ }, /turf/open/floor/wood/tile, /area/shuttle/escape) +"Bm" = ( +/obj/structure/closet/cardboard, +/obj/structure/sign/poster/official/cohiba_robusto_ad/directional/north, +/obj/item/clothing/suit/hooded/wintercoat/custom, +/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/shoes/sandal{ + pixel_y = -11; + pixel_x = 4 + }, +/obj/item/clothing/shoes/sandal{ + pixel_y = -11; + pixel_x = 4 + }, +/obj/item/clothing/shoes/sandal{ + pixel_y = -11; + pixel_x = 4 + }, +/obj/item/clothing/shoes/sandal{ + pixel_y = -11; + pixel_x = 4 + }, +/obj/item/clothing/shoes/sandal{ + pixel_y = -11; + pixel_x = 4 + }, +/obj/item/clothing/shoes/sandal{ + pixel_y = -11; + pixel_x = 4 + }, +/turf/open/floor/plating, +/area/shuttle/escape) "Bn" = ( /obj/structure/railing/corner, /obj/effect/turf_decal/siding/wood/corner, @@ -1500,26 +1503,6 @@ }, /turf/open/floor/stone, /area/shuttle/escape) -"By" = ( -/obj/structure/railing/corner{ - dir = 8; - color = "#A47449"; - layer = 3.1 - }, -/obj/structure/flora/bush/large/style_2{ - pixel_x = -6; - pixel_y = -16 - }, -/obj/structure/flora/rock/pile/jungle{ - pixel_x = -3; - pixel_y = -6 - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/obj/machinery/light/floor, -/turf/open/floor/grass, -/area/shuttle/escape) "BC" = ( /obj/machinery/computer/station_alert{ dir = 8 @@ -1529,17 +1512,6 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) -"BL" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/obj/structure/hedge{ - icon_state = "hedge-8" - }, -/obj/machinery/light/floor, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood/large, -/area/shuttle/escape) "Ci" = ( /obj/structure/railing{ color = "#A47449"; @@ -1551,15 +1523,6 @@ }, /turf/open/water/jungle, /area/shuttle/escape) -"Cw" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, -/turf/open/floor/wood, -/area/shuttle/escape) "CR" = ( /turf/open/floor/wood, /area/shuttle/escape) @@ -1572,17 +1535,6 @@ /obj/structure/sign/poster/official/midtown_slice/directional/west, /turf/open/floor/stone, /area/shuttle/escape) -"Dd" = ( -/obj/effect/turf_decal/tile/blue/opposingcorners, -/obj/machinery/computer/operating{ - dir = 4 - }, -/obj/machinery/light/directional, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/shuttle/escape) "Dk" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -1668,6 +1620,32 @@ }, /turf/open/floor/sepia, /area/shuttle/escape) +"Fd" = ( +/obj/item/paper_bin{ + pixel_x = -4 + }, +/obj/item/pen/fourcolor{ + pixel_x = -4 + }, +/obj/item/stamp{ + pixel_x = 8; + pixel_y = 5 + }, +/obj/item/stamp/denied{ + pixel_x = 8 + }, +/obj/item/stamp/head/qm{ + pixel_y = -5; + pixel_x = 8 + }, +/obj/structure/table/reinforced{ + color = "#c1b6a5" + }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/shuttle/escape) "Fg" = ( /obj/structure/railing/corner{ dir = 4; @@ -1876,11 +1854,6 @@ }, /turf/open/floor/carpet/green, /area/shuttle/escape) -"IO" = ( -/obj/machinery/status_display/evac/directional/west, -/obj/machinery/keycard_auth/directional/south, -/turf/open/floor/carpet/royalblue, -/area/shuttle/escape) "IR" = ( /obj/structure/chair/comfy/brown{ color = "#c45c57"; @@ -1943,6 +1916,11 @@ }, /turf/open/floor/carpet/red, /area/shuttle/escape) +"JR" = ( +/obj/structure/closet/radiation, +/obj/effect/turf_decal/bot, +/turf/open/floor/plating, +/area/shuttle/escape) "JS" = ( /turf/open/floor/iron/stairs/left, /area/shuttle/escape) @@ -1965,6 +1943,15 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/water, /area/shuttle/escape) +"Kk" = ( +/obj/structure/railing{ + layer = 3.1 + }, +/obj/effect/turf_decal/siding/dark, +/obj/effect/turf_decal/trimline/blue/line, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/small, +/area/shuttle/escape) "Km" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/chair/comfy/black{ @@ -2093,14 +2080,16 @@ }, /turf/open/floor/iron/dark/small, /area/shuttle/escape) -"MF" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 9 +"Mk" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/computer/operating{ + dir = 4 }, -/obj/item/kirbyplants{ - icon_state = "plant-21" +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/floor/wood, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, /area/shuttle/escape) "MO" = ( /obj/effect/turf_decal/siding/wood, @@ -2157,17 +2146,17 @@ }, /turf/open/floor/wood/large, /area/shuttle/escape) -"NU" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/turf/open/floor/carpet/royalblue, -/area/shuttle/escape) "NV" = ( /turf/open/floor/iron/chapel{ dir = 8 }, /area/shuttle/escape) +"NZ" = ( +/obj/machinery/status_display/evac/directional/west, +/obj/machinery/keycard_auth/directional/south, +/obj/machinery/light/floor, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) "Oh" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 1 @@ -2215,6 +2204,11 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/dark/small, /area/shuttle/escape) +"OC" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/item/kirbyplants/organic/plant10, +/turf/open/floor/iron/dark, +/area/shuttle/escape) "OG" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood/large, @@ -2256,11 +2250,6 @@ }, /turf/open/floor/carpet, /area/shuttle/escape) -"Pi" = ( -/obj/structure/closet/secure_closet/bar/all_access, -/obj/machinery/light/directional/west, -/turf/open/floor/stone, -/area/shuttle/escape) "Pq" = ( /obj/machinery/computer/security, /obj/structure/plaque/static_plaque/golden/captain{ @@ -2313,6 +2302,10 @@ }, /turf/open/floor/plating, /area/shuttle/escape) +"Rh" = ( +/obj/structure/closet/secure_closet/bar/all_access, +/turf/open/floor/stone, +/area/shuttle/escape) "Rm" = ( /obj/structure/table/reinforced, /obj/item/grenade/chem_grenade/smart_metal_foam{ @@ -2329,11 +2322,6 @@ }, /turf/open/floor/iron/dark/herringbone, /area/shuttle/escape) -"Rx" = ( -/mob/living/simple_animal/bot/hygienebot, -/obj/machinery/light/directional/north, -/turf/open/floor/wood, -/area/shuttle/escape) "RD" = ( /obj/machinery/computer/emergency_shuttle{ dir = 8 @@ -2444,13 +2432,6 @@ /obj/effect/turf_decal/siding/thinplating_new/dark, /turf/open/floor/iron/dark, /area/shuttle/escape) -"SM" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "SR" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 8 @@ -2462,21 +2443,6 @@ /obj/effect/decal/cleanable/wrapping, /turf/open/floor/iron/dark/herringbone, /area/shuttle/escape) -"SU" = ( -/obj/structure/closet/radiation, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/bot, -/turf/open/floor/plating, -/area/shuttle/escape) -"Tb" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/turf/open/floor/carpet/red, -/area/shuttle/escape) "Tq" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -2520,6 +2486,17 @@ }, /turf/open/floor/glass, /area/shuttle/escape) +"Uk" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/machinery/vending/coffee, +/obj/structure/sign/nanotrasen{ + pixel_y = 32 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/wood, +/area/shuttle/escape) "UF" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/closet/emcloset/anchored, @@ -2559,14 +2536,16 @@ }, /turf/open/floor/grass, /area/shuttle/escape) -"VF" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 +"Vd" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/railing{ + color = "#A47449"; + dir = 2; + layer = 3.1 }, -/turf/open/floor/wood, +/obj/machinery/microwave, +/obj/structure/table/wood, +/turf/open/floor/stone, /area/shuttle/escape) "VR" = ( /obj/structure/railing{ @@ -2579,29 +2558,11 @@ dir = 1 }, /area/shuttle/escape) -"VY" = ( -/obj/structure/table/wood, -/obj/effect/turf_decal/siding/wood, -/obj/item/toy/cards/deck{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/toy/cards/deck/kotahi{ - pixel_x = 5; - pixel_y = 2 - }, -/obj/item/toy/figure/dsquad{ - pixel_x = -9; - pixel_y = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/carpet/red, -/area/shuttle/escape) "VZ" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/structure/table, /obj/item/lazarus_injector, -/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/item/surgery_tray/full, /obj/item/clothing/gloves/latex/nitrile{ pixel_y = 4 }, @@ -2626,6 +2587,12 @@ "Wo" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/escape) +"Wp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) "Wx" = ( /obj/structure/railing/corner{ dir = 1; @@ -2684,6 +2651,11 @@ "XX" = ( /turf/open/floor/iron/dark/small, /area/shuttle/escape) +"XZ" = ( +/obj/effect/spawner/structure/window/reinforced/shuttle, +/obj/machinery/light/directional/south, +/turf/open/floor/plating, +/area/shuttle/escape) "Yc" = ( /obj/structure/sign/departments/medbay/alt/directional, /turf/closed/wall/mineral/titanium/nodiagonal, @@ -2725,6 +2697,10 @@ }, /turf/open/floor/wood/tile, /area/shuttle/escape) +"Zx" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/catwalk_floor, +/area/shuttle/escape) "ZJ" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/stone, @@ -2900,9 +2876,9 @@ fL ux fC ZJ -kp +Vd yj -IZ +Zx ux eW hx @@ -2950,13 +2926,13 @@ ux cD CV hT -Pi +Rh ux -vX +IZ ux Km gg -Tb +Ac zB ux Wo @@ -3008,7 +2984,7 @@ QR JG qU RM -VY +ps ux ux QV @@ -3025,10 +3001,10 @@ Pg Pg Pg Pg -MF +nj pP AQ -BL +dB Tw XW nq @@ -3070,7 +3046,7 @@ ux zf OK ux -Rx +nQ Qq sY sY @@ -3084,7 +3060,7 @@ si sY sY qB -AC +CR ux kM Kg @@ -3096,7 +3072,7 @@ oB oB Bs qw -ni +rb UU ow os @@ -3120,7 +3096,7 @@ ux UP NC ux -zo +Uk vT iM aj @@ -3132,9 +3108,9 @@ MO nv vT Wx -By +ya jl -VF +oQ ux oy NC @@ -3160,7 +3136,7 @@ ag ag nA bS -Sz +XZ oe oe Sz @@ -3177,7 +3153,7 @@ XC kn vB Zh -Or +AF wG zI yy @@ -3202,7 +3178,7 @@ ag HL pf Zh -AF +Or nE HS EH @@ -3229,12 +3205,12 @@ Fj wM OG MO -ba +ie HS Fg kh Ci -Cw +wl ux UF pe @@ -3270,7 +3246,7 @@ ux zf Ty ux -Rx +nQ si mc mc @@ -3284,7 +3260,7 @@ zb xS xS tB -AC +CR ux Ty Kg @@ -3318,7 +3294,7 @@ fe (24,1,1) = {" Wo ux -SU +JR ux yQ Kt @@ -3336,7 +3312,7 @@ Hu NV SA ux -tS +Bm ux Wo "} @@ -3372,7 +3348,7 @@ fL fL ux nG -hh +jN AT wp er @@ -3382,7 +3358,7 @@ Sl gz xK qn -mL +bC KI ux fL @@ -3422,9 +3398,9 @@ fL fL fL ux -nM +zw +GM GM -ri Sz hP jI @@ -3432,7 +3408,7 @@ TV Sz Gh wm -Dd +Mk ux fL fL @@ -3499,7 +3475,7 @@ fL ux cc xQ -mj +xQ ux Sz KV @@ -3507,7 +3483,7 @@ Sz ux dd VZ -ts +jp ux fL fL @@ -3528,7 +3504,7 @@ ux ux Ay GK -SM +OC ux ux ux @@ -3550,13 +3526,13 @@ fL ux Pq yo -oK +Al EW GK Jo -mq +Wp KK -IO +NZ ux fL fL @@ -3573,7 +3549,7 @@ fL fL fL ux -wV +xF XX ll VR @@ -3600,7 +3576,7 @@ fL Sz LG XX -Hq +Kk OM GK Jo @@ -3629,7 +3605,7 @@ Hq SH Az eN -NU +fs eH Gg ux @@ -3655,7 +3631,7 @@ wi BC eu vy -pN +Fd ux Wo fL diff --git a/_maps/shuttles/emergency_venture.dmm b/_maps/shuttles/emergency_venture.dmm index 52cfcb3d2829e..6b72f22dc295a 100644 --- a/_maps/shuttles/emergency_venture.dmm +++ b/_maps/shuttles/emergency_venture.dmm @@ -81,14 +81,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"aH" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/herringbone, -/area/shuttle/escape) -"aI" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron/herringbone, -/area/shuttle/escape) "aU" = ( /obj/structure/table, /obj/item/restraints/handcuffs{ @@ -109,6 +101,36 @@ "bx" = ( /turf/open/floor/iron/white, /area/shuttle/escape) +"dz" = ( +/obj/structure/closet{ + anchorable = 0; + anchored = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/loading_area{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/shuttle/escape) +"dT" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_x = 7; + pixel_y = 2 + }, +/obj/item/paper_bin{ + pixel_x = -6; + pixel_y = 8 + }, +/obj/effect/turf_decal/tile/dark_blue/anticorner{ + dir = 1 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) "dU" = ( /obj/machinery/door/airlock/public/glass{ name = "Emergency Shuttle Airlock" @@ -152,16 +174,6 @@ }, /turf/open/floor/iron/herringbone, /area/shuttle/escape) -"hY" = ( -/obj/structure/table, -/obj/item/storage/fancy/donut_box, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/structure/sign/poster/official/random/directional/east, -/obj/effect/turf_decal/tile/dark_blue/anticorner{ - dir = 4 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) "ij" = ( /obj/structure/table/reinforced/rglass, /obj/effect/spawner/random/bureaucracy/crayon, @@ -175,25 +187,12 @@ "iD" = ( /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) -"iJ" = ( -/obj/machinery/stasis, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/turf/open/floor/iron/white, -/area/shuttle/escape) "jj" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"jn" = ( -/obj/machinery/suit_storage_unit/standard_unit, -/obj/effect/turf_decal/delivery, -/obj/machinery/light/directional/west, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/mineral/titanium/yellow, -/area/shuttle/escape) "jv" = ( /obj/machinery/power/shuttle_engine/propulsion{ dir = 1 @@ -274,21 +273,6 @@ }, /turf/open/floor/iron/herringbone, /area/shuttle/escape) -"mu" = ( -/obj/structure/table, -/obj/machinery/recharger{ - pixel_x = 7; - pixel_y = 2 - }, -/obj/item/paper_bin{ - pixel_x = -6; - pixel_y = 8 - }, -/obj/effect/turf_decal/tile/dark_blue/anticorner{ - dir = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) "mD" = ( /turf/open/floor/mineral/titanium, /area/shuttle/escape) @@ -334,12 +318,6 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/large, /area/shuttle/escape) -"pX" = ( -/obj/structure/table, -/obj/effect/spawner/random/bureaucracy/pen, -/obj/effect/spawner/random/bureaucracy/paper, -/turf/open/floor/iron, -/area/shuttle/escape) "qo" = ( /obj/machinery/stasis, /obj/effect/turf_decal/tile/blue/half/contrasted{ @@ -352,20 +330,6 @@ /obj/item/paper_bin, /turf/open/floor/iron, /area/shuttle/escape) -"ra" = ( -/obj/structure/closet{ - anchorable = 0; - anchored = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/loading_area{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/shuttle/escape) "rh" = ( /turf/template_noop, /area/template_noop) @@ -395,6 +359,14 @@ /obj/effect/turf_decal/tile/green/half/contrasted, /turf/open/floor/iron, /area/shuttle/escape) +"tE" = ( +/obj/structure/bed/medical/emergency, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/shuttle/escape) "tY" = ( /obj/structure/table, /obj/item/scalpel{ @@ -414,6 +386,12 @@ /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /turf/open/floor/iron/white, /area/shuttle/escape) +"ui" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/effect/turf_decal/delivery, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) "uR" = ( /obj/effect/spawner/structure/window/reinforced/shuttle, /turf/open/floor/plating, @@ -432,20 +410,10 @@ "vX" = ( /turf/open/floor/iron/herringbone, /area/shuttle/escape) -"wf" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/machinery/light/small/directional/east, +"wc" = ( +/obj/structure/closet/crate/bin, /obj/effect/turf_decal/tile/green/anticorner/contrasted, -/turf/open/floor/iron, -/area/shuttle/escape) -"wY" = ( -/obj/structure/chair/comfy/shuttle, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, +/obj/machinery/light/directional/east, /turf/open/floor/iron, /area/shuttle/escape) "xD" = ( @@ -460,14 +428,6 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"xW" = ( -/obj/machinery/light/directional/north, -/obj/structure/chair/comfy/shuttle, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/shuttle/escape) "xZ" = ( /obj/structure/table, /obj/item/storage/toolbox/emergency{ @@ -482,12 +442,18 @@ /obj/effect/spawner/random/bureaucracy/folder, /turf/open/floor/iron, /area/shuttle/escape) -"yk" = ( -/obj/structure/bed/roller, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ +"yo" = ( +/obj/structure/chair/comfy/shuttle{ dir = 1 }, -/turf/open/floor/iron/white, +/obj/effect/turf_decal/tile/green/anticorner/contrasted, +/turf/open/floor/iron, +/area/shuttle/escape) +"zt" = ( +/obj/structure/table, +/obj/item/storage/toolbox/emergency, +/obj/machinery/light/directional/east, +/turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "zB" = ( /obj/structure/chair/comfy/shuttle{ @@ -524,11 +490,6 @@ }, /turf/open/floor/iron/herringbone, /area/shuttle/escape) -"CF" = ( -/obj/structure/table, -/obj/item/storage/toolbox/emergency, -/turf/open/floor/mineral/titanium/yellow, -/area/shuttle/escape) "CO" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/herringbone, @@ -566,6 +527,25 @@ /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) +"EB" = ( +/obj/structure/table, +/obj/item/storage/medkit/regular{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/item/storage/medkit/fire, +/obj/item/storage/medkit/toxin{ + pixel_x = -3 + }, +/obj/item/storage/medkit/o2{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/structure/sign/poster/official/moth_epi/directional/south, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron/white, +/area/shuttle/escape) "EL" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/delivery, @@ -603,13 +583,6 @@ /obj/effect/spawner/structure/window/reinforced/shuttle, /turf/open/floor/plating, /area/shuttle/escape/brig) -"Gj" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "Gq" = ( /obj/machinery/shower/directional/south, /obj/structure/window/reinforced/spawner/directional/east, @@ -619,6 +592,17 @@ }, /turf/open/floor/iron/white, /area/shuttle/escape) +"Gr" = ( +/obj/structure/table, +/obj/item/storage/fancy/donut_box, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/structure/sign/poster/official/random/directional/east, +/obj/effect/turf_decal/tile/dark_blue/anticorner{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) "Gt" = ( /obj/structure/chair/comfy/shuttle, /obj/machinery/vending/wallmed/directional/north, @@ -655,6 +639,12 @@ }, /turf/open/floor/iron/herringbone, /area/shuttle/escape) +"IC" = ( +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) "Jz" = ( /obj/structure/tank_dispenser/oxygen{ layer = 2.7; @@ -670,6 +660,16 @@ }, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) +"Lc" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/shuttle/escape) "Lw" = ( /obj/structure/table, /obj/machinery/recharger, @@ -679,25 +679,6 @@ "LE" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/escape) -"LO" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular{ - pixel_x = 5; - pixel_y = 3 - }, -/obj/item/storage/medkit/fire, -/obj/item/storage/medkit/toxin{ - pixel_x = -3 - }, -/obj/item/storage/medkit/o2{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/structure/sign/poster/official/moth_epi/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/white, -/area/shuttle/escape) "Me" = ( /obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/titanium, @@ -716,6 +697,13 @@ }, /turf/open/floor/iron, /area/shuttle/escape) +"MJ" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) "Ng" = ( /obj/structure/chair/comfy/shuttle, /obj/item/radio/intercom/directional/east, @@ -760,13 +748,6 @@ "Qq" = ( /turf/closed/wall/mineral/plastitanium, /area/shuttle/escape) -"QU" = ( -/obj/machinery/light/directional/south, -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) "Rq" = ( /obj/structure/sign/poster/random/directional/south, /turf/open/floor/mineral/titanium/yellow, @@ -778,19 +759,17 @@ }, /turf/open/floor/iron/white, /area/shuttle/escape) +"RB" = ( +/obj/machinery/stasis, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/turf/open/floor/iron/white, +/area/shuttle/escape) "RL" = ( /obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"Sv" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) "SG" = ( /obj/machinery/computer/crew{ dir = 4 @@ -866,35 +845,59 @@ /obj/machinery/light/directional/south, /turf/open/floor/mineral/titanium, /area/shuttle/escape) +"Vx" = ( +/obj/structure/chair/comfy/shuttle, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron, +/area/shuttle/escape) "VQ" = ( /obj/effect/turf_decal/delivery, /obj/structure/reagent_dispensers/watertank, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) -"VS" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/dark_blue/half{ - dir = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) "VU" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/escape/brig) +"Wg" = ( +/obj/structure/table, +/obj/effect/spawner/random/bureaucracy/pen, +/obj/effect/spawner/random/bureaucracy/paper, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/shuttle/escape) "Wy" = ( /obj/machinery/recharge_station, /obj/effect/turf_decal/delivery, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) +"WF" = ( +/obj/machinery/light/small/directional/north, +/obj/structure/closet{ + anchorable = 0; + anchored = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/loading_area{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/shuttle/escape) "WL" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/delivery, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"XM" = ( -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/tile/green/anticorner/contrasted, -/turf/open/floor/iron, +"Xa" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/delivery, +/obj/machinery/light/directional/west, +/turf/open/floor/mineral/titanium, /area/shuttle/escape) "YG" = ( /obj/machinery/computer/security{ @@ -905,20 +908,13 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"Za" = ( -/obj/structure/closet{ - anchorable = 0; - anchored = 1 - }, -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/loading_area{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, +"YN" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"Zq" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/mineral/titanium, /area/shuttle/escape) "ZI" = ( /obj/machinery/door/airlock/public/glass{ @@ -966,7 +962,7 @@ rh jv TS sN -jn +ui Jz AC ai @@ -981,7 +977,7 @@ AC mD lW mD -WL +Xa AC LE rh @@ -1002,7 +998,7 @@ mD mD UL AC -wY +Vx ij fX AC @@ -1021,7 +1017,7 @@ rh (4,1,1) = {" Qq Qq -CF +zt iD Wy AC @@ -1038,7 +1034,7 @@ pn mD mD mD -Sv +Fk AC AC uR @@ -1068,7 +1064,7 @@ mD mD Fk AC -mu +dT SG YG uR @@ -1083,7 +1079,7 @@ AC Gt mD mD -mD +Zq ZI jA kw @@ -1096,7 +1092,7 @@ dU uR AC AC -VS +IC Uw zF Ds @@ -1111,14 +1107,14 @@ AC rR mD mD -QU +Fk AC -xW -pX +BP +Wg Ea tg lT -aH +vX vX vX vX @@ -1167,14 +1163,14 @@ AC OS mD mD -QU +Fk AC -xW +BP ye Ea tg NH -aI +vX vX vX vX @@ -1195,7 +1191,7 @@ AC Me mD mD -mD +YN ZI GM Ea @@ -1208,7 +1204,7 @@ vf FW Uf Uf -VS +IC ZX Pu aU @@ -1228,7 +1224,7 @@ AC FF Fm Dv -XM +wc Uf TK lB @@ -1236,7 +1232,7 @@ lB lB NR Uf -hY +Gr lE hn uR @@ -1245,7 +1241,7 @@ uR (12,1,1) = {" Qq Qq -yk +tE Hq Ru Uz @@ -1279,18 +1275,18 @@ bx bx bx bx -LO +EB AC -ra +WF kw Uj -oJ +Lc Uf iq lB lB lB -Gj +jj Uf rh rh @@ -1304,20 +1300,20 @@ TS sg NO NO -iJ +RB qo Dx tY AC -Za +dz Hd Hd -wf +yo Uf Lw Oa zB -zB +MJ Uf VU rh diff --git a/_maps/shuttles/emergency_wabbajack.dmm b/_maps/shuttles/emergency_wabbajack.dmm index 1d25d2ce0b1f7..5e84c62c4745c 100644 --- a/_maps/shuttles/emergency_wabbajack.dmm +++ b/_maps/shuttles/emergency_wabbajack.dmm @@ -174,13 +174,6 @@ }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"aJ" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "aK" = ( /obj/machinery/stasis{ dir = 4 @@ -262,12 +255,6 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron, /area/shuttle/escape) -"be" = ( -/obj/structure/window/reinforced/spawner/directional/north{ - resistance_flags = 33 - }, -/turf/open/lava/smooth/airless, -/area/shuttle/escape) "bf" = ( /obj/machinery/power/shuttle_engine/heater, /turf/open/lava/smooth/airless, @@ -310,12 +297,32 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/mineral/titanium, /area/shuttle/escape) +"do" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) "ji" = ( /obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) +"ks" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) +"rT" = ( +/obj/structure/window/reinforced/spawner/directional/north{ + resistance_flags = 33 + }, +/turf/open/lava/smooth/airless, +/area/shuttle/escape) "sM" = ( /obj/structure/table, /obj/item/storage/toolbox/mechanical, @@ -326,18 +333,18 @@ /obj/item/wrench/medical, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) +"zw" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) "Aj" = ( /obj/structure/destructible/cult/item_dispenser/forge/engine, /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/white, /area/shuttle/escape) -"Ec" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/escape) "IH" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -418,7 +425,7 @@ aq bo aW ba -be +rT ab ab "} @@ -442,7 +449,7 @@ aq aq aX bb -be +rT bf bg "} @@ -457,16 +464,16 @@ am am as aq -aJ -aJ -aJ +do +do +do aq aU aq aq aq aq -be +rT bf bg "} @@ -488,9 +495,9 @@ aq ab ji ji +zw ji -ji -be +rT bf bg "} @@ -514,7 +521,7 @@ ab ab ab ab -be +rT bf bg "} @@ -529,16 +536,16 @@ au az ab aF -Ec +ks aq -Ec +ks aS as aI aI +bo aI -aI -be +rT bf bg "} @@ -562,7 +569,7 @@ aq aq aq aq -be +rT bf bg "} @@ -586,7 +593,7 @@ MK aq Mz Wj -be +rT bf bg "} @@ -610,7 +617,7 @@ MK bp IH Aj -be +rT ab ab "} diff --git a/_maps/shuttles/emergency_zeta.dmm b/_maps/shuttles/emergency_zeta.dmm index fdd73128db849..399b40156ceb6 100644 --- a/_maps/shuttles/emergency_zeta.dmm +++ b/_maps/shuttles/emergency_zeta.dmm @@ -10,7 +10,7 @@ /turf/open/floor/plating/abductor, /area/shuttle/escape) "eD" = ( -/obj/item/kirbyplants/photosynthetic, +/obj/structure/chair/comfy/shuttle, /obj/machinery/light/directional/north, /turf/open/floor/plating/abductor, /area/shuttle/escape) @@ -87,6 +87,9 @@ /turf/open/floor/plating/abductor, /area/shuttle/escape/brig) "sG" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /obj/machinery/light/directional/east, /turf/open/floor/plating/abductor, /area/shuttle/escape) @@ -103,7 +106,6 @@ /area/shuttle/escape/brig) "uW" = ( /obj/structure/chair/office, -/obj/machinery/light/directional/east, /turf/open/floor/plating/abductor, /area/shuttle/escape) "vw" = ( @@ -180,14 +182,12 @@ /turf/open/floor/plating/abductor, /area/shuttle/escape) "GO" = ( -/obj/item/kirbyplants/photosynthetic, -/obj/machinery/light/directional/south, +/obj/machinery/light/floor, /turf/open/floor/plating/abductor, /area/shuttle/escape) "HK" = ( /obj/structure/table/abductor, /obj/item/storage/box/alienhandcuffs, -/obj/machinery/light/directional/east, /turf/open/floor/plating/abductor, /area/shuttle/escape/brig) "IL" = ( @@ -207,12 +207,13 @@ "JK" = ( /obj/item/lazarus_injector, /obj/structure/table/abductor, -/obj/machinery/light/directional/east, /turf/open/floor/plating/abductor, /area/shuttle/escape) "Lo" = ( -/obj/item/kirbyplants/photosynthetic, -/obj/machinery/light/directional/west, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/machinery/light/directional/south, /turf/open/floor/plating/abductor, /area/shuttle/escape) "Nz" = ( @@ -264,7 +265,6 @@ /obj/item/clothing/shoes/sneakers/white, /obj/item/clothing/shoes/jackboots, /obj/item/clothing/glasses/eyepatch, -/obj/machinery/light/directional/west, /turf/open/floor/plating/abductor, /area/shuttle/escape) "VR" = ( @@ -351,9 +351,9 @@ nH Um Um Um -Lo +vw Um -Lo +vw Um Um Um @@ -436,11 +436,11 @@ Cv (6,1,1) = {" nH nH -eD +vw Um CT CT -CT +sG Um Sg Sg @@ -448,11 +448,11 @@ Sg Sg Sg Um -CT +sG CT CT Um -GO +vw nH nH "} @@ -483,14 +483,14 @@ nH nH zx wk -lK +Um vw nH vw Um Um Um -sG +Um Um Um Um @@ -505,7 +505,7 @@ nH (9,1,1) = {" jj Nz -Um +GO Um Um nH @@ -521,7 +521,7 @@ Um jj Um Um -Um +GO Tn jj "} @@ -535,7 +535,7 @@ nH Um Um Um -xd +Lo nH an Um @@ -583,7 +583,7 @@ Um Um xd nH -an +eD Um Um Um @@ -597,7 +597,7 @@ jj (13,1,1) = {" jj xg -Um +GO Um Um nH @@ -612,8 +612,8 @@ Um Um jj Um -Um -Um +GO +GO Um jj "} @@ -621,17 +621,17 @@ jj nH hh wk -sG +Um vw nH vw Um Um Um -lK Um Um -sG +Um +Um vw nH yR @@ -720,7 +720,7 @@ ui ui jI Um -Um +GO Um Ct Um diff --git a/_maps/shuttles/ert_bounty.dmm b/_maps/shuttles/ert_bounty.dmm index acd5c82f45257..46c6f03f11691 100644 --- a/_maps/shuttles/ert_bounty.dmm +++ b/_maps/shuttles/ert_bounty.dmm @@ -2,9 +2,26 @@ "a" = ( /turf/template_noop, /area/template_noop) -"b" = ( -/obj/structure/tank_dispenser/oxygen, -/turf/open/floor/pod/dark, +"c" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external/ruin, +/obj/docking_port/stationary{ + dwidth = 11; + height = 16; + name = "Deep Space"; + shuttle_id = "pirate_home"; + width = 17 + }, +/obj/docking_port/mobile{ + movement_force = list("KNOCKDOWN"=0,"THROW"=0); + name = "hunter shuttle"; + rechargeTime = 1800; + shuttle_id = "huntership" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, /area/shuttle/hunter) "d" = ( /obj/structure/sign/warning/vacuum/external, @@ -18,16 +35,34 @@ /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, /turf/open/floor/plating, /area/shuttle/hunter) +"i" = ( +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/pod/dark, +/area/shuttle/hunter) "j" = ( /obj/structure/curtain/bounty, /turf/open/floor/pod/dark, /area/shuttle/hunter) +"k" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/floor/pod/dark, +/area/shuttle/hunter) "l" = ( /obj/machinery/power/shuttle_engine/propulsion{ dir = 8 }, /turf/open/floor/plating/airless, /area/shuttle/hunter) +"m" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/shuttle/hunter) "n" = ( /turf/closed/wall/mineral/plastitanium, /area/shuttle/hunter) @@ -100,10 +135,8 @@ }, /turf/open/floor/pod/dark, /area/shuttle/hunter) -"C" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, +"B" = ( +/obj/machinery/light/floor, /turf/open/floor/pod/dark, /area/shuttle/hunter) "D" = ( @@ -137,6 +170,11 @@ /obj/effect/landmark/ert_shuttle_brief_spawn, /turf/open/floor/pod/dark, /area/shuttle/hunter) +"J" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/shuttle/hunter) "K" = ( /obj/structure/chair/office{ dir = 8 @@ -148,6 +186,13 @@ /obj/effect/landmark/ert_shuttle_spawn, /turf/open/floor/pod/dark, /area/shuttle/hunter) +"M" = ( +/obj/machinery/suit_storage_unit/standard_unit{ + storage_type = /obj/item/tank/internals/oxygen/yellow + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/pod/light, +/area/shuttle/hunter) "O" = ( /turf/open/floor/pod/dark, /area/shuttle/hunter) @@ -172,38 +217,12 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/shuttle/hunter) -"U" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/door/airlock/external/ruin, -/obj/docking_port/stationary{ - dwidth = 11; - height = 16; - name = "Deep Space"; - shuttle_id = "pirate_home"; - width = 17 - }, -/obj/docking_port/mobile{ - movement_force = list("KNOCKDOWN"=0,"THROW"=0); - name = "hunter shuttle"; - rechargeTime = 1800; - shuttle_id = "huntership" - }, -/obj/structure/fans/tiny, -/turf/open/floor/plating, -/area/shuttle/hunter) "V" = ( /obj/machinery/computer/camera_advanced{ dir = 8 }, /turf/open/floor/pod/light, /area/shuttle/hunter) -"W" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical, -/turf/open/floor/pod/light, -/area/shuttle/hunter) "X" = ( /obj/structure/rack, /obj/item/grenade/c4{ @@ -220,6 +239,12 @@ }, /turf/open/floor/pod/dark, /area/shuttle/hunter) +"Y" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical, +/obj/machinery/light/small/directional/north, +/turf/open/floor/pod/light, +/area/shuttle/hunter) "Z" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -293,7 +318,7 @@ n v n n -b +i X D n @@ -321,16 +346,16 @@ n F p G -T +J w A -C +k Z Q -p +m G T -U +c "} (8,1,1) = {" n @@ -371,7 +396,7 @@ f E P O -t +M n h a @@ -382,7 +407,7 @@ a a a n -W +Y P R O @@ -429,7 +454,7 @@ a h S O -O +B O S h diff --git a/_maps/shuttles/ferry_base.dmm b/_maps/shuttles/ferry_base.dmm index b070ae445298e..4f9861db6d50d 100644 --- a/_maps/shuttles/ferry_base.dmm +++ b/_maps/shuttles/ferry_base.dmm @@ -28,6 +28,7 @@ /obj/machinery/computer/shuttle/ferry/request{ dir = 8 }, +/obj/machinery/light/directional/north, /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) "j" = ( @@ -61,6 +62,13 @@ }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) +"U" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/transport) (1,1,1) = {" a @@ -129,7 +137,7 @@ e c j l -q +U c "} (11,1,1) = {" diff --git a/_maps/shuttles/ferry_kilo.dmm b/_maps/shuttles/ferry_kilo.dmm index 1108403e43c62..6b727bfc81b93 100644 --- a/_maps/shuttles/ferry_kilo.dmm +++ b/_maps/shuttles/ferry_kilo.dmm @@ -58,7 +58,6 @@ }, /obj/item/storage/medkit/regular, /obj/item/crowbar, -/obj/machinery/light/directional/west, /turf/open/floor/mineral/plastitanium, /area/shuttle/transport) "l" = ( @@ -170,7 +169,6 @@ /obj/item/radio{ pixel_y = 4 }, -/obj/machinery/light/directional/west, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 }, @@ -183,11 +181,9 @@ }, /turf/open/floor/mineral/plastitanium, /area/shuttle/transport) -"x" = ( -/obj/effect/turf_decal/bot, -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, +"H" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger, /obj/machinery/light/directional/south, /turf/open/floor/mineral/plastitanium, /area/shuttle/transport) @@ -229,10 +225,10 @@ e "} (6,1,1) = {" d -l +o r w -d +g "} (7,1,1) = {" f @@ -245,8 +241,8 @@ f g n r -n -g +H +d "} (9,1,1) = {" e @@ -257,9 +253,9 @@ e "} (10,1,1) = {" d -o +l r -x +w d "} (11,1,1) = {" diff --git a/_maps/shuttles/ferry_lighthouse.dmm b/_maps/shuttles/ferry_lighthouse.dmm index bef95a75a71d2..48d0c4f558f44 100644 --- a/_maps/shuttles/ferry_lighthouse.dmm +++ b/_maps/shuttles/ferry_lighthouse.dmm @@ -23,10 +23,6 @@ "ag" = ( /turf/open/floor/plating/airless, /area/shuttle/transport) -"ai" = ( -/obj/machinery/vending/liberationstation, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/transport) "aj" = ( /obj/machinery/door/airlock/vault, /turf/open/floor/plating/airless, @@ -193,13 +189,6 @@ /obj/structure/window/fulltile, /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) -"ba" = ( -/obj/machinery/conveyor{ - dir = 1; - id = "garbage" - }, -/turf/open/floor/wood, -/area/shuttle/transport) "bb" = ( /obj/machinery/conveyor{ dir = 1; @@ -214,13 +203,6 @@ /obj/item/vending_refill/snack, /turf/open/floor/wood, /area/shuttle/transport) -"bd" = ( -/obj/item/kirbyplants/random/dead{ - desc = "It doesn't look very healthy..."; - name = "potted plant" - }, -/turf/open/floor/wood, -/area/shuttle/transport) "be" = ( /obj/machinery/conveyor{ dir = 4; @@ -255,6 +237,30 @@ /obj/machinery/power/shuttle_engine/propulsion/right, /turf/open/floor/plating/airless, /area/shuttle/transport) +"hL" = ( +/obj/machinery/vending/liberationstation, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/transport) +"jd" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "garbage" + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/shuttle/transport) +"op" = ( +/obj/item/kirbyplants/random/dead{ + desc = "It doesn't look very healthy..."; + name = "potted plant" + }, +/turf/open/floor/wood, +/area/shuttle/transport) +"ZS" = ( +/obj/machinery/light/warm/directional/west, +/turf/open/floor/wood, +/area/shuttle/transport) (1,1,1) = {" aa @@ -331,7 +337,7 @@ bj (5,1,1) = {" ad aM -ai +hL ak ao ak @@ -340,7 +346,7 @@ ak ak aP aX -ba +jd be bh bi @@ -373,7 +379,7 @@ aM ar au au -au +ZS au au aL @@ -430,7 +436,7 @@ aD aD aD aD -bd +op ad aa aa diff --git a/_maps/shuttles/ferry_meat.dmm b/_maps/shuttles/ferry_meat.dmm index a9b2459ec1aef..35188f974299b 100644 --- a/_maps/shuttles/ferry_meat.dmm +++ b/_maps/shuttles/ferry_meat.dmm @@ -18,6 +18,7 @@ /obj/structure/chair/comfy/shuttle{ dir = 4 }, +/obj/machinery/light/cold/directional/north, /turf/open/floor/iron/freezer, /area/shuttle/transport) "g" = ( @@ -129,6 +130,11 @@ }, /turf/open/floor/iron/freezer, /area/shuttle/transport) +"x" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/freezer, +/area/shuttle/transport) (1,1,1) = {" a @@ -188,7 +194,7 @@ c "} (9,1,1) = {" c -l +x l v c diff --git a/_maps/shuttles/hunter_bounty.dmm b/_maps/shuttles/hunter_bounty.dmm index 3d3727962f2d5..3087fa376fee5 100644 --- a/_maps/shuttles/hunter_bounty.dmm +++ b/_maps/shuttles/hunter_bounty.dmm @@ -5,11 +5,6 @@ "b" = ( /turf/closed/wall/mineral/plastitanium, /area/shuttle/hunter) -"c" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external/ruin, -/turf/open/floor/plating, -/area/shuttle/hunter) "d" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -22,17 +17,15 @@ }, /turf/open/floor/plating/airless, /area/shuttle/hunter) -"f" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external/ruin, -/obj/structure/fans/tiny, -/turf/open/floor/plating, -/area/shuttle/hunter) "g" = ( /obj/structure/sign/warning/vacuum/external, /turf/closed/wall/mineral/plastitanium, /area/shuttle/hunter) "h" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, /turf/open/floor/plating, /area/shuttle/hunter) "i" = ( @@ -48,10 +41,8 @@ /turf/closed/wall/mineral/plastitanium, /area/shuttle/hunter) "l" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/door/airlock/external/ruin, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/small/directional/west, /turf/open/floor/plating, /area/shuttle/hunter) "m" = ( @@ -112,8 +103,8 @@ /turf/open/floor/pod/dark, /area/shuttle/hunter) "x" = ( -/obj/structure/table, -/turf/open/floor/pod/dark, +/obj/machinery/fugitive_locator, +/turf/open/floor/pod/light, /area/shuttle/hunter) "y" = ( /obj/structure/chair/office{ @@ -137,16 +128,6 @@ /obj/machinery/launchpad, /turf/open/floor/pod/dark, /area/shuttle/hunter) -"C" = ( -/obj/item/multitool, -/turf/open/floor/pod/dark, -/area/shuttle/hunter) -"D" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/pod/dark, -/area/shuttle/hunter) "E" = ( /obj/structure/table, /obj/item/binoculars, @@ -172,18 +153,70 @@ }, /turf/open/floor/pod/dark, /area/shuttle/hunter) -"J" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical, -/turf/open/floor/pod/light, -/area/shuttle/hunter) "K" = ( /obj/machinery/suit_storage_unit/standard_unit{ storage_type = /obj/item/tank/internals/oxygen/yellow }, /turf/open/floor/pod/light, /area/shuttle/hunter) -"L" = ( +"M" = ( +/obj/effect/mob_spawn/ghost_role/human/fugitive/bounty/armor{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/shuttle/hunter) +"N" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external/ruin, +/obj/effect/mapping_helpers/airlock/access/all/hunter, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/turf/open/floor/plating, +/area/shuttle/hunter) +"O" = ( +/obj/machinery/light/floor, +/turf/open/floor/pod/dark, +/area/shuttle/hunter) +"P" = ( +/obj/structure/fluff/empty_sleeper{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/shuttle/hunter) +"Q" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external/ruin, +/obj/effect/mapping_helpers/airlock/access/all/hunter, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/turf/open/floor/plating, +/area/shuttle/hunter) +"R" = ( +/obj/structure/table, +/obj/item/pinpointer/shuttle{ + pixel_y = 4 + }, +/turf/open/floor/pod/dark, +/area/shuttle/hunter) +"S" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical, +/obj/machinery/light/small/directional/north, +/turf/open/floor/pod/light, +/area/shuttle/hunter) +"T" = ( +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/pod/dark, +/area/shuttle/hunter) +"U" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external/ruin, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/access/all/hunter, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/turf/open/floor/plating, +/area/shuttle/hunter) +"V" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, @@ -191,30 +224,39 @@ /obj/docking_port/stationary{ dwidth = 11; height = 16; - shuttle_id = "pirate_home"; name = "Deep Space"; + shuttle_id = "pirate_home"; width = 17 }, /obj/docking_port/mobile{ - shuttle_id = "huntership"; - movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); + movement_force = list("KNOCKDOWN"=0,"THROW"=0); name = "hunter shuttle"; - rechargeTime = 1800 + rechargeTime = 1800; + shuttle_id = "huntership" }, /obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/access/all/hunter, +/obj/effect/mapping_helpers/airlock/cutaiwire, /turf/open/floor/plating, /area/shuttle/hunter) -"M" = ( -/obj/effect/mob_spawn/ghost_role/human/fugitive/bounty/armor{ - dir = 1 +"W" = ( +/obj/machinery/suit_storage_unit/standard_unit{ + storage_type = /obj/item/tank/internals/oxygen/yellow }, +/obj/machinery/light/small/directional/south, /turf/open/floor/pod/light, /area/shuttle/hunter) -"P" = ( -/obj/structure/fluff/empty_sleeper{ - dir = 1 +"X" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/turf/open/floor/pod/light, +/obj/machinery/light/floor, +/turf/open/floor/pod/dark, +/area/shuttle/hunter) +"Y" = ( +/obj/structure/table, +/obj/item/multitool, +/turf/open/floor/pod/dark, /area/shuttle/hunter) "Z" = ( /obj/effect/mob_spawn/ghost_role/human/fugitive/bounty/synth, @@ -301,30 +343,30 @@ b b g b -b +T +s +s s -C G b -b g b b "} (7,1,1) = {" -f -d +U h j -l +Q +s t -D +X H -c +s +N d -h -j -L +l +V "} (8,1,1) = {" b @@ -363,7 +405,7 @@ i k n w -x +Y s K b @@ -376,11 +418,11 @@ a a a b -J -x +S +R E s -K +W b a a @@ -423,7 +465,7 @@ a i p s -s +O s P i @@ -453,7 +495,7 @@ a b i A -n +x I i b diff --git a/_maps/shuttles/hunter_psyker.dmm b/_maps/shuttles/hunter_psyker.dmm index 75296c5e5642e..311f5aac15fcf 100644 --- a/_maps/shuttles/hunter_psyker.dmm +++ b/_maps/shuttles/hunter_psyker.dmm @@ -4,6 +4,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/plating, /area/shuttle/hunter) +"ai" = ( +/obj/machinery/door/airlock/grunge{ + name = "Gear Storage" + }, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/mapping_helpers/airlock/access/all/hunter, +/turf/open/floor/iron/grimy, +/area/shuttle/hunter) "am" = ( /obj/structure/closet/secure_closet/freezer/meat/open, /obj/effect/decal/cleanable/dirt, @@ -40,6 +49,12 @@ /obj/machinery/light/directional/north, /turf/open/floor/engine, /area/shuttle/hunter) +"ch" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/structure/bedsheetbin, +/turf/open/floor/iron/grimy, +/area/shuttle/hunter) "cp" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, @@ -55,18 +70,33 @@ dir = 4 }, /area/shuttle/hunter) -"dq" = ( -/obj/effect/mob_spawn/ghost_role/human/fugitive/bounty/psyker/seer{ - dir = 8 +"dy" = ( +/obj/effect/turf_decal/tile/dark_blue/diagonal_edge, +/obj/structure/table/reinforced/plasmarglass, +/obj/item/binoculars{ + pixel_x = -1 }, -/turf/open/floor/engine, +/obj/item/knife/hunting{ + pixel_y = 3 + }, +/obj/item/megaphone, +/obj/item/pinpointer/shuttle{ + pixel_y = 7 + }, +/obj/item/clothing/glasses/thermal/monocle{ + pixel_y = 2 + }, +/turf/open/floor/iron/white/diagonal, /area/shuttle/hunter) -"eq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/structure/bedsheetbin, -/obj/machinery/light/dim/directional/south, -/turf/open/floor/iron/grimy, +"ek" = ( +/obj/effect/turf_decal/tile/dark_blue/diagonal_edge, +/obj/structure/table/reinforced/plasmarglass, +/obj/item/gun/ballistic/revolver/c38{ + pixel_y = 3 + }, +/obj/item/gun/ballistic/revolver/c38, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/white/diagonal, /area/shuttle/hunter) "eO" = ( /obj/machinery/light/cold/directional/west, @@ -86,6 +116,15 @@ /obj/effect/spawner/random/trash/food_packaging, /turf/open/floor/engine, /area/shuttle/hunter) +"fp" = ( +/obj/machinery/power/smes/engineering{ + charge = 1e+006 + }, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/shuttle/hunter) "gj" = ( /obj/structure/table/wood/fancy/blue, /obj/item/book/codex_gigas{ @@ -98,12 +137,13 @@ /obj/effect/turf_decal/box/white, /turf/open/floor/iron/dark/textured, /area/shuttle/hunter) -"gA" = ( -/obj/machinery/power/smes/engineering{ - charge = 1e+006 +"gB" = ( +/obj/machinery/door/airlock/grunge{ + name = "Intelligence Training Room" }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/mapping_helpers/airlock/access/all/hunter, /turf/open/floor/plating, /area/shuttle/hunter) "gE" = ( @@ -146,16 +186,6 @@ }, /turf/open/floor/catwalk_floor, /area/shuttle/hunter) -"gY" = ( -/obj/structure/curtain/bounty, -/turf/open/floor/grass, -/area/shuttle/hunter) -"ht" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 1 - }, -/turf/open/floor/grass, -/area/shuttle/hunter) "hE" = ( /obj/effect/mapping_helpers/broken_floor, /obj/item/trash/popcorn{ @@ -200,6 +230,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/plating, /area/shuttle/hunter) +"kl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/effect/mapping_helpers/airlock/access/all/hunter, +/turf/open/floor/plating, +/area/shuttle/hunter) "kN" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/generic, @@ -227,6 +266,10 @@ "lu" = ( /turf/open/floor/iron/kitchen/small, /area/shuttle/hunter) +"lA" = ( +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/plating, +/area/shuttle/hunter) "lD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/computer/slot_machine, @@ -237,11 +280,23 @@ /obj/effect/turf_decal/tile/dark_blue/diagonal_centre, /turf/open/floor/iron/white/diagonal, /area/shuttle/hunter) +"mc" = ( +/obj/machinery/fugitive_locator, +/turf/open/floor/iron/kitchen/small, +/area/shuttle/hunter) "mz" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/etherealball, /turf/open/floor/engine, /area/shuttle/hunter) +"mK" = ( +/obj/machinery/button/door/directional/west{ + id = "psyker_bridge"; + name = "Blast Door Control"; + req_access = list("hunter") + }, +/turf/open/floor/iron/kitchen/small, +/area/shuttle/hunter) "mP" = ( /obj/effect/mapping_helpers/broken_floor, /obj/item/storage/pill_bottle, @@ -274,14 +329,6 @@ /obj/structure/flora/bush/fullgrass/style_random, /turf/open/floor/grass, /area/shuttle/hunter) -"nB" = ( -/obj/machinery/door/airlock/grunge{ - name = "Intelligence Training Room" - }, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/plating, -/area/shuttle/hunter) "oL" = ( /obj/structure/lattice, /turf/template_noop, @@ -321,13 +368,6 @@ }, /turf/open/floor/glass, /area/shuttle/hunter) -"rn" = ( -/obj/machinery/door/airlock/grunge{ - name = "Sanctuary In The Garden Of Mind" - }, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/turf/open/floor/plating, -/area/shuttle/hunter) "rF" = ( /obj/structure/chair/office/light, /turf/open/floor/iron/kitchen/small, @@ -336,13 +376,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/shuttle/hunter) -"sn" = ( -/obj/machinery/door/airlock/grunge{ - name = "Fortune Telling" - }, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/turf/open/floor/carpet/black, -/area/shuttle/hunter) "sB" = ( /obj/machinery/light/small/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -354,12 +387,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/iron/grimy, /area/shuttle/hunter) -"td" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/east, -/obj/structure/sign/warning/vacuum/external/directional/east, -/turf/open/floor/iron/grimy, -/area/shuttle/hunter) "tH" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, @@ -375,6 +402,16 @@ /obj/effect/turf_decal/box/white, /turf/open/floor/iron/dark/textured, /area/shuttle/hunter) +"ud" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/grunge{ + name = "Office" + }, +/obj/effect/mapping_helpers/airlock/access/all/hunter, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/turf/open/floor/iron/grimy, +/area/shuttle/hunter) "ug" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/departments/restroom/directional/west, @@ -389,13 +426,10 @@ /obj/machinery/light/cold/directional/east, /turf/open/floor/carpet/black, /area/shuttle/hunter) -"vu" = ( -/obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/machinery/door/airlock/grunge{ - name = "Bridge" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron, +"vv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/vacuum/external/directional/east, +/turf/open/floor/iron/grimy, /area/shuttle/hunter) "vw" = ( /obj/effect/spawner/structure/window/reinforced/plasma, @@ -423,6 +457,11 @@ }, /turf/open/floor/iron/white/diagonal, /area/shuttle/hunter) +"wG" = ( +/obj/effect/mob_spawn/ghost_role/human/fugitive/psyker, +/obj/structure/curtain/bounty, +/turf/open/floor/engine, +/area/shuttle/hunter) "xa" = ( /obj/structure/cable, /obj/machinery/power/terminal{ @@ -459,13 +498,9 @@ }, /turf/open/floor/glass, /area/shuttle/hunter) -"xt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/turf/open/floor/plating, +"xF" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/kitchen/small, /area/shuttle/hunter) "yd" = ( /turf/template_noop, @@ -511,11 +546,6 @@ }, /turf/open/floor/glass, /area/shuttle/hunter) -"zX" = ( -/obj/structure/tank_dispenser/oxygen, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/shuttle/hunter) "zY" = ( /obj/effect/turf_decal/box/white, /obj/machinery/fugitive_capture/psyker, @@ -581,17 +611,6 @@ /obj/structure/fans/tiny, /turf/open/floor/carpet/black, /area/shuttle/hunter) -"Di" = ( -/obj/machinery/door/airlock/external/glass/ruin{ - id_tag = "psykerexternal" - }, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/shuttle/hunter) "Dw" = ( /obj/effect/turf_decal/tile/dark_blue/diagonal_centre, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -602,26 +621,36 @@ }, /turf/open/floor/iron/white/diagonal, /area/shuttle/hunter) -"Ea" = ( +"El" = ( +/obj/machinery/suit_storage_unit/pirate, +/obj/effect/turf_decal/box/white, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark/textured, +/area/shuttle/hunter) +"Fc" = ( /obj/machinery/door/airlock/grunge{ - name = "Gear Storage" + name = "Sanctuary In The Garden Of Mind" }, /obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/grimy, +/obj/effect/mapping_helpers/airlock/access/all/hunter, +/turf/open/floor/plating, /area/shuttle/hunter) -"En" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/reagent_containers/syringe/contraband, -/obj/machinery/light/broken/directional/east, -/turf/open/floor/iron, +"FN" = ( +/obj/item/storage/pill_bottle, +/obj/structure/closet/crate/bin, +/obj/effect/decal/cleanable/plastic, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/grimy, /area/shuttle/hunter) -"EM" = ( +"Gj" = ( /obj/machinery/door/airlock/grunge{ - name = "Gear Storage" + name = "Freezer" }, /obj/effect/mapping_helpers/airlock/cutaiwire, -/turf/open/floor/iron/grimy, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/mapping_helpers/airlock/access/all/hunter, +/turf/open/floor/iron/freezer, /area/shuttle/hunter) "Gv" = ( /obj/machinery/power/apc/auto_name/directional/west, @@ -662,6 +691,15 @@ /obj/structure/chair/comfy/carp, /turf/open/floor/glass, /area/shuttle/hunter) +"HH" = ( +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/machinery/door/airlock/grunge{ + name = "Bridge" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/mapping_helpers/airlock/access/all/hunter, +/turf/open/floor/iron, +/area/shuttle/hunter) "HI" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -707,13 +745,24 @@ /obj/machinery/iv_drip, /turf/open/floor/iron, /area/shuttle/hunter) -"Jz" = ( +"Js" = ( /obj/machinery/door/airlock/grunge{ - name = "Freezer" + name = "Fortune Telling" }, /obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/freezer, +/obj/machinery/button/curtain{ + id = "fortune_tell"; + name = "Fortune Telling Curtains"; + pixel_x = -24; + req_access = list("hunter") + }, +/obj/effect/mapping_helpers/airlock/access/all/hunter, +/turf/open/floor/carpet/black, +/area/shuttle/hunter) +"JZ" = ( +/obj/effect/mob_spawn/ghost_role/human/fugitive/psyker/captain, +/obj/structure/curtain/bounty, +/turf/open/floor/engine, /area/shuttle/hunter) "Kp" = ( /obj/structure/billboard/fortune_telling{ @@ -727,21 +776,6 @@ }, /turf/open/floor/plating/airless, /area/shuttle/hunter) -"LI" = ( -/obj/structure/rack, -/obj/item/megaphone, -/obj/item/storage/box/bodybags, -/obj/item/stack/package_wrap, -/obj/effect/turf_decal/box/white, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark/textured, -/area/shuttle/hunter) -"Mc" = ( -/obj/item/storage/pill_bottle, -/obj/structure/closet/crate/bin, -/obj/effect/decal/cleanable/plastic, -/turf/open/floor/iron/grimy, -/area/shuttle/hunter) "Me" = ( /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, @@ -781,12 +815,6 @@ /obj/structure/sign/departments/engineering/directional/south, /turf/open/floor/iron/dark/textured, /area/shuttle/hunter) -"NO" = ( -/obj/effect/mob_spawn/ghost_role/human/fugitive/psykers, -/obj/machinery/light/floor, -/obj/structure/curtain/bounty, -/turf/open/floor/engine, -/area/shuttle/hunter) "Oa" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, @@ -805,26 +833,6 @@ dir = 4 }, /area/shuttle/hunter) -"OS" = ( -/obj/machinery/door/airlock/grunge{ - name = "Fortune Telling" - }, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/machinery/button/curtain{ - id = "fortune_tell"; - name = "Fortune Telling Curtains"; - pixel_x = -24 - }, -/turf/open/floor/carpet/black, -/area/shuttle/hunter) -"Ph" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/turf/open/floor/plating, -/area/shuttle/hunter) "Pv" = ( /obj/machinery/suit_storage_unit/pirate, /obj/effect/turf_decal/box/white, @@ -844,6 +852,14 @@ }, /turf/open/floor/plating/airless, /area/shuttle/hunter) +"PC" = ( +/obj/structure/rack, +/obj/item/megaphone, +/obj/item/storage/box/bodybags, +/obj/item/stack/package_wrap, +/obj/effect/turf_decal/box/white, +/turf/open/floor/iron/dark/textured, +/area/shuttle/hunter) "PD" = ( /obj/structure/rack, /obj/item/clothing/shoes/laceup{ @@ -883,11 +899,12 @@ /obj/effect/decal/cleanable/robot_debris/up, /turf/open/floor/plating, /area/shuttle/hunter) -"RA" = ( -/obj/effect/turf_decal/tile/dark_blue/diagonal_centre, -/obj/machinery/light/cold/directional/south, -/obj/item/statuebust, -/turf/open/floor/iron/white/diagonal, +"RK" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/grass, /area/shuttle/hunter) "RZ" = ( /obj/effect/decal/cleanable/dirt, @@ -911,11 +928,10 @@ /obj/item/multitool, /turf/open/floor/plating, /area/shuttle/hunter) -"Te" = ( -/obj/machinery/suit_storage_unit/pirate, -/obj/effect/turf_decal/box/white, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, +"SX" = ( +/obj/structure/curtain/bounty, +/obj/machinery/light/floor, +/turf/open/floor/grass, /area/shuttle/hunter) "Tj" = ( /obj/effect/decal/cleanable/vomit/old, @@ -928,6 +944,18 @@ /obj/effect/decal/cleanable/garbage, /turf/open/floor/plating, /area/shuttle/hunter) +"Tp" = ( +/obj/machinery/door/airlock/external/glass/ruin{ + id_tag = "psykerexternal" + }, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/all/hunter, +/turf/open/floor/plating, +/area/shuttle/hunter) "Tw" = ( /obj/effect/turf_decal/arrows{ dir = 4; @@ -935,24 +963,20 @@ }, /turf/open/floor/iron/dark/textured, /area/shuttle/hunter) -"TL" = ( -/obj/machinery/button/door/directional/east{ - id = "psykerexternal"; - name = "External Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 +"UI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance" }, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/iron/grimy, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/effect/mapping_helpers/airlock/access/all/hunter, +/turf/open/floor/plating, /area/shuttle/hunter) -"Ui" = ( -/obj/effect/turf_decal/tile/dark_blue/diagonal_edge, -/obj/structure/table/reinforced/plasmarglass, -/obj/item/gun/ballistic/revolver/c38{ - pixel_y = 3 +"Vc" = ( +/obj/machinery/door/airlock/grunge{ + name = "Fortune Telling" }, -/obj/item/gun/ballistic/revolver/c38, -/turf/open/floor/iron/white/diagonal, +/turf/open/floor/carpet/black, /area/shuttle/hunter) "Vi" = ( /obj/effect/decal/cleanable/food/egg_smudge, @@ -977,12 +1001,6 @@ /obj/machinery/light/floor, /turf/open/floor/catwalk_floor, /area/shuttle/hunter) -"Wy" = ( -/obj/effect/mob_spawn/ghost_role/human/fugitive/psykers/captain, -/obj/machinery/light/floor, -/obj/structure/curtain/bounty, -/turf/open/floor/engine, -/area/shuttle/hunter) "WL" = ( /obj/machinery/atmospherics/components/tank/air{ dir = 1 @@ -998,12 +1016,17 @@ }, /turf/open/floor/iron, /area/shuttle/hunter) -"Xa" = ( -/obj/machinery/button/door/directional/west{ - id = "psyker_bridge"; - name = "Blast Door Control" +"WV" = ( +/obj/machinery/door/airlock/external/glass/ruin{ + id_tag = "psykerexternal" }, -/turf/open/floor/iron/kitchen/small, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/hunter, +/turf/open/floor/plating, /area/shuttle/hunter) "Xk" = ( /obj/structure/closet/crate/cardboard, @@ -1017,6 +1040,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/freezer, /area/shuttle/hunter) +"Xy" = ( +/obj/machinery/door/airlock/grunge{ + name = "Gear Storage" + }, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/effect/mapping_helpers/airlock/access/all/hunter, +/turf/open/floor/iron/grimy, +/area/shuttle/hunter) "XX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/iron/kitchen/small, @@ -1026,44 +1057,27 @@ /obj/effect/decal/cleanable/glass, /turf/open/floor/plating, /area/shuttle/hunter) -"Ys" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/grunge{ - name = "Office" +"Yy" = ( +/obj/machinery/button/door/directional/east{ + id = "psykerexternal"; + name = "External Bolt Control"; + normaldoorcontrol = 1; + req_access = list("hunter"); + specialfunctions = 4 }, +/obj/effect/decal/cleanable/generic, /turf/open/floor/iron/grimy, /area/shuttle/hunter) -"Zb" = ( -/obj/machinery/door/airlock/external/glass/ruin{ - id_tag = "psykerexternal" - }, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/shuttle/hunter) "ZC" = ( /obj/effect/turf_decal/tile/dark_blue/diagonal_centre, /obj/item/statuebust, /turf/open/floor/iron/white/diagonal, /area/shuttle/hunter) -"ZW" = ( -/obj/effect/turf_decal/tile/dark_blue/diagonal_edge, -/obj/structure/table/reinforced/plasmarglass, -/obj/item/binoculars{ - pixel_x = -1 - }, -/obj/item/knife/hunting{ - pixel_y = 3 - }, -/obj/item/megaphone, -/obj/item/clothing/glasses/thermal/monocle{ - pixel_y = 2 +"ZK" = ( +/obj/effect/mob_spawn/ghost_role/human/fugitive/psyker/seer{ + dir = 8 }, -/turf/open/floor/iron/white/diagonal, +/turf/open/floor/engine, /area/shuttle/hunter) (1,1,1) = {" @@ -1181,7 +1195,7 @@ yd CW Tw lu -Xa +mK bK XX CW @@ -1207,9 +1221,9 @@ Nw oL CW zY -lu -lu -LI +xF +mc +PC XX CW am @@ -1237,13 +1251,13 @@ CW CW CW CW -vu +HH na Ne Mk QI CW -ZW +dy ZC ws CW @@ -1266,13 +1280,13 @@ kN mP Vw na -Jz +Gj na na CW lI yg -RA +ZC CW yd Pz @@ -1299,7 +1313,7 @@ bV CW GT Dw -Ui +ek CW yd Pz @@ -1323,10 +1337,10 @@ PT Oa bx fd -Ea +ai Id yg -RA +ZC CW oL Pz @@ -1343,14 +1357,14 @@ yd CW HO PS -En +Ja Vi cp aV Ja Ss HI -EM +Xy mR lI gE @@ -1372,9 +1386,9 @@ na na na na -nB +gB na -dq +ZK BZ CW CW @@ -1421,7 +1435,7 @@ oL Nw CW Nn -NO +wG qa nq Nn @@ -1448,8 +1462,8 @@ pO Nw CW Nn -Wy -ht +JZ +RK Me Nn na @@ -1457,13 +1471,13 @@ Hd na sB RZ -OS +Js qz Hq xs oN qz -sn +Vc Ck Ck De @@ -1475,7 +1489,7 @@ gW Nw CW Nn -NO +wG no ys Nn @@ -1504,12 +1518,12 @@ CW Nn Nn Nn -gY +SX Nn na jB na -Ys +ud na na Nn @@ -1531,13 +1545,13 @@ CW CW CW CW -rn +Fc na na cM gl sW -eq +ch na na na @@ -1565,7 +1579,7 @@ Tj cM uy Ik -Te +El NL na Gv @@ -1587,17 +1601,17 @@ yd CW Oc nk -xt +UI Ik AZ lD sW sW uy -Ph +kl js nc -gA +fp CW Ww Nw @@ -1615,14 +1629,14 @@ CW AH SI na -Mc -td +FN +vv Ik -TL +Yy Ik Pv na -zX +lA pf xa CW @@ -1644,9 +1658,9 @@ xp CW CW CW -Di +WV CW -Di +WV CW CW xp @@ -1698,9 +1712,9 @@ yd yd Nw CW -Zb +Tp CW -Zb +Tp CW Nw yd diff --git a/_maps/shuttles/hunter_russian.dmm b/_maps/shuttles/hunter_russian.dmm index 052e568351da4..248235bd7722d 100644 --- a/_maps/shuttles/hunter_russian.dmm +++ b/_maps/shuttles/hunter_russian.dmm @@ -9,18 +9,6 @@ }, /turf/open/floor/pod/dark, /area/shuttle/hunter/russian) -"bg" = ( -/obj/effect/turf_decal/bot, -/obj/structure/closet/crate/secure/weapon{ - name = "surplus crate" - }, -/obj/item/ammo_box/a762, -/obj/item/ammo_box/a762, -/obj/item/ammo_box/a762, -/obj/item/ammo_box/a762, -/obj/machinery/light/small/directional/west, -/turf/open/floor/pod/dark, -/area/shuttle/hunter/russian) "bi" = ( /obj/machinery/computer/shuttle/hunter{ dir = 8 @@ -89,20 +77,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/shuttle/hunter/russian) -"fa" = ( -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/structure/sign/poster/contraband/communist_state/directional/west, -/turf/open/floor/pod/dark, -/area/shuttle/hunter/russian) -"fN" = ( -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/fugitive_capture, -/obj/structure/sign/poster/contraband/bountyhunters/directional/west, -/turf/open/floor/pod/dark, -/area/shuttle/hunter/russian) "gp" = ( /obj/machinery/airalarm/directional/east, /obj/effect/mapping_helpers/airalarm/all_access, @@ -123,57 +97,51 @@ /obj/structure/sign/poster/contraband/soviet_propaganda/directional/west, /turf/open/floor/mineral/plastitanium, /area/shuttle/hunter/russian) -"gU" = ( -/obj/machinery/door/airlock/external/glass/ruin{ - id_tag = "russia_ship_bolt_n" - }, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/locked, -/turf/open/floor/pod/light, +"hm" = ( +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/fugitive_capture, +/obj/structure/sign/poster/contraband/bountyhunters/directional/west, +/turf/open/floor/pod/dark, /area/shuttle/hunter/russian) "ho" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/mineral/plastitanium, /area/shuttle/hunter/russian) +"iM" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/cardboard, +/obj/item/storage/box/drinkingglasses, +/obj/effect/decal/cleanable/dirt, +/obj/item/reagent_containers/cup/glass/bottle/vodka, +/obj/item/reagent_containers/cup/glass/bottle/vodka, +/obj/item/reagent_containers/cup/glass/bottle/vodka, +/obj/item/reagent_containers/cup/glass/bottle/vodka, +/obj/item/crowbar/large/old, +/obj/item/lighter/greyscale, +/turf/open/floor/pod/dark, +/area/shuttle/hunter/russian) "iV" = ( /turf/template_noop, /area/template_noop) -"jL" = ( -/obj/machinery/light/small/directional/south, +"ke" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/dirt, /obj/structure/rack, /obj/item/binoculars, +/obj/item/pinpointer/shuttle, /obj/machinery/button/door/directional/south{ id = "russia_ship_bolt_s"; name = "External Bolt Control"; normaldoorcontrol = 1; + req_access = list("hunter"); specialfunctions = 4 }, /turf/open/floor/mineral/plastitanium, /area/shuttle/hunter/russian) -"jO" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Ship Support Systems" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/turf/open/floor/pod/light, -/area/shuttle/hunter/russian) -"kL" = ( -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/obj/structure/kitchenspike, -/turf/open/floor/pod/dark, -/area/shuttle/hunter/russian) "lx" = ( /obj/structure/table, /obj/effect/turf_decal/siding/red{ @@ -200,14 +168,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/mineral/plastitanium, /area/shuttle/hunter/russian) -"pB" = ( -/obj/machinery/door/airlock/external/glass/ruin{ - id_tag = "russia_ship_bolt_s" +"pg" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate/secure/weapon{ + name = "surplus crate" }, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/mapping_helpers/airlock/locked, -/turf/open/floor/pod/light, +/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/strilka310, +/turf/open/floor/pod/dark, /area/shuttle/hunter/russian) "qF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -218,6 +188,17 @@ /obj/machinery/meter, /turf/open/floor/pod/dark, /area/shuttle/hunter/russian) +"rB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/machinery/door/airlock/security/glass{ + name = "Cockpit Access" + }, +/obj/effect/mapping_helpers/airlock/access/all/hunter, +/turf/open/floor/pod/light, +/area/shuttle/hunter/russian) "sR" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -230,16 +211,25 @@ "tj" = ( /turf/open/floor/mineral/plastitanium, /area/shuttle/hunter/russian) -"uc" = ( +"tm" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Cargo Hold Access" + }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, /obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/machinery/door/airlock/security/glass{ - name = "Cockpit Access" - }, +/obj/effect/mapping_helpers/airlock/access/all/hunter, /turf/open/floor/pod/light, /area/shuttle/hunter/russian) +"uT" = ( +/obj/machinery/suit_storage_unit/standard_unit{ + mask_type = /obj/item/clothing/mask/gas; + storage_type = /obj/item/tank/internals/oxygen/yellow + }, +/obj/effect/turf_decal/siding/red, +/turf/open/floor/pod/dark, +/area/shuttle/hunter/russian) "vZ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -247,11 +237,16 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/hunter/russian) -"wz" = ( -/obj/effect/turf_decal/bot, -/obj/structure/reagent_dispensers/watertank, -/obj/machinery/light/small/directional/west, -/obj/item/soap, +"wB" = ( +/obj/effect/turf_decal/siding/red{ + dir = 1 + }, +/obj/structure/mirror/directional/south, +/obj/structure/dresser, +/obj/item/razor{ + pixel_x = 5; + pixel_y = 8 + }, /turf/open/floor/pod/dark, /area/shuttle/hunter/russian) "wF" = ( @@ -268,14 +263,26 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/shuttle/hunter/russian) -"ya" = ( +"xf" = ( /obj/machinery/door/airlock/security/glass{ - name = "Cargo Hold Access" + name = "Crew Storage" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, /obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/effect/mapping_helpers/airlock/access/all/hunter, +/turf/open/floor/pod/light, +/area/shuttle/hunter/russian) +"xE" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Cockpit Access" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/effect/mapping_helpers/airlock/access/all/hunter, /turf/open/floor/pod/light, /area/shuttle/hunter/russian) "yo" = ( @@ -299,22 +306,17 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/pod/dark, /area/shuttle/hunter/russian) -"zr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +"zk" = ( +/obj/machinery/door/airlock/external/glass/ruin{ + id_tag = "russia_ship_bolt_n" }, -/obj/structure/rack, -/obj/item/wrench, -/obj/item/crowbar, -/obj/machinery/button/door/directional/north{ - id = "russia_ship_bolt_n"; - name = "External Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 }, -/turf/open/floor/mineral/plastitanium, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/access/all/hunter, +/turf/open/floor/pod/light, /area/shuttle/hunter/russian) "zQ" = ( /obj/machinery/atmospherics/components/tank/air, @@ -329,18 +331,7 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/hunter/russian) -"CB" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/effect/turf_decal/siding/red{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, -/area/shuttle/hunter/russian) -"Dh" = ( -/obj/machinery/light/small/directional/north, +"Cu" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -351,32 +342,64 @@ desc = "A large wood and steel-reinforced crate."; name = "voytek's crate" }, -/mob/living/simple_animal/hostile/bear{ +/mob/living/basic/bear{ desc = "A very friendly yet still extremely menacing space-bear. Comrade until the end."; name = "Voytek" }, /obj/machinery/firealarm/directional/north, /turf/open/floor/mineral/plastitanium, /area/shuttle/hunter/russian) +"CB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/turf_decal/siding/red{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/shuttle/hunter/russian) "Dr" = ( /obj/effect/turf_decal/siding/red/corner{ dir = 8 }, /turf/closed/wall/mineral/titanium/survival, /area/shuttle/hunter/russian) -"DK" = ( -/obj/effect/turf_decal/bot, +"Du" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/cardboard, -/obj/item/storage/box/drinkingglasses, -/obj/machinery/light/small/directional/west, +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/rack, +/obj/item/wrench, +/obj/item/crowbar, +/obj/machinery/button/door/directional/north{ + id = "russia_ship_bolt_n"; + name = "External Bolt Control"; + normaldoorcontrol = 1; + req_access = list("hunter"); + specialfunctions = 4 + }, +/obj/item/soap, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter/russian) +"Dw" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate, /obj/effect/decal/cleanable/dirt, -/obj/item/reagent_containers/cup/glass/bottle/vodka, -/obj/item/reagent_containers/cup/glass/bottle/vodka, -/obj/item/reagent_containers/cup/glass/bottle/vodka, -/obj/item/reagent_containers/cup/glass/bottle/vodka, -/obj/item/crowbar/large/old, -/obj/item/lighter/greyscale, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/item/crowbar, +/obj/item/crowbar, /turf/open/floor/pod/dark, /area/shuttle/hunter/russian) "Ej" = ( @@ -408,20 +431,6 @@ }, /turf/open/floor/plating, /area/shuttle/hunter/russian) -"FG" = ( -/obj/effect/turf_decal/bot, -/obj/structure/closet/crate, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/effect/decal/cleanable/dirt, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/item/crowbar, -/obj/item/crowbar, -/turf/open/floor/pod/dark, -/area/shuttle/hunter/russian) "FK" = ( /obj/machinery/light/small/directional/south, /obj/effect/turf_decal/stripes/line, @@ -441,6 +450,11 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/hunter/russian) +"GF" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/fugitive_locator, +/turf/open/floor/pod/dark, +/area/shuttle/hunter/russian) "IV" = ( /obj/structure/table, /obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ @@ -482,30 +496,6 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/hunter/russian) -"JS" = ( -/obj/docking_port/mobile{ - shuttle_id = "huntership"; - movement_force = list("KNOCKDOWN"=0,"THROW"=0); - name = "hunter shuttle"; - rechargeTime = 1800 - }, -/obj/docking_port/stationary{ - dwidth = 11; - height = 16; - shuttle_id = "pirate_home"; - name = "Deep Space"; - width = 17 - }, -/obj/machinery/door/airlock/external/glass/ruin{ - id_tag = "russia_ship_bolt_s" - }, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/locked, -/turf/open/floor/plating, -/area/shuttle/hunter/russian) "JU" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/loading_area{ @@ -513,19 +503,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/shuttle/hunter/russian) -"Ke" = ( -/obj/effect/turf_decal/siding/red{ - dir = 1 - }, -/obj/structure/mirror/directional/south, -/obj/structure/dresser, -/obj/item/razor{ - pixel_x = 5; - pixel_y = 8 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/pod/dark, -/area/shuttle/hunter/russian) "Lg" = ( /obj/structure/chair/comfy/shuttle{ dir = 4 @@ -540,11 +517,29 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/shuttle/hunter/russian) +"LD" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/structure/kitchenspike, +/turf/open/floor/pod/dark, +/area/shuttle/hunter/russian) "LQ" = ( /obj/effect/turf_decal/siding/red, /obj/effect/decal/cleanable/generic, /turf/open/floor/pod/dark, /area/shuttle/hunter/russian) +"LT" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Ship Support Systems" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/effect/mapping_helpers/airlock/access/all/hunter, +/turf/open/floor/pod/light, +/area/shuttle/hunter/russian) "LW" = ( /obj/effect/spawner/structure/window/survival_pod, /turf/open/floor/plating, @@ -561,7 +556,17 @@ /obj/effect/mapping_helpers/airalarm/all_access, /turf/open/floor/pod/dark, /area/shuttle/hunter/russian) -"Nr" = ( +"Nk" = ( +/obj/machinery/door/airlock/external/glass/ruin{ + id_tag = "russia_ship_bolt_n" + }, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/access/all/hunter, +/turf/open/floor/plating, +/area/shuttle/hunter/russian) +"Rg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -569,17 +574,9 @@ /obj/machinery/door/airlock/security/glass{ name = "Cargo Hold Access" }, +/obj/effect/mapping_helpers/airlock/access/all/hunter, /turf/open/floor/pod/light, /area/shuttle/hunter/russian) -"QG" = ( -/obj/machinery/door/airlock/external/glass/ruin{ - id_tag = "russia_ship_bolt_n" - }, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/mapping_helpers/airlock/locked, -/turf/open/floor/plating, -/area/shuttle/hunter/russian) "Se" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -606,16 +603,6 @@ /obj/structure/sign/poster/contraband/kss13/directional/south, /turf/open/floor/pod/dark, /area/shuttle/hunter/russian) -"Ut" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Crew Storage" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/turf/open/floor/pod/light, -/area/shuttle/hunter/russian) "Uu" = ( /obj/effect/turf_decal/siding/red{ dir = 1 @@ -626,7 +613,7 @@ /obj/effect/decal/cleanable/dirt, /obj/item/gun/ballistic/automatic/pistol, /obj/item/ammo_box/magazine/m9mm, -/obj/item/ammo_box/a762, +/obj/item/ammo_box/strilka310, /obj/item/crowbar, /turf/open/floor/pod/dark, /area/shuttle/hunter/russian) @@ -650,13 +637,22 @@ /obj/effect/decal/cleanable/ash, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/hunter/russian) -"Ww" = ( -/obj/machinery/suit_storage_unit/standard_unit{ - mask_type = /obj/item/clothing/mask/gas; - storage_type = /obj/item/tank/internals/oxygen/yellow +"Vu" = ( +/obj/machinery/door/airlock/external/glass/ruin{ + id_tag = "russia_ship_bolt_s" }, -/obj/effect/turf_decal/siding/red, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/access/all/hunter, +/turf/open/floor/pod/light, +/area/shuttle/hunter/russian) +"VA" = ( /obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/structure/sign/poster/contraband/communist_state/directional/west, /turf/open/floor/pod/dark, /area/shuttle/hunter/russian) "WG" = ( @@ -673,16 +669,6 @@ /obj/effect/mapping_helpers/airalarm/all_access, /turf/open/floor/plating, /area/shuttle/hunter/russian) -"WL" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Cockpit Access" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/turf/open/floor/pod/light, -/area/shuttle/hunter/russian) "Xu" = ( /obj/effect/turf_decal/bot, /obj/structure/closet/crate/medical, @@ -697,6 +683,31 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/hunter/russian) +"Ym" = ( +/obj/docking_port/mobile{ + movement_force = list("KNOCKDOWN"=0,"THROW"=0); + name = "hunter shuttle"; + rechargeTime = 1800; + shuttle_id = "huntership" + }, +/obj/docking_port/stationary{ + dwidth = 11; + height = 16; + name = "Deep Space"; + shuttle_id = "pirate_home"; + width = 17 + }, +/obj/machinery/door/airlock/external/glass/ruin{ + id_tag = "russia_ship_bolt_s" + }, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/access/all/hunter, +/turf/open/floor/plating, +/area/shuttle/hunter/russian) "Ys" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 @@ -768,12 +779,12 @@ EK EK Me Me -fa -DK +VA +iM Xu -FG -bg -fN +Dw +pg +hm Me Me EK @@ -785,14 +796,14 @@ Me zQ qF LW -kL +LD tj Gh Zf Gh ho JU -wz +GF LW xd yr @@ -802,7 +813,7 @@ Me Me Fy sR -jO +LT Gu Gu bK @@ -811,7 +822,7 @@ XW cZ XW XW -Ut +xf SL eQ Me @@ -840,12 +851,12 @@ Jh LQ Me Me -ya +tm Me LW LW Me -Nr +Rg Me Me MO @@ -857,14 +868,14 @@ Me Me Me Me -Dh +Cu XW Me iV iV Me XW -jL +ke Me Me Me @@ -872,9 +883,9 @@ Me "} (9,1,1) = {" iV -QG +Nk Se -gU +zk Aq cU LW @@ -883,9 +894,9 @@ iV LW cU vZ -pB +Vu bO -JS +Ym iV "} (10,1,1) = {" @@ -893,7 +904,7 @@ iV Me Me Me -zr +Du UV Me iV @@ -912,12 +923,12 @@ iV iV Me Me -WL +xE Me LW LW Me -uc +rB Me Me iV @@ -929,14 +940,14 @@ iV iV iV Me -Ww +uT XW Ys pa pa gv XW -Ke +wB Me iV iV diff --git a/_maps/shuttles/hunter_space_cop.dmm b/_maps/shuttles/hunter_space_cop.dmm index 0206f0fd92288..50e2093174d08 100644 --- a/_maps/shuttles/hunter_space_cop.dmm +++ b/_maps/shuttles/hunter_space_cop.dmm @@ -13,36 +13,6 @@ }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/hunter) -"ac" = ( -/obj/structure/fans/tiny, -/obj/docking_port/stationary{ - dir = 4; - dwidth = 3; - height = 12; - shuttle_id = "huntership_home"; - name = "Deep Space"; - width = 7 - }, -/obj/docking_port/mobile{ - dir = 4; - shuttle_id = "huntership"; - name = "hunter shuttle"; - rechargeTime = 1800 - }, -/obj/machinery/door/poddoor/shutters{ - id = "Interpolship" - }, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/hunter) -"ae" = ( -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/obj/machinery/button/door/directional/north{ - id = "Interpolship" - }, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/hunter) "af" = ( /obj/effect/turf_decal/stripes{ dir = 8 @@ -51,6 +21,7 @@ /area/shuttle/hunter) "ag" = ( /obj/effect/turf_decal/delivery, +/obj/machinery/fugitive_locator, /turf/open/floor/mineral/titanium/blue, /area/shuttle/hunter) "ah" = ( @@ -64,16 +35,6 @@ /obj/effect/turf_decal/box, /turf/open/floor/mineral/titanium/blue, /area/shuttle/hunter) -"ak" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/effect/mob_spawn/ghost_role/human/fugitive/spacepol{ - dir = 1 - }, -/obj/effect/turf_decal/box, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/hunter) "al" = ( /obj/effect/turf_decal/stripes{ dir = 8 @@ -87,12 +48,30 @@ /obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/titanium/blue, /area/shuttle/hunter) +"dJ" = ( +/obj/machinery/light/directional/south, +/obj/structure/closet/crate/eva, +/obj/effect/turf_decal/box, +/obj/item/pinpointer/shuttle, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"gc" = ( +/obj/machinery/door/airlock/titanium, +/obj/effect/mapping_helpers/airlock/access/all/hunter, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) "hB" = ( /obj/machinery/power/shuttle_engine/propulsion{ dir = 8 }, /turf/closed/wall/mineral/titanium, /area/shuttle/hunter) +"jc" = ( +/obj/structure/chair/comfy/shuttle, +/obj/machinery/light/small/directional/north, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) "ku" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/hunter) @@ -100,10 +79,6 @@ /obj/machinery/fugitive_capture, /turf/open/floor/mineral/titanium/blue, /area/shuttle/hunter) -"rR" = ( -/obj/machinery/door/airlock/titanium, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/hunter) "te" = ( /obj/structure/fans/tiny, /obj/machinery/door/poddoor/shutters{ @@ -111,6 +86,13 @@ }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/hunter) +"tW" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) "Am" = ( /obj/effect/mob_spawn/ghost_role/human/fugitive/spacepol{ dir = 8 @@ -122,15 +104,47 @@ /obj/effect/spawner/structure/window/reinforced/shuttle, /turf/open/floor/plating, /area/shuttle/hunter) -"Pq" = ( -/turf/template_noop, -/area/template_noop) -"Rz" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 +"Bn" = ( +/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) +"CF" = ( +/obj/structure/fans/tiny, +/obj/docking_port/stationary{ + dir = 4; + dwidth = 3; + height = 12; + name = "Deep Space"; + shuttle_id = "huntership_home"; + width = 7 + }, +/obj/docking_port/mobile{ + dir = 4; + name = "hunter shuttle"; + rechargeTime = 1800; + shuttle_id = "huntership" + }, +/obj/machinery/door/poddoor/shutters{ + id = "Interpolship" + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"Jv" = ( +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/machinery/button/door/directional/north{ + id = "Interpolship"; + req_access = list("hunter") + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"Pq" = ( +/turf/template_noop, +/area/template_noop) "RO" = ( /turf/open/floor/mineral/titanium/blue, /area/shuttle/hunter) @@ -139,7 +153,7 @@ Pq ku te -ac +CF te ku Pq @@ -147,7 +161,7 @@ Pq (2,1,1) = {" Pq ku -ae +Jv al af ku @@ -158,16 +172,16 @@ Pq ku bY RO -ak +Bn ku Pq "} (4,1,1) = {" hB ku -bY +jc RO -ak +Bn ku hB "} @@ -176,7 +190,7 @@ ku ku bY RO -ak +Bn ku ku "} @@ -203,7 +217,7 @@ Pq ku lp RO -aj +dJ ku Pq "} @@ -211,7 +225,7 @@ Pq hB ku ku -rR +gc ku ku hB @@ -220,7 +234,7 @@ hB ku ku RO -Rz +tW RO ku ku diff --git a/_maps/shuttles/infiltrator_advanced.dmm b/_maps/shuttles/infiltrator_advanced.dmm index 33e96b59470a5..83e13c63f3559 100644 --- a/_maps/shuttles/infiltrator_advanced.dmm +++ b/_maps/shuttles/infiltrator_advanced.dmm @@ -28,25 +28,6 @@ "af" = ( /turf/closed/wall/r_wall/syndicate, /area/shuttle/syndicate/bridge) -"ag" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/directional/west, -/obj/item/reagent_containers/cup/glass/bottle/whiskey{ - desc = "A bottle of whiskey. There's a label that reads 'tears' taped to the front."; - name = "Bottle of Tears"; - pixel_x = 3; - pixel_y = 5 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ - pixel_x = -7; - pixel_y = 10 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ - pixel_x = -7; - pixel_y = 4 - }, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/syndicate/bridge) "ah" = ( /obj/machinery/computer/camera_advanced/shuttle_docker/syndicate, /obj/effect/turf_decal/bot, @@ -77,14 +58,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/bridge) -"al" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/directional/east, -/obj/item/stack/cable_coil, -/obj/item/crowbar/red, -/obj/item/radio/headset/syndicate/alt, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/syndicate/bridge) "am" = ( /obj/machinery/computer/crew/syndie{ dir = 4 @@ -119,13 +92,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/bridge) -"ap" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1; - name = "tactical chair" - }, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/syndicate/bridge) "aq" = ( /obj/structure/table/reinforced, /obj/machinery/button/door{ @@ -176,23 +142,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/bridge) -"au" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8; - name = "tactical chair" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/auto_name/directional/south{ - area = "/area/shuttle/syndicate/bridge" - }, -/obj/effect/mapping_helpers/apc/cut_AI_wire, -/obj/effect/mapping_helpers/apc/syndicate_access, -/obj/structure/cable, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/syndicate/bridge) "av" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -226,20 +175,6 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/bridge) -"ay" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4; - name = "tactical chair" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/syndicate_access, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/syndicate/bridge) "az" = ( /obj/effect/turf_decal/bot, /obj/machinery/computer/monitor{ @@ -294,22 +229,6 @@ "aF" = ( /turf/closed/wall/r_wall/syndicate, /area/shuttle/syndicate/hallway) -"aG" = ( -/obj/effect/turf_decal/bot, -/obj/structure/table/reinforced, -/obj/machinery/light/directional/west, -/obj/item/paper_bin{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/pen, -/obj/item/toy/figure/syndie{ - pixel_x = 6; - pixel_y = 6 - }, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/syndicate/hallway) "aH" = ( /turf/closed/wall/r_wall/syndicate, /area/shuttle/syndicate/eva) @@ -384,31 +303,6 @@ /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/pod/dark, /area/shuttle/syndicate/eva) -"aS" = ( -/obj/effect/turf_decal/bot, -/obj/structure/table/reinforced, -/obj/machinery/light/directional/east, -/obj/item/storage/fancy/cigarettes/cigpack_syndicate{ - pixel_x = 8 - }, -/obj/item/lighter{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/lighter{ - pixel_x = -6; - pixel_y = -2 - }, -/obj/machinery/power/apc/auto_name/directional/north{ - area = "/area/shuttle/syndicate/hallway" - }, -/obj/effect/mapping_helpers/apc/cut_AI_wire, -/obj/effect/mapping_helpers/apc/syndicate_access, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/syndicate_access, -/obj/structure/cable, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/syndicate/hallway) "aU" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -468,21 +362,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/eva) -"ba" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/syndicate/hallway) "bb" = ( /obj/structure/reagent_dispensers/watertank, /obj/effect/turf_decal/bot, @@ -721,6 +600,7 @@ dir = 6 }, /obj/structure/cable, +/mob/living/simple_animal/bot/medbot/nukie, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/medical) "bA" = ( @@ -801,13 +681,6 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/eva) -"bL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/syndicate/medical) "bM" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -1013,11 +886,6 @@ /obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/pod/dark, /area/shuttle/syndicate/eva) -"ch" = ( -/obj/structure/table/reinforced, -/obj/item/storage/backpack/duffelbag/syndie/surgery, -/turf/open/floor/pod/dark, -/area/shuttle/syndicate/medical) "ci" = ( /obj/structure/table/reinforced, /obj/machinery/status_display/evac{ @@ -1071,16 +939,6 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/airlock) -"co" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/light/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/syndicate/airlock) "cp" = ( /obj/effect/turf_decal/bot, /obj/structure/rack, @@ -1489,15 +1347,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/eva) -"dn" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/light/directional/west, -/obj/structure/cable, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/syndicate/airlock) "do" = ( /obj/structure/sign/departments/engineering/directional/east, /obj/effect/turf_decal/bot, @@ -1602,17 +1451,6 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/armory) -"dz" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/light/directional/west, -/obj/machinery/status_display/evac{ - pixel_x = -32 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/healthanalyzer/advanced, -/turf/open/floor/pod/dark, -/area/shuttle/syndicate/medical) "dA" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -1679,15 +1517,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/medical) -"dG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/red/line, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/contraband/cc64k_ad/directional/north, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/syndicate/armory) "dH" = ( /obj/machinery/sleeper/syndie{ dir = 4 @@ -1711,28 +1540,6 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/armory) -"dJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/box/corners, -/obj/machinery/light/directional/west, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/syndicate/eva) -"dK" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/obj/structure/sign/warning/electric_shock/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/north, -/obj/structure/cable, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/syndicate/hallway) "dL" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -1828,17 +1635,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/pod/dark, /area/shuttle/syndicate/medical) -"dV" = ( -/obj/structure/table/reinforced, -/obj/item/bodypart/arm/left/robot{ - pixel_x = -6 - }, -/obj/item/bodypart/arm/right/robot{ - pixel_x = 6 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/pod/dark, -/area/shuttle/syndicate/medical) "dW" = ( /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/stripes/line, @@ -1864,16 +1660,6 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/armory) -"dZ" = ( -/obj/machinery/recharge_station, -/obj/effect/turf_decal/delivery, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/light/directional/east, -/obj/machinery/status_display/evac{ - pixel_x = 32 - }, -/turf/open/floor/pod/dark, -/area/shuttle/syndicate/armory) "ea" = ( /obj/structure/closet/syndicate/personal, /obj/effect/turf_decal/bot, @@ -1980,18 +1766,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/armory) -"ej" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/structure/cable, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/syndicate/eva) "ek" = ( /obj/machinery/door/airlock/hatch{ name = "Ordnance Storage" @@ -2111,6 +1885,237 @@ "ev" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/shuttle/syndicate/hallway) +"eE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/structure/cable, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/syndicate/eva) +"eM" = ( +/obj/machinery/suit_storage_unit/syndicate, +/obj/effect/turf_decal/box, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/south, +/turf/open/floor/pod/dark, +/area/shuttle/syndicate/eva) +"kf" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1; + name = "tactical chair" + }, +/obj/machinery/light/floor, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/syndicate/bridge) +"qC" = ( +/obj/structure/table/reinforced, +/obj/item/stack/cable_coil, +/obj/item/crowbar/red, +/obj/item/radio/headset/syndicate/alt, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/syndicate/bridge) +"th" = ( +/obj/structure/table/reinforced, +/obj/item/bodypart/arm/left/robot{ + pixel_x = -6 + }, +/obj/item/bodypart/arm/right/robot{ + pixel_x = 6 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/pod/dark, +/area/shuttle/syndicate/medical) +"tB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/red/line, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/cc64k_ad/directional/north, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/syndicate/armory) +"tP" = ( +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/structure/sign/warning/electric_shock/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/light/small/directional/north, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/syndicate/hallway) +"uB" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8; + name = "tactical chair" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc/auto_name/directional/south{ + area = "/area/shuttle/syndicate/bridge" + }, +/obj/effect/mapping_helpers/apc/cut_AI_wire, +/obj/effect/mapping_helpers/apc/syndicate_access, +/obj/structure/cable, +/obj/machinery/light/floor, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/syndicate/bridge) +"xc" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4; + name = "tactical chair" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/airalarm/directional/south, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/light/floor, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/syndicate/bridge) +"Am" = ( +/obj/effect/turf_decal/bot, +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/pen, +/obj/item/toy/figure/syndie{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/syndicate/hallway) +"DL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/box/corners, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/syndicate/eva) +"JF" = ( +/obj/machinery/recharge_station, +/obj/effect/turf_decal/delivery, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/status_display/evac{ + pixel_x = 32 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/pod/dark, +/area/shuttle/syndicate/armory) +"KJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/small/directional/west, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/syndicate/medical) +"NE" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/cup/glass/bottle/whiskey{ + desc = "A bottle of whiskey. There's a label that reads 'tears' taped to the front."; + name = "Bottle of Tears"; + pixel_x = 3; + pixel_y = 5 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_x = -7; + pixel_y = 10 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_x = -7; + pixel_y = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/syndicate/bridge) +"OA" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/cable, +/obj/machinery/light/floor, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/syndicate/hallway) +"Pv" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/light/directional/west, +/obj/machinery/status_display/evac{ + pixel_x = -32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/healthanalyzer/advanced, +/turf/open/floor/pod/dark, +/area/shuttle/syndicate/medical) +"TT" = ( +/obj/structure/table/reinforced, +/obj/item/storage/backpack/duffelbag/syndie/surgery, +/turf/open/floor/pod/dark, +/area/shuttle/syndicate/medical) +"WC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/cable, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/syndicate/airlock) +"Xl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/syndicate/airlock) +"YW" = ( +/obj/effect/turf_decal/bot, +/obj/structure/table/reinforced, +/obj/item/storage/fancy/cigarettes/cigpack_syndicate{ + pixel_x = 8 + }, +/obj/item/lighter{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/lighter{ + pixel_x = -6; + pixel_y = -2 + }, +/obj/machinery/power/apc/auto_name/directional/north{ + area = "/area/shuttle/syndicate/hallway" + }, +/obj/effect/mapping_helpers/apc/cut_AI_wire, +/obj/effect/mapping_helpers/apc/syndicate_access, +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/obj/structure/cable, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/syndicate/hallway) (1,1,1) = {" ad @@ -2196,8 +2201,8 @@ bl bA by bH -bL -dz +KJ +Pv dD dT bn @@ -2236,7 +2241,7 @@ aO aI aP bC -dn +WC dt bh br @@ -2244,8 +2249,8 @@ cc bJ bN bW -ch -dV +TT +th cx cB cP @@ -2298,16 +2303,16 @@ ad "} (9,1,1) = {" ab -ag +NE an -au +uB aF aF aW ce dR bi -dJ +DL bG dP dR @@ -2325,7 +2330,7 @@ ah ao av aF -aG +Am aY aQ aX @@ -2345,19 +2350,19 @@ ad (11,1,1) = {" ab aj -ap +kf aw aA aM -ba +OA cd dm dm bk bK -bi +eM aH -dK +tP cb ee cs @@ -2371,7 +2376,7 @@ ak aq ax aF -aS +YW bc aQ aZ @@ -2390,16 +2395,16 @@ ad "} (13,1,1) = {" ab -al +qC ar -ay +xc aF aF be ce dR bS -ej +eE de cg dR @@ -2466,7 +2471,7 @@ aO bu bx cm -co +Xl do dw dy @@ -2492,7 +2497,7 @@ bZ aJ aO cF -dG +tB dj da eg @@ -2519,7 +2524,7 @@ bY dL dS eh -dZ +JF eb eu cG diff --git a/_maps/shuttles/infiltrator_basic.dmm b/_maps/shuttles/infiltrator_basic.dmm index e7a9797bf368b..ca3da37f63bab 100644 --- a/_maps/shuttles/infiltrator_basic.dmm +++ b/_maps/shuttles/infiltrator_basic.dmm @@ -54,19 +54,6 @@ /obj/machinery/computer/camera_advanced/syndie, /turf/open/floor/iron/dark, /area/shuttle/syndicate/bridge) -"am" = ( -/obj/machinery/button/door{ - id = "syndieshutters"; - name = "Cockpit View Control"; - req_access = list("syndicate"); - pixel_y = 24 - }, -/obj/item/aicard, -/obj/structure/table/reinforced/plastitaniumglass, -/turf/open/floor/iron/dark/smooth_corner{ - dir = 8 - }, -/area/shuttle/syndicate/bridge) "ao" = ( /obj/structure/chair/office/tactical{ dir = 8 @@ -226,10 +213,6 @@ "bc" = ( /turf/open/floor/iron/dark, /area/shuttle/syndicate/airlock) -"bd" = ( -/obj/structure/sign/warning/vacuum/external, -/turf/closed/wall/r_wall/syndicate, -/area/shuttle/syndicate/airlock) "be" = ( /obj/machinery/suit_storage_unit/syndicate, /obj/effect/turf_decal/bot_red, @@ -262,17 +245,6 @@ "bn" = ( /turf/closed/wall/r_wall/syndicate, /area/shuttle/syndicate/engineering) -"bo" = ( -/obj/item/toy/plush/carpplushie{ - pixel_x = 6; - pixel_y = 9 - }, -/obj/item/toy/figure/syndie{ - pixel_y = -2; - pixel_x = 11 - }, -/turf/open/floor/fakespace, -/area/shuttle/syndicate/hallway) "bq" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/cup/beaker/large{ @@ -294,7 +266,7 @@ /area/shuttle/syndicate/medical) "bs" = ( /obj/machinery/light/directional/north, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, /obj/effect/turf_decal/siding/thinplating_new{ dir = 4 @@ -504,14 +476,6 @@ }, /turf/open/floor/iron/dark/textured, /area/shuttle/syndicate/engineering) -"cf" = ( -/obj/item/storage/toolbox/syndicate, -/obj/item/screwdriver{ - pixel_y = 9 - }, -/obj/structure/table/reinforced/plastitaniumglass, -/turf/open/floor/iron/dark, -/area/shuttle/syndicate/engineering) "cg" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/iron/dark, @@ -614,10 +578,6 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/corner, /area/shuttle/syndicate/medical) -"df" = ( -/obj/machinery/newscaster/directional/south, -/turf/open/floor/iron/dark, -/area/shuttle/syndicate/bridge) "dp" = ( /obj/machinery/porta_turret/syndicate/shuttle{ dir = 10 @@ -627,21 +587,10 @@ "dz" = ( /turf/open/floor/catwalk_floor/iron_dark, /area/shuttle/syndicate/medical) -"el" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 4 - }, -/area/shuttle/syndicate/hallway) -"fk" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/siding/red, -/obj/structure/window/reinforced/survival_pod/spawner/directional/north, -/obj/effect/turf_decal/stripes/red/line{ - dir = 1 - }, -/turf/open/floor/iron/dark/smooth_edge, -/area/shuttle/syndicate/engineering) +"fB" = ( +/obj/structure/sign/warning/vacuum/external, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/syndicate/airlock) "gt" = ( /obj/item/storage/box/handcuffs{ pixel_x = 3; @@ -654,12 +603,6 @@ dir = 2 }, /area/shuttle/syndicate/airlock) -"hT" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/syndicateemblem/bottom/right, -/obj/structure/sign/departments/engineering/directional/east, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/syndicate/hallway) "iE" = ( /obj/structure/closet/syndicate/nuclear, /obj/structure/railing, @@ -674,6 +617,15 @@ }, /turf/open/floor/iron/dark/smooth_edge, /area/shuttle/syndicate/engineering) +"jn" = ( +/obj/item/storage/toolbox/syndicate, +/obj/item/screwdriver{ + pixel_y = 9 + }, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/shuttle/syndicate/engineering) "lm" = ( /obj/machinery/door/airlock/hatch, /obj/effect/mapping_helpers/airlock/autoname, @@ -715,20 +667,20 @@ "mr" = ( /turf/open/floor/iron/dark/smooth_corner, /area/shuttle/syndicate/hallway) +"mQ" = ( +/obj/effect/turf_decal/syndicateemblem/bottom/right, +/obj/structure/sign/departments/engineering/directional/east, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/syndicate/hallway) "mZ" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 }, +/mob/living/simple_animal/bot/medbot/nukie, /turf/open/floor/iron/corner{ dir = 1 }, /area/shuttle/syndicate/medical) -"nq" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 8 - }, -/area/shuttle/syndicate/hallway) "nN" = ( /obj/structure/chair/comfy/shuttle/tactical{ dir = 8 @@ -778,6 +730,19 @@ dir = 4 }, /area/shuttle/syndicate/eva) +"to" = ( +/obj/machinery/button/door{ + id = "syndieshutters"; + name = "Cockpit View Control"; + pixel_y = 24; + req_access = list("syndicate") + }, +/obj/item/aicard, +/obj/structure/table/reinforced/plastitaniumglass, +/turf/open/floor/iron/dark/smooth_corner{ + dir = 8 + }, +/area/shuttle/syndicate/bridge) "tG" = ( /turf/open/floor/catwalk_floor/iron_dark, /area/shuttle/syndicate/bridge) @@ -786,12 +751,6 @@ dir = 1 }, /area/shuttle/syndicate/engineering) -"ug" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/syndicateemblem/bottom/left, -/obj/structure/sign/departments/medbay/alt/directional/west, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/syndicate/hallway) "vl" = ( /obj/item/storage/medkit/regular{ pixel_x = 3; @@ -809,6 +768,30 @@ dir = 1 }, /area/shuttle/syndicate/medical) +"vt" = ( +/obj/machinery/status_display/evac{ + pixel_x = -32 + }, +/obj/machinery/computer/records/medical/syndie{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/shuttle/syndicate/bridge) +"vu" = ( +/obj/machinery/door/window/survival_pod{ + dir = 1; + name = "Telecommunications Centre"; + req_access = list("syndicate") + }, +/obj/effect/turf_decal/siding/red, +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_edge, +/area/shuttle/syndicate/engineering) "vv" = ( /obj/item/clothing/head/hats/hos/cap/syndicate, /obj/item/stamp/syndicate{ @@ -817,10 +800,6 @@ /obj/structure/table/reinforced/plastitaniumglass, /turf/open/floor/iron/dark, /area/shuttle/syndicate/bridge) -"vQ" = ( -/obj/machinery/computer/security/telescreen/entertainment/directional/south, -/turf/open/floor/iron/dark, -/area/shuttle/syndicate/bridge) "wK" = ( /obj/effect/turf_decal/tile/red/half{ dir = 8 @@ -856,28 +835,6 @@ /obj/effect/turf_decal/siding/thinplating_new/dark, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/hallway) -"zj" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/table/reinforced, -/obj/item/storage/backpack/duffelbag/syndie/surgery, -/turf/open/floor/iron/white/side, -/area/shuttle/syndicate/medical) -"zL" = ( -/obj/machinery/status_display/evac{ - pixel_x = -32 - }, -/obj/machinery/light/directional/west, -/obj/machinery/computer/records/medical/syndie{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/shuttle/syndicate/bridge) "zR" = ( /obj/effect/turf_decal/syndicateemblem/top/left, /obj/item/radio/intercom/directional/west, @@ -907,40 +864,31 @@ dir = 8 }, /area/shuttle/syndicate/airlock) +"Cm" = ( +/turf/open/floor/iron/dark/smooth_edge{ + dir = 8 + }, +/area/shuttle/syndicate/hallway) "Cu" = ( /turf/open/floor/iron/dark/smooth_corner{ dir = 4 }, /area/shuttle/syndicate/airlock) +"CC" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/south, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/shuttle/syndicate/bridge) "CZ" = ( /obj/effect/turf_decal/tile/red{ dir = 1 }, /turf/open/floor/iron/dark, /area/shuttle/syndicate/hallway) -"DP" = ( -/obj/machinery/status_display/ai{ - pixel_x = 32 - }, -/obj/machinery/light/directional/east, -/obj/machinery/computer/aifixer{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, +"Fd" = ( +/obj/machinery/light/floor, /turf/open/floor/iron/dark, -/area/shuttle/syndicate/bridge) -"Ed" = ( -/obj/machinery/door/window/survival_pod{ - dir = 1; - req_access = list("syndicate"); - name = "Telecommunications Centre" - }, -/obj/effect/turf_decal/siding/red, -/obj/effect/turf_decal/stripes/red/line{ - dir = 1 - }, -/turf/open/floor/iron/dark/smooth_edge, -/area/shuttle/syndicate/engineering) +/area/shuttle/syndicate/hallway) "Fe" = ( /obj/effect/turf_decal/syndicateemblem/bottom/middle, /turf/open/floor/mineral/plastitanium/red, @@ -979,6 +927,11 @@ "Jo" = ( /turf/open/floor/iron/dark/textured_corner, /area/shuttle/syndicate/engineering) +"Jt" = ( +/obj/effect/turf_decal/syndicateemblem/bottom/left, +/obj/structure/sign/departments/medbay/alt/directional/west, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/syndicate/hallway) "JQ" = ( /obj/structure/sink/directional/west, /obj/structure/mirror/directional/east, @@ -1014,6 +967,15 @@ }, /turf/open/floor/iron/dark/textured_large, /area/shuttle/syndicate/medical) +"Ln" = ( +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/item/storage/backpack/duffelbag/syndie/surgery, +/turf/open/floor/iron/white/side, +/area/shuttle/syndicate/medical) "Ma" = ( /turf/open/floor/iron/dark/smooth_corner{ dir = 1 @@ -1038,6 +1000,11 @@ dir = 8 }, /area/shuttle/syndicate/airlock) +"NK" = ( +/turf/open/floor/iron/dark/smooth_edge{ + dir = 4 + }, +/area/shuttle/syndicate/hallway) "Oa" = ( /turf/open/floor/iron/dark/smooth_corner{ dir = 8 @@ -1047,6 +1014,16 @@ /obj/effect/turf_decal/syndicateemblem/middle/left, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/hallway) +"Qk" = ( +/obj/machinery/status_display/ai{ + pixel_x = 32 + }, +/obj/machinery/computer/aifixer{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/iron/dark, +/area/shuttle/syndicate/bridge) "Qq" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 @@ -1062,6 +1039,22 @@ /obj/effect/turf_decal/syndicateemblem/middle/right, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/hallway) +"QQ" = ( +/obj/item/toy/plush/carpplushie{ + pixel_x = 6; + pixel_y = 9 + }, +/obj/item/toy/figure/syndie{ + pixel_x = 11; + pixel_y = -2 + }, +/turf/open/floor/fakespace, +/area/shuttle/syndicate/hallway) +"QX" = ( +/obj/machinery/newscaster/directional/south, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/shuttle/syndicate/bridge) "Ro" = ( /obj/effect/turf_decal/tile/blue/full, /turf/open/floor/iron/large, @@ -1105,6 +1098,9 @@ dir = 4 }, /area/shuttle/syndicate/eva) +"Xy" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/syndicate/airlock) "YN" = ( /turf/open/floor/iron/dark/smooth_corner{ dir = 4 @@ -1171,7 +1167,7 @@ bC bq bR bY -zj +Ln nZ cu cz @@ -1254,7 +1250,7 @@ MJ (6,1,1) = {" ac ag -zL +vt YU ac ad @@ -1280,7 +1276,7 @@ aa ae ah ao -df +QX ac af af @@ -1309,7 +1305,7 @@ ap ac CZ bk -nq +Cm aD aD aV @@ -1317,7 +1313,7 @@ YN UN zR Qb -ug +Jt zd mr bV @@ -1332,21 +1328,21 @@ aj aq ap lm -aD +Fd ak ak ak -aD +Fd Tu -aD +Fd UN VW GW Fe zd -aD +Fd bJ -bo +QQ cr cw aa @@ -1359,7 +1355,7 @@ ap ac AZ aD -el +NK aD aD aV @@ -1367,7 +1363,7 @@ Ma UN st Qx -hT +mQ zd Oa bV @@ -1380,7 +1376,7 @@ aa ae vv ar -vQ +CC ac af af @@ -1403,8 +1399,8 @@ aa "} (12,1,1) = {" ac -am -DP +to +Qk Fs ac In @@ -1445,7 +1441,7 @@ by ch bi bi -cf +jn bj bn bn @@ -1496,7 +1492,7 @@ ch bi bi ch -Ed +vu cs cy cF @@ -1511,9 +1507,9 @@ aa aa bO aB -aB +Xy aY -bd +fB aB bn bB @@ -1521,7 +1517,7 @@ bW ch ch ci -fk +jf cs cy cG diff --git a/_maps/shuttles/pirate_Interdyne.dmm b/_maps/shuttles/pirate_Interdyne.dmm deleted file mode 100644 index 773f78646531f..0000000000000 --- a/_maps/shuttles/pirate_Interdyne.dmm +++ /dev/null @@ -1,1119 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 8; - id = "interdynebridge" - }, -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/turf/open/floor/plating, -/area/shuttle/pirate) -"ab" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/obj/machinery/turretid{ - icon_state = "control_kill"; - lethal = 1; - locked = 0; - pixel_y = -24; - req_access = null - }, -/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"ad" = ( -/obj/machinery/button/door/directional/south{ - id = "interdynebridge"; - name = "Bridge Bolt Control"; - specialfunctions = 4 - }, -/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"ae" = ( -/obj/machinery/shuttle_scrambler, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"af" = ( -/turf/template_noop, -/area/template_noop) -"ag" = ( -/obj/machinery/door/airlock/hatch{ - id_tag = "piratebridgebolt"; - name = "Bridge" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/tile/dark_blue/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"ah" = ( -/obj/machinery/computer/shuttle/pirate, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"aj" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/shuttle/pirate) -"ak" = ( -/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ - dir = 8 - }, -/obj/structure/table/reinforced/plastitaniumglass, -/obj/machinery/reagentgrinder/constructed, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"al" = ( -/obj/machinery/loot_locator{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"an" = ( -/obj/effect/turf_decal/tile/dark_blue{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"ao" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"ap" = ( -/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ - dir = 1 - }, -/obj/machinery/chem_master, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"ar" = ( -/obj/effect/turf_decal/tile/dark_blue/half/contrasted, -/obj/item/stack/sheet/mineral/plasma/five, -/obj/item/stack/sheet/mineral/plasma/five, -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/storage/box/beakers/variety, -/obj/item/storage/box/beakers/variety, -/obj/item/storage/box/beakers/variety, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil, -/obj/item/screwdriver/nuke, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"av" = ( -/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ - dir = 4 - }, -/obj/machinery/door/window/brigdoor/right/directional/west{ - req_access = list("surgery") - }, -/obj/structure/bed, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"aw" = ( -/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ - dir = 8 - }, -/obj/machinery/chem_heater, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"ax" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"ay" = ( -/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"az" = ( -/obj/effect/turf_decal/tile/dark_blue, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"aC" = ( -/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/effect/mob_spawn/ghost_role/human/pirate/interdyne/junior{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"aD" = ( -/obj/machinery/power/apc/auto_name/directional/north{ - cell_type = /obj/item/stock_parts/cell/bluespace; - start_charge = 100 - }, -/obj/effect/mapping_helpers/apc/cut_AI_wire, -/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/power/smes/engineering{ - charge = 1e+600 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"aF" = ( -/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/pirate{ - dir = 4; - x_offset = -3; - y_offset = 7 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"aG" = ( -/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ - dir = 8 - }, -/obj/machinery/piratepad, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"aH" = ( -/obj/machinery/light/directional/east, -/obj/machinery/computer/crew/syndie{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"aI" = ( -/obj/effect/turf_decal/tile/dark_blue/opposingcorners, -/obj/machinery/portable_atmospherics/canister/healium, -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/item/wrench/medical, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"aJ" = ( -/obj/effect/turf_decal/tile/dark_blue/opposingcorners, -/obj/machinery/computer/operating, -/obj/item/disk/surgery/debug, -/obj/machinery/defibrillator_mount/charging{ - pixel_y = 28 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"aK" = ( -/obj/machinery/door/airlock/external/glass/ruin{ - cyclelinkedairlock = null; - cyclelinkeddir = 666666; - id_tag = "pirateportexternal"; - req_access = list("surgery") - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/docking_port/mobile/pirate{ - launch_status = 0; - movement_force = list("KNOCKDOWN"=0,"THROW"=0); - name = "Pirate Ship"; - port_direction = 2 - }, -/obj/docking_port/stationary{ - dwidth = 11; - height = 100; - name = "Deep Space"; - shuttle_id = "pirate_home"; - width = 100 - }, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/effect/turf_decal/tile/dark_blue/fourcorners, -/obj/structure/fans/tiny, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"aL" = ( -/obj/machinery/door/airlock/external/glass/ruin{ - cyclelinkedairlock = null; - cyclelinkeddir = 666666; - id_tag = "pirateportexternal"; - req_access = list("surgery") - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/turf_decal/tile/dark_blue/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/fans/tiny, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"aM" = ( -/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ - dir = 1 - }, -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/reagent_containers/cup/beaker/noreact, -/obj/item/reagent_containers/cup/beaker/noreact, -/obj/item/storage/box/syringes, -/obj/machinery/light/no_nightlight/directional/north, -/obj/item/storage/box/syringes, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"aO" = ( -/obj/machinery/porta_turret/syndicate/energy/heavy{ - faction = list("pirate","Syndicate") - }, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/shuttle/pirate) -"aQ" = ( -/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ - dir = 4 - }, -/obj/machinery/chem_dispenser/fullupgrade, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"aR" = ( -/obj/effect/turf_decal/tile/dark_blue/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"aS" = ( -/obj/effect/turf_decal/tile/dark_blue/opposingcorners, -/obj/structure/closet/crate/freezer/blood, -/obj/machinery/light/small/blacklight/directional/south, -/obj/machinery/iv_drip, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"aW" = ( -/obj/effect/turf_decal/tile/dark_blue/opposingcorners, -/obj/machinery/atmospherics/components/unary/cryo_cell, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"be" = ( -/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ - dir = 4 - }, -/obj/machinery/computer/pandemic, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"bf" = ( -/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ - dir = 8 - }, -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/storage/box/syndie_kit/chemical, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"bk" = ( -/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ - dir = 4 - }, -/obj/machinery/suit_storage_unit/medical, -/obj/item/mod/module/defibrillator/combat, -/obj/item/mod/module/tether, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"bl" = ( -/obj/effect/turf_decal/tile/dark_blue/half/contrasted, -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/storage/box/syndie_kit/tuberculosisgrenade, -/obj/machinery/light/small/blacklight/directional/south, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"bm" = ( -/obj/effect/turf_decal/tile/dark_blue/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"bo" = ( -/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/gun/medbeam, -/obj/item/gun/syringe/rapidsyringe, -/obj/item/pen/sleepy, -/obj/item/defibrillator/compact/combat/loaded, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"br" = ( -/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, -/obj/machinery/suit_storage_unit/medical, -/obj/item/mod/module/defibrillator/combat, -/obj/item/mod/module/tether, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"bu" = ( -/obj/structure/window/reinforced, -/obj/item/storage/box/handcuffs, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"bv" = ( -/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced/unanchored/spawner/directional/north, -/obj/structure/bed, -/obj/machinery/door/window/brigdoor/right/directional/west{ - req_access = list("surgery") - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"bx" = ( -/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ - dir = 1 - }, -/obj/effect/turf_decal/tile/dark_blue, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"bA" = ( -/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"bB" = ( -/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ - dir = 1 - }, -/obj/effect/turf_decal/tile/dark_blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"bC" = ( -/obj/effect/turf_decal/tile/dark_blue{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"bF" = ( -/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ - dir = 8 - }, -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/reagent_containers/cup/beaker/meta, -/obj/item/reagent_containers/cup/beaker/meta, -/obj/item/reagent_containers/cup/beaker/meta, -/obj/item/reagent_containers/cup/beaker/meta, -/obj/item/reagent_containers/dropper, -/obj/item/reagent_containers/dropper, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"bH" = ( -/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, -/obj/machinery/vending/drugs{ - name = "\improper SyndicateDrug Plus" - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"bK" = ( -/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, -/obj/machinery/smartfridge/chemistry/virology/preloaded, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"bQ" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ - dir = 4 - }, -/obj/machinery/suit_storage_unit/medical, -/obj/item/mod/module/defibrillator/combat, -/obj/item/mod/module/tether, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"bX" = ( -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"dV" = ( -/obj/machinery/door/airlock/hatch, -/obj/effect/turf_decal/tile/dark_blue/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"ek" = ( -/obj/machinery/door/airlock/hatch, -/obj/effect/turf_decal/tile/dark_blue/opposingcorners, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"ep" = ( -/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ - dir = 8 - }, -/obj/machinery/computer/piratepad_control{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"ey" = ( -/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ - dir = 8 - }, -/obj/effect/mob_spawn/ghost_role/human/pirate/interdyne/junior{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"eE" = ( -/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ - dir = 8 - }, -/obj/machinery/door/window/brigdoor/right/directional/south{ - req_access = list("surgery") - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"fO" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"fY" = ( -/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"gY" = ( -/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/bed{ - dir = 1 - }, -/obj/machinery/door/window/brigdoor/left/directional/east{ - req_access = list("surgery") - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"ic" = ( -/obj/machinery/power/shuttle_engine/heater{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 1 - }, -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/obj/machinery/power/shuttle_engine/heater, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"iD" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/button/door/directional/south{ - id = "pirateportexternal"; - name = "External Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/effect/turf_decal/tile/dark_blue/half/contrasted, -/obj/effect/mob_spawn/ghost_role/human/pirate/interdyne/senior{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"jv" = ( -/obj/effect/turf_decal/tile/dark_blue/opposingcorners, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"jY" = ( -/obj/effect/turf_decal/tile/dark_blue/half/contrasted, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"lW" = ( -/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"mD" = ( -/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/shuttle/pirate) -"mU" = ( -/obj/effect/turf_decal/tile/dark_blue/half/contrasted, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"ne" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "interdynebridge" - }, -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/turf/open/floor/plating, -/area/shuttle/pirate) -"qy" = ( -/obj/machinery/power/shuttle_engine/propulsion{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 5 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"sP" = ( -/obj/effect/turf_decal/tile/dark_blue/opposingcorners, -/obj/structure/table/optable, -/obj/item/defibrillator/loaded, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"ua" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"vz" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - id = "interdynebridge" - }, -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/turf/open/floor/plating, -/area/shuttle/pirate) -"vB" = ( -/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ - dir = 4 - }, -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/scalpel/advanced, -/obj/item/scalpel/advanced, -/obj/item/scalpel/advanced, -/obj/item/retractor/advanced, -/obj/item/retractor/advanced, -/obj/item/retractor/advanced, -/obj/item/cautery/advanced, -/obj/item/cautery/advanced, -/obj/item/cautery/advanced, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"wf" = ( -/obj/effect/turf_decal/tile/dark_blue/half/contrasted, -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/stack/sheet/mineral/plasma, -/obj/item/stack/sheet/mineral/plasma, -/obj/item/stack/sheet/mineral/plasma, -/obj/machinery/reagentgrinder/constructed, -/obj/item/storage/box/monkeycubes/syndicate, -/obj/item/storage/box/monkeycubes/syndicate, -/obj/item/reagent_containers/cup/bottle, -/obj/item/reagent_containers/cup/bottle, -/obj/item/reagent_containers/cup/bottle, -/obj/item/reagent_containers/cup/beaker/meta, -/obj/item/stack/sheet/mineral/plasma/thirty, -/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/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/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/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/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/reagent_containers/condiment/milk, -/obj/item/reagent_containers/condiment/milk, -/obj/item/reagent_containers/condiment/milk, -/obj/item/reagent_containers/condiment/milk, -/obj/item/reagent_containers/condiment/milk, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"yi" = ( -/obj/machinery/door/airlock/hatch, -/obj/effect/turf_decal/tile/dark_blue/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"BT" = ( -/obj/machinery/power/shuttle_engine/propulsion{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 10 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"Cb" = ( -/obj/machinery/power/shuttle_engine/propulsion, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 10 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"DD" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 4; - id = "interdynebridge" - }, -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/turf/open/floor/plating, -/area/shuttle/pirate) -"En" = ( -/obj/effect/turf_decal/tile/dark_blue/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/obj/machinery/light/small/blacklight/directional/south, -/obj/item/reagent_containers/cup/beaker/meta/salbutamol{ - list_reagents = list(/datum/reagent/medicine/c2/convermol = 180) - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"ED" = ( -/obj/machinery/power/shuttle_engine/heater{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 1 - }, -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"GS" = ( -/obj/effect/turf_decal/tile/dark_blue/half/contrasted, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"Hg" = ( -/obj/effect/turf_decal/tile/dark_blue/half/contrasted, -/obj/machinery/light/directional/south, -/obj/structure/closet/l3closet/virology, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"Iv" = ( -/obj/machinery/power/shuttle_engine/propulsion{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 5 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"JT" = ( -/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ - dir = 8 - }, -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/reagent_containers/spray/chemsprayer/bioterror, -/obj/item/reagent_containers/spray/chemsprayer/bioterror, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"Ks" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 8; - id = "interdynebridge" - }, -/turf/open/floor/plating, -/area/shuttle/pirate) -"Oe" = ( -/obj/effect/turf_decal/tile/dark_blue{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"OL" = ( -/obj/effect/turf_decal/tile/dark_blue/half/contrasted, -/obj/machinery/vending/medical/syndicate_access, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"Po" = ( -/obj/machinery/power/shuttle_engine/propulsion{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 10 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"Rq" = ( -/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ - dir = 1 - }, -/obj/machinery/light/no_nightlight/directional/north, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"Tr" = ( -/obj/machinery/porta_turret/syndicate/energy/heavy{ - faction = list("pirate","Syndicate"); - max_integrity = 10000 - }, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/shuttle/pirate) -"Ur" = ( -/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ - dir = 8 - }, -/obj/machinery/atmospherics/components/tank/air, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"UM" = ( -/obj/machinery/power/shuttle_engine/propulsion, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 5 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"VF" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"Wp" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"Xk" = ( -/obj/effect/turf_decal/tile/dark_blue/opposingcorners, -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/mirror/directional/east, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) - -(1,1,1) = {" -af -af -af -af -af -aO -aa -aa -Ks -aa -aO -af -af -af -af -af -"} -(2,1,1) = {" -af -af -af -af -af -aj -ap -aw -ak -bF -aj -af -af -af -af -af -"} -(3,1,1) = {" -af -af -af -af -af -aj -aM -ax -fO -ar -aj -af -af -af -af -af -"} -(4,1,1) = {" -af -af -af -af -Po -aj -aQ -ay -Oe -OL -aj -af -af -af -af -af -"} -(5,1,1) = {" -af -af -af -BT -ED -aj -aj -aj -bx -bH -aj -Po -af -af -af -af -"} -(6,1,1) = {" -af -aO -Ks -aj -aj -aI -En -aj -yi -aj -aj -ic -Cb -af -af -af -"} -(7,1,1) = {" -aO -aj -ey -aF -aj -aW -aR -ek -lW -JT -bf -aj -aj -aa -aj -Tr -"} -(8,1,1) = {" -vz -ae -an -ab -aj -aj -aj -aj -fY -bX -iD -aj -aD -aG -ep -aj -"} -(9,1,1) = {" -vz -ah -ao -GS -ag -bm -Xk -bm -fY -ua -jY -aL -fY -Wp -mU -aK -"} -(10,1,1) = {" -vz -al -az -ad -aj -aj -aj -aj -fY -VF -bl -aj -bQ -bk -br -aj -"} -(11,1,1) = {" -aO -aj -aC -aH -aj -sP -jv -dV -bA -vB -bo -aj -aj -DD -aj -Tr -"} -(12,1,1) = {" -af -aO -ne -aj -aj -aJ -aS -aj -yi -aj -aj -ED -UM -af -af -af -"} -(13,1,1) = {" -af -af -af -qy -ED -aj -aj -mD -bB -Ur -aj -Iv -af -af -af -af -"} -(14,1,1) = {" -af -af -af -af -Iv -aj -gY -eE -bC -Hg -aj -af -af -af -af -af -"} -(15,1,1) = {" -af -af -af -af -af -aj -Rq -bu -VF -wf -aj -af -af -af -af -af -"} -(16,1,1) = {" -af -af -af -af -af -aj -av -bv -be -bK -aj -af -af -af -af -af -"} -(17,1,1) = {" -af -af -af -af -af -aO -DD -mD -DD -DD -aO -af -af -af -af -af -"} diff --git a/_maps/shuttles/pirate_dutchman.dmm b/_maps/shuttles/pirate_dutchman.dmm index 7d1d8efe04c66..86b85f7b70edc 100644 --- a/_maps/shuttles/pirate_dutchman.dmm +++ b/_maps/shuttles/pirate_dutchman.dmm @@ -108,6 +108,18 @@ }, /turf/open/floor/wood/airless, /area/shuttle/pirate/flying_dutchman) +"ar" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/railing{ + color = "#4C3117"; + dir = 4; + name = "wooden railing" + }, +/obj/machinery/light/floor, +/turf/open/floor/wood/airless, +/area/shuttle/pirate/flying_dutchman) "aB" = ( /obj/structure/railing/corner{ color = "#4C3117"; @@ -119,53 +131,44 @@ }, /turf/open/floor/wood/airless, /area/shuttle/pirate/flying_dutchman) -"aK" = ( +"aT" = ( /obj/structure/railing{ color = "#4C3117"; - dir = 5; + dir = 1; name = "wooden railing" }, -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/machinery/light/floor, -/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, /obj/effect/turf_decal/siding/wood{ - dir = 9 + dir = 1 }, /obj/machinery/light/floor, /turf/open/floor/wood/airless, /area/shuttle/pirate/flying_dutchman) -"aZ" = ( +"be" = ( /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 + dir = 8 }, -/obj/machinery/light/small/directional/east, /turf/open/floor/wood/airless, /area/shuttle/pirate/flying_dutchman) -"be" = ( +"bf" = ( /obj/effect/turf_decal/siding/wood{ - dir = 8 + 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, /turf/open/floor/wood/airless, /area/shuttle/pirate/flying_dutchman) "bn" = ( @@ -177,17 +180,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 @@ -265,6 +257,17 @@ }, /turf/open/floor/wood/airless, /area/shuttle/pirate/flying_dutchman) +"fi" = ( +/obj/structure/railing{ + color = "#4C3117"; + dir = 9; + name = "wooden railing" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/wood/airless, +/area/shuttle/pirate/flying_dutchman) "fH" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -301,24 +304,6 @@ /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 @@ -329,13 +314,6 @@ /obj/item/reagent_containers/cup/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{ @@ -364,6 +342,14 @@ }, /turf/open/floor/wood/airless, /area/shuttle/pirate/flying_dutchman) +"kH" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/railing/corner{ + color = "#4C3117"; + name = "wooden railing" + }, +/turf/open/floor/wood/airless, +/area/shuttle/pirate/flying_dutchman) "mG" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -373,12 +359,6 @@ }, /turf/open/floor/carpet/blue/airless, /area/shuttle/pirate/flying_dutchman) -"ny" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/machinery/light/floor, -/turf/open/space/basic, -/area/shuttle/pirate/flying_dutchman) "pG" = ( /obj/structure/window/reinforced/shuttle/survival_pod, /turf/open/floor/wood/airless, @@ -390,6 +370,17 @@ }, /turf/open/floor/wood/airless, /area/shuttle/pirate/flying_dutchman) +"rI" = ( +/obj/structure/railing{ + color = "#4C3117"; + dir = 5; + name = "wooden railing" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/wood/airless, +/area/shuttle/pirate/flying_dutchman) "rN" = ( /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -444,16 +435,6 @@ }, /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 @@ -473,33 +454,25 @@ /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 +"vJ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, +/obj/structure/rack{ + icon = 'icons/obj/fluff/general.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/cup/bucket/wooden, /turf/open/floor/wood/airless, /area/shuttle/pirate/flying_dutchman) "vT" = ( @@ -523,12 +496,44 @@ }, /turf/open/floor/carpet/royalblack/airless, /area/shuttle/pirate/flying_dutchman) +"xY" = ( +/obj/structure/railing/corner{ + color = "#4C3117"; + dir = 8; + name = "wooden railing" + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/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) +"yz" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/machinery/light/floor, +/obj/docking_port/stationary{ + dir = 8; + dwidth = 11; + height = 16; + shuttle_id = "pirate_home"; + name = "Deep Space"; + width = 17 + }, +/obj/docking_port/mobile/pirate{ + dir = 8; + launch_status = 0; + movement_force = list("KNOCKDOWN"=0,"THROW"=0); + name = "Pirate Ship"; + port_direction = 4; + preferred_direction = 8 + }, +/turf/open/floor/wood/airless, +/area/shuttle/pirate/flying_dutchman) "zw" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 4 @@ -540,6 +545,24 @@ }, /turf/open/floor/wood/airless, /area/shuttle/pirate/flying_dutchman) +"zB" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/machinery/light/floor, +/obj/structure/rack{ + icon = 'icons/obj/fluff/general.dmi'; + icon_state = "minibar"; + name = "skeletal minibar" + }, +/obj/item/reagent_containers/condiment/milk{ + pixel_x = -5 + }, +/obj/item/reagent_containers/condiment/milk{ + pixel_x = 5 + }, +/turf/open/floor/wood/airless, +/area/shuttle/pirate/flying_dutchman) "zE" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -575,46 +598,26 @@ /obj/item/reagent_containers/cup/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, -/obj/structure/rack{ - icon = 'icons/obj/stationobjs.dmi'; - icon_state = "minibar"; - name = "skeletal minibar" - }, -/obj/item/reagent_containers/condiment/milk{ - pixel_x = -5 - }, -/obj/item/reagent_containers/condiment/milk{ - pixel_x = 5 +"Bc" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 }, +/obj/machinery/light/small/directional/south, /turf/open/floor/wood/airless, /area/shuttle/pirate/flying_dutchman) -"Cv" = ( +"BP" = ( /obj/effect/turf_decal/siding/wood{ - dir = 4 + dir = 8 }, /obj/structure/railing{ color = "#4C3117"; - dir = 4; + dir = 8; name = "wooden railing" }, +/obj/machinery/light/floor, /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/cup/glass/bottle/rum{ @@ -636,6 +639,24 @@ }, /turf/open/floor/carpet/royalblack/airless, /area/shuttle/pirate/flying_dutchman) +"Ew" = ( +/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 + }, +/turf/open/floor/wood/airless, +/area/shuttle/pirate/flying_dutchman) "EU" = ( /obj/machinery/shuttle_scrambler, /turf/open/floor/carpet/royalblack/airless, @@ -665,11 +686,14 @@ /obj/item/flashlight/flare/torch, /turf/open/floor/wood/airless, /area/shuttle/pirate/flying_dutchman) -"FK" = ( +"FG" = ( /obj/effect/turf_decal/siding/wood{ - dir = 4 + dir = 5 }, -/obj/machinery/light/small/directional/east, +/obj/structure/table/wood, +/obj/item/stack/cannonball/fourteen, +/obj/item/flashlight/flare/torch, +/obj/machinery/light/small/directional/north, /turf/open/floor/wood/airless, /area/shuttle/pirate/flying_dutchman) "Gr" = ( @@ -686,6 +710,12 @@ }, /turf/open/floor/carpet/royalblack/airless, /area/shuttle/pirate/flying_dutchman) +"IT" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/airless, +/area/shuttle/pirate/flying_dutchman) "Jp" = ( /obj/structure/table, /obj/machinery/recharger{ @@ -743,43 +773,11 @@ /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) -"Op" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/obj/machinery/light/floor, -/obj/docking_port/stationary{ - dir = 8; - dwidth = 11; - height = 16; - shuttle_id = "pirate_home"; - name = "Deep Space"; - width = 17 - }, -/obj/docking_port/mobile/pirate{ - dir = 8; - launch_status = 0; - movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); - name = "Pirate Ship"; - port_direction = 4; - preferred_direction = 8 - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) "OL" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 8 @@ -789,13 +787,6 @@ }, /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 @@ -825,6 +816,18 @@ }, /turf/open/floor/wood/airless, /area/shuttle/pirate/flying_dutchman) +"QM" = ( +/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 + }, +/obj/machinery/light/floor, +/turf/closed/wall/mineral/wood/nonmetal, +/area/shuttle/pirate/flying_dutchman) "RO" = ( /obj/effect/turf_decal/siding/wood/corner, /turf/open/floor/wood/airless, @@ -865,21 +868,6 @@ }, /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/cup/bucket/wooden, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) "Vm" = ( /obj/structure/railing/corner{ color = "#4C3117"; @@ -943,6 +931,16 @@ }, /turf/open/floor/carpet/royalblack/airless, /area/shuttle/pirate/flying_dutchman) +"YT" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/structure/table/wood, +/obj/item/stack/cannonball/fourteen, +/obj/item/flashlight/flare/torch, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood/airless, +/area/shuttle/pirate/flying_dutchman) "ZL" = ( /obj/effect/turf_decal/siding/wood{ dir = 9 @@ -954,11 +952,12 @@ }, /turf/open/floor/wood/airless, /area/shuttle/pirate/flying_dutchman) -"ZZ" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 +"ZU" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 }, -/obj/machinery/light/floor, +/obj/machinery/light/small/directional/south, /turf/open/floor/wood/airless, /area/shuttle/pirate/flying_dutchman) @@ -1010,7 +1009,7 @@ af af af af -ny +Oe af RY RY @@ -1029,7 +1028,7 @@ af af RY RY -ny +Oe af af af @@ -1041,7 +1040,7 @@ Oe RY RY Oe -ny +Oe "} (4,1,1) = {" af @@ -1119,7 +1118,7 @@ pG SV WR af -ny +Oe af af af @@ -1137,13 +1136,13 @@ af af af af -ny +Oe Gt pG SV WR Fz -vw +Bc WR WR Gt @@ -1158,7 +1157,7 @@ af af af ZL -ZZ +be rN WR WR @@ -1166,9 +1165,9 @@ WR WR WR WR -Fz +YT OL -hz +be fY Gr WR @@ -1182,17 +1181,17 @@ WR af af af -aO -bu +fi +BP by WB Le be -Uk +vJ dZ -BK +zB pG -gQ +bf fY WB WB @@ -1217,7 +1216,7 @@ Ki sa WB WB -NG +kH WR WS RO @@ -1240,7 +1239,7 @@ WB it fW St -Da +QM da WB WB @@ -1248,7 +1247,7 @@ RQ eG WS Gr -Da +QM dc Ys WB @@ -1271,7 +1270,7 @@ mG bn WB WB -uk +xY WR WS Le @@ -1290,8 +1289,8 @@ WR af af af -aK -Cv +rI +ar zw RO EX @@ -1300,7 +1299,7 @@ sc vT zE pG -aZ +Ew yy WB WB @@ -1320,17 +1319,17 @@ af af af zO -Op +yz WR -vi +aT WR WR WR WR WR -fH +FG rd -FK +IT yy Gr WR @@ -1353,13 +1352,13 @@ Qa af af af -ny +Oe Gt pG uw WR fH -Pm +ZU WR WR Gt @@ -1389,7 +1388,7 @@ pG uw WR af -ny +Oe af af af @@ -1461,7 +1460,7 @@ af af RY RY -ny +Oe af af af @@ -1473,7 +1472,7 @@ Oe RY RY Oe -ny +Oe "} (20,1,1) = {" af @@ -1496,7 +1495,7 @@ af af af af -ny +Oe af RY RY diff --git a/_maps/shuttles/pirate_ex_interdyne.dmm b/_maps/shuttles/pirate_ex_interdyne.dmm new file mode 100644 index 0000000000000..5d2149c049fa5 --- /dev/null +++ b/_maps/shuttles/pirate_ex_interdyne.dmm @@ -0,0 +1,1155 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "interdynebridge" + }, +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/turf/open/floor/plating, +/area/shuttle/pirate) +"ab" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/machinery/turretid{ + icon_state = "control_kill"; + lethal = 1; + locked = 0; + pixel_y = -24; + req_access = null + }, +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"ad" = ( +/obj/machinery/button/door/directional/south{ + id = "interdynebridge"; + name = "Bridge Bolt Control"; + specialfunctions = 4 + }, +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"ae" = ( +/obj/machinery/shuttle_scrambler, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"af" = ( +/turf/template_noop, +/area/template_noop) +"ag" = ( +/obj/machinery/door/airlock/hatch{ + id_tag = "piratebridgebolt"; + name = "Bridge"; + req_access = null + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/tile/dark_blue/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"ah" = ( +/obj/machinery/computer/shuttle/pirate, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"aj" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/pirate) +"ak" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/machinery/reagentgrinder/constructed, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"al" = ( +/obj/machinery/loot_locator{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"an" = ( +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"ao" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"ap" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/chem_master, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"ar" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/item/stack/sheet/mineral/plasma/five, +/obj/item/stack/sheet/mineral/plasma/five, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/storage/box/beakers/variety, +/obj/item/storage/box/beakers/variety, +/obj/item/storage/box/beakers/variety, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/cable_coil, +/obj/item/stack/cable_coil, +/obj/item/screwdriver/nuke, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"av" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/door/window/brigdoor/right/directional/west{ + req_access = list("syndicate") + }, +/obj/structure/bed, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"aw" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, +/obj/machinery/chem_heater, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"ax" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"ay" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"az" = ( +/obj/effect/turf_decal/tile/dark_blue, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"aC" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/effect/mob_spawn/ghost_role/human/pirate/interdyne/junior{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"aD" = ( +/obj/machinery/power/apc/auto_name/directional/north{ + cell_type = /obj/item/stock_parts/cell/bluespace; + start_charge = 100 + }, +/obj/effect/mapping_helpers/apc/cut_AI_wire, +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/power/smes/engineering{ + charge = 1e+600 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"aF" = ( +/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/pirate{ + dir = 4; + x_offset = -3; + y_offset = 7 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"aG" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, +/obj/machinery/piratepad, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"aH" = ( +/obj/machinery/computer/crew/syndie{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"aI" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/machinery/portable_atmospherics/canister/healium, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"aJ" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/machinery/computer/operating, +/obj/machinery/defibrillator_mount/charging{ + pixel_y = 28 + }, +/obj/item/disk/surgery/brainwashing{ + name = "Interdyne Brainwashing Protocol Surgery Disk"; + pixel_x = -8 + }, +/obj/item/disk/surgery/sleeper_protocol{ + name = "Interdyne Sleeper Protocol Surgery Disk"; + pixel_x = 1 + }, +/obj/item/disk/surgery/forgottenship{ + name = "Interdyne Advanced Surgery Procedures Disk"; + pixel_x = 9 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"aK" = ( +/obj/machinery/door/airlock/external/glass/ruin{ + cyclelinkeddir = 666666; + id_tag = "pirateportexternal"; + req_access = null + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/docking_port/mobile/pirate{ + launch_status = 0; + movement_force = list("KNOCKDOWN"=0,"THROW"=0); + name = "Pirate Ship"; + port_direction = 2 + }, +/obj/docking_port/stationary{ + dwidth = 11; + height = 100; + name = "Deep Space"; + shuttle_id = "pirate_home"; + width = 100 + }, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/effect/turf_decal/tile/dark_blue/fourcorners, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"aL" = ( +/obj/machinery/door/airlock/external/glass/ruin{ + cyclelinkeddir = 666666; + id_tag = "pirateportexternal"; + req_access = null + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/turf_decal/tile/dark_blue/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"aM" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/reagent_containers/cup/beaker/noreact, +/obj/item/reagent_containers/cup/beaker/noreact, +/obj/item/storage/box/syringes, +/obj/machinery/light/no_nightlight/directional/north, +/obj/item/storage/box/syringes, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"aO" = ( +/obj/machinery/porta_turret/syndicate/energy/heavy{ + faction = list("pirate","Syndicate") + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/pirate) +"aQ" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/chem_dispenser/fullupgrade, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"aR" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"aS" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/structure/closet/crate/freezer/blood, +/obj/machinery/light/small/blacklight/directional/south, +/obj/machinery/iv_drip, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"aW" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/machinery/cryo_cell, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"be" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 4 + }, +/obj/machinery/computer/pandemic, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"bf" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 8 + }, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/storage/box/syndie_kit/chemical, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"bk" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 4 + }, +/obj/machinery/suit_storage_unit/interdyne, +/obj/item/screwdriver/nuke, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"bl" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/storage/box/syndie_kit/tuberculosisgrenade, +/obj/machinery/light/small/blacklight/directional/south, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"bm" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"bo" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/gun/medbeam, +/obj/item/gun/syringe/rapidsyringe, +/obj/item/pen/sleepy{ + name = "Interdyne Chem Pen" + }, +/obj/item/defibrillator/compact/combat/loaded, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"br" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, +/obj/machinery/suit_storage_unit/interdyne, +/obj/item/screwdriver/nuke, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"bu" = ( +/obj/structure/window/reinforced, +/obj/item/storage/box/handcuffs, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"bv" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 4 + }, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced/unanchored/spawner/directional/north, +/obj/structure/bed, +/obj/machinery/door/window/brigdoor/right/directional/west{ + req_access = list("syndicate") + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"bx" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"bA" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"bB" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"bC" = ( +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"bF" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 8 + }, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/reagent_containers/cup/beaker/meta, +/obj/item/reagent_containers/cup/beaker/meta, +/obj/item/reagent_containers/cup/beaker/meta, +/obj/item/reagent_containers/cup/beaker/meta, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/dropper, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"bH" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, +/obj/machinery/vending/drugs{ + name = "\improper SyndicateDrug Plus" + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"bK" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, +/obj/machinery/smartfridge/chemistry/virology/preloaded, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"bQ" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/suit_storage_unit/interdyne, +/obj/item/screwdriver/nuke, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"bX" = ( +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"dV" = ( +/obj/machinery/door/airlock/hatch{ + req_access = null + }, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"ek" = ( +/obj/machinery/door/airlock/hatch{ + req_access = null + }, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"ep" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/computer/piratepad_control{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"ey" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 8 + }, +/obj/effect/mob_spawn/ghost_role/human/pirate/interdyne/junior{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"eE" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, +/obj/machinery/door/window/brigdoor/right/directional/south{ + req_access = list("syndicate") + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"fO" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/mob/living/simple_animal/bot/medbot/nukie{ + name = "Dr. Pax"; + desc = "A twitchy medibot. It can't seem to hold still. Slightly concerning." + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"fY" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"gY" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 1 + }, +/obj/structure/window/reinforced, +/obj/structure/bed{ + dir = 1 + }, +/obj/machinery/door/window/brigdoor/left/directional/east{ + req_access = list("syndicate") + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"ic" = ( +/obj/machinery/power/shuttle_engine/heater{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 1 + }, +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/machinery/power/shuttle_engine/heater, +/turf/open/floor/plating/airless, +/area/shuttle/pirate) +"iD" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/button/door/directional/south{ + id = "pirateportexternal"; + name = "External Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/effect/mob_spawn/ghost_role/human/pirate/interdyne/senior{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"jv" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"jY" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"lW" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"mD" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/pirate) +"mU" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"ne" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "interdynebridge" + }, +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/turf/open/floor/plating, +/area/shuttle/pirate) +"qy" = ( +/obj/machinery/power/shuttle_engine/propulsion{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 5 + }, +/turf/open/floor/plating/airless, +/area/shuttle/pirate) +"sP" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/structure/table/optable, +/obj/item/defibrillator/loaded, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"ua" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"vz" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "interdynebridge" + }, +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/turf/open/floor/plating, +/area/shuttle/pirate) +"vB" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 4 + }, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/scalpel/advanced, +/obj/item/scalpel/advanced, +/obj/item/scalpel/advanced, +/obj/item/retractor/advanced, +/obj/item/retractor/advanced, +/obj/item/retractor/advanced, +/obj/item/cautery/advanced, +/obj/item/cautery/advanced, +/obj/item/cautery/advanced, +/obj/item/surgical_drapes, +/obj/item/surgical_drapes, +/obj/item/surgical_drapes, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"wf" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/sheet/mineral/plasma, +/obj/machinery/reagentgrinder/constructed, +/obj/item/storage/box/monkeycubes/syndicate, +/obj/item/storage/box/monkeycubes/syndicate, +/obj/item/reagent_containers/cup/bottle, +/obj/item/reagent_containers/cup/bottle, +/obj/item/reagent_containers/cup/bottle, +/obj/item/reagent_containers/cup/beaker/meta, +/obj/item/stack/sheet/mineral/plasma/thirty, +/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/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/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/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/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/reagent_containers/condiment/milk, +/obj/item/reagent_containers/condiment/milk, +/obj/item/reagent_containers/condiment/milk, +/obj/item/reagent_containers/condiment/milk, +/obj/item/reagent_containers/condiment/milk, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"yi" = ( +/obj/machinery/door/airlock/hatch{ + id_tag = "piratebridgebolt"; + name = "Bridge"; + req_access = null + }, +/obj/effect/turf_decal/tile/dark_blue/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"BT" = ( +/obj/machinery/power/shuttle_engine/propulsion{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 10 + }, +/turf/open/floor/plating/airless, +/area/shuttle/pirate) +"Cb" = ( +/obj/machinery/power/shuttle_engine/propulsion, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 10 + }, +/turf/open/floor/plating/airless, +/area/shuttle/pirate) +"DD" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + id = "interdynebridge" + }, +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/turf/open/floor/plating, +/area/shuttle/pirate) +"En" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/obj/machinery/light/small/blacklight/directional/south, +/obj/item/reagent_containers/cup/beaker/meta/salbutamol{ + list_reagents = list(/datum/reagent/medicine/c2/convermol=180) + }, +/obj/item/wrench/medical, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"ED" = ( +/obj/machinery/power/shuttle_engine/heater{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 1 + }, +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/turf/open/floor/plating/airless, +/area/shuttle/pirate) +"GS" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"Hg" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/structure/closet/l3closet/virology, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"Iv" = ( +/obj/machinery/power/shuttle_engine/propulsion{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 5 + }, +/turf/open/floor/plating/airless, +/area/shuttle/pirate) +"JT" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/reagent_containers/spray/chemsprayer/bioterror, +/obj/item/reagent_containers/spray/chemsprayer/bioterror, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"Ks" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "interdynebridge" + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"Oe" = ( +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"OL" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/machinery/vending/medical/syndicate_access, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"Po" = ( +/obj/machinery/power/shuttle_engine/propulsion{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 10 + }, +/turf/open/floor/plating/airless, +/area/shuttle/pirate) +"Rq" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/no_nightlight/directional/north, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"SD" = ( +/obj/machinery/door/airlock/hatch{ + req_access = null + }, +/obj/effect/turf_decal/tile/dark_blue/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"Tr" = ( +/obj/machinery/porta_turret/syndicate/energy/heavy{ + faction = list("pirate","Syndicate"); + max_integrity = 10000 + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/pirate) +"Ur" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/atmospherics/components/tank/air, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"UM" = ( +/obj/machinery/power/shuttle_engine/propulsion, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 5 + }, +/turf/open/floor/plating/airless, +/area/shuttle/pirate) +"VF" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"Wp" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"Xk" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/mirror/directional/east, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) + +(1,1,1) = {" +af +af +af +af +af +aO +aa +aa +Ks +aa +aO +af +af +af +af +af +"} +(2,1,1) = {" +af +af +af +af +af +aj +ap +aw +ak +bF +aj +af +af +af +af +af +"} +(3,1,1) = {" +af +af +af +af +af +aj +aM +ax +fO +ar +aj +af +af +af +af +af +"} +(4,1,1) = {" +af +af +af +af +Po +aj +aQ +ay +Oe +OL +aj +af +af +af +af +af +"} +(5,1,1) = {" +af +af +af +BT +ED +aj +aj +aj +bx +bH +aj +Po +af +af +af +af +"} +(6,1,1) = {" +af +aO +Ks +aj +aj +aI +En +aj +yi +aj +aj +ic +Cb +af +af +af +"} +(7,1,1) = {" +aO +aj +ey +aF +aj +aW +aR +ek +lW +JT +bf +aj +aj +aa +aj +Tr +"} +(8,1,1) = {" +vz +ae +an +ab +aj +aj +aj +aj +fY +bX +iD +aj +aD +aG +ep +aj +"} +(9,1,1) = {" +vz +ah +ao +GS +ag +bm +Xk +bm +fY +ua +jY +aL +fY +Wp +mU +aK +"} +(10,1,1) = {" +vz +al +az +ad +aj +aj +aj +aj +fY +VF +bl +aj +bQ +bk +br +aj +"} +(11,1,1) = {" +aO +aj +aC +aH +aj +sP +jv +dV +bA +vB +bo +aj +aj +DD +aj +Tr +"} +(12,1,1) = {" +af +aO +ne +aj +aj +aJ +aS +aj +SD +aj +aj +ED +UM +af +af +af +"} +(13,1,1) = {" +af +af +af +qy +ED +aj +aj +mD +bB +Ur +aj +Iv +af +af +af +af +"} +(14,1,1) = {" +af +af +af +af +Iv +aj +gY +eE +bC +Hg +aj +af +af +af +af +af +"} +(15,1,1) = {" +af +af +af +af +af +aj +Rq +bu +VF +wf +aj +af +af +af +af +af +"} +(16,1,1) = {" +af +af +af +af +af +aj +av +bv +be +bK +aj +af +af +af +af +af +"} +(17,1,1) = {" +af +af +af +af +af +aO +DD +mD +DD +DD +aO +af +af +af +af +af +"} diff --git a/_maps/shuttles/pirate_geode.dmm b/_maps/shuttles/pirate_geode.dmm new file mode 100644 index 0000000000000..693b7c8635ff7 --- /dev/null +++ b/_maps/shuttles/pirate_geode.dmm @@ -0,0 +1,1446 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"at" = ( +/obj/structure/barricade/wooden, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"aM" = ( +/obj/structure/table/wood, +/obj/machinery/light/small/blacklight/directional{ + dir = 8 + }, +/obj/item/restraints/legcuffs/beartrap, +/obj/item/restraints/legcuffs/beartrap, +/obj/item/restraints/legcuffs/beartrap, +/obj/item/grenade/c4, +/obj/item/grenade/c4, +/obj/item/grenade/c4, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"bY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"cx" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/box/white/corners{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/corner, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"el" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"ev" = ( +/obj/machinery/computer/piratepad_control, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"fB" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"fO" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating, +/area/shuttle/pirate) +"ga" = ( +/obj/machinery/space_heater, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"ge" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"gv" = ( +/obj/machinery/suit_storage_unit/pirate{ + helmet_type = /obj/item/clothing/head/helmet/space/syndicate/blue; + suit_type = /obj/item/clothing/suit/space/syndicate/blue + }, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"gM" = ( +/obj/structure/flora/lunar_plant/style_2, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"hM" = ( +/obj/machinery/porta_turret/syndicate/teleport{ + dir = 4; + faction = list("pirate") + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/pirate) +"id" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external/glass/ruin{ + id_tag = "pirateportexternal2" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/turf/open/floor/plating, +/area/shuttle/pirate) +"im" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"iu" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"iG" = ( +/obj/effect/spawner/structure/window/hollow/survival_pod, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "geodebridge"; + dir = 4 + }, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"jh" = ( +/turf/open/floor/catwalk_floor, +/area/shuttle/pirate) +"jx" = ( +/turf/closed/mineral/random/jungle/space_safe, +/area/shuttle/pirate) +"jD" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/machinery/light/small/blacklight/directional{ + dir = 1 + }, +/obj/effect/mob_spawn/ghost_role/human/pirate/lustrous/captain{ + color = "#4f98ff" + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"ka" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/item/trash/energybar, +/turf/open/floor/plating, +/area/shuttle/pirate) +"ko" = ( +/obj/item/trash/energybar, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"kp" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/plating, +/area/shuttle/pirate) +"kx" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"kM" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 7 + }, +/obj/structure/mineral_door/iron, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"kV" = ( +/obj/item/reagent_containers/cup/beaker/large, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"lt" = ( +/turf/template_noop, +/area/template_noop) +"lz" = ( +/obj/machinery/launchpad, +/turf/open/floor/light, +/area/shuttle/pirate) +"lA" = ( +/obj/effect/decal/cleanable/shreds, +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"mv" = ( +/obj/machinery/porta_turret/syndicate/teleport{ + dir = 8; + faction = list("pirate") + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/pirate) +"nk" = ( +/obj/item/stack/sheet/bluespace_crystal{ + amount = 2 + }, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"nD" = ( +/obj/machinery/light/small/blacklight/directional{ + dir = 1 + }, +/obj/item/stock_parts/servo/nano, +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/stripes/white/line, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"nR" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/obj/structure/table/wood, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/item/stock_parts/cell/high, +/obj/item/stock_parts/cell/high, +/turf/open/floor/plating, +/area/shuttle/pirate) +"oa" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/effect/mob_spawn/ghost_role/human/pirate/lustrous{ + color = "#4f98ff" + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"oU" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/machinery/turretid{ + icon_state = "control_kill"; + lethal = 1; + locked = 0; + pixel_y = -24; + req_access = null + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"oV" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"pC" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"pO" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/effect/mob_spawn/ghost_role/human/pirate/lustrous/gunner{ + color = "#4f98ff" + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"qp" = ( +/obj/item/stack/sheet/bluespace_crystal, +/obj/machinery/button/door{ + id = "geodebridge"; + name = "Window Shutters Control"; + pixel_y = 30 + }, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"qK" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/machinery/computer/camera_advanced/syndie{ + dir = 1 + }, +/obj/effect/turf_decal{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"qO" = ( +/obj/effect/turf_decal/lunar_sand, +/obj/structure/table/wood, +/obj/item/book/manual/wiki/telescience{ + pixel_x = -6 + }, +/obj/item/flashlight/flare/candle{ + pixel_x = 7; + pixel_y = 9 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"rn" = ( +/obj/structure/closet/crate/miningcar, +/obj/effect/spawner/random/maintenance/three, +/obj/item/mining_scanner, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"rG" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 3 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"rO" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"tD" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 3 + }, +/turf/closed/wall/mineral/iron, +/area/shuttle/pirate) +"uk" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external/glass/ruin{ + id_tag = "pirateportexternal1" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/turf/open/floor/plating, +/area/shuttle/pirate) +"uH" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/machinery/light/small/blacklight/directional{ + dir = 8 + }, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating, +/area/shuttle/pirate) +"uP" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/box/white/corners{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"vj" = ( +/obj/machinery/computer/shuttle/pirate{ + dir = 8 + }, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"vl" = ( +/obj/effect/spawner/random/maintenance, +/obj/item/shovel, +/obj/structure/closet/crate/miningcar, +/obj/item/stack/sheet/mineral/coal, +/obj/item/stack/rods{ + amount = 5 + }, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"vP" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/item/gun/energy/laser/retro, +/turf/open/floor/plating, +/area/shuttle/pirate) +"vY" = ( +/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/pirate{ + dir = 8; + x_offset = 10; + y_offset = 5 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 3 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"wd" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 7 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"wz" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 3 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/plating, +/area/shuttle/pirate) +"xg" = ( +/obj/effect/spawner/structure/window/hollow/survival_pod, +/obj/structure/barricade/wooden/crude, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"xN" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"xS" = ( +/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6/directional/north, +/obj/item/stack/ore/silver, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"yh" = ( +/obj/structure/cable, +/turf/closed/wall/mineral/iron, +/area/shuttle/pirate) +"yu" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"yz" = ( +/obj/structure/flora/lunar_plant/style_3, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"zO" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"zS" = ( +/obj/item/stack/sheet/bluespace_crystal{ + amount = 2 + }, +/obj/structure/table/wood, +/obj/machinery/reagentgrinder, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"zZ" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"AT" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/docking_port/mobile/pirate{ + launch_status = 0; + movement_force = list("KNOCKDOWN"=0,"THROW"=0); + name = "Pirate Ship"; + port_direction = 2; + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external/glass/ruin{ + id_tag = "pirateportexternal1" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/turf/open/floor/plating, +/area/shuttle/pirate) +"BA" = ( +/obj/structure/closet/crate/cardboard{ + name = "box of climbing hooks" + }, +/obj/item/climbing_hook/syndicate, +/obj/item/climbing_hook/syndicate, +/obj/item/climbing_hook/syndicate, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"BI" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/syndicate, +/obj/item/clothing/glasses/hud/diagnostic{ + pixel_y = -2; + pixel_x = 3 + }, +/obj/effect/turf_decal{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"Cg" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/lunar_sand, +/turf/closed/wall/mineral/iron, +/area/shuttle/pirate) +"Ds" = ( +/obj/machinery/loot_locator, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"Dw" = ( +/obj/machinery/power/port_gen/pacman{ + anchored = 1 + }, +/obj/effect/turf_decal/lunar_sand/plating, +/obj/structure/cable, +/turf/open/floor/plating, +/area/shuttle/pirate) +"Dx" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating, +/area/shuttle/pirate) +"DM" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/structure/cable, +/turf/open/floor/plating, +/area/shuttle/pirate) +"DT" = ( +/obj/structure/fluff/minepost, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"Ec" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/box/white/corners{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"Er" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/structure/showcase/machinery/tv/broken, +/obj/structure/table/wood, +/turf/open/floor/plating, +/area/shuttle/pirate) +"Fx" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external/glass/ruin{ + id_tag = "pirateportexternal2" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/turf/open/floor/plating, +/area/shuttle/pirate) +"Gj" = ( +/obj/machinery/piratepad, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"GQ" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/structure/mineral_door/iron, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"Hm" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"HJ" = ( +/obj/machinery/shuttle_scrambler, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"HY" = ( +/obj/effect/spawner/random/trash/mess, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"Ig" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/machinery/computer/launchpad{ + dir = 1 + }, +/obj/effect/turf_decal{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"Ih" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 7 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/item/stack/ore/gold, +/turf/open/floor/plating, +/area/shuttle/pirate) +"IP" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/machinery/light/small/blacklight/directional{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/mapping_helpers/apc/cut_AI_wire, +/obj/structure/cable, +/turf/open/floor/plating, +/area/shuttle/pirate) +"Js" = ( +/obj/item/coin/gold, +/obj/structure/sign/poster/contraband/random/directional/west, +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"JK" = ( +/obj/item/stack/sheet/bluespace_crystal, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"JL" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plating, +/area/shuttle/pirate) +"JV" = ( +/obj/item/storage/bag/money, +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"Ku" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/structure/cable, +/obj/machinery/power/smes/engineering{ + charge = 1e+006 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"KK" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"Mc" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating, +/area/shuttle/pirate) +"Mm" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 7 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"Mz" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"ME" = ( +/obj/structure/rack, +/obj/effect/turf_decal/lunar_sand/plating, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 4 + }, +/obj/item/storage/box/lights/bulbs, +/obj/item/stack/sheet/mineral/plasma{ + amount = 10 + }, +/obj/item/multitool, +/obj/item/storage/toolbox/electrical, +/obj/structure/cable, +/obj/machinery/power/terminal{ + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"Nb" = ( +/obj/structure/rack, +/obj/item/storage/box/syringes, +/obj/item/storage/medkit/brute, +/obj/item/storage/medkit/fire, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"NT" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/item/trash/energybar, +/turf/open/floor/plating, +/area/shuttle/pirate) +"Od" = ( +/turf/closed/wall/mineral/iron, +/area/shuttle/pirate) +"Oq" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/mob/living/basic/bat{ + faction = list("pirate"); + name = "Sethron"; + desc = "The Lustrous' beloved squatter. Lives rent free." + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"OP" = ( +/obj/structure/rack, +/obj/item/gun/energy/recharge/kinetic_accelerator{ + pixel_y = 5 + }, +/obj/item/gun/energy/recharge/kinetic_accelerator, +/obj/item/gun/energy/recharge/kinetic_accelerator{ + pixel_y = -5 + }, +/obj/item/borg/upgrade/modkit/indoors{ + pixel_y = 5 + }, +/obj/item/borg/upgrade/modkit/indoors{ + pixel_y = 5 + }, +/obj/item/borg/upgrade/modkit/indoors, +/obj/item/borg/upgrade/modkit/indoors, +/obj/item/borg/upgrade/modkit/indoors{ + pixel_y = -5 + }, +/obj/item/borg/upgrade/modkit/indoors{ + pixel_y = -5 + }, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"OR" = ( +/obj/machinery/porta_turret/syndicate/teleport{ + faction = list("pirate") + }, +/turf/closed/wall/mineral/iron, +/area/shuttle/pirate) +"OX" = ( +/obj/structure/sign/poster/contraband/bountyhunters, +/turf/closed/wall/mineral/iron, +/area/shuttle/pirate) +"Pq" = ( +/obj/machinery/power/shuttle_engine/propulsion{ + dir = 8 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"Pr" = ( +/obj/structure/table/wood, +/obj/item/food/energybar{ + pixel_y = 9 + }, +/obj/item/food/energybar, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"PB" = ( +/obj/machinery/light/small/blacklight/directional{ + dir = 4 + }, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"Qo" = ( +/turf/open/floor/iron/stairs{ + dir = 1 + }, +/area/shuttle/pirate) +"QL" = ( +/obj/item/stack/sheet/bluespace_crystal, +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/box/white/corners, +/obj/effect/turf_decal/stripes/white/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"Rp" = ( +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"Rv" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 3 + }, +/obj/structure/cable, +/turf/closed/wall/mineral/iron, +/area/shuttle/pirate) +"Ss" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/machinery/light/small/blacklight/directional, +/obj/machinery/button/door/directional/south{ + id = "pirateportexternal2"; + name = "External Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4; + pixel_x = 5 + }, +/obj/machinery/button/door/directional/south{ + id = "pirateportexternal1"; + name = "External Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4; + pixel_x = -5 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"St" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/stripes/white/line, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"Sy" = ( +/obj/structure/chair/wood, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"SP" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/machinery/light/small/blacklight/directional{ + dir = 8 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"TC" = ( +/obj/structure/flora/lunar_plant/style_1, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"Uf" = ( +/obj/machinery/power/shuttle_engine/heater{ + dir = 8 + }, +/obj/effect/turf_decal/lunar_sand/plating, +/obj/structure/barricade/wooden/crude, +/obj/effect/spawner/structure/window/hollow/survival_pod, +/turf/open/floor/plating, +/area/shuttle/pirate) +"Un" = ( +/obj/item/stock_parts/capacitor/adv, +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"Uw" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/pirate) +"UM" = ( +/obj/effect/spawner/structure/window/hollow/survival_pod, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"UY" = ( +/obj/machinery/airalarm/directional/north, +/obj/structure/table/wood, +/obj/machinery/microwave, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"WR" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"XB" = ( +/obj/machinery/porta_turret/syndicate/teleport{ + dir = 1; + faction = list("pirate") + }, +/turf/closed/wall/mineral/iron, +/area/shuttle/pirate) +"YK" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"Zw" = ( +/turf/open/floor/iron/stairs, +/area/shuttle/pirate) +"ZD" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 7 + }, +/obj/machinery/atmospherics/components/tank/air{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"ZF" = ( +/obj/item/stack/sheet/bluespace_crystal{ + amount = 2 + }, +/obj/machinery/light/small/blacklight/directional{ + dir = 8 + }, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) + +(1,1,1) = {" +lt +lt +lt +lt +lt +yu +yu +jh +yu +yu +yu +jh +yu +yu +lt +lt +lt +lt +lt +"} +(2,1,1) = {" +lt +lt +lt +mv +Od +Pq +Pq +jx +Pq +Pq +Pq +jx +Pq +Pq +Od +mv +lt +lt +lt +"} +(3,1,1) = {" +lt +lt +jx +jx +Od +Uf +Uf +Od +Uf +Uf +Uf +Od +Uf +Uf +Od +jx +jx +lt +lt +"} +(4,1,1) = {" +lt +lt +jx +jx +Od +DT +kp +Uw +Ku +ME +Dw +Uw +ZD +DT +Od +jx +jx +lt +lt +"} +(5,1,1) = {" +lt +lt +lt +jx +Od +Rp +fO +IP +DM +JL +DM +SP +Ih +nk +Od +jx +lt +lt +lt +"} +(6,1,1) = {" +lt +jx +jx +jx +Od +Sy +zS +nR +WR +Oq +Mc +xN +wd +ga +Od +jx +jx +jx +lt +"} +(7,1,1) = {" +jx +jx +jx +jx +Od +xS +kV +ko +Rp +Rp +Od +Od +kM +Od +Od +Od +jx +jx +jx +"} +(8,1,1) = {" +jx +jx +jx +jx +Od +gv +gv +gv +Nb +OP +Od +yz +Mm +Rp +rn +Od +jx +jx +jx +"} +(9,1,1) = {" +jx +jx +Od +Od +Od +Od +Od +Od +Od +Od +OX +Pr +Mm +nk +vl +Od +jx +jx +jx +"} +(10,1,1) = {" +lt +jx +Od +DT +ZF +TC +Od +HJ +aM +Ds +Od +UY +Mm +Rp +DT +Od +Od +Od +lt +"} +(11,1,1) = {" +lt +at +UM +NT +oa +zO +Od +Rp +nk +Rp +Od +BA +Mm +Rp +Dx +uk +St +AT +lt +"} +(12,1,1) = {" +lt +XB +Od +fB +qO +kx +GQ +pC +iu +pC +GQ +pC +rO +ge +Ss +Od +Od +OR +lt +"} +(13,1,1) = {" +lt +Rp +xg +fO +pO +im +Od +gM +wz +bY +Od +HY +JK +Rp +lA +id +St +Fx +lt +"} +(14,1,1) = {" +lt +jx +Od +DT +PB +nk +Od +ev +rG +Gj +Od +KK +zZ +Rp +DT +Od +Od +Od +lt +"} +(15,1,1) = {" +lt +jx +Od +Od +Od +Od +Od +Od +kM +Od +Od +Od +Od +Od +Od +Od +jx +jx +lt +"} +(16,1,1) = {" +lt +jx +Od +Er +YK +Qo +el +uH +kx +iu +iu +Zw +cx +Js +Ec +qK +Od +jx +lt +"} +(17,1,1) = {" +lt +jx +Od +jD +ka +yh +qp +oV +Hm +Mz +oU +tD +nD +lz +Un +BI +Cg +jx +lt +"} +(18,1,1) = {" +lt +jx +Od +Od +Od +Od +DT +vj +vP +vY +DT +Rv +uP +JV +QL +Ig +Od +jx +lt +"} +(19,1,1) = {" +lt +jx +jx +jx +jx +Od +Od +iG +iG +iG +Od +Od +Od +Od +Od +Od +jx +jx +lt +"} +(20,1,1) = {" +lt +lt +jx +jx +jx +jx +hM +lt +lt +lt +hM +jx +jx +jx +jx +jx +jx +lt +lt +"} +(21,1,1) = {" +lt +lt +lt +jx +jx +lt +lt +lt +lt +lt +lt +lt +lt +lt +jx +jx +lt +lt +lt +"} diff --git a/_maps/shuttles/pirate_grey.dmm b/_maps/shuttles/pirate_grey.dmm index 007ff83651a7f..c81c004f6e675 100644 --- a/_maps/shuttles/pirate_grey.dmm +++ b/_maps/shuttles/pirate_grey.dmm @@ -29,6 +29,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/burnt_floor, /obj/structure/cable, +/obj/item/assembly/flash, /turf/open/floor/plating, /area/shuttle/pirate) "aJ" = ( @@ -131,13 +132,10 @@ /obj/structure/sign/poster/random/directional/east, /turf/open/floor/plating, /area/shuttle/pirate) -"eK" = ( -/obj/machinery/power/shuttle_engine/propulsion, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) "eU" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/assembly/flash, /turf/open/floor/iron, /area/shuttle/pirate) "ff" = ( @@ -254,13 +252,13 @@ "jS" = ( /obj/effect/spawner/random/trash/mess, /obj/item/stack/sheet/mineral/plasma/thirty, +/obj/item/knife/butcher, /turf/open/floor/plating, /area/shuttle/pirate) "ko" = ( /obj/effect/spawner/random/entertainment/arcade{ dir = 1 }, -/obj/machinery/light/dim/directional/south, /turf/open/floor/plating, /area/shuttle/pirate) "kw" = ( @@ -387,6 +385,10 @@ /obj/item/clothing/head/helmet/space/eva, /turf/open/floor/plating, /area/shuttle/pirate) +"pR" = ( +/obj/machinery/piratepad, +/turf/open/floor/plating/rust, +/area/shuttle/pirate) "pS" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -422,6 +424,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, /obj/machinery/power/port_gen/pacman/pre_loaded, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/shuttle/pirate) +"qn" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/item/flashlight/flashdark, /turf/open/floor/plating, /area/shuttle/pirate) "qo" = ( @@ -512,6 +520,7 @@ /area/shuttle/pirate) "sO" = ( /obj/structure/sign/poster/contraband/missing_gloves/directional/north, +/obj/machinery/computer/piratepad_control, /turf/open/floor/plating/rust, /area/shuttle/pirate) "ti" = ( @@ -756,6 +765,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/shuttle/pirate) +"zh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/item/knife/butcher, +/turf/open/floor/iron, +/area/shuttle/pirate) "zB" = ( /turf/closed/wall/rust, /area/shuttle/pirate) @@ -887,6 +904,7 @@ dir = 1 }, /obj/effect/spawner/random/maintenance/eight, +/obj/item/knife/combat, /turf/open/floor/iron, /area/shuttle/pirate) "CF" = ( @@ -920,6 +938,7 @@ "Dn" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/item/nullrod/tribal_knife, /turf/open/floor/iron, /area/shuttle/pirate) "DG" = ( @@ -961,6 +980,7 @@ "Fn" = ( /obj/structure/table/wood, /obj/item/reagent_containers/cup/glass/coffee, +/obj/item/assembly/flash, /turf/open/floor/wood, /area/shuttle/pirate) "Fp" = ( @@ -979,8 +999,13 @@ /area/shuttle/pirate) "FP" = ( /obj/structure/broken_flooring, +/obj/item/melee/baseball_bat, /turf/open/floor/plating, /area/shuttle/pirate) +"FT" = ( +/obj/machinery/loot_locator, +/turf/open/floor/plating/rust, +/area/shuttle/pirate) "Gb" = ( /obj/machinery/door/airlock/silver, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -1048,6 +1073,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/burnt_floor, /obj/structure/broken_flooring, +/obj/item/melee/baton/security/cattleprod/telecrystalprod, /turf/open/floor/plating, /area/shuttle/pirate) "IY" = ( @@ -1170,6 +1196,11 @@ /obj/machinery/power/port_gen/pacman/super, /turf/open/floor/plating, /area/shuttle/pirate) +"Oo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/shuttle_scrambler, +/turf/open/floor/plating, +/area/shuttle/pirate) "Ox" = ( /turf/open/floor/iron, /area/shuttle/pirate) @@ -1288,6 +1319,11 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/shuttle/pirate) +"SB" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/item/melee/baton/security/cattleprod/teleprod, +/turf/open/floor/plating, +/area/shuttle/pirate) "Ti" = ( /obj/effect/mapping_helpers/burnt_floor, /turf/closed/wall/rust, @@ -1409,7 +1445,6 @@ /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/directional/north, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -1514,7 +1549,7 @@ zB Ww Ww Ww -eK +Ww Ww Ww Ww @@ -1700,7 +1735,7 @@ HD XX vJ ZU -RU +SB Nm Vw vz @@ -1723,7 +1758,7 @@ QO Ac Wc Mo -fj +qn bp vI Sh @@ -1774,7 +1809,7 @@ zB (17,1,1) = {" pk pk -QO +zh NI Ws Vd @@ -1812,7 +1847,7 @@ Pn (19,1,1) = {" je zB -NI +Oo AZ RU ox @@ -1891,7 +1926,7 @@ je je pk sO -Uv +pR pw yI ti @@ -1914,7 +1949,7 @@ JI Uv sN Am -Uv +FT pk pk ZU diff --git a/_maps/shuttles/pirate_irs.dmm b/_maps/shuttles/pirate_irs.dmm new file mode 100644 index 0000000000000..38067cecaae48 --- /dev/null +++ b/_maps/shuttles/pirate_irs.dmm @@ -0,0 +1,2546 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ac" = ( +/obj/effect/turf_decal/tile/dark/full, +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"az" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 4 + }, +/obj/machinery/iv_drip, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"aC" = ( +/obj/machinery/porta_turret/syndicate/irs, +/turf/closed/wall/mineral/titanium, +/area/shuttle/pirate) +"aT" = ( +/turf/open/floor/iron/white, +/area/shuttle/pirate) +"ba" = ( +/obj/structure/rack, +/obj/structure/window/reinforced/tinted/spawner/directional/west, +/obj/item/storage/box/breacherslug, +/obj/item/gun/ballistic/shotgun/doublebarrel/breacherslug, +/turf/open/floor/iron/smooth, +/area/shuttle/pirate) +"bo" = ( +/obj/structure/railing, +/turf/open/floor/catwalk_floor/iron_dark, +/area/shuttle/pirate) +"bp" = ( +/obj/structure/table, +/obj/effect/turf_decal/siding/dark_green{ + dir = 1 + }, +/obj/item/reagent_containers/cup/rag, +/turf/open/floor/iron/kitchen, +/area/shuttle/pirate) +"bT" = ( +/obj/structure/sink/kitchen/directional/east, +/obj/machinery/button/door/directional/south{ + id = "pirate_irs_bar"; + name = "Privacy Shutters" + }, +/turf/open/floor/iron/kitchen, +/area/shuttle/pirate) +"bV" = ( +/obj/machinery/computer/shuttle/pirate, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 9 + }, +/turf/open/floor/iron, +/area/shuttle/pirate) +"cL" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters{ + dir = 8; + id = "pirate_irs_bridge" + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"cO" = ( +/obj/machinery/computer/monitor{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 6 + }, +/turf/open/floor/iron, +/area/shuttle/pirate) +"dl" = ( +/obj/structure/sign/calendar/directional/north, +/turf/open/floor/glass, +/area/shuttle/pirate) +"do" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line, +/obj/structure/table/glass, +/obj/item/storage/box/masks{ + pixel_y = 6 + }, +/obj/item/stack/medical/bone_gel{ + pixel_x = 10; + pixel_y = 2 + }, +/obj/item/storage/box/gloves, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"dC" = ( +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor/iron_dark, +/area/shuttle/pirate) +"dP" = ( +/obj/effect/turf_decal/siding/dark_green, +/obj/structure/window/reinforced/plasma/spawner/directional/east, +/obj/structure/window/reinforced/plasma/spawner/directional/west, +/obj/structure/window/reinforced/plasma/spawner/directional/south, +/obj/structure/statue/gold/hop{ + name = "statue of the model tax collector" + }, +/turf/open/floor/wood, +/area/shuttle/pirate) +"eg" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/power/port_gen/pacman/pre_loaded, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"ev" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/shuttle/pirate) +"ew" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor/iron_dark, +/area/shuttle/pirate) +"fb" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/shuttle/pirate) +"fe" = ( +/obj/machinery/computer/apc_control, +/turf/open/floor/iron, +/area/shuttle/pirate) +"fm" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/wood, +/area/shuttle/pirate) +"fE" = ( +/obj/effect/turf_decal/caution/stand_clear/white{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"fO" = ( +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/turf/open/floor/iron/edge{ + dir = 8 + }, +/area/shuttle/pirate) +"gd" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/pirate) +"gl" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 1 + }, +/obj/machinery/recharger, +/turf/open/floor/iron, +/area/shuttle/pirate) +"gY" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/turf/closed/wall/mineral/titanium, +/area/shuttle/pirate) +"hf" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters{ + dir = 8; + id = "pirate_irs_bar" + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"hK" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/pirate) +"hS" = ( +/obj/effect/mob_spawn/ghost_role/human/pirate/irs/auditor{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/shuttle/pirate) +"hW" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/effect/turf_decal/bot/left, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"ie" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 9 + }, +/obj/structure/table/glass, +/obj/item/clothing/neck/stethoscope, +/obj/item/storage/backpack/duffelbag/syndie/surgery, +/obj/item/reagent_containers/spray/cleaner, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"ig" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/red/dim/directional/south, +/obj/item/storage/bag/money/vault, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"ip" = ( +/obj/structure/table, +/obj/effect/turf_decal/siding/dark_green{ + dir = 1 + }, +/obj/effect/spawner/random/food_or_drink/donkpockets{ + pixel_y = 6 + }, +/turf/open/floor/iron/kitchen, +/area/shuttle/pirate) +"iG" = ( +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/structure/fluff{ + density = 1; + desc = "Ill-gotten gains of the Space IRS"; + icon = 'icons/obj/stack_objects.dmi'; + icon_state = "sheet-gold_3"; + name = "recouped gold" + }, +/obj/structure/window/reinforced/survival_pod/spawner/directional/south, +/obj/machinery/door/window/brigdoor/right/directional/north{ + req_access = list("syndicate") + }, +/turf/open/floor/iron/smooth, +/area/shuttle/pirate) +"iZ" = ( +/obj/effect/turf_decal/tile/dark/full, +/obj/structure/rack, +/obj/item/electropack{ + pixel_x = 1 + }, +/obj/item/assembly/signaler{ + pixel_x = -8 + }, +/obj/effect/turf_decal/stripes/white{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 9 + }, +/obj/item/melee/chainofcommand, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"jp" = ( +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/full, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"jX" = ( +/obj/effect/turf_decal/tile/dark/full, +/obj/item/reagent_containers/cup/bucket{ + pixel_x = -9; + pixel_y = -4 + }, +/obj/item/stock_parts/cell/lead{ + pixel_y = -8; + pixel_x = 2 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"kK" = ( +/obj/structure/rack, +/obj/structure/window/reinforced/tinted/spawner/directional/east, +/obj/structure/window/reinforced/tinted/spawner/directional/south, +/obj/item/storage/toolbox/syndicate{ + pixel_y = -2 + }, +/obj/item/crowbar/power, +/obj/item/stack/sheet/mineral/sandbags{ + amount = 30 + }, +/turf/open/floor/iron/smooth, +/area/shuttle/pirate) +"kO" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/glass, +/area/shuttle/pirate) +"lc" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/mapping_helpers/airlock/access/any/syndicate, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/machinery/door/airlock/external/glass/ruin{ + id_tag = "pirateportexternal" + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"lf" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/north, +/obj/structure/window/reinforced/survival_pod{ + dir = 5 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"lp" = ( +/obj/effect/turf_decal/stripes, +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/full, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"lE" = ( +/turf/open/floor/iron/grimy, +/area/shuttle/pirate) +"mv" = ( +/obj/structure/rack, +/obj/effect/turf_decal/bot, +/obj/item/storage/box/lights/bulbs{ + pixel_y = -1 + }, +/obj/item/flashlight/seclite{ + pixel_y = -8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/item/storage/toolbox/mechanical, +/obj/item/dyespray{ + pixel_y = 1 + }, +/obj/item/stack/sheet/mineral/plasma{ + amount = 10; + pixel_y = -5 + }, +/obj/item/stack/cable_coil/five{ + pixel_y = -6 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"mA" = ( +/turf/open/floor/iron, +/area/shuttle/pirate) +"mE" = ( +/obj/machinery/door/airlock/grunge{ + name = "Special Tax Recoupment Unit" + }, +/obj/effect/mapping_helpers/airlock/access/any/syndicate, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"mN" = ( +/obj/machinery/loot_locator, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"nk" = ( +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/turf/open/floor/iron/edge{ + dir = 8 + }, +/area/shuttle/pirate) +"nq" = ( +/obj/effect/turf_decal/tile/dark/full, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"nw" = ( +/turf/open/floor/iron/kitchen, +/area/shuttle/pirate) +"nA" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/shuttle/pirate) +"nB" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/mapping_helpers/airlock/access/any/syndicate, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/machinery/door/airlock/external/glass/ruin{ + id_tag = "piratestarboardexternal" + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"nE" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/shuttle/pirate) +"nI" = ( +/obj/effect/turf_decal/tile/dark/full, +/obj/effect/turf_decal/arrows/red{ + dir = 4; + pixel_x = -15 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"nP" = ( +/obj/effect/turf_decal/tile/dark/full, +/obj/effect/decal/cleanable/blood/splatter, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"od" = ( +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/edge{ + dir = 8 + }, +/area/shuttle/pirate) +"oo" = ( +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/edge{ + dir = 8 + }, +/area/shuttle/pirate) +"oH" = ( +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/ammobox/wt550m9{ + pixel_y = 6 + }, +/obj/item/storage/toolbox/ammobox/wt550m9ap, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/smooth, +/area/shuttle/pirate) +"oJ" = ( +/obj/structure/table/reinforced, +/obj/item/flashlight/lamp{ + pixel_x = -5 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/structure/sign/clock/directional/north, +/obj/item/megaphone/command, +/obj/item/encryptionkey/headset_com, +/turf/open/floor/iron/white, +/area/shuttle/pirate) +"pg" = ( +/obj/machinery/door/airlock/vault{ + name = "Vault"; + id_tag = "pirate_irs_vault" + }, +/obj/effect/mapping_helpers/airlock/access/any/syndicate, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/catwalk_floor/iron_dark, +/area/shuttle/pirate) +"px" = ( +/obj/machinery/porta_turret/syndicate/irs{ + dir = 6 + }, +/turf/closed/wall/mineral/titanium, +/area/shuttle/pirate) +"py" = ( +/obj/structure/closet/syndicate, +/obj/item/clothing/under/rank/centcom/military, +/obj/item/clothing/shoes/jackboots{ + pixel_y = -7 + }, +/obj/item/storage/belt/military/assault, +/obj/item/clothing/head/helmet/marine/pmc, +/obj/item/clothing/suit/armor/vest/marine/pmc, +/obj/item/clothing/mask/balaclava, +/obj/item/clothing/gloves/combat, +/obj/item/storage/backpack/security, +/turf/open/floor/iron/smooth, +/area/shuttle/pirate) +"pD" = ( +/obj/machinery/door/airlock/hatch{ + name = "Enhanced Auditing Interview Chamber" + }, +/obj/effect/mapping_helpers/airlock/access/any/syndicate, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"pO" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/shuttle/pirate) +"qj" = ( +/obj/machinery/chem_dispenser/drinks/beer/fullupgrade{ + dir = 1; + pixel_y = -16 + }, +/turf/open/floor/iron/kitchen, +/area/shuttle/pirate) +"qm" = ( +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"qI" = ( +/obj/structure/guncase/wt550, +/obj/item/gun/ballistic/automatic/wt550, +/obj/item/gun/ballistic/automatic/wt550, +/turf/open/floor/iron/smooth, +/area/shuttle/pirate) +"qO" = ( +/obj/effect/turf_decal/bot/left, +/obj/structure/reagent_dispensers/fueltank/large, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"qU" = ( +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"rf" = ( +/obj/structure/chair/stool/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/shuttle/pirate) +"rN" = ( +/obj/machinery/computer/records/medical/syndie, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/shuttle/pirate) +"sb" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line, +/obj/structure/table/glass, +/obj/item/storage/medkit{ + pixel_y = -1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"se" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/wood, +/area/shuttle/pirate) +"sg" = ( +/obj/effect/turf_decal/siding/thinplating_new/corner{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"sr" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/obj/machinery/button/door/directional/south{ + id = "piratestarboardexternal"; + name = "External Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/shuttle/pirate) +"sE" = ( +/obj/structure/table/reinforced, +/obj/item/storage/medkit/regular, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/shuttle/pirate) +"sH" = ( +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/turf/open/floor/iron/edge{ + dir = 4 + }, +/area/shuttle/pirate) +"sP" = ( +/obj/machinery/porta_turret/syndicate/irs{ + dir = 10 + }, +/turf/closed/wall/mineral/titanium, +/area/shuttle/pirate) +"sS" = ( +/obj/structure/chair/stool/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/shuttle/pirate) +"tf" = ( +/obj/machinery/porta_turret/syndicate/irs{ + dir = 5 + }, +/turf/closed/wall/mineral/titanium, +/area/shuttle/pirate) +"tv" = ( +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 1 + }, +/obj/effect/turf_decal/caution/stand_clear/white, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"tF" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/shuttle/pirate) +"uc" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 4 + }, +/obj/item/restraints/handcuffs, +/obj/item/assembly/flash{ + pixel_y = 4; + pixel_x = -2 + }, +/turf/open/floor/iron, +/area/shuttle/pirate) +"uj" = ( +/obj/structure/sign/departments/vault/directional/north, +/obj/machinery/vending/clothing, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/pirate) +"uk" = ( +/obj/structure/rack, +/obj/structure/window/reinforced/tinted/spawner/directional/east, +/obj/item/knife/combat{ + pixel_x = -1 + }, +/obj/item/knife/combat{ + pixel_x = 4 + }, +/obj/item/spess_knife{ + pixel_x = 2; + pixel_y = -4 + }, +/turf/open/floor/iron/smooth, +/area/shuttle/pirate) +"ur" = ( +/obj/machinery/atmospherics/components/tank/air{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/light/small/directional/north, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"uy" = ( +/obj/machinery/chem_dispenser/drinks/fullupgrade{ + dir = 1; + pixel_y = -18 + }, +/obj/effect/turf_decal/siding/dark_green{ + dir = 4 + }, +/obj/machinery/door/window/right/directional/east, +/turf/open/floor/iron/kitchen, +/area/shuttle/pirate) +"uC" = ( +/obj/structure/table/reinforced, +/obj/item/storage/backpack/satchel, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"uJ" = ( +/obj/structure/tank_dispenser, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"vi" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"vo" = ( +/obj/effect/mapping_helpers/airlock/access/any/syndicate, +/obj/machinery/door/airlock/glass{ + name = "Commons Area" + }, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/smooth, +/area/shuttle/pirate) +"vF" = ( +/obj/effect/turf_decal/stripes, +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/full, +/obj/effect/turf_decal/arrows{ + dir = 8; + pixel_x = 14 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"vO" = ( +/obj/effect/turf_decal/bot/right, +/obj/structure/reagent_dispensers/watertank/high, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"wl" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/north, +/obj/structure/window/reinforced/survival_pod{ + dir = 9 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"ww" = ( +/obj/item/documents, +/obj/structure/filingcabinet, +/turf/open/floor/iron/white, +/area/shuttle/pirate) +"wM" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"xo" = ( +/obj/effect/mob_spawn/ghost_role/human/pirate/irs, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/pirate) +"xv" = ( +/obj/machinery/computer/crew{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/turf/open/floor/iron, +/area/shuttle/pirate) +"xy" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 5 + }, +/obj/structure/bed/medical/emergency, +/obj/structure/curtain, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"xQ" = ( +/obj/effect/turf_decal/tile/dark/full, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"yg" = ( +/obj/structure/chair/stool/directional/east, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/wood, +/area/shuttle/pirate) +"yl" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"yN" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/power/smes/engineering{ + charge = 1e+006 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/shuttle/pirate) +"yP" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 6 + }, +/obj/structure/closet/crate/freezer/blood, +/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/random, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/random, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"zh" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/shuttle/pirate) +"zy" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/shuttle/pirate) +"zG" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters{ + dir = 8; + id = "pirate_irs" + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"Ae" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/bot/right, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"Ah" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/iron/stairs{ + dir = 1 + }, +/area/shuttle/pirate) +"Aw" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, +/obj/structure/table/reinforced, +/obj/item/crowbar/red{ + pixel_y = 5 + }, +/obj/item/multitool{ + pixel_x = 3 + }, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron, +/area/shuttle/pirate) +"AB" = ( +/obj/effect/turf_decal/trimline/dark_blue/arrow_cw, +/turf/open/floor/plating/airless, +/area/shuttle/pirate) +"Bf" = ( +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/full, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"Bl" = ( +/obj/machinery/shuttle_scrambler{ + name = "Wireless Tax Retrieval Machine" + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"Bq" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner{ + dir = 8 + }, +/obj/structure/mirror/directional/north, +/obj/structure/sink/directional/south, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"BC" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/cards/deck/cas/black, +/turf/open/floor/wood, +/area/shuttle/pirate) +"BG" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor/iron_dark, +/area/shuttle/pirate) +"BY" = ( +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/edge{ + dir = 8 + }, +/area/shuttle/pirate) +"Cf" = ( +/obj/machinery/vending/autodrobe{ + onstation = 0 + }, +/obj/effect/turf_decal/siding/dark_green{ + dir = 6 + }, +/turf/open/floor/wood, +/area/shuttle/pirate) +"Ck" = ( +/obj/structure/table, +/obj/effect/turf_decal/siding/dark_green{ + dir = 5 + }, +/obj/item/reagent_containers/cup/glass/bottle/beer{ + pixel_x = 5; + pixel_y = -2 + }, +/turf/open/floor/iron/kitchen, +/area/shuttle/pirate) +"Cr" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 4 + }, +/obj/machinery/iv_drip, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"Cx" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line, +/obj/structure/table/optable, +/obj/item/surgical_drapes, +/obj/machinery/defibrillator_mount/loaded{ + pixel_y = -32 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"CB" = ( +/obj/effect/turf_decal/tile/dark/full, +/obj/item/reagent_containers/syringe{ + pixel_y = -11; + pixel_x = -5 + }, +/obj/item/clothing/suit/jacket/straight_jacket{ + pixel_y = 3 + }, +/obj/structure/rack, +/obj/item/taperecorder{ + pixel_x = 6 + }, +/obj/item/reagent_containers/cup/bottle/facid{ + pixel_x = 2 + }, +/obj/item/reagent_containers/cup/bottle/facid{ + pixel_x = -7 + }, +/obj/item/clothing/glasses/blindfold, +/obj/item/clothing/mask/muzzle, +/obj/effect/turf_decal/stripes/white{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 6 + }, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"CM" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 4 + }, +/obj/structure/bed/medical/emergency, +/obj/structure/curtain, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"Dr" = ( +/obj/structure/sign/departments/vault/directional/north, +/obj/effect/turf_decal/trimline/dark_blue/filled/end{ + dir = 8 + }, +/obj/structure/railing{ + dir = 10 + }, +/obj/machinery/shower/directional/south{ + layer = 4 + }, +/obj/effect/turf_decal/box, +/obj/structure/fluff{ + desc = "What, you think the water just magically soaks into the metallic flooring?"; + icon = 'icons/obj/mining_zones/survival_pod.dmi'; + icon_state = "fan_tiny"; + name = "shower drain" + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"Dy" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white, +/area/shuttle/pirate) +"DK" = ( +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/shuttle/pirate) +"DV" = ( +/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw{ + dir = 10 + }, +/turf/open/floor/plating/airless, +/area/shuttle/pirate) +"Ef" = ( +/obj/effect/turf_decal/bot/left, +/obj/machinery/computer/piratepad_control{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"Eq" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/effect/turf_decal/bot, +/obj/machinery/light/small/directional/north, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"Et" = ( +/obj/machinery/power/shuttle_engine/large, +/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw, +/turf/open/floor/plating/airless, +/area/shuttle/pirate) +"EJ" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/small/directional/north, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"Fn" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/shuttle/pirate) +"Fw" = ( +/obj/structure/railing, +/turf/open/floor/iron/stairs{ + dir = 8 + }, +/area/shuttle/pirate) +"FN" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line, +/obj/structure/table/glass, +/obj/item/clothing/mask/muzzle/breath{ + pixel_x = 3; + pixel_y = 4 + }, +/obj/item/healthanalyzer, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"FU" = ( +/obj/machinery/power/shuttle_engine/propulsion/burst, +/turf/open/floor/plating/airless, +/area/shuttle/pirate) +"Gt" = ( +/obj/structure/table, +/obj/effect/turf_decal/siding/dark_green{ + dir = 1 + }, +/obj/machinery/microwave, +/turf/open/floor/iron/kitchen, +/area/shuttle/pirate) +"GN" = ( +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/structure/safe, +/obj/structure/window/reinforced/survival_pod/spawner/directional/west, +/obj/structure/window/reinforced/survival_pod/spawner/directional/north, +/obj/structure/window/reinforced/survival_pod/spawner/directional/south, +/obj/structure/window/reinforced/survival_pod{ + dir = 10 + }, +/obj/structure/window/reinforced/survival_pod{ + dir = 9 + }, +/obj/item/gun/ballistic/revolver/mateba, +/turf/open/floor/iron/smooth, +/area/shuttle/pirate) +"Hg" = ( +/obj/effect/turf_decal/siding/dark/end{ + dir = 4 + }, +/turf/open/floor/glass, +/area/shuttle/pirate) +"HG" = ( +/obj/effect/turf_decal/tile/dark/full, +/obj/structure/rack{ + desc = "someones got a friend in Syria!" + }, +/obj/item/melee/baseball_bat/ablative{ + name = "kneecap buster"; + desc = "This bat is made of highly reflective, highly armored material, It seems to be made specifically for busting one's kneecap"; + pixel_x = 2 + }, +/obj/item/restraints/handcuffs{ + pixel_y = -5; + pixel_x = -3 + }, +/obj/item/restraints/handcuffs{ + pixel_y = -5; + pixel_x = 2 + }, +/obj/effect/turf_decal/stripes/white{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 10 + }, +/obj/item/lead_pipe, +/obj/item/flamethrower{ + name = "Fallujah firehose"; + desc = "Someone's got a friend in Syria!" + }, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"HO" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/obj/machinery/button/door/directional/south{ + id = "pirateportexternal"; + name = "External Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/shuttle/pirate) +"Ic" = ( +/obj/effect/mob_spawn/ghost_role/human/pirate/irs, +/obj/machinery/light/small/directional/north, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/pirate) +"If" = ( +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/turf/open/floor/iron/edge{ + dir = 4 + }, +/area/shuttle/pirate) +"Ik" = ( +/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw, +/turf/open/floor/plating/airless, +/area/shuttle/pirate) +"Ir" = ( +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 1 + }, +/obj/effect/turf_decal/caution/stand_clear/white, +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"IE" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line, +/obj/structure/table/glass, +/obj/item/storage/medkit/brute{ + pixel_y = -1 + }, +/obj/item/storage/medkit/fire{ + pixel_y = 5 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"IS" = ( +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/edge{ + dir = 8 + }, +/area/shuttle/pirate) +"IU" = ( +/obj/structure/table/wood/poker, +/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6/directional/north, +/obj/item/toy/cards/deck, +/turf/open/floor/wood, +/area/shuttle/pirate) +"IY" = ( +/obj/effect/turf_decal/trimline/dark_blue/arrow_cw{ + dir = 6 + }, +/turf/open/floor/plating/airless, +/area/shuttle/pirate) +"IZ" = ( +/turf/open/floor/glass, +/area/shuttle/pirate) +"Jn" = ( +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/any/syndicate, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/public/glass{ + name = "Bridge" + }, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/edge{ + dir = 8 + }, +/area/shuttle/pirate) +"Jq" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/turf/open/floor/iron/stairs{ + dir = 1 + }, +/area/shuttle/pirate) +"Jx" = ( +/obj/machinery/porta_turret/syndicate/irs{ + dir = 8 + }, +/turf/closed/wall/mineral/titanium, +/area/shuttle/pirate) +"Ka" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/dark_blue/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw{ + dir = 10 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"KA" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/iron, +/area/shuttle/pirate) +"KE" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/any/syndicate, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/machinery/door/airlock/external/glass/ruin{ + id_tag = "piratestarboardexternal" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/docking_port/stationary{ + dwidth = 13; + height = 220; + shuttle_id = "pirate_home"; + name = "Deep Space"; + width = 50 + }, +/obj/docking_port/mobile/pirate{ + launch_status = 0; + movement_force = list("KNOCKDOWN"=0,"THROW"=0); + name = "Pirate Ship"; + port_direction = 2 + }, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"KI" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4; + name = "tactical chair" + }, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/turf/open/floor/iron, +/area/shuttle/pirate) +"KJ" = ( +/obj/structure/rack, +/obj/item/storage/box/flashbangs, +/obj/structure/window/reinforced/tinted/spawner/directional/south, +/obj/structure/window/reinforced/tinted/spawner/directional/west, +/obj/item/grenade/smokebomb{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/item/grenade/smokebomb{ + pixel_x = 2; + pixel_y = 5 + }, +/obj/item/grenade/smokebomb{ + pixel_x = 9; + pixel_y = 5 + }, +/obj/item/grenade/smokebomb{ + pixel_x = 9 + }, +/obj/item/grenade/smokebomb{ + pixel_x = 2 + }, +/obj/item/grenade/smokebomb{ + pixel_x = -5 + }, +/obj/item/gun/grenadelauncher{ + pixel_y = 7 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/smooth, +/area/shuttle/pirate) +"KO" = ( +/obj/effect/turf_decal/stripes, +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/full, +/obj/item/reagent_containers/cup/bucket, +/obj/item/mop, +/obj/effect/mapping_helpers/apc/cut_AI_wire, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"KZ" = ( +/obj/machinery/door/window/brigdoor/right/directional/east{ + req_access = list("syndicate") + }, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/machinery/turretid{ + icon_state = "control_kill"; + lethal = 1; + pixel_y = -24; + req_access = list("syndicate") + }, +/turf/open/floor/iron/white, +/area/shuttle/pirate) +"Lf" = ( +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"Lo" = ( +/obj/machinery/porta_turret/syndicate/irs{ + dir = 9 + }, +/turf/closed/wall/mineral/titanium, +/area/shuttle/pirate) +"LB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/shuttle/pirate) +"LM" = ( +/obj/machinery/power/shuttle_engine/large, +/obj/effect/turf_decal/trimline/dark_blue/arrow_cw, +/turf/open/floor/plating/airless, +/area/shuttle/pirate) +"LR" = ( +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/edge{ + dir = 4 + }, +/area/shuttle/pirate) +"LV" = ( +/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/pirate, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 5 + }, +/turf/open/floor/iron, +/area/shuttle/pirate) +"LX" = ( +/turf/open/floor/plating/airless, +/area/shuttle/pirate) +"LZ" = ( +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 4 + }, +/turf/open/floor/iron/edge{ + dir = 4 + }, +/area/shuttle/pirate) +"Ma" = ( +/obj/structure/closet/syndicate, +/obj/item/clothing/under/rank/centcom/military, +/obj/item/clothing/shoes/jackboots{ + pixel_y = -7 + }, +/obj/item/storage/belt/military/assault, +/obj/machinery/light/directional/east, +/obj/item/clothing/head/helmet/marine/pmc, +/obj/item/clothing/suit/armor/vest/marine/pmc, +/obj/item/clothing/mask/balaclava, +/obj/item/clothing/gloves/combat, +/obj/item/storage/backpack/security, +/turf/open/floor/iron/smooth, +/area/shuttle/pirate) +"Mu" = ( +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/shuttle/pirate) +"Mv" = ( +/obj/effect/turf_decal/tile/dark/full, +/obj/structure/chair/e_chair{ + dir = 8 + }, +/obj/effect/turf_decal/box/red, +/obj/effect/decal/cleanable/blood/gibs/old, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"My" = ( +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/smooth, +/area/shuttle/pirate) +"MJ" = ( +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 4 + }, +/obj/structure/sign/departments/security/directional/east, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/edge{ + dir = 4 + }, +/area/shuttle/pirate) +"Ni" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/siding/dark_green, +/obj/machinery/light/directional/north, +/turf/open/floor/wood, +/area/shuttle/pirate) +"No" = ( +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 4 + }, +/obj/structure/sign/departments/security/directional/east, +/turf/open/floor/iron/edge{ + dir = 4 + }, +/area/shuttle/pirate) +"NW" = ( +/obj/structure/table/reinforced, +/obj/item/stamp{ + pixel_x = 7; + pixel_y = 10 + }, +/obj/item/stamp/denied{ + pixel_x = 7; + pixel_y = 1 + }, +/obj/item/paper_bin{ + pixel_y = 4; + pixel_x = -5 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/shuttle/pirate) +"NX" = ( +/obj/machinery/jukebox{ + req_access = null + }, +/obj/effect/turf_decal/siding/dark_green, +/turf/open/floor/wood, +/area/shuttle/pirate) +"Og" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/any/syndicate, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/machinery/door/airlock/external/glass/ruin{ + id_tag = "pirateportexternal" + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"Ot" = ( +/obj/machinery/porta_turret/syndicate/irs{ + dir = 4 + }, +/turf/closed/wall/mineral/titanium, +/area/shuttle/pirate) +"OC" = ( +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/shuttle/pirate) +"Pn" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/red/dim/directional/south, +/obj/item/stack/sheet/mineral/gold{ + amount = 3; + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/stack/sheet/mineral/silver{ + amount = 8; + pixel_x = 6; + pixel_y = 2 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"PP" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters{ + id = "pirate_irs_bridge"; + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"PX" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Room" + }, +/obj/effect/mapping_helpers/airlock/access/any/syndicate, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"Qc" = ( +/obj/effect/turf_decal/bot/right, +/obj/machinery/piratepad, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"Qi" = ( +/obj/structure/railing, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor/iron_dark, +/area/shuttle/pirate) +"Qn" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"Qv" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "pirate_irs_bridge"; + name = "Bridge Shutters" + }, +/turf/open/floor/iron, +/area/shuttle/pirate) +"Qx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/turf/closed/wall/mineral/titanium, +/area/shuttle/pirate) +"QQ" = ( +/obj/structure/table/wood, +/obj/item/plate, +/obj/item/food/burger/bigbite, +/obj/machinery/computer/security/telescreen/entertainment/directional/south, +/turf/open/floor/wood, +/area/shuttle/pirate) +"QT" = ( +/obj/machinery/vending/boozeomat/all_access{ + onstation = 0 + }, +/turf/closed/wall/mineral/titanium, +/area/shuttle/pirate) +"QV" = ( +/obj/structure/chair/stool/bar/directional/south, +/turf/open/floor/iron/grimy, +/area/shuttle/pirate) +"Rh" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters{ + id = "pirate_irs_bridge"; + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"Rv" = ( +/obj/structure/table/reinforced, +/obj/item/folder/blue, +/obj/item/pen/fountain, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/shuttle/pirate) +"RC" = ( +/obj/structure/table/reinforced, +/obj/item/storage/fancy/donut_box, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/shuttle/pirate) +"RF" = ( +/obj/effect/turf_decal/siding/dark/end{ + dir = 8 + }, +/turf/open/floor/glass, +/area/shuttle/pirate) +"RX" = ( +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 8 + }, +/turf/open/floor/iron/edge{ + dir = 8 + }, +/area/shuttle/pirate) +"SA" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 10 + }, +/obj/machinery/computer/operating{ + dir = 1 + }, +/obj/item/disk/surgery/irs, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"SC" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/dark_blue/corner, +/obj/effect/turf_decal/trimline/dark_blue/arrow_cw{ + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"SG" = ( +/obj/effect/turf_decal/siding/thinplating_new/corner{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"SM" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/shuttle/pirate) +"SQ" = ( +/obj/machinery/photocopier/gratis, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/white, +/area/shuttle/pirate) +"Tg" = ( +/obj/effect/turf_decal/stripes{ + dir = 5 + }, +/obj/structure/table/reinforced, +/obj/structure/fluff{ + density = 1; + desc = "Ill-gotten gains of the Space IRS"; + icon = 'icons/obj/stack_objects.dmi'; + icon_state = "sheet-silver_3"; + name = "recouped silver" + }, +/obj/structure/window/reinforced/survival_pod/spawner/directional/north, +/obj/structure/window/reinforced/survival_pod/spawner/directional/east, +/obj/structure/window/reinforced/survival_pod/spawner/directional/south, +/obj/structure/window/reinforced/survival_pod{ + dir = 6 + }, +/obj/structure/window/reinforced/survival_pod{ + dir = 5 + }, +/turf/open/floor/iron/smooth, +/area/shuttle/pirate) +"Th" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/shuttle/pirate) +"Ts" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/turf/open/floor/iron, +/area/shuttle/pirate) +"Tu" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/dark, +/turf/open/floor/glass, +/area/shuttle/pirate) +"TA" = ( +/obj/structure/table/wood, +/obj/item/plate, +/turf/open/floor/wood, +/area/shuttle/pirate) +"Uk" = ( +/obj/machinery/door/airlock/vault{ + name = "Vault"; + id_tag = "pirate_irs_vault" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/effect/mapping_helpers/airlock/access/any/syndicate, +/obj/machinery/door/firedoor, +/turf/open/floor/catwalk_floor/iron_dark, +/area/shuttle/pirate) +"UF" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, +/turf/open/floor/iron, +/area/shuttle/pirate) +"Vf" = ( +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/edge{ + dir = 4 + }, +/area/shuttle/pirate) +"VB" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/layer2{ + dir = 4; + on = 1 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"VS" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/north, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"WA" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/closed/wall/mineral/titanium, +/area/shuttle/pirate) +"WO" = ( +/obj/effect/turf_decal/tile/dark/full, +/obj/structure/toilet{ + dir = 8; + name = "swirlie-inator 3000" + }, +/obj/effect/turf_decal/bot_red, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"WR" = ( +/turf/template_noop, +/area/template_noop) +"WU" = ( +/obj/effect/turf_decal/tile/dark/full, +/obj/machinery/light/red/directional/east, +/turf/open/floor/pod/light, +/area/shuttle/pirate) +"Xr" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Auditing Office" + }, +/obj/effect/mapping_helpers/airlock/access/any/syndicate, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white, +/area/shuttle/pirate) +"XI" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters{ + dir = 1; + id = "pirate_irs_bridge" + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"XX" = ( +/obj/structure/railing{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/dark_blue/warning{ + dir = 6 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"Ya" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/obj/machinery/button/door/directional/north{ + id = "pirate_irs_vault"; + normaldoorcontrol = 1; + specialfunctions = 4; + name = "Vault Lockdown" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/shuttle/pirate) +"Yf" = ( +/obj/machinery/power/rtg/advanced{ + power_gen = 608000 + }, +/obj/structure/cable, +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/machinery/door/window/brigdoor/right/directional/north{ + req_access = list("syndicate") + }, +/obj/structure/window/reinforced/plasma/spawner/directional/south, +/obj/structure/window/reinforced/plasma/spawner/directional/east, +/obj/structure/window/reinforced/plasma/spawner/directional/west, +/turf/open/floor/plating, +/area/shuttle/pirate) +"Yu" = ( +/obj/machinery/power/shuttle_engine/heater, +/obj/structure/window/reinforced/tinted/spawner/directional/north, +/turf/open/floor/plating/airless, +/area/shuttle/pirate) +"YE" = ( +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/edge{ + dir = 8 + }, +/area/shuttle/pirate) +"YJ" = ( +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/any/syndicate, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/machinery/door/airlock/public/glass{ + name = "Bridge" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/edge{ + dir = 4 + }, +/area/shuttle/pirate) +"ZE" = ( +/obj/item/reagent_containers/cup/glass/bottle/ritual_wine{ + pixel_y = 14; + pixel_x = -8 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_x = -9 + }, +/obj/structure/table/reinforced, +/obj/machinery/button/door/directional/north{ + id = "pirate_irs"; + name = "Privacy Shutters" + }, +/obj/item/melee/baton/telescopic{ + pixel_y = 11; + pixel_x = 8 + }, +/obj/item/storage/fancy/cigarettes/cigars/cohiba{ + pixel_y = 9; + pixel_x = 6 + }, +/obj/item/lighter/skull{ + pixel_x = 11; + pixel_y = 1 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_x = 9 + }, +/turf/open/floor/iron/white, +/area/shuttle/pirate) + +(1,1,1) = {" +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +VB +WR +WR +WR +WR +"} +(2,1,1) = {" +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +hK +hK +Qx +hK +sP +WR +WR +"} +(3,1,1) = {" +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +Jx +hK +hf +hf +hf +hK +hK +mv +KO +Yf +hK +hK +WR +"} +(4,1,1) = {" +WR +WR +WR +WR +WR +WR +hK +zG +zG +zG +hK +NX +lE +QV +Gt +bT +hK +ur +lp +yN +Yu +FU +DV +"} +(5,1,1) = {" +WR +WR +WR +WR +WR +hK +hK +ZE +hS +SQ +hK +Ni +lE +QV +ip +nw +QT +vO +jp +Bf +Yu +LX +Et +"} +(6,1,1) = {" +WR +WR +WR +WR +WR +hK +ww +Fn +aT +Dy +hK +dP +lE +QV +bp +qj +hK +qO +vF +eg +Yu +LX +Ik +"} +(7,1,1) = {" +WR +WR +Lo +cL +cL +hK +oJ +Rv +NW +KZ +hK +Cf +lE +QV +Ck +uy +hK +hK +PX +hK +hK +hK +hK +"} +(8,1,1) = {" +WR +WR +Rh +Ts +xv +hK +dl +kO +kO +IZ +hK +yg +fm +RF +se +fb +hK +Ae +BG +lc +fE +qU +Og +"} +(9,1,1) = {" +WR +hK +hK +rN +KA +hK +IZ +IZ +IZ +IZ +hK +IU +sS +Tu +rf +QQ +hK +Eq +HO +gd +gd +hK +hK +"} +(10,1,1) = {" +WR +Rh +Qv +sE +SM +hK +Ka +IZ +IZ +SC +hK +BC +sS +Hg +rf +TA +hK +hW +BG +VS +Bl +hK +WR +"} +(11,1,1) = {" +Lo +Rh +RC +LB +zh +gd +WA +Xr +hK +gY +hK +hK +gY +vo +WA +hK +gd +sg +BG +lf +ig +aC +WR +"} +(12,1,1) = {" +Rh +bV +Th +mA +zy +Jn +nk +RX +IS +nk +od +BY +nk +YE +oo +fO +Jq +tv +BG +Lf +Qc +hK +WR +"} +(13,1,1) = {" +Rh +LV +ev +mA +pO +YJ +sH +LR +sH +sH +Vf +LZ +MJ +If +No +LZ +Ah +Ir +BG +Lf +Ef +hK +WR +"} +(14,1,1) = {" +tf +Rh +gl +nA +nE +gd +hK +hK +Uk +hK +hK +hK +hK +mE +hK +hK +gd +SG +BG +wl +Pn +aC +WR +"} +(15,1,1) = {" +WR +Rh +Aw +uc +tF +hK +ba +KJ +BG +GN +hK +xo +bo +Qi +ie +SA +hK +uC +BG +VS +mN +hK +WR +"} +(16,1,1) = {" +WR +hK +hK +fe +KI +hK +DK +My +BG +iG +hK +Ic +bo +Qi +yl +Cx +hK +EJ +sr +gd +gd +hK +hK +"} +(17,1,1) = {" +WR +WR +XI +UF +cO +hK +uk +kK +BG +Tg +hK +uj +Fw +Qi +yl +FN +hK +uJ +BG +nB +fE +qU +KE +"} +(18,1,1) = {" +WR +WR +tf +PP +PP +hK +Ya +BG +BG +BG +pg +ew +dC +BG +vi +sb +hK +hK +pD +hK +hK +hK +hK +"} +(19,1,1) = {" +WR +WR +WR +WR +WR +hK +oH +OC +Mu +OC +hK +Dr +BG +XX +wM +IE +hK +iZ +nI +HG +Yu +LX +LM +"} +(20,1,1) = {" +WR +WR +WR +WR +WR +hK +hK +py +Ma +qI +hK +Bq +Qn +wM +qm +do +hK +jX +ac +xQ +Yu +LX +AB +"} +(21,1,1) = {" +WR +WR +WR +WR +WR +WR +hK +hK +hK +hK +hK +xy +Cr +CM +az +yP +hK +nP +Mv +nq +Yu +FU +IY +"} +(22,1,1) = {" +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +Ot +hK +hK +hK +hK +hK +hK +WO +WU +CB +hK +hK +WR +"} +(23,1,1) = {" +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +hK +hK +hK +hK +px +WR +WR +"} diff --git a/_maps/shuttles/pirate_silverscale.dmm b/_maps/shuttles/pirate_silverscale.dmm index f2437daf82ed0..efe506d8f8783 100644 --- a/_maps/shuttles/pirate_silverscale.dmm +++ b/_maps/shuttles/pirate_silverscale.dmm @@ -10,22 +10,6 @@ }, /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, @@ -39,37 +23,12 @@ dir = 8 }, /area/shuttle/pirate) -"bH" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"ci" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"cE" = ( -/obj/structure/chair/sofa/corp/left{ - 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" @@ -87,11 +46,21 @@ /obj/structure/dresser, /turf/open/floor/carpet/royalblack, /area/shuttle/pirate) +"dQ" = ( +/obj/machinery/power/port_gen/pacman{ + anchored = 1 + }, +/obj/structure/cable, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/effect/turf_decal/bot, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) "dT" = ( -/obj/item/ammo_box/a762{ +/obj/item/ammo_box/strilka310{ pixel_y = 2 }, -/obj/item/ammo_box/a762, +/obj/item/ammo_box/strilka310, /obj/item/grenade/c4{ pixel_x = -13 }, @@ -143,20 +112,17 @@ }, /turf/open/floor/carpet/royalblack, /area/shuttle/pirate) +"fR" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/pod/dark, +/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/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) "ht" = ( /obj/machinery/door/airlock/silver, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, @@ -204,11 +170,6 @@ }, /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 @@ -235,14 +196,6 @@ }, /turf/open/floor/iron/dark, /area/shuttle/pirate) -"lu" = ( -/obj/item/storage/secure/safe/directional/north, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/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 @@ -321,13 +274,6 @@ }, /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) @@ -392,11 +338,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, @@ -435,6 +376,14 @@ /obj/machinery/meter, /turf/open/floor/pod/dark, /area/shuttle/pirate) +"zm" = ( +/obj/item/storage/secure/safe/directional/north, +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/structure/bed/pod, +/obj/item/bedsheet/black, +/turf/open/floor/carpet/royalblack, +/area/shuttle/pirate) "zB" = ( /obj/structure/table/glass, /obj/machinery/chem_dispenser/drinks/beer{ @@ -535,31 +484,32 @@ }, /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/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) "DX" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/open/floor/carpet/royalblack, /area/shuttle/pirate) +"Fk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"Fl" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) "Gr" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 8 @@ -594,11 +544,6 @@ }, /turf/open/floor/plating, /area/shuttle/pirate) -"HS" = ( -/obj/structure/musician/piano, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) "Ig" = ( /obj/structure/table/glass, /obj/machinery/chem_dispenser/drinks{ @@ -642,14 +587,16 @@ /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/dark/textured, /area/shuttle/pirate) +"JO" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/bot/right, +/obj/machinery/light/directional/south, +/turf/open/floor/pod/dark, +/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 @@ -660,6 +607,15 @@ }, /turf/open/floor/pod/dark, /area/shuttle/pirate) +"Ln" = ( +/obj/machinery/power/smes/engineering{ + charge = 1e+006 + }, +/obj/structure/cable, +/obj/effect/turf_decal/bot, +/obj/machinery/light/directional/north, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) "LE" = ( /obj/machinery/porta_turret/syndicate/energy{ dir = 4; @@ -679,6 +635,22 @@ }, /turf/open/floor/carpet/royalblack, /area/shuttle/pirate) +"LZ" = ( +/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/small/directional/west, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) "Mo" = ( /obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/pirate{ dir = 8; @@ -817,8 +789,8 @@ dir = 8; layer = 2.9 }, -/obj/item/ammo_box/a762, -/obj/item/ammo_box/a762{ +/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/strilka310{ pixel_y = 3 }, /obj/effect/turf_decal/bot, @@ -835,10 +807,6 @@ /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 @@ -855,22 +823,21 @@ }, /turf/open/floor/pod/dark, /area/shuttle/pirate) -"Su" = ( -/obj/machinery/power/port_gen/pacman{ - anchored = 1 - }, -/obj/structure/cable, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/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) +"TB" = ( +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) +"TF" = ( +/obj/structure/musician/piano, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/shuttle/pirate) "TT" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -903,6 +870,14 @@ /obj/item/melee/roastingstick, /turf/open/floor/iron/dark/textured, /area/shuttle/pirate) +"Ux" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/carpet/royalblack, +/area/shuttle/pirate) "UJ" = ( /obj/machinery/power/shuttle_engine/propulsion{ dir = 8 @@ -912,6 +887,10 @@ }, /turf/open/floor/plating/airless, /area/shuttle/pirate) +"UV" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) "Vw" = ( /obj/structure/table, /obj/machinery/recharger, @@ -992,12 +971,10 @@ /obj/effect/mapping_helpers/airlock/cutaiwire, /turf/open/floor/pod/light, /area/shuttle/pirate) -"ZU" = ( -/obj/structure/chair/sofa/corp/right{ - dir = 1 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark, +"ZY" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/carpet/royalblack, /area/shuttle/pirate) (1,1,1) = {" @@ -1079,7 +1056,7 @@ TV (5,1,1) = {" rB rB -Su +dQ Si rB aZ @@ -1090,14 +1067,14 @@ Yj RO xR rB -ci +Fk QI rB rB "} (6,1,1) = {" rB -CP +Ln Lk Si ht @@ -1111,24 +1088,24 @@ wa cH Si yv -ko +JO rB "} (7,1,1) = {" rB QU Pg -qA +Fl rB -RY +Qm wa -bH +fR Ox Qm wa -RY +Qm rB -xe +UV wa Wy rB @@ -1156,17 +1133,17 @@ rB HD JL fT -cE +Aj xs -HS +TF Ch eU Jc -gg +Ux Ch -aA +LZ xs -Kq +Ai fT Gy HD @@ -1232,7 +1209,7 @@ HD HD XX fT -ZU +CH xs Nm Vw @@ -1242,7 +1219,7 @@ vz YD Ae xs -dd +TB fT Ig HD @@ -1326,7 +1303,7 @@ rB (18,1,1) = {" wE rB -lu +zm RU rB je @@ -1338,7 +1315,7 @@ je je rB Uf -DP +ZY rB wE "} diff --git a/_maps/shuttles/ruin_cyborg_mothership.dmm b/_maps/shuttles/ruin_cyborg_mothership.dmm index 1fe1be5bd4611..e7808943d3d3b 100644 --- a/_maps/shuttles/ruin_cyborg_mothership.dmm +++ b/_maps/shuttles/ruin_cyborg_mothership.dmm @@ -1,9 +1,4 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"az" = ( -/obj/structure/lattice, -/obj/structure/marker_beacon/cerulean, -/turf/template_noop, -/area/shuttle/ruin/cyborg_mothership) "aB" = ( /obj/machinery/conveyor{ dir = 8; @@ -17,8 +12,7 @@ id = "mothership_main" }, /obj/machinery/recycler{ - dir = 1; - eat_dir = 4 + dir = 8 }, /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) @@ -54,6 +48,10 @@ }, /turf/template_noop, /area/shuttle/ruin/cyborg_mothership) +"dO" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/circuit/airless, +/area/shuttle/ruin/cyborg_mothership) "ey" = ( /obj/structure/table, /obj/item/toy/talking/ai{ @@ -79,15 +77,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/plating, /area/shuttle/ruin/cyborg_mothership) -"fV" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/shieldgen{ - anchored = 1; - req_access = null - }, -/obj/structure/marker_beacon/violet, -/turf/template_noop, -/area/shuttle/ruin/cyborg_mothership) "gG" = ( /obj/machinery/light/small/directional/west, /obj/machinery/power/solar_control{ @@ -128,11 +117,25 @@ }, /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) +"ir" = ( +/obj/structure/table/optable, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/shuttle/ruin/cyborg_mothership) "iv" = ( /obj/structure/lattice, /obj/structure/spacevine, /turf/template_noop, /area/shuttle/ruin/cyborg_mothership) +"iN" = ( +/obj/structure/table, +/obj/effect/turf_decal/bot, +/obj/item/clothing/gloves/latex, +/obj/item/clothing/mask/surgical, +/obj/item/razor, +/obj/structure/mirror/directional/west, +/turf/open/floor/iron/dark, +/area/shuttle/ruin/cyborg_mothership) "iO" = ( /obj/machinery/rnd/production/protolathe/offstation, /obj/machinery/conveyor{ @@ -148,12 +151,6 @@ }, /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) -"jH" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/floor/iron/showroomfloor, -/area/shuttle/ruin/cyborg_mothership) "jJ" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -187,17 +184,6 @@ }, /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) -"lZ" = ( -/obj/machinery/camera/directional/south, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south{ - environ = 0; - equipment = 0; - lighting = 0 - }, -/obj/effect/mapping_helpers/apc/unlocked, -/turf/open/floor/circuit/airless, -/area/shuttle/ruin/cyborg_mothership) "mc" = ( /obj/machinery/door/airlock/hatch, /obj/structure/cable, @@ -215,6 +201,13 @@ /obj/structure/plasticflaps, /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) +"ms" = ( +/obj/item/stack/rods, +/obj/machinery/button/door/directional/east{ + id = "mothership_right" + }, +/turf/open/floor/circuit/airless, +/area/shuttle/ruin/cyborg_mothership) "mC" = ( /obj/machinery/mineral/ore_redemption/offstation{ input_dir = 4 @@ -333,6 +326,18 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) +"qz" = ( +/obj/machinery/camera/directional/south, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south{ + environ = 0; + equipment = 0; + lighting = 0 + }, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/machinery/light/cold/no_nightlight/directional/south, +/turf/open/floor/circuit/airless, +/area/shuttle/ruin/cyborg_mothership) "qV" = ( /obj/structure/spacevine, /obj/machinery/conveyor{ @@ -353,14 +358,8 @@ }, /turf/open/floor/circuit/airless, /area/shuttle/ruin/cyborg_mothership) -"rE" = ( -/obj/structure/lattice, -/obj/structure/spacevine, -/obj/structure/marker_beacon/violet, -/turf/template_noop, -/area/shuttle/ruin/cyborg_mothership) "rJ" = ( -/mob/living/simple_animal/hostile/hivebot, +/mob/living/basic/hivebot, /obj/structure/spacevine, /obj/machinery/conveyor{ id = "mothership_main" @@ -422,12 +421,6 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) -"wk" = ( -/obj/structure/table/optable, -/obj/effect/turf_decal/bot, -/obj/machinery/light/cold/no_nightlight/directional/east, -/turf/open/floor/iron/dark, -/area/shuttle/ruin/cyborg_mothership) "wo" = ( /obj/machinery/conveyor_switch/oneway{ id = "mothership_main" @@ -453,17 +446,6 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) -"xz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 4 - }, -/obj/machinery/power/port_gen/pacman, -/turf/open/floor/plating/airless, -/area/shuttle/ruin/cyborg_mothership) "yd" = ( /obj/effect/mapping_helpers/burnt_floor, /obj/effect/turf_decal/stripes/asteroid/line{ @@ -478,6 +460,13 @@ }, /turf/open/floor/circuit/airless, /area/shuttle/ruin/cyborg_mothership) +"yw" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/obj/machinery/light/floor/broken, +/turf/open/floor/iron/showroomfloor, +/area/shuttle/ruin/cyborg_mothership) "yA" = ( /obj/structure/spacevine, /obj/machinery/conveyor{ @@ -491,7 +480,7 @@ /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/ruin/cyborg_mothership) "yG" = ( -/mob/living/simple_animal/hostile/hivebot/range, +/mob/living/basic/hivebot/range, /turf/open/floor/circuit/airless, /area/shuttle/ruin/cyborg_mothership) "yQ" = ( @@ -499,11 +488,6 @@ /obj/structure/cable, /turf/open/floor/circuit/airless, /area/shuttle/ruin/cyborg_mothership) -"zh" = ( -/obj/structure/lattice, -/obj/structure/marker_beacon/violet, -/turf/template_noop, -/area/shuttle/ruin/cyborg_mothership) "zn" = ( /obj/machinery/power/shuttle_engine/propulsion, /obj/structure/spacevine, @@ -556,16 +540,6 @@ }, /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) -"Cq" = ( -/obj/structure/lattice/catwalk, -/obj/structure/spacevine, -/obj/machinery/shieldgen{ - anchored = 1; - req_access = null - }, -/obj/structure/marker_beacon/violet, -/turf/template_noop, -/area/shuttle/ruin/cyborg_mothership) "Dv" = ( /obj/structure/cable, /obj/structure/table_frame, @@ -606,7 +580,7 @@ /area/shuttle/ruin/cyborg_mothership) "FQ" = ( /obj/structure/lattice, -/mob/living/simple_animal/hostile/hivebot/range, +/mob/living/basic/hivebot/range, /turf/template_noop, /area/shuttle/ruin/cyborg_mothership) "Ge" = ( @@ -618,13 +592,14 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) -"Gf" = ( -/obj/item/stack/rods, -/obj/machinery/light/broken/directional/east, -/obj/machinery/button/door/directional/east{ - id = "mothership_right" +"GF" = ( +/obj/structure/lattice/catwalk, +/obj/structure/spacevine, +/obj/machinery/shieldgen{ + anchored = 1; + req_access = null }, -/turf/open/floor/circuit/airless, +/turf/template_noop, /area/shuttle/ruin/cyborg_mothership) "Hg" = ( /obj/machinery/conveyor{ @@ -634,7 +609,7 @@ /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) "HK" = ( -/mob/living/simple_animal/hostile/hivebot, +/mob/living/basic/hivebot, /obj/item/circuitboard/aicore, /obj/structure/cable, /turf/open/floor/circuit/green/airless, @@ -665,7 +640,7 @@ /area/shuttle/ruin/cyborg_mothership) "JJ" = ( /obj/structure/lattice, -/mob/living/simple_animal/hostile/hivebot/mechanic, +/mob/living/basic/hivebot/mechanic, /turf/template_noop, /area/shuttle/ruin/cyborg_mothership) "Ks" = ( @@ -705,14 +680,6 @@ }, /turf/open/floor/circuit/green/airless, /area/shuttle/ruin/cyborg_mothership) -"MK" = ( -/obj/machinery/light/cold/no_nightlight/directional/west, -/obj/machinery/button/door/directional/west{ - id = "mothership_left" - }, -/obj/structure/cable, -/turf/open/floor/circuit/airless, -/area/shuttle/ruin/cyborg_mothership) "MZ" = ( /obj/structure/cable, /obj/machinery/conveyor{ @@ -737,9 +704,16 @@ /obj/structure/plasticflaps, /turf/open/floor/iron/showroomfloor, /area/shuttle/ruin/cyborg_mothership) +"Nz" = ( +/obj/machinery/button/door/directional/west{ + id = "mothership_left" + }, +/obj/structure/cable, +/turf/open/floor/circuit/airless, +/area/shuttle/ruin/cyborg_mothership) "Oq" = ( /obj/structure/table, -/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/item/surgery_tray/full, /obj/effect/turf_decal/bot, /obj/structure/sink/directional/east, /obj/item/toy/figure/borg{ @@ -777,16 +751,6 @@ /obj/item/stack/sheet/glass/fifty, /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) -"PP" = ( -/obj/structure/table, -/obj/effect/turf_decal/bot, -/obj/item/clothing/gloves/latex, -/obj/item/clothing/mask/surgical, -/obj/item/razor, -/obj/structure/mirror/directional/west, -/obj/machinery/light/cold/no_nightlight/directional/west, -/turf/open/floor/iron/dark, -/area/shuttle/ruin/cyborg_mothership) "QE" = ( /obj/structure/lattice, /obj/machinery/camera/directional/east, @@ -823,10 +787,12 @@ }, /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) -"Sy" = ( -/obj/machinery/light/cold/no_nightlight/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/circuit/airless, +"Sd" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/showroomfloor, /area/shuttle/ruin/cyborg_mothership) "SV" = ( /obj/machinery/power/shuttle_engine/heater, @@ -841,6 +807,17 @@ /obj/item/stack/sheet/mineral/titanium, /turf/template_noop, /area/shuttle/ruin/cyborg_mothership) +"TH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/window/reinforced/spawner/directional/north{ + layer = 2.9 + }, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/obj/machinery/power/port_gen/pacman, +/turf/open/floor/plating/airless, +/area/shuttle/ruin/cyborg_mothership) "TZ" = ( /obj/item/radio/intercom/directional/south, /obj/structure/ai_core, @@ -940,18 +917,16 @@ /obj/structure/plasticflaps, /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) -"ZB" = ( -/obj/machinery/light/cold/no_nightlight/directional/west, -/turf/open/floor/circuit/airless, -/area/shuttle/ruin/cyborg_mothership) "ZD" = ( /obj/structure/cable, /turf/open/floor/plating, /area/shuttle/ruin/cyborg_mothership) -"ZI" = ( -/obj/structure/lattice, -/obj/structure/spacevine, -/obj/structure/marker_beacon/cerulean, +"ZO" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/shieldgen{ + anchored = 1; + req_access = null + }, /turf/template_noop, /area/shuttle/ruin/cyborg_mothership) @@ -1015,7 +990,7 @@ hR hR hR hR -xz +TH RD wA jx @@ -1035,7 +1010,7 @@ hR hR hR hR -Cq +GF oe oe oe @@ -1074,7 +1049,7 @@ of oe BD oe -fV +ZO hR hR hR @@ -1087,13 +1062,13 @@ hR hR oe UU -zh +so so hR hR -az +so aB -az +so hR BS oy @@ -1122,7 +1097,7 @@ so hR hR so -zh +so MZ oe hR @@ -1185,16 +1160,16 @@ kz zZ zZ mN -PP +iN Oq zZ kz kz zZ -MK +Nz ww UL -ZB +Uq zZ kz hR @@ -1210,7 +1185,7 @@ yF fB zZ Ey -jH +Sd Fe yF HM @@ -1223,7 +1198,7 @@ Ln Uq yF so -az +so ss of dC @@ -1245,7 +1220,7 @@ ks TZ zZ uK -lZ +qz zZ VU tr @@ -1260,7 +1235,7 @@ yF pY zZ Ey -jH +yw bE yF hB @@ -1273,7 +1248,7 @@ yG Uq yF so -az +so KN Hg qn @@ -1285,16 +1260,16 @@ kz zZ zZ mN -wk +ir hs zZ kz Em no -Gf +ms pz Uq -Sy +dO zZ kz hR @@ -1372,7 +1347,7 @@ iv hR hR so -zh +so of oe hR @@ -1387,13 +1362,13 @@ hR hR BD qV -rE +iv iv hR hR -ZI +iv yA -ZI +iv hR VC tW @@ -1424,7 +1399,7 @@ MZ BD oe oe -Cq +GF hR hR hR @@ -1435,7 +1410,7 @@ hR hR hR hR -fV +ZO oe oe oe diff --git a/_maps/shuttles/ruin_syndicate_dropship.dmm b/_maps/shuttles/ruin_syndicate_dropship.dmm index 0ee74f7226641..898a3204d46cb 100644 --- a/_maps/shuttles/ruin_syndicate_dropship.dmm +++ b/_maps/shuttles/ruin_syndicate_dropship.dmm @@ -164,20 +164,6 @@ "nv" = ( /turf/open/floor/iron/dark, /area/shuttle/ruin/caravan/syndicate3) -"nA" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/syndicate_access, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/shuttle/ruin/caravan/syndicate3) -"ox" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, -/area/shuttle/ruin/caravan/syndicate3) "oW" = ( /obj/machinery/light/small/directional/west, /obj/machinery/button/door/directional/west{ @@ -189,6 +175,14 @@ }, /turf/open/floor/iron/dark, /area/shuttle/ruin/caravan/syndicate3) +"pY" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/south, +/turf/open/floor/pod/dark, +/area/shuttle/ruin/caravan/syndicate3) "rQ" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -208,6 +202,11 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron/dark, /area/shuttle/ruin/caravan/syndicate3) +"ts" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/turf/open/floor/iron/dark, +/area/shuttle/ruin/caravan/syndicate3) "uv" = ( /obj/structure/chair/comfy/shuttle{ dir = 4 @@ -220,6 +219,12 @@ "uI" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/shuttle/ruin/caravan/syndicate3) +"wl" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/shuttle/ruin/caravan/syndicate3) "wS" = ( /obj/machinery/door/airlock/hatch{ id_tag = "caravansyndicate3_bolt_starboard"; @@ -232,6 +237,15 @@ /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/plating, /area/shuttle/ruin/caravan/syndicate3) +"zB" = ( +/obj/structure/chair/comfy/shuttle, +/obj/machinery/light/small/directional/north, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/mapping_helpers/apc/syndicate_access, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/pod/dark, +/area/shuttle/ruin/caravan/syndicate3) "zP" = ( /obj/machinery/computer/crew{ dir = 8 @@ -251,11 +265,6 @@ }, /turf/open/floor/iron/dark, /area/shuttle/ruin/caravan/syndicate3) -"ES" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/syndicate_access, -/turf/open/floor/iron/dark, -/area/shuttle/ruin/caravan/syndicate3) "GU" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -312,15 +321,6 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron/dark, /area/shuttle/ruin/caravan/syndicate3) -"Jm" = ( -/obj/structure/chair/comfy/shuttle, -/obj/machinery/light/small/directional/west, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/syndicate_access, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/pod/dark, -/area/shuttle/ruin/caravan/syndicate3) "Jv" = ( /turf/template_noop, /area/template_noop) @@ -357,7 +357,7 @@ "KW" = ( /turf/closed/wall/mineral/plastitanium, /area/shuttle/ruin/caravan/syndicate3) -"Li" = ( +"LF" = ( /obj/structure/chair/comfy/shuttle, /obj/machinery/airalarm/directional/north, /obj/effect/mapping_helpers/airalarm/syndicate_access, @@ -516,16 +516,16 @@ uI "} (4,1,1) = {" uI -Jm +zB RT nv Mc -ox +pY uI "} (5,1,1) = {" uI -Li +LF Ib iN Mc @@ -562,7 +562,7 @@ UI (9,1,1) = {" bh oW -nA +wl iN Vp JT @@ -589,7 +589,7 @@ uI (12,1,1) = {" uI gv -ES +ts iN KN gz diff --git a/_maps/shuttles/starfury_fighter1.dmm b/_maps/shuttles/starfury_fighter1.dmm index af82b6b48b490..ae37e35c23b00 100644 --- a/_maps/shuttles/starfury_fighter1.dmm +++ b/_maps/shuttles/starfury_fighter1.dmm @@ -45,6 +45,13 @@ }, /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/shuttle/sbc_fighter1) +"y" = ( +/obj/machinery/camera/directional/west{ + network = list("SBC_Fighter1"); + c_tag = "Fighter 1 - Starboard" + }, +/turf/template_noop, +/area/shuttle/sbc_fighter1) "C" = ( /obj/structure/rack, /obj/item/storage/toolbox/mechanical, @@ -54,6 +61,13 @@ }, /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_fighter1) +"G" = ( +/obj/machinery/camera/directional/east{ + network = list("SBC_Fighter1"); + c_tag = "Fighter 1 - Port" + }, +/turf/template_noop, +/area/shuttle/sbc_fighter1) "H" = ( /obj/machinery/button/door{ id = "SBC_fighter1_bolt"; @@ -110,7 +124,7 @@ (1,1,1) = {" a -a +G v f f @@ -146,7 +160,7 @@ q "} (5,1,1) = {" a -a +y x f f diff --git a/_maps/shuttles/starfury_fighter2.dmm b/_maps/shuttles/starfury_fighter2.dmm index ca43280bb8bcf..de55ea6c127ca 100644 --- a/_maps/shuttles/starfury_fighter2.dmm +++ b/_maps/shuttles/starfury_fighter2.dmm @@ -9,6 +9,13 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_fighter2) +"h" = ( +/obj/machinery/camera/directional/west{ + network = list("SBC_Fighter2"); + c_tag = "Fighter 2 - Starboard" + }, +/turf/template_noop, +/area/shuttle/sbc_fighter2) "j" = ( /obj/machinery/button/door{ id = "SBC_fighter2_bolt"; @@ -88,6 +95,13 @@ }, /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/shuttle/sbc_fighter2) +"Q" = ( +/obj/machinery/camera/directional/east{ + network = list("SBC_Fighter2"); + c_tag = "Fighter 2 - Port" + }, +/turf/template_noop, +/area/shuttle/sbc_fighter2) "S" = ( /obj/structure/rack, /obj/item/clothing/mask/gas/syndicate, @@ -105,7 +119,7 @@ (1,1,1) = {" a -a +Q l V V @@ -141,7 +155,7 @@ q "} (5,1,1) = {" a -a +h k V V diff --git a/_maps/shuttles/starfury_fighter3.dmm b/_maps/shuttles/starfury_fighter3.dmm index 96f13ef364c0d..e078e7b0bfda5 100644 --- a/_maps/shuttles/starfury_fighter3.dmm +++ b/_maps/shuttles/starfury_fighter3.dmm @@ -41,7 +41,7 @@ "y" = ( /obj/machinery/computer/security{ dir = 8; - network = list("SBC_Fighter2") + network = list("SBC_Fighter3") }, /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_fighter3) @@ -87,6 +87,13 @@ /obj/machinery/computer/shuttle/starfury/fighter/fighter_three, /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_fighter3) +"N" = ( +/obj/machinery/camera/directional/west{ + network = list("SBC_Fighter3"); + c_tag = "Fighter 3 - Starboard" + }, +/turf/template_noop, +/area/shuttle/sbc_fighter3) "Q" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/end, /turf/open/floor/mineral/plastitanium/red, @@ -97,6 +104,13 @@ }, /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_fighter3) +"Y" = ( +/obj/machinery/camera/directional/east{ + network = list("SBC_Fighter3"); + c_tag = "Fighter 3 - Port" + }, +/turf/template_noop, +/area/shuttle/sbc_fighter3) "Z" = ( /obj/structure/rack, /obj/item/storage/toolbox/mechanical, @@ -107,7 +121,7 @@ (1,1,1) = {" a -a +Y F n n @@ -143,7 +157,7 @@ g "} (5,1,1) = {" a -a +N H n n diff --git a/_maps/shuttles/whiteship_birdshot.dmm b/_maps/shuttles/whiteship_birdshot.dmm index a617bcb618e5e..25dc64ed0fc01 100644 --- a/_maps/shuttles/whiteship_birdshot.dmm +++ b/_maps/shuttles/whiteship_birdshot.dmm @@ -1,38 +1,24 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"ar" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/cold/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/cargo) -"aW" = ( -/obj/structure/table/greyscale, -/obj/machinery/recharger{ - pixel_x = -13; - pixel_y = 11 - }, -/obj/machinery/cell_charger{ - pixel_x = 4; - pixel_y = 11 - }, -/obj/item/stock_parts/cell/high{ - pixel_x = 4; - pixel_y = 11 - }, -/obj/item/storage/toolbox/emergency{ - pixel_y = 2 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/turf/open/floor/iron/dark/small, -/area/shuttle/abandoned/bridge) -"bi" = ( +"ai" = ( /obj/structure/table/wood, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/grimy, /area/shuttle/abandoned/crew) +"aF" = ( +/obj/machinery/griddle, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/cafeteria, +/area/shuttle/abandoned/bar) +"aX" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/iron, +/area/shuttle/abandoned/pod) "bk" = ( /obj/machinery/atmospherics/pipe/smart/simple/general/visible{ dir = 6 @@ -40,13 +26,6 @@ /obj/machinery/meter, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/engine) -"bo" = ( -/obj/effect/turf_decal/box/white/corners, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/preopen, -/obj/effect/spawner/random/maintenance/three, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/cargo) "bp" = ( /turf/closed/wall/mineral/titanium/overspace, /area/shuttle/abandoned/engine) @@ -87,30 +66,28 @@ }, /turf/open/floor/iron/small, /area/shuttle/abandoned/crew) -"cm" = ( -/obj/machinery/light/small/broken/directional/east, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/shuttle/abandoned/crew) -"cq" = ( +"cB" = ( +/obj/structure/chair/stool/directional/west, /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/effect/spawner/random/maintenance/three, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/cargo) -"dk" = ( -/obj/structure/table/greyscale, +/turf/open/floor/iron/grimy, +/area/shuttle/abandoned/crew) +"cJ" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/turretid{ - icon_state = "control_kill"; - lethal = 1; - locked = 0; - pixel_y = 28; - req_access = null +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 }, -/turf/open/floor/iron/dark/small, -/area/shuttle/abandoned/bridge) +/turf/open/floor/carpet/green, +/area/shuttle/abandoned/bar) +"cT" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/south, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/carpet/green, +/area/shuttle/abandoned/bar) "dw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 @@ -118,11 +95,6 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/crew) -"dy" = ( -/obj/effect/turf_decal/box/white/corners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/cargo) "dH" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -140,45 +112,84 @@ }, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/crew) -"eK" = ( +"er" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/iron/textured, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/iron/smooth_large, /area/shuttle/abandoned/cargo) -"eU" = ( +"eC" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/cold/directional/north, /obj/structure/cable, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/cargo) -"fD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/iron/freezer, +/area/shuttle/abandoned/medbay) +"eH" = ( +/obj/structure/cable, +/obj/machinery/light/small/directional/south, +/turf/open/floor/catwalk_floor, +/area/shuttle/abandoned/crew) +"fa" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/obj/structure/chair{ + dir = 4 + }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 +/obj/machinery/airalarm/directional/south, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/iron, +/area/shuttle/abandoned/pod) +"fl" = ( +/obj/structure/table, +/obj/item/reagent_containers/blood/o_minus{ + pixel_x = 5; + pixel_y = 3 }, -/turf/open/floor/iron/cafeteria, -/area/shuttle/abandoned/bar) +/obj/item/reagent_containers/blood, +/obj/item/surgery_tray/full{ + pixel_x = 2; + pixel_y = 9 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/iron/freezer, +/area/shuttle/abandoned/medbay) +"fC" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/textured, +/area/shuttle/abandoned/cargo) "fT" = ( /turf/open/floor/plating/airless, /area/shuttle/abandoned/crew) +"fU" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/iron, +/area/shuttle/abandoned/bar) "fW" = ( /obj/machinery/porta_turret/centcom_shuttle/weak{ dir = 4 }, /turf/closed/wall/mineral/titanium/overspace, /area/shuttle/abandoned/crew) -"fX" = ( -/obj/structure/chair{ +"gj" = ( +/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship{ dir = 1 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/carpet/green, -/area/shuttle/abandoned/bar) +/turf/open/floor/iron/dark/small, +/area/shuttle/abandoned/bridge) "gs" = ( /obj/machinery/power/terminal{ dir = 4 @@ -195,43 +206,33 @@ /obj/machinery/light/small/built/directional/south, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/engine) -"gz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/siding/thinplating/dark, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 +"gv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/built/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/iron/textured, +/area/shuttle/abandoned/cargo) +"gV" = ( +/obj/effect/turf_decal/box/white/corners{ + dir = 4 }, -/obj/machinery/door/airlock/external/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/small, -/area/shuttle/abandoned/crew) +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/abandoned/cargo) +"gX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/south, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/iron/smooth_large, +/area/shuttle/abandoned/cargo) "hq" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/crew) -"hr" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/structure/table, -/obj/item/plate{ - pixel_x = 5; - pixel_y = -2 - }, -/obj/item/plate{ - pixel_x = 5 - }, -/obj/item/plate{ - pixel_x = 5; - pixel_y = 2 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/broken/directional/east, -/turf/open/floor/iron, -/area/shuttle/abandoned/bar) "hT" = ( /obj/effect/spawner/structure/window/reinforced/shuttle, /obj/machinery/door/firedoor, @@ -244,36 +245,21 @@ /obj/machinery/light/small/built/directional/south, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/engine) -"in" = ( -/obj/structure/closet/secure_closet/freezer/fridge/open, -/obj/item/reagent_containers/condiment/enzyme{ - layer = 5 - }, -/obj/item/food/meat/slab/synthmeat{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/food/meat/slab/synthmeat{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/food/meat/slab/synthmeat{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/reagent_containers/condiment/flour{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/reagent_containers/condiment/flour{ - pixel_x = -3; - pixel_y = 3 +"iB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/cold/directional/north, +/obj/structure/cable, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/smooth_large, +/area/shuttle/abandoned/cargo) +"iH" = ( +/obj/effect/turf_decal/box/white/corners{ + dir = 8 }, -/obj/item/reagent_containers/condiment/milk, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/shuttle/abandoned/bar) -"iy" = ( +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/abandoned/cargo) +"iS" = ( /obj/structure/bed{ dir = 4 }, @@ -284,37 +270,40 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/grimy, /area/shuttle/abandoned/crew) -"jp" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 +"jd" = ( +/obj/structure/sink/directional/east, +/obj/structure/mirror/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 }, +/turf/open/floor/iron/white/small, +/area/shuttle/abandoned/crew) +"jv" = ( +/obj/structure/chair/comfy/shuttle, /obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark/small, /area/shuttle/abandoned/bridge) -"jB" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating/dark, -/obj/machinery/door/airlock/titanium{ - name = "Infirmary" - }, +"jY" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron/small, -/area/shuttle/abandoned/medbay) -"jQ" = ( -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door/directional/north{ - id = "whiteship_port"; - name = "Port Doors Control" +/obj/machinery/suit_storage_unit/standard_unit, +/obj/machinery/light/small/built/directional/east, +/turf/open/floor/iron/smooth, +/area/shuttle/abandoned/crew) +"ku" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/table, +/obj/item/storage/fancy/donut_box{ + pixel_y = 14 }, -/turf/open/floor/iron/textured, -/area/shuttle/abandoned/cargo) +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/security/telescreen/entertainment/directional/north, +/turf/open/floor/iron, +/area/shuttle/abandoned/bar) "kw" = ( /obj/machinery/computer/monitor{ name = "Bridge Power Monitoring Console" @@ -322,30 +311,19 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/engine) -"kz" = ( -/obj/structure/chair/stool/bar/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/carpet/green, -/area/shuttle/abandoned/bar) -"kN" = ( +"kC" = ( +/obj/machinery/computer/operating, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/official/random/directional/north, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron/dark/small, -/area/shuttle/abandoned/bridge) +/turf/open/floor/iron/freezer, +/area/shuttle/abandoned/medbay) "kQ" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/abandoned/cargo) -"kS" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, +"ll" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/grimy, /area/shuttle/abandoned/crew) "lq" = ( /obj/machinery/power/shuttle_engine/propulsion/left{ @@ -356,90 +334,80 @@ "lt" = ( /turf/template_noop, /area/template_noop) -"lE" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 8 - }, +"lu" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/titanium{ - name = "Port Cargo Bay" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron/small, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/iron/smooth_large, /area/shuttle/abandoned/cargo) "ma" = ( /turf/closed/wall/mineral/titanium/overspace, /area/shuttle/abandoned/cargo) -"mJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/carpet/green, -/area/shuttle/abandoned/bar) -"ne" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 +"mU" = ( +/obj/structure/toilet{ + pixel_y = 8 }, -/obj/effect/turf_decal/siding/thinplating/dark, /obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/titanium/glass{ - name = "Port Cargo Control" +/obj/machinery/door/window/right/directional/east{ + name = "Shower" }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/white/small, +/area/shuttle/abandoned/crew) +"nc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/turf/open/floor/iron/small, -/area/shuttle/abandoned/cargo) -"nh" = ( /obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/crew) "nm" = ( /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/crew) -"ny" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 +"nz" = ( +/obj/structure/closet/secure_closet/freezer/fridge/open, +/obj/item/reagent_containers/condiment/enzyme{ + layer = 5 + }, +/obj/item/food/meat/slab/synthmeat{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/food/meat/slab/synthmeat{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/food/meat/slab/synthmeat{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/reagent_containers/condiment/flour{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/reagent_containers/condiment/flour{ + pixel_x = -3; + pixel_y = 3 }, +/obj/item/reagent_containers/condiment/milk, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/cafeteria, /area/shuttle/abandoned/bar) -"nI" = ( -/obj/machinery/shower/directional/south, -/obj/item/soap, -/obj/structure/curtain, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/small, -/area/shuttle/abandoned/crew) -"nQ" = ( -/obj/structure/toilet{ - pixel_y = 8 +"nL" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 }, +/turf/open/floor/catwalk_floor, +/area/shuttle/abandoned/crew) +"nO" = ( +/obj/structure/table/reinforced, /obj/effect/decal/cleanable/dirt, -/obj/machinery/door/window/right/directional/east{ - name = "Shower" +/obj/machinery/button/door/directional/north{ + id = "whiteship_port"; + name = "Port Doors Control" }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/white/small, -/area/shuttle/abandoned/crew) +/turf/open/floor/iron/textured, +/area/shuttle/abandoned/cargo) "oe" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/power/shuttle_engine/heater{ @@ -447,41 +415,74 @@ }, /turf/open/floor/plating/airless, /area/shuttle/abandoned/engine) -"ol" = ( +"pg" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/table, +/obj/item/reagent_containers/cup/glass/drinkingglass{ + pixel_x = 9; + pixel_y = 15 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass{ + pixel_x = 5; + pixel_y = 8 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/effect/spawner/random/maintenance/three, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/cargo) -"pr" = ( -/obj/machinery/computer/operating, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/iron, +/area/shuttle/abandoned/bar) +"pt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/machinery/door/airlock/external/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, -/area/shuttle/abandoned/medbay) +/turf/open/floor/iron/small, +/area/shuttle/abandoned/crew) "pv" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/abandoned/pod) "pC" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/abandoned/medbay) -"pO" = ( -/obj/structure/dresser, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/grimy, -/area/shuttle/abandoned/crew) -"pP" = ( +"pZ" = ( +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/chair{ + pixel_y = 10 + }, +/obj/machinery/door/window/brigdoor/security/cell/right/directional/south{ + name = "Brig Cell" + }, /obj/effect/decal/cleanable/dirt, -/obj/structure/tank_dispenser, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/smooth, -/area/shuttle/abandoned/crew) -"qa" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/shuttle/abandoned/pod) +"qg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 +/obj/structure/closet/crate, +/obj/effect/spawner/random/maintenance/three, +/turf/open/floor/iron/smooth_large, +/area/shuttle/abandoned/cargo) +"qk" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_y = 3 }, -/turf/open/floor/iron, +/obj/item/storage/box/donkpockets, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria, /area/shuttle/abandoned/bar) "qn" = ( /obj/structure/rack, @@ -495,64 +496,88 @@ }, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/engine) -"qq" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners, +"qp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/carpet/green, +/area/shuttle/abandoned/bar) +"qO" = ( /obj/structure/table, -/obj/machinery/reagentgrinder{ - pixel_x = 5; - pixel_y = -8 +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/recharger{ + pixel_x = 6; + pixel_y = 11 + }, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = -6; + pixel_y = 3 }, /obj/effect/decal/cleanable/dirt, +/obj/item/reagent_containers/spray/pepper{ + pixel_x = 9; + pixel_y = 4 + }, /turf/open/floor/iron, -/area/shuttle/abandoned/bar) -"qz" = ( -/obj/machinery/computer/shuttle/white_ship/pod/recall{ +/area/shuttle/abandoned/pod) +"rl" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ dir = 1 }, +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/machinery/door/airlock/titanium{ + name = "Infirmary" + }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/small, -/area/shuttle/abandoned/bridge) +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/iron/small, +/area/shuttle/abandoned/medbay) "ry" = ( /turf/closed/wall/mineral/titanium/overspace, /area/shuttle/abandoned/bar) -"rF" = ( +"rO" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/iron/smooth, -/area/shuttle/abandoned/crew) -"sl" = ( -/obj/structure/table, -/obj/item/reagent_containers/blood/o_minus{ - pixel_x = 5; - pixel_y = 3 - }, -/obj/item/reagent_containers/blood, -/obj/item/storage/backpack/duffelbag/med/surgery{ - pixel_x = 2; - pixel_y = 9 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, /turf/open/floor/iron/freezer, /area/shuttle/abandoned/medbay) -"sr" = ( -/obj/structure/bed{ +"rZ" = ( +/obj/structure/chair/stool/bar/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/item/bedsheet/brown{ - dir = 4 +/turf/open/floor/carpet/green, +/area/shuttle/abandoned/bar) +"si" = ( +/obj/effect/turf_decal/box/white/corners, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/abandoned/cargo) +"tg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/machinery/door/airlock/external/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/broken/directional/west, -/turf/open/floor/iron/grimy, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/iron/small, /area/shuttle/abandoned/crew) -"sC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/cargo) -"te" = ( +"tz" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 8 }, @@ -560,21 +585,14 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/command{ - name = "Cockpit" +/obj/machinery/door/airlock/grunge{ + name = "Cabin" }, -/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, /turf/open/floor/iron/small, -/area/shuttle/abandoned/bridge) -"tW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/official/random/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/cargo) +/area/shuttle/abandoned/crew) "uj" = ( /obj/structure/closet/emcloset/anchored, /obj/structure/sign/poster/official/random/directional/north, @@ -583,128 +601,189 @@ "uk" = ( /turf/closed/wall/mineral/titanium/overspace, /area/shuttle/abandoned/pod) -"uo" = ( +"ur" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 }, /turf/open/floor/iron/smooth_large, /area/shuttle/abandoned/cargo) -"uT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/suit_storage_unit/standard_unit, -/obj/machinery/light/small/built/directional/east, -/turf/open/floor/iron/smooth, -/area/shuttle/abandoned/crew) -"vc" = ( -/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship{ - dir = 1 +"uu" = ( +/obj/structure/table, +/obj/structure/sink/kitchen/directional/west, +/obj/item/reagent_containers/condiment/sugar{ + pixel_x = 4; + pixel_y = 14 + }, +/obj/item/kitchen/rollingpin{ + pixel_x = -1 + }, +/obj/item/knife/kitchen{ + pixel_x = -8 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/small, -/area/shuttle/abandoned/bridge) -"vo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/carpet/green, +/turf/open/floor/iron/cafeteria, /area/shuttle/abandoned/bar) -"vD" = ( -/obj/structure/chair/stool/directional/west, +"uF" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/grimy, -/area/shuttle/abandoned/crew) -"wh" = ( +/obj/structure/cable, +/turf/open/floor/iron/smooth_large, +/area/shuttle/abandoned/cargo) +"ve" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, +/obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, -/turf/open/floor/iron/textured, -/area/shuttle/abandoned/cargo) -"wp" = ( -/obj/structure/closet/secure_closet/personal, +/turf/open/floor/iron/dark/small, +/area/shuttle/abandoned/bridge) +"vp" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/table, +/obj/machinery/reagentgrinder{ + pixel_x = 5; + pixel_y = -8 + }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/grimy, -/area/shuttle/abandoned/crew) -"xn" = ( +/turf/open/floor/iron, +/area/shuttle/abandoned/bar) +"vZ" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, +/obj/structure/sign/poster/official/random/directional/north, +/obj/structure/cable, /turf/open/floor/iron/smooth_large, /area/shuttle/abandoned/cargo) -"xv" = ( +"wd" = ( /obj/structure/table/reinforced, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/official/random/directional/north, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, /turf/open/floor/iron/textured, /area/shuttle/abandoned/cargo) -"xH" = ( +"wo" = ( +/obj/structure/cable, +/obj/machinery/light/small/broken/directional/east, +/turf/open/floor/catwalk_floor, +/area/shuttle/abandoned/crew) +"wq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/iron/textured, +/area/shuttle/abandoned/cargo) +"wE" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/effect/spawner/random/maintenance/three, /turf/open/floor/iron/smooth_large, /area/shuttle/abandoned/cargo) -"xI" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 8 - }, +"wP" = ( +/obj/structure/chair/stool/directional/south, /obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 +/obj/machinery/light/small/broken/directional/west, +/turf/open/floor/iron/freezer, +/area/shuttle/abandoned/medbay) +"wY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 }, -/turf/open/floor/iron, +/turf/open/floor/iron/cafeteria, /area/shuttle/abandoned/bar) -"yN" = ( +"xr" = ( +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/closet/secure_closet/personal{ + name = "Security Closet" + }, +/obj/item/gun/energy/laser/retro, +/obj/item/restraints/handcuffs/cable, +/obj/item/restraints/handcuffs/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/north, +/obj/structure/reagent_dispensers/wall/peppertank/directional/north, +/obj/item/inspector, +/obj/item/flashlight/seclite, +/turf/open/floor/iron, +/area/shuttle/abandoned/pod) +"xG" = ( /obj/structure/closet/secure_closet/personal, /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/grimy, /area/shuttle/abandoned/crew) -"yP" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners, +"xT" = ( +/obj/structure/table/optable, +/obj/machinery/defibrillator_mount/directional/north, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/shuttle/abandoned/bar) -"yT" = ( -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 +/turf/open/floor/iron/freezer, +/area/shuttle/abandoned/medbay) +"xZ" = ( +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/chair{ + pixel_y = 10 + }, +/obj/machinery/door/window/brigdoor/security/cell/left/directional/south{ + name = "Brig Cell" }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, /turf/open/floor/iron, /area/shuttle/abandoned/pod) -"yV" = ( -/obj/effect/turf_decal/box/white/corners{ - dir = 8 +"yp" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/item/bedsheet/brown{ + dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured_large, +/obj/machinery/light/small/broken/directional/west, +/turf/open/floor/iron/grimy, +/area/shuttle/abandoned/crew) +"yM" = ( +/obj/machinery/light/cold/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/broken/directional/south, +/obj/machinery/firealarm/directional/east, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/iron/smooth_large, /area/shuttle/abandoned/cargo) -"zh" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ +"yZ" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/smooth_large, +/area/shuttle/abandoned/cargo) +"zo" = ( +/obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /obj/effect/turf_decal/siding/thinplating/dark{ dir = 4 }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/grunge{ - name = "Cabin" +/obj/machinery/door/airlock/titanium{ + name = "Port Cargo Bay" }, +/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, /turf/open/floor/iron/small, -/area/shuttle/abandoned/crew) +/area/shuttle/abandoned/cargo) "Av" = ( /obj/machinery/atmospherics/components/trinary/filter{ dir = 1 @@ -717,27 +796,55 @@ "AV" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/abandoned/crew) -"Bb" = ( -/obj/structure/table, -/obj/machinery/microwave{ - pixel_y = 3 +"AX" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 }, -/obj/item/storage/box/donkpockets, +/obj/effect/turf_decal/siding/thinplating/dark, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/shuttle/abandoned/bar) -"Bx" = ( -/obj/machinery/griddle, +/obj/machinery/door/airlock/titanium/glass{ + name = "Starboard Cargo Control" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/iron/small, +/area/shuttle/abandoned/cargo) +"Bs" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/broken/directional/south, +/obj/machinery/button/door/directional/south{ + id = "whiteship_windows"; + name = "Windows Blast Door Control"; + pixel_x = -8 + }, +/obj/machinery/button/door/directional/south{ + id = "whiteship_bridge"; + name = "Bridge Blast Door Control"; + pixel_x = 6 + }, +/obj/structure/table/greyscale, +/turf/open/floor/iron/dark/small, +/area/shuttle/abandoned/bridge) +"Bt" = ( /obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron/cafeteria, -/area/shuttle/abandoned/bar) +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/catwalk_floor, +/area/shuttle/abandoned/crew) "BH" = ( /obj/machinery/power/shuttle_engine/propulsion/left{ dir = 8 }, /turf/open/floor/plating/airless, /area/shuttle/abandoned/engine) +"BR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/smooth_large, +/area/shuttle/abandoned/cargo) "BZ" = ( /obj/effect/spawner/structure/window/reinforced/shuttle, /obj/machinery/door/poddoor{ @@ -745,13 +852,6 @@ }, /turf/open/floor/plating, /area/shuttle/abandoned/pod) -"Cf" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/cargo) "Cw" = ( /obj/effect/spawner/structure/window/reinforced/shuttle, /obj/machinery/door/firedoor, @@ -771,20 +871,25 @@ /obj/machinery/light/small/broken/directional/north, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/engine) -"Db" = ( -/obj/structure/table, -/obj/item/reagent_containers/condiment/saltshaker{ - pixel_x = -8; - pixel_y = 10 +"Dr" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 }, -/obj/item/reagent_containers/condiment/peppermill{ - pixel_x = -8; - pixel_y = 4 +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm/directional/south, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 }, +/turf/open/floor/iron, +/area/shuttle/abandoned/pod) +"Dt" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/built/directional/west, -/turf/open/floor/carpet/green, -/area/shuttle/abandoned/bar) +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/structure/cable, +/turf/open/floor/iron/smooth_large, +/area/shuttle/abandoned/cargo) "Dw" = ( /obj/machinery/atmospherics/components/binary/pump/on{ dir = 4; @@ -792,20 +897,13 @@ }, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/engine) -"DF" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating/dark, -/obj/machinery/door/airlock/titanium{ - name = "Kitchen" - }, +"DK" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron/small, -/area/shuttle/abandoned/bar) +/obj/structure/closet/crate, +/obj/effect/spawner/random/maintenance/three, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/smooth_large, +/area/shuttle/abandoned/cargo) "DN" = ( /obj/machinery/door/airlock/atmos{ name = "Atmospherics" @@ -823,20 +921,18 @@ "DT" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/abandoned/bar) -"Eo" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, +"EN" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/textured, +/obj/structure/closet/crate, +/obj/effect/spawner/random/maintenance/three, +/turf/open/floor/iron/smooth_large, /area/shuttle/abandoned/cargo) -"EC" = ( +"EX" = ( +/obj/effect/turf_decal/box/white/corners, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/iron/smooth_large, +/obj/structure/closet/crate/preopen, +/obj/effect/spawner/random/maintenance/three, +/turf/open/floor/iron/dark/textured_large, /area/shuttle/abandoned/cargo) "Fa" = ( /obj/machinery/atmospherics/components/tank/air{ @@ -844,118 +940,49 @@ }, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/engine) -"Fm" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/textured, -/area/shuttle/abandoned/cargo) -"Fn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/broken/directional/south, -/obj/machinery/firealarm/directional/east, +"Fr" = ( /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/cargo) -"Ft" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/recharger{ - pixel_x = 6; - pixel_y = 11 - }, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = -6; - pixel_y = 3 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/reagent_containers/spray/pepper{ - pixel_x = 9; - pixel_y = 4 - }, -/turf/open/floor/iron, -/area/shuttle/abandoned/pod) -"Fu" = ( +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/catwalk_floor, +/area/shuttle/abandoned/crew) +"FK" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/carpet/green, -/area/shuttle/abandoned/bar) -"FH" = ( -/obj/effect/turf_decal/tile/red/anticorner/contrasted, -/obj/structure/chair{ - dir = 4 +/obj/machinery/computer/shuttle/white_ship/bridge{ + dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/iron, -/area/shuttle/abandoned/pod) +/turf/open/floor/iron/dark/small, +/area/shuttle/abandoned/bridge) "FL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/crew) -"FP" = ( -/obj/effect/turf_decal/box/white/corners{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/cargo) -"FQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron/freezer, -/area/shuttle/abandoned/medbay) -"FX" = ( +"FT" = ( +/obj/effect/turf_decal/tile/red/half/contrasted, /obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/broken/directional/south, /obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/iron/grimy, -/area/shuttle/abandoned/crew) -"FZ" = ( -/obj/structure/chair/stool/bar/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 + dir = 8 }, -/turf/open/floor/carpet/green, -/area/shuttle/abandoned/bar) -"Gb" = ( +/turf/open/floor/iron, +/area/shuttle/abandoned/pod) +"Ga" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/structure/table, -/obj/machinery/coffeemaker{ - pixel_y = 12 - }, -/obj/item/reagent_containers/cup/glass/mug{ - pixel_x = 10; - pixel_y = 1 +/obj/item/plate{ + pixel_x = 5; + pixel_y = -2 }, -/obj/item/reagent_containers/cup/glass/mug{ - pixel_x = 2; - pixel_y = -1 +/obj/item/plate{ + pixel_x = 5 }, -/obj/item/reagent_containers/cup/glass/mug{ - pixel_x = 7; - pixel_y = -5 +/obj/item/plate{ + pixel_x = 5; + pixel_y = 2 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/obj/structure/sign/poster/official/random/directional/north, +/obj/machinery/light/small/broken/directional/east, /turf/open/floor/iron, /area/shuttle/abandoned/bar) "Ge" = ( @@ -965,74 +992,93 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/engine) +"Gg" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/machinery/door/airlock/titanium{ + name = "Kitchen" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/iron/small, +/area/shuttle/abandoned/bar) "Gi" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/abandoned/engine) -"Gk" = ( -/obj/structure/chair/comfy/shuttle, +"Gz" = ( +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/shuttle/abandoned/engine) +"GP" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, /obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/dark/small, -/area/shuttle/abandoned/bridge) -"Gy" = ( -/obj/machinery/computer/shuttle/white_ship/bridge{ - dir = 8 - }, +/turf/open/floor/iron, +/area/shuttle/abandoned/bar) +"GS" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/broken/directional/south, -/obj/machinery/button/door/directional/south{ - id = "whiteship_windows"; - name = "Windows Blast Door Control"; - pixel_x = -8 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/iron/cafeteria, +/area/shuttle/abandoned/bar) +"Hk" = ( +/obj/structure/table/greyscale, +/obj/machinery/recharger{ + pixel_x = -13; + pixel_y = 11 + }, +/obj/machinery/cell_charger{ + pixel_x = 4; + pixel_y = 11 }, -/obj/machinery/button/door/directional/south{ - id = "whiteship_bridge"; - name = "Bridge Blast Door Control"; - pixel_x = 6 +/obj/item/stock_parts/cell/high{ + pixel_x = 4; + pixel_y = 11 }, +/obj/item/storage/toolbox/emergency{ + pixel_y = 2 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/security/telescreen/entertainment/directional/north, /turf/open/floor/iron/dark/small, /area/shuttle/abandoned/bridge) -"Gz" = ( -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/shuttle/abandoned/engine) -"GE" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/structure/table, -/obj/item/storage/fancy/donut_box{ - pixel_y = 14 +"Ht" = ( +/obj/structure/rack, +/obj/item/tank/internals/anesthetic{ + pixel_x = -3 }, -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 8 +/obj/item/stack/sticky_tape/surgical, +/obj/item/clothing/mask/breath/medical{ + pixel_y = 3 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/turf/open/floor/iron, -/area/shuttle/abandoned/bar) -"GV" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/cargo) -"HD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/freezer, +/area/shuttle/abandoned/medbay) +"Is" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/iron/dark/small, -/area/shuttle/abandoned/bridge) -"HH" = ( -/obj/effect/turf_decal/box/white/corners{ - dir = 4 +/obj/machinery/door/poddoor{ + id = "whiteship_port" }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/cargo) -"In" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/iron/smooth_large, +/obj/docking_port/mobile{ + callTime = 200; + can_move_docking_ports = 1; + dir = 2; + launch_status = 0; + movement_force = list("KNOCKDOWN"=0,"THROW"=0); + name = "Patrol Bee"; + port_direction = 8; + preferred_direction = 4; + shuttle_id = "whiteship" + }, +/turf/open/floor/plating, /area/shuttle/abandoned/cargo) "Je" = ( /obj/effect/turf_decal/siding/thinplating/dark{ @@ -1050,28 +1096,58 @@ }, /turf/open/floor/iron/small, /area/shuttle/abandoned/pod) +"Jk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/iron/smooth_large, +/area/shuttle/abandoned/cargo) +"Jn" = ( +/obj/structure/dresser, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/grimy, +/area/shuttle/abandoned/crew) "Jt" = ( /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/engine) -"JL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/iron/freezer, -/area/shuttle/abandoned/medbay) "JP" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/abandoned/bridge) -"JU" = ( -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/structure/chair{ - pixel_y = 10 +"JR" = ( +/obj/structure/table/reinforced, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/textured, +/area/shuttle/abandoned/cargo) +"Kf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/random/directional/north, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 }, -/obj/machinery/door/window/brigdoor/security/cell/right/directional/south{ - name = "Brig Cell" +/turf/open/floor/iron/dark/small, +/area/shuttle/abandoned/bridge) +"KR" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/shuttle/abandoned/pod) +/obj/machinery/door/airlock/command{ + name = "Cockpit" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/iron/small, +/area/shuttle/abandoned/bridge) "KV" = ( /obj/structure/cable, /obj/machinery/door/airlock/engineering{ @@ -1079,6 +1155,19 @@ }, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/engine) +"KW" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/iron, +/area/shuttle/abandoned/bar) "Lj" = ( /obj/machinery/porta_turret/centcom_shuttle/weak{ dir = 4 @@ -1099,22 +1188,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/engine) -"MJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/cargo) -"MO" = ( -/obj/machinery/light/small/broken/directional/east, -/obj/structure/sign/poster/official/random/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/catwalk_floor, -/area/shuttle/abandoned/crew) "Na" = ( /obj/machinery/airalarm/directional/north, /obj/effect/mapping_helpers/airalarm/all_access, @@ -1141,73 +1214,49 @@ "NK" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/abandoned/crew) -"NP" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/catwalk_floor, -/area/shuttle/abandoned/crew) -"Oe" = ( -/obj/effect/turf_decal/box/white/corners{ +"Om" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/abandoned/engine) +"OE" = ( +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/item/stack/sheet/glass{ - amount = 10 - }, -/obj/item/stack/sheet/iron/twenty, -/obj/item/stack/rods/twentyfive, -/obj/item/weldingtool, -/turf/open/floor/iron/dark/textured_large, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/textured, /area/shuttle/abandoned/cargo) -"Om" = ( -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/abandoned/engine) -"Ot" = ( -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/structure/closet/secure_closet/personal{ - name = "Security Closet" +"OG" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/table, +/obj/machinery/coffeemaker{ + pixel_y = 12 + }, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = 10; + pixel_y = 1 + }, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = 2; + pixel_y = -1 + }, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = 7; + pixel_y = -5 }, -/obj/item/gun/energy/laser/retro, -/obj/item/restraints/handcuffs/cable, -/obj/item/restraints/handcuffs/cable, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/obj/structure/reagent_dispensers/wall/peppertank/directional/north, -/obj/item/inspector, -/obj/item/flashlight/seclite, +/obj/machinery/light/small/directional/east, +/obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron, -/area/shuttle/abandoned/pod) -"OC" = ( -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/auto_name/directional/south, +/area/shuttle/abandoned/bar) +"OH" = ( /obj/structure/cable, -/turf/open/floor/iron/textured, -/area/shuttle/abandoned/cargo) -"Pm" = ( /obj/machinery/light/small/directional/north, -/obj/structure/cable, -/obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/crew) -"Pu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/cargo) -"Pz" = ( -/obj/structure/sink/directional/east, -/obj/structure/mirror/directional/west, +"ON" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/iron/white/small, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/iron/smooth, /area/shuttle/abandoned/crew) "PC" = ( /obj/effect/spawner/structure/window/reinforced/shuttle, @@ -1219,54 +1268,62 @@ "PN" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/abandoned/pod) -"Qb" = ( +"PP" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, -/turf/open/floor/iron/dark/small, -/area/shuttle/abandoned/bridge) +/turf/open/floor/iron/grimy, +/area/shuttle/abandoned/crew) "Qf" = ( /obj/machinery/porta_turret/centcom_shuttle/weak{ dir = 4 }, /turf/closed/wall/mineral/titanium/overspace, /area/shuttle/abandoned/bridge) -"Qr" = ( -/obj/structure/chair, +"Ql" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/carpet/green, -/area/shuttle/abandoned/bar) -"QT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/mob/living/simple_animal/hostile/ooze/gelatinous{ + desc = "Father of Cubie"; + melee_damage_upper = 30; + name = "Squarsire" }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/siding/thinplating/dark, +/turf/open/floor/iron, +/area/shuttle/abandoned/pod) +"Qo" = ( +/obj/structure/closet/secure_closet/personal, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/grimy, +/area/shuttle/abandoned/crew) +"Qq" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 1 }, -/obj/machinery/door/airlock/external/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/titanium/glass{ + name = "Port Cargo Control" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 }, +/turf/open/floor/iron/small, +/area/shuttle/abandoned/cargo) +"Qs" = ( /obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/carpet/green, +/area/shuttle/abandoned/bar) +"QR" = ( +/obj/structure/chair/stool/bar/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/turf/open/floor/iron/small, -/area/shuttle/abandoned/crew) -"QU" = ( -/obj/structure/chair/stool/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/broken/directional/west, -/turf/open/floor/iron/freezer, -/area/shuttle/abandoned/medbay) +/turf/open/floor/carpet/green, +/area/shuttle/abandoned/bar) "QY" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -1295,59 +1352,60 @@ }, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/engine) -"RI" = ( -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/structure/chair{ - pixel_y = 10 - }, -/obj/machinery/door/window/brigdoor/security/cell/left/directional/south{ - name = "Brig Cell" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/shuttle/abandoned/pod) -"RN" = ( -/obj/structure/table/optable, -/obj/machinery/defibrillator_mount/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, -/area/shuttle/abandoned/medbay) -"RY" = ( -/obj/effect/turf_decal/stripes/line, +"RX" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_large, /area/shuttle/abandoned/cargo) +"SZ" = ( +/obj/effect/turf_decal/box/white/corners{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/item/stack/sheet/glass{ + amount = 10 + }, +/obj/item/stack/sheet/iron/twenty, +/obj/item/stack/rods/twentyfive, +/obj/item/weldingtool, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/abandoned/cargo) "Tg" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/abandoned/cargo) -"Uy" = ( +"Tq" = ( +/obj/structure/table/reinforced, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/official/random/directional/north, -/mob/living/simple_animal/hostile/ooze/gelatinous{ - desc = "Father of Cubie"; - melee_damage_upper = 30; - name = "Squarsire" +/obj/machinery/button/door/directional/south{ + id = "whiteship_starboard"; + name = "Starboard Doors Control" }, -/turf/open/floor/iron, -/area/shuttle/abandoned/pod) -"UB" = ( +/turf/open/floor/iron/textured, +/area/shuttle/abandoned/cargo) +"Ui" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, /turf/open/floor/iron/smooth_large, /area/shuttle/abandoned/cargo) -"UG" = ( -/obj/effect/turf_decal/tile/red/half/contrasted, +"Uu" = ( +/obj/structure/chair/comfy/shuttle, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/broken/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 +/turf/open/floor/iron/dark/small, +/area/shuttle/abandoned/bridge) +"UK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/turretid{ + icon_state = "control_kill"; + lethal = 1; + locked = 0; + pixel_y = 28; + req_access = null }, -/turf/open/floor/iron, -/area/shuttle/abandoned/pod) +/turf/open/floor/iron/dark/small, +/area/shuttle/abandoned/bridge) "Vp" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/power/shuttle_engine/heater{ @@ -1355,94 +1413,67 @@ }, /turf/open/floor/plating/airless, /area/shuttle/abandoned/crew) -"VB" = ( -/obj/structure/table, -/obj/structure/sink/kitchen/directional/west, -/obj/item/reagent_containers/condiment/sugar{ - pixel_x = 4; - pixel_y = 14 - }, -/obj/item/kitchen/rollingpin{ - pixel_x = -1 - }, -/obj/item/knife/kitchen{ - pixel_x = -8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/shuttle/abandoned/bar) -"VO" = ( -/obj/structure/table/wood, +"VL" = ( +/obj/machinery/shower/directional/south, +/obj/item/soap, +/obj/structure/curtain, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron/grimy, +/turf/open/floor/iron/white/small, /area/shuttle/abandoned/crew) -"VP" = ( -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/south, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron, -/area/shuttle/abandoned/pod) -"VS" = ( -/obj/structure/table, -/obj/item/defibrillator/loaded, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/turf/open/floor/iron/freezer, -/area/shuttle/abandoned/medbay) "VU" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/engine) -"We" = ( -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, +"Wn" = ( +/obj/structure/bed/pod, +/obj/machinery/iv_drip, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/shuttle/abandoned/pod) -"Wi" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/shuttle/abandoned/crew) +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/freezer, +/area/shuttle/abandoned/medbay) "Wu" = ( /obj/machinery/space_heater, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/engine) +"Wv" = ( +/obj/structure/table, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -8; + pixel_y = 10 + }, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = -8; + pixel_y = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/built/directional/west, +/turf/open/floor/carpet/green, +/area/shuttle/abandoned/bar) "WG" = ( /turf/closed/wall/mineral/titanium/overspace, /area/shuttle/abandoned/bridge) -"WL" = ( -/obj/structure/rack, -/obj/item/tank/internals/anesthetic{ - pixel_x = -3 - }, -/obj/item/stack/sticky_tape/surgical, -/obj/item/clothing/mask/breath/medical{ - pixel_y = 3 +"WW" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/shuttle/abandoned/pod) +"Xk" = ( +/obj/structure/table, +/obj/item/defibrillator/loaded, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, /turf/open/floor/iron/freezer, /area/shuttle/abandoned/medbay) -"WU" = ( -/obj/structure/table/reinforced, +"Xu" = ( +/obj/structure/chair, /obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door/directional/south{ - id = "whiteship_starboard"; - name = "Starboard Doors Control" - }, -/turf/open/floor/iron/textured, -/area/shuttle/abandoned/cargo) +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/carpet/green, +/area/shuttle/abandoned/bar) "XB" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/abandoned/bridge) @@ -1460,34 +1491,12 @@ }, /turf/open/floor/plating, /area/shuttle/abandoned/crew) -"Yg" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating/dark, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/titanium/glass{ - name = "Starboard Cargo Control" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron/small, -/area/shuttle/abandoned/cargo) -"Yn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/structure/cable, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/cargo) -"Yo" = ( +"Yd" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/built/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/cargo) +/obj/structure/tank_dispenser, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/smooth, +/area/shuttle/abandoned/crew) "YJ" = ( /obj/effect/spawner/structure/window/reinforced/shuttle, /obj/machinery/door/poddoor{ @@ -1495,26 +1504,12 @@ }, /turf/open/floor/plating, /area/shuttle/abandoned/bridge) -"YZ" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ +"YV" = ( +/obj/effect/turf_decal/box/white/corners{ dir = 1 }, -/obj/machinery/door/poddoor{ - id = "whiteship_port" - }, -/obj/docking_port/mobile{ - callTime = 200; - can_move_docking_ports = 1; - dir = 2; - launch_status = 0; - movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); - name = "Patrol Bee"; - port_direction = 8; - preferred_direction = 4; - shuttle_id = "whiteship" - }, -/turf/open/floor/plating, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured_large, /area/shuttle/abandoned/cargo) "Zn" = ( /obj/structure/chair/stool/directional/north, @@ -1522,26 +1517,6 @@ /obj/effect/mapping_helpers/airalarm/all_access, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/engine) -"Zp" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/structure/table, -/obj/item/reagent_containers/cup/glass/drinkingglass{ - pixel_x = 9; - pixel_y = 15 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass{ - pixel_x = 5; - pixel_y = 8 - }, -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron, -/area/shuttle/abandoned/bar) "Zy" = ( /obj/machinery/airalarm/directional/south, /obj/effect/mapping_helpers/airalarm/all_access, @@ -1550,13 +1525,17 @@ }, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/crew) -"ZT" = ( -/obj/structure/bed/pod, -/obj/machinery/iv_drip, +"ZN" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/freezer, -/area/shuttle/abandoned/medbay) +/obj/machinery/light/small/directional/north, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/iron/dark/small, +/area/shuttle/abandoned/bridge) (1,1,1) = {" lt @@ -1699,10 +1678,10 @@ lt (7,1,1) = {" ma kQ -cq -Pu -Pu -ar +DK +er +er +er kQ Vp AV @@ -1712,20 +1691,20 @@ fT AV Vp kQ -Yo -sC -sC -xn +uF +uF +uF +BR kQ ma "} (8,1,1) = {" kQ Tg -GV -FP -yV -uo +RX +YV +iH +gX kQ NK NK @@ -1735,57 +1714,57 @@ XX NK NK kQ -Yn -FP -Oe -GV +Dt +YV +SZ +RX Tg kQ "} (9,1,1) = {" bw -Cf -GV -HH -bo -UB +wE +RX +gV +EX +Jk kQ -pO -iy -bi +Jn +iS +ai NK -VO -sr -pO +ll +yp +Jn kQ -tW -HH -dy -GV -RY +vZ +gV +si +RX +yZ dH "} (10,1,1) = {" -YZ -xH -GV -In -MJ -Fn +Is +qg +RX +lu +Ui +yM kQ -yN -FX -vD +xG +PP +cB NK -vD -FX -wp +cB +PP +Qo kQ -eU -MJ -EC -ol -RY +iB +Ui +ur +EN +yZ dH "} (11,1,1) = {" @@ -1793,15 +1772,15 @@ kQ hT hT kQ -lE +zo kQ kQ NK -zh +tz NK NK NK -zh +tz NK kQ kQ @@ -1813,48 +1792,48 @@ kQ "} (12,1,1) = {" Tg -jQ -Eo +nO +fC kQ eb FL dw -FL +nc FL Cz FL -nh +FL FL FL dw FL eb kQ -Fm -WU +OE +Tq Tg "} (13,1,1) = {" Tg -xv -eK -ne +JR +gv +Qq eb nm -Wi +nm nm hq nm Ll nm +wo nm nm -cm nm eb -Yg -wh -OC +AX +wq +wd Tg "} (14,1,1) = {" @@ -1863,7 +1842,7 @@ NK NK NK Na -kS +nm DT DR DT @@ -1873,7 +1852,7 @@ Cw pC Cw pC -Pm +Fr Zy NK NK @@ -1883,69 +1862,69 @@ fW (15,1,1) = {" lt NK -pP +Yd NK FL -nm +eH DT -Qr -Db -fX +Xu +Wv +cT pC -pr -QU -VS +kC +wP +Xk pC -nm +OH FL bH -Pz +jd NK lt "} (16,1,1) = {" lt -gz -rF -QT +pt +ON +tg FL eb bq -Fu -mJ -vo +cJ +qp +Qs pC -RN -JL -FQ -jB +xT +rO +eC +rl eb FL NK -nQ +mU NK lt "} (17,1,1) = {" lt NK -uT +jY NK -MO +Bt eb DT -FZ -kz -vo +QR +rZ +Qs pC -sl -WL -ZT +fl +Ht +Wn pC eb -NP +nL NK -nI +VL NK lt "} @@ -1957,15 +1936,15 @@ pv pv Je DT -GE -Zp -xI +ku +pg +KW pC pC pC pC JP -te +KR JP JP JP @@ -1976,21 +1955,21 @@ lt lt lt PN -JU -yT -VP +pZ +aX +Dr DT -yP -yP -qa -DF -ny -fD -in +GP +GP +fU +Gg +GS +wY +nz JP -kN -Gk -qz +Kf +jv +FK XB lt lt @@ -2000,19 +1979,19 @@ lt lt PN pv -Uy -UG +Ql +FT DT -Gb -qq -hr +OG +vp +Ga DT -Bx -VB -Bb +aF +uu +qk JP -Qb -HD +ZN +ve JP XB lt @@ -2022,9 +2001,9 @@ lt lt lt PN -RI -We -FH +xZ +WW +fa DT DT PC @@ -2034,9 +2013,9 @@ DT PC JP JP -dk -jp -vc +UK +Uu +gj XB lt lt @@ -2046,8 +2025,8 @@ lt lt uk pv -Ot -Ft +xr +qO pv ry lt @@ -2057,8 +2036,8 @@ lt lt WG JP -aW -Gy +Hk +Bs JP WG lt diff --git a/_maps/shuttles/whiteship_box.dmm b/_maps/shuttles/whiteship_box.dmm index 1fcda0639e1d2..cbfdf87ce09a7 100644 --- a/_maps/shuttles/whiteship_box.dmm +++ b/_maps/shuttles/whiteship_box.dmm @@ -104,7 +104,7 @@ }, /obj/machinery/airalarm/directional/north, /obj/effect/mapping_helpers/airalarm/all_access, -/obj/item/storage/backpack/duffelbag/med/surgery{ +/obj/item/surgery_tray/full{ pixel_y = 4 }, /obj/item/clothing/suit/apron/surgical, @@ -593,7 +593,7 @@ "bs" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/cryo_cell, +/obj/machinery/cryo_cell, /obj/effect/turf_decal/stripes/line{ dir = 9 }, @@ -622,7 +622,7 @@ "bu" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/cryo_cell, +/obj/machinery/cryo_cell, /obj/effect/turf_decal/stripes/line{ dir = 5 }, @@ -1212,7 +1212,7 @@ /area/shuttle/abandoned/medbay) "cF" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, /obj/machinery/light/small/built/directional/north, /obj/effect/decal/cleanable/blood/old, @@ -1247,7 +1247,7 @@ "cH" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, /turf/open/floor/iron/white/side{ dir = 1 @@ -1555,7 +1555,7 @@ "dk" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, /turf/open/floor/iron/white/side{ dir = 10 @@ -1624,7 +1624,7 @@ "dr" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, /turf/open/floor/iron/white/side{ dir = 6 diff --git a/_maps/shuttles/whiteship_cere.dmm b/_maps/shuttles/whiteship_cere.dmm index 4ab6ec735b459..e6a677d57c3a5 100644 --- a/_maps/shuttles/whiteship_cere.dmm +++ b/_maps/shuttles/whiteship_cere.dmm @@ -2,33 +2,6 @@ "aa" = ( /turf/template_noop, /area/template_noop) -"ab" = ( -/obj/structure/cable, -/obj/structure/cable/layer1, -/obj/effect/decal/cleanable/dirt, -/obj/item/paperwork/ancient, -/obj/structure/filingcabinet, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/catwalk_floor/iron_dark, -/area/shuttle/abandoned/cargo) -"ac" = ( -/obj/machinery/mech_bay_recharge_port, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/north, -/turf/open/floor/pod/dark, -/area/shuttle/abandoned/cargo) -"ad" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, -/area/shuttle/abandoned/cargo) -"ae" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/emcloset/anchored, -/turf/open/floor/catwalk_floor/iron_dark, -/area/shuttle/abandoned/cargo) "af" = ( /obj/effect/spawner/structure/window/reinforced/shuttle, /obj/machinery/door/poddoor{ @@ -36,38 +9,9 @@ }, /turf/open/floor/plating, /area/shuttle/abandoned/engine) -"ag" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/pod/dark, -/area/shuttle/abandoned/cargo) -"ah" = ( -/obj/structure/bed, -/obj/item/bedsheet/random, -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/wood, -/area/shuttle/abandoned/crew) -"ai" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/catwalk_floor/iron_dark, -/area/shuttle/abandoned/cargo) "aj" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/abandoned/engine) -"ak" = ( -/obj/structure/cable, -/obj/machinery/light/small/directional/east, -/obj/structure/cable/layer1, -/obj/effect/decal/cleanable/dirt, -/obj/item/paper/crumpled/bloody/ruins/whiteship/cere/told_you_so, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/wood, -/area/shuttle/abandoned/crew) "al" = ( /obj/structure/cable, /obj/machinery/power/solar, @@ -80,18 +24,6 @@ }, /turf/open/floor/plating, /area/shuttle/abandoned/crew) -"an" = ( -/obj/structure/cable, -/obj/structure/cable/layer1, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/catwalk_floor/iron_dark, -/area/shuttle/abandoned/cargo) -"ao" = ( -/obj/structure/cable/layer1, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/catwalk_floor/iron_dark, -/area/shuttle/abandoned/cargo) "ap" = ( /obj/machinery/door/airlock/hatch{ name = "Solar Sail Access" @@ -99,28 +31,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/shuttle/abandoned/cargo) -"aq" = ( -/obj/structure/cable, -/obj/structure/cable/layer1, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced/titaniumglass, -/obj/item/paper_bin, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/unlocked, -/turf/open/floor/catwalk_floor/iron_dark, -/area/shuttle/abandoned/cargo) -"ar" = ( -/obj/structure/cable, -/obj/structure/cable/layer1, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/item/pen{ - pixel_x = -5; - pixel_y = 5 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/shuttle/abandoned/cargo) "as" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/abandoned/cargo) @@ -133,39 +43,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/wood, /area/shuttle/abandoned/cargo) -"au" = ( -/obj/structure/closet/secure_closet/freezer/meat/open, -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/abandoned/bar) -"av" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/catwalk_floor/titanium, -/area/shuttle/abandoned/bar) -"aw" = ( -/obj/structure/table/wood, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/wood, -/area/shuttle/abandoned/bar) -"ax" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/table/wood, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/item/paper/crumpled/bloody/ruins/whiteship/cere/firedoor_glitch, -/turf/open/floor/wood, -/area/shuttle/abandoned/bar) "ay" = ( /obj/structure/cable, /obj/structure/lattice/catwalk, @@ -183,14 +60,6 @@ }, /turf/open/floor/plating, /area/shuttle/abandoned/cargo) -"aA" = ( -/obj/structure/cable, -/obj/structure/cable/layer1, -/obj/effect/decal/cleanable/dirt, -/mob/living/basic/migo, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/wood, -/area/shuttle/abandoned/crew) "aB" = ( /obj/machinery/light/small/directional/south, /obj/machinery/power/smes{ @@ -200,28 +69,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/shuttle/abandoned/engine) -"aC" = ( -/obj/machinery/light/small/broken/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/floor/wood, -/area/shuttle/abandoned/bar) -"aD" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/wood, -/area/shuttle/abandoned/bar) -"aE" = ( -/obj/structure/cable, -/obj/machinery/light/small/broken/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/wood, -/area/shuttle/abandoned/bar) "aF" = ( /obj/structure/cable, /obj/machinery/power/solar, @@ -238,35 +85,6 @@ /obj/effect/mapping_helpers/airalarm/unlocked, /turf/open/floor/plating, /area/shuttle/abandoned/engine) -"aI" = ( -/obj/effect/decal/cleanable/dirt, -/mob/living/basic/migo, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/dark, -/area/shuttle/abandoned/bridge) -"aJ" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable/layer1, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/wood, -/area/shuttle/abandoned/crew) -"aK" = ( -/obj/machinery/door/airlock{ - name = "Cabin 1" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/wood, -/area/shuttle/abandoned/crew) -"aL" = ( -/obj/machinery/microwave, -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/abandoned/bar) "aM" = ( /obj/machinery/door/airlock/hatch{ name = "Solar Sail Access" @@ -284,13 +102,6 @@ }, /turf/open/floor/plating, /area/shuttle/abandoned/cargo) -"aO" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/machinery/griddle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/abandoned/bar) "aP" = ( /obj/structure/cable, /obj/structure/lattice/catwalk, @@ -299,61 +110,14 @@ "aQ" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/abandoned/bridge) -"aR" = ( -/obj/structure/closet/secure_closet/personal, -/obj/item/clothing/under/rank/captain, -/obj/item/clothing/shoes/laceup, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/shuttle/abandoned/bridge) "aS" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/abandoned/bar) -"aT" = ( -/obj/structure/closet/secure_closet/freezer/kitchen/mining, -/obj/machinery/light/small/broken/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/abandoned/bar) -"aU" = ( -/obj/effect/decal/remains/human, -/obj/item/clothing/head/hats/caphat/parade{ - name = "old captain's cap"; - desc = "A damaged Captain's cap, smelling faintly of blood."; - pixel_y = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/gun/energy/laser/retro, -/obj/item/paper/crumpled/bloody/ruins/whiteship/cere/captain_suicide, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/machinery/firealarm/directional/south, -/obj/effect/decal/cleanable/blood/old, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/unlocked, -/turf/open/floor/wood, -/area/shuttle/abandoned/bridge) -"aV" = ( -/obj/structure/cable, -/obj/structure/cable/layer1, -/obj/effect/decal/cleanable/dirt, -/obj/structure/filingcabinet, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/catwalk_floor/iron_dark, -/area/shuttle/abandoned/cargo) "aW" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, /turf/template_noop, /area/shuttle/abandoned/cargo) -"aX" = ( -/obj/structure/cable, -/obj/structure/chair/comfy/shuttle, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark, -/area/shuttle/abandoned/bridge) "aZ" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/abandoned/bridge) @@ -368,6 +132,30 @@ }, /turf/open/floor/plating, /area/shuttle/abandoned/engine) +"bh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/west, +/turf/open/floor/catwalk_floor/iron_dark, +/area/shuttle/abandoned/cargo) +"bU" = ( +/obj/structure/cable, +/obj/structure/cable/layer1, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/mob_spawn/corpse/human/engineer{ + brute_damage = 200 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/catwalk_floor/iron_dark, +/area/shuttle/abandoned/cargo) +"cm" = ( +/obj/structure/cable/layer1, +/obj/machinery/light/small/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/south, +/obj/effect/mapping_helpers/airalarm/unlocked, +/turf/open/floor/wood, +/area/shuttle/abandoned/crew) "df" = ( /obj/structure/cable, /obj/machinery/power/solar_control{ @@ -377,10 +165,31 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/plating, /area/shuttle/abandoned/engine) -"dF" = ( +"dp" = ( +/obj/structure/cable/layer1, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor/iron_dark, +/area/shuttle/abandoned/cargo) +"dN" = ( +/obj/structure/closet/secure_closet/freezer/kitchen/mining, +/obj/machinery/light/small/broken/directional/west, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/abandoned/bar) +"fU" = ( +/obj/structure/cable, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/abandoned/engine) +"gd" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Backup Air Supply" + }, +/turf/open/floor/plating, +/area/shuttle/abandoned/engine) +"gf" = ( /obj/structure/closet/secure_closet/personal, /obj/effect/decal/cleanable/dirt, -/obj/item/paper/fluff/ruins/whiteship/cere/comical_foreshadowing, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, @@ -389,47 +198,6 @@ /obj/effect/mapping_helpers/airalarm/unlocked, /turf/open/floor/wood, /area/shuttle/abandoned/crew) -"dM" = ( -/obj/structure/table/reinforced, -/obj/machinery/recharger, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/shuttle/abandoned/bridge) -"eq" = ( -/obj/machinery/vending/boozeomat/all_access, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/unlocked, -/turf/open/floor/wood, -/area/shuttle/abandoned/bar) -"eU" = ( -/obj/item/gun/energy/laser/retro, -/obj/structure/closet/crate/secure/weapon, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, -/area/shuttle/abandoned/cargo) -"fS" = ( -/obj/structure/closet/secure_closet/personal, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/machinery/firealarm/directional/south, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/unlocked, -/turf/open/floor/wood, -/area/shuttle/abandoned/crew) -"fU" = ( -/obj/structure/cable, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/abandoned/engine) -"gd" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Backup Air Supply" - }, -/turf/open/floor/plating, -/area/shuttle/abandoned/engine) "gu" = ( /obj/structure/cable, /obj/machinery/door/airlock/maintenance_hatch, @@ -437,15 +205,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/plating, /area/shuttle/abandoned/engine) -"gX" = ( +"gy" = ( /obj/structure/cable, -/obj/machinery/door/airlock{ - name = "Kitchen and Bridge" - }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/layer1, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/wood, -/area/shuttle/abandoned/bar) +/area/shuttle/abandoned/crew) +"gK" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/shuttle/abandoned/cargo) "hj" = ( /obj/machinery/door/airlock/hatch{ name = "Solar Sail Access" @@ -453,63 +224,72 @@ /obj/structure/cable/layer1, /turf/open/floor/plating, /area/shuttle/abandoned/cargo) -"hT" = ( +"jV" = ( /obj/structure/cable, +/obj/structure/cable/layer1, /obj/effect/decal/cleanable/dirt, -/obj/machinery/space_heater, +/obj/structure/filingcabinet, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/catwalk_floor/iron_dark, /area/shuttle/abandoned/cargo) -"iS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/item/pickaxe/emergency, -/obj/item/mining_scanner, -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/unlocked, -/turf/open/floor/pod/dark, -/area/shuttle/abandoned/cargo) -"iT" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/tank_dispenser/oxygen, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, -/area/shuttle/abandoned/cargo) -"jB" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/floor/wood, -/area/shuttle/abandoned/bar) "kr" = ( /obj/machinery/atmospherics/components/tank/air{ dir = 1 }, /turf/open/floor/plating, /area/shuttle/abandoned/engine) +"kM" = ( +/obj/structure/cable, +/obj/structure/cable/layer1, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/corpse/human/miner{ + brute_damage = 200 + }, +/obj/item/knife/combat/survival, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/firealarm/directional/east, +/obj/effect/decal/cleanable/blood/gibs/old, +/turf/open/floor/wood, +/area/shuttle/abandoned/crew) "kO" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/tank/air, /turf/open/floor/plating, /area/shuttle/abandoned/engine) -"lM" = ( -/obj/machinery/door/airlock/external/glass/ruin, +"kP" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/obj/machinery/griddle, /obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/abandoned/bar) +"lk" = ( +/obj/structure/cable, +/obj/structure/cable/layer1, +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/reinforced/titaniumglass, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/recharger, /turf/open/floor/catwalk_floor/iron_dark, /area/shuttle/abandoned/cargo) -"my" = ( +"ls" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/west, -/obj/structure/closet/emcloset/anchored, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/catwalk_floor/iron_dark, +/area/shuttle/abandoned/cargo) +"lw" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, /turf/open/floor/wood, /area/shuttle/abandoned/bar) -"mB" = ( -/obj/structure/closet/crate/secure/freezer/pizza{ - req_access = list() - }, +"mc" = ( +/obj/structure/cable/layer1, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, +/obj/item/paper/fluff/ruins/whiteship/cere/cargo_vent, +/turf/open/floor/catwalk_floor/iron_dark, /area/shuttle/abandoned/cargo) "mC" = ( /obj/structure/cable/multilayer/connected, @@ -521,6 +301,66 @@ }, /turf/open/floor/plating, /area/shuttle/abandoned/crew) +"mU" = ( +/obj/machinery/button/door/directional/east{ + id = "cerewhiteright"; + name = "Cargo Blast Door Toggle" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/south, +/obj/structure/closet/crate, +/obj/item/stack/sheet/iron/ten, +/obj/item/stack/sheet/glass{ + amount = 5 + }, +/obj/item/storage/box/lights/mixed, +/obj/item/storage/box/lights/bulbs, +/turf/open/floor/pod/dark, +/area/shuttle/abandoned/cargo) +"mV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/pod/dark, +/area/shuttle/abandoned/cargo) +"nf" = ( +/obj/machinery/door/airlock{ + name = "Cabin 1" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/wood, +/area/shuttle/abandoned/crew) +"np" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/catwalk_floor/titanium, +/area/shuttle/abandoned/bar) +"nq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/item/pickaxe/emergency, +/obj/item/mining_scanner, +/obj/machinery/airalarm/directional/south, +/obj/effect/mapping_helpers/airalarm/unlocked, +/turf/open/floor/pod/dark, +/area/shuttle/abandoned/cargo) +"ns" = ( +/obj/structure/cable, +/obj/machinery/door/airlock{ + name = "Kitchen and Bridge" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/wood, +/area/shuttle/abandoned/bar) +"nx" = ( +/obj/structure/closet/secure_closet/freezer/kitchen/maintenance, +/obj/effect/spawner/random/food_or_drink/donkpockets, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/abandoned/bar) "nI" = ( /obj/machinery/door/poddoor{ id = "cerewhiteright" @@ -540,24 +380,30 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/plating/airless, /area/shuttle/abandoned/cargo) -"nY" = ( -/obj/machinery/suit_storage_unit/spaceruin, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, -/area/shuttle/abandoned/cargo) "oo" = ( /obj/machinery/power/shuttle_engine/propulsion/left{ dir = 1 }, /turf/open/floor/plating/airless, /area/shuttle/abandoned/cargo) -"pb" = ( -/obj/effect/spawner/random/exotic/ripley, +"oB" = ( +/obj/structure/bed, +/obj/item/bedsheet/random, +/obj/machinery/light/small/directional/east, /obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/unlocked, -/turf/open/floor/pod/dark, -/area/shuttle/abandoned/cargo) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/wood, +/area/shuttle/abandoned/crew) +"oG" = ( +/obj/structure/cable, +/obj/machinery/light/small/directional/east, +/obj/structure/cable/layer1, +/obj/effect/decal/cleanable/dirt, +/obj/item/paper/crumpled/bloody/ruins/whiteship/cere/told_you_so, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/wood, +/area/shuttle/abandoned/crew) "pr" = ( /obj/structure/cable, /obj/machinery/power/tracker, @@ -568,6 +414,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/plating, /area/shuttle/abandoned/engine) +"ql" = ( +/obj/structure/cable, +/obj/structure/cable/layer1, +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/reinforced/titaniumglass, +/obj/item/paper_bin, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/airalarm/directional/south, +/obj/effect/mapping_helpers/airalarm/unlocked, +/turf/open/floor/catwalk_floor/iron_dark, +/area/shuttle/abandoned/cargo) "qx" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -576,18 +433,32 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/plating, /area/shuttle/abandoned/engine) -"rQ" = ( +"qF" = ( +/obj/structure/cable, +/obj/structure/cable/layer1, /obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/external/glass/ruin, -/obj/docking_port/mobile{ - dir = 2; - shuttle_id = "whiteship"; - launch_status = 0; - name = "NT Heavy Salvage Ship"; - port_direction = 2 - }, +/mob/living/basic/migo, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/wood, +/area/shuttle/abandoned/crew) +"qT" = ( +/obj/structure/cable, +/obj/structure/cable/layer1, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/catwalk_floor/iron_dark, +/area/shuttle/abandoned/cargo) +"rW" = ( +/obj/structure/cable, +/obj/machinery/light/small/broken/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/wood, +/area/shuttle/abandoned/bar) +"rZ" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/migo, +/turf/open/floor/pod/dark, /area/shuttle/abandoned/cargo) "su" = ( /obj/effect/spawner/structure/window/reinforced/shuttle, @@ -602,62 +473,41 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/plating, /area/shuttle/abandoned/engine) -"uc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/pod/dark, -/area/shuttle/abandoned/cargo) -"uw" = ( +"to" = ( +/obj/structure/cable, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/pod/dark, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/catwalk_floor/iron_dark, /area/shuttle/abandoned/cargo) "vH" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/abandoned/engine) -"vW" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/machinery/suit_storage_unit/spaceruin, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, -/area/shuttle/abandoned/cargo) -"wd" = ( +"wI" = ( +/obj/structure/bed, +/obj/item/bedsheet/captain, +/obj/machinery/light/small/directional/north, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/turf/open/floor/catwalk_floor/iron_dark, -/area/shuttle/abandoned/cargo) -"wQ" = ( -/obj/machinery/computer/mech_bay_power_console{ - dir = 4 +/obj/machinery/button/door/directional/east{ + id = "whiteship_cap_bolts"; + name = "Door Lock"; + normaldoorcontrol = 1; + specialfunctions = 4 }, +/turf/open/floor/wood, +/area/shuttle/abandoned/bridge) +"wM" = ( +/obj/structure/cable, +/obj/structure/cable/layer1, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, +/obj/structure/table/reinforced/titaniumglass, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/turf/open/floor/catwalk_floor/iron_dark, /area/shuttle/abandoned/cargo) -"wV" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/computer/shuttle/white_ship/bridge{ - dir = 1 - }, +"wN" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door/directional/west{ - id = "whiteship_windows"; - name = "Windows Blast Door Control"; - pixel_y = -6 - }, -/obj/machinery/button/door/directional/west{ - id = "whiteship_bridge"; - name = "Bridge Blast Door Control"; - pixel_y = 6 - }, -/turf/open/floor/iron/dark, -/area/shuttle/abandoned/bridge) -"yq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/south, -/obj/structure/closet/crate, -/obj/effect/spawner/random/maintenance/six, +/obj/structure/reagent_dispensers/fueltank, /turf/open/floor/pod/dark, /area/shuttle/abandoned/cargo) "yA" = ( @@ -677,46 +527,79 @@ /obj/machinery/suit_storage_unit/spaceruin, /turf/open/floor/plating, /area/shuttle/abandoned/engine) -"zN" = ( +"zc" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/item/paper/crumpled/bloody/ruins/whiteship/cere/firedoor_glitch, +/turf/open/floor/wood, +/area/shuttle/abandoned/bar) +"zu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm/directional/west, +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/wood, +/area/shuttle/abandoned/bar) +"zJ" = ( +/obj/structure/closet/crate/secure/freezer/pizza{ + req_access = list() + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/shuttle/abandoned/cargo) +"Ah" = ( /obj/structure/cable, /obj/structure/cable/layer1, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/mob_spawn/corpse/human/engineer{ - brute_damage = 200 +/obj/item/pen{ + pixel_x = -5; + pixel_y = 5 }, -/obj/effect/decal/cleanable/blood/old, /turf/open/floor/catwalk_floor/iron_dark, /area/shuttle/abandoned/cargo) -"Aq" = ( +"Bq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/firecloset/full, +/turf/open/floor/pod/dark, +/area/shuttle/abandoned/cargo) +"BN" = ( /obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/chair/comfy/shuttle, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron/dark, +/area/shuttle/abandoned/bridge) +"Cp" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, +/turf/open/floor/pod/dark, +/area/shuttle/abandoned/cargo) +"CC" = ( +/obj/machinery/vending/boozeomat/all_access, +/obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/east, /obj/effect/mapping_helpers/airalarm/unlocked, -/turf/open/floor/iron/dark, -/area/shuttle/abandoned/bridge) -"Br" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/wood, +/area/shuttle/abandoned/bar) +"Dj" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/suit_storage_unit/spaceruin, /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/shuttle/abandoned/cargo) -"BL" = ( +"Dr" = ( +/obj/effect/spawner/random/exotic/ripley, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/catwalk_floor/iron_dark, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/unlocked, +/turf/open/floor/pod/dark, /area/shuttle/abandoned/cargo) -"Cj" = ( -/obj/structure/closet/secure_closet/freezer/kitchen/maintenance, -/obj/effect/spawner/random/food_or_drink/donkpockets, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/abandoned/bar) "Dy" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -734,6 +617,35 @@ /obj/item/stack/sheet/mineral/plasma/thirty, /turf/open/floor/plating, /area/shuttle/abandoned/engine) +"DC" = ( +/obj/structure/closet/secure_closet/personal, +/obj/effect/decal/cleanable/dirt, +/obj/item/paper/fluff/ruins/whiteship/cere/comical_foreshadowing, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/firealarm/directional/south, +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/unlocked, +/turf/open/floor/wood, +/area/shuttle/abandoned/crew) +"DG" = ( +/obj/machinery/door/airlock/command{ + name = "Bridge" + }, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron/dark, +/area/shuttle/abandoned/bridge) +"EQ" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/food_or_drink/donkpockets, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/unlocked, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/abandoned/bar) "Fg" = ( /obj/machinery/power/shuttle_engine/heater{ dir = 1 @@ -742,16 +654,42 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/plating/airless, /area/shuttle/abandoned/cargo) +"Fj" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/unlocked, +/turf/open/floor/iron/dark, +/area/shuttle/abandoned/bridge) "FU" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/abandoned/crew) -"Gu" = ( +"Gn" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 +/obj/machinery/firealarm/directional/south, +/obj/structure/closet/crate, +/obj/effect/spawner/random/maintenance/six, +/turf/open/floor/pod/dark, +/area/shuttle/abandoned/cargo) +"Ha" = ( +/obj/machinery/computer/mech_bay_power_console{ + dir = 4 }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/shuttle/abandoned/cargo) +"Hw" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/shuttle/abandoned/bridge) "HI" = ( /obj/machinery/power/port_gen/pacman/pre_loaded, /obj/structure/cable, @@ -769,51 +707,40 @@ /obj/item/storage/toolbox/electrical, /turf/open/floor/plating, /area/shuttle/abandoned/engine) +"HX" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/machinery/suit_storage_unit/spaceruin, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/shuttle/abandoned/cargo) +"HZ" = ( +/obj/machinery/microwave, +/obj/structure/table/reinforced, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/abandoned/bar) "Id" = ( /obj/structure/cable, /obj/machinery/power/solar, /turf/open/floor/iron/solarpanel/airless, /area/shuttle/abandoned/engine) -"Ie" = ( -/obj/structure/cable/layer1, -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/unlocked, -/turf/open/floor/wood, -/area/shuttle/abandoned/crew) -"Ix" = ( +"Im" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger, /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/firecloset/full, -/turf/open/floor/pod/dark, -/area/shuttle/abandoned/cargo) -"Ju" = ( +/turf/open/floor/iron/dark, +/area/shuttle/abandoned/bridge) +"IT" = ( /obj/structure/cable, /obj/structure/cable/layer1, /obj/effect/decal/cleanable/dirt, -/obj/effect/mob_spawn/corpse/human/miner{ - brute_damage = 200 - }, -/obj/item/knife/combat/survival, +/obj/structure/table/reinforced/titaniumglass, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/blood/gibs/old, -/turf/open/floor/wood, -/area/shuttle/abandoned/crew) -"JL" = ( -/obj/machinery/button/door/directional/east{ - id = "cerewhiteright"; - name = "Cargo Blast Door Toggle" - }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/shuttle/abandoned/cargo) +"Km" = ( +/obj/effect/spawner/random/structure/crate, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/broken/directional/south, -/obj/structure/closet/crate, -/obj/item/stack/sheet/iron/ten, -/obj/item/stack/sheet/glass{ - amount = 5 - }, -/obj/item/storage/box/lights/mixed, -/obj/item/storage/box/lights/bulbs, /turf/open/floor/pod/dark, /area/shuttle/abandoned/cargo) "Ko" = ( @@ -822,28 +749,51 @@ }, /turf/open/floor/plating/airless, /area/shuttle/abandoned/cargo) -"LR" = ( +"KF" = ( /obj/structure/cable, -/obj/structure/cable/layer1, +/obj/machinery/power/apc/auto_name/directional/north, /obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced/titaniumglass, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/light/directional/south, +/obj/structure/closet/emcloset/anchored, /turf/open/floor/catwalk_floor/iron_dark, /area/shuttle/abandoned/cargo) -"Mc" = ( -/obj/structure/bed, -/obj/item/bedsheet/captain, -/obj/machinery/light/small/directional/north, +"KH" = ( +/obj/machinery/light/small/broken/directional/west, /obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door/directional/east{ - id = "whiteship_cap_bolts"; - name = "Door Lock"; - normaldoorcontrol = 1; - specialfunctions = 4 +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/wood, +/area/shuttle/abandoned/bar) +"KL" = ( +/obj/item/gun/energy/laser/retro, +/obj/structure/closet/crate/secure/weapon, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/shuttle/abandoned/cargo) +"Li" = ( +/obj/structure/closet/secure_closet/freezer/meat/open, +/obj/machinery/light/small/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 }, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/abandoned/bar) +"LW" = ( +/obj/structure/closet/secure_closet/personal, +/obj/item/clothing/under/rank/captain, +/obj/item/clothing/shoes/laceup, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/shuttle/abandoned/bridge) +"Me" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/migo, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/dark, +/area/shuttle/abandoned/bridge) "MW" = ( /obj/machinery/door/airlock/hatch{ name = "Solar Sail Access" @@ -854,13 +804,9 @@ }, /turf/open/floor/plating, /area/shuttle/abandoned/engine) -"NK" = ( -/obj/structure/cable, -/obj/structure/cable/layer1, +"MX" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced/titaniumglass, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/recharger, +/obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/catwalk_floor/iron_dark, /area/shuttle/abandoned/cargo) "Pk" = ( @@ -868,16 +814,44 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/plating, /area/shuttle/abandoned/engine) +"PL" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/space_heater, +/turf/open/floor/catwalk_floor/iron_dark, +/area/shuttle/abandoned/cargo) +"PO" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/computer/shuttle/white_ship/bridge{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/button/door/directional/west{ + id = "whiteship_windows"; + name = "Windows Blast Door Control"; + pixel_y = -6 + }, +/obj/machinery/button/door/directional/west{ + id = "whiteship_bridge"; + name = "Bridge Blast Door Control"; + pixel_y = 6 + }, +/turf/open/floor/iron/dark, +/area/shuttle/abandoned/bridge) "PR" = ( /obj/structure/cable/layer1, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/plating, /area/shuttle/abandoned/engine) -"PV" = ( +"PX" = ( +/obj/machinery/door/window/right/directional/north{ + name = "Bar" + }, +/obj/structure/cable, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/catwalk_floor/iron_dark, -/area/shuttle/abandoned/cargo) +/turf/open/floor/wood, +/area/shuttle/abandoned/bar) "QD" = ( /obj/machinery/power/shuttle_engine/propulsion/left{ dir = 1 @@ -885,18 +859,23 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/plating/airless, /area/shuttle/abandoned/cargo) +"QH" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/wood, +/area/shuttle/abandoned/bar) "QY" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/abandoned/cargo) -"Rx" = ( +"Rj" = ( /obj/structure/cable, /obj/structure/cable/layer1, /obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced/titaniumglass, +/obj/item/paperwork/ancient, +/obj/structure/filingcabinet, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/light/broken/directional/south, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, +/obj/machinery/firealarm/directional/south, /turf/open/floor/catwalk_floor/iron_dark, /area/shuttle/abandoned/cargo) "Sw" = ( @@ -909,6 +888,48 @@ /obj/machinery/light/broken/directional/north, /turf/open/floor/pod/dark, /area/shuttle/abandoned/cargo) +"Sx" = ( +/obj/machinery/door/airlock/command{ + name = "Captain's Quarters"; + id_tag = "whiteship_cap_bolts" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron/dark, +/area/shuttle/abandoned/bridge) +"SB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/external/glass/ruin, +/obj/docking_port/mobile{ + dir = 2; + shuttle_id = "whiteship"; + launch_status = 0; + name = "NT Heavy Salvage Ship"; + port_direction = 2 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/shuttle/abandoned/cargo) +"SL" = ( +/obj/effect/decal/remains/human, +/obj/item/clothing/head/hats/caphat/parade{ + name = "old captain's cap"; + desc = "A damaged Captain's cap, smelling faintly of blood."; + pixel_y = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/gun/energy/laser/retro, +/obj/item/paper/crumpled/bloody/ruins/whiteship/cere/captain_suicide, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/firealarm/directional/south, +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/unlocked, +/turf/open/floor/wood, +/area/shuttle/abandoned/bridge) "SV" = ( /obj/machinery/power/shuttle_engine/heater{ dir = 1 @@ -916,78 +937,55 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/plating/airless, /area/shuttle/abandoned/cargo) -"Tj" = ( +"TD" = ( +/obj/machinery/suit_storage_unit/spaceruin, /obj/effect/decal/cleanable/dirt, -/mob/living/basic/migo, /turf/open/floor/pod/dark, /area/shuttle/abandoned/cargo) -"TA" = ( -/obj/machinery/door/window/right/directional/north{ - name = "Bar" - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/wood, -/area/shuttle/abandoned/bar) -"VS" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/suit_storage_unit/spaceruin, +"TG" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/tank_dispenser/oxygen, /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/shuttle/abandoned/cargo) -"We" = ( -/obj/machinery/door/airlock/command{ - name = "Captain's Quarters"; - id_tag = "whiteship_cap_bolts" +"US" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 }, -/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/pod/dark, +/area/shuttle/abandoned/cargo) +"Vx" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/tank_dispenser/oxygen, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark, -/area/shuttle/abandoned/bridge) -"Wt" = ( +/turf/open/floor/pod/dark, +/area/shuttle/abandoned/cargo) +"VD" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/south, /turf/open/floor/pod/dark, /area/shuttle/abandoned/cargo) -"WY" = ( -/obj/structure/table/reinforced, -/obj/effect/spawner/random/food_or_drink/donkpockets, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/unlocked, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/abandoned/bar) -"Xc" = ( -/obj/structure/cable/layer1, +"WF" = ( +/obj/machinery/light/broken/directional/north, +/obj/machinery/mech_bay_recharge_port, /obj/effect/decal/cleanable/dirt, -/obj/item/paper/fluff/ruins/whiteship/cere/cargo_vent, -/turf/open/floor/catwalk_floor/iron_dark, +/turf/open/floor/pod/dark, /area/shuttle/abandoned/cargo) -"Xz" = ( -/obj/effect/spawner/random/structure/crate, +"XT" = ( +/obj/machinery/door/airlock/external/glass/ruin, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/catwalk_floor/iron_dark, /area/shuttle/abandoned/cargo) -"XM" = ( -/obj/machinery/door/airlock/command{ - name = "Bridge" - }, +"YO" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark, -/area/shuttle/abandoned/bridge) -"Zc" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/shuttle/abandoned/bridge) +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/wood, +/area/shuttle/abandoned/bar) "ZC" = ( /obj/machinery/power/shuttle_engine/heater{ dir = 1 @@ -1026,11 +1024,11 @@ aa aa Ko SV -Xz -ad -ad -ad -Wt +Km +gK +gK +gK +VD as ay ay @@ -1049,11 +1047,11 @@ al aa QD Fg -iT -ad -uc -ad -mB +Vx +gK +wN +gK +zJ as aF aF @@ -1073,10 +1071,10 @@ aW ap ba hj -ao -ao -ao -yq +dp +dp +dp +Gn as am am @@ -1095,17 +1093,17 @@ al aa nL ZC -vW -ad -ad -Xc -an +HX +gK +gK +mc +qT at -aA -ak -Ju -aJ -Ie +qF +oG +kM +gy +cm aQ aQ aZ @@ -1118,19 +1116,19 @@ aa aa oo SV -nY -Tj -ad -ad -aq +TD +rZ +gK +gK +ql aG -aK +nf aG aG -aK +nf aG aQ -aR +LW aQ aZ aa @@ -1141,20 +1139,20 @@ aa aa as as -ac -ad -uw -ad -Rx +WF +gK +US +gK +wM aG -ah -dF +oB +DC aG -ah -fS +oB +gf aQ -Mc -aU +wI +SL aQ aZ "} @@ -1164,11 +1162,11 @@ aa aa aa as -pb -ad -ag -Xz -aV +Dr +gK +mV +Km +jV aS aS aS @@ -1177,7 +1175,7 @@ aS aS aS aQ -We +Sx aQ aQ "} @@ -1187,44 +1185,44 @@ as aN as as -wQ -ad -ag -ad -an -aw -aC -my +Ha +gK +mV +gK +qT +lw +KH +zu aS -aL -Cj -aT +HZ +nx +dN aQ -aI -wV +Me +PO su "} (10,1,1) = {" -rQ -wd -BL -PV -lM -ai -ai -ai -ai -zN -ax -aD -jB -gX -av -av -av -XM -aX -dM +SB +bh +MX +ls +XT +to +to +to +to +bU +zc +QH +YO +ns +np +np +np +DG +BN +Im su "} (11,1,1) = {" @@ -1233,21 +1231,21 @@ as aN as as -hT -ad -ag -ad -ar -TA -aE -eq +PL +gK +mV +gK +Ah +PX +rW +CC aS -au -aO -WY +Li +kP +EQ aQ -Aq -Zc +Fj +Hw su "} (12,1,1) = {" @@ -1256,11 +1254,11 @@ aa aa aa as -ae -ad -ag -ad -ab +KF +gK +mV +gK +Rj aj aj aj @@ -1280,10 +1278,10 @@ aa as as Sw -ad -Gu -ad -NK +gK +Cp +gK +lk aj kO aH @@ -1302,11 +1300,11 @@ aa aa Ko SV -nY -Tj -ad -eU -LR +TD +rZ +gK +KL +IT aj HK gd @@ -1325,11 +1323,11 @@ al aa QD Fg -VS -ad -ad -ao -an +Dj +gK +gK +dp +qT gu sW PR @@ -1349,10 +1347,10 @@ aW ap ba hj -ao -ao -ao -iS +dp +dp +dp +nq aj af af @@ -1371,11 +1369,11 @@ al aa nL ZC -Br -ad -ad -ad -Ix +TG +gK +gK +gK +Bq as Id Id @@ -1394,11 +1392,11 @@ aa aa oo SV -Xz -ad -ad -ad -JL +Km +gK +gK +gK +mU as aP aP diff --git a/_maps/shuttles/whiteship_delta.dmm b/_maps/shuttles/whiteship_delta.dmm index c70ba5f117fe3..2ee3a6e691e6e 100644 --- a/_maps/shuttles/whiteship_delta.dmm +++ b/_maps/shuttles/whiteship_delta.dmm @@ -455,7 +455,7 @@ dir = 8 }, /obj/effect/decal/cleanable/blood/old, -/mob/living/basic/giant_spider/hunter/scrawny, +/mob/living/basic/spider/giant/hunter/scrawny, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/shuttle/abandoned/bar) @@ -944,7 +944,7 @@ dir = 8 }, /obj/structure/cable, -/mob/living/basic/giant_spider/tarantula/scrawny, +/mob/living/basic/spider/giant/tarantula/scrawny, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) "cg" = ( @@ -1504,7 +1504,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/mob/living/basic/giant_spider/nurse/scrawny, +/mob/living/basic/spider/giant/nurse/scrawny, /turf/open/floor/iron, /area/shuttle/abandoned/cargo) "dx" = ( @@ -1576,7 +1576,7 @@ "dG" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/mob/living/basic/giant_spider/hunter/scrawny, +/mob/living/basic/spider/giant/hunter/scrawny, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) "dH" = ( @@ -1623,7 +1623,7 @@ /area/shuttle/abandoned/medbay) "dO" = ( /obj/structure/table, -/obj/item/storage/backpack/duffelbag/med/surgery{ +/obj/item/surgery_tray/full{ pixel_y = 4 }, /obj/effect/decal/cleanable/dirt, @@ -1804,7 +1804,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/box/white/corners, /obj/structure/closet/crate/medical, -/obj/item/roller{ +/obj/item/emergency_bed{ pixel_y = 4 }, /obj/item/healthanalyzer, diff --git a/_maps/shuttles/whiteship_donut.dmm b/_maps/shuttles/whiteship_donut.dmm index 72dc816be78c1..ff9d17b5e36b1 100644 --- a/_maps/shuttles/whiteship_donut.dmm +++ b/_maps/shuttles/whiteship_donut.dmm @@ -8,54 +8,6 @@ "ac" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/abandoned) -"ad" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/external/glass/ruin, -/obj/docking_port/mobile{ - dir = 2; - shuttle_id = "whiteship"; - launch_status = 0; - name = "White Ship"; - port_direction = 2 - }, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned) -"ae" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/west, -/obj/item/stack/sheet/iron, -/obj/structure/tank_dispenser, -/turf/open/floor/iron/airless, -/area/shuttle/abandoned) -"af" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/shuttle/abandoned) -"ag" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned) -"ah" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/broken/directional/east, -/obj/structure/closet/emcloset, -/turf/open/floor/iron/airless, -/area/shuttle/abandoned) -"ai" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned) -"aj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/door_assembly/door_assembly_ext, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned) -"ak" = ( -/obj/structure/girder, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned) "al" = ( /obj/structure/lattice, /turf/template_noop, @@ -72,17 +24,6 @@ }, /turf/open/floor/plating/airless, /area/shuttle/abandoned) -"ao" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/gibs/old, -/obj/item/stack/rods, -/turf/open/floor/iron/airless, -/area/shuttle/abandoned) -"ap" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/shreds, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned) "aq" = ( /turf/template_noop, /area/shuttle/abandoned) @@ -93,185 +34,236 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/plating/airless, /area/shuttle/abandoned) -"as" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/sheet/mineral/titanium, +"aX" = ( +/obj/machinery/power/shuttle_engine/heater, +/obj/structure/window/reinforced/spawner/directional/north{ + layer = 2.9 + }, /turf/open/floor/plating/airless, /area/shuttle/abandoned) -"at" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/splatter, +"be" = ( +/obj/machinery/power/shuttle_engine/propulsion/left, /turf/open/floor/plating/airless, /area/shuttle/abandoned) -"au" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, +"bf" = ( +/obj/machinery/power/shuttle_engine/propulsion/right, /turf/open/floor/plating/airless, /area/shuttle/abandoned) -"av" = ( +"bq" = ( +/obj/effect/spawner/structure/window/reinforced/shuttle, +/turf/open/floor/plating, +/area/shuttle/abandoned) +"cm" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/power/smes, +/obj/item/stock_parts/cell/high, /turf/open/floor/iron/airless, /area/shuttle/abandoned) -"aw" = ( +"da" = ( +/obj/machinery/light/small/directional/west, +/obj/structure/table, /obj/effect/decal/cleanable/dirt, -/obj/structure/girder, +/obj/item/folder/blue, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/airless, +/area/shuttle/abandoned) +"dh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/stack/sheet/mineral/titanium, /turf/open/floor/plating/airless, /area/shuttle/abandoned) -"ax" = ( +"eu" = ( +/obj/machinery/mech_bay_recharge_port, /obj/effect/decal/cleanable/dirt, -/obj/item/stack/sheet/iron, /turf/open/floor/iron/airless, /area/shuttle/abandoned) -"ay" = ( +"eQ" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/power/terminal{ - dir = 1 +/obj/structure/extinguisher_cabinet/directional/north, +/obj/item/storage/toolbox/emergency, +/turf/open/floor/iron/airless, +/area/shuttle/abandoned) +"gf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/paper/stack{ + dir = 4 }, -/turf/open/floor/plating/airless, +/obj/item/folder/yellow, +/turf/open/floor/iron/airless, /area/shuttle/abandoned) -"az" = ( +"hp" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/stock_parts/cell/high/empty, -/turf/open/floor/plating/airless, +/obj/machinery/light/broken/directional/east, +/obj/structure/closet/emcloset, +/turf/open/floor/iron/airless, /area/shuttle/abandoned) -"aA" = ( +"hP" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/stack/rods, -/turf/open/floor/plating/airless, +/obj/effect/decal/cleanable/oil, +/obj/item/stack/cable_coil, +/turf/open/floor/iron/airless, +/area/shuttle/abandoned) +"iK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/storage/toolbox/mechanical, +/obj/structure/extinguisher_cabinet{ + pixel_x = 24 + }, +/turf/open/floor/iron/airless, +/area/shuttle/abandoned) +"iP" = ( +/obj/machinery/light/small/directional/east, +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/cell_charger, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/airless, /area/shuttle/abandoned) -"aB" = ( +"jd" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/frame/machine, /obj/item/stack/cable_coil, /obj/machinery/light/broken/directional/east, /turf/open/floor/iron/airless, /area/shuttle/abandoned) -"aC" = ( +"jo" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/wallframe/apc, -/obj/item/electronics/apc{ - name = "improper power control module" +/obj/item/stack/sheet/iron, +/obj/machinery/power/port_gen/pacman, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 }, -/turf/open/floor/plating/airless, +/turf/open/floor/iron/airless, /area/shuttle/abandoned) -"aD" = ( +"jt" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/generic, -/obj/effect/decal/cleanable/oil, +/obj/machinery/power/smes, /turf/open/floor/iron/airless, /area/shuttle/abandoned) -"aE" = ( +"jP" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/mecha_wreckage/ripley, +/obj/item/stack/sheet/mineral/plasma{ + amount = 15 + }, +/turf/open/floor/plating/airless, +/area/shuttle/abandoned) +"kI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/south, +/obj/effect/spawner/random/exotic/ripley, /turf/open/floor/iron/recharge_floor, /area/shuttle/abandoned) -"aF" = ( +"mY" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/titanium{ - name = "Restroom" +/obj/item/stack/sheet/iron{ + amount = 50 }, +/turf/open/floor/iron/airless, +/area/shuttle/abandoned) +"nu" = ( +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/showroomfloor/airless, /area/shuttle/abandoned) -"aG" = ( +"pM" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/titanium{ - name = "Mech Bay" + name = "Restroom" }, -/turf/open/floor/plating/airless, +/turf/open/floor/iron/showroomfloor/airless, /area/shuttle/abandoned) -"aH" = ( +"qy" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/storage/toolbox/electrical, -/turf/open/floor/iron/airless, +/obj/effect/decal/cleanable/oil/slippery, +/turf/open/floor/plating/airless, /area/shuttle/abandoned) -"aI" = ( +"rq" = ( +/obj/machinery/light/floor, /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/oil/slippery, +/obj/item/crowbar/red, /turf/open/floor/plating/airless, /area/shuttle/abandoned) -"aJ" = ( -/obj/machinery/computer/mech_bay_power_console{ - dir = 8 - }, +"rt" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, +/obj/structure/door_assembly/door_assembly_ext, +/turf/open/floor/plating/airless, /area/shuttle/abandoned) -"aK" = ( +"sg" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/toilet{ - dir = 4 - }, -/obj/machinery/door/window/left/directional/east, -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/turf/open/floor/iron/showroomfloor/airless, +/obj/effect/decal/cleanable/generic, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/iron/airless, /area/shuttle/abandoned) -"aL" = ( +"sw" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/showroomfloor/airless, +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/plating/airless, /area/shuttle/abandoned) -"aM" = ( +"ui" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/urinal/directional/east, -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/turf/open/floor/iron/showroomfloor/airless, +/turf/open/floor/plating/airless, /area/shuttle/abandoned) -"aN" = ( +"vu" = ( +/obj/structure/table, /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/oil, -/obj/item/stack/cable_coil, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, /turf/open/floor/iron/airless, /area/shuttle/abandoned) -"aO" = ( +"vW" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/iron/airless, +/obj/item/clothing/suit/space/eva, +/obj/item/clothing/head/helmet/space/eva, +/obj/item/clothing/mask/breath, +/turf/open/floor/plating/airless, /area/shuttle/abandoned) -"aP" = ( +"wD" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/storage/toolbox/mechanical, -/obj/structure/extinguisher_cabinet{ - pixel_x = 24 +/obj/structure/fluff/paper/stack{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, /turf/open/floor/iron/airless, /area/shuttle/abandoned) -"aQ" = ( +"Bw" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sink/directional/east, /obj/item/soap, /turf/open/floor/iron/showroomfloor/airless, /area/shuttle/abandoned) -"aR" = ( +"Bz" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/showroomfloor/airless, -/area/shuttle/abandoned) -"aS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/urinal/directional/east, -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/turf/open/floor/iron/showroomfloor/airless, +/obj/structure/girder, +/turf/open/floor/plating/airless, /area/shuttle/abandoned) -"aT" = ( -/obj/machinery/mech_bay_recharge_port, +"BM" = ( /obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/generic, /turf/open/floor/iron/airless, /area/shuttle/abandoned) -"aU" = ( +"BW" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/south, -/obj/effect/spawner/random/exotic/ripley, -/turf/open/floor/iron/recharge_floor, +/obj/machinery/power/terminal{ + dir = 1 + }, +/turf/open/floor/plating/airless, /area/shuttle/abandoned) -"aV" = ( -/obj/machinery/computer/mech_bay_power_console{ +"Cg" = ( +/obj/machinery/computer/crew{ dir = 1 }, /obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/airless, /area/shuttle/abandoned) -"aW" = ( +"CC" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/titanium{ name = "Cockpit" @@ -280,23 +272,31 @@ /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/plating/airless, /area/shuttle/abandoned) -"aX" = ( -/obj/machinery/power/shuttle_engine/heater, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 +"Dz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/toilet{ + dir = 4 }, +/obj/machinery/door/window/left/directional/east, +/obj/structure/window/reinforced/tinted/spawner/directional/south, +/turf/open/floor/iron/showroomfloor/airless, +/area/shuttle/abandoned) +"DG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/mecha_wreckage/ripley, +/turf/open/floor/iron/recharge_floor, +/area/shuttle/abandoned) +"Ef" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/shreds, +/obj/item/storage/medkit/ancient, /turf/open/floor/plating/airless, /area/shuttle/abandoned) -"aY" = ( +"EC" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/stack/sheet/iron, -/obj/machinery/power/port_gen/pacman, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, /turf/open/floor/iron/airless, /area/shuttle/abandoned) -"aZ" = ( +"Fs" = ( /obj/structure/chair/comfy/shuttle{ dir = 8 }, @@ -304,115 +304,100 @@ /obj/item/paper, /turf/open/floor/iron/airless, /area/shuttle/abandoned) -"ba" = ( +"Hi" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/fluff/paper/stack{ - dir = 4 + dir = 1 }, -/obj/item/folder/yellow, -/turf/open/floor/iron/airless, +/turf/open/floor/plating/airless, /area/shuttle/abandoned) -"bb" = ( +"Hs" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/stock_parts/cell/high, +/obj/machinery/light/directional/west, +/obj/item/stack/sheet/iron, +/obj/structure/tank_dispenser, /turf/open/floor/iron/airless, /area/shuttle/abandoned) -"bc" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 +"Ic" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/wallframe/apc, +/obj/item/electronics/apc{ + name = "improper power control module" }, +/turf/open/floor/plating/airless, +/area/shuttle/abandoned) +"Jf" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/item/storage/toolbox/emergency, +/obj/item/stack/sheet/iron, /turf/open/floor/iron/airless, /area/shuttle/abandoned) -"bd" = ( +"KK" = ( +/obj/machinery/computer/mech_bay_power_console{ + dir = 1 + }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/half/contrasted, /turf/open/floor/iron/airless, /area/shuttle/abandoned) -"be" = ( -/obj/machinery/power/shuttle_engine/propulsion/left, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned) -"bf" = ( -/obj/machinery/power/shuttle_engine/propulsion/right, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned) -"bg" = ( -/obj/structure/table, +"KL" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/west, -/obj/item/folder/blue, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/airless, +/obj/structure/urinal/directional/east, +/obj/structure/window/reinforced/tinted/spawner/directional/south, +/turf/open/floor/iron/showroomfloor/airless, /area/shuttle/abandoned) -"bh" = ( -/obj/structure/table, +"KR" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/east, -/obj/machinery/cell_charger, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/airless, +/obj/item/stack/rods, +/turf/open/floor/plating/airless, /area/shuttle/abandoned) -"bi" = ( +"KZ" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/pen, +/obj/effect/decal/cleanable/blood/splatter, /turf/open/floor/plating/airless, /area/shuttle/abandoned) -"bj" = ( -/obj/structure/chair/comfy/shuttle, +"Lb" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/stack/sheet/mineral/titanium{ - amount = 50 +/obj/machinery/door/airlock/external/glass/ruin, +/obj/docking_port/mobile{ + dir = 2; + shuttle_id = "whiteship"; + launch_status = 0; + name = "White Ship"; + port_direction = 2 }, -/turf/open/floor/iron/airless, +/turf/open/floor/plating/airless, /area/shuttle/abandoned) -"bk" = ( +"Ms" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/fluff/paper/stack{ - dir = 1 - }, +/obj/effect/decal/cleanable/generic, /turf/open/floor/plating/airless, /area/shuttle/abandoned) -"bl" = ( -/obj/structure/table, +"MT" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/paper_bin{ - total_paper = 20 - }, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 8 - }, +/obj/item/storage/toolbox/electrical, /turf/open/floor/iron/airless, /area/shuttle/abandoned) -"bm" = ( +"Ng" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/fluff/paper/stack{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, +/obj/effect/turf_decal/tile/yellow/half/contrasted, /turf/open/floor/iron/airless, /area/shuttle/abandoned) -"bn" = ( +"Nm" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/reagent_containers/cup/glass/mug, -/obj/effect/turf_decal/tile/blue, +/obj/effect/decal/cleanable/blood/gibs/old, +/obj/item/stack/rods, /turf/open/floor/iron/airless, /area/shuttle/abandoned) -"bo" = ( -/obj/structure/table, +"NG" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/turf/open/floor/iron/airless, +/obj/item/stock_parts/cell/high/empty, +/turf/open/floor/plating/airless, /area/shuttle/abandoned) -"bp" = ( +"Ot" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plating/airless, +/area/shuttle/abandoned) +"OK" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ @@ -420,20 +405,15 @@ }, /turf/open/floor/iron/airless, /area/shuttle/abandoned) -"bq" = ( -/obj/effect/spawner/structure/window/reinforced/shuttle, -/turf/open/floor/plating, -/area/shuttle/abandoned) -"br" = ( -/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship{ - dir = 1 - }, +"OL" = ( +/obj/structure/chair/comfy/shuttle, /obj/effect/decal/cleanable/dirt, -/obj/item/disk/holodisk/donutstation/whiteship, -/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/item/stack/sheet/mineral/titanium{ + amount = 50 + }, /turf/open/floor/iron/airless, /area/shuttle/abandoned) -"bs" = ( +"OT" = ( /obj/machinery/computer/shuttle/white_ship/bridge{ dir = 1 }, @@ -441,49 +421,70 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/airless, /area/shuttle/abandoned) -"bt" = ( -/obj/machinery/computer/crew{ - dir = 1 - }, +"PT" = ( +/obj/structure/girder, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/airless, +/turf/open/floor/plating/airless, /area/shuttle/abandoned) -"bu" = ( +"Qx" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/crowbar/red, -/turf/open/floor/plating/airless, +/obj/item/reagent_containers/cup/glass/mug, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron/airless, /area/shuttle/abandoned) -"pe" = ( +"SB" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/shreds, -/obj/item/storage/medkit/ancient, +/obj/effect/decal/cleanable/glass, /turf/open/floor/plating/airless, /area/shuttle/abandoned) -"tT" = ( +"Te" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/stack/sheet/iron{ - amount = 50 +/obj/structure/urinal/directional/east, +/obj/structure/window/reinforced/tinted/spawner/directional/north, +/turf/open/floor/iron/showroomfloor/airless, +/area/shuttle/abandoned) +"Wf" = ( +/obj/machinery/computer/mech_bay_power_console{ + dir = 8 }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/airless, /area/shuttle/abandoned) -"vR" = ( +"Xd" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/portable_atmospherics/canister/air, +/obj/item/pen, /turf/open/floor/plating/airless, /area/shuttle/abandoned) -"CQ" = ( +"Xk" = ( +/obj/structure/table, /obj/effect/decal/cleanable/dirt, -/obj/item/stack/sheet/mineral/plasma{ - amount = 15 +/obj/item/paper_bin{ + total_paper = 20 }, -/turf/open/floor/plating/airless, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/airless, /area/shuttle/abandoned) -"Ib" = ( +"XY" = ( +/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship{ + dir = 1 + }, /obj/effect/decal/cleanable/dirt, -/obj/item/clothing/suit/space/eva, -/obj/item/clothing/head/helmet/space/eva, -/obj/item/clothing/mask/breath, +/obj/item/disk/holodisk/donutstation/whiteship, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron/airless, +/area/shuttle/abandoned) +"YO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/showroomfloor/airless, +/area/shuttle/abandoned) +"ZA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/titanium{ + name = "Mech Bay" + }, /turf/open/floor/plating/airless, /area/shuttle/abandoned) @@ -516,11 +517,11 @@ ac ab ab ac -aY -aC +jo +Ic ac -aK -aQ +Dz +Bw ab ab ac @@ -535,12 +536,12 @@ aa am ar ab -av -ay -bd -aF -aL -aR +jt +BW +Ng +pM +nu +YO ab aX be @@ -555,12 +556,12 @@ aa an ar ac -ak -az -ag +PT +NG +ui ac -aM -aS +KL +Te ab aX bf @@ -574,7 +575,7 @@ aa aa ac ac -CQ +jP al al al @@ -593,64 +594,64 @@ ab ab ab ac -as -au +dh +SB aq aq al -ai -pe -ao +Ms +Ef +Nm ab -bg -bl +da +Xk ab ab "} (7,1,1) = {" ab -ae -Ib +Hs +vW ac -ao -ap +Nm +sw al aq aq aq aq -at -ap +KZ +sw ac -aZ -bm -bp +Fs +wD +OK bq "} (8,1,1) = {" ac -af -ai -ak -ap -at +EC +Ms +PT +sw +KZ al aq aq aq aq -ag -ag -ak -ba -bi -br +ui +ui +PT +gf +Xd +XY bq "} (9,1,1) = {" -ad -ag -aj +Lb +ui +rt al al aq @@ -661,16 +662,16 @@ aq aq aq al -aW -bu -bj -bs +CC +rq +OL +OT bq "} (10,1,1) = {" ac -ax -ag +Jf +ui al aq aq @@ -682,16 +683,16 @@ aq aq al ac -bb -bk -bt +cm +Hi +Cg bq "} (11,1,1) = {" ab -ah -vR -ak +hp +Ot +PT al aq aq @@ -699,12 +700,12 @@ aq aq aq aq -ag -ag +ui +ui ab -bc -bn -bo +eQ +Qx +vu bq "} (12,1,1) = {" @@ -712,18 +713,18 @@ ab ab ab ac -ak +PT aq aq aq al aq -ag -ag -tT +ui +ui +mY ab -bh -bo +iP +vu ab ab "} @@ -738,7 +739,7 @@ aq al al al -aG +ZA ac ab ab @@ -755,12 +756,12 @@ aa al aq al -ag -au -ag -aH -aN -aT +ui +SB +ui +MT +hP +eu ab aX be @@ -775,12 +776,12 @@ aa al aq aq -ag -aA -aD -aI -aO -aU +ui +KR +sg +qy +BM +kI ab aX bf @@ -795,12 +796,12 @@ aa al al al -aw -aB -aE -aJ -aP -aV +Bz +jd +DG +Wf +iK +KK ab ab ac diff --git a/_maps/shuttles/whiteship_meta.dmm b/_maps/shuttles/whiteship_meta.dmm index 65900f2dafb79..4d907da669795 100644 --- a/_maps/shuttles/whiteship_meta.dmm +++ b/_maps/shuttles/whiteship_meta.dmm @@ -664,6 +664,10 @@ pixel_x = 14 }, /obj/structure/cable, +/obj/item/megaphone{ + pixel_x = -2; + pixel_y = -4 + }, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) "cf" = ( @@ -686,12 +690,12 @@ /area/shuttle/abandoned/bridge) "cg" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/shuttle/white_ship/pod/recall{ - dir = 8 - }, /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ dir = 1 }, +/obj/machinery/computer/shuttle/white_ship/bridge{ + dir = 8 + }, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) "ch" = ( @@ -768,13 +772,16 @@ /turf/open/floor/iron, /area/shuttle/abandoned/bar) "cv" = ( -/obj/machinery/computer/shuttle/white_ship/bridge{ - dir = 8 - }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 8 }, +/obj/structure/table, +/obj/item/folder/blue{ + pixel_x = 6; + pixel_y = 9 + }, +/obj/machinery/recharger, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) "cx" = ( @@ -828,28 +835,19 @@ /obj/structure/table, /obj/machinery/light/small/built/directional/west, /obj/effect/decal/cleanable/dirt, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, /obj/item/radio/off{ pixel_x = 6; pixel_y = 7 }, -/obj/item/megaphone{ - pixel_x = -2; - pixel_y = -4 - }, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) "cE" = ( -/obj/structure/table, /obj/machinery/firealarm/directional/south, /obj/effect/decal/cleanable/dirt, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/item/storage/toolbox/emergency{ - pixel_x = -12 - }, -/obj/item/wrench{ - pixel_x = -12 - }, +/obj/item/wrench, +/obj/item/storage/toolbox/emergency, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) "cF" = ( @@ -1652,15 +1650,9 @@ /turf/open/floor/iron/dark, /area/shuttle/abandoned/cargo) "wE" = ( -/obj/structure/table, /obj/machinery/airalarm/directional/north, /obj/effect/mapping_helpers/airalarm/all_access, /obj/effect/decal/cleanable/dirt, -/obj/item/folder/blue{ - pixel_x = 6; - pixel_y = 9 - }, -/obj/machinery/recharger, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) "xK" = ( diff --git a/_maps/shuttles/whiteship_obelisk.dmm b/_maps/shuttles/whiteship_obelisk.dmm index a30a6b61aa127..ec9697103d954 100644 --- a/_maps/shuttles/whiteship_obelisk.dmm +++ b/_maps/shuttles/whiteship_obelisk.dmm @@ -5,6 +5,35 @@ "bs" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/abandoned/engine) +"bD" = ( +/obj/machinery/computer/shuttle/white_ship/bridge{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/abandoned/bridge) +"bV" = ( +/obj/machinery/door/airlock/command{ + name = "Bridge" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 8 + }, +/obj/effect/spawner/random/structure/barricade{ + spawn_loot_chance = 20 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/abandoned/bridge) "bY" = ( /obj/structure/cable, /obj/effect/decal/cleanable/blood/gibs/core, @@ -35,24 +64,6 @@ }, /turf/open/floor/mineral/titanium/tiled/yellow, /area/shuttle/abandoned) -"cw" = ( -/obj/machinery/door/airlock/command{ - name = "Bridge" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 8 - }, -/obj/effect/spawner/random/structure/barricade{ - spawn_loot_chance = 20 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/abandoned/bridge) "cV" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/abandoned/bridge) @@ -76,16 +87,15 @@ }, /turf/open/floor/mineral/titanium/white, /area/shuttle/abandoned/crew) -"fe" = ( -/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship{ - dir = 4; - view_range = 14; - x_offset = -3; - y_offset = -3 - }, +"eo" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/monitor{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/light_switch/directional/north, /obj/effect/turf_decal/tile/dark_blue/anticorner{ - dir = 8 + dir = 1 }, /turf/open/floor/mineral/titanium, /area/shuttle/abandoned/bridge) @@ -187,17 +197,6 @@ /obj/structure/cable, /turf/open/floor/iron/large, /area/shuttle/abandoned/crew) -"kE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/light/broken/directional/east, -/obj/structure/table, -/obj/effect/spawner/random/entertainment/money_medium, -/obj/effect/spawner/random/entertainment/cigar, -/obj/effect/turf_decal/tile/dark_blue/half, -/turf/open/floor/mineral/titanium, -/area/shuttle/abandoned/bridge) "lP" = ( /obj/structure/cable, /obj/effect/decal/cleanable/blood/gibs/up, @@ -232,6 +231,26 @@ }, /turf/open/floor/mineral/titanium/white, /area/shuttle/abandoned/crew) +"mX" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/structure/table, +/obj/machinery/button/door{ + id = "whiteship_bridgewindows"; + name = "Bridge Window Blastdoor Controls"; + pixel_y = -1 + }, +/obj/machinery/button/door{ + id = "whiteship_windows"; + name = "Exterior Window Blastdoor Control"; + pixel_y = 8 + }, +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/abandoned/bridge) "ne" = ( /obj/effect/decal/cleanable/crayon{ icon_state = "rune4"; @@ -255,27 +274,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/large, /area/shuttle/abandoned) -"nG" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/light/directional/east, -/obj/structure/table, -/obj/machinery/button/door{ - id = "whiteship_bridgewindows"; - name = "Bridge Window Blastdoor Controls"; - pixel_y = -1 - }, -/obj/machinery/button/door{ - id = "whiteship_windows"; - name = "Exterior Window Blastdoor Control"; - pixel_y = 8 - }, -/obj/effect/turf_decal/tile/dark_blue/half{ - dir = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/abandoned/bridge) "nQ" = ( /obj/machinery/power/shuttle_engine/heater{ dir = 4 @@ -283,6 +281,19 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/plating, /area/shuttle/abandoned/engine) +"ot" = ( +/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship{ + dir = 4; + view_range = 14; + x_offset = -3; + y_offset = -3 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/dark_blue/anticorner{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/abandoned/bridge) "oU" = ( /obj/structure/table/wood, /obj/machinery/chem_dispenser/drinks{ @@ -295,6 +306,23 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/large, /area/shuttle/abandoned/bar) +"oY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/crayon{ + icon_state = "rune4"; + paint_colour = "#DC143C" + }, +/obj/effect/turf_decal/tile/dark_blue/half, +/turf/open/floor/mineral/titanium, +/area/shuttle/abandoned/bridge) +"pI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/turf_decal/tile/dark_blue/half{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/abandoned/bridge) "qh" = ( /obj/structure/cable, /obj/effect/decal/cleanable/blood/footprints{ @@ -327,15 +355,18 @@ "rf" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/abandoned/crew) -"rV" = ( -/obj/machinery/computer/shuttle/white_ship/bridge{ - dir = 4 +"sd" = ( +/obj/machinery/light/floor, +/obj/structure/chair/comfy/shuttle{ + dir = 8 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/turf_decal/tile/dark_blue/half{ - dir = 8 +/obj/effect/decal/cleanable/ash, +/obj/effect/mob_spawn/corpse/human/damaged, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 }, +/obj/structure/cable, /turf/open/floor/mineral/titanium, /area/shuttle/abandoned/bridge) "sm" = ( @@ -355,6 +386,18 @@ }, /turf/open/floor/iron/large, /area/shuttle/abandoned) +"uk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 8 + }, +/obj/effect/decal/cleanable/ash, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/abandoned/bridge) "us" = ( /obj/structure/cable, /obj/effect/decal/cleanable/blood/splatter, @@ -411,18 +454,6 @@ }, /turf/open/floor/plating, /area/shuttle/abandoned/engine) -"yY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 8 - }, -/obj/effect/decal/cleanable/ash, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/abandoned/bridge) "zj" = ( /obj/structure/cable, /obj/structure/sign/warning/no_smoking{ @@ -451,14 +482,6 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/abandoned/bridge) -"Br" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/turf_decal/tile/dark_blue/half{ - dir = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/abandoned/bridge) "Bw" = ( /obj/machinery/light/small/directional/west, /obj/structure/tank_dispenser/oxygen, @@ -529,6 +552,16 @@ }, /turf/open/floor/mineral/titanium/white, /area/shuttle/abandoned/crew) +"FO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/south, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/structure/table, +/obj/effect/spawner/random/entertainment/money_medium, +/obj/effect/spawner/random/entertainment/cigar, +/obj/effect/turf_decal/tile/dark_blue/half, +/turf/open/floor/mineral/titanium, +/area/shuttle/abandoned/bridge) "Gl" = ( /obj/machinery/power/smes/engineering, /obj/structure/cable, @@ -639,28 +672,6 @@ }, /turf/open/floor/mineral/titanium/purple, /area/shuttle/abandoned/bar) -"Lt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/crayon{ - icon_state = "rune4"; - paint_colour = "#DC143C" - }, -/obj/effect/turf_decal/tile/dark_blue/half, -/turf/open/floor/mineral/titanium, -/area/shuttle/abandoned/bridge) -"Mt" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/ash, -/obj/effect/mob_spawn/corpse/human/damaged, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/mineral/titanium, -/area/shuttle/abandoned/bridge) "MD" = ( /obj/item/mop, /obj/item/reagent_containers/cup/bucket, @@ -693,7 +704,7 @@ /turf/open/floor/mineral/titanium/white, /area/shuttle/abandoned/medbay) "Ow" = ( -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /turf/open/floor/mineral/titanium/white, /area/shuttle/abandoned/medbay) "Ph" = ( @@ -759,18 +770,6 @@ /obj/machinery/light/small/broken/directional/south, /turf/open/floor/mineral/titanium/purple, /area/shuttle/abandoned/bar) -"RU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/monitor{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/light_switch/directional/north, -/obj/effect/turf_decal/tile/dark_blue/anticorner{ - dir = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/abandoned/bridge) "Sb" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/mineral/titanium/white, @@ -1013,9 +1012,9 @@ SW KS NG cV -RU -rV -fe +eo +bD +ot cV jC qh @@ -1030,9 +1029,9 @@ CX SE oU WX -Br -Mt -Lt +pI +sd +oY Bl Sb qh @@ -1047,9 +1046,9 @@ Wb qO RG cV -nG -yY -kE +mX +uk +FO cV VX YA @@ -1065,7 +1064,7 @@ fF VI cV cV -cw +bV cV cV rf diff --git a/_maps/shuttles/whiteship_personalshuttle.dmm b/_maps/shuttles/whiteship_personalshuttle.dmm index 5ba11020ba6d2..e3f432f350b57 100644 --- a/_maps/shuttles/whiteship_personalshuttle.dmm +++ b/_maps/shuttles/whiteship_personalshuttle.dmm @@ -1,32 +1,8 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/mineral/titanium, -/area/shuttle/abandoned/engine) -"am" = ( -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/footprints{ - dir = 1 - }, +"af" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/mineral/titanium, /area/shuttle/abandoned/engine) -"aq" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/engineering/material, -/obj/structure/closet/crate, -/obj/effect/spawner/random/engineering/tool, -/turf/open/floor/plating, -/area/shuttle/abandoned/engine) "as" = ( /obj/machinery/door/airlock/external/ruin{ id_tag = "ws_westbolts" @@ -41,16 +17,6 @@ }, /turf/open/floor/plating, /area/shuttle/abandoned/bridge) -"aY" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mob_spawn/corpse/human/assistant, -/obj/effect/spawner/random/engineering/flashlight, -/turf/open/floor/plating, -/area/shuttle/abandoned/engine) "aZ" = ( /turf/closed/wall/mineral/plastitanium, /area/shuttle/abandoned/engine) @@ -60,23 +26,14 @@ }, /turf/open/floor/plating, /area/shuttle/abandoned/bridge) -"bq" = ( -/obj/machinery/atmospherics/pipe/smart/simple/supply/visible{ - dir = 8 +"bj" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/splatter, -/mob/living/simple_animal/hostile/zombie{ - desc = "This undead fiend looks to be badly decomposed."; - environment_smash = 0; - health = 60; - melee_damage_lower = 11; - melee_damage_upper = 11; - name = "Rotting Carcass"; - outfit = /datum/outfit/corpse_assistant - }, -/turf/open/floor/plating, +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/mineral/titanium, /area/shuttle/abandoned/engine) "by" = ( /obj/machinery/light/small/directional/west, @@ -93,14 +50,6 @@ /obj/item/stack/sheet/mineral/plasma/five, /turf/open/floor/plating, /area/shuttle/abandoned/engine) -"bG" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/table, -/obj/effect/spawner/random/food_or_drink/dinner, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/entertainment/plushie, -/turf/open/floor/mineral/titanium, -/area/shuttle/abandoned/engine) "bM" = ( /obj/machinery/door/airlock/external/ruin{ id_tag = "ws_eastbolts" @@ -112,6 +61,19 @@ /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/plating, /area/shuttle/abandoned/bridge) +"bR" = ( +/obj/structure/table, +/obj/machinery/button/door{ + id = "whiteship_windows"; + name = "Windows Blast Door Control" + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/paper/crumpled{ + pixel_x = -10; + default_raw_text = "So... we were on our way to an outpost, but while we were going there, we saw a goddamn abandoned spaceship. So, naturally we went over to loot it, and we are docking now. It cant be that bad right?" + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/abandoned/bridge) "ce" = ( /obj/machinery/atmospherics/components/tank/air{ dir = 1 @@ -124,42 +86,6 @@ "cl" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/shuttle/abandoned/engine) -"cx" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 8 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/abandoned/engine) -"cD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/footprints{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/abandoned/bridge) -"cG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 8 - }, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/abandoned/bridge) -"cH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 10 - }, -/obj/structure/chair/comfy/shuttle, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/abandoned/bridge) "cL" = ( /obj/machinery/power/shuttle_engine/propulsion/right{ dir = 1 @@ -180,35 +106,11 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plating, /area/shuttle/abandoned/engine) -"da" = ( -/obj/machinery/light/small/directional/south, -/obj/item/bedsheet/dorms{ - dir = 4 - }, -/obj/structure/bed/pod{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/mineral/titanium, -/area/shuttle/abandoned/engine) "dc" = ( /obj/machinery/power/smes/engineering, /obj/structure/cable, /turf/open/floor/plating, /area/shuttle/abandoned/engine) -"de" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/supply/visible{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/mob_spawn/corpse/human/engineer{ - outfit = /datum/outfit/job/engineer - }, -/obj/effect/spawner/random/trash/mess, -/turf/open/floor/plating, -/area/shuttle/abandoned/engine) "df" = ( /obj/structure/reagent_dispensers/fueltank, /obj/item/weldingtool, @@ -226,22 +128,6 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/abandoned/engine) -"do" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ - dir = 8 - }, -/obj/machinery/button/door/directional/west{ - name = "Bolt Control"; - id = "ws_westbolts"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/effect/mob_spawn/corpse/human/damaged, -/obj/effect/decal/cleanable/blood/gibs, -/obj/effect/decal/cleanable/blood/tracks, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/abandoned/bridge) "dp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/mineral/plastitanium, @@ -258,22 +144,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/shuttle/abandoned/bridge) -"ds" = ( -/obj/machinery/light/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/tracks, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/abandoned/bridge) -"dt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/footprints{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/abandoned/bridge) "dx" = ( /obj/effect/spawner/structure/window/reinforced/shuttle, /obj/machinery/door/poddoor{ @@ -285,7 +155,7 @@ "dy" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/abandoned/bridge) -"dA" = ( +"eN" = ( /obj/machinery/atmospherics/pipe/smart/manifold/supply/hidden{ dir = 1 }, @@ -303,13 +173,6 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/abandoned/engine) -"fh" = ( -/obj/machinery/computer/shuttle/white_ship/bridge{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/abandoned/bridge) "gG" = ( /obj/machinery/door/airlock/shuttle{ name = "Left Engine Maintenance" @@ -325,14 +188,38 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/abandoned/engine) -"mj" = ( -/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship{ - dir = 1; - view_range = 14; - x_offset = -3; - y_offset = -3 +"jr" = ( +/obj/machinery/atmospherics/pipe/smart/simple/supply/visible{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/splatter, +/mob/living/simple_animal/hostile/zombie{ + desc = "This undead fiend looks to be badly decomposed."; + environment_smash = 0; + health = 60; + melee_damage_lower = 11; + melee_damage_upper = 11; + name = "Rotting Carcass"; + outfit = /datum/outfit/corpse_assistant }, +/turf/open/floor/plating, +/area/shuttle/abandoned/engine) +"nI" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ + dir = 8 + }, +/obj/machinery/button/door/directional/west{ + name = "Bolt Control"; + id = "ws_westbolts"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/effect/mob_spawn/corpse/human/damaged, +/obj/effect/decal/cleanable/blood/gibs, +/obj/effect/decal/cleanable/blood/tracks, /turf/open/floor/mineral/plastitanium, /area/shuttle/abandoned/bridge) "nM" = ( @@ -350,6 +237,17 @@ /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/plating, /area/shuttle/abandoned/bridge) +"oE" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/engineering/material, +/obj/structure/closet/crate, +/obj/effect/spawner/random/engineering/tool, +/turf/open/floor/plating, +/area/shuttle/abandoned/engine) "oI" = ( /obj/machinery/light/small/directional/north, /obj/machinery/suit_storage_unit/open, @@ -358,6 +256,33 @@ }, /turf/open/floor/plating, /area/shuttle/abandoned/bridge) +"pF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/splatter, +/obj/structure/chair/comfy/shuttle, +/mob/living/simple_animal/hostile/zombie{ + desc = "This undead fiend looks to be badly decomposed."; + environment_smash = 0; + health = 60; + melee_damage_lower = 11; + melee_damage_upper = 11; + name = "Rotting Carcass"; + outfit = /datum/outfit/corpse_assistant + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/abandoned/bridge) +"pS" = ( +/obj/machinery/light/small/directional/south, +/obj/item/bedsheet/dorms{ + dir = 4 + }, +/obj/structure/bed/pod{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light_switch/directional/west, +/turf/open/floor/mineral/titanium, +/area/shuttle/abandoned/engine) "qQ" = ( /obj/machinery/door/airlock/external/ruin{ id_tag = "wsnorthbolts" @@ -377,6 +302,14 @@ }, /turf/open/floor/plating, /area/shuttle/abandoned/engine) +"rv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 10 + }, +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/abandoned/bridge) "sw" = ( /obj/effect/spawner/structure/window/reinforced/shuttle, /obj/machinery/door/poddoor{ @@ -400,14 +333,6 @@ }, /turf/open/floor/plating, /area/shuttle/abandoned/bridge) -"ue" = ( -/obj/machinery/light/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/medical/medkit, -/obj/structure/table, -/obj/effect/spawner/random/medical/minor_healing, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/abandoned/bridge) "wp" = ( /obj/machinery/door/airlock/external/ruin{ id_tag = "wsnorthbolts" @@ -421,6 +346,46 @@ /obj/effect/mapping_helpers/airlock/cutaiwire, /turf/open/floor/plating, /area/shuttle/abandoned/engine) +"BA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/abandoned/bridge) +"BI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/abandoned/bridge) +"BN" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/dinner, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/entertainment/plushie, +/turf/open/floor/mineral/titanium, +/area/shuttle/abandoned/engine) +"DT" = ( +/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship{ + dir = 1; + view_range = 14; + x_offset = -3; + y_offset = -3 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/abandoned/bridge) +"Fo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/abandoned/bridge) "Fp" = ( /obj/machinery/door/airlock/shuttle{ name = "Right Engine Maintenance" @@ -442,16 +407,25 @@ }, /turf/open/floor/plating, /area/shuttle/abandoned/bridge) -"Io" = ( -/obj/structure/table, -/obj/machinery/button/door{ - id = "whiteship_windows"; - name = "Windows Blast Door Control" +"GO" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ + dir = 4 }, +/obj/structure/cable, /obj/effect/decal/cleanable/dirt, -/obj/item/paper/crumpled{ - pixel_x = -10; - default_raw_text = "So... we were on our way to an outpost, but while we were going there, we saw a goddamn abandoned spaceship. So, naturally we went over to loot it, and we are docking now. It cant be that bad right?" +/obj/effect/decal/cleanable/blood/tracks{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/abandoned/engine) +"Ia" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 }, /turf/open/floor/mineral/plastitanium, /area/shuttle/abandoned/bridge) @@ -473,22 +447,54 @@ }, /turf/open/floor/mineral/plastitanium, /area/shuttle/abandoned/bridge) -"Ki" = ( +"KM" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/corpse/human/assistant, +/obj/effect/spawner/random/engineering/flashlight, +/turf/open/floor/plating, +/area/shuttle/abandoned/engine) +"Mz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/supply/hidden{ + dir = 4 + }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, +/turf/open/floor/mineral/titanium, +/area/shuttle/abandoned/engine) +"Nh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/supply/visible{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/mob_spawn/corpse/human/engineer{ + outfit = /datum/outfit/job/engineer + }, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating, +/area/shuttle/abandoned/engine) +"OP" = ( +/obj/machinery/light/broken/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/medical/medkit, +/obj/structure/table, +/obj/effect/spawner/random/medical/minor_healing, /turf/open/floor/mineral/plastitanium, /area/shuttle/abandoned/bridge) -"NT" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 +"Qh" = ( +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, /turf/open/floor/mineral/titanium, /area/shuttle/abandoned/engine) -"NX" = ( +"QZ" = ( /obj/structure/cable, /obj/machinery/button/door/directional/north{ normaldoorcontrol = 1; @@ -506,29 +512,23 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/abandoned/engine) -"Rg" = ( +"Sk" = ( +/obj/machinery/computer/shuttle/white_ship/bridge{ + dir = 1 + }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/mineral/titanium, -/area/shuttle/abandoned/engine) +/turf/open/floor/mineral/plastitanium, +/area/shuttle/abandoned/bridge) "Tj" = ( /obj/machinery/power/shuttle_engine/propulsion/left{ dir = 1 }, /turf/open/floor/plating, /area/shuttle/abandoned/engine) -"UC" = ( +"WL" = ( +/obj/machinery/light/cold/no_nightlight/directional/west, /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/splatter, -/obj/structure/chair/comfy/shuttle, -/mob/living/simple_animal/hostile/zombie{ - desc = "This undead fiend looks to be badly decomposed."; - environment_smash = 0; - health = 60; - melee_damage_lower = 11; - melee_damage_upper = 11; - name = "Rotting Carcass"; - outfit = /datum/outfit/corpse_assistant - }, +/obj/effect/decal/cleanable/blood/tracks, /turf/open/floor/mineral/plastitanium, /area/shuttle/abandoned/bridge) @@ -551,7 +551,7 @@ cM cM Tj cV -aY +KM bE ci dy @@ -566,7 +566,7 @@ cM cM Tj cV -bq +jr dc ci oI @@ -596,45 +596,45 @@ dy cl by cl -NX -NT -da +QZ +bj +pS ci JD -do -ds -cH -mj +nI +WL +rv +DT dx "} (6,1,1) = {" qQ cY wp -dA -aa -am +eN +Mz +Qh dj -cD +BI dp -dt -cG -Io +Ia +Fo +bR dx "} (7,1,1) = {" cl nM cl -cx -Rg -bG +GO +af +BN ci -Ki +BA dq -ue -UC -fh +OP +pF +Sk dx "} (8,1,1) = {" @@ -656,7 +656,7 @@ dy cM cL cV -de +Nh ce ci Jv @@ -671,7 +671,7 @@ cM cM cL cV -aq +oE df ci dy diff --git a/_maps/shuttles/whiteship_pubby.dmm b/_maps/shuttles/whiteship_pubby.dmm index 422d2335eef32..50dd7802f2f6d 100644 --- a/_maps/shuttles/whiteship_pubby.dmm +++ b/_maps/shuttles/whiteship_pubby.dmm @@ -877,7 +877,7 @@ /area/shuttle/abandoned) "Ky" = ( /obj/effect/turf_decal/bot_white, -/obj/machinery/modular_computer/console/preset/research{ +/obj/machinery/modular_computer/preset/research{ dir = 1 }, /obj/effect/turf_decal/siding/purple/end, diff --git a/_maps/shuttles/whiteship_tram.dmm b/_maps/shuttles/whiteship_tram.dmm index 1420806e92675..54d88f01d7d66 100644 --- a/_maps/shuttles/whiteship_tram.dmm +++ b/_maps/shuttles/whiteship_tram.dmm @@ -1,9 +1,4 @@ //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 @@ -16,11 +11,6 @@ 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, /turf/open/floor/plating, @@ -53,28 +43,6 @@ /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/utility/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/electric_shock, /turf/closed/wall/mineral/plastitanium/nodiagonal, @@ -165,34 +133,6 @@ /obj/structure/sign/directions/supply, /turf/closed/wall/mineral/titanium/survival/nodiagonal, /area/shuttle/abandoned/cargo) -"ax" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/north{ - 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/spawner/directional/north{ - 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/spawner/directional/north{ - 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, @@ -201,16 +141,6 @@ /obj/structure/sign/warning/no_smoking/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, @@ -331,14 +261,6 @@ }, /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 @@ -354,14 +276,6 @@ /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, @@ -397,14 +311,6 @@ /obj/effect/spawner/random/trash/food_packaging, /turf/open/floor/pod, /area/shuttle/abandoned/cargo) -"bo" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/east{ - 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, @@ -471,26 +377,6 @@ }, /turf/closed/wall/mineral/titanium/survival/nodiagonal, /area/shuttle/abandoned/cargo) -"bA" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ - 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/spawner/directional/south{ - 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 @@ -547,18 +433,6 @@ }, /turf/open/floor/plastic, /area/shuttle/abandoned/crew) -"bJ" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/closet/syndicate, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/gloves/fingerless, -/obj/item/clothing/under/syndicate/coldres, -/obj/item/clothing/neck/large_scarf/blue, -/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{ @@ -613,17 +487,6 @@ /obj/machinery/light/cold/directional/south, /turf/open/floor/iron/smooth_large, /area/shuttle/abandoned/engine) -"bS" = ( -/obj/machinery/power/shuttle_engine/heater{ - dir = 1 - }, -/obj/structure/window/reinforced/plasma/spawner/directional/south, -/obj/structure/window/reinforced/plasma/spawner/directional/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, @@ -635,13 +498,6 @@ }, /turf/open/floor/iron/smooth_large, /area/shuttle/abandoned/engine) -"bV" = ( -/obj/machinery/stasis/survival_pod, -/obj/effect/turf_decal/stripes/white/line{ - dir = 9 - }, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/crew) "ca" = ( /obj/structure/cable, /obj/structure/table, @@ -661,13 +517,6 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron/smooth_large, /area/shuttle/abandoned/engine) -"ce" = ( -/obj/machinery/power/shuttle_engine/heater{ - dir = 1 - }, -/obj/structure/window/reinforced/plasma/spawner/directional/south, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/engine) "cg" = ( /obj/structure/sign/warning/fire, /turf/closed/wall/mineral/plastitanium/nodiagonal, @@ -707,14 +556,6 @@ /obj/effect/gibspawner, /turf/open/floor/mineral/titanium/airless, /area/shuttle/abandoned/cargo) -"cr" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/west{ - 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/titanium, /turf/open/floor/mineral/titanium/airless, @@ -755,17 +596,6 @@ /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) @@ -792,17 +622,6 @@ /obj/structure/holosign/barrier, /turf/open/floor/plating/airless, /area/shuttle/abandoned/cargo) -"cL" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ - 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) @@ -859,21 +678,6 @@ "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, -/obj/structure/cable, -/turf/open/floor/iron/dark/smooth_half{ - dir = 1 - }, -/area/shuttle/abandoned/bridge) "de" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/abandoned/crew) @@ -925,36 +729,6 @@ dir = 1 }, /area/shuttle/abandoned/bridge) -"di" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/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/no_smoking/circle, /turf/closed/wall/mineral/titanium/nodiagonal, @@ -1069,17 +843,12 @@ /obj/effect/decal/cleanable/blood/splatter, /turf/open/floor/mineral/titanium/white/airless, /area/shuttle/abandoned/cargo) -"fh" = ( -/obj/machinery/power/shuttle_engine/heater{ - dir = 1 - }, -/obj/structure/window/reinforced/plasma/spawner/directional/south, -/obj/structure/window/reinforced/plasma/spawner/directional/east, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/engine) +"ez" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south, +/obj/effect/turf_decal/bot_red, +/obj/structure/mining_shuttle_beacon, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/abandoned/cargo) "gq" = ( /obj/machinery/door/window/left/directional/east, /obj/effect/turf_decal/arrows/red{ @@ -1088,6 +857,17 @@ /obj/structure/holosign/barrier/engineering, /turf/open/floor/mineral/titanium/white/airless, /area/shuttle/abandoned/cargo) +"hp" = ( +/obj/machinery/power/shuttle_engine/heater{ + dir = 1 + }, +/obj/structure/window/reinforced/plasma/spawner/directional/south, +/obj/structure/window/reinforced/plasma/spawner/directional/west, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/shuttle/abandoned/engine) "hr" = ( /obj/effect/decal/cleanable/blood, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -1098,11 +878,22 @@ dir = 1 }, /area/shuttle/abandoned/crew) +"iz" = ( +/obj/structure/chair/comfy/shuttle, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/abandoned/bridge) "iH" = ( /obj/item/shard/titanium, /obj/effect/decal/cleanable/blood/gibs, /turf/open/floor/plating/airless, /area/shuttle/abandoned/cargo) +"jS" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/east, +/obj/effect/turf_decal/bot_red, +/obj/effect/spawner/random/engineering/atmospherics_portable, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/abandoned/cargo) "lA" = ( /obj/effect/decal/cleanable/blood/gibs, /obj/effect/mob_spawn/corpse/human/nanotrasensoldier, @@ -1140,6 +931,29 @@ /obj/structure/sign/nanotrasen, /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/abandoned/crew) +"qd" = ( +/obj/machinery/power/shuttle_engine/heater{ + dir = 1 + }, +/obj/structure/window/reinforced/plasma/spawner/directional/south, +/obj/structure/window/reinforced/plasma/spawner/directional/east, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/shuttle/abandoned/engine) +"qH" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/closet/syndicate, +/obj/item/clothing/shoes/jackboots, +/obj/item/clothing/gloves/fingerless, +/obj/item/clothing/under/syndicate/coldres, +/obj/item/clothing/neck/large_scarf/blue, +/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) "rP" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/phone{ @@ -1159,15 +973,6 @@ }, /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/cup/maunamug{ @@ -1198,6 +1003,13 @@ }, /turf/open/floor/iron/smooth_large, /area/shuttle/abandoned/engine) +"sR" = ( +/obj/machinery/door/window/survival_pod{ + dir = 8 + }, +/obj/effect/turf_decal/delivery/red, +/turf/open/floor/pod, +/area/shuttle/abandoned/cargo) "ua" = ( /obj/effect/spawner/random/trash/botanical_waste, /turf/open/floor/pod, @@ -1224,11 +1036,22 @@ /obj/effect/decal/cleanable/blood/gibs/torso, /turf/open/floor/mineral/titanium/airless, /area/shuttle/abandoned/cargo) +"vg" = ( +/turf/open/space/basic, +/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/crew) +"xN" = ( +/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/cargo) "yd" = ( /obj/effect/spawner/random/vending/colavend, /obj/effect/turf_decal/bot_white, @@ -1242,6 +1065,14 @@ /obj/machinery/light/cold/directional/east, /turf/open/floor/iron/dark/textured_large, /area/shuttle/abandoned/crew) +"zK" = ( +/obj/machinery/stasis/survival_pod, +/obj/effect/turf_decal/stripes/white/line{ + dir = 9 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/abandoned/crew) "zN" = ( /obj/machinery/stasis/survival_pod, /obj/effect/turf_decal/stripes/white/line{ @@ -1255,6 +1086,31 @@ /obj/effect/mob_spawn/corpse/human/assistant, /turf/open/floor/mineral/titanium/blue/airless, /area/shuttle/abandoned/cargo) +"Ba" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/west, +/obj/effect/turf_decal/bot_red, +/obj/effect/spawner/random/engineering/tank, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/abandoned/cargo) +"Bf" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south, +/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) +"Cn" = ( +/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, +/turf/open/floor/iron/smooth_large, +/area/shuttle/abandoned/engine) "CS" = ( /obj/item/reagent_containers/pill/happy, /obj/item/reagent_containers/pill/aranesp{ @@ -1268,6 +1124,15 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/smooth_half, /area/shuttle/abandoned/crew) +"Dw" = ( +/obj/structure/cable, +/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) "DS" = ( /obj/machinery/holopad/secure, /obj/effect/turf_decal/stripes/white/line{ @@ -1275,11 +1140,42 @@ }, /turf/open/floor/iron/dark/textured_large, /area/shuttle/abandoned/bridge) +"DW" = ( +/obj/effect/turf_decal/bot_white, +/obj/machinery/suit_storage_unit/mining/eva, +/obj/machinery/light/cold/no_nightlight/directional/north, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/abandoned/engine) +"Ez" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south, +/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) +"Fo" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/north, +/obj/effect/turf_decal/bot_red, +/obj/effect/spawner/random/structure/crate_abandoned, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/abandoned/cargo) "Fp" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/lattice, /turf/template_noop, /area/shuttle/abandoned/cargo) +"Ft" = ( +/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/corner{ + dir = 1 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/abandoned/bridge) "FQ" = ( /obj/item/shard/titanium, /obj/structure/grille/broken, @@ -1336,17 +1232,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/crew) -"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{ @@ -1373,6 +1258,17 @@ /obj/item/stack/rods, /turf/open/floor/mineral/titanium/airless, /area/shuttle/abandoned/cargo) +"NU" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 4 + }, +/obj/item/flashlight, +/obj/item/clothing/head/utility/welding, +/obj/effect/turf_decal/bot_white, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/smooth_large, +/area/shuttle/abandoned/engine) "OL" = ( /obj/machinery/computer/shuttle/white_ship/bridge{ dir = 8 @@ -1382,6 +1278,13 @@ }, /turf/open/floor/iron/dark/textured_large, /area/shuttle/abandoned/bridge) +"PI" = ( +/obj/machinery/door/window/survival_pod{ + dir = 4 + }, +/obj/effect/turf_decal/delivery/red, +/turf/open/floor/pod, +/area/shuttle/abandoned/cargo) "PU" = ( /obj/effect/decal/cleanable/blood/gibs, /turf/open/floor/plating/airless, @@ -1421,6 +1324,30 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth_half, /area/shuttle/abandoned/crew) +"Rs" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/closet/emcloset/anchored, +/obj/machinery/light/broken/directional/north, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/abandoned/engine) +"RK" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/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) "Tj" = ( /obj/effect/decal/cleanable/blood, /obj/structure/holosign/barrier, @@ -1437,7 +1364,34 @@ }, /turf/open/floor/iron/dark/textured_large, /area/shuttle/abandoned/bridge) -"Wm" = ( +"Vi" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/north, +/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) +"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) +"Xf" = ( +/obj/machinery/power/shuttle_engine/heater{ + dir = 1 + }, +/obj/structure/window/reinforced/plasma/spawner/directional/south, +/turf/open/floor/plating/airless, +/area/shuttle/abandoned/engine) +"Yi" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/storage/box/donkpockets/donkpocketberry{ pixel_x = -4; @@ -1455,27 +1409,34 @@ 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/crew) +"YO" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/north, +/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) +"YX" = ( +/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, +/obj/machinery/light/floor, +/turf/open/floor/catwalk_floor, +/area/shuttle/abandoned/bridge) "ZA" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -1483,6 +1444,21 @@ }, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/engine) +"ZE" = ( +/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/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/cable, +/obj/machinery/light/broken/directional/north, +/turf/open/floor/iron/dark/smooth_half{ + dir = 1 + }, +/area/shuttle/abandoned/bridge) (1,1,1) = {" cM @@ -1495,7 +1471,7 @@ ci ci cS au -cI +vg aP ba cI @@ -1517,7 +1493,7 @@ mj cM cM aM -ce +Xf af aV bd @@ -1535,9 +1511,9 @@ Tj cO dy bE -bJ +qH nV -Wm +Yi DS rP dx @@ -1546,7 +1522,7 @@ dx cM cM aM -ce +Xf ag bx uv @@ -1563,7 +1539,7 @@ cC FQ cN dy -dc +ZE dh Ic Io @@ -1574,7 +1550,7 @@ dx (4,1,1) = {" cM aX -bS +hp cl ah bx @@ -1593,11 +1569,11 @@ cJ cO dy bF -di +RK dn yd OL -sw +Ft dx "} (5,1,1) = {" @@ -1631,10 +1607,10 @@ da "} (6,1,1) = {" cl -aa +Rs ad ca -ai +NU bx ad cY @@ -1651,7 +1627,7 @@ cY cY cY dx -dj +iz dp dt dx @@ -1669,19 +1645,19 @@ ar cx cx cx -aE +xN cx cx cx cx cx -cE +Dw cx cx cx bG bL -Ki +YX ue UC cM @@ -1689,10 +1665,10 @@ cM "} (8,1,1) = {" cl -ac +DW ad ae -aj +Cn ap ad Fp @@ -1709,7 +1685,7 @@ Fp Fp Fp dx -dk +iz LM du dx @@ -1729,9 +1705,9 @@ cS aw aG aT -bc -cr -bc +sR +Ba +sR aY aG bz @@ -1748,14 +1724,14 @@ de (10,1,1) = {" cM bj -fh +qd cl am ap cl cl cO -ax +Fo aH aW cA @@ -1763,7 +1739,7 @@ bk aS cA bv -cL +Ez cV aq df @@ -1771,20 +1747,20 @@ bO Rg dw zN -bV +zK aq "} (11,1,1) = {" cM cM aM -ce +Xf an bx sH cl cU -az +YO aI ua bf @@ -1792,7 +1768,7 @@ bl bq aS cG -bA +Bf cU aq dg @@ -1807,13 +1783,13 @@ aq cM cM aM -ce +Xf ao bs bP ci cO -aA +Vi aK cA aS @@ -1821,7 +1797,7 @@ bn cA cA cH -bB +ez cV aq bI @@ -1845,9 +1821,9 @@ cP aw aG aY -bg -bo -bg +PI +jS +PI aT aG bz diff --git a/_maps/templates/admin_thunderdome.dmm b/_maps/templates/admin_thunderdome.dmm index 467c71dc82564..1c81c0cee287c 100644 --- a/_maps/templates/admin_thunderdome.dmm +++ b/_maps/templates/admin_thunderdome.dmm @@ -7,12 +7,14 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "ac" = ( /obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "ad" = ( @@ -21,6 +23,7 @@ name = "Heavy Supply" }, /obj/effect/turf_decal/loading_area, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "ae" = ( @@ -28,6 +31,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "af" = ( @@ -43,6 +47,7 @@ }, /obj/effect/landmark/thunderdome/two, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "ah" = ( @@ -55,6 +60,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "ai" = ( @@ -62,24 +68,18 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, -/turf/open/floor/iron, -/area/template_noop) -"aj" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "ak" = ( /obj/effect/turf_decal/loading_area{ dir = 4 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "al" = ( +/obj/effect/light_emitter/thunderdome, /turf/closed/indestructible/fakeglass, /area/template_noop) "am" = ( @@ -90,17 +90,20 @@ /obj/effect/turf_decal/loading_area{ dir = 4 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "an" = ( /obj/effect/turf_decal/loading_area{ dir = 8 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "ao" = ( /obj/effect/landmark/thunderdome/two, /obj/effect/turf_decal/stripes/line, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "ap" = ( @@ -108,11 +111,13 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "aq" = ( /obj/effect/landmark/thunderdome/one, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "ar" = ( @@ -123,19 +128,23 @@ /obj/effect/turf_decal/loading_area{ dir = 8 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "as" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "at" = ( /obj/effect/turf_decal/tile/green, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "au" = ( /obj/effect/landmark/thunderdome/one, /obj/effect/turf_decal/stripes/line, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "av" = ( @@ -151,6 +160,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "ax" = ( @@ -158,13 +168,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, -/turf/open/floor/iron, -/area/template_noop) -"ay" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "az" = ( @@ -178,6 +182,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "aA" = ( @@ -185,6 +190,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "aB" = ( @@ -195,6 +201,7 @@ /obj/effect/turf_decal/loading_area{ dir = 8 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "aC" = ( @@ -202,6 +209,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "aD" = ( @@ -215,6 +223,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "aE" = ( @@ -222,26 +231,20 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "aF" = ( /obj/effect/landmark/thunderdome/two, /obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/template_noop) -"aG" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "aH" = ( /obj/effect/turf_decal/tile/green{ dir = 4 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "aI" = ( @@ -249,6 +252,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "aJ" = ( @@ -257,6 +261,7 @@ }, /obj/effect/landmark/thunderdome/one, /obj/effect/turf_decal/delivery, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "aK" = ( @@ -264,6 +269,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "aL" = ( @@ -271,13 +277,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, -/turf/open/floor/iron, -/area/template_noop) -"aM" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "aN" = ( @@ -286,15 +286,18 @@ }, /obj/effect/landmark/thunderdome/two, /obj/effect/turf_decal/delivery, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "aO" = ( /obj/machinery/igniter/on, /obj/effect/turf_decal/delivery, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "aP" = ( /obj/effect/turf_decal/delivery, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "aQ" = ( @@ -304,10 +307,12 @@ /turf/open/floor/circuit/green, /area/template_noop) "aR" = ( +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "aS" = ( /obj/effect/turf_decal/bot, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "aT" = ( @@ -315,6 +320,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "aU" = ( @@ -327,6 +333,7 @@ }, /obj/effect/landmark/thunderdome/one, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "aV" = ( @@ -334,6 +341,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "aW" = ( @@ -341,6 +349,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "aX" = ( @@ -358,36 +367,42 @@ /obj/effect/turf_decal/loading_area{ dir = 4 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "aZ" = ( /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "ib" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "nu" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "SV" = ( /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 4 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) "XQ" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 }, +/obj/effect/light_emitter/thunderdome, /turf/open/floor/iron, /area/template_noop) diff --git a/_maps/templates/battlecruiser_starfury.dmm b/_maps/templates/battlecruiser_starfury.dmm index 35beb720b4258..1e4905ac26ebf 100644 --- a/_maps/templates/battlecruiser_starfury.dmm +++ b/_maps/templates/battlecruiser_starfury.dmm @@ -125,13 +125,6 @@ }, /turf/open/floor/plating, /area/shuttle/sbc_starfury) -"at" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/dark, -/area/shuttle/sbc_starfury) "av" = ( /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /obj/effect/mapping_helpers/airlock/cutaiwire, @@ -157,6 +150,7 @@ /obj/effect/mapping_helpers/airlock/cutaiwire, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "ay" = ( @@ -324,6 +318,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/shuttle/sbc_starfury) +"bb" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark/side{ + dir = 6 + }, +/area/shuttle/sbc_starfury) "bc" = ( /obj/machinery/sleeper/syndie{ dir = 4; @@ -461,10 +461,6 @@ }, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) -"bI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/pod/dark, -/area/shuttle/sbc_starfury) "bL" = ( /obj/machinery/porta_turret/syndicate/energy{ dir = 6 @@ -524,6 +520,7 @@ /obj/machinery/door/firedoor/heavy, /obj/effect/mapping_helpers/airlock/cutaiwire, /obj/effect/turf_decal/tile/green/full, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/iron/dark/textured_large, /area/shuttle/sbc_starfury) "bZ" = ( @@ -620,18 +617,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/shuttle/sbc_starfury) -"cr" = ( -/obj/structure/cable, -/obj/structure/sign/warning/explosives/directional/west, -/obj/effect/turf_decal/siding/dark_red{ - dir = 6 - }, -/obj/structure/frame/computer{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/sbc_starfury) "cs" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/structure/cable, @@ -672,13 +657,12 @@ "cz" = ( /obj/machinery/newscaster/directional/south, /obj/structure/table/reinforced/plastitaniumglass, -/obj/machinery/turretid{ - ailock = 1; - desc = "A specially designed set of turret controls. Looks to be covered in protective casing to prevent AI interfacing."; - icon_state = "control_stun"; - name = "Ship Turret Control"; - pixel_y = 2; - req_access = list("syndicate") +/obj/item/toy/figure/syndie{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/item/toy/nuke{ + pixel_x = 3 }, /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) @@ -845,17 +829,6 @@ "df" = ( /turf/open/floor/iron, /area/shuttle/sbc_starfury) -"dg" = ( -/obj/structure/sign/warning/chem_diamond/directional/south, -/obj/machinery/sleeper/syndie{ - dir = 8; - icon_state = "sleeper_s-open" - }, -/obj/effect/turf_decal/siding/dark_green{ - dir = 1 - }, -/turf/open/floor/iron/smooth_large, -/area/shuttle/sbc_starfury) "dh" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/structure/sign/warning/cold_temp/directional/north, @@ -918,18 +891,6 @@ /obj/structure/sign/departments/medbay/alt/directional/north, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/sbc_starfury) -"ds" = ( -/obj/structure/table, -/obj/item/clothing/gloves/latex, -/obj/item/clothing/mask/surgical, -/obj/item/clothing/suit/apron/surgical, -/obj/machinery/airalarm/directional/north{ - req_access = list("syndicate") - }, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/siding/dark_green, -/turf/open/floor/iron, -/area/shuttle/sbc_starfury) "du" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -938,9 +899,8 @@ /area/shuttle/sbc_starfury) "dx" = ( /obj/structure/cable, -/obj/machinery/airalarm/directional/south{ - req_access = list("syndicate") - }, +/obj/machinery/airalarm/directional/south, +/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/plating, /area/shuttle/sbc_starfury) "dz" = ( @@ -1012,6 +972,7 @@ /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/access/all/syndicate/general, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "dL" = ( @@ -1067,7 +1028,8 @@ /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/glass_large, +/obj/machinery/door/airlock/multi_tile/public/glass, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/pod/light, /area/shuttle/sbc_starfury) "dV" = ( @@ -1118,15 +1080,6 @@ "ec" = ( /turf/open/floor/pod/dark, /area/shuttle/sbc_starfury) -"ee" = ( -/obj/machinery/iv_drip, -/obj/structure/window/reinforced/survival_pod/spawner/directional/west, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/siding/dark_green{ - dir = 9 - }, -/turf/open/floor/iron/smooth_large, -/area/shuttle/sbc_starfury) "ef" = ( /obj/machinery/iv_drip, /obj/structure/cable, @@ -1172,13 +1125,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/pod/dark, /area/shuttle/sbc_starfury) -"er" = ( -/obj/machinery/airalarm/directional/north{ - req_access = list("syndicate") - }, -/obj/machinery/light/directional/north, -/turf/open/floor/pod/dark, -/area/shuttle/sbc_starfury) "et" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1199,9 +1145,7 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) "ev" = ( -/obj/machinery/airalarm/directional/west{ - req_access = list("syndicate") - }, +/obj/machinery/airalarm/directional/west, /obj/machinery/light/directional/west, /obj/machinery/shieldgen{ active = 1; @@ -1215,6 +1159,7 @@ /obj/effect/turf_decal/stripes/red/end{ dir = 4 }, +/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/plating, /area/shuttle/sbc_starfury) "ex" = ( @@ -1281,14 +1226,6 @@ }, /turf/open/floor/iron/dark/textured_large, /area/shuttle/sbc_starfury) -"eG" = ( -/obj/structure/chair/stool/directional/west, -/obj/machinery/light/small/directional/north, -/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/shuttle/sbc_starfury) "eH" = ( /obj/machinery/cell_charger{ pixel_y = 4 @@ -1354,6 +1291,8 @@ /obj/effect/turf_decal/stripes/red/end{ dir = 8 }, +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/plating, /area/shuttle/sbc_starfury) "eN" = ( @@ -1413,16 +1352,6 @@ }, /turf/open/floor/plating, /area/shuttle/sbc_starfury) -"eX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/airalarm/directional/south{ - req_access = list("syndicate") - }, -/obj/machinery/light/directional/south, -/turf/open/floor/pod/dark, -/area/shuttle/sbc_starfury) "eY" = ( /obj/effect/decal/cleanable/oil, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1430,13 +1359,6 @@ /obj/structure/cable, /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/machinery/light/directional/south, -/turf/open/floor/pod/dark, -/area/shuttle/sbc_starfury) "fa" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -1455,17 +1377,6 @@ /obj/structure/cable, /turf/open/floor/pod/dark, /area/shuttle/sbc_starfury) -"fc" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 8 - }, -/obj/structure/table, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/sbc_starfury) "fd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/red, @@ -1540,46 +1451,6 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/sbc_starfury) -"fl" = ( -/obj/structure/table, -/obj/item/stack/sheet/iron{ - pixel_x = 1 - }, -/obj/item/stack/sheet/glass{ - amount = 50; - pixel_x = 2; - pixel_y = 4 - }, -/obj/item/stack/rods{ - amount = 50 - }, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 1 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/sbc_starfury) -"fm" = ( -/obj/structure/table, -/obj/item/stack/sheet/mineral/plastitanium{ - amount = 30; - pixel_x = 2; - pixel_y = 4 - }, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/item/stack/sheet/plastitaniumglass{ - amount = 30 - }, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 1 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/sbc_starfury) "fn" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -1674,10 +1545,9 @@ /area/shuttle/sbc_starfury) "fy" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/airalarm/directional/north{ - req_access = list("syndicate") - }, +/obj/machinery/airalarm/directional/north, /obj/machinery/light/small/directional/north, +/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/carpet/orange, /area/shuttle/sbc_starfury) "fz" = ( @@ -1720,14 +1590,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor/heavy, /obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/machinery/door/airlock/glass_large, +/obj/machinery/door/airlock/multi_tile/public/glass, /turf/open/floor/pod/light, /area/shuttle/sbc_starfury) "fF" = ( /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /obj/machinery/door/firedoor/heavy, /obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/machinery/door/airlock/glass_large, +/obj/machinery/door/airlock/multi_tile/public/glass, /turf/open/floor/pod/light, /area/shuttle/sbc_starfury) "fG" = ( @@ -1742,6 +1612,7 @@ /obj/effect/mapping_helpers/airlock/cutaiwire, /obj/effect/turf_decal/siding/dark, /obj/machinery/door/airlock/hatch, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/iron/showroomfloor, /area/shuttle/sbc_starfury) "fS" = ( @@ -1752,11 +1623,11 @@ }, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) -"fV" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"gc" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, +/obj/structure/mop_bucket, +/obj/item/mop, +/turf/open/floor/iron/dark/side, /area/shuttle/sbc_starfury) "gd" = ( /obj/structure/cable, @@ -1904,21 +1775,13 @@ /obj/effect/turf_decal/tile/bar/diagonal_centre, /turf/open/floor/iron/dark/diagonal, /area/shuttle/sbc_starfury) -"gT" = ( -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/machinery/door/airlock/hatch, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/shuttle/sbc_starfury) "gV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/cutaiwire, /obj/machinery/door/airlock/hatch, /obj/effect/turf_decal/siding/wood, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/wood, /area/shuttle/sbc_starfury) "gW" = ( @@ -1971,16 +1834,6 @@ }, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) -"ha" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark{ - initial_gas_mix = "n2=100;TEMP=80"; - temperature = 80 - }, -/area/shuttle/sbc_starfury) "hb" = ( /obj/structure/closet/secure_closet{ anchored = 1; @@ -2044,6 +1897,7 @@ dir = 8 }, /obj/machinery/door/airlock/hatch, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "hh" = ( @@ -2114,9 +1968,8 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/north{ - req_access = list("syndicate") - }, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/iron/dark/side{ dir = 9 }, @@ -2177,13 +2030,12 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/north{ - req_access = list("syndicate") - }, +/obj/machinery/airalarm/directional/north, /obj/structure/cable, /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 }, +/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "hv" = ( @@ -2220,20 +2072,6 @@ }, /turf/open/floor/iron, /area/shuttle/sbc_starfury) -"hz" = ( -/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/machinery/button/door/directional/north{ - id = "syndie_battlecruiser_mech"; - name = "Mech Storage Shutters"; - req_access = list("syndicate_leader") - }, -/obj/machinery/light/directional/north, -/turf/open/floor/pod/dark, -/area/shuttle/sbc_starfury) "hB" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -2250,28 +2088,28 @@ /obj/item/ammo_box/a40mm{ icon_state = "40mm-4" }, -/obj/item/ammo_box/magazine/m556{ +/obj/item/ammo_box/magazine/m223{ icon_state = "5.56m-30"; pixel_x = 2; pixel_y = 4 }, -/obj/item/ammo_box/magazine/m556{ +/obj/item/ammo_box/magazine/m223{ icon_state = "5.56m-30"; pixel_x = 2; pixel_y = 4 }, -/obj/item/ammo_box/magazine/m556{ +/obj/item/ammo_box/magazine/m223{ icon_state = "5.56m-30" }, -/obj/item/ammo_box/magazine/m556{ +/obj/item/ammo_box/magazine/m223{ icon_state = "5.56m-30" }, -/obj/item/ammo_box/magazine/m556{ +/obj/item/ammo_box/magazine/m223{ icon_state = "5.56m-30"; pixel_x = -2; pixel_y = -4 }, -/obj/item/ammo_box/magazine/m556{ +/obj/item/ammo_box/magazine/m223{ icon_state = "5.56m-30"; pixel_x = -2; pixel_y = -4 @@ -2293,6 +2131,7 @@ dir = 8 }, /obj/machinery/door/airlock/hatch, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "hG" = ( @@ -2308,18 +2147,6 @@ dir = 6 }, /area/shuttle/sbc_starfury) -"hI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/mop_bucket, -/obj/item/mop, -/turf/open/floor/iron/dark/side, -/area/shuttle/sbc_starfury) -"hJ" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark/side{ - dir = 6 - }, -/area/shuttle/sbc_starfury) "hL" = ( /obj/structure/cable/layer1, /turf/open/floor/mineral/plastitanium, @@ -2329,12 +2156,6 @@ dir = 6 }, /area/shuttle/sbc_starfury) -"hO" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/shuttle/sbc_starfury) "hP" = ( /obj/effect/turf_decal/stripes/red/line{ dir = 4 @@ -2499,16 +2320,6 @@ }, /turf/open/floor/wood, /area/shuttle/sbc_starfury) -"ih" = ( -/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/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron/dark/side{ - dir = 9 - }, -/area/shuttle/sbc_starfury) "ii" = ( /obj/machinery/door/airlock{ name = "Captain's Quarters" @@ -2592,20 +2403,6 @@ }, /turf/open/floor/pod/light, /area/shuttle/sbc_starfury) -"ip" = ( -/obj/structure/rack{ - dir = 8; - layer = 2.9 - }, -/obj/machinery/airalarm/directional/east{ - req_access = list("syndicate") - }, -/obj/machinery/light/directional/east, -/obj/item/storage/belt/military, -/obj/item/ammo_box/magazine/sniper_rounds, -/obj/item/gun/ballistic/rifle/sniper_rifle/syndicate, -/turf/open/floor/pod/light, -/area/shuttle/sbc_starfury) "iq" = ( /obj/machinery/microwave, /obj/structure/table/wood, @@ -2664,13 +2461,12 @@ /turf/open/floor/mineral/plastitanium/red, /area/shuttle/sbc_starfury) "iw" = ( -/obj/machinery/airalarm/directional/north{ - req_access = list("syndicate") - }, +/obj/machinery/airalarm/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, /obj/effect/spawner/random/trash/bucket, +/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/iron, /area/shuttle/sbc_starfury) "ix" = ( @@ -2679,7 +2475,7 @@ layer = 2.9 }, /obj/item/storage/belt/military, -/obj/item/ammo_box/magazine/mm712x82, +/obj/item/ammo_box/magazine/m7mm, /obj/item/gun/ballistic/automatic/l6_saw, /turf/open/floor/pod/light, /area/shuttle/sbc_starfury) @@ -2700,14 +2496,6 @@ }, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) -"iz" = ( -/obj/machinery/chem_dispenser/drinks/beer{ - dir = 1 - }, -/obj/structure/table/reinforced/plastitaniumglass, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/shuttle/sbc_starfury) "iA" = ( /obj/machinery/chem_dispenser/drinks{ dir = 1 @@ -2722,20 +2510,11 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, -/obj/machinery/airalarm/directional/south{ - req_access = list("syndicate") - }, +/obj/machinery/airalarm/directional/south, /obj/machinery/light/small/directional/south, +/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/carpet, /area/shuttle/sbc_starfury) -"iC" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/shuttle/sbc_starfury) "iD" = ( /obj/effect/turf_decal/stripes/red/line, /turf/open/floor/iron/dark, @@ -2767,9 +2546,8 @@ /obj/item/pen{ pixel_x = -5 }, -/obj/machinery/airalarm/directional/east{ - req_access = list("syndicate") - }, +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/carpet/red, /area/shuttle/sbc_starfury) "iI" = ( @@ -2799,22 +2577,6 @@ }, /turf/open/floor/plating, /area/shuttle/sbc_starfury) -"iL" = ( -/obj/structure/table, -/obj/machinery/syndicatebomb{ - pixel_x = -6; - pixel_y = 8 - }, -/obj/machinery/syndicatebomb{ - pixel_x = 6; - pixel_y = 8 - }, -/obj/machinery/syndicatebomb{ - pixel_y = -2 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/pod/light, -/area/shuttle/sbc_starfury) "iN" = ( /obj/structure/rack{ dir = 8; @@ -2907,9 +2669,8 @@ req_access = list("syndicate") }, /obj/effect/turf_decal/bot/right, -/obj/machinery/airalarm/directional/north{ - req_access = list("syndicate") - }, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/iron/smooth, /area/shuttle/sbc_starfury) "iV" = ( @@ -2993,6 +2754,15 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_dark, /area/shuttle/sbc_starfury) +"jg" = ( +/obj/structure/table, +/obj/item/clothing/gloves/latex, +/obj/item/clothing/mask/surgical, +/obj/item/clothing/suit/apron/surgical, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/siding/dark_green, +/turf/open/floor/iron, +/area/shuttle/sbc_starfury) "ji" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -3103,6 +2873,14 @@ }, /turf/open/floor/plating, /area/shuttle/sbc_starfury) +"jH" = ( +/obj/effect/turf_decal/stripes/line, +/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/docking/directional/south, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/sbc_starfury) "jK" = ( /obj/structure/sign/warning/electric_shock/directional/north, /obj/machinery/power/port_gen/pacman/super, @@ -3272,12 +3050,11 @@ /turf/open/floor/plating/airless, /area/shuttle/sbc_starfury) "kp" = ( -/obj/machinery/airalarm/directional/west{ - req_access = list("syndicate") - }, +/obj/machinery/airalarm/directional/west, /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ dir = 1 }, +/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/iron, /area/shuttle/sbc_starfury) "kq" = ( @@ -3287,6 +3064,25 @@ }, /turf/open/floor/iron, /area/shuttle/sbc_starfury) +"ks" = ( +/obj/structure/table, +/obj/item/stack/sheet/mineral/plastitanium{ + amount = 30; + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/stack/sheet/plastitaniumglass{ + amount = 30 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/sbc_starfury) "kt" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -3320,13 +3116,12 @@ /area/shuttle/sbc_starfury) "ky" = ( /obj/structure/closet/toolcloset, -/obj/machinery/airalarm/directional/east{ - req_access = list("syndicate") - }, +/obj/machinery/airalarm/directional/east, /obj/structure/railing, /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 }, +/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "kz" = ( @@ -3535,15 +3330,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) -"lq" = ( -/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, -/obj/structure/sign/warning/docking/directional/south, -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/sbc_starfury) "lr" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -3754,11 +3540,6 @@ /obj/item/extinguisher/mini, /turf/open/floor/plating, /area/shuttle/sbc_starfury) -"mw" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/shuttle/sbc_starfury) "mx" = ( /obj/structure/reagent_dispensers/watertank, /obj/effect/turf_decal/bot, @@ -3862,6 +3643,21 @@ /obj/machinery/power/shuttle_engine/large, /turf/open/floor/plating/airless, /area/shuttle/sbc_starfury) +"mQ" = ( +/obj/structure/table, +/obj/machinery/syndicatebomb{ + pixel_x = -6; + pixel_y = 8 + }, +/obj/machinery/syndicatebomb{ + pixel_x = 6; + pixel_y = 8 + }, +/obj/machinery/syndicatebomb{ + pixel_y = -2 + }, +/turf/open/floor/pod/light, +/area/shuttle/sbc_starfury) "mY" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -3915,6 +3711,17 @@ }, /turf/open/floor/pod/dark, /area/shuttle/sbc_starfury) +"nN" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/light/small/directional/west, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/sbc_starfury) "nR" = ( /obj/machinery/power/smes/engineering{ charge = 4e+006 @@ -3930,6 +3737,15 @@ }, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) +"oA" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/side{ + dir = 5 + }, +/area/shuttle/sbc_starfury) "oJ" = ( /obj/machinery/shieldgen{ active = 1; @@ -4021,19 +3837,21 @@ }, /turf/open/floor/plating, /area/shuttle/sbc_starfury) +"pU" = ( +/obj/structure/closet/firecloset{ + anchored = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/effect/turf_decal/stripes/red/line, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/sbc_starfury) "qb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/dark, /area/shuttle/sbc_starfury) -"qc" = ( -/obj/structure/cable, -/obj/structure/chair/stool/directional/east, -/obj/machinery/light/small/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/shuttle/sbc_starfury) "qf" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -4047,6 +3865,18 @@ /obj/effect/turf_decal/box/corners, /turf/open/floor/engine, /area/shuttle/sbc_starfury) +"qz" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/shuttle/sbc_starfury) +"qC" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/bot, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/shuttle/sbc_starfury) "qF" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -4055,7 +3885,7 @@ /turf/open/floor/engine, /area/shuttle/sbc_starfury) "qQ" = ( -/obj/machinery/atmospherics/components/unary/cryo_cell, +/obj/machinery/cryo_cell, /turf/open/floor/plating, /area/shuttle/sbc_starfury) "qS" = ( @@ -4144,6 +3974,19 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/pod/dark, /area/shuttle/sbc_starfury) +"te" = ( +/obj/machinery/porta_turret/syndicate/energy{ + dir = 5 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 10 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/sbc_starfury) "tn" = ( /turf/open/floor/iron/smooth, /area/shuttle/sbc_starfury) @@ -4157,14 +4000,22 @@ }, /turf/open/floor/engine, /area/shuttle/sbc_starfury) +"tX" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/machinery/door/airlock/hatch, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/shuttle/sbc_starfury) "ug" = ( /obj/structure/table, /obj/item/storage/backpack/duffelbag/syndie/surgery, /obj/item/defibrillator/compact/combat/loaded, /obj/item/gun/syringe/rapidsyringe, -/obj/machinery/airalarm/directional/east{ - req_access = list("syndicate") - }, +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/iron, /area/shuttle/sbc_starfury) "ui" = ( @@ -4178,6 +4029,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) +"um" = ( +/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/machinery/light/small/directional/west, +/turf/open/floor/iron/dark/side{ + dir = 9 + }, +/area/shuttle/sbc_starfury) "uq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4188,6 +4049,14 @@ }, /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) +"uu" = ( +/obj/machinery/chem_dispenser/drinks/beer{ + dir = 1 + }, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/shuttle/sbc_starfury) "uJ" = ( /obj/machinery/power/port_gen/pacman, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -4308,6 +4177,19 @@ /obj/structure/cable, /turf/open/floor/engine, /area/shuttle/sbc_starfury) +"wk" = ( +/obj/machinery/porta_turret/syndicate/energy{ + dir = 10 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 5 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/sbc_starfury) "wo" = ( /obj/machinery/computer/crew/syndie, /obj/effect/turf_decal/tile/blue/half/contrasted, @@ -4318,6 +4200,19 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/pod/dark, /area/shuttle/sbc_starfury) +"wN" = ( +/obj/machinery/porta_turret/syndicate/energy{ + dir = 9 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 6 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/sbc_starfury) "xi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4341,6 +4236,13 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) +"xF" = ( +/obj/structure/cable, +/obj/structure/chair/stool/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark, +/area/shuttle/sbc_starfury) "xG" = ( /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, /obj/structure/cable, @@ -4366,6 +4268,38 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) +"xR" = ( +/obj/structure/table, +/obj/item/stack/sheet/iron{ + pixel_x = 1 + }, +/obj/item/stack/sheet/glass{ + amount = 50; + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/stack/rods{ + amount = 50 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/sbc_starfury) +"xV" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron, +/area/shuttle/sbc_starfury) "yn" = ( /obj/structure/sign/warning/explosives/directional/north, /obj/machinery/shieldgen{ @@ -4420,14 +4354,42 @@ dir = 6 }, /area/shuttle/sbc_starfury) -"zz" = ( -/obj/machinery/airalarm/directional/east{ - req_access = list("syndicate") +"zq" = ( +/obj/machinery/iv_drip, +/obj/structure/window/reinforced/survival_pod/spawner/directional/west, +/obj/effect/turf_decal/siding/dark_green{ + dir = 9 }, +/turf/open/floor/iron/smooth_large, +/area/shuttle/sbc_starfury) +"zt" = ( +/obj/structure/frame/computer{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/sign/warning/explosives/directional/east, +/obj/effect/turf_decal/siding/dark_red{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/sbc_starfury) +"zz" = ( +/obj/machinery/airalarm/directional/east, /obj/item/kirbyplants/fern, /obj/effect/turf_decal/tile/neutral, +/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) +"zE" = ( +/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, +/obj/structure/sign/warning/docking/directional/south, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/sbc_starfury) "zI" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -4458,6 +4420,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) +"Aw" = ( +/obj/structure/closet/secure_closet/medical2{ + req_access = list("syndicate") + }, +/obj/item/assembly/flash/handheld, +/obj/effect/turf_decal/siding/dark_green, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/turf/open/floor/iron, +/area/shuttle/sbc_starfury) "Ay" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/poddoor/shutters{ @@ -4468,13 +4440,12 @@ /turf/open/floor/pod/light, /area/shuttle/sbc_starfury) "AF" = ( -/obj/machinery/airalarm/directional/west{ - req_access = list("syndicate") - }, +/obj/machinery/airalarm/directional/west, /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "AH" = ( @@ -4486,7 +4457,8 @@ "AJ" = ( /obj/machinery/door/firedoor/heavy, /obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/machinery/door/airlock/glass_large, +/obj/machinery/door/airlock/multi_tile/public/glass, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/pod/light, /area/shuttle/sbc_starfury) "AQ" = ( @@ -4502,6 +4474,19 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/shuttle/sbc_starfury) +"Br" = ( +/obj/machinery/porta_turret/syndicate/energy{ + dir = 9 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 6 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/sbc_starfury) "BI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -4513,10 +4498,6 @@ /obj/effect/turf_decal/tile/dark_red, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) -"BK" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/shuttle/sbc_starfury) "BN" = ( /obj/effect/turf_decal/siding/thinplating_new/dark, /obj/structure/window/reinforced/survival_pod/spawner/directional/south, @@ -4544,15 +4525,6 @@ }, /turf/template_noop, /area/template_noop) -"Ck" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron, -/area/shuttle/sbc_starfury) "Cl" = ( /obj/structure/window/reinforced/survival_pod/spawner/directional/east, /obj/effect/decal/cleanable/glass, @@ -4565,6 +4537,17 @@ }, /turf/open/floor/engine, /area/shuttle/sbc_starfury) +"CI" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/obj/structure/table, +/obj/machinery/light/small/directional/east, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/sbc_starfury) "CO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -4572,17 +4555,11 @@ }, /turf/open/floor/iron/smooth, /area/shuttle/sbc_starfury) -"CQ" = ( -/obj/structure/frame/computer{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/sign/warning/explosives/directional/east, -/obj/effect/turf_decal/siding/dark_red{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark/textured_large, +"CW" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, /area/shuttle/sbc_starfury) "CZ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -4615,9 +4592,8 @@ }, /obj/effect/turf_decal/bot, /obj/structure/cable, -/obj/machinery/airalarm/directional/north{ - req_access = list("syndicate") - }, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/engine, /area/shuttle/sbc_starfury) "DV" = ( @@ -4738,6 +4714,18 @@ /obj/effect/turf_decal/siding/thinplating_new/dark, /turf/open/floor/plating/airless, /area/shuttle/sbc_starfury) +"FA" = ( +/obj/structure/sign/warning/chem_diamond/directional/south, +/obj/machinery/sleeper/syndie{ + dir = 8; + icon_state = "sleeper_s-open" + }, +/obj/effect/turf_decal/siding/dark_green{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/smooth_large, +/area/shuttle/sbc_starfury) "FC" = ( /obj/machinery/computer/monitor{ dir = 8; @@ -4781,15 +4769,14 @@ /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "Gv" = ( -/obj/machinery/airalarm/directional/north{ - req_access = list("syndicate") - }, +/obj/machinery/airalarm/directional/north, /obj/machinery/vending/coffee{ extended_inventory = 1 }, /obj/effect/turf_decal/tile/dark_red{ dir = 1 }, +/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "Gz" = ( @@ -4798,7 +4785,8 @@ 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"); name = "Syndicate Medibot"; - skin = "bezerk" + skin = "bezerk"; + maints_access_required = list("syndicate") }, /turf/open/floor/iron, /area/shuttle/sbc_starfury) @@ -4824,6 +4812,15 @@ /obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/plating, /area/shuttle/sbc_starfury) +"Hh" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark{ + initial_gas_mix = "n2=100;TEMP=80"; + temperature = 80 + }, +/area/shuttle/sbc_starfury) "HF" = ( /obj/machinery/suit_storage_unit/syndicate, /obj/machinery/light/small/directional/west, @@ -4905,6 +4902,18 @@ /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, /turf/open/floor/plating, /area/shuttle/sbc_starfury) +"Jl" = ( +/obj/structure/rack{ + dir = 8; + layer = 2.9 + }, +/obj/machinery/airalarm/directional/east, +/obj/item/storage/belt/military, +/obj/item/ammo_box/magazine/sniper_rounds, +/obj/item/gun/ballistic/rifle/sniper_rifle/syndicate, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/turf/open/floor/pod/light, +/area/shuttle/sbc_starfury) "Jm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -4959,6 +4968,13 @@ }, /turf/open/floor/pod/light, /area/shuttle/sbc_starfury) +"JP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/sbc_starfury) "JY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -4977,8 +4993,24 @@ /obj/structure/filingcabinet, /turf/open/floor/carpet/red, /area/shuttle/sbc_starfury) +"KN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron, +/area/shuttle/sbc_starfury) "KP" = ( /obj/machinery/light/directional/south, +/obj/machinery/turretid{ + ailock = 1; + desc = "A specially designed set of turret controls. Looks to be covered in protective casing to prevent AI interfacing."; + icon_state = "control_stun"; + name = "Ship Turret Control"; + pixel_y = -28; + req_access = list("syndicate") + }, /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) "KR" = ( @@ -4992,16 +5024,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) -"Lf" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron, +"Lt" = ( +/obj/structure/marker_beacon/burgundy, +/turf/open/floor/plating, /area/shuttle/sbc_starfury) "LH" = ( /obj/structure/table, @@ -5033,11 +5058,32 @@ }, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) +"Mw" = ( +/obj/structure/chair/stool/directional/west, +/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/shuttle/sbc_starfury) "MC" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/shuttle/sbc_starfury) +"ME" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor, +/turf/open/floor/pod/dark, +/area/shuttle/sbc_starfury) +"MK" = ( +/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/effect/turf_decal/stripes/red/line, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/dark, +/area/shuttle/sbc_starfury) "MP" = ( /obj/machinery/space_heater, /obj/effect/turf_decal/bot, @@ -5122,16 +5168,18 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) -"Ot" = ( -/obj/machinery/firealarm/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron/dark, -/area/shuttle/sbc_starfury) "Ou" = ( /obj/structure/lattice, /turf/template_noop, /area/shuttle/sbc_starfury) +"OD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/airalarm/directional/south, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/turf/open/floor/pod/dark, +/area/shuttle/sbc_starfury) "OG" = ( /obj/effect/turf_decal/bot, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -5216,15 +5264,6 @@ }, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) -"PM" = ( -/obj/effect/turf_decal/stripes/line, -/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/docking/directional/south, -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/sbc_starfury) "PP" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -5238,6 +5277,7 @@ "PY" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "Qf" = ( @@ -5300,6 +5340,20 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) +"Rn" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/air{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/shuttle/sbc_starfury) "Rv" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -5344,19 +5398,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) -"Sm" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister/air{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/shuttle/sbc_starfury) "Sq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5416,21 +5457,15 @@ }, /turf/open/floor/glass/reinforced, /area/shuttle/sbc_starfury) -"TB" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 4 - }, -/obj/structure/table, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/sbc_starfury) "TI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) +"TZ" = ( +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron/dark, +/area/shuttle/sbc_starfury) "Ue" = ( /obj/machinery/power/turbine/inlet_compressor, /obj/effect/turf_decal/stripes/red/end{ @@ -5438,12 +5473,6 @@ }, /turf/open/floor/plating/airless, /area/shuttle/sbc_starfury) -"Ux" = ( -/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/dark/side, -/area/shuttle/sbc_starfury) "Uy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -5489,6 +5518,19 @@ }, /turf/open/floor/iron, /area/shuttle/sbc_starfury) +"Vj" = ( +/obj/structure/cable, +/obj/structure/sign/warning/explosives/directional/west, +/obj/effect/turf_decal/siding/dark_red{ + dir = 6 + }, +/obj/structure/frame/computer{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/sbc_starfury) "Vm" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -5496,6 +5538,10 @@ }, /turf/open/floor/plating, /area/shuttle/sbc_starfury) +"Vr" = ( +/obj/machinery/light/floor, +/turf/open/floor/pod/dark, +/area/shuttle/sbc_starfury) "Vt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -5507,6 +5553,18 @@ }, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) +"VE" = ( +/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, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 9 + }, +/area/shuttle/sbc_starfury) "VS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/yellow/half/contrasted, @@ -5569,6 +5627,12 @@ }, /turf/open/floor/plating, /area/shuttle/sbc_starfury) +"WC" = ( +/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/dark/side, +/area/shuttle/sbc_starfury) "WV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -5636,19 +5700,17 @@ "XN" = ( /obj/machinery/computer/monitor, /obj/structure/cable, -/obj/machinery/airalarm/directional/north{ - req_access = list("syndicate") - }, +/obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) -"XU" = ( -/obj/machinery/airalarm/directional/north{ - req_access = list("syndicate") - }, -/obj/machinery/light/small/directional/north, +"XZ" = ( +/obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/tile/bar/diagonal_centre, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/light/directional/north, +/obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/iron/dark/diagonal, /area/shuttle/sbc_starfury) "Yc" = ( @@ -5677,13 +5739,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) -"Yq" = ( -/obj/structure/closet/secure_closet/medical2{ - req_access = list("syndicate") +"Yi" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 }, -/obj/item/assembly/flash/handheld, -/obj/effect/turf_decal/siding/dark_green, -/turf/open/floor/iron, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/button/door/directional/north{ + id = "syndie_battlecruiser_mech"; + name = "Mech Storage Shutters"; + req_access = list("syndicate_leader") + }, +/turf/open/floor/pod/dark, /area/shuttle/sbc_starfury) "Yt" = ( /obj/machinery/space_heater, @@ -5900,7 +5967,7 @@ aa Ue JF Fr -cr +Vj cH eC cF @@ -5968,7 +6035,7 @@ aa aa ae ae -eG +Mw fd ae PY @@ -6136,13 +6203,13 @@ aa ae ae ae -XU +XZ Je Xj AH ie Fj -iz +uu ae ae dp @@ -6336,10 +6403,10 @@ eE eE eE ae -TB +nN EH ae -hO +CW Xo ae hh @@ -6407,9 +6474,9 @@ GF eR ff ae -fV -Ux -gT +qz +WC +tX hi hH ig @@ -6476,9 +6543,9 @@ eR wc ae iw -hI +gc ae -hi +VE hN ae xp @@ -6496,7 +6563,7 @@ lh lx VV lF -mw +qC ae mI mH @@ -6525,7 +6592,7 @@ ae eT pa eA -aH +Lt aH aH aH @@ -6538,7 +6605,7 @@ aH aH aH aH -aH +Lt hB eR fh @@ -6547,7 +6614,7 @@ ae ae ae hk -hJ +hN ae ae ae @@ -6617,8 +6684,8 @@ hj hl vH Of -ih -dT +um +MK iP iY Wu @@ -6631,7 +6698,7 @@ kQ lj WV Pq -Lf +xV ae ae aH @@ -6653,7 +6720,7 @@ PF ay vk ae -ds +jg ay ag dY @@ -6680,7 +6747,7 @@ ST ec dV gp -iC +oA ay hm hN @@ -6693,7 +6760,7 @@ kt MR kt kg -kt +kg kt kR lk @@ -6717,11 +6784,11 @@ aV aJ cf vk -at +vk vk ci ae -Yq +Aw dD dC dZ @@ -6745,13 +6812,13 @@ aH aH hB ST -fj +Br ae ae ae ae hn -BK +ay ae ae ae @@ -6764,7 +6831,7 @@ ja ae kG kU -lq +zE ae ae ae @@ -6812,14 +6879,14 @@ aH aH aH hB -eX +OD ae ae BO Cl ae hp -hN +bb ae it iE @@ -6899,7 +6966,7 @@ CC wj lB kF -kU +JP lm ae aS @@ -6949,7 +7016,7 @@ aH aH hB ST -fl +xR ae gx HP @@ -7001,6 +7068,7 @@ xG aw ec eB +Lt aH aH aH @@ -7013,11 +7081,10 @@ aH aH aH aH -aH -aH +Lt hB ST -fm +ks ae ae ae @@ -7132,7 +7199,7 @@ Ri aZ df Uy -ee +zq ae Yc ec @@ -7171,7 +7238,7 @@ qm wj lB kF -kU +JP lm ae aS @@ -7200,10 +7267,10 @@ ae cQ ju Uy -dg +FA ae ae -er +ep eB aH aH @@ -7220,7 +7287,7 @@ aH aH aH hB -eZ +ST ae ae gB @@ -7270,7 +7337,7 @@ MS bq bc ae -aQ +pU ec eB aH @@ -7289,13 +7356,13 @@ aH aH hB ST -fp +te ae ae xG ae hu -Ot +TZ ae xG ae @@ -7308,7 +7375,7 @@ ja ae xH kU -PM +jH ae ae ae @@ -7373,7 +7440,7 @@ kH yM Lb kj -kH +kj kH la Sk @@ -7448,7 +7515,7 @@ lr SE vn ms -Sm +Rn ae aH mB @@ -7477,7 +7544,7 @@ ae eT LN eB -aH +Lt aH aH aH @@ -7490,18 +7557,18 @@ aH aH aH aH -aH +Lt hB fb fu ae ae -Yc -ha +wk +Hh Mt hW in -fj +wN ae ae jd @@ -7515,7 +7582,7 @@ zI JY UW UW -Ck +KN ae ae mK @@ -7635,7 +7702,7 @@ Pr ae hb qb -bI +ME rD ro fp @@ -7696,17 +7763,17 @@ eE eE eE ae -fc +CI fe ae ae ae ae -hz +Yi hZ hZ ec -iL +mQ ae nR Xr @@ -7908,7 +7975,7 @@ gQ hc cb ec -ec +Vr ec iO ae @@ -7976,7 +8043,7 @@ UH ae hC ib -ip +Jl ix fj ae @@ -8008,7 +8075,7 @@ aa aa ae ae -qc +xF BT ae Gs @@ -8076,7 +8143,7 @@ aa Ue JF Fr -CQ +zt vk co vk diff --git a/_maps/templates/heretic_sacrifice_template.dmm b/_maps/templates/heretic_sacrifice_template.dmm deleted file mode 100644 index d0277a1e71204..0000000000000 --- a/_maps/templates/heretic_sacrifice_template.dmm +++ /dev/null @@ -1,1532 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"ab" = ( -/turf/open/space/basic, -/area/space) -"cd" = ( -/obj/effect/decal/cleanable/ash{ - pixel_x = -8; - pixel_y = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"cS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/bonfire/prelit, -/turf/open/floor/stone, -/area/centcom/heretic_sacrifice/flesh) -"cW" = ( -/obj/structure/no_effect_signpost/void, -/turf/open/misc/asteroid, -/area/centcom/heretic_sacrifice/void) -"dX" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"dZ" = ( -/obj/effect/decal/fakelattice{ - density = 0 - }, -/turf/open/misc/ironsand, -/area/centcom/heretic_sacrifice/rust) -"fh" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/centcom/heretic_sacrifice/rust) -"gJ" = ( -/obj/effect/decal/remains/human, -/turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"hZ" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/indestructible/necropolis/air, -/area/centcom/heretic_sacrifice/flesh) -"jg" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/structure/cable, -/turf/open/floor/plating/rust, -/area/centcom/heretic_sacrifice/rust) -"jB" = ( -/obj/machinery/light/very_dim/directional/south, -/turf/open/misc/asteroid, -/area/centcom/heretic_sacrifice/void) -"lz" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"mb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/remains/human, -/turf/open/misc/ironsand, -/area/centcom/heretic_sacrifice/rust) -"mG" = ( -/obj/effect/turf_decal/weather, -/obj/structure/cable, -/turf/open/floor/plating/rust, -/area/centcom/heretic_sacrifice/rust) -"mR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/fakelattice{ - density = 0 - }, -/turf/open/floor/plating, -/area/centcom/heretic_sacrifice/rust) -"mZ" = ( -/obj/effect/decal/fakelattice{ - density = 0 - }, -/turf/open/floor/plating, -/area/centcom/heretic_sacrifice/rust) -"nG" = ( -/obj/structure/bonfire/prelit, -/turf/open/misc/dirt/jungle/wasteland{ - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"nL" = ( -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/block/cracked{ - dir = 10 - }, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"nP" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"oh" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/rust, -/area/centcom/heretic_sacrifice/rust) -"ps" = ( -/obj/effect/turf_decal/weather, -/turf/open/floor/plating, -/area/centcom/heretic_sacrifice/rust) -"pt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/fakelattice{ - density = 0 - }, -/turf/open/misc/ironsand, -/area/centcom/heretic_sacrifice/rust) -"pN" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 9 - }, -/obj/effect/decal/cleanable/oil, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"qn" = ( -/obj/effect/decal/remains/human, -/turf/open/misc/asteroid, -/area/centcom/heretic_sacrifice/void) -"qu" = ( -/obj/effect/turf_decal/weather/dirt, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"qM" = ( -/obj/structure/stone_tile/block/cracked, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/weather/dirt{ - dir = 5 - }, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"rP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/old, -/turf/open/indestructible/necropolis/air, -/area/centcom/heretic_sacrifice/flesh) -"sb" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"tF" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 9 - }, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"ui" = ( -/turf/open/floor/stone, -/area/centcom/heretic_sacrifice/flesh) -"uu" = ( -/obj/effect/turf_decal/trimline/brown/corner{ - dir = 1 - }, -/turf/open/floor/plating/rust, -/area/centcom/heretic_sacrifice/rust) -"uT" = ( -/obj/structure/cable, -/turf/open/floor/plating/rust, -/area/centcom/heretic_sacrifice/rust) -"vs" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"vv" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 4 - }, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"wt" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"wE" = ( -/turf/open/misc/dirt/jungle/wasteland{ - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"wS" = ( -/turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"wY" = ( -/turf/open/floor/glass{ - desc = "A peek into the other side."; - name = "void glass floor" - }, -/area/centcom/heretic_sacrifice/void) -"yC" = ( -/obj/effect/turf_decal/trimline/brown/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/centcom/heretic_sacrifice/rust) -"zb" = ( -/obj/structure/stone_tile/slab, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"zU" = ( -/obj/effect/decal/fakelattice{ - density = 0 - }, -/turf/open/floor/plating/rust, -/area/centcom/heretic_sacrifice/rust) -"AH" = ( -/obj/effect/turf_decal/trimline/brown/corner, -/turf/open/floor/plating/rust, -/area/centcom/heretic_sacrifice/rust) -"AN" = ( -/obj/machinery/light/floor, -/obj/effect/decal/fakelattice{ - density = 0 - }, -/turf/open/misc/ironsand, -/area/centcom/heretic_sacrifice/rust) -"AO" = ( -/turf/open/floor/fakespace, -/area/centcom/heretic_sacrifice/void) -"Bv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/brown/line, -/turf/open/floor/plating/rust, -/area/centcom/heretic_sacrifice/rust) -"Bw" = ( -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"By" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating, -/area/centcom/heretic_sacrifice/rust) -"Cf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/weather, -/turf/open/floor/plating/rust, -/area/centcom/heretic_sacrifice/rust) -"Ck" = ( -/obj/effect/turf_decal/trimline/brown/corner{ - dir = 8 - }, -/turf/open/floor/plating/rust, -/area/centcom/heretic_sacrifice/rust) -"CB" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/stone, -/area/centcom/heretic_sacrifice/flesh) -"CG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/stone, -/area/centcom/heretic_sacrifice/flesh) -"CV" = ( -/obj/effect/decal/cleanable/plasma, -/obj/effect/landmark/heretic/ash, -/turf/open/misc/dirt/jungle/wasteland{ - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"DL" = ( -/obj/structure/stone_tile/block/burnt{ - dir = 4 - }, -/turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"ER" = ( -/turf/open/misc/ironsand, -/area/centcom/heretic_sacrifice/rust) -"Fd" = ( -/turf/closed/indestructible/riveted, -/area/space) -"Gl" = ( -/obj/structure/stone_tile/block/burnt{ - dir = 1 - }, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"GX" = ( -/obj/effect/landmark/heretic/flesh, -/turf/open/indestructible/necropolis/air, -/area/centcom/heretic_sacrifice/flesh) -"HE" = ( -/obj/effect/turf_decal/weather, -/turf/open/floor/plating/rust, -/area/centcom/heretic_sacrifice/rust) -"HJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/gibspawner/human, -/turf/open/floor/stone, -/area/centcom/heretic_sacrifice/flesh) -"HQ" = ( -/turf/closed/indestructible/necropolis, -/area/centcom/heretic_sacrifice/flesh) -"Ie" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood/old, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"Ii" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 5 - }, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"Je" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/ironsand, -/area/centcom/heretic_sacrifice/rust) -"Jy" = ( -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"JJ" = ( -/obj/effect/decal/remains/human, -/turf/open/indestructible/necropolis/air, -/area/centcom/heretic_sacrifice/flesh) -"Ko" = ( -/obj/machinery/light/very_dim/directional/east, -/turf/open/floor/fakespace, -/area/centcom/heretic_sacrifice/void) -"Ku" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"Kz" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"KO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/gibspawner/generic/animal, -/obj/structure/bonfire/prelit, -/turf/open/floor/stone, -/area/centcom/heretic_sacrifice/flesh) -"KP" = ( -/obj/structure/stone_tile/surrounding_tile, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"La" = ( -/turf/closed/indestructible/riveted/plastinum, -/area/centcom/heretic_sacrifice/void) -"LA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/brown/corner{ - dir = 4 - }, -/turf/open/floor/plating, -/area/centcom/heretic_sacrifice/rust) -"Mf" = ( -/obj/effect/decal/cleanable/ash/large, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/dirt/jungle/wasteland{ - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"Mw" = ( -/obj/machinery/light/very_dim/directional/west, -/turf/open/floor/fakespace, -/area/centcom/heretic_sacrifice/void) -"Nh" = ( -/obj/effect/turf_decal/trimline/brown/line{ - dir = 1 - }, -/turf/open/floor/plating/rust, -/area/centcom/heretic_sacrifice/rust) -"NA" = ( -/obj/structure/stone_tile/burnt, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"NQ" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 1 - }, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"OD" = ( -/obj/effect/landmark/heretic, -/turf/open/misc/dirt/jungle/wasteland{ - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"OG" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 10 - }, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"Pl" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 6 - }, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"Qi" = ( -/obj/structure/stone_tile, -/turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"QL" = ( -/obj/effect/decal/cleanable/ash/large{ - pixel_x = -2; - pixel_y = -8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"Rb" = ( -/obj/effect/landmark/heretic/void, -/turf/open/misc/asteroid, -/area/centcom/heretic_sacrifice/void) -"Rh" = ( -/obj/effect/turf_decal/trimline/brown/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/centcom/heretic_sacrifice/rust) -"RW" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/stone, -/area/centcom/heretic_sacrifice/flesh) -"Se" = ( -/turf/open/floor/plating, -/area/centcom/heretic_sacrifice/rust) -"St" = ( -/turf/open/indestructible/necropolis/air, -/area/centcom/heretic_sacrifice/flesh) -"Sy" = ( -/obj/structure/stone_tile/block, -/turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"Tf" = ( -/obj/effect/decal/cleanable/food/salt, -/turf/open/indestructible/necropolis/air, -/area/centcom/heretic_sacrifice/flesh) -"TC" = ( -/obj/effect/decal/cleanable/ash, -/turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"TS" = ( -/obj/effect/turf_decal/trimline/brown/line{ - dir = 8 - }, -/turf/open/floor/plating/rust, -/area/centcom/heretic_sacrifice/rust) -"Ue" = ( -/obj/machinery/light/very_dim/directional/north, -/turf/open/floor/fakespace, -/area/centcom/heretic_sacrifice/void) -"UO" = ( -/obj/effect/landmark/heretic/rust, -/turf/open/floor/plating, -/area/centcom/heretic_sacrifice/rust) -"Vd" = ( -/obj/structure/bonfire/prelit, -/turf/open/floor/stone, -/area/centcom/heretic_sacrifice/flesh) -"VK" = ( -/obj/effect/decal/cleanable/ash, -/obj/effect/decal/cleanable/ash{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; - slowdown = 0 - }, -/area/centcom/heretic_sacrifice/ash) -"Wb" = ( -/turf/open/misc/asteroid, -/area/centcom/heretic_sacrifice/void) -"WD" = ( -/turf/closed/indestructible/iron{ - opacity = 1 - }, -/area/centcom/heretic_sacrifice/rust) -"Xk" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/misc/asteroid, -/area/centcom/heretic_sacrifice/void) -"Xr" = ( -/turf/open/floor/plating/rust, -/area/centcom/heretic_sacrifice/rust) -"Xt" = ( -/obj/effect/gibspawner/generic/animal, -/turf/open/floor/stone, -/area/centcom/heretic_sacrifice/flesh) -"Yp" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/indestructible/necropolis/air, -/area/centcom/heretic_sacrifice/flesh) -"ZA" = ( -/turf/closed/indestructible/riveted/boss, -/area/centcom/heretic_sacrifice/ash) - -(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 -"} -(2,1,1) = {" -ab -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -ab -"} -(3,1,1) = {" -ab -Fd -ZA -ZA -ZA -ZA -ZA -ZA -ZA -ZA -ZA -ZA -ZA -ZA -Fd -La -La -La -La -La -La -La -La -La -La -La -La -Fd -ab -"} -(4,1,1) = {" -ab -Fd -ZA -Pl -wS -Ii -Bw -Bw -Bw -Bw -Pl -wS -Ii -ZA -Fd -La -AO -AO -AO -AO -Mw -AO -AO -AO -wY -Wb -La -Fd -ab -"} -(5,1,1) = {" -ab -Fd -ZA -wS -nG -VK -sb -Bw -Bw -Bw -Qi -nG -Kz -ZA -Fd -La -AO -wY -AO -AO -AO -AO -AO -AO -AO -wY -La -Fd -ab -"} -(6,1,1) = {" -ab -Fd -ZA -OG -cd -pN -Bw -Bw -vv -Bw -OG -TC -tF -ZA -Fd -La -wY -cW -wY -AO -AO -AO -AO -AO -AO -AO -La -Fd -ab -"} -(7,1,1) = {" -ab -Fd -ZA -Bw -Bw -Bw -Pl -nP -nP -Ii -Bw -Bw -Bw -ZA -Fd -La -AO -wY -AO -AO -wY -wY -AO -AO -AO -wY -La -Fd -ab -"} -(8,1,1) = {" -ab -Fd -ZA -Bw -Bw -qu -vs -wE -Mf -Sy -NQ -lz -lz -ZA -Fd -La -AO -AO -AO -wY -Wb -Rb -wY -AO -wY -jB -La -Fd -ab -"} -(9,1,1) = {" -ab -Fd -ZA -Bw -Bw -Bw -wt -CV -OD -Sy -NQ -lz -Bw -ZA -Fd -La -Ue -AO -AO -wY -Xk -Wb -wY -AO -wY -Wb -La -Fd -ab -"} -(10,1,1) = {" -ab -Fd -ZA -Bw -Bw -Bw -OG -DL -Ku -Ie -Bw -dX -Bw -ZA -Fd -La -AO -AO -AO -AO -wY -wY -AO -AO -wY -Wb -La -Fd -ab -"} -(11,1,1) = {" -ab -Fd -ZA -Pl -gJ -qM -Bw -Bw -nL -lz -Pl -Kz -Ii -ZA -Fd -La -wY -AO -AO -AO -AO -AO -AO -AO -AO -wY -La -Fd -ab -"} -(12,1,1) = {" -ab -Fd -ZA -wS -nG -Sy -lz -Gl -zb -NA -QL -nG -wS -ZA -Fd -La -Wb -wY -AO -AO -AO -AO -AO -wY -AO -AO -La -Fd -ab -"} -(13,1,1) = {" -ab -Fd -ZA -OG -wS -tF -Bw -Jy -KP -Bw -OG -wS -tF -ZA -Fd -La -Wb -Xk -wY -AO -AO -Ko -wY -qn -wY -AO -La -Fd -ab -"} -(14,1,1) = {" -ab -Fd -ZA -ZA -ZA -ZA -ZA -ZA -ZA -ZA -ZA -ZA -ZA -ZA -Fd -La -La -La -La -La -La -La -La -La -La -La -La -Fd -ab -"} -(15,1,1) = {" -ab -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -ab -"} -(16,1,1) = {" -ab -Fd -WD -WD -WD -WD -WD -WD -WD -WD -WD -WD -WD -WD -Fd -HQ -HQ -HQ -HQ -HQ -HQ -HQ -HQ -HQ -HQ -HQ -HQ -Fd -ab -"} -(17,1,1) = {" -ab -Fd -WD -dZ -dZ -dZ -ER -Je -fh -Xr -Xr -Xr -Xr -WD -Fd -HQ -St -ui -St -St -St -Yp -Yp -St -ui -St -HQ -Fd -ab -"} -(18,1,1) = {" -ab -Fd -WD -dZ -AN -mb -HE -oh -fh -Xr -ps -AN -Xr -WD -Fd -HQ -Xt -cS -RW -ui -ui -ui -RW -Xt -Vd -ui -HQ -Fd -ab -"} -(19,1,1) = {" -ab -Fd -WD -ER -mG -jg -fh -fh -uT -By -dZ -pt -ER -WD -Fd -HQ -St -CB -JJ -ui -St -St -ui -hZ -ui -St -HQ -Fd -ab -"} -(20,1,1) = {" -ab -Fd -WD -Se -mR -zU -AH -Rh -Rh -LA -ER -ps -Je -WD -Fd -HQ -St -ui -ui -HJ -RW -RW -ui -RW -RW -St -HQ -Fd -ab -"} -(21,1,1) = {" -ab -Fd -WD -Xr -mZ -Se -Bv -Xr -Xr -Nh -Xr -Se -Se -WD -Fd -HQ -St -RW -St -ui -hZ -Tf -ui -St -RW -St -HQ -Fd -ab -"} -(22,1,1) = {" -ab -Fd -WD -Se -Se -Xr -Bv -UO -Se -yC -Se -zU -Xr -WD -Fd -HQ -St -RW -Yp -ui -GX -Yp -ui -JJ -ui -St -HQ -Fd -ab -"} -(23,1,1) = {" -ab -Fd -WD -Xr -oh -Xr -Ck -TS -TS -uu -Xr -Xr -HE -WD -Fd -HQ -St -ui -ui -ui -ui -RW -CG -ui -ui -St -HQ -Fd -ab -"} -(24,1,1) = {" -ab -Fd -WD -ps -Se -Se -By -Se -oh -Xr -ps -pt -ER -WD -Fd -HQ -hZ -ui -St -ui -St -St -ui -rP -ui -St -HQ -Fd -ab -"} -(25,1,1) = {" -ab -Fd -WD -Je -AN -Cf -oh -mR -zU -ps -ER -AN -ER -WD -Fd -HQ -RW -KO -ui -ui -RW -ui -ui -RW -cS -ui -HQ -Fd -ab -"} -(26,1,1) = {" -ab -Fd -WD -ER -pt -ER -HE -Xr -Se -Se -Je -ER -Xr -WD -Fd -HQ -St -ui -JJ -Yp -Yp -St -St -Yp -Xt -St -HQ -Fd -ab -"} -(27,1,1) = {" -ab -Fd -WD -WD -WD -WD -WD -WD -WD -WD -WD -WD -WD -WD -Fd -HQ -HQ -HQ -HQ -HQ -HQ -HQ -HQ -HQ -HQ -HQ -HQ -Fd -ab -"} -(28,1,1) = {" -ab -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -Fd -ab -"} -(29,1,1) = {" -ab -ab -ab -ab -ab -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/templates/hilbertshotellore.dmm b/_maps/templates/hilbertshotellore.dmm index becb0357cd831..4774f6788e373 100644 --- a/_maps/templates/hilbertshotellore.dmm +++ b/_maps/templates/hilbertshotellore.dmm @@ -5,14 +5,6 @@ "ab" = ( /turf/closed/indestructible/hotelwall, /area/misc/hilbertshotel) -"ac" = ( -/obj/structure/table/wood/fancy, -/obj/structure/mirror/directional/north{ - broken = 1; - icon_state = "mirror_broke" - }, -/turf/open/indestructible/hotelwood, -/area/misc/hilbertshotel) "ad" = ( /turf/open/indestructible/hotelwood, /area/misc/hilbertshotel) @@ -150,11 +142,6 @@ /obj/structure/sink/directional/east, /turf/open/indestructible/hoteltile, /area/misc/hilbertshotel) -"aJ" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/west, -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/turf/open/indestructible/hoteltile, -/area/misc/hilbertshotel) "aK" = ( /obj/machinery/shower/directional/west, /turf/open/indestructible/hoteltile, @@ -168,18 +155,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/indestructible/hotelwood, /area/misc/hilbertshotel) -"aN" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/obj/structure/window/reinforced/tinted/spawner/directional/west, -/turf/open/indestructible/hoteltile, -/area/misc/hilbertshotel) -"aO" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/west, -/turf/open/indestructible/hoteltile, -/area/misc/hilbertshotel) "aP" = ( /obj/item/bikehorn/rubberducky, /obj/machinery/light/small/directional/east, @@ -194,11 +169,6 @@ /obj/machinery/smartfridge/food, /turf/open/indestructible/hotelwood, /area/misc/hilbertshotel) -"aS" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/west, -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/turf/open/indestructible/hoteltile, -/area/misc/hilbertshotel) "aT" = ( /obj/structure/table/reinforced, /obj/structure/sink/kitchen/directional/north, @@ -296,11 +266,38 @@ /obj/item/paper/crumpled/ruins/hotel_note, /turf/open/indestructible/hotelwood, /area/misc/hilbertshotel) +"ej" = ( +/obj/structure/window/reinforced/tinted/spawner/directional/west, +/turf/open/indestructible/hoteltile, +/area/misc/hilbertshotel) +"tf" = ( +/obj/structure/window/reinforced/tinted/spawner/directional/west, +/obj/structure/window/reinforced/tinted/spawner/directional/south, +/turf/open/indestructible/hoteltile, +/area/misc/hilbertshotel) +"Gk" = ( +/obj/structure/table/wood/fancy, +/obj/structure/mirror/broken/directional/north, +/turf/open/indestructible/hotelwood, +/area/misc/hilbertshotel) "Mn" = ( /obj/structure/table/wood/fancy, /obj/machinery/light/small/directional/north, /turf/open/indestructible/hotelwood, /area/misc/hilbertshotel) +"XX" = ( +/obj/structure/window/reinforced/tinted/spawner/directional/west, +/obj/structure/window/reinforced/tinted/spawner/directional/north, +/turf/open/indestructible/hoteltile, +/area/misc/hilbertshotel) +"Yw" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted/spawner/directional/north, +/obj/structure/window/reinforced/tinted/spawner/directional/west, +/turf/open/indestructible/hoteltile, +/area/misc/hilbertshotel) (1,1,1) = {" aa @@ -475,7 +472,7 @@ aa (11,1,1) = {" aa ab -ac +Gk ad ad aL @@ -483,7 +480,7 @@ av ap aD aC -aN +Yw bi aV ab @@ -499,9 +496,9 @@ ad aw ab aE -aJ -aO -aS +XX +ej +tf aE ab aa diff --git a/_maps/templates/holodeck_beach.dmm b/_maps/templates/holodeck_beach.dmm index 6260ed27862ec..96df917760d17 100644 --- a/_maps/templates/holodeck_beach.dmm +++ b/_maps/templates/holodeck_beach.dmm @@ -22,6 +22,9 @@ "t" = ( /turf/open/floor/holofloor/carpet, /area/template_noop) +"B" = ( +/turf/open/floor/holofloor/beach/water, +/area/template_noop) "H" = ( /obj/effect/holodeck_effect/mobspawner/monkey, /turf/open/floor/holofloor/beach, @@ -64,8 +67,8 @@ R R R R -R a +B "} (2,1,1) = {" R @@ -76,8 +79,8 @@ R S R Q -R a +B "} (3,1,1) = {" X @@ -88,8 +91,8 @@ R t t R -R a +B "} (4,1,1) = {" R @@ -100,8 +103,8 @@ h R R R -R a +B "} (5,1,1) = {" R @@ -112,8 +115,8 @@ R t t R -R a +B "} (6,1,1) = {" R @@ -124,8 +127,8 @@ X g R q -R a +B "} (7,1,1) = {" R @@ -136,8 +139,8 @@ R R R f -R a +B "} (8,1,1) = {" W @@ -148,8 +151,8 @@ H R M R -R a +B "} (9,1,1) = {" R @@ -160,6 +163,6 @@ R R R R -R a +B "} diff --git a/_maps/templates/holodeck_lounge.dmm b/_maps/templates/holodeck_lounge.dmm index 335247dfda301..6bb39eb4d2186 100644 --- a/_maps/templates/holodeck_lounge.dmm +++ b/_maps/templates/holodeck_lounge.dmm @@ -158,8 +158,7 @@ /area/template_noop) "D" = ( /obj/structure/table/wood, -/obj/item/kirbyplants{ - icon_state = "plant-05"; +/obj/item/kirbyplants/organic/plant5{ pixel_y = 10 }, /turf/open/floor/holofloor/carpet, diff --git a/_maps/templates/holodeck_medicalsim.dmm b/_maps/templates/holodeck_medicalsim.dmm index 76943796a7641..acc38d02c58dd 100644 --- a/_maps/templates/holodeck_medicalsim.dmm +++ b/_maps/templates/holodeck_medicalsim.dmm @@ -177,9 +177,7 @@ /area/template_noop) "pe" = ( /obj/structure/window/spawner/directional/south, -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, +/obj/item/kirbyplants/organic/plant10, /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/holofloor{ icon_state = "white" @@ -246,7 +244,7 @@ /area/template_noop) "wV" = ( /obj/structure/window/spawner/directional/north, -/obj/structure/bed/roller, +/obj/structure/bed/medical/emergency, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 }, @@ -444,9 +442,7 @@ /area/template_noop) "LW" = ( /obj/structure/window/spawner/directional/north, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, +/obj/item/kirbyplants/organic/plant21, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 }, @@ -464,9 +460,7 @@ /area/template_noop) "PJ" = ( /obj/structure/window/spawner/directional/north, -/obj/item/kirbyplants{ - icon_state = "plant-08" - }, +/obj/item/kirbyplants/organic/plant8, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 }, diff --git a/_maps/templates/lazy_templates/abductor_ships.dmm b/_maps/templates/lazy_templates/abductor_ships.dmm index 0e33b8d39224a..4c7d2e172ff26 100644 --- a/_maps/templates/lazy_templates/abductor_ships.dmm +++ b/_maps/templates/lazy_templates/abductor_ships.dmm @@ -1,4 +1,10 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/open/water, +/area/awaymission/beach) +"ab" = ( +/turf/open/lava, +/area/awaymission/caves) "bX" = ( /turf/closed/indestructible/abductor{ icon_state = "alien11" @@ -592,3 +598,515 @@ bX Zf Xy "} + +(1,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(3,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(4,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(5,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(6,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(7,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(8,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(9,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(10,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(11,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(12,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(13,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(14,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(15,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} + +(1,1,3) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(2,1,3) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(3,1,3) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(4,1,3) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(5,1,3) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(6,1,3) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(7,1,3) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(8,1,3) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(9,1,3) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(10,1,3) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(11,1,3) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(12,1,3) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(13,1,3) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(14,1,3) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(15,1,3) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} diff --git a/_maps/templates/lazy_templates/heretic_sacrifice.dmm b/_maps/templates/lazy_templates/heretic_sacrifice.dmm new file mode 100644 index 0000000000000..cbabb4c648582 --- /dev/null +++ b/_maps/templates/lazy_templates/heretic_sacrifice.dmm @@ -0,0 +1,2026 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ab" = ( +/turf/open/space/basic, +/area/space) +"cd" = ( +/obj/effect/decal/cleanable/ash{ + pixel_x = -8; + pixel_y = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/dirt/jungle/dark{ + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"cS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/bonfire/prelit, +/turf/open/floor/stone, +/area/centcom/heretic_sacrifice/flesh) +"cW" = ( +/obj/structure/no_effect_signpost/void, +/turf/open/misc/asteroid, +/area/centcom/heretic_sacrifice/void) +"dX" = ( +/obj/effect/decal/cleanable/oil, +/turf/open/misc/ashplanet/wateryrock{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"dZ" = ( +/obj/effect/decal/fakelattice{ + density = 0 + }, +/turf/open/misc/ironsand, +/area/centcom/heretic_sacrifice/rust) +"fh" = ( +/obj/structure/cable, +/turf/open/floor/plating, +/area/centcom/heretic_sacrifice/rust) +"fL" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/centcom/heretic_sacrifice/knock) +"fO" = ( +/turf/open/indestructible, +/area/space) +"gJ" = ( +/obj/effect/decal/remains/human, +/turf/open/misc/dirt/jungle/dark{ + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"hE" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/storage/toolbox/mechanical/old, +/turf/open/indestructible/plating, +/area/centcom/heretic_sacrifice/knock) +"hZ" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/necropolis/air, +/area/centcom/heretic_sacrifice/flesh) +"jg" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/structure/cable, +/turf/open/floor/plating/rust, +/area/centcom/heretic_sacrifice/rust) +"jt" = ( +/turf/closed/indestructible/reinforced, +/area/centcom/heretic_sacrifice/knock) +"jB" = ( +/obj/machinery/light/very_dim/directional/south, +/turf/open/misc/asteroid, +/area/centcom/heretic_sacrifice/void) +"lz" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/ashplanet/wateryrock{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"mb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/remains/human, +/turf/open/misc/ironsand, +/area/centcom/heretic_sacrifice/rust) +"mG" = ( +/obj/effect/turf_decal/weather, +/obj/structure/cable, +/turf/open/floor/plating/rust, +/area/centcom/heretic_sacrifice/rust) +"mR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/fakelattice{ + density = 0 + }, +/turf/open/floor/plating, +/area/centcom/heretic_sacrifice/rust) +"mW" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/spear, +/turf/open/indestructible/plating, +/area/centcom/heretic_sacrifice/knock) +"mZ" = ( +/obj/effect/decal/fakelattice{ + density = 0 + }, +/turf/open/floor/plating, +/area/centcom/heretic_sacrifice/rust) +"nG" = ( +/obj/structure/bonfire/prelit, +/turf/open/misc/dirt/jungle/wasteland{ + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"nL" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 10 + }, +/turf/open/misc/ashplanet/wateryrock{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"nP" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/open/misc/dirt/jungle/dark{ + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"oh" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/rust, +/area/centcom/heretic_sacrifice/rust) +"ps" = ( +/obj/effect/turf_decal/weather, +/turf/open/floor/plating, +/area/centcom/heretic_sacrifice/rust) +"pt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/fakelattice{ + density = 0 + }, +/turf/open/misc/ironsand, +/area/centcom/heretic_sacrifice/rust) +"pN" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/effect/decal/cleanable/oil, +/turf/open/misc/ashplanet/wateryrock{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"qn" = ( +/obj/effect/decal/remains/human, +/turf/open/misc/asteroid, +/area/centcom/heretic_sacrifice/void) +"qo" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/storage/toolbox/mechanical/old, +/turf/open/indestructible/plating, +/area/centcom/heretic_sacrifice/knock) +"qu" = ( +/obj/effect/turf_decal/weather/dirt, +/turf/open/misc/ashplanet/wateryrock{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"qM" = ( +/obj/structure/stone_tile/block/cracked, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/misc/ashplanet/wateryrock{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"rP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/necropolis/air, +/area/centcom/heretic_sacrifice/flesh) +"sb" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/misc/ashplanet/wateryrock{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"tF" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/misc/ashplanet/wateryrock{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"ui" = ( +/turf/open/floor/stone, +/area/centcom/heretic_sacrifice/flesh) +"uu" = ( +/obj/effect/turf_decal/trimline/brown/corner{ + dir = 1 + }, +/turf/open/floor/plating/rust, +/area/centcom/heretic_sacrifice/rust) +"uM" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/clothing/under/color/grey/ancient, +/turf/open/indestructible/plating, +/area/centcom/heretic_sacrifice/knock) +"uT" = ( +/obj/structure/cable, +/turf/open/floor/plating/rust, +/area/centcom/heretic_sacrifice/rust) +"vs" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/turf/open/misc/dirt/jungle/dark{ + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"vv" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/misc/ashplanet/wateryrock{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"wo" = ( +/turf/closed/indestructible/grille, +/area/centcom/heretic_sacrifice/knock) +"wt" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/open/misc/dirt/jungle/dark{ + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"wE" = ( +/turf/open/misc/dirt/jungle/wasteland{ + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"wP" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/flashlight/flare{ + fuel = 1e+031; + randomize_fuel = 0; + icon_state = "flare-on"; + on = 1 + }, +/turf/open/indestructible/plating, +/area/centcom/heretic_sacrifice/knock) +"wS" = ( +/turf/open/misc/dirt/jungle/dark{ + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"wY" = ( +/turf/open/floor/glass{ + desc = "A peek into the other side."; + name = "void glass floor" + }, +/area/centcom/heretic_sacrifice/void) +"xc" = ( +/turf/open/indestructible/white, +/area/space) +"yC" = ( +/obj/effect/turf_decal/trimline/brown/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/centcom/heretic_sacrifice/rust) +"zb" = ( +/obj/structure/stone_tile/slab, +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/ashplanet/wateryrock{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"zU" = ( +/obj/effect/decal/fakelattice{ + density = 0 + }, +/turf/open/floor/plating/rust, +/area/centcom/heretic_sacrifice/rust) +"Aw" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/clothing/mask/gas, +/turf/open/indestructible/plating, +/area/centcom/heretic_sacrifice/knock) +"AH" = ( +/obj/effect/turf_decal/trimline/brown/corner, +/turf/open/floor/plating/rust, +/area/centcom/heretic_sacrifice/rust) +"AN" = ( +/obj/machinery/light/floor, +/obj/effect/decal/fakelattice{ + density = 0 + }, +/turf/open/misc/ironsand, +/area/centcom/heretic_sacrifice/rust) +"AO" = ( +/turf/open/floor/fakespace, +/area/centcom/heretic_sacrifice/void) +"AW" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/clothing/mask/gas/tiki_mask/yalp_elor, +/turf/open/indestructible/plating, +/area/centcom/heretic_sacrifice/knock) +"AY" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/centcom/heretic_sacrifice/knock) +"Bv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/brown/line, +/turf/open/floor/plating/rust, +/area/centcom/heretic_sacrifice/rust) +"Bw" = ( +/turf/open/misc/ashplanet/wateryrock{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"By" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating, +/area/centcom/heretic_sacrifice/rust) +"Cf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/weather, +/turf/open/floor/plating/rust, +/area/centcom/heretic_sacrifice/rust) +"Ck" = ( +/obj/effect/turf_decal/trimline/brown/corner{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/centcom/heretic_sacrifice/rust) +"CB" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/stone, +/area/centcom/heretic_sacrifice/flesh) +"CG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/stone, +/area/centcom/heretic_sacrifice/flesh) +"CV" = ( +/obj/effect/decal/cleanable/plasma, +/obj/effect/landmark/heretic/ash, +/turf/open/misc/dirt/jungle/wasteland{ + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"DL" = ( +/obj/structure/stone_tile/block/burnt{ + dir = 4 + }, +/turf/open/misc/dirt/jungle/dark{ + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"En" = ( +/turf/closed/indestructible/fakedoor/maintenance, +/area/centcom/heretic_sacrifice/knock) +"ER" = ( +/turf/open/misc/ironsand, +/area/centcom/heretic_sacrifice/rust) +"Fd" = ( +/turf/closed/indestructible/riveted, +/area/space) +"Gl" = ( +/obj/structure/stone_tile/block/burnt{ + dir = 1 + }, +/turf/open/misc/ashplanet/wateryrock{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"GX" = ( +/obj/effect/landmark/heretic/flesh, +/turf/open/indestructible/necropolis/air, +/area/centcom/heretic_sacrifice/flesh) +"HE" = ( +/obj/effect/turf_decal/weather, +/turf/open/floor/plating/rust, +/area/centcom/heretic_sacrifice/rust) +"HJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/gibspawner/human, +/turf/open/floor/stone, +/area/centcom/heretic_sacrifice/flesh) +"HQ" = ( +/turf/closed/indestructible/necropolis, +/area/centcom/heretic_sacrifice/flesh) +"Ie" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/misc/ashplanet/wateryrock{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"Ii" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/misc/ashplanet/wateryrock{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"Je" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/ironsand, +/area/centcom/heretic_sacrifice/rust) +"Jy" = ( +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/open/misc/ashplanet/wateryrock{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"JJ" = ( +/obj/effect/decal/remains/human, +/turf/open/indestructible/necropolis/air, +/area/centcom/heretic_sacrifice/flesh) +"Ko" = ( +/obj/machinery/light/very_dim/directional/east, +/turf/open/floor/fakespace, +/area/centcom/heretic_sacrifice/void) +"Ku" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/open/misc/dirt/jungle/dark{ + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"Kz" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/dirt/jungle/dark{ + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"KO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/gibspawner/generic/animal, +/obj/structure/bonfire/prelit, +/turf/open/floor/stone, +/area/centcom/heretic_sacrifice/flesh) +"KP" = ( +/obj/structure/stone_tile/surrounding_tile, +/turf/open/misc/ashplanet/wateryrock{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"La" = ( +/turf/closed/indestructible/riveted/plastinum, +/area/centcom/heretic_sacrifice/void) +"LA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/brown/corner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/centcom/heretic_sacrifice/rust) +"Mf" = ( +/obj/effect/decal/cleanable/ash/large, +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/dirt/jungle/wasteland{ + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"Mw" = ( +/obj/machinery/light/very_dim/directional/west, +/turf/open/floor/fakespace, +/area/centcom/heretic_sacrifice/void) +"MZ" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/flashlight/flare{ + fuel = 1e+031; + randomize_fuel = 0; + icon_state = "flare-on"; + on = 1 + }, +/turf/open/indestructible/plating, +/area/centcom/heretic_sacrifice/knock) +"Nh" = ( +/obj/effect/turf_decal/trimline/brown/line{ + dir = 1 + }, +/turf/open/floor/plating/rust, +/area/centcom/heretic_sacrifice/rust) +"NA" = ( +/obj/structure/stone_tile/burnt, +/turf/open/misc/ashplanet/wateryrock{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"NQ" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/misc/ashplanet/wateryrock{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"OD" = ( +/obj/effect/landmark/heretic, +/turf/open/misc/dirt/jungle/wasteland{ + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"OG" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/turf/open/misc/ashplanet/wateryrock{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"OW" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/clothing/under/color/grey/ancient, +/turf/open/indestructible/plating, +/area/centcom/heretic_sacrifice/knock) +"Pl" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/misc/ashplanet/wateryrock{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"Qi" = ( +/obj/structure/stone_tile, +/turf/open/misc/dirt/jungle/dark{ + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"QL" = ( +/obj/effect/decal/cleanable/ash/large{ + pixel_x = -2; + pixel_y = -8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/dirt/jungle/dark{ + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"Rb" = ( +/obj/effect/landmark/heretic/void, +/turf/open/misc/asteroid, +/area/centcom/heretic_sacrifice/void) +"Rh" = ( +/obj/effect/turf_decal/trimline/brown/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/centcom/heretic_sacrifice/rust) +"RW" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/stone, +/area/centcom/heretic_sacrifice/flesh) +"Se" = ( +/turf/open/floor/plating, +/area/centcom/heretic_sacrifice/rust) +"St" = ( +/turf/open/indestructible/necropolis/air, +/area/centcom/heretic_sacrifice/flesh) +"Sy" = ( +/obj/structure/stone_tile/block, +/turf/open/misc/dirt/jungle/dark{ + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"Tf" = ( +/obj/effect/decal/cleanable/food/salt, +/turf/open/indestructible/necropolis/air, +/area/centcom/heretic_sacrifice/flesh) +"TC" = ( +/obj/effect/decal/cleanable/ash, +/turf/open/misc/dirt/jungle/dark{ + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"TS" = ( +/obj/effect/turf_decal/trimline/brown/line{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/centcom/heretic_sacrifice/rust) +"Ue" = ( +/obj/machinery/light/very_dim/directional/north, +/turf/open/floor/fakespace, +/area/centcom/heretic_sacrifice/void) +"UO" = ( +/obj/effect/landmark/heretic/rust, +/turf/open/floor/plating, +/area/centcom/heretic_sacrifice/rust) +"Vd" = ( +/obj/structure/bonfire/prelit, +/turf/open/floor/stone, +/area/centcom/heretic_sacrifice/flesh) +"VK" = ( +/obj/effect/decal/cleanable/ash, +/obj/effect/decal/cleanable/ash{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/dirt/jungle/dark{ + planetary_atmos = 0; + slowdown = 0 + }, +/area/centcom/heretic_sacrifice/ash) +"Wb" = ( +/turf/open/misc/asteroid, +/area/centcom/heretic_sacrifice/void) +"WD" = ( +/turf/closed/indestructible/iron{ + opacity = 1 + }, +/area/centcom/heretic_sacrifice/rust) +"Xk" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/misc/asteroid, +/area/centcom/heretic_sacrifice/void) +"Xr" = ( +/turf/open/floor/plating/rust, +/area/centcom/heretic_sacrifice/rust) +"Xt" = ( +/obj/effect/gibspawner/generic/animal, +/turf/open/floor/stone, +/area/centcom/heretic_sacrifice/flesh) +"Yp" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/necropolis/air, +/area/centcom/heretic_sacrifice/flesh) +"Zw" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/landmark/heretic/knock, +/turf/open/indestructible/plating, +/area/centcom/heretic_sacrifice/knock) +"ZA" = ( +/turf/closed/indestructible/riveted/boss, +/area/centcom/heretic_sacrifice/ash) + +(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 +"} +(2,1,1) = {" +ab +ab +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +ab +"} +(3,1,1) = {" +ab +ab +Fd +jt +jt +wo +wo +jt +En +En +jt +wo +wo +jt +jt +Fd +ZA +ZA +ZA +ZA +ZA +ZA +ZA +ZA +ZA +ZA +ZA +ZA +Fd +La +La +La +La +La +La +La +La +La +La +La +La +Fd +ab +"} +(4,1,1) = {" +ab +ab +Fd +jt +AY +AY +AY +AY +AY +AY +AY +AY +fL +AY +jt +Fd +ZA +Pl +wS +Ii +Bw +Bw +Bw +Bw +Pl +wS +Ii +ZA +Fd +La +AO +AO +AO +AO +Mw +AO +AO +AO +wY +Wb +La +Fd +ab +"} +(5,1,1) = {" +ab +ab +Fd +wo +AY +fL +uM +AY +AY +qo +fL +AY +mW +MZ +wo +Fd +ZA +wS +nG +VK +sb +Bw +Bw +Bw +Qi +nG +Kz +ZA +Fd +La +AO +wY +AO +AO +AO +AO +AO +AO +AO +wY +La +Fd +ab +"} +(6,1,1) = {" +ab +ab +Fd +wo +AY +Aw +fL +AY +wP +fL +fL +AY +qo +AY +wo +Fd +ZA +OG +cd +pN +Bw +Bw +vv +Bw +OG +TC +tF +ZA +Fd +La +wY +cW +wY +AO +AO +AO +AO +AO +AO +AO +La +Fd +ab +"} +(7,1,1) = {" +ab +ab +Fd +jt +AY +fL +fL +AY +AY +fL +AY +AY +fL +Aw +jt +Fd +ZA +Bw +Bw +Bw +Pl +nP +nP +Ii +Bw +Bw +Bw +ZA +Fd +La +AO +wY +AO +AO +wY +wY +AO +AO +AO +wY +La +Fd +ab +"} +(8,1,1) = {" +ab +ab +Fd +En +AY +MZ +fL +AY +Zw +OW +AY +AY +AY +fL +En +Fd +ZA +Bw +Bw +qu +vs +wE +Mf +Sy +NQ +lz +lz +ZA +Fd +La +AO +AO +AO +wY +Wb +Rb +wY +AO +wY +jB +La +Fd +ab +"} +(9,1,1) = {" +ab +ab +Fd +En +fL +AY +AY +AY +fL +fL +AY +AY +fL +AY +En +Fd +ZA +Bw +Bw +Bw +wt +CV +OD +Sy +NQ +lz +Bw +ZA +Fd +La +Ue +AO +AO +wY +Xk +Wb +wY +AO +wY +Wb +La +Fd +ab +"} +(10,1,1) = {" +ab +ab +Fd +jt +AY +AY +fL +AY +fL +AY +fL +AY +AW +fL +jt +Fd +ZA +Bw +Bw +Bw +OG +DL +Ku +Ie +Bw +dX +Bw +ZA +Fd +La +AO +AO +AO +AO +wY +wY +AO +AO +wY +Wb +La +Fd +ab +"} +(11,1,1) = {" +ab +ab +Fd +wo +fL +AY +hE +MZ +AY +AY +hE +fL +wP +AY +wo +Fd +ZA +Pl +gJ +qM +Bw +Bw +nL +lz +Pl +Kz +Ii +ZA +Fd +La +wY +AO +AO +AO +AO +AO +AO +AO +AO +wY +La +Fd +ab +"} +(12,1,1) = {" +ab +ab +Fd +wo +AY +fL +AY +AY +AY +fL +AY +OW +fL +fL +wo +Fd +ZA +wS +nG +Sy +lz +Gl +zb +NA +QL +nG +wS +ZA +Fd +La +Wb +wY +AO +AO +AO +AO +AO +wY +AO +AO +La +Fd +ab +"} +(13,1,1) = {" +ab +ab +Fd +jt +AY +AY +fL +fL +AY +AY +AY +AY +AY +AY +jt +Fd +ZA +OG +wS +tF +Bw +Jy +KP +Bw +OG +wS +tF +ZA +Fd +La +Wb +Xk +wY +AO +AO +Ko +wY +qn +wY +AO +La +Fd +ab +"} +(14,1,1) = {" +ab +ab +Fd +jt +jt +wo +wo +jt +En +En +jt +wo +wo +jt +jt +Fd +ZA +ZA +ZA +ZA +ZA +ZA +ZA +ZA +ZA +ZA +ZA +ZA +Fd +La +La +La +La +La +La +La +La +La +La +La +La +Fd +ab +"} +(15,1,1) = {" +ab +ab +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +ab +"} +(16,1,1) = {" +ab +ab +Fd +fO +fO +fO +fO +fO +fO +fO +fO +fO +fO +fO +fO +Fd +WD +WD +WD +WD +WD +WD +WD +WD +WD +WD +WD +WD +Fd +HQ +HQ +HQ +HQ +HQ +HQ +HQ +HQ +HQ +HQ +HQ +HQ +Fd +ab +"} +(17,1,1) = {" +ab +ab +Fd +fO +fO +fO +fO +fO +fO +xc +xc +xc +xc +xc +fO +Fd +WD +dZ +dZ +dZ +ER +Je +fh +Xr +Xr +Xr +Xr +WD +Fd +HQ +St +ui +St +St +St +Yp +Yp +St +ui +St +HQ +Fd +ab +"} +(18,1,1) = {" +ab +ab +Fd +fO +fO +fO +fO +fO +fO +fO +fO +xc +fO +fO +fO +Fd +WD +dZ +AN +mb +HE +oh +fh +Xr +ps +AN +Xr +WD +Fd +HQ +Xt +cS +RW +ui +ui +ui +RW +Xt +Vd +ui +HQ +Fd +ab +"} +(19,1,1) = {" +ab +ab +Fd +fO +fO +fO +fO +fO +fO +xc +xc +xc +xc +xc +fO +Fd +WD +ER +mG +jg +fh +fh +uT +By +dZ +pt +ER +WD +Fd +HQ +St +CB +JJ +ui +St +St +ui +hZ +ui +St +HQ +Fd +ab +"} +(20,1,1) = {" +ab +ab +Fd +fO +fO +fO +fO +fO +fO +fO +fO +fO +fO +fO +fO +Fd +WD +Se +mR +zU +AH +Rh +Rh +LA +ER +ps +Je +WD +Fd +HQ +St +ui +ui +HJ +RW +RW +ui +RW +RW +St +HQ +Fd +ab +"} +(21,1,1) = {" +ab +ab +Fd +fO +fO +fO +fO +fO +fO +xc +fO +xc +xc +xc +fO +Fd +WD +Xr +mZ +Se +Bv +Xr +Xr +Nh +Xr +Se +Se +WD +Fd +HQ +St +RW +St +ui +hZ +Tf +ui +St +RW +St +HQ +Fd +ab +"} +(22,1,1) = {" +ab +ab +Fd +fO +fO +fO +fO +fO +fO +fO +fO +fO +fO +fO +fO +Fd +WD +Se +Se +Xr +Bv +UO +Se +yC +Se +zU +Xr +WD +Fd +HQ +St +RW +Yp +ui +GX +Yp +ui +JJ +ui +St +HQ +Fd +ab +"} +(23,1,1) = {" +ab +ab +Fd +fO +fO +fO +fO +fO +fO +fO +fO +fO +fO +fO +fO +Fd +WD +Xr +oh +Xr +Ck +TS +TS +uu +Xr +Xr +HE +WD +Fd +HQ +St +ui +ui +ui +ui +RW +CG +ui +ui +St +HQ +Fd +ab +"} +(24,1,1) = {" +ab +ab +Fd +fO +fO +fO +fO +fO +fO +fO +fO +fO +fO +fO +fO +Fd +WD +ps +Se +Se +By +Se +oh +Xr +ps +pt +ER +WD +Fd +HQ +hZ +ui +St +ui +St +St +ui +rP +ui +St +HQ +Fd +ab +"} +(25,1,1) = {" +ab +ab +Fd +fO +fO +fO +fO +fO +fO +fO +fO +fO +fO +fO +fO +Fd +WD +Je +AN +Cf +oh +mR +zU +ps +ER +AN +ER +WD +Fd +HQ +RW +KO +ui +ui +RW +ui +ui +RW +cS +ui +HQ +Fd +ab +"} +(26,1,1) = {" +ab +ab +Fd +fO +fO +fO +fO +fO +fO +fO +fO +fO +fO +fO +fO +Fd +WD +ER +pt +ER +HE +Xr +Se +Se +Je +ER +Xr +WD +Fd +HQ +St +ui +JJ +Yp +Yp +St +St +Yp +Xt +St +HQ +Fd +ab +"} +(27,1,1) = {" +ab +ab +Fd +fO +fO +fO +fO +fO +fO +fO +fO +fO +fO +fO +fO +Fd +WD +WD +WD +WD +WD +WD +WD +WD +WD +WD +WD +WD +Fd +HQ +HQ +HQ +HQ +HQ +HQ +HQ +HQ +HQ +HQ +HQ +HQ +Fd +ab +"} +(28,1,1) = {" +ab +ab +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +Fd +ab +"} +(29,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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/templates/lazy_templates/ninja_den.dmm b/_maps/templates/lazy_templates/ninja_den.dmm index 156fe7550219f..eb0785ade46c4 100644 --- a/_maps/templates/lazy_templates/ninja_den.dmm +++ b/_maps/templates/lazy_templates/ninja_den.dmm @@ -1,18 +1,52 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"af" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/chair/sofa/corp/left{ + dir = 4; + pixel_x = -4 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/holding) "al" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 }, /turf/open/floor/carpet/black, /area/centcom/central_command_areas/holding) -"aw" = ( -/obj/item/kirbyplants{ - icon_state = "plant-10" +"au" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/obj/machinery/light/small/directional/north, -/obj/structure/sign/painting/library{ - pixel_y = 32 +/obj/structure/rack, +/obj/item/toy/gun{ + pixel_y = 2 + }, +/obj/item/toy/balloon/syndicate{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/item/toy/balloon/syndicate{ + pixel_x = 8; + pixel_y = 2 }, +/obj/item/toy/balloon/syndicate{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/item/clothing/under/misc/syndicate_souvenir{ + pixel_y = -5 + }, +/obj/item/clothing/under/misc/syndicate_souvenir{ + pixel_y = -5 + }, +/obj/item/clothing/under/misc/syndicate_souvenir{ + pixel_y = -5 + }, +/obj/effect/turf_decal/tile/dark/fourcorners, +/obj/machinery/light/small/directional/east, /turf/open/floor/iron/sepia, /area/centcom/central_command_areas/holding) "ay" = ( @@ -32,6 +66,12 @@ }, /turf/open/floor/vault/rock, /area/centcom/central_command_areas/holding) +"be" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/holding) "bl" = ( /turf/open/floor/bamboo/tatami/purple, /area/centcom/central_command_areas/holding) @@ -39,6 +79,15 @@ /obj/machinery/photocopier, /turf/open/floor/catwalk_floor, /area/centcom/central_command_areas/holding) +"bO" = ( +/obj/structure/flora/rock/pile/jungle/style_random{ + pixel_x = -12; + pixel_y = 15 + }, +/turf/open/misc/ashplanet/wateryrock{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + }, +/area/centcom/central_command_areas/holding) "bP" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/paper_bin, @@ -79,6 +128,11 @@ }, /turf/open/floor/carpet/black, /area/centcom/central_command_areas/holding) +"cK" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green, +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/holding) "cQ" = ( /obj/effect/turf_decal/siding/wood, /obj/effect/turf_decal/siding/wood{ @@ -120,10 +174,10 @@ "dg" = ( /turf/closed/wall/mineral/wood, /area/centcom/central_command_areas/holding) -"dj" = ( -/obj/structure/table/wood/fancy/royalblack, -/obj/item/book/bible, -/turf/open/floor/wood/large, +"dv" = ( +/obj/item/kirbyplants/organic/plant10, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/sepia, /area/centcom/central_command_areas/holding) "dy" = ( /obj/machinery/light/small/directional/west, @@ -159,11 +213,10 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/large, /area/centcom/central_command_areas/holding) -"fj" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/bamboo/tatami/purple{ - dir = 1 - }, +"eo" = ( +/obj/item/kirbyplants/organic/plant10, +/obj/machinery/duct, +/turf/open/floor/carpet/black, /area/centcom/central_command_areas/holding) "fu" = ( /obj/effect/turf_decal/siding/wood{ @@ -174,20 +227,6 @@ }, /turf/open/floor/eighties/red, /area/centcom/central_command_areas/holding) -"fG" = ( -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, -/turf/open/floor/wood/parquet, -/area/centcom/central_command_areas/holding) -"fV" = ( -/obj/effect/turf_decal/siding/wood, -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, -/obj/effect/turf_decal/tile/dark/opposingcorners, -/turf/open/floor/iron/sepia, -/area/centcom/central_command_areas/holding) "ga" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/toy/mecha/phazon, @@ -195,13 +234,6 @@ dir = 8 }, /area/centcom/central_command_areas/holding) -"gc" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/chair/sofa/corp/left{ - pixel_y = 6 - }, -/turf/open/floor/carpet/black, -/area/centcom/central_command_areas/holding) "gd" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/toy/katana{ @@ -236,6 +268,12 @@ }, /turf/open/floor/iron/sepia, /area/centcom/central_command_areas/holding) +"ha" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/bamboo/tatami/purple{ + dir = 8 + }, +/area/centcom/central_command_areas/holding) "hi" = ( /obj/structure/bed, /obj/item/bedsheet/syndie, @@ -243,19 +281,14 @@ dir = 4 }, /area/centcom/central_command_areas/holding) -"hl" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, -/turf/open/floor/carpet/black, -/area/centcom/central_command_areas/holding) "hm" = ( /obj/machinery/vending/clothing, /turf/open/floor/wood/parquet, /area/centcom/central_command_areas/holding) +"hn" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/holding) "ho" = ( /obj/structure/chair/pew/left{ dir = 8 @@ -266,6 +299,13 @@ /obj/machinery/duct, /turf/open/floor/carpet/black, /area/centcom/central_command_areas/holding) +"hs" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/kirbyplants/organic/plant10, +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/holding) "ht" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -277,8 +317,11 @@ /obj/machinery/computer/libraryconsole/bookmanagement, /turf/open/floor/carpet/black, /area/centcom/central_command_areas/holding) -"hz" = ( -/obj/structure/bookcase/random/reference, +"hw" = ( +/obj/item/kirbyplants/organic/plant10, +/obj/structure/sign/painting/library{ + pixel_y = 32 + }, /turf/open/floor/carpet/black, /area/centcom/central_command_areas/holding) "hH" = ( @@ -318,6 +361,10 @@ /obj/machinery/gibber, /turf/open/floor/catwalk_floor, /area/centcom/central_command_areas/holding) +"iW" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/stairs/medium, +/area/centcom/central_command_areas/holding) "jb" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -393,12 +440,6 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/tile, /area/centcom/central_command_areas/holding) -"ku" = ( -/obj/structure/table/wood, -/obj/item/toy/plush/goatplushie, -/obj/machinery/light/directional/north, -/turf/open/floor/carpet/black, -/area/centcom/central_command_areas/holding) "kI" = ( /turf/closed/indestructible/fakedoor{ name = "Guest House Entrance" @@ -441,19 +482,6 @@ }, /turf/open/floor/carpet/black, /area/centcom/central_command_areas/holding) -"lp" = ( -/obj/structure/flora/rock/pile/jungle/style_random{ - pixel_x = -12; - pixel_y = 15 - }, -/obj/machinery/light/floor{ - pixel_x = 4; - pixel_y = -4 - }, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" - }, -/area/centcom/central_command_areas/holding) "lx" = ( /obj/machinery/light/small/directional/north, /obj/structure/easel, @@ -485,19 +513,37 @@ "lP" = ( /turf/open/floor/bamboo/tatami/black, /area/centcom/central_command_areas/holding) -"mb" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/bamboo/tatami/black{ - dir = 4 - }, +"lV" = ( +/obj/structure/table/wood/fancy/royalblack, +/obj/item/book/bible, +/obj/machinery/light/directional/north, +/turf/open/floor/wood/large, /area/centcom/central_command_areas/holding) "mj" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/iron/sepia, /area/centcom/central_command_areas/holding) +"mr" = ( +/obj/item/kirbyplants/organic/plant10, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/holding) "mw" = ( /turf/open/floor/wood/large, /area/centcom/central_command_areas/holding) +"ni" = ( +/obj/structure/rack, +/obj/item/nullrod/claymore/saber/red{ + damtype = "stamina"; + force = 30 + }, +/obj/item/nullrod/claymore/katana{ + damtype = "stamina"; + force = 30; + pixel_x = -8; + pixel_y = -1 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/holding) "nt" = ( /obj/structure/flora/rock/pile/style_random, /turf/open/misc/ironsand{ @@ -509,15 +555,40 @@ /obj/structure/sink/kitchen/directional/west, /turf/open/floor/iron/cafeteria, /area/centcom/central_command_areas/holding) -"nJ" = ( +"nR" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/stairs/medium, +/area/centcom/central_command_areas/holding) +"nW" = ( +/obj/machinery/light/warm/directional/west, +/turf/open/water{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + }, +/area/centcom/central_command_areas/holding) +"od" = ( /obj/effect/turf_decal/siding/wood{ - dir = 4 + dir = 1 }, -/obj/structure/chair/sofa/corp/left{ - dir = 4; - pixel_x = -4 +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/storage/basket, +/obj/effect/turf_decal/tile/dark/fourcorners, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/sepia, +/area/centcom/central_command_areas/holding) +"oh" = ( +/obj/machinery/light/directional/south, +/obj/structure/rack, +/obj/item/nullrod/vibro{ + damtype = "stamina"; + force = 30; + pixel_x = 5; + pixel_y = -2 }, -/turf/open/floor/carpet/black, +/obj/item/nullrod/claymore/glowing{ + damtype = "stamina"; + force = 30 + }, +/turf/open/floor/wood/parquet, /area/centcom/central_command_areas/holding) "os" = ( /obj/machinery/shower/directional/south, @@ -566,24 +637,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/wood/parquet, /area/centcom/central_command_areas/holding) -"oZ" = ( -/obj/structure/closet/secure_closet/freezer/fridge/open, -/obj/item/food/grown/chili, -/obj/item/food/grown/chili, -/obj/item/food/grown/chili, -/obj/item/food/grown/chili, -/obj/item/food/grown/chili, -/obj/item/reagent_containers/condiment/milk, -/obj/item/reagent_containers/condiment/milk, -/obj/item/reagent_containers/condiment/soymilk, -/obj/item/reagent_containers/condiment/soymilk, -/obj/item/storage/fancy/egg_box, -/obj/item/food/grown/citrus/lime, -/obj/item/food/grown/citrus/orange, -/obj/item/food/grown/citrus/lemon, -/obj/item/food/grown/watermelon, -/turf/open/floor/carpet/black, -/area/centcom/central_command_areas/holding) "pp" = ( /obj/effect/landmark/holding_facility, /turf/open/floor/wood/large, @@ -611,11 +664,22 @@ }, /turf/open/floor/catwalk_floor, /area/centcom/central_command_areas/holding) -"pC" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/bamboo/tatami/black{ - dir = 1 +"pB" = ( +/obj/structure/rack, +/obj/item/nullrod/claymore{ + damtype = "stamina"; + force = 30; + pixel_x = 4; + pixel_y = -1 + }, +/obj/item/nullrod/claymore/darkblade{ + damtype = "stamina"; + force = 30; + pixel_x = -3; + pixel_y = 3 }, +/obj/machinery/light/directional/north, +/turf/open/floor/wood/parquet, /area/centcom/central_command_areas/holding) "pK" = ( /obj/effect/turf_decal/siding/wood{ @@ -642,6 +706,21 @@ initial_gas_mix = "TEMP=2.7" }, /area/centcom/central_command_areas/holding) +"pX" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/bamboo/tatami/black{ + dir = 1 + }, +/area/centcom/central_command_areas/holding) +"qg" = ( +/obj/machinery/light/warm/directional/east, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/obj/item/kirbyplants/organic/plant10, +/turf/open/floor/stone, +/area/centcom/central_command_areas/holding) "qi" = ( /obj/machinery/hydroponics/constructable, /turf/open/floor/grass, @@ -691,15 +770,6 @@ }, /turf/open/floor/wood/tile, /area/centcom/central_command_areas/holding) -"qK" = ( -/obj/machinery/light/floor{ - pixel_x = 4; - pixel_y = 4 - }, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" - }, -/area/centcom/central_command_areas/holding) "qT" = ( /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -710,16 +780,6 @@ }, /turf/open/floor/catwalk_floor, /area/centcom/central_command_areas/holding) -"qW" = ( -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, -/turf/open/floor/bamboo/tatami/purple, -/area/centcom/central_command_areas/holding) -"ra" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/wood/large, -/area/centcom/central_command_areas/holding) "rj" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -732,6 +792,20 @@ }, /turf/open/floor/iron/sepia, /area/centcom/central_command_areas/holding) +"rn" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/beer{ + dir = 4; + pixel_x = -8; + pixel_y = 1 + }, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = 7; + pixel_y = -4 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/holding) "rz" = ( /obj/structure/flora/bush/flowers_yw/style_random, /obj/structure/flora/bush/flowers_br/style_random, @@ -754,37 +828,12 @@ dir = 8 }, /area/centcom/central_command_areas/holding) -"rV" = ( -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, -/turf/open/floor/carpet/black, -/area/centcom/central_command_areas/holding) "sc" = ( /obj/structure/sink/directional/west, /obj/structure/mirror/directional/east, /obj/machinery/light/small/directional/south, /turf/open/floor/iron/showroomfloor, /area/centcom/central_command_areas/holding) -"sl" = ( -/obj/structure/reagent_dispensers/plumbed, -/obj/machinery/light/small/directional/south, -/turf/open/floor/carpet/black, -/area/centcom/central_command_areas/holding) -"sQ" = ( -/obj/machinery/vending/dinnerware, -/turf/open/floor/iron/sepia, -/area/centcom/central_command_areas/holding) -"sW" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood, -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, -/turf/open/floor/stone, -/area/centcom/central_command_areas/holding) "ts" = ( /obj/item/food/meat/slab/chicken, /obj/item/food/meat/slab/chicken, @@ -847,37 +896,42 @@ dir = 4 }, /area/centcom/central_command_areas/holding) -"vv" = ( -/obj/item/kirbyplants{ - icon_state = "plant-10" +"vr" = ( +/obj/structure/rack, +/obj/item/nullrod/claymore/saber{ + damtype = "stamina"; + force = 30; + pixel_x = 5; + pixel_y = -3 }, -/turf/open/floor/wood/large, +/obj/item/nullrod/claymore/katana{ + damtype = "stamina"; + force = 30 + }, +/turf/open/floor/wood/parquet, /area/centcom/central_command_areas/holding) "vA" = ( /obj/machinery/seed_extractor, /turf/open/floor/wood/tile, /area/centcom/central_command_areas/holding) -"vH" = ( -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/sepia, -/area/centcom/central_command_areas/holding) "vS" = ( /obj/structure/table/wood, /obj/item/paper_bin, /obj/item/pen/fountain, /turf/open/floor/carpet/black, /area/centcom/central_command_areas/holding) -"wK" = ( -/obj/machinery/light/floor{ - pixel_x = -4; - pixel_y = -4 - }, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" +"wc" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/chair/sofa/corp/left{ + pixel_y = 6 }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/holding) +"wq" = ( +/obj/structure/closet/crate/freezer/blood, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/sepia, /area/centcom/central_command_areas/holding) "wU" = ( /turf/open/floor/wood/parquet, @@ -891,10 +945,6 @@ }, /turf/open/floor/carpet/black, /area/centcom/central_command_areas/holding) -"xi" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/carpet/black, -/area/centcom/central_command_areas/holding) "xj" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/closet/crate/bin, @@ -941,13 +991,6 @@ }, /turf/open/floor/iron/sepia, /area/centcom/central_command_areas/holding) -"yb" = ( -/obj/structure/chair/comfy/black{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/carpet/black, -/area/centcom/central_command_areas/holding) "yg" = ( /obj/structure/flora/rock/pile/jungle/large/style_random, /turf/open/misc/beach/sand, @@ -968,19 +1011,32 @@ /obj/structure/chair/stool/directional/west, /turf/open/misc/beach/sand, /area/centcom/central_command_areas/holding) -"yJ" = ( +"zc" = ( /obj/structure/table/wood, -/obj/machinery/chem_dispenser/drinks/beer{ - dir = 4; - pixel_x = -8; - pixel_y = 1 - }, -/obj/item/reagent_containers/cup/beaker{ - pixel_x = 7; - pixel_y = -4 +/obj/machinery/microwave{ + pixel_y = 6 }, /turf/open/floor/carpet/black, /area/centcom/central_command_areas/holding) +"zh" = ( +/obj/structure/closet/secure_closet/freezer/fridge/open, +/obj/item/food/grown/chili, +/obj/item/food/grown/chili, +/obj/item/food/grown/chili, +/obj/item/food/grown/chili, +/obj/item/food/grown/chili, +/obj/item/reagent_containers/condiment/milk, +/obj/item/reagent_containers/condiment/milk, +/obj/item/reagent_containers/condiment/soymilk, +/obj/item/reagent_containers/condiment/soymilk, +/obj/item/storage/fancy/egg_box, +/obj/item/food/grown/citrus/lime, +/obj/item/food/grown/citrus/orange, +/obj/item/food/grown/citrus/lemon, +/obj/item/food/grown/watermelon, +/obj/machinery/light/small/directional/west, +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/holding) "zB" = ( /obj/machinery/vending/coffee{ default_price = 0; @@ -1001,6 +1057,12 @@ /obj/structure/window/reinforced/fulltile, /turf/open/floor/grass, /area/centcom/central_command_areas/holding) +"zU" = ( +/obj/structure/table/wood, +/obj/item/toy/plush/goatplushie, +/obj/machinery/light/small/directional/north, +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/holding) "Af" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -1027,21 +1089,6 @@ /obj/item/knife/kitchen, /turf/open/floor/iron/cafeteria, /area/centcom/central_command_areas/holding) -"Aq" = ( -/obj/structure/rack, -/obj/item/nullrod/claymore/saber/red{ - damtype = "stamina"; - force = 30 - }, -/obj/item/nullrod/claymore/katana{ - damtype = "stamina"; - force = 30; - pixel_x = -8; - pixel_y = -1 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/wood/parquet, -/area/centcom/central_command_areas/holding) "Ar" = ( /obj/structure/sink/kitchen/directional/west, /obj/item/reagent_containers/cup/bucket, @@ -1064,38 +1111,11 @@ dir = 1 }, /area/centcom/central_command_areas/holding) -"AT" = ( -/obj/effect/turf_decal/siding/wood{ +"AP" = ( +/obj/item/kirbyplants/organic/plant10, +/turf/open/floor/bamboo/tatami/purple{ dir = 1 }, -/obj/machinery/light/directional/east, -/obj/structure/rack, -/obj/item/toy/gun{ - pixel_y = 2 - }, -/obj/item/toy/balloon/syndicate{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/toy/balloon/syndicate{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/toy/balloon/syndicate{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/clothing/under/misc/syndicate_souvenir{ - pixel_y = -5 - }, -/obj/item/clothing/under/misc/syndicate_souvenir{ - pixel_y = -5 - }, -/obj/item/clothing/under/misc/syndicate_souvenir{ - pixel_y = -5 - }, -/obj/effect/turf_decal/tile/dark/fourcorners, -/turf/open/floor/iron/sepia, /area/centcom/central_command_areas/holding) "Bn" = ( /obj/effect/turf_decal/siding/wood{ @@ -1127,30 +1147,11 @@ }, /turf/open/floor/iron/cafeteria, /area/centcom/central_command_areas/holding) -"Ca" = ( -/obj/structure/chair/comfy/black{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/carpet/black, -/area/centcom/central_command_areas/holding) "Cb" = ( /obj/machinery/vending/hydroseeds, /obj/machinery/light/small/directional/south, /turf/open/floor/wood/tile, /area/centcom/central_command_areas/holding) -"Cr" = ( -/obj/structure/bed/dogbed/cayenne{ - name = "Paprika's bed" - }, -/mob/living/basic/carp/pet/cayenne{ - desc = "It's Paprika! One of the Spider Clan's lovable Space Carp!"; - faction = list("neutral"); - name = "Paprika"; - real_name = "Paprika" - }, -/turf/open/floor/carpet/black, -/area/centcom/central_command_areas/holding) "CD" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -1179,10 +1180,6 @@ /obj/effect/turf_decal/tile/dark/fourcorners, /turf/open/floor/iron/sepia, /area/centcom/central_command_areas/holding) -"Dk" = ( -/obj/structure/closet/crate/freezer/blood, -/turf/open/floor/iron/sepia, -/area/centcom/central_command_areas/holding) "Do" = ( /obj/effect/turf_decal/siding/wood, /obj/effect/turf_decal/siding/wood{ @@ -1205,6 +1202,15 @@ }, /turf/open/floor/grass, /area/centcom/central_command_areas/holding) +"DF" = ( +/obj/item/kirbyplants/organic/plant10, +/turf/open/floor/bamboo/tatami/purple, +/area/centcom/central_command_areas/holding) +"DG" = ( +/obj/structure/closet/crate/freezer/blood, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/sepia, +/area/centcom/central_command_areas/holding) "DI" = ( /turf/open/floor/iron/sepia, /area/centcom/central_command_areas/holding) @@ -1253,6 +1259,10 @@ initial_gas_mix = "o2=22;n2=82;TEMP=293.15" }, /area/centcom/central_command_areas/holding) +"EC" = ( +/obj/item/kirbyplants/organic/plant10, +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/holding) "EJ" = ( /obj/item/mop, /obj/structure/sink/kitchen/directional/west, @@ -1267,6 +1277,13 @@ dir = 4 }, /area/centcom/central_command_areas/holding) +"FB" = ( +/obj/machinery/modular_computer/preset/research{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/catwalk_floor, +/area/centcom/central_command_areas/holding) "FE" = ( /turf/open/floor/catwalk_floor, /area/centcom/central_command_areas/holding) @@ -1333,6 +1350,19 @@ }, /turf/open/floor/carpet/black, /area/centcom/central_command_areas/holding) +"GN" = ( +/obj/structure/bed/dogbed/cayenne{ + name = "Paprika's bed" + }, +/mob/living/basic/carp/pet/cayenne{ + desc = "It's Paprika! One of the Spider Clan's lovable Space Carp!"; + faction = list("neutral"); + name = "Paprika"; + real_name = "Paprika" + }, +/obj/machinery/light/warm/directional/south, +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/holding) "GO" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -1445,15 +1475,6 @@ /obj/item/paper/guides/jobs/hydroponics, /turf/open/floor/wood/tile, /area/centcom/central_command_areas/holding) -"Je" = ( -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, -/obj/structure/sign/painting/library{ - pixel_y = 32 - }, -/turf/open/floor/carpet/black, -/area/centcom/central_command_areas/holding) "Jf" = ( /obj/structure/table/reinforced/rglass, /obj/item/wrench{ @@ -1531,6 +1552,11 @@ }, /turf/open/floor/wood/tile, /area/centcom/central_command_areas/holding) +"JL" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood/tile, +/area/centcom/central_command_areas/holding) "JR" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -1590,6 +1616,11 @@ dir = 8 }, /area/centcom/central_command_areas/holding) +"LE" = ( +/obj/machinery/vending/dinnerware, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/iron/sepia, +/area/centcom/central_command_areas/holding) "LK" = ( /turf/closed/indestructible/weeb, /area/centcom/central_command_areas/holding) @@ -1610,11 +1641,18 @@ }, /turf/open/floor/iron/cafeteria, /area/centcom/central_command_areas/holding) +"My" = ( +/obj/item/kirbyplants/organic/plant10, +/obj/structure/sign/painting/library{ + pixel_y = 32 + }, +/turf/open/floor/iron/sepia, +/area/centcom/central_command_areas/holding) "Mz" = ( /obj/structure/closet, -/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/item/surgery_tray/full, /obj/machinery/iv_drip, -/obj/item/roller, +/obj/item/emergency_bed, /obj/item/storage/medkit/regular, /obj/item/reagent_containers/medigel/synthflesh, /obj/item/reagent_containers/medigel/synthflesh, @@ -1645,36 +1683,6 @@ /obj/item/food/grown/soybeans, /turf/open/floor/carpet/black, /area/centcom/central_command_areas/holding) -"MW" = ( -/obj/structure/table/wood, -/obj/machinery/microwave{ - pixel_y = 6 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/carpet/black, -/area/centcom/central_command_areas/holding) -"MX" = ( -/obj/structure/rack, -/obj/item/nullrod/claymore/saber{ - damtype = "stamina"; - force = 30; - pixel_x = 5; - pixel_y = -3 - }, -/obj/item/nullrod/claymore/katana{ - damtype = "stamina"; - force = 30 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/wood/parquet, -/area/centcom/central_command_areas/holding) -"Nh" = ( -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, -/obj/machinery/duct, -/turf/open/floor/carpet/black, -/area/centcom/central_command_areas/holding) "Nt" = ( /obj/structure/table/wood, /obj/machinery/chem_dispenser/drinks{ @@ -1695,6 +1703,10 @@ }, /turf/open/misc/sandy_dirt, /area/centcom/central_command_areas/holding) +"ND" = ( +/obj/item/kirbyplants/organic/plant10, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/holding) "NF" = ( /turf/open/floor/bamboo/tatami/black{ dir = 4 @@ -1721,6 +1733,14 @@ dir = 1 }, /area/centcom/central_command_areas/holding) +"Od" = ( +/obj/item/kirbyplants/organic/plant10, +/obj/machinery/light/small/directional/north, +/obj/structure/sign/painting/library{ + pixel_y = 32 + }, +/turf/open/floor/iron/sepia, +/area/centcom/central_command_areas/holding) "Ok" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -1730,20 +1750,15 @@ }, /turf/open/floor/stone, /area/centcom/central_command_areas/holding) -"Oy" = ( -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, +"Oo" = ( +/obj/item/kirbyplants/organic/plant10, /obj/machinery/light/directional/south, /turf/open/floor/wood/large, /area/centcom/central_command_areas/holding) -"OA" = ( -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, -/turf/open/floor/bamboo/tatami/purple{ - dir = 1 - }, +"Op" = ( +/obj/structure/bookcase/random/fiction, +/obj/machinery/light/small/directional/east, +/turf/open/floor/carpet/black, /area/centcom/central_command_areas/holding) "OC" = ( /obj/effect/turf_decal/siding/wood{ @@ -1751,6 +1766,11 @@ }, /turf/open/misc/sandy_dirt, /area/centcom/central_command_areas/holding) +"OQ" = ( +/obj/structure/bookcase/random/reference, +/obj/machinery/light/small/directional/west, +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/holding) "Pl" = ( /obj/structure/flora/bush/flowers_yw/style_random, /obj/structure/flora/tree/jungle/small/style_random, @@ -1760,6 +1780,12 @@ /obj/structure/sign/poster/contraband/syndicate_recruitment/directional/south, /turf/open/floor/wood/large, /area/centcom/central_command_areas/holding) +"PH" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/holding) "PK" = ( /obj/structure/table/reinforced/rglass, /obj/item/shovel/spade{ @@ -1774,20 +1800,20 @@ /obj/item/instrument/saxophone, /turf/open/floor/wood/parquet, /area/centcom/central_command_areas/holding) -"PX" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/wood/tile, +"Qt" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/carpet/black, /area/centcom/central_command_areas/holding) "Qu" = ( /obj/machinery/defibrillator_mount/directional/south, /obj/machinery/stasis, /turf/open/floor/iron/sepia, /area/centcom/central_command_areas/holding) -"QV" = ( -/obj/structure/table/wood, -/obj/machinery/light/directional/south, -/obj/item/flashlight/lamp/green, -/turf/open/floor/carpet/black, +"QJ" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/kirbyplants/organic/plant10, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/turf/open/floor/iron/sepia, /area/centcom/central_command_areas/holding) "QW" = ( /obj/structure/table/wood/fancy/royalblack, @@ -1859,10 +1885,6 @@ "Sc" = ( /turf/open/floor/stone, /area/centcom/central_command_areas/holding) -"So" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/carpet/black, -/area/centcom/central_command_areas/holding) "Tc" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/chair/sofa/corp/right{ @@ -1905,20 +1927,6 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/tile, /area/centcom/central_command_areas/holding) -"TS" = ( -/obj/structure/rack, -/obj/item/nullrod/scythe/vibro{ - damtype = "stamina"; - force = 30; - pixel_x = 5; - pixel_y = -2 - }, -/obj/item/nullrod/claymore/glowing{ - damtype = "stamina"; - force = 30 - }, -/turf/open/floor/wood/parquet, -/area/centcom/central_command_areas/holding) "Ua" = ( /turf/open/floor/bamboo/tatami{ dir = 8 @@ -1928,6 +1936,14 @@ /obj/structure/chair/stool/directional/south, /turf/open/floor/wood/parquet, /area/centcom/central_command_areas/holding) +"Uj" = ( +/obj/item/kirbyplants/organic/plant10, +/turf/open/floor/iron/sepia, +/area/centcom/central_command_areas/holding) +"Ul" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/holding) "UB" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/toy/figure/ninja, @@ -2030,13 +2046,6 @@ /obj/item/food/grown/redbeet, /turf/open/floor/catwalk_floor, /area/centcom/central_command_areas/holding) -"Wc" = ( -/obj/machinery/modular_computer/console/preset/research{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/catwalk_floor, -/area/centcom/central_command_areas/holding) "We" = ( /obj/machinery/vending/cigarette/syndicate, /obj/machinery/light/small/directional/south, @@ -2050,6 +2059,12 @@ }, /turf/open/floor/iron/sepia, /area/centcom/central_command_areas/holding) +"WD" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/bamboo/tatami/black{ + dir = 4 + }, +/area/centcom/central_command_areas/holding) "WS" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 4 @@ -2101,6 +2116,10 @@ initial_gas_mix = "o2=22;n2=82;TEMP=293.15" }, /area/centcom/central_command_areas/holding) +"Xn" = ( +/obj/structure/reagent_dispensers/plumbed, +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/holding) "Xt" = ( /obj/effect/turf_decal/siding/wood, /obj/effect/turf_decal/tile/dark/opposingcorners, @@ -2121,22 +2140,6 @@ }, /turf/open/floor/wood/tile, /area/centcom/central_command_areas/holding) -"Yb" = ( -/obj/structure/rack, -/obj/item/nullrod/claymore{ - damtype = "stamina"; - force = 30; - pixel_x = 4; - pixel_y = -1 - }, -/obj/item/nullrod/claymore/darkblade{ - damtype = "stamina"; - force = 30; - pixel_x = -3; - pixel_y = 3 - }, -/turf/open/floor/wood/parquet, -/area/centcom/central_command_areas/holding) "Yd" = ( /obj/structure/table/wood/fancy/royalblue, /obj/item/clothing/mask/animal/pig, @@ -2152,25 +2155,6 @@ /obj/item/toy/spinningtoy, /turf/open/floor/wood/parquet, /area/centcom/central_command_areas/holding) -"Yl" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/storage/basket, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/dark/fourcorners, -/turf/open/floor/iron/sepia, -/area/centcom/central_command_areas/holding) -"Yu" = ( -/obj/machinery/light/floor{ - pixel_x = -4; - pixel_y = 4 - }, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" - }, -/area/centcom/central_command_areas/holding) "YQ" = ( /turf/open/floor/bamboo/tatami{ dir = 4 @@ -2444,12 +2428,12 @@ gy wV Ea dg -MW -yJ +zc +rn Nt JV -oZ -sl +zh +Xn dg ts FE @@ -2519,10 +2503,10 @@ rQ wV dg zL -Nh +eo Am Am -rV +EC VC dg dg @@ -2563,7 +2547,7 @@ MR dg dg oG -oG +nW oG LK Ed @@ -2592,12 +2576,12 @@ CG CG Ho dg -ku +zU AE Gy Bo iF -QV +cK dg oG oG @@ -2738,7 +2722,7 @@ Zj HU Zj CG -sQ +LE zN hO hO @@ -2777,7 +2761,7 @@ CG CG XP dg -PX +hO hO UW jf @@ -2820,7 +2804,7 @@ pt pN hO hO -sW +qg Bw yz Bw @@ -2889,7 +2873,7 @@ Vj mw DL ht -kl +JL dg ic mw @@ -2957,7 +2941,7 @@ MM ML mw mw -hl +hs dg dg iH @@ -3001,7 +2985,7 @@ mw mw ht kl -NR +Op XP mw mw @@ -3032,7 +3016,7 @@ ML mw mw FU -lI +nR lI mw mw @@ -3041,7 +3025,7 @@ NN dg dg iH -mw +GU CG Zj Zj @@ -3102,15 +3086,15 @@ LK lh qx dg -fV +QJ mw mw -Yl +od Gw XP xw Am -Ca +PH Am VO XP @@ -3146,10 +3130,10 @@ Ey Dh XP xw -So +Ul dg -xi -Cr +Qt +GN dg iH mw @@ -3176,20 +3160,20 @@ LK os sc dg -fV +QJ mw mw -AT +au GX XP xw Am -yb +be Am NU XP mw -GU +mw CG LK LK @@ -3254,7 +3238,7 @@ ML mw mw FU -lI +iW lI mw mw @@ -3297,7 +3281,7 @@ mw mw ZV kl -hz +OQ XP mw mw @@ -3403,7 +3387,7 @@ pp pp cn XP -gc +wc mw mw ht @@ -3473,16 +3457,16 @@ aB xq Zc ML -vv -vv +ND +ND dg uv Zk mw mw zN -Yu -wK +VD +VD zN mw mw @@ -3515,7 +3499,7 @@ LK CG CG CG -mw +hn mw zN VD @@ -3529,7 +3513,7 @@ Zj CG bH qr -Wc +FB bP Xd CG @@ -3592,8 +3576,8 @@ aB mw mw zN -qK -lp +VD +bO zN mw mw @@ -3633,9 +3617,9 @@ XP XP dg iH -mw +GU dg -nJ +af QZ dg rj @@ -3650,7 +3634,9 @@ Ed (39,1,1) = {" Ed CG -dj +lV +mw +mw mw mw mw @@ -3665,10 +3651,8 @@ mw mw mw mw -ra mw mw -ra mw mw mw @@ -3677,7 +3661,7 @@ mw mw mw mw -Oy +Oo dg lx Jg @@ -3690,7 +3674,7 @@ CG QW mw mw -qH +mw mw mw mw @@ -3765,22 +3749,22 @@ hH Zb hH dg -OA +AP bl xM -qW +DF dg Mz DI -vH +dv dg -Je +hw NU Vf NU -rV +EC dg -aw +Od Wm Mz dg @@ -3802,7 +3786,7 @@ Zb gp Zb dg -CL +ha xM bl CL @@ -3844,9 +3828,9 @@ CL CL rR dg -Dk +wq DI -vH +Uj dg jR NU @@ -3854,9 +3838,9 @@ NU NU NU dg -aw +My DI -Dk +DG dg VE qi @@ -3920,7 +3904,7 @@ rR dg ed wU -fG +mr oY Rf Oa @@ -3928,7 +3912,7 @@ lP Oa lP oY -fG +mr wU ed dg @@ -3950,12 +3934,12 @@ Ed Ed Ed CG -fj +xM bl xM ee dg -Yb +pB wU wU WX @@ -3967,7 +3951,7 @@ Rf oY Uf wU -TS +oh dg qi ZU @@ -3992,7 +3976,7 @@ Yd PV Tj dg -Aq +ni wU Uf oY @@ -4004,7 +3988,7 @@ NF oY Uf wU -MX +vr dg Ez Ez @@ -4070,11 +4054,11 @@ LK LK LK CG -pC +pX lP Oa lP -mb +WD CG LK LK diff --git a/_maps/templates/lazy_templates/nukie_base.dmm b/_maps/templates/lazy_templates/nukie_base.dmm index 5e63fd2de98d2..d6e8dcfc6078c 100644 --- a/_maps/templates/lazy_templates/nukie_base.dmm +++ b/_maps/templates/lazy_templates/nukie_base.dmm @@ -7,6 +7,14 @@ "ae" = ( /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/expansion_bombthreat) +"ah" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/obj/machinery/mech_bay_recharge_port, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "al" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 8 @@ -14,9 +22,11 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/wood/tile, /area/centcom/syndicate_mothership/control) -"ao" = ( -/obj/machinery/light/cold/directional/west, -/turf/open/floor/iron/dark/textured_large, +"as" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/structure/sign/poster/contraband/cybersun_six_hundred/directional/east, +/obj/item/kirbyplants/random, +/turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) "au" = ( /turf/open/floor/circuit/red, @@ -27,55 +37,30 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) -"aC" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 5 - }, -/obj/structure/sign/poster/contraband/rip_badger/directional/east, -/obj/machinery/biogenerator, -/turf/open/floor/mineral/plastitanium/red, -/area/centcom/syndicate_mothership/expansion_bioterrorism) "aG" = ( /turf/open/floor/catwalk_floor/iron_smooth, /area/centcom/syndicate_mothership/control) -"aH" = ( -/obj/structure/table/reinforced, -/obj/item/knife/combat/survival{ - pixel_x = 7; - pixel_y = 17 - }, -/obj/item/reagent_containers/cup/glass/bottle/rum{ - pixel_x = -5; - pixel_y = 17 - }, -/obj/structure/sign/poster/contraband/red_rum/directional/east, -/obj/machinery/recharger, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) "aJ" = ( /obj/structure/fence/cut/medium, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) +"aK" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 8 + }, +/obj/structure/sign/poster/contraband/punch_shit/directional/south, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "aM" = ( /obj/machinery/microwave, /obj/structure/table/reinforced/plastitaniumglass, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) -"aR" = ( -/obj/machinery/computer/atmos_control/noreconnect{ - atmos_chambers = list("nukiebase"="Burn Chamber"); - desc = "Used to monitor the Syndicate Ordnance Laboratory's burn chamber."; - dir = 1; - name = "Ordnance Chamber Monitor" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/cold/directional/west{ - dir = 2 - }, -/turf/open/floor/mineral/titanium/tiled/yellow, -/area/centcom/syndicate_mothership/expansion_bombthreat) +"aX" = ( +/obj/machinery/shower/directional/south, +/turf/open/floor/iron/freezer, +/area/centcom/syndicate_mothership/control) "bf" = ( /obj/effect/turf_decal/siding/purple{ dir = 1 @@ -126,7 +111,7 @@ dir = 5 }, /obj/structure/table/reinforced/plasmarglass, -/obj/item/storage/backpack/duffelbag/med/surgery{ +/obj/item/surgery_tray/full{ pixel_y = -11 }, /obj/item/storage/belt/medical, @@ -167,14 +152,14 @@ }, /turf/open/floor/plating, /area/centcom/syndicate_mothership/control) -"cc" = ( -/obj/structure/sign/poster/contraband/syndiemoth/directional/east, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) "cl" = ( /turf/open/lava/plasma/ice_moon, /area/centcom/syndicate_mothership/control) +"cw" = ( +/obj/structure/sign/poster/contraband/c20r/directional/south, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/centcom/syndicate_mothership/control) "cA" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/button/ignition/incinerator/ordmix{ @@ -192,20 +177,42 @@ }, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_bombthreat) -"cC" = ( -/obj/machinery/griddle, -/obj/structure/sign/poster/contraband/syndiemoth/directional/north, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) "cF" = ( /obj/effect/baseturf_helper/asteroid/snow, /turf/closed/indestructible/syndicate, /area/centcom/syndicate_mothership/control) +"cO" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 9 + }, +/obj/structure/table/glass/plasmaglass, +/obj/machinery/reagentgrinder{ + pixel_x = -5; + pixel_y = 12 + }, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_x = -7; + pixel_y = -8 + }, +/obj/item/reagent_containers/cup/beaker/cryoxadone{ + pixel_x = 9; + pixel_y = -7 + }, +/obj/structure/sign/poster/contraband/lizard/directional/west, +/obj/structure/sign/poster/contraband/kudzu/directional/north, +/obj/item/reagent_containers/spray/plantbgone{ + pixel_x = 10; + pixel_y = 5 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) "cQ" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 4 }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) "cT" = ( @@ -235,17 +242,6 @@ }, /turf/open/floor/iron/dark/textured_large, /area/centcom/syndicate_mothership/control) -"do" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ - name = "Tinted Window"; - opacity = 1 - }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 10 - }, -/obj/effect/turf_decal/stripes/end, -/turf/open/floor/mineral/titanium/tiled, -/area/centcom/syndicate_mothership/control) "dq" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/iron/smooth_half, @@ -256,6 +252,12 @@ }, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) +"du" = ( +/obj/structure/chair/stool/directional/north, +/obj/effect/landmark/start/nukeop, +/obj/structure/sign/poster/contraband/donk_co/directional/south, +/turf/open/floor/wood/tile, +/area/centcom/syndicate_mothership/control) "dw" = ( /obj/structure/table/reinforced, /obj/machinery/recharger, @@ -266,6 +268,48 @@ /obj/effect/turf_decal/stripes/box, /turf/open/floor/mineral/titanium/tiled, /area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"dF" = ( +/obj/machinery/light/cold/directional/west, +/obj/structure/table/glass/plasmaglass, +/obj/item/pen{ + pixel_x = 9; + pixel_y = 18 + }, +/obj/structure/sign/poster/contraband/syndiemoth/directional/west, +/obj/item/storage/box/beakers{ + pixel_x = -4; + pixel_y = 17 + }, +/obj/item/storage/box/syringes{ + pixel_x = 4; + pixel_y = 17 + }, +/obj/item/assembly/igniter{ + pixel_x = 7; + pixel_y = 6 + }, +/obj/item/assembly/igniter{ + pixel_x = 7; + pixel_y = 1 + }, +/obj/item/assembly/igniter{ + pixel_x = 7; + pixel_y = -3 + }, +/obj/item/assembly/timer{ + pixel_x = -6; + pixel_y = 3 + }, +/obj/item/assembly/timer{ + pixel_x = -6; + pixel_y = -1 + }, +/obj/item/assembly/timer{ + pixel_x = -6; + pixel_y = -5 + }, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "dH" = ( /obj/structure/fluff/tram_rail{ pixel_y = 17 @@ -321,11 +365,6 @@ /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/mineral/titanium/yellow, /area/centcom/syndicate_mothership/control) -"eh" = ( -/obj/structure/closet/cardboard/metal, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) "ej" = ( /obj/effect/turf_decal/stripes/end{ dir = 4 @@ -352,12 +391,6 @@ dir = 4 }, /area/centcom/syndicate_mothership/control) -"eo" = ( -/obj/structure/sign/poster/contraband/free_drone/directional/north, -/turf/open/floor/iron/dark/textured_half{ - dir = 8 - }, -/area/centcom/syndicate_mothership/control) "er" = ( /obj/structure/table/wood, /obj/item/food/syndicake{ @@ -365,6 +398,36 @@ }, /turf/open/floor/wood/tile, /area/centcom/syndicate_mothership/control) +"eu" = ( +/obj/structure/table/glass/plasmaglass, +/obj/item/screwdriver{ + pixel_x = 1; + pixel_y = 23 + }, +/obj/item/clothing/glasses/science{ + pixel_x = -5; + pixel_y = 11 + }, +/obj/machinery/reagentgrinder{ + pixel_x = 7; + pixel_y = 5 + }, +/obj/structure/noticeboard/directional/east, +/obj/item/grenade/chem_grenade{ + pixel_x = -4 + }, +/obj/item/grenade/chem_grenade{ + pixel_x = -4 + }, +/obj/item/grenade/chem_grenade{ + pixel_x = -4 + }, +/obj/item/grenade/chem_grenade{ + pixel_x = -4 + }, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "eF" = ( /obj/structure/table/wood, /obj/item/reagent_containers/cup/rag, @@ -405,12 +468,11 @@ "fk" = ( /turf/open/floor/circuit/red/off, /area/centcom/syndicate_mothership/expansion_bioterrorism) -"fo" = ( +"fl" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/sign/poster/contraband/c20r/directional/east, -/obj/machinery/portable_atmospherics/canister/plasma, +/obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/plating, /area/centcom/syndicate_mothership/expansion_bombthreat) "fu" = ( @@ -440,10 +502,23 @@ /obj/item/kirbyplants/random, /turf/open/floor/catwalk_floor/iron_smooth, /area/centcom/syndicate_mothership/control) -"fH" = ( -/obj/structure/sign/poster/contraband/gorlex_recruitment/directional/west, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) +"fD" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ + name = "Tinted Window" + }, +/obj/structure/table/reinforced/plasmarglass, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/obj/item/transfer_valve{ + pixel_x = 5 + }, +/obj/item/transfer_valve, +/obj/item/transfer_valve{ + pixel_x = -5 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bombthreat) "fK" = ( /obj/machinery/hydroponics/constructable, /turf/open/floor/mineral/titanium/tiled, @@ -459,13 +534,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership) -"ga" = ( -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/knife/kitchen, -/obj/structure/sign/poster/contraband/self_ai_liberation/directional/west, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) "gf" = ( /obj/item/toy/plush/lizard_plushie/green{ name = "Spots-The-Operative" @@ -492,6 +560,10 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) +"gw" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "gB" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 8 @@ -515,15 +587,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) -"gI" = ( -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/drinks{ - dir = 1 - }, -/obj/structure/sign/poster/contraband/andromeda_bitters/directional/south, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) "gJ" = ( /obj/structure/rack, /obj/item/stack/sheet/iron/fifty, @@ -534,9 +597,22 @@ }, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_chemicalwarfare) -"gM" = ( -/obj/structure/sign/poster/contraband/revolver/directional/south, -/turf/open/floor/mineral/titanium, +"gL" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ + name = "Tinted Window" + }, +/obj/effect/turf_decal/siding/thinplating{ + dir = 6 + }, +/obj/structure/table/reinforced/plasmarglass, +/obj/item/reagent_containers/cup/bottle/epinephrine, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = 6 + }, +/obj/item/reagent_containers/syringe{ + pixel_y = 15 + }, +/turf/open/floor/mineral/titanium/tiled/blue, /area/centcom/syndicate_mothership/control) "gS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, @@ -574,7 +650,7 @@ dir = 1 }, /obj/effect/turf_decal/siding/wideplating, -/obj/machinery/door/airlock/glass_large{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Disembarkents" }, /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, @@ -582,12 +658,6 @@ dir = 4 }, /area/centcom/syndicate_mothership/control) -"hc" = ( -/obj/structure/sign/poster/contraband/lamarr/directional/south, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/centcom/syndicate_mothership/control) "hp" = ( /obj/structure/lattice/catwalk, /obj/effect/turf_decal/stripes/line{ @@ -607,6 +677,16 @@ }, /turf/open/floor/plating/icemoon, /area/centcom/syndicate_mothership/control) +"hE" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/structure/showcase/machinery/tv{ + desc = "Static fills the screen. If you can find the VCR, you might be able to watch those old Heist Movies again."; + name = "\improper Static Filled Tube(TM) Television" + }, +/obj/structure/sign/poster/contraband/rip_badger/directional/east, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "hN" = ( /obj/machinery/chem_mass_spec, /turf/open/floor/mineral/titanium/tiled/yellow, @@ -619,6 +699,43 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/centcom/syndicate_mothership/control) +"hX" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) +"ia" = ( +/obj/structure/rack, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/item/stock_parts/micro_laser/high{ + pixel_x = 12 + }, +/obj/item/wrench{ + desc = "A little smidgeon of Freon..."; + name = "Freon" + }, +/obj/item/stock_parts/micro_laser/high{ + pixel_x = -4; + pixel_y = -8 + }, +/obj/item/stock_parts/micro_laser/high{ + pixel_x = 8; + pixel_y = 4 + }, +/obj/item/stock_parts/micro_laser/high{ + pixel_x = -8; + pixel_y = -4 + }, +/obj/item/melee/powerfist, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bombthreat) "ig" = ( /obj/effect/turf_decal/siding/wideplating{ dir = 1 @@ -707,46 +824,18 @@ /obj/machinery/vending/dinnerware, /turf/open/floor/catwalk_floor/titanium, /area/centcom/syndicate_mothership/control) -"jd" = ( -/obj/structure/rack, +"jc" = ( +/obj/structure/closet/cardboard/metal, +/obj/effect/turf_decal/tile/bar/opposingcorners, /obj/machinery/light/cold/directional/west, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 8 - }, -/obj/item/stock_parts/micro_laser/high{ - pixel_x = 12 - }, -/obj/item/wrench{ - desc = "A little smidgeon of Freon..."; - name = "Freon" - }, -/obj/item/stock_parts/micro_laser/high{ - pixel_x = -4; - pixel_y = -8 - }, -/obj/item/stock_parts/micro_laser/high{ - pixel_x = 8; - pixel_y = 4 - }, -/obj/item/stock_parts/micro_laser/high{ - pixel_x = -8; - pixel_y = -4 - }, -/obj/item/melee/powerfist, -/turf/open/floor/mineral/plastitanium/red, -/area/centcom/syndicate_mothership/expansion_bombthreat) +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "je" = ( /obj/effect/turf_decal/siding/wideplating{ dir = 8 }, /turf/open/floor/plating, /area/centcom/syndicate_mothership/control) -"jf" = ( -/obj/structure/sign/poster/contraband/gorlex_recruitment/directional/north, -/turf/open/floor/iron/dark/textured_half{ - dir = 8 - }, -/area/centcom/syndicate_mothership/control) "jh" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ chamber_id = "nukiebase"; @@ -822,6 +911,10 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) +"km" = ( +/obj/structure/sign/poster/contraband/lizard/directional/west, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "kq" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ @@ -852,16 +945,14 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) -"kN" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 4 +"kQ" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 9 }, -/obj/structure/sign/poster/contraband/the_big_gas_giant_truth/directional/north, +/obj/structure/sign/poster/contraband/gorlex_recruitment/directional/north, +/obj/effect/turf_decal/siding/thinplating_new/dark/corner, /turf/open/floor/mineral/plastitanium, -/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +/area/centcom/syndicate_mothership/control) "kU" = ( /obj/structure/flora/tree/dead/style_random, /obj/structure/flora/grass/both/style_random, @@ -916,16 +1007,6 @@ /obj/structure/flora/grass/both/style_random, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) -"lm" = ( -/obj/structure/table/reinforced/plastitaniumglass, -/obj/structure/showcase/machinery/tv{ - desc = "Static fills the screen. If you can find the VCR, you might be able to watch those old Heist Movies again."; - name = "\improper Static Filled Tube(TM) Television" - }, -/obj/structure/sign/poster/contraband/rip_badger/directional/east, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) "lo" = ( /obj/effect/turf_decal/siding/thinplating_new/dark, /obj/machinery/camera/autoname/directional/south{ @@ -937,6 +1018,26 @@ /obj/effect/turf_decal/siding/thinplating_new/dark, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) +"lv" = ( +/obj/effect/turf_decal/siding/purple{ + dir = 1 + }, +/obj/structure/sign/poster/contraband/power/directional/north, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"lA" = ( +/obj/machinery/door/window/survival_pod{ + dir = 8; + name = "Toilet Door" + }, +/obj/structure/window/reinforced/survival_pod/spawner/directional/north{ + name = "Frosted Window" + }, +/obj/structure/toilet/greyscale{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "lB" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -955,52 +1056,13 @@ dir = 1 }, /area/centcom/syndicate_mothership/control) -"lH" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ - name = "Tinted Window"; - opacity = 1 - }, -/obj/structure/table/reinforced/plasmarglass, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 8 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = -2; - pixel_y = 3 - }, -/obj/item/assembly/signaler{ - pixel_x = -2; - pixel_y = -2 - }, -/obj/item/assembly/signaler{ - pixel_x = 2; - pixel_y = 5 - }, -/obj/item/assembly/timer{ - pixel_x = 12; - pixel_y = -9 - }, -/obj/item/assembly/timer{ - pixel_x = 15 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = -6; - pixel_y = -4 - }, -/obj/item/assembly/signaler{ - pixel_x = 5; - pixel_y = 10 - }, -/obj/item/assembly/timer{ - pixel_x = 18; - pixel_y = 5 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/centcom/syndicate_mothership/expansion_bombthreat) +"lF" = ( +/obj/structure/sign/poster/contraband/bountyhunters/directional/west, +/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/iron/smooth, +/area/centcom/syndicate_mothership/control) "lQ" = ( /obj/structure/chair/sofa/left/brown{ dir = 4 @@ -1015,25 +1077,9 @@ /obj/machinery/camera/autoname/directional/east{ network = list("nukie") }, -/obj/machinery/chem_dispenser/mutagensaltpeter, -/turf/open/floor/mineral/plastitanium/red, -/area/centcom/syndicate_mothership/expansion_bioterrorism) -"mt" = ( -/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) +/obj/machinery/chem_dispenser/mutagensaltpeter, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) "my" = ( /obj/effect/landmark/start/nukeop_leader, /obj/effect/turf_decal/tile/bar/opposingcorners, @@ -1061,36 +1107,6 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bombthreat) -"mG" = ( -/obj/structure/closet/crate/freezer{ - name = "pantry crate" - }, -/obj/structure/sign/poster/contraband/moffuchis_pizza/directional/south, -/obj/item/reagent_containers/condiment/rice{ - pixel_y = 12 - }, -/obj/item/reagent_containers/condiment/rice{ - pixel_y = 12 - }, -/obj/item/reagent_containers/condiment/saltshaker, -/obj/item/reagent_containers/condiment/peppermill, -/obj/item/food/grown/wheat, -/obj/item/food/grown/wheat, -/obj/item/reagent_containers/condiment/sugar, -/obj/item/reagent_containers/condiment/sugar, -/obj/item/food/grown/soybeans, -/obj/item/food/grown/soybeans, -/obj/item/food/grown/vanillapod, -/obj/item/food/grown/vanillapod, -/obj/item/food/grown/herbs, -/obj/item/food/grown/herbs, -/obj/item/food/grown/cocoapod, -/obj/item/food/grown/cocoapod, -/obj/item/food/grown/aloe, -/obj/item/food/grown/coffee, -/obj/item/food/grown/coffee, -/turf/open/floor/plastic, -/area/centcom/syndicate_mothership/expansion_fridgerummage) "mJ" = ( /obj/structure/sign/poster/contraband/free_key, /turf/closed/indestructible/syndicate, @@ -1115,12 +1131,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/expansion_chemicalwarfare) -"nb" = ( -/obj/machinery/oven/range, -/obj/structure/sign/poster/contraband/eat/directional/west, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) "ng" = ( /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -1133,21 +1143,6 @@ /obj/structure/fans/tiny, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) -"nh" = ( -/obj/structure/table/glass/plasmaglass, -/obj/item/stack/sheet/mineral/plasma{ - pixel_y = 15 - }, -/obj/item/grenade/chem_grenade, -/obj/item/stack/cable_coil, -/obj/item/reagent_containers/cup/beaker{ - pixel_x = 8; - pixel_y = 14 - }, -/obj/machinery/light/cold/directional/west, -/obj/item/stack/cable_coil, -/turf/open/floor/mineral/titanium/tiled/yellow, -/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "nk" = ( /obj/structure/flora/tree/dead/style_random, /obj/structure/flora/grass/both/style_random, @@ -1174,6 +1169,19 @@ /obj/effect/turf_decal/stripes/full, /turf/open/floor/mineral/titanium/yellow, /area/centcom/syndicate_mothership/control) +"nF" = ( +/obj/effect/turf_decal/syndicateemblem/top/middle, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/control) +"nH" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/structure/closet/syndicate/personal, +/obj/structure/sign/poster/contraband/lusty_xenomorph/directional/north, +/obj/effect/turf_decal/tile/red/full, +/turf/open/floor/iron/dark/textured_half{ + dir = 8 + }, +/area/centcom/syndicate_mothership/control) "nL" = ( /obj/structure/chair/office/light{ dir = 1 @@ -1196,6 +1204,12 @@ /obj/structure/flora/tree/dead/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) +"nU" = ( +/obj/machinery/oven/range, +/obj/structure/sign/poster/contraband/eat/directional/west, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "oc" = ( /obj/structure/fence{ dir = 4 @@ -1260,11 +1274,6 @@ dir = 8 }, /area/centcom/syndicate_mothership/control) -"oN" = ( -/obj/machinery/light/cold/directional/east, -/obj/item/kirbyplants/random, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) "oR" = ( /obj/structure/table/wood, /obj/item/storage/box/donkpockets, @@ -1289,6 +1298,11 @@ }, /turf/open/floor/mineral/titanium/tiled, /area/centcom/syndicate_mothership/control) +"pa" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/sign/poster/contraband/moffuchis_pizza/directional/west, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "pf" = ( /obj/machinery/light/small/directional/south, /obj/item/watertank{ @@ -1296,19 +1310,11 @@ }, /turf/open/floor/catwalk_floor/iron_smooth, /area/centcom/syndicate_mothership/control) -"pi" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark, -/obj/structure/sign/poster/contraband/cybersun_six_hundred/directional/east, -/obj/item/kirbyplants/random, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) -"pj" = ( -/obj/structure/sign/poster/contraband/lusty_xenomorph/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, +"pg" = ( +/obj/machinery/light/small/red/directional/west, +/obj/structure/sign/poster/contraband/soviet_propaganda/directional/west, +/obj/item/stack/sheet/cardboard/fifty, +/turf/open/floor/mineral/titanium/yellow, /area/centcom/syndicate_mothership/control) "pl" = ( /obj/structure/flora/rock/icy/style_random, @@ -1339,11 +1345,6 @@ /obj/item/bedsheet/syndie, /turf/open/floor/iron/smooth_half, /area/centcom/syndicate_mothership/control) -"pF" = ( -/obj/structure/closet/cardboard, -/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6/directional/east, -/turf/open/floor/catwalk_floor/iron_dark, -/area/centcom/syndicate_mothership/control) "pJ" = ( /obj/machinery/camera/autoname/directional/south{ network = list("nukie") @@ -1355,10 +1356,6 @@ /obj/machinery/vending/tool, /turf/open/floor/mineral/titanium/yellow, /area/centcom/syndicate_mothership/control) -"pM" = ( -/obj/machinery/light/cold/directional/south, -/turf/open/floor/plating, -/area/centcom/syndicate_mothership/control) "pS" = ( /obj/structure/chair/greyscale{ dir = 4 @@ -1385,12 +1382,6 @@ /obj/machinery/hydroponics/constructable, /turf/open/floor/mineral/titanium/tiled, /area/centcom/syndicate_mothership/expansion_bioterrorism) -"qc" = ( -/obj/machinery/igniter/incinerator_ordmix{ - id = "syn_ordmix_igniter" - }, -/turf/open/floor/engine/vacuum, -/area/centcom/syndicate_mothership/expansion_bombthreat) "qh" = ( /obj/item/stack/spacecash/c20, /turf/open/misc/asteroid/snow/icemoon, @@ -1443,6 +1434,10 @@ }, /turf/open/floor/plastic, /area/centcom/syndicate_mothership/expansion_fridgerummage) +"qv" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "qw" = ( /turf/open/floor/plating, /area/centcom/syndicate_mothership/control) @@ -1470,13 +1465,16 @@ dir = 4 }, /area/centcom/syndicate_mothership/control) -"qL" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 8 +"qK" = ( +/obj/machinery/computer/atmos_control/noreconnect{ + atmos_chambers = list("nukiebase"="Burn Chamber"); + desc = "Used to monitor the Syndicate Ordnance Laboratory's burn chamber."; + dir = 1; + name = "Ordnance Chamber Monitor" }, -/obj/structure/sign/poster/contraband/syndicate_pistol/directional/north, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_bombthreat) "qN" = ( /turf/open/floor/iron/dark/textured_large, /area/centcom/syndicate_mothership/control) @@ -1545,6 +1543,27 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, /turf/open/floor/catwalk_floor/iron_smooth, /area/centcom/syndicate_mothership/control) +"rJ" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/knife/kitchen, +/obj/structure/sign/poster/contraband/self_ai_liberation/directional/west, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) +"rL" = ( +/obj/structure/table/glass/plasmaglass, +/obj/item/stack/sheet/mineral/plasma{ + pixel_y = 15 + }, +/obj/item/grenade/chem_grenade, +/obj/item/stack/cable_coil, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = 8; + pixel_y = 14 + }, +/obj/item/stack/cable_coil, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "rN" = ( /obj/structure/fence/door/opened, /turf/open/misc/asteroid/snow/icemoon, @@ -1558,16 +1577,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) -"rX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/structure/sign/poster/contraband/fun_police/directional/west, -/turf/open/floor/mineral/plastitanium, -/area/centcom/syndicate_mothership/expansion_bombthreat) "sb" = ( /obj/structure/fence/cut/medium{ dir = 4 @@ -1623,47 +1632,10 @@ "sq" = ( /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership/control) -"ss" = ( -/obj/structure/table/glass/plasmaglass, -/obj/item/screwdriver{ - pixel_x = 1; - pixel_y = 23 - }, -/obj/item/clothing/glasses/science{ - pixel_x = -5; - pixel_y = 11 - }, -/obj/machinery/reagentgrinder{ - pixel_x = 7; - pixel_y = 5 - }, -/obj/structure/noticeboard/directional/east, -/obj/item/grenade/chem_grenade{ - pixel_x = -4 - }, -/obj/item/grenade/chem_grenade{ - pixel_x = -4 - }, -/obj/item/grenade/chem_grenade{ - pixel_x = -4 - }, -/obj/item/grenade/chem_grenade{ - pixel_x = -4 - }, -/turf/open/floor/mineral/titanium/tiled/yellow, -/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "sv" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership) -"sz" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 6 - }, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/structure/sign/poster/contraband/gorlex_recruitment/directional/south, -/turf/open/floor/mineral/plastitanium, -/area/centcom/syndicate_mothership/control) "sE" = ( /obj/effect/turf_decal/siding/wideplating{ dir = 1 @@ -1705,13 +1677,6 @@ "sU" = ( /turf/open/space/basic, /area/space) -"sY" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/structure/sign/poster/contraband/power/directional/north, -/turf/open/floor/mineral/plastitanium, -/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "tc" = ( /obj/machinery/light/small/directional/south, /obj/structure/cable, @@ -1738,17 +1703,6 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) -"ts" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ - name = "Tinted Window"; - opacity = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/plating, -/area/centcom/syndicate_mothership/expansion_bombthreat) "tu" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/siding/red/corner{ @@ -1770,14 +1724,6 @@ /obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bombthreat) -"tC" = ( -/obj/effect/turf_decal/siding/thinplating, -/obj/machinery/door/window/survival_pod{ - name = "Surgery"; - opacity = 1 - }, -/turf/open/floor/mineral/titanium/tiled/blue, -/area/centcom/syndicate_mothership/control) "tJ" = ( /obj/effect/light_emitter{ set_cap = 1; @@ -1806,6 +1752,17 @@ }, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) +"uf" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 6 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/structure/sign/poster/contraband/gorlex_recruitment/directional/south, +/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "um" = ( /obj/structure/statue/uranium/nuke, /turf/open/misc/asteroid/snow/icemoon, @@ -1823,6 +1780,12 @@ dir = 4 }, /area/centcom/syndicate_mothership/control) +"uN" = ( +/obj/machinery/door/window/survival_pod{ + name = "Frosted Door" + }, +/turf/open/floor/iron/freezer, +/area/centcom/syndicate_mothership/control) "uT" = ( /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) @@ -1836,6 +1799,12 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) +"ve" = ( +/obj/effect/turf_decal/syndicateemblem/top/middle{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/control) "vv" = ( /obj/structure/table/reinforced, /obj/item/paper/fluff/stations/centcom/disk_memo{ @@ -1845,50 +1814,18 @@ /obj/item/taperecorder{ pixel_y = 15 }, -/obj/item/stack/spacecash/c50, -/turf/open/floor/carpet, -/area/centcom/syndicate_mothership/control) -"vx" = ( -/obj/machinery/door/airlock/external/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/structure/fans/tiny, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, -/turf/open/floor/plating, -/area/centcom/syndicate_mothership/control) -"vG" = ( -/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/cup/bottle/formaldehyde{ - pixel_x = 8; - pixel_y = 4 +/obj/item/stack/spacecash/c50, +/turf/open/floor/carpet, +/area/centcom/syndicate_mothership/control) +"vx" = ( +/obj/machinery/door/airlock/external/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 }, -/turf/open/floor/mineral/plastitanium/red, -/area/centcom/syndicate_mothership/expansion_bioterrorism) +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "vI" = ( /obj/structure/railing, /turf/open/floor/catwalk_floor/iron_smooth{ @@ -1964,7 +1901,7 @@ }, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) -"wy" = ( +"wC" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 }, @@ -1985,6 +1922,15 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bombthreat) +"wN" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks{ + dir = 1 + }, +/obj/structure/sign/poster/contraband/andromeda_bitters/directional/south, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "wO" = ( /turf/open/floor/iron/dark/textured_half{ dir = 8 @@ -2025,13 +1971,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) -"xs" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 8 - }, -/obj/structure/sign/poster/contraband/punch_shit/directional/south, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) "xu" = ( /turf/closed/indestructible/syndicate, /area/centcom/syndicate_mothership/expansion_bioterrorism) @@ -2046,10 +1985,6 @@ }, /turf/open/space/basic, /area/space/nearstation) -"xU" = ( -/obj/structure/sign/poster/contraband/moffuchis_pizza/directional/west, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) "ya" = ( /turf/open/floor/carpet, /area/centcom/syndicate_mothership/control) @@ -2080,6 +2015,17 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bombthreat) +"ym" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ + name = "Tinted Window" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/expansion_bombthreat) "yp" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 4 @@ -2087,23 +2033,11 @@ /obj/structure/chair/office/light, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bombthreat) -"yy" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ - name = "Tinted Window"; - opacity = 1 - }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 6 - }, -/obj/structure/table/reinforced/plasmarglass, -/obj/item/reagent_containers/cup/bottle/epinephrine, -/obj/item/reagent_containers/cup/bottle/multiver{ - pixel_x = 6 - }, -/obj/item/reagent_containers/syringe{ - pixel_y = 15 +"yw" = ( +/obj/structure/sign/poster/contraband/free_drone/directional/north, +/turf/open/floor/iron/dark/textured_half{ + dir = 8 }, -/turf/open/floor/mineral/titanium/tiled/blue, /area/centcom/syndicate_mothership/control) "yB" = ( /obj/machinery/light/small/directional/north, @@ -2119,13 +2053,6 @@ /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/catwalk_floor/titanium, /area/centcom/syndicate_mothership/control) -"yG" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 9 - }, -/obj/structure/sign/poster/contraband/gorlex_recruitment/directional/north, -/turf/open/floor/mineral/plastitanium, -/area/centcom/syndicate_mothership/control) "yK" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 9 @@ -2142,6 +2069,9 @@ /obj/machinery/camera/autoname/directional/south{ network = list("nukie") }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) "zi" = ( @@ -2183,39 +2113,12 @@ /obj/item/kirbyplants/random, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) -"zJ" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ - name = "Tinted Window"; - opacity = 1 - }, -/obj/structure/table/reinforced/plasmarglass, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 4 - }, -/obj/item/transfer_valve{ - pixel_x = 5 - }, -/obj/item/transfer_valve, -/obj/item/transfer_valve{ - pixel_x = -5 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/centcom/syndicate_mothership/expansion_bombthreat) "zL" = ( /obj/structure/rack, /obj/item/restraints/handcuffs/cable/pink, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) -"zN" = ( -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/drinks/beer{ - dir = 1 - }, -/obj/structure/sign/poster/contraband/space_cube/directional/south, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) "zQ" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/components/tank/nitrogen, @@ -2225,17 +2128,48 @@ /mob/living/simple_animal/slime, /turf/open/floor/circuit/red/off, /area/centcom/syndicate_mothership/expansion_bioterrorism) +"zS" = ( +/obj/structure/closet/crate/freezer{ + name = "pantry crate" + }, +/obj/structure/sign/poster/contraband/moffuchis_pizza/directional/south, +/obj/item/reagent_containers/condiment/rice{ + pixel_y = 12 + }, +/obj/item/reagent_containers/condiment/rice{ + pixel_y = 12 + }, +/obj/item/reagent_containers/condiment/saltshaker, +/obj/item/reagent_containers/condiment/peppermill, +/obj/item/food/grown/wheat, +/obj/item/food/grown/wheat, +/obj/item/reagent_containers/condiment/sugar, +/obj/item/reagent_containers/condiment/sugar, +/obj/item/food/grown/soybeans, +/obj/item/food/grown/soybeans, +/obj/item/food/grown/vanillapod, +/obj/item/food/grown/vanillapod, +/obj/item/food/grown/herbs, +/obj/item/food/grown/herbs, +/obj/item/food/grown/cocoapod, +/obj/item/food/grown/cocoapod, +/obj/item/food/grown/aloe, +/obj/item/food/grown/coffee, +/obj/item/food/grown/coffee, +/turf/open/floor/plastic, +/area/centcom/syndicate_mothership/expansion_fridgerummage) "zT" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 1 }, /turf/open/misc/ice/icemoon, /area/centcom/syndicate_mothership/control) -"zW" = ( -/obj/structure/chair/stool/directional/north, -/obj/effect/landmark/start/nukeop, -/obj/structure/sign/poster/contraband/donk_co/directional/south, -/turf/open/floor/wood/tile, +"zZ" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) "Ab" = ( /obj/effect/turf_decal/siding/thinplating_new/light{ @@ -2255,6 +2189,16 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bioterrorism) +"Ax" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ + name = "Tinted Window" + }, +/obj/effect/turf_decal/siding/thinplating{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/end, +/turf/open/floor/mineral/titanium/tiled, +/area/centcom/syndicate_mothership/control) "AA" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -2320,10 +2264,16 @@ /obj/machinery/chem_master, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_chemicalwarfare) -"Bk" = ( -/obj/machinery/light/cold/directional/west, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) +"Bg" = ( +/obj/effect/turf_decal/siding/purple{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/the_big_gas_giant_truth/directional/north, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "Bm" = ( /obj/structure/flora/tree/pine/style_random, /turf/open/misc/asteroid/snow/airless, @@ -2420,13 +2370,6 @@ }, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) -"Cm" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 4 - }, -/obj/structure/sign/poster/contraband/smoke/directional/north, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) "Ct" = ( /obj/machinery/door/airlock/hatch{ name = "Closet" @@ -2434,6 +2377,53 @@ /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/iron/smooth_edge, /area/centcom/syndicate_mothership/control) +"CF" = ( +/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/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/cup/bottle/formaldehyde{ + pixel_x = 8; + pixel_y = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) +"CM" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/mechanical/old, +/obj/structure/sign/poster/contraband/pwr_game/directional/north, +/turf/open/floor/mineral/titanium/yellow, +/area/centcom/syndicate_mothership/control) +"CQ" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 10 + }, +/obj/structure/sign/poster/contraband/energy_swords/directional/west, +/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "CX" = ( /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership) @@ -2443,6 +2433,10 @@ }, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_bombthreat) +"Dq" = ( +/obj/structure/sign/poster/contraband/gorlex_recruitment/directional/west, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "Du" = ( /obj/docking_port/stationary{ area_type = /area/centcom/syndicate_mothership; @@ -2466,21 +2460,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, /turf/open/floor/stone, /area/centcom/syndicate_mothership/control) -"DI" = ( -/obj/structure/sign/poster/contraband/masked_men/directional/east, -/obj/machinery/chem_dispenser/fullupgrade, -/turf/open/floor/mineral/titanium/tiled/yellow, -/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "DJ" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, /turf/open/floor/plating/snowed/icemoon, /area/centcom/syndicate_mothership/control) -"DN" = ( -/obj/machinery/light/cold/directional/north, -/turf/open/floor/iron/dark/textured_half{ - dir = 8 +"DM" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ + dir = 1 }, +/turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) "DY" = ( /obj/structure/table/wood/poker, @@ -2511,6 +2504,13 @@ "DZ" = ( /turf/closed/indestructible/syndicate, /area/centcom/syndicate_mothership/control) +"Ed" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/smoke/directional/north, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "Ef" = ( /obj/structure/fence, /turf/open/misc/asteroid/snow/airless, @@ -2534,12 +2534,6 @@ /obj/structure/flora/rock/icy/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) -"Et" = ( -/obj/machinery/light/cold/directional/east, -/obj/effect/turf_decal/siding/thinplating_new/dark, -/obj/item/kirbyplants/random, -/turf/open/floor/iron/dark/textured_large, -/area/centcom/syndicate_mothership/control) "Ev" = ( /turf/open/floor/plating/elevatorshaft, /area/centcom/syndicate_mothership/control) @@ -2557,36 +2551,21 @@ }, /turf/open/lava/plasma/ice_moon, /area/centcom/syndicate_mothership/control) -"EJ" = ( -/obj/machinery/light/small/red/directional/west, -/obj/structure/sign/poster/contraband/soviet_propaganda/directional/west, -/obj/item/stack/sheet/cardboard/fifty, -/turf/open/floor/mineral/titanium/yellow, -/area/centcom/syndicate_mothership/control) -"EM" = ( -/obj/machinery/atmospherics/pipe/smart/simple/general/hidden{ - dir = 4 - }, -/turf/closed/indestructible/syndicate, -/area/centcom/syndicate_mothership/expansion_bombthreat) -"EO" = ( -/obj/structure/barricade/sandbags, -/turf/open/misc/asteroid/snow/airless, -/area/centcom/syndicate_mothership) -"ET" = ( -/obj/structure/table/glass/plasmaglass, -/obj/item/reagent_containers/cup/beaker/large{ - pixel_x = -5; - pixel_y = 8 - }, -/obj/item/reagent_containers/cup/beaker{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/machinery/light/cold/directional/east, -/obj/item/gun/syringe/syndicate, +"EL" = ( +/obj/structure/sign/poster/contraband/masked_men/directional/east, +/obj/machinery/chem_dispenser/fullupgrade, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"EM" = ( +/obj/machinery/atmospherics/pipe/smart/simple/general/hidden{ + dir = 4 + }, +/turf/closed/indestructible/syndicate, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"EO" = ( +/obj/structure/barricade/sandbags, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) "EV" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -2737,6 +2716,22 @@ /obj/structure/flora/grass/both/style_random, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) +"GB" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/table/reinforced, +/obj/item/knife/combat/survival{ + pixel_x = 7; + pixel_y = 17 + }, +/obj/item/reagent_containers/cup/glass/bottle/rum{ + pixel_x = -5; + pixel_y = 17 + }, +/obj/structure/sign/poster/contraband/red_rum/directional/east, +/obj/machinery/recharger, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "GE" = ( /obj/machinery/vending/cigarette/syndicate, /turf/open/floor/catwalk_floor/titanium, @@ -2782,20 +2777,35 @@ /obj/structure/railing, /turf/open/lava/plasma/ice_moon, /area/centcom/syndicate_mothership/control) -"GV" = ( -/obj/structure/sign/poster/contraband/lizard/directional/west, -/turf/open/floor/mineral/titanium, +"GS" = ( +/obj/effect/turf_decal/siding/thinplating, +/obj/machinery/door/window/survival_pod{ + name = "Surgery" + }, +/turf/open/floor/mineral/titanium/tiled/blue, /area/centcom/syndicate_mothership/control) -"GX" = ( -/obj/machinery/light/cold/directional/north, -/obj/effect/turf_decal/siding/thinplating_new/dark{ +"GU" = ( +/obj/effect/turf_decal/syndicateemblem/top/right{ dir = 1 }, -/turf/open/floor/mineral/plastitanium, +/obj/effect/turf_decal/syndicateemblem/top/left{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/control) "Hc" = ( /turf/open/floor/plating/icemoon, /area/centcom/syndicate_mothership/control) +"Hm" = ( +/obj/effect/turf_decal/syndicateemblem/bottom/middle{ + dir = 8 + }, +/obj/effect/turf_decal/syndicateemblem/top/left, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/control) "Ho" = ( /obj/effect/light_emitter{ set_cap = 1; @@ -2814,6 +2824,21 @@ /obj/machinery/shuttle_manipulator, /turf/open/floor/circuit/red, /area/centcom/syndicate_mothership/control) +"Ht" = ( +/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/item/stack/spacecash/c200{ + pixel_y = 17 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "Hv" = ( /obj/machinery/light/floor, /turf/open/floor/plating, @@ -2970,6 +2995,28 @@ }, /turf/open/floor/iron/dark/textured_large, /area/centcom/syndicate_mothership/control) +"Jc" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/beer{ + dir = 1 + }, +/obj/structure/sign/poster/contraband/space_cube/directional/south, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) +"Jf" = ( +/obj/structure/table/glass/plasmaglass, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_x = -5; + pixel_y = 8 + }, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/item/gun/syringe/syndicate, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "Jg" = ( /obj/structure/railing{ dir = 1 @@ -2983,16 +3030,20 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bioterrorism) -"Jz" = ( -/obj/structure/sign/poster/contraband/bountyhunters/directional/west, -/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/iron/smooth, -/area/centcom/syndicate_mothership/control) +"JJ" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 5 + }, +/obj/structure/sign/poster/contraband/rip_badger/directional/east, +/obj/machinery/biogenerator, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) "JL" = ( /obj/machinery/light/cold/directional/south, /obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) "JR" = ( @@ -3010,6 +3061,18 @@ "JS" = ( /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/expansion_bioterrorism) +"JU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/purple, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"JX" = ( +/obj/effect/turf_decal/syndicateemblem/top/right, +/obj/effect/turf_decal/syndicateemblem/top/left, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/control) "Ka" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -3095,6 +3158,13 @@ /obj/effect/turf_decal/tile/red/full, /turf/open/floor/iron/dark/textured_half, /area/centcom/syndicate_mothership/control) +"Le" = ( +/obj/machinery/igniter/incinerator_ordmix{ + id = "syn_ordmix_igniter" + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/engine/vacuum, +/area/centcom/syndicate_mothership/expansion_bombthreat) "Lk" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/siding/red{ @@ -3127,6 +3197,15 @@ dir = 4 }, /area/centcom/syndicate_mothership/control) +"Lz" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/structure/chair/sofa/bench/right, +/obj/structure/sign/poster/contraband/donut_corp/directional/north, +/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/stone, +/area/centcom/syndicate_mothership/control) "LB" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/siding/red{ @@ -3143,13 +3222,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/expansion_bombthreat) -"LK" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 10 - }, -/obj/structure/sign/poster/contraband/energy_swords/directional/west, -/turf/open/floor/mineral/plastitanium, -/area/centcom/syndicate_mothership/control) "LM" = ( /obj/machinery/atmospherics/components/unary/passive_vent{ dir = 8 @@ -3157,6 +3229,11 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) +"LN" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "LO" = ( /obj/effect/turf_decal/siding/purple{ dir = 1 @@ -3195,6 +3272,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, /turf/open/floor/catwalk_floor/titanium, /area/centcom/syndicate_mothership/control) +"Mh" = ( +/obj/structure/sign/poster/contraband/lamarr/directional/south, +/turf/open/floor/iron/smooth_half{ + dir = 1 + }, +/area/centcom/syndicate_mothership/control) +"Mn" = ( +/obj/structure/sign/poster/contraband/syndiemoth/directional/east, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "Mo" = ( /obj/structure/fence/cut/medium{ dir = 4 @@ -3250,6 +3338,12 @@ }, /turf/open/floor/plating, /area/centcom/syndicate_mothership/control) +"MQ" = ( +/obj/structure/sign/poster/contraband/gorlex_recruitment/directional/north, +/turf/open/floor/iron/dark/textured_half{ + dir = 8 + }, +/area/centcom/syndicate_mothership/control) "MU" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 8 @@ -3258,6 +3352,14 @@ /obj/effect/landmark/start/nukeop, /turf/open/floor/wood/tile, /area/centcom/syndicate_mothership/control) +"Nb" = ( +/obj/structure/chair/sofa/right/brown{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/revolver/directional/west, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "Nd" = ( /turf/closed/indestructible/fakedoor{ name = "Tac-Com" @@ -3272,13 +3374,6 @@ dir = 4 }, /area/centcom/syndicate_mothership/control) -"Nr" = ( -/obj/effect/turf_decal/stripes/end{ - dir = 4 - }, -/obj/machinery/mech_bay_recharge_port, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) "Ns" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -3286,11 +3381,11 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/plating, /area/centcom/syndicate_mothership/expansion_bombthreat) -"NA" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/mechanical/old, -/obj/structure/sign/poster/contraband/pwr_game/directional/north, -/turf/open/floor/mineral/titanium/yellow, +"ND" = ( +/obj/machinery/griddle, +/obj/structure/sign/poster/contraband/syndiemoth/directional/north, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, /area/centcom/syndicate_mothership/control) "NH" = ( /obj/effect/turf_decal/stripes/line{ @@ -3299,22 +3394,6 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/plating, /area/centcom/syndicate_mothership/expansion_bombthreat) -"NM" = ( -/obj/machinery/door/window/survival_pod{ - dir = 8; - name = "Toilet Door"; - opacity = 1 - }, -/obj/structure/window/reinforced/survival_pod/spawner/directional/north{ - name = "Frosted Window"; - opacity = 1 - }, -/obj/structure/toilet/greyscale{ - dir = 8 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) "NP" = ( /obj/structure/railing/corner, /turf/open/misc/asteroid/snow/icemoon, @@ -3332,6 +3411,52 @@ /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/iron/textured_large, /area/centcom/syndicate_mothership/control) +"Oc" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ + name = "Tinted Window" + }, +/obj/structure/table/reinforced/plasmarglass, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = -2; + pixel_y = 3 + }, +/obj/item/assembly/signaler{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/item/assembly/signaler{ + pixel_x = 2; + pixel_y = 5 + }, +/obj/item/assembly/timer{ + pixel_x = 12; + pixel_y = -9 + }, +/obj/item/assembly/timer{ + pixel_x = 15 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = -6; + pixel_y = -4 + }, +/obj/item/assembly/signaler{ + pixel_x = 5; + pixel_y = 10 + }, +/obj/item/assembly/timer{ + pixel_x = 18; + pixel_y = 5 + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bombthreat) "Oh" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -3360,6 +3485,9 @@ /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) "Ox" = ( @@ -3379,12 +3507,27 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, /turf/open/floor/catwalk_floor/iron_smooth, /area/centcom/syndicate_mothership/control) +"OF" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "OK" = ( /obj/structure/railing/corner{ dir = 1 }, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) +"OM" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "OO" = ( /obj/item/gun/energy/ionrifle, /obj/structure/rack, @@ -3393,17 +3536,6 @@ }, /turf/open/floor/catwalk_floor/iron_dark, /area/centcom/syndicate_mothership/control) -"OR" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/structure/sign/poster/contraband/fun_police/directional/west, -/obj/machinery/light/cold/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/mineral/plastitanium, -/area/centcom/syndicate_mothership/expansion_bombthreat) "OS" = ( /obj/structure/chair/stool/directional/south, /obj/structure/sign/map/right{ @@ -3443,29 +3575,9 @@ }, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) -"Pf" = ( -/obj/structure/chair/sofa/right/brown{ - dir = 4 - }, -/obj/structure/sign/poster/contraband/revolver/directional/west, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) "Ph" = ( /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bioterrorism) -"Pi" = ( -/obj/structure/sign/poster/contraband/c20r/directional/south, -/obj/structure/cable, -/turf/open/floor/iron/smooth, -/area/centcom/syndicate_mothership/control) -"Pj" = ( -/obj/machinery/door/window/survival_pod{ - name = "Frosted Door"; - opacity = 1 - }, -/turf/open/floor/iron/freezer, -/area/centcom/syndicate_mothership/control) "Pu" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -3532,6 +3644,14 @@ dir = 1 }, /area/centcom/syndicate_mothership/control) +"Qh" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ + name = "Frosted Window" + }, +/obj/item/soap/syndie, +/obj/structure/sign/poster/contraband/got_wood/directional/east, +/turf/open/floor/iron/freezer, +/area/centcom/syndicate_mothership/control) "Qk" = ( /obj/structure/lattice/catwalk, /obj/effect/turf_decal/stripes/line{ @@ -3542,6 +3662,16 @@ }, /turf/open/lava/plasma/ice_moon, /area/centcom/syndicate_mothership/control) +"Ql" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/fun_police/directional/west, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_bombthreat) "Qp" = ( /obj/structure/lattice/catwalk, /obj/effect/turf_decal/stripes/line{ @@ -3569,6 +3699,14 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) +"QJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/c20r/directional/east, +/obj/machinery/portable_atmospherics/canister/plasma, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/expansion_bombthreat) "QM" = ( /obj/effect/light_emitter{ set_cap = 1; @@ -3587,16 +3725,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/iron, /area/centcom/syndicate_mothership/control) -"Rf" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark, -/obj/structure/closet/syndicate/personal, -/obj/structure/sign/poster/contraband/gorlex_recruitment/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/full, -/turf/open/floor/iron/dark/textured_half{ - dir = 8 - }, -/area/centcom/syndicate_mothership/control) "Rs" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -3630,16 +3758,15 @@ /obj/structure/flora/rock/icy/style_random, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) +"RQ" = ( +/obj/structure/closet/cardboard, +/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6/directional/east, +/turf/open/floor/catwalk_floor/iron_dark, +/area/centcom/syndicate_mothership/control) "RT" = ( /obj/effect/baseturf_helper/asteroid/snow, /turf/closed/indestructible/syndicate, /area/centcom/syndicate_mothership/expansion_bioterrorism) -"RX" = ( -/obj/machinery/light/cold/directional/south, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) "Sc" = ( /obj/structure/railing, /turf/open/floor/iron/stairs/old{ @@ -3719,15 +3846,6 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bombthreat) -"SJ" = ( -/obj/effect/turf_decal/siding/wideplating/dark, -/obj/structure/chair/sofa/bench/right, -/obj/structure/sign/poster/contraband/donut_corp/directional/north, -/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/stone, -/area/centcom/syndicate_mothership/control) "SK" = ( /obj/structure/fence/cut/large, /turf/open/misc/asteroid/snow/airless, @@ -3751,12 +3869,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, /turf/open/floor/catwalk_floor/iron_dark, /area/centcom/syndicate_mothership/control) -"SY" = ( -/obj/structure/sign/poster/contraband/energy_swords/directional/north, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) "Ta" = ( /turf/closed/indestructible/fakedoor{ name = "Sub-Laboratory Elevator" @@ -3770,6 +3882,16 @@ /obj/structure/barricade/sandbags, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) +"Tc" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/structure/closet/syndicate/personal, +/obj/structure/sign/poster/contraband/gorlex_recruitment/directional/north, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/full, +/turf/open/floor/iron/dark/textured_half{ + dir = 8 + }, +/area/centcom/syndicate_mothership/control) "Te" = ( /obj/effect/turf_decal/siding/wideplating{ dir = 1 @@ -3801,6 +3923,14 @@ "To" = ( /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) +"Ts" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/effect/turf_decal/siding/thinplating_new/dark/corner, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "Tw" = ( /obj/machinery/door/airlock/hatch{ name = "Gangway" @@ -3880,16 +4010,16 @@ /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) "TY" = ( -/turf/open/floor/mineral/plastitanium/red, -/area/centcom/syndicate_mothership/control) -"Ul" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark, -/obj/structure/closet/syndicate/personal, -/obj/structure/sign/poster/contraband/lusty_xenomorph/directional/north, -/obj/effect/turf_decal/tile/red/full, -/turf/open/floor/iron/dark/textured_half{ - dir = 8 +/obj/effect/turf_decal/syndicateemblem/bottom/middle{ + dir = 4 + }, +/obj/effect/turf_decal/syndicateemblem/top/left{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 }, +/turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/control) "Un" = ( /obj/effect/turf_decal/stripes/corner{ @@ -3921,14 +4051,16 @@ /obj/machinery/light/cold/directional/east, /turf/open/floor/plating, /area/centcom/syndicate_mothership/control) -"Vb" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +"Va" = ( +/obj/effect/turf_decal/syndicateemblem/middle/left{ + dir = 8 }, -/obj/effect/turf_decal/siding/purple, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/mineral/plastitanium, -/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +/obj/effect/turf_decal/syndicateemblem/middle/left{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/control) "Vm" = ( /obj/structure/flora/rock/pile/style_random, /turf/open/misc/asteroid/snow/icemoon, @@ -3937,19 +4069,11 @@ /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 5 }, +/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ + dir = 8 + }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) -"VA" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ - name = "Tinted Window"; - opacity = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/plating, -/area/centcom/syndicate_mothership/expansion_bombthreat) "VC" = ( /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/dark/textured_half{ @@ -3992,14 +4116,6 @@ }, /turf/open/lava/plasma/ice_moon, /area/centcom/syndicate_mothership/control) -"VW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/cold/directional/east, -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/plating, -/area/centcom/syndicate_mothership/expansion_bombthreat) "Wc" = ( /obj/machinery/vending/coffee, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -4063,6 +4179,17 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) +"WG" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 8 + }, +/obj/structure/sign/poster/contraband/syndicate_pistol/directional/north, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) +"WI" = ( +/obj/structure/sign/poster/contraband/revolver/directional/south, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "WR" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/siding/red{ @@ -4072,6 +4199,12 @@ /obj/item/pen, /turf/open/floor/iron/dark/textured_large, /area/centcom/syndicate_mothership/control) +"WS" = ( +/obj/structure/sign/poster/contraband/energy_swords/directional/north, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "WU" = ( /obj/effect/turf_decal/siding/thinplating_new/dark, /obj/structure/closet/syndicate/personal, @@ -4132,15 +4265,6 @@ /obj/structure/flora/tree/pine/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) -"XD" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ - name = "Frosted Window"; - opacity = 1 - }, -/obj/item/soap/syndie, -/obj/structure/sign/poster/contraband/got_wood/directional/east, -/turf/open/floor/iron/freezer, -/area/centcom/syndicate_mothership/control) "XL" = ( /obj/machinery/light/cold/directional/east, /turf/open/floor/catwalk_floor/iron_dark, @@ -4179,6 +4303,14 @@ /obj/machinery/light/cold/directional/east, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_bombthreat) +"XX" = ( +/obj/structure/sign/poster/contraband/lusty_xenomorph/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/iron/smooth_half{ + dir = 1 + }, +/area/centcom/syndicate_mothership/control) "Ye" = ( /turf/closed/indestructible/rock/snow, /area/centcom/syndicate_mothership) @@ -4211,31 +4343,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_smooth, /area/centcom/syndicate_mothership/control) -"YI" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 9 - }, -/obj/structure/table/glass/plasmaglass, -/obj/machinery/reagentgrinder{ - pixel_x = -5; - pixel_y = 12 - }, -/obj/item/reagent_containers/cup/beaker/large{ - pixel_x = -7; - pixel_y = -8 - }, -/obj/item/reagent_containers/cup/beaker/cryoxadone{ - pixel_x = 9; - pixel_y = -7 - }, -/obj/structure/sign/poster/contraband/lizard/directional/west, -/obj/structure/sign/poster/contraband/kudzu/directional/north, -/obj/item/reagent_containers/spray/plantbgone{ - pixel_x = 10; - pixel_y = 5 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/centcom/syndicate_mothership/expansion_bioterrorism) "YJ" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 @@ -4273,6 +4380,17 @@ /obj/structure/flora/grass/both/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) +"Zc" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/fun_police/directional/west, +/obj/machinery/light/cold/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_bombthreat) "Zg" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -4318,6 +4436,16 @@ /obj/structure/closet/firecloset, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) +"ZF" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ + name = "Tinted Window" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/expansion_bombthreat) "ZG" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ @@ -4332,6 +4460,13 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) +"ZI" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "ZL" = ( /obj/structure/flora/grass/both/style_random, /obj/structure/flora/rock/icy/style_random, @@ -4340,47 +4475,6 @@ "ZO" = ( /turf/closed/indestructible/opsglass, /area/centcom/syndicate_mothership/expansion_bioterrorism) -"ZV" = ( -/obj/structure/table/glass/plasmaglass, -/obj/item/pen{ - pixel_x = 9; - pixel_y = 18 - }, -/obj/structure/sign/poster/contraband/syndiemoth/directional/west, -/obj/item/storage/box/beakers{ - pixel_x = -4; - pixel_y = 17 - }, -/obj/item/storage/box/syringes{ - pixel_x = 4; - pixel_y = 17 - }, -/obj/item/assembly/igniter{ - pixel_x = 7; - pixel_y = 6 - }, -/obj/item/assembly/igniter{ - pixel_x = 7; - pixel_y = 1 - }, -/obj/item/assembly/igniter{ - pixel_x = 7; - pixel_y = -3 - }, -/obj/item/assembly/timer{ - pixel_x = -6; - pixel_y = 3 - }, -/obj/item/assembly/timer{ - pixel_x = -6; - pixel_y = -1 - }, -/obj/item/assembly/timer{ - pixel_x = -6; - pixel_y = -5 - }, -/turf/open/floor/mineral/titanium/tiled/yellow, -/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "ZW" = ( /obj/structure/lattice/catwalk, /obj/effect/turf_decal/stripes/line, @@ -4669,8 +4763,8 @@ nQ AR BR Sm -nh -ZV +rL +dF dx nQ Ox @@ -4779,7 +4873,7 @@ DZ DZ DZ xu -YI +cO HD oi MH @@ -4972,7 +5066,7 @@ sU sU Ox nQ -sY +lv BE Tz bU @@ -5079,13 +5173,13 @@ FG KD qX qX -Vb +JU nQ DZ Ta DZ xu -vG +CF Ph Jq gV @@ -5183,9 +5277,9 @@ iO Mt EV nQ -yG +kQ Ow -LK +CQ ZO XT xg @@ -5278,16 +5372,16 @@ sU sU Ox nQ -kN +Bg yf yf yf yf na PD -zE -TY -lt +OM +Hm +DM ws Wz KL @@ -5387,11 +5481,11 @@ Ge Ge Ge xf -zE -TY -lt +ZI +nF +zZ ZO -aC +JJ mb Mv nL @@ -5484,13 +5578,13 @@ Ye nQ nQ AW -DI -ET -ss +EL +Jf +eu hN PD -zE -TY +ZI +JX yP RD RD @@ -5591,16 +5685,16 @@ nQ nQ nQ nQ -GX -TY +ZI +Va JL RD SD So -jd -lH -rX -OR +ia +Oc +Ql +Zc RD RD RD @@ -5688,19 +5782,19 @@ ub vX DZ oW -do +Ax yK -mt +Ht In VK -zE -TY -lt +ZI +GU +zZ FM wM ee yp -zJ +fD VF If bQ @@ -5790,14 +5884,14 @@ PN qO DZ iA -tC +GS Zg pU lt XQ -zE -TY -lt +ZI +ve +zZ Lu ae ae @@ -5808,7 +5902,7 @@ LF cA RD PM -qc +Le RD Ox sU @@ -5892,14 +5986,14 @@ uT PN DZ bE -yy +gL rS iH Bn VK -zE +Ts TY -lt +hX FM iL mB @@ -6001,7 +6095,7 @@ ek ek Vr cQ -sz +uf RD Gf gh @@ -6009,7 +6103,7 @@ yi Gf LY te -aR +qK kW oy oy @@ -6095,9 +6189,9 @@ VK VK DZ aM -ga +rJ Cf -nb +nU ek qs ek @@ -6108,7 +6202,7 @@ RD NH Tl nR -VA +ZF AA ZG Oh @@ -6196,7 +6290,7 @@ VK VK iX DZ -cC +ND uX uX uX @@ -6208,9 +6302,9 @@ Yx JR RD Ns -fo -VW -ts +QJ +fl +ym Yk XV sj @@ -6301,9 +6395,9 @@ Lx uX uX uX -gI +wN ek -mG +zS ek zp Yx @@ -6403,7 +6497,7 @@ DZ gE my uX -zN +Jc ek Id ek @@ -6412,12 +6506,12 @@ Yx dN DZ fu -Pj -fH -Bk -GV +uN +Dq +gw +km gs -xU +pa RD RD RD @@ -6513,13 +6607,13 @@ DZ GF DZ DZ -fu -XD +aX +Qh IQ bo bo -NM -NM +lA +lA DZ Ox Ox @@ -6712,7 +6806,7 @@ ld ld KH Ez -Jz +lF px px Qr @@ -6723,7 +6817,7 @@ tc mJ DY lQ -Pf +Nb VK KA ZL @@ -6922,11 +7016,11 @@ Wp kF YF DZ -SY +WS HJ kX HJ -lm +hE El VK YZ @@ -7119,17 +7213,17 @@ mK er TS DZ -SJ +Lz Wp Wp -Pi +cw DZ Sv DZ KW gS Ca -pj +XX KW DZ To @@ -7219,7 +7313,7 @@ DZ OS TG jT -zW +du DZ Dy Wp @@ -7331,7 +7425,7 @@ DZ ad DZ pD -hc +Mh Ca wG pD @@ -7834,7 +7928,7 @@ uT uT VK qp -DN +wO Ms Oi VK @@ -7936,7 +8030,7 @@ uT PN VK qp -eo +yw VC Oi VK @@ -8242,7 +8336,7 @@ uT uT VK qp -jf +MQ oK Oi VK @@ -8344,7 +8438,7 @@ uT uT VK qp -DN +wO Ms Oi VK @@ -8851,7 +8945,7 @@ VK VK VK DZ -Cm +Ed GI IM wG @@ -8948,10 +9042,10 @@ qw qw ng hb +TC FR TC TC -FR hb ZZ Me @@ -9050,10 +9144,10 @@ qw qw ng qJ -FR TC TC FR +TC qJ ZZ Me @@ -9149,7 +9243,7 @@ uT bW qw qw -pM +qw DZ DZ VK @@ -9157,7 +9251,7 @@ Xv KE VK DZ -qL +WG ij zH wG @@ -9253,7 +9347,7 @@ qw qw qw VK -eh +jc ay so uX @@ -9458,16 +9552,16 @@ qw qw AN LS -cc +Mn uX ZH -RX +LN DZ Fp go -pi +as +wG wG -AL DZ DZ DZ @@ -9557,13 +9651,13 @@ uT bW Zk qw -pM +qw DZ DZ DZ js sQ -aH +GB DZ DZ qp @@ -9668,14 +9762,14 @@ DZ DZ DZ pK -EJ +pg VK ZZ ZZ dn qN qN -ao +qN Wu ov or @@ -9763,13 +9857,13 @@ qw qw qw VH -gM +WI DZ WU dO OO DZ -NA +CM FN VK ZZ @@ -9867,7 +9961,7 @@ qw Py sp DZ -Ul +nH ol cT DZ @@ -9967,7 +10061,7 @@ qw qw qw Rs -wy +wC DZ Ld ol @@ -9984,7 +10078,7 @@ au LB iV ov -Nr +ah DZ Ox sq @@ -10071,7 +10165,7 @@ qw VH ZZ DZ -Rf +Tc Ib Ib en @@ -10171,11 +10265,11 @@ qw UE Sg Py -xs +aK DZ Ld XL -pF +RQ VK ZZ ZZ @@ -10385,13 +10479,13 @@ Zt VK qw VK -oN +qv pr ya PF ya oD -Et +OF DZ DZ DZ diff --git a/_maps/templates/lazy_templates/wizard_den.dmm b/_maps/templates/lazy_templates/wizard_den.dmm index efe2d455c2366..c6150df401871 100644 --- a/_maps/templates/lazy_templates/wizard_den.dmm +++ b/_maps/templates/lazy_templates/wizard_den.dmm @@ -6,17 +6,20 @@ }, /turf/open/floor/engine/cult, /area/centcom/wizard_station) +"cm" = ( +/obj/structure/table/wood, +/obj/item/bikehorn/golden{ + pixel_x = -8; + pixel_y = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) "cs" = ( /turf/closed/indestructible/fakeglass{ color = "#008000" }, /area/centcom/wizard_station) -"cu" = ( -/obj/structure/table/wood/fancy, -/obj/item/storage/photo_album, -/obj/machinery/light/directional/south, -/turf/open/floor/carpet, -/area/centcom/wizard_station) "cy" = ( /obj/machinery/door/airlock{ icon = 'icons/obj/doors/airlocks/station/uranium.dmi'; @@ -54,10 +57,6 @@ /obj/item/food/burger/spell, /turf/open/floor/carpet, /area/centcom/wizard_station) -"gR" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/wood, -/area/centcom/wizard_station) "hT" = ( /turf/open/floor/engine/cult, /area/centcom/wizard_station) @@ -112,12 +111,12 @@ "lL" = ( /turf/open/floor/carpet, /area/centcom/wizard_station) -"nu" = ( -/obj/structure/table/wood, -/obj/item/bikehorn/golden{ - pixel_x = -8; - pixel_y = 8 - }, +"mc" = ( +/obj/structure/closet/crate/preopen, +/obj/item/clothing/suit/wizrobe/red, +/obj/item/clothing/head/wizard/red, +/obj/item/staff, +/obj/item/clothing/shoes/sandal/magic, /turf/open/floor/engine/cult, /area/centcom/wizard_station) "nN" = ( @@ -166,10 +165,22 @@ /obj/machinery/vending/magivend, /turf/open/floor/engine/cult, /area/centcom/wizard_station) +"pw" = ( +/obj/machinery/computer/camera_advanced{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/wood, +/area/centcom/wizard_station) "pA" = ( /obj/machinery/power/shuttle_engine/propulsion, /turf/open/floor/plating/airless, /area/centcom/wizard_station) +"pI" = ( +/obj/structure/table/wood/fancy, +/obj/item/storage/photo_album, +/turf/open/floor/carpet, +/area/centcom/wizard_station) "qe" = ( /turf/open/floor/grass, /area/centcom/wizard_station) @@ -190,8 +201,9 @@ }, /turf/open/floor/wood, /area/centcom/wizard_station) -"rc" = ( -/obj/machinery/light/directional/east, +"sx" = ( +/obj/structure/table/wood, +/obj/item/retractor, /turf/open/floor/engine/cult, /area/centcom/wizard_station) "tv" = ( @@ -265,17 +277,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/engine/cult, /area/centcom/wizard_station) -"Dc" = ( -/obj/structure/table/wood, -/obj/item/clothing/suit/wizrobe/magusblue, -/obj/item/clothing/head/wizard/magus, -/obj/item/staff, -/obj/structure/mirror/magic{ - pixel_y = 28 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/engine/cult, -/area/centcom/wizard_station) "Do" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/iron/white, @@ -318,6 +319,11 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron, /area/centcom/wizard_station) +"HX" = ( +/obj/structure/chair/wood/wings, +/obj/machinery/light/small/directional/north, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) "IZ" = ( /obj/structure/chair/wood/wings{ dir = 1 @@ -329,6 +335,13 @@ /obj/effect/decal/cleanable/blood/splatter, /turf/open/floor/grass, /area/centcom/wizard_station) +"JQ" = ( +/obj/structure/chair/wood/wings{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/carpet, +/area/centcom/wizard_station) "JW" = ( /obj/machinery/door/airlock{ icon = 'icons/obj/doors/airlocks/station/uranium.dmi'; @@ -339,12 +352,6 @@ "Lt" = ( /turf/open/floor/wood, /area/centcom/wizard_station) -"LC" = ( -/obj/machinery/computer/camera_advanced{ - dir = 4 - }, -/turf/open/floor/wood, -/area/centcom/wizard_station) "LU" = ( /obj/machinery/door/airlock{ icon = 'icons/obj/doors/airlocks/station/uranium.dmi'; @@ -352,10 +359,6 @@ }, /turf/open/floor/engine/cult, /area/centcom/wizard_station) -"Mz" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/engine/cult, -/area/centcom/wizard_station) "MW" = ( /obj/structure/table/wood/fancy, /obj/item/storage/dice{ @@ -427,7 +430,7 @@ /turf/open/floor/wood, /area/centcom/wizard_station) "SD" = ( -/obj/structure/bookcase/random/reference, +/obj/structure/bookcase/random/reference/wizard, /turf/open/floor/engine/cult, /area/centcom/wizard_station) "Tl" = ( @@ -454,14 +457,6 @@ /obj/structure/sink/directional/south, /turf/open/floor/iron/white, /area/centcom/wizard_station) -"Uu" = ( -/obj/structure/closet/crate/preopen, -/obj/item/clothing/suit/wizrobe/red, -/obj/item/clothing/head/wizard/red, -/obj/item/staff, -/obj/item/clothing/shoes/sandal/magic, -/turf/open/floor/engine/cult, -/area/centcom/wizard_station) "UC" = ( /obj/machinery/computer/shuttle, /turf/open/floor/engine/cult, @@ -494,6 +489,16 @@ /obj/effect/decal/remains/xeno, /turf/open/floor/grass, /area/centcom/wizard_station) +"Xt" = ( +/obj/structure/table/wood, +/obj/item/clothing/suit/wizrobe/magusblue, +/obj/item/clothing/head/wizard/magus, +/obj/item/staff, +/obj/structure/mirror/magic{ + pixel_y = 28 + }, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) "XJ" = ( /mob/living/simple_animal/bot/medbot/mysterious{ desc = "If you don't accidentally blow yourself up from time to time you're not really a wizard anyway."; @@ -506,6 +511,13 @@ /obj/structure/chair/wood/wings, /turf/open/floor/engine/cult, /area/centcom/wizard_station) +"Yp" = ( +/obj/structure/chair/wood/wings{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) "Yv" = ( /obj/structure/table/wood, /obj/item/stack/medical/bruise_pack, @@ -518,12 +530,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/centcom/wizard_station) -"Zu" = ( -/obj/structure/table/wood, -/obj/item/retractor, -/obj/machinery/light/directional/north, -/turf/open/floor/engine/cult, -/area/centcom/wizard_station) "ZA" = ( /obj/structure/toilet{ dir = 1 @@ -922,11 +928,11 @@ dp dp dp dp -XV +HX ft SD ft -IZ +Yp dp cs cs @@ -965,7 +971,7 @@ op op dp dp -LC +pw Lt dk hT @@ -1068,7 +1074,7 @@ IZ dp hT hT -hT +Cm dp xn GV @@ -1104,7 +1110,7 @@ zB uy Lt Lt -gR +Lt dp dp cs @@ -1112,7 +1118,7 @@ cs cs dp dp -AW +hT lL hT qg @@ -1189,7 +1195,7 @@ op op dp dp -Mz +Sg ko dp dp @@ -1198,11 +1204,11 @@ ae dp dp dp -Zu +sx +hT hT hT hT -Cm dp hT lL @@ -1212,7 +1218,7 @@ dp dp dp dp -hT +Sg hT VO OV @@ -1239,12 +1245,12 @@ hT hT cs hT +Sg hT hT -Sg pt dp -hT +AW hT hT hT @@ -1331,12 +1337,12 @@ hT hT cs hT +jV hT hT -jV jD dp -hT +AW hT hT hT @@ -1373,7 +1379,7 @@ op op dp dp -rc +jV om dp dp @@ -1382,11 +1388,11 @@ WQ dp dp dp -Dc +Xt +hT hT hT hT -Cm dp hT lL @@ -1396,7 +1402,7 @@ dp dp dp dp -nu +cm hT VO OV @@ -1429,7 +1435,7 @@ tz MW dp PF -Uu +mc DX hT hT @@ -1472,7 +1478,7 @@ PK xc VB lL -cu +pI dp dp cs @@ -1480,7 +1486,7 @@ cs cs dp dp -AW +hT lL hT oE @@ -1528,7 +1534,7 @@ kZ cs hT hT -hT +Cm dp Ug Do @@ -1609,7 +1615,7 @@ op op dp dp -kh +JQ lL cs Dq diff --git a/_maps/templates/shelter_t.dmm b/_maps/templates/shelter_t.dmm new file mode 100644 index 0000000000000..1e8ff8bc590f0 --- /dev/null +++ b/_maps/templates/shelter_t.dmm @@ -0,0 +1,46 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/wall/mineral/titanium/survival/pod, +/area/misc/survivalpod) +"e" = ( +/obj/structure/sign/warning/biohazard, +/turf/closed/wall/mineral/titanium/survival/pod, +/area/misc/survivalpod) +"C" = ( +/obj/machinery/door/airlock/survival_pod/glass, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "podtoilet"; + name = "Privacy Shutters" + }, +/turf/open/floor/pod, +/area/misc/survivalpod) +"H" = ( +/obj/structure/toilet, +/obj/item/paper{ + pixel_x = 7; + pixel_y = -7 + }, +/obj/effect/turf_decal/trimline/red, +/obj/machinery/button/door/directional/east{ + id = "podtoilet"; + name = "Privacy Shutters"; + pixel_y = 6 + }, +/turf/open/floor/pod, +/area/misc/survivalpod) + +(1,1,1) = {" +a +e +a +"} +(2,1,1) = {" +a +H +C +"} +(3,1,1) = {" +a +a +a +"} diff --git a/_maps/tramstation.json b/_maps/tramstation.json index a1317fc1e4b11..7336decb3d7f5 100644 --- a/_maps/tramstation.json +++ b/_maps/tramstation.json @@ -11,12 +11,12 @@ }, "traits": [ { - "Up": 1, + "Up": true, "Baseturf": "/turf/open/misc/asteroid/airless", "Linkage": "Cross" }, { - "Down": -1, + "Down": true, "Baseturf": "/turf/open/openspace", "Linkage": "Cross" } diff --git a/_maps/virtual_domains/README.md b/_maps/virtual_domains/README.md new file mode 100644 index 0000000000000..a02d43e1575ee --- /dev/null +++ b/_maps/virtual_domains/README.md @@ -0,0 +1,32 @@ +# Making new virtual domains + +## From scratch + +1. Create a new map using TGM format. It can be any size, but please, consider limiting to 75x75 max. +2. Ensure that the map has ONE tile marked with the safehouse bottom left landmark. If you're using modular safehouses, it will need to be a 7x6 area. +4. Provide a way for players to enter your new map via the north door, which is 4th tile over. +5. Enclose your area with a single wall binary closed wall. + +## From an existing map + +1. Create a new map using the existing map's size - give yourself enough room to enclose it with a binary wall. There's no need for any space outside of it, so ensure that it fits and is enclosed, nothing outside of this. +2. Copy and paste the existing map into it. +3. Find an accessible area for a safehouse, 7x6 - or with a custom, just ensure the necessary landmarks are placed. +4. Place a bottom left safehouse landmark somewhere on the map to load the safehouse. + +## BOTH. +1. You need to have one (1) way that the encrypted cache can spawn. This can be from a mob drop, a landmark (place a few, it'll pick one), or a signable landmark if you have a points system. +2. Make note of the size of the map. Make sure this is in the dm file. +3. Create the dm file that defines the map qualities. Examples are in the bitrunning file. + +### Notes + +You shouldn't need to fully enclose your map in 15 tiles of binary filler. Using one solid wall should do the trick. + +Adding some open tile padding around the safehouse is a good touch. About 7 tiles West/East for the visual effect of a larger map. + +If you want to add prep gear, you can do so within the safehouse's area as long you don't overlap with goal turfs or exit spawners. The top left corner is a good spot for this, with respect for the walls, therefore [1, 1], [1, 2], [1, 3] + +You can also create safehouses if you find yourself needing the same gear over and over again. There is a readme for that as well. + +Boss zones should give players pretty ample space, I've been using a 23x23 minimum area. diff --git a/_maps/virtual_domains/ash_drake.dmm b/_maps/virtual_domains/ash_drake.dmm new file mode 100644 index 0000000000000..50fbac8696ab3 --- /dev/null +++ b/_maps/virtual_domains/ash_drake.dmm @@ -0,0 +1,1750 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"c" = ( +/turf/template_noop, +/area/virtual_domain/safehouse) +"e" = ( +/obj/structure/marker_beacon/cerulean, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"f" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/template_noop, +/area/virtual_domain/safehouse) +"g" = ( +/obj/structure/marker_beacon/lime, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"h" = ( +/obj/machinery/light/small/blacklight/directional/south, +/obj/effect/baseturf_helper/virtual_domain, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/virtual_domain/powered) +"i" = ( +/obj/structure/marker_beacon/jade, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"j" = ( +/obj/structure/marker_beacon/teal, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"l" = ( +/obj/structure/marker_beacon/bronze, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"q" = ( +/mob/living/simple_animal/hostile/megafauna/dragon/virtual_domain, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"s" = ( +/turf/closed/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"u" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/indestructible/binary, +/area/lavaland/surface/outdoors/virtual_domain) +"v" = ( +/turf/closed/indestructible/binary, +/area/lavaland/surface/outdoors/virtual_domain) +"G" = ( +/obj/structure/marker_beacon/purple, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"J" = ( +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"L" = ( +/obj/effect/landmark/bitrunning/safehouse_spawn, +/turf/template_noop, +/area/virtual_domain/safehouse) +"P" = ( +/obj/structure/marker_beacon/fuchsia, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"Z" = ( +/obj/effect/mob_spawn/corpse/human/miner, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) + +(1,1,1) = {" +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +u +"} +(2,1,1) = {" +v +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +v +"} +(3,1,1) = {" +v +s +s +s +s +J +J +s +s +J +J +s +s +J +J +J +J +s +s +s +J +J +J +s +s +s +s +s +s +s +s +s +s +J +J +s +s +s +J +J +s +s +J +J +s +v +"} +(4,1,1) = {" +v +s +s +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +a +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +s +v +"} +(5,1,1) = {" +v +s +s +J +a +J +J +J +J +a +J +J +J +J +a +a +J +J +J +J +J +a +a +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +s +s +v +"} +(6,1,1) = {" +v +s +s +J +a +J +J +a +a +a +a +a +a +a +a +a +a +a +a +J +a +a +a +a +a +J +J +J +a +a +J +J +J +a +a +J +a +J +a +a +J +J +J +s +s +v +"} +(7,1,1) = {" +v +s +s +J +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +J +J +s +v +"} +(8,1,1) = {" +v +s +s +J +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +J +s +s +v +"} +(9,1,1) = {" +v +s +J +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +i +a +a +a +a +a +Z +a +a +a +a +a +a +a +a +a +a +J +J +s +v +"} +(10,1,1) = {" +v +s +J +J +J +a +a +a +a +a +a +G +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +J +s +v +"} +(11,1,1) = {" +v +s +s +J +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +J +s +v +"} +(12,1,1) = {" +v +s +s +J +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +J +J +s +v +"} +(13,1,1) = {" +v +s +s +J +J +a +a +a +a +a +a +a +a +a +a +a +a +g +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +J +s +v +"} +(14,1,1) = {" +v +s +s +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +J +s +v +"} +(15,1,1) = {" +v +s +J +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +h +c +c +c +c +c +L +a +a +J +J +s +v +"} +(16,1,1) = {" +v +s +J +J +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +c +c +c +c +c +c +a +a +J +J +s +v +"} +(17,1,1) = {" +v +s +s +J +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +l +a +a +c +c +c +c +c +c +a +a +J +J +s +v +"} +(18,1,1) = {" +v +s +s +J +J +a +a +a +a +a +a +a +a +q +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +c +c +c +c +c +c +a +J +J +s +s +v +"} +(19,1,1) = {" +v +s +J +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +c +c +c +c +c +c +a +a +J +J +s +v +"} +(20,1,1) = {" +v +s +J +J +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +c +c +c +c +c +c +a +a +J +J +s +v +"} +(21,1,1) = {" +v +s +s +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +e +a +a +a +a +a +a +a +a +a +a +a +a +h +c +c +c +c +c +f +a +a +J +s +s +v +"} +(22,1,1) = {" +v +s +s +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +s +s +v +"} +(23,1,1) = {" +v +s +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +s +s +v +"} +(24,1,1) = {" +v +s +J +J +a +a +a +a +j +a +a +a +a +a +P +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +J +s +v +"} +(25,1,1) = {" +v +s +s +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +J +J +s +v +"} +(26,1,1) = {" +v +s +s +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +J +s +v +"} +(27,1,1) = {" +v +s +s +J +J +J +a +a +a +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +j +a +a +a +a +a +a +a +J +J +s +v +"} +(28,1,1) = {" +v +s +J +J +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +J +J +s +v +"} +(29,1,1) = {" +v +s +J +J +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +J +s +s +v +"} +(30,1,1) = {" +v +s +s +J +J +J +J +a +a +J +J +J +a +a +a +a +J +J +J +a +a +a +J +J +J +a +a +a +J +J +a +a +a +a +a +a +J +J +a +a +a +J +J +s +s +v +"} +(31,1,1) = {" +v +s +s +a +J +J +J +J +J +J +J +J +J +a +a +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +a +a +a +J +J +J +J +J +J +J +J +J +s +v +"} +(32,1,1) = {" +v +s +s +a +J +J +J +J +J +J +J +J +J +J +J +J +J +a +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +s +v +"} +(33,1,1) = {" +v +s +s +s +s +s +J +J +s +s +s +s +J +J +s +s +s +s +s +s +J +J +s +s +s +s +J +J +s +s +s +s +J +J +J +s +s +s +s +s +s +J +J +J +s +v +"} +(34,1,1) = {" +v +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +v +"} +(35,1,1) = {" +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +"} diff --git a/_maps/virtual_domains/beach_bar.dmm b/_maps/virtual_domains/beach_bar.dmm new file mode 100644 index 0000000000000..408d3c0cda122 --- /dev/null +++ b/_maps/virtual_domains/beach_bar.dmm @@ -0,0 +1,2932 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ab" = ( +/obj/machinery/vending/cigarette/beach, +/obj/effect/turf_decal/sand, +/obj/structure/sign/poster/contraband/have_a_puff/directional/west, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"ag" = ( +/turf/open/floor/carpet/red, +/area/virtual_domain/powered) +"as" = ( +/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/virtual_domain/powered) +"aw" = ( +/obj/machinery/grill, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"aE" = ( +/turf/open/floor/pod/light, +/area/virtual_domain/powered) +"aZ" = ( +/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/virtual_domain/powered) +"bf" = ( +/mob/living/basic/crab{ + name = "Jonny" + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"bC" = ( +/obj/effect/turf_decal/sand, +/mob/living/basic/crab{ + name = "James" + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"bM" = ( +/mob/living/basic/crab{ + name = "Jon" + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"bQ" = ( +/obj/structure/fluff/beach_umbrella/cap, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"bS" = ( +/obj/machinery/chem_master/condimaster{ + name = "CondiMaster Neo"; + pixel_x = -4 + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"cb" = ( +/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/virtual_domain/powered) +"cv" = ( +/turf/open/floor/carpet/royalblue, +/area/virtual_domain/powered) +"cz" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/jukebox, +/obj/item/coin/gold, +/turf/open/floor/sepia, +/area/virtual_domain/powered) +"cG" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/water/beach, +/area/virtual_domain/powered) +"db" = ( +/obj/item/reagent_containers/cup/glass/bottle/beer/light, +/obj/item/reagent_containers/cup/glass/bottle/beer/light, +/obj/item/reagent_containers/cup/glass/bottle/beer/light, +/obj/item/reagent_containers/cup/glass/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("bar") + }, +/obj/item/storage/backpack/duffelbag, +/obj/item/etherealballdeployer, +/obj/item/reagent_containers/cup/glass/bottle/beer/light, +/obj/item/reagent_containers/cup/glass/bottle/beer/light, +/obj/item/reagent_containers/cup/glass/bottle/beer/light, +/obj/item/reagent_containers/cup/glass/bottle/beer/light, +/obj/item/reagent_containers/cup/glass/bottle/beer/light, +/obj/item/reagent_containers/cup/glass/bottle/beer/light, +/obj/item/reagent_containers/cup/glass/bottle/beer/light, +/obj/item/reagent_containers/cup/glass/bottle/beer/light, +/obj/item/reagent_containers/cup/glass/bottle/beer/light, +/obj/item/reagent_containers/cup/glass/bottle/beer/light, +/obj/item/reagent_containers/cup/glass/colocup, +/obj/item/reagent_containers/cup/glass/colocup, +/obj/item/reagent_containers/cup/glass/colocup, +/obj/item/reagent_containers/cup/glass/colocup, +/obj/item/reagent_containers/cup/glass/colocup, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"di" = ( +/obj/machinery/vending/boozeomat, +/obj/effect/mapping_helpers/atom_injector/obj_flag{ + inject_flags = 1; + target_type = /obj/machinery/vending/boozeomat + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"dj" = ( +/turf/open/misc/beach/coast{ + dir = 1 + }, +/area/virtual_domain/powered) +"dx" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/turf/open/floor/sepia, +/area/virtual_domain/powered) +"dI" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"dZ" = ( +/obj/structure/bookcase/random/reference, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"ed" = ( +/obj/machinery/atmospherics/components/tank/air{ + dir = 1 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"er" = ( +/obj/structure/noticeboard/staff, +/turf/closed/wall/mineral/wood/nonmetal, +/area/virtual_domain/powered) +"fc" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/pill/happy, +/obj/item/toy/figure/bartender{ + pixel_x = -8; + pixel_y = -1 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/virtual_domain{ + pixel_y = 8; + pixel_x = 5 + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"fr" = ( +/obj/item/melee/skateboard/hoverboard, +/obj/machinery/light/directional/west, +/turf/open/floor/pod/light, +/area/virtual_domain/powered) +"gh" = ( +/obj/structure/flora/bush/stalky/style_random, +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/water/beach, +/area/virtual_domain/powered) +"gl" = ( +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"gJ" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/misc/beach/coast{ + dir = 4 + }, +/area/virtual_domain/powered) +"hk" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/pod/light, +/area/virtual_domain/powered) +"hE" = ( +/obj/structure/sign/departments/restroom/directional/east, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"hG" = ( +/obj/machinery/door/airlock/sandstone{ + name = "Surfer Shack 1" + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"iz" = ( +/turf/closed/indestructible/binary, +/area/lavaland/surface/outdoors/virtual_domain) +"iR" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/barman_recipes, +/obj/item/reagent_containers/cup/glass/shaker, +/obj/item/reagent_containers/cup/rag, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"jc" = ( +/turf/open/floor/iron/stairs/right, +/area/virtual_domain/powered) +"jg" = ( +/obj/machinery/vending/hydronutrients, +/turf/open/floor/iron/grimy, +/area/virtual_domain/powered) +"jl" = ( +/obj/structure/flora/rock/pile/jungle/style_random, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"jy" = ( +/obj/effect/turf_decal/sand{ + density = 1 + }, +/obj/effect/decal/fakelattice, +/turf/open/floor/pod/light{ + density = 1 + }, +/area/virtual_domain/powered) +"ke" = ( +/obj/structure/marker_beacon/bronze, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"kn" = ( +/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/virtual_domain/powered) +"kv" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/indestructible/binary, +/area/lavaland/surface/outdoors/virtual_domain) +"kG" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"kK" = ( +/obj/structure/mirror/directional/west, +/obj/structure/sink/kitchen/directional/south, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"kT" = ( +/obj/structure/chair/stool/bar/directional/south, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"lq" = ( +/obj/item/melee/skateboard/hoverboard, +/turf/open/floor/pod/light, +/area/virtual_domain/powered) +"lB" = ( +/obj/item/toy/seashell, +/obj/effect/turf_decal/sand, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"lS" = ( +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/virtual_domain/powered) +"ml" = ( +/turf/template_noop, +/area/virtual_domain/safehouse) +"mq" = ( +/obj/structure/closet/secure_closet/freezer/kitchen/all_access, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"mG" = ( +/obj/structure/easel, +/obj/item/canvas/twentythree_twentythree, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"mP" = ( +/turf/open/misc/beach/coast/corner{ + dir = 1 + }, +/area/virtual_domain/powered) +"mX" = ( +/obj/structure/closet/secure_closet/freezer/meat/all_access, +/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/virtual_domain/powered) +"nP" = ( +/obj/item/stack/sheet/iron/fifty, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"oE" = ( +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/misc/beach/coast/corner{ + dir = 8 + }, +/area/virtual_domain/powered) +"oP" = ( +/obj/structure/table/wood, +/obj/machinery/reagentgrinder, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"pr" = ( +/turf/template_noop, +/area/template_noop) +"pC" = ( +/obj/machinery/computer/arcade/battle, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"pT" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"pZ" = ( +/obj/machinery/light/directional/south, +/turf/open/misc/beach/coast{ + dir = 1 + }, +/area/virtual_domain/powered) +"qc" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"qg" = ( +/obj/structure/sign/poster/contraband/space_up/directional/west, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"qR" = ( +/obj/effect/spawner/structure/window, +/obj/structure/curtain, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"qW" = ( +/obj/item/melee/skateboard/hoverboard, +/mob/living/basic/chicken{ + name = "Chicken Joe" + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"rc" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"ri" = ( +/obj/structure/sign/poster/official/fruit_bowl, +/turf/closed/wall/mineral/wood/nonmetal, +/area/virtual_domain/powered) +"rm" = ( +/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/virtual_domain/powered) +"rT" = ( +/obj/item/toy/seashell, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"sT" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/template_noop, +/area/virtual_domain/safehouse) +"tE" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Resort Casino" + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"tF" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"tZ" = ( +/obj/structure/toilet, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"uc" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/light/small/directional/east, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/virtual_domain/powered) +"ug" = ( +/obj/structure/closet/secure_closet{ + icon_state = "cabinet"; + name = "bartender's closet"; + req_access = list("bar") + }, +/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/costume/hawaiian, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"uk" = ( +/obj/structure/closet/crate/hydroponics, +/obj/item/shovel/spade, +/obj/item/reagent_containers/cup/bucket, +/obj/item/cultivator, +/turf/open/floor/iron/grimy, +/area/virtual_domain/powered) +"uq" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/drinkingglass/virtual_domain, +/obj/item/reagent_containers/cup/glass/drinkingglass/virtual_domain{ + pixel_x = -4; + pixel_y = 8 + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"uU" = ( +/obj/effect/turf_decal/sand, +/turf/open/floor/sepia, +/area/virtual_domain/powered) +"uV" = ( +/obj/structure/flora/coconuts, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"ve" = ( +/obj/item/toy/dodgeball, +/obj/item/toy/dodgeball, +/obj/item/toy/dodgeball, +/obj/item/toy/dodgeball, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"vp" = ( +/obj/machinery/light/directional/east, +/obj/structure/chair/stool/bar/directional/south, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"vq" = ( +/obj/machinery/oven/range, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"vv" = ( +/obj/structure/chair/stool/directional/south, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"vN" = ( +/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/virtual_domain/powered) +"vT" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/misc/beach/coast/corner, +/area/virtual_domain/powered) +"wb" = ( +/obj/structure/closet/crate/freezer{ + name = "Cooler" + }, +/obj/item/reagent_containers/cup/glass/ice, +/obj/item/reagent_containers/cup/glass/colocup, +/obj/item/reagent_containers/cup/glass/colocup, +/obj/item/reagent_containers/cup/glass/bottle/beer{ + desc = "Beer advertised to be the best in space."; + name = "Masterbrand Beer" + }, +/obj/item/reagent_containers/cup/glass/bottle/beer{ + desc = "Beer advertised to be the best in space."; + name = "Masterbrand Beer" + }, +/obj/item/reagent_containers/cup/glass/bottle/beer{ + desc = "Beer advertised to be the best in space."; + name = "Masterbrand Beer" + }, +/obj/item/reagent_containers/cup/glass/bottle/beer/light, +/obj/item/reagent_containers/cup/glass/bottle/beer/light, +/obj/item/reagent_containers/cup/glass/bottle/beer/light, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"wD" = ( +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"xb" = ( +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"xk" = ( +/obj/structure/table/wood/poker, +/obj/item/storage/dice, +/obj/item/stack/spacecash/c1000, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"xq" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/item/megaphone, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"xw" = ( +/turf/open/floor/pod/dark, +/area/virtual_domain/powered) +"xJ" = ( +/obj/structure/closet/cabinet, +/obj/item/storage/backpack/duffelbag, +/obj/item/clothing/under/shorts/blue, +/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/virtual_domain/powered) +"xR" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/window/reinforced/spawner/directional/north{ + 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/virtual_domain/powered) +"xW" = ( +/turf/open/space/basic, +/area/space) +"ya" = ( +/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/virtual_domain/powered) +"yi" = ( +/obj/structure/sink/kitchen/directional/west{ + desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; + name = "old sink" + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"yl" = ( +/obj/item/reagent_containers/cup/glass/colocup{ + pixel_x = -7; + pixel_y = -2 + }, +/obj/item/reagent_containers/cup/glass/colocup{ + pixel_x = 5; + pixel_y = 6 + }, +/obj/item/reagent_containers/cup/glass/bottle/rum{ + pixel_x = 4; + pixel_y = -3 + }, +/turf/open/floor/carpet/red, +/area/virtual_domain/powered) +"ys" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/light/directional/east, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"yv" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/food_cart, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"yB" = ( +/obj/item/instrument/guitar, +/turf/open/floor/carpet/blue, +/area/virtual_domain/powered) +"yU" = ( +/obj/structure/sign/warning/gas_mask/directional/north, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"yX" = ( +/obj/structure/chair/stool/bar/directional/south, +/turf/open/floor/carpet/red, +/area/virtual_domain/powered) +"zn" = ( +/obj/machinery/light/directional/east, +/turf/open/misc/beach/coast{ + dir = 8 + }, +/area/virtual_domain/powered) +"zw" = ( +/obj/structure/punching_bag, +/turf/open/floor/pod/dark, +/area/virtual_domain/powered) +"zI" = ( +/obj/structure/marker_beacon/indigo, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"zU" = ( +/obj/structure/flora/rock/pile/style_random, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"Aa" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/sepia, +/area/virtual_domain/powered) +"Ae" = ( +/obj/structure/chair, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"Al" = ( +/turf/closed/mineral/random/volcanic, +/area/lavaland/surface/outdoors/virtual_domain) +"An" = ( +/obj/structure/marker_beacon/yellow, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"Au" = ( +/obj/structure/fluff/beach_umbrella/science, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"AI" = ( +/obj/structure/table/reinforced, +/obj/machinery/reagentgrinder, +/turf/open/floor/pod/light, +/area/virtual_domain/powered) +"AP" = ( +/obj/machinery/chem_dispenser/drinks/beer/fullupgrade{ + dir = 1 + }, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Br" = ( +/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/virtual_domain/powered) +"Bu" = ( +/turf/open/misc/beach/coast{ + dir = 8 + }, +/area/virtual_domain/powered) +"Bw" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"BD" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/condiment/saltshaker, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"BJ" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/cards/deck, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"BM" = ( +/turf/closed/wall/mineral/wood/nonmetal, +/area/virtual_domain/powered) +"BQ" = ( +/obj/machinery/seed_extractor, +/turf/open/floor/pod/light, +/area/virtual_domain/powered) +"Cb" = ( +/obj/machinery/light/directional/north, +/mob/living/basic/crab{ + name = "Eddie" + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"Cv" = ( +/obj/machinery/hydroponics/constructable, +/turf/open/floor/iron/grimy, +/area/virtual_domain/powered) +"CA" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/mob_spawn/ghost_role/human/beach/lifeguard, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"CO" = ( +/obj/machinery/vending/dinnerware, +/obj/machinery/light/directional/east, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Db" = ( +/obj/machinery/barsign/all_access, +/turf/closed/wall/mineral/wood/nonmetal, +/area/virtual_domain/powered) +"Ds" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Resort Lobby" + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Dt" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/sand, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"DL" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/wall/mineral/sandstone, +/area/virtual_domain/powered) +"Em" = ( +/obj/item/reagent_containers/condiment/enzyme{ + layer = 5 + }, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = 5 + }, +/obj/structure/table, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Et" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Ev" = ( +/obj/structure/reagent_dispensers/beerkeg, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"EC" = ( +/obj/structure/sign/warning/gas_mask/directional/west, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"EP" = ( +/obj/machinery/light/directional/north, +/obj/machinery/washing_machine, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Fn" = ( +/turf/closed/wall/mineral/sandstone, +/area/virtual_domain/powered) +"FM" = ( +/obj/effect/landmark/bitrunning/safehouse_spawn, +/turf/template_noop, +/area/virtual_domain/safehouse) +"FQ" = ( +/obj/structure/table/reinforced, +/obj/item/secateurs, +/obj/item/reagent_containers/cup/bottle/nutrient/ez, +/turf/open/floor/pod/light, +/area/virtual_domain/powered) +"FS" = ( +/obj/effect/turf_decal/sand, +/obj/structure/sign/warning/no_smoking/circle/directional/east, +/obj/machinery/light/directional/east, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"FY" = ( +/obj/structure/mineral_door/wood, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Gh" = ( +/obj/effect/turf_decal/sand, +/obj/structure/sign/poster/contraband/starkist/directional/north, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"Gz" = ( +/obj/structure/flora/tree/palm, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"GA" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/item/bikehorn/airhorn, +/obj/structure/table/wood, +/obj/item/storage/medkit/regular, +/obj/item/storage/medkit/brute, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Hs" = ( +/obj/machinery/shower/directional/west, +/turf/open/floor/iron/white, +/area/virtual_domain/powered) +"HF" = ( +/obj/machinery/deepfryer, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Ia" = ( +/obj/structure/urinal/directional/north, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Ii" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/iron/stairs/left, +/area/virtual_domain/powered) +"Ir" = ( +/obj/machinery/vending/cola, +/obj/effect/turf_decal/sand, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Iv" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/condiment/peppermill, +/obj/item/reagent_containers/condiment/soysauce, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"IH" = ( +/obj/item/toy/beach_ball, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"IM" = ( +/obj/machinery/hydroponics/constructable, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/grimy, +/area/virtual_domain/powered) +"IP" = ( +/obj/machinery/vending/snack, +/obj/effect/turf_decal/sand, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Jt" = ( +/obj/item/reagent_containers/cup/glass/bottle/beer, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"JC" = ( +/obj/structure/fluff/beach_umbrella/engine, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"JE" = ( +/obj/structure/closet/secure_closet/freezer/kitchen/all_access, +/obj/item/reagent_containers/condiment/milk, +/obj/item/reagent_containers/condiment/mayonnaise, +/obj/item/reagent_containers/condiment/flour, +/obj/item/reagent_containers/condiment/flour, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"JY" = ( +/obj/structure/flora/rock/style_random, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"Kd" = ( +/obj/structure/sign/warning/secure_area, +/turf/closed/wall/mineral/sandstone, +/area/virtual_domain/powered) +"KH" = ( +/obj/structure/mineral_door/wood{ + name = "Croupier's Booth" + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"KZ" = ( +/obj/structure/flora/bush/stalky/style_random, +/turf/open/water/beach, +/area/virtual_domain/powered) +"LD" = ( +/turf/open/floor/plating, +/area/virtual_domain/powered) +"LW" = ( +/obj/item/storage/cans/sixbeer, +/turf/open/floor/carpet/orange, +/area/virtual_domain/powered) +"Mp" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/drinkingglass/virtual_domain{ + pixel_y = 7; + pixel_x = 4 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/virtual_domain, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Mw" = ( +/obj/structure/chair/sofa/right/brown, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Mz" = ( +/obj/structure/chair/sofa/left/brown, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Nr" = ( +/obj/machinery/light/directional/north, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"Nw" = ( +/obj/item/bedsheet/dorms{ + dir = 4 + }, +/obj/structure/bed{ + dir = 4 + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"NM" = ( +/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, +/turf/open/floor/iron/grimy, +/area/virtual_domain/powered) +"NX" = ( +/obj/effect/landmark/bitrunning/loot_signal, +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/virtual_domain/powered) +"OE" = ( +/obj/effect/mob_spawn/ghost_role/human/beach{ + dir = 4 + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"OK" = ( +/obj/structure/sign/warning/gas_mask/directional/north, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"OR" = ( +/obj/machinery/light/directional/south, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"OW" = ( +/obj/structure/sink/kitchen/directional/east{ + desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; + name = "old sink" + }, +/turf/open/floor/pod/light, +/area/virtual_domain/powered) +"OZ" = ( +/obj/structure/marker_beacon/teal, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"Pc" = ( +/obj/structure/chair/wood, +/obj/machinery/light/directional/west, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"Pg" = ( +/obj/structure/sign/poster/official/high_class_martini/directional/west, +/obj/effect/mob_spawn/ghost_role/human/bartender{ + dir = 4 + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"PM" = ( +/obj/machinery/door/airlock/external/ruin, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Qb" = ( +/obj/machinery/griddle, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Qu" = ( +/obj/structure/curtain, +/turf/open/floor/iron/white, +/area/virtual_domain/powered) +"QP" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"QX" = ( +/obj/machinery/chem_dispenser/drinks/fullupgrade{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Rx" = ( +/turf/open/floor/iron/stairs/medium, +/area/virtual_domain/powered) +"RL" = ( +/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/virtual_domain/powered) +"Sg" = ( +/obj/structure/flora/coconuts, +/obj/machinery/light/directional/north, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"SB" = ( +/obj/machinery/door/airlock/sandstone{ + name = "Resort Bathroom" + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"SD" = ( +/obj/machinery/door/airlock/sandstone{ + name = "Bar Access" + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"SY" = ( +/obj/machinery/door/airlock/sandstone{ + name = "Surfer Shack 2" + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"TG" = ( +/turf/open/floor/wood, +/area/virtual_domain/powered) +"TJ" = ( +/obj/structure/fluff/beach_umbrella/security, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"TX" = ( +/obj/structure/sign/poster/contraband/ambrosia_vulgaris/directional/north, +/turf/open/floor/iron/grimy, +/area/virtual_domain/powered) +"Ud" = ( +/obj/effect/turf_decal/sand, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"Uh" = ( +/turf/open/floor/iron/stairs/old, +/area/virtual_domain/powered) +"Uq" = ( +/obj/structure/weightmachine/weightlifter, +/turf/open/floor/pod/dark, +/area/virtual_domain/powered) +"UU" = ( +/obj/structure/flora/bush/large/style_random, +/obj/structure/flora/bush/jungle/a/style_random, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"Ve" = ( +/obj/machinery/processor, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"VA" = ( +/obj/machinery/computer/slot_machine, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"VH" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"VX" = ( +/obj/structure/flora/bush/large/style_random, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"We" = ( +/obj/structure/table/wood, +/obj/item/book/manual/wiki/cooking_to_serve_man, +/obj/item/clothing/suit/apron/chef, +/obj/item/clothing/head/utility/chefhat, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Wg" = ( +/obj/structure/dresser, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Ww" = ( +/turf/open/water/beach, +/area/virtual_domain/powered) +"WL" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"WO" = ( +/obj/structure/flora/bush/jungle/a/style_random, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"WW" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/icecream_vat, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"WX" = ( +/obj/item/toy/plush/lizard_plushie/green{ + name = "Soaks-The-Rays" + }, +/turf/open/floor/carpet/orange, +/area/virtual_domain/powered) +"Xt" = ( +/turf/open/misc/beach/coast/corner{ + dir = 4 + }, +/area/virtual_domain/powered) +"Xv" = ( +/obj/structure/table/wood, +/obj/structure/bedsheetbin, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"XL" = ( +/obj/machinery/light/directional/east, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"XM" = ( +/turf/open/misc/beach/coast, +/area/virtual_domain/powered) +"XP" = ( +/turf/open/floor/carpet/blue, +/area/virtual_domain/powered) +"XT" = ( +/obj/effect/turf_decal/sand, +/obj/structure/sign/departments/botany/directional/south, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"Yi" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/item/toy/seashell, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"Yq" = ( +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"YI" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Supply Room" + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"YJ" = ( +/turf/open/floor/carpet/purple, +/area/virtual_domain/powered) +"YN" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/light/directional/west, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"Zb" = ( +/obj/structure/sign/poster/official/cohiba_robusto_ad/directional/west, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Zd" = ( +/obj/structure/sign/poster/contraband/space_cola/directional/north, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"Zg" = ( +/obj/structure/table, +/obj/machinery/microwave, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Zt" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/pill/morphine, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/wood, +/area/virtual_domain/powered) + +(1,1,1) = {" +pr +pr +pr +pr +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +kv +"} +(2,1,1) = {" +pr +pr +pr +pr +iz +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +iz +"} +(3,1,1) = {" +pr +pr +pr +pr +iz +Al +gl +gl +gl +gl +gl +Al +Al +gl +gl +gl +gl +gl +Al +Al +gl +gl +gl +Al +gl +gl +gl +gl +Al +Al +gl +gl +gl +Al +Al +gl +gl +gl +gl +Al +iz +"} +(4,1,1) = {" +pr +pr +pr +pr +iz +Al +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +Al +iz +"} +(5,1,1) = {" +pr +pr +pr +pr +iz +Al +gl +gl +gl +gl +gl +gl +gl +gl +gl +zI +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +Al +iz +"} +(6,1,1) = {" +pr +pr +pr +pr +iz +Al +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +OZ +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +Al +iz +"} +(7,1,1) = {" +pr +pr +pr +pr +iz +Al +gl +gl +gl +An +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +ke +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +ml +ml +ml +ml +ml +FM +gl +Al +iz +"} +(8,1,1) = {" +pr +pr +pr +pr +iz +Al +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +ml +ml +ml +ml +ml +ml +gl +Al +iz +"} +(9,1,1) = {" +pr +pr +pr +pr +iz +Al +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +gl +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +gl +gl +ml +ml +ml +ml +ml +ml +gl +Al +iz +"} +(10,1,1) = {" +pr +pr +pr +pr +iz +Al +Al +Al +Al +xb +xb +uc +Al +Al +gl +gl +gl +Al +Fn +Fn +Fn +Fn +Fn +Fn +Fn +Fn +Fn +Fn +Fn +Al +gl +gl +ml +ml +ml +ml +ml +ml +gl +Al +iz +"} +(11,1,1) = {" +iz +iz +iz +iz +iz +Al +Al +Al +Fn +PM +PM +Fn +Fn +Al +Al +Al +Fn +Fn +Fn +Pc +bf +Bw +Fn +Ev +Pg +iR +kG +di +Fn +DL +Al +gl +ml +ml +ml +ml +ml +ml +gl +Al +iz +"} +(12,1,1) = {" +iz +Al +Al +Al +Al +Al +Al +Al +Fn +pT +LD +LD +Fn +Fn +Kd +Fn +Fn +bQ +cv +wD +Bw +JY +Fn +db +TG +TG +TG +TG +AP +Fn +Al +gl +ml +ml +ml +ml +ml +ml +gl +Al +iz +"} +(13,1,1) = {" +iz +Al +Fn +Fn +Fn +Fn +Fn +Fn +Fn +LD +pT +LD +EC +LD +pT +PM +wD +wD +cv +wD +wD +OR +Fn +ug +TG +TG +TG +TG +QX +Fn +Al +gl +ml +ml +ml +ml +ml +sT +gl +Al +iz +"} +(14,1,1) = {" +iz +Al +Fn +VA +kT +Zb +TG +Fn +Fn +Fn +yU +LD +Et +LD +LD +PM +wD +wD +wD +wD +wD +qc +Fn +Fn +SD +Mp +uq +fc +Fn +Fn +Al +gl +gl +gl +gl +gl +gl +gl +gl +Al +iz +"} +(15,1,1) = {" +iz +Al +Fn +VA +yX +ag +kT +Br +TG +Fn +Fn +Fn +Fn +Fn +Fn +Fn +Gz +wD +Bw +rm +wD +wD +wD +Ii +dx +kn +kn +kn +Aa +Fn +Al +gl +gl +gl +gl +gl +gl +gl +gl +Al +iz +"} +(16,1,1) = {" +iz +Al +Fn +pC +yX +ag +kT +BJ +kT +Fn +as +ab +Ir +IP +YN +uV +wD +wD +wD +mG +vv +Bw +wD +Rx +uU +lS +lS +lS +uU +Fn +Al +gl +gl +gl +gl +gl +gl +gl +gl +Al +iz +"} +(17,1,1) = {" +iz +Al +Fn +Mw +ag +ag +vp +xk +TG +Fn +Ud +Ud +bC +Ud +Ud +wD +IH +wD +wD +Bw +wD +wD +wD +Rx +uU +lS +NX +lS +cz +Fn +Al +gl +gl +gl +gl +gl +gl +gl +gl +Al +iz +"} +(18,1,1) = {" +iz +Al +Fn +Mz +TG +TG +Fn +Fn +KH +Fn +Zd +wD +wD +Bw +wD +VX +wD +UU +wD +wD +wD +wD +wD +Rx +uU +lS +lS +lS +uU +Fn +Al +gl +gl +gl +gl +gl +gl +gl +gl +Al +iz +"} +(19,1,1) = {" +iz +Al +Fn +Fn +tE +tE +Fn +uV +wD +wD +wD +wD +wD +wD +wD +wD +wD +wD +wD +wD +wD +wD +wD +jc +uU +uU +uU +uU +uU +Fn +Fn +gl +gl +gl +gl +gl +gl +gl +gl +Al +iz +"} +(20,1,1) = {" +iz +Al +Fn +zU +wD +wD +wD +wD +Dt +Ud +Ud +Ud +Ud +Ud +Ud +Ud +ys +wD +wD +TJ +wb +wD +wD +vT +gJ +gJ +gJ +gJ +gJ +oE +Fn +gl +gl +Al +Al +gl +gl +Al +gl +Al +iz +"} +(21,1,1) = {" +iz +Al +Fn +wD +wD +Bw +wD +wD +BM +BM +BM +We +Zt +BD +Iv +BM +Db +Nr +wD +yl +ag +wD +wD +XM +KZ +Ww +Ww +Ww +cG +dj +Fn +Al +Al +Al +Al +Al +Al +Al +Al +Al +iz +"} +(22,1,1) = {" +iz +Al +Fn +Fn +wD +wD +wD +wD +BM +Zg +VH +TG +TG +TG +TG +mX +BM +wD +wD +Au +wD +rT +wD +XM +Ww +Ww +Ww +Ww +Ww +dj +Fn +Al +iz +iz +iz +iz +iz +iz +iz +iz +iz +"} +(23,1,1) = {" +iz +Al +xb +Fn +Cb +wD +JC +wD +BM +HF +TG +JE +BM +aw +TG +TG +ya +wD +wD +YJ +YJ +wD +wD +XM +Ww +Ww +Ww +Ww +Ww +dj +Fn +Al +iz +pr +pr +pr +pr +pr +pr +pr +xW +"} +(24,1,1) = {" +iz +Al +xb +Fn +wD +Gz +WX +wD +BM +Em +TG +mq +ri +Qb +TG +TG +cb +wD +wD +bQ +wD +wD +wD +XM +Ww +Ww +KZ +KZ +Ww +pZ +Fn +Al +iz +pr +pr +pr +pr +pr +pr +pr +xW +"} +(25,1,1) = {" +iz +Al +xb +Fn +OK +Gz +LW +wD +BM +bS +TG +oP +BM +vq +TG +TG +vN +wD +wD +XP +yB +wD +wD +XM +KZ +Ww +KZ +gh +Ww +dj +Fn +Al +iz +pr +pr +pr +pr +pr +pr +pr +xW +"} +(26,1,1) = {" +iz +Al +xb +Fn +Sg +wD +wD +wD +BM +Ve +rc +yi +TG +TG +TG +CO +BM +wD +Yi +XL +wD +wD +wD +XM +Ww +Ww +Ww +Ww +Ww +dj +Fn +Al +iz +pr +pr +pr +pr +pr +pr +pr +xW +"} +(27,1,1) = {" +iz +Al +Fn +Fn +Bw +wD +wD +wD +BM +BM +BM +BM +FY +BM +BM +BM +er +wD +GA +xq +jy +wD +wD +XM +Ww +cG +Ww +Ww +KZ +dj +Fn +Al +iz +pr +pr +pr +pr +pr +pr +pr +xW +"} +(28,1,1) = {" +iz +Al +Fn +Nr +wD +wD +Bw +wD +YN +Ud +WW +yv +Ud +Ud +Ud +Ud +YN +wD +xR +CA +Uh +wD +qW +XM +Ww +Ww +Ww +Ww +Ww +pZ +Fn +Al +iz +pr +pr +pr +pr +pr +pr +pr +xW +"} +(29,1,1) = {" +iz +Al +Fn +wD +wD +wD +wD +wD +wD +wD +wD +wD +wD +wD +wD +wD +wD +wD +wD +wD +wD +Jt +wD +mP +zn +Bu +Bu +Bu +Bu +Xt +Fn +Al +iz +pr +pr +pr +pr +pr +pr +pr +xW +"} +(30,1,1) = {" +iz +Al +Fn +Ds +Ds +Fn +VX +wD +wD +wD +wD +wD +XL +wD +wD +wD +wD +wD +wD +wD +wD +XT +Fn +Fn +Fn +Fn +Fn +Fn +Fn +Fn +Fn +Al +iz +pr +pr +pr +pr +pr +pr +pr +xW +"} +(31,1,1) = {" +iz +Al +Fn +TG +TG +Fn +Fn +jl +Fn +Fn +qR +Fn +Fn +WO +wD +Bw +wD +wD +wD +wD +bM +Ud +aE +aE +aE +lq +fr +hk +Fn +Al +Al +Al +iz +pr +pr +pr +pr +pr +pr +pr +xW +"} +(32,1,1) = {" +iz +Al +Fn +TG +TG +TG +Fn +Fn +Fn +dZ +OE +Nw +Fn +Fn +qR +Fn +Fn +wD +wD +wD +Ae +Ud +zw +xw +Uq +aE +aE +aE +Fn +Fn +Al +Al +iz +pr +pr +pr +pr +pr +pr +pr +xW +"} +(33,1,1) = {" +iz +Al +Fn +EP +TG +TG +TG +TG +hG +TG +TG +TG +Fn +dZ +OE +Nw +Fn +Gz +uV +wD +wD +Ud +xw +xw +xw +aE +aE +aE +OW +Fn +Fn +Al +iz +pr +pr +pr +pr +pr +pr +pr +xW +"} +(34,1,1) = {" +iz +Al +Fn +Xv +TG +hE +TG +TG +Fn +Wg +rc +xJ +Fn +TG +TG +dI +Fn +wD +wD +Bw +wD +lB +zw +xw +Uq +aE +FQ +aE +aE +jg +Fn +Al +iz +pr +pr +pr +pr +pr +pr +pr +xW +"} +(35,1,1) = {" +iz +Al +Fn +Fn +SB +Fn +WL +TG +Fn +Fn +Fn +Fn +Fn +Wg +TG +RL +Fn +Gh +Ud +Ud +Ud +FS +aE +aE +aE +aE +AI +BQ +aE +NM +Fn +Al +iz +pr +pr +pr +pr +pr +pr +pr +xW +"} +(36,1,1) = {" +iz +Al +Fn +kK +TG +Fn +TG +TG +TG +TG +qg +TG +Fn +Fn +SY +Fn +Fn +Ds +Ds +Fn +YI +Fn +Fn +Fn +TX +aE +aE +aE +aE +uk +Fn +Al +iz +pr +pr +pr +pr +pr +pr +pr +xW +"} +(37,1,1) = {" +iz +Al +Fn +Ia +dI +Fn +Fn +Fn +QP +TG +TG +TG +TG +TG +TG +TG +TG +TG +TG +Fn +ve +nP +ed +Fn +Cv +Cv +IM +Cv +Cv +Fn +Fn +Al +iz +pr +pr +pr +pr +pr +pr +pr +xW +"} +(38,1,1) = {" +iz +Al +Fn +tZ +TG +Qu +Hs +Fn +Fn +Fn +TG +rc +TG +TG +TG +tF +rc +TG +TG +Fn +Yq +aZ +Fn +Fn +Fn +Fn +Fn +Fn +Fn +Fn +Al +Al +iz +pr +pr +pr +pr +pr +pr +pr +xW +"} +(39,1,1) = {" +iz +Al +Fn +Fn +Fn +Fn +Fn +Fn +Al +Fn +Fn +Fn +Fn +Fn +Fn +Fn +Fn +Fn +Fn +Fn +Fn +Fn +Fn +Al +Al +Al +Al +Al +Al +Al +Al +Al +iz +pr +pr +pr +pr +pr +pr +pr +xW +"} +(40,1,1) = {" +iz +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +Al +iz +pr +pr +pr +pr +pr +pr +pr +xW +"} +(41,1,1) = {" +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +iz +pr +pr +pr +pr +pr +pr +pr +xW +"} diff --git a/_maps/virtual_domains/blood_drunk_miner.dmm b/_maps/virtual_domains/blood_drunk_miner.dmm new file mode 100644 index 0000000000000..c3369a1c822de --- /dev/null +++ b/_maps/virtual_domains/blood_drunk_miner.dmm @@ -0,0 +1,1887 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"b" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"c" = ( +/turf/template_noop, +/area/virtual_domain/safehouse) +"d" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/indestructible/binary, +/area/lavaland/surface/outdoors/virtual_domain) +"f" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile/block/cracked, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"h" = ( +/obj/machinery/light/small/blacklight/directional/south, +/obj/effect/baseturf_helper/virtual_domain, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/virtual_domain/powered) +"i" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile/cracked, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"j" = ( +/obj/structure/marker_beacon/jade, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"k" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"l" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"m" = ( +/obj/structure/marker_beacon/olive, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"n" = ( +/obj/structure/marker_beacon/cerulean, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"o" = ( +/obj/structure/marker_beacon/yellow, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"q" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/template_noop, +/area/virtual_domain/safehouse) +"r" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"s" = ( +/turf/closed/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"t" = ( +/obj/structure/marker_beacon/indigo, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"u" = ( +/obj/structure/stone_tile/cracked, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"v" = ( +/turf/closed/indestructible/binary, +/area/lavaland/surface/outdoors/virtual_domain) +"w" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"x" = ( +/obj/structure/stone_tile, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"y" = ( +/obj/structure/marker_beacon/violet, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"z" = ( +/obj/structure/stone_tile/block, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"A" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"C" = ( +/obj/effect/mob_spawn/corpse/human/miner, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"G" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"H" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"I" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"J" = ( +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"K" = ( +/obj/structure/marker_beacon/teal, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"L" = ( +/obj/effect/landmark/bitrunning/safehouse_spawn, +/turf/template_noop, +/area/virtual_domain/safehouse) +"O" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"P" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"S" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 6 + }, +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/virtual_domain, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"T" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"W" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"X" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"Y" = ( +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"Z" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) + +(1,1,1) = {" +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +d +"} +(2,1,1) = {" +v +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +v +"} +(3,1,1) = {" +v +s +s +s +s +J +J +s +s +J +J +s +s +J +J +J +J +s +s +s +J +J +J +s +s +s +s +s +s +s +s +s +s +J +J +s +s +s +J +J +s +s +J +J +s +v +"} +(4,1,1) = {" +v +s +s +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +a +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +s +v +"} +(5,1,1) = {" +v +s +s +J +a +J +J +J +J +a +J +J +J +J +a +a +J +J +J +J +J +a +a +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +s +s +v +"} +(6,1,1) = {" +v +s +s +J +a +J +J +a +a +a +a +a +a +a +a +a +a +a +a +J +a +a +a +a +a +J +J +J +a +a +J +J +J +a +a +J +a +J +a +a +J +J +J +s +s +v +"} +(7,1,1) = {" +v +s +s +J +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +J +J +s +v +"} +(8,1,1) = {" +v +s +s +J +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +J +s +s +v +"} +(9,1,1) = {" +v +s +J +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +j +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +J +s +v +"} +(10,1,1) = {" +v +s +J +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +t +a +a +a +a +a +a +a +a +a +a +J +J +s +v +"} +(11,1,1) = {" +v +s +s +J +J +J +a +a +a +y +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +J +s +v +"} +(12,1,1) = {" +v +s +s +J +J +J +a +a +a +a +a +a +a +a +a +a +a +a +C +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +J +J +s +v +"} +(13,1,1) = {" +v +s +s +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +J +s +v +"} +(14,1,1) = {" +v +s +s +J +J +a +a +a +a +a +a +a +a +a +a +T +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +J +s +v +"} +(15,1,1) = {" +v +s +J +J +J +a +a +a +a +a +a +a +a +a +a +X +z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +h +c +c +c +c +c +L +a +a +J +J +s +v +"} +(16,1,1) = {" +v +s +J +J +J +J +a +a +a +a +a +a +a +T +W +a +r +a +i +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +c +c +c +c +c +c +a +a +J +J +s +v +"} +(17,1,1) = {" +v +s +s +J +J +J +a +a +a +a +a +a +a +a +I +b +k +l +x +a +T +k +a +a +a +m +a +a +a +a +a +o +a +a +c +c +c +c +c +c +a +a +J +J +s +v +"} +(18,1,1) = {" +v +s +s +J +J +a +a +a +a +a +a +a +a +a +a +a +P +S +A +O +u +r +k +a +a +a +a +a +a +a +a +a +a +a +c +c +c +c +c +c +a +J +J +s +s +v +"} +(19,1,1) = {" +v +s +J +J +J +a +a +a +a +a +a +a +a +k +G +H +x +f +k +a +Y +T +u +a +a +a +a +a +a +a +a +a +a +a +c +c +c +c +c +c +a +a +J +J +s +v +"} +(20,1,1) = {" +v +s +J +J +J +J +a +a +a +a +a +a +a +Y +x +a +Z +a +z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +c +c +c +c +c +c +a +a +J +J +s +v +"} +(21,1,1) = {" +v +s +s +J +J +a +a +a +a +a +a +a +a +a +a +a +z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +h +c +c +c +c +c +q +a +a +J +s +s +v +"} +(22,1,1) = {" +v +s +s +J +J +a +a +a +a +a +a +a +a +a +a +w +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +s +s +v +"} +(23,1,1) = {" +v +s +J +J +a +a +a +a +a +a +n +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +s +s +v +"} +(24,1,1) = {" +v +s +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +C +a +a +a +a +a +J +J +s +v +"} +(25,1,1) = {" +v +s +s +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +J +J +s +v +"} +(26,1,1) = {" +v +s +s +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +K +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +J +s +v +"} +(27,1,1) = {" +v +s +s +J +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +j +a +a +a +a +a +a +a +a +a +J +J +s +v +"} +(28,1,1) = {" +v +s +J +J +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +J +J +s +v +"} +(29,1,1) = {" +v +s +J +J +J +J +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +J +J +s +s +v +"} +(30,1,1) = {" +v +s +s +J +J +J +J +a +a +J +J +J +a +a +a +a +J +J +J +a +a +a +J +J +J +a +a +a +J +J +a +a +a +a +a +a +J +J +a +a +a +J +J +s +s +v +"} +(31,1,1) = {" +v +s +s +a +J +J +J +J +J +J +J +J +J +a +a +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +a +a +a +J +J +J +J +J +J +J +J +J +s +v +"} +(32,1,1) = {" +v +s +s +a +J +J +J +J +J +J +J +J +J +J +J +J +J +a +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +s +v +"} +(33,1,1) = {" +v +s +s +s +s +s +J +J +s +s +s +s +J +J +s +s +s +s +s +s +J +J +s +s +s +s +J +J +s +s +s +s +J +J +J +s +s +s +s +s +s +J +J +J +s +v +"} +(34,1,1) = {" +v +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +s +v +"} +(35,1,1) = {" +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +"} diff --git a/_maps/virtual_domains/bubblegum.dmm b/_maps/virtual_domains/bubblegum.dmm new file mode 100644 index 0000000000000..3381b1735398b --- /dev/null +++ b/_maps/virtual_domains/bubblegum.dmm @@ -0,0 +1,2250 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"c" = ( +/obj/effect/mob_spawn/corpse/human/miner, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"d" = ( +/obj/structure/marker_beacon/jade, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"f" = ( +/obj/structure/marker_beacon/burgundy, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"g" = ( +/obj/structure/marker_beacon/teal, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"p" = ( +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"r" = ( +/obj/structure/marker_beacon/fuchsia, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"w" = ( +/obj/machinery/light/small/blacklight/directional/south, +/obj/effect/baseturf_helper/virtual_domain, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/virtual_domain/powered) +"x" = ( +/obj/structure/marker_beacon/olive, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"z" = ( +/obj/structure/marker_beacon/purple, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"A" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/template_noop, +/area/virtual_domain/safehouse) +"C" = ( +/mob/living/simple_animal/hostile/megafauna/bubblegum/virtual_domain, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"F" = ( +/turf/open/indestructible/binary, +/area/lavaland/surface/outdoors/virtual_domain) +"G" = ( +/obj/structure/marker_beacon/violet, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"I" = ( +/obj/structure/marker_beacon/bronze, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"M" = ( +/obj/structure/marker_beacon/indigo, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"R" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/open/indestructible/binary, +/area/lavaland/surface/outdoors/virtual_domain) +"S" = ( +/turf/template_noop, +/area/virtual_domain/safehouse) +"T" = ( +/obj/effect/landmark/bitrunning/safehouse_spawn, +/turf/template_noop, +/area/virtual_domain/safehouse) +"W" = ( +/obj/structure/marker_beacon/cerulean, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"X" = ( +/obj/structure/marker_beacon/lime, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"Y" = ( +/obj/structure/marker_beacon/yellow, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"Z" = ( +/turf/closed/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) + +(1,1,1) = {" +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +R +"} +(2,1,1) = {" +F +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +F +"} +(3,1,1) = {" +F +Z +a +a +Z +Z +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +Z +Z +a +a +a +a +a +a +a +a +Z +Z +a +a +a +a +a +a +Z +Z +Z +F +"} +(4,1,1) = {" +F +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +F +"} +(5,1,1) = {" +F +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +p +Z +F +"} +(6,1,1) = {" +F +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +G +a +a +a +a +a +a +a +a +a +a +a +a +p +p +Z +F +"} +(7,1,1) = {" +F +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +x +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +a +a +a +a +p +Z +F +"} +(8,1,1) = {" +F +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +Z +a +a +a +Z +Z +F +"} +(9,1,1) = {" +F +Z +a +a +a +a +a +a +p +p +p +p +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +Z +F +"} +(10,1,1) = {" +F +Z +Z +a +a +a +a +a +Z +Z +Z +p +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +Z +F +"} +(11,1,1) = {" +F +Z +Z +a +a +a +a +a +Z +Z +Z +p +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +Z +a +a +a +a +a +a +a +a +p +p +a +a +a +a +a +Z +F +"} +(12,1,1) = {" +F +Z +Z +a +a +a +a +a +p +Z +p +p +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +Z +a +a +a +a +a +a +a +p +a +a +a +a +a +Z +F +"} +(13,1,1) = {" +F +Z +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +Z +Z +a +a +a +a +a +M +a +a +a +a +a +a +a +Z +F +"} +(14,1,1) = {" +F +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +Z +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +F +"} +(15,1,1) = {" +F +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +c +a +a +a +a +a +a +Z +F +"} +(16,1,1) = {" +F +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +I +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +F +"} +(17,1,1) = {" +F +Z +a +a +a +a +a +a +a +a +a +a +a +W +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +F +"} +(18,1,1) = {" +F +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +F +"} +(19,1,1) = {" +F +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +F +"} +(20,1,1) = {" +F +Z +a +a +a +a +a +z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +F +"} +(21,1,1) = {" +F +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +w +S +S +S +S +S +T +a +Z +F +"} +(22,1,1) = {" +F +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +S +S +S +S +S +S +a +Z +F +"} +(23,1,1) = {" +F +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +C +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +S +S +S +S +S +S +a +Z +F +"} +(24,1,1) = {" +F +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +X +a +a +S +S +S +S +S +S +a +Z +F +"} +(25,1,1) = {" +F +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +S +S +S +S +S +S +a +Z +F +"} +(26,1,1) = {" +F +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +S +S +S +S +S +S +a +Z +F +"} +(27,1,1) = {" +F +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +w +S +S +S +S +S +A +a +Z +F +"} +(28,1,1) = {" +F +Z +a +a +a +a +a +a +a +a +a +a +a +a +f +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +F +"} +(29,1,1) = {" +F +Z +a +a +a +a +a +a +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +r +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +F +"} +(30,1,1) = {" +F +Z +a +a +a +a +a +a +Z +Z +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +F +"} +(31,1,1) = {" +F +Z +a +a +a +a +a +a +Z +Z +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +F +"} +(32,1,1) = {" +F +Z +a +a +a +a +a +a +a +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +F +"} +(33,1,1) = {" +F +Z +a +a +a +a +a +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +d +a +a +a +a +a +a +a +Z +F +"} +(34,1,1) = {" +F +Z +Z +a +a +a +a +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +F +"} +(35,1,1) = {" +F +Z +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +X +a +a +a +a +a +a +a +a +Z +Z +Z +a +a +a +a +a +a +a +a +a +a +a +a +Z +F +"} +(36,1,1) = {" +F +Z +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +Z +Z +a +a +a +a +a +a +a +a +a +a +a +a +Z +F +"} +(37,1,1) = {" +F +Z +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +Z +F +"} +(38,1,1) = {" +F +Z +a +a +a +p +p +a +a +a +a +a +g +a +a +a +a +Z +a +a +a +a +a +a +p +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +Z +F +"} +(39,1,1) = {" +F +Z +a +a +a +p +p +a +a +a +a +a +a +a +a +a +Z +Z +Z +a +a +a +a +a +p +p +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +F +"} +(40,1,1) = {" +F +Z +a +c +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +F +"} +(41,1,1) = {" +F +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Y +a +a +a +a +a +a +a +Z +F +"} +(42,1,1) = {" +F +Z +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +Z +F +"} +(43,1,1) = {" +F +Z +a +Z +Z +Z +Z +a +a +a +a +a +Z +Z +Z +Z +a +a +a +Z +Z +Z +Z +Z +a +a +a +a +a +a +Z +Z +Z +Z +a +a +a +a +a +a +Z +Z +a +a +Z +F +"} +(44,1,1) = {" +F +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +F +"} +(45,1,1) = {" +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +F +"} diff --git a/_maps/virtual_domains/clown_planet.dmm b/_maps/virtual_domains/clown_planet.dmm new file mode 100644 index 0000000000000..01d7b88a5efb5 --- /dev/null +++ b/_maps/virtual_domains/clown_planet.dmm @@ -0,0 +1,2323 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ai" = ( +/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/virtual_domain/powered) +"aI" = ( +/obj/item/bikehorn/airhorn, +/turf/open/floor/carpet, +/area/virtual_domain/powered) +"aM" = ( +/obj/item/bikehorn, +/turf/open/indestructible/honk, +/area/virtual_domain/powered) +"aP" = ( +/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/virtual_domain/powered) +"ba" = ( +/obj/structure/mecha_wreckage/honker, +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"bi" = ( +/obj/item/bikehorn, +/obj/structure/disposalpipe/segment{ + invisibility = 101 + }, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"bp" = ( +/turf/open/indestructible/light, +/area/virtual_domain/powered) +"bq" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/indestructible/white, +/area/virtual_domain/powered) +"by" = ( +/turf/closed/wall/r_wall, +/area/lavaland/surface/outdoors/virtual_domain) +"bQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"bR" = ( +/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/virtual_domain/powered) +"bU" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"cw" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"cM" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/structure/disposaloutlet{ + dir = 1 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"cW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + invisibility = 101 + }, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"ed" = ( +/obj/structure/disposalpipe/segment{ + invisibility = 101 + }, +/obj/machinery/light/small/directional/west, +/turf/open/indestructible/white, +/area/virtual_domain/powered) +"eE" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/disposalpipe/segment{ + invisibility = 101 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"fh" = ( +/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/virtual_domain/powered) +"gr" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/template_noop, +/area/virtual_domain/safehouse) +"gy" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/baseturf_helper/virtual_domain, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"gH" = ( +/obj/item/bikehorn, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/honk, +/area/virtual_domain/powered) +"gK" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/indestructible/white, +/area/virtual_domain/powered) +"hK" = ( +/obj/item/clothing/head/cone, +/obj/effect/mapping_helpers/no_lava, +/turf/open/floor/noslip, +/area/virtual_domain/powered) +"hY" = ( +/turf/template_noop, +/area/template_noop) +"ij" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/delivery_chute{ + dir = 4 + }, +/turf/open/floor/noslip, +/area/virtual_domain/powered) +"ik" = ( +/turf/open/lava/smooth, +/area/virtual_domain/powered) +"iR" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"ki" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"kn" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"lj" = ( +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/delivery_chute{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"lm" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/light/small/directional/east, +/turf/open/indestructible/white, +/area/virtual_domain/powered) +"lr" = ( +/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/virtual_domain/powered) +"lx" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"ly" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/closed/indestructible/binary, +/area/lavaland/surface/outdoors/virtual_domain) +"lP" = ( +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"mD" = ( +/turf/open/floor/plating, +/area/virtual_domain/powered) +"mE" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"mF" = ( +/turf/open/floor/carpet, +/area/virtual_domain/powered) +"nE" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/closed/wall/r_wall, +/area/virtual_domain/powered) +"oA" = ( +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"oI" = ( +/obj/structure/table/glass, +/obj/item/grown/bananapeel/bluespace, +/turf/open/floor/carpet, +/area/virtual_domain/powered) +"pl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"ps" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"qM" = ( +/obj/structure/disposalpipe/segment{ + invisibility = 101 + }, +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"rg" = ( +/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/virtual_domain/powered) +"rh" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/indestructible/white, +/area/virtual_domain/powered) +"rr" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/closed/indestructible/binary, +/area/lavaland/surface/outdoors/virtual_domain) +"rH" = ( +/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/virtual_domain/powered) +"rT" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/closed/indestructible/binary, +/area/lavaland/surface/outdoors/virtual_domain) +"sq" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"sT" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1 + }, +/obj/effect/mapping_helpers/mail_sorting/supply/qm_office, +/turf/closed/wall/r_wall, +/area/virtual_domain/powered) +"tq" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"tt" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/turf/open/indestructible/light, +/area/virtual_domain/powered) +"tv" = ( +/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/virtual_domain/powered) +"tF" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/indestructible/binary, +/area/lavaland/surface/outdoors/virtual_domain) +"tI" = ( +/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/virtual_domain/powered) +"uX" = ( +/obj/effect/mapping_helpers/no_lava, +/mob/living/basic/clown, +/turf/open/floor/noslip, +/area/virtual_domain/powered) +"uY" = ( +/turf/closed/mineral/bananium, +/area/virtual_domain/powered) +"uZ" = ( +/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/virtual_domain/powered) +"wz" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/mapping_helpers/no_lava, +/mob/living/basic/clown, +/turf/open/floor/noslip, +/area/virtual_domain/powered) +"xt" = ( +/obj/effect/landmark/bitrunning/safehouse_spawn, +/turf/template_noop, +/area/virtual_domain/safehouse) +"yd" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"yz" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/virtual_domain/powered) +"yS" = ( +/obj/structure/marker_beacon/yellow, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"yZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"zm" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"zA" = ( +/obj/structure/statue/bananium/clown, +/turf/open/floor/carpet, +/area/virtual_domain/powered) +"zF" = ( +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/disposaloutlet{ + dir = 8 + }, +/turf/open/floor/noslip, +/area/virtual_domain/powered) +"Aa" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"Bi" = ( +/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/virtual_domain/powered) +"Cp" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/obj/machinery/light/small/directional/west, +/turf/open/indestructible/white, +/area/virtual_domain/powered) +"Cs" = ( +/obj/item/bikehorn, +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"Dh" = ( +/turf/closed/wall/r_wall, +/area/virtual_domain/powered) +"Do" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"DL" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/item/bikehorn, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"Ex" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"FI" = ( +/obj/item/reagent_containers/cup/glass/trophy/gold_cup, +/obj/structure/table/glass, +/turf/open/floor/carpet, +/area/virtual_domain/powered) +"Gg" = ( +/obj/structure/table/glass, +/obj/item/gun/magic/staff/honk, +/turf/open/floor/carpet, +/area/virtual_domain/powered) +"Hq" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Hr" = ( +/obj/structure/table/glass, +/obj/item/clothing/shoes/clown_shoes/banana_shoes, +/turf/open/floor/carpet, +/area/virtual_domain/powered) +"HQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"Ie" = ( +/turf/closed/indestructible/binary, +/area/lavaland/surface/outdoors/virtual_domain) +"Iz" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"IN" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/closed/wall/r_wall, +/area/virtual_domain/powered) +"IY" = ( +/turf/open/indestructible/honk, +/area/virtual_domain/powered) +"Jv" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/honk, +/area/virtual_domain/powered) +"JB" = ( +/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/virtual_domain/powered) +"Ka" = ( +/obj/effect/decal/cleanable/food/pie_smudge, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"Kh" = ( +/obj/effect/mob_spawn/corpse/human/damaged, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/honk, +/area/virtual_domain/powered) +"KG" = ( +/obj/item/pickaxe, +/turf/open/indestructible/white, +/area/virtual_domain/powered) +"KI" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/turf/closed/wall/r_wall, +/area/lavaland/surface/outdoors/virtual_domain) +"Lv" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/obj/machinery/light/small/directional/east, +/turf/open/indestructible/white, +/area/virtual_domain/powered) +"Nv" = ( +/obj/effect/decal/cleanable/cobweb, +/turf/open/indestructible/honk, +/area/virtual_domain/powered) +"NB" = ( +/obj/machinery/disposal/delivery_chute, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/virtual_domain/powered) +"NL" = ( +/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/virtual_domain/powered) +"NW" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/spray/waterflower/superlube, +/turf/open/floor/carpet, +/area/virtual_domain/powered) +"Ok" = ( +/obj/item/bikehorn, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"Ov" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"PJ" = ( +/obj/structure/disposalpipe/trunk, +/obj/structure/disposaloutlet{ + dir = 1 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/open/floor/noslip, +/area/virtual_domain/powered) +"PM" = ( +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"PQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/obj/item/pickaxe, +/turf/open/indestructible/white, +/area/virtual_domain/powered) +"QP" = ( +/turf/template_noop, +/area/virtual_domain/safehouse) +"QX" = ( +/obj/structure/closet/crate/secure/bitrunning/encrypted, +/turf/open/floor/carpet, +/area/virtual_domain/powered) +"Rh" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/indestructible/white, +/area/virtual_domain/powered) +"Rx" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/obj/structure/table, +/obj/item/flashlight/lamp/bananalamp, +/turf/open/indestructible/white, +/area/virtual_domain/powered) +"RU" = ( +/obj/structure/disposalpipe/segment{ + invisibility = 101 + }, +/turf/closed/indestructible/binary, +/area/lavaland/surface/outdoors/virtual_domain) +"Sg" = ( +/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/virtual_domain/powered) +"Sm" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/virtual_domain/powered) +"Tm" = ( +/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/virtual_domain/powered) +"Tx" = ( +/obj/structure/disposalpipe/segment{ + invisibility = 101 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"TH" = ( +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/disposaloutlet{ + dir = 8 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"TK" = ( +/obj/structure/disposalpipe/segment{ + invisibility = 101 + }, +/turf/closed/wall/r_wall, +/area/virtual_domain/powered) +"Ug" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/carpet, +/area/virtual_domain/powered) +"UL" = ( +/obj/effect/decal/cleanable/oil, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"UN" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"UQ" = ( +/obj/structure/disposalpipe/segment{ + invisibility = 101 + }, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"UY" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/indestructible/permalube, +/area/virtual_domain/powered) +"Vv" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/turf/closed/wall/r_wall, +/area/virtual_domain/powered) +"Vx" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/turf/closed/indestructible/binary, +/area/lavaland/surface/outdoors/virtual_domain) +"VI" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/closed/indestructible/binary, +/area/lavaland/surface/outdoors/virtual_domain) +"VQ" = ( +/turf/open/floor/noslip, +/area/virtual_domain/powered) +"Ww" = ( +/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/virtual_domain/powered) +"WB" = ( +/obj/machinery/disposal/delivery_chute{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk, +/turf/open/indestructible/white, +/area/virtual_domain/powered) +"WT" = ( +/obj/machinery/door/airlock/bananium, +/turf/open/indestructible/honk, +/area/virtual_domain/powered) +"WX" = ( +/turf/open/indestructible/white, +/area/virtual_domain/powered) +"Xp" = ( +/obj/machinery/light/directional/south, +/turf/open/indestructible/honk, +/area/virtual_domain/powered) +"XB" = ( +/obj/machinery/light/directional/north, +/turf/open/indestructible/honk, +/area/virtual_domain/powered) +"Yb" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/indestructible/honk, +/area/virtual_domain/powered) +"YP" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/turf/open/indestructible/white, +/area/virtual_domain/powered) +"ZR" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/structure/disposaloutlet{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) + +(1,1,1) = {" +Ie +Ie +rT +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +rr +hY +hY +hY +hY +hY +hY +hY +hY +hY +hY +"} +(2,1,1) = {" +Ie +Ie +Vx +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Vx +hY +hY +hY +hY +hY +hY +hY +hY +hY +hY +"} +(3,1,1) = {" +Ie +Ie +Vx +Ie +Ie +Ie +Ie +Ie +Dh +Dh +Dh +Dh +Dh +Dh +Dh +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Dh +Dh +Dh +Dh +Dh +Ie +Ie +Ie +Ie +Ie +Ie +Vx +hY +hY +hY +hY +hY +hY +hY +hY +hY +hY +"} +(4,1,1) = {" +Ie +Ie +Vx +Ie +Ie +Ie +Dh +Dh +Dh +ik +ik +ik +ik +ik +Dh +Dh +Ie +Ie +Ie +Ie +Ie +Dh +Dh +ik +ik +ik +Dh +Dh +Dh +Ie +Ie +Ie +Ie +Vx +hY +hY +hY +hY +hY +hY +hY +hY +hY +hY +"} +(5,1,1) = {" +Ie +Ie +Vx +Ie +Ie +Dh +Dh +ik +ik +ik +Hq +Sm +Hq +Sm +ik +Dh +Dh +Ie +Ie +Ie +Dh +Dh +ik +ik +tq +mD +ik +ik +Dh +Dh +Ie +Ie +Ie +Vx +hY +hY +hY +hY +hY +hY +hY +hY +hY +hY +"} +(6,1,1) = {" +Ie +Ie +Vx +Ie +Dh +Dh +ik +ik +IN +Tx +bU +ai +yZ +aP +Sm +ik +Dh +Dh +Dh +Dh +Dh +Nv +IY +tq +ik +ik +ik +ik +ik +Dh +Dh +Ie +Ie +Vx +hY +hY +hY +hY +hY +hY +hY +hY +hY +hY +"} +(7,1,1) = {" +Ie +Ie +Vx +Ie +Dh +ik +ik +Dh +Bi +cw +UQ +lr +UQ +UY +Vv +ik +Dh +IY +Jv +IY +Dh +IY +Jv +Kh +IY +tq +ik +tq +ik +ik +Dh +Ie +Ie +Vx +hY +hY +hY +hY +hY +hY +hY +hY +hY +hY +"} +(8,1,1) = {" +Ie +Ie +Vx +Dh +Dh +ik +IN +Tm +lx +Ww +cw +UQ +Sm +Vv +Vv +Dh +zm +oA +IY +Jv +Jv +IY +Jv +IY +IY +IY +Dh +ik +mD +ik +Dh +Dh +Ie +Vx +hY +hY +hY +hY +hY +hY +hY +hY +hY +hY +"} +(9,1,1) = {" +Ie +Ie +Vx +Dh +ik +ik +UN +UQ +UY +Ww +Vv +TH +Vv +YP +Cp +uY +Dh +sq +oA +IY +Dh +Dh +Jv +Dh +IY +IY +IY +tq +ik +ik +ik +Dh +Ie +Vx +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +tF +"} +(10,1,1) = {" +Ie +Ie +Vx +Dh +ik +IN +UQ +UQ +yZ +Do +Do +Vv +YP +YP +YP +KG +uY +Dh +Dh +oA +IY +IY +Jv +IY +IY +gH +Jv +Xp +Dh +ik +ik +Dh +by +KI +by +by +by +by +by +by +by +by +by +Ie +"} +(11,1,1) = {" +Ie +Ie +Vx +Dh +ik +yz +fh +UQ +UY +Vv +Ww +Vv +YP +YP +tt +bp +WX +oA +oA +oA +IY +Dh +IY +IY +Jv +Jv +IY +IY +ik +tq +ik +Dh +by +iR +PM +PM +PM +PM +PM +PM +PM +PM +by +Ie +"} +(12,1,1) = {" +Ie +Ie +Vx +Dh +ik +Hq +TK +qM +yZ +Ww +Ww +Vv +YP +PQ +tt +bp +uY +Dh +oA +oA +IY +IY +Dh +IY +IY +IY +IY +Jv +ik +tq +ik +ik +by +iR +yS +PM +PM +PM +PM +PM +yS +PM +by +Ie +"} +(13,1,1) = {" +Ie +Ie +Vx +Dh +ik +UN +UQ +UQ +DL +Ww +yz +lx +Vv +YP +Lv +WX +Dh +Dh +oA +IY +IY +Dh +Dh +IY +IY +Dh +IY +Jv +ik +mD +tq +ik +by +iR +PM +PM +PM +PM +PM +PM +PM +PM +by +Ie +"} +(14,1,1) = {" +Ie +Dh +Vv +nE +nE +mD +cw +UQ +lx +Ex +Tm +UQ +lx +Vv +Vv +ps +TK +Sm +Dh +Dh +Dh +zA +rg +Dh +XB +IY +Jv +gH +IY +ik +tq +ik +by +iR +PM +QP +QP +QP +QP +QP +xt +PM +by +Ie +"} +(15,1,1) = {" +Ie +Dh +ij +hK +nE +Dh +yz +UQ +UQ +UQ +UQ +bi +UQ +yZ +Do +Iz +kn +Ww +Dh +Dh +FI +mF +mF +mF +Dh +IY +Jv +Jv +IY +ik +tq +ik +by +ZR +PM +QP +QP +QP +QP +QP +QP +PM +by +Ie +"} +(16,1,1) = {" +Ie +Dh +VQ +uX +NL +TK +Tx +UQ +TK +UQ +cW +TK +Tm +UQ +yZ +pl +Do +Ex +UY +Dh +Ug +oI +NW +mF +Dh +Dh +Jv +IY +IY +ik +tq +ik +by +PM +PM +QP +QP +QP +QP +QP +QP +PM +by +Ie +"} +(17,1,1) = {" +Ie +Dh +VQ +bR +wz +Dh +Hq +UQ +Sm +cw +UY +cw +UQ +UQ +Tx +gy +Ex +UY +Iz +TK +NB +mF +aI +mF +WT +IY +Jv +IY +Dh +ik +tq +ik +by +PM +PM +QP +QP +QP +QP +QP +QP +PM +by +Ie +"} +(18,1,1) = {" +Ie +Dh +VQ +uX +PJ +TK +sT +kn +Do +Do +Vv +Do +Ov +UQ +UY +Ok +mE +rH +pl +Dh +mF +Hr +Gg +mF +Dh +IY +IY +IY +IY +ik +tq +ik +by +PM +PM +QP +QP +QP +QP +QP +QP +PM +by +Ie +"} +(19,1,1) = {" +Ie +Dh +zF +uX +nE +Dh +Dh +Ww +Ww +Ww +Do +Do +Do +lP +Ex +UY +Ka +Vv +tv +Dh +FI +mF +mF +QX +Dh +IY +IY +IY +IY +ik +tq +ik +by +lj +PM +QP +QP +QP +QP +QP +QP +PM +by +Ie +"} +(20,1,1) = {" +Ie +Dh +Vv +nE +nE +ik +Dh +Ww +Ww +Cs +Do +Do +Vv +Dh +Dh +bQ +Dh +ba +Dh +IY +Dh +zA +tI +Dh +XB +IY +Jv +Jv +IY +ik +tq +ik +by +iR +PM +QP +QP +QP +QP +QP +gr +PM +by +Ie +"} +(21,1,1) = {" +Ie +Ie +Vx +Dh +ik +Dh +Dh +Do +Do +Do +Ww +Do +Vv +rh +ed +gK +Dh +UL +Sm +IY +IY +Dh +Dh +Kh +IY +IY +Jv +IY +ik +tq +mD +ik +by +iR +PM +PM +PM +PM +PM +PM +PM +PM +by +Ie +"} +(22,1,1) = {" +Ie +Ie +Vx +Dh +ik +Dh +Dh +JB +Sg +Vv +Ww +Vv +uZ +YP +bp +bp +uY +Dh +bQ +oA +IY +IY +Dh +IY +Jv +IY +IY +IY +ik +tq +ik +ik +by +iR +PM +PM +yS +PM +PM +PM +PM +PM +by +Ie +"} +(23,1,1) = {" +Ie +Ie +Vx +Dh +ik +cM +eE +lx +Vv +ki +Ww +Vv +Rx +YP +bp +bp +WB +TK +Aa +Dh +IY +IY +Jv +Jv +Jv +IY +aM +Xp +Dh +tq +ik +Dh +by +iR +PM +PM +PM +PM +PM +PM +PM +PM +by +Ie +"} +(24,1,1) = {" +Ie +Ie +Vx +Dh +ik +Dh +Dh +lP +Do +Do +Cs +bQ +YP +bq +Rh +WX +uY +Dh +oA +oA +IY +IY +Jv +Jv +IY +IY +Dh +Dh +ik +mD +ik +Dh +by +KI +by +by +by +by +by +by +by +by +by +Ie +"} +(25,1,1) = {" +Ie +Ie +Vx +Dh +ik +Dh +Dh +pl +Do +Vv +Do +Vv +Vv +rh +lm +uY +Dh +sq +oA +IY +IY +IY +IY +IY +Dh +IY +IY +ik +mD +ik +ik +Dh +Ie +Vx +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +"} +(26,1,1) = {" +Ie +Ie +Vx +Dh +ik +ik +Dh +yd +Do +Do +Do +Ex +lx +Vv +Dh +Dh +oA +oA +IY +IY +IY +Jv +aM +IY +IY +IY +Dh +ik +tq +ik +Dh +Dh +Ie +Vx +hY +hY +hY +hY +hY +hY +hY +hY +hY +hY +"} +(27,1,1) = {" +Ie +Ie +Vx +Dh +Dh +ik +Dh +Dh +Ex +lx +HQ +UQ +UQ +bU +Dh +ik +Dh +Yb +IY +IY +Dh +IY +IY +Dh +IY +IY +ik +mD +ik +ik +Dh +Ie +Ie +Vx +hY +hY +hY +hY +hY +hY +hY +hY +hY +hY +"} +(28,1,1) = {" +Ie +Ie +Vx +Ie +Dh +Dh +ik +ik +Dh +mD +Dh +Ka +lP +mD +Dh +ik +Dh +Dh +Dh +Dh +Dh +IY +IY +IY +ik +ik +ik +ik +ik +Dh +Dh +Ie +Ie +Vx +hY +hY +hY +hY +hY +hY +hY +hY +hY +hY +"} +(29,1,1) = {" +Ie +Ie +Vx +Ie +Ie +Dh +Dh +ik +ik +ik +tq +tq +tq +Dh +ik +Dh +Dh +Ie +Ie +Ie +Dh +Dh +ik +ik +mD +tq +ik +ik +Dh +Dh +Ie +Ie +Ie +Vx +hY +hY +hY +hY +hY +hY +hY +hY +hY +hY +"} +(30,1,1) = {" +Ie +Ie +Vx +Ie +Ie +Ie +Dh +Dh +Dh +ik +ik +ik +ik +ik +Dh +Dh +Ie +Ie +Ie +Ie +Ie +Dh +Dh +ik +ik +ik +Dh +Dh +Dh +Ie +Ie +Ie +Ie +Vx +hY +hY +hY +hY +hY +hY +hY +hY +hY +hY +"} +(31,1,1) = {" +Ie +Ie +Vx +Ie +Ie +Ie +Ie +Ie +Dh +Dh +Dh +Dh +Dh +Dh +Dh +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Dh +Dh +Dh +Dh +Dh +Ie +Ie +Ie +Ie +Ie +Ie +Vx +hY +hY +hY +hY +hY +hY +hY +hY +hY +hY +"} +(32,1,1) = {" +Ie +Ie +VI +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +RU +ly +hY +hY +hY +hY +hY +hY +hY +hY +hY +hY +"} +(33,1,1) = {" +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +Ie +hY +hY +hY +hY +hY +hY +hY +hY +hY +hY +"} diff --git a/_maps/virtual_domains/colossus.dmm b/_maps/virtual_domains/colossus.dmm new file mode 100644 index 0000000000000..a9c3c6e6d79e7 --- /dev/null +++ b/_maps/virtual_domains/colossus.dmm @@ -0,0 +1,2250 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"c" = ( +/obj/structure/marker_beacon/olive, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"e" = ( +/obj/structure/marker_beacon/bronze, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"j" = ( +/obj/structure/marker_beacon/cerulean, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"k" = ( +/turf/closed/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"l" = ( +/obj/structure/marker_beacon/lime, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"m" = ( +/obj/structure/marker_beacon/violet, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"o" = ( +/obj/effect/mob_spawn/corpse/human/miner, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"p" = ( +/mob/living/simple_animal/hostile/megafauna/colossus/virtual_domain, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"q" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/open/indestructible/binary, +/area/lavaland/surface/outdoors/virtual_domain) +"r" = ( +/obj/machinery/light/small/blacklight/directional/south, +/obj/effect/baseturf_helper/virtual_domain, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/virtual_domain/powered) +"s" = ( +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"u" = ( +/obj/structure/marker_beacon/indigo, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"v" = ( +/turf/open/indestructible/binary, +/area/lavaland/surface/outdoors/virtual_domain) +"x" = ( +/obj/structure/marker_beacon/purple, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"z" = ( +/obj/structure/marker_beacon/jade, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"B" = ( +/obj/structure/marker_beacon/teal, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"D" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/template_noop, +/area/virtual_domain/safehouse) +"L" = ( +/obj/structure/marker_beacon/yellow, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"N" = ( +/obj/effect/landmark/bitrunning/safehouse_spawn, +/turf/template_noop, +/area/virtual_domain/safehouse) +"T" = ( +/obj/structure/marker_beacon/burgundy, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"U" = ( +/turf/template_noop, +/area/virtual_domain/safehouse) +"W" = ( +/obj/structure/marker_beacon/fuchsia, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) + +(1,1,1) = {" +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +q +"} +(2,1,1) = {" +v +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +v +"} +(3,1,1) = {" +v +k +a +a +k +k +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +k +k +a +a +a +a +a +a +a +a +k +k +a +a +a +a +a +a +k +k +k +v +"} +(4,1,1) = {" +v +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +v +"} +(5,1,1) = {" +v +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +s +k +v +"} +(6,1,1) = {" +v +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +m +a +a +a +a +a +a +a +a +a +a +a +a +s +s +k +v +"} +(7,1,1) = {" +v +k +a +a +a +a +o +a +a +a +a +a +a +a +a +a +c +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +a +a +a +a +s +k +v +"} +(8,1,1) = {" +v +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +k +a +a +a +k +k +v +"} +(9,1,1) = {" +v +k +a +a +a +a +a +a +s +s +s +s +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +k +v +"} +(10,1,1) = {" +v +k +k +a +a +a +a +a +k +k +k +s +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +k +v +"} +(11,1,1) = {" +v +k +k +a +a +a +a +a +k +k +k +s +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +k +a +a +a +a +a +a +a +a +s +s +a +a +a +a +a +k +v +"} +(12,1,1) = {" +v +k +k +a +a +a +a +a +s +k +s +s +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +k +a +a +a +a +a +a +a +s +a +a +a +a +a +k +v +"} +(13,1,1) = {" +v +k +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +k +k +a +a +a +a +a +u +a +a +a +a +a +a +a +k +v +"} +(14,1,1) = {" +v +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +k +k +a +a +a +a +a +a +a +a +a +a +a +a +a +k +v +"} +(15,1,1) = {" +v +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +v +"} +(16,1,1) = {" +v +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +e +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +v +"} +(17,1,1) = {" +v +k +a +a +a +a +a +a +a +a +a +a +a +j +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +v +"} +(18,1,1) = {" +v +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +v +"} +(19,1,1) = {" +v +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +v +"} +(20,1,1) = {" +v +k +a +a +a +a +a +x +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +v +"} +(21,1,1) = {" +v +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +r +U +U +U +U +U +N +a +k +v +"} +(22,1,1) = {" +v +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +U +U +U +a +k +v +"} +(23,1,1) = {" +v +k +a +a +a +a +a +a +a +a +a +a +a +a +p +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +U +U +U +a +k +v +"} +(24,1,1) = {" +v +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +l +a +a +U +U +U +U +U +U +a +k +v +"} +(25,1,1) = {" +v +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +U +U +U +a +k +v +"} +(26,1,1) = {" +v +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +U +U +U +a +k +v +"} +(27,1,1) = {" +v +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +a +r +U +U +U +U +U +D +a +k +v +"} +(28,1,1) = {" +v +k +a +a +a +a +a +a +a +a +a +a +a +a +T +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +v +"} +(29,1,1) = {" +v +k +a +a +a +a +a +a +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +W +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +v +"} +(30,1,1) = {" +v +k +a +a +a +a +a +a +k +k +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +v +"} +(31,1,1) = {" +v +k +a +a +a +a +a +a +k +k +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +v +"} +(32,1,1) = {" +v +k +a +a +a +a +a +a +a +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +v +"} +(33,1,1) = {" +v +k +a +a +a +a +a +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +z +a +a +a +a +a +a +a +k +v +"} +(34,1,1) = {" +v +k +k +a +a +a +a +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +a +a +a +a +a +a +a +a +a +a +a +a +a +k +v +"} +(35,1,1) = {" +v +k +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +l +a +a +a +a +a +a +a +a +k +k +k +a +a +a +a +a +a +a +a +a +a +a +a +k +v +"} +(36,1,1) = {" +v +k +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +k +k +a +a +a +a +a +a +a +a +a +a +a +a +k +v +"} +(37,1,1) = {" +v +k +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +k +v +"} +(38,1,1) = {" +v +k +a +a +a +s +s +a +a +a +a +a +B +a +a +a +a +k +a +a +a +a +a +a +s +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +k +v +"} +(39,1,1) = {" +v +k +a +a +a +s +s +a +a +a +a +a +a +a +a +a +k +k +k +a +a +a +a +a +s +s +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +v +"} +(40,1,1) = {" +v +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +v +"} +(41,1,1) = {" +v +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +L +a +a +a +a +a +a +a +k +v +"} +(42,1,1) = {" +v +k +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +k +v +"} +(43,1,1) = {" +v +k +a +k +k +k +k +a +a +a +a +a +k +k +k +k +a +a +a +k +k +k +k +k +a +a +a +a +a +a +k +k +k +k +a +a +a +a +a +a +k +k +a +a +k +v +"} +(44,1,1) = {" +v +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +v +"} +(45,1,1) = {" +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +v +"} diff --git a/_maps/virtual_domains/gondola_asteroid.dmm b/_maps/virtual_domains/gondola_asteroid.dmm new file mode 100644 index 0000000000000..d6377a4a4c10a --- /dev/null +++ b/_maps/virtual_domains/gondola_asteroid.dmm @@ -0,0 +1,1784 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/indestructible/binary, +/area/ruin/space/has_grav/powered/virtual_domain) +"c" = ( +/turf/open/space/basic, +/area/space) +"e" = ( +/turf/open/misc/asteroid/airless, +/area/ruin/space/has_grav/powered/virtual_domain) +"g" = ( +/obj/structure/marker_beacon{ + light_color = "#FFE8AA"; + light_range = 20 + }, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered/virtual_domain) +"h" = ( +/turf/closed/mineral/random, +/area/ruin/space/has_grav/powered/virtual_domain) +"m" = ( +/obj/structure/closet/crate/secure/bitrunning/encrypted/gondola, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered/virtual_domain) +"n" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered/virtual_domain) +"o" = ( +/turf/template_noop, +/area/template_noop) +"q" = ( +/obj/structure/flora/tree/palm, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered/virtual_domain) +"r" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/template_noop, +/area/virtual_domain/safehouse) +"s" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered/virtual_domain) +"t" = ( +/turf/template_noop, +/area/virtual_domain/safehouse) +"w" = ( +/obj/structure/water_source/puddle, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered/virtual_domain) +"y" = ( +/obj/structure/flora/bush/stalky/style_random, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered/virtual_domain) +"z" = ( +/mob/living/simple_animal/pet/gondola/virtual_domain, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered/virtual_domain) +"A" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/turf/template_noop, +/area/virtual_domain/safehouse) +"C" = ( +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered/virtual_domain) +"D" = ( +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered/virtual_domain) +"F" = ( +/obj/structure/flora/bush/grassy/style_random, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered/virtual_domain) +"I" = ( +/obj/structure/flora/bush/reed/style_random, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered/virtual_domain) +"J" = ( +/obj/structure/flora/bush/flowers_yw/style_random, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered/virtual_domain) +"K" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/indestructible/binary, +/area/ruin/space/has_grav/powered/virtual_domain) +"M" = ( +/obj/structure/table/wood, +/obj/item/storage/bag/tray, +/obj/item/kitchen/fork, +/obj/item/knife/kitchen, +/turf/template_noop, +/area/virtual_domain/safehouse) +"N" = ( +/obj/structure/flora/bush/large/style_random, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered/virtual_domain) +"O" = ( +/obj/effect/landmark/bitrunning/safehouse_spawn, +/turf/template_noop, +/area/virtual_domain/safehouse) +"Q" = ( +/obj/structure/flora/bush/lavendergrass/style_random, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered/virtual_domain) +"T" = ( +/obj/structure/flora/bush/sunny/style_random, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered/virtual_domain) +"V" = ( +/obj/structure/flora/coconuts, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered/virtual_domain) +"W" = ( +/obj/structure/flora/bush/ferny/style_random, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered/virtual_domain) + +(1,1,1) = {" +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +a +a +a +a +a +a +a +a +o +o +o +o +o +o +o +o +o +o +"} +(2,1,1) = {" +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +a +a +a +h +h +h +h +h +h +a +a +o +o +o +o +o +o +o +o +o +"} +(3,1,1) = {" +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +a +a +a +a +a +h +h +h +h +h +h +h +h +h +a +a +K +o +o +o +o +o +o +o +"} +(4,1,1) = {" +o +o +o +o +o +o +o +o +o +o +o +o +o +o +a +a +a +a +a +a +a +h +h +h +h +h +h +h +h +h +h +h +h +h +e +a +o +o +o +o +o +o +o +"} +(5,1,1) = {" +o +o +o +o +o +o +o +o +o +o +o +o +o +a +a +h +h +h +h +h +h +h +h +h +h +h +h +h +h +C +h +h +h +h +h +a +o +o +o +o +o +o +o +"} +(6,1,1) = {" +o +o +o +o +o +o +o +o +a +a +a +a +a +a +h +h +h +h +h +h +h +h +h +h +h +C +C +C +C +C +C +C +h +h +h +a +o +o +o +o +o +o +o +"} +(7,1,1) = {" +o +o +o +o +o +o +o +a +a +h +h +h +h +h +h +h +h +h +h +h +h +h +h +C +C +C +C +J +C +C +C +z +C +h +h +a +o +o +o +o +o +o +o +"} +(8,1,1) = {" +o +o +o +o +o +a +a +a +h +h +h +h +h +h +h +h +h +h +h +h +h +C +C +C +C +Q +C +q +C +h +h +h +h +h +e +a +a +a +a +a +a +a +a +"} +(9,1,1) = {" +o +o +o +o +a +a +h +h +h +h +h +h +h +h +h +h +C +h +C +C +C +C +C +C +C +C +V +C +C +C +C +h +h +h +e +c +c +c +c +c +c +c +a +"} +(10,1,1) = {" +o +o +a +a +a +h +h +h +h +h +h +h +h +C +q +C +C +W +C +C +V +C +C +q +C +C +C +C +F +C +C +h +h +h +e +c +c +c +c +c +c +c +a +"} +(11,1,1) = {" +o +a +a +h +h +h +h +h +h +h +h +h +h +h +h +C +C +C +C +C +N +C +C +C +C +C +C +s +C +C +C +h +h +h +e +c +c +c +c +c +c +c +a +"} +(12,1,1) = {" +o +a +h +h +h +h +h +h +h +h +h +h +h +h +C +s +I +J +C +C +g +C +C +V +C +z +C +y +C +g +C +h +h +h +e +c +c +c +c +c +c +c +a +"} +(13,1,1) = {" +a +a +h +h +h +h +h +h +h +h +h +h +C +C +C +C +Q +Q +C +z +C +C +C +C +C +C +C +s +Q +C +C +h +h +h +e +c +c +c +c +c +c +c +a +"} +(14,1,1) = {" +a +h +h +h +h +h +h +h +h +h +h +h +C +C +w +C +s +C +W +C +C +C +C +C +C +N +C +C +C +C +h +h +h +h +e +c +c +c +c +c +c +c +a +"} +(15,1,1) = {" +a +h +h +h +h +h +h +h +h +h +h +z +C +C +C +C +y +C +C +C +F +s +C +C +C +C +C +w +C +h +h +h +h +h +e +c +c +c +c +c +c +c +a +"} +(16,1,1) = {" +a +h +h +h +h +h +h +h +h +h +h +h +h +h +h +C +C +C +C +C +s +Q +C +C +C +C +C +C +C +C +h +h +h +h +e +c +c +c +c +c +c +c +a +"} +(17,1,1) = {" +a +h +h +h +h +h +h +h +h +h +h +h +h +h +h +h +h +C +C +C +Q +D +C +C +C +C +q +C +C +C +C +h +h +h +h +t +t +t +t +t +O +c +a +"} +(18,1,1) = {" +a +h +h +h +h +h +h +h +h +h +h +h +h +h +h +h +h +h +C +n +I +C +C +C +C +C +C +C +C +C +C +C +h +h +h +t +t +M +M +t +t +c +a +"} +(19,1,1) = {" +a +h +h +h +h +h +h +h +h +h +C +n +C +h +h +h +h +h +C +C +C +C +C +C +s +T +C +C +C +s +C +C +h +C +C +t +t +A +A +t +t +c +a +"} +(20,1,1) = {" +a +h +h +h +h +h +h +h +h +C +C +C +C +C +C +h +h +h +C +C +q +V +C +C +C +J +C +C +C +C +C +C +C +C +C +t +t +t +t +t +t +c +a +"} +(21,1,1) = {" +a +e +h +h +h +h +h +h +h +z +C +C +g +C +C +C +C +C +C +C +C +C +C +C +C +C +C +C +C +C +C +C +C +C +C +t +t +t +t +t +t +c +a +"} +(22,1,1) = {" +a +e +e +h +h +h +h +h +h +C +C +C +q +C +s +s +C +C +W +C +m +C +C +C +g +C +z +C +C +C +C +C +h +h +h +t +t +t +t +t +t +c +a +"} +(23,1,1) = {" +a +e +e +h +h +h +h +h +h +C +C +C +C +C +C +y +C +C +C +C +C +C +C +C +C +C +C +C +C +q +C +C +h +h +h +t +t +t +t +t +r +c +a +"} +(24,1,1) = {" +a +e +e +h +h +h +h +h +h +C +C +V +C +C +C +C +C +C +C +w +C +z +N +C +C +C +N +C +C +C +C +C +h +h +h +c +c +c +c +c +c +c +a +"} +(25,1,1) = {" +a +a +e +e +h +h +h +h +n +C +C +C +C +C +z +C +C +C +C +C +C +C +C +C +F +C +C +C +C +C +C +C +h +h +h +c +c +c +c +c +c +c +a +"} +(26,1,1) = {" +o +a +e +e +h +h +h +C +C +C +C +C +C +C +C +C +s +y +C +C +C +C +C +C +I +F +C +C +C +C +C +h +h +h +c +c +c +c +c +c +c +c +a +"} +(27,1,1) = {" +o +a +e +e +h +h +h +C +C +C +w +C +C +C +C +F +D +s +C +J +C +C +C +C +C +C +q +C +C +V +C +h +h +h +c +c +c +c +c +c +c +c +a +"} +(28,1,1) = {" +o +a +e +e +h +h +h +h +C +C +C +C +C +C +C +C +C +C +C +g +F +s +C +C +C +C +C +C +C +C +h +h +h +c +c +c +c +c +c +c +c +c +a +"} +(29,1,1) = {" +o +a +a +e +e +h +h +h +C +C +C +C +C +n +C +C +C +C +C +C +s +y +D +C +C +C +C +w +C +h +h +h +h +c +c +c +c +c +c +c +c +c +a +"} +(30,1,1) = {" +o +o +a +e +e +h +h +C +C +C +n +C +C +C +C +C +C +C +C +C +C +C +C +C +C +s +C +C +C +h +h +h +e +e +c +c +c +c +c +c +c +c +a +"} +(31,1,1) = {" +o +o +a +e +h +h +C +g +J +C +s +C +C +C +h +C +C +C +C +C +V +C +C +C +C +C +C +C +h +h +h +e +e +e +c +c +c +c +c +c +c +c +a +"} +(32,1,1) = {" +o +o +a +h +h +h +h +C +C +C +C +C +C +h +h +h +C +C +C +q +C +C +C +C +C +C +h +h +h +h +e +e +e +h +h +a +a +a +a +a +a +a +a +"} +(33,1,1) = {" +o +o +a +h +h +h +C +C +C +C +C +C +h +h +h +h +h +h +h +h +h +h +h +h +h +h +h +h +h +h +e +e +h +h +h +a +o +o +o +o +o +o +o +"} +(34,1,1) = {" +o +o +a +h +h +C +C +C +C +h +h +h +h +h +h +h +h +h +h +h +h +h +h +h +h +h +h +h +h +a +a +h +h +h +a +a +o +o +o +o +o +o +o +"} +(35,1,1) = {" +o +o +a +h +h +h +h +h +h +h +h +h +h +h +e +e +e +e +e +h +h +h +h +h +a +a +a +a +a +a +a +h +h +h +a +a +o +o +o +o +o +o +o +"} +(36,1,1) = {" +o +o +a +a +h +h +h +h +h +h +h +h +h +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +a +a +a +a +a +o +o +o +o +o +o +o +o +"} +(37,1,1) = {" +o +o +o +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +"} diff --git a/_maps/virtual_domains/hierophant.dmm b/_maps/virtual_domains/hierophant.dmm new file mode 100644 index 0000000000000..02b11ad4e1ef4 --- /dev/null +++ b/_maps/virtual_domains/hierophant.dmm @@ -0,0 +1,1066 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/indestructible/hierophant, +/area/lavaland/surface/outdoors/virtual_domain) +"c" = ( +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 5 + }, +/turf/open/indestructible/hierophant/two, +/area/lavaland/surface/outdoors/virtual_domain) +"h" = ( +/obj/effect/light_emitter{ + set_cap = 3; + set_luminosity = 5 + }, +/turf/open/indestructible/hierophant, +/area/lavaland/surface/outdoors/virtual_domain) +"n" = ( +/obj/structure/marker_beacon/indigo, +/turf/open/indestructible/hierophant, +/area/lavaland/surface/outdoors/virtual_domain) +"o" = ( +/turf/template_noop, +/area/template_noop) +"r" = ( +/turf/closed/indestructible/riveted/hierophant, +/area/lavaland/surface/outdoors/virtual_domain) +"u" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/template_noop, +/area/virtual_domain/safehouse) +"w" = ( +/turf/template_noop, +/area/virtual_domain/safehouse) +"y" = ( +/turf/closed/indestructible/binary, +/area/lavaland/surface/outdoors/virtual_domain) +"E" = ( +/mob/living/simple_animal/hostile/megafauna/hierophant/virtual_domain, +/turf/open/indestructible/hierophant/two, +/area/lavaland/surface/outdoors/virtual_domain) +"H" = ( +/obj/effect/landmark/bitrunning/safehouse_spawn, +/turf/template_noop, +/area/virtual_domain/safehouse) +"K" = ( +/turf/open/indestructible/hierophant/two, +/area/lavaland/surface/outdoors/virtual_domain) +"N" = ( +/obj/machinery/light/small/blacklight/directional/south, +/obj/effect/baseturf_helper/virtual_domain, +/turf/open/indestructible/hierophant, +/area/virtual_domain/powered) +"S" = ( +/obj/effect/mob_spawn/corpse/human/miner, +/turf/open/indestructible/hierophant, +/area/lavaland/surface/outdoors/virtual_domain) +"W" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/indestructible/binary, +/area/lavaland/surface/outdoors/virtual_domain) +"Y" = ( +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) + +(1,1,1) = {" +y +y +y +y +y +y +y +y +y +y +y +y +y +y +y +y +y +y +y +y +y +y +y +y +y +o +o +y +y +y +y +y +y +y +y +y +y +W +"} +(2,1,1) = {" +y +r +r +r +r +r +r +r +r +r +r +r +r +r +r +r +r +r +r +r +r +r +r +r +y +o +o +y +Y +Y +Y +Y +Y +Y +Y +Y +Y +y +"} +(3,1,1) = {" +y +r +a +a +a +a +a +a +a +a +a +a +h +a +a +a +a +a +a +a +a +a +a +r +y +o +o +y +Y +Y +Y +Y +Y +Y +Y +Y +Y +y +"} +(4,1,1) = {" +y +r +a +a +a +h +h +a +a +a +r +a +a +a +r +a +a +a +h +h +a +a +a +r +y +y +y +y +Y +Y +Y +Y +Y +Y +Y +Y +Y +y +"} +(5,1,1) = {" +y +r +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +r +r +y +y +Y +Y +Y +Y +Y +Y +Y +Y +Y +y +"} +(6,1,1) = {" +y +r +a +h +a +r +r +a +h +n +a +a +h +a +a +a +h +a +r +r +a +h +a +a +a +a +r +y +Y +Y +Y +Y +Y +Y +Y +Y +Y +y +"} +(7,1,1) = {" +y +r +a +h +a +r +r +a +h +a +a +a +h +a +a +a +h +a +r +r +a +h +a +a +a +a +a +r +Y +Y +Y +Y +Y +Y +Y +Y +Y +y +"} +(8,1,1) = {" +y +r +a +a +a +a +a +K +K +K +K +K +K +K +K +K +K +K +a +a +a +n +a +a +r +a +a +a +r +Y +Y +Y +Y +Y +Y +Y +Y +y +"} +(9,1,1) = {" +y +r +a +a +a +h +h +K +K +K +r +K +K +K +r +K +K +K +h +h +a +a +a +r +y +r +S +a +a +r +Y +Y +Y +Y +Y +Y +Y +y +"} +(10,1,1) = {" +y +r +a +a +a +a +a +K +K +K +K +K +c +K +K +K +K +K +a +a +a +a +a +r +y +y +r +a +a +N +w +w +w +w +w +H +Y +y +"} +(11,1,1) = {" +y +r +a +r +a +a +a +K +r +K +K +K +K +K +K +K +r +K +a +a +a +r +a +r +y +y +y +r +a +a +w +w +w +w +w +w +Y +y +"} +(12,1,1) = {" +y +r +a +a +a +a +a +K +K +K +K +K +K +K +K +K +K +K +a +a +a +a +a +r +y +y +y +r +a +a +w +w +w +w +w +w +Y +y +"} +(13,1,1) = {" +y +r +h +a +a +h +h +K +K +c +K +K +E +K +K +c +K +K +h +h +a +a +h +r +y +y +y +r +a +a +w +w +w +w +w +w +Y +y +"} +(14,1,1) = {" +y +r +a +a +a +a +a +K +K +K +K +K +K +K +K +K +K +K +a +a +a +a +a +r +y +y +y +r +a +a +w +w +w +w +w +w +Y +y +"} +(15,1,1) = {" +y +r +a +r +a +a +a +K +r +K +K +K +K +K +K +K +r +K +a +a +a +r +a +r +y +y +y +r +a +a +w +w +w +w +w +w +Y +y +"} +(16,1,1) = {" +y +r +a +a +a +a +a +K +K +K +K +K +c +K +K +K +K +K +a +a +a +a +a +r +y +y +r +a +a +N +w +w +w +w +w +u +Y +y +"} +(17,1,1) = {" +y +r +a +a +a +h +h +K +K +K +r +K +K +K +r +K +K +K +h +h +a +a +a +r +y +r +a +a +a +r +Y +Y +Y +Y +Y +Y +Y +y +"} +(18,1,1) = {" +y +r +a +a +a +a +a +K +K +K +K +K +K +K +K +K +K +K +a +a +a +a +a +a +r +a +a +a +r +Y +Y +Y +Y +Y +Y +Y +Y +y +"} +(19,1,1) = {" +y +r +a +h +a +r +r +a +h +a +a +a +h +a +a +a +h +a +r +r +a +h +a +a +a +a +a +r +Y +Y +Y +Y +Y +Y +Y +Y +Y +y +"} +(20,1,1) = {" +y +r +a +h +a +r +r +S +h +a +a +a +h +a +n +a +h +a +r +r +a +h +a +a +a +a +r +y +Y +Y +Y +Y +Y +Y +Y +Y +Y +y +"} +(21,1,1) = {" +y +r +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +r +r +y +y +Y +Y +Y +Y +Y +Y +Y +Y +Y +y +"} +(22,1,1) = {" +y +r +a +a +a +h +h +a +a +a +r +a +a +a +r +a +a +a +h +h +a +a +a +r +y +y +y +y +Y +Y +Y +Y +Y +Y +Y +Y +Y +y +"} +(23,1,1) = {" +y +r +a +a +a +a +a +a +a +a +a +a +h +a +a +a +a +a +a +a +a +a +a +r +y +o +o +y +Y +Y +Y +Y +Y +Y +Y +Y +Y +y +"} +(24,1,1) = {" +y +r +r +r +r +r +r +r +r +r +r +r +r +r +r +r +r +r +r +r +r +r +r +r +y +o +o +y +Y +Y +Y +Y +Y +Y +Y +Y +Y +y +"} +(25,1,1) = {" +y +y +y +y +y +y +y +y +y +y +y +y +y +y +y +y +y +y +y +y +y +y +y +y +y +o +o +y +y +y +y +y +y +y +y +y +y +y +"} diff --git a/_maps/virtual_domains/legion.dmm b/_maps/virtual_domains/legion.dmm new file mode 100644 index 0000000000000..55843177ad0f1 --- /dev/null +++ b/_maps/virtual_domains/legion.dmm @@ -0,0 +1,6370 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ah" = ( +/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/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"ak" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"aI" = ( +/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/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"aR" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"bd" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"be" = ( +/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/virtual_domain) +"bt" = ( +/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/lavaland/surface/outdoors/virtual_domain) +"bu" = ( +/obj/structure/marker_beacon/bronze, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"ca" = ( +/obj/effect/mob_spawn/corpse/human/legioninfested, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"cf" = ( +/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/virtual_domain) +"cp" = ( +/turf/template_noop, +/area/template_noop) +"dm" = ( +/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/virtual_domain) +"dn" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/effect/mob_spawn/corpse/human/legioninfested, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"dr" = ( +/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/virtual_domain) +"dx" = ( +/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/virtual_domain) +"dL" = ( +/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/virtual_domain) +"dQ" = ( +/turf/closed/wall/mineral/titanium/survival/pod, +/area/lavaland/surface/outdoors/virtual_domain) +"et" = ( +/obj/structure/stone_tile/block/cracked, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"ew" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"eJ" = ( +/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/virtual_domain) +"fA" = ( +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"fG" = ( +/obj/structure/marker_beacon/violet, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"gh" = ( +/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/virtual_domain) +"gk" = ( +/obj/structure/necropolis_gate/locked, +/obj/structure/stone_tile/slab, +/turf/open/indestructible/boss, +/area/lavaland/surface/outdoors/virtual_domain) +"gK" = ( +/obj/effect/decal/cleanable/blood/footprints, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"gQ" = ( +/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/virtual_domain) +"hc" = ( +/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/virtual_domain) +"hw" = ( +/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/virtual_domain) +"hx" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"hU" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"ib" = ( +/turf/closed/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"ie" = ( +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"iP" = ( +/obj/structure/fluff/drake_statue/falling, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"iR" = ( +/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/virtual_domain) +"iV" = ( +/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/virtual_domain) +"jk" = ( +/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/virtual_domain) +"jt" = ( +/obj/structure/stone_tile/slab/cracked, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"jw" = ( +/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/virtual_domain) +"jN" = ( +/obj/machinery/sleeper/survival_pod, +/turf/open/floor/pod/dark, +/area/lavaland/surface/outdoors/virtual_domain) +"ka" = ( +/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/virtual_domain) +"kg" = ( +/turf/closed/indestructible/riveted/boss, +/area/lavaland/surface/outdoors/virtual_domain) +"kT" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"kZ" = ( +/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/virtual_domain) +"ll" = ( +/obj/structure/stone_tile/cracked, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"lz" = ( +/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/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"lC" = ( +/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/virtual_domain) +"lO" = ( +/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/virtual_domain) +"lT" = ( +/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/virtual_domain) +"mz" = ( +/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/virtual_domain) +"mG" = ( +/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/virtual_domain) +"nm" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"nu" = ( +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"nv" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"ny" = ( +/obj/structure/stone_tile, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"nI" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"nO" = ( +/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/virtual_domain) +"ob" = ( +/obj/structure/necropolis_gate/legion_gate, +/obj/structure/necropolis_arch, +/obj/structure/stone_tile/slab, +/turf/open/indestructible/boss, +/area/lavaland/surface/outdoors/virtual_domain) +"og" = ( +/obj/effect/landmark/bitrunning/safehouse_spawn, +/turf/template_noop, +/area/virtual_domain/safehouse) +"oo" = ( +/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/virtual_domain) +"ox" = ( +/turf/closed/indestructible/binary, +/area/lavaland/surface/outdoors/virtual_domain) +"oS" = ( +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"pP" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"qo" = ( +/obj/structure/stone_tile/slab/cracked, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"qs" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"qW" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/obj/machinery/door/airlock/survival_pod/glass, +/turf/open/floor/pod/dark, +/area/lavaland/surface/outdoors/virtual_domain) +"rt" = ( +/obj/effect/mob_spawn/corpse/human/miner, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"rU" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"sd" = ( +/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/virtual_domain) +"sk" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"sz" = ( +/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/virtual_domain) +"sA" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"tk" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"tF" = ( +/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/virtual_domain) +"uK" = ( +/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/virtual_domain) +"vf" = ( +/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/virtual_domain) +"wq" = ( +/obj/structure/marker_beacon/teal, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"wy" = ( +/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/virtual_domain) +"xd" = ( +/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/virtual_domain) +"xm" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"xw" = ( +/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/virtual_domain) +"xD" = ( +/obj/structure/stone_tile/cracked, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"yu" = ( +/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/virtual_domain) +"yZ" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"zg" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/baseturf_helper/virtual_domain, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/virtual_domain/powered) +"zo" = ( +/obj/effect/turf_decal/mining/survival, +/turf/closed/wall/mineral/titanium/survival/pod, +/area/lavaland/surface/outdoors/virtual_domain) +"zW" = ( +/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/virtual_domain) +"Ah" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/indestructible/binary, +/area/lavaland/surface/outdoors/virtual_domain) +"Aj" = ( +/obj/structure/marker_beacon/burgundy, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"Ak" = ( +/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/virtual_domain) +"As" = ( +/obj/structure/marker_beacon/cerulean, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"AY" = ( +/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/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"Bo" = ( +/obj/structure/marker_beacon/indigo, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"BO" = ( +/turf/template_noop, +/area/virtual_domain/safehouse) +"CX" = ( +/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/virtual_domain) +"Dm" = ( +/turf/closed/mineral/random/volcanic, +/area/lavaland/surface/outdoors/virtual_domain) +"DP" = ( +/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/virtual_domain) +"Ek" = ( +/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/virtual_domain) +"Ep" = ( +/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/virtual_domain) +"Ez" = ( +/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/virtual_domain) +"EC" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"Fg" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 6 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"Fp" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/template_noop, +/area/virtual_domain/safehouse) +"Fq" = ( +/obj/structure/marker_beacon/fuchsia, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"FV" = ( +/obj/structure/stone_tile/block, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"Gj" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"Gn" = ( +/turf/closed/indestructible/riveted/boss/see_through, +/area/lavaland/surface/outdoors/virtual_domain) +"Go" = ( +/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/virtual_domain) +"GH" = ( +/obj/structure/fans, +/turf/open/floor/pod/dark, +/area/lavaland/surface/outdoors/virtual_domain) +"GM" = ( +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"Hi" = ( +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"Hu" = ( +/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/virtual_domain) +"Hw" = ( +/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/virtual_domain) +"HK" = ( +/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/virtual_domain) +"HQ" = ( +/obj/structure/stone_tile/block/cracked, +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"HZ" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"Ii" = ( +/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/virtual_domain) +"Io" = ( +/obj/structure/marker_beacon/jade, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"Ip" = ( +/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/virtual_domain) +"IB" = ( +/obj/structure/stone_tile, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"IG" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"IL" = ( +/obj/structure/stone_tile/surrounding, +/obj/structure/stone_tile/center/cracked, +/mob/living/simple_animal/hostile/megafauna/legion/virtual_domain, +/turf/open/indestructible/boss, +/area/lavaland/surface/outdoors/virtual_domain) +"IQ" = ( +/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/virtual_domain) +"Jc" = ( +/obj/structure/stone_tile/slab, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"Jp" = ( +/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/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"Jt" = ( +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"Jw" = ( +/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/virtual_domain) +"JD" = ( +/obj/structure/fluff/drake_statue, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"KG" = ( +/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/virtual_domain) +"Le" = ( +/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/virtual_domain) +"Lx" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"LH" = ( +/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/virtual_domain) +"Ml" = ( +/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/virtual_domain) +"Mm" = ( +/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/virtual_domain) +"Mo" = ( +/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/virtual_domain) +"MH" = ( +/obj/structure/stone_tile/cracked, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"MP" = ( +/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/virtual_domain) +"MW" = ( +/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/virtual_domain) +"Nl" = ( +/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/virtual_domain) +"Ot" = ( +/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/virtual_domain) +"Pv" = ( +/obj/effect/turf_decal/mining/survival{ + dir = 4 + }, +/turf/closed/wall/mineral/titanium/survival/pod, +/area/lavaland/surface/outdoors/virtual_domain) +"Px" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"PO" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/open/indestructible/boss, +/area/lavaland/surface/outdoors/virtual_domain) +"Qi" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/cracked, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"Qx" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/marker_beacon/burgundy, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"QD" = ( +/obj/item/pickaxe, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/pod/dark, +/area/lavaland/surface/outdoors/virtual_domain) +"RC" = ( +/obj/effect/turf_decal/mining/survival{ + dir = 1 + }, +/turf/closed/wall/mineral/titanium/survival/pod, +/area/lavaland/surface/outdoors/virtual_domain) +"RV" = ( +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"So" = ( +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"Sw" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"SI" = ( +/obj/effect/turf_decal/mining, +/turf/closed/wall/mineral/titanium/survival/pod, +/area/lavaland/surface/outdoors/virtual_domain) +"SJ" = ( +/obj/structure/stone_tile/slab/cracked, +/turf/open/indestructible/boss, +/area/lavaland/surface/outdoors/virtual_domain) +"SX" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"Ti" = ( +/turf/closed/mineral/random/high_chance/volcanic, +/area/lavaland/surface/outdoors/virtual_domain) +"Tm" = ( +/obj/structure/bed/pod, +/obj/item/bedsheet/black, +/obj/structure/tubes, +/obj/machinery/light/small/broken/directional/east, +/turf/open/floor/pod/dark, +/area/lavaland/surface/outdoors/virtual_domain) +"TC" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"TJ" = ( +/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/virtual_domain) +"Ud" = ( +/obj/machinery/light/small/directional/north, +/obj/effect/baseturf_helper/virtual_domain, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/virtual_domain/powered) +"UD" = ( +/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/virtual_domain) +"UM" = ( +/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/virtual_domain) +"Vc" = ( +/obj/structure/tubes, +/obj/item/crowbar, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/pod/dark, +/area/lavaland/surface/outdoors/virtual_domain) +"VI" = ( +/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/virtual_domain) +"Wa" = ( +/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/virtual_domain) +"Wm" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"WM" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"WR" = ( +/obj/structure/stone_tile/block, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"WS" = ( +/obj/item/gps/computer, +/obj/structure/tubes, +/turf/open/floor/pod/dark, +/area/lavaland/surface/outdoors/virtual_domain) +"Xb" = ( +/obj/structure/marker_beacon/yellow, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"Xn" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"Xo" = ( +/obj/structure/stone_tile/block, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"Xv" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile/cracked, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"XO" = ( +/obj/effect/turf_decal/mining/survival{ + dir = 8 + }, +/turf/closed/wall/mineral/titanium/survival/pod, +/area/lavaland/surface/outdoors/virtual_domain) +"Yu" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/open/indestructible/boss, +/area/lavaland/surface/outdoors/virtual_domain) +"YN" = ( +/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/virtual_domain) +"YV" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"Zc" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/open/indestructible/boss, +/area/lavaland/surface/outdoors/virtual_domain) +"Zh" = ( +/obj/structure/marker_beacon/purple, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/lavaland/surface/outdoors/virtual_domain) +"Zj" = ( +/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/virtual_domain) +"Zq" = ( +/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/virtual_domain) +"Zu" = ( +/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/lavaland/surface/outdoors/virtual_domain) +"ZM" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/virtual_domain) +"ZN" = ( +/obj/structure/table/survival_pod, +/obj/item/knife/combat/survival, +/turf/open/floor/pod/dark, +/area/lavaland/surface/outdoors/virtual_domain) + +(1,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +Ah +"} +(2,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ox +"} +(3,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ib +ib +nu +nu +ib +ib +ib +ib +nu +nu +nu +nu +nu +nu +nu +ib +ib +nu +nu +nu +nu +nu +nu +nu +nu +ib +ib +ib +nu +nu +nu +nu +nu +nu +ib +ib +nu +nu +ib +ox +"} +(4,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ib +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ox +"} +(5,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ox +"} +(6,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +wq +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ox +"} +(7,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ib +nu +nu +nu +nu +nu +nu +nu +nu +fA +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ib +ox +"} +(8,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ib +ib +nu +nu +nu +nu +nu +fA +fA +fA +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +rt +nu +nu +ib +ib +ox +"} +(9,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ib +ib +nu +nu +nu +nu +fA +fA +fA +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ib +ox +"} +(10,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ib +ib +ib +ib +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ib +ox +"} +(11,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ib +ib +ib +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ox +"} +(12,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ib +ib +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +fA +fA +fA +nu +nu +nu +nu +ib +ox +"} +(13,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ib +ib +nu +fG +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +fA +fA +fA +nu +nu +nu +nu +ib +ox +"} +(14,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ib +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +fA +fA +nu +nu +nu +nu +ib +ox +"} +(15,1,1) = {" +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +ib +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ox +"} +(16,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +nu +nu +nu +nu +fA +fA +fA +fA +fA +fA +fA +fA +fA +fA +fA +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ox +"} +(17,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +Ti +Ti +Ti +Ti +GM +nu +nu +nu +nu +fA +fA +fA +fA +fA +fA +fA +fA +fA +fA +fA +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +Io +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +Xb +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ox +"} +(18,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +et +Ti +GM +GM +GM +nu +nu +nu +nu +GM +GM +fA +fA +fA +fA +fA +fA +fA +fA +fA +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ox +"} +(19,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +GM +nu +nu +nu +nu +nu +nu +nu +nu +GM +GM +GM +fA +fA +fA +fA +fA +fA +fA +fA +nu +nu +nu +nu +wq +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ox +"} +(20,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +Ti +nu +nu +nu +nu +nu +nu +nu +nu +GM +GM +fA +fA +fA +fA +fA +fA +fA +fA +fA +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ox +"} +(21,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +Ti +nu +nu +nu +nu +GM +Ti +GM +GM +fA +fA +fA +fA +fA +fA +fA +fA +fA +fA +fA +nu +nu +nu +nu +nu +nu +nu +nu +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +Zh +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ox +"} +(22,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +FV +nu +nu +nu +nu +Ti +Dm +Dm +GM +fA +fA +fA +fA +fA +fA +fA +fA +fA +fA +fA +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ox +"} +(23,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +Ti +GM +GM +GM +Ti +Ti +Dm +Dm +Ti +fA +fA +fA +fA +fA +fA +fA +fA +fA +fA +fA +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ox +"} +(24,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +FV +Ml +Ti +Dm +Dm +Ti +fA +fA +fA +fA +fA +fA +fA +fA +fA +fA +fA +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ib +ox +"} +(25,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +GM +GM +Ti +Dm +Dm +IB +fA +fA +fA +fA +fA +fA +fA +fA +fA +fA +GM +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ib +ox +"} +(26,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +GM +GM +GM +GM +GM +GM +fA +fA +fA +fA +RV +fA +fA +fA +fA +fA +fA +Xn +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +As +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ib +ox +"} +(27,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +Ek +Le +be +be +kT +GM +GM +GM +GM +fA +fA +xm +fA +fA +fA +GM +ZM +fA +fA +fA +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ox +"} +(28,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +dr +KG +mz +KG +KG +jt +GM +GM +GM +GM +fA +fA +fA +fA +fA +fA +fA +fA +fA +fA +nu +HZ +nu +bu +nu +nu +nu +MH +nu +nu +lz +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ib +nu +nu +ib +ox +"} +(29,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +bd +mG +Hw +hU +Mm +lO +et +GM +tk +fA +fA +fA +fA +ak +fA +fA +fA +fA +fA +fA +nu +nu +nu +nu +nu +nu +nu +nu +YV +nu +nu +So +nu +nu +nu +nu +nu +nu +bu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ib +nu +nu +ib +ox +"} +(30,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +Ez +WR +JD +rU +KG +dm +GM +GM +fA +Hi +fA +fA +fA +ll +fA +fA +Wm +fA +fA +YV +qs +MH +nu +nu +nu +ny +ca +oS +nu +nu +Qx +nu +nu +hx +nu +nu +nu +nu +nu +ib +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ib +nu +nu +ib +ox +"} +(31,1,1) = {" +ox +kg +kg +kg +Hu +Zq +wy +Zq +lT +kg +kg +Gn +Gn +KG +Ak +nv +Ot +mG +hw +kg +kg +Wm +fA +fA +fA +fA +fA +fA +fA +fA +fA +ak +nu +nu +qs +nu +nu +TC +nu +YV +nu +ny +nu +oS +nu +nu +nu +SX +nu +nu +nu +zg +BO +BO +BO +BO +BO +og +Ud +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ib +nu +nu +ib +ox +"} +(32,1,1) = {" +ox +kg +kg +Gn +VI +xw +gQ +ka +iR +kg +kg +Gn +Gn +sz +KG +KG +KG +KG +mz +kg +kZ +kZ +sd +kZ +lC +kZ +TJ +UM +kZ +IQ +UM +UM +AY +nu +nI +nu +nu +nu +nu +oS +nu +nu +nu +nu +nu +qs +nu +nu +nu +nu +nu +nu +BO +BO +BO +BO +BO +BO +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ib +nu +nu +ib +ox +"} +(33,1,1) = {" +ox +PO +PO +gk +PO +Zc +IL +Yu +SJ +Yu +Yu +Yu +ob +dL +uK +MP +uK +uK +dL +Jc +Mo +eJ +Mo +hc +yu +eJ +Fg +eJ +YN +tF +Mo +Zj +HQ +qo +Jp +nu +aR +nu +TC +nu +YV +nu +nu +oS +nu +nu +ny +Sw +nu +nu +nu +nu +BO +BO +BO +BO +BO +BO +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +Io +ib +ib +nu +nu +ib +ox +"} +(34,1,1) = {" +ox +kg +kg +Gn +Nl +gh +jw +lT +oo +kg +kg +Gn +Gn +Wa +KG +xd +Ez +mz +HK +kg +ie +Jw +Jw +jk +Jw +jk +dn +Jw +Jw +LH +Ii +Qi +aI +nu +Xo +nu +nu +YV +Sw +nu +nu +nu +sA +nu +Gj +nu +nu +HZ +nu +YV +nu +nu +BO +BO +BO +BO +BO +BO +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ib +nu +nu +ib +ox +"} +(35,1,1) = {" +ox +kg +kg +kg +Hu +Ep +iV +Go +Ip +kg +kg +Gn +Gn +lO +nO +hU +UD +KG +dm +kg +kg +ll +fA +fA +fA +ak +fA +fA +fA +fA +ll +fA +nu +nu +ny +nu +nu +Aj +HZ +nu +ew +nu +nu +bu +nu +nu +nu +nu +nu +Aj +nu +nu +BO +BO +BO +BO +BO +BO +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ib +nu +nu +ib +ox +"} +(36,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +KG +WR +iP +rU +Ez +cf +GM +GM +fA +fA +yZ +vf +ll +fA +fA +fA +ak +fA +fA +oS +ny +qs +YV +qs +nu +nu +nu +nu +nu +nu +Sw +nu +qs +oS +nu +nu +Sw +nu +nu +BO +BO +BO +BO +BO +BO +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ib +nu +nu +ib +ox +"} +(37,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +bd +xd +zW +nv +DP +KG +FV +GM +GM +fA +fA +fA +GM +Px +fA +IG +GM +Hi +fA +fA +nu +nu +nu +nu +TC +nu +ah +nu +nu +nm +nu +nu +nu +nu +nu +nu +sk +nu +nu +zg +BO +BO +BO +BO +BO +Fp +Ud +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +nu +nu +ib +ox +"} +(38,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +bd +KG +KG +KG +lO +Jc +GM +GM +GM +fA +fA +fA +fA +fA +fA +GM +Jt +fA +fA +fA +nu +TC +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ox +"} +(39,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +Ek +KG +lO +MW +pP +GM +GM +GM +GM +fA +fA +fA +fA +fA +fA +fA +xD +fA +fA +fA +oS +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ox +"} +(40,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +IB +nu +nu +nu +nu +GM +RV +fA +fA +fA +fA +fA +fA +fA +fA +fA +fA +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ox +"} +(41,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +GM +nu +nu +Sw +Xv +GM +fA +fA +fA +fA +fA +fA +fA +fA +fA +GM +GM +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ox +"} +(42,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +GM +nu +nu +nu +ny +GM +fA +fA +fA +fA +fA +fA +fA +fA +fA +EC +GM +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +Bo +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ib +ox +"} +(43,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +WM +GM +Px +ny +nu +nu +nu +nu +nu +fA +fA +fA +fA +fA +fA +fA +fA +fA +fA +fA +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ib +ox +"} +(44,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +GM +GM +GM +nu +nu +nu +nu +nu +nu +fA +fA +fA +fA +fA +fA +fA +fA +fA +fA +fA +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ox +"} +(45,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +GM +GM +GM +nu +nu +nu +nu +nu +nu +fA +fA +fA +fA +fA +fA +fA +fA +fA +fA +fA +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ox +"} +(46,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +Ti +GM +GM +nu +nu +nu +nu +nu +nu +fA +fA +ak +fA +fA +fA +fA +fA +fA +fA +fA +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +wq +nu +nu +nu +nu +nu +nu +nu +nu +nu +fA +ib +ox +"} +(47,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +Ti +GM +nu +nu +nu +nu +nu +nu +fA +fA +fA +xD +fA +fA +fA +fA +fA +fA +fA +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ib +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +fA +fA +ib +ox +"} +(48,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +Ti +GM +nu +nu +nu +nu +nu +nu +fA +fA +fA +fA +fA +fA +fA +fA +fA +fA +fA +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ib +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +fA +fA +ib +ox +"} +(49,1,1) = {" +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +Ti +GM +nu +nu +nu +nu +nu +nu +fA +fA +fA +GM +fA +fA +fA +fA +fA +fA +fA +nu +nu +nu +nu +nu +nu +nu +nu +nu +Fq +nu +ib +ib +ib +ib +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +fA +ib +ox +"} +(50,1,1) = {" +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +kg +ib +ib +nu +nu +nu +nu +nu +nu +nu +nu +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +rt +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ox +"} +(51,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ib +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +dQ +dQ +XO +dQ +dQ +GM +nu +nu +nu +ib +ox +"} +(52,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +Fq +nu +nu +nu +nu +nu +nu +nu +nu +nu +dQ +GH +jN +ZN +zo +GM +nu +nu +nu +ib +ox +"} +(53,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +RC +Zu +QD +bt +qW +CX +nu +nu +nu +ib +ox +"} +(54,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ib +nu +nu +nu +nu +nu +nu +nu +fA +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +dQ +WS +Tm +Vc +SI +Lx +nu +nu +nu +ib +ox +"} +(55,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ib +nu +nu +nu +nu +fA +fA +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +dQ +dQ +Pv +dQ +dQ +Lx +nu +nu +nu +ib +ox +"} +(56,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ib +ib +nu +nu +nu +fA +fA +fA +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +GM +GM +GM +GM +dx +gK +nu +nu +nu +ib +ox +"} +(57,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ib +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +Io +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ox +"} +(58,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ib +ox +"} +(59,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +fA +fA +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ib +ox +"} +(60,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +fA +fA +fA +fA +nu +nu +nu +nu +nu +nu +Xb +nu +nu +nu +ib +ox +"} +(61,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +nu +nu +ib +ox +"} +(62,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ib +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +ib +ox +"} +(63,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ib +ib +nu +nu +nu +ib +ib +ib +nu +nu +nu +nu +nu +ib +ib +nu +nu +nu +nu +ib +ib +ib +nu +nu +nu +nu +nu +nu +nu +nu +ib +ib +nu +nu +nu +nu +ib +ib +ox +"} +(64,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ib +ox +"} +(65,1,1) = {" +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +cp +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +ox +"} diff --git a/_maps/virtual_domains/pipedream.dmm b/_maps/virtual_domains/pipedream.dmm new file mode 100644 index 0000000000000..44bd845477a18 --- /dev/null +++ b/_maps/virtual_domains/pipedream.dmm @@ -0,0 +1,3713 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"af" = ( +/obj/structure/chair/plastic{ + dir = 4 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"aw" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"ax" = ( +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/structure/frame/computer{ + anchored = 1; + dir = 4 + }, +/obj/item/shard{ + icon_state = "medium" + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"aK" = ( +/turf/open/space/basic, +/area/space) +"aL" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"bq" = ( +/obj/machinery/light/small/red/dim{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"bs" = ( +/turf/open/floor/carpet/orange, +/area/virtual_domain/powered) +"bw" = ( +/obj/structure/disposalpipe/broken{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/closet/crate/preopen, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"bx" = ( +/obj/structure/frame/computer, +/obj/item/shard, +/turf/open/floor/carpet/royalblue{ + icon_state = "carpet_royalblue-12" + }, +/area/virtual_domain/powered) +"bA" = ( +/obj/structure/chair/plastic, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"bG" = ( +/obj/structure/lattice/catwalk{ + name = "industrial lift" + }, +/obj/structure/closet/crate/preopen, +/obj/structure/railing, +/turf/open/chasm, +/area/virtual_domain/powered) +"bS" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/item/folder/yellow, +/obj/item/folder/blue{ + pixel_x = 2; + pixel_y = -2 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"cw" = ( +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"cB" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"cF" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 9 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"dx" = ( +/obj/effect/turf_decal/trimline/yellow/line, +/obj/item/shard, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"dz" = ( +/obj/machinery/light/broken, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/yellow/corner, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 8 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"dA" = ( +/obj/machinery/light/dim{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"dP" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"eg" = ( +/turf/closed/wall, +/area/virtual_domain/powered) +"ei" = ( +/obj/machinery/conveyor/auto{ + dir = 6; + icon_state = "conveyor_map_inverted"; + inverted = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"ev" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/template_noop, +/area/virtual_domain/safehouse) +"eJ" = ( +/obj/structure/disposalpipe/sorting{ + dir = 2 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"eN" = ( +/obj/effect/turf_decal/trimline/yellow/arrow_cw{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/broken{ + dir = 1 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"eY" = ( +/turf/closed/wall/r_wall, +/area/virtual_domain/powered) +"fe" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 8 + }, +/obj/structure/table/reinforced, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"fg" = ( +/turf/open/floor/iron/stairs/left{ + dir = 8 + }, +/area/virtual_domain/powered) +"fj" = ( +/obj/structure/closet/crate/preopen, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"fl" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"fw" = ( +/obj/structure/door_assembly/door_assembly_eng, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"fK" = ( +/obj/structure/chair/stool/bar/directional/west, +/turf/open/floor/iron/cafeteria, +/area/virtual_domain/powered) +"fR" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 5 + }, +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"fZ" = ( +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"gc" = ( +/obj/structure/disposalpipe/broken, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"gj" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"gs" = ( +/obj/machinery/door/airlock/external/glass/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"gN" = ( +/obj/structure/disposalpipe/sorting{ + dir = 8 + }, +/turf/open/floor/catwalk_floor/iron, +/area/virtual_domain/powered) +"gV" = ( +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 8 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"hg" = ( +/obj/effect/turf_decal/caution{ + dir = 1 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"hi" = ( +/turf/open/floor/iron, +/area/virtual_domain/powered) +"hk" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/broken{ + dir = 4 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"ho" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"iw" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"iz" = ( +/obj/structure/broken_flooring/corner, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"iI" = ( +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/corner, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"jv" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 8 + }, +/obj/machinery/light/small/red/dim{ + dir = 8 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"jw" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"jH" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor/iron, +/area/virtual_domain/powered) +"jQ" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/light/small/red/dim{ + dir = 1 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"jS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"jW" = ( +/obj/effect/decal/cleanable/generic, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"kh" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"ki" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/bitrunning/cache_spawn, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"kn" = ( +/obj/machinery/light/small/red/dim{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"kJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/indestructible{ + dir = 4; + id = "factorylockdown" + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"kU" = ( +/turf/open/floor/plating, +/area/virtual_domain/powered) +"lp" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"lt" = ( +/obj/structure/disposalpipe/sorting{ + dir = 8 + }, +/mob/living/basic/hivebot/range, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"lx" = ( +/obj/machinery/door/poddoor/shutters/indestructible{ + dir = 4; + id = "factorylockdown" + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"lB" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 5 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"lC" = ( +/obj/machinery/door/airlock/glass, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"lI" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"lN" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"lW" = ( +/obj/structure/disposalpipe/sorting{ + dir = 8 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"mh" = ( +/obj/structure/broken_flooring/pile{ + dir = 4 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"mu" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"mE" = ( +/obj/machinery/door/airlock/maintenance, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"mY" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/obj/machinery/light/small/red/dim{ + dir = 1 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"nc" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/poster/official/safety_internals/directional/south, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"nz" = ( +/obj/structure/broken_flooring/side/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"nD" = ( +/obj/structure/disposalpipe/trunk/multiz, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"nL" = ( +/obj/effect/turf_decal/tile/dark/half, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"nS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"op" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/dim{ + dir = 1 + }, +/obj/structure/sign/warning/doors/directional/north, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"oN" = ( +/obj/machinery/conveyor/auto, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"oX" = ( +/obj/structure/broken_flooring/corner/directional/north, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"pa" = ( +/obj/machinery/light/small/red/dim{ + dir = 1 + }, +/turf/open/floor/carpet/orange, +/area/virtual_domain/powered) +"pb" = ( +/obj/structure/broken_flooring/corner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"pf" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/damaged_window, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"pi" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"po" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/maint, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"pv" = ( +/obj/structure/broken_flooring/side{ + dir = 4 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"pI" = ( +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/machinery/light/small/red/dim{ + dir = 4 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"pJ" = ( +/obj/structure/broken_flooring/pile{ + dir = 1 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"qc" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/effect/spawner/random/bureaucracy/briefcase, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"qk" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"qK" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/sign/warning/secure_area/directional/north, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"qN" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/effect/mob_spawn/corpse/human/factory, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"qT" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/small/red/dim{ + dir = 1 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"qV" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"qW" = ( +/obj/machinery/light/dim{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"rc" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/effect/landmark/bitrunning/cache_spawn, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"rz" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/obj/machinery/light/small/red/dim, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"rG" = ( +/obj/machinery/light/dim, +/obj/effect/turf_decal/trimline/yellow/line, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"rJ" = ( +/obj/structure/railing, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"rM" = ( +/obj/structure/disposalpipe/broken{ + dir = 1 + }, +/mob/living/basic/hivebot/strong, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"rO" = ( +/turf/closed/mineral, +/area/space) +"sn" = ( +/turf/open/floor/carpet/royalblue{ + icon_state = "carpet_royalblue-38" + }, +/area/virtual_domain/powered) +"sB" = ( +/obj/machinery/light/broken{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"sW" = ( +/obj/effect/decal/cleanable/oil/streak, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"tl" = ( +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "factorylockdown" + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"tr" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"tE" = ( +/obj/structure/disposalpipe/segment, +/mob/living/basic/hivebot/range, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"ud" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/carpet/royalblue{ + icon_state = "carpet_royalblue-110" + }, +/area/virtual_domain/powered) +"uk" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/decal/cleanable/blood/splatter/over_window, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"um" = ( +/obj/machinery/light/dim{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/virtual_domain/powered) +"uv" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/broken_flooring/pile{ + dir = 1 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"uz" = ( +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"uC" = ( +/obj/structure/falsewall, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"uF" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"uP" = ( +/turf/open/floor/carpet/royalblue{ + icon_state = "carpet_royalblue-55" + }, +/area/virtual_domain/powered) +"uU" = ( +/obj/structure/broken_flooring/side, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"vb" = ( +/obj/effect/turf_decal/trimline/yellow/line, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 5 + }, +/obj/machinery/light/broken, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"ve" = ( +/obj/machinery/mass_driver/trash{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"vA" = ( +/obj/structure/closet/crate/maint, +/obj/effect/turf_decal/stripes{ + dir = 9 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"vL" = ( +/obj/effect/decal/cleanable/glass, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"vQ" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"vU" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"wg" = ( +/obj/machinery/light/small/red/dim{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/preopen, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"wh" = ( +/obj/structure/table/wood, +/turf/open/floor/carpet/royalblue{ + icon_state = "carpet_royalblue-207" + }, +/area/virtual_domain/powered) +"wl" = ( +/obj/item/shard, +/turf/open/space/basic, +/area/space) +"wm" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/structure/sign/clock/directional/north, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"wq" = ( +/obj/structure/table/wood, +/obj/machinery/button/door{ + name = "Cargo Bay Lockdown"; + id = "factorylockdown" + }, +/turf/open/floor/carpet/royalblue{ + icon_state = "carpet_royalblue-63" + }, +/area/virtual_domain/powered) +"ws" = ( +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"ww" = ( +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/hivebot, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"wU" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"wW" = ( +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"xa" = ( +/obj/machinery/door/poddoor/shutters/indestructible{ + dir = 8; + id = "factorylockdown" + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"xj" = ( +/obj/structure/railing/corner/end{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"xk" = ( +/obj/machinery/light/dim{ + dir = 4 + }, +/obj/effect/landmark/bitrunning/cache_spawn, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"xl" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"xA" = ( +/obj/effect/decal/cleanable/generic, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"xE" = ( +/obj/effect/turf_decal/trimline/yellow/line, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 9 + }, +/obj/machinery/light/broken, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"xF" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/indestructible/binary, +/area/virtual_domain/powered) +"xM" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/bed/dogbed{ + name = "cat bed" + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"xT" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"yB" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/welded, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"yM" = ( +/turf/closed/indestructible/fakedoor{ + name = "Stairwell Access" + }, +/area/virtual_domain/powered) +"yQ" = ( +/turf/template_noop, +/area/template_noop) +"yX" = ( +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"zp" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/broken, +/turf/open/floor/carpet/orange, +/area/virtual_domain/powered) +"zB" = ( +/obj/structure/closet/crate/bin, +/obj/item/trash/tray, +/obj/effect/spawner/random/trash/garbage, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"zE" = ( +/obj/structure/disposalpipe/broken{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"zO" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/broken, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Av" = ( +/obj/item/stack/rods/two, +/turf/open/space/basic, +/area/space) +"Aw" = ( +/obj/structure/lattice/catwalk{ + name = "industrial lift" + }, +/mob/living/basic/hivebot/rapid, +/turf/open/chasm, +/area/virtual_domain/powered) +"AJ" = ( +/obj/effect/decal/cleanable/generic, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"AP" = ( +/obj/structure/railing, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"AU" = ( +/turf/open/misc/asteroid/airless, +/area/space) +"Bd" = ( +/obj/structure/closet/secure_closet/tac{ + req_access = null + }, +/obj/item/ammo_casing/shotgun/buckshot, +/obj/item/ammo_casing/shotgun/buckshot, +/obj/item/ammo_casing/shotgun/buckshot, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Bh" = ( +/obj/structure/broken_flooring/corner/directional/east, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Bx" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave{ + broken = 1; + desc = "No longer cooks and boils stuff." + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"BA" = ( +/obj/structure/broken_flooring/corner/directional/south, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"BI" = ( +/obj/machinery/door/airlock/command/glass{ + name = "Quartermaster's Office" + }, +/obj/effect/mapping_helpers/airlock/access/any/away/command, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"BN" = ( +/obj/structure/flora/rock/pile/style_random, +/turf/open/misc/asteroid/airless, +/area/space) +"BW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 1 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"BX" = ( +/obj/effect/decal/cleanable/robot_debris/old, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Ci" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Ct" = ( +/obj/machinery/conveyor/auto{ + dir = 6 + }, +/obj/machinery/light/broken{ + dir = 1 + }, +/obj/structure/sign/warning/vacuum/directional/north, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Cv" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/carpet/royalblue{ + icon_state = "carpet_royalblue-157" + }, +/area/virtual_domain/powered) +"CA" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/broken_flooring/side{ + dir = 4 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"CQ" = ( +/obj/effect/spawner/random/trash/botanical_waste, +/obj/item/trash/chips, +/obj/structure/closet/secure_closet/freezer/empty/open, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"CR" = ( +/obj/structure/flora/rock/pile/style_random, +/turf/open/misc/asteroid/airless, +/area/virtual_domain/powered) +"CX" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Dr" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/light/dim{ + dir = 8 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"DA" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor/iron, +/area/virtual_domain/powered) +"DE" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"DP" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/food_or_drink/snack, +/turf/open/floor/iron/cafeteria, +/area/virtual_domain/powered) +"Ex" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/carpet/royalblue{ + icon_state = "carpet_royalblue-137" + }, +/area/virtual_domain/powered) +"Ez" = ( +/obj/structure/flora/rock/style_random, +/turf/open/misc/asteroid/airless, +/area/space) +"EI" = ( +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"EJ" = ( +/obj/machinery/recycler/deathtrap{ + dir = 8 + }, +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Fa" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/closet/crate/maint, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Ff" = ( +/obj/structure/disposalpipe/trunk/multiz{ + dir = 4 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Fo" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/cafeteria, +/area/virtual_domain/powered) +"Fr" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/closet/crate/preopen, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Fw" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/rock/pile/style_random, +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/grass, +/area/virtual_domain/powered) +"FK" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"FO" = ( +/turf/open/misc/asteroid/airless, +/area/virtual_domain/powered) +"FP" = ( +/turf/open/floor/carpet/royalblue{ + icon_state = "carpet_royalblue-110" + }, +/area/virtual_domain/powered) +"Gb" = ( +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Ge" = ( +/turf/open/floor/carpet/royalblue{ + icon_state = "carpet_royalblue-21" + }, +/area/virtual_domain/powered) +"Gh" = ( +/obj/machinery/door/airlock/maintenance, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Gi" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/yellow/corner, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Gs" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/obj/machinery/light/broken{ + dir = 1 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Gy" = ( +/obj/machinery/conveyor/auto{ + dir = 9; + inverted = 1; + icon_state = "conveyor_map_inverted" + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"GI" = ( +/obj/effect/turf_decal/trimline/yellow/arrow_ccw, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"GV" = ( +/obj/machinery/light/small/red/dim{ + dir = 8 + }, +/obj/effect/turf_decal/stripes{ + dir = 9 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Hn" = ( +/turf/open/floor/iron/cafeteria, +/area/virtual_domain/powered) +"HI" = ( +/obj/structure/broken_flooring/pile/directional/north, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Ib" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 1 + }, +/turf/open/floor/carpet/orange, +/area/virtual_domain/powered) +"Ip" = ( +/obj/machinery/door/airlock/engineering/glass, +/obj/effect/mapping_helpers/airlock/access/any/away/supply, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Is" = ( +/obj/machinery/door/airlock/engineering/glass, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"IF" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"IK" = ( +/obj/effect/turf_decal/trimline/yellow/line, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"IZ" = ( +/obj/structure/lattice/catwalk{ + name = "industrial lift" + }, +/obj/structure/closet/crate, +/turf/open/chasm, +/area/virtual_domain/powered) +"Jl" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Jm" = ( +/obj/structure/broken_flooring/pile/directional/north, +/obj/machinery/light/dim, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Jn" = ( +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/railing/corner/end/flip{ + dir = 8 + }, +/obj/structure/sign/warning/doors/directional/east, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Jq" = ( +/obj/structure/broken_flooring/pile{ + dir = 1 + }, +/obj/structure/sign/poster/contraband/random/directional/west, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"JE" = ( +/obj/machinery/light/small/red/dim{ + dir = 1 + }, +/obj/structure/sign/warning/chem_diamond/directional/west, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"JR" = ( +/turf/template_noop, +/area/virtual_domain/safehouse) +"JT" = ( +/obj/structure/lattice/catwalk{ + name = "industrial lift" + }, +/obj/effect/spawner/random/trash/grime, +/turf/open/chasm, +/area/virtual_domain/powered) +"Kb" = ( +/obj/effect/mob_spawn/corpse/human/factory/guard, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Kt" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"KO" = ( +/obj/structure/broken_flooring/side/directional/north, +/obj/machinery/light/small/red/dim, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"KX" = ( +/obj/structure/lattice/catwalk{ + name = "industrial lift" + }, +/turf/open/chasm, +/area/virtual_domain/powered) +"Ln" = ( +/obj/structure/disposalpipe/broken{ + dir = 4 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Lp" = ( +/obj/effect/turf_decal/trimline/yellow/line, +/obj/machinery/light/broken, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"LN" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 10 + }, +/obj/machinery/light/dim{ + dir = 4 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"LU" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Mc" = ( +/obj/effect/turf_decal/trimline/yellow/warning, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Mh" = ( +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Mi" = ( +/obj/effect/mob_spawn/corpse/human/factory, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Mj" = ( +/turf/closed/mineral, +/area/virtual_domain/powered) +"Mu" = ( +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Mx" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 1 + }, +/obj/structure/filingcabinet, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"My" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/machinery/light/small/red/dim{ + dir = 8 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"MI" = ( +/turf/open/floor/carpet/royalblue{ + icon_state = "carpet_royalblue-74" + }, +/area/virtual_domain/powered) +"MN" = ( +/obj/effect/turf_decal/tile/dark, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Nc" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Nu" = ( +/obj/effect/turf_decal/trimline/yellow/line, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"NW" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/hivebot/strong, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Ok" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"On" = ( +/obj/structure/broken_flooring/side{ + dir = 4 + }, +/obj/machinery/light/broken{ + dir = 4 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"OJ" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"OL" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"OQ" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/sign/poster/ripped/directional/west, +/turf/open/floor/carpet/orange, +/area/virtual_domain/powered) +"OR" = ( +/obj/machinery/light/broken, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Po" = ( +/obj/machinery/light/small/red/dim{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/broken_flooring/corner, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Pr" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 8 + }, +/obj/structure/sign/poster/official/random/directional/east, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"PH" = ( +/obj/structure/railing/corner/end/flip{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Qd" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 6 + }, +/obj/machinery/light/dim{ + dir = 8 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Qh" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/light/broken{ + dir = 8 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Qj" = ( +/obj/machinery/light/dim{ + dir = 8 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Qo" = ( +/obj/effect/landmark/bitrunning/safehouse_spawn, +/turf/template_noop, +/area/virtual_domain/safehouse) +"Qr" = ( +/turf/closed/indestructible/fakedoor/maintenance{ + name = "maintenance access" + }, +/area/virtual_domain/powered) +"Qv" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 9 + }, +/obj/machinery/light/small/red/dim{ + dir = 4 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Qy" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/structure/disposaloutlet{ + dir = 1 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"QI" = ( +/obj/structure/sign/calendar/directional/north, +/obj/effect/spawner/random/trash/garbage, +/turf/open/floor/iron/cafeteria, +/area/virtual_domain/powered) +"QK" = ( +/obj/structure/table, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"QN" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"QP" = ( +/obj/structure/sign/poster/contraband/random/directional/east, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"QW" = ( +/obj/machinery/conveyor/auto{ + dir = 5 + }, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Ru" = ( +/obj/machinery/door/airlock/external/glass/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Ry" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"RJ" = ( +/turf/closed/indestructible/binary, +/area/virtual_domain/powered) +"RK" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"RZ" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Sg" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Sl" = ( +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 8 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"SC" = ( +/mob/living/basic/hivebot/strong, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"SR" = ( +/obj/effect/turf_decal/trimline/yellow/line, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"SS" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/mineral, +/area/virtual_domain/powered) +"SU" = ( +/obj/effect/spawner/structure/window, +/obj/item/stack/rods/two, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"SZ" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/food_or_drink/booze, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Te" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 5 + }, +/obj/effect/mob_spawn/corpse/human/factory/qm, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Tn" = ( +/obj/structure/broken_flooring/corner{ + dir = 4 + }, +/mob/living/basic/hivebot, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Tp" = ( +/obj/machinery/door/poddoor/shutters/indestructible{ + dir = 4; + id = "factorylockdown" + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Tt" = ( +/obj/machinery/conveyor/auto{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"TH" = ( +/obj/structure/broken_flooring/corner/directional/south, +/obj/item/ammo_casing/shotgun/buckshot/spent, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Ue" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/small/red/dim{ + dir = 8 + }, +/obj/structure/sign/poster/official/cleanliness/directional/west, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Uw" = ( +/obj/machinery/light/dim{ + dir = 4 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"UO" = ( +/obj/structure/broken_flooring/side/directional/north, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"UV" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 6 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"UX" = ( +/obj/effect/turf_decal/trimline/yellow/line, +/obj/machinery/light/small/red/dim, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"UY" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Vb" = ( +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/broken, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Vg" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/light/small/red/dim, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Vh" = ( +/obj/structure/table/reinforced, +/turf/open/floor/iron/cafeteria, +/area/virtual_domain/powered) +"Vy" = ( +/obj/structure/broken_flooring/singular{ + dir = 4 + }, +/obj/effect/mob_spawn/corpse/human/factory/guard, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"VA" = ( +/obj/machinery/light/small/red/dim{ + dir = 1 + }, +/obj/structure/table, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"VJ" = ( +/obj/structure/broken_flooring/corner{ + dir = 1 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"VL" = ( +/obj/structure/sign/warning/secure_area/directional/south, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"VO" = ( +/obj/machinery/light/broken{ + dir = 1 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Wd" = ( +/obj/structure/lattice/catwalk{ + name = "industrial lift" + }, +/obj/structure/railing, +/turf/open/chasm, +/area/virtual_domain/powered) +"Wp" = ( +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 1 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"WT" = ( +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"WV" = ( +/obj/machinery/conveyor/auto{ + dir = 10; + inverted = 1; + icon_state = "conveyor_map_inverted" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Xb" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/virtual_domain/powered) +"Xc" = ( +/obj/effect/turf_decal/trimline/yellow/line, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Xm" = ( +/obj/item/gun/ballistic/shotgun/lethal, +/obj/machinery/light/broken{ + dir = 1 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Xo" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Xw" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 10 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"XL" = ( +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 4 + }, +/obj/structure/sign/warning/vacuum/external/directional/south, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"XN" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"XO" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"XP" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/railing/corner/end{ + dir = 4 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"XQ" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/light/dim{ + dir = 4 + }, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"XR" = ( +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Yc" = ( +/obj/item/gun/ballistic/revolver, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Yl" = ( +/obj/structure/broken_flooring/corner/directional/west, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Ym" = ( +/mob/living/simple_animal/pet/cat/space, +/obj/structure/bed/dogbed{ + name = "cat bed" + }, +/obj/item/toy/plush/moth{ + pixel_x = 3; + pixel_y = 4 + }, +/obj/machinery/light/small/dim/directional/south, +/obj/structure/sign/poster/official/moth_hardhat/directional/west, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Yt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Yz" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "factorylockdown" + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"YF" = ( +/obj/machinery/light/small/red/dim, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"YL" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"YP" = ( +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 1 + }, +/obj/machinery/light/dim, +/turf/open/floor/iron, +/area/virtual_domain/powered) +"Zb" = ( +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"Zg" = ( +/turf/open/floor/carpet/royalblue{ + icon_state = "carpet_royalblue-157" + }, +/area/virtual_domain/powered) +"Zy" = ( +/obj/structure/table, +/obj/item/flashlight/lantern, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"ZI" = ( +/turf/open/floor/carpet/royalblue{ + icon_state = "carpet_royalblue-203" + }, +/area/virtual_domain/powered) +"ZP" = ( +/obj/structure/railing, +/turf/open/floor/iron/stairs/right{ + dir = 8 + }, +/area/virtual_domain/powered) + +(1,1,1) = {" +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +"} +(2,1,1) = {" +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +RJ +Mj +Mj +eg +eg +SS +eg +eg +eg +Xb +Mj +Mj +RJ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +"} +(3,1,1) = {" +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +RJ +Mj +Bx +SZ +Ue +CQ +zB +eg +OQ +bs +Ib +Mj +RJ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +yQ +yQ +"} +(4,1,1) = {" +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +eg +ho +ho +qN +ho +zO +eg +pa +bs +zp +eY +RJ +RJ +Mj +RJ +RJ +rO +rO +RJ +RJ +xF +"} +(5,1,1) = {" +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +RJ +eg +eg +eg +eg +eg +eg +eg +RJ +eg +um +DP +Vh +Vh +Hn +tr +fg +ZP +Fw +eY +Mj +Mj +Mj +AU +AU +AU +rO +rO +rO +RJ +"} +(6,1,1) = {" +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +RJ +eg +vA +Dr +bw +Jq +gc +eg +RJ +eg +Hn +fK +fK +fK +Hn +lC +hi +FK +eY +eY +Mj +Ez +AU +aK +aK +AU +AU +BN +rO +RJ +"} +(7,1,1) = {" +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +RJ +eg +jQ +lt +kU +vU +lN +eg +RJ +eg +QI +Fo +Hn +Hn +Hn +tr +hi +Ln +eY +Mj +Mj +AU +AU +BN +aK +aK +aK +AU +rO +RJ +"} +(8,1,1) = {" +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +RJ +eg +uU +gj +kU +Tn +OR +eg +RJ +eg +eg +uk +pf +pf +eg +eg +qV +Vb +eY +aK +aK +aK +aK +aK +aK +aK +aK +aK +aK +RJ +"} +(9,1,1) = {" +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +RJ +eg +ki +gj +kU +kU +kU +eg +RJ +eg +kU +kU +nD +nS +kU +Qj +FK +nc +eY +aK +aK +aK +aK +aK +aK +AU +aK +aK +aK +RJ +"} +(10,1,1) = {" +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +RJ +RJ +RJ +RJ +RJ +RJ +eg +eg +kJ +lx +lx +lp +eg +RJ +eg +mu +AJ +mu +eJ +MN +BW +hi +Sg +eY +aK +aK +aK +aK +aK +aK +aK +aK +aK +aK +RJ +"} +(11,1,1) = {" +yQ +yQ +yQ +yQ +yQ +yQ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +eg +eg +eg +Qr +eg +eg +JE +gj +pi +kU +VL +eg +eg +eg +VO +kU +Fr +jw +qk +XR +vQ +Vg +eY +aK +aK +aK +JR +JR +JR +JR +JR +Qo +aK +RJ +"} +(12,1,1) = {" +yQ +yQ +yQ +yQ +RJ +RJ +RJ +eg +eg +eg +eg +eg +eg +yM +eg +GV +WT +xj +qk +Qh +XP +lW +ww +EI +Kt +Qh +mu +Yz +xl +HI +kU +Bh +Kb +kU +hi +CX +eY +eY +aK +aK +JR +JR +JR +JR +JR +JR +aK +RJ +"} +(13,1,1) = {" +yQ +yQ +yQ +yQ +RJ +RJ +RJ +eg +VA +bA +eg +kU +sB +WT +mh +kU +pv +AP +IZ +KX +Wd +uv +DE +Mi +gj +xT +hi +tl +IF +kU +hi +Yc +kU +kU +vU +lB +XL +eg +tr +eY +JR +JR +JR +JR +JR +JR +aK +RJ +"} +(14,1,1) = {" +yQ +yQ +yQ +yQ +RJ +RJ +kU +kU +Zy +kU +Gh +Kt +mu +mu +mu +uF +xl +AP +KX +JT +bG +qk +DA +DA +zE +gc +mu +Yz +lW +pi +kU +kU +nL +BW +hi +hg +Wp +Ru +hi +gs +JR +JR +JR +JR +JR +JR +aK +RJ +"} +(15,1,1) = {" +yQ +RJ +RJ +RJ +RJ +RJ +RJ +kU +QP +kU +eg +qT +Gb +Uw +iz +jS +gj +rJ +KX +Aw +Wd +Ff +lN +XO +gj +DE +SC +tl +qk +mu +mu +xl +kU +oX +hi +cF +cw +eY +tr +eY +JR +JR +JR +JR +JR +JR +aK +RJ +"} +(16,1,1) = {" +yQ +RJ +Mj +Mj +Mj +Mj +RJ +eg +eg +eg +eg +Xb +yB +eg +eg +kU +qk +PH +dA +Po +Jn +aw +OJ +CA +QN +kU +Uw +tl +kU +Mc +kU +kh +fj +kU +FK +CX +eY +eY +aK +aK +JR +JR +JR +JR +JR +JR +aK +RJ +"} +(17,1,1) = {" +yQ +RJ +Mj +BN +AU +Mj +Mj +Mj +eg +QW +My +Qy +kU +po +eg +tr +Is +tr +eg +eg +eg +kU +pi +kU +lI +YF +eg +eg +op +kU +BA +iw +kU +kU +FK +rz +eY +aK +aK +aK +JR +JR +JR +JR +JR +ev +aK +RJ +"} +(18,1,1) = {" +yQ +RJ +aK +AU +AU +AU +aK +aK +eg +Ct +oN +Gy +jW +xT +eg +Tp +Tp +Tp +eg +Ym +eg +eg +xa +xa +xa +eg +eg +eg +kU +Zb +kU +Yt +kU +UO +hi +CX +eY +aK +aK +aK +aK +aK +aK +aK +aK +aK +aK +RJ +"} +(19,1,1) = {" +RJ +RJ +aK +aK +aK +aK +wl +aK +yX +ve +Tt +Xo +DE +oX +eg +Sl +gV +dz +eg +uC +eg +qK +mh +kU +kU +Qj +VJ +eg +kU +kU +kU +gj +kU +kU +hi +Ok +eY +aK +aK +aK +aK +aK +aK +aK +aK +aK +aK +RJ +"} +(20,1,1) = {" +RJ +aK +aK +aK +aK +aK +aK +aK +tr +uz +Mh +EJ +kU +kU +mE +Mu +Yl +pJ +eg +kn +pb +kU +kU +kU +Fa +kU +YF +eg +eg +pf +tr +XN +eg +eg +Ci +YP +eY +eY +aK +aK +aK +aK +aK +aK +aK +aK +aK +RJ +"} +(21,1,1) = {" +RJ +aK +aK +aK +aK +aK +Av +CR +tr +kU +ei +WV +pi +Jm +eg +eN +gN +GI +eg +rc +mu +rM +gc +vQ +tE +mu +mu +eg +Mx +qc +ax +bS +fe +pf +hi +hi +af +eY +aK +aK +aK +aK +aK +aK +aK +aK +aK +RJ +"} +(22,1,1) = {" +RJ +aK +aK +aK +aK +aK +aK +FO +eg +eg +wg +uU +lN +uz +eg +mY +jH +rG +eg +xT +Uw +kU +kU +On +pi +kU +Mj +eg +wm +xA +fZ +OL +aL +Ip +hi +lN +QK +eY +aK +aK +aK +aK +BN +aK +aK +aK +aK +RJ +"} +(23,1,1) = {" +RJ +aK +aK +aK +aK +aK +AU +FO +Mj +eg +eg +Mj +Mj +eY +eY +UO +jH +Nu +eg +eg +eg +eg +eg +Mj +Mj +Mj +Mj +eg +RZ +vQ +wW +wU +dP +tr +hi +hi +Nc +eY +aK +BN +AU +aK +aK +aK +aK +aK +aK +RJ +"} +(24,1,1) = {" +RJ +RJ +aK +aK +aK +AU +Ez +Mj +Mj +RJ +Mj +Mj +Vy +hi +eY +CX +jH +Nu +eg +Gi +Qd +jv +fR +cB +Mj +RJ +RJ +eg +Ry +hk +pI +XQ +YL +eg +bq +hi +Mj +eY +Mj +Mj +AU +AU +aK +aK +aK +aK +rO +RJ +"} +(25,1,1) = {" +yQ +RJ +aK +AU +BN +AU +Mj +Mj +RJ +RJ +eY +Xm +TH +fw +eY +qW +hi +dx +pf +UV +sn +uP +Ge +vb +eg +RJ +RJ +eg +Mj +Mj +eg +eg +eg +eg +eg +Mj +Mj +RJ +RJ +Mj +Mj +Mj +RJ +RJ +Mj +Mj +Mj +RJ +"} +(26,1,1) = {" +yQ +RJ +RJ +RJ +RJ +rO +Mj +RJ +RJ +RJ +eY +Bd +vL +hi +vU +sW +hi +SR +SU +CX +FP +wh +Zg +Nu +eg +RJ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +RJ +"} +(27,1,1) = {" +yQ +yQ +yQ +yQ +RJ +RJ +RJ +RJ +yQ +RJ +eY +Jl +RK +BX +eY +CX +RK +iI +BI +ws +ud +bx +Cv +Nu +eg +RJ +RJ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +"} +(28,1,1) = {" +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +RJ +eY +NW +UY +KO +eY +fl +jH +Nu +uk +CX +FP +wq +Zg +Nu +eg +RJ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +"} +(29,1,1) = {" +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +RJ +eY +xk +Te +xT +eY +CX +jH +Nu +pf +Xw +MI +ZI +Ex +xE +eg +RJ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +"} +(30,1,1) = {" +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +RJ +eY +eY +eY +eY +eY +CX +jH +Xc +eg +Pr +LN +xM +Qv +LU +Mj +RJ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +"} +(31,1,1) = {" +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +RJ +RJ +RJ +RJ +RJ +eg +Gs +jH +UX +eg +eg +eg +eg +Mj +Mj +Mj +RJ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +"} +(32,1,1) = {" +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +RJ +eg +Ok +nz +IK +eg +RJ +RJ +RJ +RJ +RJ +RJ +RJ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +"} +(33,1,1) = {" +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +RJ +Mj +CX +hi +Nu +RJ +RJ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +"} +(34,1,1) = {" +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +RJ +Mj +CX +RJ +Lp +eg +RJ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +"} +(35,1,1) = {" +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +RJ +RJ +fl +RJ +RJ +RJ +RJ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +"} +(36,1,1) = {" +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +RJ +RJ +RJ +RJ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +yQ +"} diff --git a/_maps/virtual_domains/pirates.dmm b/_maps/virtual_domains/pirates.dmm new file mode 100644 index 0000000000000..9c970f78c371a --- /dev/null +++ b/_maps/virtual_domains/pirates.dmm @@ -0,0 +1,2601 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ag" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/garbage, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"by" = ( +/obj/effect/turf_decal/weather/sand{ + dir = 5 + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"bz" = ( +/obj/structure/flora/bush/grassy{ + pixel_y = 8 + }, +/obj/structure/flora/bush/lavendergrass{ + pixel_y = -10 + }, +/turf/open/misc/grass, +/area/virtual_domain/powered) +"bP" = ( +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/misc/grass, +/area/virtual_domain/powered) +"cl" = ( +/obj/structure/flora/rock/style_3, +/turf/open/water/beach, +/area/virtual_domain/powered) +"ct" = ( +/obj/structure/closet/cabinet, +/obj/item/clothing/head/costume/pirate/armored, +/obj/item/clothing/suit/costume/pirate/captain/armored, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/parquet, +/area/virtual_domain/powered) +"cx" = ( +/turf/closed/indestructible/binary, +/area/virtual_domain/powered) +"cJ" = ( +/obj/item/stack/cannonball/shellball{ + pixel_x = 13; + pixel_y = 11 + }, +/obj/item/stack/cannonball{ + pixel_x = 9; + pixel_y = 9 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"cQ" = ( +/obj/structure/flora/grass/jungle/b{ + pixel_x = -15; + pixel_y = 9 + }, +/obj/structure/flora/rock/pile/jungle/large/style_2{ + pixel_x = -3; + pixel_y = -1 + }, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/powered) +"dp" = ( +/turf/closed/wall/mineral/wood/nonmetal, +/area/virtual_domain/powered) +"dA" = ( +/obj/structure/bonfire/prelit, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"dQ" = ( +/obj/structure/flora/rock/style_4, +/turf/open/water/beach, +/area/virtual_domain/powered) +"eb" = ( +/obj/structure/flora/bush/sparsegrass, +/turf/open/misc/grass, +/area/virtual_domain/powered) +"eD" = ( +/obj/structure/flora/coconuts{ + pixel_x = 9; + pixel_y = -14 + }, +/obj/structure/flora/tree/palm/style_2, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"eQ" = ( +/turf/open/floor/carpet/blue, +/area/virtual_domain/powered) +"eW" = ( +/obj/effect/turf_decal/weather/sand{ + dir = 6 + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"fx" = ( +/obj/structure/fluff/beach_umbrella{ + pixel_x = -7; + pixel_y = -10 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"gk" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/landmark/bitrunning/cache_spawn, +/turf/open/floor/carpet/blue, +/area/virtual_domain/powered) +"gw" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/powered) +"ht" = ( +/obj/structure/bookcase/random/fiction, +/turf/open/floor/wood/parquet, +/area/virtual_domain/powered) +"hH" = ( +/obj/item/clothing/suit/armor/militia{ + pixel_x = -5; + pixel_y = 12 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/clothing/suit/armor/militia{ + pixel_x = -5; + pixel_y = 6 + }, +/obj/item/clothing/suit/armor/militia{ + pixel_x = -5; + pixel_y = -3 + }, +/obj/item/clothing/head/costume/fancy{ + pixel_x = 6; + pixel_y = 12 + }, +/obj/item/clothing/head/costume/fancy{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/clothing/head/hats/coordinator{ + pixel_x = 8; + pixel_y = -5 + }, +/obj/structure/closet/cabinet, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"hM" = ( +/obj/structure/closet/crate/goldcrate, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/powered) +"hW" = ( +/obj/structure/chair/comfy/carp{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/carpet/blue, +/area/virtual_domain/powered) +"iM" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/mob/living/simple_animal/hostile/pirate/ranged/space, +/turf/open/floor/carpet/blue, +/area/virtual_domain/powered) +"iO" = ( +/obj/effect/turf_decal/weather/sand{ + dir = 4 + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"jl" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/item/flashlight/flare/torch{ + pixel_y = 10; + pixel_x = 7 + }, +/obj/item/reagent_containers/cup/bucket/wooden{ + pixel_y = -16; + pixel_x = 12 + }, +/obj/machinery/recharger{ + pixel_y = 6; + pixel_x = -5 + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"jz" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/powered) +"jB" = ( +/obj/effect/turf_decal/weather/sand{ + dir = 4 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/jukebox, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/powered) +"jC" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/item/reagent_containers/cup/glass/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/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_x = -7; + pixel_y = 5 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_x = 3; + pixel_y = 7 + }, +/turf/open/floor/carpet/blue, +/area/virtual_domain/powered) +"jQ" = ( +/obj/item/gun/energy/laser/hellgun{ + pixel_y = 10 + }, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/powered) +"kg" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"kl" = ( +/obj/structure/cannon, +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/ash/large{ + pixel_y = -5; + pixel_x = 8 + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"lC" = ( +/obj/item/stack/cannonball{ + pixel_x = 7; + pixel_y = 8 + }, +/obj/item/stack/cannonball{ + pixel_x = 11; + pixel_y = -4 + }, +/obj/effect/turf_decal/weather/sand{ + dir = 1 + }, +/obj/effect/decal/cleanable/oil/streak, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"me" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"mw" = ( +/obj/structure/flora/grass/jungle/b/style_random{ + pixel_x = -13; + pixel_y = 18 + }, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/powered) +"mP" = ( +/obj/structure/flora/bush/fullgrass, +/turf/open/misc/grass, +/area/virtual_domain/powered) +"nz" = ( +/obj/effect/mob_spawn/corpse/human/pirate, +/turf/open/misc/beach/coast{ + dir = 8 + }, +/area/virtual_domain/powered) +"nQ" = ( +/obj/machinery/loot_locator, +/turf/open/floor/carpet/blue, +/area/virtual_domain/powered) +"nS" = ( +/obj/structure/flora/rock/pile/jungle/large, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/powered) +"nX" = ( +/obj/effect/decal/cleanable/dirt/dust, +/mob/living/simple_animal/hostile/pirate/melee/space, +/turf/open/floor/wood/parquet, +/area/virtual_domain/powered) +"oo" = ( +/obj/machinery/smartfridge/drying_rack, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"oU" = ( +/turf/open/misc/beach/coast{ + dir = 10 + }, +/area/virtual_domain/powered) +"pq" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"px" = ( +/obj/structure/headpike/bone{ + pixel_y = 24 + }, +/turf/open/misc/beach/coast, +/area/virtual_domain/powered) +"pP" = ( +/turf/open/misc/beach/coast, +/area/virtual_domain/powered) +"pU" = ( +/obj/effect/mob_spawn/corpse/human/pirate, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/powered) +"qj" = ( +/obj/structure/barricade/wooden, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"qm" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/melee/sabre{ + pixel_y = 12; + pixel_x = -10 + }, +/obj/item/gun/energy/laser/retro, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"qx" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/dirt/dust, +/mob/living/simple_animal/hostile/pirate/ranged, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"qN" = ( +/obj/structure/flora/bush/sunny/style_3{ + pixel_y = 22 + }, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/powered) +"qX" = ( +/obj/effect/turf_decal/weather/sand{ + dir = 9 + }, +/obj/structure/fermenting_barrel{ + pixel_x = 6; + pixel_y = 11 + }, +/obj/effect/mob_spawn/ghost_role/human/pirate/skeleton, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/powered) +"sn" = ( +/obj/structure/table/wood, +/obj/item/book/manual/wiki/ordnance, +/turf/open/floor/carpet/blue, +/area/virtual_domain/powered) +"so" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/carpet/blue, +/area/virtual_domain/powered) +"th" = ( +/obj/effect/turf_decal/weather/sand, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"tk" = ( +/obj/structure/flora/bush/flowers_pp, +/turf/open/misc/grass, +/area/virtual_domain/powered) +"to" = ( +/mob/living/simple_animal/hostile/pirate/melee, +/turf/open/misc/grass, +/area/virtual_domain/powered) +"ub" = ( +/turf/template_noop, +/area/virtual_domain/safehouse) +"uw" = ( +/obj/structure/barricade/sandbags, +/obj/effect/turf_decal/weather/sand{ + dir = 4 + }, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/powered) +"uM" = ( +/obj/structure/flora/bush/stalky{ + pixel_y = 13; + pixel_x = -8 + }, +/turf/open/water/beach, +/area/virtual_domain/powered) +"uT" = ( +/obj/structure/closet/crate/grave, +/obj/structure/flora/grass/jungle/b, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/powered) +"wb" = ( +/obj/structure/flora/rock, +/turf/open/water/beach, +/area/virtual_domain/powered) +"we" = ( +/obj/effect/mine/explosive/light, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"xc" = ( +/turf/open/misc/beach/coast{ + dir = 4 + }, +/area/virtual_domain/powered) +"xg" = ( +/turf/template_noop, +/area/template_noop) +"xm" = ( +/obj/structure/barricade/wooden/crude, +/turf/closed/wall/mineral/wood/nonmetal, +/area/virtual_domain/powered) +"xB" = ( +/obj/structure/fermenting_barrel/gunpowder{ + pixel_x = -4; + pixel_y = 17 + }, +/obj/structure/fermenting_barrel/gunpowder{ + pixel_x = 4 + }, +/obj/item/stack/cannonball/four{ + pixel_x = -9; + pixel_y = -10 + }, +/obj/item/stack/cannonball{ + pixel_x = 3; + pixel_y = 8 + }, +/obj/item/reagent_containers/cup/bucket/wooden{ + pixel_y = -10 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"xC" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/effect/turf_decal/weather/dirt, +/turf/open/water/beach, +/area/virtual_domain/powered) +"xI" = ( +/obj/structure/flora/rock/pile/style_2, +/turf/open/water/beach, +/area/virtual_domain/powered) +"yc" = ( +/obj/effect/turf_decal/weather/dirt, +/turf/open/water/beach, +/area/virtual_domain/powered) +"ye" = ( +/turf/open/misc/dirt/jungle, +/area/virtual_domain/powered) +"yi" = ( +/mob/living/simple_animal/hostile/pirate/melee, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"yq" = ( +/obj/structure/barricade/sandbags, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"yw" = ( +/obj/effect/mapping_helpers/burnt_floor, +/mob/living/simple_animal/hostile/pirate/ranged, +/obj/structure/chair/wood, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/powered) +"yA" = ( +/obj/item/bedsheet/rainbow/double, +/obj/structure/bed/double, +/turf/open/floor/carpet/blue, +/area/virtual_domain/powered) +"zf" = ( +/obj/structure/flora/bush/flowers_br/style_random, +/obj/structure/flora/bush/ferny, +/turf/open/misc/grass, +/area/virtual_domain/powered) +"zg" = ( +/obj/structure/flora/rock/pile/style_3, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/powered) +"zR" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/template_noop, +/area/virtual_domain/safehouse) +"Ax" = ( +/obj/effect/turf_decal/weather/dirt, +/obj/effect/turf_decal/weather/dirt, +/turf/open/water/beach, +/area/virtual_domain/powered) +"AU" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/water/beach, +/area/virtual_domain/powered) +"BC" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"BO" = ( +/obj/structure/bookcase/random/adult, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/wood/parquet, +/area/virtual_domain/powered) +"Cc" = ( +/obj/structure/flora/tree/palm, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"Ct" = ( +/turf/open/misc/beach/coast/corner, +/area/virtual_domain/powered) +"Dm" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table/wood, +/obj/item/flashlight/flare/torch{ + pixel_y = 10 + }, +/obj/item/flashlight/flare/torch{ + pixel_x = 8; + pixel_y = 6 + }, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/powered) +"DJ" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/bed/maint{ + pixel_x = -10; + pixel_y = 9 + }, +/obj/effect/decal/cleanable/wrapping, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"DL" = ( +/obj/structure/flora/bush/sunny, +/turf/open/misc/grass, +/area/virtual_domain/powered) +"ED" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/weather/sand{ + dir = 10 + }, +/obj/effect/turf_decal/weather/sand{ + dir = 9 + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"EZ" = ( +/obj/effect/turf_decal/weather/sand{ + dir = 9 + }, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/powered) +"FG" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/claymore/cutlass, +/obj/item/clothing/head/costume/pirate/bandana/armored{ + pixel_x = -9; + pixel_y = 7 + }, +/obj/structure/table/wood, +/obj/item/gun/energy/laser{ + pixel_y = -3 + }, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/powered) +"FT" = ( +/turf/closed/mineral/random/jungle, +/area/virtual_domain/powered) +"GF" = ( +/obj/effect/turf_decal/weather/dirt, +/obj/structure/flora/rock/pile, +/turf/open/water/beach, +/area/virtual_domain/powered) +"GG" = ( +/obj/structure/barricade/sandbags, +/obj/effect/turf_decal/weather/sand{ + dir = 6 + }, +/obj/item/binoculars{ + pixel_x = -1; + pixel_y = 1 + }, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/powered) +"Hp" = ( +/obj/effect/turf_decal/siding/wood, +/mob/living/simple_animal/hostile/pirate/ranged, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"HY" = ( +/turf/open/misc/beach/coast{ + dir = 6 + }, +/area/virtual_domain/powered) +"It" = ( +/obj/structure/flora/bush/sparsegrass, +/obj/structure/flora/bush/lavendergrass, +/turf/open/misc/grass, +/area/virtual_domain/powered) +"Iz" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/bed/maint, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"IF" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/water/beach, +/area/virtual_domain/powered) +"IG" = ( +/obj/effect/mob_spawn/corpse/human/pirate, +/obj/effect/decal/cleanable/blood/gibs/old, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"IM" = ( +/obj/effect/turf_decal/weather/sand{ + dir = 10 + }, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/powered) +"Jo" = ( +/obj/effect/landmark/bitrunning/cache_spawn, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/powered) +"Jr" = ( +/obj/structure/headpike/bone, +/turf/open/misc/beach/coast, +/area/virtual_domain/powered) +"Jv" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"JT" = ( +/obj/effect/decal/cleanable/ants, +/turf/open/misc/grass, +/area/virtual_domain/powered) +"Kb" = ( +/obj/structure/railing{ + color = "#4C3117"; + name = "wooden railing" + }, +/obj/effect/decal/cleanable/vomit/old, +/obj/effect/turf_decal/weather/sand{ + dir = 1 + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Kl" = ( +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"Kw" = ( +/obj/machinery/door/airlock/vault{ + color = "#825427"; + name = "Ye Olde Strong Door" + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain/powered) +"KC" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/water/beach, +/area/virtual_domain/powered) +"KG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/item/gun/energy/laser/musket{ + pixel_y = 7 + }, +/obj/item/gun/energy/laser/musket{ + pixel_y = 2 + }, +/obj/item/gun/energy/laser/musket{ + pixel_y = -3 + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"KQ" = ( +/obj/structure/flora/rock/style_2, +/turf/open/water/beach, +/area/virtual_domain/powered) +"Ld" = ( +/obj/structure/flora/rock/pile, +/turf/open/water/beach, +/area/virtual_domain/powered) +"Ma" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/misc/grass, +/area/virtual_domain/powered) +"Mi" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"MW" = ( +/obj/effect/turf_decal/weather/sand{ + dir = 5 + }, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Nh" = ( +/obj/structure/flora/rock/pile/jungle/style_3{ + pixel_x = -15; + pixel_y = -4 + }, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/powered) +"Nk" = ( +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Nz" = ( +/obj/structure/flora/bush/jungle, +/turf/open/misc/grass, +/area/virtual_domain/powered) +"NI" = ( +/obj/structure/railing{ + color = "#4C3117"; + name = "wooden railing" + }, +/obj/effect/turf_decal/weather/sand{ + dir = 9 + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"ON" = ( +/obj/item/kirbyplants/organic/plant21{ + pixel_x = -8 + }, +/obj/structure/filingcabinet{ + pixel_x = 11 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain/powered) +"OP" = ( +/obj/structure/flora/bush/stalky, +/turf/open/misc/beach/coast, +/area/virtual_domain/powered) +"Pq" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/bed/maint{ + pixel_x = 2; + pixel_y = 13 + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Pz" = ( +/obj/structure/table/wood, +/mob/living/simple_animal/parrot{ + name = "pepper" + }, +/turf/open/floor/carpet/blue, +/area/virtual_domain/powered) +"PQ" = ( +/obj/structure/flora/grass/jungle/b, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/powered) +"Qb" = ( +/obj/structure/flora/rock{ + pixel_x = 7 + }, +/turf/open/water/beach, +/area/virtual_domain/powered) +"Rr" = ( +/obj/structure/bed/maint{ + pixel_x = -5; + pixel_y = 9 + }, +/obj/effect/turf_decal/weather/sand{ + dir = 6 + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"RR" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/powered) +"Sm" = ( +/obj/structure/flora/tree/jungle, +/obj/structure/flora/bush/fullgrass/style_random, +/turf/open/misc/grass, +/area/virtual_domain/powered) +"St" = ( +/obj/structure/table/wood, +/obj/item/melee/energy/sword/pirate{ + pixel_y = 10 + }, +/obj/item/clothing/mask/cigarette/cigar{ + pixel_x = 4 + }, +/obj/item/lighter{ + pixel_x = 10; + pixel_y = -8 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/carpet/blue, +/area/virtual_domain/powered) +"Tp" = ( +/turf/open/misc/beach/coast/corner{ + dir = 1 + }, +/area/virtual_domain/powered) +"Tt" = ( +/obj/structure/cannon{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"TO" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, +/obj/effect/landmark/bitrunning/cache_spawn, +/turf/open/floor/carpet/blue, +/area/virtual_domain/powered) +"TP" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/misc/beach/coast{ + dir = 6 + }, +/area/virtual_domain/powered) +"TQ" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/bed/maint{ + pixel_x = 2; + pixel_y = 1 + }, +/obj/effect/decal/cleanable/cobweb, +/obj/item/toy/plush/beeplushie, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Uy" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/indestructible/binary, +/area/virtual_domain/powered) +"UE" = ( +/obj/structure/barricade/sandbags, +/obj/effect/turf_decal/weather/sand{ + dir = 10 + }, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/powered) +"Vg" = ( +/obj/effect/mob_spawn/corpse/human/pirate/melee, +/turf/open/water/beach, +/area/virtual_domain/powered) +"Vk" = ( +/obj/structure/barricade/sandbags, +/obj/effect/turf_decal/weather/sand, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/powered) +"VC" = ( +/obj/effect/mob_spawn/corpse/human/damaged, +/turf/open/water/beach, +/area/virtual_domain/powered) +"VF" = ( +/turf/open/water/beach, +/area/virtual_domain/powered) +"VX" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/rack{ + icon = 'icons/obj/fluff/general.dmi'; + icon_state = "minibar"; + name = "skeletal minibar" + }, +/obj/item/storage/bag/money/dutchmen{ + pixel_y = 13 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain/powered) +"WM" = ( +/obj/structure/flora/rock/pile/jungle/style_2, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/powered) +"WP" = ( +/turf/open/floor/wood/parquet, +/area/virtual_domain/powered) +"Xn" = ( +/obj/effect/landmark/bitrunning/safehouse_spawn, +/turf/template_noop, +/area/virtual_domain/safehouse) +"XG" = ( +/obj/structure/fermenting_barrel/gunpowder{ + pixel_x = -4; + pixel_y = 17 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Yj" = ( +/obj/effect/landmark/bitrunning/cache_spawn, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"Yk" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/parquet, +/area/virtual_domain/powered) +"Yq" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Zk" = ( +/obj/structure/flora/coconuts{ + pixel_x = 12 + }, +/obj/structure/flora/tree/palm, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"ZZ" = ( +/obj/structure/flora/grass/jungle, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/powered) + +(1,1,1) = {" +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +cx +cx +cx +cx +cx +cx +cx +cx +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +"} +(2,1,1) = {" +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +cx +cx +FT +FT +FT +FT +FT +FT +cx +cx +cx +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +"} +(3,1,1) = {" +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +cx +cx +cx +FT +FT +FT +FT +FT +FT +FT +FT +FT +cx +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +"} +(4,1,1) = {" +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +cx +cx +FT +FT +FT +FT +FT +FT +FT +FT +FT +FT +FT +cx +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +"} +(5,1,1) = {" +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +cx +FT +FT +FT +FT +FT +FT +zf +eb +we +FT +FT +FT +cx +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +"} +(6,1,1) = {" +xg +xg +xg +xg +xg +xg +xg +xg +cx +cx +cx +FT +FT +FT +Sm +Ma +bz +JT +Kl +Kl +Kl +FT +FT +cx +cx +cx +cx +cx +cx +cx +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +"} +(7,1,1) = {" +xg +xg +xg +xg +xg +cx +cx +cx +cx +FT +FT +FT +FT +It +tk +DL +Kl +Kl +Kl +Cc +Kl +IG +FT +cx +cx +FT +FT +FT +FT +cx +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +"} +(8,1,1) = {" +xg +xg +xg +xg +cx +cx +FT +FT +FT +FT +FT +Nz +bP +mP +to +Kl +Kl +we +Kl +Kl +Kl +Kl +we +cx +cx +FT +FT +FT +FT +cx +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +"} +(9,1,1) = {" +xg +xg +xg +cx +cx +FT +dp +dp +dp +dp +xB +yq +yq +Kl +Kl +Ct +xc +xc +xc +xc +xc +xc +xc +HY +VF +VF +VF +VF +VF +cx +cx +cx +cx +xg +xg +xg +xg +xg +xg +xg +xg +xg +"} +(10,1,1) = {" +xg +xg +xg +cx +FT +dp +dp +Pq +qx +Mi +th +Kl +yq +Kl +IG +OP +uM +VF +VF +VF +VF +VF +VF +VF +VF +VC +VF +VF +VF +VF +VF +dp +cx +cx +cx +xg +xg +xg +xg +xg +xg +xg +"} +(11,1,1) = {" +xg +xg +cx +cx +FT +dp +TQ +Iz +DJ +ag +eW +Kl +Kl +ED +Kl +Jr +VF +VF +VF +VF +VF +VF +VF +VF +VF +KQ +VF +VF +VF +VF +VF +dp +KG +pq +cx +cx +cx +cx +cx +cx +cx +Uy +"} +(12,1,1) = {" +xg +xg +cx +FT +FT +dp +Yj +MW +iO +Rr +qj +Kl +NI +xm +Ct +HY +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +wb +dp +jl +pq +BC +ub +ub +ub +ub +ub +Xn +cx +"} +(13,1,1) = {" +cx +cx +cx +FT +FT +FT +qj +Kl +Kl +Kl +Kl +Kl +lC +kl +pP +VF +VF +VF +VF +VF +VF +Vg +VF +VF +VF +VF +VF +VF +VF +VF +cl +dp +hH +Nk +qm +ub +ub +ub +ub +ub +ub +cx +"} +(14,1,1) = {" +cx +dp +dp +dp +dp +dp +dp +oo +Kl +Kl +Kl +Kl +Kb +dp +px +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +dp +dp +Nk +Jv +ub +ub +ub +ub +ub +ub +cx +"} +(15,1,1) = {" +cx +dp +BO +ht +VX +ct +dp +yi +Kl +dA +Kl +Kl +by +Hp +pP +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +me +ub +ub +ub +ub +ub +ub +cx +"} +(16,1,1) = {" +cx +dp +ON +WP +nX +Yk +Kw +Kl +Kl +Kl +Kl +Kl +Kl +dp +px +VF +VF +VF +VF +Qb +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +ub +ub +ub +ub +ub +ub +cx +"} +(17,1,1) = {" +cx +dp +jC +iM +so +TO +dp +Kl +Kl +EZ +IM +Kl +Kl +Kl +pP +VF +VF +VF +VF +cl +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +ub +ub +ub +ub +ub +ub +cx +"} +(18,1,1) = {" +cx +dp +sn +hW +eQ +gk +dp +dp +qX +gw +jz +UE +Kl +Zk +pP +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +me +VF +ub +ub +ub +ub +ub +zR +cx +"} +(19,1,1) = {" +cx +dp +St +Pz +nQ +yA +dp +dp +Dm +jz +jz +Vk +Kl +Kl +pP +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +dp +BC +VF +VF +VF +VF +VF +VF +cx +cx +"} +(20,1,1) = {" +cx +dp +dp +dp +dp +dp +dp +xm +FG +RR +yw +Vk +Kl +Kl +pP +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +Tt +cJ +Yq +VF +VF +VF +VF +VF +cx +xg +"} +(21,1,1) = {" +cx +cx +cx +FT +FT +Kl +Kl +dp +dp +jB +uw +GG +Kl +Kl +pP +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +xI +dp +XG +BC +VF +VF +VF +VF +VF +cx +xg +"} +(22,1,1) = {" +xg +xg +cx +FT +FT +fx +Kl +Kl +dp +dp +Kl +Kl +Kl +Kl +pP +VF +VF +VF +VF +VF +VF +dQ +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +kg +pq +Ld +VF +VF +VF +VF +VF +cx +xg +"} +(23,1,1) = {" +xg +xg +cx +FT +FT +FT +Kl +Kl +Kl +Kl +Kl +Kl +Kl +Kl +Tp +oU +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +FT +FT +cx +xg +"} +(24,1,1) = {" +xg +xg +cx +FT +FT +FT +FT +dp +Kl +eD +Kl +Kl +Kl +Kl +Kl +Tp +nz +oU +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +FT +FT +cx +xg +"} +(25,1,1) = {" +xg +xg +cx +cx +FT +FT +FT +FT +Kl +Kl +Kl +Kl +Kl +Kl +yi +Kl +Kl +pP +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +FT +FT +FT +cx +xg +"} +(26,1,1) = {" +xg +xg +xg +cx +cx +cx +FT +FT +FT +FT +FT +FT +FT +FT +FT +FT +FT +TP +VF +FT +FT +cx +cx +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +cx +FT +FT +FT +FT +cx +xg +"} +(27,1,1) = {" +xg +xg +xg +xg +xg +cx +FT +FT +FT +FT +FT +FT +FT +FT +FT +FT +FT +PQ +AU +FT +FT +FT +cx +cx +VF +VF +VF +VF +VF +VF +VF +VF +VF +VF +cx +cx +FT +FT +FT +cx +cx +xg +"} +(28,1,1) = {" +xg +xg +xg +xg +xg +cx +cx +FT +FT +FT +FT +FT +FT +FT +FT +FT +FT +Nh +AU +FT +FT +FT +FT +cx +cx +cx +cx +VF +VF +VF +VF +VF +VF +cx +cx +cx +cx +cx +cx +cx +xg +xg +"} +(29,1,1) = {" +xg +xg +xg +xg +xg +xg +cx +cx +cx +cx +cx +cx +FT +FT +FT +FT +FT +ye +KC +VF +FT +FT +FT +FT +FT +FT +cx +cx +cx +cx +cx +cx +cx +cx +xg +xg +xg +xg +xg +xg +xg +xg +"} +(30,1,1) = {" +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +cx +cx +FT +FT +FT +FT +FT +zg +ye +KC +IF +VF +FT +FT +FT +FT +FT +cx +cx +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +"} +(31,1,1) = {" +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +cx +cx +FT +FT +FT +FT +FT +ye +ye +pU +AU +VF +GF +WM +FT +FT +FT +cx +cx +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +"} +(32,1,1) = {" +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +cx +cx +FT +FT +FT +FT +FT +ye +nS +KC +VF +Ax +ye +hM +FT +FT +FT +cx +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +"} +(33,1,1) = {" +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +cx +cx +FT +FT +FT +FT +ZZ +ye +cQ +KC +yc +qN +ye +hM +FT +FT +cx +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +"} +(34,1,1) = {" +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +cx +cx +FT +FT +FT +FT +ye +ye +mw +xC +uT +jQ +Jo +FT +FT +cx +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +"} +(35,1,1) = {" +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +cx +cx +cx +FT +FT +FT +FT +FT +FT +FT +FT +FT +FT +FT +cx +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +"} +(36,1,1) = {" +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +cx +FT +FT +FT +FT +FT +FT +FT +FT +FT +FT +FT +cx +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +"} +(37,1,1) = {" +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +cx +cx +cx +cx +cx +cx +cx +cx +cx +cx +cx +cx +cx +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +xg +"} diff --git a/_maps/virtual_domains/stairs_and_cliffs.dmm b/_maps/virtual_domains/stairs_and_cliffs.dmm new file mode 100644 index 0000000000000..82e15fcc09097 --- /dev/null +++ b/_maps/virtual_domains/stairs_and_cliffs.dmm @@ -0,0 +1,6056 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"be" = ( +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/open/cliff/snowrock/virtual_domain, +/area/icemoon/underground/explored/virtual_domain) +"cu" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/obj/structure/railing, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/wood, +/area/icemoon/underground/explored/virtual_domain) +"cJ" = ( +/obj/structure/chair/sofa/bench, +/turf/open/floor/plating/snowed/smoothed, +/area/icemoon/underground/explored/virtual_domain) +"dR" = ( +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) +"en" = ( +/obj/item/clothing/under/color/grey, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) +"eB" = ( +/obj/structure/flora/rock/icy/style_random, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) +"gB" = ( +/obj/structure/railing/corner, +/turf/open/cliff/snowrock/virtual_domain, +/area/icemoon/underground/explored/virtual_domain) +"hc" = ( +/obj/structure/railing/corner/end{ + dir = 8 + }, +/obj/structure/railing/corner/end/flip{ + dir = 8 + }, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) +"hE" = ( +/turf/open/floor/wood, +/area/icemoon/underground/explored/virtual_domain) +"jK" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/cliff/snowrock/virtual_domain, +/area/icemoon/underground/explored/virtual_domain) +"kc" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) +"km" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/ash/large, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) +"kK" = ( +/obj/structure/flora/tree/pine/style_random, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) +"mx" = ( +/obj/structure/railing, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/wood, +/area/icemoon/underground/explored/virtual_domain) +"nj" = ( +/obj/structure/chair/sofa/bench/left, +/turf/open/floor/plating/snowed/smoothed, +/area/icemoon/underground/explored/virtual_domain) +"no" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/structure/railing, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/wood, +/area/icemoon/underground/explored/virtual_domain) +"pl" = ( +/obj/structure/bonfire/prelit, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) +"pL" = ( +/turf/open/lava/plasma/virtual_domain, +/area/icemoon/underground/explored/virtual_domain) +"qc" = ( +/turf/open/misc/ice, +/area/icemoon/underground/explored/virtual_domain) +"sa" = ( +/obj/structure/flora/grass/green/style_random, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) +"sw" = ( +/obj/structure/flora/rock/pile/icy/style_random, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) +"sM" = ( +/turf/open/cliff/snowrock/virtual_domain, +/area/icemoon/underground/explored/virtual_domain) +"uJ" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/template_noop, +/area/virtual_domain/safehouse) +"vz" = ( +/obj/effect/landmark/bitrunning/safehouse_spawn, +/turf/template_noop, +/area/virtual_domain/safehouse) +"xB" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/floor/wood, +/area/icemoon/underground/explored/virtual_domain) +"yo" = ( +/turf/open/floor/plating/snowed/smoothed, +/area/icemoon/underground/explored/virtual_domain) +"yJ" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/structure/railing, +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/open/floor/wood, +/area/icemoon/underground/explored/virtual_domain) +"yL" = ( +/obj/structure/chair/sofa/bench/right, +/turf/open/floor/plating/snowed/smoothed, +/area/icemoon/underground/explored/virtual_domain) +"zn" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/floor/wood, +/area/icemoon/underground/explored/virtual_domain) +"Am" = ( +/turf/closed/indestructible/binary, +/area/icemoon/underground/explored/virtual_domain) +"AI" = ( +/obj/structure/flora/grass/green/style_random, +/turf/open/floor/plating/snowed/smoothed, +/area/icemoon/underground/explored/virtual_domain) +"BV" = ( +/obj/effect/decal/remains/plasma, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) +"Dz" = ( +/obj/structure/railing/corner/end{ + dir = 4 + }, +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) +"DB" = ( +/obj/structure/flora/rock/icy/style_random, +/obj/structure/flora/rock/pile/icy/style_random, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) +"DY" = ( +/obj/structure/flora/rock/icy/style_random, +/obj/structure/flora/grass/green/style_random, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) +"Eh" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/cliff/snowrock/virtual_domain, +/area/icemoon/underground/explored/virtual_domain) +"Gn" = ( +/obj/structure/flora/rock/pile/icy/style_random, +/obj/effect/decal/cleanable/blood/old, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) +"GX" = ( +/obj/effect/decal/cleanable/ash/large, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) +"HU" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/floor/wood, +/area/icemoon/underground/explored/virtual_domain) +"Kl" = ( +/obj/effect/decal/remains/plasma, +/obj/effect/decal/cleanable/ash/large, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) +"KA" = ( +/obj/structure/statue/snow/snowman{ + name = "Norm"; + desc = "Norm has seen many a man roll down these cliffs, some more stubborn than others. Its usually the stubborn ones who stop getting back up." + }, +/obj/item/pickaxe/mini, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) +"Lw" = ( +/obj/structure/flora/rock/pile/icy/style_random, +/obj/structure/flora/grass/green/style_random, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) +"MP" = ( +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/obj/structure/railing/corner/end{ + dir = 4 + }, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) +"MT" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/floor/wood, +/area/icemoon/underground/explored/virtual_domain) +"Nv" = ( +/turf/open/floor/iron/stairs, +/area/icemoon/underground/explored/virtual_domain) +"NM" = ( +/obj/structure/railing/corner/end/flip{ + dir = 8 + }, +/obj/structure/railing/corner/end{ + dir = 8 + }, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) +"Pl" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing/corner, +/turf/open/floor/wood, +/area/icemoon/underground/explored/virtual_domain) +"Qv" = ( +/turf/closed/indestructible/rock/snow/ice, +/area/icemoon/underground/explored/virtual_domain) +"RD" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/indestructible/binary, +/area/icemoon/underground/explored/virtual_domain) +"Tz" = ( +/obj/item/pickaxe/mini, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) +"Ug" = ( +/obj/structure/flora/rock/icy/style_random, +/obj/effect/decal/cleanable/blood/old, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) +"VW" = ( +/obj/structure/closet/crate/secure/bitrunning/encrypted, +/turf/open/floor/plating/snowed/smoothed, +/area/icemoon/underground/explored/virtual_domain) +"YR" = ( +/obj/structure/flora/tree/pine/style_random, +/obj/structure/flora/grass/green/style_random, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) +"YT" = ( +/turf/template_noop, +/area/virtual_domain/safehouse) + +(1,1,1) = {" +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +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 +RD +"} +(2,1,1) = {" +Am +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(3,1,1) = {" +Am +Qv +Qv +Qv +Qv +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +pL +pL +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(4,1,1) = {" +Am +Qv +Qv +Qv +dR +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +pL +pL +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(5,1,1) = {" +Am +Qv +Qv +dR +dR +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +pL +pL +pL +pL +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(6,1,1) = {" +Am +Qv +Qv +kK +sw +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +pL +pL +pL +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(7,1,1) = {" +Am +Qv +Qv +dR +dR +sa +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +pL +pL +pL +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(8,1,1) = {" +Am +Qv +Qv +eB +sw +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +pL +pL +pL +Qv +Qv +Qv +pL +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(9,1,1) = {" +Am +Qv +Qv +dR +eB +dR +sw +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(10,1,1) = {" +Am +Qv +dR +sw +eB +eB +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(11,1,1) = {" +Am +Qv +dR +eB +sw +sa +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +pl +dR +sw +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +pL +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(12,1,1) = {" +Am +Qv +dR +dR +sw +sa +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sw +dR +Nv +Nv +Nv +sM +sM +Nv +Nv +Nv +Nv +Nv +Nv +sM +sM +sM +sM +Nv +Nv +Nv +Nv +dR +qc +sM +sM +sM +sM +sM +sM +sM +sM +pL +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(13,1,1) = {" +Am +Qv +dR +sa +sw +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sw +dR +dR +sM +Nv +Nv +Nv +Nv +sM +sM +sM +sM +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +pL +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(14,1,1) = {" +Am +Qv +dR +dR +dR +dR +kK +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sw +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +sa +sM +sM +sM +sM +sM +sM +sM +sM +sM +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +Qv +pL +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(15,1,1) = {" +Am +Qv +sw +sa +dR +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +qc +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +Qv +pL +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(16,1,1) = {" +Am +Qv +dR +sa +sa +sa +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +qc +sM +sM +sM +sM +sM +sM +sM +sM +sM +pL +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +pl +sM +sM +sM +sM +sM +sM +sM +sM +pL +pL +GX +pL +pL +pL +pL +Qv +Qv +Qv +pL +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(17,1,1) = {" +Am +Qv +dR +sa +sa +dR +yo +Nv +Nv +Nv +Nv +sM +sM +Nv +Nv +Nv +dR +dR +sM +sM +sM +sM +sM +dR +qc +sM +sM +sM +sM +sM +sM +sM +sM +pL +pL +sw +dR +sM +sM +sM +sM +sM +sM +sM +sM +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +pL +pL +dR +dR +pL +pL +pL +Qv +Qv +Qv +pL +pL +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(18,1,1) = {" +Am +Qv +Qv +dR +dR +yo +yo +sM +sM +sM +Nv +Nv +Nv +Nv +sM +sM +sa +qc +sM +sM +sM +sM +sM +dR +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +pL +dR +sa +pL +pL +sM +sM +sM +sM +sM +sM +sw +dR +sM +sM +sM +sM +sM +sM +sM +sM +pL +dR +en +dR +dR +pL +pL +Qv +Qv +Qv +pL +pL +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(19,1,1) = {" +Am +Qv +Qv +kK +sa +yo +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +sw +sM +sM +sM +sM +sM +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +dR +dR +sw +BV +pL +sM +sM +sM +sM +sM +sM +eB +dR +sM +sM +sM +sM +sM +sM +sM +sM +pL +GX +sw +dR +dR +pL +pL +pL +pL +Qv +pL +pL +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(20,1,1) = {" +Am +Qv +Qv +dR +dR +yo +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +dR +sM +sM +sM +sM +sM +qc +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +kK +GX +pL +pL +sM +sM +sM +sM +sM +sM +sM +dR +qc +dR +sM +sM +sM +sM +sM +sM +pL +dR +dR +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(21,1,1) = {" +Am +Qv +Qv +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +pL +pL +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +dR +sM +sM +sM +sM +sM +sM +dR +dR +dR +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(22,1,1) = {" +Am +Qv +Qv +dR +sa +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +sM +qc +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +sM +sM +sw +dR +dR +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +Qv +Qv +Qv +Am +"} +(23,1,1) = {" +Am +Qv +Qv +Qv +sa +qc +qc +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +qc +sM +sM +sM +sM +sM +sM +qc +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +qc +sM +sM +sM +sM +sM +sM +DB +kc +dR +dR +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +Qv +Qv +Qv +Am +"} +(24,1,1) = {" +Am +Qv +Qv +sw +eB +qc +qc +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +qc +sM +sM +sM +sM +sM +sM +qc +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sa +dR +sM +sM +sM +sM +sM +sM +Ug +eB +dR +dR +dR +pL +pL +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +Qv +Qv +Qv +Am +"} +(25,1,1) = {" +Am +Qv +Qv +dR +dR +sa +qc +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +qc +sM +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +dR +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +sM +Nv +Nv +dR +dR +sM +sM +sM +sM +sM +sM +Ug +sw +dR +dR +dR +dR +dR +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +Qv +Qv +Qv +Am +"} +(26,1,1) = {" +Am +Qv +Qv +dR +yo +dR +qc +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +qc +dR +sM +sM +sM +sM +sM +dR +Nv +Nv +Nv +Nv +Nv +sM +sM +sM +sM +Nv +Nv +Nv +Nv +Nv +Nv +qc +qc +sM +sM +sM +sM +sM +sM +Ug +sw +dR +dR +dR +sa +dR +dR +dR +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +Qv +Am +"} +(27,1,1) = {" +Am +Qv +Qv +dR +yo +sa +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sa +dR +sM +sM +sM +sM +dR +sM +sM +sM +sM +eB +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +dR +dR +dR +kK +dR +dR +dR +sw +dR +dR +pL +pL +pL +pL +pL +Qv +Qv +Qv +Am +"} +(28,1,1) = {" +Am +Qv +Qv +sa +yo +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sa +dR +sM +sM +sM +sM +dR +sM +sM +sM +sM +dR +qc +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +kK +sa +dR +qc +qc +sa +sa +dR +kK +dR +pL +pL +pL +pL +pL +pL +Qv +Qv +Am +"} +(29,1,1) = {" +Am +Qv +Qv +sa +yo +yo +qc +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +dR +sM +sM +sM +sM +dR +sM +sM +sM +sM +MP +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +dR +dR +qc +qc +qc +sa +sa +dR +dR +dR +pL +pL +pL +pL +pL +Qv +Qv +Qv +Am +"} +(30,1,1) = {" +Am +Qv +Qv +qc +dR +qc +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +dR +sM +sM +sM +sM +no +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +yL +dR +dR +dR +kK +dR +dR +dR +dR +dR +dR +dR +dR +pL +pL +pL +Qv +Qv +Qv +Am +"} +(31,1,1) = {" +Am +Qv +pl +qc +dR +yo +sM +sM +sM +sM +sM +sM +sM +dR +dR +Nv +Nv +Nv +Nv +qc +sM +sM +sM +sM +dR +dR +sM +sM +sM +mx +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +cJ +yo +dR +dR +dR +dR +dR +kK +sa +sa +dR +dR +dR +dR +dR +dR +dR +dR +Qv +Am +"} +(32,1,1) = {" +Am +Qv +sM +sM +zn +sM +sM +sM +sM +sM +sM +sM +sM +dR +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sw +dR +sM +sM +sM +cu +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +nj +yo +dR +kK +dR +dR +dR +kK +sa +sa +dR +dR +dR +dR +kK +dR +dR +Qv +Qv +Am +"} +(33,1,1) = {" +Am +Qv +sM +sM +hE +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +dR +sM +sM +sM +NM +sM +sM +sM +sM +sM +sM +sM +qc +dR +Nv +Nv +Nv +Nv +Nv +dR +dR +sw +sM +sM +sM +sM +sM +sM +sM +sM +yo +yo +dR +dR +sa +dR +sw +dR +dR +dR +dR +sa +sa +dR +dR +dR +dR +Qv +Qv +Am +"} +(34,1,1) = {" +Am +Qv +sM +sM +hE +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +sa +dR +sM +sM +sM +sM +sM +sM +sM +sM +qc +sM +sM +sM +dR +qc +sM +sM +sM +sM +sM +sM +qc +yo +Nv +Nv +Nv +Nv +Nv +yo +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +yo +dR +dR +sa +dR +dR +dR +dR +kK +qc +dR +dR +dR +dR +dR +dR +dR +Qv +Am +"} +(35,1,1) = {" +Am +Qv +sM +sM +hE +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +sM +sM +sM +qc +sM +sM +sM +qc +sa +sM +sM +sM +sM +sM +sM +qc +dR +sM +sM +sM +sM +sM +eB +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +dR +yo +yo +dR +dR +dR +qc +qc +qc +qc +qc +dR +YT +YT +YT +YT +YT +vz +Qv +Am +"} +(36,1,1) = {" +Am +Qv +dR +sM +HU +sM +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +qc +sM +sM +sM +sM +sM +sM +sM +sM +dR +qc +sM +sM +sw +dR +sM +sM +sM +sM +sM +sM +qc +dR +sM +sM +sM +sM +sM +kK +dR +qc +sM +sM +sM +sM +sM +sM +sM +sM +pl +dR +yo +dR +dR +dR +dR +dR +qc +qc +qc +dR +YT +YT +YT +YT +YT +YT +Qv +Am +"} +(37,1,1) = {" +Am +Qv +Qv +dR +dR +dR +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +dR +sM +sM +sM +dR +dR +sM +sM +sM +sM +eB +dR +sa +sM +sM +sM +sM +sM +sM +sa +yo +dR +sM +sM +sM +sM +sM +sM +sM +yo +dR +yo +dR +dR +dR +dR +sw +qc +qc +dR +dR +YT +YT +YT +YT +YT +YT +Qv +Am +"} +(38,1,1) = {" +Am +Qv +Qv +dR +yo +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +qc +sM +sM +sM +sM +sM +sM +sM +sM +dR +sM +sM +sM +dR +dR +sM +sM +sM +sM +dR +dR +qc +sM +sM +sM +sM +sM +sM +sM +yo +AI +Nv +Nv +Nv +Nv +Nv +Nv +Nv +yo +yo +yo +yo +yo +yo +dR +dR +yo +dR +yo +yo +YT +YT +YT +YT +YT +YT +Qv +Am +"} +(39,1,1) = {" +Am +Qv +Qv +dR +dR +dR +kK +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +qc +sM +sM +sM +sM +sM +sM +sM +dR +qc +sM +sM +sM +pl +dR +dR +sM +sM +sM +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +yo +AI +Nv +Nv +Nv +Nv +Nv +Nv +Nv +yo +yo +yo +yo +dR +yo +yo +yo +yo +yo +yo +yo +YT +YT +YT +YT +YT +YT +Qv +Am +"} +(40,1,1) = {" +Am +Qv +Qv +dR +yo +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +qc +sM +sM +sM +sM +sM +sM +sM +dR +dR +sM +sM +sM +sM +dR +dR +Nv +Nv +Nv +dR +kK +sM +sM +sM +sM +sM +sM +sM +sM +sw +dR +Nv +Nv +Nv +Nv +Nv +Nv +Nv +yo +yo +dR +dR +dR +yo +dR +yo +yo +yo +dR +yo +YT +YT +YT +YT +YT +YT +Qv +Am +"} +(41,1,1) = {" +Am +Qv +dR +sa +yo +dR +sa +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +sM +sM +sM +dR +qc +sM +sM +sM +qc +Tz +Nv +Nv +Nv +qc +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +dR +dR +sw +dR +dR +dR +dR +dR +dR +dR +dR +YT +YT +YT +YT +YT +uJ +Qv +Am +"} +(42,1,1) = {" +Am +Qv +dR +AI +yo +yo +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +pl +KA +dR +dR +dR +sa +sa +dR +qc +qc +qc +dR +dR +dR +dR +dR +dR +dR +Qv +Am +"} +(43,1,1) = {" +Am +Qv +yo +yo +VW +yo +yo +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +sa +dR +dR +kK +sa +sa +dR +dR +qc +qc +qc +dR +sa +sa +dR +dR +dR +Qv +Am +"} +(44,1,1) = {" +Am +Qv +dR +yo +yo +yo +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +qc +sM +sM +sM +sM +sM +sM +sM +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +sa +dR +sa +dR +dR +dR +dR +kK +qc +qc +qc +dR +sa +sa +dR +dR +dR +Qv +Am +"} +(45,1,1) = {" +Am +Qv +dR +dR +yo +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +dR +sM +sM +sM +sM +sM +sM +sM +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +dR +dR +dR +dR +dR +kK +dR +dR +dR +dR +Qv +dR +Qv +dR +kK +dR +Qv +Qv +Am +"} +(46,1,1) = {" +Am +Qv +Qv +sa +dR +dR +sa +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +qc +dR +sM +sM +sM +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +kK +dR +dR +dR +dR +dR +dR +dR +dR +dR +dR +Qv +Qv +Qv +dR +dR +dR +Qv +Qv +Am +"} +(47,1,1) = {" +Am +Qv +Qv +dR +dR +YR +sa +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +sM +dR +dR +qc +Nv +Nv +Nv +sM +sM +sM +sM +Nv +Nv +Nv +Nv +sM +sM +sM +Nv +Nv +Nv +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +pL +dR +pL +dR +dR +dR +dR +dR +dR +Qv +Qv +Qv +Qv +Qv +dR +dR +dR +Qv +Qv +Am +"} +(48,1,1) = {" +Am +Qv +Qv +dR +kK +sa +YR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +sM +dR +dR +dR +sw +sM +Nv +Nv +Nv +Nv +Nv +Nv +sM +sM +Nv +Nv +Nv +Nv +Nv +sM +Nv +Nv +Nv +qc +sM +sM +sM +sM +sM +sM +sM +pL +pL +pL +pL +pL +dR +dR +dR +dR +Qv +Qv +Qv +Qv +dR +sw +dR +dR +dR +Qv +Am +"} +(49,1,1) = {" +Am +Qv +Qv +dR +dR +YR +sa +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +qc +sM +sM +sM +sM +sM +eB +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +sM +sM +pL +pL +pL +dR +dR +dR +dR +dR +pL +pL +Qv +Qv +Qv +Qv +dR +sw +dR +dR +Qv +Am +"} +(50,1,1) = {" +Am +Qv +Qv +sa +dR +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sa +qc +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +pl +sM +sM +sM +sM +sM +sM +dR +pL +pL +dR +dR +sa +dR +pL +pL +pL +pL +Qv +Qv +Qv +sw +eB +dR +dR +Qv +Am +"} +(51,1,1) = {" +Am +Qv +Qv +Qv +dR +sa +kK +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sa +qc +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sa +sM +sM +sM +sM +sM +sM +dR +pL +dR +dR +kK +dR +dR +pL +pL +pL +pL +Qv +Qv +Qv +Qv +dR +dR +sa +Qv +Am +"} +(52,1,1) = {" +Am +Qv +Qv +Qv +dR +sa +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +dR +sM +sM +sM +sM +sM +pL +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sa +sM +sM +sM +sM +sM +sM +dR +pL +dR +dR +dR +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +Qv +dR +dR +dR +Qv +Am +"} +(53,1,1) = {" +Am +Qv +Qv +Qv +dR +YR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sw +Dz +sM +sM +sM +sM +sM +pL +pL +pL +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +dR +sM +sM +sM +sM +sM +dR +dR +dR +sa +dR +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +Qv +Qv +dR +dR +Qv +Am +"} +(54,1,1) = {" +Am +Qv +Qv +Qv +dR +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +jK +yJ +sM +sM +sM +sM +sM +sM +pL +pL +pL +pL +sM +sM +GX +dR +dR +pL +sM +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +sa +dR +sw +sa +dR +pL +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +Qv +dR +Qv +Qv +Am +"} +(55,1,1) = {" +Am +Qv +Qv +dR +dR +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +MT +be +sM +sM +sM +sM +sM +sM +sM +pL +pL +pL +pL +pL +pL +pL +pL +pL +dR +kK +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +qc +sM +sM +sM +sM +sM +dR +sw +eB +dR +dR +pL +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +dR +dR +dR +Qv +Am +"} +(56,1,1) = {" +Am +Qv +Qv +dR +eB +sw +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +gB +xB +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +pL +pL +pL +pL +pL +pL +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +qc +sM +sM +sM +sM +sM +km +sw +eB +eB +sw +pL +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +dR +dR +dR +Qv +Am +"} +(57,1,1) = {" +Am +Qv +Qv +dR +Lw +sa +sa +kK +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +Pl +Eh +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +pL +pL +dR +sw +dR +sM +sM +sM +sM +sM +sM +sM +sM +sa +eB +sM +sM +sM +sM +sM +pL +dR +eB +eB +dR +dR +pL +pL +pL +pL +pL +pL +Qv +Qv +Qv +dR +dR +dR +Qv +Am +"} +(58,1,1) = {" +Am +Qv +Qv +dR +sa +sa +YR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +hc +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +Gn +eB +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +dR +sw +sM +sM +sM +sM +sM +pL +GX +dR +pL +dR +dR +pL +pL +pL +pL +Qv +Qv +Qv +Qv +dR +sa +dR +dR +Qv +Am +"} +(59,1,1) = {" +Am +Qv +Qv +sa +YR +sa +sa +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +dR +qc +sM +sM +sM +dR +sM +sM +Nv +Nv +Nv +dR +sM +sM +sM +sM +sM +kK +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +dR +sM +sM +sM +sM +sM +pL +dR +dR +pL +dR +pL +pL +pL +pL +pL +pL +Qv +Qv +dR +dR +dR +Qv +Qv +Qv +Am +"} +(60,1,1) = {" +Am +Qv +Qv +dR +dR +sw +kK +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +dR +sM +sM +sM +dR +dR +Nv +Nv +Nv +sM +sM +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +kK +dR +qc +sM +sM +sM +sM +sM +pL +GX +pL +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +Qv +dR +dR +dR +Qv +Qv +Qv +Am +"} +(61,1,1) = {" +Am +Qv +dR +kK +sw +eB +eB +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +dR +sM +sM +sM +dR +sM +sM +sM +sM +sM +dR +sa +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +dR +sM +sM +sM +sM +sM +sM +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +dR +dR +dR +Qv +Qv +Qv +Qv +Am +"} +(62,1,1) = {" +Am +Qv +dR +sa +DY +eB +eB +dR +sM +sM +sM +sM +sM +sM +sM +sM +dR +dR +sM +sM +sM +sM +sa +dR +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sa +dR +sM +sM +sM +sM +sM +sM +pL +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +Qv +Qv +dR +dR +Qv +Qv +Qv +Qv +Qv +Am +"} +(63,1,1) = {" +Am +Qv +dR +Lw +Lw +dR +sa +dR +sM +sM +sM +sM +sM +sM +sM +sM +eB +dR +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sa +dR +sM +sM +sM +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +dR +Qv +Qv +dR +dR +dR +dR +Qv +Qv +Qv +Qv +Am +"} +(64,1,1) = {" +Am +Qv +dR +sa +sa +sw +kK +dR +sM +sM +sM +sM +sM +sM +sM +sM +sw +dR +sM +sM +sM +sM +sM +qc +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +eB +dR +dR +dR +sa +dR +sw +Qv +Qv +Qv +Qv +Qv +Am +"} +(65,1,1) = {" +Am +Qv +dR +dR +kK +dR +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +dR +dR +sM +sM +sM +sM +sM +qc +sM +sM +sM +sM +qc +sM +sM +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +Nv +Nv +Nv +Nv +Nv +Nv +dR +sM +sM +sM +sM +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +sw +sa +sa +dR +sw +sw +eB +Qv +Qv +Qv +Qv +Qv +Am +"} +(66,1,1) = {" +Am +Qv +dR +kK +sa +sa +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +sa +dR +sM +sM +sM +sM +qc +sM +sM +sM +sM +sa +dR +sM +sM +sM +sM +sM +sw +dR +Nv +Nv +Nv +Nv +Nv +sM +sM +sM +Nv +Nv +dR +sM +sM +sM +sM +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +dR +sa +sa +dR +dR +dR +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(67,1,1) = {" +Am +Qv +dR +dR +YR +DY +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sa +dR +sM +sM +sM +dR +dR +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +dR +qc +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +sa +dR +dR +dR +Qv +Qv +Qv +Qv +Qv +Am +"} +(68,1,1) = {" +Am +Qv +dR +dR +Lw +sa +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +dR +sM +sM +sM +dR +dR +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +sa +qc +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +dR +dR +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(69,1,1) = {" +Am +Qv +Qv +dR +eB +sw +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +dR +Nv +Nv +Nv +dR +dR +sM +sM +sM +sM +sM +dR +sM +sM +sM +sM +sM +dR +qc +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(70,1,1) = {" +Am +Qv +Qv +Qv +dR +eB +sw +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +kK +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +Nv +dR +dR +dR +dR +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(71,1,1) = {" +Am +Qv +Qv +dR +sa +sa +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +dR +qc +dR +pl +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +Kl +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(72,1,1) = {" +Am +Qv +Qv +sa +sa +Lw +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(73,1,1) = {" +Am +Qv +Qv +Qv +dR +sw +dR +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +sM +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(74,1,1) = {" +Am +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Qv +Am +"} +(75,1,1) = {" +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +Am +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 +"} diff --git a/_maps/virtual_domains/syndicate_assault.dmm b/_maps/virtual_domains/syndicate_assault.dmm new file mode 100644 index 0000000000000..770f0967404c7 --- /dev/null +++ b/_maps/virtual_domains/syndicate_assault.dmm @@ -0,0 +1,4265 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aq" = ( +/obj/item/storage/backpack/duffelbag/syndie/surgery, +/obj/structure/table/reinforced, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/powered/virtual_domain) +"aw" = ( +/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/powered/virtual_domain) +"aN" = ( +/obj/structure/closet/crate/secure/gear{ + req_access = list("syndicate") + }, +/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/virtual_domain) +"aO" = ( +/obj/machinery/recharge_station, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"aZ" = ( +/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/basic/syndicate/ranged/shotgun/space/stormtrooper, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"bh" = ( +/turf/open/floor/carpet/royalblack, +/area/ruin/space/has_grav/powered/virtual_domain) +"bo" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"bD" = ( +/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/powered/virtual_domain) +"bG" = ( +/turf/open/floor/pod/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"cc" = ( +/obj/structure/closet/crate/secure/gear{ + req_access = list("syndicate") + }, +/obj/effect/spawner/random/clothing/costume, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"cj" = ( +/obj/structure/transit_tube/crossing, +/turf/closed/wall/r_wall/syndicate, +/area/ruin/space/has_grav/powered/virtual_domain) +"ct" = ( +/obj/structure/closet/syndicate{ + anchored = 1; + desc = "A basic closet for all your villainous needs."; + locked = 1; + name = "Closet"; + req_access = list("syndicate"); + secure = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"cw" = ( +/obj/structure/closet/syndicate{ + anchored = 1; + desc = "A basic closet for all your villainous needs."; + locked = 1; + name = "Closet"; + req_access = list("syndicate"); + 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/powered/virtual_domain) +"cy" = ( +/obj/machinery/door/airlock/grunge{ + name = "Syndicate Ship Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/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/powered/virtual_domain) +"cB" = ( +/obj/machinery/camera/xray{ + c_tag = "Medbay"; + dir = 6; + network = list("fsci"); + screen_loc = "" + }, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/powered/virtual_domain) +"cR" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/carpet/royalblack, +/area/ruin/space/has_grav/powered/virtual_domain) +"cZ" = ( +/obj/structure/table/reinforced, +/obj/item/gun/ballistic/automatic/l6_saw/unrestricted, +/obj/item/ammo_box/magazine/m7mm, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"da" = ( +/obj/machinery/stasis, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/powered/virtual_domain) +"dd" = ( +/obj/structure/sign/warning/vacuum/external, +/turf/closed/wall/r_wall/syndicate, +/area/ruin/space/has_grav/powered/virtual_domain) +"di" = ( +/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/powered/virtual_domain) +"dw" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"dz" = ( +/obj/effect/landmark/bitrunning/cache_spawn, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"dU" = ( +/obj/structure/cable, +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external/ruin{ + name = "Syndicate Ship Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"eB" = ( +/obj/machinery/camera/xray{ + c_tag = "Cargo pod"; + dir = 9; + network = list("fsci"); + screen_loc = "" + }, +/obj/structure/closet, +/obj/item/clothing/under/syndicate/tacticool, +/obj/item/clothing/under/syndicate/tacticool, +/obj/item/clothing/under/syndicate/tacticool, +/obj/item/card/id/advanced/black/syndicate_command/crew_id, +/obj/item/card/id/advanced/black/syndicate_command/crew_id, +/obj/item/card/id/advanced/black/syndicate_command/crew_id, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"fd" = ( +/obj/structure/transit_tube/crossing, +/turf/open/space/basic, +/area/space) +"fG" = ( +/obj/structure/toilet{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/ruin/space/has_grav/powered/virtual_domain) +"fJ" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"fM" = ( +/obj/machinery/computer/crew/syndie{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"fV" = ( +/obj/machinery/atmospherics/components/unary/vent_pump, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"gD" = ( +/obj/effect/mob_spawn/ghost_role/human/syndicatespace, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"hg" = ( +/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/powered/virtual_domain) +"hy" = ( +/obj/structure/table/reinforced, +/obj/item/paper/fluff/ruins/forgottenship/missionobj, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"hA" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/wall/r_wall/syndicate, +/area/ruin/space/has_grav/powered/virtual_domain) +"hD" = ( +/obj/structure/table/reinforced, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"ip" = ( +/mob/living/basic/syndicate/melee/sword/space/stormtrooper, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/powered/virtual_domain) +"iB" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"iL" = ( +/obj/structure/sign/departments/cargo, +/turf/closed/wall/r_wall/syndicate, +/area/ruin/space/has_grav/powered/virtual_domain) +"iU" = ( +/obj/structure/closet/crate/secure/gear{ + req_access = list("syndicate") + }, +/obj/item/melee/energy/sword/saber/red, +/obj/machinery/light/small/directional/north, +/turf/open/floor/pod/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"iW" = ( +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "fslockdown"; + name = "Window shutters"; + req_access = list("syndicate") + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"iX" = ( +/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 + }, +/mob/living/basic/syndicate/ranged/smg/space/stormtrooper, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"ja" = ( +/obj/machinery/door/window{ + dir = 1; + name = "Spare Equipment"; + req_access = list("syndicate") + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"jl" = ( +/obj/structure/bodycontainer/crematorium{ + id = "fscremate" + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"jA" = ( +/obj/structure/cable, +/mob/living/basic/syndicate/melee/space/stormtrooper, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"jJ" = ( +/obj/machinery/door/airlock/grunge{ + name = "Syndicate Ship Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/ruin/space/has_grav/powered/virtual_domain) +"kh" = ( +/obj/machinery/door/airlock/grunge{ + name = "Syndicate Ship Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/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/powered/virtual_domain) +"ki" = ( +/obj/structure/table/reinforced, +/obj/machinery/computer/security/telescreen/interrogation{ + name = "Cameras monitor"; + network = list("fsci"); + req_access = list("syndicate"); + screen_loc = "" + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"kI" = ( +/obj/machinery/computer/atmos_alert{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"kJ" = ( +/obj/effect/landmark/bitrunning/safehouse_spawn, +/turf/template_noop, +/area/virtual_domain/safehouse) +"li" = ( +/obj/structure/transit_tube/station/dispenser/reverse{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"ln" = ( +/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 = list("syndicate") + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"lo" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external/ruin{ + name = "Syndicate Ship Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"lN" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"mo" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"mD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 10 + }, +/obj/item/wrench, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"nk" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/mapping_helpers/apc/syndicate_access, +/obj/structure/cable, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"nB" = ( +/turf/closed/mineral/random, +/area/space) +"nG" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"nO" = ( +/obj/machinery/mineral/ore_redemption{ + name = "Syndicate ore redemption machine"; + ore_multiplier = 4; + req_access = list("syndicate") + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"nU" = ( +/obj/structure/sign/poster/contraband/syndicate_pistol, +/turf/closed/wall/r_wall/syndicate, +/area/ruin/space/has_grav/powered/virtual_domain) +"oM" = ( +/obj/structure/cable, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"oZ" = ( +/mob/living/basic/syndicate/melee/sword/space/stormtrooper, +/turf/open/floor/carpet/royalblack, +/area/ruin/space/has_grav/powered/virtual_domain) +"pl" = ( +/obj/machinery/atmospherics/components/tank/air{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"pz" = ( +/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/powered/virtual_domain) +"pH" = ( +/obj/structure/table/reinforced, +/obj/item/toy/plush/nukeplushie, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"pM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"pS" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 6 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"pU" = ( +/obj/machinery/shower/directional/north, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/ruin/space/has_grav/powered/virtual_domain) +"qf" = ( +/obj/structure/table/optable, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/powered/virtual_domain) +"qx" = ( +/turf/open/space/basic, +/area/space) +"qU" = ( +/obj/structure/sign/poster/contraband/c20r, +/turf/closed/wall/r_wall/syndicate, +/area/ruin/space/has_grav/powered/virtual_domain) +"qY" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"rm" = ( +/obj/machinery/button/crematorium{ + id = "fscremate"; + pixel_x = -32 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"ru" = ( +/turf/closed/wall/r_wall/syndicate, +/area/ruin/space/has_grav/powered/virtual_domain) +"rH" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"rM" = ( +/obj/structure/closet/syndicate{ + anchored = 1; + desc = "A basic closet for all your villainous needs."; + locked = 1; + name = "Closet"; + req_access = list("syndicate"); + secure = 1 + }, +/obj/effect/spawner/random/contraband/armory, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"rP" = ( +/obj/effect/mob_spawn/ghost_role/human/syndicatespace, +/obj/machinery/light/small/directional/south, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"sg" = ( +/obj/machinery/ore_silo, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"sq" = ( +/obj/machinery/door/window{ + name = "Control Room"; + req_access = list("syndicate") + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"sz" = ( +/obj/machinery/atmospherics/components/unary/vent_pump{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"sH" = ( +/obj/structure/displaycase{ + req_access = list("syndicate"); + start_showpiece_type = /obj/item/gun/ballistic/automatic/pistol/deagle/camo + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"sK" = ( +/obj/structure/closet/crate/secure/gear{ + req_access = list("syndicate") + }, +/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/virtual_domain) +"sL" = ( +/obj/structure/chair/comfy, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"sM" = ( +/turf/template_noop, +/area/virtual_domain/safehouse) +"tv" = ( +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "fscaproom"; + name = "Room shutters control"; + req_access = list("syndicate") + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"tI" = ( +/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/powered/virtual_domain) +"uP" = ( +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"vp" = ( +/obj/structure/table/reinforced, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"vD" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"vK" = ( +/obj/machinery/door/airlock/grunge{ + name = "Syndicate Ship Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"vU" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"wb" = ( +/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/powered/virtual_domain) +"we" = ( +/turf/closed/mineral/random/high_chance, +/area/space) +"wK" = ( +/obj/machinery/door/airlock/grunge{ + name = "Syndicate Ship Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"wL" = ( +/obj/structure/table/reinforced, +/obj/item/storage/medkit/regular, +/obj/machinery/light/small/directional/north, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"xJ" = ( +/obj/structure/closet/syndicate{ + anchored = 1; + desc = "A basic closet for all your villainous needs."; + locked = 1; + name = "Closet"; + req_access = list("syndicate"); + secure = 1 + }, +/obj/item/ammo_box/c9mm, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"xZ" = ( +/obj/machinery/computer/camera_advanced/syndie{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"yl" = ( +/obj/machinery/door/airlock/grunge{ + name = "Captain's Room" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/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/powered/virtual_domain) +"yD" = ( +/mob/living/basic/syndicate/ranged/smg/space/stormtrooper, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"yJ" = ( +/obj/structure/table/reinforced, +/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"yR" = ( +/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/powered/virtual_domain) +"yT" = ( +/obj/item/ai_module/core/full/cybersun, +/obj/structure/table/reinforced, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"yV" = ( +/obj/structure/table/reinforced, +/obj/item/assembly/prox_sensor, +/obj/item/assembly/prox_sensor, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"yZ" = ( +/turf/closed/mineral, +/area/space) +"zi" = ( +/obj/machinery/vending/cigarette/syndicate, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"zt" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"Aa" = ( +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"AN" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/mob/living/basic/syndicate/ranged/smg/space/stormtrooper, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"Bm" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/indestructible/syndicate, +/area/ruin/space/has_grav/powered/virtual_domain) +"BK" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/turf/open/space/basic, +/area/space) +"BN" = ( +/obj/structure/transit_tube/crossing, +/turf/template_noop, +/area/virtual_domain/safehouse) +"Cf" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"Ci" = ( +/obj/structure/closet/syndicate{ + anchored = 1; + desc = "A basic closet for all your villainous needs."; + locked = 1; + name = "Closet"; + req_access = list("syndicate"); + 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/powered/virtual_domain) +"Cn" = ( +/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/powered/virtual_domain) +"CK" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/mob/living/basic/syndicate/ranged/smg/pilot, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"CR" = ( +/obj/structure/closet/syndicate{ + anchored = 1; + desc = "A basic closet for all your villainous needs."; + locked = 1; + name = "Closet"; + req_access = list("syndicate"); + secure = 1 + }, +/obj/item/coin/antagtoken, +/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/powered/virtual_domain) +"De" = ( +/obj/machinery/door/airlock/grunge{ + name = "Syndicate Ship Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"Dj" = ( +/obj/structure/table/reinforced, +/obj/item/ammo_box/magazine/smgm45, +/obj/item/ammo_box/magazine/smgm45, +/obj/item/ammo_box/magazine/smgm45, +/obj/item/gun/ballistic/automatic/c20r/unrestricted, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"DA" = ( +/obj/structure/closet/crate/secure/gear{ + req_access = list("syndicate") + }, +/obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"EB" = ( +/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/powered/virtual_domain) +"EX" = ( +/mob/living/basic/syndicate/ranged/shotgun/space/stormtrooper, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"Fp" = ( +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"FN" = ( +/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/powered/virtual_domain) +"Gn" = ( +/obj/structure/chair/comfy{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"Gs" = ( +/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/powered/virtual_domain) +"GB" = ( +/obj/structure/cable, +/obj/machinery/door/airlock/external/ruin{ + name = "Syndicate Ship Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"GZ" = ( +/obj/machinery/door/airlock/external/ruin{ + name = "Syndicate Ship Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"Hq" = ( +/turf/closed/indestructible/binary, +/area/space) +"HU" = ( +/obj/machinery/door/airlock/grunge{ + name = "Bridge" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"Ia" = ( +/obj/effect/mob_spawn/ghost_role/human/syndicatespace/captain, +/turf/open/floor/carpet/royalblack, +/area/ruin/space/has_grav/powered/virtual_domain) +"Id" = ( +/obj/machinery/power/shuttle_engine/huge{ + dir = 8 + }, +/turf/open/space/basic, +/area/ruin/space/has_grav/powered/virtual_domain) +"If" = ( +/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/powered/virtual_domain) +"Ig" = ( +/obj/machinery/porta_turret/syndicate/energy{ + dir = 4; + name = "Syndicate Ship Turret"; + on = 0; + shot_delay = 10 + }, +/turf/closed/wall/r_wall/syndicate/nodiagonal, +/area/ruin/space/has_grav/powered/virtual_domain) +"Im" = ( +/obj/structure/table/reinforced, +/obj/item/ammo_box/c9mm, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"Io" = ( +/obj/effect/landmark/bitrunning/cache_spawn, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"IC" = ( +/obj/structure/table/reinforced, +/obj/item/paper, +/obj/item/pen, +/turf/open/floor/carpet/royalblack, +/area/ruin/space/has_grav/powered/virtual_domain) +"IH" = ( +/obj/machinery/door/airlock/external/ruin{ + name = "Syndicate Ship Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/structure/cable, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/ruin/space/has_grav/powered/virtual_domain) +"IV" = ( +/obj/machinery/door/airlock/grunge{ + name = "Syndicate Ship Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/plating, +/area/ruin/space/has_grav/powered/virtual_domain) +"Jg" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"Jz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 5 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"JA" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"JN" = ( +/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/powered/virtual_domain) +"JP" = ( +/obj/structure/sink/directional/south, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"Kz" = ( +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"Lk" = ( +/obj/structure/transit_tube/crossing, +/turf/closed/mineral/random, +/area/space) +"Lo" = ( +/obj/structure/filingcabinet, +/obj/machinery/door/window{ + dir = 8; + name = "Syndicate Interior Door"; + req_access = list("syndicate") + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"Mc" = ( +/obj/structure/closet/syndicate{ + anchored = 1; + desc = "A basic closet for all your villainous needs."; + locked = 1; + name = "Closet"; + req_access = list("syndicate"); + 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/powered/virtual_domain) +"Mm" = ( +/obj/structure/closet/syndicate{ + anchored = 1; + desc = "A basic closet for all your villainous needs."; + locked = 1; + name = "Closet"; + req_access = list("syndicate"); + secure = 1 + }, +/obj/item/clothing/head/hats/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/powered/virtual_domain) +"MR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"Nm" = ( +/obj/structure/closet/crate/secure/gear{ + req_access = list("syndicate") + }, +/turf/open/floor/pod/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"Nr" = ( +/obj/structure/closet/crate/secure/gear{ + req_access = list("syndicate") + }, +/obj/item/stack/sheet/mineral/gold{ + amount = 30 + }, +/obj/item/stack/sheet/mineral/silver{ + amount = 30 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/pod/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"Nt" = ( +/obj/structure/table/reinforced, +/obj/machinery/atmospherics/components/unary/vent_pump, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"Of" = ( +/obj/structure/closet/crate/secure/gear{ + req_access = list("syndicate") + }, +/obj/item/disk/surgery/forgottenship, +/turf/open/floor/pod/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"Ox" = ( +/obj/machinery/atmospherics/components/unary/vent_pump, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"OH" = ( +/obj/structure/cable, +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/syndicate, +/obj/item/storage/toolbox/syndicate, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"OI" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"PR" = ( +/obj/machinery/door/password/voice/sfc{ + password = null + }, +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/grunge{ + desc = "Vault airlock preventing air from going out."; + name = "Syndicate Vault Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/pod/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"Qg" = ( +/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/powered/virtual_domain) +"Qi" = ( +/obj/item/stack/sheet/mineral/uranium{ + amount = 15 + }, +/obj/structure/cable, +/obj/machinery/light/small/directional/north, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"QF" = ( +/obj/structure/table/reinforced, +/obj/item/dualsaber/green, +/obj/machinery/light/small/directional/east, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"QG" = ( +/obj/structure/tank_dispenser/oxygen, +/turf/closed/mineral/random, +/area/space) +"QX" = ( +/mob/living/basic/syndicate/ranged/space/stormtrooper, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"Ra" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2, +/obj/machinery/light/small/directional/north, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"RQ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"RU" = ( +/obj/machinery/suit_storage_unit/syndicate, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"Sc" = ( +/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/powered/virtual_domain) +"Sd" = ( +/obj/structure/closet/syndicate{ + anchored = 1; + desc = "A basic closet for all your villainous needs."; + locked = 1; + name = "Closet"; + req_access = list("syndicate"); + secure = 1 + }, +/obj/item/crowbar/red, +/obj/item/ammo_box/magazine/m9mm, +/obj/item/ammo_box/magazine/m9mm, +/obj/machinery/light/small/directional/north, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"Sq" = ( +/obj/machinery/power/smes, +/obj/structure/cable, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"Sv" = ( +/obj/structure/closet/crate/secure/gear{ + req_access = list("syndicate") + }, +/obj/effect/spawner/random/food_or_drink/donkpockets, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"Sz" = ( +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"SX" = ( +/obj/machinery/vending/medical/syndicate_access/cybersun, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/powered/virtual_domain) +"TB" = ( +/turf/closed/indestructible/syndicate, +/area/ruin/space/has_grav/powered/virtual_domain) +"UQ" = ( +/obj/structure/sign/poster/contraband/syndicate_recruitment, +/turf/closed/wall/r_wall/syndicate, +/area/ruin/space/has_grav/powered/virtual_domain) +"Vk" = ( +/obj/machinery/porta_turret/syndicate/energy{ + dir = 4; + name = "Syndicate Ship Turret"; + on = 0; + shot_delay = 10 + }, +/turf/closed/wall/r_wall/syndicate, +/area/ruin/space/has_grav/powered/virtual_domain) +"Vq" = ( +/obj/structure/transit_tube/station/dispenser/reverse{ + dir = 8 + }, +/turf/template_noop, +/area/virtual_domain/safehouse) +"Wd" = ( +/obj/structure/sign/poster/contraband/tools, +/turf/closed/wall/r_wall/syndicate, +/area/ruin/space/has_grav/powered/virtual_domain) +"Wy" = ( +/obj/structure/closet/crate/secure/gear{ + req_access = list("syndicate") + }, +/obj/item/stack/ore/plasma{ + amount = 19 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"WR" = ( +/obj/machinery/power/port_gen/pacman/super{ + anchored = 1 + }, +/obj/structure/cable, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"Xp" = ( +/turf/open/space/basic, +/area/ruin/space/has_grav/powered/virtual_domain) +"XS" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"Yb" = ( +/obj/structure/closet/crate/secure/gear{ + req_access = list("syndicate") + }, +/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/virtual_domain) +"Yi" = ( +/obj/effect/landmark/bitrunning/cache_spawn, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/powered/virtual_domain) +"Yj" = ( +/obj/structure/closet/crate/secure/gear{ + req_access = list("syndicate") + }, +/obj/item/stack/ore/diamond{ + amount = 3 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) +"Yk" = ( +/obj/machinery/door/airlock/grunge{ + name = "Captain's Room" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/machinery/door/poddoor{ + id = "fscaproom"; + name = "Captain's Blast Door"; + state_open = 1 + }, +/turf/open/floor/carpet/royalblack, +/area/ruin/space/has_grav/powered/virtual_domain) +"Yr" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/template_noop, +/area/virtual_domain/safehouse) +"Yu" = ( +/obj/structure/chair/comfy/black, +/turf/open/floor/carpet/royalblack, +/area/ruin/space/has_grav/powered/virtual_domain) +"YV" = ( +/obj/structure/sink/directional/south, +/obj/structure/mirror/directional/west, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"Za" = ( +/obj/machinery/computer/operating, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/powered/virtual_domain) +"Zb" = ( +/turf/open/floor/plastic, +/area/ruin/space/has_grav/powered/virtual_domain) +"ZA" = ( +/obj/machinery/power/shuttle_engine/propulsion{ + dir = 8 + }, +/turf/open/space/basic, +/area/ruin/space/has_grav/powered/virtual_domain) + +(1,1,1) = {" +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +"} +(2,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(3,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(4,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(5,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(6,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(7,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +we +we +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(8,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +we +we +we +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(9,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +we +we +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(10,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Xp +Xp +Id +qx +qx +Xp +Xp +Id +qx +qx +Xp +Xp +Id +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(11,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Xp +Xp +Xp +qx +qx +Xp +Xp +Xp +qx +qx +Xp +Xp +Xp +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(12,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +ZA +Xp +Xp +Xp +ZA +ZA +Xp +Xp +Xp +ZA +ZA +Xp +Xp +Xp +ZA +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +we +we +we +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(13,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +ru +ru +ru +ru +ru +ru +ru +ru +ru +ru +ru +ru +ru +ru +ru +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +we +we +we +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(14,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +Vk +ru +Sv +vD +uP +uP +Yj +vD +uP +Wy +DA +uP +QX +vD +cc +ru +Vk +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(15,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +ru +Io +uP +uP +QX +lN +uP +uP +uP +uP +uP +lN +uP +uP +uP +uP +hA +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(16,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +ru +ru +ru +ru +ru +ru +ru +ru +IV +ru +ru +ru +IV +ru +ru +ru +ru +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(17,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +ru +ru +vp +ru +Ia +Ci +ru +Sq +di +WR +ru +yV +Gn +uP +Mc +uP +ru +qx +qx +qx +qx +qx +qx +qx +qx +qx +nB +we +nB +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(18,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +ru +vp +Jg +ru +bh +cR +ru +Qi +sz +Kz +ru +Mc +gD +yD +uP +rP +ru +qx +qx +qx +qx +qx +qx +qx +nB +nB +nB +nB +nB +nB +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(19,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +ru +sH +Kz +yl +oZ +bh +Yk +pS +RQ +Jz +vK +uP +uP +uP +sL +hy +ru +qx +qx +qx +qx +qx +qx +nB +nB +TB +TB +TB +TB +nB +nB +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(20,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +ru +CR +Kz +ru +bh +bh +Yk +pM +zt +pM +vK +uP +uP +EX +sL +Im +ru +qx +qx +qx +qx +qx +nB +nB +TB +TB +Yb +Yb +TB +Bm +nB +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(21,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +ru +yT +Kz +ru +Yu +IC +ru +mD +JN +MR +ru +Sd +gD +uP +uP +gD +ru +qx +qx +qx +qx +nB +QG +nB +TB +aN +bG +bG +sK +TB +nB +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(22,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +Ig +ru +Lo +ru +tv +ki +nU +wb +EB +pl +ru +hD +Gn +uP +Mc +ru +Ig +qx +qx +qx +qx +nB +we +nB +TB +iU +bG +bG +Nr +TB +nB +we +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(23,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +ru +ru +ru +ru +ru +ru +ru +cy +ru +ru +ru +ru +ru +ru +ru +qx +qx +qx +qx +qx +qx +nB +nB +TB +Nm +bG +bG +Of +TB +nB +nB +qx +qx +qx +qx +qx +qx +qx +sM +sM +sM +sM +sM +kJ +qx +Hq +"} +(24,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +ru +Za +Yi +Zb +SX +ru +uP +yR +uP +ru +YV +Sz +jJ +fG +ru +qx +qx +qx +qx +qx +nB +nB +nB +TB +TB +PR +TB +TB +TB +nB +nB +nB +qx +qx +qx +qx +qx +qx +sM +sM +sM +sM +sM +sM +qx +Hq +"} +(25,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +ru +qf +Zb +ip +da +ru +Ra +Sc +uP +ru +JP +qY +ru +ru +ru +qx +qx +qx +qx +qx +nB +nB +we +ru +ru +uP +sg +ru +ru +nB +nB +nB +nB +qx +qx +qx +qx +qx +sM +sM +sM +sM +sM +sM +qx +Hq +"} +(26,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +ru +aq +cB +Zb +Zb +De +Ox +Gs +uP +wK +Sz +Sz +jJ +pU +ru +qx +qx +qx +qx +qx +qx +nB +nB +qU +Fp +uP +uP +li +cj +Lk +Lk +fd +fd +fd +fd +fd +fd +fd +BN +Vq +sM +sM +sM +sM +qx +Hq +"} +(27,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +Vk +ru +ru +ru +ru +ru +ru +ru +kh +ru +ru +ru +ru +ru +ru +ru +Vk +qx +qx +qx +qx +qx +nB +nB +ru +eB +uP +nO +uP +ru +nB +qx +qx +qx +qx +qx +qx +qx +qx +sM +sM +sM +sM +sM +sM +qx +Hq +"} +(28,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +ru +jl +rm +ru +nk +oM +oM +oM +yR +oM +oM +oM +uP +ru +uP +Qg +ru +qx +qx +qx +qx +qx +qx +nB +ru +wL +oM +uP +dw +ru +yZ +nB +nB +nB +qx +qx +qx +qx +qx +sM +sM +sM +sM +sM +sM +qx +Hq +"} +(29,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +ru +uP +dw +ru +rH +uP +AN +JA +iX +JA +JA +oM +uP +ru +fJ +Qg +ru +qx +qx +qx +qx +qx +qx +qx +Wd +OH +oM +uP +RU +ru +we +nB +nB +qx +qx +qx +qx +qx +qx +sM +sM +sM +sM +sM +Yr +qx +Hq +"} +(30,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +lo +uP +uP +GZ +uP +Aa +hD +yJ +bD +hD +hD +OI +oM +GB +jA +oM +dU +BK +BK +BK +BK +BK +BK +BK +IH +oM +oM +uP +RU +ru +nB +nB +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(31,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +ru +uP +uP +dd +uP +Aa +hD +Nt +aw +hD +hD +bo +uP +dd +uP +Qg +ru +qx +qx +qx +qx +qx +qx +qx +iL +cZ +uP +uP +RU +ru +nB +nB +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(32,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +ru +aO +uP +ru +XS +uP +uP +hD +aZ +hD +uP +uP +Cf +ru +uP +Fp +ru +qx +qx +qx +qx +qx +qx +nB +ru +ru +Dj +QF +ru +ru +nB +nB +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(33,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +Ig +ru +hD +ru +zi +uP +uP +uP +FN +Cn +uP +uP +uP +ru +hD +ru +Ig +qx +qx +qx +qx +qx +nB +nB +nB +ru +ru +ru +ru +nB +nB +we +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(34,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +ru +ru +ru +ru +ru +ru +ru +HU +ru +ru +ru +ru +ru +ru +ru +qx +qx +qx +qx +qx +qx +qx +nB +nB +nB +nB +we +nB +nB +nB +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(35,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +UQ +rM +xJ +Kz +Kz +tI +Kz +Kz +ct +xJ +ru +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +we +nB +nB +nB +nB +nB +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(36,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +ru +ru +ru +ru +Kz +Kz +Kz +Kz +tI +Kz +Kz +Kz +Kz +ru +ru +ru +ru +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(37,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +ru +ln +Kz +ru +iB +Kz +Kz +fV +If +Kz +Kz +Kz +nG +ru +cw +cw +ru +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(38,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +ru +Kz +dz +sq +Kz +CK +Kz +vU +mo +vU +Kz +CK +Kz +ja +Kz +Jg +ru +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(39,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +Ig +ru +Kz +ru +Kz +pz +Kz +xZ +Kz +fM +Kz +kI +Kz +ru +Mm +ru +Ig +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(40,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +ru +ru +ru +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +Kz +ru +ru +ru +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(41,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +ru +ru +vp +vp +pH +vp +iW +vp +vp +vp +vp +ru +ru +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +we +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(42,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Ig +hg +hg +hg +hg +hg +hg +hg +hg +hg +Ig +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +we +we +we +we +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(43,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +we +we +we +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(44,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +we +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(45,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +we +we +we +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(46,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +we +we +we +we +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(47,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +we +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(48,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(49,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(50,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(51,1,1) = {" +Hq +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +qx +Hq +"} +(52,1,1) = {" +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +Hq +"} diff --git a/_maps/virtual_domains/test_only.dmm b/_maps/virtual_domains/test_only.dmm new file mode 100644 index 0000000000000..22b647188b6e1 --- /dev/null +++ b/_maps/virtual_domains/test_only.dmm @@ -0,0 +1,52 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor, +/area/virtual_domain/powered) +"D" = ( +/obj/effect/mob_spawn/corpse/human/miner, +/turf/open/floor, +/area/virtual_domain/powered) +"I" = ( +/mob/living/basic/pet/dog/corgi, +/turf/open/floor, +/area/virtual_domain/powered) +"U" = ( +/obj/effect/landmark/bitrunning/safehouse_spawn, +/turf/open/floor, +/area/virtual_domain/safehouse) + +(1,1,1) = {" +I +a +a +a +U +"} +(2,1,1) = {" +D +a +a +a +a +"} +(3,1,1) = {" +a +a +a +a +a +"} +(4,1,1) = {" +a +a +a +a +a +"} +(5,1,1) = {" +a +a +a +a +a +"} diff --git a/_maps/virtual_domains/vaporwave.dmm b/_maps/virtual_domains/vaporwave.dmm new file mode 100644 index 0000000000000..984bbbe291489 --- /dev/null +++ b/_maps/virtual_domains/vaporwave.dmm @@ -0,0 +1,1017 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aA" = ( +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating{ + initial_gas_mix = "TEMP=2.7" + }, +/area/ruin/space/has_grav/powered/virtual_domain) +"bs" = ( +/obj/effect/turf_decal/sand, +/turf/open/floor/iron/airless, +/area/ruin/space/has_grav/powered/virtual_domain) +"bF" = ( +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating{ + initial_gas_mix = "TEMP=2.7" + }, +/area/ruin/space/has_grav/powered/virtual_domain) +"cz" = ( +/turf/open/misc/asteroid/airless, +/area/ruin/space/has_grav/powered/virtual_domain) +"cL" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/cup/glass/drinkingglass{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass, +/obj/item/reagent_containers/cup/glass/drinkingglass{ + pixel_x = -6; + pixel_y = 8 + }, +/turf/open/floor/iron/vaporwave, +/area/ruin/space/has_grav/powered/virtual_domain) +"df" = ( +/obj/effect/turf_decal/sand, +/turf/open/floor/iron/airless{ + icon_state = "stairs-l" + }, +/area/ruin/space/has_grav/powered/virtual_domain) +"eF" = ( +/turf/closed/indestructible/binary, +/area/space) +"fx" = ( +/obj/item/statuebust, +/turf/open/floor/iron/vaporwave, +/area/ruin/space/has_grav/powered/virtual_domain) +"fQ" = ( +/obj/structure/flora/tree/palm, +/turf/open/floor/holofloor/beach, +/area/ruin/space/has_grav/powered/virtual_domain) +"gM" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/glasses/sunglasses/big{ + name = "aesthetic sunglasses" + }, +/turf/open/floor/iron/vaporwave, +/area/ruin/space/has_grav/powered/virtual_domain) +"hN" = ( +/turf/open/floor/holofloor/beach, +/area/ruin/space/has_grav/powered/virtual_domain) +"il" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/sand, +/turf/open/floor/iron/airless, +/area/ruin/space/has_grav/powered/virtual_domain) +"iP" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/turf/template_noop, +/area/virtual_domain/safehouse) +"kj" = ( +/obj/structure/window/spawner/directional/east, +/obj/structure/closet/crate/secure/bitrunning/encrypted, +/turf/open/floor/iron/vaporwave, +/area/ruin/space/has_grav/powered/virtual_domain) +"ku" = ( +/turf/template_noop, +/area/virtual_domain/safehouse) +"kF" = ( +/obj/effect/turf_decal/sand, +/turf/open/floor/iron/airless{ + icon_state = "stairs-r" + }, +/area/ruin/space/has_grav/powered/virtual_domain) +"ll" = ( +/obj/structure/sign/poster/contraband/clown/directional/north, +/turf/open/floor/iron/vaporwave, +/area/ruin/space/has_grav/powered/virtual_domain) +"lu" = ( +/turf/closed/wall/rust, +/area/ruin/space/has_grav/powered/virtual_domain) +"lB" = ( +/obj/item/tank/internals/emergency_oxygen, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/tank/internals/emergency_oxygen, +/turf/template_noop, +/area/virtual_domain/safehouse) +"lI" = ( +/obj/structure/table/reinforced, +/obj/machinery/chem_dispenser/drinks/beer/fullupgrade, +/turf/open/floor/iron/vaporwave, +/area/ruin/space/has_grav/powered/virtual_domain) +"qm" = ( +/obj/structure/flora/tree/palm, +/obj/machinery/light/directional/west, +/turf/open/floor/holofloor/beach, +/area/ruin/space/has_grav/powered/virtual_domain) +"qu" = ( +/turf/open/floor/holofloor/beach/water, +/area/ruin/space/has_grav/powered/virtual_domain) +"rn" = ( +/obj/structure/statue/sandstone/venus{ + anchored = 1; + dir = 4 + }, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating{ + initial_gas_mix = "TEMP=2.7" + }, +/area/ruin/space/has_grav/powered/virtual_domain) +"xb" = ( +/obj/structure/chair/stool/directional/west, +/turf/open/floor/iron/vaporwave, +/area/ruin/space/has_grav/powered/virtual_domain) +"xp" = ( +/obj/structure/table/reinforced, +/turf/open/floor/iron/vaporwave, +/area/ruin/space/has_grav/powered/virtual_domain) +"xK" = ( +/turf/closed/wall, +/area/ruin/space/has_grav/powered/virtual_domain) +"ym" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) +"AX" = ( +/obj/effect/turf_decal/stripes/asteroid/line, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating{ + initial_gas_mix = "TEMP=2.7" + }, +/area/ruin/space/has_grav/powered/virtual_domain) +"Cq" = ( +/obj/item/instrument/eguitar, +/turf/open/floor/holofloor/beach, +/area/ruin/space/has_grav/powered/virtual_domain) +"CR" = ( +/turf/open/floor/iron/vaporwave, +/area/ruin/space/has_grav/powered/virtual_domain) +"Dk" = ( +/obj/structure/window/spawner/directional/east, +/turf/open/floor/iron/vaporwave, +/area/ruin/space/has_grav/powered/virtual_domain) +"Es" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/iron/vaporwave, +/area/ruin/space/has_grav/powered/virtual_domain) +"Fd" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/wall/rust, +/area/ruin/space/has_grav/powered/virtual_domain) +"Hf" = ( +/obj/effect/turf_decal/sand, +/turf/open/floor/iron/airless{ + icon_state = "recharge_floor_asteroid" + }, +/area/ruin/space/has_grav/powered/virtual_domain) +"HA" = ( +/turf/open/floor/holofloor/beach/coast, +/area/ruin/space/has_grav/powered/virtual_domain) +"HV" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/vaporwave, +/area/ruin/space/has_grav/powered/virtual_domain) +"Jr" = ( +/obj/structure/window/spawner/directional/west, +/turf/open/floor/iron/vaporwave, +/area/ruin/space/has_grav/powered/virtual_domain) +"KO" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/iron/vaporwave, +/area/ruin/space/has_grav/powered/virtual_domain) +"KY" = ( +/obj/effect/turf_decal/sand, +/turf/open/floor/iron/airless{ + icon_state = "stairs-m" + }, +/area/ruin/space/has_grav/powered/virtual_domain) +"LG" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/template_noop, +/area/virtual_domain/safehouse) +"LJ" = ( +/obj/structure/lattice, +/turf/open/misc/asteroid/airless, +/area/ruin/space/has_grav/powered/virtual_domain) +"LP" = ( +/obj/structure/flora/tree/palm, +/obj/machinery/light/directional/east, +/turf/open/floor/holofloor/beach, +/area/ruin/space/has_grav/powered/virtual_domain) +"Nz" = ( +/obj/structure/window/spawner/directional/east, +/obj/structure/table/reinforced, +/obj/item/storage/fancy/cigarettes/cigars/havana, +/obj/effect/spawner/random/entertainment/lighter, +/turf/open/floor/iron/vaporwave, +/area/ruin/space/has_grav/powered/virtual_domain) +"NT" = ( +/turf/open/space/basic, +/area/space) +"Qh" = ( +/obj/structure/closet/crate/bin, +/turf/open/misc/asteroid/airless, +/area/ruin/space/has_grav/powered/virtual_domain) +"Uy" = ( +/obj/effect/landmark/bitrunning/safehouse_spawn, +/turf/template_noop, +/area/virtual_domain/safehouse) +"UE" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating{ + initial_gas_mix = "TEMP=2.7" + }, +/area/ruin/space/has_grav/powered/virtual_domain) +"UV" = ( +/obj/structure/lattice, +/turf/open/floor/plating/airless, +/area/ruin/space/has_grav/powered/virtual_domain) +"Vc" = ( +/obj/structure/flora/tree/palm, +/turf/open/misc/asteroid/airless, +/area/ruin/space/has_grav/powered/virtual_domain) +"XJ" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/hatch, +/turf/open/floor/pod/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"Yo" = ( +/obj/structure/statue/sandstone/venus{ + anchored = 1; + desc = "Ugh, this is merely an ugly amateurish replica of the other statue! The letters RIPGOAT are scribbled onto the base."; + dir = 8 + }, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating{ + initial_gas_mix = "TEMP=2.7" + }, +/area/ruin/space/has_grav/powered/virtual_domain) +"YE" = ( +/mob/living/basic/butterfly, +/turf/open/floor/iron/vaporwave, +/area/ruin/space/has_grav/powered/virtual_domain) +"ZI" = ( +/obj/effect/spawner/random/structure/musician/piano/random_piano, +/obj/structure/window/spawner/directional/west, +/turf/open/floor/iron/vaporwave, +/area/ruin/space/has_grav/powered/virtual_domain) + +(1,1,1) = {" +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +"} +(2,1,1) = {" +eF +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +eF +"} +(3,1,1) = {" +eF +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +eF +"} +(4,1,1) = {" +eF +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +eF +"} +(5,1,1) = {" +eF +NT +NT +NT +NT +NT +NT +cz +LJ +cz +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +eF +"} +(6,1,1) = {" +eF +NT +NT +NT +NT +NT +cz +cz +LJ +cz +cz +LJ +cz +cz +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +eF +"} +(7,1,1) = {" +eF +NT +NT +NT +NT +cz +cz +cz +UV +LJ +cz +UV +cz +cz +cz +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +eF +"} +(8,1,1) = {" +eF +NT +NT +NT +NT +cz +xK +xK +lu +lu +lu +xK +lu +UE +cz +cz +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +eF +"} +(9,1,1) = {" +eF +NT +NT +NT +LJ +Qh +xK +fQ +hN +qm +HA +qu +xK +aA +cz +cz +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +eF +"} +(10,1,1) = {" +eF +NT +NT +NT +LJ +UV +lu +ZI +Jr +Jr +Jr +Jr +xK +bF +Vc +cz +cz +NT +NT +NT +ku +ku +ku +ku +ku +Uy +NT +eF +"} +(11,1,1) = {" +eF +NT +NT +NT +cz +cz +xK +xb +CR +CR +fx +CR +xK +Yo +il +UE +cz +NT +NT +NT +ku +iP +iP +iP +ku +ku +NT +eF +"} +(12,1,1) = {" +eF +NT +NT +NT +cz +cz +xK +ll +CR +CR +CR +CR +xK +Hf +df +il +cz +NT +NT +NT +ku +ku +ku +ku +ku +ku +NT +eF +"} +(13,1,1) = {" +eF +NT +NT +NT +cz +LJ +xK +HV +Es +CR +CR +CR +XJ +bs +KY +bs +il +NT +NT +NT +ku +ku +ku +ku +ku +ku +NT +eF +"} +(14,1,1) = {" +eF +NT +NT +NT +cz +LJ +lu +xp +gM +CR +CR +cL +xK +Hf +kF +bs +il +NT +NT +NT +ku +ku +ku +ku +ku +ku +NT +eF +"} +(15,1,1) = {" +eF +NT +NT +NT +cz +LJ +lu +KO +KO +CR +YE +lI +lu +rn +il +UE +UE +NT +NT +NT +ku +ku +ku +ku +lB +ku +NT +eF +"} +(16,1,1) = {" +eF +NT +NT +NT +LJ +UV +xK +kj +Dk +Dk +Dk +Nz +xK +AX +Vc +cz +cz +NT +NT +NT +ku +ku +ku +ku +ku +LG +NT +eF +"} +(17,1,1) = {" +eF +NT +NT +NT +cz +cz +lu +fQ +Cq +LP +HA +qu +lu +aA +cz +cz +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +eF +"} +(18,1,1) = {" +eF +NT +NT +NT +cz +cz +xK +xK +lu +xK +lu +lu +Fd +UE +cz +cz +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +eF +"} +(19,1,1) = {" +eF +NT +NT +NT +NT +cz +cz +cz +UV +LJ +Qh +UV +cz +cz +cz +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +eF +"} +(20,1,1) = {" +eF +NT +NT +NT +NT +NT +NT +cz +LJ +cz +cz +LJ +cz +cz +cz +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +eF +"} +(21,1,1) = {" +eF +NT +NT +NT +NT +NT +NT +NT +ym +cz +cz +cz +cz +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +eF +"} +(22,1,1) = {" +eF +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +eF +"} +(23,1,1) = {" +eF +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +eF +"} +(24,1,1) = {" +eF +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +NT +eF +"} +(25,1,1) = {" +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +"} diff --git a/_maps/virtual_domains/wendigo.dmm b/_maps/virtual_domains/wendigo.dmm new file mode 100644 index 0000000000000..17bcb48d688bf --- /dev/null +++ b/_maps/virtual_domains/wendigo.dmm @@ -0,0 +1,1373 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"b" = ( +/turf/closed/indestructible/rock/snow/ice/ore, +/area/icemoon/underground/explored/virtual_domain) +"e" = ( +/turf/open/misc/asteroid/snow/ice/icemoon, +/area/icemoon/underground/explored/virtual_domain) +"f" = ( +/obj/structure/marker_beacon/olive, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"i" = ( +/turf/closed/indestructible/binary, +/area/icemoon/underground/explored/virtual_domain) +"o" = ( +/obj/structure/marker_beacon/indigo, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"p" = ( +/obj/structure/marker_beacon/bronze, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"q" = ( +/obj/structure/marker_beacon/yellow, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"t" = ( +/obj/structure/marker_beacon/teal, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"x" = ( +/obj/structure/marker_beacon/burgundy, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"A" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/template_noop, +/area/virtual_domain/safehouse) +"E" = ( +/obj/effect/mob_spawn/corpse/human/miner, +/turf/open/misc/asteroid/snow/ice/icemoon, +/area/icemoon/underground/explored/virtual_domain) +"H" = ( +/mob/living/simple_animal/hostile/megafauna/wendigo/virtual_domain, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"L" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/indestructible/binary, +/area/icemoon/underground/explored/virtual_domain) +"R" = ( +/obj/item/paper/crumpled/bloody{ + default_raw_text = "for your own sake, do not enter" + }, +/turf/open/misc/asteroid/snow/ice/icemoon, +/area/icemoon/underground/explored/virtual_domain) +"S" = ( +/turf/template_noop, +/area/template_noop) +"V" = ( +/turf/template_noop, +/area/virtual_domain/safehouse) +"Z" = ( +/obj/effect/landmark/bitrunning/safehouse_spawn, +/turf/template_noop, +/area/virtual_domain/safehouse) + +(1,1,1) = {" +S +S +S +S +S +S +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +S +S +S +S +S +S +S +S +S +S +S +S +S +S +"} +(2,1,1) = {" +S +S +S +S +S +i +i +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +i +i +S +S +S +S +S +S +S +S +S +S +S +S +S +"} +(3,1,1) = {" +S +S +S +S +i +i +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +i +i +S +S +S +S +S +S +S +S +S +S +S +S +"} +(4,1,1) = {" +S +S +S +i +i +e +e +e +b +b +b +b +b +e +e +e +b +b +b +b +b +e +e +e +i +i +S +S +S +S +S +S +S +S +S +S +S +"} +(5,1,1) = {" +S +S +i +i +e +e +e +b +b +b +b +b +b +b +e +b +b +b +b +b +b +b +e +e +e +i +i +i +i +i +i +i +i +i +i +i +L +"} +(6,1,1) = {" +S +i +i +e +e +e +b +b +b +b +b +b +b +b +e +b +b +b +b +b +b +b +b +e +e +e +i +i +e +e +e +e +e +e +e +e +i +"} +(7,1,1) = {" +i +i +e +e +e +b +b +b +b +b +b +b +b +b +e +b +b +b +b +b +b +b +b +b +e +e +e +i +e +e +e +e +e +e +e +e +i +"} +(8,1,1) = {" +i +e +e +e +b +b +b +b +b +b +a +a +a +a +a +a +a +a +a +b +b +b +b +b +b +e +e +e +e +e +e +e +e +e +e +e +i +"} +(9,1,1) = {" +i +e +e +b +b +b +b +b +b +a +a +a +a +a +a +a +a +a +a +a +b +b +b +b +b +b +e +e +e +e +e +e +e +e +e +e +i +"} +(10,1,1) = {" +i +e +e +b +b +b +b +b +a +a +a +a +a +a +a +a +a +a +a +a +a +b +b +b +b +b +e +e +e +e +e +e +e +e +e +e +i +"} +(11,1,1) = {" +i +e +E +b +b +b +b +a +a +a +a +a +a +a +a +a +a +a +a +o +a +a +b +b +b +b +e +e +e +e +e +e +e +e +e +e +i +"} +(12,1,1) = {" +i +e +e +b +b +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +b +b +e +e +e +e +e +e +e +e +e +e +i +"} +(13,1,1) = {" +i +e +e +b +b +b +a +a +a +a +q +a +a +a +a +a +a +a +a +a +a +a +a +b +b +b +e +e +e +e +e +e +e +e +e +e +i +"} +(14,1,1) = {" +i +e +e +b +b +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +b +b +e +e +e +V +V +V +V +V +Z +e +i +"} +(15,1,1) = {" +i +e +e +b +b +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +b +b +E +e +e +V +V +V +V +V +V +e +i +"} +(16,1,1) = {" +i +e +e +e +b +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +b +e +e +e +e +V +V +V +V +V +V +e +i +"} +(17,1,1) = {" +i +e +e +e +e +e +a +a +a +a +a +a +a +a +H +a +a +a +a +x +a +a +a +e +e +e +e +R +e +V +V +V +V +V +V +e +i +"} +(18,1,1) = {" +i +e +e +e +b +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +b +e +e +e +e +V +V +V +V +V +V +e +i +"} +(19,1,1) = {" +i +e +e +b +b +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +b +b +e +e +e +V +V +V +V +V +V +e +i +"} +(20,1,1) = {" +i +e +e +b +b +b +a +a +a +a +a +a +a +a +p +a +a +a +a +a +a +a +a +b +b +b +e +e +e +V +V +V +V +V +A +e +i +"} +(21,1,1) = {" +i +e +e +b +b +b +a +a +a +a +f +a +a +a +a +a +a +a +a +a +a +a +a +b +b +b +e +e +e +e +e +e +e +e +e +e +i +"} +(22,1,1) = {" +i +e +e +b +b +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +b +b +e +e +e +e +e +e +e +e +e +e +i +"} +(23,1,1) = {" +i +e +e +b +b +b +b +a +a +a +a +a +a +a +a +a +a +a +a +a +t +a +b +b +b +b +e +e +e +e +e +e +e +e +e +e +i +"} +(24,1,1) = {" +i +e +e +b +b +b +b +b +a +a +a +a +a +a +a +a +a +a +a +a +a +b +b +b +b +b +e +e +e +e +e +e +e +e +e +e +i +"} +(25,1,1) = {" +i +e +e +b +b +b +b +b +b +a +a +a +a +a +a +a +a +a +a +a +b +b +b +b +b +b +e +e +e +e +e +e +e +e +e +e +i +"} +(26,1,1) = {" +i +e +e +e +b +b +b +b +b +b +a +a +a +a +a +a +a +a +a +b +b +b +b +b +b +e +e +e +e +e +e +e +e +e +e +e +i +"} +(27,1,1) = {" +i +i +e +e +e +b +b +b +b +b +b +b +b +b +e +b +b +b +b +b +b +b +b +b +e +e +e +i +e +e +e +e +e +e +e +e +i +"} +(28,1,1) = {" +S +i +i +e +e +e +b +b +b +b +b +b +b +b +e +b +b +b +b +b +b +b +b +e +e +e +i +i +e +e +e +e +e +e +e +e +i +"} +(29,1,1) = {" +S +S +i +i +e +e +e +b +b +b +b +b +b +b +e +b +b +b +b +b +b +b +e +e +e +i +i +i +i +i +i +i +i +i +i +i +i +"} +(30,1,1) = {" +S +S +S +i +i +e +e +e +b +b +b +b +b +e +e +e +b +b +b +b +b +e +e +e +i +i +S +S +S +S +S +S +S +S +S +S +S +"} +(31,1,1) = {" +S +S +S +S +i +i +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +i +i +S +S +S +S +S +S +S +S +S +S +S +S +"} +(32,1,1) = {" +S +S +S +S +S +i +i +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +i +i +S +S +S +S +S +S +S +S +S +S +S +S +S +"} +(33,1,1) = {" +S +S +S +S +S +S +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +S +S +S +S +S +S +S +S +S +S +S +S +S +S +"} diff --git a/_maps/virtual_domains/xeno_nest.dmm b/_maps/virtual_domains/xeno_nest.dmm new file mode 100644 index 0000000000000..fcbd7cc116c91 --- /dev/null +++ b/_maps/virtual_domains/xeno_nest.dmm @@ -0,0 +1,2071 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"c" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/resin/wall, +/obj/structure/alien/resin/wall, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/space/has_grav/powered/virtual_domain) +"d" = ( +/obj/structure/alien/resin/wall, +/turf/closed/indestructible/binary, +/area/ruin/space/has_grav/powered/virtual_domain) +"e" = ( +/obj/structure/alien/weeds, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/space/has_grav/powered/virtual_domain) +"f" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/egg/burst, +/obj/effect/decal/cleanable/blood, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/space/has_grav/powered/virtual_domain) +"h" = ( +/obj/structure/alien/weeds, +/mob/living/simple_animal/hostile/alien/sentinel, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/space/has_grav/powered/virtual_domain) +"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/space/has_grav/powered/virtual_domain) +"j" = ( +/obj/machinery/suit_storage_unit/spaceruin, +/turf/template_noop, +/area/virtual_domain/safehouse) +"k" = ( +/obj/structure/alien/weeds/node, +/obj/structure/alien/resin/wall, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/space/has_grav/powered/virtual_domain) +"l" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/resin/wall, +/turf/closed/indestructible/binary, +/area/ruin/space/has_grav/powered/virtual_domain) +"m" = ( +/obj/structure/alien/weeds, +/obj/structure/bed/nest, +/obj/structure/alien/resin/wall, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/space/has_grav/powered/virtual_domain) +"n" = ( +/turf/template_noop, +/area/virtual_domain/safehouse) +"o" = ( +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/space/has_grav/powered/virtual_domain) +"p" = ( +/obj/structure/alien/weeds, +/mob/living/simple_animal/hostile/alien/drone{ + plants_off = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/space/has_grav/powered/virtual_domain) +"q" = ( +/obj/structure/alien/resin/wall, +/turf/open/space/basic, +/area/ruin/space/has_grav/powered/virtual_domain) +"r" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/template_noop, +/area/virtual_domain/safehouse) +"s" = ( +/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/space/has_grav/powered/virtual_domain) +"t" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/weeds, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/space/has_grav/powered/virtual_domain) +"u" = ( +/obj/structure/alien/weeds/node, +/obj/effect/decal/cleanable/blood, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/space/has_grav/powered/virtual_domain) +"v" = ( +/obj/effect/landmark/bitrunning/safehouse_spawn, +/turf/template_noop, +/area/virtual_domain/safehouse) +"x" = ( +/obj/structure/alien/weeds, +/obj/structure/bed/nest, +/obj/effect/landmark/bitrunning/cache_spawn, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/space/has_grav/powered/virtual_domain) +"z" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/resin/wall, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/space/has_grav/powered/virtual_domain) +"A" = ( +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/ruin/space/has_grav/powered/virtual_domain) +"B" = ( +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/blood, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/space/has_grav/powered/virtual_domain) +"C" = ( +/obj/structure/alien/weeds, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/ruin/space/has_grav/powered/virtual_domain) +"D" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/weeds, +/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins, +/area/ruin/space/has_grav/powered/virtual_domain) +"E" = ( +/turf/closed/indestructible/binary, +/area/ruin/space/has_grav/powered/virtual_domain) +"F" = ( +/obj/structure/table/greyscale, +/obj/item/gun/energy/beam_rifle, +/obj/item/gun/energy/laser{ + pixel_x = 4; + pixel_y = -6 + }, +/obj/item/gun/energy/laser{ + pixel_x = -8; + pixel_y = 6 + }, +/turf/template_noop, +/area/virtual_domain/safehouse) +"G" = ( +/obj/structure/alien/resin/wall, +/obj/structure/alien/weeds, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/space/has_grav/powered/virtual_domain) +"H" = ( +/obj/structure/table/greyscale, +/obj/machinery/recharger{ + pixel_x = 8; + pixel_y = 4 + }, +/obj/machinery/recharger{ + pixel_x = -8; + pixel_y = 4 + }, +/turf/template_noop, +/area/virtual_domain/safehouse) +"I" = ( +/obj/structure/alien/weeds, +/obj/structure/bed/nest, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/space/has_grav/powered/virtual_domain) +"J" = ( +/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/space/has_grav/powered/virtual_domain) +"K" = ( +/obj/structure/alien/weeds, +/obj/effect/landmark/bitrunning/cache_spawn, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/space/has_grav/powered/virtual_domain) +"L" = ( +/obj/item/storage/medkit/regular, +/obj/item/storage/medkit/regular, +/turf/template_noop, +/area/virtual_domain/safehouse) +"M" = ( +/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/space/has_grav/powered/virtual_domain) +"N" = ( +/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/space/has_grav/powered/virtual_domain) +"O" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/indestructible/binary, +/area/ruin/space/has_grav/powered/virtual_domain) +"P" = ( +/obj/structure/alien/weeds/node, +/mob/living/simple_animal/hostile/alien, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/space/has_grav/powered/virtual_domain) +"Q" = ( +/obj/structure/alien/resin/wall, +/obj/structure/alien/resin/wall, +/turf/closed/indestructible/binary, +/area/ruin/space/has_grav/powered/virtual_domain) +"S" = ( +/obj/structure/alien/weeds, +/mob/living/simple_animal/hostile/alien, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/space/has_grav/powered/virtual_domain) +"T" = ( +/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/space/has_grav/powered/virtual_domain) +"U" = ( +/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/space/has_grav/powered/virtual_domain) +"V" = ( +/obj/structure/alien/weeds/node, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/space/has_grav/powered/virtual_domain) +"W" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/egg/burst, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/ruin/space/has_grav/powered/virtual_domain) +"Y" = ( +/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/space/has_grav/powered/virtual_domain) +"Z" = ( +/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/space/has_grav/powered/virtual_domain) + +(1,1,1) = {" +a +a +a +E +E +E +E +E +E +E +E +E +E +E +E +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +E +E +z +z +z +z +z +z +z +z +E +E +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(3,1,1) = {" +a +a +a +E +E +z +e +W +W +z +e +e +z +M +E +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(4,1,1) = {" +a +a +a +E +z +z +e +e +e +e +p +e +W +z +E +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(5,1,1) = {" +a +a +a +E +z +e +e +k +z +z +z +k +z +z +E +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(6,1,1) = {" +a +a +a +E +z +e +e +m +K +J +o +i +z +z +E +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(7,1,1) = {" +a +a +a +E +z +W +h +e +e +e +B +o +e +z +E +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(8,1,1) = {" +a +a +a +E +z +I +o +z +e +V +e +h +W +z +E +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(9,1,1) = {" +a +a +a +E +z +U +u +e +z +e +e +W +z +z +E +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(10,1,1) = {" +a +a +a +E +z +e +o +z +e +e +e +k +W +z +E +a +a +a +a +a +a +a +E +E +E +E +E +E +E +E +E +E +a +a +a +a +a +a +a +"} +(11,1,1) = {" +a +a +a +E +z +z +e +h +e +e +h +e +e +z +E +a +a +a +a +a +a +a +E +E +E +E +z +z +z +z +E +E +a +a +a +a +a +a +a +"} +(12,1,1) = {" +a +a +a +E +E +z +W +e +e +e +e +e +e +z +E +a +a +a +a +a +a +a +E +E +E +z +z +Z +I +z +z +E +a +a +a +a +a +a +a +"} +(13,1,1) = {" +a +a +a +E +E +z +z +e +e +V +e +e +z +z +E +a +a +a +a +a +a +a +E +E +z +z +W +o +Y +e +z +E +a +a +a +a +a +a +a +"} +(14,1,1) = {" +a +a +a +E +E +E +z +z +e +e +e +z +z +E +E +a +a +a +a +E +E +E +E +E +z +I +e +V +e +W +z +E +a +a +a +a +a +a +a +"} +(15,1,1) = {" +a +a +a +a +a +E +E +z +z +z +z +z +E +E +E +E +E +E +E +E +E +E +z +z +z +e +e +e +I +z +z +E +a +a +a +a +a +a +a +"} +(16,1,1) = {" +a +a +a +a +a +a +E +z +V +V +z +E +E +E +E +E +E +E +E +E +E +z +z +e +S +e +W +z +z +z +E +E +a +a +a +a +a +a +a +"} +(17,1,1) = {" +a +a +a +a +a +a +E +z +p +e +z +z +E +z +z +z +z +z +z +z +z +z +e +e +z +z +z +z +E +E +E +E +a +a +a +a +a +a +a +"} +(18,1,1) = {" +a +a +a +a +a +a +E +z +e +e +p +z +z +z +e +e +e +e +e +e +z +z +e +z +z +E +E +E +E +E +E +E +E +E +E +E +E +E +O +"} +(19,1,1) = {" +E +E +E +E +E +E +E +z +z +e +e +e +z +e +e +e +e +e +e +V +e +e +e +z +E +E +E +E +E +E +Q +d +q +q +q +q +q +q +E +"} +(20,1,1) = {" +E +z +z +z +z +E +E +E +z +z +e +V +e +e +e +z +z +z +z +e +e +t +z +z +E +E +a +a +a +E +q +A +A +A +A +A +A +A +E +"} +(21,1,1) = {" +E +z +W +I +z +z +z +z +z +z +e +e +e +e +z +z +E +E +z +z +e +e +z +E +E +E +a +a +a +E +q +A +A +A +A +A +A +A +E +"} +(22,1,1) = {" +E +G +t +S +e +z +z +e +e +e +e +e +e +z +z +E +E +E +z +e +e +e +z +E +E +E +a +a +a +E +q +A +C +A +A +A +A +A +E +"} +(23,1,1) = {" +E +G +K +W +V +e +e +e +z +z +e +z +z +z +E +E +E +E +z +e +e +z +z +E +E +a +a +a +a +E +q +C +C +C +A +A +A +A +E +"} +(24,1,1) = {" +E +z +z +I +I +z +z +z +z +z +e +z +E +E +E +E +E +E +z +e +e +z +E +E +E +E +E +E +E +E +d +C +C +A +A +C +A +A +E +"} +(25,1,1) = {" +E +E +z +z +z +z +E +E +E +z +p +z +z +E +E +E +E +E +z +e +s +z +z +z +E +E +E +E +E +E +z +C +C +C +A +C +C +A +E +"} +(26,1,1) = {" +a +E +E +E +E +E +E +E +E +z +e +e +z +E +E +E +E +E +z +e +e +e +e +z +z +z +E +E +E +z +z +n +n +n +n +n +v +A +E +"} +(27,1,1) = {" +a +a +a +a +a +E +E +z +z +z +e +e +z +z +E +E +E +E +z +z +e +e +e +e +e +z +z +z +z +k +e +n +j +j +j +n +n +A +E +"} +(28,1,1) = {" +a +a +a +a +a +E +z +z +T +e +e +V +W +z +E +E +E +z +z +e +e +z +z +e +e +e +z +V +e +e +e +n +n +n +n +n +n +A +E +"} +(29,1,1) = {" +a +a +a +a +a +E +z +N +f +S +e +W +I +z +E +E +E +z +e +e +z +z +z +z +e +V +z +V +t +e +e +n +n +F +H +n +n +A +E +"} +(30,1,1) = {" +a +a +a +a +a +E +z +x +o +e +I +I +z +z +E +E +E +z +e +z +z +E +E +z +z +z +z +z +k +e +e +n +n +n +n +n +n +A +E +"} +(31,1,1) = {" +a +a +a +a +a +E +z +z +z +e +z +z +z +E +E +E +E +z +e +z +z +E +E +E +E +E +E +E +z +e +e +n +L +n +n +n +n +A +E +"} +(32,1,1) = {" +a +a +a +a +a +E +E +E +z +e +z +E +E +E +E +E +E +z +e +e +z +E +a +a +a +a +E +E +z +e +e +n +n +n +n +n +r +A +E +"} +(33,1,1) = {" +a +a +a +a +a +a +a +E +z +e +z +E +E +a +a +a +E +l +z +V +z +E +a +a +a +a +E +z +z +z +q +C +A +A +C +A +A +A +E +"} +(34,1,1) = {" +a +a +a +a +a +a +a +E +z +V +z +E +E +a +a +a +E +E +z +e +z +E +a +a +a +a +E +z +E +d +q +C +C +C +A +A +A +A +E +"} +(35,1,1) = {" +a +a +a +a +a +a +a +E +z +e +z +E +E +a +a +a +E +E +z +e +z +E +a +a +a +a +E +E +E +d +q +A +A +A +A +A +A +A +E +"} +(36,1,1) = {" +a +a +a +a +a +a +a +E +z +e +z +E +E +E +E +E +E +z +z +e +z +E +a +a +a +a +a +a +E +d +q +A +C +D +A +A +A +A +E +"} +(37,1,1) = {" +a +a +a +a +E +E +E +E +z +e +z +E +E +E +E +E +z +z +e +e +z +E +a +a +a +a +a +a +E +d +q +A +A +A +A +A +A +A +E +"} +(38,1,1) = {" +a +a +a +a +E +E +E +z +z +e +z +z +z +z +z +z +z +e +e +z +z +E +a +a +a +a +a +a +E +d +q +A +A +A +A +A +A +A +E +"} +(39,1,1) = {" +a +a +a +a +E +E +z +z +e +e +W +z +z +e +e +P +e +e +z +z +E +E +a +a +a +a +a +a +E +Q +q +q +q +q +q +q +q +q +E +"} +(40,1,1) = {" +a +a +a +a +E +E +z +I +p +e +e +e +e +e +z +z +z +z +z +E +E +a +a +a +a +a +a +a +E +E +E +E +E +E +E +E +E +E +E +"} +(41,1,1) = {" +a +a +a +a +E +z +z +W +e +V +e +W +z +z +z +E +E +E +E +E +E +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(42,1,1) = {" +a +a +a +a +E +z +W +K +e +I +I +z +z +E +E +E +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(43,1,1) = {" +a +a +a +a +E +c +z +z +z +z +z +z +E +E +E +E +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(44,1,1) = {" +a +a +a +a +E +E +E +E +E +E +E +E +E +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index b6420551702fc..b9b8c19c15e1f 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -29,19 +29,18 @@ #define DNA_BLOCK_SIZE_COLOR DEFAULT_HEX_COLOR_LEN -#define DNA_EYE_COLOR_LEFT_BLOCK 4 +#define DNA_GENDER_BLOCK 1 +#define DNA_SKIN_TONE_BLOCK 2 +#define DNA_EYE_COLOR_LEFT_BLOCK 3 #define DNA_EYE_COLOR_RIGHT_BLOCK 4 -#define DNA_FACIAL_HAIR_COLOR_BLOCK 2 -#define DNA_FACIAL_HAIRSTYLE_BLOCK 6 -#define DNA_GENDER_BLOCK 5 -#define DNA_HAIR_COLOR_BLOCK 1 -#define DNA_HAIRSTYLE_BLOCK 7 -#define DNA_SKIN_TONE_BLOCK 3 -#define DNA_UNI_IDENTITY_BLOCKS 7 +#define DNA_HAIRSTYLE_BLOCK 5 +#define DNA_HAIR_COLOR_BLOCK 6 +#define DNA_FACIAL_HAIRSTYLE_BLOCK 7 +#define DNA_FACIAL_HAIR_COLOR_BLOCK 8 -/// This number needs to equal the total number of DNA blocks -#define DNA_FEATURE_BLOCKS 15 +#define DNA_UNI_IDENTITY_BLOCKS 8 +/// This number needs to equal the total number of DNA blocks #define DNA_MUTANT_COLOR_BLOCK 1 #define DNA_ETHEREAL_COLOR_BLOCK 2 #define DNA_LIZARD_MARKINGS_BLOCK 3 @@ -58,38 +57,12 @@ #define DNA_MUSHROOM_CAPS_BLOCK 14 #define DNA_POD_HAIR_BLOCK 15 +#define DNA_FEATURE_BLOCKS 15 + #define DNA_SEQUENCE_LENGTH 4 #define DNA_MUTATION_BLOCKS 8 #define DNA_UNIQUE_ENZYMES_LEN 32 -//species traits for mutantraces -#define MUTCOLORS 1 -#define HAIR 2 -#define FACEHAIR 3 -#define EYECOLOR 4 -#define LIPS 5 -#define NOTRANSSTING 7 -#define NOZOMBIE 8 -#define NO_UNDERWEAR 9 -#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 12 -#define AGENDER 13 -/// Do not draw eyes or eyeless overlay -#define NOEYESPRITES 14 -///If we have a limb-specific overlay sprite -#define HAS_MARKINGS 15 -/// Do not draw blood overlay -#define NOBLOODOVERLAY 16 -///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 17 -///will be assigned a universal vampire themed last name shared by their department. this is preferenced! -#define BLOOD_CLANS 18 -/// Similar to NOEYESPRITES but only excludes the eyeless overlay -#define NOEYEHOLES 19 - //organ slots #define ORGAN_SLOT_ADAMANTINE_RESONATOR "adamantine_resonator" #define ORGAN_SLOT_APPENDIX "appendix" @@ -146,9 +119,11 @@ #define CHROMOSOME_USED 2 //used for mob's genetic gender (mainly just for pronouns, members of sexed species with plural gender refer to their physique for the actual sprites, which is not genetic) +#define GENDERS 4 #define G_MALE 1 #define G_FEMALE 2 #define G_PLURAL 3 +#define G_NEUTER 4 /// Defines how a mob's organs_slot is ordered /// Exists so Life()'s organ process order is consistent diff --git a/code/__DEFINES/_helpers.dm b/code/__DEFINES/_helpers.dm index 59daf48edc7da..fdbfde608225c 100644 --- a/code/__DEFINES/_helpers.dm +++ b/code/__DEFINES/_helpers.dm @@ -17,6 +17,14 @@ /// Until a condition is true, sleep #define UNTIL(X) while(!(X)) stoplag() +/// Sleep if we haven't been deleted +/// Otherwise, return +#define SLEEP_NOT_DEL(time) \ + if(QDELETED(src)) { \ + return; \ + } \ + sleep(time); + #ifdef EXPERIMENT_515_DONT_CACHE_REF /// Takes a datum as input, returns its ref string #define text_ref(datum) ref(datum) diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm index e2a8d6df1599b..90726effb00fe 100644 --- a/code/__DEFINES/access.dm +++ b/code/__DEFINES/access.dm @@ -104,6 +104,8 @@ #define ACCESS_VAULT "vault" /// Access for the Quartermaster's personal quarters in mapping, as well as some other QM-related things. #define ACCESS_QM "qm" +/// Access for the bitrunning den +#define ACCESS_BIT_DEN "bit_den" /// General access for Science, allows for entry to the general hallways of Science, as well as the main lathe room. #define ACCESS_SCIENCE "science" @@ -188,6 +190,8 @@ /// BLOODCULT //Special, for anything that's basically internal #define ACCESS_BLOODCULT "bloodcult" +/// HUNTERS +#define ACCESS_HUNTER "hunter" /// - - - END ACCESS IDS - - - @@ -279,6 +283,7 @@ ACCESS_ATMOSPHERICS, \ ACCESS_AUX_BASE, \ ACCESS_BAR, \ + ACCESS_BIT_DEN, \ ACCESS_BRIG, \ ACCESS_BRIG_ENTRANCE, \ ACCESS_CARGO, \ @@ -290,6 +295,7 @@ ACCESS_ENGINE_EQUIP, \ ACCESS_ENGINEERING, \ ACCESS_EXTERNAL_AIRLOCKS, \ + ACCESS_GATEWAY, \ ACCESS_GENETICS, \ ACCESS_HYDROPONICS, \ ACCESS_JANITOR, \ @@ -336,7 +342,6 @@ ACCESS_CHANGE_IDS, \ ACCESS_COMMAND, \ ACCESS_EVA, \ - ACCESS_GATEWAY, \ ACCESS_KEYCARD_AUTH, \ ACCESS_MINISAT, \ ACCESS_RC_ANNOUNCE, \ @@ -390,7 +395,9 @@ ACCESS_AWAY_GENERIC4, \ ACCESS_AWAY_MAINTENANCE, \ ACCESS_AWAY_MEDICAL, \ + ACCESS_AWAY_SCIENCE, \ ACCESS_AWAY_SEC, \ + ACCESS_AWAY_SUPPLY, \ ) /// Weird internal Cult access that prevents non-cult from using their doors. Do not use direct, access via SSid_access.get_flag_access_list(ACCESS_FLAG_SPECIAL) @@ -487,6 +494,7 @@ #define REGION_SUPPLY "Supply" /// Used to seed the accesses_by_region list in SSid_access. A list of all cargo regional accesses that are overseen by the HoP. #define REGION_ACCESS_SUPPLY list( \ + ACCESS_BIT_DEN, \ ACCESS_CARGO, \ ACCESS_MECH_MINING, \ ACCESS_MINERAL_STOREROOM, \ @@ -545,6 +553,7 @@ /obj/item/modular_computer/pda/heads/rd = list(REGION_COMMAND), \ /obj/item/modular_computer/pda/heads/captain = list(REGION_COMMAND), \ /obj/item/modular_computer/pda/cargo = list(REGION_SUPPLY), \ + /obj/item/modular_computer/pda/bitrunner = list(REGION_SUPPLY), \ /obj/item/modular_computer/pda/shaftminer = list(REGION_SUPPLY), \ /obj/item/modular_computer/pda/chaplain = list(REGION_GENERAL), \ /obj/item/modular_computer/pda/lawyer = list(REGION_GENERAL), \ diff --git a/code/__DEFINES/achievements.dm b/code/__DEFINES/achievements.dm index d533e0feab209..4a0299d835ac3 100644 --- a/code/__DEFINES/achievements.dm +++ b/code/__DEFINES/achievements.dm @@ -6,6 +6,17 @@ #define ACHIEVEMENT_DEFAULT "default" #define ACHIEVEMENT_SCORE "score" +///the priority for which awards are orded on [/datum/achievement_data/load_all_achievements()] +#define AWARD_PRIORITY_DEFAULT 100 +///the priority of the achievements score. NO achievement should have a priority equal or lower than this. +#define AWARD_PRIORITY_LAST 0 + +/// preferences for the sound played when unlocking an achievement +#define CHEEVO_SOUND_TADA "Tada Fanfare" +#define CHEEVO_SOUND_JINGLE "Beeps Jingle" +#define CHEEVO_SOUND_PING "Success Ping" +#define CHEEVO_SOUND_OFF "Disabled" + //Misc Medal hub IDs #define MEDAL_METEOR "Your Life Before Your Eyes" #define MEDAL_PULSE "Jackpot" @@ -35,6 +46,7 @@ #define MEDAL_VOID_ASCENSION "Void" #define MEDAL_BLADE_ASCENSION "Blade" #define MEDAL_COSMOS_ASCENSION "Cosmos" +#define MEDAL_KNOCK_ASCENSION "Knock" #define MEDAL_TOOLBOX_SOUL "Toolsoul" #define MEDAL_CHEM_TUT "Beginner Chemist" #define MEDAL_HOT_DAMN "Hot Damn!" @@ -47,9 +59,13 @@ #define MEDAL_HEALTHY "Heart Healthy" #define MEDAL_GODS_WRATH "God's Wrath" #define MEDAL_EARTHQUAKE_VICTIM "Earthquake Victim" +#define MEDAL_DEBT_EXTINGUISHED "Debt Extinguished" +#define MEDAL_ARCHMAGE "Archmage" +#define MEDAL_THEORETICAL_LIMITS "All Within Theoretical Limits" //Skill medal hub IDs #define MEDAL_LEGENDARY_MINER "Legendary Miner" +#define MEDAL_LEGENDARY_FISHER "Legendary Fisher" //Mafia medal hub IDs (wins) #define MAFIA_MEDAL_ASSISTANT "Assistant" @@ -86,7 +102,6 @@ #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" @@ -97,7 +112,6 @@ #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" @@ -127,6 +141,9 @@ // DB ID for style point count #define STYLE_SCORE "Style Score" +/// DB ID for the amount of achievements unlocked by the player. +#define ACHIEVEMENTS_SCORE "Achievements Score" + // Tourist related achievements and scores //centcom grades (achievement) diff --git a/code/__DEFINES/actions.dm b/code/__DEFINES/actions.dm index 6e57c44572326..5bc2b16178124 100644 --- a/code/__DEFINES/actions.dm +++ b/code/__DEFINES/actions.dm @@ -8,6 +8,8 @@ #define AB_CHECK_CONSCIOUS (1<<3) ///Action button checks if user is incapacitated #define AB_CHECK_INCAPACITATED (1<<4) +///Action button checks if user is jaunting +#define AB_CHECK_PHASED (1<<5) DEFINE_BITFIELD(check_flags, list( "CHECK IF HANDS BLOCKED" = AB_CHECK_HANDS_BLOCKED, @@ -15,10 +17,13 @@ DEFINE_BITFIELD(check_flags, list( "CHECK IF LYING DOWN" = AB_CHECK_LYING, "CHECK IF CONSCIOUS" = AB_CHECK_CONSCIOUS, "CHECK IF INCAPACITATED" = AB_CHECK_INCAPACITATED, + "CHECK IF TEMPORARILY INCORPOREAL" = AB_CHECK_PHASED, )) ///Action button triggered with right click #define TRIGGER_SECONDARY_ACTION (1<<0) +///Action triggered to ignore any availability checks +#define TRIGGER_FORCE_AVAILABLE (1<<1) // Defines for formatting cooldown actions for the stat panel. /// The stat panel the action is displayed in. diff --git a/code/__DEFINES/actionspeed_modification.dm b/code/__DEFINES/actionspeed_modification.dm index c3d288e907fc4..1753105f1275d 100644 --- a/code/__DEFINES/actionspeed_modification.dm +++ b/code/__DEFINES/actionspeed_modification.dm @@ -1,3 +1,5 @@ //ids #define ACTIONSPEED_ID_SANITY "sanity_component" #define ACTIONSPEED_ID_STIMULANTS "stimulant_withdrawal" + +#define ACTIONSPEED_ID_MIDAS_BLIGHT "midas_blight_debuff" diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index 6c65c1ae747d0..6a8ff3666297d 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -72,7 +72,9 @@ /// Displays "(SHOW)" in the chat, when clicked it tries to show atom(paper). First you need to set the request_state variable to TRUE for the paper. #define ADMIN_SHOW_PAPER(atom) "(SHOW)" /// Displays "(PLAY)" in the chat, when clicked it tries to play internet sounds from the request. -#define ADMIN_PLAY_INTERNET(text) "(PLAY)" +#define ADMIN_PLAY_INTERNET(text, credit) "(PLAY)" +/// Displays "(SEE Z-LEVEL LAYOUT)" in the chat, when clicked it shows the z-level layouts for the current world state. +#define ADMIN_SEE_ZLEVEL_LAYOUT "(SEE Z-LEVEL LAYOUT)" /atom/proc/Admin_Coordinates_Readable(area_name, admin_jump_ref) var/turf/T = Safe_COORD_Location() diff --git a/code/__DEFINES/ai.dm b/code/__DEFINES/ai.dm deleted file mode 100644 index e337e12c3833e..0000000000000 --- a/code/__DEFINES/ai.dm +++ /dev/null @@ -1,311 +0,0 @@ -#define GET_AI_BEHAVIOR(behavior_type) SSai_behaviors.ai_behaviors[behavior_type] -#define HAS_AI_CONTROLLER_TYPE(thing, type) istype(thing?.ai_controller, type) - -#define AI_STATUS_ON 1 -#define AI_STATUS_OFF 2 - -///For JPS pathing, the maximum length of a path we'll try to generate. Should be modularized depending on what we're doing later on -#define AI_MAX_PATH_LENGTH 30 // 30 is possibly overkill since by default we lose interest after 14 tiles of distance, but this gives wiggle room for weaving around obstacles - -///Cooldown on planning if planning failed last time - -#define AI_FAILED_PLANNING_COOLDOWN (1.5 SECONDS) - -///Flags for ai_behavior new() -#define AI_CONTROLLER_INCOMPATIBLE (1<<0) - -///Does this task require movement from the AI before it can be performed? -#define AI_BEHAVIOR_REQUIRE_MOVEMENT (1<<0) -///Does this require the current_movement_target to be adjacent and in reach? -#define AI_BEHAVIOR_REQUIRE_REACH (1<<1) -///Does this task let you perform the action while you move closer? (Things like moving and shooting) -#define AI_BEHAVIOR_MOVE_AND_PERFORM (1<<2) -///Does finishing this task not null the current movement target? -#define AI_BEHAVIOR_KEEP_MOVE_TARGET_ON_FINISH (1<<3) -///Does finishing this task make the AI stop moving towards the target? -#define AI_BEHAVIOR_KEEP_MOVING_TOWARDS_TARGET_ON_FINISH (1<<4) -///Does this behavior NOT block planning? -#define AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION (1<<5) - -///AI flags -/// Don't move if being pulled -#define STOP_MOVING_WHEN_PULLED (1<<0) -/// Continue processing even if dead -#define CAN_ACT_WHILE_DEAD (1<<1) - -//Base Subtree defines - -///This subtree should cancel any further planning, (Including from other subtrees) -#define SUBTREE_RETURN_FINISH_PLANNING 1 - -//Generic subtree defines - -/// 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)) -///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) - -//Generic BB keys -#define BB_CURRENT_MIN_MOVE_DISTANCE "min_move_distance" -///time until we should next eat, set by the generic hunger subtree -#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 - -///song instrument blackboard, set by instrument subtrees -#define BB_SONG_INSTRUMENT "BB_SONG_INSTRUMENT" -///song lines blackboard, set by default on controllers -#define BB_SONG_LINES "song_lines" - -// Monkey AI controller blackboard keys - -#define BB_MONKEY_AGGRESSIVE "BB_monkey_aggressive" -#define BB_MONKEY_GUN_NEURONS_ACTIVATED "BB_monkey_gun_aware" -#define BB_MONKEY_GUN_WORKED "BB_monkey_gun_worked" -#define BB_MONKEY_BEST_FORCE_FOUND "BB_monkey_bestforcefound" -#define BB_MONKEY_ENEMIES "BB_monkey_enemies" -#define BB_MONKEY_BLACKLISTITEMS "BB_monkey_blacklistitems" -#define BB_MONKEY_PICKUPTARGET "BB_monkey_pickuptarget" -#define BB_MONKEY_PICKPOCKETING "BB_monkey_pickpocketing" -#define BB_MONKEY_CURRENT_ATTACK_TARGET "BB_monkey_current_attack_target" -#define BB_MONKEY_CURRENT_PRESS_TARGET "BB_monkey_current_press_target" -#define BB_MONKEY_CURRENT_GIVE_TARGET "BB_monkey_current_give_target" -#define BB_MONKEY_TARGET_DISPOSAL "BB_monkey_target_disposal" -#define BB_MONKEY_TARGET_MONKEYS "BB_monkey_target_monkeys" -#define BB_MONKEY_DISPOSING "BB_monkey_disposing" -#define BB_MONKEY_RECRUIT_COOLDOWN "BB_monkey_recruit_cooldown" - -///Haunted item controller defines - -///Chance for haunted item to haunt someone -#define HAUNTED_ITEM_ATTACK_HAUNT_CHANCE 10 -///Chance for haunted item to try to get itself let go. -#define HAUNTED_ITEM_ESCAPE_GRASP_CHANCE 20 -///Amount of aggro you get when picking up a haunted item -#define HAUNTED_ITEM_AGGRO_ADDITION 2 - -///Blackboard keys for haunted items -#define BB_TO_HAUNT_LIST "BB_to_haunt_list" -///Actual mob the item is haunting at the moment -#define BB_HAUNT_TARGET "BB_haunt_target" -///Amount of successful hits in a row this item has had -#define BB_HAUNTED_THROW_ATTEMPT_COUNT "BB_haunted_throw_attempt_count" -///If true, tolerates the equipper holding/equipping the hauntium -#define BB_LIKES_EQUIPPER "BB_likes_equipper" - -///Cursed item controller defines - -//defines -///how far a cursed item will still try to chase a target -#define CURSED_VIEW_RANGE 7 -//blackboards - -///Actual mob the item is haunting at the moment -#define BB_CURSE_TARGET "BB_haunt_target" -///Where the item wants to land on -#define BB_TARGET_SLOT "BB_target_slot" -///Amount of successful hits in a row this item has had -#define BB_CURSED_THROW_ATTEMPT_COUNT "BB_cursed_throw_attempt_count" - -///Mob the MOD is trying to attach to -#define BB_MOD_TARGET "BB_mod_target" -///The implant the AI was created from -#define BB_MOD_IMPLANT "BB_mod_implant" -///Range for a MOD AI controller. -#define MOD_AI_RANGE 200 - -///Vending machine AI controller blackboard keys -#define BB_VENDING_CURRENT_TARGET "BB_vending_current_target" -#define BB_VENDING_TILT_COOLDOWN "BB_vending_tilt_cooldown" -#define BB_VENDING_UNTILT_COOLDOWN "BB_vending_untilt_cooldown" -#define BB_VENDING_BUSY_TILTING "BB_vending_busy_tilting" -#define BB_VENDING_LAST_HIT_SUCCESFUL "BB_vending_last_hit_succesful" - -//Robot customer AI controller blackboard keys -/// Corresponds to the customer's order. -/// This can be a an item typepath or an instance of a custom order datum -#define BB_CUSTOMER_CURRENT_ORDER "BB_customer_current_order" -#define BB_CUSTOMER_MY_SEAT "BB_customer_my_seat" -#define BB_CUSTOMER_PATIENCE "BB_customer_patience" -/// A reference to a customer data datum, containing stuff like saylines and food desires -#define BB_CUSTOMER_CUSTOMERINFO "BB_customer_customerinfo" -/// Whether we're busy eating something already -#define BB_CUSTOMER_EATING "BB_customer_eating" -/// A reference to the venue being attended -#define BB_CUSTOMER_ATTENDING_VENUE "BB_customer_attending_avenue" -/// Whether we're leaving the venue entirely, either happily or forced out -#define BB_CUSTOMER_LEAVING "BB_customer_leaving" -#define BB_CUSTOMER_CURRENT_TARGET "BB_customer_current_target" -/// Robot customer has said their can't find seat line at least once. Used to rate limit how often they'll complain after the first time. -#define BB_CUSTOMER_SAID_CANT_FIND_SEAT_LINE "BB_customer_said_cant_find_seat_line" - - -///Hostile AI controller blackboard keys -#define BB_HOSTILE_ORDER_MODE "BB_HOSTILE_ORDER_MODE" -#define BB_HOSTILE_FRIEND "BB_HOSTILE_FRIEND" -#define BB_HOSTILE_ATTACK_WORD "BB_HOSTILE_ATTACK_WORD" -#define BB_FOLLOW_TARGET "BB_FOLLOW_TARGET" -#define BB_ATTACK_TARGET "BB_ATTACK_TARGET" -#define BB_VISION_RANGE "BB_VISION_RANGE" - -/// Basically, what is our vision/hearing range. -#define BB_HOSTILE_VISION_RANGE 10 -/// After either being given a verbal order or a pointing order, ignore further of each for this duration -#define AI_HOSTILE_COMMAND_COOLDOWN (2 SECONDS) - -// hostile command modes (what pointing at something/someone does depending on the last order the carp heard) -/// Don't do anything (will still react to stuff around them though) -#define HOSTILE_COMMAND_NONE 0 -/// Will attack a target. -#define HOSTILE_COMMAND_ATTACK 1 -/// Will follow a target. -#define HOSTILE_COMMAND_FOLLOW 2 - -///Dog AI controller blackboard keys - -#define BB_SIMPLE_CARRY_ITEM "BB_SIMPLE_CARRY_ITEM" -#define BB_FETCH_IGNORE_LIST "BB_FETCH_IGNORE_LISTlist" -#define BB_FETCH_DELIVER_TO "BB_FETCH_DELIVER_TO" -#define BB_DOG_HARASS_TARGET "BB_DOG_HARASS_TARGET" -#define BB_DOG_HARASS_HARM "BB_DOG_HARASS_HARM" -#define BB_DOG_IS_SLOW "BB_DOG_IS_SLOW" - -/// Basically, what is our vision/hearing range for picking up on things to fetch/ -#define AI_DOG_VISION_RANGE 10 -/// What are the odds someone petting us will become our friend? -#define AI_DOG_PET_FRIEND_PROB 15 -/// After this long without having fetched something, we clear our ignore list -#define AI_FETCH_IGNORE_DURATION (30 SECONDS) -/// After being ordered to heel, we spend this long chilling out -#define AI_DOG_HEEL_DURATION (20 SECONDS) -/// After either being given a verbal order or a pointing order, ignore further of each for this duration -#define AI_DOG_COMMAND_COOLDOWN (2 SECONDS) -/// If the dog is set to harass someone but doesn't bite them for this long, give up -#define AI_DOG_HARASS_FRUSTRATE_TIME (50 SECONDS) - -// dog command modes (what pointing at something/someone does depending on the last order the dog heard) -/// Don't do anything (will still react to stuff around them though) -#define DOG_COMMAND_NONE 0 -/// Will try to pick up and bring back whatever you point to -#define DOG_COMMAND_FETCH 1 -/// Will get within a few tiles of whatever you point at and continually growl/bark. If the target is a living mob who gets too close, the dog will attack them with bites -#define DOG_COMMAND_ATTACK 2 - -//enumerators for parsing command speech -#define COMMAND_HEEL "Heel" -#define COMMAND_FETCH "Fetch" -#define COMMAND_FOLLOW "Follow" -#define COMMAND_STOP "Stop" -#define COMMAND_ATTACK "Attack" -#define COMMAND_DIE "Play Dead" - -///bane ai -#define BB_BANE_BATMAN "BB_bane_batman" -//yep thats it - -///Hunting BB keys -#define BB_CURRENT_HUNTING_TARGET "BB_current_hunting_target" -#define BB_LOW_PRIORITY_HUNTING_TARGET "BB_low_priority_hunting_target" -#define BB_HUNTING_COOLDOWN "BB_HUNTING_COOLDOWN" - -///Basic Mob Keys - -///Tipped blackboards -///Bool that means a basic mob will start reacting to being tipped in it's planning -#define BB_BASIC_MOB_TIP_REACTING "BB_basic_tip_reacting" -///the motherfucker who tipped us -#define BB_BASIC_MOB_TIPPER "BB_basic_tip_tipper" - -///Targetting subtrees -#define BB_BASIC_MOB_CURRENT_TARGET "BB_basic_current_target" -#define BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION "BB_basic_current_target_hiding_location" -#define BB_TARGETTING_DATUM "targetting_datum" -///some behaviors that check current_target also set this on deep crit mobs -#define BB_BASIC_MOB_EXECUTION_TARGET "BB_basic_execution_target" -///Blackboard key for a whitelist typecache of "things we can target while trying to move" -#define BB_OBSTACLE_TARGETTING_WHITELIST "BB_targetting_whitelist" - -///Targetting keys for something to run away from, if you need to store this separately from current target -#define BB_BASIC_MOB_FLEE_TARGET "BB_basic_flee_target" -#define BB_BASIC_MOB_FLEE_TARGET_HIDING_LOCATION "BB_basic_flee_target_hiding_location" -#define BB_FLEE_TARGETTING_DATUM "flee_targetting_datum" - -///How long have we spent with no target? -#define BB_TARGETLESS_TIME "BB_targetless_time" - -/// Key that holds a nearby vent that looks like it's a good place to hide -#define BB_ENTRY_VENT_TARGET "BB_entry_vent_target" -/// Key that holds a vent that we want to exit out of (when we're already in a pipenet) -#define BB_EXIT_VENT_TARGET "BB_exit_vent_target" -/// Do we plan on going inside a vent? Boolean. -#define BB_CURRENTLY_TARGETTING_VENT "BB_currently_targetting_vent" -/// How long should we wait before we try and enter a vent again? -#define BB_VENTCRAWL_COOLDOWN "BB_ventcrawl_cooldown" -/// The least amount of time (in seconds) we take to go through the vents. -#define BB_LOWER_VENT_TIME_LIMIT "BB_lower_vent_time_limit" -/// The most amount of time (in seconds) we take to go through the vents. -#define BB_UPPER_VENT_TIME_LIMIT "BB_upper_vent_time_limit" -/// How much time (in seconds) do we take until we completely go bust on vent pathing? -#define BB_TIME_TO_GIVE_UP_ON_VENT_PATHING "BB_seconds_until_we_give_up_on_vent_pathing" -/// The timer ID of the timer that makes us give up on vent pathing. -#define BB_GIVE_UP_ON_VENT_PATHING_TIMER_ID "BB_give_up_on_vent_pathing_timer_id" - -/// Is there something that scared us into being stationary? If so, hold the reference here -#define BB_STATIONARY_CAUSE "BB_thing_that_made_us_stationary" -///How long should we remain stationary for? -#define BB_STATIONARY_SECONDS "BB_stationary_time_in_seconds" -///Should we move towards the target that triggered us to be stationary? -#define BB_STATIONARY_MOVE_TO_TARGET "BB_stationary_move_to_target" -/// What targets will trigger us to be stationary? Must be a list. -#define BB_STATIONARY_TARGETS "BB_stationary_targets" -/// How often can we get spooked by a target? -#define BB_STATIONARY_COOLDOWN "BB_stationary_cooldown" - -///List of mobs who have damaged us -#define BB_BASIC_MOB_RETALIATE_LIST "BB_basic_mob_shitlist" - -/// Flag to set on or off if you want your mob to prioritise running away -#define BB_BASIC_MOB_FLEEING "BB_basic_fleeing" - -///list of foods this mob likes -#define BB_BASIC_FOODS "BB_basic_foods" - -///Baby-making blackboard -///Types of animal we can make babies with. -#define BB_BABIES_PARTNER_TYPES "BB_babies_partner" -///Types of animal that we make as a baby. -#define BB_BABIES_CHILD_TYPES "BB_babies_child" -///Current partner target -#define BB_BABIES_TARGET "BB_babies_target" - -// Bileworm AI keys - -#define BB_BILEWORM_SPEW_BILE "BB_bileworm_spew_bile" -#define BB_BILEWORM_RESURFACE "BB_bileworm_resurface" -#define BB_BILEWORM_DEVOUR "BB_bileworm_devour" - -// Meteor Heart AI keys -/// Key where we keep the spike trail ability -#define BB_METEOR_HEART_GROUND_SPIKES "BB_meteor_ground_spikes" -/// Key where we keep the spine traps ability -#define BB_METEOR_HEART_SPINE_TRAPS "BB_meteor_spine_traps" - -// Spider AI keys -/// Key where we store a turf to put webs on -#define BB_SPIDER_WEB_TARGET "BB_spider_web_target" -/// Key where we store the web-spinning ability -#define BB_SPIDER_WEB_ACTION "BB_spider_web_action" - -// Fugu AI keys -/// Key where we store the inflating ability -#define BB_FUGU_INFLATE "BB_fugu_inflate" - -//Festivus AI keys -/// Key where we store the charging apc ability -#define BB_FESTIVE_APC "BB_festive_apc" diff --git a/code/__DEFINES/ai/ai.dm b/code/__DEFINES/ai/ai.dm new file mode 100644 index 0000000000000..83d7e7f6a5f16 --- /dev/null +++ b/code/__DEFINES/ai/ai.dm @@ -0,0 +1,50 @@ +#define GET_AI_BEHAVIOR(behavior_type) SSai_behaviors.ai_behaviors[behavior_type] +#define HAS_AI_CONTROLLER_TYPE(thing, type) istype(thing?.ai_controller, type) + +#define AI_STATUS_ON 1 +#define AI_STATUS_OFF 2 + +///For JPS pathing, the maximum length of a path we'll try to generate. Should be modularized depending on what we're doing later on +#define AI_MAX_PATH_LENGTH 30 // 30 is possibly overkill since by default we lose interest after 14 tiles of distance, but this gives wiggle room for weaving around obstacles + +///Cooldown on planning if planning failed last time + +#define AI_FAILED_PLANNING_COOLDOWN (1.5 SECONDS) + +///Flags for ai_behavior new() +#define AI_CONTROLLER_INCOMPATIBLE (1<<0) + +///Does this task require movement from the AI before it can be performed? +#define AI_BEHAVIOR_REQUIRE_MOVEMENT (1<<0) +///Does this require the current_movement_target to be adjacent and in reach? +#define AI_BEHAVIOR_REQUIRE_REACH (1<<1) +///Does this task let you perform the action while you move closer? (Things like moving and shooting) +#define AI_BEHAVIOR_MOVE_AND_PERFORM (1<<2) +///Does finishing this task not null the current movement target? +#define AI_BEHAVIOR_KEEP_MOVE_TARGET_ON_FINISH (1<<3) +///Does this behavior NOT block planning? +#define AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION (1<<4) + +///AI flags +/// Don't move if being pulled +#define STOP_MOVING_WHEN_PULLED (1<<0) +/// Continue processing even if dead +#define CAN_ACT_WHILE_DEAD (1<<1) +/// Stop processing while in a progress bar +#define PAUSE_DURING_DO_AFTER (1<<2) +/// Continue processing while in stasis +#define CAN_ACT_IN_STASIS (1<<3) + +//Base Subtree defines + +///This subtree should cancel any further planning, (Including from other subtrees) +#define SUBTREE_RETURN_FINISH_PLANNING 1 + +//Generic subtree defines + +/// 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)) +///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) diff --git a/code/__DEFINES/ai/ai_blackboard.dm b/code/__DEFINES/ai/ai_blackboard.dm new file mode 100644 index 0000000000000..8e10eb07d3f27 --- /dev/null +++ b/code/__DEFINES/ai/ai_blackboard.dm @@ -0,0 +1,108 @@ + +//Generic BB keys + +#define BB_CURRENT_MIN_MOVE_DISTANCE "min_move_distance" +///time until we should next eat, set by the generic hunger subtree +#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" +///How close a mob must be for us to select it as a target, if that is less than how far we can maintain it as a target +#define BB_AGGRO_RANGE "BB_aggro_range" + +///Turf we want a mob to move to +#define BB_TRAVEL_DESTINATION "BB_travel_destination" + +///song instrument blackboard, set by instrument subtrees +#define BB_SONG_INSTRUMENT "BB_SONG_INSTRUMENT" +///song lines blackboard, set by default on controllers +#define BB_SONG_LINES "song_lines" + +///bane ai used by example script +#define BB_BANE_BATMAN "BB_bane_batman" +//yep thats it + +///Hunting BB keys +#define BB_CURRENT_HUNTING_TARGET "BB_current_hunting_target" +#define BB_LOW_PRIORITY_HUNTING_TARGET "BB_low_priority_hunting_target" +#define BB_HUNTING_COOLDOWN "BB_HUNTING_COOLDOWN" + +///Basic Mob Keys + +///Targetting subtrees +#define BB_BASIC_MOB_CURRENT_TARGET "BB_basic_current_target" +#define BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION "BB_basic_current_target_hiding_location" +#define BB_TARGETTING_DATUM "targetting_datum" +///some behaviors that check current_target also set this on deep crit mobs +#define BB_BASIC_MOB_EXECUTION_TARGET "BB_basic_execution_target" +///Blackboard key for a whitelist typecache of "things we can target while trying to move" +#define BB_OBSTACLE_TARGETTING_WHITELIST "BB_targetting_whitelist" + +/// Blackboard key storing how long your targetting datum has held a particular target +#define BB_BASIC_MOB_HAS_TARGET_TIME "BB_basic_mob_has_target_time" + +///Targetting keys for something to run away from, if you need to store this separately from current target +#define BB_BASIC_MOB_FLEE_TARGET "BB_basic_flee_target" +#define BB_BASIC_MOB_FLEE_TARGET_HIDING_LOCATION "BB_basic_flee_target_hiding_location" +#define BB_FLEE_TARGETTING_DATUM "flee_targetting_datum" +#define BB_BASIC_MOB_FLEE_DISTANCE "BB_basic_flee_distance" +#define DEFAULT_BASIC_FLEE_DISTANCE 9 + +/// Generic key for a non-specific targetted action +#define BB_TARGETTED_ACTION "BB_targetted_action" +/// Generic key for a non-specific action +#define BB_GENERIC_ACTION "BB_generic_action" + +/// Generic key for a shapeshifting action +#define BB_SHAPESHIFT_ACTION "BB_shapeshift_action" + +///How long have we spent with no target? +#define BB_TARGETLESS_TIME "BB_targetless_time" + +///Tipped blackboards +///Bool that means a basic mob will start reacting to being tipped in it's planning +#define BB_BASIC_MOB_TIP_REACTING "BB_basic_tip_reacting" +///the motherfucker who tipped us +#define BB_BASIC_MOB_TIPPER "BB_basic_tip_tipper" + +/// Is there something that scared us into being stationary? If so, hold the reference here +#define BB_STATIONARY_CAUSE "BB_thing_that_made_us_stationary" +///How long should we remain stationary for? +#define BB_STATIONARY_SECONDS "BB_stationary_time_in_seconds" +///Should we move towards the target that triggered us to be stationary? +#define BB_STATIONARY_MOVE_TO_TARGET "BB_stationary_move_to_target" +/// What targets will trigger us to be stationary? Must be a list. +#define BB_STATIONARY_TARGETS "BB_stationary_targets" +/// How often can we get spooked by a target? +#define BB_STATIONARY_COOLDOWN "BB_stationary_cooldown" + +///List of mobs who have damaged us +#define BB_BASIC_MOB_RETALIATE_LIST "BB_basic_mob_shitlist" + +/// Flag to set on or off if you want your mob to prioritise running away +#define BB_BASIC_MOB_FLEEING "BB_basic_fleeing" + +///list of foods this mob likes +#define BB_BASIC_FOODS "BB_basic_foods" + +/// Blackboard key for a held item +#define BB_SIMPLE_CARRY_ITEM "BB_SIMPLE_CARRY_ITEM" + +///Mob the MOD is trying to attach to +#define BB_MOD_TARGET "BB_mod_target" +///The implant the AI was created from +#define BB_MOD_IMPLANT "BB_mod_implant" +///Range for a MOD AI controller. +#define MOD_AI_RANGE 200 + +///should we skip the faction check for the targetting datum? +#define BB_BASIC_MOB_SKIP_FACTION_CHECK "BB_basic_mob_skip_faction_check" + +///currently only used by clowns, a list of what can the mob speak randomly +#define BB_BASIC_MOB_SPEAK_LINES "BB_speech_lines" +#define BB_EMOTE_SAY "emote_say" +#define BB_EMOTE_HEAR "emote_hear" +#define BB_EMOTE_SEE "emote_see" +#define BB_EMOTE_SOUND "emote_sound" +#define BB_EMOTE_CHANCE "emote_chance" diff --git a/code/__DEFINES/ai_carp.dm b/code/__DEFINES/ai/carp.dm similarity index 100% rename from code/__DEFINES/ai_carp.dm rename to code/__DEFINES/ai/carp.dm diff --git a/code/__DEFINES/ai/haunted.dm b/code/__DEFINES/ai/haunted.dm new file mode 100644 index 0000000000000..d836d6be60da6 --- /dev/null +++ b/code/__DEFINES/ai/haunted.dm @@ -0,0 +1,25 @@ +// Defines & Blackboard keys for the very similar haunted and cursed AI controllers + +///Chance for haunted item to haunt someone +#define HAUNTED_ITEM_ATTACK_HAUNT_CHANCE 10 +///Chance for haunted item to try to get itself let go. +#define HAUNTED_ITEM_ESCAPE_GRASP_CHANCE 20 +///Amount of aggro you get when picking up a haunted item +#define HAUNTED_ITEM_AGGRO_ADDITION 2 +///how far a cursed item will still try to chase a target +#define CURSED_VIEW_RANGE 7 + +#define BB_TO_HAUNT_LIST "BB_to_haunt_list" +///Actual mob the item is haunting at the moment +#define BB_HAUNT_TARGET "BB_haunt_target" +///Amount of successful hits in a row this item has had +#define BB_HAUNTED_THROW_ATTEMPT_COUNT "BB_haunted_throw_attempt_count" +///If true, tolerates the equipper holding/equipping the hauntium +#define BB_LIKES_EQUIPPER "BB_likes_equipper" + +///Actual mob the item is haunting at the moment +#define BB_CURSE_TARGET "BB_haunt_target" +///Where the item wants to land on +#define BB_TARGET_SLOT "BB_target_slot" +///Amount of successful hits in a row this item has had +#define BB_CURSED_THROW_ATTEMPT_COUNT "BB_cursed_throw_attempt_count" diff --git a/code/__DEFINES/ai/monkey.dm b/code/__DEFINES/ai/monkey.dm new file mode 100644 index 0000000000000..fc4af74d9f080 --- /dev/null +++ b/code/__DEFINES/ai/monkey.dm @@ -0,0 +1,17 @@ +// Monkey AI controller blackboard keys + +#define BB_MONKEY_AGGRESSIVE "BB_monkey_aggressive" +#define BB_MONKEY_GUN_NEURONS_ACTIVATED "BB_monkey_gun_aware" +#define BB_MONKEY_GUN_WORKED "BB_monkey_gun_worked" +#define BB_MONKEY_BEST_FORCE_FOUND "BB_monkey_bestforcefound" +#define BB_MONKEY_ENEMIES "BB_monkey_enemies" +#define BB_MONKEY_BLACKLISTITEMS "BB_monkey_blacklistitems" +#define BB_MONKEY_PICKUPTARGET "BB_monkey_pickuptarget" +#define BB_MONKEY_PICKPOCKETING "BB_monkey_pickpocketing" +#define BB_MONKEY_CURRENT_ATTACK_TARGET "BB_monkey_current_attack_target" +#define BB_MONKEY_CURRENT_PRESS_TARGET "BB_monkey_current_press_target" +#define BB_MONKEY_CURRENT_GIVE_TARGET "BB_monkey_current_give_target" +#define BB_MONKEY_TARGET_DISPOSAL "BB_monkey_target_disposal" +#define BB_MONKEY_TARGET_MONKEYS "BB_monkey_target_monkeys" +#define BB_MONKEY_DISPOSING "BB_monkey_disposing" +#define BB_MONKEY_RECRUIT_COOLDOWN "BB_monkey_recruit_cooldown" diff --git a/code/__DEFINES/ai/monsters.dm b/code/__DEFINES/ai/monsters.dm new file mode 100644 index 0000000000000..be9a4be34cd15 --- /dev/null +++ b/code/__DEFINES/ai/monsters.dm @@ -0,0 +1,155 @@ +// Bileworm AI keys + +#define BB_BILEWORM_SPEW_BILE "BB_bileworm_spew_bile" +#define BB_BILEWORM_RESURFACE "BB_bileworm_resurface" +#define BB_BILEWORM_DEVOUR "BB_bileworm_devour" + +// Meteor Heart AI keys +/// Key where we keep the spike trail ability +#define BB_METEOR_HEART_GROUND_SPIKES "BB_meteor_ground_spikes" +/// Key where we keep the spine traps ability +#define BB_METEOR_HEART_SPINE_TRAPS "BB_meteor_spine_traps" + +// Spider AI keys +/// Key where we store a turf to put webs on +#define BB_SPIDER_WEB_TARGET "BB_spider_web_target" +/// Key where we store the web-spinning ability +#define BB_SPIDER_WEB_ACTION "BB_spider_web_action" + +// Fugu AI keys +/// Key where we store the inflating ability +#define BB_FUGU_INFLATE "BB_fugu_inflate" + +//Festivus AI keys +/// Key where we store the charging apc ability +#define BB_FESTIVE_APC "BB_festive_apc" + +//Paperwizard AI keys +/// Key where we store the summon minions ability +#define BB_WIZARD_SUMMON_MINIONS "BB_summon_minions" +/// Key where we store the mimics ability +#define BB_WIZARD_MIMICS "BB_summon_mimics" +/// Key where we store the paper target +#define BB_FOUND_PAPER "BB_found_paper" +/// Key where we store the list of things we can write on a paper +#define BB_WRITING_LIST "BB_writing_list" + +// Goliath AI keys +/// Key where we store the tentacleing ability +#define BB_GOLIATH_TENTACLES "BB_goliath_tentacles" +/// Key where goliath stores a hole it wants to get into +#define BB_GOLIATH_HOLE_TARGET "BB_goliath_hole" + +// bee keys +///the bee hive we live inside +#define BB_CURRENT_HOME "BB_current_home" +///the hydro we will pollinate +#define BB_TARGET_HYDRO "BB_target_hydro" + +// bear keys +///the hive with honey that we will steal from +#define BB_FOUND_HONEY "BB_found_honey" +///the tree that we will climb +#define BB_CLIMBED_TREE "BB_climbed_tree" + +/// Lobstrosities will only attack people with one of these traits +#define BB_LOBSTROSITY_EXPLOIT_TRAITS "BB_lobstrosity_exploit_traits" +/// Key where we store some tasty fingers +#define BB_LOBSTROSITY_TARGET_LIMB "BB_lobstrosity_target_limb" +/// We increment this counter every time we try to move while dragging an arm and if we go too long we'll give up trying to get out of line of sight and just eat the fingers +#define BB_LOBSTROSITY_FINGER_LUST "BB_lobstrosity_finger_lust" + +// eyeball keys +///the death glare ability +#define BB_GLARE_ABILITY "BB_glare_ability" +///the blind target we must protect +#define BB_BLIND_TARGET "BB_blind_target" +///value to store the minimum eye damage to prevent us from attacking a human +#define BB_EYE_DAMAGE_THRESHOLD "BB_eye_damage_threshold" + +// hivebot keys +///the machine we must go to repair +#define BB_MACHINE_TARGET "BB_machine_target" +///the hivebot partner we will go communicate with +#define BB_HIVE_PARTNER "BB_hive_partner" + +// Ice Whelps +///whelp's straight line fire ability +#define BB_WHELP_STRAIGHTLINE_FIRE "BB_whelp_straightline_fire" +///whelp's secondary enraged ability +#define BB_WHELP_WIDESPREAD_FIRE "BB_whelp_widespread_fire" +///how enraged the whelp is +#define BB_WHELP_ENRAGED "BB_whelp_enraged" +///the target rock we will attempt to create a sculpture out of +#define BB_TARGET_ROCK "BB_target_rock" +///the cannibal target we shall consume +#define BB_TARGET_CANNIBAL "BB_target_cannibal" +///the tree we will burn down +#define BB_TARGET_TREE "BB_target_tree" + +// Regal Rats +/// The rat's ability to corrupt an area. +#define BB_DOMAIN_ABILITY "BB_domain_ability" +/// The rat's ability to raise a horde of soldiers. +#define BB_RAISE_HORDE_ABILITY "BB_raise_horde_ability" + +// mega arachnid keys +/// ability to throw restrain projectiles +#define BB_ARACHNID_RESTRAIN "BB_arachnid_restrain" +/// the found surveillance item we must destroy +#define BB_SURVEILLANCE_TARGET "BB_surveillance_target" +/// our acid slip ability +#define BB_ARACHNID_SLIP "BB_arachnid_slip" + +// goldgrub keys +/// key that tells if a storm is coming +#define BB_STORM_APPROACHING "BB_storm_approaching" +/// key that tells the wall we will mine +#define BB_TARGET_MINERAL_WALL "BB_target_mineral_wall" +/// key that holds our spit ability +#define BB_SPIT_ABILITY "BB_spit_ability" +/// key that holds our dig ability +#define BB_BURROW_ABILITY "BB_burrow_ability" +/// key that holds the ore we will eat +#define BB_ORE_TARGET "BB_ore_target" +/// which ore types we will not eat +#define BB_ORE_IGNORE_TYPES "BB_ore_ignore_types" + +// minebot keys +/// key that stores our toggle light ability +#define BB_MINEBOT_LIGHT_ABILITY "minebot_light_ability" +/// key that stores our dump ore ability +#define BB_MINEBOT_DUMP_ABILITY "minebot_dump_ability" +/// key that stores our target turf +#define BB_TARGET_MINERAL_TURF "target_mineral_turf" +/// key that stores list of the turfs we ignore +#define BB_BLACKLIST_MINERAL_TURFS "blacklist_mineral_turfs" +/// key that stores the previous blocked wall +#define BB_PREVIOUS_UNREACHABLE_WALL "previous_unreachable_wall" +/// key that stores our mining mode +#define BB_AUTOMATED_MINING "automated_mining" +/// key that stores the nearest dead human +#define BB_NEARBY_DEAD_MINER "nearby_dead_miner" + +//seedling keys +/// the water can we will pick up +#define BB_WATERCAN_TARGET "watercan_target" +/// the hydrotray we will heal +#define BB_HYDROPLANT_TARGET "hydroplant_target" +/// minimum weed levels for us to cure +#define BB_WEEDLEVEL_THRESHOLD "weedlevel_threshold" +/// minimum water levels for us to refill +#define BB_WATERLEVEL_THRESHOLD "waterlevel_threshold" +/// key holds our solarbeam ability +#define BB_SOLARBEAM_ABILITY "solarbeam_ability" +/// key holds our rapid seeds ability +#define BB_RAPIDSEEDS_ABILITY "rapidseeds_ability" +/// key holds the tray we will beam +#define BB_BEAMABLE_HYDROPLANT_TARGET "beamable_hydroplant_target" + +/// Corpse we have consumed +#define BB_LEGION_CORPSE "legion_corpse" +/// Things our target recently said +#define BB_LEGION_RECENT_LINES "legion_recent_lines" +/// The creator of our legion skull +#define BB_LEGION_BROOD_CREATOR "legion_brood_creator" diff --git a/code/__DEFINES/ai_pet_commands.dm b/code/__DEFINES/ai/pet_commands.dm similarity index 100% rename from code/__DEFINES/ai_pet_commands.dm rename to code/__DEFINES/ai/pet_commands.dm diff --git a/code/__DEFINES/ai/pets.dm b/code/__DEFINES/ai/pets.dm new file mode 100644 index 0000000000000..b3ad67ecc068d --- /dev/null +++ b/code/__DEFINES/ai/pets.dm @@ -0,0 +1,29 @@ +///Dog AI controller blackboard keys +#define BB_FETCH_IGNORE_LIST "BB_FETCH_IGNORE_LISTlist" +#define BB_FETCH_DELIVER_TO "BB_FETCH_DELIVER_TO" +#define BB_DOG_HARASS_TARGET "BB_DOG_HARASS_TARGET" +#define BB_DOG_HARASS_HARM "BB_DOG_HARASS_HARM" +#define BB_DOG_IS_SLOW "BB_DOG_IS_SLOW" + +/// Basically, what is our vision/hearing range for picking up on things to fetch/ +#define AI_DOG_VISION_RANGE 10 +/// What are the odds someone petting us will become our friend? +#define AI_DOG_PET_FRIEND_PROB 15 +/// After this long without having fetched something, we clear our ignore list +#define AI_FETCH_IGNORE_DURATION (30 SECONDS) + +///Baby-making blackboard +///Types of animal we can make babies with. +#define BB_BABIES_PARTNER_TYPES "BB_babies_partner" +///Types of animal that we make as a baby. +#define BB_BABIES_CHILD_TYPES "BB_babies_child" +///Current partner target +#define BB_BABIES_TARGET "BB_babies_target" + +///Finding adult mob +///key holds the adult we found +#define BB_FOUND_MOM "BB_found_mom" +///list of types of mobs we will look for +#define BB_FIND_MOM_TYPES "BB_find_mom_types" +///list of types of mobs we must ignore +#define BB_IGNORE_MOM_TYPES "BB_ignore_mom_types" diff --git a/code/__DEFINES/ai/simplemob.dm b/code/__DEFINES/ai/simplemob.dm new file mode 100644 index 0000000000000..317df51070fb0 --- /dev/null +++ b/code/__DEFINES/ai/simplemob.dm @@ -0,0 +1,24 @@ +///Hostile AI controller blackboard keys +#define BB_HOSTILE_ORDER_MODE "BB_HOSTILE_ORDER_MODE" +#define BB_HOSTILE_FRIEND "BB_HOSTILE_FRIEND" +#define BB_HOSTILE_ATTACK_WORD "BB_HOSTILE_ATTACK_WORD" +#define BB_FOLLOW_TARGET "BB_FOLLOW_TARGET" +#define BB_ATTACK_TARGET "BB_ATTACK_TARGET" +#define BB_VISION_RANGE "BB_VISION_RANGE" + +/// Basically, what is our vision/hearing range. +#define BB_HOSTILE_VISION_RANGE 10 +/// After either being given a verbal order or a pointing order, ignore further of each for this duration +#define AI_HOSTILE_COMMAND_COOLDOWN (2 SECONDS) + +// hostile command modes (what pointing at something/someone does depending on the last order the carp heard) +/// Don't do anything (will still react to stuff around them though) +#define HOSTILE_COMMAND_NONE 0 +/// Will attack a target. +#define HOSTILE_COMMAND_ATTACK 1 +/// Will follow a target. +#define HOSTILE_COMMAND_FOLLOW 2 + +#define COMMAND_FOLLOW "Follow" +#define COMMAND_STOP "Stop" +#define COMMAND_ATTACK "Attack" diff --git a/code/__DEFINES/ai/tourist.dm b/code/__DEFINES/ai/tourist.dm new file mode 100644 index 0000000000000..5ef27550d6f7b --- /dev/null +++ b/code/__DEFINES/ai/tourist.dm @@ -0,0 +1,17 @@ +//Robot customer AI controller blackboard keys +/// Corresponds to the customer's order. +/// This can be a an item typepath or an instance of a custom order datum +#define BB_CUSTOMER_CURRENT_ORDER "BB_customer_current_order" +#define BB_CUSTOMER_MY_SEAT "BB_customer_my_seat" +#define BB_CUSTOMER_PATIENCE "BB_customer_patience" +/// A reference to a customer data datum, containing stuff like saylines and food desires +#define BB_CUSTOMER_CUSTOMERINFO "BB_customer_customerinfo" +/// Whether we're busy eating something already +#define BB_CUSTOMER_EATING "BB_customer_eating" +/// A reference to the venue being attended +#define BB_CUSTOMER_ATTENDING_VENUE "BB_customer_attending_avenue" +/// Whether we're leaving the venue entirely, either happily or forced out +#define BB_CUSTOMER_LEAVING "BB_customer_leaving" +#define BB_CUSTOMER_CURRENT_TARGET "BB_customer_current_target" +/// Robot customer has said their can't find seat line at least once. Used to rate limit how often they'll complain after the first time. +#define BB_CUSTOMER_SAID_CANT_FIND_SEAT_LINE "BB_customer_said_cant_find_seat_line" diff --git a/code/__DEFINES/ai/vending.dm b/code/__DEFINES/ai/vending.dm new file mode 100644 index 0000000000000..83cd103562efd --- /dev/null +++ b/code/__DEFINES/ai/vending.dm @@ -0,0 +1,6 @@ +// Vending machine AI controller blackboard keys +#define BB_VENDING_CURRENT_TARGET "BB_vending_current_target" +#define BB_VENDING_TILT_COOLDOWN "BB_vending_tilt_cooldown" +#define BB_VENDING_UNTILT_COOLDOWN "BB_vending_untilt_cooldown" +#define BB_VENDING_BUSY_TILTING "BB_vending_busy_tilting" +#define BB_VENDING_LAST_HIT_SUCCESFUL "BB_vending_last_hit_succesful" diff --git a/code/__DEFINES/ai/ventcrawling.dm b/code/__DEFINES/ai/ventcrawling.dm new file mode 100644 index 0000000000000..f981ef3bba5d6 --- /dev/null +++ b/code/__DEFINES/ai/ventcrawling.dm @@ -0,0 +1,16 @@ +/// Key that holds a nearby vent that looks like it's a good place to hide +#define BB_ENTRY_VENT_TARGET "BB_entry_vent_target" +/// Key that holds a vent that we want to exit out of (when we're already in a pipenet) +#define BB_EXIT_VENT_TARGET "BB_exit_vent_target" +/// Do we plan on going inside a vent? Boolean. +#define BB_CURRENTLY_TARGETTING_VENT "BB_currently_targetting_vent" +/// How long should we wait before we try and enter a vent again? +#define BB_VENTCRAWL_COOLDOWN "BB_ventcrawl_cooldown" +/// The least amount of time (in seconds) we take to go through the vents. +#define BB_LOWER_VENT_TIME_LIMIT "BB_lower_vent_time_limit" +/// The most amount of time (in seconds) we take to go through the vents. +#define BB_UPPER_VENT_TIME_LIMIT "BB_upper_vent_time_limit" +/// How much time (in seconds) do we take until we completely go bust on vent pathing? +#define BB_TIME_TO_GIVE_UP_ON_VENT_PATHING "BB_seconds_until_we_give_up_on_vent_pathing" +/// The timer ID of the timer that makes us give up on vent pathing. +#define BB_GIVE_UP_ON_VENT_PATHING_TIMER_ID "BB_give_up_on_vent_pathing_timer_id" diff --git a/code/__DEFINES/alerts.dm b/code/__DEFINES/alerts.dm index d309ebd8d2e9a..6f25e61e7c558 100644 --- a/code/__DEFINES/alerts.dm +++ b/code/__DEFINES/alerts.dm @@ -23,6 +23,7 @@ #define ALERT_IRRADIATED "irradiated" #define ALERT_EMBEDDED_OBJECT "embeddedobject" #define ALERT_SHOES_KNOT "shoealert" +#define ALERT_RADIOACTIVE_AREA "radioactive_area" //antag related #define ALERT_HYPNOSIS "hypnosis" @@ -60,3 +61,12 @@ #define ALERT_TEMPERATURE "temp" #define ALERT_TEMPERATURE_HOT "temphot" #define ALERT_TEMPERATURE_COLD "tempcold" + +/** Bitrunning */ +#define ALERT_BITRUNNER_CROWBAR "bitrunning_crowbar" +#define ALERT_BITRUNNER_COMPLETED "bitrunning_complete" +#define ALERT_BITRUNNER_INTEGRITY "bitrunning_integrity" +#define ALERT_BITRUNNER_SHUTDOWN "bitrunning_shutdown" +#define ALERT_BITRUNNER_RESET "bitrunning_reset" +#define ALERT_BITRUNNER_SPAWN_CYBERCOP "bitrunning_spawn_cybercop" +#define ALERT_BITRUNNER_THREAT "bitrunning_threat" diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index f390f930ea7ce..c0ff62c0b585d 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -80,6 +80,7 @@ #define PATH_VOID "Void Path" #define PATH_BLADE "Blade Path" #define PATH_COSMIC "Cosmic Path" +#define PATH_KNOCK "Knock Path" /// Defines are used in /proc/has_living_heart() to report if the heretic has no heart period, no living heart, or has a living heart. #define HERETIC_NO_HEART_ORGAN -1 @@ -316,6 +317,7 @@ GLOBAL_LIST_INIT(human_invader_antagonists, list( #define ANTAG_GROUP_ASHWALKERS "Ash Walkers" #define ANTAG_GROUP_BIOHAZARDS "Biohazards" #define ANTAG_GROUP_CLOWNOPS "Clown Operatives" +#define ANTAG_GROUP_CYBERAUTH "Cyber Authority" #define ANTAG_GROUP_ERT "Emergency Response Team" #define ANTAG_GROUP_HORRORS "Eldritch Horrors" #define ANTAG_GROUP_LEVIATHANS "Spaceborne Leviathans" @@ -330,10 +332,40 @@ GLOBAL_LIST_INIT(human_invader_antagonists, list( #define ANTAG_GROUP_PARADOX "Spacetime Aberrations" -// If this flag is enabled the antagonist datum allows the antagonist to be inducted into a nuclear operative team. -#define FLAG_ANTAG_CAN_BE_INDUCTED (1 << 0) +// This flag disables certain checks that presume antagonist datums mean 'baddie'. +#define FLAG_FAKE_ANTAG (1 << 0) #define HUNTER_PACK_COPS "Spacepol Fugitive Hunters" #define HUNTER_PACK_RUSSIAN "Russian Fugitive Hunters" #define HUNTER_PACK_BOUNTY "Bounty Fugitive Hunters" #define HUNTER_PACK_PSYKER "Psyker Fugitive Hunters" + +/// Changeling abilities with DNA cost = this are innately given to all changelings +#define CHANGELING_POWER_INNATE -1 +/// Changeling abilities with DNA cost = this are not obtainable by changelings - either used for secret unlockable or abstract abilities +#define CHANGELING_POWER_UNOBTAINABLE -2 + +/// For changelings, this is how many recent say lines are retained when absorbing a mob +#define LING_ABSORB_RECENT_SPEECH 8 + +// Various abductor equipment modes. + +#define VEST_STEALTH 1 +#define VEST_COMBAT 2 + +#define GIZMO_SCAN 1 +#define GIZMO_MARK 2 + +#define MIND_DEVICE_MESSAGE 1 +#define MIND_DEVICE_CONTROL 2 + +#define TOOLSET_MEDICAL 1 +#define TOOLSET_HACKING 2 + +#define BATON_STUN 0 +#define BATON_SLEEP 1 +#define BATON_CUFF 2 +#define BATON_PROBE 3 +#define BATON_MODES 4 + +#define FREEDOM_IMPLANT_CHARGES 4 diff --git a/code/__DEFINES/aquarium.dm b/code/__DEFINES/aquarium.dm deleted file mode 100644 index 5e60e2a7a648f..0000000000000 --- a/code/__DEFINES/aquarium.dm +++ /dev/null @@ -1,31 +0,0 @@ -#define AQUARIUM_ANIMATION_FISH_SWIM "fish" -#define AQUARIUM_ANIMATION_FISH_DEAD "dead" - -#define AQUARIUM_PROPERTIES_PX_MIN "px_min" -#define AQUARIUM_PROPERTIES_PX_MAX "px_max" -#define AQUARIUM_PROPERTIES_PY_MIN "py_min" -#define AQUARIUM_PROPERTIES_PY_MAX "py_max" - -#define AQUARIUM_LAYER_MODE_BOTTOM "bottom" -#define AQUARIUM_LAYER_MODE_TOP "top" -#define AQUARIUM_LAYER_MODE_AUTO "auto" - -#define FISH_ALIVE "alive" -#define FISH_DEAD "dead" - -#define MIN_AQUARIUM_TEMP T0C -#define MAX_AQUARIUM_TEMP (T0C + 100) -#define DEFAULT_AQUARIUM_TEMP 300 - -#define FISH_RARITY_BASIC 1000 -#define FISH_RARITY_RARE 400 -#define FISH_RARITY_VERY_RARE 200 -#define FISH_RARITY_GOOD_LUCK_FINDING_THIS 1 - -#define AQUARIUM_FLUID_FRESHWATER "Freshwater" -#define AQUARIUM_FLUID_SALTWATER "Saltwater" -#define AQUARIUM_FLUID_SULPHWATEVER "Sulfuric Water" -#define AQUARIUM_FLUID_AIR "Air" -#define AQUARIUM_FLUID_ANADROMOUS "Adaptive to both Freshwater and Saltwater" - -#define AQUARIUM_COMPANY "Aquatech Ltd." diff --git a/code/__DEFINES/atmospherics/atmos_core.dm b/code/__DEFINES/atmospherics/atmos_core.dm index 383e34f5c831f..be8bae4cc118f 100644 --- a/code/__DEFINES/atmospherics/atmos_core.dm +++ b/code/__DEFINES/atmospherics/atmos_core.dm @@ -131,8 +131,6 @@ #define FIRE_MINIMUM_TEMPERATURE_TO_SPREAD (150+T0C) ///Minimum temperature for fire to exist on a turf (100 °C or 373 K) #define FIRE_MINIMUM_TEMPERATURE_TO_EXIST (100+T0C) -///Minimum temperature for items on fire -#define BURNING_ITEM_MINIMUM_TEMPERATURE (150+T0C) ///Multiplier for the temperature shared to other turfs #define FIRE_SPREAD_RADIOSITY_SCALE 0.85 ///Helper for small fires to grow diff --git a/code/__DEFINES/atmospherics/atmos_helpers.dm b/code/__DEFINES/atmospherics/atmos_helpers.dm index 7fab38471bfec..ca32e4859809b 100644 --- a/code/__DEFINES/atmospherics/atmos_helpers.dm +++ b/code/__DEFINES/atmospherics/atmos_helpers.dm @@ -53,13 +53,13 @@ GLOBAL_LIST_INIT(nonoverlaying_gases, typecache_of_gases_with_no_overlays()) #define GAS_OVERLAYS(gases, out_var, z_layer_turf)\ do { \ out_var = list();\ - var/offset = GET_TURF_PLANE_OFFSET(z_layer_turf);\ + var/offset = GET_TURF_PLANE_OFFSET(z_layer_turf) + 1;\ for(var/_ID in gases){\ if(GLOB.nonoverlaying_gases[_ID]) continue;\ var/_GAS = gases[_ID];\ var/_GAS_META = _GAS[GAS_META];\ if(_GAS[MOLES] <= _GAS_META[META_GAS_MOLES_VISIBLE]) continue;\ - var/_GAS_OVERLAY = _GAS_META[META_GAS_OVERLAY][offset + 1];\ + var/_GAS_OVERLAY = _GAS_META[META_GAS_OVERLAY][offset];\ out_var += _GAS_OVERLAY[min(TOTAL_VISIBLE_STATES, CEILING(_GAS[MOLES] / MOLES_GAS_VISIBLE_STEP, 1))];\ } \ }\ diff --git a/code/__DEFINES/atmospherics/atmos_mob_interaction.dm b/code/__DEFINES/atmospherics/atmos_mob_interaction.dm index 0472bc96bfd65..260a80190e71d 100644 --- a/code/__DEFINES/atmospherics/atmos_mob_interaction.dm +++ b/code/__DEFINES/atmospherics/atmos_mob_interaction.dm @@ -17,6 +17,9 @@ /// Useful for doing "we're done" effects without duped code #define BREATH_LOST 1 +//The proportion of oxygen needed for metabolism compared to pluoxium. (Pluoxium is this many times efficient as oxygen) +#define PLUOXIUM_PROPORTION 8 + //Defines for N2O and Healium euphoria moodlets #define EUPHORIA_INACTIVE 0 #define EUPHORIA_ACTIVE 1 @@ -144,3 +147,6 @@ #define SHOES_MIN_TEMP_PROTECT 2.0 /// For gloves #define SHOES_MAX_TEMP_PROTECT 1500 + +///Minimum temperature for items on fire +#define BURNING_ITEM_MINIMUM_TEMPERATURE (150+T0C) diff --git a/code/__DEFINES/atmospherics/atmos_piping.dm b/code/__DEFINES/atmospherics/atmos_piping.dm index 3d864e6485f7c..5e501a839832c 100644 --- a/code/__DEFINES/atmospherics/atmos_piping.dm +++ b/code/__DEFINES/atmospherics/atmos_piping.dm @@ -22,7 +22,13 @@ #define MAX_OUTPUT_PRESSURE 4500 /// (L/s) Maximum speed powered equipment can work at. #define MAX_TRANSFER_RATE 200 -/// How many percent of the contents that an overclocked volume pumps leak into the air +/// (kPa) Minimum pressure volume pumps can move. +#define VOLUME_PUMP_MINIMUM_OUTPUT_PRESSURE 0.01 +/// (kPa) What pressure volume pumps max out at. +#define VOLUME_PUMP_MAX_OUTPUT_PRESSURE 9000 +/// (kPa) Allowed pressure difference between input and output pipenets for overclocked volume pump. +#define VOLUME_PUMP_OVERPRESSURE_ALLOWANCE 1000 +/// How many percent of the contents that an overclocked volume pumps leak into the air. #define VOLUME_PUMP_LEAK_AMOUNT 0.1 //used for device_type vars #define UNARY 1 @@ -41,6 +47,8 @@ #define TANK_DEFAULT_RELEASE_PRESSURE 16 /// The default initial value gas plasmamen tanks releases valves are set to. #define TANK_PLASMAMAN_RELEASE_PRESSURE 4 +/// The default initial value gas flown tanks releases valves are set to. +#define TANK_CLOWN_RELEASE_PRESSURE 20 /// The internal temperature in kelvins at which a handheld gas tank begins to take damage. #define TANK_MELT_TEMPERATURE 1000000 /// The internal pressure in kPa 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 3a175a2585a9d..515e93fefd47d 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -84,6 +84,7 @@ #define SECHUD_ASSISTANT "hudassistant" #define SECHUD_ATMOSPHERIC_TECHNICIAN "hudatmospherictechnician" #define SECHUD_BARTENDER "hudbartender" +#define SECHUD_BITRUNNER "hudbitrunner" #define SECHUD_BOTANIST "hudbotanist" #define SECHUD_CAPTAIN "hudcaptain" #define SECHUD_CARGO_TECHNICIAN "hudcargotechnician" diff --git a/code/__DEFINES/basic_mobs.dm b/code/__DEFINES/basic_mobs.dm index 8c544adb459b4..5a4aebaee23e6 100644 --- a/code/__DEFINES/basic_mobs.dm +++ b/code/__DEFINES/basic_mobs.dm @@ -1,7 +1,21 @@ #define BASIC_MOB_MAX_STAMINALOSS 200 ///Basic mob flags + +/// Delete mob upon death #define DEL_ON_DEATH (1<<0) +/// Rotate mob 180 degrees while it is dead #define FLIP_ON_DEATH (1<<1) +/// Mob remains dense while dead #define REMAIN_DENSE_WHILE_DEAD (1<<2) +/// Mob can be set on fire #define FLAMMABLE_MOB (1<<3) +/// Mob never takes damage from unarmed attacks +#define IMMUNE_TO_FISTS (1<<4) + +/// Temporary trait applied when an attack forecast animation has completed +#define TRAIT_BASIC_ATTACK_FORECAST "trait_basic_attack_forecast" +#define INTERACTION_BASIC_ATTACK_FORCEAST "interaction_basic_attack_forecast" + +/// Above this speed we stop gliding because it looks silly +#define END_GLIDE_SPEED 10 diff --git a/code/__DEFINES/bitrunning.dm b/code/__DEFINES/bitrunning.dm new file mode 100644 index 0000000000000..343801c477e97 --- /dev/null +++ b/code/__DEFINES/bitrunning.dm @@ -0,0 +1,20 @@ +#define BITRUNNER_COST_NONE 0 +#define BITRUNNER_COST_LOW 1 +#define BITRUNNER_COST_MEDIUM 2 +#define BITRUNNER_COST_HIGH 3 +#define BITRUNNER_COST_EXTREME 20 + +#define BITRUNNER_REWARD_MIN 1 +#define BITRUNNER_REWARD_LOW 3 +#define BITRUNNER_REWARD_MEDIUM 4 +#define BITRUNNER_REWARD_HIGH 5 +#define BITRUNNER_REWARD_EXTREME 6 + +/// Blue in ui +#define BITRUNNER_DIFFICULTY_NONE 0 +/// Yellow +#define BITRUNNER_DIFFICULTY_LOW 1 +/// Orange +#define BITRUNNER_DIFFICULTY_MEDIUM 2 +/// Red with skull +#define BITRUNNER_DIFFICULTY_HIGH 3 diff --git a/code/__DEFINES/blood.dm b/code/__DEFINES/blood.dm index 3bf4af659698a..2c8576a2edad7 100644 --- a/code/__DEFINES/blood.dm +++ b/code/__DEFINES/blood.dm @@ -19,3 +19,16 @@ #define BLOOD_STATE_OIL "oil" /// No blood is present #define BLOOD_STATE_NOT_BLOODY "no blood whatsoever" + +// Bitflags for mob dismemberment and gibbing +/// Mobs will drop a brain +#define DROP_BRAIN (1<<0) +/// Mobs will drop organs +#define DROP_ORGANS (1<<1) +/// Mobs will drop bodyparts (arms, legs, etc.) +#define DROP_BODYPARTS (1<<2) +/// Mobs will drop items +#define DROP_ITEMS (1<<3) + +/// Mobs will drop everything +#define DROP_ALL_REMAINS (DROP_BRAIN | DROP_ORGANS | DROP_BODYPARTS | DROP_ITEMS) diff --git a/code/__DEFINES/bodyparts.dm b/code/__DEFINES/bodyparts.dm index 5c57518427398..87995d46abb87 100644 --- a/code/__DEFINES/bodyparts.dm +++ b/code/__DEFINES/bodyparts.dm @@ -1,2 +1,25 @@ ///The standard amount of bodyparts a carbon has. Currently 6, HEAD/L_ARM/R_ARM/CHEST/L_LEG/R_LEG #define BODYPARTS_DEFAULT_MAXIMUM 6 + +/// The max HP of surplus prosthetics. +#define PROSTHESIS_MAX_HP 20 + +// EMP +// Note most of these values are doubled on heavy EMP + +/// The brute damage an augged limb takes from an EMP. +#define AUGGED_LIMB_EMP_BRUTE_DAMAGE 2 +/// The brute damage an augged limb takes from an EMP. +#define AUGGED_LIMB_EMP_BURN_DAMAGE 1.5 + +/// When hit by an EMP, the time an augged limb will be paralyzed for if its above the damage threshold. +#define AUGGED_LIMB_EMP_PARALYZE_TIME 3 SECONDS + +/// When hit by an EMP, the time an augged leg will be knocked down for. +#define AUGGED_LEG_EMP_KNOCKDOWN_TIME 3 SECONDS +/// When hit by an EMP, the time a augged chest will cause a hardstun for if its above the damage threshold. +#define AUGGED_CHEST_EMP_STUN_TIME 3 SECONDS +/// When hit by an EMP, the time an augged chest will cause the mob to shake() for. +#define AUGGED_CHEST_EMP_SHAKE_TIME 5 SECONDS +/// When hit by an EMP, the time an augged head will make vision fucky for. +#define AUGGED_HEAD_EMP_GLITCH_DURATION 6 SECONDS diff --git a/code/__DEFINES/cargo.dm b/code/__DEFINES/cargo.dm index 747e48559f79f..56d3896f0dc05 100644 --- a/code/__DEFINES/cargo.dm +++ b/code/__DEFINES/cargo.dm @@ -40,6 +40,12 @@ /// 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 +/// The highest amount of orders you can have of one thing at any one time +#define CARGO_MAX_ORDER 50 + +/// Returned by /obj/docking_port/mobile/supply/proc/get_order_count to signify us going over the order limit +#define OVER_ORDER_LIMIT "GO AWAY" + /// Universal Scanner mode for export scanning. #define SCAN_EXPORTS 1 /// Universal Scanner mode for using the sales tagger. diff --git a/code/__DEFINES/changeling.dm b/code/__DEFINES/changeling.dm deleted file mode 100644 index 1913e62c0e9a3..0000000000000 --- a/code/__DEFINES/changeling.dm +++ /dev/null @@ -1,4 +0,0 @@ -/// The duration of the fakedeath coma. -#define LING_FAKEDEATH_TIME (40 SECONDS) -/// The number of recent spoken lines to gain on absorbing a mob -#define LING_ABSORB_RECENT_SPEECH 8 diff --git a/code/__DEFINES/clothing.dm b/code/__DEFINES/clothing.dm index 77d2bced447f5..95107455c4aff 100644 --- a/code/__DEFINES/clothing.dm +++ b/code/__DEFINES/clothing.dm @@ -30,3 +30,6 @@ #define ADD_CLOTHING_TRAIT(mob, trait) ADD_TRAIT(mob, trait, "[CLOTHING_TRAIT]_[REF(src)]") /// Wrapper for removing clothing based traits #define REMOVE_CLOTHING_TRAIT(mob, trait) REMOVE_TRAIT(mob, trait, "[CLOTHING_TRAIT]_[REF(src)]") + +/// How much integrity does a shirt lose every time we bite it? +#define MOTH_EATING_CLOTHING_DAMAGE 15 diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index ebc5ad3cdeddc..b14fd514b85e4 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -55,6 +55,8 @@ #define COLOR_ASSISTANT_OLIVE "#828163" #define COLOR_VIBRANT_LIME "#00FF00" #define COLOR_SERVICE_LIME "#58C800" +#define COLOR_JADE "#5EFB6E" +#define COLOR_EMERALD "#00CC66" #define COLOR_LIME "#32CD32" #define COLOR_DARK_LIME "#00aa00" #define COLOR_VERY_PALE_LIME_GREEN "#DDFFD3" @@ -91,6 +93,7 @@ #define COLOR_STRONG_MAGENTA "#B800B8" #define COLOR_PURPLE "#800080" #define COLOR_VIOLET "#B900F7" +#define COLOR_VOID_PURPLE "#53277E" #define COLOR_STRONG_VIOLET "#6927C5" #define COLOR_DARK_PURPLE "#551A8B" @@ -150,6 +153,16 @@ #define COLOR_BIOLUMINESCENCE_PURPLE "#D966FF" #define COLOR_BIOLUMINESCENCE_PINK "#FFB3DA" +//Colors for crayons. +#define COLOR_CRAYON_RED "#DA0000" +#define COLOR_CRAYON_ORANGE "#FF9300" +#define COLOR_CRAYON_YELLOW "#FFF200" +#define COLOR_CRAYON_GREEN "#A8E61D" +#define COLOR_CRAYON_BLUE "#00B7EF" +#define COLOR_CRAYON_PURPLE "#DA00FF" +#define COLOR_CRAYON_BLACK "#1C1C1C" +#define COLOR_CRAYON_RAINBOW "#FFF000" + ///Colors for grayscale tools #define COLOR_TOOL_BLUE "#1861d5" #define COLOR_TOOL_RED "#951710" @@ -191,6 +204,8 @@ #define LIGHT_COLOR_DEFAULT "#f3fffa" /// Bright but quickly dissipating neon green. rgb(100, 200, 100) #define LIGHT_COLOR_GREEN "#64C864" +/// Bright, pale "nuclear" green. rgb(120, 255, 120) +#define LIGHT_COLOR_NUCLEAR "#78FF78" /// Vivid, slightly blue green. rgb(60, 240, 70) #define LIGHT_COLOR_VIVID_GREEN "#3CF046" /// Electric green. rgb(0, 255, 0) @@ -310,6 +325,30 @@ #define COLOR_CARP_PALE_GREEN "#7ef099" #define COLOR_CARP_SILVER "#fdfbf3" #define COLOR_CARP_DARK_BLUE "#3a384d" +#define COLOR_CARP_DARK_GREEN "#358102" + +#define COLOR_SLIME_ADAMANTINE "#135f49" +#define COLOR_SLIME_BLACK "#3b3b3b" +#define COLOR_SLIME_BLUE "#19ffff" +#define COLOR_SLIME_BLUESPACE "#ebebeb" +#define COLOR_SLIME_CERULEAN "#5783aa" +#define COLOR_SLIME_DARK_BLUE "#2e9dff" +#define COLOR_SLIME_DARK_PURPLE "#9948f7" +#define COLOR_SLIME_GOLD "#c38b07" +#define COLOR_SLIME_GREEN "#07f024" +#define COLOR_SLIME_GREY "#c2c2c2" +#define COLOR_SLIME_LIGHT_PINK "#ffe1fa" +#define COLOR_SLIME_METAL "#676767" +#define COLOR_SLIME_OIL "#242424" +#define COLOR_SLIME_ORANGE "#ffb445" +#define COLOR_SLIME_PINK "#fe5bbd" +#define COLOR_SLIME_PURPLE "#d138ff" +#define COLOR_SLIME_PYRITE "#ffc427" +#define COLOR_SLIME_RAINBOW COLOR_SLIME_GREY // only for consistency +#define COLOR_SLIME_RED "#fb4848" +#define COLOR_SLIME_SEPIA "#9b8a7a" +#define COLOR_SLIME_SILVER "#dadada" +#define COLOR_SLIME_YELLOW "#fff419" #define COLOR_GNOME_RED_ONE "#f10b0b" #define COLOR_GNOME_RED_TWO "#bc5347" @@ -331,6 +370,17 @@ #define SOFA_BROWN "#a75400" #define SOFA_MAROON "#830000" +#define COLOR_ICECREAM_VANILLA "#f2eede" +#define COLOR_ICECREAM_CHOCOLATE "#93683c" +#define COLOR_ICECREAM_STRAWBERRY "#f4cbcb" +#define COLOR_ICECREAM_BLUE "#cbd5f4" +#define COLOR_ICECREAM_LEMON "#ffff9f" +#define COLOR_ICECREAM_CARAMEL "#d98736" +#define COLOR_ICECREAM_ORANGESICLE "#ffa980" +#define COLOR_ICECREAM_PEACH "#ffcc66" +#define COLOR_ICECREAM_CUSTOM "#f3f3f3" +#define COLOR_ICECREAM_CHERRY_CHOCOLATE "#800000" + GLOBAL_LIST_INIT(cable_colors, list( CABLE_COLOR_BLUE = CABLE_HEX_COLOR_BLUE, CABLE_COLOR_CYAN = CABLE_HEX_COLOR_CYAN, diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 040930e520568..cc9412208fb85 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -56,10 +56,12 @@ #define BRUTELOSS (1<<0) #define FIRELOSS (1<<1) #define TOXLOSS (1<<2) -#define OXYLOSS (1<<3) -#define SHAME (1<<4) -#define MANUAL_SUICIDE (1<<5) //suicide_act will do the actual killing. -#define MANUAL_SUICIDE_NONLETHAL (1<<6) //when the suicide is conditionally lethal +#define CLONELOSS (1<<3) +#define OXYLOSS (1<<4) +#define STAMINALOSS (1<<5) +#define SHAME (1<<6) +#define MANUAL_SUICIDE (1<<7) //suicide_act will do the actual killing. +#define MANUAL_SUICIDE_NONLETHAL (1<<8) //when the suicide is conditionally lethal #define EFFECT_STUN "stun" #define EFFECT_KNOCKDOWN "knockdown" @@ -67,12 +69,27 @@ #define EFFECT_PARALYZE "paralyze" #define EFFECT_IMMOBILIZE "immobilize" //Bitflags defining which status effects could be or are inflicted on a mob +/// If set, this mob can be stunned. #define CANSTUN (1<<0) +/// If set, this mob can be knocked down (or stamcrit) #define CANKNOCKDOWN (1<<1) +/// If set, this mob can be knocked unconscious via status effect. +/// NOTE, does not mean immune to sleep. Unconscious and sleep are two different things. +/// NOTE, does not relate to the unconscious stat either. Only the status effect. #define CANUNCONSCIOUS (1<<2) +/// If set, this mob can be grabbed or pushed when bumped into #define CANPUSH (1<<3) +/// Mob godmode. Prevents most statuses and damage from being taken, but is more often than not a crapshoot. Use with caution. #define GODMODE (1<<4) +DEFINE_BITFIELD(status_flags, list( + "CAN STUN" = CANSTUN, + "CAN KNOCKDOWN" = CANKNOCKDOWN, + "CAN UNCONSCIOUS" = CANUNCONSCIOUS, + "CAN PUSH" = CANPUSH, + "GOD MODE" = GODMODE, +)) + //Health Defines #define HEALTH_THRESHOLD_CRIT 0 #define HEALTH_THRESHOLD_FULLCRIT -30 @@ -84,10 +101,12 @@ //click cooldowns, in tenths of a second, used for various combat actions #define CLICK_CD_MELEE 8 -#define CLICK_CD_THROW 8 -#define CLICK_CD_RANGE 4 #define CLICK_CD_RAPID 2 #define CLICK_CD_HYPER_RAPID 1 +#define CLICK_CD_SLOW 10 + +#define CLICK_CD_THROW 8 +#define CLICK_CD_RANGE 4 #define CLICK_CD_CLICK_ABILITY 6 #define CLICK_CD_BREAKOUT 100 #define CLICK_CD_HANDCUFFED 10 @@ -255,6 +274,8 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( #define BODY_ZONE_L_LEG "l_leg" #define BODY_ZONE_R_LEG "r_leg" +GLOBAL_LIST_INIT(arm_zones, list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) + #define BODY_ZONE_PRECISE_EYES "eyes" #define BODY_ZONE_PRECISE_MOUTH "mouth" #define BODY_ZONE_PRECISE_GROIN "groin" @@ -320,6 +341,8 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( #define ARMOR_WEAKENED_MULTIPLIER 2 /// Armor can't block more than this as a percentage #define ARMOR_MAX_BLOCK 90 +/// Calculates the new armour value after armour penetration. Can return negative values, and those must be caught. +#define PENETRATE_ARMOUR(armour, penetration) (penetration == 100 ? 0 : 100 * (armour - penetration) / (100 - penetration)) /// Return values used in item/melee/baton/baton_attack. /// Does a normal item attack. diff --git a/code/__DEFINES/computers.dm b/code/__DEFINES/computers.dm index 1349913c1837e..ba3294ae68330 100644 --- a/code/__DEFINES/computers.dm +++ b/code/__DEFINES/computers.dm @@ -8,3 +8,6 @@ #define CATEGORY_CONSUMABLES "Consumables" #define CATEGORY_TOYS_DRONE "Toys & Drones" #define CATEGORY_PKA "PKAs" +#define CATEGORY_BEPIS "Bepis Tech" +#define CATEGORY_BITRUNNING_FLAIR "Misc" +#define CATEGORY_BITRUNNING_TECH "Tech" diff --git a/code/__DEFINES/configuration.dm b/code/__DEFINES/configuration.dm index 81965514fcbce..477bed243c1a2 100644 --- a/code/__DEFINES/configuration.dm +++ b/code/__DEFINES/configuration.dm @@ -20,3 +20,11 @@ #define KEY_MODE_TEXT 0 #define KEY_MODE_TYPE 1 + +// Flags for respawn config +/// Respawn not allowed +#define RESPAWN_FLAG_DISABLED 0 +/// Respawn as much as you'd like +#define RESPAWN_FLAG_FREE 1 +/// Can respawn, but not as the same character +#define RESPAWN_FLAG_NEW_CHARACTER 2 diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm index 3bc3492c96171..4e37baadffb49 100644 --- a/code/__DEFINES/construction.dm +++ b/code/__DEFINES/construction.dm @@ -80,6 +80,8 @@ #define HALF_SHEET_MATERIAL_AMOUNT (SHEET_MATERIAL_AMOUNT/2) ///The amount of materials used in the smallest of objects, like pens and screwdrivers. 10 units. #define SMALL_MATERIAL_AMOUNT (HALF_SHEET_MATERIAL_AMOUNT/5) +///The amount of material that goes into a coin, which determines the value of the coin. +#define COIN_MATERIAL_AMOUNT (HALF_SHEET_MATERIAL_AMOUNT * 0.4) //The maximum size of a stack object. #define MAX_STACK_SIZE 50 @@ -96,6 +98,7 @@ #define CAT_LIZARD "Lizard Food" #define CAT_MEAT "Meats" #define CAT_SEAFOOD "Seafood" +#define CAT_MARTIAN "Martian Food" #define CAT_MISCFOOD "Misc. Food" #define CAT_MEXICAN "Mexican Food" #define CAT_MOTH "Mothic Food" @@ -118,6 +121,7 @@ GLOBAL_LIST_INIT(crafting_category_food, list( CAT_LIZARD, CAT_MEAT, CAT_SEAFOOD, + CAT_MARTIAN, CAT_MISCFOOD, CAT_MEXICAN, CAT_MOTH, @@ -186,12 +190,15 @@ GLOBAL_LIST_INIT(crafting_category, list( #define RCD_FLOODLIGHT 8 #define RCD_WALLFRAME 9 #define RCD_REFLECTOR 10 +#define RCD_GIRDER 11 #define RCD_UPGRADE_FRAMES (1<<0) #define RCD_UPGRADE_SIMPLE_CIRCUITS (1<<1) #define RCD_UPGRADE_SILO_LINK (1<<2) #define RCD_UPGRADE_FURNISHING (1<<3) +#define RCD_UPGRADE_ANTI_INTERRUPT (1<<4) +#define RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN (1<<5) #define RPD_UPGRADE_UNWRENCH (1<<0) @@ -209,6 +216,9 @@ GLOBAL_LIST_INIT(crafting_category, list( /// How much less resources the RCD uses when reconstructing #define RCD_MEMORY_COST_BUFF 8 +/// If set to TRUE in rcd_vals, will bypass the cooldown on slowing down frequent use +#define RCD_RESULT_BYPASS_FREQUENT_USE_COOLDOWN "bypass_frequent_use_cooldown" + // Defines for the construction component #define FORWARD 1 #define BACKWARD -1 diff --git a/code/__DEFINES/cooldowns.dm b/code/__DEFINES/cooldowns.dm index 8aa3b5e38d907..63c1f2fd7136e 100644 --- a/code/__DEFINES/cooldowns.dm +++ b/code/__DEFINES/cooldowns.dm @@ -37,6 +37,7 @@ #define COOLDOWN_MECHA_SMOKE "mecha_smoke" #define COOLDOWN_MECHA_SKYFALL "mecha_skyfall" #define COOLDOWN_MECHA_MISSILE_STRIKE "mecha_missile_strike" +#define COOLDOWN_MECHA_CABIN_SEAL "mecha_cabin_seal" //car cooldowns #define COOLDOWN_CAR_HONK "car_honk" @@ -107,4 +108,6 @@ #define COOLDOWN_RESET(cd_source, cd_index) cd_source.cd_index = 0 +#define COOLDOWN_STARTED(cd_source, cd_index) (cd_source.cd_index != 0) + #define COOLDOWN_TIMELEFT(cd_source, cd_index) (max(0, cd_source.cd_index - world.time)) diff --git a/code/__DEFINES/crushing.dm b/code/__DEFINES/crushing.dm new file mode 100644 index 0000000000000..1261b98e730e8 --- /dev/null +++ b/code/__DEFINES/crushing.dm @@ -0,0 +1,15 @@ +// from _vending.dm + +/// Set if the tipped object successfully crushed a subtype of /mob/living. +#define SUCCESSFULLY_CRUSHED_MOB (1<<0) +/// Set if the tipped object successfully crushed a subtype of /atom. +#define SUCCESSFULLY_CRUSHED_ATOM (1<<1) +/// Set if the tipped object successfully actually fell over, which can fail if it couldn't enter the turf it tried to fall into. +#define SUCCESSFULLY_FELL_OVER (1<<2) + +#define CRUSH_CRIT_SHATTER_LEGS "crush_crit_shatter_legs" +#define CRUSH_CRIT_PARAPALEGIC "crush_crit_parapalegic" +#define CRUSH_CRIT_SQUISH_LIMB "crush_crit_pin" +#define CRUSH_CRIT_HEADGIB "crush_crit_headgib" +#define VENDOR_CRUSH_CRIT_PIN "vendor_crush_crit_pin" +#define VENDOR_CRUSH_CRIT_GLASSCANDY "vendor_crush_crit_glasscandy" diff --git a/code/__DEFINES/cult.dm b/code/__DEFINES/cult.dm index 93437e31bb05f..8042b438ff7fd 100644 --- a/code/__DEFINES/cult.dm +++ b/code/__DEFINES/cult.dm @@ -43,3 +43,8 @@ GLOBAL_DATUM(cult_narsie, /obj/narsie) #define CULT_VICTORY_MASS_CONVERSION 2 #define CULT_FAILURE_NARSIE_KILLED 1 #define CULT_VICTORY_NUKE 0 + +// Used to determine the roundend report. +#define CULT_VICTORY 1 +#define CULT_LOSS 0 +#define CULT_NARSIE_KILLED -1 diff --git a/code/__DEFINES/dcs/flags.dm b/code/__DEFINES/dcs/flags.dm index 3f3db0212b6d6..7543157319f21 100644 --- a/code/__DEFINES/dcs/flags.dm +++ b/code/__DEFINES/dcs/flags.dm @@ -1,4 +1,4 @@ -/// Return this from `/datum/component/Initialize` or `datum/component/OnTransfer` to have the component be deleted if it's applied to an incorrect type. +/// Return this from `/datum/component/Initialize` or `/datum/component/OnTransfer` or `/datum/component/on_source_add` to have the component be deleted if it's applied to an incorrect type. /// `parent` must not be modified if this is to be returned. /// This will be noted in the runtime logs #define COMPONENT_INCOMPATIBLE 1 @@ -22,6 +22,13 @@ /// Causes all detach arguments to be passed to detach instead of only being used to identify the element /// When this is used your Detach proc should have the same signature as your Attach proc #define ELEMENT_COMPLEX_DETACH (1 << 2) +/** + * Stops lists used as arguments for the element from being sorted by the dcs_check_list_arguments unit test. + * For when changing the position of the keys is undesiderable, like for color matrices. + */ +#define ELEMENT_DONT_SORT_LIST_ARGS (1<<3) +/// Elements with this flag will be ignored by the test (I would rather put some faith than have contributors stringify connect loc lists). +#define ELEMENT_NO_LIST_UNIT_TEST (1<<4) // How multiple components of the exact same type are handled in the same datum /// old component is deleted (default) @@ -33,8 +40,8 @@ /** * Component uses source tracking to manage adding and removal logic. * Add a source/spawn to/the component by using AddComponentFrom(source, component_type, args...) - * Only the first args will be respected, and you should instead handle most of your logic in the on_source_added proc. * Removing the last source will automatically remove the component from the parent. + * Arguments will be passed to on_source_add(source, args...); ensure that Initialize and on_source_add have the same signature. */ #define COMPONENT_DUPE_SOURCES 3 /// old component is given the initialization args of the new diff --git a/code/__DEFINES/dcs/signals/signals_action.dm b/code/__DEFINES/dcs/signals/signals_action.dm index f928975813cb0..6fbf5372acdd2 100644 --- a/code/__DEFINES/dcs/signals/signals_action.dm +++ b/code/__DEFINES/dcs/signals/signals_action.dm @@ -40,5 +40,11 @@ /// From base of /datum/action/cooldown/mob_cooldown/lava_swoop/proc/swoop_attack(): () #define COMSIG_LAVA_ARENA_FAILED "mob_lava_arena_failed" -///From /datum/action/vehicle/sealed/mecha/mech_toggle_safeties/proc/update_action_icon(): () +/// From /datum/action/vehicle/sealed/mecha/mech_toggle_safeties/proc/update_action_icon(): () #define COMSIG_MECH_SAFETIES_TOGGLE "mech_safeties_toggle" + +/// From /datum/action/cooldown/mob_cooldown/assume_form/proc/assume_appearances(), sent to the action owner: (atom/movable/target) +#define COMSIG_ACTION_DISGUISED_APPEARANCE "mob_ability_disguise_appearance" + +/// From /datum/action/cooldown/manual_heart/Activate(): () +#define COMSIG_HEART_MANUAL_PULSE "heart_manual_pulse" diff --git a/code/__DEFINES/dcs/signals/signals_area.dm b/code/__DEFINES/dcs/signals/signals_area.dm index df5104cd88555..762431788f258 100644 --- a/code/__DEFINES/dcs/signals/signals_area.dm +++ b/code/__DEFINES/dcs/signals/signals_area.dm @@ -30,3 +30,8 @@ // Area fire signals /// Sent when an area's fire var changes: (fire_value) #define COMSIG_AREA_FIRE_CHANGED "area_fire_set" + +/// Called when some weather starts in this area +#define COMSIG_WEATHER_BEGAN_IN_AREA(event_type) "weather_began_in_area_[event_type]" +/// Called when some weather ends in this area +#define COMSIG_WEATHER_ENDED_IN_AREA(event_type) "weather_ended_in_area_[event_type]" 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 2c6d71d25291e..932fc008848f5 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm @@ -50,5 +50,22 @@ #define COMSIG_ATOM_ATTACK_ROBOT "atom_attack_robot" /// from base of atom/attack_robot_secondary(): (mob/user) #define COMSIG_ATOM_ATTACK_ROBOT_SECONDARY "atom_attack_robot_secondary" -///from relay_attackers element: (atom/attacker) +///from relay_attackers element: (atom/attacker, attack_flags) #define COMSIG_ATOM_WAS_ATTACKED "atom_was_attacked" +///Called before a atom gets something tilted on them. If [COMPONENT_IMMUNE_TO_TILT_AND_CRUSH] is returned in a signal, the atom will be unaffected: (atom/target, atom/source) +#define COMSIG_PRE_TILT_AND_CRUSH "atom_pre_tilt_and_crush" + #define COMPONENT_IMMUNE_TO_TILT_AND_CRUSH (1<<0) +///Called when a atom gets something tilted on them: (atom/target, atom/source) +#define COMSIG_POST_TILT_AND_CRUSH "atom_post_tilt_and_crush" +/// Called when an atom is splashed with something: (atom/source) +#define COMSIG_ATOM_SPLASHED "atom_splashed" + + ///The damage type of the weapon projectile is non-lethal stamina + #define ATTACKER_STAMINA_ATTACK (1<<0) + ///the attacker is shoving the source + #define ATTACKER_SHOVING (1<<1) + /// The attack is a damaging-type attack + #define ATTACKER_DAMAGING_ATTACK (1<<2) + +/// Called on the atom being hit, from /datum/component/anti_magic/on_attack() : (obj/item/weapon, mob/user, antimagic_flags) +#define COMSIG_ATOM_HOLYATTACK "atom_holyattacked" diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_lighting.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_lighting.dm index 88a29ec697a4d..1289ca3a46cad 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_lighting.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_lighting.dm @@ -19,6 +19,14 @@ #define COMSIG_ATOM_SET_LIGHT_COLOR "atom_set_light_color" ///Called right after the atom changes the value of light_color to a different one, from base of [/atom/proc/set_light_color]: (old_color) #define COMSIG_ATOM_UPDATE_LIGHT_COLOR "atom_update_light_color" +///Called right before the atom changes the value of light_angle to a different one, from base [atom/proc/set_light_angle]: (new_angle) +#define COMSIG_ATOM_SET_LIGHT_ANGLE "atom_set_light_angle" +///Called right after the atom changes the value of light_angle to a different one, from base of [/atom/proc/set_light_angle]: (old_angle) +#define COMSIG_ATOM_UPDATE_LIGHT_ANGLE "atom_update_light_angle" +///Called right before the atom changes the value of light_dir to a different one, from base [atom/proc/set_light_dir]: (new_dir) +#define COMSIG_ATOM_SET_LIGHT_DIR "atom_set_light_dir" +///Called right after the atom changes the value of light_dir to a different one, from base of [/atom/proc/set_light_dir]: (old_dir) +#define COMSIG_ATOM_UPDATE_LIGHT_DIR "atom_update_light_dir" ///Called right before the atom changes the value of light_on to a different one, from base [atom/proc/set_light_on]: (new_value) #define COMSIG_ATOM_SET_LIGHT_ON "atom_set_light_on" ///Called right after the atom changes the value of light_on to a different one, from base of [/atom/proc/set_light_on]: (old_value) @@ -27,3 +35,6 @@ #define COMSIG_ATOM_SET_LIGHT_FLAGS "atom_set_light_flags" ///Called right after the atom changes the value of light_flags to a different one, from base of [/atom/proc/set_light_flags]: (old_flags) #define COMSIG_ATOM_UPDATE_LIGHT_FLAGS "atom_update_light_flags" + +///Called when an atom has a light template applied to it. Frombase of [/datum/light_template/proc/mirror_onto]: () +#define COMSIG_ATOM_LIGHT_TEMPLATE_MIRRORED "atom_light_template_mirrored" 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 0542d22b68671..cd123e2e0b15e 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm @@ -3,25 +3,27 @@ // All signals send the source datum of the signal as the first argument // /atom signals -///from base of atom/proc/Initialize(): sent any time a new atom is created in this atom -#define COMSIG_ATOM_INITIALIZED_ON "atom_initialized_on" //from SSatoms InitAtom - Only if the atom was not deleted or failed initialization #define COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE "atom_init_success" +//from SSatoms InitAtom - Only if the atom was not deleted or failed initialization and has a loc +#define COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON "atom_init_success_on" ///from base of atom/examine(): (/mob, list/examine_text) #define COMSIG_ATOM_EXAMINE "atom_examine" ///from base of atom/get_examine_name(): (/mob, list/overrides) #define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name" -///from base of atom/examine(): (/mob, list/examine_text, can_see_inside) -#define COMSIG_ATOM_REAGENT_EXAMINE "atom_reagent_examine" - /// Stop the generic reagent examine text - #define STOP_GENERIC_REAGENT_EXAMINE (1<<0) -///from base of atom/examine_more(): (/mob) -#define COMSIG_ATOM_EXAMINE_MORE "atom_examine_more" //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/examine(): (/mob, list/examine_text, can_see_inside) +#define COMSIG_ATOM_REAGENT_EXAMINE "atom_reagent_examine" + /// Stop the generic reagent examine text + #define STOP_GENERIC_REAGENT_EXAMINE (1<<0) +///from base of atom/examine_more(): (/mob, examine_list) +#define COMSIG_ATOM_EXAMINE_MORE "atom_examine_more" +/// from atom/examine_more(): (/atom/examining, examine_list) +#define COMSIG_MOB_EXAMINING_MORE "mob_examining_more" ///from base of [/atom/proc/update_appearance]: (updates) #define COMSIG_ATOM_UPDATE_APPEARANCE "atom_update_appearance" /// If returned from [COMSIG_ATOM_UPDATE_APPEARANCE] it prevents the atom from updating its name. @@ -67,8 +69,6 @@ #define COMSIG_ATOM_ABSTRACT_EXITED "atom_abstract_exited" ///from base of atom/Bumped(): (/atom/movable) #define COMSIG_ATOM_BUMPED "atom_bumped" -///from base of atom/handle_atom_del(): (atom/deleted) -#define COMSIG_ATOM_CONTENTS_DEL "atom_contents_del" ///from base of atom/has_gravity(): (turf/location, list/forced_gravities) #define COMSIG_ATOM_HAS_GRAVITY "atom_has_gravity" ///from internal loop in atom/movable/proc/CanReach(): (list/next) @@ -76,7 +76,7 @@ #define COMPONENT_ALLOW_REACH (1<<0) ///for when an atom has been created through processing (atom/original_atom, list/chosen_processing_option) #define COMSIG_ATOM_CREATEDBY_PROCESSING "atom_createdby_processing" -///when an atom is processed (mob/living/user, obj/item/I, list/atom/results) +///when an atom is processed (mob/living/user, obj/item/process_item, list/atom/results) #define COMSIG_ATOM_PROCESSED "atom_processed" ///called when teleporting into a possibly protected turf: (channel, turf/origin, turf/destination) #define COMSIG_ATOM_INTERCEPT_TELEPORTING "intercept_teleporting" @@ -91,6 +91,9 @@ #define COMSIG_ATOM_ORBIT_STOP "atom_orbit_stop" ///from base of atom/set_opacity(): (new_opacity) #define COMSIG_ATOM_SET_OPACITY "atom_set_opacity" +///from base of atom/throw_impact, sent by the target hit by a thrown object. (hit_atom, thrown_atom, datum/thrownthing/throwingdatum) +#define COMSIG_ATOM_PREHITBY "atom_pre_hitby" + #define COMSIG_HIT_PREVENTED (1<<0) ///from base of atom/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) #define COMSIG_ATOM_HITBY "atom_hitby" ///when an atom starts playing a song datum (datum/song) @@ -102,6 +105,10 @@ /// generally called before temporary non-parallel animate()s on the atom (animation_duration) #define COMSIG_ATOM_TEMPORARY_ANIMATION_START "atom_temp_animate_start" +/// called on [/obj/item/lazarus_injector/afterattack] : (injector, user) +#define COMSIG_ATOM_ON_LAZARUS_INJECTOR "atom_on_lazarus_injector" + #define LAZARUS_INJECTOR_USED (1<<0) //Early return. + /// from internal loop in /atom/proc/propagate_radiation_pulse: (atom/pulse_source) #define COMSIG_ATOM_PROPAGATE_RAD_PULSE "atom_propagate_radiation_pulse" /// from cosmetic items to restyle certain mobs, objects or organs: (atom/source, mob/living/trimmer, atom/movable/original_target, body_zone, restyle_type, style_speed) @@ -110,3 +117,13 @@ #define COMSIG_ATOM_TIMESTOP_FREEZE "atom_timestop_freeze" /// when the timestop ability effect ends on the atom: (datum/proximity_monitor/advanced/timestop) #define COMSIG_ATOM_TIMESTOP_UNFREEZE "atom_timestop_unfreeze" + +/// Called on [/atom/SpinAnimation()] : (speed, loops, segments, angle) +#define COMSIG_ATOM_SPIN_ANIMATION "atom_spin_animation" + +/// when atom falls onto the floor and become exposed to germs: (datum/component/germ_exposure) +#define COMSIG_ATOM_GERM_EXPOSED "atom_germ_exposed" +/// when atom is picked up from the floor or moved to an elevated structure: (datum/component/germ_exposure) +#define COMSIG_ATOM_GERM_UNEXPOSED "atom_germ_unexposed" +/// when atom is washed +#define COMSIG_ATOM_WASHED "atom_washed" 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 2f8ebc836650d..2312c42baa4e5 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm @@ -8,7 +8,7 @@ #define COMSIG_CLICK "atom_click" ///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. + #define COMPONENT_ALLOW_EXAMINATE (1<<0) //! Allows the user to examinate regardless of client.eye. ///from base of atom/CtrlClickOn(): (/mob) #define COMSIG_CLICK_CTRL "ctrl_click" ///from base of atom/AltClick(): (/mob) 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 dc4d5a25ea0c9..5e6d7491d9423 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm @@ -104,3 +104,13 @@ #define MOVABLE_SAY_QUOTE_MESSAGE 1 #define MOVABLE_SAY_QUOTE_MESSAGE_SPANS 2 #define MOVABLE_SAY_QUOTE_MESSAGE_MODS 3 + +/// Sent from /atom/movable/proc/compose_message() after the name part: (list/stored_name, visible_name) +#define COMSIG_MOVABLE_MESSAGE_GET_NAME_PART "movable_message_get_name_part" + ///The index of the name part + #define NAME_PART_INDEX 1 + +/// From /datum/element/immerse/proc/add_submerge_overlay(): (visual_overlay) +#define COMSIG_MOVABLE_EDIT_UNIQUE_IMMERSE_OVERLAY "movable_edit_unique_submerge_overlay" +/// From base of area/Exited(): (area/left, direction) +#define COMSIG_MOVABLE_EXITED_AREA "movable_exited_area" 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 d5c6a1888526a..0c9523b9c20a8 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movement.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movement.dm @@ -17,6 +17,9 @@ #define COMSIG_ATOM_AFTER_SHUTTLE_MOVE "movable_after_shuttle_move" ///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 /atom when something attempts to pass through it (atom/movable/source, atom/movable/passing, dir) +#define COMSIG_ATOM_TRIED_PASS "atom_tried_pass" + #define COMSIG_COMPONENT_PERMIT_PASSAGE (1 << 0) ///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) @@ -38,7 +41,7 @@ #define COMSIG_BLOCK_RELAYMOVE (1<<0) /// From base of atom/setDir(): (old_dir, new_dir). Called before the direction changes -#define COMSIG_ATOM_PRE_DIR_CHANGE "mob_pre_face_atom" +#define COMSIG_ATOM_PRE_DIR_CHANGE "atom_pre_face_atom" #define COMPONENT_ATOM_BLOCK_DIR_CHANGE (1<<0) ///from base of atom/setDir(): (old_dir, new_dir). Called before the direction changes. #define COMSIG_ATOM_DIR_CHANGE "atom_dir_change" @@ -53,3 +56,5 @@ #define COMSIG_ATOM_PRE_PRESSURE_PUSH "atom_pre_pressure_push" ///prevents pressure movement #define COMSIG_ATOM_BLOCKS_PRESSURE (1<<0) +///From base of /datum/move_loop/process() after attempting to move a movable: (datum/move_loop/loop, old_dir) +#define COMSIG_MOVABLE_MOVED_FROM_LOOP "movable_moved_from_loop" diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm index 33b279cc3f8e8..e1811a24af3a1 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm @@ -4,7 +4,9 @@ ///from the [EX_ACT] wrapper macro: (severity, target) #define COMSIG_ATOM_EX_ACT "atom_ex_act" -///from base of atom/emp_act(): (severity) +///from base of atom/emp_act(): (severity). return EMP protection flags +#define COMSIG_ATOM_PRE_EMP_ACT "atom_emp_act" +///from base of atom/emp_act(): (severity, protection) #define COMSIG_ATOM_EMP_ACT "atom_emp_act" ///from base of atom/fire_act(): (exposed_temperature, exposed_volume) #define COMSIG_ATOM_FIRE_ACT "atom_fire_act" diff --git a/code/__DEFINES/dcs/signals/signals_backpack.dm b/code/__DEFINES/dcs/signals/signals_backpack.dm new file mode 100644 index 0000000000000..d202e950fc61f --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_backpack.dm @@ -0,0 +1,2 @@ +/// From /obj/item/storage/backpack/duffelbag/proc/set_zipper() : (new_zip) +#define COMSIG_DUFFEL_ZIP_CHANGE "duffel_zip_change" diff --git a/code/__DEFINES/dcs/signals/signals_bitrunning.dm b/code/__DEFINES/dcs/signals/signals_bitrunning.dm new file mode 100644 index 0000000000000..3d008449ee7b7 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_bitrunning.dm @@ -0,0 +1,31 @@ +/// from /obj/machinery/netpod/default_pry_open() : (mob/living/intruder) +#define COMSIG_BITRUNNER_CROWBAR_ALERT "bitrunner_crowbar" + +/// from /obj/effect/bitrunning/loot_signal: (points) +#define COMSIG_BITRUNNER_GOAL_POINT "bitrunner_goal_point" + +/// from /obj/machinery/quantum_server/on_goal_turf_entered(): (atom/entered, reward_points) +#define COMSIG_BITRUNNER_DOMAIN_COMPLETE "bitrunner_complete" + +/// from /obj/machinery/netpod/on_take_damage() +#define COMSIG_BITRUNNER_NETPOD_INTEGRITY "bitrunner_netpod_damage" + +/// from /obj/structure/hololadder and complete alert +#define COMSIG_BITRUNNER_SAFE_DISCONNECT "bitrunner_disconnect" + +/// from /obj/machinery/netpod/open_machine(), /obj/machinery/quantum_server, etc (obj/machinery/netpod) +#define COMSIG_BITRUNNER_SEVER_AVATAR "bitrunner_sever" + +/// from /obj/machinery/quantum_server/shutdown() : (mob/living) +#define COMSIG_BITRUNNER_SHUTDOWN_ALERT "bitrunner_shutdown" + +// Notifies the bitrunners +/// from /datum/antagonist/cyber_police/proc/notify() : +#define COMSIG_BITRUNNER_THREAT_CREATED "bitrunner_threat" + +// Informs the server to up the threat count +/// from event spawns: (mob/living) +#define COMSIG_BITRUNNER_SPAWN_GLITCH "bitrunner_spawn_glitch" + +/// from /obj/machinery/quantum_server/refreshParts(): (servo rating) +#define COMSIG_BITRUNNER_SERVER_UPGRADED "bitrunner_server_upgraded" diff --git a/code/__DEFINES/dcs/signals/signals_blob.dm b/code/__DEFINES/dcs/signals/signals_blob.dm new file mode 100644 index 0000000000000..afd4737bdd968 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_blob.dm @@ -0,0 +1,4 @@ +/// Signal sent when a blob overmind picked a new strain (/mob/camera/blob/overmind, /datum/blobstrain/new_strain) +#define COMSIG_BLOB_SELECTED_STRAIN "blob_selected_strain" +/// Signal sent by a blob spore when it creates a zombie (/mob/living/basic/blob_minion/spore/spore, //mob/living/basic/blob_minion/zombie/zombie) +#define COMSIG_BLOB_ZOMBIFIED "blob_zombified" diff --git a/code/__DEFINES/dcs/signals/signals_camera.dm b/code/__DEFINES/dcs/signals/signals_camera.dm new file mode 100644 index 0000000000000..6ec142f54fabe --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_camera.dm @@ -0,0 +1,2 @@ +///Signal sent when a /datum/trackable found a target: (datum/trackable/source, mob/living/target) +#define COMSIG_TRACKABLE_TRACKING_TARGET "comsig_trackable_tracking_target" diff --git a/code/__DEFINES/dcs/signals/signals_clothing.dm b/code/__DEFINES/dcs/signals/signals_clothing.dm index b48acbf97e937..03b695aca4c3e 100644 --- a/code/__DEFINES/dcs/signals/signals_clothing.dm +++ b/code/__DEFINES/dcs/signals/signals_clothing.dm @@ -1,6 +1,21 @@ // /obj/item/clothing /// (/obj/item/clothing, visor_state) - When a clothing gets it's visor toggled. #define COMSIG_CLOTHING_VISOR_TOGGLE "clothing_visor_toggle" -// /obj/item/clothing -/// Sent when mobs try to equip clothing on others through attacking -#define COMSIG_CLOTHING_ATTACK_EQUIP "clothing_attack_equip" +/// From an undersuit being adjusted: () +#define COMSIG_CLOTHING_UNDER_ADJUSTED "clothing_under_adjusted" + +// Accessory sending to clothing +/// /obj/item/clothing/accessory/successful_attach : (obj/item/clothing/under/attached_to) +/// The accessory, at the point of signal sent, is in the clothing's accessory list / loc +#define COMSIG_CLOTHING_ACCESSORY_ATTACHED "clothing_accessory_pinned" +/// /obj/item/clothing/accessory/detach : (obj/item/clothing/under/detach_from) +/// The accessory, at the point of signal sent, is no longer in the accessory list but may still be in the loc +#define COMSIG_CLOTHING_ACCESSORY_DETACHED "clothing_accessory_unpinned" + +// To accessories themselves +/// /obj/item/clothing/accessory/successful_attach : (obj/item/clothing/under/attached_to) +/// The accessory, at the point of signal sent, is in the clothing's accessory list / loc +#define COMSIG_ACCESSORY_ATTACHED "accessory_pinned" +/// /obj/item/clothing/accessory/detach : (obj/item/clothing/under/detach_from) +/// The accessory, at the point of signal sent, is no longer in the accessory list but may still be in the loc +#define COMSIG_ACCESSORY_DETACHED "accessory_unpinned" diff --git a/code/__DEFINES/dcs/signals/signals_datum.dm b/code/__DEFINES/dcs/signals/signals_datum.dm index 879ff60eaa2f9..0c998be19219f 100644 --- a/code/__DEFINES/dcs/signals/signals_datum.dm +++ b/code/__DEFINES/dcs/signals/signals_datum.dm @@ -43,12 +43,5 @@ /// 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/modular_computer/proc/store_file: () -#define COMSIG_MODULAR_COMPUTER_FILE_ADDING "comsig_modular_computer_file_adding" -/// From /obj/item/modular_computer/proc/store_file: () -#define COMSIG_MODULAR_COMPUTER_FILE_ADDED "comsig_modular_computer_file_added" -/// From /obj/item/modular_computer/proc/remove_file: () -#define COMSIG_MODULAR_COMPUTER_FILE_DELETING "comsig_modular_computer_file_deleting" -/// From /obj/item/modular_computer/proc/store_file: () -#define COMSIG_MODULAR_COMPUTER_FILE_DELETED "comsig_modular_computer_file_deleted" +///from /datum/bank_account/pay_debt(), after a portion or all the debt has been paid. +#define COMSIG_BANK_ACCOUNT_DEBT_PAID "bank_account_debt_paid" diff --git a/code/__DEFINES/dcs/signals/signals_fish.dm b/code/__DEFINES/dcs/signals/signals_fish.dm index 89e25d851362d..a40e731fc7bf6 100644 --- a/code/__DEFINES/dcs/signals/signals_fish.dm +++ b/code/__DEFINES/dcs/signals/signals_fish.dm @@ -5,9 +5,18 @@ // Fish signals #define COMSIG_FISH_STATUS_CHANGED "fish_status_changed" #define COMSIG_FISH_STIRRED "fish_stirred" +///From /obj/item/fish/process: (seconds_per_tick) +#define COMSIG_FISH_LIFE "fish_life" +///From /datum/fish_trait/eat_fish: (predator) +#define COMSIG_FISH_EATEN_BY_OTHER_FISH "fish_eaten_by_other_fish" +///From /obj/item/fish/feed: (fed_reagents, fed_reagent_type) +#define COMSIG_FISH_FED "fish_on_fed" /// Fishing challenge completed #define COMSIG_FISHING_CHALLENGE_COMPLETED "fishing_completed" +/// Sent to the fisherman when the reward is dispensed: (reward) +#define COMSIG_MOB_FISHING_REWARD_DISPENSED "mob_fishing_reward_dispensed" + /// Called when you try to use fishing rod on anything #define COMSIG_PRE_FISHING "pre_fishing" @@ -15,5 +24,13 @@ #define COMSIG_FISHING_ROD_CAST "fishing_rod_cast" #define FISHING_ROD_CAST_HANDLED (1 << 0) -/// Sent when fishing line is snapped -#define COMSIG_FISHING_LINE_SNAPPED "fishing_line_interrupted" +/// From /datum/fish_source/proc/dispense_reward(), not set if the reward is a dud: (reward, user) +#define COMSIG_FISHING_ROD_CAUGHT_FISH "fishing_rod_caught_fish" +/// From /obj/item/fishing_rod/proc/hook_item(): (reward, user) +#define COMSIG_FISHING_ROD_HOOKED_ITEM "fishing_rod_hooked_item" + +/// Sent when the challenge is to be interrupted: (reason) +#define COMSIG_FISHING_SOURCE_INTERRUPT_CHALLENGE "fishing_spot_interrupt_challenge" + +/// From /obj/item/fish_analyzer/proc/analyze_status: (fish, user) +#define COMSIG_FISH_ANALYZER_ANALYZE_STATUS "fish_analyzer_analyze_status" diff --git a/code/__DEFINES/dcs/signals/signals_food.dm b/code/__DEFINES/dcs/signals/signals_food.dm index 4b7f773138ec0..36a8b7b3392cf 100644 --- a/code/__DEFINES/dcs/signals/signals_food.dm +++ b/code/__DEFINES/dcs/signals/signals_food.dm @@ -9,6 +9,8 @@ #define COMSIG_FOOD_CROSSED "food_crossed" /// From base of Component/edible/On_Consume: (mob/living/eater, mob/living/feeder) #define COMSIG_FOOD_CONSUMED "food_consumed" +/// called when a pill is injested (mob/living/eater, mob/living/feeder) +#define COMSIG_PILL_CONSUMED "pill_consumed" /// called when an item is used as an ingredient: (atom/customized) #define COMSIG_ITEM_USED_AS_INGREDIENT "item_used_as_ingredient" /// called when an edible ingredient is added: (datum/component/edible/ingredient) diff --git a/code/__DEFINES/dcs/signals/signals_global.dm b/code/__DEFINES/dcs/signals/signals_global.dm index 486ae93e3f778..c75b169b90dc5 100644 --- a/code/__DEFINES/dcs/signals/signals_global.dm +++ b/code/__DEFINES/dcs/signals/signals_global.dm @@ -51,6 +51,8 @@ #define LINKED_UP (1<<0) /// an obj/item is created! (obj/item/created_item) #define COMSIG_GLOB_NEW_ITEM "!new_item" +/// called post /obj/item initialize (obj/item/created_item) +#define COMSIG_GLOB_ATOM_AFTER_POST_INIT "!atom_after_post_init" /// an obj/machinery is created! (obj/machinery/created_machine) #define COMSIG_GLOB_NEW_MACHINE "!new_machine" /// a client (re)connected, after all /client/New() checks have passed : (client/connected_client) @@ -72,10 +74,11 @@ /// global signal sent when a nuclear device is disarmed (/obj/machinery/nuclearbomb/nuke/disarmed_nuke) #define COMSIG_GLOB_NUKE_DEVICE_DISARMED "!nuclear_device_disarmed" +/// global signal sent when a nuclear device is detonating (/obj/machinery/nuclearbomb/nuke/exploding_nuke) +#define COMSIG_GLOB_NUKE_DEVICE_DETONATING "!nuclear_device_detonating" + /// Global signal sent when a light mechanism is completed (try_id) #define COMSIG_GLOB_LIGHT_MECHANISM_COMPLETED "!light_mechanism_completed" -/// Global Signal sent when the crew wins the revolution (No arguments). -#define COMSIG_GLOB_REVOLUTION_VICTORY "!revolution_victory" /// Global signal called after the station changes its name. /// (new_name, old_name) @@ -83,3 +86,11 @@ /// global signal when a global nullrod type is picked #define COMSIG_GLOB_NULLROD_PICKED "!nullrod_picked" + +/// Global signal when light debugging is canceled +#define COMSIG_LIGHT_DEBUG_DISABLED "!light_debug_disabled" + +/// Global signal sent when a religious sect is chosen +#define COMSIG_RELIGIOUS_SECT_CHANGED "!religious_sect_changed" +/// Global signal sent when a religious sect is reset +#define COMSIG_RELIGIOUS_SECT_RESET "!religious_sect_reset" diff --git a/code/__DEFINES/dcs/signals/signals_hud.dm b/code/__DEFINES/dcs/signals/signals_hud.dm index b4d73459db68c..2d5d3eaa59cc3 100644 --- a/code/__DEFINES/dcs/signals/signals_hud.dm +++ b/code/__DEFINES/dcs/signals/signals_hud.dm @@ -2,4 +2,9 @@ #define COMSIG_HUD_EYE_CHANGED "hud_eye_changed" /// Sent from /datum/hud/proc/eye_z_changed() : (old_offset, new_offset) #define COMSIG_HUD_OFFSET_CHANGED "hud_offset_changed" - +/// Sent from /atom/movable/screen/lobby/button/collapse/proc/collapse_buttons() : () +#define COMSIG_HUD_LOBBY_COLLAPSED "hud_lobby_collapsed" +/// Sent from /atom/movable/screen/lobby/button/collapse/proc/expand_buttons() : () +#define COMSIG_HUD_LOBBY_EXPANDED "hud_lobby_expanded" +/// Sent from /atom/movable/screen/lobby/button/ready/Click() : () +#define COMSIG_HUD_PLAYER_READY_TOGGLE "hud_player_ready_toggle" diff --git a/code/__DEFINES/dcs/signals/signals_lazy_templates.dm b/code/__DEFINES/dcs/signals/signals_lazy_templates.dm new file mode 100644 index 0000000000000..1c6ce7926ea5c --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_lazy_templates.dm @@ -0,0 +1,2 @@ +/// Fired on the lazy template datum when the template is finished loading. (list/loaded_atom_movables, list/loaded_turfs, list/loaded_areas) +#define COMSIG_LAZY_TEMPLATE_LOADED "lazy_template_loaded" diff --git a/code/__DEFINES/dcs/signals/signals_leash.dm b/code/__DEFINES/dcs/signals/signals_leash.dm new file mode 100644 index 0000000000000..4f83d79090342 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_leash.dm @@ -0,0 +1,11 @@ +/// Called when a /datum/component/leash must forcibly teleport the parent to the owner. +/// Fired on the object with the leash component. +#define COMSIG_LEASH_FORCE_TELEPORT "leash_force_teleport" + +/// Called when a /datum/component/leash plans on pathfinding to the target, if out of range. +/// Fired on the object with the leash component. +#define COMSIG_LEASH_PATH_STARTED "leash_path_started" + +/// Called when a /datum/component/leash finishes its pathfinding to the target. +/// Fired on the object with the leash component. +#define COMSIG_LEASH_PATH_COMPLETE "leash_path_complete" diff --git a/code/__DEFINES/dcs/signals/signals_material_container.dm b/code/__DEFINES/dcs/signals/signals_material_container.dm new file mode 100644 index 0000000000000..f33567a2739da --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_material_container.dm @@ -0,0 +1,11 @@ +//Material Container Signals +/// Called from datum/component/material_container/proc/can_hold_material() : (mat) +#define COMSIG_MATCONTAINER_MAT_CHECK "matcontainer_mat_check" + #define MATCONTAINER_ALLOW_MAT (1<<0) +/// Called from datum/component/material_container/proc/user_insert() : (held_item, user) +#define COMSIG_MATCONTAINER_PRE_USER_INSERT "matcontainer_pre_user_insert" + #define MATCONTAINER_BLOCK_INSERT (1<<1) +/// Called from datum/component/material_container/proc/insert_item() : (target, last_inserted_id, mats_consumed, material_amount, context) +#define COMSIG_MATCONTAINER_ITEM_CONSUMED "matcontainer_item_consumed" +/// Called from datum/component/material_container/proc/retrieve_sheets() : (sheets, context) +#define COMSIG_MATCONTAINER_SHEETS_RETRIEVED "matcontainer_sheets_retrieved" diff --git a/code/__DEFINES/dcs/signals/signals_medical.dm b/code/__DEFINES/dcs/signals/signals_medical.dm index 801eb6b41bb13..2dca6487f7020 100644 --- a/code/__DEFINES/dcs/signals/signals_medical.dm +++ b/code/__DEFINES/dcs/signals/signals_medical.dm @@ -4,9 +4,14 @@ /// From /datum/surgery_step/success(): (datum/surgery_step/step, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) #define COMSIG_MOB_SURGERY_STEP_SUCCESS "mob_surgery_step_success" +/// From /obj/item/shockpaddles/do_help, after the defib do_after is complete, but before any effects are applied: (mob/living/defibber, obj/item/shockpaddles/source) +#define COMSIG_DEFIBRILLATOR_PRE_HELP_ZAP "carbon_being_defibbed" + /// Return to stop default defib handling + #define COMPONENT_DEFIB_STOP (1<<0) + /// From /obj/item/shockpaddles/proc/do_success(): (obj/item/shockpaddles/source) #define COMSIG_DEFIBRILLATOR_SUCCESS "defib_success" - #define COMPONENT_DEFIB_STOP (1<<0) + // #define COMPONENT_DEFIB_STOP (1<<0) // Same return, to stop default defib handling /// From /datum/surgery/can_start(): (mob/source, datum/surgery/surgery, mob/living/patient) #define COMSIG_SURGERY_STARTING "surgery_starting" diff --git a/code/__DEFINES/dcs/signals/signals_mining.dm b/code/__DEFINES/dcs/signals/signals_mining.dm new file mode 100644 index 0000000000000..8dc3fe283f645 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_mining.dm @@ -0,0 +1,6 @@ +/// Fired by a mob which has been grabbed by a goliath +#define COMSIG_GOLIATH_TENTACLED_GRABBED "comsig_goliath_tentacle_grabbed" +/// Fired by a goliath tentacle which is returning to the earth +#define COMSIG_GOLIATH_TENTACLE_RETRACTING "comsig_goliath_tentacle_retracting" +/// Fired by a mob which has triggered a brimdust explosion from itself (not the mobs that get hit) +#define COMSIG_BRIMDUST_EXPLOSION "comsig_brimdust_explosion" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm new file mode 100644 index 0000000000000..85630c8e8f041 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm @@ -0,0 +1,5 @@ +/// Signal sent when a blackboard key is set to a new value +#define COMSIG_AI_BLACKBOARD_KEY_SET(blackboard_key) "ai_blackboard_key_set_[blackboard_key]" + +/// Signal sent when a blackboard key is cleared +#define COMSIG_AI_BLACKBOARD_KEY_CLEARED(blackboard_key) "ai_blackboard_key_clear_[blackboard_key]" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_basic.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_basic.dm new file mode 100644 index 0000000000000..18c6c651435ba --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_basic.dm @@ -0,0 +1,7 @@ +/// Sent from /mob/living/basic/proc/look_dead() : () +#define COMSIG_BASICMOB_LOOK_DEAD "basicmob_look_dead" +/// Sent from /mob/living/basic/proc/look_alive() : () +#define COMSIG_BASICMOB_LOOK_ALIVE "basicmob_look_alive" + +///from the ranged_attacks component for basic mobs: (mob/living/basic/firer, atom/target, modifiers) +#define COMSIG_BASICMOB_POST_ATTACK_RANGED "basicmob_post_attack_ranged" 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 f72e47db97a40..ad0e6e359b1e7 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm @@ -22,11 +22,11 @@ ///When a carbon slips. Called on /turf/open/handle_slip() #define COMSIG_ON_CARBON_SLIP "carbon_slip" -///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) +/// Called after limb AND victim has been unset +#define COMSIG_CARBON_POST_LOSE_WOUND "carbon_post_lose_wound" //from /datum/wound/proc/remove_wound() (/datum/wound/lost_wound, /obj/item/bodypart/part, ignore_limb, replaced) ///from base of /obj/item/bodypart/proc/can_attach_limb(): (new_limb, special) allows you to fail limb attachment #define COMSIG_ATTEMPT_CARBON_ATTACH_LIMB "attempt_carbon_attach_limb" #define COMPONENT_NO_ATTACH (1<<0) @@ -36,8 +36,13 @@ #define COMSIG_BODYPART_ATTACHED "bodypart_removed" ///from base of /obj/item/bodypart/proc/try_attach_limb(): (new_limb, special) #define COMSIG_CARBON_POST_ATTACH_LIMB "carbon_post_attach_limb" -#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 +///from /obj/item/bodypart/proc/receive_damage, sent from the limb owner (limb, brute, burn) +#define COMSIG_CARBON_LIMB_DAMAGED "carbon_limb_damaged" + #define COMPONENT_PREVENT_LIMB_DAMAGE (1 << 0) +/// from /obj/item/bodypart/proc/apply_gauze(/obj/item/stack/gauze): (/obj/item/stack/medical/gauze/applied_gauze, /obj/item/stack/medical/gauze/stack_used) +#define COMSIG_BODYPART_GAUZED "bodypart_gauzed" +/// from /obj/item/stack/medical/gauze/Destroy(): (/obj/item/stack/medical/gauze/removed_gauze) +#define COMSIG_BODYPART_UNGAUZED "bodypart_ungauzed" /// Called from bodypart changing owner, which could be on attach or detachment. Either argument can be null. (mob/living/carbon/new_owner, mob/living/carbon/old_owner) #define COMSIG_BODYPART_CHANGED_OWNER "bodypart_changed_owner" @@ -110,6 +115,10 @@ #define COMSIG_CARBON_BLOCK_EAT (1 << 0) ///Called when a carbon vomits : (distance, force) #define COMSIG_CARBON_VOMITED "carbon_vomited" +///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 @@ -131,6 +140,13 @@ ///from /mob/living/carbon/human/proc/force_say(): () #define COMSIG_HUMAN_FORCESAY "human_forcesay" +///from /mob/living/carbon/human/get_visible_name(), not sent if the mob has TRAIT_UNKNOWN: (identity) +#define COMSIG_HUMAN_GET_VISIBLE_NAME "human_get_visible_name" + //Index for the name of the face + #define VISIBLE_NAME_FACE 1 + //Index for the name of the id + #define VISIBLE_NAME_ID 2 + // Mob transformation signals ///Called when a human turns into a monkey, from /mob/living/carbon/proc/finish_monkeyize() #define COMSIG_HUMAN_MONKEYIZE "human_monkeyize" 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 9ad327ca4ff93..d16adbe07a760 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -5,13 +5,15 @@ // 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" +#define COMSIG_ORGAN_IMPLANTED "organ_implanted" /// Called on the organ when it is removed from someone (mob/living/carbon/old_owner) -#define COMSIG_ORGAN_REMOVED "comsig_organ_removed" +#define COMSIG_ORGAN_REMOVED "organ_removed" /// Called when an organ is being regenerated with a new copy in species regenerate_organs (obj/item/organ/replacement) #define COMSIG_ORGAN_BEING_REPLACED "organ_being_replaced" +/// Called when an organ gets surgically removed (mob/living/user, mob/living/carbon/old_owner, target_zone, obj/item/tool) +#define COMSIG_ORGAN_SURGICALLY_REMOVED "organ_surgically_removed" +/// Called when using the *wag emote +#define COMSIG_ORGAN_WAG_TAIL "wag_tail" ///from base of mob/update_transform() #define COMSIG_LIVING_POST_UPDATE_TRANSFORM "living_post_update_transform" @@ -53,12 +55,16 @@ ///from base of element/bane/activate(): (item/weapon, mob/user) #define COMSIG_OBJECT_ON_BANING "obj_on_baning" +///from base of mob/living/on_damage_adjustment +#define COMSIG_LIVING_ADJUST_DAMAGE "living_adjust_damage" + #define COMPONENT_IGNORE_CHANGE (1<<0) + /// from base of mob/living/updatehealth() #define COMSIG_LIVING_HEALTH_UPDATE "living_health_update" ///from base of mob/living/death(): (gibbed) #define COMSIG_LIVING_DEATH "living_death" -///from base of mob/living/gib(): (no_brain, no_organs, no_bodyparts) +///from base of mob/living/gib(): (drop_bitflags) ///Note that it is fired regardless of whether the mob was dead beforehand or not. #define COMSIG_LIVING_GIBBED "living_gibbed" @@ -80,10 +86,14 @@ #define COMSIG_LIVING_STATUS_PARALYZE "living_paralyze" ///from base of mob/living/Immobilize() (amount, ignore_canstun) #define COMSIG_LIVING_STATUS_IMMOBILIZE "living_immobilize" +///from base of mob/living/incapacitate() (amount, ignore_canstun) +#define COMSIG_LIVING_STATUS_INCAPACITATE "living_incapacitate" ///from base of mob/living/Unconscious() (amount, ignore_canstun) #define COMSIG_LIVING_STATUS_UNCONSCIOUS "living_unconscious" ///from base of mob/living/Sleeping() (amount, ignore_canstun) #define COMSIG_LIVING_STATUS_SLEEP "living_sleeping" +/// from mob/living/check_stun_immunity(): (check_flags) +#define COMSIG_LIVING_GENERIC_STUN_CHECK "living_check_stun" #define COMPONENT_NO_STUN (1<<0) //For all of them ///from base of /mob/living/can_track(): (mob/user) #define COMSIG_LIVING_CAN_TRACK "mob_cantrack" @@ -96,7 +106,7 @@ #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) +///(NOT on humans) 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" @@ -171,5 +181,12 @@ /// From /obj/structure/geyser/attackby() : (obj/structure/geyser/geyser) #define COMSIG_LIVING_DISCOVERED_GEYSER "living_discovered_geyser" -/// For when someone is injected with the EHMS virus from /datum/traitor_objective_category/infect -#define COMSIG_AFTER_INJECT "after_inject" +/// From /datum/ai/behavior/climb_tree/perform() : (mob/living/basic/living_pawn) +#define COMSIG_LIVING_CLIMB_TREE "living_climb_tree" + +/// Sent on a mob from /datum/component/mob_chain when component is attached with it as the "front" : (mob/living/basic/tail) +#define COMSIG_MOB_GAINED_CHAIN_TAIL "living_gained_chain_tail" +/// Sent on a mob from /datum/component/mob_chain when component is detached from it as the "front" : (mob/living/basic/tail) +#define COMSIG_MOB_LOST_CHAIN_TAIL "living_detached_chain_tail" +/// Sent from a 'contract chain' button on a mob chain +#define COMSIG_MOB_CHAIN_CONTRACT "living_chain_contracted" 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 0839f8f590981..7dffe24331ac1 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -7,8 +7,14 @@ #define COMSIG_MOB_LOGIN "mob_login" ///from base of /mob/Logout(): () #define COMSIG_MOB_LOGOUT "mob_logout" +///from base of /mob/mind_initialize +#define COMSIG_MOB_MIND_INITIALIZED "mob_mind_inited" ///from base of mob/set_stat(): (new_stat, old_stat) #define COMSIG_MOB_STATCHANGE "mob_statchange" +///from base of mob/reagent_check(): (datum/reagent/chem, seconds_per_tick, times_fired) +#define COMSIG_MOB_REAGENT_CHECK "mob_reagent_check" + ///stops the reagent check call + #define COMSIG_MOB_STOP_REAGENT_CHECK (1<<0) ///from base of mob/clickon(): (atom/A, params) #define COMSIG_MOB_CLICKON "mob_clickon" ///from base of mob/MiddleClickOn(): (atom/A) @@ -25,12 +31,12 @@ /// From base of /mob/living/simple_animal/bot/proc/bot_step() #define COMSIG_MOB_BOT_STEP "mob_bot_step" -/// From base of /client/Move() +/// From base of /client/Move(): (list/move_args) #define COMSIG_MOB_CLIENT_PRE_LIVING_MOVE "mob_client_pre_living_move" /// Should we stop the current living movement attempt #define COMSIG_MOB_CLIENT_BLOCK_PRE_LIVING_MOVE COMPONENT_MOVABLE_BLOCK_PRE_MOVE -/// From base of /client/Move(): (list/move_args) +/// From base of /client/Move(): (new_loc, direction) #define COMSIG_MOB_CLIENT_PRE_MOVE "mob_client_pre_move" /// Should always match COMPONENT_MOVABLE_BLOCK_PRE_MOVE as these are interchangeable and used to block movement. #define COMSIG_MOB_CLIENT_BLOCK_PRE_MOVE COMPONENT_MOVABLE_BLOCK_PRE_MOVE @@ -38,7 +44,7 @@ #define MOVE_ARG_NEW_LOC 1 /// The arugment of move_args which dictates our movement direction #define MOVE_ARG_DIRECTION 2 -/// From base of /client/Move() +/// From base of /client/Move(): (direction, old_dir) #define COMSIG_MOB_CLIENT_MOVED "mob_client_moved" /// From base of /client/proc/change_view() (mob/source, new_size) #define COMSIG_MOB_CLIENT_CHANGE_VIEW "mob_client_change_view" @@ -129,6 +135,9 @@ ///Mob is trying to open the wires of a target [/atom], from /datum/wires/interactable(): (atom/target) #define COMSIG_TRY_WIRES_INTERACT "try_wires_interact" #define COMPONENT_CANT_INTERACT_WIRES (1<<0) +///Mob is trying to emote, from /datum/emote/proc/run_emote(): (key, params, type_override, intentional) +#define COMSIG_MOB_PRE_EMOTED "mob_pre_emoted" + #define COMPONENT_CANT_EMOTE (1<<0) #define COMSIG_MOB_EMOTED(emote_key) "mob_emoted_[emote_key]" ///sent when a mob/login() finishes: (client) #define COMSIG_MOB_CLIENT_LOGIN "comsig_mob_client_login" @@ -175,6 +184,12 @@ #define WAIVE_AUTOMUTE_CHECK (1<<0) ///From base of /turf/closed/mineral/proc/gets_drilled(): (turf/closed/mineral/rock, give_exp) #define COMSIG_MOB_MINED "mob_mined" +///Sent by pilot of mech in base of /obj/vehicle/sealed/mecha/relaymove(): (/obj/vehicle/sealed/mecha/mech) +#define COMSIG_MOB_DROVE_MECH "mob_drove_mech" +///Sent by pilot of mech in /obj/vehicle/sealed/mecha/on_mouseclick when using mech equipment : (/obj/vehicle/sealed/mecha/mech) +#define COMSIG_MOB_USED_MECH_EQUIPMENT "mob_used_mech_equipment" +///Sent by pilot of mech in /obj/vehicle/sealed/mecha/on_mouseclick when triggering mech punch : (/obj/vehicle/sealed/mecha/mech) +#define COMSIG_MOB_USED_MECH_MELEE "mob_used_mech_melee" ///from living/flash_act(), when a mob is successfully flashed. #define COMSIG_MOB_FLASHED "mob_flashed" @@ -201,3 +216,6 @@ /// from mob/proc/dropItemToGround() #define COMSIG_MOB_DROPPING_ITEM "mob_dropping_item" + +/// from /mob/proc/change_mob_type_unchecked() : () +#define COMSIG_MOB_CHANGED_TYPE "mob_changed_type" 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 032bcaa4e03d7..65d96ea8c4c2d 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_simple.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_simple.dm @@ -10,8 +10,12 @@ #define COMPONENT_HOSTILE_NO_ATTACK (1<<0) //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) +///from base of mob/living/basic/regal_rat: (mob/living/basic/regal_rat/king) #define COMSIG_RAT_INTERACT "rat_interaction" + #define COMPONENT_RAT_INTERACTED (1<<0) //! If this is returned, cancel any further interactions. ///FROM mob/living/simple_animal/hostile/ooze/eat_atom(): (atom/target, edible_flags) #define COMSIG_OOZE_EAT_ATOM "ooze_eat_atom" #define COMPONENT_ATOM_EATEN (1<<0) + +///Called when a /mob/living/simple_animal/hostile fines a new target: (atom/source, new_target) +#define COMSIG_HOSTILE_FOUND_TARGET "comsig_hostile_found_target" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_spawner.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_spawner.dm index a5f66788b868d..6ff8b1e8d61d4 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_spawner.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_spawner.dm @@ -1,3 +1,6 @@ // signals for use by mob spawners /// called when a spawner spawns a mob #define COMSIG_SPAWNER_SPAWNED "spawner_spawned" + +/// called when a ghost clicks a spawner role: (mob/living) +#define COMSIG_GHOSTROLE_SPAWNED "ghostrole_spawned" diff --git a/code/__DEFINES/dcs/signals/signals_mod.dm b/code/__DEFINES/dcs/signals/signals_mod.dm index 2533b69852849..c4007d1296910 100644 --- a/code/__DEFINES/dcs/signals/signals_mod.dm +++ b/code/__DEFINES/dcs/signals/signals_mod.dm @@ -25,6 +25,8 @@ #define MOD_ABORT_USE (1<<0) /// Called when a module activates, after all checks have passed and cooldown started. #define COMSIG_MODULE_ACTIVATED "mod_module_activated" +/// Called when a module starts a cooldown until its next activation. Passed the cooldown time. +#define COMSIG_MODULE_COOLDOWN_STARTED "mod_module_cooldown_started" /// Called when a module deactivates, after all checks have passed. #define COMSIG_MODULE_DEACTIVATED "mod_module_deactivated" /// Called when a module is used, after all checks have passed and cooldown started. diff --git a/code/__DEFINES/dcs/signals/signals_modular_computer.dm b/code/__DEFINES/dcs/signals/signals_modular_computer.dm new file mode 100644 index 0000000000000..950262a5fe13e --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_modular_computer.dm @@ -0,0 +1,15 @@ +// Various modular computer signals. + +/// From /obj/item/modular_computer/proc/store_file: (datum/computer_file/file_storing) +#define COMSIG_MODULAR_COMPUTER_FILE_STORE "comsig_modular_computer_file_store" +/// From /obj/item/modular_computer/proc/remove_file: (datum/computer_file/file_removing) +#define COMSIG_MODULAR_COMPUTER_FILE_DELETE "comsig_modular_computer_file_delete" +/// From /obj/item/modular_computer/proc/store_file: (datum/computer_file/file_source, obj/item/modular_computer/host) +#define COMSIG_COMPUTER_FILE_STORE "comsig_computer_file_store" +/// From /obj/item/modular_computer/proc/store_file: () +#define COMSIG_COMPUTER_FILE_DELETE "comsig_computer_file_delete" + +/// from /obj/item/modular_computer/imprint_id(): (name, job) +#define COMSIG_MODULAR_PDA_IMPRINT_UPDATED "comsig_modular_pda_imprint_updated" +/// from /obj/item/modular_computer/reset_id(): () +#define COMSIG_MODULAR_PDA_IMPRINT_RESET "comsig_modular_pda_imprint_reset" diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index 684adf1730088..4521360d03964 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -33,6 +33,8 @@ #define COMSIG_MACHINERY_STOP_PROCESSING_AIR "stop_processing_air" ///from /obj/machinery/RefreshParts: () #define COMSIG_MACHINERY_REFRESH_PARTS "machine_refresh_parts" +///from /obj/machinery/default_change_direction_wrench: (mob/user, obj/item/wrench) +#define COMSIG_MACHINERY_DEFAULT_ROTATE_WRENCH "machinery_default_rotate_wrench" ///from /obj/machinery/can_interact(mob/user): Called on user when attempting to interact with a machine (obj/machinery/machine) #define COMSIG_TRY_USE_MACHINE "try_use_machine" @@ -50,15 +52,17 @@ // /obj/machinery/computer/teleporter /// from /obj/machinery/computer/teleporter/proc/set_target(target, old_target) #define COMSIG_TELEPORTER_NEW_TARGET "teleporter_new_target" +/// from /obj/item/beacon/proc/turn_off() +#define COMSIG_BEACON_DISABLED "beacon_disabled" // /obj/machinery/power/supermatter_crystal /// from /obj/machinery/power/supermatter_crystal/process_atmos(); when the SM sounds an audible alarm #define COMSIG_SUPERMATTER_DELAM_ALARM "sm_delam_alarm" -// /obj/machinery/atmospherics/components/unary/cryo_cell signals +// /obj/machinery/cryo_cell signals -/// from /obj/machinery/atmospherics/components/unary/cryo_cell/set_on(bool): (on) +/// from /obj/machinery/cryo_cell/set_on(bool): (on) #define COMSIG_CRYO_SET_ON "cryo_set_on" /// from /obj/proc/unfreeze() @@ -104,6 +108,10 @@ ///from base of obj/item/equipped(): (mob/equipper, slot) #define COMSIG_ITEM_EQUIPPED "item_equip" +///From base of obj/item/on_equipped() (mob/equipped, slot) +#define COMSIG_ITEM_POST_EQUIPPED "item_post_equipped" + /// This will make the on_equipped proc return FALSE. + #define COMPONENT_EQUIPPED_FAILED (1<<0) /// A mob has just equipped an item. Called on [/mob] from base of [/obj/item/equipped()]: (/obj/item/equipped_item, slot) #define COMSIG_MOB_EQUIPPED_ITEM "mob_equipped_item" /// A mob has just unequipped an item. @@ -126,12 +134,24 @@ #define COMSIG_ITEM_DROPPED "item_drop" ///from base of obj/item/pickup(): (/mob/taker) #define COMSIG_ITEM_PICKUP "item_pickup" +///from base of obj/item/on_outfit_equip(): (mob/equipper, visuals_only, slot) +#define COMSIG_ITEM_EQUIPPED_AS_OUTFIT "item_equip_as_outfit" + +///from base of obj/item/apply_fantasy_bonuses(): (bonus) +#define COMSIG_ITEM_APPLY_FANTASY_BONUSES "item_apply_fantasy_bonuses" +///from base of obj/item/remove_fantasy_bonuses(): (bonus) +#define COMSIG_ITEM_REMOVE_FANTASY_BONUSES "item_remove_fantasy_bonuses" /// Sebt from obj/item/ui_action_click(): (mob/user, datum/action) #define COMSIG_ITEM_UI_ACTION_CLICK "item_action_click" /// Return to prevent the default behavior (attack_selfing) from ocurring. #define COMPONENT_ACTION_HANDLED (1<<0) +/// Sent from obj/item/item_action_slot_check(): (mob/user, datum/action, slot) +#define COMSIG_ITEM_UI_ACTION_SLOT_CHECKED "item_action_slot_checked" + /// Return to prevent the default behavior (attack_selfing) from ocurring. + #define COMPONENT_ITEM_ACTION_SLOT_INVALID (1<<0) + ///from base of mob/living/carbon/attacked_by(): (mob/living/carbon/target, mob/living/user, hit_zone) #define COMSIG_ITEM_ATTACK_ZONE "item_attack_zone" ///from base of obj/item/hit_reaction(): (owner, hitby, attack_text, final_block_chance, damage, attack_type, damage_type) @@ -172,6 +192,10 @@ ///from [/obj/structure/closet/supplypod/proc/preOpen]: #define COMSIG_SUPPLYPOD_LANDED "supplypodgoboom" +/// from [/obj/item/stack/proc/can_merge]: (obj/item/stack/merge_with, in_hand) +#define COMSIG_STACK_CAN_MERGE "stack_can_merge" + #define CANCEL_STACK_MERGE (1<<0) + ///from /obj/item/book/bible/afterattack(): (mob/user, proximity) #define COMSIG_BIBLE_SMACKED "bible_smacked" ///stops the bible chain from continuing. When all of the effects of the bible smacking have been moved to a signal we can kill this @@ -224,6 +248,11 @@ ///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" +/// Called on component/uplink/OnAttackBy(..) +#define COMSIG_ITEM_ATTEMPT_TC_REIMBURSE "item_attempt_tc_reimburse" +///Called when a holoparasite/guardiancreator is used. +#define COMSIG_TRAITOR_ITEM_USED(type) "traitor_item_used_[type]" + // /obj/item/clothing signals ///from [/mob/living/carbon/human/Move]: () @@ -288,8 +317,10 @@ ///called in /obj/item/gun/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/process_fire (src, target, params, zone_override, bonus_spread_values) #define COMSIG_MOB_FIRED_GUN "mob_fired_gun" + #define MIN_BONUS_SPREAD_INDEX 1 + #define MAX_BONUS_SPREAD_INDEX 2 ///called in /obj/item/gun/process_fire (user, target, params, zone_override) #define COMSIG_GUN_FIRED "gun_fired" ///called in /obj/item/gun/process_chamber (src) @@ -306,10 +337,10 @@ //called in /obj/item/tank/jetpack/proc/turn_off() : () #define COMSIG_JETPACK_DEACTIVATED "jetpack_deactivated" -//called in /obj/item/organ/cyberimp/chest/thrusters/proc/toggle() : () +//called in /obj/item/organ/internal/cyberimp/chest/thrusters/proc/toggle() : () #define COMSIG_THRUSTER_ACTIVATED "jetmodule_activated" #define THRUSTER_ACTIVATION_FAILED (1<<0) -//called in /obj/item/organ/cyberimp/chest/thrusters/proc/toggle() : () +//called in /obj/item/organ/internal/cyberimp/chest/thrusters/proc/toggle() : () #define COMSIG_THRUSTER_DEACTIVATED "jetmodule_deactivated" // /obj/item/camera signals @@ -340,6 +371,7 @@ #define COMSIG_PROJECTILE_FIRE "projectile_fire" ///sent to targets during the process_hit proc of projectiles #define COMSIG_PROJECTILE_PREHIT "com_proj_prehit" + #define PROJECTILE_INTERRUPT_HIT (1<<0) ///from the base of /obj/projectile/Range(): () #define COMSIG_PROJECTILE_RANGE "projectile_range" ///from the base of /obj/projectile/on_range(): () @@ -351,7 +383,12 @@ #define COMSIG_ITEM_EMBEDDING_UPDATE "item_embedding_update" ///sent to targets during the process_hit proc of projectiles -#define COMSIG_PELLET_CLOUD_INIT "pellet_cloud_init" +#define COMSIG_FIRE_CASING "fire_casing" + +///sent to the projectile after an item is spawned by the projectile_drop element: (new_item) +#define COMSIG_PROJECTILE_ON_SPAWN_DROP "projectile_on_spawn_drop" +///sent to the projectile when spawning the item (shrapnel) that may be embedded: (new_item) +#define COMSIG_PROJECTILE_ON_SPAWN_EMBEDDED "projectile_on_spawn_embedded" // /obj/vehicle/sealed/car/vim signals @@ -388,8 +425,8 @@ #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) -#define COMSIG_ITEM_ATTACK_OBJ "item_attack_obj" +///from base of obj/item/attack_atom(): (/atom, /mob) +#define COMSIG_ITEM_ATTACK_ATOM "item_attack_atom" ///from base of obj/item/pre_attack(): (atom/target, mob/user, params) #define COMSIG_ITEM_PRE_ATTACK "item_pre_attack" /// From base of [/obj/item/proc/pre_attack_secondary()]: (atom/target, mob/user, params) @@ -431,3 +468,14 @@ /// from /obj/plunger_act when an object is being plungered #define COMSIG_PLUNGER_ACT "plunger_act" + +/// from /obj/structure/cursed_slot_machine/handle_status_effect() when someone pulls the handle on the slot machine +#define COMSIG_CURSED_SLOT_MACHINE_USE "cursed_slot_machine_use" + #define SLOT_MACHINE_USE_CANCEL (1<<0) //! we've used up the number of times we may use this slot machine. womp womp. + #define SLOT_MACHINE_USE_POSTPONE (1<<1) //! we haven't used up all our attempts to gamble away our life but we should chill for a few seconds + +/// from /obj/structure/cursed_slot_machine/determine_victor() when someone loses. +#define COMSIG_CURSED_SLOT_MACHINE_LOST "cursed_slot_machine_lost" + +/// from /obj/structure/cursed_slot_machine/determine_victor() when someone finally wins. +#define COMSIG_GLOB_CURSED_SLOT_MACHINE_WON "cursed_slot_machine_won" diff --git a/code/__DEFINES/dcs/signals/signals_operating_computer.dm b/code/__DEFINES/dcs/signals/signals_operating_computer.dm index 94f2f52ede2b6..8974bb99db869 100644 --- a/code/__DEFINES/dcs/signals/signals_operating_computer.dm +++ b/code/__DEFINES/dcs/signals/signals_operating_computer.dm @@ -1,5 +1,5 @@ // /obj/machinery/computer/operating signals -/// Fired when a dissection surgery completes. +/// Fired when a autopsy surgery completes. /// (mob/living/target) -#define COMSIG_OPERATING_COMPUTER_DISSECTION_COMPLETE "operating_computer_dissection_complete" +#define COMSIG_OPERATING_COMPUTER_AUTOPSY_COMPLETE "operating_computer_autopsy_complete" diff --git a/code/__DEFINES/dcs/signals/signals_reagent.dm b/code/__DEFINES/dcs/signals/signals_reagent.dm index 00fdddc6c9e71..a73d59a234c21 100644 --- a/code/__DEFINES/dcs/signals/signals_reagent.dm +++ b/code/__DEFINES/dcs/signals/signals_reagent.dm @@ -6,6 +6,8 @@ #define COMSIG_ATOM_EXPOSE_REAGENTS "atom_expose_reagents" /// Prevents the atom from being exposed to reagents if returned on [COMSIG_ATOM_EXPOSE_REAGENTS] #define COMPONENT_NO_EXPOSE_REAGENTS (1<<0) +///from base of atom/expose_reagents(): (/list, /datum/reagents, methods, volume_modifier, show_message) +#define COMSIG_ATOM_AFTER_EXPOSE_REAGENTS "atom_after_expose_reagents" ///from base of [/datum/reagent/proc/expose_atom]: (/datum/reagent, reac_volume) #define COMSIG_ATOM_EXPOSE_REAGENT "atom_expose_reagent" ///from base of [/datum/reagent/proc/expose_atom]: (/atom, reac_volume) diff --git a/code/__DEFINES/dcs/signals/signals_saboteur.dm b/code/__DEFINES/dcs/signals/signals_saboteur.dm new file mode 100644 index 0000000000000..5b0fef52aee66 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_saboteur.dm @@ -0,0 +1,5 @@ +// Light disruptor. Not to be confused with the light eater, which permanently disables lights. + +/// from /obj/projectile/energy/fisher/on_hit() or /obj/item/gun/energy/recharge/fisher when striking a target +#define COMSIG_HIT_BY_SABOTEUR "HIT_BY_SABOTEUR" + #define COMSIG_SABOTEUR_SUCCESS (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_specie.dm b/code/__DEFINES/dcs/signals/signals_specie.dm deleted file mode 100644 index ab28febbb2c76..0000000000000 --- a/code/__DEFINES/dcs/signals/signals_specie.dm +++ /dev/null @@ -1,5 +0,0 @@ -// /datum/species signals -///from datum/species/on_species_gain(): (datum/species/new_species, datum/species/old_species) -#define COMSIG_SPECIES_GAIN "species_gain" -///from datum/species/on_species_loss(): (datum/species/lost_species) -#define COMSIG_SPECIES_LOSS "species_loss" diff --git a/code/__DEFINES/dcs/signals/signals_species.dm b/code/__DEFINES/dcs/signals/signals_species.dm new file mode 100644 index 0000000000000..ee5cc33ba359e --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_species.dm @@ -0,0 +1,8 @@ +// /datum/species signals +///from datum/species/on_species_gain(): (datum/species/new_species, datum/species/old_species) +#define COMSIG_SPECIES_GAIN "species_gain" +///from datum/species/on_species_loss(): (datum/species/lost_species) +#define COMSIG_SPECIES_LOSS "species_loss" +///from datum/species/handle_chemical(): (datum/reagent/chem, mob/living/carbon/human/affected, seconds_per_tick, times_fired) +#define COMSIG_SPECIES_HANDLE_CHEMICAL "species_handle_chemicals" + // same return values as COMSIG_MOB_STOP_REAGENT_CHECK diff --git a/code/__DEFINES/dcs/signals/signals_traitor.dm b/code/__DEFINES/dcs/signals/signals_traitor.dm index 1728ef8c67984..4290b25b8009d 100644 --- a/code/__DEFINES/dcs/signals/signals_traitor.dm +++ b/code/__DEFINES/dcs/signals/signals_traitor.dm @@ -32,3 +32,5 @@ #define COMSIG_TRAITOR_GRAFFITI_DRAWN "traitor_rune_drawn" /// Called when someone slips on some seditious graffiti. Pass the mind of the viewer. #define COMSIG_TRAITOR_GRAFFITI_SLIPPED "traitor_demoralise_event" +/// For when someone is injected with the EHMS virus from /datum/traitor_objective_category/infect +#define COMSIG_EHMS_INJECTOR_INJECTED "after_ehms_inject" diff --git a/code/__DEFINES/dcs/signals/signals_turf.dm b/code/__DEFINES/dcs/signals/signals_turf.dm index 7815e81d0e55c..4c20b5f9dd7b9 100644 --- a/code/__DEFINES/dcs/signals/signals_turf.dm +++ b/code/__DEFINES/dcs/signals/signals_turf.dm @@ -28,3 +28,8 @@ ///from /obj/item/pushbroom/sweep(): (broom, user, items_to_sweep) #define COMSIG_TURF_RECEIVE_SWEEPED_ITEMS "turf_receive_sweeped_items" + +///from /datum/element/footstep/prepare_step(): (list/steps) +#define COMSIG_TURF_PREPARE_STEP_SOUND "turf_prepare_step_sound" +///from base of datum/thrownthing/finalize(): (turf/turf, atom/movable/thrownthing) when something is thrown and lands on us +#define COMSIG_TURF_MOVABLE_THROW_LANDED "turf_movable_throw_landed" diff --git a/code/__DEFINES/dcs/signals/signals_wizard.dm b/code/__DEFINES/dcs/signals/signals_wizard.dm index a4b8f0755c42a..5cdebf4f06229 100644 --- a/code/__DEFINES/dcs/signals/signals_wizard.dm +++ b/code/__DEFINES/dcs/signals/signals_wizard.dm @@ -1,4 +1,4 @@ -/// Signal sent when we finish invoking a rune +/// Signal sent when we finish invoking a rune. Will also send the amount of cheese sacrificed on the rune : (cheese_sacrificed) #define COMSIG_GRAND_RUNE_COMPLETE "grand rune complete" /// Signal sent when we finish 7 grand rituals #define COMSIG_GRAND_RITUAL_FINAL_COMPLETE "grand ritual finale complete" diff --git a/code/__DEFINES/directional.dm b/code/__DEFINES/directional.dm index bfde544b44716..83d8ce01d0a87 100644 --- a/code/__DEFINES/directional.dm +++ b/code/__DEFINES/directional.dm @@ -13,6 +13,18 @@ /// West direction as a string "[8]" #define TEXT_WEST "[WEST]" +//dir macros +///Returns true if the dir is diagonal, false otherwise +#define ISDIAGONALDIR(d) (d&(d-1)) +///True if the dir is north or south, false therwise +#define NSCOMPONENT(d) (d&(NORTH|SOUTH)) +///True if the dir is east/west, false otherwise +#define EWCOMPONENT(d) (d&(EAST|WEST)) +///Flips the dir for north/south directions +#define NSDIRFLIP(d) (d^(NORTH|SOUTH)) +///Flips the dir for east/west directions +#define EWDIRFLIP(d) (d^(EAST|WEST)) + /// Inverse direction, taking into account UP|DOWN if necessary. #define REVERSE_DIR(dir) ( ((dir & 85) << 1) | ((dir & 170) >> 1) ) diff --git a/code/__DEFINES/diseases.dm b/code/__DEFINES/diseases.dm index d439d6c70fd99..7fdb3182218a7 100644 --- a/code/__DEFINES/diseases.dm +++ b/code/__DEFINES/diseases.dm @@ -6,6 +6,12 @@ #define HIDDEN_SCANNER (1<<0) #define HIDDEN_PANDEMIC (1<<1) +//Bitfield for Visibility Flags +DEFINE_BITFIELD(visibility_flags, list( + "HIDDEN_FROM_ANALYZER" = HIDDEN_SCANNER, + "HIDDEN_FROM_PANDEMIC" = HIDDEN_PANDEMIC, +)) + //Disease Flags #define CURABLE (1<<0) #define CAN_CARRY (1<<1) @@ -20,6 +26,16 @@ #define DISEASE_SPREAD_CONTACT_SKIN (1<<4) #define DISEASE_SPREAD_AIRBORNE (1<<5) +//Bitfield for Spread Flags +DEFINE_BITFIELD(spread_flags, list( + "SPREAD_SPECIAL" = DISEASE_SPREAD_SPECIAL, + "SPREAD_NON_CONTAGIOUS" = DISEASE_SPREAD_NON_CONTAGIOUS, + "SPREAD_BLOOD" = DISEASE_SPREAD_BLOOD, + "SPREAD_FLUIDS" = DISEASE_SPREAD_CONTACT_FLUIDS, + "SPREAD_SKIN_CONTACT" = DISEASE_SPREAD_CONTACT_SKIN, + "SPREAD_AIRBORNE" = DISEASE_SPREAD_AIRBORNE, +)) + //Severity Defines /// Diseases that buff, heal, or at least do nothing at all #define DISEASE_SEVERITY_POSITIVE "Positive" diff --git a/code/__DEFINES/do_afters.dm b/code/__DEFINES/do_afters.dm index f46710643d0d3..dcedbbe010ba3 100644 --- a/code/__DEFINES/do_afters.dm +++ b/code/__DEFINES/do_afters.dm @@ -6,3 +6,4 @@ #define DOAFTER_SOURCE_SPIDER "doafter_spider" #define DOAFTER_SOURCE_HEAL_TOUCH "doafter_heal_touch" #define DOAFTER_SOURCE_PLANTING_DEVICE "doafter_planting_device" +#define DOAFTER_SOURCE_CHARGE_CRANKRECHARGE "doafter_charge_crank_recharge" diff --git a/code/__DEFINES/dynamic.dm b/code/__DEFINES/dynamic.dm index f07b7e20b0fcb..07c833cdc4947 100644 --- a/code/__DEFINES/dynamic.dm +++ b/code/__DEFINES/dynamic.dm @@ -32,3 +32,9 @@ #define ROUNDSTART_RULESET "Roundstart" #define LATEJOIN_RULESET "Latejoin" #define MIDROUND_RULESET "Midround" + +#define RULESET_NOT_FORCED "not forced" +/// Ruleset should run regardless of population and threat available +#define RULESET_FORCE_ENABLED "force enabled" +/// Ruleset should not run regardless of population and threat available +#define RULESET_FORCE_DISABLED "force disabled" diff --git a/code/__DEFINES/economy.dm b/code/__DEFINES/economy.dm index bb3e573247d9f..9d6841b56fd77 100644 --- a/code/__DEFINES/economy.dm +++ b/code/__DEFINES/economy.dm @@ -22,7 +22,8 @@ #define STATION_TARGET_BUFFER 25 - +///The coefficient for the amount of dosh that's collected everytime some is earned or received. +#define DEBT_COLLECTION_COEFF 0.75 #define MAX_GRANT_DPT 500 @@ -44,6 +45,9 @@ #define ACCOUNT_SEC "SEC" #define ACCOUNT_SEC_NAME "Defense Budget" +#define IS_DEPARTMENTAL_CARD(card) (card in SSeconomy.dep_cards) +#define IS_DEPARTMENTAL_ACCOUNT(account) (account in SSeconomy.departmental_accounts) + #define NO_FREEBIES "commies go home" //Defines that set what kind of civilian bounties should be applied mid-round. @@ -69,3 +73,30 @@ #define PAYMENT_CLINICAL "clinical" #define PAYMENT_FRIENDLY "friendly" #define PAYMENT_ANGRY "angry" + +#define MARKET_TREND_UPWARD 1 +#define MARKET_TREND_DOWNWARD -1 +#define MARKET_TREND_STABLE 0 + +#define MARKET_EVENT_PROBABILITY 1 //Probability of a market event firing, in percent. Fires once per material, every 20 seconds. + +#define MARKET_PROFIT_MODIFIER 0.8 //We don't make every sale a 1-1 of the actual buy price value, like with real life taxes and to encourage more smart trades + +/// Create quantity subtypes for stock market datums. +#define MARKET_QUANTITY_HELPERS(path) ##path/one {\ + amount = 1; \ +} \ +##path/five {\ + amount = 5; \ +} \ +##path/ten {\ + amount = 10; \ +} \ +##path/twenty_five {\ + amount = 25; \ +} \ +##path/fifty {\ + amount = 50; \ +} + + diff --git a/code/__DEFINES/events.dm b/code/__DEFINES/events.dm index ac86e77a4e0c5..2b1755b22c4b4 100644 --- a/code/__DEFINES/events.dm +++ b/code/__DEFINES/events.dm @@ -36,6 +36,8 @@ /// Return from admin setup to stop the event from triggering entirely. #define ADMIN_CANCEL_EVENT "cancel event" +/// Event can never be triggered by wizards +#define NEVER_TRIGGERED_BY_WIZARDS -1 /// Event can only run on a map set in space #define EVENT_SPACE_ONLY (1 << 0) /// Event can only run on a map which is a planet diff --git a/code/__DEFINES/experisci.dm b/code/__DEFINES/experisci.dm index 9130e0ae56517..c74290ff5f751 100644 --- a/code/__DEFINES/experisci.dm +++ b/code/__DEFINES/experisci.dm @@ -26,6 +26,8 @@ /// Destructive experiments which will destroy the sample #define EXPERIMENT_TRAIT_DESTRUCTIVE (1 << 0) +/// Used by scanning experiments: instead of storing refs or be a number, the list for scanned atoms is used as typecache +#define EXPERIMENT_TRAIT_TYPECACHE (1 << 1) /// Will always attempt to action every experiment eligible with a single input, /// no experiment selection required @@ -33,3 +35,7 @@ /// Experiment handlers with this flag will not automatically connect to the first techweb they find /// on initialization #define EXPERIMENT_CONFIG_NO_AUTOCONNECT (1 << 1) +/// Experiment handlers with this flag won't pester the user of objects not pertinent to the test or if no experiment is selected +#define EXPERIMENT_CONFIG_SILENT_FAIL (1 << 2) +/// Experiment handlers with this flag will bypass any delay when trying to scan something +#define EXPERIMENT_CONFIG_IMMEDIATE_ACTION (1 << 3) diff --git a/code/__DEFINES/fish.dm b/code/__DEFINES/fish.dm new file mode 100644 index 0000000000000..89b7963d91d5c --- /dev/null +++ b/code/__DEFINES/fish.dm @@ -0,0 +1,136 @@ +/// Use in fish tables to denote miss chance. +#define FISHING_DUD "dud" + +// Baseline fishing difficulty levels +#define FISHING_DEFAULT_DIFFICULTY 15 + +/// Difficulty modifier when bait is fish's favorite +#define FAV_BAIT_DIFFICULTY_MOD -5 +/// Difficulty modifier when bait is fish's disliked +#define DISLIKED_BAIT_DIFFICULTY_MOD 15 +/// Difficulty modifier when our fisherman has the trait TRAIT_SETTLER +#define SETTLER_DIFFICULTY_MOD -5 + +#define FISH_TRAIT_MINOR_DIFFICULTY_BOOST 5 + +// These define how the fish will behave in the minigame +#define FISH_AI_DUMB "dumb" +#define FISH_AI_ZIPPY "zippy" +#define FISH_AI_SLOW "slow" + +#define ADDITIVE_FISHING_MOD "additive" +#define MULTIPLICATIVE_FISHING_MOD "multiplicative" + +// These defines are intended for use to interact with fishing hooks when going +// through the fishing rod, and not the hook itself. They could probably be +// handled differently, but for now that's how they work. It's grounds for +// a future refactor, however. +/// Fishing hook trait that signifies that it's shiny. Useful for fishes +/// that care about shiner hooks more. +#define FISHING_HOOK_SHINY (1 << 0) +/// Fishing hook trait that lessens the bounce from hitting the edges of the minigame bar. +#define FISHING_HOOK_WEIGHTED (1 << 1) +///See FISHING_MINIGAME_RULE_BIDIRECTIONAL +#define FISHING_HOOK_BIDIRECTIONAL (1 << 2) +///Prevents the user from losing the game by letting the fish get away. +#define FISHING_HOOK_NO_ESCAPE (1 << 3) +///Limits the completion loss of the minigame when the fsh is not on the bait area. +#define FISHING_HOOK_ENSNARE (1 << 4) +///Automatically kills the fish after a while, at the cost of killing it. +#define FISHING_HOOK_KILL (1 << 5) + +///Reduces the difficulty of the minigame +#define FISHING_LINE_CLOAKED (1 << 0) +///Required to cast a line on lava. +#define FISHING_LINE_REINFORCED (1 << 1) +/// Much like FISHING_HOOK_ENSNARE but for the fishing line. +#define FISHING_LINE_BOUNCY (1 << 2) + +///Keeps the bait from falling from gravity, instead allowing the player to move the bait down with right click. +#define FISHING_MINIGAME_RULE_BIDIRECTIONAL (1 << 2) +///Prevents the player from losing the minigame when the completion reaches 0 +#define FISHING_MINIGAME_RULE_NO_ESCAPE (1 << 3) +///Automatically kills the fish after a while, at the cost of killing it +#define FISHING_MINIGAME_RULE_KILL (1 << 4) +///Prevents the fishing skill from having an effect on the minigame and experience from being awarded +#define FISHING_MINIGAME_RULE_NO_EXP (1 << 5) +///If enabled, the minigame will occasionally screw around and invert the velocity of the bait +#define FISHING_MINIGAME_RULE_ANTIGRAV (1 << 6) +///Will filp the minigame hud for the duration of the effect +#define FISHING_MINIGAME_RULE_FLIP (1 << 7) + +///all the effects that are active and will last for a few seconds before triggering a cooldown +#define FISHING_MINIGAME_ACTIVE_EFFECTS (FISHING_MINIGAME_RULE_ANTIGRAV|FISHING_MINIGAME_RULE_FLIP) + +/// The default additive value for fishing hook catch weight modifiers. +#define FISHING_DEFAULT_HOOK_BONUS_ADDITIVE 0 +/// The default multiplicative value for fishing hook catch weight modifiers. +#define FISHING_DEFAULT_HOOK_BONUS_MULTIPLICATIVE 1 + +//Fish icon defines, used by fishing minigame +#define FISH_ICON_DEF "fish" +#define FISH_ICON_HOSTILE "hostile" +#define FISH_ICON_STAR "star" +#define FISH_ICON_CHUNKY "chunky" +#define FISH_ICON_SLIME "slime" +#define FISH_ICON_COIN "coin" +#define FISH_ICON_GEM "gem" +#define FISH_ICON_CRAB "crab" +#define FISH_ICON_JELLYFISH "jellyfish" +#define FISH_ICON_BONE "bone" + +#define AQUARIUM_ANIMATION_FISH_SWIM "fish" +#define AQUARIUM_ANIMATION_FISH_DEAD "dead" + +#define AQUARIUM_PROPERTIES_PX_MIN "px_min" +#define AQUARIUM_PROPERTIES_PX_MAX "px_max" +#define AQUARIUM_PROPERTIES_PY_MIN "py_min" +#define AQUARIUM_PROPERTIES_PY_MAX "py_max" + +#define AQUARIUM_LAYER_MODE_BOTTOM "bottom" +#define AQUARIUM_LAYER_MODE_TOP "top" +#define AQUARIUM_LAYER_MODE_AUTO "auto" + +#define FISH_ALIVE "alive" +#define FISH_DEAD "dead" + +///Fish size thresholds for w_class. +#define FISH_SIZE_TINY_MAX 30 +#define FISH_SIZE_SMALL_MAX 50 +#define FISH_SIZE_NORMAL_MAX 90 +#define FISH_SIZE_BULKY_MAX 130 + +///The coefficient for maximum weight/size divergence relative to the averages. +#define MAX_FISH_DEVIATION_COEFF 2.5 + +///The volume of the grind results is multiplied by the fish' weight and divided by this. +#define FISH_GRIND_RESULTS_WEIGHT_DIVISOR 500 +///The number of fillets is multiplied by the fish' size and divided by this. +#define FISH_FILLET_NUMBER_SIZE_DIVISOR 30 + +///The breeding timeout for newly instantiated fish is multiplied by this. +#define NEW_FISH_BREEDING_TIMEOUT_MULT 2 +///The last feeding timestamp of newly instantiated fish is multiplied by this: ergo, they spawn 50% hungry. +#define NEW_FISH_LAST_FEEDING_MULT 0.5 + +#define MIN_AQUARIUM_TEMP T0C +#define MAX_AQUARIUM_TEMP (T0C + 100) +#define DEFAULT_AQUARIUM_TEMP (T0C + 24) + +///How likely one's to find a given fish from random fish cases. +#define FISH_RARITY_BASIC 1000 +#define FISH_RARITY_RARE 400 +#define FISH_RARITY_VERY_RARE 200 +#define FISH_RARITY_GOOD_LUCK_FINDING_THIS 5 +#define FISH_RARITY_NOPE 0 + +///Aquarium fluid variables. The fish' required fluid has to match this, or it'll slowly die. +#define AQUARIUM_FLUID_FRESHWATER "Freshwater" +#define AQUARIUM_FLUID_SALTWATER "Saltwater" +#define AQUARIUM_FLUID_SULPHWATEVER "Sulfuric Water" +#define AQUARIUM_FLUID_AIR "Air" +#define AQUARIUM_FLUID_ANADROMOUS "Adaptive to both Freshwater and Saltwater" +#define AQUARIUM_FLUID_ANY_WATER "Adaptive to all kind of water" + +///Fluff. The name of the aquarium company shown in the fish catalog +#define AQUARIUM_COMPANY "Aquatech Ltd." diff --git a/code/__DEFINES/fishing.dm b/code/__DEFINES/fishing.dm deleted file mode 100644 index b20d3ebe1a0a1..0000000000000 --- a/code/__DEFINES/fishing.dm +++ /dev/null @@ -1,54 +0,0 @@ -/// Use in fish tables to denote miss chance. -#define FISHING_DUD "dud" - -#define FISHING_BAIT_TRAIT "fishing_bait" -#define BASIC_QUALITY_BAIT_TRAIT "removes_felinids_pr" -#define GOOD_QUALITY_BAIT_TRAIT "adds_bitcoin_miner_pr" -#define GREAT_QUALITY_BAIT_TRAIT "perspective_walls_pr" - -// Baseline fishing difficulty levels -#define FISHING_DEFAULT_DIFFICULTY 15 - -/// Difficulty modifier when bait is fish's favorite -#define FAV_BAIT_DIFFICULTY_MOD -5 -/// Difficulty modifier when bait is fish's disliked -#define DISLIKED_BAIT_DIFFICULTY_MOD 15 - - -#define FISH_TRAIT_MINOR_DIFFICULTY_BOOST 5 - -// These define how the fish will behave in the minigame -#define FISH_AI_DUMB "dumb" -#define FISH_AI_ZIPPY "zippy" -#define FISH_AI_SLOW "slow" - -#define ADDITIVE_FISHING_MOD "additive" -#define MULTIPLICATIVE_FISHING_MOD "multiplicative" - -// These defines are intended for use to interact with fishing hooks when going -// through the fishing rod, and not the hook itself. They could probably be -// handled differently, but for now that's how they work. It's grounds for -// a future refactor, however. -/// Fishing hook trait that signifies that it's shiny. Useful for fishes -/// that care about shiner hooks more. -#define FISHING_HOOK_SHINY (1 << 0) -/// Fishing hook trait that's used to make the bait more weighted, for the -/// fishing minigame itself. -#define FISHING_HOOK_WEIGHTED (1 << 1) - -#define FISHING_LINE_CLOAKED (1 << 0) -#define FISHING_LINE_REINFORCED (1 << 1) -#define FISHING_LINE_BOUNCY (1 << 2) - -#define FISHING_SPOT_PRESET_BEACH "beach" -#define FISHING_SPOT_PRESET_LAVALAND_LAVA "lavaland lava" -#define FISHING_SPOT_PRESET_CHASM "chasm" - -#define FISHING_MINIGAME_RULE_HEAVY_FISH "heavy" -#define FISHING_MINIGAME_RULE_WEIGHTED_BAIT "weighted" -#define FISHING_MINIGAME_RULE_LIMIT_LOSS "limit_loss" - -/// The default additive value for fishing hook catch weight modifiers. -#define FISHING_DEFAULT_HOOK_BONUS_ADDITIVE 0 -/// The default multiplicative value for fishing hook catch weight modifiers. -#define FISHING_DEFAULT_HOOK_BONUS_MULTIPLICATIVE 1 diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 51a177b08eada..849b3a28b9c62 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -88,7 +88,10 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 //TURF FLAGS /// If a turf cant be jaunted through. #define NOJAUNT (1<<0) +/// If a turf is an usused reservation turf awaiting assignment #define UNUSED_RESERVATION_TURF (1<<1) +/// If a turf is a reserved turf +#define RESERVATION_TURF (1<<2) /// Blocks lava rivers being generated on the turf. #define NO_LAVA_GEN (1<<3) /// Blocks ruins spawning on the turf. @@ -155,6 +158,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define PASSDOORS (1<<10) #define PASSVEHICLE (1<<11) #define PASSITEM (1<<12) +/// Do not intercept click attempts during Adjacent() checks. See [turf/proc/ClickCross]. **ONLY MEANINGFUL ON pass_flags_self!** +#define LETPASSCLICKS (1<<13) //Movement Types #define GROUND (1<<0) @@ -255,20 +260,6 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 // This skillchip is incompatible with other skillchips from the incompatible_category list. #define SKILLCHIP_RESTRICTED_CATEGORIES (1<<1) -//dir macros -///Returns true if the dir is diagonal, false otherwise -#define ISDIAGONALDIR(d) (d&(d-1)) -///True if the dir is north or south, false therwise -#define NSCOMPONENT(d) (d&(NORTH|SOUTH)) -///True if the dir is east/west, false otherwise -#define EWCOMPONENT(d) (d&(EAST|WEST)) -///Flips the dir for north/south directions -#define NSDIRFLIP(d) (d^(NORTH|SOUTH)) -///Flips the dir for east/west directions -#define EWDIRFLIP(d) (d^(EAST|WEST)) -///Turns the dir by 180 degrees -#define DIRFLIP(d) turn(d, 180) - #define MAX_BITFIELD_SIZE 24 /// 33554431 (2^24 - 1) is the maximum value our bitflags can reach. @@ -286,7 +277,6 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 /// Used to prevent important slowdowns from being abused by drugs like kronkaine #define IGNORE_SLOWDOWNS (1<<4) - // Spacevine-related flags /// Is the spacevine / flower bud heat resistant #define SPACEVINE_HEAT_RESISTANT (1 << 0) diff --git a/code/__DEFINES/fonts.dm b/code/__DEFINES/fonts.dm index 6b00195f59b0f..e3e2e7ab7f696 100644 --- a/code/__DEFINES/fonts.dm +++ b/code/__DEFINES/fonts.dm @@ -14,3 +14,11 @@ /// Emoji icon set #define EMOJI_SET 'icons/ui_icons/emoji/emoji.dmi' + +// Font metrics bitfield +/// Include leading A width and trailing C width in GetWidth() or in DrawText() +#define INCLUDE_AC (1<<0) + +DEFINE_BITFIELD(font_flags, list( + "INCLUDE_AC" = INCLUDE_AC, +)) diff --git a/code/__DEFINES/food.dm b/code/__DEFINES/food.dm index 496027fc5865d..142664bb784c2 100644 --- a/code/__DEFINES/food.dm +++ b/code/__DEFINES/food.dm @@ -94,11 +94,76 @@ DEFINE_BITFIELD(foodtypes, list( "Rocks", \ ) -#define DRINK_NICE 1 -#define DRINK_GOOD 2 -#define DRINK_VERYGOOD 3 -#define DRINK_FANTASTIC 4 -#define FOOD_AMAZING 5 +#define DRINK_REVOLTING 1 +#define DRINK_NICE 2 +#define DRINK_GOOD 3 +#define DRINK_VERYGOOD 4 +#define DRINK_FANTASTIC 5 +#define FOOD_AMAZING 6 + +#define FOOD_QUALITY_NORMAL 1 +#define FOOD_QUALITY_NICE 2 +#define FOOD_QUALITY_GOOD 3 +#define FOOD_QUALITY_VERYGOOD 4 +#define FOOD_QUALITY_FANTASTIC 5 +#define FOOD_QUALITY_AMAZING 6 +#define FOOD_QUALITY_TOP 7 + +#define FOOD_COMPLEXITY_0 0 +#define FOOD_COMPLEXITY_1 1 +#define FOOD_COMPLEXITY_2 2 +#define FOOD_COMPLEXITY_3 3 +#define FOOD_COMPLEXITY_4 4 +#define FOOD_COMPLEXITY_5 5 + +/// Labels for food quality +GLOBAL_LIST_INIT(food_quality_description, list( + FOOD_QUALITY_NORMAL = "okay", + FOOD_QUALITY_NICE = "nice", + FOOD_QUALITY_GOOD = "good", + FOOD_QUALITY_VERYGOOD = "very good", + FOOD_QUALITY_FANTASTIC = "fantastic", + FOOD_QUALITY_AMAZING = "amazing", + FOOD_QUALITY_TOP = "godlike", +)) + +/// Mood events for food quality +GLOBAL_LIST_INIT(food_quality_events, list( + FOOD_QUALITY_NORMAL = /datum/mood_event/food, + FOOD_QUALITY_NICE = /datum/mood_event/food/nice, + FOOD_QUALITY_GOOD = /datum/mood_event/food/good, + FOOD_QUALITY_VERYGOOD = /datum/mood_event/food/verygood, + FOOD_QUALITY_FANTASTIC = /datum/mood_event/food/fantastic, + FOOD_QUALITY_AMAZING = /datum/mood_event/food/amazing, + FOOD_QUALITY_TOP = /datum/mood_event/food/top, +)) + +/// Crafted food buffs grouped by crafting_complexity +GLOBAL_LIST_INIT(food_buffs, list( + FOOD_COMPLEXITY_1 = list( + /datum/status_effect/food/haste = 1, + ), + FOOD_COMPLEXITY_2 = list( + /datum/status_effect/food/haste = 1, + ), + FOOD_COMPLEXITY_3 = list( + /datum/status_effect/food/haste = 1, + ), + FOOD_COMPLEXITY_4 = list( + /datum/status_effect/food/haste = 1, + /datum/status_effect/food/trait/shockimmune = 1, + ), + FOOD_COMPLEXITY_5 = list( + /datum/status_effect/food/haste = 1, + /datum/status_effect/food/trait/shockimmune = 2, + ), +)) + +/// Food quality change according to species diet +#define DISLIKED_FOOD_QUALITY_CHANGE -2 +#define LIKED_FOOD_QUALITY_CHANGE 2 +/// Threshold for food to give a toxic reaction +#define TOXIC_FOOD_QUALITY_THRESHOLD -8 /// Food is "in a container", not in a code sense, but in a literal sense (canned foods) #define FOOD_IN_CONTAINER (1<<0) @@ -117,11 +182,6 @@ DEFINE_BITFIELD(food_flags, list( #define FOOD_MEAT_MUTANT 100 #define FOOD_MEAT_MUTANT_RARE 200 -///Amount of reagents you start with on crafted food excluding the used parts -#define CRAFTED_FOOD_BASE_REAGENT_MODIFIER 0.7 -///Modifier of reagents you get when crafting food from the parts used -#define CRAFTED_FOOD_INGREDIENT_REAGENT_MODIFIER 0.5 - #define IS_EDIBLE(O) (O.GetComponent(/datum/component/edible)) @@ -171,8 +231,16 @@ DEFINE_BITFIELD(food_flags, list( #define ICE_CREAM_CHOCOLATE "chocolate" #define ICE_CREAM_STRAWBERRY "strawberry" #define ICE_CREAM_BLUE "blue" +#define ICE_CREAM_LEMON "lemon sorbet" +#define ICE_CREAM_CARAMEL "caramel" +#define ICE_CREAM_BANANA "banana" +#define ICE_CREAM_ORANGE_CREAM "orangesicle" +#define ICE_CREAM_PEACH "peach" +#define ICE_CREAM_CHERRY_CHOCOLATE "cherry chocolate chip" +#define ICE_CREAM_KORTA_VANILLA "korta vanilla" #define ICE_CREAM_MOB "mob" #define ICE_CREAM_CUSTOM "custom" +#define ICE_CREAM_KORTA_CUSTOM "korta custom" #define ICE_CREAM_BLAND "bland" #define DEFAULT_MAX_ICE_CREAM_SCOOPS 3 @@ -192,3 +260,6 @@ DEFINE_BITFIELD(food_flags, list( // Venues for the barbots. #define VENUE_RESTAURANT "Restaurant Venue" #define VENUE_BAR "Bar Venue" + +/// How much milk is needed to make butter on a reagent grinder +#define MILK_TO_BUTTER_COEFF 25 diff --git a/code/__DEFINES/footsteps.dm b/code/__DEFINES/footsteps.dm index 924a4eb737943..c8b89b082a497 100644 --- a/code/__DEFINES/footsteps.dm +++ b/code/__DEFINES/footsteps.dm @@ -17,15 +17,25 @@ //misc footstep sounds #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_MOB_RUST "footstep_rust" +#define FOOTSTEP_OBJ_MACHINE "footstep_machine" +#define FOOTSTEP_OBJ_ROBOT "footstep_robot" + +//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" /* diff --git a/code/__DEFINES/holiday.dm b/code/__DEFINES/holiday.dm new file mode 100644 index 0000000000000..1c35940e71887 --- /dev/null +++ b/code/__DEFINES/holiday.dm @@ -0,0 +1 @@ +#define HOLIDAY_HAT_CHANCE 20 diff --git a/code/__DEFINES/icon_smoothing.dm b/code/__DEFINES/icon_smoothing.dm index f6b1ce41700f5..16fb88c84bd7b 100644 --- a/code/__DEFINES/icon_smoothing.dm +++ b/code/__DEFINES/icon_smoothing.dm @@ -11,6 +11,11 @@ #define SMOOTH_QUEUED (1<<4) /// Smooths with objects, and will thus need to scan turfs for contents. #define SMOOTH_OBJ (1<<5) +/// Uses directional object smoothing, so we care not only about something being on the right turf, but also its direction +/// Changes the meaning of smoothing_junction, instead of representing the directions we are smoothing in +/// it represents the sides of our directional border object that have a neighbor +/// Is incompatible with SMOOTH_CORNERS because border objects don't have corners +#define SMOOTH_BORDER_OBJECT (1<<6) DEFINE_BITFIELD(smoothing_flags, list( "SMOOTH_CORNERS" = SMOOTH_CORNERS, @@ -19,8 +24,30 @@ DEFINE_BITFIELD(smoothing_flags, list( "SMOOTH_BORDER" = SMOOTH_BORDER, "SMOOTH_QUEUED" = SMOOTH_QUEUED, "SMOOTH_OBJ" = SMOOTH_OBJ, + "SMOOTH_BORDER_OBJECT" = SMOOTH_BORDER_OBJECT, )) +/// Components of a smoothing junction +/// Redefinitions of the diagonal directions so they can be stored in one var without conflicts +#define NORTH_JUNCTION NORTH //(1<<0) +#define SOUTH_JUNCTION SOUTH //(1<<1) +#define EAST_JUNCTION EAST //(1<<2) +#define WEST_JUNCTION WEST //(1<<3) +#define NORTHEAST_JUNCTION (1<<4) +#define SOUTHEAST_JUNCTION (1<<5) +#define SOUTHWEST_JUNCTION (1<<6) +#define NORTHWEST_JUNCTION (1<<7) + +DEFINE_BITFIELD(smoothing_junction, list( + "NORTH_JUNCTION" = NORTH_JUNCTION, + "SOUTH_JUNCTION" = SOUTH_JUNCTION, + "EAST_JUNCTION" = EAST_JUNCTION, + "WEST_JUNCTION" = WEST_JUNCTION, + "NORTHEAST_JUNCTION" = NORTHEAST_JUNCTION, + "SOUTHEAST_JUNCTION" = SOUTHEAST_JUNCTION, + "SOUTHWEST_JUNCTION" = SOUTHWEST_JUNCTION, + "NORTHWEST_JUNCTION" = NORTHWEST_JUNCTION, +)) /*smoothing macros*/ @@ -102,6 +129,7 @@ DEFINE_BITFIELD(smoothing_flags, list( #define SMOOTH_GROUP_MINERAL_WALLS S_TURF(57) ///turf/closed/mineral, /turf/closed/indestructible #define SMOOTH_GROUP_BOSS_WALLS S_TURF(58) ///turf/closed/indestructible/riveted/boss #define SMOOTH_GROUP_SURVIVAL_TITANIUM_WALLS S_TURF(59) ///turf/closed/wall/mineral/titanium/survival +#define SMOOTH_GROUP_TURF_OPEN_CLIFF S_TURF(60) ///turf/open/cliff #define MAX_S_TURF 59 //Always match this value with the one above it. @@ -133,6 +161,8 @@ DEFINE_BITFIELD(smoothing_flags, list( #define SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM S_OBJ(24) ///turf/closed/indestructible/opsglass, /obj/structure/window/reinforced/plasma/plastitanium #define SMOOTH_GROUP_WINDOW_FULLTILE_SHUTTLE S_OBJ(25) ///obj/structure/window/reinforced/shuttle +#define SMOOTH_GROUP_WINDOW_DIRECTIONAL_TRAM S_OBJ(26) ///obj/structure/window/reinforced/tram + #define SMOOTH_GROUP_LATTICE S_OBJ(31) ///obj/structure/lattice #define SMOOTH_GROUP_CATWALK S_OBJ(32) ///obj/structure/lattice/catwalk diff --git a/code/__DEFINES/industrial_lift.dm b/code/__DEFINES/industrial_lift.dm index a5b8a9f756b0c..5ab2406229dd6 100644 --- a/code/__DEFINES/industrial_lift.dm +++ b/code/__DEFINES/industrial_lift.dm @@ -12,6 +12,9 @@ ///debug lift_id #define DEBUG_LIFT_ID "debug" +///used for navigation aids that aren't actual platforms +#define TRAM_NAV_BEACONS "tram_nav" +#define IMMOVABLE_ROD_DESTINATIONS "immovable_rod" //specific_lift_id's ///the specific_lift_id of the main station tram landmark for tramstation that spawns roundstart. diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index fb9f33f4a5dfc..8da88c3703a1f 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -145,6 +145,7 @@ #define MASKCOVERSMOUTH (1<<3) // on other items, these are just for mask/head #define HEADCOVERSMOUTH (1<<4) #define PEPPERPROOF (1<<5) //protects against pepperspray +#define EARS_COVERED (1<<6) #define TINT_DARKENED 2 //Threshold of tint level to apply weld mask overlay #define TINT_BLIND 3 //Threshold of tint level to obscure vision fully @@ -181,6 +182,7 @@ GLOBAL_LIST_INIT(detective_vest_allowed, list( /obj/item/storage/belt/holster/detective, /obj/item/storage/belt/holster/nukie, /obj/item/storage/belt/holster/energy, + /obj/item/gun/ballistic/shotgun/automatic/combat/compact, )) GLOBAL_LIST_INIT(security_vest_allowed, list( @@ -198,6 +200,7 @@ GLOBAL_LIST_INIT(security_vest_allowed, list( /obj/item/storage/belt/holster/detective, /obj/item/storage/belt/holster/nukie, /obj/item/storage/belt/holster/energy, + /obj/item/gun/ballistic/shotgun/automatic/combat/compact, )) GLOBAL_LIST_INIT(security_wintercoat_allowed, list( @@ -211,6 +214,7 @@ GLOBAL_LIST_INIT(security_wintercoat_allowed, list( /obj/item/storage/belt/holster/detective, /obj/item/storage/belt/holster/nukie, /obj/item/storage/belt/holster/energy, + /obj/item/gun/ballistic/shotgun/automatic/combat/compact, )) //Allowed list for all chaplain suits (except the honkmother robe) @@ -224,6 +228,7 @@ GLOBAL_LIST_INIT(chaplain_suit_allowed, list( /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/gun/ballistic/bow/divine, + /obj/item/gun/ballistic/revolver/chaplain, )) /// String for items placed into the left pocket. diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 3d08f8d709923..b775b948c87c4 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -11,6 +11,9 @@ #define isweakref(D) (istype(D, /datum/weakref)) +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) (!ispath(thing) && istype(GLOB.magic_appearance_detecting_image, thing)) + #define isgenerator(A) (istype(A, /generator)) //Turfs @@ -62,6 +65,17 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( #define istransparentturf(A) (HAS_TRAIT(A, TURF_Z_TRANSPARENT_TRAIT)) +#define iscliffturf(A) (istype(A, /turf/open/cliff)) + +GLOBAL_LIST_INIT(turfs_pass_meteor, typecacheof(list( + /turf/closed/mineral, + /turf/open/misc/asteroid, + /turf/open/openspace, + /turf/open/space +))) + +#define ispassmeteorturf(A) (is_type_in_typecache(A, GLOB.turfs_pass_meteor)) + //Mobs #define isliving(A) (istype(A, /mob/living)) @@ -157,7 +171,7 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( #define ishostile(A) (istype(A, /mob/living/simple_animal/hostile)) -#define isregalrat(A) (istype(A, /mob/living/simple_animal/hostile/regalrat)) +#define isregalrat(A) (istype(A, /mob/living/basic/regal_rat)) #define isguardian(A) (istype(A, /mob/living/simple_animal/hostile/guardian)) @@ -165,9 +179,9 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( #define ismegafauna(A) (istype(A, /mob/living/simple_animal/hostile/megafauna)) -#define isclown(A) (istype(A, /mob/living/simple_animal/hostile/retaliate/clown)) +#define isclown(A) (istype(A, /mob/living/basic/clown)) -#define isspider(A) (istype(A, /mob/living/basic/giant_spider)) +#define isspider(A) (istype(A, /mob/living/basic/spider/giant)) //Misc mobs @@ -190,6 +204,8 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( #define isitem(A) (istype(A, /obj/item)) +#define isfish(A) (istype(A, /obj/item/fish)) + #define isstack(A) (istype(A, /obj/item/stack)) #define isgrenade(A) (istype(A, /obj/item/grenade)) @@ -204,8 +220,14 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( #define isstructure(A) (istype(A, /obj/structure)) +#define isaquarium(A) (istype(A, /obj/structure/aquarium)) + #define ismachinery(A) (istype(A, /obj/machinery)) +#define istramwall(A) (istype(A, /obj/structure/window/reinforced/tram/front)) + +#define isvendor(A) (istype(A, /obj/machinery/vending)) + #define isvehicle(A) (istype(A, /obj/vehicle)) #define ismecha(A) (istype(A, /obj/vehicle/sealed/mecha)) @@ -230,6 +252,8 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( #define isgun(A) (istype(A, /obj/item/gun)) +#define isammobox(A) (istype(A, /obj/item/ammo_box)) + #define isinstrument(A) (istype(A, /obj/item/instrument) || istype(A, /obj/structure/musician)) #define is_reagent_container(O) (istype(O, /obj/item/reagent_containers)) @@ -257,8 +281,6 @@ GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list( #define isholoeffect(O) (istype(O, /obj/effect/holodeck_effect)) -#define isblobmonster(O) (istype(O, /mob/living/simple_animal/hostile/blob)) - #define isshuttleturf(T) (!isnull(T.depth_to_find_baseturf(/turf/baseturf_skipover/shuttle))) #define isProbablyWallMounted(O) (O.pixel_x > 20 || O.pixel_x < -20 || O.pixel_y > 20 || O.pixel_y < -20) @@ -267,6 +289,7 @@ GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list( GLOBAL_LIST_INIT(book_types, typecacheof(list( /obj/item/book, /obj/item/spellbook, + /obj/item/infuser_book, ))) // Jobs diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index 336c00e3e1fdd..23c731565d7ab 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -6,6 +6,8 @@ #define JOB_UNAVAILABLE_SLOTFULL 5 /// Job unavailable due to incompatibility with an antag role. #define JOB_UNAVAILABLE_ANTAG_INCOMPAT 6 +/// Checks for character age. +#define JOB_UNAVAILABLE_AGE 7 /// Used when the `get_job_unavailable_error_message` proc can't make sense of a given code. #define GENERIC_JOB_UNAVAILABLE_ERROR "Error: Unknown job availability." @@ -17,6 +19,12 @@ #define JOB_DISPLAY_ORDER_DEFAULT 0 +// Keys for jobconfig.toml +#define JOB_CONFIG_PLAYTIME_REQUIREMENTS "Playtime Requirements" +#define JOB_CONFIG_REQUIRED_ACCOUNT_AGE "Required Account Age" +#define JOB_CONFIG_REQUIRED_CHARACTER_AGE "Required Character Age" +#define JOB_CONFIG_SPAWN_POSITIONS "Spawn Positions" +#define JOB_CONFIG_TOTAL_POSITIONS "Total Positions" /** * ======================= @@ -69,6 +77,7 @@ #define JOB_QUARTERMASTER "Quartermaster" #define JOB_CARGO_TECHNICIAN "Cargo Technician" #define JOB_SHAFT_MINER "Shaft Miner" +#define JOB_BITRUNNER "Bitrunner" //Service #define JOB_BARTENDER "Bartender" #define JOB_BOTANIST "Botanist" @@ -103,6 +112,11 @@ #define JOB_CENTCOM_SPECIAL_OFFICER "Special Ops Officer" #define JOB_CENTCOM_PRIVATE_SECURITY "Private Security Force" +#define JOB_GROUP_ENGINEERS list( \ + JOB_STATION_ENGINEER, \ + JOB_ATMOSPHERIC_TECHNICIAN, \ +) + #define JOB_DISPLAY_ORDER_ASSISTANT 1 #define JOB_DISPLAY_ORDER_CAPTAIN 2 @@ -125,22 +139,22 @@ #define JOB_DISPLAY_ORDER_QUARTERMASTER 19 #define JOB_DISPLAY_ORDER_CARGO_TECHNICIAN 20 #define JOB_DISPLAY_ORDER_SHAFT_MINER 21 -#define JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER 22 -#define JOB_DISPLAY_ORDER_MEDICAL_DOCTOR 23 -#define JOB_DISPLAY_ORDER_PARAMEDIC 24 -#define JOB_DISPLAY_ORDER_CHEMIST 25 -#define JOB_DISPLAY_ORDER_VIROLOGIST 26 -#define JOB_DISPLAY_ORDER_CORONER 27 -#define JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR 28 -#define JOB_DISPLAY_ORDER_SCIENTIST 29 -#define JOB_DISPLAY_ORDER_ROBOTICIST 30 -#define JOB_DISPLAY_ORDER_GENETICIST 31 -#define JOB_DISPLAY_ORDER_HEAD_OF_SECURITY 32 -#define JOB_DISPLAY_ORDER_WARDEN 33 -#define JOB_DISPLAY_ORDER_DETECTIVE 34 -#define JOB_DISPLAY_ORDER_SECURITY_OFFICER 35 -#define JOB_DISPLAY_ORDER_PRISONER 36 - +#define JOB_DISPLAY_ORDER_BITRUNNER 22 +#define JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER 23 +#define JOB_DISPLAY_ORDER_MEDICAL_DOCTOR 24 +#define JOB_DISPLAY_ORDER_PARAMEDIC 25 +#define JOB_DISPLAY_ORDER_CHEMIST 26 +#define JOB_DISPLAY_ORDER_VIROLOGIST 27 +#define JOB_DISPLAY_ORDER_CORONER 28 +#define JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR 29 +#define JOB_DISPLAY_ORDER_SCIENTIST 30 +#define JOB_DISPLAY_ORDER_ROBOTICIST 31 +#define JOB_DISPLAY_ORDER_GENETICIST 32 +#define JOB_DISPLAY_ORDER_HEAD_OF_SECURITY 33 +#define JOB_DISPLAY_ORDER_WARDEN 34 +#define JOB_DISPLAY_ORDER_DETECTIVE 35 +#define JOB_DISPLAY_ORDER_SECURITY_OFFICER 36 +#define JOB_DISPLAY_ORDER_PRISONER 37 #define DEPARTMENT_UNASSIGNED "No Department" @@ -184,6 +198,11 @@ #define JOB_ASSIGN_QUIRKS (1<<7) /// Whether this job can be an intern. #define JOB_CAN_BE_INTERN (1<<8) +/// This job cannot have more slots opened by the Head of Personnel (but admins or other random events can still do this). +#define JOB_CANNOT_OPEN_SLOTS (1<<9) + +/// Combination flag for jobs which are considered regular crew members of the station. +#define STATION_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) #define FACTION_NONE "None" #define FACTION_STATION "Station" diff --git a/code/__DEFINES/keybinding.dm b/code/__DEFINES/keybinding.dm index 0f05c0fe12b62..33178bc7c8be8 100644 --- a/code/__DEFINES/keybinding.dm +++ b/code/__DEFINES/keybinding.dm @@ -49,6 +49,8 @@ #define COMSIG_KB_LIVING_TOGGLE_COMBAT_DOWN "keybinding_living_toggle_combat_down" #define COMSIG_KB_LIVING_ENABLE_COMBAT_DOWN "keybinding_living_enable_combat_down" #define COMSIG_KB_LIVING_DISABLE_COMBAT_DOWN "keybinding_living_disable_combat_down" +#define COMSIG_KB_LIVING_TOGGLEMOVEINTENT_DOWN "keybinding_mob_togglemoveintent_down" +#define COMSIG_KB_LIVING_TOGGLEMOVEINTENTALT_DOWN "keybinding_mob_togglemoveintentalt_down" //Mob #define COMSIG_KB_MOB_FACENORTH_DOWN "keybinding_mob_facenorth_down" @@ -61,8 +63,6 @@ #define COMSIG_KB_MOB_SWAPHANDS_DOWN "keybinding_mob_swaphands_down" #define COMSIG_KB_MOB_ACTIVATEINHAND_DOWN "keybinding_mob_activateinhand_down" #define COMSIG_KB_MOB_DROPITEM_DOWN "keybinding_mob_dropitem_down" -#define COMSIG_KB_MOB_TOGGLEMOVEINTENT_DOWN "keybinding_mob_togglemoveintent_down" -#define COMSIG_KB_MOB_TOGGLEMOVEINTENTALT_DOWN "keybinding_mob_togglemoveintentalt_down" #define COMSIG_KB_MOB_TARGETCYCLEHEAD_DOWN "keybinding_mob_targetcyclehead_down" #define COMSIG_KB_MOB_TARGETEYES_DOWN "keybinding_mob_targeteyes_down" #define COMSIG_KB_MOB_TARGETMOUTH_DOWN "keybinding_mob_targetmouth_down" diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm index 8f9c76299bcab..5b1082f606ddb 100644 --- a/code/__DEFINES/language.dm +++ b/code/__DEFINES/language.dm @@ -4,10 +4,22 @@ #define LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD 8 // LANGUAGE SOURCE DEFINES -#define LANGUAGE_ALL "all" // For use in full removal only. +/// For use in full removal only. +#define LANGUAGE_ALL "all" + +// Generic language sources. +/// Language is linked to the movable directly. #define LANGUAGE_ATOM "atom" +/// Language is linked to the mob's mind. +/// If a mind transfer happens, language follows. #define LANGUAGE_MIND "mind" +/// Language is linked to the mob's species. +/// If a species change happens, language goes away. +/// If applied to a non-human (no species) atom, this is effectively the same as [LANGUAGE_ATOM]. +#define LANGUAGE_SPECIES "species" +// More specific language sources. +// Only ever goes away when dismissed directly. #define LANGUAGE_ABSORB "absorb" #define LANGUAGE_APHASIA "aphasia" #define LANGUAGE_CTF "ctf" @@ -19,8 +31,16 @@ #define LANGUAGE_MALF "malf" #define LANGUAGE_PIRATE "pirate" #define LANGUAGE_MASTER "master" +#define LANGUAGE_PAI "pai" #define LANGUAGE_SOFTWARE "software" #define LANGUAGE_STONER "stoner" #define LANGUAGE_VOICECHANGE "voicechange" #define LANGUAGE_RADIOKEY "radiokey" #define LANGUAGE_BABEL "babel" +#define LANGUAGE_EMP "emp" + +// Language flags. Used in granting and removing languages. +/// This language can be spoken. +#define SPOKEN_LANGUAGE (1<<0) +/// This language can be understood. +#define UNDERSTOOD_LANGUAGE (1<<1) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 7438c78f4d276..b9af1fd64ba0c 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -163,6 +163,8 @@ #define FLOOR_CLEAN_LAYER 2.55 #define BELOW_OPEN_DOOR_LAYER 2.6 +///Anything below this layer is to be considered completely (visually) under water by the immerse layer. +#define WATER_LEVEL_LAYER 2.61 #define BLASTDOOR_LAYER 2.65 #define OPEN_DOOR_LAYER 2.7 #define DOOR_ACCESS_HELPER_LAYER 2.71 //keep this above OPEN_DOOR_LAYER, special layer used for /obj/effect/mapping_helpers/airlock/access @@ -217,6 +219,13 @@ #define GASFIRE_LAYER 5.05 #define RIPPLE_LAYER 5.1 +/** + * The layer of the visual overlay used in the submerge element. + * The vis overlay inherits the planes of the movables it's attached to (that also have KEEP_TOGETHER added) + * We just have to make sure the visual overlay is rendered above all the other overlays of those movables. + */ +#define WATER_VISUAL_OVERLAY_LAYER 1000 + //---------- LIGHTING ------------- // LIGHTING_PLANE layers @@ -269,10 +278,21 @@ /// Layer for tutorial instructions #define TUTORIAL_INSTRUCTIONS_LAYER 5 +/// Layer for light overlays +#define LIGHT_DEBUG_LAYER 6 #define LOBBY_BACKGROUND_LAYER 3 #define LOBBY_BUTTON_LAYER 4 +///Layer for lobby menu collapse button +#define LOBBY_BELOW_MENU_LAYER 2 +///Layer for lobby menu background image and main buttons (Join/Ready, Observe, Charater Prefs) +#define LOBBY_MENU_LAYER 3 +///Layer for lobby menu shutter, which covers up the menu to collapse/expand it +#define LOBBY_SHUTTER_LAYER 4 +///Layer for lobby menu buttons that are hanging away from and lower than the main panel +#define LOBBY_BOTTOM_BUTTON_LAYER 5 + ///cinematics are "below" the splash screen #define CINEMATIC_LAYER -1 diff --git a/code/__DEFINES/lazy_templates.dm b/code/__DEFINES/lazy_templates.dm index ed898ba0a3db0..8a469af4deeda 100644 --- a/code/__DEFINES/lazy_templates.dm +++ b/code/__DEFINES/lazy_templates.dm @@ -2,10 +2,12 @@ #define LAZY_TEMPLATE_KEY_WIZARDDEN "LT_WIZARDDEN" #define LAZY_TEMPLATE_KEY_NINJA_HOLDING_FACILITY "LT_NINJAHOLDING" #define LAZY_TEMPLATE_KEY_ABDUCTOR_SHIPS "LT_ABDUCTORSHIPS" +#define LAZY_TEMPLATE_KEY_HERETIC_SACRIFICE "LT_HERETICSACRIFICE" #define LAZY_TEMPLATE_KEY_LIST_ALL(...) list( \ "Nukie Base" = LAZY_TEMPLATE_KEY_NUKIEBASE, \ "Wizard Den" = LAZY_TEMPLATE_KEY_WIZARDDEN, \ "Ninja Holding" = LAZY_TEMPLATE_KEY_NINJA_HOLDING_FACILITY, \ "Abductor Ships" = LAZY_TEMPLATE_KEY_ABDUCTOR_SHIPS, \ + "Heretic Sacrifice Level" = LAZY_TEMPLATE_KEY_HERETIC_SACRIFICE, \ ) diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index 08f6e0306f726..97c07f5914874 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -1,20 +1,24 @@ -///Object doesn't use any of the light systems. Should be changed to add a light source to the object. +/// 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. +/// Light made with the lighting datums, applying a matrix. #define STATIC_LIGHT 1 -///Light made by masking the lighting darkness plane. +/// Light made by masking the lighting darkness plane. #define MOVABLE_LIGHT 2 -///Light made by masking the lighting darkness plane, and is directional. +/// Light made by masking the lighting darkness plane, and is directional. #define MOVABLE_LIGHT_DIRECTIONAL 3 ///Light made by masking the lighting darkness plane, and is a directionally focused beam. #define MOVABLE_LIGHT_BEAM 4 /// Nonesensical value for light color, used for null checks. #define NONSENSICAL_VALUE -99999 -///Is a movable light source attached to another movable (its loc), meaning that the lighting component should go one level deeper. +/// Is a movable light source attached to another movable (its loc), meaning that the lighting component should go one level deeper. #define LIGHT_ATTACHED (1<<0) +/// Freezes a light in its current state, blocking any attempts at modification +#define LIGHT_FROZEN (1<<1) +/// Does this light ignore inherent offsets? (Pixels, transforms, etc) +#define LIGHT_IGNORE_OFFSET (1<<2) -//Bay lighting engine shit, not in /code/modules/lighting because BYOND is being shit about it +// 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 diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm index 7bec0da19cdc0..8c21879fb64f9 100644 --- a/code/__DEFINES/logging.dm +++ b/code/__DEFINES/logging.dm @@ -95,18 +95,19 @@ #define LOG_CATEGORY_MANIFEST "manifest" #define LOG_CATEGORY_MECHA "mecha" #define LOG_CATEGORY_PAPER "paper" +#define LOG_CATEGORY_QDEL "qdel" #define LOG_CATEGORY_RUNTIME "runtime" #define LOG_CATEGORY_SHUTTLE "shuttle" #define LOG_CATEGORY_SILICON "silicon" #define LOG_CATEGORY_SILO "silo" #define LOG_CATEGORY_SIGNAL "signal" #define LOG_CATEGORY_SPEECH_INDICATOR "speech-indiciator" -#define LOG_CATEGORY_SUSPICIOUS_LOGIN "supicious-login" +// Leave the underscore, it's there for backwards compatibility reasons +#define LOG_CATEGORY_SUSPICIOUS_LOGIN "suspicious_logins" #define LOG_CATEGORY_TARGET_ZONE_SWITCH "target-zone-switch" #define LOG_CATEGORY_TELECOMMS "telecomms" #define LOG_CATEGORY_TOOL "tool" #define LOG_CATEGORY_VIRUS "virus" -#define LOG_CATEGORY_QDEL "qdel" // Admin categories #define LOG_CATEGORY_ADMIN "admin" @@ -120,13 +121,11 @@ // Debug categories #define LOG_CATEGORY_DEBUG "debug" #define LOG_CATEGORY_DEBUG_ASSET "debug-asset" -#define LOG_CATEGORY_DEBUG_HREF "debug-href" #define LOG_CATEGORY_DEBUG_JOB "debug-job" #define LOG_CATEGORY_DEBUG_LUA "debug-lua" #define LOG_CATEGORY_DEBUG_MAPPING "debug-mapping" #define LOG_CATEGORY_DEBUG_MOBTAG "debug-mobtag" #define LOG_CATEGORY_DEBUG_SQL "debug-sql" -#define LOG_CATEGORY_DEBUG_TGUI "debug-tgui" // Compatibility categories, for when stuff is changed and you need existing functionality to work #define LOG_CATEGORY_COMPAT_GAME "game-compat" @@ -145,6 +144,10 @@ #define LOG_CATEGORY_GAME_VOTE "game-vote" #define LOG_CATEGORY_GAME_WHISPER "game-whisper" +// HREF categories +#define LOG_CATEGORY_HREF "href" +#define LOG_CATEGORY_HREF_TGUI "href-tgui" + // Uplink categories #define LOG_CATEGORY_UPLINK "uplink" #define LOG_CATEGORY_UPLINK_CHANGELING "uplink-changeling" diff --git a/code/__DEFINES/magic.dm b/code/__DEFINES/magic.dm index 34ec4b6659b69..ecc470c04e90c 100644 --- a/code/__DEFINES/magic.dm +++ b/code/__DEFINES/magic.dm @@ -50,8 +50,7 @@ /// Whether the spell can be cast by mobs who are brains / mmis. /// When applying, bear in mind most spells will not function for brains out of the box. #define SPELL_CASTABLE_AS_BRAIN (1 << 2) -/// Whether the spell can be cast while phased, such as blood crawling, ethereal jaunting or using rod form. -#define SPELL_CASTABLE_WHILE_PHASED (1 << 3) + /// Whether the spell can be cast while the user has antimagic on them that corresponds to the spell's own antimagic flags. #define SPELL_REQUIRES_NO_ANTIMAGIC (1 << 4) /// Whether the spell requires being on the station z-level to be cast. @@ -66,7 +65,6 @@ DEFINE_BITFIELD(spell_requirements, list( "SPELL_CASTABLE_AS_BRAIN" = SPELL_CASTABLE_AS_BRAIN, - "SPELL_CASTABLE_WHILE_PHASED" = SPELL_CASTABLE_WHILE_PHASED, "SPELL_CASTABLE_WITHOUT_INVOCATION" = SPELL_CASTABLE_WITHOUT_INVOCATION, "SPELL_REQUIRES_HUMAN" = SPELL_REQUIRES_HUMAN, "SPELL_REQUIRES_MIME_VOW" = SPELL_REQUIRES_MIME_VOW, diff --git a/code/__DEFINES/mapping.dm b/code/__DEFINES/mapping.dm new file mode 100644 index 0000000000000..3c08679e2a4bf --- /dev/null +++ b/code/__DEFINES/mapping.dm @@ -0,0 +1,6 @@ +// Defines for SSmapping's multiz_levels +/// TRUE if we're ok with going up +#define Z_LEVEL_UP 1 +/// TRUE if we're ok with going down +#define Z_LEVEL_DOWN 2 +#define LARGEST_Z_LEVEL_INDEX Z_LEVEL_DOWN diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index e4c559213ea7b..ca09aeb402c1c 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -104,7 +104,7 @@ Always compile, always use that verb, and always make sure that it works for wha // number - default gravity if there's no gravity generators or area overrides present #define ZTRAIT_GRAVITY "Gravity" -// numeric offsets - e.g. {"Down": -1} means that chasms will fall to z - 1 rather than oblivion +// Whether this z level is linked up/down. Bool. #define ZTRAIT_UP "Up" #define ZTRAIT_DOWN "Down" diff --git a/code/__DEFINES/materials.dm b/code/__DEFINES/materials.dm index 6ffcc733928aa..5fc5cc08ea205 100644 --- a/code/__DEFINES/materials.dm +++ b/code/__DEFINES/materials.dm @@ -15,6 +15,9 @@ /// Used to make a material type able to be instantiated on demand after roundstart. #define MATERIAL_INIT_BESPOKE (1<<1) +/// Makes sure only integer values are used when consuming, removing & checking for mats +#define OPTIMAL_COST(cost)(max(1, round(cost))) + //Material Container Flags. ///If the container shows the amount of contained materials on examine. #define MATCONTAINER_EXAMINE (1<<0) @@ -61,6 +64,10 @@ #define MATERIAL_SOURCE(mat) "[mat.name]_material" +///Special return values of [/datum/component/material_container/insert_item] +#define MATERIAL_INSERT_ITEM_NO_MATS -1 +#define MATERIAL_INSERT_ITEM_NO_SPACE -2 +#define MATERIAL_INSERT_ITEM_FAILURE 0 // Slowdown values. @@ -68,3 +75,13 @@ #define MATERIAL_SLOWDOWN_PLASTEEL (0.05) /// The slowdown value of one [SHEET_MATERIAL_AMOUNT] of alien alloy. #define MATERIAL_SLOWDOWN_ALIEN_ALLOY (0.1) + +//Stock market stock values. +/// How much quantity of a material stock exists for common materials like iron & glass. +#define MATERIAL_QUANTITY_COMMON 25000 +/// How much quantity of a material stock exists for uncommon materials like silver & titanium. +#define MATERIAL_QUANTITY_UNCOMMON 10000 +/// How much quantity of a material stock exists for rare materials like gold, uranium, & diamond. +#define MATERIAL_QUANTITY_RARE 2500 +/// How much quantity of a material stock exists for exotic materials like diamond & bluespace crystals. +#define MATERIAL_QUANTITY_EXOTIC 500 diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index cbcea4e537420..1260e3daf03c1 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -228,7 +228,7 @@ #define EXP_DISTRIBUTION(desired_mean) ( -(1/(1/desired_mean)) * log(rand(1, 1000) * 0.001) ) #define LORENTZ_DISTRIBUTION(x, s) ( s*tan(TODEGREES(PI*(rand()-0.5))) + x ) -#define LORENTZ_CUMULATIVE_DISTRIBUTION(x, y, s) ( (1/PI)*TORADIANS(arctan((x-y)/s)) + 1/2 ) +#define LORENTZ_CUMULATIVE_DISTRIBUTION(x, y, s) ( (1/PI)*TORADIANS(arctan((x-(y))/s)) + 1/2 ) #define RULE_OF_THREE(a, b, x) ((a*x)/b) @@ -240,6 +240,9 @@ #define SPT_PROB(prob_per_second_percent, seconds_per_tick) (prob(100*SPT_PROB_RATE((prob_per_second_percent)/100, (seconds_per_tick)))) // ) +// This value per these many units. Very unnecessary but helpful for readability (For example wanting 30 units of synthflesh to heal 50 damage - VALUE_PER(50, 30)) +#define VALUE_PER(value, per) (value / per) + #define GET_TRUE_DIST(a, b) (a == null || b == null) ? -1 : max(abs(a.x -b.x), abs(a.y-b.y), abs(a.z-b.z)) //We used to use linear regression to approximate the answer, but Mloc realized this was actually faster. @@ -248,3 +251,9 @@ /// The number of cells in a taxicab circle (rasterized diamond) of radius X. #define DIAMOND_AREA(X) (1 + 2*(X)*((X)+1)) + +/// Returns a random decimal between x and y. +#define RANDOM_DECIMAL(x, y) LERP((x), (y), rand()) + +#define SI_COEFFICIENT "coefficient" +#define SI_UNIT "unit" diff --git a/code/__DEFINES/mecha.dm b/code/__DEFINES/mecha.dm index 538373959dddd..db65b0b6ee8d3 100644 --- a/code/__DEFINES/mecha.dm +++ b/code/__DEFINES/mecha.dm @@ -1,11 +1,11 @@ #define MECHA_INT_FIRE (1<<0) #define MECHA_INT_TEMP_CONTROL (1<<1) #define MECHA_INT_SHORT_CIRCUIT (1<<2) -#define MECHA_INT_TANK_BREACH (1<<3) +#define MECHA_CABIN_AIR_BREACH (1<<3) #define MECHA_INT_CONTROL_LOST (1<<4) -#define ADDING_ACCESS_POSSIBLE (1<<0) -#define ADDING_MAINT_ACCESS_POSSIBLE (1<<1) +#define PANEL_OPEN (1<<0) +#define ID_LOCK_ON (1<<1) #define CANSTRAFE (1<<2) #define LIGHTS_ON (1<<3) #define SILICON_PILOT (1<<4) @@ -34,11 +34,6 @@ #define MECHA_POWER "mecha_power" #define MECHA_ARMOR "mecha_armor" -#define MECHA_LOCKED 0 -#define MECHA_SECURE_BOLTS 1 -#define MECHA_LOOSE_BOLTS 2 -#define MECHA_OPEN_HATCH 3 - // Some mechs must (at least for now) use snowflake handling of their UI elements, these defines are for that // when changing MUST update the same-named tsx file constants #define MECHA_SNOWFLAKE_ID_SLEEPER "sleeper_snowflake" @@ -46,6 +41,11 @@ #define MECHA_SNOWFLAKE_ID_MODE "mode_snowflake" #define MECHA_SNOWFLAKE_ID_EXTINGUISHER "extinguisher_snowflake" #define MECHA_SNOWFLAKE_ID_EJECTOR "ejector_snowflake" +#define MECHA_SNOWFLAKE_ID_OREBOX_MANAGER "orebox_manager_snowflake" +#define MECHA_SNOWFLAKE_ID_RADIO "radio_snowflake" +#define MECHA_SNOWFLAKE_ID_AIR_TANK "air_tank_snowflake" +#define MECHA_SNOWFLAKE_ID_WEAPON_BALLISTIC "ballistic_weapon_snowflake" +#define MECHA_SNOWFLAKE_ID_GENERATOR "generator_snowflake" #define MECHA_AMMO_INCENDIARY "Incendiary bullet" #define MECHA_AMMO_BUCKSHOT "Buckshot shell" @@ -54,3 +54,6 @@ #define MECHA_AMMO_MISSILE_PEP "PEP missile" #define MECHA_AMMO_FLASHBANG "Flashbang" #define MECHA_AMMO_CLUSTERBANG "Clusterbang" +#define MECHA_AMMO_PUNCHING_GLOVE "Punching glove" +#define MECHA_AMMO_BANANA_PEEL "Banana peel" +#define MECHA_AMMO_MOUSETRAP "Mousetrap" diff --git a/code/__DEFINES/mobfactions.dm b/code/__DEFINES/mobfactions.dm index 82146abc97020..a7dcbee90e801 100644 --- a/code/__DEFINES/mobfactions.dm +++ b/code/__DEFINES/mobfactions.dm @@ -43,6 +43,8 @@ #define FACTION_MIMIC "mimic" /// Beasts found on the various mining environments #define FACTION_MINING "mining" +/// Watchers don't like any creatures other than each other +#define FACTION_WATCHER "watcher" /// Monkeys and gorillas #define FACTION_MONKEY "monkey" /// Mushrooms and mushroompeople diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index bf12f84ff72a7..1063a5c2a18e5 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -6,7 +6,7 @@ #define PLAYER_NOT_READY 0 #define PLAYER_READY_TO_PLAY 1 -//movement intent defines for the m_intent var +//movement intent defines for the move_intent var #define MOVE_INTENT_WALK "walk" #define MOVE_INTENT_RUN "run" @@ -42,29 +42,36 @@ #define VENTCRAWLER_ALWAYS 2 //Mob bio-types flags +///The mob is organic, can heal from medical sutures. #define MOB_ORGANIC (1 << 0) +///The mob is of a rocky make, most likely a golem. Iron within, iron without! #define MOB_MINERAL (1 << 1) +///The mob is a synthetic lifeform, like station borgs. #define MOB_ROBOTIC (1 << 2) +///The mob is an shambling undead corpse. Or a halloween species. Pick your poison. #define MOB_UNDEAD (1 << 3) +///The mob is a human-sized human-like human-creature. #define MOB_HUMANOID (1 << 4) +///The mob is a bug/insect/arachnid/some other kind of scuttly thing. #define MOB_BUG (1 << 5) +///The mob is a wild animal. Domestication may apply. #define MOB_BEAST (1 << 6) -#define MOB_EPIC (1 << 7) //megafauna +///The mob is some kind of a creature that should be exempt from certain **fun** interactions for balance reasons, i.e. megafauna or a headslug. +#define MOB_SPECIAL (1 << 7) +///The mob is some kind of a scaly reptile creature #define MOB_REPTILE (1 << 8) +///The mob is a spooky phantasm or an evil ghast of such nature. #define MOB_SPIRIT (1 << 9) +///The mob is a plant-based species, benefitting from light but suffering from darkness and plantkillers. #define MOB_PLANT (1 << 10) +///The mob is a goopy creature, probably coming from xenobiology. +#define MOB_SLIME (1 << 11) //Lung respiration type flags #define RESPIRATION_OXYGEN (1 << 0) #define RESPIRATION_N2 (1 << 1) #define RESPIRATION_PLASMA (1 << 2) - -//Organ defines for carbon mobs -#define ORGAN_ORGANIC 1 -#define ORGAN_ROBOTIC 2 -#define ORGAN_MINERAL 3 // Used for the plasmaman liver - -#define DEFAULT_BODYPART_ICON_ORGANIC 'icons/mob/species/human/bodyparts_greyscale.dmi' +#define DEFAULT_BODYPART_ICON_ORGANIC 'icons/mob/human/bodyparts_greyscale.dmi' #define DEFAULT_BODYPART_ICON_ROBOTIC 'icons/mob/augmentation/augments.dmi' #define MONKEY_BODYPART "monkey" @@ -78,10 +85,10 @@ #define BODYTYPE_ROBOTIC (1<<1) ///The limb fits the human mold. This is not meant to be literal, if the sprite "fits" on a human, it is "humanoid", regardless of origin. #define BODYTYPE_HUMANOID (1<<2) -///The limb is digitigrade. -#define BODYTYPE_DIGITIGRADE (1<<3) ///The limb fits the monkey mold. -#define BODYTYPE_MONKEY (1<<4) +#define BODYTYPE_MONKEY (1<<3) +///The limb is digitigrade. +#define BODYTYPE_DIGITIGRADE (1<<4) ///The limb is snouted. #define BODYTYPE_SNOUTED (1<<5) ///A placeholder bodytype for xeno larva, so their limbs cannot be attached to anything. @@ -99,6 +106,7 @@ #define SPECIES_ANDROID "android" #define SPECIES_DULLAHAN "dullahan" #define SPECIES_ETHEREAL "ethereal" +#define SPECIES_ETHEREAL_LUSTROUS "lustrous" #define SPECIES_FELINE "felinid" #define SPECIES_FLYPERSON "fly" #define SPECIES_HUMAN "human" @@ -368,6 +376,8 @@ #define GALOSHES_DONT_HELP (1<<3) /// Slip works even if you're already on the ground #define SLIP_WHEN_CRAWLING (1<<4) +/// the mob won't slip if the turf has the TRAIT_TURF_IGNORE_SLIPPERY trait. +#define SLIPPERY_TURF (1<<5) #define MAX_CHICKENS 50 @@ -383,6 +393,14 @@ #define SHOCK_NOSTUN (1 << 3) /// No default message is sent from the shock #define SHOCK_SUPPRESS_MESSAGE (1 << 4) +/// No skeleton animation if a human was shocked +#define SHOCK_NO_HUMAN_ANIM (1 << 5) +/// Ignores TRAIT_STUNIMMUNE +#define SHOCK_IGNORE_IMMUNITY (1 << 6) +/// Prevents the immediate stun, instead only gives the delay +#define SHOCK_DELAY_STUN (1 << 7) +/// Makes the paralyze into a knockdown +#define SHOCK_KNOCKDOWN (1 << 8) #define INCORPOREAL_MOVE_BASIC 1 /// normal movement, see: [/mob/living/var/incorporeal_move] #define INCORPOREAL_MOVE_SHADOW 2 /// leaves a trail of shadows @@ -461,9 +479,6 @@ #define AI_CAMERA_LUMINOSITY 5 #define AI_VOX // Comment out if you don't want VOX to be enabled and have players download the voice sounds. -// /obj/item/bodypart on_mob_life() retval flag -#define BODYPART_LIFE_UPDATE_HEALTH (1<<0) - #define MAX_REVIVE_FIRE_DAMAGE 180 #define MAX_REVIVE_BRUTE_DAMAGE 180 @@ -485,20 +500,23 @@ #define HUMAN_CARRY_SLOWDOWN 0.35 //Flags that control what things can spawn species (whitelist) -//Badmin magic mirror -#define MIRROR_BADMIN (1<<0) +// These flags unlock the Lepton Violet shuttle, hardcoded in wabbajack() //Standard magic mirror (wizard) #define MIRROR_MAGIC (1<<1) //Pride ruin mirror #define MIRROR_PRIDE (1<<2) //Race swap wizard event #define RACE_SWAP (1<<3) +//Wabbacjack staff projectiles +#define WABBAJACK (1<<4) + +// These flags do NOT unlock the Lepton Violet shuttle, hardcoded in wabbajack() - use for things like xenobio, admins, etc. +//Badmin magic mirror +#define MIRROR_BADMIN (1<<5) //ERT spawn template (avoid races that don't function without correct gear) -#define ERT_SPAWN (1<<4) +#define ERT_SPAWN (1<<6) //xenobio black crossbreed -#define SLIME_EXTRACT (1<<5) -//Wabbacjack staff projectiles -#define WABBAJACK (1<<6) +#define SLIME_EXTRACT (1<<7) // Randomization keys for calling wabbajack with. // Note the contents of these keys are important, as they're displayed to the player @@ -573,10 +591,14 @@ ///Squash flags. For squashable element -///Whether or not the squashing requires the squashed mob to be lying down +/// Squashing will not occur if the mob is not lying down (bodyposition is LYING_DOWN) #define SQUASHED_SHOULD_BE_DOWN (1<<0) -///Whether or not to gib when the squashed mob is moved over -#define SQUASHED_SHOULD_BE_GIBBED (1<<0) +/// If present, outright gibs the squashed mob instead of just dealing damage +#define SQUASHED_SHOULD_BE_GIBBED (1<<1) +/// If squashing always passes if the mob is dead +#define SQUASHED_ALWAYS_IF_DEAD (1<<2) +/// Don't squash our mob if its not located in a turf +#define SQUASHED_DONT_SQUASH_IN_CONTENTS (1<<3) /* * Defines for "AI emotions", allowing the AI to expression emotions @@ -600,6 +622,26 @@ #define AI_EMOTION_BLUE_GLOW "Blue Glow" #define AI_EMOTION_RED_GLOW "Red Glow" +///Defines for AI hologram preferences +#define AI_HOLOGRAM_BEAR "Bear" +#define AI_HOLOGRAM_CARP "Carp" +#define AI_HOLOGRAM_CAT "Cat" +#define AI_HOLOGRAM_CAT_2 "Cat Alternate" +#define AI_HOLOGRAM_CHICKEN "Chicken" +#define AI_HOLOGRAM_CORGI "Corgi" +#define AI_HOLOGRAM_COW "Cow" +#define AI_HOLOGRAM_CRAB "Crab" +#define AI_HOLOGRAM_DEFAULT "Default" +#define AI_HOLOGRAM_FACE "Floating Face" +#define AI_HOLOGRAM_FOX "Fox" +#define AI_HOLOGRAM_GOAT "Goat" +#define AI_HOLOGRAM_NARSIE "Narsie" +#define AI_HOLOGRAM_PARROT "Parrot" +#define AI_HOLOGRAM_PUG "Pug" +#define AI_HOLOGRAM_RATVAR "Ratvar" +#define AI_HOLOGRAM_SPIDER "Spider" +#define AI_HOLOGRAM_XENO "Xeno Queen" + /// Icon state to use for ai displays that just turns them off #define AI_DISPLAY_DONT_GLOW "ai_off" /// Throw modes, defines whether or not to turn off throw mode after @@ -650,35 +692,37 @@ GLOBAL_LIST_INIT(human_heights_to_offsets, list( /// Total number of layers for mob overlays /// KEEP THIS UP-TO-DATE OR SHIT WILL BREAK /// Also consider updating layers_to_offset -#define TOTAL_LAYERS 33 +#define TOTAL_LAYERS 34 /// Mutations layer - Tk headglows, cold resistance glow, etc -#define MUTATIONS_LAYER 33 +#define MUTATIONS_LAYER 34 /// Mutantrace features (tail when looking south) that must appear behind the body parts -#define BODY_BEHIND_LAYER 32 +#define BODY_BEHIND_LAYER 33 /// Layer for bodyparts that should appear behind every other bodypart - Mostly, legs when facing WEST or EAST -#define BODYPARTS_LOW_LAYER 31 +#define BODYPARTS_LOW_LAYER 32 /// Layer for most bodyparts, appears above BODYPARTS_LOW_LAYER and below BODYPARTS_HIGH_LAYER -#define BODYPARTS_LAYER 30 +#define BODYPARTS_LAYER 31 /// Mutantrace features (snout, body markings) that must appear above the body parts -#define BODY_ADJ_LAYER 29 +#define BODY_ADJ_LAYER 30 /// Underwear, undershirts, socks, eyes, lips(makeup) -#define BODY_LAYER 28 +#define BODY_LAYER 29 /// Mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes) -#define FRONT_MUTATIONS_LAYER 27 +#define FRONT_MUTATIONS_LAYER 28 /// Damage indicators (cuts and burns) -#define DAMAGE_LAYER 26 +#define DAMAGE_LAYER 27 /// Jumpsuit clothing layer -#define UNIFORM_LAYER 25 +#define UNIFORM_LAYER 26 /// ID card layer -#define ID_LAYER 24 +#define ID_LAYER 25 /// ID card layer (might be deprecated) -#define ID_CARD_LAYER 23 +#define ID_CARD_LAYER 24 /// Layer for bodyparts that should appear above every other bodypart - Currently only used for hands -#define BODYPARTS_HIGH_LAYER 22 +#define BODYPARTS_HIGH_LAYER 23 /// Gloves layer -#define GLOVES_LAYER 21 +#define GLOVES_LAYER 22 /// Shoes layer -#define SHOES_LAYER 20 +#define SHOES_LAYER 21 +/// Layer for masks that are worn below ears and eyes (like Balaclavas) (layers below hair, use flagsinv=HIDEHAIR as needed) +#define LOW_FACEMASK_LAYER 20 /// Ears layer (Spessmen have ears? Wow) #define EARS_LAYER 19 /// Suit layer (armor, coats, etc.) @@ -745,6 +789,7 @@ GLOBAL_LIST_INIT(layers_to_offset, list( "[ID_CARD_LAYER]" = UPPER_BODY, // unused "[ID_LAYER]" = UPPER_BODY, "[FACEMASK_LAYER]" = UPPER_BODY, + "[LOW_FACEMASK_LAYER]" = UPPER_BODY, // These two are cached, and have their appearance shared(?), so it's safer to just not touch it "[MUTATIONS_LAYER]" = NO_MODIFY, "[FRONT_MUTATIONS_LAYER]" = NO_MODIFY, @@ -816,10 +861,26 @@ GLOBAL_LIST_INIT(layers_to_offset, list( /// Get the client from the var #define CLIENT_FROM_VAR(I) (ismob(I) ? I:client : (istype(I, /client) ? I : (istype(I, /datum/mind) ? I:current?:client : null))) -/// The mob will vomit a green color -#define VOMIT_TOXIC 1 -/// The mob will vomit a purple color -#define VOMIT_PURPLE 2 +// Various flags for carbon mob vomiting +/// Flag which makes a message send about the vomiting. +#define MOB_VOMIT_MESSAGE (1<<0) +/// Flag which makes the mob get stunned upon vomiting. +#define MOB_VOMIT_STUN (1<<1) +/// Flag which makes the mob incur damage upon vomiting. +#define MOB_VOMIT_HARM (1<<2) +/// Flag which makes the mob vomit blood +#define MOB_VOMIT_BLOOD (1<<3) +/// Flag which will cause the mob to fall over when vomiting. +#define MOB_VOMIT_KNOCKDOWN (1<<4) +/// Flag which will make the proc skip certain checks when it comes to forcing a vomit. +#define MOB_VOMIT_FORCE (1<<5) + +/// The default. Gives you might typically expect to happen when you vomit. +#define VOMIT_CATEGORY_DEFAULT (MOB_VOMIT_MESSAGE | MOB_VOMIT_HARM | MOB_VOMIT_STUN) +/// The vomit you've all come to know and love, but with a little extra "spice" (blood) +#define VOMIT_CATEGORY_BLOOD (VOMIT_CATEGORY_DEFAULT | MOB_VOMIT_BLOOD) +/// Another vomit variant that causes you to get knocked down instead of just only getting a stun. Standard otherwise. +#define VOMIT_CATEGORY_KNOCKDOWN (VOMIT_CATEGORY_DEFAULT | MOB_VOMIT_KNOCKDOWN) /// Possible value of [/atom/movable/buckle_lying]. If set to a different (positive-or-zero) value than this, the buckling thing will force a lying angle on the buckled. #define NO_BUCKLE_LYING -1 @@ -912,3 +973,6 @@ GLOBAL_LIST_INIT(layers_to_offset, list( #define NO_OBSERVED_ACTIONS (1<<1) /// Flag which stops you from attacking while observed #define NO_OBSERVED_ATTACKS (1<<2) + +/// Types of bullets that mining mobs take full damage from +#define MINING_MOB_PROJECTILE_VULNERABILITY list(BRUTE) diff --git a/code/__DEFINES/mod.dm b/code/__DEFINES/mod.dm index e98230a8f3bea..e0b7d6ff4a399 100644 --- a/code/__DEFINES/mod.dm +++ b/code/__DEFINES/mod.dm @@ -43,5 +43,13 @@ #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" + /// Global list of all /datum/mod_theme GLOBAL_LIST_INIT(mod_themes, setup_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/mood.dm b/code/__DEFINES/mood.dm new file mode 100644 index 0000000000000..161f253b04c7f --- /dev/null +++ b/code/__DEFINES/mood.dm @@ -0,0 +1 @@ +#define MOOD_CATEGORY_LEGION_CORE "regenerative core" diff --git a/code/__DEFINES/movement.dm b/code/__DEFINES/movement.dm index 1c2f1b4fba1ff..f71871f964a2e 100644 --- a/code/__DEFINES/movement.dm +++ b/code/__DEFINES/movement.dm @@ -43,7 +43,7 @@ GLOBAL_VAR_INIT(glide_size_multiplier, 1.0) * 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) +#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 diff --git a/code/__DEFINES/movespeed_modification.dm b/code/__DEFINES/movespeed_modification.dm index c4300d966068c..23c600aae7070 100644 --- a/code/__DEFINES/movespeed_modification.dm +++ b/code/__DEFINES/movespeed_modification.dm @@ -11,3 +11,5 @@ #define MOVESPEED_ID_MOB_GRAB_STATE "mob_grab_state" #define MOVESPEED_ID_MOB_WALK_RUN "mob_walk_run" + +#define MOVESPEED_ID_MIDAS_BLIGHT "midas_blight_debuff" diff --git a/code/__DEFINES/multiz.dm b/code/__DEFINES/multiz.dm new file mode 100644 index 0000000000000..370eaa8ba4593 --- /dev/null +++ b/code/__DEFINES/multiz.dm @@ -0,0 +1,8 @@ +/// Attempt to get the turf below the provided one according to Z traits +#define GET_TURF_BELOW(turf) ( \ + (turf.turf_flags & RESERVATION_TURF) ? SSmapping.get_reservation_from_turf(turf)?.get_turf_below(turf) : \ + (!(turf) || !length(SSmapping.multiz_levels) || !SSmapping.multiz_levels[(turf).z][Z_LEVEL_DOWN]) ? null : get_step((turf), DOWN)) +/// Attempt to get the turf above the provided one according to Z traits +#define GET_TURF_ABOVE(turf) ( \ + (turf.turf_flags & RESERVATION_TURF) ? SSmapping.get_reservation_from_turf(turf)?.get_turf_above(turf) : \ + (!(turf) || !length(SSmapping.multiz_levels) || !SSmapping.multiz_levels[(turf).z][Z_LEVEL_UP]) ? null : get_step((turf), UP)) diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index c5ed6c7e964b3..660d05854fd32 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -31,6 +31,7 @@ #define IMMUTABLE_SLOW (1<<10) // When players should not be able to change the slowdown of the item (Speed potions, etc) #define IN_STORAGE (1<<11) //is this item in the storage item, such as backpack? used for tooltips #define SURGICAL_TOOL (1<<12) //Tool commonly used for surgery: won't attack targets in an active surgical operation on help intent (in case of mistakes) +#define CRUEL_IMPLEMENT (1<<13) //This object, when used for surgery, is a lot worse at the job if the target is alive rather than dead #define HAND_ITEM (1<<14) // If an item is just your hand (circled hand, slapper) and shouldn't block things like riding #define EXAMINE_SKIP (1<<15) // Makes the Examine proc not read out this item. #define XENOMORPH_HOLDABLE (1<<16) // A Xenomorph can hold this item. @@ -41,6 +42,8 @@ #define ITEM_HAS_CONTEXTUAL_SCREENTIPS (1 << 19) /// No blood overlay is allowed to appear on this item, and it cannot gain blood DNA forensics #define NO_BLOOD_ON_ITEM (1 << 20) +/// Whether this item should skip the /datum/component/fantasy applied on spawn on the RPG event. Used on things like stacks +#define SKIP_FANTASY_ON_SPAWN (1<<21) // Flags for the clothing_flags var on /obj/item/clothing @@ -74,8 +77,8 @@ #define LARGE_WORN_ICON (1<<12) /// 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) +/// prevents from placing on plasmaman helmet or modsuit hat holder +#define STACKABLE_HELMET_EXEMPT (1<<14) /// Prevents plasmamen from igniting when wearing this #define PLASMAMAN_PREVENT_IGNITION (1<<15) /// Usable as casting clothes by wizards (matters for suits, glasses and headwear) diff --git a/code/__DEFINES/pai.dm b/code/__DEFINES/pai.dm index f47524d32e26d..4015ee3bc504a 100644 --- a/code/__DEFINES/pai.dm +++ b/code/__DEFINES/pai.dm @@ -11,6 +11,13 @@ /// The amount of time between spamming for pAI candidates #define PAI_SPAM_TIME (40 SECONDS) +/// Maximum distance you can set the holoform leash +#define HOLOFORM_MAX_RANGE 9 +/// Minimum distance you can set the holoform leash +#define HOLOFORM_MIN_RANGE 3 +/// Default holoform leash distance +#define HOLOFORM_DEFAULT_RANGE HOLOFORM_MAX_RANGE + /// UI action to toggle huds #define PAI_TOGGLE_MEDICAL_HUD 0 #define PAI_TOGGLE_SECURITY_HUD 1 diff --git a/code/__DEFINES/paper.dm b/code/__DEFINES/paper.dm index cccb3f7b87140..feb41c0409cd3 100644 --- a/code/__DEFINES/paper.dm +++ b/code/__DEFINES/paper.dm @@ -13,3 +13,6 @@ #define MODE_WRITING 1 /// Should be able to stamp paper. #define MODE_STAMPING 2 + +#define BARCODE_SCANNER_CHECKIN "check_in" +#define BARCODE_SCANNER_INVENTORY "inventory" diff --git a/code/__DEFINES/pipe_construction.dm b/code/__DEFINES/pipe_construction.dm index 852870accf8b6..540cadabc47a2 100644 --- a/code/__DEFINES/pipe_construction.dm +++ b/code/__DEFINES/pipe_construction.dm @@ -6,6 +6,7 @@ #define PIPE_UNARY 4 //4 directions: N, S, E, W #define PIPE_ONEDIR 5 //1 direction: N/S/E/W #define PIPE_UNARY_FLIPPABLE 6 //8 directions: N/S/E/W/N-flipped/S-flipped/E-flipped/W-flipped +#define PIPE_ONEDIR_FLIPPABLE 7 //2 direction: N/S/E/W, N-flipped/S-flipped/E-flipped/W-flipped //Disposal pipe relative connection directions #define DISP_DIR_BASE 0 diff --git a/code/__DEFINES/power.dm b/code/__DEFINES/power.dm index b07ba5e9b5826..804647b2eaf28 100644 --- a/code/__DEFINES/power.dm +++ b/code/__DEFINES/power.dm @@ -1,8 +1,10 @@ +#define CABLE_LAYER_ALL (~0) #define CABLE_LAYER_1 (1<<0) + #define CABLE_LAYER_1_NAME "Red Power Line" #define CABLE_LAYER_2 (1<<1) + #define CABLE_LAYER_2_NAME "Yellow Power Line" #define CABLE_LAYER_3 (1<<2) - -#define MACHINERY_LAYER_1 1 + #define CABLE_LAYER_3_NAME "Blue Power Line" #define SOLAR_TRACK_OFF 0 #define SOLAR_TRACK_TIMED 1 @@ -14,3 +16,18 @@ #define JOULES * 0.002 GLOBAL_VAR_INIT(CHARGELEVEL, 0.001) // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second) + +// Converts cable layer to its human readable name +GLOBAL_LIST_INIT(cable_layer_to_name, list( + "[CABLE_LAYER_1]" = CABLE_LAYER_1_NAME, + "[CABLE_LAYER_2]" = CABLE_LAYER_2_NAME, + "[CABLE_LAYER_3]" = CABLE_LAYER_3_NAME +)) + +// Converts cable color name to its layer +GLOBAL_LIST_INIT(cable_name_to_layer, list( + CABLE_LAYER_1_NAME = CABLE_LAYER_1, + CABLE_LAYER_2_NAME = CABLE_LAYER_2, + CABLE_LAYER_3_NAME = CABLE_LAYER_3 +)) + diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index e0947d2d420a8..7f2ddaa334b56 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -136,3 +136,6 @@ #define PLAYTIME_HARDCORE_RANDOM 120 // 2 hours /// The time needed to unlock the gamer cloak in preferences #define PLAYTIME_VETERAN 300000 // 5,000 hours + +/// The key used for sprite accessories that should never actually be applied to the player. +#define SPRITE_ACCESSORY_NONE "None" diff --git a/code/__DEFINES/projectiles.dm b/code/__DEFINES/projectiles.dm index c4ff028309e9a..3bc745756aae3 100644 --- a/code/__DEFINES/projectiles.dm +++ b/code/__DEFINES/projectiles.dm @@ -11,7 +11,7 @@ // Caliber defines: (current count stands at 24) /// The caliber used by the [L6 SAW][/obj/item/gun/ballistic/automatic/l6_saw]. -#define CALIBER_712X82MM "mm71282" +#define CALIBER_A7MM "a7mm" /// 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. @@ -22,8 +22,6 @@ #define CALIBER_357 ".357" /// The caliber used by the detective's revolver. #define CALIBER_38 ".38" -/// The caliber used by the chaplain's revolver. -#define CALIBER_77 ".77" /// The caliber used by the C-20r SMG, the tommygun, and the M1911 pistol. #define CALIBER_45 ".45" /// The caliber used by sniper rifles. @@ -35,9 +33,9 @@ /// The caliber used by [one revolver variant][/obj/item/gun/ballistic/revolver/nagant]. #define CALIBER_N762 "n762" /// The caliber used by the the M-90gl Carbine, and NT-ARG 'Boarder'. -#define CALIBER_A556 "a556" +#define CALIBER_A223 "a223" /// The caliber used by bolt action rifles. -#define CALIBER_A762 "a762" +#define CALIBER_STRILKA310 ".310_strilka" /// The caliber used by shotguns. #define CALIBER_SHOTGUN "shotgun" /// The caliber used by grenade launchers. @@ -62,6 +60,9 @@ /// For gunpoints, how many tiles around the target the shooter can roam without losing their shot #define GUNPOINT_SHOOTER_STRAY_RANGE 2 +/// A spark will be generated for each THIS amount of damage dealt to a robotic limb by a projectile. +#define PROJECTILE_DAMAGE_PER_ROBOTIC_SPARK 20 + //Designed for things that need precision trajectories like projectiles. //Don't use this for anything that you don't absolutely have to use this with (like projectiles!) because it isn't worth using a datum unless you need accuracy down to decimal places in pixels. diff --git a/code/__DEFINES/qdel.dm b/code/__DEFINES/qdel.dm index 69cec5262a212..419b0c1176eeb 100644 --- a/code/__DEFINES/qdel.dm +++ b/code/__DEFINES/qdel.dm @@ -54,7 +54,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 index 290fed93c9578..2e48daa4a51ac 100644 --- a/code/__DEFINES/quirks.dm +++ b/code/__DEFINES/quirks.dm @@ -12,3 +12,5 @@ #define QUIRK_CHANGES_APPEARANCE (1<<2) /// The only thing this quirk effects is mood so it should be disabled if mood is #define QUIRK_MOODLET_BASED (1<<3) +/// This quirk shouldn't be shown by health analyzers and hud, perhaps as considering it medical condition is a far stretch. +#define QUIRK_HIDE_FROM_SCAN (1<<4) diff --git a/code/__DEFINES/radiation.dm b/code/__DEFINES/radiation.dm index bb345312ce5c6..0d44b072a0964 100644 --- a/code/__DEFINES/radiation.dm +++ b/code/__DEFINES/radiation.dm @@ -42,6 +42,8 @@ Ask Mothblocks if they're around /// The minimum exposure time before uranium structures can irradiate #define URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME (3 SECONDS) +/// The minimum exposure time before the radioactive nebula can irradiate +#define NEBULA_RADIATION_MINIMUM_EXPOSURE_TIME (6 SECONDS) /// Return values of [proc/get_perceived_radiation_danger] // If you change these, update /datum/looping_sound/geiger as well. @@ -52,3 +54,13 @@ Ask Mothblocks if they're around /// The time before geiger counters reset back to normal without any radiation pulses #define TIME_WITHOUT_RADIATION_BEFORE_RESET (5 SECONDS) + +// Radiation exposure params + +// For the radioactive nebula outside +/// Base chance the nebula has of applying irradiation +#define RADIATION_EXPOSURE_NEBULA_BASE_CHANCE 20 +/// The chance we add to the base chance every time we fail to irradiate +#define RADIATION_EXPOSURE_NEBULA_CHANCE_INCREMENT 10 +/// Time it takes for the next irradiation check +#define RADIATION_EXPOSURE_NEBULA_CHECK_INTERVAL 5 SECONDS diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm index f4967eb9ce3a4..686c42e07d075 100644 --- a/code/__DEFINES/radio.dm +++ b/code/__DEFINES/radio.dm @@ -86,6 +86,7 @@ #define FREQ_ELECTROPACK 1449 #define FREQ_MAGNETS 1449 #define FREQ_LOCATOR_IMPLANT 1451 +#define FREQ_RADIO_NAV_BEACON 1455 #define FREQ_SIGNALER 1457 // the default for new signalers #define FREQ_COMMON 1459 // Common comms frequency, dark green diff --git a/code/__DEFINES/radioactive_nebula.dm b/code/__DEFINES/radioactive_nebula.dm new file mode 100644 index 0000000000000..68849ca1bc2f6 --- /dev/null +++ b/code/__DEFINES/radioactive_nebula.dm @@ -0,0 +1,2 @@ +/// Name of the glow we use for the radioation effect outside +#define GLOW_NEBULA "glow_nebula" diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index 7bee2b1040b07..3a32aec2fba0d 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -34,6 +34,9 @@ /// Used for direct injection of reagents. #define INJECT (1<<4) +/// When returned by on_mob_life(), on_mob_dead(), overdose_start() or overdose_processed(), will cause the mob to updatehealth() afterwards +#define UPDATE_MOB_HEALTH 1 + // How long do mime drinks silence the drinker (if they are a mime)? #define MIMEDRINK_SILENCE_DURATION (1 MINUTES) ///Health threshold for synthflesh and rezadone to unhusk someone @@ -115,6 +118,8 @@ #define REAGENT_NO_RANDOM_RECIPE (1<<7) ///Does this reagent clean things? #define REAGENT_CLEANS (1<<8) +///Does this reagent affect wounds? Used to check if some procs should be ran. +#define REAGENT_AFFECTS_WOUNDS (1<<9) //Chemical reaction flags, for determining reaction specialties ///Convert into impure/pure on reaction completion diff --git a/code/__DEFINES/research.dm b/code/__DEFINES/research.dm index 34794b5b2559a..52ee2c87f4ed3 100644 --- a/code/__DEFINES/research.dm +++ b/code/__DEFINES/research.dm @@ -71,3 +71,17 @@ #define SCIENTIFIC_COOPERATION_PURCHASE_MULTIPLIER 0.01 /// How much money is one point of gain worth. #define SCIPAPER_GAIN_TO_MONEY 125 + +///Connects the 'server_var' to a valid research server on your Z level. +///Used for machines in LateInitialize, to ensure that RND servers are loaded first. +#define CONNECT_TO_RND_SERVER_ROUNDSTART(server_var, holder) do { \ + var/list/found_servers = SSresearch.get_available_servers(get_turf(holder)); \ + var/obj/machinery/rnd/server/selected_server = length(found_servers) ? found_servers[1] : null; \ + if (selected_server) { \ + server_var = selected_server.stored_research; \ + }; \ + else { \ + var/datum/techweb/station_fallback_web = locate(/datum/techweb/science) in SSresearch.techwebs; \ + server_var = station_fallback_web; \ + }; \ +} while (FALSE) diff --git a/code/__DEFINES/research/slimes.dm b/code/__DEFINES/research/slimes.dm new file mode 100644 index 0000000000000..64a85afc217f9 --- /dev/null +++ b/code/__DEFINES/research/slimes.dm @@ -0,0 +1,27 @@ +// Just slimin' here. +// Warning: These defines are used for slime cores and their icon states, so if you +// touch these names, remember to update icons/mob/simple/slimes.dmi and the respective +// slime core paths too! + +#define SLIME_TYPE_ADAMANTINE "adamantine" +#define SLIME_TYPE_BLACK "black" +#define SLIME_TYPE_BLUE "blue" +#define SLIME_TYPE_BLUESPACE "bluespace" +#define SLIME_TYPE_CERULEAN "cerulean" +#define SLIME_TYPE_DARK_BLUE "dark blue" +#define SLIME_TYPE_DARK_PURPLE "dark purple" +#define SLIME_TYPE_GOLD "gold" +#define SLIME_TYPE_GREEN "green" +#define SLIME_TYPE_GREY "grey" +#define SLIME_TYPE_LIGHT_PINK "light pink" +#define SLIME_TYPE_METAL "metal" +#define SLIME_TYPE_OIL "oil" +#define SLIME_TYPE_ORANGE "orange" +#define SLIME_TYPE_PINK "pink" +#define SLIME_TYPE_PURPLE "purple" +#define SLIME_TYPE_PYRITE "pyrite" +#define SLIME_TYPE_RAINBOW "rainbow" +#define SLIME_TYPE_RED "red" +#define SLIME_TYPE_SEPIA "sepia" +#define SLIME_TYPE_SILVER "silver" +#define SLIME_TYPE_YELLOW "yellow" diff --git a/code/__DEFINES/revolution.dm b/code/__DEFINES/revolution.dm new file mode 100644 index 0000000000000..8d930bf7f0fe3 --- /dev/null +++ b/code/__DEFINES/revolution.dm @@ -0,0 +1,14 @@ +/// Rev deconverted because the station won. +#define DECONVERTER_STATION_WIN "gamemode_station_win" + +/// Rev deconverted via borging. +#define DECONVERTER_BORGED "rev_removed_by_borging" + +/// How often to check for promoting up new revheads. +#define HEAD_UPDATE_PERIOD 300 + +/// Revs won the revolution. +#define REVOLUTION_VICTORY 1 + +/// The heads of staff beat the revolution. +#define STATION_VICTORY 2 diff --git a/code/__DEFINES/robots.dm b/code/__DEFINES/robots.dm index 5f7f77065606c..eb0bd1d793137 100644 --- a/code/__DEFINES/robots.dm +++ b/code/__DEFINES/robots.dm @@ -1,4 +1,4 @@ -/** AI defines */ +// AI defines #define DEFAULT_AI_LAWID "default" #define LAW_ZEROTH "zeroth" @@ -27,7 +27,10 @@ ///Malfunctioning AI hijacking mecha #define AI_MECH_HACK 3 -/** Cyborg defines */ +// Cyborg defines + +/// If an item does this or more throwing damage it will slow a borg down on hit +#define CYBORG_THROW_SLOWDOWN_THRESHOLD 10 /// Special value to reset cyborg's lamp_cooldown #define BORG_LAMP_CD_RESET -1 @@ -86,8 +89,10 @@ #define BOT_MODE_AUTOPATROL (1<<1) ///The Bot is currently allowed to be remote controlled by Silicon. #define BOT_MODE_REMOTE_ENABLED (1<<2) -///The Bot is allowed to have a pAI placed in control of it. -#define BOT_MODE_PAI_CONTROLLABLE (1<<3) +///The Bot is allowed to have a ghost placed in control of it. +#define BOT_MODE_CAN_BE_SAPIENT (1<<3) +///The Bot is allowed to be possessed if it is present on mapload. +#define BOT_MODE_ROUNDSTART_POSSESSION (1<<4) //Bot cover defines indicating the Bot's status ///The Bot's cover is open and can be modified/emagged by anyone. @@ -223,3 +228,75 @@ DEFINE_BITFIELD(janitor_mode_flags, list( #define NAVBEACON_PATROL_NEXT "next_patrol" #define NAVBEACON_DELIVERY_MODE "delivery" #define NAVBEACON_DELIVERY_DIRECTION "dir" + +// Defines for lines that bots can speak which also have corresponding voice lines + +#define ED209_VOICED_DOWN_WEAPONS "Please put down your weapon. You have 20 seconds to comply." + +#define HONKBOT_VOICED_HONK_HAPPY "Honk!" +#define HONKBOT_VOICED_HONK_SAD "Honk..." + +#define BEEPSKY_VOICED_CRIMINAL_DETECTED "Criminal detected!" +#define BEEPSKY_VOICED_FREEZE "Freeze, scumbag!" +#define BEEPSKY_VOICED_JUSTICE "Prepare for justice!" +#define BEEPSKY_VOICED_YOUR_MOVE "Your move, creep." +#define BEEPSKY_VOICED_I_AM_THE_LAW "I am the law!" +#define BEEPSKY_VOICED_SECURE_DAY "Have a secure day." + +#define FIREBOT_VOICED_FIRE_DETECTED "Fire detected!" +#define FIREBOT_VOICED_STOP_DROP "Stop, drop and roll!" +#define FIREBOT_VOICED_EXTINGUISHING "Extinguishing!" +#define FIREBOT_VOICED_NO_FIRES "No fires detected." +#define FIREBOT_VOICED_ONLY_YOU "Only you can prevent station fires." +#define FIREBOT_VOICED_TEMPERATURE_NOMINAL "Temperature nominal." +#define FIREBOT_VOICED_KEEP_COOL "Keep it cool." + +#define HYGIENEBOT_VOICED_UNHYGIENIC "Unhygienic client found. Please stand still so I can clean you." +#define HYGIENEBOT_VOICED_ENJOY_DAY "Enjoy your clean and tidy day!" +#define HYGIENEBOT_VOICED_THREAT_AIRLOCK "Either you stop running or I will fucking drag you out of an airlock." +#define HYGIENEBOT_VOICED_FOUL_SMELL "Get back here you foul smelling fucker." +#define HYGIENEBOT_VOICED_TROGLODYTE "I just want to fucking clean you you troglodyte." +#define HYGIENEBOT_VOICED_GREEN_CLOUD "If you don't come back here I'll put a green cloud around you cunt." +#define HYGIENEBOT_VOICED_ARSEHOLE "Just fucking let me clean you you arsehole!" +#define HYGIENEBOT_VOICED_THREAT_ARTERIES "STOP RUNNING OR I WILL CUT YOUR ARTERIES!" +#define HYGIENEBOT_VOICED_STOP_RUNNING "STOP. RUNNING." +#define HYGIENEBOT_VOICED_FUCKING_FINALLY "Fucking finally." +#define HYGIENEBOT_VOICED_THANK_GOD "Thank god, you finally stopped." +#define HYGIENEBOT_VOICED_DEGENERATE "Well about fucking time you degenerate." + +#define MEDIBOT_VOICED_HOLD_ON "Hey! Hold on, I'm coming." +#define MEDIBOT_VOICED_WANT_TO_HELP "Wait! I want to help!" +#define MEDIBOT_VOICED_YOU_ARE_INJURED "You appear to be injured!" +#define MEDIBOT_VOICED_ALL_PATCHED_UP "All patched up!" +#define MEDIBOT_VOICED_APPLE_A_DAY "An apple a day keeps me away." +#define MEDIBOT_VOICED_FEEL_BETTER "Feel better soon!" +#define MEDIBOT_VOICED_STAY_WITH_ME "No! Stay with me!" +#define MEDIBOT_VOICED_LIVE "Live, damnit! LIVE!" +#define MEDIBOT_VOICED_NEVER_LOST "I...I've never lost a patient before. Not today, I mean." +#define MEDIBOT_VOICED_DELICIOUS "Delicious!" +#define MEDIBOT_VOICED_PLASTIC_SURGEON "I knew it, I should've been a plastic surgeon." +#define MEDIBOT_VOICED_MASK_ON "Radar, put a mask on!" +#define MEDIBOT_VOICED_ALWAYS_A_CATCH "There's always a catch, and I'm the best there is." +#define MEDIBOT_VOICED_LIKE_FLIES "What kind of medbay is this? Everyone's dropping like flies." +#define MEDIBOT_VOICED_SUFFER "Why are we still here? Just to suffer?" +#define MEDIBOT_VOICED_FUCK_YOU "Fuck you." +#define MEDIBOT_VOICED_NOT_A_GAME "Turn off your computer. This is not a game." +#define MEDIBOT_VOICED_IM_DIFFERENT "I'm different!" +#define MEDIBOT_VOICED_FOURTH_WALL "Close Dreamseeker.exe now. Or else." +#define MEDIBOT_VOICED_SHINDEMASHOU "Shindemashou." +#define MEDIBOT_VOICED_WAIT "Hey, wait..." +#define MEDIBOT_VOICED_DONT "Please don't..." +#define MEDIBOT_VOICED_TRUSTED_YOU "I trusted you..." +#define MEDIBOT_VOICED_NO_SAD "Nooo..." +#define MEDIBOT_VOICED_OH_FUCK "Oh fuck-" +#define MEDIBOT_VOICED_FORGIVE "I forgive you." +#define MEDIBOT_VOICED_THANKS "Thank you!" +#define MEDIBOT_VOICED_GOOD_PERSON "You are a good person." +#define MEDIBOT_VOICED_BEHAVIOUR_REPORTED "Your behavior has been reported, have a nice day." +#define MEDIBOT_VOICED_ASSISTANCE "I require assistance." +#define MEDIBOT_VOICED_PUT_BACK "Please put me back." +#define MEDIBOT_VOICED_IM_SCARED "Please, I am scared!" +#define MEDIBOT_VOICED_NEED_HELP "I don't like this, I need help!" +#define MEDIBOT_VOICED_THIS_HURTS "This hurts, my pain is real!" +#define MEDIBOT_VOICED_THE_END "Is this the end?" +#define MEDIBOT_VOICED_NOOO "Nooo!" diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index a57d92045499f..6f5b97e7ab885 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -23,6 +23,7 @@ #define ROLE_BLOB "Blob" #define ROLE_BLOB_INFECTION "Blob Infection" #define ROLE_CHANGELING_MIDROUND "Changeling (Midround)" +#define ROLE_CYBER_POLICE "Cyber Police" #define ROLE_FUGITIVE "Fugitive" #define ROLE_LONE_OPERATIVE "Lone Operative" #define ROLE_MALF_MIDROUND "Malf AI (Midround)" @@ -41,64 +42,69 @@ // Latejoin roles #define ROLE_HERETIC_SMUGGLER "Heretic Smuggler" #define ROLE_PROVOCATEUR "Provocateur" -#define ROLE_SYNDICATE_INFILTRATOR "Syndicate Infiltrator" #define ROLE_STOWAWAY_CHANGELING "Stowaway Changeling" +#define ROLE_SYNDICATE_INFILTRATOR "Syndicate Infiltrator" // Other roles -#define ROLE_SYNDICATE "Syndicate" -#define ROLE_REV "Revolutionary" -#define ROLE_REV_SUCCESSFUL "Victorious Revolutionary" -#define ROLE_PAI "pAI" -#define ROLE_MONKEY_HELMET "Monkey Mind Magnification Helmet" -#define ROLE_REVENANT "Revenant" +#define ROLE_ANOMALY_GHOST "Ectoplasmic Anomaly Ghost" #define ROLE_BRAINWASHED "Brainwashed Victim" -#define ROLE_HYPNOTIZED "Hypnotized Victim" -#define ROLE_OVERTHROW "Syndicate Mutineer" //Role removed, left here for safety. +#define ROLE_DEATHSQUAD "Deathsquad" +#define ROLE_DRONE "Drone" +#define ROLE_EMAGGED_BOT "Malfunctioning Bot" #define ROLE_HIVE "Hivemind Host" //Role removed, left here for safety. -#define ROLE_SENTIENCE "Sentience Potion Spawn" -#define ROLE_PYROCLASTIC_SLIME "Pyroclastic Anomaly Slime" -#define ROLE_ANOMALY_GHOST "Ectoplasmic Anomaly Ghost" +#define ROLE_HYPNOTIZED "Hypnotized Victim" +#define ROLE_LAVALAND "Lavaland" +#define ROLE_LAZARUS_BAD "Slaved Revived Mob" +#define ROLE_LAZARUS_GOOD "Friendly Revived Mob" #define ROLE_MIND_TRANSFER "Mind Transfer Potion" +#define ROLE_MONKEY_HELMET "Monkey Mind Magnification Helmet" +#define ROLE_OVERTHROW "Syndicate Mutineer" //Role removed, left here for safety. +#define ROLE_PAI "pAI" #define ROLE_POSIBRAIN "Posibrain" -#define ROLE_DRONE "Drone" -#define ROLE_DEATHSQUAD "Deathsquad" -#define ROLE_LAVALAND "Lavaland" +#define ROLE_PYROCLASTIC_SLIME "Pyroclastic Anomaly Slime" +#define ROLE_REV "Revolutionary" +#define ROLE_REVENANT "Revenant" +#define ROLE_SENTIENCE "Sentience Potion Spawn" +#define ROLE_SYNDICATE "Syndicate" -#define ROLE_POSITRONIC_BRAIN "Positronic Brain" -#define ROLE_FREE_GOLEM "Free Golem" -#define ROLE_SERVANT_GOLEM "Servant Golem" -#define ROLE_NUCLEAR_OPERATIVE "Nuclear Operative" #define ROLE_CLOWN_OPERATIVE "Clown Operative" -#define ROLE_WIZARD_APPRENTICE "apprentice" -#define ROLE_SLAUGHTER_DEMON "Slaughter Demon" +#define ROLE_FREE_GOLEM "Free Golem" #define ROLE_MORPH "Morph" +#define ROLE_NUCLEAR_OPERATIVE "Nuclear Operative" +#define ROLE_POSITRONIC_BRAIN "Positronic Brain" #define ROLE_SANTA "Santa" +#define ROLE_SERVANT_GOLEM "Servant Golem" +#define ROLE_SLAUGHTER_DEMON "Slaughter Demon" +#define ROLE_WIZARD_APPRENTICE "apprentice" //Spawner roles -#define ROLE_GHOST_ROLE "Ghost Role" +#define ROLE_ANCIENT_CREW "Ancient Crew" +#define ROLE_ASHWALKER "Ash Walker" +#define ROLE_BATTLECRUISER_CAPTAIN "Battlecruiser Captain" +#define ROLE_BATTLECRUISER_CREW "Battlecruiser Crew" +#define ROLE_BEACH_BUM "Beach Bum" +#define ROLE_BOT "Bot" +#define ROLE_DERELICT_DRONE "Derelict Drone" +#define ROLE_ESCAPED_PRISONER "Escaped Prisoner" #define ROLE_EXILE "Exile" #define ROLE_FUGITIVE_HUNTER "Fugitive Hunter" -#define ROLE_ESCAPED_PRISONER "Escaped Prisoner" -#define ROLE_LIFEBRINGER "Lifebringer" -#define ROLE_ASHWALKER "Ash Walker" -#define ROLE_LAVALAND_SYNDICATE "Lavaland Syndicate" +#define ROLE_GHOST_ROLE "Ghost Role" #define ROLE_HERMIT "Hermit" -#define ROLE_BEACH_BUM "Beach Bum" #define ROLE_HOTEL_STAFF "Hotel Staff" +#define ROLE_LAVALAND_SYNDICATE "Lavaland Syndicate" +#define ROLE_LIFEBRINGER "Lifebringer" +#define ROLE_MAINTENANCE_DRONE "Maintenance Drone" +#define ROLE_SKELETON "Skeleton" +#define ROLE_SPACE_BAR_PATRON "Space Bar Patron" +#define ROLE_SPACE_BARTENDER "Space Bartender" +#define ROLE_SPACE_DOCTOR "Space Doctor" +#define ROLE_SPACE_PIRATE "Space Pirate" #define ROLE_SPACE_SYNDICATE "Space Syndicate" #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_SPACE_PIRATE "Space Pirate" -#define ROLE_ANCIENT_CREW "Ancient Crew" -#define ROLE_SPACE_DOCTOR "Space Doctor" -#define ROLE_SPACE_BARTENDER "Space Bartender" -#define ROLE_SPACE_BAR_PATRON "Space Bar Patron" -#define ROLE_SKELETON "Skeleton" -#define ROLE_ZOMBIE "Zombie" -#define ROLE_MAINTENANCE_DRONE "Maintenance Drone" -#define ROLE_BATTLECRUISER_CREW "Battlecruiser Crew" -#define ROLE_BATTLECRUISER_CAPTAIN "Battlecruiser Captain" +#define ROLE_SYNDICATE_DRONE "Syndicate Drone" #define ROLE_VENUSHUMANTRAP "Venus Human Trap" +#define ROLE_ZOMBIE "Zombie" /// This defines the antagonists you can operate with in the settings. @@ -123,6 +129,7 @@ GLOBAL_LIST_INIT(special_roles, list( ROLE_BLOB = 0, ROLE_BLOB_INFECTION = 0, ROLE_CHANGELING_MIDROUND = 0, + ROLE_CYBER_POLICE = 0, ROLE_FUGITIVE = 0, ROLE_LONE_OPERATIVE = 14, ROLE_MALF_MIDROUND = 0, diff --git a/code/__DEFINES/rust_g.dm b/code/__DEFINES/rust_g.dm index cab4430a88dfe..76e5fa22d4748 100644 --- a/code/__DEFINES/rust_g.dm +++ b/code/__DEFINES/rust_g.dm @@ -110,6 +110,12 @@ #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) @@ -158,8 +164,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 e71561defcdbf..83aeb36d2153c 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -78,7 +78,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/shuttles.dm b/code/__DEFINES/shuttles.dm index 5380268e979c0..6f15ea6521638 100644 --- a/code/__DEFINES/shuttles.dm +++ b/code/__DEFINES/shuttles.dm @@ -63,6 +63,14 @@ #define ENGINE_COEFF_MAX 2 #define ENGINE_DEFAULT_MAXSPEED_ENGINES 5 +// Alert level related +#define ALERT_COEFF_AUTOEVAC_NORMAL 2.5 +#define ALERT_COEFF_GREEN 2 +#define ALERT_COEFF_BLUE 1 +#define ALERT_COEFF_RED 0.5 +#define ALERT_COEFF_AUTOEVAC_CRITICAL 0.4 +#define ALERT_COEFF_DELTA 0.25 + //Docking error flags #define DOCKING_SUCCESS 0 #define DOCKING_BLOCKED (1<<0) @@ -89,8 +97,26 @@ #define SHUTTLE_DEFAULT_SHUTTLE_AREA_TYPE /area/shuttle #define SHUTTLE_DEFAULT_UNDERLYING_AREA /area/space -//Shuttle unlocks +/// Shuttle unlocks +// Needs Alien Technology researched. #define SHUTTLE_UNLOCK_ALIENTECH "abductor" +// Needs bubblegum to die. #define SHUTTLE_UNLOCK_BUBBLEGUM "bubblegum" +// Needs one to set the holodeck to Medieval Sim. #define SHUTTLE_UNLOCK_MEDISIM "holodeck" +// Needs a rune to be cleared by a null rod. #define SHUTTLE_UNLOCK_NARNAR "narnar" +// Needs someone to be polymorphed - Pride Mirror, Magic Mirror, Race Swap, Polymorph Staff/Wand. Badmin Mirror doesn't count, neither does xenobio. +#define SHUTTLE_UNLOCK_WABBAJACK "wabbajack" +// Needs cargo budget to be almost empty to be purchasable. +#define SHUTTLE_UNLOCK_SCRAPHEAP "scrapheap" + +//Shuttle Events + +///Self destruct if this is returned in process +#define SHUTTLE_EVENT_CLEAR 2 + +///spawned stuff should float by the window and not hit the shuttle +#define SHUTTLE_EVENT_MISS_SHUTTLE 1 << 0 +///spawned stuff should hit the shuttle +#define SHUTTLE_EVENT_HIT_SHUTTLE 1 << 1 diff --git a/code/__DEFINES/skills.dm b/code/__DEFINES/skills.dm index 6329989b3c8d8..e870e9de7a646 100644 --- a/code/__DEFINES/skills.dm +++ b/code/__DEFINES/skills.dm @@ -24,9 +24,14 @@ #define SKILL_EXP_LIST list(SKILL_EXP_NONE, SKILL_EXP_NOVICE, SKILL_EXP_APPRENTICE, SKILL_EXP_JOURNEYMAN, SKILL_EXP_EXPERT, SKILL_EXP_MASTER, SKILL_EXP_LEGENDARY) //Skill modifier types -#define SKILL_SPEED_MODIFIER "skill_speed_modifier"//ideally added/subtracted in speed calculations to make you do stuff faster -#define SKILL_PROBS_MODIFIER "skill_probability_modifier"//ideally added/subtracted where beneficial in prob(x) calls -#define SKILL_RANDS_MODIFIER "skill_randomness_modifier"//ideally added/subtracted where beneficial in rand(x,y) calls +///ideally added/subtracted in speed calculations to make you do stuff faster +#define SKILL_SPEED_MODIFIER "skill_speed_modifier" +///ideally added/subtracted where beneficial in prob(x) calls +#define SKILL_PROBS_MODIFIER "skill_probability_modifier" +///ideally added/subtracted where beneficial in rand(x,y) calls +#define SKILL_RANDS_MODIFIER "skill_randomness_modifier" +///ideally for addittive operations +#define SKILL_VALUE_MODIFIER "skill_value_modifier" // Gets the reference for the skill type that was given #define GetSkillRef(A) (SSskills.all_skills[A]) @@ -34,3 +39,7 @@ //number defines #define CLEAN_SKILL_BEAUTY_ADJUSTMENT -15//It's a denominator so no 0. Higher number = less cleaning xp per cleanable. Negative value means cleanables with negative beauty give xp. #define CLEAN_SKILL_GENERIC_WASH_XP 1.5//Value. Higher number = more XP when cleaning non-cleanables (walls/floors/lips) +///The multiplier of the extra experience given by the fishing minigame based on difficulty. At the default difficulty of 15, the bonus will be of 21%. +#define FISHING_SKILL_DIFFIULTY_EXP_MULT 0.015 +///How much exp one would gain per spent playing the fishing minigame at minimum difficulty. the time is multiplied by 0.1 because deciseconds... +#define FISHING_SKILL_EXP_PER_SECOND (SKILL_EXP_LEGENDARY / (15 MINUTES * 0.1)) diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index f45c31f72dcdc..b3025c4ccc11e 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -4,11 +4,12 @@ #define CHANNEL_VOX 1022 #define CHANNEL_JUKEBOX 1021 #define CHANNEL_HEARTBEAT 1020 //sound channel for heartbeats -#define CHANNEL_AMBIENCE 1019 -#define CHANNEL_BUZZ 1018 -#define CHANNEL_TRAITOR 1017 -#define CHANNEL_CHARGED_SPELL 1016 -#define CHANNEL_ELEVATOR 1015 +#define CHANNEL_BOSS_MUSIC 1019 +#define CHANNEL_AMBIENCE 1018 +#define CHANNEL_BUZZ 1017 +#define CHANNEL_TRAITOR 1016 +#define CHANNEL_CHARGED_SPELL 1015 +#define CHANNEL_ELEVATOR 1014 ///Default range of a sound. #define SOUND_RANGE 17 @@ -44,6 +45,7 @@ #define AMBIENCE_RUINS "ruins" #define AMBIENCE_ENGI "engi" #define AMBIENCE_MINING "mining" +#define AMBIENCE_ICEMOON "icemoon" #define AMBIENCE_MEDICAL "med" #define AMBIENCE_VIROLOGY "viro" #define AMBIENCE_SPOOKY "spooky" @@ -147,6 +149,7 @@ GLOBAL_LIST_INIT(announcer_keys, list( #define SFX_EXPLOSION_CREAKING "explosion_creaking" #define SFX_HISS "hiss" #define SFX_HONKBOT_E "honkbot_e" +#define SFX_GOOSE "goose" #define SFX_HULL_CREAKING "hull_creaking" #define SFX_HYPERTORUS_CALM "hypertorus_calm" #define SFX_HYPERTORUS_MELTING "hypertorus_melting" @@ -168,3 +171,4 @@ GLOBAL_LIST_INIT(announcer_keys, list( #define SFX_CRUNCHY_BUSH_WHACK "crunchy_bush_whack" #define SFX_TREE_CHOP "tree_chop" #define SFX_ROCK_TAP "rock_tap" +#define SFX_SEAR "sear" diff --git a/code/__DEFINES/span.dm b/code/__DEFINES/span.dm index 2e237ce94ae30..7b23869988bd5 100644 --- a/code/__DEFINES/span.dm +++ b/code/__DEFINES/span.dm @@ -17,6 +17,7 @@ #define span_bigicon(str) ("" + str + "") #define span_binarysay(str) ("" + str + "") #define span_blob(str) ("" + str + "") +#define span_blobannounce(str) ("" + str + "") #define span_blue(str) ("" + str + "") #define span_blueteamradio(str) ("" + str + "") #define span_bold(str) ("" + str + "") @@ -43,6 +44,7 @@ #define span_drone(str) ("" + str + "") #define span_engradio(str) ("" + str + "") #define span_extremelybig(str) ("" + str + "") +#define span_game_say(str) ("" + str + "") #define span_ghostalert(str) ("" + str + "") #define span_green(str) ("" + str + "") #define span_greenannounce(str) ("" + str + "") @@ -69,6 +71,7 @@ #define span_medradio(str) ("" + str + "") #define span_memo(str) ("" + str + "") #define span_memoedit(str) ("" + str + "") +#define span_message(str) ("" + str + "") #define span_mind_control(str) ("" + str + "") #define span_minorannounce(str) ("" + str + "") #define span_monkey(str) ("" + str + "") diff --git a/code/__DEFINES/species_clothing_paths.dm b/code/__DEFINES/species_clothing_paths.dm index 51d94eb0463d1..2582d81b613bc 100644 --- a/code/__DEFINES/species_clothing_paths.dm +++ b/code/__DEFINES/species_clothing_paths.dm @@ -8,12 +8,12 @@ //MONKEY PATHS ///The dmi for monkey uniforms -#define MONKEY_UNIFORM_FILE 'icons/mob/species/monkey/uniform.dmi' +#define MONKEY_UNIFORM_FILE 'icons/mob/human/species/monkey/uniform.dmi' //DIGITIGRADE PATHS ///The dmi containing digitigrade uniforms -#define DIGITIGRADE_UNIFORM_FILE 'icons/mob/species/misc/digitigrade.dmi' +#define DIGITIGRADE_UNIFORM_FILE 'icons/mob/human/species/misc/digitigrade.dmi' ///The dmi containing digitigrade shoes -#define DIGITIGRADE_SHOES_FILE 'icons/mob/species/misc/digitigrade_shoes.dmi' +#define DIGITIGRADE_SHOES_FILE 'icons/mob/human/species/misc/digitigrade_shoes.dmi' ///The dmi containing digitigrade oversuits -#define DIGITIGRADE_SUIT_FILE 'icons/mob/species/misc/digitigrade_suits.dmi' +#define DIGITIGRADE_SUIT_FILE 'icons/mob/human/species/misc/digitigrade_suits.dmi' diff --git a/code/__DEFINES/sprite_accessories.dm b/code/__DEFINES/sprite_accessories.dm new file mode 100644 index 0000000000000..9c9471130e6fd --- /dev/null +++ b/code/__DEFINES/sprite_accessories.dm @@ -0,0 +1,9 @@ +// ~color source defines for sprite accessories +/// Color of the sprite accessory will match the owner's mutant color, which is granted by certain species +#define MUTANT_COLOR "mutant_color" +/// Color of the sprite accessory will match the owner's hair color +#define HAIR_COLOR "hair_color" +/// Color of the sprite accessory will match the owner's facial hair color +#define FACIAL_HAIR_COLOR "facial_hair_color" +/// Color of the sprite accessory will match the owner's (left) eye color +#define EYE_COLOR "eye_color" diff --git a/code/__DEFINES/station.dm b/code/__DEFINES/station.dm index 5b97a079c6e35..3cb026e4f7679 100644 --- a/code/__DEFINES/station.dm +++ b/code/__DEFINES/station.dm @@ -2,8 +2,15 @@ #define STATION_TRAIT_NEUTRAL 2 #define STATION_TRAIT_NEGATIVE 3 - +/// For traits that shouldn't be selected, like abstract types (wow) #define STATION_TRAIT_ABSTRACT (1<<0) +/// Only run on planet stations +#define STATION_TRAIT_PLANETARY (1<<1) +/// Only run on space stations +#define STATION_TRAIT_SPACE_BOUND (1<<2) + +/// Not restricted by space or planet, can always just happen +#define STATION_TRAIT_MAP_UNRESTRICTED STATION_TRAIT_PLANETARY | STATION_TRAIT_SPACE_BOUND /// The data file that future station traits forced by an admin are stored in #define FUTURE_STATION_TRAITS_FILE "data/future_station_traits.json" diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 4262472475a4e..03a3bf49ebbe8 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -34,10 +34,12 @@ // Grouped effect sources, see also code/__DEFINES/traits.dm #define STASIS_MACHINE_EFFECT "stasis_machine" - #define STASIS_CHEMICAL_EFFECT "stasis_chemical" - #define STASIS_SHAPECHANGE_EFFECT "stasis_shapechange" +#define STASIS_ADMIN "stasis_admin" +#define STASIS_LEGION_EATEN "stasis_eaten" + +#define STASIS_NETPOD_EFFECT "stasis_netpod" /// Causes the mob to become blind via the passed source #define become_blind(source) apply_status_effect(/datum/status_effect/grouped/blindness, source) @@ -154,3 +156,8 @@ #define adjust_temp_blindness_up_to(duration, up_to) adjust_timed_status_effect(duration, /datum/status_effect/temporary_blindness, up_to) #define set_temp_blindness(duration) set_timed_status_effect(duration, /datum/status_effect/temporary_blindness) #define set_temp_blindness_if_lower(duration) set_timed_status_effect(duration, /datum/status_effect/temporary_blindness, TRUE) + +#define adjust_static_vision(duration) adjust_timed_status_effect(duration, /datum/status_effect/static_vision) +#define adjust_static_vision_up_to(duration, up_to) adjust_timed_status_effect(duration, /datum/status_effect/static_vision, up_to) +#define set_static_vision(duration) set_timed_status_effect(duration, /datum/status_effect/static_vision) +#define set_static_vision_if_lower(duration) set_timed_status_effect(duration, /datum/status_effect/static_vision, TRUE) diff --git a/code/__DEFINES/storage.dm b/code/__DEFINES/storage.dm index 6d0860668bb96..a266c86198f65 100644 --- a/code/__DEFINES/storage.dm +++ b/code/__DEFINES/storage.dm @@ -15,3 +15,10 @@ #define FANCY_CONTAINER_CLOSED 0 #define FANCY_CONTAINER_OPEN 1 #define FANCY_CONTAINER_ALWAYS_OPEN 2 + +// Defines for levels of storage locking +// Also used fort the force param of can_insert +// Higher values are "more" locked then lower ones +#define STORAGE_NOT_LOCKED 0 +#define STORAGE_SOFT_LOCKED 1 +#define STORAGE_FULLY_LOCKED 2 diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 33deb2df67c1f..e6be1b5fe1909 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -20,7 +20,7 @@ * * make sure you add an update to the schema_version stable in the db changelog */ -#define DB_MINOR_VERSION 24 +#define DB_MINOR_VERSION 25 //! ## Timing subsystem @@ -119,9 +119,12 @@ /// Subsystem initialized sucessfully. #define SS_INIT_SUCCESS 2 -/// Successful, but don't print anything. Useful if subsystem was disabled. +/// If your system doesn't need to be initialized (by being disabled or something) #define SS_INIT_NO_NEED 3 +/// Succesfully initialized, BUT do not announce it to players (generally to hide game mechanics it would otherwise spoil) +#define SS_INIT_NO_MESSAGE 4 + //! ### SS initialization load orders // Subsystem init_order, from highest priority to lowest priority // Subsystems shutdown in the reverse of the order they initialize in @@ -197,13 +200,14 @@ #define FIRE_PRIORITY_GARBAGE 15 #define FIRE_PRIORITY_DATABASE 16 #define FIRE_PRIORITY_WET_FLOORS 20 -#define FIRE_PRIORITY_FLUIDS 20 #define FIRE_PRIORITY_AIR 20 #define FIRE_PRIORITY_NPC 20 +#define FIRE_PRIORITY_ASSETS 20 #define FIRE_PRIORITY_HYPERSPACE_DRIFT 20 #define FIRE_PRIORITY_NPC_MOVEMENT 21 #define FIRE_PRIORITY_NPC_ACTIONS 22 #define FIRE_PRIORITY_PATHFINDING 23 +#define FIRE_PRIORITY_CLIFF_FALLING 24 #define FIRE_PRIORITY_PROCESS 25 #define FIRE_PRIORITY_THROWING 25 #define FIRE_PRIORITY_REAGENTS 26 @@ -215,8 +219,8 @@ #define FIRE_PRIORITY_DEFAULT 50 #define FIRE_PRIORITY_PARALLAX 65 #define FIRE_PRIORITY_INSTRUMENTS 80 +#define FIRE_PRIORITY_FLUIDS 80 #define FIRE_PRIORITY_MOBS 100 -#define FIRE_PRIORITY_ASSETS 105 #define FIRE_PRIORITY_TGUI 110 #define FIRE_PRIORITY_TICKER 200 #define FIRE_PRIORITY_STATPANEL 390 @@ -254,6 +258,14 @@ /// Game has round finished #define GAME_STATE_FINISHED 4 +// Used for SSticker.force_ending +/// Default, round is not being forced to end. +#define END_ROUND_AS_NORMAL 0 +/// End the round now as normal +#define FORCE_END_ROUND 1 +/// For admin forcing roundend, can be used to distinguish the two +#define ADMIN_FORCE_END_ROUND 2 + /** Create a new timer and add it to the queue. * Arguments: @@ -279,8 +291,8 @@ #define SSAIR_REBUILD_QUEUE 2 // Explosion Subsystem subtasks -#define SSEXPLOSIONS_MOVABLES 1 -#define SSEXPLOSIONS_TURFS 2 +#define SSEXPLOSIONS_TURFS 1 +#define SSEXPLOSIONS_MOVABLES 2 #define SSEXPLOSIONS_THROWS 3 // Wardrobe subsystem tasks @@ -309,6 +321,9 @@ #define SSMOBS_DT (SSmobs.wait/10) #define SSOBJ_DT (SSobj.wait/10) +// The change in the world's time from the subsystem's last fire in seconds. +#define DELTA_WORLD_TIME(ss) ((world.time - ss.last_fire) * 0.1) + /// The timer key used to know how long subsystem initialization takes #define SS_INIT_TIMER_KEY "ss_init" diff --git a/code/__DEFINES/supermatter.dm b/code/__DEFINES/supermatter.dm index f7e4a1bb51e97..5eab41fcdf9cc 100644 --- a/code/__DEFINES/supermatter.dm +++ b/code/__DEFINES/supermatter.dm @@ -28,6 +28,12 @@ #define MATTER_POWER_CONVERSION 10 //Crystal converts 1/this value of stored matter into energy. +/// The internal energy gain coefficient. +#define GAS_HEAT_POWER_SCALING_COEFFICIENT (1/6) + +/// The base zap power transmission of the supermatter crystal in W/MeV. +#define BASE_POWER_TRANSMISSION_RATE 1040 + //These would be what you would get at point blank, decreases with distance #define DETONATION_HALLUCINATION (20 MINUTES) @@ -36,6 +42,11 @@ #define SUPERMATTER_WARNING_DELAY (60 SECONDS) +/// If the crystal is healing faster than this per damage check, we suppress the Common radio notification for the cooldown +#define SUPERMATTER_FAST_HEALING_RATE 0.025 + +#define SUPERMATTER_COMMON_RADIO_DELAY (6 MINUTES) + #define SM_HALLUCINATION_RANGE(P) (min(7, round(P ** 0.25))) #define GRAVITATIONAL_ANOMALY "gravitational_anomaly" @@ -46,7 +57,10 @@ #define VORTEX_ANOMALY "vortex_anomaly" #define DIMENSIONAL_ANOMALY "dimensional_anomaly" -#define SUPERMATTER_COUNTDOWN_TIME (30 SECONDS) +/// How long it takes for the supermatter to delaminate after hitting 0 integrity +#define SUPERMATTER_COUNTDOWN_TIME (15 SECONDS) +/// How long it takes for the supermatter to delaminate after hitting 0 integrity if a sliver has been removed +#define SUPERMATTER_SLIVER_REMOVED_COUNTDOWN_TIME (5 SECONDS) ///to prevent accent sounds from layering #define SUPERMATTER_ACCENT_SOUND_MIN_COOLDOWN (2 SECONDS) @@ -55,6 +69,8 @@ #define SLIGHTLY_CHARGED_ZAP_ICON_STATE "sm_arc_supercharged" #define OVER_9000_ZAP_ICON_STATE "sm_arc_dbz_referance" //Witty I know +#define SUPERMATTER_DEFAULT_BULLET_ENERGY 2 + #define SUPERMATTER_CASCADE_PERCENT 80 /// The divisor scaling value for cubic power loss. @@ -155,9 +171,9 @@ #define SM_TEMP_LIMIT_LOW_MOLES "Low Moles Heat Resistance" /// How much we are multiplying our zap energy. -#define SM_ZAP_BASE "Base Zap Multiplier" +#define SM_ZAP_BASE "Base Zap Transmission" /// How much we are multiplying our zap energy because of gas factors. -#define SM_ZAP_GAS "Gas Zap Multiplier" +#define SM_ZAP_GAS "Gas Zap Transmission Modifier" /// Delamination types. #define CASCADE_DELAMINATION "cascade" #define SINGULARITY_DELAMINATION "singularity" diff --git a/code/__DEFINES/surgery.dm b/code/__DEFINES/surgery.dm index 5f698598d73e8..1d029a696f1cd 100644 --- a/code/__DEFINES/surgery.dm +++ b/code/__DEFINES/surgery.dm @@ -1,20 +1,36 @@ +/// Helper to figure out if an organ is organic +#define IS_ORGANIC_ORGAN(organ) (organ.organ_flags & ORGAN_ORGANIC) +/// Helper to figure out if an organ is robotic +#define IS_ROBOTIC_ORGAN(organ) (organ.organ_flags & ORGAN_ROBOTIC) + // Flags for the organ_flags var on /obj/item/organ -///Synthetic organs, or cybernetic organs. Reacts to EMPs and don't deteriorate or heal -#define ORGAN_SYNTHETIC (1<<0) -///Frozen organs, don't deteriorate -#define ORGAN_FROZEN (1<<1) -///Failing organs perform damaging effects until replaced or fixed -#define ORGAN_FAILING (1<<2) -///Currently only the brain -#define ORGAN_VITAL (1<<3) -///is a snack? :D -#define ORGAN_EDIBLE (1<<4) -///Synthetic organ affected by an EMP. Deteriorates over time. -#define ORGAN_SYNTHETIC_EMP (1<<5) -///Can't be removed using surgery -#define ORGAN_UNREMOVABLE (1<<6) +/// Organic organs, the default. Don't get affected by EMPs. +#define ORGAN_ORGANIC (1<<0) +/// Synthetic organs, or cybernetic organs. Reacts to EMPs and don't deteriorate or heal +#define ORGAN_ROBOTIC (1<<1) +/// Mineral organs. Snowflakey. +#define ORGAN_MINERAL (1<<2) +/// Frozen organs, don't deteriorate +#define ORGAN_FROZEN (1<<3) +/// Failing organs perform damaging effects until replaced or fixed, and typically they don't function properly either +#define ORGAN_FAILING (1<<4) +/// Synthetic organ affected by an EMP. Deteriorates over time. +#define ORGAN_EMP (1<<5) +/// Currently only the brain - Removing this organ KILLS the owner +#define ORGAN_VITAL (1<<6) +/// Can be eaten +#define ORGAN_EDIBLE (1<<7) +/// Can't be removed using surgery or other common means +#define ORGAN_UNREMOVABLE (1<<8) /// Can't be seen by scanners, doesn't anger body purists -#define ORGAN_HIDDEN (1<<7) +#define ORGAN_HIDDEN (1<<9) +/// Has the organ already been inserted inside someone +#define ORGAN_VIRGIN (1<<10) + +/// Helper to figure out if a limb is organic +#define IS_ORGANIC_LIMB(limb) (limb.bodytype & BODYTYPE_ORGANIC) +/// Helper to figure out if a limb is robotic +#define IS_ROBOTIC_LIMB(limb) (limb.bodytype & BODYTYPE_ROBOTIC) // Flags for the bodypart_flags var on /obj/item/bodypart /// Bodypart cannot be dismembered or amputated @@ -28,7 +44,25 @@ ///Bodypart does not get replaced during set_species() #define BP_BLOCK_CHANGE_SPECIES (1<<0) -/// When the surgery step fails :( +// Flags for the head_flags var on /obj/item/bodypart/head +/// Head can have hair +#define HEAD_HAIR (1<<0) +/// Head can have facial hair +#define HEAD_FACIAL_HAIR (1<<1) +/// Head can have lips +#define HEAD_LIPS (1<<2) +/// Head can have eye sprites +#define HEAD_EYESPRITES (1<<3) +/// Head will have colored eye sprites +#define HEAD_EYECOLOR (1<<4) +/// Head can have eyeholes when missing eyes +#define HEAD_EYEHOLES (1<<5) +/// Head can have debrain overlay +#define HEAD_DEBRAIN (1<<6) +/// All head flags, default for most heads +#define HEAD_ALL_FEATURES (HEAD_HAIR|HEAD_FACIAL_HAIR|HEAD_LIPS|HEAD_EYESPRITES|HEAD_EYECOLOR|HEAD_EYEHOLES|HEAD_DEBRAIN) + +/// Return value when the surgery step fails :( #define SURGERY_STEP_FAIL -1 // Flags for surgery_flags on surgery datums @@ -42,3 +76,8 @@ #define SURGERY_REQUIRE_LIMB (1<<3) ///Will allow the surgery to work only if there's a real (eg. not pseudopart) limb. #define SURGERY_REQUIRES_REAL_LIMB (1<<4) +///Will grant a bonus during surgery steps to users with TRAIT_MORBID while they're using tools with CRUEL_IMPLEMENT +#define SURGERY_MORBID_CURIOSITY (1<<5) + +///Return true if target is not in a valid body position for the surgery +#define IS_IN_INVALID_SURGICAL_POSITION(target, surgery) ((surgery.surgery_flags & SURGERY_REQUIRE_RESTING) && (target.mobility_flags & MOBILITY_LIEDOWN && target.body_position != LYING_DOWN)) diff --git a/code/__DEFINES/text.dm b/code/__DEFINES/text.dm index 3cffec0521f7e..8a7731618bbff 100644 --- a/code/__DEFINES/text.dm +++ b/code/__DEFINES/text.dm @@ -1,10 +1,44 @@ /// Does 4 spaces. Used as a makeshift tabulator. #define FOURSPACES "    " +/// Standard maptext /// Prepares a text to be used for maptext. Use this so it doesn't look hideous. #define MAPTEXT(text) {"[##text]"} -/// Prepares a text to be used for maptext, using a font that can handle larger text better. +/** + * Pixel-perfect scaled fonts for use in the MAP element as defined in skin.dmf + * + * Four sizes to choose from, use the sizes as mentioned below. + * Between the variations and a step there should be an option that fits your use case. + * BYOND uses pt sizing, different than px used in TGUI. Using px will make it look blurry due to poor antialiasing. + * + * Default sizes are prefilled in the macro for ease of use and a consistent visual look. + * To use a step other than the default in the macro, specify it in a span style. + * For example: MAPTEXT_PIXELLARI("Some large maptext here") + */ +/// Large size (ie: context tooltips) - Size options: 12pt 24pt. +#define MAPTEXT_PIXELLARI(text) {"[##text]"} + +/// Standard size (ie: normal runechat) - Size options: 6pt 12pt 18pt. +#define MAPTEXT_GRAND9K(text) {"[##text]"} + +/// Small size. (ie: context subtooltips, spell delays) - Size options: 12pt 24pt. +#define MAPTEXT_TINY_UNICODE(text) {"[##text]"} + +/// Smallest size. (ie: whisper runechat) - Size options: 6pt 12pt 18pt. +#define MAPTEXT_SPESSFONT(text) {"[##text]"} + +/** + * Prepares a text to be used for maptext, using a variable size font. + * + * More flexible but doesn't scale pixel perfect to BYOND icon resolutions. + * (May be blurry.) Can use any size in pt or px. + * + * You MUST Specify the size when using the macro + * For example: MAPTEXT_VCR_OSD_MONO("Some large maptext here") + */ +/// Prepares a text to be used for maptext, using a variable size font. +/// Variable size font. More flexible but doesn't scale pixel perfect to BYOND icon resolutions. (May be blurry.) Can use any size in pt or px. #define MAPTEXT_VCR_OSD_MONO(text) {"[##text]"} /// Macro from Lummox used to get height from a MeasureText proc. diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm index 89976c498422d..6187a67825a47 100644 --- a/code/__DEFINES/tgs.dm +++ b/code/__DEFINES/tgs.dm @@ -1,6 +1,6 @@ // tgstation-server DMAPI -#define TGS_DMAPI_VERSION "6.5.0" +#define TGS_DMAPI_VERSION "6.5.3" // All functions and datums outside this document are subject to change with any version and should not be relied on. @@ -154,7 +154,7 @@ #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]. + * Call this as late as possible in [world/proc/Reboot] (BEFORE ..()). */ /world/proc/TgsReboot() return diff --git a/code/__DEFINES/time.dm b/code/__DEFINES/time.dm index 64955e4a56946..00a85d6199510 100644 --- a/code/__DEFINES/time.dm +++ b/code/__DEFINES/time.dm @@ -4,6 +4,9 @@ ///displays the current time into the round, with a lot of extra code just there for ensuring it looks okay after an entire day passes #define ROUND_TIME(...) ( "[world.time - SSticker.round_start_time > MIDNIGHT_ROLLOVER ? "[round((world.time - SSticker.round_start_time)/MIDNIGHT_ROLLOVER)]:[worldtime2text()]" : worldtime2text()]" ) +///Returns the time that has passed since the game started +#define STATION_TIME_PASSED(...) (world.time - SSticker.round_start_time) + /// Define that just has the current in-universe year for use in whatever context you might want to display that in. (For example, 2022 -> 2562 given a 540 year offset) #define CURRENT_STATION_YEAR (GLOB.year_integer + STATION_YEAR_OFFSET) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 91c2c365149b4..4af9f4396be59 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -115,7 +115,11 @@ #define HAS_TRAIT_NOT_FROM(target, trait, source) (HAS_TRAIT(target, trait) && (length(target._status_traits[trait] - source) > 0)) /// Returns a list of trait sources for this trait. Only useful for wacko cases and internal futzing /// You should not be using this -#define GET_TRAIT_SOURCES(target, trait) target._status_traits?[trait] || list() +#define GET_TRAIT_SOURCES(target, trait) (target._status_traits?[trait] || list()) +/// Returns the amount of sources for a trait. useful if you don't want to have a "thing counter" stuck around all the time +#define COUNT_TRAIT_SOURCES(target, trait) length(GET_TRAIT_SOURCES(target, trait)) +/// A simple helper for checking traits in a mob's mind +#define HAS_MIND_TRAIT(target, trait) (HAS_TRAIT(target, trait) || (target.mind ? HAS_TRAIT(target.mind, trait) : FALSE)) /* Remember to update _globalvars/traits.dm if you're adding/removing/renaming traits. @@ -138,8 +142,14 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #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" +/// Apply this to make a mob not dense, and remove it when you want it to no longer make them undense, other sorces of undesity will still apply. Always define a unique source when adding a new instance of this! +#define TRAIT_UNDENSE "undense" +/// Expands our FOV by 30 degrees if restricted +#define TRAIT_EXPANDED_FOV "expanded_fov" /// Doesn't miss attacks #define TRAIT_PERFECT_ATTACKER "perfect_attacker" +///Recolored by item/greentext +#define TRAIT_GREENTEXT_CURSED "greentext_curse" #define TRAIT_INCAPACITATED "incapacitated" /// In some kind of critical condition. Is able to succumb. #define TRAIT_CRITICAL_CONDITION "critical-condition" @@ -179,11 +189,19 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_GUN_NATURAL "gunnatural" /// Causes death-like unconsciousness #define TRAIT_DEATHCOMA "deathcoma" +/// The mob has the stasis effect. +/// Does nothing on its own, applied via status effect. +#define TRAIT_STASIS "in_stasis" /// Makes the owner appear as dead to most forms of medical examination #define TRAIT_FAKEDEATH "fakedeath" #define TRAIT_DISFIGURED "disfigured" +/// "Magic" trait that blocks the mob from moving or interacting with anything. Used for transient stuff like mob transformations or incorporality in special cases. +/// Will block movement, `Life()` (!!!), and other stuff based on the mob. +#define TRAIT_NO_TRANSFORM "block_transformations" /// Tracks whether we're gonna be a baby alien's mummy. #define TRAIT_XENO_HOST "xeno_host" +/// This mob is immune to stun causing status effects and stamcrit. +/// Prefer to use [/mob/living/proc/check_stun_immunity] over checking for this trait exactly. #define TRAIT_STUNIMMUNE "stun_immunity" #define TRAIT_BATON_RESISTANCE "baton_resistance" /// Anti Dual-baton cooldown bypass exploit. @@ -212,9 +230,15 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_RESISTLOWPRESSURE "resist_low_pressure" /// This human is immune to the effects of being exploded. (ex_act) #define TRAIT_BOMBIMMUNE "bomb_immunity" +/// Immune to being irradiated #define TRAIT_RADIMMUNE "rad_immunity" -#define TRAIT_GENELESS "geneless" +/// This mob won't get gibbed by nukes going off +#define TRAIT_NUKEIMMUNE "nuke_immunity" +/// Can't be given viruses #define TRAIT_VIRUSIMMUNE "virus_immunity" +/// Reduces the chance viruses will spread to this mob, and if the mob has a virus, slows its advancement +#define TRAIT_VIRUS_RESISTANCE "virus_resistance" +#define TRAIT_GENELESS "geneless" #define TRAIT_PIERCEIMMUNE "pierce_immunity" #define TRAIT_NODISMEMBER "dismember_immunity" #define TRAIT_NOFIRE "nonflammable" @@ -222,17 +246,50 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Prevents plasmamen from self-igniting if only their helmet is missing #define TRAIT_NOSELFIGNITION_HEAD_ONLY "no_selfignition_head_only" #define TRAIT_NOGUNS "no_guns" -///This carbon doesn't get hungry +/// Species with this trait are genderless +#define TRAIT_AGENDER "agender" +/// Species with this trait have a blood clan mechanic +#define TRAIT_BLOOD_CLANS "blood_clans" +/// Species with this trait have markings (this SUCKS, remove this later in favor of bodypart overlays) +#define TRAIT_HAS_MARKINGS "has_markings" +/// Species with this trait use skin tones for coloration +#define TRAIT_USES_SKINTONES "uses_skintones" +/// Species with this trait use mutant colors for coloration +#define TRAIT_MUTANT_COLORS "mutcolors" +/// Species with this trait have mutant colors that cannot be chosen by the player, nor altered ingame by external means +#define TRAIT_FIXED_MUTANT_COLORS "fixed_mutcolors" +/// Species with this trait have a haircolor that cannot be chosen by the player, nor altered ingame by external means +#define TRAIT_FIXED_HAIRCOLOR "fixed_haircolor" +/// Humans with this trait won't get bloody hands, nor bloody feet +#define TRAIT_NO_BLOOD_OVERLAY "no_blood_overlay" +/// Humans with this trait cannot have underwear +#define TRAIT_NO_UNDERWEAR "no_underwear" +/// This carbon doesn't show an overlay when they have no brain +#define TRAIT_NO_DEBRAIN_OVERLAY "no_debrain_overlay" +/// Humans with this trait cannot get augmentation surgery +#define TRAIT_NO_AUGMENTS "no_augments" +/// This carbon doesn't get hungry #define TRAIT_NOHUNGER "no_hunger" -///This carbon doesn't bleed +/// This carbon doesn't bleed #define TRAIT_NOBLOOD "noblood" -///This carbon doesn't show an overlay when they have no brain -#define TRAIT_NO_DEBRAIN_OVERLAY "no_debrain_overlay" -#define TRAIT_NOMETABOLISM "no_metabolism" -// Use when you want a mob to be able to metabolize plasma temporarily (e.g. plasma fixation disease symptom) -#define TRAIT_PLASMA_LOVER_METABOLISM "plasma_lover_metabolism" +/// This just means that the carbon will always have functional liverless metabolism +#define TRAIT_LIVERLESS_METABOLISM "liverless_metabolism" +/// Humans with this trait cannot be turned into zombies +#define TRAIT_NO_ZOMBIFY "no_zombify" +/// Carbons with this trait can't have their DNA copied by diseases nor changelings +#define TRAIT_NO_DNA_COPY "no_dna_copy" +/// Carbons with this trait can eat blood to regenerate their own blood volume, instead of injecting it +#define TRAIT_DRINKS_BLOOD "drinks_blood" +/// Mob is immune to clone (cellular) damage #define TRAIT_NOCLONELOSS "no_cloneloss" +/// Mob is immune to toxin damage #define TRAIT_TOXIMMUNE "toxin_immune" +/// Mob is immune to oxygen damage, does not need to breathe +#define TRAIT_NOBREATH "no_breath" +/// Mob is currently disguised as something else (like a morph being another mob or an object). Holds a reference to the thing that applied the trait. +#define TRAIT_DISGUISED "disguised" +/// Use when you want a mob to be able to metabolize plasma temporarily (e.g. plasma fixation disease symptom) +#define TRAIT_PLASMA_LOVER_METABOLISM "plasma_lover_metabolism" #define TRAIT_EASYDISMEMBER "easy_dismember" #define TRAIT_LIMBATTACHMENT "limb_attach" #define TRAIT_NOLIMBDISABLE "no_limb_disable" @@ -246,15 +303,24 @@ 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" -#define TRAIT_NOBREATH "no_breath" -#define TRAIT_ANTIMAGIC "anti_magic" +/// The mob is holy and resistance to cult magic #define TRAIT_HOLY "holy" +/// This mob is antimagic, and immune to spells / cannot cast spells +#define TRAIT_ANTIMAGIC "anti_magic" /// This allows a person who has antimagic to cast spells without getting blocked #define TRAIT_ANTIMAGIC_NO_SELFBLOCK "anti_magic_no_selfblock" +/// This mob recently blocked magic with some form of antimagic +#define TRAIT_RECENTLY_BLOCKED_MAGIC "recently_blocked_magic" +/// The user can do things like use magic staffs without penalty +#define TRAIT_MAGICALLY_GIFTED "magically_gifted" +/// This object innately spawns with fantasy variables already applied (the magical component is given to it on initialize), and thus we never want to give it the component again. +#define TRAIT_INNATELY_FANTASTICAL_ITEM "innately_fantastical_item" #define TRAIT_DEPRESSION "depression" #define TRAIT_BLOOD_DEFICIENCY "blood_deficiency" #define TRAIT_JOLLY "jolly" #define TRAIT_NOCRITDAMAGE "no_crit" +///Added to mob or mind, changes the icons of the fish shown in the minigame UI depending on the possible reward. +#define TRAIT_REVEAL_FISH "reveal_fish" /// 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 "noslip_water" @@ -266,11 +332,15 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Stops all slipping and sliding from ocurring #define TRAIT_NO_SLIP_ALL "noslip_all" +/// Unlinks gliding from movement speed, meaning that there will be a delay between movements rather than a single move movement between tiles +#define TRAIT_NO_GLIDE "no_glide" + #define TRAIT_NODEATH "nodeath" #define TRAIT_NOHARDCRIT "nohardcrit" #define TRAIT_NOSOFTCRIT "nosoftcrit" #define TRAIT_MINDSHIELD "mindshield" #define TRAIT_DISSECTED "dissected" +#define TRAIT_SURGICALLY_ANALYZED "surgically_analyzed" /// Lets the user succumb even if they got NODEATH #define TRAIT_SUCCUMB_OVERRIDE "succumb_override" /// Can hear observers @@ -305,6 +375,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define IGNORING_GRAVITY_NEGATION "ignoring_gravity_negation" /// We have some form of forced gravity acting on us #define TRAIT_FORCED_GRAVITY "forced_gravity" +/// Makes whispers clearly heard from seven tiles away, the full hearing range +#define TRAIT_GOOD_HEARING "good_hearing" +/// Allows you to hear speech through walls +#define TRAIT_XRAY_HEARING "xray_hearing" /// Lets us scan reagents #define TRAIT_REAGENT_SCANNER "reagent_scanner" @@ -314,6 +388,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_WEB_WEAVER "web_weaver" /// Can navigate the web without getting stuck #define TRAIT_WEB_SURFER "web_surfer" +/// A web is being spun on this turf presently +#define TRAIT_SPINNING_WEB_TURF "spinning_web_turf" #define TRAIT_ABDUCTOR_TRAINING "abductor-training" #define TRAIT_ABDUCTOR_SCIENTIST_TRAINING "abductor-scientist-training" #define TRAIT_SURGEON "surgeon" @@ -357,6 +433,12 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_HYPERSPACED "hyperspaced" ///Gives the movable free hyperspace movement without being pulled during shuttle transit #define TRAIT_FREE_HYPERSPACE_MOVEMENT "free_hyperspace_movement" +///Lets the movable move freely in the soft-cordon area of transit space, which would otherwise teleport them away just before they got to see the true cordon +#define TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT "free_hyperspace_softcordon_movement" +///Deletes the object upon being dumped into space, usually from exiting hyperspace. Useful if you're spawning in a lot of stuff for hyperspace events that dont need to flood the entire game +#define TRAIT_DEL_ON_SPACE_DUMP "del_on_hyperspace_leave" +/// We can walk up or around cliffs, or at least we don't fall off of it +#define TRAIT_CLIFF_WALKER "cliff_walker" /// Gets double arcade prizes #define TRAIT_GAMERGOD "gamer-god" #define TRAIT_GIANT "giant" @@ -486,6 +568,19 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_HATED_BY_DOGS "hated_by_dogs" /// Mobs with this trait will not be immobilized when held up #define TRAIT_NOFEAR_HOLDUPS "no_fear_holdup" +/// Mob has gotten an armor buff from adamantine extract +#define TRAIT_ADAMANTINE_EXTRACT_ARMOR "adamantine_extract_armor" +/// Mobs with this trait won't be able to dual wield guns. +#define TRAIT_NO_GUN_AKIMBO "no_gun_akimbo" + +/// Projectile with this trait will always hit the defined zone of a struck living mob. +#define TRAIT_ALWAYS_HIT_ZONE "always_hit_zone" + +/// Mobs with this trait do care about a few grisly things, such as digging up graves. They also really do not like bringing people back to life or tending wounds, but love autopsies and amputations. +#define TRAIT_MORBID "morbid" + +/// Whether or not the user is in a MODlink call, prevents making more calls +#define TRAIT_IN_CALL "in_call" // METABOLISMS // Various jobs on the station have historically had better reactions @@ -503,6 +598,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_PRETENDER_ROYAL_METABOLISM "pretender_royal_metabolism" #define TRAIT_BALLMER_SCIENTIST "ballmer_scientist" #define TRAIT_MAINTENANCE_METABOLISM "maintenance_metabolism" +#define TRAIT_CORONER_METABOLISM "coroner_metabolism" //LUNG TRAITS /// Lungs always breathe normally when in vacuum/space. @@ -529,7 +625,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_WINE_TASTER "wine_taster" #define TRAIT_BONSAI "bonsai" #define TRAIT_LIGHTBULB_REMOVER "lightbulb_remover" -#define TRAIT_KNOW_CYBORG_WIRES "know_cyborg_wires" +#define TRAIT_KNOW_ROBO_WIRES "know_robo_wires" #define TRAIT_KNOW_ENGI_WIRES "know_engi_wires" #define TRAIT_ENTRAILS_READER "entrails_reader" #define TRAIT_SABRAGE_PRO "sabrage_pro" @@ -555,6 +651,13 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_VOIDSTORM_IMMUNE "voidstorm_immune" #define TRAIT_WEATHER_IMMUNE "weather_immune" //Immune to ALL weather effects. +/// Cannot be grabbed by goliath tentacles +#define TRAIT_TENTACLE_IMMUNE "tentacle_immune" +/// Currently under the effect of overwatch +#define TRAIT_OVERWATCHED "watcher_overwatched" +/// Cannot be targetted by watcher overwatch +#define TRAIT_OVERWATCH_IMMUNE "overwatch_immune" + //non-mob traits /// Used for limb-based paralysis, where replacing the limb will fix it. #define TRAIT_PARALYSIS "paralysis" @@ -563,6 +666,20 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// This movable atom has the explosive block element #define TRAIT_BLOCKING_EXPLOSIVES "blocking_explosives" +///Lava will be safe to cross while it has this trait. +#define TRAIT_LAVA_STOPPED "lava_stopped" +///Chasms will be safe to cross while they've this trait. +#define TRAIT_CHASM_STOPPED "chasm_stopped" +///The effects of the immerse element will be halted while this trait is present. +#define TRAIT_IMMERSE_STOPPED "immerse_stopped" +/// The effects of hyperspace drift are blocked when the tile has this trait +#define TRAIT_HYPERSPACE_STOPPED "hyperspace_stopped" + +///Turf slowdown will be ignored when this trait is added to a turf. +#define TRAIT_TURF_IGNORE_SLOWDOWN "turf_ignore_slowdown" +///Mobs won't slip on a wet turf while it has this trait +#define TRAIT_TURF_IGNORE_SLIPPERY "turf_ignore_slippery" + /// Mobs with this trait can't send the mining shuttle console when used outside the station itself #define TRAIT_FORBID_MINING_SHUTTLE_CONSOLE_OUTSIDE_STATION "forbid_mining_shuttle_console_outside_station" @@ -620,12 +737,22 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_FISH_SAFE_STORAGE "fish_case" /// Stuff that can go inside fish cases #define TRAIT_FISH_CASE_COMPATIBILE "fish_case_compatibile" +/// If the item can be used as a bit. +#define TRAIT_FISHING_BAIT "fishing_bait" +/// The quality of the bait. It influences odds of catching fish +#define TRAIT_BASIC_QUALITY_BAIT "baic_quality_bait" +#define TRAIT_GOOD_QUALITY_BAIT "good_quality_bait" +#define TRAIT_GREAT_QUALITY_BAIT "great_quality_bait" +/// Baits with this trait will ignore bait preferences and related fish traits. +#define OMNI_BAIT_TRAIT "omni_bait" /// Plants that were mutated as a result of passive instability, not a mutation threshold. #define TRAIT_PLANT_WILDMUTATE "wildmutation" /// If you hit an APC with exposed internals with this item it will try to shock you #define TRAIT_APC_SHOCKING "apc_shocking" /// Properly wielded two handed item #define TRAIT_WIELDED "wielded" +/// A transforming item that is actively extended / transformed +#define TRAIT_TRANSFORM_ACTIVE "active_transform" /// Buckling yourself to objects with this trait won't immobilize you #define TRAIT_NO_IMMOBILIZE "no_immobilize" /// Prevents stripping this equipment @@ -642,9 +769,12 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_CUSTOM_TAP_SOUND "no_tap_sound" /// Makes the feedback message when someone else is putting this item on you more noticeable #define TRAIT_DANGEROUS_OBJECT "dangerous_object" +/// determines whether or not objects are haunted and teleport/attack randomly +#define TRAIT_HAUNTED "haunted" //quirk traits #define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance" +#define TRAIT_HEAVY_DRINKER "heavy_drinker" #define TRAIT_AGEUSIA "ageusia" #define TRAIT_HEAVY_SLEEPER "heavy_sleeper" #define TRAIT_NIGHT_VISION "night_vision" @@ -656,7 +786,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_SELF_AWARE "self_aware" #define TRAIT_FREERUNNING "freerunning" #define TRAIT_SKITTISH "skittish" -#define TRAIT_POOR_AIM "poor_aim" #define TRAIT_PROSOPAGNOSIA "prosopagnosia" #define TRAIT_TAGGER "tagger" #define TRAIT_PHOTOGRAPHER "photographer" @@ -675,6 +804,14 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_SMOKER "smoker" #define TRAIT_POSTERBOY "poster_boy" #define TRAIT_THROWINGARM "throwing_arm" +#define TRAIT_SETTLER "settler" + +///if the atom has a sticker attached to it +#define TRAIT_STICKERED "stickered" + +// Debug traits +/// This object has light debugging tools attached to it +#define TRAIT_LIGHTING_DEBUGGED "lighting_debugged" /// 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" @@ -755,9 +892,30 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// For clarity, this trait should always be associated/tied to a reference to the mob that suicided- not anything else. #define TRAIT_SUICIDED "committed_suicide" +/// Trait given to a living mob to prevent wizards from making it immortal +#define TRAIT_PERMANENTLY_MORTAL "permanently_mortal" + ///Trait given to a mob with a ckey currently in a temporary body, allowing people to know someone will re-enter the round later. #define TRAIT_MIND_TEMPORARILY_GONE "temporarily_gone" +/// Similar trait given to temporary bodies inhabited by players +#define TRAIT_TEMPORARY_BODY "temporary_body" + +/// Trait given to mechs that can have orebox functionality on movement +#define TRAIT_OREBOX_FUNCTIONAL "orebox_functional" + +///fish traits +#define TRAIT_RESIST_EMULSIFY "resist_emulsify" +#define TRAIT_FISH_SELF_REPRODUCE "fish_self_reproduce" +#define TRAIT_FISH_NO_MATING "fish_no_mating" +#define TRAIT_YUCKY_FISH "yucky_fish" +#define TRAIT_FISH_TOXIN_IMMUNE "fish_toxin_immune" +#define TRAIT_FISH_CROSSBREEDER "fish_crossbreeder" +#define TRAIT_FISH_AMPHIBIOUS "fish_amphibious" +///Trait needed for the lubefish evolution +#define TRAIT_FISH_FED_LUBE "fish_fed_lube" +#define TRAIT_FISH_NO_HUNGER "fish_no_hunger" + // common trait sources #define TRAIT_GENERIC "generic" #define UNCONSCIOUS_TRAIT "unconscious" @@ -795,6 +953,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define STATUS_EFFECT_TRAIT "status-effect" /// A trait given by a specific status effect (not sure why we need both but whatever!) #define TRAIT_STATUS_EFFECT(effect_id) "[effect_id]-trait" +/// Trait from light debugging +#define LIGHT_DEBUG_TRAIT "light-debug" #define CLOTHING_TRAIT "clothing" #define HELMET_TRAIT "helmet" @@ -828,23 +988,31 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define SUIT_TRAIT "suit" /// Trait associated to lying down (having a [lying_angle] of a different value than zero). #define LYING_DOWN_TRAIT "lying-down" +/// A trait gained by leaning against a wall +#define LEANING_TRAIT "leaning" /// Trait associated to lacking electrical power. #define POWER_LACK_TRAIT "power-lack" /// Trait associated to lacking motor movement #define MOTOR_LACK_TRAIT "motor-lack" /// Trait associated with mafia #define MAFIA_TRAIT "mafia" +/// Trait associated with ctf +#define CTF_TRAIT "ctf" /// Trait associated with highlander #define HIGHLANDER_TRAIT "highlander" /// Trait given from playing pretend with baguettes #define SWORDPLAY_TRAIT "swordplay" /// Trait given by being recruited as a nuclear operative #define NUKE_OP_MINION_TRAIT "nuke-op-minion" +/// Trait given by mech equipment +#define TRAIT_MECH_EQUIPMENT(equipment_type) "mech_equipment_[equipment_type]" +/// Trait given to you by shapeshifting +#define SHAPESHIFT_TRAIT "shapeshift_trait" ///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 +/// Stops someone from splashing their reagent_container on an object with this trait #define TRAIT_DO_NOT_SPLASH "do_not_splash" /// Marks an atom when the cleaning of it is first started, so that the cleaning overlay doesn't get removed prematurely #define TRAIT_CURRENTLY_CLEANING "currently_cleaning" @@ -852,6 +1020,16 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_CHASM_DESTROYED "chasm_destroyed" /// Trait from being under the floor in some manner #define TRAIT_UNDERFLOOR "underfloor" +/// If the movable shouldn't be reflected by mirrors. +#define TRAIT_NO_MIRROR_REFLECTION "no_mirror_reflection" +/// If this movable is currently treading in a turf with the immerse element. +#define TRAIT_IMMERSED "immersed" +/** + * With this, the immerse overlay will give the atom its own submersion visual overlay + * instead of one that's also shared with other movables, thus making editing its appearance possible. + */ +#define TRAIT_UNIQUE_IMMERSE "unique_immerse" + // unique trait sources, still defines #define EMP_TRAIT "emp_trait" @@ -859,7 +1037,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define CHANGELING_DRAIN "drain" /// changelings with this trait can no longer talk over the hivemind #define CHANGELING_HIVEMIND_MUTE "ling_mute" -#define HIGHLANDER "highlander" #define TRAIT_HULK "hulk" #define STASIS_MUTE "stasis" #define GENETICS_SPELL "genetics_spell" @@ -868,6 +1045,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define HYPNOCHAIR_TRAIT "hypnochair" #define FLASHLIGHT_EYES "flashlight_eyes" #define IMPURE_OCULINE "impure_oculine" +#define HAUNTIUM_REAGENT_TRAIT "hauntium_reagent_trait" #define TRAIT_SANTA "santa" #define SCRYING_ORB "scrying-orb" #define ABDUCTOR_ANTAGONIST "abductor-antagonist" @@ -898,12 +1076,21 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define SPECIES_FLIGHT_TRAIT "species-flight" #define FROSTMINER_ENRAGE_TRAIT "frostminer-enrage" #define NO_GRAVITY_TRAIT "no-gravity" +/// A trait gained from a mob's leap action, like the leaper #define LEAPING_TRAIT "leaping" +/// A trait gained from a mob's vanish action, like the herophant +#define VANISHING_TRAIT "vanishing" +/// A trait gained from a mob's swoop action, like the ash drake +#define SWOOPING_TRAIT "swooping" +/// A trait gained from a mob's mimic ability, like the mimic +#define MIMIC_TRAIT "mimic" +#define SHRUNKEN_TRAIT "shrunken" #define LEAPER_BUBBLE_TRAIT "leaper-bubble" #define DNA_VAULT_TRAIT "dna_vault" /// sticky nodrop sounds like a bad soundcloud rapper's name #define STICKY_NODROP "sticky-nodrop" #define SKILLCHIP_TRAIT "skillchip" +#define SKILL_TRAIT "skill" #define BUSY_FLOORBOT_TRAIT "busy-floorbot" #define PULLED_WHILE_SOFTCRIT_TRAIT "pulled-while-softcrit" #define LOCKED_BORG_TRAIT "locked-borg" @@ -927,6 +1114,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define PAI_FOLDED "pai-folded" /// Trait applied to brain mobs when they lack external aid for locomotion, such as being inside a mech. #define BRAIN_UNAIDED "brain-unaided" +/// Trait applied to a mob when it gets a required "operational datum" (components/elements). Sends out the source as the type of the element. +#define TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM "element-required" /// Trait applied by MODsuits. #define MOD_TRAIT "mod" /// Trait applied by element @@ -943,8 +1132,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define BEAUTY_ELEMENT_TRAIT "beauty_element" #define MOOD_DATUM_TRAIT "mood_datum" #define DRONE_SHY_TRAIT "drone_shy" -/// Pacifism trait given by stabilized light pink extracts. -#define STABILIZED_LIGHT_PINK_TRAIT "stabilized_light_pink" +/// Trait given by stabilized light pink extracts +#define STABILIZED_LIGHT_PINK_EXTRACT_TRAIT "stabilized_light_pink" +/// Trait given by adamantine extracts +#define ADAMANTINE_EXTRACT_TRAIT "adamantine_extract" /// Given by the multiple_lives component to the previous body of the mob upon death. #define EXPIRED_LIFE_TRAIT "expired_life" /// Trait given to an atom/movable when they orbit something. @@ -955,7 +1146,16 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define CHOKING_TRAIT "choking_trait" /// Trait given by hallucinations #define HALLUCINATION_TRAIT "hallucination_trait" - +/// Trait given by simple/basic mob death +#define BASIC_MOB_DEATH_TRAIT "basic_mob_death" +/// Trait given by your current speed +#define SPEED_TRAIT "speed_trait" +/// Trait given to mobs that have been autopsied +#define AUTOPSY_TRAIT "autopsy_trait" +/// Trait given by [/datum/status_effect/blessing_of_insanity] +#define MAD_WIZARD_TRAIT "mad_wizard_trait" +/// Isn't attacked harmfully by blob structures +#define TRAIT_BLOB_ALLY "blob_ally" /** * Trait granted by [/mob/living/carbon/Initialize] and @@ -995,6 +1195,12 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define STATION_TRAIT_BIRTHDAY "station_trait_birthday" #define STATION_TRAIT_SPIDER_INFESTATION "station_trait_spider_infestation" #define STATION_TRAIT_REVOLUTIONARY_TRASHING "station_trait_revolutionary_trashing" +#define STATION_TRAIT_RADIOACTIVE_NEBULA "station_trait_radioactive_nebula" +#define STATION_TRAIT_FORESTED "station_trait_forested" +#define STATION_TRAIT_VENDING_SHORTAGE "station_trait_vending_shortage" +#define STATION_TRAIT_MEDBOT_MANIA "station_trait_medbot_mania" +#define STATION_TRAIT_LOANER_SHUTTLE "station_trait_loaner_shuttle" +#define STATION_TRAIT_SHUTTLE_SALE "station_trait_shuttle_sale" ///From the market_crash event #define MARKET_CRASH_EVENT_TRAIT "crashed_market_event" @@ -1005,6 +1211,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_MAGNETIC_ID_CARD "magnetic_id_card" /// ID cards with this trait have special appraisal text. #define TRAIT_TASTEFULLY_THICK_ID_CARD "impressive_very_nice" +/// things with this trait are treated as having no access in /obj/proc/check_access(obj/item) +#define TRAIT_ALWAYS_NO_ACCESS "alwaysnoaccess" /// Traits granted to items due to their chameleon properties. #define CHAMELEON_ITEM_TRAIT "chameleon_item_trait" @@ -1065,7 +1273,15 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_TACKLING_TAILED_DEFENDER "tackling_tailed_defender" /// Is runechat for this atom/movable currently disabled, regardless of prefs or anything? -#define TRAIT_RUNECHAT_HIDDEN "runechat_hudden" +#define TRAIT_RUNECHAT_HIDDEN "runechat_hidden" + +/// the object has a label applied +#define TRAIT_HAS_LABEL "labeled" + +///coming from a fish trait datum. +#define FISH_TRAIT_DATUM "fish_trait_datum" +///coming from a fish evolution datum +#define FISH_EVOLUTION "fish_evolution" /// some trait sorces dirived from bodyparts BODYPART_TRAIT is generic. #define BODYPART_TRAIT "bodypart" @@ -1088,3 +1304,14 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define SPEAKING_FROM_TONGUE "tongue" ///trait source that sign language should use #define SPEAKING_FROM_HANDS "hands" + +///Trait given by /datum/component/germ_sensitive +#define TRAIT_GERM_SENSITIVE "germ_sensitive" + +/// This atom can have spells cast from it if a mob is within it +/// This means the "caster" of the spell is changed to the mob's loc +/// Note this doesn't mean all spells are guaranteed to work or the mob is guaranteed to cast +#define TRAIT_CASTABLE_LOC "castable_loc" + +///Trait given by /datum/element/relay_attacker +#define TRAIT_RELAYING_ATTACKER "relaying_attacker" diff --git a/code/__DEFINES/tram.dm b/code/__DEFINES/tram.dm index 8b7ff3a0bac31..a88086b36a5c4 100644 --- a/code/__DEFINES/tram.dm +++ b/code/__DEFINES/tram.dm @@ -26,3 +26,7 @@ #define BIRDSHOT_MAINTENANCE_LEFT 1 #define BRIDSHOT_MAINTENANCE_RIGHT 2 + +/// Tram navigation directions +#define OUTBOUND 1 +#define INBOUND -1 diff --git a/code/__DEFINES/tts.dm b/code/__DEFINES/tts.dm new file mode 100644 index 0000000000000..fd88016408c74 --- /dev/null +++ b/code/__DEFINES/tts.dm @@ -0,0 +1,10 @@ +///TTS preference is disbaled entirely, no sound will be played. +#define TTS_SOUND_OFF "Disabled" +///TTS preference is enabled, and will give full text-to-speech. +#define TTS_SOUND_ENABLED "Enabled" +///TTS preference is set to only play blips of a sound, rather than speech. +#define TTS_SOUND_BLIPS "Blips Only" +///TTS filter to activate start/stop radio clicks on speech. +#define TTS_FILTER_RADIO "radio" +///TTS filter to activate a silicon effect on speech. +#define TTS_FILTER_SILICON "silicon" diff --git a/code/__DEFINES/turfs.dm b/code/__DEFINES/turfs.dm index b0a9e52b48683..7b972abc20cb7 100644 --- a/code/__DEFINES/turfs.dm +++ b/code/__DEFINES/turfs.dm @@ -15,8 +15,8 @@ #define RECT_TURFS(H_RADIUS, V_RADIUS, CENTER) \ block( \ - locate(max(CENTER.x-(H_RADIUS),1), max(CENTER.y-(V_RADIUS),1), CENTER.z), \ - locate(min(CENTER.x+(H_RADIUS),world.maxx), min(CENTER.y+(V_RADIUS),world.maxy), CENTER.z) \ + locate(max((CENTER).x-(H_RADIUS),1), max((CENTER).y-(V_RADIUS),1), (CENTER).z), \ + locate(min((CENTER).x+(H_RADIUS),world.maxx), min((CENTER).y+(V_RADIUS),world.maxy), (CENTER).z) \ ) ///Returns all turfs in a zlevel diff --git a/code/__DEFINES/visual_helpers.dm b/code/__DEFINES/visual_helpers.dm index 204cc8ba03afb..bb54c5d6b0b7a 100644 --- a/code/__DEFINES/visual_helpers.dm +++ b/code/__DEFINES/visual_helpers.dm @@ -11,5 +11,15 @@ base_pixel_x = x; \ base_pixel_y = y; +#define SET_BASE_VISUAL_PIXEL(w, z) \ + pixel_w = w; \ + base_pixel_w = w; \ + pixel_z = z; \ + base_pixel_z = z; + +#define _SET_BASE_PIXEL_VISUAL_NO_OFFSET(w, z) \ + base_pixel_z = w; \ + base_pixel_z = z; + /// Much like [SET_BASE_PIXEL], except it will not effect pixel offsets in mapping programs #define SET_BASE_PIXEL_NOMAP(x, y) MAP_SWITCH(SET_BASE_PIXEL(x, y), _SET_BASE_PIXEL_NO_OFFSET(x, y)) diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index 7770c63d1d0e0..1cc9025b82164 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -98,6 +98,7 @@ #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_TEST_MATRIXES "test_matrixes" #define VV_HK_ADD_AI "add_ai" #define VV_HK_ARMOR_MOD "mod_obj_armor" @@ -113,6 +114,8 @@ // /mob #define VV_HK_GIB "gib" +#define VV_HK_GIVE_MOB_ACTION "give_mob_action" +#define VV_HK_REMOVE_MOB_ACTION "remove_mob_action" #define VV_HK_GIVE_SPELL "give_spell" #define VV_HK_REMOVE_SPELL "remove_spell" #define VV_HK_GIVE_DISEASE "give_disease" @@ -148,6 +151,7 @@ #define VV_HK_MOD_QUIRKS "quirkmod" #define VV_HK_SET_SPECIES "setspecies" #define VV_HK_PURRBATION "purrbation" +#define VV_HK_APPLY_DNA_INFUSION "apply_dna_infusion" // misc #define VV_HK_SPACEVINE_PURGE "spacevine_purge" @@ -159,3 +163,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/wires.dm b/code/__DEFINES/wires.dm index 85b1d398e063f..6f618ac824032 100644 --- a/code/__DEFINES/wires.dm +++ b/code/__DEFINES/wires.dm @@ -1,3 +1,7 @@ +/// from base of /datum/wires/proc/cut : (wire) +#define COMSIG_CUT_WIRE(wire) "cut_wire [wire]" +#define COMSIG_MEND_WIRE(wire) "mend_wire [wire]" + //retvals for attempt_wires_interaction #define WIRE_INTERACTION_FAIL 0 #define WIRE_INTERACTION_SUCCESSFUL 1 @@ -5,6 +9,8 @@ #define WIRE_ACCEPT "Scan Success" #define WIRE_ACTIVATE "Activate" +#define WIRE_LAUNCH "Launch" +#define WIRE_SAFETIES "Safeties" #define WIRE_AGELIMIT "Age Limit" #define WIRE_AI "AI Connection" #define WIRE_ALARM "Alarm" @@ -12,6 +18,7 @@ #define WIRE_BACKUP1 "Auxiliary Power 1" #define WIRE_BACKUP2 "Auxiliary Power 2" #define WIRE_BEACON "Beacon" +#define WIRE_BOLTLIGHT "Bolt Lights" #define WIRE_BOLTS "Bolts" #define WIRE_BOOM "Boom Wire 1" #define WIRE_BOOM2 "Boom Wire 2" @@ -26,7 +33,7 @@ #define WIRE_IDSCAN "ID Scan" #define WIRE_INTERFACE "Interface" #define WIRE_LAWSYNC "AI Law Synchronization" -#define WIRE_LIGHT "Bolt Lights" +#define WIRE_LIGHT "Lights" #define WIRE_LIMIT "Limiter" #define WIRE_LOADCHECK "Load Check" #define WIRE_LOCKDOWN "Lockdown" @@ -55,6 +62,7 @@ #define WIRE_ZAP "High Voltage Circuit" #define WIRE_ZAP1 "High Voltage Circuit 1" #define WIRE_ZAP2 "High Voltage Circuit 2" +#define WIRE_OVERCLOCK "Overclock" // Wire states for the AI #define AI_WIRE_NORMAL 0 diff --git a/code/__DEFINES/wounds.dm b/code/__DEFINES/wounds.dm index 5e1a44a1c24fe..2d0cc5e079e79 100644 --- a/code/__DEFINES/wounds.dm +++ b/code/__DEFINES/wounds.dm @@ -1,4 +1,3 @@ - // ~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 @@ -13,6 +12,10 @@ /// set wound_bonus on an item or attack to this to disable checking wounding for the attack #define CANT_WOUND -100 +/// If there are multiple possible and valid wounds for the same type and severity, weight will be used to pick among them. See _wound_pregen_data.dm for more details +/// This is used in pick_weight, so use integers +#define WOUND_DEFAULT_WEIGHT 50 + // ~wound severities /// for jokey/meme wounds like stubbed toe, no standard messages/sounds or second winds #define WOUND_SEVERITY_TRIVIAL 0 @@ -22,16 +25,26 @@ /// outright dismemberment of limb #define WOUND_SEVERITY_LOSS 4 +/// A "chronological" list of wound severities, starting at the least severe. +GLOBAL_LIST_INIT(wound_severities_chronological, list( + "[WOUND_SEVERITY_TRIVIAL]", + "[WOUND_SEVERITY_MODERATE]", + "[WOUND_SEVERITY_SEVERE]", + "[WOUND_SEVERITY_CRITICAL]" +)) -// ~wound categories +// ~wound categories: wounding_types /// any brute weapon/attack that doesn't have sharpness. rolls for blunt bone wounds -#define WOUND_BLUNT 1 +#define WOUND_BLUNT "wound_blunt" /// any brute weapon/attack with sharpness = SHARP_EDGED. rolls for slash wounds -#define WOUND_SLASH 2 +#define WOUND_SLASH "wound_slash" /// any brute weapon/attack with sharpness = SHARP_POINTY. rolls for piercing wounds -#define WOUND_PIERCE 3 +#define WOUND_PIERCE "wound_pierce" /// any concentrated burn attack (lasers really). rolls for burning wounds -#define WOUND_BURN 4 +#define WOUND_BURN "wound_burn" + +/// Mainly a define used for wound_pregen_data, if a pregen data instance expects this, it will accept any and all wound types, even none at all +#define WOUND_ALL "wound_all" // ~determination second wind defines @@ -46,31 +59,226 @@ /// While someone has determination in their system, their bleed rate is slightly reduced #define WOUND_DETERMINATION_BLEED_MOD 0.85 -// ~wound global lists -// list in order of highest severity to lowest -GLOBAL_LIST_INIT(global_wound_types, list( - WOUND_BLUNT = list(/datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/moderate), - WOUND_SLASH = list(/datum/wound/slash/critical, /datum/wound/slash/severe, /datum/wound/slash/moderate), - WOUND_PIERCE = list(/datum/wound/pierce/critical, /datum/wound/pierce/severe, /datum/wound/pierce/moderate), - WOUND_BURN = list(/datum/wound/burn/critical, /datum/wound/burn/severe, /datum/wound/burn/moderate), +/// Wounds using this competition mode will remove any wounds of a greater severity than itself in a random wound roll. In most cases, you dont want to use this. +#define WOUND_COMPETITION_OVERPOWER_GREATERS "wound_submit" +/// Wounds using this competition mode will remove any wounds of a lower severity than itself in a random wound roll. Used for ensuring the worse case scenario of a given injury_roll. +#define WOUND_COMPETITION_OVERPOWER_LESSERS "wound_dominate" + +// ~biology defines +// What kind of biology a limb has, and what wounds it can suffer +/// Has absolutely fucking nothing, no wounds +#define BIO_INORGANIC NONE +/// Has bone - allows the victim to suffer T2-T3 bone blunt wounds +#define BIO_BONE (1<<0) +/// Has flesh - allows the victim to suffer fleshy slash pierce and burn wounds +#define BIO_FLESH (1<<1) +/// Has metal - allows the victim to suffer robotic blunt and burn wounds +#define BIO_METAL (1<<2) +/// Is wired internally - allows the victim to suffer electrical wounds (robotic T1-T3 slash/pierce) +#define BIO_WIRED (1<<3) +/// Has bloodflow - can suffer bleeding wounds and can bleed +#define BIO_BLOODED (1<<4) +/// Is connected by a joint - can suffer T1 bone blunt wounds (dislocation) +#define BIO_JOINTED (1<<5) +/// Robotic - can suffer all metal/wired wounds, such as: UNIMPLEMENTED PLEASE UPDATE ONCE SYNTH WOUNDS 9/5/2023 ~Niko +#define BIO_ROBOTIC (BIO_METAL|BIO_WIRED) +/// Has flesh and bone - See BIO_BONE and BIO_FLESH +#define BIO_FLESH_BONE (BIO_BONE|BIO_FLESH) +/// Standard humanoid - can bleed and suffer all flesh/bone wounds, such as: T1-3 slash/pierce/burn/blunt, except dislocations. Think human heads/chests +#define BIO_STANDARD_UNJOINTED (BIO_FLESH_BONE|BIO_BLOODED) +/// Standard humanoid limbs - can bleed and suffer all flesh/bone wounds, such as: T1-3 slash/pierce/burn/blunt. Can also bleed, and be dislocated. Think human arms and legs +#define BIO_STANDARD_JOINTED (BIO_STANDARD_UNJOINTED|BIO_JOINTED) + +// "Where" a specific biostate is within a given limb +// Interior is hard shit, the last line, shit like bones +// Exterior is soft shit, targetted by slashes and pierces (usually), protects exterior +// A limb needs both mangled interior and exterior to be dismembered, but slash/pierce must mangle exterior to attack the interior +// Not having exterior/interior counts as mangled exterior/interior for the purposes of dismemberment +/// The given biostate is on the "interior" of the limb - hard shit, protected by exterior +#define ANATOMY_INTERIOR (1<<0) +/// The given biostate is on the "exterior" of the limb - soft shit, protects interior +#define ANATOMY_EXTERIOR (1<<1) +#define ANATOMY_EXTERIOR_AND_INTERIOR (ANATOMY_EXTERIOR|ANATOMY_INTERIOR) + +/// A assoc list of BIO_ define to EXTERIOR/INTERIOR defines. +/// This is where the interior/exterior state of a given biostate is set. +/// Note that not all biostates are guaranteed to be one of these - and in fact, many are not +/// IMPORTANT NOTE: All keys are stored as text and must be converted via text2num +GLOBAL_LIST_INIT(bio_state_anatomy, list( + "[BIO_WIRED]" = ANATOMY_EXTERIOR, + "[BIO_METAL]" = ANATOMY_INTERIOR, + "[BIO_FLESH]" = ANATOMY_EXTERIOR, + "[BIO_BONE]" = ANATOMY_INTERIOR, )) -// every single type of wound that can be rolled naturally, in case you need to pull a random one -GLOBAL_LIST_INIT(global_all_wound_types, list( - /datum/wound/blunt/critical, - /datum/wound/blunt/severe, - /datum/wound/blunt/moderate, - /datum/wound/slash/critical, - /datum/wound/slash/severe, - /datum/wound/slash/moderate, - /datum/wound/pierce/critical, - /datum/wound/pierce/severe, - /datum/wound/pierce/moderate, - /datum/wound/burn/critical, - /datum/wound/burn/severe, - /datum/wound/burn/moderate, +// Wound series +// A "wound series" is just a family of wounds that logically follow eachother +// Multiple wounds in a single series cannot be on a limb - the highest severity will always be prioritized, and lower ones will be skipped + +/// T1-T3 Bleeding slash wounds. Requires flesh. Can cause bleeding, but doesn't require it. From: slash.dm +#define WOUND_SERIES_FLESH_SLASH_BLEED "wound_series_flesh_slash_bled" +/// T1-T3 Basic blunt wounds. T1 requires jointed, but 2-3 require bone. From: bone.dm +#define WOUND_SERIES_BONE_BLUNT_BASIC "wound_series_bone_blunt_basic" +/// T1-T3 Basic burn wounds. Requires flesh. From: burns.dm +#define WOUND_SERIES_FLESH_BURN_BASIC "wound_series_flesh_burn_basic" +/// T1-T3 Bleeding puncture wounds. Requires flesh. Can cause bleeding, but doesn't require it. From: pierce.dm +#define WOUND_SERIES_FLESH_PUNCTURE_BLEED "wound_series_flesh_puncture_bleed" +/// Generic loss wounds. See loss.dm +#define WOUND_SERIES_LOSS_BASIC "wound_series_loss_basic" + +/// A assoc list of (wound typepath -> wound_pregen_data instance). Every wound should have a pregen data. +GLOBAL_LIST_INIT_TYPED(all_wound_pregen_data, /datum/wound_pregen_data, generate_wound_static_data()) + +/// Constructs [GLOB.all_wound_pregen_data] by iterating through a typecache of pregen data, ignoring abstract types, and instantiating the rest. +/proc/generate_wound_static_data() + RETURN_TYPE(/list/datum/wound_pregen_data) + + var/list/datum/wound_pregen_data/all_pregen_data = list() + + for (var/datum/wound_pregen_data/iterated_path as anything in typecacheof(path = /datum/wound_pregen_data, ignore_root_path = TRUE)) + if (initial(iterated_path.abstract)) + continue + + if (!isnull(all_pregen_data[initial(iterated_path.wound_path_to_generate)])) + stack_trace("pre-existing pregen data for [initial(iterated_path.wound_path_to_generate)] when [iterated_path] was being considered: [all_pregen_data[initial(iterated_path.wound_path_to_generate)]]. \ + this is definitely a bug, and is probably because one of the two pregen data have the wrong wound typepath defined. [iterated_path] will not be instantiated") + + continue + + var/datum/wound_pregen_data/pregen_data = new iterated_path + all_pregen_data[pregen_data.wound_path_to_generate] = pregen_data + + return all_pregen_data + +// A wound series "collection" is merely a way for us to track what is in what series, and what their types are. +// Without this, we have no centralized way to determine what type is in what series outside of iterating over every pregen data. + +/// A branching assoc list of (series -> list(severity -> list(typepath -> weight))). Allows you to say "I want a generic slash wound", +/// then "Of severity 2", and get a wound of that description - via get_corresponding_wound_type() +/// Series: A generic wound_series, such as WOUND_SERIES_BONE_BLUNT_BASIC +/// Severity: Any wounds held within this will be of this severity. +/// Typepath, Weight: Merely a pairing of a given typepath to its weight, held for convenience in pickweight. +GLOBAL_LIST_INIT(wound_series_collections, generate_wound_series_collection()) + +// Series -> severity -> type -> weight +/// Generates [wound_series_collections] by iterating through all pregen_data. Refer to the mentioned list for documentation +/proc/generate_wound_series_collection() + RETURN_TYPE(/list/datum/wound) + + var/list/datum/wound/wound_collection = list() + + for (var/datum/wound/wound_typepath as anything in typecacheof(/datum/wound, FALSE, TRUE)) + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[wound_typepath] + if (!pregen_data) + continue + + if (pregen_data.abstract) + stack_trace("somehow, a abstract wound_pregen_data instance ([pregen_data.type]) was instantiated and made it to generate_wound_series_collection()! \ + i literally have no idea how! please fix this!") + continue + + var/series = pregen_data.wound_series + var/list/datum/wound/series_list = wound_collection[series] + if (isnull(series_list)) + wound_collection[series] = list() + series_list = wound_collection[series] + + var/severity = "[(initial(wound_typepath.severity))]" + var/list/datum/wound/severity_list = series_list[severity] + if (isnull(severity_list)) + series_list[severity] = list() + severity_list = series_list[severity] + + severity_list[wound_typepath] = pregen_data.weight + + return wound_collection + +/// A branching assoc list of (wounding_type -> list(wound_series)). +/// Allows for determining of which wound series are caused by what. +GLOBAL_LIST_INIT(wounding_types_to_series, list( + WOUND_BLUNT = list( + WOUND_SERIES_BONE_BLUNT_BASIC + ), + WOUND_SLASH = list( + WOUND_SERIES_FLESH_SLASH_BLEED, + ), + WOUND_BURN = list( + WOUND_SERIES_FLESH_BURN_BASIC, + ), + WOUND_PUNCTURE = list( + WOUND_SERIES_FLESH_PUNCTURE_BLEED + ), )) +/// Used in get_corresponding_wound_type(): Will pick the highest severity wound out of severity_min and severity_max +#define WOUND_PICK_HIGHEST_SEVERITY 1 +/// Used in get_corresponding_wound_type(): Will pick the lowest severity wound out of severity_min and severity_max +#define WOUND_PICK_LOWEST_SEVERITY 2 + +/** + * Searches through all wounds for any of proper type, series, and biostate, and then returns a single one via pickweight. + * Is able to discern between, say, a flesh slash wound, and a metallic slash wound, and will return the respective one for the provided limb. + * + * The severity_max and severity_pick_mode args mostly exist in case you want a wound in a series that may not have your ideal severity wound, as it lets you + * essentially set a "fallback", where if your ideal wound doesnt exist, it'll still return something, trying to get closest to your ideal severity. + * + * Generally speaking, if you want a critical/severe/moderate wound, you should set severity_min to WOUND_SEVERITY_MODERATE, severity_max to your ideal wound, + * and severity_pick_mode to WOUND_PICK_HIGHEST_SEVERITY - UNLESS you for some reason want the LOWEST severity, in which case you should set + * severity_max to the highest wound you're willing to tolerate, and severity_pick_mode to WOUND_PICK_LOWEST_SEVERITY. + * + * Args: + * * list/wounding_types: A list of wounding_types. Only wounds that accept these wound types will be considered. + * * obj/item/bodypart/part: The limb we are considering. Extremely important for biostates. + * * severity_min: The minimum wound severity we will search for. + * * severity_max = severity_min: The maximum wound severity we will search for. + * * severity_pick_mode = WOUND_PICK_HIGHEST_SEVERITY: The "pick mode" we will use when considering multiple wounds of acceptable severity. See the above defines. + * * random_roll = TRUE: If this is considered a "random" consideration. If true, only wounds that can be randomly generated will be considered. + * * duplicates_allowed = FALSE: If exact duplicates of a given wound on part are tolerated. Useful for simply getting a path and not instantiating. + * * care_about_existing_wounds = TRUE: If we iterate over wounds to see if any are above or at a given wounds severity, and disregard it if any are. Useful for simply getting a path and not instantiating. + * + * Returns: + * A randomly picked wound typepath meeting all the above criteria and being applicable to the part's biotype - or null if there were none. + */ +/proc/get_corresponding_wound_type(list/wounding_types, obj/item/bodypart/part, severity_min, severity_max = severity_min, severity_pick_mode = WOUND_PICK_HIGHEST_SEVERITY, random_roll = TRUE, duplicates_allowed = FALSE, care_about_existing_wounds = TRUE) + RETURN_TYPE(/datum/wound) // note that just because its set to return this doesnt mean its non-nullable + + var/list/wounding_type_list = list() + for (var/wounding_type as anything in wounding_types) + wounding_type_list += GLOB.wounding_types_to_series[wounding_type] + if (!length(wounding_type_list)) + return null + + var/list/datum/wound/paths_to_pick_from = list() + for (var/series as anything in shuffle(wounding_type_list)) + var/list/severity_list = GLOB.wound_series_collections[series] + if (!length(severity_list)) + continue + + var/picked_severity + for (var/severity_text as anything in shuffle(GLOB.wound_severities_chronological)) + var/severity = text2num(severity_text) + if (severity > severity_min || severity < severity_max) + continue + + if (isnull(picked_severity) || ((severity_pick_mode == WOUND_PICK_HIGHEST_SEVERITY && severity > picked_severity) || (severity_pick_mode == WOUND_PICK_LOWEST_SEVERITY && severity < picked_severity))) + picked_severity = severity + + var/list/wound_typepaths = severity_list["[picked_severity]"] + if (!length(wound_typepaths)) + continue + + for (var/datum/wound/iterated_path as anything in wound_typepaths) + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[iterated_path] + if (pregen_data.can_be_applied_to(part, wounding_types, random_roll = random_roll, duplicates_allowed = duplicates_allowed, care_about_existing_wounds = care_about_existing_wounds)) + paths_to_pick_from[iterated_path] = wound_typepaths[iterated_path] + + return pick_weight(paths_to_pick_from) // we found our winners! + +/// Assoc list of biotype -> ideal scar file to be used and grab stuff from. +GLOBAL_LIST_INIT(biotypes_to_scar_file, list( + "[BIO_FLESH]" = FLESH_SCAR_FILE, + "[BIO_BONE]" = BONE_SCAR_FILE +)) // ~burn wound infection defines // Thresholds for infection for burn wounds, once infestation hits each threshold, things get steadily worse @@ -98,40 +306,25 @@ GLOBAL_LIST_INIT(global_all_wound_types, list( // ~mangling defines -// With the wounds pt. 2 update, general dismemberment now requires 2 things for a limb to be dismemberable (bone only creatures just need the second): -// 1. Flesh is mangled: A critical slash or pierce wound on that limb -// 2. Bone is mangled: At least a severe bone wound on that limb -// see [/obj/item/bodypart/proc/get_mangled_state] for more information +// With the wounds pt. 2 update, general dismemberment now requires 2 things for a limb to be dismemberable (exterior/bone only creatures just need the second): +// 1. Exterior is mangled: A critical slash or pierce wound on that limb +// 2. Interior is mangled: At least a severe bone wound on that limb +// Lack of exterior or interior count as mangled exterior/interior respectively +// see [/obj/item/bodypart/proc/get_mangled_state] for more information, as well as GLOB.bio_state_anatomy #define BODYPART_MANGLED_NONE NONE -#define BODYPART_MANGLED_BONE (1<<0) -#define BODYPART_MANGLED_FLESH (1<<1) -#define BODYPART_MANGLED_BOTH (BODYPART_MANGLED_BONE | BODYPART_MANGLED_FLESH) - - -// ~biology defines -// What kind of biology a limb has, and what wounds it can suffer -/// golems and androids, cannot suffer any wounds -#define BIO_INORGANIC NONE -/// skeletons and plasmemes, can only suffer bone wounds, only needs mangled bone to be able to dismember -#define BIO_BONE (1<<0) -/// nothing right now, maybe slimepeople in the future, can only suffer slashing, piercing, and burn wounds -#define BIO_FLESH (1<<1) -/// standard humanoids, can suffer all wounds, needs mangled bone and flesh to dismember. conveniently, what you get when you combine BIO_BONE and BIO_FLESH -#define BIO_FLESH_BONE (BIO_BONE | BIO_FLESH) - +#define BODYPART_MANGLED_INTERIOR (1<<0) +#define BODYPART_MANGLED_EXTERIOR (1<<1) +#define BODYPART_MANGLED_BOTH (BODYPART_MANGLED_INTERIOR | BODYPART_MANGLED_EXTERIOR) // ~wound flag defines -/// If this wound requires having the BIO_FLESH biological_state on the limb -#define FLESH_WOUND (1<<0) -/// If this wound requires having the BIO_BONE biological_state on the limb -#define BONE_WOUND (1<<1) -/// If having this wound counts as mangled flesh for dismemberment -#define MANGLES_FLESH (1<<2) -/// If having this wound counts as mangled bone for dismemberment -#define MANGLES_BONE (1<<3) +/// If having this wound counts as mangled exterior for dismemberment +#define MANGLES_EXTERIOR (1<<0) +/// If having this wound counts as mangled interior for dismemberment +#define MANGLES_INTERIOR (1<<1) /// If this wound marks the limb as being allowed to have gauze applied -#define ACCEPTS_GAUZE (1<<4) - +#define ACCEPTS_GAUZE (1<<2) +/// If this wound allows the victim to grasp it +#define CAN_BE_GRASPED (1<<3) // ~scar persistence defines // The following are the order placements for persistent scar save formats @@ -149,11 +342,13 @@ GLOBAL_LIST_INIT(global_all_wound_types, list( #define SCAR_SAVE_BIOLOGY 6 /// Which character slot this was saved to #define SCAR_SAVE_CHAR_SLOT 7 +/// if the scar will check for any or all biostates on the limb (defaults to FALSE, so all) +#define SCAR_SAVE_CHECK_ANY_BIO 8 ///how many fields we save for each scar (so the number of above fields) -#define SCAR_SAVE_LENGTH 7 +#define SCAR_SAVE_LENGTH 8 /// saved scars with a version lower than this will be discarded, increment when you update the persistent scarring format in a way that invalidates previous saved scars (new fields, reordering, etc) -#define SCAR_CURRENT_VERSION 3 +#define SCAR_CURRENT_VERSION 4 /// how many scar slots, per character slot, we have to cycle through for persistent scarring, if enabled in character prefs #define PERSISTENT_SCAR_SLOTS 3 diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index 4a4bc828cf8f2..fb1603d650df0 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -17,6 +17,37 @@ ///Remove an untyped item to a list, taking care to handle list items by wrapping them in a list to remove the footgun #define UNTYPED_LIST_REMOVE(list, item) (list -= LIST_VALUE_WRAP_LISTS(item)) +/* + * ## Lazylists + * + * * What is a lazylist? + * + * True to its name a lazylist is a lazy instantiated list. + * It is a list that is only created when necessary (when it has elements) and is null when empty. + * + * * Why use a lazylist? + * + * Lazylists save memory - an empty list that is never used takes up more memory than just `null`. + * + * * When to use a lazylist? + * + * Lazylists are best used on hot types when making lists that are not always used. + * + * For example, if you were adding a list to all atoms that tracks the names of people who touched it, + * you would want to use a lazylist because most atoms will never be touched by anyone. + * + * * How do I use a lazylist? + * + * A lazylist is just a list you defined as `null` rather than `list()`. + * Then, you use the LAZY* macros to interact with it, which are essentially null-safe ways to interact with a list. + * + * Note that you probably should not be using these macros if your list is not a lazylist. + * This will obfuscate the code and make it a bit harder to read and debug. + * + * Generally speaking you shouldn't be checking if your lazylist is `null` yourself, the macros will do that for you. + * Remember that LAZYLEN (and by extension, length) will return 0 if the list is null. + */ + ///Initialize the lazylist #define LAZYINITLIST(L) if (!L) { L = list(); } ///If the provided list is empty, set it to null @@ -60,14 +91,14 @@ #define LAZYCLEARLIST(L) if(L) L.Cut() ///Returns the list if it's actually a valid list, otherwise will initialize it #define SANITIZE_LIST(L) ( islist(L) ? L : list() ) -#define reverseList(L) reverse_range(L.Copy()) - /// Performs an insertion on the given lazy list with the given key and value. If the value already exists, a new one will not be made. #define LAZYORASSOCLIST(lazy_list, key, value) \ LAZYINITLIST(lazy_list); \ LAZYINITLIST(lazy_list[key]); \ lazy_list[key] |= value; +#define reverseList(L) reverse_range(L.Copy()) + /// Passed into BINARY_INSERT to compare keys #define COMPARE_KEY __BIN_LIST[__BIN_MID] /// Passed into BINARY_INSERT to compare values @@ -377,6 +408,17 @@ list_to_clear -= new_list return list_to_clear.len < start_len +/** + * Removes any empty weakrefs from the list + * Returns TRUE if the list had empty refs, FALSE otherwise +**/ +/proc/list_clear_empty_weakrefs(list/list_to_clear) + var/start_len = list_to_clear.len + for(var/datum/weakref/entry in list_to_clear) + if(!entry.resolve()) + list_to_clear -= entry + 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. diff --git a/code/__HELPERS/animations.dm b/code/__HELPERS/animations.dm index 6633d80eaae0f..cae8d3a8f52b1 100644 --- a/code/__HELPERS/animations.dm +++ b/code/__HELPERS/animations.dm @@ -27,3 +27,41 @@ final_pixel_y += living_target.body_position_pixel_y_offset; \ }; \ animate(target, pixel_y = final_pixel_y, time = 1 SECONDS) + +/// The duration of the animate call in mob/living/update_transform +#define UPDATE_TRANSFORM_ANIMATION_TIME (0.2 SECONDS) + +///Animates source spinning around itself. For docmentation on the args, check atom/proc/SpinAnimation() +/atom/proc/do_spin_animation(speed = 1 SECONDS, loops = -1, segments = 3, angle = 120, parallel = TRUE) + var/list/matrices = list() + for(var/i in 1 to segments-1) + var/matrix/segment_matrix = matrix(transform) + segment_matrix.Turn(angle*i) + matrices += segment_matrix + var/matrix/last = matrix(transform) + matrices += last + + speed /= segments + + if(parallel) + animate(src, transform = matrices[1], time = speed, loops , flags = ANIMATION_PARALLEL) + else + animate(src, transform = matrices[1], time = speed, loops) + for(var/i in 2 to segments) //2 because 1 is covered above + animate(transform = matrices[i], time = speed) + //doesn't have an object argument because this is "Stacking" with the animate call above + //3 billion% intentional + +/// Similar to shake but more spasm-y and jerk-y +/atom/proc/spasm_animation(loops = -1) + var/list/transforms = list( + matrix(transform).Translate(-1, 0), + matrix(transform).Translate(0, 1), + matrix(transform).Translate(1, 0), + matrix(transform).Translate(0, -1), + ) + + animate(src, transform = transforms[1], time = 0.2, loop = loops) + animate(transform = transforms[2], time = 0.1) + animate(transform = transforms[3], time = 0.2) + animate(transform = transforms[4], time = 0.3) diff --git a/code/__HELPERS/areas.dm b/code/__HELPERS/areas.dm index 932df589e0cd8..383e8a425fc0b 100644 --- a/code/__HELPERS/areas.dm +++ b/code/__HELPERS/areas.dm @@ -10,7 +10,7 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(/area/station/en // The dirs are connected turfs in the same space // break_if_found is a typecache of turf/area types to return false if found // Please keep this proc type agnostic. If you need to restrict it do it elsewhere or add an arg. -/proc/detect_room(turf/origin, list/break_if_found, max_size=INFINITY) +/proc/detect_room(turf/origin, list/break_if_found = list(), max_size=INFINITY) if(origin.blocks_air) return list(origin) @@ -30,9 +30,9 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(/area/station/en if(!checkT) continue checked_turfs[sourceT] |= dir - checked_turfs[checkT] |= turn(dir, 180) + checked_turfs[checkT] |= REVERSE_DIR(dir) .[sourceT] |= dir - .[checkT] |= turn(dir, 180) + .[checkT] |= REVERSE_DIR(dir) if(break_if_found[checkT.type] || break_if_found[checkT.loc.type]) return FALSE var/static/list/cardinal_cache = list("[NORTH]"=TRUE, "[EAST]"=TRUE, "[SOUTH]"=TRUE, "[WEST]"=TRUE) @@ -77,7 +77,7 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(/area/station/en return counter += 1 //increment by one so the next loop will start at the next position in the list -/proc/create_area(mob/creator) +/proc/create_area(mob/creator, new_area_type = /area) // Passed into the above proc as list/break_if_found var/static/list/area_or_turf_fail_types = typecacheof(list( /turf/open/space, @@ -100,7 +100,7 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(/area/station/en return var/list/apc_map = list() - var/list/areas = list("New Area" = /area) + var/list/areas = list("New Area" = new_area_type) for(var/i in 1 to turf_count) var/turf/the_turf = turfs[i] var/area/place = get_area(the_turf) diff --git a/code/__HELPERS/atmospherics.dm b/code/__HELPERS/atmospherics.dm index 0139fc08114f9..940418f2ebc70 100644 --- a/code/__HELPERS/atmospherics.dm +++ b/code/__HELPERS/atmospherics.dm @@ -171,3 +171,31 @@ GLOBAL_LIST_EMPTY(gas_handbook) return object return null + +/** + * A simple helped proc that checks if the contents of a list of gases are within acceptable terms. + * + * Arguments: + * * gases: The list of gases which contents are being checked + * * gases to check: An associated list of gas types and acceptable boundaries in moles. e.g. /datum/gas/oxygen = list(16, 30) + * * * if the assoc list is null, then it'll be considered a safe gas and won't return FALSE. + * * extraneous_gas_limit: If a gas not in gases is found, this is the limit above which the proc will return FALSE. + */ +/proc/check_gases(list/gases, list/gases_to_check, extraneous_gas_limit = 0.1) + gases_to_check = gases_to_check.Copy() + for(var/id in gases) + var/gas_moles = gases[id][MOLES] + if(!(id in gases_to_check)) + if(gas_moles > extraneous_gas_limit) + return FALSE + continue + var/list/boundaries = gases_to_check[id] + if(boundaries && !ISINRANGE(gas_moles, boundaries[1], boundaries[2])) + return FALSE + gases_to_check -= id + ///Check that gases absent from the turf have a lower boundary of zero or none at all, otherwise return FALSE + for(var/id in gases_to_check) + var/list/boundaries = gases_to_check[id] + if(boundaries && boundaries[1] > 0) + return FALSE + return TRUE diff --git a/code/__HELPERS/atoms.dm b/code/__HELPERS/atoms.dm index 402e3d975fde7..9845593c0847a 100644 --- a/code/__HELPERS/atoms.dm +++ b/code/__HELPERS/atoms.dm @@ -323,3 +323,15 @@ rough example of the "cone" made by the 3 dirs checked if(!storage_datum) return . += storage_datum.real_location?.resolve() + +/// Returns an x and y value require to reverse the transformations made to center an oversized icon +/atom/proc/get_oversized_icon_offsets() + if (pixel_x == 0 && pixel_y == 0) + return list("x" = 0, "y" = 0) + var/list/icon_dimensions = get_icon_dimensions(icon) + var/icon_width = icon_dimensions["width"] + var/icon_height = icon_dimensions["height"] + return list( + "x" = icon_width > world.icon_size && pixel_x != 0 ? (icon_width - world.icon_size) * 0.5 : 0, + "y" = icon_height > world.icon_size && pixel_y != 0 ? (icon_height - world.icon_size) * 0.5 : 0, + ) diff --git a/code/__HELPERS/bodyparts.dm b/code/__HELPERS/bodyparts.dm deleted file mode 100644 index 39df8e37e5ff9..0000000000000 --- a/code/__HELPERS/bodyparts.dm +++ /dev/null @@ -1 +0,0 @@ -#define IS_ORGANIC_LIMB(limb) (limb.bodytype & BODYTYPE_ORGANIC) diff --git a/code/__HELPERS/cameras.dm b/code/__HELPERS/cameras.dm new file mode 100644 index 0000000000000..9d74f3fe71b43 --- /dev/null +++ b/code/__HELPERS/cameras.dm @@ -0,0 +1,35 @@ +/** + * get_camera_list + * + * Builds a list of all available cameras that can be seen to networks_available + * Args: + * networks_available - List of networks that we use to see which cameras are visible to it. + */ +/proc/get_camera_list(list/networks_available) + var/list/all_camera_list = list() + for(var/obj/machinery/camera/camera as anything in GLOB.cameranet.cameras) + all_camera_list.Add(camera) + + camera_sort(all_camera_list) + + var/list/usable_camera_list = list() + + for(var/obj/machinery/camera/camera as anything in all_camera_list) + var/list/tempnetwork = camera.network & networks_available + if(length(tempnetwork)) + usable_camera_list["[camera.c_tag][camera.can_use() ? null : " (Deactivated)"]"] = camera + + return usable_camera_list + +///Sorts the list of cameras by their c_tag to display to players. +/proc/camera_sort(list/camera_list) + var/obj/machinery/camera/camera_comparing_a + var/obj/machinery/camera/camera_comparing_b + + for(var/i = length(camera_list), i > 0, i--) + for(var/j = 1 to i - 1) + camera_comparing_a = camera_list[j] + camera_comparing_b = camera_list[j + 1] + if(sorttext(camera_comparing_a.c_tag, camera_comparing_b.c_tag) < 0) + camera_list.Swap(j, j + 1) + return camera_list diff --git a/code/__HELPERS/chat.dm b/code/__HELPERS/chat.dm index e853547ec7311..31f9ad271d39c 100644 --- a/code/__HELPERS/chat.dm +++ b/code/__HELPERS/chat.dm @@ -81,3 +81,19 @@ it will be sent to all connected chats. /// Handles text formatting for item use hints in examine text #define EXAMINE_HINT(text) ("" + text + "") + +/// Sends a message to all dead and observing players, if a source is provided a follow link will be attached. +/proc/send_to_observers(message, source) + var/list/all_observers = GLOB.dead_player_list + GLOB.current_observers_list + for(var/mob/observer as anything in all_observers) + if (isnull(source)) + to_chat(observer, "[message]") + continue + var/link = FOLLOW_LINK(observer, source) + to_chat(observer, "[link] [message]") + +/// Sends a message to everyone with blob telepathy, and all observers +/proc/blob_telepathy(message, source) + for(var/mob/creature as anything in GLOB.blob_telepathy_mobs) + to_chat(creature, message) + send_to_observers(message, source) diff --git a/code/__HELPERS/chat_filter.dm b/code/__HELPERS/chat_filter.dm index eff2be71c96ae..b395da3d7aa3b 100644 --- a/code/__HELPERS/chat_filter.dm +++ b/code/__HELPERS/chat_filter.dm @@ -14,14 +14,14 @@ return null -/// Given a text, will return what word is on the IC filter, ignoring words allowed on the PDA, with the reason. +/// Given a text, will return what word is on the soft IC filter, with the reason. /// Returns null if the message is OK. -/proc/is_ic_filtered_for_pdas(message) - if (config.ic_outside_pda_filter_regex?.Find(message)) - var/matched_group = GET_MATCHED_GROUP(config.ic_outside_pda_filter_regex) +/proc/is_soft_ic_filtered(message) + if (config.soft_ic_filter_regex?.Find(message)) + var/matched_group = GET_MATCHED_GROUP(config.soft_ic_filter_regex) return list( matched_group, - config.ic_filter_reasons[matched_group] || config.shared_filter_reasons[matched_group], + config.soft_ic_filter_reasons[matched_group] || config.soft_ic_outside_pda_filter_reasons[matched_group] || config.soft_shared_filter_reasons[matched_group], ) return null @@ -35,14 +35,40 @@ return null -/// Given a text, will return what word is on the soft IC filter, with the reason. +/// Given a text, will return that word is on the soft OOC filter, with the reason. /// Returns null if the message is OK. -/proc/is_soft_ic_filtered(message) - if (config.soft_ic_filter_regex?.Find(message)) - var/matched_group = GET_MATCHED_GROUP(config.soft_ic_filter_regex) +/proc/is_soft_ooc_filtered(message) + if (config.soft_ooc_filter_regex?.Find(message)) + var/matched_group = GET_MATCHED_GROUP(config.soft_ooc_filter_regex) + return list(matched_group, config.soft_shared_filter_reasons[matched_group]) + + return null + +/// Checks a PDA message against the IC/Soft IC filter. Returns TRUE if the message should be sent. +/// Notifies the user passed in arguments if the message matched either filter. +/proc/check_pda_message_against_filter(message, mob/user) + 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(user, "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(user)] 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]\"") + log_admin_private("[key_name(user)] 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]\"") + + return TRUE + +/// Given a text, will return what word is on the IC filter, ignoring words allowed on the PDA, with the reason. +/// Returns null if the message is OK. +/proc/is_ic_filtered_for_pdas(message) + if (config.ic_outside_pda_filter_regex?.Find(message)) + var/matched_group = GET_MATCHED_GROUP(config.ic_outside_pda_filter_regex) return list( matched_group, - config.soft_ic_filter_reasons[matched_group] || config.soft_ic_outside_pda_filter_reasons[matched_group] || config.soft_shared_filter_reasons[matched_group], + config.ic_filter_reasons[matched_group] || config.shared_filter_reasons[matched_group], ) return null @@ -59,15 +85,6 @@ return null -/// Given a text, will return that word is on the soft OOC filter, with the reason. -/// Returns null if the message is OK. -/proc/is_soft_ooc_filtered(message) - if (config.soft_ooc_filter_regex?.Find(message)) - var/matched_group = GET_MATCHED_GROUP(config.soft_ooc_filter_regex) - return list(matched_group, config.soft_shared_filter_reasons[matched_group]) - - return null - /// Logs to the filter log with the given message, match, and scope /proc/log_filter(scope, message, filter_result) log_filter_raw("[scope] filter:\n\tMessage: [message]\n\tFilter match: [filter_result[CHAT_FILTER_INDEX_WORD]]") diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm index e7af8e0dcd7ca..5627e737c2b98 100644 --- a/code/__HELPERS/cmp.dm +++ b/code/__HELPERS/cmp.dm @@ -10,6 +10,20 @@ /proc/cmp_text_dsc(a,b) return sorttext(a,b) +/proc/cmp_embed_text_asc(a,b) + if(isdatum(a)) + a = REF(a) + if(isdatum(b)) + b = REF(b) + return sorttext("[b]", "[a]") + +/proc/cmp_embed_text_dsc(a,b) + if(isdatum(a)) + a = REF(a) + if(isdatum(b)) + b = REF(b) + return sorttext("[a]", "[b]") + /proc/cmp_name_asc(atom/a, atom/b) return sorttext(b.name, a.name) @@ -127,11 +141,11 @@ /proc/cmp_typepaths_asc(A, B) return sorttext("[B]","[A]") -/proc/cmp_pdaname_asc(obj/item/modular_computer/A, obj/item/modular_computer/B) - return sorttext(B?.saved_identification, A?.saved_identification) +/proc/cmp_pdaname_asc(datum/computer_file/program/messenger/A, datum/computer_file/program/messenger/B) + return sorttext(B?.computer?.saved_identification, A?.computer?.saved_identification) -/proc/cmp_pdajob_asc(obj/item/modular_computer/A, obj/item/modular_computer/B) - return sorttext(B?.saved_job, A?.saved_job) +/proc/cmp_pdajob_asc(datum/computer_file/program/messenger/A, datum/computer_file/program/messenger/B) + return sorttext(B?.computer?.saved_job, A?.computer?.saved_job) /proc/cmp_num_string_asc(A, B) return text2num(A) - text2num(B) @@ -170,3 +184,13 @@ /// Orders heretic knowledge by priority /proc/cmp_heretic_knowledge(datum/heretic_knowledge/knowledge_a, datum/heretic_knowledge/knowledge_b) return initial(knowledge_b.priority) - initial(knowledge_a.priority) + +/// Passed a list of assoc lists, sorts them by the list's "name" keys. +/proc/cmp_assoc_list_name(list/A, list/B) + return sorttext(B["name"], A["name"]) + +/// Used by /datum/achievement_data/load_all_achievements() to determine in which order awards have to be loaded. +/proc/cmp_award_priority(type_a, type_b) + var/datum/award/award_a = SSachievements.awards[type_a] + var/datum/award/award_b = SSachievements.awards[type_b] + return award_b?.load_priority - award_a?.load_priority diff --git a/code/__HELPERS/construction.dm b/code/__HELPERS/construction.dm index ad9f24cef3c17..9d21362a87adb 100644 --- a/code/__HELPERS/construction.dm +++ b/code/__HELPERS/construction.dm @@ -5,6 +5,44 @@ return defaults + list( "cost" = defaults["cost"] / RCD_MEMORY_COST_BUFF, "delay" = defaults["delay"] / RCD_MEMORY_SPEED_BUFF, + RCD_RESULT_BYPASS_FREQUENT_USE_COOLDOWN = TRUE, ) else return defaults + +/** + * Turns material amount into the number of sheets, returning FALSE if the number is less than SHEET_MATERIAL_AMOUNT + * + * Arguments: + * - amt: amount to convert + */ +/proc/amount2sheet(amt) + if(amt >= SHEET_MATERIAL_AMOUNT) + return round(amt / SHEET_MATERIAL_AMOUNT) + return 0 + +/** + * Turns number of sheets into material amount, returning FALSE if the number is <= 0 + * + * Arguments: + * - amt: amount to convert + */ +/proc/sheet2amount(sheet_amt) + if(sheet_amt > 0) + return sheet_amt * SHEET_MATERIAL_AMOUNT + return 0 + +/** + * Splits a stack. we don't use /obj/item/stack/proc/fast_split_stack because Byond complains that should only be called asynchronously. + * This proc is also more faster because it doesn't deal with mobs, copying evidences or refreshing atom storages + * Has special internal uses for e.g. by the material container + * + * Arguments: + * - [target][obj/item/stack]: the stack to split + * - [amount]: amount to split by + */ +/proc/fast_split_stack(obj/item/stack/target, amount) + if(!target.use(amount, TRUE, FALSE)) + return null + + . = new target.type(target.drop_location(), amount, FALSE, target.mats_per_unit) diff --git a/code/__HELPERS/dynamic_human_icon_gen.dm b/code/__HELPERS/dynamic_human_icon_gen.dm index 0348524b4557e..9f9dd9f1aa114 100644 --- a/code/__HELPERS/dynamic_human_icon_gen.dm +++ b/code/__HELPERS/dynamic_human_icon_gen.dm @@ -54,4 +54,6 @@ GLOBAL_LIST_EMPTY(dynamic_human_appearances) /proc/set_dynamic_human_appearance(list/arguments) var/atom/target = arguments[1] //1st argument is the target var/dynamic_appearance = get_dynamic_human_appearance(arglist(arguments.Copy(2))) //the rest of the arguments starting from 2 matter to the proc - target.appearance = dynamic_appearance + target.icon = 'icons/blanks/32x32.dmi' + target.icon_state = "nothing" + target.copy_overlays(dynamic_appearance, cut_old = TRUE) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 2f862f5df6f8f..10b3eb59e446e 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -139,8 +139,7 @@ for(var/client/remove_from in hide_from) remove_from.images -= image_to_remove - -///Add an image to a list of clients and calls a proc to remove it after a duration +/// Add an image to a list of clients and calls a proc to remove it after a duration /proc/flick_overlay_global(image/image_to_show, list/show_to, duration) if(!show_to || !length(show_to) || !image_to_show) return @@ -148,7 +147,7 @@ add_to.images += image_to_show addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(remove_image_from_clients), image_to_show, show_to), duration, TIMER_CLIENT_TIME) -/// Flicks a certain overlay onto an atom, handling icon_state strings +///Flicks a certain overlay onto an atom, handling icon_state strings /atom/proc/flick_overlay(image_to_show, list/show_to, duration, layer) var/image/passed_image = \ istext(image_to_show) \ @@ -157,13 +156,38 @@ flick_overlay_global(passed_image, show_to, duration) -/// flicks an overlay to anyone who can view this atom -/atom/proc/flick_overlay_view(image_to_show, duration) - var/list/viewing = list() - for(var/mob/viewer as anything in viewers(src)) - if(viewer.client) - viewing += viewer.client - flick_overlay(image_to_show, viewing, duration) +/** + * Helper atom that copies an appearance and exists for a period +*/ +/atom/movable/flick_visual + +/// Takes the passed in MA/icon_state, mirrors it onto ourselves, and displays that in world for duration seconds +/// Returns the displayed object, you can animate it and all, but you don't own it, we'll delete it after the duration +/atom/proc/flick_overlay_view(mutable_appearance/display, duration) + if(!display) + return null + + var/mutable_appearance/passed_appearance = \ + istext(display) \ + ? mutable_appearance(icon, display, layer) \ + : display + + // If you don't give it a layer, we assume you want it to layer on top of this atom + // Because this is vis_contents, we need to set the layer manually (you can just set it as you want on return if this is a problem) + if(passed_appearance.layer == FLOAT_LAYER) + passed_appearance.layer = layer + 0.1 + // This is faster then pooling. I promise + var/atom/movable/flick_visual/visual = new() + visual.appearance = passed_appearance + visual.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + // I hate /area + var/atom/movable/lies_to_children = src + lies_to_children.vis_contents += visual + QDEL_IN_CLIENT_TIME(visual, duration) + return visual + +/area/flick_overlay_view(mutable_appearance/display, duration) + return ///Get active players who are playing in the round /proc/get_active_player_count(alive_check = FALSE, afk_check = FALSE, human_check = FALSE) @@ -414,7 +438,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 SSmachines.get_machines_by_type_and_subtypes(/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/global_lists.dm b/code/__HELPERS/global_lists.dm index 3f0f84d15ae16..4f91b8d58d8be 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -15,9 +15,9 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, GLOB.socks_list) //bodypart accessories (blizzard intensifies) init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, GLOB.body_markings_list) - init_sprite_accessory_subtypes(/datum/sprite_accessory/tails, GLOB.tails_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/tails/monkey, GLOB.tails_list_monkey, 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) diff --git a/code/__HELPERS/hallucinations.dm b/code/__HELPERS/hallucinations.dm index 809ff475fc966..525114cea28bc 100644 --- a/code/__HELPERS/hallucinations.dm +++ b/code/__HELPERS/hallucinations.dm @@ -10,7 +10,7 @@ GLOBAL_LIST_EMPTY(all_ongoing_hallucinations) #define HALLUCINATION_ARGLIST 3 /// Biotypes which cannot hallucinate for balance and logic reasons (not code) -#define NO_HALLUCINATION_BIOTYPES (MOB_ROBOTIC|MOB_SPIRIT|MOB_EPIC) +#define NO_HALLUCINATION_BIOTYPES (MOB_ROBOTIC|MOB_SPIRIT|MOB_SPECIAL) // Macro wrapper for _cause_hallucination so we can cheat in named arguments, like AddComponent. /** @@ -71,7 +71,7 @@ GLOBAL_LIST_EMPTY(all_ongoing_hallucinations) */ /proc/visible_hallucination_pulse(atom/center, radius = 7, hallucination_duration = 50 SECONDS, hallucination_max_duration, list/optional_messages) for(var/mob/living/nearby_living in view(center, radius)) - if(HAS_TRAIT(nearby_living, TRAIT_MADNESS_IMMUNE) || (nearby_living.mind && HAS_TRAIT(nearby_living.mind, TRAIT_MADNESS_IMMUNE))) + if(HAS_MIND_TRAIT(nearby_living, TRAIT_MADNESS_IMMUNE)) continue if(nearby_living.mob_biotypes & NO_HALLUCINATION_BIOTYPES) diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index 2ad8e2a41215a..6a1cfd6191a3b 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -24,32 +24,86 @@ To see an example of a diagonal wall, see '/turf/closed/wall/mineral/titanium' and its subtypes. */ -//Redefinitions of the diagonal directions so they can be stored in one var without conflicts -#define NORTH_JUNCTION NORTH //(1<<0) -#define SOUTH_JUNCTION SOUTH //(1<<1) -#define EAST_JUNCTION EAST //(1<<2) -#define WEST_JUNCTION WEST //(1<<3) -#define NORTHEAST_JUNCTION (1<<4) -#define SOUTHEAST_JUNCTION (1<<5) -#define SOUTHWEST_JUNCTION (1<<6) -#define NORTHWEST_JUNCTION (1<<7) - -DEFINE_BITFIELD(smoothing_junction, list( - "NORTH_JUNCTION" = NORTH_JUNCTION, - "SOUTH_JUNCTION" = SOUTH_JUNCTION, - "EAST_JUNCTION" = EAST_JUNCTION, - "WEST_JUNCTION" = WEST_JUNCTION, - "NORTHEAST_JUNCTION" = NORTHEAST_JUNCTION, - "SOUTHEAST_JUNCTION" = SOUTHEAST_JUNCTION, - "SOUTHWEST_JUNCTION" = SOUTHWEST_JUNCTION, - "NORTHWEST_JUNCTION" = NORTHWEST_JUNCTION, -)) - - #define NO_ADJ_FOUND 0 #define ADJ_FOUND 1 #define NULLTURF_BORDER 2 +GLOBAL_LIST_INIT(adjacent_direction_lookup, generate_adjacent_directions()) + +/* Attempting to mirror the below + * Each 3x3 grid is a tile, with each X representing a direction a border object could be in IN said grid + * Directions marked with A are acceptable smoothing targets, M is the example direction + * The example given here is of a northfacing border object +xxx AxA xxx +xxx AxA xxx +xxx AxA xxx + +AAA MMM AAA +xxx AxA xxx +xxx AxA xxx + +xxx xxx xxx +xxx xxx xxx +xxx xxx xxx +*/ +/// Encodes connectivity between border objects +/// Returns a list accessable by a border object's dir, the direction between it and a target, and a target +/// Said list will return the direction the two objects connect, if any exists (if the target isn't a border object and the direction is fine, return the inverse of the direction in use) +/proc/generate_adjacent_directions() + // Have to hold all conventional dir pairs, so we size to the largest + // We don't HAVE diagonal border objects, so I'm gonna pretend they'll never exist + + // You might be like, lemon, can't we use GLOB.cardinals/GLOB.alldirs here + // No, they aren't loaded yet. life is pain + var/list/cardinals = list(NORTH, SOUTH, EAST, WEST) + var/list/alldirs = cardinals + list(NORTH|EAST, SOUTH|EAST, NORTH|WEST, SOUTH|WEST) + var/largest_cardinal = max(cardinals) + var/largest_dir = max(alldirs) + + var/list/direction_map = new /list(largest_cardinal) + for(var/dir in cardinals) + var/left = turn(dir, 90) + var/right = turn(dir, -90) + var/opposite = REVERSE_DIR(dir) + // Need to encode diagonals here because it's possible, even if it is always false + var/list/acceptable_adjacents = new /list(largest_dir) + // Alright, what directions are acceptable to us + for(var/connectable_dir in (cardinals + NONE)) + // And what border objects INSIDE those directions are alright + var/list/smoothable_dirs = new /list(largest_cardinal + 1) // + 1 because we need to provide space for NONE to be a valid index + // None is fine, we want to smooth with things on our own turf + // We'll do the two dirs to our left and right + // They connect.. "below" us and on their side + if(connectable_dir == NONE) + smoothable_dirs[left] = dir_to_junction(opposite | left) + smoothable_dirs[right] = dir_to_junction(opposite | right) + // If it's to our right or left we'll include just the dir matching ours + // Left edge touches only our left side, and so on + else if (connectable_dir == left) + smoothable_dirs[dir] = left + else if (connectable_dir == right) + smoothable_dirs[dir] = right + // If it's straight on we'll include our direction as a link + // Then include the two edges on the other side as diagonals + else if(connectable_dir == dir) + smoothable_dirs[opposite] = dir + smoothable_dirs[left] = dir_to_junction(dir | left) + smoothable_dirs[right] = dir_to_junction(dir | right) + // otherwise, go HOME, I don't want to encode anything for you + else + continue + acceptable_adjacents[connectable_dir + 1] = smoothable_dirs + direction_map[dir] = acceptable_adjacents + return direction_map + +/// Are two atoms border adjacent, takes a border object, something to compare against, and the direction between A and B +/// Returns the way in which the first thing is adjacent to the second +#define CAN_DIAGONAL_SMOOTH(border_obj, target, direction) (\ + (target.smoothing_flags & SMOOTH_BORDER_OBJECT) ? \ + GLOB.adjacent_direction_lookup[border_obj.dir][direction + 1]?[target.dir] : \ + (GLOB.adjacent_direction_lookup[border_obj.dir][direction + 1]) ? REVERSE_DIR(direction) : NONE \ + ) + #define DEFAULT_UNDERLAY_ICON 'icons/turf/floors.dmi' #define DEFAULT_UNDERLAY_ICON_STATE "plating" @@ -298,44 +352,82 @@ DEFINE_BITFIELD(smoothing_junction, list( 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); \ - if(neighbor) { \ - 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; \ - }; \ + var/border_object_smoothing = (smoothing_flags & SMOOTH_BORDER_OBJECT) + + // Did you know you can pass defines into other defines? very handy, lets take advantage of it here to allow 0 cost variation + #define SEARCH_ADJ_IN_DIR(direction, direction_flag, ADJ_FOUND, WORLD_BORDER, BORDER_CHECK) \ + do { \ + var/turf/neighbor = get_step(src, direction); \ + if(neighbor && ##BORDER_CHECK(neighbor, direction)) { \ + var/neighbor_smoothing_groups = neighbor.smoothing_groups; \ + if(neighbor_smoothing_groups) { \ + for(var/target in canSmoothWith) { \ + if(canSmoothWith[target] & neighbor_smoothing_groups[target]) { \ + ##ADJ_FOUND(neighbor, direction, direction_flag); \ + } \ + } \ + } \ + 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) || !##BORDER_CHECK(thing, direction)) { \ + continue; \ }; \ - }; \ - 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/target in canSmoothWith) { \ + if(canSmoothWith[target] & thing_smoothing_groups[target]) { \ + ##ADJ_FOUND(thing, direction, direction_flag); \ + } \ + } \ + } \ + } \ + } else if (smooth_border) { \ + ##WORLD_BORDER(null, direction, direction_flag); \ + } \ + } while(FALSE) \ + + #define BITMASK_FOUND(target, direction, direction_flag) \ + new_junction |= direction_flag; \ + break set_adj_in_dir; \ + /// Check that non border objects use to smooth against border objects + /// Returns true if the smooth is acceptable, FALSE otherwise + #define BITMASK_ON_BORDER_CHECK(target, direction) (!(target.smoothing_flags & SMOOTH_BORDER_OBJECT) || CAN_DIAGONAL_SMOOTH(target, src, REVERSE_DIR(direction))) + + #define BORDER_FOUND(target, direction, direction_flag) new_junction |= CAN_DIAGONAL_SMOOTH(src, target, direction) + // Border objects require an object as context, so we need a dummy. I'm sorry + #define WORLD_BORDER_FOUND(target, direction, direction_flag) \ + var/static/atom/dummy; \ + if(!dummy) { \ + dummy = new(); \ + dummy.smoothing_flags &= ~SMOOTH_BORDER_OBJECT; \ + } \ + BORDER_FOUND(dummy, direction, direction_flag); + // Handle handle border on border checks. no-op, we handle this check inside CAN_DIAGONAL_SMOOTH + #define BORDER_ON_BORDER_CHECK(target, direction) (TRUE) + + // We're building 2 different types of smoothing searches here + // One for standard bitmask smoothing (We provide a label so our macro can eary exit, as it wants to do) + #define SET_ADJ_IN_DIR(direction, direction_flag) do { set_adj_in_dir: { SEARCH_ADJ_IN_DIR(direction, direction_flag, BITMASK_FOUND, BITMASK_FOUND, BITMASK_ON_BORDER_CHECK) }} while(FALSE) + // and another for border object work (Doesn't early exit because we can hit more then one direction by checking the same turf) + #define SET_BORDER_ADJ_IN_DIR(direction) SEARCH_ADJ_IN_DIR(direction, direction, BORDER_FOUND, WORLD_BORDER_FOUND, BORDER_ON_BORDER_CHECK) + + // Let's go over all our cardinals + if(border_object_smoothing) + SET_BORDER_ADJ_IN_DIR(NORTH) + SET_BORDER_ADJ_IN_DIR(SOUTH) + SET_BORDER_ADJ_IN_DIR(EAST) + SET_BORDER_ADJ_IN_DIR(WEST) + // We want to check against stuff in our own turf + SET_BORDER_ADJ_IN_DIR(NONE) + // Border objects don't do diagonals, so GO HOME + set_smoothed_icon_state(new_junction) + return - for(var/direction in GLOB.cardinals) //Cardinal case first. - SET_ADJ_IN_DIR(direction, direction) + SET_ADJ_IN_DIR(NORTH, NORTH) + SET_ADJ_IN_DIR(SOUTH, SOUTH) + SET_ADJ_IN_DIR(EAST, EAST) + SET_ADJ_IN_DIR(WEST, WEST) + // If there's nothing going on already if(!(new_junction & (NORTH|SOUTH)) || !(new_junction & (EAST|WEST))) set_smoothed_icon_state(new_junction) return @@ -356,10 +448,16 @@ DEFINE_BITFIELD(smoothing_junction, list( set_smoothed_icon_state(new_junction) + #undef SET_BORDER_ADJ_IN_DIR #undef SET_ADJ_IN_DIR - - -///Changes the icon state based on the new junction bitmask. Returns the old junction value. + #undef BORDER_ON_BORDER_CHECK + #undef WORLD_BORDER_FOUND + #undef BORDER_FOUND + #undef BITMASK_ON_BORDER_CHECK + #undef BITMASK_FOUND + #undef SEARCH_ADJ_IN_DIR + +///Changes the icon state based on the new junction bitmask /atom/proc/set_smoothed_icon_state(new_junction) . = smoothing_junction smoothing_junction = new_junction @@ -368,12 +466,12 @@ DEFINE_BITFIELD(smoothing_junction, list( /turf/closed/set_smoothed_icon_state(new_junction) // Avoid calling ..() here to avoid setting icon_state twice, which is expensive given how hot this proc is - . = smoothing_junction + var/old_junction = smoothing_junction smoothing_junction = new_junction if (!(smoothing_flags & SMOOTH_DIAGONAL_CORNERS)) icon_state = "[base_icon_state]-[smoothing_junction]" - return . + return switch(new_junction) if( @@ -387,8 +485,8 @@ DEFINE_BITFIELD(smoothing_junction, list( SOUTH_JUNCTION|EAST_JUNCTION|SOUTHEAST_JUNCTION, ) icon_state = "[base_icon_state]-[smoothing_junction]-d" - if(new_junction == . || fixed_underlay) // Mutable underlays? - return . + if(new_junction == old_junction || fixed_underlay) // Mutable underlays? + return var/junction_dir = reverse_ndir(smoothing_junction) var/turned_adjacency = REVERSE_DIR(junction_dir) @@ -474,6 +572,39 @@ DEFINE_BITFIELD(smoothing_junction, list( add_overlay(new_overlays) +/// Takes a direction, turns it into all the junctions that contain it +/proc/dir_to_all_junctions(dir) + var/handback = NONE + if(dir & NORTH) + handback |= NORTH_JUNCTION | NORTHEAST_JUNCTION | NORTHWEST_JUNCTION + if(dir & SOUTH) + handback |= SOUTH_JUNCTION | SOUTHEAST_JUNCTION | SOUTHWEST_JUNCTION + if(dir & EAST) + handback |= EAST_JUNCTION | SOUTHEAST_JUNCTION | NORTHEAST_JUNCTION + if(dir & WEST) + handback |= WEST_JUNCTION | NORTHWEST_JUNCTION | SOUTHWEST_JUNCTION + return handback + +/proc/dir_to_junction(dir) + switch(dir) + if(NORTH) + return NORTH_JUNCTION + if(SOUTH) + return SOUTH_JUNCTION + if(WEST) + return WEST_JUNCTION + if(EAST) + return EAST_JUNCTION + if(NORTHWEST) + return NORTHWEST_JUNCTION + if(NORTHEAST) + return NORTHEAST_JUNCTION + if(SOUTHEAST) + return SOUTHEAST_JUNCTION + if(SOUTHWEST) + return SOUTHWEST_JUNCTION + else + return NONE /proc/reverse_ndir(ndir) switch(ndir) @@ -537,3 +668,4 @@ DEFINE_BITFIELD(smoothing_junction, list( #undef DEFAULT_UNDERLAY_ICON #undef DEFAULT_UNDERLAY_ICON_STATE +#undef CAN_DIAGONAL_SMOOTH diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 15f10f8f98be7..40ff6fac3918f 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -992,7 +992,7 @@ world letter = lowertext(letter) var/image/text_image = new(loc = A) - text_image.maptext = MAPTEXT("[letter]") + text_image.maptext = MAPTEXT("[letter]") text_image.pixel_x = 7 text_image.pixel_y = 5 qdel(atom_icon) @@ -1133,6 +1133,23 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) /proc/generate_asset_name(file) return "asset.[md5(fcopy_rsc(file))]" +/// Gets a dummy savefile for usage in icon generation. +/// Savefiles generated from this proc will be empty. +/proc/get_dummy_savefile(from_failure = FALSE) + var/static/next_id = 0 + if(next_id++ > 9) + next_id = 0 + var/savefile_path = "tmp/dummy-save-[next_id].sav" + try + if(fexists(savefile_path)) + fdel(savefile_path) + return new /savefile(savefile_path) + catch(var/exception/error) + // if we failed to create a dummy once, try again; maybe someone slept somewhere they shouldnt have + if(from_failure) // this *is* the retry, something fucked up + CRASH("get_dummy_savefile failed to create a dummy savefile: '[error]'") + return get_dummy_savefile(from_failure = TRUE) + /** * Converts an icon to base64. Operates by putting the icon in the iconCache savefile, * exporting it as text, and then parsing the base64 from that. @@ -1141,14 +1158,11 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) /proc/icon2base64(icon/icon) if (!isicon(icon)) return FALSE - var/savefile/dummySave = new("tmp/dummySave.sav") + var/savefile/dummySave = get_dummy_savefile() WRITE_FILE(dummySave["dummy"], icon) var/iconData = dummySave.ExportText("dummy") var/list/partial = splittext(iconData, "{") - . = replacetext(copytext_char(partial[2], 3, -5), "\n", "") //if cleanup fails we want to still return the correct base64 - dummySave.Unlock() - 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. + return replacetext(copytext_char(partial[2], 3, -5), "\n", "") //if cleanup fails we want to still return the correct base64 ///given a text string, returns whether it is a valid dmi icons folder path /proc/is_valid_dmi_file(icon_path) @@ -1478,3 +1492,38 @@ GLOBAL_LIST_EMPTY(transformation_animation_objects) if(scream) stack_trace("Icon Lookup for state: [state] in file [file] failed.") return FALSE + +/** + * Returns the size of the sprite in tiles. + * Takes the icon size and divides it by the world icon size (default 32). + * This gives the size of the sprite in tiles. + * + * @return size of the sprite in tiles + */ +/proc/get_size_in_tiles(obj/target) + var/icon/size_check = icon(target.icon, target.icon_state) + var/size = size_check.Width() / world.icon_size + + return size + +/** + * Updates the bounds of a rotated object + * This ensures that the bounds are always correct, + * even if the object is rotated after init. + */ +/obj/proc/set_bounds() + var/size = get_size_in_tiles(src) + + if(dir in list(NORTH, SOUTH)) + bound_width = size * world.icon_size + bound_height = world.icon_size + else + bound_width = world.icon_size + bound_height = size * world.icon_size + +/// Returns a list containing the width and height of an icon file +/proc/get_icon_dimensions(icon_path) + if (isnull(GLOB.icon_dimensions[icon_path])) + var/icon/my_icon = icon(icon_path) + GLOB.icon_dimensions[icon_path] = list("width" = my_icon.Width(), "height" = my_icon.Height()) + return GLOB.icon_dimensions[icon_path] diff --git a/code/__HELPERS/levels.dm b/code/__HELPERS/levels.dm index 218c1013bed83..096655ad748bd 100644 --- a/code/__HELPERS/levels.dm +++ b/code/__HELPERS/levels.dm @@ -17,3 +17,44 @@ if(source_loc.z == checking_loc.z) return TRUE return FALSE + +/** + * Checks if the passed non-area atom is on a "planet". + * + * A planet is defined as anything with planetary atmos that has gravity, with some hardcoded exceptions. + * + * * Nullspace counts as "not a planet", so you may want to check that separately. + * * The mining z-level (Lavaland) is always considered a planet. + * * The station z-level is considered a planet if the map config says so. + * * Central Command is always not a planet. + * * Syndicate recon outpost is always on a planet. + * + * Returns TRUE if we are on a planet. + * Returns FALSE if we are not in a planet, or otherwise, "in space". + */ +/proc/is_on_a_planet(atom/what) + ASSERT(!isarea(what)) + + var/turf/open/what_turf = get_turf(what) + if(isnull(what_turf)) + // Nullspace is, well, not a planet? + return FALSE + + if(is_mining_level(what_turf.z)) + // Always assume Lavaland / mining level is a planet. (Astroid mining crying right now) + return TRUE + + if(is_station_level(what_turf.z)) + // Station levels rely on the map config, I.E. Icebox is planetary but Meta is not + return SSmapping.is_planetary() + + if(is_centcom_level(what_turf.z)) + // Central Command is definitely in space + return FALSE + + if(what.onSyndieBase()) + // Syndicate recon outpost is on some moon or something + return TRUE + + // Finally, more specific checks are ran for edge cases, such as lazyily loaded map templates or away missions. Not perfect. + return istype(what_turf) && what_turf.planetary_atmos && what_turf.has_gravity() diff --git a/code/__HELPERS/logging/ui.dm b/code/__HELPERS/logging/ui.dm index 607f22a507b6c..1c72f314f38aa 100644 --- a/code/__HELPERS/logging/ui.dm +++ b/code/__HELPERS/logging/ui.dm @@ -1,12 +1,17 @@ /proc/log_href(text, list/data) - logger.Log(LOG_CATEGORY_DEBUG_HREF, text, data) + logger.Log(LOG_CATEGORY_HREF, text, data) /** * Appends a tgui-related log entry. All arguments are optional. */ -/proc/log_tgui(user, message, context, - datum/tgui_window/window, - datum/src_object) +/proc/log_tgui( + user, + message, + context, + datum/tgui_window/window, + datum/src_object, +) + var/entry = "" // Insert user info if(!user) @@ -31,4 +36,4 @@ // Insert message if(message) entry += "\n[message]" - logger.Log(LOG_CATEGORY_DEBUG_TGUI, entry) + logger.Log(LOG_CATEGORY_HREF_TGUI, entry) diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm index 7e266da955219..116fb34fad532 100644 --- a/code/__HELPERS/maths.dm +++ b/code/__HELPERS/maths.dm @@ -4,12 +4,16 @@ return 0 var/dy =(32 * end.y + end.pixel_y) - (32 * start.y + start.pixel_y) var/dx =(32 * end.x + end.pixel_x) - (32 * start.x + start.pixel_x) - if(!dy) - return (dx >= 0) ? 90 : 270 - . = arctan(dx/dy) - if(dy < 0) + return delta_to_angle(dx, dy) + +/// Calculate the angle produced by a pair of x and y deltas +/proc/delta_to_angle(x, y) + if(!y) + return (x >= 0) ? 90 : 270 + . = arctan(x/y) + if(y < 0) . += 180 - else if(dx < 0) + else if(x < 0) . += 360 /// Angle between two arbitrary points and horizontal line same as [/proc/get_angle] @@ -115,25 +119,48 @@ dx -= 1 return perimeter -///Format a power value in W, kW, MW, or GW. +/** + * Formats a number into a list representing the si unit. + * Access the coefficient with [SI_COEFFICIENT], and access the unit with [SI_UNIT]. + * + * Supports SI exponents between 1e-15 to 1e15, but properly handles numbers outside that range as well. + * Arguments: + * * value - The number to convert to text. Can be positive or negative. + * * unit - The base unit of the number, such as "Pa" or "W". + * * maxdecimals - Maximum amount of decimals to display for the final number. Defaults to 1. + * Returns: [SI_COEFFICIENT = si unit coefficient, SI_UNIT = prefixed si unit.] + */ +/proc/siunit_isolated(value, unit, maxdecimals=1) + var/static/list/prefixes = list("f","p","n","μ","m","","k","M","G","T","P") + + // We don't have prefixes beyond this point + // and this also captures value = 0 which you can't compute the logarithm for + // and also byond numbers are floats and doesn't have much precision beyond this point anyway + if(abs(value) <= 1e-18) + . = list(SI_COEFFICIENT = 0, SI_UNIT = " [unit]") + return + + var/exponent = clamp(log(10, abs(value)), -15, 15) // Calculate the exponent and clamp it so we don't go outside the prefix list bounds + var/divider = 10 ** (round(exponent / 3) * 3) // Rounds the exponent to nearest SI unit and power it back to the full form + var/coefficient = round(value / divider, 10 ** -maxdecimals) // Calculate the coefficient and round it to desired decimals + var/prefix_index = round(exponent / 3) + 6 // Calculate the index in the prefixes list for this exponent + + // An edge case which happens if we round 999.9 to 0 decimals for example, which gets rounded to 1000 + // In that case, we manually swap up to the next prefix if there is one available + if(coefficient >= 1000 && prefix_index < 11) + coefficient /= 1e3 + prefix_index++ + + var/prefix = prefixes[prefix_index] + . = list(SI_COEFFICIENT = coefficient, SI_UNIT = " [prefix][unit]") + +///Format a power value in prefixed watts. /proc/display_power(powerused) - if(powerused < 1000) //Less than a kW - return "[powerused] W" - else if(powerused < 1000000) //Less than a MW - return "[round((powerused * 0.001),0.01)] kW" - else if(powerused < 1000000000) //Less than a GW - return "[round((powerused * 0.000001),0.001)] MW" - return "[round((powerused * 0.000000001),0.0001)] GW" - -///Format an energy value in J, kJ, MJ, or GJ. 1W = 1J/s. + return siunit(powerused, "W", 3) + +///Format an energy value in prefixed joules. /proc/display_joules(units) - if (units < 1000) // Less than a kJ - return "[round(units, 0.1)] J" - else if (units < 1000000) // Less than a MJ - return "[round(units * 0.001, 0.01)] kJ" - else if (units < 1000000000) // Less than a GJ - return "[round(units * 0.000001, 0.001)] MJ" - return "[round(units * 0.000000001, 0.0001)] GJ" + return siunit(units, "J", 3) /proc/joules_to_energy(joules) return joules * (1 SECONDS) / SSmachines.wait diff --git a/code/__HELPERS/matrices.dm b/code/__HELPERS/matrices.dm index 6b7e5543d579a..075a5e5ae0eb6 100644 --- a/code/__HELPERS/matrices.dm +++ b/code/__HELPERS/matrices.dm @@ -43,31 +43,6 @@ . = new_angle - old_angle Turn(.) //BYOND handles cases such as -270, 360, 540 etc. DOES NOT HANDLE 180 TURNS WELL, THEY TWEEN AND LOOK LIKE SHIT -/atom/proc/SpinAnimation(speed = 10, loops = -1, clockwise = 1, segments = 3, parallel = TRUE) - if(!segments) - return - var/segment = 360/segments - if(!clockwise) - segment = -segment - var/list/matrices = list() - for(var/i in 1 to segments-1) - var/matrix/M = matrix(transform) - M.Turn(segment*i) - matrices += M - var/matrix/last = matrix(transform) - matrices += last - - speed /= segments - - if(parallel) - animate(src, transform = matrices[1], time = speed, loops , flags = ANIMATION_PARALLEL) - else - animate(src, transform = matrices[1], time = speed, loops) - for(var/i in 2 to segments) //2 because 1 is covered above - animate(transform = matrices[i], time = speed) - //doesn't have an object argument because this is "Stacking" with the animate call above - //3 billion% intentional - /** * Shear the transform on either or both axes. * * x - X axis shearing @@ -210,15 +185,24 @@ 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) 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 @@ -244,7 +228,11 @@ 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()") + 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) #undef LUMA_R #undef LUMA_G diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 96db76f5349bc..3a782edf3469e 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -58,60 +58,6 @@ /proc/random_backpack() 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.body_markings_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, GLOB.body_markings_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) - - //For now we will always return none for tail_human and ears. | "For now" he says. - return(list( - "mcolor" = "#[pick("7F","FF")][pick("7F","FF")][pick("7F","FF")]", - "ethcolor" = GLOB.color_list_ethereal[pick(GLOB.color_list_ethereal)], - "tail_cat" = "None", - "tail_lizard" = "Smooth", - "wings" = "None", - "snout" = pick(GLOB.snouts_list), - "horns" = pick(GLOB.horns_list), - "ears" = "None", - "frills" = pick(GLOB.frills_list), - "spines" = pick(GLOB.spines_list), - "body_markings" = pick(GLOB.body_markings_list), - "legs" = "Normal Legs", - "caps" = pick(GLOB.caps_list), - "moth_wings" = pick(GLOB.moth_wings_list), - "moth_antennae" = pick(GLOB.moth_antennae_list), - "moth_markings" = pick(GLOB.moth_markings_list), - "tail_monkey" = "None", - "pod_hair" = pick(GLOB.pod_hair_list), - )) - /proc/random_hairstyle(gender) switch(gender) if(MALE) @@ -182,6 +128,10 @@ GLOBAL_LIST_INIT(skin_tones, sort_list(list( "asian2", "arab", "indian", + "mixed1", + "mixed2", + "mixed3", + "mixed4", "african1", "african2" ))) @@ -199,6 +149,10 @@ GLOBAL_LIST_INIT(skin_tone_names, list( "indian" = "Brown", "latino" = "Light beige", "mediterranean" = "Olive", + "mixed1" = "Chestnut", + "mixed2" = "Walnut", + "mixed3" = "Coffee", + "mixed4" = "Macadamia", )) /// An assoc list of species IDs to type paths @@ -312,9 +266,21 @@ GLOBAL_LIST_EMPTY(species_list) progbar.end_progress() if(interaction_key) + var/reduced_interaction_count = (LAZYACCESS(user.do_afters, interaction_key) || 0) - 1 + if(reduced_interaction_count > 0) // Not done yet! + LAZYSET(user.do_afters, interaction_key, reduced_interaction_count) + return + // all out, let's clear er out fully LAZYREMOVE(user.do_afters, interaction_key) SEND_SIGNAL(user, COMSIG_DO_AFTER_ENDED) +/// 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)) @@ -346,7 +312,7 @@ GLOBAL_LIST_EMPTY(species_list) X.flags_1 |= ADMIN_SPAWNED_1 return X //return the last mob spawned -/proc/spawn_and_random_walk(spawn_type, target, amount, walk_chance=100, max_walk=3, always_max_walk=FALSE, admin_spawn=FALSE) +/proc/spawn_and_random_walk(spawn_type, target, amount, walk_chance=100, max_walk=3, always_max_walk=FALSE, admin_spawn=FALSE, cardinals_only = TRUE) var/turf/T = get_turf(target) var/step_count = 0 if(!T) @@ -375,7 +341,7 @@ GLOBAL_LIST_EMPTY(species_list) step_count = rand(1, max_walk) for(var/i in 1 to step_count) - step(X, pick(NORTH, SOUTH, EAST, WEST)) + step(X, cardinals_only ? pick(GLOB.cardinals) : pick(GLOB.alldirs)) return spawned_mobs @@ -572,8 +538,6 @@ 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)) - /// Gets the client of the mob, allowing for mocking of the client. /// You only need to use this if you know you're going to be mocking clients somewhere else. #define GET_CLIENT(mob) (##mob.client || ##mob.mock_client) diff --git a/code/__HELPERS/mouse_control.dm b/code/__HELPERS/mouse_control.dm index 8896afb3ec629..0c99e53e7a0cd 100644 --- a/code/__HELPERS/mouse_control.dm +++ b/code/__HELPERS/mouse_control.dm @@ -1,18 +1,22 @@ -/proc/mouse_angle_from_client(client/client) - var/list/modifiers = params2list(client.mouseParams) - if(LAZYACCESS(modifiers, SCREEN_LOC) && client) - var/list/screen_loc_params = splittext(LAZYACCESS(modifiers, SCREEN_LOC), ",") - var/list/screen_loc_X = splittext(screen_loc_params[1],":") - var/list/screen_loc_Y = splittext(screen_loc_params[2],":") - var/x = (text2num(screen_loc_X[1]) * 32 + text2num(screen_loc_X[2]) - 32) - var/y = (text2num(screen_loc_Y[1]) * 32 + text2num(screen_loc_Y[2]) - 32) - var/list/screenview = getviewsize(client.view) - var/screenviewX = screenview[1] * world.icon_size - var/screenviewY = screenview[2] * world.icon_size - var/ox = round(screenviewX/2) - client.pixel_x //"origin" x - var/oy = round(screenviewY/2) - client.pixel_y //"origin" y - var/angle = SIMPLIFY_DEGREES(ATAN2(y - oy, x - ox)) - return angle +///Returns an angle in degrees relative to the position of the mouse and that of the client eye. +/proc/mouse_angle_from_client(client/client, params) + if(!client) + return + var/list/modifiers = params2list(params) + if(!LAZYACCESS(modifiers, SCREEN_LOC)) + return + var/list/screen_loc_params = splittext(LAZYACCESS(modifiers, SCREEN_LOC), ",") + var/list/screen_loc_X = splittext(screen_loc_params[1],":") + var/list/screen_loc_Y = splittext(screen_loc_params[2],":") + var/x = (text2num(screen_loc_X[1]) * 32 + text2num(screen_loc_X[2]) - 32) + var/y = (text2num(screen_loc_Y[1]) * 32 + text2num(screen_loc_Y[2]) - 32) + var/list/screenview = getviewsize(client.view) + var/screenviewX = screenview[1] * world.icon_size + var/screenviewY = screenview[2] * world.icon_size + var/ox = round(screenviewX/2) - client.pixel_x //"origin" x + var/oy = round(screenviewY/2) - client.pixel_y //"origin" y + var/angle = SIMPLIFY_DEGREES(ATAN2(y - oy, x - ox)) + return angle //Wow, specific name! /proc/mouse_absolute_datum_map_position_from_client(client/client) diff --git a/code/__HELPERS/path.dm b/code/__HELPERS/path.dm index 09c1e882f4e69..fb6d9c27b2b6d 100644 --- a/code/__HELPERS/path.dm +++ b/code/__HELPERS/path.dm @@ -147,6 +147,11 @@ SSpathfinder.currentrun -= src if(on_finish) on_finish.Invoke(null) + on_finish = null + avoid = null + id = null + caller = null + open = null /** * "starts" off the pathfinding, by storing the values this datum will need to work later on diff --git a/code/__HELPERS/priority_announce.dm b/code/__HELPERS/priority_announce.dm index 3f3a11a266f8f..eeb899ed81b14 100644 --- a/code/__HELPERS/priority_announce.dm +++ b/code/__HELPERS/priority_announce.dm @@ -102,8 +102,9 @@ * html_encode - if TRUE, we will html encode our title and message before sending it, to prevent player input abuse. * players - optional, a list mobs to send the announcement to. If unset, sends to all palyers. * sound_override - optional, use the passed sound file instead of the default notice sounds. + * should_play_sound - Whether the notice sound should be played or not. */ -/proc/minor_announce(message, title = "Attention:", alert, html_encode = TRUE, list/players, sound_override) +/proc/minor_announce(message, title = "Attention:", alert, html_encode = TRUE, list/players = null, sound_override = null, should_play_sound = TRUE) if(!message) return @@ -121,6 +122,6 @@ continue to_chat(target, "[span_minorannounce("[title]
[message]")]
") - if(target.client?.prefs.read_preference(/datum/preference/toggle/sound_announcements)) + if(should_play_sound && target.client?.prefs.read_preference(/datum/preference/toggle/sound_announcements)) var/sound_to_play = sound_override || (alert ? 'sound/misc/notice1.ogg' : 'sound/misc/notice2.ogg') SEND_SOUND(target, sound(sound_to_play)) diff --git a/code/__HELPERS/pronouns.dm b/code/__HELPERS/pronouns.dm index 6328591471a53..a099199cce082 100644 --- a/code/__HELPERS/pronouns.dm +++ b/code/__HELPERS/pronouns.dm @@ -1,259 +1,261 @@ //pronoun procs, for getting pronouns without using the text macros that only work in certain positions //datums don't have gender, but most of their subtypes do! -/datum/proc/p_they(capitalized, temp_gender) - . = "it" - if(capitalized) - . = capitalize(.) - -/datum/proc/p_their(capitalized, temp_gender) - . = "its" - if(capitalized) - . = capitalize(.) - -/datum/proc/p_theirs(capitalized, temp_gender) - . = "its" - if(capitalized) - . = capitalize(.) - -/datum/proc/p_them(capitalized, temp_gender) - . = "it" - if(capitalized) - . = capitalize(.) +/datum/proc/p_they(temp_gender) + return "it" + +/datum/proc/p_They(temp_gender) + return capitalize(p_they(temp_gender)) + +/datum/proc/p_their(temp_gender) + return "its" + +/datum/proc/p_Their(temp_gender) + return capitalize(p_their(temp_gender)) + +/datum/proc/p_theirs(temp_gender) + return "its" + +/datum/proc/p_Theirs(temp_gender) + return capitalize(p_theirs(temp_gender)) + +/datum/proc/p_them(temp_gender) + return "it" + +/datum/proc/p_Them(temp_gender) + return capitalize(p_them(temp_gender)) /datum/proc/p_have(temp_gender) - . = "has" + return "has" /datum/proc/p_are(temp_gender) - . = "is" + return "is" /datum/proc/p_were(temp_gender) - . = "was" + return "was" /datum/proc/p_do(temp_gender) - . = "does" + return "does" + +/datum/proc/p_theyve(temp_gender) + return p_they(temp_gender) + "'" + copytext_char(p_have(temp_gender), 3) + +/datum/proc/p_Theyve(temp_gender) + return p_They(temp_gender) + "'" + copytext_char(p_have(temp_gender), 3) -/datum/proc/p_theyve(capitalized, temp_gender) - . = p_they(capitalized, temp_gender) + "'" + copytext_char(p_have(temp_gender), 3) +/datum/proc/p_theyre(temp_gender) + return p_they(temp_gender) + "'" + copytext_char(p_are(temp_gender), 2) -/datum/proc/p_theyre(capitalized, temp_gender) - . = p_they(capitalized, temp_gender) + "'" + copytext_char(p_are(temp_gender), 2) +/datum/proc/p_Theyre(temp_gender) + return p_They(temp_gender) + "'" + copytext_char(p_are(temp_gender), 2) /datum/proc/p_s(temp_gender) //is this a descriptive proc name, or what? - . = "s" + return "s" /datum/proc/p_es(temp_gender) - . = "es" + return "es" /datum/proc/plural_s(pluralize) switch(copytext_char(pluralize, -2)) if ("ss") - . = "es" + return "es" if ("sh") - . = "es" + return "es" if ("ch") - . = "es" + return "es" else switch(copytext_char(pluralize, -1)) if("s", "x", "z") - . = "es" + return "es" else - . = "s" + return "s" //like clients, which do have gender. -/client/p_they(capitalized, temp_gender) +/client/p_they(temp_gender) if(!temp_gender) temp_gender = gender - . = "they" switch(temp_gender) if(FEMALE) - . = "she" + return "she" if(MALE) - . = "he" - if(capitalized) - . = capitalize(.) + return "he" + else + return "they" -/client/p_their(capitalized, temp_gender) +/client/p_their(temp_gender) if(!temp_gender) temp_gender = gender - . = "their" switch(temp_gender) if(FEMALE) - . = "her" + return "her" if(MALE) - . = "his" - if(capitalized) - . = capitalize(.) + return "his" + else + return "their" -/client/p_theirs(capitalized, temp_gender) +/client/p_theirs(temp_gender) if(!temp_gender) temp_gender = gender - . = "theirs" switch(temp_gender) if(FEMALE) - . = "hers" + return "hers" if(MALE) - . = "his" - if(capitalized) - . = capitalize(.) + return "his" + else + return "theirs" -/client/p_them(capitalized, temp_gender) +/client/p_them(temp_gender) if(!temp_gender) temp_gender = gender - . = "them" switch(temp_gender) if(FEMALE) - . = "her" + return "her" if(MALE) - . = "him" - if(capitalized) - . = capitalize(.) + return "him" + else + return "them" /client/p_have(temp_gender) if(!temp_gender) temp_gender = gender - . = "has" if(temp_gender == PLURAL || temp_gender == NEUTER) - . = "have" + return "have" + return "has" /client/p_are(temp_gender) if(!temp_gender) temp_gender = gender - . = "is" if(temp_gender == PLURAL || temp_gender == NEUTER) - . = "are" + return "are" + return "is" /client/p_were(temp_gender) if(!temp_gender) temp_gender = gender - . = "was" if(temp_gender == PLURAL || temp_gender == NEUTER) - . = "were" + return "were" + return "was" /client/p_do(temp_gender) if(!temp_gender) temp_gender = gender - . = "does" if(temp_gender == PLURAL || temp_gender == NEUTER) - . = "do" + return "do" + return "does" /client/p_s(temp_gender) if(!temp_gender) temp_gender = gender if(temp_gender != PLURAL && temp_gender != NEUTER) - . = "s" + return "s" /client/p_es(temp_gender) if(!temp_gender) temp_gender = gender if(temp_gender != PLURAL && temp_gender != NEUTER) - . = "es" + return "es" //mobs(and atoms but atoms don't really matter write your own proc overrides) also have gender! -/mob/p_they(capitalized, temp_gender) +/mob/p_they(temp_gender) if(!temp_gender) temp_gender = gender - . = "it" switch(temp_gender) if(FEMALE) - . = "she" + return "she" if(MALE) - . = "he" + return "he" if(PLURAL) - . = "they" - if(capitalized) - . = capitalize(.) + return "they" + else + return "it" -/mob/p_their(capitalized, temp_gender) +/mob/p_their(temp_gender) if(!temp_gender) temp_gender = gender - . = "its" switch(temp_gender) if(FEMALE) - . = "her" + return "her" if(MALE) - . = "his" + return "his" if(PLURAL) - . = "their" - if(capitalized) - . = capitalize(.) + return "their" + else + return "its" -/mob/p_theirs(capitalized, temp_gender) +/mob/p_theirs(temp_gender) if(!temp_gender) temp_gender = gender - . = "its" switch(temp_gender) if(FEMALE) - . = "hers" + return "hers" if(MALE) - . = "his" + return "his" if(PLURAL) - . = "theirs" - if(capitalized) - . = capitalize(.) + return "theirs" + else + return "its" /mob/p_them(capitalized, temp_gender) if(!temp_gender) temp_gender = gender - . = "it" switch(temp_gender) if(FEMALE) - . = "her" + return "her" if(MALE) - . = "him" + return "him" if(PLURAL) - . = "them" - if(capitalized) - . = capitalize(.) + return "them" + else + return "it" /mob/p_have(temp_gender) if(!temp_gender) temp_gender = gender - . = "has" if(temp_gender == PLURAL) - . = "have" + return "have" + return "has" /mob/p_are(temp_gender) if(!temp_gender) temp_gender = gender - . = "is" if(temp_gender == PLURAL) - . = "are" + return "are" + return "is" /mob/p_were(temp_gender) if(!temp_gender) temp_gender = gender - . = "was" if(temp_gender == PLURAL) - . = "were" + return "were" + return "was" /mob/p_do(temp_gender) if(!temp_gender) temp_gender = gender - . = "does" if(temp_gender == PLURAL) - . = "do" + return "do" + return "does" /mob/p_s(temp_gender) if(!temp_gender) temp_gender = gender if(temp_gender != PLURAL) - . = "s" + return "s" /mob/p_es(temp_gender) if(!temp_gender) temp_gender = gender if(temp_gender != PLURAL) - . = "es" + return "es" //humans need special handling, because they can have their gender hidden -/mob/living/carbon/human/p_they(capitalized, temp_gender) +/mob/living/carbon/human/p_they(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_their(capitalized, temp_gender) +/mob/living/carbon/human/p_their(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) @@ -316,80 +318,71 @@ temp_gender = PLURAL return ..() - //clothing need special handling due to pairs of items, ie gloves vs a singular glove, shoes, ect. -/obj/item/clothing/p_they(capitalized, temp_gender) +/obj/item/clothing/p_they(temp_gender) if(!temp_gender) temp_gender = gender - . = "it" if(temp_gender == PLURAL) - . = "they" - if(capitalized) - . = capitalize(.) + return "they" + return "it" -/obj/item/clothing/p_their(capitalized, temp_gender) +/obj/item/clothing/p_their(temp_gender) if(!temp_gender) temp_gender = gender - . = "its" if(temp_gender == PLURAL) - . = "their" - if(capitalized) - . = capitalize(.) + return "their" + return "its" -/obj/item/clothing/p_theirs(capitalized, temp_gender) +/obj/item/clothing/p_theirs(temp_gender) if(!temp_gender) temp_gender = gender - . = "its" if(temp_gender == PLURAL) - . = "theirs" - if(capitalized) - . = capitalize(.) + return "theirs" + return "its" -/obj/item/clothing/p_them(capitalized, temp_gender) +/obj/item/clothing/p_them(temp_gender) if(!temp_gender) temp_gender = gender - . = "it" if(temp_gender == PLURAL) - . = "them" - if(capitalized) - . = capitalize(.) + return "them" + return "it" /obj/item/clothing/p_have(temp_gender) if(!temp_gender) temp_gender = gender - . = "has" if(temp_gender == PLURAL) - . = "have" + return "have" + return "has" /obj/item/clothing/p_are(temp_gender) if(!temp_gender) temp_gender = gender - . = "is" if(temp_gender == PLURAL) - . = "are" + return "are" + return "is" /obj/item/clothing/p_were(temp_gender) if(!temp_gender) temp_gender = gender - . = "was" if(temp_gender == PLURAL) - . = "were" + return "were" + return "was" /obj/item/clothing/p_do(temp_gender) if(!temp_gender) temp_gender = gender - . = "does" if(temp_gender == PLURAL) - . = "do" + return "do" + return "does" /obj/item/clothing/p_s(temp_gender) if(!temp_gender) temp_gender = gender if(temp_gender != PLURAL) - . = "s" + return "s" /obj/item/clothing/p_es(temp_gender) if(!temp_gender) temp_gender = gender if(temp_gender != PLURAL) - . = "es" + return "es" diff --git a/code/__HELPERS/reagents.dm b/code/__HELPERS/reagents.dm index 60598a51515e4..d557db3173ab9 100644 --- a/code/__HELPERS/reagents.dm +++ b/code/__HELPERS/reagents.dm @@ -70,13 +70,13 @@ GLOB.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(!GLOB.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(!GLOB.chemical_reactions_list_reactant_index[rand_reagent]) + GLOB.chemical_reactions_list_reactant_index[rand_reagent] = list() + GLOB.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, result_type = null, notification = null, log = FALSE) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index e19b4a6903e4e..cf65a14fa09c0 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -4,6 +4,8 @@ #define PERSONAL_LAST_ROUND "personal last round" #define SERVER_LAST_ROUND "server last round" +GLOBAL_LIST_INIT(achievements_unlocked, list()) + /datum/controller/subsystem/ticker/proc/gather_roundend_feedback() gather_antag_data() record_nuke_disk_location() @@ -188,35 +190,42 @@ if(!human_mob.hardcore_survival_score) ///no score no glory return FALSE - if(human_mob.mind && (human_mob.mind.special_role || length(human_mob.mind.antag_datums) > 0)) - var/didthegamerwin = TRUE + if(human_mob.mind && (length(human_mob.mind.antag_datums) > 0)) for(var/datum/antagonist/antag_datums as anything in human_mob.mind.antag_datums) + if(!antag_datums.hardcore_random_bonus) //dont give bonusses to dumb stuff like revs or hypnos + continue + if(initial(antag_datums.can_assign_self_objectives) && !antag_datums.can_assign_self_objectives) + continue // You don't get a prize if you picked your own objective, you can't fail those + + var/greentexted = TRUE for(var/datum/objective/objective_datum as anything in antag_datums.objectives) if(!objective_datum.check_completion()) - didthegamerwin = FALSE - if(!didthegamerwin) - return FALSE - player_client.give_award(/datum/award/score/hardcore_random, human_mob, round(human_mob.hardcore_survival_score * 2)) - else if(considered_escaped(human_mob.mind)) - player_client.give_award(/datum/award/score/hardcore_random, human_mob, round(human_mob.hardcore_survival_score)) + greentexted = FALSE + break + if(greentexted) + var/score = round(human_mob.hardcore_survival_score * 2) + player_client.give_award(/datum/award/score/hardcore_random, human_mob, score) + log_admin("[player_client] gained [score] hardcore random points, including greentext bonus!") + return + if(considered_escaped(human_mob.mind)) + player_client.give_award(/datum/award/score/hardcore_random, human_mob, round(human_mob.hardcore_survival_score)) + log_admin("[player_client] gained [round(human_mob.hardcore_survival_score)] hardcore random points.") -/datum/controller/subsystem/ticker/proc/declare_completion() +/datum/controller/subsystem/ticker/proc/declare_completion(was_forced = END_ROUND_AS_NORMAL) set waitfor = FALSE for(var/datum/callback/roundend_callbacks as anything in round_end_events) roundend_callbacks.InvokeAsync() LAZYCLEARLIST(round_end_events) - var/speed_round = FALSE - if(world.time - SSticker.round_start_time <= 300 SECONDS) - speed_round = TRUE + var/speed_round = (STATION_TIME_PASSED() <= 10 MINUTES) for(var/client/C in GLOB.clients) if(!C?.credits) C?.RollCredits() C?.playtitlemusic(40) - if(speed_round) + if(speed_round && was_forced != ADMIN_FORCE_END_ROUND) C?.give_award(/datum/award/achievement/misc/speed_round, C?.mob) HandleRandomHardcoreScore(C) @@ -313,6 +322,8 @@ parts += goal_report() //Economy & Money parts += market_report() + //Player Achievements + parts += cheevo_report() list_clear_nulls(parts) @@ -571,7 +582,7 @@ if(!ishuman(i)) continue var/mob/living/carbon/human/human_player = i - if(!human_player.hardcore_survival_score || !human_player.onCentCom() || human_player.stat == DEAD) ///gotta escape nerd + if(!human_player.hardcore_survival_score || !considered_escaped(human_player.mind) || human_player.stat == DEAD) ///gotta escape nerd continue if(!human_player.mind) continue @@ -704,10 +715,7 @@ 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_success_suffix()]" count++ return objective_parts.Join("
") @@ -791,3 +799,25 @@ return qdel(query_update_everything_ranks) qdel(query_check_everything_ranks) + +/datum/controller/subsystem/ticker/proc/cheevo_report() + var/list/parts = list() + if(length(GLOB.achievements_unlocked)) + parts += "Achievement Get!
" + parts += "Total Achievements Earned: [length(GLOB.achievements_unlocked)]!
" + parts += "" + return "
" + +///A datum containing the info necessary for an achievement readout, reported and added to the global list in /datum/award/achievement/on_unlock(mob/user) +/datum/achievement_report + ///The winner of this achievement. + var/winner + ///The achievement that was won. + var/cheevo + ///The ckey of our winner + var/winner_key + ///The name of the area we earned this cheevo in + var/award_location diff --git a/code/__HELPERS/spatial_info.dm b/code/__HELPERS/spatial_info.dm index b98ff84a2e125..033d5a60b7989 100644 --- a/code/__HELPERS/spatial_info.dm +++ b/code/__HELPERS/spatial_info.dm @@ -74,7 +74,7 @@ /** * returns every hearaing movable in view to the turf of source not taking into account lighting * useful when you need to maintain always being able to hear something if a sound is emitted from it and you can see it (and youre in range). - * otherwise this is just a more expensive version of get_hearers_in_LOS() + * otherwise this is just a more expensive version of get_hearers_in_LOS(). * * * view_radius - what radius search circle we are using, worse performance as this increases * * source - object at the center of our search area. everything in get_turf(source) is guaranteed to be part of the search area @@ -100,25 +100,56 @@ 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() and the contents list works and can be optimized + //this is the ENTIRE reason all this shit is worth it due to how view()-like procs and the contents list works and can be optimized //internally, the contents list is secretly two linked lists, one for /obj's and one for /mob's (/atom/movable counts as /obj here) //by default, for(var/atom/name in view()) iterates through both the /obj linked list then the /mob linked list of each turf //but because what we want are only a tiny proportion of all movables, most of the things in the /obj contents list are not what we're looking for - //while every mob can hear. for this case view() has an optimization to only look through 1 of these lists if it can (eg youre only looking for mobs) + //while every mob can hear. for this case view() and similar procs have an optimization to only look through 1 of these lists if it can (eg youre only looking for mobs) //so by representing every hearing contents on a turf with a single /mob/oranges_ear containing references to all of them, we are: //1. making view() only go through the smallest of the two linked lists per turf, which contains the type we're looking for at the end //2. typechecking all mobs in the output to only actually return mobs of type /mob/oranges_ear //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)) + //using hearers is a further optimization of that because for our purposes its the same as view except we dont have to set center's luminosity to 6 and then unset it + 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 . + +/** + * The exact same as get_hearers_in_view, but not limited by visibility. Does no filtering for traits, line of sight, or any other such criteria. + * Filtering is intended to be done by whatever calls this function. + * + * This function exists to allow for mobs to hear speech without line of sight, if such a thing is needed. + * + * * radius - what radius search circle we are using, worse performance as this increases + * * source - object at the center of our search area. everything in get_turf(source) is guaranteed to be part of the search area + */ +/proc/get_hearers_in_range(range, atom/source) + var/turf/center_turf = get_turf(source) + if(!center_turf) + return + + . = list() + + if(range <= 0)//special case for if only source cares + for(var/atom/movable/target as anything in center_turf) + var/list/recursive_contents = target.important_recursive_contents?[RECURSIVE_CONTENTS_HEARING_SENSITIVE] + if(recursive_contents) + . += recursive_contents + return . + + var/list/hearables_from_grid = SSspatial_grid.orthogonal_range_search(source, RECURSIVE_CONTENTS_HEARING_SENSITIVE, range) + + if(!length(hearables_from_grid))//we know that something is returned by the grid, but we dont know if we need to actually filter down the output + return . + + for(var/atom/movable/hearable as anything in hearables_from_grid) + if (get_dist(center_turf, hearable) <= range) + . += hearable + return . /** diff --git a/code/__HELPERS/stoplag.dm b/code/__HELPERS/stoplag.dm index e838ddd97c96c..48839bdac9a6e 100644 --- a/code/__HELPERS/stoplag.dm +++ b/code/__HELPERS/stoplag.dm @@ -10,6 +10,12 @@ 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,5 +23,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 diff --git a/code/__HELPERS/string_assoc_lists.dm b/code/__HELPERS/string_assoc_lists.dm index cded3a3496915..606d9eb5038f7 100644 --- a/code/__HELPERS/string_assoc_lists.dm +++ b/code/__HELPERS/string_assoc_lists.dm @@ -12,6 +12,6 @@ GLOBAL_LIST_EMPTY(string_assoc_lists) . = GLOB.string_assoc_lists[string_id] if(.) - return + return . return GLOB.string_assoc_lists[string_id] = values diff --git a/code/__HELPERS/string_assoc_nested_lists.dm b/code/__HELPERS/string_assoc_nested_lists.dm new file mode 100644 index 0000000000000..2535f6e3f64b4 --- /dev/null +++ b/code/__HELPERS/string_assoc_nested_lists.dm @@ -0,0 +1,18 @@ +GLOBAL_LIST_EMPTY(string_assoc_nested_lists) + +/** + * Caches associative nested lists with non-numeric stringify-able index keys and stringify-able values (text/typepath -> text/path/number). + */ +/datum/proc/string_assoc_nested_list(list/list) + var/list/string_id = list() + for(var/key in list) + var/assoc = list[key] + string_id += "[key]_[islist(assoc) ? "ASSLIST([string_assoc_nested_list(assoc)])" : assoc]" + string_id = string_id.Join("-") + + . = GLOB.string_assoc_lists[string_id] + + if(.) + return . + + return GLOB.string_assoc_lists[string_id] = list diff --git a/code/__HELPERS/string_lists.dm b/code/__HELPERS/string_lists.dm index 5b3646def6e15..99ce28fba1dfe 100644 --- a/code/__HELPERS/string_lists.dm +++ b/code/__HELPERS/string_lists.dm @@ -9,7 +9,7 @@ GLOBAL_LIST_EMPTY(string_lists) . = GLOB.string_lists[string_id] if(.) - return + return . return GLOB.string_lists[string_id] = values diff --git a/code/__HELPERS/string_numbers_lists.dm b/code/__HELPERS/string_numbers_lists.dm new file mode 100644 index 0000000000000..e793bd47e32b6 --- /dev/null +++ b/code/__HELPERS/string_numbers_lists.dm @@ -0,0 +1,19 @@ +GLOBAL_LIST_EMPTY(string_numbers_lists) + +/** + * Caches lists of numeric values. + */ +/datum/proc/string_numbers_list(list/values) + //Just to to be extra-safe. If you try to shove in text or paths, you deserve the runtime errors. + var/list/sum = 0 + for(var/number in values) + sum += number + + var/string_id = values.Join("-") + + . = GLOB.string_numbers_lists[string_id] + + if(.) + return . + + return GLOB.string_numbers_lists[string_id] = values diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 1e601edf8dad5..345d850f3c0dc 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -191,7 +191,7 @@ // 0 .. 9 if(48 to 57) //Numbers - if(last_char_group == NO_CHARS_DETECTED || !allow_numbers) //suppress at start of string + if(!allow_numbers) //allow name to start with number if AI/Borg if(strict) return continue @@ -356,6 +356,11 @@ . = t[1] return uppertext(.) + copytext(t, 1 + length(.)) +///Returns a string with the first letter of each word capitialized +/proc/full_capitalize(input) + var/regex/first_letter = new(@"[^A-z]*?([A-z]*)", "g") + return replacetext(input, first_letter, /proc/capitalize) + /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). @@ -1043,27 +1048,8 @@ GLOBAL_LIST_INIT(binary, list("0","1")) * * For pressure conversion, use proc/siunit_pressure() below */ /proc/siunit(value, unit, maxdecimals=1) - var/static/list/prefixes = list("f","p","n","μ","m","","k","M","G","T","P") - - // We don't have prefixes beyond this point - // and this also captures value = 0 which you can't compute the logarithm for - // and also byond numbers are floats and doesn't have much precision beyond this point anyway - if(abs(value) <= 1e-18) - return "0 [unit]" - - var/exponent = clamp(log(10, abs(value)), -15, 15) // Calculate the exponent and clamp it so we don't go outside the prefix list bounds - var/divider = 10 ** (round(exponent / 3) * 3) // Rounds the exponent to nearest SI unit and power it back to the full form - var/coefficient = round(value / divider, 10 ** -maxdecimals) // Calculate the coefficient and round it to desired decimals - var/prefix_index = round(exponent / 3) + 6 // Calculate the index in the prefixes list for this exponent - - // An edge case which happens if we round 999.9 to 0 decimals for example, which gets rounded to 1000 - // In that case, we manually swap up to the next prefix if there is one available - if(coefficient >= 1000 && prefix_index < 11) - coefficient /= 1e3 - prefix_index++ - - var/prefix = prefixes[prefix_index] - return "[coefficient] [prefix][unit]" + var/si_isolated = siunit_isolated(value, unit, maxdecimals) + return "[si_isolated[SI_COEFFICIENT]][si_isolated[SI_UNIT]]" /** The game code never uses Pa, but kPa, since 1 Pa is too small to reasonably handle diff --git a/code/__HELPERS/turfs.dm b/code/__HELPERS/turfs.dm index f1d4befab8c96..069bf55576f66 100644 --- a/code/__HELPERS/turfs.dm +++ b/code/__HELPERS/turfs.dm @@ -210,14 +210,21 @@ Turf and target are separate in case you want to teleport some distance from a t * if the bounds are odd, the true middle turf of the atom is returned **/ /proc/get_turf_pixel(atom/checked_atom) - 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 + var/list/offsets = get_visual_offset(checked_atom) + return pixel_offset_turf(atom_turf, offsets) + +/** + * Returns how visually "off" the atom is from its source turf as a list of x, y (in pixel steps) + * it takes into account: + * Pixel_x/y + * Matrix x/y + * Icon width/height +**/ +/proc/get_visual_offset(atom/checked_atom) //Find checked_atom's matrix so we can use it's X/Y pixel shifts var/matrix/atom_matrix = matrix(checked_atom.transform) @@ -225,22 +232,29 @@ Turf and target are separate in case you want to teleport some distance from a t var/pixel_y_offset = checked_atom.pixel_y + atom_matrix.get_y_shift() //Irregular objects - var/icon/checked_atom_icon = icon(checked_atom.icon, checked_atom.icon_state) - var/checked_atom_icon_height = checked_atom_icon.Height() - var/checked_atom_icon_width = checked_atom_icon.Width() + var/list/icon_dimensions = get_icon_dimensions(checked_atom.icon) + var/checked_atom_icon_height = icon_dimensions["width"] + var/checked_atom_icon_width = icon_dimensions["height"] if(checked_atom_icon_height != world.icon_size || checked_atom_icon_width != world.icon_size) pixel_x_offset += ((checked_atom_icon_width / world.icon_size) - 1) * (world.icon_size * 0.5) pixel_y_offset += ((checked_atom_icon_height / world.icon_size) - 1) * (world.icon_size * 0.5) + return list(pixel_x_offset, pixel_y_offset) + +/** + * Takes a turf, and a list of x and y pixel offsets and returns the turf that the offset position best lands in +**/ +/proc/pixel_offset_turf(turf/offset_from, list/offsets) //DY and DX - 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) + var/rough_x = round(round(offsets[1], world.icon_size) / world.icon_size) + var/rough_y = round(round(offsets[2], world.icon_size) / world.icon_size) - var/final_x = clamp(atom_turf.x + rough_x, 1, world.maxx) - var/final_y = clamp(atom_turf.y + rough_y, 1, world.maxy) + var/final_x = clamp(offset_from.x + rough_x, 1, world.maxx) + var/final_y = clamp(offset_from.y + rough_y, 1, world.maxy) if(final_x || final_y) - return locate(final_x, final_y, atom_turf.z) + return locate(final_x, final_y, offset_from.z) + return offset_from ///Returns a turf based on text inputs, original turf and viewing client /proc/parse_caught_click_modifiers(list/modifiers, turf/origin, client/viewing_client) diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index e9df60b699ea0..3b2d52fbbb674 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -103,6 +103,28 @@ GLOBAL_LIST_INIT(modulo_angle_to_dir, list(NORTH,NORTHEAST,EAST,SOUTHEAST,SOUTH, /proc/angle2text(degree) return dir2text(angle2dir(degree)) +/// Returns a list(x, y), being the change in position required to step in the passed in direction +/proc/dir2offset(dir) + switch(dir) + if(NORTH) + return list(0, 1) + if(SOUTH) + return list(0, -1) + if(EAST) + return list(1, 0) + if(WEST) + return list(-1, 0) + if(NORTHEAST) + return list(1, 1) + if(SOUTHEAST) + return list(1, -1) + if(NORTHWEST) + return list(-1, 1) + if(SOUTHWEST) + return list(-1, -1) + else + return list(0, 0) + //Converts a blend_mode constant to one acceptable to icon.Blend() /proc/blendMode2iconMode(blend_mode) switch(blend_mode) diff --git a/code/__HELPERS/view.dm b/code/__HELPERS/view.dm index 6a4210bc53506..dc25dcc02492d 100644 --- a/code/__HELPERS/view.dm +++ b/code/__HELPERS/view.dm @@ -1,11 +1,16 @@ /proc/getviewsize(view) + if(!view) // Just to avoid any runtimes that could otherwise cause constant disconnect loops. + stack_trace("Missing value for 'view' in getviewsize(), defaulting to world.view!") + view = world.view + if(isnum(view)) var/totalviewrange = (view < 0 ? -1 : 1) + 2 * view return list(totalviewrange, totalviewrange) else - var/list/viewrangelist = splittext(view,"x") + var/list/viewrangelist = splittext(view, "x") return list(text2num(viewrangelist[1]), text2num(viewrangelist[2])) + /// Takes a string or num view, and converts it to pixel width/height in a list(pixel_width, pixel_height) /proc/view_to_pixels(view) if(!view) diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 9353bc79eeb33..2a4854c37b858 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -69,6 +69,10 @@ // We do not ship byond-tracy. Build it yourself here: https://github.com/mafemergency/byond-tracy/ // #define USE_BYOND_TRACY +// 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 + // If defined, we will NOT defer asset generation till later in the game, and will instead do it all at once, during initiialize //#define DO_NOT_DEFER_ASSETS @@ -94,7 +98,7 @@ #endif #ifndef PRELOAD_RSC //set to: -#define PRELOAD_RSC 2 // 0 to allow using external resources or on-demand behaviour; +#define PRELOAD_RSC 1 // 0 to allow using external resources or on-demand behaviour; #endif // 1 to use the default behaviour; // 2 for preloading absolutely everything; @@ -124,6 +128,8 @@ #define GC_FAILURE_HARD_LOOKUP //Ensures all early assets can actually load early #define DO_NOT_DEFER_ASSETS +//Test at full capacity, the extra cost doesn't matter +#define TIMER_DEBUG #endif #ifdef TGS diff --git a/code/_globalvars/_regexes.dm b/code/_globalvars/_regexes.dm index 63d9c73c4519c..934296fe1bcbb 100644 --- a/code/_globalvars/_regexes.dm +++ b/code/_globalvars/_regexes.dm @@ -6,6 +6,7 @@ GLOBAL_DATUM_INIT(is_email, /regex, regex("\[a-z0-9_-]+@\[a-z0-9_-]+.\[a-z0-9_-] GLOBAL_DATUM_INIT(is_alphanumeric, /regex, regex("\[a-z0-9]+", "i")) GLOBAL_DATUM_INIT(is_punctuation, /regex, regex("\[.!?]+", "i")) GLOBAL_DATUM_INIT(is_color, /regex, regex("^#\[0-9a-fA-F]{6}$")) +GLOBAL_DATUM_INIT(is_alpha_color, /regex, regex("^#\[0-9a-fA-F]{8}$")) //finds text strings recognized as links on discord. Mainly used to stop embedding. GLOBAL_DATUM_INIT(has_discord_embeddable_links, /regex, regex("(https?://\[^\\s|<\]{2,})")) diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index d2c3459d751ae..708614adea662 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -75,6 +75,7 @@ DEFINE_BITFIELD(turf_flags, list( "NOJAUNT" = NOJAUNT, "IS_SOLID" = IS_SOLID, "UNUSED_RESERVATION_TURF" = UNUSED_RESERVATION_TURF, + "RESERVATION_TURF" = RESERVATION_TURF, )) DEFINE_BITFIELD(car_traits, list( @@ -93,7 +94,7 @@ DEFINE_BITFIELD(clothing_flags, list( "LARGE_WORN_ICON" = LARGE_WORN_ICON, "LAVAPROTECT" = LAVAPROTECT, "MASKINTERNALS" = MASKINTERNALS, - "PLASMAMAN_HELMET_EXEMPT" = PLASMAMAN_HELMET_EXEMPT, + "STACKABLE_HELMET_EXEMPT" = STACKABLE_HELMET_EXEMPT, "PLASMAMAN_PREVENT_IGNITION" = PLASMAMAN_PREVENT_IGNITION, "SNUG_FIT" = SNUG_FIT, "STOPSPRESSUREDAMAGE" = STOPSPRESSUREDAMAGE, @@ -189,6 +190,7 @@ DEFINE_BITFIELD(item_flags, list( "NO_PIXEL_RANDOM_DROP" = NO_PIXEL_RANDOM_DROP, "SLOWS_WHILE_IN_HAND" = SLOWS_WHILE_IN_HAND, "SURGICAL_TOOL" = SURGICAL_TOOL, + "CRUEL_IMPLEMENT" = CRUEL_IMPLEMENT, "XENOMORPH_HOLDABLE" = XENOMORPH_HOLDABLE, "NO_BLOOD_ON_ITEM" = NO_BLOOD_ON_ITEM, )) @@ -227,14 +229,13 @@ DEFINE_BITFIELD(mat_container_flags, list( DEFINE_BITFIELD(internal_damage, list( "MECHA_INT_FIRE" = MECHA_INT_FIRE, "MECHA_INT_TEMP_CONTROL" = MECHA_INT_TEMP_CONTROL, - "MECHA_INT_TANK_BREACH" = MECHA_INT_TANK_BREACH, + "MECHA_CABIN_AIR_BREACH" = MECHA_CABIN_AIR_BREACH, "MECHA_INT_CONTROL_LOST" = MECHA_INT_CONTROL_LOST, "MECHA_INT_SHORT_CIRCUIT" = MECHA_INT_SHORT_CIRCUIT, )) DEFINE_BITFIELD(mecha_flags, list( - "ADDING_ACCESS_POSSIBLE" = ADDING_ACCESS_POSSIBLE, - "ADDING_MAINT_ACCESS_POSSIBLE" = ADDING_MAINT_ACCESS_POSSIBLE, + "ID_LOCK_ON" = ID_LOCK_ON, "CANSTRAFE" = CANSTRAFE, "LIGHTS_ON" = LIGHTS_ON, "SILICON_PILOT" = SILICON_PILOT, @@ -245,15 +246,16 @@ DEFINE_BITFIELD(mecha_flags, list( DEFINE_BITFIELD(mob_biotypes, list( "MOB_BEAST" = MOB_BEAST, "MOB_BUG" = MOB_BUG, - "MOB_EPIC" = MOB_EPIC, "MOB_HUMANOID" = MOB_HUMANOID, "MOB_MINERAL" = MOB_MINERAL, "MOB_ORGANIC" = MOB_ORGANIC, + "MOB_PLANT" = MOB_PLANT, "MOB_REPTILE" = MOB_REPTILE, "MOB_ROBOTIC" = MOB_ROBOTIC, + "MOB_SLIME" = MOB_SLIME, + "MOB_SPECIAL" = MOB_SPECIAL, "MOB_SPIRIT" = MOB_SPIRIT, "MOB_UNDEAD" = MOB_UNDEAD, - "MOB_PLANT" = MOB_PLANT )) DEFINE_BITFIELD(mob_respiration_type, list( @@ -281,18 +283,18 @@ DEFINE_BITFIELD(movement_type, list( )) DEFINE_BITFIELD(obj_flags, list( - "BLOCK_Z_IN_DOWN" = BLOCK_Z_IN_DOWN, - "BLOCK_Z_IN_UP" = BLOCK_Z_IN_UP, - "BLOCK_Z_OUT_DOWN" = BLOCK_Z_OUT_DOWN, - "BLOCK_Z_OUT_UP" = BLOCK_Z_OUT_UP, + "IN_USE" = IN_USE, + "EMAGGED" = EMAGGED, "CAN_BE_HIT" = CAN_BE_HIT, "DANGEROUS_POSSESSION" = DANGEROUS_POSSESSION, - "EMAGGED" = EMAGGED, - "IN_USE" = IN_USE, + "UNIQUE_RENAME" = UNIQUE_RENAME, + "BLOCK_Z_OUT_DOWN" = BLOCK_Z_OUT_DOWN, + "BLOCK_Z_OUT_UP" = BLOCK_Z_OUT_UP, + "BLOCK_Z_IN_DOWN" = BLOCK_Z_IN_DOWN, + "BLOCK_Z_IN_UP" = BLOCK_Z_IN_UP, "BLOCKS_CONSTRUCTION" = BLOCKS_CONSTRUCTION, "BLOCKS_CONSTRUCTION_DIR" = BLOCKS_CONSTRUCTION_DIR, "IGNORE_DENSITY" = IGNORE_DENSITY, - "UNIQUE_RENAME" = UNIQUE_RENAME, )) DEFINE_BITFIELD(pass_flags, list( @@ -372,12 +374,27 @@ DEFINE_BITFIELD(reaction_flags, list( )) DEFINE_BITFIELD(bodytype, list( - "BODYTYPE_DIGITIGRADE" = BODYTYPE_DIGITIGRADE, + "BODYTYPE_ORGANIC" = BODYTYPE_ORGANIC, + "BODYTYPE_ROBOTIC" = BODYTYPE_ROBOTIC, "BODYTYPE_HUMANOID" = BODYTYPE_HUMANOID, "BODYTYPE_MONKEY" = BODYTYPE_MONKEY, + "BODYTYPE_DIGITIGRADE" = BODYTYPE_DIGITIGRADE, + "BODYTYPE_SNOUTED" = BODYTYPE_SNOUTED, + "BODYTYPE_LARVA_PLACEHOLDER" = BODYTYPE_LARVA_PLACEHOLDER, + "BODYTYPE_ALIEN" = BODYTYPE_ALIEN, + "BODYTYPE_GOLEM" = BODYTYPE_GOLEM, +)) + +DEFINE_BITFIELD(acceptable_bodytype, list( "BODYTYPE_ORGANIC" = BODYTYPE_ORGANIC, "BODYTYPE_ROBOTIC" = BODYTYPE_ROBOTIC, + "BODYTYPE_HUMANOID" = BODYTYPE_HUMANOID, + "BODYTYPE_MONKEY" = BODYTYPE_MONKEY, + "BODYTYPE_DIGITIGRADE" = BODYTYPE_DIGITIGRADE, "BODYTYPE_SNOUTED" = BODYTYPE_SNOUTED, + "BODYTYPE_LARVA_PLACEHOLDER" = BODYTYPE_LARVA_PLACEHOLDER, + "BODYTYPE_ALIEN" = BODYTYPE_ALIEN, + "BODYTYPE_GOLEM" = BODYTYPE_GOLEM, )) DEFINE_BITFIELD(bodypart_flags, list( @@ -390,6 +407,16 @@ DEFINE_BITFIELD(change_exempt_flags, list( "BP_BLOCK_CHANGE_SPECIES" = BP_BLOCK_CHANGE_SPECIES, )) +DEFINE_BITFIELD(head_flags, list( + "HEAD_HAIR" = HEAD_HAIR, + "HEAD_FACIAL_HAIR" = HEAD_FACIAL_HAIR, + "HEAD_LIPS" = HEAD_LIPS, + "HEAD_EYESPRITES" = HEAD_EYESPRITES, + "HEAD_EYECOLOR" = HEAD_EYECOLOR, + "HEAD_EYEHOLES" = HEAD_EYEHOLES, + "HEAD_DEBRAIN" = HEAD_DEBRAIN, +)) + DEFINE_BITFIELD(supports_variations_flags, list( "CLOTHING_NO_VARIATION" = CLOTHING_NO_VARIATION, "CLOTHING_DIGITIGRADE_VARIATION" = CLOTHING_DIGITIGRADE_VARIATION, @@ -409,12 +436,14 @@ DEFINE_BITFIELD(emote_flags, list( )) DEFINE_BITFIELD(organ_flags, list( - "ORGAN_SYNTHETIC" = ORGAN_SYNTHETIC, + "ORGAN_ORGANIC" = ORGAN_ORGANIC, + "ORGAN_ROBOTIC" = ORGAN_ROBOTIC, + "ORGAN_MINERAL" = ORGAN_MINERAL, "ORGAN_FROZEN" = ORGAN_FROZEN, "ORGAN_FAILING" = ORGAN_FAILING, + "ORGAN_EMP" = ORGAN_EMP, "ORGAN_VITAL" = ORGAN_VITAL, "ORGAN_EDIBLE" = ORGAN_EDIBLE, - "ORGAN_SYNTHETIC_EMP" = ORGAN_SYNTHETIC_EMP, "ORGAN_UNREMOVABLE" = ORGAN_UNREMOVABLE, )) @@ -424,6 +453,78 @@ DEFINE_BITFIELD(respiration_type, list( "RESPIRATION_PLASMA" = RESPIRATION_PLASMA, )) +DEFINE_BITFIELD(liked_foodtypes, list( + "MEAT" = MEAT, + "VEGETABLES" = VEGETABLES, + "RAW" = RAW, + "JUNKFOOD" = JUNKFOOD, + "GRAIN" = GRAIN, + "FRUIT" = FRUIT, + "DAIRY" = DAIRY, + "FRIED" = FRIED, + "ALCOHOL" = ALCOHOL, + "SUGAR" = SUGAR, + "GROSS" = GROSS, + "TOXIC" = TOXIC, + "PINEAPPLE" = PINEAPPLE, + "BREAKFAST" = BREAKFAST, + "CLOTH" = CLOTH, + "NUTS" = NUTS, + "SEAFOOD" = SEAFOOD, + "ORANGES" = ORANGES, + "BUGS" = BUGS, + "GORE" = GORE, + "STONE" = STONE, +)) + +DEFINE_BITFIELD(disliked_foodtypes, list( + "MEAT" = MEAT, + "VEGETABLES" = VEGETABLES, + "RAW" = RAW, + "JUNKFOOD" = JUNKFOOD, + "GRAIN" = GRAIN, + "FRUIT" = FRUIT, + "DAIRY" = DAIRY, + "FRIED" = FRIED, + "ALCOHOL" = ALCOHOL, + "SUGAR" = SUGAR, + "GROSS" = GROSS, + "TOXIC" = TOXIC, + "PINEAPPLE" = PINEAPPLE, + "BREAKFAST" = BREAKFAST, + "CLOTH" = CLOTH, + "NUTS" = NUTS, + "SEAFOOD" = SEAFOOD, + "ORANGES" = ORANGES, + "BUGS" = BUGS, + "GORE" = GORE, + "STONE" = STONE, +)) + +DEFINE_BITFIELD(toxic_foodtypes, list( + "MEAT" = MEAT, + "VEGETABLES" = VEGETABLES, + "RAW" = RAW, + "JUNKFOOD" = JUNKFOOD, + "GRAIN" = GRAIN, + "FRUIT" = FRUIT, + "DAIRY" = DAIRY, + "FRIED" = FRIED, + "ALCOHOL" = ALCOHOL, + "SUGAR" = SUGAR, + "GROSS" = GROSS, + "TOXIC" = TOXIC, + "PINEAPPLE" = PINEAPPLE, + "BREAKFAST" = BREAKFAST, + "CLOTH" = CLOTH, + "NUTS" = NUTS, + "SEAFOOD" = SEAFOOD, + "ORANGES" = ORANGES, + "BUGS" = BUGS, + "GORE" = GORE, + "STONE" = STONE, +)) + DEFINE_BITFIELD(sharpness, list( "SHARP_EDGED" = SHARP_EDGED, "SHARP_POINTY" = SHARP_POINTY, @@ -434,3 +535,11 @@ DEFINE_BITFIELD(gun_flags, list( "TOY_FIREARM_OVERLAY" = TOY_FIREARM_OVERLAY, "TURRET_INCOMPATIBLE" = TURRET_INCOMPATIBLE, )) + +DEFINE_BITFIELD(bot_mode_flags, list( + "POWER_ON" = BOT_MODE_ON, + "AUTO_PATROL" = BOT_MODE_AUTOPATROL, + "REMOTE_CONTROL" = BOT_MODE_REMOTE_ENABLED, + "SAPIENCE_ALLOWED" = BOT_MODE_CAN_BE_SAPIENT, + "STARTS_POSSESSABLE" = BOT_MODE_ROUNDSTART_POSSESSION, +)) diff --git a/code/_globalvars/lighting.dm b/code/_globalvars/lighting.dm new file mode 100644 index 0000000000000..8a245328b98eb --- /dev/null +++ b/code/_globalvars/lighting.dm @@ -0,0 +1,152 @@ +GLOBAL_VAR_INIT(light_debug_enabled, FALSE) + +/// Global list of all light template types +GLOBAL_LIST_INIT_TYPED(light_types, /datum/light_template, generate_light_types()) + +/proc/generate_light_types() + var/list/types = list() + for(var/datum/light_template/template_path as anything in typesof(/datum/light_template)) + if(initial(template_path.ignore_type) == template_path) + continue + var/datum/light_template/template = new template_path() + types[template.id] = template + return types + +/// Light templates. They describe how a light looks, and links that to names/icons that can be used when templating/debugging +/datum/light_template + /// User friendly name, to display clientside + var/name = "" + /// Description to display to the client + var/desc = "" + /// Unique id for this template + var/id = "" + /// What category to put this template in + var/category = "UNSORTED" + /// Icon to use to display this clientside + var/icon = "" + /// Icon state to display clientside + var/icon_state = "" + /// The light range we use + var/range = 0 + /// The light power we use + var/power = 0 + /// The light color we use + var/color = "" + /// The light angle we use + var/angle = 360 + /// The type to spawn off create() + var/spawn_type = /obj + /// Do not load this template if its type matches the ignore type + /// This lets us do subtypes more nicely + var/ignore_type = /datum/light_template + +/datum/light_template/New() + . = ..() + id = replacetext("[type]", "/", "-") + +/// Create an atom with our light details +/datum/light_template/proc/create(atom/location, direction) + var/atom/lad = new spawn_type(location) + lad.light_flags &= ~LIGHT_FROZEN + lad.set_light(range, power, color, angle, l_on = TRUE) + lad.setDir(direction) + + lad.light_flags |= LIGHT_FROZEN + return lad + +/// Template that reads info off a light subtype +/datum/light_template/read_light + ignore_type = /datum/light_template/read_light + /// Typepath to pull our icon/state and lighting details from + var/obj/machinery/light/path_to_read + +/datum/light_template/read_light/New() + . = ..() + desc ||= "[path_to_read]" + icon ||= initial(path_to_read.icon) + icon_state ||= initial(path_to_read.icon_state) + range = initial(path_to_read.brightness) + power = initial(path_to_read.bulb_power) + color = initial(path_to_read.bulb_colour) + angle = initial(path_to_read.light_angle) + spawn_type = path_to_read + +/datum/light_template/read_light/standard_bar + name = "Light Bar" + category = "Bar" + path_to_read = /obj/machinery/light + +/datum/light_template/read_light/warm_bar + name = "Warm Bar" + category = "Bar" + path_to_read = /obj/machinery/light/warm + +/datum/light_template/read_light/dimwarm_bar + name = "Dim Warm Bar" + category = "Bar" + path_to_read = /obj/machinery/light/warm/dim + +/datum/light_template/read_light/cold_bar + name = "Cold Bar" + category = "Bar" + path_to_read = /obj/machinery/light/cold + +/datum/light_template/read_light/dimcold_bar + name = "Dim Cold Bar" + category = "Bar" + path_to_read = /obj/machinery/light/cold/dim + +/datum/light_template/read_light/red_bar + name = "Red Bar" + category = "Bar" + path_to_read = /obj/machinery/light/red + +/datum/light_template/read_light/dimred_bar + name = "Dim Red Bar" + category = "Bar" + path_to_read = /obj/machinery/light/red/dim + +/datum/light_template/read_light/blacklight_bar + name = "Black Bar" + category = "Bar" + path_to_read = /obj/machinery/light/blacklight + +/datum/light_template/read_light/dim_bar + name = "Dim Bar" + category = "Bar" + path_to_read = /obj/machinery/light/dim + +/datum/light_template/read_light/very_dim_bar + name = "Very Dim Bar" + category = "Bar" + path_to_read = /obj/machinery/light/very_dim + +/datum/light_template/read_light/standard_bulb + name = "Light Bulb" + category = "Bulb" + path_to_read = /obj/machinery/light/small + +/datum/light_template/read_light/dim_bulb + name = "Dim Bulb" + category = "Bulb" + path_to_read = /obj/machinery/light/small/dim + +/datum/light_template/read_light/red_bulb + name = "Red Bulb" + category = "Bulb" + path_to_read = /obj/machinery/light/small/red + +/datum/light_template/read_light/dimred_bulb + name = "Dim-Red Bulb" + category = "Bulb" + path_to_read = /obj/machinery/light/small/red/dim + +/datum/light_template/read_light/blacklight_bulb + name = "Black Bulb" + category = "Bulb" + path_to_read = /obj/machinery/light/small/blacklight + +/datum/light_template/read_light/standard_floor + name = "Floor Light" + category = "Misc" + path_to_read = /obj/machinery/light/floor diff --git a/code/_globalvars/lists/achievements.dm b/code/_globalvars/lists/achievements.dm index 91521694ef751..283931f99847c 100644 --- a/code/_globalvars/lists/achievements.dm +++ b/code/_globalvars/lists/achievements.dm @@ -1 +1,9 @@ GLOBAL_LIST_EMPTY(commendations) +///A list of the current achievement categories supported by the UI and checked by the achievement unit test +GLOBAL_LIST_INIT(achievement_categories, list("Bosses", "Jobs", "Skills", "Misc", "Mafia", "Scores")) +///A list of sounds that can be played when unlocking an achievement, set in the preferences. +GLOBAL_LIST_INIT(achievement_sounds, list( + CHEEVO_SOUND_PING = sound('sound/effects/glockenspiel_ping.ogg', volume = 70), + CHEEVO_SOUND_JINGLE = sound('sound/effects/beeps_jingle.ogg', volume = 70), + CHEEVO_SOUND_TADA = sound('sound/effects/tada_fanfare.ogg', volume = 30), +)) diff --git a/code/_globalvars/lists/ambience.dm b/code/_globalvars/lists/ambience.dm index 4f5d343b74381..6dd4935817fea 100644 --- a/code/_globalvars/lists/ambience.dm +++ b/code/_globalvars/lists/ambience.dm @@ -58,7 +58,7 @@ GLOBAL_LIST_INIT(engi_ambience,list( 'sound/ambience/ambitech3.ogg', )) -GLOBAL_LIST_INIT(mining_ambience,list( +GLOBAL_LIST_INIT(mining_ambience, list( 'sound/ambience/ambicave.ogg', 'sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg', @@ -76,7 +76,22 @@ GLOBAL_LIST_INIT(mining_ambience,list( 'sound/ambience/ambiruin7.ogg', )) -GLOBAL_LIST_INIT(medical_ambience,list('sound/ambience/ambinice.ogg')) +GLOBAL_LIST_INIT(icemoon_ambience,list( + 'sound/ambience/ambiicetheme.ogg', + 'sound/ambience/ambiicemelody1.ogg', + 'sound/ambience/ambiicemelody2.ogg', + 'sound/ambience/ambiicemelody3.ogg', + 'sound/ambience/ambiicemelody4.ogg', + 'sound/ambience/ambiicesting1.ogg', + 'sound/ambience/ambiicesting2.ogg', + 'sound/ambience/ambiicesting3.ogg', + 'sound/ambience/ambiicesting4.ogg', + 'sound/ambience/ambiicesting5.ogg', +)) + +GLOBAL_LIST_INIT(medical_ambience,list( + 'sound/ambience/ambinice.ogg', +)) GLOBAL_LIST_INIT(virology_ambience,list( 'sound/ambience/ambiviro.ogg', @@ -99,6 +114,8 @@ GLOBAL_LIST_INIT(space_ambience,list( 'sound/ambience/ambispace2.ogg', 'sound/ambience/ambispace3.ogg', 'sound/ambience/ambispace4.ogg', + 'sound/ambience/ambispace5.ogg', + 'sound/ambience/ambispace6.ogg', 'sound/ambience/title2.ogg', )) @@ -108,6 +125,8 @@ GLOBAL_LIST_INIT(maint_ambience,list( 'sound/ambience/ambimaint3.ogg', 'sound/ambience/ambimaint4.ogg', 'sound/ambience/ambimaint5.ogg', + 'sound/ambience/ambimaint6.ogg', + 'sound/ambience/ambimaint7.ogg', 'sound/ambience/ambitech2.ogg', 'sound/voice/lowHiss1.ogg', 'sound/voice/lowHiss2.ogg', @@ -177,6 +196,7 @@ GLOBAL_LIST_INIT(ambience_assoc,list( AMBIENCE_MEDICAL = GLOB.medical_ambience, AMBIENCE_VIROLOGY = GLOB.virology_ambience, AMBIENCE_MINING = GLOB.mining_ambience, + AMBIENCE_ICEMOON = GLOB.icemoon_ambience, AMBIENCE_REEBE = GLOB.reebe_ambience, AMBIENCE_RUINS = GLOB.ruins_ambience, AMBIENCE_SPACE = GLOB.space_ambience, diff --git a/code/_globalvars/lists/color.dm b/code/_globalvars/lists/color.dm index 26c0d89b9f188..1a195798f465a 100644 --- a/code/_globalvars/lists/color.dm +++ b/code/_globalvars/lists/color.dm @@ -5,3 +5,23 @@ GLOBAL_LIST_INIT(contrast_colors, list( COLOR_TAN_ORANGE, COLOR_VIOLET, )) + +/// Weighted list of colours a carp can be +/// Weighted list of usual carp colors +GLOBAL_LIST_INIT(carp_colors, list( + COLOR_CARP_PURPLE = 7, + COLOR_CARP_PINK = 7, + COLOR_CARP_GREEN = 7, + COLOR_CARP_GRAPE = 7, + COLOR_CARP_SWAMP = 7, + COLOR_CARP_TURQUOISE = 7, + COLOR_CARP_BROWN = 7, + COLOR_CARP_TEAL = 7, + COLOR_CARP_LIGHT_BLUE = 7, + COLOR_CARP_RUSTY = 7, + COLOR_CARP_RED = 7, + COLOR_CARP_YELLOW = 7, + COLOR_CARP_BLUE = 7, + COLOR_CARP_PALE_GREEN = 7, + COLOR_CARP_SILVER = 1, // The rare silver carp +)) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index f8a535325d9f4..0ed53c3043d00 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -28,9 +28,9 @@ GLOBAL_LIST_EMPTY(legs_list) GLOBAL_LIST_EMPTY(animated_spines_list) //Mutant Human bits -GLOBAL_LIST_EMPTY(tails_list) -GLOBAL_LIST_EMPTY(tails_list_human) //Only exists for preference choices. Use "tails_list" otherwise. -GLOBAL_LIST_EMPTY(tails_list_lizard) //See above! +GLOBAL_LIST_EMPTY(tails_list_human) +GLOBAL_LIST_EMPTY(tails_list_lizard) +GLOBAL_LIST_EMPTY(tails_list_monkey) GLOBAL_LIST_EMPTY(ears_list) GLOBAL_LIST_EMPTY(wings_list) GLOBAL_LIST_EMPTY(wings_open_list) @@ -62,6 +62,14 @@ GLOBAL_LIST_INIT(color_list_ethereal, list( "White" = "#f2f2f2", )) +GLOBAL_LIST_INIT(color_list_lustrous, list( + "Cyan Blue" = "#00ffff", + "Sky Blue" = "#37c0ff", + "Blue" = "#3374ff", + "Dark Blue" = "#5b5beb", + "Bright Red" = "#fa2d2d", +)) + GLOBAL_LIST_INIT(ghost_forms_with_directions_list, list( "catghost", "ghost_black", @@ -122,68 +130,6 @@ GLOBAL_LIST_INIT(ghost_forms_with_accessories_list, list( )) //stores the ghost forms that support hair and other such things -GLOBAL_LIST_INIT(ai_core_display_screens, sort_list(list( - ":thinking:", - "Alien", - "Angel", - "Banned", - "Bliss", - "Blue", - "Clown", - "Database", - "Dorf", - "Firewall", - "Fuzzy", - "Gentoo", - "Glitchman", - "Gondola", - "Goon", - "Hades", - "HAL 9000", - "Heartline", - "Helios", - "House", - "Inverted", - "Matrix", - "Monochrome", - "Murica", - "Nanotrasen", - "Not Malf", - "Portrait", - "President", - "Rainbow", - "Random", - "Red October", - "Red", - "Static", - "Syndicat Meow", - "Text", - "Too Deep", - "Triumvirate-M", - "Triumvirate", - "Weird", -))) - -/// A form of resolve_ai_icon that is guaranteed to never sleep. -/// Not always accurate, but always synchronous. -/proc/resolve_ai_icon_sync(input) - SHOULD_NOT_SLEEP(TRUE) - - if(!input || !(input in GLOB.ai_core_display_screens)) - return "ai" - else - if(input == "Random") - input = pick(GLOB.ai_core_display_screens - "Random") - return "ai-[lowertext(input)]" - -/proc/resolve_ai_icon(input) - if (input == "Portrait") - var/datum/portrait_picker/tgui = new(usr)//create the datum - tgui.ui_interact(usr)//datum has a tgui component, here we open the window - return "ai-portrait" //just take this until they decide - - return resolve_ai_icon_sync(input) - GLOBAL_LIST_INIT(security_depts_prefs, sort_list(list( SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, @@ -196,17 +142,21 @@ GLOBAL_LIST_INIT(security_depts_prefs, sort_list(list( #define DBACKPACK "Department Backpack" #define DDUFFELBAG "Department Duffel Bag" #define DSATCHEL "Department Satchel" +#define DMESSENGER "Department Messenger Bag" #define GBACKPACK "Grey Backpack" #define GDUFFELBAG "Grey Duffel Bag" #define GSATCHEL "Grey Satchel" +#define GMESSENGER "Grey Messenger Bag" #define LSATCHEL "Leather Satchel" GLOBAL_LIST_INIT(backpacklist, list( DBACKPACK, DDUFFELBAG, DSATCHEL, + DMESSENGER, GBACKPACK, GDUFFELBAG, GSATCHEL, + GMESSENGER, LSATCHEL, )) @@ -343,7 +293,12 @@ GLOBAL_LIST_INIT(status_display_approved_pictures, list( "default", "biohazard", "lockdown", + "greenalert", + "bluealert", "redalert", + "deltaalert", + "radiation", + "currentalert", //For automatic set of status display on current level )) // Members of status_display_approved_pictures that are actually states and not alert values diff --git a/code/_globalvars/lists/icons.dm b/code/_globalvars/lists/icons.dm new file mode 100644 index 0000000000000..ff60e6bc8d928 --- /dev/null +++ b/code/_globalvars/lists/icons.dm @@ -0,0 +1,2 @@ +/// Cache of the width and height of icon files, to avoid repeating the same expensive operation +GLOBAL_LIST_EMPTY(icon_dimensions) diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index 4ee93801cfefa..50575d24b5b20 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -171,7 +171,7 @@ GLOBAL_LIST_INIT(uncommon_loot, list(//uncommon: useful items /obj/item/pen/fountain = 1, /obj/item/restraints/handcuffs/cable = 1, /obj/item/restraints/legcuffs/bola = 1, - /obj/item/roller = 1, + /obj/item/emergency_bed = 1, /obj/item/spear = 1, /obj/item/weldingtool/largetank = 1, /obj/item/market_uplink/blackmarket = 1, @@ -216,6 +216,7 @@ GLOBAL_LIST_INIT(uncommon_loot, list(//uncommon: useful items /obj/item/stack/medical/gauze = 1, /obj/item/stack/medical/mesh = 1, /obj/item/stack/medical/suture = 1, + /obj/item/stack/medical/bandage = 1, ) = 1, list(//medical chems /obj/item/reagent_containers/cup/bottle/multiver = 1, @@ -301,7 +302,7 @@ GLOBAL_LIST_INIT(rarity_loot, list(//rare: really good items /obj/item/shield/buckler = 1, /obj/item/throwing_star = 1, /obj/item/weldingtool/hugetank = 1, - /obj/item/fishing_rod/master = 1, + /obj/item/fishing_rod/telescopic/master = 1, /obj/item/spess_knife = 1, ) = 1, @@ -333,6 +334,7 @@ GLOBAL_LIST_INIT(rarity_loot, list(//rare: really good items /obj/item/storage/box/hug/medical = 1, /obj/item/storage/medkit/emergency = 1, /obj/item/storage/medkit/regular = 1, + /obj/item/storage/box/bandages = 1, ) = 1, list(//medical chems /obj/item/reagent_containers/hypospray/medipen/oxandrolone = 1, @@ -342,10 +344,12 @@ GLOBAL_LIST_INIT(rarity_loot, list(//rare: really good items ) = 1, list(//misc - /obj/item/book/granter/crafting_recipe/pipegun_prime = 1, + /obj/item/book/granter/crafting_recipe/dusting/pipegun_prime = 1, /obj/item/book/granter/crafting_recipe/trash_cannon = 1, + /obj/item/book/granter/crafting_recipe/dusting/laser_musket_prime = 1, /obj/item/book/granter/sign_language = 1, /obj/item/disk/nuclear/fake = 1, + /obj/item/disk/surgery/advanced_plastic_surgery = 1, /obj/item/skillchip/brainwashing = 1, /obj/item/tattoo_kit = 1, /obj/item/folder/ancient_paperwork = 1, diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm index be439d8217fc2..8ac2f0d3ddfe5 100644 --- a/code/_globalvars/lists/mapping.dm +++ b/code/_globalvars/lists/mapping.dm @@ -127,6 +127,9 @@ GLOBAL_LIST_EMPTY(emergencyresponseteamspawn) GLOBAL_LIST_EMPTY(ruin_landmarks) GLOBAL_LIST_EMPTY(bar_areas) +/// List of all the maps that have been cached for /proc/load_map +GLOBAL_LIST_EMPTY(cached_maps) + /// Away missions GLOBAL_LIST_EMPTY(vr_spawnpoints) diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index 1c6b4b90bc63a..5fc93a2494e30 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -52,11 +52,16 @@ GLOBAL_LIST_EMPTY(current_living_antags) /// All observers with clients that joined as observers. GLOBAL_LIST_EMPTY(current_observers_list) +/// All living mobs which can hear blob telepathy +GLOBAL_LIST_EMPTY(blob_telepathy_mobs) + ///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) GLOBAL_LIST_EMPTY(language_datum_instances) GLOBAL_LIST_EMPTY(all_languages) +///List of all languages ("name" = type) +GLOBAL_LIST_EMPTY(language_types_by_name) GLOBAL_LIST_EMPTY(sentient_disease_instances) @@ -111,7 +116,7 @@ GLOBAL_LIST_INIT(construct_radial_images, list( /proc/get_crewmember_minds() var/list/minds = list() for(var/datum/record/locked/target in GLOB.manifest.locked) - var/datum/mind/mind = target.mind_ref + var/datum/mind/mind = target.mind_ref.resolve() if(mind) minds += mind return minds diff --git a/code/_globalvars/lists/names.dm b/code/_globalvars/lists/names.dm index 018164e2c7878..01e6f3b59dc1f 100644 --- a/code/_globalvars/lists/names.dm +++ b/code/_globalvars/lists/names.dm @@ -23,6 +23,7 @@ GLOBAL_LIST_INIT(posibrain_names, world.file2list("strings/names/posibrain.txt") GLOBAL_LIST_INIT(nightmare_names, world.file2list("strings/names/nightmare.txt")) GLOBAL_LIST_INIT(megacarp_first_names, world.file2list("strings/names/megacarp1.txt")) GLOBAL_LIST_INIT(megacarp_last_names, world.file2list("strings/names/megacarp2.txt")) +GLOBAL_LIST_INIT(cyberauth_names, world.file2list("strings/names/cyberauth.txt")) GLOBAL_LIST_INIT(verbs, world.file2list("strings/names/verbs.txt")) GLOBAL_LIST_INIT(ing_verbs, world.file2list("strings/names/ing_verbs.txt")) diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 3718ebce83ae1..2fd384e69a94f 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -1,31 +1,53 @@ -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 -GLOBAL_LIST_EMPTY(deliverybeacons) //list of all MULEbot delivery beacons. -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 +/// List of all cables, so that powernets don't have to look through the entire world all the time +GLOBAL_LIST_EMPTY(cable_list) + +/// List of all portals +GLOBAL_LIST_EMPTY(portals) + +/// List of all curtains for button tracking +GLOBAL_LIST_EMPTY(curtains) + +/// List of all mechs for hostile mob target tracking +GLOBAL_LIST_EMPTY(mechas_list) + +/// List of all atoms that can call the shuttle, for automatic shuttle calls when there are none. +GLOBAL_LIST_EMPTY(shuttle_caller_list) + +/// List of all nukie shuttle boards, for forcing launch delay if they declare war +GLOBAL_LIST_EMPTY(syndicate_shuttle_boards) + +/// List of all nav beacons indexed by stringified z level +GLOBAL_LIST_EMPTY(navbeacons) + +/// List of all active teleport beacons +GLOBAL_LIST_EMPTY(teleportbeacons) + +/// List of all active delivery beacons +GLOBAL_LIST_EMPTY(deliverybeacons) + +/// List of all active delivery beacon locations +GLOBAL_LIST_EMPTY(deliverybeacontags) + +/// List of all singularity components that exist +GLOBAL_LIST_EMPTY_TYPED(singularities, /datum/component/singularity) + +/// list of all /datum/chemical_reaction datums indexed by their typepath. Use this for general lookup stuff +GLOBAL_LIST(chemical_reactions_list) +/// list of all /datum/chemical_reaction datums. Used during chemical reactions. Indexed by REACTANT types +GLOBAL_LIST(chemical_reactions_list_reactant_index) +/// list of all /datum/chemical_reaction datums. Used for the reaction lookup UI. Indexed by PRODUCT type +GLOBAL_LIST(chemical_reactions_list_product_index) /// list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff +GLOBAL_LIST_INIT(chemical_reagents_list, init_chemical_reagent_list()) /// names of reagents used by plumbing UI. GLOBAL_LIST_INIT(chemical_name_list, init_chemical_name_list()) -GLOBAL_LIST(chemical_reactions_results_lookup_list) //List of all reactions with their associated product and result ids. Used for reaction lookups -GLOBAL_LIST(fake_reagent_blacklist) //List of all reagents that are parent types used to define a bunch of children - but aren't used themselves as anything. -GLOBAL_LIST_EMPTY(tech_list) //list of all /datum/tech datums indexed by id. -GLOBAL_LIST_INIT(surgeries_list, init_surgeries()) //list of all surgeries by name, associated with their path. +/// List of all reactions with their associated product and result ids. Used for reaction lookups +GLOBAL_LIST(chemical_reactions_results_lookup_list) +/// List of all reagents that are parent types used to define a bunch of children - but aren't used themselves as anything. +GLOBAL_LIST(fake_reagent_blacklist) +/// list of all /datum/tech datums indexed by id. +GLOBAL_LIST_EMPTY(tech_list) +/// list of all surgeries by name, associated with their path. +GLOBAL_LIST_INIT(surgeries_list, init_surgeries()) /// Global list of all non-cooking related crafting recipes. GLOBAL_LIST_EMPTY(crafting_recipes) @@ -37,31 +59,45 @@ GLOBAL_LIST_EMPTY(cooking_recipes) /// This is a global list of typepaths, these typepaths are atoms or reagents that are associated with cooking recipes. /// This includes stuff like recipe components and results. GLOBAL_LIST_EMPTY(cooking_recipes_atoms) - -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 +/// list of Rapid Construction Devices. +GLOBAL_LIST_EMPTY(rcd_list) +/// list of wallmounted intercom radios. +GLOBAL_LIST_EMPTY(intercoms_list) +/// 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_implants) +/// list of implants the prisoner console can track and send inject commands too +GLOBAL_LIST_EMPTY(tracked_chem_implants) +/// list of all pinpointers. Used to change stuff they are pointing to all at once. +GLOBAL_LIST_EMPTY(pinpointer_list) +/// A list of all zombie_infection organs, for any mass "animation" +GLOBAL_LIST_EMPTY(zombie_infection_list) +/// List of all meteors. +GLOBAL_LIST_EMPTY(meteor_list) +/// List of active radio jammers +GLOBAL_LIST_EMPTY(active_jammers) GLOBAL_LIST_EMPTY(ladders) GLOBAL_LIST_EMPTY(stairs) GLOBAL_LIST_EMPTY(janitor_devices) GLOBAL_LIST_EMPTY(trophy_cases) GLOBAL_LIST_EMPTY(experiment_handlers) + ///This is a global list of all signs you can change an existing sign or new sign backing to, when using a pen on them. GLOBAL_LIST_INIT(editable_sign_types, populate_editable_sign_types()) GLOBAL_LIST_EMPTY(wire_color_directory) GLOBAL_LIST_EMPTY(wire_name_directory) -GLOBAL_LIST_EMPTY(ai_status_displays) +/// List of all instances of /obj/effect/mob_spawn/ghost_role in the game world +GLOBAL_LIST_EMPTY(mob_spawners) + +/// List of all mobs with the "ghost_direct_control" component +GLOBAL_LIST_EMPTY(joinable_mobs) + +/// List of area names of roundstart station cyborg rechargers, for the low charge/no charge cyborg screen alert tooltips. +GLOBAL_LIST_EMPTY(roundstart_station_borgcharger_areas) -GLOBAL_LIST_EMPTY(mob_spawners) // All mob_spawn objects -GLOBAL_LIST_EMPTY(alert_consoles) // Station alert consoles, /obj/machinery/computer/station_alert +/// List of area names of roundstart station mech rechargers, for the low charge/no charge mech screen alert tooltips. +GLOBAL_LIST_EMPTY(roundstart_station_mechcharger_areas) -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. +/// Associative list of alcoholic container typepath to instances, currently used by the alcoholic quirk +GLOBAL_LIST_INIT(alcohol_containers, init_alcohol_containers()) diff --git a/code/_globalvars/lists/poll_ignore.dm b/code/_globalvars/lists/poll_ignore.dm index 96d49f88a1c78..7d532ec3aea3d 100644 --- a/code/_globalvars/lists/poll_ignore.dm +++ b/code/_globalvars/lists/poll_ignore.dm @@ -1,60 +1,78 @@ //Each lists stores ckeys for "Never for this round" option category -#define POLL_IGNORE_SENTIENCE_POTION "sentience_potion" -#define POLL_IGNORE_POSSESSED_BLADE "possessed_blade" +#define POLL_IGNORE_ACADEMY_WIZARD "academy_wizard" #define POLL_IGNORE_ALIEN_LARVA "alien_larva" -#define POLL_IGNORE_SYNDICATE "syndicate" -#define POLL_IGNORE_HOLOPARASITE "holoparasite" -#define POLL_IGNORE_POSIBRAIN "posibrain" -#define POLL_IGNORE_SPECTRAL_BLADE "spectral_blade" -#define POLL_IGNORE_CONSTRUCT "construct" -#define POLL_IGNORE_SPIDER "spider" +#define POLL_IGNORE_ASH_SPIRIT "ash_spirit" #define POLL_IGNORE_ASHWALKER "ashwalker" -#define POLL_IGNORE_GOLEM "golem" +#define POLL_IGNORE_BLOB "blob" +#define POLL_IGNORE_BOTS "bots" +#define POLL_IGNORE_CARGORILLA "cargorilla" +#define POLL_IGNORE_CONTRACTOR_SUPPORT "contractor_support" +#define POLL_IGNORE_CONSTRUCT "construct" #define POLL_IGNORE_DRONE "drone" +#define POLL_IGNORE_FIRE_SHARK "fire_shark" #define POLL_IGNORE_FUGITIVE "fugitive" -#define POLL_IGNORE_PYROSLIME "slime" -#define POLL_IGNORE_SHADE "shade" +#define POLL_IGNORE_GOLEM "golem" +#define POLL_IGNORE_HERETIC_MONSTER "heretic_monster" +#define POLL_IGNORE_HOLOPARASITE "holoparasite" #define POLL_IGNORE_IMAGINARYFRIEND "imaginary_friend" -#define POLL_IGNORE_SPLITPERSONALITY "split_personality" -#define POLL_IGNORE_CONTRACTOR_SUPPORT "contractor_support" -#define POLL_IGNORE_ACADEMY_WIZARD "academy_wizard" +#define POLL_IGNORE_LAVALAND_ELITE "lavaland_elite" +#define POLL_IGNORE_MAID_IN_MIRROR "maid_in_mirror" +#define POLL_IGNORE_MONKEY_HELMET "mind_magnified_monkey" #define POLL_IGNORE_PAI "pai" -#define POLL_IGNORE_VENUSHUMANTRAP "venus_human_trap" +#define POLL_IGNORE_POSIBRAIN "posibrain" +#define POLL_IGNORE_POSSESSED_BLADE "possessed_blade" +#define POLL_IGNORE_PYROSLIME "slime" +#define POLL_IGNORE_RAW_PROPHET "raw_prophet" #define POLL_IGNORE_REGAL_RAT "regal_rat" -#define POLL_IGNORE_CARGORILLA "cargorilla" -#define POLL_IGNORE_MONKEY_HELMET "mind_magnified_monkey" -#define POLL_IGNORE_LAVALAND_ELITE "lavaland_elite" +#define POLL_IGNORE_RUST_SPIRIT "rust_spirit" +#define POLL_IGNORE_SENTIENCE_POTION "sentience_potion" +#define POLL_IGNORE_SHADE "shade" #define POLL_IGNORE_SHUTTLE_DENIZENS "shuttle_denizens" +#define POLL_IGNORE_SPECTRAL_BLADE "spectral_blade" +#define POLL_IGNORE_SPIDER "spider" +#define POLL_IGNORE_SPLITPERSONALITY "split_personality" +#define POLL_IGNORE_STALKER "stalker" +#define POLL_IGNORE_SYNDICATE "syndicate" +#define POLL_IGNORE_VENUSHUMANTRAP "venus_human_trap" GLOBAL_LIST_INIT(poll_ignore_desc, list( - POLL_IGNORE_SENTIENCE_POTION = "Sentience potion", - POLL_IGNORE_POSSESSED_BLADE = "Possessed blade", + POLL_IGNORE_ACADEMY_WIZARD = "Academy Wizard Defender", POLL_IGNORE_ALIEN_LARVA = "Xenomorph larva", - POLL_IGNORE_SYNDICATE = "Syndicate", - POLL_IGNORE_HOLOPARASITE = "Holoparasite", - POLL_IGNORE_POSIBRAIN = "Positronic brain", - POLL_IGNORE_SPECTRAL_BLADE = "Spectral blade", - POLL_IGNORE_CONSTRUCT = "Construct", - POLL_IGNORE_SPIDER = "Spiders", + POLL_IGNORE_ASH_SPIRIT = "Ash Spirit", POLL_IGNORE_ASHWALKER = "Ashwalker eggs", - POLL_IGNORE_GOLEM = "Golems", + POLL_IGNORE_BLOB = "Blob spores", + POLL_IGNORE_BOTS = "Bots", + POLL_IGNORE_CARGORILLA = "Cargorilla", + POLL_IGNORE_CONTRACTOR_SUPPORT = "Contractor Support Unit", + POLL_IGNORE_CONSTRUCT = "Construct", POLL_IGNORE_DRONE = "Drone shells", + POLL_IGNORE_FIRE_SHARK = "Fire Shark", POLL_IGNORE_FUGITIVE = "Fugitive Hunter", - POLL_IGNORE_PYROSLIME = "Slime", - POLL_IGNORE_SHADE = "Shade", + POLL_IGNORE_GOLEM = "Golems", + POLL_IGNORE_HERETIC_MONSTER = "Heretic Monster", + POLL_IGNORE_HOLOPARASITE = "Holoparasite", POLL_IGNORE_IMAGINARYFRIEND = "Imaginary Friend", - POLL_IGNORE_SPLITPERSONALITY = "Split Personality", - POLL_IGNORE_CONTRACTOR_SUPPORT = "Contractor Support Unit", - POLL_IGNORE_ACADEMY_WIZARD = "Academy Wizard Defender", + POLL_IGNORE_LAVALAND_ELITE = "Lavaland elite", + POLL_IGNORE_MAID_IN_MIRROR = "Maid in the Mirror", + POLL_IGNORE_MONKEY_HELMET = "Mind magnified monkey", POLL_IGNORE_PAI = JOB_PERSONAL_AI, - POLL_IGNORE_VENUSHUMANTRAP = "Venus Human Traps", + POLL_IGNORE_POSIBRAIN = "Positronic brain", + POLL_IGNORE_POSSESSED_BLADE = "Possessed blade", + POLL_IGNORE_PYROSLIME = "Slime", + POLL_IGNORE_RAW_PROPHET = "Raw Prophet", + POLL_IGNORE_RUST_SPIRIT = "Rust Spirit", POLL_IGNORE_REGAL_RAT = "Regal rat", - POLL_IGNORE_CARGORILLA = "Cargorilla", - POLL_IGNORE_MONKEY_HELMET = "Mind magnified monkey", - POLL_IGNORE_LAVALAND_ELITE = "Lavaland elite", + POLL_IGNORE_SENTIENCE_POTION = "Sentience potion", + POLL_IGNORE_SHADE = "Shade", POLL_IGNORE_SHUTTLE_DENIZENS = "Shuttle denizens", + POLL_IGNORE_SPECTRAL_BLADE = "Spectral blade", + POLL_IGNORE_SPIDER = "Spiders", + POLL_IGNORE_SPLITPERSONALITY = "Split Personality", + POLL_IGNORE_STALKER = "Stalker", + POLL_IGNORE_SYNDICATE = "Syndicate", + POLL_IGNORE_VENUSHUMANTRAP = "Venus Human Traps", )) GLOBAL_LIST_INIT(poll_ignore, init_poll_ignore()) diff --git a/code/_globalvars/lists/quirks.dm b/code/_globalvars/lists/quirks.dm index 8838ce69ab75c..30fce3e295bb6 100644 --- a/code/_globalvars/lists/quirks.dm +++ b/code/_globalvars/lists/quirks.dm @@ -9,3 +9,11 @@ GLOBAL_LIST_INIT(nearsighted_glasses, list( "Jamjar" = /obj/item/clothing/glasses/regular/jamjar, "Binoclard" = /obj/item/clothing/glasses/regular/kim, )) + +///Options for the prothetic limb quirk to choose from +GLOBAL_LIST_INIT(limb_choice, list( + "Left Arm" = /obj/item/bodypart/arm/left/robot/surplus, + "Right Arm" = /obj/item/bodypart/arm/right/robot/surplus, + "Left Leg" = /obj/item/bodypart/leg/left/robot/surplus, + "Right Leg" = /obj/item/bodypart/leg/right/robot/surplus, +)) diff --git a/code/_globalvars/lists/typecache.dm b/code/_globalvars/lists/typecache.dm index 0436b4d3b0866..07e0eabf01f62 100644 --- a/code/_globalvars/lists/typecache.dm +++ b/code/_globalvars/lists/typecache.dm @@ -17,12 +17,28 @@ GLOBAL_LIST_INIT(typecache_machine_or_structure, typecacheof(list( /// 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, - /obj/machinery/stasis, /obj/structure/closet, /obj/structure/rack, /obj/structure/table, + //Kitchen /obj/machinery/smartfridge, /obj/machinery/smartfridge/drying_rack, // Redundant, given above, but this is for the sake of explicitness. + /obj/structure/bonfire, + /obj/machinery/grill, + /obj/machinery/griddle, + /obj/machinery/deepfryer, + /obj/machinery/processor, + /obj/machinery/microwave, + /obj/machinery/oven, + /obj/machinery/stove, + /obj/machinery/gibber, + /obj/machinery/icecream_vat, + //Botany + /obj/machinery/hydroponics, // So that harvest doesn't catch germs or decompose (includes dirt piles) + //Medbay + /obj/machinery/stasis, + /obj/machinery/chem_master, // Pills may catch germs + /obj/machinery/plumbing/pill_press, ))) /// A typecache of objects that player controlled, easily accessible, hostile mobs should not be able to attack diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm index d9adb3c8bffd5..f9a878c3da9e7 100644 --- a/code/_globalvars/phobias.dm +++ b/code/_globalvars/phobias.dm @@ -13,6 +13,7 @@ GLOBAL_LIST_INIT(phobia_types, sort_list(list( "falling", "greytide", "guns", + "heresy", "insects", "lizards", "robots", @@ -37,6 +38,7 @@ GLOBAL_LIST_INIT(phobia_regexes, list( "falling" = construct_phobia_regex("falling"), "greytide" = construct_phobia_regex("greytide"), "guns" = construct_phobia_regex("guns"), + "heresy" = construct_phobia_regex("heresy"), "insects" = construct_phobia_regex("insects"), "lizards" = construct_phobia_regex("lizards"), "ocky icky" = construct_phobia_regex("ocky icky"), @@ -59,18 +61,21 @@ GLOBAL_LIST_INIT(phobia_mobs, list( "birds" = typecacheof(list( /mob/living/basic/chick, /mob/living/basic/chicken, + /mob/living/basic/pet/penguin, /mob/living/simple_animal/parrot, - /mob/living/simple_animal/pet/penguin, )), "conspiracies" = typecacheof(list( /mob/living/simple_animal/bot/secbot, /mob/living/simple_animal/drone, - /mob/living/simple_animal/pet/penguin, + /mob/living/basic/pet/penguin, )), "doctors" = typecacheof(list(/mob/living/simple_animal/bot/medbot)), + "heresy" = typecacheof(list( + /mob/living/basic/heretic_summon, + )), "insects" = typecacheof(list( /mob/living/basic/cockroach, - /mob/living/simple_animal/hostile/bee, + /mob/living/basic/bee, )), "lizards" = typecacheof(list(/mob/living/basic/lizard)), "robots" = typecacheof(list( @@ -78,21 +83,21 @@ GLOBAL_LIST_INIT(phobia_mobs, list( /mob/living/silicon/robot, /mob/living/simple_animal/bot, /mob/living/simple_animal/drone, + )), "security" = typecacheof(list(/mob/living/simple_animal/bot/secbot)), - "spiders" = typecacheof(list(/mob/living/basic/giant_spider)), + "spiders" = typecacheof(list(/mob/living/basic/spider/giant)), "skeletons" = typecacheof(list(/mob/living/simple_animal/hostile/skeleton)), - "snakes" = typecacheof(list(/mob/living/simple_animal/hostile/retaliate/snake)), - )), + "snakes" = typecacheof(list(/mob/living/basic/snake)), "the supernatural" = typecacheof(list( /mob/dead/observer, + /mob/living/basic/bat, + /mob/living/basic/demon, + /mob/living/basic/faithless, + /mob/living/basic/ghost, + /mob/living/basic/heretic_summon, /mob/living/simple_animal/bot/mulebot/paranormal, /mob/living/simple_animal/hostile/construct, /mob/living/simple_animal/hostile/dark_wizard, - /mob/living/basic/faithless, - /mob/living/simple_animal/hostile/heretic_summon, - /mob/living/simple_animal/hostile/imp, - /mob/living/basic/bat, - /mob/living/basic/ghost, /mob/living/simple_animal/hostile/skeleton, /mob/living/simple_animal/hostile/wizard, /mob/living/simple_animal/hostile/zombie, @@ -147,7 +152,7 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/item/highfrequencyblade, /obj/item/katana, /obj/item/nullrod/claymore/katana, - /obj/item/nullrod/scythe/vibro, + /obj/item/nullrod/vibro, /obj/item/reagent_containers/cup/glass/bottle/sake, /obj/item/throwing_star, /obj/item/toy/katana, @@ -235,7 +240,9 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/item/clothing/mask/gas/clown_hat, /obj/item/clothing/shoes/clown_shoes, /obj/item/clothing/suit/chaplainsuit/clownpriest, + /obj/item/clothing/head/helmet/space/plasmaman/clown, /obj/item/clothing/under/plasmaman/clown, + /obj/item/clothing/gloves/color/plasmaman/clown, /obj/item/clothing/under/rank/civilian/clown, /obj/item/food/cheesiehonkers, /obj/item/food/pie/cream, @@ -322,7 +329,7 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/item/storage/pill_bottle, /obj/item/surgical_drapes, /obj/item/surgicaldrill, - /obj/machinery/atmospherics/components/unary/cryo_cell, + /obj/machinery/cryo_cell, /obj/machinery/dna_scannernew, /obj/machinery/door/airlock/medical, /obj/machinery/sleeper, @@ -354,6 +361,35 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/machinery/porta_turret, /obj/machinery/power/emitter, )), + "heresy" = typecacheof(list( + /obj/effect/floating_blade, + /obj/effect/forcefield/cosmic_field, + /obj/effect/forcefield/wizard/heretic, + /obj/effect/heretic_influence, + /obj/effect/heretic_rune, + /obj/effect/knock_portal, + /obj/effect/visible_heretic_influence, + /obj/item/ammo_box/strilka310/lionhunter, + /obj/item/ammo_casing/strilka310/lionhunter, + /obj/item/clothing/mask/madness_mask, + /obj/item/clothing/neck/eldritch_amulet, + /obj/item/clothing/neck/fake_heretic_amulet, + /obj/item/clothing/neck/heretic_focus, + /obj/item/clothing/suit/hooded/cultrobes/eldritch, + /obj/item/codex_cicatrix, + /obj/item/coin/eldritch, + /obj/item/gun/ballistic/rifle/lionhunter, + /obj/item/heretic_lintel, + /obj/item/melee/rune_carver, + /obj/item/melee/sickly_blade, + /obj/item/melee/touch_attack/mansus_fist, + /obj/item/reagent_containers/cup/beaker/eldritch, + /obj/item/toy/eldritch_book, + /obj/item/toy/reality_pierce, + /obj/projectile/curse_hand, + /obj/structure/destructible/eldritch_crucible, + /obj/structure/knock_tear, + )), "insects" = typecacheof(list( /obj/item/clothing/mask/animal/small/bee, /obj/item/clothing/suit/hooded/bee_costume, diff --git a/code/_globalvars/religion.dm b/code/_globalvars/religion.dm index 164491a0a3a7d..063ff0e864280 100644 --- a/code/_globalvars/religion.dm +++ b/code/_globalvars/religion.dm @@ -14,3 +14,37 @@ GLOBAL_LIST_EMPTY(chaplain_altars) //gear GLOBAL_VAR(holy_weapon_type) GLOBAL_VAR(holy_armor_type) + +/// Sets a new religious sect used by all chaplains int he round +/proc/set_new_religious_sect(path, reset_existing = FALSE) + if(!ispath(path, /datum/religion_sect)) + message_admins("[ADMIN_LOOKUPFLW(usr)] has tried to spawn an item when selecting a sect.") + return + + if(!isnull(GLOB.religious_sect)) + if (!reset_existing) + return + reset_religious_sect() + + GLOB.religious_sect = new path() + for(var/i in GLOB.player_list) + if(!isliving(i)) + continue + var/mob/living/am_i_holy_living = i + if(!am_i_holy_living.mind?.holy_role) + continue + GLOB.religious_sect.on_conversion(am_i_holy_living) + SEND_GLOBAL_SIGNAL(COMSIG_RELIGIOUS_SECT_CHANGED) + +/// Removes any existing religious sect from chaplains, allowing another to be selected +/proc/reset_religious_sect() + for(var/i in GLOB.player_list) + if(!isliving(i)) + continue + var/mob/living/am_i_holy_living = i + if(!am_i_holy_living.mind?.holy_role) + continue + GLOB.religious_sect.on_deconversion(am_i_holy_living) + + GLOB.religious_sect = null + SEND_GLOBAL_SIGNAL(COMSIG_RELIGIOUS_SECT_RESET) diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index 9874e286cdbb0..512b528f86fbc 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -14,6 +14,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_PULL_BLOCKED" = TRAIT_PULL_BLOCKED, "TRAIT_RESTRAINED" = TRAIT_RESTRAINED, "TRAIT_PERFECT_ATTACKER" = TRAIT_PERFECT_ATTACKER, + "TRAIT_GREENTEXT_CURSED" = TRAIT_GREENTEXT_CURSED, "TRAIT_INCAPACITATED" = TRAIT_INCAPACITATED, "TRAIT_CRITICAL_CONDITION" = TRAIT_CRITICAL_CONDITION, "TRAIT_LITERATE" = TRAIT_LITERATE, @@ -63,7 +64,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_NOFIRE" = TRAIT_NOFIRE, "TRAIT_NOGUNS" = TRAIT_NOGUNS, "TRAIT_NOHUNGER" = TRAIT_NOHUNGER, - "TRAIT_NOMETABOLISM" = TRAIT_NOMETABOLISM, + "TRAIT_LIVERLESS_METABOLISM" = TRAIT_LIVERLESS_METABOLISM, "TRAIT_PLASMA_LOVER_METABOLISM" = TRAIT_PLASMA_LOVER_METABOLISM, "TRAIT_NOCLONELOSS" = TRAIT_NOCLONELOSS, "TRAIT_TOXIMMUNE" = TRAIT_TOXIMMUNE, @@ -81,6 +82,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_DEPRESSION" = TRAIT_DEPRESSION, "TRAIT_BLOOD_DEFICIENCY" = TRAIT_BLOOD_DEFICIENCY, "TRAIT_JOLLY" = TRAIT_JOLLY, + "TRAIT_NO_GLIDE" = TRAIT_NO_GLIDE, "TRAIT_NOCRITDAMAGE" = TRAIT_NOCRITDAMAGE, "TRAIT_NO_SLIP_WATER" = TRAIT_NO_SLIP_WATER, "TRAIT_NO_SLIP_ICE" = TRAIT_NO_SLIP_ICE, @@ -91,6 +93,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_NOSOFTCRIT" = TRAIT_NOSOFTCRIT, "TRAIT_MINDSHIELD" = TRAIT_MINDSHIELD, "TRAIT_DISSECTED" = TRAIT_DISSECTED, + "TRAIT_SURGICALLY_ANALYZED" = TRAIT_SURGICALLY_ANALYZED, "TRAIT_SIXTHSENSE" = TRAIT_SIXTHSENSE, "TRAIT_FEARLESS" = TRAIT_FEARLESS, "TRAIT_PARALYSIS_L_ARM" = TRAIT_PARALYSIS_L_ARM, @@ -142,7 +145,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_WINE_TASTER" = TRAIT_WINE_TASTER, "TRAIT_BONSAI" = TRAIT_BONSAI, "TRAIT_LIGHTBULB_REMOVER" = TRAIT_LIGHTBULB_REMOVER, - "TRAIT_KNOW_CYBORG_WIRES" = TRAIT_KNOW_CYBORG_WIRES, + "TRAIT_KNOW_ROBO_WIRES" = TRAIT_KNOW_ROBO_WIRES, "TRAIT_KNOW_ENGI_WIRES" = TRAIT_KNOW_ENGI_WIRES, "TRAIT_ALCOHOL_TOLERANCE" = TRAIT_ALCOHOL_TOLERANCE, "TRAIT_AGEUSIA" = TRAIT_AGEUSIA, @@ -155,8 +158,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_VORACIOUS" = TRAIT_VORACIOUS, "TRAIT_SELF_AWARE" = TRAIT_SELF_AWARE, "TRAIT_FREERUNNING" = TRAIT_FREERUNNING, + "TRAIT_SETTLER" = TRAIT_SETTLER, "TRAIT_SKITTISH" = TRAIT_SKITTISH, - "TRAIT_POOR_AIM" = TRAIT_POOR_AIM, "TRAIT_PROSOPAGNOSIA" = TRAIT_PROSOPAGNOSIA, "TRAIT_TAGGER" = TRAIT_TAGGER, "TRAIT_PHOTOGRAPHER" = TRAIT_PHOTOGRAPHER, @@ -169,7 +172,21 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_SNOB" = TRAIT_SNOB, "TRAIT_BALD" = TRAIT_BALD, "TRAIT_BADTOUCH" = TRAIT_BADTOUCH, + "TRAIT_AGENDER" = TRAIT_AGENDER, + "TRAIT_BLOOD_CLANS" = TRAIT_BLOOD_CLANS, + "TRAIT_HAS_MARKINGS" = TRAIT_HAS_MARKINGS, + "TRAIT_USES_SKINTONES" = TRAIT_USES_SKINTONES, + "TRAIT_MUTANT_COLORS" = TRAIT_MUTANT_COLORS, + "TRAIT_FIXED_MUTANT_COLORS" = TRAIT_FIXED_MUTANT_COLORS, + "TRAIT_FIXED_HAIRCOLOR" = TRAIT_FIXED_HAIRCOLOR, + "TRAIT_NO_BLOOD_OVERLAY" = TRAIT_NO_BLOOD_OVERLAY, + "TRAIT_NO_UNDERWEAR" = TRAIT_NO_UNDERWEAR, + "TRAIT_NO_AUGMENTS" = TRAIT_NO_AUGMENTS, "TRAIT_NOBLOOD" = TRAIT_NOBLOOD, + "TRAIT_LIVERLESS_METABOLISM" = TRAIT_LIVERLESS_METABOLISM, + "TRAIT_NO_ZOMBIFY" = TRAIT_NO_ZOMBIFY, + "TRAIT_NO_DNA_COPY" = TRAIT_NO_DNA_COPY, + "TRAIT_DRINKS_BLOOD" = TRAIT_DRINKS_BLOOD, "TRAIT_KISS_OF_DEATH" = TRAIT_KISS_OF_DEATH, "TRAIT_ANXIOUS" = TRAIT_ANXIOUS, "TRAIT_WEAK_SOUL" = TRAIT_WEAK_SOUL, @@ -187,6 +204,13 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_MIMING" = TRAIT_MIMING, "TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION" = TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION, "TRAIT_UNOBSERVANT" = TRAIT_UNOBSERVANT, + "TRAIT_MORBID" = TRAIT_MORBID, + "TRAIT_UNDENSE" = TRAIT_UNDENSE, + "TRAIT_EXPANDED_FOV" = TRAIT_EXPANDED_FOV, + "TRAIT_GOOD_HEARING" = TRAIT_GOOD_HEARING, + "TRAIT_XRAY_HEARING" = TRAIT_XRAY_HEARING, + "TRAIT_TENTACLE_IMMUNE" = TRAIT_TENTACLE_IMMUNE, + "TRAIT_OVERWATCH_IMMUNE" = TRAIT_OVERWATCH_IMMUNE, ), /obj/item/bodypart = list( "TRAIT_PARALYSIS" = TRAIT_PARALYSIS, @@ -204,6 +228,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_PRETENDER_ROYAL_METABOLISM" = TRAIT_PRETENDER_ROYAL_METABOLISM, "TRAIT_BALLMER_SCIENTIST" = TRAIT_BALLMER_SCIENTIST, "TRAIT_MAINTENANCE_METABOLISM" = TRAIT_MAINTENANCE_METABOLISM, + "TRAIT_CORONER_METABOLISM" = TRAIT_CORONER_METABOLISM, ), /obj/item = list( "TRAIT_NODROP" = TRAIT_NODROP, @@ -213,6 +238,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_APC_SHOCKING" = TRAIT_APC_SHOCKING, "TRAIT_UNCATCHABLE" = TRAIT_UNCATCHABLE, "TRAIT_DANGEROUS_OBJECT" = TRAIT_DANGEROUS_OBJECT, + "TRAIT_GERM_SENSITIVE" = TRAIT_GERM_SENSITIVE, + "TRAIT_HAUNTED" = TRAIT_HAUNTED, ), /atom = list( "TRAIT_KEEP_TOGETHER" = TRAIT_KEEP_TOGETHER, @@ -229,10 +256,21 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_VOIDSTORM_IMMUNE" = TRAIT_VOIDSTORM_IMMUNE, "TRAIT_WEATHER_IMMUNE" = TRAIT_WEATHER_IMMUNE, "TRAIT_RUNECHAT_HIDDEN" = TRAIT_RUNECHAT_HIDDEN, + "TRAIT_HAS_LABEL" = TRAIT_HAS_LABEL, ), /obj/item/card/id = list( "TRAIT_MAGNETIC_ID_CARD" = TRAIT_MAGNETIC_ID_CARD, ), + /obj/item/fish = list( + "TRAIT_RESIST_EMULSIFY" = TRAIT_RESIST_EMULSIFY, + "TRAIT_FISH_SELF_REPRODUCE" = TRAIT_FISH_SELF_REPRODUCE, + "TRAIT_FISH_NO_MATING" = TRAIT_FISH_NO_MATING, + "TRAIT_YUCKY_FISH" = TRAIT_YUCKY_FISH, + "TRAIT_FISH_TOXIN_IMMUNE" = TRAIT_FISH_TOXIN_IMMUNE, + "TRAIT_FISH_CROSSBREEDER" = TRAIT_FISH_CROSSBREEDER, + "TRAIT_FISH_FED_LUBE" = TRAIT_FISH_FED_LUBE, + "TRAIT_FISH_NO_HUNGER" = TRAIT_FISH_NO_HUNGER, + ), )) /// value -> trait name, generated on use from trait_by_type global diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm index e33ba9cb54066..ab5b3f4aad974 100644 --- a/code/_onclick/adjacent.dm +++ b/code/_onclick/adjacent.dm @@ -87,19 +87,23 @@ /* This checks if you there is uninterrupted airspace between that turf and this one. - This is defined as any dense ON_BORDER_1 object, or any dense object without LETPASSTHROW. +This is defined as any dense ON_BORDER_1 object, or any dense object without LETPASSTHROW or LETPASSCLICKS. The border_only flag allows you to not objects (for source and destination squares) */ /turf/proc/ClickCross(target_dir, border_only, atom/target, atom/movable/mover) for(var/obj/O in src) if((mover && O.CanPass(mover, target_dir)) || (!mover && !O.density)) continue - if(O == target || O == mover || (O.pass_flags_self & LETPASSTHROW)) //check if there's a dense object present on the turf - continue // LETPASSTHROW is used for anything you can click through (or the firedoor special case, see above) + + //If there's a dense object on the turf, only allow the click to pass if you can throw items over it or it has a special flag. + if(O == target || O == mover || (O.pass_flags_self & (LETPASSTHROW|LETPASSCLICKS))) + continue if( O.flags_1&ON_BORDER_1) // windows are on border, check them first if( O.dir & target_dir || O.dir & (O.dir-1) ) // full tile windows are just diagonals mechanically return FALSE //O.dir&(O.dir-1) is false for any cardinal direction, but true for diagonal ones + else if( !border_only ) // dense, not on border, cannot pass over return FALSE + return TRUE diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index 92739f91ac5ff..614258388cc1b 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -11,7 +11,7 @@ return if(ismob(A)) - ai_actual_track(A) + ai_tracking_tool.set_tracked_mob(src, A.name) else A.move_camera_by_click() @@ -73,10 +73,6 @@ if(world.time <= next_move) return - if(aicamera.in_camera_mode) - aicamera.toggle_camera_mode(sound = FALSE) - aicamera.captureimage(pixel_turf, usr) - return if(waypoint_mode) waypoint_mode = 0 set_waypoint(A) @@ -115,14 +111,17 @@ for AI shift, ctrl, and alt clicking. */ -/mob/living/silicon/ai/CtrlShiftClickOn(atom/A) - A.AICtrlShiftClick(src) -/mob/living/silicon/ai/ShiftClickOn(atom/A) - A.AIShiftClick(src) -/mob/living/silicon/ai/CtrlClickOn(atom/A) - A.AICtrlClick(src) -/mob/living/silicon/ai/AltClickOn(atom/A) - A.AIAltClick(src) +/mob/living/silicon/ai/CtrlShiftClickOn(atom/target) + target.AICtrlShiftClick(src) + +/mob/living/silicon/ai/ShiftClickOn(atom/target) + target.AIShiftClick(src) + +/mob/living/silicon/ai/CtrlClickOn(atom/target) + target.AICtrlClick(src) + +/mob/living/silicon/ai/AltClickOn(atom/target) + target.AIAltClick(src) /* The following criminally helpful code is just the previous code cleaned up; @@ -131,71 +130,140 @@ /* Questions: Instead of an Emag check on every function, can we not add to airlocks onclick if emag return? */ /* Atom Procs */ -/atom/proc/AICtrlClick() +/atom/proc/AICtrlClick(mob/living/silicon/ai/user) return + /atom/proc/AIAltClick(mob/living/silicon/ai/user) AltClick(user) return -/atom/proc/AIShiftClick() + +/atom/proc/AIShiftClick(mob/living/silicon/ai/user) return -/atom/proc/AICtrlShiftClick() + +/atom/proc/AICtrlShiftClick(mob/living/silicon/ai/user) return /* Airlocks */ -/obj/machinery/door/airlock/AICtrlClick() // Bolts doors +/obj/machinery/door/airlock/AICtrlClick(mob/living/silicon/ai/user) // Bolts doors if(obj_flags & EMAGGED) return - toggle_bolt(usr) - add_hiddenprint(usr) + toggle_bolt(user) + add_hiddenprint(user) -/obj/machinery/door/airlock/AIAltClick() // Eletrifies doors. +/obj/machinery/door/airlock/AIAltClick(mob/living/silicon/ai/user) // Eletrifies doors. if(obj_flags & EMAGGED) return if(!secondsElectrified) - shock_perm(usr) + shock_perm(user) else - shock_restore(usr) + shock_restore(user) -/obj/machinery/door/airlock/AIShiftClick() // Opens and closes doors! +/obj/machinery/door/airlock/AIShiftClick(mob/living/silicon/ai/user) // Opens and closes doors! if(obj_flags & EMAGGED) return - user_toggle_open(usr) - add_hiddenprint(usr) + user_toggle_open(user) + add_hiddenprint(user) -/obj/machinery/door/airlock/AICtrlShiftClick() // Sets/Unsets Emergency Access Override +/obj/machinery/door/airlock/AICtrlShiftClick(mob/living/silicon/ai/user) // Sets/Unsets Emergency Access Override if(obj_flags & EMAGGED) return - toggle_emergency(usr) - add_hiddenprint(usr) + toggle_emergency(user) + add_hiddenprint(user) + +///////////// +/* APC */ +///////////// + +/// Toggle APC power settings +/obj/machinery/power/apc/AICtrlClick(mob/living/silicon/ai/user) + if(!can_use(user, loud = TRUE)) + return + + toggle_breaker(user) + +/// Toggle APC environment settings (atmos) +/obj/machinery/power/apc/AICtrlShiftClick(mob/living/silicon/ai/user) + if(!can_use(user, loud = TRUE)) + return + + if(!is_operational || failure_timer) + return + + environ = environ ? APC_CHANNEL_OFF : APC_CHANNEL_ON + if (user) + add_hiddenprint(user) + var/enabled_or_disabled = environ ? "enabled" : "disabled" + balloon_alert(user, "environment power [enabled_or_disabled]") + user.log_message("[enabled_or_disabled] the [src] environment settings", LOG_GAME) + update_appearance() + update() + +/// Toggle APC lighting settings +/obj/machinery/power/apc/AIShiftClick(mob/living/silicon/ai/user) + if(!can_use(user, loud = TRUE)) + return + + if(!is_operational || failure_timer) + return + + lighting = lighting ? APC_CHANNEL_OFF : APC_CHANNEL_ON + if (user) + var/enabled_or_disabled = lighting ? "enabled" : "disabled" + add_hiddenprint(user) + balloon_alert(user, "lighting power toggled [enabled_or_disabled]") + user.log_message("turned [enabled_or_disabled] the [src] lighting settings", LOG_GAME) + update_appearance() + update() + +/// Toggle APC equipment settings +/obj/machinery/power/apc/AIAltClick(mob/living/silicon/ai/user) + if(!can_use(user, loud = TRUE)) + return + + if(!is_operational || failure_timer) + return + + equipment = equipment ? APC_CHANNEL_OFF : APC_CHANNEL_ON + if (user) + var/enabled_or_disabled = equipment ? "enabled" : "disabled" + balloon_alert(user, "equipment power toggled [enabled_or_disabled]") + add_hiddenprint(user) + user.log_message("turned [enabled_or_disabled] the [src] equipment settings", LOG_GAME) + update_appearance() + update() + +/obj/machinery/power/apc/attack_ai_secondary(mob/living/silicon/user, list/modifiers) + if(!can_use(user, loud = TRUE)) + return -/* APC */ -/obj/machinery/power/apc/AICtrlClick() // turns off/on APCs. - if(can_use(usr, 1)) - toggle_breaker(usr) + togglelock(user) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /* AI Turrets */ -/obj/machinery/turretid/AIAltClick() //toggles lethal on turrets +/obj/machinery/turretid/AIAltClick(mob/living/silicon/ai/user) //toggles lethal on turrets if(ailock) return - toggle_lethal(usr) + toggle_lethal(user) -/obj/machinery/turretid/AICtrlClick() //turns off/on Turrets +/obj/machinery/turretid/AICtrlClick(mob/living/silicon/ai/user) //turns off/on Turrets if(ailock) return - toggle_on(usr) + toggle_on(user) /* Holopads */ /obj/machinery/holopad/AIAltClick(mob/living/silicon/ai/user) + if (user) + balloon_alert(user, "disrupted all active calls") + add_hiddenprint(user) hangup_all_calls() - add_hiddenprint(usr) // // Override TurfAdjacent for AltClicking // -/mob/living/silicon/ai/TurfAdjacent(turf/T) - return (GLOB.cameranet && GLOB.cameranet.checkTurfVis(T)) +/mob/living/silicon/ai/TurfAdjacent(turf/target_turf) + return (GLOB.cameranet && GLOB.cameranet.checkTurfVis(target_turf)) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index d91362c822b89..0dbc6380233df 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -69,7 +69,7 @@ return next_click = world.time + 1 - if(check_click_intercept(params,A) || notransform) + if(check_click_intercept(params,A) || HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return var/list/modifiers = params2list(params) @@ -339,9 +339,10 @@ /atom/proc/ShiftClick(mob/user) var/flags = SEND_SIGNAL(user, COMSIG_CLICK_SHIFT, src) + if(flags & COMSIG_MOB_CANCEL_CLICKON) + return if(user.client && (user.client.eye == user || user.client.eye == user.loc || flags & COMPONENT_ALLOW_EXAMINATE)) user.examinate(src) - return /** * Ctrl click @@ -530,7 +531,7 @@ M.Scale(px/sx, py/sy) transform = M -/atom/movable/screen/click_catcher/Initialize(mapload) +/atom/movable/screen/click_catcher/Initialize(mapload, datum/hud/hud_owner) . = ..() RegisterSignal(SSmapping, COMSIG_PLANE_OFFSET_INCREASE, PROC_REF(offset_increased)) offset_increased(SSmapping, 0, SSmapping.max_plane_offset) diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 844f6afdcb306..91ba7c615341c 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -48,11 +48,6 @@ face_atom(A) // change direction to face what you clicked on - if(aicamera.in_camera_mode) //Cyborg picture taking - aicamera.toggle_camera_mode(sound = FALSE) - aicamera.captureimage(A, usr) - return - var/obj/item/W = get_active_held_item() if(!W && get_dist(src,A) <= interaction_range) @@ -85,41 +80,41 @@ return // cyborgs are prohibited from using storage items so we can I think safely remove (A.loc && isturf(A.loc.loc)) + if(CanReach(A,W)) + W.melee_attack_chain(src, A, params) + return if(isturf(A) || isturf(A.loc)) - if(A.Adjacent(src)) // see adjacent.dm - W.melee_attack_chain(src, A, params) - return - else - W.afterattack(A, src, 0, params) - return + W.afterattack(A, src, 0, params) //Give cyborgs hotkey clicks without breaking existing uses of hotkey clicks // for non-doors/apcs -/mob/living/silicon/robot/CtrlShiftClickOn(atom/A) - A.BorgCtrlShiftClick(src) -/mob/living/silicon/robot/ShiftClickOn(atom/A) - A.BorgShiftClick(src) -/mob/living/silicon/robot/CtrlClickOn(atom/A) - A.BorgCtrlClick(src) -/mob/living/silicon/robot/AltClickOn(atom/A) - A.BorgAltClick(src) +/mob/living/silicon/robot/CtrlShiftClickOn(atom/target) + target.BorgCtrlShiftClick(src) + +/mob/living/silicon/robot/ShiftClickOn(atom/target) + target.BorgShiftClick(src) + +/mob/living/silicon/robot/CtrlClickOn(atom/target) + target.BorgCtrlClick(src) + +/mob/living/silicon/robot/AltClickOn(atom/target) + target.BorgAltClick(src) /atom/proc/BorgCtrlShiftClick(mob/living/silicon/robot/user) //forward to human click if not overridden CtrlShiftClick(user) /obj/machinery/door/airlock/BorgCtrlShiftClick(mob/living/silicon/robot/user) // Sets/Unsets Emergency Access Override Forwards to AI code. - if(get_dist(src,user) <= user.interaction_range) - AICtrlShiftClick() + if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled)) + AICtrlShiftClick(user) else ..() - /atom/proc/BorgShiftClick(mob/living/silicon/robot/user) //forward to human click if not overridden ShiftClick(user) /obj/machinery/door/airlock/BorgShiftClick(mob/living/silicon/robot/user) // Opens and closes doors! Forwards to AI code. - if(get_dist(src,user) <= user.interaction_range) - AIShiftClick() + if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled)) + AIShiftClick(user) else ..() @@ -128,20 +123,45 @@ CtrlClick(user) /obj/machinery/door/airlock/BorgCtrlClick(mob/living/silicon/robot/user) // Bolts doors. Forwards to AI code. - if(get_dist(src,user) <= user.interaction_range) - AICtrlClick() + if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled)) + AICtrlClick(user) else ..() /obj/machinery/power/apc/BorgCtrlClick(mob/living/silicon/robot/user) // turns off/on APCs. Forwards to AI code. - if(get_dist(src,user) <= user.interaction_range) - AICtrlClick() + if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled)) + AICtrlClick(user) + else + ..() + +/obj/machinery/power/apc/BorgCtrlShiftClick(mob/living/silicon/robot/user) + if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled)) + AICtrlShiftClick(user) + else + ..() + +/obj/machinery/power/apc/BorgShiftClick(mob/living/silicon/robot/user) + if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled)) + AIShiftClick(user) + else + ..() + +/obj/machinery/power/apc/BorgAltClick(mob/living/silicon/robot/user) + if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled)) + AIAltClick(user) + else + ..() + + +/obj/machinery/power/apc/attack_robot_secondary(mob/living/silicon/user, list/modifiers) + if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled)) + return attack_ai_secondary(user, modifiers) else ..() /obj/machinery/turretid/BorgCtrlClick(mob/living/silicon/robot/user) //turret control on/off. Forwards to AI code. - if(get_dist(src,user) <= user.interaction_range) - AICtrlClick() + if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled)) + AICtrlClick(user) else ..() @@ -150,14 +170,14 @@ return /obj/machinery/door/airlock/BorgAltClick(mob/living/silicon/robot/user) // Eletrifies doors. Forwards to AI code. - if(get_dist(src,user) <= user.interaction_range) - AIAltClick() + if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled)) + AIAltClick(user) else ..() /obj/machinery/turretid/BorgAltClick(mob/living/silicon/robot/user) //turret lethal on/off. Forwards to AI code. - if(get_dist(src,user) <= user.interaction_range) - AIAltClick() + if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled)) + AIAltClick(user) else ..() diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index c4f8de8e63bc4..edecd0ba78f64 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -96,9 +96,6 @@ while(selected_target[1]) Click(selected_target[1], location, control, selected_target[2]) sleep(delay) - active_mousedown_item = mob.canMobMousedown(object, location, params) - if(active_mousedown_item) - active_mousedown_item.onMouseDown(object, location, params, mob) /client/MouseUp(object, location, control, params) if(SEND_SIGNAL(src, COMSIG_CLIENT_MOUSEUP, object, location, control, params) & COMPONENT_CLIENT_MOUSEUP_INTERCEPT) @@ -106,9 +103,6 @@ if(mouse_up_icon) mouse_pointer_icon = mouse_up_icon selected_target[1] = null - if(active_mousedown_item) - active_mousedown_item.onMouseUp(object, location, params, mob) - active_mousedown_item = null /mob/proc/CanMobAutoclick(object, location, params) @@ -119,25 +113,8 @@ if(h) . = h.CanItemAutoclick(object, location, params) -/mob/proc/canMobMousedown(atom/object, location, params) - -/mob/living/carbon/canMobMousedown(atom/object, location, params) - var/obj/item/H = get_active_held_item() - if(H) - . = H.canItemMouseDown(object, location, params) - /obj/item/proc/CanItemAutoclick(object, location, params) -/obj/item/proc/canItemMouseDown(object, location, params) - if(canMouseDown) - return src - -/obj/item/proc/onMouseDown(object, location, params, mob) - return - -/obj/item/proc/onMouseUp(object, location, params, mob) - return - /atom/proc/IsAutoclickable() return TRUE @@ -165,14 +142,9 @@ if(selected_target[1] && over_object?.IsAutoclickable()) selected_target[1] = over_object selected_target[2] = params - if(active_mousedown_item) - active_mousedown_item.onMouseDrag(src_object, over_object, src_location, over_location, params, mob) SEND_SIGNAL(src, COMSIG_CLIENT_MOUSEDRAG, src_object, over_object, src_location, over_location, src_control, over_control, params) return ..() -/obj/item/proc/onMouseDrag(src_object, over_object, src_location, over_location, params, mob) - return - /client/MouseDrop(atom/src_object, atom/over_object, atom/src_location, atom/over_location, src_control, over_control, params) if (IS_WEAKREF_OF(src_object, middle_drag_atom_ref)) middragtime = 0 diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 7562721f67873..533e8f1e8dd48 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -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() @@ -416,7 +416,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 +429,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 +447,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 fabbdae41ab51..5f687d1964281 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -30,13 +30,11 @@ icon_state = "track" /atom/movable/screen/ai/camera_track/Click() - if(..()) + . = ..() + if(.) return var/mob/living/silicon/ai/AI = usr - var/target_name = tgui_input_list(AI, "Select a target", "Tracking", AI.trackable_mobs()) - if(isnull(target_name)) - return - AI.ai_camera_track(target_name) + AI.ai_camera_track() /atom/movable/screen/ai/camera_light name = "Toggle Camera Light" @@ -184,106 +182,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 4693b2c0344f8..7faf83a89fcf6 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -304,14 +304,13 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." /atom/movable/screen/alert/give // information set when the give alert is made icon_state = "default" - var/mob/living/carbon/offerer - var/obj/item/receiving + /// The offer we're linked to, yes this is suspiciously like a status effect alert + var/datum/status_effect/offering/offer /// Additional text displayed in the description of the alert. var/additional_desc_text = "Click this alert to take it." /atom/movable/screen/alert/give/Destroy() - offerer = null - receiving = null + offer = null return ..() /** @@ -324,16 +323,17 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." * * offerer - The person giving the alert and item * * receiving - The item being given by the offerer */ -/atom/movable/screen/alert/give/proc/setup(mob/living/carbon/taker, mob/living/carbon/offerer, obj/item/receiving) +/atom/movable/screen/alert/give/proc/setup(mob/living/carbon/taker, datum/status_effect/offering/offer) + src.offer = offer + + var/mob/living/offerer = offer.owner + var/obj/item/receiving = offer.offered_item var/receiving_name = get_receiving_name(taker, offerer, receiving) name = "[offerer] is offering [receiving_name]" desc = "[offerer] is offering [receiving_name]. [additional_desc_text]" icon_state = "template" cut_overlays() add_overlay(receiving) - src.receiving = receiving - src.offerer = offerer - /** * Called right before `setup()`, to do any sort of logic to change the name of @@ -353,7 +353,6 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." /atom/movable/screen/alert/give/proc/get_receiving_name(mob/living/carbon/taker, mob/living/carbon/offerer, obj/item/receiving) return receiving.name - /atom/movable/screen/alert/give/Click(location, control, params) . = ..() if(!.) @@ -367,26 +366,31 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." /// An overrideable proc used simply to hand over the item when claimed, this is a proc so that high-fives can override them since nothing is actually transferred /atom/movable/screen/alert/give/proc/handle_transfer() var/mob/living/carbon/taker = owner + var/mob/living/offerer = offer.owner + var/obj/item/receiving = offer.offered_item taker.take(offerer, receiving) SEND_SIGNAL(offerer, COMSIG_CARBON_ITEM_GIVEN, taker, receiving) - /atom/movable/screen/alert/give/highfive additional_desc_text = "Click this alert to slap it." - + /// Tracks active "to slow"ing so we can't spam click + var/too_slowing_this_guy = FALSE /atom/movable/screen/alert/give/highfive/get_receiving_name(mob/living/carbon/taker, mob/living/carbon/offerer, obj/item/receiving) return "a high-five" - -/atom/movable/screen/alert/give/highfive/setup(mob/living/carbon/taker, mob/living/carbon/offerer, obj/item/receiving) +/atom/movable/screen/alert/give/highfive/setup(mob/living/carbon/taker, datum/status_effect/offering/offer) . = ..() - RegisterSignal(offerer, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(check_fake_out)) - + RegisterSignal(offer.owner, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(check_fake_out)) /atom/movable/screen/alert/give/highfive/handle_transfer() + if(too_slowing_this_guy) + return + var/mob/living/carbon/taker = owner - if(receiving && (receiving in offerer.held_items)) + var/mob/living/offerer = offer.owner + var/obj/item/receiving = offer.offered_item + if(!QDELETED(receiving) && offerer.is_holding(receiving)) receiving.on_offer_taken(offerer, taker) return @@ -395,10 +399,12 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." /// If the person who offered the high five no longer has it when we try to accept it, we get pranked hard /atom/movable/screen/alert/give/highfive/proc/too_slow_p1() var/mob/living/carbon/rube = owner - if(!rube || !offerer) + var/mob/living/offerer = offer?.owner + if(QDELETED(rube) || QDELETED(offerer)) qdel(src) return + too_slowing_this_guy = TRUE offerer.visible_message(span_notice("[rube] rushes in to high-five [offerer], but-"), span_nicegreen("[rube] falls for your trick just as planned, lunging for a high-five that no longer exists! Classic!"), ignored_mobs=rube) to_chat(rube, span_nicegreen("You go in for [offerer]'s high-five, but-")) addtimer(CALLBACK(src, PROC_REF(too_slow_p2), offerer, rube), 0.5 SECONDS) @@ -406,49 +412,35 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." /// Part two of the ultimate prank /atom/movable/screen/alert/give/highfive/proc/too_slow_p2() var/mob/living/carbon/rube = owner - if(!rube || !offerer) - qdel(src) - return + var/mob/living/offerer = offer?.owner + if(!QDELETED(rube) && !QDELETED(offerer)) + offerer.visible_message(span_danger("[offerer] pulls away from [rube]'s slap at the last second, dodging the high-five entirely!"), span_nicegreen("[rube] fails to make contact with your hand, making an utter fool of [rube.p_them()]self!"), span_hear("You hear a disappointing sound of flesh not hitting flesh!"), ignored_mobs=rube) + to_chat(rube, span_userdanger("[uppertext("NO! [offerer] PULLS [offerer.p_their()] HAND AWAY FROM YOURS! YOU'RE TOO SLOW!")]")) + playsound(offerer, 'sound/weapons/thudswoosh.ogg', 100, TRUE, 1) + rube.Knockdown(1 SECONDS) + offerer.add_mood_event("high_five", /datum/mood_event/down_low) + rube.add_mood_event("high_five", /datum/mood_event/too_slow) + offerer.remove_status_effect(/datum/status_effect/offering/no_item_received/high_five) - offerer.visible_message(span_danger("[offerer] pulls away from [rube]'s slap at the last second, dodging the high-five entirely!"), span_nicegreen("[rube] fails to make contact with your hand, making an utter fool of [rube.p_them()]self!"), span_hear("You hear a disappointing sound of flesh not hitting flesh!"), ignored_mobs=rube) - var/all_caps_for_emphasis = uppertext("NO! [offerer] PULLS [offerer.p_their()] HAND AWAY FROM YOURS! YOU'RE TOO SLOW!") - to_chat(rube, span_userdanger("[all_caps_for_emphasis]")) - playsound(offerer, 'sound/weapons/thudswoosh.ogg', 100, TRUE, 1) - rube.Knockdown(1 SECONDS) - offerer.add_mood_event("high_five", /datum/mood_event/down_low) - rube.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 -/atom/movable/screen/alert/give/highfive/proc/check_fake_out(datum/source, mob/user, list/examine_list) +/atom/movable/screen/alert/give/highfive/proc/check_fake_out(mob/source, mob/user, list/examine_list) SIGNAL_HANDLER - if(!receiving) - examine_list += "[span_warning("[offerer]'s arm appears tensed up, as if [offerer.p_they()] plan on pulling it back suddenly...")]\n" - + if(QDELETED(offer.offered_item)) + examine_list += span_warning("[source]'s arm appears tensed up, as if [source.p_they()] plan on pulling it back suddenly...") /atom/movable/screen/alert/give/hand/get_receiving_name(mob/living/carbon/taker, mob/living/carbon/offerer, obj/item/receiving) additional_desc_text = "Click this alert to take it and let [offerer.p_them()] pull you around!" return "[offerer.p_their()] [receiving.name]" +/atom/movable/screen/alert/give/hand/helping /atom/movable/screen/alert/give/hand/helping/get_receiving_name(mob/living/carbon/taker, mob/living/carbon/offerer, obj/item/receiving) . = ..() additional_desc_text = "Click this alert to let them help you up!" - -/atom/movable/screen/alert/give/secret_handshake - icon_state = "default" - -/atom/movable/screen/alert/give/secret_handshake/setup(mob/living/carbon/taker, mob/living/carbon/offerer, obj/item/receiving) - name = "[offerer] is offering a Handshake" - desc = "[offerer] wants to teach you the Secret Handshake for their Family and induct you! Click on this alert to accept." - icon_state = "template" - cut_overlays() - add_overlay(receiving) - src.receiving = receiving - src.offerer = offerer - /// Gives the player the option to succumb while in critical condition /atom/movable/screen/alert/succumb name = "Succumb" @@ -512,7 +504,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." var/angle = 0 var/mob/living/simple_animal/hostile/construct/Cviewer = null -/atom/movable/screen/alert/bloodsense/Initialize(mapload) +/atom/movable/screen/alert/bloodsense/Initialize(mapload, datum/hud/hud_owner) . = ..() narnar = new('icons/hud/screen_alert.dmi', "mini_nar") START_PROCESSING(SSprocessing, src) @@ -645,7 +637,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." desc = "Unit's power cell has no charge remaining. No modules available until power cell is recharged." icon_state = "empty_cell" -/atom/movable/screen/alert/emptycell/Initialize(mapload) +/atom/movable/screen/alert/emptycell/Initialize(mapload, datum/hud/hud_owner) . = ..() update_appearance(updates=UPDATE_DESC) @@ -660,7 +652,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." desc = "Unit's power cell is running low." icon_state = "low_cell" -/atom/movable/screen/alert/lowcell/Initialize(mapload) +/atom/movable/screen/alert/lowcell/Initialize(mapload, datum/hud/hud_owner) . = ..() update_appearance(updates=UPDATE_DESC) diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index bbe9c067a73ac..3c1b1029a3e06 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -36,22 +36,19 @@ //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 @@ -62,64 +59,59 @@ 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 + + rest_icon = new /atom/movable/screen/rest(null, src) + rest_icon.icon = ui_style + rest_icon.screen_loc = ui_above_intent + rest_icon.update_appearance() + static_inventory += rest_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 434d1cb5b2ea7..d9ebb3611b68b 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -5,38 +5,37 @@ ..() 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 + rest_icon = new /atom/movable/screen/rest(null, src) + rest_icon.icon = ui_style + rest_icon.screen_loc = ui_above_intent + rest_icon.update_appearance() + static_inventory += rest_icon + + 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 e6e89e242ea43..be860caa1f024 100644 --- a/code/_onclick/hud/blob_overmind.dm +++ b/code/_onclick/hud/blob_overmind.dm @@ -50,7 +50,7 @@ name = "Produce Blobbernaut (ERROR)" desc = "Produces a strong, smart blobbernaut from a factory blob for (ERROR) resources.
The factory blob used will become fragile and unable to produce spores." -/atom/movable/screen/blob/blobbernaut/Initialize(mapload) +/atom/movable/screen/blob/blobbernaut/Initialize(mapload, datum/hud/hud_owner) . = ..() name = "Produce Blobbernaut ([BLOBMOB_BLOBBERNAUT_RESOURCE_COST])" 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." @@ -67,7 +67,7 @@ name = "Produce Resource Blob (ERROR)" desc = "Produces a resource blob for ERROR resources.
Resource blobs will give you resources every few seconds." -/atom/movable/screen/blob/resource_blob/Initialize(mapload) +/atom/movable/screen/blob/resource_blob/Initialize(mapload, datum/hud/hud_owner) . = ..() name = "Produce Resource Blob ([BLOB_STRUCTURE_RESOURCE_COST])" desc = "Produces a resource blob for [BLOB_STRUCTURE_RESOURCE_COST] resources.
Resource blobs will give you resources every few seconds." @@ -84,7 +84,7 @@ name = "Produce Node Blob (ERROR)" desc = "Produces a node blob for ERROR resources.
Node blobs will expand and activate nearby resource and factory blobs." -/atom/movable/screen/blob/node_blob/Initialize(mapload) +/atom/movable/screen/blob/node_blob/Initialize(mapload, datum/hud/hud_owner) . = ..() name = "Produce Node Blob ([BLOB_STRUCTURE_NODE_COST])" desc = "Produces a node blob for [BLOB_STRUCTURE_NODE_COST] resources.
Node blobs will expand and activate nearby resource and factory blobs." @@ -101,7 +101,7 @@ name = "Produce Factory Blob (ERROR)" desc = "Produces a factory blob for ERROR resources.
Factory blobs will produce spores every few seconds." -/atom/movable/screen/blob/factory_blob/Initialize(mapload) +/atom/movable/screen/blob/factory_blob/Initialize(mapload, datum/hud/hud_owner) . = ..() name = "Produce Factory Blob ([BLOB_STRUCTURE_FACTORY_COST])" desc = "Produces a factory blob for [BLOB_STRUCTURE_FACTORY_COST] resources.
Factory blobs will produce spores every few seconds." @@ -140,7 +140,7 @@ name = "Relocate Core (ERROR)" desc = "Swaps a node and your core for ERROR resources." -/atom/movable/screen/blob/relocate_core/Initialize(mapload) +/atom/movable/screen/blob/relocate_core/Initialize(mapload, datum/hud/hud_owner) . = ..() name = "Relocate Core ([BLOB_POWER_RELOCATE_COST])" desc = "Swaps a node and your core for [BLOB_POWER_RELOCATE_COST] resources." @@ -154,55 +154,45 @@ ..() 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 SET_PLANE_EXPLICIT(blobpwrdisplay, ABOVE_HUD_PLANE, owner) - 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/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 d8531516d41ea..59c12a5aa0fac 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/credits.dm b/code/_onclick/hud/credits.dm index 6de4b735bd19b..c4650437c6396 100644 --- a/code/_onclick/hud/credits.dm +++ b/code/_onclick/hud/credits.dm @@ -18,7 +18,7 @@ for(var/I in credit_order_for_this_round) if(!credits) return - _credits += new /atom/movable/screen/credit(null, I, src, credits_icon) + _credits += new /atom/movable/screen/credit(null, null, I, src, credits_icon) sleep(CREDIT_SPAWN_SPEED) sleep(CREDIT_ROLL_SPEED - CREDIT_SPAWN_SPEED) remove_verb(src, /client/proc/ClearCredits) @@ -39,12 +39,12 @@ var/client/parent var/matrix/target -/atom/movable/screen/credit/Initialize(mapload, credited, client/P, icon/I) +/atom/movable/screen/credit/Initialize(mapload, datum/hud/hud_owner, credited, client/P, icon/I) . = ..() icon = I parent = P icon_state = credited - maptext = MAPTEXT(credited) + maptext = MAPTEXT_PIXELLARI(credited) maptext_x = world.icon_size + 8 maptext_y = (world.icon_size / 2) - 4 maptext_width = world.icon_size * 3 diff --git a/code/_onclick/hud/drones.dm b/code/_onclick/hud/drones.dm index 61c006ac6fe58..1cb8ade6311e7 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/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index afedfa5befe6e..79f857e8cbef0 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -26,7 +26,7 @@ screens -= category - if(animated) + if(!QDELETED(src) && animated) animate(screen, alpha = 0, time = animated) addtimer(CALLBACK(src, PROC_REF(clear_fullscreen_after_animate), screen), animated, TIMER_CLIENT_TIME) else @@ -216,3 +216,10 @@ layer = LIGHTING_ABOVE_ALL blend_mode = BLEND_ADD show_when_dead = TRUE + +/atom/movable/screen/fullscreen/static_vision + icon = 'icons/hud/screen_gen.dmi' + screen_loc = "WEST,SOUTH to EAST,NORTH" + icon_state = "noise" + color = "#04a8d1" + alpha = 80 diff --git a/code/_onclick/hud/generic_dextrous.dm b/code/_onclick/hud/generic_dextrous.dm index c0fa5e481c95b..bf09fa3371713 100644 --- a/code/_onclick/hud/generic_dextrous.dm +++ b/code/_onclick/hud/generic_dextrous.dm @@ -3,58 +3,50 @@ ..() 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.clear_screen() + mymob.canon_client.clear_screen() 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() @@ -70,10 +62,3 @@ for(var/obj/item/I in D.held_items) I.screen_loc = null D.client.screen -= I - - -//Dextrous simple mobs can use hands! -/mob/living/simple_animal/create_mob_hud() - if(dextrous) - hud_type = dextrous_hud_type - return ..() diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm index b620d19cbb824..99b04df906871 100644 --- a/code/_onclick/hud/ghost.dm +++ b/code/_onclick/hud/ghost.dm @@ -57,40 +57,33 @@ ..() 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 91da0f9fdb854..f9963c1fa3a91 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 = 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_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() diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 94d1992335391..2318b35970e1d 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -71,6 +71,9 @@ GLOBAL_LIST_INIT(available_ui_styles, list( /// had with a proc call, especially on one of the hottest procs in the /// game (MouseEntered). var/screentips_enabled = SCREENTIP_PREFERENCE_ENABLED + /// Whether to use text or images for click hints. + /// Same behavior as `screentips_enabled`--very hot, updated when the preference is updated. + var/screentip_images = TRUE /// If this client is being shown atmos debug overlays or not var/atmos_debug_overlays = FALSE @@ -117,6 +120,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( var/datum/preferences/preferences = owner?.client?.prefs screentip_color = preferences?.read_preference(/datum/preference/color/screentip_color) screentips_enabled = preferences?.read_preference(/datum/preference/choiced/enable_screentips) + screentip_images = preferences?.read_preference(/datum/preference/toggle/screentip_images) screentip_text = new(null, src) static_inventory += screentip_text @@ -135,8 +139,8 @@ GLOBAL_LIST_INIT(available_ui_styles, list( /datum/hud/proc/client_refresh(datum/source) SIGNAL_HANDLER - RegisterSignal(mymob.client, COMSIG_CLIENT_SET_EYE, PROC_REF(on_eye_change)) - on_eye_change(null, null, mymob.client.eye) + RegisterSignal(mymob.canon_client, COMSIG_CLIENT_SET_EYE, PROC_REF(on_eye_change)) + on_eye_change(null, null, mymob.canon_client.eye) /datum/hud/proc/clear_client(datum/source) SIGNAL_HANDLER @@ -208,10 +212,13 @@ GLOBAL_LIST_INIT(available_ui_styles, list( QDEL_NULL(module_store_icon) QDEL_LIST(static_inventory) + // all already deleted by static inventory clear inv_slots.Cut() action_intent = null zone_select = null pull_icon = null + rest_icon = null + hand_slots.Cut() QDEL_LIST(toggleable_inventory) QDEL_LIST(hotkeybuttons) @@ -440,14 +447,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() @@ -501,7 +507,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 @@ -542,7 +548,7 @@ 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() @@ -658,7 +664,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 68b9baf132147..22a046970cb02 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -58,273 +58,238 @@ 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_RUN ? "running" : "walking") + using.icon_state = (owner.move_intent == MOVE_INTENT_RUN ? "running" : "walking") 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 = "uniform" inv_box.icon = ui_style inv_box.slot_id = ITEM_SLOT_ICLOTHING inv_box.icon_state = "uniform" inv_box.icon_full = "template" 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 = "suit" inv_box.icon = ui_style inv_box.slot_id = ITEM_SLOT_OCLOTHING inv_box.icon_state = "suit" inv_box.icon_full = "template" 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.icon_full = "template_small" 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.icon_full = "template" 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.icon_full = "template" 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.icon_full = "template_small" 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 = "left pocket" inv_box.icon = ui_style inv_box.icon_state = "pocket" inv_box.icon_full = "template_small" 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 = "right pocket" inv_box.icon = ui_style inv_box.icon_state = "pocket" inv_box.icon_full = "template_small" 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.icon_full = "template" 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.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.icon_full = "template" 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.icon_full = "template" 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.icon_full = "template" 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.icon_full = "template" 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.icon_full = "template" 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 + healths = new /atom/movable/screen/healths(null, src) infodisplay += healths - healthdoll = new /atom/movable/screen/healthdoll() - healthdoll.hud = src + healthdoll = new /atom/movable/screen/healthdoll(null, 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 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 366079f233d10..ecd6ecc1eba76 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/new_player.dm b/code/_onclick/hud/new_player.dm index e7cfb0942bd6c..2b2660b923fed 100644 --- a/code/_onclick/hud/new_player.dm +++ b/code/_onclick/hud/new_player.dm @@ -1,4 +1,9 @@ +#define SHUTTER_MOVEMENT_DURATION 0.4 SECONDS +#define SHUTTER_WAIT_DURATION 0.2 SECONDS + /datum/hud/new_player + ///Whether the menu is currently on the client's screen or not + var/menu_hud_status = TRUE /datum/hud/new_player/New(mob/owner) ..() @@ -6,30 +11,53 @@ if(!owner || !owner.client) return - if (owner.client.interviewee) + if(owner.client.interviewee) return var/list/buttons = subtypesof(/atom/movable/screen/lobby) for(var/button_type in buttons) - var/atom/movable/screen/lobby/lobbyscreen = new button_type() + var/atom/movable/screen/lobby/lobbyscreen = new button_type(our_hud = src) lobbyscreen.SlowInit() - lobbyscreen.hud = src static_inventory += lobbyscreen + if(!lobbyscreen.always_shown) + lobbyscreen.RegisterSignal(src, COMSIG_HUD_LOBBY_COLLAPSED, TYPE_PROC_REF(/atom/movable/screen/lobby, collapse_button)) + lobbyscreen.RegisterSignal(src, COMSIG_HUD_LOBBY_EXPANDED, TYPE_PROC_REF(/atom/movable/screen/lobby, expand_button)) if(istype(lobbyscreen, /atom/movable/screen/lobby/button)) var/atom/movable/screen/lobby/button/lobby_button = lobbyscreen lobby_button.owner = REF(owner) /atom/movable/screen/lobby plane = SPLASHSCREEN_PLANE - layer = LOBBY_BUTTON_LAYER + layer = LOBBY_MENU_LAYER screen_loc = "TOP,CENTER" + ///Whether this HUD element can be hidden from the client's "screen" (moved off-screen) or not + var/always_shown = FALSE + +///Set the HUD in New, as lobby screens are made before Atoms are Initialized. +/atom/movable/screen/lobby/New(loc, datum/hud/our_hud, ...) + if(our_hud) + hud = our_hud + return ..() -/// Run sleeping actions after initialize +///Run sleeping actions after initialize /atom/movable/screen/lobby/proc/SlowInit() return +///Animates moving the button off-screen +/atom/movable/screen/lobby/proc/collapse_button() + SIGNAL_HANDLER + //wait for the shutter to come down + animate(src, transform = transform, time = SHUTTER_MOVEMENT_DURATION + SHUTTER_WAIT_DURATION) + //then pull the buttons up with the shutter + animate(transform = transform.Translate(x = 0, y = 146), time = SHUTTER_MOVEMENT_DURATION, easing = CUBIC_EASING|EASE_IN) + +///Animates moving the button back into place +/atom/movable/screen/lobby/proc/expand_button() + SIGNAL_HANDLER + //the buttons are off-screen, so we sync them up to come down with the shutter + animate(src, transform = matrix(), time = SHUTTER_MOVEMENT_DURATION, easing = CUBIC_EASING|EASE_OUT) + /atom/movable/screen/lobby/background - layer = LOBBY_BACKGROUND_LAYER icon = 'icons/hud/lobby/background.dmi' icon_state = "background" screen_loc = "TOP,CENTER:-61" @@ -89,6 +117,7 @@ return icon_state = base_icon_state +///Updates the button's status: TRUE to enable interaction with the button, FALSE to disable /atom/movable/screen/lobby/button/proc/set_button_status(status) if(status == enabled) return FALSE @@ -98,6 +127,7 @@ ///Prefs menu /atom/movable/screen/lobby/button/character_setup + name = "View Character Setup" screen_loc = "TOP:-70,CENTER:-54" icon = 'icons/hud/lobby/character_setup.dmi' icon_state = "character_setup" @@ -108,20 +138,22 @@ if(!.) return - var/datum/preferences/preferences = hud.mymob.client.prefs + var/datum/preferences/preferences = hud.mymob.canon_client.prefs preferences.current_window = PREFERENCE_TAB_CHARACTER_PREFERENCES preferences.update_static_data(usr) preferences.ui_interact(usr) ///Button that appears before the game has started /atom/movable/screen/lobby/button/ready + name = "Toggle Readiness" screen_loc = "TOP:-8,CENTER:-65" icon = 'icons/hud/lobby/ready.dmi' icon_state = "not_ready" base_icon_state = "not_ready" + ///Whether we are readied up for the round or not var/ready = FALSE -/atom/movable/screen/lobby/button/ready/Initialize(mapload) +/atom/movable/screen/lobby/button/ready/Initialize(mapload, datum/hud/hud_owner) . = ..() switch(SSticker.current_state) if(GAME_STATE_PREGAME, GAME_STATE_STARTUP) @@ -157,16 +189,18 @@ new_player.ready = PLAYER_NOT_READY base_icon_state = "not_ready" update_appearance(UPDATE_ICON) + SEND_SIGNAL(hud, COMSIG_HUD_PLAYER_READY_TOGGLE) ///Shown when the game has started /atom/movable/screen/lobby/button/join + name = "Join Game" screen_loc = "TOP:-13,CENTER:-58" icon = 'icons/hud/lobby/join.dmi' icon_state = "" //Default to not visible base_icon_state = "join_game" enabled = FALSE -/atom/movable/screen/lobby/button/join/Initialize(mapload) +/atom/movable/screen/lobby/button/join/Initialize(mapload, datum/hud/hud_owner) . = ..() switch(SSticker.current_state) if(GAME_STATE_PREGAME, GAME_STATE_STARTUP) @@ -230,13 +264,14 @@ RegisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP, PROC_REF(show_join_button)) /atom/movable/screen/lobby/button/observe + name = "Observe" screen_loc = "TOP:-40,CENTER:-54" icon = 'icons/hud/lobby/observe.dmi' icon_state = "observe_disabled" base_icon_state = "observe" enabled = FALSE -/atom/movable/screen/lobby/button/observe/Initialize(mapload) +/atom/movable/screen/lobby/button/observe/Initialize(mapload, datum/hud/hud_owner) . = ..() if(SSticker.current_state > GAME_STATE_STARTUP) set_button_status(TRUE) @@ -256,55 +291,59 @@ set_button_status(TRUE) UnregisterSignal(SSticker, COMSIG_TICKER_ENTER_PREGAME) -/atom/movable/screen/lobby/button/settings +//Subtype the bottom buttons away so the collapse/expand shutter goes behind them +/atom/movable/screen/lobby/button/bottom + layer = LOBBY_BOTTOM_BUTTON_LAYER icon = 'icons/hud/lobby/bottom_buttons.dmi' + +/atom/movable/screen/lobby/button/bottom/settings + name = "View Game Preferences" icon_state = "settings" base_icon_state = "settings" - screen_loc = "TOP:-122,CENTER:+30" + screen_loc = "TOP:-122,CENTER:+29" -/atom/movable/screen/lobby/button/settings/Click(location, control, params) +/atom/movable/screen/lobby/button/bottom/settings/Click(location, control, params) . = ..() if(!.) return - var/datum/preferences/preferences = hud.mymob.client.prefs + var/datum/preferences/preferences = hud.mymob.canon_client.prefs preferences.current_window = PREFERENCE_TAB_GAME_PREFERENCES preferences.update_static_data(usr) preferences.ui_interact(usr) -/atom/movable/screen/lobby/button/changelog_button - icon = 'icons/hud/lobby/bottom_buttons.dmi' +/atom/movable/screen/lobby/button/bottom/changelog_button + name = "View Changelog" icon_state = "changelog" base_icon_state = "changelog" - screen_loc ="TOP:-122,CENTER:+58" + screen_loc ="TOP:-122,CENTER:+57" +/atom/movable/screen/lobby/button/bottom/changelog_button/Click(location, control, params) + . = ..() + usr.client?.changelog() -/atom/movable/screen/lobby/button/crew_manifest - icon = 'icons/hud/lobby/bottom_buttons.dmi' +/atom/movable/screen/lobby/button/bottom/crew_manifest + name = "View Crew Manifest" icon_state = "crew_manifest" base_icon_state = "crew_manifest" screen_loc = "TOP:-122,CENTER:+2" -/atom/movable/screen/lobby/button/crew_manifest/Click(location, control, params) +/atom/movable/screen/lobby/button/bottom/crew_manifest/Click(location, control, params) . = ..() if(!.) return var/mob/dead/new_player/new_player = hud.mymob new_player.ViewManifest() -/atom/movable/screen/lobby/button/changelog_button/Click(location, control, params) - . = ..() - usr.client?.changelog() - -/atom/movable/screen/lobby/button/poll - icon = 'icons/hud/lobby/bottom_buttons.dmi' +/atom/movable/screen/lobby/button/bottom/poll + name = "View Available Polls" icon_state = "poll" base_icon_state = "poll" screen_loc = "TOP:-122,CENTER:-26" - + ///Whether the button should have a New Poll notification overlay var/new_poll = FALSE -/atom/movable/screen/lobby/button/poll/SlowInit(mapload) +/atom/movable/screen/lobby/button/bottom/poll/SlowInit(mapload) . = ..() if(!usr) return @@ -348,14 +387,142 @@ set_button_status(FALSE) return -/atom/movable/screen/lobby/button/poll/update_overlays() +/atom/movable/screen/lobby/button/bottom/poll/update_overlays() . = ..() if(new_poll) . += mutable_appearance('icons/hud/lobby/poll_overlay.dmi', "new_poll") -/atom/movable/screen/lobby/button/poll/Click(location, control, params) +/atom/movable/screen/lobby/button/bottom/poll/Click(location, control, params) . = ..() if(!.) return var/mob/dead/new_player/new_player = hud.mymob new_player.handle_player_polling() + +/atom/movable/screen/lobby/button/collapse + name = "Collapse Lobby Menu" + icon = 'icons/hud/lobby/collapse_expand.dmi' + icon_state = "collapse" + base_icon_state = "collapse" + layer = LOBBY_BELOW_MENU_LAYER + screen_loc = "TOP:-82,CENTER:-54" + always_shown = TRUE + + var/blip_enabled = TRUE + +/atom/movable/screen/lobby/button/collapse/Initialize(mapload, datum/hud/hud_owner) + . = ..() + switch(SSticker.current_state) + if(GAME_STATE_PREGAME, GAME_STATE_STARTUP) + RegisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP, PROC_REF(disable_blip)) + RegisterSignal(hud, COMSIG_HUD_PLAYER_READY_TOGGLE, PROC_REF(on_player_ready_toggle)) + if(GAME_STATE_SETTING_UP) + blip_enabled = FALSE + RegisterSignal(SSticker, COMSIG_TICKER_ERROR_SETTING_UP, PROC_REF(enable_blip)) + else + blip_enabled = FALSE + + add_overlay(get_blip_overlay()) + update_icon(UPDATE_OVERLAYS) + +/atom/movable/screen/lobby/button/collapse/update_overlays() + . = ..() + . += get_blip_overlay() + +/atom/movable/screen/lobby/button/collapse/Click(location, control, params) + . = ..() + if(!.) + return + + if(!istype(hud, /datum/hud/new_player)) + return + var/datum/hud/new_player/our_hud = hud + base_icon_state = our_hud.menu_hud_status ? "expand" : "collapse" + name = "[our_hud.menu_hud_status ? "Expand" : "Collapse"] Lobby Menu" + set_button_status(FALSE) + + //get the shutter object used by our hud + var/atom/movable/screen/lobby/shutter/menu_shutter = locate(/atom/movable/screen/lobby/shutter) in hud.static_inventory + + //animate the shutter + menu_shutter.setup_shutter_animation() + //animate bottom buttons' movement + if(our_hud.menu_hud_status) + collapse_menu() + else + expand_menu() + our_hud.menu_hud_status = !our_hud.menu_hud_status + + //re-enable clicking the button when the shutter animation finishes + //we use sleep here so it can work during game setup, as addtimer would not work until the game would finish setting up + sleep(2 * SHUTTER_MOVEMENT_DURATION + SHUTTER_WAIT_DURATION) + set_button_status(TRUE) + +///Proc to update the ready blip state upon new player's ready status change +/atom/movable/screen/lobby/button/collapse/proc/on_player_ready_toggle() + SIGNAL_HANDLER + update_appearance(UPDATE_ICON) + +///Returns a ready blip overlay depending on the player's ready state +/atom/movable/screen/lobby/button/collapse/proc/get_blip_overlay() + var/blip_icon_state = "ready_blip" + if(blip_enabled && hud) + var/mob/dead/new_player/new_player = hud.mymob + blip_icon_state += "_[new_player.ready ? "" : "not_"]ready" + else + blip_icon_state += "_disabled" + var/mutable_appearance/ready_blip = mutable_appearance(icon, blip_icon_state) + return ready_blip + +///Disables the ready blip; makes us listen for the setup error to re-enable the blip +/atom/movable/screen/lobby/button/collapse/proc/disable_blip() + SIGNAL_HANDLER + blip_enabled = FALSE + UnregisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP) + RegisterSignal(SSticker, COMSIG_TICKER_ERROR_SETTING_UP, PROC_REF(enable_blip)) + update_appearance(UPDATE_ICON) + +///Enables the ready blip; makes us listen for the setup completion and game start to disable the blip +/atom/movable/screen/lobby/button/collapse/proc/enable_blip() + SIGNAL_HANDLER + blip_enabled = TRUE + UnregisterSignal(SSticker, COMSIG_TICKER_ERROR_SETTING_UP) + RegisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP, PROC_REF(disable_blip)) + update_appearance(UPDATE_ICON) + +///Moves the button to the top of the screen, leaving only the screen part in view +///Sends a signal on the hud for the menu hud elements to listen to +/atom/movable/screen/lobby/button/collapse/proc/collapse_menu() + SEND_SIGNAL(hud, COMSIG_HUD_LOBBY_COLLAPSED) + //wait for the shutter to come down + animate(src, transform = transform, time = SHUTTER_MOVEMENT_DURATION + SHUTTER_WAIT_DURATION) + //then pull the button up with the shutter and leave it on the edge of the screen + animate(transform = transform.Translate(x = 0, y = 134), time = SHUTTER_MOVEMENT_DURATION, easing = CUBIC_EASING|EASE_IN) + +///Extends the button back to its usual spot +///Sends a signal on the hud for the menu hud elements to listen to +/atom/movable/screen/lobby/button/collapse/proc/expand_menu() + SEND_SIGNAL(hud, COMSIG_HUD_LOBBY_EXPANDED) + animate(src, transform = matrix(), time = SHUTTER_MOVEMENT_DURATION, easing = CUBIC_EASING|EASE_OUT) + +/atom/movable/screen/lobby/shutter + icon = 'icons/hud/lobby/shutter.dmi' + icon_state = "shutter" + base_icon_state = "shutter" + screen_loc = "TOP:+143,CENTER:-73" //"home" position is off-screen + layer = LOBBY_SHUTTER_LAYER + always_shown = TRUE + +///Sets up the shutter pulling down and up. It's the same animation for both collapsing and expanding the menu. +/atom/movable/screen/lobby/shutter/proc/setup_shutter_animation() + //bring down the shutter + animate(src, transform = transform.Translate(x = 0, y = -143), time = SHUTTER_MOVEMENT_DURATION, easing = CUBIC_EASING|EASE_OUT) + + //wait a little bit before bringing the shutter up + animate(transform = transform, time = SHUTTER_WAIT_DURATION) + + //pull the shutter back off-screen + animate(transform = matrix(), time = SHUTTER_MOVEMENT_DURATION, easing = CUBIC_EASING|EASE_IN) + +#undef SHUTTER_MOVEMENT_DURATION +#undef SHUTTER_WAIT_DURATION diff --git a/code/_onclick/hud/ooze.dm b/code/_onclick/hud/ooze.dm index d3ebe3e728858..1b466f7ff9796 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/parallax.dm b/code/_onclick/hud/parallax/parallax.dm similarity index 93% rename from code/_onclick/hud/parallax.dm rename to code/_onclick/hud/parallax/parallax.dm index 8b24ae7f67cda..8d4e68c911d2f 100644 --- a/code/_onclick/hud/parallax.dm +++ b/code/_onclick/hud/parallax/parallax.dm @@ -13,12 +13,12 @@ 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/layer_2(null, screenmob) - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/planet(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/layer_2(null, src) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/planet(null, src) if(SSparallax.random_layer) - C.parallax_layers_cached += new SSparallax.random_layer(null, screenmob) - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_3(null, screenmob) + C.parallax_layers_cached += new SSparallax.random_layer.type(null, src, FALSE, SSparallax.random_layer) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_3(null, src) C.parallax_layers = C.parallax_layers_cached.Copy() @@ -271,9 +271,17 @@ 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, template = FALSE) . = ..() - 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 + + if(template) + return + + 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 @@ -322,22 +330,6 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_layer) speed = 1.4 layer = 3 -/atom/movable/screen/parallax_layer/random - blend_mode = BLEND_OVERLAY - speed = 3 - layer = 3 - -/atom/movable/screen/parallax_layer/random/space_gas - icon_state = "space_gas" - -/atom/movable/screen/parallax_layer/random/space_gas/Initialize(mapload, mob/owner) - . = ..() - src.add_atom_colour(SSparallax.random_parallax_color, ADMIN_COLOUR_PRIORITY) - -/atom/movable/screen/parallax_layer/random/asteroids - icon_state = "asteroids" - layer = 4 - /atom/movable/screen/parallax_layer/planet icon_state = "planet" blend_mode = BLEND_OVERLAY @@ -345,16 +337,17 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_layer) speed = 3 layer = 30 -/atom/movable/screen/parallax_layer/planet/Initialize(mapload, mob/owner) +/atom/movable/screen/parallax_layer/planet/Initialize(mapload, datum/hud/hud_owner) . = ..() - if(!owner?.client) + var/client/boss = hud_owner?.mymob?.canon_client + if(!boss) return var/static/list/connections = list( COMSIG_MOVABLE_Z_CHANGED = PROC_REF(on_z_change), COMSIG_MOB_LOGOUT = PROC_REF(on_mob_logout), ) - AddComponent(/datum/component/connect_mob_behalf, owner.client, connections) - on_z_change(owner) + AddComponent(/datum/component/connect_mob_behalf, boss, connections) + on_z_change(hud_owner?.mymob) /atom/movable/screen/parallax_layer/planet/proc/on_mob_logout(mob/source) SIGNAL_HANDLER diff --git a/code/_onclick/hud/parallax/random_layer.dm b/code/_onclick/hud/parallax/random_layer.dm new file mode 100644 index 0000000000000..c0d161db4889b --- /dev/null +++ b/code/_onclick/hud/parallax/random_layer.dm @@ -0,0 +1,51 @@ +/// Parallax layers that vary between rounds. Has come code to make sure we all have the same one +/atom/movable/screen/parallax_layer/random + blend_mode = BLEND_OVERLAY + speed = 2 + layer = 3 + +/atom/movable/screen/parallax_layer/random/Initialize(mapload, datum/hud/hud_owner, template, atom/movable/screen/parallax_layer/random/twin) + . = ..() + + if(twin) + copy_parallax(twin) + +/// Make this layer unique, with color or position or something +/atom/movable/screen/parallax_layer/random/proc/get_random_look() + +/// Copy a parallax instance to ensure parity between everyones parallax +/atom/movable/screen/parallax_layer/random/proc/copy_parallax(atom/movable/screen/parallax_layer/random/twin) + +/// For applying minor effects related to parallax. If you want big stuff, put it in a station trait or something +/atom/movable/screen/parallax_layer/random/proc/apply_global_effects() + +/// Gassy background with a few random colors, also tints starlight! +/atom/movable/screen/parallax_layer/random/space_gas + icon_state = "space_gas" + + /// The colors we can be + var/possible_colors = list(COLOR_TEAL, COLOR_GREEN, COLOR_SILVER, COLOR_YELLOW, COLOR_CYAN, COLOR_ORANGE, COLOR_PURPLE) + /// The color we are. If starlight_color is not set, we also become the starlight color + var/parallax_color + /// The color we give to starlight + var/starlight_color + +/atom/movable/screen/parallax_layer/random/space_gas/get_random_look() + parallax_color = parallax_color || pick(possible_colors) + +/atom/movable/screen/parallax_layer/random/space_gas/copy_parallax(atom/movable/screen/parallax_layer/random/space_gas/twin) + parallax_color = twin.parallax_color + add_atom_colour(parallax_color, ADMIN_COLOUR_PRIORITY) + +/atom/movable/screen/parallax_layer/random/space_gas/apply_global_effects() + GLOB.starlight_color = starlight_color || parallax_color + +/// Space gas but green for the radioactive nebula station trait +/atom/movable/screen/parallax_layer/random/space_gas/radioactive + parallax_color = list(0,0,0,0, 0,2,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) //very vibrant green + starlight_color = COLOR_VIBRANT_LIME + +/// Big asteroid rocks appear in the background +/atom/movable/screen/parallax_layer/random/asteroids + icon_state = "asteroids" + layer = 4 diff --git a/code/_onclick/hud/picture_in_picture.dm b/code/_onclick/hud/picture_in_picture.dm index 005188b37225a..dbf4e0af5310d 100644 --- a/code/_onclick/hud/picture_in_picture.dm +++ b/code/_onclick/hud/picture_in_picture.dm @@ -13,7 +13,7 @@ var/mutable_appearance/standard_background -/atom/movable/screen/movable/pic_in_pic/Initialize(mapload) +/atom/movable/screen/movable/pic_in_pic/Initialize(mapload, datum/hud/hud_owner) . = ..() make_backgrounds() RegisterSignal(SSmapping, COMSIG_PLANE_OFFSET_INCREASE, PROC_REF(multiz_offset_increase)) diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index 36bc7dbd72027..5bc75d85f471e 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -337,7 +337,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 4e83f161a3b84..5fe81d005bd43 100644 --- a/code/_onclick/hud/radial_persistent.dm +++ b/code/_onclick/hud/radial_persistent.dm @@ -32,6 +32,13 @@ /datum/radial_menu/persistent/element_chosen(choice_id, mob/user, params) select_proc_callback.Invoke(choices_values[choice_id], params) +///Version of wait used by persistent radial menus. +/datum/radial_menu/persistent/wait() + while(!QDELETED(src)) + if(custom_check_callback && next_check < world.time) + custom_check_callback.Invoke() + next_check = world.time + check_delay + stoplag(1) /datum/radial_menu/persistent/proc/change_choices(list/newchoices, tooltips = FALSE, animate = FALSE, keep_same_page = FALSE) if(!newchoices.len) @@ -42,7 +49,7 @@ set_choices(newchoices,tooltips, set_page = target_page) /datum/radial_menu/persistent/Destroy() - QDEL_NULL(select_proc_callback) + select_proc_callback = null GLOB.radial_menus -= uniqueid Reset() hide() @@ -55,7 +62,7 @@ Select_proc is the proc to be called each time an element on the menu is clicked, and should accept the chosen element as its final argument Clicking the center button will return a choice of null */ -/proc/show_radial_menu_persistent(mob/user, atom/anchor, list/choices, datum/callback/select_proc, uniqueid, radius, tooltips = FALSE, radial_slice_icon = "radial_slice") +/proc/show_radial_menu_persistent(mob/user, atom/anchor, list/choices, datum/callback/select_proc, uniqueid, radius, tooltips = FALSE, radial_slice_icon = "radial_slice", datum/callback/custom_check) if(!user || !anchor || !length(choices) || !select_proc) return if(!uniqueid) @@ -71,9 +78,13 @@ menu.radius = radius menu.radial_slice_icon = radial_slice_icon menu.select_proc_callback = select_proc + if(istype(custom_check)) + menu.custom_check_callback = custom_check menu.anchor = anchor menu.check_screen_border(user) //Do what's needed to make it look good near borders or on hud menu.set_choices(choices, tooltips) menu.show_to(user) + if(menu.custom_check_callback) + menu.next_check = world.time + menu.check_delay + INVOKE_ASYNC(menu, TYPE_PROC_REF(/datum/radial_menu, wait)) return menu - diff --git a/code/_onclick/hud/rendering/plane_master.dm b/code/_onclick/hud/rendering/plane_master.dm index a873ec6d82458..fb301a93451cc 100644 --- a/code/_onclick/hud/rendering/plane_master.dm +++ b/code/_onclick/hud/rendering/plane_master.dm @@ -64,7 +64,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/plane_master) /// If this plane master is outside of our visual bounds right now var/is_outside_bounds = FALSE -/atom/movable/screen/plane_master/Initialize(mapload, datum/plane_master_group/home, offset = 0) +/atom/movable/screen/plane_master/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset = 0) . = ..() src.offset = offset true_alpha = alpha @@ -132,7 +132,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/plane_master) if(force_hidden) return FALSE - var/client/our_client = mymob?.client + var/client/our_client = mymob?.canon_client // Alright, let's get this out of the way // Mobs can move z levels without their client. If this happens, we need to ensure critical display settings are respected // This is done here. Mild to severe pain but it's nessesary @@ -244,7 +244,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/plane_master) multiz_scaled = FALSE critical = PLANE_CRITICAL_DISPLAY -/atom/movable/screen/plane_master/clickcatcher/Initialize(mapload, datum/plane_master_group/home, offset) +/atom/movable/screen/plane_master/clickcatcher/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset) . = ..() RegisterSignal(SSmapping, COMSIG_PLANE_OFFSET_INCREASE, PROC_REF(offset_increased)) offset_increased(SSmapping, 0, SSmapping.max_plane_offset) @@ -265,7 +265,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/plane_master) render_relay_planes = list(RENDER_PLANE_GAME, LIGHT_MASK_PLANE) critical = PLANE_CRITICAL_FUCKO_PARALLAX // goes funny when touched. no idea why I don't trust byond -/atom/movable/screen/plane_master/parallax_white/Initialize(mapload, datum/plane_master_group/home, offset) +/atom/movable/screen/plane_master/parallax_white/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset) . = ..() add_relay_to(GET_NEW_PLANE(EMISSIVE_RENDER_PLATE, offset), relay_layer = EMISSIVE_SPACE_LAYER) @@ -282,7 +282,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/plane_master) mouse_opacity = MOUSE_OPACITY_TRANSPARENT multiz_scaled = FALSE -/atom/movable/screen/plane_master/parallax/Initialize(mapload, datum/plane_master_group/home, offset) +/atom/movable/screen/plane_master/parallax/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset) . = ..() if(offset != 0) // You aren't the source? don't change yourself @@ -360,7 +360,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/plane_master) // Needs to be critical or it uh, it'll look white critical = PLANE_CRITICAL_DISPLAY|PLANE_CRITICAL_NO_RELAY -/atom/movable/screen/plane_master/floor/Initialize(mapload, datum/plane_master_group/home, offset) +/atom/movable/screen/plane_master/floor/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset) . = ..() add_relay_to(GET_NEW_PLANE(EMISSIVE_RENDER_PLATE, offset), relay_layer = EMISSIVE_FLOOR_LAYER, relay_color = GLOB.em_block_color) @@ -370,7 +370,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/plane_master) plane = WALL_PLANE render_relay_planes = list(RENDER_PLANE_GAME_WORLD, LIGHT_MASK_PLANE) -/atom/movable/screen/plane_master/wall/Initialize(mapload, datum/plane_master_group/home, offset) +/atom/movable/screen/plane_master/wall/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset) . = ..() add_relay_to(GET_NEW_PLANE(EMISSIVE_RENDER_PLATE, offset), relay_layer = EMISSIVE_WALL_LAYER, relay_color = GLOB.em_block_color) @@ -386,7 +386,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/plane_master) plane = GAME_PLANE_FOV_HIDDEN render_relay_planes = list(RENDER_PLANE_GAME_WORLD) -/atom/movable/screen/plane_master/game_world_fov_hidden/Initialize(mapload) +/atom/movable/screen/plane_master/game_world_fov_hidden/Initialize(mapload, datum/hud/hud_owner) . = ..() add_filter("vision_cone", 1, alpha_mask_filter(render_source = OFFSET_RENDER_TARGET(FIELD_OF_VISION_BLOCKER_RENDER_TARGET, offset), flags = MASK_INVERSE)) @@ -406,7 +406,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/plane_master) // This is safe because we will ALWAYS be on the top z layer, so it DON'T MATTER multiz_scaled = FALSE -/atom/movable/screen/plane_master/field_of_vision_blocker/Initialize(mapload, datum/plane_master_group/home, offset) +/atom/movable/screen/plane_master/field_of_vision_blocker/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset) . = ..() mirror_parent_hidden() @@ -423,7 +423,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/plane_master) plane = WALL_PLANE_UPPER render_relay_planes = list(RENDER_PLANE_GAME_WORLD, LIGHT_MASK_PLANE) -/atom/movable/screen/plane_master/wall_upper/Initialize(mapload, datum/plane_master_group/home, offset) +/atom/movable/screen/plane_master/wall_upper/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset) . = ..() add_relay_to(GET_NEW_PLANE(EMISSIVE_RENDER_PLATE, offset), relay_layer = EMISSIVE_WALL_LAYER, relay_color = GLOB.em_block_color) @@ -433,7 +433,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/plane_master) plane = GAME_PLANE_UPPER_FOV_HIDDEN render_relay_planes = list(RENDER_PLANE_GAME_WORLD) -/atom/movable/screen/plane_master/game_world_upper_fov_hidden/Initialize(mapload) +/atom/movable/screen/plane_master/game_world_upper_fov_hidden/Initialize(mapload, datum/hud/hud_owner) . = ..() // Dupe of the other hidden plane add_filter("vision_cone", 1, alpha_mask_filter(render_source = OFFSET_RENDER_TARGET(FIELD_OF_VISION_BLOCKER_RENDER_TARGET, offset), flags = MASK_INVERSE)) @@ -536,7 +536,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/plane_master) plane = PIPECRAWL_IMAGES_PLANE start_hidden = TRUE -/atom/movable/screen/plane_master/pipecrawl/Initialize(mapload) +/atom/movable/screen/plane_master/pipecrawl/Initialize(mapload, datum/hud/hud_owner) . = ..() // Makes everything on this plane slightly brighter // Has a nice effect, makes thing stand out @@ -563,7 +563,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/plane_master) // This can call on a cycle cause we don't clear in hide_from // Yes this is the best way of hooking into the hud, I hate myself too RegisterSignal(our_hud, COMSIG_HUD_EYE_CHANGED, PROC_REF(eye_changed), override = TRUE) - eye_changed(our_hud, null, our_hud.mymob?.client?.eye) + eye_changed(our_hud, null, our_hud.mymob?.canon_client?.eye) /atom/movable/screen/plane_master/camera_static/proc/eye_changed(datum/hud/source, atom/old_eye, atom/new_eye) SIGNAL_HANDLER @@ -611,7 +611,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/plane_master) if(!.) return remove_filter("AO") - if(istype(mymob) && mymob.client?.prefs?.read_preference(/datum/preference/toggle/ambient_occlusion)) + if(istype(mymob) && mymob.canon_client?.prefs?.read_preference(/datum/preference/toggle/ambient_occlusion)) add_filter("AO", 1, drop_shadow_filter(x = 0, y = -2, size = 4, color = "#04080FAA")) /atom/movable/screen/plane_master/balloon_chat diff --git a/code/_onclick/hud/rendering/plane_master_group.dm b/code/_onclick/hud/rendering/plane_master_group.dm index b9f60ff8e9d4e..c1fa1b3787864 100644 --- a/code/_onclick/hud/rendering/plane_master_group.dm +++ b/code/_onclick/hud/rendering/plane_master_group.dm @@ -84,7 +84,7 @@ for(var/plane_offset in starting_offset to ending_offset) if(plane_offset != 0 && !initial(mytype.allows_offsetting)) continue - var/atom/movable/screen/plane_master/instance = new mytype(null, src, plane_offset) + var/atom/movable/screen/plane_master/instance = new mytype(null, null, src, plane_offset) plane_masters["[instance.plane]"] = instance prep_plane_instance(instance) diff --git a/code/_onclick/hud/rendering/render_plate.dm b/code/_onclick/hud/rendering/render_plate.dm index 8beaed86eff43..9d5b5db99338e 100644 --- a/code/_onclick/hud/rendering/render_plate.dm +++ b/code/_onclick/hud/rendering/render_plate.dm @@ -76,7 +76,7 @@ plane = RENDER_PLANE_GAME render_relay_planes = list(RENDER_PLANE_MASTER) -/atom/movable/screen/plane_master/rendering_plate/game_plate/Initialize(mapload) +/atom/movable/screen/plane_master/rendering_plate/game_plate/Initialize(mapload, datum/hud/hud_owner) . = ..() add_filter("displacer", 1, displacement_map_filter(render_source = OFFSET_RENDER_TARGET(GRAVITY_PULSE_RENDER_TARGET, offset), size = 10)) @@ -91,7 +91,7 @@ plane = RENDER_PLANE_TRANSPARENT appearance_flags = PLANE_MASTER -/atom/movable/screen/plane_master/rendering_plate/transparent/Initialize(mapload, datum/plane_master_group/home, offset) +/atom/movable/screen/plane_master/rendering_plate/transparent/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset) . = ..() // Don't display us if we're below everything else yeah? AddComponent(/datum/component/plane_hide_highest_offset) @@ -110,7 +110,7 @@ if(!.) return remove_filter("AO") - if(istype(mymob) && mymob.client?.prefs?.read_preference(/datum/preference/toggle/ambient_occlusion)) + if(istype(mymob) && mymob.canon_client?.prefs?.read_preference(/datum/preference/toggle/ambient_occlusion)) add_filter("AO", 1, drop_shadow_filter(x = 0, y = -2, size = 4, color = "#04080FAA")) ///Contains all lighting objects @@ -140,7 +140,7 @@ * A color matrix filter is applied to the emissive plane to mask out anything that isn't whatever the emissive color is. * This is then used to alpha mask the lighting plane. */ -/atom/movable/screen/plane_master/rendering_plate/lighting/Initialize(mapload) +/atom/movable/screen/plane_master/rendering_plate/lighting/Initialize(mapload, datum/hud/hud_owner) . = ..() add_filter("emissives", 1, alpha_mask_filter(render_source = OFFSET_RENDER_TARGET(EMISSIVE_RENDER_TARGET, offset), flags = MASK_INVERSE)) add_filter("object_lighting", 2, alpha_mask_filter(render_source = OFFSET_RENDER_TARGET(O_LIGHTING_VISUAL_RENDER_TARGET, offset), flags = MASK_INVERSE)) @@ -225,7 +225,7 @@ render_relay_planes = list() critical = PLANE_CRITICAL_DISPLAY -/atom/movable/screen/plane_master/rendering_plate/emissive_slate/Initialize(mapload, datum/plane_master_group/home, offset) +/atom/movable/screen/plane_master/rendering_plate/emissive_slate/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset) . = ..() add_filter("em_block_masking", 2, color_matrix_filter(GLOB.em_mask_matrix)) if(offset != 0) @@ -323,7 +323,7 @@ if(get_relay_to(target_plane)) return render_relay_planes += target_plane - var/client/display_lad = home?.our_hud?.mymob?.client + var/client/display_lad = home?.our_hud?.mymob?.canon_client var/atom/movable/render_plane_relay/relay = generate_relay_to(target_plane, show_to = display_lad, blend_override = blend_override, relay_layer = relay_layer) relay.color = relay_color @@ -373,7 +373,7 @@ relays -= existing_relay if(!length(relays) && !initial(render_target)) render_target = null - var/client/lad = home?.our_hud?.mymob?.client + var/client/lad = home?.our_hud?.mymob?.canon_client if(lad) lad.screen -= existing_relay diff --git a/code/_onclick/hud/revenanthud.dm b/code/_onclick/hud/revenanthud.dm index 75865d3d4547e..c47ea4c241808 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 951d0f626f95e..ea890566f74cf 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -77,62 +77,52 @@ 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) @@ -143,44 +133,37 @@ 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 = new /atom/movable/screen/pull(null, src) pull_icon.icon = 'icons/hud/screen_cyborg.dmi' 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 f3de202f01c71..1a345038a2b5a 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -18,7 +18,7 @@ /// A reference to the object in the slot. Grabs or items, generally. var/obj/master = null /// A reference to the owner HUD, if any. - var/datum/hud/hud = null + VAR_PRIVATE/datum/hud/hud = null /** * Map name assigned to this object. * Automatically set by /client/proc/add_obj_to_map. @@ -36,6 +36,11 @@ /// If FALSE, this will not be cleared when calling /client/clear_screen() var/clear_with_screen = TRUE +/atom/movable/screen/Initialize(mapload, datum/hud/hud_owner) + . = ..() + if(hud_owner && istype(hud_owner)) + hud = hud_owner + /atom/movable/screen/Destroy() master = null hud = null @@ -116,9 +121,7 @@ screen_loc = ui_language_menu /atom/movable/screen/language_menu/Click() - var/mob/M = usr - var/datum/language_holder/H = M.get_language_holder() - H.open_language_menu(usr) + usr.get_language_holder().open_language_menu(usr) /atom/movable/screen/inventory /// The identifier for the slot. It has nothing to do with ID cards. @@ -244,7 +247,7 @@ 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 @@ -269,7 +272,7 @@ icon_state = "combat_off" screen_loc = ui_combat_toggle -/atom/movable/screen/combattoggle/Initialize(mapload) +/atom/movable/screen/combattoggle/Initialize(mapload, datum/hud/hud_owner) . = ..() update_appearance() @@ -323,15 +326,18 @@ toggle(usr) /atom/movable/screen/mov_intent/update_icon_state() - switch(hud?.mymob?.m_intent) + if(!hud || !hud.mymob || !isliving(hud.mymob)) + return + var/mob/living/living_hud_owner = hud.mymob + switch(living_hud_owner.move_intent) if(MOVE_INTENT_WALK) icon_state = "walking" if(MOVE_INTENT_RUN) icon_state = "running" return ..() -/atom/movable/screen/mov_intent/proc/toggle(mob/user) - if(isobserver(user)) +/atom/movable/screen/mov_intent/proc/toggle(mob/living/user) + if(!istype(user)) return user.toggle_move_intent(user) @@ -386,7 +392,7 @@ screen_loc = "7,7 to 10,8" plane = HUD_PLANE -/atom/movable/screen/storage/Initialize(mapload, new_master) +/atom/movable/screen/storage/Initialize(mapload, datum/hud/hud_owner, new_master) . = ..() master = new_master @@ -627,7 +633,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/splash) -/atom/movable/screen/splash/Initialize(mapload, client/C, visible, use_previous_title) +/atom/movable/screen/splash/Initialize(mapload, datum/hud/hud_owner, client/C, visible, use_previous_title) . = ..() if(!istype(C)) return diff --git a/code/_onclick/hud/screentip.dm b/code/_onclick/hud/screentip.dm index 8f3b9d63014d3..107f4ce1be523 100644 --- a/code/_onclick/hud/screentip.dm +++ b/code/_onclick/hud/screentip.dm @@ -8,15 +8,14 @@ maptext = "" layer = SCREENTIP_LAYER //Added to make screentips appear above action buttons (and other /atom/movable/screen objects) -/atom/movable/screen/screentip/Initialize(mapload, _hud) +/atom/movable/screen/screentip/Initialize(mapload, datum/hud/hud_owner) . = ..() - hud = _hud update_view() /atom/movable/screen/screentip/proc/update_view(datum/source) SIGNAL_HANDLER - if(!hud || !hud.mymob.client.view_size) //Might not have been initialized by now + if(!hud || !hud.mymob.canon_client.view_size) //Might not have been initialized by now return - maptext_width = view_to_pixels(hud.mymob.client.view_size.getView())[1] + maptext_width = view_to_pixels(hud.mymob.canon_client.view_size.getView())[1] diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index d70d7233b79a6..b3d15e0c47666 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -156,6 +156,9 @@ return ..() || ((obj_flags & CAN_BE_HIT) && attacking_item.attack_atom(src, user, params)) /mob/living/attackby(obj/item/attacking_item, mob/living/user, params) + if(can_perform_surgery(user, params)) + return TRUE + if(..()) return TRUE user.changeNext_move(attacking_item.attack_speed) @@ -228,7 +231,7 @@ /// 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) + if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_ATOM, attacked_atom, user) & COMPONENT_CANCEL_ATTACK_CHAIN) return if(item_flags & NOBLUDGEON) return diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index 2fab31e0af4a8..1cdb99bbb42af 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -68,11 +68,6 @@ // And here are some good things for free: // Now you can click through portals, wormholes, gateways, and teleporters while observing. -Sayu -/obj/effect/gateway_portal_bumper/attack_ghost(mob/user) - if(gateway) - gateway.Transfer(user) - return ..() - /obj/machinery/teleport/hub/attack_ghost(mob/user) if(!power_station?.engaged || !power_station.teleporter_console || !power_station.teleporter_console.target_ref) return ..() diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 624cf560f64aa..3de27ee7e10e9 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -93,7 +93,7 @@ /obj/item/tk_grab name = "Telekinetic Grab" desc = "Magic" - icon = 'icons/obj/magic.dmi'//Needs sprites + icon = 'icons/effects/magic.dmi'//Needs sprites icon_state = "2" item_flags = NOBLUDGEON | ABSTRACT | DROPDEL //inhand_icon_state = null diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index b7f646e675f33..830f15ae559d2 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -98,6 +98,9 @@ LoadChatFilter() if(CONFIG_GET(flag/load_jobs_from_txt)) validate_job_config() + if(SSjob.initialized) // in case we're reloading from disk after initialization, wanna make sure the changes update in the ongoing shift + SSjob.load_jobs_from_config() + if(CONFIG_GET(flag/usewhitelist)) load_whitelist() diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 5d1b46599e4be..761659ec60f3e 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -199,9 +199,6 @@ default = list( //DEFAULTS /mob/living/simple_animal = 1, /mob/living/silicon/pai = 1, - /mob/living/carbon/alien/adult/hunter = -1, - /mob/living/carbon/alien/adult/royal/praetorian = 1, - /mob/living/carbon/alien/adult/royal/queen = 3 ) /datum/config_entry/keyed_list/multiplicative_movespeed/ValidateAndSet() @@ -428,4 +425,8 @@ default = 4 min_val = 1 +/datum/config_entry/str_list/tts_voice_blacklist + /datum/config_entry/flag/give_tutorials_without_db + +/datum/config_entry/string/new_player_alert_role_id diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index d5673a92485ba..05226ae6b9418 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -258,10 +258,25 @@ /datum/config_entry/string/hostedby -/datum/config_entry/flag/norespawn - +/// Determines if a player can respawn after dying. +/// 0 / RESPAWN_FLAG_DISABLED = Cannot respawn (default) +/// 1 / RESPAWN_FLAG_FREE = Can respawn +/// 2 / RESPAWN_FLAG_NEW_CHARACTER = Can respawn if choosing a different character +/datum/config_entry/flag/allow_respawn + default = RESPAWN_FLAG_DISABLED + +/datum/config_entry/flag/allow_respawn/ValidateAndSet(str_val) + if(!VASProcCallGuard(str_val)) + return FALSE + var/val_as_num = text2num(str_val) + if(val_as_num in list(RESPAWN_FLAG_DISABLED, RESPAWN_FLAG_FREE, RESPAWN_FLAG_NEW_CHARACTER)) + config_entry_value = val_as_num + return TRUE + return FALSE + +/// Determines how long (in deciseconds) before a player is allowed to respawn. /datum/config_entry/number/respawn_delay - default = 0 + default = 0 SECONDS /datum/config_entry/flag/usewhitelist @@ -432,8 +447,6 @@ /datum/config_entry/flag/irc_first_connection_alert // do we notify the irc channel when somebody is connecting for the first time? -/datum/config_entry/flag/check_randomizer - /datum/config_entry/string/ipintel_email /datum/config_entry/string/ipintel_email/ValidateAndSet(str_val) @@ -626,6 +639,12 @@ /datum/config_entry/flag/auto_profile +/datum/config_entry/number/drift_dump_threshold + default = 4 SECONDS + +/datum/config_entry/number/drift_profile_delay + default = 15 SECONDS + /datum/config_entry/string/centcom_ban_db // URL for the CentCom Galactic Ban DB API /datum/config_entry/string/centcom_source_whitelist @@ -697,3 +716,11 @@ /datum/config_entry/flag/config_errors_runtime default = FALSE + +/datum/config_entry/number/upload_limit + default = 524288 + min_val = 0 + +/datum/config_entry/number/upload_limit_admin + default = 5242880 + min_val = 0 diff --git a/code/controllers/configuration/entries/jobs.dm b/code/controllers/configuration/entries/jobs.dm new file mode 100644 index 0000000000000..06563e01a8e3d --- /dev/null +++ b/code/controllers/configuration/entries/jobs.dm @@ -0,0 +1,186 @@ +// This file pretty much just handles all of the interactions between jobconfig.toml and the codebase. This is started by work originating in SSconfig, so I'm okay with it being here. + +/// Returns an associated list of all of the job config types that we have in the codebase. +/datum/controller/subsystem/job/proc/generate_config_singletons() + var/returnable_list = list() + for(var/datum/job_config_type/config_datum as anything in subtypesof(/datum/job_config_type)) + returnable_list[initial(config_datum.name)] = new config_datum + + return returnable_list + +/// Sets all of the job datum configurable values to what they've been set to in the config file, jobconfig.toml. +/datum/controller/subsystem/job/proc/load_jobs_from_config(silent = FALSE) + if(!length(job_config_datum_singletons)) + stack_trace("SSjob tried to load jobs from config, but the config singletons were not initialized! Likely tried to load jobs before SSjob was initialized.") + return + + if(legacy_mode) + legacy_load() + return + + var/toml_path = "[global.config.directory]/jobconfig.toml" + var/list/job_config = rustg_read_toml_file(toml_path) + + for(var/datum/job/occupation as anything in joinable_occupations) + var/job_key = occupation.config_tag + if(!job_config[job_key]) // Job isn't listed, skip it. + // List both job_title and job_key in case they de-sync over time. + if(!silent) + message_admins(span_notice("[occupation.title] (with config key [job_key]) is missing from jobconfig.toml! Using codebase defaults.")) + continue + + for(var/config_datum_key in job_config_datum_singletons) + var/datum/job_config_type/config_datum = job_config_datum_singletons[config_datum_key] + var/config_value = job_config[job_key][config_datum_key] + config_datum.set_current_value(occupation, config_value) + +/// Operates the legacy jobs.txt parser to load jobs from the old config system. +/datum/controller/subsystem/job/proc/legacy_load() + var/jobsfile = file("[global.config.directory]/jobs.txt") + if(!fexists(jobsfile)) // sanity with a trace + stack_trace("Despite SSconfig setting SSjob.legacy_mode to TRUE, jobs.txt was not found in the config directory! Something has gone terribly wrong!") + return + var/jobstext = file2text(jobsfile) + for(var/datum/job/occupation as anything in joinable_occupations) + var/regex/parser = new("[occupation.title]=(-1|\\d+),(-1|\\d+)") + parser.Find(jobstext) + occupation.total_positions = text2num(parser.group[1]) + occupation.spawn_positions = text2num(parser.group[2]) + +/// Will generate a new jobconfig.toml file if one does not exist, or if one does exist, will migrate the old jobs.txt file into the new TOML format for download +/// Returns TRUE if a file is successfully generated, FALSE otherwise. +/datum/controller/subsystem/job/proc/generate_config(mob/user) + var/toml_path = "[global.config.directory]/jobconfig.toml" + var/jobstext = "[global.config.directory]/jobs.txt" + config_documentation = initial(config_documentation) // Reset to default juuuuust in case. + + if(fexists(file(toml_path))) + to_chat(user, span_notice("Generating new jobconfig.toml, pulling from the old config settings.")) + if(!regenerate_job_config(user)) + return FALSE + return TRUE + + if(fexists(file(jobstext))) // Generate the new TOML format, migrating from the text format. + to_chat(user, span_notice("Found jobs.txt in config directory! Generating jobconfig.toml from it.")) + if(!import_config_from_txt(user)) + return FALSE + return TRUE + + // Generate the new TOML format, using codebase defaults. + to_chat(user, span_notice("Generating new jobconfig.toml, using codebase defaults.")) + var/list/file_data = list() + for(var/datum/job/occupation as anything in joinable_occupations) + file_data[occupation.config_tag] = generate_blank_job_config(occupation) + + if(!export_toml(user, file_data)) + return FALSE + + return TRUE + +/// Loads the job config from the TXT and creates a new TOML file from it. +/// Returns TRUE if a file is successfully generated, FALSE otherwise. +/datum/controller/subsystem/job/proc/import_config_from_txt(mob/user) + var/unrolled_jobs_txt = file2text(file("[global.config.directory]/jobs.txt")) // walter i'm dying (get the file from the string, then parse it into a larger text string) + var/list/file_data = list() + config_documentation += "\n\n## This TOML was migrated from jobs.txt. All variables are COMMENTED and will not load by default! Please verify to ensure that they are correct, and uncomment the key as you want, comparing it to the old config.\n\n" // small warning + + for(var/datum/job/occupation as anything in joinable_occupations) + var/regex/parser = new("[occupation.title]=(-1|\\d+),(-1|\\d+)") // TXT system used the occupation's name, we convert it to the new config_key system here. + parser.Find(unrolled_jobs_txt) + + var/default_positions = text2num(parser.group[1]) + var/starting_positions = text2num(parser.group[2]) + + // Playtime Requirements and Required Account Age are new and we want to see it migrated, so we will just pull codebase defaults for them. + // Remember, every time we write the TOML from scratch, we want to have it commented out by default to ensure that the server operator knows that they are overriding the codebase defaults when they remove the comment. + var/list/working_list = list( + "# [JOB_CONFIG_TOTAL_POSITIONS]" = default_positions, + "# [JOB_CONFIG_SPAWN_POSITIONS]" = starting_positions, + ) + + working_list += generate_job_config_excluding_legacy(occupation) + file_data[occupation.config_tag] = working_list + + if(!export_toml(user, file_data)) + return FALSE + + return TRUE + +/// If we add a new job or more fields to config a job with, quickly spin up a brand new config that inherits all of your old settings, but adds the new job with codebase defaults. +/// Returns TRUE if a file is successfully generated, FALSE otherwise. +/datum/controller/subsystem/job/proc/regenerate_job_config(mob/user) + var/toml_path = "[global.config.directory]/jobconfig.toml" + var/list/file_data = list() + + if(!fexists(file(toml_path))) // You need an existing (valid) TOML for this to work. Sanity check if someone calls this directly instead of through 'Generate Job Configuration' verb. + to_chat(user, span_notice("No jobconfig.toml found in the config folder! If this is not expected, please notify a server operator or coders. You may need to generate a new config file by running 'Generate Job Configuration' from the Server tab.")) + return FALSE + + var/list/job_config = rustg_read_toml_file(toml_path) + for(var/datum/job/occupation as anything in joinable_occupations) + var/job_key = occupation.config_tag + + if(file_data[job_key]) + stack_trace("We were about to over-write a job key that already exists in file_data while generating a new jobconfig.toml! This should not happen! Verify you do not have any duplicate job keys in your codebase!") + continue + + // When we regenerate, we want to make sure commented stuff stays commented, but we also want to migrate information that remains uncommented. So, let's make sure we keep that pattern. + if(!job_config[job_key]) + to_chat(user, span_notice("New job [occupation.title] (using key [job_key]) detected! Adding to jobconfig.toml using default codebase values...")) + file_data[job_key] = generate_blank_job_config(occupation) + continue + + var/list/working_list = list() + for(var/config_datum_key in job_config_datum_singletons) + var/datum/job_config_type/config_datum = job_config_datum_singletons[config_datum_key] + var/config_read_value = job_config[job_key][config_datum_key] + if(!config_datum.validate_value(config_read_value)) + working_list += list( + "# [config_datum_key]" = config_datum.get_current_value(occupation), // note that this doesn't make a real comment, it just creates a string mismatch. + ) + else + working_list += list( + "[config_datum_key]" = config_read_value, + ) + + file_data[job_key] = working_list + + if(!export_toml(user, file_data)) + return FALSE + + return TRUE + +/// This will just return a list for a completely new job that doesn't need to be migrated from an old config (completely new). Just done here to reduce copypasta +/datum/controller/subsystem/job/proc/generate_blank_job_config(datum/job/new_occupation) + var/returnable_list = list() + for(var/config_datum_key in job_config_datum_singletons) + var/datum/job_config_type/config_datum = job_config_datum_singletons[config_datum_key] + // Remember, every time we write the TOML from scratch, we want to have it commented out by default. + // This is to ensure that the server operator knows that they are overriding codebase defaults when they remove the comment. + // Having comments mean that we allow server operators to defer to codebase standards when they deem acceptable. They must uncomment to override the codebase default. + returnable_list += list( + "# [config_datum_key]" = config_datum.get_current_value(new_occupation), + ) + + return returnable_list + +/// Like `generate_blank_job_config`, but we opt-out of adding the legacy variables in case we handle it elsewhere. +/datum/controller/subsystem/job/proc/generate_job_config_excluding_legacy(datum/job/new_occupation) + var/list/returnable_list = list() + // make a quick list to ensure we don't double-dip total_positions and spawn_positions, but still get future config types in + var/list/datums_to_read = job_config_datum_singletons - list(JOB_CONFIG_TOTAL_POSITIONS, JOB_CONFIG_SPAWN_POSITIONS) + for(var/config_datum_key in datums_to_read) + var/datum/job_config_type/config_datum = job_config_datum_singletons[config_datum_key] + returnable_list += list( + "# [config_datum_key]" = config_datum.get_current_value(new_occupation), + ) + + return returnable_list + +/// Proc that we call to generate a new jobconfig.toml file and send it to the requesting client. Returns TRUE if a file is successfully generated. +/datum/controller/subsystem/job/proc/export_toml(mob/user, data) + var/file_location = "data/jobconfig.toml" // store it in the data folder server-side so we can FTP it to the client. + var/payload = "[config_documentation]\n[rustg_toml_encode(data)]" + rustg_file_write(payload, file_location) + DIRECT_OUTPUT(user, ftp(file(file_location), "jobconfig.toml")) + return TRUE diff --git a/code/controllers/globals.dm b/code/controllers/globals.dm index dd9b41aacc361..72b00c7d868b7 100644 --- a/code/controllers/globals.dm +++ b/code/controllers/globals.dm @@ -33,6 +33,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 694f2906bf57d..6e4c21fba208b 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -32,6 +32,8 @@ GLOBAL_REAL(Master, /datum/controller/master) var/init_timeofday var/init_time var/tickdrift = 0 + /// Tickdrift as of last tick, w no averaging going on + var/olddrift = 0 /// How long is the MC sleeping between runs, read only (set by Loop() based off of anti-tick-contention heuristics) var/sleep_delta = 1 @@ -60,6 +62,10 @@ GLOBAL_REAL(Master, /datum/controller/master) /// Outside of initialization, returns null. var/current_initializing_subsystem = null + /// The last decisecond we force dumped profiling information + /// Used to avoid spamming profile reads since they can be expensive (string memes) + var/last_profiled = 0 + var/static/restart_clear = 0 var/static/restart_timeout = 0 var/static/restart_count = 0 @@ -284,6 +290,7 @@ GLOBAL_REAL(Master, /datum/controller/master) SS_INIT_NONE, SS_INIT_SUCCESS, SS_INIT_NO_NEED, + SS_INIT_NO_MESSAGE, ) if (subsystem.flags & SS_NO_INIT || subsystem.initialized) //Don't init SSs with the corresponding flag or if they already are initialized @@ -329,7 +336,7 @@ GLOBAL_REAL(Master, /datum/controller/master) if(SS_INIT_FAILURE) message_prefix = "Failed to initialize [subsystem.name] subsystem after" chat_warning = TRUE - if(SS_INIT_SUCCESS) + if(SS_INIT_SUCCESS, SS_INIT_NO_MESSAGE) message_prefix = "Initialized [subsystem.name] subsystem within" if(SS_INIT_NO_NEED) // This SS is disabled or is otherwise shy. @@ -342,7 +349,8 @@ GLOBAL_REAL(Master, /datum/controller/master) var/message = "[message_prefix] [seconds] second[seconds == 1 ? "" : "s"]!" var/chat_message = chat_warning ? span_boldwarning(message) : span_boldannounce(message) - to_chat(world, chat_message) + if(result != SS_INIT_NO_MESSAGE) + to_chat(world, chat_message) log_world(message) /datum/controller/master/proc/SetRunLevel(new_runlevel) @@ -442,9 +450,14 @@ GLOBAL_REAL(Master, /datum/controller/master) canary.use_variable() //the actual loop. while (1) - tickdrift = max(0, MC_AVERAGE_FAST(tickdrift, (((REALTIMEOFDAY - init_timeofday) - (world.time - init_time)) / world.tick_lag))) + var/newdrift = ((REALTIMEOFDAY - init_timeofday) - (world.time - init_time)) / world.tick_lag + tickdrift = max(0, MC_AVERAGE_FAST(tickdrift, newdrift)) var/starting_tick_usage = TICK_USAGE + if(newdrift - olddrift >= CONFIG_GET(number/drift_dump_threshold)) + AttemptProfileDump(CONFIG_GET(number/drift_profile_delay)) + olddrift = newdrift + if (init_stage != init_stage_completed) return MC_LOOP_RTN_NEWSTAGES if (processing <= 0) @@ -803,3 +816,11 @@ GLOBAL_REAL(Master, /datum/controller/master) for (var/thing in subsystems) var/datum/controller/subsystem/SS = thing SS.OnConfigLoad() + +/// Attempts to dump our current profile info into a file, triggered if the MC thinks shit is going down +/// Accepts a delay in deciseconds of how long ago our last dump can be, this saves causing performance problems ourselves +/datum/controller/master/proc/AttemptProfileDump(delay) + if(REALTIMEOFDAY - last_profiled <= delay) + return FALSE + last_profiled = REALTIMEOFDAY + SSprofiler.DumpFile(allow_yield = FALSE) diff --git a/code/controllers/subsystem/achievements.dm b/code/controllers/subsystem/achievements.dm index 58fcb3efb7335..e477848d73977 100644 --- a/code/controllers/subsystem/achievements.dm +++ b/code/controllers/subsystem/achievements.dm @@ -6,6 +6,8 @@ SUBSYSTEM_DEF(achievements) ///List of achievements var/list/datum/award/achievement/achievements = list() + ///The achievement with the highest amount of players that have unlocked it. + var/datum/award/achievement/most_unlocked_achievement ///List of scores var/list/datum/award/score/scores = list() ///List of all awards @@ -16,18 +18,47 @@ SUBSYSTEM_DEF(achievements) return SS_INIT_NO_NEED achievements_enabled = TRUE - for(var/T in subtypesof(/datum/award/achievement)) - var/instance = new T - achievements[T] = instance - awards[T] = instance + var/list/achievements_by_db_id = list() + for(var/datum/award/achievement/achievement as anything in subtypesof(/datum/award/achievement)) + if(!initial(achievement.database_id)) // abstract type + continue + var/datum/award/achievement/instance = new achievement + achievements[achievement] = instance + awards[achievement] = instance + achievements_by_db_id[instance.database_id] = instance - for(var/T in subtypesof(/datum/award/score)) - var/instance = new T - scores[T] = instance - awards[T] = instance + for(var/datum/award/score/score as anything in subtypesof(/datum/award/score)) + if(!initial(score.database_id)) // abstract type + continue + var/instance = new score + scores[score] = instance + awards[score] = instance update_metadata() + /** + * Count how many (unlocked) achievements are in the achievements database + * then store that amount in the times_achieved variable for each achievement. + * + * Thanks to Jordie for the query. + */ + var/datum/db_query/query = SSdbcore.NewQuery( + "SELECT a.achievement_key, COUNT(a.achievement_key) AS count FROM achievements a \ + JOIN achievement_metadata m ON a.achievement_key = m.achievement_key AND m.achievement_type = 'achievement' \ + GROUP BY a.achievement_key ORDER BY count DESC" + ) + if(query.Execute(async = TRUE)) + while(query.NextRow()) + var/id = query.item[1] + var/datum/award/achievement/instance = id ? achievements_by_db_id[id] : null + if(isnull(instance)) // removed achievement + continue + instance.times_achieved = query.item[2] + // the results are ordered in descending orders, so the first in the list should be the most unlocked one. + if(!most_unlocked_achievement) + most_unlocked_achievement = instance + qdel(query) + for(var/i in GLOB.clients) var/client/C = i if(!C.player_details.achievements.initialized) @@ -65,8 +96,6 @@ SUBSYSTEM_DEF(achievements) var/list/to_update = list() for(var/T in awards) var/datum/award/A = awards[T] - if(!A.database_id) - continue if(!current_metadata[A.database_id] || current_metadata[A.database_id] < A.achievement_version) to_update += list(A.get_metadata_row()) diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index 13a6befbd0412..953cbd3bd4cc4 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -1,11 +1,13 @@ +#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() @@ -39,11 +41,11 @@ SUBSYSTEM_DEF(atoms) if(initialized == INITIALIZATION_INSSATOMS) return - set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD) + set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD, SUBSYSTEM_INIT_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() + clear_tracked_initalize(SUBSYSTEM_INIT_SOURCE) if(late_loaders.len) for(var/I in 1 to late_loaders.len) @@ -109,84 +111,43 @@ SUBSYSTEM_DEF(atoms) testing("Initialized [count] atoms") -/// Init this specific atom -/datum/controller/subsystem/atoms/proc/InitAtom(atom/A, from_template = FALSE, list/arguments) - var/the_type = A.type +/datum/controller/subsystem/atoms/proc/map_loader_begin(source) + set_tracked_initalized(INITIALIZATION_INSSATOMS, source) - if(QDELING(A)) - // Check init_start_time to not worry about atoms created before the atoms SS that are cleaned up before this - if (A.gc_destroyed > init_start_time) - BadInitializeCalls[the_type] |= BAD_INIT_QDEL_BEFORE - return TRUE +/datum/controller/subsystem/atoms/proc/map_loader_stop(source) + clear_tracked_initalize(source) - // This is handled and battle tested by dreamchecker. Limit to UNIT_TESTS just in case that ever fails. - #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 - - switch(result) - if (INITIALIZE_HINT_NORMAL) - // pass - if(INITIALIZE_HINT_LATELOAD) - if(arguments[1]) //mapload - late_loaders += A - else - A.LateInitialize() - if(INITIALIZE_HINT_QDEL) - qdel(A) - qdeleted = TRUE - else - BadInitializeCalls[the_type] |= BAD_INIT_NO_HINT - - if(!A) //possible harddel - qdeleted = TRUE - else if(!(A.flags_1 & INITIALIZED_1)) - BadInitializeCalls[the_type] |= BAD_INIT_DIDNT_INIT - else - SEND_SIGNAL(A,COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE) - if(created_atoms && from_template && ispath(the_type, /atom/movable))//we only want to populate the list with movables - created_atoms += A.get_all_contents() - - return qdeleted || QDELING(A) +/// 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/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/clear_tracked_initalize() - initialized_changed -= 1 - if(!initialized_changed) - initialized = old_initialized +/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] /// Returns TRUE if anything is currently being initialized /datum/controller/subsystem/atoms/proc/initializing_something() - return initialized_changed > 0 + 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() @@ -238,3 +199,5 @@ SUBSYSTEM_DEF(atoms) var/initlog = InitLog() if(initlog) text2file(initlog, "[GLOB.log_directory]/initialize.log") + +#undef SUBSYSTEM_INIT_SOURCE diff --git a/code/controllers/subsystem/circuit_component.dm b/code/controllers/subsystem/circuit_component.dm index ceea6b7e44ef4..3ef1be5a3aa32 100644 --- a/code/controllers/subsystem/circuit_component.dm +++ b/code/controllers/subsystem/circuit_component.dm @@ -28,8 +28,6 @@ SUBSYSTEM_DEF(circuit_component) to_call.user = null to_call.InvokeAsync() - qdel(to_call) - if(MC_TICK_CHECK) return @@ -76,7 +74,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/communications.dm b/code/controllers/subsystem/communications.dm index 782810838c1bd..c727b17f0ef43 100644 --- a/code/controllers/subsystem/communications.dm +++ b/code/controllers/subsystem/communications.dm @@ -33,11 +33,14 @@ SUBSYSTEM_DEF(communications) if(!can_announce(user, is_silicon)) return FALSE if(is_silicon) - minor_announce(html_decode(input),"[user.name] Announces:", players = players) + minor_announce(html_decode(input),"[user.name] announces:", players = players) COOLDOWN_START(src, silicon_message_cooldown, COMMUNICATION_COOLDOWN_AI) else var/list/message_data = user.treat_message(input) - priority_announce(html_decode(message_data["message"]), null, 'sound/misc/announce.ogg', "[syndicate? "Syndicate " : ""]Captain", has_important_message = TRUE, players = players) + if(syndicate) + priority_announce(html_decode(message_data["message"]), null, 'sound/misc/announce_syndi.ogg', "Syndicate Captain", has_important_message = TRUE, players = players) + else + priority_announce(html_decode(message_data["message"]), null, 'sound/misc/announce.ogg', "Captain", has_important_message = TRUE, players = players) COOLDOWN_START(src, nonsilicon_message_cooldown, COMMUNICATION_COOLDOWN) user.log_talk(input, LOG_SAY, tag="priority announcement") message_admins("[ADMIN_LOOKUPFLW(user)] has made a priority announcement.") diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm index 909d72bb85e9a..58d75f4d406a1 100644 --- a/code/controllers/subsystem/dbcore.dm +++ b/code/controllers/subsystem/dbcore.dm @@ -34,6 +34,9 @@ SUBSYSTEM_DEF(dbcore) /// Queries pending execution, mapped to complete arguments var/list/datum/db_query/queries_standby = list() + /// We are in the process of shutting down and should not allow more DB connections + var/shutting_down = FALSE + var/connection // Arbitrary handle returned from rust_g. @@ -170,17 +173,28 @@ SUBSYSTEM_DEF(dbcore) connection = SSdbcore.connection /datum/controller/subsystem/dbcore/Shutdown() + shutting_down = TRUE + to_chat(world, span_boldannounce("Clearing DB queries standby:[length(queries_standby)] active: [length(queries_active)] all: [length(all_queries)]")) //This is as close as we can get to the true round end before Disconnect() without changing where it's called, defeating the reason this is a subsystem if(SSdbcore.Connect()) + //Execute all waiting queries for(var/datum/db_query/query in queries_standby) - run_query(query) + run_query_sync(query) + queries_standby -= query + for(var/datum/db_query/query in queries_active) + //Finish any remaining active qeries + UNTIL(query.process()) + queries_active -= query var/datum/db_query/query_round_shutdown = SSdbcore.NewQuery( "UPDATE [format_table_name("round")] SET shutdown_datetime = Now(), end_state = :end_state WHERE id = :round_id", - list("end_state" = SSticker.end_state, "round_id" = GLOB.round_id) + list("end_state" = SSticker.end_state, "round_id" = GLOB.round_id), + TRUE ) - query_round_shutdown.Execute() + query_round_shutdown.Execute(FALSE) qdel(query_round_shutdown) + + to_chat(world, span_boldannounce("Done clearing DB queries standby:[length(queries_standby)] active: [length(queries_active)] all: [length(all_queries)]")) if(IsConnected()) Disconnect() stop_db_daemon() @@ -333,7 +347,11 @@ SUBSYSTEM_DEF(dbcore) /datum/controller/subsystem/dbcore/proc/ReportError(error) last_error = error -/datum/controller/subsystem/dbcore/proc/NewQuery(sql_query, arguments) +/datum/controller/subsystem/dbcore/proc/NewQuery(sql_query, arguments, allow_during_shutdown=FALSE) + //If the subsystem is shutting down, disallow new queries + if(!allow_during_shutdown && shutting_down) + CRASH("Attempting to create a new db query during the world shutdown") + if(IsAdminAdvancedProcCall()) log_admin_private("ERROR: Advanced admin proc call led to sql query: [sql_query]. Query has been blocked") message_admins("ERROR: Advanced admin proc call led to sql query. Query has been blocked") @@ -460,11 +478,11 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table ASSERT(fexists(daemon), "Configured db_daemon doesn't exist") var/list/result = world.shelleo("echo \"Starting ezdb daemon, do not close this window\" && [daemon]") - var/error_code = result[1] - if (!error_code) + var/result_code = result[1] + if (!result_code || result_code == 1) return - stack_trace("Failed to start DB daemon: [error_code]\n[result[3]]") + stack_trace("Failed to start DB daemon: [result_code]\n[result[3]]") /datum/controller/subsystem/dbcore/proc/stop_db_daemon() set waitfor = FALSE @@ -590,12 +608,12 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table /datum/db_query/process(seconds_per_tick) if(status >= DB_QUERY_FINISHED) - return + return TRUE // we are done processing after all status = DB_QUERY_STARTED var/job_result = rustg_sql_check_query(job_id) if(job_result == RUSTG_JOB_NO_RESULTS_YET) - return + return FALSE //no results yet store_data(json_decode(job_result)) return TRUE diff --git a/code/controllers/subsystem/dcs.dm b/code/controllers/subsystem/dcs.dm index 8e305d95699b0..e130b6dc0ff8d 100644 --- a/code/controllers/subsystem/dcs.dm +++ b/code/controllers/subsystem/dcs.dm @@ -5,10 +5,34 @@ PROCESSING_SUBSYSTEM_DEF(dcs) var/list/elements_by_type = list() + /** + * A nested assoc list of bespoke element types (keys) and superlists containing all lists used as arguments (values). + * Inside the superlists, lists that've been sorted alphabetically are keys, while the original unsorted lists are values. + * + * e.g. list( + * /datum/element/first = list(list(A, B, C) = list(B, A, C), list(A, B) = list(A, B)), + * /datum/element/second = list(list(B, C) = list(C, B), list(D) = list(D)), + * ) + * + * Used by the dcs_check_list_arguments unit test. + */ + var/list/arguments_that_are_lists_by_element = list() + /** + * An assoc list of list instances and their sorted counterparts. + * + * e.g. list( + * list(B, A, C) = list(A, B, C), + * list(C, B) = list(B, C), + * ) + * + * Used to make sure each list instance is sorted no more than once, or the unit test won't work. + */ + var/list/sorted_arguments_that_are_lists = list() + /datum/controller/subsystem/processing/dcs/Recover() _listen_lookup = SSdcs._listen_lookup -/datum/controller/subsystem/processing/dcs/proc/GetElement(list/arguments) +/datum/controller/subsystem/processing/dcs/proc/GetElement(list/arguments, init_element = TRUE) var/datum/element/eletype = arguments[1] var/element_id = eletype @@ -16,10 +40,10 @@ PROCESSING_SUBSYSTEM_DEF(dcs) CRASH("Attempted to instantiate [eletype] as a /datum/element") if(initial(eletype.element_flags) & ELEMENT_BESPOKE) - element_id = GetIdFromArguments(arguments) + element_id = length(arguments) == 1 ? "[arguments[1]]" : GetIdFromArguments(arguments) . = elements_by_type[element_id] - if(.) + if(. || !init_element) return . = elements_by_type[element_id] = new eletype @@ -31,9 +55,8 @@ PROCESSING_SUBSYSTEM_DEF(dcs) **/ /datum/controller/subsystem/processing/dcs/proc/GetIdFromArguments(list/arguments) var/datum/element/eletype = arguments[1] - var/list/fullid = list("[eletype]") - var/list/named_arguments = list() - + var/list/fullid = list(eletype) + var/list/named_arguments for(var/i in initial(eletype.argument_hash_start_idx) to length(arguments)) var/key = arguments[i] @@ -43,18 +66,44 @@ PROCESSING_SUBSYSTEM_DEF(dcs) fullid += key else if (!istext(value) && !isnum(value)) + if(PERFORM_ALL_TESTS(dcs_check_list_arguments) && islist(value)) + add_to_arguments_that_are_lists(value, eletype) value = REF(value) - named_arguments[key] = value + if (!named_arguments) + named_arguments = list() + + named_arguments[key] = value continue if (isnum(key)) - fullid += "[key]" + fullid += key else + if(PERFORM_ALL_TESTS(dcs_check_list_arguments) && islist(key)) + add_to_arguments_that_are_lists(key, eletype) fullid += REF(key) - if(length(named_arguments)) + if(named_arguments) named_arguments = sortTim(named_arguments, GLOBAL_PROC_REF(cmp_text_asc)) fullid += named_arguments return list2params(fullid) + +/** + * Offloading the first half of the dcs_check_list_arguments here, which is populating the superlist + * with sublists that will be later compared with each other by the dcs_check_list_arguments unit test. + */ +/datum/controller/subsystem/processing/dcs/proc/add_to_arguments_that_are_lists(list/argument, datum/element/element_type) + if(initial(element_type.element_flags) & ELEMENT_NO_LIST_UNIT_TEST) + return + var/list/element_type_superlist = arguments_that_are_lists_by_element[element_type] + if(!element_type_superlist) + arguments_that_are_lists_by_element[element_type] = element_type_superlist = list() + + var/list/sorted_argument = argument + if(!(initial(element_type.element_flags) & ELEMENT_DONT_SORT_LIST_ARGS)) + sorted_argument = sorted_arguments_that_are_lists[argument] + if(!sorted_argument) + sorted_arguments_that_are_lists[argument] = sorted_argument = sortTim(argument.Copy(), GLOBAL_PROC_REF(cmp_embed_text_asc)) + + element_type_superlist[sorted_argument] = argument diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm index ba6d792ab5f1e..68fb43d7c2e2d 100644 --- a/code/controllers/subsystem/economy.dm +++ b/code/controllers/subsystem/economy.dm @@ -14,7 +14,7 @@ SUBSYSTEM_DEF(economy) ACCOUNT_SRV = ACCOUNT_SRV_NAME, ACCOUNT_CAR = ACCOUNT_CAR_NAME, ACCOUNT_SEC = ACCOUNT_SEC_NAME) - var/list/generated_accounts = list() + var/list/departmental_accounts = list() /** * Enables extra money charges for things that normally would be free, such as sleepers/cryo/beepsky. * Take care when enabling, as players will NOT respond well if the economy is set up for low cash flows. @@ -82,7 +82,7 @@ SUBSYSTEM_DEF(economy) return SS_INIT_SUCCESS /datum/controller/subsystem/economy/Recover() - generated_accounts = SSeconomy.generated_accounts + departmental_accounts = SSeconomy.departmental_accounts bank_accounts_by_id = SSeconomy.bank_accounts_by_id dep_cards = SSeconomy.dep_cards @@ -113,24 +113,6 @@ SUBSYSTEM_DEF(economy) return processing_part = ECON_PRICE_UPDATE_STEP - var/list/obj/machinery/vending/prices_to_update = list() - // Assoc list of "z level" -> if it's on the station - // Hack, is station z level is too expensive to do for each machine, I hate this place - var/list/station_z_status = list() - for(var/obj/machinery/vending/vending_lad in GLOB.machines) - if(istype(vending_lad, /obj/machinery/vending/custom)) - continue - var/vending_level = vending_lad.z - var/station_status = station_z_status["[vending_level]"] - if(station_status == null) - station_status = is_station_level(vending_level) - station_z_status["[vending_level]"] = station_status - if(!station_status) - continue - - prices_to_update += vending_lad - - cached_processing = prices_to_update station_target = max(round(temporary_total / max(bank_accounts_by_id.len * 2, 1)) + station_target_buffer, 1) if(processing_part == ECON_PRICE_UPDATE_STEP) @@ -140,11 +122,13 @@ SUBSYSTEM_DEF(economy) var/effective_mailcount = round(living_player_count()/(inflation_value - 0.5)) //More mail at low inflation, and vis versa. mail_waiting += clamp(effective_mailcount, 1, MAX_MAIL_PER_MINUTE * seconds_per_tick) + SSstock_market.news_string = "" + /** * Handy proc for obtaining a department's bank account, given the department ID, AKA the define assigned for what department they're under. */ /datum/controller/subsystem/economy/proc/get_dep_account(dep_id) - for(var/datum/bank_account/department/D in generated_accounts) + for(var/datum/bank_account/department/D in departmental_accounts) if(D.department_id == dep_id) return D @@ -182,19 +166,15 @@ SUBSYSTEM_DEF(economy) return TRUE /** - * Updates the prices of all station vendors with the inflation_value, increasing/decreasing costs across the station, and alerts the crew. - * - * Iterates over the machines list for vending machines, resets their regular and premium product prices (Not contraband), and sends a message to the newscaster network. + * Updates the the inflation_value, effecting newscaster alerts and the mail system. **/ /datum/controller/subsystem/economy/proc/price_update() - var/list/cached_processing = src.cached_processing - for(var/i in 1 to length(cached_processing)) - var/obj/machinery/vending/V = cached_processing[i] - V.reset_prices(V.product_records, V.coin_records) - if(MC_TICK_CHECK) - cached_processing.Cut(1, i + 1) - return FALSE - earning_report = "Sector Economic Report

Sector vendor prices is currently at [SSeconomy.inflation_value()*100]%.

The station spending power is currently [station_total] Credits, and the crew's targeted allowance is at [station_target] Credits.

That's all from the Nanotrasen Economist Division." + var/fluff_string = "" + if(!HAS_TRAIT(SSeconomy, TRAIT_MARKET_CRASHING)) + fluff_string = ", but company countermeasures protect YOU from being affected!" + else + fluff_string = ", and company countermeasures are failing to protect YOU from being affected. We're all doomed!" + earning_report = "Sector Economic Report

Sector vendor prices is currently at [SSeconomy.inflation_value()*100]%[fluff_string]

The station spending power is currently [station_total] Credits, and the crew's targeted allowance is at [station_target] Credits.

[SSstock_market.news_string] That's all from the Nanotrasen Economist Division." GLOB.news_network.submit_article(earning_report, "Station Earnings Report", "Station Announcements", null, update_alert = FALSE) return TRUE @@ -208,6 +188,8 @@ SUBSYSTEM_DEF(economy) /datum/controller/subsystem/economy/proc/inflation_value() if(!bank_accounts_by_id.len) return 1 + if(HAS_TRAIT(SSeconomy, TRAIT_MARKET_CRASHING)) + return inflation_value //early return instead of the actual check inflation_value = max(round(((station_total / bank_accounts_by_id.len) / station_target), 0.1), 1.0) return inflation_value @@ -223,11 +205,34 @@ SUBSYSTEM_DEF(economy) CRASH("Track purchases was missing an argument! (Account, Price, or Vendor.)") audit_log += list(list( - "account" = account.account_holder, + "account" = "[account.account_holder]", "cost" = price_to_use, - "vendor" = vendor, + "vendor" = "[vendor]", )) +/** + * Iterates over the machines list for vending machines, resets their regular and premium product prices (Not contraband), and sends a message to the newscaster network. + */ +/datum/controller/subsystem/economy/proc/update_vending_prices() + var/list/obj/machinery/vending/prices_to_update = list() + // Assoc list of "z level" -> if it's on the station + // Hack, is station z level is too expensive to do for each machine, I hate this place + var/list/station_z_status = list() + for(var/obj/machinery/vending/vending_lad as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/vending)) + if(istype(vending_lad, /obj/machinery/vending/custom)) + continue + var/vending_level = vending_lad.z + var/station_status = station_z_status["[vending_level]"] + if(station_status == null) + station_status = is_station_level(vending_level) + station_z_status["[vending_level]"] = station_status + if(!station_status) + continue + prices_to_update += vending_lad + for(var/i in 1 to length(prices_to_update)) + var/obj/machinery/vending/V = prices_to_update[i] + V.reset_prices(V.product_records, V.coin_records) + #undef ECON_DEPARTMENT_STEP #undef ECON_ACCOUNT_STEP #undef ECON_PRICE_UPDATE_STEP diff --git a/code/controllers/subsystem/explosions.dm b/code/controllers/subsystem/explosions.dm index 7934a9628c639..bd7d7942a3e87 100644 --- a/code/controllers/subsystem/explosions.dm +++ b/code/controllers/subsystem/explosions.dm @@ -25,7 +25,11 @@ SUBSYSTEM_DEF(explosions) var/list/highturf = list() var/list/flameturf = list() + /// List of turfs to throw the contents of var/list/throwturf = list() + /// List of turfs to throw the contents of... AFTER the next explosion processes + /// This avoids order of operations errors and shit + var/list/held_throwturf = list() var/list/low_mov_atom = list() var/list/med_mov_atom = list() @@ -34,7 +38,7 @@ SUBSYSTEM_DEF(explosions) // Track how many explosions have happened. var/explosion_index = 0 - var/currentpart = SSAIR_PIPENETS + var/currentpart = SSEXPLOSIONS_TURFS /datum/controller/subsystem/explosions/stat_entry(msg) @@ -63,12 +67,13 @@ SUBSYSTEM_DEF(explosions) msg += "HO:[high_mov_atom.len]|" msg += "TO:[throwturf.len]" + msg += "HTO:[held_throwturf.len]" msg += "} " return ..() /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) + return (lowturf.len || medturf.len || highturf.len || flameturf.len || throwturf.len || held_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 @@ -76,6 +81,7 @@ SUBSYSTEM_DEF(explosions) highturf -= T flameturf -= T throwturf -= T + held_throwturf -= T /client/proc/check_bomb_impacts() set name = "Check Bomb Impact" @@ -199,7 +205,7 @@ SUBSYSTEM_DEF(explosions) * - 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) +/proc/explosion(atom/origin, devastation_range = 0, heavy_impact_range = 0, light_impact_range = 0, flame_range = null, flash_range = null, adminlog = TRUE, ignorecap = FALSE, silent = FALSE, smoke = FALSE, atom/explosion_cause = null) . = SSexplosions.explode(arglist(args)) @@ -219,7 +225,7 @@ SUBSYSTEM_DEF(explosions) * - 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) +/datum/controller/subsystem/explosions/proc/explode(atom/origin, devastation_range = 0, heavy_impact_range = 0, light_impact_range = 0, flame_range = null, flash_range = null, adminlog = TRUE, ignorecap = FALSE, silent = FALSE, smoke = FALSE, atom/explosion_cause = null) var/list/arguments = list( EXARG_KEY_ORIGIN = origin, EXARG_KEY_DEV_RANGE = devastation_range, @@ -383,6 +389,7 @@ SUBSYSTEM_DEF(explosions) // we assert that turfs will be processed closed to farthest, so we can build this as we go along // This is gonna be an array, index'd by turfs var/list/cached_exp_block = list() + var/list/held_throwturf = src.held_throwturf //lists are guaranteed to contain at least 1 turf at this point //we presuppose that we'll be iterating away from the epicenter @@ -442,11 +449,11 @@ SUBSYSTEM_DEF(explosions) var/list/throwingturf = explode.explosion_throw_details if (throwingturf[1] < max_range - dist) throwingturf[1] = max_range - dist - throwingturf[2] = get_dir(epicenter, explode) + throwingturf[2] = epicenter throwingturf[3] = max_range else - explode.explosion_throw_details = list(max_range - dist, get_dir(epicenter, explode), max_range) - throwturf += explode + explode.explosion_throw_details = list(max_range - dist, epicenter, max_range) + held_throwturf += explode var/took = (REALTIMEOFDAY - started_at) / 10 @@ -685,6 +692,9 @@ SUBSYSTEM_DEF(explosions) EX_ACT(movable_thing, EXPLODE_LIGHT) cost_low_mov_atom = MC_AVERAGE(cost_low_mov_atom, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + /// Throwing only becomes acceptable after the explosions process, so we don't miss stuff that explosions GENERATE + throwturf = held_throwturf + held_throwturf = list() if (currentpart == SSEXPLOSIONS_THROWS) currentpart = SSEXPLOSIONS_TURFS @@ -700,14 +710,15 @@ SUBSYSTEM_DEF(explosions) if (length(details) != 3) continue var/throw_range = details[1] - var/throw_dir = details[2] + var/turf/center = details[2] var/max_range = details[3] for(var/atom/movable/A in explode) 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) + // We want to have our distance matter, but we do want to bias to a lot of throw, for the vibe + var/atom_throw_range = rand(throw_range, max_range) + max_range * 0.3 + var/turf/throw_at = get_ranged_target_turf_direct(A, center, atom_throw_range, 180) // Throw 180 degrees away from the explosion source 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)) diff --git a/code/controllers/subsystem/fluids.dm b/code/controllers/subsystem/fluids.dm index 821c1f6cb2ced..6b68ae717222a 100644 --- a/code/controllers/subsystem/fluids.dm +++ b/code/controllers/subsystem/fluids.dm @@ -20,8 +20,9 @@ SUBSYSTEM_DEF(fluids) name = "Fluid" wait = 0 // Will be autoset to whatever makes the most sense given the spread and effect waits. - flags = SS_BACKGROUND|SS_KEEP_TIMING + 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. @@ -34,8 +35,6 @@ SUBSYSTEM_DEF(fluids) var/spread_bucket_index /// The set of fluid nodes we are currently processing spreading for. var/list/currently_spreading - /// Whether the subsystem has resumed spreading fluid. - var/resumed_spreading // Fluid effect processing: /// The amount of time (in deciseconds) between effect processing ticks for each fluid node. @@ -48,8 +47,6 @@ SUBSYSTEM_DEF(fluids) var/effect_bucket_index /// The set of fluid nodes we are currently processing effects for. var/list/currently_processing - /// Whether the subsystem has resumed processing fluid effects. - var/resumed_effect_processing /datum/controller/subsystem/fluids/Initialize() initialize_waits() @@ -121,14 +118,15 @@ SUBSYSTEM_DEF(fluids) 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: - if(!resumed_spreading) + 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. - resumed_spreading = TRUE seconds_per_tick = spread_wait / (1 SECONDS) currentrun = currently_spreading @@ -143,15 +141,11 @@ SUBSYSTEM_DEF(fluids) if (MC_TICK_CHECK) break - if(!currentrun.len) - resumed_spreading = FALSE - MC_SPLIT_TICK // Start processing fluid effects: - if(!resumed_effect_processing) + 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() - resumed_effect_processing = TRUE seconds_per_tick = effect_wait / (1 SECONDS) cached_bucket_index = effect_bucket_index @@ -168,10 +162,6 @@ SUBSYSTEM_DEF(fluids) if (MC_TICK_CHECK) break - if(!currentrun.len) - resumed_effect_processing = FALSE - - /** * Queues a fluid node to spread later after one full carousel rotation. * diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index e79a836b8b3ff..88112f9322676 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -110,6 +110,8 @@ SUBSYSTEM_DEF(garbage) entry["Total Ignored Force"] = I.no_respect_force if (I.no_hint) entry["Total No Hint"] = I.no_hint + if(LAZYLEN(I.extra_details)) + entry["Deleted Metadata"] = I.extra_details log_qdel("", del_log) @@ -230,6 +232,9 @@ SUBSYSTEM_DEF(garbage) message = "[message] (ref count of [refcount(D)])" #endif 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 @@ -297,16 +302,19 @@ SUBSYSTEM_DEF(garbage) ++totaldels var/type = D.type var/refID = text_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]" @@ -317,14 +325,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 @@ -346,6 +354,7 @@ 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]" diff --git a/code/controllers/subsystem/id_access.dm b/code/controllers/subsystem/id_access.dm index 32cefe39c0c0e..38bf3b568a1f9 100644 --- a/code/controllers/subsystem/id_access.dm +++ b/code/controllers/subsystem/id_access.dm @@ -329,6 +329,7 @@ SUBSYSTEM_DEF(id_access) desc_by_access["[ACCESS_CENT_SPECOPS]"] = "Code Black" desc_by_access["[ACCESS_CENT_CAPTAIN]"] = "Code Gold" desc_by_access["[ACCESS_CENT_BAR]"] = "Code Scotch" + desc_by_access["[ACCESS_BIT_DEN]"] = "Bitrunner Den" /** * Returns the access bitflags associated with any given access level. diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 0618fe17708e2..dae7845ac9f3c 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -1,5 +1,3 @@ -#define VERY_LATE_ARRIVAL_TOAST_PROB 20 - SUBSYSTEM_DEF(job) name = "Jobs" init_order = INIT_ORDER_JOBS @@ -24,6 +22,9 @@ SUBSYSTEM_DEF(job) var/list/unassigned = list() //Players who need jobs var/initial_players_to_assign = 0 //used for checking against population caps + // Whether to run DivideOccupations pure so that there are no side-effects from calling it other than + // a player's assigned_role being set to some value. + var/run_divide_occupation_pure = FALSE var/list/prioritized_jobs = list() var/list/latejoin_trackers = list() @@ -67,24 +68,30 @@ SUBSYSTEM_DEF(job) /// Are we using the old job config system (txt) or the new job config system (TOML)? IF we are going to use the txt file, then we are in "legacy mode", and this will flip to TRUE. var/legacy_mode = FALSE + /// List of job config datum singletons. + var/list/job_config_datum_singletons = list() + /// This is just the message we prepen and put into all of the config files to ensure documentation. We use this in more than one place, so let's put it in the SS to make life a bit easier. var/config_documentation = "## This is the configuration file for the job system.\n## This will only be enabled when the config flag LOAD_JOBS_FROM_TXT is enabled.\n\ - ## We use a system of keys here that directly correlate to the job, just to ensure they don't desync if we choose to change the name of a job.\n## You are able to change (as of now) four different variables in this file.\n\ + ## We use a system of keys here that directly correlate to the job, just to ensure they don't desync if we choose to change the name of a job.\n## You are able to change (as of now) five different variables in this file.\n\ ## Total Positions are how many job slots you get in a shift, Spawn Positions are how many you get that load in at spawn. If you set this to -1, it is unrestricted.\n## Playtime Requirements is in minutes, and the job will unlock when a player reaches that amount of time.\n\ - ## However, that can be superseded by Required Account Age, which is a time in days that you need to have had an account on the server for.\n## As time goes on, more config options may be added to this file.\n\ + ## However, that can be superseded by Required Account Age, which is a time in days that you need to have had an account on the server for.\n\ + ## Also there is a required character age in years. It prevents player from joining as this job, if their character's age as is lower than required. Setting it to 0 means it is turned off for this job.\n\n\ + ## As time goes on, more config options may be added to this file.\n\ ## You can use the admin verb 'Generate Job Configuration' in-game to auto-regenerate this config as a downloadable file without having to manually edit this file if we add more jobs or more things you can edit here.\n\ ## It will always respect prior-existing values in the config, but will appropriately add more fields when they generate.\n## It's strongly advised you create your own version of this file rather than use the one provisioned on the codebase.\n\n\ ## The game will not read any line that is commented out with a '#', as to allow you to defer to codebase defaults.\n## If you want to override the codebase values, add the value and then uncomment that line by removing the # from the job key's name.\n\ - ## Ensure that the key is flush, do not introduce any whitespaces when you uncomment a key. For example:\n## \"# Total Positions\" should always be changed to \"Total Positions\", no additional spacing. \n\ + ## Ensure that the key is flush, do not introduce any whitespaces when you uncomment a key. For example:\n## \"# Total Positions\" should always be changed to \"Total Positions\", no additional spacing.\n\ ## Best of luck editing!\n" /datum/controller/subsystem/job/Initialize() setup_job_lists() + job_config_datum_singletons = generate_config_singletons() // we set this up here regardless in case someone wants to use the verb to generate the config file. if(!length(all_occupations)) SetupOccupations() if(CONFIG_GET(flag/load_jobs_from_txt)) load_jobs_from_config() - set_overflow_role(CONFIG_GET(string/overflow_job)) + set_overflow_role(CONFIG_GET(string/overflow_job)) // this must always go after load_jobs_from_config() due to how the legacy systems operate, this always takes precedent. return SS_INIT_SUCCESS @@ -98,6 +105,7 @@ SUBSYSTEM_DEF(job) new_overflow.allow_bureaucratic_error = FALSE new_overflow.spawn_positions = cap new_overflow.total_positions = cap + new_overflow.job_flags |= JOB_CANNOT_OPEN_SLOTS if(new_overflow.type == overflow_role) return @@ -105,6 +113,8 @@ SUBSYSTEM_DEF(job) old_overflow.allow_bureaucratic_error = initial(old_overflow.allow_bureaucratic_error) old_overflow.spawn_positions = initial(old_overflow.spawn_positions) old_overflow.total_positions = initial(old_overflow.total_positions) + if(!(initial(old_overflow.job_flags) & JOB_CANNOT_OPEN_SLOTS)) + old_overflow.job_flags &= ~JOB_CANNOT_OPEN_SLOTS overflow_role = new_overflow.type JobDebug("Overflow role set to : [new_overflow.type]") @@ -287,6 +297,10 @@ SUBSYSTEM_DEF(job) player.mind.special_role = null SetupOccupations() unassigned = list() + if(CONFIG_GET(flag/load_jobs_from_txt)) + // Any errors with the configs has already been said, we don't need to repeat them here. + load_jobs_from_config(silent = TRUE) + set_overflow_role(overflow_role) return @@ -354,11 +368,11 @@ 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(pure = FALSE, allow_all = FALSE) //Setup new player list and get the jobs list - JobDebug("Running DO") - - SEND_SIGNAL(src, COMSIG_OCCUPATIONS_DIVIDED) + JobDebug("Running DO, allow_all = [allow_all], pure = [pure]") + run_divide_occupation_pure = pure + SEND_SIGNAL(src, COMSIG_OCCUPATIONS_DIVIDED, pure, allow_all) //Get the players who are ready for(var/i in GLOB.new_player_list) @@ -426,8 +440,9 @@ SUBSYSTEM_DEF(job) // Loop through all unassigned players for(var/mob/dead/new_player/player in unassigned) - if(PopcapReached()) - RejectPlayer(player) + if(!allow_all) + if(PopcapReached()) + RejectPlayer(player) // Loop through all jobs for(var/datum/job/job in shuffledoccupations) // SHUFFLE ME BABY @@ -465,7 +480,7 @@ SUBSYSTEM_DEF(job) // 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) + HandleUnassigned(player, allow_all) JobDebug("DO, Ending handle unassigned.") JobDebug("DO, Handle unrejectable unassigned") @@ -475,21 +490,23 @@ SUBSYSTEM_DEF(job) if(!AssignRole(player, GetJobType(overflow_role))) //If everything is already filled, make them an assistant JobDebug("DO, Forced antagonist could not be assigned any random job or the overflow role. DivideOccupations failed.") JobDebug("---------------------------------------------------") + run_divide_occupation_pure = FALSE 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") JobDebug("All divide occupations tasks completed.") JobDebug("---------------------------------------------------") - + run_divide_occupation_pure = FALSE return TRUE //We couldn't find a job from prefs for this guy. -/datum/controller/subsystem/job/proc/HandleUnassigned(mob/dead/new_player/player) +/datum/controller/subsystem/job/proc/HandleUnassigned(mob/dead/new_player/player, allow_all = FALSE) var/jobless_role = player.client.prefs.read_preference(/datum/preference/choiced/jobless_role) - if(PopcapReached()) - RejectPlayer(player) - return + if(!allow_all) + if(PopcapReached()) + RejectPlayer(player) + return switch (jobless_role) if (BEOVERFLOW) @@ -524,9 +541,7 @@ SUBSYSTEM_DEF(job) SEND_SIGNAL(equipping, COMSIG_JOB_RECEIVED, job) equipping.mind?.set_assigned_role_with_greeting(job, player_client) - equipping.on_job_equipping(job) - job.announce_job(equipping) if(player_client?.holder) @@ -535,30 +550,8 @@ SUBSYSTEM_DEF(job) else handle_auto_deadmin_roles(player_client, job.title) - if(player_client) - to_chat(player_client, "As the [job.title] you answer directly to [job.supervisors]. Special circumstances may change this.") - - job.radio_help_message(equipping) - - if(player_client) - if(job.req_admin_notify) - to_chat(player_client, span_infoplain("You are playing a job that is important for Game Progression. \ - If you have to disconnect, please notify the admins via adminhelp.")) - if(CONFIG_GET(number/minimal_access_threshold)) - to_chat(player_client, span_boldnotice("As this station was initially staffed with a \ - [CONFIG_GET(flag/jobs_have_minimal_access) ? "full crew, only your job's necessities" : "skeleton crew, additional access may"] \ - have been added to your ID card.")) - - if(ishuman(equipping)) - var/mob/living/carbon/human/wageslave = equipping - wageslave.add_mob_memory(/datum/memory/key/account, remembered_id = wageslave.account_id) - - if(EMERGENCY_PAST_POINT_OF_NO_RETURN && prob(VERY_LATE_ARRIVAL_TOAST_PROB)) - equipping.equip_to_slot_or_del(new /obj/item/food/griddle_toast(equipping), ITEM_SLOT_MASK) - job.after_spawn(equipping, player_client) - /datum/controller/subsystem/job/proc/handle_auto_deadmin_roles(client/C, rank) if(!C?.holder) return TRUE @@ -604,204 +597,6 @@ SUBSYSTEM_DEF(job) else //We ran out of spare locker spawns! break -#define TOTAL_POSITIONS "Total Positions" -#define SPAWN_POSITIONS "Spawn Positions" -#define PLAYTIME_REQUIREMENTS "Playtime Requirements" -#define REQUIRED_ACCOUNT_AGE "Required Account Age" - -/// Called in jobs subsystem initialize if LOAD_JOBS_FROM_TXT config flag is set: reads jobconfig.toml (or if in legacy mode, jobs.txt) to set all of the datum's values to what the server operator wants. -/datum/controller/subsystem/job/proc/load_jobs_from_config() - var/toml_file = "[global.config.directory]/jobconfig.toml" - - if(!legacy_mode) // this flag is set during the setup of SSconfig, and all warnings were handled there. - var/job_config = rustg_read_toml_file(toml_file) - - for(var/datum/job/occupation as anything in joinable_occupations) - var/job_title = occupation.title - var/job_key = occupation.config_tag - if(!job_config[job_key]) // Job isn't listed, skip it. - message_admins(span_notice("[job_title] (with config key [job_key]) is missing from jobconfig.toml! Using codebase defaults.")) // List both job_title and job_key in case they de-sync over time. - continue - - // If the value is commented out, we assume that the server operate did not want to override the codebase default values, so we skip it. - var/default_positions = job_config[job_key][TOTAL_POSITIONS] - var/starting_positions = job_config[job_key][SPAWN_POSITIONS] - var/playtime_requirements = job_config[job_key][PLAYTIME_REQUIREMENTS] - var/required_account_age = job_config[job_key][REQUIRED_ACCOUNT_AGE] - - if(default_positions || default_positions == 0) // We need to account for jobs that were intentionally turned off via config too. - occupation.total_positions = default_positions - if(starting_positions || starting_positions == 0) - occupation.spawn_positions = starting_positions - if(playtime_requirements || playtime_requirements == 0) - occupation.exp_requirements = playtime_requirements - if(required_account_age || required_account_age == 0) - occupation.minimal_player_age = required_account_age - - return - - else // legacy mode, so just run the old parser. - var/jobsfile = file("[global.config.directory]/jobs.txt") - if(!fexists(jobsfile)) // sanity with a trace - stack_trace("Despite SSconfig setting SSjob.legacy_mode to TRUE, jobs.txt was not found in the config directory! Something has gone terribly wrong!") - return - var/jobstext = file2text(jobsfile) - for(var/datum/job/occupation as anything in joinable_occupations) - var/regex/parser = new("[occupation.title]=(-1|\\d+),(-1|\\d+)") - parser.Find(jobstext) - occupation.total_positions = text2num(parser.group[1]) - occupation.spawn_positions = text2num(parser.group[2]) - -/// Called from an admin debug verb that generates the jobconfig.toml file and then allows the end user to download it to their machine. Returns TRUE if a file is successfully generated, FALSE otherwise. -/datum/controller/subsystem/job/proc/generate_config(mob/user) - var/toml_file = "[global.config.directory]/jobconfig.toml" - var/jobstext = "[global.config.directory]/jobs.txt" - var/list/file_data = list() - config_documentation = initial(config_documentation) // Reset to default juuuuust in case. - - if(fexists(file(toml_file))) - to_chat(src, span_notice("Generating new jobconfig.toml, pulling from the old config settings.")) - if(!regenerate_job_config(user)) - return FALSE - return TRUE - - if(fexists(file(jobstext))) // Generate the new TOML format, migrating from the text format. - to_chat(user, span_notice("Found jobs.txt in config directory! Generating jobconfig.toml from it.")) - jobstext = file2text(file(jobstext)) // walter i'm dying (get the file from the string, then parse it into a larger text string) - config_documentation += "\n\n## This TOML was migrated from jobs.txt. All variables are COMMENTED and will not load by default! Please verify to ensure that they are correct, and uncomment the key as you want, comparing it to the old config.\n\n" // small warning - for(var/datum/job/occupation as anything in joinable_occupations) - var/job_key = occupation.config_tag - var/regex/parser = new("[occupation.title]=(-1|\\d+),(-1|\\d+)") // TXT system used the occupation's name, we convert it to the new config_key system here. - parser.Find(jobstext) - - var/default_positions = text2num(parser.group[1]) - var/starting_positions = text2num(parser.group[2]) - - // Playtime Requirements and Required Account Age are new and we want to see it migrated, so we will just pull codebase defaults for them. - // Remember, every time we write the TOML from scratch, we want to have it commented out by default to ensure that the server operator is knows that they codebase defaults when they remove the comment. - file_data["[job_key]"] = list( - "# [PLAYTIME_REQUIREMENTS]" = occupation.exp_requirements, - "# [REQUIRED_ACCOUNT_AGE]" = occupation.minimal_player_age, - "# [TOTAL_POSITIONS]" = default_positions, - "# [SPAWN_POSITIONS]" = starting_positions, - ) - - if(!export_toml(user, file_data)) - return FALSE - return TRUE - - else // Generate the new TOML format, using codebase defaults. - to_chat(user, span_notice("Generating new jobconfig.toml, using codebase defaults.")) - for(var/datum/job/occupation as anything in joinable_occupations) - var/job_key = occupation.config_tag - // Remember, every time we write the TOML from scratch, we want to have it commented out by default to ensure that the server operator is knows that they override codebase defaults when they remove the comment. - // Having comments mean that we allow server operators to defer to codebase standards when they deem acceptable. They must uncomment to override the codebase default. - if(is_assistant_job(occupation)) // there's a concession made in jobs.txt that we should just rapidly account for here I KNOW I KNOW. - file_data["[job_key]"] = list( - "# [TOTAL_POSITIONS]" = -1, - "# [SPAWN_POSITIONS]" = -1, - "# [PLAYTIME_REQUIREMENTS]" = occupation.exp_requirements, - "# [REQUIRED_ACCOUNT_AGE]" = occupation.minimal_player_age, - ) - continue - // Generate new config from codebase defaults. - file_data["[job_key]"] = list( - "# [TOTAL_POSITIONS]" = occupation.total_positions, - "# [SPAWN_POSITIONS]" = occupation.spawn_positions, - "# [PLAYTIME_REQUIREMENTS]" = occupation.exp_requirements, - "# [REQUIRED_ACCOUNT_AGE]" = occupation.minimal_player_age, - ) - if(!export_toml(user, file_data)) - return FALSE - return TRUE - -/// If we add a new job or more fields to config a job with, quickly spin up a brand new config that inherits all of your old settings, but adds the new job with codebase defaults. Returns TRUE if a file is successfully generated, FALSE otherwise. -/datum/controller/subsystem/job/proc/regenerate_job_config(mob/user) - var/toml_file = "[global.config.directory]/jobconfig.toml" - var/list/file_data = list() - - if(!fexists(file(toml_file))) // You need an existing (valid) TOML for this to work. Sanity check if someone calls this directly instead of through 'Generate Job Configuration' verb. - to_chat(user, span_notice("No jobconfig.toml found in the config folder! If this is not expected, please notify a server operator or coders. You may need to generate a new config file by running 'Generate Job Configuration' from the Server tab.")) - return FALSE - - var/job_config = rustg_read_toml_file(toml_file) - for(var/datum/job/occupation as anything in joinable_occupations) - var/job_name = occupation.title - var/job_key = occupation.config_tag - - // When we regenerate, we want to make sure commented stuff stays commented, but we also want to migrate information that remains uncommented. So, let's make sure we keep that pattern. - if(job_config["[job_key]"]) // Let's see if any data for this job exists. - var/default_positions = job_config[job_key][TOTAL_POSITIONS] - var/starting_positions = job_config[job_key][SPAWN_POSITIONS] - var/playtime_requirements = job_config[job_key][PLAYTIME_REQUIREMENTS] - var/required_account_age = job_config[job_key][REQUIRED_ACCOUNT_AGE] - - if(file_data["[job_key]"]) // Sanity, let's just make sure we don't overwrite anything or add any dupe keys. We also unit test for this, but eh, you never know sometimes. - stack_trace("We were about to over-write a job key that already exists in file_data while generating a new jobconfig.toml! This should not happen! Verify you do not have any duplicate job keys in your codebase!") - continue - if(default_positions) // If the variable exists, we want to ensure it migrated into the new TOML uncommented, to allow for flush migration. - file_data["[job_key]"] += list( - TOTAL_POSITIONS = default_positions, - ) - else // If we can't find anything for this variable, then we just throw in the codebase default with it commented out. - file_data["[job_key]"] += list( - "# [TOTAL_POSITIONS]" = occupation.total_positions, - ) - - if(starting_positions) // Same pattern as above. - file_data["[job_key]"] += list( - SPAWN_POSITIONS = starting_positions, - ) - else - file_data["[job_key]"] += list( - "# [SPAWN_POSITIONS]" = occupation.spawn_positions, - ) - - if(playtime_requirements) // Same pattern as above. - file_data["[job_key]"] += list( - PLAYTIME_REQUIREMENTS = playtime_requirements, - ) - else - file_data["[job_key]"] += list( - "# [PLAYTIME_REQUIREMENTS]" = occupation.exp_requirements, - ) - - if(required_account_age) // Same pattern as above. - file_data["[job_key]"] += list( - REQUIRED_ACCOUNT_AGE = required_account_age, - ) - else - file_data["[job_key]"] += list( - "# [REQUIRED_ACCOUNT_AGE]" = occupation.minimal_player_age, - ) - continue - else - to_chat(user, span_notice("New job [job_name] (using key [job_key]) detected! Adding to jobconfig.toml using default codebase values...")) - // Commented out keys here in case server operators wish to defer to codebase defaults. - file_data["[job_key]"] = list( - "# [TOTAL_POSITIONS]" = occupation.total_positions, - "# [SPAWN_POSITIONS]" = occupation.spawn_positions, - "# [PLAYTIME_REQUIREMENTS]" = occupation.exp_requirements, - "# [REQUIRED_ACCOUNT_AGE]" = occupation.minimal_player_age, - ) - - if(!export_toml(user, file_data)) - return FALSE - return TRUE - -/// Proc that we call to generate a new jobconfig.toml file and send it to the requesting client. Returns TRUE if a file is successfully generated. -/datum/controller/subsystem/job/proc/export_toml(mob/user, data) - var/file_location = "data/jobconfig.toml" // store it in the data folder server-side so we can FTP it to the client. - var/payload = "[config_documentation]\n[rustg_toml_encode(data)]" - rustg_file_write(payload, file_location) - DIRECT_OUTPUT(user, ftp(file(file_location), "jobconfig.toml")) - return TRUE - -#undef TOTAL_POSITIONS -#undef SPAWN_POSITIONS -#undef PLAYTIME_REQUIREMENTS -#undef REQUIRED_ACCOUNT_AGE - /datum/controller/subsystem/job/proc/HandleFeedbackGathering() for(var/datum/job/job as anything in joinable_occupations) var/high = 0 //high @@ -854,9 +649,10 @@ SUBSYSTEM_DEF(job) if(PopcapReached()) JobDebug("Popcap overflow Check observer located, Player: [player]") JobDebug("Player rejected :[player]") - to_chat(player, "You have failed to qualify for any job you desired.") unassigned -= player - player.ready = PLAYER_NOT_READY + if(!run_divide_occupation_pure) + to_chat(player, "You have failed to qualify for any job you desired.") + player.ready = PLAYER_NOT_READY /datum/controller/subsystem/job/Recover() @@ -1017,7 +813,7 @@ SUBSYSTEM_DEF(job) LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS ) - var/where = new_captain.equip_in_one_of_slots(paper, slots, FALSE) || "at your feet" + var/where = new_captain.equip_in_one_of_slots(paper, slots, FALSE, indirect_action = TRUE) || "at your feet" if(acting_captain) to_chat(new_captain, span_notice("Due to your position in the chain of command, you have been promoted to Acting Captain. You can find in important note about this [where].")) @@ -1089,6 +885,11 @@ SUBSYSTEM_DEF(job) JobDebug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_BANNED, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") return JOB_UNAVAILABLE_BANNED + // Check for character age + if(possible_job.required_character_age > player.client.prefs.read_preference(/datum/preference/numeric/age) && possible_job.required_character_age != null) + JobDebug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_AGE)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") + return JOB_UNAVAILABLE_AGE + // Need to recheck the player exists after is_banned_from since it can query the DB which may sleep. if(QDELETED(player)) JobDebug("[debug_prefix] player is qdeleted, Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") @@ -1096,4 +897,25 @@ SUBSYSTEM_DEF(job) return JOB_AVAILABLE -#undef VERY_LATE_ARRIVAL_TOAST_PROB +/** + * Check if the station manifest has at least a certain amount of this staff type. + * If a matching head of staff is on the manifest, automatically passes (returns TRUE) + * + * Arguments: + * * crew_threshold - amount of crew to meet the requirement + * * jobs - a list of jobs that qualify the requirement + * * head_jobs - a list of head jobs that qualify the requirement + * +*/ +/datum/controller/subsystem/job/proc/has_minimum_jobs(crew_threshold, list/jobs = list(), list/head_jobs = list()) + var/employees = 0 + for(var/datum/record/crew/target in GLOB.manifest.general) + if(target.trim in head_jobs) + return TRUE + if(target.trim in jobs) + employees++ + + if(employees > crew_threshold) + return TRUE + + return FALSE diff --git a/code/controllers/subsystem/language.dm b/code/controllers/subsystem/language.dm index c13711db364d7..88e92e2f93c5f 100644 --- a/code/controllers/subsystem/language.dm +++ b/code/controllers/subsystem/language.dm @@ -4,15 +4,14 @@ SUBSYSTEM_DEF(language) flags = SS_NO_FIRE /datum/controller/subsystem/language/Initialize() - for(var/L in subtypesof(/datum/language)) - var/datum/language/language = L + for(var/datum/language/language as anything in subtypesof(/datum/language)) if(!initial(language.key)) continue GLOB.all_languages += language + GLOB.language_types_by_name[initial(language.name)] = language var/datum/language/instance = new language - GLOB.language_datum_instances[language] = instance return SS_INIT_SUCCESS diff --git a/code/controllers/subsystem/lua.dm b/code/controllers/subsystem/lua.dm index d8fb642c1c986..641416b72439e 100644 --- a/code/controllers/subsystem/lua.dm +++ b/code/controllers/subsystem/lua.dm @@ -18,7 +18,8 @@ SUBSYSTEM_DEF(lua) var/list/current_run = list() /// Protects return values from getting GCed before getting converted to lua values - var/gc_guard + /// Gets cleared every tick. + var/list/gc_guard = list() /datum/controller/subsystem/lua/Initialize() if(!CONFIG_GET(flag/auxtools_enabled)) @@ -99,6 +100,7 @@ SUBSYSTEM_DEF(lua) sleeps.Cut() resumes.Cut() + gc_guard.Cut() var/list/current_sleeps = current_run["sleeps"] var/list/affected_states = list() while(length(current_sleeps)) diff --git a/code/controllers/subsystem/machines.dm b/code/controllers/subsystem/machines.dm index 51578de0c3476..8a0b17f195bc4 100644 --- a/code/controllers/subsystem/machines.dm +++ b/code/controllers/subsystem/machines.dm @@ -3,6 +3,13 @@ SUBSYSTEM_DEF(machines) init_order = INIT_ORDER_MACHINES flags = SS_KEEP_TIMING wait = 2 SECONDS + + /// Assosciative list of all machines that exist. + VAR_PRIVATE/list/machines_by_type = list() + + /// All machines, not just those that are processing. + VAR_PRIVATE/list/all_machines = list() + var/list/processing = list() var/list/currentrun = list() ///List of all powernets on the server. @@ -13,6 +20,46 @@ SUBSYSTEM_DEF(machines) fire() return SS_INIT_SUCCESS +/// Registers a machine with the machine subsystem; should only be called by the machine itself during its creation. +/datum/controller/subsystem/machines/proc/register_machine(obj/machinery/machine) + LAZYADD(machines_by_type[machine.type], machine) + all_machines |= machine + +/// Removes a machine from the machine subsystem; should only be called by the machine itself inside Destroy. +/datum/controller/subsystem/machines/proc/unregister_machine(obj/machinery/machine) + var/list/existing = machines_by_type[machine.type] + existing -= machine + if(!length(existing)) + machines_by_type -= machine.type + all_machines -= machine + +/// Gets a list of all machines that are either the passed type or a subtype. +/datum/controller/subsystem/machines/proc/get_machines_by_type_and_subtypes(obj/machinery/machine_type) + if(!ispath(machine_type)) + machine_type = machine_type.type + if(!ispath(machine_type, /obj/machinery)) + CRASH("called get_machines_by_type_and_subtypes with a non-machine type [machine_type]") + var/list/machines = list() + for(var/next_type in typesof(machine_type)) + var/list/found_machines = machines_by_type[next_type] + if(found_machines) + machines += found_machines + return machines + + +/// Gets a list of all machines that are the exact passed type. +/datum/controller/subsystem/machines/proc/get_machines_by_type(obj/machinery/machine_type) + if(!ispath(machine_type)) + machine_type = machine_type.type + if(!ispath(machine_type, /obj/machinery)) + CRASH("called get_machines_by_type with a non-machine type [machine_type]") + + var/list/machines = machines_by_type[machine_type] + return machines?.Copy() || list() + +/datum/controller/subsystem/machines/proc/get_all_machines() + return all_machines.Copy() + /datum/controller/subsystem/machines/proc/makepowernets() for(var/datum/powernet/power_network as anything in powernets) qdel(power_network) @@ -25,7 +72,7 @@ SUBSYSTEM_DEF(machines) propagate_network(power_cable, power_cable.powernet) /datum/controller/subsystem/machines/stat_entry(msg) - msg = "M:[length(processing)]|PN:[length(powernets)]" + msg = "M:[length(all_machines)]|MT:[length(machines_by_type)]|PM:[length(processing)]|PN:[length(powernets)]" return ..() /datum/controller/subsystem/machines/fire(resumed = FALSE) @@ -56,7 +103,11 @@ SUBSYSTEM_DEF(machines) propagate_network(PC,PC.powernet) /datum/controller/subsystem/machines/Recover() - if (istype(SSmachines.processing)) + if(islist(SSmachines.processing)) processing = SSmachines.processing - if (istype(SSmachines.powernets)) + if(islist(SSmachines.powernets)) powernets = SSmachines.powernets + if(islist(SSmachines.all_machines)) + all_machines = SSmachines.all_machines + if(islist(SSmachines.machines_by_type)) + machines_by_type = SSmachines.machines_by_type diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 6781167437034..66acc72aa8f15 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -33,6 +33,9 @@ SUBSYSTEM_DEF(mapping) /// List of z level (as number) -> plane offset of that z level /// Used to maintain the plane cube var/list/z_level_to_plane_offset = list() + /// List of z level (as number) -> list of all z levels vertically connected to ours + /// Useful for fast grouping lookups and such + var/list/z_level_to_stack = list() /// List of z level (as number) -> The lowest plane offset in that z stack var/list/z_level_to_lowest_plane_offset = list() // This pair allows for easy conversion between an offset plane, and its true representation @@ -104,7 +107,7 @@ SUBSYSTEM_DEF(mapping) var/old_config = config config = global.config.defaultmap if(!config || config.defaulted) - to_chat(world, span_boldannounce("Unable to load next or default map config, defaulting to Meta Station.")) + to_chat(world, span_boldannounce("Unable to load next or default map config, defaulting to MetaStation.")) config = old_config plane_offset_to_true = list() true_to_offset_planes = list() @@ -141,15 +144,20 @@ SUBSYSTEM_DEF(mapping) if(CONFIG_GET(flag/roundstart_away)) createRandomZlevel(prob(CONFIG_GET(number/config_gateway_chance))) + else if (SSmapping.config.load_all_away_missions) // we're likely in a local testing environment, so punch it. + load_all_away_missions() + loading_ruins = TRUE setup_ruins() loading_ruins = FALSE #endif // Run map generation after ruin generation to prevent issues - run_map_generation() + run_map_terrain_generation() // Generate our rivers, we do this here so the map doesn't load on top of them setup_rivers() + // now that the terrain is generated, including rivers, we can safely populate it with objects and mobs + run_map_terrain_population() // Add the first transit level var/datum/space_level/base_transit = add_reservation_zlevel() require_area_resort() @@ -182,7 +190,7 @@ SUBSYSTEM_DEF(mapping) unused_turfs["[T.z]"] |= T var/area/old_area = T.loc old_area.turfs_to_uncontain += T - T.flags_1 |= UNUSED_RESERVATION_TURF + T.turf_flags = UNUSED_RESERVATION_TURF world_contents += T world_turf_contents += T packet.len-- @@ -206,13 +214,13 @@ SUBSYSTEM_DEF(mapping) if(multiz_levels.len < z_level) multiz_levels.len = z_level - var/linked_down = level_trait(z_level, ZTRAIT_DOWN) - var/linked_up = level_trait(z_level, ZTRAIT_UP) - multiz_levels[z_level] = list() - if(linked_down) - multiz_levels[z_level]["[DOWN]"] = TRUE - if(linked_up) - multiz_levels[z_level]["[UP]"] = TRUE + var/z_above = level_trait(z_level, ZTRAIT_UP) + var/z_below = level_trait(z_level, ZTRAIT_DOWN) + if(!(z_above == TRUE || z_above == FALSE || z_above == null) || !(z_below == TRUE || z_below == FALSE || z_below == null)) + stack_trace("Warning, numeric mapping offsets are deprecated. Instead, mark z level connections by setting UP/DOWN to true if the connection is allowed") + multiz_levels[z_level] = new /list(LARGEST_Z_LEVEL_INDEX) + multiz_levels[z_level][Z_LEVEL_UP] = !!z_above + multiz_levels[z_level][Z_LEVEL_DOWN] = !!z_below /datum/controller/subsystem/mapping/proc/calculate_z_level_gravity(z_level_number) if(!isnum(z_level_number) || z_level_number < 1) @@ -242,7 +250,7 @@ SUBSYSTEM_DEF(mapping) 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), themed_ruins[ZTRAIT_ICE_RUINS], clear_below = TRUE) + seedRuins(ice_ruins, CONFIG_GET(number/icemoon_budget), list(/area/icemoon/surface/outdoors/unexplored, /area/icemoon/underground/unexplored), themed_ruins[ZTRAIT_ICE_RUINS], clear_below = TRUE) var/list/ice_ruins_underground = levels_by_trait(ZTRAIT_ICE_RUINS_UNDERGROUND) if (ice_ruins_underground.len) @@ -265,7 +273,8 @@ SUBSYSTEM_DEF(mapping) var/list/ice_ruins = levels_by_trait(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/river_type = HAS_TRAIT(SSstation, STATION_TRAIT_FORESTED) ? /turf/open/lava/plasma/ice_moon : /turf/open/openspace/icemoon + spawn_rivers(ice_z, 4, river_type, /area/icemoon/surface/outdoors/unexplored/rivers) var/list/ice_ruins_underground = levels_by_trait(ZTRAIT_ICE_RUINS_UNDERGROUND) for (var/ice_z in ice_ruins_underground) @@ -300,6 +309,10 @@ SUBSYSTEM_DEF(mapping) returning += M qdel(T, TRUE) +/datum/controller/subsystem/mapping/proc/get_reservation_from_turf(turf/T) + RETURN_TYPE(/datum/turf_reservation) + return used_turfs[T] + /* Nuke threats, for making the blue tiles on the station go RED Used by the AI doomsday and the self-destruct nuke. */ @@ -466,9 +479,15 @@ GLOBAL_LIST_EMPTY(the_station_areas) if(!GLOB.the_station_areas.len) log_world("ERROR: Station areas list failed to generate!") -/datum/controller/subsystem/mapping/proc/run_map_generation() +/// Generate the turfs of the area +/datum/controller/subsystem/mapping/proc/run_map_terrain_generation() + for(var/area/A as anything in GLOB.areas) + A.RunTerrainGeneration() + +/// Populate the turfs of the area +/datum/controller/subsystem/mapping/proc/run_map_terrain_population() for(var/area/A as anything in GLOB.areas) - A.RunGeneration() + A.RunTerrainPopulation() /datum/controller/subsystem/mapping/proc/maprotate() if(map_voted || SSmapping.next_map_config) //If voted or set by other means. @@ -672,26 +691,34 @@ GLOBAL_LIST_EMPTY(the_station_areas) 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 - if(turf_type_override) +/// Requests a /datum/turf_reservation based on the given width, height, and z_size. You can specify a z_reservation to use a specific z level, or leave it null to use any z level. +/datum/controller/subsystem/mapping/proc/request_turf_block_reservation( + width, + height, + z_size = 1, + z_reservation = null, + reservation_type = /datum/turf_reservation, + turf_type_override = null, +) + UNTIL((!z_reservation || reservation_ready["[z_reservation]"]) && !clearing_reserved_turfs) + var/datum/turf_reservation/reserve = new reservation_type + if(!isnull(turf_type_override)) reserve.turf_type = turf_type_override - if(!z) + if(!z_reservation) for(var/i in levels_by_trait(ZTRAIT_RESERVED)) - if(reserve.Reserve(width, height, i)) + if(reserve.reserve(width, height, z_size, 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 var/datum/space_level/newReserved = add_reservation_zlevel() initialize_reserved_level(newReserved.z_value) - if(reserve.Reserve(width, height, newReserved.z_value)) + if(reserve.reserve(width, height, z_size, newReserved.z_value)) return reserve else - if(!level_trait(z, ZTRAIT_RESERVED)) + if(!level_trait(z_reservation, ZTRAIT_RESERVED)) qdel(reserve) return else - if(reserve.Reserve(width, height, z)) + if(reserve.reserve(width, height, z_size, z_reservation)) return reserve QDEL_NULL(reserve) @@ -709,7 +736,7 @@ GLOBAL_LIST_EMPTY(the_station_areas) var/block = block(A, B) 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 + T.turf_flags = UNUSED_RESERVATION_TURF CHECK_TICK // Gotta create these suckers if we've not done so already @@ -773,8 +800,11 @@ GLOBAL_LIST_EMPTY(the_station_areas) // We are guarenteed that we'll always grow bottom up // Suck it jannies z_level_to_plane_offset.len += 1 - z_level_to_lowest_plane_offset += 1 + z_level_to_lowest_plane_offset.len += 1 gravity_by_z_level.len += 1 + z_level_to_stack.len += 1 + // Bare minimum we have ourselves + z_level_to_stack[z_value] = list(z_value) // 0's the default value, we'll update it later if required z_level_to_plane_offset[z_value] = 0 z_level_to_lowest_plane_offset[z_value] = 0 @@ -806,24 +836,25 @@ GLOBAL_LIST_EMPTY(the_station_areas) /datum/controller/subsystem/mapping/proc/update_plane_tracking(datum/space_level/update_with) // We're essentially going to walk down the stack of connected z levels, and set their plane offset as we go - // Yes this will cause infinite loops if our templating is fucked. Fuck off - var/below_offset = 0 - // I'm sorry, it needs to start at 0 - var/current_level = -1 - var/current_z = update_with.z_value + var/plane_offset = 0 + var/datum/space_level/current_z = update_with var/list/datum/space_level/levels_checked = list() - do - current_level += 1 - current_z += below_offset - z_level_to_plane_offset[current_z] = current_level - var/datum/space_level/next_level = z_list[current_z] - below_offset = next_level.traits[ZTRAIT_DOWN] - levels_checked += next_level - while(below_offset) + var/list/z_stack = list() + while(TRUE) + var/z_level = current_z.z_value + z_stack += z_level + z_level_to_plane_offset[z_level] = plane_offset + levels_checked += current_z + if(!current_z.traits[ZTRAIT_DOWN]) // If there's nothing below, stop looking + break + // Otherwise, down down down we go + current_z = z_list[z_level - 1] + plane_offset += 1 /// Updates the lowest offset value for(var/datum/space_level/level_to_update in levels_checked) - z_level_to_lowest_plane_offset[level_to_update.z_value] = current_level + z_level_to_lowest_plane_offset[level_to_update.z_value] = plane_offset + z_level_to_stack[level_to_update.z_value] = z_stack // This can be affected by offsets, so we need to update it // PAIN @@ -831,7 +862,7 @@ GLOBAL_LIST_EMPTY(the_station_areas) generate_lighting_appearance_by_z(i) var/old_max = max_plane_offset - max_plane_offset = max(max_plane_offset, current_level) + max_plane_offset = max(max_plane_offset, plane_offset) if(max_plane_offset == old_max) return @@ -882,6 +913,13 @@ GLOBAL_LIST_EMPTY(the_station_areas) true_to_offset_planes[string_real] |= offset_plane +/// Takes a turf or a z level, and returns a list of all the z levels that are connected to it +/datum/controller/subsystem/mapping/proc/get_connected_levels(turf/connected) + var/z_level = connected + if(isturf(z_level)) + z_level = connected.z + return z_level_to_stack[z_level] + /datum/controller/subsystem/mapping/proc/lazy_load_template(template_key, force = FALSE) RETURN_TYPE(/datum/turf_reservation) @@ -915,3 +953,77 @@ GLOBAL_LIST_EMPTY(the_station_areas) /// Returns true if the map we're playing on is on a planet /datum/controller/subsystem/mapping/proc/is_planetary() return config.planetary + +/// For debug purposes, will add every single away mission present in a given directory. +/// You can optionally pass in a string directory to load from instead of the default. +/datum/controller/subsystem/mapping/proc/load_all_away_missions(map_directory) + if(!map_directory) + map_directory = "_maps/RandomZLevels/" + var/start_time = null // in case we're doing this at runtime, useful to know how much time we're spending loading all these away missions + var/confirmation_alert_result = null + var/new_wait = 0 // default to always zeroing out the wait time for away missions to be unlocked due to the unit-testery nature of this map + + if(IsAdminAdvancedProcCall()) + if(!check_rights(R_DEBUG)) + return + var/confirmation_string = "This will load every single away mission in the [map_directory] directory. This might cause a bit of lag that can only be cleared on a world restart. Are you sure you want to do this?" + confirmation_alert_result = tgui_alert(usr, confirmation_string, "DEBUG ONLY!!!", list("Yes", "Cancel")) + if(confirmation_alert_result != "Yes") + return + + var/current_wait_time = CONFIG_GET(number/gateway_delay) + switch(tgui_alert(usr, "Do you want to zero out the cooldown for access to these maps? Currently [DisplayTimeText(current_wait_time)]", "OH FUCK!!!", list("Yes", "No", "Cancel"))) + if("No") + new_wait = current_wait_time + if("Cancel") + return + + else + start_time = REALTIMEOFDAY + var/beginning_message = "Loading all away missions..." + to_chat(world, span_boldannounce(beginning_message)) + log_world(beginning_message) + log_mapping(beginning_message) + + var/list/all_away_missions = generate_map_list_from_directory(map_directory) + var/number_of_away_missions = length(all_away_missions) + for(var/entry in all_away_missions) + load_new_z_level(entry, entry, secret = FALSE) // entry in both fields so we know if something failed to load since it'll log the full file name of what was loaded. + + for(var/datum/gateway_destination/away_datum in GLOB.gateway_destinations) + away_datum.wait = new_wait + log_mapping("Now loading [away_datum.name]...") + + validate_z_level_loading(all_away_missions) + + if(!isnull(start_time)) + var/tracked_time = (REALTIMEOFDAY - start_time) / 10 + var/finished_message = "Loaded [number_of_away_missions] away missions in [tracked_time] second[tracked_time == 1 ? "" : "s"]!" + to_chat(world, span_boldannounce(finished_message)) + log_world(finished_message) + log_mapping(finished_message) + + if(isnull(confirmation_alert_result)) + log_mapping("All away missions have been loaded. List of away missions paired to corresponding Z-Levels are as follows:") + log_mapping(gather_z_level_information()) + return + + message_admins("[key_name_admin(usr)] has loaded every single away mission in the [map_directory] directory. [ADMIN_SEE_ZLEVEL_LAYOUT]") + log_game("[key_name(usr)] has loaded every single away mission in the [map_directory] directory.") + +/// Lightweight proc that just checks to make sure that all of the expected z-levels were loaded. Split out for clarity from load_all_away_missions() +/// Argument "checkable_levels" is just a list of the names (typically the filepaths) of the z-levels we were expected to load, which should correspond to the name on the space level datum. +/datum/controller/subsystem/mapping/proc/validate_z_level_loading(list/checkable_levels) + for(var/z in 1 to max(world.maxz, length(z_list))) + var/datum/space_level/level = z_list[z] + if(isnull(level)) + continue + + var/level_name = level.name + if(level_name in checkable_levels) + checkable_levels -= level_name + continue + + var/number_of_remaining_levels = length(checkable_levels) + if(number_of_remaining_levels > 0) + CRASH("The following [number_of_remaining_levels] away mission(s) were not loaded: [checkable_levels.Join("\n")]") diff --git a/code/controllers/subsystem/minor_mapping.dm b/code/controllers/subsystem/minor_mapping.dm index f1bbe5278ae13..565f13b6b017f 100644 --- a/code/controllers/subsystem/minor_mapping.dm +++ b/code/controllers/subsystem/minor_mapping.dm @@ -11,7 +11,7 @@ SUBSYSTEM_DEF(minor_mapping) return SS_INIT_NO_NEED #else trigger_migration(CONFIG_GET(number/mice_roundstart)) - place_satchels() + place_satchels(satchel_amount = 2) return SS_INIT_SUCCESS #endif // the mice are easily the bigger problem, but let's just avoid anything that could cause some bullshit. @@ -26,13 +26,13 @@ SUBSYSTEM_DEF(minor_mapping) to_spawn-- if(HAS_TRAIT(SSstation, STATION_TRAIT_SPIDER_INFESTATION) && prob(PROB_SPIDER_REPLACEMENT)) - new /mob/living/basic/giant_spider/maintenance(proposed_turf) + new /mob/living/basic/spider/maintenance(proposed_turf) return if (prob(PROB_MOUSE_SPAWN)) new /mob/living/basic/mouse(proposed_turf) else - new /mob/living/simple_animal/hostile/regalrat/controlled(proposed_turf) + new /mob/living/basic/regal_rat/controlled(proposed_turf) /// Returns true if a mouse won't die if spawned on this turf /datum/controller/subsystem/minor_mapping/proc/valid_mouse_turf(turf/open/proposed_turf) @@ -42,19 +42,21 @@ SUBSYSTEM_DEF(minor_mapping) var/turf_temperature = proposed_turf.temperature return turf_gasmix.has_gas(/datum/gas/oxygen, 5) && turf_temperature < NPC_DEFAULT_MAX_TEMP && turf_temperature > NPC_DEFAULT_MIN_TEMP -/datum/controller/subsystem/minor_mapping/proc/place_satchels(amount=10) +/datum/controller/subsystem/minor_mapping/proc/place_satchels(satchel_amount) var/list/turfs = find_satchel_suitable_turfs() ///List of areas where satchels should not be placed. - var/list/blacklisted_area_types = list(/area/station/holodeck) + var/list/blacklisted_area_types = list( + /area/station/holodeck, + ) - while(turfs.len && amount > 0) + while(turfs.len && satchel_amount > 0) var/turf/turf = pick_n_take(turfs) if(is_type_in_list(get_area(turf), blacklisted_area_types)) continue var/obj/item/storage/backpack/satchel/flat/flat_satchel = new(turf) SEND_SIGNAL(flat_satchel, COMSIG_OBJ_HIDE, turf.underfloor_accessibility) - amount-- + satchel_amount-- /proc/find_exposed_wires() var/list/exposed_wires = list() @@ -65,7 +67,9 @@ SUBSYSTEM_DEF(minor_mapping) for(var/turf/open/floor/plating/T in all_turfs) if(T.is_blocked_turf()) continue - if(locate(/obj/structure/cable) in T) + //dont include multiz cables in the list because repairing them sucks + var/cable = locate(/obj/structure/cable) in T + if(cable && !istype(cable, /obj/structure/cable/multilayer/multiz)) exposed_wires += T return shuffle(exposed_wires) diff --git a/code/controllers/subsystem/modular_computers.dm b/code/controllers/subsystem/modular_computers.dm index 0c4d88c55e3b0..ad0be83bb5212 100644 --- a/code/controllers/subsystem/modular_computers.dm +++ b/code/controllers/subsystem/modular_computers.dm @@ -19,6 +19,7 @@ SUBSYSTEM_DEF(modular_computers) var/intrusion_detection_enabled = TRUE ///Boolean to show a message warning if there's an active intrusion for Wirecarp users. var/intrusion_detection_alarm = FALSE + var/next_picture_id = 0 /datum/controller/subsystem/modular_computers/Initialize() build_software_lists() @@ -77,4 +78,13 @@ SUBSYSTEM_DEF(modular_computers) logs = list() add_log("-!- LOGS DELETED BY SYSTEM OPERATOR -!-") +/** + * Returns a name which a /datum/picture can be assigned to. + * Use this function to get asset names and to avoid cache duplicates/overwriting. + */ +/datum/controller/subsystem/modular_computers/proc/get_next_picture_name() + var/next_uid = next_picture_id + next_picture_id++ + return "ntos_picture_[next_uid].png" + #undef MAX_LOG_COUNT diff --git a/code/controllers/subsystem/movement/cliff_falling.dm b/code/controllers/subsystem/movement/cliff_falling.dm new file mode 100644 index 0000000000000..80e2f236eb716 --- /dev/null +++ b/code/controllers/subsystem/movement/cliff_falling.dm @@ -0,0 +1,61 @@ +/// Subsystem to handle falling of off cliffs +MOVEMENT_SUBSYSTEM_DEF(cliff_falling) + name = "Cliff Falling" + priority = FIRE_PRIORITY_CLIFF_FALLING + flags = SS_NO_INIT|SS_TICKER + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + + /// Who are currently falling and with which movemanager? + var/list/cliff_grinders = list() + +/datum/controller/subsystem/movement/cliff_falling/proc/start_falling(atom/movable/faller, turf/open/cliff/cliff) + // Make them move + var/mover = SSmove_manager.move(moving = faller, direction = cliff.fall_direction, delay = cliff.fall_speed, subsystem = src, priority = MOVEMENT_ABOVE_SPACE_PRIORITY, flags = MOVEMENT_LOOP_OUTSIDE_CONTROL | MOVEMENT_LOOP_NO_DIR_UPDATE) + + cliff_grinders[faller] = mover + + RegisterSignal(faller, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) + RegisterSignal(faller, COMSIG_QDELETING, PROC_REF(clear_references)) + RegisterSignal(faller, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(check_move)) + +/// We just moved, so check if we're still moving right +/datum/controller/subsystem/movement/cliff_falling/proc/on_moved(atom/movable/mover, turf/old_loc) + SIGNAL_HANDLER + + var/turf/open/cliff/new_cliff = mover.loc + if(!iscliffturf(new_cliff)) //not a cliff, lets clean up + var/datum/move_loop/move/falling = cliff_grinders[mover] + clear_references(mover) + qdel(falling) + return + + new_cliff.on_fall(mover) + + if(old_loc.type == new_cliff) //same type of cliff, no worries + return + + var/datum/move_loop/move/fall = cliff_grinders[mover] + fall.set_delay(new_cliff.fall_speed) //different cliff, so set the speed + +/datum/controller/subsystem/movement/cliff_falling/proc/on_qdel(atom/movable/deletee) + SIGNAL_HANDLER + + clear_references(deletee) + +/datum/controller/subsystem/movement/cliff_falling/proc/clear_references(atom/movable/deletee) + cliff_grinders -= deletee + + UnregisterSignal(deletee, list(COMSIG_MOVABLE_MOVED, COMSIG_QDELETING, COMSIG_MOVABLE_PRE_MOVE)) + +/// Check if we can move! We do this mostly to determine falling behaviour and make sure we're moving to valid tiles +/datum/controller/subsystem/movement/cliff_falling/proc/check_move(atom/movable/mover, turf/target) + SIGNAL_HANDLER + + var/turf/open/cliff/cliff_turf = get_turf(mover) + + if(!iscliffturf(cliff_turf)) //we arent on a cliff, WHY ARE WE HERE??? + clear_references(mover) + return + + if(!cliff_turf.can_move(mover, target)) + return COMPONENT_MOVABLE_BLOCK_PRE_MOVE diff --git a/code/controllers/subsystem/movement/movement_types.dm b/code/controllers/subsystem/movement/movement_types.dm index 81a6b38c22819..6ff9d39d5313f 100644 --- a/code/controllers/subsystem/movement/movement_types.dm +++ b/code/controllers/subsystem/movement/movement_types.dm @@ -113,9 +113,14 @@ return var/visual_delay = controller.visual_delay + var/old_dir = moving.dir + var/old_loc = moving.loc owner?.processing_move_loop_flags = flags var/result = move() //Result is an enum value. Enums defined in __DEFINES/movement.dm + if(moving) + var/direction = get_dir(old_loc, moving.loc) + SEND_SIGNAL(moving, COMSIG_MOVABLE_MOVED_FROM_LOOP, src, old_dir, direction) owner?.processing_move_loop_flags = NONE SEND_SIGNAL(src, COMSIG_MOVELOOP_POSTPROCESS, result, delay * visual_delay) @@ -379,7 +384,7 @@ src.simulated_only = simulated_only src.avoid = avoid src.skip_first = skip_first - movement_path = initial_path.Copy() + movement_path = initial_path?.Copy() if(isidcard(id)) RegisterSignal(id, COMSIG_QDELETING, PROC_REF(handle_no_id)) //I prefer erroring to harddels. If this breaks anything consider making id info into a datum or something @@ -400,6 +405,7 @@ /datum/move_loop/has_target/jps/Destroy() id = null //Kill me avoid = null + on_finish_callback = null return ..() /datum/move_loop/has_target/jps/proc/handle_no_id() diff --git a/code/controllers/subsystem/nightshift.dm b/code/controllers/subsystem/nightshift.dm index f1b9bb8a48d52..78583cef3503f 100644 --- a/code/controllers/subsystem/nightshift.dm +++ b/code/controllers/subsystem/nightshift.dm @@ -46,7 +46,7 @@ SUBSYSTEM_DEF(nightshift) /datum/controller/subsystem/nightshift/proc/update_nightshift(active, announce = TRUE, resumed = FALSE, forced = FALSE) if(!resumed) - currentrun = GLOB.apcs_list.Copy() + currentrun = SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/apc) nightshift_active = active if(announce) if (active) diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm index 34cad5d7f861b..6fbfdadf68281 100644 --- a/code/controllers/subsystem/npcpool.dm +++ b/code/controllers/subsystem/npcpool.dm @@ -29,7 +29,7 @@ SUBSYSTEM_DEF(npcpool) stack_trace("Found a null in simple_animals active list [SA.type]!") continue - if(!SA.ckey && !SA.notransform) + if(!SA.ckey && !HAS_TRAIT(SA, TRAIT_NO_TRANSFORM)) if(SA.stat != DEAD) SA.handle_automated_movement() if(SA.stat != DEAD) diff --git a/code/controllers/subsystem/parallax.dm b/code/controllers/subsystem/parallax.dm index 4cc105ce6c1e3..212af9076bda6 100644 --- a/code/controllers/subsystem/parallax.dm +++ b/code/controllers/subsystem/parallax.dm @@ -1,3 +1,6 @@ +/// Define for the pickweight value where you get no parallax +#define PARALLAX_NONE "parallax_none" + SUBSYSTEM_DEF(parallax) name = "Parallax" wait = 2 @@ -7,20 +10,24 @@ SUBSYSTEM_DEF(parallax) var/list/currentrun var/planet_x_offset = 128 var/planet_y_offset = 128 - var/random_layer - var/random_parallax_color - + /// A random parallax layer that we sent to every player + var/atom/movable/screen/parallax_layer/random/random_layer + /// Weighted list with the parallax layers we could spawn + var/random_parallax_weights = list( + /atom/movable/screen/parallax_layer/random/space_gas = 35, + /atom/movable/screen/parallax_layer/random/asteroids = 35, + PARALLAX_NONE = 30, + ) //These are cached per client so needs to be done asap so people joining at roundstart do not miss these. /datum/controller/subsystem/parallax/PreInit() . = ..() - if(prob(70)) //70% chance to pick a special extra layer - random_layer = pick(/atom/movable/screen/parallax_layer/random/space_gas, /atom/movable/screen/parallax_layer/random/asteroids) - random_parallax_color = pick(COLOR_TEAL, COLOR_GREEN, COLOR_SILVER, COLOR_YELLOW, COLOR_CYAN, COLOR_ORANGE, COLOR_PURPLE)//Special color for random_layer1. Has to be done here so everyone sees the same color. + + set_random_parallax_layer(pick_weight(random_parallax_weights)) + planet_y_offset = rand(100, 160) planet_x_offset = rand(100, 160) - /datum/controller/subsystem/parallax/fire(resumed = FALSE) if (!resumed) src.currentrun = GLOB.clients.Copy() @@ -58,3 +65,36 @@ SUBSYSTEM_DEF(parallax) if (MC_TICK_CHECK) return currentrun = null + +/// Generate a random layer for parallax +/datum/controller/subsystem/parallax/proc/set_random_parallax_layer(picked_parallax) + if(picked_parallax == PARALLAX_NONE) + return + + random_layer = new picked_parallax(null, /* hud_owner = */ null, /* template = */ TRUE) + RegisterSignal(random_layer, COMSIG_QDELETING, PROC_REF(clear_references)) + random_layer.get_random_look() + +/// Change the random parallax layer after it's already been set. update_player_huds = TRUE will also replace them in the players client images, if it was set +/datum/controller/subsystem/parallax/proc/swap_out_random_parallax_layer(atom/movable/screen/parallax_layer/new_type, update_player_huds = TRUE) + set_random_parallax_layer(new_type) + + if(!update_player_huds) + return + + //Parallax is one of the first things to be set (during client join), so rarely is anything fast enough to swap it out + //That's why we need to swap the layers out for fast joining clients :/ + for(var/client/client as anything in GLOB.clients) + client.parallax_layers_cached?.Cut() + client.mob?.hud_used?.update_parallax_pref(client.mob) + +/datum/controller/subsystem/parallax/proc/clear_references() + SIGNAL_HANDLER + + random_layer = null + +/// Called at the end of SSstation setup, in-case we want to run some code that would otherwise be too early to run (like GLOB. stuff) +/datum/controller/subsystem/parallax/proc/post_station_setup() + random_layer?.apply_global_effects() + +#undef PARALLAX_NONE diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index 0b09f050b1f6c..cd4817710d6f8 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -9,6 +9,8 @@ SUBSYSTEM_DEF(persistence) ///instantiated wall engraving components var/list/wall_engravings = list() + ///all saved persistent engravings loaded from JSON + var/list/saved_engravings = list() ///tattoo stories that we're saving. var/list/prison_tattoos_to_save = list() ///tattoo stories that have been selected for this round. @@ -22,6 +24,9 @@ SUBSYSTEM_DEF(persistence) var/list/obj/structure/sign/picture_frame/photo_frames var/list/obj/item/storage/photo_album/photo_albums var/rounds_since_engine_exploded = 0 + var/delam_highscore = 0 + var/tram_hits_this_round = 0 + var/tram_hits_last_round = 0 /datum/controller/subsystem/persistence/Initialize() load_poly() @@ -33,7 +38,7 @@ SUBSYSTEM_DEF(persistence) load_randomized_recipes() load_custom_outfits() load_delamination_counter() - + load_tram_counter() load_adventures() return SS_INIT_SUCCESS @@ -48,6 +53,8 @@ SUBSYSTEM_DEF(persistence) save_scars() save_custom_outfits() save_delamination_counter() + if(SStramprocess.can_fire) + save_tram_counter() ///Loads up Poly's speech buffer. /datum/controller/subsystem/persistence/proc/load_poly() @@ -60,6 +67,7 @@ SUBSYSTEM_DEF(persistence) var/json_file = file(ENGRAVING_SAVE_FILE) if(!fexists(json_file)) return + var/list/json = json_decode(file2text(json_file)) if(!json) return @@ -67,7 +75,11 @@ SUBSYSTEM_DEF(persistence) if(json["version"] < ENGRAVING_PERSISTENCE_VERSION) update_wall_engravings(json) - var/successfully_loaded_engravings = 0 + saved_engravings = json["entries"] + + if(!saved_engravings.len) + log_world("Failed to load engraved messages on map [SSmapping.config.map_name]") + return var/list/viable_turfs = get_area_turfs(/area/station/maintenance, subtypes = TRUE) + get_area_turfs(/area/station/security/prison, subtypes = TRUE) var/list/turfs_to_pick_from = list() @@ -77,23 +89,22 @@ SUBSYSTEM_DEF(persistence) continue turfs_to_pick_from += T - var/list/engraving_entries = json["entries"] + var/successfully_loaded_engravings = 0 - if(engraving_entries.len) - for(var/iteration in 1 to rand(MIN_PERSISTENT_ENGRAVINGS, MAX_PERSISTENT_ENGRAVINGS)) - var/engraving = engraving_entries[rand(1, engraving_entries.len)] //This means repeats will happen for now, but its something I can live with. Just make more engravings! - if(!islist(engraving)) - stack_trace("something's wrong with the engraving data! one of the saved engravings wasn't a list!") - continue + for(var/iteration in 1 to rand(MIN_PERSISTENT_ENGRAVINGS, MAX_PERSISTENT_ENGRAVINGS)) + var/engraving = pick_n_take(saved_engravings) + if(!islist(engraving)) + stack_trace("something's wrong with the engraving data! one of the saved engravings wasn't a list!") + continue - var/turf/closed/engraved_wall = pick(turfs_to_pick_from) + var/turf/closed/engraved_wall = pick(turfs_to_pick_from) - if(HAS_TRAIT(engraved_wall, TRAIT_NOT_ENGRAVABLE)) - continue + if(HAS_TRAIT(engraved_wall, TRAIT_NOT_ENGRAVABLE)) + continue - engraved_wall.AddComponent(/datum/component/engraved, engraving["story"], FALSE, engraving["story_value"]) - successfully_loaded_engravings++ - turfs_to_pick_from -= engraved_wall + engraved_wall.AddComponent(/datum/component/engraved, engraving["story"], FALSE, engraving["story_value"]) + successfully_loaded_engravings++ + turfs_to_pick_from -= engraved_wall log_world("Loaded [successfully_loaded_engravings] engraved messages on map [SSmapping.config.map_name]") @@ -125,8 +136,6 @@ SUBSYSTEM_DEF(persistence) ///This proc can update entries if the format has changed at some point. /datum/controller/subsystem/persistence/proc/update_wall_engravings(json) - - for(var/engraving_entry in json["entries"]) continue //no versioning yet @@ -182,7 +191,6 @@ SUBSYSTEM_DEF(persistence) ///This proc can update entries if the format has changed at some point. /datum/controller/subsystem/persistence/proc/update_prisoner_tattoos(json) - for(var/tattoo_entry in json["entries"]) continue //no versioning yet @@ -531,19 +539,35 @@ SUBSYSTEM_DEF(persistence) WRITE_FILE(file, json_encode(data)) -/// Location where we save the information about how many rounds it has been since the engine blew up +/// Location where we save the information about how many rounds it has been since the engine blew up/tram hits #define DELAMINATION_COUNT_FILEPATH "data/rounds_since_delamination.txt" +#define DELAMINATION_HIGHSCORE_FILEPATH "data/delamination_highscore.txt" +#define TRAM_COUNT_FILEPATH "data/tram_hits_last_round.txt" /datum/controller/subsystem/persistence/proc/load_delamination_counter() if (!fexists(DELAMINATION_COUNT_FILEPATH)) return rounds_since_engine_exploded = text2num(file2text(DELAMINATION_COUNT_FILEPATH)) - for (var/obj/structure/sign/delamination_counter/sign as anything in GLOB.map_delamination_counters) - sign.update_count(rounds_since_engine_exploded) + if (fexists(DELAMINATION_HIGHSCORE_FILEPATH)) + delam_highscore = text2num(file2text(DELAMINATION_HIGHSCORE_FILEPATH)) + for (var/obj/machinery/incident_display/sign as anything in GLOB.map_delamination_counters) + sign.update_delam_count(rounds_since_engine_exploded, delam_highscore) /datum/controller/subsystem/persistence/proc/save_delamination_counter() rustg_file_write("[rounds_since_engine_exploded + 1]", DELAMINATION_COUNT_FILEPATH) + if((rounds_since_engine_exploded + 1) > delam_highscore) + rustg_file_write("[rounds_since_engine_exploded + 1]", DELAMINATION_HIGHSCORE_FILEPATH) + +/datum/controller/subsystem/persistence/proc/load_tram_counter() + if(!fexists(TRAM_COUNT_FILEPATH)) + return + tram_hits_last_round = text2num(file2text(TRAM_COUNT_FILEPATH)) + +/datum/controller/subsystem/persistence/proc/save_tram_counter() + rustg_file_write("[tram_hits_this_round]", TRAM_COUNT_FILEPATH) #undef DELAMINATION_COUNT_FILEPATH +#undef DELAMINATION_HIGHSCORE_FILEPATH +#undef TRAM_COUNT_FILEPATH #undef FILE_RECENT_MAPS #undef KEEP_ROUNDS_MAP diff --git a/code/controllers/subsystem/persistent_paintings.dm b/code/controllers/subsystem/persistent_paintings.dm index 8b97fc3f50a2c..4eb77bd21be8c 100644 --- a/code/controllers/subsystem/persistent_paintings.dm +++ b/code/controllers/subsystem/persistent_paintings.dm @@ -1,4 +1,4 @@ -#define PAINTINGS_DATA_FORMAT_VERSION 2 +#define PAINTINGS_DATA_FORMAT_VERSION 3 // Patronage thresholds for paintings. Different cosmetic frames become available as more credits are spent on the patronage. #define PATRONAGE_OK_FRAME (PAYCHECK_CREW * 3) // 150 credits, as of march 2022 @@ -196,6 +196,11 @@ SUBSYSTEM_DEF(persistent_paintings) current_data = migrate_to_version_1(current_data) if(version < 2) //Makes sure old paintings get a cosmetic frame type from their patronage tiers. current_data = migrate_to_version_2(current_data) + if(version < 3) //Reduces the allowed length of titles from 1000 characters circa to 42. + current_data["version"] = 3 + var/old_title = current_data["title"] + var/new_title = reject_bad_name(old_title, allow_numbers = TRUE, ascii_only = FALSE, strict = TRUE, cap_after_symbols = FALSE) + current_data["title"] = new_title || "Illegibly Titled Artwork" return current_data diff --git a/code/controllers/subsystem/processing/digital_clock.dm b/code/controllers/subsystem/processing/digital_clock.dm new file mode 100644 index 0000000000000..6981e785d1c3c --- /dev/null +++ b/code/controllers/subsystem/processing/digital_clock.dm @@ -0,0 +1,5 @@ +/// The subsystem used to tick digital clocks +PROCESSING_SUBSYSTEM_DEF(digital_clock) + name = "Digital Clocks" + flags = SS_NO_INIT|SS_BACKGROUND|SS_KEEP_TIMING + wait = 1 SECONDS diff --git a/code/controllers/subsystem/processing/fishing.dm b/code/controllers/subsystem/processing/fishing.dm new file mode 100644 index 0000000000000..da10d3d631aef --- /dev/null +++ b/code/controllers/subsystem/processing/fishing.dm @@ -0,0 +1,7 @@ +/** + * So far, only used by the fishing minigame. Feel free to rename it to something like veryfastprocess + * if you need one that fires 10 times a second + */ +PROCESSING_SUBSYSTEM_DEF(fishing) + name = "Fishing" + wait = 0.1 SECONDS diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index ae200c0132008..e27d920c23b3c 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -1,6 +1,42 @@ #define EXP_ASSIGN_WAYFINDER 1200 #define RANDOM_QUIRK_BONUS 3 #define MINIMUM_RANDOM_QUIRKS 3 + +// Shifted to glob so they are generated at world start instead of risking players doing preference stuff before the subsystem inits +GLOBAL_LIST_INIT_TYPED(quirk_blacklist, /list/datum/quirk, list( + list(/datum/quirk/item_quirk/blindness, /datum/quirk/item_quirk/nearsighted), + list(/datum/quirk/jolly, /datum/quirk/depression, /datum/quirk/apathetic, /datum/quirk/hypersensitive), + list(/datum/quirk/no_taste, /datum/quirk/vegetarian, /datum/quirk/deviant_tastes, /datum/quirk/gamer), + list(/datum/quirk/pineapple_liker, /datum/quirk/pineapple_hater, /datum/quirk/gamer), + list(/datum/quirk/alcohol_tolerance, /datum/quirk/light_drinker), + list(/datum/quirk/item_quirk/clown_enjoyer, /datum/quirk/item_quirk/mime_fan, /datum/quirk/item_quirk/pride_pin), + list(/datum/quirk/bad_touch, /datum/quirk/friendly), + list(/datum/quirk/extrovert, /datum/quirk/introvert), + list(/datum/quirk/prosthetic_limb, /datum/quirk/quadruple_amputee, /datum/quirk/body_purist), + list(/datum/quirk/prosthetic_organ, /datum/quirk/tin_man, /datum/quirk/body_purist), + list(/datum/quirk/quadruple_amputee, /datum/quirk/paraplegic, /datum/quirk/hemiplegic), + list(/datum/quirk/quadruple_amputee, /datum/quirk/frail), + list(/datum/quirk/social_anxiety, /datum/quirk/mute), + list(/datum/quirk/mute, /datum/quirk/softspoken), + list(/datum/quirk/poor_aim, /datum/quirk/bighands), + list(/datum/quirk/bilingual, /datum/quirk/foreigner), + list(/datum/quirk/spacer_born, /datum/quirk/paraplegic, /datum/quirk/item_quirk/settler), + list(/datum/quirk/photophobia, /datum/quirk/nyctophobia), + list(/datum/quirk/item_quirk/settler, /datum/quirk/freerunning), + list(/datum/quirk/numb, /datum/quirk/selfaware), +)) + +GLOBAL_LIST_INIT(quirk_string_blacklist, generate_quirk_string_blacklist()) + +/proc/generate_quirk_string_blacklist() + var/list/string_blacklist = list() + for(var/blacklist in GLOB.quirk_blacklist) + var/list/string_list = list() + for(var/datum/quirk/typepath as anything in blacklist) + string_list += initial(typepath.name) + string_blacklist += list(string_list) + return string_blacklist + //Used to process and handle roundstart quirks // - Quirk strings are used for faster checking in code // - Quirk datums are stored and hold different effects, as well as being a vector for applying trait string @@ -16,24 +52,6 @@ PROCESSING_SUBSYSTEM_DEF(quirks) ///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", "Pride Pin"), - list("Bad Touch", "Friendly"), - list("Extrovert", "Introvert"), - list("Prosthetic Limb", "Quadruple Amputee", "Body Purist"), - list("Quadruple Amputee", "Paraplegic"), - list("Quadruple Amputee", "Frail"), - list("Social Anxiety", "Mute"), - list("Mute", "Soft-Spoken"), - list("Stormtrooper Aim", "Big Hands"), - ) - /datum/controller/subsystem/processing/quirks/Initialize() get_quirks() return SS_INIT_SUCCESS @@ -93,7 +111,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) //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 + if(quirk in GLOB.quirk_blacklist) //prevent blacklisted possible_quirks -= quirk continue if(quirk_points[quirk] > 0) @@ -108,7 +126,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) if(!length(possible_quirks))//Lets not get stuck break var/quirk = pick(quirks) - if(quirk in quirk_blacklist) //prevent blacklisted + if(quirk in GLOB.quirk_blacklist) //prevent blacklisted possible_quirks -= quirk continue if(!quirk_points[quirk] < 0)//negative only @@ -123,7 +141,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) if(!length(possible_quirks))//Lets not get stuck break var/quirk = pick(quirks) - if(quirk in quirk_blacklist) //prevent blacklisted + if(quirk in GLOB.quirk_blacklist) //prevent blacklisted possible_quirks -= quirk continue if(!quirk_points[quirk] > 0) //positive only @@ -163,7 +181,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) var/blacklisted = FALSE - for (var/list/blacklist as anything in quirk_blacklist) + for (var/list/blacklist as anything in GLOB.quirk_blacklist) if (!(quirk in blacklist)) continue diff --git a/code/controllers/subsystem/processing/station.dm b/code/controllers/subsystem/processing/station.dm index 21cd66c11a72f..b30a276fc367f 100644 --- a/code/controllers/subsystem/processing/station.dm +++ b/code/controllers/subsystem/processing/station.dm @@ -21,6 +21,7 @@ PROCESSING_SUBSYSTEM_DEF(station) #endif announcer = new announcer() //Initialize the station's announcer datum + SSparallax.post_station_setup() //Apply station effects that parallax might have return SS_INIT_SUCCESS @@ -58,6 +59,13 @@ PROCESSING_SUBSYSTEM_DEF(station) if(initial(trait_typepath.trait_flags) & STATION_TRAIT_ABSTRACT) continue //Dont add abstract ones to it + + if(!(initial(trait_typepath.trait_flags) & STATION_TRAIT_PLANETARY) && SSmapping.is_planetary()) // we're on a planet but we can't do planet ;_; + continue + + if(!(initial(trait_typepath.trait_flags) & STATION_TRAIT_SPACE_BOUND) && !SSmapping.is_planetary()) //we're in space but we can't do space ;_; + continue + selectable_traits_by_types[initial(trait_typepath.trait_type)][trait_typepath] = initial(trait_typepath.weight) var/positive_trait_count = pick(20;0, 5;1, 1;2) diff --git a/code/controllers/subsystem/profiler.dm b/code/controllers/subsystem/profiler.dm index 4b3a1a9971178..dc06c2bc6ae7f 100644 --- a/code/controllers/subsystem/profiler.dm +++ b/code/controllers/subsystem/profiler.dm @@ -21,13 +21,20 @@ SUBSYSTEM_DEF(profiler) StopProfiling() //Stop the early start profiler return SS_INIT_SUCCESS -/datum/controller/subsystem/profiler/fire() +/datum/controller/subsystem/profiler/OnConfigLoad() if(CONFIG_GET(flag/auto_profile)) - DumpFile() + StartProfiling() + can_fire = TRUE + else + StopProfiling() + can_fire = FALSE + +/datum/controller/subsystem/profiler/fire() + DumpFile() /datum/controller/subsystem/profiler/Shutdown() if(CONFIG_GET(flag/auto_profile)) - DumpFile() + DumpFile(allow_yield = FALSE) world.Profile(PROFILE_CLEAR, type = "sendmaps") return ..() @@ -39,13 +46,13 @@ SUBSYSTEM_DEF(profiler) world.Profile(PROFILE_STOP) world.Profile(PROFILE_STOP, type = "sendmaps") - -/datum/controller/subsystem/profiler/proc/DumpFile() +/datum/controller/subsystem/profiler/proc/DumpFile(allow_yield = TRUE) var/timer = TICK_USAGE_REAL var/current_profile_data = world.Profile(PROFILE_REFRESH, format = "json") var/current_sendmaps_data = world.Profile(PROFILE_REFRESH, type = "sendmaps", format="json") fetch_cost = MC_AVERAGE(fetch_cost, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) - CHECK_TICK + if(allow_yield) + CHECK_TICK if(!length(current_profile_data)) //Would be nice to have explicit proc to check this stack_trace("Warning, profiling stopped manually before dump.") diff --git a/code/controllers/subsystem/radiation.dm b/code/controllers/subsystem/radiation.dm index b2b3d1926dd40..d52fe83856a45 100644 --- a/code/controllers/subsystem/radiation.dm +++ b/code/controllers/subsystem/radiation.dm @@ -135,7 +135,7 @@ SUBSYSTEM_DEF(radiation) for (var/obj/item/bodypart/limb as anything in human.bodyparts) var/protected = FALSE - for (var/obj/item/clothing as anything in human.clothingonpart(limb)) + for (var/obj/item/clothing as anything in human.get_clothing_on_part(limb)) if (HAS_TRAIT(clothing, TRAIT_RADIATION_PROTECTED_CLOTHING)) protected = TRUE break diff --git a/code/controllers/subsystem/radioactive_nebula.dm b/code/controllers/subsystem/radioactive_nebula.dm new file mode 100644 index 0000000000000..3b11a7870af98 --- /dev/null +++ b/code/controllers/subsystem/radioactive_nebula.dm @@ -0,0 +1,64 @@ +/// Trait for tracking if something already has the fake irradiation effect, so we don't waste time on effect operations if otherwise unnecessary +#define TRAIT_RADIOACTIVE_NEBULA_FAKE_IRRADIATED "radioactive_nebula_fake_irradiated" + +/// Controls making objects irradiated when Radioactive Nebula is in effect. +SUBSYSTEM_DEF(radioactive_nebula) + name = "Radioactive Nebula" + flags = SS_BACKGROUND + wait = 30 SECONDS + + VAR_PRIVATE + datum/station_trait/nebula/hostile/radiation/radioactive_nebula + +/datum/controller/subsystem/radioactive_nebula/Initialize() + radioactive_nebula = locate() in SSstation.station_traits + if (!radioactive_nebula) + can_fire = FALSE + return SS_INIT_NO_NEED + + // We don't *really* care that this happens by the time the server is ready to play. + ASYNC + irradiate_everything() + + // Don't leak that the station trait has been picked + return SS_INIT_NO_MESSAGE + +/// Makes something appear irradiated for the purposes of the Radioactive Nebula +/datum/controller/subsystem/radioactive_nebula/proc/fake_irradiate(atom/movable/target) + if (HAS_TRAIT(target, TRAIT_RADIOACTIVE_NEBULA_FAKE_IRRADIATED)) + return + + ADD_TRAIT(target, TRAIT_RADIOACTIVE_NEBULA_FAKE_IRRADIATED, REF(src)) + + if(iscarbon(target))//Don't actually make EVERY. SINGLE. THING. RADIOACTIVE. Just irradiate people + target.AddComponent( \ + /datum/component/radioactive_exposure, \ + minimum_exposure_time = NEBULA_RADIATION_MINIMUM_EXPOSURE_TIME, \ + irradiation_chance_base = RADIATION_EXPOSURE_NEBULA_BASE_CHANCE, \ + irradiation_chance_increment = RADIATION_EXPOSURE_NEBULA_CHANCE_INCREMENT, \ + irradiation_interval = RADIATION_EXPOSURE_NEBULA_CHECK_INTERVAL, \ + source = src, \ + radioactive_areas = radioactive_nebula.radioactive_areas, \ + ) + else if(isobj(target)) //and fake the rest + //outline clashes too much with other outlines and creates pretty ugly lines + target.add_filter(GLOW_NEBULA, 2, list("type" = "drop_shadow", "color" = radioactive_nebula.nebula_radglow, "size" = 2)) + +/datum/controller/subsystem/radioactive_nebula/fire() + irradiate_everything() + +/// Loop through radioactive space (with lag checks) and make it all radioactive! +/datum/controller/subsystem/radioactive_nebula/proc/irradiate_everything() + for (var/area/area as anything in get_areas(radioactive_nebula.radioactive_areas)) + for (var/turf/turf as anything in area.get_contained_turfs()) + for (var/atom/movable/target as anything in turf) + fake_irradiate(target) + + CHECK_TICK + +/// Remove the fake radiation. The compontent we add to mobs handles its own removal +/datum/controller/subsystem/radioactive_nebula/proc/fake_unirradiate(atom/movable/leaver) + REMOVE_TRAIT(leaver, TRAIT_RADIOACTIVE_NEBULA_FAKE_IRRADIATED, REF(src)) + leaver.remove_filter(GLOW_NEBULA) + +#undef TRAIT_RADIOACTIVE_NEBULA_FAKE_IRRADIATED diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index 735dd1cdc57d5..7f0b52d471bc8 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -8,12 +8,9 @@ SUBSYSTEM_DEF(research) var/list/techweb_nodes = list() //associative id = node datum var/list/techweb_designs = list() //associative id = node datum - ///List of all techwebs. + ///List of all techwebs, generating points or not. + ///Autolathes, Mechfabs, and others all have shared techwebs, for example. var/list/datum/techweb/techwebs = list() - ///The default Science Techweb. - var/datum/techweb/science/science_tech - ///The default Admin Techweb. - var/datum/techweb/admin/admin_tech var/datum/techweb_node/error_node/error_node //These two are what you get if a node/design is deleted and somehow still stored in a console. var/datum/design/error_design/error_design @@ -74,8 +71,9 @@ SUBSYSTEM_DEF(research) initialize_all_techweb_designs() initialize_all_techweb_nodes() populate_ordnance_experiments() - science_tech = new /datum/techweb/science - admin_tech = new /datum/techweb/admin + new /datum/techweb/science + new /datum/techweb/admin + new /datum/techweb/oldstation autosort_categories() error_design = new error_node = new @@ -308,3 +306,29 @@ SUBSYSTEM_DEF(research) for (var/datum/experiment/ordnance/ordnance_experiment as anything in ordnance_experiments) partner.accepted_experiments += ordnance_experiment.type scientific_partners += partner + +/** + * Goes through all techwebs and goes through their servers to find ones on a valid z-level + * Returns the full list of all techweb servers. + */ +/datum/controller/subsystem/research/proc/get_available_servers(turf/location) + var/list/local_servers = list() + for (var/datum/techweb/individual_techweb as anything in techwebs) + var/list/servers = find_valid_servers(location, individual_techweb) + if(length(servers)) + local_servers += servers + return local_servers + +/** + * Goes through an individual techweb's servers and finds one on a valid z-level + * Returns a list of existing ones, or an empty list otherwise. + * Args: + * - checking_web - The techweb we're checking the servers of. + */ +/datum/controller/subsystem/research/proc/find_valid_servers(turf/location, datum/techweb/checking_web) + var/list/valid_servers = list() + for(var/obj/machinery/rnd/server/server as anything in checking_web.techweb_servers) + if(!is_valid_z_level(get_turf(server), location)) + continue + valid_servers += server + return valid_servers diff --git a/code/controllers/subsystem/security_level.dm b/code/controllers/subsystem/security_level.dm index 9bd803602df24..d4fb13d99889f 100644 --- a/code/controllers/subsystem/security_level.dm +++ b/code/controllers/subsystem/security_level.dm @@ -41,8 +41,6 @@ SUBSYSTEM_DEF(security_level) announce_security_level(selected_level) // We want to announce BEFORE updating to the new level - var/old_shuttle_call_time_mod = current_security_level.shuttle_call_time_mod // Need this before we set the new one - SSsecurity_level.current_security_level = selected_level if(selected_level.looping_sound) @@ -52,9 +50,7 @@ SUBSYSTEM_DEF(security_level) can_fire = FALSE if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL) // By god this is absolutely shit - old_shuttle_call_time_mod = 1 / old_shuttle_call_time_mod - SSshuttle.emergency.modTimer(old_shuttle_call_time_mod) - SSshuttle.emergency.modTimer(selected_level.shuttle_call_time_mod) + SSshuttle.emergency.alert_coeff_change(selected_level.shuttle_call_time_mod) SEND_SIGNAL(src, COMSIG_SECURITY_LEVEL_CHANGED, selected_level.number_level) SSnightshift.check_nightshift() diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index 5b53c67d93b88..aac1ed16660c8 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -198,8 +198,8 @@ SUBSYSTEM_DEF(shuttle) if(!thing) mobile_docking_ports.Remove(thing) continue - var/obj/docking_port/mobile/P = thing - P.check() + var/obj/docking_port/mobile/port = thing + port.check() for(var/thing in transit_docking_ports) var/obj/docking_port/stationary/transit/T = thing if(!T.owner) @@ -262,8 +262,8 @@ SUBSYSTEM_DEF(shuttle) log_shuttle("[msg] Alive: [alive], Roundstart: [total], Threshold: [threshold]") emergency_no_recall = TRUE priority_announce("Catastrophic casualties detected: crisis shuttle protocols activated - jamming recall signals across all frequencies.") - if(emergency.timeLeft(1) > emergency_call_time * 0.4) - emergency.request(null, set_coefficient = 0.4) + if(emergency.timeLeft(1) > emergency_call_time * ALERT_COEFF_AUTOEVAC_CRITICAL) + emergency.request(null, set_coefficient = ALERT_COEFF_AUTOEVAC_CRITICAL) /datum/controller/subsystem/shuttle/proc/block_recall(lockout_timer) if(admin_emergency_no_recall) @@ -457,7 +457,7 @@ SUBSYSTEM_DEF(shuttle) if(callShuttle) if(EMERGENCY_IDLE_OR_RECALLED) - emergency.request(null, set_coefficient = 2.5) + emergency.request(null, set_coefficient = ALERT_COEFF_AUTOEVAC_NORMAL) log_shuttle("There is no means of calling the emergency shuttle anymore. Shuttle automatically called.") message_admins("All the communications consoles were destroyed and all AIs are inactive. Shuttle called.") @@ -601,12 +601,18 @@ SUBSYSTEM_DEF(shuttle) if(WEST) transit_path = /turf/open/space/transit/west - var/datum/turf_reservation/proposal = SSmapping.RequestBlockReservation(transit_width, transit_height, null, /datum/turf_reservation/transit, transit_path) + var/datum/turf_reservation/proposal = SSmapping.request_turf_block_reservation( + transit_width, + transit_height, + 1, + reservation_type = /datum/turf_reservation/transit, + turf_type_override = transit_path, + ) if(!istype(proposal)) return FALSE - var/turf/bottomleft = locate(proposal.bottom_left_coords[1], proposal.bottom_left_coords[2], proposal.bottom_left_coords[3]) + var/turf/bottomleft = proposal.bottom_left_turfs[1] // Then create a transit docking port in the middle var/coords = M.return_coords(0, 0, dock_dir) /* 0------2 @@ -789,9 +795,9 @@ 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 - C.update_hidden_docking_ports(remove_images, add_images) + for(var/obj/machinery/computer/camera_advanced/shuttle_docker/docking_computer \ + as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/computer/camera_advanced/shuttle_docker)) + docking_computer.update_hidden_docking_ports(remove_images, add_images) QDEL_LIST(remove_images) @@ -877,10 +883,15 @@ SUBSYSTEM_DEF(shuttle) /datum/controller/subsystem/shuttle/proc/load_template(datum/map_template/shuttle/loading_template) . = FALSE // Load shuttle template to a fresh block reservation. - preview_reservation = SSmapping.RequestBlockReservation(loading_template.width, loading_template.height, type = /datum/turf_reservation/transit) + preview_reservation = SSmapping.request_turf_block_reservation( + loading_template.width, + loading_template.height, + 1, + reservation_type = /datum/turf_reservation/transit, + ) if(!preview_reservation) CRASH("failed to reserve an area for shuttle template loading") - var/turf/bottom_left = TURF_FROM_COORDS_LIST(preview_reservation.bottom_left_coords) + var/turf/bottom_left = preview_reservation.bottom_left_turfs[1] loading_template.load(bottom_left, centered = FALSE, register = FALSE) var/affected = loading_template.get_affected_turfs(bottom_left, centered=FALSE) @@ -922,6 +933,8 @@ SUBSYSTEM_DEF(shuttle) if(preview_shuttle) preview_shuttle.jumpToNullSpace() preview_shuttle = null + if(preview_reservation) + QDEL_NULL(preview_reservation) /datum/controller/subsystem/shuttle/ui_state(mob/user) return GLOB.admin_state diff --git a/code/controllers/subsystem/stock_market.dm b/code/controllers/subsystem/stock_market.dm new file mode 100644 index 0000000000000..7c2cb71dc4972 --- /dev/null +++ b/code/controllers/subsystem/stock_market.dm @@ -0,0 +1,154 @@ + +SUBSYSTEM_DEF(stock_market) + name = "Stock Market" + wait = 20 SECONDS + init_order = INIT_ORDER_DEFAULT + runlevels = RUNLEVEL_GAME + + /// Associated list of materials and their prices at the given time. + var/list/materials_prices = list() + /// Associated list of materials alongside their market trends. 1 is up, 0 is stable, -1 is down. + var/list/materials_trends = list() + /// Associated list of materials alongside the life of it's current trend. After it's life is up, it will change to a new trend. + var/list/materials_trend_life = list() + /// Associated list of materials alongside their available quantity. This is used to determine how much of a material is available to buy, and how much buying and selling affects the price. + var/list/materials_quantity = list() + /// HTML string that is used to display the market events to the player. + var/news_string = "" + +/datum/controller/subsystem/stock_market/Initialize() + for(var/datum/material/possible_market as anything in subtypesof(/datum/material)) // I need to make this work like this, but lets hardcode it for now + if(initial(possible_market.tradable)) + materials_prices += possible_market + materials_prices[possible_market] = initial(possible_market.value_per_unit) * SHEET_MATERIAL_AMOUNT + + materials_trends += possible_market + materials_trends[possible_market] = rand(MARKET_TREND_DOWNWARD,MARKET_TREND_UPWARD) //aka -1 to 1 + + materials_trend_life += possible_market + materials_trend_life[possible_market] = rand(1,10) + + materials_quantity += possible_market + materials_quantity[possible_market] = initial(possible_market.tradable_base_quantity) + (rand(-initial(possible_market.tradable_base_quantity) * 0.5, initial(possible_market.tradable_base_quantity) * 0.5)) + return SS_INIT_SUCCESS +/datum/controller/subsystem/stock_market/fire(resumed) + for(var/datum/material/market as anything in materials_prices) + handle_trends_and_price(market) + +/** + * Handles shifts in the cost of materials, and in what direction the material is most likely to move. + */ +/datum/controller/subsystem/stock_market/proc/handle_trends_and_price(datum/material/mat) + if(prob(MARKET_EVENT_PROBABILITY)) + handle_market_event(mat) + return + var/trend = materials_trends[mat] + var/trend_life = materials_trend_life[mat] + + var/price_units = materials_prices[mat] + var/price_minimum = round(initial(mat.value_per_unit) * SHEET_MATERIAL_AMOUNT * 0.5) + if(!isnull(initial(mat.minimum_value_override))) + price_minimum = round(initial(mat.minimum_value_override) * SHEET_MATERIAL_AMOUNT) + var/price_maximum = round(initial(mat.value_per_unit) * SHEET_MATERIAL_AMOUNT * 3) + var/price_baseline = initial(mat.value_per_unit) * SHEET_MATERIAL_AMOUNT + + var/stock_quantity = materials_quantity[mat] + + if(HAS_TRAIT(SSeconomy, TRAIT_MARKET_CRASHING)) //We hardset to the worst possible price and lowest possible impact if sold + materials_prices[mat] = price_minimum + materials_quantity[mat] = stock_quantity * 2 + materials_trends[mat] = MARKET_TREND_DOWNWARD + trend_life = materials_trend_life[mat] = 1 + return + + if(trend_life == 0) + ///We want to scale our trend so that if we're closer to our minimum or maximum price, we're more likely to trend the other way. + if((price_units < price_baseline)) + var/chance_swap = 100 - ((clamp((price_units - price_minimum), 1, 1000) / (price_baseline - price_minimum))*100) + if(prob(chance_swap)) + materials_trends[mat] = MARKET_TREND_UPWARD + else + materials_trends[mat] = MARKET_TREND_STABLE + else if((price_units > price_baseline)) + var/chance_swap = 100 - ((clamp((price_units - price_maximum), 1, 1000) / (price_maximum - price_baseline))*100) + if(prob(chance_swap)) + materials_trends[mat] = MARKET_TREND_DOWNWARD + else + materials_trends[mat] = MARKET_TREND_STABLE + materials_trend_life[mat] = rand(3,10) // Change our trend life for x number of cycles + else + materials_trend_life[mat] -= 1 + + var/price_change = 0 + var/quantity_change = 0 + switch(trend) + if(MARKET_TREND_UPWARD) + price_change = ROUND_UP(gaussian(price_units * 0.1, price_baseline * 0.05)) //If we don't ceil, small numbers will get trapped at low values + quantity_change = -round(gaussian(stock_quantity * 0.1, stock_quantity * 0.05)) + if(MARKET_TREND_STABLE) + price_change = round(gaussian(0, price_baseline * 0.01)) + quantity_change = round(gaussian(0, stock_quantity * 0.01)) + if(MARKET_TREND_DOWNWARD) + price_change = -ROUND_UP(gaussian(price_units * 0.1, price_baseline * 0.05)) + quantity_change = round(gaussian(stock_quantity * 0.1, stock_quantity * 0.05)) + materials_prices[mat] = round(clamp(price_units + price_change, price_minimum, price_maximum)) + materials_quantity[mat] = round(clamp(stock_quantity + quantity_change, 0, initial(mat.tradable_base_quantity) * 2)) + +/** + * Market events are a way to spice up the market and make it more interesting. + * Randomly one will occur to a random material, and it will change the price of that material more drastically, or reset it to a stable price. + * Events are also broadcast to the newscaster as a fun little fluff piece. Good way to tell some lore as well, or just make a joke. + */ +/datum/controller/subsystem/stock_market/proc/handle_market_event(datum/material/mat) + + var/company_name = list( // Pick a random company name from the list, I let copilot make a few up for me which is why some suck + "Nakamura Engineering", + "Robust Industries, LLC", + "MODular Solutions", + "SolGov", + "Australicus Industrial Mining", + "Vey-Medical", + "Aussec Armory", + "Dreamland Robotics" + ) + var/circumstance + var/event = rand(1,3) + + var/price_units = materials_prices[mat] + var/price_minimum = round(initial(mat.value_per_unit) * SHEET_MATERIAL_AMOUNT * 0.5) + if(!isnull(initial(mat.minimum_value_override))) + price_minimum = round(initial(mat.minimum_value_override) * SHEET_MATERIAL_AMOUNT) + var/price_maximum = round(initial(mat.value_per_unit) * SHEET_MATERIAL_AMOUNT * 3) + var/price_baseline = initial(mat.value_per_unit) * SHEET_MATERIAL_AMOUNT + + switch(event) + if(1) //Reset to stable + materials_prices[mat] = price_baseline + materials_trends[mat] = MARKET_TREND_STABLE + materials_trend_life[mat] = 1 + circumstance = pick(list( + "[pick(company_name)] has been bought out by a private investment firm. As a result, [initial(mat.name)] is now stable at [materials_prices[mat]] cr.", + "Due to a corporate restructuring, the largest supplier of [initial(mat.name)] has had the price changed to [materials_prices[mat]] cr.", + "[initial(mat.name)] is now under a monopoly by [pick(company_name)]. The price has been changed to [materials_prices[mat]] cr accordingly." + )) + if(2) //Big boost + materials_prices[mat] += round(gaussian(price_units * 0.5, price_units * 0.1)) + materials_prices[mat] = clamp(materials_prices[mat], price_minimum, price_maximum) + materials_trends[mat] = MARKET_TREND_UPWARD + materials_trend_life[mat] = rand(1,5) + circumstance = pick(list( + "[pick(company_name)] has just released a new product that uses [initial(mat.name)]! As a result, the price has been raised to [materials_prices[mat]] cr.", + "Due to [pick(company_name)] finding a new property of [initial(mat.name)], its price has been raised to [materials_prices[mat]] cr.", + "A study has found that [initial(mat.name)] may run out within the next 100 years. The price has raised to [materials_prices[mat]] cr due to panic." + )) + if(3) //Big drop + materials_prices[mat] -= round(gaussian(price_units * 1.5, price_units * 0.1)) + materials_prices[mat] = clamp(materials_prices[mat], price_minimum, price_maximum) + materials_trends[mat] = MARKET_TREND_DOWNWARD + materials_trend_life[mat] = rand(1,5) + circumstance = pick(list( + "[pick(company_name)]'s latest product has seen major controversy, and as a result, the price of [initial(mat.name)] has dropped to [materials_prices[mat]] cr.", + "Due to a new competitor, the price of [initial(mat.name)] has dropped to [materials_prices[mat]] cr.", + "[initial(mat.name)] has been found to be a carcinogen. The price has dropped to [materials_prices[mat]] cr due to panic." + )) + news_string += circumstance + "
" // Add the event to the news_string, formatted for newscasters. diff --git a/code/controllers/subsystem/tgui.dm b/code/controllers/subsystem/tgui.dm index 94f5133af45a7..c12c1b2bb327b 100644 --- a/code/controllers/subsystem/tgui.dm +++ b/code/controllers/subsystem/tgui.dm @@ -19,10 +19,8 @@ SUBSYSTEM_DEF(tgui) /// A list of UIs scheduled to process var/list/current_run = list() - /// A list of open UIs - var/list/open_uis = list() - /// A list of open UIs, grouped by src_object. - var/list/open_uis_by_src = list() + /// A list of all open UIs + var/list/all_uis = list() /// The HTML base used for all UIs. var/basehtml @@ -38,12 +36,12 @@ SUBSYSTEM_DEF(tgui) close_all_uis() /datum/controller/subsystem/tgui/stat_entry(msg) - msg = "P:[length(open_uis)]" + msg = "P:[length(all_uis)]" return ..() /datum/controller/subsystem/tgui/fire(resumed = FALSE) if(!resumed) - src.current_run = open_uis.Copy() + src.current_run = all_uis.Copy() // Cache for sanic speed (lists are references anyways) var/list/current_run = src.current_run while(current_run.len) @@ -53,7 +51,7 @@ SUBSYSTEM_DEF(tgui) if(ui?.user && ui.src_object) ui.process(wait * 0.1) else - open_uis.Remove(ui) + ui.close(0) if(MC_TICK_CHECK) return @@ -172,11 +170,10 @@ SUBSYSTEM_DEF(tgui) * return datum/tgui The found UI. */ /datum/controller/subsystem/tgui/proc/get_open_ui(mob/user, datum/src_object) - var/key = "[REF(src_object)]" // No UIs opened for this src_object - if(isnull(open_uis_by_src[key]) || !istype(open_uis_by_src[key], /list)) + if(!LAZYLEN(src_object?.open_uis)) return null - for(var/datum/tgui/ui in open_uis_by_src[key]) + for(var/datum/tgui/ui in src_object.open_uis) // Make sure we have the right user if(ui.user == user) return ui @@ -192,12 +189,11 @@ SUBSYSTEM_DEF(tgui) * return int The number of UIs updated. */ /datum/controller/subsystem/tgui/proc/update_uis(datum/src_object) - var/count = 0 - var/key = "[REF(src_object)]" // No UIs opened for this src_object - if(isnull(open_uis_by_src[key]) || !istype(open_uis_by_src[key], /list)) - return count - for(var/datum/tgui/ui in open_uis_by_src[key]) + if(!LAZYLEN(src_object?.open_uis)) + return 0 + var/count = 0 + for(var/datum/tgui/ui in src_object.open_uis) // Check if UI is valid. if(ui?.src_object && ui.user && ui.src_object.ui_host(ui.user)) INVOKE_ASYNC(ui, TYPE_PROC_REF(/datum/tgui, process), wait * 0.1, TRUE) @@ -214,12 +210,11 @@ SUBSYSTEM_DEF(tgui) * return int The number of UIs closed. */ /datum/controller/subsystem/tgui/proc/close_uis(datum/src_object) - var/count = 0 - var/key = "[REF(src_object)]" // No UIs opened for this src_object - if(isnull(open_uis_by_src[key]) || !istype(open_uis_by_src[key], /list)) - return count - for(var/datum/tgui/ui in open_uis_by_src[key]) + if(!LAZYLEN(src_object?.open_uis)) + return 0 + var/count = 0 + for(var/datum/tgui/ui in src_object.open_uis) // Check if UI is valid. if(ui?.src_object && ui.user && ui.src_object.ui_host(ui.user)) ui.close() @@ -235,12 +230,11 @@ SUBSYSTEM_DEF(tgui) */ /datum/controller/subsystem/tgui/proc/close_all_uis() var/count = 0 - for(var/key in open_uis_by_src) - for(var/datum/tgui/ui in open_uis_by_src[key]) - // Check if UI is valid. - if(ui?.src_object && ui.user && ui.src_object.ui_host(ui.user)) - ui.close() - count++ + for(var/datum/tgui/ui in all_uis) + // Check if UI is valid. + if(ui?.src_object && ui.user && ui.src_object.ui_host(ui.user)) + ui.close() + count++ return count /** @@ -291,13 +285,9 @@ SUBSYSTEM_DEF(tgui) * required ui datum/tgui The UI to be added. */ /datum/controller/subsystem/tgui/proc/on_open(datum/tgui/ui) - var/key = "[REF(ui.src_object)]" - if(isnull(open_uis_by_src[key]) || !istype(open_uis_by_src[key], /list)) - open_uis_by_src[key] = list() - ui.user.tgui_open_uis |= ui - var/list/uis = open_uis_by_src[key] - uis |= ui - open_uis |= ui + ui.user?.tgui_open_uis |= ui + LAZYOR(ui.src_object.open_uis, ui) + all_uis |= ui /** * private @@ -309,18 +299,14 @@ SUBSYSTEM_DEF(tgui) * return bool If the UI was removed or not. */ /datum/controller/subsystem/tgui/proc/on_close(datum/tgui/ui) - var/key = "[REF(ui.src_object)]" - if(isnull(open_uis_by_src[key]) || !istype(open_uis_by_src[key], /list)) - return FALSE // Remove it from the list of processing UIs. - open_uis.Remove(ui) + all_uis -= ui + current_run -= ui // If the user exists, remove it from them too. if(ui.user) - ui.user.tgui_open_uis.Remove(ui) - var/list/uis = open_uis_by_src[key] - uis.Remove(ui) - if(length(uis) == 0) - open_uis_by_src.Remove(key) + ui.user.tgui_open_uis -= ui + if(ui.src_object) + LAZYREMOVE(ui.src_object.open_uis, ui) return TRUE /** @@ -355,7 +341,7 @@ SUBSYSTEM_DEF(tgui) for(var/datum/tgui/ui in source.tgui_open_uis) // Inform the UIs of their new owner. ui.user = target - target.tgui_open_uis.Add(ui) + target.tgui_open_uis += ui // Clear the old list. source.tgui_open_uis.Cut() return TRUE diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm index 739a0c6956576..60c8ecbf84c51 100644 --- a/code/controllers/subsystem/throwing.dm +++ b/code/controllers/subsystem/throwing.dm @@ -55,7 +55,7 @@ SUBSYSTEM_DEF(throwing) var/init_dir ///The maximum number of turfs that the thrownthing will travel to reach it's target. var/maxrange - ///The speed of the projectile thrownthing being thrown. + ///Turfs to travel per tick var/speed ///If a mob is the one who has thrown the object, then it's moved here. This can be null and must be null checked before trying to use it. var/mob/thrower @@ -115,8 +115,7 @@ SUBSYSTEM_DEF(throwing) 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 return ..() ///Defines the datum behavior on the thrownthing's qdeletion event. @@ -225,6 +224,8 @@ SUBSYSTEM_DEF(throwing) if(thrownthing) SEND_SIGNAL(thrownthing, COMSIG_MOVABLE_THROW_LANDED, src) + var/turf/landed_turf = get_turf(thrownthing) + SEND_SIGNAL(landed_turf, COMSIG_TURF_MOVABLE_THROW_LANDED, thrownthing) qdel(src) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 917fcd0b41aa2..252e69595f35f 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -1,4 +1,5 @@ #define ROUND_START_MUSIC_LIST "strings/round_start_sounds.txt" +#define SS_TICKER_TRAIT "SS_Ticker" SUBSYSTEM_DEF(ticker) name = "Ticker" @@ -10,8 +11,10 @@ SUBSYSTEM_DEF(ticker) /// state of current round (used by process()) Use the defines GAME_STATE_* ! var/current_state = GAME_STATE_STARTUP - /// Boolean to track if round was ended by admin intervention or a "round-ending" event, like summoning Nar'Sie, a blob victory, the nuke going off, etc. - var/force_ending = FALSE + /// Boolean to track if round should be forcibly ended next ticker tick. + /// Set by admin intervention ([ADMIN_FORCE_END_ROUND]) + /// or a "round-ending" event, like summoning Nar'Sie, a blob victory, the nuke going off, etc. ([FORCE_END_ROUND]) + var/force_ending = END_ROUND_AS_NORMAL /// If TRUE, there is no lobby phase, the game starts immediately. var/start_immediately = FALSE /// Boolean to track and check if our subsystem setup is done. @@ -206,7 +209,7 @@ SUBSYSTEM_DEF(ticker) mode.process(wait * 0.1) check_queue() - if(!roundend_check_paused && mode.check_finished(force_ending) || force_ending) + if(!roundend_check_paused && (mode.check_finished() || force_ending)) current_state = GAME_STATE_FINISHED toggle_ooc(TRUE) // Turn it on toggle_dooc(TRUE) @@ -460,19 +463,18 @@ SUBSYSTEM_DEF(ticker) var/mob/living = player.transfer_character() if(living) qdel(player) - living.notransform = TRUE + ADD_TRAIT(living, TRAIT_NO_TRANSFORM, SS_TICKER_TRAIT) if(living.client) var/atom/movable/screen/splash/S = new(null, living.client, TRUE) S.Fade(TRUE) living.client.init_verbs() livings += living if(livings.len) - addtimer(CALLBACK(src, PROC_REF(release_characters), livings), 30, TIMER_CLIENT_TIME) + addtimer(CALLBACK(src, PROC_REF(release_characters), livings), 3 SECONDS, TIMER_CLIENT_TIME) /datum/controller/subsystem/ticker/proc/release_characters(list/livings) - for(var/I in livings) - var/mob/living/L = I - L.notransform = FALSE + for(var/mob/living/living_mob as anything in livings) + REMOVE_TRAIT(living_mob, TRAIT_NO_TRANSFORM, SS_TICKER_TRAIT) /datum/controller/subsystem/ticker/proc/check_queue() if(!queued_players.len) @@ -736,3 +738,4 @@ SUBSYSTEM_DEF(ticker) return "[global.config.directory]/reboot_themes/[pick(possible_themes)]" #undef ROUND_START_MUSIC_LIST +#undef SS_TICKER_TRAIT diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index af6f346cd7646..7be217ffe719d 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -503,11 +503,18 @@ 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 +#if defined(TIMER_DEBUG) + // Generate debug-friendly name for timer, more complex but also more expensive var/static/list/bitfield_flags = list("TIMER_UNIQUE", "TIMER_OVERRIDE", "TIMER_CLIENT_TIME", "TIMER_STOPPABLE", "TIMER_NO_HASH_WAIT", "TIMER_LOOP") name = "Timer: [id] ([text_ref(src)]), TTR: [timeToRun], wait:[wait] Flags: [jointext(bitfield_to_list(flags, bitfield_flags), ", ")], \ callBack: [text_ref(callBack)], callBack.object: [callBack.object][text_ref(callBack.object)]([getcallingtype()]), \ callBack.delegate:[callBack.delegate]([callBack.arguments ? callBack.arguments.Join(", ") : ""]), source: [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 + name = "Timer: [id] ([text_ref(src)]), TTR: [timeToRun], wait:[wait] Flags: [flags], \ + callBack: [text_ref(callBack)], callBack.object: [callBack.object]([getcallingtype()]), \ + callBack.delegate:[callBack.delegate], source: [source]" +#endif if (bucket_joined) stack_trace("Bucket already joined! [name]") @@ -572,8 +579,8 @@ SUBSYSTEM_DEF(timer) * * 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) - CRASH("addtimer called without a callback") + ASSERT(istype(callback), "addtimer called [callback ? "with an invalid callback ([callback])" : "without a callback"]") + ASSERT(isnum(wait), "addtimer called with a non-numeric wait ([wait])") if (wait < 0) stack_trace("addtimer called with a negative wait. Converting to [world.tick_lag]") diff --git a/code/controllers/subsystem/traitor.dm b/code/controllers/subsystem/traitor.dm index cd035fedc7d50..6ad6fca089391 100644 --- a/code/controllers/subsystem/traitor.dm +++ b/code/controllers/subsystem/traitor.dm @@ -19,7 +19,7 @@ SUBSYSTEM_DEF(traitor) var/configuration_data = list() /// The coefficient multiplied by the current_global_progression for new joining traitors to calculate their progression - var/newjoin_progression_coeff = 0.6 + var/newjoin_progression_coeff = 1 /// The current progression that all traitors should be at in the round var/current_global_progression = 0 /// The amount of deviance from the current global progression before you start getting 2x the current scaling or no scaling at all @@ -44,6 +44,9 @@ SUBSYSTEM_DEF(traitor) category_handler = new() traitor_debug_panel = new(category_handler) + for(var/theft_item in subtypesof(/datum/objective_item/steal)) + new theft_item + if(fexists(configuration_path)) var/list/data = json_decode(file2text(file(configuration_path))) for(var/typepath in data) diff --git a/code/controllers/subsystem/tts.dm b/code/controllers/subsystem/tts.dm index e6155262325fa..b9cb85ea78af8 100644 --- a/code/controllers/subsystem/tts.dm +++ b/code/controllers/subsystem/tts.dm @@ -25,6 +25,8 @@ SUBSYSTEM_DEF(tts) /// Whether TTS is enabled or not var/tts_enabled = FALSE + /// Whether the TTS engine supports pitch adjustment or not. + var/pitch_enabled = FALSE /// TTS messages won't play if requests took longer than this duration of time. var/message_timeout = 7 SECONDS @@ -44,7 +46,7 @@ SUBSYSTEM_DEF(tts) return ..() /datum/controller/subsystem/tts/stat_entry(msg) - msg = "Active:[length(in_process_http_messages)]|Standby:[length(queued_http_messages.L)]|Avg:[average_tts_messages_time]" + msg = "Active:[length(in_process_http_messages)]|Standby:[length(queued_http_messages?.L)]|Avg:[average_tts_messages_time]" return ..() /proc/cmp_word_length_asc(datum/tts_request/a, datum/tts_request/b) @@ -65,6 +67,25 @@ SUBSYSTEM_DEF(tts) return FALSE available_speakers = json_decode(response.body) tts_enabled = TRUE + if(CONFIG_GET(str_list/tts_voice_blacklist)) + var/list/blacklisted_voices = CONFIG_GET(str_list/tts_voice_blacklist) + log_config("Processing the TTS voice blacklist.") + for(var/voice in blacklisted_voices) + if(available_speakers.Find(voice)) + log_config("Removed speaker [voice] from the TTS voice pool per config.") + available_speakers.Remove(voice) + var/datum/http_request/request_pitch = new() + var/list/headers_pitch = list() + headers_pitch["Authorization"] = CONFIG_GET(string/tts_http_token) + request_pitch.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/tts_http_url)]/pitch-available", "", headers_pitch) + request_pitch.begin_async() + UNTIL(request_pitch.is_complete()) + pitch_enabled = TRUE + var/datum/http_response/response_pitch = request_pitch.into_response() + if(response_pitch.errored || response_pitch.status_code != 200) + if(response_pitch.errored) + stack_trace(response.error) + pitch_enabled = FALSE rustg_file_write(json_encode(available_speakers), "data/cached_tts_voices.json") rustg_file_write("rustg HTTP requests can't write to folders that don't exist, so we need to make it exist.", "tmp/tts/init.txt") return TRUE @@ -86,16 +107,19 @@ SUBSYSTEM_DEF(tts) var/channel = SSsounds.random_available_channel() for(var/mob/listening_mob in listeners | SSmobs.dead_players_by_zlevel[turf_source.z])//observers always hear through walls + if(QDELING(listening_mob)) + stack_trace("TTS tried to play a sound to a deleted mob.") + continue var/volume_to_play_at = listening_mob.client?.prefs.read_preference(/datum/preference/numeric/sound_tts_volume) - var/use_blips = listening_mob.client?.prefs.read_preference(/datum/preference/toggle/sound_tts_blips) - if(volume_to_play_at == 0 || !listening_mob.client?.prefs.read_preference(/datum/preference/toggle/sound_tts)) + var/tts_pref = listening_mob.client?.prefs.read_preference(/datum/preference/choiced/sound_tts) + if(volume_to_play_at == 0 || (tts_pref == TTS_SOUND_OFF)) continue var/sound_volume = ((listening_mob == target)? 60 : 85) + volume_offset sound_volume = sound_volume * (volume_to_play_at / 100) var/datum/language_holder/holder = listening_mob.get_language_holder() - var/audio_to_use = use_blips ? audio_blips : audio - if(!holder.has_language(language, spoken = FALSE)) + var/audio_to_use = (tts_pref == TTS_SOUND_BLIPS) ? audio_blips : audio + if(!holder.has_language(language)) continue if(get_dist(listening_mob, turf_source) <= range) listening_mob.playsound_local( @@ -237,7 +261,7 @@ SUBSYSTEM_DEF(tts) #undef TTS_ARBRITRARY_DELAY -/datum/controller/subsystem/tts/proc/queue_tts_message(datum/target, message, datum/language/language, speaker, filter, list/listeners, local = FALSE, message_range = 7, volume_offset = 0) +/datum/controller/subsystem/tts/proc/queue_tts_message(datum/target, message, datum/language/language, speaker, filter, list/listeners, local = FALSE, message_range = 7, volume_offset = 0, pitch = 0, special_filters = "") if(!tts_enabled) return @@ -253,7 +277,7 @@ SUBSYSTEM_DEF(tts) var/shell_scrubbed_input = tts_speech_filter(message) shell_scrubbed_input = copytext(shell_scrubbed_input, 1, 300) - var/identifier = "[sha1(speaker + filter + shell_scrubbed_input)].[world.time]" + var/identifier = "[sha1(speaker + filter + num2text(pitch) + special_filters + shell_scrubbed_input)].[world.time]" if(!(speaker in available_speakers)) return @@ -264,9 +288,9 @@ SUBSYSTEM_DEF(tts) var/datum/http_request/request_blips = new() var/file_name = "tmp/tts/[identifier].ogg" var/file_name_blips = "tmp/tts/[identifier]_blips.ogg" - request.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/tts_http_url)]/tts?voice=[speaker]&identifier=[identifier]&filter=[url_encode(filter)]", json_encode(list("text" = shell_scrubbed_input)), headers, file_name) - request_blips.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/tts_http_url)]/tts-blips?voice=[speaker]&identifier=[identifier]&filter=[url_encode(filter)]", json_encode(list("text" = shell_scrubbed_input)), headers, file_name_blips) - var/datum/tts_request/current_request = new /datum/tts_request(identifier, request, request_blips, shell_scrubbed_input, target, local, language, message_range, volume_offset, listeners) + request.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/tts_http_url)]/tts?voice=[speaker]&identifier=[identifier]&filter=[url_encode(filter)]&pitch=[pitch]&special_filters=[url_encode(special_filters)]", json_encode(list("text" = shell_scrubbed_input)), headers, file_name) + request_blips.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/tts_http_url)]/tts-blips?voice=[speaker]&identifier=[identifier]&filter=[url_encode(filter)]&pitch=[pitch]&special_filters=[url_encode(special_filters)]", json_encode(list("text" = shell_scrubbed_input)), headers, file_name_blips) + var/datum/tts_request/current_request = new /datum/tts_request(identifier, request, request_blips, shell_scrubbed_input, target, local, language, message_range, volume_offset, listeners, pitch) var/list/player_queued_tts_messages = queued_tts_messages[target] if(!player_queued_tts_messages) player_queued_tts_messages = list() @@ -316,9 +340,11 @@ SUBSYSTEM_DEF(tts) var/timed_out = FALSE /// Does this use blips during local generation or not? var/use_blips = FALSE + /// What's the pitch adjustment? + var/pitch = 0 -/datum/tts_request/New(identifier, datum/http_request/request, datum/http_request/request_blips, message, target, local, datum/language/language, message_range, volume_offset, list/listeners) +/datum/tts_request/New(identifier, datum/http_request/request, datum/http_request/request_blips, message, target, local, datum/language/language, message_range, volume_offset, list/listeners, pitch) . = ..() src.identifier = identifier src.request = request @@ -330,14 +356,15 @@ SUBSYSTEM_DEF(tts) src.message_range = message_range src.volume_offset = volume_offset src.listeners = listeners + src.pitch = pitch start_time = world.time /datum/tts_request/proc/start_requests() if(istype(target, /client)) var/client/current_client = target - use_blips = current_client?.prefs.read_preference(/datum/preference/toggle/sound_tts_blips) + use_blips = (current_client?.prefs.read_preference(/datum/preference/choiced/sound_tts) == TTS_SOUND_BLIPS) else if(istype(target, /mob)) - use_blips = target.client?.prefs.read_preference(/datum/preference/toggle/sound_tts_blips) + use_blips = (target.client?.prefs.read_preference(/datum/preference/choiced/sound_tts) == TTS_SOUND_BLIPS) if(local) if(use_blips) request_blips.begin_async() @@ -386,3 +413,5 @@ SUBSYSTEM_DEF(tts) return request.is_complete() else return request.is_complete() && request_blips.is_complete() + +#undef SHIFT_DATA_ARRAY diff --git a/code/controllers/subsystem/wardrobe.dm b/code/controllers/subsystem/wardrobe.dm index 58f81f86ad421..ac435cc9a6dde 100644 --- a/code/controllers/subsystem/wardrobe.dm +++ b/code/controllers/subsystem/wardrobe.dm @@ -310,7 +310,7 @@ SUBSYSTEM_DEF(wardrobe) initial_callbacks[/obj/item/organ] = play_with play_with = new /list(WARDROBE_CALLBACK_REMOVE) - play_with[WARDROBE_CALLBACK_REMOVE] = CALLBACK(null, TYPE_PROC_REF(/obj/item/storage/box/survival,wardrobe_removal)) + play_with[WARDROBE_CALLBACK_REMOVE] = CALLBACK(null, TYPE_PROC_REF(/obj/item/storage/box/survival, wardrobe_removal)) initial_callbacks[/obj/item/storage/box/survival] = play_with /datum/controller/subsystem/wardrobe/proc/load_outfits() diff --git a/code/controllers/subsystem/weather.dm b/code/controllers/subsystem/weather.dm index 386cd48a6bcfa..b78beeed81514 100644 --- a/code/controllers/subsystem/weather.dm +++ b/code/controllers/subsystem/weather.dm @@ -81,3 +81,7 @@ SUBSYSTEM_DEF(weather) A = W break return A + +///Returns an active storm by its type +/datum/controller/subsystem/weather/proc/get_weather_by_type(type) + return locate(type) in processing diff --git a/code/datums/achievements/_achievement_data.dm b/code/datums/achievements/_achievement_data.dm index 12c8256c74cef..aa47d8e9fc846 100644 --- a/code/datums/achievements/_achievement_data.dm +++ b/code/datums/achievements/_achievement_data.dm @@ -45,13 +45,11 @@ kv[key] = value qdel(Query) - for(var/T in subtypesof(/datum/award)) - var/datum/award/A = SSachievements.awards[T] - if(!A || !A.name) //Skip abstract achievements types + for(var/award_type in sortTim(subtypesof(/datum/award), GLOBAL_PROC_REF(cmp_award_priority))) + var/datum/award/award = SSachievements.awards[award_type] + if(!award || !award.name) //Skip abstract achievements types continue - if(!data[T]) - data[T] = A.parse_value(kv[A.database_id]) - original_cached_data[T] = data[T] + award.on_achievement_data_init(src, kv[award.database_id]) ///Updates local cache with db data for the given achievement type if it wasn't loaded yet. /datum/achievement_data/proc/get_data(achievement_type) @@ -77,22 +75,12 @@ A.on_unlock(user) //Only on default achievement, as scores keep going up. else if(istype(A, /datum/award/score)) data[achievement_type] += value + update_static_data(user) ///Getter for the status/score of an achievement /datum/achievement_data/proc/get_achievement_status(achievement_type) return data[achievement_type] -///Resets an achievement to default values. -/datum/achievement_data/proc/reset(achievement_type) - if(!SSachievements.achievements_enabled) - return - var/datum/award/A = SSachievements.awards[achievement_type] - get_data(achievement_type) - if(istype(A, /datum/award/achievement)) - data[achievement_type] = FALSE - else if(istype(A, /datum/award/score)) - data[achievement_type] = 0 - /datum/achievement_data/ui_assets(mob/user) return list( get_asset_datum(/datum/asset/spritesheet/simple/achievements), @@ -107,34 +95,30 @@ ui = new(user, src, "Achievements") ui.open() -/datum/achievement_data/ui_data(mob/user) - var/ret_data = list() // screw standards (qustinnus you must rename src.data ok) - ret_data["categories"] = list("Bosses", "Jobs", "Misc", "Mafia", "Scores") - ret_data["achievements"] = list() - ret_data["user_key"] = user.ckey +/datum/achievement_data/ui_static_data(mob/user) + . = ..() + .["categories"] = GLOB.achievement_categories + .["achievements"] = list() + .["highscore"] = list() + .["user_key"] = user.ckey var/datum/asset/spritesheet/simple/assets = get_asset_datum(/datum/asset/spritesheet/simple/achievements) - //This should be split into static data later for(var/achievement_type in SSachievements.awards) - if(!SSachievements.awards[achievement_type].name) //No name? we a subtype. + var/datum/award/award = SSachievements.awards[achievement_type] + if(!award.name) //No name? we a subtype. continue if(isnull(data[achievement_type])) //We're still loading continue - var/list/this = list( - "name" = SSachievements.awards[achievement_type].name, - "desc" = SSachievements.awards[achievement_type].desc, - "category" = SSachievements.awards[achievement_type].category, - "icon_class" = assets.icon_class_name(SSachievements.awards[achievement_type].icon), + var/list/award_data = list( + "name" = award.name, + "desc" = award.desc, + "category" = award.category, + "icon_class" = assets.icon_class_name(award.icon), "value" = data[achievement_type], - "score" = ispath(achievement_type,/datum/award/score) ) - ret_data["achievements"] += list(this) - - return ret_data + award_data += award.get_ui_data() + .["achievements"] += list(award_data) -/datum/achievement_data/ui_static_data(mob/user) - . = ..() - .["highscore"] = list() for(var/score in SSachievements.scores) var/datum/award/score/S = SSachievements.scores[score] if(!S.name || !S.track_high_scores || !S.high_scores.len) diff --git a/code/datums/achievements/_awards.dm b/code/datums/achievements/_awards.dm index f1f3dc7079d36..7a7701e0cf1e0 100644 --- a/code/datums/achievements/_awards.dm +++ b/code/datums/achievements/_awards.dm @@ -15,6 +15,9 @@ //Value returned on db connection failure, in case we want to differ 0 and nonexistent later on var/default_value = FALSE + ///Whether the award has to be loaded before or after other awards on [/datum/achievement_data/load_all_achievements()] + var/load_priority = AWARD_PRIORITY_DEFAULT + ///This proc loads the achievement data from the hub. /datum/award/proc/load(key) if(!SSdbcore.Connect()) @@ -24,6 +27,9 @@ var/raw_value = get_raw_value(key) return parse_value(raw_value) +/datum/award/proc/on_achievement_data_init(datum/achievement_data/holder, database_value) + holder.original_cached_data[type] = holder.data[type] = parse_value(database_value) + ///This saves the changed data to the hub. /datum/award/proc/get_changed_rows(key, value) if(!database_id || !key || !name) @@ -66,21 +72,64 @@ /datum/award/proc/on_unlock(mob/user) return +///returns additional ui data for the Check Achievements menu +/datum/award/proc/get_ui_data() + return list( + "score" = FALSE, + "achieve_info" = null, + "achieve_tooltip" = null, + ) + ///Achievements are one-off awards for usually doing cool things. /datum/award/achievement desc = "Achievement for epic people" icon = "" // This should warn contributors that do not declare an icon when contributing new achievements. + ///How many players have earned this achievement + var/times_achieved = 0 /datum/award/achievement/get_metadata_row() . = ..() .["achievement_type"] = "achievement" +/datum/award/achievement/get_ui_data() + . = ..() + .["achieve_info"] = "Unlocked by [times_achieved] players so far" + if(!SSachievements.most_unlocked_achievement) + .["achieve_tooltip"] = "No achievement has been unlocked yet. Be the first today!" + return + if(SSachievements.most_unlocked_achievement == src) + .["achieve_tooltip"] = "This is the most unlocked achievement" + return + var/percent = FLOOR(times_achieved / SSachievements.most_unlocked_achievement.times_achieved * 100, 0.01) + .["achieve_tooltip"] = "[(times_achieved && !percent) ? "Less than 0.01" : percent]% compared to the achievement unlocked by the most players: \"[SSachievements.most_unlocked_achievement.name])\"" + /datum/award/achievement/parse_value(raw_value) return raw_value > 0 /datum/award/achievement/on_unlock(mob/user) . = ..() to_chat(user, span_greenannounce("Achievement unlocked: [name]!")) + user.client.give_award(/datum/award/score/achievements_score, user, 1) + var/sound/sound_to_send = LAZYACCESS(GLOB.achievement_sounds, user.client.prefs.read_preference(/datum/preference/choiced/sound_achievement)) + if(sound_to_send) + SEND_SOUND(user, sound_to_send) + + times_achieved++ + if(SSachievements.most_unlocked_achievement?.times_achieved < times_achieved) + SSachievements.most_unlocked_achievement = src + + var/datum/achievement_report/new_report = new /datum/achievement_report() + + new_report.winner = "[(user.real_name == user.name) ? user.real_name : "[user.real_name], as [user.name]"]" + new_report.cheevo = name + if(user.ckey) + new_report.winner_key = user.ckey + else + stack_trace("[name] achievement earned by [user], who did not have a ckey.") + + new_report.award_location = "[get_area_name(user)]" + + GLOB.achievements_unlocked += new_report ///Scores are for leaderboarded things, such as killcount of a specific boss /datum/award/score @@ -100,6 +149,10 @@ . = ..() .["achievement_type"] = "score" +/datum/award/score/get_ui_data() + . = ..() + .["score"] = TRUE + /datum/award/score/proc/LoadHighScores() var/datum/db_query/Q = SSdbcore.NewQuery( "SELECT ckey,value FROM [format_table_name("achievements")] WHERE achievement_key = :achievement_key ORDER BY value DESC LIMIT 50", @@ -117,3 +170,27 @@ /datum/award/score/parse_value(raw_value) return isnum(raw_value) ? raw_value : 0 + +///Defining this here 'cause it's the first score a player should see in the Scores category. +/datum/award/score/achievements_score + name = "Achievements Unlocked" + desc = "Don't worry, metagaming is all that matters." + icon = "elephant" //Obey the reference + database_id = ACHIEVEMENTS_SCORE + load_priority = AWARD_PRIORITY_LAST //See below + +/** + * If the raw value is not numerical, it's likely this is the first time the score is being loaded for a ckey. + * So, let's start counting how many achievements have been unlocked so far and return its value instead, + * which is why this award should always be loaded last. + */ +/datum/award/score/achievements_score/on_achievement_data_init(datum/achievement_data/holder, database_value) + if(isnum(database_value)) + return ..() + //We need to keep the value differents so that it's properly saved at the end of the round. + holder.original_cached_data[type] = 0 + var/value = 0 + for(var/award_type in holder.data) + if(ispath(award_type, /datum/award/achievement) && holder.data[award_type]) + value++ + holder.data[type] = value diff --git a/code/datums/achievements/boss_achievements.dm b/code/datums/achievements/boss_achievements.dm index f58f25664f340..a378b703e46ed 100644 --- a/code/datums/achievements/boss_achievements.dm +++ b/code/datums/achievements/boss_achievements.dm @@ -55,12 +55,6 @@ 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." @@ -109,12 +103,6 @@ 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." diff --git a/code/datums/achievements/job_achievements.dm b/code/datums/achievements/job_achievements.dm index 2bcc1ff91cedd..10835b895b88a 100644 --- a/code/datums/achievements/job_achievements.dm +++ b/code/datums/achievements/job_achievements.dm @@ -2,7 +2,27 @@ /datum/award/achievement/jobs category = "Jobs" -//chemistry +//engineering + +/datum/award/achievement/jobs/theoretical_limits + name = "All Within Theoretical Limits" + desc = "I never thought I'd see a resonance cascade, let alone prevent one..." + database_id = MEDAL_THEORETICAL_LIMITS + icon = "theoreticallimits" + +//medical + +/datum/award/achievement/jobs/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 + icon = "basemisc" + +/datum/award/achievement/jobs/helbitaljanken + name = "Helbitaljanken" + desc = "You janked hard" + database_id = MEDAL_HELBITALJANKEN + icon = "helbital" /datum/award/achievement/jobs/chemistry_tut name = "Perfect chemistry blossom" @@ -10,6 +30,28 @@ database_id = MEDAL_CHEM_TUT icon = "chem_tut" +//mining + +/datum/award/achievement/jobs/frenching + name = "Frenching" + desc = "Just a taste, for science!" + database_id = MEDAL_FRENCHING + icon = "frenchingthebubble" + +//science + +/datum/award/achievement/jobs/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/jobs/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" + //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 fc8e7b153372c..f83f2cde7b0a1 100644 --- a/code/datums/achievements/misc_achievements.dm +++ b/code/datums/achievements/misc_achievements.dm @@ -20,12 +20,6 @@ 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." @@ -38,12 +32,6 @@ 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!" @@ -76,11 +64,6 @@ 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 @@ -98,12 +81,6 @@ 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." @@ -122,12 +99,6 @@ 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." @@ -164,6 +135,18 @@ database_id = MEDAL_COSMOS_ASCENSION icon = "cosmicascend" +/datum/award/achievement/misc/knock_ascension + name = "Secrets behind the Spider Door" + desc = "You managed to open a gate into the mansus." + database_id = MEDAL_KNOCK_ASCENSION + icon = "knockascend" + +/datum/award/achievement/misc/grand_ritual_finale + name = "Archmage" + desc = "Made a big impression on the station with your phenomenal cosmic power." + database_id = MEDAL_ARCHMAGE + icon = "archmage" + /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..." @@ -229,3 +212,10 @@ desc = "...And the earth opened its mouth and swallowed them and their station- all the HOP's men and all their possessions." database_id = MEDAL_EARTHQUAKE_VICTIM icon = "earthquake" + +/datum/award/achievement/misc/debt_extinguished + name = "Outdebted" + desc = "I've paid my dues, shift after shift... I've done my sentence but commited no griff..." + database_id = MEDAL_DEBT_EXTINGUISHED + icon = "outdebted" + diff --git a/code/datums/achievements/skill_achievements.dm b/code/datums/achievements/skill_achievements.dm index 128b35a6a4eaa..6384b1b3db4ad 100644 --- a/code/datums/achievements/skill_achievements.dm +++ b/code/datums/achievements/skill_achievements.dm @@ -7,3 +7,8 @@ database_id = MEDAL_LEGENDARY_MINER icon = "mining" +/datum/award/achievement/skill/legendary_fisher + name = "Legendary fisher" + desc = "Give a spaceman a fish and you feed him for a while; teach a spaceman to fish and you feed him until the shuttle arrives." + database_id = MEDAL_LEGENDARY_FISHER + icon = "fishing_hat" diff --git a/code/datums/actions/action.dm b/code/datums/actions/action.dm index a78ef2644f161..d81c72cc92008 100644 --- a/code/datums/actions/action.dm +++ b/code/datums/actions/action.dm @@ -96,13 +96,15 @@ if(check_flags & AB_CHECK_CONSCIOUS) RegisterSignal(owner, COMSIG_MOB_STATCHANGE, PROC_REF(update_status_on_signal)) if(check_flags & AB_CHECK_INCAPACITATED) - RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_INCAPACITATED), PROC_REF(update_status_on_signal)) + RegisterSignals(owner, list(SIGNAL_ADDTRAIT(TRAIT_INCAPACITATED), SIGNAL_REMOVETRAIT(TRAIT_INCAPACITATED)), PROC_REF(update_status_on_signal)) if(check_flags & AB_CHECK_IMMOBILE) - RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_IMMOBILIZED), PROC_REF(update_status_on_signal)) + RegisterSignals(owner, list(SIGNAL_ADDTRAIT(TRAIT_IMMOBILIZED), SIGNAL_REMOVETRAIT(TRAIT_IMMOBILIZED)), PROC_REF(update_status_on_signal)) if(check_flags & AB_CHECK_HANDS_BLOCKED) - RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_HANDS_BLOCKED), PROC_REF(update_status_on_signal)) + RegisterSignals(owner, list(SIGNAL_ADDTRAIT(TRAIT_HANDS_BLOCKED), SIGNAL_REMOVETRAIT(TRAIT_HANDS_BLOCKED)), PROC_REF(update_status_on_signal)) if(check_flags & AB_CHECK_LYING) RegisterSignal(owner, COMSIG_LIVING_SET_BODY_POSITION, PROC_REF(update_status_on_signal)) + if(check_flags & AB_CHECK_PHASED) + RegisterSignals(owner, list(SIGNAL_ADDTRAIT(TRAIT_MAGICALLY_PHASED), SIGNAL_REMOVETRAIT(TRAIT_MAGICALLY_PHASED)), PROC_REF(update_status_on_signal)) if(owner_has_control) GiveAction(grant_to) @@ -115,7 +117,7 @@ if(!hud.mymob) continue HideFrom(hud.mymob) - LAZYREMOVE(remove_from.actions, src) // We aren't always properly inserted into the viewers list, gotta make sure that action's cleared + LAZYREMOVE(remove_from?.actions, src) // We aren't always properly inserted into the viewers list, gotta make sure that action's cleared viewers = list() if(owner) @@ -130,6 +132,11 @@ SIGNAL_ADDTRAIT(TRAIT_HANDS_BLOCKED), SIGNAL_ADDTRAIT(TRAIT_IMMOBILIZED), SIGNAL_ADDTRAIT(TRAIT_INCAPACITATED), + SIGNAL_ADDTRAIT(TRAIT_MAGICALLY_PHASED), + SIGNAL_REMOVETRAIT(TRAIT_HANDS_BLOCKED), + SIGNAL_REMOVETRAIT(TRAIT_IMMOBILIZED), + SIGNAL_REMOVETRAIT(TRAIT_INCAPACITATED), + SIGNAL_REMOVETRAIT(TRAIT_MAGICALLY_PHASED), )) if(target == owner) @@ -139,7 +146,7 @@ /// Actually triggers the effects of the action. /// Called when the on-screen button is clicked, for example. /datum/action/proc/Trigger(trigger_flags) - if(!IsAvailable(feedback = TRUE)) + if(!(trigger_flags & TRIGGER_FORCE_AVAILABLE) && !IsAvailable(feedback = TRUE)) return FALSE if(SEND_SIGNAL(src, COMSIG_ACTION_TRIGGER, src) & COMPONENT_ACTION_BLOCK_TRIGGER) return FALSE @@ -174,6 +181,10 @@ if (feedback) owner.balloon_alert(owner, "unconscious!") return FALSE + if((check_flags & AB_CHECK_PHASED) && HAS_TRAIT(owner, TRAIT_MAGICALLY_PHASED)) + if (feedback) + owner.balloon_alert(owner, "incorporeal!") + return FALSE return TRUE /// Builds / updates all buttons we have shared or given out @@ -378,7 +389,7 @@ build_all_button_icons(update_flag, forced) /// A general use signal proc that reacts to an event and updates JUST our button's status -/datum/action/proc/update_status_on_signal(datum/source) +/datum/action/proc/update_status_on_signal(datum/source, new_stat, old_stat) SIGNAL_HANDLER build_all_button_icons(UPDATE_BUTTON_STATUS) diff --git a/code/datums/actions/cooldown_action.dm b/code/datums/actions/cooldown_action.dm index 9d31f2b5d37a7..a7e0603461a77 100644 --- a/code/datums/actions/cooldown_action.dm +++ b/code/datums/actions/cooldown_action.dm @@ -20,7 +20,7 @@ /// Significant figures to round cooldown to var/cooldown_rounding = 0.1 /// Shares cooldowns with other abiliies, bitflag - var/shared_cooldown + var/shared_cooldown = NONE /// List of prerequisite actions that are used in this sequenced ability, you cannot put other sequenced abilities in this var/list/sequence_actions /// List of prerequisite actions that have been initialized @@ -66,10 +66,10 @@ /datum/action/cooldown/create_button() var/atom/movable/screen/movable/action_button/button = ..() button.maptext = "" - button.maptext_x = 6 + button.maptext_x = 4 button.maptext_y = 2 - button.maptext_width = 24 - button.maptext_height = 12 + button.maptext_width = 32 + button.maptext_height = 16 return button /datum/action/cooldown/update_button_status(atom/movable/screen/movable/action_button/button, force = FALSE) @@ -79,9 +79,9 @@ button.maptext = "" else if (cooldown_rounding > 0) - button.maptext = MAPTEXT("[round(time_left/10, cooldown_rounding)]") + button.maptext = MAPTEXT_TINY_UNICODE("[round(time_left/10, cooldown_rounding)]") else - button.maptext = MAPTEXT("[round(time_left/10)]") + button.maptext = MAPTEXT_TINY_UNICODE("[round(time_left/10)]") if(!IsAvailable() || !is_action_active(button)) return @@ -154,7 +154,7 @@ /datum/action/cooldown/proc/StartCooldown(override_cooldown_time, override_melee_cooldown_time) // "Shared cooldowns" covers actions which are not the same type, // but have the same cooldown group and are on the same mob - if(shared_cooldown) + if(shared_cooldown != NONE) StartCooldownOthers(override_cooldown_time) StartCooldownSelf(override_cooldown_time) @@ -238,7 +238,7 @@ /// For signal calling /datum/action/cooldown/proc/PreActivate(atom/target) - if(SEND_SIGNAL(owner, COMSIG_MOB_ABILITY_STARTED, src) & COMPONENT_BLOCK_ABILITY_START) + if(SEND_SIGNAL(owner, COMSIG_MOB_ABILITY_STARTED, src, target) & COMPONENT_BLOCK_ABILITY_START) return // Note, that PreActivate handles no cooldowns at all by default. // Be sure to call StartCooldown() in Activate() where necessary. diff --git a/code/datums/actions/items/toggles.dm b/code/datums/actions/items/toggles.dm index d40b187b3bb46..bbdd2e9f7b9ed 100644 --- a/code/datums/actions/items/toggles.dm +++ b/code/datums/actions/items/toggles.dm @@ -101,3 +101,7 @@ /datum/action/item_action/flip name = "Flip" + +/datum/action/item_action/call_link + name = "Call MODlink" + diff --git a/code/datums/actions/items/unzip.dm b/code/datums/actions/items/unzip.dm new file mode 100644 index 0000000000000..b0da7ebc28a5a --- /dev/null +++ b/code/datums/actions/items/unzip.dm @@ -0,0 +1,19 @@ +/datum/action/item_action/zipper + name = "Unzip Duffel" + desc = "Unzip your equipped duffelbag so you can access its contents." + +/datum/action/item_action/zipper/New(Target) + . = ..() + RegisterSignal(target, COMSIG_DUFFEL_ZIP_CHANGE, PROC_REF(on_zip_change)) + var/obj/item/storage/backpack/duffelbag/duffle_target = target + on_zip_change(target, duffle_target.zipped_up) + +/datum/action/item_action/zipper/proc/on_zip_change(datum/source, new_zip) + SIGNAL_HANDLER + if(new_zip) + name = "Unzip" + desc = "Unzip your equipped duffelbag so you can access its contents." + else + name = "Zip" + desc = "Zip your equipped duffelbag so you can move around faster." + build_all_button_icons(UPDATE_BUTTON_NAME) diff --git a/code/datums/actions/mobs/assume_form.dm b/code/datums/actions/mobs/assume_form.dm new file mode 100644 index 0000000000000..b10a91c5d65a0 --- /dev/null +++ b/code/datums/actions/mobs/assume_form.dm @@ -0,0 +1,87 @@ +/// Allows a mob to assume the form of another item or mob. +/// Warning, this will likely shit the bricks if you add this action to anything more sophisticated than a basic mob- this isn't built for anything carbon-wise. +/datum/action/cooldown/mob_cooldown/assume_form + name = "Assume Form" + desc = "Choose something that you wish to blend into the environment as. Click on yourself to reset your appearance." + button_icon_state = "sniper_zoom" + background_icon_state = "bg_alien" + overlay_icon_state = "bg_alien_border" + ranged_mousepointer = 'icons/effects/mouse_pointers/supplypod_target.dmi' + check_flags = AB_CHECK_CONSCIOUS + cooldown_time = 1.5 SECONDS + + /// Stuff that we can not disguise as. + var/static/list/blacklist_typecache = typecacheof(list( + /atom/movable/screen, + /obj/effect, + /obj/energy_ball, + /obj/narsie, + /obj/singularity, + )) + +/datum/action/cooldown/mob_cooldown/assume_form/Grant(mob/grant_to) + . = ..() + RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(reset_appearances)) + +/datum/action/cooldown/mob_cooldown/assume_form/Remove(mob/remove_from) + reset_appearances() + UnregisterSignal(owner, COMSIG_LIVING_DEATH) + return ..() + +/datum/action/cooldown/mob_cooldown/assume_form/Activate(atom/target_atom) + StartCooldown(360 SECONDS, 360 SECONDS) + determine_intent(target_atom) + StartCooldown() + return TRUE + +/// Rapid proc to test if we can assume the form of a given atom. Returns TRUE if we can, FALSE if we can't. Done like this so we can be nice and explicit. +/datum/action/cooldown/mob_cooldown/assume_form/proc/can_assume_form(atom/target_atom) + if(is_type_in_typecache(target_atom, blacklist_typecache) || (!isobj(target_atom) && !ismob(target_atom))) + return FALSE + + return TRUE + +/// Determines what our user meant by their action. If they clicked on themselves, we reset our appearance. Otherwise, we assume the appearance of the clicked-on item. +/datum/action/cooldown/mob_cooldown/assume_form/proc/determine_intent(atom/target_atom) + if(!can_assume_form(target_atom)) + return + + if(target_atom == owner) + reset_appearances() + return + + assume_appearances(target_atom) + +/// Assumes the appearance of a desired movable and applies it to our mob. Target is the movable in question. +/datum/action/cooldown/mob_cooldown/assume_form/proc/assume_appearances(atom/movable/target_atom) + owner.appearance = target_atom.appearance + owner.copy_overlays(target_atom) + owner.alpha = max(target_atom.alpha, 150) //fucking chameleons + owner.transform = initial(target_atom.transform) + owner.pixel_x = target_atom.base_pixel_x + owner.pixel_y = target_atom.base_pixel_y + + // important: do this at the very end because we might have SIGNAL_ADDTRAIT for this on the mob that's dependent on the above logic + SEND_SIGNAL(owner, COMSIG_ACTION_DISGUISED_APPEARANCE, target_atom) + ADD_TRAIT(owner, TRAIT_DISGUISED, REF(src)) + +/// Resets the appearances of the mob to the default. +/datum/action/cooldown/mob_cooldown/assume_form/proc/reset_appearances() + SIGNAL_HANDLER + + if(!HAS_TRAIT(owner, TRAIT_DISGUISED)) + return // in case we're being invoked on death and we aren't disguised (or we just click on ourselves randomly), no need to do this additional work. + + owner.animate_movement = SLIDE_STEPS + owner.maptext = null + owner.alpha = initial(owner.alpha) + owner.color = initial(owner.color) + owner.desc = initial(owner.desc) + + owner.name = initial(owner.name) + owner.icon = initial(owner.icon) + owner.icon_state = initial(owner.icon_state) + owner.cut_overlays() + + // important: do this very end because we might have SIGNAL_REMOVETRAIT for this on the mob that's dependent on the above logic + REMOVE_TRAIT(owner, TRAIT_DISGUISED, REF(src)) diff --git a/code/datums/actions/mobs/charge.dm b/code/datums/actions/mobs/charge.dm index 07a541838eda2..7fb5620977712 100644 --- a/code/datums/actions/mobs/charge.dm +++ b/code/datums/actions/mobs/charge.dm @@ -51,7 +51,7 @@ RegisterSignal(charger, COMSIG_MOVABLE_BUMP, PROC_REF(on_bump), TRUE) RegisterSignal(charger, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_move), TRUE) RegisterSignal(charger, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved), TRUE) - DestroySurroundings(charger) + RegisterSignal(charger, COMSIG_LIVING_DEATH, PROC_REF(charge_end)) charger.setDir(dir) do_charge_indicator(charger, target) @@ -65,8 +65,6 @@ RegisterSignal(new_loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(pre_move)) RegisterSignal(new_loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(post_move)) RegisterSignal(new_loop, COMSIG_QDELETING, PROC_REF(charge_end)) - if(ismob(charger)) - RegisterSignal(charger, COMSIG_MOB_STATCHANGE, PROC_REF(stat_changed)) // Yes this is disgusting. But we need to queue this stuff, and this code just isn't setup to support that right now. So gotta do it with sleeps sleep(time_to_hit + charge_speed) @@ -83,16 +81,19 @@ SIGNAL_HANDLER actively_moving = FALSE -/datum/action/cooldown/mob_cooldown/charge/proc/charge_end(datum/move_loop/source) +/datum/action/cooldown/mob_cooldown/charge/proc/charge_end(datum/source) SIGNAL_HANDLER - var/atom/movable/charger = source.moving - UnregisterSignal(charger, list(COMSIG_MOVABLE_BUMP, COMSIG_MOVABLE_PRE_MOVE, COMSIG_MOVABLE_MOVED, COMSIG_MOB_STATCHANGE)) + var/atom/movable/charger = source + if(istype(source, /datum/move_loop)) + var/datum/move_loop/move_loop_source = source + charger = move_loop_source.moving + UnregisterSignal(charger, list(COMSIG_MOVABLE_BUMP, COMSIG_MOVABLE_PRE_MOVE, COMSIG_MOVABLE_MOVED, COMSIG_LIVING_DEATH)) SEND_SIGNAL(owner, COMSIG_FINISHED_CHARGE) actively_moving = FALSE charging -= charger -/datum/action/cooldown/mob_cooldown/charge/proc/stat_changed(mob/source, new_stat, old_stat) - SIGNAL_HANDLER +/datum/action/cooldown/mob_cooldown/charge/update_status_on_signal(mob/source, new_stat, old_stat) + . = ..() if(new_stat == DEAD) SSmove_manager.stop_looping(source) //This will cause the loop to qdel, triggering an end to our charging @@ -178,6 +179,10 @@ var/shake_duration = 1 SECONDS /// Intensity of shaking animation var/shake_pixel_shift = 2 + /// Amount of time to stun self upon impact + var/recoil_duration = 0.6 SECONDS + /// Amount of time to knock over an impacted target + var/knockdown_duration = 0.6 SECONDS /datum/action/cooldown/mob_cooldown/charge/basic_charge/do_charge_indicator(atom/charger, atom/charge_target) charger.Shake(shake_pixel_shift, shake_pixel_shift, shake_duration) @@ -193,18 +198,32 @@ source.visible_message(span_danger("[source] smashes into [target]!")) if(!living_source) return - living_source.Stun(6, ignore_canstun = TRUE) + living_source.Stun(recoil_duration, ignore_canstun = TRUE) return var/mob/living/living_target = target if(ishuman(living_target)) var/mob/living/carbon/human/human_target = living_target if(human_target.check_shields(source, 0, "the [source.name]", attack_type = LEAP_ATTACK) && living_source) - living_source.Stun(6, ignore_canstun = TRUE) + living_source.Stun(recoil_duration, ignore_canstun = TRUE) return living_target.visible_message(span_danger("[source] charges on [living_target]!"), span_userdanger("[source] charges into you!")) - living_target.Knockdown(6) + living_target.Knockdown(knockdown_duration) + + +/datum/status_effect/tired_post_charge + id = "tired_post_charge" + duration = 1 SECONDS + alert_type = null + +/datum/status_effect/tired_post_charge/on_apply() + . = ..() + owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/tired_post_charge) + +/datum/status_effect/tired_post_charge/on_remove() + . = ..() + owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/tired_post_charge) /datum/action/cooldown/mob_cooldown/charge/triple_charge name = "Triple Charge" diff --git a/code/datums/actions/mobs/charge_apc.dm b/code/datums/actions/mobs/charge_apc.dm index ddfaa22e60ce0..74ffda6a60382 100644 --- a/code/datums/actions/mobs/charge_apc.dm +++ b/code/datums/actions/mobs/charge_apc.dm @@ -1,6 +1,6 @@ /datum/action/cooldown/mob_cooldown/charge_apc name = "Charge APCs" - button_icon = 'icons/obj/power.dmi' + button_icon = 'icons/obj/machines/wallmounts.dmi' button_icon_state = "apc0" desc = "Give off charge to an APC." cooldown_time = 5 SECONDS diff --git a/code/datums/actions/mobs/conjure_foamwall.dm b/code/datums/actions/mobs/conjure_foamwall.dm new file mode 100644 index 0000000000000..8814225f8a2a2 --- /dev/null +++ b/code/datums/actions/mobs/conjure_foamwall.dm @@ -0,0 +1,21 @@ +/datum/action/cooldown/spell/conjure/foam_wall + name = "Foam wall" + desc = "Create a wall of foam." + + button_icon = 'icons/effects/effects.dmi' + button_icon_state = "metalfoam" + + cooldown_time = 2 MINUTES + spell_requirements = NONE + + summon_radius = 0 + summon_type = list(/obj/structure/foamedmetal) + +/datum/action/cooldown/spell/conjure/foam_wall/can_cast_spell(feedback = TRUE) + . = ..() + if(!.) + return FALSE + var/turf/owner_turf = get_turf(owner) + if(owner_turf.is_blocked_turf(exclude_mobs = TRUE)) + return FALSE + return TRUE diff --git a/code/datums/actions/mobs/defensive_mode.dm b/code/datums/actions/mobs/defensive_mode.dm new file mode 100644 index 0000000000000..30cb9a5980a3e --- /dev/null +++ b/code/datums/actions/mobs/defensive_mode.dm @@ -0,0 +1,49 @@ +/// An ability that allows the viper spider to get in an defensive mode at the cost of speed. +/datum/action/cooldown/mob_cooldown/defensive_mode + name = "Change Mode" + button_icon = 'icons/mob/actions/actions_animal.dmi' + button_icon_state = "defensive_mode" + desc = "Activates a defensive mode to reduce damage but will make you slower." + cooldown_time = 5 SECONDS + click_to_activate = FALSE + /// If the defensive mode is activated or not. + var/defense_active = FALSE + /// Movement speed modifier used. + var/datum/movespeed_modifier/modifier_type = /datum/movespeed_modifier/viper_defensive + +/datum/action/cooldown/mob_cooldown/defensive_mode/Remove(mob/living/remove_from) + var/mob/living/basic/owner_mob = owner + if(defense_active && istype(owner_mob)) + offence(owner_mob) + + return ..() + +/datum/action/cooldown/mob_cooldown/defensive_mode/Activate(atom/target_atom) + StartCooldown(360 SECONDS, 360 SECONDS) + activate_defence(owner) + StartCooldown() + return TRUE + +/datum/action/cooldown/mob_cooldown/defensive_mode/proc/activate_defence(mob/living/basic/owner_mob) + if(!istype(owner_mob)) + return + if(defense_active) + offence(owner_mob) + return + defence(owner_mob) + +/datum/action/cooldown/mob_cooldown/defensive_mode/proc/offence(mob/living/basic/owner_mob) + owner_mob.damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1) + owner_mob.icon_state = initial(owner_mob.icon_state) + owner_mob.icon_living = initial(owner_mob.icon_living) + owner_mob.icon_dead = initial(owner_mob.icon_dead) + owner_mob.remove_movespeed_modifier(modifier_type) + defense_active = FALSE + +/datum/action/cooldown/mob_cooldown/defensive_mode/proc/defence(mob/living/basic/owner_mob) + owner_mob.damage_coeff = list(BRUTE = 0.4, BURN = 0.5, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1) + owner_mob.icon_dead = "[owner_mob.icon_state]_d_dead" + owner_mob.icon_state = "[owner_mob.icon_state]_d" + owner_mob.icon_living = "[owner_mob.icon_living]_d" + owner_mob.add_movespeed_modifier(modifier_type) + defense_active = TRUE diff --git a/code/datums/actions/mobs/fire_breath.dm b/code/datums/actions/mobs/fire_breath.dm index 57962035a24d4..254a6081425e1 100644 --- a/code/datums/actions/mobs/fire_breath.dm +++ b/code/datums/actions/mobs/fire_breath.dm @@ -1,6 +1,6 @@ /datum/action/cooldown/mob_cooldown/fire_breath name = "Fire Breath" - button_icon = 'icons/obj/wizard.dmi' + button_icon = 'icons/effects/magic.dmi' button_icon_state = "fireball" desc = "Allows you to shoot fire towards a target." cooldown_time = 3 SECONDS @@ -24,7 +24,8 @@ /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) + // This proc sleeps + INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(dragon_fire_line), owner, /* burn_turfs = */ turfs, /* frozen = */ ice_breath) /datum/action/cooldown/mob_cooldown/fire_breath/proc/line_target(offset, range, atom/target) if(!target) diff --git a/code/datums/actions/mobs/language_menu.dm b/code/datums/actions/mobs/language_menu.dm deleted file mode 100644 index bcfcb5437a2fc..0000000000000 --- a/code/datums/actions/mobs/language_menu.dm +++ /dev/null @@ -1,13 +0,0 @@ -/datum/action/language_menu - name = "Language Menu" - desc = "Open the language menu to review your languages, their keys, and select your default language." - button_icon_state = "language_menu" - check_flags = NONE - -/datum/action/language_menu/Trigger(trigger_flags) - . = ..() - if(!.) - return - - var/datum/language_holder/owner_holder = owner.get_language_holder() - owner_holder.open_language_menu(usr) diff --git a/code/datums/actions/mobs/lava_swoop.dm b/code/datums/actions/mobs/lava_swoop.dm index 618dcc10ff073..7532ccfda0882 100644 --- a/code/datums/actions/mobs/lava_swoop.dm +++ b/code/datums/actions/mobs/lava_swoop.dm @@ -38,7 +38,7 @@ return // stop swooped target movement swooping = TRUE - owner.set_density(FALSE) + ADD_TRAIT(owner, TRAIT_UNDENSE, SWOOPING_TRAIT) owner.visible_message(span_boldwarning("[owner] swoops up high!")) var/negative @@ -96,26 +96,21 @@ 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.investigate_log("has been gibbed by lava swoop.", INVESTIGATE_DEATHS) - 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]!")) + L.adjustBruteLoss(75) + if(!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) + REMOVE_TRAIT(owner, TRAIT_UNDENSE, SWOOPING_TRAIT) SLEEP_CHECK_DEATH(1, owner) swooping = FALSE if(!lava_success) @@ -152,7 +147,7 @@ if(isindestructiblefloor(T)) continue if(!isindestructiblewall(T)) - T.ChangeTurf(/turf/open/misc/asteroid/basalt/lava_land_surface, flags = CHANGETURF_INHERIT_AIR) + T.TerraformTurf(/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 diff --git a/code/datums/actions/mobs/open_mob_commands.dm b/code/datums/actions/mobs/open_mob_commands.dm index 49a130a873091..e7ffd104effbe 100644 --- a/code/datums/actions/mobs/open_mob_commands.dm +++ b/code/datums/actions/mobs/open_mob_commands.dm @@ -5,10 +5,11 @@ overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' button_icon_state = "stargazer_menu" + check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED | AB_CHECK_PHASED /// Weakref for storing our stargazer var/datum/weakref/our_mob -/datum/action/cooldown/open_mob_commands/Grant(mob/granted_to, mob/living/basic/star_gazer/our_mob_input) +/datum/action/cooldown/open_mob_commands/Grant(mob/granted_to, mob/living/basic/heretic_summon/star_gazer/our_mob_input) . = ..() our_mob = WEAKREF(our_mob_input) @@ -18,7 +19,7 @@ /// Opens the pet command options menu for a mob. /datum/action/cooldown/open_mob_commands/proc/open_menu() - var/mob/living/basic/star_gazer/our_mob_resolved = our_mob?.resolve() + var/mob/living/basic/heretic_summon/star_gazer/our_mob_resolved = our_mob?.resolve() if(our_mob_resolved) var/datum/component/obeys_commands/command_component = our_mob_resolved.GetComponent(/datum/component/obeys_commands) if(command_component) diff --git a/code/datums/actions/mobs/projectileattack.dm b/code/datums/actions/mobs/projectileattack.dm index 468e498e959ef..5f97081186dec 100644 --- a/code/datums/actions/mobs/projectileattack.dm +++ b/code/datums/actions/mobs/projectileattack.dm @@ -285,6 +285,7 @@ name = "Titan's Finale" desc = "A single-use ability that shoots a large amount of projectiles around you." cooldown_time = 2.5 SECONDS + projectile_type = /obj/projectile/colossus /datum/action/cooldown/mob_cooldown/projectile_attack/colossus_final/Activate(atom/target_atom) . = ..() @@ -296,6 +297,7 @@ colossus = firer colossus.say("Perish.", spans = list("colossus", "yell")) + SLEEP_CHECK_DEATH(0.5 SECONDS, firer) //gives dumbasses in melee range a slim chance to retreat var/finale_counter = 10 for(var/i in 1 to 20) if(finale_counter > 4 && colossus) diff --git a/code/datums/actions/mobs/small_sprite.dm b/code/datums/actions/mobs/small_sprite.dm deleted file mode 100644 index b53b46fe43a81..0000000000000 --- a/code/datums/actions/mobs/small_sprite.dm +++ /dev/null @@ -1,57 +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" - overlay_icon_state = "bg_alien_border" - var/small = FALSE - var/small_icon - var/small_icon_state - -/datum/action/small_sprite/queen - small_icon = 'icons/mob/nonhuman-player/alien.dmi' - small_icon_state = "alienq" - -/datum/action/small_sprite/megafauna - button_icon = 'icons/mob/actions/actions_xeno.dmi' - small_icon = 'icons/mob/simple/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/simple/jungle/arachnid.dmi' - small_icon_state = "arachnid_mini" - background_icon_state = "bg_demon" - overlay_icon_state = "bg_demon_border" - - -/datum/action/small_sprite/space_dragon - small_icon = 'icons/mob/simple/carp.dmi' - small_icon_state = "carp" - button_icon = 'icons/mob/simple/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/sneak.dm b/code/datums/actions/mobs/sneak.dm index 13ae5a784b8c0..3fed4f4d500c7 100644 --- a/code/datums/actions/mobs/sneak.dm +++ b/code/datums/actions/mobs/sneak.dm @@ -1,32 +1,37 @@ -/datum/action/cooldown/sneak +/datum/action/cooldown/mob_cooldown/sneak name = "Sneak" - desc = "Sneak into the enviorment." + desc = "Blend into the environment." button_icon = 'icons/mob/actions/actions_animal.dmi' button_icon_state = "sniper_zoom" background_icon_state = "bg_alien" overlay_icon_state = "bg_alien_border" check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED | AB_CHECK_INCAPACITATED + cooldown_time = 0.5 SECONDS + melee_cooldown_time = 0 SECONDS + click_to_activate = FALSE /// The alpha we go to when sneaking. var/sneak_alpha = 75 + /// How long it takes to become transparent + var/animation_time = 0.5 SECONDS -/datum/action/cooldown/sneak/Remove(mob/living/remove_from) +/datum/action/cooldown/mob_cooldown/sneak/Remove(mob/living/remove_from) if(HAS_TRAIT(remove_from, TRAIT_SNEAK)) remove_from.alpha = initial(remove_from.alpha) REMOVE_TRAIT(remove_from, TRAIT_SNEAK, name) return ..() -/datum/action/cooldown/sneak/Activate(atom/target) +/datum/action/cooldown/mob_cooldown/sneak/Activate(atom/target) if(HAS_TRAIT(owner, TRAIT_SNEAK)) // It's safest to go to the initial alpha of the mob. // Otherwise we get permanent invisbility exploits. - owner.alpha = initial(owner.alpha) - to_chat(owner, span_noticealien("You reveal yourself!")) + animate(owner, alpha = initial(owner.alpha), time = animation_time) + owner.balloon_alert(owner, "you reveal yourself") REMOVE_TRAIT(owner, TRAIT_SNEAK, name) else - owner.alpha = sneak_alpha - to_chat(owner, span_noticealien("You blend into the enviorment...")) + animate(owner, alpha = sneak_alpha, time = animation_time) + owner.balloon_alert(owner, "you blend into the environment") ADD_TRAIT(owner, TRAIT_SNEAK, name) return TRUE diff --git a/code/datums/actions/mobs/transform_weapon.dm b/code/datums/actions/mobs/transform_weapon.dm index 884f4fa36dc54..3abeed5dfbfa7 100644 --- a/code/datums/actions/mobs/transform_weapon.dm +++ b/code/datums/actions/mobs/transform_weapon.dm @@ -1,6 +1,6 @@ /datum/action/cooldown/mob_cooldown/transform_weapon name = "Transform Weapon" - button_icon = 'icons/obj/lavaland/artefacts.dmi' + button_icon = 'icons/obj/mining_zones/artefacts.dmi' button_icon_state = "cleaving_saw" desc = "Transform weapon into a different state." cooldown_time = 5 SECONDS @@ -20,9 +20,7 @@ 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":""]" + var/saw_open = HAS_TRAIT(miner_saw, TRAIT_TRANSFORM_ACTIVE) + BDM.rapid_melee = saw_open ? 3 : 5 + BDM.icon_state = "miner[saw_open ? "_transformed":""]" + BDM.icon_living = "miner[saw_open ? "_transformed":""]" diff --git a/code/datums/ai/_ai_behavior.dm b/code/datums/ai/_ai_behavior.dm index 9089bb5cf6bdc..98ab8f2fc7e22 100644 --- a/code/datums/ai/_ai_behavior.dm +++ b/code/datums/ai/_ai_behavior.dm @@ -21,11 +21,12 @@ /datum/ai_behavior/proc/finish_action(datum/ai_controller/controller, succeeded, ...) LAZYREMOVE(controller.current_behaviors, src) controller.behavior_args -= type - if(behavior_flags & AI_BEHAVIOR_REQUIRE_MOVEMENT) //If this was a movement task, reset our movement target if necessary - if(!(behavior_flags & AI_BEHAVIOR_KEEP_MOVE_TARGET_ON_FINISH)) - clear_movement_target(controller) - if(!(behavior_flags & AI_BEHAVIOR_KEEP_MOVING_TOWARDS_TARGET_ON_FINISH)) - controller.ai_movement.stop_moving_towards(controller) + if(!(behavior_flags & AI_BEHAVIOR_REQUIRE_MOVEMENT)) //If this was a movement task, reset our movement target if necessary + return + if(behavior_flags & AI_BEHAVIOR_KEEP_MOVE_TARGET_ON_FINISH) + return + clear_movement_target(controller) + controller.ai_movement.stop_moving_towards(controller) /// Helper proc to ensure consistency in setting the source of the movement target /datum/ai_behavior/proc/set_movement_target(datum/ai_controller/controller, atom/target, datum/ai_movement/new_movement) diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm index 0345fccba0c81..7a30648030272 100644 --- a/code/datums/ai/_ai_controller.dm +++ b/code/datums/ai/_ai_controller.dm @@ -50,8 +50,6 @@ multiple modular subtrees with behaviors // Movement related things here ///Reference to the movement datum we use. Is a type on initialize but becomes a ref afterwards. var/datum/ai_movement/ai_movement = /datum/ai_movement/dumb - ///Cooldown until next movement - COOLDOWN_DECLARE(movement_cooldown) ///Delay between movements. This is on the controller so we can keep the movement datum singleton var/movement_delay = 0.1 SECONDS @@ -66,7 +64,8 @@ multiple modular subtrees with behaviors if(idle_behavior) idle_behavior = new idle_behavior() - PossessPawn(new_pawn) + if(!isnull(new_pawn)) // unit tests need the ai_controller to exist in isolation due to list schenanigans i hate it here + PossessPawn(new_pawn) /datum/ai_controller/Destroy(force, ...) set_ai_status(AI_STATUS_OFF) @@ -150,6 +149,9 @@ multiple modular subtrees with behaviors ///Proc for deinitializing the pawn to the old controller /datum/ai_controller/proc/UnpossessPawn(destroy) + if(isnull(pawn)) + return // instantiated without an applicable pawn, fine + UnregisterSignal(pawn, list(COMSIG_MOB_LOGIN, COMSIG_MOB_LOGOUT, COMSIG_MOB_STATCHANGE)) if(ai_movement.moving_controllers[src]) ai_movement.stop_moving_towards(src) @@ -157,7 +159,6 @@ multiple modular subtrees with behaviors pawn = null if(destroy) qdel(src) - return ///Returns TRUE if the ai controller can actually run at the moment. /datum/ai_controller/proc/able_to_run() @@ -348,6 +349,11 @@ multiple modular subtrees with behaviors minimum_distance = iter_behavior.required_distance return minimum_distance +/// Returns true if we have a blackboard key with the provided key and it is not qdeleting +/datum/ai_controller/proc/blackboard_key_exists(key) + var/datum/key_value = blackboard[key] + return !QDELETED(key_value) + /** * Used to manage references to datum by AI controllers * @@ -398,6 +404,9 @@ multiple modular subtrees with behaviors // Assume it is an error when trying to set a value overtop a list if(islist(blackboard[key])) CRASH("set_blackboard_key attempting to set a blackboard value to key [key] when it's a list!") + // Don't do anything if it's already got this value + if (blackboard[key] == thing) + return // Clear existing values if(!isnull(blackboard[key])) @@ -405,6 +414,7 @@ multiple modular subtrees with behaviors TRACK_AI_DATUM_TARGET(thing, key) blackboard[key] = thing + post_blackboard_key_set(key) /** * Sets the key at index thing to the passed value @@ -418,9 +428,14 @@ multiple modular subtrees with behaviors /datum/ai_controller/proc/set_blackboard_key_assoc(key, thing, value) if(!islist(blackboard[key])) CRASH("set_blackboard_key_assoc called on non-list key [key]!") + // Don't do anything if it's already got this value + if (blackboard[key][thing] == value) + return + TRACK_AI_DATUM_TARGET(thing, key) TRACK_AI_DATUM_TARGET(value, key) blackboard[key][thing] = value + post_blackboard_key_set(key) /** * Similar to [proc/set_blackboard_key_assoc] but operates under the assumption the key is a lazylist (so it will create a list) @@ -432,9 +447,22 @@ multiple modular subtrees with behaviors */ /datum/ai_controller/proc/set_blackboard_key_assoc_lazylist(key, thing, value) LAZYINITLIST(blackboard[key]) + // Don't do anything if it's already got this value + if (blackboard[key][thing] == value) + return + TRACK_AI_DATUM_TARGET(thing, key) TRACK_AI_DATUM_TARGET(value, key) blackboard[key][thing] = value + post_blackboard_key_set(key) + +/** + * Called after we set a blackboard key, forwards signal information. + */ +/datum/ai_controller/proc/post_blackboard_key_set(key) + if (isnull(pawn)) + return + SEND_SIGNAL(pawn, COMSIG_AI_BLACKBOARD_KEY_SET(key)) /** * Adds the passed "thing" to the associated key @@ -522,8 +550,13 @@ multiple modular subtrees with behaviors * * key - A blackboard key */ /datum/ai_controller/proc/clear_blackboard_key(key) + if(isnull(blackboard[key])) + return CLEAR_AI_DATUM_TARGET(blackboard[key], key) blackboard[key] = null + if(isnull(pawn)) + return + SEND_SIGNAL(pawn, COMSIG_AI_BLACKBOARD_KEY_CLEARED(key)) /** * Remove the passed thing from the associated blackboard key diff --git a/code/datums/ai/_ai_planning_subtree.dm b/code/datums/ai/_ai_planning_subtree.dm index 6560e91c00f7f..b3f0ae9fb533a 100644 --- a/code/datums/ai/_ai_planning_subtree.dm +++ b/code/datums/ai/_ai_planning_subtree.dm @@ -1,6 +1,9 @@ ///A subtree is attached to a controller and is occasionally called by /ai_controller/SelectBehaviors(), this mainly exists to act as a way to subtype and modify SelectBehaviors() without needing to subtype the ai controller itself /datum/ai_planning_subtree - + /// A list of typepaths of "operational datums" (elements/components) we absolutely NEED to run. Checked in unit tests, as well as be a nice reminder to developers that such a thing might be needed. + /// Note that in the Attach/Inititalize/New (or any future equivalent for these procs), you will need to add the trait TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM to the mob in question + /// in order for unit tests to succeed. This will break obviously enough if you don't do this and declare the required datum here however. + var/list/operational_datums = null ///Determines what behaviors should the controller try processing; if this returns SUBTREE_RETURN_FINISH_PLANNING then the controller won't go through the other subtrees should multiple exist in controller.planning_subtrees /datum/ai_planning_subtree/proc/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) diff --git a/code/datums/ai/babies/babies_subtrees.dm b/code/datums/ai/babies/babies_subtrees.dm index 0c71b6d757b0d..aad92f8422e85 100644 --- a/code/datums/ai/babies/babies_subtrees.dm +++ b/code/datums/ai/babies/babies_subtrees.dm @@ -20,13 +20,8 @@ if(is_type_in_list(controller.pawn, baby_types)) return - var/atom/target = controller.blackboard[BB_BABIES_TARGET] - // Find target - if(QDELETED(target)) - controller.queue_behavior(/datum/ai_behavior/find_partner, BB_BABIES_TARGET, BB_BABIES_PARTNER_TYPES, BB_BABIES_CHILD_TYPES) - return - - // Do target - controller.queue_behavior(/datum/ai_behavior/make_babies, BB_BABIES_TARGET, BB_BABIES_CHILD_TYPES) - return SUBTREE_RETURN_FINISH_PLANNING + if(controller.blackboard_key_exists(BB_BABIES_TARGET)) + controller.queue_behavior(/datum/ai_behavior/make_babies, BB_BABIES_TARGET, BB_BABIES_CHILD_TYPES) + return SUBTREE_RETURN_FINISH_PLANNING + controller.queue_behavior(/datum/ai_behavior/find_partner, BB_BABIES_TARGET, BB_BABIES_PARTNER_TYPES, BB_BABIES_CHILD_TYPES) diff --git a/code/datums/ai/basic_mobs/base_basic_controller.dm b/code/datums/ai/basic_mobs/base_basic_controller.dm index b4f7c27c2f914..cd025b28bcb2b 100644 --- a/code/datums/ai/basic_mobs/base_basic_controller.dm +++ b/code/datums/ai/basic_mobs/base_basic_controller.dm @@ -15,10 +15,16 @@ /datum/ai_controller/basic_controller/able_to_run() . = ..() - if(isliving(pawn)) - var/mob/living/living_pawn = pawn - if(IS_DEAD_OR_INCAP(living_pawn)) - return FALSE + if(!isliving(pawn)) + return + var/mob/living/living_pawn = pawn + var/incap_flags = NONE + if (ai_traits & CAN_ACT_IN_STASIS) + incap_flags |= IGNORE_STASIS + if(!(ai_traits & CAN_ACT_WHILE_DEAD) && (living_pawn.incapacitated(incap_flags) || living_pawn.stat)) + return FALSE + if(ai_traits & PAUSE_DURING_DO_AFTER && LAZYLEN(living_pawn.do_afters)) + return FALSE /datum/ai_controller/basic_controller/proc/update_speed(mob/living/basic/basic_mob) SIGNAL_HANDLER diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm index fee9160e5c02d..91ba7ec489415 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm @@ -1,11 +1,10 @@ /datum/ai_behavior/basic_melee_attack - action_cooldown = 2 SECONDS + action_cooldown = 0.2 SECONDS // We gotta check unfortunately often because we're in a race condition with nextmove behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION /datum/ai_behavior/basic_melee_attack/setup(datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) . = ..() - var/datum/targetting_datum/targetting_datum = controller.blackboard[targetting_datum_key] - if(isnull(targetting_datum)) + if(!controller.blackboard_key_exists(targetting_datum_key)) CRASH("No target datum was supplied in the blackboard for [controller.pawn]") //Hiding location is priority @@ -16,6 +15,11 @@ set_movement_target(controller, target) /datum/ai_behavior/basic_melee_attack/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) + if (isliving(controller.pawn)) + var/mob/living/pawn = controller.pawn + if (world.time < pawn.next_move) + return + . = ..() var/mob/living/basic/basic_mob = controller.pawn //targetting datum will kill the action if not real anymore @@ -41,17 +45,14 @@ if(!succeeded) controller.clear_blackboard_key(target_key) -/datum/ai_behavior/basic_melee_attack/average_speed - action_cooldown = 1 SECONDS - /datum/ai_behavior/basic_ranged_attack action_cooldown = 0.6 SECONDS behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM required_distance = 3 - /// How many shots to fire - var/shots = 1 - /// The interval between individual shots in a burst - var/burst_interval = 0.2 SECONDS + /// range we will try chasing the target before giving up + var/chase_range = 9 + ///do we care about avoiding friendly fire? + var/avoid_friendly_fire = FALSE /datum/ai_behavior/basic_ranged_attack/setup(datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) . = ..() @@ -61,13 +62,12 @@ set_movement_target(controller, target) /datum/ai_behavior/basic_ranged_attack/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) - . = ..() var/mob/living/basic/basic_mob = controller.pawn //targetting datum will kill the action if not real anymore var/atom/target = controller.blackboard[target_key] var/datum/targetting_datum/targetting_datum = controller.blackboard[targetting_datum_key] - if(!targetting_datum.can_attack(basic_mob, target)) + if(!targetting_datum.can_attack(basic_mob, target, chase_range)) finish_action(controller, FALSE, target_key) return @@ -75,21 +75,66 @@ var/atom/final_target = hiding_target ? hiding_target : target if(!can_see(basic_mob, final_target, required_distance)) - finish_action(controller, FALSE, target_key) return - controller.set_blackboard_key(hiding_location_key, hiding_target) + if(avoid_friendly_fire && check_friendly_in_path(basic_mob, target, targetting_datum)) + adjust_position(basic_mob, target) + return ..() - if(shots>1) - var/atom/burst_target = final_target - var/datum/callback/callback = CALLBACK(basic_mob, TYPE_PROC_REF(/mob/living/basic,RangedAttack), burst_target) - for(var/i in 2 to shots) - addtimer(callback, (i - 1) * burst_interval) - callback.Invoke() - else - basic_mob.RangedAttack(final_target) + controller.set_blackboard_key(hiding_location_key, hiding_target) + basic_mob.RangedAttack(final_target) + return ..() //only start the cooldown when the shot is shot /datum/ai_behavior/basic_ranged_attack/finish_action(datum/ai_controller/controller, succeeded, target_key, targetting_datum_key, hiding_location_key) . = ..() if(!succeeded) controller.clear_blackboard_key(target_key) + +/datum/ai_behavior/basic_ranged_attack/proc/check_friendly_in_path(mob/living/source, atom/target, datum/targetting_datum/targetting_datum) + var/list/turfs_list = calculate_trajectory(source, target) + for(var/turf/possible_turf as anything in turfs_list) + + for(var/mob/living/potential_friend in possible_turf) + if(!targetting_datum.can_attack(source, potential_friend)) + return TRUE + + return FALSE + +/datum/ai_behavior/basic_ranged_attack/proc/adjust_position(mob/living/living_pawn, atom/target) + var/turf/our_turf = get_turf(living_pawn) + var/list/possible_turfs = list() + + for(var/direction in GLOB.alldirs) + var/turf/target_turf = get_step(our_turf, direction) + if(isnull(target_turf)) + continue + if(target_turf.is_blocked_turf() || get_dist(target_turf, target) > get_dist(living_pawn, target)) + continue + possible_turfs += target_turf + + if(!length(possible_turfs)) + return + var/turf/picked_turf = get_closest_atom(/turf, possible_turfs, target) + step(living_pawn, get_dir(living_pawn, picked_turf)) + +/datum/ai_behavior/basic_ranged_attack/proc/calculate_trajectory(mob/living/source , atom/target) + var/list/turf_list = get_line(source, target) + var/list_length = length(turf_list) - 1 + for(var/i in 1 to list_length) + var/turf/current_turf = turf_list[i] + var/turf/next_turf = turf_list[i+1] + var/direction_to_turf = get_dir(current_turf, next_turf) + if(!ISDIAGONALDIR(direction_to_turf)) + continue + + for(var/cardinal_direction in GLOB.cardinals) + if(cardinal_direction & direction_to_turf) + turf_list += get_step(current_turf, cardinal_direction) + + turf_list -= get_turf(source) + turf_list -= get_turf(target) + + return turf_list + +/datum/ai_behavior/basic_ranged_attack/avoid_friendly_fire + avoid_friendly_fire = TRUE diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/climb_tree.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/climb_tree.dm new file mode 100644 index 0000000000000..bb90106602575 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/climb_tree.dm @@ -0,0 +1,34 @@ +/datum/ai_behavior/find_and_set/valid_tree + +/datum/ai_behavior/find_and_set/valid_tree/search_tactic(datum/ai_controller/controller, locate_path, search_range) + var/list/valid_trees = list() + for (var/obj/structure/flora/tree/tree_target in oview(search_range, controller.pawn)) + if(istype(tree_target, /obj/structure/flora/tree/dead)) //no died trees + continue + valid_trees += tree_target + + if(valid_trees.len) + return pick(valid_trees) + +/datum/ai_behavior/climb_tree + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH + +/datum/ai_behavior/climb_tree/setup(datum/ai_controller/controller, target_key) + . = ..() + var/atom/target = controller.blackboard[target_key] + if(QDELETED(target)) + return FALSE + + set_movement_target(controller, target) + +/datum/ai_behavior/climb_tree/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + var/obj/structure/flora/target_tree = controller.blackboard[target_key] + var/mob/living/basic/living_pawn = controller.pawn + SEND_SIGNAL(living_pawn, COMSIG_LIVING_CLIMB_TREE, target_tree) + finish_action(controller, TRUE, target_key) + +/datum/ai_behavior/climb_tree/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + if(succeeded) + controller.clear_blackboard_key(target_key) diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/find_mineable_wall.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/find_mineable_wall.dm new file mode 100644 index 0000000000000..ad5749c916111 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/find_mineable_wall.dm @@ -0,0 +1,33 @@ +//behavior to find mineable mineral walls +/datum/ai_behavior/find_mineral_wall + +/datum/ai_behavior/find_mineral_wall/perform(seconds_per_tick, datum/ai_controller/controller, found_wall_key) + . = ..() + var/mob/living_pawn = controller.pawn + + for(var/turf/closed/mineral/potential_wall in oview(9, living_pawn)) + if(!check_if_mineable(controller, potential_wall)) //check if its surrounded by walls + continue + controller.set_blackboard_key(found_wall_key, potential_wall) //closest wall first! + finish_action(controller, TRUE) + return + + finish_action(controller, FALSE) + +/datum/ai_behavior/find_mineral_wall/proc/check_if_mineable(datum/ai_controller/controller, turf/target_wall) + var/mob/living/source = controller.pawn + var/direction_to_turf = get_dir(target_wall, source) + if(!ISDIAGONALDIR(direction_to_turf)) + return TRUE + var/list/directions_to_check = list() + for(var/direction_check in GLOB.cardinals) + if(direction_check & direction_to_turf) + directions_to_check += direction_check + + for(var/direction in directions_to_check) + var/turf/test_turf = get_step(target_wall, direction) + if(isnull(test_turf)) + continue + if(!test_turf.is_blocked_turf(ignore_atoms = list(source))) + return TRUE + return FALSE diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/find_parent.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/find_parent.dm new file mode 100644 index 0000000000000..9e4ccef493676 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/find_parent.dm @@ -0,0 +1,28 @@ +/datum/ai_behavior/find_mom + ///range to look for the mom + var/look_range = 7 + +/datum/ai_behavior/find_mom/perform(seconds_per_tick, datum/ai_controller/controller, mom_key, ignore_mom_key, found_mom) + . = ..() + + var/mob/living_pawn = controller.pawn + var/list/mom_types = controller.blackboard[mom_key] + var/list/all_moms = list() + var/list/ignore_types = controller.blackboard[ignore_mom_key] + + if(!length(mom_types)) + finish_action(controller, FALSE) + return + + for(var/mob/mother in oview(look_range, living_pawn)) + if(!is_type_in_list(mother, mom_types)) + continue + if(is_type_in_list(mother, ignore_types)) //so the not permanent baby and the permanent baby subtype dont followed each other + continue + all_moms += mother + + if(length(all_moms)) + controller.set_blackboard_key(found_mom, pick(all_moms)) + finish_action(controller, TRUE) + return + finish_action(controller, FALSE) diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm index c082817f4fba0..bd86260ee89ce 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm @@ -4,41 +4,63 @@ action_cooldown = 0 behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION /// How far do we try to run? Further makes for smoother running, but potentially weirder pathfinding - var/run_distance = 9 + var/run_distance = DEFAULT_BASIC_FLEE_DISTANCE + /// Clear target if we finish the action unsuccessfully + var/clear_failed_targets = TRUE /datum/ai_behavior/run_away_from_target/setup(datum/ai_controller/controller, target_key, hiding_location_key) var/atom/target = controller.blackboard[hiding_location_key] || controller.blackboard[target_key] if(QDELETED(target)) return FALSE + run_distance = controller.blackboard[BB_BASIC_MOB_FLEE_DISTANCE] || initial(run_distance) if(!plot_path_away_from(controller, target)) return FALSE return ..() /datum/ai_behavior/run_away_from_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key, hiding_location_key) . = ..() + if (!controller.blackboard[BB_BASIC_MOB_FLEEING]) + return var/atom/target = controller.blackboard[hiding_location_key] || controller.blackboard[target_key] - var/escaped = QDELETED(target) || !can_see(controller.pawn, target, run_distance) // If we can't see it we got away - if (escaped) + if (QDELETED(target) || !can_see(controller.pawn, target, run_distance)) finish_action(controller, succeeded = TRUE, target_key = target_key, hiding_location_key = hiding_location_key) return - if (get_dist(controller.pawn, controller.current_movement_target) > required_distance) - return - if(plot_path_away_from(controller, target)) + if (get_dist(controller.pawn, controller.current_movement_target) >= required_distance) + return // Still heading over + if (plot_path_away_from(controller, target)) return finish_action(controller, succeeded = FALSE, target_key = target_key, hiding_location_key = hiding_location_key) /datum/ai_behavior/run_away_from_target/proc/plot_path_away_from(datum/ai_controller/controller, atom/target) var/turf/target_destination = get_turf(controller.pawn) - for (var/i in 1 to run_distance) - var/turf/test_destination = get_ranged_target_turf_direct(controller.pawn, target, range = i, offset = 180) - if (test_destination.is_blocked_turf(exclude_mobs = TRUE, source_atom = controller.pawn, ignore_atoms = GLOB.airlocks)) + var/static/list/offset_angles = list(45, 90, 135, 180, 225, 270) + for(var/angle in offset_angles) + var/turf/test_turf = get_furthest_turf(controller.pawn, angle, target) + if(isnull(test_turf)) + continue + var/distance_from_target = get_dist(target, test_turf) + if(distance_from_target <= get_dist(target, target_destination)) + continue + target_destination = test_turf + if(distance_from_target == run_distance) //we already got the max running distance break - target_destination = test_destination + if (target_destination == get_turf(controller.pawn)) return FALSE set_movement_target(controller, target_destination) return TRUE +/datum/ai_behavior/run_away_from_target/proc/get_furthest_turf(atom/source, angle, atom/target) + var/turf/return_turf + var/list/airlocks = SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/airlock) + for(var/i in 1 to run_distance) + var/turf/test_destination = get_ranged_target_turf_direct(source, target, range = i, offset = angle) + if(test_destination.is_blocked_turf(exclude_mobs = !source.density, source_atom = source, ignore_atoms = airlocks)) + break + return_turf = test_destination + return return_turf + /datum/ai_behavior/run_away_from_target/finish_action(datum/ai_controller/controller, succeeded, target_key, hiding_location_key) . = ..() - controller.clear_blackboard_key(target_key) + if (clear_failed_targets) + controller.clear_blackboard_key(target_key) diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/targeted_mob_ability.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/targeted_mob_ability.dm index b737a8bcdd21c..ba167b34f2951 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/targeted_mob_ability.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/targeted_mob_ability.dm @@ -5,13 +5,14 @@ /datum/ai_behavior/targeted_mob_ability /datum/ai_behavior/targeted_mob_ability/perform(seconds_per_tick, datum/ai_controller/controller, ability_key, target_key) - var/datum/action/cooldown/ability = controller.blackboard[ability_key] + var/datum/action/cooldown/ability = get_ability_to_use(controller, ability_key) var/mob/living/target = controller.blackboard[target_key] if(QDELETED(ability) || QDELETED(target)) finish_action(controller, FALSE, ability_key, target_key) return var/mob/pawn = controller.pawn - var/result = ability.InterceptClickOn(pawn, null, target) + pawn.face_atom(target) + var/result = ability.Trigger(target = target) finish_action(controller, result, ability_key, target_key) /datum/ai_behavior/targeted_mob_ability/finish_action(datum/ai_controller/controller, succeeded, ability_key, target_key) @@ -19,12 +20,9 @@ var/atom/target = controller.blackboard[target_key] if (QDELETED(target)) controller.clear_blackboard_key(target_key) - return - if (!isliving(target)) - return - var/mob/living/living_target = target - if(living_target.stat >= UNCONSCIOUS) - controller.clear_blackboard_key(target_key) + +/datum/ai_behavior/targeted_mob_ability/proc/get_ability_to_use(datum/ai_controller/controller, ability_key) + return controller.blackboard[ability_key] /** * # Try Mob Ability and plan execute @@ -46,3 +44,17 @@ /datum/ai_behavior/targeted_mob_ability/and_clear_target/finish_action(datum/ai_controller/controller, succeeded, ability_key, target_key) . = ..() controller.clear_blackboard_key(target_key) + +/** + * Attempts to move into the provided range and then use a mob's cooldown ability on a target + */ +/datum/ai_behavior/targeted_mob_ability/min_range + required_distance = 6 + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT + +/datum/ai_behavior/targeted_mob_ability/min_range/setup(datum/ai_controller/controller, ability_key, target_key) + . = ..() + var/atom/target = controller.blackboard[target_key] + if(QDELETED(target)) + return FALSE + set_movement_target(controller, target) diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/targetting.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/targetting.dm index a5dba85febc42..376f62a5855b5 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/targetting.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/targetting.dm @@ -2,6 +2,8 @@ action_cooldown = 2 SECONDS /// How far can we see stuff? var/vision_range = 9 + /// Blackboard key for aggro range, uses vision range if not specified + var/aggro_range_key = BB_AGGRO_RANGE /// Static typecache list of potentially dangerous objs var/static/list/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/vehicle/sealed/mecha)) @@ -14,15 +16,18 @@ CRASH("No target datum was supplied in the blackboard for [controller.pawn]") var/atom/current_target = controller.blackboard[target_key] - if (targetting_datum.can_attack(living_mob, current_target)) + if (targetting_datum.can_attack(living_mob, current_target, vision_range)) finish_action(controller, succeeded = FALSE) return + var/aggro_range = controller.blackboard[aggro_range_key] || vision_range + controller.clear_blackboard_key(target_key) - var/list/potential_targets = hearers(vision_range, controller.pawn) - living_mob //Remove self, so we don't suicide - for(var/HM in typecache_filter_list(range(vision_range, living_mob), hostile_machines)) //Can we see any hostile machines? - if(can_see(living_mob, HM, vision_range)) + var/list/potential_targets = hearers(aggro_range, get_turf(controller.pawn)) - living_mob //Remove self, so we don't suicide + + for(var/HM in typecache_filter_list(range(aggro_range, living_mob), hostile_machines)) //Can we see any hostile machines? + if(can_see(living_mob, HM, aggro_range)) potential_targets += HM if(!potential_targets.len) diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/travel_towards.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/travel_towards.dm index bbc1a43e32248..55f6ef4c4c00e 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/travel_towards.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/travel_towards.dm @@ -6,6 +6,8 @@ /datum/ai_behavior/travel_towards required_distance = 0 behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + /// If true we will get rid of our target on completion + var/clear_target = FALSE /datum/ai_behavior/travel_towards/setup(datum/ai_controller/controller, target_key) . = ..() @@ -16,7 +18,15 @@ /datum/ai_behavior/travel_towards/perform(seconds_per_tick, datum/ai_controller/controller, target_key) . = ..() - finish_action(controller, TRUE) + finish_action(controller, TRUE, target_key) + +/datum/ai_behavior/travel_towards/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + if (clear_target) + controller.clear_blackboard_key(target_key) + +/datum/ai_behavior/travel_towards/stop_on_arrival + clear_target = TRUE /** * # Travel Towards Atom diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/write_on_paper.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/write_on_paper.dm new file mode 100644 index 0000000000000..f5dba58416d28 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/write_on_paper.dm @@ -0,0 +1,16 @@ +/datum/ai_behavior/write_on_paper + +/datum/ai_behavior/write_on_paper/perform(seconds_per_tick, datum/ai_controller/controller, found_paper, list_of_writings) + . = ..() + var/mob/living/wizard = controller.pawn + var/list/writing_list = controller.blackboard[list_of_writings] + var/obj/item/paper/target = controller.blackboard[found_paper] + if(length(writing_list)) + target.add_raw_text(pick(writing_list)) + target.update_appearance() + wizard.dropItemToGround(target) + finish_action(controller, TRUE, found_paper) + +/datum/ai_behavior/write_on_paper/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + controller.clear_blackboard_key(target_key) diff --git a/code/datums/ai/basic_mobs/basic_subtrees/attack_adjacent_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/attack_adjacent_target.dm new file mode 100644 index 0000000000000..c3d334165d95c --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/attack_adjacent_target.dm @@ -0,0 +1,33 @@ +/// Attack something which is already adjacent to us, without ending planning +/datum/ai_planning_subtree/basic_melee_attack_subtree/opportunistic + melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/opportunistic + end_planning = FALSE + +/datum/ai_planning_subtree/basic_melee_attack_subtree/opportunistic/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + . = ..() + var/atom/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + if(QDELETED(target) || !controller.pawn.Adjacent(target)) + return + if (isliving(controller.pawn)) + var/mob/living/pawn = controller.pawn + if (LAZYLEN(pawn.do_afters)) + return + controller.queue_behavior(melee_attack_behavior, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) + +/// Attack something which is already adjacent to us without moving +/datum/ai_behavior/basic_melee_attack/opportunistic + action_cooldown = 0.2 SECONDS // We gotta check unfortunately often because we're in a race condition with nextmove + behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + +/datum/ai_behavior/basic_melee_attack/opportunistic/setup(datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) + if (!controller.blackboard_key_exists(targetting_datum_key)) + CRASH("No target datum was supplied in the blackboard for [controller.pawn]") + return controller.blackboard_key_exists(target_key) + +/datum/ai_behavior/basic_melee_attack/opportunistic/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) + var/atom/movable/atom_pawn = controller.pawn + if(!atom_pawn.CanReach(controller.blackboard[target_key])) + finish_action(controller, TRUE, target_key) // Don't clear target + return FALSE + . = ..() + finish_action(controller, TRUE, target_key) // Try doing something else diff --git a/code/datums/ai/basic_mobs/basic_subtrees/climb_tree.dm b/code/datums/ai/basic_mobs/basic_subtrees/climb_tree.dm new file mode 100644 index 0000000000000..bad349030f1b4 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/climb_tree.dm @@ -0,0 +1,15 @@ +/datum/ai_planning_subtree/climb_trees + operational_datums = list(/datum/component/tree_climber) + ///chance to climb a tree + var/climb_chance = 35 + +/datum/ai_planning_subtree/climb_trees/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + + if(!SPT_PROB(climb_chance, seconds_per_tick)) + return + + if(controller.blackboard_key_exists(BB_CLIMBED_TREE)) + controller.queue_behavior(/datum/ai_behavior/climb_tree, BB_CLIMBED_TREE) + return SUBTREE_RETURN_FINISH_PLANNING + + controller.queue_behavior(/datum/ai_behavior/find_and_set/valid_tree, BB_CLIMBED_TREE, /obj/structure/flora/tree) diff --git a/code/datums/ai/basic_mobs/basic_subtrees/find_food.dm b/code/datums/ai/basic_mobs/basic_subtrees/find_food.dm index 8d20df7b9c792..b02ec8eaa85aa 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/find_food.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/find_food.dm @@ -3,8 +3,7 @@ /datum/ai_planning_subtree/find_food/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) . = ..() - var/atom/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] - if(!QDELETED(target)) + if(controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET)) // Busy with something return diff --git a/code/datums/ai/basic_mobs/basic_subtrees/find_paper_and_write.dm b/code/datums/ai/basic_mobs/basic_subtrees/find_paper_and_write.dm new file mode 100644 index 0000000000000..0d2d0c3e3b44b --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/find_paper_and_write.dm @@ -0,0 +1,22 @@ +/datum/ai_planning_subtree/find_paper_and_write + +/datum/ai_planning_subtree/find_paper_and_write/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/basic/wizard = controller.pawn + + if(controller.blackboard_key_exists(BB_SIMPLE_CARRY_ITEM)) + controller.queue_behavior(/datum/ai_behavior/write_on_paper, BB_SIMPLE_CARRY_ITEM, BB_WRITING_LIST) + return SUBTREE_RETURN_FINISH_PLANNING + + var/obj/item/paper/target = controller.blackboard[BB_FOUND_PAPER] + + if(QDELETED(target)) + controller.queue_behavior(/datum/ai_behavior/find_and_set/empty_paper, BB_FOUND_PAPER, /obj/item/paper) + return + + if(get_turf(wizard) != get_turf(target)) + controller.queue_behavior(/datum/ai_behavior/travel_towards, BB_FOUND_PAPER) + return SUBTREE_RETURN_FINISH_PLANNING + + if(!(target in wizard.contents)) + controller.queue_behavior(/datum/ai_behavior/pick_up_item, BB_FOUND_PAPER, BB_SIMPLE_CARRY_ITEM) + return SUBTREE_RETURN_FINISH_PLANNING diff --git a/code/datums/ai/basic_mobs/basic_subtrees/find_parent.dm b/code/datums/ai/basic_mobs/basic_subtrees/find_parent.dm new file mode 100644 index 0000000000000..2c65dfbb6a97e --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/find_parent.dm @@ -0,0 +1,25 @@ +/datum/ai_planning_subtree/look_for_adult + ///how far we must be from the mom + var/minimum_distance = 1 + +/datum/ai_planning_subtree/look_for_adult/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/target = controller.blackboard[BB_FOUND_MOM] + var/mob/baby = controller.pawn + + if(QDELETED(target)) + controller.queue_behavior(/datum/ai_behavior/find_mom, BB_FIND_MOM_TYPES, BB_IGNORE_MOM_TYPES, BB_FOUND_MOM) + return + + if(get_dist(target, baby) > minimum_distance) + controller.queue_behavior(/datum/ai_behavior/travel_towards, BB_FOUND_MOM) + return SUBTREE_RETURN_FINISH_PLANNING + + if(!SPT_PROB(15, seconds_per_tick)) + return + + if(target.stat == DEAD) + controller.queue_behavior(/datum/ai_behavior/perform_emote, "cries for their parent!") + else + controller.queue_behavior(/datum/ai_behavior/perform_emote, "dances around their parent!") + + return SUBTREE_RETURN_FINISH_PLANNING diff --git a/code/datums/ai/basic_mobs/basic_subtrees/flee_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/flee_target.dm index 6ae7885618b97..8d1391f7c7dda 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/flee_target.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/flee_target.dm @@ -9,11 +9,13 @@ /datum/ai_planning_subtree/flee_target/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) . = ..() - if (!controller.blackboard[BB_BASIC_MOB_FLEEING]) + var/atom/flee_from = controller.blackboard[target_key] + if (!controller.blackboard[BB_BASIC_MOB_FLEEING] || QDELETED(flee_from)) return - var/atom/target = controller.blackboard[target_key] - if(QDELETED(target)) + var/flee_distance = controller.blackboard[BB_BASIC_MOB_FLEE_DISTANCE] || DEFAULT_BASIC_FLEE_DISTANCE + if (get_dist(controller.pawn, flee_from) >= flee_distance) return + controller.queue_behavior(flee_behaviour, target_key, hiding_place_key) return SUBTREE_RETURN_FINISH_PLANNING //we gotta get out of here. diff --git a/code/datums/ai/basic_mobs/basic_subtrees/maintain_distance.dm b/code/datums/ai/basic_mobs/basic_subtrees/maintain_distance.dm new file mode 100644 index 0000000000000..c09e7cdbf75f9 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/maintain_distance.dm @@ -0,0 +1,82 @@ +/// Step away if too close, or towards if too far +/datum/ai_planning_subtree/maintain_distance + /// Blackboard key holding atom we want to stay away from + var/target_key = BB_BASIC_MOB_CURRENT_TARGET + /// How close will we allow our target to get? + var/minimum_distance = 4 + /// How far away will we allow our target to get? + var/maximum_distance = 6 + /// How far do we look for our target? + var/view_distance = 10 + +/datum/ai_planning_subtree/maintain_distance/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + . = ..() + var/atom/target = controller.blackboard[target_key] + if (!isliving(target) || !can_see(controller.pawn, target, view_distance)) + return // Don't run away from cucumbers, they're not snakes + var/range = get_dist(controller.pawn, target) + if (range < minimum_distance) + controller.queue_behavior(/datum/ai_behavior/step_away, target_key) + return + if (range > maximum_distance) + controller.queue_behavior(/datum/ai_behavior/pursue_to_range, target_key, maximum_distance) + return + +/// Take one step away +/datum/ai_behavior/step_away + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + required_distance = 0 + action_cooldown = 0.2 SECONDS + +/datum/ai_behavior/step_away/setup(datum/ai_controller/controller, target_key) + . = ..() + var/atom/current_target = controller.blackboard[target_key] + if (QDELETED(current_target)) + return FALSE + + var/mob/living/our_pawn = controller.pawn + our_pawn.face_atom(current_target) + + var/turf/next_step = get_step_away(controller.pawn, current_target) + if (!isnull(next_step) && !next_step.is_blocked_turf(exclude_mobs = TRUE)) + set_movement_target(controller, target = next_step, new_movement = /datum/ai_movement/basic_avoidance/backstep) + return TRUE + + var/list/all_dirs = GLOB.alldirs.Copy() + all_dirs -= get_dir(controller.pawn, next_step) + all_dirs -= get_dir(controller.pawn, current_target) + shuffle_inplace(all_dirs) + + for (var/dir in all_dirs) + next_step = get_step(controller.pawn, dir) + if (!isnull(next_step) && !next_step.is_blocked_turf(exclude_mobs = TRUE)) + set_movement_target(controller, target = next_step, new_movement = /datum/ai_movement/basic_avoidance/backstep) + return TRUE + return FALSE + +/datum/ai_behavior/step_away/perform(seconds_per_tick, datum/ai_controller/controller) + . = ..() + finish_action(controller, succeeded = TRUE) + +/datum/ai_behavior/step_away/finish_action(datum/ai_controller/controller, succeeded) + . = ..() + controller.change_ai_movement_type(initial(controller.ai_movement)) + +/// Pursue a target until we are within a provided range +/datum/ai_behavior/pursue_to_range + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION | AI_BEHAVIOR_MOVE_AND_PERFORM + +/datum/ai_behavior/pursue_to_range/setup(datum/ai_controller/controller, target_key, range) + . = ..() + var/atom/current_target = controller.blackboard[target_key] + if (QDELETED(current_target)) + return FALSE + if (get_dist(controller.pawn, current_target) <= range) + return FALSE + set_movement_target(controller, current_target) + +/datum/ai_behavior/pursue_to_range/perform(seconds_per_tick, datum/ai_controller/controller, target_key, range) + var/atom/current_target = controller.blackboard[target_key] + if (!QDELETED(current_target) && get_dist(controller.pawn, current_target) > range) + return + finish_action(controller, succeeded = TRUE) diff --git a/code/datums/ai/basic_mobs/basic_subtrees/move_to_cardinal.dm b/code/datums/ai/basic_mobs/basic_subtrees/move_to_cardinal.dm new file mode 100644 index 0000000000000..c98878e0fd71f --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/move_to_cardinal.dm @@ -0,0 +1,71 @@ +/// Try to line up with a cardinal direction of your target +/datum/ai_planning_subtree/move_to_cardinal + /// Behaviour to execute to line ourselves up + var/move_behaviour = /datum/ai_behavior/move_to_cardinal + /// Blackboard key in which to store selected target + var/target_key = BB_BASIC_MOB_CURRENT_TARGET + +/datum/ai_planning_subtree/move_to_cardinal/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + . = ..() + if(!controller.blackboard_key_exists(target_key)) + return + controller.queue_behavior(move_behaviour, target_key) + +/// Try to line up with a cardinal direction of your target +/datum/ai_behavior/move_to_cardinal + required_distance = 0 + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + /// How close to our target is too close? + var/minimum_distance = 1 + /// How far away is too far? + var/maximum_distance = 9 + +/datum/ai_behavior/move_to_cardinal/setup(datum/ai_controller/controller, target_key) + var/atom/target = controller.blackboard[target_key] + if(QDELETED(target)) + return FALSE + target_nearest_cardinal(controller, target) + return TRUE + +/// Set our movement target to the closest cardinal space to our target +/datum/ai_behavior/move_to_cardinal/proc/target_nearest_cardinal(datum/ai_controller/controller, atom/target) + var/atom/move_target + var/closest = INFINITY + + for (var/dir in GLOB.cardinals) + var/turf/cardinal_turf = get_ranged_target_turf(target, dir, minimum_distance) + if (cardinal_turf.is_blocked_turf()) + continue + var/distance_to = get_dist(controller.pawn, cardinal_turf) + if (distance_to >= closest) + continue + closest = distance_to + move_target = cardinal_turf + + if (isnull(move_target)) + move_target = target + if (controller.current_movement_target == move_target) + return + set_movement_target(controller, move_target) + +/datum/ai_behavior/move_to_cardinal/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + var/atom/target = controller.blackboard[target_key] + if (QDELETED(target)) + finish_action(controller = controller, succeeded = FALSE, target_key = target_key) + return + if (!(get_dir(controller.pawn, target) in GLOB.cardinals)) + target_nearest_cardinal(controller, target) + return + var/distance_to_target = get_dist(controller.pawn, target) + if (distance_to_target < minimum_distance) + target_nearest_cardinal(controller, target) + return + if (distance_to_target > maximum_distance) + return + finish_action(controller = controller, succeeded = TRUE, target_key = target_key) + return + +/datum/ai_behavior/move_to_cardinal/finish_action(datum/ai_controller/controller, succeeded, target_key) + if (!succeeded) + controller.clear_blackboard_key(target_key) + return ..() diff --git a/code/datums/ai/basic_mobs/basic_subtrees/ranged_skirmish.dm b/code/datums/ai/basic_mobs/basic_subtrees/ranged_skirmish.dm new file mode 100644 index 0000000000000..1ff752d925ffa --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/ranged_skirmish.dm @@ -0,0 +1,52 @@ +/// Fire a ranged attack without interrupting movement. +/datum/ai_planning_subtree/ranged_skirmish + operational_datums = list(/datum/component/ranged_attacks) + /// Blackboard key holding target atom + var/target_key = BB_BASIC_MOB_CURRENT_TARGET + /// What AI behaviour do we actually run? + var/datum/ai_behavior/ranged_skirmish/attack_behavior = /datum/ai_behavior/ranged_skirmish + +/datum/ai_planning_subtree/ranged_skirmish/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + . = ..() + if(!controller.blackboard_key_exists(target_key)) + return + controller.queue_behavior(attack_behavior, target_key, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) + +/// How often will we try to perform our ranged attack? +/datum/ai_behavior/ranged_skirmish + action_cooldown = 1 SECONDS + /// If target is further away than this we don't fire + var/max_range = 9 + /// If target is closer than this we don't fire + var/min_range = 2 + +/datum/ai_behavior/ranged_skirmish/setup(datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) + . = ..() + var/atom/target = controller.blackboard[hiding_location_key] || controller.blackboard[target_key] + return !QDELETED(target) + +/datum/ai_behavior/ranged_skirmish/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) + . = ..() + var/atom/target = controller.blackboard[target_key] + if (QDELETED(target)) + finish_action(controller, succeeded = FALSE) + return + + var/datum/targetting_datum/targetting_datum = controller.blackboard[targetting_datum_key] + if(!targetting_datum.can_attack(controller.pawn, target)) + finish_action(controller, succeeded = FALSE) + return + + var/hiding_target = targetting_datum.find_hidden_mobs(controller.pawn, target) + controller.set_blackboard_key(hiding_location_key, hiding_target) + + target = hiding_target || target + + var/distance = get_dist(controller.pawn, target) + if (distance > max_range || distance < min_range) + finish_action(controller, succeeded = FALSE) + return + + var/mob/living/basic/gunman = controller.pawn + gunman.RangedAttack(target) + finish_action(controller, succeeded = TRUE) diff --git a/code/datums/ai/basic_mobs/basic_subtrees/shapechange_ambush.dm b/code/datums/ai/basic_mobs/basic_subtrees/shapechange_ambush.dm new file mode 100644 index 0000000000000..ff01eb804ff71 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/shapechange_ambush.dm @@ -0,0 +1,41 @@ +/// Shapeshift when we have no target, until someone has been nearby for long enough +/datum/ai_planning_subtree/shapechange_ambush + operational_datums = list(/datum/component/ai_target_timer) + /// Key where we keep our ability + var/ability_key = BB_SHAPESHIFT_ACTION + /// Key where we keep our target + var/target_key = BB_BASIC_MOB_CURRENT_TARGET + /// How long to lull our target into a false sense of security + var/minimum_target_time = 8 SECONDS + +/datum/ai_planning_subtree/shapechange_ambush/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + var/is_shifted = ismob(living_pawn.loc) + var/has_target = controller.blackboard_key_exists(target_key) + var/datum/action/cooldown/using_action = controller.blackboard[ability_key] + + if (!is_shifted) + if (has_target) + return // We're busy + + if (using_action?.IsAvailable()) + controller.queue_behavior(/datum/ai_behavior/use_mob_ability/shapeshift, BB_SHAPESHIFT_ACTION) // Shift + return SUBTREE_RETURN_FINISH_PLANNING + + if (!has_target || !using_action?.IsAvailable()) + return SUBTREE_RETURN_FINISH_PLANNING // Lie in wait + var/time_on_target = controller.blackboard[BB_BASIC_MOB_HAS_TARGET_TIME] || 0 + if (time_on_target < minimum_target_time) + return // Wait a bit longer + controller.queue_behavior(/datum/ai_behavior/use_mob_ability/shapeshift, BB_SHAPESHIFT_ACTION) // Surprise! + +/// Selects a random shapeshift ability before shifting +/datum/ai_behavior/use_mob_ability/shapeshift + +/datum/ai_behavior/use_mob_ability/shapeshift/setup(datum/ai_controller/controller, ability_key) + var/datum/action/cooldown/spell/shapeshift/using_action = controller.blackboard[ability_key] + if (!using_action?.IsAvailable()) + return FALSE + if (isnull(using_action.shapeshift_type)) // If we don't have a shape then pick one, AI can't use context wheels + using_action.shapeshift_type = pick(using_action.possible_shapes) + return ..() diff --git a/code/datums/ai/basic_mobs/basic_subtrees/simple_attack_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/simple_attack_target.dm index 5db0486a43a63..210aaf0aa8b26 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/simple_attack_target.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/simple_attack_target.dm @@ -1,25 +1,24 @@ /datum/ai_planning_subtree/basic_melee_attack_subtree + /// What do we do in order to attack someone? var/datum/ai_behavior/basic_melee_attack/melee_attack_behavior = /datum/ai_behavior/basic_melee_attack + /// Is this the last thing we do? (if we set a movement target, this will usually be yes) + var/end_planning = TRUE /datum/ai_planning_subtree/basic_melee_attack_subtree/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) . = ..() - var/atom/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] - if(QDELETED(target)) + if(!controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET)) return controller.queue_behavior(melee_attack_behavior, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) - return SUBTREE_RETURN_FINISH_PLANNING //we are going into battle...no distractions. - -/datum/ai_planning_subtree/basic_melee_attack_subtree/average_speed - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/average_speed + if (end_planning) + return SUBTREE_RETURN_FINISH_PLANNING //we are going into battle...no distractions. -//If you give this to something without the element you are a dumbass. /datum/ai_planning_subtree/basic_ranged_attack_subtree + operational_datums = list(/datum/component/ranged_attacks) var/datum/ai_behavior/basic_ranged_attack/ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack /datum/ai_planning_subtree/basic_ranged_attack_subtree/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) . = ..() - var/atom/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] - if(QDELETED(target)) + if(!controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET)) return controller.queue_behavior(ranged_attack_behavior, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) return SUBTREE_RETURN_FINISH_PLANNING //we are going into battle...no distractions. diff --git a/code/datums/ai/basic_mobs/basic_subtrees/simple_find_nearest_target_to_flee.dm b/code/datums/ai/basic_mobs/basic_subtrees/simple_find_nearest_target_to_flee.dm index 6ed9486e139b2..42a361c25cd86 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/simple_find_nearest_target_to_flee.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/simple_find_nearest_target_to_flee.dm @@ -9,9 +9,13 @@ /// Find the nearest thing on our list of 'things which have done damage to me' and set it as the flee target /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee + var/targeting_key = BB_TARGETTING_DATUM /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) . = ..() if (!controller.blackboard[BB_BASIC_MOB_FLEEING]) return - controller.queue_behavior(/datum/ai_behavior/target_from_retaliate_list/nearest, BB_BASIC_MOB_RETALIATE_LIST, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) + controller.queue_behavior(/datum/ai_behavior/target_from_retaliate_list/nearest, BB_BASIC_MOB_RETALIATE_LIST, BB_BASIC_MOB_CURRENT_TARGET, targeting_key, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) + +/datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee/from_flee_key + targeting_key = BB_FLEE_TARGETTING_DATUM diff --git a/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm index 5c85d128bb969..ec4ef1863adc9 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm @@ -3,3 +3,13 @@ /datum/ai_planning_subtree/simple_find_target/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) . = ..() controller.queue_behavior(/datum/ai_behavior/find_potential_targets, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) + +// Prevents finding a target if a human is nearby +/datum/ai_planning_subtree/simple_find_target/not_while_observed + +/datum/ai_planning_subtree/simple_find_target/not_while_observed/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + for(var/mob/living/carbon/human/watcher in hearers(7, controller.pawn)) + if(watcher.stat != DEAD) + return + return ..() + diff --git a/code/datums/ai/basic_mobs/basic_subtrees/sleep_with_no_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/sleep_with_no_target.dm index ccd67d6d1e724..93499cf673c4d 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/sleep_with_no_target.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/sleep_with_no_target.dm @@ -16,7 +16,7 @@ /datum/ai_behavior/sleep_after_targetless_time/perform(seconds_per_tick, datum/ai_controller/controller, target_key) var/atom/target = controller.blackboard[target_key] - finish_action(controller, succeeded = !target, seconds_per_tick = seconds_per_tick) + finish_action(controller, succeeded = QDELETED(target), seconds_per_tick = seconds_per_tick) /datum/ai_behavior/sleep_after_targetless_time/finish_action(datum/ai_controller/controller, succeeded, seconds_per_tick) . = ..() diff --git a/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm b/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm index 03d4cae546bdc..52f4a3459bf91 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm @@ -22,24 +22,31 @@ emote_see = string_list(emote_see) /datum/ai_planning_subtree/random_speech/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) - if(SPT_PROB(speech_chance, seconds_per_tick)) - var/audible_emotes_length = emote_hear?.len - var/non_audible_emotes_length = emote_see?.len - var/speak_lines_length = speak?.len + if(!SPT_PROB(speech_chance, seconds_per_tick)) + return + speak(controller) + +/// Actually perform an action +/datum/ai_planning_subtree/random_speech/proc/speak(datum/ai_controller/controller) + var/audible_emotes_length = emote_hear?.len + var/non_audible_emotes_length = emote_see?.len + var/speak_lines_length = speak?.len - var/total_choices_length = audible_emotes_length + non_audible_emotes_length + speak_lines_length + var/total_choices_length = audible_emotes_length + non_audible_emotes_length + speak_lines_length - var/random_number_in_range = rand(1, total_choices_length) + var/random_number_in_range = rand(1, total_choices_length) + var/sound_to_play = length(sound) > 0 ? pick(sound) : null - if(random_number_in_range <= audible_emotes_length) - controller.queue_behavior(/datum/ai_behavior/perform_emote, pick(emote_hear)) - else if(random_number_in_range <= (audible_emotes_length + non_audible_emotes_length)) - controller.queue_behavior(/datum/ai_behavior/perform_emote, pick(emote_see)) - else - controller.queue_behavior(/datum/ai_behavior/perform_speech, pick(speak), length(sound) > 0 ? pick(sound) : null) + if(random_number_in_range <= audible_emotes_length) + controller.queue_behavior(/datum/ai_behavior/perform_emote, pick(emote_hear), sound_to_play) + else if(random_number_in_range <= (audible_emotes_length + non_audible_emotes_length)) + controller.queue_behavior(/datum/ai_behavior/perform_emote, pick(emote_see)) + else + controller.queue_behavior(/datum/ai_behavior/perform_speech, pick(speak), sound_to_play) /datum/ai_planning_subtree/random_speech/insect speech_chance = 5 + sound = list('sound/creatures/chitter.ogg') emote_hear = list("chitters.") /datum/ai_planning_subtree/random_speech/mothroach @@ -49,6 +56,7 @@ /datum/ai_planning_subtree/random_speech/mouse speech_chance = 1 speak = list("Squeak!", "SQUEAK!", "Squeak?") + sound = list('sound/creatures/mousesqueek.ogg') emote_hear = list("squeaks.") emote_see = list("runs in a circle.", "shakes.") @@ -93,12 +101,14 @@ /datum/ai_planning_subtree/random_speech/chicken speech_chance = 15 // really talkative ladies speak = list("Cluck!", "BWAAAAARK BWAK BWAK BWAK!", "Bwaak bwak.") + sound = list('sound/creatures/clucks.ogg', 'sound/creatures/bagawk.ogg') emote_hear = list("clucks.", "croons.") emote_see = list("pecks at the ground.","flaps her wings viciously.") /datum/ai_planning_subtree/random_speech/chick speech_chance = 4 speak = list("Cherp.", "Cherp?", "Chirrup.", "Cheep!") + sound = list('sound/creatures/chick_peep.ogg') emote_hear = list("cheeps.") emote_see = list("pecks at the ground.","flaps her tiny wings.") @@ -149,7 +159,7 @@ /datum/ai_planning_subtree/random_speech/tree speech_chance = 3 - emote_see = list("photosynthesizes angirly.") + emote_see = list("photosynthesizes angrily.") /datum/ai_planning_subtree/random_speech/pig speech_chance = 3 @@ -158,14 +168,66 @@ emote_hear = list("snorts.") emote_see = list("sniffs around.") +/datum/ai_planning_subtree/random_speech/pony + speech_chance = 3 + sound = list('sound/creatures/pony/whinny01.ogg', 'sound/creatures/pony/whinny02.ogg', 'sound/creatures/pony/whinny03.ogg') + emote_hear = list("whinnies!") + emote_see = list("horses around.") + +/datum/ai_planning_subtree/random_speech/pony/tamed + speech_chance = 3 + sound = list('sound/creatures/pony/snort.ogg') + emote_hear = list("snorts.") + emote_see = list("snorts.") + /datum/ai_planning_subtree/random_speech/killer_tomato speech_chance = 3 - speak = list("gnashes.", "growls lowly.", "snarls.") - emote_hear = list("gnashes.") + emote_hear = list("gnashes.", "growls lowly.", "snarls.") emote_see = list("salivates.") /datum/ai_planning_subtree/random_speech/ant speech_chance = 1 + speak = list("BZZZZT!", "CHTCHTCHT!", "Bzzz", "ChtChtCht") + sound = list('sound/creatures/chitter.ogg') emote_hear = list("buzzes.", "clacks.") emote_see = list("shakes their head.", "twitches their antennae.") - speak = list("BZZZZT!", "CHTCHTCHT!", "Bzzz", "ChtChtCht") + +/datum/ai_planning_subtree/random_speech/fox + speech_chance = 1 + speak = list("Ack-Ack", "Ack-Ack-Ack-Ackawoooo", "Geckers", "Awoo", "Tchoff") + emote_hear = list("howls.", "barks.", "screams.") + emote_see = list("shakes their head.", "shivers.") + +/datum/ai_planning_subtree/random_speech/crab + speech_chance = 1 + sound = list('sound/creatures/claw_click.ogg') + emote_hear = list("clicks.") + emote_see = list("clacks.") + +/datum/ai_planning_subtree/random_speech/penguin + speech_chance = 5 + speak = list("Gah Gah!", "NOOT NOOT!", "NOOT!", "Noot", "noot", "Prah!", "Grah!") + emote_hear = list("squawks", "gakkers") + +/datum/ai_planning_subtree/random_speech/bear + speech_chance = 5 + emote_hear = list("rawrs.","grumbles.","grawls.", "stomps!") + emote_see = list("stares ferociously.") + +/datum/ai_planning_subtree/random_speech/blackboard //literal tower of babel, subtree form + speech_chance = 1 + +/datum/ai_planning_subtree/random_speech/blackboard/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/list/speech_lines = controller.blackboard[BB_BASIC_MOB_SPEAK_LINES] + if(isnull(speech_lines)) + return ..() + + // Note to future developers: this behaviour a singleton so this probably doesn't work as you would expect + // The whole speech tree really needs to be refactored because this isn't how we use AI data these days + speak = speech_lines[BB_EMOTE_SAY] || list() + emote_see = speech_lines[BB_EMOTE_SEE] || list() + emote_hear = speech_lines[BB_EMOTE_HEAR] || list() + sound = speech_lines[BB_EMOTE_SOUND] || list() + speech_chance = speech_lines[BB_EMOTE_CHANCE] ? speech_lines[BB_EMOTE_CHANCE] : initial(speech_chance) + + return ..() diff --git a/code/datums/ai/basic_mobs/basic_subtrees/target_retaliate.dm b/code/datums/ai/basic_mobs/basic_subtrees/target_retaliate.dm index ccb740c9980af..6133759183ded 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/target_retaliate.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/target_retaliate.dm @@ -1,15 +1,21 @@ /// Sets the BB target to a mob which you can see and who has recently attacked you /datum/ai_planning_subtree/target_retaliate + operational_datums = list(/datum/element/ai_retaliate, /datum/component/ai_retaliate_advanced) /// Blackboard key which tells us how to select valid targets var/targetting_datum_key = BB_TARGETTING_DATUM /// Blackboard key in which to store selected target var/target_key = BB_BASIC_MOB_CURRENT_TARGET /// Blackboard key in which to store selected target's hiding place var/hiding_place_key = BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION + /// do we check for faction? + var/check_faction = FALSE /datum/ai_planning_subtree/target_retaliate/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) . = ..() - controller.queue_behavior(/datum/ai_behavior/target_from_retaliate_list, BB_BASIC_MOB_RETALIATE_LIST, target_key, targetting_datum_key, hiding_place_key) + controller.queue_behavior(/datum/ai_behavior/target_from_retaliate_list, BB_BASIC_MOB_RETALIATE_LIST, target_key, targetting_datum_key, hiding_place_key, check_faction) + +/datum/ai_planning_subtree/target_retaliate/check_faction + check_faction = TRUE /// Places a mob which you can see and who has recently attacked you into some 'run away from this' AI keys /// Can use a different targetting datum than you use to select attack targets @@ -28,20 +34,28 @@ /// How far can we see stuff? var/vision_range = 9 -/datum/ai_behavior/target_from_retaliate_list/perform(seconds_per_tick, datum/ai_controller/controller, shitlist_key, target_key, targetting_datum_key, hiding_location_key) +/datum/ai_behavior/target_from_retaliate_list/perform(seconds_per_tick, datum/ai_controller/controller, shitlist_key, target_key, targetting_datum_key, hiding_location_key, check_faction) . = ..() var/mob/living/living_mob = controller.pawn var/datum/targetting_datum/targetting_datum = controller.blackboard[targetting_datum_key] if(!targetting_datum) CRASH("No target datum was supplied in the blackboard for [controller.pawn]") - var/list/enemies_list = controller.blackboard[shitlist_key] - if (!length(enemies_list)) - finish_action(controller, succeeded = FALSE) + + var/list/enemies_list = list() + + for(var/mob/living/potential_target as anything in controller.blackboard[shitlist_key]) + if(!targetting_datum.can_attack(living_mob, potential_target, vision_range, check_faction)) + continue + enemies_list += potential_target + + + if(!length(enemies_list)) + finish_action(controller, succeeded = FALSE, check_faction = check_faction) return if (controller.blackboard[target_key] in enemies_list) // Don't bother changing - finish_action(controller, succeeded = FALSE) + finish_action(controller, succeeded = TRUE, check_faction = check_faction) return var/atom/new_target = pick_final_target(controller, enemies_list) @@ -52,18 +66,15 @@ if(potential_hiding_location) //If they're hiding inside of something, we need to know so we can go for that instead initially. controller.set_blackboard_key(hiding_location_key, potential_hiding_location) - finish_action(controller, succeeded = TRUE) - -/// Returns true if this target is valid for attacking based on current conditions -/datum/ai_behavior/target_from_retaliate_list/proc/can_attack_target(mob/living/living_mob, atom/target, datum/targetting_datum/targetting_datum) - if (!target) - return FALSE - if (target == living_mob) - return FALSE - if (!can_see(living_mob, target, vision_range)) - return FALSE - return targetting_datum.can_attack(living_mob, target) + finish_action(controller, succeeded = TRUE, check_faction = check_faction) /// Returns the desired final target from the filtered list of enemies /datum/ai_behavior/target_from_retaliate_list/proc/pick_final_target(datum/ai_controller/controller, list/enemies_list) return pick(enemies_list) + + +/datum/ai_behavior/target_from_retaliate_list/finish_action(datum/ai_controller/controller, succeeded, target_key, check_faction) + . = ..() + if(check_faction) + return + controller.set_blackboard_key(BB_BASIC_MOB_SKIP_FACTION_CHECK, succeeded) diff --git a/code/datums/ai/basic_mobs/basic_subtrees/targeted_mob_ability.dm b/code/datums/ai/basic_mobs/basic_subtrees/targeted_mob_ability.dm index 0f53d53b61829..d9ee3ef09182d 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/targeted_mob_ability.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/targeted_mob_ability.dm @@ -1,7 +1,7 @@ /// Attempts to use a mob ability on a target /datum/ai_planning_subtree/targeted_mob_ability /// Blackboard key for the ability - var/ability_key + var/ability_key = BB_TARGETTED_ACTION /// Blackboard key for where the target ref is stored var/target_key = BB_BASIC_MOB_CURRENT_TARGET /// Behaviour to perform using ability @@ -13,11 +13,16 @@ if (!ability_key) CRASH("You forgot to tell this mob where to find its ability") - var/mob/living/target = controller.blackboard[target_key] + if (!controller.blackboard_key_exists(target_key)) + return + var/datum/action/cooldown/using_action = controller.blackboard[ability_key] - if (QDELETED(target) || QDELETED(using_action) || !using_action.IsAvailable()) + if (!using_action?.IsAvailable()) return controller.queue_behavior(use_ability_behaviour, ability_key, target_key) if (finish_planning) return SUBTREE_RETURN_FINISH_PLANNING + +/datum/ai_planning_subtree/targeted_mob_ability/continue_planning + finish_planning = FALSE diff --git a/code/datums/ai/basic_mobs/basic_subtrees/travel_to_point.dm b/code/datums/ai/basic_mobs/basic_subtrees/travel_to_point.dm new file mode 100644 index 0000000000000..9ce7cc95c07da --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/travel_to_point.dm @@ -0,0 +1,18 @@ +/// Simply walk to a location +/datum/ai_planning_subtree/travel_to_point + /// Blackboard key where we travel a place we walk to + var/location_key = BB_TRAVEL_DESTINATION + /// What do we do in order to travel + var/travel_behaviour = /datum/ai_behavior/travel_towards + +/datum/ai_planning_subtree/travel_to_point/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + . = ..() + var/atom/target = controller.blackboard[location_key] + if (QDELETED(target)) + return + controller.queue_behavior(travel_behaviour, location_key) + return SUBTREE_RETURN_FINISH_PLANNING + + +/datum/ai_planning_subtree/travel_to_point/and_clear_target + travel_behaviour = /datum/ai_behavior/travel_towards/stop_on_arrival diff --git a/code/datums/ai/basic_mobs/basic_subtrees/use_mob_ability.dm b/code/datums/ai/basic_mobs/basic_subtrees/use_mob_ability.dm index 2c618e98e72b1..fb83b8f8684ad 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/use_mob_ability.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/use_mob_ability.dm @@ -4,7 +4,7 @@ */ /datum/ai_planning_subtree/use_mob_ability /// Blackboard key for the ability - var/ability_key + var/ability_key = BB_GENERIC_ACTION /// Behaviour to perform using ability var/use_ability_behaviour = /datum/ai_behavior/use_mob_ability /// If true we terminate planning after trying to use the ability. @@ -15,7 +15,7 @@ CRASH("You forgot to tell this mob where to find its ability") var/datum/action/cooldown/using_action = controller.blackboard[ability_key] - if (QDELETED(using_action) || !using_action.IsAvailable()) + if (!using_action?.IsAvailable()) return controller.queue_behavior(use_ability_behaviour, ability_key) diff --git a/code/datums/ai/basic_mobs/generic_controllers.dm b/code/datums/ai/basic_mobs/generic_controllers.dm new file mode 100644 index 0000000000000..208c1833add84 --- /dev/null +++ b/code/datums/ai/basic_mobs/generic_controllers.dm @@ -0,0 +1,26 @@ +/// The most basic AI tree which just finds a guy and then runs at them to click them +/datum/ai_controller/basic_controller/simple_hostile + 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, + ) + +/// Find a target, walk at target, attack intervening obstacles +/datum/ai_controller/basic_controller/simple_hostile_obstacles + 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/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) diff --git a/code/datums/ai/basic_mobs/pet_commands/play_dead.dm b/code/datums/ai/basic_mobs/pet_commands/play_dead.dm index a84310cb9ab90..0520898c4a53a 100644 --- a/code/datums/ai/basic_mobs/pet_commands/play_dead.dm +++ b/code/datums/ai/basic_mobs/pet_commands/play_dead.dm @@ -7,6 +7,7 @@ if(!istype(basic_pawn) || basic_pawn.stat) // Can't act dead if you're dead return basic_pawn.emote("deathgasp", intentional=FALSE) + ADD_TRAIT(basic_pawn, TRAIT_FAKEDEATH, BASIC_MOB_DEATH_TRAIT) basic_pawn.look_dead() /datum/ai_behavior/play_dead/perform(seconds_per_tick, datum/ai_controller/controller) @@ -20,5 +21,6 @@ if(!istype(basic_pawn) || basic_pawn.stat) // imagine actually dying while playing dead. hell, imagine being the kid waiting for your pup to get back up :( return basic_pawn.visible_message(span_notice("[basic_pawn] miraculously springs back to life!")) + REMOVE_TRAIT(basic_pawn, TRAIT_FAKEDEATH, BASIC_MOB_DEATH_TRAIT) basic_pawn.look_alive() controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND) diff --git a/code/datums/ai/basic_mobs/targetting_datums/basic_targetting_datum.dm b/code/datums/ai/basic_mobs/targetting_datums/basic_targetting_datum.dm index 004f3d8f59b16..978d7b7f8a75c 100644 --- a/code/datums/ai/basic_mobs/targetting_datums/basic_targetting_datum.dm +++ b/code/datums/ai/basic_mobs/targetting_datums/basic_targetting_datum.dm @@ -2,7 +2,7 @@ /datum/targetting_datum ///Returns true or false depending on if the target can be attacked by the mob -/datum/targetting_datum/proc/can_attack(mob/living/living_mob, atom/target) +/datum/targetting_datum/proc/can_attack(mob/living/living_mob, atom/target, vision_range) return ///Returns something the target might be hiding inside of @@ -17,9 +17,16 @@ var/check_factions_exactly = FALSE /// Minimum status to attack living beings var/stat_attack = CONSCIOUS + ///Whether we care for seeing the target or not + var/ignore_sight = FALSE -/datum/targetting_datum/basic/can_attack(mob/living/living_mob, atom/the_target) - if(isturf(the_target) || !the_target) // bail out on invalids +/datum/targetting_datum/basic/can_attack(mob/living/living_mob, atom/the_target, vision_range, check_faction = TRUE) + var/datum/ai_controller/basic_controller/our_controller = living_mob.ai_controller + + if(isnull(our_controller)) + return FALSE + + if(isturf(the_target) || isnull(the_target)) // bail out on invalids return FALSE if(isobj(the_target.loc)) @@ -28,20 +35,29 @@ return FALSE if(ismob(the_target)) //Target is in godmode, ignore it. + if(living_mob.loc == the_target) + return FALSE // We've either been eaten or are shapeshifted, let's assume the latter because we're still alive var/mob/M = the_target if(M.status_flags & GODMODE) return FALSE + if(!ignore_sight && !can_see(living_mob, the_target, vision_range)) //Target has moved behind cover and we have lost line of sight to it + return FALSE + if(living_mob.see_invisible < the_target.invisibility) //Target's invisible to us, forget it return FALSE - if(isturf(the_target.loc) && living_mob.z != the_target.z) // z check will always fail if target is in a mech + if(isturf(living_mob.loc) && isturf(the_target.loc) && living_mob.z != the_target.z) // z check will always fail if target is in a mech or pawn is shapeshifted or jaunting return FALSE if(isliving(the_target)) //Targeting vs living mobs - var/mob/living/L = the_target - if(faction_check(living_mob, L) || (L.stat > stat_attack)) + var/mob/living/living_target = the_target + var/bypass_faction_check = !check_faction || our_controller.blackboard[BB_BASIC_MOB_SKIP_FACTION_CHECK] + if(faction_check(living_mob, living_target) && !bypass_faction_check) return FALSE + if(living_target.stat > stat_attack) + return FALSE + return TRUE if(ismecha(the_target)) //Targeting vs mechas @@ -110,3 +126,9 @@ /datum/targetting_datum/basic/of_size/larger find_smaller = FALSE inclusive = FALSE + +/datum/targetting_datum/basic/attack_until_dead + stat_attack = HARD_CRIT + +/datum/targetting_datum/basic/attack_even_if_dead + stat_attack = DEAD diff --git a/code/datums/ai/basic_mobs/targetting_datums/dont_target_friends.dm b/code/datums/ai/basic_mobs/targetting_datums/dont_target_friends.dm index 8e6c79fda3fa2..3556e11900f70 100644 --- a/code/datums/ai/basic_mobs/targetting_datums/dont_target_friends.dm +++ b/code/datums/ai/basic_mobs/targetting_datums/dont_target_friends.dm @@ -39,3 +39,12 @@ /datum/targetting_datum/not_friends/attack_closed_turfs attack_closed_turf = TRUE + +/// Subtype that allows us to target items while deftly avoiding attacking our allies. Be careful when it comes to targetting items as an AI could get trapped targetting something it can't destroy. +/datum/targetting_datum/basic/not_friends/allow_items + +/datum/targetting_datum/basic/not_friends/allow_items/can_attack(mob/living/living_mob, atom/the_target) + . = ..() + if(isitem(the_target)) + // trust fall exercise + return TRUE diff --git a/code/datums/ai/basic_mobs/targetting_datums/with_object.dm b/code/datums/ai/basic_mobs/targetting_datums/with_object.dm new file mode 100644 index 0000000000000..039027b6aa592 --- /dev/null +++ b/code/datums/ai/basic_mobs/targetting_datums/with_object.dm @@ -0,0 +1,39 @@ +/** + * Find mobs who are holding the configurable object type + * + * This is an extension of basic targeting behaviour, that allows you to + * only target the mob if they have a specific item in their hand. + * + */ +/datum/targetting_datum/basic/holding_object + // We will find mobs who are holding this object in their hands + var/object_type_path = null + +/** + * Create an instance of the holding object targeting datum + * + * * object_type_path Pass an object type path, this will be compared to the items + * in targets hands to filter the target list. + */ +/datum/targetting_datum/basic/holding_object/New(object_type_path) + if (!ispath(object_type_path)) + stack_trace("trying to create an item targeting datum with no valid typepath") + // Leaving object type as null will make this basically a noop + return + src.object_type_path = object_type_path + +///Returns true or false depending on if the target can be attacked by the mob +/datum/targetting_datum/basic/holding_object/can_attack(mob/living/living_mob, atom/target, vision_range, check_faction = FALSE) + if (object_type_path == null) + return FALSE // no op + if(!ismob(target)) + return FALSE // no hands no problems + + // Look at me, type casting like a grown up + var/mob/targetmob = target + // Check if our parent behaviour agrees we can attack this target (we ignore faction by default) + var/can_attack = ..() + if(can_attack && targetmob.is_holding_item_of_type(object_type_path)) + return TRUE // they have the item + // No valid target + return FALSE diff --git a/code/datums/ai/dog/dog_behaviors.dm b/code/datums/ai/dog/dog_behaviors.dm index 7bd0d5824a111..6c9cb779bb3bd 100644 --- a/code/datums/ai/dog/dog_behaviors.dm +++ b/code/datums/ai/dog/dog_behaviors.dm @@ -4,7 +4,6 @@ * Adds a floor to the melee damage of the dog, as most pet dogs don't actually have any melee strength */ /datum/ai_behavior/basic_melee_attack/dog - action_cooldown = 0.8 SECONDS behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM required_distance = 3 diff --git a/code/datums/ai/dog/dog_controller.dm b/code/datums/ai/dog/dog_controller.dm index 5a42cb43a1eb2..fa0550d0197b9 100644 --- a/code/datums/ai/dog/dog_controller.dm +++ b/code/datums/ai/dog/dog_controller.dm @@ -18,8 +18,12 @@ /datum/ai_controller/basic_controller/dog/corgi blackboard = list( BB_DOG_HARASS_HARM = TRUE, + // IF you dont have this fleeing behavviour will just refuse to work, isn't that funny ha ha + BB_BASIC_MOB_FLEEING = TRUE, BB_VISION_RANGE = AI_DOG_VISION_RANGE, BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends(), + // Find nearby mobs with tongs in hand. + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/holding_object(/obj/item/kitchen/tongs), BB_BABIES_PARTNER_TYPES = list(/mob/living/basic/pet/dog), BB_BABIES_CHILD_TYPES = list(/mob/living/basic/pet/dog/corgi/puppy = 95, /mob/living/basic/pet/dog/corgi/puppy/void = 5), ) @@ -29,6 +33,10 @@ /datum/ai_planning_subtree/make_babies, // Ian WILL prioritise sex over following your instructions /datum/ai_planning_subtree/pet_planning, /datum/ai_planning_subtree/dog_harassment, + // Find targets to run away from (uses the targetting datum from above) + /datum/ai_planning_subtree/simple_find_target, + // Flee from that target + /datum/ai_planning_subtree/flee_target, ) /datum/ai_controller/basic_controller/dog/corgi/get_access() diff --git a/code/datums/ai/generic/find_and_set.dm b/code/datums/ai/generic/find_and_set.dm index 02f2980dd727c..eb09506a282fa 100644 --- a/code/datums/ai/generic/find_and_set.dm +++ b/code/datums/ai/generic/find_and_set.dm @@ -8,6 +8,8 @@ /datum/ai_behavior/find_and_set/perform(seconds_per_tick, datum/ai_controller/controller, set_key, locate_path, search_range) . = ..() + if (controller.blackboard_key_exists(set_key)) + return var/find_this_thing = search_tactic(controller, locate_path, search_range) if(find_this_thing) controller.set_blackboard_key(set_key, find_this_thing) diff --git a/code/datums/ai/generic/generic_behaviors.dm b/code/datums/ai/generic/generic_behaviors.dm index e7bfe7a7c60c9..4f816de4be30a 100644 --- a/code/datums/ai/generic/generic_behaviors.dm +++ b/code/datums/ai/generic/generic_behaviors.dm @@ -287,11 +287,13 @@ /datum/ai_behavior/perform_emote -/datum/ai_behavior/perform_emote/perform(seconds_per_tick, datum/ai_controller/controller, emote) +/datum/ai_behavior/perform_emote/perform(seconds_per_tick, datum/ai_controller/controller, emote, speech_sound) var/mob/living/living_pawn = controller.pawn if(!istype(living_pawn)) return living_pawn.manual_emote(emote) + if(speech_sound) // Only audible emotes will pass in a sound + playsound(living_pawn, speech_sound, 80, vary = TRUE) finish_action(controller, TRUE) /datum/ai_behavior/perform_speech @@ -305,6 +307,16 @@ playsound(living_pawn, speech_sound, 80, vary = TRUE) finish_action(controller, TRUE) +/datum/ai_behavior/perform_speech_radio + +/datum/ai_behavior/perform_speech_radio/perform(seconds_per_tick, datum/ai_controller/controller, speech, obj/item/radio/speech_radio, list/try_channels = list(RADIO_CHANNEL_COMMON)) + var/mob/living/living_pawn = controller.pawn + if(!istype(living_pawn) || !istype(speech_radio) || QDELETED(speech_radio) || !length(try_channels)) + finish_action(controller, FALSE) + return + speech_radio.talk_into(living_pawn, speech, pick(try_channels)) + finish_action(controller, TRUE) + //song behaviors /datum/ai_behavior/setup_instrument diff --git a/code/datums/ai/hauntium/haunted_controller.dm b/code/datums/ai/hauntium/haunted_controller.dm index e8e80b41607db..b2863a310c16b 100644 --- a/code/datums/ai/hauntium/haunted_controller.dm +++ b/code/datums/ai/hauntium/haunted_controller.dm @@ -28,7 +28,7 @@ var/haunt_equipper = TRUE if(isliving(equipper)) var/mob/living/possibly_cool = equipper - if(possibly_cool.mob_biotypes & MOB_UNDEAD) + if(possibly_cool.mob_biotypes & MOB_UNDEAD || HAS_MIND_TRAIT(possibly_cool, TRAIT_MORBID)) haunt_equipper = FALSE if(haunt_equipper) //You have now become one of the victims of the HAAAAUNTTIIIINNGGG OOOOOO~~~ diff --git a/code/datums/ai/hunting_behavior/hunting_behaviors.dm b/code/datums/ai/hunting_behavior/hunting_behaviors.dm index 777cb851ee426..ba7c7f2ffba67 100644 --- a/code/datums/ai/hunting_behavior/hunting_behaviors.dm +++ b/code/datums/ai/hunting_behavior/hunting_behaviors.dm @@ -16,6 +16,8 @@ var/hunt_range = 2 /// What are the chances we hunt something at any given moment var/hunt_chance = 100 + ///do we finish planning subtree + var/finish_planning = TRUE /datum/ai_planning_subtree/find_and_hunt_target/New() . = ..() @@ -35,13 +37,15 @@ // We're not hunting anything, look around for something if(isnull(hunted)) controller.queue_behavior(finding_behavior, target_key, hunt_targets, hunt_range) + return // We ARE hunting something, execute the hunt. // Note that if our AI controller has multiple hunting subtrees set, // we may accidentally be executing another tree's hunt - not ideal, // try to set a unique target key if you have multiple - else - controller.queue_behavior(hunting_behavior, target_key, BB_HUNTING_COOLDOWN) + + controller.queue_behavior(hunting_behavior, target_key, BB_HUNTING_COOLDOWN) + if(finish_planning) return SUBTREE_RETURN_FINISH_PLANNING //If we're hunting we're too busy for anything else /// Finds a specific atom type to hunt. @@ -89,7 +93,7 @@ var/mob/living/hunter = controller.pawn var/atom/hunted = controller.blackboard[hunting_target_key] - if(isnull(hunted)) + if(QDELETED(hunted)) //Target is gone for some reason. forget about this task! controller[hunting_target_key] = null finish_action(controller, FALSE, hunting_target_key) @@ -124,3 +128,19 @@ /datum/ai_behavior/hunt_target/unarmed_attack_target/target_caught(mob/living/hunter, obj/structure/cable/hunted) hunter.UnarmedAttack(hunted, TRUE) + +/datum/ai_behavior/hunt_target/use_ability_on_target + always_reset_target = TRUE + ///the ability we will use + var/ability_key + +/datum/ai_behavior/hunt_target/use_ability_on_target/perform(seconds_per_tick, datum/ai_controller/controller, hunting_target_key, hunting_cooldown_key) + var/datum/action/cooldown/ability = controller.blackboard[ability_key] + if(QDELETED(ability) || !ability.IsAvailable()) + finish_action(controller, FALSE, hunting_target_key) + return ..() + +/datum/ai_behavior/hunt_target/use_ability_on_target/target_caught(mob/living/hunter, atom/hunted) + var/datum/action/cooldown/ability = hunter.ai_controller.blackboard[ability_key] + ability.InterceptClickOn(hunter, null, hunted) + diff --git a/code/datums/ai/hunting_behavior/hunting_corpses.dm b/code/datums/ai/hunting_behavior/hunting_corpses.dm new file mode 100644 index 0000000000000..e720e4da947af --- /dev/null +++ b/code/datums/ai/hunting_behavior/hunting_corpses.dm @@ -0,0 +1,17 @@ +/// Find and attack corpses +/datum/ai_planning_subtree/find_and_hunt_target/corpses + finding_behavior = /datum/ai_behavior/find_hunt_target/corpses + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target + hunt_targets = list(/mob/living) + +/// Find nearby dead mobs +/datum/ai_behavior/find_hunt_target/corpses + +/datum/ai_behavior/find_hunt_target/corpses/valid_dinner(mob/living/source, mob/living/dinner, radius) + if (!isliving(dinner) || dinner.stat != DEAD) + return FALSE + return can_see(source, dinner, radius) + +/// Find and attack specifically human corpses +/datum/ai_planning_subtree/find_and_hunt_target/corpses/human + hunt_targets = list(/mob/living/carbon/human) diff --git a/code/datums/ai/hunting_behavior/hunting_lights.dm b/code/datums/ai/hunting_behavior/hunting_lights.dm index f26743b7dfaaa..6b82e87f2693b 100644 --- a/code/datums/ai/hunting_behavior/hunting_lights.dm +++ b/code/datums/ai/hunting_behavior/hunting_lights.dm @@ -1,23 +1,18 @@ /datum/ai_planning_subtree/find_and_hunt_target/look_for_light_fixtures target_key = BB_LOW_PRIORITY_HUNTING_TARGET finding_behavior = /datum/ai_behavior/find_hunt_target/light_fixtures - hunting_behavior = /datum/ai_behavior/hunt_target/light_fixtures + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/light_fixtures hunt_targets = list(/obj/machinery/light) hunt_range = 7 -/datum/ai_behavior/hunt_target/light_fixtures +/datum/ai_behavior/hunt_target/unarmed_attack_target/light_fixtures hunt_cooldown = 10 SECONDS always_reset_target = TRUE -/datum/ai_behavior/hunt_target/light_fixtures/target_caught(mob/living/hunter, obj/machinery/light/hunted) - hunter.UnarmedAttack(hunted, TRUE) - /datum/ai_behavior/find_hunt_target/light_fixtures /datum/ai_behavior/find_hunt_target/light_fixtures/valid_dinner(mob/living/source, obj/machinery/light/dinner, radius) - if(istype(dinner, /obj/machinery/light)) - var/obj/machinery/light/light_target = dinner - if(light_target.status == LIGHT_BROKEN) //light is already broken - return FALSE + if(dinner.status == LIGHT_BROKEN) //light is already broken + return FALSE return can_see(source, dinner, radius) diff --git a/code/datums/ai/idle_behaviors/idle_random_walk.dm b/code/datums/ai/idle_behaviors/idle_random_walk.dm index b25f983f31398..d5a3972a3d027 100644 --- a/code/datums/ai/idle_behaviors/idle_random_walk.dm +++ b/code/datums/ai/idle_behaviors/idle_random_walk.dm @@ -14,3 +14,13 @@ /datum/idle_behavior/idle_random_walk/less_walking walk_chance = 10 + +/// Only walk if we don't have a target +/datum/idle_behavior/idle_random_walk/no_target + /// Where do we look for a target? + var/target_key = BB_BASIC_MOB_CURRENT_TARGET + +/datum/idle_behavior/idle_random_walk/no_target/perform_idle_behavior(seconds_per_tick, datum/ai_controller/controller) + if (!controller.blackboard_key_exists(target_key)) + return + return ..() diff --git a/code/datums/ai/monkey/monkey_behaviors.dm b/code/datums/ai/monkey/monkey_behaviors.dm index 8b766224488b4..13ae68170053c 100644 --- a/code/datums/ai/monkey/monkey_behaviors.dm +++ b/code/datums/ai/monkey/monkey_behaviors.dm @@ -316,7 +316,7 @@ if(!enemies[possible_enemy]) //We don't hate this creature! But we might still attack it! if(!controller.blackboard[BB_MONKEY_AGGRESSIVE]) //We are not aggressive either, so we won't attack! continue - if(HAS_AI_CONTROLLER_TYPE(possible_enemy, /datum/ai_controller/monkey) && !controller.blackboard[BB_MONKEY_TARGET_MONKEYS]) //Do not target poor monkes + if(faction_check(possible_enemy.faction, list(FACTION_MONKEY, FACTION_JUNGLE), exact_match = FALSE) && !controller.blackboard[BB_MONKEY_TARGET_MONKEYS]) // do not target your team. includes monkys gorillas etc. continue // Weighted list, so the closer they are the more likely they are to be chosen as the enemy valids[possible_enemy] = CEILING(100 / (get_dist(controller.pawn, possible_enemy) || 1), 1) diff --git a/code/datums/ai/monkey/monkey_controller.dm b/code/datums/ai/monkey/monkey_controller.dm index e7885aa3014d5..951147007f9b8 100644 --- a/code/datums/ai/monkey/monkey_controller.dm +++ b/code/datums/ai/monkey/monkey_controller.dm @@ -30,9 +30,10 @@ have ways of interacting with a specific mob and control it. idle_behavior = /datum/idle_behavior/idle_monkey /datum/ai_controller/monkey/New(atom/new_pawn) - AddElement(/datum/element/ai_control_examine, list( + var/static/list/control_examine = list( ORGAN_SLOT_EYES = span_monkey("eyes have a primal look in them."), - )) + ) + AddElement(/datum/element/ai_control_examine, control_examine) return ..() /datum/ai_controller/monkey/pun_pun @@ -52,7 +53,9 @@ have ways of interacting with a specific mob and control it. . = ..() if(. & AI_CONTROLLER_INCOMPATIBLE) return + pawn = new_pawn set_blackboard_key(BB_MONKEY_AGGRESSIVE, TRUE) //Angry cunt + set_trip_mode(mode = FALSE) /datum/ai_controller/monkey/TryPossessPawn(atom/new_pawn) if(!isliving(new_pawn)) diff --git a/code/datums/ai/movement/ai_movement_basic_avoidance.dm b/code/datums/ai/movement/ai_movement_basic_avoidance.dm index 8a610a5aabc3b..371fb9dbc4bdf 100644 --- a/code/datums/ai/movement/ai_movement_basic_avoidance.dm +++ b/code/datums/ai/movement/ai_movement_basic_avoidance.dm @@ -1,13 +1,15 @@ ///Uses Byond's basic obstacle avoidance movement /datum/ai_movement/basic_avoidance max_pathing_attempts = 10 + /// Movement flags to pass to the loop + var/move_flags = NONE /datum/ai_movement/basic_avoidance/start_moving_towards(datum/ai_controller/controller, atom/current_movement_target, min_distance) . = ..() var/atom/movable/moving = controller.pawn var/min_dist = controller.blackboard[BB_CURRENT_MIN_MOVE_DISTANCE] var/delay = controller.movement_delay - var/datum/move_loop/loop = SSmove_manager.move_to(moving, current_movement_target, min_dist, delay, subsystem = SSai_movement, extra_info = controller) + var/datum/move_loop/loop = SSmove_manager.move_to(moving, current_movement_target, min_dist, delay, flags = move_flags, subsystem = SSai_movement, extra_info = controller) RegisterSignal(loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(pre_move)) RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(post_move)) @@ -18,3 +20,7 @@ if(is_type_in_typecache(target_turf, GLOB.dangerous_turfs)) . = FALSE return . + +/// Move immediately and don't update our facing +/datum/ai_movement/basic_avoidance/backstep + move_flags = MOVEMENT_LOOP_START_FAST | MOVEMENT_LOOP_NO_DIR_UPDATE diff --git a/code/datums/ai/movement/ai_movement_jps.dm b/code/datums/ai/movement/ai_movement_jps.dm index 3523da7ecec22..da46735ec363d 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,13 +12,13 @@ var/datum/move_loop/loop = SSmove_manager.jps_move(moving, current_movement_target, delay, - repath_delay = 2 SECONDS, + repath_delay = 0.5 SECONDS, max_path_length = AI_MAX_PATH_LENGTH, minimum_distance = controller.get_minimum_distance(), id = controller.get_access(), subsystem = SSai_movement, 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)) diff --git a/code/datums/ai/objects/vending_machines/vending_machine_behaviors.dm b/code/datums/ai/objects/vending_machines/vending_machine_behaviors.dm index 5bad78a35154f..b4e5609531c18 100644 --- a/code/datums/ai/objects/vending_machines/vending_machine_behaviors.dm +++ b/code/datums/ai/objects/vending_machines/vending_machine_behaviors.dm @@ -22,7 +22,7 @@ /datum/ai_behavior/vendor_crush/proc/tiltonmob(datum/ai_controller/controller, turf/target_turf) var/obj/machinery/vending/vendor_pawn = controller.pawn - if(vendor_pawn.tilt(target_turf)) //We hit something + if(vendor_pawn.tilt(target_turf, 0) & SUCCESSFULLY_CRUSHED_MOB) //We hit something vendor_pawn.say(pick("Supersize this!", "Eat my shiny metal ass!", "Want to consume some of my products?", "SMASH!", "Don't you love these smashing prices!")) controller.set_blackboard_key(BB_VENDING_LAST_HIT_SUCCESFUL, TRUE) else diff --git a/code/datums/ai/oldhostile/hostile_tameable.dm b/code/datums/ai/oldhostile/hostile_tameable.dm index 748db4c5043d6..d75eb3087317d 100644 --- a/code/datums/ai/oldhostile/hostile_tameable.dm +++ b/code/datums/ai/oldhostile/hostile_tameable.dm @@ -96,7 +96,7 @@ var/mob/living/living_pawn = pawn if(!IS_DEAD_OR_INCAP(living_pawn)) - examine_text += span_notice("[pawn.p_they(TRUE)] seem[pawn.p_s()] happy to see you!") + examine_text += span_notice("[pawn.p_They()] seem[pawn.p_s()] happy to see you!") // next section is regarding commands diff --git a/code/datums/ai/robot_customer/robot_customer_behaviors.dm b/code/datums/ai/robot_customer/robot_customer_behaviors.dm index ff9e59c393147..95260b8e68de2 100644 --- a/code/datums/ai/robot_customer/robot_customer_behaviors.dm +++ b/code/datums/ai/robot_customer/robot_customer_behaviors.dm @@ -3,7 +3,7 @@ /datum/ai_behavior/find_seat/perform(seconds_per_tick, datum/ai_controller/controller) . = ..() - var/mob/living/simple_animal/robot_customer/customer_pawn = controller.pawn + var/mob/living/basic/robot_customer/customer_pawn = controller.pawn var/datum/customer_data/customer_data = controller.blackboard[BB_CUSTOMER_CUSTOMERINFO] var/datum/venue/attending_venue = controller.blackboard[BB_CUSTOMER_ATTENDING_VENUE] @@ -44,7 +44,7 @@ /datum/ai_behavior/order_food/perform(seconds_per_tick, datum/ai_controller/controller) . = ..() - var/mob/living/simple_animal/robot_customer/customer_pawn = controller.pawn + var/mob/living/basic/robot_customer/customer_pawn = controller.pawn var/datum/customer_data/customer_data = controller.blackboard[BB_CUSTOMER_CUSTOMERINFO] var/obj/structure/holosign/robot_seat/seat_marker = controller.blackboard[BB_CUSTOMER_MY_SEAT] if(get_turf(seat_marker) == get_turf(customer_pawn)) @@ -75,7 +75,7 @@ // SPT_PROB 1.5 is about a 40% chance that the tourist will have vocalised at least once every minute. if(SPT_PROB(0.85, seconds_per_tick)) - var/mob/living/simple_animal/robot_customer/customer_pawn = controller.pawn + var/mob/living/basic/robot_customer/customer_pawn = controller.pawn var/datum/customer_data/customer_data = controller.blackboard[BB_CUSTOMER_CUSTOMERINFO] customer_pawn.say(pick(customer_data.wait_for_food_lines)) @@ -98,7 +98,7 @@ /datum/ai_behavior/wait_for_food/finish_action(datum/ai_controller/controller, succeeded) . = ..() - var/mob/living/simple_animal/robot_customer/customer_pawn = controller.pawn + var/mob/living/basic/robot_customer/customer_pawn = controller.pawn var/datum/customer_data/customer_data = controller.blackboard[BB_CUSTOMER_CUSTOMERINFO] var/mob/living/greytider = controller.blackboard[BB_CUSTOMER_CURRENT_TARGET] //usually if we stop waiting, it's because we're done with the venue. but here we're either beating some dude up diff --git a/code/datums/ai/robot_customer/robot_customer_controller.dm b/code/datums/ai/robot_customer/robot_customer_controller.dm index 2a633590f6898..0fc9d27eb43fd 100644 --- a/code/datums/ai/robot_customer/robot_customer_controller.dm +++ b/code/datums/ai/robot_customer/robot_customer_controller.dm @@ -1,14 +1,16 @@ /datum/ai_controller/robot_customer ai_movement = /datum/ai_movement/basic_avoidance movement_delay = 0.8 SECONDS - blackboard = list(BB_CUSTOMER_CURRENT_ORDER = null, - BB_CUSTOMER_MY_SEAT = null, - BB_CUSTOMER_PATIENCE = 999, - BB_CUSTOMER_CUSTOMERINFO = null, - BB_CUSTOMER_EATING = FALSE, - BB_CUSTOMER_LEAVING = FALSE, - BB_CUSTOMER_ATTENDING_VENUE = null, - BB_CUSTOMER_SAID_CANT_FIND_SEAT_LINE = FALSE) + blackboard = list( + BB_CUSTOMER_ATTENDING_VENUE = null, + BB_CUSTOMER_CURRENT_ORDER = null, + BB_CUSTOMER_CUSTOMERINFO = null, + BB_CUSTOMER_EATING = FALSE, + BB_CUSTOMER_LEAVING = FALSE, + BB_CUSTOMER_MY_SEAT = null, + BB_CUSTOMER_PATIENCE = 999 SECONDS, + BB_CUSTOMER_SAID_CANT_FIND_SEAT_LINE = FALSE, + ) planning_subtrees = list(/datum/ai_planning_subtree/robot_customer) /datum/ai_controller/robot_customer/Destroy() @@ -18,7 +20,7 @@ return ..() /datum/ai_controller/robot_customer/TryPossessPawn(atom/new_pawn) - if(!istype(new_pawn, /mob/living/simple_animal/robot_customer)) + if(!istype(new_pawn, /mob/living/basic/robot_customer)) return AI_CONTROLLER_INCOMPATIBLE new_pawn.AddElement(/datum/element/relay_attackers) RegisterSignal(new_pawn, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attackby)) @@ -28,6 +30,12 @@ return ..() //Run parent at end /datum/ai_controller/robot_customer/UnpossessPawn(destroy) + if(isnull(pawn)) +#ifndef UNIT_TESTS + stack_trace("Robot Customer AI Controller UnpossessPawn called with null pawn! This shouldn't happen in normal circumstances.") // and unit tests are abnormal circumstances +#endif + return + UnregisterSignal(pawn, list(COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_WAS_ATTACKED, COMSIG_LIVING_GET_PULLED, COMSIG_ATOM_ATTACK_HAND)) return ..() //Run parent at end @@ -67,7 +75,7 @@ INVOKE_ASYNC(src, PROC_REF(async_on_get_pulled), source, puller) /datum/ai_controller/robot_customer/proc/async_on_get_pulled(datum/source, mob/living/puller) - var/mob/living/simple_animal/robot_customer/customer = pawn + var/mob/living/basic/robot_customer/customer = pawn var/datum/customer_data/customer_data = blackboard[BB_CUSTOMER_CUSTOMERINFO] var/datum/venue/attending_venue = blackboard[BB_CUSTOMER_ATTENDING_VENUE] @@ -81,12 +89,12 @@ /datum/ai_controller/robot_customer/proc/dont_want_that(mob/living/chef, obj/item/thing) - var/mob/living/simple_animal/robot_customer/customer = pawn + var/mob/living/basic/robot_customer/customer = pawn var/datum/customer_data/customer_data = blackboard[BB_CUSTOMER_CUSTOMERINFO] customer.say(customer_data.wrong_item_line) /datum/ai_controller/robot_customer/proc/warn_greytider(mob/living/greytider) - var/mob/living/simple_animal/robot_customer/customer = pawn + var/mob/living/basic/robot_customer/customer = pawn var/datum/venue/attending_venue = blackboard[BB_CUSTOMER_ATTENDING_VENUE] var/datum/customer_data/customer_data = blackboard[BB_CUSTOMER_CUSTOMERINFO] //Living mobs are tagged, so these will always be valid diff --git a/code/datums/armor/_armor.dm b/code/datums/armor/_armor.dm index c6dbf1d5fdd66..bfd15af418924 100644 --- a/code/datums/armor/_armor.dm +++ b/code/datums/armor/_armor.dm @@ -62,6 +62,7 @@ GLOBAL_LIST_INIT(armor_by_type, generate_armor_type_cache()) return FALSE /datum/armor/vv_get_dropdown() + SHOULD_CALL_PARENT(FALSE) return list("", "MUST MODIFY ARMOR VALUES ON THE PARENT ATOM") /datum/armor/CanProcCall(procname) diff --git a/code/datums/atmosphere/_atmosphere.dm b/code/datums/atmosphere/_atmosphere.dm index 1dace1dd1b26b..702a42e7ab07d 100644 --- a/code/datums/atmosphere/_atmosphere.dm +++ b/code/datums/atmosphere/_atmosphere.dm @@ -52,6 +52,9 @@ ASSERT_GAS_IN_LIST(gastype, gaslist) gaslist[gastype][MOLES] += amount + // Ensure that minimum_pressure is actually a hard lower limit + target_pressure = clamp(target_pressure, minimum_pressure + (gaslist[gastype][MOLES] * 0.1), maximum_pressure) + // That last one put us over the limit, remove some of it while(gasmix.return_pressure() > target_pressure) gaslist[gastype][MOLES] -= gaslist[gastype][MOLES] * 0.1 diff --git a/code/datums/beam.dm b/code/datums/beam.dm index a2542afcdb4cc..6b138387290e7 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -41,7 +41,21 @@ /// 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) +/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 @@ -65,8 +79,7 @@ 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.vis_flags = VIS_INHERIT_PLANE|VIS_INHERIT_LAYER visuals.emissive = emissive visuals.update_appearance() Draw() @@ -166,6 +179,8 @@ /obj/effect/ebeam mouse_opacity = MOUSE_OPACITY_TRANSPARENT + plane = GAME_PLANE_UPPER_FOV_HIDDEN + layer = ABOVE_ALL_MOB_LAYER anchored = TRUE var/emissive = TRUE var/datum/beam/owner diff --git a/code/datums/bodypart_overlays/emote_bodypart_overlay.dm b/code/datums/bodypart_overlays/emote_bodypart_overlay.dm index 4143efb67db06..524dd1760561e 100644 --- a/code/datums/bodypart_overlays/emote_bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/emote_bodypart_overlay.dm @@ -1,6 +1,6 @@ ///Variant of bodypart_overlay for displaying emote overlays. See [/datum/emote/living/blush/run_emote] for an example on how to use one of these. /datum/bodypart_overlay/simple/emote - icon = 'icons/mob/species/human/emote_visuals.dmi' + icon = 'icons/mob/human/emote_visuals.dmi' ///The body zone to attach the overlay to, overlay won't be added if no bodypart can be found with this var/attached_body_zone = BODY_ZONE_CHEST ///The feature key used to figure out what specific bodily feature we offset this to follow diff --git a/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm b/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm index ea1d94ce790d0..10f76317897c5 100644 --- a/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm @@ -110,18 +110,29 @@ if(!ishuman(ownerlimb.owner)) return var/mob/living/carbon/human/human_owner = ownerlimb.owner - draw_color = human_owner.hair_color + var/obj/item/bodypart/head/my_head = human_owner.get_bodypart(BODY_ZONE_HEAD) //not always the same as ownerlimb + //head hair color takes priority, owner hair color is a backup if we lack a head or something + if(my_head) + draw_color = my_head.hair_color + else + draw_color = human_owner.hair_color return TRUE ///Sprite accessories are singletons, stored list("Big Snout" = instance of /datum/sprite_accessory/snout/big), so here we get that singleton /datum/bodypart_overlay/mutant/proc/fetch_sprite_datum(datum/sprite_accessory/accessory_path) - var/list/feature_list = get_global_feature_list() - - return feature_list[initial(accessory_path.name)] + return fetch_sprite_datum_from_name(initial(accessory_path.name)) ///Get the singleton from the sprite name /datum/bodypart_overlay/mutant/proc/fetch_sprite_datum_from_name(accessory_name) var/list/feature_list = get_global_feature_list() - - return feature_list[accessory_name] + var/found = feature_list[accessory_name] + if(found) + return found + + if(!length(feature_list)) + CRASH("External organ [type] returned no sprite datums from get_global_feature_list(), so no accessories could be found!") + else if(accessory_name) + CRASH("External organ [type] couldn't find sprite accessory [accessory_name]!") + else + CRASH("External organ [type] had fetch_sprite_datum called with a null accessory name!") diff --git a/code/datums/bodypart_overlays/simple_bodypart_overlay.dm b/code/datums/bodypart_overlays/simple_bodypart_overlay.dm index 82304f11a5815..72fef44b2d456 100644 --- a/code/datums/bodypart_overlays/simple_bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/simple_bodypart_overlay.dm @@ -4,7 +4,7 @@ ///Icon state of the overlay var/icon_state ///Icon of the overlay - var/icon = 'icons/mob/species/misc/bodypart_overlay_simple.dmi' + var/icon = 'icons/mob/human/species/misc/bodypart_overlay_simple.dmi' ///Color we apply to our overlay (none by default) var/draw_color @@ -24,3 +24,8 @@ /datum/bodypart_overlay/simple/sixpack icon_state = "sixpack" layers = EXTERNAL_ADJACENT + +///A creampie drawn on the head +/datum/bodypart_overlay/simple/creampie + icon_state = "creampie_human" + layers = EXTERNAL_FRONT diff --git a/code/datums/brain_damage/brain_trauma.dm b/code/datums/brain_damage/brain_trauma.dm index 943573f38d13a..2bb26d1b44c0f 100644 --- a/code/datums/brain_damage/brain_trauma.dm +++ b/code/datums/brain_damage/brain_trauma.dm @@ -15,6 +15,9 @@ var/random_gain = TRUE //can this be gained through random traumas? var/resilience = TRAUMA_RESILIENCE_BASIC //how hard is this to cure? + /// Tracks abstract types of brain traumas, useful for determining traumas that should not exist + var/abstract_type = /datum/brain_trauma + /datum/brain_trauma/Destroy() // Handles our references with our brain brain?.remove_trauma_from_traumas(src) diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index 7b8b1d3759098..fc230632bdd2e 100644 --- a/code/datums/brain_damage/imaginary_friend.dm +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -92,30 +92,34 @@ * * imaginary_friend_owner - The living mob that owns the imaginary friend. * * appearance_from_prefs - If this is a valid set of prefs, the appearance of the imaginary friend is based on these prefs. */ -/mob/camera/imaginary_friend/Initialize(mapload, mob/living/imaginary_friend_owner, datum/preferences/appearance_from_prefs = null) +/mob/camera/imaginary_friend/Initialize(mapload) . = ..() - - owner = imaginary_friend_owner - - if(appearance_from_prefs) - INVOKE_ASYNC(src, PROC_REF(setup_friend_from_prefs), appearance_from_prefs) - else - INVOKE_ASYNC(src, PROC_REF(setup_friend)) - join = new join.Grant(src) hide = new hide.Grant(src) +/// Links this imaginary friend to the provided mob +/mob/camera/imaginary_friend/proc/attach_to_owner(mob/living/imaginary_friend_owner) + owner = imaginary_friend_owner if(!owner.imaginary_group) owner.imaginary_group = list(owner) owner.imaginary_group += src +/// Copies appearance from passed player prefs, or randomises them if none are provided +/mob/camera/imaginary_friend/proc/setup_appearance(datum/preferences/appearance_from_prefs = null) + if(appearance_from_prefs) + INVOKE_ASYNC(src, PROC_REF(setup_friend_from_prefs), appearance_from_prefs) + else + INVOKE_ASYNC(src, PROC_REF(setup_friend)) + +/// Randomise friend name and appearance /mob/camera/imaginary_friend/proc/setup_friend() var/gender = pick(MALE, FEMALE) real_name = random_unique_name(gender) name = real_name human_image = get_flat_human_icon(null, pick(SSjob.joinable_occupations)) + Show() /** * Sets up the imaginary friend's name and look using a set of datum preferences. @@ -146,13 +150,11 @@ if(istype(appearance_job, /datum/job/ai)) human_image = icon('icons/mob/silicon/ai.dmi', icon_state = resolve_ai_icon(appearance_from_prefs.read_preference(/datum/preference/choiced/ai_core_display)), dir = SOUTH) - return - - if(istype(appearance_job, /datum/job/cyborg)) + else if(istype(appearance_job, /datum/job/cyborg)) human_image = icon('icons/mob/silicon/robots.dmi', icon_state = "robot") - return - - human_image = get_flat_human_icon(null, appearance_job, appearance_from_prefs) + else + human_image = get_flat_human_icon(null, appearance_job, appearance_from_prefs) + Show() /// Returns all member clients of the imaginary_group /mob/camera/imaginary_friend/proc/group_clients() @@ -163,7 +165,7 @@ return group_clients /mob/camera/imaginary_friend/proc/Show() - if(!client) //nobody home + if(!client || !owner) //nobody home return var/list/friend_clients = group_clients() - src.client @@ -192,7 +194,7 @@ return ..() /mob/camera/imaginary_friend/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), 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))) + if (safe_read_pref(client, /datum/preference/toggle/enable_runechat) && (safe_read_pref(client, /datum/preference/toggle/enable_runechat_non_mobs) || ismob(speaker))) create_chat_message(speaker, message_language, raw_message, spans) to_chat(src, compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mods)) @@ -237,11 +239,11 @@ var/rendered = "[span_name("[name]")] [quoted_message]" var/dead_rendered = "[span_name("[name] (Imaginary friend of [owner])")] [quoted_message]" - var/language = message_language || owner.language_holder.get_selected_language() + var/language = message_language || owner.get_selected_language() Hear(rendered, src, language, message, null, spans, message_mods) // We always hear what we say var/group = owner.imaginary_group - src // The people in our group don't, so we have to exclude ourselves not to hear twice for(var/mob/person in group) - if(eavesdrop_range && get_dist(src, person) > 1 + eavesdrop_range) + if(eavesdrop_range && get_dist(src, person) > WHISPER_RANGE + eavesdrop_range && !HAS_TRAIT(person, TRAIT_GOOD_HEARING)) var/new_rendered = "[span_name("[name]")] [say_quote(say_emphasis(eavesdropped_message), spans, message_mods)]" person.Hear(new_rendered, src, language, eavesdropped_message, null, spans, message_mods) else @@ -250,7 +252,7 @@ // Speech bubble, but only for those who have runechat off var/list/speech_bubble_recipients = list() for(var/mob/user as anything in (group + src)) // Add ourselves back in - if(user.client && (!user.client.prefs.read_preference(/datum/preference/toggle/enable_runechat) || (SSlag_switch.measures[DISABLE_RUNECHAT] && !HAS_TRAIT(src, TRAIT_BYPASS_MEASURES)))) + if((safe_read_pref(user.client, /datum/preference/toggle/enable_runechat) || (SSlag_switch.measures[DISABLE_RUNECHAT] && !HAS_TRAIT(src, TRAIT_BYPASS_MEASURES)))) speech_bubble_recipients.Add(user.client) var/image/bubble = image('icons/mob/effects/talk.dmi', src, "[bubble_type][say_test(message)]", FLY_LAYER) @@ -267,9 +269,9 @@ for(var/mob/dead_player in GLOB.dead_mob_list) if(dead_player.z != z || get_dist(src, dead_player) > 7) if(eavesdrop_range) - if(!(dead_player.client?.prefs.chat_toggles & CHAT_GHOSTWHISPER)) + if(!(get_chat_toggles(dead_player.client) & CHAT_GHOSTWHISPER)) continue - else if(!(dead_player.client?.prefs.chat_toggles & CHAT_GHOSTEARS)) + else if(!(get_chat_toggles(dead_player.client) & CHAT_GHOSTEARS)) continue var/link = FOLLOW_LINK(dead_player, owner) to_chat(dead_player, "[link] [dead_rendered]") @@ -309,12 +311,12 @@ for(var/mob/ghost as anything in GLOB.dead_mob_list) if(!ghost.client || isnewplayer(ghost)) continue - if(ghost.client.prefs.chat_toggles & CHAT_GHOSTSIGHT && !(ghost in viewers(user_turf, null))) + if(get_chat_toggles(ghost.client) & CHAT_GHOSTSIGHT && !(ghost in viewers(user_turf, null))) ghost.show_message("[FOLLOW_LINK(ghost, user)] [dchatmsg]") for(var/mob/person in friend.owner.imaginary_group) to_chat(person, message) - if(person.client?.prefs.read_preference(/datum/preference/toggle/enable_runechat)) + if(safe_read_pref(person.client, /datum/preference/toggle/enable_runechat)) person.create_chat_message(friend, raw_message = msg, runechat_flags = EMOTE_MESSAGE) return TRUE diff --git a/code/datums/brain_damage/magic.dm b/code/datums/brain_damage/magic.dm index ac27ca6555509..441d220a5ded3 100644 --- a/code/datums/brain_damage/magic.dm +++ b/code/datums/brain_damage/magic.dm @@ -3,6 +3,7 @@ //Unlike regular traumas this can affect the victim's body and surroundings /datum/brain_trauma/magic + abstract_type = /datum/brain_trauma/magic resilience = TRAUMA_RESILIENCE_LOBOTOMY /datum/brain_trauma/magic/lumiphobia diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm index 87e6ebe0b2237..c3d06976ed52e 100644 --- a/code/datums/brain_damage/mild.dm +++ b/code/datums/brain_damage/mild.dm @@ -3,6 +3,7 @@ //Most of the old brain damage effects have been transferred to the dumbness trauma. /datum/brain_trauma/mild + abstract_type = /datum/brain_trauma/mild /datum/brain_trauma/mild/hallucinations name = "Hallucinations" @@ -88,7 +89,7 @@ if(SPT_PROB(2.5, seconds_per_tick)) switch(rand(1,11)) if(1) - owner.vomit() + owner.vomit(VOMIT_CATEGORY_DEFAULT) if(2,3) owner.adjust_dizzy(20 SECONDS) if(4,5) @@ -132,7 +133,7 @@ /datum/brain_trauma/mild/muscle_weakness/on_life(seconds_per_tick, times_fired) var/fall_chance = 1 - if(owner.m_intent == MOVE_INTENT_RUN) + if(owner.move_intent == MOVE_INTENT_RUN) fall_chance += 2 if(SPT_PROB(0.5 * fall_chance, seconds_per_tick) && owner.body_position == STANDING_UP) to_chat(owner, span_warning("Your leg gives out!")) @@ -265,3 +266,18 @@ speak_dejavu += speech_args[SPEECH_MESSAGE] else speak_dejavu += speech_args[SPEECH_MESSAGE] + +/datum/brain_trauma/mild/color_blindness + name = "Achromatopsia" + desc = "Patient's occipital lobe is unable to recognize and interpret color, rendering the patient completely colorblind." + scan_desc = "colorblindness" + gain_text = span_warning("The world around you seems to lose its color.") + lose_text = span_notice("The world feels bright and colorful again.") + +/datum/brain_trauma/mild/color_blindness/on_gain() + owner.add_client_colour(/datum/client_colour/monochrome/colorblind) + return ..() + +/datum/brain_trauma/mild/color_blindness/on_lose(silent) + owner.remove_client_colour(/datum/client_colour/monochrome/colorblind) + return ..() diff --git a/code/datums/brain_damage/phobia.dm b/code/datums/brain_damage/phobia.dm index 2db262de7509e..3360ed360527d 100644 --- a/code/datums/brain_damage/phobia.dm +++ b/code/datums/brain_damage/phobia.dm @@ -109,9 +109,9 @@ return var/message = pick("spooks you to the bone", "shakes you up", "terrifies you", "sends you into a panic", "sends chills down your spine") if(reason) - to_chat(owner, span_userdanger("Seeing [reason] [message]!")) + to_chat(owner, span_userdanger("Seeing [span_phobia(reason.name)] [message]!")) else if(trigger_word) - to_chat(owner, span_userdanger("Hearing \"[trigger_word]\" [message]!")) + to_chat(owner, span_userdanger("Hearing [span_phobia(trigger_word)] [message]!")) else to_chat(owner, span_userdanger("Something [message]!")) var/reaction = rand(1,4) @@ -187,6 +187,10 @@ phobia_type = "guns" random_gain = FALSE +/datum/brain_trauma/mild/phobia/heresy + phobia_type = "heresy" + random_gain = FALSE + /datum/brain_trauma/mild/phobia/insects phobia_type = "insects" random_gain = FALSE diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index ffaf8f7185764..90248df1cfb8c 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -3,6 +3,7 @@ //They cannot be cured with chemicals, and require brain surgery to solve. /datum/brain_trauma/severe + abstract_type = /datum/brain_trauma/severe resilience = TRAUMA_RESILIENCE_SURGERY /datum/brain_trauma/severe/mute @@ -28,13 +29,15 @@ lose_text = span_notice("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.grant_language(/datum/language/aphasia, TRUE, TRUE, LANGUAGE_APHASIA) + owner.add_blocked_language(subtypesof(/datum/language) - /datum/language/aphasia, LANGUAGE_APHASIA) + owner.grant_language(/datum/language/aphasia, source = 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(!QDELING(owner)) + owner.remove_blocked_language(subtypesof(/datum/language), LANGUAGE_APHASIA) + owner.remove_language(/datum/language/aphasia, source = LANGUAGE_APHASIA) + ..() /datum/brain_trauma/severe/blindness @@ -117,6 +120,16 @@ paralysis_type = "legs" resilience = TRAUMA_RESILIENCE_ABSOLUTE +/datum/brain_trauma/severe/paralysis/hemiplegic + random_gain = FALSE + resilience = TRAUMA_RESILIENCE_ABSOLUTE + +/datum/brain_trauma/severe/paralysis/hemiplegic/left + paralysis_type = "left" + +/datum/brain_trauma/severe/paralysis/hemiplegic/right + paralysis_type = "right" + /datum/brain_trauma/severe/narcolepsy name = "Narcolepsy" desc = "Patient may involuntarily fall asleep during normal activities." @@ -130,7 +143,7 @@ var/sleep_chance = 1 var/drowsy = !!owner.has_status_effect(/datum/status_effect/drowsiness) - if(owner.m_intent == MOVE_INTENT_RUN) + if(owner.move_intent == MOVE_INTENT_RUN) sleep_chance += 2 if(drowsy) sleep_chance += 3 diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm index d0be9df52b439..ed3e91707b99d 100644 --- a/code/datums/brain_damage/special.dm +++ b/code/datums/brain_damage/special.dm @@ -2,6 +2,7 @@ //they are the easiest to cure, which means that if you want //to keep them, you can't cure your other traumas /datum/brain_trauma/special + abstract_type = /datum/brain_trauma/special /datum/brain_trauma/special/godwoken name = "Godwoken Syndrome" @@ -45,7 +46,7 @@ message = pick_list_replacements(BRAIN_DAMAGE_FILE, "god_neutral") playsound(get_turf(owner), 'sound/magic/clockwork/invoke_general.ogg', 200, TRUE, 5) - voice_of_god(message, owner, list("colossus","yell"), 2.5, include_owner, name) + voice_of_god(message, owner, list("colossus","yell"), 2.5, include_owner, name, TRUE) /datum/brain_trauma/special/bluespace_prophet name = "Bluespace Prophecy" diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm index 4c7b6a46100ec..f2120505f72f4 100644 --- a/code/datums/brain_damage/split_personality.dm +++ b/code/datums/brain_damage/split_personality.dm @@ -11,6 +11,8 @@ var/initialized = FALSE //to prevent personalities deleting themselves while we wait for ghosts var/mob/living/split_personality/stranger_backseat //there's two so they can swap without overwriting var/mob/living/split_personality/owner_backseat + ///The role to display when polling ghost + var/poll_role = "split personality" /datum/brain_trauma/severe/split_personality/on_gain() var/mob/living/M = owner @@ -33,7 +35,7 @@ /datum/brain_trauma/severe/split_personality/proc/get_ghost() set waitfor = FALSE - var/list/mob/dead/observer/candidates = poll_candidates_for_mob("Do you want to play as [owner.real_name]'s split personality?", ROLE_PAI, null, 7.5 SECONDS, stranger_backseat, POLL_IGNORE_SPLITPERSONALITY) + var/list/mob/dead/observer/candidates = poll_candidates_for_mob("Do you want to play as [owner.real_name]'s [poll_role]?", ROLE_PAI, null, 7.5 SECONDS, stranger_backseat, POLL_IGNORE_SPLITPERSONALITY) if(LAZYLEN(candidates)) var/mob/dead/observer/C = pick(candidates) stranger_backseat.key = C.key @@ -238,5 +240,53 @@ if(objective) to_chat(src, span_notice("Your master left you an objective: [objective]. Follow it at all costs when in control.")) +/datum/brain_trauma/severe/split_personality/blackout + name = "Alcohol-Induced CNS Impairment" + desc = "Patient's CNS has been temporarily impaired by imbibed alcohol, blocking memory formation, and causing reduced cognition and stupefaction." + scan_desc = "alcohol-induced CNS impairment" + gain_text = span_warning("Crap, that was one drink too many. You black out...") + lose_text = "You wake up very, very confused and hungover. All you can remember is drinking a lot of alcohol... what happened?" + poll_role = "blacked out drunkard" + /// Duration of effect, tracked in seconds, not deciseconds. qdels when reaching 0. + var/duration_in_seconds = 180 + +/datum/brain_trauma/severe/split_personality/blackout/on_gain() + . = ..() + RegisterSignal(owner, COMSIG_ATOM_SPLASHED, PROC_REF(on_splashed)) + +/datum/brain_trauma/severe/split_personality/blackout/on_lose() + . = ..() + owner.add_mood_event("hang_over", /datum/mood_event/hang_over) + UnregisterSignal(owner, COMSIG_ATOM_SPLASHED) + +/datum/brain_trauma/severe/split_personality/blackout/proc/on_splashed() + SIGNAL_HANDLER + if(prob(20))//we don't want every single splash to wake them up now do we + qdel(src) + +/datum/brain_trauma/severe/split_personality/blackout/on_life(seconds_per_tick, times_fired) + if(current_controller == OWNER) + switch_personalities() + if(owner.stat == DEAD) + if(current_controller != OWNER) + switch_personalities(TRUE) + qdel(src) + return + if(duration_in_seconds <= 0) + qdel(src) + return + duration_in_seconds -= seconds_per_tick + +/mob/living/split_personality/blackout + name = "blacked-out drunkard" + real_name = "drunken consciousness" + +/mob/living/split_personality/blackout/Login() + . = ..() + if(!. || !client) + return FALSE + to_chat(src, span_notice("You're the incredibly inebriated leftovers of your host's consciousness! Make sure to act the part and leave a trail of confusion and chaos in your wake.")) + to_chat(src, span_boldwarning("Do not commit suicide or put the body in danger, you have a minor liscense to grief just like a clown, do not kill anyone or create a situation leading to the body being in danger or in harm ways. While you're drunk, you're not suicidal.")) + #undef OWNER #undef STRANGER diff --git a/code/datums/callback.dm b/code/datums/callback.dm index a51639d0b9b11..026762d58f735 100644 --- a/code/datums/callback.dm +++ b/code/datums/callback.dm @@ -68,6 +68,21 @@ if(usr) user = WEAKREF(usr) +/** + * 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/chatmessage.dm b/code/datums/chatmessage.dm index 3debadbda7013..6ee4eaddd3f94 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -13,7 +13,7 @@ /// Approximate height in pixels of an 'average' line, used for height decay #define CHAT_MESSAGE_APPROX_LHEIGHT 11 /// Max width of chat message in pixels -#define CHAT_MESSAGE_WIDTH 96 +#define CHAT_MESSAGE_WIDTH 112 /// The dimensions of the chat message icons #define CHAT_MESSAGE_ICON_SIZE 9 @@ -145,6 +145,10 @@ if (!ismob(target)) extra_classes |= "small" + // Why are you yelling? + if(copytext_char(text, -2) == "!!") + extra_classes |= SPAN_YELL + var/list/prefixes // Append radio icon if from a virtual speaker @@ -171,7 +175,7 @@ var/tgt_color = extra_classes.Find("italics") ? target.chat_color_darkened : target.chat_color // Approximate text height - var/complete_text = "[owner.say_emphasis(text)]" + var/complete_text = "[owner.say_emphasis(text)]" var/mheight WXH_TO_HEIGHT(owned_by.MeasureText(complete_text, null, CHAT_MESSAGE_WIDTH), mheight) @@ -189,7 +193,7 @@ /datum/chatmessage/proc/finish_image_generation(mheight, atom/target, mob/owner, complete_text, lifespan) var/rough_time = REALTIMEOFDAY approx_lines = max(1, mheight / CHAT_MESSAGE_APPROX_LHEIGHT) - + var/starting_height = target.maptext_height // Translate any existing messages upwards, apply exponential decay factors to timers message_loc = isturf(target) ? target : get_atom_on_turf(target) if (owned_by.seen_messages) @@ -204,7 +208,12 @@ // When choosing to update the remaining time we have to be careful not to update the // scheduled time once the EOL has been executed. if (time_spent >= time_before_fade) - animate(m.message, pixel_y = m.message.pixel_y + mheight, time = CHAT_MESSAGE_SPAWN_TIME, flags = ANIMATION_PARALLEL) + if(m.message.pixel_y < starting_height) + var/max_height = m.message.pixel_y + m.approx_lines * CHAT_MESSAGE_APPROX_LHEIGHT - starting_height + if(max_height > 0) + animate(m.message, pixel_y = m.message.pixel_y + max_height, time = CHAT_MESSAGE_SPAWN_TIME, flags = ANIMATION_PARALLEL) + else if(mheight + starting_height >= m.message.pixel_y) + animate(m.message, pixel_y = m.message.pixel_y + mheight, time = CHAT_MESSAGE_SPAWN_TIME, flags = ANIMATION_PARALLEL) continue var/remaining_time = time_before_fade * (CHAT_MESSAGE_EXP_DECAY ** idx++) * (CHAT_MESSAGE_HEIGHT_DECAY ** combined_height) @@ -221,7 +230,12 @@ animate(alpha = 0, time = CHAT_MESSAGE_EOL_FADE) // We run this after the alpha animate, because we don't want to interrup it, but also don't want to block it by running first // Sooo instead we do this. bit messy but it fuckin works - animate(m.message, pixel_y = m.message.pixel_y + mheight, time = CHAT_MESSAGE_SPAWN_TIME, flags = ANIMATION_PARALLEL) + if(m.message.pixel_y < starting_height) + var/max_height = m.message.pixel_y + m.approx_lines * CHAT_MESSAGE_APPROX_LHEIGHT - starting_height + if(max_height > 0) + animate(m.message, pixel_y = m.message.pixel_y + max_height, time = CHAT_MESSAGE_SPAWN_TIME, flags = ANIMATION_PARALLEL) + else if(mheight + starting_height >= m.message.pixel_y) + animate(m.message, pixel_y = m.message.pixel_y + mheight, time = CHAT_MESSAGE_SPAWN_TIME, flags = ANIMATION_PARALLEL) // Reset z index if relevant if (current_z_idx >= CHAT_LAYER_MAX_Z) @@ -232,10 +246,10 @@ SET_PLANE_EXPLICIT(message, RUNECHAT_PLANE, message_loc) message.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA | KEEP_APART message.alpha = 0 - message.pixel_y = target.maptext_height + message.pixel_y = starting_height message.pixel_x = -target.base_pixel_x message.maptext_width = CHAT_MESSAGE_WIDTH - message.maptext_height = mheight + message.maptext_height = mheight * 1.25 // We add extra because some characters are superscript, like actions message.maptext_x = (CHAT_MESSAGE_WIDTH - owner.bound_width) * -0.5 message.maptext = MAPTEXT(complete_text) diff --git a/code/datums/cinematics/_cinematic.dm b/code/datums/cinematics/_cinematic.dm index 68b288e1227c7..a0344434ec459 100644 --- a/code/datums/cinematics/_cinematic.dm +++ b/code/datums/cinematics/_cinematic.dm @@ -1,3 +1,5 @@ +#define CINEMATIC_SOURCE "cinematic" + /** * Plays a cinematic, duh. Can be to a select few people, or everyone. * @@ -30,7 +32,7 @@ /datum/cinematic /// A list of all clients watching the cinematic var/list/client/watching = list() - /// A list of all mobs who have notransform set while watching the cinematic + /// A list of all mobs who have TRAIT_NO_TRANSFORM set while watching the cinematic var/list/datum/weakref/locked = list() /// Whether the cinematic is a global cinematic or not var/is_global = FALSE @@ -52,7 +54,7 @@ /datum/cinematic/Destroy() QDEL_NULL(screen) - QDEL_NULL(special_callback) + special_callback = null watching.Cut() locked.Cut() return ..() @@ -106,11 +108,7 @@ /datum/cinematic/proc/show_to(mob/watching_mob, client/watching_client) SIGNAL_HANDLER - // We could technically rip people out of notransform who shouldn't be, - // so we'll only lock down all viewing mobs who don't have it already set. - // This does potentially mean some mobs could lose their notrasnform and - // not be locked down by cinematics, but that should be very unlikely. - if(!watching_mob.notransform) + if(!HAS_TRAIT_FROM(watching_mob, TRAIT_NO_TRANSFORM, CINEMATIC_SOURCE)) lock_mob(watching_mob) // Only show the actual cinematic to cliented mobs. @@ -152,14 +150,14 @@ /// Locks a mob, preventing them from moving, being hurt, or acting /datum/cinematic/proc/lock_mob(mob/to_lock) locked += WEAKREF(to_lock) - to_lock.notransform = TRUE + ADD_TRAIT(to_lock, TRAIT_NO_TRANSFORM, CINEMATIC_SOURCE) /// Unlocks a previously locked weakref /datum/cinematic/proc/unlock_mob(datum/weakref/mob_ref) var/mob/locked_mob = mob_ref.resolve() if(isnull(locked_mob)) return - locked_mob.notransform = FALSE + REMOVE_TRAIT(locked_mob, TRAIT_NO_TRANSFORM, CINEMATIC_SOURCE) UnregisterSignal(locked_mob, COMSIG_MOB_CLIENT_LOGIN) /// Removes the passed client from our watching list. @@ -171,8 +169,10 @@ UnregisterSignal(no_longer_watching, COMSIG_QDELETING) // We'll clear the cinematic if they have a mob which has one, - // but we won't remove notransform. Wait for the cinematic end to do that. + // but we won't remove TRAIT_NO_TRANSFORM. Wait for the cinematic end to do that. no_longer_watching.mob?.clear_fullscreen("cinematic") no_longer_watching.screen -= screen watching -= no_longer_watching + +#undef CINEMATIC_SOURCE diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index 26d562a824ad3..e461aa2ee36d3 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -169,12 +169,13 @@ return /** - * Called when the component has a new source registered + * Called when the component has a new source registered. + * Return COMPONENT_INCOMPATIBLE to signal that the source is incompatible and should not be added */ -/datum/component/proc/on_source_add(source) +/datum/component/proc/on_source_add(source, ...) SHOULD_CALL_PARENT(TRUE) if(dupe_mode != COMPONENT_DUPE_SOURCES) - CRASH("Component '[type]' does not use sources but has been given a source") + return COMPONENT_INCOMPATIBLE LAZYOR(sources, source) /** @@ -236,12 +237,12 @@ */ /datum/component/proc/_GetInverseTypeList(our_type = type) //we can do this one simple trick + . = list(our_type) var/current_type = parent_type - . = list(our_type, current_type) //and since most components are root level + 1, this won't even have to run while (current_type != /datum/component) + . += current_type current_type = type2parent(current_type) - . += current_type // The type arg is casted so initial works, you shouldn't be passing a real instance into this /** @@ -317,6 +318,17 @@ if(QDELING(src)) CRASH("Attempted to add a new component of type \[[component_type]\] to a qdeleting parent of type \[[type]\]!") + var/datum/component/new_component + + if(!ispath(component_type, /datum/component)) + if(!istype(component_type, /datum/component)) + CRASH("Attempted to instantiate \[[component_type]\] as a component added to parent of type \[[type]\]!") + else + new_component = component_type + component_type = new_component.type + else if(component_type == /datum/component) + CRASH("[component_type] attempted instantiation!") + var/dupe_mode = initial(component_type.dupe_mode) var/dupe_type = initial(component_type.dupe_type) var/uses_sources = (dupe_mode == COMPONENT_DUPE_SOURCES) @@ -326,17 +338,9 @@ CRASH("Attempted to add a normal component of type '[component_type]' to '[type]' with a source!") var/datum/component/old_component - var/datum/component/new_component - - if(ispath(component_type)) - if(component_type == /datum/component) - CRASH("[component_type] attempted instantiation!") - else - new_component = component_type - component_type = new_component.type raw_args[1] = src - if(dupe_mode != COMPONENT_DUPE_ALLOWED && dupe_mode != COMPONENT_DUPE_SELECTIVE) + if(dupe_mode != COMPONENT_DUPE_ALLOWED && dupe_mode != COMPONENT_DUPE_SELECTIVE && dupe_mode != COMPONENT_DUPE_SOURCES) if(!dupe_type) old_component = GetExactComponent(component_type) else @@ -369,10 +373,14 @@ if(COMPONENT_DUPE_SOURCES) if(source in old_component.sources) return old_component // source already registered, no work to do - old_component.on_source_add(source) + + if(old_component.on_source_add(arglist(list(source) + raw_args.Copy(2))) == COMPONENT_INCOMPATIBLE) + stack_trace("incompatible source added to a [old_component.type]. Args: [json_encode(raw_args)]") + return null else if(!new_component) new_component = new component_type(raw_args) // There's a valid dupe mode but there's no old component, act like normal + else if(dupe_mode == COMPONENT_DUPE_SELECTIVE) var/list/arguments = raw_args.Copy() arguments[1] = new_component @@ -384,12 +392,17 @@ break if(!new_component && make_new_component) new_component = new component_type(raw_args) + + else if(dupe_mode == COMPONENT_DUPE_SOURCES) + new_component = new component_type(raw_args) + if(new_component.on_source_add(arglist(list(source) + raw_args.Copy(2))) == COMPONENT_INCOMPATIBLE) + stack_trace("incompatible source added to a [new_component.type]. Args: [json_encode(raw_args)]") + return null + else if(!new_component) new_component = new component_type(raw_args) // Dupes are allowed, act like normal if(!old_component && !QDELETED(new_component)) // Nothing related to duplicate components happened and the new component is healthy - if(uses_sources) // make sure they have the source added if they use sources - new_component.on_source_add(source) SEND_SIGNAL(src, COMSIG_COMPONENT_ADDED, new_component) return new_component @@ -402,7 +415,7 @@ if(ispath(component_type)) component_type = GetExactComponent(component_type) if(!component_type) - CRASH("Attempted to remove a null or non-existent component '[component_type]' from '[type]'") + return component_type.on_source_remove(source) /** @@ -468,15 +481,16 @@ var/list/dc = _datum_components if(!dc) return - var/comps = dc[/datum/component] - if(islist(comps)) - for(var/datum/component/I in comps) - if(I.can_transfer) - target.TakeComponent(I) - else - var/datum/component/C = comps - if(C.can_transfer) - target.TakeComponent(comps) + for(var/component_key in dc) + var/component_or_list = dc[component_key] + if(islist(component_or_list)) + for(var/datum/component/I in component_or_list) + if(I.can_transfer) + target.TakeComponent(I) + else + var/datum/component/C = component_or_list + if(C.can_transfer) + target.TakeComponent(C) /** * Return the object that is the host of any UI's that this component has diff --git a/code/datums/components/acid.dm b/code/datums/components/acid.dm index 89430ff368e29..1d9cf9e87d68f 100644 --- a/code/datums/components/acid.dm +++ b/code/datums/components/acid.dm @@ -15,43 +15,48 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e var/acid_volume /// The maximum volume of acid on the parent [/atom]. var/max_volume = INFINITY - /// Acid overlay appearance we apply - var/acid_overlay - /// 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 var/stage = 0 + /// Acid overlay appearance we apply + var/acid_overlay + /// Boolean for if we ignore mobs when applying acid to turf contents + var/turf_acid_ignores_mobs = FALSE + /// The ambient sound of acid eating away at the parent [/atom]. + var/datum/looping_sound/acid/sizzle + /// Particle holder for acid particles (sick) + var/obj/effect/abstract/particle_holder/particle_effect /// The proc used to handle the parent [/atom] when processing. TODO: Unify damage and resistance flags so that this doesn't need to exist! var/datum/callback/process_effect -/datum/component/acid/Initialize(acid_power = ACID_POWER_MELT_TURF, acid_volume = 50, acid_overlay = GLOB.acid_overlay) +/datum/component/acid/Initialize(acid_power = ACID_POWER_MELT_TURF, acid_volume = 50, acid_overlay = GLOB.acid_overlay, acid_particles = /particles/acid, turf_acid_ignores_mobs = FALSE) if(!isatom(parent)) return COMPONENT_INCOMPATIBLE - //not incompatible, but pointless + + // The parent object cannot have acid. Not incompatible, but should not really happen. var/atom/atom_parent = parent - if((acid_power) <= 0 || (acid_volume <= 0)) - stack_trace("Acid component added to an atom ([atom_parent.type]) with insufficient acid power ([acid_power]) or acid volume ([acid_volume]).") + if(atom_parent.resistance_flags & UNACIDABLE) qdel(src) return + //Not incompatible, but pointless + if((acid_power <= 0) || (acid_volume <= 0)) + qdel(src) + stack_trace("Tried to add /datum/component/acid to an atom ([atom_parent.type]) with insufficient acid power ([acid_power]) or acid volume ([acid_volume]).") + return if(isliving(parent)) - max_volume = MOB_ACID_VOLUME_MAX - process_effect = CALLBACK(src, PROC_REF(process_mob), parent) + src.max_volume = MOB_ACID_VOLUME_MAX + src.process_effect = CALLBACK(src, PROC_REF(process_mob), parent) else if(isturf(parent)) - max_volume = TURF_ACID_VOLUME_MAX - process_effect = CALLBACK(src, PROC_REF(process_turf), parent) + src.turf_acid_ignores_mobs = turf_acid_ignores_mobs + src.max_volume = TURF_ACID_VOLUME_MAX + src.process_effect = CALLBACK(src, PROC_REF(process_turf), parent) //if we failed all other checks, we must be an /atom/movable that uses integrity else if(atom_parent.uses_integrity) - // The parent object cannot have acid. Not incompatible, but should not really happen. - if(atom_parent.resistance_flags & UNACIDABLE) - qdel(src) - return - - max_volume = MOVABLE_ACID_VOLUME_MAX - process_effect = CALLBACK(src, PROC_REF(process_movable), parent) + src.max_volume = MOVABLE_ACID_VOLUME_MAX + src.process_effect = CALLBACK(src, PROC_REF(process_movable), parent) //or not... else stack_trace("Tried to add /datum/component/acid to an atom ([atom_parent.type]) which does not use atom_integrity!") @@ -61,23 +66,27 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e set_volume(acid_volume) src.acid_overlay = acid_overlay - sizzle = new(parent, TRUE) + sizzle = new(atom_parent, TRUE) + if(acid_particles) + // acid particles look pretty bad when they stack on mobs, so that behavior is not wanted for items + particle_effect = new(atom_parent, acid_particles, isitem(atom_parent) ? NONE : PARTICLE_ATTACH_MOB) START_PROCESSING(SSacid, src) /datum/component/acid/Destroy(force, silent) STOP_PROCESSING(SSacid, src) if(sizzle) QDEL_NULL(sizzle) - if(process_effect) - QDEL_NULL(process_effect) + if(particle_effect) + QDEL_NULL(particle_effect) + process_effect = null return ..() /datum/component/acid/RegisterWithParent() + RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_attack_hand)) RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(parent, COMSIG_ATOM_EXPOSE_REAGENT, PROC_REF(on_expose_reagent)) RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_update_overlays)) RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(on_clean)) - RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_attack_hand)) - RegisterSignal(parent, COMSIG_ATOM_EXPOSE_REAGENT, PROC_REF(on_expose_reagent)) if(isturf(parent)) RegisterSignal(parent, COMSIG_ATOM_ENTERED, PROC_REF(on_entered)) var/atom/atom_parent = parent @@ -85,11 +94,12 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e /datum/component/acid/UnregisterFromParent() UnregisterSignal(parent, list( + COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_EXAMINE, + COMSIG_ATOM_EXPOSE_REAGENT, COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_COMPONENT_CLEAN_ACT, - COMSIG_ATOM_ATTACK_HAND, - COMSIG_ATOM_EXPOSE_REAGENT)) + )) if(isturf(parent)) UnregisterSignal(parent, COMSIG_ATOM_ENTERED) var/atom/atom_parent = parent @@ -98,6 +108,8 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e /// Averages corrosive power and sums volume. /datum/component/acid/InheritComponent(datum/component/new_comp, i_am_original, acid_power, acid_volume) + if(!i_am_original) + return acid_power = ((src.acid_power * src.acid_volume) + (acid_power * acid_volume)) / (src.acid_volume + acid_volume) set_volume(src.acid_volume + acid_volume) @@ -109,6 +121,11 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e /// Handles the slow corrosion of the parent [/atom]. /datum/component/acid/process(seconds_per_tick) + // If we somehow got unacidable, we need to bail out + var/atom/parent_atom = parent + if(parent_atom.resistance_flags & UNACIDABLE) + qdel(src) + return process_effect?.InvokeAsync(seconds_per_tick) if(QDELING(src)) //The process effect deals damage, and on turfs diminishes the acid volume, potentially destroying the component. Let's not destroy it twice. return @@ -122,6 +139,8 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e /// Handles processing on a [/mob/living]. /datum/component/acid/proc/process_mob(mob/living/target, seconds_per_tick) + if(target.resistance_flags & ACID_PROOF) + return target.acid_act(acid_power, acid_volume * seconds_per_tick) /// Handles processing on a [/turf]. @@ -129,13 +148,31 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e var/acid_used = min(acid_volume * 0.05, 20) * seconds_per_tick var/applied_targets = 0 for(var/atom/movable/target_movable as anything in target_turf) + // Dont apply acid to things under the turf + if(target_turf.underfloor_accessibility < UNDERFLOOR_INTERACTABLE && HAS_TRAIT(target_movable, TRAIT_T_RAY_VISIBLE)) + continue + // Ignore mobs if turf_acid_ignores_mobs is TRUE + if(turf_acid_ignores_mobs && ismob(target_movable)) + continue + // Apply the acid if(target_movable.acid_act(acid_power, acid_used)) applied_targets++ if(applied_targets) set_volume(acid_volume - (acid_used * applied_targets)) - // Snowflake code for handling acid melting walls. TODO: Move integrity handling to the atom level so this can be desnowflaked. + if(target_turf.resistance_flags & ACID_PROOF) + return + + // Snowflake code for handling acid melting walls. + // We really should consider making turfs use atom_integrity, but for now this is just for acids. + + //Strong walls will never get melted + if(target_turf.get_explosive_block() >= 2) + return + //Reinforced floors never get melted + if(istype(target_turf, /turf/open/floor/engine)) + return if(acid_power < ACID_POWER_MELT_TURF) return @@ -167,7 +204,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e /datum/component/acid/proc/on_examine(atom/source, mob/user, list/examine_list) SIGNAL_HANDLER - examine_list += span_danger("[source.p_theyre(TRUE)] covered in a corrosive liquid!") + examine_list += span_danger("[source.p_Theyre()] covered in a corrosive liquid!") /// Makes it possible to clean acid off of objects. /datum/component/acid/proc/on_clean(atom/source, clean_types) @@ -189,25 +226,22 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e set_volume(acid_volume + reac_volume) return NONE -/// Handles searing the hand of anyone who tries to touch this without protection. -/datum/component/acid/proc/on_attack_hand(atom/parent_atom, mob/living/carbon/user) +/// Handles searing the hand of anyone who tries to touch parent without protection. +/datum/component/acid/proc/on_attack_hand(atom/source, mob/living/carbon/user) SIGNAL_HANDLER - if(!istype(user)) - return NONE - if((parent_atom == user) || (parent_atom.loc == user)) - return NONE // So people can take their own clothes off. - if((acid_power * acid_volume) < ACID_LEVEL_HANDBURN) - return NONE - if(user.gloves?.resistance_flags & (UNACIDABLE|ACID_PROOF)) + if(!iscarbon(user) || user.can_touch_acid(source, acid_power, acid_volume)) 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)) + var/obj/item/bodypart/affecting = user.get_active_hand() + //Should not happen! + if(!affecting) 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) + affecting.receive_damage(burn = 5) + to_chat(user, span_userdanger("The acid on \the [source] burns your hand!")) + INVOKE_ASYNC(user, TYPE_PROC_REF(/mob, emote), "scream") + playsound(source, SFX_SEAR, 50, TRUE) user.update_damage_overlays() return COMPONENT_CANCEL_ATTACK_CHAIN @@ -215,18 +249,21 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e /datum/component/acid/proc/on_entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) SIGNAL_HANDLER + if(turf_acid_ignores_mobs) + return if(!isliving(arrived)) return var/mob/living/crosser = arrived if(crosser.movement_type & FLYING) return - if(crosser.m_intent == MOVE_INTENT_WALK) + if(crosser.move_intent == MOVE_INTENT_WALK) return if(prob(60)) return var/acid_used = min(acid_volume * 0.05, 20) - if(crosser.acid_act(acid_power, acid_used, FEET)) - playsound(crosser, 'sound/weapons/sear.ogg', 50, TRUE) - to_chat(crosser, span_userdanger("The acid on the [parent] burns you!")) - set_volume(max(acid_volume - acid_used, 10)) + if(!crosser.acid_act(acid_power, acid_used, FEET)) + return + playsound(crosser, SFX_SEAR, 50, TRUE) + to_chat(crosser, span_userdanger("The acid on the [parent] burns you!")) + set_volume(max(acid_volume - acid_used, 10)) diff --git a/code/datums/components/action_item_overlay.dm b/code/datums/components/action_item_overlay.dm index 221fc38775c87..e7e567cde3673 100644 --- a/code/datums/components/action_item_overlay.dm +++ b/code/datums/components/action_item_overlay.dm @@ -26,7 +26,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/admin_popup.dm b/code/datums/components/admin_popup.dm index 6edd839942d57..1d258653bae47 100644 --- a/code/datums/components/admin_popup.dm +++ b/code/datums/components/admin_popup.dm @@ -83,7 +83,7 @@ /// The `world.time` when the last color update occurred. var/last_update_time = 0 -/atom/movable/screen/admin_popup/Initialize(mapload, ...) +/atom/movable/screen/admin_popup/Initialize(mapload, datum/hud/hud_owner, ...) . = ..() START_PROCESSING(SSobj, src) @@ -104,9 +104,9 @@ last_color_index = (last_color_index % colors.len) + 1 - var/message = "" - message += "HEY! An admin is trying to talk to you!
Check your chat window, and click their name to respond!" - message += "
" + var/message = "" + message += "HEY!
An admin is trying to talk to you!
Check your chat window,
and click their name to respond!" + message += "
" maptext = MAPTEXT(message) last_update_time = world.time diff --git a/code/datums/components/aggro_emote.dm b/code/datums/components/aggro_emote.dm new file mode 100644 index 0000000000000..0688d277aa43b --- /dev/null +++ b/code/datums/components/aggro_emote.dm @@ -0,0 +1,54 @@ +/// A component for ai-controlled atoms which plays a sound if they switch to a living target which they can attack +/datum/component/aggro_emote + /// Blackboard key in which target data is stored + var/target_key + /// If we want to limit emotes to only play at mobs + var/living_only + /// List of emotes to play + var/list/emote_list + /// Chance to play an emote + var/emote_chance + /// Chance to subtract every time we play an emote (permanently) + var/subtract_chance + /// Minimum chance to play an emote + var/minimum_chance + +/datum/component/aggro_emote/Initialize( + target_key = BB_BASIC_MOB_CURRENT_TARGET, + living_only = FALSE, + list/emote_list, + emote_chance = 30, + minimum_chance = 2, + subtract_chance = 7, +) + . = ..() + if (!isatom(parent)) + return COMPONENT_INCOMPATIBLE + var/atom/atom_parent = parent + if (!atom_parent.ai_controller) + return COMPONENT_INCOMPATIBLE + + src.target_key = target_key + src.emote_list = emote_list + src.emote_chance = emote_chance + src.minimum_chance = minimum_chance + src.subtract_chance = subtract_chance + +/datum/component/aggro_emote/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_AI_BLACKBOARD_KEY_SET(target_key), PROC_REF(on_target_changed)) + +/datum/component/aggro_emote/UnregisterFromParent() + UnregisterSignal(parent, COMSIG_AI_BLACKBOARD_KEY_SET(target_key)) + return ..() + +/// When we get a new target, see if we want to bark at it +/datum/component/aggro_emote/proc/on_target_changed(atom/source) + SIGNAL_HANDLER + var/atom/new_target = source.ai_controller.blackboard[target_key] + if (isnull(new_target) || !prob(emote_chance)) + return + if (living_only && !isliving(new_target)) + return // If we don't want to bark at food items or chairs or windows + emote_chance = max(emote_chance - subtract_chance, minimum_chance) + source.manual_emote("[pick(emote_list)] at [new_target].") diff --git a/code/datums/components/ai_has_target_timer.dm b/code/datums/components/ai_has_target_timer.dm new file mode 100644 index 0000000000000..bcd748ce63823 --- /dev/null +++ b/code/datums/components/ai_has_target_timer.dm @@ -0,0 +1,79 @@ +/// Increments a blackboard key while the attached mob is engaged with a particular target, does nothing else on its own +/datum/component/ai_target_timer + /// Blackboard key to store data inside + var/increment_key + /// Blackboard key to watch to indicate whether we are 'in combat' + var/target_key + /// Amount of time we have spent focused on one target + var/time_on_target = 0 + /// The last target we had + var/atom/last_target + /// Timer used to see if you + var/reset_clock_timer + +/datum/component/ai_target_timer/Initialize(increment_key = BB_BASIC_MOB_HAS_TARGET_TIME, target_key = BB_BASIC_MOB_CURRENT_TARGET) + . = ..() + if (!isliving(parent)) + return COMPONENT_INCOMPATIBLE + var/mob/living/mob_parent = parent + if (isnull(mob_parent.ai_controller)) + return COMPONENT_INCOMPATIBLE + src.increment_key = increment_key + src.target_key = target_key + +/datum/component/ai_target_timer/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_AI_BLACKBOARD_KEY_SET(target_key), PROC_REF(changed_target)) + RegisterSignal(parent, COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_key), PROC_REF(lost_target)) + ADD_TRAIT(parent, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, type) + +/datum/component/ai_target_timer/UnregisterFromParent() + finalise_losing_target() + UnregisterSignal(parent, list(COMSIG_AI_BLACKBOARD_KEY_SET(target_key), COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_key))) + REMOVE_TRAIT(parent, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, type) + return ..() + +/datum/component/ai_target_timer/Destroy(force, silent) + finalise_losing_target() + return ..() + +/// When we get a new target, reset the timer and start processing +/datum/component/ai_target_timer/proc/changed_target(mob/living/source) + SIGNAL_HANDLER + var/mob/living/living_parent = parent + var/atom/new_target = living_parent.ai_controller.blackboard[target_key] + deltimer(reset_clock_timer) + if (new_target == last_target) + return + time_on_target = 0 + store_current_time() + START_PROCESSING(SSdcs, src) + if (!isnull(last_target)) + UnregisterSignal(last_target, COMSIG_QDELETING) + RegisterSignal(new_target, COMSIG_QDELETING, PROC_REF(finalise_losing_target)) + last_target = new_target + +/// When we lose our target, start a short timer in case we reacquire it very quickly +/datum/component/ai_target_timer/proc/lost_target() + SIGNAL_HANDLER + reset_clock_timer = addtimer(CALLBACK(src, PROC_REF(finalise_losing_target)), 3 SECONDS, TIMER_STOPPABLE | TIMER_DELETE_ME) + +/// Called if we have had no target for long enough +/datum/component/ai_target_timer/proc/finalise_losing_target() + deltimer(reset_clock_timer) + STOP_PROCESSING(SSdcs, src) + if (!isnull(last_target)) + UnregisterSignal(last_target, COMSIG_QDELETING) + last_target = null + time_on_target = 0 + if (!QDELETED(parent)) + store_current_time() + +/// Store the current time on our timer in our blackboard key +/datum/component/ai_target_timer/proc/store_current_time() + var/mob/living/living_parent = parent + living_parent.ai_controller.set_blackboard_key(increment_key, time_on_target) + +/datum/component/ai_target_timer/process(seconds_per_tick) + time_on_target += seconds_per_tick SECONDS + store_current_time() diff --git a/code/datums/components/ai_listen_to_weather.dm b/code/datums/components/ai_listen_to_weather.dm new file mode 100644 index 0000000000000..a7bb95ee8c137 --- /dev/null +++ b/code/datums/components/ai_listen_to_weather.dm @@ -0,0 +1,36 @@ +/** + * given to a mob to set a key on or off when a storm is coming or ending + */ +/datum/component/ai_listen_to_weather + ///what weather type are we listening to + var/weather_type + ///what blackboard key are we setting + var/weather_key + +/datum/component/ai_listen_to_weather/Initialize(weather_type = /datum/weather/ash_storm, weather_key = BB_STORM_APPROACHING) + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + src.weather_type = weather_type + src.weather_key = weather_key + +/datum/component/ai_listen_to_weather/RegisterWithParent() + RegisterSignal(SSdcs, COMSIG_WEATHER_START(weather_type), PROC_REF(storm_start)) + RegisterSignal(SSdcs, COMSIG_WEATHER_END(weather_type), PROC_REF(storm_end)) + +/datum/component/ai_listen_to_weather/UnregisterFromParent() + UnregisterSignal(SSdcs, list(COMSIG_WEATHER_START(weather_type), COMSIG_WEATHER_END(weather_type))) + +/datum/component/ai_listen_to_weather/proc/storm_start() + SIGNAL_HANDLER + + var/mob/living/basic/source = parent + if(!source.ai_controller) + return + source.ai_controller.CancelActions() + source.ai_controller.set_blackboard_key(weather_key, TRUE) + +/datum/component/ai_listen_to_weather/proc/storm_end() + SIGNAL_HANDLER + + var/mob/living/basic/source = parent + source.ai_controller?.set_blackboard_key(weather_key, FALSE) diff --git a/code/datums/components/ai_retaliate_advanced.dm b/code/datums/components/ai_retaliate_advanced.dm index 87e7442832d45..ca477a0db27d2 100644 --- a/code/datums/components/ai_retaliate_advanced.dm +++ b/code/datums/components/ai_retaliate_advanced.dm @@ -1,6 +1,7 @@ /** * Attached to a mob with an AI controller, passes things which have damaged it to a blackboard. * The AI controller is responsible for doing anything with that information. + * Differs from the element as it passes new entries through a callback. */ /datum/component/ai_retaliate_advanced /// Callback to a mob for custom behaviour @@ -13,6 +14,12 @@ src.post_retaliate_callback = post_retaliate_callback parent.AddElement(/datum/element/relay_attackers) + ADD_TRAIT(parent, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, type) + +/datum/component/ai_retaliate_advanced/Destroy(force, silent) + post_retaliate_callback = null + return ..() + /datum/component/ai_retaliate_advanced/RegisterWithParent() RegisterSignal(parent, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked)) diff --git a/code/datums/components/anti_magic.dm b/code/datums/components/anti_magic.dm index 47cc5fa24cc0f..059bc2f787d41 100644 --- a/code/datums/components/anti_magic.dm +++ b/code/datums/components/anti_magic.dm @@ -3,15 +3,17 @@ /// A bitflag with the types of magic resistance on the object var/antimagic_flags /// The amount of times the object can protect the user from magic + /// Set to INFINITY to have, well, infinite charges. var/charges /// The inventory slot the object must be located at in order to activate var/inventory_flags - /// The proc that is triggered when an object has been drained a antimagic charge + /// The callback invoked when we have been drained a antimagic charge var/datum/callback/drain_antimagic - /// The proc that is triggered when the object is depleted of charges + /// The callback invoked when twe have been depleted of all charges var/datum/callback/expiration - /// If we have already sent a notification message to the mob picking up an antimagic item - var/casting_restriction_alert = FALSE + /// Whether we should, on equipping, alert the caster that this item can block any of their spells + /// This changes between true and false on equip and drop, don't set it outright to something + var/alert_caster_on_equip = TRUE /** * Adds magic resistances to an object @@ -36,17 +38,15 @@ charges = INFINITY, inventory_flags = ~ITEM_SLOT_BACKPACK, // items in a backpack won't activate, anywhere else is fine datum/callback/drain_antimagic, - datum/callback/expiration + datum/callback/expiration, ) if(isitem(parent)) RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip)) RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_drop)) + RegisterSignals(parent, list(COMSIG_ITEM_ATTACK, COMSIG_ITEM_ATTACK_ATOM), PROC_REF(on_attack)) else if(ismob(parent)) - RegisterSignal(parent, COMSIG_MOB_RECEIVE_MAGIC, PROC_REF(block_receiving_magic), override = TRUE) - RegisterSignal(parent, COMSIG_MOB_RESTRICT_MAGIC, PROC_REF(restrict_casting_magic), override = TRUE) - if(!HAS_TRAIT(parent, TRAIT_ANTIMAGIC_NO_SELFBLOCK)) - to_chat(parent, span_warning("Magic seems to flee from you. You are immune to spells but are unable to cast magic.")) + register_antimagic_signals(parent) else return COMPONENT_INCOMPATIBLE @@ -57,96 +57,70 @@ 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) +/datum/component/anti_magic/proc/register_antimagic_signals(datum/on_what) + RegisterSignal(on_what, COMSIG_MOB_RECEIVE_MAGIC, PROC_REF(block_receiving_magic), override = TRUE) + RegisterSignal(on_what, COMSIG_MOB_RESTRICT_MAGIC, PROC_REF(restrict_casting_magic), override = TRUE) + +/datum/component/anti_magic/proc/unregister_antimagic_signals(datum/on_what) + UnregisterSignal(on_what, list(COMSIG_MOB_RECEIVE_MAGIC, COMSIG_MOB_RESTRICT_MAGIC)) + +/datum/component/anti_magic/proc/on_equip(atom/movable/source, mob/equipper, slot) SIGNAL_HANDLER if(!(inventory_flags & slot)) //Check that the slot is valid for antimagic - UnregisterSignal(equipper, COMSIG_MOB_RECEIVE_MAGIC) - UnregisterSignal(equipper, COMSIG_MOB_RESTRICT_MAGIC) + unregister_antimagic_signals(equipper) + return + + register_antimagic_signals(equipper) + if(!alert_caster_on_equip) return - RegisterSignal(equipper, COMSIG_MOB_RECEIVE_MAGIC, PROC_REF(block_receiving_magic), override = TRUE) - RegisterSignal(equipper, COMSIG_MOB_RESTRICT_MAGIC, PROC_REF(restrict_casting_magic), override = TRUE) - if(!casting_restriction_alert) - // Check to see if we have any spells that are blocked due to antimagic - for(var/datum/action/cooldown/spell/magic_spell in equipper.actions) - if(!(magic_spell.spell_requirements & SPELL_REQUIRES_NO_ANTIMAGIC)) - continue + // Check to see if we have any spells that are blocked due to antimagic + for(var/datum/action/cooldown/spell/magic_spell in equipper.actions) + if(!(magic_spell.spell_requirements & SPELL_REQUIRES_NO_ANTIMAGIC)) + continue - if(antimagic_flags & magic_spell.antimagic_flags) - to_chat(equipper, span_warning("[parent] is interfering with your ability to cast magic!")) - casting_restriction_alert = TRUE - break + if(!(antimagic_flags & magic_spell.antimagic_flags)) + continue -/datum/component/anti_magic/proc/on_drop(datum/source, mob/user) + to_chat(equipper, span_warning("[parent] is interfering with your ability to cast magic!")) + alert_caster_on_equip = FALSE + break + +/datum/component/anti_magic/proc/on_drop(atom/movable/source, mob/user) SIGNAL_HANDLER - UnregisterSignal(user, COMSIG_MOB_RECEIVE_MAGIC) - UnregisterSignal(user, COMSIG_MOB_RESTRICT_MAGIC) - casting_restriction_alert = FALSE + // Reset alert + if(source.loc != user) + alert_caster_on_equip = TRUE + unregister_antimagic_signals(user) -/datum/component/anti_magic/proc/block_receiving_magic(mob/living/carbon/user, casted_magic_flags, charge_cost, list/protection_was_used) +/datum/component/anti_magic/proc/block_receiving_magic(mob/living/carbon/source, casted_magic_flags, charge_cost, list/antimagic_sources) SIGNAL_HANDLER - // if any protection sources exist in our list then we already blocked the magic - if(!istype(user) || protection_was_used.len) - return + // We do not block this type of magic, good day + if(!(casted_magic_flags & antimagic_flags)) + return NONE - // disclaimer - All anti_magic sources will be drained a charge_cost - if(casted_magic_flags & antimagic_flags) - var/mutable_appearance/antimagic_effect - var/antimagic_color - // im a programmer not shakesphere to the future grammar nazis that come after me for this - var/visible_subject = ismob(parent) ? "[user.p_they()]" : "[parent]" - var/self_subject = ismob(parent) ? "you" : "[parent]" - - if(casted_magic_flags & antimagic_flags & MAGIC_RESISTANCE) - user.visible_message( - span_warning("[user] pulses red as [visible_subject] absorbs magic energy!"), - span_userdanger("An intense magical aura pulses around [self_subject] as it dissipates into the air!"), - ) - antimagic_effect = mutable_appearance('icons/effects/effects.dmi', "shield-red", MOB_SHIELD_LAYER) - antimagic_color = LIGHT_COLOR_BLOOD_MAGIC - playsound(user, 'sound/magic/magic_block.ogg', 50, TRUE) - else if(casted_magic_flags & antimagic_flags & MAGIC_RESISTANCE_HOLY) - user.visible_message( - span_warning("[user] starts to glow as [visible_subject] emits a halo of light!"), - span_userdanger("A feeling of warmth washes over [self_subject] as rays of light surround your body and protect you!"), - ) - antimagic_effect = mutable_appearance('icons/effects/genetics.dmi', "servitude", -MUTATIONS_LAYER) - antimagic_color = LIGHT_COLOR_HOLY_MAGIC - playsound(user, 'sound/magic/magic_block_holy.ogg', 50, TRUE) - else if(casted_magic_flags & antimagic_flags & MAGIC_RESISTANCE_MIND) - user.visible_message( - span_warning("[user] forehead shines as [visible_subject] repulses magic from their mind!"), - span_userdanger("A feeling of cold splashes on [self_subject] as your forehead reflects magic usering your mind!"), - ) - antimagic_effect = mutable_appearance('icons/effects/genetics.dmi', "telekinesishead", MOB_SHIELD_LAYER) - antimagic_color = LIGHT_COLOR_DARK_BLUE - playsound(user, 'sound/magic/magic_block_mind.ogg', 50, TRUE) - - user.mob_light(_range = 2, _color = antimagic_color, _duration = 5 SECONDS) - user.add_overlay(antimagic_effect) - addtimer(CALLBACK(user, TYPE_PROC_REF(/atom, cut_overlay), antimagic_effect), 50) - - if(ismob(parent)) - return COMPONENT_MAGIC_BLOCKED - - var/has_limited_charges = !(charges == INFINITY) - var/charge_was_drained = charge_cost > 0 - if(has_limited_charges && charge_was_drained) - protection_was_used += parent - drain_antimagic?.Invoke(user, parent) - charges -= charge_cost - if(charges <= 0) - expiration?.Invoke(user, parent) - qdel(src) - return COMPONENT_MAGIC_BLOCKED - return NONE + // We have already blocked this spell + if(parent in antimagic_sources) + return NONE + + // Block success! Add this parent to the list of antimagic sources + antimagic_sources += parent + + if((charges != INFINITY) && charge_cost > 0) + drain_antimagic?.Invoke(source, parent) + charges -= charge_cost + if(charges <= 0) + expiration?.Invoke(source, parent) + qdel(src) // no more antimagic + + return COMPONENT_MAGIC_BLOCKED /// cannot cast magic with the same type of antimagic present /datum/component/anti_magic/proc/restrict_casting_magic(mob/user, magic_flags) @@ -158,3 +132,7 @@ return COMPONENT_MAGIC_BLOCKED return NONE + +/datum/component/anti_magic/proc/on_attack(atom/movable/source, atom/target, mob/user) + SIGNAL_HANDLER + SEND_SIGNAL(target, COMSIG_ATOM_HOLYATTACK, source, user, antimagic_flags) diff --git a/code/datums/components/appearance_on_aggro.dm b/code/datums/components/appearance_on_aggro.dm new file mode 100644 index 0000000000000..33a3d7c2e90d6 --- /dev/null +++ b/code/datums/components/appearance_on_aggro.dm @@ -0,0 +1,82 @@ + +/** + * Changes visuals of the attached mob while it has a target + */ +/datum/component/appearance_on_aggro + /// Blackboardey to search for a target + var/target_key = BB_BASIC_MOB_CURRENT_TARGET + /// Icon state to use when we have a target + var/aggro_state + /// path of the overlay to apply + var/mutable_appearance/aggro_overlay + /// visibility of our icon when aggroed + var/alpha_on_aggro + /// visibility of our icon when deaggroed + var/alpha_on_deaggro + /// do we currently have a target + var/atom/current_target + +/datum/component/appearance_on_aggro/Initialize(aggro_state, overlay_icon, overlay_state, alpha_on_aggro, alpha_on_deaggro) + if (!isliving(parent)) + return COMPONENT_INCOMPATIBLE + src.aggro_state = aggro_state + src.alpha_on_aggro = alpha_on_aggro + src.alpha_on_deaggro = alpha_on_deaggro + if (!isnull(overlay_icon) && !isnull(overlay_state)) + aggro_overlay = mutable_appearance(overlay_icon, overlay_state) + +/datum/component/appearance_on_aggro/RegisterWithParent() + RegisterSignal(parent, COMSIG_AI_BLACKBOARD_KEY_SET(target_key), PROC_REF(on_set_target)) + RegisterSignal(parent, COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_key), PROC_REF(on_clear_target)) + if (!isnull(aggro_state)) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_ICON_STATE, PROC_REF(on_icon_state_updated)) + if (!isnull(aggro_overlay)) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_overlays_updated)) + +/datum/component/appearance_on_aggro/UnregisterFromParent() + . = ..() + UnregisterSignal(parent, list(COMSIG_AI_BLACKBOARD_KEY_SET(target_key), COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_key))) + +/datum/component/appearance_on_aggro/proc/on_set_target(mob/living/source) + SIGNAL_HANDLER + + var/atom/target = source.ai_controller.blackboard[target_key] + if (QDELETED(target)) + return + + current_target = target + RegisterSignal(target, COMSIG_QDELETING, PROC_REF(on_clear_target)) + if (!isnull(aggro_overlay) || !isnull(aggro_state)) + source.update_appearance(UPDATE_ICON) + if (!isnull(alpha_on_aggro)) + animate(source, alpha = alpha_on_aggro, time = 2 SECONDS) + +/datum/component/appearance_on_aggro/Destroy() + if (!isnull(current_target)) + revert_appearance(parent) + return ..() + +/datum/component/appearance_on_aggro/proc/on_clear_target(atom/source) + SIGNAL_HANDLER + revert_appearance(parent) + +/datum/component/appearance_on_aggro/proc/revert_appearance(mob/living/source) + UnregisterSignal(current_target, COMSIG_QDELETING) + current_target = null + if (!isnull(aggro_overlay) || !isnull(aggro_state)) + source.update_appearance(UPDATE_ICON) + if (!isnull(alpha_on_deaggro)) + animate(source, alpha = alpha_on_deaggro, time = 2 SECONDS) + +/datum/component/appearance_on_aggro/proc/on_icon_state_updated(mob/living/source) + SIGNAL_HANDLER + if (source.stat == DEAD) + return + source.icon_state = isnull(current_target) ? initial(source.icon_state) : aggro_state + +/datum/component/appearance_on_aggro/proc/on_overlays_updated(atom/source, list/overlays) + SIGNAL_HANDLER + + if (isnull(current_target)) + return + overlays += aggro_overlay diff --git a/code/datums/components/aquarium.dm b/code/datums/components/aquarium.dm deleted file mode 100644 index 25a951051741b..0000000000000 --- a/code/datums/components/aquarium.dm +++ /dev/null @@ -1,303 +0,0 @@ -/// Allows movables to be inserted/displayed in aquariums. -/datum/component/aquarium_content - /// Keeps track of our current aquarium. - var/obj/structure/aquarium/current_aquarium - - //This is visual effect holder that will end up in aquarium's vis_contents - var/obj/effect/vc_obj - - /// Base px offset of the visual object in current aquarium aka current base position - var/base_px = 0 - /// Base px offset of the visual object in current aquarium aka current base position - var/base_py = 0 - //Current layer for the visual object - var/base_layer - - - /** - * Fish sprite how to: - * Need to be centered on 16,16 in the dmi and facing left by default. - * sprite_height/sprite_width is the size it will have in aquarium and used to control animation boundaries. - * source_height/source_width is the size of the original icon (ideally only the non-empty parts) - */ - - - /// Icon used for in aquarium sprite - var/icon = 'icons/obj/aquarium.dmi' - /// If this is set this icon state will be used for the holder while icon_state will only be used for item/catalog. Transformation from source_width/height WON'T be applied. - var/icon_state - /// Applied to vc object only for use with greyscaled icons. - var/aquarium_vc_color - /// Transformation applied to the visual holder - used when scaled down sprites are used as in aquarium visual - var/matrix/base_transform - - /// How the thing will be layered - var/layer_mode = AQUARIUM_LAYER_MODE_AUTO - - /// If the starting position is randomised within bounds when inserted into aquarium. - var/randomize_position = FALSE - - //Target sprite size for path/position calculations. - var/sprite_height = 3 - var/sprite_width = 3 - - //This is the size of the source sprite. This will be used to calculate scale down factor. - var/source_width = 32 - var/source_height = 32 - - /// Currently playing animation - var/current_animation - - /// Does this behviour need additional processing in aquarium, will be added to SSobj processing on insertion - var/processing = FALSE - - /// TODO: Change this into trait checked on aquarium insertion - var/unique = FALSE - - /// Proc used to retrieve current animation state from the parent, optional - var/animation_getter - - /// Signals of the parent that will trigger animation update - var/animation_update_signals - - -/datum/component/aquarium_content/Initialize(animation_getter, animation_update_signals) - if(!ismovable(parent)) - return COMPONENT_INCOMPATIBLE - - src.animation_getter = animation_getter - src.animation_update_signals = animation_update_signals - if(animation_update_signals) - RegisterSignals(parent, animation_update_signals, PROC_REF(generate_animation)) - - if(istype(parent,/obj/item/fish)) - InitializeFromFish() - else if(istype(parent,/obj/item/aquarium_prop)) - InitializeFromProp() - else - InitializeOther() - - ADD_TRAIT(parent, TRAIT_FISH_CASE_COMPATIBILE, REF(src)) - RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(enter_aquarium)) - - //If component is added to something already in aquarium at the time initialize it properly. - var/atom/movable/movable_parent = parent - if(istype(movable_parent.loc, /obj/structure/aquarium)) - on_inserted(movable_parent.loc) - -/// Sets visuals properties for fish -/datum/component/aquarium_content/proc/InitializeFromFish() - var/obj/item/fish/fish = parent - - icon = fish.icon - sprite_height = fish.sprite_height - sprite_width = fish.sprite_width - aquarium_vc_color = fish.aquarium_vc_color - - if(fish.dedicated_in_aquarium_icon_state) - icon_state = fish.dedicated_in_aquarium_icon_state - base_transform = matrix() - else - icon_state = fish.icon_state - var/matrix/matrix = matrix() - var/x_scale = fish.sprite_width / fish.source_width - var/y_scale = fish.sprite_height / fish.source_height - matrix.Scale(x_scale, y_scale) - base_transform = matrix - - randomize_position = TRUE - -/// Sets visuals properties for fish -/datum/component/aquarium_content/proc/InitializeFromProp() - var/obj/item/aquarium_prop/prop = parent - - icon = prop.icon - icon_state = prop.icon_state - layer_mode = prop.layer_mode - sprite_height = 32 - sprite_width = 32 - base_transform = matrix() - - unique = TRUE - -/// Mostly for admin abuse -/datum/component/aquarium_content/proc/InitializeOther() - sprite_width = 8 - sprite_height = 8 - - var/matrix/matrix = matrix() - var/x_scale = sprite_width / 32 - var/y_scale = sprite_height / 32 - matrix.Scale(x_scale, y_scale) - base_transform = matrix - - -/datum/component/aquarium_content/PreTransfer() - . = ..() - REMOVE_TRAIT(parent, TRAIT_FISH_CASE_COMPATIBILE, REF(src)) - -/datum/component/aquarium_content/Destroy(force, silent) - if(current_aquarium) - remove_from_aquarium() - QDEL_NULL(vc_obj) - return ..() - -/datum/component/aquarium_content/proc/enter_aquarium(datum/source, OldLoc, Dir, Forced) - SIGNAL_HANDLER - var/atom/movable/movable_parent = parent - if(istype(movable_parent.loc, /obj/structure/aquarium)) - on_inserted(movable_parent.loc) - -/datum/component/aquarium_content/proc/is_ready_to_insert(obj/structure/aquarium/aquarium) - //This is kinda awful but we're unaware of other fish - if(unique) - for(var/atom/movable/fish_or_prop in aquarium) - if(fish_or_prop == parent) - continue - if(fish_or_prop.type == parent.type) - return FALSE - return TRUE - -/datum/component/aquarium_content/proc/on_inserted(atom/aquarium) - current_aquarium = aquarium - RegisterSignal(current_aquarium, COMSIG_ATOM_EXITED, PROC_REF(on_removed)) - RegisterSignal(current_aquarium, COMSIG_AQUARIUM_SURFACE_CHANGED, PROC_REF(on_surface_changed)) - RegisterSignal(current_aquarium, COMSIG_AQUARIUM_FLUID_CHANGED, PROC_REF(on_fluid_changed)) - - if(processing) - START_PROCESSING(SSobj, src) - - //If we don't have vc object yet build it - if(!vc_obj) - vc_obj = generate_base_vc() - - //Set default position and layer - set_vc_base_position() - generate_animation(reset = TRUE) - - //Finally add it to to objects vis_contents - current_aquarium.vis_contents |= vc_obj - -/// Aquarium surface changed in some way, we need to recalculate base position and aninmation -/datum/component/aquarium_content/proc/on_surface_changed() - SIGNAL_HANDLER - set_vc_base_position() - generate_animation(reset = TRUE) //our animation start point changed, gotta redo - -/datum/component/aquarium_content/proc/on_fluid_changed() - SIGNAL_HANDLER - generate_animation() - -/datum/component/aquarium_content/proc/remove_visual_from_aquarium() - current_aquarium.vis_contents -= vc_obj - if(base_layer) - current_aquarium.free_layer(base_layer) - -/// Generates common visual object, propeties that don't depend on aquarium surface -/datum/component/aquarium_content/proc/generate_base_vc() - var/obj/effect/visual = new - apply_appearance(visual) - visual.vis_flags |= VIS_INHERIT_ID | VIS_INHERIT_PLANE //plane so it shows properly in containers on inventory ui for handheld cases - return visual - -/// Applies icon,color and base scaling to our visual holder -/datum/component/aquarium_content/proc/apply_appearance(obj/effect/holder) - holder.icon = icon - holder.icon_state = icon_state - holder.transform = matrix(base_transform) - if(aquarium_vc_color) - holder.color = aquarium_vc_color - - -/// Actually animates the vc holder -/datum/component/aquarium_content/proc/generate_animation(reset=FALSE) - if(!current_aquarium) - return - var/next_animation = animation_getter ? call(parent,animation_getter)() : null - if(current_animation == next_animation && !reset) - return - current_animation = next_animation - switch(current_animation) - if(AQUARIUM_ANIMATION_FISH_SWIM) - swim_animation() - return - if(AQUARIUM_ANIMATION_FISH_DEAD) - dead_animation() - return - - -/// Create looping random path animation, pixel offsets parameters include offsets already -/datum/component/aquarium_content/proc/swim_animation() - var/avg_width = round(sprite_width / 2) - var/avg_height = round(sprite_height / 2) - - var/list/aq_properties = current_aquarium.get_surface_properties() - var/px_min = aq_properties[AQUARIUM_PROPERTIES_PX_MIN] + avg_width - 16 - var/px_max = aq_properties[AQUARIUM_PROPERTIES_PX_MAX] - avg_width - 16 - var/py_min = aq_properties[AQUARIUM_PROPERTIES_PY_MIN] + avg_height - 16 - var/py_max = aq_properties[AQUARIUM_PROPERTIES_PY_MAX] - avg_width - 16 - - var/origin_x = base_px - var/origin_y = base_py - var/prev_x = origin_x - var/prev_y = origin_y - animate(vc_obj, pixel_x = origin_x, time = 0, loop = -1) //Just to start the animation - var/move_number = rand(3, 5) //maybe unhardcode this - for(var/i in 1 to move_number) - //If it's last movement, move back to start otherwise move to some random point - var/target_x = i == move_number ? origin_x : rand(px_min,px_max) //could do with enforcing minimal delta for prettier zigzags - var/target_y = i == move_number ? origin_y : rand(py_min,py_max) - var/dx = prev_x - target_x - var/dy = prev_y - target_y - prev_x = target_x - prev_y = target_y - var/dist = abs(dx) + abs(dy) - var/eyeballed_time = dist * 2 //2ds per px - //Face the direction we're going - var/matrix/dir_mx = matrix(base_transform) - if(dx <= 0) //assuming default sprite is facing left here - dir_mx.Scale(-1, 1) - animate(transform = dir_mx, time = 0, loop = -1) - animate(pixel_x = target_x, pixel_y = target_y, time = eyeballed_time, loop = -1) - -/datum/component/aquarium_content/proc/dead_animation() - //Set base_py to lowest possible value - var/avg_height = round(sprite_height / 2) - var/list/aq_properties = current_aquarium.get_surface_properties() - var/py_min = aq_properties[AQUARIUM_PROPERTIES_PY_MIN] + avg_height - 16 - base_py = py_min - animate(vc_obj, pixel_y = py_min, time = 1) //flop to bottom and end current animation. - -/datum/component/aquarium_content/proc/set_vc_base_position() - if(randomize_position) - randomize_base_position() - if(base_layer) - current_aquarium.free_layer(base_layer) - base_layer = current_aquarium.request_layer(layer_mode) - vc_obj.layer = base_layer - -/datum/component/aquarium_content/proc/randomize_base_position() - var/list/aq_properties = current_aquarium.get_surface_properties() - var/avg_width = round(sprite_width / 2) - var/avg_height = round(sprite_height / 2) - var/px_min = aq_properties[AQUARIUM_PROPERTIES_PX_MIN] + avg_width - 16 - var/px_max = aq_properties[AQUARIUM_PROPERTIES_PX_MAX] - avg_width - 16 - var/py_min = aq_properties[AQUARIUM_PROPERTIES_PY_MIN] + avg_height - 16 - var/py_max = aq_properties[AQUARIUM_PROPERTIES_PY_MAX] - avg_width - 16 - - base_px = rand(px_min,px_max) - base_py = rand(py_min,py_max) - - vc_obj.pixel_x = base_px - vc_obj.pixel_y = base_py - -/datum/component/aquarium_content/proc/on_removed(datum/source, atom/movable/gone, direction) - SIGNAL_HANDLER - if(parent != gone) - return - remove_from_aquarium() - -/datum/component/aquarium_content/proc/remove_from_aquarium() - UnregisterSignal(current_aquarium, list(COMSIG_AQUARIUM_SURFACE_CHANGED, COMSIG_AQUARIUM_FLUID_CHANGED, COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_EXITED)) - remove_visual_from_aquarium() - current_aquarium = null diff --git a/code/datums/components/aquarium_content.dm b/code/datums/components/aquarium_content.dm new file mode 100644 index 0000000000000..589b831aa7256 --- /dev/null +++ b/code/datums/components/aquarium_content.dm @@ -0,0 +1,305 @@ +/// Allows movables to be inserted/displayed in aquariums. +/datum/component/aquarium_content + /// Keeps track of our current aquarium. + var/obj/structure/aquarium/current_aquarium + + //This is visual effect holder that will end up in aquarium's vis_contents + var/obj/effect/vc_obj + + /// Base px offset of the visual object in current aquarium aka current base position + var/base_px = 0 + /// Base px offset of the visual object in current aquarium aka current base position + var/base_py = 0 + //Current layer for the visual object + var/base_layer + + + /** + * Fish sprite how to: + * Need to be centered on 16,16 in the dmi and facing left by default. + * sprite_height/sprite_width is the size it will have in aquarium and used to control animation boundaries. + * source_height/source_width is the size of the original icon (ideally only the non-empty parts) + */ + + + /// Icon used for in aquarium sprite + var/icon = 'icons/obj/aquarium.dmi' + /// If this is set this icon state will be used for the holder while icon_state will only be used for item/catalog. Transformation from source_width/height WON'T be applied. + var/icon_state + /// Applied to vc object only for use with greyscaled icons. + var/aquarium_vc_color + /// Transformation applied to the visual holder - used when scaled down sprites are used as in aquarium visual + var/matrix/base_transform + + /// How the thing will be layered + var/layer_mode = AQUARIUM_LAYER_MODE_AUTO + + /// If the starting position is randomised within bounds when inserted into aquarium. + var/randomize_position = FALSE + + //Target sprite size for path/position calculations. + var/sprite_height = 3 + var/sprite_width = 3 + + //This is the size of the source sprite. This will be used to calculate scale down factor. + var/source_width = 32 + var/source_height = 32 + + /// Currently playing animation + var/current_animation + + /// Does this behviour need additional processing in aquarium, will be added to SSobj processing on insertion + var/processing = FALSE + + /// TODO: Change this into trait checked on aquarium insertion + var/unique = FALSE + + /// Proc used to retrieve current animation state from the parent, optional + var/animation_getter + + /// Signals of the parent that will trigger animation update + var/animation_update_signals + + +/datum/component/aquarium_content/Initialize(animation_getter, animation_update_signals) + if(!ismovable(parent)) + return COMPONENT_INCOMPATIBLE + + src.animation_getter = animation_getter + src.animation_update_signals = animation_update_signals + if(animation_update_signals) + RegisterSignals(parent, animation_update_signals, PROC_REF(generate_animation)) + + if(istype(parent,/obj/item/fish)) + InitializeFromFish() + else if(istype(parent,/obj/item/aquarium_prop)) + InitializeFromProp() + else + InitializeOther() + + ADD_TRAIT(parent, TRAIT_FISH_CASE_COMPATIBILE, REF(src)) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(enter_aquarium)) + + //If component is added to something already in aquarium at the time initialize it properly. + var/atom/movable/movable_parent = parent + if(istype(movable_parent.loc, /obj/structure/aquarium)) + on_inserted(movable_parent.loc) + +/// Sets visuals properties for fish +/datum/component/aquarium_content/proc/InitializeFromFish() + var/obj/item/fish/fish = parent + + icon = fish.icon + sprite_height = fish.sprite_height + sprite_width = fish.sprite_width + aquarium_vc_color = fish.aquarium_vc_color + + if(fish.dedicated_in_aquarium_icon_state) + if(fish.dedicated_in_aquarium_icon) + icon = fish.dedicated_in_aquarium_icon + icon_state = fish.dedicated_in_aquarium_icon_state + base_transform = matrix() + else + icon_state = fish.icon_state + var/matrix/matrix = matrix() + var/x_scale = fish.sprite_width / fish.source_width + var/y_scale = fish.sprite_height / fish.source_height + matrix.Scale(x_scale, y_scale) + base_transform = matrix + + randomize_position = TRUE + +/// Sets visuals properties for fish +/datum/component/aquarium_content/proc/InitializeFromProp() + var/obj/item/aquarium_prop/prop = parent + + icon = prop.icon + icon_state = prop.icon_state + layer_mode = prop.layer_mode + sprite_height = 32 + sprite_width = 32 + base_transform = matrix() + + unique = TRUE + +/// Mostly for admin abuse +/datum/component/aquarium_content/proc/InitializeOther() + sprite_width = 8 + sprite_height = 8 + + var/matrix/matrix = matrix() + var/x_scale = sprite_width / 32 + var/y_scale = sprite_height / 32 + matrix.Scale(x_scale, y_scale) + base_transform = matrix + + +/datum/component/aquarium_content/PreTransfer() + . = ..() + REMOVE_TRAIT(parent, TRAIT_FISH_CASE_COMPATIBILE, REF(src)) + +/datum/component/aquarium_content/Destroy(force, silent) + if(current_aquarium) + remove_from_aquarium() + QDEL_NULL(vc_obj) + return ..() + +/datum/component/aquarium_content/proc/enter_aquarium(datum/source, OldLoc, Dir, Forced) + SIGNAL_HANDLER + var/atom/movable/movable_parent = parent + if(istype(movable_parent.loc, /obj/structure/aquarium)) + on_inserted(movable_parent.loc) + +/datum/component/aquarium_content/proc/is_ready_to_insert(obj/structure/aquarium/aquarium) + //This is kinda awful but we're unaware of other fish + if(unique) + for(var/atom/movable/fish_or_prop in aquarium) + if(fish_or_prop == parent) + continue + if(fish_or_prop.type == parent.type) + return FALSE + return TRUE + +/datum/component/aquarium_content/proc/on_inserted(atom/aquarium) + current_aquarium = aquarium + RegisterSignal(current_aquarium, COMSIG_ATOM_EXITED, PROC_REF(on_removed)) + RegisterSignal(current_aquarium, COMSIG_AQUARIUM_SURFACE_CHANGED, PROC_REF(on_surface_changed)) + RegisterSignal(current_aquarium, COMSIG_AQUARIUM_FLUID_CHANGED, PROC_REF(on_fluid_changed)) + + if(processing) + START_PROCESSING(SSobj, src) + + //If we don't have vc object yet build it + if(!vc_obj) + vc_obj = generate_base_vc() + + //Set default position and layer + set_vc_base_position() + generate_animation(reset = TRUE) + + //Finally add it to to objects vis_contents + current_aquarium.vis_contents |= vc_obj + +/// Aquarium surface changed in some way, we need to recalculate base position and aninmation +/datum/component/aquarium_content/proc/on_surface_changed() + SIGNAL_HANDLER + set_vc_base_position() + generate_animation(reset = TRUE) //our animation start point changed, gotta redo + +/datum/component/aquarium_content/proc/on_fluid_changed() + SIGNAL_HANDLER + generate_animation() + +/datum/component/aquarium_content/proc/remove_visual_from_aquarium() + current_aquarium.vis_contents -= vc_obj + if(base_layer) + current_aquarium.free_layer(base_layer) + +/// Generates common visual object, propeties that don't depend on aquarium surface +/datum/component/aquarium_content/proc/generate_base_vc() + var/obj/effect/visual = new + apply_appearance(visual) + visual.vis_flags |= VIS_INHERIT_ID | VIS_INHERIT_PLANE //plane so it shows properly in containers on inventory ui for handheld cases + return visual + +/// Applies icon,color and base scaling to our visual holder +/datum/component/aquarium_content/proc/apply_appearance(obj/effect/holder) + holder.icon = icon + holder.icon_state = icon_state + holder.transform = matrix(base_transform) + if(aquarium_vc_color) + holder.color = aquarium_vc_color + + +/// Actually animates the vc holder +/datum/component/aquarium_content/proc/generate_animation(reset=FALSE) + if(!current_aquarium) + return + var/next_animation = animation_getter ? call(parent,animation_getter)() : null + if(current_animation == next_animation && !reset) + return + current_animation = next_animation + switch(current_animation) + if(AQUARIUM_ANIMATION_FISH_SWIM) + swim_animation() + return + if(AQUARIUM_ANIMATION_FISH_DEAD) + dead_animation() + return + + +/// Create looping random path animation, pixel offsets parameters include offsets already +/datum/component/aquarium_content/proc/swim_animation() + var/avg_width = round(sprite_width / 2) + var/avg_height = round(sprite_height / 2) + + var/list/aq_properties = current_aquarium.get_surface_properties() + var/px_min = aq_properties[AQUARIUM_PROPERTIES_PX_MIN] + avg_width - 16 + var/px_max = aq_properties[AQUARIUM_PROPERTIES_PX_MAX] - avg_width - 16 + var/py_min = aq_properties[AQUARIUM_PROPERTIES_PY_MIN] + avg_height - 16 + var/py_max = aq_properties[AQUARIUM_PROPERTIES_PY_MAX] - avg_width - 16 + + var/origin_x = base_px + var/origin_y = base_py + var/prev_x = origin_x + var/prev_y = origin_y + animate(vc_obj, pixel_x = origin_x, time = 0, loop = -1) //Just to start the animation + var/move_number = rand(3, 5) //maybe unhardcode this + for(var/i in 1 to move_number) + //If it's last movement, move back to start otherwise move to some random point + var/target_x = i == move_number ? origin_x : rand(px_min,px_max) //could do with enforcing minimal delta for prettier zigzags + var/target_y = i == move_number ? origin_y : rand(py_min,py_max) + var/dx = prev_x - target_x + var/dy = prev_y - target_y + prev_x = target_x + prev_y = target_y + var/dist = abs(dx) + abs(dy) + var/eyeballed_time = dist * 2 //2ds per px + //Face the direction we're going + var/matrix/dir_mx = matrix(base_transform) + if(dx <= 0) //assuming default sprite is facing left here + dir_mx.Scale(-1, 1) + animate(transform = dir_mx, time = 0, loop = -1) + animate(pixel_x = target_x, pixel_y = target_y, time = eyeballed_time, loop = -1) + +/datum/component/aquarium_content/proc/dead_animation() + //Set base_py to lowest possible value + var/avg_height = round(sprite_height / 2) + var/list/aq_properties = current_aquarium.get_surface_properties() + var/py_min = aq_properties[AQUARIUM_PROPERTIES_PY_MIN] + avg_height - 16 + base_py = py_min + animate(vc_obj, pixel_y = py_min, time = 1) //flop to bottom and end current animation. + +/datum/component/aquarium_content/proc/set_vc_base_position() + if(randomize_position) + randomize_base_position() + if(base_layer) + current_aquarium.free_layer(base_layer) + base_layer = current_aquarium.request_layer(layer_mode) + vc_obj.layer = base_layer + +/datum/component/aquarium_content/proc/randomize_base_position() + var/list/aq_properties = current_aquarium.get_surface_properties() + var/avg_width = round(sprite_width / 2) + var/avg_height = round(sprite_height / 2) + var/px_min = aq_properties[AQUARIUM_PROPERTIES_PX_MIN] + avg_width - 16 + var/px_max = aq_properties[AQUARIUM_PROPERTIES_PX_MAX] - avg_width - 16 + var/py_min = aq_properties[AQUARIUM_PROPERTIES_PY_MIN] + avg_height - 16 + var/py_max = aq_properties[AQUARIUM_PROPERTIES_PY_MAX] - avg_width - 16 + + base_px = rand(px_min,px_max) + base_py = rand(py_min,py_max) + + vc_obj.pixel_x = base_px + vc_obj.pixel_y = base_py + +/datum/component/aquarium_content/proc/on_removed(datum/source, atom/movable/gone, direction) + SIGNAL_HANDLER + if(parent != gone) + return + remove_from_aquarium() + +/datum/component/aquarium_content/proc/remove_from_aquarium() + UnregisterSignal(current_aquarium, list(COMSIG_AQUARIUM_SURFACE_CHANGED, COMSIG_AQUARIUM_FLUID_CHANGED, COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_EXITED)) + remove_visual_from_aquarium() + current_aquarium = null diff --git a/code/datums/components/area_based_godmode.dm b/code/datums/components/area_based_godmode.dm new file mode 100644 index 0000000000000..4f03ae57794c8 --- /dev/null +++ b/code/datums/components/area_based_godmode.dm @@ -0,0 +1,123 @@ +#define MAP_AREA_TYPE "area_type" +#define MAP_ALLOW_AREA_SUBTYPES "allow_area_subtypes" +#define DEFAULT_GAIN_MESSAGE span_big(span_green("You are now invulnerable.")) +#define DEFAULT_LOSE_MESSAGE span_big(span_red("You are no longer invulnerable.")) + +/** + * Area-based godmode. + * Gain and Lose message can only be set once, at initial component creation; adding a source will not update them. + */ +/datum/component/area_based_godmode + dupe_mode = COMPONENT_DUPE_SOURCES + + /// The type of area that will trigger godmode. + var/list/sources_to_area_type + + /// Whether or not to allow subtypes of the area type to trigger godmode. + var/allow_area_subtypes + + /// The message to send to the mob when they gain godmode. + var/gain_message + + /// The message to send to the mob when they lose godmode. + var/lose_message + + /// Cached state of check_area, prevents recalculating on source add + var/check_area_cached_state = FALSE + +/datum/component/area_based_godmode/Initialize( + area_type, + allow_area_subtypes, + gain_message = DEFAULT_GAIN_MESSAGE, + lose_message = DEFAULT_LOSE_MESSAGE, +) + var/mob/mob_target = parent + if(!istype(mob_target)) + return COMPONENT_INCOMPATIBLE + if(initial(mob_target.status_flags) & GODMODE) + return COMPONENT_INCOMPATIBLE + + sources_to_area_type = list() + src.gain_message = gain_message + src.lose_message = lose_message + RegisterSignal(mob_target, COMSIG_ENTER_AREA, PROC_REF(check_area)) + +/datum/component/area_based_godmode/UnregisterFromParent() + UnregisterSignal(parent, COMSIG_ENTER_AREA) + +/datum/component/area_based_godmode/on_source_add( + source, + area_type, + allow_area_subtypes = FALSE, + gain_message = DEFAULT_GAIN_MESSAGE, + lose_message = DEFAULT_LOSE_MESSAGE, +) + . = ..() + if(. == COMPONENT_INCOMPATIBLE) + return + + var/list/information_map = list( + MAP_AREA_TYPE = area_type, + MAP_ALLOW_AREA_SUBTYPES = allow_area_subtypes, + ) + sources_to_area_type[source] = information_map + + var/mob/mob_target = parent // no need to istype here, done at creation + mob_target.become_area_sensitive("[REF(src)]:[source]") + if(!check_area_cached_state) + check_area(mob_target) + +/datum/component/area_based_godmode/on_source_remove(source) + sources_to_area_type -= source + var/mob/mob_target = parent + mob_target.lose_area_sensitivity("[REF(src)]:[source]") + if(check_area_cached_state) + check_area(mob_target) + return ..() + +/datum/component/area_based_godmode/proc/check_in_valid_area(mob/checking) + var/list/area/allowed_areas = list() + for(var/source in sources_to_area_type) + var/list/source_map = sources_to_area_type[source] + var/area/top_level = source_map[MAP_AREA_TYPE] + if(!allowed_areas[top_level]) + allowed_areas[top_level] = source_map[MAP_ALLOW_AREA_SUBTYPES] + + if(!length(allowed_areas)) + stack_trace("called check_in_valid_area with zero sources") + return FALSE + + var/area/area = get_area(checking) + if(area.type in allowed_areas) + return TRUE + + for(var/area/allowed_area as anything in allowed_areas) + if(!allowed_areas[allowed_area]) + continue + if(istype(area, allowed_area)) + return TRUE + + return FALSE + +/datum/component/area_based_godmode/proc/check_area(mob/source) + SIGNAL_HANDLER + + var/has_godmode = source.status_flags & GODMODE + if(!check_in_valid_area(source)) + if(has_godmode) + to_chat(source, lose_message) + source.status_flags ^= GODMODE + check_area_cached_state = FALSE + return + + check_area_cached_state = TRUE + if(has_godmode) + return + + to_chat(source, gain_message) + source.status_flags ^= GODMODE + +#undef MAP_AREA_TYPE +#undef MAP_ALLOW_AREA_SUBTYPES +#undef DEFAULT_GAIN_MESSAGE +#undef DEFAULT_LOSE_MESSAGE diff --git a/code/datums/components/armor_plate.dm b/code/datums/components/armor_plate.dm index 779dcca11da50..48f428eafa3f1 100644 --- a/code/datums/components/armor_plate.dm +++ b/code/datums/components/armor_plate.dm @@ -15,7 +15,7 @@ RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(examine)) RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(applyplate)) RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(dropplates)) - if(istype(parent, /obj/vehicle/sealed/mecha/working/ripley)) + if(istype(parent, /obj/vehicle/sealed/mecha/ripley)) RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(apply_mech_overlays)) if(_maxamount) diff --git a/code/datums/components/attached_sticker.dm b/code/datums/components/attached_sticker.dm index d43861b55150e..49541a6b37c47 100644 --- a/code/datums/components/attached_sticker.dm +++ b/code/datums/components/attached_sticker.dm @@ -31,54 +31,48 @@ signal_turf = (user && isclosedturf(parent)) ? get_turf(user) : parent RegisterSignal(signal_turf, COMSIG_TURF_EXPOSE, PROC_REF(on_turf_expose)) sticker.moveToNullspace() + RegisterSignal(sticker, COMSIG_QDELETING, PROC_REF(peel)) -///Move sticker item from nullspace, delete this component, cut overlay -/datum/component/attached_sticker/proc/peel(atom/source) - SIGNAL_HANDLER - if(!parent) // just in case - return +/datum/component/attached_sticker/Destroy() var/atom/as_atom = parent as_atom.cut_overlay(sticker_overlay) sticker_overlay = null if(sticker) - sticker.forceMove(isturf(parent) ? parent : as_atom.drop_location()) + QDEL_NULL(sticker) + return ..() + +///Move sticker item from nullspace, delete this component, cut overlay +/datum/component/attached_sticker/proc/peel(atom/source) + SIGNAL_HANDLER + if(!QDELETED(sticker)) + var/atom/as_atom = parent + sticker.forceMove(isturf(as_atom) ? as_atom : as_atom.drop_location()) sticker.pixel_y = rand(-4,1) sticker.pixel_x = rand(-3,3) - sticker = null - qdel(src) + sticker = null + if(!QDELETED(src)) + qdel(src) /datum/component/attached_sticker/RegisterWithParent() if(sticker.resistance_flags & FLAMMABLE) - RegisterSignal(parent, COMSIG_LIVING_IGNITED, PROC_REF(on_ignite)) + RegisterSignal(parent, COMSIG_LIVING_IGNITED, PROC_REF(peel)) if(washable) RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(peel)) - RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(on_attached_qdel)) + RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(peel)) + ADD_TRAIT(parent, TRAIT_STICKERED, REF(sticker)) /datum/component/attached_sticker/UnregisterFromParent() - if(sticker.resistance_flags & FLAMMABLE) - UnregisterSignal(parent, list(COMSIG_LIVING_IGNITED, COMSIG_QDELETING)) - if(signal_turf) - UnregisterSignal(signal_turf, COMSIG_TURF_EXPOSE) - signal_turf = null + UnregisterSignal(parent, list(COMSIG_LIVING_IGNITED, COMSIG_QDELETING)) + if(signal_turf) + UnregisterSignal(signal_turf, COMSIG_TURF_EXPOSE) + signal_turf = null if(washable) UnregisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT) + REMOVE_TRAIT(parent, TRAIT_STICKERED, REF(sticker)) ///Signal handler for COMSIG_TURF_EXPOSE, deletes this sticker if the temperature is above 100C and it is flammable /datum/component/attached_sticker/proc/on_turf_expose(datum/source, datum/gas_mixture/air, exposed_temperature) SIGNAL_HANDLER if(exposed_temperature <= FIRE_MINIMUM_TEMPERATURE_TO_EXIST) return - qdel(sticker) - peel() - -///Signal handler for COMSIG_LIVING_IGNITED, deletes this sticker -/datum/component/attached_sticker/proc/on_ignite(datum/source) - SIGNAL_HANDLER - qdel(sticker) - peel() - -/// Signal handler for COMSIG_QDELETING, deletes this sticker if the attached object is deleted -/datum/component/attached_sticker/proc/on_attached_qdel(datum/source) - SIGNAL_HANDLER - qdel(sticker) peel() diff --git a/code/datums/components/bakeable.dm b/code/datums/components/bakeable.dm index a5367769f6841..1b56a0f9bd4a0 100644 --- a/code/datums/components/bakeable.dm +++ b/code/datums/components/bakeable.dm @@ -67,6 +67,9 @@ var/atom/original_object = parent var/obj/item/plate/oven_tray/used_tray = original_object.loc var/atom/baked_result = new bake_result(used_tray) + if(baked_result.reagents && positive_result) //make space and tranfer reagents if it has any & the resulting item isn't bad food or other bad baking result + baked_result.reagents.clear_reagents() + original_object.reagents.trans_to(baked_result, original_object.reagents.total_volume) if(who_baked_us) ADD_TRAIT(baked_result, TRAIT_FOOD_CHEF_MADE, who_baked_us) @@ -104,4 +107,4 @@ else if(current_bake_time <= required_bake_time) examine_list += span_notice("[parent] seems to be almost finished baking!") else - examine_list += span_danger("[parent] should probably not be baked for much longer!") + examine_list += span_danger("[parent] should probably not be put in the oven.") diff --git a/code/datums/components/basic_mob_attack_telegraph.dm b/code/datums/components/basic_mob_attack_telegraph.dm new file mode 100644 index 0000000000000..5473dbd0fa00f --- /dev/null +++ b/code/datums/components/basic_mob_attack_telegraph.dm @@ -0,0 +1,90 @@ +/** + * Delays outgoing attacks which are directed at mobs to give players time to get out of the way + */ +/datum/component/basic_mob_attack_telegraph + /// Time to wait before attack can complete + var/telegraph_duration + /// Overlay which we display over targets + var/mutable_appearance/target_overlay + /// Our current target, if we have one + var/mob/living/current_target + /// Callback executed when we start aiming at something + var/datum/callback/on_began_forecast + +/datum/component/basic_mob_attack_telegraph/Initialize( + telegraph_icon = 'icons/mob/telegraphing/telegraph.dmi', + telegraph_state = ATTACK_EFFECT_BITE, + telegraph_duration = 0.4 SECONDS, + datum/callback/on_began_forecast, +) + . = ..() + if (!isbasicmob(parent)) + return ELEMENT_INCOMPATIBLE + + target_overlay = mutable_appearance(telegraph_icon, telegraph_state) + src.telegraph_duration = telegraph_duration + src.on_began_forecast = on_began_forecast + +/datum/component/basic_mob_attack_telegraph/Destroy(force, silent) + if(current_target) + forget_target(current_target) + target_overlay = null + on_began_forecast = null + return ..() + +/datum/component/basic_mob_attack_telegraph/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(on_attack)) + +/datum/component/basic_mob_attack_telegraph/UnregisterFromParent() + if (current_target) + forget_target(current_target) + QDEL_NULL(target_overlay) + REMOVE_TRAIT(parent, TRAIT_BASIC_ATTACK_FORECAST, REF(src)) + UnregisterSignal(parent, COMSIG_HOSTILE_PRE_ATTACKINGTARGET) + return ..() + +/// When we attempt to attack, check if it is allowed +/datum/component/basic_mob_attack_telegraph/proc/on_attack(mob/living/basic/source, atom/target) + SIGNAL_HANDLER + if (!(isliving(target) || ismecha(target))) // Curse you CLARKE + return + if (HAS_TRAIT_FROM(source, TRAIT_BASIC_ATTACK_FORECAST, REF(src))) + REMOVE_TRAIT(source, TRAIT_BASIC_ATTACK_FORECAST, REF(src)) + return + + if (!DOING_INTERACTION(source, INTERACTION_BASIC_ATTACK_FORCEAST)) + INVOKE_ASYNC(src, PROC_REF(delayed_attack), source, target) + return COMPONENT_HOSTILE_NO_ATTACK + +/// Perform an attack after a delay +/datum/component/basic_mob_attack_telegraph/proc/delayed_attack(mob/living/basic/source, atom/target) + current_target = target + target.add_overlay(target_overlay) + RegisterSignal(target, COMSIG_QDELETING, PROC_REF(forget_target)) + RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(target_moved)) + + on_began_forecast?.Invoke(target) + //we stop the do_after if the target moves out of neighboring turfs but if they dance around us they get their face smashed + if (!do_after(source, delay = telegraph_duration, target = target, timed_action_flags = IGNORE_TARGET_LOC_CHANGE, extra_checks = CALLBACK(source, TYPE_PROC_REF(/atom/movable, Adjacent), target), interaction_key = INTERACTION_BASIC_ATTACK_FORCEAST)) + forget_target(target) + return + if (isnull(target)) // They got out of the way :( + return + ADD_TRAIT(source, TRAIT_BASIC_ATTACK_FORECAST, REF(src)) + forget_target(target) + source.melee_attack(target, ignore_cooldown = TRUE) // We already started the cooldown when we triggered the forecast + +/// The guy we're trying to attack moved, is he still in range? +/datum/component/basic_mob_attack_telegraph/proc/target_moved(atom/target) + SIGNAL_HANDLER + if (in_range(parent, target)) + return + forget_target(target) + +/// The guy we're trying to attack isn't a valid target any more +/datum/component/basic_mob_attack_telegraph/proc/forget_target(atom/target) + SIGNAL_HANDLER + current_target = null + target.cut_overlay(target_overlay) + UnregisterSignal(target, list(COMSIG_QDELETING, COMSIG_MOVABLE_MOVED)) diff --git a/code/datums/components/basic_ranged_ready_overlay.dm b/code/datums/components/basic_ranged_ready_overlay.dm new file mode 100644 index 0000000000000..434a64dd6ffd3 --- /dev/null +++ b/code/datums/components/basic_ranged_ready_overlay.dm @@ -0,0 +1,56 @@ +/** + * Fade in an overlay x seconds after a basic mob makes a ranged attack + * Indicates that it will be ready to fire again + */ +/datum/component/basic_ranged_ready_overlay + /// Icon state for the overlay to display + var/overlay_state + /// Time after which to redisplay the overlay + var/display_after + /// Timer tracking when we can next fire + var/waiting_timer + +/datum/component/basic_ranged_ready_overlay/Initialize(overlay_state = "", display_after = 2.5 SECONDS) + . = ..() + if (!isbasicmob(parent)) + return COMPONENT_INCOMPATIBLE + if (!overlay_state) + CRASH("Attempted to assign basic ranged ready overlay with a null or empty overlay state") + src.overlay_state = overlay_state + src.display_after = display_after + restore_overlay(parent) + +/datum/component/basic_ranged_ready_overlay/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_BASICMOB_POST_ATTACK_RANGED, PROC_REF(on_ranged_attack)) + RegisterSignal(parent, COMSIG_MOB_STATCHANGE, PROC_REF(on_stat_changed)) + +/datum/component/basic_ranged_ready_overlay/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_BASICMOB_POST_ATTACK_RANGED, COMSIG_LIVING_REVIVE)) + return ..() + +/datum/component/basic_ranged_ready_overlay/Destroy(force, silent) + deltimer(waiting_timer) + return ..() + +/// When we shoot, get rid of our overlay and queue its return +/datum/component/basic_ranged_ready_overlay/proc/on_ranged_attack(mob/living/basic/firer, atom/target, modifiers) + SIGNAL_HANDLER + firer.cut_overlay(overlay_state) + waiting_timer = addtimer(CALLBACK(src, PROC_REF(restore_overlay), firer), display_after, TIMER_UNIQUE | TIMER_STOPPABLE | TIMER_DELETE_ME) + +/// Don't show overlay on a dead man +/datum/component/basic_ranged_ready_overlay/proc/on_stat_changed(mob/living/basic/gunman) + SIGNAL_HANDLER + if (gunman.stat == DEAD) + gunman.cut_overlay(overlay_state) + return + if (timeleft(waiting_timer) <= 0) + restore_overlay(parent) + +/// Try putting our overlay back +/datum/component/basic_ranged_ready_overlay/proc/restore_overlay(mob/living/basic/gunman) + if (QDELETED(gunman) || gunman.stat == DEAD) + return + gunman.cut_overlay(overlay_state) + gunman.add_overlay(overlay_state) diff --git a/code/datums/components/blob_minion.dm b/code/datums/components/blob_minion.dm new file mode 100644 index 0000000000000..41f58231e2d1a --- /dev/null +++ b/code/datums/components/blob_minion.dm @@ -0,0 +1,154 @@ +/** + * Common behaviour shared by things which are minions to a blob + */ +/datum/component/blob_minion + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + /// Overmind who is our boss + var/mob/camera/blob/overmind + /// Callback to run if overmind strain changes + var/datum/callback/on_strain_changed + +/datum/component/blob_minion/Initialize(mob/camera/blob/overmind, datum/callback/on_strain_changed) + . = ..() + if (!isliving(parent)) + return COMPONENT_INCOMPATIBLE + src.on_strain_changed = on_strain_changed + register_overlord(overmind) + +/datum/component/blob_minion/InheritComponent(datum/component/new_comp, i_am_original, mob/camera/blob/overmind, datum/callback/on_strain_changed) + if (!isnull(on_strain_changed)) + src.on_strain_changed = on_strain_changed + register_overlord(overmind) + +/datum/component/blob_minion/proc/register_overlord(mob/camera/blob/overmind) + if (isnull(overmind)) + return + src.overmind = overmind + overmind.register_new_minion(parent) + RegisterSignal(overmind, COMSIG_QDELETING, PROC_REF(overmind_deleted)) + RegisterSignal(overmind, COMSIG_BLOB_SELECTED_STRAIN, PROC_REF(overmind_properties_changed)) + overmind_properties_changed(overmind, overmind.blobstrain) + +/// Our overmind is gone, uh oh! +/datum/component/blob_minion/proc/overmind_deleted() + SIGNAL_HANDLER + overmind = null + overmind_properties_changed() + +/// Our overmind has changed colour and properties +/datum/component/blob_minion/proc/overmind_properties_changed(mob/camera/blob/overmind, datum/blobstrain/new_strain) + SIGNAL_HANDLER + var/mob/living/living_parent = parent + living_parent.update_appearance(UPDATE_ICON) + on_strain_changed?.Invoke(overmind, new_strain) + +/datum/component/blob_minion/RegisterWithParent() + var/mob/living/living_parent = parent + living_parent.pass_flags |= PASSBLOB + living_parent.faction |= ROLE_BLOB + ADD_TRAIT(parent, TRAIT_BLOB_ALLY, REF(src)) + remove_verb(parent, /mob/living/verb/pulled) // No dragging people into the blob + RegisterSignal(parent, COMSIG_MOB_MIND_INITIALIZED, PROC_REF(on_mind_init)) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_ICON, PROC_REF(on_update_appearance)) + RegisterSignal(parent, COMSIG_MOB_GET_STATUS_TAB_ITEMS, PROC_REF(on_update_status_tab)) + RegisterSignal(parent, COMSIG_ATOM_BLOB_ACT, PROC_REF(on_blob_touched)) + RegisterSignal(parent, COMSIG_ATOM_FIRE_ACT, PROC_REF(on_burned)) + RegisterSignal(parent, COMSIG_ATOM_TRIED_PASS, PROC_REF(on_attempted_pass)) + RegisterSignal(parent, COMSIG_MOVABLE_SPACEMOVE, PROC_REF(on_space_move)) + RegisterSignal(parent, COMSIG_LIVING_TRY_SPEECH, PROC_REF(on_try_speech)) + RegisterSignal(parent, COMSIG_MOB_CHANGED_TYPE, PROC_REF(on_transformed)) + living_parent.update_appearance(UPDATE_ICON) + GLOB.blob_telepathy_mobs |= parent + +/datum/component/blob_minion/UnregisterFromParent() + if (!isnull(overmind)) + overmind.blob_mobs -= parent + var/mob/living/living_parent = parent + living_parent.pass_flags &= ~PASSBLOB + living_parent.faction -= ROLE_BLOB + REMOVE_TRAIT(parent, TRAIT_BLOB_ALLY, REF(src)) + add_verb(parent, /mob/living/verb/pulled) + UnregisterSignal(parent, list( + COMSIG_ATOM_BLOB_ACT, + COMSIG_ATOM_FIRE_ACT, + COMSIG_ATOM_TRIED_PASS, + COMSIG_ATOM_UPDATE_ICON, + COMSIG_LIVING_TRY_SPEECH, + COMSIG_MOB_CHANGED_TYPE, + COMSIG_MOB_GET_STATUS_TAB_ITEMS, + COMSIG_MOB_MIND_INITIALIZED, + COMSIG_MOVABLE_SPACEMOVE, + )) + GLOB.blob_telepathy_mobs -= parent + +/// Become blobpilled when we gain a mind +/datum/component/blob_minion/proc/on_mind_init(mob/living/minion, datum/mind/new_mind) + SIGNAL_HANDLER + if (isnull(overmind)) + return + var/datum/antagonist/blob_minion/minion_motive = new(overmind) + new_mind.add_antag_datum(minion_motive) + +/// When our icon is updated, update our colour too +/datum/component/blob_minion/proc/on_update_appearance(mob/living/minion) + SIGNAL_HANDLER + if(isnull(overmind)) + minion.remove_atom_colour(FIXED_COLOUR_PRIORITY) + return + minion.add_atom_colour(overmind.blobstrain.color, FIXED_COLOUR_PRIORITY) + +/// When our icon is updated, update our colour too +/datum/component/blob_minion/proc/on_update_status_tab(mob/living/minion, list/status_items) + SIGNAL_HANDLER + if (isnull(overmind)) + return + status_items += "Blobs to Win: [length(overmind.blobs_legit)]/[overmind.blobwincount]" + +/// If we feel the gentle caress of a blob, we feel better +/datum/component/blob_minion/proc/on_blob_touched(mob/living/minion) + SIGNAL_HANDLER + if(minion.stat == DEAD || minion.health >= minion.maxHealth) + return COMPONENT_CANCEL_BLOB_ACT // Don't hurt us in order to heal us + for(var/i in 1 to 2) + var/obj/effect/temp_visual/heal/heal_effect = new /obj/effect/temp_visual/heal(get_turf(parent)) // hello yes you are being healed + heal_effect.color = isnull(overmind) ? COLOR_BLACK : overmind.blobstrain.complementary_color + minion.heal_overall_damage(minion.maxHealth * BLOBMOB_HEALING_MULTIPLIER) + return COMPONENT_CANCEL_BLOB_ACT + +/// If we feel the fearsome bite of open flame, we feel worse +/datum/component/blob_minion/proc/on_burned(mob/living/minion, exposed_temperature, exposed_volume) + SIGNAL_HANDLER + if(isnull(exposed_temperature)) + minion.adjustFireLoss(5) + return + minion.adjustFireLoss(clamp(0.01 * exposed_temperature, 1, 5)) + +/// Someone is attempting to move through us, allow it if it is a blob tile +/datum/component/blob_minion/proc/on_attempted_pass(mob/living/minion, atom/movable/incoming) + SIGNAL_HANDLER + if(istype(incoming, /obj/structure/blob)) + return COMSIG_COMPONENT_PERMIT_PASSAGE + +/// If we're near a blob, stop drifting +/datum/component/blob_minion/proc/on_space_move(mob/living/minion) + SIGNAL_HANDLER + var/obj/structure/blob/blob_handhold = locate() in range(1, parent) + if (!isnull(blob_handhold)) + return COMSIG_MOVABLE_STOP_SPACEMOVE + +/// We only speak telepathically to blobs +/datum/component/blob_minion/proc/on_try_speech(mob/living/minion, message, ignore_spam, forced) + SIGNAL_HANDLER + var/spanned_message = minion.say_quote(message) + var/rendered = span_blob("\[Blob Telepathy\] [minion.real_name] [spanned_message]") + blob_telepathy(rendered, minion) + return COMPONENT_CANNOT_SPEAK + +/// Called when a blob minion is transformed into something else, hopefully a spore into a zombie +/datum/component/blob_minion/proc/on_transformed(mob/living/minion, mob/living/replacement) + SIGNAL_HANDLER + overmind?.assume_direct_control(replacement) + +/datum/component/blob_minion/PostTransfer() + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE diff --git a/code/datums/components/blood_walk.dm b/code/datums/components/blood_walk.dm index 3864157dc1d28..6bd6f3044462d 100644 --- a/code/datums/components/blood_walk.dm +++ b/code/datums/components/blood_walk.dm @@ -74,12 +74,12 @@ var/atom/movable/movable_source = source var/turf/current_turf = movable_source.loc - if(!isturf(current_turf)) + if(!isturf(current_turf) || isclosedturf(current_turf) || isgroundlessturf(current_turf)) return if(!prob(blood_spawn_chance)) return - var/obj/effect/decal/blood = new blood_type(current_turf) + var/obj/effect/decal/cleanable/blood/blood = new blood_type(current_turf) if(QDELETED(blood)) // Our blood was placed on somewhere it shouldn't be and qdeleted in init. return diff --git a/code/datums/components/bloodysoles.dm b/code/datums/components/bloodysoles.dm index e2f8a7d064fe5..a79d4b385c20b 100644 --- a/code/datums/components/bloodysoles.dm +++ b/code/datums/components/bloodysoles.dm @@ -7,7 +7,7 @@ var/last_blood_state = BLOOD_STATE_NOT_BLOODY /// 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(BLOOD_STATE_HUMAN = 0, BLOOD_STATE_XENO = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) /// The ITEM_SLOT_* slot the item is equipped on, if it is. var/equipped_slot @@ -44,7 +44,20 @@ * Returns true if the parent item is obscured by something else that the wielder is wearing */ /datum/component/bloodysoles/proc/is_obscured() - return wielder.check_obscured_slots(TRUE) & equipped_slot + return wielder.check_obscured_slots(TRUE) & equipped_slot || is_under_feet_covered() + +/** + * Returns true if the parent item is worn in the ITEM_SLOT_ICLOTHING slot and the + * wielder is wearing something on their shoes. + * + * Allows for jumpsuits to cover feet without getting all bloodied when their wearer + * is wearing shoes. + */ +/datum/component/bloodysoles/proc/is_under_feet_covered() + if(!(equipped_slot & ITEM_SLOT_ICLOTHING)) + return FALSE + + return !isnull(wielder.shoes) /** * Run to update the icon of the parent @@ -263,16 +276,14 @@ RegisterSignal(parent, COMSIG_CARBON_EQUIP_SHOECOVER, PROC_REF(equip_shoecover)) /datum/component/bloodysoles/feet/update_icon() - if(ishuman(wielder)) - 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()) - human.remove_overlay(SHOES_LAYER) - human.overlays_standing[SHOES_LAYER] = bloody_feet - human.apply_overlay(SHOES_LAYER) - else - human.update_worn_shoes() + if(!ishuman(wielder) || HAS_TRAIT(wielder, TRAIT_NO_BLOOD_OVERLAY)) + return + if(bloody_shoes[BLOOD_STATE_HUMAN] > 0 && !is_obscured()) + wielder.remove_overlay(SHOES_LAYER) + wielder.overlays_standing[SHOES_LAYER] = bloody_feet + wielder.apply_overlay(SHOES_LAYER) + else + wielder.update_worn_shoes() /datum/component/bloodysoles/feet/add_parent_to_footprint(obj/effect/decal/cleanable/blood/footprints/FP) if(!ishuman(wielder)) diff --git a/code/datums/components/boss_music.dm b/code/datums/components/boss_music.dm new file mode 100644 index 0000000000000..37f438f0b6269 --- /dev/null +++ b/code/datums/components/boss_music.dm @@ -0,0 +1,73 @@ +/** + * Attaches to a hostile simplemob and plays that music while they have a target. + */ +/datum/component/boss_music + ///The music track we will play to players. + var/boss_track + ///How long the track is, used to clear players out when the music is supposed to end. + var/track_duration + + ///List of all mobs listening to the boss music currently. Cleared on Destroy or after `track_duration`. + var/list/datum/weakref/players_listening_refs = list() + ///List of callback timers, used to clear out mobs listening to boss music after `track_duration`. + var/list/music_callbacks = list() + +/datum/component/boss_music/Initialize( + boss_track, + track_duration, +) + . = ..() + if(!ishostile(parent)) + return COMPONENT_INCOMPATIBLE + src.boss_track = boss_track + src.track_duration = track_duration + +/datum/component/boss_music/Destroy(force, silent) + . = ..() + for(var/callback in music_callbacks) + deltimer(callback) + music_callbacks = null + + for(var/player_refs in players_listening_refs) + clear_target(player_refs) + players_listening_refs = null + +/datum/component/boss_music/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_HOSTILE_FOUND_TARGET, PROC_REF(on_target_found)) + +/datum/component/boss_music/UnregisterFromParent() + UnregisterSignal(parent, COMSIG_HOSTILE_FOUND_TARGET) + return ..() + +///Handles giving the boss music to a new target the fauna has recieved. +///Keeps track of them to not repeatedly overwrite its own track. +/datum/component/boss_music/proc/on_target_found(atom/source, mob/new_target) + SIGNAL_HANDLER + if(QDELETED(source) || !istype(new_target)) + return + + var/datum/weakref/new_ref = WEAKREF(new_target) + if(new_ref in players_listening_refs) + return + + players_listening_refs += new_ref + RegisterSignal(new_target, COMSIG_LIVING_DEATH, PROC_REF(on_mob_death)) + music_callbacks += addtimer(CALLBACK(src, PROC_REF(clear_target), new_ref), track_duration, TIMER_STOPPABLE) + new_target.playsound_local(new_target, boss_track, 200, FALSE, channel = CHANNEL_BOSS_MUSIC, pressure_affected = FALSE, use_reverb = FALSE) + +///Called when a mob listening to boss music dies- ends their music early. +/datum/component/boss_music/proc/on_mob_death(mob/living/source) + SIGNAL_HANDLER + var/datum/weakref/player_ref = WEAKREF(source) + clear_target(player_ref) + +///Removes `old_target` from the list of players listening, and stops their music if it is still playing. +///This allows them to have music played again if they re-enter combat with this fauna. +/datum/component/boss_music/proc/clear_target(datum/weakref/old_ref) + players_listening_refs -= old_ref + + var/mob/old_target = old_ref?.resolve() + if(old_target) + UnregisterSignal(old_target, COMSIG_LIVING_DEATH) + old_target.stop_sound_channel(CHANNEL_BOSS_MUSIC) diff --git a/code/datums/components/bullet_intercepting.dm b/code/datums/components/bullet_intercepting.dm new file mode 100644 index 0000000000000..d8de06806656c --- /dev/null +++ b/code/datums/components/bullet_intercepting.dm @@ -0,0 +1,68 @@ +/** + * Component which allows an equipped item to occasionally absorb a projectile. + */ +/datum/component/bullet_intercepting + /// Chance to intercept a projectile + var/block_chance + /// Type of bullet to intercept + var/block_type + /// Slots in which effect can be active + var/active_slots + /// Person currently wearing us + var/mob/wearer + /// Callback called when we catch a projectile + var/datum/callback/on_intercepted + +/datum/component/bullet_intercepting/Initialize(block_chance = 2, block_type = BULLET, active_slots, datum/callback/on_intercepted) + . = ..() + if (!isitem(parent)) + return COMPONENT_INCOMPATIBLE + src.block_chance = block_chance + src.block_type = block_type + src.active_slots = active_slots + src.on_intercepted = on_intercepted + + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_parent_equipped)) + RegisterSignal(parent, COMSIG_ITEM_PRE_UNEQUIP, PROC_REF(on_unequipped)) + +/datum/component/bullet_intercepting/Destroy(force, silent) + wearer = null + on_intercepted = null + return ..() + +/// Called when item changes slots, check if we're in a valid location to take bullets +/datum/component/bullet_intercepting/proc/on_parent_equipped(obj/item/clothing/source, mob/equipper, slot) + SIGNAL_HANDLER + if (wearer) + if (!(active_slots & slot)) + on_unequipped() + return + + if (!(active_slots & slot)) + return + RegisterSignal(equipper, COMSIG_PROJECTILE_PREHIT, PROC_REF(on_wearer_shot)) + RegisterSignal(equipper, COMSIG_QDELETING, PROC_REF(on_wearer_deleted)) + wearer = equipper + +/// Called when item is unequipped, stop tracking bullets +/datum/component/bullet_intercepting/proc/on_unequipped() + SIGNAL_HANDLER + if (!wearer) + return + UnregisterSignal(wearer, list(COMSIG_PROJECTILE_PREHIT, COMSIG_QDELETING)) + wearer = null + +/// Called when wearer is shot, check if we're going to block the hit +/datum/component/bullet_intercepting/proc/on_wearer_shot(mob/living/victim, list/signal_args, obj/projectile/bullet) + SIGNAL_HANDLER + if (victim != wearer || victim.stat == DEAD || bullet.armor_flag != block_type ) + return + if (!prob(block_chance)) + return + on_intercepted?.Invoke(victim, bullet) + return PROJECTILE_INTERRUPT_HIT + +/// Called when wearer is deleted, stop tracking them +/datum/component/bullet_intercepting/proc/on_wearer_deleted() + SIGNAL_HANDLER + wearer = null diff --git a/code/datums/components/burning.dm b/code/datums/components/burning.dm index 347340e3e2c42..e5624d69b0816 100644 --- a/code/datums/components/burning.dm +++ b/code/datums/components/burning.dm @@ -18,10 +18,12 @@ GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/e if(!atom_parent.uses_integrity) stack_trace("Tried to add /datum/component/burning to an atom ([atom_parent.type]) that does not use atom_integrity!") return COMPONENT_INCOMPATIBLE + // only flammable atoms should have this component, but it's not really an error if we try to apply this to a non flammable one if(!(atom_parent.resistance_flags & FLAMMABLE) || (atom_parent.resistance_flags & FIRE_PROOF)) qdel(src) return + src.fire_overlay = fire_overlay if(fire_particles) // burning particles look pretty bad when they stack on mobs, so that behavior is not wanted for items @@ -30,20 +32,27 @@ GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/e /datum/component/burning/Destroy(force, silent) STOP_PROCESSING(SSburning, src) + fire_overlay = null if(particle_effect) QDEL_NULL(particle_effect) return ..() /datum/component/burning/RegisterWithParent() - RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_attack_hand)) RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_update_overlays)) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) RegisterSignal(parent, COMSIG_ATOM_EXTINGUISH, PROC_REF(on_extinguish)) var/atom/atom_parent = parent atom_parent.resistance_flags |= ON_FIRE atom_parent.update_appearance() /datum/component/burning/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_ATOM_EXAMINE, COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_ATOM_EXTINGUISH)) + UnregisterSignal(parent, list( + COMSIG_ATOM_ATTACK_HAND, + COMSIG_ATOM_UPDATE_OVERLAYS, + COMSIG_ATOM_EXAMINE, + COMSIG_ATOM_EXTINGUISH, + )) var/atom/atom_parent = parent if(!QDELETED(atom_parent)) atom_parent.resistance_flags &= ~ON_FIRE @@ -51,7 +60,7 @@ GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/e /datum/component/burning/process(seconds_per_tick) var/atom/atom_parent = parent - // Check if the parent somehow became fireproof + // Check if the parent somehow became fireproof, remove component if so if(atom_parent.resistance_flags & FIRE_PROOF) atom_parent.extinguish() return @@ -61,7 +70,28 @@ GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/e /datum/component/burning/proc/on_examine(atom/source, mob/user, list/examine_list) SIGNAL_HANDLER - examine_list += span_danger("[source.p_theyre(TRUE)] burning!") + examine_list += span_danger("[source.p_Theyre()] burning!") + +/// Handles searing the hand of anyone who tries to touch parent without protection. +/datum/component/burning/proc/on_attack_hand(atom/source, mob/living/carbon/user) + SIGNAL_HANDLER + + if(!iscarbon(user) || user.can_touch_burning(source)) + to_chat(user, span_notice("You put out the fire on [source].")) + source.extinguish() + return COMPONENT_CANCEL_ATTACK_CHAIN + + var/obj/item/bodypart/affecting = user.get_active_hand() + //Should not happen! + if(!affecting) + return NONE + + affecting.receive_damage(burn = 5) + to_chat(user, span_userdanger("You burn your hand on [source]!")) + INVOKE_ASYNC(user, TYPE_PROC_REF(/mob, emote), "scream") + playsound(source, SFX_SEAR, 50, TRUE) + user.update_damage_overlays() + return COMPONENT_CANCEL_ATTACK_CHAIN /// Maintains the burning overlay on the parent atom /datum/component/burning/proc/on_update_overlays(atom/source, list/overlays) diff --git a/code/datums/components/butchering.dm b/code/datums/components/butchering.dm index 8ed9cbcc11615..689de30db378a 100644 --- a/code/datums/components/butchering.dm +++ b/code/datums/components/butchering.dm @@ -34,6 +34,10 @@ if(isitem(parent)) RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(onItemAttack)) +/datum/component/butchering/Destroy(force, silent) + butcher_callback = null + return ..() + /datum/component/butchering/proc/onItemAttack(obj/item/source, mob/living/M, mob/living/user) SIGNAL_HANDLER @@ -87,60 +91,83 @@ log_combat(user, H, "wounded via throat slitting", source) H.apply_damage(source.force, BRUTE, BODY_ZONE_HEAD, wound_bonus=CANT_WOUND) // easy tiger, we'll get to that in a sec var/obj/item/bodypart/slit_throat = H.get_bodypart(BODY_ZONE_HEAD) - if(slit_throat) - var/datum/wound/slash/critical/screaming_through_a_slit_throat = new - screaming_through_a_slit_throat.apply_wound(slit_throat, wound_source = "throat slit") - H.apply_status_effect(/datum/status_effect/neck_slice) + if (H.cause_wound_of_type_and_severity(WOUND_SLASH, slit_throat, WOUND_SEVERITY_CRITICAL)) + H.apply_status_effect(/datum/status_effect/neck_slice) /** * Handles a user butchering a target * * Arguments: * - [butcher][/mob/living]: The mob doing the butchering - * - [meat][/mob/living]: The mob being butchered + * - [target][/mob/living]: The mob being butchered */ -/datum/component/butchering/proc/on_butchering(atom/butcher, mob/living/meat) +/datum/component/butchering/proc/on_butchering(atom/butcher, mob/living/target) var/list/results = list() - var/turf/T = meat.drop_location() - var/final_effectiveness = effectiveness - meat.butcher_difficulty + var/turf/location = target.drop_location() + var/final_effectiveness = effectiveness - target.butcher_difficulty var/bonus_chance = max(0, (final_effectiveness - 100) + bonus_modifier) //so 125 total effectiveness = 25% extra chance - for(var/V in meat.butcher_results) - var/obj/bones = V - var/amount = meat.butcher_results[bones] + + for(var/result_typepath in target.butcher_results) + var/obj/remains = result_typepath + var/amount = target.butcher_results[remains] for(var/_i in 1 to amount) if(!prob(final_effectiveness)) if(butcher) - to_chat(butcher, span_warning("You fail to harvest some of the [initial(bones.name)] from [meat].")) + to_chat(butcher, span_warning("You fail to harvest some of the [initial(remains.name)] from [target].")) continue if(prob(bonus_chance)) if(butcher) - to_chat(butcher, span_info("You harvest some extra [initial(bones.name)] from [meat]!")) - results += new bones (T) - results += new bones (T) + to_chat(butcher, span_info("You harvest some extra [initial(remains.name)] from [target]!")) + results += new remains (location) + results += new remains (location) - meat.butcher_results.Remove(bones) //in case you want to, say, have it drop its results on gib + target.butcher_results.Remove(remains) //in case you want to, say, have it drop its results on gib - for(var/V in meat.guaranteed_butcher_results) - var/obj/sinew = V - var/amount = meat.guaranteed_butcher_results[sinew] + for(var/guaranteed_result_typepath in target.guaranteed_butcher_results) + var/obj/guaranteed_remains = guaranteed_result_typepath + var/amount = target.guaranteed_butcher_results[guaranteed_remains] for(var/i in 1 to amount) - results += new sinew (T) - meat.guaranteed_butcher_results.Remove(sinew) + results += new guaranteed_remains (location) + target.guaranteed_butcher_results.Remove(guaranteed_remains) for(var/obj/item/carrion in results) var/list/meat_mats = carrion.has_material_type(/datum/material/meat) if(!length(meat_mats)) continue - carrion.set_custom_materials((carrion.custom_materials - meat_mats) + list(GET_MATERIAL_REF(/datum/material/meat/mob_meat, meat) = counterlist_sum(meat_mats))) + carrion.set_custom_materials((carrion.custom_materials - meat_mats) + list(GET_MATERIAL_REF(/datum/material/meat/mob_meat, target) = counterlist_sum(meat_mats))) + + // transfer delicious reagents to meat + if(target.reagents) + var/meat_produced = 0 + for(var/obj/item/food/meat/slab/target_meat in results) + meat_produced += 1 + for(var/obj/item/food/meat/slab/target_meat in results) + target.reagents.trans_to(target_meat, target.reagents.total_volume / meat_produced, remove_blacklisted = TRUE) + + // dont forget yummy diseases either! + if(iscarbon(target)) + var/mob/living/carbon/host_target = target + var/list/diseases = host_target.get_static_viruses() + if(LAZYLEN(diseases)) + var/list/datum/disease/diseases_to_add = list() + for(var/datum/disease/disease as anything in diseases) + // admin or special viruses that should not be reproduced + if(disease.spread_flags & (DISEASE_SPREAD_SPECIAL | DISEASE_SPREAD_NON_CONTAGIOUS)) + continue + + diseases_to_add += disease + if(LAZYLEN(diseases_to_add)) + for(var/obj/diseased_remains in results) + diseased_remains.AddComponent(/datum/component/infective, diseases_to_add) if(butcher) - butcher.visible_message(span_notice("[butcher] butchers [meat]."), \ - span_notice("You butcher [meat].")) - butcher_callback?.Invoke(butcher, meat) - meat.harvest(butcher) - meat.log_message("has been butchered by [key_name(butcher)]", LOG_ATTACK) - meat.gib(FALSE, FALSE, TRUE) + butcher.visible_message(span_notice("[butcher] butchers [target]."), \ + span_notice("You butcher [target].")) + butcher_callback?.Invoke(butcher, target) + target.harvest(butcher) + target.log_message("has been butchered by [key_name(butcher)]", LOG_ATTACK) + target.gib(DROP_BRAIN|DROP_ORGANS) ///Enables the butchering mechanic for the mob who has equipped us. /datum/component/butchering/proc/enable_butchering(datum/source) @@ -205,9 +232,9 @@ )) ///When we are ready to drill through a mob -/datum/component/butchering/mecha/proc/on_drill(datum/source, obj/vehicle/sealed/mecha/chassis, mob/living/meat) +/datum/component/butchering/mecha/proc/on_drill(datum/source, obj/vehicle/sealed/mecha/chassis, mob/living/target) SIGNAL_HANDLER - INVOKE_ASYNC(src, PROC_REF(on_butchering), chassis, meat) + INVOKE_ASYNC(src, PROC_REF(on_butchering), chassis, target) /datum/component/butchering/wearable diff --git a/code/datums/components/caltrop.dm b/code/datums/components/caltrop.dm index 47bc76069cd5e..5724febf7be88 100644 --- a/code/datums/components/caltrop.dm +++ b/code/datums/components/caltrop.dm @@ -75,7 +75,7 @@ if(HAS_TRAIT(H, TRAIT_PIERCEIMMUNE)) return - if((flags & CALTROP_IGNORE_WALKERS) && H.m_intent == MOVE_INTENT_WALK) + if((flags & CALTROP_IGNORE_WALKERS) && H.move_intent == MOVE_INTENT_WALK) return if(H.movement_type & (FLOATING|FLYING)) //check if they are able to pass over us diff --git a/code/datums/components/chasm.dm b/code/datums/components/chasm.dm index 7f1a3f6a599fb..18420016c543f 100644 --- a/code/datums/components/chasm.dm +++ b/code/datums/components/chasm.dm @@ -1,6 +1,3 @@ -/// List of weakrefs to containers for things which have fallen into chasms -GLOBAL_LIST_INIT(chasm_storage, list()) - // Used by /turf/open/chasm and subtypes to implement the "dropping" mechanic /datum/component/chasm var/turf/target_turf @@ -11,94 +8,101 @@ GLOBAL_LIST_INIT(chasm_storage, list()) /// List of refs to falling objects -> how many levels deep we've fallen var/static/list/falling_atoms = list() var/static/list/forbidden_types = typecacheof(list( - /obj/singularity, - /obj/energy_ball, - /obj/narsie, /obj/docking_port, - /obj/structure/lattice, - /obj/structure/stone_tile, - /obj/projectile, - /obj/effect/projectile, - /obj/effect/portal, /obj/effect/abstract, + /obj/effect/collapse, + /obj/effect/constructing_effect, + /obj/effect/dummy/phased_mob, + /obj/effect/ebeam, + /obj/effect/fishing_lure, /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/particle_effect/ion_trails, + /obj/effect/portal, + /obj/effect/projectile, + /obj/effect/spectre_of_resurrection, + /obj/effect/temp_visual, /obj/effect/wisp, - /obj/effect/ebeam, - /obj/effect/fishing_lure, + /obj/energy_ball, + /obj/narsie, + /obj/projectile, + /obj/singularity, + /obj/structure/lattice, + /obj/structure/stone_tile, )) -/datum/component/chasm/Initialize(turf/target) - RegisterSignal(parent, COMSIG_ATOM_ENTERED, PROC_REF(Entered)) +/datum/component/chasm/Initialize(turf/target, mapload) + if(!isturf(parent)) + return COMPONENT_INCOMPATIBLE + RegisterSignal(parent, SIGNAL_ADDTRAIT(TRAIT_CHASM_STOPPED), PROC_REF(on_chasm_stopped)) + RegisterSignal(parent, SIGNAL_REMOVETRAIT(TRAIT_CHASM_STOPPED), PROC_REF(on_chasm_no_longer_stopped)) target_turf = target - START_PROCESSING(SSobj, src) // process on create, in case stuff is still there - src.parent.AddElement(/datum/element/lazy_fishing_spot, FISHING_SPOT_PRESET_CHASM) + RegisterSignal(parent, COMSIG_ATOM_ABSTRACT_ENTERED, PROC_REF(entered)) + RegisterSignal(parent, COMSIG_ATOM_ABSTRACT_EXITED, PROC_REF(exited)) + RegisterSignal(parent, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, PROC_REF(initialized_on)) + //allow catwalks to give the turf the CHASM_STOPPED trait before dropping stuff when the turf is changed. + //otherwise don't do anything because turfs and areas are initialized before movables. + if(!mapload) + addtimer(CALLBACK(src, PROC_REF(drop_stuff)), 0) + parent.AddElement(/datum/element/lazy_fishing_spot, /datum/fish_source/chasm) /datum/component/chasm/UnregisterFromParent() - STOP_PROCESSING(SSobj, src) - remove_storage() + storage = null -/** - * Deletes the chasm storage object and removes empty weakrefs from global list - */ -/datum/component/chasm/proc/remove_storage() - if (!storage) - return - QDEL_NULL(storage) - var/list/chasm_storage = list() - for (var/datum/weakref/ref as anything in GLOB.chasm_storage) - if (!ref.resolve()) - continue - chasm_storage += ref - GLOB.chasm_storage = chasm_storage - -/datum/component/chasm/proc/Entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) +/datum/component/chasm/proc/entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) SIGNAL_HANDLER + drop_stuff() - START_PROCESSING(SSobj, src) - drop_stuff(arrived) - -/datum/component/chasm/process() - if (!drop_stuff()) - STOP_PROCESSING(SSobj, src) - -/datum/component/chasm/proc/is_safe() - //if anything matching this typecache is found in the chasm, we don't drop things - var/static/list/chasm_safeties_typecache = typecacheof(list(/obj/structure/lattice, /obj/structure/lattice/catwalk, /obj/structure/stone_tile)) +/datum/component/chasm/proc/exited(datum/source, atom/movable/exited) + SIGNAL_HANDLER + UnregisterSignal(exited, list(COMSIG_MOVETYPE_FLAG_DISABLED, COMSIG_LIVING_SET_BUCKLED, COMSIG_MOVABLE_THROW_LANDED)) - var/atom/parent = src.parent - var/list/found_safeties = typecache_filter_list(parent.contents, chasm_safeties_typecache) - for(var/obj/structure/stone_tile/S in found_safeties) - if(S.fallen) - LAZYREMOVE(found_safeties, S) - return LAZYLEN(found_safeties) +/datum/component/chasm/proc/initialized_on(datum/source, atom/movable/movable, mapload) + SIGNAL_HANDLER + drop_stuff(movable) -/datum/component/chasm/proc/drop_stuff(dropped_thing) - if (is_safe()) - return FALSE +/datum/component/chasm/proc/on_chasm_stopped(datum/source) + SIGNAL_HANDLER + UnregisterSignal(source, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_EXITED, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON)) + for(var/atom/movable/movable as anything in source) + UnregisterSignal(movable, list(COMSIG_MOVETYPE_FLAG_DISABLED, COMSIG_LIVING_SET_BUCKLED, COMSIG_MOVABLE_THROW_LANDED)) - var/atom/parent = src.parent - var/to_check = dropped_thing ? list(dropped_thing) : parent.contents - for (var/thing in to_check) - if (droppable(thing)) - . = TRUE - INVOKE_ASYNC(src, PROC_REF(drop), thing) +/datum/component/chasm/proc/on_chasm_no_longer_stopped(datum/source) + SIGNAL_HANDLER + RegisterSignal(parent, COMSIG_ATOM_ENTERED, PROC_REF(entered)) + RegisterSignal(parent, COMSIG_ATOM_EXITED, PROC_REF(exited)) + RegisterSignal(parent, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, PROC_REF(initialized_on)) + drop_stuff() + +#define CHASM_NOT_DROPPING 0 +#define CHASM_DROPPING 1 +///Doesn't drop the movable, but registers a few signals to try again if the conditions change. +#define CHASM_REGISTER_SIGNALS 2 + +/datum/component/chasm/proc/drop_stuff(atom/movable/dropped_thing) + if(HAS_TRAIT(parent, TRAIT_CHASM_STOPPED)) + return + var/atom/atom_parent = parent + var/to_check = dropped_thing ? list(dropped_thing) : atom_parent.contents + for (var/atom/movable/thing as anything in to_check) + var/dropping = droppable(thing) + switch(dropping) + if(CHASM_DROPPING) + INVOKE_ASYNC(src, PROC_REF(drop), thing) + if(CHASM_REGISTER_SIGNALS) + RegisterSignals(thing, list(COMSIG_MOVETYPE_FLAG_DISABLED, COMSIG_LIVING_SET_BUCKLED, COMSIG_MOVABLE_THROW_LANDED), PROC_REF(drop_stuff), TRUE) /datum/component/chasm/proc/droppable(atom/movable/dropped_thing) var/datum/weakref/falling_ref = WEAKREF(dropped_thing) // avoid an infinite loop, but allow falling a large distance if(falling_atoms[falling_ref] && falling_atoms[falling_ref] > 30) - return FALSE - if(!isliving(dropped_thing) && !isobj(dropped_thing)) - return FALSE - if(is_type_in_typecache(dropped_thing, forbidden_types) || dropped_thing.throwing || (dropped_thing.movement_type & (FLOATING|FLYING))) - return FALSE + return CHASM_NOT_DROPPING + if(is_type_in_typecache(dropped_thing, forbidden_types) || (!isliving(dropped_thing) && !isobj(dropped_thing))) + return CHASM_NOT_DROPPING + if(dropped_thing.throwing || (dropped_thing.movement_type & (FLOATING|FLYING))) + return CHASM_REGISTER_SIGNALS //Flies right over the chasm if(ismob(dropped_thing)) @@ -106,7 +110,7 @@ GLOBAL_LIST_INIT(chasm_storage, list()) if(M.buckled) //middle statement to prevent infinite loops just in case! var/mob/buckled_to = M.buckled if((!ismob(M.buckled) || (buckled_to.buckled != M)) && !droppable(M.buckled)) - return FALSE + return CHASM_REGISTER_SIGNALS if(ishuman(dropped_thing)) var/mob/living/carbon/human/victim = dropped_thing if(istype(victim.belt, /obj/item/wormhole_jaunter)) @@ -115,8 +119,12 @@ GLOBAL_LIST_INIT(chasm_storage, list()) var/fall_into_chasm = jaunter.chasm_react(victim) if(!fall_into_chasm) chasm.visible_message(span_boldwarning("[victim] falls into the [chasm]!")) //To freak out any bystanders - return fall_into_chasm - return TRUE + return fall_into_chasm ? CHASM_DROPPING : CHASM_NOT_DROPPING + return CHASM_DROPPING + +#undef CHASM_NOT_DROPPING +#undef CHASM_DROPPING +#undef CHASM_REGISTER_SIGNALS /datum/component/chasm/proc/drop(atom/movable/dropped_thing) var/datum/weakref/falling_ref = WEAKREF(dropped_thing) @@ -151,7 +159,7 @@ GLOBAL_LIST_INIT(chasm_storage, list()) dropped_thing.visible_message(span_boldwarning("[dropped_thing] falls into [parent]!"), span_userdanger("[oblivion_message]")) if (isliving(dropped_thing)) var/mob/living/falling_mob = dropped_thing - falling_mob.notransform = TRUE + ADD_TRAIT(falling_mob, TRAIT_NO_TRANSFORM, REF(src)) falling_mob.Paralyze(20 SECONDS) var/oldtransform = dropped_thing.transform @@ -176,9 +184,7 @@ GLOBAL_LIST_INIT(chasm_storage, list()) return if(!storage) - storage = new(get_turf(parent)) - RegisterSignal(storage, COMSIG_ATOM_EXITED, PROC_REF(left_chasm)) - GLOB.chasm_storage += WEAKREF(storage) + storage = (locate() in parent) || new(parent) if(storage.contains(dropped_thing)) return @@ -188,16 +194,13 @@ GLOBAL_LIST_INIT(chasm_storage, list()) dropped_thing.transform = oldtransform dropped_thing.pixel_y = oldoffset - if(dropped_thing.forceMove(storage)) - if (isliving(dropped_thing)) - RegisterSignal(dropped_thing, COMSIG_LIVING_REVIVE, PROC_REF(on_revive)) - else + if(!dropped_thing.forceMove(storage)) parent.visible_message(span_boldwarning("[parent] spits out [dropped_thing]!")) dropped_thing.throw_at(get_edge_target_turf(parent, pick(GLOB.alldirs)), rand(1, 10), rand(1, 10)) - if(isliving(dropped_thing)) + else if(isliving(dropped_thing)) var/mob/living/fallen_mob = dropped_thing - fallen_mob.notransform = FALSE + REMOVE_TRAIT(fallen_mob, TRAIT_NO_TRANSFORM, REF(src)) if (fallen_mob.stat != DEAD) fallen_mob.investigate_log("has died from falling into a chasm.", INVESTIGATE_DEATHS) fallen_mob.death(TRUE) @@ -216,27 +219,8 @@ GLOBAL_LIST_INIT(chasm_storage, list()) SIGNAL_HANDLER UnregisterSignal(gone, COMSIG_LIVING_REVIVE) -#define CHASM_TRAIT "chasm trait" - -/** - * Called if something comes back to life inside the pit. Expected sources are badmins and changelings. - * Ethereals should take enough damage to be smashed and not revive. - * - * Arguments - * * escapee - Lucky guy who just came back to life at the bottom of a hole. - */ -/datum/component/chasm/proc/on_revive(mob/living/escapee) - SIGNAL_HANDLER - var/atom/parent = src.parent - parent.visible_message(span_boldwarning("After a long climb, [escapee] leaps out of [parent]!")) - ADD_TRAIT(escapee, TRAIT_MOVE_FLYING, CHASM_TRAIT) //Otherwise they instantly fall back in - escapee.forceMove(get_turf(parent)) - escapee.throw_at(get_edge_target_turf(parent, pick(GLOB.alldirs)), rand(1, 10), rand(1, 10)) - REMOVE_TRAIT(escapee, TRAIT_MOVE_FLYING, CHASM_TRAIT) - escapee.Paralyze(20 SECONDS, TRUE) - UnregisterSignal(escapee, COMSIG_LIVING_REVIVE) - -#undef CHASM_TRAIT +///Global list needed to let fishermen with a rescue hook fish fallen mobs from any place +GLOBAL_LIST_EMPTY(chasm_fallen_mobs) /** * An abstract object which is basically just a bag that the chasm puts people inside @@ -250,3 +234,40 @@ GLOBAL_LIST_INIT(chasm_storage, list()) /obj/effect/abstract/chasm_storage/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_SECLUDED_LOCATION, INNATE_TRAIT) + +/obj/effect/abstract/chasm_storage/Entered(atom/movable/arrived) + . = ..() + if(isliving(arrived)) + RegisterSignal(arrived, COMSIG_LIVING_REVIVE, PROC_REF(on_revive)) + GLOB.chasm_fallen_mobs += arrived + +/obj/effect/abstract/chasm_storage/Exited(atom/movable/gone) + . = ..() + if(isliving(gone)) + UnregisterSignal(gone, COMSIG_LIVING_REVIVE) + GLOB.chasm_fallen_mobs -= gone + +#define CHASM_TRAIT "chasm trait" +/** + * Called if something comes back to life inside the pit. Expected sources are badmins and changelings. + * Ethereals should take enough damage to be smashed and not revive. + * Arguments + * escapee - Lucky guy who just came back to life at the bottom of a hole. + */ +/obj/effect/abstract/chasm_storage/proc/on_revive(mob/living/escapee) + SIGNAL_HANDLER + var/turf/turf = get_turf(src) + if(turf.GetComponent(/datum/component/chasm)) + turf.visible_message(span_boldwarning("After a long climb, [escapee] leaps out of [turf]!")) + else + playsound(turf, 'sound/effects/bang.ogg', 50, TRUE) + turf.visible_message(span_boldwarning("[escapee] busts through [turf], leaping out of the chasm below")) + turf.ScrapeAway(2, flags = CHANGETURF_INHERIT_AIR) + ADD_TRAIT(escapee, TRAIT_MOVE_FLYING, CHASM_TRAIT) //Otherwise they instantly fall back in + escapee.forceMove(turf) + escapee.throw_at(get_edge_target_turf(turf, pick(GLOB.alldirs)), rand(1, 10), rand(1, 10)) + REMOVE_TRAIT(escapee, TRAIT_MOVE_FLYING, CHASM_TRAIT) + escapee.Paralyze(20 SECONDS, TRUE) + UnregisterSignal(escapee, COMSIG_LIVING_REVIVE) + +#undef CHASM_TRAIT diff --git a/code/datums/components/chuunibyou.dm b/code/datums/components/chuunibyou.dm index 00396a289b834..dda1bdeed5a79 100644 --- a/code/datums/components/chuunibyou.dm +++ b/code/datums/components/chuunibyou.dm @@ -72,7 +72,7 @@ playsound(to_fire,'sound/magic/staff_change.ogg', 75, TRUE) to_fire.color = "#f825f8" to_fire.name = "chuuni-[to_fire.name]" - to_fire.set_light(2, 2, LIGHT_COLOR_PINK, TRUE) + to_fire.set_light(2, 2, LIGHT_COLOR_PINK, l_on = TRUE) ///signal sent before parent invokes a spell /datum/component/chuunibyou/proc/on_pre_invocation(mob/living/source, datum/action/cooldown/spell/spell, list/invocation_list) diff --git a/code/datums/components/cleaner.dm b/code/datums/components/cleaner.dm index 87c61c061fe56..f63616863a12c 100644 --- a/code/datums/components/cleaner.dm +++ b/code/datums/components/cleaner.dm @@ -30,10 +30,8 @@ src.on_cleaned_callback = on_cleaned_callback /datum/component/cleaner/Destroy(force, silent) - if(pre_clean_callback) - QDEL_NULL(pre_clean_callback) - if(on_cleaned_callback) - QDEL_NULL(on_cleaned_callback) + pre_clean_callback = null + on_cleaned_callback = null return ..() /datum/component/cleaner/RegisterWithParent() @@ -100,6 +98,11 @@ RegisterSignal(target, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(cleaning_target_moved)) var/mutable_appearance/low_bubble = mutable_appearance('icons/effects/effects.dmi', "bubbles", FLOOR_CLEAN_LAYER, target, GAME_PLANE) var/mutable_appearance/high_bubble = mutable_appearance('icons/effects/effects.dmi', "bubbles", FLOOR_CLEAN_LAYER, target, ABOVE_GAME_PLANE) + var/list/icon_offsets = target.get_oversized_icon_offsets() + low_bubble.pixel_x = icon_offsets["x"] + low_bubble.pixel_y = icon_offsets["y"] + high_bubble.pixel_x = icon_offsets["x"] + high_bubble.pixel_y = icon_offsets["y"] if(target.plane > low_bubble.plane) //check if the higher overlay is necessary target.add_overlay(high_bubble) else if(target.plane == low_bubble.plane) @@ -117,9 +120,7 @@ cleaning_duration = (cleaning_duration * min(user.mind.get_skill_modifier(/datum/skill/cleaning, SKILL_SPEED_MODIFIER)+skill_duration_modifier_offset, 1)) //do the cleaning - user.visible_message(span_notice("[user] starts to clean [target]!"), span_notice("You start to clean [target]...")) if(do_after(user, cleaning_duration, target = target)) - user.visible_message(span_notice("[user] finishes cleaning [target]!"), span_notice("You finish cleaning [target].")) if(clean_target) for(var/obj/effect/decal/cleanable/cleanable_decal in target) //it's important to do this before you wash all of the cleanables off user.mind?.adjust_experience(/datum/skill/cleaning, round(cleanable_decal.beauty / CLEAN_SKILL_BEAUTY_ADJUSTMENT)) diff --git a/code/datums/components/clickbox.dm b/code/datums/components/clickbox.dm index 88815cf25508c..5d840b16a8ed2 100644 --- a/code/datums/components/clickbox.dm +++ b/code/datums/components/clickbox.dm @@ -21,7 +21,7 @@ /// For simple animals that have different icon states when dead. var/dead_state /// the underlay that has been added to the parent. - var/mutable_appearance/clickbox_undelay + var/mutable_appearance/clickbox_underlay /datum/component/clickbox/Initialize(icon_state = "sphere", x_offset = 0, y_offset = 0, max_scale = 2, min_scale = 0.5, dead_state) if(!isatom(parent)) @@ -33,63 +33,70 @@ src.max_scale = max_scale src.min_scale = min_scale - RegisterSignal(parent, COMSIG_ATOM_VV_MODIFY_TRANSFORM, PROC_REF(on_modify_or_update_transform)) + RegisterSignal(parent, COMSIG_ATOM_VV_MODIFY_TRANSFORM, PROC_REF(on_vv_modify_transform)) var/clickbox_icon_state = icon_state - if(dead_state && isliving(parent)) + if(isliving(parent)) var/mob/living/living_parent = parent - src.dead_state = dead_state - RegisterSignal(living_parent, COMSIG_LIVING_POST_UPDATE_TRANSFORM, PROC_REF(on_modify_or_update_transform)) - RegisterSignal(living_parent, COMSIG_LIVING_DEATH, PROC_REF(on_death)) - RegisterSignal(living_parent, COMSIG_LIVING_REVIVE, PROC_REF(on_revive)) - if(living_parent.stat == DEAD) - clickbox_icon_state = dead_state + RegisterSignal(living_parent, COMSIG_LIVING_POST_UPDATE_TRANSFORM, PROC_REF(on_update_transform)) + if(dead_state) + src.dead_state = dead_state + RegisterSignal(living_parent, COMSIG_LIVING_DEATH, PROC_REF(on_death)) + RegisterSignal(living_parent, COMSIG_LIVING_REVIVE, PROC_REF(on_revive)) + if(living_parent.stat == DEAD) + clickbox_icon_state = dead_state + update_underlay(clickbox_icon_state) /datum/component/clickbox/UnregisterFromParent() var/atom/movable/mov_parent = parent UnregisterSignal(mov_parent, list(COMSIG_ATOM_VV_MODIFY_TRANSFORM, COMSIG_LIVING_POST_UPDATE_TRANSFORM, COMSIG_LIVING_DEATH, COMSIG_LIVING_REVIVE)) - mov_parent.underlays -= clickbox_undelay + mov_parent.underlays -= clickbox_underlay -/// Removes the old underlay and adds a new one if conditions are met. The underlay is scaled up/down if necessary -/datum/component/clickbox/proc/update_underlay(clickbox_icon_state) +/// Removes the old underlay and adds a new one. The underlay is scaled up/down if necessary +/datum/component/clickbox/proc/update_underlay(clickbox_icon_state, width, height) var/atom/movable/mov_parent = parent if(!clickbox_icon_state) - clickbox_icon_state = clickbox_undelay?.icon_state || icon_state - mov_parent.underlays -= clickbox_undelay // Remove the previous underlay. - - var/width = abs(mov_parent.transform.a) // Negative values flip the parent, so abs() is good to have here. - var/height = abs(mov_parent.transform.e) // Idem. + clickbox_icon_state = clickbox_underlay?.icon_state || icon_state + mov_parent.underlays -= clickbox_underlay // Remove the previous underlay. var/clickbox_width = 1 - if(width > max_scale) + var/abs_width = abs(width) //Taking into account inverted transform values. + if(abs_width > max_scale) clickbox_width = max_scale/width - else if(width < min_scale && width) + else if(abs_width && abs_width < min_scale) clickbox_width = min_scale/width var/clickbox_height = 1 - if(height > max_scale) + var/abs_height = abs(height) //Ditto + if(abs_height > max_scale) clickbox_height = max_scale/height - else if(height < min_scale && height) + else if(abs_height && abs_height < min_scale) clickbox_height = min_scale/height - clickbox_undelay = mutable_appearance('icons/misc/clickbox.dmi', clickbox_icon_state, CLICKBOX_LAYER, alpha = 1, appearance_flags = RESET_COLOR|RESET_ALPHA) - clickbox_undelay.transform = clickbox_undelay.transform.Scale(clickbox_width, clickbox_height) + clickbox_underlay = mutable_appearance('icons/misc/clickbox.dmi', clickbox_icon_state, CLICKBOX_LAYER, alpha = 1, appearance_flags = RESET_COLOR|RESET_ALPHA) + clickbox_underlay.transform = clickbox_underlay.transform.Scale(clickbox_width, clickbox_height) //Keeps the underlay more or less centered. - clickbox_undelay.pixel_x = x_offset * 1/clickbox_width - clickbox_undelay.pixel_y = y_offset * 1/clickbox_height - mov_parent.underlays += clickbox_undelay + clickbox_underlay.pixel_x = x_offset * 1/clickbox_width + clickbox_underlay.pixel_y = y_offset * 1/clickbox_height + mov_parent.underlays += clickbox_underlay + +/datum/component/clickbox/proc/on_vv_modify_transform(atom/source) + SIGNAL_HANDLER + var/width = source.transform.a + var/height = source.transform.e + update_underlay(clickbox_underlay.icon_state, width, height) -/datum/component/clickbox/proc/on_modify_or_update_transform(atom/source) +/datum/component/clickbox/proc/on_update_transform(mob/living/source, previous_size) SIGNAL_HANDLER - update_underlay() + update_underlay(clickbox_underlay.icon_state , source.current_size, source.current_size) /datum/component/clickbox/proc/on_death(mob/living/source) SIGNAL_HANDLER - update_underlay(dead_state) + update_underlay(dead_state, source.current_size, source.current_size) /datum/component/clickbox/proc/on_revive(mob/living/source) SIGNAL_HANDLER - update_underlay(icon_state) + update_underlay(icon_state, source.current_size, source.current_size) #undef CLICKBOX_LAYER diff --git a/code/datums/components/combo_attacks.dm b/code/datums/components/combo_attacks.dm index 1524451b67a78..33989e26682ce 100644 --- a/code/datums/components/combo_attacks.dm +++ b/code/datums/components/combo_attacks.dm @@ -32,6 +32,10 @@ src.leniency_time = leniency_time src.can_attack_callback = can_attack_callback +/datum/component/combo_attacks/Destroy(force, silent) + can_attack_callback = null + return ..() + /datum/component/combo_attacks/RegisterWithParent() RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) RegisterSignal(parent, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(on_examine_more)) diff --git a/code/datums/components/crafting/_recipes.dm b/code/datums/components/crafting/_recipes.dm index f517d7eb1d1ea..4254804974ead 100644 --- a/code/datums/components/crafting/_recipes.dm +++ b/code/datums/components/crafting/_recipes.dm @@ -17,7 +17,7 @@ var/list/tool_paths ///time in seconds. Remember to use the SECONDS define! var/time = 3 SECONDS - ///type paths of items that will be placed in the result + ///type paths of items that will be forceMoved() into the result, or added to the reagents of it var/list/parts = list() ///like tool_behaviors but for reagents var/list/chem_catalysts = list() @@ -43,6 +43,10 @@ var/delete_contents = TRUE /datum/crafting_recipe/New() + if(!name && result) + var/atom/atom_result = result + name = initial(atom_result.name) + if(!(result in reqs)) blacklist += result // These should be excluded from all crafting recipies diff --git a/code/datums/components/crafting/atmospheric.dm b/code/datums/components/crafting/atmospheric.dm index 29600769f372a..955c9704abda5 100644 --- a/code/datums/components/crafting/atmospheric.dm +++ b/code/datums/components/crafting/atmospheric.dm @@ -29,6 +29,15 @@ time = 2 SECONDS category = CAT_ATMOSPHERIC +/datum/crafting_recipe/air_sensor + name = "Monitored Air Sensor" + result = /obj/item/air_sensor + reqs = list( + /obj/item/analyzer = 1, + /obj/item/stack/sheet/iron = 1, + ) + blacklist = list(/obj/item/analyzer/ranged) + /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 diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index 3539229899044..9f17b3d1d7e66 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -20,6 +20,7 @@ var/mode = CRAFTING var/display_craftable_only = FALSE var/display_compact = FALSE + var/forced_mode = FALSE /* This is what procs do: get_environment - gets a list of things accessable for crafting by user @@ -122,23 +123,19 @@ if(isstack(item)) var/obj/item/stack/stack = item .["other"][item.type] += stack.amount - else if(item.tool_behaviour) - .["tool_behaviour"] += item.tool_behaviour - .["other"][item.type] += 1 - else - if(is_reagent_container(item)) - var/obj/item/reagent_containers/container = item - if(container.is_drainable()) - for(var/datum/reagent/reagent in container.reagents.reagent_list) - .["other"][reagent.type] += reagent.volume + else if(is_reagent_container(item) && item.is_drainable() && length(item.reagents.reagent_list)) //some container that has some reagents inside it that can be drained + var/obj/item/reagent_containers/container = item + for(var/datum/reagent/reagent as anything in container.reagents.reagent_list) + .["other"][reagent.type] += reagent.volume + else //a reagent container that is empty can also be used as a tool. e.g. glass bottle can be used as a rolling pin + if(item.tool_behaviour) + .["tool_behaviour"] += item.tool_behaviour .["other"][item.type] += 1 else if (ismachinery(object)) LAZYADDASSOCLIST(.["machinery"], object.type, object) else if (isstructure(object)) LAZYADDASSOCLIST(.["structures"], object.type, object) - - /// Returns a boolean on whether the tool requirements of the input recipe are satisfied by the input source and surroundings. /datum/component/personal_crafting/proc/check_tools(atom/source, datum/crafting_recipe/recipe, list/surroundings) if(!length(recipe.tool_behaviors) && !length(recipe.tool_paths)) @@ -181,36 +178,44 @@ return TRUE -/datum/component/personal_crafting/proc/construct_item(atom/a, datum/crafting_recipe/R) - var/list/contents = get_surroundings(a,R.blacklist) +/datum/component/personal_crafting/proc/construct_item(atom/crafter, datum/crafting_recipe/recipe) + if(!crafter) + return ", unknown error!" // This should never happen, but in the event that it does... + + if(!recipe) + return ", invalid recipe!" // This can happen, I can't really explain why, but it can. Better safe than sorry. + + var/list/contents = get_surroundings(crafter, recipe.blacklist) var/send_feedback = 1 - if(check_contents(a, R, contents)) - if(check_tools(a, R, contents)) - if(R.one_per_turf) - for(var/content in get_turf(a)) - if(istype(content, R.result)) + if(check_contents(crafter, recipe, contents)) + if(check_tools(crafter, recipe, contents)) + if(recipe.one_per_turf) + for(var/content in get_turf(crafter)) + if(istype(content, recipe.result)) return ", object already present." //If we're a mob we'll try a do_after; non mobs will instead instantly construct the item - if(ismob(a) && !do_after(a, R.time, target = a)) + if(ismob(crafter) && !do_after(crafter, recipe.time, target = crafter)) return "." - contents = get_surroundings(a,R.blacklist) - if(!check_contents(a, R, contents)) + contents = get_surroundings(crafter, recipe.blacklist) + if(!check_contents(crafter, recipe, contents)) return ", missing component." - if(!check_tools(a, R, contents)) + if(!check_tools(crafter, recipe, contents)) return ", missing tool." - var/list/parts = del_reqs(R, a) - var/atom/movable/I - if(ispath(R.result, /obj/item/stack)) - I = new R.result (get_turf(a.loc), R.result_amount || 1) + var/list/parts = del_reqs(recipe, crafter) + var/atom/movable/result + if(ispath(recipe.result, /obj/item/stack)) + result = new recipe.result(get_turf(crafter.loc), recipe.result_amount || 1) else - I = new R.result (get_turf(a.loc)) - if(I.atom_storage && R.delete_contents) - for(var/obj/item/thing in I) + result = new recipe.result(get_turf(crafter.loc)) + if(result.atom_storage && recipe.delete_contents) + for(var/obj/item/thing in result) qdel(thing) - I.CheckParts(parts, R) + if (IsEdible(result)) + result.reagents?.clear_reagents() + result.CheckParts(parts, recipe) if(send_feedback) - SSblackbox.record_feedback("tally", "object_crafted", 1, I.type) - return I //Send the item back to whatever called this proc so it can handle whatever it wants to do with the new item + SSblackbox.record_feedback("tally", "object_crafted", 1, result.type) + return result //Send the item back to whatever called this proc so it can handle whatever it wants to do with the new item return ", missing tool." return ", missing component." @@ -403,6 +408,7 @@ var/list/data = list() var/list/material_occurences = list() + data["forced_mode"] = forced_mode data["recipes"] = list() data["categories"] = list() data["foodtypes"] = FOOD_FLAGS @@ -464,7 +470,7 @@ else if(!istype(result, /obj/effect/spawner)) result.forceMove(user.drop_location()) - to_chat(user, span_notice("[crafting_recipe.name] constructed.")) + to_chat(user, span_notice("[crafting_recipe.name] crafted.")) user.investigate_log("crafted [crafting_recipe]", INVESTIGATE_CRAFTING) crafting_recipe.on_craft_completion(user, result) else @@ -477,6 +483,8 @@ display_compact = !display_compact . = TRUE if("toggle_mode") + if(forced_mode) + return mode = !mode var/mob/user = usr update_static_data(user) @@ -514,7 +522,7 @@ data["category"] = recipe.category // Name, Description - data["name"] = recipe.name || initial(atom.name) + data["name"] = recipe.name if(ispath(recipe.result, /datum/reagent)) var/datum/reagent/reagent = recipe.result diff --git a/code/datums/components/crafting/furniture.dm b/code/datums/components/crafting/furniture.dm index bdd7372f17030..6cfe215a4b7bd 100644 --- a/code/datums/components/crafting/furniture.dm +++ b/code/datums/components/crafting/furniture.dm @@ -36,3 +36,14 @@ /obj/item/stack/sheet/mineral/silver = 2, ) category = CAT_FURNITURE + +/datum/crafting_recipe/surgery_tray + name = "Surgery Tray" + reqs = list( + /obj/item/stack/sheet/mineral/silver = 1, + /obj/item/stack/rods = 2 + ) + result = /obj/item/surgery_tray + tool_behaviors = list(TOOL_SCREWDRIVER) + category = CAT_FURNITURE + time = 5 SECONDS diff --git a/code/datums/components/crafting/guncrafting.dm b/code/datums/components/crafting/guncrafting.dm index 0a42b2edd84f8..a5a20d4326b29 100644 --- a/code/datums/components/crafting/guncrafting.dm +++ b/code/datums/components/crafting/guncrafting.dm @@ -2,12 +2,27 @@ // PARTS // +/obj/item/weaponcrafting/Initialize(mapload) + . = ..() + create_slapcraft_component() + +/obj/item/weaponcrafting/proc/create_slapcraft_component() + return + /obj/item/weaponcrafting/receiver name = "modular receiver" desc = "A prototype modular receiver and trigger assembly for a firearm." icon = 'icons/obj/weapons/improvised.dmi' icon_state = "receiver" +/obj/item/weaponcrafting/receiver/create_slapcraft_component() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/pipegun) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/weaponcrafting/stock name = "rifle stock" desc = "A classic rifle stock that doubles as a grip, roughly carved out of wood." @@ -16,11 +31,33 @@ icon = 'icons/obj/weapons/improvised.dmi' icon_state = "riflestock" +/obj/item/weaponcrafting/stock/create_slapcraft_component() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/smoothbore_disabler, /datum/crafting_recipe/laser_musket) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + +/obj/item/weaponcrafting/giant_wrench + name = "Big Slappy parts kit" + desc = "Illegal parts to make a giant like wrench commonly known as a Big Slappy." + icon = 'icons/obj/weapons/improvised.dmi' + icon_state = "weaponkit_gw" + +/obj/item/weaponcrafting/giant_wrench/create_slapcraft_component() // slappycraft + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/giant_wrench) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + ///These gun kits are printed from the security protolathe to then be used in making new weapons // GUN PART KIT // -/obj/item/weaponcrafting/gunkit +/obj/item/weaponcrafting/gunkit // These don't get a slapcraft component, it's added to the gun - more intuitive player-facing to slap the kit onto the gun. name = "generic gun parts kit" desc = "It's an empty gun parts container! Why do you have this?" icon = 'icons/obj/weapons/improvised.dmi' diff --git a/code/datums/components/crafting/melee_weapon.dm b/code/datums/components/crafting/melee_weapon.dm index 0d50bf077e68a..23873a5d7af94 100644 --- a/code/datums/components/crafting/melee_weapon.dm +++ b/code/datums/components/crafting/melee_weapon.dm @@ -142,3 +142,17 @@ ) time = 10 SECONDS category = CAT_WEAPON_MELEE + +/datum/crafting_recipe/giant_wrench + name = "Big Slappy" + result = /obj/item/shovel/giant_wrench + tool_behaviors = list(TOOL_CROWBAR, TOOL_SCREWDRIVER, TOOL_WELDER) + reqs = list( + /obj/item/wrench = 4, + /obj/item/weaponcrafting/giant_wrench = 1, + /obj/item/stack/sheet/plasteel = 5, + /obj/item/stack/rods = 10, + /obj/item/pickaxe/drill = 1, + ) + time = 10 SECONDS + category = CAT_WEAPON_MELEE diff --git a/code/datums/components/crafting/misc.dm b/code/datums/components/crafting/misc.dm index dd850874d68ff..264ff98156533 100644 --- a/code/datums/components/crafting/misc.dm +++ b/code/datums/components/crafting/misc.dm @@ -34,3 +34,13 @@ ) tool_paths = list(/obj/item/stamp/head/captain) category = CAT_MISC + +/datum/crafting_recipe/cardboard_id + name = "Cardboard ID Card" + tool_behaviors = list(TOOL_WIRECUTTER) + result = /obj/item/card/cardboard + time = 4 SECONDS + reqs = list( + /obj/item/stack/sheet/cardboard = 1, + ) + category = CAT_MISC diff --git a/code/datums/components/crafting/ranged_weapon.dm b/code/datums/components/crafting/ranged_weapon.dm index 6b6acb544122f..94a943b42c8fd 100644 --- a/code/datums/components/crafting/ranged_weapon.dm +++ b/code/datums/components/crafting/ranged_weapon.dm @@ -45,14 +45,12 @@ /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 = 20 SECONDS + time = 10 SECONDS category = CAT_WEAPON_RANGED /datum/crafting_recipe/advancedegun/New() @@ -61,14 +59,12 @@ /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/gun/energy/disabler = 1, /obj/item/weaponcrafting/gunkit/temperature = 1, ) - time = 20 SECONDS + time = 10 SECONDS category = CAT_WEAPON_RANGED /datum/crafting_recipe/tempgun/New() @@ -77,16 +73,14 @@ /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 = 20 SECONDS + time = 10 SECONDS category = CAT_WEAPON_RANGED /datum/crafting_recipe/beam_rifle/New() @@ -95,27 +89,23 @@ /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 = 20 SECONDS + time = 10 SECONDS category = CAT_WEAPON_RANGED /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 = 20 SECONDS + time = 10 SECONDS category = CAT_WEAPON_RANGED /datum/crafting_recipe/xraylaser/New() @@ -124,14 +114,12 @@ /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 = 20 SECONDS + time = 10 SECONDS category = CAT_WEAPON_RANGED /datum/crafting_recipe/hellgun/New() @@ -140,14 +128,12 @@ /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 = 20 SECONDS + time = 10 SECONDS category = CAT_WEAPON_RANGED /datum/crafting_recipe/ioncarbine/New() @@ -156,16 +142,14 @@ /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 = 4, ) - time = 20 SECONDS + time = 10 SECONDS category = CAT_WEAPON_RANGED /datum/crafting_recipe/decloner/New() @@ -174,14 +158,12 @@ /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 = 20 SECONDS + time = 10 SECONDS category = CAT_WEAPON_RANGED /datum/crafting_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but @@ -240,18 +222,19 @@ time = 30 SECONDS //contemplate for a bit category = CAT_WEAPON_RANGED -/datum/crafting_recipe/deagle_prime //When you factor in the makarov (7 tc), the toolbox (1 tc), and the emag (3 tc), this comes to a total of 17 TC or thereabouts. Igorning the 20k pricetag, obviously. +/datum/crafting_recipe/deagle_prime //When you factor in the makarov (7 tc), the toolbox (1 tc), and the emag (3 tc), this comes to a total of 18 TC or thereabouts. Igorning the 20k pricetag, obviously. name = "Regal Condor" always_available = FALSE - result = /obj/item/gun/ballistic/automatic/pistol/deagle/regal/no_mag + result = /obj/item/gun/ballistic/automatic/pistol/deagle/regal reqs = list( /obj/item/gun/ballistic/automatic/pistol = 1, /obj/item/stack/sheet/mineral/gold = 25, /obj/item/stack/sheet/mineral/silver = 25, /obj/item/food/donkpocket = 1, - /obj/item/stack/telecrystal = 3, + /obj/item/stack/telecrystal = 4, /obj/item/clothing/head/costume/crown/fancy = 1, //the captain's crown /obj/item/storage/toolbox/syndicate = 1, + /obj/item/stack/sheet/iron = 10, ) tool_behaviors = list(TOOL_SCREWDRIVER) tool_paths = list( @@ -267,18 +250,22 @@ blacklist += subtypesof(/obj/item/gun/ballistic/automatic/pistol) /datum/crafting_recipe/deagle_prime_mag - name = "Regal Condor Magazine (10mm)" + name = "Regal Condor Magazine (10mm Reaper)" always_available = FALSE - result = /obj/item/ammo_box/magazine/r10mm/empty + result = /obj/item/ammo_box/magazine/r10mm reqs = list( /obj/item/stack/sheet/iron = 10, - /obj/item/stack/telecrystal = 2, + /obj/item/stack/sheet/mineral/gold = 10, + /obj/item/stack/sheet/mineral/silver = 10, + /obj/item/stack/sheet/mineral/plasma = 10, + /obj/item/food/donkpocket = 1, //Station mass murder, as sponsored by Donk Co. ) tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WELDER) tool_paths = list( /obj/item/clothing/under/syndicate, /obj/item/clothing/mask/gas/syndicate, - /obj/item/card/emag + /obj/item/card/emag, + /obj/item/gun/ballistic/automatic/pistol/deagle/regal ) time = 5 SECONDS category = CAT_WEAPON_RANGED @@ -296,3 +283,64 @@ /obj/item/storage/toolbox = 1, ) category = CAT_WEAPON_RANGED + +/datum/crafting_recipe/laser_musket + name = "Laser Musket" + result = /obj/item/gun/energy/laser/musket + reqs = list( + /obj/item/weaponcrafting/stock = 1, + /obj/item/stack/cable_coil = 15, + /obj/item/stack/rods = 4, + /obj/item/stock_parts/micro_laser = 1, + /obj/item/stock_parts/capacitor = 1, + /obj/item/clothing/glasses/regular = 1, + /obj/item/reagent_containers/cup/glass/drinkingglass = 1, + ) + tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + time = 10 SECONDS + category = CAT_WEAPON_RANGED + +/datum/crafting_recipe/laser_musket_prime + name = "Heroic Laser Musket" + always_available = FALSE + result = /obj/item/gun/energy/laser/musket/prime + reqs = list( + /obj/item/gun/energy/laser/musket = 1, + /obj/item/stack/cable_coil = 15, + /obj/item/stack/sheet/mineral/silver = 5, + /obj/item/stock_parts/water_recycler = 1, + /datum/reagent/consumable/nuka_cola = 15, + ) + tool_behaviors = list(TOOL_SCREWDRIVER) + tool_paths = list(/obj/item/clothing/head/cowboy, /obj/item/clothing/shoes/cowboy) + time = 30 SECONDS //contemplate for a bit + category = CAT_WEAPON_RANGED + +/datum/crafting_recipe/smoothbore_disabler + name = "Smoothbore Disabler" + result = /obj/item/gun/energy/disabler/smoothbore + reqs = list( + /obj/item/weaponcrafting/stock = 1, //it becomes the grip + /obj/item/stack/cable_coil = 5, + /obj/item/pipe = 1, + /obj/item/stock_parts/micro_laser = 1, + /obj/item/stock_parts/cell = 1, + /obj/item/assembly/mousetrap = 1, + ) + tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WRENCH) + time = 10 SECONDS + category = CAT_WEAPON_RANGED + +/datum/crafting_recipe/smoothbore_disabler_prime + name = "Elite Smoothbore Disabler" + always_available = FALSE + result = /obj/item/gun/energy/disabler/smoothbore/prime + reqs = list( + /obj/item/gun/energy/disabler/smoothbore = 1, + /obj/item/stack/sheet/mineral/gold = 5, + /obj/item/stock_parts/cell/hyper = 1, + /datum/reagent/reaction_agent/speed_agent = 10, + ) + tool_behaviors = list(TOOL_SCREWDRIVER) + time = 20 SECONDS + category = CAT_WEAPON_RANGED diff --git a/code/datums/components/crafting/robot.dm b/code/datums/components/crafting/robot.dm index ba5221f0d241d..12202cf17f87d 100644 --- a/code/datums/components/crafting/robot.dm +++ b/code/datums/components/crafting/robot.dm @@ -76,6 +76,7 @@ bot.medkit_type = medkit bot.healthanalyzer = bot.contents[4] + ///if you add a new one don't forget to update /obj/item/storage/medkit/attackby() if (istype(medkit, /obj/item/storage/medkit/fire)) bot.skin = "ointment" else if (istype(medkit, /obj/item/storage/medkit/toxin)) @@ -86,6 +87,8 @@ bot.skin = "brute" else if (istype(medkit, /obj/item/storage/medkit/advanced)) bot.skin = "advanced" + else if (istype(src, /obj/item/storage/medkit/tactical)) + bot.skin = "bezerk" bot.damagetype_healer = initial(medkit.damagetype_healed) ? initial(medkit.damagetype_healed) : BRUTE bot.update_appearance() diff --git a/code/datums/components/crafting/slapcrafting.dm b/code/datums/components/crafting/slapcrafting.dm new file mode 100644 index 0000000000000..32a901dc73e60 --- /dev/null +++ b/code/datums/components/crafting/slapcrafting.dm @@ -0,0 +1,202 @@ +/// Slapcrafting component! +/datum/component/slapcrafting + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + var/list/slapcraft_recipes = list() + +/** + * Slapcraft component + * + * Slap it onto a item to be able to slapcraft with it + * + * args: + * * slapcraft_recipes (required) = The recipe to attempt crafting. + * Hit it with an ingredient of the recipe to attempt crafting. + * It will check the area near the user for the rest of the ingredients and tools. + * * +**/ +/datum/component/slapcrafting/Initialize( + slapcraft_recipes = null, + ) + + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + + var/obj/item/parent_item = parent + + if((parent_item.item_flags & ABSTRACT) || (parent_item.item_flags & DROPDEL)) + return COMPONENT_NOTRANSFER + + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(attempt_slapcraft)) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(get_examine_info)) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(get_examine_more_info)) + RegisterSignal(parent, COMSIG_TOPIC, PROC_REF(topic_handler)) + + src.slapcraft_recipes += slapcraft_recipes + +/datum/component/slapcrafting/InheritComponent(datum/component/slapcrafting/new_comp, original, slapcraft_recipes) + if(!original) + return + src.slapcraft_recipes += slapcraft_recipes + +/datum/component/slapcrafting/Destroy(force, silent) + UnregisterSignal(parent, list(COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_EXAMINE, COMSIG_ATOM_EXAMINE_MORE)) + return ..() + +/datum/component/slapcrafting/proc/attempt_slapcraft(obj/item/parent_item, obj/item/slapper, mob/user) + + if(isnull(slapcraft_recipes)) + CRASH("NULL SLAPCRAFT RECIPES?") + + var/datum/component/personal_crafting/craft_sheet = user.GetComponent(/datum/component/personal_crafting) + if(!craft_sheet) + CRASH("No craft sheet on user ??") + + var/list/valid_recipes + for(var/datum/crafting_recipe/recipe as anything in slapcraft_recipes) + // Gotta instance it to copy the list over. + recipe = new recipe() + var/list/type_ingredient_list = recipe.reqs + qdel(recipe) + if(length(type_ingredient_list) == 1) // No ingredients besides itself? We use one of the tools then + type_ingredient_list = recipe.tool_paths + // Check the tool behaviours differently as they aren't types + for(var/behaviour in initial(recipe.tool_behaviors)) + if(slapper.tool_behaviour == behaviour) + LAZYADD(valid_recipes, recipe) + break + if(is_type_in_list(slapper, type_ingredient_list)) + LAZYADD(valid_recipes, recipe) + + if(!valid_recipes) + return + + // We might use radials so we need to split the proc chain + INVOKE_ASYNC(src, PROC_REF(slapcraft_async), valid_recipes, user, craft_sheet) + +/datum/component/slapcrafting/proc/slapcraft_async(list/valid_recipes, mob/user, datum/component/personal_crafting/craft_sheet) + + var/list/recipe_choices = list() + + var/list/result_to_recipe = list() + + var/final_recipe = valid_recipes[1] + var/string_chosen_recipe + if(length(valid_recipes) > 1) + for(var/datum/crafting_recipe/recipe as anything in valid_recipes) + var/atom/recipe_result = initial(recipe.result) + result_to_recipe[initial(recipe_result.name)] = recipe + recipe_choices += list("[initial(recipe_result.name)]" = image(icon = initial(recipe_result.icon), icon_state = initial(recipe_result.icon_state))) + + if(!recipe_choices) + CRASH("No recipe choices despite validating in earlier proc") + + string_chosen_recipe = show_radial_menu(user, parent, recipe_choices, require_near = TRUE) + if(isnull(string_chosen_recipe)) + return // they closed the thing + + if(string_chosen_recipe) + final_recipe = result_to_recipe[string_chosen_recipe] + + + var/datum/crafting_recipe/actual_recipe = final_recipe + + if(istype(actual_recipe, /datum/crafting_recipe/food)) + actual_recipe = locate(final_recipe) in GLOB.cooking_recipes + else + actual_recipe = locate(final_recipe) in GLOB.crafting_recipes + + if(!actual_recipe) + CRASH("Recipe not located in cooking or crafting recipes: [final_recipe]") + + var/atom/final_result = initial(actual_recipe.result) + + to_chat(user, span_notice("You start crafting \a [initial(final_result.name)]...")) + + var/error_string = craft_sheet.construct_item(user, actual_recipe) + + if(!isatom(error_string)) + to_chat(user, span_warning("crafting failed" + error_string)) + +/// Alerts any examiners to the recipe, if they wish to know more. +/datum/component/slapcrafting/proc/get_examine_info(atom/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + var/list/string_results = list() + // This list saves the recipe result names we've already used to cross-check other recipes so we don't have ', a spear, or a spear!' in the desc. + var/list/already_used_names + for(var/datum/crafting_recipe/recipe as anything in slapcraft_recipes) + // Identical name to a previous recipe's result? Skip in description. + var/atom/result = initial(recipe.result) + if(locate(initial(result.name)) in already_used_names) + continue + already_used_names += initial(result.name) + string_results += list("\a [initial(result.name)]") + + examine_list += span_notice("You think [parent] could be used to make [english_list(string_results)]! Examine again to look at the details...") + +/// Alerts any examiners to the details of the recipe. +/datum/component/slapcrafting/proc/get_examine_more_info(atom/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + for(var/datum/crafting_recipe/recipe as anything in slapcraft_recipes) + var/atom/result = initial(recipe.result) + examine_list += "See Recipe For [initial(result.name)]" + +/datum/component/slapcrafting/proc/topic_handler(atom/source, user, href_list) + SIGNAL_HANDLER + + if(!href_list["check_recipe"]) + return + + var/datum/crafting_recipe/cur_recipe = locate(href_list["check_recipe"]) in slapcraft_recipes + + if(isnull(cur_recipe)) + CRASH("null recipe!") + + var/atom/result = initial(cur_recipe.result) + + to_chat(user, span_notice("You could craft \a [initial(result.name)] by applying one of these items to it!")) + + // Gotta instance it to copy the lists over. + cur_recipe = new cur_recipe() + var/list/type_ingredient_list = cur_recipe.reqs + + // Final return string. + var/string_ingredient_list = "" + + // Check the ingredients of the crafting recipe. + for(var/valid_type in type_ingredient_list) + // Check if they're datums, specifically reagents. + var/datum/reagent/reagent_ingredient = valid_type + if(istype(reagent_ingredient)) + var/amount = initial(cur_recipe.reqs[reagent_ingredient]) + string_ingredient_list += "[amount] unit[amount > 1 ? "s" : ""] of [initial(reagent_ingredient.name)]\n" + + // Redundant! + if(parent.type == valid_type) + continue + var/atom/ingredient = valid_type + var/amount = initial(cur_recipe.reqs[ingredient]) + string_ingredient_list += "[amount > 1 ? ("[amount]" + " of") : "a"] [initial(ingredient.name)]\n" + + // If we did find ingredients then add them onto the list. + if(length(string_ingredient_list)) + to_chat(user, span_boldnotice("Ingredients:")) + to_chat(user, examine_block(span_notice(string_ingredient_list))) + + var/list/tool_list = "" + + // Paste the required tools. + for(var/valid_type in cur_recipe.tool_paths) + var/atom/tool = valid_type + tool_list += "\a [initial(tool.name)]\n" + + for(var/string in cur_recipe.tool_behaviors) + tool_list += "\a [string]\n" + + if(length(tool_list)) + to_chat(user, span_boldnotice("Required Tools:")) + to_chat(user, examine_block(span_notice(tool_list))) + + qdel(cur_recipe) + diff --git a/code/datums/components/crafting/tailoring.dm b/code/datums/components/crafting/tailoring.dm index 80c0d04534e7e..8cb6ac1459c06 100644 --- a/code/datums/components/crafting/tailoring.dm +++ b/code/datums/components/crafting/tailoring.dm @@ -284,6 +284,46 @@ ) category = CAT_CLOTHING +/datum/crafting_recipe/poppy_crown + name = "Poppy Crown" + result = /obj/item/clothing/head/costume/garland/poppy + time = 1 SECONDS + reqs = list( + /obj/item/food/grown/poppy = 5, + /obj/item/stack/cable_coil = 3, + ) + category = CAT_CLOTHING + +/datum/crafting_recipe/lily_crown + name = "Lily Crown" + result = /obj/item/clothing/head/costume/garland/lily + time = 1 SECONDS + reqs = list( + /obj/item/food/grown/poppy/lily = 5, + /obj/item/stack/cable_coil = 3, + ) + category = CAT_CLOTHING + +/datum/crafting_recipe/sunflower_crown + name = "Sunflower Crown" + result = /obj/item/clothing/head/costume/garland/sunflower + time = 1 SECONDS + reqs = list( + /obj/item/food/grown/sunflower = 5, + /obj/item/stack/cable_coil = 3, + ) + category = CAT_CLOTHING + +/datum/crafting_recipe/rainbow_bunch_crown + name = "Rainbow Flower Crown" + result = /obj/item/clothing/head/costume/garland/rainbowbunch + time = 1 SECONDS + reqs = list( + /obj/item/food/grown/rainbow_flower = 5, + /obj/item/stack/cable_coil = 3, + ) + category = CAT_CLOTHING + /datum/crafting_recipe/pillow_suit name = "pillow suit" result = /obj/item/clothing/suit/pillow_suit @@ -317,7 +357,7 @@ ) category = CAT_CLOTHING - + /datum/crafting_recipe/atmospherics_gas_mask name = "atmospherics gas mask" result = /obj/item/clothing/mask/gas/atmos @@ -327,7 +367,7 @@ /obj/item/stack/sheet/mineral/metal_hydrogen = 1, /obj/item/stack/sheet/mineral/zaukerite = 1, ) - + category = CAT_CLOTHING /datum/crafting_recipe/paper_hat diff --git a/code/datums/components/crafting/tools.dm b/code/datums/components/crafting/tools.dm index e6929845c38a1..f126bdff53873 100644 --- a/code/datums/components/crafting/tools.dm +++ b/code/datums/components/crafting/tools.dm @@ -23,7 +23,7 @@ reqs = list( /obj/item/stack/sheet/bone = 4, /datum/reagent/fuel/oil = 5, - /obj/item/shovel/spade = 1, + /obj/item/shovel = 1, ) result = /obj/item/shovel/serrated category = CAT_TOOLS @@ -46,3 +46,12 @@ ) result = /obj/item/pickaxe/improvised category = CAT_TOOLS + +/datum/crafting_recipe/bandage + name = "Makeshift Bandage" + reqs = list( + /obj/item/stack/sheet/cloth = 3, + /datum/reagent/medicine/c2/libital = 10, + ) + result = /obj/item/stack/medical/bandage/makeshift + category = CAT_TOOLS diff --git a/code/datums/components/crafting/weapon_ammo.dm b/code/datums/components/crafting/weapon_ammo.dm index 912c3358ee7b3..206adbaefb1c4 100644 --- a/code/datums/components/crafting/weapon_ammo.dm +++ b/code/datums/components/crafting/weapon_ammo.dm @@ -36,13 +36,12 @@ category = CAT_WEAPON_AMMO /datum/crafting_recipe/frag12 - name = "FRAG-12 Shell" + name = "FRAG-12 Slug Shell" result = /obj/item/ammo_casing/shotgun/frag12 reqs = list( /obj/item/ammo_casing/shotgun/techshell = 1, /datum/reagent/glycerol = 5, - /datum/reagent/toxin/acid = 5, - /datum/reagent/toxin/acid/fluacid = 5, + /datum/reagent/toxin/acid/fluacid = 10, ) tool_behaviors = list(TOOL_SCREWDRIVER) time = 0.5 SECONDS @@ -66,6 +65,7 @@ reqs = list( /obj/item/stack/sheet/iron = 2, /obj/item/stack/cable_coil = 1, + /obj/item/shard = 1, /datum/reagent/fuel = 10, ) tool_behaviors = list(TOOL_SCREWDRIVER) diff --git a/code/datums/components/crank_recharge.dm b/code/datums/components/crank_recharge.dm new file mode 100644 index 0000000000000..5c3c7aad24ed6 --- /dev/null +++ b/code/datums/components/crank_recharge.dm @@ -0,0 +1,59 @@ +// Cranking feature on the laser musket and smoothbore disabler, could probably be used on more than guns +/datum/component/crank_recharge + /// Our cell to charge + var/obj/item/stock_parts/cell/charging_cell + /// How much charge we give our cell on each crank + var/charge_amount + /// How long is the cooldown time between each charge + var/cooldown_time + /// The sound used when charging, renember to adjust the cooldown time to keep it sensible + var/charge_sound + /// How long is the cooldown between charging sounds + var/charge_sound_cooldown_time + /// Are we currently charging + var/is_charging = FALSE + COOLDOWN_DECLARE(charge_sound_cooldown) + +/datum/component/crank_recharge/Initialize(charging_cell, charge_amount = 500, cooldown_time = 2 SECONDS, charge_sound = 'sound/weapons/laser_crank.ogg', charge_sound_cooldown_time = 1.8 SECONDS) + . = ..() + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + if(isnull(charging_cell) || !istype(charging_cell, /obj/item/stock_parts/cell)) + return COMPONENT_INCOMPATIBLE + src.charging_cell = charging_cell + src.charge_amount = charge_amount + src.cooldown_time = cooldown_time + src.charge_sound = charge_sound + src.charge_sound_cooldown_time = charge_sound_cooldown_time + +/datum/component/crank_recharge/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(on_attack_self)) + +/datum/component/crank_recharge/UnregisterFromParent() + . = ..() + UnregisterSignal(parent, COMSIG_ITEM_ATTACK_SELF) + +/datum/component/crank_recharge/proc/on_attack_self(obj/source, mob/living/user as mob) + SIGNAL_HANDLER + + INVOKE_ASYNC(src, PROC_REF(crank), source, user) //game doesnt like signal handler and do afters mingling + +/datum/component/crank_recharge/proc/crank(obj/source, mob/user) + if(charging_cell.charge >= charging_cell.maxcharge) + source.balloon_alert(user, "already charged!") + return + if(is_charging) + return + is_charging = TRUE + if(COOLDOWN_FINISHED(src, charge_sound_cooldown)) + COOLDOWN_START(src, charge_sound_cooldown, charge_sound_cooldown_time) + playsound(source, charge_sound, 40) + source.balloon_alert(user, "charging...") + if(!do_after(user, cooldown_time, source, interaction_key = DOAFTER_SOURCE_CHARGE_CRANKRECHARGE)) + is_charging = FALSE + return + charging_cell.give(charge_amount) + source.update_appearance() + is_charging = FALSE + source.balloon_alert(user, "charged") diff --git a/code/datums/components/crate_carrier.dm b/code/datums/components/crate_carrier.dm index ce4081bd691b2..a36128b89e1ee 100644 --- a/code/datums/components/crate_carrier.dm +++ b/code/datums/components/crate_carrier.dm @@ -41,7 +41,7 @@ var/num_crates = LAZYLEN(crates_in_hand) if(num_crates > 0) - examine_list += span_notice("[source.p_theyre(TRUE)] carrying [num_crates == 1 ? "a crate":"[num_crates] crates"].") + examine_list += span_notice("[source.p_Theyre()] carrying [num_crates == 1 ? "a crate":"[num_crates] crates"].") /// Signal proc for [COMSIG_LIVING_UNARMED_ATTACK] to allow mobs to pick up or drop crates /datum/component/crate_carrier/proc/on_unarm_attack(mob/living/source, atom/target, proximity, modifiers) diff --git a/code/datums/components/creamed.dm b/code/datums/components/creamed.dm index 1201890b61ac0..d1c76b4759dba 100644 --- a/code/datums/components/creamed.dm +++ b/code/datums/components/creamed.dm @@ -10,63 +10,101 @@ GLOBAL_LIST_INIT(creamable, typecacheof(list( */ /datum/component/creamed dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS - - var/mutable_appearance/creamface + /// Creampie overlay we use for non-carbon mobs + var/mutable_appearance/normal_overlay + /// Creampie bodypart overlay we use for carbon mobs + var/datum/bodypart_overlay/simple/creampie/bodypart_overlay + /// Cached head for carbons, to ensure proper removal of the creampie overlay + var/obj/item/bodypart/my_head /datum/component/creamed/Initialize() if(!is_type_in_typecache(parent, GLOB.creamable)) return COMPONENT_INCOMPATIBLE - SEND_SIGNAL(parent, COMSIG_MOB_CREAMED) + SEND_SIGNAL(parent, COMSIG_MOB_CREAMED, src) add_memory_in_range(parent, 7, /datum/memory/witnessed_creampie, protagonist = parent) - creamface = mutable_appearance('icons/effects/creampie.dmi') +/datum/component/creamed/Destroy(force) + . = ..() + normal_overlay = null + my_head = null + QDEL_NULL(bodypart_overlay) - if(ishuman(parent)) - var/mob/living/carbon/human/H = parent - if(H.dna.species.bodytype & BODYTYPE_SNOUTED) - creamface.icon_state = "creampie_lizard" - else if(H.dna.species.bodytype & BODYTYPE_MONKEY) - creamface.icon_state = "creampie_monkey" +/datum/component/creamed/RegisterWithParent() + if(iscarbon(parent)) + var/mob/living/carbon/human/carbon_parent = parent + my_head = carbon_parent.get_bodypart(BODY_ZONE_HEAD) + if(!my_head) //just to be sure + qdel(src) + return + bodypart_overlay = new() + if(carbon_parent.bodytype & BODYTYPE_SNOUTED) //stupid, but external organ bodytypes are not stored on the limb + bodypart_overlay.icon_state = "creampie_lizard" + else if(my_head.bodytype & BODYTYPE_MONKEY) + bodypart_overlay.icon_state = "creampie_monkey" else - creamface.icon_state = "creampie_human" - H.add_mood_event("creampie", /datum/mood_event/creampie) + bodypart_overlay.icon_state = "creampie_human" + my_head.add_bodypart_overlay(bodypart_overlay) + RegisterSignals(my_head, list(COMSIG_BODYPART_REMOVED, COMSIG_QDELETING), PROC_REF(lost_head)) + carbon_parent.add_mood_event("creampie", /datum/mood_event/creampie) + carbon_parent.update_body_parts() else if(iscorgi(parent)) - creamface.icon_state = "creampie_corgi" + normal_overlay = mutable_appearance('icons/effects/creampie.dmi', "creampie_corgi") else if(isAI(parent)) - creamface.icon_state = "creampie_ai" - - var/atom/A = parent - A.add_overlay(creamface) - -/datum/component/creamed/Destroy(force, silent) - var/atom/A = parent - A.cut_overlay(creamface) - qdel(creamface) - if(ishuman(A)) - var/mob/living/carbon/human/human_parent = A - human_parent.clear_mood_event("creampie") - return ..() + normal_overlay = mutable_appearance('icons/effects/creampie.dmi', "creampie_ai") -/datum/component/creamed/RegisterWithParent() RegisterSignals(parent, list( COMSIG_COMPONENT_CLEAN_ACT, COMSIG_COMPONENT_CLEAN_FACE_ACT), PROC_REF(clean_up) ) + if(normal_overlay) + var/atom/atom_parent = parent + RegisterSignal(atom_parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(update_overlays)) + atom_parent.update_appearance() /datum/component/creamed/UnregisterFromParent() UnregisterSignal(parent, list( COMSIG_COMPONENT_CLEAN_ACT, COMSIG_COMPONENT_CLEAN_FACE_ACT)) + if(my_head) + if(bodypart_overlay) + my_head.remove_bodypart_overlay(bodypart_overlay) + if(!my_head.owner) + my_head.update_icon_dropped() + QDEL_NULL(bodypart_overlay) + UnregisterSignal(my_head, list(COMSIG_BODYPART_REMOVED, COMSIG_QDELETING)) + my_head = null + if(iscarbon(parent)) + var/mob/living/carbon/carbon_parent = parent + carbon_parent.clear_mood_event("creampie") + carbon_parent.update_body_parts() + if(normal_overlay) + var/atom/atom_parent = parent + UnregisterSignal(atom_parent, COMSIG_ATOM_UPDATE_OVERLAYS) + atom_parent.update_appearance() + normal_overlay = null ///Callback to remove pieface /datum/component/creamed/proc/clean_up(datum/source, clean_types) SIGNAL_HANDLER - . = NONE if(!(clean_types & CLEAN_TYPE_BLOOD)) - return + return NONE + qdel(src) return COMPONENT_CLEANED + +/// Ensures normal_overlay overlay in case the mob is not a carbon +/datum/component/creamed/proc/update_overlays(atom/parent_atom, list/overlays) + SIGNAL_HANDLER + + if(normal_overlay) + overlays += normal_overlay + +/// Removes creampie when the head gets dismembered +/datum/component/creamed/proc/lost_head(obj/item/bodypart/source, mob/living/carbon/owner, dismembered) + SIGNAL_HANDLER + + qdel(src) diff --git a/code/datums/components/cult_ritual_item.dm b/code/datums/components/cult_ritual_item.dm index fa13f4844d4a5..13d1ab8d921c5 100644 --- a/code/datums/components/cult_ritual_item.dm +++ b/code/datums/components/cult_ritual_item.dm @@ -47,7 +47,7 @@ /datum/component/cult_ritual_item/RegisterWithParent() RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(try_scribe_rune)) RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(try_purge_holywater)) - RegisterSignal(parent, COMSIG_ITEM_ATTACK_OBJ, PROC_REF(try_hit_object)) + RegisterSignal(parent, COMSIG_ITEM_ATTACK_ATOM, PROC_REF(try_hit_object)) RegisterSignal(parent, COMSIG_ITEM_ATTACK_EFFECT, PROC_REF(try_clear_rune)) if(examine_message) @@ -57,7 +57,7 @@ UnregisterSignal(parent, list( COMSIG_ITEM_ATTACK_SELF, COMSIG_ITEM_ATTACK, - COMSIG_ITEM_ATTACK_OBJ, + COMSIG_ITEM_ATTACK_ATOM, COMSIG_ITEM_ATTACK_EFFECT, COMSIG_ATOM_EXAMINE, )) @@ -115,7 +115,7 @@ INVOKE_ASYNC(src, PROC_REF(do_purge_holywater), target, user) /* - * Signal proc for [COMSIG_ITEM_ATTACK_OBJ]. + * Signal proc for [COMSIG_ITEM_ATTACK_ATOM]. * Allows the ritual items to unanchor cult buildings or destroy rune girders. */ /datum/component/cult_ritual_item/proc/try_hit_object(datum/source, obj/structure/target, mob/cultist) @@ -304,7 +304,7 @@ ) if(cultist.blood_volume) - cultist.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM), wound_bonus = CANT_WOUND) // *cuts arm* *bone explodes* ever have one of those days? + cultist.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE, pick(GLOB.arm_zones), wound_bonus = CANT_WOUND) // *cuts arm* *bone explodes* ever have one of those days? var/scribe_mod = initial(rune_to_scribe.scribe_delay) if(!initial(rune_to_scribe.no_scribe_boost) && (our_turf.type in turfs_that_boost_us)) diff --git a/code/datums/components/curse_of_polymorph.dm b/code/datums/components/curse_of_polymorph.dm new file mode 100644 index 0000000000000..bbfb6c842e302 --- /dev/null +++ b/code/datums/components/curse_of_polymorph.dm @@ -0,0 +1,36 @@ +/** + * curse of polymorph component; + * + * Used as a rpgloot suffix and wizard spell! + */ +/datum/component/curse_of_polymorph + var/polymorph_type + +/datum/component/curse_of_polymorph/Initialize(polymorph_type) + . = ..() + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + src.polymorph_type = polymorph_type + +/datum/component/curse_of_polymorph/RegisterWithParent() + . = ..() + var/obj/item/cursed_item = parent + RegisterSignal(cursed_item, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip)) + +/datum/component/curse_of_polymorph/UnregisterFromParent() + . = ..() + UnregisterSignal(parent, list( + COMSIG_ITEM_EQUIPPED, + )) + +///signal called from equipping parent +/datum/component/curse_of_polymorph/proc/on_equip(datum/source, mob/living/equipper, slot) + SIGNAL_HANDLER + var/obj/item/polymorpher_item = parent + // Items with no slot flags curse on pickup (because hand slot) + if(polymorpher_item.slot_flags && !(polymorpher_item.slot_flags & slot)) + return + ASYNC + equipper.dropItemToGround(polymorpher_item, TRUE) + equipper.wabbajack(polymorph_type) + diff --git a/code/datums/components/customizable_reagent_holder.dm b/code/datums/components/customizable_reagent_holder.dm index 79ebf651d3fa2..36c84fc94afd3 100644 --- a/code/datums/components/customizable_reagent_holder.dm +++ b/code/datums/components/customizable_reagent_holder.dm @@ -2,7 +2,7 @@ * # Custom Atom Component * * When added to an atom, item ingredients can be put into that. - * The sprite is updated and reagents are transfered. + * The sprite is updated and reagents are transferred. * * If the component is added to something that is processed, creating new objects (being cut, for example), * the replacement type needs to also have the component. The ingredients will be copied over. Reagents are not diff --git a/code/datums/components/damage_aura.dm b/code/datums/components/damage_aura.dm index 2438eca8d7918..6eec1903eefc8 100644 --- a/code/datums/components/damage_aura.dm +++ b/code/datums/components/damage_aura.dm @@ -91,14 +91,16 @@ /// What effect the damage aura has if it has an owner. /datum/component/damage_aura/proc/owner_effect(mob/living/owner_mob, seconds_per_tick) - owner_mob.adjustStaminaLoss(-20 * seconds_per_tick, updating_stamina = FALSE) - owner_mob.adjustBruteLoss(-1 * seconds_per_tick, updating_health = FALSE) - owner_mob.adjustFireLoss(-1 * seconds_per_tick, updating_health = FALSE) - owner_mob.adjustToxLoss(-1 * seconds_per_tick, updating_health = FALSE, forced = TRUE) - owner_mob.adjustOxyLoss(-1 * seconds_per_tick, updating_health = FALSE) + var/need_mob_update = FALSE + need_mob_update += owner_mob.adjustStaminaLoss(-20 * seconds_per_tick, updating_stamina = FALSE) + need_mob_update += owner_mob.adjustBruteLoss(-1 * seconds_per_tick, updating_health = FALSE) + need_mob_update += owner_mob.adjustFireLoss(-1 * seconds_per_tick, updating_health = FALSE) + need_mob_update += owner_mob.adjustToxLoss(-1 * seconds_per_tick, updating_health = FALSE, forced = TRUE) + need_mob_update += owner_mob.adjustOxyLoss(-1 * seconds_per_tick, updating_health = FALSE) if (owner_mob.blood_volume < BLOOD_VOLUME_NORMAL) owner_mob.blood_volume += 2 * seconds_per_tick - owner_mob.updatehealth() + if(need_mob_update) + owner_mob.updatehealth() /datum/component/damage_aura/process(seconds_per_tick) var/should_show_effect = COOLDOWN_FINISHED(src, last_damage_effect_time) diff --git a/code/datums/components/deadchat_control.dm b/code/datums/components/deadchat_control.dm index 145b64c00dedb..48096e4767064 100644 --- a/code/datums/components/deadchat_control.dm +++ b/code/datums/components/deadchat_control.dm @@ -51,6 +51,7 @@ ckey_to_cooldown = null if(generated_point_of_interest) SSpoints_of_interest.remove_point_of_interest(parent) + on_removal = null return ..() /datum/component/deadchat_control/proc/deadchat_react(mob/source, message) @@ -190,7 +191,7 @@ if(!isobserver(user)) return - examine_list += span_notice("[A.p_theyre(TRUE)] currently under deadchat control using the [(deadchat_mode & DEMOCRACY_MODE) ? "democracy" : "anarchy"] ruleset!") + examine_list += span_notice("[A.p_Theyre()] currently under deadchat control using the [(deadchat_mode & DEMOCRACY_MODE) ? "democracy" : "anarchy"] ruleset!") if(deadchat_mode & DEMOCRACY_MODE) examine_list += span_notice("Type a command into chat to vote on an action. This happens once every [input_cooldown * 0.1] second\s.") diff --git a/code/datums/components/death_linked.dm b/code/datums/components/death_linked.dm new file mode 100644 index 0000000000000..c20c810019564 --- /dev/null +++ b/code/datums/components/death_linked.dm @@ -0,0 +1,30 @@ +/** + * ## Death link component + * + * When the owner of this component dies it also gibs a linked mob + */ +/datum/component/death_linked + ///The mob that also dies when the user dies + var/datum/weakref/linked_mob + +/datum/component/death_linked/Initialize(mob/living/target_mob) + . = ..() + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + if(isnull(target_mob)) + stack_trace("[type] added to [parent] with no linked mob.") + src.linked_mob = WEAKREF(target_mob) + +/datum/component/death_linked/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_LIVING_DEATH, PROC_REF(on_death)) + +/datum/component/death_linked/UnregisterFromParent() + . = ..() + UnregisterSignal(parent, COMSIG_LIVING_DEATH) + +///signal called by the stat of the target changing +/datum/component/death_linked/proc/on_death(mob/living/target, gibbed) + SIGNAL_HANDLER + var/mob/living/linked_mob_resolved = linked_mob?.resolve() + linked_mob_resolved?.gib(DROP_ALL_REMAINS) diff --git a/code/datums/components/deployable.dm b/code/datums/components/deployable.dm index 7a5e798b337c6..e2c6b84703e46 100644 --- a/code/datums/components/deployable.dm +++ b/code/datums/components/deployable.dm @@ -10,15 +10,18 @@ /datum/component/deployable /// The time it takes to deploy the object - var/deploy_time = 5 SECONDS + var/deploy_time /// The object that gets spawned if deployed successfully var/obj/thing_to_be_deployed + /// If the item used to deploy gets deleted on use or not + var/delete_on_use + /// If the component adds a little bit into the parent's description + var/add_description_hint + /// Used in getting the name of the deployed object var/deployed_name - /// If the item used to deploy gets deleted on use or not - var/delete_on_use = TRUE -/datum/component/deployable/Initialize(deploy_time, thing_to_be_deployed, delete_on_use) +/datum/component/deployable/Initialize(deploy_time = 5 SECONDS, thing_to_be_deployed, delete_on_use = TRUE, add_description_hint = TRUE) . = ..() if(!isitem(parent)) return COMPONENT_INCOMPATIBLE @@ -26,8 +29,10 @@ src.deploy_time = deploy_time src.thing_to_be_deployed = thing_to_be_deployed src.delete_on_use = delete_on_use + src.add_description_hint = add_description_hint - RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(examine)) + if(add_description_hint) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(examine)) RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(on_attack_hand)) var/obj/item/typecast = thing_to_be_deployed diff --git a/code/datums/components/echolocation.dm b/code/datums/components/echolocation.dm index 9d32744359d4e..63891a160fac1 100644 --- a/code/datums/components/echolocation.dm +++ b/code/datums/components/echolocation.dm @@ -173,7 +173,7 @@ layer = ECHO_LAYER show_when_dead = TRUE -/atom/movable/screen/fullscreen/echo/Initialize(mapload) +/atom/movable/screen/fullscreen/echo/Initialize(mapload, datum/hud/hud_owner) . = ..() particles = new /particles/echo() diff --git a/code/datums/components/effect_remover.dm b/code/datums/components/effect_remover.dm index dd5544297fb1d..7f1f437eddfc2 100644 --- a/code/datums/components/effect_remover.dm +++ b/code/datums/components/effect_remover.dm @@ -14,6 +14,8 @@ var/datum/callback/on_clear_callback /// A typecache of all effects we can clear with our item. var/list/obj/effect/effects_we_clear + /// If above 0, how long it takes while standing still to remove the effect. + var/time_to_remove = 0 SECONDS /datum/component/effect_remover/Initialize( success_forcesay, @@ -21,6 +23,7 @@ tip_text, on_clear_callback, effects_we_clear, + time_to_remove, ) . = ..() @@ -36,9 +39,10 @@ src.tip_text = tip_text src.on_clear_callback = on_clear_callback src.effects_we_clear = typecacheof(effects_we_clear) + src.time_to_remove = time_to_remove /datum/component/effect_remover/Destroy(force, silent) - QDEL_NULL(on_clear_callback) + on_clear_callback = null return ..() /datum/component/effect_remover/RegisterWithParent() @@ -69,6 +73,9 @@ * Actually removes the effect, invoking our on_clear_callback before it's deleted. */ /datum/component/effect_remover/proc/do_remove_effect(obj/effect/target, mob/living/user) + if(time_to_remove && !do_after(user, time_to_remove, target)) + return + var/obj/item/item_parent = parent if(success_forcesay) user.say(success_forcesay, forced = item_parent.name) diff --git a/code/datums/components/egg_layer.dm b/code/datums/components/egg_layer.dm index 7aceb7bd55d1a..a1e137de6d323 100644 --- a/code/datums/components/egg_layer.dm +++ b/code/datums/components/egg_layer.dm @@ -50,6 +50,7 @@ /datum/component/egg_layer/Destroy(force, silent) . = ..() STOP_PROCESSING(SSobj, src) + egg_laid_callback = null /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 e49befeff0685..f4d7b5d7369c8 100644 --- a/code/datums/components/embedded.dm +++ b/code/datums/components/embedded.dm @@ -93,7 +93,8 @@ 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! + if (limb.can_bleed()) + weapon.add_mob_blood(victim)//it embedded itself in you, of course it's bloody! damage += weapon.w_class * impact_pain_mult victim.add_mood_event("embedded", /datum/mood_event/embedded) @@ -165,7 +166,7 @@ var/mob/living/carbon/victim = parent var/chance = jostle_chance - if(victim.m_intent == MOVE_INTENT_WALK || victim.body_position == LYING_DOWN) + if(victim.move_intent == MOVE_INTENT_WALK || victim.body_position == LYING_DOWN) chance *= 0.5 if(harmful && prob(chance)) @@ -206,14 +207,18 @@ qdel(src) return if(harmful) - var/damage = weapon.w_class * remove_pain_mult - limb.receive_damage(brute=(1-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.adjustStaminaLoss(pain_stam_pct * damage) - victim.emote("scream") + damaging_removal(victim, I, 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) +/// Proc that actually does the damage associated with ripping something out of yourself. Call this before safeRemove. +/datum/component/embedded/proc/damaging_removal(mob/living/carbon/victim, obj/item/removed, obj/item/bodypart/limb, ouch_multiplier = 1) + var/damage = weapon.w_class * remove_pain_mult * ouch_multiplier + limb.receive_damage(brute=(1-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.adjustStaminaLoss(pain_stam_pct * damage) + victim.emote("scream") + /// 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) @@ -248,7 +253,7 @@ /datum/component/embedded/proc/checkTweeze(mob/living/carbon/victim, obj/item/possible_tweezers, mob/user) SIGNAL_HANDLER - if(!istype(victim) || possible_tweezers.tool_behaviour != TOOL_HEMOSTAT || user.zone_selected != limb.body_zone) + if(!istype(victim) || (possible_tweezers.tool_behaviour != TOOL_HEMOSTAT && possible_tweezers.tool_behaviour != TOOL_WIRECUTTER) || 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 @@ -265,18 +270,21 @@ /// 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) + // quality of the tool we're using + var/tweezer_speed = possible_tweezers.toolspeed + // is this an actual piece of medical equipment + var/tweezer_safe = (possible_tweezers.tool_behaviour == TOOL_HEMOSTAT) + var/pluck_time = rip_time * (weapon.w_class * 0.3) * (self_pluck ? 1.5 : 1) * tweezer_speed * (tweezer_safe ? 1 : 1.5) 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]..."),\ + user.visible_message(span_danger("[user] begins plucking [weapon] from [user.p_their()] [limb.plaintext_zone] with [possible_tweezers]..."), span_notice("You start plucking [weapon] from your [limb.plaintext_zone] with [possible_tweezers]... (It will take [DisplayTimeText(pluck_time)].)"),\ vision_distance=COMBAT_MESSAGE_RANGE, ignored_mobs=victim) 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]..."), \ + user.visible_message(span_danger("[user] begins plucking [weapon] from [victim]'s [limb.plaintext_zone] with [possible_tweezers]..."),span_notice("You start plucking [weapon] from [victim]'s [limb.plaintext_zone] with [possible_tweezers]... (It will take [DisplayTimeText(pluck_time)]."), \ vision_distance=COMBAT_MESSAGE_RANGE, ignored_mobs=victim) - to_chat(victim, span_userdanger("[user] begins plucking [weapon] from your [limb.plaintext_zone]...")) + to_chat(victim, span_userdanger("[user] begins plucking [weapon] from your [limb.plaintext_zone] with [possible_tweezers]... (It will take [DisplayTimeText(pluck_time)].")) - var/pluck_time = 2.5 SECONDS * weapon.w_class * (self_pluck ? 2 : 1) if(!do_after(user, pluck_time, victim)) if(self_pluck) to_chat(user, span_danger("You fail to pluck [weapon] from your [limb.plaintext_zone].")) @@ -285,8 +293,11 @@ to_chat(victim, span_danger("[user] fails to pluck [weapon] from your [limb.plaintext_zone].")) 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].")) + to_chat(user, span_notice("You successfully pluck [weapon] from [victim]'s [limb.plaintext_zone][tweezer_safe ? "." : ", but hurt [victim.p_them()] in the process."]")) + to_chat(victim, span_notice("[user] plucks [weapon] from your [limb.plaintext_zone][tweezer_safe ? "." : ", but it's not perfect."]")) + if(!tweezer_safe) + // sure it still hurts but it sucks less + damaging_removal(victim, weapon, limb, (0.4 * possible_tweezers.w_class)) safeRemove(user) /// Called when an object is ripped out of someone's body by magic or other abnormal means @@ -303,7 +314,7 @@ return var/damage = weapon.w_class * remove_pain_mult limb.receive_damage(brute=(1-pain_stam_pct) * damage * 1.5, sharpness=SHARP_EDGED) // Performs exit wounds and flings the user to the caster if nearby - limb.force_wound_upwards(/datum/wound/pierce/moderate) + victim.cause_wound_of_type_and_severity(WOUND_PIERCE, limb, WOUND_SEVERITY_MODERATE) victim.adjustStaminaLoss(pain_stam_pct * damage) playsound(get_turf(victim), 'sound/effects/wounds/blood2.ogg', 50, TRUE) diff --git a/code/datums/components/explodable.dm b/code/datums/components/explodable.dm index 31d78b45d5686..7ebb112d30537 100644 --- a/code/datums/components/explodable.dm +++ b/code/datums/components/explodable.dm @@ -31,7 +31,7 @@ RegisterSignal(parent, COMSIG_MOVABLE_IMPACT, PROC_REF(explodable_impact)) RegisterSignal(parent, COMSIG_MOVABLE_BUMP, PROC_REF(explodable_bump)) if(isitem(parent)) - RegisterSignals(parent, list(COMSIG_ITEM_ATTACK, COMSIG_ITEM_ATTACK_OBJ, COMSIG_ITEM_HIT_REACT), PROC_REF(explodable_attack)) + RegisterSignals(parent, list(COMSIG_ITEM_ATTACK, COMSIG_ITEM_ATTACK_ATOM, COMSIG_ITEM_HIT_REACT), PROC_REF(explodable_attack)) if(isclothing(parent)) RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip)) RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_drop)) diff --git a/code/datums/components/fantasy/_fantasy.dm b/code/datums/components/fantasy/_fantasy.dm index 164d97aefd460..98796d52bc1be 100644 --- a/code/datums/components/fantasy/_fantasy.dm +++ b/code/datums/components/fantasy/_fantasy.dm @@ -14,19 +14,21 @@ ///affixes expects an initialized list /datum/component/fantasy/Initialize(quality, list/affixes = list(), canFail=FALSE, announce=FALSE) - if(!isitem(parent)) + if(!isitem(parent) || HAS_TRAIT(parent, TRAIT_INNATELY_FANTASTICAL_ITEM)) return COMPONENT_INCOMPATIBLE - src.quality = quality || randomQuality() + src.quality = quality + if(isnull(src.quality)) + src.quality = random_quality() src.canFail = canFail src.announce = announce src.affixes = affixes appliedComponents = list() if(affixes && affixes.len) - setAffixes() + set_affixes() else - randomAffixes() + random_affixes() /datum/component/fantasy/Destroy() unmodify() @@ -37,6 +39,11 @@ var/obj/item/master = parent originalName = master.name modify() + RegisterSignal(parent, COMSIG_STACK_CAN_MERGE, PROC_REF(try_merge_stack)) + +/datum/component/fantasy/proc/try_merge_stack(obj/item/stack/to_merge, in_hand) + SIGNAL_HANDLER + return CANCEL_STACK_MERGE /datum/component/fantasy/UnregisterFromParent() unmodify() @@ -53,14 +60,20 @@ src.announce = announce || src.announce modify() -/datum/component/fantasy/proc/randomQuality() +/datum/component/fantasy/proc/random_quality() var/quality = pick(1;15, 2;14, 2;13, 2;12, 3;11, 3;10, 3;9, 4;8, 4;7, 4;6, 5;5, 5;4, 5;3, 6;2, 6;1, 6;0) if(prob(50)) quality = -quality return quality ///proc on creation for random affixes -/datum/component/fantasy/proc/randomAffixes(force) +/datum/component/fantasy/proc/random_affixes(force) + var/alignment + if(quality >= 0) + alignment |= AFFIX_GOOD + if(quality <= 0) + alignment |= AFFIX_EVIL + if(!affixListing) affixListing = list() for(var/T in subtypesof(/datum/fantasy_affix)) @@ -72,12 +85,6 @@ return affixes = list() - var/alignment - if(quality >= 0) - alignment |= AFFIX_GOOD - if(quality <= 0) - alignment |= AFFIX_EVIL - var/usedSlots = NONE for(var/i in 1 to max(1, abs(quality))) // We want at least 1 affix applied var/datum/fantasy_affix/affix = pick_weight(affixListing) @@ -91,7 +98,7 @@ usedSlots |= affix.placement ///proc on creation for specific affixes given to the fantasy component -/datum/component/fantasy/proc/setAffixes(force) +/datum/component/fantasy/proc/set_affixes(force) var/usedSlots = NONE for(var/datum/fantasy_affix/affix in affixes) // We want at least 1 affix applied if((affix.placement & usedSlots) || (!affix.validate(parent))) @@ -101,12 +108,7 @@ /datum/component/fantasy/proc/modify() var/obj/item/master = parent - - master.force = max(0, master.force + quality) - master.throwforce = max(0, master.throwforce + quality) - master.set_armor(master.get_armor().generate_new_with_modifiers(list(ARMOR_ALL = quality))) - master.wound_bonus += quality - master.bare_wound_bonus += quality + master.apply_fantasy_bonuses(quality) var/newName = originalName for(var/i in affixes) @@ -121,10 +123,10 @@ place.visible_message(span_danger("[parent] [span_blue("violently glows blue")] for a while, then evaporates.")) master.burn() return - else if(announce) - announce() master.name = newName + if(announce) + announce() /datum/component/fantasy/proc/unmodify() var/obj/item/master = parent @@ -133,12 +135,7 @@ var/datum/fantasy_affix/affix = i affix.remove(src) QDEL_LIST(appliedComponents) - - master.force = max(0, master.force - quality) - master.throwforce = max(0, master.throwforce - quality) - master.set_armor(master.get_armor().generate_new_with_modifiers(list(ARMOR_ALL = -quality))) - master.wound_bonus -= quality - master.bare_wound_bonus -= quality + master.remove_fantasy_bonuses(quality) master.name = originalName @@ -153,4 +150,4 @@ span = "" effect_description = span_bold("mottled black glow") - location.visible_message("[span][originalName] is covered by a [effect_description] and then transforms into [parent]!") + location.visible_message("[span]The [originalName] is covered by a [effect_description] and then transforms into [parent]!") diff --git a/code/datums/components/fantasy/prefixes.dm b/code/datums/components/fantasy/prefixes.dm index 8ac9aa0cef804..cd80a1143130a 100644 --- a/code/datums/components/fantasy/prefixes.dm +++ b/code/datums/components/fantasy/prefixes.dm @@ -145,7 +145,6 @@ var/obj/item/master = comp.parent master.RemoveElement(/datum/element/venomous) - /datum/fantasy_affix/soul_stealer name = "soul-stealing" placement = AFFIX_PREFIX diff --git a/code/datums/components/fantasy/suffixes.dm b/code/datums/components/fantasy/suffixes.dm index 4e38d61b0d183..c8809efae491a 100644 --- a/code/datums/components/fantasy/suffixes.dm +++ b/code/datums/components/fantasy/suffixes.dm @@ -42,9 +42,16 @@ /datum/fantasy_affix/cosmetic_suffixes/apply(datum/component/fantasy/comp, newName) if(comp.quality > 0 || (comp.quality == 0 && prob(50))) - return "[newName] of [pick(goodSuffixes)]" + . = "[newName] of [pick(goodSuffixes)]" + if(comp.quality >= 10) + START_PROCESSING(SSprocessing, src) + if(comp.quality >= 15) + comp.parent.AddComponent(/datum/component/unusual_effect, color = "#FFEA0030", include_particles = TRUE) + else + comp.parent.AddComponent(/datum/component/unusual_effect, color = "#FFBF0030") else - return "[newName] of [pick(badSuffixes)]" + . = "[newName] of [pick(badSuffixes)]" + return . //////////// Good suffixes /datum/fantasy_affix/bane @@ -189,11 +196,13 @@ name = "curse of hunger" placement = AFFIX_SUFFIX alignment = AFFIX_EVIL + weight = 5 /datum/fantasy_affix/curse_of_hunger/validate(obj/item/attached) - //curse of hunger that attaches onto food has the ability to eat itself. it's hilarious. - if(!IS_EDIBLE(attached)) - return TRUE + // Curse of hunger can be really unbearable to deal with, + // so it should not start on someone or in a bag. + if(!isturf(attached.loc)) + return FALSE return TRUE /datum/fantasy_affix/curse_of_hunger/apply(datum/component/fantasy/comp, newName) @@ -201,10 +210,64 @@ var/obj/item/master = comp.parent var/filter_color = "#8a0c0ca1" //clarified args var/new_name = pick(", eternally hungry", " of the glutton", " cursed with hunger", ", consumer of all", " of the feast") - master.AddElement(/datum/element/curse_announcement, "[master] is cursed with the curse of hunger!", filter_color, new_name, comp) + master.AddElement(/datum/element/curse_announcement, "[master] is cursed with the curse of hunger!", filter_color, "", comp) comp.appliedComponents += master.AddComponent(/datum/component/curse_of_hunger) - return newName //no spoilers! + return "[newName][new_name]" /datum/fantasy_affix/curse_of_hunger/remove(datum/component/fantasy/comp) var/obj/item/master = comp.parent master.RemoveElement(/datum/element/curse_announcement) //just in case + +/datum/fantasy_affix/curse_of_polymorph + name = "curse of polymorph" + placement = AFFIX_SUFFIX + alignment = AFFIX_EVIL + +/datum/fantasy_affix/curse_of_polymorph/validate(obj/item/attached) + // Don't start on someone so that it doesn't immediately polymorph them. + if(ismob(attached.loc)) + return FALSE + if(!isclothing(attached)) + return FALSE + return TRUE + +/datum/fantasy_affix/curse_of_polymorph/apply(datum/component/fantasy/comp, newName) + . = ..() + var/obj/item/master = comp.parent + var/filter_color = "#800080a1" //clarified args + var/new_name = pick(", transforming", " of the polymorph", " cursed with polymorphing", ", changer of all", " of changing") + var/static/list/possible_results = list( + WABBAJACK_MONKEY, + WABBAJACK_ROBOT, + WABBAJACK_SLIME, + WABBAJACK_XENO, + WABBAJACK_HUMAN, + WABBAJACK_ANIMAL, + ) + master.AddElement(/datum/element/curse_announcement, "[master] is cursed with the curse of polymorph!", filter_color, "", comp) + comp.appliedComponents += master.AddComponent(/datum/component/curse_of_polymorph, pick(possible_results)) + return "[newName][new_name]" + +/datum/fantasy_affix/curse_of_polymorph/remove(datum/component/fantasy/comp) + var/obj/item/master = comp.parent + master.RemoveElement(/datum/element/curse_announcement) //just in case + +/datum/fantasy_affix/speed + name = "of speed" + placement = AFFIX_SUFFIX + alignment = AFFIX_GOOD + +/datum/fantasy_affix/speed/validate(obj/item/attached) + if(!istype(attached, /obj/item/clothing/shoes)) + return FALSE + return TRUE + +/datum/fantasy_affix/speed/apply(datum/component/fantasy/comp, newName) + . = ..() + var/obj/item/master = comp.parent + master.slowdown = min(-comp.quality / 5, master.slowdown) + return "[newName] of speed" + +/datum/fantasy_affix/speed/remove(datum/component/fantasy/comp) + var/obj/item/master = comp.parent + master.slowdown = initial(master.slowdown) diff --git a/code/datums/components/fishing_spot.dm b/code/datums/components/fishing_spot.dm index a43aef04906b3..f88c27a713530 100644 --- a/code/datums/components/fishing_spot.dm +++ b/code/datums/components/fishing_spot.dm @@ -11,16 +11,11 @@ //Use passed in instance fish_source = configuration else - /// Check if it's a preset key - var/datum/fish_source/preset_configuration = GLOB.preset_fish_sources[configuration] - if(!preset_configuration) - stack_trace("Invalid fishing spot configuration \"[configuration]\" passed down to fishing spot component.") - return COMPONENT_INCOMPATIBLE - fish_source = preset_configuration + return COMPONENT_INCOMPATIBLE + fish_source.on_fishing_spot_init() RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(handle_attackby)) RegisterSignal(parent, COMSIG_FISHING_ROD_CAST, PROC_REF(handle_cast)) - /datum/component/fishing_spot/proc/handle_cast(datum/source, obj/item/fishing_rod/rod, mob/user) SIGNAL_HANDLER if(try_start_fishing(rod,user)) @@ -51,14 +46,6 @@ /datum/component/fishing_spot/proc/start_fishing_challenge(obj/item/fishing_rod/rod, mob/user) /// Roll what we caught based on modified table var/result = fish_source.roll_reward(rod, user) - var/datum/fishing_challenge/challenge = new(parent, result, rod, user) - challenge.background = fish_source.background - challenge.difficulty = fish_source.calculate_difficulty(result, rod, user) - RegisterSignal(challenge, COMSIG_FISHING_CHALLENGE_COMPLETED, PROC_REF(fishing_completed)) + var/datum/fishing_challenge/challenge = new(src, result, rod, user) + fish_source.pre_challenge_started(rod, user, challenge) challenge.start(user) - -/datum/component/fishing_spot/proc/fishing_completed(datum/fishing_challenge/source, mob/user, success, perfect) - if(success) - var/obj/item/fish/caught = source.reward_path - user.add_mob_memory(/datum/memory/caught_fish, protagonist = user, deuteragonist = initial(caught.name)) - fish_source.dispense_reward(source.reward_path, user) diff --git a/code/datums/components/focused_attacker.dm b/code/datums/components/focused_attacker.dm new file mode 100644 index 0000000000000..eda6bd1797912 --- /dev/null +++ b/code/datums/components/focused_attacker.dm @@ -0,0 +1,71 @@ +/** + * Increases our attack damage every time we attack the same target + * Not compatible with any other component or status effect which modifies attack damage + */ +/datum/component/focused_attacker + /// Amount of damage we gain per attack + var/gain_per_attack + /// Maximum amount by which we can increase our attack power + var/maximum_gain + /// The last thing we attacked + var/atom/last_target + +/datum/component/focused_attacker/Initialize(gain_per_attack = 5, maximum_gain = 25) + . = ..() + if (!isliving(parent) && !isitem(parent)) + return COMPONENT_INCOMPATIBLE + src.maximum_gain = maximum_gain + src.gain_per_attack = gain_per_attack + +/datum/component/focused_attacker/Destroy(force, silent) + if (!isnull(last_target)) + UnregisterSignal(last_target, COMSIG_QDELETING) + return ..() + +/datum/component/focused_attacker/RegisterWithParent() + if (isliving(parent)) + RegisterSignals(parent, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HUMAN_MELEE_UNARMED_ATTACK), PROC_REF(pre_mob_attack)) + else + RegisterSignal(parent, COMSIG_ITEM_PRE_ATTACK, PROC_REF(pre_item_attack)) + +/datum/component/focused_attacker/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_ITEM_PRE_ATTACK)) + +/// Before a mob attacks, try increasing its attack power +/datum/component/focused_attacker/proc/pre_mob_attack(mob/living/attacker, atom/target) + SIGNAL_HANDLER + if (isnull(target) || isturf(target)) + return + if (target == last_target) + if (attacker.melee_damage_lower - initial(attacker.melee_damage_lower) >= maximum_gain) + return + attacker.melee_damage_lower += gain_per_attack + attacker.melee_damage_upper += gain_per_attack + return + + attacker.melee_damage_lower = initial(attacker.melee_damage_lower) + attacker.melee_damage_upper = initial(attacker.melee_damage_upper) + register_new_target(target) + +/// Before an item attacks, try increasing its attack power +/datum/component/focused_attacker/proc/pre_item_attack(obj/item/weapon, atom/target, mob/user, params) + SIGNAL_HANDLER + if (target == last_target) + if (weapon.force - initial(weapon.force) < maximum_gain) + weapon.force += gain_per_attack + return + + weapon.force = initial(weapon.force) + register_new_target(target) + +/// Register a new target +/datum/component/focused_attacker/proc/register_new_target(atom/target) + if (!isnull(last_target)) + UnregisterSignal(last_target, COMSIG_QDELETING) + last_target = target + RegisterSignal(target, COMSIG_QDELETING, PROC_REF(on_target_deleted)) + +/// Drop our target ref on deletion +/datum/component/focused_attacker/proc/on_target_deleted(target) + SIGNAL_HANDLER + last_target = null diff --git a/code/datums/components/food/decomposition.dm b/code/datums/components/food/decomposition.dm index ee5c8e22f1bc3..a3850ab39a6bc 100644 --- a/code/datums/components/food/decomposition.dm +++ b/code/datums/components/food/decomposition.dm @@ -4,27 +4,34 @@ #define DECOMPOSITION_TIME_RAW (5 MINUTES) #define DECOMPOSITION_TIME_GROSS (7 MINUTES) +///Makes things decompose when exposed to germs. Requires /datum/component/germ_sensitive to detect exposure. /datum/component/decomposition dupe_mode = COMPONENT_DUPE_UNIQUE /// Makes sure maploaded food only starts decomposing if a player's EVER picked it up before var/handled = TRUE /// Used to stop food in someone's hand & in storage slots from decomposing. var/protected = FALSE - /// Used to stop the timer & check for the examine proc - var/timerid /// The total time that this takes to decompose var/original_time = DECOMPOSITION_TIME /// Used so the timer won't reset. var/time_remaining = DECOMPOSITION_TIME + /// Used to create stink lines when the food is close to going bad + var/stink_timerid + /// Used to stop decomposition & check for the examine proc + var/decomp_timerid /// Used to give raw/gross food lower timers var/decomp_flags /// Use for determining what kind of item the food decomposes into. var/decomp_result /// Does our food attract ants? var/produce_ants = FALSE + /// Stink particle type, if we are supposed to create stink particles + var/stink_particles + /// Stink particle holder + var/obj/effect/abstract/particle_holder/particle_effect -/datum/component/decomposition/Initialize(mapload, decomp_req_handle, decomp_flags = NONE, decomp_result, ant_attracting = FALSE, custom_time = 0) - if(!isobj(parent)) +/datum/component/decomposition/Initialize(mapload, decomp_req_handle, decomp_flags = NONE, decomp_result, ant_attracting = FALSE, custom_time = 0, stink_particles = /particles/stink) + if(!ismovable(parent) || !HAS_TRAIT(parent, TRAIT_GERM_SENSITIVE)) return COMPONENT_INCOMPATIBLE src.decomp_flags = decomp_flags @@ -33,17 +40,6 @@ handled = FALSE src.produce_ants = ant_attracting - RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(handle_movement)) - RegisterSignals(parent, list( - COMSIG_ITEM_PICKUP, //person picks up an item - COMSIG_ATOM_ENTERED), //Object enters a storage object (boxes, etc.) - PROC_REF(picked_up)) - RegisterSignals(parent, list( - COMSIG_ITEM_DROPPED, //Object is dropped anywhere - COMSIG_ATOM_EXITED), //Object exits a storage object (boxes, etc) - PROC_REF(dropped)) - RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(examine)) - if(custom_time) // We have a custom decomposition time, set it to that original_time = custom_time else if(decomp_flags & RAW) // Raw food overrides gross @@ -53,37 +49,41 @@ time_remaining = original_time - handle_movement() + src.stink_particles = stink_particles + +/datum/component/decomposition/Destroy() + . = ..() + if(particle_effect) + QDEL_NULL(particle_effect) +/datum/component/decomposition/RegisterWithParent() + RegisterSignal(parent, COMSIG_ATOM_GERM_EXPOSED, PROC_REF(start_timer)) + RegisterSignal(parent, COMSIG_ATOM_GERM_UNEXPOSED, PROC_REF(remove_timer)) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(examine)) /datum/component/decomposition/UnregisterFromParent() UnregisterSignal(parent, list( - COMSIG_ITEM_PICKUP, - COMSIG_ATOM_ENTERED, - COMSIG_MOVABLE_MOVED, - COMSIG_ITEM_DROPPED, - COMSIG_ATOM_EXITED, - COMSIG_ATOM_EXAMINE)) - -/datum/component/decomposition/proc/handle_movement() + COMSIG_ATOM_GERM_EXPOSED, + COMSIG_ATOM_GERM_UNEXPOSED, + COMSIG_ATOM_EXAMINE + )) + +/datum/component/decomposition/proc/start_timer() SIGNAL_HANDLER + if(!handled) // If maploaded, has someone touched this previously? + handled = TRUE // First germ exposure is ignored return - var/obj/food = parent // Doesn't HAVE to be food, that's just what it's intended for - var/turf/open/open_turf = food.loc + // If all other checks fail, then begin decomposition. + decomp_timerid = addtimer(CALLBACK(src, PROC_REF(decompose)), time_remaining, TIMER_STOPPABLE | TIMER_UNIQUE) - if(!istype(open_turf) || islava(open_turf) || isasteroidturf(open_turf)) //Are we actually in a valid open turf? - remove_timer() + // Also start the stinking timer, if have stink particles and aren't stinking yet + if(!stink_particles || particle_effect) return - for(var/atom/movable/content as anything in open_turf.contents) - if(GLOB.typecache_elevated_structures[content.type]) - remove_timer() - return - - // If all other checks fail, then begin decomposition. - timerid = addtimer(CALLBACK(src, PROC_REF(decompose)), time_remaining, TIMER_STOPPABLE | TIMER_UNIQUE) + var/stink_time = max(0, time_remaining - (original_time * 0.5)) + stink_timerid = addtimer(CALLBACK(src, PROC_REF(stink_up)), stink_time, TIMER_STOPPABLE | TIMER_UNIQUE) /datum/component/decomposition/Destroy() remove_timer() @@ -91,36 +91,37 @@ /// Returns the time remaining in decomp, either from our potential timer or our own value, whichever is more useful /datum/component/decomposition/proc/get_time() - if(!timerid) + if(!decomp_timerid) return time_remaining - return timeleft(timerid) + return timeleft(decomp_timerid) /datum/component/decomposition/proc/remove_timer() - if(!timerid) + if(!decomp_timerid) return - time_remaining = timeleft(timerid) - deltimer(timerid) - timerid = null - -/datum/component/decomposition/proc/dropped() - SIGNAL_HANDLER - protected = FALSE - handle_movement() + time_remaining = timeleft(decomp_timerid) + deltimer(decomp_timerid) + decomp_timerid = null + if(!stink_timerid) + return + deltimer(stink_timerid) + stink_timerid = null -/datum/component/decomposition/proc/picked_up() - SIGNAL_HANDLER - remove_timer() - protected = TRUE - if(!handled) - handled = TRUE +/datum/component/decomposition/proc/stink_up() + stink_timerid = null + // Neither should happen, but to be sure + if(particle_effect || !stink_particles) + return + // we don't want stink lines on mobs (even though it'd be quite funny) + particle_effect = new(parent, stink_particles, isitem(parent) ? NONE : PARTICLE_ATTACH_MOB) /datum/component/decomposition/proc/decompose() + decomp_timerid = null var/obj/decomp = parent //Lets us spawn things at decomp if(produce_ants) new /obj/effect/decal/cleanable/ants(decomp.loc) if(decomp_result) new decomp_result(decomp.loc) - decomp.visible_message("[decomp] gets overtaken by mold[produce_ants ? " and ants":""]! Gross!") + decomp.visible_message(span_warning("[decomp] gets overtaken by mold[produce_ants ? " and ants":""]! Gross!")) qdel(decomp) return diff --git a/code/datums/components/food/edible.dm b/code/datums/components/food/edible.dm index 9068ce4b934f0..7c86ddc22437b 100644 --- a/code/datums/components/food/edible.dm +++ b/code/datums/components/food/edible.dm @@ -46,7 +46,7 @@ Behavior that's still missing from this component that original food items had t food_flags = NONE, foodtypes = NONE, volume = 50, - eat_time = 10, + eat_time = 1 SECONDS, list/tastes, list/eatverbs = list("bite", "chew", "nibble", "gnaw", "gobble", "chomp"), bite_consumption = 2, @@ -54,6 +54,7 @@ Behavior that's still missing from this component that original food items had t datum/callback/after_eat, datum/callback/on_consume, datum/callback/check_liked, + reagent_purity = 0.5, ) if(!isatom(parent)) return COMPONENT_INCOMPATIBLE @@ -70,7 +71,7 @@ Behavior that's still missing from this component that original food items had t src.tastes = string_assoc_list(tastes) src.check_liked = check_liked - setup_initial_reagents(initial_reagents) + setup_initial_reagents(initial_reagents, reagent_purity) /datum/component/edible/RegisterWithParent() RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(examine)) @@ -187,13 +188,13 @@ Behavior that's still missing from this component that original food items had t setup_initial_reagents(initial_reagents) /datum/component/edible/Destroy(force, silent) - QDEL_NULL(after_eat) - QDEL_NULL(on_consume) - QDEL_NULL(check_liked) + after_eat = null + on_consume = null + check_liked = null return ..() /// Sets up the initial reagents of the food. -/datum/component/edible/proc/setup_initial_reagents(list/reagents) +/datum/component/edible/proc/setup_initial_reagents(list/reagents, reagent_purity) var/atom/owner = parent if(owner.reagents) owner.reagents.maximum_volume = volume @@ -203,31 +204,63 @@ Behavior that's still missing from this component that original food items had t for(var/rid in reagents) var/amount = 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(), added_purity = reagent_purity) else - owner.reagents.add_reagent(rid, amount) + owner.reagents.add_reagent(rid, amount, added_purity = reagent_purity) /datum/component/edible/proc/examine(datum/source, mob/user, list/examine_list) SIGNAL_HANDLER + var/atom/owner = parent + if(foodtypes) var/list/types = bitfield_to_list(foodtypes, FOOD_FLAGS) examine_list += span_notice("It is [lowertext(english_list(types))].") + var/quality = get_perceived_food_quality(user) + if(quality > 0) + var/quality_label = GLOB.food_quality_description[quality] + examine_list += span_green("You find this meal [quality_label].") + else if (quality == 0) + examine_list += span_notice("You find this meal edible.") + else if (quality <= TOXIC_FOOD_QUALITY_THRESHOLD) + examine_list += span_warning("You find this meal disgusting!") + else + examine_list += span_warning("You find this meal inedible.") + + if(owner.reagents.total_volume > 0) + var/purity = owner.reagents.get_average_purity(/datum/reagent/consumable) + switch(purity) + if(0 to 0.2) + examine_list += span_warning("It is made of terrible ingredients shortening the effect...") + if(0.2 to 0.4) + examine_list += span_warning("It is made of synthetic ingredients shortening the effect.") + if(0.4 to 0.6) + examine_list += span_notice("It is made of average quality ingredients.") + if(0.6 to 0.8) + examine_list += span_green("It is made of organic ingredients prolonging the effect.") + if(0.8 to 1) + examine_list += span_green("It is made of finest ingredients prolonging the effect!") + var/datum/mind/mind = user.mind - if(mind && HAS_TRAIT_FROM(parent, TRAIT_FOOD_CHEF_MADE, REF(mind))) - examine_list += span_green("[parent] was made by you!") + if(mind && HAS_TRAIT_FROM(owner, TRAIT_FOOD_CHEF_MADE, REF(mind))) + examine_list += span_green("[owner] was made by you!") if(!(food_flags & FOOD_IN_CONTAINER)) switch(bitecount) if(0) // pass if(1) - examine_list += span_notice("[parent] was bitten by someone!") + examine_list += span_notice("[owner] was bitten by someone!") if(2, 3) - examine_list += span_notice("[parent] was bitten [bitecount] times!") + examine_list += span_notice("[owner] was bitten [bitecount] times!") else - examine_list += span_notice("[parent] was bitten multiple times!") + examine_list += span_notice("[owner] was bitten multiple times!") + + if(GLOB.Debug2) + examine_list += span_notice("Reagent purities:") + for(var/datum/reagent/reagent as anything in owner.reagents.reagent_list) + examine_list += span_notice("- [reagent.name] [reagent.volume]u: [round(reagent.purity * 100)]% pure") /datum/component/edible/proc/UseFromHand(obj/item/source, mob/living/M, mob/living/user) SIGNAL_HANDLER @@ -267,15 +300,11 @@ Behavior that's still missing from this component that original food items had t var/atom/this_food = parent - this_food.reagents.multiply_reagents(CRAFTED_FOOD_BASE_REAGENT_MODIFIER) - this_food.reagents.maximum_volume *= CRAFTED_FOOD_BASE_REAGENT_MODIFIER - for(var/obj/item/food/crafted_part in parts_list) if(!crafted_part.reagents) continue - - this_food.reagents.maximum_volume += crafted_part.reagents.maximum_volume * CRAFTED_FOOD_INGREDIENT_REAGENT_MODIFIER - crafted_part.reagents.trans_to(this_food.reagents, crafted_part.reagents.maximum_volume, CRAFTED_FOOD_INGREDIENT_REAGENT_MODIFIER) + this_food.reagents.maximum_volume += crafted_part.reagents.maximum_volume + crafted_part.reagents.trans_to(this_food.reagents, crafted_part.reagents.maximum_volume) this_food.reagents.maximum_volume = ROUND_UP(this_food.reagents.maximum_volume) // Just because I like whole numbers for this. @@ -323,7 +352,7 @@ Behavior that's still missing from this component that original food items had t time_to_eat *= (fullness / NUTRITION_LEVEL_FAT) * EAT_TIME_VORACIOUS_FULL_MULT // takes longer to eat the more well fed you are if(eater == feeder)//If you're eating it yourself. - if(eat_time && !do_after(feeder, time_to_eat, eater, timed_action_flags = food_flags & FOOD_FINGER_FOOD ? IGNORE_USER_LOC_CHANGE | IGNORE_TARGET_LOC_CHANGE : NONE)) //Gotta pass the minimal eat time + if(eat_time > 0 && !do_after(feeder, time_to_eat, eater, timed_action_flags = food_flags & FOOD_FINGER_FOOD ? IGNORE_USER_LOC_CHANGE | IGNORE_TARGET_LOC_CHANGE : NONE)) //Gotta pass the minimal eat time return if(IsFoodGone(owner, feeder)) return @@ -404,7 +433,7 @@ Behavior that's still missing from this component that original food items had t TakeBite(eater, feeder) //If we're not force-feeding and there's an eat delay, try take another bite - if(eater == feeder && eat_time) + if(eater == feeder && eat_time > 0) INVOKE_ASYNC(src, PROC_REF(TryToEat), eater, feeder) #undef EAT_TIME_FORCE_FEED @@ -428,10 +457,17 @@ Behavior that's still missing from this component that original food items had t if(sig_return & DESTROY_FOOD) qdel(owner) return + + //Give a buff when the dish is hand-crafted and unbitten + if(bitecount == 0) + apply_buff(eater) + var/fraction = min(bite_consumption / owner.reagents.total_volume, 1) - owner.reagents.trans_to(eater, bite_consumption, transfered_by = feeder, methods = INGEST) + owner.reagents.trans_to(eater, bite_consumption, transferred_by = feeder, methods = INGEST) bitecount++ + checkLiked(fraction, eater) + if(!owner.reagents.total_volume) On_Consume(eater, feeder) @@ -459,65 +495,111 @@ Behavior that's still missing from this component that original food items had t else if(C.is_mouth_covered(ITEM_SLOT_MASK)) covered = "mask" if(covered) - var/who = (isnull(feeder) || eater == feeder) ? "your" : "[eater.p_their()]" - to_chat(feeder, span_warning("You have to remove [who] [covered] first!")) + eater.balloon_alert(feeder, "mouth is covered!") return FALSE if(SEND_SIGNAL(eater, COMSIG_CARBON_ATTEMPT_EAT, parent) & COMSIG_CARBON_BLOCK_EAT) return return TRUE +///Applies food buffs according to the crafting complexity +/datum/component/edible/proc/apply_buff(mob/eater) + var/buff + var/recipe_complexity = get_recipe_complexity() + if(recipe_complexity == 0) + return + var/obj/item/food/food = parent + if(!isnull(food.crafted_food_buff)) + buff = food.crafted_food_buff + else + buff = pick_weight(GLOB.food_buffs[recipe_complexity]) + if(!isnull(buff)) + var/mob/living/living_eater = eater + var/atom/owner = parent + var/timeout_mod = owner.reagents.get_average_purity(/datum/reagent/consumable) * 2 // buff duration is 100% at average purity of 50% + var/strength = recipe_complexity + living_eater.apply_status_effect(buff, timeout_mod, strength) + ///Check foodtypes to see if we should send a moodlet -/datum/component/edible/proc/checkLiked(fraction, mob/M) +/datum/component/edible/proc/checkLiked(fraction, mob/eater) if(last_check_time + 50 > world.time) return FALSE - if(!ishuman(M)) + if(!ishuman(eater)) return FALSE - var/mob/living/carbon/human/H = M - + var/mob/living/carbon/human/gourmand = eater //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) - H.add_mood_event("breakfast", /datum/mood_event/breakfast) + gourmand.add_mood_event("breakfast", /datum/mood_event/breakfast) last_check_time = world.time - if(HAS_TRAIT(H, TRAIT_AGEUSIA)) - if(foodtypes & H.dna.species.toxic_food) - to_chat(H, span_warning("You don't feel so good...")) - H.adjust_disgust(25 + 30 * fraction) - return // Don't care about the later checks if user has ageusia + var/food_quality = get_perceived_food_quality(gourmand, parent) + if(food_quality <= TOXIC_FOOD_QUALITY_THRESHOLD) + to_chat(gourmand,span_warning("What the hell was that thing?!")) + gourmand.adjust_disgust(25 + 30 * fraction) + gourmand.add_mood_event("toxic_food", /datum/mood_event/disgusting_food) + else if(food_quality < 0) + to_chat(gourmand,span_notice("That didn't taste very good...")) + gourmand.adjust_disgust(11 + 15 * fraction) + gourmand.add_mood_event("gross_food", /datum/mood_event/gross_food) + else if(food_quality > 0) + food_quality = min(food_quality, FOOD_QUALITY_TOP) + var/atom/owner = parent + var/timeout_mod = owner.reagents.get_average_purity(/datum/reagent/consumable) * 2 // mood event duration is 100% at average purity of 50% + var/event = GLOB.food_quality_events[food_quality] + gourmand.add_mood_event("quality_food", event, timeout_mod) + gourmand.adjust_disgust(-5 + -2 * food_quality * fraction) + var/quality_label = GLOB.food_quality_description[food_quality] + to_chat(gourmand, span_notice("That's \an [quality_label] meal.")) + + if(istype(parent, /obj/item/food)) + var/obj/item/food/food = parent + if(food.venue_value >= FOOD_PRICE_EXOTIC) + gourmand.add_mob_memory(/datum/memory/good_food, food = parent) + +/// Get the complexity of the crafted food +/datum/component/edible/proc/get_recipe_complexity() + if(!HAS_TRAIT(parent, TRAIT_FOOD_CHEF_MADE) || !istype(parent, /obj/item/food)) + return 0 // It is factory made. Soulless. + var/obj/item/food/food = parent + return food.crafting_complexity + +/// Get food quality adjusted according to eater's preferences +/datum/component/edible/proc/get_perceived_food_quality(mob/living/carbon/human/eater) + var/food_quality = get_recipe_complexity() - var/food_taste_reaction + if(HAS_TRAIT(parent, TRAIT_FOOD_SILVER)) // it's not real food + if(!isjellyperson(eater)) //if you aren't a jellyperson, it makes you sick no matter how nice it looks + return TOXIC_FOOD_QUALITY_THRESHOLD + food_quality += LIKED_FOOD_QUALITY_CHANGE if(check_liked) //Callback handling; use this as an override for special food like donuts - food_taste_reaction = check_liked.Invoke(fraction, H) - - if(!food_taste_reaction) - if(foodtypes & H.dna.species.toxic_food) - food_taste_reaction = FOOD_TOXIC - else if(foodtypes & H.dna.species.disliked_food) - food_taste_reaction = FOOD_DISLIKED - else if(foodtypes & H.dna.species.liked_food) - food_taste_reaction = FOOD_LIKED - - if(HAS_TRAIT(parent, TRAIT_FOOD_SILVER)) // it's not real food - food_taste_reaction = isjellyperson(H) ? FOOD_LIKED : FOOD_TOXIC - - switch(food_taste_reaction) - if(FOOD_TOXIC) - to_chat(H,span_warning("What the hell was that thing?!")) - H.adjust_disgust(25 + 30 * fraction) - H.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) - H.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) - H.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) - H.add_mob_memory(/datum/memory/good_food, food = parent) + var/special_reaction = check_liked.Invoke(eater) + switch(special_reaction) //return early for special foods + if(FOOD_LIKED) + return LIKED_FOOD_QUALITY_CHANGE + if(FOOD_DISLIKED) + return DISLIKED_FOOD_QUALITY_CHANGE + if(FOOD_TOXIC) + return TOXIC_FOOD_QUALITY_THRESHOLD + + if(ishuman(eater)) + if(count_matching_foodtypes(foodtypes, eater.get_toxic_foodtypes())) //if the food is toxic, we don't care about anything else + return TOXIC_FOOD_QUALITY_THRESHOLD + if(HAS_TRAIT(eater, TRAIT_AGEUSIA)) //if you can't taste it, it doesn't taste good + return 0 + food_quality += DISLIKED_FOOD_QUALITY_CHANGE * count_matching_foodtypes(foodtypes, eater.get_disliked_foodtypes()) + food_quality += LIKED_FOOD_QUALITY_CHANGE * count_matching_foodtypes(foodtypes, eater.get_liked_foodtypes()) + + return food_quality + +/// Get the number of matching food types in provided bitfields +/datum/component/edible/proc/count_matching_foodtypes(bitfield_one, bitfield_two) + var/count = 0 + var/matching_bits = bitfield_one & bitfield_two + while (matching_bits > 0) + if (matching_bits & 1) + count++ + matching_bits >>= 1 + return count ///Delete the item when it is fully eaten /datum/component/edible/proc/On_Consume(mob/living/eater, mob/living/feeder) @@ -536,10 +618,8 @@ Behavior that's still missing from this component that original food items had t ///Ability to feed food to puppers /datum/component/edible/proc/UseByAnimal(datum/source, mob/user) - SIGNAL_HANDLER - var/atom/owner = parent if(!isdog(user)) @@ -579,7 +659,7 @@ Behavior that's still missing from this component that original food items had t if(foodtypes & edible_flags) var/atom/eaten_food = parent - eaten_food.reagents.trans_to(eater, eaten_food.reagents.total_volume, transfered_by = eater) + eaten_food.reagents.trans_to(eater, eaten_food.reagents.total_volume, transferred_by = eater) eater.visible_message(span_warning("[src] eats [eaten_food]!"), span_notice("You eat [eaten_food].")) playsound(get_turf(eater),'sound/items/eatfood.ogg', rand(30,50), TRUE) qdel(eaten_food) diff --git a/code/datums/components/food/germ_sensitive.dm b/code/datums/components/food/germ_sensitive.dm new file mode 100644 index 0000000000000..22ba793c1ce3a --- /dev/null +++ b/code/datums/components/food/germ_sensitive.dm @@ -0,0 +1,124 @@ +// Don't eat off the floor or hold parent object with dirty hands, you'll get sick + +/// Time needed for bacteria to infect the parent object +#define GERM_EXPOSURE_DELAY (5 SECONDS) // Five-second rule + +/// Possible diseases +GLOBAL_LIST_INIT(floor_diseases, list( + /datum/disease/advance/nebula_nausea = 2, + /datum/disease/advance/gastritium = 2, + /datum/disease/advance/carpellosis = 1, +)) + +/// Makes items infective if left on floor, also sending corresponding signals to parent +/datum/component/germ_sensitive + /// Timer for counting delay before becoming infective + var/timer_id + /// Whether it is already infective + var/infective = FALSE + +/datum/component/germ_sensitive/Initialize(mapload) + if(!isobj(parent)) + return COMPONENT_INCOMPATIBLE + + ADD_TRAIT(parent, TRAIT_GERM_SENSITIVE, REF(src)) + + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(examine)) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(handle_movement)) + RegisterSignal(parent, COMSIG_ATOM_WASHED, PROC_REF(wash)) //Wash germs off dirty things + + RegisterSignals(parent, list( + COMSIG_ITEM_DROPPED, //Dropped into the world + COMSIG_ATOM_EXITED, //Object exits a storage object (tables, boxes, etc) + ), + PROC_REF(dropped)) + + RegisterSignals(parent, list( + COMSIG_ITEM_PICKUP, //Picked up by mob + COMSIG_ATOM_ENTERED, //Object enters a storage object (tables, boxes, etc.) + ), + PROC_REF(picked_up)) + + // Map spawned items are protected until moved + if(!mapload) + handle_movement() + +/datum/component/germ_sensitive/UnregisterFromParent() + REMOVE_TRAIT(parent, TRAIT_GERM_SENSITIVE, REF(src)) + UnregisterSignal(parent, list( + COMSIG_ATOM_EXAMINE, + COMSIG_MOVABLE_MOVED, + COMSIG_ATOM_WASHED, + COMSIG_ITEM_DROPPED, + COMSIG_ATOM_EXITED, + COMSIG_ITEM_PICKUP, + COMSIG_ATOM_ENTERED, + )) + +/datum/component/germ_sensitive/Destroy() + remove_timer() + return ..() + +/datum/component/germ_sensitive/proc/remove_timer() + if(!timer_id) + return + deltimer(timer_id) + timer_id = null + +/datum/component/germ_sensitive/proc/handle_movement() + SIGNAL_HANDLER + + var/obj/parent_object = parent + var/turf/open/open_turf = parent_object.loc + + // Is parent on valid open turf? + if(!istype(open_turf) || islava(open_turf) || isasteroidturf(open_turf) || !parent_object.has_gravity()) + remove_timer() + SEND_SIGNAL(parent, COMSIG_ATOM_GERM_UNEXPOSED, src) + return + + // Is parent on an elevated structure? + for(var/atom/movable/content as anything in open_turf.contents) + if(GLOB.typecache_elevated_structures[content.type]) + remove_timer() + SEND_SIGNAL(parent, COMSIG_ATOM_GERM_UNEXPOSED, src) + return + + // Exposed to bacteria, start countdown until becoming infected + timer_id = addtimer(CALLBACK(src, PROC_REF(expose_to_germs)), GERM_EXPOSURE_DELAY, TIMER_STOPPABLE | TIMER_UNIQUE) + +/datum/component/germ_sensitive/proc/picked_up() + SIGNAL_HANDLER + SEND_SIGNAL(parent, COMSIG_ATOM_GERM_UNEXPOSED, src) + remove_timer() + +/datum/component/germ_sensitive/proc/dropped() + SIGNAL_HANDLER + handle_movement() + +/datum/component/germ_sensitive/proc/examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + if(infective) + examine_list += span_warning("[parent] looks dirty and not safe to consume.") + +/datum/component/germ_sensitive/proc/expose_to_germs() + // Admin spawned items are never exposed + var/atom/parent_atom = parent + if(parent_atom.flags_1 & ADMIN_SPAWNED_1) + return + + SEND_SIGNAL(parent, COMSIG_ATOM_GERM_EXPOSED, src) + + if(infective) + return + infective = TRUE + + var/random_disease = pick_weight(GLOB.floor_diseases) + parent.AddComponent(/datum/component/infective, new random_disease, weak = TRUE) + +/datum/component/germ_sensitive/proc/wash() + if(infective) + infective = FALSE + qdel(parent.GetComponent(/datum/component/infective)) + +#undef GERM_EXPOSURE_DELAY diff --git a/code/datums/components/food/ghost_edible.dm b/code/datums/components/food/ghost_edible.dm new file mode 100644 index 0000000000000..25207800a7426 --- /dev/null +++ b/code/datums/components/food/ghost_edible.dm @@ -0,0 +1,59 @@ +/** + * Allows ghosts to eat this by orbiting it + * They do this by consuming the reagents in the object, so if it doesn't have any then it won't work + */ +/datum/component/ghost_edible + /// Amount of reagents which will be consumed by each bite + var/bite_consumption + /// Chance per ghost that a bite will be taken + var/bite_chance + /// Minimum size the food will display as before being deleted + var/minimum_scale + /// How many reagents this had on initialisation, used to figure out how eaten we are + var/initial_reagent_volume = 0 + +/datum/component/ghost_edible/Initialize(bite_consumption = 3, bite_chance = 20, minimum_scale = 0.6) + . = ..() + if (!isatom(parent)) + return COMPONENT_INCOMPATIBLE + var/atom/atom_parent = parent + if (isnull(atom_parent.reagents) || atom_parent.reagents.total_volume == 0) + return COMPONENT_INCOMPATIBLE + src.bite_consumption = bite_consumption + src.bite_chance = bite_chance + src.minimum_scale = minimum_scale + initial_reagent_volume = atom_parent.reagents.total_volume + notify_ghosts("[parent] is edible by ghosts!", source = parent, action = NOTIFY_ORBIT, header="Something Tasty!") + +/datum/component/ghost_edible/RegisterWithParent() + START_PROCESSING(SSdcs, src) + +/datum/component/ghost_edible/UnregisterFromParent() + STOP_PROCESSING(SSdcs, src) + +/datum/component/ghost_edible/Destroy(force, silent) + STOP_PROCESSING(SSdcs, src) + return ..() + +/datum/component/ghost_edible/process(seconds_per_tick) + var/atom/atom_parent = parent + // Ghosts can eat this burger + var/munch_chance = 0 + for(var/mob/dead/observer/ghost in atom_parent.orbiters?.orbiter_list) + munch_chance += bite_chance + if (munch_chance >= 100) + break + if (!prob(munch_chance)) + return + playsound(atom_parent.loc,'sound/items/eatfood.ogg', vol = rand(10,50), vary = TRUE) + atom_parent.reagents.remove_any(bite_consumption) + if (atom_parent.reagents.total_volume <= 0) + atom_parent.visible_message(span_notice("[atom_parent] disappears completely!")) + new /obj/item/ectoplasm(atom_parent.loc) + qdel(parent) + return + + var/final_transform = matrix().Scale(LERP(minimum_scale, 1, atom_parent.reagents.total_volume / initial_reagent_volume)) + var/animate_transform = matrix(final_transform).Scale(0.8) + animate(parent, transform = animate_transform, time = 0.1 SECONDS) + animate(transform = final_transform, time = 0.1 SECONDS) diff --git a/code/datums/components/food/golem_food.dm b/code/datums/components/food/golem_food.dm index 818bb555a388b..c2540f54cc1cb 100644 --- a/code/datums/components/food/golem_food.dm +++ b/code/datums/components/food/golem_food.dm @@ -31,7 +31,8 @@ /datum/component/golem_food/Destroy(force, silent) QDEL_NULL(golem_snack) - QDEL_NULL(extra_validation) + snack_type = null + extra_validation = null return ..() /// Attempt to feed this item to golem @@ -43,20 +44,24 @@ source.balloon_alert(user, "not edible!") return COMPONENT_CANCEL_ATTACK_CHAIN if (!snack_type.can_consume(target)) - source.balloon_alert(user, "incompatible mineral!") + source.balloon_alert(user, "can't consume!") return COMPONENT_CANCEL_ATTACK_CHAIN - if (!golem_snack) - golem_snack = new( - /* loc = */ null, - /* name = */ source.name, - /* consume_food = */ consume_on_eat, - /* food_buff = */ snack_type, - /* owner = */ parent, - ) - RegisterSignal(golem_snack, COMSIG_QDELETING, PROC_REF(on_food_destroyed)) + if (isnull(golem_snack)) + create_golem_snack(source) golem_snack.attack(target, user, click_parameters) return COMPONENT_CANCEL_ATTACK_CHAIN +/// Creates our golem snack atom instance +/datum/component/golem_food/proc/create_golem_snack(atom/source) + golem_snack = new(null) + golem_snack.setup( + name = source.name, + consume_food = consume_on_eat, + food_buff = snack_type, + owner = parent, + ) + RegisterSignal(golem_snack, COMSIG_QDELETING, PROC_REF(on_food_destroyed)) + /// Reference handling for abstract food object /datum/component/golem_food/proc/on_food_destroyed() SIGNAL_HANDLER @@ -83,13 +88,17 @@ /// Golem food buff to apply on consumption var/datum/golem_food_buff/food_buff -/obj/item/food/golem_food/Initialize(mapload, name, consume_food, datum/golem_food_buff/food_buff, atom/owner) - . = ..() +/// Set up some properties based on a passed-in item that the golem will pretend to eat +/obj/item/food/golem_food/proc/setup( + name, + consume_food = TRUE, + datum/golem_food_buff/food_buff, + atom/owner, +) src.name = name src.consume_food = consume_food src.food_buff = food_buff src.owner = owner - RegisterSignal(owner, COMSIG_QDELETING, PROC_REF(on_parent_destroyed)) /// Clean ourselves up if our parent dies diff --git a/code/datums/components/food/ice_cream_holder.dm b/code/datums/components/food/ice_cream_holder.dm index 09e5002db3d5d..3e212c52b9a04 100644 --- a/code/datums/components/food/ice_cream_holder.dm +++ b/code/datums/components/food/ice_cream_holder.dm @@ -33,14 +33,16 @@ var/datum/reagent/sweetener -/datum/component/ice_cream_holder/Initialize(max_scoops = DEFAULT_MAX_ICE_CREAM_SCOOPS, - change_name = TRUE, - filled_name, - change_desc = FALSE, - x_offset = 0, - y_offset = 0, - datum/reagent/sweetener = /datum/reagent/consumable/sugar, - list/prefill_flavours) +/datum/component/ice_cream_holder/Initialize( + max_scoops = DEFAULT_MAX_ICE_CREAM_SCOOPS, + change_name = TRUE, + filled_name, + change_desc = FALSE, + x_offset = 0, + y_offset = 0, + datum/reagent/sweetener = /datum/reagent/consumable/sugar, + list/prefill_flavours, +) if(!IS_EDIBLE(parent)) /// There is no easy way to add servings to those non-item edibles, but I won't stop you. return COMPONENT_INCOMPATIBLE @@ -54,7 +56,7 @@ src.y_offset = y_offset src.sweetener = sweetener - RegisterSignal(owner, COMSIG_ITEM_ATTACK_OBJ, PROC_REF(on_item_attack_obj)) + RegisterSignal(owner, COMSIG_ITEM_ATTACK_ATOM, PROC_REF(on_item_attack_obj)) RegisterSignal(owner, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_update_overlays)) if(change_name) RegisterSignal(owner, COMSIG_ATOM_UPDATE_NAME, PROC_REF(on_update_name)) @@ -114,11 +116,11 @@ var/key = scoops[1] var/datum/ice_cream_flavour/flavour = GLOB.ice_cream_flavours[LAZYACCESS(special_scoops, key) || key] if(flavour?.desc) //I scream. - examine_list += "[source.p_theyre(TRUE)] filled with scoops of [flavour ? flavour.name : "broken, unhappy"] icecream." + examine_list += "[source.p_Theyre()] filled with scoops of [flavour ? flavour.name : "broken, unhappy"] icecream." else - examine_list += replacetext(replacetext("[source.p_theyre(TRUE)] [flavour.desc]", "$CONE_NAME", initial(source.name)), "$CUSTOM_NAME", key) + examine_list += replacetext(replacetext("[source.p_Theyre()] [flavour.desc]", "$CONE_NAME", initial(source.name)), "$CUSTOM_NAME", key) else /// Many flavours. - examine_list += "[source.p_theyre(TRUE)] filled with scoops of [english_list(scoops)] icecream. That's as many as [scoops_len] scoops!" + examine_list += "[source.p_Theyre()] filled with scoops of [english_list(scoops)] icecream. That's as many as [scoops_len] scoops!" /datum/component/ice_cream_holder/proc/on_update_overlays(atom/source, list/new_overlays) SIGNAL_HANDLER @@ -128,7 +130,7 @@ for(var/i in 1 to length(scoop_overlays)) var/image/overlay = scoop_overlays[i] if(istext(overlay)) - overlay = image('icons/obj/kitchen.dmi', overlay) + overlay = image('icons/obj/service/kitchen.dmi', overlay) overlay.pixel_x = x_offset overlay.pixel_y = y_offset + added_offset new_overlays += overlay @@ -169,7 +171,7 @@ if(compare_list(our_scoops, icecream_order.wanted_flavors)) return COMPONENT_CORRECT_ORDER -/datum/component/ice_cream_holder/proc/sell_ice_cream(obj/item/source, mob/living/simple_animal/robot_customer/sold_to) +/datum/component/ice_cream_holder/proc/sell_ice_cream(obj/item/source, mob/living/basic/robot_customer/sold_to) SIGNAL_HANDLER //the price of ice cream scales with the number of scoops. Yummy. @@ -199,8 +201,8 @@ GLOBAL_LIST_INIT_TYPED(ice_cream_flavours, /datum/ice_cream_flavour, init_ice_cr /datum/ice_cream_flavour /// Make sure the same name is not found on other types; These are singletons keyed by their name after all. var/name = "Coderlicious Gourmet Double Deluxe Undefined" - /// The icon state of the flavour, overlay or not. - var/icon_state = "icecream_vanilla" + /// The colour of the ice cream for non-custom flavours. + var/color = COLOR_ICECREAM_VANILLA /* * The fluff text sent to the examiner when the snack has only one flavour of ice cream. * $CONE_NAME and $CUSTOM_NAME are both placeholders for the cone and the custom ice cream name respectively. @@ -230,8 +232,10 @@ GLOBAL_LIST_INIT_TYPED(ice_cream_flavours, /datum/ice_cream_flavour, init_ice_cr /datum/ice_cream_flavour/proc/add_flavour(datum/component/ice_cream_holder/target, datum/reagents/R, custom_name) var/atom/owner = target.parent LAZYADD(target.scoops, custom_name || name) - if(icon_state) - LAZYADD(target.scoop_overlays, icon_state) + if(color) + var/image/flavoring = image('icons/obj/service/kitchen.dmi', "icecream_custom") + flavoring.color = color + LAZYADD(target.scoop_overlays, flavoring) if(custom_name) LAZYSET(target.special_scoops, custom_name, name) @@ -258,28 +262,75 @@ GLOBAL_LIST_INIT_TYPED(ice_cream_flavours, /datum/ice_cream_flavour, init_ice_cr /datum/ice_cream_flavour/chocolate name = ICE_CREAM_CHOCOLATE - icon_state = "icecream_chocolate" + color = COLOR_ICECREAM_CHOCOLATE desc = "filled with chocolate ice cream. Surprisingly, made with real cocoa." ingredients = list(/datum/reagent/consumable/milk, /datum/reagent/consumable/ice, /datum/reagent/consumable/coco) reagent_type = /datum/reagent/consumable/coco /datum/ice_cream_flavour/strawberry name = ICE_CREAM_STRAWBERRY - icon_state = "icecream_strawberry" + color = COLOR_ICECREAM_STRAWBERRY desc = "filled with strawberry ice cream. Definitely not made with real strawberries." ingredients = list(/datum/reagent/consumable/milk, /datum/reagent/consumable/ice, /datum/reagent/consumable/berryjuice) reagent_type = /datum/reagent/consumable/berryjuice /datum/ice_cream_flavour/blue name = ICE_CREAM_BLUE - icon_state = "icecream_blue" + color = COLOR_ICECREAM_BLUE desc = "filled with blue ice cream. Made with real... blue?" ingredients = list(/datum/reagent/consumable/milk, /datum/reagent/consumable/ice, /datum/reagent/consumable/ethanol/singulo) reagent_type = /datum/reagent/consumable/ethanol/singulo +/datum/ice_cream_flavour/lemon + name = ICE_CREAM_LEMON + color = COLOR_ICECREAM_LEMON + desc = "filled with lemon sorbet. Like frozen lemonade in a cone." + ingredients = list(/datum/reagent/consumable/ice, /datum/reagent/consumable/lemonjuice) //contains no milk + reagent_type = /datum/reagent/consumable/lemonjuice + +/datum/ice_cream_flavour/caramel + name = ICE_CREAM_CARAMEL + color = COLOR_ICECREAM_CARAMEL + desc = "filled with caramel ice cream. It is deliciously sweet." + ingredients = list(/datum/reagent/consumable/milk, /datum/reagent/consumable/ice, /datum/reagent/consumable/caramel) + reagent_type = /datum/reagent/consumable/caramel + +/datum/ice_cream_flavour/banana + name = ICE_CREAM_BANANA + color = COLOR_YELLOW + desc = "filled with banana ice cream. Honk!" + ingredients = list(/datum/reagent/consumable/milk, /datum/reagent/consumable/ice, /datum/reagent/consumable/banana) + reagent_type = /datum/reagent/consumable/banana + +/datum/ice_cream_flavour/orange_cream + name = ICE_CREAM_ORANGE_CREAM + color = COLOR_ICECREAM_ORANGESICLE + desc = "filled with orange creamsicle. Not quite the same off the stick..." + ingredients = list(/datum/reagent/consumable/cream, /datum/reagent/consumable/ice, /datum/reagent/consumable/orangejuice) + reagent_type = /datum/reagent/consumable/orangejuice + +/datum/ice_cream_flavour/peach + name = ICE_CREAM_PEACH + color = COLOR_ICECREAM_PEACH + desc = "filled with limited edition peach flavour. Enjoy it while it lasts!" + ingredients = list(/datum/reagent/consumable/milk, /datum/reagent/consumable/ice, /datum/reagent/consumable/peachjuice) + reagent_type = /datum/reagent/consumable/peachjuice + +/datum/ice_cream_flavour/vanilla/korta + name = ICE_CREAM_KORTA_VANILLA + desc = "filled with vanilla ice cream made with korta milk. Lizards love it!" + ingredients = list(/datum/reagent/consumable/korta_milk, /datum/reagent/consumable/ice, /datum/reagent/consumable/vanilla) + +/datum/ice_cream_flavour/cherry_chocolate + name = ICE_CREAM_CHERRY_CHOCOLATE + color = COLOR_ICECREAM_CHERRY_CHOCOLATE + desc = "filled with cherry chocolate chip ice cream. It is wonderfully tangy and sweet." + ingredients = list(/datum/reagent/consumable/milk, /datum/reagent/consumable/ice, /datum/reagent/consumable/coco, /datum/reagent/consumable/cherryjelly) + reagent_type = /datum/reagent/consumable/cherryjelly + /datum/ice_cream_flavour/mob name = ICE_CREAM_MOB - icon_state = "icecream_mob" + color = COLOR_ICECREAM_STRAWBERRY desc = "filled with bright red ice cream. That's probably not strawberry..." desc_prefix = "A suspicious $CONE_NAME" reagent_type = /datum/reagent/consumable/liquidgibs @@ -287,15 +338,21 @@ GLOBAL_LIST_INIT_TYPED(ice_cream_flavours, /datum/ice_cream_flavour, init_ice_cr /datum/ice_cream_flavour/custom name = ICE_CREAM_CUSTOM - icon_state = "" //has its own mutable appearance overlay. + color = "" //has its own mutable appearance overlay desc = "filled with artisanal icecream. Made with real $CUSTOM_NAME. Ain't that something." ingredients = list(/datum/reagent/consumable/milk, /datum/reagent/consumable/ice) ingredients_text = "optional flavorings" +/datum/ice_cream_flavour/custom/korta + name = ICE_CREAM_KORTA_CUSTOM + desc = "filled with artisanal lizard-friendly icecream. Made with real $CUSTOM_NAME. Ain't that something." + ingredients = list(/datum/reagent/consumable/korta_milk, /datum/reagent/consumable/ice) + ingredients_text = "optional flavorings" + /datum/ice_cream_flavour/custom/add_flavour(datum/component/ice_cream_holder/target, datum/reagents/R, custom_name) if(!R || R.total_volume < 4) //consumable reagents have stronger taste so higher volume are required to allow non-food flavourings to break through better. return GLOB.ice_cream_flavours[ICE_CREAM_BLAND].add_flavour(target) //Bland, sugary ice and milk. - var/image/flavoring = image('icons/obj/kitchen.dmi', "icecream_custom") + var/image/flavoring = image('icons/obj/service/kitchen.dmi', "icecream_custom") var/datum/reagent/master = R.get_master_reagent() custom_name = lowertext(master.name) // reagent names are capitalized, while items' aren't. flavoring.color = master.color @@ -305,7 +362,7 @@ GLOBAL_LIST_INIT_TYPED(ice_cream_flavours, /datum/ice_cream_flavour, init_ice_cr /datum/ice_cream_flavour/bland name = ICE_CREAM_BLAND - icon_state = "icecream_custom" + color = COLOR_ICECREAM_CUSTOM desc = "filled with anemic, flavorless icecream. You wonder why this was ever scooped..." hidden = TRUE diff --git a/code/datums/components/food_storage.dm b/code/datums/components/food_storage.dm index 5ef93a206a84c..60fc3f6c486bf 100644 --- a/code/datums/components/food_storage.dm +++ b/code/datums/components/food_storage.dm @@ -18,9 +18,11 @@ /datum/component/food_storage/Initialize(_minimum_weight_class = WEIGHT_CLASS_SMALL, _bad_chance = 0, _good_chance = 100) - RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(try_inserting_item)) + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY_SECONDARY, PROC_REF(try_inserting_item)) RegisterSignal(parent, COMSIG_CLICK_CTRL, PROC_REF(try_removing_item)) RegisterSignal(parent, COMSIG_FOOD_EATEN, PROC_REF(consume_food_storage)) + RegisterSignal(parent, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_requesting_context_from_item)) + var/atom/food = parent initial_volume = food.reagents.total_volume @@ -29,6 +31,8 @@ bad_chance_of_discovery = _bad_chance good_chance_of_discovery = _good_chance + food.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1 + /datum/component/food_storage/Destroy(force, silent) if(stored_item) stored_item.forceMove(stored_item.drop_location()) @@ -199,3 +203,26 @@ //if there's nothing else in the food, or we found nothing valid stored_item = null return FALSE + +/** + * Adds context sensitivy directly to the processable file for screentips + * Arguments: + * * source - refers to item that will display its screentip + * * context - refers to, in this case, an item that can be inserted into another item + * * held_item - refers to item in user's hand, typically the one that will be inserted into the food item + * * user - refers to user who will see the screentip when the proper context and tool are there + */ + +/datum/component/food_storage/proc/on_requesting_context_from_item(datum/source, list/context, obj/item/held_item, mob/user) + SIGNAL_HANDLER + . = NONE + + if(isnull(held_item) || held_item == source) + context[SCREENTIP_CONTEXT_CTRL_LMB] = "Remove embedded item (if any)" + . = CONTEXTUAL_SCREENTIP_SET + + if(istype(held_item) && held_item.w_class <= WEIGHT_CLASS_SMALL && held_item != source && !IS_EDIBLE(held_item)) + context[SCREENTIP_CONTEXT_RMB] = "Embed item" + . = CONTEXTUAL_SCREENTIP_SET + + return . diff --git a/code/datums/components/fullauto.dm b/code/datums/components/fullauto.dm index 044619d594aa0..8663de5adc691 100644 --- a/code/datums/components/fullauto.dm +++ b/code/datums/components/fullauto.dm @@ -8,8 +8,12 @@ var/turf/target_loc //For dealing with locking on targets due to BYOND engine limitations (the mouse input only happening when mouse moves). var/autofire_stat = AUTOFIRE_STAT_IDLE var/mouse_parameters - var/autofire_shot_delay = 0.3 SECONDS //Time between individual shots. - var/mouse_status = AUTOFIRE_MOUSEUP //This seems hacky but there can be two MouseDown() without a MouseUp() in between if the user holds click and uses alt+tab, printscreen or similar. + /// Time between individual shots. + var/autofire_shot_delay = 0.3 SECONDS + /// This seems hacky but there can be two MouseDown() without a MouseUp() in between if the user holds click and uses alt+tab, printscreen or similar. + var/mouse_status = AUTOFIRE_MOUSEUP + /// Should dual wielding be allowed? + var/allow_akimbo ///windup autofire vars ///Whether the delay between shots increases over time, simulating a spooling weapon @@ -26,7 +30,7 @@ var/timerid COOLDOWN_DECLARE(next_shot_cd) -/datum/component/automatic_fire/Initialize(autofire_shot_delay, windup_autofire, windup_autofire_reduction_multiplier, windup_autofire_cap, windup_spindown) +/datum/component/automatic_fire/Initialize(autofire_shot_delay, windup_autofire, windup_autofire_reduction_multiplier, windup_autofire_cap, windup_spindown, allow_akimbo = TRUE) . = ..() if(!isgun(parent)) return COMPONENT_INCOMPATIBLE @@ -34,6 +38,7 @@ RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(wake_up)) if(autofire_shot_delay) src.autofire_shot_delay = autofire_shot_delay + src.allow_akimbo = allow_akimbo if(windup_autofire) src.windup_autofire = windup_autofire src.windup_autofire_reduction_multiplier = windup_autofire_reduction_multiplier @@ -62,10 +67,8 @@ if(autofire_stat == AUTOFIRE_STAT_FIRING) stop_autofiring() //Let's stop shooting to avoid issues. return - if(iscarbon(user)) - var/mob/living/carbon/arizona_ranger = user - if(arizona_ranger.is_holding(parent)) - autofire_on(arizona_ranger.client) + if(user.is_holding(parent)) + autofire_on(user.client) // There is a gun and there is a user wielding it. The component now waits for the mouse click. /datum/component/automatic_fire/proc/autofire_on(client/usercli) @@ -258,7 +261,7 @@ 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) + if(SEND_SIGNAL(parent, COMSIG_AUTOFIRE_SHOT, target, shooter, allow_akimbo, mouse_parameters) & COMPONENT_AUTOFIRE_SHOT_SUCCESS) return TRUE stop_autofiring() return FALSE @@ -290,21 +293,21 @@ return COMPONENT_AUTOFIRE_ONMOUSEDOWN_BYPASS -/obj/item/gun/proc/do_autofire(datum/source, atom/target, mob/living/shooter, params) +/obj/item/gun/proc/do_autofire(datum/source, atom/target, mob/living/shooter, allow_akimbo, params) SIGNAL_HANDLER if(semicd || shooter.incapacitated()) return NONE if(!can_shoot()) shoot_with_empty_chamber(shooter) return NONE - INVOKE_ASYNC(src, PROC_REF(do_autofire_shot), source, target, shooter, params) + INVOKE_ASYNC(src, PROC_REF(do_autofire_shot), source, target, shooter, allow_akimbo, params) return COMPONENT_AUTOFIRE_SHOT_SUCCESS //All is well, we can continue shooting. -/obj/item/gun/proc/do_autofire_shot(datum/source, atom/target, mob/living/shooter, params) +/obj/item/gun/proc/do_autofire_shot(datum/source, atom/target, mob/living/shooter, allow_akimbo, 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(istype(akimbo_gun) && weapon_weight < WEAPON_MEDIUM && allow_akimbo) if(akimbo_gun.weapon_weight < WEAPON_MEDIUM && 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) diff --git a/code/datums/components/gags_recolorable.dm b/code/datums/components/gags_recolorable.dm deleted file mode 100644 index f864ee5bd0cc2..0000000000000 --- a/code/datums/components/gags_recolorable.dm +++ /dev/null @@ -1,73 +0,0 @@ -/datum/component/gags_recolorable - -/datum/component/gags_recolorable/RegisterWithParent() - RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attackby)) - -/datum/component/gags_recolorable/UnregisterFromParent() - UnregisterSignal(parent, COMSIG_ATOM_ATTACKBY) - -/datum/component/gags_recolorable/proc/on_attackby(datum/source, obj/item/attacking_item, mob/user) - SIGNAL_HANDLER - - if(!isatom(parent)) - return - - if(!istype(attacking_item, /obj/item/toy/crayon/spraycan)) - return - var/obj/item/toy/crayon/spraycan/can = attacking_item - - if(can.is_capped || can.check_empty()) - return - - INVOKE_ASYNC(src, PROC_REF(open_ui), user, can) - return COMPONENT_NO_AFTERATTACK - -/datum/component/gags_recolorable/proc/open_ui(mob/user, obj/item/toy/crayon/spraycan/can) - var/atom/atom_parent = parent - var/list/allowed_configs = list() - var/config = initial(atom_parent.greyscale_config) - if(!config) - return - allowed_configs += "[config]" - if(ispath(atom_parent, /obj/item)) - var/obj/item/item = atom_parent - if(initial(item.greyscale_config_worn)) - allowed_configs += "[initial(item.greyscale_config_worn)]" - if(initial(item.greyscale_config_inhand_left)) - allowed_configs += "[initial(item.greyscale_config_inhand_left)]" - if(initial(item.greyscale_config_inhand_right)) - allowed_configs += "[initial(item.greyscale_config_inhand_right)]" - - var/datum/greyscale_modify_menu/spray_paint/menu = new( - atom_parent, user, allowed_configs, CALLBACK(src, PROC_REF(recolor), user, can), - starting_icon_state = initial(atom_parent.icon_state), - starting_config = initial(atom_parent.greyscale_config), - starting_colors = atom_parent.greyscale_colors, - used_spraycan = can - ) - menu.ui_interact(user) - -/datum/component/gags_recolorable/proc/recolor(mob/user, obj/item/toy/crayon/spraycan/can, datum/greyscale_modify_menu/menu) - if(!isatom(parent)) - return - var/atom/atom_parent = parent - - if(can.is_capped || can.check_empty(user)) - menu.ui_close() - return - - can.use_charges() - if(can.pre_noise) - atom_parent.audible_message(span_hear("You hear spraying.")) - playsound(atom_parent.loc, 'sound/effects/spray.ogg', 5, TRUE, 5) - - atom_parent.set_greyscale(menu.split_colors) - - // If the item is a piece of clothing and is being worn, make sure it updates on the player - if(!isclothing(atom_parent)) - return - if(!ishuman(atom_parent.loc)) - return - var/obj/item/clothing/clothing_parent = atom_parent - var/mob/living/carbon/human/wearer = atom_parent.loc - wearer.update_clothing(clothing_parent.slot_flags) diff --git a/code/datums/components/geiger_sound.dm b/code/datums/components/geiger_sound.dm index 76ac0c625079a..3a8a22df383ed 100644 --- a/code/datums/components/geiger_sound.dm +++ b/code/datums/components/geiger_sound.dm @@ -86,7 +86,7 @@ return ..(mid_sounds[get_perceived_radiation_danger(last_radiation_pulse, last_insulation_to_target)]) -/datum/looping_sound/geiger/stop() +/datum/looping_sound/geiger/stop(null_parent = FALSE) . = ..() last_radiation_pulse = null diff --git a/code/datums/components/ghost_direct_control.dm b/code/datums/components/ghost_direct_control.dm new file mode 100644 index 0000000000000..c4d08380db184 --- /dev/null +++ b/code/datums/components/ghost_direct_control.dm @@ -0,0 +1,140 @@ +/** + * Component which lets ghosts click on a mob to take control of it + */ +/datum/component/ghost_direct_control + /// Message to display upon successful possession + var/assumed_control_message + /// Type of ban you can get to prevent you from accepting this role + var/ban_type + /// Any extra checks which need to run before we take over + var/datum/callback/extra_control_checks + /// Callback run after someone successfully takes over the body + var/datum/callback/after_assumed_control + /// If we're currently awaiting the results of a ghost poll + var/awaiting_ghosts = FALSE + +/datum/component/ghost_direct_control/Initialize( + ban_type = ROLE_SENTIENCE, + role_name = null, + poll_candidates = TRUE, + poll_length = 10 SECONDS, + poll_ignore_key = POLL_IGNORE_SENTIENCE_POTION, + assumed_control_message = null, + datum/callback/extra_control_checks, + datum/callback/after_assumed_control, +) + . = ..() + if (!isliving(parent)) + return COMPONENT_INCOMPATIBLE + + src.ban_type = ban_type + src.assumed_control_message = assumed_control_message || "You are [parent]!" + src.extra_control_checks = extra_control_checks + src.after_assumed_control= after_assumed_control + + var/mob/mob_parent = parent + LAZYADD(GLOB.joinable_mobs[format_text("[initial(mob_parent.name)]")], mob_parent) + + if (poll_candidates) + INVOKE_ASYNC(src, PROC_REF(request_ghost_control), role_name || "[parent]", poll_length, poll_ignore_key) + +/datum/component/ghost_direct_control/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_ATOM_ATTACK_GHOST, PROC_REF(on_ghost_clicked)) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examined)) + +/datum/component/ghost_direct_control/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_ATOM_ATTACK_GHOST, COMSIG_ATOM_EXAMINE)) + return ..() + +/datum/component/ghost_direct_control/Destroy(force, silent) + extra_control_checks = null + after_assumed_control = null + + var/mob/mob_parent = parent + var/list/spawners = GLOB.joinable_mobs[format_text("[initial(mob_parent.name)]")] + LAZYREMOVE(spawners, mob_parent) + if(!LAZYLEN(spawners)) + GLOB.joinable_mobs -= format_text("[initial(mob_parent.name)]") + return ..() + +/// Inform ghosts that they can possess this +/datum/component/ghost_direct_control/proc/on_examined(datum/source, mob/user, list/examine_text) + SIGNAL_HANDLER + if (!isobserver(user)) + return + var/mob/living/our_mob = parent + if (our_mob.stat == DEAD || our_mob.key || awaiting_ghosts) + return + examine_text += span_boldnotice("You could take control of this mob by clicking on it.") + +/// Send out a request for a brain +/datum/component/ghost_direct_control/proc/request_ghost_control(role_name, poll_length, poll_ignore_key) + if (!(GLOB.ghost_role_flags & GHOSTROLE_SPAWNER)) + return + awaiting_ghosts = TRUE + var/list/mob/dead/observer/candidates = poll_ghost_candidates( + question = "Do you want to play as [role_name]?", + jobban_type = ban_type, + be_special_flag = ban_type, + poll_time = poll_length, + ignore_category = poll_ignore_key, + ) + awaiting_ghosts = FALSE + if (!LAZYLEN(candidates)) + return + assume_direct_control(pick(candidates)) + +/// A ghost clicked on us, they want to get in this body +/datum/component/ghost_direct_control/proc/on_ghost_clicked(mob/our_mob, mob/dead/observer/hopeful_ghost) + SIGNAL_HANDLER + if (our_mob.key) + qdel(src) + return + if (!hopeful_ghost.client) + return + if (!(GLOB.ghost_role_flags & GHOSTROLE_SPAWNER)) + to_chat(hopeful_ghost, span_warning("Ghost roles have been temporarily disabled!")) + return + if (awaiting_ghosts) + to_chat(hopeful_ghost, span_warning("Ghost candidate selection currently in progress!")) + return COMPONENT_CANCEL_ATTACK_CHAIN + if (!SSticker.HasRoundStarted()) + to_chat(hopeful_ghost, span_warning("You cannot assume control of this until after the round has started!")) + return COMPONENT_CANCEL_ATTACK_CHAIN + INVOKE_ASYNC(src, PROC_REF(attempt_possession), our_mob, hopeful_ghost) + return COMPONENT_CANCEL_ATTACK_CHAIN + +/// We got far enough to establish that this mob is a valid target, let's try to posssess it +/datum/component/ghost_direct_control/proc/attempt_possession(mob/our_mob, mob/dead/observer/hopeful_ghost) + var/ghost_asked = tgui_alert(usr, "Become [our_mob]?", "Are you sure?", list("Yes", "No")) + if (ghost_asked != "Yes" || QDELETED(our_mob)) + return + assume_direct_control(hopeful_ghost) + +/// Grant possession of our mob, component is now no longer required +/datum/component/ghost_direct_control/proc/assume_direct_control(mob/harbinger) + if (QDELETED(src)) + to_chat(harbinger, span_warning("Offer to possess creature has expired!")) + return + if (is_banned_from(harbinger.ckey, list(ban_type))) + to_chat(harbinger, span_warning("You are banned from playing as this role!")) + return + if (!(GLOB.ghost_role_flags & GHOSTROLE_SPAWNER)) + to_chat(harbinger, span_warning("Ghost roles have been temporarily disabled!")) + return + var/mob/living/new_body = parent + if (new_body.stat == DEAD) + to_chat(harbinger, span_warning("This body has passed away, it is of no use!")) + return + if (new_body.key) + to_chat(harbinger, span_warning("[parent] has already become sapient!")) + qdel(src) + return + if (extra_control_checks && !extra_control_checks.Invoke(harbinger)) + return + harbinger.log_message("took control of [new_body].", LOG_GAME) + new_body.key = harbinger.key + to_chat(new_body, span_boldnotice(assumed_control_message)) + after_assumed_control?.Invoke(harbinger) + qdel(src) diff --git a/code/datums/components/gps.dm b/code/datums/components/gps.dm index b19828edd9040..ceee193bf4ad5 100644 --- a/code/datums/components/gps.dm +++ b/code/datums/components/gps.dm @@ -66,9 +66,10 @@ GLOBAL_LIST_EMPTY(GPS_list) examine_list += span_notice("Alt-click to switch it [tracking ? "off":"on"].") ///Called on COMSIG_ATOM_EMP_ACT -/datum/component/gps/item/proc/on_emp_act(datum/source, severity) +/datum/component/gps/item/proc/on_emp_act(datum/source, severity, protection) SIGNAL_HANDLER - + if(protection & EMP_PROTECT_SELF) + return emped = TRUE var/atom/A = parent A.cut_overlay("working") diff --git a/code/datums/components/grillable.dm b/code/datums/components/grillable.dm index e18b12c7e0d7b..8458fa25e62d5 100644 --- a/code/datums/components/grillable.dm +++ b/code/datums/components/grillable.dm @@ -99,8 +99,10 @@ if(original_object.custom_materials) grilled_result.set_custom_materials(original_object.custom_materials) - if(IS_EDIBLE(grilled_result)) + if(IsEdible(grilled_result) && positive_result) BLACKBOX_LOG_FOOD_MADE(grilled_result.type) + grilled_result.reagents.clear_reagents() + original_object.reagents?.trans_to(grilled_result, original_object.reagents.total_volume) SEND_SIGNAL(parent, COMSIG_ITEM_GRILLED, grilled_result) if(who_placed_us) @@ -129,7 +131,7 @@ else if(current_cook_time <= required_cook_time) examine_list += span_notice("[parent] seems to be almost finished cooking!") else - examine_list += span_danger("[parent] should probably not be cooked for much longer!") + examine_list += span_danger("[parent] should probably not be put on the grill.") ///Ran when an object moves from the grill /datum/component/grillable/proc/on_moved(atom/source, atom/OldLoc, Dir, Forced) diff --git a/code/datums/components/growth_and_differentiation.dm b/code/datums/components/growth_and_differentiation.dm index e326c4f4a77df..0920344ce58cb 100644 --- a/code/datums/components/growth_and_differentiation.dm +++ b/code/datums/components/growth_and_differentiation.dm @@ -66,6 +66,8 @@ /datum/component/growth_and_differentiation/Destroy(force, silent) STOP_PROCESSING(SSdcs, src) deltimer(timer_id) + optional_checks = null + optional_grow_behavior = null return ..() /// Wrapper for qdel() so we can pass it in RegisterSignals(). I hate it here too. @@ -138,4 +140,6 @@ if(!silent) old_mob.visible_message(span_warning("[old_mob] grows into \a [new_mob_name]!")) - old_mob.change_mob_type(growth_path, old_mob.loc, new_name = new_mob_name, delete_old_mob = TRUE) + var/mob/living/transformed_mob = old_mob.change_mob_type(growth_path, old_mob.loc, new_name = new_mob_name, delete_old_mob = TRUE) + if(initial(new_mob.unique_name)) + transformed_mob.set_name() diff --git a/code/datums/components/hazard_area.dm b/code/datums/components/hazard_area.dm index 82559de51633f..79b4399023ed5 100644 --- a/code/datums/components/hazard_area.dm +++ b/code/datums/components/hazard_area.dm @@ -164,7 +164,7 @@ owner.remove_actionspeed_modifier(/datum/actionspeed_modifier/status_effect/hazard_area, update=TRUE) /datum/status_effect/hazard_area/get_examine_text() - return span_notice("[owner.p_they(TRUE)] appear[owner.p_s()] to be largely immobilized through unknown means.") + return span_notice("[owner.p_They()] appear[owner.p_s()] to be largely immobilized through unknown means.") /atom/movable/screen/alert/status_effect/hazard_area name = "Hazardous Area" diff --git a/code/datums/components/healing_touch.dm b/code/datums/components/healing_touch.dm index 1eb23e34c09bc..4b953fc628946 100644 --- a/code/datums/components/healing_touch.dm +++ b/code/datums/components/healing_touch.dm @@ -22,6 +22,10 @@ var/heal_time /// Typecache of mobs we can heal var/list/valid_targets_typecache + /// Bitfield for biotypes of mobs we can heal + var/valid_biotypes + /// Which kinds of carbon limbs can we heal, has no effect on non-carbon mobs. Set to null if you don't care about excluding prosthetics. + var/required_bodytype /// How targetting yourself works, expects one of HEALING_TOUCH_ANYONE, HEALING_TOUCH_NOT_SELF, or HEALING_TOUCH_SELF_ONLY var/self_targetting /// Text to print when action starts, replaces %SOURCE% with healer and %TARGET% with healed mob @@ -37,6 +41,8 @@ interaction_key = DOAFTER_SOURCE_HEAL_TOUCH, datum/callback/extra_checks = null, list/valid_targets_typecache = list(), + valid_biotypes = MOB_ORGANIC | MOB_MINERAL, + required_bodytype = BODYTYPE_ORGANIC, self_targetting = HEALING_TOUCH_NOT_SELF, action_text = "%SOURCE% begins healing %TARGET%", complete_text = "%SOURCE% finishes healing %TARGET%", @@ -51,6 +57,8 @@ src.interaction_key = interaction_key src.extra_checks = extra_checks src.valid_targets_typecache = valid_targets_typecache.Copy() + src.valid_biotypes = valid_biotypes + src.required_bodytype = required_bodytype src.self_targetting = self_targetting src.action_text = action_text src.complete_text = complete_text @@ -63,7 +71,7 @@ return ..() /datum/component/healing_touch/Destroy(force, silent) - QDEL_NULL(extra_checks) + extra_checks = null return ..() /// Validate our target, and interrupt the attack chain to start healing it if it is allowed @@ -111,7 +119,20 @@ /// Returns true if the target has a kind of damage which we can heal /datum/component/healing_touch/proc/has_healable_damage(mob/living/target) - return (target.getBruteLoss() > 0 && heal_brute) || (target.getFireLoss() > 0 && heal_burn) || (target.getStaminaLoss() > 0 && heal_stamina) + if (!isnull(valid_biotypes) && !(valid_biotypes & target.mob_biotypes)) + return FALSE + if (target.getStaminaLoss() > 0 && heal_stamina) + return TRUE + if (!iscarbon(target)) + return (target.getBruteLoss() > 0 && heal_brute) || (target.getFireLoss() > 0 && heal_burn) + var/mob/living/carbon/carbon_target = target + for (var/obj/item/bodypart/part in carbon_target.bodyparts) + if (!(part.brute_dam && heal_brute) && !(part.burn_dam && heal_burn)) + continue + if (!isnull(required_bodytype) && !(part.bodytype & required_bodytype)) + continue + return TRUE + return FALSE /// Perform a do_after and then heal our target /datum/component/healing_touch/proc/heal_target(mob/living/healer, mob/living/target) @@ -125,7 +146,7 @@ if (complete_text) healer.visible_message(span_notice("[format_string(complete_text, healer, target)]")) - target.heal_overall_damage(brute = heal_brute, burn = heal_burn, stamina = heal_stamina) + target.heal_overall_damage(brute = heal_brute, burn = heal_burn, stamina = heal_stamina, required_bodytype = required_bodytype) new /obj/effect/temp_visual/heal(get_turf(target), COLOR_HEALING_CYAN) /// Reformats the passed string with the replacetext keys diff --git a/code/datums/components/health_scaling_effects.dm b/code/datums/components/health_scaling_effects.dm index ecfb9ceb1e551..140a60ea96249 100644 --- a/code/datums/components/health_scaling_effects.dm +++ b/code/datums/components/health_scaling_effects.dm @@ -54,7 +54,7 @@ return ..() /datum/component/health_scaling_effects/Destroy(force, silent) - QDEL_NULL(additional_status_callback) + additional_status_callback = null return ..() /// Called when mob health changes, recalculates the ratio between maximum and minimum diff --git a/code/datums/components/infective.dm b/code/datums/components/infective.dm index 65afb2617c33e..6d89f6e5cd958 100644 --- a/code/datums/components/infective.dm +++ b/code/datums/components/infective.dm @@ -2,9 +2,13 @@ var/list/datum/disease/diseases //make sure these are the static, non-processing versions! var/expire_time var/required_clean_types = CLEAN_TYPE_DISEASE + /// The infection is weak and can only infect on consumption with small chance + var/is_weak = FALSE + /// Chance of weak infection on consumption + var/weak_infection_chance = 10 -/datum/component/infective/Initialize(list/datum/disease/_diseases, expire_in) +/datum/component/infective/Initialize(list/datum/disease/_diseases, expire_in, weak = FALSE) if(islist(_diseases)) diseases = _diseases else @@ -16,41 +20,72 @@ if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE - var/static/list/disease_connections = list( - COMSIG_ATOM_ENTERED = PROC_REF(try_infect_crossed), - ) - AddComponent(/datum/component/connect_loc_behalf, parent, disease_connections) + is_weak = weak - RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(clean)) - RegisterSignal(parent, COMSIG_MOVABLE_BUCKLE, PROC_REF(try_infect_buckle)) - RegisterSignal(parent, COMSIG_MOVABLE_BUMP, PROC_REF(try_infect_collide)) - RegisterSignal(parent, COMSIG_MOVABLE_IMPACT_ZONE, PROC_REF(try_infect_impact_zone)) - if(isitem(parent)) - RegisterSignal(parent, COMSIG_ITEM_ATTACK_ZONE, PROC_REF(try_infect_attack_zone)) - RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(try_infect_attack)) - RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(try_infect_equipped)) + if(is_weak && isitem(parent)) RegisterSignal(parent, COMSIG_FOOD_EATEN, PROC_REF(try_infect_eat)) - if(istype(parent, /obj/item/reagent_containers/cup)) - RegisterSignal(parent, COMSIG_GLASS_DRANK, PROC_REF(try_infect_drink)) - else if(istype(parent, /obj/effect/decal/cleanable/blood/gibs)) - RegisterSignal(parent, COMSIG_GIBS_STREAK, PROC_REF(try_infect_streak)) + RegisterSignal(parent, COMSIG_PILL_CONSUMED, PROC_REF(try_infect_eat)) + else + var/static/list/disease_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(try_infect_crossed), + ) + AddComponent(/datum/component/connect_loc_behalf, parent, disease_connections) + + RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(clean)) + RegisterSignal(parent, COMSIG_MOVABLE_BUCKLE, PROC_REF(try_infect_buckle)) + RegisterSignal(parent, COMSIG_MOVABLE_BUMP, PROC_REF(try_infect_collide)) + RegisterSignal(parent, COMSIG_MOVABLE_IMPACT_ZONE, PROC_REF(try_infect_impact_zone)) + if(isitem(parent)) + RegisterSignal(parent, COMSIG_ITEM_ATTACK_ZONE, PROC_REF(try_infect_attack_zone)) + RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(try_infect_attack)) + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(try_infect_equipped)) + RegisterSignal(parent, COMSIG_FOOD_EATEN, PROC_REF(try_infect_eat)) + RegisterSignal(parent, COMSIG_PILL_CONSUMED, PROC_REF(try_infect_eat)) + if(istype(parent, /obj/item/reagent_containers/cup)) + RegisterSignal(parent, COMSIG_GLASS_DRANK, PROC_REF(try_infect_drink)) + if(isorgan(parent)) + RegisterSignal(parent, COMSIG_ORGAN_IMPLANTED, PROC_REF(on_organ_insertion)) + else if(istype(parent, /obj/effect/decal/cleanable/blood/gibs)) + RegisterSignal(parent, COMSIG_GIBS_STREAK, PROC_REF(try_infect_streak)) + +/datum/component/infective/proc/on_organ_insertion(obj/item/organ/target, mob/living/carbon/receiver) + SIGNAL_HANDLER + + for(var/datum/disease/disease in diseases) + receiver.ForceContractDisease(disease) + + qdel(src) // once organ is implanted delete the infective component /datum/component/infective/proc/try_infect_eat(datum/source, mob/living/eater, mob/living/feeder) SIGNAL_HANDLER - for(var/V in diseases) - eater.ForceContractDisease(V) + if(!eater.has_quirk(/datum/quirk/deviant_tastes)) + eater.add_mood_event("disgust", /datum/mood_event/disgust/dirty_food) + + if(is_weak && !prob(weak_infection_chance)) + return + + for(var/datum/disease/disease in diseases) + if(!disease.has_required_infectious_organ(eater, ORGAN_SLOT_STOMACH)) + continue + + eater.ForceContractDisease(disease) + try_infect(feeder, BODY_ZONE_L_ARM) /datum/component/infective/proc/try_infect_drink(datum/source, mob/living/drinker, mob/living/feeder) SIGNAL_HANDLER - for(var/disease in diseases) - drinker.ForceContractDisease(disease) var/appendage_zone = feeder.held_items.Find(source) appendage_zone = appendage_zone == 0 ? BODY_ZONE_CHEST : appendage_zone % 2 ? BODY_ZONE_R_ARM : BODY_ZONE_L_ARM try_infect(feeder, appendage_zone) + for(var/datum/disease/disease in diseases) + if(!disease.has_required_infectious_organ(drinker, ORGAN_SLOT_STOMACH)) + continue + + drinker.ForceContractDisease(disease) + /datum/component/infective/proc/clean(datum/source, clean_types) SIGNAL_HANDLER diff --git a/code/datums/components/interaction_booby_trap.dm b/code/datums/components/interaction_booby_trap.dm index c099eec917436..6f57e4f6b75c1 100644 --- a/code/datums/components/interaction_booby_trap.dm +++ b/code/datums/components/interaction_booby_trap.dm @@ -59,8 +59,8 @@ /datum/component/interaction_booby_trap/Destroy(force, silent) UnregisterSignal(parent, list(COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_TOOL_ACT(defuse_tool), COMSIG_ATOM_EXAMINE_MORE) + additional_triggers) QDEL_NULL(active_sound_loop) - QDEL_NULL(on_triggered_callback) - QDEL_NULL(on_defused_callback) + on_triggered_callback = null + on_defused_callback = null return ..() /// Called when someone touches the parent atom with their hands, we want to blow up diff --git a/code/datums/components/irradiated.dm b/code/datums/components/irradiated.dm index c8a57f3761ad5..bffd56459bfbf 100644 --- a/code/datums/components/irradiated.dm +++ b/code/datums/components/irradiated.dm @@ -96,7 +96,7 @@ process_tox_damage(human_parent, seconds_per_tick) /datum/component/irradiated/proc/should_halt_effects(mob/living/carbon/human/target) - if (IS_IN_STASIS(target)) + if (HAS_TRAIT(target, TRAIT_STASIS)) return TRUE if (HAS_TRAIT(target, TRAIT_HALT_RADIATION_EFFECTS)) diff --git a/code/datums/components/itembound.dm b/code/datums/components/itembound.dm index ae29949961b8e..f742c1233fd11 100644 --- a/code/datums/components/itembound.dm +++ b/code/datums/components/itembound.dm @@ -11,19 +11,39 @@ if(QDELETED(passed_container)) return containerref = WEAKREF(passed_container) + RegisterSignal(passed_container, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(on_examined)) move_tracker = new(parent, CALLBACK(src, PROC_REF(verify_containment))) + +/datum/component/itembound/RegisterWithParent() + . = ..() ADD_TRAIT(parent, TRAIT_INCAPACITATED, SMITE_TRAIT) + if (isliving(parent)) + var/mob/living/living_parent = parent + living_parent.apply_status_effect(/datum/status_effect/grouped/stasis, STASIS_ADMIN) + +/datum/component/itembound/UnregisterFromParent() + REMOVE_TRAIT(parent, TRAIT_INCAPACITATED, SMITE_TRAIT) + if (isliving(parent)) + var/mob/living/living_parent = parent + living_parent.remove_status_effect(/datum/status_effect/grouped/stasis, STASIS_ADMIN) + return ..() + +/datum/component/itembound/proc/on_examined(atom/source, mob/user, list/examine_list) + SIGNAL_HANDLER + examine_list += span_notice("If you hold it up to your ear, you can hear the screams of the damned.") /// Ensure that when we move, we still are in the container. If not in the container, remove all the traits. /datum/component/itembound/proc/verify_containment() var/atom/movable/container = containerref.resolve() if(!QDELETED(container) && container.contains(parent)) return - REMOVE_TRAIT(parent, TRAIT_INCAPACITATED, SMITE_TRAIT) qdel(src) /datum/component/itembound/Destroy(force, silent) + var/atom/movable/container = containerref?.resolve() + if (!QDELETED(container)) + UnregisterSignal(container, COMSIG_ATOM_EXAMINE_MORE) containerref = null QDEL_NULL(move_tracker) return ..() diff --git a/code/datums/components/jetpack.dm b/code/datums/components/jetpack.dm index 71dc9b4c5a671..f7e1fca70e6d8 100644 --- a/code/datums/components/jetpack.dm +++ b/code/datums/components/jetpack.dm @@ -3,8 +3,8 @@ // So propulsion through space on move, that sort of thing /datum/component/jetpack dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + /// Checks to ensure if we can move & if we can activate var/datum/callback/check_on_move - var/datum/callback/get_mover /// If we should stabilize ourselves when not drifting var/stabilize = FALSE /// The signal we listen for as an activation @@ -13,6 +13,7 @@ var/deactivation_signal /// The return flag our parent expects for a failed activation var/return_flag + /// The effect system for the jet pack trail var/datum/effect_system/trail_follow/trail /// The typepath to instansiate our trail as, when we need it var/effect_type @@ -23,11 +24,10 @@ * * activation_signal - Signal we activate on * * deactivation_signal - Signal we deactivate on * * return_flag - Flag to return if activation fails - * * get_mover - Callback we use to get the "moving" thing, for trail purposes, alongside signal registration * * check_on_move - Callback we call each time we attempt a move, we expect it to retun true if the move is ok, false otherwise. It expects an arg, TRUE if fuel should be consumed, FALSE othewise * * effect_type - Type of trail_follow to spawn */ -/datum/component/jetpack/Initialize(stabilize, activation_signal, deactivation_signal, return_flag, datum/callback/get_mover, datum/callback/check_on_move, datum/effect_system/trail_follow/effect_type) +/datum/component/jetpack/Initialize(stabilize, activation_signal, deactivation_signal, return_flag, datum/callback/check_on_move, datum/effect_system/trail_follow/effect_type) . = ..() if(!isatom(parent)) return COMPONENT_INCOMPATIBLE @@ -38,15 +38,14 @@ if(deactivation_signal) RegisterSignal(parent, deactivation_signal, PROC_REF(deactivate)) - src.check_on_move = check_on_move - src.get_mover = get_mover src.stabilize = stabilize - src.return_flag = return_flag + src.check_on_move = check_on_move src.activation_signal = activation_signal src.deactivation_signal = deactivation_signal + src.return_flag = return_flag src.effect_type = effect_type -/datum/component/jetpack/InheritComponent(datum/component/component, original, stabilize, activation_signal, deactivation_signal, return_flag, datum/callback/get_mover, datum/callback/check_on_move, datum/effect_system/trail_follow/effect_type) +/datum/component/jetpack/InheritComponent(datum/component/component, original, stabilize, activation_signal, deactivation_signal, return_flag, datum/callback/check_on_move, datum/effect_system/trail_follow/effect_type) UnregisterSignal(parent, src.activation_signal) if(src.deactivation_signal) UnregisterSignal(parent, src.deactivation_signal) @@ -54,52 +53,56 @@ if(deactivation_signal) RegisterSignal(parent, deactivation_signal, PROC_REF(deactivate)) - src.check_on_move = check_on_move - src.get_mover = get_mover src.stabilize = stabilize + src.check_on_move = check_on_move src.activation_signal = activation_signal src.deactivation_signal = deactivation_signal + src.return_flag = return_flag src.effect_type = effect_type - if(trail && effect_type != trail.type) - QDEL_NULL(trail) - setup_trail() + if(trail && trail.effect_type != effect_type) + setup_trail(trail.holder) -/datum/component/jetpack/Destroy() - QDEL_NULL(trail) - QDEL_NULL(check_on_move) +/datum/component/jetpack/Destroy(force, silent) + if(trail) + QDEL_NULL(trail) + check_on_move = null return ..() -/datum/component/jetpack/proc/setup_trail() - var/mob/moving = get_mover.Invoke() - if(!moving || trail) - return +/datum/component/jetpack/proc/setup_trail(mob/user) + if(trail) + QDEL_NULL(trail) + trail = new effect_type trail.auto_process = FALSE - trail.set_up(moving) + trail.set_up(user) + trail.start() -/datum/component/jetpack/proc/activate(datum/source) +/datum/component/jetpack/proc/activate(datum/source, mob/user) SIGNAL_HANDLER - var/mob/moving = get_mover.Invoke() - if(!thrust(moving)) + + if(!check_on_move.Invoke(TRUE)) return return_flag - trail.start() - RegisterSignal(moving, COMSIG_MOVABLE_MOVED, PROC_REF(move_react)) - RegisterSignal(moving, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(pre_move_react)) - RegisterSignal(moving, COMSIG_MOVABLE_SPACEMOVE, PROC_REF(spacemove_react)) - RegisterSignal(moving, COMSIG_MOVABLE_DRIFT_VISUAL_ATTEMPT, PROC_REF(block_starting_visuals)) - RegisterSignal(moving, COMSIG_MOVABLE_DRIFT_BLOCK_INPUT, PROC_REF(ignore_ending_block)) -/datum/component/jetpack/proc/deactivate(datum/source) + RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(move_react)) + RegisterSignal(user, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(pre_move_react)) + RegisterSignal(user, COMSIG_MOVABLE_SPACEMOVE, PROC_REF(spacemove_react)) + RegisterSignal(user, COMSIG_MOVABLE_DRIFT_VISUAL_ATTEMPT, PROC_REF(block_starting_visuals)) + RegisterSignal(user, COMSIG_MOVABLE_DRIFT_BLOCK_INPUT, PROC_REF(ignore_ending_block)) + + setup_trail(user) + +/datum/component/jetpack/proc/deactivate(datum/source, mob/user) SIGNAL_HANDLER - var/mob/moving = get_mover.Invoke() - if(moving) - UnregisterSignal(moving, COMSIG_MOVABLE_MOVED) - UnregisterSignal(moving, COMSIG_MOVABLE_PRE_MOVE) - UnregisterSignal(moving, COMSIG_MOVABLE_SPACEMOVE) - UnregisterSignal(moving, COMSIG_MOVABLE_DRIFT_VISUAL_ATTEMPT) - UnregisterSignal(moving, COMSIG_MOVABLE_DRIFT_BLOCK_INPUT) - QDEL_NULL(trail) //delete AFTER unregistering the mob, otherwise you'll get runtimes. + + UnregisterSignal(user, COMSIG_MOVABLE_MOVED) + UnregisterSignal(user, COMSIG_MOVABLE_PRE_MOVE) + UnregisterSignal(user, COMSIG_MOVABLE_SPACEMOVE) + UnregisterSignal(user, COMSIG_MOVABLE_DRIFT_VISUAL_ATTEMPT) + UnregisterSignal(user, COMSIG_MOVABLE_DRIFT_BLOCK_INPUT) + + if(trail) + QDEL_NULL(trail) /datum/component/jetpack/proc/move_react(mob/user) SIGNAL_HANDLER @@ -118,6 +121,8 @@ /datum/component/jetpack/proc/pre_move_react(mob/user) SIGNAL_HANDLER + if(!trail) + return FALSE trail.oldposition = get_turf(user) /datum/component/jetpack/proc/spacemove_react(mob/user, movement_dir, continuous_move) @@ -133,8 +138,6 @@ /datum/component/jetpack/proc/thrust() if(!check_on_move.Invoke(TRUE)) return FALSE - if(!trail) - setup_trail() trail.generate_effect() return TRUE diff --git a/code/datums/components/jousting.dm b/code/datums/components/jousting.dm index abde9cefaa642..56b65c6f758b5 100644 --- a/code/datums/components/jousting.dm +++ b/code/datums/components/jousting.dm @@ -1,82 +1,149 @@ +///Amount of time each timer has, used to reset the jousting back, indicating that the person has stopped moving. +#define MOVEMENT_RESET_COOLDOWN_TIME (0.3 SECONDS) + +/** + * ##jousting + * + * Given to items, it allows you to charge into people with additional damage and potential knockdown + * by being buckled onto something. If the other person is also jousting, can knock eachother down. + */ /datum/component/jousting + ///The current person holding parent. + var/mob/living/current_holder + ///The current direction of the jousting. var/current_direction = NONE - var/max_tile_charge = 5 - var/min_tile_charge = 2 //tiles before this code gets into effect. + ///How many tiles we've charged up thus far var/current_tile_charge = 0 - var/movement_reset_tolerance = 3 //deciseconds - var/unmounted_damage_boost_per_tile = 0 - var/unmounted_knockdown_chance_per_tile = 0 - var/unmounted_knockdown_time = 0 - var/mounted_damage_boost_per_tile = 2 - var/mounted_knockdown_chance_per_tile = 20 - var/mounted_knockdown_time = 20 - var/requires_mob_riding = TRUE //whether this only works if the attacker is riding a mob, rather than anything they can buckle to. - var/requires_mount = TRUE //kinda defeats the point of jousting if you're not mounted but whatever. - var/mob/current_holder - var/current_timerid - -/datum/component/jousting/Initialize() + + ///How much of an increase in damage is achieved every tile moved during jousting. + var/damage_boost_per_tile + ///The boosted chances of a knockdown occuring while jousting. + var/knockdown_chance_per_tile + ///How much of an increase in knockdown is achieved every tile moved during jousting, if it knocks down. + var/knockdown_time + ///The max amount of tiles before you can joust someone. + var/max_tile_charge + ///The min amount of tiles before you can joust someone. + var/min_tile_charge + +/datum/component/jousting/Initialize( + damage_boost_per_tile = 2, + knockdown_chance_per_tile = 20, + knockdown_time = 2 SECONDS, + max_tile_charge = 5, + min_tile_charge = 2, +) if(!isitem(parent)) return COMPONENT_INCOMPATIBLE + src.damage_boost_per_tile = damage_boost_per_tile + src.knockdown_chance_per_tile = knockdown_chance_per_tile + src.knockdown_time = knockdown_time + src.max_tile_charge = max_tile_charge + src.min_tile_charge = min_tile_charge + + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip)) RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_drop)) RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(on_attack)) + RegisterSignal(parent, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) + +/datum/component/jousting/UnregisterFromParent() + . = ..() + UnregisterSignal(parent, list( + COMSIG_ATOM_EXAMINE, + COMSIG_ITEM_EQUIPPED, + COMSIG_ITEM_DROPPED, + COMSIG_ITEM_ATTACK, + COMSIG_TRANSFORMING_ON_TRANSFORM, + )) + +/datum/component/jousting/proc/on_examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + examine_list += span_notice("It can be used on a vehicle for jousting, dealing potential knockdowns and additional damage.") + +/datum/component/jousting/proc/on_transform(obj/item/source, mob/user, active) + SIGNAL_HANDLER + if(!user) + return + if(active) + INVOKE_ASYNC(src, PROC_REF(on_equip), source, user) + else + INVOKE_ASYNC(src, PROC_REF(on_drop), source, user) + +///Called when a mob equips the spear, registers them as the holder and checks their signals for moving. /datum/component/jousting/proc/on_equip(datum/source, mob/user, slot) SIGNAL_HANDLER + if(current_holder) + INVOKE_ASYNC(src, PROC_REF(on_drop), source, user) - RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(mob_move), TRUE) current_holder = user + RegisterSignal(current_holder, COMSIG_MOVABLE_MOVED, PROC_REF(mob_move), TRUE) /datum/component/jousting/proc/on_drop(datum/source, mob/user) SIGNAL_HANDLER + if(!current_holder) + return - UnregisterSignal(user, COMSIG_MOVABLE_MOVED) + reset_charge() + UnregisterSignal(current_holder, COMSIG_MOVABLE_MOVED) current_holder = null - current_direction = NONE - current_tile_charge = 0 +/** + * Performs the actual attack, handling damage/knockdown depending on how far you've jousted. + * We deduct the minimum tile charge from the current tile charge to get what will actually be buffed + * So your charge will only get benefits from each extra tile after the minimum (and before the maximum). + */ /datum/component/jousting/proc/on_attack(datum/source, mob/living/target, mob/user) SIGNAL_HANDLER - - if(user != current_holder) + if(user != current_holder || !user.buckled) return - var/current = current_tile_charge - var/obj/item/I = parent - var/target_buckled = target.buckled ? TRUE : FALSE //we don't need the reference of what they're buckled to, just whether they are. - if((requires_mount && ((requires_mob_riding && !ismob(user.buckled)) || (!user.buckled))) || !current_direction || (current_tile_charge < min_tile_charge)) + var/usable_charge = (current_tile_charge - min_tile_charge) + if(!current_direction || (usable_charge <= 0)) return + var/turf/target_turf = get_step(user, current_direction) if(target in range(1, target_turf)) - var/knockdown_chance = (target_buckled? mounted_knockdown_chance_per_tile : unmounted_knockdown_chance_per_tile) * current - var/knockdown_time = (target_buckled? mounted_knockdown_time : unmounted_knockdown_time) - var/damage = (target_buckled? mounted_damage_boost_per_tile : unmounted_damage_boost_per_tile) * current - var/sharp = I.get_sharpness() - var/msg - 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) + var/obj/item/parent_item = parent + var/sharp = parent_item.get_sharpness() + var/msg = "[user] [sharp ? "impales" : "slams into"] [target] [sharp ? "on" : "with"] their [parent]" + target.apply_damage((damage_boost_per_tile * usable_charge), BRUTE, user.zone_selected, 0) + if(prob(knockdown_chance_per_tile * usable_charge)) + msg += " and knocks [target] [target.buckled ? "off of [target.buckled]" : "down"]" + if(target.buckled) target.buckled.unbuckle_mob(target) target.Paralyze(knockdown_time) - if(length(msg)) - user.visible_message(span_danger("[msg]!")) + user.visible_message(span_danger("[msg]!")) +/** + * Called when a mob moves. + * Handles checking their direction, changing it if they turned, + * and increments how many tiles they've been charging for. + * Lastly, refreshes their charge reset timer, giving them a new one instead. + */ /datum/component/jousting/proc/mob_move(datum/source, newloc, dir) SIGNAL_HANDLER - if(!current_holder || (requires_mount && ((requires_mob_riding && !ismob(current_holder.buckled)) || (!current_holder.buckled)))) + if(!current_holder) + CRASH("[src] called mob_move despite supposedly not having a mob registed to joust as.") + if(!current_holder.buckled) return + if(dir != current_direction) - current_tile_charge = 0 + current_tile_charge = initial(current_tile_charge) current_direction = dir if(current_tile_charge < max_tile_charge) current_tile_charge++ - if(current_timerid) - deltimer(current_timerid) - current_timerid = addtimer(CALLBACK(src, PROC_REF(reset_charge)), movement_reset_tolerance, TIMER_STOPPABLE) + addtimer(CALLBACK(src, PROC_REF(reset_charge)), MOVEMENT_RESET_COOLDOWN_TIME, TIMER_UNIQUE | TIMER_OVERRIDE) +/** + * reset charge + * + * Resets their direction and tile charge back to their initial values. + * This is used when someone is no longer jousting and it should cleanup. + */ /datum/component/jousting/proc/reset_charge() - current_tile_charge = 0 + current_direction = initial(current_direction) + current_tile_charge = initial(current_tile_charge) + +#undef MOVEMENT_RESET_COOLDOWN_TIME diff --git a/code/datums/components/keep_me_secure.dm b/code/datums/components/keep_me_secure.dm index 903d3bf1d5dad..9bce3ab5e862e 100644 --- a/code/datums/components/keep_me_secure.dm +++ b/code/datums/components/keep_me_secure.dm @@ -22,6 +22,11 @@ src.secured_callback = secured_callback src.unsecured_callback = unsecured_callback +/datum/component/keep_me_secure/Destroy(force, silent) + secured_callback = null + unsecured_callback = null + return ..() + /datum/component/keep_me_secure/RegisterWithParent() last_move = world.time if (secured_callback || unsecured_callback) diff --git a/code/datums/components/label.dm b/code/datums/components/label.dm index 4d95be84b1932..24b01ee52a3a9 100644 --- a/code/datums/components/label.dm +++ b/code/datums/components/label.dm @@ -83,9 +83,13 @@ /datum/component/label/proc/apply_label() var/atom/owner = parent owner.name += " ([label_name])" + ADD_TRAIT(owner, TRAIT_HAS_LABEL, REF(src)) + owner.update_appearance(UPDATE_ICON) /// Removes the label from the parent's name /datum/component/label/proc/remove_label() var/atom/owner = parent owner.name = replacetext(owner.name, "([label_name])", "") // Remove the label text from the parent's name, wherever it's located. owner.name = trim(owner.name) // Shave off any white space from the beginning or end of the parent's name. + REMOVE_TRAIT(owner, TRAIT_HAS_LABEL, REF(src)) + owner.update_appearance(UPDATE_ICON) diff --git a/code/datums/components/leash.dm b/code/datums/components/leash.dm new file mode 100644 index 0000000000000..d04a482dbf66c --- /dev/null +++ b/code/datums/components/leash.dm @@ -0,0 +1,181 @@ +/// Keeps the parent within the distance of its owner as naturally as possible, +/// but teleporting if necessary. +/datum/component/leash + /// The owner of the leash. If this is qdeleted, the leash is as well. + var/atom/movable/owner + + /// The maximum distance you can move from your owner + var/distance + + /// The object type to create on the old turf when forcibly teleporting out + var/force_teleport_out_effect + + /// The object type to create on the new turf when forcibly teleporting out + var/force_teleport_in_effect + + VAR_PRIVATE + // Pathfinding can yield, so only move us closer if this is the best one + current_path_tick = 0 + last_completed_path_tick = 0 + + performing_path_move = FALSE + +/datum/component/leash/Initialize( + atom/movable/owner, + distance = 3, + force_teleport_out_effect, + force_teleport_in_effect, +) + . = ..() + + if (!ismovable(parent)) + stack_trace("Parent must be a movable") + return COMPONENT_INCOMPATIBLE + + if (!ismovable(owner)) + stack_trace("[owner] (owner) is not a movable") + return COMPONENT_INCOMPATIBLE + + if (!isnum(distance)) + stack_trace("[distance] (distance) must be a number") + return COMPONENT_INCOMPATIBLE + + if (!isnull(force_teleport_out_effect) && !ispath(force_teleport_out_effect)) + stack_trace("force_teleport_out_effect must be null or a path, not [force_teleport_out_effect]") + return COMPONENT_INCOMPATIBLE + + if (!isnull(force_teleport_in_effect) && !ispath(force_teleport_in_effect)) + stack_trace("force_teleport_in_effect must be null or a path, not [force_teleport_in_effect]") + return COMPONENT_INCOMPATIBLE + + src.owner = owner + src.distance = distance + src.force_teleport_out_effect = force_teleport_out_effect + src.force_teleport_in_effect = force_teleport_in_effect + + RegisterSignal(owner, COMSIG_QDELETING, PROC_REF(on_owner_qdel)) + + var/static/list/container_connections = list( + COMSIG_MOVABLE_MOVED = PROC_REF(on_owner_moved), + ) + + AddComponent(/datum/component/connect_containers, owner, container_connections) + RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(on_owner_moved)) + RegisterSignal(parent, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_parent_pre_move)) + + check_distance() + +/datum/component/leash/Destroy() + owner = null + return ..() + +/datum/component/leash/proc/set_distance(distance) + ASSERT(isnum(distance)) + src.distance = distance + check_distance() + +/datum/component/leash/proc/on_owner_qdel() + SIGNAL_HANDLER + PRIVATE_PROC(TRUE) + + qdel(src) + +/datum/component/leash/proc/on_owner_moved(atom/movable/source) + SIGNAL_HANDLER + PRIVATE_PROC(TRUE) + + check_distance() + +/datum/component/leash/proc/on_parent_pre_move(atom/movable/source, atom/new_location) + SIGNAL_HANDLER + PRIVATE_PROC(TRUE) + + if (performing_path_move) + return NONE + + var/turf/new_location_turf = get_turf(new_location) + if (get_dist(new_location_turf, owner) <= distance) + return NONE + + if (ismob(source)) + source.balloon_alert(source, "too far!") + + return COMPONENT_MOVABLE_BLOCK_PRE_MOVE + +/datum/component/leash/proc/check_distance() + set waitfor = FALSE + PRIVATE_PROC(TRUE) + + if (get_dist(parent, owner) <= distance) + return + + SEND_SIGNAL(parent, COMSIG_LEASH_PATH_STARTED) + + current_path_tick += 1 + var/our_path_tick = current_path_tick + + var/list/path = get_path_to(parent, owner, mintargetdist = distance) + + if (last_completed_path_tick > our_path_tick) + return + + last_completed_path_tick = our_path_tick + + commit_path(path) + +/datum/component/leash/proc/commit_path(list/turf/path) + SHOULD_NOT_SLEEP(TRUE) + PRIVATE_PROC(TRUE) + + performing_path_move = TRUE + + var/atom/movable/movable_parent = parent + + for (var/turf/to_move as anything in path) + // Could be an older path, don't make us teleport back + if (!to_move.Adjacent(parent)) + continue + + if (!movable_parent.Move(to_move)) + force_teleport_back("bad path step") + performing_path_move = FALSE + return + + if (get_dist(parent, owner) > distance) + force_teleport_back("incomplete path") + + performing_path_move = FALSE + SEND_SIGNAL(parent, COMSIG_LEASH_PATH_COMPLETE) + +/datum/component/leash/proc/force_teleport_back(reason) + PRIVATE_PROC(TRUE) + + var/atom/movable/movable_parent = parent + + SSblackbox.record_feedback("tally", "leash_force_teleport_back", 1, reason) + + if (force_teleport_out_effect) + new force_teleport_out_effect(movable_parent.loc) + + movable_parent.forceMove(get_turf(owner)) + + if (force_teleport_in_effect) + new force_teleport_in_effect(movable_parent.loc) + + if (ismob(movable_parent)) + movable_parent.balloon_alert(movable_parent, "moved out of range!") + + SEND_SIGNAL(parent, COMSIG_LEASH_FORCE_TELEPORT) + +/// A debug spawner that will create a corgi leashed to a bike horn, plus a beam +/obj/effect/spawner/debug_leash + +/obj/effect/spawner/debug_leash/Initialize(mapload) + . = ..() + + var/obj/item/bikehorn/bike_horn = new(loc) + var/mob/living/basic/pet/dog/corgi/corgi = new(loc) + + corgi.AddComponent(/datum/component/leash, bike_horn) + + corgi.Beam(bike_horn) diff --git a/code/datums/components/ling_decoy_brain.dm b/code/datums/components/ling_decoy_brain.dm new file mode 100644 index 0000000000000..7bcb4e38c8f63 --- /dev/null +++ b/code/datums/components/ling_decoy_brain.dm @@ -0,0 +1,68 @@ +/// Component applied to ling brains to make them into decoy brains, as ling brains are vestigial and don't do anything +/datum/component/ling_decoy_brain + /// The ling this brain is linked to + VAR_FINAL/datum/antagonist/changeling/parent_ling + /// A talk action that is granted to the ling when this decoy enters an MMI + VAR_FINAL/datum/action/changeling/mmi_talk/talk_action + +/datum/component/ling_decoy_brain/Initialize(datum/antagonist/changeling/ling) + if(!istype(parent, /obj/item/organ/internal/brain)) + return COMPONENT_INCOMPATIBLE + if(isnull(ling)) + stack_trace("[type] instantiated without a changeling to link to.") + return COMPONENT_INCOMPATIBLE + + parent_ling = ling + RegisterSignal(parent_ling, COMSIG_QDELETING, PROC_REF(clear_decoy)) + +/datum/component/ling_decoy_brain/Destroy() + UnregisterSignal(parent_ling, COMSIG_QDELETING) + parent_ling = null + QDEL_NULL(talk_action) + return ..() + +/datum/component/ling_decoy_brain/RegisterWithParent() + var/obj/item/organ/internal/brain/ling_brain = parent + ling_brain.organ_flags &= ~ORGAN_VITAL + ling_brain.decoy_override = TRUE + RegisterSignal(ling_brain, COMSIG_ATOM_ENTERING, PROC_REF(entered_mmi)) + +/datum/component/ling_decoy_brain/UnregisterFromParent() + var/obj/item/organ/internal/brain/ling_brain = parent + ling_brain.organ_flags |= ORGAN_VITAL + ling_brain.decoy_override = FALSE + UnregisterSignal(ling_brain, COMSIG_ATOM_ENTERING, PROC_REF(entered_mmi)) + +/** + * Signal proc for [COMSIG_ATOM_ENTERING], when the brain enters an MMI grant the MMI talk action to the ling + * + * Unfortunately this is hooked on Entering rather than its own dedicated MMI signal becuase MMI code is a fuck + */ +/datum/component/ling_decoy_brain/proc/entered_mmi(obj/item/organ/internal/brain/source, atom/entering, atom/old_loc, ...) + SIGNAL_HANDLER + + var/mob/living/the_real_ling = parent_ling.owner.current + if(!istype(the_real_ling)) + return + + if(istype(source.loc, /obj/item/mmi) && talk_action?.owner != the_real_ling) + if(isnull(talk_action)) + talk_action = new() // Not linked to anything, we manage the reference (and don't want it disappearing on us) + talk_action.brain_ref = source + + if(the_real_ling.key) + to_chat(the_real_ling, span_ghostalert("We detect our decoy brain has been placed within a Man-Machine Interface. \ + We can use the \"MMI Talk\" action to command it to speak.")) + else + the_real_ling.notify_ghost_cloning("Your decoy brain has been placed in an MMI, re-enter your body to talk via it!", source = the_real_ling, flashwindow = TRUE) + talk_action.Grant(the_real_ling) + + else if(talk_action?.owner == the_real_ling) + to_chat(the_real_ling, span_ghostalert("We can no longer detect our decoy brain.")) + talk_action.Remove(the_real_ling) + +/// Clear up the decoy if the ling is de-linged +/datum/component/ling_decoy_brain/proc/clear_decoy(datum/source) + SIGNAL_HANDLER + + qdel(src) diff --git a/code/datums/components/lock_on_cursor.dm b/code/datums/components/lock_on_cursor.dm index 1811a13aa9b05..0ccac6ee2f923 100644 --- a/code/datums/components/lock_on_cursor.dm +++ b/code/datums/components/lock_on_cursor.dm @@ -62,12 +62,14 @@ mouse_tracker.assign_to_mob(owner) START_PROCESSING(SSfastprocess, src) -/datum/component/lock_on_cursor/Destroy() +/datum/component/lock_on_cursor/Destroy(force, silent) clear_visuals() STOP_PROCESSING(SSfastprocess, src) mouse_tracker = null var/mob/owner = parent owner.clear_fullscreen("lock_on") + on_lock = null + can_target_callback = null return ..() /// Adds overlays to all targets diff --git a/code/datums/components/magnet.dm b/code/datums/components/magnet.dm new file mode 100644 index 0000000000000..5c78b8665ce80 --- /dev/null +++ b/code/datums/components/magnet.dm @@ -0,0 +1,70 @@ +/// Attracts items of a certain typepath +/datum/component/magnet + /// Range at which to pull items + var/pull_range + /// List of things we attract + var/list/attracted_typecache + /// What to do when we pull something + var/datum/callback/on_pulled + /// What to do when something reaches us + var/datum/callback/on_contact + /// Are we currently working? + var/active = TRUE + +/datum/component/magnet/Initialize( + pull_range = 5, + attracted_typecache = list(/obj/item/kitchen/spoon, /obj/item/kitchen/fork, /obj/item/knife), + on_pulled, + on_contact, +) + . = ..() + if (!length(attracted_typecache)) + CRASH("Attempted to instantiate a [src] on [parent] which does not do anything.") + if (!isatom(parent)) + return COMPONENT_INCOMPATIBLE + + src.pull_range = pull_range + src.attracted_typecache = typecacheof(attracted_typecache) + src.on_pulled = on_pulled + src.on_contact = on_contact + +/datum/component/magnet/RegisterWithParent() + . = ..() + START_PROCESSING(SSdcs, src) + if (!isliving(parent)) + return + RegisterSignal(parent, COMSIG_MOB_STATCHANGE, PROC_REF(toggle_on_stat_change)) + +/datum/component/magnet/UnregisterFromParent() + . = ..() + STOP_PROCESSING(SSdcs, src) + UnregisterSignal(parent, COMSIG_MOB_STATCHANGE) + +/datum/component/magnet/Destroy(force, silent) + STOP_PROCESSING(SSdcs, src) + on_pulled = null + on_contact = null + return ..() + +/// If a mob dies we stop attracting stuff +/datum/component/magnet/proc/toggle_on_stat_change(mob/living/source) + SIGNAL_HANDLER + if (source.stat == DEAD) + STOP_PROCESSING(SSdcs, src) + else + START_PROCESSING(SSdcs, src) + +/datum/component/magnet/process(seconds_per_tick) + for (var/atom/movable/thing in orange(pull_range, parent)) + if (!is_type_in_typecache(thing, attracted_typecache)) + continue + var/range = get_dist(thing, parent) + if (range == 0) + continue + if (range == 1 && !isnull(on_contact)) + on_contact.Invoke(thing) + continue + var/moved = thing.Move(get_step_towards(thing, parent)) + if (moved && !isnull(on_pulled)) + on_pulled.Invoke(thing) + CHECK_TICK diff --git a/code/datums/components/manual_heart.dm b/code/datums/components/manual_heart.dm new file mode 100644 index 0000000000000..09448acfc6722 --- /dev/null +++ b/code/datums/components/manual_heart.dm @@ -0,0 +1,179 @@ +/// If a beat is missed, how long to give before the next is missed +#define MANUAL_HEART_GRACE_PERIOD 2 SECONDS + +/** + * Manual heart pumping component. Requires the holder to pump their heart manually every + * so often or die. + * + * Mainly used by the cursed heart. + */ +/datum/component/manual_heart + /// The action for pumping your heart + var/datum/action/cooldown/manual_heart/pump_action + /// Cooldown before harm is caused to the owner + COOLDOWN_DECLARE(heart_timer) + /// If true, add a screen tint on the next process + var/add_colour = TRUE + /// How long between needed pumps; you can pump one second early + var/pump_delay = 3 SECONDS + /// How much blood volume you lose every missed pump, this is a flat amount not a percentage! + var/blood_loss = BLOOD_VOLUME_NORMAL * 0.2 // 20% of normal volume, missing five pumps is instant death + + //How much to heal per pump - negative numbers harm the owner instead + /// The amount of brute damage to heal per pump + var/heal_brute = 0 + /// The amount of burn damage to heal per pump + var/heal_burn = 0 + /// The amount of oxygen damage to heal per pump + var/heal_oxy = 0 + +/datum/component/manual_heart/Initialize(pump_delay = 3 SECONDS, blood_loss = BLOOD_VOLUME_NORMAL * 0.2, heal_brute = 0, heal_burn = 0, heal_oxy = 0) + //Non-Carbon mobs can't have hearts, and should never receive this component. + if (!iscarbon(parent)) + stack_trace("Manual Heart component added to [parent] ([parent?.type]) which is not a /mob/living/carbon subtype.") + return COMPONENT_INCOMPATIBLE + + src.pump_delay = pump_delay + src.blood_loss = blood_loss + src.heal_brute = heal_brute + src.heal_burn = heal_burn + src.heal_oxy = heal_oxy + + pump_action = new(src) + +/datum/component/manual_heart/Destroy() + QDEL_NULL(pump_action) + return ..() + +/datum/component/manual_heart/RegisterWithParent() + RegisterSignal(parent, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(check_removed_organ)) + RegisterSignal(parent, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(check_added_organ)) + RegisterSignal(parent, COMSIG_HEART_MANUAL_PULSE, PROC_REF(on_pump)) + RegisterSignals(parent, list(COMSIG_LIVING_DEATH, SIGNAL_ADDTRAIT(TRAIT_NOBLOOD)), PROC_REF(pause)) + RegisterSignals(parent, list(COMSIG_LIVING_REVIVE, SIGNAL_REMOVETRAIT(TRAIT_NOBLOOD)), PROC_REF(restart)) + + pump_action.cooldown_time = pump_delay - (1 SECONDS) //you can pump up to a second early + pump_action.Grant(parent) + + var/mob/living/carbon/carbon_parent = parent + var/obj/item/organ/internal/heart/parent_heart = carbon_parent.get_organ_slot(ORGAN_SLOT_HEART) + if(parent_heart && !HAS_TRAIT(carbon_parent, TRAIT_NOBLOOD) && carbon_parent.stat != DEAD) + START_PROCESSING(SSdcs, src) + COOLDOWN_START(src, heart_timer, pump_delay) + + to_chat(parent, span_userdanger("Your heart no longer beats automatically! You have to pump it manually - otherwise you'll die!")) + +/datum/component/manual_heart/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_CARBON_GAIN_ORGAN, COMSIG_CARBON_LOSE_ORGAN, COMSIG_HEART_MANUAL_PULSE, COMSIG_LIVING_REVIVE, COMSIG_LIVING_DEATH, SIGNAL_ADDTRAIT(TRAIT_NOBLOOD), SIGNAL_REMOVETRAIT(TRAIT_NOBLOOD))) + + to_chat(parent, span_userdanger("You feel your heart start beating normally again!")) + var/mob/living/carbon/carbon_parent = parent + if(istype(carbon_parent)) + carbon_parent.remove_client_colour(/datum/client_colour/manual_heart_blood) + +/datum/component/manual_heart/proc/restart() + SIGNAL_HANDLER + + if(!check_valid()) + return + COOLDOWN_START(src, heart_timer, pump_delay) + pump_action.build_all_button_icons(UPDATE_BUTTON_STATUS) //make sure the action button always shows as available when it is + START_PROCESSING(SSdcs, src) + +/datum/component/manual_heart/proc/pause() + SIGNAL_HANDLER + pump_action.build_all_button_icons(UPDATE_BUTTON_STATUS) + var/mob/living/carbon/carbon_parent = parent + if(istype(carbon_parent)) + carbon_parent.remove_client_colour(/datum/client_colour/manual_heart_blood) //prevents red overlay from getting stuck + STOP_PROCESSING(SSdcs, src) + +/// Worker proc that checks logic for if a pump can happen, and applies effects from doing so +/datum/component/manual_heart/proc/on_pump(mob/owner) + COOLDOWN_START(src, heart_timer, pump_delay) + playsound(owner,'sound/effects/singlebeat.ogg', 40, TRUE) + + var/mob/living/carbon/carbon_owner = owner + + if(HAS_TRAIT(carbon_owner, TRAIT_NOBLOOD)) + return + carbon_owner.blood_volume = min(carbon_owner.blood_volume + (blood_loss * 0.5), BLOOD_VOLUME_MAXIMUM) + carbon_owner.remove_client_colour(/datum/client_colour/manual_heart_blood) + add_colour = TRUE + carbon_owner.adjustBruteLoss(-heal_brute) + carbon_owner.adjustFireLoss(-heal_burn) + carbon_owner.adjustOxyLoss(-heal_oxy) + +/datum/component/manual_heart/process() + var/mob/living/carbon/carbon_parent = parent + + //If they aren't connected, don't kill them. + if(!carbon_parent.client) + COOLDOWN_START(src, heart_timer, pump_delay) + return + + if(!COOLDOWN_FINISHED(src, heart_timer)) + return + + carbon_parent.blood_volume = max(carbon_parent.blood_volume - blood_loss, 0) + to_chat(carbon_parent, span_userdanger("You have to keep pumping your blood!")) + COOLDOWN_START(src, heart_timer, MANUAL_HEART_GRACE_PERIOD) //give two full seconds before losing more blood + if(add_colour) + carbon_parent.add_client_colour(/datum/client_colour/manual_heart_blood) + add_colour = FALSE + +///If a new heart is added, start processing. +/datum/component/manual_heart/proc/check_added_organ(mob/organ_owner, obj/item/organ/new_organ) + SIGNAL_HANDLER + + var/obj/item/organ/internal/heart/new_heart = new_organ + + if(!istype(new_heart) || !check_valid()) + return + COOLDOWN_START(src, heart_timer, pump_delay) + pump_action.build_all_button_icons(UPDATE_BUTTON_STATUS) + var/mob/living/carbon/carbon_parent = parent + if(istype(carbon_parent)) + carbon_parent.remove_client_colour(/datum/client_colour/manual_heart_blood) //prevents red overlay from getting stuck + START_PROCESSING(SSdcs, src) + +///If the heart is removed, stop processing. +/datum/component/manual_heart/proc/check_removed_organ(mob/organ_owner, obj/item/organ/removed_organ) + SIGNAL_HANDLER + + var/obj/item/organ/internal/heart/removed_heart = removed_organ + + if(istype(removed_heart)) + pump_action.build_all_button_icons(UPDATE_BUTTON_STATUS) + STOP_PROCESSING(SSdcs, src) + +///Helper proc to check if processing can be restarted. +/datum/component/manual_heart/proc/check_valid() + var/mob/living/carbon/carbon_parent = parent + var/obj/item/organ/internal/heart/parent_heart = carbon_parent.get_organ_slot(ORGAN_SLOT_HEART) + return !isnull(parent_heart) && !HAS_TRAIT(carbon_parent, TRAIT_NOBLOOD) && carbon_parent.stat != DEAD + +///Action to pump your heart. Cooldown will always be set to 1 second less than the pump delay. +/datum/action/cooldown/manual_heart + name = "Pump your blood" + cooldown_time = 2 SECONDS + check_flags = NONE + button_icon = 'icons/obj/medical/organs/organs.dmi' + button_icon_state = "cursedheart-off" + +/datum/action/cooldown/manual_heart/Activate(atom/atom_target) + . = ..() + + SEND_SIGNAL(owner, COMSIG_HEART_MANUAL_PULSE) + +///The action button is only available when you're a living carbon with blood and a heart. +/datum/action/cooldown/manual_heart/IsAvailable(feedback = FALSE) + var/mob/living/carbon/heart_haver = owner + if(!istype(heart_haver) || HAS_TRAIT(heart_haver, TRAIT_NOBLOOD) || heart_haver.stat == DEAD) + return FALSE + var/obj/item/organ/internal/heart/heart_havers_heart = heart_haver.get_organ_slot(ORGAN_SLOT_HEART) + if(isnull(heart_havers_heart)) + return FALSE + return ..() + +#undef MANUAL_HEART_GRACE_PERIOD diff --git a/code/datums/components/material/material_container.dm b/code/datums/components/material/material_container.dm new file mode 100644 index 0000000000000..d26e427b1db44 --- /dev/null +++ b/code/datums/components/material/material_container.dm @@ -0,0 +1,686 @@ +/*! + This datum should be used for handling mineral contents of machines and whatever else is supposed to hold minerals and make use of them. + + Variables: + amount - raw amount of the mineral this container is holding, calculated by the defined value SHEET_MATERIAL_AMOUNT=SHEET_MATERIAL_AMOUNT. + max_amount - max raw amount of mineral this container can hold. + sheet_type - type of the mineral sheet the container handles, used for output. + parent - object that this container is being used by, used for output. + MAX_STACK_SIZE - size of a stack of mineral sheets. Constant. +*/ + +/datum/component/material_container + /// The maximum amount of materials this material container can contain + var/max_amount + /// Map of material ref -> amount + var/list/materials //Map of key = material ref | Value = amount + /// The list of materials that this material container can accept + var/list/allowed_materials + /// The typecache of things that this material container can accept + var/list/allowed_item_typecache + /// Whether or not this material container allows specific amounts from sheets to be inserted + var/precise_insertion = FALSE + /// The material container flags. See __DEFINES/materials.dm. + var/mat_container_flags + /// Signals that are registered with this contained + var/list/registered_signals + +/// Sets up the proper signals and fills the list of materials with the appropriate references. +/datum/component/material_container/Initialize( + list/init_mats, + max_amt = 0, + _mat_container_flags = NONE, + list/allowed_mats = init_mats, + list/allowed_items, + list/container_signals + ) + + if(!isatom(parent)) + return COMPONENT_INCOMPATIBLE + + materials = list() + max_amount = max(0, max_amt) + mat_container_flags = _mat_container_flags + + allowed_materials = allowed_mats || list() + if(allowed_items) + if(ispath(allowed_items) && allowed_items == /obj/item/stack) + allowed_item_typecache = GLOB.typecache_stack + else + allowed_item_typecache = typecacheof(allowed_items) + + for(var/mat in init_mats) //Make the assoc list material reference -> amount + var/mat_ref = GET_MATERIAL_REF(mat) + if(isnull(mat_ref)) + continue + var/mat_amt = init_mats[mat] + if(isnull(mat_amt)) + mat_amt = 0 + materials[mat_ref] += mat_amt + + //all user handled signals + if(length(container_signals)) + for(var/signal in container_signals) + parent.RegisterSignal(src, signal, container_signals[signal]) + + if(_mat_container_flags & MATCONTAINER_NO_INSERT) + return + + var/atom/atom_target = parent + atom_target.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1 + + RegisterSignal(atom_target, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_requesting_context_from_item)) + +/datum/component/material_container/Destroy(force, silent) + retrieve_all() + materials = null + allowed_materials = null + return ..() + +/datum/component/material_container/RegisterWithParent() + . = ..() + + if(!(mat_container_flags & MATCONTAINER_NO_INSERT)) + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attackby)) + if(mat_container_flags & MATCONTAINER_EXAMINE) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + +/datum/component/material_container/proc/on_examine(datum/source, mob/user, list/examine_texts) + SIGNAL_HANDLER + + for(var/I in materials) + var/datum/material/M = I + var/amt = materials[I] / SHEET_MATERIAL_AMOUNT + if(amt) + examine_texts += span_notice("It has [amt] sheets of [lowertext(M.name)] stored.") + +/datum/component/material_container/vv_edit_var(var_name, var_value) + var/old_flags = mat_container_flags + . = ..() + if(var_name == NAMEOF(src, mat_container_flags) && parent) + if(!(old_flags & MATCONTAINER_EXAMINE) && mat_container_flags & MATCONTAINER_EXAMINE) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + else if(old_flags & MATCONTAINER_EXAMINE && !(mat_container_flags & MATCONTAINER_EXAMINE)) + UnregisterSignal(parent, COMSIG_ATOM_EXAMINE) + + if(old_flags & MATCONTAINER_NO_INSERT && !(mat_container_flags & MATCONTAINER_NO_INSERT)) + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attackby)) + else if(!(old_flags & MATCONTAINER_NO_INSERT) && mat_container_flags & MATCONTAINER_NO_INSERT) + UnregisterSignal(parent, COMSIG_ATOM_ATTACKBY) + +/** + * 3 Types of Procs + * Material Insertion : Insert materials into the container + * Material Validation : Checks how much materials are available, Extracts materials from items if the container can hold them + * Material Removal : Removes material from the container + * + * Each Proc furthur belongs to a specific category + * LOW LEVEL: Procs that are used internally & should not be used anywhere else unless you know what your doing + * MID LEVEL: Procs that can be used by machines(like recycler, stacking machines) to bypass majority of checks + * HIGH LEVEL: Procs that can be used by anyone publically and guarentees safty checks & limits + */ + +//================================Material Insertion procs============================== + +//======================================LOW LEVEL========================================= +/** + * Inserts the relevant materials from an item into this material container. + * This low level proc should not be used directly by anyone + * + * Arguments: + * - [source][/obj/item]: The source of the materials we are inserting. + * - multiplier: The multiplier for the materials extract from this item being inserted. + * - breakdown_flags: The breakdown bitflags that will be used to retrieve the materials from the source + * - context: the atom performing the operation, this is the last argument sent in COMSIG_MATCONTAINER_ITEM_CONSUMED and is used mostly for silo logging + */ +/datum/component/material_container/proc/insert_item_materials(obj/item/source, multiplier = 1, breakdown_flags = mat_container_flags, atom/context = parent) + var/primary_mat + var/max_mat_value = 0 + var/material_amount = 0 + + var/list/item_materials = source.get_material_composition(breakdown_flags) + var/list/mats_consumed = list() + for(var/MAT in item_materials) + if(!can_hold_material(MAT)) + continue + var/mat_amount = OPTIMAL_COST(item_materials[MAT] * multiplier) + materials[MAT] += mat_amount + if(item_materials[MAT] > max_mat_value) + max_mat_value = item_materials[MAT] + primary_mat = MAT + mats_consumed[MAT] = mat_amount + material_amount += mat_amount + if(length(mats_consumed)) + SEND_SIGNAL(src, COMSIG_MATCONTAINER_ITEM_CONSUMED, source, primary_mat, mats_consumed, material_amount, context) + + return primary_mat +//=================================================================================== + + +//===============================MID LEVEL=================================================== +/** + * For inserting an amount of material. Use this to add materials to the container directly + * + * Arguments: + * - amt: amount of said material to insert + * - mat: the material type to insert + */ +/datum/component/material_container/proc/insert_amount_mat(amt, datum/material/mat) + if(amt <= 0) + return 0 + amt = OPTIMAL_COST(amt) + if(!has_space(amt)) + return 0 + + var/total_amount_saved = total_amount() + if(mat) + if(!istype(mat)) + mat = GET_MATERIAL_REF(mat) + materials[mat] += amt + else + var/num_materials = length(materials) + if(!num_materials) + return 0 + + amt /= num_materials + for(var/i in materials) + materials[i] += amt + return (total_amount() - total_amount_saved) + +/** + * Proc specifically for inserting items, use this when you want to insert any item into the container + * this bypasses most of the material flag checks so much be used by machines like recycler, stacking machine etc that + * does not care for such checks + * + * Arguments: + * - [weapon][obj/item]: the item you are trying to insert + * - multiplier: The multiplier for the materials being inserted + * - breakdown_flags: The breakdown bitflags that will be used to retrieve the materials from the source + * - context: the atom performing the operation, this is the last argument sent in COMSIG_MATCONTAINER_ITEM_CONSUMED and is used mostly for silo logging + */ +/datum/component/material_container/proc/insert_item(obj/item/weapon, multiplier = 1, breakdown_flags = mat_container_flags, atom/context = parent) + if(QDELETED(weapon)) + return MATERIAL_INSERT_ITEM_NO_MATS + multiplier = CEILING(multiplier, 0.01) + + var/obj/item/target = weapon + + var/material_amount = OPTIMAL_COST(get_item_material_amount(target, breakdown_flags) * multiplier) + if(!material_amount) + return MATERIAL_INSERT_ITEM_NO_MATS + var/obj/item/stack/item_stack + if(isstack(weapon) && !has_space(material_amount)) //not enough space split and feed as many sheets possible + item_stack = weapon + var/space_left = max_amount - total_amount() + if(!space_left) + return MATERIAL_INSERT_ITEM_NO_SPACE + var/material_per_sheet = material_amount / item_stack.amount + var/sheets_to_insert = round(space_left / material_per_sheet) + if(!sheets_to_insert) + return MATERIAL_INSERT_ITEM_NO_SPACE + target = fast_split_stack(item_stack, sheets_to_insert) + material_amount = get_item_material_amount(target, breakdown_flags) * multiplier + material_amount = OPTIMAL_COST(material_amount) + + //not enough space, time to bail + if(!has_space(material_amount)) + return MATERIAL_INSERT_ITEM_NO_SPACE + + //do the insert + var/last_inserted_id = insert_item_materials(target, multiplier, breakdown_flags, context) + if(!isnull(last_inserted_id)) + qdel(target) //item gone + return material_amount + else if(!isnull(item_stack) && item_stack != target) //insertion failed, merge the split stack back into the original + var/obj/item/stack/inserting_stack = target + item_stack.add(inserting_stack.amount) + qdel(inserting_stack) + + return MATERIAL_INSERT_ITEM_FAILURE +//============================================================================================ + + +//===================================HIGH LEVEL=================================================== +/** + * inserts an item from the players hand into the container. Loops through all the contents inside reccursively + * Does all explicit checking for mat flags & callbacks to check if insertion is valid + * This proc is what you should be using for almost all cases + * + * Arguments: + * * held_item - the item to insert + * * user - the mob inserting this item + * * breakdown_flags - how this item and all it's contents inside are broken down during insertion. This is unique to the machine doing the insertion + * * context - the atom performing the operation, this is the last argument sent in COMSIG_MATCONTAINER_ITEM_CONSUMED and is used mostly for silo logging + */ +/datum/component/material_container/proc/user_insert(obj/item/held_item, mob/living/user, breakdown_flags = mat_container_flags, atom/context = parent) + set waitfor = FALSE + . = 0 + + //differs from held_item when using TK + var/active_held = user.get_active_held_item() + //don't attack the machine + if(!(mat_container_flags & MATCONTAINER_ANY_INTENT) && user.combat_mode) + return + //can't allow abstract, hologram items + if((held_item.item_flags & ABSTRACT) || (held_item.flags_1 & HOLOGRAM_1)) + return + //untouchable + if(held_item.resistance_flags & INDESTRUCTIBLE) + return + //user defined conditions + if(SEND_SIGNAL(src, COMSIG_MATCONTAINER_PRE_USER_INSERT, held_item, user) & MATCONTAINER_BLOCK_INSERT) + return + + //get all contents of this item reccursively + var/list/contents = held_item.get_all_contents_type(/obj/item) + //anything that isn't a stack cannot be split so find out if we have enough space, we don't want to consume half the contents of an object & leave it in a broken state + if(!isstack(held_item)) + var/total_amount = 0 + for(var/obj/item/weapon in contents) + total_amount += get_item_material_amount(weapon, breakdown_flags) + if(!has_space(total_amount)) + to_chat(user, span_warning("[parent] doesn't have enough space for [held_item] [contents.len > 1 ? "And it's contents" : ""]!")) + return + + /** + * to reduce chat spams we group all messages and print them after everything is over + * usefull when we are trying to insert all stock parts of an RPED into the autolathe for example + */ + var/list/inserts = list() + var/list/errors = list() + + //loop through all contents inside this atom and salvage their material as well but in reverse so we don't delete parents before processing their children + for(var/i = length(contents); i >= 1 ; i--) + var/obj/item/target = contents[i] + + //not a solid subtype or an hologram + if((target.item_flags & ABSTRACT) || (target.flags_1 & HOLOGRAM_1)) + continue + + //item is either not allowed for redemption, not in the allowed types + if((target.item_flags & NO_MAT_REDEMPTION) || (allowed_item_typecache && !is_type_in_typecache(target, allowed_item_typecache))) + if(!(mat_container_flags & MATCONTAINER_SILENT)) + to_chat(user, span_warning("[parent] won't accept [target]!")) + continue + + //untouchable, move it out the way, code copied from recycler + if(target.resistance_flags & INDESTRUCTIBLE) + if(!isturf(target.loc) && !isliving(target.loc)) + target.forceMove(get_turf(parent)) + continue + + //if stack, check if we want to read precise amount of sheets to insert + var/obj/item/stack/item_stack = null + if(isstack(target) && precise_insertion) + var/atom/current_parent = parent + item_stack = target + var/requested_amount = tgui_input_number(user, "How much do you want to insert?", "Inserting [item_stack.singular_name]s", item_stack.amount, item_stack.amount) + if(!requested_amount || QDELETED(target) || QDELETED(user) || QDELETED(src)) + continue + if(parent != current_parent || user.get_active_held_item() != active_held) + continue + if(requested_amount != item_stack.amount) //only split if its not the whole amount + target = fast_split_stack(item_stack, requested_amount) //split off the requested amount + requested_amount = 0 + + //is this item a stack and was it split by the player? + var/was_stack_split = !isnull(item_stack) && item_stack != target + //if it was split then item_stack has the reference to the original stack/item + var/original_item = was_stack_split ? item_stack : target + //if this item is not the one the player is holding then don't remove it from their hand + if(original_item != active_held) + original_item = null + if(!isnull(original_item) && !user.temporarilyRemoveItemFromInventory(original_item)) //remove from hand(if split remove the original stack else the target) + to_chat(user, span_warning("[held_item] is stuck to you and cannot be placed into [parent].")) + return + + //insert the item + var/item_name = target.name + var/inserted = insert_item(target, 1, mat_container_flags, context) + if(inserted > 0) + . += inserted + inserted /= SHEET_MATERIAL_AMOUNT // display units inserted as sheets for improved readability + var/message = null + + //stack was either split by the container(!QDELETED(target) means the container only consumed a part of it) or by the player, put whats left back of the original stack back in players hand + if((!QDELETED(target) || was_stack_split)) + + //stack was split by player and that portion was not fully consumed, merge whats left back with the original stack + if(!QDELETED(target) && was_stack_split) + var/obj/item/stack/inserting_stack = target + item_stack.add(inserting_stack.amount) + qdel(inserting_stack) + + //was this the original item in the players hand? put what's left back in the player's hand + if(!isnull(original_item)) + user.put_in_active_hand(original_item) + message = "Only [inserted] sheets of [item_name] was consumed by [parent]." + + //collect all messages to print later + if(!message) + message = "[item_name] worth [inserted] sheets of material was consumed by [parent]." + if(inserts[message]) + inserts[message] += 1 + else + inserts[message] = 1 + else + var/error_msg + if(inserted == MATERIAL_INSERT_ITEM_NO_SPACE) + error_msg = "[parent] has insufficient space to accept [target]" + else if(inserted == MATERIAL_INSERT_ITEM_NO_MATS) + error_msg = "[target] has insufficient materials to be accepted by [parent]" + else + error_msg = "[parent] refuses to accept [target]" + + //collect all messages to print later + if(errors[error_msg]) + errors[error_msg] += 1 + else + errors[error_msg] = 1 + + //player split the stack by the requested amount but even that split amount could not be salvaged. merge it back with the original + if(!isnull(item_stack) && was_stack_split) + var/obj/item/stack/inserting_stack = target + item_stack.add(inserting_stack.amount) + qdel(inserting_stack) + + //was this the original item in the players hand? put it back because we coudn't salvage it + if(!isnull(original_item)) + user.put_in_active_hand(original_item) + + //print successfull inserts + for(var/success_msg in inserts) + var/count = inserts[success_msg] + for(var/i in 1 to count) + to_chat(user, span_notice(success_msg)) + + //print errors last + for(var/error_msg in errors) + var/count = errors[error_msg] + for(var/i in 1 to count) + to_chat(user, span_warning(error_msg)) + +/// Proc that allows players to fill the parent with mats +/datum/component/material_container/proc/on_attackby(datum/source, obj/item/weapon, mob/living/user) + SIGNAL_HANDLER + + user_insert(weapon, user) + + return COMPONENT_NO_AFTERATTACK +//=============================================================================================== + + +//======================================Material Validation======================================= + +//=========================================LOW LEVEL=================================== +/** + * Proc that returns TRUE if the container has space + * + * Arguments: + * - amt: can this container hold this much amount of materials + */ +/datum/component/material_container/proc/has_space(amt = 0) + return (total_amount() + amt) <= max_amount + +/** + * The default check for whether we can add materials to this material container. + * + * Arguments: + * - [mat][/atom/material]: The material we are checking for insertability. + */ +/datum/component/material_container/proc/can_hold_material(datum/material/mat) + if(mat in allowed_materials) + return TRUE + if(istype(mat) && ((mat.id in allowed_materials) || (mat.type in allowed_materials))) + allowed_materials += mat // This could get messy with passing lists by ref... but if you're doing that the list expansion is probably being taken care of elsewhere anyway... + return TRUE + if(SEND_SIGNAL(src, COMSIG_MATCONTAINER_MAT_CHECK, mat) & MATCONTAINER_ALLOW_MAT) + allowed_materials += mat + return TRUE + return FALSE +//======================================================================================== + + +//===================================MID LEVEL============================================= +/** + * Returns the amount of a specific material in this container. + * + * Arguments: + * -[mat][datum/material] : the material type to check for 3 cases + * a) If it's an path its ref is retrieved + * b) If it's text then its an category material & there is no way to deal with it so return 0 + * c) If normal material proceeds as usual + */ +/datum/component/material_container/proc/get_material_amount(datum/material/mat) + if(!istype(mat)) + mat = GET_MATERIAL_REF(mat) + return materials[mat] + +/** + * Returns the amount of material relevant to this container; + * if this container does not support glass, any glass in 'I' will not be taken into account + * + * Arguments: + * - [I][obj/item]: the item whos materials must be retrieved + * - breakdown_flags: how this item must be broken down to retrieve its materials + */ +/datum/component/material_container/proc/get_item_material_amount(obj/item/I, breakdown_flags = mat_container_flags) + if(!istype(I) || !I.custom_materials) + return 0 + var/material_amount = 0 + var/list/item_materials = I.get_material_composition(breakdown_flags) + for(var/MAT in item_materials) + if(!can_hold_material(MAT)) + continue + material_amount += item_materials[MAT] + return material_amount +//================================================================================================ + + +//=========================================HIGH LEVEL========================================== +/// returns the total amount of material in the container +/datum/component/material_container/proc/total_amount() + . = 0 + for(var/i in materials) + . += get_material_amount(i) + +/** + * Returns TRUE if you have enough of the specified material. + * + * Arguments: + * - [req_mat][datum/material]: the material to check for + * - amount: how much material do we need + */ +/datum/component/material_container/proc/has_enough_of_material(datum/material/req_mat, amount = 1) + return get_material_amount(req_mat) >= OPTIMAL_COST(amount) + + +/** + * Checks if its possible to afford a certain amount of materials. Takes a dictionary of materials. + * coefficient can be thought of as the machines efficiency & multiplier as the print quantity + * + * Arguments: + * - mats: list of materials(key=material, value= 1 unit of material) to check for + * - coefficient: scaling applied to 1 unit of material in the mats list + * - multiplier: how many units(after scaling) do we require + */ +/datum/component/material_container/proc/has_materials(list/mats, coefficient = 1, multiplier = 1) + if(!length(mats)) + return FALSE + + for(var/x in mats) //Loop through all required materials + if(!has_enough_of_material(x, OPTIMAL_COST(mats[x] * coefficient) * multiplier))//Not a category, so just check the normal way + return FALSE + + return TRUE +//========================================================================================================== + + +//================================================Material Usage============================================ + +//==================================================LOW LEVEL======================================= +/** + * Uses an amount of a specific material, effectively removing it. + * + * Arguments: + * - amt: amount of said material to use + * - [mat][datum/material]: type of mat to use + */ +/datum/component/material_container/proc/use_amount_mat(amt, datum/material/mat) + //round amount + amt = OPTIMAL_COST(amt) + + //get ref if nessassary + if(!istype(mat)) + mat = GET_MATERIAL_REF(mat) + + //check if sufficient is available + if(materials[mat] < amt) + return 0 + + //consume & return amount consumed + materials[mat] -= amt + return amt +//============================================================================================== + +//=========================================MID LEVEL========================================== +/** + * For consuming a dictionary of materials. + * + * Arguments: + * - mats: map of materials to consume(key = material type, value = amount) + * - coefficient: how much fraction of unit material in the mats list must be consumed. This is usually your machines efficiency + * - multiplier: how many units of material in the mats list(after each unit is multiplied and rounded with coefficient) must be consumed, This is usually your print quantity + */ +/datum/component/material_container/proc/use_materials(list/mats, coefficient = 1, multiplier = 1) + if(!mats || !length(mats)) + return FALSE + + var/amount_removed = 0 + for(var/i in mats) + amount_removed += use_amount_mat(OPTIMAL_COST(mats[i] * coefficient) * multiplier, i) + + return amount_removed +//============================================================================================ + + +//===========================================HIGH LEVEL======================================= + +/** + * For spawning mineral sheets at a specific location. Used by machines to output sheets. + * + * Arguments: + * sheet_amt: number of sheets to extract + * [material][datum/material]: type of sheets present in this container to extract + * [target][atom]: drop location + * [atom][context]: context - the atom performing the operation, this is the last argument sent in COMSIG_MATCONTAINER_SHEETS_RETRIEVED and is used mostly for silo logging + */ +/datum/component/material_container/proc/retrieve_sheets(sheet_amt, datum/material/material, atom/target = null, atom/context = parent) + //do we support sheets of this material + if(!material.sheet_type) + return 0 //Add greyscale sheet handling here later + if(!can_hold_material(material)) + return 0 + + //requested amount greater than available amount or just an invalid value + sheet_amt = min(round(materials[material] / SHEET_MATERIAL_AMOUNT), sheet_amt) + if(sheet_amt <= 0) + return 0 + //auto drop location + if(!target) + var/atom/parent_atom = parent + target = parent_atom.drop_location() + if(!target) + return 0 + + //eject sheets based on available amount after each iteration + var/count = 0 + while(sheet_amt > 0) + //don't merge yet. we need to do stuff with it first + var/obj/item/stack/sheet/new_sheets = new material.sheet_type(target, min(sheet_amt, MAX_STACK_SIZE), FALSE) + count += new_sheets.amount + //use material & deduct work needed + use_amount_mat(new_sheets.amount * SHEET_MATERIAL_AMOUNT, material) + sheet_amt -= new_sheets.amount + //send signal + SEND_SIGNAL(src, COMSIG_MATCONTAINER_SHEETS_RETRIEVED, new_sheets, context) + //no point merging anything into an already full stack + if(new_sheets.amount == new_sheets.max_amount) + continue + //now we can merge since we are done with it + for(var/obj/item/stack/item_stack in target) + if(item_stack == new_sheets || item_stack.type != material.sheet_type) //don't merge with self or different type + continue + //speed merge + var/merge_amount = min(item_stack.amount, new_sheets.max_amount - new_sheets.get_amount()) + item_stack.use(merge_amount) + new_sheets.add(merge_amount) + break + return count + +/** + * Proc to get all the materials and dump them as sheets + * + * Arguments: + * - target: drop location of the sheets + * - context: the atom which is ejecting the sheets. Used mostly in silo logging + */ +/datum/component/material_container/proc/retrieve_all(target = null, atom/context = parent) + var/result = 0 + for(var/MAT in materials) + result += retrieve_sheets(amount2sheet(materials[MAT]), MAT, target, context) + return result +//============================================================================================ + + +/datum/component/material_container/ui_static_data(mob/user) + var/list/data = list() + data["SHEET_MATERIAL_AMOUNT"] = SHEET_MATERIAL_AMOUNT + return data + +/// List format is list(material_name = list(amount = ..., ref = ..., etc.)) +/datum/component/material_container/ui_data(mob/user) + var/list/data = list() + + for(var/datum/material/material as anything in materials) + var/amount = materials[material] + + data += list(list( + "name" = material.name, + "ref" = REF(material), + "amount" = amount, + "color" = material.greyscale_colors + )) + + return data + +/** + * Adds context sensitivy directly to the material container file for screentips + * Arguments: + * * source - refers to item that will display its screentip + * * context - refers to, in this case, an item in the users hand hovering over the material container, such as an autolathe + * * held_item - refers to the item that has materials accepted by the material container + * * user - refers to user who will see the screentip when the proper context and tool are there + */ +/datum/component/material_container/proc/on_requesting_context_from_item(datum/source, list/context, obj/item/held_item, mob/living/user) + SIGNAL_HANDLER + + if(isnull(held_item)) + return NONE + if(!(mat_container_flags & MATCONTAINER_ANY_INTENT) && user.combat_mode) + return NONE + if(held_item.item_flags & ABSTRACT) + return NONE + if((held_item.flags_1 & HOLOGRAM_1) || (held_item.item_flags & NO_MAT_REDEMPTION) || (allowed_item_typecache && !is_type_in_typecache(held_item, allowed_item_typecache))) + return NONE + var/list/item_materials = held_item.get_material_composition(mat_container_flags) + if(!length(item_materials)) + return NONE + for(var/material in item_materials) + if(can_hold_material(material)) + continue + return NONE + + context[SCREENTIP_CONTEXT_LMB] = "Insert" + + return CONTEXTUAL_SCREENTIP_SET diff --git a/code/datums/components/material/remote_materials.dm b/code/datums/components/material/remote_materials.dm new file mode 100644 index 0000000000000..1756158108314 --- /dev/null +++ b/code/datums/components/material/remote_materials.dm @@ -0,0 +1,252 @@ +/* +This component allows machines to connect remotely to a material container +(namely an /obj/machinery/ore_silo) elsewhere. It offers optional graceful +fallback to a local material storage in case remote storage is unavailable, and +handles linking back and forth. +*/ + +/datum/component/remote_materials + // Three possible states: + // 1. silo exists, materials is parented to silo + // 2. silo is null, materials is parented to parent + // 3. silo is null, materials is null + + ///The silo machine this container is connected to + var/obj/machinery/ore_silo/silo + ///Material container. the value is either the silo or local + var/datum/component/material_container/mat_container + ///Should we create a local storage if we can't connect to silo + var/allow_standalone + ///Local size of container when silo = null + var/local_size = INFINITY + ///Flags used when converting inserted materials into their component materials. + var/mat_container_flags = NONE + +/datum/component/remote_materials/Initialize(mapload, allow_standalone = TRUE, force_connect = FALSE, mat_container_flags = NONE) + if (!isatom(parent)) + return COMPONENT_INCOMPATIBLE + + src.allow_standalone = allow_standalone + src.mat_container_flags = mat_container_flags + + RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), PROC_REF(OnMultitool)) + + var/turf/T = get_turf(parent) + var/connect_to_silo = FALSE + if(force_connect || (mapload && is_station_level(T.z))) + connect_to_silo = TRUE + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, TYPE_PROC_REF(/datum/component/remote_materials, SiloAttackBy)) + + if(mapload) // wait for silo to initialize during mapload + addtimer(CALLBACK(src, PROC_REF(_PrepareStorage), connect_to_silo)) + else //directly register in round + _PrepareStorage(connect_to_silo) + +/** + * Internal proc. prepares local storage if onnect_to_silo = FALSE + * + * Arguments + * connect_to_silo- if true connect to global silo. If not successfull then go to local storage + * only if allow_standalone = TRUE, else you a null mat_container + */ +/datum/component/remote_materials/proc/_PrepareStorage(connect_to_silo) + if (connect_to_silo) + silo = GLOB.ore_silo_default + if (silo) + silo.ore_connected_machines += src + mat_container = silo.GetComponent(/datum/component/material_container) + if (!mat_container && allow_standalone) + _MakeLocal() + +/datum/component/remote_materials/Destroy() + if (silo) + silo.ore_connected_machines -= src + silo.holds -= src + silo.updateUsrDialog() + silo = null + mat_container = null + return ..() + +/datum/component/remote_materials/proc/_MakeLocal() + silo = null + + var/static/list/allowed_mats = list( + /datum/material/iron, + /datum/material/glass, + /datum/material/silver, + /datum/material/gold, + /datum/material/diamond, + /datum/material/plasma, + /datum/material/uranium, + /datum/material/bananium, + /datum/material/titanium, + /datum/material/bluespace, + /datum/material/plastic, + ) + + mat_container = parent.AddComponent( \ + /datum/component/material_container, \ + allowed_mats, \ + local_size, \ + mat_container_flags, \ + allowed_items = /obj/item/stack \ + ) + +/datum/component/remote_materials/proc/toggle_holding(force_hold = FALSE) + if(isnull(silo)) + return + + if(force_hold) + silo.holds[src] = TRUE + else if(!silo.holds[src]) + silo.holds[src] = TRUE + else + silo.holds -= src + +/datum/component/remote_materials/proc/set_local_size(size) + local_size = size + if (!silo && mat_container) + mat_container.max_amount = size + +/** + * Disconnect this component from the remote silo + * + * Arguments + * old_silo- The silo we are trying to disconnect from + */ +/datum/component/remote_materials/proc/disconnect_from(obj/machinery/ore_silo/old_silo) + if (!old_silo || silo != old_silo) + return + silo.ore_connected_machines -= src + silo = null + mat_container = null + if (allow_standalone) + _MakeLocal() + +///Insert mats into silo +/datum/component/remote_materials/proc/SiloAttackBy(datum/source, obj/item/target, mob/user) + SIGNAL_HANDLER + + if(silo) + mat_container.user_insert(target, user, mat_container_flags, parent) + + return COMPONENT_NO_AFTERATTACK + +/datum/component/remote_materials/proc/OnMultitool(datum/source, mob/user, obj/item/I) + SIGNAL_HANDLER + + if(!I.multitool_check_buffer(user, I)) + return COMPONENT_BLOCK_TOOL_ATTACK + var/obj/item/multitool/M = I + if (!QDELETED(M.buffer) && istype(M.buffer, /obj/machinery/ore_silo)) + if (silo == M.buffer) + to_chat(user, span_warning("[parent] is already connected to [silo]!")) + return COMPONENT_BLOCK_TOOL_ATTACK + if(!check_z_level(M.buffer)) + to_chat(user, span_warning("[parent] is too far away to get a connection signal!")) + return COMPONENT_BLOCK_TOOL_ATTACK + + var/obj/machinery/ore_silo/new_silo = M.buffer + var/datum/component/material_container/new_container = new_silo.GetComponent(/datum/component/material_container) + if (silo) + silo.ore_connected_machines -= src + silo.holds -= src + silo.updateUsrDialog() + else if (mat_container) + //transfer all mats to silo. whatever cannot be transfered is dumped out as sheets + if(mat_container.total_amount()) + for(var/datum/material/mat as anything in mat_container.materials) + var/mat_amount = mat_container.materials[mat] + if(!mat_amount || !new_container.has_space(mat_amount) || !new_container.can_hold_material(mat)) + continue + new_container.materials[mat] += mat_amount + mat_container.materials[mat] = 0 + qdel(mat_container) + silo = new_silo + silo.ore_connected_machines += src + silo.updateUsrDialog() + mat_container = new_container + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, TYPE_PROC_REF(/datum/component/remote_materials, SiloAttackBy)) + to_chat(user, span_notice("You connect [parent] to [silo] from the multitool's buffer.")) + return COMPONENT_BLOCK_TOOL_ATTACK + +/** + * Checks if the param silo is in the same level as this components parent i.e. connected machine, rcd, etc + * + * Arguments + * silo_to_check- Is this components parent in the same Z level as this param silo. If null + * then check this components connected silo + * + * Returns true if both are on the station or same z level + */ +/datum/component/remote_materials/proc/check_z_level(obj/silo_to_check = silo) + if(isnull(silo_to_check)) + return FALSE + + return is_valid_z_level(get_turf(silo_to_check), get_turf(parent)) + +/// returns TRUE if this connection put on hold by the silo +/datum/component/remote_materials/proc/on_hold() + return check_z_level() ? silo.holds[src] : FALSE + +/** + * Internal proc to check if this connection can use any materials from the silo + * Returns true only if + * - The parent is of type movable atom + * - A mat container is actually present + * - The silo in not on hold + */ +/datum/component/remote_materials/proc/_can_use_resource() + var/atom/movable/movable_parent = parent + if (!istype(movable_parent)) + return FALSE + if (!mat_container) //no silolink & local storage not supported + movable_parent.say("No access to material storage, please contact the quartermaster.") + return FALSE + if(on_hold()) //silo on hold + movable_parent.say("Mineral access is on hold, please contact the quartermaster.") + return FALSE + return TRUE + +/** + * Use materials from either the silo(if connected) or from the local storage. If silo then this action + * is logged else not e.g. action="build" & name="matter bin" means you are trying to build an matter bin + * + * Arguments + * [mats][list]- list of materials to use + * coefficient- each mat unit is scaled by this value then rounded. This value if usually your machine efficiency e.g. upgraded protolathe has reduced costs + * multiplier- each mat unit is scaled by this value then rounded after it is scaled by coefficient. This value is your print quatity e.g. printing multiple items + * action- For logging only. e.g. build, create, i.e. the action you are trying to perform + * name- For logging only. the design you are trying to build e.g. matter bin, etc. + */ +/datum/component/remote_materials/proc/use_materials(list/mats, coefficient = 1, multiplier = 1, action = "build", name = "design") + if(!_can_use_resource()) + return 0 + + var/amount_consumed = mat_container.use_materials(mats, coefficient, multiplier) + + if (silo)//log only if silo is linked + var/list/scaled_mats = list() + for(var/i in mats) + scaled_mats[i] = OPTIMAL_COST(OPTIMAL_COST(mats[i] * coefficient) * multiplier) + silo.silo_log(parent, action, -multiplier, name, scaled_mats) + + return amount_consumed + +/** + * Ejects the given material ref and logs it + * + * Arguments + * [material_ref][datum/material]- The material type you are trying to eject + * eject_amount- how many sheets to eject + * [drop_target][atom]- optional where to drop the sheets. null means it is dropped at this components parent location + */ +/datum/component/remote_materials/proc/eject_sheets(datum/material/material_ref, eject_amount, atom/drop_target = null) + if(!_can_use_resource()) + return 0 + + var/atom/movable/movable_parent = parent + if(isnull(drop_target)) + drop_target = movable_parent.drop_location() + + return mat_container.retrieve_sheets(eject_amount, material_ref, target = drop_target, context = parent) diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm deleted file mode 100644 index 404b2e9970988..0000000000000 --- a/code/datums/components/material_container.dm +++ /dev/null @@ -1,571 +0,0 @@ -/*! - This datum should be used for handling mineral contents of machines and whatever else is supposed to hold minerals and make use of them. - - Variables: - amount - raw amount of the mineral this container is holding, calculated by the defined value SHEET_MATERIAL_AMOUNT=SHEET_MATERIAL_AMOUNT. - max_amount - max raw amount of mineral this container can hold. - sheet_type - type of the mineral sheet the container handles, used for output. - parent - object that this container is being used by, used for output. - MAX_STACK_SIZE - size of a stack of mineral sheets. Constant. -*/ - -/datum/component/material_container - /// The total amount of materials this material container contains - var/total_amount = 0 - /// The maximum amount of materials this material container can contain - var/max_amount - /// Map of material ref -> amount - var/list/materials //Map of key = material ref | Value = amount - /// The list of materials that this material container can accept - var/list/allowed_materials - /// The typecache of things that this material container can accept - var/list/allowed_item_typecache - /// The last main material that was inserted into this container - var/last_inserted_id - /// Whether or not this material container allows specific amounts from sheets to be inserted - var/precise_insertion = FALSE - /// A callback for checking wheter we can insert a material into this container - var/datum/callback/insertion_check - /// A callback invoked before materials are inserted into this container - var/datum/callback/precondition - /// A callback invoked after materials are inserted into this container - var/datum/callback/after_insert - /// The material container flags. See __DEFINES/materials.dm. - var/mat_container_flags - -/// Sets up the proper signals and fills the list of materials with the appropriate references. -/datum/component/material_container/Initialize(list/init_mats, max_amt = 0, _mat_container_flags=NONE, list/allowed_mats=init_mats, list/allowed_items, datum/callback/_insertion_check, datum/callback/_precondition, datum/callback/_after_insert) - if(!isatom(parent)) - return COMPONENT_INCOMPATIBLE - - materials = list() - max_amount = max(0, max_amt) - mat_container_flags = _mat_container_flags - - allowed_materials = allowed_mats || list() - if(allowed_items) - if(ispath(allowed_items) && allowed_items == /obj/item/stack) - allowed_item_typecache = GLOB.typecache_stack - else - allowed_item_typecache = typecacheof(allowed_items) - - insertion_check = _insertion_check - precondition = _precondition - after_insert = _after_insert - - for(var/mat in init_mats) //Make the assoc list material reference -> amount - var/mat_ref = GET_MATERIAL_REF(mat) - if(isnull(mat_ref)) - continue - var/mat_amt = init_mats[mat] - if(isnull(mat_amt)) - mat_amt = 0 - materials[mat_ref] += mat_amt - - if(_mat_container_flags & MATCONTAINER_NO_INSERT) - return - - var/atom/atom_target = parent - atom_target.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1 - - RegisterSignal(atom_target, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_requesting_context_from_item)) - -/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) - return ..() - - -/datum/component/material_container/RegisterWithParent() - . = ..() - - if(!(mat_container_flags & MATCONTAINER_NO_INSERT)) - RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attackby)) - if(mat_container_flags & MATCONTAINER_EXAMINE) - RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) - - -/datum/component/material_container/vv_edit_var(var_name, var_value) - var/old_flags = mat_container_flags - . = ..() - if(var_name == NAMEOF(src, mat_container_flags) && parent) - if(!(old_flags & MATCONTAINER_EXAMINE) && mat_container_flags & MATCONTAINER_EXAMINE) - RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) - else if(old_flags & MATCONTAINER_EXAMINE && !(mat_container_flags & MATCONTAINER_EXAMINE)) - UnregisterSignal(parent, COMSIG_ATOM_EXAMINE) - - if(old_flags & MATCONTAINER_NO_INSERT && !(mat_container_flags & MATCONTAINER_NO_INSERT)) - RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attackby)) - else if(!(old_flags & MATCONTAINER_NO_INSERT) && mat_container_flags & MATCONTAINER_NO_INSERT) - UnregisterSignal(parent, COMSIG_ATOM_ATTACKBY) - - -/datum/component/material_container/proc/on_examine(datum/source, mob/user, list/examine_texts) - SIGNAL_HANDLER - - for(var/I in materials) - var/datum/material/M = I - var/amt = materials[I] - if(amt) - examine_texts += span_notice("It has [amt] units of [lowertext(M.name)] stored.") - -/// Proc that allows players to fill the parent with mats -/datum/component/material_container/proc/on_attackby(datum/source, obj/item/weapon, mob/living/user) - SIGNAL_HANDLER - - user_insert(weapon, user) - - return COMPONENT_NO_AFTERATTACK - -/** - * inserts an item from the players hand into the container. Loops through all the contents inside reccursively - * Arguments - * * held_item - the item to insert - * * user - the mob inserting this item - * * breakdown_flags - how this item and all it's contents inside are broken down during insertion. This is unique to the machine doing the insertion - */ -/datum/component/material_container/proc/user_insert(obj/item/held_item, mob/living/user, breakdown_flags = mat_container_flags) - set waitfor = FALSE - . = 0 - - //differs from held_item when using TK - var/active_held = user.get_active_held_item() - //don't attack the machine - if(!(mat_container_flags & MATCONTAINER_ANY_INTENT) && user.combat_mode) - return - //user defined conditions - if(precondition && !precondition.Invoke(user)) - return - - //loop through all contents inside this atom and salvage their material as well but in reverse so we don't delete parents before processing their children - var/list/contents = held_item.get_all_contents_type(/obj/item) - for(var/i = length(contents); i >= 1 ; i--) - var/obj/item/target = contents[i] - - //not a solid sub type - if(target.item_flags & ABSTRACT) - if(target == active_held) //was this the original item in the players hand? put it back because we coudn't salvage it - user.put_in_active_hand(target) - continue - //item is either not real, not allowed for redemption, not in the allowed types - if((target.flags_1 & HOLOGRAM_1) || (target.item_flags & NO_MAT_REDEMPTION) || (allowed_item_typecache && !is_type_in_typecache(target, allowed_item_typecache))) - if(!(mat_container_flags & MATCONTAINER_SILENT)) - to_chat(user, span_warning("[parent] won't accept [target]!")) - if(target == active_held) //was this the original item in the players hand? put it back because we coudn't salvage it - user.put_in_active_hand(target) - continue - - //if stack, check if we want to read precise amount of sheets to insert - var/obj/item/stack/item_stack = null - if(isstack(target) && precise_insertion) - var/atom/current_parent = parent - item_stack = target - var/requested_amount = tgui_input_number(user, "How much do you want to insert?", "Inserting [item_stack.singular_name]s", item_stack.amount, item_stack.amount) - if(!requested_amount || QDELETED(target) || QDELETED(user) || QDELETED(src)) - continue - if(parent != current_parent || user.get_active_held_item() != active_held) - continue - if(requested_amount != item_stack.amount) //only split if its not the whole amount - target = split_stack(item_stack, requested_amount) //split off the requested amount - requested_amount = 0 - - //is this item a stack and was it split by the player? - var/was_stack_split = !isnull(item_stack) && item_stack != target - //if it was split then item_stack has the reference to the original stack/item - var/original_item = was_stack_split ? item_stack : target - //if this item is not the one the player is holding then don't remove it from their hand - if(original_item != active_held) - original_item = null - if(!isnull(original_item) && !user.temporarilyRemoveItemFromInventory(original_item)) //remove from hand(if split remove the original stack else the target) - to_chat(user, span_warning("[held_item] is stuck to you and cannot be placed into [parent].")) - return - - //insert the item - var/inserted = insert_item(target, breakdown_flags = mat_container_flags) - if(inserted > 0) - . += inserted - - //stack was either split by the container(!QDELETED(target) means the container only consumed a part of it) or by the player, put whats left back of the original stack back in players hand - if((!QDELETED(target) || was_stack_split)) - - //stack was split by player and that portion was not fully consumed, merge whats left back with the original stack - if(!QDELETED(target) && was_stack_split) - var/obj/item/stack/inserting_stack = target - item_stack.add(inserting_stack.amount) - qdel(inserting_stack) - - //was this the original item in the players hand? put what's left back in the player's hand - if(!isnull(original_item)) - user.put_in_active_hand(original_item) - - to_chat(user, span_notice("You insert a material total of [inserted] into [parent].")) - else - //decode the error & print it - var/error_msg - if(inserted == -2) - error_msg = "[parent] has insufficient space to accept the [target]" - else - error_msg = "[target] has insufficient materials to be accepted by [parent]" - to_chat(user, span_warning(error_msg)) - - //player split the stack by the requested amount but even that split amount could not be salvaged. merge it back with the original - if(!isnull(item_stack) && was_stack_split) - var/obj/item/stack/inserting_stack = target - item_stack.add(inserting_stack.amount) - qdel(inserting_stack) - - //was this the original item in the players hand? put it back because we coudn't salvage it - if(!isnull(original_item)) - user.put_in_active_hand(original_item) - -/** - * Splits a stack. we don't use /obj/item/stack/proc/split_stack because Byond complains that should only be called asynchronously. - * This proc is also more faster because it doesn't deal with mobs, copying evidences or refreshing atom storages - */ -/datum/component/material_container/proc/split_stack(obj/item/stack/target, amount) - if(!target.use(amount, TRUE, FALSE)) - return null - - . = new target.type(target.drop_location(), amount, FALSE, target.mats_per_unit) - target.loc.atom_storage?.refresh_views() - - target.is_zero_amount(delete_if_zero = TRUE) - -/// Proc specifically for inserting items, returns the amount of materials entered. -/datum/component/material_container/proc/insert_item(obj/item/weapon, multiplier = 1, breakdown_flags = mat_container_flags) - if(QDELETED(weapon)) - return -1 - multiplier = CEILING(multiplier, 0.01) - - var/obj/item/target = weapon - - var/material_amount = get_item_material_amount(target, breakdown_flags) * multiplier - if(!material_amount) - return -1 - var/obj/item/stack/item_stack - if(isstack(weapon) && !has_space(material_amount)) //not enugh space split and feed as many sheets possible - item_stack = weapon - var/space_left = max_amount - total_amount - if(!space_left) - return -2 - var/material_per_sheet = material_amount / item_stack.amount - var/sheets_to_insert = round(space_left / material_per_sheet) - if(!sheets_to_insert) - return -2 - target = split_stack(item_stack, sheets_to_insert) - material_amount = get_item_material_amount(target, breakdown_flags) * multiplier - if(!has_space(material_amount)) - return -2 - - last_inserted_id = insert_item_materials(target, multiplier, breakdown_flags) - if(!isnull(last_inserted_id)) - if(after_insert) - after_insert.Invoke(target, last_inserted_id, material_amount) - qdel(target) //item gone - return material_amount - else if(!isnull(item_stack) && item_stack != target) //insertion failed, merge the split stack back into the original - var/obj/item/stack/inserting_stack = target - item_stack.add(inserting_stack.amount) - qdel(inserting_stack) - return 0 - -/** - * Inserts the relevant materials from an item into this material container. - * - * Arguments: - * - [source][/obj/item]: The source of the materials we are inserting. - * - multiplier: The multiplier for the materials being inserted. - * - breakdown_flags: The breakdown bitflags that will be used to retrieve the materials from the source - */ -/datum/component/material_container/proc/insert_item_materials(obj/item/source, multiplier = 1, breakdown_flags = mat_container_flags) - var/primary_mat - var/max_mat_value = 0 - var/list/item_materials = source.get_material_composition(breakdown_flags) - for(var/MAT in item_materials) - if(!can_hold_material(MAT)) - continue - materials[MAT] += item_materials[MAT] * multiplier - total_amount += item_materials[MAT] * multiplier - if(item_materials[MAT] > max_mat_value) - max_mat_value = item_materials[MAT] - primary_mat = MAT - - return primary_mat - -/** - * The default check for whether we can add materials to this material container. - * - * Arguments: - * - [mat][/atom/material]: The material we are checking for insertability. - */ -/datum/component/material_container/proc/can_hold_material(datum/material/mat) - if(mat in allowed_materials) - return TRUE - if(istype(mat) && ((mat.id in allowed_materials) || (mat.type in allowed_materials))) - allowed_materials += mat // This could get messy with passing lists by ref... but if you're doing that the list expansion is probably being taken care of elsewhere anyway... - return TRUE - if(insertion_check?.Invoke(mat)) - allowed_materials += mat - return TRUE - return FALSE - -/// For inserting an amount of material -/datum/component/material_container/proc/insert_amount_mat(amt, datum/material/mat) - if(amt <= 0 || !has_space(amt)) - return 0 - - var/total_amount_saved = total_amount - if(mat) - if(!istype(mat)) - mat = GET_MATERIAL_REF(mat) - materials[mat] += amt - else - var/num_materials = length(materials) - if(!num_materials) - return 0 - - amt /= num_materials - for(var/i in materials) - materials[i] += amt - total_amount += amt - return (total_amount - total_amount_saved) - -/// Uses an amount of a specific material, effectively removing it. -/datum/component/material_container/proc/use_amount_mat(amt, datum/material/mat) - if(!istype(mat)) - mat = GET_MATERIAL_REF(mat) - - if(!mat) - return 0 - var/amount = materials[mat] - if(amount < amt) - return 0 - - materials[mat] -= amt - total_amount -= amt - return amt - -/// Proc for transfering materials to another container. -/datum/component/material_container/proc/transer_amt_to(datum/component/material_container/T, amt, datum/material/mat) - if(!istype(mat)) - mat = GET_MATERIAL_REF(mat) - if((amt == 0) || (!T) || (!mat)) - return FALSE - if(amt<0) - return T.transer_amt_to(src, -amt, mat) - var/tr = min(amt, materials[mat], T.can_insert_amount_mat(amt, mat)) - if(tr) - use_amount_mat(tr, mat) - T.insert_amount_mat(tr, mat) - return tr - return FALSE - -/// Proc for checking if there is room in the component, returning the amount or else the amount lacking. -/datum/component/material_container/proc/can_insert_amount_mat(amt, datum/material/mat) - if(!amt || !mat) - return 0 - - if((total_amount + amt) <= max_amount) - return amt - else - return (max_amount - total_amount) - - -/// For consuming a dictionary of materials. mats is the map of materials to use and the corresponding amounts, example: list(M/datum/material/glass =100, datum/material/iron=SMALL_MATERIAL_AMOUNT * 2) -/datum/component/material_container/proc/use_materials(list/mats, multiplier=1) - if(!mats || !length(mats)) - return FALSE - - var/list/mats_to_remove = list() //Assoc list MAT | AMOUNT - - for(var/x in mats) //Loop through all required materials - var/datum/material/req_mat = x - if(!istype(req_mat)) - req_mat = GET_MATERIAL_REF(req_mat) //Get the ref if necesary - if(!materials[req_mat]) //Do we have the resource? - return FALSE //Can't afford it - var/amount_required = mats[x] * multiplier - if(amount_required < 0) - return FALSE //No negative mats - if(!(materials[req_mat] >= amount_required)) // do we have enough of the resource? - return FALSE //Can't afford it - mats_to_remove[req_mat] += amount_required //Add it to the assoc list of things to remove - continue - - var/total_amount_save = total_amount - - for(var/i in mats_to_remove) - total_amount_save -= use_amount_mat(mats_to_remove[i], i) - - return total_amount_save - total_amount - -/// For spawning mineral sheets at a specific location. Used by machines to output sheets. -/datum/component/material_container/proc/retrieve_sheets(sheet_amt, datum/material/M, atom/target = null) - if(!M.sheet_type) - return 0 //Add greyscale sheet handling here later - if(sheet_amt <= 0) - return 0 - - if(!target) - var/atom/parent_atom = parent - target = parent_atom.drop_location() - if(materials[M] < (sheet_amt * SHEET_MATERIAL_AMOUNT)) - sheet_amt = round(materials[M] / SHEET_MATERIAL_AMOUNT) - var/count = 0 - while(sheet_amt > MAX_STACK_SIZE) - new M.sheet_type(target, MAX_STACK_SIZE, null, list((M) = SHEET_MATERIAL_AMOUNT)) - count += MAX_STACK_SIZE - use_amount_mat(sheet_amt * SHEET_MATERIAL_AMOUNT, M) - sheet_amt -= MAX_STACK_SIZE - if(sheet_amt >= 1) - new M.sheet_type(target, sheet_amt, null, list((M) = SHEET_MATERIAL_AMOUNT)) - count += sheet_amt - use_amount_mat(sheet_amt * SHEET_MATERIAL_AMOUNT, M) - return count - - -/// Proc to get all the materials and dump them as sheets -/datum/component/material_container/proc/retrieve_all(target = null) - var/result = 0 - for(var/MAT in materials) - var/amount = materials[MAT] - result += retrieve_sheets(amount2sheet(amount), MAT, target) - return result - -/// Proc that returns TRUE if the container has space -/datum/component/material_container/proc/has_space(amt = 0) - return (total_amount + amt) <= max_amount - -/// Checks if its possible to afford a certain amount of materials. Takes a dictionary of materials. -/datum/component/material_container/proc/has_materials(list/mats, multiplier=1) - if(!mats || !mats.len) - return FALSE - - for(var/x in mats) //Loop through all required materials - var/datum/material/req_mat = x - if(!istype(req_mat)) - if(ispath(req_mat)) //Is this an actual material, or is it a category? - req_mat = GET_MATERIAL_REF(req_mat) //Get the ref - - else // Its a category. (For example MAT_CATEGORY_RIGID) - if(!has_enough_of_category(req_mat, mats[x], multiplier)) //Do we have enough of this category? - return FALSE - else - continue - - if(!has_enough_of_material(req_mat, mats[x], multiplier))//Not a category, so just check the normal way - return FALSE - - return TRUE - -/// Returns all the categories in a recipe. -/datum/component/material_container/proc/get_categories(list/mats) - var/list/categories = list() - for(var/x in mats) //Loop through all required materials - if(!istext(x)) //This means its not a category - continue - categories += x - return categories - -/// Returns TRUE if you have enough of the specified material. -/datum/component/material_container/proc/has_enough_of_material(datum/material/req_mat, amount, multiplier=1) - if(!materials[req_mat]) //Do we have the resource? - return FALSE //Can't afford it - var/amount_required = amount * multiplier - if(materials[req_mat] >= amount_required) // do we have enough of the resource? - return TRUE - return FALSE //Can't afford it - -/// Returns TRUE if you have enough of a specified material category (Which could be multiple materials) -/datum/component/material_container/proc/has_enough_of_category(category, amount, multiplier=1) - for(var/i in SSmaterials.materials_by_category[category]) - var/datum/material/mat = i - if(materials[mat] >= amount) //we have enough - return TRUE - return FALSE - -/// Turns a material amount into the amount of sheets it should output -/datum/component/material_container/proc/amount2sheet(amt) - if(amt >= SHEET_MATERIAL_AMOUNT) - return round(amt / SHEET_MATERIAL_AMOUNT) - return FALSE - -/// Turns an amount of sheets into the amount of material amount it should output -/datum/component/material_container/proc/sheet2amount(sheet_amt) - if(sheet_amt > 0) - return sheet_amt * SHEET_MATERIAL_AMOUNT - return FALSE - - -///returns the amount of material relevant to this container; if this container does not support glass, any glass in 'I' will not be taken into account -/datum/component/material_container/proc/get_item_material_amount(obj/item/I, breakdown_flags = mat_container_flags) - if(!istype(I) || !I.custom_materials) - return 0 - var/material_amount = 0 - var/list/item_materials = I.get_material_composition(breakdown_flags) - for(var/MAT in item_materials) - if(!can_hold_material(MAT)) - continue - material_amount += item_materials[MAT] - return material_amount - -/// Returns the amount of a specific material in this container. -/datum/component/material_container/proc/get_material_amount(datum/material/mat) - if(!istype(mat)) - mat = GET_MATERIAL_REF(mat) - return materials[mat] - -/// List format is list(material_name = list(amount = ..., ref = ..., etc.)) -/datum/component/material_container/ui_data(mob/user) - var/list/data = list() - - for(var/datum/material/material as anything in materials) - var/amount = materials[material] - - data += list(list( - "name" = material.name, - "ref" = REF(material), - "amount" = amount, - "sheets" = round(amount / SHEET_MATERIAL_AMOUNT), - "removable" = amount >= SHEET_MATERIAL_AMOUNT, - "color" = material.greyscale_colors - )) - - return data - -/** - * Adds context sensitivy directly to the material container file for screentips - * Arguments: - * * source - refers to item that will display its screentip - * * context - refers to, in this case, an item in the users hand hovering over the material container, such as an autolathe - * * held_item - refers to the item that has materials accepted by the material container - * * user - refers to user who will see the screentip when the proper context and tool are there - */ -/datum/component/material_container/proc/on_requesting_context_from_item(datum/source, list/context, obj/item/held_item, mob/living/user) - SIGNAL_HANDLER - - if(isnull(held_item)) - return NONE - if(!(mat_container_flags & MATCONTAINER_ANY_INTENT) && user.combat_mode) - return NONE - if(held_item.item_flags & ABSTRACT) - return NONE - if((held_item.flags_1 & HOLOGRAM_1) || (held_item.item_flags & NO_MAT_REDEMPTION) || (allowed_item_typecache && !is_type_in_typecache(held_item, allowed_item_typecache))) - return NONE - var/list/item_materials = held_item.get_material_composition(mat_container_flags) - if(!length(item_materials)) - return NONE - for(var/material in item_materials) - if(can_hold_material(material)) - continue - return NONE - - context[SCREENTIP_CONTEXT_LMB] = "Insert" - - return CONTEXTUAL_SCREENTIP_SET diff --git a/code/datums/components/mind_linker.dm b/code/datums/components/mind_linker.dm index 0e82447e01757..050a9762f0712 100644 --- a/code/datums/components/mind_linker.dm +++ b/code/datums/components/mind_linker.dm @@ -64,7 +64,7 @@ unlink_mob(remaining_mob) linked_mobs.Cut() QDEL_NULL(master_speech) - QDEL_NULL(post_unlink_callback) + post_unlink_callback = null return ..() /datum/component/mind_linker/RegisterWithParent() @@ -243,7 +243,7 @@ var/datum/component/mind_linker/linker = target var/mob/living/linker_parent = linker.parent - var/message = sanitize(tgui_input_text(owner, "Enter a message to transmit.", "[linker.network_name] Telepathy")) + var/message = tgui_input_text(owner, "Enter a message to transmit.", "[linker.network_name] Telepathy") if(!message || QDELETED(src) || QDELETED(owner) || owner.stat == DEAD) return diff --git a/code/datums/components/mirage_border.dm b/code/datums/components/mirage_border.dm deleted file mode 100644 index eb167a98f9fde..0000000000000 --- a/code/datums/components/mirage_border.dm +++ /dev/null @@ -1,44 +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) - -INITIALIZE_IMMEDIATE(/obj/effect/abstract/mirage_holder) -/obj/effect/abstract/mirage_holder - name = "Mirage holder" - anchored = TRUE - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - diff --git a/code/datums/components/mob_chain.dm b/code/datums/components/mob_chain.dm new file mode 100644 index 0000000000000..a2b16a849a576 --- /dev/null +++ b/code/datums/components/mob_chain.dm @@ -0,0 +1,205 @@ +/** + * Component allowing you to create a linked list of mobs. + * These mobs will follow each other and attack as one, as well as sharing damage taken. + */ +/datum/component/mob_chain + + /// If true then damage we take is passed backwards along the line + var/pass_damage_back + /// If true then we will set our icon state based on line position + var/vary_icon_state + + /// Mob in front of us in the chain + var/mob/living/front + /// Mob behind us in the chain + var/mob/living/back + +/datum/component/mob_chain/Initialize(mob/living/front, pass_damage_back = TRUE, vary_icon_state = FALSE) + . = ..() + if (!isliving(parent)) + return COMPONENT_INCOMPATIBLE + + src.front = front + src.pass_damage_back = pass_damage_back + src.vary_icon_state = vary_icon_state + if (!isnull(front)) + SEND_SIGNAL(front, COMSIG_MOB_GAINED_CHAIN_TAIL, parent) + parent.AddComponent(/datum/component/leash, owner = front, distance = 1) // Handles catching up gracefully + +/datum/component/mob_chain/Destroy(force, silent) + if (!isnull(front)) + SEND_SIGNAL(front, COMSIG_MOB_LOST_CHAIN_TAIL, parent) + front = null + back = null + return ..() + +/datum/component/mob_chain/RegisterWithParent() + RegisterSignal(parent, COMSIG_MOB_GAINED_CHAIN_TAIL, PROC_REF(on_gained_tail)) + RegisterSignal(parent, COMSIG_MOB_LOST_CHAIN_TAIL, PROC_REF(on_lost_tail)) + RegisterSignal(parent, COMSIG_MOB_CHAIN_CONTRACT, PROC_REF(on_contracted)) + RegisterSignal(parent, COMSIG_LIVING_DEATH, PROC_REF(on_death)) + RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(on_deletion)) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) + RegisterSignal(parent, COMSIG_ATOM_CAN_BE_PULLED, PROC_REF(on_pulled)) + RegisterSignals(parent, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, COMSIG_MOB_ATTACK_RANGED), PROC_REF(on_attack)) + if (vary_icon_state) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_ICON_STATE, PROC_REF(on_update_icon_state)) + update_mob_appearance() + if (pass_damage_back) + RegisterSignal(parent, COMSIG_LIVING_ADJUST_DAMAGE, PROC_REF(on_adjust_damage)) + RegisterSignal(parent, COMSIG_CARBON_LIMB_DAMAGED, PROC_REF(on_limb_damage)) + + var/datum/action/cooldown/worm_contract/shrink = new(parent) + shrink.Grant(parent) + +/datum/component/mob_chain/UnregisterFromParent() + UnregisterSignal(parent, list( + COMSIG_ATOM_CAN_BE_PULLED, + COMSIG_ATOM_UPDATE_ICON_STATE, + COMSIG_CARBON_LIMB_DAMAGED, + COMSIG_HUMAN_EARLY_UNARMED_ATTACK, + COMSIG_LIVING_ADJUST_DAMAGE, + COMSIG_LIVING_DEATH, + COMSIG_LIVING_UNARMED_ATTACK, + COMSIG_MOB_ATTACK_RANGED, + COMSIG_MOB_CHAIN_CONTRACT, + COMSIG_MOB_GAINED_CHAIN_TAIL, + COMSIG_MOB_LOST_CHAIN_TAIL, + COMSIG_MOVABLE_MOVED, + COMSIG_QDELETING, + )) + qdel(parent.GetComponent(/datum/component/leash)) + var/mob/living/living_parent = parent + var/datum/action/cooldown/worm_contract/shrink = locate() in living_parent.actions + qdel(shrink) + +/// Update how we look +/datum/component/mob_chain/proc/update_mob_appearance() + if (!vary_icon_state) + return + var/mob/living/body = parent + body.update_appearance(UPDATE_ICON_STATE) + +/// Called when something sets us as IT'S front +/datum/component/mob_chain/proc/on_gained_tail(mob/living/body, mob/living/tail) + SIGNAL_HANDLER + back = tail + update_mob_appearance() + +/// Called when our tail loses its chain component +/datum/component/mob_chain/proc/on_lost_tail() + SIGNAL_HANDLER + back = null + update_mob_appearance() + +/// Called when our tail gets pulled up to our body +/datum/component/mob_chain/proc/on_contracted(mob/living/shrinking) + SIGNAL_HANDLER + if (isnull(back)) + return + back.forceMove(shrinking.loc) + var/datum/action/cooldown/worm_contract/shrink = locate() in back.actions + if (isnull(shrink)) + return + INVOKE_ASYNC(shrink, TYPE_PROC_REF(/datum/action, Trigger)) + +/// If we die so does the guy behind us, then stop following the leader +/datum/component/mob_chain/proc/on_death() + SIGNAL_HANDLER + back?.death() + qdel(src) + +/// If we get deleted so does the guy behind us +/datum/component/mob_chain/proc/on_deletion() + SIGNAL_HANDLER + QDEL_NULL(back) + front?.update_appearance(UPDATE_ICON) + +/// Pull our tail behind us when we move +/datum/component/mob_chain/proc/on_moved(mob/living/mover, turf/old_loc) + SIGNAL_HANDLER + if(isnull(back) || back.loc == old_loc) + return + back.Move(old_loc) + +/// Update our visuals based on if we have someone in front and behind +/datum/component/mob_chain/proc/on_update_icon_state(mob/living/our_mob) + SIGNAL_HANDLER + var/current_icon_state = our_mob.base_icon_state + if(isnull(front)) + current_icon_state = "[current_icon_state]_start" + else if(isnull(back)) + current_icon_state = "[current_icon_state]_end" + else + current_icon_state = "[current_icon_state]_mid" + + our_mob.icon_state = current_icon_state + if (isanimal_or_basicmob(our_mob)) + var/mob/living/basic/basic_parent = our_mob + basic_parent.icon_living = current_icon_state + +/// Do not allow someone to be pulled out of the chain +/datum/component/mob_chain/proc/on_pulled(mob/living/our_mob) + SIGNAL_HANDLER + if (!isnull(front)) + return COMSIG_ATOM_CANT_PULL + +/// Tell our tail to attack too +/datum/component/mob_chain/proc/on_attack(mob/living/our_mob, atom/target) + SIGNAL_HANDLER + if (target == back || target == front) + return COMPONENT_CANCEL_ATTACK_CHAIN + if (isnull(back) || QDELETED(target)) + return + INVOKE_ASYNC(back, TYPE_PROC_REF(/mob, ClickOn), target) + +/// On damage or heal, affect our furthest segment +/datum/component/mob_chain/proc/on_adjust_damage(mob/living/our_mob, type, amount, forced) + SIGNAL_HANDLER + if (isnull(back) || forced) + return + if (type == STAMINA) + back.adjustStaminaLoss(amount, forced = forced) + return // Pass stamina changes all the way along so we maintain consistent speed + switch (type) + if(BRUTE) + back.adjustBruteLoss(amount, forced = forced) + if(BURN) + back.adjustFireLoss(amount, forced = forced) + if(TOX) + back.adjustToxLoss(amount, forced = forced) + if(OXY) // If all segments are suffocating we pile damage backwards until our ass starts dying forwards + back.adjustOxyLoss(amount, forced = forced) + if(CLONE) + back.adjustCloneLoss(amount, forced = forced) + return COMPONENT_IGNORE_CHANGE + +/// Special handling for if damage is delegated to a mob's limbs instead of its overall damage +/datum/component/mob_chain/proc/on_limb_damage(mob/living/our_mob, limb, brute, burn) + SIGNAL_HANDLER + if (isnull(back)) + return + if (brute != 0) + back.adjustBruteLoss(brute, updating_health = FALSE) + if (burn != 0) + back.adjustFireLoss(burn, updating_health = FALSE) + if (brute != 0 || burn != 0) + back.updatehealth() + return COMPONENT_PREVENT_LIMB_DAMAGE + +/** + * Shrink the chain of mobs into one tile. + */ +/datum/action/cooldown/worm_contract + name = "Force Contract" + desc = "Forces your body to contract onto a single tile." + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "worm_contract" + cooldown_time = 30 SECONDS + melee_cooldown_time = 0 SECONDS + +/datum/action/cooldown/worm_contract/Activate(atom/target) + SEND_SIGNAL(owner, COMSIG_MOB_CHAIN_CONTRACT) + StartCooldown() diff --git a/code/datums/components/multiple_lives.dm b/code/datums/components/multiple_lives.dm index c5f90ba9698ab..13c3282605b6e 100644 --- a/code/datums/components/multiple_lives.dm +++ b/code/datums/components/multiple_lives.dm @@ -46,7 +46,7 @@ /datum/component/multiple_lives/proc/on_examine(mob/living/source, mob/user, list/examine_list) SIGNAL_HANDLER if(isobserver(user) || source == user) - examine_list += "[source.p_theyve(TRUE)] [lives_left] extra lives left." + examine_list += "[source.p_Theyve()] [lives_left] extra lives left." /datum/component/multiple_lives/InheritComponent(datum/component/multiple_lives/new_comp , lives_left) src.lives_left += new_comp ? new_comp.lives_left : lives_left diff --git a/code/datums/components/nuclear_bomb_operator.dm b/code/datums/components/nuclear_bomb_operator.dm index 2224f95803b1d..da6e8b0cab12d 100644 --- a/code/datums/components/nuclear_bomb_operator.dm +++ b/code/datums/components/nuclear_bomb_operator.dm @@ -50,6 +50,8 @@ /datum/component/nuclear_bomb_operator/Destroy(force, silent) QDEL_NULL(disky) + on_disk_collected = null + add_disk_overlays = null return ..() /// Drop the disk on the floor, if we have it diff --git a/code/datums/components/omen.dm b/code/datums/components/omen.dm index a4846f73bd9a6..f499d22968dbb 100644 --- a/code/datums/components/omen.dm +++ b/code/datums/components/omen.dm @@ -14,7 +14,7 @@ var/permanent = FALSE /// Base probability of negative events. Cursed are half as unlucky. var/luck_mod = 1 - /// Base damage from negative events. Cursed take 25% less damage. + /// Base damage from negative events. Cursed take 25% of this damage. var/damage_mod = 1 /datum/component/omen/Initialize(obj/vessel, permanent, luck_mod, damage_mod) @@ -65,7 +65,17 @@ return var/mob/living/living_guy = our_guy - if(!prob(15 * luck_mod)) + + if(prob(0.001) && (living_guy.stat != DEAD)) // You hit the lottery! Kinda. + living_guy.visible_message(span_danger("[living_guy] suddenly bursts into flames!"), span_danger("You suddenly burst into flames!")) + INVOKE_ASYNC(living_guy, TYPE_PROC_REF(/mob, emote), "scream") + living_guy.adjust_fire_stacks(20) + living_guy.ignite_mob(silent = TRUE) + if(!permanent) + qdel(src) + return + + if(!prob(8 * luck_mod)) return var/our_guy_pos = get_turf(living_guy) @@ -104,6 +114,59 @@ qdel(src) return + for(var/obj/machinery/light/evil_light in the_turf) + if((evil_light.status == LIGHT_BURNED || evil_light.status == LIGHT_BROKEN) || (HAS_TRAIT(living_guy, TRAIT_SHOCKIMMUNE))) // we cant do anything :( // Why in the world is there no get_siemens_coeff proc??? + to_chat(living_guy, span_warning("[evil_light] sparks weakly for a second.")) + do_sparks(2, FALSE, evil_light) // hey maybe it'll ignite them + return + + to_chat(living_guy, span_warning("[evil_light] glows ominously...")) // omenously + evil_light.visible_message(span_boldwarning("[evil_light] suddenly flares brightly and sparks!")) + evil_light.break_light_tube(skip_sound_and_sparks = FALSE) + do_sparks(number = 4, cardinal_only = FALSE, source = evil_light) + evil_light.Beam(living_guy, icon_state = "lightning[rand(1,12)]", time = 0.5 SECONDS) + living_guy.electrocute_act(35 * (damage_mod * 0.5), evil_light, flags = SHOCK_NOGLOVES) + INVOKE_ASYNC(living_guy, TYPE_PROC_REF(/mob, emote), "scream") + if(!permanent && prob(33.3)) + qdel(src) + + for(var/obj/structure/mirror/evil_mirror in the_turf) + to_chat(living_guy, span_warning("You pass by the mirror and glance at it...")) + if(evil_mirror.broken) + to_chat(living_guy, span_notice("You feel lucky, somehow.")) + return + switch(rand(1, 5)) + if(1) + to_chat(living_guy, span_warning("The mirror explodes into a million pieces! Wait, does that mean you're even more unlucky?")) + evil_mirror.take_damage(evil_mirror.max_integrity, BRUTE, MELEE, FALSE) + if(prob(50 * luck_mod)) // sometimes + luck_mod += 0.25 + damage_mod += 0.25 + if(2 to 3) + to_chat(living_guy, span_big(span_hypnophrase("Oh god, you can't see your reflection!!"))) + if(isvampire(living_guy)) // not so living i suppose + to_chat(living_guy, span_green("Well, obviously.")) + return + INVOKE_ASYNC(living_guy, TYPE_PROC_REF(/mob, emote), "scream") + + if(4 to 5) + if(isvampire(living_guy)) + to_chat(living_guy, span_warning("You don't see anything of notice. Huh.")) + return + to_chat(living_guy, span_userdanger("You see your reflection, but it is grinning malevolently and staring directly at you!")) + INVOKE_ASYNC(living_guy, TYPE_PROC_REF(/mob, emote), "scream") + + living_guy.set_jitter_if_lower(25 SECONDS) + if(prob(7 * luck_mod)) + to_chat(living_guy, span_warning("You are completely shocked by this turn of events!")) + var/mob/living/carbon/carbon_guy = living_guy + to_chat(living_guy, span_userdanger("You clutch at your heart!")) + if(istype(carbon_guy)) + carbon_guy.set_heartattack(status = TRUE) + + if(!permanent && prob(33.3)) + qdel(src) + /datum/component/omen/proc/slam_airlock(obj/machinery/door/airlock/darth_airlock) . = darth_airlock.close(force_crush = TRUE) if(. && !permanent && !prob(66.6)) @@ -175,7 +238,7 @@ return ..() death_explode(our_guy) - our_guy.gib() + our_guy.gib(DROP_ALL_REMAINS) /** * The quirk omen. Permanent. @@ -196,7 +259,7 @@ /datum/component/omen/quirk/check_death(mob/living/our_guy) if(!iscarbon(our_guy)) - our_guy.gib() + our_guy.gib(DROP_ALL_REMAINS) return // Don't explode if buckled to a stasis bed @@ -207,7 +270,7 @@ death_explode(our_guy) var/mob/living/carbon/player = our_guy - player.spread_bodyparts(skip_head = TRUE) + player.spread_bodyparts() player.spawn_gibs() return diff --git a/code/datums/components/on_hit_effect.dm b/code/datums/components/on_hit_effect.dm index 62bc2ae219e9f..38610395248b3 100644 --- a/code/datums/components/on_hit_effect.dm +++ b/code/datums/components/on_hit_effect.dm @@ -18,6 +18,11 @@ if(!(ismachinery(parent) || isstructure(parent) || isgun(parent) || isprojectilespell(parent) || isitem(parent) || isanimal_or_basicmob(parent) || isprojectile(parent))) return ELEMENT_INCOMPATIBLE +/datum/component/on_hit_effect/Destroy(force, silent) + on_hit_callback = null + extra_check_callback = null + return ..() + /datum/component/on_hit_effect/RegisterWithParent() if(ismachinery(parent) || isstructure(parent) || isgun(parent) || isprojectilespell(parent)) RegisterSignal(parent, COMSIG_PROJECTILE_ON_HIT, PROC_REF(on_projectile_hit)) @@ -59,18 +64,18 @@ return on_hit_callback.Invoke(attacker, attacker, target, attacker.zone_selected) -/datum/component/on_hit_effect/proc/on_projectile_hit(datum/fired_from, atom/movable/firer, atom/target, angle, obj/item/bodypart/hit_limb) +/datum/component/on_hit_effect/proc/on_projectile_hit(datum/fired_from, atom/movable/firer, atom/target, angle, body_zone) SIGNAL_HANDLER if(extra_check_callback) if(!extra_check_callback.Invoke(firer, target)) return - on_hit_callback.Invoke(fired_from, firer, target, hit_limb.body_zone) + on_hit_callback.Invoke(fired_from, firer, target, body_zone) -/datum/component/on_hit_effect/proc/on_projectile_self_hit(datum/source, mob/firer, atom/target, angle, obj/item/bodypart/hit_limb) +/datum/component/on_hit_effect/proc/on_projectile_self_hit(datum/source, mob/firer, atom/target, angle, body_zone) SIGNAL_HANDLER if(extra_check_callback) if(!extra_check_callback.Invoke(firer, target)) return - on_hit_callback.Invoke(source, firer, target, hit_limb.body_zone) + on_hit_callback.Invoke(source, firer, target, body_zone) diff --git a/code/datums/components/payment.dm b/code/datums/components/payment.dm index 81c93af685326..005cd1fe03ea7 100644 --- a/code/datums/components/payment.dm +++ b/code/datums/components/payment.dm @@ -35,11 +35,9 @@ /datum/component/payment/RegisterWithParent() RegisterSignal(parent, COMSIG_OBJ_ATTEMPT_CHARGE, PROC_REF(attempt_charge)) RegisterSignal(parent, COMSIG_OBJ_ATTEMPT_CHARGE_CHANGE, PROC_REF(change_cost)) - RegisterSignal(SSdcs, COMSIG_GLOB_REVOLUTION_VICTORY, PROC_REF(clean_up)) /datum/component/payment/UnregisterFromParent() UnregisterSignal(parent, list(COMSIG_OBJ_ATTEMPT_CHARGE, COMSIG_OBJ_ATTEMPT_CHARGE_CHANGE)) - UnregisterSignal(SSdcs, COMSIG_GLOB_REVOLUTION_VICTORY) /datum/component/payment/proc/attempt_charge(datum/source, atom/movable/target, extra_fees = 0) SIGNAL_HANDLER diff --git a/code/datums/components/pellet_cloud.dm b/code/datums/components/pellet_cloud.dm index a37f526389c15..a3a590a989cf8 100644 --- a/code/datums/components/pellet_cloud.dm +++ b/code/datums/components/pellet_cloud.dm @@ -10,7 +10,7 @@ * * Pellet cloud currently works on two classes of sources: directed (ammo casings), and circular (grenades, landmines). * -Directed: This means you're shooting multiple pellets, like buckshot. If an ammo casing is defined as having multiple pellets, it will automatically create a pellet cloud - * and call COMSIG_PELLET_CLOUD_INIT (see [/obj/item/ammo_casing/proc/fire_casing]). Thus, the only projectiles fired will be the ones fired here. + * and call COMSIG_FIRE_CASING (see [/obj/item/ammo_casing/proc/fire_casing]). Thus, the only projectiles fired will be the ones fired here. * The magnitude var controls how many pellets are created. * -Circular: This results in a big spray of shrapnel flying all around the detonation point when the grenade fires COMSIG_GRENADE_DETONATE or landmine triggers COMSIG_MINE_TRIGGERED. * The magnitude var controls how big the detonation radius is (the bigger the magnitude, the more shrapnel is created). Grenades can be covered with bodies to reduce shrapnel output. @@ -80,7 +80,7 @@ /datum/component/pellet_cloud/RegisterWithParent() RegisterSignal(parent, COMSIG_PREQDELETED, PROC_REF(nullspace_parent)) if(isammocasing(parent)) - RegisterSignal(parent, COMSIG_PELLET_CLOUD_INIT, PROC_REF(create_casing_pellets)) + RegisterSignal(parent, COMSIG_FIRE_CASING, PROC_REF(create_casing_pellets)) else if(isgrenade(parent)) RegisterSignal(parent, COMSIG_GRENADE_ARMED, PROC_REF(grenade_armed)) RegisterSignal(parent, COMSIG_GRENADE_DETONATE, PROC_REF(create_blast_pellets)) @@ -90,15 +90,15 @@ RegisterSignal(parent, COMSIG_SUPPLYPOD_LANDED, PROC_REF(create_blast_pellets)) /datum/component/pellet_cloud/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_PREQDELETED, COMSIG_PELLET_CLOUD_INIT, COMSIG_GRENADE_DETONATE, COMSIG_GRENADE_ARMED, COMSIG_MOVABLE_MOVED, COMSIG_MINE_TRIGGERED, COMSIG_ITEM_DROPPED)) + UnregisterSignal(parent, list(COMSIG_PREQDELETED, COMSIG_FIRE_CASING, COMSIG_GRENADE_DETONATE, COMSIG_GRENADE_ARMED, COMSIG_MOVABLE_MOVED, COMSIG_MINE_TRIGGERED, COMSIG_ITEM_DROPPED)) /** * create_casing_pellets() is for directed pellet clouds for ammo casings that have multiple pellets (buckshot and scatter lasers for instance) * * Honestly this is mostly just a rehash of [/obj/item/ammo_casing/proc/fire_casing] for pellet counts > 1, except this lets us tamper with the pellets and hook onto them for tracking purposes. - * The arguments really don't matter, this proc is triggered by COMSIG_PELLET_CLOUD_INIT which is only for this really, it's just a big mess of the state vars we need for doing the stuff over here. + * The arguments really don't matter, while this proc is triggered by COMSIG_FIRE_CASING, it's just a big mess of the state vars we need for doing the stuff over here. */ -/datum/component/pellet_cloud/proc/create_casing_pellets(obj/item/ammo_casing/shell, atom/target, mob/living/user, fired_from, randomspread, spread, zone_override, params, distro) +/datum/component/pellet_cloud/proc/create_casing_pellets(obj/item/ammo_casing/shell, atom/target, mob/living/user, fired_from, randomspread, spread, zone_override, params, distro, obj/projectile/proj) SIGNAL_HANDLER shooter = user @@ -307,7 +307,7 @@ var/damage_dealt = wound_info_by_part[hit_part][CLOUD_POSITION_DAMAGE] var/w_bonus = wound_info_by_part[hit_part][CLOUD_POSITION_W_BONUS] var/bw_bonus = wound_info_by_part[hit_part][CLOUD_POSITION_BW_BONUS] - var/wound_type = (initial(P.damage_type) == BRUTE) ? WOUND_BLUNT : WOUND_BURN // sharpness is handled in the wound rolling + var/wounding_type = (initial(P.damage_type) == BRUTE) ? WOUND_BLUNT : WOUND_BURN // sharpness is handled in the wound rolling wound_info_by_part -= hit_part // technically this only checks armor worn the moment that all the pellets resolve rather than as each one hits you, @@ -320,7 +320,7 @@ armor_factor *= ARMOR_WEAKENED_MULTIPLIER damage_dealt *= max(0, 1 - armor_factor*0.01) - hit_part.painless_wound_roll(wound_type, damage_dealt, w_bonus, bw_bonus, initial(P.sharpness)) + hit_part.painless_wound_roll(wounding_type, damage_dealt, w_bonus, bw_bonus, initial(P.sharpness)) var/limb_hit_text = "" if(hit_part) diff --git a/code/datums/components/pet_commands/obeys_commands.dm b/code/datums/components/pet_commands/obeys_commands.dm index f3201bc63db76..efe01985d20ab 100644 --- a/code/datums/components/pet_commands/obeys_commands.dm +++ b/code/datums/components/pet_commands/obeys_commands.dm @@ -59,7 +59,7 @@ return if (!(user in source.ai_controller?.blackboard[BB_FRIENDS_LIST])) return - examine_list += span_notice("[source.p_they(capitalized = TRUE)] seem[source.p_s()] happy to see you!") + examine_list += span_notice("[source.p_They()] seem[source.p_s()] happy to see you!") /// Displays a radial menu of commands /datum/component/obeys_commands/proc/display_menu(datum/source, mob/living/clicker) diff --git a/code/datums/components/pet_commands/pet_commands_basic.dm b/code/datums/components/pet_commands/pet_commands_basic.dm index a562c11684329..ff29b8f37d2df 100644 --- a/code/datums/components/pet_commands/pet_commands_basic.dm +++ b/code/datums/components/pet_commands/pet_commands_basic.dm @@ -7,7 +7,7 @@ /datum/pet_command/idle command_name = "Stay" command_desc = "Command your pet to stay idle in this location." - radial_icon = 'icons/obj/objects.dmi' + radial_icon = 'icons/obj/bed.dmi' radial_icon_state = "dogbed" speech_commands = list("sit", "stay", "stop") command_feedback = "sits" @@ -111,7 +111,7 @@ pointed_reaction = "and growls" /// Balloon alert to display if providing an invalid target var/refuse_reaction = "shakes head" - /// Attack behaviour to use, generally you will want to override this to add some kind of cooldown + /// Attack behaviour to use var/attack_behaviour = /datum/ai_behavior/basic_melee_attack // Refuse to target things we can't target, chiefly other friends @@ -164,3 +164,45 @@ // We also don't check if the cooldown is over because there's no way a pet owner can know that, the behaviour will handle it controller.queue_behavior(/datum/ai_behavior/pet_use_ability, pet_ability_key, BB_CURRENT_PET_TARGET) return SUBTREE_RETURN_FINISH_PLANNING + +/datum/pet_command/protect_owner + command_name = "Protect owner" + command_desc = "Your pet will run to your aid." + hidden = TRUE + ///the range our owner needs to be in for us to protect him + var/protect_range = 9 + ///the behavior we will use when he is attacked + var/protect_behavior = /datum/ai_behavior/basic_melee_attack + +/datum/pet_command/protect_owner/add_new_friend(mob/living/tamer) + RegisterSignal(tamer, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(set_attacking_target)) + if(!HAS_TRAIT(tamer, TRAIT_RELAYING_ATTACKER)) + tamer.AddElement(/datum/element/relay_attackers) + +/datum/pet_command/protect_owner/remove_friend(mob/living/unfriended) + UnregisterSignal(unfriended, COMSIG_ATOM_WAS_ATTACKED) + +/datum/pet_command/protect_owner/execute_action(datum/ai_controller/controller) + var/datum/targetting_datum/basic/targetting = controller.blackboard[BB_TARGETTING_DATUM] + var/mob/living/victim = controller.blackboard[BB_CURRENT_PET_TARGET] + if(QDELETED(victim)) + return + if(victim.stat > targetting.stat_attack) + controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND) + return + controller.queue_behavior(protect_behavior, BB_CURRENT_PET_TARGET, BB_PET_TARGETTING_DATUM) + return SUBTREE_RETURN_FINISH_PLANNING + +/datum/pet_command/protect_owner/set_command_active(mob/living/parent, mob/living/victim) + . = ..() + set_command_target(parent, victim) + +/datum/pet_command/protect_owner/proc/set_attacking_target(atom/source, mob/living/attacker) + var/mob/living/basic/owner = weak_parent.resolve() + if(isnull(owner)) + return + var/mob/living/current_target = owner.ai_controller?.blackboard[BB_CURRENT_PET_TARGET] + if(attacker == current_target) //we are already dealing with this target + return + if(isliving(attacker) && can_see(owner, attacker, protect_range)) + set_command_active(owner, attacker) diff --git a/code/datums/components/plumbing/_plumbing.dm b/code/datums/components/plumbing/_plumbing.dm index 1236a690c96bb..b140b003e6c9a 100644 --- a/code/datums/components/plumbing/_plumbing.dm +++ b/code/datums/components/plumbing/_plumbing.dm @@ -174,9 +174,9 @@ var/image/overlay if(turn_connects) - overlay = image('icons/obj/plumbing/connects.dmi', "[direction_text]-[ducting_layer]", layer = duct_layer) + overlay = image('icons/obj/pipes_n_cables/hydrochem/connects.dmi', "[direction_text]-[ducting_layer]", layer = duct_layer) else - overlay = image('icons/obj/plumbing/connects.dmi', "[direction_text]-[ducting_layer]-s", layer = duct_layer) + overlay = image('icons/obj/pipes_n_cables/hydrochem/connects.dmi', "[direction_text]-[ducting_layer]-s", layer = duct_layer) overlay.dir = direction overlay.color = color @@ -187,7 +187,7 @@ // This is a little wiggley extension to make wallmounts like sinks and showers visually link to the pipe if(extend_pipe_to_edge && !extension_handled) - var/image/edge_overlay = image('icons/obj/plumbing/connects.dmi', "edge-extension", layer = duct_layer) + var/image/edge_overlay = image('icons/obj/pipes_n_cables/hydrochem/connects.dmi', "edge-extension", layer = duct_layer) edge_overlay.dir = parent_movable.dir edge_overlay.color = color edge_overlay.pixel_x = -parent_movable.pixel_x - parent_movable.pixel_w @@ -217,7 +217,7 @@ for(var/obj/machinery/duct/duct in get_step(parent, direction)) if(!(duct.duct_layer & ducting_layer)) continue - duct.remove_connects(turn(direction, 180)) + duct.remove_connects(REVERSE_DIR(direction)) duct.neighbours.Remove(parent) duct.update_appearance() @@ -302,7 +302,7 @@ /datum/component/plumbing/proc/direct_connect(datum/component/plumbing/plumbing, dir) if(!plumbing.active) return - var/opposite_dir = turn(dir, 180) + var/opposite_dir = REVERSE_DIR(dir) if(plumbing.demand_connects & opposite_dir && supply_connects & dir || plumbing.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) diff --git a/code/datums/components/puzzgrid.dm b/code/datums/components/puzzgrid.dm index 0f54fce9929ca..8a7620b06e32b 100644 --- a/code/datums/components/puzzgrid.dm +++ b/code/datums/components/puzzgrid.dm @@ -55,6 +55,12 @@ addtimer(CALLBACK(src, PROC_REF(out_of_time)), timer) time_to_finish = world.time + timer +/datum/component/puzzgrid/Destroy(force, silent) + puzzgrid = null + on_victory_callback = null + on_fail_callback = null + return ..() + /datum/component/puzzgrid/RegisterWithParent() RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_attack_hand)) diff --git a/code/datums/components/radioactive_exposure.dm b/code/datums/components/radioactive_exposure.dm new file mode 100644 index 0000000000000..0819b46f7dfa1 --- /dev/null +++ b/code/datums/components/radioactive_exposure.dm @@ -0,0 +1,78 @@ +/// For directly applying to carbons to irradiate them, without pulses +/datum/component/radioactive_exposure + dupe_mode = COMPONENT_DUPE_ALLOWED + + /// Base irradiation chance + var/irradiation_chance_base + /// Chance we have of applying irradiation + var/irradiation_chance + /// The amount the base chance is increased after every failed irradiation check + var/irradiation_chance_increment + /// Time till we attempt the next irradiation check + var/irradiation_interval + /// The source of irradiation, for logging + var/source + /// Area's where the component isnt removed if we cross to them + var/list/radioactive_areas + +/datum/component/radioactive_exposure/Initialize( + minimum_exposure_time, + irradiation_chance_base, + irradiation_chance_increment, + irradiation_interval, + source, + radioactive_areas + ) + + if(!iscarbon(parent)) + return COMPONENT_INCOMPATIBLE + + src.irradiation_chance_base = irradiation_chance_base + src.irradiation_chance = irradiation_chance_base + src.irradiation_chance_increment = irradiation_chance_increment + src.irradiation_interval = irradiation_interval + src.source = source + src.radioactive_areas = radioactive_areas + + // We use generally long times, so it's probably easier and more interpretable to just use a timer instead of processing the component + addtimer(CALLBACK(src, PROC_REF(attempt_irradiate)), minimum_exposure_time) + + RegisterSignal(parent, COMSIG_MOVABLE_EXITED_AREA, PROC_REF(on_exited)) + + var/mob/living/living_parent = parent + living_parent.throw_alert(ALERT_RADIOACTIVE_AREA, /atom/movable/screen/alert/radioactive_area) + +/// Try and irradiate them. If we chance fail, we come back harder +/datum/component/radioactive_exposure/proc/attempt_irradiate() + if(!SSradiation.wearing_rad_protected_clothing(parent) && SSradiation.can_irradiate_basic(parent)) + if(prob(irradiation_chance)) + SSradiation.irradiate(parent) + var/atom/atom = parent + atom.investigate_log("was irradiated by [source].", INVESTIGATE_RADIATION) + else + irradiation_chance += irradiation_chance_increment + else // we're immune, either through species, clothing, already being irradiated, etcetera + // we slowly decrease the prob chance untill we hit the base probability again + irradiation_chance = max(irradiation_chance - irradiation_chance_increment, irradiation_chance_base) + + // Even if they are immune, or got irradiated plan a new check in-case they lose their protection or irradiation + addtimer(CALLBACK(src, PROC_REF(attempt_irradiate)), irradiation_interval) + +/datum/component/radioactive_exposure/proc/on_exited(atom/movable/also_parent, area/old_area, direction) + SIGNAL_HANDLER + + if(istype(get_area(parent), radioactive_areas)) //we left to another area that is also radioactive, so dont do anything + return + + qdel(src) + +/datum/component/radioactive_exposure/Destroy(force, silent) + var/mob/living/carbon/human/human_parent = parent + human_parent.clear_alert(ALERT_RADIOACTIVE_AREA) + + return ..() + +/atom/movable/screen/alert/radioactive_area + name = "Radioactive Area" + desc = "This place is no good! We need to get some protection or get out fast!" + icon_state = ALERT_RADIOACTIVE_AREA diff --git a/code/datums/components/ranged_attacks.dm b/code/datums/components/ranged_attacks.dm new file mode 100644 index 0000000000000..f75d29a10f454 --- /dev/null +++ b/code/datums/components/ranged_attacks.dm @@ -0,0 +1,88 @@ +/** + * Configurable ranged attack for basic mobs. + */ +/datum/component/ranged_attacks + /// What kind of casing do we use to fire? + var/casing_type + /// What kind of projectile to we fire? Use only one of this or casing_type + var/projectile_type + /// Sound to play when we fire our projectile + var/projectile_sound + /// how many shots we will fire + var/burst_shots + /// intervals between shots + var/burst_intervals + /// Time to wait between shots + var/cooldown_time + /// Tracks time between shots + COOLDOWN_DECLARE(fire_cooldown) + +/datum/component/ranged_attacks/Initialize( + casing_type, + projectile_type, + projectile_sound = 'sound/weapons/gun/pistol/shot.ogg', + burst_shots, + burst_intervals = 0.2 SECONDS, + cooldown_time = 3 SECONDS, +) + . = ..() + if(!isbasicmob(parent)) + return COMPONENT_INCOMPATIBLE + + src.casing_type = casing_type + src.projectile_sound = projectile_sound + src.projectile_type = projectile_type + src.cooldown_time = cooldown_time + + if (casing_type && projectile_type) + CRASH("Set both casing type and projectile type in [parent]'s ranged attacks component! uhoh! stinky!") + if (!casing_type && !projectile_type) + CRASH("Set neither casing type nor projectile type in [parent]'s ranged attacks component! What are they supposed to be attacking with, air?") + if(burst_shots <= 1) + return + src.burst_shots = burst_shots + src.burst_intervals = burst_intervals + +/datum/component/ranged_attacks/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_MOB_ATTACK_RANGED, PROC_REF(fire_ranged_attack)) + ADD_TRAIT(parent, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, type) + +/datum/component/ranged_attacks/UnregisterFromParent() + . = ..() + UnregisterSignal(parent, COMSIG_MOB_ATTACK_RANGED) + REMOVE_TRAIT(parent, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, type) + +/datum/component/ranged_attacks/proc/fire_ranged_attack(mob/living/basic/firer, atom/target, modifiers) + SIGNAL_HANDLER + if (!COOLDOWN_FINISHED(src, fire_cooldown)) + return + COOLDOWN_START(src, fire_cooldown, cooldown_time) + INVOKE_ASYNC(src, PROC_REF(async_fire_ranged_attack), firer, target, modifiers) + if(isnull(burst_shots)) + return + for(var/i in 1 to (burst_shots - 1)) + addtimer(CALLBACK(src, PROC_REF(async_fire_ranged_attack), firer, target, modifiers), i * burst_intervals) + +/// Actually fire the damn thing +/datum/component/ranged_attacks/proc/async_fire_ranged_attack(mob/living/basic/firer, atom/target, modifiers) + firer.face_atom(target) + if(projectile_type) + firer.fire_projectile(projectile_type, target, projectile_sound) + SEND_SIGNAL(parent, COMSIG_BASICMOB_POST_ATTACK_RANGED, target, modifiers) + return + playsound(firer, projectile_sound, 100, TRUE) + var/turf/startloc = get_turf(firer) + var/obj/item/ammo_casing/casing = new casing_type(startloc) + var/target_zone + if(ismob(target)) + var/mob/target_mob = target + target_zone = target_mob.get_random_valid_zone() + else + target_zone = ran_zone() + casing.fire_casing(target, firer, null, null, null, target_zone, 0, firer) + casing.update_appearance() + casing.AddElement(/datum/element/temporary_atom, 30 SECONDS) + SEND_SIGNAL(parent, COMSIG_BASICMOB_POST_ATTACK_RANGED, target, modifiers) + return + diff --git a/code/datums/components/reagent_refiller.dm b/code/datums/components/reagent_refiller.dm index ae223488bc029..4e2da58c79bc9 100644 --- a/code/datums/components/reagent_refiller.dm +++ b/code/datums/components/reagent_refiller.dm @@ -28,6 +28,10 @@ return ..() +/datum/component/reagent_refiller/Destroy(force, silent) + power_draw_callback = null + return ..() + /datum/component/reagent_refiller/RegisterWithParent() RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, PROC_REF(refill)) RegisterSignal(parent, COMSIG_ATOM_EXITED, PROC_REF(delete_self)) diff --git a/code/datums/components/reflection.dm b/code/datums/components/reflection.dm new file mode 100644 index 0000000000000..80532ca2a6108 --- /dev/null +++ b/code/datums/components/reflection.dm @@ -0,0 +1,132 @@ +/** + * A simple-ish component that reflects the icons of movables on the parent like a mirror. + * Sadly, there's no easy way to make the SOUTH dir reflection flip the visual so that you can see + * the back NORTH dir of a target while it's facing SOUTH beside adding the VIS_INHERIT_DIR flag + * to the target movable, which I'm not doing to spare eventual issues with other vis overlays in the future. + */ +/datum/component/reflection + /** + * The direction from which the component gets its visual overlays. + * The visuals are also flipped horizontally or vertically based on it. + */ + var/reflected_dir + /// the movable which the reflected movables are attached to, in turn added to the vis contents of the parent. + var/obj/effect/abstract/reflection_holder + /// A lazy assoc list that keeps track of which movables are being reflected and the associated reflections. + var/list/reflected_movables + /// A callback used check to know which movables should be reflected and which not. + var/datum/callback/can_reflect + ///the base matrix used by reflections + var/matrix/reflection_matrix + ///the filter data added to reflection holder. + var/list/reflection_filter + ///the transparency channel value of the reflection holder. + var/alpha + ///A list of signals that when sent to the parent, will force the comp to recalculate the reflected movables. + var/list/update_signals + +/datum/component/reflection/Initialize(reflected_dir = NORTH, list/reflection_filter, matrix/reflection_matrix, datum/callback/can_reflect, alpha = 150, list/update_signals) + if(!ismovable(parent)) + return COMPONENT_INCOMPATIBLE + + var/static/list/connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_movable_entered_or_initialized), + COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON = PROC_REF(on_movable_entered_or_initialized), + COMSIG_ATOM_EXITED = PROC_REF(on_movable_exited) + ) + AddComponent(/datum/component/connect_range, parent, connections, 1, works_in_containers = FALSE) + src.reflected_dir = reflected_dir + src.reflection_matrix = reflection_matrix + src.reflection_filter = reflection_filter + src.can_reflect = can_reflect + reflection_holder = new(parent) + reflection_holder.alpha = alpha + reflection_holder.appearance_flags = KEEP_TOGETHER + reflection_holder.vis_flags = VIS_INHERIT_ID + reflection_holder.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + if(reflection_filter) + reflection_holder.add_filter("reflection", 1, reflection_filter) + + var/atom/movable/mov_parent = parent + mov_parent.vis_contents += reflection_holder + set_reflection(new_dir = mov_parent.dir) + + RegisterSignal(parent, COMSIG_ATOM_DIR_CHANGE, PROC_REF(on_dir_change)) + var/list/reflect_update_signals = list(COMSIG_MOVABLE_MOVED) + update_signals + RegisterSignals(parent, reflect_update_signals, PROC_REF(get_reflection_targets)) + +/datum/component/reflection/Destroy(force, silent) + QDEL_LIST_ASSOC_VAL(reflected_movables) + QDEL_NULL(reflection_holder) + can_reflect = null + return ..() + +///Called when the parent changes its direction. +/datum/component/reflection/proc/on_dir_change(atom/movable/source, old_dir, new_dir) + SIGNAL_HANDLER + set_reflection(old_dir, new_dir) + +///Turns the allowed reflected direction alongside the parent's dir. then calls get_reflection_targets. +/datum/component/reflection/proc/set_reflection(old_dir = SOUTH, new_dir = SOUTH) + if(old_dir == new_dir) + return + + reflected_dir = turn(reflected_dir, dir2angle(new_dir) - dir2angle(old_dir)) + get_reflection_targets() + +///Unsets the old reflected movables and sets it with new ones. +/datum/component/reflection/proc/get_reflection_targets(atom/movable/source) + SIGNAL_HANDLER + QDEL_LIST_ASSOC_VAL(reflected_movables) + for(var/atom/movable/target in view(1, source)) + if(check_can_reflect(target, FALSE)) + set_reflected(target) + +///Checks if the target movable can be reflected or not. +/datum/component/reflection/proc/check_can_reflect(atom/movable/target, check_view = TRUE) + if(target == parent || (check_view && !(target in view(1, parent)))) + return FALSE + var/atom/movable/mov_parent = parent + if(target.loc != mov_parent.loc && get_dir(mov_parent, target) != reflected_dir) + return FALSE + if(can_reflect && !can_reflect.Invoke(target)) + return FALSE + return TRUE + +///Called when a movable enters a turf within the connected range +/datum/component/reflection/proc/on_movable_entered_or_initialized(atom/movable/source, atom/movable/arrived) + SIGNAL_HANDLER + if(LAZYACCESS(reflected_movables, arrived) || !check_can_reflect(arrived)) + return + set_reflected(arrived) + +///Called when a movable exits a turf within the connected range +/datum/component/reflection/proc/on_movable_exited(atom/movable/source, atom/movable/gone) + SIGNAL_HANDLER + var/atom/movable/reflection = LAZYACCESS(reflected_movables, gone) + if(!reflection || check_can_reflect(gone)) + return + qdel(reflection) + LAZYREMOVE(reflected_movables, gone) + +///Sets up a visual overlay of the target movables, which is added to the parent's vis contents. +/datum/component/reflection/proc/set_reflected(atom/movable/target) + SIGNAL_HANDLER + /** + * If the loc is null, only a black (or grey depending on alpha) silhouette of the target will be rendered + * Just putting this information here in case you want something like that in the future. + */ + var/obj/effect/abstract/reflection = new(parent) + reflection.vis_flags = VIS_INHERIT_ID + if(!target.render_target) + target.render_target = REF(target) + reflection.render_source = target.render_target + ///The filter is added to the reflection holder; the matrix is not, otherwise that'd go affecting the filter. + if(reflection_matrix) + reflection.transform = reflection_matrix + if(reflected_dir == NORTH) + reflection.transform = reflection.transform.Scale(1, -1) + else if(reflected_dir != SOUTH) + reflection.transform = reflection.transform.Scale(-1, 1) + LAZYSET(reflected_movables, target, reflection) + reflection_holder.vis_contents += reflection diff --git a/code/datums/components/religious_tool.dm b/code/datums/components/religious_tool.dm index 2571f0c13d47f..4c0646b3a5595 100644 --- a/code/datums/components/religious_tool.dm +++ b/code/datums/components/religious_tool.dm @@ -27,6 +27,15 @@ after_sect_select_cb = _after_sect_select_cb if(override_catalyst_type) catalyst_type = override_catalyst_type + RegisterSignal(SSdcs, COMSIG_RELIGIOUS_SECT_CHANGED, PROC_REF(SetGlobalToLocal)) + RegisterSignal(SSdcs, COMSIG_RELIGIOUS_SECT_RESET, PROC_REF(on_sect_reset)) + +/datum/component/religious_tool/Destroy(force, silent) + easy_access_sect = null + performing_rite = null + catalyst_type = null + after_sect_select_cb = null + return ..() /datum/component/religious_tool/RegisterWithParent() RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(AttemptActions)) @@ -39,15 +48,21 @@ * Sets the easy access variable to the global if it exists. */ /datum/component/religious_tool/proc/SetGlobalToLocal() + SIGNAL_HANDLER if(easy_access_sect) return TRUE if(!GLOB.religious_sect) return FALSE easy_access_sect = GLOB.religious_sect - if(after_sect_select_cb) - after_sect_select_cb.Invoke() + after_sect_select_cb?.Invoke() return TRUE +/// Sets the easy access variable to null in case an admin needed to change it +/datum/component/religious_tool/proc/on_sect_reset() + SIGNAL_HANDLER + easy_access_sect = null + after_sect_select_cb?.Invoke() + /** * Since all of these involve attackby, we require mega proc. Handles Invocation, Sacrificing, And Selection of Sects. */ @@ -59,9 +74,9 @@ /**********Sacrificing**********/ else if(operation_flags & RELIGION_TOOL_SACRIFICE) - if(!easy_access_sect?.can_sacrifice(the_item,user)) + if(!easy_access_sect?.can_sacrifice(the_item, user)) return - easy_access_sect.on_sacrifice(the_item,user) + easy_access_sect.on_sacrifice(the_item, user) return COMPONENT_NO_AFTERATTACK /datum/component/religious_tool/ui_interact(mob/user, datum/tgui/ui) @@ -116,27 +131,13 @@ /// Select the sect, called from [/datum/component/religious_tool/proc/AttemptActions] /datum/component/religious_tool/proc/select_sect(mob/living/user, path) - if(!ispath(text2path(path), /datum/religion_sect)) - message_admins("[ADMIN_LOOKUPFLW(usr)] has tried to spawn an item when selecting a sect.") - return if(user.mind.holy_role != HOLY_ROLE_HIGHPRIEST) to_chat(user, span_warning("You are not the high priest, and therefore cannot select a religious sect.")) return if(!user.can_perform_action(parent, FORBID_TELEKINESIS_REACH)) to_chat(user,span_warning("You cannot select a sect at this time.")) return - if(GLOB.religious_sect) - return - GLOB.religious_sect = new path() - for(var/i in GLOB.player_list) - if(!isliving(i)) - continue - var/mob/living/am_i_holy_living = i - if(!am_i_holy_living.mind?.holy_role) - continue - GLOB.religious_sect.on_conversion(am_i_holy_living) - easy_access_sect = GLOB.religious_sect - after_sect_select_cb.Invoke() + set_new_religious_sect(text2path(path)) /// Perform the rite, called from [/datum/component/religious_tool/proc/AttemptActions] /datum/component/religious_tool/proc/perform_rite(mob/living/user, path) @@ -205,7 +206,7 @@ * Generates an english list (so string) of wanted sac items. Returns null if no targets! */ /datum/component/religious_tool/proc/generate_sacrifice_list() - if(!easy_access_sect.desired_items) + if(!length(easy_access_sect?.desired_items)) return //specifically null so the data sends as such var/list/item_names = list() for(var/atom/sac_type as anything in easy_access_sect.desired_items) @@ -231,7 +232,7 @@ if(!can_i_see) return examine_list += span_notice("Use a bible to interact with this.") - if(!easy_access_sect) + if(isnull(easy_access_sect)) if(operation_flags & RELIGION_TOOL_SECTSELECT) examine_list += span_notice("This looks like it can be used to select a sect.") return diff --git a/code/datums/components/remote_materials.dm b/code/datums/components/remote_materials.dm deleted file mode 100644 index a3c61221c6fe6..0000000000000 --- a/code/datums/components/remote_materials.dm +++ /dev/null @@ -1,188 +0,0 @@ -/* -This component allows machines to connect remotely to a material container -(namely an /obj/machinery/ore_silo) elsewhere. It offers optional graceful -fallback to a local material storage in case remote storage is unavailable, and -handles linking back and forth. -*/ - -/datum/component/remote_materials - // Three possible states: - // 1. silo exists, materials is parented to silo - // 2. silo is null, materials is parented to parent - // 3. silo is null, materials is null - var/obj/machinery/ore_silo/silo - var/datum/component/material_container/mat_container - var/category - var/allow_standalone - var/local_size = INFINITY - ///Flags used when converting inserted materials into their component materials. - var/mat_container_flags = NONE - -/datum/component/remote_materials/Initialize(category, mapload, allow_standalone = TRUE, force_connect = FALSE, mat_container_flags=NONE) - if (!isatom(parent)) - return COMPONENT_INCOMPATIBLE - - src.category = category - src.allow_standalone = allow_standalone - src.mat_container_flags = mat_container_flags - - RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(OnAttackBy)) - RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), PROC_REF(OnMultitool)) - - var/turf/T = get_turf(parent) - if (force_connect || (mapload && is_station_level(T.z))) - addtimer(CALLBACK(src, PROC_REF(LateInitialize))) - else if (allow_standalone) - _MakeLocal() - -/datum/component/remote_materials/proc/LateInitialize() - silo = GLOB.ore_silo_default - if (silo) - silo.ore_connected_machines += src - mat_container = silo.GetComponent(/datum/component/material_container) - else - _MakeLocal() - -/datum/component/remote_materials/Destroy() - if (silo) - silo.ore_connected_machines -= src - silo.updateUsrDialog() - silo = null - mat_container = null - else if (mat_container) - // specify explicitly in case the other component is deleted first - var/atom/P = parent - mat_container.retrieve_all(P.drop_location()) - QDEL_NULL(mat_container) - return ..() - -/datum/component/remote_materials/proc/_MakeLocal() - silo = null - - var/static/list/allowed_mats = list( - /datum/material/iron, - /datum/material/glass, - /datum/material/silver, - /datum/material/gold, - /datum/material/diamond, - /datum/material/plasma, - /datum/material/uranium, - /datum/material/bananium, - /datum/material/titanium, - /datum/material/bluespace, - /datum/material/plastic, - ) - - mat_container = parent.AddComponent(/datum/component/material_container, allowed_mats, local_size, mat_container_flags, allowed_items=/obj/item/stack) - -/datum/component/remote_materials/proc/toggle_holding(force_hold = FALSE) - if(isnull(silo)) - return - - if(force_hold) - silo.holds[src] = TRUE - else if(!silo.holds[src]) - silo.holds[src] = TRUE - else - silo.holds -= src - -/datum/component/remote_materials/proc/set_local_size(size) - local_size = size - if (!silo && mat_container) - mat_container.max_amount = size - -// called if disconnected by ore silo UI or destruction -/datum/component/remote_materials/proc/disconnect_from(obj/machinery/ore_silo/old_silo) - if (!old_silo || silo != old_silo) - return - silo.ore_connected_machines -= src - silo = null - mat_container = null - if (allow_standalone) - _MakeLocal() - -/datum/component/remote_materials/proc/OnAttackBy(datum/source, obj/item/I, mob/user) - SIGNAL_HANDLER - - if (silo && isstack(I)) - if (silo.remote_attackby(parent, user, I, mat_container_flags)) - return COMPONENT_NO_AFTERATTACK - -/datum/component/remote_materials/proc/OnMultitool(datum/source, mob/user, obj/item/I) - SIGNAL_HANDLER - - if(!I.multitool_check_buffer(user, I)) - return COMPONENT_BLOCK_TOOL_ATTACK - var/obj/item/multitool/M = I - if (!QDELETED(M.buffer) && istype(M.buffer, /obj/machinery/ore_silo)) - if (silo == M.buffer) - to_chat(user, span_warning("[parent] is already connected to [silo]!")) - return COMPONENT_BLOCK_TOOL_ATTACK - if(!check_z_level(M.buffer)) - to_chat(user, span_warning("[parent] is too far away to get a connection signal!")) - return COMPONENT_BLOCK_TOOL_ATTACK - if (silo) - silo.ore_connected_machines -= src - silo.updateUsrDialog() - else if (mat_container) - mat_container.retrieve_all() - qdel(mat_container) - silo = M.buffer - silo.ore_connected_machines += src - silo.updateUsrDialog() - mat_container = silo.GetComponent(/datum/component/material_container) - to_chat(user, span_notice("You connect [parent] to [silo] from the multitool's buffer.")) - return COMPONENT_BLOCK_TOOL_ATTACK - -/datum/component/remote_materials/proc/check_z_level(obj/silo_to_check) - SIGNAL_HANDLER - if(!silo_to_check) - if(isnull(silo)) - return FALSE - silo_to_check = silo - - var/turf/current_turf = get_turf(parent) - var/turf/silo_turf = get_turf(silo_to_check) - if(!is_valid_z_level(silo_turf, current_turf)) - return FALSE - return TRUE - -/datum/component/remote_materials/proc/on_hold() - if(!check_z_level()) - return FALSE - return silo.holds["[get_area(parent)]/[category]"] - -/datum/component/remote_materials/proc/silo_log(obj/machinery/M, action, amount, noun, list/mats) - if (silo) - silo.silo_log(M || parent, action, amount, noun, mats) - -/datum/component/remote_materials/proc/format_amount() - if (mat_container) - return "[mat_container.total_amount] / [mat_container.max_amount == INFINITY ? "Unlimited" : mat_container.max_amount] ([silo ? "remote" : "local"])" - else - return "0 / 0" - -/// Ejects the given material ref and logs it, or says out loud the problem. -/datum/component/remote_materials/proc/eject_sheets(datum/material/material_ref, eject_amount) - var/atom/movable/movable_parent = parent - if (!istype(movable_parent)) - return 0 - - if (!mat_container) - movable_parent.say("No access to material storage, please contact the quartermaster.") - return 0 - if (on_hold()) - movable_parent.say("Mineral access is on hold, please contact the quartermaster.") - return 0 - var/count = mat_container.retrieve_sheets(eject_amount, material_ref, movable_parent.drop_location()) - var/list/matlist = list() - matlist[material_ref] = eject_amount - silo_log(parent, "ejected", -count, "sheets", matlist) - return count - -/// Returns `TRUE` if and only if the given material ref can be inserted/removed from this component -/datum/component/remote_materials/proc/can_hold_material(datum/material/material_ref) - if(!mat_container) - return FALSE - - return mat_container.can_hold_material(material_ref) diff --git a/code/datums/components/revenge_ability.dm b/code/datums/components/revenge_ability.dm new file mode 100644 index 0000000000000..f03bc992276fc --- /dev/null +++ b/code/datums/components/revenge_ability.dm @@ -0,0 +1,55 @@ +/** + * Automatically triggers a linked ability at a target who attacks us. + * The ability might not necessarily be on our mob. + * Make sure that /datum/element/relay_attackers is also present or you'll never receive the triggering signal. + */ +/datum/component/revenge_ability + dupe_mode = COMPONENT_DUPE_ALLOWED + /// The ability to use when we are attacked + var/datum/action/cooldown/ability + /// Optional datum for validating targets + var/datum/targetting_datum/targetting + /// Trigger only if target is at least this far away + var/min_range + /// Trigger only if target is at least this close + var/max_range + /// Target the ability at ourself instead of at the offender + var/target_self + +/datum/component/revenge_ability/Initialize(datum/action/cooldown/ability, datum/targetting_datum/targetting, min_range = 0, max_range = INFINITY, target_self = FALSE) + . = ..() + if (!isliving(parent)) + return COMPONENT_INCOMPATIBLE + src.ability = ability + src.targetting = targetting + src.min_range = min_range + src.max_range = max_range + src.target_self = target_self + + RegisterSignal(ability, COMSIG_QDELETING, PROC_REF(ability_destroyed)) + +/datum/component/revenge_ability/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked)) + +/datum/component/revenge_ability/UnregisterFromParent() + UnregisterSignal(parent, COMSIG_ATOM_WAS_ATTACKED) + if (ability) + UnregisterSignal(ability, COMSIG_QDELETING) + return ..() + +/// If we were attacked, get revenge +/datum/component/revenge_ability/proc/on_attacked(mob/living/victim, atom/attacker) + SIGNAL_HANDLER + var/atom/ability_user = ability.owner + var/distance = get_dist(ability_user, attacker) + if (distance < min_range || distance > max_range) + return + if (targetting && !targetting.can_attack(victim, attacker)) + return + INVOKE_ASYNC(ability, TYPE_PROC_REF(/datum/action/cooldown, InterceptClickOn), ability_user, null, (target_self) ? ability_user : attacker) + +/// For whatever reason we lost our linked ability so we can drop this behaviour +/datum/component/revenge_ability/proc/ability_destroyed(datum/source) + SIGNAL_HANDLER + qdel(src) diff --git a/code/datums/components/riding/riding.dm b/code/datums/components/riding/riding.dm index cd6ea43eff1b9..14358a5c5a388 100644 --- a/code/datums/components/riding/riding.dm +++ b/code/datums/components/riding/riding.dm @@ -200,6 +200,11 @@ return FALSE riding_offsets["[index]"] = offsets +/datum/component/riding/proc/set_vehicle_offsets(list/offsets) + if(!islist(offsets)) + return FALSE + directional_vehicle_offsets = offsets + /** * This proc is used to see if we have the appropriate key to drive this atom, if such a key is needed. Returns FALSE if we don't have what we need to drive. * diff --git a/code/datums/components/riding/riding_mob.dm b/code/datums/components/riding/riding_mob.dm index 4f96969218968..a546508e50547 100644 --- a/code/datums/components/riding/riding_mob.dm +++ b/code/datums/components/riding/riding_mob.dm @@ -103,7 +103,27 @@ var/turf/next = get_step(living_parent, direction) step(living_parent, direction) last_move_diagonal = ((direction & (direction - 1)) && (living_parent.loc == next)) - COOLDOWN_START(src, vehicle_move_cooldown, (last_move_diagonal? 2 : 1) * vehicle_move_delay) + var/modified_move_cooldown = vehicle_move_cooldown + var/modified_move_delay = vehicle_move_delay + if(ishuman(user) && HAS_TRAIT(user, TRAIT_SETTLER)) + var/mob/living/carbon/human/settler_rider = user + switch(settler_rider.mob_mood.sanity_level) + if(SANITY_LEVEL_GREAT) + modified_move_cooldown *= 0.5 + modified_move_delay *= 0.5 + if(SANITY_LEVEL_NEUTRAL) + modified_move_cooldown *= 0.8 + modified_move_delay *= 0.8 + if(SANITY_LEVEL_DISTURBED) + modified_move_cooldown *= 1 + modified_move_delay *= 1 + if(SANITY_LEVEL_CRAZY) + modified_move_cooldown *= 1.2 + modified_move_delay *= 1.2 + if(SANITY_LEVEL_INSANE) + modified_move_cooldown *= 1.5 + modified_move_delay *= 1.5 + COOLDOWN_START(src, vehicle_move_cooldown = modified_move_cooldown, (last_move_diagonal ? 2 : 1) * modified_move_delay) return ..() /// Yeets the rider off, used for animals and cyborgs, redefined for humans who shove their piggyback rider off @@ -186,7 +206,7 @@ human_parent.buckle_lying = 0 // the riding mob is made nondense so they don't bump into any dense atoms the carrier is pulling, // since pulled movables are moved before buckled movables - riding_mob.set_density(FALSE) + ADD_TRAIT(riding_mob, TRAIT_UNDENSE, VEHICLE_TRAIT) else if(ride_check_flags & CARRIER_NEEDS_ARM) // fireman human_parent.buckle_lying = 90 @@ -210,7 +230,7 @@ unequip_buckle_inhands(parent) var/mob/living/carbon/human/H = parent H.remove_movespeed_modifier(/datum/movespeed_modifier/human_carry) - former_rider.set_density(!former_rider.body_position) + REMOVE_TRAIT(former_rider, TRAIT_UNDENSE, VEHICLE_TRAIT) return ..() /// If the carrier shoves the person they're carrying, force the carried mob off @@ -330,6 +350,31 @@ set_vehicle_dir_layer(EAST, OBJ_LAYER) set_vehicle_dir_layer(WEST, OBJ_LAYER) +/datum/component/riding/creature/pony/handle_specials() + . = ..() + vehicle_move_delay = 1.5 + set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 9), TEXT_SOUTH = list(0, 9), TEXT_EAST = list(-2, 9), TEXT_WEST = list(2, 9))) + 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/pony + COOLDOWN_DECLARE(pony_trot_cooldown) + +/datum/component/riding/creature/pony/driver_move(atom/movable/movable_parent, mob/living/user, direction) + . = ..() + + if (. == COMPONENT_DRIVER_BLOCK_MOVE || !COOLDOWN_FINISHED(src, pony_trot_cooldown)) + return + + var/mob/living/carbon/human/human_user = user + + if(human_user && is_clown_job(human_user.mind?.assigned_role)) + // there's a new sheriff in town + playsound(movable_parent, 'sound/creatures/pony/clown_gallup.ogg', 50) + COOLDOWN_START(src, pony_trot_cooldown, 500 MILLISECONDS) + /datum/component/riding/creature/bear/handle_specials() . = ..() set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(1, 8), TEXT_SOUTH = list(1, 8), TEXT_EAST = list(-3, 6), TEXT_WEST = list(3, 6))) @@ -378,12 +423,24 @@ /datum/component/riding/creature/goliath keytype = /obj/item/key/lasso + vehicle_move_delay = 4 + +/datum/component/riding/creature/goliath/Initialize(mob/living/riding_mob, force, ride_check_flags, potion_boost) + . = ..() + var/mob/living/basic/mining/goliath/goliath = parent + goliath.add_movespeed_modifier(/datum/movespeed_modifier/goliath_mount) + +/datum/component/riding/creature/goliath/Destroy(force, silent) + var/mob/living/basic/mining/goliath/goliath = parent + goliath.remove_movespeed_modifier(/datum/movespeed_modifier/goliath_mount) + return ..() /datum/component/riding/creature/goliath/handle_specials() . = ..() - set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 8), TEXT_SOUTH = list(0, 8), TEXT_EAST = list(-2, 8), TEXT_WEST = list(2, 8))) + set_vehicle_offsets(list(TEXT_NORTH = list(-12, 0), TEXT_SOUTH = list(-12, 0), TEXT_EAST = list(-12, 0), TEXT_WEST = list(-12, 0))) + set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 12), TEXT_SOUTH = list(0, 12), TEXT_EAST = list(-4, 12), TEXT_WEST = list(3, 12))) set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER) - set_vehicle_dir_layer(NORTH, OBJ_LAYER) + set_vehicle_dir_layer(NORTH, ABOVE_MOB_LAYER) set_vehicle_dir_layer(EAST, OBJ_LAYER) set_vehicle_dir_layer(WEST, OBJ_LAYER) @@ -416,3 +473,13 @@ if(!istype(charger)) return ..() return charger.summoner == user + +/datum/component/riding/creature/goldgrub + +/datum/component/riding/creature/goldgrub/handle_specials() + . = ..() + set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(11, 3), TEXT_SOUTH = list(11, 3), TEXT_EAST = list(9, 3), TEXT_WEST = list(14, 3))) + 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) diff --git a/code/datums/components/rot.dm b/code/datums/components/rot.dm index 11c4f2cb61749..64ddde2b2db9b 100644 --- a/code/datums/components/rot.dm +++ b/code/datums/components/rot.dm @@ -114,7 +114,7 @@ /datum/component/rot/proc/rot_react_touch(datum/source, mob/living/react_to) SIGNAL_HANDLER - rot_react(source, react_to, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) + rot_react(source, react_to, pick(GLOB.arm_zones)) /// Triggered when something enters the component's parent. /datum/component/rot/proc/on_entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm index dc009ffbf89c6..4bcfa8b01c9b9 100644 --- a/code/datums/components/rotation.dm +++ b/code/datums/components/rotation.dm @@ -32,7 +32,7 @@ /datum/component/simple_rotation/RegisterWithParent() AddSignals() - . = ..() + return ..() /datum/component/simple_rotation/PostTransfer() //Because of the callbacks which we don't track cleanly we can't transfer this @@ -42,12 +42,12 @@ /datum/component/simple_rotation/UnregisterFromParent() RemoveSignals() - . = ..() + return ..() /datum/component/simple_rotation/Destroy() - QDEL_NULL(AfterRotation) + AfterRotation = null //Signals + verbs removed via UnRegister - . = ..() + return ..() /datum/component/simple_rotation/ClearFromParent() return ..() diff --git a/code/datums/components/scope.dm b/code/datums/components/scope.dm index 09bb40e5023a4..4de77f44cd94c 100644 --- a/code/datums/components/scope.dm +++ b/code/datums/components/scope.dm @@ -152,8 +152,16 @@ /atom/movable/screen/fullscreen/cursor_catcher/scope/calculate_params() var/list/modifiers = params2list(mouse_params) - var/icon_x = text2num(LAZYACCESS(modifiers, VIS_X)) || view_list[1]*world.icon_size/2 - var/icon_y = text2num(LAZYACCESS(modifiers, VIS_Y)) || view_list[2]*world.icon_size/2 + 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)) + 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/seclight_attachable.dm b/code/datums/components/seclight_attachable.dm index 56761cfd1bfb5..b3f36fe041ad0 100644 --- a/code/datums/components/seclight_attachable.dm +++ b/code/datums/components/seclight_attachable.dm @@ -98,6 +98,7 @@ RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attackby)) RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(on_parent_deleted)) + RegisterSignal(parent, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) /datum/component/seclite_attachable/UnregisterFromParent() UnregisterSignal(parent, list( @@ -156,12 +157,10 @@ if(!light) return FALSE - light.on = !light.on - light.update_brightness() - if(user) - user.balloon_alert(user, "[light.name] toggled [light.on ? "on":"off"]") - - playsound(light, 'sound/weapons/empty.ogg', 100, TRUE) + var/successful_toggle = light.toggle_light(user) + if(!successful_toggle) + return TRUE + user.balloon_alert(user, "[light.name] toggled [light.on ? "on":"off"]") update_light() return TRUE @@ -296,3 +295,9 @@ // Yes, this might mess with other icon state alterations, // but that's the downside of using icon states over overlays. source.icon_state = base_state + +/// Signal proc for [COMSIG_HIT_BY_SABOTEUR] that turns the light off for a few seconds. +/datum/component/seclite_attachable/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + . = light.on_saboteur(source, disrupt_duration) + update_light() diff --git a/code/datums/components/seethrough_mob.dm b/code/datums/components/seethrough_mob.dm new file mode 100644 index 0000000000000..b52cfb334ab16 --- /dev/null +++ b/code/datums/components/seethrough_mob.dm @@ -0,0 +1,135 @@ +///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/toggle_seethrough/action = new(src) + action.Grant(parent) + +/datum/component/seethrough_mob/Destroy(force, silent) + 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/datum/hud/our_hud = fool.hud_used + for(var/atom/movable/screen/plane_master/seethrough as anything in our_hud.get_true_plane_masters(SEETHROUGH_PLANE)) + seethrough.unhide_plane(fool) + + 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) + //Special plane so we can click through the overlay + SET_PLANE_EXPLICIT(trickery_image, SEETHROUGH_PLANE, fool) + + 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) + var/datum/hud/our_hud = fool.hud_used + for(var/atom/movable/screen/plane_master/seethrough as anything in our_hud.get_true_plane_masters(SEETHROUGH_PLANE)) + seethrough.hide_plane(fool) + 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/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" + +/datum/action/toggle_seethrough/Remove(mob/remove_from) + var/datum/component/seethrough_mob/seethroughComp = target + if(seethroughComp.is_active) + seethroughComp.untrick_mob() + return ..() + +/datum/action/toggle_seethrough/Trigger(trigger_flags) + . = ..() + if(!.) + return + var/datum/component/seethrough_mob/seethroughComp = target + seethroughComp.toggle_active() diff --git a/code/datums/components/shielded.dm b/code/datums/components/shielded.dm index eeca72b58158d..b33f3d986fda3 100644 --- a/code/datums/components/shielded.dm +++ b/code/datums/components/shielded.dm @@ -62,7 +62,7 @@ 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() diff --git a/code/datums/components/shovel_hands.dm b/code/datums/components/shovel_hands.dm new file mode 100644 index 0000000000000..e4ee2d644d377 --- /dev/null +++ b/code/datums/components/shovel_hands.dm @@ -0,0 +1,42 @@ +/// This component lets mobs dig up the floor with their bare hands +/datum/component/shovel_hands + dupe_mode = COMPONENT_DUPE_SOURCES + /// It's a lie, they're actually just using a shovel + var/obj/item/shovel/internal_shovel + +/datum/component/shovel_hands/Initialize() + . = ..() + if (!isliving(parent)) + return COMPONENT_INCOMPATIBLE + + internal_shovel = new(null) + RegisterSignal(internal_shovel, COMSIG_QDELETING, PROC_REF(shovel_destroyed)) + +/datum/component/shovel_hands/RegisterWithParent() + . = ..() + RegisterSignals(parent, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_HOSTILE_PRE_ATTACKINGTARGET), PROC_REF(dig)) + +/datum/component/shovel_hands/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_HOSTILE_PRE_ATTACKINGTARGET)) + return ..() + +/datum/component/shovel_hands/Destroy(force, silent) + if (internal_shovel) + UnregisterSignal(internal_shovel, COMSIG_QDELETING) + QDEL_NULL(internal_shovel) + return ..() + +/// Called when you click on literally anything with your hands +/datum/component/shovel_hands/proc/dig(mob/living/mole, atom/target) + SIGNAL_HANDLER + if (!isopenturf(target)) + return + + INVOKE_ASYNC(target, TYPE_PROC_REF(/atom, attackby), internal_shovel, mole) + return COMPONENT_CANCEL_ATTACK_CHAIN + +/// Don't know how the fuck this happened but I guess you can't dig any more +/datum/component/shovel_hands/proc/shovel_destroyed(atom/shovel) + SIGNAL_HANDLER + UnregisterSignal(shovel, COMSIG_QDELETING) + qdel(src) diff --git a/code/datums/components/shrink.dm b/code/datums/components/shrink.dm index 9c1c5f76dcde5..67cd3d39e23cd 100644 --- a/code/datums/components/shrink.dm +++ b/code/datums/components/shrink.dm @@ -10,10 +10,11 @@ parent_atom.transform = parent_atom.transform.Scale(0.5,0.5) olddens = parent_atom.density oldopac = parent_atom.opacity - parent_atom.set_density(FALSE) + parent_atom.set_opacity(FALSE) if(isliving(parent_atom)) var/mob/living/L = parent_atom + ADD_TRAIT(L, TRAIT_UNDENSE, SHRUNKEN_TRAIT) L.add_movespeed_modifier(/datum/movespeed_modifier/shrink_ray) if(iscarbon(L)) var/mob/living/carbon/C = L @@ -23,6 +24,8 @@ if(ishuman(C)) var/mob/living/carbon/human/H = C H.physiology.damage_resistance -= 100//carbons take double damage while shrunk + else + parent_atom.set_density(FALSE) // this is handled by the UNDENSE trait on mobs parent_atom.visible_message(span_warning("[parent_atom] shrinks down to a tiny size!"), span_userdanger("Everything grows bigger!")) QDEL_IN(src, shrink_time) @@ -30,12 +33,14 @@ /datum/component/shrink/Destroy() var/atom/parent_atom = parent parent_atom.transform = parent_atom.transform.Scale(2,2) - parent_atom.set_density(olddens) parent_atom.set_opacity(oldopac) if(isliving(parent_atom)) var/mob/living/L = parent_atom L.remove_movespeed_modifier(/datum/movespeed_modifier/shrink_ray) + REMOVE_TRAIT(L, TRAIT_UNDENSE, SHRUNKEN_TRAIT) if(ishuman(L)) var/mob/living/carbon/human/H = L H.physiology.damage_resistance += 100 + else + parent_atom.set_density(olddens) // this is handled by the UNDENSE trait on mobs return ..() diff --git a/code/datums/components/shuttle_cling.dm b/code/datums/components/shuttle_cling.dm index c3244f9538b68..bc6f022ab86e4 100644 --- a/code/datums/components/shuttle_cling.dm +++ b/code/datums/components/shuttle_cling.dm @@ -35,18 +35,28 @@ src.direction = direction - ADD_TRAIT(parent, TRAIT_HYPERSPACED, src) + ADD_TRAIT(parent, TRAIT_HYPERSPACED, REF(src)) RegisterSignals(parent, list(COMSIG_MOVABLE_MOVED, COMSIG_MOVABLE_UNBUCKLE, COMSIG_ATOM_NO_LONGER_PULLED), PROC_REF(update_state)) + RegisterSignal(parent, SIGNAL_REMOVETRAIT(TRAIT_FREE_HYPERSPACE_MOVEMENT), PROC_REF(initialize_loop)) + RegisterSignal(parent, SIGNAL_ADDTRAIT(TRAIT_FREE_HYPERSPACE_MOVEMENT), PROC_REF(clear_loop)) //Items have this cool thing where they're first put on the floor if you grab them from storage, and then into your hand, which isn't caught by movement signals that well if(isitem(parent)) RegisterSignal(parent, COMSIG_ITEM_PICKUP, PROC_REF(do_remove)) - hyperloop = SSmove_manager.move(moving = parent, direction = direction, delay = not_clinging_move_delay, subsystem = SShyperspace_drift, priority = MOVEMENT_ABOVE_SPACE_PRIORITY, flags = MOVEMENT_LOOP_NO_DIR_UPDATE|MOVEMENT_LOOP_OUTSIDE_CONTROL) + if(!HAS_TRAIT(parent, TRAIT_FREE_HYPERSPACE_MOVEMENT)) + initialize_loop() update_state(parent) //otherwise we'll get moved 1 tile before we can correct ourselves, which isnt super bad but just looks jank +/datum/component/shuttle_cling/proc/initialize_loop() + hyperloop = SSmove_manager.move(moving = parent, direction = direction, delay = not_clinging_move_delay, subsystem = SShyperspace_drift, priority = MOVEMENT_ABOVE_SPACE_PRIORITY, flags = MOVEMENT_LOOP_NO_DIR_UPDATE|MOVEMENT_LOOP_OUTSIDE_CONTROL) + update_state() + +/datum/component/shuttle_cling/proc/clear_loop() + QDEL_NULL(hyperloop) + ///Check if we're in hyperspace and our state in hyperspace /datum/component/shuttle_cling/proc/update_state() SIGNAL_HANDLER @@ -55,6 +65,9 @@ qdel(src) return + if(!hyperloop) + return + var/should_loop = FALSE switch(is_holding_on(parent)) @@ -72,6 +85,10 @@ if(ALL_GOOD) should_loop = FALSE + // the hyperloop can get reset to null from the above procs + if(!hyperloop) + return + //Do pause/unpause/nothing for the hyperloop if(should_loop && hyperloop.paused) hyperloop.resume_loop() @@ -80,12 +97,16 @@ ///Check if we're "holding on" to the shuttle /datum/component/shuttle_cling/proc/is_holding_on(atom/movable/movee) - if(movee.pulledby || !isturf(movee.loc)) + if(movee.pulledby || !isturf(movee.loc) || HAS_TRAIT(movee, TRAIT_FREE_HYPERSPACE_MOVEMENT)) return ALL_GOOD if(!isliving(movee)) + if(HAS_TRAIT(movee, TRAIT_FORCED_GRAVITY)) // nothing can block the singularity + return SUPER_NOT_HOLDING_ON + if(is_tile_solid(get_step(movee, direction))) //something is blocking us so do the cool drift return CLINGING + return SUPER_NOT_HOLDING_ON var/mob/living/living = movee @@ -108,7 +129,7 @@ ///Are we on a hyperspace tile? There's some special bullshit with lattices so we just wrap this check /datum/component/shuttle_cling/proc/is_on_hyperspace(atom/movable/clinger) - if(istype(clinger.loc, hyperspace_type) && !(locate(/obj/structure/lattice) in clinger.loc)) + if(istype(clinger.loc, hyperspace_type) && !HAS_TRAIT(clinger.loc, TRAIT_HYPERSPACE_STOPPED)) return TRUE return FALSE @@ -129,11 +150,11 @@ var/side_dir = hyperloop.direction - direction if(is_tile_solid(get_step(clinger, side_dir))) - hyperloop.direction = direction + turn(side_dir, 180) //We're bumping a wall to the side, so switch to the other side_dir (yes this adds pingpong protocol) + hyperloop.direction = direction + REVERSE_DIR(side_dir) //We're bumping a wall to the side, so switch to the other side_dir (yes this adds pingpong protocol) return //Get the directions from the side of our current drift direction (so if we have drift south, get all cardinals and remove north and south, leaving only east and west) - var/side_dirs = shuffle(GLOB.cardinals - direction - turn(direction, 180)) + var/side_dirs = shuffle(GLOB.cardinals - direction - REVERSE_DIR(direction)) //We check if one side is solid if(!is_tile_solid(get_step(clinger, side_dirs[1]))) @@ -157,7 +178,7 @@ qdel(src) /datum/component/shuttle_cling/Destroy(force, silent) - REMOVE_TRAIT(parent, TRAIT_HYPERSPACED, src) + REMOVE_TRAIT(parent, TRAIT_HYPERSPACED, REF(src)) QDEL_NULL(hyperloop) return ..() diff --git a/code/datums/components/sign_language.dm b/code/datums/components/sign_language.dm index bb6548ddf41b7..23e40258100c7 100644 --- a/code/datums/components/sign_language.dm +++ b/code/datums/components/sign_language.dm @@ -131,7 +131,7 @@ SIGNAL_HANDLER var/mob/living/carbon/carbon_parent = parent - if(HAS_TRAIT(carbon_parent, TRAIT_MIMING)) + if(HAS_MIND_TRAIT(carbon_parent, TRAIT_MIMING)) to_chat(carbon_parent, span_green("You stop yourself from signing in favor of the artform of mimery!")) return COMPONENT_CANNOT_SPEAK @@ -214,7 +214,7 @@ var/mob/living/carbon/carbon_parent = parent if(spell.invocation_type == INVOCATION_EMOTE) // Mime spells are not cast with signs return NONE // Run normal checks - else if(check_signables_state() != SIGN_OKAY || HAS_TRAIT(carbon_parent, TRAIT_MIMING)) // Cannot cast if miming or not SIGN_OKAY + else if(check_signables_state() != SIGN_OKAY || HAS_MIND_TRAIT(carbon_parent, TRAIT_MIMING)) // Cannot cast if miming or not SIGN_OKAY if(feedback) to_chat(carbon_parent, span_warning("You can't sign the words to invoke [spell]!")) return SPELL_INVOCATION_FAIL diff --git a/code/datums/components/singularity.dm b/code/datums/components/singularity.dm index 463c3ef7a0cd9..75fd4fd0abc95 100644 --- a/code/datums/components/singularity.dm +++ b/code/datums/components/singularity.dm @@ -110,7 +110,7 @@ /datum/component/singularity/Destroy(force, silent) GLOB.singularities -= src - QDEL_NULL(consume_callback) + consume_callback = null target = null return ..() @@ -386,9 +386,8 @@ return var/mob/living/carbon/carbon_target = target var/obj/item/bodypart/head = carbon_target.get_bodypart(BODY_ZONE_HEAD) - var/has_no_blood = HAS_TRAIT(carbon_target, TRAIT_NOBLOOD) if(head) - if(has_no_blood) + if(HAS_TRAIT(carbon_target, TRAIT_NOBLOOD)) to_chat(carbon_target, span_notice("You get a headache.")) return head.adjustBleedStacks(5) diff --git a/code/datums/components/sitcomlaughter.dm b/code/datums/components/sitcomlaughter.dm index 8dfef21b749df..8ca335eb8b513 100644 --- a/code/datums/components/sitcomlaughter.dm +++ b/code/datums/components/sitcomlaughter.dm @@ -1,6 +1,6 @@ /datum/component/wearertargeting/sitcomlaughter valid_slots = list(ITEM_SLOT_HANDS, ITEM_SLOT_BELT, ITEM_SLOT_ID, ITEM_SLOT_LPOCKET, ITEM_SLOT_RPOCKET, ITEM_SLOT_SUITSTORE, ITEM_SLOT_DEX_STORAGE) - signals = list(COMSIG_MOB_CREAMED, COMSIG_ON_CARBON_SLIP, COMSIG_ON_VENDOR_CRUSH, COMSIG_MOB_CLUMSY_SHOOT_FOOT) + signals = list(COMSIG_MOB_CREAMED, COMSIG_ON_CARBON_SLIP, COMSIG_POST_TILT_AND_CRUSH, COMSIG_MOB_CLUMSY_SHOOT_FOOT) proctype = PROC_REF(EngageInComedy) mobtype = /mob/living ///Sounds used for when user has a sitcom action occur @@ -22,6 +22,9 @@ if(laugh_delay) src.laugh_delay = laugh_delay +/datum/component/wearertargeting/sitcomlaughter/Destroy(force, silent) + post_comedy_callback = null + return ..() ///Play the laugh track if any of the signals related to comedy have been sent. /datum/component/wearertargeting/sitcomlaughter/proc/EngageInComedy(datum/source) diff --git a/code/datums/components/sizzle.dm b/code/datums/components/sizzle.dm index 5ddc0a687d78c..ce91e9593f75f 100644 --- a/code/datums/components/sizzle.dm +++ b/code/datums/components/sizzle.dm @@ -19,7 +19,7 @@ var/atom/food = parent var/icon/grill_marks = icon(food.icon, food.icon_state) grill_marks.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent) - grill_marks.Blend(icon('icons/obj/kitchen.dmi', "grillmarks"), ICON_MULTIPLY) //adds grill marks and the remaining white areas become transparent + grill_marks.Blend(icon('icons/obj/machines/kitchen.dmi', "grillmarks"), ICON_MULTIPLY) //adds grill marks and the remaining white areas become transparent sizzling = new(grill_marks) sizzling.alpha = sizzlealpha food.add_overlay(sizzling) diff --git a/code/datums/components/slippery.dm b/code/datums/components/slippery.dm index 9956a54df04c4..be1d674eb4d0b 100644 --- a/code/datums/components/slippery.dm +++ b/code/datums/components/slippery.dm @@ -53,9 +53,36 @@ if(isitem(parent)) RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip)) RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_drop)) + RegisterSignal(parent, COMSIG_ITEM_APPLY_FANTASY_BONUSES, PROC_REF(apply_fantasy_bonuses)) + RegisterSignal(parent, COMSIG_ITEM_REMOVE_FANTASY_BONUSES, PROC_REF(remove_fantasy_bonuses)) else RegisterSignal(parent, COMSIG_ATOM_ENTERED, PROC_REF(Slip)) +/datum/component/slippery/Destroy(force, silent) + can_slip_callback = null + on_slip_callback = null + holder = null + return ..() + +/datum/component/slippery/proc/apply_fantasy_bonuses(obj/item/source, bonus) + SIGNAL_HANDLER + knockdown_time = source.modify_fantasy_variable("knockdown_time", knockdown_time, bonus) + if(bonus >= 5) + paralyze_time = source.modify_fantasy_variable("paralyze_time", paralyze_time, bonus) + LAZYSET(source.fantasy_modifications, "lube_flags", lube_flags) + lube_flags |= SLIDE + if(bonus >= 10) + lube_flags |= GALOSHES_DONT_HELP|SLIP_WHEN_CRAWLING + +/datum/component/slippery/proc/remove_fantasy_bonuses(obj/item/source, bonus) + SIGNAL_HANDLER + knockdown_time = source.reset_fantasy_variable("knockdown_time", knockdown_time) + paralyze_time = source.reset_fantasy_variable("paralyze_time", paralyze_time) + var/previous_lube_flags = LAZYACCESS(source.fantasy_modifications, "lube_flags") + LAZYREMOVE(source.fantasy_modifications, "lube_flags") + if(!isnull(previous_lube_flags)) + lube_flags = previous_lube_flags + /datum/component/slippery/proc/add_connect_loc_behalf_to_parent() if(ismovable(parent)) AddComponent(/datum/component/connect_loc_behalf, parent, default_connections) @@ -98,6 +125,10 @@ SIGNAL_HANDLER if(!isliving(arrived)) return + if(lube_flags & SLIPPERY_TURF) + var/turf/turf = get_turf(source) + if(HAS_TRAIT(turf, TRAIT_TURF_IGNORE_SLIPPERY)) + return var/mob/living/victim = arrived if((victim.movement_type & (FLYING | FLOATING))) return diff --git a/code/datums/components/soul_stealer.dm b/code/datums/components/soul_stealer.dm index 5b3c39a59da7b..a69265421bb97 100644 --- a/code/datums/components/soul_stealer.dm +++ b/code/datums/components/soul_stealer.dm @@ -5,13 +5,16 @@ * Used in the cult bastard sword! */ /datum/component/soul_stealer + var/obj/item/soulstone/soulstone_type /// List of soulstones captured by this item. var/list/obj/item/soulstone/soulstones = list() -/datum/component/soul_stealer/Initialize() +/datum/component/soul_stealer/Initialize(soulstone_type = /obj/item/soulstone/anybody/purified) if(!isitem(parent)) return COMPONENT_INCOMPATIBLE + src.soulstone_type = soulstone_type + /datum/component/soul_stealer/Destroy() QDEL_LIST(soulstones) // We own these, so we'll also just get rid of them. Any souls inside will die, this is fine. return ..() @@ -60,7 +63,7 @@ /datum/component/soul_stealer/proc/try_capture(mob/living/carbon/human/victim, mob/living/captor) if(victim.stat == CONSCIOUS) return - var/obj/item/soulstone/soulstone = new(parent) + var/obj/item/soulstone/soulstone = new soulstone_type(parent) soulstone.attack(victim, captor) if(!length(soulstone.contents)) // failed qdel(soulstone) diff --git a/code/datums/components/spawner.dm b/code/datums/components/spawner.dm index 5753b05896f97..3f660d5fcbdf6 100644 --- a/code/datums/components/spawner.dm +++ b/code/datums/components/spawner.dm @@ -38,6 +38,8 @@ /// Try to create a new mob /datum/component/spawner/proc/try_spawn_mob() + if(!length(spawn_types)) + return if(!COOLDOWN_FINISHED(src, spawn_delay)) return validate_references() @@ -65,7 +67,7 @@ /// Remove weakrefs to atoms which have been killed or deleted without us picking it up somehow /datum/component/spawner/proc/validate_references() for (var/datum/weakref/weak_thing as anything in spawned_things) - var/atom/previously_spawned = weak_thing.resolve() + var/atom/previously_spawned = weak_thing?.resolve() if (!previously_spawned) spawned_things -= weak_thing continue diff --git a/code/datums/components/spin2win.dm b/code/datums/components/spin2win.dm index c1c935509f921..0812258f76997 100644 --- a/code/datums/components/spin2win.dm +++ b/code/datums/components/spin2win.dm @@ -4,6 +4,8 @@ * Component that attaches to items, making their attack_self begin a spin 2 win */ /datum/component/spin2win + /// How long you spin for + var/spin_duration = 5 SECONDS ///the cooldown for spinning to winning COOLDOWN_DECLARE(spin_cooldown) ///how long a spin2win takes to recharge. @@ -37,8 +39,8 @@ src.end_spin_message = end_spin_message /datum/component/spin2win/Destroy(force, silent) - QDEL_NULL(on_spin_callback) - QDEL_NULL(on_unspin_callback) + on_spin_callback = null + on_unspin_callback = null return ..() /datum/component/spin2win/RegisterWithParent() @@ -76,14 +78,14 @@ /datum/component/spin2win/proc/start_spinning(mob/living/spinning_user) //user will always exist for the start spinning = TRUE - spinning_user.changeNext_move(5 SECONDS) + spinning_user.changeNext_move(spin_duration) if(on_spin_callback) - on_spin_callback.Invoke(spinning_user) + on_spin_callback.Invoke(spinning_user, spin_duration) if(start_spin_message) var/message = replacetext(start_spin_message, "%USER", spinning_user) spinning_user.visible_message(message) playsound(spinning_user, 'sound/weapons/fwoosh.ogg', 75, FALSE) - stop_spinning_timer_id = addtimer(CALLBACK(src, PROC_REF(stop_spinning), spinning_user), 5 SECONDS, TIMER_STOPPABLE|TIMER_DELETE_ME) + stop_spinning_timer_id = addtimer(CALLBACK(src, PROC_REF(stop_spinning), spinning_user), spin_duration, TIMER_STOPPABLE|TIMER_DELETE_ME) RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_spin_equipped)) RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_spin_dropped)) START_PROCESSING(SSprocessing, src) @@ -98,7 +100,7 @@ var/message = replacetext(end_spin_message, "%USER", user) user.visible_message(message) if(on_unspin_callback) - on_unspin_callback.Invoke(user, 5 SECONDS) + on_unspin_callback.Invoke(user, spin_duration) COOLDOWN_START(src, spin_cooldown, spin_cooldown_time) spinning = FALSE diff --git a/code/datums/components/spirit_holding.dm b/code/datums/components/spirit_holding.dm index b5e99ad482259..a4d0e02913740 100644 --- a/code/datums/components/spirit_holding.dm +++ b/code/datums/components/spirit_holding.dm @@ -67,13 +67,15 @@ UnregisterSignal(parent, COMSIG_ITEM_ATTACK_SELF) var/mob/dead/observer/chosen_spirit = pick(candidates) + if(QDELETED(parent)) //if the thing that we're conjuring a spirit in has been destroyed, don't create a spirit + to_chat(chosen_spirit, span_userdanger("The new vessel for your spirit has been destroyed! You remain an unbound ghost.")) + return bound_spirit = new(parent) bound_spirit.ckey = chosen_spirit.ckey bound_spirit.fully_replace_character_name(null, "The spirit of [parent]") bound_spirit.status_flags |= GODMODE bound_spirit.copy_languages(awakener, LANGUAGE_MASTER) //Make sure the sword can understand and communicate with the awakener. - bound_spirit.update_atom_languages() - bound_spirit.grant_all_languages(FALSE, FALSE, TRUE) //Grants omnitongue + bound_spirit.get_language_holder().omnitongue = TRUE //Grants omnitongue //Add new signals for parent and stop attempting to awaken RegisterSignal(parent, COMSIG_ATOM_RELAYMOVE, PROC_REF(block_buckle_message)) diff --git a/code/datums/components/splattercasting.dm b/code/datums/components/splattercasting.dm index 1721c8fbf53cb..b550f2b1221f4 100644 --- a/code/datums/components/splattercasting.dm +++ b/code/datums/components/splattercasting.dm @@ -42,7 +42,7 @@ playsound(source, 'sound/effects/wounds/splatter.ogg', 60, TRUE, -1) to_fire.color = "#ff7070" to_fire.name = "blood-[to_fire.name]" - to_fire.set_light(2, 2, LIGHT_COLOR_BLOOD_MAGIC, TRUE) + to_fire.set_light(2, 2, LIGHT_COLOR_BLOOD_MAGIC, l_on = TRUE) ///signal sent before parent casts a spell /datum/component/splattercasting/proc/on_before_spell_cast(mob/living/carbon/source, datum/action/cooldown/spell/spell, atom/cast_on) diff --git a/code/datums/components/squashable.dm b/code/datums/components/squashable.dm index a8304320bdbdd..8174127aeb39c 100644 --- a/code/datums/components/squashable.dm +++ b/code/datums/components/squashable.dm @@ -29,6 +29,10 @@ AddComponent(/datum/component/connect_loc_behalf, parent, loc_connections) +/datum/component/squashable/Destroy(force, silent) + on_squash_callback = null + return ..() + ///Handles the squashing of the mob /datum/component/squashable/proc/on_entered(turf/source_turf, atom/movable/crossing_movable) SIGNAL_HANDLER @@ -37,11 +41,13 @@ return var/mob/living/parent_as_living = parent + if((squash_flags & SQUASHED_DONT_SQUASH_IN_CONTENTS) && !isturf(parent_as_living.loc)) + return - if(squash_flags & SQUASHED_SHOULD_BE_DOWN && parent_as_living.body_position != LYING_DOWN) + if((squash_flags & SQUASHED_SHOULD_BE_DOWN) && parent_as_living.body_position != LYING_DOWN) return - var/should_squash = prob(squash_chance) + var/should_squash = ((squash_flags & SQUASHED_ALWAYS_IF_DEAD) && parent_as_living.stat == DEAD) || prob(squash_chance) if(should_squash && on_squash_callback) if(on_squash_callback.Invoke(parent_as_living, crossing_movable)) @@ -66,7 +72,7 @@ /datum/component/squashable/proc/Squish(mob/living/target) if(squash_flags & SQUASHED_SHOULD_BE_GIBBED) - target.gib() + target.gib(DROP_ALL_REMAINS) else target.adjustBruteLoss(squash_damage) diff --git a/code/datums/components/squeak.dm b/code/datums/components/squeak.dm index 56740b199dd94..af0686fd1eb32 100644 --- a/code/datums/components/squeak.dm +++ b/code/datums/components/squeak.dm @@ -37,7 +37,7 @@ AddComponent(/datum/component/connect_loc_behalf, parent, item_connections) RegisterSignal(parent, COMSIG_MOVABLE_DISPOSING, PROC_REF(disposing_react)) if(isitem(parent)) - RegisterSignals(parent, list(COMSIG_ITEM_ATTACK, COMSIG_ITEM_ATTACK_OBJ, COMSIG_ITEM_HIT_REACT), PROC_REF(play_squeak)) + RegisterSignals(parent, list(COMSIG_ITEM_ATTACK, COMSIG_ITEM_ATTACK_ATOM, COMSIG_ITEM_HIT_REACT), PROC_REF(play_squeak)) RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(use_squeak)) RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip)) RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_drop)) diff --git a/code/datums/components/stationstuck.dm b/code/datums/components/stationstuck.dm index 63a1dcabbbd19..5634186f04e02 100644 --- a/code/datums/components/stationstuck.dm +++ b/code/datums/components/stationstuck.dm @@ -49,7 +49,7 @@ It has a punishment variable that is what happens to the parent when they leave escapee.death() if(PUNISHMENT_GIB) escapee.investigate_log("has been gibbed by stationstuck component.", INVESTIGATE_DEATHS) - escapee.gib() + escapee.gib(DROP_ALL_REMAINS) if(PUNISHMENT_TELEPORT) var/targetturf = find_safe_turf(stuck_zlevel) if(!targetturf) diff --git a/code/datums/components/storm_hating.dm b/code/datums/components/storm_hating.dm new file mode 100644 index 0000000000000..ce43ba73276b4 --- /dev/null +++ b/code/datums/components/storm_hating.dm @@ -0,0 +1,47 @@ +/** + * The parent of this component will be destroyed if it's on the ground during a storm + */ +/datum/component/storm_hating + /// Types of weather which trigger the effect + var/static/list/stormy_weather = list( + /datum/weather/ash_storm, + /datum/weather/snow_storm, + /datum/weather/void_storm, + ) + +/datum/component/storm_hating/Initialize() + . = ..() + if (!isatom(parent)) + return COMPONENT_INCOMPATIBLE + on_area_entered(parent, get_area(parent)) + +/datum/component/storm_hating/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_ENTER_AREA, PROC_REF(on_area_entered)) + RegisterSignal(parent, COMSIG_EXIT_AREA, PROC_REF(on_area_exited)) + +/datum/component/storm_hating/UnregisterFromParent() + . = ..() + on_area_exited(parent, get_area(parent)) + UnregisterSignal(parent, COMSIG_ENTER_AREA) + RegisterSignal(parent, COMSIG_EXIT_AREA) + +/datum/component/storm_hating/proc/on_area_entered(atom/source, area/new_area) + SIGNAL_HANDLER + for (var/weather in stormy_weather) + RegisterSignal(new_area, COMSIG_WEATHER_BEGAN_IN_AREA(weather), PROC_REF(on_storm_event)) + RegisterSignal(new_area, COMSIG_WEATHER_ENDED_IN_AREA(weather), PROC_REF(on_storm_event)) + +/datum/component/storm_hating/proc/on_area_exited(atom/source, area/old_area) + SIGNAL_HANDLER + for (var/weather in stormy_weather) + UnregisterSignal(old_area, COMSIG_WEATHER_BEGAN_IN_AREA(weather)) + UnregisterSignal(old_area, COMSIG_WEATHER_ENDED_IN_AREA(weather)) + +/datum/component/storm_hating/proc/on_storm_event() + SIGNAL_HANDLER + var/atom/parent_atom = parent + if (!isturf(parent_atom.loc)) + return + parent.AddElement(/datum/element/temporary_atom, life_time = 3 SECONDS, fade_time = 2 SECONDS) + qdel(src) diff --git a/code/datums/components/style/style.dm b/code/datums/components/style/style.dm index 0f7999e7fd465..3894f77311e17 100644 --- a/code/datums/components/style/style.dm +++ b/code/datums/components/style/style.dm @@ -117,7 +117,7 @@ /datum/component/projectile_parry,\ list(\ /obj/projectile/colossus,\ - /obj/projectile/temp/basilisk,\ + /obj/projectile/temp/watcher,\ /obj/projectile/kinetic,\ /obj/projectile/bileworm_acid,\ /obj/projectile/herald,\ diff --git a/code/datums/components/subtype_picker.dm b/code/datums/components/subtype_picker.dm index 5ab4785e7a73a..2bc429f9b7079 100644 --- a/code/datums/components/subtype_picker.dm +++ b/code/datums/components/subtype_picker.dm @@ -22,6 +22,10 @@ src.on_picked_callback = on_picked_callback build_radial_list() +/datum/component/subtype_picker/Destroy(force, silent) + on_picked_callback = null + return ..() + /datum/component/subtype_picker/RegisterWithParent() . = ..() RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(on_attack_self)) diff --git a/code/datums/components/supermatter_crystal.dm b/code/datums/components/supermatter_crystal.dm index 89954ecb7c424..6608713438867 100644 --- a/code/datums/components/supermatter_crystal.dm +++ b/code/datums/components/supermatter_crystal.dm @@ -17,10 +17,16 @@ RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_WRENCH), PROC_REF(tool_hit)) RegisterSignal(parent, COMSIG_ATOM_BUMPED, PROC_REF(bumped_hit)) RegisterSignal(parent, COMSIG_ATOM_INTERCEPT_Z_FALL, PROC_REF(intercept_z_fall)) + RegisterSignal(parent, COMSIG_ATOM_ON_Z_IMPACT, PROC_REF(on_z_impact)) src.tool_act_callback = tool_act_callback src.consume_callback = consume_callback +/datum/component/supermatter_crystal/Destroy(force, silent) + tool_act_callback = null + consume_callback = null + return ..() + /datum/component/supermatter_crystal/UnregisterFromParent(force, silent) var/list/signals_to_remove = list( COMSIG_ATOM_BLOB_ACT, @@ -33,6 +39,7 @@ COMSIG_ATOM_TOOL_ACT(TOOL_WRENCH), COMSIG_ATOM_BUMPED, COMSIG_ATOM_INTERCEPT_Z_FALL, + COMSIG_ATOM_ON_Z_IMPACT, ) UnregisterSignal(parent, signals_to_remove) @@ -55,6 +62,10 @@ /datum/component/supermatter_crystal/proc/paw_hit(datum/source, mob/user, list/modifiers) SIGNAL_HANDLER + if(isliving(user)) + var/mob/living/living_mob = user + if(living_mob.incorporeal_move || living_mob.status_flags & GODMODE) + return if(isalien(user)) dust_mob(source, user, cause = "alien attack") return @@ -62,6 +73,8 @@ /datum/component/supermatter_crystal/proc/animal_hit(datum/source, mob/living/simple_animal/user, list/modifiers) SIGNAL_HANDLER + if(user.incorporeal_move || user.status_flags & GODMODE) + return var/atom/atom_source = source var/murder if(!user.melee_damage_upper && !user.melee_damage_lower) @@ -79,6 +92,10 @@ /datum/component/supermatter_crystal/proc/unarmed_hit(datum/source, mob/user, list/modifiers) SIGNAL_HANDLER + if(isliving(user)) + var/mob/living/living_mob = user + if(living_mob.incorporeal_move || living_mob.status_flags & GODMODE) + return var/atom/atom_source = source if(iscyborg(user) && atom_source.Adjacent(user)) dust_mob(source, user, cause = "cyborg attack") @@ -91,14 +108,12 @@ /datum/component/supermatter_crystal/proc/hand_hit(datum/source, mob/living/user, list/modifiers) SIGNAL_HANDLER - var/atom/atom_source = source if(user.incorporeal_move || user.status_flags & GODMODE) return - if(user.zone_selected != BODY_ZONE_PRECISE_MOUTH) dust_mob(source, user, cause = "hand") return - + var/atom/atom_source = source if(!user.is_mouth_covered()) if(user.combat_mode) dust_mob(source, user, @@ -139,6 +154,8 @@ return if(istype(item, /obj/item/melee/roastingstick)) return FALSE + if(istype(item, /obj/item/toy/crayon/spraycan)) + return FALSE if(istype(item, /obj/item/clothing/mask/cigarette)) var/obj/item/clothing/mask/cigarette/cig = item var/clumsy = HAS_TRAIT(user, TRAIT_CLUMSY) @@ -180,7 +197,9 @@ return if(atom_source.Adjacent(user)) //if the item is stuck to the person, kill the person too instead of eating just the item. - var/vis_msg = span_danger("[user] reaches out and touches [atom_source] with [item], inducing a resonance... [item] starts to glow briefly before the light continues up to [user]'s body. [user.p_they(TRUE)] bursts into flames before flashing into dust!") + if(user.incorporeal_move || user.status_flags & GODMODE) + return + var/vis_msg = span_danger("[user] reaches out and touches [atom_source] with [item], inducing a resonance... [item] starts to glow briefly before the light continues up to [user]'s body. [user.p_They()] burst[user.p_s()] into flames before flashing into dust!") var/mob_msg = span_userdanger("You reach out and touch [atom_source] with [item]. Everything starts burning and all you can hear is ringing. Your last thought is \"That was not a wise decision.\"") dust_mob(source, user, vis_msg, mob_msg) @@ -193,6 +212,10 @@ /datum/component/supermatter_crystal/proc/bumped_hit(datum/source, atom/movable/hit_object) SIGNAL_HANDLER + if(isliving(hit_object)) + var/mob/living/hit_mob = hit_object + if(hit_mob.incorporeal_move || hit_mob.status_flags & GODMODE) + return var/atom/atom_source = source var/obj/machinery/power/supermatter_crystal/our_supermatter = parent // Why is this a component? if(istype(our_supermatter)) @@ -213,13 +236,40 @@ /datum/component/supermatter_crystal/proc/intercept_z_fall(datum/source, list/falling_movables, levels) SIGNAL_HANDLER for(var/atom/movable/hit_object as anything in falling_movables) + if(parent == hit_object) + return + bumped_hit(parent, hit_object) return FALL_INTERCEPTED | FALL_NO_MESSAGE -/datum/component/supermatter_crystal/proc/dust_mob(datum/source, mob/living/nom, vis_msg, mob_msg, cause) +/datum/component/supermatter_crystal/proc/on_z_impact(datum/source, turf/impacted_turf, levels) + SIGNAL_HANDLER + var/atom/atom_source = source + + for(var/mob/living/poor_target in impacted_turf) + consume(atom_source, poor_target) + playsound(get_turf(atom_source), 'sound/effects/supermatter.ogg', 50, TRUE) + poor_target.visible_message(span_danger("\The [atom_source] slams into \the [poor_target] out of nowhere inducing a resonance... [poor_target.p_their()] body starts to glow and burst into flames before flashing into dust!"), + span_userdanger("\The [atom_source] slams into you out of nowhere as your ears are filled with unearthly ringing. Your last thought is \"The fuck.\""), + span_hear("You hear an unearthly noise as a wave of heat washes over you.")) + + for(var/atom/movable/hit_object as anything in impacted_turf) + if(parent == hit_object) + return + + if(iseffect(hit_object)) + continue + + consume(atom_source, hit_object) + playsound(get_turf(atom_source), 'sound/effects/supermatter.ogg', 50, TRUE) + atom_source.visible_message(span_danger("\The [atom_source], smacks into the plating out of nowhere, reducing everything below to ash."), null, + span_hear("You hear a loud crack as you are washed with a wave of heat.")) + +/datum/component/supermatter_crystal/proc/dust_mob(datum/source, mob/living/nom, vis_msg, mob_msg, cause) if(nom.incorporeal_move || nom.status_flags & GODMODE) //try to keep supermatter sliver's + hemostat's dust conditions in sync with this too return + var/atom/atom_source = source if(!vis_msg) vis_msg = span_danger("[nom] reaches out and touches [atom_source], inducing a resonance... [nom.p_their()] body starts to glow and burst into flames before flashing into dust!") if(!mob_msg) @@ -245,6 +295,9 @@ message_admins("[atom_source] has consumed [key_name_admin(consumed_mob)] [ADMIN_JMP(atom_source)].") atom_source.investigate_log("has consumed [key_name(consumed_mob)].", INVESTIGATE_ENGINE) consumed_mob.investigate_log("has been dusted by [atom_source].", INVESTIGATE_DEATHS) + if(istype(consumed_mob, /mob/living/simple_animal/parrot/poly)) // Dusting Poly creates a power surge + force_event(/datum/round_event_control/supermatter_surge/poly, "Poly's revenge") + notify_ghosts("[consumed_mob] has been dusted by [atom_source]!", source = atom_source, action = NOTIFY_JUMP, header = "Polytechnical Difficulties") consumed_mob.dust(force = TRUE) matter_increase += 100 * object_size if(is_clown_job(consumed_mob.mind?.assigned_role)) diff --git a/code/datums/components/surgery_initiator.dm b/code/datums/components/surgery_initiator.dm index 17c4c23f7d06f..a06d082883c09 100644 --- a/code/datums/components/surgery_initiator.dm +++ b/code/datums/components/surgery_initiator.dm @@ -61,7 +61,7 @@ var/list/available_surgeries = get_available_surgeries(user, target) if(!length(available_surgeries)) - if (target.body_position == LYING_DOWN) + if (target.body_position == LYING_DOWN || !(target.mobility_flags & MOBILITY_LIEDOWN)) target.balloon_alert(user, "no surgeries available!") else target.balloon_alert(user, "make them lie down!") @@ -99,7 +99,7 @@ continue else if(carbon_target && (surgery.surgery_flags & SURGERY_REQUIRE_LIMB)) //mob with no limb in surgery zone when we need a limb continue - if((surgery.surgery_flags & SURGERY_REQUIRE_RESTING) && target.body_position != LYING_DOWN) + if(IS_IN_INVALID_SURGICAL_POSITION(target, surgery)) continue if(!surgery.can_start(user, target)) continue @@ -130,7 +130,6 @@ 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 @@ -304,7 +303,7 @@ target.balloon_alert(user, "not the right type of limb!") return - if ((surgery.surgery_flags & SURGERY_REQUIRE_RESTING) && target.body_position != LYING_DOWN) + if (IS_IN_INVALID_SURGICAL_POSITION(target, surgery)) target.balloon_alert(user, "patient is not lying down!") return diff --git a/code/datums/components/swabbing.dm b/code/datums/components/swabbing.dm index 0fb13e6055de6..fa649a5e0184f 100644 --- a/code/datums/components/swabbing.dm +++ b/code/datums/components/swabbing.dm @@ -32,12 +32,12 @@ This component is used in vat growing to swab for microbiological samples which src.update_icons = update_icons src.update_overlays = update_overlays -/datum/component/swabbing/Destroy() - . = ..() +/datum/component/swabbing/Destroy(force, silent) for(var/swabbed in swabbed_items) qdel(swabbed) - QDEL_NULL(update_icons) - QDEL_NULL(update_overlays) + update_icons = null + update_overlays = null + return ..() ///Changes examine based on your sample diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index c0005b6ee8e88..1faae99d45913 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -205,7 +205,8 @@ user.visible_message(span_warning("[user] lands an expert [tackle_word] on [target], knocking [target.p_them()] down hard while landing on [user.p_their()] feet with a passive grip!"), span_userdanger("You land an expert [tackle_word] on [target], knocking [target.p_them()] down hard while landing on your feet with a passive grip!"), ignored_mobs = target) to_chat(target, span_userdanger("[user] lands an expert [tackle_word] on you, knocking you down hard and maintaining a passive grab!")) - user.SetKnockdown(0) + // Ignore_canstun has to be true, or else a stunimmune user would stay knocked down. + user.SetKnockdown(0, ignore_canstun = TRUE) user.get_up(TRUE) user.forceMove(get_turf(target)) target.adjustStaminaLoss(40) @@ -228,7 +229,8 @@ 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) to_chat(target, span_userdanger("[user] lands a monster [tackle_word] on you, knocking you senseless and aggressively pinning you!")) - user.SetKnockdown(0) + // Ignore_canstun has to be true, or else a stunimmune user would stay knocked down. + user.SetKnockdown(0, ignore_canstun = TRUE) user.get_up(TRUE) user.forceMove(get_turf(target)) target.adjustStaminaLoss(40) @@ -365,7 +367,7 @@ /datum/component/tackler/proc/splat(mob/living/carbon/user, atom/hit) if(istype(hit, /obj/machinery/vending)) // before we do anything else- var/obj/machinery/vending/darth_vendor = hit - darth_vendor.tilt(user, TRUE) + darth_vendor.tilt(user, 100) return else if(istype(hit, /obj/structure/window)) var/obj/structure/window/W = hit @@ -443,7 +445,7 @@ if(86 to 92) user.visible_message(span_danger("[user] slams head-first into [hit], suffering major cranial trauma!"), span_userdanger("You slam head-first into [hit], and the world explodes around you!")) - user.adjustStaminaLoss(30, updating_stamina=FALSE) + user.adjustStaminaLoss(30, updating_stamina = FALSE) user.adjustBruteLoss(30) user.adjust_confusion(15 SECONDS) if(prob(80)) @@ -455,7 +457,7 @@ if(68 to 85) user.visible_message(span_danger("[user] slams hard into [hit], knocking [user.p_them()] senseless!"), span_userdanger("You slam hard into [hit], knocking yourself senseless!")) - user.adjustStaminaLoss(30, updating_stamina=FALSE) + user.adjustStaminaLoss(30, updating_stamina = FALSE) user.adjustBruteLoss(10) user.adjust_confusion(10 SECONDS) user.Knockdown(3 SECONDS) @@ -463,7 +465,7 @@ if(1 to 67) user.visible_message(span_danger("[user] slams into [hit]!"), span_userdanger("You slam into [hit]!")) - user.adjustStaminaLoss(20, updating_stamina=FALSE) + user.adjustStaminaLoss(20, updating_stamina = FALSE) user.adjustBruteLoss(10) user.Knockdown(2 SECONDS) shake_camera(user, 2, 2) @@ -543,10 +545,11 @@ HOW_big_of_a_miss_did_we_just_make = ", making a ginormous mess!" // an extra exclamation point!! for emphasis!!! owner.visible_message(span_danger("[owner] trips over [kevved] and slams into it face-first[HOW_big_of_a_miss_did_we_just_make]!"), span_userdanger("You trip over [kevved] and slam into it face-first[HOW_big_of_a_miss_did_we_just_make]!")) - owner.adjustStaminaLoss(15 + messes.len * 2, FALSE) - owner.adjustBruteLoss(8 + messes.len) + owner.adjustStaminaLoss(15 + messes.len * 2, updating_stamina = FALSE) + owner.adjustBruteLoss(8 + messes.len, updating_health = FALSE) owner.Paralyze(0.4 SECONDS * messes.len) // .4 seconds of paralyze for each thing you knock around owner.Knockdown(2 SECONDS + 0.4 SECONDS * messes.len) // 2 seconds of knockdown after the paralyze + owner.updatehealth() for(var/obj/item/I in messes) var/dist = rand(1, 3) diff --git a/code/datums/components/takes_reagent_appearance.dm b/code/datums/components/takes_reagent_appearance.dm index 0d5730fc80da9..6505290b4cbb0 100644 --- a/code/datums/components/takes_reagent_appearance.dm +++ b/code/datums/components/takes_reagent_appearance.dm @@ -43,9 +43,9 @@ src.base_container_type = base_container_type || parent.type -/datum/component/takes_reagent_appearance/Destroy() - QDEL_NULL(on_icon_changed) - QDEL_NULL(on_icon_reset) +/datum/component/takes_reagent_appearance/Destroy(force, silent) + on_icon_changed = null + on_icon_reset = null return ..() /datum/component/takes_reagent_appearance/RegisterWithParent() diff --git a/code/datums/components/tameable.dm b/code/datums/components/tameable.dm index fa342bbbbd4b6..81228b2c3ccdd 100644 --- a/code/datums/components/tameable.dm +++ b/code/datums/components/tameable.dm @@ -32,6 +32,10 @@ RegisterSignal(parent, COMSIG_SIMPLEMOB_SENTIENCEPOTION, PROC_REF(on_tame)) //Instantly succeeds RegisterSignal(parent, COMSIG_SIMPLEMOB_TRANSFERPOTION, PROC_REF(on_tame)) //Instantly succeeds +/datum/component/tameable/Destroy(force, silent) + after_tame = null + return ..() + /datum/component/tameable/proc/try_tame(datum/source, obj/item/food, mob/living/attacker, params) SIGNAL_HANDLER if(!is_type_in_list(food, food_types)) @@ -43,10 +47,15 @@ return COMPONENT_CANCEL_ATTACK_CHAIN var/atom/atom_parent = source + var/inform_tamer = FALSE atom_parent.balloon_alert(attacker, "fed") + var/modified_tame_chance = current_tame_chance + if(HAS_TRAIT(attacker, TRAIT_SETTLER)) + modified_tame_chance += 50 + inform_tamer = TRUE if(unique || !already_friends(attacker)) - if(prob(current_tame_chance)) //note: lack of feedback message is deliberate, keep them guessing! - on_tame(source, attacker, food) + if(prob(modified_tame_chance)) //note: lack of feedback message is deliberate, keep them guessing unless they're an expert! + on_tame(source, attacker, food, inform_tamer) else current_tame_chance += bonus_tame_chance @@ -61,13 +70,16 @@ return living_parent.faction.Find(REF(potential_friend)) ///Ran once taming succeeds -/datum/component/tameable/proc/on_tame(datum/source, mob/living/tamer, atom/food) +/datum/component/tameable/proc/on_tame(datum/source, mob/living/tamer, atom/food, inform_tamer = FALSE) SIGNAL_HANDLER after_tame?.Invoke(tamer, food)//Run custom behavior if needed if(isliving(parent) && isliving(tamer)) var/mob/living/tamed = parent INVOKE_ASYNC(tamed, TYPE_PROC_REF(/mob/living, befriend), tamer) + if(inform_tamer) + var/atom/atom_parent = source + atom_parent.balloon_alert(tamer, "tamed") if(unique) qdel(src) diff --git a/code/datums/components/telegraph_ability.dm b/code/datums/components/telegraph_ability.dm new file mode 100644 index 0000000000000..bff2ea7ea8f63 --- /dev/null +++ b/code/datums/components/telegraph_ability.dm @@ -0,0 +1,50 @@ +/** + * Component given to creatures to telegraph their abilities! + */ +/datum/component/basic_mob_ability_telegraph + /// how long before we use our attack + var/telegraph_time + /// sound to play, if any + var/sound_path + /// are we currently telegraphing + var/currently_telegraphing = FALSE + +/datum/component/basic_mob_ability_telegraph/Initialize(telegraph_time = 1 SECONDS, sound_path) + + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + src.telegraph_time = telegraph_time + src.sound_path = sound_path + +/datum/component/basic_mob_ability_telegraph/RegisterWithParent() + RegisterSignal(parent, COMSIG_MOB_ABILITY_STARTED, PROC_REF(on_ability_activate)) + +/datum/component/basic_mob_ability_telegraph/UnregisterFromParent() + UnregisterSignal(parent, COMSIG_MOB_ABILITY_STARTED) + +///delay the ability +/datum/component/basic_mob_ability_telegraph/proc/on_ability_activate(mob/living/source, datum/action/cooldown/activated, atom/target) + SIGNAL_HANDLER + + if(currently_telegraphing) + return COMPONENT_BLOCK_ABILITY_START + + if(!activated.IsAvailable()) + return + + currently_telegraphing = TRUE + generate_tell_signs(source) + addtimer(CALLBACK(src, PROC_REF(use_ability), source, activated, target), telegraph_time) + return COMPONENT_BLOCK_ABILITY_START + +///generates the telegraph signs to inform the player we're about to launch an attack +/datum/component/basic_mob_ability_telegraph/proc/generate_tell_signs(mob/living/source) + if(sound_path) + playsound(source, sound_path, 50, FALSE) + source.Shake(duration = telegraph_time) + +///use the ability +/datum/component/basic_mob_ability_telegraph/proc/use_ability(mob/living/source, datum/action/cooldown/activated, atom/target) + if(!QDELETED(target) && source.stat != DEAD) //target is gone or we died + activated.Activate(target) + currently_telegraphing = FALSE diff --git a/code/datums/components/thermite.dm b/code/datums/components/thermite.dm index 913f2221163f9..7ab8b755ca10a 100644 --- a/code/datums/components/thermite.dm +++ b/code/datums/components/thermite.dm @@ -6,6 +6,8 @@ var/burn_require /// The thermite overlay var/thermite_overlay + /// Default thermite overlay, do not touch + var/static/mutable_appearance/default_thermite_overlay = mutable_appearance('icons/effects/effects.dmi', "thermite") /// Callback related to burning, stored so the timer can be easily reset without losing the user var/datum/callback/burn_callback /// The timer for burning parent, calls burn_callback when done @@ -13,8 +15,6 @@ /// The thermite fire overlay var/obj/effect/overlay/thermite/fakefire - /// Default thermite overlay, do not touch - var/static/mutable_appearance/default_thermite_overlay = mutable_appearance('icons/effects/effects.dmi', "thermite") /// Blacklist of turfs that cannot have thermite on it var/static/list/blacklist = typecacheof(list( /turf/open/lava, @@ -54,32 +54,34 @@ /datum/component/thermite/Destroy() thermite_overlay = null - if(burn_callback) - QDEL_NULL(burn_callback) if(burn_timer) deltimer(burn_timer) burn_timer = null + if(burn_callback) + burn_callback = null if(fakefire) QDEL_NULL(fakefire) return ..() /datum/component/thermite/RegisterWithParent() + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(attackby_react)) + RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_attack_hand)) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) RegisterSignal(parent, COMSIG_ATOM_FIRE_ACT, PROC_REF(on_fire_act)) RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_update_overlays)) RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(clean_react)) - RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(attackby_react)) - RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(parent_qdeleting)) //probably necessary because turfs are wack var/turf/turf_parent = parent turf_parent.update_appearance() /datum/component/thermite/UnregisterFromParent() UnregisterSignal(parent, list( + COMSIG_ATOM_ATTACKBY, + COMSIG_ATOM_ATTACK_HAND, + COMSIG_ATOM_EXAMINE, COMSIG_ATOM_FIRE_ACT, COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_COMPONENT_CLEAN_ACT, - COMSIG_ATOM_ATTACKBY, - COMSIG_ATOM_EXAMINE, COMSIG_QDELETING, )) var/turf/turf_parent = parent @@ -97,7 +99,7 @@ /datum/component/thermite/proc/on_examine(turf/source, mob/user, list/examine_list) SIGNAL_HANDLER - examine_list += span_warning("[source.p_theyre(TRUE)] covered in thermite.") + examine_list += span_warning("[source.p_Theyre()] covered in thermite.") /// Used to maintain the thermite overlay on the parent [/turf]. /datum/component/thermite/proc/on_update_overlays(turf/parent_turf, list/overlays) @@ -118,7 +120,7 @@ fakefire = new(parent_turf) burn_callback = CALLBACK(src, PROC_REF(burn_parent), user) burn_timer = addtimer(burn_callback, min(amount * 0.35 SECONDS, 20 SECONDS), TIMER_STOPPABLE) - //unregister everything mechanical, we are burning up + //unregister everything related to burning UnregisterSignal(parent, list(COMSIG_COMPONENT_CLEAN_ACT, COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_FIRE_ACT)) /** @@ -145,7 +147,7 @@ /datum/component/thermite/proc/clean_react(datum/source, strength) SIGNAL_HANDLER - //Thermite is just some loose powder, you could probably clean it with your hands. << todo? + //Thermite is just some loose powder, you could probably clean it with your hands qdel(src) return COMPONENT_CLEANED @@ -166,6 +168,29 @@ if(exposed_temperature >= 1922) thermite_melt() +/// Handles searing the hand of anyone who tries to touch parent without protection, while burning +/datum/component/thermite/proc/on_attack_hand(atom/source, mob/living/carbon/user) + SIGNAL_HANDLER + + //not burning + if(!fakefire) + return NONE + + if(!iscarbon(user) || user.can_touch_burning(source)) + return NONE + + var/obj/item/bodypart/affecting = user.get_active_hand() + //Should not happen! + if(!affecting) + return NONE + + affecting.receive_damage(burn = 5) + to_chat(user, span_userdanger("The ignited thermite on \the [source] burns your hand!")) + INVOKE_ASYNC(user, TYPE_PROC_REF(/mob, emote), "scream") + playsound(source, SFX_SEAR, 50, TRUE) + user.update_damage_overlays() + return COMPONENT_CANCEL_ATTACK_CHAIN + /** * attackby reaction, ignites the thermite if its a flame creating object * diff --git a/code/datums/components/tippable.dm b/code/datums/components/tippable.dm index e4ecd8a91f451..ee1f2c4054739 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 ..() /** @@ -137,6 +133,8 @@ /datum/component/tippable/proc/do_tip(mob/living/tipped_mob, mob/tipper) if(QDELETED(tipped_mob)) CRASH("Tippable component: do_tip() called with QDELETED tipped_mob!") + if (is_tipped) // sanity check in case multiple people try to tip at the same time + return to_chat(tipper, span_warning("You tip over [tipped_mob].")) if (!isnull(tipped_mob.client)) @@ -189,6 +187,8 @@ /datum/component/tippable/proc/do_untip(mob/living/tipped_mob, mob/untipper) if(QDELETED(tipped_mob)) return + if (!is_tipped) // sanity check in case multiple people try to untip at the same time + return to_chat(untipper, span_notice("You right [tipped_mob].")) tipped_mob.visible_message( diff --git a/code/datums/components/toggle_attached_clothing.dm b/code/datums/components/toggle_attached_clothing.dm new file mode 100644 index 0000000000000..f8197b1f0861f --- /dev/null +++ b/code/datums/components/toggle_attached_clothing.dm @@ -0,0 +1,217 @@ +/** + * Component which allows clothing to deploy a different kind of clothing onto you. + * The simplest example is hooded suits deploying hoods onto your head. + */ +/datum/component/toggle_attached_clothing + /// Instance of the item we're creating + var/obj/item/deployable + /// Action used to toggle deployment + var/datum/action/item_action/toggle_action + /// Typepath of what we're creating + var/deployable_type + /// Which slot this item equips into + var/equipped_slot + /// Name of toggle action + var/action_name = "" + /// If true, we delete our deployable on toggle rather than putting it in nullspace + var/destroy_on_removal + /// Current state of our deployable equipment + var/currently_deployed = FALSE + /// What should be added to the end of the parent icon state when equipment is deployed? Set to "" for no change + var/parent_icon_state_suffix = "" + /// Icon state for overlay to display over the parent item while deployable item is not deployed + var/down_overlay_state_suffix = "" + /// Overlay to display over the parent item while deployable item is not deployed + var/mutable_appearance/undeployed_overlay + /// Optional callback triggered before deploying, return TRUE to continue or FALSE to cancel + var/datum/callback/pre_creation_check + /// Optional callback triggered when we create our deployable equipment + var/datum/callback/on_created + /// Optional callback triggered when we have deployed our equipment + var/datum/callback/on_deployed + /// Optional callback triggered before we hide our equipment, before as we may delete it afterwards + var/datum/callback/on_removed + +/datum/component/toggle_attached_clothing/Initialize( + deployable_type, + equipped_slot, + action_name = "Toggle", + destroy_on_removal = FALSE, + parent_icon_state_suffix = "", + down_overlay_state_suffix = "", + datum/callback/pre_creation_check, + datum/callback/on_created, + datum/callback/on_deployed, + datum/callback/on_removed, +) + . = ..() + if (!isitem(parent)) + return COMPONENT_INCOMPATIBLE + if (!deployable_type || !equipped_slot) + return COMPONENT_INCOMPATIBLE // Not strictly true but INITIALIZE_HINT_QDEL doesn't work from components + src.deployable_type = deployable_type + src.equipped_slot = equipped_slot + src.destroy_on_removal = destroy_on_removal + src.parent_icon_state_suffix = parent_icon_state_suffix + src.down_overlay_state_suffix = down_overlay_state_suffix + src.pre_creation_check = pre_creation_check + src.on_created = on_created + src.on_deployed = on_deployed + src.on_removed = on_removed + + var/obj/item/clothing_parent = parent + toggle_action = new(parent) + toggle_action.name = action_name + clothing_parent.add_item_action(toggle_action) + + RegisterSignal(parent, COMSIG_ITEM_UI_ACTION_CLICK, PROC_REF(on_toggle_pressed)) + RegisterSignal(parent, COMSIG_ITEM_UI_ACTION_SLOT_CHECKED, PROC_REF(on_action_slot_checked)) + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_parent_equipped)) + RegisterSignal(parent, COMSIG_ITEM_POST_UNEQUIP, PROC_REF(remove_deployable)) + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED_AS_OUTFIT, PROC_REF(on_parent_equipped_outfit)) + if (down_overlay_state_suffix) + var/overlay_state = "[initial(clothing_parent.icon_state)][down_overlay_state_suffix]" + undeployed_overlay = mutable_appearance(initial(clothing_parent.worn_icon), overlay_state, -SUIT_LAYER) + RegisterSignal(parent, COMSIG_ITEM_GET_WORN_OVERLAYS, PROC_REF(on_checked_overlays)) + clothing_parent.update_slot_icon() + + if (!destroy_on_removal) + create_deployable() + +/datum/component/toggle_attached_clothing/Destroy(force, silent) + unequip_deployable() + QDEL_NULL(deployable) + QDEL_NULL(toggle_action) + undeployed_overlay = null + pre_creation_check = null + on_created = null + on_deployed = null + on_removed = null + return ..() + +/// Toggle deployable when the UI button is clicked +/datum/component/toggle_attached_clothing/proc/on_toggle_pressed(obj/item/source, mob/user, datum/action) + SIGNAL_HANDLER + if (action != toggle_action) + return + toggle_deployable() + return COMPONENT_ACTION_HANDLED + +/// Called when action attempts to check what slot the item is worn in +/datum/component/toggle_attached_clothing/proc/on_action_slot_checked(obj/item/clothing/source, mob/user, datum/action, slot) + SIGNAL_HANDLER + if (action != toggle_action) + return + if (!(source.slot_flags & slot)) + return COMPONENT_ITEM_ACTION_SLOT_INVALID + +/// Apply an overlay while the item is not deployed +/datum/component/toggle_attached_clothing/proc/on_checked_overlays(obj/item/source, list/overlays, mutable_appearance/standing, isinhands, icon_file) + SIGNAL_HANDLER + if (isinhands || currently_deployed) + return + overlays += undeployed_overlay + +/// Deploys gear if it is hidden, hides it if it is deployed +/datum/component/toggle_attached_clothing/proc/toggle_deployable() + if (currently_deployed) + remove_deployable() + return + + var/obj/item/parent_gear = parent + if (!ishuman(parent_gear.loc)) + return + var/mob/living/carbon/human/wearer = parent_gear.loc + if (wearer.is_holding(parent_gear)) + parent_gear.balloon_alert(wearer, "wear it first!") + return + if (wearer.get_item_by_slot(equipped_slot)) + parent_gear.balloon_alert(wearer, "slot occupied!") + return + if (!deployable && !create_deployable()) + return + if (!wearer.equip_to_slot_if_possible(deployable, slot = equipped_slot)) + if(destroy_on_removal) + remove_deployable() + return + currently_deployed = TRUE + on_deployed?.Invoke(deployable) + if (parent_icon_state_suffix) + parent_gear.icon_state = "[initial(parent_gear.icon_state)][parent_icon_state_suffix]" + parent_gear.worn_icon_state = parent_gear.icon_state + parent_gear.update_slot_icon() + wearer.update_mob_action_buttons() + +/// Undeploy gear if it moves slots somehow +/datum/component/toggle_attached_clothing/proc/on_parent_equipped(obj/item/clothing/source, mob/equipper, slot) + SIGNAL_HANDLER + if (slot & equipped_slot) + return + remove_deployable() + +/// Display deployed if worn in an outfit +/datum/component/toggle_attached_clothing/proc/on_parent_equipped_outfit(obj/item/clothing/source, mob/equipper, visuals_only, slot) + SIGNAL_HANDLER + create_deployable() + toggle_deployable() + +/// Create our gear, returns true if we actually made anything +/datum/component/toggle_attached_clothing/proc/create_deployable() + if (deployable) + return FALSE + if (pre_creation_check && !pre_creation_check.Invoke()) + return FALSE + deployable = new deployable_type(parent) + if (!istype(deployable)) + stack_trace("Tried to create non-clothing item from toggled clothing.") + RegisterSignal(deployable, COMSIG_ITEM_DROPPED, PROC_REF(on_deployed_dropped)) + RegisterSignal(deployable, COMSIG_ITEM_EQUIPPED, PROC_REF(on_deployed_equipped)) + RegisterSignal(deployable, COMSIG_QDELETING, PROC_REF(on_deployed_destroyed)) + on_created?.Invoke(deployable) + return TRUE + +/// Undeploy gear if you drop it +/datum/component/toggle_attached_clothing/proc/on_deployed_dropped() + SIGNAL_HANDLER + remove_deployable() + +/// Undeploy gear if it moves slots somehow +/datum/component/toggle_attached_clothing/proc/on_deployed_equipped(obj/item/clothing/source, mob/equipper, slot) + SIGNAL_HANDLER + if (source.slot_flags & slot) + return + remove_deployable() + +/// Undeploy gear if it is deleted +/datum/component/toggle_attached_clothing/proc/on_deployed_destroyed() + SIGNAL_HANDLER + remove_deployable() + deployable = null + +/// Removes our deployed equipment from the wearer +/datum/component/toggle_attached_clothing/proc/remove_deployable() + SIGNAL_HANDLER + unequip_deployable() + if (!currently_deployed) + return + currently_deployed = FALSE + on_removed?.Invoke(deployable) + + var/obj/item/parent_gear = parent + if (destroy_on_removal) + QDEL_NULL(deployable) + else if (parent_icon_state_suffix) + parent_gear.icon_state = "[initial(parent_gear.icon_state)]" + parent_gear.worn_icon_state = parent_gear.icon_state + parent_gear.update_slot_icon() + parent_gear.update_item_action_buttons() + +/// Removes an equipped deployable atom upon its retraction or destruction +/datum/component/toggle_attached_clothing/proc/unequip_deployable() + if (!deployable) + return + if (!ishuman(deployable.loc)) + deployable.forceMove(parent) + return + var/mob/living/carbon/human/wearer = deployable.loc + wearer.transferItemToLoc(deployable, parent, force = TRUE, silent = TRUE) diff --git a/code/datums/components/transforming.dm b/code/datums/components/transforming.dm index 52b334e31f081..3c3fec196c23b 100644 --- a/code/datums/components/transforming.dm +++ b/code/datums/components/transforming.dm @@ -37,24 +37,24 @@ /// If we get sharpened with a whetstone, save the bonus here for later use if we un/redeploy var/sharpened_bonus = 0 /// Dictate whether we change inhands or not - var/inhand_icon_change + var/inhand_icon_change = TRUE /// Cooldown in between transforms COOLDOWN_DECLARE(transform_cooldown) /datum/component/transforming/Initialize( - start_transformed = FALSE, - transform_cooldown_time = 0 SECONDS, - force_on = 0, - throwforce_on = 0, - throw_speed_on = 2, - sharpness_on = NONE, - hitsound_on = 'sound/weapons/blade1.ogg', - w_class_on = WEIGHT_CLASS_BULKY, - clumsy_check = TRUE, - list/attack_verb_continuous_on, - list/attack_verb_simple_on, - inhand_icon_change = TRUE, - ) + start_transformed = FALSE, + transform_cooldown_time = 0 SECONDS, + force_on = 0, + throwforce_on = 0, + throw_speed_on = 2, + sharpness_on = NONE, + hitsound_on = 'sound/weapons/blade1.ogg', + w_class_on = WEIGHT_CLASS_BULKY, + clumsy_check = TRUE, + list/attack_verb_continuous_on, + list/attack_verb_simple_on, + inhand_icon_change = TRUE, +) if(!isitem(parent)) return COMPONENT_INCOMPATIBLE @@ -89,6 +89,23 @@ RegisterSignal(parent, COMSIG_ITEM_SHARPEN_ACT, PROC_REF(on_sharpen)) RegisterSignal(parent, COMSIG_DETECTIVE_SCANNED, PROC_REF(on_scan)) + RegisterSignal(parent, COMSIG_ITEM_APPLY_FANTASY_BONUSES, PROC_REF(apply_fantasy_bonuses)) + RegisterSignal(parent, COMSIG_ITEM_REMOVE_FANTASY_BONUSES, PROC_REF(remove_fantasy_bonuses)) + +/datum/component/transforming/proc/apply_fantasy_bonuses(obj/item/source, bonus) + SIGNAL_HANDLER + active = FALSE + set_inactive(source) + force_on = source.modify_fantasy_variable("force_on", force_on, bonus) + throwforce_on = source.modify_fantasy_variable("throwforce_on", throwforce_on, bonus) + +/datum/component/transforming/proc/remove_fantasy_bonuses(obj/item/source, bonus) + SIGNAL_HANDLER + active = FALSE + set_inactive(source) + force_on = source.reset_fantasy_variable("force_on", force_on) + throwforce_on = source.reset_fantasy_variable("throwforce_on", throwforce_on) + /datum/component/transforming/UnregisterFromParent() UnregisterSignal(parent, list(COMSIG_ITEM_ATTACK_SELF, COMSIG_ITEM_SHARPEN_ACT, COMSIG_DETECTIVE_SCANNED)) @@ -120,7 +137,7 @@ if(do_transform(source, user)) clumsy_transform_effect(user) - . = COMPONENT_CANCEL_ATTACK_CHAIN + return COMPONENT_CANCEL_ATTACK_CHAIN /* * Transform the weapon into its alternate form, calling [toggle_active]. @@ -153,7 +170,7 @@ /datum/component/transforming/proc/default_transform_message(obj/item/source, mob/user) if(user) source.balloon_alert(user, "[active ? "enabled" : "disabled"] [source]") - playsound(user ? user : source.loc, 'sound/weapons/batonextend.ogg', 50, TRUE) + playsound(source, 'sound/weapons/batonextend.ogg', 50, TRUE) /* * Toggle active between true and false, and call @@ -175,6 +192,7 @@ * source - the item being transformed / parent */ /datum/component/transforming/proc/set_active(obj/item/source) + ADD_TRAIT(source, TRAIT_TRANSFORM_ACTIVE, REF(src)) if(sharpness_on) source.sharpness = sharpness_on if(force_on) @@ -203,6 +221,7 @@ * source - the item being un-transformed / parent */ /datum/component/transforming/proc/set_inactive(obj/item/source) + REMOVE_TRAIT(source, TRAIT_TRANSFORM_ACTIVE, REF(src)) if(sharpness_on) source.sharpness = initial(source.sharpness) if(force_on) @@ -245,8 +264,8 @@ var/hurt_self_verb_continuous = LAZYLEN(attack_verb_continuous_on) ? pick(attack_verb_continuous_on) : "hits" user.visible_message( span_warning("[user] triggers [parent] while holding it backwards and [hurt_self_verb_continuous] themself, like a doofus!"), - span_warning("You trigger [parent] while holding it backwards and [hurt_self_verb_simple] yourself, like a doofus!") - ) + span_warning("You trigger [parent] while holding it backwards and [hurt_self_verb_simple] yourself, like a doofus!"), + ) user.take_bodypart_damage(10) return TRUE return FALSE diff --git a/code/datums/components/tree_climber.dm b/code/datums/components/tree_climber.dm new file mode 100644 index 0000000000000..9f506ae516f8a --- /dev/null +++ b/code/datums/components/tree_climber.dm @@ -0,0 +1,91 @@ +/* + * A component given to mobs that can climb trees + */ +/datum/component/tree_climber + ///the distance to climb up and down + var/climbing_distance = 20 + ///the tree we are on + var/obj/current_tree + +/datum/component/tree_climber/Initialize(climbing_distance = 20) + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + src.climbing_distance = climbing_distance + + ADD_TRAIT(parent, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, type) + +/datum/component/tree_climber/RegisterWithParent() + RegisterSignals(parent, list(COMSIG_HOSTILE_PRE_ATTACKINGTARGET, COMSIG_LIVING_CLIMB_TREE), PROC_REF(climb_tree)) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + +/datum/component/tree_climber/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_HOSTILE_PRE_ATTACKINGTARGET, COMSIG_LIVING_CLIMB_TREE, COMSIG_ATOM_EXAMINE)) + +/datum/component/tree_climber/Destroy() + if(current_tree) + handle_climb_tree(parent, current_tree) //remove mob from tree and handle deletion of signals + return ..() + +/datum/component/tree_climber/proc/climb_tree(mob/living/source, atom/target) + SIGNAL_HANDLER + + if(!istype(target, /obj/structure/flora/tree)) + return + + if(!can_climb_tree(target)) //check if another animal is on the tree + to_chat(source, span_warning("[target] is blocked!")) + return COMPONENT_HOSTILE_NO_ATTACK + + handle_climb_tree(source, target) + + if(current_tree) + source.forceMove(get_turf(current_tree)) + return COMPONENT_HOSTILE_NO_ATTACK + + var/list/possible_drops = get_adjacent_open_turfs(target) + for(var/turf/droploc as anything in possible_drops) + if(!droploc.is_blocked_turf(exclude_mobs = TRUE)) + continue + possible_drops -= droploc + if(possible_drops.len) + source.forceMove(pick(possible_drops)) + return COMPONENT_HOSTILE_NO_ATTACK + +/datum/component/tree_climber/proc/on_examine(datum/source, mob/user, list/examine_text) + SIGNAL_HANDLER + if(current_tree) + examine_text += "It is clinging to [current_tree]!" + +/datum/component/tree_climber/proc/can_climb_tree(obj/structure/flora/tree/target) + if(current_tree) + return TRUE + var/turf/tree_turf = get_turf(target) + if(locate(/mob/living) in tree_turf.contents) + return FALSE + return TRUE + +/datum/component/tree_climber/proc/handle_climb_tree(mob/living/climber, obj/structure/target_tree) + var/offset = current_tree ? -(climbing_distance) : climbing_distance + animate(climber, pixel_y = climber.pixel_y + offset, time = 2) + climber.Stun(2 SECONDS, ignore_canstun = TRUE) + if(current_tree) + remove_tree_signals() + current_tree = null + return + + current_tree = target_tree + register_tree_signals() + +/datum/component/tree_climber/proc/remove_from_tree() + SIGNAL_HANDLER + + handle_climb_tree(parent, current_tree) + +/datum/component/tree_climber/proc/register_tree_signals() + RegisterSignal(parent, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(remove_from_tree)) + RegisterSignal(current_tree, COMSIG_PREQDELETED, PROC_REF(remove_from_tree)) + +/datum/component/tree_climber/proc/remove_tree_signals() + UnregisterSignal(parent, COMSIG_MOVABLE_PRE_MOVE) + UnregisterSignal(current_tree, COMSIG_PREQDELETED) + diff --git a/code/datums/components/twohanded.dm b/code/datums/components/twohanded.dm index bb28c4eeb02af..37df730821762 100644 --- a/code/datums/components/twohanded.dm +++ b/code/datums/components/twohanded.dm @@ -56,8 +56,14 @@ if(require_twohands) ADD_TRAIT(parent, TRAIT_NEEDS_TWO_HANDS, ABSTRACT_ITEM_TRAIT) +/datum/component/two_handed/Destroy(force, silent) + offhand_item = null + wield_callback = null + unwield_callback = null + return ..() + // Inherit the new values passed to the component -/datum/component/two_handed/InheritComponent(datum/component/two_handed/new_comp, original, require_twohands, wieldsound, unwieldsound, \ +/datum/component/two_handed/InheritComponent(datum/component/two_handed/new_comp, original, require_twohands, wieldsound, unwieldsound, attacksound, \ force_multiplier, force_wielded, force_unwielded, icon_wielded, \ datum/callback/wield_callback, datum/callback/unwield_callback) if(!original) @@ -92,6 +98,25 @@ 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)) + RegisterSignal(parent, COMSIG_ITEM_APPLY_FANTASY_BONUSES, PROC_REF(apply_fantasy_bonuses)) + RegisterSignal(parent, COMSIG_ITEM_REMOVE_FANTASY_BONUSES, PROC_REF(remove_fantasy_bonuses)) + +/datum/component/two_handed/proc/apply_fantasy_bonuses(obj/item/source, bonus) + SIGNAL_HANDLER + force_wielded = source.modify_fantasy_variable("force_wielded", force_wielded, bonus) + force_unwielded = source.modify_fantasy_variable("force_unwielded", force_unwielded, bonus) + if(wielded && ismob(source.loc)) + unwield(source.loc) + if(force_multiplier) + force_multiplier = source.modify_fantasy_variable("force_multiplier", force_multiplier, bonus/10, minimum = 1) + +/datum/component/two_handed/proc/remove_fantasy_bonuses(obj/item/source, bonus) + SIGNAL_HANDLER + force_wielded = source.reset_fantasy_variable("force_wielded", force_wielded) + force_unwielded = source.reset_fantasy_variable("force_unwielded", force_unwielded) + if(wielded && ismob(source.loc)) + unwield(source.loc) + force_multiplier = source.reset_fantasy_variable("force_multiplier", force_multiplier) // Remove all siginals registered to the parent item /datum/component/two_handed/UnregisterFromParent() @@ -148,13 +173,6 @@ /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!")) diff --git a/code/datums/components/udder.dm b/code/datums/components/udder.dm index a72d67e0c9f5f..c1f0ff0324589 100644 --- a/code/datums/components/udder.dm +++ b/code/datums/components/udder.dm @@ -22,6 +22,7 @@ /datum/component/udder/UnregisterFromParent() QDEL_NULL(udder) + on_milk_callback = null UnregisterSignal(parent, list(COMSIG_ATOM_EXAMINE, COMSIG_ATOM_ATTACKBY)) ///signal called on parent being examined @@ -82,6 +83,7 @@ . = ..() STOP_PROCESSING(SSobj, src) udder_mob = null + on_generate_callback = null /obj/item/udder/process(seconds_per_tick) if(udder_mob.stat != DEAD) @@ -92,7 +94,7 @@ * also useful for changing initial amounts in reagent holder (cows start with milk, gutlunches start empty) */ /obj/item/udder/proc/initial_conditions() - reagents.add_reagent(reagent_produced_typepath, 20) + reagents.add_reagent(reagent_produced_typepath, 20, added_purity = 1) START_PROCESSING(SSobj, src) /** @@ -100,7 +102,7 @@ */ /obj/item/udder/proc/generate() if(prob(5)) - reagents.add_reagent(reagent_produced_typepath, rand(5, 10)) + reagents.add_reagent(reagent_produced_typepath, rand(5, 10), added_purity = 1) if(on_generate_callback) on_generate_callback.Invoke(reagents.total_volume, reagents.maximum_volume) @@ -115,8 +117,8 @@ if(milk_holder.reagents.total_volume >= milk_holder.volume) to_chat(user, span_warning("[milk_holder] is full.")) return - var/transfered = reagents.trans_to(milk_holder, rand(5,10)) - if(transfered) + var/transferred = reagents.trans_to(milk_holder, rand(5,10)) + if(transferred) user.visible_message(span_notice("[user] milks [src] using \the [milk_holder]."), span_notice("You milk [src] using \the [milk_holder].")) else to_chat(user, span_warning("The udder is dry. Wait a bit longer...")) @@ -161,7 +163,7 @@ /obj/item/udder/gutlunch/generate() var/made_something = FALSE if(prob(60)) - reagents.add_reagent(/datum/reagent/consumable/cream, rand(2, 5)) + reagents.add_reagent(/datum/reagent/consumable/cream, rand(2, 5), added_purity = 1) made_something = TRUE if(prob(45)) reagents.add_reagent(/datum/reagent/medicine/salglu_solution, rand(2,5)) diff --git a/code/datums/components/unusual_effect.dm b/code/datums/components/unusual_effect.dm new file mode 100644 index 0000000000000..eb67b95379974 --- /dev/null +++ b/code/datums/components/unusual_effect.dm @@ -0,0 +1,60 @@ + +/particles/unusual_effect + icon = 'icons/effects/particles/pollen.dmi' + icon_state = "pollen" + width = 100 + height = 100 + count = 1000 + spawning = 4 + lifespan = 0.7 SECONDS + fade = 1 SECONDS + grow = -0.01 + velocity = list(0, 0) + 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(GEN_VECTOR, list(0.3, 0.3), list(1,1), NORMAL_RAND) + rotation = 30 + spin = generator(GEN_NUM, -20, 20) + +/// Creates a cool looking effect on the movable. +/// In the future, this could be expanded to have more interesting particles and effects. +/datum/component/unusual_effect + dupe_mode = COMPONENT_DUPE_HIGHLANDER + + var/obj/effect/abstract/particle_holder/special_effects + + var/color + + COOLDOWN_DECLARE(glow_cooldown) + +/datum/component/unusual_effect/Initialize(color, include_particles = FALSE) + var/atom/movable/parent_movable = parent + if (!istype(parent_movable)) + return COMPONENT_INCOMPATIBLE + + src.color = color + parent_movable.add_filter("unusual_effect", 2, list("type" = "outline", "color" = color, "size" = 2)) + if(include_particles) + special_effects = new(parent_movable, /particles/unusual_effect) + START_PROCESSING(SSobj, src) + +/datum/component/unusual_effect/Destroy(force, silent) + var/atom/movable/parent_movable = parent + if (istype(parent_movable)) + parent_movable.remove_filter("unusual_effect") + STOP_PROCESSING(SSobj, src) + return ..() + +/datum/component/unusual_effect/process(seconds_per_tick) + var/atom/movable/parent_movable = parent + var/filter = parent_movable.get_filter("unusual_effect") + if (!filter) + parent_movable.add_filter("unusual_effect", 2, list("type" = "outline", "color" = color, "size" = 2)) + return + if(!COOLDOWN_FINISHED(src, glow_cooldown)) + return + + animate(filter, alpha = 110, time = 1.5 SECONDS, loop = -1) + animate(alpha = 40, time = 2.5 SECONDS) + COOLDOWN_START(src, glow_cooldown, 4 SECONDS) diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index 02156f69aa793..037404176785b 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -48,6 +48,7 @@ has_progression = FALSE, datum/uplink_handler/uplink_handler_override, ) + if(!isitem(parent)) return COMPONENT_INCOMPATIBLE @@ -119,6 +120,7 @@ /// Sets the telecrystals of the uplink. It is bad practice to use this outside of the component itself. /datum/component/uplink/proc/set_telecrystals(new_telecrystal_amount) uplink_handler.telecrystals = new_telecrystal_amount + uplink_handler.on_update() /datum/component/uplink/InheritComponent(datum/component/uplink/uplink) lockable |= uplink.lockable @@ -145,6 +147,11 @@ if(istype(item, /obj/item/stack/telecrystal)) load_tc(user, item) + if(!istype(item)) + return + + SEND_SIGNAL(item, COMSIG_ITEM_ATTEMPT_TC_REIMBURSE, user, src) + /datum/component/uplink/proc/on_examine(datum/source, mob/user, list/examine_list) SIGNAL_HANDLER @@ -227,9 +234,8 @@ var/list/extra_purchasable_stock = list() var/list/extra_purchasable = list() for(var/datum/uplink_item/item as anything in uplink_handler.extra_purchasable) - if(item in stock_list) - extra_purchasable_stock[REF(item)] = stock_list[item] - stock_list -= item + if(item.stock_key in stock_list) + extra_purchasable_stock[REF(item)] = stock_list[item.stock_key] extra_purchasable += list(list( "id" = item.type, "name" = item.name, @@ -253,6 +259,7 @@ data["current_stock"] = remaining_stock data["shop_locked"] = uplink_handler.shop_locked data["purchased_items"] = length(uplink_handler.purchase_log?.purchase_log) + data["can_renegotiate"] = user.mind == uplink_handler.owner && uplink_handler.can_replace_objectives?.Invoke() == TRUE return data /datum/component/uplink/ui_static_data(mob/user) @@ -294,6 +301,9 @@ if(!lockable) return TRUE lock_uplink() + if("renegotiate_objectives") + uplink_handler.replace_objectives?.Invoke() + SStgui.update_uis(src) if(!uplink_handler.has_objectives) return TRUE diff --git a/code/datums/components/usb_port.dm b/code/datums/components/usb_port.dm index a1cf432dab7d6..051101fdbb421 100644 --- a/code/datums/components/usb_port.dm +++ b/code/datums/components/usb_port.dm @@ -133,7 +133,7 @@ /datum/component/usb_port/proc/on_examine_shell(datum/source, mob/user, list/examine_text) SIGNAL_HANDLER - examine_text += span_notice("[source.p_they(TRUE)] [source.p_are()] attached to [parent] with a USB cable.") + examine_text += span_notice("[source.p_They()] [source.p_are()] attached to [parent] with a USB cable.") /datum/component/usb_port/proc/on_atom_usb_cable_try_attach(datum/source, obj/item/usb_cable/connecting_cable, mob/user) SIGNAL_HANDLER @@ -188,7 +188,7 @@ QDEL_NULL(usb_cable_beam) var/atom/atom_parent = parent - usb_cable_beam = atom_parent.Beam(new_physical_object, "usb_cable_beam", 'icons/obj/wiremod.dmi') + usb_cable_beam = atom_parent.Beam(new_physical_object, "usb_cable_beam", 'icons/obj/science/circuits.dmi') RegisterSignal(new_physical_object, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) RegisterSignal(new_physical_object, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine_shell)) diff --git a/code/datums/components/wall_mounted.dm b/code/datums/components/wall_mounted.dm new file mode 100644 index 0000000000000..8d1722f89feb8 --- /dev/null +++ b/code/datums/components/wall_mounted.dm @@ -0,0 +1,86 @@ +// This element should be applied to wall-mounted machines/structures, so that if the wall it's "hanging" from is broken or deconstructed, the wall-hung structure will deconstruct. +/datum/component/wall_mounted + dupe_mode = COMPONENT_DUPE_ALLOWED + /// The wall our object is currently linked to. + var/turf/hanging_wall_turf + /// Callback to the parent's proc to call on the linked object when the wall disappear's or changes. + var/datum/callback/on_drop + +/datum/component/wall_mounted/Initialize(target_wall, on_drop_callback) + . = ..() + if(!isobj(parent)) + return COMPONENT_INCOMPATIBLE + if(!isturf(target_wall)) + return COMPONENT_INCOMPATIBLE + hanging_wall_turf = target_wall + on_drop = on_drop_callback + +/datum/component/wall_mounted/RegisterWithParent() + RegisterSignal(hanging_wall_turf, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(hanging_wall_turf, COMSIG_TURF_CHANGE, PROC_REF(on_turf_changing)) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(drop_wallmount)) + RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(on_linked_destroyed)) + +/datum/component/wall_mounted/UnregisterFromParent() + UnregisterSignal(hanging_wall_turf, list(COMSIG_ATOM_EXAMINE, COMSIG_TURF_CHANGE)) + UnregisterSignal(parent, list(COMSIG_QDELETING, COMSIG_MOVABLE_MOVED)) + hanging_wall_turf = null + +/** + * Basic reference handling if the hanging/linked object is destroyed first. + */ +/datum/component/wall_mounted/proc/on_linked_destroyed() + SIGNAL_HANDLER + if(!QDELING(src)) + qdel(src) + +/** + * When the wall is examined, explains that it's supporting the linked object. + */ +/datum/component/wall_mounted/proc/on_examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + examine_list += span_notice("\The [hanging_wall_turf] is currently supporting [span_bold("[parent]")]. Deconstruction or excessive damage would cause it to [span_bold("fall to the ground")].") + +/** + * When the type of turf changes, if it is changing into a floor we should drop our contents + */ +/datum/component/wall_mounted/proc/on_turf_changing(datum/source, path, new_baseturfs, flags, post_change_callbacks) + SIGNAL_HANDLER + if (ispath(path, /turf/open)) + drop_wallmount() + +/** + * Handles the dropping of the linked object. This is done via deconstruction, as that should be the most sane way to handle it for most objects. + * Except for intercoms, which are handled by creating a new wallframe intercom, as they're apparently items. + */ +/datum/component/wall_mounted/proc/drop_wallmount() + SIGNAL_HANDLER + var/obj/hanging_parent = parent + + if(on_drop) + hanging_parent.visible_message(message = span_warning("\The [hanging_parent] falls off the wall!"), vision_distance = 5) + on_drop.Invoke(hanging_parent) + else + hanging_parent.visible_message(message = span_warning("\The [hanging_parent] falls apart!"), vision_distance = 5) + hanging_parent.deconstruct() + + if(!QDELING(src)) + qdel(src) //Well, we fell off the wall, so we're done here. +/** + * Checks object direction and then verifies if there's a wall in that direction. Finally, applies a wall_mounted component to the object. + * + * @param directional If TRUE, will use the direction of the object to determine the wall to attach to. If FALSE, will use the object's loc. + * @param custom_drop_callback If set, will use this callback instead of the default deconstruct callback. + */ +/obj/proc/find_and_hang_on_wall(directional = TRUE, custom_drop_callback) + if(istype(get_area(src), /area/shuttle)) + return FALSE //For now, we're going to keep the component off of shuttles to avoid the turf changing issue. We'll hit that later really; + var/turf/attachable_wall + if(directional) + attachable_wall = get_step(src, dir) + else + attachable_wall = loc ///Pull from the curent object loc + if(!iswallturf(attachable_wall)) + return FALSE//Nothing to latch onto, or not the right thing. + src.AddComponent(/datum/component/wall_mounted, attachable_wall, custom_drop_callback) + return TRUE diff --git a/code/datums/components/weatherannouncer.dm b/code/datums/components/weatherannouncer.dm new file mode 100644 index 0000000000000..fec31ccf9d3ce --- /dev/null +++ b/code/datums/components/weatherannouncer.dm @@ -0,0 +1,175 @@ +#define WEATHER_ALERT_CLEAR 0 +#define WEATHER_ALERT_INCOMING 1 +#define WEATHER_ALERT_IMMINENT_OR_ACTIVE 2 + +/// Component which makes you yell about what the weather is +/datum/component/weather_announcer + /// Currently displayed warning level + var/warning_level = WEATHER_ALERT_CLEAR + /// Whether the incoming weather is actually going to harm you + var/is_weather_dangerous = TRUE + /// Are we actually turned on right now? + var/enabled = TRUE + /// Overlay added when things are alright + var/state_normal + /// Overlay added when you should start looking for shelter + var/state_warning + /// Overlay added when you are in danger + var/state_danger + +/datum/component/weather_announcer/Initialize( + state_normal, + state_warning, + state_danger, +) + . = ..() + if (!ismovable(parent)) + return COMPONENT_INCOMPATIBLE + + START_PROCESSING(SSprocessing, src) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_update_overlays)) + RegisterSignal(parent, COMSIG_MACHINERY_POWER_RESTORED, PROC_REF(on_powered)) + RegisterSignal(parent, COMSIG_MACHINERY_POWER_LOST, PROC_REF(on_power_lost)) + + src.state_normal = state_normal + src.state_warning = state_warning + src.state_danger = state_danger + var/atom/speaker = parent + speaker.update_appearance(UPDATE_ICON) + update_light_color() + +/datum/component/weather_announcer/Destroy(force, silent) + STOP_PROCESSING(SSprocessing, src) + return ..() + +/// Add appropriate overlays +/datum/component/weather_announcer/proc/on_update_overlays(atom/parent_atom, list/overlays) + SIGNAL_HANDLER + if (!enabled || !state_normal || !state_warning || !state_danger) + return + + switch (warning_level) + if(WEATHER_ALERT_CLEAR) + overlays += state_normal + if(WEATHER_ALERT_INCOMING) + overlays += state_warning + if(WEATHER_ALERT_IMMINENT_OR_ACTIVE) + overlays += (is_weather_dangerous) ? state_danger : state_warning + +/// If powered, receive updates +/datum/component/weather_announcer/proc/on_powered() + SIGNAL_HANDLER + enabled = TRUE + var/atom/speaker = parent + speaker.update_appearance(UPDATE_ICON) + +/// If no power, don't receive updates +/datum/component/weather_announcer/proc/on_power_lost() + SIGNAL_HANDLER + enabled = FALSE + var/atom/speaker = parent + speaker.update_appearance(UPDATE_ICON) + +/datum/component/weather_announcer/process(seconds_per_tick) + if (!enabled) + return + + var/previous_level = warning_level + var/previous_danger = is_weather_dangerous + set_current_alert_level() + if(previous_level == warning_level && previous_danger == is_weather_dangerous) + return // No change + var/atom/movable/speaker = parent + speaker.say(get_warning_message()) + speaker.update_appearance(UPDATE_ICON) + update_light_color() + +/datum/component/weather_announcer/proc/update_light_color() + var/atom/movable/light = parent + switch(warning_level) + if(WEATHER_ALERT_CLEAR) + light.set_light_color(LIGHT_COLOR_GREEN) + if(WEATHER_ALERT_INCOMING) + light.set_light_color(LIGHT_COLOR_DIM_YELLOW) + if(WEATHER_ALERT_IMMINENT_OR_ACTIVE) + light.set_light_color(LIGHT_COLOR_INTENSE_RED) + light.update_light() + +/// Returns a string we should display to communicate what you should be doing +/datum/component/weather_announcer/proc/get_warning_message() + if (!is_weather_dangerous) + return "No risk expected from incoming weather front." + switch(warning_level) + if(WEATHER_ALERT_CLEAR) + return "All clear, no weather alerts to report." + if(WEATHER_ALERT_INCOMING) + return "Weather front incoming, begin to seek shelter." + if(WEATHER_ALERT_IMMINENT_OR_ACTIVE) + return "Weather front imminent, find shelter immediately." + return "Error in meteorological calculation. Please report this deviation to a trained programmer." + +/datum/component/weather_announcer/proc/time_till_storm() + var/list/mining_z_levels = SSmapping.levels_by_trait(ZTRAIT_MINING) + if(!length(mining_z_levels)) + return // No problems if there are no mining z levels + + + for(var/datum/weather/check_weather as anything in SSweather.processing) + if(!check_weather.barometer_predictable || check_weather.stage == WIND_DOWN_STAGE || check_weather.stage == END_STAGE) + continue + for (var/mining_level in mining_z_levels) + if(mining_level in check_weather.impacted_z_levels) + warning_level = WEATHER_ALERT_IMMINENT_OR_ACTIVE + return 0 + + var/time_until_next = INFINITY + for(var/mining_level in mining_z_levels) + var/next_time = timeleft(SSweather.next_hit_by_zlevel["[mining_level ]"]) || INFINITY + if (next_time && next_time < time_until_next) + time_until_next = next_time + return time_until_next + +/// Polls existing weather for what kind of warnings we should be displaying. +/datum/component/weather_announcer/proc/set_current_alert_level() + var/time_until_next = time_till_storm() + if(isnull(time_until_next)) + return // No problems if there are no mining z levels + if(time_until_next >= 2 MINUTES) + warning_level = WEATHER_ALERT_CLEAR + return + + if(time_until_next >= 30 SECONDS) + warning_level = WEATHER_ALERT_INCOMING + return + + // Weather is here, now we need to figure out if it is dangerous + warning_level = WEATHER_ALERT_IMMINENT_OR_ACTIVE + + for(var/datum/weather/check_weather as anything in SSweather.processing) + if(!check_weather.barometer_predictable || check_weather.stage == WIND_DOWN_STAGE || check_weather.stage == END_STAGE) + continue + var/list/mining_z_levels = SSmapping.levels_by_trait(ZTRAIT_MINING) + for(var/mining_level in mining_z_levels) + if(mining_level in check_weather.impacted_z_levels) + is_weather_dangerous = !check_weather.aesthetic + return + +/datum/component/weather_announcer/proc/on_examine(atom/radio, mob/examiner, list/examine_texts) + var/time_until_next = time_till_storm() + if(isnull(time_until_next)) + return + if (time_until_next == 0) + examine_texts += span_warning ("A storm is currently active, please seek shelter.") + else + examine_texts += span_notice("The next storm is inbound in [DisplayTimeText(time_until_next)].") + +/datum/component/weather_announcer/RegisterWithParent() + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + +/datum/component/weather_announcer/UnregisterFromParent() + .=..() + UnregisterSignal(parent, COMSIG_ATOM_EXAMINE) + +#undef WEATHER_ALERT_CLEAR +#undef WEATHER_ALERT_INCOMING +#undef WEATHER_ALERT_IMMINENT_OR_ACTIVE diff --git a/code/datums/components/wet_floor.dm b/code/datums/components/wet_floor.dm index 9c795fb8a181d..0b3b92fd2e3c9 100644 --- a/code/datums/components/wet_floor.dm +++ b/code/datums/components/wet_floor.dm @@ -75,23 +75,23 @@ /datum/component/wet_floor/proc/update_flags() var/intensity - lube_flags = NONE + lube_flags = SLIPPERY_TURF switch(highest_strength) if(TURF_WET_WATER) intensity = 60 - lube_flags = NO_SLIP_WHEN_WALKING + lube_flags |= NO_SLIP_WHEN_WALKING if(TURF_WET_LUBE) intensity = 80 - lube_flags = SLIDE | GALOSHES_DONT_HELP + lube_flags |= SLIDE | GALOSHES_DONT_HELP if(TURF_WET_ICE) intensity = 120 - lube_flags = SLIDE | GALOSHES_DONT_HELP + lube_flags |= SLIDE | GALOSHES_DONT_HELP if(TURF_WET_PERMAFROST) intensity = 120 - lube_flags = SLIDE_ICE | GALOSHES_DONT_HELP + lube_flags |= SLIDE_ICE | GALOSHES_DONT_HELP if(TURF_WET_SUPERLUBE) intensity = 120 - lube_flags = SLIDE | GALOSHES_DONT_HELP | SLIP_WHEN_CRAWLING + lube_flags |= SLIDE | GALOSHES_DONT_HELP | SLIP_WHEN_CRAWLING else qdel(parent.GetComponent(/datum/component/slippery)) return diff --git a/code/datums/datum.dm b/code/datums/datum.dm index fd9d0a022cdda..75605917ef84e 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -17,6 +17,10 @@ */ var/gc_destroyed + /// Open uis owned by this datum + /// Lazy, since this case is semi rare + var/list/open_uis + /// Active timers with this datum as the target var/list/_active_timers /// Status traits attached to this datum. associative list of the form: list(trait name (string) = list(source1, source2, source3,...)) @@ -71,6 +75,10 @@ #endif #endif + // If we have called dump_harddel_info already. Used to avoid duped calls (since we call it immediately in some cases on failure to process) + // Create and destroy is weird and I wanna cover my bases + var/harddel_deets_dumped = FALSE + #ifdef DATUMVAR_DEBUGGING_MODE var/list/cached_vars #endif @@ -124,13 +132,14 @@ //BEGIN: ECS SHIT var/list/dc = _datum_components if(dc) - var/all_components = dc[/datum/component] - if(length(all_components)) - for(var/datum/component/component as anything in all_components) - qdel(component, FALSE, TRUE) - else - var/datum/component/C = all_components - qdel(C, FALSE, TRUE) + for(var/component_key in dc) + var/component_or_list = dc[component_key] + if(islist(component_or_list)) + for(var/datum/component/component as anything in component_or_list) + qdel(component, FALSE, TRUE) + else + var/datum/component/C = component_or_list + qdel(C, FALSE, TRUE) dc.Cut() _clear_signal_refs() @@ -398,3 +407,9 @@ var/atom/atom_cast = src // filters only work with images or atoms. filter_data = null atom_cast.filters = null + +/// 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 +/// Can be called more then once per object, use harddel_deets_dumped to avoid duplicate calls (I am so sorry) +/datum/proc/dump_harddel_info() + return diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index b8f26a89b3cb4..aeea8b22cbaab 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -4,7 +4,8 @@ /datum/proc/can_vv_get(var_name) return TRUE -/datum/proc/vv_edit_var(var_name, var_value) //called whenever a var is edited +/// Called when a var is edited with the new value to change to +/datum/proc/vv_edit_var(var_name, var_value) if(var_name == NAMEOF(src, vars)) return FALSE vars[var_name] = var_value @@ -20,9 +21,14 @@ /datum/proc/can_vv_mark() return TRUE -//please call . = ..() first and append to the result, that way parent items are always at the top and child items are further down -//add separaters by doing . += "---" +/** + * Gets all the dropdown options in the vv menu. + * When overriding, make sure to call . = ..() first and appent to the result, that way parent items are always at the top and child items are further down. + * Add seperators by doing VV_DROPDOWN_OPTION("", "---") + */ /datum/proc/vv_get_dropdown() + SHOULD_CALL_PARENT(TRUE) + . = list() VV_DROPDOWN_OPTION("", "---") VV_DROPDOWN_OPTION(VV_HK_CALLPROC, "Call Proc") @@ -35,9 +41,11 @@ VV_DROPDOWN_OPTION(VV_HK_MASS_REMOVECOMPONENT, "Mass Remove Component/Element") VV_DROPDOWN_OPTION(VV_HK_MODIFY_TRAITS, "Modify Traits") -//This proc is only called if everything topic-wise is verified. The only verifications that should happen here is things like permission checks! -//href_list is a reference, modifying it in these procs WILL change the rest of the proc in topic.dm of admin/view_variables! -//This proc is for "high level" actions like admin heal/set species/etc/etc. The low level debugging things should go in admin/view_variables/topic_basic.dm incase this runtimes. +/** + * This proc is only called if everything topic-wise is verified. The only verifications that should happen here is things like permission checks! + * href_list is a reference, modifying it in these procs WILL change the rest of the proc in topic.dm of admin/view_variables! + * This proc is for "high level" actions like admin heal/set species/etc/etc. The low level debugging things should go in admin/view_variables/topic_basic.dm incase this runtimes. + */ /datum/proc/vv_do_topic(list/href_list) if(!usr || !usr.client || !usr.client.holder || !check_rights(NONE)) return FALSE //This is VV, not to be called by anything else. diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index 734f67eb0ceb2..e64e91c5533ba 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -64,7 +64,7 @@ if(ishuman(src)) var/mob/living/carbon/human/infecting_human = src - if(infecting_human.reagents.has_reagent(/datum/reagent/medicine/spaceacillin) && prob(75)) + if(HAS_TRAIT(infecting_human, TRAIT_VIRUS_RESISTANCE) && prob(75)) return switch(target_zone) @@ -95,19 +95,21 @@ disease.try_infect(src) /mob/living/proc/AirborneContractDisease(datum/disease/disease, force_spread) - if(ishuman(src)) - var/mob/living/carbon/human/infecting_human = src - if(infecting_human.reagents.has_reagent(/datum/reagent/medicine/spaceacillin) && prob(75)) - return + if(HAS_TRAIT(src, TRAIT_VIRUS_RESISTANCE) && prob(75)) + return if(((disease.spread_flags & DISEASE_SPREAD_AIRBORNE) || force_spread) && prob((50*disease.spreading_modifier) - 1)) ForceContractDisease(disease) -/mob/living/carbon/AirborneContractDisease(datum/disease/D, force_spread) +/mob/living/carbon/AirborneContractDisease(datum/disease/disease, force_spread) if(internal) return if(HAS_TRAIT(src, TRAIT_NOBREATH)) return + + if(!disease.has_required_infectious_organ(src, ORGAN_SLOT_LUNGS)) + return + ..() @@ -124,14 +126,14 @@ return TRUE -/mob/living/carbon/human/CanContractDisease(datum/disease/D) +/mob/living/carbon/human/CanContractDisease(datum/disease/disease) if(dna) - if(HAS_TRAIT(src, TRAIT_VIRUSIMMUNE) && !D.bypasses_immunity) + if(HAS_TRAIT(src, TRAIT_VIRUSIMMUNE) && !disease.bypasses_immunity) return FALSE - - for(var/thing in D.required_organs) - if(!((locate(thing) in bodyparts) || (locate(thing) in organs))) + if(disease.required_organ) + if(!disease.has_required_infectious_organ(src, disease.required_organ)) return FALSE + return ..() /mob/living/proc/CanSpreadAirborneDisease() diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 88a4b54c7117c..9d63a8c21b959 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -1,6 +1,6 @@ /datum/disease //Flags - var/visibility_flags = 0 + var/visibility_flags = NONE var/disease_flags = CURABLE|CAN_CARRY|CAN_RESIST var/spread_flags = DISEASE_SPREAD_AIRBORNE | DISEASE_SPREAD_CONTACT_FLUIDS | DISEASE_SPREAD_CONTACT_SKIN @@ -17,6 +17,8 @@ var/max_stages = 0 /// The probability of this infection advancing a stage every second the cure is not present. var/stage_prob = 2 + /// How long this infection incubates (non-visible) before revealing itself + var/incubation_time //Other var/list/viable_mobtypes = list() //typepaths of viable mobs @@ -30,7 +32,8 @@ var/bypasses_immunity = FALSE //Does it skip species virus immunity check? Some things may diseases and not viruses var/spreading_modifier = 1 var/severity = DISEASE_SEVERITY_NONTHREAT - var/list/required_organs = list() + /// If the disease requires an organ for the effects to function, robotic organs are immune to disease unless inorganic biology symptom is present + var/required_organ var/needs_all_cures = TRUE var/list/strain_data = list() //dna_spread special bullshit var/infectable_biotypes = MOB_ORGANIC //if the disease can spread on organics, synthetics, or undead @@ -61,22 +64,25 @@ var/turf/source_turf = get_turf(infectee) log_virus("[key_name(infectee)] was infected by virus: [src.admin_details()] at [loc_name(source_turf)]") - -///Proc to process the disease and decide on whether to advance, cure or make the sympthoms appear. Returns a boolean on whether to continue acting on the symptoms or not. +///Proc to process the disease and decide on whether to advance, cure or make the symptoms appear. Returns a boolean on whether to continue acting on the symptoms or not. /datum/disease/proc/stage_act(seconds_per_tick, times_fired) - var/slowdown = affected_mob.reagents.has_reagent(/datum/reagent/medicine/spaceacillin) ? 0.5 : 1 // spaceacillin slows stage speed by 50% + var/slowdown = HAS_TRAIT(affected_mob, TRAIT_VIRUS_RESISTANCE) ? 0.5 : 1 // spaceacillin slows stage speed by 50% + + if(required_organ) + if(!has_required_infectious_organ(affected_mob, required_organ)) + cure() + return FALSE if(has_cure()) if(disease_flags & CHRONIC && SPT_PROB(cure_chance, seconds_per_tick)) - src.stage = 1 + update_stage(1) to_chat(affected_mob, span_notice("Your chronic illness is alleviated a little, though it can't be cured!")) return - else - if(SPT_PROB(cure_chance, seconds_per_tick)) - update_stage(max(stage - 1, 1)) - if(disease_flags & CURABLE && SPT_PROB(cure_chance, seconds_per_tick)) - cure() - return FALSE + if(SPT_PROB(cure_chance, seconds_per_tick)) + update_stage(max(stage - 1, 1)) + if(disease_flags & CURABLE && SPT_PROB(cure_chance, seconds_per_tick)) + cure() + return FALSE else if(SPT_PROB(stage_prob*slowdown, seconds_per_tick)) update_stage(min(stage + 1, max_stages)) @@ -105,7 +111,7 @@ if(!(spread_flags & DISEASE_SPREAD_AIRBORNE) && !force_spread) return - if(affected_mob.reagents.has_reagent(/datum/reagent/medicine/spaceacillin) || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10))) + if(HAS_TRAIT(affected_mob, TRAIT_VIRUS_RESISTANCE) || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10))) return var/spread_range = 2 @@ -133,6 +139,8 @@ /datum/disease/proc/cure(add_resistance = TRUE) + if(severity == DISEASE_SEVERITY_UNCURABLE) //aw man :( + return if(affected_mob) if(add_resistance && (disease_flags & CAN_RESIST)) LAZYOR(affected_mob.disease_resistances, GetDiseaseID()) @@ -147,8 +155,8 @@ /datum/disease/proc/Copy() //note that stage is not copied over - the copy starts over at stage 1 var/static/list/copy_vars = list("name", "visibility_flags", "disease_flags", "spread_flags", "form", "desc", "agent", "spread_text", - "cure_text", "max_stages", "stage_prob", "viable_mobtypes", "cures", "infectivity", "cure_chance", - "bypasses_immunity", "spreading_modifier", "severity", "required_organs", "needs_all_cures", "strain_data", + "cure_text", "max_stages", "stage_prob", "incubation_time", "viable_mobtypes", "cures", "infectivity", "cure_chance", + "required_organ", "bypasses_immunity", "spreading_modifier", "severity", "needs_all_cures", "strain_data", "infectable_biotypes", "process_dead") var/datum/disease/D = copy_type ? new copy_type() : new type() @@ -192,6 +200,21 @@ return FALSE +/// Checks if the mob has the required organ and it's not robotic or affected by inorganic biology +/datum/disease/proc/has_required_infectious_organ(mob/living/carbon/target, required_organ_slot) + if(!iscarbon(target)) + return FALSE + + var/obj/item/organ/target_organ = target.get_organ_slot(required_organ_slot) + if(!istype(target_organ)) + return FALSE + + // robotic organs are immune to disease unless 'inorganic biology' symptom is present + if(IS_ROBOTIC_ORGAN(target_organ) && !(infectable_biotypes & MOB_ROBOTIC)) + return FALSE + + return TRUE + //Use this to compare severities /proc/get_disease_severity_value(severity) switch(severity) diff --git a/code/datums/diseases/adrenal_crisis.dm b/code/datums/diseases/adrenal_crisis.dm index a0fc1fc10ddc9..cd9a2dd318010 100644 --- a/code/datums/diseases/adrenal_crisis.dm +++ b/code/datums/diseases/adrenal_crisis.dm @@ -10,7 +10,6 @@ spreading_modifier = 1 desc = "If left untreated the subject will suffer from lethargy, dizziness and periodic loss of conciousness." severity = DISEASE_SEVERITY_MEDIUM - disease_flags = CAN_CARRY|CAN_RESIST spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS spread_text = "Organ failure" visibility_flags = HIDDEN_PANDEMIC diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 99c3531d2ffaf..26a60c8e8a138 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -211,7 +211,7 @@ var/list/possible_symptoms = list() for(var/symp in SSdisease.list_symptoms) var/datum/symptom/S = new symp - if(S.naturally_occuring && S.level >= level_min && S.level <= level_max) + if(S.can_generate_randomly() && S.level >= level_min && S.level <= level_max) if(!HasSymptom(S)) possible_symptoms += S @@ -534,15 +534,25 @@ /datum/disease/advance/proc/totalTransmittable() return properties["transmittable"] +/** + * If the disease has an incubation time (such as event diseases) start the timer, let properties determine if there's no timer set. + */ +/datum/disease/advance/after_add() + . = ..() + + if(isnull(incubation_time)) + return + + if(incubation_time < world.time) + make_visible() + return + + addtimer(CALLBACK(src, PROC_REF(make_visible)), incubation_time - world.time) + + /** * Make virus visible to heath scanners */ /datum/disease/advance/proc/make_visible() visibility_flags &= ~HIDDEN_SCANNER - for(var/datum/disease/advance/virus in SSdisease.active_diseases) - if(!virus.id) - stack_trace("Advanced virus ID is empty or null!") - return - - if(virus.id == id) - virus.visibility_flags &= ~HIDDEN_SCANNER + affected_mob.med_hud_set_status() diff --git a/code/datums/diseases/advance/floor_diseases/carpellosis.dm b/code/datums/diseases/advance/floor_diseases/carpellosis.dm new file mode 100644 index 0000000000000..b5ef9175ed33f --- /dev/null +++ b/code/datums/diseases/advance/floor_diseases/carpellosis.dm @@ -0,0 +1,104 @@ +#define GNASHING_RANGE 7 + +/// Caused by dirty food. Makes you growl at people and bite them spontaneously. +/datum/disease/advance/carpellosis + name = "Carpellosis" + desc = "You have an angry space carp inside." + form = "Parasite" + agent = "Carp Ella" + cures = list(/datum/reagent/carpet) + viable_mobtypes = list(/mob/living/carbon/human) + spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS + severity = DISEASE_SEVERITY_MEDIUM + required_organ = ORGAN_SLOT_STOMACH + max_stages = 5 + /// The chance of Carp Ella to spawn on cure + var/ella_spawn_chance = 10 + /// Whether the max stage was achieved in disease lifecycle + var/max_stage_reached = FALSE + /// Carp ability gained on max stage + var/datum/action/cooldown/mob_cooldown/lesser_carp_rift/rift_ability + /// Whether the host has carp ability + var/ability_granted = FALSE + +/datum/disease/advance/carpellosis/New() + symptoms = list(new/datum/symptom/headache) + ..() + +/datum/disease/advance/carpellosis/generate_cure() + cures = list(pick(cures)) + var/datum/reagent/cure = GLOB.chemical_reagents_list[cures[1]] + cure_text = cure.name + +/datum/disease/advance/carpellosis/stage_act(seconds_per_tick, times_fired) + . = ..() + if(!.) + return + + + switch(stage) + if(2) + if(SPT_PROB(1, seconds_per_tick) && affected_mob.stat == CONSCIOUS) + to_chat(affected_mob, span_warning("You want to wag your tail...")) + affected_mob.emote("wag") + if(3) + if(SPT_PROB(1, seconds_per_tick) && affected_mob.stat == CONSCIOUS) + to_chat(affected_mob, span_warning("You suddenly feel like swimming in space...")) + else if(SPT_PROB(1, seconds_per_tick) && affected_mob.stat == CONSCIOUS) + affected_mob.visible_message("gnashes.", visible_message_flags = EMOTE_MESSAGE) + if(4) + if(SPT_PROB(1, seconds_per_tick) && affected_mob.stat == CONSCIOUS) + gnash_someone() + else if(SPT_PROB(1, seconds_per_tick) && affected_mob.stat == CONSCIOUS) + affected_mob.visible_message("gnashes.", visible_message_flags = EMOTE_MESSAGE) + if(5) + max_stage_reached = TRUE + grant_ability() + if(SPT_PROB(2, seconds_per_tick) && affected_mob.stat == CONSCIOUS) + gnash_someone() + else if(SPT_PROB(2, seconds_per_tick) && affected_mob.stat == CONSCIOUS) + affected_mob.visible_message("gnashes.", visible_message_flags = EMOTE_MESSAGE) + +/datum/disease/advance/carpellosis/Destroy() + if(ability_granted) + QDEL_NULL(rift_ability) + return ..() + +/datum/disease/advance/carpellosis/cure() + if(ability_granted) + rift_ability.Remove(affected_mob) + if(max_stage_reached && prob(ella_spawn_chance)) + to_chat(affected_mob, span_warning("Something comes out of you!")) + new /mob/living/basic/carp/ella(affected_mob.loc) + return ..() + +/datum/disease/advance/carpellosis/proc/grant_ability() + if(ability_granted) + return + rift_ability = new(src) + rift_ability.Grant(affected_mob) + rift_ability.HideFrom(affected_mob) + ability_granted = TRUE + +/datum/disease/advance/carpellosis/proc/find_nearby_human() + var/list/surroundings = orange(GNASHING_RANGE, affected_mob) + for(var/mob/human as anything in typecache_filter_list(surroundings, typecacheof(/mob/living/carbon/human))) + if(human.stat != DEAD && !(HAS_TRAIT(human, TRAIT_FAKEDEATH))) + return human + +/datum/disease/advance/carpellosis/proc/gnash_someone() + var/mob/living/carbon/human/target = find_nearby_human() + if(isnull(target) || !affected_mob.get_bodypart(BODY_ZONE_HEAD)) // Need mouth to gnash + to_chat(affected_mob, span_warning("You want to gnash at someone...")) + return + to_chat(affected_mob, span_warning("[target.name] makes you angry for some reason...")) + if(ability_granted && !affected_mob.Adjacent(target)) + rift_ability.Trigger(target = target) + affected_mob.face_atom(target) + if(affected_mob.Adjacent(target)) + affected_mob.set_combat_mode(TRUE) + target.attack_paw(affected_mob) + else + affected_mob.visible_message("gnashes at [target.name].", visible_message_flags = EMOTE_MESSAGE) + +#undef GNASHING_RANGE diff --git a/code/datums/diseases/advance/floor_diseases/gastritium.dm b/code/datums/diseases/advance/floor_diseases/gastritium.dm new file mode 100644 index 0000000000000..a7334db0fe75a --- /dev/null +++ b/code/datums/diseases/advance/floor_diseases/gastritium.dm @@ -0,0 +1,60 @@ +/// Caused by dirty food. Makes you burp out Tritium, sometimes burning hot! +/datum/disease/advance/gastritium + name = "Gastritium" + desc = "If left untreated, may manifest in severe Tritium heartburn." + form = "Infection" + agent = "Atmobacter Polyri" + cures = list(/datum/reagent/firefighting_foam) + viable_mobtypes = list(/mob/living/carbon/human) + spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS + severity = DISEASE_SEVERITY_HARMFUL + max_stages = 5 + required_organ = ORGAN_SLOT_STOMACH + /// The chance of burped out tritium to be hot during max stage + var/tritium_burp_hot_chance = 10 + +/datum/disease/advance/gastritium/New() + symptoms = list(new/datum/symptom/fever) + ..() + +/datum/disease/advance/gastritium/generate_cure() + cures = list(pick(cures)) + var/datum/reagent/cure = GLOB.chemical_reagents_list[cures[1]] + cure_text = cure.name + +/datum/disease/advance/gastritium/stage_act(seconds_per_tick, times_fired) + . = ..() + if(!.) + return + + switch(stage) + if(2) + if(SPT_PROB(1, seconds_per_tick)) + affected_mob.emote("burp") + if(3) + if(SPT_PROB(1, seconds_per_tick) && affected_mob.stat == CONSCIOUS) + to_chat(affected_mob, span_warning("Your stomach makes turbine noises...")) + else if(SPT_PROB(1, seconds_per_tick)) + affected_mob.emote("burp") + if(4) + if(SPT_PROB(1, seconds_per_tick) && affected_mob.stat == CONSCIOUS) + to_chat(affected_mob, span_warning("You're starting to feel like a burn chamber...")) + else if(SPT_PROB(1, seconds_per_tick)) + tritium_burp() + if(5) + if(SPT_PROB(1, seconds_per_tick) && affected_mob.stat == CONSCIOUS) + to_chat(affected_mob, span_warning("You feel like you're about to delam...")) + else if(SPT_PROB(1, seconds_per_tick)) + tritium_burp(hot_chance = TRUE) + +/datum/disease/advance/gastritium/proc/tritium_burp(hot_chance = FALSE) + var/datum/gas_mixture/burp = new + ADD_GAS(/datum/gas/tritium, burp.gases) + burp.gases[/datum/gas/tritium][MOLES] = MOLES_GAS_VISIBLE + burp.temperature = affected_mob.bodytemperature + if(hot_chance && prob(tritium_burp_hot_chance)) + burp.temperature = TRITIUM_MINIMUM_BURN_TEMPERATURE + if(affected_mob.stat == CONSCIOUS) + to_chat(affected_mob, span_warning("Your throat feels hot!")) + affected_mob.visible_message("burps out green gas.", visible_message_flags = EMOTE_MESSAGE) + affected_mob.loc.assume_air(burp) diff --git a/code/datums/diseases/advance/floor_diseases/nebula_nausea.dm b/code/datums/diseases/advance/floor_diseases/nebula_nausea.dm new file mode 100644 index 0000000000000..8dba0435b9bff --- /dev/null +++ b/code/datums/diseases/advance/floor_diseases/nebula_nausea.dm @@ -0,0 +1,40 @@ +/// Caused by dirty food. Makes you vomit stars. +/datum/disease/advance/nebula_nausea + name = "Nebula Nausea" + desc = "You can't contain the colorful beauty of the cosmos inside." + form = "Condition" + agent = "Stars" + cures = list(/datum/reagent/bluespace) + viable_mobtypes = list(/mob/living/carbon/human) + spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS + severity = DISEASE_SEVERITY_MEDIUM + required_organ = ORGAN_SLOT_STOMACH + max_stages = 5 + +/datum/disease/advance/nebula_nausea/New() + symptoms = list(new/datum/symptom/vomit/nebula) + ..() + +/datum/disease/advance/nebula_nausea/generate_cure() + cures = list(pick(cures)) + var/datum/reagent/cure = GLOB.chemical_reagents_list[cures[1]] + cure_text = cure.name + +/datum/disease/advance/nebula_nausea/stage_act(seconds_per_tick, times_fired) + . = ..() + if(!.) + return + + switch(stage) + if(2) + if(SPT_PROB(1, seconds_per_tick) && affected_mob.stat == CONSCIOUS) + to_chat(affected_mob, span_warning("The colorful beauty of the cosmos seems to have taken a toll on your equilibrium.")) + if(3) + if(SPT_PROB(1, seconds_per_tick) && affected_mob.stat == CONSCIOUS) + to_chat(affected_mob, span_warning("Your stomach swirls with colors unseen by human eyes.")) + if(4) + if(SPT_PROB(1, seconds_per_tick) && affected_mob.stat == CONSCIOUS) + to_chat(affected_mob, span_warning("It feels like you're floating through a maelstrom of celestial colors.")) + if(5) + if(SPT_PROB(1, seconds_per_tick) && affected_mob.stat == CONSCIOUS) + to_chat(affected_mob, span_warning("Your stomach has become a turbulent nebula, swirling with kaleidoscopic patterns.")) diff --git a/code/datums/diseases/advance/symptoms/beard.dm b/code/datums/diseases/advance/symptoms/beard.dm index 7247b379909c8..046744bf631ea 100644 --- a/code/datums/diseases/advance/symptoms/beard.dm +++ b/code/datums/diseases/advance/symptoms/beard.dm @@ -22,16 +22,15 @@ var/list/beard_order = list("Beard (Jensen)", "Beard (Full)", "Beard (Dwarf)", "Beard (Very Long)") -/datum/symptom/beard/Activate(datum/disease/advance/A) +/datum/symptom/beard/Activate(datum/disease/advance/disease) . = ..() if(!.) return - var/mob/living/M = A.affected_mob - if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/index = min(max(beard_order.Find(H.facial_hairstyle)+1, A.stage-1), beard_order.len) - if(index > 0 && H.facial_hairstyle != beard_order[index]) - to_chat(H, span_warning("Your chin itches.")) - H.facial_hairstyle = beard_order[index] - H.update_body_parts() + var/mob/living/manly_mob = disease.affected_mob + if(ishuman(manly_mob)) + var/mob/living/carbon/human/manly_man = manly_mob + var/index = min(max(beard_order.Find(manly_man.facial_hairstyle)+1, disease.stage-1), beard_order.len) + if(index > 0 && manly_man.facial_hairstyle != beard_order[index]) + to_chat(manly_man, span_warning("Your chin itches.")) + manly_man.set_facial_hairstyle(beard_order[index], update = TRUE) diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm index a677ae51e91e8..165b22cf189d4 100644 --- a/code/datums/diseases/advance/symptoms/choking.dm +++ b/code/datums/diseases/advance/symptoms/choking.dm @@ -20,6 +20,7 @@ base_message_chance = 15 symptom_delay_min = 10 symptom_delay_max = 30 + required_organ = ORGAN_SLOT_LUNGS threshold_descs = list( "Stage Speed 8" = "Causes choking more frequently.", "Stealth 4" = "The symptom remains hidden until active." @@ -35,26 +36,28 @@ if(A.totalStealth() >= 4) suppress_warning = TRUE -/datum/symptom/choking/Activate(datum/disease/advance/A) +/datum/symptom/choking/Activate(datum/disease/advance/advanced_disease) . = ..() if(!.) return - var/mob/living/M = A.affected_mob - switch(A.stage) + + var/mob/living/carbon/infected_mob = advanced_disease.affected_mob + + switch(advanced_disease.stage) if(1, 2) if(prob(base_message_chance) && !suppress_warning) - to_chat(M, span_warning("[pick("You're having difficulty breathing.", "Your breathing becomes heavy.")]")) + to_chat(infected_mob, span_warning("[pick("You're having difficulty breathing.", "Your breathing becomes heavy.")]")) if(3, 4) if(!suppress_warning) - to_chat(M, span_warning("[pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")]")) + to_chat(infected_mob, span_warning("[pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")]")) else - to_chat(M, span_warning("You feel very [pick("dizzy","woozy","faint")].")) //fake bloodloss messages - Choke_stage_3_4(M, A) - M.emote("gasp") + to_chat(infected_mob, span_warning("You feel very [pick("dizzy","woozy","faint")].")) //fake bloodloss messages + Choke_stage_3_4(infected_mob, advanced_disease) + infected_mob.emote("gasp") else - to_chat(M, span_userdanger("[pick("You're choking!", "You can't breathe!")]")) - Choke(M, A) - M.emote("gasp") + to_chat(infected_mob, span_userdanger("[pick("You're choking!", "You can't breathe!")]")) + Choke(infected_mob, advanced_disease) + infected_mob.emote("gasp") /datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A) M.adjustOxyLoss(rand(6,13)) @@ -82,7 +85,6 @@ Bonus */ /datum/symptom/asphyxiation - name = "Acute respiratory distress syndrome" desc = "The virus causes shrinking of the host's lungs, causing severe asphyxiation. May also lead to heart attacks." illness = "Iron Lungs" @@ -95,11 +97,12 @@ Bonus base_message_chance = 15 symptom_delay_min = 14 symptom_delay_max = 30 - var/paralysis = FALSE + required_organ = ORGAN_SLOT_LUNGS threshold_descs = list( "Stage Speed 8" = "Additionally synthesizes pancuronium and sodium thiopental inside the host.", "Transmission 8" = "Doubles the damage caused by the symptom." ) + var/paralysis = FALSE /datum/symptom/asphyxiation/Start(datum/disease/advance/A) diff --git a/code/datums/diseases/advance/symptoms/confusion.dm b/code/datums/diseases/advance/symptoms/confusion.dm index 2c6afe4b80d89..159eccfbd1ccd 100644 --- a/code/datums/diseases/advance/symptoms/confusion.dm +++ b/code/datums/diseases/advance/symptoms/confusion.dm @@ -20,7 +20,6 @@ symptom_delay_min = 10 symptom_delay_max = 30 threshold_descs = list( - "Stage Speed 6" = "Prevents any form of reading or writing.", "Resistance 6" = "Causes brain damage over time.", "Transmission 6" = "Increases confusion duration and strength.", "Stealth 4" = "The symptom remains hidden until active.", @@ -43,7 +42,6 @@ /datum/symptom/confusion/End(datum/disease/advance/advanced_disease) advanced_disease.affected_mob.remove_status_effect(/datum/status_effect/confusion) - REMOVE_TRAIT(advanced_disease.affected_mob, TRAIT_ILLITERATE, DISEASE_TRAIT) return ..() /datum/symptom/confusion/Activate(datum/disease/advance/advanced_disease) @@ -57,17 +55,8 @@ to_chat(infected_mob, span_warning("[pick("Your head hurts.", "Your mind blanks for a moment.")]")) else to_chat(infected_mob, span_userdanger("You can't think straight!")) - infected_mob.adjust_confusion(16 SECONDS * power) + infected_mob.adjust_confusion_up_to(16 SECONDS * power, 30 SECONDS) if(brain_damage) infected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * power, 80) infected_mob.updatehealth() return - -/datum/symptom/confusion/on_stage_change(datum/disease/advance/advanced_disease) - . = ..() - if(!.) - return FALSE - var/mob/living/carbon/infected_mob = advanced_disease.affected_mob - if(advanced_disease.stage >= 5 && causes_illiteracy) - ADD_TRAIT(infected_mob, TRAIT_ILLITERATE, DISEASE_TRAIT) - return TRUE diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/advance/symptoms/cough.dm index efef945a77202..4c2715668ba48 100644 --- a/code/datums/diseases/advance/symptoms/cough.dm +++ b/code/datums/diseases/advance/symptoms/cough.dm @@ -19,7 +19,7 @@ base_message_chance = 15 symptom_delay_min = 2 symptom_delay_max = 15 - var/spread_range = 1 + required_organ = ORGAN_SLOT_LUNGS threshold_descs = list( "Resistance 11" = "The host will drop small items when coughing.", "Resistance 15" = "Occasionally causes coughing fits that stun the host. The extra coughs do not spread the virus.", @@ -31,6 +31,7 @@ COOLDOWN_DECLARE(cough_cooldown) ///if FALSE, there is a percentage chance that the mob will emote coughing while cough_cooldown is on cooldown. If TRUE, won't emote again until after the off cooldown cough occurs. var/off_cooldown_coughed = FALSE + var/spread_range = 1 /datum/symptom/cough/Start(datum/disease/advance/active_disease) . = ..() diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/advance/symptoms/deafness.dm index 513783442605e..c93d94023df91 100644 --- a/code/datums/diseases/advance/symptoms/deafness.dm +++ b/code/datums/diseases/advance/symptoms/deafness.dm @@ -19,6 +19,7 @@ base_message_chance = 100 symptom_delay_min = 25 symptom_delay_max = 80 + required_organ = ORGAN_SLOT_EARS threshold_descs = list( "Resistance 9" = "Causes permanent deafness, instead of intermittent.", "Stealth 4" = "The symptom remains hidden until active.", @@ -38,15 +39,15 @@ REMOVE_TRAIT(advanced_disease.affected_mob, TRAIT_DEAF, DISEASE_TRAIT) return ..() -/datum/symptom/deafness/Activate(datum/disease/advance/A) +/datum/symptom/deafness/Activate(datum/disease/advance/advanced_disease) . = ..() if(!.) return - var/mob/living/carbon/infected_mob = A.affected_mob + + var/mob/living/carbon/infected_mob = advanced_disease.affected_mob var/obj/item/organ/internal/ears/ears = infected_mob.get_organ_slot(ORGAN_SLOT_EARS) - if(!ears) - return //cutting off your ears to cure the deafness: the ultimate own - switch(A.stage) + + switch(advanced_disease.stage) if(3, 4) if(prob(base_message_chance) && !suppress_warning) to_chat(infected_mob, span_warning("[pick("You hear a ringing in your ear.", "Your ears pop.")]")) diff --git a/code/datums/diseases/advance/symptoms/dizzy.dm b/code/datums/diseases/advance/symptoms/dizzy.dm index 7e21f3f389f64..5612f0e31a919 100644 --- a/code/datums/diseases/advance/symptoms/dizzy.dm +++ b/code/datums/diseases/advance/symptoms/dizzy.dm @@ -8,7 +8,6 @@ */ /datum/symptom/dizzy // Not the egg - name = "Dizziness" desc = "The virus causes inflammation of the vestibular system, leading to bouts of dizziness." illness = "Motion Sickness" diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index 48d20c049186d..1e02e8d24e3bd 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -11,7 +11,6 @@ symptom_delay_max = 1 var/passive_message = "" //random message to infected but not actively healing people - /datum/symptom/heal/Activate(datum/disease/advance/A) . = ..() if(!.) @@ -75,8 +74,8 @@ power = 2 /datum/symptom/heal/starlight/proc/CanTileHealDirectional(turf/turf_to_check, direction) - if(direction == ZTRAIT_UP) - turf_to_check = turf_to_check.above() + if(direction == UP) + turf_to_check = GET_TURF_ABOVE(turf_to_check) if(!turf_to_check) return STARLIGHT_CANNOT_HEAL var/area/area_to_check = get_area(turf_to_check) @@ -86,7 +85,7 @@ // while space covers normal space and those caused by explosions, // if there is a floor tile when checking above, that means // a roof exists so the outdoors should only work downwards - if(isspaceturf(turf_to_check) || (area_to_check.outdoors && direction == ZTRAIT_DOWN)) + if(isspaceturf(turf_to_check) || (area_to_check.outdoors && direction == DOWN)) if (levels_of_glass) return STARLIGHT_CAN_HEAL_WITH_PENALTY // Glass gives a penalty. return STARLIGHT_CAN_HEAL // No glass = can heal fully. @@ -98,10 +97,10 @@ // Our turf is transparent OR openspace - we can check higher or lower z-levels if(istransparentturf(turf_to_check) || istype(turf_to_check, /turf/open/openspace)) // Check above or below us - if(direction == ZTRAIT_UP) - turf_to_check = turf_to_check.above() + if(direction == UP) + turf_to_check = GET_TURF_ABOVE(turf_to_check) else - turf_to_check = turf_to_check.below() + turf_to_check = GET_TURF_BELOW(turf_to_check) // If we found a turf above or below us, // then we can rerun the loop on the newly found turf / area @@ -114,7 +113,7 @@ // Checking below, we assume that space is below us (as we're standing on station) // Checking above, we check that the area is "outdoors" before assuming if it is space or not. else - if(direction == ZTRAIT_DOWN || (direction == ZTRAIT_UP && area_to_check.outdoors)) + if(direction == DOWN || (direction == UP && area_to_check.outdoors)) if (levels_of_glass) return STARLIGHT_CAN_HEAL_WITH_PENALTY return STARLIGHT_CAN_HEAL @@ -122,12 +121,12 @@ return STARLIGHT_CANNOT_HEAL // Hit a non-space, Non-transparent turf - no healsies /datum/symptom/heal/starlight/proc/CanTileHeal(turf/original_turf, satisfied_with_penalty) - var/current_heal_level = CanTileHealDirectional(original_turf, ZTRAIT_DOWN) + var/current_heal_level = CanTileHealDirectional(original_turf, DOWN) if(current_heal_level == STARLIGHT_CAN_HEAL) return current_heal_level if(current_heal_level && satisfied_with_penalty) // do not care if there is a healing penalty or no return current_heal_level - var/heal_level_from_above = CanTileHealDirectional(original_turf, ZTRAIT_UP) + var/heal_level_from_above = CanTileHealDirectional(original_turf, UP) if(heal_level_from_above > current_heal_level) return heal_level_from_above else @@ -162,8 +161,8 @@ if(!parts.len) return - for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len, BODYTYPE_ORGANIC)) + for(var/obj/item/bodypart/bodypart in parts) + if(bodypart.heal_damage(heal_amt/parts.len, heal_amt/parts.len, required_bodytype = BODYTYPE_ORGANIC)) M.update_damage_overlays() return 1 @@ -181,17 +180,18 @@ */ /datum/symptom/heal/chem name = "Toxolysis" + desc = "The virus rapidly breaks down any foreign chemicals in the bloodstream." stealth = 0 resistance = -2 stage_speed = 2 transmittable = -2 level = 7 - var/food_conversion = FALSE - desc = "The virus rapidly breaks down any foreign chemicals in the bloodstream." + required_organ = ORGAN_SLOT_HEART threshold_descs = list( "Resistance 7" = "Increases chem removal speed.", "Stage Speed 6" = "Consumed chemicals nourish the host.", ) + var/food_conversion = FALSE /datum/symptom/heal/chem/Start(datum/disease/advance/A) . = ..() @@ -222,19 +222,20 @@ */ /datum/symptom/heal/metabolism name = "Metabolic Boost" + desc = "The virus causes the host's metabolism to accelerate rapidly, making them process chemicals twice as fast,\ + but also causing increased hunger." stealth = -1 resistance = -2 stage_speed = 2 transmittable = 1 level = 7 - var/triple_metabolism = FALSE - var/reduced_hunger = FALSE - desc = "The virus causes the host's metabolism to accelerate rapidly, making them process chemicals twice as fast,\ - but also causing increased hunger." + required_organ = ORGAN_SLOT_STOMACH threshold_descs = list( "Stealth 3" = "Reduces hunger rate.", "Stage Speed 10" = "Chemical metabolization is tripled instead of doubled.", ) + var/triple_metabolism = FALSE + var/reduced_hunger = FALSE /datum/symptom/heal/metabolism/Start(datum/disease/advance/A) . = ..() @@ -245,17 +246,16 @@ if(A.totalStealth() >= 3) reduced_hunger = TRUE -/datum/symptom/heal/metabolism/Heal(mob/living/carbon/C, datum/disease/advance/A, actual_power) - if(!istype(C)) - return +/datum/symptom/heal/metabolism/Heal(mob/living/carbon/infected_mob, datum/disease/advance/A, actual_power) var/metabolic_boost = triple_metabolism ? 2 : 1 - C.reagents.metabolize(C, metabolic_boost * SSMOBS_DT, 0, can_overdose=TRUE) //this works even without a liver; it's intentional since the virus is metabolizing by itself - C.overeatduration = max(C.overeatduration - 4 SECONDS, 0) + infected_mob.reagents.metabolize(infected_mob, metabolic_boost * SSMOBS_DT, 0, can_overdose=TRUE) //this works even without a liver; it's intentional since the virus is metabolizing by itself + infected_mob.overeatduration = max(infected_mob.overeatduration - 4 SECONDS, 0) var/lost_nutrition = 9 - (reduced_hunger * 5) - C.adjust_nutrition(-lost_nutrition * HUNGER_FACTOR) //Hunger depletes at 10x the normal speed + infected_mob.adjust_nutrition(-lost_nutrition * HUNGER_FACTOR) //Hunger depletes at 10x the normal speed if(prob(2)) - to_chat(C, span_notice("You feel an odd gurgle in your stomach, as if it was working much faster than normal.")) - return 1 + to_chat(infected_mob, span_notice("You feel an odd gurgle in your stomach, as if it was working much faster than normal.")) + return TRUE + /*Nocturnal Regeneration * Increases stealth * Slightly reduces resistance @@ -303,8 +303,8 @@ if(prob(5)) 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 + for(var/obj/item/bodypart/bodypart in parts) + if(bodypart.heal_damage(heal_amt/parts.len, heal_amt/parts.len * 0.5, required_bodytype = BODYTYPE_ORGANIC)) //more effective on brute M.update_damage_overlays() return 1 @@ -312,6 +312,7 @@ if(M.getBruteLoss() || M.getFireLoss()) return TRUE return FALSE + /*Regen Coma * No effect on stealth * Increases resistance @@ -384,10 +385,11 @@ /datum/symptom/heal/coma/proc/coma(mob/living/M) + if(QDELETED(M) || M.stat == DEAD) + return M.fakedeath("regenerative_coma", !deathgasp) addtimer(CALLBACK(src, PROC_REF(uncoma), M), 300) - /datum/symptom/heal/coma/proc/uncoma(mob/living/M) if(QDELETED(M) || !active_coma) return @@ -403,8 +405,8 @@ if(!parts.len) return - for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len, BODYTYPE_ORGANIC)) + for(var/obj/item/bodypart/bodypart in parts) + if(bodypart.heal_damage(heal_amt/parts.len, heal_amt/parts.len, required_bodytype = BODYTYPE_ORGANIC)) M.update_damage_overlays() if(active_coma && M.getBruteLoss() + M.getFireLoss() == 0) @@ -426,11 +428,12 @@ transmittable = 1 level = 6 passive_message = span_notice("Your skin feels oddly dry...") - var/absorption_coeff = 1 + required_organ = ORGAN_SLOT_LIVER threshold_descs = list( "Resistance 5" = "Water is consumed at a much slower rate.", "Stage Speed 7" = "Increases healing speed.", ) + var/absorption_coeff = 1 /datum/symptom/heal/water/Start(datum/disease/advance/A) . = ..() @@ -441,17 +444,18 @@ if(A.totalResistance() >= 5) absorption_coeff = 0.25 -/datum/symptom/heal/water/CanHeal(datum/disease/advance/A) +/datum/symptom/heal/water/CanHeal(datum/disease/advance/advanced_disease) . = 0 - var/mob/living/M = A.affected_mob - if(M.fire_stacks < 0) - M.adjust_fire_stacks(min(absorption_coeff, -M.fire_stacks)) + var/mob/living/carbon/infected_mob = advanced_disease.affected_mob + + if(infected_mob.fire_stacks < 0) + infected_mob.adjust_fire_stacks(min(absorption_coeff, -infected_mob.fire_stacks)) . += power - if(M.reagents.has_reagent(/datum/reagent/water/holywater, needs_metabolizing = FALSE)) - M.reagents.remove_reagent(/datum/reagent/water/holywater, 0.5 * absorption_coeff) + if(infected_mob.reagents.has_reagent(/datum/reagent/water/holywater, needs_metabolizing = FALSE)) + infected_mob.reagents.remove_reagent(/datum/reagent/water/holywater, 0.5 * absorption_coeff) . += power * 0.75 - else if(M.reagents.has_reagent(/datum/reagent/water, needs_metabolizing = FALSE)) - M.reagents.remove_reagent(/datum/reagent/water, 0.5 * absorption_coeff) + else if(infected_mob.reagents.has_reagent(/datum/reagent/water, needs_metabolizing = FALSE)) + infected_mob.reagents.remove_reagent(/datum/reagent/water, 0.5 * absorption_coeff) . += power * 0.5 /datum/symptom/heal/water/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power) @@ -465,15 +469,16 @@ if(prob(5)) 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)) + for(var/obj/item/bodypart/bodypart in parts) + if(bodypart.heal_damage(heal_amt/parts.len * 0.5, heal_amt/parts.len, required_bodytype = BODYTYPE_ORGANIC)) M.update_damage_overlays() return 1 -/datum/symptom/heal/water/passive_message_condition(mob/living/M) - if(M.getBruteLoss() || M.getFireLoss()) +/datum/symptom/heal/water/passive_message_condition(mob/living/carbon/infected_mob) + if(infected_mob.getBruteLoss() || infected_mob.getFireLoss()) return TRUE + return FALSE /// Determines the rate at which Plasma Fixation heals based on the amount of plasma in the air @@ -498,11 +503,12 @@ transmittable = -2 level = 8 passive_message = span_notice("You feel an odd attraction to plasma.") - var/temp_rate = 1 + required_organ = ORGAN_SLOT_LIVER threshold_descs = list( "Transmission 6" = "Increases temperature adjustment rate.", "Stage Speed 7" = "Increases healing speed.", ) + var/temp_rate = 1 /datum/symptom/heal/plasma/Start(datum/disease/advance/A) . = ..() @@ -534,7 +540,7 @@ // Check internals breath, environmental plasma, and plasma in bloodstream to determine the heal power /datum/symptom/heal/plasma/CanHeal(datum/disease/advance/advanced_disease) - var/mob/living/diseased_mob = advanced_disease.affected_mob + var/mob/living/carbon/infected_mob = advanced_disease.affected_mob var/datum/gas_mixture/environment var/list/gases @@ -544,24 +550,23 @@ /// the amount of mols in a breath is significantly lower than in the environment so we are just going to use the tank's /// distribution pressure as an abstraction rather than calculate it using the ideal gas equation. /// balanced around a tank set to 4kpa = about 0.2 healing power. maxes out at 0.75 healing power, or 15kpa. - if(iscarbon(diseased_mob)) - var/mob/living/carbon/breather = diseased_mob - var/obj/item/tank/internals/internals_tank = breather.internal - if(internals_tank) - var/datum/gas_mixture/tank_contents = internals_tank.return_air() - if(tank_contents && round(tank_contents.return_pressure())) // make sure the tank is not empty or 0 pressure - if(tank_contents.gases[/datum/gas/plasma]) - // higher tank distribution pressure leads to more healing, but once you get to about 15kpa you reach the max - . += power * min(MAX_HEAL_COEFFICIENT_INTERNALS, internals_tank.distribute_pressure * HEALING_PER_BREATH_PRESSURE) - // Check environment - if(diseased_mob.loc) - environment = diseased_mob.loc.return_air() - if(environment) - gases = environment.gases - if(gases[/datum/gas/plasma]) - . += power * min(MAX_HEAL_COEFFICIENT_INTERNALS, gases[/datum/gas/plasma][MOLES] * HEALING_PER_MOL) + var/obj/item/tank/internals/internals_tank = infected_mob.internal + if(internals_tank) + var/datum/gas_mixture/tank_contents = internals_tank.return_air() + if(tank_contents && round(tank_contents.return_pressure())) // make sure the tank is not empty or 0 pressure + if(tank_contents.gases[/datum/gas/plasma]) + // higher tank distribution pressure leads to more healing, but once you get to about 15kpa you reach the max + . += power * min(MAX_HEAL_COEFFICIENT_INTERNALS, internals_tank.distribute_pressure * HEALING_PER_BREATH_PRESSURE) + else // Check environment + if(infected_mob.loc) + environment = infected_mob.loc.return_air() + if(environment) + gases = environment.gases + if(gases[/datum/gas/plasma]) + . += power * min(MAX_HEAL_COEFFICIENT_INTERNALS, gases[/datum/gas/plasma][MOLES] * HEALING_PER_MOL) + // Check for reagents in bloodstream - if(diseased_mob.reagents.has_reagent(/datum/reagent/toxin/plasma, needs_metabolizing = TRUE)) + if(infected_mob.reagents.has_reagent(/datum/reagent/toxin/plasma, needs_metabolizing = TRUE)) . += power * MAX_HEAL_COEFFICIENT_BLOODSTREAM //Determines how much the symptom heals if injected or ingested /datum/symptom/heal/plasma/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power) @@ -587,8 +592,8 @@ return 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)) + for(var/obj/item/bodypart/bodypart in parts) + if(bodypart.heal_damage(heal_amt/parts.len, heal_amt/parts.len, required_bodytype = BODYTYPE_ORGANIC)) M.update_damage_overlays() return 1 @@ -632,10 +637,13 @@ /datum/symptom/heal/radiation/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power) var/heal_amt = actual_power + var/need_mob_update = FALSE if(cellular_damage) - M.adjustCloneLoss(-heal_amt * 0.5) + need_mob_update += M.adjustCloneLoss(-heal_amt * 0.5, updating_health = FALSE) - M.adjustToxLoss(-(2 * heal_amt)) + need_mob_update += M.adjustToxLoss(-(2 * heal_amt), updating_health = FALSE) + if(need_mob_update) + M.updatehealth() var/list/parts = M.get_damaged_bodyparts(1,1, BODYTYPE_ORGANIC) @@ -645,7 +653,10 @@ if(prob(4)) 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)) + for(var/obj/item/bodypart/bodypart in parts) + if(bodypart.heal_damage(heal_amt/parts.len, heal_amt/parts.len, required_bodytype = BODYTYPE_ORGANIC)) M.update_damage_overlays() return 1 + +/datum/symptom/heal/radiation/can_generate_randomly() + return ..() && !HAS_TRAIT(SSstation, STATION_TRAIT_RADIOACTIVE_NEBULA) //because people can never really suffer enough diff --git a/code/datums/diseases/advance/symptoms/itching.dm b/code/datums/diseases/advance/symptoms/itching.dm index 0f70a7c71975c..cb468a132cc21 100644 --- a/code/datums/diseases/advance/symptoms/itching.dm +++ b/code/datums/diseases/advance/symptoms/itching.dm @@ -21,7 +21,7 @@ var/scratch = FALSE threshold_descs = list( "Transmission 6" = "Increases frequency of itching.", - "Stage Speed 7" = "The host will scrath itself when itching, causing superficial damage.", + "Stage Speed 7" = "The host will scratch itself when itching, causing superficial damage.", ) ///emote cooldowns COOLDOWN_DECLARE(itching_cooldown) diff --git a/code/datums/diseases/advance/symptoms/oxygen.dm b/code/datums/diseases/advance/symptoms/oxygen.dm index 630f2e2d7fbb2..fad70aff23f72 100644 --- a/code/datums/diseases/advance/symptoms/oxygen.dm +++ b/code/datums/diseases/advance/symptoms/oxygen.dm @@ -17,10 +17,11 @@ base_message_chance = 5 symptom_delay_min = 1 symptom_delay_max = 1 - var/regenerate_blood = FALSE + required_organ = ORGAN_SLOT_LUNGS threshold_descs = list( "Resistance 8" = "Additionally regenerates lost blood." ) + var/regenerate_blood = FALSE /datum/symptom/oxygen/Start(datum/disease/advance/A) . = ..() @@ -29,20 +30,21 @@ if(A.totalResistance() >= 8) //blood regeneration regenerate_blood = TRUE -/datum/symptom/oxygen/Activate(datum/disease/advance/A) +/datum/symptom/oxygen/Activate(datum/disease/advance/advanced_disease) . = ..() if(!.) return - var/mob/living/carbon/M = A.affected_mob - switch(A.stage) + + var/mob/living/carbon/infected_mob = advanced_disease.affected_mob + switch(advanced_disease.stage) if(4, 5) - M.adjustOxyLoss(-7, 0) - M.losebreath = max(0, M.losebreath - 4) - if(regenerate_blood && M.blood_volume < BLOOD_VOLUME_NORMAL) - M.blood_volume += 1 + infected_mob.losebreath = max(0, infected_mob.losebreath - 4) + infected_mob.adjustOxyLoss(-7) + if(regenerate_blood && infected_mob.blood_volume < BLOOD_VOLUME_NORMAL) + infected_mob.blood_volume += 1 else if(prob(base_message_chance)) - to_chat(M, span_notice("[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]")) + to_chat(infected_mob, span_notice("[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]")) return /datum/symptom/oxygen/on_stage_change(datum/disease/advance/A) diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm index 6edc24eeeef76..fa9f86abbaa3b 100644 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -87,34 +87,34 @@ symptom_delay_min = 1 symptom_delay_max = 1 -/datum/symptom/sensory_restoration/Activate(datum/disease/advance/source_disease) +/datum/symptom/sensory_restoration/Activate(datum/disease/advance/advanced_disease) . = ..() if(!.) return - var/mob/living/carbon/ill_mob = source_disease.affected_mob - switch(source_disease.stage) + var/mob/living/carbon/infected_mob = advanced_disease.affected_mob + switch(advanced_disease.stage) if(4, 5) - var/obj/item/organ/internal/ears/ears = ill_mob.get_organ_slot(ORGAN_SLOT_EARS) - if(ears) + if(advanced_disease.has_required_infectious_organ(infected_mob, ORGAN_SLOT_EARS)) + var/obj/item/organ/internal/ears/ears = infected_mob.get_organ_slot(ORGAN_SLOT_EARS) ears.adjustEarDamage(-4, -4) - ill_mob.adjust_temp_blindness(-4 SECONDS) - ill_mob.adjust_eye_blur(-4 SECONDS) - - var/obj/item/organ/internal/eyes/eyes = ill_mob.get_organ_slot(ORGAN_SLOT_EYES) - if(!eyes) // only dealing with eye stuff from here on out + if(!advanced_disease.has_required_infectious_organ(infected_mob, ORGAN_SLOT_EYES)) return + var/obj/item/organ/internal/eyes/eyes = infected_mob.get_organ_slot(ORGAN_SLOT_EYES) + infected_mob.adjust_temp_blindness(-4 SECONDS) + infected_mob.adjust_eye_blur(-4 SECONDS) + eyes.apply_organ_damage(-2) if(prob(20)) - if(ill_mob.is_blind_from(EYE_DAMAGE)) - to_chat(ill_mob, span_warning("Your vision slowly returns...")) - ill_mob.adjust_eye_blur(20 SECONDS) + if(infected_mob.is_blind_from(EYE_DAMAGE)) + to_chat(infected_mob, span_warning("Your vision slowly returns...")) + infected_mob.adjust_eye_blur(20 SECONDS) - else if(ill_mob.is_nearsighted_from(EYE_DAMAGE)) - to_chat(ill_mob, span_warning("The blackness in your peripheral vision begins to fade.")) - ill_mob.adjust_eye_blur(5 SECONDS) + else if(infected_mob.is_nearsighted_from(EYE_DAMAGE)) + to_chat(infected_mob, span_warning("The blackness in your peripheral vision begins to fade.")) + infected_mob.adjust_eye_blur(5 SECONDS) else if(prob(base_message_chance)) - to_chat(ill_mob, span_notice("[pick("Your eyes feel great.","You feel like your eyes can focus more clearly.", "You don't feel the need to blink.","Your ears feel great.","Your hearing feels more acute.")]")) + to_chat(infected_mob, span_notice("[pick("Your eyes feel great.","You feel like your eyes can focus more clearly.", "You don't feel the need to blink.","Your ears feel great.","Your hearing feels more acute.")]")) diff --git a/code/datums/diseases/advance/symptoms/shedding.dm b/code/datums/diseases/advance/symptoms/shedding.dm index 13d78204a7b22..f0f3136487418 100644 --- a/code/datums/diseases/advance/symptoms/shedding.dm +++ b/code/datums/diseases/advance/symptoms/shedding.dm @@ -20,30 +20,33 @@ symptom_delay_min = 45 symptom_delay_max = 90 -/datum/symptom/shedding/Activate(datum/disease/advance/A) +/datum/symptom/shedding/Activate(datum/disease/advance/disease) . = ..() if(!.) return - var/mob/living/M = A.affected_mob + var/mob/living/affected_living = disease.affected_mob if(prob(base_message_chance)) - to_chat(M, span_warning("[pick("Your scalp itches.", "Your skin feels flaky.")]")) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - switch(A.stage) + to_chat(affected_living, span_warning("[pick("Your scalp itches.", "Your skin feels flaky.")]")) + if(ishuman(affected_living)) + var/mob/living/carbon/human/affected_human = affected_living + switch(disease.stage) if(3, 4) - if(!(H.hairstyle == "Bald") && !(H.hairstyle == "Balding Hair")) - to_chat(H, span_warning("Your hair starts to fall out in clumps...")) - addtimer(CALLBACK(src, PROC_REF(Shed), H, FALSE), 50) + if((affected_human.hairstyle == "Bald") && (affected_human.hairstyle != "Balding Hair")) + to_chat(affected_human, span_warning("Your hair starts to fall out in clumps...")) + addtimer(CALLBACK(src, PROC_REF(baldify), affected_human, FALSE), 5 SECONDS) if(5) - if(!(H.facial_hairstyle == "Shaved") || !(H.hairstyle == "Bald")) - to_chat(H, span_warning("Your hair starts to fall out in clumps...")) - addtimer(CALLBACK(src, PROC_REF(Shed), H, TRUE), 50) + if((affected_human.facial_hairstyle != "Shaved") || (affected_human.hairstyle != "Bald")) + if(affected_human.hairstyle == "Balding Hair") + to_chat(affected_human, span_warning("The little hair you have left starts to fall out in clumps...")) + else + to_chat(affected_human, span_warning("Your hair starts to fall out in clumps...")) + addtimer(CALLBACK(src, PROC_REF(baldify), affected_human, TRUE), 3 SECONDS) -/datum/symptom/shedding/proc/Shed(mob/living/carbon/human/H, fullbald) - if(fullbald) - H.facial_hairstyle = "Shaved" - H.hairstyle = "Bald" +/datum/symptom/shedding/proc/baldify(mob/living/carbon/human/baldie, fully_bald) + if(fully_bald) + baldie.set_facial_hairstyle("Shaved", update = FALSE) + baldie.set_hairstyle("Bald", update = FALSE) else - H.hairstyle = "Balding Hair" - H.update_body_parts() + baldie.set_hairstyle("Balding Hair", update = FALSE) + baldie.update_body_parts() diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm index 85f5c2d58b725..14a087da1238f 100644 --- a/code/datums/diseases/advance/symptoms/sneeze.dm +++ b/code/datums/diseases/advance/symptoms/sneeze.dm @@ -18,8 +18,7 @@ severity = 1 symptom_delay_min = 5 symptom_delay_max = 35 - var/spread_range = 4 - var/cartoon_sneezing = FALSE //ah, ah, AH, AH-CHOO!! + required_organ = ORGAN_SLOT_LUNGS threshold_descs = list( "Transmission 9" = "Increases sneezing range, spreading the virus over 6 meter cone instead of over a 4 meter cone.", "Stealth 4" = "The symptom remains hidden until active.", @@ -27,6 +26,8 @@ ) ///Emote cooldowns COOLDOWN_DECLARE(sneeze_cooldown) + var/spread_range = 4 + var/cartoon_sneezing = FALSE //ah, ah, AH, AH-CHOO!! ///if FALSE, there is a percentage chance that the mob will emote sneezing while sneeze_cooldown is on cooldown. If TRUE, won't emote again until after the off cooldown sneeze occurs. var/off_cooldown_sneezed = FALSE @@ -59,7 +60,7 @@ affected_mob.emote("sneeze") to_chat(affected_mob, span_userdanger("You are launched violently backwards by an all-mighty sneeze!")) var/sneeze_distance = rand(2,4) //twice as far as a normal baseball bat strike will fling you - var/turf/target = get_ranged_target_turf(affected_mob, turn(affected_mob.dir, 180), sneeze_distance) + var/turf/target = get_ranged_target_turf(affected_mob, REVERSE_DIR(affected_mob.dir), sneeze_distance) affected_mob.throw_at(target, sneeze_distance, rand(1,4)) //with the wounds update, sneezing at 7 speed was causing peoples bones to spontaneously explode, turning cartoonish sneezing into a nightmarishly lethal GBS 2.0 outbreak else if(COOLDOWN_FINISHED(src, sneeze_cooldown) || !COOLDOWN_FINISHED(src, sneeze_cooldown) && prob(60) && !off_cooldown_sneezed) affected_mob.emote("sneeze") diff --git a/code/datums/diseases/advance/symptoms/symptoms.dm b/code/datums/diseases/advance/symptoms/symptoms.dm index ceda0f9c1d345..28ba45f8de4e0 100644 --- a/code/datums/diseases/advance/symptoms/symptoms.dm +++ b/code/datums/diseases/advance/symptoms/symptoms.dm @@ -37,6 +37,8 @@ var/list/thresholds ///If this symptom can appear from /datum/disease/advance/GenerateSymptoms() var/naturally_occuring = TRUE + ///If the symptom requires an organ for the effects to function, robotic organs are immune to disease unless inorganic biology symptom is present + var/required_organ /datum/symptom/New() var/list/S = SSdisease.list_symptoms @@ -58,9 +60,13 @@ return FALSE return TRUE -/datum/symptom/proc/Activate(datum/disease/advance/A) +/datum/symptom/proc/Activate(datum/disease/advance/advanced_disease) if(neutered) return FALSE + if(required_organ) + if(!advanced_disease.has_required_infectious_organ(advanced_disease.affected_mob, required_organ)) + return FALSE + if(world.time < next_activation) return FALSE else @@ -108,3 +114,7 @@ data["neutered"] = neutered data["threshold_desc"] = threshold_descs return data + +/// Check if we can generate randomly +/datum/symptom/proc/can_generate_randomly() + return naturally_occuring diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm index f6cbddbd66804..e53faf5bac51e 100644 --- a/code/datums/diseases/advance/symptoms/vision.dm +++ b/code/datums/diseases/advance/symptoms/vision.dm @@ -19,11 +19,11 @@ base_message_chance = 50 symptom_delay_min = 25 symptom_delay_max = 80 + required_organ = ORGAN_SLOT_EYES threshold_descs = list( "Resistance 12" = "Weakens extraocular muscles, eventually leading to complete detachment of the eyes.", "Stealth 4" = "The symptom remains hidden until active.", ) - /// At max stage: If FALSE, cause blindness. If TRUE, cause their eyes to fall out. var/remove_eyes = FALSE @@ -40,41 +40,40 @@ . = ..() if(!.) return - var/mob/living/carbon/ill_mob = source_disease.affected_mob - var/obj/item/organ/internal/eyes/eyes = ill_mob.get_organ_slot(ORGAN_SLOT_EYES) - if(!eyes) - return // can't do much + + var/mob/living/carbon/infected_mob = source_disease.affected_mob + var/obj/item/organ/internal/eyes/eyes = infected_mob.get_organ_slot(ORGAN_SLOT_EYES) switch(source_disease.stage) if(1, 2) if(prob(base_message_chance) && !suppress_warning) - to_chat(ill_mob, span_warning("Your eyes itch.")) + to_chat(infected_mob, span_warning("Your eyes itch.")) if(3, 4) - to_chat(ill_mob, span_boldwarning("Your eyes burn!")) - ill_mob.set_eye_blur_if_lower(20 SECONDS) + to_chat(infected_mob, span_boldwarning("Your eyes burn!")) + infected_mob.set_eye_blur_if_lower(20 SECONDS) eyes.apply_organ_damage(1) else - ill_mob.set_eye_blur_if_lower(40 SECONDS) + infected_mob.set_eye_blur_if_lower(40 SECONDS) eyes.apply_organ_damage(5) // Applies nearsighted at minimum - if(!ill_mob.is_nearsighted_from(EYE_DAMAGE) && eyes.damage <= eyes.low_threshold) + if(!infected_mob.is_nearsighted_from(EYE_DAMAGE) && eyes.damage <= eyes.low_threshold) eyes.set_organ_damage(eyes.low_threshold) if(prob(eyes.damage - eyes.low_threshold + 1)) if(remove_eyes) - ill_mob.visible_message( - span_warning("[ill_mob]'s eyes fall out of their sockets!"), + infected_mob.visible_message( + span_warning("[infected_mob]'s eyes fall out of their sockets!"), span_userdanger("Your eyes fall out of their sockets!"), ) - eyes.Remove(ill_mob) - eyes.forceMove(get_turf(ill_mob)) + eyes.Remove(infected_mob) + eyes.forceMove(get_turf(infected_mob)) - else if(!ill_mob.is_blind_from(EYE_DAMAGE)) - to_chat(ill_mob, span_userdanger("You go blind!")) + else if(!infected_mob.is_blind_from(EYE_DAMAGE)) + to_chat(infected_mob, span_userdanger("You go blind!")) eyes.apply_organ_damage(eyes.maxHealth) else - to_chat(ill_mob, span_userdanger("Your eyes burn horrifically!")) + to_chat(infected_mob, span_userdanger("Your eyes burn horrifically!")) diff --git a/code/datums/diseases/advance/symptoms/voice_change.dm b/code/datums/diseases/advance/symptoms/voice_change.dm index 2f1a65b1a718c..255c2a3f3a7f5 100644 --- a/code/datums/diseases/advance/symptoms/voice_change.dm +++ b/code/datums/diseases/advance/symptoms/voice_change.dm @@ -20,13 +20,14 @@ base_message_chance = 100 symptom_delay_min = 60 symptom_delay_max = 120 - var/scramble_language = FALSE - var/datum/language/current_language + required_organ = ORGAN_SLOT_TONGUE threshold_descs = list( "Transmission 14" = "The host's language center of the brain is damaged, leading to complete inability to speak or understand any language.", "Stage Speed 7" = "Changes voice more often.", "Stealth 3" = "The symptom remains hidden until active." ) + var/scramble_language = FALSE + var/datum/language/current_language /datum/symptom/voice_change/Start(datum/disease/advance/A) . = ..() @@ -57,7 +58,7 @@ if(scramble_language && !current_language) // Last part prevents rerolling language with small amounts of cure. current_language = pick(subtypesof(/datum/language) - /datum/language/common) H.add_blocked_language(subtypesof(/datum/language) - current_language, LANGUAGE_VOICECHANGE) - H.grant_language(current_language, TRUE, TRUE, LANGUAGE_VOICECHANGE) + H.grant_language(current_language, source = LANGUAGE_VOICECHANGE) /datum/symptom/voice_change/End(datum/disease/advance/A) ..() diff --git a/code/datums/diseases/advance/symptoms/vomit.dm b/code/datums/diseases/advance/symptoms/vomit.dm index 92bca8cfbf5e6..ee695ffd5bcaf 100644 --- a/code/datums/diseases/advance/symptoms/vomit.dm +++ b/code/datums/diseases/advance/symptoms/vomit.dm @@ -20,13 +20,15 @@ and your disease can spread via people walking on vomit. base_message_chance = 100 symptom_delay_min = 25 symptom_delay_max = 80 - var/vomit_blood = FALSE - var/proj_vomit = 0 + required_organ = ORGAN_SLOT_STOMACH threshold_descs = list( "Resistance 7" = "Host will vomit blood, causing internal damage.", "Transmission 7" = "Host will projectile vomit, increasing vomiting range.", "Stealth 4" = "The symptom remains hidden until active." ) + var/vomit_nebula = FALSE + var/vomit_blood = FALSE + var/proj_vomit = 0 /datum/symptom/vomit/Start(datum/disease/advance/A) . = ..() @@ -51,5 +53,25 @@ and your disease can spread via people walking on vomit. else vomit(M) -/datum/symptom/vomit/proc/vomit(mob/living/carbon/M) - M.vomit(20, vomit_blood, distance = proj_vomit) +/datum/symptom/vomit/proc/vomit(mob/living/carbon/vomiter) + var/deductable_nutrition = 0 + var/constructed_flags = (MOB_VOMIT_MESSAGE | MOB_VOMIT_HARM) + var/type_of_vomit = /obj/effect/decal/cleanable/vomit/toxic + if(vomit_nebula) + type_of_vomit = /obj/effect/decal/cleanable/vomit/nebula + deductable_nutrition = 10 + else + constructed_flags |= MOB_VOMIT_STUN + deductable_nutrition = 20 + + if(vomit_blood) + constructed_flags |= MOB_VOMIT_BLOOD + + vomiter.vomit(vomit_flags = constructed_flags, vomit_type = type_of_vomit, lost_nutrition = deductable_nutrition, distance = proj_vomit) + +/datum/symptom/vomit/nebula + name = "Nebula Vomiting" + desc = "The condition irritates the stomach, causing occasional vomit with stars that does not stun." + illness = "Nebula Nausea" + vomit_nebula = TRUE + naturally_occuring = FALSE diff --git a/code/datums/diseases/advance/symptoms/weight.dm b/code/datums/diseases/advance/symptoms/weight.dm index 86fbd75a6d151..b62bc08d6615c 100644 --- a/code/datums/diseases/advance/symptoms/weight.dm +++ b/code/datums/diseases/advance/symptoms/weight.dm @@ -18,6 +18,7 @@ base_message_chance = 100 symptom_delay_min = 15 symptom_delay_max = 45 + required_organ = ORGAN_SLOT_STOMACH threshold_descs = list( "Stealth 4" = "The symptom is less noticeable." ) diff --git a/code/datums/diseases/beesease.dm b/code/datums/diseases/beesease.dm index 2023c37b2563b..f2ef68b4e499e 100644 --- a/code/datums/diseases/beesease.dm +++ b/code/datums/diseases/beesease.dm @@ -38,4 +38,4 @@ if(SPT_PROB(0.5, seconds_per_tick)) affected_mob.visible_message(span_danger("[affected_mob] coughs up a swarm of bees!"), \ span_userdanger("You cough up a swarm of bees!")) - new /mob/living/simple_animal/hostile/bee(affected_mob.loc) + new /mob/living/basic/bee(affected_mob.loc) diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm index 1a080efa838aa..838908bde770b 100644 --- a/code/datums/diseases/brainrot.dm +++ b/code/datums/diseases/brainrot.dm @@ -9,10 +9,9 @@ viable_mobtypes = list(/mob/living/carbon/human) cure_chance = 7.5 //higher chance to cure, since two reagents are required desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication." - required_organs = list(/obj/item/organ/internal/brain) + required_organ = ORGAN_SLOT_BRAIN severity = DISEASE_SEVERITY_HARMFUL - /datum/disease/brainrot/stage_act(seconds_per_tick, times_fired) //Removed toxloss because damaging diseases are pretty horrible. Last round it killed the entire station because the cure didn't work -- Urist -ACTUALLY Removed rather than commented out, I don't see it returning - RR . = ..() if(!.) diff --git a/code/datums/diseases/chronic_illness.dm b/code/datums/diseases/chronic_illness.dm index 44197bb72d303..129883c17b5f0 100644 --- a/code/datums/diseases/chronic_illness.dm +++ b/code/datums/diseases/chronic_illness.dm @@ -4,6 +4,7 @@ spread_text = "Unspread Illness" spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS disease_flags = CHRONIC + infectable_biotypes = MOB_ORGANIC | MOB_MINERAL | MOB_ROBOTIC process_dead = TRUE stage_prob = 0.25 cure_text = "Sansufentanyl" @@ -13,7 +14,6 @@ viable_mobtypes = list(/mob/living/carbon/human) desc = "A disease discovered in an Interdyne laboratory caused by subjection to timesteam correction technology." severity = DISEASE_SEVERITY_UNCURABLE - var/heartswap = TRUE /datum/disease/chronic_illness/stage_act(seconds_per_tick, times_fired) . = ..() @@ -31,27 +31,31 @@ to_chat(affected_mob, span_notice("You look at your hand. Your vision blurs.")) affected_mob.set_eye_blur_if_lower(10 SECONDS) if(3) + var/need_mob_update = FALSE if(SPT_PROB(0.5, seconds_per_tick)) to_chat(affected_mob, span_danger("You feel a very sharp pain in your chest!")) if(prob(45)) - affected_mob.vomit(20,TRUE) + affected_mob.vomit(VOMIT_CATEGORY_BLOOD, lost_nutrition = 20) if(SPT_PROB(0.5, seconds_per_tick)) to_chat(affected_mob, span_userdanger("[pick("You feel your heart slowing...", "You relax and slow your heartbeat.")]")) - affected_mob.adjustStaminaLoss(70, FALSE) + need_mob_update += affected_mob.adjustStaminaLoss(70, updating_stamina = FALSE) if(SPT_PROB(1, seconds_per_tick)) to_chat(affected_mob, span_danger("You feel a buzzing in your brain.")) SEND_SOUND(affected_mob, sound('sound/weapons/flash_ring.ogg')) if(SPT_PROB(0.5, seconds_per_tick)) - affected_mob.adjustBruteLoss(1) + need_mob_update += affected_mob.adjustBruteLoss(1, updating_health = FALSE) + if(need_mob_update) + affected_mob.updatehealth() if(4) + var/need_mob_update = FALSE if(prob(30)) affected_mob.playsound_local(affected_mob, 'sound/effects/singlebeat.ogg', 100, FALSE, use_reverb = FALSE) if(SPT_PROB(1, seconds_per_tick)) to_chat(affected_mob, span_danger("You feel a gruesome pain in your chest!")) if(prob(75)) - affected_mob.vomit(45,TRUE) + affected_mob.vomit(VOMIT_CATEGORY_BLOOD, lost_nutrition = 45) if(SPT_PROB(1, seconds_per_tick)) - affected_mob.adjustStaminaLoss(100, FALSE) + need_mob_update += affected_mob.adjustStaminaLoss(100, updating_stamina = FALSE) affected_mob.visible_message(span_warning("[affected_mob] collapses!")) if(prob(30)) to_chat(affected_mob, span_danger("Your vision blurs as you faint!")) @@ -59,12 +63,14 @@ if(SPT_PROB(0.5, seconds_per_tick)) to_chat(affected_mob, span_danger("[pick("You feel as though your atoms are accelerating in place.", "You feel like you're being torn apart!")]")) affected_mob.emote("scream") - affected_mob.adjustBruteLoss(10) + need_mob_update += affected_mob.adjustBruteLoss(10, updating_health = FALSE) + if(need_mob_update) + affected_mob.updatehealth() if(5) switch(rand(1,2)) if(1) to_chat(affected_mob, span_notice("You feel your atoms begin to realign. You're safe. For now.")) - stage = 1 + update_stage(1) if(2) to_chat(affected_mob, span_boldwarning("There is no place for you in this timeline.")) affected_mob.adjustStaminaLoss(100, forced = TRUE) diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm index 5aafb5d12e6f6..f7bf6cf4b18a7 100644 --- a/code/datums/diseases/cold.dm +++ b/code/datums/diseases/cold.dm @@ -9,6 +9,7 @@ spreading_modifier = 0.5 spread_text = "Airborne" severity = DISEASE_SEVERITY_NONTHREAT + required_organ = ORGAN_SLOT_LUNGS /datum/disease/cold/stage_act(seconds_per_tick, times_fired) diff --git a/code/datums/diseases/cold9.dm b/code/datums/diseases/cold9.dm index 543a021eee867..2e55df23b7ec8 100644 --- a/code/datums/diseases/cold9.dm +++ b/code/datums/diseases/cold9.dm @@ -9,7 +9,7 @@ viable_mobtypes = list(/mob/living/carbon/human) desc = "If left untreated the subject will slow, as if partly frozen." severity = DISEASE_SEVERITY_HARMFUL - + required_organ = ORGAN_SLOT_LUNGS /datum/disease/cold9/stage_act(seconds_per_tick, times_fired) . = ..() diff --git a/code/datums/diseases/death_sandwich_poisoning.dm b/code/datums/diseases/death_sandwich_poisoning.dm index 66930cb776f15..f865f4fb5be6a 100644 --- a/code/datums/diseases/death_sandwich_poisoning.dm +++ b/code/datums/diseases/death_sandwich_poisoning.dm @@ -14,7 +14,7 @@ spread_flags = DISEASE_SPREAD_SPECIAL visibility_flags = HIDDEN_SCANNER bypasses_immunity = TRUE - + required_organ = ORGAN_SLOT_STOMACH /datum/disease/death_sandwich_poisoning/stage_act(seconds_per_tick, times_fired) . = ..() @@ -47,7 +47,7 @@ if(SPT_PROB(10, seconds_per_tick)) affected_mob.emote("gasp") if(SPT_PROB(2.5, seconds_per_tick)) - affected_mob.vomit(20, TRUE) + affected_mob.vomit(VOMIT_CATEGORY_BLOOD, lost_nutrition = 20) if(SPT_PROB(2.5, seconds_per_tick)) to_chat(affected_mob, span_danger("Your body feels hot!")) if(prob(60)) diff --git a/code/datums/diseases/decloning.dm b/code/datums/diseases/decloning.dm index 0b7c74f9a031d..5716b2910c9bd 100644 --- a/code/datums/diseases/decloning.dm +++ b/code/datums/diseases/decloning.dm @@ -3,17 +3,20 @@ name = "Cellular Degeneration" max_stages = 5 stage_prob = 0.5 - cure_text = "Rezadone or death." + cure_text = "Rezadone, Mutadone for prolonging, 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) - disease_flags = CAN_CARRY|CAN_RESIST spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS spread_text = "Organic meltdown" process_dead = TRUE +/datum/disease/decloning/cure() + affected_mob.remove_status_effect(/datum/status_effect/decloning) + return ..() + /datum/disease/decloning/stage_act(seconds_per_tick, times_fired) . = ..() if(!.) @@ -35,18 +38,17 @@ if(SPT_PROB(1, seconds_per_tick)) affected_mob.emote("drool") if(SPT_PROB(1.5, seconds_per_tick)) - affected_mob.adjustCloneLoss(1, FALSE) + affected_mob.apply_status_effect(/datum/status_effect/decloning) if(SPT_PROB(1, seconds_per_tick)) to_chat(affected_mob, span_danger("Your skin feels strange.")) - if(4) if(SPT_PROB(1, seconds_per_tick)) affected_mob.emote("itch") if(SPT_PROB(1, seconds_per_tick)) affected_mob.emote("drool") if(SPT_PROB(2.5, seconds_per_tick)) + affected_mob.apply_status_effect(/datum/status_effect/decloning) affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1, 170) - affected_mob.adjustCloneLoss(2, FALSE) if(SPT_PROB(7.5, seconds_per_tick)) affected_mob.adjust_stutter(6 SECONDS) if(5) @@ -57,9 +59,5 @@ if(SPT_PROB(2.5, seconds_per_tick)) to_chat(affected_mob, span_danger("Your skin starts degrading!")) if(SPT_PROB(5, seconds_per_tick)) - affected_mob.adjustCloneLoss(5, FALSE) + affected_mob.apply_status_effect(/datum/status_effect/decloning) affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2, 170) - if(affected_mob.cloneloss >= 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 17faeda6243ee..48ca9506e2e3a 100644 --- a/code/datums/diseases/dna_spread.dm +++ b/code/datums/diseases/dna_spread.dm @@ -23,7 +23,8 @@ cure() return FALSE - if((NOTRANSSTING in affected_mob.dna.species.species_traits) || (NO_DNA_COPY in affected_mob.dna.species.species_traits)) //Only species that can be spread by transformation sting can be spread by the retrovirus + //Only species that can be spread by transformation sting can be spread by the retrovirus + if(HAS_TRAIT(affected_mob, TRAIT_NO_DNA_COPY)) cure() return FALSE @@ -32,7 +33,7 @@ strain_data["dna"] = new affected_mob.dna.type affected_mob.dna.copy_dna(strain_data["dna"]) carrier = TRUE - stage = 4 + update_stage(4) return switch(stage) diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm index 0da9a5b8e92d6..9412d2a2a2f63 100644 --- a/code/datums/diseases/flu.dm +++ b/code/datums/diseases/flu.dm @@ -10,7 +10,7 @@ spreading_modifier = 0.75 desc = "If left untreated the subject will feel quite unwell." severity = DISEASE_SEVERITY_MINOR - + required_organ = ORGAN_SLOT_LUNGS /datum/disease/flu/stage_act(seconds_per_tick, times_fired) . = ..() diff --git a/code/datums/diseases/fluspanish.dm b/code/datums/diseases/fluspanish.dm index 109b7ac470b55..6919884b2fe30 100644 --- a/code/datums/diseases/fluspanish.dm +++ b/code/datums/diseases/fluspanish.dm @@ -10,7 +10,7 @@ spreading_modifier = 0.75 desc = "If left untreated the subject will burn to death for being a heretic." severity = DISEASE_SEVERITY_DANGEROUS - + required_organ = ORGAN_SLOT_LUNGS /datum/disease/fluspanish/stage_act(seconds_per_tick, times_fired) . = ..() diff --git a/code/datums/diseases/gastrolisis.dm b/code/datums/diseases/gastrolisis.dm index 455e0773e333a..f82f8b3269f6d 100644 --- a/code/datums/diseases/gastrolisis.dm +++ b/code/datums/diseases/gastrolisis.dm @@ -65,7 +65,7 @@ if(shell && eyes && tongue && SPT_PROB(2.5, seconds_per_tick)) affected_mob.set_species(/datum/species/snail) - affected_mob.client?.give_award(/datum/award/achievement/misc/snail, affected_mob) + affected_mob.client?.give_award(/datum/award/achievement/jobs/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() diff --git a/code/datums/diseases/gbs.dm b/code/datums/diseases/gbs.dm index 22f84cf73a1f4..abf2116a92f06 100644 --- a/code/datums/diseases/gbs.dm +++ b/code/datums/diseases/gbs.dm @@ -30,5 +30,5 @@ to_chat(affected_mob, span_userdanger("Your body feels as if it's trying to rip itself apart!")) if(SPT_PROB(30, seconds_per_tick)) affected_mob.investigate_log("has been gibbed by GBS.", INVESTIGATE_DEATHS) - affected_mob.gib() + affected_mob.gib(DROP_ALL_REMAINS) return FALSE diff --git a/code/datums/diseases/heart_failure.dm b/code/datums/diseases/heart_failure.dm index f996ebbaabc8e..45d4e6672fb69 100644 --- a/code/datums/diseases/heart_failure.dm +++ b/code/datums/diseases/heart_failure.dm @@ -13,7 +13,7 @@ spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS spread_text = "Organ failure" visibility_flags = HIDDEN_PANDEMIC - required_organs = list(/obj/item/organ/internal/heart) + required_organ = ORGAN_SLOT_HEART bypasses_immunity = TRUE // Immunity is based on not having an appendix; this isn't a virus var/sound = FALSE @@ -48,7 +48,7 @@ if(SPT_PROB(1.5, seconds_per_tick)) to_chat(affected_mob, span_danger("You feel a sharp pain in your chest!")) if(prob(25)) - affected_mob.vomit(95) + affected_mob.vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = 95) affected_mob.emote("cough") affected_mob.Paralyze(40) affected_mob.losebreath += 4 diff --git a/code/datums/diseases/parasitic_infection.dm b/code/datums/diseases/parasitic_infection.dm index d383db7c3f2f2..64bb59f01fd96 100644 --- a/code/datums/diseases/parasitic_infection.dm +++ b/code/datums/diseases/parasitic_infection.dm @@ -11,21 +11,14 @@ severity = DISEASE_SEVERITY_HARMFUL disease_flags = CAN_CARRY|CAN_RESIST spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS - required_organs = list(/obj/item/organ/internal/liver) + required_organ = ORGAN_SLOT_LIVER bypasses_immunity = TRUE - /datum/disease/parasite/stage_act(seconds_per_tick, times_fired) . = ..() if(!.) return - var/obj/item/organ/internal/liver/affected_liver = affected_mob.get_organ_by_type(/obj/item/organ/internal/liver) - if(!affected_liver) - affected_mob.visible_message(span_notice("[affected_mob]'s liver is covered in tiny larva! They quickly shrivel and die after being exposed to the open air.")) - cure() - return FALSE - switch(stage) if(1) if(SPT_PROB(2.5, seconds_per_tick)) @@ -48,7 +41,9 @@ affected_mob.adjust_nutrition(-12) else to_chat(affected_mob, span_warning("You feel much, MUCH lighter!")) - affected_mob.vomit(20, TRUE) + affected_mob.vomit(VOMIT_CATEGORY_BLOOD, lost_nutrition = 20) + // disease code already checks if the liver exists otherwise it is cured + var/obj/item/organ/internal/liver/affected_liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) affected_liver.Remove(affected_mob) affected_liver.forceMove(get_turf(affected_mob)) cure() diff --git a/code/datums/diseases/pierrot_throat.dm b/code/datums/diseases/pierrot_throat.dm index d24afb6fe5b1f..afc27eff07ae2 100644 --- a/code/datums/diseases/pierrot_throat.dm +++ b/code/datums/diseases/pierrot_throat.dm @@ -10,7 +10,7 @@ spreading_modifier = 0.75 desc = "If left untreated the subject will probably drive others to insanity." severity = DISEASE_SEVERITY_MEDIUM - + required_organ = ORGAN_SLOT_TONGUE /datum/disease/pierrot_throat/stage_act(seconds_per_tick, times_fired) . = ..() diff --git a/code/datums/diseases/rhumba_beat.dm b/code/datums/diseases/rhumba_beat.dm index 01188137915fb..e64002ab528f7 100644 --- a/code/datums/diseases/rhumba_beat.dm +++ b/code/datums/diseases/rhumba_beat.dm @@ -18,7 +18,7 @@ switch(stage) if(2) if(SPT_PROB(26, seconds_per_tick)) - affected_mob.adjustFireLoss(5, FALSE) + affected_mob.adjustFireLoss(5) if(SPT_PROB(0.5, seconds_per_tick)) to_chat(affected_mob, span_danger("You feel strange...")) if(3) diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 8f4e4069a773d..a3449e366dfba 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -58,10 +58,10 @@ to_chat(affected_mob, pick(stage5)) if(QDELETED(affected_mob)) return - if(affected_mob.notransform) + if(HAS_TRAIT_FROM(affected_mob, TRAIT_NO_TRANSFORM, REF(src))) return - affected_mob.notransform = 1 - for(var/obj/item/W in affected_mob.get_equipped_items(TRUE)) + ADD_TRAIT(affected_mob, TRAIT_NO_TRANSFORM, REF(src)) + for(var/obj/item/W in affected_mob.get_equipped_items(include_pockets = TRUE)) affected_mob.dropItemToGround(W) for(var/obj/item/I in affected_mob.held_items) affected_mob.dropItemToGround(I) @@ -257,7 +257,7 @@ if(ishuman(affected_mob)) var/mob/living/carbon/human/human = affected_mob if(isjellyperson(human)) - stage = 5 + update_stage(5) if(3) if(ishuman(affected_mob)) var/mob/living/carbon/human/human = affected_mob @@ -314,7 +314,7 @@ stage3 = list(span_danger("Your appendages are melting away."), span_danger("Your limbs begin to lose their shape.")) stage4 = list(span_danger("You're ravenous.")) stage5 = list(span_danger("You have become a morph.")) - new_form = /mob/living/simple_animal/hostile/morph + new_form = /mob/living/basic/morph infectable_biotypes = MOB_ORGANIC|MOB_MINERAL|MOB_UNDEAD //magic! transformed_antag_datum = /datum/antagonist/morph diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm index f40515f6b570f..de87cab6f3f67 100644 --- a/code/datums/diseases/tuberculosis.dm +++ b/code/datums/diseases/tuberculosis.dm @@ -9,7 +9,7 @@ viable_mobtypes = list(/mob/living/carbon/human) cure_chance = 2.5 //like hell are you getting out of hell desc = "A rare highly transmissible virulent virus. Few samples exist, rumoured to be carefully grown and cultured by clandestine bio-weapon specialists. Causes fever, blood vomiting, lung damage, weight loss, and fatigue." - required_organs = list(/obj/item/organ/internal/lungs) + required_organ = ORGAN_SLOT_LUNGS severity = DISEASE_SEVERITY_BIOHAZARD bypasses_immunity = TRUE // TB primarily impacts the lungs; it's also bacterial or fungal in nature; viral immunity should do nothing. @@ -28,30 +28,34 @@ if(SPT_PROB(2.5, seconds_per_tick)) to_chat(affected_mob, span_danger("You feel a cold sweat form.")) if(4) + var/need_mob_update = FALSE if(SPT_PROB(1, seconds_per_tick)) to_chat(affected_mob, span_userdanger("You see four of everything!")) affected_mob.set_dizzy_if_lower(10 SECONDS) if(SPT_PROB(1, seconds_per_tick)) to_chat(affected_mob, span_danger("You feel a sharp pain from your lower chest!")) - affected_mob.adjustOxyLoss(5, FALSE) + need_mob_update += affected_mob.adjustOxyLoss(5, updating_health = FALSE) affected_mob.emote("gasp") if(SPT_PROB(5, seconds_per_tick)) to_chat(affected_mob, span_danger("You feel air escape from your lungs painfully.")) - affected_mob.adjustOxyLoss(25, FALSE) + need_mob_update += affected_mob.adjustOxyLoss(25, updating_health = FALSE) affected_mob.emote("gasp") + if(need_mob_update) + affected_mob.updatehealth() if(5) + var/need_mob_update = FALSE if(SPT_PROB(1, seconds_per_tick)) to_chat(affected_mob, span_userdanger("[pick("You feel your heart slowing...", "You relax and slow your heartbeat.")]")) - affected_mob.adjustStaminaLoss(70, FALSE) + need_mob_update += affected_mob.adjustStaminaLoss(70, updating_stamina = FALSE) if(SPT_PROB(5, seconds_per_tick)) - affected_mob.adjustStaminaLoss(100, FALSE) + need_mob_update += affected_mob.adjustStaminaLoss(100, updating_stamina = FALSE) affected_mob.visible_message(span_warning("[affected_mob] faints!"), span_userdanger("You surrender yourself and feel at peace...")) affected_mob.AdjustSleeping(100) if(SPT_PROB(1, seconds_per_tick)) to_chat(affected_mob, span_userdanger("You feel your mind relax and your thoughts drift!")) affected_mob.adjust_confusion_up_to(8 SECONDS, 100 SECONDS) if(SPT_PROB(5, seconds_per_tick)) - affected_mob.vomit(20) + affected_mob.vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = 20) if(SPT_PROB(1.5, seconds_per_tick)) to_chat(affected_mob, span_warning("[pick("Your stomach silently rumbles...", "Your stomach seizes up and falls limp, muscles dead and lifeless.", "You could eat a crayon")]")) affected_mob.overeatduration = max(affected_mob.overeatduration - (200 SECONDS), 0) @@ -59,3 +63,5 @@ if(SPT_PROB(7.5, seconds_per_tick)) to_chat(affected_mob, span_danger("[pick("You feel uncomfortably hot...", "You feel like unzipping your jumpsuit...", "You feel like taking off some clothes...")]")) affected_mob.adjust_bodytemperature(40) + if(need_mob_update) + affected_mob.updatehealth() diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm index f5a716befb362..c2394dd645bdc 100644 --- a/code/datums/diseases/wizarditis.dm +++ b/code/datums/diseases/wizarditis.dm @@ -9,106 +9,176 @@ viable_mobtypes = list(/mob/living/carbon/human) disease_flags = CAN_CARRY|CAN_RESIST|CURABLE spreading_modifier = 0.75 - desc = "Some speculate that this virus is the cause of the Space Wizard Federation's existence. Subjects affected show the signs of brain damage, yelling obscure sentences or total gibberish. On late stages subjects sometime express the feelings of inner power, and, cite, 'the ability to control the forces of cosmos themselves!' A gulp of strong, manly spirits usually reverts them to normal, humanlike, condition." + desc = "Some speculate that this virus is the cause of the Space Wizard Federation's existence. \ + Subjects affected show the signs of brain damage, yelling obscure sentences or total gibberish. \ + On late stages subjects sometime express the feelings of inner power, and cite \ + 'the ability to control the forces of cosmos themselves!' \ + A gulp of strong, manly spirits usually reverts them to normal, humanlike, condition. \ + A form of magical grounding can help, too, but will not cure it on its own." severity = DISEASE_SEVERITY_HARMFUL - required_organs = list(/obj/item/bodypart/head) - -/* -BIRUZ BENNAR -SCYAR NILA - teleport -NEC CANTIO - dis techno -EI NATH - shocking grasp -AULIE OXIN FIERA - knock -TARCOL MINTI ZHERI - forcewall -STI KALY - blind -*/ + + /// List of random non-targeted spells to pick from to cast + var/list/datum/action/cooldown/spell/random_spells = list() + /// List of random targeted spells to pick from to cast + var/list/datum/action/cooldown/spell/random_targeted_spells = list() + + /// The hat type to give the infected + var/hat_type + /// The robe type to give the infected + var/robe_type + +/datum/disease/wizarditis/after_add() + switch(pick("blue", "red", "yellow")) + if("blue") + hat_type = /obj/item/clothing/head/wizard + robe_type = /obj/item/clothing/suit/wizrobe + if("red") + hat_type = /obj/item/clothing/head/wizard/red + robe_type = /obj/item/clothing/suit/wizrobe/red + if("yellow") + hat_type = /obj/item/clothing/head/wizard/yellow + robe_type = /obj/item/clothing/suit/wizrobe/yellow + + init_spells() + +/datum/disease/wizarditis/Destroy() + QDEL_LIST(random_spells) + QDEL_LIST(random_targeted_spells) + return ..() /datum/disease/wizarditis/stage_act(seconds_per_tick, times_fired) . = ..() if(!.) return + if(affected_mob.can_block_magic(charge_cost = 0)) + update_stage(1) + return + + if(stage >= 3 && SPT_PROB(0.15 * stage, seconds_per_tick)) + var/datum/action/cooldown/spell/picked = pick(random_spells) + if(!picked.try_invoke(affected_mob, feedback = FALSE)) + to_chat(affected_mob, span_danger("You feel something building up inside... but the feeling passes.")) + return + + picked.spell_feedback(affected_mob) + return + + if(stage <= 3 && SPT_PROB(0.33 * stage, seconds_per_tick)) + affected_mob.manual_emote("sniffles.") + switch(stage) if(2) - if(SPT_PROB(0.25, seconds_per_tick)) - affected_mob.say(pick("You shall not pass!", "Expeliarmus!", "By Merlins beard!", "Feel the power of the Dark Side!"), forced = "wizarditis") - if(SPT_PROB(0.25, seconds_per_tick)) + if(SPT_PROB(1, seconds_per_tick)) to_chat(affected_mob, span_danger("You feel [pick("that you don't have enough mana", "that the winds of magic are gone", "an urge to summon familiar")].")) + if(3) - if(SPT_PROB(0.25, seconds_per_tick)) - affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!", "STI KALY!", "TARCOL MINTI ZHERI!"), forced = "wizarditis") - if(SPT_PROB(0.25, seconds_per_tick)) - to_chat(affected_mob, span_danger("You feel [pick("the magic bubbling in your veins","that this location gives you a +1 to INT","an urge to summon familiar")].")) + if(SPT_PROB(1, seconds_per_tick)) + to_chat(affected_mob, span_danger("You feel [pick("the magic bubbling in your veins", "that this location gives you a +1 to INT", "an urge to summon familiar")].")) + spawn_wizard_clothes(10) + if(4) - if(SPT_PROB(0.5, seconds_per_tick)) - affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!","STI KALY!","EI NATH!"), forced = "wizarditis") - return - if(SPT_PROB(0.25, seconds_per_tick)) - to_chat(affected_mob, span_danger("You feel [pick("the tidal wave of raw power building inside","that this location gives you a +2 to INT and +1 to WIS","an urge to teleport")].")) + if(SPT_PROB(1, seconds_per_tick)) + to_chat(affected_mob, span_danger("You feel [pick("the tidal wave of raw power building inside", "that this location gives you a +2 to INT and +1 to WIS", "an urge to teleport")].")) spawn_wizard_clothes(50) - if(SPT_PROB(0.005, seconds_per_tick)) - teleport() + if(SPT_PROB(0.2, seconds_per_tick)) + if(prob(15)) + var/list/targets = list() + var/datum/action/cooldown/spell/target_picked = pick(random_targeted_spells) + for(var/mob/living/potential_target in view(affected_mob)) + if(potential_target == affected_mob) + continue + targets += potential_target -/datum/disease/wizarditis/proc/spawn_wizard_clothes(chance = 0) - if(ishuman(affected_mob)) - var/mob/living/carbon/human/H = affected_mob - if(prob(chance)) - if(!istype(H.head, /obj/item/clothing/head/wizard)) - if(!H.dropItemToGround(H.head)) - qdel(H.head) - H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(H), ITEM_SLOT_HEAD) - return - if(prob(chance)) - if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe)) - if(!H.dropItemToGround(H.wear_suit)) - qdel(H.wear_suit) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(H), ITEM_SLOT_OCLOTHING) - return - if(prob(chance)) - if(!istype(H.shoes, /obj/item/clothing/shoes/sandal/magic)) - if(!H.dropItemToGround(H.shoes)) - qdel(H.shoes) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(H), ITEM_SLOT_FEET) - return - else - var/mob/living/carbon/H = affected_mob - if(prob(chance)) - var/obj/item/staff/S = new(H) - if(!H.put_in_hands(S)) - qdel(S) + if(length(targets)) + target_picked.Activate(pick(targets)) + affected_mob.emote("cough") + return + var/datum/action/cooldown/spell/picked = pick(random_spells) + picked.Activate(affected_mob) + affected_mob.emote("sneeze") + return -/datum/disease/wizarditis/proc/teleport() - var/list/theareas = get_areas_in_range(80, affected_mob) - for(var/area/space/S in theareas) - theareas -= S +/datum/disease/wizarditis/proc/spawn_wizard_clothes(chance = 0) + if(prob(chance) && affected_mob.usable_hands >= 1) + var/obj/item/staff/funny_staff = new(affected_mob) + if(!affected_mob.put_in_hands(funny_staff)) + qdel(funny_staff) - if(!theareas || !theareas.len) + if(!ishuman(affected_mob)) return - var/area/thearea = pick(theareas) - - var/list/L = list() - var/turf/mob_turf = get_turf(affected_mob) - for(var/turf/T in get_area_turfs(thearea.type)) - if(!is_valid_z_level(T, mob_turf)) - continue - if(T.name == "space") - continue - if(!T.density) - var/clear = 1 - for(var/obj/O in T) - if(O.density) - clear = 0 - break - if(clear) - L+=T - - if(!L) - return - affected_mob.say("SCYAR NILA [uppertext(thearea.name)]!", forced = "wizarditis teleport") - affected_mob.forceMove(pick(L)) + var/mob/living/carbon/human/human_mob = affected_mob + if(prob(chance) && !(human_mob.head?.item_flags & CASTING_CLOTHES)) + if(human_mob.dropItemToGround(human_mob.head)) + human_mob.equip_to_slot_or_del(new hat_type(human_mob), ITEM_SLOT_HEAD) + + if(prob(chance) && !(human_mob.wear_suit?.item_flags & CASTING_CLOTHES)) + if(human_mob.dropItemToGround(human_mob.wear_suit)) + human_mob.equip_to_slot_or_del(new robe_type(human_mob), ITEM_SLOT_OCLOTHING) + + if(prob(chance) && !istype(human_mob.shoes, /obj/item/clothing/shoes/sandal/magic)) + if(human_mob.dropItemToGround(human_mob.shoes)) + human_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(human_mob), ITEM_SLOT_FEET) + +/datum/disease/wizarditis/proc/init_spells() + // Some self cast spells + var/datum/action/cooldown/spell/teleport/area_teleport/wizard/sneeze_teleport = new(src) + sneeze_teleport.randomise_selection = TRUE + random_spells += sneeze_teleport + + var/datum/action/cooldown/spell/emp/disable_tech/sneeze_emp = new(src) + sneeze_emp.emp_heavy = 1 + sneeze_emp.emp_light = 2 + random_spells += sneeze_emp + + var/datum/action/cooldown/spell/apply_mutations/mutate/sneeze_mutate = new(src) + sneeze_mutate.mutation_duration = 3 SECONDS + random_spells += sneeze_mutate + + var/datum/action/cooldown/spell/aoe/knock/sneeze_knock = new(src) + random_spells += sneeze_knock + + var/datum/action/cooldown/spell/forcewall/sneeze_forcewall = new(src) + random_spells += sneeze_forcewall + + var/datum/action/cooldown/spell/teleport/radius_turf/blink/sneeze_blink = new(src) + sneeze_blink.inner_tele_radius = 1 + sneeze_blink.outer_tele_radius = 3 + random_spells += sneeze_blink + + var/datum/action/cooldown/spell/smoke/sneeze_smoke = new(src) + sneeze_smoke.smoke_amt = 2 + random_spells += sneeze_smoke + + var/datum/action/cooldown/spell/spacetime_dist/sneeze_spacetime = new(src) + sneeze_spacetime.scramble_radius = 2 + sneeze_spacetime.duration = 5 SECONDS + random_spells += sneeze_spacetime + + var/datum/action/cooldown/spell/timestop/sneeze_timestop = new(src) + sneeze_timestop.timestop_range = 1 // heh + sneeze_timestop.timestop_duration = 5 SECONDS + random_spells += sneeze_timestop + + var/datum/action/cooldown/spell/aoe/repulse/sneeze_repulse = new(src) + sneeze_repulse.aoe_radius = 2 + sneeze_repulse.max_throw = 3 + random_spells += sneeze_repulse + + // Some targeted spells + var/datum/action/cooldown/spell/pointed/blind/cough_blind = new(src) + cough_blind.eye_blind_duration = 2 SECONDS + cough_blind.eye_blur_duration = 10 SECONDS + random_targeted_spells += cough_blind + + var/datum/action/cooldown/spell/pointed/projectile/lightningbolt/cough_zap = new(src) + cough_zap.bolt_range /= 3 + cough_zap.bolt_power /= 3 + random_targeted_spells += cough_zap - return + var/datum/action/cooldown/spell/pointed/swap/cough_swap = new(src) + random_targeted_spells += cough_swap diff --git a/code/datums/dna.dm b/code/datums/dna.dm index d79153f7ef7c9..599bc9ce1b2ef 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -56,8 +56,9 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) var/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 - var/list/features = list("FFF") + /// Assoc list of feature keys to their value + /// Note if you set these manually, and do not update [unique_features] afterwards, it will likely be reset. + var/list/features = list("mcolor" = "#FFFFFF") ///Stores the hashed values of the person's non-human features var/unique_features ///Stores the real name of the person who originally got this dna datum. Used primarely for changelings, @@ -165,13 +166,16 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) . = "" var/list/L = new /list(DNA_UNI_IDENTITY_BLOCKS) + //ignores TRAIT_AGENDER so that a "real" gender can be stored in the DNA if later use is needed switch(holder.gender) if(MALE) - L[DNA_GENDER_BLOCK] = construct_block(G_MALE, 3) + L[DNA_GENDER_BLOCK] = construct_block(G_MALE, GENDERS) if(FEMALE) - L[DNA_GENDER_BLOCK] = construct_block(G_FEMALE, 3) + L[DNA_GENDER_BLOCK] = construct_block(G_FEMALE, GENDERS) + if(NEUTER) + L[DNA_GENDER_BLOCK] = construct_block(G_NEUTER, GENDERS) else - L[DNA_GENDER_BLOCK] = construct_block(G_PLURAL, 3) + L[DNA_GENDER_BLOCK] = construct_block(G_PLURAL, GENDERS) if(ishuman(holder)) var/mob/living/carbon/human/H = holder if(!GLOB.hairstyles_list.len) @@ -299,7 +303,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) var/mob/living/carbon/human/H = holder switch(blocknumber) if(DNA_HAIR_COLOR_BLOCK) - set_uni_identity_block( blocknumber, sanitize_hexcolor(H.hair_color, include_crunch = FALSE)) + set_uni_identity_block(blocknumber, sanitize_hexcolor(H.hair_color, include_crunch = FALSE)) if(DNA_FACIAL_HAIR_COLOR_BLOCK) set_uni_identity_block(blocknumber, sanitize_hexcolor(H.facial_hair_color, include_crunch = FALSE)) if(DNA_SKIN_TONE_BLOCK) @@ -311,11 +315,13 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) if(DNA_GENDER_BLOCK) switch(H.gender) if(MALE) - set_uni_identity_block(blocknumber, construct_block(G_MALE, 3)) + set_uni_identity_block(blocknumber, construct_block(G_MALE, GENDERS)) if(FEMALE) - set_uni_identity_block(blocknumber, construct_block(G_FEMALE, 3)) + set_uni_identity_block(blocknumber, construct_block(G_FEMALE, GENDERS)) + if(NEUTER) + set_uni_identity_block(blocknumber, construct_block(G_NEUTER, GENDERS)) else - set_uni_identity_block(blocknumber, construct_block(G_PLURAL, 3)) + set_uni_identity_block(blocknumber, construct_block(G_PLURAL, GENDERS)) if(DNA_FACIAL_HAIRSTYLE_BLOCK) set_uni_identity_block(blocknumber, construct_block(GLOB.facial_hairstyles_list.Find(H.facial_hairstyle), GLOB.facial_hairstyles_list.len)) if(DNA_HAIRSTYLE_BLOCK) @@ -334,7 +340,9 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) if(DNA_LIZARD_MARKINGS_BLOCK) set_uni_feature_block(blocknumber, construct_block(GLOB.body_markings_list.Find(features["body_markings"]), GLOB.body_markings_list.len)) 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_human.Find(features["tail_cat"]), GLOB.tails_list_human.len)) + if(DNA_LIZARD_TAIL_BLOCK) + set_uni_feature_block(blocknumber, construct_block(GLOB.tails_list_lizard.Find(features["tail_lizard"]), GLOB.tails_list_lizard.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) @@ -419,22 +427,37 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) if(message) to_chat(holder, message) -//used to update dna UI, UE, and dna.real_name. +/// Updates the UI, UE, and UF of the DNA according to the features, appearance, name, etc. of the DNA / holder. /datum/dna/proc/update_dna_identity() unique_identity = generate_unique_identity() unique_enzymes = generate_unique_enzymes() unique_features = generate_unique_features() -/datum/dna/proc/initialize_dna(newblood_type, skip_index = FALSE) +/** + * Sets up DNA codes and initializes some features. + * + * * newblood_type - Optional, the blood type to set the DNA to + * * create_mutation_blocks - If true, generate_dna_blocks is called, which is used to set up mutation blocks (what a mob can naturally mutate). + * * randomize_features - If true, all entries in the features list will be randomized. + */ +/datum/dna/proc/initialize_dna(newblood_type, create_mutation_blocks = TRUE, randomize_features = TRUE) if(newblood_type) blood_type = newblood_type - unique_enzymes = generate_unique_enzymes() - unique_identity = generate_unique_identity() - if(!skip_index) //I hate this + if(create_mutation_blocks) //I hate this generate_dna_blocks() - features = random_features() - unique_features = generate_unique_features() + if(randomize_features) + var/static/list/all_species_protoypes + if(isnull(all_species_protoypes)) + all_species_protoypes = list() + for(var/species_path in subtypesof(/datum/species)) + all_species_protoypes += new species_path() + + for(var/datum/species/random_species as anything in all_species_protoypes) + features |= random_species.randomize_features() + + features["mcolor"] = "#[random_color()]" + update_dna_identity() /datum/dna/stored //subtype used by brain mob's stored_dna @@ -470,29 +493,29 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) /mob/living/carbon/set_species(datum/species/mrace, icon_update = TRUE, pref_load = FALSE) if(QDELETED(src)) CRASH("You're trying to change your species post deletion, this is a recipe for madness") - if(mrace && has_dna()) - var/datum/species/new_race - if(ispath(mrace)) - new_race = new mrace - else if(istype(mrace)) - new_race = mrace - else - return - death_sound = new_race.death_sound + if(isnull(mrace)) + CRASH("set_species called without a species to set to") + if(!has_dna()) + return + + var/datum/species/new_race + if(ispath(mrace)) + new_race = new mrace + else if(istype(mrace)) + new_race = mrace + else + CRASH("set_species called with an invalid mrace [mrace]") - var/datum/species/old_species = dna.species - dna.species = new_race + death_sound = new_race.death_sound - if (old_species.properly_gained) - old_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() - log_mob_tag("TAG: [tag] SPECIES: [key_name(src)] \[[mrace]\]") + if (old_species.properly_gained) + old_species.on_species_loss(src, new_race, pref_load) + + dna.species.on_species_gain(src, old_species, pref_load) + log_mob_tag("TAG: [tag] SPECIES: [key_name(src)] \[[mrace]\]") /mob/living/carbon/human/set_species(datum/species/mrace, icon_update = TRUE, pref_load = FALSE) ..() @@ -568,30 +591,39 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) if(!has_dna()) return - switch(deconstruct_block(get_uni_identity_block(dna.unique_identity, DNA_GENDER_BLOCK), 3)) + //Always plural gender if agender + if(HAS_TRAIT(src, TRAIT_AGENDER)) + gender = PLURAL + return + + switch(deconstruct_block(get_uni_identity_block(dna.unique_identity, DNA_GENDER_BLOCK), GENDERS)) if(G_MALE) gender = MALE if(G_FEMALE) gender = FEMALE + if(G_NEUTER) + gender = NEUTER else gender = PLURAL -/mob/living/carbon/human/updateappearance(icon_update=1, mutcolor_update=0, mutations_overlay_update=0) +/mob/living/carbon/human/updateappearance(icon_update = TRUE, mutcolor_update = FALSE, mutations_overlay_update = FALSE) ..() var/structure = dna.unique_identity - hair_color = sanitize_hexcolor(get_uni_identity_block(structure, DNA_HAIR_COLOR_BLOCK)) - facial_hair_color = sanitize_hexcolor(get_uni_identity_block(structure, DNA_FACIAL_HAIR_COLOR_BLOCK)) skin_tone = GLOB.skin_tones[deconstruct_block(get_uni_identity_block(structure, DNA_SKIN_TONE_BLOCK), GLOB.skin_tones.len)] eye_color_left = sanitize_hexcolor(get_uni_identity_block(structure, DNA_EYE_COLOR_LEFT_BLOCK)) eye_color_right = sanitize_hexcolor(get_uni_identity_block(structure, DNA_EYE_COLOR_RIGHT_BLOCK)) + set_haircolor(sanitize_hexcolor(get_uni_identity_block(structure, DNA_HAIR_COLOR_BLOCK)), update = FALSE) + set_facial_haircolor(sanitize_hexcolor(get_uni_identity_block(structure, DNA_FACIAL_HAIR_COLOR_BLOCK)), update = FALSE) if(HAS_TRAIT(src, TRAIT_SHAVED)) - hairstyle = "Shaved" + set_facial_hairstyle("Shaved", update = FALSE) else - facial_hairstyle = GLOB.facial_hairstyles_list[deconstruct_block(get_uni_identity_block(structure, DNA_FACIAL_HAIRSTYLE_BLOCK), GLOB.facial_hairstyles_list.len)] + var/style = GLOB.facial_hairstyles_list[deconstruct_block(get_uni_identity_block(structure, DNA_FACIAL_HAIRSTYLE_BLOCK), GLOB.facial_hairstyles_list.len)] + set_facial_hairstyle(style, update = FALSE) if(HAS_TRAIT(src, TRAIT_BALD)) - hairstyle = "Bald" + set_hairstyle("Bald", update = FALSE) else - hairstyle = GLOB.hairstyles_list[deconstruct_block(get_uni_identity_block(structure, DNA_HAIRSTYLE_BLOCK), GLOB.hairstyles_list.len)] + var/style = GLOB.hairstyles_list[deconstruct_block(get_uni_identity_block(structure, DNA_HAIRSTYLE_BLOCK), GLOB.hairstyles_list.len)] + set_hairstyle(style, update = FALSE) var/features = dna.unique_features if(dna.features["mcolor"]) dna.features["mcolor"] = sanitize_hexcolor(get_uni_feature_block(features, DNA_MUTANT_COLOR_BLOCK)) @@ -632,10 +664,10 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) external_organ.mutate_feature(features, src) if(icon_update) - dna.species.handle_body(src) // We want 'update_body_parts(update_limb_data = TRUE)' to be called only if mutcolor_update is TRUE, so no 'update_body()' here. - update_body_parts() //We can call this because it doesnt refresh limb data, and it handles hair and such. if(mutcolor_update) - update_body_parts(update_limb_data = TRUE) + update_body(is_creating = TRUE) + else + update_body() if(mutations_overlay_update) update_mutations_overlay() @@ -832,8 +864,8 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) if(3) to_chat(src, span_notice("Oh, I actually feel quite alright!")) if(4) - to_chat(src, span_notice("Oh, I actually feel quite alright!")) //you thought - physiology.damage_resistance = -20000 + to_chat(src, span_notice("Oh, I actually feel quite alright!")) + physiology.damage_resistance -= 20000 //you thought if(5) to_chat(src, span_notice("Oh, I actually feel quite alright!")) reagents.add_reagent(/datum/reagent/aslimetoxin, 10) @@ -841,12 +873,12 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) apply_status_effect(/datum/status_effect/go_away) if(7) to_chat(src, span_notice("Oh, I actually feel quite alright!")) - ForceContractDisease(new/datum/disease/decloning()) //slow acting, non-viral clone damage based GBS + ForceContractDisease(new /datum/disease/decloning) // slow acting, non-viral GBS if(8) var/list/elligible_organs = list() for(var/obj/item/organ/internal/internal_organ in organs) //make sure we dont get an implant or cavity item elligible_organs += internal_organ - vomit(20, TRUE) + vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = 10) if(elligible_organs.len) var/obj/item/organ/O = pick(elligible_organs) O.Remove(src) @@ -861,14 +893,14 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) switch(rand(0,6)) if(0) investigate_log("has been gibbed by DNA instability.", INVESTIGATE_DEATHS) - gib() + gib(DROP_ALL_REMAINS) if(1) investigate_log("has been dusted by DNA instability.", INVESTIGATE_DEATHS) dust() if(2) investigate_log("has been transformed into a statue by DNA instability.", INVESTIGATE_DEATHS) death() - petrify(INFINITY) + petrify(statue_timer = INFINITY, save_brain = FALSE) ghostize(FALSE) if(3) if(prob(95)) @@ -877,7 +909,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) BP.dismember() else investigate_log("has been gibbed by DNA instability.", INVESTIGATE_DEATHS) - gib() + gib(DROP_ALL_REMAINS) else set_species(/datum/species/dullahan) if(4) diff --git a/code/datums/dog_fashion.dm b/code/datums/dog_fashion.dm index d35771027b351..c2154736cc0f0 100644 --- a/code/datums/dog_fashion.dm +++ b/code/datums/dog_fashion.dm @@ -1,41 +1,65 @@ /datum/dog_fashion - var/name - var/desc - var/emote_see - var/emote_hear - var/speak - var/speak_emote + ///Name modifier for the dog that we're dressing up + var/name = null + ///Description modifier for the dog that we're dressing up + var/desc = null + ///Hearable emotes modifier for the dog that we're dressing up + var/list/emote_hear = list() + ///Visible emotes modifier for the dog that we're dressing up + var/list/emote_see = list() + ///Speech modifier for the dog that we're dressing up + var/list/speak = list() + ///Speech verb modifier for the dog that we're dressing up + var/list/speak_emote = list() // This isn't applied to the dog, but stores the icon_state of the // sprite that the associated item uses - var/icon_file - var/obj_icon_state + ///Icon path for the fashion item + var/icon_file = null + ///Icon state for the fashion item + var/obj_icon_state = null + ///Alpha level (opacity) modifier of the fashion item var/obj_alpha + ///Color modifier of the fasion item var/obj_color -/datum/dog_fashion/New(mob/M) - name = replacetext(name, "REAL_NAME", M.real_name) - desc = replacetext(desc, "NAME", name) - -/datum/dog_fashion/proc/apply(mob/living/basic/pet/dog/D) +/datum/dog_fashion/New(mob/fashionable_mob) + //replace the placeholder for the real unmodified name in the name of the dog + name = replacetext(name, "%REAL_NAME%", fashionable_mob.real_name) + //replace the placeholder for the capitalized real unmodified name in the name of the dog + name = replacetext(name, "%CAPITAL_REAL_NAME%", capitalize(fashionable_mob.real_name)) + //replace the placeholder for the current full name, which includes our name modifiers + desc = replacetext(desc, "%NAME%", name) + //replace the placeholder for the real unmodified name in the description of the dog + desc = replacetext(desc, "%REAL_NAME%", fashionable_mob.real_name) + //replace the placeholder for the capitalized real unmodified name in the description of the dog + desc = replacetext(desc, "%CAPITAL_REAL_NAME%", capitalize(fashionable_mob.real_name)) + +///Applies the name, description and speak emote modifiers to the dog +/datum/dog_fashion/proc/apply(mob/living/basic/pet/dog/dressup_doggy) if(name) - D.name = name + dressup_doggy.name = name if(desc) - D.desc = desc - if(speak_emote) - D.speak_emote = string_list(speak_emote) + dressup_doggy.desc = desc + if(length(speak_emote)) + dressup_doggy.speak_emote = string_list(speak_emote) +///Applies random speech modifiers to the dog /datum/dog_fashion/proc/apply_to_speech(datum/ai_planning_subtree/random_speech/speech) - if(emote_see) + if(length(emote_see)) speech.emote_see = string_list(emote_see) - if(emote_hear) + if(length(emote_hear)) speech.emote_hear = string_list(emote_hear) - if(speak) + if(length(speak)) speech.speak = string_list(speak) +/** + * Generates the icon overlay for the equipped item + * dir: passed direction for the sprite, e.g. to apply to a dead dog, we use the EAST dir and just flip it 180. + */ /datum/dog_fashion/proc/get_overlay(dir) if(icon_file && obj_icon_state) - var/image/corgI = image(icon_file, obj_icon_state, dir = dir) + var/image/corgI = image(icon_file, icon_state = obj_icon_state, dir = dir) corgI.alpha = obj_alpha corgI.color = obj_color return corgI @@ -51,33 +75,32 @@ obj_icon_state = "armor" /datum/dog_fashion/back/deathsquad - name = "Trooper REAL_NAME" + name = "Trooper %REAL_NAME%" desc = "That's not red paint. That's real corgi blood." /datum/dog_fashion/head/helmet - name = "Sergeant REAL_NAME" + name = "Sergeant %REAL_NAME%" desc = "The ever-loyal, the ever-vigilant." /datum/dog_fashion/head/chef - name = "Sous chef REAL_NAME" + name = "Sous chef %REAL_NAME%" desc = "Your food will be taste-tested. All of it." - /datum/dog_fashion/head/captain - name = "Captain REAL_NAME" + name = "Captain %REAL_NAME%" desc = "Probably better than the last captain." /datum/dog_fashion/head/kitty name = "Runtime" + desc = "They're a cute little kitty-cat! ... wait ... what the hell?" emote_see = list("coughs up a furball", "stretches") emote_hear = list("purrs") speak = list("Purrr", "Meow!", "MAOOOOOW!", "HISSSSS", "MEEEEEEW") - desc = "They're a cute little kitty-cat! ... wait ... what the hell?" /datum/dog_fashion/head/rabbit name = "Hoppy" - emote_see = list("twitches their nose", "hops around a bit") desc = "This is Hoppy. They're a corgi-...urmm... bunny rabbit." + emote_see = list("twitches their nose", "hops around a bit") /datum/dog_fashion/head/beret name = "Yann" @@ -85,16 +108,14 @@ speak = list("le woof!", "le bark!", "JAPPE!!") emote_see = list("cowers in fear.", "surrenders.", "plays dead.","looks as though there is a wall in front of them.") - /datum/dog_fashion/head/detective - name = "Detective REAL_NAME" - desc = "NAME sees through your lies..." + name = "Detective %REAL_NAME%" + desc = "%NAME% sees through your lies..." emote_see = list("investigates the area.","sniffs around for clues.","searches for scooby snacks.","takes a candycorn from the hat.") - /datum/dog_fashion/head/nurse - name = "Nurse REAL_NAME" - desc = "NAME needs 100cc of beef jerky... STAT!" + name = "Nurse %REAL_NAME%" + desc = "%NAME% needs 100cc of beef jerky... STAT!" /datum/dog_fashion/head/pirate name = "Pirate-title Pirate-name" @@ -104,7 +125,7 @@ speak = list("Arrrrgh!!","Grrrrrr!") /datum/dog_fashion/head/pirate/New(mob/M) - ..() + . = ..() name = "[pick("Ol'","Scurvy","Black","Rum","Gammy","Bloody","Gangrene","Death","Long-John")] [pick("kibble","leg","beard","tooth","poop-deck","Threepwood","Le Chuck","corsair","Silver","Crusoe")]" /datum/dog_fashion/head/ushanka @@ -113,85 +134,81 @@ emote_see = list("contemplates the failings of the capitalist economic model.", "ponders the pros and cons of vanguardism.") /datum/dog_fashion/head/ushanka/New(mob/M) - ..() - name = "[pick("Comrade","Commissar","Glorious Leader")] [M.real_name]" + name = "[pick("Comrade","Commissar","Glorious Leader")] %REAL_NAME%" + return ..() /datum/dog_fashion/head/warden - name = "Officer REAL_NAME" - emote_see = list("drools.","looks for donuts.") + name = "Officer %REAL_NAME%" desc = "Stop right there criminal scum!" + emote_see = list("drools.","looks for donuts.") /datum/dog_fashion/head/warden_red - name = "Officer REAL_NAME" - emote_see = list("drools.","looks for donuts.") + name = "Officer %REAL_NAME%" desc = "Stop right there criminal scum!" + emote_see = list("drools.","looks for donuts.") /datum/dog_fashion/head/blue_wizard - name = "Grandwizard REAL_NAME" + name = "Grandwizard %REAL_NAME%" speak = list("YAP", "Woof!", "Bark!", "AUUUUUU", "EI NATH!") /datum/dog_fashion/head/red_wizard - name = "Pyromancer REAL_NAME" + name = "Pyromancer %REAL_NAME%" speak = list("YAP", "Woof!", "Bark!", "AUUUUUU", "ONI SOMA!") /datum/dog_fashion/head/cardborg name = "Borgi" + desc = "Result of robotics budget cuts." speak = list("Ping!","Beep!","Woof!") emote_see = list("goes rogue.", "sniffs out non-humans.") - desc = "Result of robotics budget cuts." /datum/dog_fashion/head/ghost name = "\improper Ghost" + desc = "Spooky!" + obj_icon_state = "sheet" speak = list("WoooOOOooo~","AUUUUUUUUUUUUUUUUUU") emote_see = list("stumbles around.", "shivers.") emote_hear = list("howls!","groans.") - desc = "Spooky!" - obj_icon_state = "sheet" /datum/dog_fashion/head/santa name = "Santa's Corgi Helper" + desc = "They're very fond of milk and cookies." emote_hear = list("barks Christmas songs.", "yaps merrily!") emote_see = list("looks for presents.", "checks their list.") - desc = "They're very fond of milk and cookies." /datum/dog_fashion/head/cargo_tech - name = "Corgi Tech REAL_NAME" + name = "Corgi Tech %REAL_NAME%" desc = "The reason your yellow gloves have chew-marks." /datum/dog_fashion/head/reindeer - name = "REAL_NAME the red-nosed Corgi" - emote_hear = list("lights the way!", "illuminates.", "yaps!") + name = "%REAL_NAME% the red-nosed Corgi" desc = "They have a very shiny nose." + emote_hear = list("lights the way!", "illuminates.", "yaps!") /datum/dog_fashion/head/sombrero - name = "Segnor REAL_NAME" - desc = "You must respect Elder Dogname" - -/datum/dog_fashion/head/sombrero/New(mob/M) - ..() - desc = "You must respect Elder [M.real_name]." + name = "Segnor %REAL_NAME%" + desc = "You must respect Elder %REAL_NAME%." /datum/dog_fashion/head/hop - name = "Lieutenant REAL_NAME" + name = "Lieutenant %REAL_NAME%" desc = "Can actually be trusted to not run off on their own." /datum/dog_fashion/head/deathsquad - name = "Trooper REAL_NAME" + name = "Trooper %REAL_NAME%" desc = "That's not red paint. That's real corgi blood." /datum/dog_fashion/head/clown - name = "REAL_NAME the Clown" + name = "%REAL_NAME% the Clown" desc = "Honkman's best friend." speak = list("HONK!", "Honk!") emote_see = list("plays tricks.", "slips.") /datum/dog_fashion/head/festive - name = "Festive REAL_NAME" + name = "Festive %REAL_NAME%" desc = "Ready to party!" obj_icon_state = "festive" /datum/dog_fashion/head/pumpkin/unlit - name = "Headless HoP-less REAL_NAME" + name = "Headless HoP-less %REAL_NAME%" desc = "A spooky dog spirit of a beloved pet who lost their owner." obj_icon_state = "pumpkin0" speak = list("BOO!", "AUUUUUUU", "RAAARGH!") @@ -202,7 +219,7 @@ obj_icon_state = "pumpkin1" /datum/dog_fashion/head/blumpkin/unlit - name = "Hue-less Headless HoP-less REAL_NAME" + name = "Hue-less Headless HoP-less %REAL_NAME%" desc = "An evil dog spirit of a beloved pet that haunts your treats pantries!" obj_icon_state = "blumpkin0" speak = list("BOO!", "AUUUUUUU", "RAAARGH!") @@ -211,3 +228,18 @@ /datum/dog_fashion/head/blumpkin/lit obj_icon_state = "blumpkin1" + +/datum/dog_fashion/head/butter + name = "Butter %REAL_NAME%" + desc = "%NAME%. %CAPITAL_REAL_NAME% with the butter. %NAME%. %CAPITAL_REAL_NAME% with a butter on 'em." + obj_icon_state = "butter" + speak = list() //they're very patient and focused on holding the butter on 'em + emote_see = list("shakes a little.", "looks around.") + emote_hear = list("licks a trickle of the butter up.", "smiles.") + +/datum/dog_fashion/head/eyepatch + name = "Punished %REAL_NAME%" + desc = "%REAL_NAME% has really been going through it today." + obj_icon_state = "eyepatch" + emote_hear = list("sighs gruffly.", "groans.") + emote_see = list("considers their own mortality.", "stares bleakly into the middle distance.", "ponders the horrors of warfare.") diff --git a/code/datums/elements/_element.dm b/code/datums/elements/_element.dm index ee1d5a9af9ac1..ae4cb55330de8 100644 --- a/code/datums/elements/_element.dm +++ b/code/datums/elements/_element.dm @@ -53,6 +53,8 @@ if(QDELING(src)) CRASH("We just tried to add an element to a qdeleted datum, something is fucked") var/datum/element/ele = SSdcs.GetElement(arguments) + if(!ele) // We couldn't fetch the element, likely because it was not an element. + return // the crash message has already been sent arguments[1] = src if(ele.Attach(arglist(arguments)) == ELEMENT_INCOMPATIBLE) CRASH("Incompatible element [ele.type] was assigned to a [type]! args: [json_encode(args)]") @@ -62,7 +64,9 @@ * You only need additional arguments beyond the type if you're using [ELEMENT_BESPOKE] */ /datum/proc/_RemoveElement(list/arguments) - var/datum/element/ele = SSdcs.GetElement(arguments) + var/datum/element/ele = SSdcs.GetElement(arguments, FALSE) + if(!ele) // We couldn't fetch the element, likely because it didn't exist. + return if(ele.element_flags & ELEMENT_COMPLEX_DETACH) arguments[1] = src ele.Detach(arglist(arguments)) diff --git a/code/datums/elements/ai_held_item.dm b/code/datums/elements/ai_held_item.dm index ba8a17f3f012e..053a1827fb23d 100644 --- a/code/datums/elements/ai_held_item.dm +++ b/code/datums/elements/ai_held_item.dm @@ -54,7 +54,7 @@ var/obj/item/carried_item = get_held_item(source) if (!carried_item) return - examine_text += span_notice("[source.p_they(TRUE)] [source.p_are()] carrying [carried_item.get_examine_string(user)].") + examine_text += span_notice("[source.p_They()] [source.p_are()] carrying [carried_item.get_examine_string(user)].") /// If we died, drop anything we were carrying /datum/element/ai_held_item/proc/on_death(mob/living/ol_yeller) diff --git a/code/datums/elements/ai_retaliate.dm b/code/datums/elements/ai_retaliate.dm index 3fb8494a99e94..4cca4089633bc 100644 --- a/code/datums/elements/ai_retaliate.dm +++ b/code/datums/elements/ai_retaliate.dm @@ -12,6 +12,8 @@ target.AddElement(/datum/element/relay_attackers) RegisterSignal(target, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked)) + ADD_TRAIT(target, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, type) + /datum/element/ai_retaliate/Detach(datum/source, ...) . = ..() UnregisterSignal(source, COMSIG_ATOM_WAS_ATTACKED) diff --git a/code/datums/elements/amputating_limbs.dm b/code/datums/elements/amputating_limbs.dm new file mode 100644 index 0000000000000..f7e3d08fcc4fa --- /dev/null +++ b/code/datums/elements/amputating_limbs.dm @@ -0,0 +1,74 @@ +/// This component will intercept bare-handed attacks by the owner on critically injured carbons and amputate random limbs instead +/datum/element/amputating_limbs + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + /// How long does it take? + var/surgery_time + /// What is the means by which we describe the act of amputation? + var/surgery_verb + /// How awake must our target be? + var/minimum_stat + /// How likely are we to perform this action? + var/snip_chance + /// The types of limb we can remove + var/list/target_zones + +/datum/element/amputating_limbs/Attach( + datum/target, + surgery_time = 5 SECONDS, + surgery_verb = "prying", + minimum_stat = SOFT_CRIT, + snip_chance = 100, + list/target_zones = list(BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_ARM, BODY_ZONE_R_LEG), +) + . = ..() + if (!isliving(target)) + return ELEMENT_INCOMPATIBLE + if (!length(target_zones)) + CRASH("[src] for [target] was not provided a valid list of body zones to target.") + + src.surgery_time = surgery_time + src.surgery_verb = surgery_verb + src.minimum_stat = minimum_stat + src.snip_chance = snip_chance + src.target_zones = target_zones + RegisterSignals(target, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_HOSTILE_PRE_ATTACKINGTARGET), PROC_REF(try_amputate)) + +/datum/element/amputating_limbs/Detach(datum/source) + UnregisterSignal(source, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_HOSTILE_PRE_ATTACKINGTARGET)) + return ..() + +/// Called when you click on literally anything with your hands, see if it is an injured carbon and then try to cut it up +/datum/element/amputating_limbs/proc/try_amputate(mob/living/surgeon, atom/victim) + SIGNAL_HANDLER + if (!iscarbon(victim) || HAS_TRAIT(victim, TRAIT_NODISMEMBER) || !prob(snip_chance)) + return + + var/mob/living/carbon/limbed_victim = victim + if (limbed_victim.stat < minimum_stat) + return + + if (DOING_INTERACTION_WITH_TARGET(surgeon, victim)) + surgeon.balloon_alert(surgeon, "already busy!") + return COMPONENT_CANCEL_ATTACK_CHAIN + + var/list/valid_targets = list() + for (var/obj/item/bodypart/possible_target as anything in limbed_victim.bodyparts) + if (possible_target.bodypart_flags & BODYPART_UNREMOVABLE) + continue + if (!(possible_target.body_zone in target_zones)) + continue + valid_targets += possible_target + + if (!length(valid_targets)) + return + + INVOKE_ASYNC(src, PROC_REF(amputate), surgeon, victim, pick(valid_targets)) + return COMPONENT_CANCEL_ATTACK_CHAIN + +/// Chop one off +/datum/element/amputating_limbs/proc/amputate(mob/living/surgeon, mob/living/carbon/victim, obj/item/bodypart/to_remove) + surgeon.visible_message(span_warning("[surgeon] begins [surgery_verb] [to_remove] off of [victim]!")) + if (surgery_time > 0 && !do_after(surgeon, delay = surgery_time, target = victim)) + return + to_remove.dismember() diff --git a/code/datums/elements/art.dm b/code/datums/elements/art.dm index 4f418ad0e4ff8..81d388aa94af8 100644 --- a/code/datums/elements/art.dm +++ b/code/datums/elements/art.dm @@ -24,10 +24,10 @@ msg = "What \a [pick("masterpiece", "chef-d'oeuvre")]. So [pick("trascended", "awe-inspiring", "bewitching", "impeccable")]!" if (GOOD_ART to GREAT_ART) user.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." + msg = "[source.p_Theyre()] a [pick("respectable", "commendable", "laudable")] art piece, easy on the keen eye." if (BAD_ART to GOOD_ART) user.add_mood_event("artok", /datum/mood_event/artok) - msg = "[source.p_theyre(TRUE)] fair to middling, enough to be called an \"art object\"." + msg = "[source.p_Theyre()] fair to middling, enough to be called an \"art object\"." if (0 to BAD_ART) user.add_mood_event("artbad", /datum/mood_event/artbad) msg = "Wow, [source.p_they()] sucks." diff --git a/code/datums/elements/atmos_requirements.dm b/code/datums/elements/atmos_requirements.dm index b863697d08a09..1ac10f0202749 100644 --- a/code/datums/elements/atmos_requirements.dm +++ b/code/datums/elements/atmos_requirements.dm @@ -46,10 +46,10 @@ return FALSE var/open_turf_gases = open_turf.air.gases - open_turf.air.assert_gases(/datum/gas/oxygen, /datum/gas/nitrogen, /datum/gas/carbon_dioxide, /datum/gas/plasma) + open_turf.air.assert_gases(/datum/gas/oxygen, /datum/gas/pluoxium, /datum/gas/nitrogen, /datum/gas/carbon_dioxide, /datum/gas/plasma) var/plas = open_turf_gases[/datum/gas/plasma][MOLES] - var/oxy = open_turf_gases[/datum/gas/oxygen][MOLES] + var/oxy = open_turf_gases[/datum/gas/oxygen][MOLES] + (open_turf_gases[/datum/gas/pluoxium][MOLES] * PLUOXIUM_PROPORTION) var/n2 = open_turf_gases[/datum/gas/nitrogen][MOLES] var/co2 = open_turf_gases[/datum/gas/carbon_dioxide][MOLES] diff --git a/code/datums/elements/atmos_sensitive.dm b/code/datums/elements/atmos_sensitive.dm index dabcc808d2ace..4bc66246659bc 100644 --- a/code/datums/elements/atmos_sensitive.dm +++ b/code/datums/elements/atmos_sensitive.dm @@ -4,13 +4,13 @@ //Don't put it on things that tend to clump into one spot, you will cause lag spikes. /datum/element/atmos_sensitive element_flags = ELEMENT_DETACH_ON_HOST_DESTROY - var/static/list/pass_on = list(COMSIG_TURF_EXPOSE = /atom/proc/check_atmos_process) /datum/element/atmos_sensitive/Attach(datum/target, mapload) if(!isatom(target)) //How return ELEMENT_INCOMPATIBLE var/atom/to_track = target - to_track.AddElement(/datum/element/connect_loc, pass_on) + if(to_track.loc) + to_track.RegisterSignal(to_track.loc, COMSIG_TURF_EXPOSE, TYPE_PROC_REF(/atom, check_atmos_process)) RegisterSignal(to_track, COMSIG_MOVABLE_MOVED, PROC_REF(react_to_move)) if(!mapload && isopenturf(to_track.loc)) @@ -18,21 +18,24 @@ return ..() -/datum/element/atmos_sensitive/Detach(datum/source) - var/atom/us = source - us.RemoveElement(/datum/element/connect_loc, pass_on) +/datum/element/atmos_sensitive/Detach(atom/source) + if(source.loc) + UnregisterSignal(source.loc, COMSIG_TURF_EXPOSE) UnregisterSignal(source, COMSIG_MOVABLE_MOVED) - if(us.flags_1 & ATMOS_IS_PROCESSING_1) - us.atmos_end() - SSair.atom_process -= us - us.flags_1 &= ~ATMOS_IS_PROCESSING_1 + if(source.flags_1 & ATMOS_IS_PROCESSING_1) + source.atmos_end() + SSair.atom_process -= source + source.flags_1 &= ~ATMOS_IS_PROCESSING_1 return ..() -/datum/element/atmos_sensitive/proc/react_to_move(datum/source, atom/movable/oldloc, direction, forced) +/datum/element/atmos_sensitive/proc/react_to_move(atom/source, atom/movable/oldloc, direction, forced) SIGNAL_HANDLER - var/atom/atom_source = source - atom_source.atmos_conditions_changed() //Make sure you're properly registered + if(oldloc) + source.UnregisterSignal(oldloc, COMSIG_TURF_EXPOSE) + if(source.loc) + source.RegisterSignal(source.loc, COMSIG_TURF_EXPOSE, TYPE_PROC_REF(/atom, check_atmos_process)) + source.atmos_conditions_changed() //Make sure you're properly registered /atom/proc/check_atmos_process(datum/source, datum/gas_mixture/air, exposed_temperature) SIGNAL_HANDLER diff --git a/code/datums/elements/bed_tucking.dm b/code/datums/elements/bed_tucking.dm index d5030a44ebdf3..70b10d4a58c0c 100644 --- a/code/datums/elements/bed_tucking.dm +++ b/code/datums/elements/bed_tucking.dm @@ -19,11 +19,11 @@ x_offset = x y_offset = y starting_angle = rotation - RegisterSignal(target, COMSIG_ITEM_ATTACK_OBJ, PROC_REF(tuck_into_bed)) + RegisterSignal(target, COMSIG_ITEM_ATTACK_ATOM, PROC_REF(tuck_into_bed)) /datum/element/bed_tuckable/Detach(obj/target) . = ..() - UnregisterSignal(target, list(COMSIG_ITEM_ATTACK_OBJ, COMSIG_ITEM_PICKUP)) + UnregisterSignal(target, list(COMSIG_ITEM_ATTACK_ATOM, COMSIG_ITEM_PICKUP)) /** * Tuck our object into bed. diff --git a/code/datums/elements/befriend_petting.dm b/code/datums/elements/befriend_petting.dm index 26972e3aeff63..085a0651376e9 100644 --- a/code/datums/elements/befriend_petting.dm +++ b/code/datums/elements/befriend_petting.dm @@ -36,7 +36,7 @@ if (user.combat_mode) return // We'll deal with this later if (owner.stat == DEAD) - var/additional_text = HAS_TRAIT(user.mind, TRAIT_NAIVE) ? "It looks like [owner.p_theyre()] sleeping." : "[owner.p_they(capitalized = TRUE)] seem[owner.p_s()] to be dead." + var/additional_text = HAS_MIND_TRAIT(user, TRAIT_NAIVE) ? "It looks like [owner.p_theyre()] sleeping." : "[owner.p_They()] seem[owner.p_s()] to be dead." to_chat(user, span_warning("[owner] feels cold to the touch. [additional_text]")) return if (owner.stat != CONSCIOUS) diff --git a/code/datums/elements/bombable_turf.dm b/code/datums/elements/bombable_turf.dm new file mode 100644 index 0000000000000..11a83c79340f9 --- /dev/null +++ b/code/datums/elements/bombable_turf.dm @@ -0,0 +1,45 @@ +/** + * Apply this to a turf (usually a wall) and it will be destroyed instantly by any explosion. + * Most walls can already be destroyed by explosions so this is largely for usually indestructible ones. + * For applying it in a map editor, use /obj/effect/mapping_helpers/bombable_wall + */ +/datum/element/bombable_turf + +/datum/element/bombable_turf/Attach(turf/target) + . = ..() + if(!isturf(target)) + return ELEMENT_INCOMPATIBLE + target.explosive_resistance = 1 + + RegisterSignal(target, COMSIG_ATOM_EX_ACT, PROC_REF(detonate)) + RegisterSignal(target, COMSIG_TURF_CHANGE, PROC_REF(turf_changed)) + RegisterSignal(target, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_update_overlays)) + RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examined)) + + target.update_appearance(UPDATE_OVERLAYS) + +/datum/element/bombable_turf/Detach(turf/source) + UnregisterSignal(source, list(COMSIG_ATOM_EX_ACT, COMSIG_TURF_CHANGE, COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_ATOM_EXAMINE)) + source.explosive_resistance = initial(source.explosive_resistance) + source.update_appearance(UPDATE_OVERLAYS) + return ..() + +/// If we get blowed up, move to the next turf +/datum/element/bombable_turf/proc/detonate(turf/source) + SIGNAL_HANDLER + source.ScrapeAway() + +/// If this turf becomes something else we either just went off or regardless don't want this any more +/datum/element/bombable_turf/proc/turf_changed(turf/source) + SIGNAL_HANDLER + Detach(source) + +/// Show a little crack on here +/datum/element/bombable_turf/proc/on_update_overlays(turf/source, list/overlays) + SIGNAL_HANDLER + overlays += mutable_appearance('icons/turf/overlays.dmi', "explodable", source.layer + 0.1) + +/// Show a little extra on examine +/datum/element/bombable_turf/proc/on_examined(turf/source, mob/user, list/examine_list) + SIGNAL_HANDLER + examine_list += span_notice("It seems to be slightly cracked...") diff --git a/code/datums/elements/bonus_damage.dm b/code/datums/elements/bonus_damage.dm new file mode 100644 index 0000000000000..1fce0672c5157 --- /dev/null +++ b/code/datums/elements/bonus_damage.dm @@ -0,0 +1,35 @@ +/** + * Attached to a mob that will then deal bonus damage to a victim with low, or potentially in the future, high health. + */ +/datum/element/bonus_damage + /// At which percentage our target has to be for us to deal bonus damage + var/damage_percentage + /// The amount of brute damage we will deal + var/brute_damage_amount + +/datum/element/bonus_damage/Attach(datum/target, damage_percentage = 20, brute_damage_amount = 15) + . = ..() + if(!isliving(target)) + return ELEMENT_INCOMPATIBLE + + src.damage_percentage = damage_percentage + src.brute_damage_amount = brute_damage_amount + RegisterSignal(target, COMSIG_HOSTILE_POST_ATTACKINGTARGET, PROC_REF(attack_target)) + +/datum/element/bonus_damage/Detach(datum/source) + UnregisterSignal(source, COMSIG_HOSTILE_POST_ATTACKINGTARGET) + return ..() + +/// Add potential bonus damage to the person we attacked +/datum/element/bonus_damage/proc/attack_target(mob/living/attacker, atom/target, success) + SIGNAL_HANDLER + + if(!success) + return + if(!isliving(target)) + return + var/mob/living/living_target = target + var/health_percentage = (living_target.health / living_target.maxHealth) * 100 + if(living_target.stat == DEAD || health_percentage > damage_percentage) + return + living_target.adjustBruteLoss(brute_damage_amount) diff --git a/code/datums/elements/bugkiller_reagent.dm b/code/datums/elements/bugkiller_reagent.dm new file mode 100644 index 0000000000000..57f2ae65d9209 --- /dev/null +++ b/code/datums/elements/bugkiller_reagent.dm @@ -0,0 +1,88 @@ +/// Simple element to be applied to reagents +/// When those reagents are exposed to mobs with the bug biotype, causes toxins damage +/// If this delivers the killing blow on a non-humanoid mob, it applies a special status effect that does a funny animation +/datum/element/bugkiller_reagent + +/datum/element/bugkiller_reagent/Attach(datum/target) + . = ..() + if(!istype(target, /datum/reagent)) + return + + RegisterSignal(target, COMSIG_REAGENT_EXPOSE_MOB, PROC_REF(on_expose)) + +/datum/element/bugkiller_reagent/Detach(datum/source, ...) + . = ..() + UnregisterSignal(source, COMSIG_REAGENT_EXPOSE_MOB) + +/datum/element/bugkiller_reagent/proc/on_expose( + datum/reagent/source, + mob/living/exposed_mob, + methods = TOUCH, + reac_volume, + show_message = TRUE, + touch_protection = 0, +) + SIGNAL_HANDLER + + if(exposed_mob.stat == DEAD) + return + if(!(exposed_mob.mob_biotypes & MOB_BUG)) + return + + // capping damage so splashing a beaker on a moth is not an instant crit + var/damage = min(round(0.4 * reac_volume * (1 - touch_protection), 0.1), 12) + if(damage < 1) + return + + if(!(exposed_mob.mob_biotypes & MOB_HUMANOID) && exposed_mob.health <= damage) + // no-ops if they are already in the process of dying + exposed_mob.apply_status_effect(/datum/status_effect/bugkiller_death) + return + + if(exposed_mob.apply_damage(damage, TOX) && damage >= 6) + // yes i know it's not burn damage. the burning is on the inside. + to_chat(exposed_mob, span_danger("You feel a burning sensation.")) + +/// If bugkiller delivers a lethal dosage, applies this effect which does a funny animation THEN kills 'em +/// Also makes it so simplemobs / basicmobs no longer delete when they die (if they do) +/datum/status_effect/bugkiller_death + id = "bugkiller_death" + alert_type = /atom/movable/screen/alert/status_effect/bugkiller_death + /// How many times the spasm loops + var/spasm_loops = 0 + +/datum/status_effect/bugkiller_death/on_creation(mob/living/new_other, duration = 4 SECONDS) + src.duration = duration + src.spasm_loops = ROUND_UP(duration / 0.8) // one spasm ~= 0.8 deciseconds (yes deciseconds) + return ..() + +/datum/status_effect/bugkiller_death/on_apply() + if(owner.stat == DEAD) + return FALSE + playsound(owner, 'sound/voice/human/malescream_1.ogg', 25, TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, frequency = 5) + to_chat(owner, span_userdanger("The world begins to go dark...")) + owner.spasm_animation(spasm_loops) + owner.adjust_eye_blur(duration) + return TRUE + +/datum/status_effect/bugkiller_death/on_remove() + if(owner.stat == DEAD || QDELETED(owner)) + return + + if(isbasicmob(owner)) + var/mob/living/basic/basic_owner = owner + basic_owner.basic_mob_flags &= ~DEL_ON_DEATH + basic_owner.basic_mob_flags |= FLIP_ON_DEATH + + if(isanimal(owner)) + var/mob/living/simple_animal/simple_owner = owner + simple_owner.del_on_death = FALSE + simple_owner.flip_on_death = TRUE + + owner.investigate_log("died to being sprayed with bugkiller.", INVESTIGATE_DEATHS) + owner.death() + +/atom/movable/screen/alert/status_effect/bugkiller_death + name = "Overwhelming Toxicity" + desc = "Don't go into the light!" + icon_state = "paralysis" diff --git a/code/datums/elements/can_barricade.dm b/code/datums/elements/can_barricade.dm index 49be7f5aafdfd..175738be5f62e 100644 --- a/code/datums/elements/can_barricade.dm +++ b/code/datums/elements/can_barricade.dm @@ -11,23 +11,18 @@ return ELEMENT_INCOMPATIBLE RegisterSignal(target, COMSIG_ATOM_ATTACKBY, PROC_REF(on_start_barricade)) - RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) target.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1 RegisterSignal(target, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_requesting_context_from_item)) /datum/element/can_barricade/Detach(atom/target) - UnregisterSignal(target, list(COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_EXAMINE, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM)) + UnregisterSignal(target, list(COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM)) // We don't remove HAS_CONTEXTUAL_SCREENTIPS_1, since there could be other stuff still hooked to it, // and being set without signals is not dangerous, just less performant. // A lot of things don't do this, perhaps make a proc that checks if any signals are still set, and if not, // remove the flag. return ..() -/datum/element/can_barricade/proc/on_examine(atom/source, mob/user, list/examine_texts) - SIGNAL_HANDLER - examine_texts += span_notice("This looks like it can be barricaded with planks of wood.") - /datum/element/can_barricade/proc/on_start_barricade(atom/source, obj/item/stack/sheet/mineral/wood/plank, mob/living/user, params) SIGNAL_HANDLER diff --git a/code/datums/elements/caseless.dm b/code/datums/elements/caseless.dm new file mode 100644 index 0000000000000..a8a1d3df3e4f0 --- /dev/null +++ b/code/datums/elements/caseless.dm @@ -0,0 +1,29 @@ +/** + * An element that deletes the casing when fired and, if reusable is true, adds the projectile_drop element to the bullet. + * Just make sure to not add components or elements that also use COMSIG_FIRE_CASING after this one. + * Not compatible with pellets (how the eff would that work in a senible way tho?). + */ +/datum/element/caseless + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + var/reusable = FALSE + +/datum/element/caseless/Attach(datum/target, reusable = FALSE) + . = ..() + if(!isammocasing(target)) + return ELEMENT_INCOMPATIBLE + src.reusable = reusable + RegisterSignal(target, COMSIG_FIRE_CASING, PROC_REF(on_fired_casing)) + +/datum/element/caseless/proc/on_fired_casing(obj/item/ammo_casing/shell, atom/target, mob/living/user, fired_from, randomspread, spread, zone_override, params, distro, obj/projectile/proj) + SIGNAL_HANDLER + if(isnull(proj)) + return + if(reusable) + proj.AddElement(/datum/element/projectile_drop, shell.type) + + if(isgun(fired_from)) + var/obj/item/gun/shot_from = fired_from + if(shot_from.chambered == shell) + shot_from.chambered = null //Nuke it. Nuke it now. + QDEL_NULL(shell) diff --git a/code/datums/elements/chemical_transfer.dm b/code/datums/elements/chemical_transfer.dm index 09391cbf39041..9802f0cc059af 100644 --- a/code/datums/elements/chemical_transfer.dm +++ b/code/datums/elements/chemical_transfer.dm @@ -58,7 +58,7 @@ return var/built_attacker_message = replacetext(attacker_message, "%VICTIM", transfer_victim) var/built_victim_message = replacetext(attacker_message, "%ATTACKER", transfer_attacker) - transfer_attacker.reagents?.trans_to(transfer_victim, transfer_attacker.reagents.total_volume, multiplier = 1, preserve_data = 1, no_react = 0, transfered_by = transfer_attacker) + transfer_attacker.reagents?.trans_to(transfer_victim, transfer_attacker.reagents.total_volume, multiplier = 1, preserve_data = 1, no_react = 0, transferred_by = transfer_attacker) to_chat(transfer_attacker, built_attacker_message) to_chat(transfer_victim, built_victim_message) diff --git a/code/datums/elements/cliff_walker.dm b/code/datums/elements/cliff_walker.dm new file mode 100644 index 0000000000000..063349b7ddc14 --- /dev/null +++ b/code/datums/elements/cliff_walker.dm @@ -0,0 +1,34 @@ +/// Lets a mob walk cliffs and keeps track of if they're alive or not to add/remove the trait +/datum/element/cliff_walking + +/datum/element/cliff_walking/Attach(datum/target, climb_time, climb_stun) + . = ..() + + if(!isliving(target)) + return ELEMENT_INCOMPATIBLE + + // Feel free to add more bespoke signals here if this gets implemented for more than just a few funny mobs + RegisterSignals(target, list(COMSIG_LIVING_DEATH, COMSIG_LIVING_REVIVE), PROC_REF(update_cliff_walking)) + + update_cliff_walking(target) + +/datum/element/cliff_walking/Detach(datum/source, ...) + . = ..() + + UnregisterSignal(source, list(COMSIG_LIVING_DEATH, COMSIG_LIVING_REVIVE)) + +/// Do some checks to see if we should walk the cliffs +/datum/element/cliff_walking/proc/update_cliff_walking(mob/living/climber) + SIGNAL_HANDLER + + if(climber.stat != DEAD) + ADD_TRAIT(climber, TRAIT_CLIFF_WALKER, type) + return + + REMOVE_TRAIT(climber, TRAIT_CLIFF_WALKER, type) + + var/turf/open/cliff/cliff_tile = get_turf(climber) + if(!iscliffturf(cliff_tile)) + return + + cliff_tile.try_fall(climber) diff --git a/code/datums/elements/climbable.dm b/code/datums/elements/climbable.dm index 17833e4d432cf..e953766571c2e 100644 --- a/code/datums/elements/climbable.dm +++ b/code/datums/elements/climbable.dm @@ -2,21 +2,23 @@ element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH_ON_HOST_DESTROY // Detach for turfs argument_hash_start_idx = 2 ///Time it takes to climb onto the object - var/climb_time = (2 SECONDS) + var/climb_time ///Stun duration for when you get onto the object - var/climb_stun = (2 SECONDS) + var/climb_stun ///Assoc list of object being climbed on - climbers. This allows us to check who needs to be shoved off a climbable object when its clicked on. var/list/current_climbers -/datum/element/climbable/Attach(datum/target, climb_time, climb_stun) +/datum/element/climbable/Attach( + datum/target, + climb_time = 2 SECONDS, + climb_stun = 2 SECONDS, +) . = ..() if(!isatom(target) || isarea(target)) return ELEMENT_INCOMPATIBLE - if(climb_time) - src.climb_time = climb_time - if(climb_stun) - src.climb_stun = climb_stun + src.climb_time = climb_time + src.climb_stun = climb_stun RegisterSignal(target, COMSIG_ATOM_ATTACK_HAND, PROC_REF(attack_hand)) RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) @@ -68,6 +70,9 @@ if(HAS_TRAIT(user, TRAIT_FREERUNNING)) //do you have any idea how fast I am??? adjusted_climb_time *= 0.8 adjusted_climb_stun *= 0.8 + if(HAS_TRAIT(user, TRAIT_SETTLER)) //hold on, gimme a moment, my tiny legs can't get over the goshdamn table + adjusted_climb_time *= 1.5 + adjusted_climb_stun *= 1.5 LAZYADDASSOCLIST(current_climbers, climbed_thing, user) if(do_after(user, adjusted_climb_time, climbed_thing)) if(QDELETED(climbed_thing)) //Checking if structure has been destroyed diff --git a/code/datums/elements/connect_loc.dm b/code/datums/elements/connect_loc.dm index e6aecbe6aded2..32b3b50b783ac 100644 --- a/code/datums/elements/connect_loc.dm +++ b/code/datums/elements/connect_loc.dm @@ -1,7 +1,7 @@ /// This element hooks a signal onto the loc the current object is on. /// When the object moves, it will unhook the signal and rehook it to the new object. /datum/element/connect_loc - element_flags = ELEMENT_BESPOKE + element_flags = ELEMENT_BESPOKE|ELEMENT_NO_LIST_UNIT_TEST argument_hash_start_idx = 2 /// An assoc list of signal -> procpath to register to the loc this object is on. diff --git a/code/datums/elements/content_barfer.dm b/code/datums/elements/content_barfer.dm index 782574a222175..e30294bc08a7f 100644 --- a/code/datums/elements/content_barfer.dm +++ b/code/datums/elements/content_barfer.dm @@ -4,18 +4,17 @@ * Used for morphs and bileworms! */ /datum/element/content_barfer - argument_hash_start_idx = 2 -/datum/element/content_barfer/Attach(datum/target, tally_string) +/datum/element/content_barfer/Attach(datum/target) . = ..() if(!isliving(target)) return ELEMENT_INCOMPATIBLE - RegisterSignals(target, list(COMSIG_LIVING_DEATH, COMSIG_LIVING_ON_WABBAJACKED), PROC_REF(barf_contents)) + RegisterSignals(target, list(COMSIG_LIVING_DEATH, COMSIG_LIVING_ON_WABBAJACKED, COMSIG_LIVING_UNSHAPESHIFTED, COMSIG_MOB_CHANGED_TYPE), PROC_REF(barf_contents)) /datum/element/content_barfer/Detach(datum/target) - UnregisterSignal(target, list(COMSIG_LIVING_DEATH, COMSIG_LIVING_ON_WABBAJACKED)) + UnregisterSignal(target, list(COMSIG_LIVING_DEATH, COMSIG_LIVING_ON_WABBAJACKED, COMSIG_LIVING_UNSHAPESHIFTED, COMSIG_MOB_CHANGED_TYPE)) return ..() /datum/element/content_barfer/proc/barf_contents(mob/living/target) diff --git a/code/datums/elements/cuffsnapping.dm b/code/datums/elements/cuffsnapping.dm index 19a59bd4c7ccf..c0dfdcf60913b 100644 --- a/code/datums/elements/cuffsnapping.dm +++ b/code/datums/elements/cuffsnapping.dm @@ -68,6 +68,9 @@ /datum/element/cuffsnapping/proc/try_cuffsnap_target(obj/item/cutter, mob/living/carbon/target, mob/cutter_user, params) SIGNAL_HANDLER + if(!istype(target)) //we aren't the kind of mob that can even have cuffs, so we skip. + return + if(!target.handcuffed) return diff --git a/code/datums/elements/dangerous_surgical_removal.dm b/code/datums/elements/dangerous_surgical_removal.dm new file mode 100644 index 0000000000000..a0dea1c8bdbd0 --- /dev/null +++ b/code/datums/elements/dangerous_surgical_removal.dm @@ -0,0 +1,29 @@ +/** + * ## DANGEROUS SURGICAL REMOVAL ELEMENT + * + * Makes the organ explode when removed surgically. + * That's about it. + */ +/datum/element/dangerous_surgical_removal + +/datum/element/dangerous_surgical_removal/Attach(datum/target) + . = ..() + if(!isorgan(target)) + return ELEMENT_INCOMPATIBLE + RegisterSignal(target, COMSIG_ORGAN_SURGICALLY_REMOVED, PROC_REF(on_surgical_removal)) + +/datum/element/dangerous_surgical_removal/Detach(datum/source) + . = ..() + UnregisterSignal(source, COMSIG_ORGAN_SURGICALLY_REMOVED) + +/datum/element/dangerous_surgical_removal/proc/on_surgical_removal(obj/item/organ/source, mob/living/user, mob/living/carbon/old_owner, target_zone, obj/item/tool) + SIGNAL_HANDLER + if(source.organ_flags & (ORGAN_FAILING|ORGAN_EMP)) + return + if(user?.Adjacent(source)) + source.audible_message("[source] explodes on [user]'s face!") + user.take_bodypart_damage(15) + else + source.audible_message("[source] explodes into tiny pieces!") + explosion(source, light_impact_range = 1, explosion_cause = source) + qdel(source) diff --git a/code/datums/elements/death_linked.dm b/code/datums/elements/death_linked.dm deleted file mode 100644 index c5d2c6c422c6a..0000000000000 --- a/code/datums/elements/death_linked.dm +++ /dev/null @@ -1,29 +0,0 @@ -/** - * ## death linkage element! - * - * Bespoke element that when the owner dies, the linked mob dies too. - */ -/datum/element/death_linked - element_flags = ELEMENT_BESPOKE - argument_hash_start_idx = 3 - ///The mob that also dies when the user dies - var/datum/weakref/linked_mob - -/datum/element/death_linked/Attach(datum/target, mob/living/target_mob) - . = ..() - if(!isliving(target)) - return ELEMENT_INCOMPATIBLE - if(!target_mob) - stack_trace("[type] added to [target] with NO MOB.") - src.linked_mob = WEAKREF(target_mob) - RegisterSignal(target, COMSIG_LIVING_DEATH, PROC_REF(on_death)) - -/datum/element/death_linked/Detach(datum/target) - . = ..() - UnregisterSignal(target, COMSIG_LIVING_DEATH) - -///signal called by the stat of the target changing -/datum/element/death_linked/proc/on_death(mob/living/target, gibbed) - SIGNAL_HANDLER - var/mob/living/linked_mob_resolved = linked_mob?.resolve() - linked_mob_resolved?.death(TRUE) diff --git a/code/datums/elements/decals/_decal.dm b/code/datums/elements/decals/_decal.dm index 71dd8abdf30f2..fda646c03c9e2 100644 --- a/code/datums/elements/decals/_decal.dm +++ b/code/datums/elements/decals/_decal.dm @@ -1,5 +1,5 @@ /datum/element/decal - element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH_ON_HOST_DESTROY + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH_ON_HOST_DESTROY|ELEMENT_DONT_SORT_LIST_ARGS argument_hash_start_idx = 2 /// Whether this decal can be cleaned. var/cleanable diff --git a/code/datums/elements/dryable.dm b/code/datums/elements/dryable.dm index 2985f4b7f1e26..c17547971b517 100644 --- a/code/datums/elements/dryable.dm +++ b/code/datums/elements/dryable.dm @@ -29,7 +29,6 @@ ADD_TRAIT(resulting_atom, TRAIT_DRIED, ELEMENT_TRAIT(type)) resulting_atom.forceMove(source.drop_location()) return - else if(isstack(source)) //Check if its a sheet var/obj/item/stack/itemstack = dried_atom for(var/i in 1 to itemstack.amount) @@ -37,6 +36,14 @@ ADD_TRAIT(resulting_atom, TRAIT_DRIED, ELEMENT_TRAIT(type)) qdel(source) return + else if(istype(source, /obj/item/food) && ispath(dry_result, /obj/item/food)) + var/obj/item/food/source_food = source + var/obj/item/food/resulting_food = new dry_result(source.drop_location()) + resulting_food.reagents.clear_reagents() + source_food.reagents.trans_to(resulting_food, source_food.reagents.total_volume) + ADD_TRAIT(resulting_food, TRAIT_DRIED, ELEMENT_TRAIT(type)) + qdel(source) + return else var/atom/movable/resulting_atom = new dry_result(source.drop_location()) ADD_TRAIT(resulting_atom, TRAIT_DRIED, ELEMENT_TRAIT(type)) diff --git a/code/datums/elements/earhealing.dm b/code/datums/elements/earhealing.dm index 9221f7799b8c1..f1b3465205928 100644 --- a/code/datums/elements/earhealing.dm +++ b/code/datums/elements/earhealing.dm @@ -27,7 +27,7 @@ for(var/i in user_by_item) var/mob/living/carbon/user = user_by_item[i] var/obj/item/organ/internal/ears/ears = user.get_organ_slot(ORGAN_SLOT_EARS) - if(!ears || !ears.damage || ears.organ_flags & ORGAN_FAILING) + if(!ears || !ears.damage || (ears.organ_flags & ORGAN_FAILING) || IS_ROBOTIC_ORGAN(ears)) continue ears.deaf = max(ears.deaf - 0.25 * seconds_per_tick, (ears.damage < ears.maxHealth ? 0 : 1)) // Do not clear deafness if our ears are too damaged ears.apply_organ_damage(-0.025 * seconds_per_tick) diff --git a/code/datums/elements/effect_trail.dm b/code/datums/elements/effect_trail.dm index 6e51188c0e40a..d1d2fbec44a60 100644 --- a/code/datums/elements/effect_trail.dm +++ b/code/datums/elements/effect_trail.dm @@ -3,14 +3,17 @@ */ /datum/element/effect_trail + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 /// The effect used for the trail generation. - var/obj/effect/chosen_effect + var/chosen_effect -/datum/element/effect_trail/Attach(datum/target) +/datum/element/effect_trail/Attach(datum/target, chosen_effect = /obj/effect/forcefield/cosmic_field) . = ..() if(!ismovable(target)) return ELEMENT_INCOMPATIBLE RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(generate_effect)) + src.chosen_effect = chosen_effect /datum/element/effect_trail/Detach(datum/target) . = ..() @@ -23,6 +26,3 @@ var/turf/open/open_turf = get_turf(target_object) if(istype(open_turf)) new chosen_effect(open_turf) - -/datum/element/effect_trail/cosmic_trail - chosen_effect = /obj/effect/forcefield/cosmic_field/fast diff --git a/code/datums/elements/embed.dm b/code/datums/elements/embed.dm index 854193c197463..1bc70dc500fc4 100644 --- a/code/datums/elements/embed.dm +++ b/code/datums/elements/embed.dm @@ -40,23 +40,23 @@ RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(examined)) RegisterSignal(target, COMSIG_EMBED_TRY_FORCE, PROC_REF(tryForceEmbed)) RegisterSignal(target, COMSIG_ITEM_DISABLE_EMBED, PROC_REF(detachFromWeapon)) - if(!initialized) - src.embed_chance = embed_chance - src.fall_chance = fall_chance - src.pain_chance = pain_chance - src.pain_mult = pain_mult - src.remove_pain_mult = remove_pain_mult - src.rip_time = rip_time - src.impact_pain_mult = impact_pain_mult - src.ignore_throwspeed_threshold = ignore_throwspeed_threshold - src.jostle_chance = jostle_chance - src.jostle_pain_mult = jostle_pain_mult - src.pain_stam_pct = pain_stam_pct - initialized = TRUE else payload_type = projectile_payload RegisterSignal(target, COMSIG_PROJECTILE_SELF_ON_HIT, PROC_REF(checkEmbedProjectile)) + if(!initialized) + src.embed_chance = embed_chance + src.fall_chance = fall_chance + src.pain_chance = pain_chance + src.pain_mult = pain_mult + src.remove_pain_mult = remove_pain_mult + src.rip_time = rip_time + src.impact_pain_mult = impact_pain_mult + src.ignore_throwspeed_threshold = ignore_throwspeed_threshold + src.jostle_chance = jostle_chance + src.jostle_pain_mult = jostle_pain_mult + src.pain_stam_pct = pain_stam_pct + initialized = TRUE /datum/element/embed/Detach(obj/target) . = ..() @@ -76,6 +76,9 @@ if(blocked || !istype(victim) || HAS_TRAIT(victim, TRAIT_PIERCEIMMUNE)) return FALSE + + if(victim.status_flags & GODMODE) + return FALSE var/flying_speed = throwingdatum?.speed || weapon.throw_speed @@ -131,28 +134,30 @@ /** * checkEmbedProjectile() is what we get when a projectile with a defined shrapnel_type impacts a target. * - * If we hit a valid target, we create the shrapnel_type object and immediately call tryEmbed() on it, targeting what we impacted. That will lead - * it to call tryForceEmbed() on its own embed element (it's out of our hands here, our projectile is done), where it will run through all the checks it needs to. + * If we hit a valid target, we create the shrapnel_type object and then forcefully try to embed it on its + * behalf. DO NOT EVER add an embed element to the payload and let it do the rest. + * That's awful, and it'll limit us to drop-deletable shrapnels in the worry of stuff like + * arrows and harpoons being embeddable even when not let loose by their weapons. */ -/datum/element/embed/proc/checkEmbedProjectile(obj/projectile/P, atom/movable/firer, atom/hit, angle, hit_zone) +/datum/element/embed/proc/checkEmbedProjectile(obj/projectile/source, atom/movable/firer, atom/hit, angle, hit_zone) SIGNAL_HANDLER - if(!iscarbon(hit) || HAS_TRAIT(hit, TRAIT_PIERCEIMMUNE)) - Detach(P) + if(!source.can_embed_into(hit)) + Detach(source) return // we don't care var/obj/item/payload = new payload_type(get_turf(hit)) if(istype(payload, /obj/item/shrapnel/bullet)) - payload.name = P.name - payload.embedding = P.embedding - payload.updateEmbedding() + payload.name = source.name + SEND_SIGNAL(source, COMSIG_PROJECTILE_ON_SPAWN_EMBEDDED, payload) var/mob/living/carbon/C = hit var/obj/item/bodypart/limb = C.get_bodypart(hit_zone) if(!limb) limb = C.get_bodypart() - payload.tryEmbed(limb) // at this point we've created our shrapnel baby and set them up to embed in the target, we can now die in peace as they handle their embed try on their own - Detach(P) + if(!tryForceEmbed(payload, limb)) + payload.failedEmbed() + Detach(source) /** * tryForceEmbed() is called here when we fire COMSIG_EMBED_TRY_FORCE from [/obj/item/proc/tryEmbed]. Mostly, this means we're a piece of shrapnel from a projectile that just impacted something, and we're trying to embed in it. diff --git a/code/datums/elements/empprotection.dm b/code/datums/elements/empprotection.dm index ab69c48988db7..2955551fd6d6f 100644 --- a/code/datums/elements/empprotection.dm +++ b/code/datums/elements/empprotection.dm @@ -8,10 +8,10 @@ if(. == ELEMENT_INCOMPATIBLE || !isatom(target)) return ELEMENT_INCOMPATIBLE flags = _flags - RegisterSignal(target, COMSIG_ATOM_EMP_ACT, PROC_REF(getEmpFlags)) + RegisterSignal(target, COMSIG_ATOM_PRE_EMP_ACT, PROC_REF(getEmpFlags)) /datum/element/empprotection/Detach(atom/target) - UnregisterSignal(target, COMSIG_ATOM_EMP_ACT) + UnregisterSignal(target, COMSIG_ATOM_PRE_EMP_ACT) return ..() /datum/element/empprotection/proc/getEmpFlags(datum/source, severity) diff --git a/code/datums/elements/envenomable_casing.dm b/code/datums/elements/envenomable_casing.dm index c300cb35c6a28..8cf77a2f2cc49 100644 --- a/code/datums/elements/envenomable_casing.dm +++ b/code/datums/elements/envenomable_casing.dm @@ -16,7 +16,7 @@ return ELEMENT_INCOMPATIBLE src.amount_allowed = amount_allowed RegisterSignal(target, COMSIG_ITEM_AFTERATTACK, PROC_REF(on_afterattack)) - RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine_before_dip)) /datum/element/envenomable_casing/Detach(datum/target) . = ..() @@ -39,19 +39,21 @@ return var/amount_applied = min(venom_applied.volume, amount_allowed) - casing.loaded_projectile.AddComponent(/datum/element/venomous, venom_applied.type, amount_applied) + casing.loaded_projectile.AddElement(/datum/element/venomous, venom_applied.type, amount_applied) to_chat(user, span_notice("You coat [casing] in [venom_applied].")) venom_container.reagents.remove_reagent(venom_applied.type, amount_applied) ///stops further poison application UnregisterSignal(casing, COMSIG_ITEM_AFTERATTACK) + RegisterSignal(casing, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine_after_dip), override = TRUE) -///signal called on parent being examined -/datum/element/envenomable_casing/proc/on_examine(obj/item/ammo_casing/casing, mob/user, list/examine_list) +///signal called on parent being examined while not coated +/datum/element/envenomable_casing/proc/on_examine_before_dip(obj/item/ammo_casing/casing, mob/user, list/examine_list) SIGNAL_HANDLER + examine_list += span_notice("You can dip it in a chemical to deliver a poisonous kick.") + +///ditto, but after it's been coated +/datum/element/envenomable_casing/proc/on_examine_after_dip(obj/item/ammo_casing/casing, mob/user, list/examine_list) + SIGNAL_HANDLER + examine_list += span_warning("It's coated in some kind of chemical...") + - if(!casing.loaded_projectile) - return - if(casing.loaded_projectile.GetComponent(/datum/element/venomous)) - examine_list += span_warning("It's coated in some kind of chemical...") - else - examine_list += span_notice("You can dip it in a chemical to deliver a poisonous kick.") diff --git a/code/datums/elements/food/dunkable.dm b/code/datums/elements/food/dunkable.dm index a948772ce00a3..d413119e285eb 100644 --- a/code/datums/elements/food/dunkable.dm +++ b/code/datums/elements/food/dunkable.dm @@ -3,7 +3,7 @@ /datum/element/dunkable element_flags = ELEMENT_BESPOKE argument_hash_start_idx = 2 - var/dunk_amount // the amount of reagents that will be transfered from the container to the item on each click + var/dunk_amount // the amount of reagents that will be transferred from the container to the item on each click /datum/element/dunkable/Attach(datum/target, amount_per_dunk) . = ..() @@ -28,7 +28,7 @@ to_chat(user, span_warning("[container] is unable to be dunked in!")) return COMPONENT_AFTERATTACK_PROCESSED_ITEM var/obj/item/I = source // the item that has the dunkable element - if(container.reagents.trans_to(I, dunk_amount, transfered_by = user)) //if reagents were transfered, show the message + if(container.reagents.trans_to(I, dunk_amount, transferred_by = user)) //if reagents were transferred, show the message to_chat(user, span_notice("You dunk \the [I] into \the [container].")) return COMPONENT_AFTERATTACK_PROCESSED_ITEM if(!container.reagents.total_volume) diff --git a/code/datums/elements/food/food_trash.dm b/code/datums/elements/food/food_trash.dm index 6d2b21a400db2..0a9d55406093d 100644 --- a/code/datums/elements/food/food_trash.dm +++ b/code/datums/elements/food/food_trash.dm @@ -48,8 +48,14 @@ /datum/element/food_trash/proc/async_generate_trash(datum/source) var/atom/edible_object = source - - var/obj/item/trash_item = generate_trash_procpath ? call(source, generate_trash_procpath)() : new trash(edible_object.drop_location()) + var/obj/item/trash_item + + if(istype(source, /obj/item/food/grown) && ispath(trash, /obj/item/food)) + var/obj/item/food/grown/plant = source + var/reagent_purity = plant.seed.get_reagent_purity() + trash_item = new trash(edible_object.drop_location(), reagent_purity) + else + trash_item = generate_trash_procpath ? call(source, generate_trash_procpath)() : new trash(edible_object.drop_location()) if(isliving(edible_object.loc)) var/mob/living/food_holding_mob = edible_object.loc diff --git a/code/datums/elements/food/microwavable.dm b/code/datums/elements/food/microwavable.dm index 86a43c0603c54..037e3359ac724 100644 --- a/code/datums/elements/food/microwavable.dm +++ b/code/datums/elements/food/microwavable.dm @@ -35,21 +35,19 @@ if(isstack(source)) var/obj/item/stack/stack_source = source result = new result_typepath(result_loc, stack_source.amount) - else result = new result_typepath(result_loc) var/efficiency = istype(used_microwave) ? used_microwave.efficiency : 1 SEND_SIGNAL(result, COMSIG_ITEM_MICROWAVE_COOKED, source, efficiency) - if(IS_EDIBLE(result)) - if(microwaver && microwaver.mind) - ADD_TRAIT(result, TRAIT_FOOD_CHEF_MADE, REF(microwaver.mind)) - - result.reagents?.multiply_reagents(efficiency * CRAFTED_FOOD_BASE_REAGENT_MODIFIER) + if(IS_EDIBLE(result) && (result_typepath != default_typepath)) + BLACKBOX_LOG_FOOD_MADE(result.type) + result.reagents.clear_reagents() source.reagents?.trans_to(result, source.reagents.total_volume) - BLACKBOX_LOG_FOOD_MADE(result.type) + if(microwaver && microwaver.mind) + ADD_TRAIT(result, TRAIT_FOOD_CHEF_MADE, REF(microwaver.mind)) qdel(source) diff --git a/code/datums/elements/food/venue_price.dm b/code/datums/elements/food/venue_price.dm index 1fcf9de040dc8..be846d7c004da 100644 --- a/code/datums/elements/food/venue_price.dm +++ b/code/datums/elements/food/venue_price.dm @@ -21,19 +21,19 @@ UnregisterSignal(target, COMSIG_ITEM_SOLD_TO_CUSTOMER) UnregisterSignal(target, COMSIG_REAGENT_SOLD_TO_CUSTOMER) -/datum/element/venue_price/proc/item_sold(obj/item/thing_sold, mob/living/simple_animal/robot_customer/sold_to) +/datum/element/venue_price/proc/item_sold(obj/item/thing_sold, mob/living/basic/robot_customer/sold_to) SIGNAL_HANDLER produce_cash(sold_to, thing_sold) return TRANSACTION_SUCCESS -/datum/element/venue_price/proc/reagent_sold(datum/reagent/reagent_sold, mob/living/simple_animal/robot_customer/sold_to, obj/item/container) +/datum/element/venue_price/proc/reagent_sold(datum/reagent/reagent_sold, mob/living/basic/robot_customer/sold_to, obj/item/container) SIGNAL_HANDLER produce_cash(sold_to, container) return TRANSACTION_SUCCESS -/datum/element/venue_price/proc/produce_cash(mob/living/simple_animal/robot_customer/sold_to, obj/item/container) +/datum/element/venue_price/proc/produce_cash(mob/living/basic/robot_customer/sold_to, obj/item/container) new /obj/item/holochip(get_turf(container), venue_price) playsound(container, 'sound/effects/cashregister.ogg', 60, TRUE) diff --git a/code/datums/elements/footstep.dm b/code/datums/elements/footstep.dm index ba8d5ca07b618..3a0a9961843c4 100644 --- a/code/datums/elements/footstep.dm +++ b/code/datums/elements/footstep.dm @@ -40,6 +40,8 @@ footstep_sounds = GLOB.heavyfootstep if(FOOTSTEP_MOB_SHOE) footstep_sounds = GLOB.footstep + if(FOOTSTEP_MOB_RUST) + footstep_sounds = 'sound/effects/footstep/rustystep1.ogg' if(FOOTSTEP_MOB_SLIME) footstep_sounds = 'sound/effects/footstep/slime1.ogg' if(FOOTSTEP_OBJ_MACHINE) @@ -64,18 +66,19 @@ if(!istype(turf)) return - if(!turf.footstep || source.buckled || source.throwing || source.movement_type & (VENTCRAWLING | FLYING) || HAS_TRAIT(source, TRAIT_IMMOBILIZED) || CHECK_MOVE_LOOP_FLAGS(source, MOVEMENT_LOOP_OUTSIDE_CONTROL)) + 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) + if(carbon_source.move_intent == MOVE_INTENT_WALK) return// stealth steps_for_living[source] += 1 var/steps = steps_for_living[source] @@ -89,7 +92,13 @@ if(steps != 0 && !source.has_gravity()) // don't need to step as often when you hop around return - return turf + + . = 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) + SEND_SIGNAL(turf, COMSIG_TURF_PREPARE_STEP_SOUND, .) + //The turf has no footstep sound (e.g. open space) and none of the objects on that turf (e.g. catwalks) overrides it + if(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 @@ -97,25 +106,18 @@ if (forced || SHOULD_DISABLE_FOOTSTEPS(source)) return - var/turf/open/source_loc = prepare_step(source) - if(!source_loc) + var/list/prepared_steps = prepare_step(source) + if(!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 + + var/turf_footstep = prepared_steps[footstep_type] if(!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 @@ -130,8 +132,8 @@ 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(!prepared_steps) return //cache for sanic speed (lists are references anyways) @@ -142,20 +144,22 @@ 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, + var/shoestep_type = prepared_steps[FOOTSTEP_MOB_SHOE] + heard_clients = playsound(source.loc, pick(footstep_sounds[shoestep_type][1]), + footstep_sounds[shoestep_type][2] * volume * volume_multiplier, TRUE, - footstep_sounds[source_loc.footstep][3] + e_range + range_adjustment, falloff_distance = 1, vary = sound_vary) + footstep_sounds[shoestep_type][3] + e_range + range_adjustment, falloff_distance = 1, vary = sound_vary) else + var/barefoot_type = prepared_steps[FOOTSTEP_MOB_BAREFOOT] if(source.dna.species.special_step_sounds) - heard_clients = playsound(source_loc, pick(source.dna.species.special_step_sounds), 50, TRUE, falloff_distance = 1, vary = sound_vary) + heard_clients = playsound(source.loc, pick(source.dna.species.special_step_sounds), 50, TRUE, falloff_distance = 1, 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, + heard_clients = playsound(source.loc, pick(bare_footstep_sounds[barefoot_type][1]), + bare_footstep_sounds[barefoot_type][2] * volume * volume_multiplier, TRUE, - bare_footstep_sounds[source_loc.barefootstep][3] + e_range + range_adjustment, falloff_distance = 1, vary = sound_vary) + bare_footstep_sounds[barefoot_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) diff --git a/code/datums/elements/footstep_override.dm b/code/datums/elements/footstep_override.dm new file mode 100644 index 0000000000000..4e0c346c5be2e --- /dev/null +++ b/code/datums/elements/footstep_override.dm @@ -0,0 +1,80 @@ +///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_ON_HOST_DESTROY + argument_hash_start_idx = 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 diff --git a/code/datums/elements/forced_gravity.dm b/code/datums/elements/forced_gravity.dm index bedda891fb5ff..e0d146065b148 100644 --- a/code/datums/elements/forced_gravity.dm +++ b/code/datums/elements/forced_gravity.dm @@ -6,19 +6,23 @@ ///whether we will override the turf if it forces no gravity var/ignore_turf_gravity -/datum/element/forced_gravity/Attach(datum/target, gravity = 1, ignore_turf_gravity = FALSE) +/datum/element/forced_gravity/Attach(datum/target, gravity = 1, ignore_turf_gravity = FALSE, can_override = FALSE) . = ..() 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 - RegisterSignal(target, COMSIG_ATOM_HAS_GRAVITY, PROC_REF(gravity_check)) + RegisterSignal(target, COMSIG_ATOM_HAS_GRAVITY, PROC_REF(gravity_check), override = can_override) if(isturf(target)) - RegisterSignal(target, COMSIG_TURF_HAS_GRAVITY, PROC_REF(turf_gravity_check)) + RegisterSignal(target, COMSIG_TURF_HAS_GRAVITY, PROC_REF(turf_gravity_check), override = can_override) - ADD_TRAIT(target, TRAIT_FORCED_GRAVITY, REF(src)) + ADD_TRAIT(target, TRAIT_FORCED_GRAVITY, our_ref) /datum/element/forced_gravity/Detach(datum/source) . = ..() @@ -37,5 +41,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/gags_recolorable.dm b/code/datums/elements/gags_recolorable.dm new file mode 100644 index 0000000000000..bf37a4ba973da --- /dev/null +++ b/code/datums/elements/gags_recolorable.dm @@ -0,0 +1,62 @@ +///An element that lets players recolor the item through the greyscale menu with the help of a spraycan. +/datum/element/gags_recolorable + +/datum/element/gags_recolorable/Attach(datum/target) + . = ..() + if(!isatom(target)) + return ELEMENT_INCOMPATIBLE + RegisterSignal(target, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attackby)) + RegisterSignal(target, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(on_examine)) + +/datum/element/gags_recolorable/proc/on_examine(atom/source, mob/user, list/examine_text) + SIGNAL_HANDLER + examine_text += span_notice("You could recolor [source.p_them()] with a spraycan...") + +/datum/element/gags_recolorable/proc/on_attackby(datum/source, obj/item/attacking_item, mob/user) + SIGNAL_HANDLER + + if(!istype(attacking_item, /obj/item/toy/crayon/spraycan)) + return + var/obj/item/toy/crayon/spraycan/can = attacking_item + + if(can.is_capped || can.check_empty()) + return + + INVOKE_ASYNC(src, PROC_REF(open_ui), user, can, source) + return COMPONENT_NO_AFTERATTACK + +/datum/element/gags_recolorable/proc/open_ui(mob/user, obj/item/toy/crayon/spraycan/can, atom/target) + var/list/allowed_configs = list() + var/config = initial(target.greyscale_config) + if(!config) + return + allowed_configs += "[config]" + if(isitem(target)) + var/obj/item/item = target + if(initial(item.greyscale_config_worn)) + allowed_configs += "[initial(item.greyscale_config_worn)]" + if(initial(item.greyscale_config_inhand_left)) + allowed_configs += "[initial(item.greyscale_config_inhand_left)]" + if(initial(item.greyscale_config_inhand_right)) + allowed_configs += "[initial(item.greyscale_config_inhand_right)]" + + var/datum/greyscale_modify_menu/spray_paint/menu = new( + target, user, allowed_configs, CALLBACK(src, PROC_REF(recolor), user, can, target), + starting_icon_state = initial(target.icon_state), + starting_config = initial(target.greyscale_config), + starting_colors = target.greyscale_colors, + used_spraycan = can, + ) + menu.ui_interact(user) + +/datum/element/gags_recolorable/proc/recolor(mob/user, obj/item/toy/crayon/spraycan/can, atom/target, datum/greyscale_modify_menu/menu) + if(can.is_capped || can.check_empty(user)) + menu.ui_close() + return + + can.use_charges() + if(can.pre_noise) + target.audible_message(span_hear("You hear spraying.")) + playsound(target.loc, 'sound/effects/spray.ogg', 5, TRUE, 5) + + target.set_greyscale(menu.split_colors) diff --git a/code/datums/elements/give_turf_traits.dm b/code/datums/elements/give_turf_traits.dm new file mode 100644 index 0000000000000..3c53d4a5e7305 --- /dev/null +++ b/code/datums/elements/give_turf_traits.dm @@ -0,0 +1,79 @@ +/// A bespoke element that adds a set of traits to the turf while occupied by at least one attached movabled. +/datum/element/give_turf_traits + element_flags = ELEMENT_DETACH_ON_HOST_DESTROY|ELEMENT_BESPOKE + argument_hash_start_idx = 2 + ///A list of traits that are added to the turf while occupied. + var/list/traits + ///List of sources we are using to reapply traits when turf changes + var/list/trait_sources = list() + +/datum/element/give_turf_traits/Attach(atom/movable/target, list/traits) + . = ..() + if(!istype(target)) + return ELEMENT_INCOMPATIBLE + + src.traits = traits + + RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) + if(isturf(target.loc)) + add_to_occupied_turfs(target.loc, target) + +/datum/element/give_turf_traits/Detach(atom/movable/source) + UnregisterSignal(source, COMSIG_MOVABLE_MOVED) + if(isturf(source.loc)) + remove_from_occupied_turfs(source.loc, source) + return ..() + +/// Removes the trait from the old turf and adds it to the new one. +/datum/element/give_turf_traits/proc/on_moved(atom/movable/source, atom/old_loc) + SIGNAL_HANDLER + if(isturf(old_loc)) + remove_from_occupied_turfs(old_loc, source) + + if(isturf(source.loc)) + add_to_occupied_turfs(source.loc, source) + +/** + * Registers the turf signals if it was previously unoccupied and adds it to the list of occupied turfs. + * Otherwise, it just adds the movable to the assoc value of lists occupying the turf. + */ +/datum/element/give_turf_traits/proc/add_to_occupied_turfs(turf/location, atom/movable/source) + var/trait_source = REF(source) + if(isnull(trait_sources) || isnull(trait_sources[location])) + RegisterSignal(location, COMSIG_TURF_CHANGE, PROC_REF(pre_change_turf)) + + LAZYADDASSOCLIST(trait_sources, location, trait_source) + var/update_movespeeds = (TRAIT_TURF_IGNORE_SLOWDOWN in traits) && !HAS_TRAIT(location, TRAIT_TURF_IGNORE_SLOWDOWN) + for(var/trait in traits) + ADD_TRAIT(location, trait, trait_source) + if(update_movespeeds) + for(var/mob/living/living in location) + living.update_turf_movespeed() + +/** + * Unregisters the turf signals if it's no longer unoccupied and removes it from the list of occupied turfs. + * Otherwise, it just removes the movable from the assoc value of lists occupying the turf. + */ +/datum/element/give_turf_traits/proc/remove_from_occupied_turfs(turf/location, atom/movable/source) + var/trait_source = REF(source) + LAZYREMOVEASSOC(trait_sources, location, trait_source) + if(isnull(trait_sources) || isnull(trait_sources[location])) + UnregisterSignal(location, COMSIG_TURF_CHANGE) + + for(var/trait in traits) + REMOVE_TRAIT(location, trait, trait_source) + + if((TRAIT_TURF_IGNORE_SLOWDOWN in traits) && !HAS_TRAIT(location, TRAIT_TURF_IGNORE_SLOWDOWN)) + for(var/mob/living/living in location) + living.update_turf_movespeed() + +/// Signals and components are carried over when the turf is changed, so they've to be readded post-change. +/datum/element/give_turf_traits/proc/pre_change_turf(turf/changed, path, list/new_baseturfs, flags, list/post_change_callbacks) + SIGNAL_HANDLER + post_change_callbacks += CALLBACK(src, PROC_REF(reoccupy_turf)) + +/// Reapply turf traits to the provided turf +/datum/element/give_turf_traits/proc/reoccupy_turf(turf/changed) + for(var/trait in traits) + for(var/source in trait_sources[changed]) + ADD_TRAIT(changed, trait, source) diff --git a/code/datums/elements/haunted.dm b/code/datums/elements/haunted.dm index 1ed7f325294b1..d678083dd1999 100644 --- a/code/datums/elements/haunted.dm +++ b/code/datums/elements/haunted.dm @@ -24,3 +24,13 @@ REMOVE_TRAIT(master, TRAIT_MOVE_FLYING, ELEMENT_TRAIT(type)) master.RemoveElement(/datum/element/movetype_handler) return ..() + +/atom/movable/proc/make_haunted(source, color) //if not haunted, make haunted + if(!HAS_TRAIT(src, TRAIT_HAUNTED)) + AddElement(/datum/element/haunted, color) + ADD_TRAIT(src, TRAIT_HAUNTED, source) + +/atom/movable/proc/remove_haunted(source) //if haunted, make not haunted + REMOVE_TRAIT(src, TRAIT_HAUNTED, source) + if(!HAS_TRAIT(src, TRAIT_HAUNTED)) + RemoveElement(/datum/element/haunted) diff --git a/code/datums/elements/high_fiver.dm b/code/datums/elements/high_fiver.dm index 9f9e8871927ae..6e4e9739cefc5 100644 --- a/code/datums/elements/high_fiver.dm +++ b/code/datums/elements/high_fiver.dm @@ -21,20 +21,12 @@ /datum/element/high_fiver/proc/on_offer(obj/item/source, mob/living/carbon/offerer) SIGNAL_HANDLER - if(locate(/mob/living/carbon) in orange(1, offerer)) - offerer.visible_message( - span_notice("[offerer] raises [offerer.p_their()] arm, looking for a high-five!"), - span_notice("You post up, looking for a high-five!"), - vision_distance = 2, - ) - offerer.apply_status_effect(/datum/status_effect/offering, source, /atom/movable/screen/alert/give/highfive) - - else - offerer.visible_message( - span_danger("[offerer] raises [offerer.p_their()] arm, looking around for a high-five, but there's no one around!"), - span_warning("You post up, looking for a high-five, but find no one to accept it..."), - vision_distance = 4, - ) + offerer.visible_message( + span_notice("[offerer] raises [offerer.p_their()] arm, looking for a high-five!"), + span_notice("You post up, looking for a high-five!"), + vision_distance = 2, + ) + offerer.apply_status_effect(/datum/status_effect/offering/no_item_received/high_five, source, /atom/movable/screen/alert/give/highfive) return COMPONENT_OFFER_INTERRUPT @@ -89,4 +81,5 @@ offerer.add_mood_event(descriptor, /datum/mood_event/high_five) taker.add_mood_event(descriptor, /datum/mood_event/high_five) + offerer.remove_status_effect(/datum/status_effect/offering/no_item_received/high_five) return COMPONENT_OFFER_INTERRUPT diff --git a/code/datums/elements/immerse.dm b/code/datums/elements/immerse.dm new file mode 100644 index 0000000000000..6449d8de1ad04 --- /dev/null +++ b/code/datums/elements/immerse.dm @@ -0,0 +1,413 @@ +/** + * A visual element that makes movables entering the attached turfs look immersed into that turf. + * + * Abandon all hope, ye who read forth, for this immerse works on mind-numbing workarounds, + */ +/datum/element/immerse + element_flags = ELEMENT_DETACH_ON_HOST_DESTROY | ELEMENT_BESPOKE + argument_hash_start_idx = 2 + ///An association list of turfs that have this element attached and their affected contents. + var/list/attached_turfs_and_movables = list() + + /** + * A list of movables that shouldn't be affected by the element, either because it'd look bad + * or barely perceptible. + */ + var/static/list/movables_to_ignore + ///A list of icons generated from a target and a mask, later used as appearances for the overlays. + var/static/list/generated_immerse_icons = list() + ///A list of instances of /atom/movable/immerse_overlay then used as visual overlays for the immersed movables. + var/list/generated_visual_overlays = list() + ///An association list of movables as key and overlays as assoc. + var/list/immersed_movables + + var/icon + var/icon_state + var/mask_icon + var/color + var/alpha + +/datum/element/immerse/Attach(turf/target, icon, icon_state, mask_icon, color = "#777777", alpha = 180) + . = ..() + if(!isturf(target) || !icon || !icon_state || !mask_icon) + return ELEMENT_INCOMPATIBLE + + if(!movables_to_ignore) + movables_to_ignore = typecacheof(list( + /obj/effect, + /mob/dead, + /obj/projectile, + )) + + movables_to_ignore += GLOB.WALLITEMS_INTERIOR + movables_to_ignore += GLOB.WALLITEMS_EXTERIOR + + src.icon = icon + src.icon_state = icon_state + src.color = color + src.alpha = alpha + src.mask_icon = mask_icon + + /** + * Hello, you may be wondering why we're blending icons and not simply + * overlaying one mutable appearance with the blend multiply on another. + * Well, the latter option doesn't work as neatly when added + * to an atom with the KEEP_TOGETHER appearance flag, with the mask icon also + * showing on said atom, while we don't want it to. + * + * Also using KEEP_APART isn't an option, because unless it's drawn as one with + * its visual loation, the whole plane the atom belongs to will count as part of the + * mask of the final visual overlay since that's how the BLEND_INSET_OVERLAY blend mode works here. + * In layman terms, with KEEP_APART on, if a flying monkey gets nears an immersed + * human, the visual overlay will appear on the flying monkey even if it shouldn't. + */ + var/icon/immerse_icon = generated_immerse_icons["[icon]-[icon_state]-[mask_icon]"] + if(!immerse_icon) + immerse_icon = icon(icon, icon_state) + var/icon/sub_mask = icon('icons/effects/effects.dmi', mask_icon) + immerse_icon.Blend(sub_mask, ICON_MULTIPLY) + immerse_icon = fcopy_rsc(immerse_icon) + generated_immerse_icons["[icon]-[icon_state]-[mask_icon]"] = immerse_icon + + RegisterSignal(target, SIGNAL_ADDTRAIT(TRAIT_IMMERSE_STOPPED), PROC_REF(stop_immersion)) + RegisterSignal(target, SIGNAL_REMOVETRAIT(TRAIT_IMMERSE_STOPPED), PROC_REF(start_immersion)) + + if(!HAS_TRAIT(target, TRAIT_IMMERSE_STOPPED)) + start_immersion(target) + +/datum/element/immerse/Detach(turf/source) + UnregisterSignal(source, list(SIGNAL_ADDTRAIT(TRAIT_IMMERSE_STOPPED), SIGNAL_REMOVETRAIT(TRAIT_IMMERSE_STOPPED))) + if(!HAS_TRAIT(source, TRAIT_IMMERSE_STOPPED)) + stop_immersion(source) + return ..() + +///Makes the element start affecting the turf and its contents. Called on Attach() or when TRAIT_IMMERSE_STOPPED is removed. +/datum/element/immerse/proc/start_immersion(turf/source) + SIGNAL_HANDLER + RegisterSignals(source, list(COMSIG_ATOM_ABSTRACT_ENTERED, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON), PROC_REF(on_init_or_entered)) + RegisterSignal(source, COMSIG_ATOM_ABSTRACT_EXITED, PROC_REF(on_atom_exited)) + attached_turfs_and_movables += source + for(var/atom/movable/movable as anything in source) + if(!(movable.flags_1 & INITIALIZED_1)) + continue + on_init_or_entered(source, movable) + +///Stops the element from affecting on the turf and its contents. Called on Detach() or when TRAIT_IMMERSE_STOPPED is added. +/datum/element/immerse/proc/stop_immersion(turf/source) + SIGNAL_HANDLER + UnregisterSignal(source, list(COMSIG_ATOM_ABSTRACT_ENTERED, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, COMSIG_ATOM_ABSTRACT_EXITED)) + for(var/atom/movable/movable as anything in attached_turfs_and_movables[source]) + remove_from_element(source, movable) + attached_turfs_and_movables -= source + +/** + * If the movable is within the right layers and planes, not in the list of movable types to ignore, + * or already affected by the element for that matter, Signals will be registered and, + * unless the movable (or whatever it's buckled to) is flying, it'll appear as if immersed in that water. + */ +/datum/element/immerse/proc/on_init_or_entered(turf/source, atom/movable/movable) + SIGNAL_HANDLER + if(HAS_TRAIT(movable, TRAIT_IMMERSED)) + return + if(movable.layer >= ABOVE_ALL_MOB_LAYER || !ISINRANGE(movable.plane, MUTATE_PLANE(FLOOR_PLANE, source), MUTATE_PLANE(GAME_PLANE_UPPER_FOV_HIDDEN, source))) + return + if(is_type_in_typecache(movable, movables_to_ignore)) + return + + var/atom/movable/buckled + if(isliving(movable)) + var/mob/living/living_mob = movable + RegisterSignal(living_mob, COMSIG_LIVING_SET_BUCKLED, PROC_REF(on_set_buckled)) + buckled = living_mob.buckled + + try_immerse(movable, buckled) + RegisterSignal(movable, COMSIG_QDELETING, PROC_REF(on_movable_qdel)) + LAZYADD(attached_turfs_and_movables[source], movable) + ADD_TRAIT(movable, TRAIT_IMMERSED, ELEMENT_TRAIT(src)) + +/datum/element/immerse/proc/on_movable_qdel(atom/movable/source) + SIGNAL_HANDLER + remove_from_element(source.loc, source) + +/** + * The main proc, which adds a visual overlay to the movable that has entered the turf to make it look immersed. + * It's kind of iffy but basically, we want the overlay to cover as much area as needed to + * avoid the movable's icon from spilling horizontally or below. + * Also, while these visual overlays are mainly cached movables, for certain movables, such as living mobs, + * we want them to have their own unique vis overlay with additional signals registered. + * This allows the vis overlay to look more or less unchanged while its owner is spinning or resting + * without otherwise affecting other movables with identical overlays. + */ +/datum/element/immerse/proc/add_immerse_overlay(atom/movable/movable) + var/list/icon_dimensions = get_icon_dimensions(movable.icon) + var/width = icon_dimensions["width"] || world.icon_size + var/height = icon_dimensions["height"] || world.icon_size + + var/is_below_water = movable.layer < WATER_LEVEL_LAYER ? "underwater-" : "" + + var/atom/movable/immerse_overlay/vis_overlay = generated_visual_overlays["[is_below_water][width]x[height]"] + + if(!vis_overlay) //create the overlay if not already done. + vis_overlay = generate_vis_overlay(width, height, is_below_water) + + + ADD_KEEP_TOGETHER(movable, ELEMENT_TRAIT(src)) + + /** + * Let's give an unique immerse visual only to those movables that would + * benefit from this the most, for the sake of a smidge of lightweightness. + */ + if(HAS_TRAIT(movable, TRAIT_UNIQUE_IMMERSE)) + var/atom/movable/immerse_overlay/original_vis_overlay = vis_overlay + vis_overlay = new(null) + vis_overlay.appearance = original_vis_overlay + vis_overlay.extra_width = original_vis_overlay.extra_width + vis_overlay.extra_height = original_vis_overlay.extra_height + vis_overlay.overlay_appearance = original_vis_overlay.overlay_appearance + SEND_SIGNAL(movable, COMSIG_MOVABLE_EDIT_UNIQUE_IMMERSE_OVERLAY, vis_overlay) + RegisterSignal(movable, COMSIG_ATOM_SPIN_ANIMATION, PROC_REF(on_spin_animation)) + RegisterSignal(movable, COMSIG_LIVING_POST_UPDATE_TRANSFORM, PROC_REF(on_update_transform)) + + movable.vis_contents |= vis_overlay + + LAZYSET(immersed_movables, movable, vis_overlay) + +///Initializes and caches a new visual overlay given parameters such as width, height and whether it should appear fully underwater. +/datum/element/immerse/proc/generate_vis_overlay(width, height, is_below_water) + + var/atom/movable/immerse_overlay/vis_overlay = new(null, src) + + /** + * vis contents spin around the center of the icon of their vis locs + * but since we want the appearance to stay where it should be, + * we have to counteract this one. + */ + var/extra_width = (width - world.icon_size) * 0.5 + var/extra_height = (height - world.icon_size) * 0.5 + var/mutable_appearance/overlay_appearance = new() + var/icon/immerse_icon = generated_immerse_icons["[icon]-[icon_state]-[mask_icon]"] + var/last_i = width/world.icon_size + for(var/i in -1 to last_i) + var/mutable_appearance/underwater = mutable_appearance(icon, icon_state) + underwater.pixel_x = world.icon_size * i - extra_width + underwater.pixel_y = -world.icon_size - extra_height + overlay_appearance.overlays += underwater + + var/mutable_appearance/water_level = is_below_water ? underwater : mutable_appearance(immerse_icon) + water_level.pixel_x = world.icon_size * i - extra_width + water_level.pixel_y = -extra_height + overlay_appearance.overlays += water_level + + + vis_overlay.color = color + vis_overlay.alpha = alpha + vis_overlay.overlays = list(overlay_appearance) + + vis_overlay.extra_width = extra_width + vis_overlay.extra_height = extra_height + vis_overlay.overlay_appearance = overlay_appearance + + generated_visual_overlays["[is_below_water][width]x[height]"] = vis_overlay + return vis_overlay + +///This proc removes the vis_overlay, the keep together trait and some signals from the movable. +/datum/element/immerse/proc/remove_immerse_overlay(atom/movable/movable) + var/atom/movable/immerse_overlay/vis_overlay = LAZYACCESS(immersed_movables, movable) + if(!vis_overlay) + return + movable.vis_contents -= vis_overlay + LAZYREMOVE(immersed_movables, movable) + if(HAS_TRAIT(movable, TRAIT_UNIQUE_IMMERSE)) + UnregisterSignal(movable, list(COMSIG_ATOM_SPIN_ANIMATION, COMSIG_LIVING_POST_UPDATE_TRANSFORM)) + qdel(vis_overlay) + REMOVE_KEEP_TOGETHER(movable, ELEMENT_TRAIT(src)) + +/** + * Called by init_or_entered() and on_set_buckled(). + * This applies the overlay if neither the movable or whatever is buckled to (exclusive to living mobs) are flying + * as well as movetype signals when the movable isn't buckled. + */ +/datum/element/immerse/proc/try_immerse(atom/movable/movable, atom/movable/buckled) + var/atom/movable/to_check = buckled || movable + if(!(to_check.movement_type & (FLYING|FLOATING)) && !movable.throwing) + add_immerse_overlay(movable) + if(!buckled) + RegisterSignal(movable, COMSIG_MOVETYPE_FLAG_ENABLED, PROC_REF(on_move_flag_enabled)) + RegisterSignal(movable, COMSIG_MOVETYPE_FLAG_DISABLED, PROC_REF(on_move_flag_disabled)) + RegisterSignal(movable, COMSIG_MOVABLE_POST_THROW, PROC_REF(on_throw)) + RegisterSignal(movable, COMSIG_MOVABLE_THROW_LANDED, PROC_REF(on_throw_landed)) + +/** + * Called by on_set_buckled() and remove_from_element(). + * This removes the filter and signals from the movable unless it doesn't have them. + */ +/datum/element/immerse/proc/try_unimmerse(atom/movable/movable, atom/movable/buckled) + var/atom/movable/to_check = buckled || movable + if(!(to_check.movement_type & (FLYING|FLOATING)) && !movable.throwing) + remove_immerse_overlay(movable) + if(!buckled) + UnregisterSignal(movable, list(COMSIG_MOVETYPE_FLAG_ENABLED, COMSIG_MOVETYPE_FLAG_DISABLED, COMSIG_MOVABLE_POST_THROW, COMSIG_MOVABLE_THROW_LANDED)) + +/datum/element/immerse/proc/on_set_buckled(mob/living/source, atom/movable/new_buckled) + SIGNAL_HANDLER + try_unimmerse(source, source.buckled) + try_immerse(source, new_buckled) + +///Removes the overlay from mob and bucklees is flying. +/datum/element/immerse/proc/on_move_flag_enabled(atom/movable/source, flag, old_movement_type) + SIGNAL_HANDLER + if(!(flag & (FLYING|FLOATING)) || old_movement_type & (FLYING|FLOATING) || source.throwing) + return + remove_immerse_overlay(source) + for(var/mob/living/buckled_mob as anything in source.buckled_mobs) + remove_immerse_overlay(buckled_mob) + +///Works just like on_move_flag_enabled, except it only has to check that movable isn't flying +/datum/element/immerse/proc/on_throw(atom/movable/source) + SIGNAL_HANDLER + if(source.movement_type & (FLYING|FLOATING)) + return + remove_immerse_overlay(source) + for(var/mob/living/buckled_mob as anything in source.buckled_mobs) + remove_immerse_overlay(buckled_mob) + +///Readds the overlay to the mob and bucklees if no longer flying. +/datum/element/immerse/proc/on_move_flag_disabled(atom/movable/source, flag, old_movement_type) + SIGNAL_HANDLER + if(!(flag & (FLYING|FLOATING)) || source.movement_type & (FLYING|FLOATING) || source.throwing) + return + add_immerse_overlay(source) + for(var/mob/living/buckled_mob as anything in source.buckled_mobs) + add_immerse_overlay(buckled_mob) + +///Works just like on_move_flag_disabled, except it only has to check that movable isn't flying +/datum/element/immerse/proc/on_throw_landed(atom/movable/source) + SIGNAL_HANDLER + if(source.movement_type & (FLYING|FLOATING)) + return + add_immerse_overlay(source) + for(var/mob/living/buckled_mob as anything in source.buckled_mobs) + add_immerse_overlay(buckled_mob) + +/** + * Called when a movable exits the turf. If its new location is not in the list of turfs with this element, + * Remove the movable from the element. + */ +/datum/element/immerse/proc/on_atom_exited(turf/source, atom/movable/exited, direction) + SIGNAL_HANDLER + if(!(exited.loc in attached_turfs_and_movables)) + remove_from_element(source, exited) + else + LAZYREMOVE(attached_turfs_and_movables[source], exited) + LAZYADD(attached_turfs_and_movables[exited.loc], exited) + +///Remove any signal, overlay, trait given to the movable and reference to it within the element. +/datum/element/immerse/proc/remove_from_element(turf/source, atom/movable/movable) + var/atom/movable/buckled + if(isliving(movable)) + var/mob/living/living_mob = movable + buckled = living_mob.buckled + try_unimmerse(movable, buckled) + + UnregisterSignal(movable, list(COMSIG_LIVING_SET_BUCKLED, COMSIG_QDELETING)) + REMOVE_TRAIT(movable, TRAIT_IMMERSED, ELEMENT_TRAIT(src)) + LAZYREMOVE(attached_turfs_and_movables[source], movable) + +/// A band-aid to keep the (unique) visual overlay from scaling and rotating along with its owner. I'm sorry. +/datum/element/immerse/proc/on_update_transform(mob/living/source, resize, new_lying_angle, is_opposite_angle) + SIGNAL_HANDLER + var/matrix/new_transform = matrix() + new_transform.Scale(1/source.current_size) + new_transform.Turn(-new_lying_angle) + + var/atom/movable/immerse_overlay/vis_overlay = immersed_movables[source] + if(is_opposite_angle) + vis_overlay.transform = new_transform + vis_overlay.adjust_living_overlay_offset(source) + return + + /** + * Here, we temporarily switch from the offset of the mutable appearance to one for movable used as visual overlay. + * Why? While visual overlays can be animated, their fixed point stays at the center of the icon of the atom + * they're attached to and not theirs, which can make manipulating the transform var a pain, but because + * we cannot do that with normal overlay or filters (reliably), we have to bend a knee and try to compensate it. + */ + vis_overlay.overlays = list(vis_overlay.overlay_appearance) + + /// Oh, yeah, didn't I mention turning a visual overlay affects its pixel x/y/w/z too? Yeah, it sucks. + var/new_x = vis_overlay.extra_width + var/new_y = vis_overlay.extra_height + var/old_div = source.current_size/resize + var/offset_lying = source.rotate_on_lying ? PIXEL_Y_OFFSET_LYING : source.get_pixel_y_offset_standing(source.current_size/resize) + switch(source.lying_prev) + if(270) + vis_overlay.pixel_x += -offset_lying / old_div + if(90) + vis_overlay.pixel_x += offset_lying / old_div + if(0) + vis_overlay.pixel_y += -source.get_pixel_y_offset_standing(source.current_size/resize) / old_div + + switch(new_lying_angle) + if(270) + new_x += -source.body_position_pixel_y_offset / source.current_size + if(90) + new_x += source.body_position_pixel_y_offset / source.current_size + if(0) + new_y += -source.body_position_pixel_y_offset / source.current_size + + animate(vis_overlay, transform = new_transform, pixel_x = new_x, pixel_y = new_y, time = UPDATE_TRANSFORM_ANIMATION_TIME, easing = (EASE_IN|EASE_OUT)) + addtimer(CALLBACK(vis_overlay, TYPE_PROC_REF(/atom/movable/immerse_overlay, adjust_living_overlay_offset), source), UPDATE_TRANSFORM_ANIMATION_TIME) + +///Spin the overlay in the opposite direction so it doesn't look like it's spinning at all. +/datum/element/immerse/proc/on_spin_animation(atom/source, speed, loops, segments, segment) + SIGNAL_HANDLER + var/atom/movable/immerse_overlay/vis_overlay = immersed_movables[source] + vis_overlay.do_spin_animation(speed, loops, segments, -segment) + +///We need to make sure to remove hard refs from the element when deleted. +/datum/element/immerse/proc/clear_overlay_refs(atom/movable/immerse_overlay/source) + //Assume that every vis loc is also in the immersed_movables list + for(var/atom/movable/vis_loc as anything in source.vis_locs) + remove_from_element(vis_loc.loc, vis_loc) + LAZYREMOVE(generated_visual_overlays, source) + source.overlay_appearance = null + +///The not-quite-perfect movable used by the immerse element for its nefarious deeds. +/atom/movable/immerse_overlay + appearance_flags = RESET_TRANSFORM|RESET_COLOR|RESET_ALPHA|KEEP_TOGETHER + vis_flags = VIS_INHERIT_PLANE|VIS_INHERIT_ID + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + blend_mode = BLEND_INSET_OVERLAY + layer = WATER_VISUAL_OVERLAY_LAYER + plane = FLOAT_PLANE + /** + * The actual overlay used to make the mob look like it's half-covered in water. + * + * For visual overlays, pixel y/x/w/z are amplified by the a, b, d, e variables + * of the transform matrix of the movable they're attached to. + * For example, if a mob is twice its normal size (a = 2, e = 2), + * offsetting the movable used as visual overlay by 4 pixels to the right will result + * in the visual overlay moving 8 pixels to the right. + * + * This however, doesn't extend to the overlays of our visual overlay. which is why there's + * a mutable appearance variable that we use for those pixel offsets that really shouldn't be affected + * by the transform of our vis loc(s) in the first place. + */ + var/mutable_appearance/overlay_appearance + ///The base pixel x offset of this movable + var/extra_width = 0 + ///The base pixel y offset of this movable + var/extra_height = 0 + +/atom/movable/immerse_overlay/Initialize(mapload, datum/element/immerse/element) + . = ..() + verbs.Cut() //"Cargo cultttttt" or something. Either way, they're better off without verbs. + element?.RegisterSignal(src, COMSIG_QDELETING, TYPE_PROC_REF(/datum/element/immerse, clear_overlay_refs)) + +///Called by COMSIG_MOVABLE_EDIT_UNIQUE_IMMERSE_OVERLAY for living mobs and a few procs from the immerse element. +/atom/movable/immerse_overlay/proc/adjust_living_overlay_offset(mob/living/source) + pixel_x = extra_width + pixel_y = extra_height + overlay_appearance.pixel_y = -source.body_position_pixel_y_offset + overlays = list(overlay_appearance) + overlay_appearance.pixel_y = 0 diff --git a/code/datums/elements/kneecapping.dm b/code/datums/elements/kneecapping.dm index f652a19632391..340938c430c35 100644 --- a/code/datums/elements/kneecapping.dm +++ b/code/datums/elements/kneecapping.dm @@ -80,9 +80,11 @@ if(do_after(attacker, 3 SECONDS, target, interaction_key = weapon)) 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!")) - var/datum/wound/blunt/severe/severe_wound_type = /datum/wound/blunt/severe - var/datum/wound/blunt/critical/critical_wound_type = /datum/wound/blunt/critical - leg.receive_damage(brute = weapon.force, wound_bonus = rand(initial(severe_wound_type.threshold_minimum), initial(critical_wound_type.threshold_minimum) + 10), damage_source = "kneecapping") + + var/min_wound = leg.get_wound_threshold_of_wound_type(WOUND_BLUNT, WOUND_SEVERITY_SEVERE, return_value_if_no_wound = 30, wound_source = weapon) + var/max_wound = leg.get_wound_threshold_of_wound_type(WOUND_BLUNT, WOUND_SEVERITY_CRITICAL, return_value_if_no_wound = 50, wound_source = weapon) + + leg.receive_damage(brute = weapon.force, wound_bonus = rand(min_wound, max_wound + 10), damage_source = "kneecapping") target.emote("scream") log_combat(attacker, target, "broke the kneecaps of", weapon) target.update_damage_overlays() diff --git a/code/datums/elements/knockback.dm b/code/datums/elements/knockback.dm index 59dd82b678ffa..2ad669f989219 100644 --- a/code/datums/elements/knockback.dm +++ b/code/datums/elements/knockback.dm @@ -67,7 +67,7 @@ if(throwee.anchored && !throw_anchored) return if(throw_distance < 0) - throw_dir = turn(throw_dir, 180) + throw_dir = REVERSE_DIR(throw_dir) throw_distance *= -1 var/atom/throw_target = get_edge_target_turf(throwee, throw_dir) throwee.safe_throw_at(throw_target, throw_distance, 1, thrower, gentle = throw_gentle) diff --git a/code/datums/elements/lazy_fishing_spot.dm b/code/datums/elements/lazy_fishing_spot.dm index ad8b744f36490..82323372e6a02 100644 --- a/code/datums/elements/lazy_fishing_spot.dm +++ b/code/datums/elements/lazy_fishing_spot.dm @@ -1,4 +1,7 @@ -// Lazy fishing spot element so fisheable turfs do not have a component each since they're usually pretty common on their respective maps (lava/water/etc) +/** + * Lazy fishing spot element so fisheable turfs do not have a component each since + * they're usually pretty common on their respective maps (lava/water/etc) + */ /datum/element/lazy_fishing_spot element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH_ON_HOST_DESTROY // Detach for turfs argument_hash_start_idx = 2 @@ -8,8 +11,8 @@ . = ..() if(!isatom(target)) return ELEMENT_INCOMPATIBLE - if(!configuration) - CRASH("Lazy fishing spot had no configuration passed in.") + if(!ispath(configuration, /datum/fish_source) || configuration == /datum/fish_source) + CRASH("Lazy fishing spot has incorrect configuration passed in: [configuration].") src.configuration = configuration RegisterSignal(target, COMSIG_PRE_FISHING, PROC_REF(create_fishing_spot)) @@ -21,5 +24,5 @@ /datum/element/lazy_fishing_spot/proc/create_fishing_spot(datum/source) SIGNAL_HANDLER - source.AddComponent(/datum/component/fishing_spot, configuration) + source.AddComponent(/datum/component/fishing_spot, GLOB.preset_fish_sources[configuration]) Detach(source) diff --git a/code/datums/elements/light_eaten.dm b/code/datums/elements/light_eaten.dm index d5a0d6eafd28f..88aad2c555c0e 100644 --- a/code/datums/elements/light_eaten.dm +++ b/code/datums/elements/light_eaten.dm @@ -18,7 +18,7 @@ /// Because the lighting system does not like movable lights getting set_light() called. switch(atom_target.light_system) if(STATIC_LIGHT) - target.set_light(0, 0, null, FALSE) + target.set_light(0, 0, null, l_on = FALSE) else target.set_light_power(0) target.set_light_range(0) diff --git a/code/datums/elements/light_eater.dm b/code/datums/elements/light_eater.dm index f60a922b9d705..b4f7cf1042f3d 100644 --- a/code/datums/elements/light_eater.dm +++ b/code/datums/elements/light_eater.dm @@ -83,6 +83,9 @@ * - [eater][/datum]: The light eater eating the morsel. This is the datum that the element is attached to that started this chain. */ /datum/element/light_eater/proc/devour(atom/morsel, datum/eater) + var/static/list/undevourable = typecacheof(list(/turf/open/space)) + if(is_type_in_typecache(morsel, undevourable)) + return FALSE if(morsel.light_power <= 0 || morsel.light_range <= 0 || !morsel.light_on) return FALSE if(SEND_SIGNAL(morsel, COMSIG_LIGHT_EATER_ACT, eater) & COMPONENT_BLOCK_LIGHT_EATER) diff --git a/code/datums/elements/loomable.dm b/code/datums/elements/loomable.dm index 070bc47f5ca70..cfd0b4bc83480 100644 --- a/code/datums/elements/loomable.dm +++ b/code/datums/elements/loomable.dm @@ -7,7 +7,7 @@ /// How much of item do we need to loom, will be ignored if item isnt a stack var/required_amount /// What thing we look for triggering the loom process (usually a loom) - var/obj/target_type + var/atom/loom_type /// What verb best fits the action of processing whatever the item is, for example "spun [thing]" var/process_completion_verb /// If the target needs to be anchored @@ -19,7 +19,7 @@ obj/item/target, resulting_atom = /obj/item/stack/sheet/cloth, required_amount = 4, - target_type = /obj/structure/loom, + loom_type = /obj/structure/loom, process_completion_verb = "spun", target_needs_anchoring = TRUE, loom_time = 1 SECONDS @@ -30,28 +30,28 @@ return ELEMENT_INCOMPATIBLE src.resulting_atom = resulting_atom src.required_amount = required_amount - src.target_type = target_type + src.loom_type = loom_type src.process_completion_verb = process_completion_verb src.target_needs_anchoring = target_needs_anchoring src.loom_time = loom_time - RegisterSignal(target, COMSIG_ITEM_ATTACK_OBJ, PROC_REF(try_and_loom_me)) + RegisterSignal(target, COMSIG_ITEM_ATTACK_ATOM, PROC_REF(try_and_loom_me)) RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) /datum/element/loomable/Detach(obj/item/source) . = ..() - UnregisterSignal(source, list(COMSIG_ITEM_ATTACK_OBJ, COMSIG_ATOM_EXAMINE)) + UnregisterSignal(source, list(COMSIG_ITEM_ATTACK_ATOM, COMSIG_ATOM_EXAMINE)) /// Adds an examine blurb to the description of any item that can be loomed /datum/element/loomable/proc/on_examine(obj/item/source, mob/examiner, list/examine_list) SIGNAL_HANDLER - examine_list += span_notice("You could probably process [source] at a [initial(target_type.name)].") + examine_list += span_notice("You could probably process [source] at \a [initial(loom_type.name)].") /// Checks if the thing we clicked on can be used as a loom, and if we can actually loom the source at present (an example being does the stack have enough in it (if its a stack)) /datum/element/loomable/proc/try_and_loom_me(obj/item/source, atom/target, mob/living/user) SIGNAL_HANDLER - if(!istype(target, target_type)) + if(!istype(target, loom_type)) return if(ismovable(target)) @@ -72,12 +72,22 @@ /// If a do_after of the specified loom_time passes, will create a new one of resulting_atom and either delete the item, or .use the required amount if its a stack /datum/element/loomable/proc/loom_me(obj/item/source, mob/living/user, atom/target) if(!do_after(user, loom_time, target)) + user.balloon_alert(user, "interrupted!") return - var/new_thing = new resulting_atom(target.drop_location()) - user.balloon_alert_to_viewers("[process_completion_verb] [new_thing]") + ///we need to perform another check in case a stack somehow got diminished in the middle of the do_after + var/successful = TRUE if(isstack(source)) var/obj/item/stack/stack_we_use = source - stack_we_use.use(required_amount) + if(!stack_we_use.use(required_amount)) + successful = FALSE else qdel(source) + + //ripbozo + if(!successful) + user.balloon_alert(user, "need [required_amount] of [source]!") + return + + var/new_thing = new resulting_atom(target.drop_location()) + user.balloon_alert_to_viewers("[process_completion_verb] [new_thing]") diff --git a/code/datums/elements/mirage_border.dm b/code/datums/elements/mirage_border.dm new file mode 100644 index 0000000000000..999455a0b8343 --- /dev/null +++ b/code/datums/elements/mirage_border.dm @@ -0,0 +1,41 @@ +/** + * 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 diff --git a/code/datums/elements/mob_grabber.dm b/code/datums/elements/mob_grabber.dm new file mode 100644 index 0000000000000..a85c5dc48b25a --- /dev/null +++ b/code/datums/elements/mob_grabber.dm @@ -0,0 +1,30 @@ +/// Grab onto mobs we attack +/datum/element/mob_grabber + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + /// What state must the mob be in to be grabbed? + var/minimum_stat + /// If someone else is already grabbing this, will we take it? + var/steal_from_others + +/datum/element/mob_grabber/Attach(datum/target, minimum_stat = SOFT_CRIT, steal_from_others = TRUE) + . = ..() + if (!isliving(target)) + return ELEMENT_INCOMPATIBLE + src.minimum_stat = minimum_stat + src.steal_from_others = steal_from_others + RegisterSignals(target, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_HOSTILE_PRE_ATTACKINGTARGET), PROC_REF(grab_mob)) + +/datum/element/mob_grabber/Detach(datum/source) + UnregisterSignal(source, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_HOSTILE_PRE_ATTACKINGTARGET)) + . = ..() + +/// Try and grab something we attacked +/datum/element/mob_grabber/proc/grab_mob(mob/living/source, mob/living/target) + SIGNAL_HANDLER + if (!isliving(target) || !source.Adjacent(target) || target.stat < minimum_stat) + return + var/atom/currently_pulled = target.pulledby + if (!isnull(currently_pulled) && (!steal_from_others || currently_pulled == source)) + return + INVOKE_ASYNC(target, TYPE_PROC_REF(/mob/living, grabbedby), source) diff --git a/code/datums/elements/movement_turf_changer.dm b/code/datums/elements/movement_turf_changer.dm index 1147c3a83530d..c42ef287f8131 100644 --- a/code/datums/elements/movement_turf_changer.dm +++ b/code/datums/elements/movement_turf_changer.dm @@ -26,7 +26,7 @@ SIGNAL_HANDLER var/turf/destination = target.loc - if(!isturf(destination) || istype(destination, turf_type) || isopenspaceturf(destination)) + if(!isturf(destination) || istype(destination, turf_type) || isgroundlessturf(destination)) return destination.PlaceOnTop(turf_type) diff --git a/code/datums/elements/noisy_movement.dm b/code/datums/elements/noisy_movement.dm new file mode 100644 index 0000000000000..f4215dd48bf4f --- /dev/null +++ b/code/datums/elements/noisy_movement.dm @@ -0,0 +1,21 @@ +/datum/element/noisy_movement + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + var/movement_sound + var/volume + +/datum/element/noisy_movement/Attach(datum/target, movement_sound = 'sound/effects/roll.ogg', volume = 100) + . = ..() + if(!ismovable(target)) + return ELEMENT_INCOMPATIBLE + + src.movement_sound = movement_sound + src.volume = volume + + RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(play_sound)) + +/datum/element/noisy_movement/proc/play_sound(atom/movable/source, old_loc, movement_dir, forced) + SIGNAL_HANDLER + if(!forced && !CHECK_MOVE_LOOP_FLAGS(source, MOVEMENT_LOOP_OUTSIDE_CONTROL) && source.has_gravity()) + playsound(source, movement_sound, volume, TRUE) + diff --git a/code/datums/elements/noticable_organ.dm b/code/datums/elements/noticable_organ.dm index 9288c18a627f8..1a6a895e53543 100644 --- a/code/datums/elements/noticable_organ.dm +++ b/code/datums/elements/noticable_organ.dm @@ -53,7 +53,7 @@ if(!should_show_text(examined)) return - var/examine_text = replacetext(replacetext("[body_zone ? examined.p_their(TRUE) : examined.p_they(TRUE)] [infused_desc]", "%PRONOUN_ES", examined.p_es()), "%PRONOUN_S", examined.p_s()) + var/examine_text = replacetext(replacetext("[body_zone ? examined.p_Their() : examined.p_They()] [infused_desc]", "%PRONOUN_ES", examined.p_es()), "%PRONOUN_S", examined.p_s()) if(add_span) examine_text = span_notice(examine_text) examine_list += examine_text diff --git a/code/datums/elements/openspace_item_click_handler.dm b/code/datums/elements/openspace_item_click_handler.dm index f0449892cebd3..c9de01f381cd9 100644 --- a/code/datums/elements/openspace_item_click_handler.dm +++ b/code/datums/elements/openspace_item_click_handler.dm @@ -19,7 +19,11 @@ SIGNAL_HANDLER if(target.z == user.z) return - var/turf/turf_above = get_step_multiz(target, UP) - if(turf_above?.z == user.z) - INVOKE_ASYNC(source, TYPE_PROC_REF(/obj/item, handle_openspace_click), turf_above, user, user.CanReach(turf_above, source), click_parameters) + var/turf/checked_turf = get_turf(target) + while(!isnull(checked_turf)) + checked_turf = GET_TURF_ABOVE(checked_turf) + if(checked_turf?.z == user.z) + INVOKE_ASYNC(source, TYPE_PROC_REF(/obj/item, handle_openspace_click), checked_turf, user, user.CanReach(checked_turf, source), click_parameters) + break + return COMPONENT_AFTERATTACK_PROCESSED_ITEM diff --git a/code/datums/elements/projectile_drop.dm b/code/datums/elements/projectile_drop.dm new file mode 100644 index 0000000000000..36e189d6c3aeb --- /dev/null +++ b/code/datums/elements/projectile_drop.dm @@ -0,0 +1,36 @@ +/** + * A simple element that spawns an atom when the bullet hits an object or reaches the end of its range + * If the projectile has embedding and it can embed into the target, then it won't spawn the drop, + * since embedding the embed element already handles that. + */ +/datum/element/projectile_drop + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + var/drop_type + +/datum/element/projectile_drop/Attach(datum/target, drop_type) + . = ..() + if(!isprojectile(target)) + return ELEMENT_INCOMPATIBLE + src.drop_type = drop_type + RegisterSignal(target, COMSIG_PROJECTILE_RANGE_OUT, PROC_REF(spawn_drop)) + RegisterSignal(target, COMSIG_PROJECTILE_SELF_ON_HIT, PROC_REF(spawn_drop_if_not_embeddable)) + +/datum/element/projectile_drop/Detach(datum/source) + UnregisterSignal(source, list(COMSIG_PROJECTILE_RANGE_OUT, COMSIG_PROJECTILE_SELF_ON_HIT)) + return ..() + +/datum/element/projectile_drop/proc/spawn_drop(obj/projectile/source) + SIGNAL_HANDLER + var/turf/turf = get_turf(source) + var/atom/new_drop = new drop_type(turf) + SEND_SIGNAL(source, COMSIG_PROJECTILE_ON_SPAWN_DROP, new_drop) + //Just to be safe, knowing it won't be spawned multiple times. + Detach(source) + +/datum/element/projectile_drop/proc/spawn_drop_if_not_embeddable(obj/projectile/source, atom/movable/firer, atom/hit, angle, hit_zone) + SIGNAL_HANDLER + if(source.can_embed_into(hit)) + Detach(source) + return + spawn_drop(source) diff --git a/code/datums/elements/radioactive.dm b/code/datums/elements/radioactive.dm index e4e8059a7a410..1ce915747aa99 100644 --- a/code/datums/elements/radioactive.dm +++ b/code/datums/elements/radioactive.dm @@ -1,20 +1,40 @@ #define DELAY_BETWEEN_RADIATION_PULSES (3 SECONDS) /// This atom will regularly pulse radiation. -/// As this is only applied on uranium objects for now, this defaults to uranium constants. /datum/element/radioactive - element_flags = ELEMENT_DETACH_ON_HOST_DESTROY + element_flags = ELEMENT_DETACH_ON_HOST_DESTROY | ELEMENT_BESPOKE + argument_hash_start_idx = 2 + ///Range of our wave in tiles + var/range + ///Threshold for radioactive permeance + var/threshold + ///Chance the object is irradiated + var/chance + ///Minimum time needed in order to be irradiated + var/minimum_exposure_time var/list/radioactive_objects = list() /datum/element/radioactive/New() START_PROCESSING(SSdcs, src) -/datum/element/radioactive/Attach(datum/target) +/datum/element/radioactive/Attach( + datum/target, + range = 3, + threshold = RAD_LIGHT_INSULATION, + chance = URANIUM_IRRADIATION_CHANCE, + minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME, + ) + . = ..() radioactive_objects[target] = world.time + src.range = range + src.threshold = threshold + src.chance = chance + src.minimum_exposure_time = minimum_exposure_time + /datum/element/radioactive/Detach(datum/source, ...) radioactive_objects -= source @@ -27,10 +47,10 @@ radiation_pulse( radioactive_object, - max_range = 3, - threshold = RAD_LIGHT_INSULATION, - chance = URANIUM_IRRADIATION_CHANCE, - minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME, + max_range = range, + threshold = threshold, + chance = chance, + minimum_exposure_time = minimum_exposure_time, ) radioactive_objects[radioactive_object] = world.time diff --git a/code/datums/elements/ranged_armour.dm b/code/datums/elements/ranged_armour.dm new file mode 100644 index 0000000000000..61a3bc647d628 --- /dev/null +++ b/code/datums/elements/ranged_armour.dm @@ -0,0 +1,61 @@ +/// Reduces or nullifies damage from ranged weaponry with force below a certain value +/datum/element/ranged_armour + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + /// The minimum force a projectile must have to ignore our armour + var/minimum_projectile_force + /// Projectile damage below the minimum is multiplied by this value + var/below_projectile_multiplier + /// Projectile damage types which work regardless of force + var/list/vulnerable_projectile_types + /// The minimum force a thrown object must have to ignore our armour + var/minimum_thrown_force + /// Message to output if throwing damage is absorbed + var/throw_blocked_message + +/datum/element/ranged_armour/Attach( + atom/target, + minimum_projectile_force = 0, + below_projectile_multiplier = 0, + list/vulnerable_projectile_types = list(), + minimum_thrown_force = 0, + throw_blocked_message = "bounces off", +) + . = ..() + if (!isatom(target)) + return ELEMENT_INCOMPATIBLE + src.minimum_projectile_force = minimum_projectile_force + src.below_projectile_multiplier = below_projectile_multiplier + src.vulnerable_projectile_types = vulnerable_projectile_types + src.minimum_thrown_force = minimum_thrown_force + src.throw_blocked_message = throw_blocked_message + + if (minimum_projectile_force > 0) + RegisterSignal(target, COMSIG_PROJECTILE_PREHIT, PROC_REF(pre_bullet_impact)) + if (minimum_thrown_force > 0) + RegisterSignal(target, COMSIG_ATOM_PREHITBY, PROC_REF(pre_thrown_impact)) + +/datum/element/ranged_armour/Detach(datum/target) + UnregisterSignal(target, list(COMSIG_PROJECTILE_PREHIT, COMSIG_ATOM_PREHITBY)) + return ..() + +/// Modify or ignore bullet damage based on projectile properties +/datum/element/ranged_armour/proc/pre_bullet_impact(atom/parent, list/signal_args, obj/projectile/bullet) + SIGNAL_HANDLER + if (bullet.damage >= minimum_projectile_force || (bullet.damage_type in vulnerable_projectile_types)) + return + if (below_projectile_multiplier == 0) + parent.visible_message(span_danger("[parent] seems unharmed by [bullet]!")) + return PROJECTILE_INTERRUPT_HIT + bullet.damage *= below_projectile_multiplier + parent.visible_message(span_danger("[parent] seems resistant to [bullet]!")) + +/// Ignore thrown damage based on projectile properties. There's no elegant way to multiply the damage because throwforce is persistent. +/datum/element/ranged_armour/proc/pre_thrown_impact(atom/parent, obj/item/hit_atom, datum/thrownthing/throwingdatum) + SIGNAL_HANDLER + if (!isitem(hit_atom)) + return + if (hit_atom.throwforce >= minimum_thrown_force) + return + parent.visible_message(span_danger("[hit_atom] [throw_blocked_message] [parent]!")) + return COMSIG_HIT_PREVENTED diff --git a/code/datums/elements/ranged_attacks.dm b/code/datums/elements/ranged_attacks.dm deleted file mode 100644 index abef602632fa2..0000000000000 --- a/code/datums/elements/ranged_attacks.dm +++ /dev/null @@ -1,57 +0,0 @@ -///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_BESPOKE - argument_hash_start_idx = 2 - var/casingtype = /obj/item/ammo_casing/glockroach - var/projectilesound = 'sound/weapons/gun/pistol/shot.ogg' - var/projectiletype - -/datum/element/ranged_attacks/Attach(atom/movable/target, casingtype, projectilesound, projectiletype) - . = ..() - if(!isbasicmob(target)) - return COMPONENT_INCOMPATIBLE - - src.casingtype = casingtype - src.projectilesound = projectilesound - src.projectiletype = projectiletype - - RegisterSignal(target, COMSIG_MOB_ATTACK_RANGED, PROC_REF(fire_ranged_attack)) - - if(casingtype && projectiletype) - CRASH("Set both casing type and projectile type in [target]'s ranged attacks element! uhoh! stinky!") - -/datum/element/ranged_attacks/Detach(datum/target) - UnregisterSignal(target, COMSIG_MOB_ATTACK_RANGED) - return ..() - -/datum/element/ranged_attacks/proc/fire_ranged_attack(mob/living/basic/firer, atom/target, modifiers) - SIGNAL_HANDLER - INVOKE_ASYNC(src, PROC_REF(async_fire_ranged_attack), firer, target, modifiers) - - -/datum/element/ranged_attacks/proc/async_fire_ranged_attack(mob/living/basic/firer, atom/target, modifiers) - var/turf/startloc = get_turf(firer) - - if(casingtype) - var/obj/item/ammo_casing/casing = new casingtype(startloc) - playsound(firer, projectilesound, 100, TRUE) - var/target_zone - if(ismob(target)) - var/mob/target_mob = target - target_zone = target_mob.get_random_valid_zone() - else - target_zone = ran_zone() - casing.fire_casing(target, firer, null, null, null, target_zone, 0, firer) - casing.AddElement(/datum/element/temporary_atom, 30 SECONDS) - - else if(projectiletype) - var/obj/projectile/P = new projectiletype(startloc) - playsound(firer, projectilesound, 100, TRUE) - P.starting = startloc - P.firer = firer - P.fired_from = firer - P.yo = target.y - startloc.y - P.xo = target.x - startloc.x - P.original = target - P.preparePixelProjectile(target, firer) - P.fire() diff --git a/code/datums/elements/relay_attackers.dm b/code/datums/elements/relay_attackers.dm index 23503bfbcc2ad..9f134daf71b60 100644 --- a/code/datums/elements/relay_attackers.dm +++ b/code/datums/elements/relay_attackers.dm @@ -11,10 +11,11 @@ RegisterSignal(target, COMSIG_ATOM_AFTER_ATTACKEDBY, PROC_REF(after_attackby)) RegisterSignals(target, list(COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_ATTACK_PAW, COMSIG_MOB_ATTACK_ALIEN), PROC_REF(on_attack_generic)) RegisterSignals(target, list(COMSIG_ATOM_ATTACK_BASIC_MOB, COMSIG_ATOM_ATTACK_ANIMAL), PROC_REF(on_attack_npc)) - RegisterSignal(target, COMSIG_ATOM_BULLET_ACT, PROC_REF(on_bullet_act)) - RegisterSignal(target, COMSIG_ATOM_HITBY, PROC_REF(on_hitby)) + RegisterSignal(target, COMSIG_PROJECTILE_PREHIT, PROC_REF(on_bullet_act)) + RegisterSignal(target, COMSIG_ATOM_PREHITBY, PROC_REF(on_hitby)) RegisterSignal(target, COMSIG_ATOM_HULK_ATTACK, PROC_REF(on_attack_hulk)) RegisterSignal(target, COMSIG_ATOM_ATTACK_MECH, PROC_REF(on_attack_mech)) + ADD_TRAIT(target, TRAIT_RELAYING_ATTACKER, REF(src)) /datum/element/relay_attackers/Detach(datum/source, ...) . = ..() @@ -25,36 +26,47 @@ COMSIG_ATOM_ATTACK_BASIC_MOB, COMSIG_ATOM_ATTACK_ANIMAL, COMSIG_MOB_ATTACK_ALIEN, - COMSIG_ATOM_BULLET_ACT, - COMSIG_ATOM_HITBY, + COMSIG_PROJECTILE_PREHIT, + COMSIG_ATOM_PREHITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_MECH, )) + REMOVE_TRAIT(source, TRAIT_RELAYING_ATTACKER, REF(src)) /datum/element/relay_attackers/proc/after_attackby(atom/target, obj/item/weapon, mob/attacker) SIGNAL_HANDLER if(weapon.force) - relay_attacker(target, attacker) + relay_attacker(target, attacker, weapon.damtype == STAMINA ? ATTACKER_STAMINA_ATTACK : ATTACKER_DAMAGING_ATTACK) /datum/element/relay_attackers/proc/on_attack_generic(atom/target, mob/living/attacker, list/modifiers) SIGNAL_HANDLER - if(attacker.combat_mode || LAZYACCESS(modifiers, RIGHT_CLICK)) - relay_attacker(target, attacker) + + // Check for a shove. + if(LAZYACCESS(modifiers, RIGHT_CLICK)) + relay_attacker(target, attacker, ATTACKER_SHOVING) + return + + // Else check for combat mode. + if(attacker.combat_mode) + relay_attacker(target, attacker, ATTACKER_DAMAGING_ATTACK) + return /datum/element/relay_attackers/proc/on_attack_npc(atom/target, mob/living/attacker) SIGNAL_HANDLER if(attacker.melee_damage_upper > 0) - relay_attacker(target, attacker) + relay_attacker(target, attacker, ATTACKER_DAMAGING_ATTACK) -/datum/element/relay_attackers/proc/on_bullet_act(atom/target, obj/projectile/hit_projectile) +/// Even if another component blocked this hit, someone still shot at us +/datum/element/relay_attackers/proc/on_bullet_act(atom/target, list/bullet_args, obj/projectile/hit_projectile) SIGNAL_HANDLER if(!hit_projectile.is_hostile_projectile()) return if(!ismob(hit_projectile.firer)) return - relay_attacker(target, hit_projectile.firer) + relay_attacker(target, hit_projectile.firer, hit_projectile.damage_type == STAMINA ? ATTACKER_STAMINA_ATTACK : ATTACKER_DAMAGING_ATTACK) -/datum/element/relay_attackers/proc/on_hitby(atom/target, atom/movable/hit_atom, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) +/// Even if another component blocked this hit, someone still threw something +/datum/element/relay_attackers/proc/on_hitby(atom/target, atom/movable/hit_atom, datum/thrownthing/throwingdatum) SIGNAL_HANDLER if(!isitem(hit_atom)) return @@ -64,16 +76,16 @@ var/mob/thrown_by = hit_item.thrownby?.resolve() if(!ismob(thrown_by)) return - relay_attacker(target, thrown_by) + relay_attacker(target, thrown_by, hit_item.damtype == STAMINA ? ATTACKER_STAMINA_ATTACK : ATTACKER_DAMAGING_ATTACK) /datum/element/relay_attackers/proc/on_attack_hulk(atom/target, mob/attacker) SIGNAL_HANDLER - relay_attacker(target, attacker) + relay_attacker(target, attacker, ATTACKER_DAMAGING_ATTACK) /datum/element/relay_attackers/proc/on_attack_mech(atom/target, obj/vehicle/sealed/mecha/mecha_attacker, mob/living/pilot) SIGNAL_HANDLER - relay_attacker(target, mecha_attacker) + relay_attacker(target, mecha_attacker, ATTACKER_DAMAGING_ATTACK) /// Send out a signal identifying whoever just attacked us (usually a mob but sometimes a mech or turret) -/datum/element/relay_attackers/proc/relay_attacker(atom/victim, atom/attacker) - SEND_SIGNAL(victim, COMSIG_ATOM_WAS_ATTACKED, attacker) +/datum/element/relay_attackers/proc/relay_attacker(atom/victim, atom/attacker, attack_flags) + SEND_SIGNAL(victim, COMSIG_ATOM_WAS_ATTACKED, attacker, attack_flags) diff --git a/code/datums/elements/rust.dm b/code/datums/elements/rust.dm index 5f5ee0b26e898..f34182384cecf 100644 --- a/code/datums/elements/rust.dm +++ b/code/datums/elements/rust.dm @@ -51,7 +51,7 @@ /datum/element/rust/proc/handle_tool_use(atom/source, mob/user, obj/item/item) switch(item.tool_behaviour) if(TOOL_WELDER) - if(!item.tool_start_check(user, amount=5)) + if(!item.tool_start_check(user, amount=1)) return user.balloon_alert(user, "burning off rust...") diff --git a/code/datums/elements/screentips/contextual_screentip_mob_typechecks.dm b/code/datums/elements/screentips/contextual_screentip_mob_typechecks.dm new file mode 100644 index 0000000000000..ca0217048f432 --- /dev/null +++ b/code/datums/elements/screentips/contextual_screentip_mob_typechecks.dm @@ -0,0 +1,48 @@ +/// Apply basic contextual screentips when a user of a specific typepath hovers over us. +/// 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_mob_typechecks + element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH_ON_HOST_DESTROY // Detach for turfs + argument_hash_start_idx = 2 + + /// Map of item paths to contexts to usages + var/list/mob_paths_to_contexts + +/datum/element/contextual_screentip_mob_typechecks/Attach(datum/target, mob_paths_to_contexts) + . = ..() + if (!isatom(target)) + return ELEMENT_INCOMPATIBLE + + src.mob_paths_to_contexts = mob_paths_to_contexts + + var/atom/atom_target = target + atom_target.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1 + RegisterSignal(atom_target, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_requesting_context_from_mob)) + +/datum/element/contextual_screentip_mob_typechecks/Detach(datum/source, ...) + UnregisterSignal(source, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM) + + // We don't remove HAS_CONTEXTUAL_SCREENTIPS_1, since there could be other stuff still hooked to it, + // and being set without signals is not dangerous, just less performant. + // A lot of things don't do this, perhaps make a proc that checks if any signals are still set, and if not, + // remove the flag. + + return ..() + +/datum/element/contextual_screentip_mob_typechecks/proc/on_requesting_context_from_mob( + datum/source, + list/context, + obj/item/held_item, + mob/context_mob +) + SIGNAL_HANDLER + + if (isnull(context_mob)) + return NONE + + for (var/mob_path in mob_paths_to_contexts) + if (istype(context_mob, mob_path)) + context += mob_paths_to_contexts[mob_path] + return CONTEXTUAL_SCREENTIP_SET + + return NONE diff --git a/code/datums/elements/sideway_movement.dm b/code/datums/elements/sideway_movement.dm new file mode 100644 index 0000000000000..e6d94745e6cdb --- /dev/null +++ b/code/datums/elements/sideway_movement.dm @@ -0,0 +1,27 @@ +///A simple element that forces the mob to face a perpendicular direction when moving, like crabs. +/datum/element/sideway_movement + +/datum/element/sideway_movement/Attach(atom/movable/target) + . = ..() + if(!ismovable(target)) + return ELEMENT_INCOMPATIBLE + RegisterSignal(target, COMSIG_MOB_CLIENT_MOVED, PROC_REF(on_client_move)) + RegisterSignal(target, COMSIG_MOVABLE_MOVED_FROM_LOOP, PROC_REF(on_moved_from_loop)) + +/datum/element/sideway_movement/proc/on_client_move(atom/movable/source, direction, old_dir) + SIGNAL_HANDLER + on_move(source, direction, old_dir) + +/datum/element/sideway_movement/proc/on_moved_from_loop(atom/movable/source, datum/move_loop/loop, old_dir, direction) + SIGNAL_HANDLER + if(!CHECK_MOVE_LOOP_FLAGS(source, MOVEMENT_LOOP_OUTSIDE_CONTROL|MOVEMENT_LOOP_NO_DIR_UPDATE)) + on_move(source, direction, old_dir) + +///retain the old dir unless walking straight ahead or backward, in which case rotate the dir left or right by a 90° +/datum/element/sideway_movement/proc/on_move(atom/movable/source, direction, old_dir) + if(!source.set_dir_on_move) + return + var/new_dir = old_dir + if(direction == old_dir || direction == REVERSE_DIR(old_dir)) + new_dir = turn(source.dir, pick(90, -90)) + source.setDir(new_dir) diff --git a/code/datums/elements/skill_reward.dm b/code/datums/elements/skill_reward.dm new file mode 100644 index 0000000000000..0c0e04754f744 --- /dev/null +++ b/code/datums/elements/skill_reward.dm @@ -0,0 +1,48 @@ +///An element that forbids mobs without a required skill level from equipping the item. +/datum/element/skill_reward + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + ///The required skill the user has to have to equip the item. + var/associated_skill + +/datum/element/skill_reward/Attach(datum/target, associated_skill) + . = ..() + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE + + src.associated_skill = associated_skill + RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(target, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_attack_hand)) + RegisterSignal(target, COMSIG_ITEM_POST_EQUIPPED, PROC_REF(drop_if_unworthy)) + +/datum/element/skill_reward/proc/on_examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + examine_list += span_notice("You notice a powerful aura about this item, suggesting that only the truly experienced may wield it.") + +/datum/element/skill_reward/proc/on_attack_hand(datum/source, mob/living/user, list/modifiers) + SIGNAL_HANDLER + if(!LAZYACCESS(modifiers, CTRL_CLICK) && !check_equippable(user)) //Allows other players to drag it around at least. + to_chat(user, span_warning("You feel completely and utterly unworthy to even touch \the [source].")) + return COMPONENT_CANCEL_ATTACK_CHAIN + +///We check if the item can be equipped, otherwise we drop it. +/datum/element/skill_reward/proc/drop_if_unworthy(datum/source, mob/living/user) + SIGNAL_HANDLER + if(check_equippable(user) | !(source in user.get_equipped_items(include_pockets = TRUE, include_accessories = TRUE))) + return + to_chat(user, span_warning("You feel completely and utterly unworthy to even touch \the [source].")) + user.dropItemToGround(src, TRUE) + return COMPONENT_EQUIPPED_FAILED + +/datum/element/skill_reward/proc/check_equippable(mob/living/user) + return user.mind?.get_skill_level(associated_skill) >= SKILL_LEVEL_LEGENDARY + +/** + * Welp, the code is pretty much the same, except for one tiny detail, I suppose it's ok to make a subtype of this element. + * That tiny detail is that we don't check for skills, but if the player has played for thousands of hours. + */ +/datum/element/skill_reward/veteran + element_flags = NONE + +/datum/element/skill_reward/veteran/check_equippable(mob/user) + return user.client?.is_veteran() diff --git a/code/datums/elements/skittish.dm b/code/datums/elements/skittish.dm index 0690739c539c1..7f642377370f2 100644 --- a/code/datums/elements/skittish.dm +++ b/code/datums/elements/skittish.dm @@ -17,7 +17,7 @@ /datum/element/skittish/proc/Bump(mob/living/scooby, atom/target) SIGNAL_HANDLER - if(scooby.stat != CONSCIOUS || scooby.m_intent != MOVE_INTENT_RUN) + if(scooby.stat != CONSCIOUS || scooby.move_intent != MOVE_INTENT_RUN) return if(!istype(target, /obj/structure/closet)) diff --git a/code/datums/elements/sticker.dm b/code/datums/elements/sticker.dm index 4ef2a9bb324e9..3cc8e977daf20 100644 --- a/code/datums/elements/sticker.dm +++ b/code/datums/elements/sticker.dm @@ -1,3 +1,5 @@ +#define MAX_ALLOWED_STICKERS 12 + /datum/element/sticker ///The typepath for our attached sticker component var/stick_type = /datum/component/attached_sticker @@ -9,7 +11,7 @@ if(!isitem(target)) return ELEMENT_INCOMPATIBLE RegisterSignal(target, COMSIG_ITEM_AFTERATTACK, PROC_REF(on_afterattack)) - RegisterSignal(target, COMSIG_MOVABLE_IMPACT, PROC_REF(on_throw_impact)) + RegisterSignal(target, COMSIG_MOVABLE_IMPACT, PROC_REF(on_throw_impact)) if(sticker_type) stick_type = sticker_type washable = cleanable @@ -32,14 +34,20 @@ var/py = text2num(LAZYACCESS(parameters, ICON_Y)) - divided_size user.do_attack_animation(target) - do_stick(source, target, user, px, py) + if(do_stick(source, target, user, px, py)) + target.balloon_alert_to_viewers("sticker sticked") ///Add our stick_type to the target with px and py as pixel x and pixel y respectively /datum/element/sticker/proc/do_stick(obj/item/source, atom/target, mob/living/user, px, py) + if(COUNT_TRAIT_SOURCES(target, TRAIT_STICKERED) >= MAX_ALLOWED_STICKERS) + source.balloon_alert_to_viewers("sticker won't stick!") + return FALSE target.AddComponent(stick_type, px, py, source, user, washable) + return TRUE /datum/element/sticker/proc/on_throw_impact(obj/item/source, atom/hit_atom, datum/thrownthing/throwingdatum) SIGNAL_HANDLER - if(prob(50)) - do_stick(source, hit_atom, null, rand(-7,7), rand(-7,7)) - source.balloon_alert_to_viewers("the sticker lands on its sticky side!") + if(prob(50) && do_stick(source, hit_atom, null, rand(-7,7), rand(-7,7))) + hit_atom.balloon_alert_to_viewers("sticker landed on sticky side!") + +#undef MAX_ALLOWED_STICKERS diff --git a/code/datums/elements/strippable.dm b/code/datums/elements/strippable.dm index cc65721d72bfe..1ffa709439cf3 100644 --- a/code/datums/elements/strippable.dm +++ b/code/datums/elements/strippable.dm @@ -14,7 +14,7 @@ /// An existing strip menus var/list/strip_menus -/datum/element/strippable/Attach(datum/target, list/items, should_strip_proc_path) +/datum/element/strippable/Attach(datum/target, list/items = list(), should_strip_proc_path) . = ..() if (!isatom(target)) return ELEMENT_INCOMPATIBLE @@ -342,7 +342,7 @@ continue var/obj/item/item = item_data.get_item(owner) - if (isnull(item) || (HAS_TRAIT(item, TRAIT_NO_STRIP))) + if (isnull(item) || (HAS_TRAIT(item, TRAIT_NO_STRIP) || (item.item_flags & EXAMINE_SKIP))) items[strippable_key] = result continue diff --git a/code/datums/elements/tear_wall.dm b/code/datums/elements/tear_wall.dm new file mode 100644 index 0000000000000..0d24bbda28985 --- /dev/null +++ b/code/datums/elements/tear_wall.dm @@ -0,0 +1,48 @@ +/** + * Attached to a basic mob that will then be able to tear down a wall after some time. + */ +/datum/element/tear_wall + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 3 + /// The rate at which we can break regular walls + var/regular_tear_time + /// The rate at which we can break reinforced walls + var/reinforced_tear_time + +/datum/element/tear_wall/Attach(datum/target, regular_tear_time = 2 SECONDS, reinforced_tear_time = 4 SECONDS) + . = ..() + if(!isbasicmob(target)) + return ELEMENT_INCOMPATIBLE + + src.regular_tear_time = regular_tear_time + src.reinforced_tear_time = reinforced_tear_time + RegisterSignal(target, COMSIG_HOSTILE_POST_ATTACKINGTARGET, PROC_REF(attack_wall)) + +/datum/element/bonus_damage/Detach(datum/source) + UnregisterSignal(source, COMSIG_HOSTILE_POST_ATTACKINGTARGET) + return ..() + +/// Checks if we are attacking a wall +/datum/element/tear_wall/proc/attack_wall(mob/living/basic/attacker, atom/target, success) + SIGNAL_HANDLER + + if(!iswallturf(target)) + return + var/turf/closed/wall/thewall = target + var/prying_time = regular_tear_time + if(istype(thewall, /turf/closed/wall/r_wall)) + prying_time = reinforced_tear_time + INVOKE_ASYNC(src, PROC_REF(async_attack_wall), attacker, thewall, prying_time) + +/// Performs taking down the wall +/datum/element/tear_wall/proc/async_attack_wall(mob/living/basic/attacker, turf/closed/wall/thewall, prying_time) + if(DOING_INTERACTION_WITH_TARGET(attacker, thewall)) + attacker.balloon_alert(attacker, "busy!") + return + to_chat(attacker, span_warning("You begin tearing through the wall...")) + playsound(attacker, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE) + if(do_after(attacker, prying_time, target = thewall)) + if(isopenturf(thewall)) + return + thewall.dismantle_wall(1) + playsound(attacker, 'sound/effects/meteorimpact.ogg', 100, TRUE) diff --git a/code/datums/elements/temporary_atom.dm b/code/datums/elements/temporary_atom.dm index d1b5d9c0ddf70..6f91e8360b681 100644 --- a/code/datums/elements/temporary_atom.dm +++ b/code/datums/elements/temporary_atom.dm @@ -6,9 +6,12 @@ if (!isatom(target)) return ELEMENT_INCOMPATIBLE - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), target), life_time, TIMER_DELETE_ME) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), WEAKREF(target)), life_time, TIMER_DELETE_ME) if (life_time > fade_time && fade_time > 0) - addtimer(CALLBACK(src, PROC_REF(fade_out), target, fade_time), life_time - fade_time, TIMER_DELETE_ME) + addtimer(CALLBACK(src, PROC_REF(fade_out), WEAKREF(target), fade_time), life_time - fade_time, TIMER_DELETE_ME) -/datum/element/temporary_atom/proc/fade_out(atom/target,fade_time) +/datum/element/temporary_atom/proc/fade_out(datum/weakref/target_ref, fade_time) + var/atom/target = target_ref?.resolve() + if (isnull(target)) + return animate(target, alpha = 0, time = fade_time, flags = ANIMATION_PARALLEL) diff --git a/code/datums/elements/trait_loc.dm b/code/datums/elements/trait_loc.dm deleted file mode 100644 index 512a1edb527f6..0000000000000 --- a/code/datums/elements/trait_loc.dm +++ /dev/null @@ -1,34 +0,0 @@ -/** - * # Trait Loc Element - * - * Adds a trait to the movable's loc, and handles relocating the trait if the movable itself moves. - */ -/datum/element/trait_loc - element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH_ON_HOST_DESTROY // handles if our movable is deleted - argument_hash_start_idx = 2 - /// What trait to apply to the movable's loc. - var/trait_to_give - -/datum/element/trait_loc/Attach(atom/movable/target, trait_to_give) - . = ..() - if(!ismovable(target)) - return ELEMENT_INCOMPATIBLE - - src.trait_to_give = trait_to_give - - RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(on_movable_relocated)) - if(target.loc) - ADD_TRAIT(target.loc, trait_to_give, REF(target)) - -/datum/element/trait_loc/Detach(atom/movable/source, ...) - . = ..() - UnregisterSignal(source, COMSIG_MOVABLE_MOVED) - if(source.loc) - REMOVE_TRAIT(source.loc, trait_to_give, REF(source)) - -/datum/element/trait_loc/proc/on_movable_relocated(atom/movable/source, atom/old_loc) - SIGNAL_HANDLER - - REMOVE_TRAIT(old_loc, trait_to_give, REF(source)) - if(source.loc) - ADD_TRAIT(source.loc, trait_to_give, REF(source)) diff --git a/code/datums/elements/turf_transparency.dm b/code/datums/elements/turf_transparency.dm index ab3a17dc40d51..b050dd0866f0e 100644 --- a/code/datums/elements/turf_transparency.dm +++ b/code/datums/elements/turf_transparency.dm @@ -103,7 +103,7 @@ GLOBAL_LIST_EMPTY(pillars_by_z) if(!holding) return - var/turf/visual_target = to_display.above() + var/turf/visual_target = GET_TURF_ABOVE(to_display) /// Basically, if we used to be under a non transparent turf, but are no longer in that position /// Then we add to the transparent turf we're now under, and nuke the old object if(!istransparentturf(visual_target)) @@ -120,7 +120,7 @@ GLOBAL_LIST_EMPTY(pillars_by_z) turf_sources[to_display] = sources sources |= source - var/turf/visual_target = to_display.above() + var/turf/visual_target = GET_TURF_ABOVE(to_display) if(istransparentturf(visual_target) || isopenspaceturf(visual_target)) visual_target.vis_contents += to_display else @@ -142,7 +142,7 @@ GLOBAL_LIST_EMPTY(pillars_by_z) if(holding) qdel(holding) else - var/turf/visual_target = to_hide.above() + var/turf/visual_target = GET_TURF_ABOVE(to_hide) visual_target.vis_contents -= to_hide if(!length(turf_sources) && !QDELETED(src)) @@ -201,7 +201,7 @@ GLOBAL_LIST_EMPTY(pillars_by_z) ///Updates the viscontents or underlays below this tile. /datum/element/turf_z_transparency/proc/update_multi_z(turf/our_turf) - var/turf/below_turf = our_turf.below() + var/turf/below_turf = GET_TURF_BELOW(our_turf) if(below_turf) // If we actually have something below us, display it. for(var/turf/partner in range(1, below_turf)) // We use our z here to ensure the pillar is actually on our level @@ -228,7 +228,7 @@ GLOBAL_LIST_EMPTY(pillars_by_z) return TRUE /datum/element/turf_z_transparency/proc/clear_multiz(turf/our_turf) - var/turf/below_turf = our_turf.below() + var/turf/below_turf = GET_TURF_BELOW(our_turf) if(below_turf) // If we actually have something below us, we need to clear ourselves from it for(var/turf/partner in range(1, below_turf)) // We use our z here to ensure the pillar is actually on our level diff --git a/code/datums/elements/uplink_reimburse.dm b/code/datums/elements/uplink_reimburse.dm new file mode 100644 index 0000000000000..3ff182ec2314d --- /dev/null +++ b/code/datums/elements/uplink_reimburse.dm @@ -0,0 +1,56 @@ +/** + * Uplink Reimburse element. + * When element is applied onto items, it allows them to be reimbursed if an user pokes an item with a uplink component with them. + * + * Element is only compatible with items. + */ + +/datum/element/uplink_reimburse + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 1 + /// TC to refund! + var/refundable_tc = 1 + +/datum/element/uplink_reimburse/Attach(datum/target, refundable_tc = 1) + . = ..() + + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE + + src.refundable_tc = refundable_tc + + RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(target, COMSIG_ITEM_ATTEMPT_TC_REIMBURSE, PROC_REF(reimburse)) + RegisterSignal(target,COMSIG_TRAITOR_ITEM_USED(target.type), PROC_REF(used)) + +/datum/element/uplink_reimburse/Detach(datum/target) + UnregisterSignal(target, list(COMSIG_ATOM_EXAMINE, COMSIG_TRAITOR_ITEM_USED(target.type), COMSIG_ITEM_ATTEMPT_TC_REIMBURSE)) + + + return ..() + +///signal called on parent being examined +/datum/element/uplink_reimburse/proc/on_examine(datum/target, mob/user, list/examine_list) + SIGNAL_HANDLER + + if(!IS_TRAITOR(user) && !IS_NUKE_OP(user)) + examine_list += span_warning("There's a label on the side, but it's written in indecipherable gibberish. You have no idea what it means!") + return + + examine_list += span_notice("There's a label written in codespeak on the side, saying that this item can be refunded for [refundable_tc] by applying it onto an uplink.") + +/datum/element/uplink_reimburse/proc/reimburse(obj/item/refund_item, mob/user, datum/component/uplink/uplink_comp) + SIGNAL_HANDLER + + if(!uplink_comp) + CRASH("No uplink component in arguments detected") + + to_chat(user, span_notice("You tap [uplink_comp.uplink_handler] with [refund_item], and a moment after [refund_item] disappears in a puff of red smoke!")) + do_sparks(2, source = uplink_comp.uplink_handler) + uplink_comp.add_telecrystals(refundable_tc) + qdel(refund_item) +/// If the item is used, it needs to no longer be refundable +/datum/element/uplink_reimburse/proc/used(datum/target) + SIGNAL_HANDLER + + Detach(target) diff --git a/code/datums/elements/waddling.dm b/code/datums/elements/waddling.dm index 9d9aede83edf4..825b0c4e4cb82 100644 --- a/code/datums/elements/waddling.dm +++ b/code/datums/elements/waddling.dm @@ -4,30 +4,21 @@ . = ..() 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, atom/oldloc, direction, forced) +/datum/element/waddling/proc/Waddle(atom/movable/moved, atom/oldloc, direction, forced) SIGNAL_HANDLER - - if(forced || target.incapacitated() || target.body_position == LYING_DOWN || CHECK_MOVE_LOOP_FLAGS(target, MOVEMENT_LOOP_OUTSIDE_CONTROL)) - return - waddling_animation(target) - - -/datum/element/waddling/proc/Waddle(atom/movable/target, atom/oldloc, direction, forced) - SIGNAL_HANDLER - - if(forced || CHECK_MOVE_LOOP_FLAGS(target, MOVEMENT_LOOP_OUTSIDE_CONTROL)) + if(forced || CHECK_MOVE_LOOP_FLAGS(moved, MOVEMENT_LOOP_OUTSIDE_CONTROL)) return - waddling_animation(target) + if(isliving(moved)) + var/mob/living/living_moved = moved + if (living_moved.incapacitated() || living_moved.body_position == LYING_DOWN) + return + waddling_animation(moved) /datum/element/waddling/proc/waddling_animation(atom/movable/target) animate(target, pixel_z = 4, time = 0) diff --git a/code/datums/elements/weapon_description.dm b/code/datums/elements/weapon_description.dm index 1217d478482db..0897b571159bb 100644 --- a/code/datums/elements/weapon_description.dm +++ b/code/datums/elements/weapon_description.dm @@ -75,16 +75,16 @@ if(!source.override_notes) // Make sure not to divide by 0 on accident if(source.force > 0) - readout += "[source.p_they(capitalized = TRUE)] takes about [span_warning("[HITS_TO_CRIT(source.force)] melee hit\s")] to take down an enemy." + readout += "It takes about [span_warning("[HITS_TO_CRIT(source.force)] melee hit\s")] to take down an enemy." else - readout += "[source.p_they(capitalized = TRUE)] does not deal noticeable melee damage." + readout += "It does not deal noticeable melee damage." if(source.throwforce > 0) - readout += "[source.p_they(capitalized = TRUE)] takes about [span_warning("[HITS_TO_CRIT(source.throwforce)] throwing hit\s")] to take down an enemy." + readout += "It takes about [span_warning("[HITS_TO_CRIT(source.throwforce)] throwing hit\s")] to take down an enemy." else - readout += "[source.p_they(capitalized = TRUE)] does not deal noticeable throwing damage." + readout += "It does not deal noticeable throwing damage." if(source.armour_penetration > 0 || source.block_chance > 0) - readout += "[source.p_they(capitalized = TRUE)] has [span_warning("[weapon_tag_convert(source.armour_penetration)]")] armor-piercing capability and [span_warning("[weapon_tag_convert(source.block_chance)]")] blocking capability." + readout += "It has [span_warning("[weapon_tag_convert(source.armour_penetration)]")] armor-piercing capability and [span_warning("[weapon_tag_convert(source.block_chance)]")] blocking capability." // Custom manual notes if(source.offensive_notes) readout += source.offensive_notes diff --git a/code/datums/elements/wheel.dm b/code/datums/elements/wheel.dm new file mode 100644 index 0000000000000..2bb8977ca5cae --- /dev/null +++ b/code/datums/elements/wheel.dm @@ -0,0 +1,28 @@ +/// Element which spins you as you move +/datum/element/wheel + +/datum/element/wheel/Attach(datum/target) + . = ..() + if(!ismovable(target)) + return ELEMENT_INCOMPATIBLE + RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) + +/datum/element/wheel/Detach(datum/source) + . = ..() + UnregisterSignal(source, COMSIG_MOVABLE_MOVED) + +/datum/element/wheel/proc/on_moved(atom/movable/moved, atom/oldloc, direction, forced) + SIGNAL_HANDLER + if(forced || CHECK_MOVE_LOOP_FLAGS(moved, MOVEMENT_LOOP_OUTSIDE_CONTROL)) + return + if(isliving(moved)) + var/mob/living/living_moved = moved + if (living_moved.incapacitated() || living_moved.body_position == LYING_DOWN) + return + var/rotation_degree = (360 / 3) + if(direction & SOUTHWEST) + rotation_degree *= -1 + + var/matrix/to_turn = matrix(moved.transform) + to_turn = turn(moved.transform, rotation_degree) + animate(moved, transform = to_turn, time = 0.1 SECONDS, flags = ANIMATION_PARALLEL) diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index c74d2b45a963a..8cc784d81f0c4 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -86,6 +86,8 @@ . = TRUE if(!can_run_emote(user, TRUE, intentional)) return FALSE + if(SEND_SIGNAL(user, COMSIG_MOB_PRE_EMOTED, key, params, type_override, intentional) & COMPONENT_CANT_EMOTE) + return // We don't return FALSE because the error output would be incorrect, provide your own if necessary. var/msg = select_message_type(user, message, intentional) if(params && message_param) msg = select_param(user, params) @@ -108,7 +110,7 @@ for(var/mob/ghost as anything in GLOB.dead_mob_list) if(!ghost.client || isnewplayer(ghost)) continue - if(ghost.client.prefs.chat_toggles & CHAT_GHOSTSIGHT && !(ghost in viewers(user_turf, null))) + if(get_chat_toggles(ghost.client) & CHAT_GHOSTSIGHT && !(ghost in viewers(user_turf, null))) ghost.show_message("[FOLLOW_LINK(ghost, user)] [dchatmsg]") if(emote_type & (EMOTE_AUDIBLE | EMOTE_VISIBLE)) //emote is audible and visible user.audible_message(msg, deaf_message = "You see how [user] [msg]", audible_message_flags = EMOTE_MESSAGE) @@ -119,8 +121,6 @@ if(viewer.is_blind() && !viewer.can_hear()) to_chat(viewer, msg) - SEND_SIGNAL(user, COMSIG_MOB_EMOTED(key)) - /** * For handling emote cooldown, return true to allow the emote to happen. * @@ -187,23 +187,29 @@ /datum/emote/proc/select_message_type(mob/user, msg, intentional) // Basically, we don't care that the others can use datum variables, because they're never going to change. . = msg + if(!isliving(user)) + return . + var/mob/living/living_user = user + if(!muzzle_ignore && user.is_muzzled() && emote_type & EMOTE_AUDIBLE) return "makes a [pick("strong ", "weak ", "")]noise." - if(HAS_TRAIT(user, TRAIT_MIMING) && message_mime) + if(HAS_MIND_TRAIT(user, TRAIT_MIMING) && message_mime) . = message_mime if(isalienadult(user) && message_alien) . = message_alien else if(islarva(user) && message_larva) . = message_larva - else if(iscyborg(user) && message_robot) - . = message_robot else if(isAI(user) && message_AI) . = message_AI else if(ismonkey(user) && message_monkey) . = message_monkey + else if((iscyborg(user) || (living_user.mob_biotypes & MOB_ROBOTIC)) && message_robot) + . = message_robot else if(isanimal_or_basicmob(user) && message_animal_or_basic) . = message_animal_or_basic + return . + /** * Replaces the %t in the message in message_param by params. * @@ -271,7 +277,7 @@ return FALSE if(ishuman(user)) var/mob/living/carbon/human/loud_mouth = user - if(HAS_TRAIT(loud_mouth, TRAIT_MIMING)) // vow of silence prevents outloud noises + if(HAS_MIND_TRAIT(loud_mouth, TRAIT_MIMING)) // vow of silence prevents outloud noises return FALSE if(!loud_mouth.get_organ_slot(ORGAN_SLOT_TONGUE)) return FALSE @@ -289,24 +295,27 @@ * * Returns TRUE if it was able to run the emote, FALSE otherwise. */ -/mob/proc/manual_emote(text) //Just override the song and dance - . = TRUE - if(stat != CONSCIOUS) - return - +/atom/proc/manual_emote(text) if(!text) CRASH("Someone passed nothing to manual_emote(), fix it") log_message(text, LOG_EMOTE) + visible_message(text, visible_message_flags = EMOTE_MESSAGE) + return TRUE +/mob/manual_emote(text) + if (stat != CONSCIOUS) + return FALSE + . = ..() + if (!.) + return FALSE + if (!client) + return TRUE var/ghost_text = "[src] [text]" - var/origin_turf = get_turf(src) - if(client) - for(var/mob/ghost as anything in GLOB.dead_mob_list) - if(!ghost.client || isnewplayer(ghost)) - continue - if(ghost.client.prefs.chat_toggles & CHAT_GHOSTSIGHT && !(ghost in viewers(origin_turf, null))) - ghost.show_message("[FOLLOW_LINK(ghost, src)] [ghost_text]") - - visible_message(text, visible_message_flags = EMOTE_MESSAGE) + for(var/mob/ghost as anything in GLOB.dead_mob_list) + if(!ghost.client || isnewplayer(ghost)) + continue + if(get_chat_toggles(ghost.client) & CHAT_GHOSTSIGHT && !(ghost in viewers(origin_turf, null))) + ghost.show_message("[FOLLOW_LINK(ghost, src)] [ghost_text]") + return TRUE diff --git a/code/datums/ert.dm b/code/datums/ert.dm index f823873bff163..7e358b38cecb4 100644 --- a/code/datums/ert.dm +++ b/code/datums/ert.dm @@ -116,3 +116,13 @@ polldesc = "a Centcom-hired bounty hunting gang" random_names = FALSE ert_template = /datum/map_template/shuttle/ert/bounty + +/datum/ert/militia + roles = list(/datum/antagonist/ert/militia) + leader_role = /datum/antagonist/ert/militia/general + teamsize = 4 + opendoors = FALSE + rename_team = "Frontier Militia" + mission = "Having heard the station's request for aid, assist the crew in defending themselves." + polldesc = "an independent station defense militia" + random_names = TRUE diff --git a/code/datums/forced_movement.dm b/code/datums/forced_movement.dm index 93371f0430b83..407f258281c60 100644 --- a/code/datums/forced_movement.dm +++ b/code/datums/forced_movement.dm @@ -33,6 +33,7 @@ STOP_PROCESSING(SSfastprocess, src) victim = null target = null + on_step = null return ..() //Todo: convert diff --git a/code/datums/greyscale/README.md b/code/datums/greyscale/README.md index ca4e28bf843ef..65f5c488790bf 100644 --- a/code/datums/greyscale/README.md +++ b/code/datums/greyscale/README.md @@ -9,7 +9,9 @@ If you're wanting to add easy recolors for your sprite then this is the system f ## Other Documents +- [Troubleshooting help](https://hackmd.io/@tgstation/GAGS-Troubleshooting) - [Basic follow along guide on hackmd](https://hackmd.io/@tgstation/GAGS-Walkthrough) +- [Layer types list](https://hackmd.io/@tgstation/GAGS-Layer-Types) ## Broad overview @@ -61,15 +63,43 @@ In this example, we start off by creating a sprite specified by a different conf The first of the two in the inner group is an "icon_state", this means that the icon will be retrieved from the associated dmi file using the "icon_state" key. -The last layer is another reference type. Note that you don't need to give colors to every layer if the layer does not need any colors applied to it. +Note that you don't need to give colors to every layer if the layer does not need any colors applied to it, such as if it's a pre-colored component. +In this example, the last layer is one such example, referencing a separately colored config. "blend_mode" and "color_ids" are special, all layer types have them. The blend mode is what controls how that layer's finished product gets merged together with the rest of the sprite. The color ids control what colors are passed in to the layer. Once it is done generating it will be placed in an icon file with the icon state of "icon_state_name". You can use any name you like here. +Most commonly, we'll only use the "icon_state" type... +Thus, **this will be the most common layout**: +```json +{ + "full_icon_state_name": [ + { + "type": "icon_state", + "icon_state": "component_state_1", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "component_state_2", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "non_colorable_component_state", + "blend_mode": "overlay", + } + ] +} +``` + ## Dmi File There are no special requirements from the dmi file to work with this system. You just need to specify the icon file in code and the icon_state in the json configuration. +Additionally, for the sake of mappers, it's appreciated if there's a pre-made obj icon of the same name as the item's icon_state; this way, the item will appear in mapping software. ## Dm Code @@ -78,7 +108,8 @@ While the amount of dm code required to make a greyscale sprite was minimized as As an example: ```c /datum/greyscale_config/canister - icon_file = 'icons/obj/atmospherics/canisters/default.dmi' + name = "Canister" //Required for debugging, will runtime without one! + icon_file = 'icons/obj/pipes_n_cables/canisters/default.dmi' json_config = 'code/datums/greyscale/json_configs/canister_default.json' ``` And that's all you need to make it usable by other code: @@ -90,7 +121,34 @@ And that's all you need to make it usable by other code: greyscale_colors = "#ee4242" ``` -More configurations can be found in [code/datums/greyscale/greyscale_configs.dm](./greyscale_configs.dm) +More configurations can be found in the greyscale_configs folder [code/datums/greyscale/config_types/greyscale_configs/greyscale_unsorted.dm] (./config_types/greyscale_configs/greyscale_unsorted.dm) + +While creating a greyscale config, be sure to take subtypes into account! Rather than create several unique configs that all link to the same icon file, you can make the variants all a subtype of one base config: + +```c +/datum/greyscale_config/tablet + name = "PDA" + icon_file = 'icons/obj/modular_pda.dmi' + json_config = 'code/datums/greyscale/json_configs/pda.json' + +/datum/greyscale_config/tablet/chaplain + name = "Chaplain PDA" + json_config = 'code/datums/greyscale/json_configs/pda_chaplain.json' +``` + +Building on this, if your obj and worn sprites have the same amount of component states, then instead of making separate .json configs for obj and worn, link to two separate .dmi's while still using the same .json config! For example: + +```c +/datum/greyscale_config/trek + name = "Trek Uniform" + icon_file = 'icons/obj/clothing/under/trek.dmi' + json_config = 'code/datums/greyscale/json_configs/trek.json' + +/datum/greyscale_config/trek/worn + name = "Worn Trek Uniform" + icon_file = 'icons/mob/clothing/under/trek.dmi' + //The worn json is exactly the same, and both icon files use identically-named component states; so, we can just inherit the json! +``` If you want your item to be colorable in a vending machine (or other places if there's ever any support added for that), you should do it like this: diff --git a/code/datums/greyscale/_greyscale_config.dm b/code/datums/greyscale/_greyscale_config.dm index 229d214a56d82..6549e08d03ebd 100644 --- a/code/datums/greyscale/_greyscale_config.dm +++ b/code/datums/greyscale/_greyscale_config.dm @@ -57,8 +57,8 @@ if(!json_config) stack_trace("Greyscale config object [DebugName()] is missing a json configuration, make sure `json_config` has been assigned a value.") string_json_config = "[json_config]" - if(findtext(string_json_config, "greyscale/json_configs/") == 0) - stack_trace("All greyscale json configuration files should be located within '/greyscale/json_configs/'") + if(findtext(string_json_config, "code/datums/greyscale/json_configs/") != 1) + stack_trace("All greyscale json configuration files should be located within 'code/datums/greyscale/json_configs/'") if(!icon_file) stack_trace("Greyscale config object [DebugName()] is missing an icon file, make sure `icon_file` has been assigned a value.") string_icon_file = "[icon_file]" @@ -187,9 +187,9 @@ /// Reads layer configurations to take out some useful overall information /datum/greyscale_config/proc/ReadMetadata() - var/icon/source = icon(icon_file) - height = source.Height() - width = source.Width() + var/list/icon_dimensions = get_icon_dimensions(icon_file) + height = icon_dimensions["width"] + width = icon_dimensions["height"] var/list/datum/greyscale_layer/all_layers = list() for(var/state in icon_states) diff --git a/code/datums/greyscale/config_types/greyscale_configs.dm b/code/datums/greyscale/config_types/greyscale_configs.dm deleted file mode 100644 index 0ae080a917acf..0000000000000 --- a/code/datums/greyscale/config_types/greyscale_configs.dm +++ /dev/null @@ -1,1069 +0,0 @@ -/datum/greyscale_config/canister - name = "Default Canister" - icon_file = 'icons/obj/atmospherics/canisters.dmi' - json_config = 'code/datums/greyscale/json_configs/canister_default.json' - -/datum/greyscale_config/canister/base - name = "Base Canister Style" - json_config = 'code/datums/greyscale/json_configs/canister_base.json' - -/datum/greyscale_config/canister/post_effects - name = "Canister Post-Effects" - json_config = 'code/datums/greyscale/json_configs/canister_post_effects.json' - -/datum/greyscale_config/canister/stripe - name = "Single Striped Canister" - json_config = 'code/datums/greyscale/json_configs/canister_stripe.json' - -/datum/greyscale_config/canister/double_stripe - name = "Double Striped Canister" - json_config = 'code/datums/greyscale/json_configs/canister_double_stripe.json' - -/datum/greyscale_config/canister/hazard - name = "Hazard Striped Canister" - json_config = 'code/datums/greyscale/json_configs/canister_hazard.json' - -/datum/greyscale_config/prototype_canister - name = "Prototype Canister" - icon_file = 'icons/obj/atmospherics/prototype_canister.dmi' - json_config = 'code/datums/greyscale/json_configs/canister_proto.json' - -/datum/greyscale_config/stationary_canister - name = "Stationary Canister" - icon_file = 'icons/obj/atmospherics/stationary_canisters.dmi' - json_config = 'code/datums/greyscale/json_configs/smooth_canister_stationary.json' - -/datum/greyscale_config/carp - name = "Space Carp" - icon_file = 'icons/mob/simple/carp.dmi' - json_config = 'code/datums/greyscale/json_configs/carp.json' - -/datum/greyscale_config/carp_magic - name = "Magicarp" - icon_file = 'icons/mob/simple/carp.dmi' - json_config = 'code/datums/greyscale/json_configs/carp_magic.json' - -/datum/greyscale_config/carp_mega - name = "Megacarp" - icon_file = 'icons/mob/simple/broadMobs.dmi' - json_config = 'code/datums/greyscale/json_configs/carp_mega.json' - -/datum/greyscale_config/carp/disk_mouth - name = "Space Carp, Disk in Mouth" - json_config = 'code/datums/greyscale/json_configs/carp_disk_mouth.json' - -/datum/greyscale_config/garden_gnome - name = "Garden Gnome" - icon_file = 'icons/mob/simple/garden_gnome.dmi' - json_config = 'code/datums/greyscale/json_configs/garden_gnome.json' - -/datum/greyscale_config/wirecutters - name = "Wirecutters" - icon_file = 'icons/obj/tools.dmi' - json_config = 'code/datums/greyscale/json_configs/wirecutters.json' - -/datum/greyscale_config/wirecutters_belt_overlay - name = "Belt Worn Icon" - icon_file = 'icons/obj/clothing/belt_overlays.dmi' - json_config = 'code/datums/greyscale/json_configs/wirecutters.json' - -/datum/greyscale_config/wirecutter_inhand_left - name = "Held Wirecutter, Left" - icon_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' - json_config = 'code/datums/greyscale/json_configs/wirecutter_worn.json' - -/datum/greyscale_config/wirecutter_inhand_right - name = "Held Wirecutter, Right" - icon_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - json_config = 'code/datums/greyscale/json_configs/wirecutter_worn.json' - -/datum/greyscale_config/screwdriver - name = "Screwdriver" - icon_file = 'icons/obj/tools.dmi' - json_config = 'code/datums/greyscale/json_configs/screwdriver.json' - -/datum/greyscale_config/screwdriver_inhand_left - name = "Held Screwdriver, Left" - icon_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' - json_config = 'code/datums/greyscale/json_configs/screwdriver_worn.json' - -/datum/greyscale_config/screwdriver_inhand_right - name = "Held Screwdriver, Right" - icon_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - json_config = 'code/datums/greyscale/json_configs/screwdriver_worn.json' - -/datum/greyscale_config/screwdriver_belt - name = "Belt Worn Screwdriver" - icon_file = 'icons/obj/clothing/belt_overlays.dmi' - json_config = 'code/datums/greyscale/json_configs/screwdriver_worn.json' - -/datum/greyscale_config/gloves_inhand_left - name = "Held Gloves, Left" - icon_file = 'icons/mob/inhands/clothing/gloves_lefthand.dmi' - json_config = 'code/datums/greyscale/json_configs/gloves_inhand.json' - -/datum/greyscale_config/gloves_inhand_right - name = "Held Gloves, Right" - icon_file = 'icons/mob/inhands/clothing/gloves_righthand.dmi' - json_config = 'code/datums/greyscale/json_configs/gloves_inhand.json' - -/datum/greyscale_config/jumpsuit - name = "Jumpsuit" - icon_file = 'icons/obj/clothing/under/color.dmi' - json_config = 'code/datums/greyscale/json_configs/jumpsuit.json' - -/datum/greyscale_config/jumpsuit_worn - name = "Worn Jumpsuit" - icon_file = 'icons/mob/clothing/under/color.dmi' - json_config = 'code/datums/greyscale/json_configs/jumpsuit_worn.json' - -/datum/greyscale_config/jumpsuit_inhand_left - name = "Held Jumpsuit, Left" - icon_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi' - json_config = 'code/datums/greyscale/json_configs/jumpsuit_inhand.json' - -/datum/greyscale_config/jumpsuit_inhand_right - name = "Held Jumpsuit, Right" - icon_file = 'icons/mob/inhands/clothing/suits_righthand.dmi' - json_config = 'code/datums/greyscale/json_configs/jumpsuit_inhand.json' - -/datum/greyscale_config/jumpsuit_prison - name = "Prison Jumpsuit" - icon_file = 'icons/obj/clothing/under/color.dmi' - json_config = 'code/datums/greyscale/json_configs/jumpsuit_prison.json' - -/datum/greyscale_config/jumpsuit_prison_worn - name = "Worn Prison Jumpsuit" - icon_file = 'icons/mob/clothing/under/color.dmi' - json_config = 'code/datums/greyscale/json_configs/jumpsuit_prison_worn.json' - -/datum/greyscale_config/jumpsuit_prison_inhand_left - name = "Held Prison Jumpsuit, Left" - icon_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi' - json_config = 'code/datums/greyscale/json_configs/jumpsuit_prison_inhand.json' - -/datum/greyscale_config/jumpsuit_prison_inhand_right - name = "Held Prison Jumpsuit, Right" - icon_file = 'icons/mob/inhands/clothing/suits_righthand.dmi' - json_config = 'code/datums/greyscale/json_configs/jumpsuit_prison_inhand.json' - -/datum/greyscale_config/tablet - name = "PDA" - icon_file = 'icons/obj/modular_pda.dmi' - json_config = 'code/datums/greyscale/json_configs/pda.json' - -/datum/greyscale_config/tablet/chaplain - name = "Chaplain PDA" - json_config = 'code/datums/greyscale/json_configs/pda_chaplain.json' - -/datum/greyscale_config/tablet/captain - name = "Captain PDA" - json_config = 'code/datums/greyscale/json_configs/pda_captain.json' - -/datum/greyscale_config/tablet/clown - name = "Clown PDA" - json_config = 'code/datums/greyscale/json_configs/pda_clown.json' - -/datum/greyscale_config/tablet/head - name = "Head PDA" - json_config = 'code/datums/greyscale/json_configs/pda_head.json' - -/datum/greyscale_config/tablet/mime - name = "Mime PDA" - json_config = 'code/datums/greyscale/json_configs/pda_mime.json' - -/datum/greyscale_config/tablet/stripe_double - name = "Double Stripe PDA" - json_config = 'code/datums/greyscale/json_configs/pda_stripe_double.json' - -/datum/greyscale_config/tablet/stripe_split - name = "Split Stripe PDA" - json_config = 'code/datums/greyscale/json_configs/pda_stripe_split.json' - -/datum/greyscale_config/tablet/stripe_thick - name = "Thick Stripe PDA" - json_config = 'code/datums/greyscale/json_configs/pda_stripe_thick.json' - -/datum/greyscale_config/tablet/stripe_thick/head - name = "Head Thick Stripe PDA" - json_config = 'code/datums/greyscale/json_configs/pda_stripe_thick_head.json' - -/datum/greyscale_config/sneakers - name = "Sneakers" - icon_file = 'icons/obj/clothing/shoes.dmi' - json_config = 'code/datums/greyscale/json_configs/sneakers.json' - -/datum/greyscale_config/sneakers_worn - name = "Worn Sneakers" - icon_file = 'icons/mob/clothing/feet.dmi' - json_config = 'code/datums/greyscale/json_configs/sneakers_worn.json' - -/datum/greyscale_config/sneakers_inhand_left - name = "Held Sneakers, Left" - icon_file = 'icons/mob/inhands/clothing/shoes_lefthand.dmi' - json_config = 'code/datums/greyscale/json_configs/sneakers_inhand.json' - -/datum/greyscale_config/sneakers_inhand_right - name = "Held Sneakers, Right" - icon_file = 'icons/mob/inhands/clothing/shoes_righthand.dmi' - json_config = 'code/datums/greyscale/json_configs/sneakers_inhand.json' - -/datum/greyscale_config/sneakers_orange - name = "Orange Sneakers" - icon_file = 'icons/obj/clothing/shoes.dmi' - json_config = 'code/datums/greyscale/json_configs/sneakers_orange.json' - -/datum/greyscale_config/sneakers_orange_worn - name = "Worn Orange Sneakers" - icon_file = 'icons/mob/clothing/feet.dmi' - json_config = 'code/datums/greyscale/json_configs/sneakers_orange_worn.json' - -/datum/greyscale_config/sneakers_orange_inhand_left - name = "Held Orange Sneakers, Left" - icon_file = 'icons/mob/inhands/clothing/shoes_lefthand.dmi' - json_config = 'code/datums/greyscale/json_configs/sneakers_orange_inhand.json' - -/datum/greyscale_config/sneakers_orange_inhand_right - name = "Held Orange Sneakers, Right" - icon_file = 'icons/mob/inhands/clothing/shoes_righthand.dmi' - json_config = 'code/datums/greyscale/json_configs/sneakers_orange_inhand.json' - -/datum/greyscale_config/sneakers_wheelys - name = "Wheeled Sneakers" - icon_file = 'icons/obj/clothing/shoes.dmi' - json_config = 'code/datums/greyscale/json_configs/sneakers_wheelys.json' - -/datum/greyscale_config/sneakers_marisa - name = "Marisa Sneakers" - icon_file = 'icons/obj/clothing/shoes.dmi' - json_config = 'code/datums/greyscale/json_configs/sneakers_marisa.json' - -/datum/greyscale_config/sneakers_marisa/worn - name = "Worn Marisa Sneakers" - icon_file = 'icons/mob/clothing/feet.dmi' - -/datum/greyscale_config/circuit - name = "Circuit Board" - icon_file = 'icons/obj/module.dmi' - json_config = 'code/datums/greyscale/json_configs/circuit.json' - -/datum/greyscale_config/sombrero - name = "Sombrero" - icon_file = 'icons/obj/clothing/head/sombrero.dmi' - json_config = 'code/datums/greyscale/json_configs/sombrero.json' - -/datum/greyscale_config/sombrero/base - name = "Base Sombrero Style" - json_config = 'code/datums/greyscale/json_configs/sombrero_base.json' - -/datum/greyscale_config/sombrero/lefthand - name = "Held Sombrero, Left" - json_config = 'code/datums/greyscale/json_configs/sombrero_lefthand.json' - -/datum/greyscale_config/sombrero/base_lefthand - name = "Base Held Sombrero Style, Left" - json_config = 'code/datums/greyscale/json_configs/sombrero_base_lefthand.json' - -/datum/greyscale_config/sombrero/righthand - name = "Held Sombrero, Right" - json_config = 'code/datums/greyscale/json_configs/sombrero_righthand.json' - -/datum/greyscale_config/sombrero/base_righthand - name = "Base Held Sombrero Style, Right" - json_config = 'code/datums/greyscale/json_configs/sombrero_base_righthand.json' - -/datum/greyscale_config/sombrero/worn - name = "Worn Sombrero" - json_config = 'code/datums/greyscale/json_configs/sombrero_worn.json' - -/datum/greyscale_config/sombrero/base_worn - name = "Base Worn Sombrero Style" - json_config = 'code/datums/greyscale/json_configs/sombrero_base_worn.json' - -/datum/greyscale_config/winter_coats - name = "Winter Coat" - icon_file = 'icons/obj/clothing/suits/wintercoat.dmi' - json_config = 'code/datums/greyscale/json_configs/wintercoats.json' - -/datum/greyscale_config/winter_coats/worn - name = "Winter Coat Worn" - icon_file = 'icons/mob/clothing/suits/wintercoat.dmi' - json_config = 'code/datums/greyscale/json_configs/wintercoats_worn.json' - -/datum/greyscale_config/winter_hoods - name = "Winter Coat Hood" - icon_file = 'icons/obj/clothing/head/winterhood.dmi' - json_config = 'code/datums/greyscale/json_configs/wintercoats_hood.json' - -/datum/greyscale_config/winter_hoods/worn - name = "Winter Coat Hood Worn" - icon_file = 'icons/mob/clothing/head/winterhood.dmi' - json_config = 'code/datums/greyscale/json_configs/wintercoats_hood_worn.json' - -/datum/greyscale_config/plush_carp - name = "Plushie Carp" - icon_file = 'icons/obj/toys/plushes.dmi' - json_config = 'code/datums/greyscale/json_configs/plushie_carp.json' - -/datum/greyscale_config/plush_lizard - name = "Plushie Lizard" - icon_file = 'icons/obj/toys/plushes.dmi' - json_config = 'code/datums/greyscale/json_configs/plushie_lizard.json' - -/datum/greyscale_config/plush_slime - name = "Plushie Slime" - icon_file = 'icons/obj/toys/plushes.dmi' - json_config = 'code/datums/greyscale/json_configs/plushie_slime.json' - -/datum/greyscale_config/plush_snake - name = "Plushie Snake" - icon_file = 'icons/obj/toys/plushes.dmi' - json_config = 'code/datums/greyscale/json_configs/plushie_snake.json' - -/datum/greyscale_config/plush_spacelizard - name = "Plushie Space Lizard" - icon_file = 'icons/obj/toys/plushes.dmi' - json_config = 'code/datums/greyscale/json_configs/plushie_spacelizard.json' - -/datum/greyscale_config/flower_simple - name = "Flower" - icon_file = 'icons/obj/hydroponics/harvest.dmi' - json_config = 'code/datums/greyscale/json_configs/simple_flower.json' - -/datum/greyscale_config/flower_simple_worn - name = "Flower Worn" - icon_file = 'icons/mob/clothing/head/hydroponics.dmi' - json_config = 'code/datums/greyscale/json_configs/simple_flower_worn.json' - -/datum/greyscale_config/cleric_mace - name = "Base Cleric Mace" - icon_file = 'icons/obj/weapons/cleric_mace.dmi' - json_config = 'code/datums/greyscale/json_configs/items/cleric_mace.json' - -/datum/greyscale_config/cleric_mace_lefthand - name = "Base Held Cleric Mace, Left" - icon_file = 'icons/obj/weapons/cleric_mace.dmi' - json_config = 'code/datums/greyscale/json_configs/items/cleric_mace_lefthand.json' - -/datum/greyscale_config/cleric_mace_righthand - name = "Base Held Cleric Mace, Right" - icon_file = 'icons/obj/weapons/cleric_mace.dmi' - json_config = 'code/datums/greyscale/json_configs/items/cleric_mace_righthand.json' - -/datum/greyscale_config/cleric_mace_worn - name = "Base Worn Cleric Mace" - icon_file = 'icons/obj/weapons/cleric_mace.dmi' - json_config = 'code/datums/greyscale/json_configs/items/cleric_mace_worn.json' - -/datum/greyscale_config/cleric_mace/gold - name = "Gold Cleric Mace" - material_skin = /datum/material/gold - json_config = 'code/datums/greyscale/json_configs/items/cleric_mace_gold.json' - -/datum/greyscale_config/cleric_mace_lefthand/gold - name = "Gold Held Cleric Mace, Left" - material_skin = /datum/material/gold - json_config = 'code/datums/greyscale/json_configs/items/cleric_mace_lefthand_gold.json' - -/datum/greyscale_config/cleric_mace_righthand/gold - name = "Gold Held Cleric Mace, Right" - material_skin = /datum/material/gold - json_config = 'code/datums/greyscale/json_configs/items/cleric_mace_righthand_gold.json' - -/datum/greyscale_config/cleric_mace_worn/gold - name = "Gold Worn Cleric Mace" - icon_file = 'icons/obj/weapons/cleric_mace.dmi' - json_config = 'code/datums/greyscale/json_configs/items/cleric_mace_worn_gold.json' - -/datum/greyscale_config/ceremonial_blade - name = "Base Ceremonial Blade" - icon_file = 'icons/obj/weapons/ritual_weapon.dmi' - json_config = 'code/datums/greyscale/json_configs/items/ceremonial_blade.json' - -/datum/greyscale_config/ceremonial_blade_lefthand - name = "Base Held Ceremonial Blade, Left" - icon_file = 'icons/obj/weapons/ritual_weapon.dmi' - json_config = 'code/datums/greyscale/json_configs/items/ceremonial_blade_lefthand.json' - -/datum/greyscale_config/ceremonial_blade_righthand - name = "Base Held Ceremonial Blade, Right" - icon_file = 'icons/obj/weapons/ritual_weapon.dmi' - json_config = 'code/datums/greyscale/json_configs/items/ceremonial_blade_righthand.json' - -/datum/greyscale_config/beret - name = "Beret" - icon_file = 'icons/obj/clothing/head/beret.dmi' - json_config = 'code/datums/greyscale/json_configs/beret.json' - -/datum/greyscale_config/beret/worn - name = "Beret Worn" - json_config = 'code/datums/greyscale/json_configs/beret_worn.json' - -/datum/greyscale_config/beret_badge - name = "Beret With Badge" - icon_file = 'icons/obj/clothing/head/beret.dmi' - json_config = 'code/datums/greyscale/json_configs/beret_badge.json' - -/datum/greyscale_config/beret_badge/worn - name = "Beret With Badge Worn" - json_config = 'code/datums/greyscale/json_configs/beret_badge_worn.json' - -/datum/greyscale_config/suspenders - name = "Suspenders" - icon_file = 'icons/obj/clothing/belts.dmi' - json_config = 'code/datums/greyscale/json_configs/suspenders.json' - -/datum/greyscale_config/suspenders/worn - name = "Worn Suspenders" - icon_file = 'icons/mob/clothing/suits/utility.dmi' - json_config = 'code/datums/greyscale/json_configs/suspenders_worn.json' - -/datum/greyscale_config/giftdeliverybox - name = "Gift Box" - icon_file = 'icons/obj/storage/wrapping.dmi' - json_config = 'code/datums/greyscale/json_configs/giftdeliverybox.json' - -/datum/greyscale_config/giftdeliverycloset - name = "Gift Closet" - icon_file = 'icons/obj/storage/wrapping.dmi' - json_config = 'code/datums/greyscale/json_configs/giftdeliverycloset.json' - -/datum/greyscale_config/giftdeliverycrate - name = "Gift Crate" - icon_file = 'icons/obj/storage/wrapping.dmi' - json_config = 'code/datums/greyscale/json_configs/giftdeliverycrate.json' - -/datum/greyscale_config/giftdeliverypackage5 - name = "Gift Package 5 (Biggest)" - icon_file = 'icons/obj/storage/wrapping.dmi' - json_config = 'code/datums/greyscale/json_configs/giftdeliverypackage5.json' - -/datum/greyscale_config/giftdeliverypackage4 - name = "Gift Package 4" - icon_file = 'icons/obj/storage/wrapping.dmi' - json_config = 'code/datums/greyscale/json_configs/giftdeliverypackage4.json' - -/datum/greyscale_config/giftdeliverypackage3 - name = "Gift Package 3" - icon_file = 'icons/obj/storage/wrapping.dmi' - json_config = 'code/datums/greyscale/json_configs/giftdeliverypackage3.json' - -/datum/greyscale_config/giftdeliverypackage2 - name = "Gift Package 2" - icon_file = 'icons/obj/storage/wrapping.dmi' - json_config = 'code/datums/greyscale/json_configs/giftdeliverypackage2.json' - -/datum/greyscale_config/giftdeliverypackage1 - name = "Gift Package 1 (Smallest)" - icon_file = 'icons/obj/storage/wrapping.dmi' - json_config = 'code/datums/greyscale/json_configs/giftdeliverypackage1.json' - -/datum/greyscale_config/wrap_paper - name = "Wrapping Paper" - icon_file = 'icons/obj/stack_objects.dmi' - json_config = 'code/datums/greyscale/json_configs/wrap_paper.json' - -/datum/greyscale_config/meter - name = "Meter" - icon_file = 'icons/obj/atmospherics/pipes/meter.dmi' - json_config = 'code/datums/greyscale/json_configs/meter.json' - -/datum/greyscale_config/thermomachine - name = "Thermomachine" - icon_file = 'icons/obj/atmospherics/components/thermomachine.dmi' - json_config = 'code/datums/greyscale/json_configs/thermomachine.json' - -/datum/greyscale_config/janicart_upgrade - name = "Janicart Upgrade" - icon_file = 'icons/obj/janicart_upgrade.dmi' - json_config = 'code/datums/greyscale/json_configs/janicart_upgrade.json' - -/datum/greyscale_config/janicart_upgrade/installed - json_config = 'code/datums/greyscale/json_configs/janicart_upgrade_installed.json' - -/datum/greyscale_config/bench_middle - name = "Bench Middle" - icon_file = 'icons/obj/sofa.dmi' - json_config = 'code/datums/greyscale/json_configs/bench_middle.json' - -/datum/greyscale_config/bench_left - name = "Bench Left" - icon_file = 'icons/obj/sofa.dmi' - json_config = 'code/datums/greyscale/json_configs/bench_left.json' - -/datum/greyscale_config/bench_right - name = "Bench Right" - icon_file = 'icons/obj/sofa.dmi' - json_config = 'code/datums/greyscale/json_configs/bench_right.json' - -/datum/greyscale_config/bench_solo - name = "Bench Solo" - icon_file = 'icons/obj/sofa.dmi' - json_config = 'code/datums/greyscale/json_configs/bench_solo.json' - -/datum/greyscale_config/bench_corner - name = "Bench Corner" - icon_file = 'icons/obj/sofa.dmi' - json_config = 'code/datums/greyscale/json_configs/bench_corner.json' - -/datum/greyscale_config/ctf_standard - name = "CTF Standard Vest" - icon_file = 'icons/obj/clothing/suits/ctf.dmi' - json_config = 'code/datums/greyscale/json_configs/ctf_standard.json' - -/datum/greyscale_config/ctf_standard_worn - name = "Worn CTF Standard Vest" - icon_file = 'icons/mob/clothing/suits/ctf.dmi' - json_config = 'code/datums/greyscale/json_configs/ctf_standard_worn.json' - -/datum/greyscale_config/ctf_light - name = "CTF Light Vest" - icon_file = 'icons/obj/clothing/suits/ctf.dmi' - json_config = 'code/datums/greyscale/json_configs/ctf_light.json' - -/datum/greyscale_config/ctf_light_worn - name = "Worn CTF Light Vest" - icon_file = 'icons/mob/clothing/suits/ctf.dmi' - json_config = 'code/datums/greyscale/json_configs/ctf_light_worn.json' - -/datum/greyscale_config/mothcoat - name = "Moth Coat" - icon_file = 'icons/obj/clothing/suits/moth.dmi' - json_config = 'code/datums/greyscale/json_configs/moth_coat.json' - -/datum/greyscale_config/mothcoat_worn - name = "Worn Moth Coat" - icon_file = 'icons/mob/clothing/suits/moth.dmi' - json_config = 'code/datums/greyscale/json_configs/moth_coat_worn.json' - -/datum/greyscale_config/mothcoat_winter - name = "Moth Winter Coat" - icon_file = 'icons/obj/clothing/suits/moth.dmi' - json_config = 'code/datums/greyscale/json_configs/moth_coat_winter.json' - -/datum/greyscale_config/mothcoat_winter_worn - name = "Worn Moth Winter Coat" - icon_file = 'icons/mob/clothing/suits/moth.dmi' - json_config = 'code/datums/greyscale/json_configs/moth_coat_winter_worn.json' - -/datum/greyscale_config/eth_raincoat - name = "Ethereal Raincoat" - icon_file = 'icons/obj/clothing/suits/ethereal.dmi' - json_config = 'code/datums/greyscale/json_configs/eth_raincoat.json' - -/datum/greyscale_config/eth_raincoat_worn - name = "Worn Ethereal Raincoat" - icon_file = 'icons/mob/clothing/suits/ethereal.dmi' - json_config = 'code/datums/greyscale/json_configs/eth_raincoat_worn.json' - -/datum/greyscale_config/eth_tunic - name = "Ethereal Tunic" - icon_file = 'icons/obj/clothing/under/ethereal.dmi' - json_config = 'code/datums/greyscale/json_configs/eth_tunic.json' - -/datum/greyscale_config/eth_tunic_worn - name = "Worn Ethereal Tunic" - icon_file = 'icons/mob/clothing/under/ethereal.dmi' - json_config = 'code/datums/greyscale/json_configs/eth_tunic_worn.json' - -/datum/greyscale_config/bandana - name = "Bandana" - icon_file = 'icons/obj/clothing/masks.dmi' - json_config = 'code/datums/greyscale/json_configs/bandana.json' - -/datum/greyscale_config/bandana_worn - name = "Worn Bandana" - icon_file = 'icons/mob/clothing/mask.dmi' - json_config = 'code/datums/greyscale/json_configs/bandana_worn.json' - -/datum/greyscale_config/bandana_inhands_left - name = "Held Bandana, Left" - icon_file = 'icons/mob/inhands/clothing/masks_lefthand.dmi' - json_config = 'code/datums/greyscale/json_configs/bandana_inhands.json' - -/datum/greyscale_config/bandana_inhands_right - name = "Held Bandana, Left" - icon_file = 'icons/mob/inhands/clothing/masks_righthand.dmi' - json_config = 'code/datums/greyscale/json_configs/bandana_inhands.json' - -/datum/greyscale_config/bandstriped - name = "Striped Bandana" - icon_file = 'icons/obj/clothing/masks.dmi' - json_config = 'code/datums/greyscale/json_configs/bandstriped.json' - -/datum/greyscale_config/bandstriped_worn - name = "Worn Striped Bandana" - icon_file = 'icons/mob/clothing/mask.dmi' - json_config = 'code/datums/greyscale/json_configs/bandstriped_worn.json' - -/datum/greyscale_config/bandana_striped_inhands_left - name = "Held Striped Bandana, Left" - icon_file = 'icons/mob/inhands/clothing/masks_lefthand.dmi' - json_config = 'code/datums/greyscale/json_configs/bandanastriped_inhands.json' - -/datum/greyscale_config/bandana_striped_inhands_right - name = "Held Striped Bandana, Left" - icon_file = 'icons/mob/inhands/clothing/masks_righthand.dmi' - json_config = 'code/datums/greyscale/json_configs/bandanastriped_inhands.json' - -/datum/greyscale_config/bandskull - name = "Skull Bandana" - icon_file = 'icons/obj/clothing/masks.dmi' - json_config = 'code/datums/greyscale/json_configs/bandskull.json' - -/datum/greyscale_config/bandana_skull_inhands_left - name = "Held Skull Bandana, Left" - icon_file = 'icons/mob/inhands/clothing/masks_lefthand.dmi' - json_config = 'code/datums/greyscale/json_configs/bandanaskull_inhands.json' - -/datum/greyscale_config/bandana_skull_inhands_right - name = "Held Skull Bandana, Left" - icon_file = 'icons/mob/inhands/clothing/masks_righthand.dmi' - json_config = 'code/datums/greyscale/json_configs/bandanaskull_inhands.json' - -/datum/greyscale_config/bandskull_worn - name = "Worn Skull Bandana" - icon_file = 'icons/mob/clothing/mask.dmi' - json_config = 'code/datums/greyscale/json_configs/bandskull_worn.json' - -/datum/greyscale_config/material_airlock - name = "Material Airlock" - icon_file = 'icons/obj/doors/airlocks/material/material.dmi' - json_config = 'code/datums/greyscale/json_configs/material_airlock.json' - -/datum/greyscale_config/vape - name = "Vape" - icon_file = 'icons/obj/clothing/masks.dmi' - json_config = 'code/datums/greyscale/json_configs/vape.json' - -/datum/greyscale_config/vape/worn - name = "Worn Vape" - icon_file = 'icons/mob/clothing/mask.dmi' - json_config = 'code/datums/greyscale/json_configs/vape_worn.json' - -/datum/greyscale_config/vape/open_low - name = "Open Vape Low" - json_config = 'code/datums/greyscale/json_configs/vape_open_low.json' - -/datum/greyscale_config/vape/open_med - name = "Open Vape Medium" - json_config = 'code/datums/greyscale/json_configs/vape_open_med.json' - -/datum/greyscale_config/vape/open_high - name = "Open Vape High" - json_config = 'code/datums/greyscale/json_configs/vape_open_high.json' - -/datum/greyscale_config/ties - name = "Ties" - icon_file = 'icons/obj/clothing/neck.dmi' - json_config = 'code/datums/greyscale/json_configs/ties.json' - -/datum/greyscale_config/ties_worn - name = "Worn Ties" - icon_file = 'icons/mob/clothing/neck.dmi' - json_config = 'code/datums/greyscale/json_configs/ties_worn.json' - -/datum/greyscale_config/heck_suit - name = "H.E.C.K. Suit" - icon_file = 'icons/obj/clothing/suits/armor.dmi' - json_config = 'code/datums/greyscale/json_configs/heck_suit.json' - -/datum/greyscale_config/heck_suit/worn - name = "H.E.C.K. Suit Worn" - icon_file = 'icons/mob/clothing/suits/armor.dmi' - json_config = 'code/datums/greyscale/json_configs/heck_suit_worn.json' - -/datum/greyscale_config/heck_helmet - name = "H.E.C.K. Helmet" - icon_file = 'icons/obj/clothing/head/helmet.dmi' - json_config = 'code/datums/greyscale/json_configs/heck_helmet.json' - -/datum/greyscale_config/heck_helmet/worn - name = "H.E.C.K. Helmet Worn" - icon_file = 'icons/mob/clothing/head/helmet.dmi' - json_config = 'code/datums/greyscale/json_configs/heck_helmet_worn.json' - -/datum/greyscale_config/plaidskirt - name = "Plaid Skirt" - icon_file = 'icons/obj/clothing/under/dress.dmi' - json_config = 'code/datums/greyscale/json_configs/plaidskirt.json' - -/datum/greyscale_config/plaidskirt_worn - name = "Worn Plaid Skirt" - icon_file = 'icons/mob/clothing/under/dress.dmi' - json_config = 'code/datums/greyscale/json_configs/plaidskirt_worn.json' - -/datum/greyscale_config/turtleskirt - name = "Skirtleneck" - icon_file = 'icons/obj/clothing/under/dress.dmi' - json_config = 'code/datums/greyscale/json_configs/turtleskirt.json' - -/datum/greyscale_config/turtleskirt_worn - name = "Worn Skirtleneck" - icon_file = 'icons/mob/clothing/under/dress.dmi' - json_config = 'code/datums/greyscale/json_configs/turtleskirt_worn.json' - -/datum/greyscale_config/tango - name = "Tango Dress" - icon_file = 'icons/obj/clothing/under/dress.dmi' - json_config = 'code/datums/greyscale/json_configs/tango.json' - -/datum/greyscale_config/tango_worn - name = "Worn Tango Dress" - icon_file = 'icons/mob/clothing/under/dress.dmi' - json_config = 'code/datums/greyscale/json_configs/tango_worn.json' - -/datum/greyscale_config/sundress - name = "Sundress" - icon_file = 'icons/obj/clothing/under/dress.dmi' - json_config = 'code/datums/greyscale/json_configs/sundress.json' - -/datum/greyscale_config/sundress_worn - name = "Worn Sundress" - icon_file = 'icons/mob/clothing/under/dress.dmi' - json_config = 'code/datums/greyscale/json_configs/sundress_worn.json' - -/datum/greyscale_config/beanie - name = "Beanie" - icon_file = 'icons/obj/clothing/head/beanie.dmi' - json_config = 'code/datums/greyscale/json_configs/beanie.json' - -/datum/greyscale_config/beanie_worn - name = "Worn Beanie" - icon_file = 'icons/mob/clothing/head/beanie.dmi' - json_config = 'code/datums/greyscale/json_configs/beanie_worn.json' - -/datum/greyscale_config/scarf - name = "Scarf" - icon_file = 'icons/obj/clothing/neck.dmi' - json_config = 'code/datums/greyscale/json_configs/scarf.json' - -/datum/greyscale_config/scarf_worn - name = "Worn Scarf" - icon_file = 'icons/mob/clothing/neck.dmi' - json_config = 'code/datums/greyscale/json_configs/scarf_worn.json' - -/datum/greyscale_config/large_scarf - name = "Large Scarf" - icon_file = 'icons/obj/clothing/neck.dmi' - json_config = 'code/datums/greyscale/json_configs/large_scarf.json' - -/datum/greyscale_config/large_scarf_worn - name = "Worn Large Scarf" - icon_file = 'icons/mob/clothing/neck.dmi' - json_config = 'code/datums/greyscale/json_configs/large_scarf_worn.json' - -/datum/greyscale_config/slacks - name = "Slacks" - icon_file = 'icons/obj/clothing/under/shorts_pants_shirts.dmi' - json_config = 'code/datums/greyscale/json_configs/slacks.json' - -/datum/greyscale_config/slacks_worn - name = "Worn Slacks" - icon_file = 'icons/mob/clothing/under/shorts_pants_shirts.dmi' - json_config = 'code/datums/greyscale/json_configs/slacks_worn.json' - -/datum/greyscale_config/shorts - name = "Shorts" - icon_file = 'icons/obj/clothing/under/shorts_pants_shirts.dmi' - json_config = 'code/datums/greyscale/json_configs/shorts.json' - -/datum/greyscale_config/shorts_worn - name = "Worn Shorts" - icon_file = 'icons/mob/clothing/under/shorts_pants_shirts.dmi' - json_config = 'code/datums/greyscale/json_configs/shorts_worn.json' - -/datum/greyscale_config/jeans - name = "Jeans" - icon_file = 'icons/obj/clothing/under/shorts_pants_shirts.dmi' - json_config = 'code/datums/greyscale/json_configs/jeans.json' - -/datum/greyscale_config/jeans_worn - name = "Worn Jeans" - icon_file = 'icons/mob/clothing/under/shorts_pants_shirts.dmi' - json_config = 'code/datums/greyscale/json_configs/jeans_worn.json' - -/datum/greyscale_config/jeanshorts - name = "Jean Shorts" - icon_file = 'icons/obj/clothing/under/shorts_pants_shirts.dmi' - json_config = 'code/datums/greyscale/json_configs/jeanshorts.json' - -/datum/greyscale_config/jeanshorts_worn - name = "Worn Jean Shorts" - icon_file = 'icons/mob/clothing/under/shorts_pants_shirts.dmi' - json_config = 'code/datums/greyscale/json_configs/jeanshorts_worn.json' - -/datum/greyscale_config/tape - name = "Tape" - icon_file = 'icons/obj/tapes.dmi' - json_config = 'code/datums/greyscale/json_configs/tape.json' - -/datum/greyscale_config/tape/spikes - name = "Spiked Tape" - icon_file = 'icons/obj/tapes.dmi' - json_config = 'code/datums/greyscale/json_configs/tape_spikes.json' - -/datum/greyscale_config/tape_piece - name = "Tape Piece" - icon_file = 'icons/obj/tapes.dmi' - json_config = 'code/datums/greyscale/json_configs/tape_piece.json' - -/datum/greyscale_config/tape_piece/spikes - name = "Spiked Tape Piece" - icon_file = 'icons/obj/tapes.dmi' - json_config = 'code/datums/greyscale/json_configs/tape_piece_spikes.json' - -/datum/greyscale_config/tape_piece/worn - name = "Worn Tape Piece" - icon_file = 'icons/obj/tapes.dmi' - json_config = 'code/datums/greyscale/json_configs/tape_piece_worn.json' - -/datum/greyscale_config/tape_piece/worn/spikes - name = "Worn Tape Piece" - icon_file = 'icons/obj/tapes.dmi' - json_config = 'code/datums/greyscale/json_configs/tape_piece_spikes_worn.json' - -/datum/greyscale_config/buckets - name = "Buckets" - icon_file = 'icons/obj/janitor.dmi' - json_config = 'code/datums/greyscale/json_configs/buckets.json' - -/datum/greyscale_config/buckets_worn - name = "Buckets Worn" - icon_file = 'icons/mob/clothing/head/utility.dmi' - json_config = 'code/datums/greyscale/json_configs/buckets.json' - -/datum/greyscale_config/buckets_inhands_left - name = "Buckets Inhands Left" - icon_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi' - json_config = 'code/datums/greyscale/json_configs/buckets.json' - -/datum/greyscale_config/buckets_inhands_right - name = "Buckets Inhands Right" - icon_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi' - json_config = 'code/datums/greyscale/json_configs/buckets.json' - -/datum/greyscale_config/buckets_cleanbot - name = "Buckets - Cleanbot" - icon_file = 'icons/mob/silicon/aibots.dmi' - json_config = 'code/datums/greyscale/json_configs/buckets_bot.json' - -/datum/greyscale_config/buttondown_slacks - name = "Buttondown with Slacks" - icon_file = 'icons/obj/clothing/under/shorts_pants_shirts.dmi' - json_config = 'code/datums/greyscale/json_configs/buttondown_slacks.json' - -/datum/greyscale_config/buttondown_slacks_worn - name = "Worn Buttondown with Slacks" - icon_file = 'icons/mob/clothing/under/shorts_pants_shirts.dmi' - json_config = 'code/datums/greyscale/json_configs/buttondown_slacks_worn.json' - -/datum/greyscale_config/buttondown_shorts - name = "Buttondown with Shorts" - icon_file = 'icons/obj/clothing/under/shorts_pants_shirts.dmi' - json_config = 'code/datums/greyscale/json_configs/buttondown_shorts.json' - -/datum/greyscale_config/buttondown_shorts_worn - name = "Worn Buttondown with Shorts" - icon_file = 'icons/mob/clothing/under/shorts_pants_shirts.dmi' - json_config = 'code/datums/greyscale/json_configs/buttondown_shorts_worn.json' - -/datum/greyscale_config/sweater - name = "Sweater" - icon_file = 'icons/obj/clothing/suits/jacket.dmi' - json_config = 'code/datums/greyscale/json_configs/sweater.json' - -/datum/greyscale_config/sweater_worn - name = "Worn Sweater" - icon_file = 'icons/mob/clothing/suits/jacket.dmi' - json_config = 'code/datums/greyscale/json_configs/sweater_worn.json' - -/datum/greyscale_config/jacket_oversized - name = "Oversized Jacket" - icon_file = 'icons/obj/clothing/suits/jacket.dmi' - json_config = 'code/datums/greyscale/json_configs/jacket_oversized.json' - -/datum/greyscale_config/jacket_oversized_worn - name = "Worn Oversized Jacket" - icon_file = 'icons/mob/clothing/suits/jacket.dmi' - json_config = 'code/datums/greyscale/json_configs/jacket_oversized_worn.json' - -/datum/greyscale_config/infinity_scarf - name = "Infinity Scarf" - icon_file = 'icons/obj/clothing/neck.dmi' - json_config = 'code/datums/greyscale/json_configs/infinity_scarf.json' - -/datum/greyscale_config/infinity_scarf_worn - name = "Worn Infinity Scarf" - icon_file = 'icons/mob/clothing/neck.dmi' - json_config = 'code/datums/greyscale/json_configs/infinity_scarf_worn.json' - -/datum/greyscale_config/football_helmet - name = "Football Helmet" - icon_file = 'icons/obj/clothing/head/costume.dmi' - json_config = 'code/datums/greyscale/json_configs/football_helmet.json' - -/datum/greyscale_config/football_helmet_worn - name = "Worn Football Helmet" - icon_file = 'icons/mob/clothing/head/costume.dmi' - json_config = 'code/datums/greyscale/json_configs/football_helmet_worn.json' - -/datum/greyscale_config/football_suit - name = "Football Suit" - icon_file = 'icons/obj/clothing/under/costume.dmi' - json_config = 'code/datums/greyscale/json_configs/football_suit.json' - -/datum/greyscale_config/football_suit_worn - name = "Worn Football Suit" - icon_file = 'icons/mob/clothing/under/costume.dmi' - json_config = 'code/datums/greyscale/json_configs/football_suit_worn.json' - -/datum/greyscale_config/football_armor - name = "Football Armor" - icon_file = 'icons/obj/clothing/suits/costume.dmi' - json_config = 'code/datums/greyscale/json_configs/football_armor.json' - -/datum/greyscale_config/football_armor_worn - name = "Worn Football Armor" - icon_file = 'icons/mob/clothing/suits/costume.dmi' - json_config = 'code/datums/greyscale/json_configs/football_armor_worn.json' - -/datum/greyscale_config/hawaiian_shirt - name = "Hawaiian Overshirt" - icon_file = 'icons/obj/clothing/suits/costume.dmi' - json_config = 'code/datums/greyscale/json_configs/hawaiian_shirt.json' - -/datum/greyscale_config/hawaiian_shirt/worn - name = "Hawaiian Overshirt" - icon_file = 'icons/mob/clothing/suits/costume.dmi' - -/datum/greyscale_config/waistcoat - name = "Waistcoat" - icon_file = 'icons/obj/clothing/accessories.dmi' - json_config = 'code/datums/greyscale/json_configs/waistcoat.json' - -/datum/greyscale_config/waistcoat_worn - name = "Worn Waistcoat" - icon_file = 'icons/mob/clothing/accessories.dmi' - json_config = 'code/datums/greyscale/json_configs/waistcoat_worn.json' - -/datum/greyscale_config/witch_hat - name = "Fancy Hat" - icon_file = 'icons/obj/clothing/head/wizard.dmi' - json_config = 'code/datums/greyscale/json_configs/witch_hat.json' - -/datum/greyscale_config/witch_hat_worn - name = "Worn Fancy Hat" - icon_file = 'icons/mob/clothing/head/wizard.dmi' - json_config = 'code/datums/greyscale/json_configs/witch_hat_worn.json' - -/datum/greyscale_config/fancy_hat - name = "Fancy Hat" - icon_file = 'icons/obj/clothing/head/costume.dmi' - json_config = 'code/datums/greyscale/json_configs/fancy_hat.json' - -/datum/greyscale_config/fancy_hat_worn - name = "Worn Fancy Hat" - icon_file = 'icons/mob/clothing/head/costume.dmi' - json_config = 'code/datums/greyscale/json_configs/fancy_hat_worn.json' - -/datum/greyscale_config/fancy_coat - name = "Fancy Coat" - icon_file = 'icons/obj/clothing/suits/jacket.dmi' - json_config = 'code/datums/greyscale/json_configs/fancy_coat.json' - -/datum/greyscale_config/fancy_coat_worn - name = "Worn Fancy Coat" - icon_file = 'icons/mob/clothing/suits/jacket.dmi' - json_config = 'code/datums/greyscale/json_configs/fancy_coat_worn.json' - -/datum/greyscale_config/trek - name = "Trek Uniform" - icon_file = 'icons/obj/clothing/under/trek.dmi' - json_config = 'code/datums/greyscale/json_configs/trek.json' - //All Trek uniforms are different icon_states in the same json so we dont have seperate jsons for all the different types - -/datum/greyscale_config/trek/worn - name = "Worn Trek Uniform" - icon_file = 'icons/mob/clothing/under/trek.dmi' - //The worn json is exactly the same, so it's easier to just inherit it (EXPERIMENTAL - SUCCESS. TODO: REMOVE ALL (duplicate-of-obj)_WORN CONFIGS) - -/datum/greyscale_config/encryptionkey_basic - name = "Basic Encryptionkey" - icon_file = 'icons/obj/radio.dmi' - json_config = 'code/datums/greyscale/json_configs/encryptionkey_basic.json' - -/datum/greyscale_config/encryptionkey_cube - name = "Block Encryptionkey" - icon_file = 'icons/obj/radio.dmi' - json_config = 'code/datums/greyscale/json_configs/encryptionkey_cube.json' - -/datum/greyscale_config/encryptionkey_research - name = "Research Encryptionkey" - icon_file = 'icons/obj/radio.dmi' - json_config = 'code/datums/greyscale/json_configs/encryptionkey_research.json' - -/datum/greyscale_config/encryptionkey_syndicate - name = "Syndicate Encryptionkey" - icon_file = 'icons/obj/radio.dmi' - json_config = 'code/datums/greyscale/json_configs/encryptionkey_syndicate.json' - -/datum/greyscale_config/encryptionkey_medical - name = "Medical Encryptionkey" - icon_file = 'icons/obj/radio.dmi' - json_config = 'code/datums/greyscale/json_configs/encryptionkey_medical.json' - -/datum/greyscale_config/encryptionkey_service - name = "Service Encryptionkey" - icon_file = 'icons/obj/radio.dmi' - json_config = 'code/datums/greyscale/json_configs/encryptionkey_service.json' - -/datum/greyscale_config/encryptionkey_engineering - name = "Engineering Encryptionkey" - icon_file = 'icons/obj/radio.dmi' - json_config = 'code/datums/greyscale/json_configs/encryptionkey_engineering.json' - -/datum/greyscale_config/encryptionkey_centcom - name = "Centcom Encryptionkey" - icon_file = 'icons/obj/radio.dmi' - json_config = 'code/datums/greyscale/json_configs/encryptionkey_centcom.json' - -/datum/greyscale_config/encryptionkey_cargo - name = "Cargo Encryptionkey" - icon_file = 'icons/obj/radio.dmi' - json_config = 'code/datums/greyscale/json_configs/encryptionkey_cargo.json' - -/datum/greyscale_config/encryptionkey_security - name = "Security Encryptionkey" - icon_file = 'icons/obj/radio.dmi' - json_config = 'code/datums/greyscale/json_configs/encryptionkey_security.json' - -/datum/greyscale_config/quantum_keycard - name = "Quantum Keycard" - icon_file = 'icons/obj/device.dmi' - json_config = 'code/datums/greyscale/json_configs/quantum_keycard.json' - -/datum/greyscale_config/heretic_rune - name = "Transmutation Rune" - icon_file = 'icons/effects/96x96.dmi' - json_config = 'code/datums/greyscale/json_configs/heretic_rune.json' - -/datum/greyscale_config/festive_hat - name = "Festive Hat" - icon_file = 'icons/obj/clothing/head/costume.dmi' - json_config = 'code/datums/greyscale/json_configs/festive_hat.json' - -/datum/greyscale_config/festive_hat_worn - name = "Festive Hat Worn" - icon_file = 'icons/mob/clothing/head/costume.dmi' - json_config = 'code/datums/greyscale/json_configs/festive_hat.json' - -/datum/greyscale_config/party_hat - name = "Party Hat" - icon_file = 'icons/obj/clothing/head/costume.dmi' - json_config = 'code/datums/greyscale/json_configs/party_hat.json' - -/datum/greyscale_config/party_hat_worn - name = "Party Hat Worn" - icon_file = 'icons/mob/clothing/head/costume.dmi' - json_config = 'code/datums/greyscale/json_configs/party_hat.json' diff --git a/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm b/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm new file mode 100644 index 0000000000000..84e79a088b94c --- /dev/null +++ b/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm @@ -0,0 +1,687 @@ +// +// HEAD +// + +/datum/greyscale_config/sombrero + name = "Sombrero" + icon_file = 'icons/obj/clothing/head/sombrero.dmi' + json_config = 'code/datums/greyscale/json_configs/sombrero.json' + +/datum/greyscale_config/sombrero/worn + name = "Sombrero (Worn)" + json_config = 'code/datums/greyscale/json_configs/sombrero_worn.json' + +/datum/greyscale_config/sombrero/lefthand + name = "Sombrero (Held, Left)" + json_config = 'code/datums/greyscale/json_configs/sombrero_lefthand.json' + +/datum/greyscale_config/sombrero/righthand + name = "Sombrero (Held, Right)" + json_config = 'code/datums/greyscale/json_configs/sombrero_righthand.json' + +/datum/greyscale_config/sombrero/base + name = "Base Sombrero Style" + json_config = 'code/datums/greyscale/json_configs/sombrero_base.json' + +/datum/greyscale_config/sombrero/base_worn + name = "Base Worn Sombrero Style" + json_config = 'code/datums/greyscale/json_configs/sombrero_base_worn.json' + +/datum/greyscale_config/sombrero/base_lefthand + name = "Base Sombrero Style (Held, Left)" + json_config = 'code/datums/greyscale/json_configs/sombrero_base_lefthand.json' + +/datum/greyscale_config/sombrero/base_righthand + name = "Held Sombrero Style (Held, Right)" + json_config = 'code/datums/greyscale/json_configs/sombrero_base_righthand.json' + +/datum/greyscale_config/beret + name = "Beret" + icon_file = 'icons/obj/clothing/head/beret.dmi' + json_config = 'code/datums/greyscale/json_configs/beret.json' + +/datum/greyscale_config/beret/worn + name = "Beret (Worn)" + json_config = 'code/datums/greyscale/json_configs/beret_worn.json' + +/datum/greyscale_config/beret_badge + name = "Badged Beret" + icon_file = 'icons/obj/clothing/head/beret.dmi' + json_config = 'code/datums/greyscale/json_configs/beret_badge.json' + +/datum/greyscale_config/beret_badge/worn + name = "Badged Beret (Worn)" + json_config = 'code/datums/greyscale/json_configs/beret_badge_worn.json' + +/datum/greyscale_config/beanie + name = "Beanie" + icon_file = 'icons/obj/clothing/head/beanie.dmi' + json_config = 'code/datums/greyscale/json_configs/beanie.json' + +/datum/greyscale_config/beanie/worn + name = "Beanie (Worn)" + icon_file = 'icons/mob/clothing/head/beanie.dmi' + +/datum/greyscale_config/festive_hat + name = "Festive Hat" + icon_file = 'icons/obj/clothing/head/costume.dmi' + json_config = 'code/datums/greyscale/json_configs/festive_hat.json' + +/datum/greyscale_config/festive_hat/worn + name = "Festive Hat (Worn)" + icon_file = 'icons/mob/clothing/head/costume.dmi' + +/datum/greyscale_config/party_hat + name = "Party Hat" + icon_file = 'icons/obj/clothing/head/costume.dmi' + json_config = 'code/datums/greyscale/json_configs/party_hat.json' + +/datum/greyscale_config/party_hat/worn + name = "Party Hat (Worn)" + icon_file = 'icons/mob/clothing/head/costume.dmi' + +// +// MASKS +// + +/datum/greyscale_config/bandana + name = "Bandana" + icon_file = 'icons/obj/clothing/masks.dmi' + json_config = 'code/datums/greyscale/json_configs/bandana.json' + +/datum/greyscale_config/bandana/worn + name = "Bandana (Worn)" + icon_file = 'icons/mob/clothing/mask.dmi' + +/datum/greyscale_config/bandana/inhands_left + name = "Bandana (Held, Left)" + icon_file = 'icons/mob/inhands/clothing/masks_lefthand.dmi' + json_config = 'code/datums/greyscale/json_configs/bandana_inhands.json' + +/datum/greyscale_config/bandana/inhands_right + name = "Bandana (Held, Right)" + icon_file = 'icons/mob/inhands/clothing/masks_righthand.dmi' + json_config = 'code/datums/greyscale/json_configs/bandana_inhands.json' + +/datum/greyscale_config/bandana/striped + name = "Striped Bandana" + icon_file = 'icons/obj/clothing/masks.dmi' + json_config = 'code/datums/greyscale/json_configs/bandstriped.json' + +/datum/greyscale_config/bandana/striped/worn + name = "Striped Bandana (Worn)" + icon_file = 'icons/mob/clothing/mask.dmi' + +/datum/greyscale_config/bandana/striped/inhands_left + name = "Striped Bandana (Held, Left)" + icon_file = 'icons/mob/inhands/clothing/masks_lefthand.dmi' + json_config = 'code/datums/greyscale/json_configs/bandanastriped_inhands.json' + +/datum/greyscale_config/bandana/striped/inhands_right + name = "Striped Bandana (Held, Right)" + icon_file = 'icons/mob/inhands/clothing/masks_righthand.dmi' + json_config = 'code/datums/greyscale/json_configs/bandanastriped_inhands.json' + +/datum/greyscale_config/bandana/skull + name = "Skull Bandana" + icon_file = 'icons/obj/clothing/masks.dmi' + json_config = 'code/datums/greyscale/json_configs/bandskull.json' + +/datum/greyscale_config/bandana/skull/worn + name = "Skull Bandana (Worn)" + icon_file = 'icons/mob/clothing/mask.dmi' + +/datum/greyscale_config/bandana/skull/inhands_left + name = "Skull Bandana (Held, Left)" + icon_file = 'icons/mob/inhands/clothing/masks_lefthand.dmi' + json_config = 'code/datums/greyscale/json_configs/bandanaskull_inhands.json' + +/datum/greyscale_config/bandana/skull/inhands_right + name = "Skull Bandana (Held, Right)" + icon_file = 'icons/mob/inhands/clothing/masks_righthand.dmi' + json_config = 'code/datums/greyscale/json_configs/bandanaskull_inhands.json' + +// +// NECK +// + +/datum/greyscale_config/ties + name = "Ties" + icon_file = 'icons/obj/clothing/neck.dmi' + json_config = 'code/datums/greyscale/json_configs/ties.json' + +/datum/greyscale_config/ties/worn + name = "Ties (Worn)" + icon_file = 'icons/mob/clothing/neck.dmi' + +/datum/greyscale_config/scarf + name = "Scarf" + icon_file = 'icons/obj/clothing/neck.dmi' + json_config = 'code/datums/greyscale/json_configs/scarf.json' + +/datum/greyscale_config/scarf/worn + name = "Scarf (Worn)" + icon_file = 'icons/mob/clothing/neck.dmi' + +/datum/greyscale_config/infinity_scarf + name = "Infinity Scarf" + icon_file = 'icons/obj/clothing/neck.dmi' + json_config = 'code/datums/greyscale/json_configs/infinity_scarf.json' + +/datum/greyscale_config/infinity_scarf/worn + name = "Infinity Scarf (Worn)" + icon_file = 'icons/mob/clothing/neck.dmi' + +// +// GLOVES +// + +/datum/greyscale_config/gloves_inhand_left + name = "Gloves (Held, Left)" + icon_file = 'icons/mob/inhands/clothing/gloves_lefthand.dmi' + json_config = 'code/datums/greyscale/json_configs/gloves_inhand.json' + +/datum/greyscale_config/gloves_inhand_right + name = "Gloves (Held, Right)" + icon_file = 'icons/mob/inhands/clothing/gloves_righthand.dmi' + json_config = 'code/datums/greyscale/json_configs/gloves_inhand.json' + +// +// UNDER +// + +/datum/greyscale_config/jumpsuit + name = "Jumpsuit" + icon_file = 'icons/obj/clothing/under/color.dmi' + json_config = 'code/datums/greyscale/json_configs/jumpsuit.json' + +/datum/greyscale_config/jumpsuit/worn + name = "Jumpsuit (Worn)" + icon_file = 'icons/mob/clothing/under/color.dmi' + json_config = 'code/datums/greyscale/json_configs/jumpsuit_worn.json' //Needs separate config for toggle states + +/datum/greyscale_config/jumpsuit/inhand_left + name = "Jumpsuit (Held, Left)" + icon_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi' + json_config = 'code/datums/greyscale/json_configs/jumpsuit_inhand.json' + +/datum/greyscale_config/jumpsuit/inhand_right + name = "Jumpsuit (Held, Right)" + icon_file = 'icons/mob/inhands/clothing/suits_righthand.dmi' + json_config = 'code/datums/greyscale/json_configs/jumpsuit_inhand.json' + +/datum/greyscale_config/jumpsuit/prison + name = "Prison Jumpsuit" + icon_file = 'icons/obj/clothing/under/color.dmi' + json_config = 'code/datums/greyscale/json_configs/jumpsuit_prison.json' + +/datum/greyscale_config/jumpsuit/prison/worn + name = "Prison Jumpsuit (Worn)" + icon_file = 'icons/mob/clothing/under/color.dmi' + json_config = 'code/datums/greyscale/json_configs/jumpsuit_prison_worn.json' //Needs separate config for toggle states + +/datum/greyscale_config/jumpsuit/prison/inhand_left + name = "Prison Jumpsuit (Held, Left)" + icon_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi' + json_config = 'code/datums/greyscale/json_configs/jumpsuit_prison_inhand.json' + +/datum/greyscale_config/jumpsuit/prison/inhand_right + name = "Prison Jumpsuit (Held, Right)" + icon_file = 'icons/mob/inhands/clothing/suits_righthand.dmi' + json_config = 'code/datums/greyscale/json_configs/jumpsuit_prison_inhand.json' + +/datum/greyscale_config/eth_tunic + name = "Ethereal Tunic" + icon_file = 'icons/obj/clothing/under/ethereal.dmi' + json_config = 'code/datums/greyscale/json_configs/eth_tunic.json' + +/datum/greyscale_config/eth_tunic/worn + name = "Ethereal Tunic (Worn)" + icon_file = 'icons/mob/clothing/under/ethereal.dmi' + +/datum/greyscale_config/trek + name = "Trek Uniform" + icon_file = 'icons/obj/clothing/under/trek.dmi' + json_config = 'code/datums/greyscale/json_configs/trek.json' + //All Trek uniforms are different icon_states in the same json so we dont have seperate jsons for all the different types + +/datum/greyscale_config/trek/worn + name = "Trek Uniform (Worn)" + icon_file = 'icons/mob/clothing/under/trek.dmi' + +// DRESSES AND SKIRTS +/datum/greyscale_config/plaidskirt + name = "Plaid Skirt" + icon_file = 'icons/obj/clothing/under/dress.dmi' + json_config = 'code/datums/greyscale/json_configs/plaidskirt.json' + +/datum/greyscale_config/plaidskirt/worn + name = "Plaid Skirt (Worn)" + icon_file = 'icons/mob/clothing/under/dress.dmi' + json_config = 'code/datums/greyscale/json_configs/plaidskirt_worn.json' //Needs separate config for toggle states + +/datum/greyscale_config/turtleskirt + name = "Skirtleneck" + icon_file = 'icons/obj/clothing/under/dress.dmi' + json_config = 'code/datums/greyscale/json_configs/turtleskirt.json' + +/datum/greyscale_config/turtleskirt/worn + name = "Skirtleneck (Worn)" + icon_file = 'icons/mob/clothing/under/dress.dmi' + +/datum/greyscale_config/tango + name = "Tango Dress" + icon_file = 'icons/obj/clothing/under/dress.dmi' + json_config = 'code/datums/greyscale/json_configs/tango.json' + +/datum/greyscale_config/tango/worn + name = "Tango Dress (Worn)" + icon_file = 'icons/mob/clothing/under/dress.dmi' + +/datum/greyscale_config/sundress + name = "Sundress" + icon_file = 'icons/obj/clothing/under/dress.dmi' + json_config = 'code/datums/greyscale/json_configs/sundress.json' + +/datum/greyscale_config/sundress/worn + name = "Sundress (Worn)" + icon_file = 'icons/mob/clothing/under/dress.dmi' + +// SHIRTS, PANTS AND SHORTS +/datum/greyscale_config/slacks + name = "Slacks" + icon_file = 'icons/obj/clothing/under/shorts_pants_shirts.dmi' + json_config = 'code/datums/greyscale/json_configs/slacks.json' + +/datum/greyscale_config/slacks/worn + name = "Slacks (Worn)" + icon_file = 'icons/mob/clothing/under/shorts_pants_shirts.dmi' + +/datum/greyscale_config/shorts + name = "Shorts" + icon_file = 'icons/obj/clothing/under/shorts_pants_shirts.dmi' + json_config = 'code/datums/greyscale/json_configs/shorts.json' + +/datum/greyscale_config/shorts/worn + name = "Shorts (Worn)" + icon_file = 'icons/mob/clothing/under/shorts_pants_shirts.dmi' + +/datum/greyscale_config/jeans + name = "Jeans" + icon_file = 'icons/obj/clothing/under/shorts_pants_shirts.dmi' + json_config = 'code/datums/greyscale/json_configs/jeans.json' + +/datum/greyscale_config/jeans/worn + name = "Jeans (Worn)" + icon_file = 'icons/mob/clothing/under/shorts_pants_shirts.dmi' + +/datum/greyscale_config/jeanshorts + name = "Jean Shorts" + icon_file = 'icons/obj/clothing/under/shorts_pants_shirts.dmi' + json_config = 'code/datums/greyscale/json_configs/jeanshorts.json' + +/datum/greyscale_config/jeanshorts/worn + name = "Jean Shorts (Worn)" + icon_file = 'icons/mob/clothing/under/shorts_pants_shirts.dmi' + +/datum/greyscale_config/buttondown_slacks + name = "Buttondown with Slacks" + icon_file = 'icons/obj/clothing/under/shorts_pants_shirts.dmi' + json_config = 'code/datums/greyscale/json_configs/buttondown_slacks.json' + +/datum/greyscale_config/buttondown_slacks/worn + name = "Buttondown with Slacks (Worn)" + icon_file = 'icons/mob/clothing/under/shorts_pants_shirts.dmi' + json_config = 'code/datums/greyscale/json_configs/buttondown_slacks_worn.json' //Needed a unique object .json to fix height issues, so the worn is separate + +/datum/greyscale_config/buttondown_shorts + name = "Buttondown with Shorts" + icon_file = 'icons/obj/clothing/under/shorts_pants_shirts.dmi' + json_config = 'code/datums/greyscale/json_configs/buttondown_shorts.json' + +/datum/greyscale_config/buttondown_shorts/worn + name = "Buttondown with Shorts (Worn)" + icon_file = 'icons/mob/clothing/under/shorts_pants_shirts.dmi' + json_config = 'code/datums/greyscale/json_configs/buttondown_shorts_worn.json' //Ditto + +/datum/greyscale_config/buttondown_skirt + name = "Buttondown with Skirt" + icon_file = 'icons/obj/clothing/under/shorts_pants_shirts.dmi' + json_config = 'code/datums/greyscale/json_configs/buttondown_skirt.json' + +/datum/greyscale_config/buttondown_skirt/worn + name = "Buttondown with Skirt (Worn)" + icon_file = 'icons/mob/clothing/under/shorts_pants_shirts.dmi' + json_config = 'code/datums/greyscale/json_configs/buttondown_skirt_worn.json' + + +// +// SUITS +// + +/datum/greyscale_config/ctf_standard + name = "CTF Standard Vest" + icon_file = 'icons/obj/clothing/suits/ctf.dmi' + json_config = 'code/datums/greyscale/json_configs/ctf_standard.json' + +/datum/greyscale_config/ctf_standard/worn + name = "Worn CTF Standard Vest (Worn)" + icon_file = 'icons/mob/clothing/suits/ctf.dmi' + +/datum/greyscale_config/ctf_light + name = "CTF Light Vest" + icon_file = 'icons/obj/clothing/suits/ctf.dmi' + json_config = 'code/datums/greyscale/json_configs/ctf_light.json' + +/datum/greyscale_config/ctf_light/worn + name = "CTF Light Vest (Worn)" + icon_file = 'icons/mob/clothing/suits/ctf.dmi' + +/datum/greyscale_config/mothcoat + name = "Moth Coat" + icon_file = 'icons/obj/clothing/suits/moth.dmi' + json_config = 'code/datums/greyscale/json_configs/moth_coat.json' + +/datum/greyscale_config/mothcoat/worn + name = "Moth Coat (Worn)" + icon_file = 'icons/mob/clothing/suits/moth.dmi' + +/datum/greyscale_config/mothcoat_winter + name = "Moth Winter Coat" + icon_file = 'icons/obj/clothing/suits/moth.dmi' + json_config = 'code/datums/greyscale/json_configs/moth_coat_winter.json' + +/datum/greyscale_config/mothcoat_winter/worn + name = "Moth Winter Coat (Worn)" + icon_file = 'icons/mob/clothing/suits/moth.dmi' + +/datum/greyscale_config/eth_raincoat + name = "Ethereal Raincoat" + icon_file = 'icons/obj/clothing/suits/ethereal.dmi' + json_config = 'code/datums/greyscale/json_configs/eth_raincoat.json' + +/datum/greyscale_config/eth_raincoat/worn + name = "Ethereal Raincoat (Worn)" + icon_file = 'icons/mob/clothing/suits/ethereal.dmi' + json_config = 'code/datums/greyscale/json_configs/eth_raincoat_worn.json' //Needs separate config for toggle states + +/datum/greyscale_config/sweater + name = "Sweater" + icon_file = 'icons/obj/clothing/suits/jacket.dmi' + json_config = 'code/datums/greyscale/json_configs/sweater.json' + +/datum/greyscale_config/sweater/worn + name = "Sweater (Worn)" + icon_file = 'icons/mob/clothing/suits/jacket.dmi' + +/datum/greyscale_config/jacket_oversized + name = "Oversized Jacket" + icon_file = 'icons/obj/clothing/suits/jacket.dmi' + json_config = 'code/datums/greyscale/json_configs/jacket_oversized.json' + +/datum/greyscale_config/jacket_oversized/worn + name = "Oversized Jacket (Worn)" + icon_file = 'icons/mob/clothing/suits/jacket.dmi' + +/datum/greyscale_config/jacket_lawyer + name = "Formal Suit Jacket" + icon_file = 'icons/obj/clothing/suits/jacket.dmi' + json_config = 'code/datums/greyscale/json_configs/jacket_lawyer.json' + +/datum/greyscale_config/jacket_lawyer/worn + name = "Formal Suit Jacket (Worn)" + icon_file = 'icons/mob/clothing/suits/jacket.dmi' + +/datum/greyscale_config/overalls + name = "Overalls" + icon_file = 'icons/obj/clothing/suits/utility.dmi' + json_config = 'code/datums/greyscale/json_configs/overalls.json' + +/datum/greyscale_config/overalls/worn + name = "Overalls (Worn)" + icon_file = 'icons/mob/clothing/suits/utility.dmi' + +// +// SHOES +// + +/datum/greyscale_config/sneakers + name = "Sneakers" + icon_file = 'icons/obj/clothing/shoes.dmi' + json_config = 'code/datums/greyscale/json_configs/sneakers.json' + +/datum/greyscale_config/sneakers/worn + name = "Sneakers (Worn)" + icon_file = 'icons/mob/clothing/feet.dmi' + +/datum/greyscale_config/sneakers/inhand_left + name = "Sneakers (Held, Left)" + icon_file = 'icons/mob/inhands/clothing/shoes_lefthand.dmi' + json_config = 'code/datums/greyscale/json_configs/sneakers_inhand.json' + +/datum/greyscale_config/sneakers/inhand_right + name = "Sneakers (Held, Right)" + icon_file = 'icons/mob/inhands/clothing/shoes_righthand.dmi' + json_config = 'code/datums/greyscale/json_configs/sneakers_inhand.json' + +/datum/greyscale_config/sneakers_orange + name = "Orange Sneakers" + icon_file = 'icons/obj/clothing/shoes.dmi' + json_config = 'code/datums/greyscale/json_configs/sneakers_orange.json' + +/datum/greyscale_config/sneakers_orange/worn + name = "Orange Sneakers (Worn)" + icon_file = 'icons/mob/clothing/feet.dmi' + +/datum/greyscale_config/sneakers_orange/inhand_left + name = "Orange Sneakers (Held, Left)" + icon_file = 'icons/mob/inhands/clothing/shoes_lefthand.dmi' + json_config = 'code/datums/greyscale/json_configs/sneakers_orange_inhand.json' + +/datum/greyscale_config/sneakers_orange/inhand_right + name = "Orange Sneakers (Held, Right)" + icon_file = 'icons/mob/inhands/clothing/shoes_righthand.dmi' + json_config = 'code/datums/greyscale/json_configs/sneakers_orange_inhand.json' + +/datum/greyscale_config/sneakers_wheelys + name = "Wheeled Sneakers" + icon_file = 'icons/obj/clothing/shoes.dmi' + json_config = 'code/datums/greyscale/json_configs/sneakers_wheelys.json' + +/datum/greyscale_config/sneakers_marisa + name = "Marisa Sneakers" + icon_file = 'icons/obj/clothing/shoes.dmi' + json_config = 'code/datums/greyscale/json_configs/sneakers_marisa.json' + +/datum/greyscale_config/sneakers_marisa/worn + name = "Worn Marisa Sneakers (Worn)" + icon_file = 'icons/mob/clothing/feet.dmi' + +/datum/greyscale_config/glow_shoes + name = "Glow Shoes" + icon_file = 'icons/obj/clothing/shoes.dmi' + json_config = 'code/datums/greyscale/json_configs/glow_shoes.json' + +/datum/greyscale_config/glow_shoes/worn + name = "Glow Shoes (Worn)" + icon_file = 'icons/mob/clothing/feet.dmi' + +// +// ACCESSORIES +// + +/datum/greyscale_config/suspenders + name = "Suspenders" + icon_file = 'icons/obj/clothing/belts.dmi' + json_config = 'code/datums/greyscale/json_configs/suspenders.json' + +/datum/greyscale_config/suspenders/worn + name = "Suspenders (Worn)" + icon_file = 'icons/mob/clothing/suits/utility.dmi' + +/datum/greyscale_config/waistcoat + name = "Waistcoat" + icon_file = 'icons/obj/clothing/accessories.dmi' + json_config = 'code/datums/greyscale/json_configs/waistcoat.json' + +/datum/greyscale_config/waistcoat/worn + name = "Waistcoat (Worn)" + icon_file = 'icons/mob/clothing/accessories.dmi' + +// +// SUIT + HEAD +// (Specifically for toggleable suits with hats, i.e. winter coats) +// + +/datum/greyscale_config/winter_coats + name = "Winter Coat" + icon_file = 'icons/obj/clothing/suits/wintercoat.dmi' + json_config = 'code/datums/greyscale/json_configs/wintercoats.json' + +/datum/greyscale_config/winter_coats/worn + name = "Winter Coat (Worn)" + icon_file = 'icons/mob/clothing/suits/wintercoat.dmi' + json_config = 'code/datums/greyscale/json_configs/wintercoats_worn.json' //Needs separate config for toggle states + +/datum/greyscale_config/winter_hoods + name = "Winter Coat Hood" + icon_file = 'icons/obj/clothing/head/winterhood.dmi' + json_config = 'code/datums/greyscale/json_configs/wintercoats_hood.json' + +/datum/greyscale_config/winter_hoods/worn + name = "Winter Coat Hood (Worn)" + icon_file = 'icons/mob/clothing/head/winterhood.dmi' + +/datum/greyscale_config/heck_suit + name = "H.E.C.K. Suit" + icon_file = 'icons/obj/clothing/suits/armor.dmi' + json_config = 'code/datums/greyscale/json_configs/heck_suit.json' + +/datum/greyscale_config/heck_suit/worn + name = "H.E.C.K. Suit (Worn)" + icon_file = 'icons/mob/clothing/suits/armor.dmi' + +/datum/greyscale_config/heck_helmet + name = "H.E.C.K. Helmet" + icon_file = 'icons/obj/clothing/head/helmet.dmi' + json_config = 'code/datums/greyscale/json_configs/heck_helmet.json' + +/datum/greyscale_config/heck_helmet/worn + name = "H.E.C.K. Helmet (Worn)" + icon_file = 'icons/mob/clothing/head/helmet.dmi' + +// +// COSTUMES +// (It's better these stay paired together) +// + +/datum/greyscale_config/football_helmet + name = "Football Helmet" + icon_file = 'icons/obj/clothing/head/costume.dmi' + json_config = 'code/datums/greyscale/json_configs/football_helmet.json' + +/datum/greyscale_config/football_helmet/worn + name = "Football Helmet (Worn)" + icon_file = 'icons/mob/clothing/head/costume.dmi' + +/datum/greyscale_config/football_suit + name = "Football Suit" + icon_file = 'icons/obj/clothing/under/costume.dmi' + json_config = 'code/datums/greyscale/json_configs/football_suit.json' + +/datum/greyscale_config/football_suit/worn + name = "Football Suit (Worn)" + icon_file = 'icons/mob/clothing/under/costume.dmi' + +/datum/greyscale_config/football_armor + name = "Football Armor" + icon_file = 'icons/obj/clothing/suits/costume.dmi' + json_config = 'code/datums/greyscale/json_configs/football_armor.json' + +/datum/greyscale_config/football_armor/worn + name = "Football Armor (Worn)" + icon_file = 'icons/mob/clothing/suits/costume.dmi' + +/datum/greyscale_config/fancy_hat + name = "Fancy Hat" + icon_file = 'icons/obj/clothing/head/costume.dmi' + json_config = 'code/datums/greyscale/json_configs/fancy_hat.json' + +/datum/greyscale_config/fancy_hat/worn + name = "Fancy Hat (Worn)" + icon_file = 'icons/mob/clothing/head/costume.dmi' + +/datum/greyscale_config/fancy_coat + name = "Fancy Coat" + icon_file = 'icons/obj/clothing/suits/jacket.dmi' + json_config = 'code/datums/greyscale/json_configs/fancy_coat.json' + +/datum/greyscale_config/fancy_coat/worn + name = "Fancy Coat (Worn)" + icon_file = 'icons/mob/clothing/suits/jacket.dmi' + +/datum/greyscale_config/hawaiian_shirt + name = "Hawaiian Overshirt" + icon_file = 'icons/obj/clothing/suits/costume.dmi' + json_config = 'code/datums/greyscale/json_configs/hawaiian_shirt.json' + +/datum/greyscale_config/hawaiian_shirt/worn + name = "Hawaiian Overshirt (Worn)" + icon_file = 'icons/mob/clothing/suits/costume.dmi' + +/datum/greyscale_config/witch_hat + name = "Witch Hat" + icon_file = 'icons/obj/clothing/head/wizard.dmi' + json_config = 'code/datums/greyscale/json_configs/witch_hat.json' + +/datum/greyscale_config/witch_hat/worn + name = "Witch Hat (Worn)" + icon_file = 'icons/mob/clothing/head/wizard.dmi' + +/datum/greyscale_config/wellworn_shirt + name = "Well-Worn Shirt" + icon_file = 'icons/obj/clothing/suits/costume.dmi' + json_config = 'code/datums/greyscale/json_configs/wellworn_shirt.json' + +/datum/greyscale_config/wellworn_shirt/worn + name = "Well-Worn Shirt (Worn)" + icon_file = 'icons/mob/clothing/suits/costume.dmi' + +/datum/greyscale_config/wellworn_shirt_graphic + name = "Well-Worn Shirt (Graphic)" + icon_file = 'icons/obj/clothing/suits/costume.dmi' + json_config = 'code/datums/greyscale/json_configs/wellworn_shirt_graphic.json' + +/datum/greyscale_config/wellworn_shirt_graphic/worn + name = "Well-Worn Shirt (Graphic)(Worn)" + icon_file = 'icons/mob/clothing/suits/costume.dmi' + +/datum/greyscale_config/wellworn_shirt/wornout + name = "Worn-Out Shirt" + +/datum/greyscale_config/wellworn_shirt/worn/wornout + name = "Worn-Out Shirt (Worn)" + +/datum/greyscale_config/wornout_shirt_graphic + name = "Worn-Out Shirt (Graphic)" + icon_file = 'icons/obj/clothing/suits/costume.dmi' + json_config = 'code/datums/greyscale/json_configs/wornout_shirt_graphic.json' + +/datum/greyscale_config/wornout_shirt_graphic/worn + name = "Worn-Out Shirt (Graphic)(Worn)" + icon_file = 'icons/mob/clothing/suits/costume.dmi' + +/datum/greyscale_config/wellworn_shirt/messy + name = "Messy Worn Shirt" + +/datum/greyscale_config/wellworn_shirt/worn/messy + name = "Messy Worn Shirt (Worn)" + +/datum/greyscale_config/messyworn_shirt_graphic + name = "Messy Shirt (Graphic)" + icon_file = 'icons/obj/clothing/suits/costume.dmi' + json_config = 'code/datums/greyscale/json_configs/messyworn_shirt_graphic.json' + +/datum/greyscale_config/messyworn_shirt_graphic/worn + name = "Messy Shirt (Graphic (Worn)" + icon_file = 'icons/mob/clothing/suits/costume.dmi' diff --git a/code/datums/greyscale/config_types/greyscale_configs/greyscale_effects.dm b/code/datums/greyscale/config_types/greyscale_configs/greyscale_effects.dm new file mode 100644 index 0000000000000..34db9013a893d --- /dev/null +++ b/code/datums/greyscale/config_types/greyscale_configs/greyscale_effects.dm @@ -0,0 +1,4 @@ +/datum/greyscale_config/heretic_rune + name = "Transmutation Rune" + icon_file = 'icons/effects/96x96.dmi' + json_config = 'code/datums/greyscale/json_configs/heretic_rune.json' diff --git a/code/datums/greyscale/config_types/greyscale_configs/greyscale_items.dm b/code/datums/greyscale/config_types/greyscale_configs/greyscale_items.dm new file mode 100644 index 0000000000000..a345aba0b8106 --- /dev/null +++ b/code/datums/greyscale/config_types/greyscale_configs/greyscale_items.dm @@ -0,0 +1,366 @@ +// +// TOOLS +// + +/datum/greyscale_config/wirecutters + name = "Wirecutters" + icon_file = 'icons/obj/tools.dmi' + json_config = 'code/datums/greyscale/json_configs/wirecutters.json' + +/datum/greyscale_config/wirecutters_belt_overlay + name = "Belt Worn Icon" + icon_file = 'icons/obj/clothing/belt_overlays.dmi' + json_config = 'code/datums/greyscale/json_configs/wirecutters.json' + +/datum/greyscale_config/wirecutter_inhand_left + name = "Held Wirecutter, Left" + icon_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' + json_config = 'code/datums/greyscale/json_configs/wirecutter_worn.json' + +/datum/greyscale_config/wirecutter_inhand_right + name = "Held Wirecutter, Right" + icon_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' + json_config = 'code/datums/greyscale/json_configs/wirecutter_worn.json' + +/datum/greyscale_config/screwdriver + name = "Screwdriver" + icon_file = 'icons/obj/tools.dmi' + json_config = 'code/datums/greyscale/json_configs/screwdriver.json' + +/datum/greyscale_config/screwdriver_inhand_left + name = "Held Screwdriver, Left" + icon_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' + json_config = 'code/datums/greyscale/json_configs/screwdriver_worn.json' + +/datum/greyscale_config/screwdriver_inhand_right + name = "Held Screwdriver, Right" + icon_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' + json_config = 'code/datums/greyscale/json_configs/screwdriver_worn.json' + +/datum/greyscale_config/screwdriver_belt + name = "Belt Worn Screwdriver" + icon_file = 'icons/obj/clothing/belt_overlays.dmi' + json_config = 'code/datums/greyscale/json_configs/screwdriver_worn.json' + +/datum/greyscale_config/fish_analyzer_inhand_left + name = "Held Fish Analyzer, Left" + icon_file = 'icons/mob/inhands/items_lefthand.dmi' + json_config = 'code/datums/greyscale/json_configs/fish_analyzer_worn.json' + +/datum/greyscale_config/fish_analyzer_inhand_right + name = "Held Fish Analyzer, Right" + icon_file = 'icons/mob/inhands/items_righthand.dmi' + json_config = 'code/datums/greyscale/json_configs/fish_analyzer_worn.json' + +/datum/greyscale_config/fish_analyzer_worn + name = "Worn Fish Analyzer" + icon_file = 'icons/mob/clothing/belt.dmi' + json_config = 'code/datums/greyscale/json_configs/fish_analyzer_worn.json' + +// +// WEAPONS +// + +/datum/greyscale_config/cleric_mace + name = "Base Cleric Mace" + icon_file = 'icons/obj/weapons/cleric_mace.dmi' + json_config = 'code/datums/greyscale/json_configs/items/cleric_mace.json' + +/datum/greyscale_config/cleric_mace_lefthand + name = "Base Held Cleric Mace, Left" + icon_file = 'icons/obj/weapons/cleric_mace.dmi' + json_config = 'code/datums/greyscale/json_configs/items/cleric_mace_lefthand.json' + +/datum/greyscale_config/cleric_mace_righthand + name = "Base Held Cleric Mace, Right" + icon_file = 'icons/obj/weapons/cleric_mace.dmi' + json_config = 'code/datums/greyscale/json_configs/items/cleric_mace_righthand.json' + +/datum/greyscale_config/cleric_mace_worn + name = "Base Worn Cleric Mace" + icon_file = 'icons/obj/weapons/cleric_mace.dmi' + json_config = 'code/datums/greyscale/json_configs/items/cleric_mace_worn.json' + +/datum/greyscale_config/cleric_mace/gold + name = "Gold Cleric Mace" + material_skin = /datum/material/gold + json_config = 'code/datums/greyscale/json_configs/items/cleric_mace_gold.json' + +/datum/greyscale_config/cleric_mace_lefthand/gold + name = "Gold Held Cleric Mace, Left" + material_skin = /datum/material/gold + json_config = 'code/datums/greyscale/json_configs/items/cleric_mace_lefthand_gold.json' + +/datum/greyscale_config/cleric_mace_righthand/gold + name = "Gold Held Cleric Mace, Right" + material_skin = /datum/material/gold + json_config = 'code/datums/greyscale/json_configs/items/cleric_mace_righthand_gold.json' + +/datum/greyscale_config/cleric_mace_worn/gold + name = "Gold Worn Cleric Mace" + icon_file = 'icons/obj/weapons/cleric_mace.dmi' + json_config = 'code/datums/greyscale/json_configs/items/cleric_mace_worn_gold.json' + +/datum/greyscale_config/ceremonial_blade + name = "Base Ceremonial Blade" + icon_file = 'icons/obj/weapons/ritual_weapon.dmi' + json_config = 'code/datums/greyscale/json_configs/items/ceremonial_blade.json' + +/datum/greyscale_config/ceremonial_blade_lefthand + name = "Base Held Ceremonial Blade, Left" + icon_file = 'icons/obj/weapons/ritual_weapon.dmi' + json_config = 'code/datums/greyscale/json_configs/items/ceremonial_blade_lefthand.json' + +/datum/greyscale_config/ceremonial_blade_righthand + name = "Base Held Ceremonial Blade, Right" + icon_file = 'icons/obj/weapons/ritual_weapon.dmi' + json_config = 'code/datums/greyscale/json_configs/items/ceremonial_blade_righthand.json' + +// +// PDA +// + +/datum/greyscale_config/tablet + name = "PDA" + icon_file = 'icons/obj/modular_pda.dmi' + json_config = 'code/datums/greyscale/json_configs/pda.json' + +/datum/greyscale_config/tablet/chaplain + name = "Chaplain PDA" + json_config = 'code/datums/greyscale/json_configs/pda_chaplain.json' + +/datum/greyscale_config/tablet/captain + name = "Captain PDA" + json_config = 'code/datums/greyscale/json_configs/pda_captain.json' + +/datum/greyscale_config/tablet/clown + name = "Clown PDA" + json_config = 'code/datums/greyscale/json_configs/pda_clown.json' + +/datum/greyscale_config/tablet/head + name = "Head PDA" + json_config = 'code/datums/greyscale/json_configs/pda_head.json' + +/datum/greyscale_config/tablet/mime + name = "Mime PDA" + json_config = 'code/datums/greyscale/json_configs/pda_mime.json' + +/datum/greyscale_config/tablet/stripe_double + name = "Double Stripe PDA" + json_config = 'code/datums/greyscale/json_configs/pda_stripe_double.json' + +/datum/greyscale_config/tablet/stripe_split + name = "Split Stripe PDA" + json_config = 'code/datums/greyscale/json_configs/pda_stripe_split.json' + +/datum/greyscale_config/tablet/stripe_thick + name = "Thick Stripe PDA" + json_config = 'code/datums/greyscale/json_configs/pda_stripe_thick.json' + +/datum/greyscale_config/tablet/stripe_thick/head + name = "Head Thick Stripe PDA" + json_config = 'code/datums/greyscale/json_configs/pda_stripe_thick_head.json' + +// +// ENCRYPTION KEYS +// + +/datum/greyscale_config/encryptionkey_basic + name = "Basic Encryptionkey" + icon_file = 'icons/obj/radio.dmi' + json_config = 'code/datums/greyscale/json_configs/encryptionkey_basic.json' + +/datum/greyscale_config/encryptionkey_cube + name = "Block Encryptionkey" + icon_file = 'icons/obj/radio.dmi' + json_config = 'code/datums/greyscale/json_configs/encryptionkey_cube.json' + +/datum/greyscale_config/encryptionkey_research + name = "Research Encryptionkey" + icon_file = 'icons/obj/radio.dmi' + json_config = 'code/datums/greyscale/json_configs/encryptionkey_research.json' + +/datum/greyscale_config/encryptionkey_syndicate + name = "Syndicate Encryptionkey" + icon_file = 'icons/obj/radio.dmi' + json_config = 'code/datums/greyscale/json_configs/encryptionkey_syndicate.json' + +/datum/greyscale_config/encryptionkey_medical + name = "Medical Encryptionkey" + icon_file = 'icons/obj/radio.dmi' + json_config = 'code/datums/greyscale/json_configs/encryptionkey_medical.json' + +/datum/greyscale_config/encryptionkey_service + name = "Service Encryptionkey" + icon_file = 'icons/obj/radio.dmi' + json_config = 'code/datums/greyscale/json_configs/encryptionkey_service.json' + +/datum/greyscale_config/encryptionkey_engineering + name = "Engineering Encryptionkey" + icon_file = 'icons/obj/radio.dmi' + json_config = 'code/datums/greyscale/json_configs/encryptionkey_engineering.json' + +/datum/greyscale_config/encryptionkey_centcom + name = "Centcom Encryptionkey" + icon_file = 'icons/obj/radio.dmi' + json_config = 'code/datums/greyscale/json_configs/encryptionkey_centcom.json' + +/datum/greyscale_config/encryptionkey_cargo + name = "Cargo Encryptionkey" + icon_file = 'icons/obj/radio.dmi' + json_config = 'code/datums/greyscale/json_configs/encryptionkey_cargo.json' + +/datum/greyscale_config/encryptionkey_security + name = "Security Encryptionkey" + icon_file = 'icons/obj/radio.dmi' + json_config = 'code/datums/greyscale/json_configs/encryptionkey_security.json' + +/datum/greyscale_config/quantum_keycard + name = "Quantum Keycard" + icon_file = 'icons/obj/device.dmi' + json_config = 'code/datums/greyscale/json_configs/quantum_keycard.json' + +// +// PLUSHIES +// + +/datum/greyscale_config/plush_carp + name = "Plushie Carp" + icon_file = 'icons/obj/toys/plushes.dmi' + json_config = 'code/datums/greyscale/json_configs/plushie_carp.json' + +/datum/greyscale_config/plush_lizard + name = "Plushie Lizard" + icon_file = 'icons/obj/toys/plushes.dmi' + json_config = 'code/datums/greyscale/json_configs/plushie_lizard.json' + +/datum/greyscale_config/plush_slime + name = "Plushie Slime" + icon_file = 'icons/obj/toys/plushes.dmi' + json_config = 'code/datums/greyscale/json_configs/plushie_slime.json' + +/datum/greyscale_config/plush_snake + name = "Plushie Snake" + icon_file = 'icons/obj/toys/plushes.dmi' + json_config = 'code/datums/greyscale/json_configs/plushie_snake.json' + +/datum/greyscale_config/plush_spacelizard + name = "Plushie Space Lizard" + icon_file = 'icons/obj/toys/plushes.dmi' + json_config = 'code/datums/greyscale/json_configs/plushie_spacelizard.json' + +// +// VAPES +// + +/datum/greyscale_config/vape + name = "Vape" + icon_file = 'icons/obj/clothing/masks.dmi' + json_config = 'code/datums/greyscale/json_configs/vape.json' + +/datum/greyscale_config/vape/worn + name = "Worn Vape" + icon_file = 'icons/mob/clothing/mask.dmi' + json_config = 'code/datums/greyscale/json_configs/vape_worn.json' + +/datum/greyscale_config/vape/open_low + name = "Open Vape Low" + json_config = 'code/datums/greyscale/json_configs/vape_open_low.json' + +/datum/greyscale_config/vape/open_med + name = "Open Vape Medium" + json_config = 'code/datums/greyscale/json_configs/vape_open_med.json' + +/datum/greyscale_config/vape/open_high + name = "Open Vape High" + json_config = 'code/datums/greyscale/json_configs/vape_open_high.json' + +// +// TAPE +// + +/datum/greyscale_config/tape + name = "Tape" + icon_file = 'icons/obj/tapes.dmi' + json_config = 'code/datums/greyscale/json_configs/tape.json' + +/datum/greyscale_config/tape/spikes + name = "Spiked Tape" + icon_file = 'icons/obj/tapes.dmi' + json_config = 'code/datums/greyscale/json_configs/tape_spikes.json' + +/datum/greyscale_config/tape_piece + name = "Tape Piece" + icon_file = 'icons/obj/tapes.dmi' + json_config = 'code/datums/greyscale/json_configs/tape_piece.json' + +/datum/greyscale_config/tape_piece/spikes + name = "Spiked Tape Piece" + icon_file = 'icons/obj/tapes.dmi' + json_config = 'code/datums/greyscale/json_configs/tape_piece_spikes.json' + +/datum/greyscale_config/tape_piece/worn + name = "Worn Tape Piece" + icon_file = 'icons/obj/tapes.dmi' + json_config = 'code/datums/greyscale/json_configs/tape_piece_worn.json' + +/datum/greyscale_config/tape_piece/worn/spikes + name = "Worn Spiked Tape Piece" + icon_file = 'icons/obj/tapes.dmi' + json_config = 'code/datums/greyscale/json_configs/tape_piece_spikes_worn.json' + +// +// BUCKETS +// + +/datum/greyscale_config/buckets + name = "Buckets" + icon_file = 'icons/obj/service/janitor.dmi' + json_config = 'code/datums/greyscale/json_configs/buckets.json' + +/datum/greyscale_config/buckets_worn + name = "Buckets Worn" + icon_file = 'icons/mob/clothing/head/utility.dmi' + json_config = 'code/datums/greyscale/json_configs/buckets.json' + +/datum/greyscale_config/buckets_inhands_left + name = "Buckets Inhands Left" + icon_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi' + json_config = 'code/datums/greyscale/json_configs/buckets.json' + +/datum/greyscale_config/buckets_inhands_right + name = "Buckets Inhands Right" + icon_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi' + json_config = 'code/datums/greyscale/json_configs/buckets.json' + +/datum/greyscale_config/buckets_cleanbot + name = "Buckets - Cleanbot" + icon_file = 'icons/mob/silicon/aibots.dmi' + json_config = 'code/datums/greyscale/json_configs/buckets_bot.json' + +// +// MISC +// + +/datum/greyscale_config/circuit + name = "Circuit Board" + icon_file = 'icons/obj/assemblies/module.dmi' + json_config = 'code/datums/greyscale/json_configs/circuit.json' + +/datum/greyscale_config/janicart_upgrade + name = "Janicart Upgrade" + icon_file = 'icons/obj/service/janicart_upgrade.dmi' + json_config = 'code/datums/greyscale/json_configs/janicart_upgrade.json' + +/datum/greyscale_config/janicart_upgrade/installed + json_config = 'code/datums/greyscale/json_configs/janicart_upgrade_installed.json' + +/datum/greyscale_config/flower_simple + name = "Flower" + icon_file = 'icons/obj/service/hydroponics/harvest.dmi' + json_config = 'code/datums/greyscale/json_configs/simple_flower.json' + +/datum/greyscale_config/flower_simple_worn + name = "Flower Worn" + icon_file = 'icons/mob/clothing/head/hydroponics.dmi' + json_config = 'code/datums/greyscale/json_configs/simple_flower_worn.json' diff --git a/code/datums/greyscale/config_types/greyscale_configs/greyscale_mobs.dm b/code/datums/greyscale/config_types/greyscale_configs/greyscale_mobs.dm new file mode 100644 index 0000000000000..d247117f3a176 --- /dev/null +++ b/code/datums/greyscale/config_types/greyscale_configs/greyscale_mobs.dm @@ -0,0 +1,36 @@ +// +// CARP +// + +/datum/greyscale_config/carp + name = "Space Carp" + icon_file = 'icons/mob/simple/carp.dmi' + json_config = 'code/datums/greyscale/json_configs/carp.json' + +/datum/greyscale_config/carp_friend + name = "Friend Carp" + icon_file = 'icons/mob/simple/carp.dmi' + json_config = 'code/datums/greyscale/json_configs/carp_friend.json' + +/datum/greyscale_config/carp_magic + name = "Magicarp" + icon_file = 'icons/mob/simple/carp.dmi' + json_config = 'code/datums/greyscale/json_configs/carp_magic.json' + +/datum/greyscale_config/carp_mega + name = "Megacarp" + icon_file = 'icons/mob/simple/broadMobs.dmi' + json_config = 'code/datums/greyscale/json_configs/carp_mega.json' + +/datum/greyscale_config/carp/disk_mouth + name = "Space Carp, Disk in Mouth" + json_config = 'code/datums/greyscale/json_configs/carp_disk_mouth.json' + +// +// MISC +// + +/datum/greyscale_config/garden_gnome + name = "Garden Gnome" + icon_file = 'icons/mob/simple/garden_gnome.dmi' + json_config = 'code/datums/greyscale/json_configs/garden_gnome.json' diff --git a/code/datums/greyscale/config_types/greyscale_configs/greyscale_objects.dm b/code/datums/greyscale/config_types/greyscale_configs/greyscale_objects.dm new file mode 100644 index 0000000000000..08df98148a161 --- /dev/null +++ b/code/datums/greyscale/config_types/greyscale_configs/greyscale_objects.dm @@ -0,0 +1,134 @@ +/datum/greyscale_config/material_airlock + name = "Material Airlock" + icon_file = 'icons/obj/doors/airlocks/material/material.dmi' + json_config = 'code/datums/greyscale/json_configs/material_airlock.json' + +// +// BENCHES +// + +/datum/greyscale_config/bench_solo + name = "Bench Solo" + icon_file = 'icons/obj/chairs_wide.dmi' + json_config = 'code/datums/greyscale/json_configs/bench_solo.json' + +/datum/greyscale_config/bench_middle + name = "Bench Middle" + icon_file = 'icons/obj/chairs_wide.dmi' + json_config = 'code/datums/greyscale/json_configs/bench_middle.json' + +/datum/greyscale_config/bench_left + name = "Bench Left" + icon_file = 'icons/obj/chairs_wide.dmi' + json_config = 'code/datums/greyscale/json_configs/bench_left.json' + +/datum/greyscale_config/bench_right + name = "Bench Right" + icon_file = 'icons/obj/chairs_wide.dmi' + json_config = 'code/datums/greyscale/json_configs/bench_right.json' + +/datum/greyscale_config/bench_corner + name = "Bench Corner" + icon_file = 'icons/obj/chairs_wide.dmi' + json_config = 'code/datums/greyscale/json_configs/bench_corner.json' + +// +// GIFTWRAP +// (Yes, some of these are items and not large objects, but it's better they stay grouped together) +// + +/datum/greyscale_config/giftdeliverybox + name = "Gift Box" + icon_file = 'icons/obj/storage/wrapping.dmi' + json_config = 'code/datums/greyscale/json_configs/giftdeliverybox.json' + +/datum/greyscale_config/giftdeliverycloset + name = "Gift Closet" + icon_file = 'icons/obj/storage/wrapping.dmi' + json_config = 'code/datums/greyscale/json_configs/giftdeliverycloset.json' + +/datum/greyscale_config/giftdeliverycrate + name = "Gift Crate" + icon_file = 'icons/obj/storage/wrapping.dmi' + json_config = 'code/datums/greyscale/json_configs/giftdeliverycrate.json' + +/datum/greyscale_config/giftdeliverypackage5 + name = "Gift Package 5 (Biggest)" + icon_file = 'icons/obj/storage/wrapping.dmi' + json_config = 'code/datums/greyscale/json_configs/giftdeliverypackage5.json' + +/datum/greyscale_config/giftdeliverypackage4 + name = "Gift Package 4" + icon_file = 'icons/obj/storage/wrapping.dmi' + json_config = 'code/datums/greyscale/json_configs/giftdeliverypackage4.json' + +/datum/greyscale_config/giftdeliverypackage3 + name = "Gift Package 3" + icon_file = 'icons/obj/storage/wrapping.dmi' + json_config = 'code/datums/greyscale/json_configs/giftdeliverypackage3.json' + +/datum/greyscale_config/giftdeliverypackage2 + name = "Gift Package 2" + icon_file = 'icons/obj/storage/wrapping.dmi' + json_config = 'code/datums/greyscale/json_configs/giftdeliverypackage2.json' + +/datum/greyscale_config/giftdeliverypackage1 + name = "Gift Package 1 (Smallest)" + icon_file = 'icons/obj/storage/wrapping.dmi' + json_config = 'code/datums/greyscale/json_configs/giftdeliverypackage1.json' + +/datum/greyscale_config/wrap_paper + name = "Wrapping Paper" + icon_file = 'icons/obj/stack_objects.dmi' + json_config = 'code/datums/greyscale/json_configs/wrap_paper.json' + +// +// ATMOSPHERICS +// + +// CANISTERS +/datum/greyscale_config/canister + name = "Default Canister" + icon_file = 'icons/obj/pipes_n_cables/canisters.dmi' + json_config = 'code/datums/greyscale/json_configs/canister_default.json' + +/datum/greyscale_config/canister/base + name = "Base Canister Style" + json_config = 'code/datums/greyscale/json_configs/canister_base.json' + +/datum/greyscale_config/canister/post_effects + name = "Canister Post-Effects" + json_config = 'code/datums/greyscale/json_configs/canister_post_effects.json' + +/datum/greyscale_config/canister/stripe + name = "Single Striped Canister" + json_config = 'code/datums/greyscale/json_configs/canister_stripe.json' + +/datum/greyscale_config/canister/double_stripe + name = "Double Striped Canister" + json_config = 'code/datums/greyscale/json_configs/canister_double_stripe.json' + +/datum/greyscale_config/canister/hazard + name = "Hazard Striped Canister" + json_config = 'code/datums/greyscale/json_configs/canister_hazard.json' + +/datum/greyscale_config/prototype_canister + name = "Prototype Canister" + icon_file = 'icons/obj/pipes_n_cables/prototype_canister.dmi' + json_config = 'code/datums/greyscale/json_configs/canister_proto.json' + +/datum/greyscale_config/stationary_canister + name = "Stationary Canister" + icon_file = 'icons/obj/pipes_n_cables/stationary_canisters.dmi' + json_config = 'code/datums/greyscale/json_configs/smooth_canister_stationary.json' + +// MISC ATMOSPHERICS +/datum/greyscale_config/meter + name = "Meter" + icon_file = 'icons/obj/pipes_n_cables/meter.dmi' + json_config = 'code/datums/greyscale/json_configs/meter.json' + +/datum/greyscale_config/thermomachine + name = "Thermomachine" + icon_file = 'icons/obj/machines/atmospherics/thermomachine.dmi' + json_config = 'code/datums/greyscale/json_configs/thermomachine.json' diff --git a/code/datums/greyscale/json_configs/bandana_worn.json b/code/datums/greyscale/json_configs/bandana_worn.json deleted file mode 100644 index a3347c34c1a04..0000000000000 --- a/code/datums/greyscale/json_configs/bandana_worn.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "bandana_worn": [ - { - "type": "icon_state", - "icon_state": "bandana_cloth_worn", - "blend_mode": "overlay", - "color_ids": [ 1 ] - } - ], - "bandana_worn_up": [ - { - "type": "icon_state", - "icon_state": "bandana_cloth_worn_up", - "blend_mode": "overlay", - "color_ids": [ 1 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/bandskull_worn.json b/code/datums/greyscale/json_configs/bandskull_worn.json deleted file mode 100644 index ef48106be99ca..0000000000000 --- a/code/datums/greyscale/json_configs/bandskull_worn.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "bandskull_worn": [ - { - "type": "icon_state", - "icon_state": "bandana_cloth_worn", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "bandana_skull_worn", - "blend_mode": "overlay", - "color_ids": [ 2 ] - } - ], - "bandskull_worn_up": [ - { - "type": "icon_state", - "icon_state": "bandana_cloth_worn_up", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "bandana_skull_worn_up", - "blend_mode": "overlay", - "color_ids": [ 2 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/bandstriped_worn.json b/code/datums/greyscale/json_configs/bandstriped_worn.json deleted file mode 100644 index a9d25f9737a09..0000000000000 --- a/code/datums/greyscale/json_configs/bandstriped_worn.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "bandstriped_worn": [ - { - "type": "icon_state", - "icon_state": "bandana_cloth_worn", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "bandana_stripe_worn", - "blend_mode": "overlay", - "color_ids": [ 2 ] - } - ], - "bandstriped_worn_up": [ - { - "type": "icon_state", - "icon_state": "bandana_cloth_worn_up", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "bandana_stripe_worn_up", - "blend_mode": "overlay", - "color_ids": [ 2 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/beanie_worn.json b/code/datums/greyscale/json_configs/beanie_worn.json deleted file mode 100644 index 94865d64cbf4c..0000000000000 --- a/code/datums/greyscale/json_configs/beanie_worn.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "beanie": [ - { - "type": "icon_state", - "icon_state": "beanie_stripe", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "beanie_base", - "blend_mode": "overlay", - "color_ids": [ 2 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/buttondown_shorts.json b/code/datums/greyscale/json_configs/buttondown_shorts.json index 8c4f4daf067e1..3a8bba407fce4 100644 --- a/code/datums/greyscale/json_configs/buttondown_shorts.json +++ b/code/datums/greyscale/json_configs/buttondown_shorts.json @@ -8,19 +8,19 @@ }, { "type": "icon_state", - "icon_state": "buckle", + "icon_state": "buttondown_obj_buckle", "blend_mode": "overlay", "color_ids": [ 2 ] }, { "type": "icon_state", - "icon_state": "belt", + "icon_state": "buttondown_obj_belt", "blend_mode": "overlay", "color_ids": [ 3 ] }, { "type": "icon_state", - "icon_state": "shorts", + "icon_state": "buttondown_obj_shorts", "blend_mode": "overlay", "color_ids": [ 4 ] } diff --git a/code/datums/greyscale/json_configs/buttondown_shorts_worn.json b/code/datums/greyscale/json_configs/buttondown_shorts_worn.json index 8c4f4daf067e1..2575a5d1f8f77 100644 --- a/code/datums/greyscale/json_configs/buttondown_shorts_worn.json +++ b/code/datums/greyscale/json_configs/buttondown_shorts_worn.json @@ -24,5 +24,31 @@ "blend_mode": "overlay", "color_ids": [ 4 ] } + ], + "buttondown_shorts_d": [ + { + "type": "icon_state", + "icon_state": "buttondown_d", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "buckle", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "belt", + "blend_mode": "overlay", + "color_ids": [ 3 ] + }, + { + "type": "icon_state", + "icon_state": "shorts", + "blend_mode": "overlay", + "color_ids": [ 4 ] + } ] } diff --git a/code/datums/greyscale/json_configs/buttondown_skirt.json b/code/datums/greyscale/json_configs/buttondown_skirt.json new file mode 100644 index 0000000000000..60d3d500f28a9 --- /dev/null +++ b/code/datums/greyscale/json_configs/buttondown_skirt.json @@ -0,0 +1,28 @@ +{ + "buttondown_skirt": [ + { + "type": "icon_state", + "icon_state": "buttondown", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "buttondown_obj_buckle", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "buttondown_obj_belt", + "blend_mode": "overlay", + "color_ids": [ 3 ] + }, + { + "type": "icon_state", + "icon_state": "buttondown_obj_skirt", + "blend_mode": "overlay", + "color_ids": [ 4 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/buttondown_skirt_worn.json b/code/datums/greyscale/json_configs/buttondown_skirt_worn.json new file mode 100644 index 0000000000000..e34a900caf4d0 --- /dev/null +++ b/code/datums/greyscale/json_configs/buttondown_skirt_worn.json @@ -0,0 +1,54 @@ +{ + "buttondown_skirt": [ + { + "type": "icon_state", + "icon_state": "buttondown", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "buckle", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "belt", + "blend_mode": "overlay", + "color_ids": [ 3 ] + }, + { + "type": "icon_state", + "icon_state": "skirt", + "blend_mode": "overlay", + "color_ids": [ 4 ] + } + ], + "buttondown_skirt_d": [ + { + "type": "icon_state", + "icon_state": "buttondown_d", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "buckle", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "belt", + "blend_mode": "overlay", + "color_ids": [ 3 ] + }, + { + "type": "icon_state", + "icon_state": "skirt", + "blend_mode": "overlay", + "color_ids": [ 4 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/buttondown_slacks.json b/code/datums/greyscale/json_configs/buttondown_slacks.json index e92706ef5bcf6..73d091e3d7092 100644 --- a/code/datums/greyscale/json_configs/buttondown_slacks.json +++ b/code/datums/greyscale/json_configs/buttondown_slacks.json @@ -8,19 +8,19 @@ }, { "type": "icon_state", - "icon_state": "buckle", + "icon_state": "buttondown_obj_buckle", "blend_mode": "overlay", "color_ids": [ 2 ] }, { "type": "icon_state", - "icon_state": "belt", + "icon_state": "buttondown_obj_belt", "blend_mode": "overlay", "color_ids": [ 3 ] }, { "type": "icon_state", - "icon_state": "slacks", + "icon_state": "buttondown_obj_slacks", "blend_mode": "overlay", "color_ids": [ 4 ] } diff --git a/code/datums/greyscale/json_configs/buttondown_slacks_worn.json b/code/datums/greyscale/json_configs/buttondown_slacks_worn.json index e92706ef5bcf6..149ec9fefc6eb 100644 --- a/code/datums/greyscale/json_configs/buttondown_slacks_worn.json +++ b/code/datums/greyscale/json_configs/buttondown_slacks_worn.json @@ -24,5 +24,31 @@ "blend_mode": "overlay", "color_ids": [ 4 ] } + ], + "buttondown_slacks_d": [ + { + "type": "icon_state", + "icon_state": "buttondown_d", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "buckle", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "belt", + "blend_mode": "overlay", + "color_ids": [ 3 ] + }, + { + "type": "icon_state", + "icon_state": "slacks", + "blend_mode": "overlay", + "color_ids": [ 4 ] + } ] } diff --git a/code/datums/greyscale/json_configs/carp_friend.json b/code/datums/greyscale/json_configs/carp_friend.json new file mode 100644 index 0000000000000..a5b3ffdf7a47e --- /dev/null +++ b/code/datums/greyscale/json_configs/carp_friend.json @@ -0,0 +1,23 @@ +{ + "base_friend": [ + { + "type": "icon_state", + "icon_state": "base_friend", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "base_friend_mouth", + "blend_mode": "overlay" + } + ], + "base_friend_dead": [ + { + "type": "icon_state", + "icon_state": "base_friend_dead", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/ctf_light_worn.json b/code/datums/greyscale/json_configs/ctf_light_worn.json deleted file mode 100644 index e48762afa67a2..0000000000000 --- a/code/datums/greyscale/json_configs/ctf_light_worn.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "light": [ - { - "type": "icon_state", - "icon_state": "light", - "blend_mode": "overlay" - }, - { - "type": "icon_state", - "icon_state": "light_colours", - "blend_mode": "overlay", - "color_ids": [ 1 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/ctf_standard_worn.json b/code/datums/greyscale/json_configs/ctf_standard_worn.json deleted file mode 100644 index f56ed5d8c064d..0000000000000 --- a/code/datums/greyscale/json_configs/ctf_standard_worn.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "standard": [ - { - "type": "icon_state", - "icon_state": "standard", - "blend_mode": "overlay" - }, - { - "type": "icon_state", - "icon_state": "standard_colours", - "blend_mode": "overlay", - "color_ids": [ 1 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/eth_tunic_worn.json b/code/datums/greyscale/json_configs/eth_tunic_worn.json deleted file mode 100644 index aaa144f0d6ca2..0000000000000 --- a/code/datums/greyscale/json_configs/eth_tunic_worn.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "eth_tunic": [ - { - "type": "icon_state", - "icon_state": "eth_tunic_base_worn", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "eth_tunic_details_worn", - "blend_mode": "overlay" - } - ] -} diff --git a/code/datums/greyscale/json_configs/fancy_coat_worn.json b/code/datums/greyscale/json_configs/fancy_coat_worn.json deleted file mode 100644 index b4bb94f4fefa9..0000000000000 --- a/code/datums/greyscale/json_configs/fancy_coat_worn.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "fancy_coat": [ - { - "type": "icon_state", - "icon_state": "fancy_fur", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "fancy_coat", - "blend_mode": "overlay", - "color_ids": [ 2 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/fancy_hat_worn.json b/code/datums/greyscale/json_configs/fancy_hat_worn.json deleted file mode 100644 index d3268100171bc..0000000000000 --- a/code/datums/greyscale/json_configs/fancy_hat_worn.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "fancy_hat": [ - { - "type": "icon_state", - "icon_state": "fancy_feather", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "fancy_hat", - "blend_mode": "overlay", - "color_ids": [ 2 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/fish_analyzer_worn.json b/code/datums/greyscale/json_configs/fish_analyzer_worn.json new file mode 100644 index 0000000000000..f2cc22bf1b5d7 --- /dev/null +++ b/code/datums/greyscale/json_configs/fish_analyzer_worn.json @@ -0,0 +1,15 @@ +{ + "fish_analyzer": [ + { + "type": "icon_state", + "icon_state": "fish_analyzer_outer", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "fish_analyzer_inner", + "blend_mode": "overlay" + } + ] +} \ No newline at end of file diff --git a/code/datums/greyscale/json_configs/football_armor_worn.json b/code/datums/greyscale/json_configs/football_armor_worn.json deleted file mode 100644 index c928d84195f4e..0000000000000 --- a/code/datums/greyscale/json_configs/football_armor_worn.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "football_armor": [ - { - "type": "icon_state", - "icon_state": "football_armor", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "football_number", - "blend_mode": "overlay" - } - ] -} diff --git a/code/datums/greyscale/json_configs/football_helmet_worn.json b/code/datums/greyscale/json_configs/football_helmet_worn.json deleted file mode 100644 index 5c7aff3c7a986..0000000000000 --- a/code/datums/greyscale/json_configs/football_helmet_worn.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "football_helmet": [ - { - "type": "icon_state", - "icon_state": "football_helmet", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "football_stripe", - "blend_mode": "overlay" - } - ] -} diff --git a/code/datums/greyscale/json_configs/football_suit_worn.json b/code/datums/greyscale/json_configs/football_suit_worn.json deleted file mode 100644 index d1830d6c83a47..0000000000000 --- a/code/datums/greyscale/json_configs/football_suit_worn.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "football_suit": [ - { - "type": "icon_state", - "icon_state": "football_suit", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "football_number", - "blend_mode": "overlay" - } - ] -} diff --git a/code/datums/greyscale/json_configs/glow_shoes.json b/code/datums/greyscale/json_configs/glow_shoes.json new file mode 100644 index 0000000000000..d78fe5b7de0c9 --- /dev/null +++ b/code/datums/greyscale/json_configs/glow_shoes.json @@ -0,0 +1,16 @@ +{ + "glow_shoes": [ + { + "type": "icon_state", + "icon_state": "glow_shoes_back", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "glow_shoes_front", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/heck_helmet_worn.json b/code/datums/greyscale/json_configs/heck_helmet_worn.json deleted file mode 100644 index dd0649f30078d..0000000000000 --- a/code/datums/greyscale/json_configs/heck_helmet_worn.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "hostile_env": [ - { - "type": "icon_state", - "icon_state": "hostile_env_head", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "hostile_env_jaw", - "blend_mode": "overlay", - "color_ids": [ 2 ] - }, - { - "type": "icon_state", - "icon_state": "hostile_env_visor", - "blend_mode": "overlay", - "color_ids": [ 3 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/heck_suit_worn.json b/code/datums/greyscale/json_configs/heck_suit_worn.json deleted file mode 100644 index 72ad7f42b3d92..0000000000000 --- a/code/datums/greyscale/json_configs/heck_suit_worn.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "hostile_env": [ - { - "type": "icon_state", - "icon_state": "hostile_env_plates", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "hostile_env_detail", - "blend_mode": "overlay", - "color_ids": [ 2 ] - } - ], - "hostile_env_t": [ - { - "type": "icon_state", - "icon_state": "hostile_env_plates", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "hostile_env_detail", - "blend_mode": "overlay", - "color_ids": [ 2 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/infinity_scarf_worn.json b/code/datums/greyscale/json_configs/infinity_scarf_worn.json deleted file mode 100644 index 80996df563be7..0000000000000 --- a/code/datums/greyscale/json_configs/infinity_scarf_worn.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "infinity_scarf": [ - { - "type": "icon_state", - "icon_state": "infinity_scarf", - "blend_mode": "overlay", - "color_ids": [ 1 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/jacket_lawyer.json b/code/datums/greyscale/json_configs/jacket_lawyer.json new file mode 100644 index 0000000000000..9593f9c90c3c0 --- /dev/null +++ b/code/datums/greyscale/json_configs/jacket_lawyer.json @@ -0,0 +1,18 @@ +{ + "jacket_lawyer": [ + { + "type": "icon_state", + "icon_state": "suitjacket", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "jacket_lawyer_t": [ + { + "type": "icon_state", + "icon_state": "suitjacket_t", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/jacket_oversized_worn.json b/code/datums/greyscale/json_configs/jacket_oversized_worn.json deleted file mode 100644 index e1aaa566bcd6f..0000000000000 --- a/code/datums/greyscale/json_configs/jacket_oversized_worn.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "jacket_oversized": [ - { - "type": "icon_state", - "icon_state": "jacket_oversized", - "blend_mode": "overlay", - "color_ids": [ 1 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/jeans_worn.json b/code/datums/greyscale/json_configs/jeans_worn.json deleted file mode 100644 index e16642511a36e..0000000000000 --- a/code/datums/greyscale/json_configs/jeans_worn.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "jeans": [ - { - "type": "icon_state", - "icon_state": "buckle", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "belt", - "blend_mode": "overlay", - "color_ids": [ 2 ] - }, - { - "type": "icon_state", - "icon_state": "jeans", - "blend_mode": "overlay", - "color_ids": [ 3 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/jeanshorts_worn.json b/code/datums/greyscale/json_configs/jeanshorts_worn.json deleted file mode 100644 index 2d595b7a3850e..0000000000000 --- a/code/datums/greyscale/json_configs/jeanshorts_worn.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "jeanshorts": [ - { - "type": "icon_state", - "icon_state": "buckle", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "belt", - "blend_mode": "overlay", - "color_ids": [ 2 ] - }, - { - "type": "icon_state", - "icon_state": "jeanshorts", - "blend_mode": "overlay", - "color_ids": [ 3 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/large_scarf.json b/code/datums/greyscale/json_configs/large_scarf.json deleted file mode 100644 index f6804e37831a9..0000000000000 --- a/code/datums/greyscale/json_configs/large_scarf.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "large_scarf": [ - { - "type": "icon_state", - "icon_state": "large_scarf_stripe", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "large_scarf_base", - "blend_mode": "overlay", - "color_ids": [ 2 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/large_scarf_worn.json b/code/datums/greyscale/json_configs/large_scarf_worn.json deleted file mode 100644 index f6804e37831a9..0000000000000 --- a/code/datums/greyscale/json_configs/large_scarf_worn.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "large_scarf": [ - { - "type": "icon_state", - "icon_state": "large_scarf_stripe", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "large_scarf_base", - "blend_mode": "overlay", - "color_ids": [ 2 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/messyworn_shirt_graphic.json b/code/datums/greyscale/json_configs/messyworn_shirt_graphic.json new file mode 100644 index 0000000000000..85950d388e274 --- /dev/null +++ b/code/datums/greyscale/json_configs/messyworn_shirt_graphic.json @@ -0,0 +1,40 @@ +{ + "messyworn_shirt_gamer": [ + { + "type": "icon_state", + "icon_state": "worn_messy", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "nerd_overlay", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "nerd_base", + "blend_mode": "overlay" + } + ], + "messyworn_shirt_ian": [ + { + "type": "icon_state", + "icon_state": "worn_messy", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "ian_overlay", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "ian_base", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/moth_coat_winter_worn.json b/code/datums/greyscale/json_configs/moth_coat_winter_worn.json deleted file mode 100644 index 04dce626ce285..0000000000000 --- a/code/datums/greyscale/json_configs/moth_coat_winter_worn.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "mothcoat_winter": [ - { - "type": "icon_state", - "icon_state": "mothcoat_mantle_top_worn", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "mothcoat_mantle_bottom_worn", - "blend_mode": "overlay", - "color_ids": [ 2 ] - }, - { - "type": "icon_state", - "icon_state": "mothcoat_mantle_details_worn", - "blend_mode": "overlay" - } - ] -} diff --git a/code/datums/greyscale/json_configs/moth_coat_worn.json b/code/datums/greyscale/json_configs/moth_coat_worn.json deleted file mode 100644 index c04046f7f861d..0000000000000 --- a/code/datums/greyscale/json_configs/moth_coat_worn.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "mothcoat": [ - { - "type": "icon_state", - "icon_state": "mothcoat_worn", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "mothcoat_details_worn", - "blend_mode": "overlay" - } - ] -} diff --git a/code/datums/greyscale/json_configs/mutant_organs.json b/code/datums/greyscale/json_configs/mutant_organs.json index 93dd66c9e64cb..2e4aa1da8842f 100644 --- a/code/datums/greyscale/json_configs/mutant_organs.json +++ b/code/datums/greyscale/json_configs/mutant_organs.json @@ -1,4 +1,18 @@ { + "appendix": [ + { + "type": "icon_state", + "icon_state": "appendix", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "appendix_insides", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ], "brain": [ { "type": "icon_state", diff --git a/code/datums/greyscale/json_configs/overalls.json b/code/datums/greyscale/json_configs/overalls.json new file mode 100644 index 0000000000000..c77da142d70e0 --- /dev/null +++ b/code/datums/greyscale/json_configs/overalls.json @@ -0,0 +1,10 @@ +{ + "overalls": [ + { + "type": "icon_state", + "icon_state": "overalls", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/scarf.json b/code/datums/greyscale/json_configs/scarf.json index 7fb7a0685325e..7d1ab784e43ce 100644 --- a/code/datums/greyscale/json_configs/scarf.json +++ b/code/datums/greyscale/json_configs/scarf.json @@ -12,5 +12,19 @@ "blend_mode": "overlay", "color_ids": [ 2 ] } + ], + "large_scarf": [ + { + "type": "icon_state", + "icon_state": "large_scarf_stripe", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "large_scarf_base", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } ] } diff --git a/code/datums/greyscale/json_configs/scarf_worn.json b/code/datums/greyscale/json_configs/scarf_worn.json deleted file mode 100644 index 7fb7a0685325e..0000000000000 --- a/code/datums/greyscale/json_configs/scarf_worn.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "scarf": [ - { - "type": "icon_state", - "icon_state": "scarf_stripe", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "scarf_base", - "blend_mode": "overlay", - "color_ids": [ 2 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/shorts_worn.json b/code/datums/greyscale/json_configs/shorts_worn.json deleted file mode 100644 index 6e9e77d839182..0000000000000 --- a/code/datums/greyscale/json_configs/shorts_worn.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "shorts": [ - { - "type": "icon_state", - "icon_state": "buckle", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "belt", - "blend_mode": "overlay", - "color_ids": [ 2 ] - }, - { - "type": "icon_state", - "icon_state": "shorts", - "blend_mode": "overlay", - "color_ids": [ 3 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/slacks_worn.json b/code/datums/greyscale/json_configs/slacks_worn.json deleted file mode 100644 index 85242d6e235fe..0000000000000 --- a/code/datums/greyscale/json_configs/slacks_worn.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "slacks": [ - { - "type": "icon_state", - "icon_state": "buckle", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "belt", - "blend_mode": "overlay", - "color_ids": [ 2 ] - }, - { - "type": "icon_state", - "icon_state": "slacks", - "blend_mode": "overlay", - "color_ids": [ 3 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/sneakers_orange_worn.json b/code/datums/greyscale/json_configs/sneakers_orange_worn.json deleted file mode 100644 index fb0a07ff1969f..0000000000000 --- a/code/datums/greyscale/json_configs/sneakers_orange_worn.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "sneakers": [ - { - "type": "icon_state", - "icon_state": "sneakers_back", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "sneakers_front", - "blend_mode": "overlay", - "color_ids": [ 2 ] - } - ], - "sneakers_chained": [ - { - "type": "icon_state", - "icon_state": "sneakers_back", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "sneakers_front", - "blend_mode": "overlay", - "color_ids": [ 2 ] - }, - { - "type": "icon_state", - "icon_state": "sneakers_chained", - "blend_mode": "overlay" - } - ] -} diff --git a/code/datums/greyscale/json_configs/sneakers_worn.json b/code/datums/greyscale/json_configs/sneakers_worn.json deleted file mode 100644 index 50a064bb02b66..0000000000000 --- a/code/datums/greyscale/json_configs/sneakers_worn.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "sneakers": [ - { - "type": "icon_state", - "icon_state": "sneakers_back", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "sneakers_front", - "blend_mode": "overlay", - "color_ids": [ 2 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/sundress_worn.json b/code/datums/greyscale/json_configs/sundress_worn.json deleted file mode 100644 index f655a729f7275..0000000000000 --- a/code/datums/greyscale/json_configs/sundress_worn.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "sundress": [ - { - "type": "icon_state", - "icon_state": "sundress_pistil", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "sundress_pedal", - "blend_mode": "overlay", - "color_ids": [ 2 ] - }, - { - "type": "icon_state", - "icon_state": "sundress_base", - "blend_mode": "overlay", - "color_ids": [3 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/suspenders_worn.json b/code/datums/greyscale/json_configs/suspenders_worn.json deleted file mode 100644 index e7ac47305634d..0000000000000 --- a/code/datums/greyscale/json_configs/suspenders_worn.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "suspenders": [ - { - "type": "icon_state", - "icon_state": "suspenders", - "blend_mode": "overlay", - "color_ids": [ 1 ] - } - ], - "suspenders_t": [ - { - "type": "icon_state", - "icon_state": "suspenders_t", - "blend_mode": "overlay", - "color_ids": [ 1 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/sweater_worn.json b/code/datums/greyscale/json_configs/sweater_worn.json deleted file mode 100644 index 031ee45d4a591..0000000000000 --- a/code/datums/greyscale/json_configs/sweater_worn.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "sweater": [ - { - "type": "icon_state", - "icon_state": "sweater", - "blend_mode": "overlay", - "color_ids": [ 1 ] - } - ], - "sweater_t": [ - { - "type": "icon_state", - "icon_state": "sweater_t", - "blend_mode": "overlay", - "color_ids": [ 1 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/tango_worn.json b/code/datums/greyscale/json_configs/tango_worn.json deleted file mode 100644 index 87e9635e72f34..0000000000000 --- a/code/datums/greyscale/json_configs/tango_worn.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "tango": [ - { - "type": "icon_state", - "icon_state": "tango_belt", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "tango_base", - "blend_mode": "overlay", - "color_ids": [ 2 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/ties.json b/code/datums/greyscale/json_configs/ties.json index e9c1225d893b1..7f1e717c5f0ba 100644 --- a/code/datums/greyscale/json_configs/ties.json +++ b/code/datums/greyscale/json_configs/ties.json @@ -14,5 +14,14 @@ "blend_mode": "overlay", "color_ids": [ 1 ] } + ], + "bowtie_greyscale": [ + { + "type": "icon_state", + "icon_state": "bowtie_greyscale", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } ] + } diff --git a/code/datums/greyscale/json_configs/ties_worn.json b/code/datums/greyscale/json_configs/ties_worn.json deleted file mode 100644 index e9c1225d893b1..0000000000000 --- a/code/datums/greyscale/json_configs/ties_worn.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "tie_greyscale_tied": [ - { - "type": "icon_state", - "icon_state": "tie_greyscale_tied", - "blend_mode": "overlay", - "color_ids": [ 1 ] - } - ], - "tie_greyscale_untied": [ - { - "type": "icon_state", - "icon_state": "tie_greyscale_untied", - "blend_mode": "overlay", - "color_ids": [ 1 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/turtleskirt_worn.json b/code/datums/greyscale/json_configs/turtleskirt_worn.json deleted file mode 100644 index f24d5cf6dcdbf..0000000000000 --- a/code/datums/greyscale/json_configs/turtleskirt_worn.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "turtleskirt": [ - { - "type": "icon_state", - "icon_state": "turtleskirt_top", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "turtleskirt_base", - "blend_mode": "overlay", - "color_ids": [ 2 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/waistcoat_worn.json b/code/datums/greyscale/json_configs/waistcoat_worn.json deleted file mode 100644 index bfab0e850bbbe..0000000000000 --- a/code/datums/greyscale/json_configs/waistcoat_worn.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "waistcoat": [ - { - "type": "icon_state", - "icon_state": "waistcoat", - "blend_mode": "overlay", - "color_ids": [ 1 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/wellworn_shirt.json b/code/datums/greyscale/json_configs/wellworn_shirt.json new file mode 100644 index 0000000000000..d58335abc4c2f --- /dev/null +++ b/code/datums/greyscale/json_configs/wellworn_shirt.json @@ -0,0 +1,26 @@ +{ + "wellworn_shirt": [ + { + "type": "icon_state", + "icon_state": "worn_clean", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "wornout_shirt": [ + { + "type": "icon_state", + "icon_state": "worn_out", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "messyworn_shirt": [ + { + "type": "icon_state", + "icon_state": "worn_messy", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/wellworn_shirt_graphic.json b/code/datums/greyscale/json_configs/wellworn_shirt_graphic.json new file mode 100644 index 0000000000000..a9226607f29ad --- /dev/null +++ b/code/datums/greyscale/json_configs/wellworn_shirt_graphic.json @@ -0,0 +1,41 @@ +{ + "wellworn_shirt_gamer": [ + { + "type": "icon_state", + "icon_state": "worn_clean", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "nerd_overlay", + "blend_mode": "overlay", + "color_ids": [ 2 ] + + }, + { + "type": "icon_state", + "icon_state": "nerd_base", + "blend_mode": "overlay" + } + ], + "wellworn_shirt_ian": [ + { + "type": "icon_state", + "icon_state": "worn_clean", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "ian_overlay", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "ian_base", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/wintercoats_hood_worn.json b/code/datums/greyscale/json_configs/wintercoats_hood_worn.json deleted file mode 100644 index d4ea34aa73a96..0000000000000 --- a/code/datums/greyscale/json_configs/wintercoats_hood_worn.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "hood_winter": [ - { - "type": "icon_state", - "icon_state": "top_trim", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "bottom_trim", - "blend_mode": "overlay", - "color_ids": [ 2 ] - }, - { - "type": "icon_state", - "icon_state": "hood_cloth", - "blend_mode": "overlay", - "color_ids": [ 3 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/witch_hat_worn.json b/code/datums/greyscale/json_configs/witch_hat_worn.json deleted file mode 100644 index 80e9c1b645cc5..0000000000000 --- a/code/datums/greyscale/json_configs/witch_hat_worn.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "witch_hat": [ - { - "type": "icon_state", - "icon_state": "witch_hat_base", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "witch_hat_bow", - "blend_mode": "overlay", - "color_ids": [ 2 ] - }, - { - "type": "icon_state", - "icon_state": "witch_hat_charm", - "blend_mode": "overlay", - "color_ids": [ 3 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/wornout_shirt_graphic.json b/code/datums/greyscale/json_configs/wornout_shirt_graphic.json new file mode 100644 index 0000000000000..6ca12b5db6859 --- /dev/null +++ b/code/datums/greyscale/json_configs/wornout_shirt_graphic.json @@ -0,0 +1,40 @@ +{ + "wornout_shirt_gamer": [ + { + "type": "icon_state", + "icon_state": "worn_out", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "nerd_overlay", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "nerd_base", + "blend_mode": "overlay" + } + ], + "wornout_shirt_ian": [ + { + "type": "icon_state", + "icon_state": "worn_out", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "ian_overlay", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "ian_base", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/helper_datums/events.dm b/code/datums/helper_datums/events.dm index 512b5097c07d2..42750c752f1e9 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 ..() @@ -23,8 +20,8 @@ return TRUE return FALSE -// Arguments: event_type as text, proc_holder as datum, proc_name as text -// Returns: New event, null on error. +/// Arguments: event_type as text, proc_holder as datum, proc_name as text +/// Returns: New event, null on error. /datum/events/proc/addEvent(event_type as text, datum/callback/cb) if(!event_type || !cb) return @@ -33,23 +30,20 @@ event += cb return cb -// Arguments: event_type as text, any number of additional arguments to pass to event handler -// Returns: null +/// 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) var/datum/callback/cb = E cb.InvokeAsync(arglist(args.Copy(2))) -// Arguments: event_type as text, E as /datum/event -// Returns: TRUE if event cleared, FALSE on error - +/// Arguments: event_type as text, E as /datum/event +/// Returns: TRUE if event cleared, FALSE on error /datum/events/proc/clearEvent(event_type as text, datum/callback/cb) if(!event_type || !cb) return FALSE var/list/event = LAZYACCESS(events,event_type) event -= cb - qdel(cb) return TRUE diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index 06e2c1e18d65b..c3562aa598732 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -37,6 +37,8 @@ else if(!originmastercommit) msg += "No commit information" + msg += "Running rust-g version [rustg_get_version()]" + return msg.Join("\n") /datum/getrev/proc/GetTestMergeInfo(header = TRUE) diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index a9c69bf223d15..c0217d957742d 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -131,23 +131,13 @@ return var/list/floor_gases = floor_gas_mixture.gases - var/list/gases_to_check = list(/datum/gas/oxygen, /datum/gas/nitrogen, /datum/gas/carbon_dioxide, /datum/gas/plasma) - var/trace_gases - for(var/id in floor_gases) - if(id in gases_to_check) - continue - trace_gases = TRUE - break - - // Can most things breathe? - if(trace_gases) - return - if(!(floor_gases[/datum/gas/oxygen] && floor_gases[/datum/gas/oxygen][MOLES] >= 16)) - return - if(floor_gases[/datum/gas/plasma]) - return - if(floor_gases[/datum/gas/carbon_dioxide] && floor_gases[/datum/gas/carbon_dioxide][MOLES] >= 10) - return + var/static/list/gases_to_check = list( + /datum/gas/oxygen = list(16, 100), + /datum/gas/nitrogen, + /datum/gas/carbon_dioxide = list(0, 10) + ) + if(!check_gases(floor_gases, gases_to_check)) + return FALSE // Aim for goldilocks temperatures and pressure if((floor_gas_mixture.temperature <= 270) || (floor_gas_mixture.temperature >= 360)) diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm index 3828dab28f12f..78ec5f133066c 100644 --- a/code/datums/holocall.dm +++ b/code/datums/holocall.dm @@ -352,7 +352,7 @@ outfit_type = /datum/outfit/syndicate_empty/battlecruiser /datum/preset_holoimage/hivebot - nonhuman_mobtype = /mob/living/simple_animal/hostile/hivebot + nonhuman_mobtype = /mob/living/basic/hivebot /datum/preset_holoimage/ai nonhuman_mobtype = /mob/living/silicon/ai diff --git a/code/datums/id_trim/centcom.dm b/code/datums/id_trim/centcom.dm index 22dba3a07600f..c501722d6a9a4 100644 --- a/code/datums/id_trim/centcom.dm +++ b/code/datums/id_trim/centcom.dm @@ -193,3 +193,9 @@ . = ..() access = list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING) | (SSid_access.get_region_access_list(list(REGION_ALL_STATION)) - ACCESS_CHANGE_IDS) + +/datum/id_trim/centcom/ert/militia + assignment = "Frontier Militia" + +/datum/id_trim/centcom/ert/militia/general + assignment = "Frontier Militia General" diff --git a/code/datums/id_trim/jobs.dm b/code/datums/id_trim/jobs.dm index e4538b450aaf0..6d50347aa3d78 100644 --- a/code/datums/id_trim/jobs.dm +++ b/code/datums/id_trim/jobs.dm @@ -155,6 +155,30 @@ ) job = /datum/job/bartender +/datum/id_trim/job/bitrunner + assignment = "Bitrunner" + trim_state = "trim_bitrunner" + department_color = COLOR_CARGO_BROWN + subdepartment_color = COLOR_CARGO_BROWN + sechud_icon_state = SECHUD_BITRUNNER + minimal_access = list( + ACCESS_BIT_DEN, + ACCESS_CARGO, + ACCESS_MAINT_TUNNELS, + ACCESS_MECH_MINING, + ACCESS_MINERAL_STOREROOM, + ) + extra_access = list( + ACCESS_MINING, + ACCESS_MINING_STATION, + ) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_QM, + ) + job = /datum/job/bitrunner + /datum/id_trim/job/botanist assignment = "Botanist" trim_state = "trim_botanist" @@ -215,6 +239,7 @@ ACCESS_SHIPPING, ) extra_access = list( + ACCESS_BIT_DEN, ACCESS_MINING, ACCESS_MINING_STATION, ) @@ -576,6 +601,7 @@ ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_ARMORY, ACCESS_AUX_BASE, + ACCESS_BIT_DEN, ACCESS_BRIG, ACCESS_BRIG_ENTRANCE, ACCESS_CARGO, @@ -712,6 +738,7 @@ subdepartment_color = COLOR_MEDICAL_BLUE sechud_icon_state = SECHUD_PARAMEDIC minimal_access = list( + ACCESS_BIT_DEN, ACCESS_CARGO, ACCESS_CONSTRUCTION, ACCESS_HYDROPONICS, @@ -739,7 +766,7 @@ assignment = "Prisoner" trim_state = "trim_warden" department_color = COLOR_PRISONER_BLACK - subdepartment_color = COLOR_PRISONER_ORANGE + subdepartment_color = COLOR_PRISONER_BLACK sechud_icon_state = SECHUD_PRISONER template_access = list( ACCESS_CAPTAIN, @@ -810,6 +837,7 @@ sechud_icon_state = SECHUD_QUARTERMASTER minimal_access = list( ACCESS_AUX_BASE, + ACCESS_BIT_DEN, ACCESS_CARGO, ACCESS_MAINT_TUNNELS, ACCESS_MECH_MINING, @@ -904,6 +932,7 @@ extra_access = list( ACCESS_GENETICS, ACCESS_XENOBIOLOGY, + ACCESS_MORGUE_SECURE, ) template_access = list( ACCESS_CAPTAIN, @@ -1007,6 +1036,7 @@ assignment = "Security Officer (Cargo)" subdepartment_color = COLOR_CARGO_BROWN department_access = list( + ACCESS_BIT_DEN, ACCESS_CARGO, ACCESS_MINING, ACCESS_SHIPPING, @@ -1075,6 +1105,7 @@ ACCESS_MINING_STATION, ) extra_access = list( + ACCESS_BIT_DEN, ACCESS_MAINT_TUNNELS, ) template_access = list( diff --git a/code/datums/id_trim/outfits.dm b/code/datums/id_trim/outfits.dm index 4bb9365ebc450..2a06434ecdb86 100644 --- a/code/datums/id_trim/outfits.dm +++ b/code/datums/id_trim/outfits.dm @@ -50,5 +50,27 @@ /// Trim for Bounty Hunters NOT hired by centcom. (?) /datum/id_trim/bounty_hunter assignment = "Bounty Hunter" + trim_state = "trim_deathcommando" department_color = COLOR_PRISONER_ORANGE subdepartment_color = COLOR_PRISONER_BLACK + + access = list(ACCESS_HUNTER) + +/// Trim for player controlled avatars in the Virtual Domain. +/datum/id_trim/bit_avatar + assignment = "Bit Avatar" + trim_state = "trim_bitavatar" + department_color = COLOR_BLACK + subdepartment_color = COLOR_GREEN + +/// Trim for cyber police in the Virtual Domain. +/datum/id_trim/cyber_police + assignment = "Cyber Police" + trim_state = "trim_deathcommando" + department_color = COLOR_BLACK + subdepartment_color = COLOR_GREEN + +/datum/id_trim/cyber_police/New() + . = ..() + + access |= SSid_access.get_region_access_list(list(REGION_ALL_GLOBAL)) diff --git a/code/datums/id_trim/syndicate.dm b/code/datums/id_trim/syndicate.dm index 00293346a34f2..7975ed7b66a24 100644 --- a/code/datums/id_trim/syndicate.dm +++ b/code/datums/id_trim/syndicate.dm @@ -28,6 +28,20 @@ sechud_icon_state = SECHUD_SYNDICATE_INTERDYNE_HEAD access = list(ACCESS_SYNDICATE, ACCESS_ROBOTICS, ACCESS_SURGERY) +/// Trim for the space IRS agents (why are they syndie access? I wouldn't worry about it.) +/datum/id_trim/syndicom/irs + assignment = "Internal Revenue Service Agent" + trim_state = "trim_securityofficer" + department_color = COLOR_CENTCOM_BLUE + subdepartment_color = COLOR_COMMAND_BLUE + sechud_icon_state = SECHUD_DEATH_COMMANDO + access = list(ACCESS_SYNDICATE, ACCESS_MAINT_TUNNELS) + +/datum/id_trim/syndicom/irs/auditor + assignment = "Internal Revenue Service Head Auditor" + trim_state = "trim_quartermaster" + sechud_icon_state = SECHUD_QUARTERMASTER + /// Trim for Syndicate mobs, outfits and corpses. /datum/id_trim/syndicom/captain assignment = "Syndicate Ship Captain" diff --git a/code/datums/job_configs/_job_configs.dm b/code/datums/job_configs/_job_configs.dm new file mode 100644 index 0000000000000..84e2cb4ec0a41 --- /dev/null +++ b/code/datums/job_configs/_job_configs.dm @@ -0,0 +1,42 @@ +// This contains the types of configurations that can be set for each job. +// Just add a new datum (and add the define name to __defines/jobs.dm) and the applicable procs and you should be good to go. +// Remember, there's a verb in the Server tab called "Generate Job Configuration" that will generate the config file for you. +// You don't need to waste time copy-pasting values if you add a datum here. Just use that verb and it'll do it for you. +// Use the verb. Use the verb. It's your life you're wasting otherwise. + +/// Lightweight datum simply used to store the applicable config type for each job such that the whole system is a tad bit more flexible. +/datum/job_config_type + /// The name that will be used in the config file. This is also the key for the accessing the singleton. + /// Use the JOB_CONFIG_* defines in __defines/jobs.dm to make sure you don't typo. + var/name = "DEFAULT" + + /// The name of the variable on the job datum that we will be accessing. + var/datum_var_name = "type" // we use this as the default because A) it always exists and B) if we try and modify it, we runtime. perfect for what we need + +/datum/job_config_type/New() + . = ..() + if(PERFORM_ALL_TESTS(focus_only/missing_job_datum_variables)) + var/datum/job/test_occupation = new() + if(!test_occupation.vars.Find(datum_var_name)) + stack_trace("'[datum_var_name]' is not a valid variable on /datum/job!") + qdel(test_occupation) + +/// Simply gets the value of the config type for a given job. There can be overrides for special instances on subtypes. +/datum/job_config_type/proc/get_current_value(datum/job/occupation) + return occupation.vars[datum_var_name] + +/// Validate the value of the config type for a given job. There can be overrides for special instances on subtypes. +/// Isn't meant for in-depth logic, just bare-bones sanity checks. Like: is this number a number? Is this string a string? Any sanity thing involving a specific job datum goes in set_current_value. +/// Will return TRUE if the value is valid, FALSE if it is not. +/datum/job_config_type/proc/validate_value(value) + SHOULD_CALL_PARENT(FALSE) + stack_trace("Attempted to validate value for the default job config! You're doing something wrong!!") + return FALSE + +/// This is the proc that we actually invoke to set the config-based values for each job. Is also intended to handle all in-depth logic checks pertient to the job datum itself. +/// Return TRUE if the value was set successfully (or if expected behavior did indeed occur), FALSE if it was not. +/datum/job_config_type/proc/set_current_value(datum/job/occupation, value) + if(!validate_value(value)) + return FALSE + occupation.vars[datum_var_name] = value + return TRUE diff --git a/code/datums/job_configs/default_positions.dm b/code/datums/job_configs/default_positions.dm new file mode 100644 index 0000000000000..67f2c2bfbfa96 --- /dev/null +++ b/code/datums/job_configs/default_positions.dm @@ -0,0 +1,10 @@ +/// The number of positions a job can have at any given time. +/datum/job_config_type/default_positions + name = JOB_CONFIG_TOTAL_POSITIONS + datum_var_name = "total_positions" + +/datum/job_config_type/default_positions/validate_value(value) + if(isnum(value)) + return TRUE + return FALSE + diff --git a/code/datums/job_configs/playtime_requirements.dm b/code/datums/job_configs/playtime_requirements.dm new file mode 100644 index 0000000000000..cb129792d4179 --- /dev/null +++ b/code/datums/job_configs/playtime_requirements.dm @@ -0,0 +1,9 @@ +/// The amount of playtime required to join a job (minutes). +/datum/job_config_type/playtime_requirements + name = JOB_CONFIG_PLAYTIME_REQUIREMENTS + datum_var_name = "exp_requirements" + +/datum/job_config_type/playtime_requirements/validate_value(value) + if(isnum(value)) + return TRUE + return FALSE diff --git a/code/datums/job_configs/required_account_age.dm b/code/datums/job_configs/required_account_age.dm new file mode 100644 index 0000000000000..46d7a0e6489e5 --- /dev/null +++ b/code/datums/job_configs/required_account_age.dm @@ -0,0 +1,10 @@ +/// The amount of time required to have an account to join a job (days). +/datum/job_config_type/required_account_age + name = JOB_CONFIG_REQUIRED_ACCOUNT_AGE + datum_var_name = "minimal_player_age" + +/datum/job_config_type/required_account_age/validate_value(value) + if(isnum(value)) + return TRUE + return FALSE + diff --git a/code/datums/job_configs/required_character_age.dm b/code/datums/job_configs/required_character_age.dm new file mode 100644 index 0000000000000..3ac22301f40fb --- /dev/null +++ b/code/datums/job_configs/required_character_age.dm @@ -0,0 +1,35 @@ +/// The required age a character must be to join a job (which is in years). +/datum/job_config_type/required_character_age + name = JOB_CONFIG_REQUIRED_CHARACTER_AGE + datum_var_name = "required_character_age" + +/datum/job_config_type/required_character_age/get_current_value(datum/job/occupation) + . = ..() + + if(isnum(.)) + return . + + return 0 + +/datum/job_config_type/required_character_age/validate_value(value) + if(isnum(value)) + return TRUE + return FALSE + +/datum/job_config_type/required_character_age/set_current_value(datum/job/occupation, value) + if(!validate_value(value)) + return FALSE + + if(value > AGE_MIN && value < AGE_MAX) + occupation.required_character_age = value + return TRUE + + if(value == 0) + occupation.required_character_age = null // they're opting out of the codebase-set required character age, so set it to null since that's what the code needs to ignore it + return TRUE + + var/error_string = "Invalid value for [name] for [occupation.title] (with config tag [occupation.config_tag])! Value must be between [AGE_MIN] and [AGE_MAX]!" + error_string += "\n[occupation.title]'s required age will remain the default value of [occupation.required_character_age || "0 (OFF)"]!" + log_config(error_string) + log_job_debug(error_string) + return FALSE diff --git a/code/datums/job_configs/starting_positions.dm b/code/datums/job_configs/starting_positions.dm new file mode 100644 index 0000000000000..4d9caa9a8fa5f --- /dev/null +++ b/code/datums/job_configs/starting_positions.dm @@ -0,0 +1,10 @@ +/// The number of positions a job can have at the start of the round. +/datum/job_config_type/starting_positions + name = JOB_CONFIG_SPAWN_POSITIONS + datum_var_name = "spawn_positions" + +/datum/job_config_type/starting_positions/validate_value(value) + if(isnum(value)) + return TRUE + return FALSE + diff --git a/code/datums/keybinding/living.dm b/code/datums/keybinding/living.dm index 0bfbad40757e1..390fd427f5ff4 100644 --- a/code/datums/keybinding/living.dm +++ b/code/datums/keybinding/living.dm @@ -117,3 +117,38 @@ return var/mob/living/user_mob = user.mob user_mob.set_combat_mode(FALSE, silent = FALSE) + +/datum/keybinding/living/toggle_move_intent + hotkey_keys = list("C") + name = "toggle_move_intent" + full_name = "Hold to toggle move intent" + description = "Held down to cycle to the other move intent, release to cycle back" + keybind_signal = COMSIG_KB_LIVING_TOGGLEMOVEINTENT_DOWN + +/datum/keybinding/living/toggle_move_intent/down(client/user) + . = ..() + if(.) + return + var/mob/living/M = user.mob + M.toggle_move_intent() + return TRUE + +/datum/keybinding/living/toggle_move_intent/up(client/user) + var/mob/living/M = user.mob + M.toggle_move_intent() + return TRUE + +/datum/keybinding/living/toggle_move_intent_alternative + hotkey_keys = list("Unbound") + name = "toggle_move_intent_alt" + full_name = "press to cycle move intent" + description = "Pressing this cycle to the opposite move intent, does not cycle back" + keybind_signal = COMSIG_KB_LIVING_TOGGLEMOVEINTENTALT_DOWN + +/datum/keybinding/living/toggle_move_intent_alternative/down(client/user) + . = ..() + if(.) + return + var/mob/living/M = user.mob + M.toggle_move_intent() + return TRUE diff --git a/code/datums/keybinding/mob.dm b/code/datums/keybinding/mob.dm index dd6d7e4582be8..def4ec36fb2c1 100644 --- a/code/datums/keybinding/mob.dm +++ b/code/datums/keybinding/mob.dm @@ -71,41 +71,6 @@ user.mob.dropItemToGround(I) return TRUE -/datum/keybinding/mob/toggle_move_intent - hotkey_keys = list("C") - name = "toggle_move_intent" - full_name = "Hold to toggle move intent" - description = "Held down to cycle to the other move intent, release to cycle back" - keybind_signal = COMSIG_KB_MOB_TOGGLEMOVEINTENT_DOWN - -/datum/keybinding/mob/toggle_move_intent/down(client/user) - . = ..() - if(.) - return - var/mob/M = user.mob - M.toggle_move_intent() - return TRUE - -/datum/keybinding/mob/toggle_move_intent/up(client/user) - var/mob/M = user.mob - M.toggle_move_intent() - return TRUE - -/datum/keybinding/mob/toggle_move_intent_alternative - hotkey_keys = list("Unbound") - name = "toggle_move_intent_alt" - full_name = "press to cycle move intent" - description = "Pressing this cycle to the opposite move intent, does not cycle back" - keybind_signal = COMSIG_KB_MOB_TOGGLEMOVEINTENTALT_DOWN - -/datum/keybinding/mob/toggle_move_intent_alternative/down(client/user) - . = ..() - if(.) - return - var/mob/M = user.mob - M.toggle_move_intent() - return TRUE - /datum/keybinding/mob/target/down(client/user) . = ..() if(.) diff --git a/code/datums/lazy_template.dm b/code/datums/lazy_template.dm index af6df50e96f8c..e3006e13056df 100644 --- a/code/datums/lazy_template.dm +++ b/code/datums/lazy_template.dm @@ -7,11 +7,12 @@ /// If this is true each load will increment an index keyed to the type and it will load [map_name]_[index] var/list/datum/turf_reservation/reservations = list() var/uses_multiple_allocations = FALSE + /// Key to identify this template - used in caching var/key + /// Directory of maps to prefix to the filename var/map_dir = "_maps/templates/lazy_templates" + /// The filename (without extension) of the map to load var/map_name - var/map_width - var/map_height /datum/lazy_template/New() reservations = list() @@ -46,25 +47,67 @@ if(!load_path || !fexists(load_path)) CRASH("lazy template [type] has an invalid load_path: '[load_path]', check directory and map name!") - var/datum/map_template/loading = new(path = load_path, cache = TRUE) - if(!loading.cached_map) + var/datum/parsed_map/parsed_template = load_map( + file(load_path), + measure_only = TRUE, + ) + if(isnull(parsed_template.parsed_bounds)) CRASH("Failed to cache lazy template for loading: '[key]'") - var/datum/turf_reservation/reservation = SSmapping.RequestBlockReservation(loading.width, loading.height) + var/width = parsed_template.parsed_bounds[MAP_MAXX] - parsed_template.parsed_bounds[MAP_MINX] + 1 + var/height = parsed_template.parsed_bounds[MAP_MAXY] - parsed_template.parsed_bounds[MAP_MINY] + 1 + var/datum/turf_reservation/reservation = SSmapping.request_turf_block_reservation( + width, + height, + parsed_template.parsed_bounds[MAP_MAXZ], + ) if(!reservation) CRASH("Failed to reserve a block for lazy template: '[key]'") - if(!loading.load(coords2turf(reservation.bottom_left_coords))) - CRASH("Failed to load lazy template: '[key]'") - reservations += reservation + // lists kept for overall loading + var/list/loaded_atom_movables = list() + var/list/loaded_turfs = list() + var/list/loaded_areas = list() + + var/list/obj/structure/cable/loaded_cables = list() + var/list/obj/machinery/atmospherics/loaded_atmospherics = list() + + for(var/z_idx in parsed_template.parsed_bounds[MAP_MAXZ] to 1 step -1) + var/turf/bottom_left = reservation.bottom_left_turfs[z_idx] + var/turf/top_right = reservation.top_right_turfs[z_idx] + + load_map( + file(load_path), + bottom_left.x, + bottom_left.y, + bottom_left.z, + z_upper = z_idx, + z_lower = z_idx, + ) + for(var/turf/turf as anything in block(bottom_left, top_right)) + loaded_turfs += turf + loaded_areas |= get_area(turf) + // atoms can actually be in the contents of two or more turfs based on its icon/bound size + // see https://www.byond.com/docs/ref/index.html#/atom/var/contents + for(var/thing in (turf.get_all_contents() - turf)) + if(istype(thing, /obj/structure/cable)) + loaded_cables += thing + else if(istype(thing, /obj/machinery/atmospherics)) + loaded_atmospherics += thing + loaded_atom_movables |= thing + + SSatoms.InitializeAtoms(loaded_areas + loaded_atom_movables + loaded_turfs) + SSmachines.setup_template_powernets(loaded_cables) + SSair.setup_template_machinery(loaded_atmospherics) + + SEND_SIGNAL(src, COMSIG_LAZY_TEMPLATE_LOADED, loaded_atom_movables, loaded_turfs, loaded_areas) + reservations += reservation return reservation /datum/lazy_template/nukie_base key = LAZY_TEMPLATE_KEY_NUKIEBASE map_name = "nukie_base" - map_width = 89 - map_height = 100 /datum/lazy_template/wizard_dem key = LAZY_TEMPLATE_KEY_WIZARDDEN @@ -77,3 +120,7 @@ /datum/lazy_template/abductor_ship key = LAZY_TEMPLATE_KEY_ABDUCTOR_SHIPS map_name = "abductor_ships" + +/datum/lazy_template/heretic_sacrifice_room + key = LAZY_TEMPLATE_KEY_HERETIC_SACRIFICE + map_name = "heretic_sacrifice" diff --git a/code/datums/looping_sounds/_looping_sound.dm b/code/datums/looping_sounds/_looping_sound.dm index 449f55ae660fb..54185efdb8dda 100644 --- a/code/datums/looping_sounds/_looping_sound.dm +++ b/code/datums/looping_sounds/_looping_sound.dm @@ -52,8 +52,9 @@ var/loop_started = FALSE /// If we're using cut_mid, this is the list we cut from var/list/cut_list - /// The index of the current song we're playing in the mid_sounds list, only used if in_order is used - var/audio_index = 1 + ///The index of the current song we're playing in the mid_sounds list, only used if in_order is used + ///This is immediately set to 1, so we start the index at 0 + var/audio_index = 0 // Args /// Do we skip the starting sounds? diff --git a/code/datums/map_config.dm b/code/datums/map_config.dm index 9a4bce61e921f..4c071cbc2bb31 100644 --- a/code/datums/map_config.dm +++ b/code/datums/map_config.dm @@ -14,7 +14,7 @@ var/votable = FALSE // Config actually from the JSON - should default to Meta - var/map_name = "Meta Station" + var/map_name = "MetaStation" var/map_path = "map_files/MetaStation" var/map_file = "MetaStation.dmm" @@ -44,6 +44,9 @@ /// List of unit tests that are skipped when running this map var/list/skipped_tests + /// Boolean that tells SSmapping to load all away missions in the codebase. + var/load_all_away_missions = FALSE + /** * Proc that simply loads the default map config, which should always be functional. */ @@ -183,6 +186,9 @@ if ("blacklist_file" in json) blacklist_file = json["blacklist_file"] + if ("load_all_away_missions" in json) + load_all_away_missions = json["load_all_away_missions"] + allow_custom_shuttles = json["allow_custom_shuttles"] != FALSE if ("job_changes" in json) diff --git a/code/datums/mapgen/CaveGenerator.dm b/code/datums/mapgen/CaveGenerator.dm index 8598a2319dfb8..fa5bae9186895 100644 --- a/code/datums/mapgen/CaveGenerator.dm +++ b/code/datums/mapgen/CaveGenerator.dm @@ -51,14 +51,26 @@ /datum/map_generator/cave_generator/New() . = ..() if(!weighted_mob_spawn_list) - weighted_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) + weighted_mob_spawn_list = list( + /mob/living/basic/mining/basilisk = 4, + /mob/living/basic/mining/goldgrub = 1, + /mob/living/basic/mining/goliath/ancient = 5, + /mob/living/basic/mining/hivelord = 3, + ) mob_spawn_list = expand_weights(weighted_mob_spawn_list) mob_spawn_no_mega_list = expand_weights(weighted_mob_spawn_list - SPAWN_MEGAFAUNA) if(!weighted_megafauna_spawn_list) weighted_megafauna_spawn_list = GLOB.megafauna_spawn_list megafauna_spawn_list = expand_weights(weighted_megafauna_spawn_list) if(!weighted_flora_spawn_list) - weighted_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) + weighted_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, + ) flora_spawn_list = expand_weights(weighted_flora_spawn_list) if(!weighted_feature_spawn_list) weighted_feature_spawn_list = list(/obj/structure/geyser/random = 1) @@ -75,14 +87,7 @@ 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) - var/megas_allowed = (generate_in.area_flags & MEGAFAUNA_SPAWN_ALLOWED) && length(megafauna_spawn_list) - - for(var/i in turfs) //Go through all the turfs and generate them - var/turf/gen_turf = i + for(var/turf/gen_turf as anything in turfs) //Go through all the turfs and generate them 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) @@ -94,8 +99,21 @@ if(gen_turf.turf_flags & NO_RUINS) new_turf.turf_flags |= NO_RUINS - if(closed)//Open turfs have some special behavior related to spawning flora and mobs. - CHECK_TICK + var/message = "[name] terrain generation finished in [(REALTIMEOFDAY - start_time)/10]s!" + to_chat(world, span_boldannounce("[message]")) + log_world(message) + +/datum/map_generator/cave_generator/populate_terrain(list/turfs, area/generate_in) + // 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) + var/megas_allowed = (generate_in.area_flags & MEGAFAUNA_SPAWN_ALLOWED) && length(megafauna_spawn_list) + + var/start_time = REALTIMEOFDAY + + for(var/turf/target_turf as anything in turfs) + if(!(target_turf.type in open_turf_types)) //only put stuff on open turfs we generated, so closed walls and rivers and stuff are skipped continue // If we've spawned something yet @@ -105,31 +123,35 @@ //FLORA SPAWNING HERE if(flora_allowed && prob(flora_spawn_chance)) var/flora_type = pick(flora_spawn_list) - new flora_type(new_turf) + new flora_type(target_turf) spawned_something = TRUE //FEATURE SPAWNING HERE - if(feature_allowed && prob(feature_spawn_chance)) + //we may have generated something from the flora list on the target turf, so let's not place + //a feature here if that's the case (because it would look stupid) + if(feature_allowed && !spawned_something && prob(feature_spawn_chance)) var/can_spawn = TRUE var/atom/picked_feature = pick(feature_spawn_list) - for(var/obj/structure/existing_feature in range(7, new_turf)) + for(var/obj/structure/existing_feature in range(7, target_turf)) if(istype(existing_feature, picked_feature)) can_spawn = FALSE break if(can_spawn) - new picked_feature(new_turf) + new picked_feature(target_turf) spawned_something = TRUE //MOB SPAWNING HERE if(mobs_allowed && !spawned_something && prob(mob_spawn_chance)) var/atom/picked_mob = pick(mob_spawn_list) + var/is_megafauna = FALSE if(picked_mob == SPAWN_MEGAFAUNA) if(megas_allowed) //this is danger. it's boss time. picked_mob = pick(megafauna_spawn_list) + is_megafauna = TRUE else //this is not danger, don't spawn a boss, spawn something else picked_mob = pick(mob_spawn_no_mega_list) //What if we used 100% of the brain...and did something (slightly) less shit than a while loop? @@ -137,18 +159,22 @@ // prevents tendrils spawning in each other's collapse range if(ispath(picked_mob, /obj/structure/spawner/lavaland)) - for(var/obj/structure/spawner/lavaland/spawn_blocker in range(2, new_turf)) + for(var/obj/structure/spawner/lavaland/spawn_blocker in range(2, target_turf)) can_spawn = FALSE break - //if the random is a standard mob, avoid spawning if there's another one within 12 tiles - else if(isminingpath(picked_mob)) - for(var/mob/living/mob_blocker in range(12, new_turf)) + // if the random is not a tendril (hopefully meaning it is a mob), avoid spawning if there's another one within 12 tiles + else + var/list/things_in_range = range(12, target_turf) + for(var/mob/living/mob_blocker in things_in_range) if(ismining(mob_blocker)) can_spawn = FALSE break + // Also block spawns if there's a random lavaland mob spawner nearby and it's not a mega + if(!is_megafauna) + can_spawn = can_spawn && !(locate(/obj/effect/spawner/random/lavaland_mob) in things_in_range) //if there's a megafauna within standard view don't spawn anything at all (This isn't really consistent, I don't know why we do this. you do you tho) if(can_spawn) - for(var/mob/living/simple_animal/hostile/megafauna/found_fauna in range(7, new_turf)) + for(var/mob/living/simple_animal/hostile/megafauna/found_fauna in range(7, target_turf)) can_spawn = FALSE break @@ -157,10 +183,10 @@ weighted_megafauna_spawn_list.Remove(picked_mob) megafauna_spawn_list = expand_weights(weighted_megafauna_spawn_list) megas_allowed = megas_allowed && length(megafauna_spawn_list) - new picked_mob(new_turf) + new picked_mob(target_turf) spawned_something = TRUE CHECK_TICK - var/message = "[name] finished in [(REALTIMEOFDAY - start_time)/10]s!" + var/message = "[name] terrain population finished in [(REALTIMEOFDAY - start_time)/10]s!" to_chat(world, span_boldannounce("[message]")) log_world(message) diff --git a/code/datums/mapgen/Cavegens/IcemoonCaves.dm b/code/datums/mapgen/Cavegens/IcemoonCaves.dm index 79f97257fff29..7d7437ccda6c8 100644 --- a/code/datums/mapgen/Cavegens/IcemoonCaves.dm +++ b/code/datums/mapgen/Cavegens/IcemoonCaves.dm @@ -3,13 +3,30 @@ weighted_closed_turf_types = list(/turf/closed/mineral/random/snow = 1) - weighted_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) - weighted_flora_spawn_list = list(/obj/structure/flora/tree/pine/style_random = 2, /obj/structure/flora/rock/icy/style_random = 2, /obj/structure/flora/rock/pile/icy/style_random = 2, /obj/structure/flora/grass/both/style_random = 6, /obj/structure/flora/ash/chilly = 2) + weighted_mob_spawn_list = list( + /mob/living/basic/mining/legion/snow = 50, + /mob/living/basic/mining/lobstrosity = 15, + /mob/living/basic/mining/goldgrub = 10, + /mob/living/simple_animal/hostile/asteroid/polarbear = 30, + /mob/living/simple_animal/hostile/asteroid/wolf = 50, + /obj/structure/spawner/ice_moon = 3, + /obj/structure/spawner/ice_moon/polarbear = 3, + ) + weighted_flora_spawn_list = list( + /obj/structure/flora/ash/chilly = 2, + /obj/structure/flora/grass/both/style_random = 6, + /obj/structure/flora/rock/icy/style_random = 2, + /obj/structure/flora/rock/pile/icy/style_random = 2, + /obj/structure/flora/tree/pine/style_random = 2, + ) ///Note that this spawn list is also in the lavaland generator - weighted_feature_spawn_list = list(/obj/structure/geyser/wittel = 10, /obj/structure/geyser/random = 2, /obj/structure/geyser/plasma_oxide = 10, /obj/structure/geyser/protozine = 10, /obj/structure/geyser/hollowwater = 10) + weighted_feature_spawn_list = list( + /obj/structure/geyser/hollowwater = 10, + /obj/structure/geyser/plasma_oxide = 10, + /obj/structure/geyser/protozine = 10, + /obj/structure/geyser/random = 2, + /obj/structure/geyser/wittel = 10, + ) /datum/map_generator/cave_generator/icemoon/surface flora_spawn_chance = 4 @@ -19,13 +36,42 @@ death_limit = 4 smoothing_iterations = 10 +/// Surface snow generator variant for forested station trait, WITH FORESTSSSS +/datum/map_generator/cave_generator/icemoon/surface/forested + weighted_open_turf_types = list(/turf/open/misc/asteroid/snow/icemoon = 1) + initial_closed_chance = 10 + + flora_spawn_chance = 80 + weighted_flora_spawn_list = list( + /obj/structure/flora/tree/pine/style_random = 18, + /obj/structure/flora/tree/dead/style_random = 1, + /obj/structure/flora/tree/stump = 1, + /obj/structure/flora/rock/icy/style_random = 1, + /obj/structure/flora/rock/pile/icy/style_random = 3, + /obj/structure/flora/grass/both/style_random = 50, + /obj/structure/flora/bush/flowers_pp/style_random = 25, + /obj/structure/flora/ash/chilly = 1, + ) + + mob_spawn_chance = 0.2 + weighted_mob_spawn_list = list(/mob/living/basic/deer/ice = 99, /mob/living/basic/tree = 1) + /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 weighted_closed_turf_types = list(/turf/closed/mineral/random/snow/underground = 1) - weighted_mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/ice_demon = 100, /obj/structure/spawner/ice_moon/demonic_portal = 6, \ - /mob/living/simple_animal/hostile/asteroid/ice_whelp = 60, /obj/structure/spawner/ice_moon/demonic_portal/ice_whelp = 6, \ - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow = 100, /obj/structure/spawner/ice_moon/demonic_portal/snowlegion = 6, \ - SPAWN_MEGAFAUNA = 1) + weighted_mob_spawn_list = list( + SPAWN_MEGAFAUNA = 1, + /mob/living/basic/mining/ice_whelp = 60, + /mob/living/basic/mining/legion/snow = 100, + /mob/living/simple_animal/hostile/asteroid/ice_demon = 100, + /obj/structure/spawner/ice_moon/demonic_portal = 6, + /obj/structure/spawner/ice_moon/demonic_portal/snowlegion = 6, + /obj/structure/spawner/ice_moon/demonic_portal/ice_whelp = 6, + ) weighted_megafauna_spawn_list = list(/mob/living/simple_animal/hostile/megafauna/colossus = 1) - weighted_flora_spawn_list = list(/obj/structure/flora/rock/icy/style_random = 6, /obj/structure/flora/rock/pile/icy/style_random = 6, /obj/structure/flora/ash/chilly = 1) + weighted_flora_spawn_list = list( + /obj/structure/flora/rock/icy/style_random = 6, + /obj/structure/flora/rock/pile/icy/style_random = 6, + /obj/structure/flora/ash/chilly = 1, + ) diff --git a/code/datums/mapgen/Cavegens/LavalandGenerator.dm b/code/datums/mapgen/Cavegens/LavalandGenerator.dm index 3c21949ce0cc6..6f8aa7ed1bbfd 100644 --- a/code/datums/mapgen/Cavegens/LavalandGenerator.dm +++ b/code/datums/mapgen/Cavegens/LavalandGenerator.dm @@ -3,36 +3,36 @@ weighted_closed_turf_types = list(/turf/closed/mineral/random/volcanic = 1) weighted_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 = 2, - /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, + /obj/effect/spawner/random/lavaland_mob/goliath = 50, + /obj/effect/spawner/random/lavaland_mob/legion = 30, + /obj/effect/spawner/random/lavaland_mob/watcher = 40, /mob/living/basic/mining/bileworm = 20, + /mob/living/basic/mining/brimdemon = 20, + /mob/living/basic/mining/lobstrosity/lava = 20, + /mob/living/basic/mining/goldgrub = 10, + /obj/structure/spawner/lavaland = 2, + /obj/structure/spawner/lavaland/goliath = 3, + /obj/structure/spawner/lavaland/legion = 3, ) weighted_flora_spawn_list = list( - /obj/structure/flora/ash/leaf_shroom = 2, + /obj/structure/flora/ash/cacti = 1, /obj/structure/flora/ash/cap_shroom = 2, + /obj/structure/flora/ash/fireblossom = 2, + /obj/structure/flora/ash/leaf_shroom = 2, + /obj/structure/flora/ash/seraka = 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, - /obj/structure/flora/ash/fireblossom = 2, ) ///Note that this spawn list is also in the icemoon generator weighted_feature_spawn_list = list( - /obj/structure/geyser/wittel = 10, - /obj/structure/geyser/random = 2, + /obj/structure/geyser/hollowwater = 10, /obj/structure/geyser/plasma_oxide = 10, /obj/structure/geyser/protozine = 10, - /obj/structure/geyser/hollowwater = 10, + /obj/structure/geyser/random = 2, + /obj/structure/geyser/wittel = 10, ) initial_closed_chance = 45 diff --git a/code/datums/mapgen/_MapGenerator.dm b/code/datums/mapgen/_MapGenerator.dm index dbe7cf5ba9493..cecc0c65d1ba4 100644 --- a/code/datums/mapgen/_MapGenerator.dm +++ b/code/datums/mapgen/_MapGenerator.dm @@ -4,3 +4,7 @@ ///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, area/generate_in) return + +/// Populate terrain with flora, fauna, features and basically everything that isn't a turf +/datum/map_generator/proc/populate_terrain(list/turfs, area/generate_in) + return diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm index cac74888ac4c5..93746db7694b7 100644 --- a/code/datums/martial/boxing.dm +++ b/code/datums/martial/boxing.dm @@ -60,6 +60,15 @@ /obj/item/clothing/gloves/boxing var/datum/martial_art/boxing/style = new +/obj/item/clothing/gloves/boxing/Initialize(mapload) + . = ..() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/extendohand_l, /datum/crafting_recipe/extendohand_r) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/clothing/gloves/boxing/equipped(mob/user, slot) ..() // boxing requires human diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index c982f0e086c37..e5b959b340f50 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -80,9 +80,21 @@ return TRUE /datum/martial_art/cqc/proc/Kick(mob/living/attacker, mob/living/defender) - if(!can_use(attacker)) + if(!can_use(attacker) || defender.stat != CONSCIOUS) return FALSE - if(!defender.stat || !defender.IsParalyzed()) + + if(defender.body_position == LYING_DOWN && !defender.IsUnconscious() && defender.getStaminaLoss() >= 100) + log_combat(attacker, defender, "knocked out (Head kick)(CQC)") + defender.visible_message(span_danger("[attacker] kicks [defender]'s head, knocking [defender.p_them()] out!"), \ + span_userdanger("You're knocked unconscious by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, attacker) + to_chat(attacker, span_danger("You kick [defender]'s head, knocking [defender.p_them()] out!")) + playsound(get_turf(attacker), 'sound/weapons/genhit1.ogg', 50, TRUE, -1) + + var/helmet_protection = defender.run_armor_check(BODY_ZONE_HEAD, MELEE) + defender.apply_effect(20 SECONDS, EFFECT_KNOCKDOWN, helmet_protection) + defender.apply_effect(10 SECONDS, EFFECT_UNCONSCIOUS, helmet_protection) + defender.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15, 150) + else defender.visible_message(span_danger("[attacker] kicks [defender] back!"), \ span_userdanger("You're kicked back by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, attacker) to_chat(attacker, span_danger("You kick [defender] back!")) @@ -90,17 +102,9 @@ var/atom/throw_target = get_edge_target_turf(defender, attacker.dir) defender.throw_at(throw_target, 1, 14, attacker) defender.apply_damage(10, attacker.get_attack_type()) + defender.adjustStaminaLoss(45) log_combat(attacker, defender, "kicked (CQC)") - . = TRUE - if(defender.IsParalyzed() && !defender.stat) - log_combat(attacker, defender, "knocked out (Head kick)(CQC)") - defender.visible_message(span_danger("[attacker] kicks [defender]'s head, knocking [defender.p_them()] out!"), \ - span_userdanger("You're knocked unconscious by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, attacker) - to_chat(attacker, span_danger("You kick [defender]'s head, knocking [defender.p_them()] out!")) - playsound(get_turf(attacker), 'sound/weapons/genhit1.ogg', 50, TRUE, -1) - defender.SetSleeping(30 SECONDS) - defender.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15, 150) - . = TRUE + . = TRUE /datum/martial_art/cqc/proc/Pressure(mob/living/attacker, mob/living/defender) if(!can_use(attacker)) @@ -166,6 +170,19 @@ /datum/martial_art/cqc/harm_act(mob/living/attacker, mob/living/defender) if(!can_use(attacker)) return FALSE + + if(attacker.resting && defender.stat != DEAD && defender.body_position == STANDING_UP) + defender.visible_message(span_danger("[attacker] leg sweeps [defender]!"), \ + span_userdanger("Your legs are sweeped by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, attacker) + to_chat(attacker, span_danger("You leg sweep [defender]!")) + playsound(get_turf(attacker), 'sound/effects/hit_kick.ogg', 50, TRUE, -1) + attacker.do_attack_animation(defender) + defender.apply_damage(10, BRUTE) + defender.Knockdown(5 SECONDS) + log_combat(attacker, defender, "sweeped (CQC)") + reset_streak() + return TRUE + add_to_streak("H", defender) if(check_streak(attacker, defender)) return TRUE @@ -185,14 +202,7 @@ span_userdanger("You're [picked_hit_type]ed by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, attacker) to_chat(attacker, span_danger("You [picked_hit_type] [defender]!")) log_combat(attacker, defender, "[picked_hit_type]s (CQC)") - if(attacker.resting && !defender.stat && !defender.IsParalyzed()) - defender.visible_message(span_danger("[attacker] leg sweeps [defender]!"), \ - span_userdanger("Your legs are sweeped by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, attacker) - to_chat(attacker, span_danger("You leg sweep [defender]!")) - playsound(get_turf(attacker), 'sound/effects/hit_kick.ogg', 50, TRUE, -1) - defender.apply_damage(10, BRUTE) - defender.Paralyze(6 SECONDS) - log_combat(attacker, defender, "sweeped (CQC)") + return TRUE /datum/martial_art/cqc/disarm_act(mob/living/attacker, mob/living/defender) @@ -239,7 +249,7 @@ to_chat(usr, "You try to remember some of the basics of CQC.") to_chat(usr, "[span_notice("Slam")]: Grab Punch. Slam opponent into the ground, knocking them down.") - to_chat(usr, "[span_notice("CQC Kick")]: Punch Punch. Knocks opponent away. Knocks out stunned or knocked down opponents.") + to_chat(usr, "[span_notice("CQC Kick")]: Punch Punch. Knocks opponent away. Knocks out stunned opponents and does stamina damage.") to_chat(usr, "[span_notice("Restrain")]: Grab Grab. Locks opponents into a restraining position, disarm to knock them out with a chokehold.") to_chat(usr, "[span_notice("Pressure")]: Shove Grab. Decent stamina damage.") to_chat(usr, "[span_notice("Consecutive CQC")]: Shove Shove Punch. Mainly offensive move, huge damage and decent stamina damage.") diff --git a/code/datums/martial/mushpunch.dm b/code/datums/martial/mushpunch.dm index e56771b5bd8f9..eea4439691ffa 100644 --- a/code/datums/martial/mushpunch.dm +++ b/code/datums/martial/mushpunch.dm @@ -25,7 +25,7 @@ /obj/item/mushpunch name = "odd mushroom" desc = "Sapienza Ophioglossoides:An odd mushroom from the flesh of a mushroom person. It has apparently retained some innate power of its owner, as it quivers with barely-contained POWER!" - icon = 'icons/obj/hydroponics/seeds.dmi' + icon = 'icons/obj/service/hydroponics/seeds.dmi' icon_state = "mycelium-angel" /obj/item/mushpunch/attack_self(mob/living/user) diff --git a/code/datums/martial/plasma_fist.dm b/code/datums/martial/plasma_fist.dm index ed8ac5fe81278..5ebc5ce45fc40 100644 --- a/code/datums/martial/plasma_fist.dm +++ b/code/datums/martial/plasma_fist.dm @@ -68,7 +68,7 @@ log_combat(attacker, defender, "gibbed (Plasma Fist)") var/turf/Dturf = get_turf(defender) defender.investigate_log("has been gibbed by plasma fist.", INVESTIGATE_DEATHS) - defender.gib() + defender.gib(DROP_ALL_REMAINS) if(nobomb) return if(!hasclient) diff --git a/code/datums/materials/_material.dm b/code/datums/materials/_material.dm index b062651b89360..06d26f31ea308 100644 --- a/code/datums/materials/_material.dm +++ b/code/datums/materials/_material.dm @@ -21,8 +21,8 @@ Simple datum which is instanced once per type and is used for every object of sa ///Base alpha of the material, is used for greyscale icons. var/alpha = 255 ///Starlight color of the material - ///This is the color of light it'll emit if its turf is transparent and over space - var/starlight_color = COLOR_STARLIGHT + ///This is the color of light it'll emit if its turf is transparent and over space. Defaults to COLOR_STARLIGHT if not set + var/starlight_color ///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 @@ -33,8 +33,16 @@ Simple datum which is instanced once per type and is used for every object of sa var/strength_modifier = 1 ///This is a modifier for integrity, and resembles the strength of the material var/integrity_modifier = 1 + ///This is the amount of value per 1 unit of the material var/value_per_unit = 0 + ///This is the minimum value of the material, used in the stock market for any mat that isn't set to null + var/minimum_value_override = null + ///Is this material traded on the stock market? + var/tradable = FALSE + ///If this material is tradable, what is the base quantity of the material on the stock market? + var/tradable_base_quantity = 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) ///How beautiful is this material per unit. @@ -64,7 +72,7 @@ Simple datum which is instanced once per type and is used for every object of sa id = type if(texture_layer_icon_state) - cached_texture_filter_icon = icon('icons/materials/composite.dmi', texture_layer_icon_state) + cached_texture_filter_icon = icon('icons/turf/composite.dmi', texture_layer_icon_state) return TRUE @@ -154,7 +162,11 @@ Simple datum which is instanced once per type and is used for every object of sa // We assume no parallax means no space means no light if(SSmapping.level_trait(on.z, ZTRAIT_NOPARALLAX)) return - on.set_light(2, 0.75, starlight_color) + on.set_light(2, 0.75, get_starlight_color()) + +///Gets the space color and possible changed color if space is different +/datum/material/proc/get_starlight_color() + return starlight_color || GLOB.starlight_color /datum/material/proc/get_greyscale_config_for(datum/greyscale_config/config_path) if(!config_path) diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm index 25951060a0f83..f79b9f7e4224f 100644 --- a/code/datums/materials/basemats.dm +++ b/code/datums/materials/basemats.dm @@ -6,7 +6,10 @@ 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 = 5 / SHEET_MATERIAL_AMOUNT + minimum_value_override = 0 + tradable = TRUE + tradable_base_quantity = MATERIAL_QUANTITY_COMMON /datum/material/iron/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5) @@ -18,14 +21,16 @@ desc = "Glass forged by melting sand." color = "#88cdf1" greyscale_colors = "#88cdf196" - starlight_color = COLOR_STARLIGHT alpha = 150 categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) integrity_modifier = 0.1 sheet_type = /obj/item/stack/sheet/glass shard_type = /obj/item/shard debris_type = /obj/effect/decal/cleanable/glass - value_per_unit = 0.0025 + value_per_unit = 5 / SHEET_MATERIAL_AMOUNT + minimum_value_override = 0 + tradable = TRUE + tradable_base_quantity = MATERIAL_QUANTITY_COMMON beauty_modifier = 0.05 armor_modifiers = list(MELEE = 0.2, BULLET = 0.2, ENERGY = 1, BIO = 0.2, FIRE = 1, ACID = 0.2) @@ -56,7 +61,9 @@ 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 = 50 / SHEET_MATERIAL_AMOUNT + tradable = TRUE + tradable_base_quantity = MATERIAL_QUANTITY_UNCOMMON beauty_modifier = 0.075 /datum/material/silver/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) @@ -72,7 +79,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 = 125 / SHEET_MATERIAL_AMOUNT + tradable = TRUE + tradable_base_quantity = MATERIAL_QUANTITY_RARE 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) @@ -90,7 +99,9 @@ Unless you know what you're doing, only use the first three numbers. They're in sheet_type = /obj/item/stack/sheet/mineral/diamond alpha = 132 starlight_color = COLOR_BLUE_LIGHT - value_per_unit = 0.25 + value_per_unit = 500 / SHEET_MATERIAL_AMOUNT + tradable = TRUE + tradable_base_quantity = MATERIAL_QUANTITY_EXOTIC 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) @@ -106,7 +117,9 @@ 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 = 100 / SHEET_MATERIAL_AMOUNT + tradable = TRUE + tradable_base_quantity = MATERIAL_QUANTITY_RARE beauty_modifier = 0.3 //It shines so beautiful armor_modifiers = list(MELEE = 1.5, BULLET = 1.4, LASER = 0.5, ENERGY = 0.5, FIRE = 1, ACID = 1) @@ -141,7 +154,7 @@ Unless you know what you're doing, only use the first three numbers. They're in greyscale_colors = "#c162ec" 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 - value_per_unit = 0.1 + value_per_unit = 200 / SHEET_MATERIAL_AMOUNT beauty_modifier = 0.15 armor_modifiers = list(MELEE = 1.4, BULLET = 0.7, ENERGY = 1.2, BIO = 1.2, ACID = 0.5) @@ -149,8 +162,6 @@ Unless you know what you're doing, only use the first three numbers. They're in . = ..() if(ismovable(source)) source.AddElement(/datum/element/firestacker, amount=1) - // Ideally exploding plasma objects should delete themselves but we still have the flooder and SSexplosions to rely on deleting it asynchronously so it's not that bad. - source.AddComponent(/datum/component/explodable, 0, 0, amount / 2500, 0, amount / 1250, delete_after = EXPLODABLE_NO_DELETE) source.AddComponent(/datum/component/combustible_flooder, "plasma", amount*0.05) //Empty temp arg, fully dependent on whatever ignited it. /datum/material/plasma/on_removed(atom/source, amount, material_flags) @@ -175,7 +186,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_ITEM_MATERIAL = TRUE) beauty_modifier = 0.5 sheet_type = /obj/item/stack/sheet/bluespace_crystal - value_per_unit = 0.15 + value_per_unit = 300 / SHEET_MATERIAL_AMOUNT + tradable = TRUE + tradable_base_quantity = MATERIAL_QUANTITY_EXOTIC /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)) @@ -190,7 +203,7 @@ 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 = 1000 / SHEET_MATERIAL_AMOUNT beauty_modifier = 0.5 armor_modifiers = list(BOMB = 100, FIRE = 10) //Clowns cant be blown away. @@ -218,7 +231,9 @@ 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 + value_per_unit = 125 / SHEET_MATERIAL_AMOUNT + tradable = TRUE + tradable_base_quantity = MATERIAL_QUANTITY_UNCOMMON beauty_modifier = 0.05 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) @@ -234,7 +249,7 @@ Unless you know what you're doing, only use the first three numbers. They're in strength_modifier = 1.3 categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/runite - value_per_unit = 0.3 + value_per_unit = 600 / SHEET_MATERIAL_AMOUNT 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. @@ -251,7 +266,7 @@ Unless you know what you're doing, only use the first three numbers. They're in strength_modifier = 0.85 sheet_type = /obj/item/stack/sheet/plastic categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) - value_per_unit = 0.0125 + value_per_unit = 25 / SHEET_MATERIAL_AMOUNT 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) @@ -267,7 +282,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 = 50 / SHEET_MATERIAL_AMOUNT /datum/material/wood name = "wood" @@ -277,7 +292,7 @@ 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 + value_per_unit = 20 / SHEET_MATERIAL_AMOUNT beauty_modifier = 0.1 armor_modifiers = list(MELEE = 1.1, BULLET = 1.1, LASER = 0.4, ENERGY = 0.4, BOMB = 1, BIO = 0.2, ACID = 0.3) texture_layer_icon_state = "woodgrain" @@ -310,7 +325,7 @@ Unless you know what you're doing, only use the first three numbers. They're in 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 + value_per_unit = 500 / SHEET_MATERIAL_AMOUNT 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) @@ -326,7 +341,7 @@ Unless you know what you're doing, only use the first three numbers. They're in greyscale_colors = "#f2d5d7" categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/mythril - value_per_unit = 0.75 + value_per_unit = 1500 / SHEET_MATERIAL_AMOUNT 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) beauty_modifier = 0.5 @@ -335,10 +350,12 @@ Unless you know what you're doing, only use the first three numbers. They're in . = ..() if(isitem(source)) source.AddComponent(/datum/component/fantasy) + ADD_TRAIT(source, TRAIT_INNATELY_FANTASTICAL_ITEM, REF(src)) // DO THIS LAST OR WE WILL NEVER GET OUR BONUSES!!! /datum/material/mythril/on_removed_obj(atom/source, amount, material_flags) . = ..() if(isitem(source)) + REMOVE_TRAIT(source, TRAIT_INNATELY_FANTASTICAL_ITEM, REF(src)) // DO THIS FIRST OR WE WILL NEVER GET OUR BONUSES DELETED!!! qdel(source.GetComponent(/datum/component/fantasy)) /datum/material/mythril/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) @@ -355,7 +372,7 @@ Unless you know what you're doing, only use the first three numbers. They're in starlight_color = COLOR_BLUE_LIGHT categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/hot_ice - value_per_unit = 0.2 + value_per_unit = 400 / SHEET_MATERIAL_AMOUNT beauty_modifier = 0.2 /datum/material/hot_ice/on_applied(atom/source, amount, material_flags) @@ -380,7 +397,7 @@ Unless you know what you're doing, only use the first three numbers. They're in starlight_color = COLOR_MODERATE_BLUE categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/metal_hydrogen - value_per_unit = 0.35 + value_per_unit = 700 / SHEET_MATERIAL_AMOUNT 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) @@ -397,7 +414,7 @@ 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 = 2 / SHEET_MATERIAL_AMOUNT 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) @@ -417,7 +434,7 @@ 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_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/sandstone - value_per_unit = 0.0025 + value_per_unit = 5 / SHEET_MATERIAL_AMOUNT 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) beauty_modifier = 0.3 turf_sound_override = FOOTSTEP_WOOD @@ -430,7 +447,7 @@ 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 + value_per_unit = 5 / SHEET_MATERIAL_AMOUNT 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) beauty_modifier = 0.3 turf_sound_override = FOOTSTEP_SAND @@ -447,7 +464,7 @@ 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_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/runed_metal - value_per_unit = 0.75 + value_per_unit = 1500 / SHEET_MATERIAL_AMOUNT 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) beauty_modifier = -0.15 texture_layer_icon_state = "runed" @@ -464,7 +481,7 @@ 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_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/bronze - value_per_unit = 0.025 + value_per_unit = 50 / SHEET_MATERIAL_AMOUNT armor_modifiers = list(MELEE = 1, BULLET = 1, LASER = 1, ENERGY = 1, BOMB = 1, BIO = 1, FIRE = 1.5, ACID = 1.5) beauty_modifier = 0.2 @@ -475,7 +492,7 @@ 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_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/paperframes - value_per_unit = 0.0025 + value_per_unit = 5 / SHEET_MATERIAL_AMOUNT armor_modifiers = list(MELEE = 0.1, BULLET = 0.1, LASER = 0.1, ENERGY = 0.1, BOMB = 0.1, BIO = 0.1, ACID = 1.5) beauty_modifier = 0.3 turf_sound_override = FOOTSTEP_SAND @@ -501,7 +518,7 @@ 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_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/cardboard - value_per_unit = 0.003 + value_per_unit = 6 / SHEET_MATERIAL_AMOUNT armor_modifiers = list(MELEE = 0.25, BULLET = 0.25, LASER = 0.25, ENERGY = 0.25, BOMB = 0.25, BIO = 0.25, ACID = 1.5) beauty_modifier = -0.1 @@ -525,7 +542,7 @@ 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_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/bone - value_per_unit = 0.05 + value_per_unit = 100 / SHEET_MATERIAL_AMOUNT 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) beauty_modifier = -0.2 @@ -536,7 +553,7 @@ 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_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/bamboo - value_per_unit = 0.0025 + value_per_unit = 5 / SHEET_MATERIAL_AMOUNT 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) beauty_modifier = 0.2 turf_sound_override = FOOTSTEP_WOOD @@ -549,7 +566,7 @@ Unless you know what you're doing, only use the first three numbers. They're in greyscale_colors = COLOR_ALMOST_BLACK categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/zaukerite - value_per_unit = 0.45 + value_per_unit = 900 / SHEET_MATERIAL_AMOUNT 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) beauty_modifier = 0.001 diff --git a/code/datums/materials/hauntium.dm b/code/datums/materials/hauntium.dm index 9a4e09f908189..79e254417208d 100644 --- a/code/datums/materials/hauntium.dm +++ b/code/datums/materials/hauntium.dm @@ -15,10 +15,8 @@ /datum/material/hauntium/on_applied_obj(obj/o, amount, material_flags) . = ..() - if(isitem(o)) - o.AddElement(/datum/element/haunted) + o.make_haunted(INNATE_TRAIT, "#f8f8ff") /datum/material/hauntium/on_removed_obj(obj/o, amount, material_flags) . = ..() - if(isitem(o)) - o.RemoveElement(/datum/element/haunted) + o.remove_haunted(INNATE_TRAIT) diff --git a/code/datums/materials/meat.dm b/code/datums/materials/meat.dm index 162f0f2643e8d..68d3c1d77ab30 100644 --- a/code/datums/materials/meat.dm +++ b/code/datums/materials/meat.dm @@ -31,7 +31,7 @@ var/nutriment_count = 3 * (amount / SHEET_MATERIAL_AMOUNT) var/oil_count = 2 * (amount / SHEET_MATERIAL_AMOUNT) source.AddComponent(/datum/component/edible, \ - initial_reagents = list(/datum/reagent/consumable/nutriment = nutriment_count, /datum/reagent/consumable/cooking_oil = oil_count), \ + initial_reagents = list(/datum/reagent/consumable/nutriment = nutriment_count, /datum/reagent/consumable/nutriment/fat/oil = oil_count), \ foodtypes = RAW | MEAT | GROSS, \ eat_time = 3 SECONDS, \ tastes = list("Fleshy")) diff --git a/code/datums/materials/pizza.dm b/code/datums/materials/pizza.dm index 6a7c4a6922a10..588018576befe 100644 --- a/code/datums/materials/pizza.dm +++ b/code/datums/materials/pizza.dm @@ -29,7 +29,7 @@ var/nutriment_count = 3 * (amount / SHEET_MATERIAL_AMOUNT) var/oil_count = 2 * (amount / SHEET_MATERIAL_AMOUNT) source.AddComponent(/datum/component/edible, \ - initial_reagents = list(/datum/reagent/consumable/nutriment = nutriment_count, /datum/reagent/consumable/cooking_oil = oil_count), \ + initial_reagents = list(/datum/reagent/consumable/nutriment = nutriment_count, /datum/reagent/consumable/nutriment/fat/oil = oil_count), \ foodtypes = GRAIN | MEAT | DAIRY | VEGETABLES, \ eat_time = 3 SECONDS, \ tastes = list("crust", "tomato", "cheese", "meat")) diff --git a/code/datums/memory/_memory.dm b/code/datums/memory/_memory.dm index b465e6ef85a12..e3f161d5f0e4b 100644 --- a/code/datums/memory/_memory.dm +++ b/code/datums/memory/_memory.dm @@ -245,6 +245,8 @@ var/static/list/something_pool = list( /mob/living/basic/bat, + /mob/living/basic/bear, + /mob/living/basic/blob_minion/blobbernaut, /mob/living/basic/butterfly, /mob/living/basic/carp, /mob/living/basic/carp/magic, @@ -253,32 +255,30 @@ /mob/living/basic/chicken, /mob/living/basic/cow, /mob/living/basic/cow/wisdom, - /mob/living/basic/giant_spider, - /mob/living/basic/giant_spider/hunter, + /mob/living/basic/crab, + /mob/living/basic/goat, /mob/living/basic/headslug, /mob/living/basic/killer_tomato, /mob/living/basic/lizard, + /mob/living/basic/mining/goliath, + /mob/living/basic/mining/watcher, + /mob/living/basic/morph, /mob/living/basic/mouse, + /mob/living/basic/mushroom, /mob/living/basic/pet/dog/breaddog, /mob/living/basic/pet/dog/corgi, /mob/living/basic/pet/dog/pug, + /mob/living/basic/pet/fox, + /mob/living/basic/spider/giant, + /mob/living/basic/spider/giant/hunter, /mob/living/basic/statue, /mob/living/basic/stickman, /mob/living/basic/stickman/dog, - /mob/living/simple_animal/crab, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher, - /mob/living/simple_animal/hostile/asteroid/goliath/beast, - /mob/living/simple_animal/hostile/bear, - /mob/living/simple_animal/hostile/blob/blobbernaut/independent, /mob/living/simple_animal/hostile/gorilla, /mob/living/simple_animal/hostile/megafauna/dragon/lesser, - /mob/living/simple_animal/hostile/morph, - /mob/living/simple_animal/hostile/mushroom, - /mob/living/simple_animal/hostile/retaliate/goat, /mob/living/simple_animal/parrot, /mob/living/simple_animal/pet/cat, /mob/living/simple_animal/pet/cat/cak, - /mob/living/simple_animal/pet/fox, /obj/item/food/sausage/american, /obj/item/skub, ) diff --git a/code/datums/memory/general_memories.dm b/code/datums/memory/general_memories.dm index e3a4a88cd76b0..3e5eb05cf4026 100644 --- a/code/datums/memory/general_memories.dm +++ b/code/datums/memory/general_memories.dm @@ -725,14 +725,14 @@ return list("[protagonist_name] [mood_verb] as they [result] the deadly game of roulette.") /// When a heretic finishes their ritual of knowledge -/datum/memory/heretic_knowlege_ritual +/datum/memory/heretic_knowledge_ritual story_value = STORY_VALUE_AMAZING // Protagonist = heretic -/datum/memory/heretic_knowlege_ritual/get_names() +/datum/memory/heretic_knowledge_ritual/get_names() return list("[protagonist_name] absorbing boundless knowledge through eldritch research.") -/datum/memory/heretic_knowlege_ritual/get_starts() +/datum/memory/heretic_knowledge_ritual/get_starts() return list( "[protagonist_name] laying out a circle of green tar and candles", "multiple books around [protagonist_name] flipping open", @@ -742,16 +742,16 @@ "a wide, strange looking circle, with [protagonist_name] sketching it" ) -/datum/memory/heretic_knowlege_ritual/get_moods() +/datum/memory/heretic_knowledge_ritual/get_moods() return list("[protagonist_name] [mood_verb] as their hand glows with power.") -/datum/memory/heretic_knowlege_ritual/get_happy_moods() +/datum/memory/heretic_knowledge_ritual/get_happy_moods() return list("cackling madly") -/datum/memory/heretic_knowlege_ritual/get_neutral_moods() +/datum/memory/heretic_knowledge_ritual/get_neutral_moods() return list("staring blankly with a wide grin") -/datum/memory/heretic_knowlege_ritual/get_sad_moods() +/datum/memory/heretic_knowledge_ritual/get_sad_moods() return list("cackling insanely") /// Failed to defuse a bomb, by triggering it early. diff --git a/code/datums/memory/key_memories.dm b/code/datums/memory/key_memories.dm index 768b659a61a4d..5cc581f14c737 100644 --- a/code/datums/memory/key_memories.dm +++ b/code/datums/memory/key_memories.dm @@ -127,6 +127,34 @@ /datum/memory/key/quirk_smoker/get_moods() return list("[memorizer] [mood_verb] as they light another up.") +/// Tracks what beverage an alcoholic quirk user likes +/datum/memory/key/quirk_alcoholic + memory_flags = MEMORY_FLAG_NOLOCATION|MEMORY_FLAG_NOPERSISTENCE|MEMORY_SKIP_UNCONSCIOUS // Does not have nomood + var/preferred_brandy //haha, get it because brandy is a type of alcohol wow! + +/datum/memory/key/quirk_alcoholic/New( + datum/mind/memorizer_mind, + atom/protagonist, + atom/deuteragonist, + atom/antagonist, + preferred_brandy, +) + src.preferred_brandy = preferred_brandy + return ..() + +/datum/memory/key/quirk_alcoholic/get_names() + return list("[protagonist_name]'s drinking problem.") + +/datum/memory/key/quirk_alcoholic/get_starts() + return list( + "[preferred_brandy] being downed by [protagonist_name].", + "[protagonist_name] buying a box of [preferred_brandy] bottles.", + "[protagonist_name] fiending for some [preferred_brandy].", + ) + +/datum/memory/key/quirk_alcoholic/get_moods() + return list("[memorizer] [mood_verb] as they drink some [preferred_brandy].") + /// Where our traitor uplink is, and what is its code /datum/memory/key/traitor_uplink var/uplink_loc diff --git a/code/datums/mergers/_merger.dm b/code/datums/mergers/_merger.dm index 1ee6cc4cfc365..8014b6419fc00 100644 --- a/code/datums/mergers/_merger.dm +++ b/code/datums/mergers/_merger.dm @@ -131,7 +131,7 @@ /datum/merger/proc/check_turf(turf/location, list/found_turfs, asking_from) var/found_something = FALSE // if asking_from is invalid (like if it's 0), we get a random output. that's bad, let's check for falsyness - var/us_to_them = asking_from && turn(asking_from, 180) + var/us_to_them = asking_from && REVERSE_DIR(asking_from) if(found_turfs[location]) found_turfs[location][MERGE_TURF_PACKET_DIR] |= us_to_them diff --git a/code/datums/mind/_mind.dm b/code/datums/mind/_mind.dm index 2d7970906838c..9e96c85c024d9 100644 --- a/code/datums/mind/_mind.dm +++ b/code/datums/mind/_mind.dm @@ -8,7 +8,7 @@ ghost.mind is however used as a reference to the ghost's corpse - When creating a new mob for an existing IC character (e.g. cloning a dead guy or borging a brain of a human) - the existing mind of the old mob should be transfered to the new mob like so: + the existing mind of the old mob should be transferred to the new mob like so: mind.transfer_to(new_mob) @@ -65,7 +65,6 @@ ///If this mind's master is another mob (i.e. adamantine golems). Weakref of a /living. var/datum/weakref/enslaved_to - var/datum/language_holder/language_holder var/unconvertable = FALSE var/late_joiner = FALSE /// has this mind ever been an AI @@ -118,7 +117,6 @@ QDEL_LIST(memories) QDEL_NULL(memory_panel) QDEL_LIST(antag_datums) - QDEL_NULL(language_holder) set_current(null) return ..() @@ -166,11 +164,6 @@ SIGNAL_HANDLER set_current(null) -/datum/mind/proc/get_language_holder() - if(!language_holder) - language_holder = new (src) - return language_holder - /datum/mind/proc/transfer_to(mob/new_character, force_key_move = 0) set_original_character(null) if(current) // remove ourself from our old body's mind variable @@ -189,17 +182,29 @@ var/mob/living/old_current = current if(current) - current.transfer_observers_to(new_character) //transfer anyone observing the old character to the new one + //transfer anyone observing the old character to the new one + current.transfer_observers_to(new_character) + + // Offload all mind languages from the old holder to a temp one + var/datum/language_holder/empty/temp_holder = new() + var/datum/language_holder/old_holder = old_current.get_language_holder() + var/datum/language_holder/new_holder = new_character.get_language_holder() + // Off load mind languages to the temp holder momentarily + new_holder.transfer_mind_languages(temp_holder) + // Transfer the old holder's mind languages to the new holder + old_holder.transfer_mind_languages(new_holder) + // And finally transfer the temp holder's mind languages back to the old holder + temp_holder.transfer_mind_languages(old_holder) + 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) - 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) + for(var/datum/antagonist/antag_datum as anything in antag_datums) //Makes sure all antag datums effects are applied in the new body + antag_datum.on_body_transfer(old_current, current) if(iscarbon(new_character)) - var/mob/living/carbon/C = new_character - C.last_mind = src + var/mob/living/carbon/carbon_character = new_character + carbon_character.last_mind = src transfer_martial_arts(new_character) RegisterSignal(new_character, COMSIG_LIVING_DEATH, PROC_REF(set_death_time)) if(active || force_key_move) @@ -207,7 +212,7 @@ 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) @@ -352,6 +357,41 @@ objective.completed = !objective.completed log_admin("[key_name(usr)] toggled the win state for [current]'s objective: [objective.explanation_text]") + else if(href_list["obj_prompt_custom"]) + var/datum/antagonist/target_antag + if(href_list["target_antag"]) + var/datum/antagonist/found_datum = locate(href_list["target_antag"]) in antag_datums + if(found_datum) + target_antag = found_datum + if(isnull(target_antag)) + switch(length(antag_datums)) + if(0) + target_antag = add_antag_datum(/datum/antagonist/custom) + if(1) + target_antag = antag_datums[1] + else + var/datum/antagonist/target = input("Which antagonist gets the objective:", "Antagonist", "(new custom antag)") as null|anything in sort_list(antag_datums) + "(new custom antag)" + if (QDELETED(target)) + return + else if(target == "(new custom antag)") + target_antag = add_antag_datum(/datum/antagonist/custom) + else + target_antag = target + var/replace_existing = input("Replace existing objectives?","Replace objectives?") in list("Yes", "No") + if (isnull(replace_existing)) + return + replace_existing = replace_existing == "Yes" + var/replace_escape + if (!replace_existing) + replace_escape = FALSE + else + replace_escape = input("Replace survive/escape/martyr objectives?","Replace objectives?") in list("Yes", "No") + if (isnull(replace_escape)) + return + replace_escape = replace_escape == "Yes" + target_antag.submit_player_objective(retain_existing = !replace_existing, retain_escape = !replace_escape, force = TRUE) + log_admin("[key_name(usr)] prompted [current] to enter their own objectives for [target_antag].") + else if (href_list["silicon"]) switch(href_list["silicon"]) if("unemag") @@ -527,11 +567,9 @@ if(assigned_role != new_role) return - to_chat(incoming_client || src, span_infoplain("You are the [new_role.title].")) - - var/related_policy = get_policy(new_role.title) - if(related_policy) - to_chat(incoming_client || src, related_policy) + var/intro_message = new_role.get_spawn_message() + if(incoming_client && intro_message) + to_chat(incoming_client, intro_message) /mob/proc/sync_mind() mind_initialize() //updates the mind (or creates and initializes one if one doesn't exist) diff --git a/code/datums/mind/antag.dm b/code/datums/mind/antag.dm index ba449261131fa..307ffcf1ea1ca 100644 --- a/code/datums/mind/antag.dm +++ b/code/datums/mind/antag.dm @@ -103,7 +103,7 @@ remove_antag_datum(/datum/antagonist/cult) var/datum/antagonist/rev/revolutionary = has_antag_datum(/datum/antagonist/rev) - revolutionary?.remove_revolutionary(borged = TRUE) + revolutionary?.remove_revolutionary() /** * ## give_uplink diff --git a/code/datums/mind/initialization.dm b/code/datums/mind/initialization.dm index 12a5dddb229cb..eb622cc5af549 100644 --- a/code/datums/mind/initialization.dm +++ b/code/datums/mind/initialization.dm @@ -11,6 +11,7 @@ mind.set_current(src) // There's nowhere else to set this up, mind code makes me depressed mind.antag_hud = add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/antagonist_hud, "combo_hud", mind) + SEND_SIGNAL(src, COMSIG_MOB_MIND_INITIALIZED, mind) /mob/living/carbon/mind_initialize() ..() diff --git a/code/datums/mind/skills.dm b/code/datums/mind/skills.dm index 5847236435b93..474291d5ae0d4 100644 --- a/code/datums/mind/skills.dm +++ b/code/datums/mind/skills.dm @@ -18,12 +18,10 @@ experience_multiplier += experience_multiplier_reasons[key] known_skills[skill][SKILL_EXP] = max(0, known_skills[skill][SKILL_EXP] + amt*experience_multiplier) //Update exp. Prevent going below 0 known_skills[skill][SKILL_LVL] = update_skill_level(skill)//Check what the current skill level is based on that skill's exp - if(silent) - return if(known_skills[skill][SKILL_LVL] > old_level) - S.level_gained(src, known_skills[skill][SKILL_LVL], old_level) + S.level_gained(src, known_skills[skill][SKILL_LVL], old_level, silent) else if(known_skills[skill][SKILL_LVL] < old_level) - S.level_lost(src, known_skills[skill][SKILL_LVL], old_level) + S.level_lost(src, known_skills[skill][SKILL_LVL], old_level, silent) ///Set experience of a specific skill to a number /datum/mind/proc/set_experience(skill, amt, silent = FALSE) diff --git a/code/datums/mood.dm b/code/datums/mood.dm index 79fb8486db9eb..6f36c1e66a911 100644 --- a/code/datums/mood.dm +++ b/code/datums/mood.dm @@ -139,8 +139,9 @@ * Arguments: * * category - (text) category of the mood event - see /datum/mood_event for category explanation * * type - (path) any /datum/mood_event + * * timeout_mod - (number) /datum/mood_event timeout modifier */ -/datum/mood/proc/add_mood_event(category, type, ...) +/datum/mood/proc/add_mood_event(category, type, timeout_mod = 1, ...) if (!ispath(type, /datum/mood_event)) CRASH("A non path ([type]), was used to add a mood event. This shouldn't be happening.") if (!istext(category)) @@ -153,6 +154,7 @@ clear_mood_event(category) else if (the_event.timeout) + the_event.timeout = initial(the_event.timeout) * timeout_mod addtimer(CALLBACK(src, PROC_REF(clear_mood_event), category), the_event.timeout, (TIMER_UNIQUE|TIMER_OVERRIDE)) return // Don't need to update the event. var/list/params = args.Copy(3) @@ -162,8 +164,9 @@ if (QDELETED(the_event)) // the mood event has been deleted for whatever reason (requires a job, etc) return - mood_events[category] = the_event + the_event.timeout *= timeout_mod the_event.category = category + mood_events[category] = the_event update_mood() if (the_event.timeout) diff --git a/code/datums/mood_events/drink_events.dm b/code/datums/mood_events/drink_events.dm index 311764789c2b8..5b08b0122d818 100644 --- a/code/datums/mood_events/drink_events.dm +++ b/code/datums/mood_events/drink_events.dm @@ -13,6 +13,16 @@ /datum/mood_event/drunk/remove_effects() QDEL_NULL(blush_overlay) +/datum/mood_event/wrong_brandy + description = "I hate that type of drink." + mood_change = -2 + timeout = 6 MINUTES + +/datum/mood_event/quality_revolting + description = "That drink was the worst thing I've ever consumed." + mood_change = -8 + timeout = 7 MINUTES + /datum/mood_event/quality_nice description = "That drink wasn't bad at all." mood_change = 2 @@ -37,3 +47,8 @@ description = "Amazing taste!" mood_change = 50 timeout = 10 MINUTES + +/datum/mood_event/wellcheers + description = "What a tasty can of Wellcheers! The salty grape flavor is a great pick-me-up." + mood_change = 3 + timeout = 7 MINUTES diff --git a/code/datums/mood_events/drug_events.dm b/code/datums/mood_events/drug_events.dm index 05d6eabd7d712..8ac323dda7a76 100644 --- a/code/datums/mood_events/drug_events.dm +++ b/code/datums/mood_events/drug_events.dm @@ -19,6 +19,10 @@ else description = initial(description) +/datum/mood_event/hang_over + mood_change = -4 + description = "I have a killer hang over!" + timeout = 1 MINUTES /datum/mood_event/smoked description = "I have had a smoke recently." @@ -121,3 +125,8 @@ /datum/mood_event/nicotine_withdrawal_severe description = "Head pounding. Cold sweating. Feeling anxious. Need a smoke to calm down!" mood_change = -8 + +/datum/mood_event/hauntium_spirits + description = "I feel my soul degrading!" + mood_change = -8 + timeout = 8 MINUTES diff --git a/code/datums/mood_events/food_events.dm b/code/datums/mood_events/food_events.dm new file mode 100644 index 0000000000000..7d2dcc439de46 --- /dev/null +++ b/code/datums/mood_events/food_events.dm @@ -0,0 +1,46 @@ +/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/food + timeout = 5 MINUTES + var/quality = FOOD_QUALITY_NORMAL + +/datum/mood_event/food/New(mob/M, ...) + . = ..() + mood_change = 2 + 2 * quality + description = "That food was [GLOB.food_quality_description[quality]]." + +/datum/mood_event/food/nice + quality = FOOD_QUALITY_NICE + +/datum/mood_event/food/good + quality = FOOD_QUALITY_GOOD + +/datum/mood_event/food/verygood + quality = FOOD_QUALITY_VERYGOOD + +/datum/mood_event/food/fantastic + quality = FOOD_QUALITY_FANTASTIC + +/datum/mood_event/food/amazing + quality = FOOD_QUALITY_AMAZING + +/datum/mood_event/food/top + quality = FOOD_QUALITY_TOP diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 1fd94e5dbc85f..23a3364adc318 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -48,7 +48,7 @@ timeout = 4 MINUTES /datum/mood_event/cascade // Big boi delamination - description = "The engineers have finally done it, we are all going to die..." + description = "I never thought I'd see a resonance cascade, let alone experience one..." mood_change = -8 timeout = 5 MINUTES @@ -78,10 +78,23 @@ timeout = 60 SECONDS /datum/mood_event/dismembered - description = "AHH! I WAS USING THAT LIMB!" + description = "AHH! MY LIMB! I WAS USING THAT!" mood_change = -10 timeout = 8 MINUTES +/datum/mood_event/dismembered/add_effects(obj/item/bodypart/limb) + if(limb) + description = "AHH! MY [uppertext(limb.plaintext_zone)]! I WAS USING THAT!" + +/datum/mood_event/reattachment + description = "Ouch! My limb feels like I fell asleep on it." + mood_change = -3 + timeout = 2 MINUTES + +/datum/mood_event/reattachment/add_effects(obj/item/bodypart/limb) + if(limb) + description = "Ouch! My [limb.plaintext_zone] feels like I fell asleep on it." + /datum/mood_event/tased description = "There's no \"z\" in \"taser\". It's in the zap." mood_change = -3 @@ -128,6 +141,10 @@ mood_change = -3 timeout = 5 MINUTES +/datum/mood_event/photophobia + description = "The lights are too bright..." + mood_change = -3 + /datum/mood_event/nyctophobia description = "It sure is dark around here..." mood_change = -3 @@ -150,6 +167,9 @@ mood_change = -4 timeout = 2 MINUTES +/datum/mood_event/healsbadman/long_term + timeout = 10 MINUTES + /datum/mood_event/jittery description = "I'm nervous and on edge and I can't stand still!!" mood_change = -2 @@ -296,6 +316,11 @@ description = "I need something to cover my head..." mood_change = -3 +/datum/mood_event/bald_reminder + description = "I was reminded that I can't grow my hair back at all! This is awful!" + mood_change = -5 + timeout = 4 MINUTES + /datum/mood_event/bad_touch description = "I don't like when people touch me." mood_change = -3 @@ -413,3 +438,9 @@ /datum/mood_event/unsatisfied_nomad description = "I've been here too long! I want to go out and explore space!" mood_change = -3 + +///Wizard cheesy grand finale - what everyone but the wizard gets +/datum/mood_event/madness_despair + description = "UNWORTHY, UNWORTHY, UNWORTHY!!!" + mood_change = -200 + special_screen_obj = "mood_despair" diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index 9214c8e459e6f..83b6b362f6540 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -194,8 +194,8 @@ timeout = 3 MINUTES /datum/mood_event/hope_lavaland - description = "What a peculiar emblem. It makes me feel hopeful for my future." - mood_change = 10 + description = "What a peculiar emblem. It makes me feel hopeful for my future." + mood_change = 6 /datum/mood_event/confident_mane description = "I'm feeling confident with a head full of hair." @@ -364,8 +364,13 @@ description = "Swish! Nothing but net." mood_change = 2 timeout = 5 MINUTES - + /datum/mood_event/basketball_dunk description = "Slam dunk! Boom, shakalaka!" mood_change = 2 timeout = 5 MINUTES + +///Wizard cheesy grand finale - what the wizard gets +/datum/mood_event/madness_elation + description = "Madness truly is the greatest of blessings..." + mood_change = 200 diff --git a/code/datums/mood_events/morbid_events.dm b/code/datums/mood_events/morbid_events.dm new file mode 100644 index 0000000000000..b21548c81228d --- /dev/null +++ b/code/datums/mood_events/morbid_events.dm @@ -0,0 +1,51 @@ +/* Morbid Mood Events - +Any mood events related to TRAIT_MORBID. +Ususally this is an inverse of a typically good, alturistic action (such as saving someones life), punishing it with a negative mood event, +and rewards typically antisocial/unsavory actions (such as graverobbing) with a positive mood event. +Intended to push a creepy, mad scientist/doctor vibe, or someone who is downright monstrous in nature. +*/ + +// Positive Events - We did something unsavory in the name of mad science + +/datum/mood_event/morbid_dismemberment + description = "Nothing quite as satisfying as a clean dismemberment!" + mood_change = 2 + timeout = 2 MINUTES + +/datum/mood_event/morbid_dissection_success + description = "I take pride in my work. Nobody can dissect a body quite like I can." + mood_change = 2 + timeout = 2 MINUTES + +/datum/mood_event/morbid_abominable_surgery_success + description = "Picasso himself would struggle to match with a brush what I can do with a knife." + mood_change = 2 + timeout = 2 MINUTES + +/datum/mood_event/morbid_revival_success + description = "IT LIVES! AH HA HA HA HA!!" + mood_change = 6 + timeout = 8 MINUTES + +/datum/mood_event/morbid_graverobbing + description = "The dead have no need for possessions. I, on the other hand, am very much alive and very much in need." + mood_change = 2 + timeout = 2 MINUTES + +/datum/mood_event/morbid_hauntium + description = "I feel a better connection with the spirits, I love this!" + mood_change = 3 + timeout = 6 MINUTES + +// Negative Events - We helped someone stay alive. + +/datum/mood_event/morbid_tend_wounds + description = "Why must I waste my talents on this trivial nonsense? Tending to breathers is a waste of effort." + mood_change = -2 + timeout = 2 MINUTES + +/datum/mood_event/morbid_saved_life + description = "I could have done so much more with their corpse than I could have saving their useless life. Dreadful." + mood_change = -6 + timeout = 2 MINUTES + diff --git a/code/datums/mood_events/needs_events.dm b/code/datums/mood_events/needs_events.dm index 1c00825e2d1db..ceee687918e01 100644 --- a/code/datums/mood_events/needs_events.dm +++ b/code/datums/mood_events/needs_events.dm @@ -61,27 +61,12 @@ 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!" +/datum/mood_event/disgust/dirty_food + description = "It was too dirty to eat..." 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 - +//Generic needs events /datum/mood_event/nice_shower description = "I have recently had a nice shower." mood_change = 4 diff --git a/code/datums/mutations/_mutations.dm b/code/datums/mutations/_mutations.dm index 0226326165c87..9ea3c8dfb172d 100644 --- a/code/datums/mutations/_mutations.dm +++ b/code/datums/mutations/_mutations.dm @@ -1,5 +1,4 @@ /datum/mutation - var/name /datum/mutation/human diff --git a/code/datums/mutations/adaptation.dm b/code/datums/mutations/adaptation.dm index 7fd90326c00a2..1c183f9367d3a 100644 --- a/code/datums/mutations/adaptation.dm +++ b/code/datums/mutations/adaptation.dm @@ -10,7 +10,7 @@ /datum/mutation/human/temperature_adaptation/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) ..() if(!(type in visual_indicators)) - visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "fire", -MUTATIONS_LAYER)) + visual_indicators[type] = list(mutable_appearance('icons/mob/effects/genetics.dmi', "fire", -MUTATIONS_LAYER)) /datum/mutation/human/temperature_adaptation/get_visual_indicator() return visual_indicators[type][1] @@ -37,7 +37,7 @@ /datum/mutation/human/pressure_adaptation/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) ..() if(!(type in visual_indicators)) - visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "pressure", -MUTATIONS_LAYER)) + visual_indicators[type] = list(mutable_appearance('icons/mob/effects/genetics.dmi', "pressure", -MUTATIONS_LAYER)) /datum/mutation/human/pressure_adaptation/get_visual_indicator() return visual_indicators[type][1] diff --git a/code/datums/mutations/antenna.dm b/code/datums/mutations/antenna.dm index 21fc6d402ecb8..b71f66c0fa685 100644 --- a/code/datums/mutations/antenna.dm +++ b/code/datums/mutations/antenna.dm @@ -35,7 +35,7 @@ /datum/mutation/human/antenna/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) ..() if(!(type in visual_indicators)) - visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "antenna", -FRONT_MUTATIONS_LAYER+1))//-MUTATIONS_LAYER+1 + visual_indicators[type] = list(mutable_appearance('icons/mob/effects/genetics.dmi', "antenna", -FRONT_MUTATIONS_LAYER+1))//-MUTATIONS_LAYER+1 /datum/mutation/human/antenna/get_visual_indicator() return visual_indicators[type][1] @@ -91,32 +91,11 @@ // chance to alert the read-ee to_chat(cast_on, span_danger("You feel something foreign enter your mind.")) - var/list/recent_speech = list() - var/list/say_log = list() - var/log_source = cast_on.logging - //this whole loop puts the read-ee's say logs into say_log in an easy to access way - for(var/log_type in log_source) - var/nlog_type = text2num(log_type) - if(nlog_type & LOG_SAY) - var/list/reversed = log_source[log_type] - if(islist(reversed)) - say_log = reverse_range(reversed.Copy()) - break - - for(var/spoken_memory in say_log) - //up to 3 random lines of speech, favoring more recent speech - if(length(recent_speech) >= 3) - break - if(prob(50)) - continue - // log messages with tags like telepathy are displayed like "(Telepathy to Ckey/(target)) "greetings""" - // by splitting the text by using a " delimiter, we can grab JUST the greetings part - recent_speech[spoken_memory] = splittext(say_log[spoken_memory], "\"", 1, 0, TRUE)[3] - + var/list/recent_speech = cast_on.copy_recent_speech(copy_amount = 3, line_chance = 50) if(length(recent_speech)) to_chat(owner, span_boldnotice("You catch some drifting memories of their past conversations...")) for(var/spoken_memory in recent_speech) - to_chat(owner, span_notice("[recent_speech[spoken_memory]]")) + to_chat(owner, span_notice("[spoken_memory]")) if(iscarbon(cast_on)) var/mob/living/carbon/carbon_cast_on = cast_on @@ -126,7 +105,7 @@ /datum/mutation/human/mindreader/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) ..() if(!(type in visual_indicators)) - visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "antenna", -FRONT_MUTATIONS_LAYER+1)) + visual_indicators[type] = list(mutable_appearance('icons/mob/effects/genetics.dmi', "antenna", -FRONT_MUTATIONS_LAYER+1)) /datum/mutation/human/mindreader/get_visual_indicator() return visual_indicators[type][1] diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index f6f1fb406bb5c..30be64e13f4f1 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -90,7 +90,7 @@ owner.emote("cough") if(GET_MUTATION_POWER(src) > 1) var/cough_range = GET_MUTATION_POWER(src) * 4 - var/turf/target = get_ranged_target_turf(owner, turn(owner.dir, 180), cough_range) + var/turf/target = get_ranged_target_turf(owner, REVERSE_DIR(owner.dir), cough_range) owner.throw_at(target, cough_range, GET_MUTATION_POWER(src)) /datum/mutation/human/paranoia @@ -218,47 +218,47 @@ quality = POSITIVE text_gain_indication = "Your skin begins to glow softly." instability = 5 - var/obj/effect/dummy/luminescent_glow/glowth //shamelessly copied from luminescents - var/glow = 2.5 - var/range = 2.5 - var/glow_color power_coeff = 1 conflicts = list(/datum/mutation/human/glow/anti) + var/glow_power = 2.5 + var/glow_range = 2.5 + var/glow_color + var/obj/effect/dummy/lighting_obj/moblight/glow /datum/mutation/human/glow/on_acquiring(mob/living/carbon/human/owner) . = ..() if(.) return - glow_color = glow_color() - glowth = new(owner) + glow_color = get_glow_color() + glow = owner.mob_light() modify() // Override modify here without a parent call, because we don't actually give an action. /datum/mutation/human/glow/modify() - if(!glowth) + if(!glow) return - glowth.set_light_range_power_color(range * GET_MUTATION_POWER(src), glow, glow_color) - -/// Returns the color for the glow effect -/datum/mutation/human/glow/proc/glow_color() - return pick(COLOR_RED, COLOR_BLUE, COLOR_YELLOW, COLOR_GREEN, COLOR_PURPLE, COLOR_ORANGE) + glow.set_light_range_power_color(glow_range * GET_MUTATION_POWER(src), glow_power, glow_color) /datum/mutation/human/glow/on_losing(mob/living/carbon/human/owner) . = ..() if(.) return - QDEL_NULL(glowth) + QDEL_NULL(glow) + +/// Returns a color for the glow effect +/datum/mutation/human/glow/proc/get_glow_color() + return pick(COLOR_RED, COLOR_BLUE, COLOR_YELLOW, COLOR_GREEN, COLOR_PURPLE, COLOR_ORANGE) /datum/mutation/human/glow/anti name = "Anti-Glow" desc = "Your skin seems to attract and absorb nearby light creating 'darkness' around you." - text_gain_indication = "Your light around you seems to disappear." + text_gain_indication = "The light around you seems to disappear." glow = -1.5 conflicts = list(/datum/mutation/human/glow) locked = TRUE -/datum/mutation/human/glow/anti/glow_color() +/datum/mutation/human/glow/anti/get_glow_color() return COLOR_BLACK /datum/mutation/human/strong @@ -484,7 +484,7 @@ to_chat(borgo, span_userdanger("Your sensors are disabled by a shower of blood!")) borgo.Paralyze(6 SECONDS) owner.investigate_log("has been gibbed by the martyrdom mutation.", INVESTIGATE_DEATHS) - owner.gib() + owner.gib(DROP_ALL_REMAINS) /datum/mutation/human/headless name = "H.A.R.S." @@ -497,6 +497,7 @@ . = ..() if(.)//cant add return TRUE + var/obj/item/organ/internal/brain/brain = owner.get_organ_slot(ORGAN_SLOT_BRAIN) if(brain) brain.zone = BODY_ZONE_CHEST @@ -505,11 +506,10 @@ 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(BRUTE) + head.dismember(dam_type = BRUTE, silent = TRUE) head.drop_organs() qdel(head) - owner.regenerate_icons() - RegisterSignal(owner, COMSIG_ATTEMPT_CARBON_ATTACH_LIMB, PROC_REF(abortattachment)) + RegisterSignal(owner, COMSIG_ATTEMPT_CARBON_ATTACH_LIMB, PROC_REF(abort_attachment)) /datum/mutation/human/headless/on_losing() . = ..() @@ -517,7 +517,7 @@ return TRUE var/obj/item/organ/internal/brain/brain = owner.get_organ_slot(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 + brain.zone = initial(brain.zone) UnregisterSignal(owner, COMSIG_ATTEMPT_CARBON_ATTACH_LIMB) var/successful = owner.regenerate_limb(BODY_ZONE_HEAD) if(!successful) @@ -528,8 +528,7 @@ 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 +/datum/mutation/human/headless/proc/abort_attachment(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)) diff --git a/code/datums/mutations/cold.dm b/code/datums/mutations/cold.dm index f999eed421d5f..57c4f854fc7a2 100644 --- a/code/datums/mutations/cold.dm +++ b/code/datums/mutations/cold.dm @@ -18,6 +18,7 @@ item_type = /obj/item/stack/sheet/mineral/snow delete_old = FALSE + delete_on_failure = FALSE /datum/mutation/human/cryokinesis name = "Cryokinesis" diff --git a/code/datums/mutations/fire_breath.dm b/code/datums/mutations/fire_breath.dm index 97e5459f82c37..f8631761ba202 100644 --- a/code/datums/mutations/fire_breath.dm +++ b/code/datums/mutations/fire_breath.dm @@ -67,7 +67,7 @@ // When casting, throw the caster backwards a few tiles. var/original_dir = living_cast_on.dir living_cast_on.throw_at( - get_edge_target_turf(living_cast_on, turn(living_cast_on.dir, 180)), + get_edge_target_turf(living_cast_on, REVERSE_DIR(living_cast_on.dir)), range = self_throw_range, speed = 2, gentle = TRUE, diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm index bfba440482486..ba04fc07c54ec 100644 --- a/code/datums/mutations/hulk.dm +++ b/code/datums/mutations/hulk.dm @@ -12,7 +12,7 @@ var/scream_delay = 50 var/last_scream = 0 /// List of traits to add/remove when someone gets this mutation. - var/static/list/mutation_traits = list( + var/list/mutation_traits = list( TRAIT_CHUNKYFINGERS, TRAIT_HULK, TRAIT_IGNOREDAMAGESLOWDOWN, @@ -63,13 +63,19 @@ *arg1 is the arm to evaluate damage of and possibly break. */ /datum/mutation/human/hulk/proc/break_an_arm(obj/item/bodypart/arm) + var/severity switch(arm.brute_dam) if(45 to 50) - arm.force_wound_upwards(/datum/wound/blunt/critical, wound_source = "hulk smashing") + severity = WOUND_SEVERITY_CRITICAL if(41 to 45) - arm.force_wound_upwards(/datum/wound/blunt/severe, wound_source = "hulk smashing") + severity = WOUND_SEVERITY_SEVERE if(35 to 41) - arm.force_wound_upwards(/datum/wound/blunt/moderate, wound_source = "hulk smashing") + severity = WOUND_SEVERITY_MODERATE + + if (isnull(severity)) + return + + owner.cause_wound_of_type_and_severity(WOUND_BLUNT, arm, severity, wound_source = "hulk smashing") /datum/mutation/human/hulk/on_life(seconds_per_tick, times_fired) if(owner.health < owner.crit_threshold) @@ -256,4 +262,17 @@ yeeted_person.throw_at(T, 10, 6, the_hulk, TRUE, TRUE) log_combat(the_hulk, yeeted_person, "has thrown by tail") +/datum/mutation/human/hulk/wizardly + species_allowed = null //yes skeleton/lizard hulk - note that species that dont have skintone changing (like skellies) get custom handling + health_req = 0 + instability = 0 + scream_delay = 2.5 SECONDS // halved to be more annoying (spell doesn't last long anyways) + /// List of traits to add/remove when someone gets this mutation. + mutation_traits = list( + TRAIT_HULK, + TRAIT_IGNOREDAMAGESLOWDOWN, + TRAIT_PUSHIMMUNE, + TRAIT_STUNIMMUNE, + ) // no chunk + #undef HULK_TAILTHROW_STEPS diff --git a/code/datums/mutations/radioactive.dm b/code/datums/mutations/radioactive.dm index 4f1edf721eddc..8f710bfa497a4 100644 --- a/code/datums/mutations/radioactive.dm +++ b/code/datums/mutations/radioactive.dm @@ -12,7 +12,7 @@ /datum/mutation/human/radioactive/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) . = ..() if(!(type in visual_indicators)) - visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "radiation", -MUTATIONS_LAYER)) + visual_indicators[type] = list(mutable_appearance('icons/mob/effects/genetics.dmi', "radiation", -MUTATIONS_LAYER)) /datum/mutation/human/radioactive/get_visual_indicator() return visual_indicators[type][1] diff --git a/code/datums/mutations/sight.dm b/code/datums/mutations/sight.dm index cfe2b71f6d545..8b26f6ca268f0 100644 --- a/code/datums/mutations/sight.dm +++ b/code/datums/mutations/sight.dm @@ -140,7 +140,7 @@ /datum/mutation/human/laser_eyes/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) ..() if(!(type in visual_indicators)) - visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "lasereyes", -FRONT_MUTATIONS_LAYER)) + visual_indicators[type] = list(mutable_appearance('icons/mob/effects/genetics.dmi', "lasereyes", -FRONT_MUTATIONS_LAYER)) /datum/mutation/human/laser_eyes/on_acquiring(mob/living/carbon/human/H) . = ..() @@ -166,7 +166,7 @@ to_chat(source, span_warning("You shoot with your laser eyes!")) source.changeNext_move(CLICK_CD_RANGE) source.newtonian_move(get_dir(target, source)) - var/obj/projectile/beam/laser_eyes/LE = new(source.loc) + var/obj/projectile/beam/laser/laser_eyes/LE = new(source.loc) LE.firer = source LE.def_zone = ran_zone(source.zone_selected) LE.preparePixelProjectile(target, source, modifiers) @@ -174,9 +174,9 @@ playsound(source, 'sound/weapons/taser2.ogg', 75, TRUE) ///Projectile type used by laser eyes -/obj/projectile/beam/laser_eyes +/obj/projectile/beam/laser/laser_eyes name = "beam" - icon = 'icons/effects/genetics.dmi' + icon = 'icons/mob/effects/genetics.dmi' icon_state = "eyelasers" /datum/mutation/human/illiterate diff --git a/code/datums/mutations/speech.dm b/code/datums/mutations/speech.dm index 8828cd4a1ea9a..4c78c19610439 100644 --- a/code/datums/mutations/speech.dm +++ b/code/datums/mutations/speech.dm @@ -192,12 +192,12 @@ /datum/mutation/human/stoner/on_acquiring(mob/living/carbon/human/owner) ..() - owner.grant_language(/datum/language/beachbum, TRUE, TRUE, LANGUAGE_STONER) + owner.grant_language(/datum/language/beachbum, source = LANGUAGE_STONER) owner.add_blocked_language(subtypesof(/datum/language) - /datum/language/beachbum, LANGUAGE_STONER) /datum/mutation/human/stoner/on_losing(mob/living/carbon/human/owner) ..() - owner.remove_language(/datum/language/beachbum, TRUE, TRUE, LANGUAGE_STONER) + owner.remove_language(/datum/language/beachbum, source = LANGUAGE_STONER) owner.remove_blocked_language(subtypesof(/datum/language) - /datum/language/beachbum, LANGUAGE_STONER) /datum/mutation/human/medieval diff --git a/code/datums/mutations/telekinesis.dm b/code/datums/mutations/telekinesis.dm index b06ac8139edaf..53d8beb56ff50 100644 --- a/code/datums/mutations/telekinesis.dm +++ b/code/datums/mutations/telekinesis.dm @@ -13,7 +13,7 @@ /datum/mutation/human/telekinesis/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) ..() if(!(type in visual_indicators)) - visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "telekinesishead", -MUTATIONS_LAYER)) + visual_indicators[type] = list(mutable_appearance('icons/mob/effects/genetics.dmi', "telekinesishead", -MUTATIONS_LAYER)) /datum/mutation/human/telekinesis/on_acquiring(mob/living/carbon/human/H) . = ..() diff --git a/code/datums/mutations/tongue_spike.dm b/code/datums/mutations/tongue_spike.dm index cde1bcaf6fea0..5d210c344b516 100644 --- a/code/datums/mutations/tongue_spike.dm +++ b/code/datums/mutations/tongue_spike.dm @@ -130,7 +130,7 @@ return var/datum/action/send_chems/chem_action = new(src) - chem_action.transfered_ref = WEAKREF(embedded_mob) + chem_action.transferred_ref = WEAKREF(embedded_mob) chem_action.Grant(fired_by) to_chat(fired_by, span_notice("Link established! Use the \"Transfer Chemicals\" ability \ @@ -154,7 +154,7 @@ check_flags = AB_CHECK_CONSCIOUS /// Weakref to the mob target that we transfer chemicals to on activation - var/datum/weakref/transfered_ref + var/datum/weakref/transferred_ref /datum/action/send_chems/New(Target) . = ..() @@ -168,12 +168,12 @@ if(!ishuman(owner) || !owner.reagents) return FALSE var/mob/living/carbon/human/transferer = owner - var/mob/living/carbon/human/transfered = transfered_ref?.resolve() - if(!ishuman(transfered)) + var/mob/living/carbon/human/transferred = transferred_ref?.resolve() + if(!ishuman(transferred)) return FALSE - to_chat(transfered, span_warning("You feel a tiny prick!")) - transferer.reagents.trans_to(transfered, transferer.reagents.total_volume, 1, 1, 0, transfered_by = transferer) + to_chat(transferred, span_warning("You feel a tiny prick!")) + transferer.reagents.trans_to(transferred, transferer.reagents.total_volume, 1, 1, 0, transferred_by = transferer) var/obj/item/hardened_spike/chem/chem_spike = target var/obj/item/bodypart/spike_location = chem_spike.check_embedded() diff --git a/code/datums/mutations/touch.dm b/code/datums/mutations/touch.dm index 1f1cefe1cbe65..3f798ba52b216 100644 --- a/code/datums/mutations/touch.dm +++ b/code/datums/mutations/touch.dm @@ -38,7 +38,7 @@ ///This var decides if the spell should chain, dictated by presence of power chromosome var/chain = FALSE ///Affects damage, should do about 1 per limb - var/zap_power = 7500 + var/zap_power = 3e6 ///Range of tesla shock bounces var/zap_range = 7 ///flags that dictate what the tesla shock can interact with, Can only damage mobs, Cannot damage machines or generate energy diff --git a/code/datums/mutations/void_magnet.dm b/code/datums/mutations/void_magnet.dm index 56b22d664a851..48f04eda636a7 100644 --- a/code/datums/mutations/void_magnet.dm +++ b/code/datums/mutations/void_magnet.dm @@ -60,7 +60,7 @@ /datum/action/cooldown/spell/void/cursed/proc/on_life(mob/living/source, seconds_per_tick, times_fired) SIGNAL_HANDLER - if(!isliving(source) || IS_IN_STASIS(source) || source.stat == DEAD || source.notransform) + if(!isliving(source) || HAS_TRAIT(source, TRAIT_STASIS) || source.stat == DEAD || HAS_TRAIT(source, TRAIT_NO_TRANSFORM)) return if(!is_valid_target(source)) diff --git a/code/datums/mutations/webbing.dm b/code/datums/mutations/webbing.dm index 4fce0e29da03b..0fda118d0ed60 100644 --- a/code/datums/mutations/webbing.dm +++ b/code/datums/mutations/webbing.dm @@ -5,12 +5,12 @@ quality = POSITIVE text_gain_indication = "Your skin feels webby." instability = 15 - power_path = /datum/action/cooldown/lay_web/genetic + power_path = /datum/action/cooldown/mob_cooldown/lay_web/genetic energy_coeff = 1 /datum/mutation/human/webbing/modify() . = ..() - var/datum/action/cooldown/lay_web/genetic/to_modify = . + var/datum/action/cooldown/mob_cooldown/lay_web/genetic/to_modify = . if(!istype(to_modify)) // null or invalid return diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index e766131a8aa6e..696c4c2957d67 100644 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -153,7 +153,7 @@ return #define EQUIP_OUTFIT_ITEM(item_path, slot_name) if(##item_path) { \ - user.equip_to_slot_or_del(SSwardrobe.provide_type(##item_path, user), ##slot_name, TRUE); \ + user.equip_to_slot_or_del(SSwardrobe.provide_type(##item_path, user), ##slot_name, TRUE, indirect_action = TRUE); \ var/obj/item/outfit_item = user.get_item_by_slot(##slot_name); \ if (outfit_item && outfit_item.type == ##item_path) { \ outfit_item.on_outfit_equip(user, visualsOnly, ##slot_name); \ diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm index a8fad8ac337f9..6175dd157c43d 100644 --- a/code/datums/progressbar.dm +++ b/code/datums/progressbar.dm @@ -16,12 +16,17 @@ var/last_progress = 0 ///Variable to ensure smooth visual stacking on multiple progress bars. var/listindex = 0 - + ///The type of our last value for bar_loc, for debugging + var/location_type + ///Where to draw the progress bar above the icon + var/offset_y /datum/progressbar/New(mob/User, goal_number, atom/target) . = ..() if (!istype(target)) - EXCEPTION("Invalid target given") + stack_trace("Invalid target [target] passed in") + qdel(src) + return if(QDELETED(User) || !istype(User)) stack_trace("/datum/progressbar created with [isnull(User) ? "null" : "invalid"] user") qdel(src) @@ -32,7 +37,13 @@ return goal = goal_number bar_loc = target - bar = image('icons/effects/progessbar.dmi', bar_loc, "prog_bar_0") + location_type = bar_loc.type + + var/list/icon_offsets = target.get_oversized_icon_offsets() + var/offset_x = icon_offsets["x"] + offset_y = icon_offsets["y"] + + bar = image('icons/effects/progressbar.dmi', bar_loc, "prog_bar_0", pixel_x = offset_x) SET_PLANE_EXPLICIT(bar, ABOVE_HUD_PLANE, User) bar.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA user = User @@ -58,8 +69,8 @@ continue progress_bar.listindex-- - progress_bar.bar.pixel_y = 32 + (PROGRESSBAR_HEIGHT * (progress_bar.listindex - 1)) - var/dist_to_travel = 32 + (PROGRESSBAR_HEIGHT * (progress_bar.listindex - 1)) - PROGRESSBAR_HEIGHT + progress_bar.bar.pixel_y = world.icon_size + offset_y + (PROGRESSBAR_HEIGHT * (progress_bar.listindex - 1)) + var/dist_to_travel = world.icon_size + offset_y + (PROGRESSBAR_HEIGHT * (progress_bar.listindex - 1)) - PROGRESSBAR_HEIGHT animate(progress_bar.bar, pixel_y = dist_to_travel, time = PROGRESSBAR_ANIMATION_TIME, easing = SINE_EASING) LAZYREMOVEASSOC(user.progressbars, bar_loc, src) @@ -114,7 +125,7 @@ bar.pixel_y = 0 bar.alpha = 0 user_client.images += bar - animate(bar, pixel_y = 32 + (PROGRESSBAR_HEIGHT * (listindex - 1)), alpha = 255, time = PROGRESSBAR_ANIMATION_TIME, easing = SINE_EASING) + animate(bar, pixel_y = world.icon_size + offset_y + (PROGRESSBAR_HEIGHT * (listindex - 1)), alpha = 255, time = PROGRESSBAR_ANIMATION_TIME, easing = SINE_EASING) ///Updates the progress bar image visually. @@ -135,6 +146,13 @@ QDEL_IN(src, PROGRESSBAR_ANIMATION_TIME) +///Progress bars are very generic, and what hangs a ref to them depends heavily on the context in which they're used +///So let's make hunting harddels easier yeah? +/datum/progressbar/dump_harddel_info() + if(harddel_deets_dumped) + return + harddel_deets_dumped = TRUE + return "Owner's type: [location_type]" #undef PROGRESSBAR_ANIMATION_TIME #undef PROGRESSBAR_HEIGHT diff --git a/code/datums/proximity_monitor/fields/gravity.dm b/code/datums/proximity_monitor/fields/gravity.dm index 0f6e8ba9d5510..e26042676576b 100644 --- a/code/datums/proximity_monitor/fields/gravity.dm +++ b/code/datums/proximity_monitor/fields/gravity.dm @@ -15,7 +15,7 @@ return if(HAS_TRAIT(target, TRAIT_FORCED_GRAVITY)) return - target.AddElement(/datum/element/forced_gravity, gravity_value) + target.AddElement(/datum/element/forced_gravity, gravity_value, can_override = TRUE) modified_turfs[target] = gravity_value /datum/proximity_monitor/advanced/gravity/cleanup_field_turf(turf/target) @@ -23,7 +23,7 @@ if(isnull(modified_turfs[target])) return var/grav_value = modified_turfs[target] || 0 - target.RemoveElement(/datum/element/forced_gravity, grav_value) + target.RemoveElement(/datum/element/forced_gravity, grav_value, can_override = TRUE) modified_turfs -= target // Subtype which pops up a balloon alert when a mob enters the field diff --git a/code/datums/proximity_monitor/proximity_monitor.dm b/code/datums/proximity_monitor/proximity_monitor.dm index c7c8165a431ab..fc28212202d97 100644 --- a/code/datums/proximity_monitor/proximity_monitor.dm +++ b/code/datums/proximity_monitor/proximity_monitor.dm @@ -11,7 +11,7 @@ var/static/list/loc_connections = list( COMSIG_ATOM_ENTERED = PROC_REF(on_entered), COMSIG_ATOM_EXITED = PROC_REF(on_uncrossed), - COMSIG_ATOM_INITIALIZED_ON = PROC_REF(on_entered), + COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON = PROC_REF(on_entered), ) /datum/proximity_monitor/New(atom/_host, range, _ignore_if_not_on_turf = TRUE) diff --git a/code/datums/quirks/_quirk.dm b/code/datums/quirks/_quirk.dm index 8e27619f9ba9c..e31517d0f9661 100644 --- a/code/datums/quirks/_quirk.dm +++ b/code/datums/quirks/_quirk.dm @@ -173,7 +173,7 @@ var/mob/living/carbon/human/human_holder = quirk_holder - var/where = human_holder.equip_in_one_of_slots(quirk_item, valid_slots, qdel_on_fail = FALSE) || default_location + var/where = human_holder.equip_in_one_of_slots(quirk_item, valid_slots, qdel_on_fail = FALSE, indirect_action = TRUE) || default_location if(where == LOCATION_BACKPACK) open_backpack = TRUE @@ -199,32 +199,25 @@ * Arguments: * * Medical- If we want the long, fancy descriptions that show up in medical records, or if not, just the name * * Category- Which types of quirks we want to print out. Defaults to everything + * * from_scan- If the source of this call is like a health analyzer or HUD, in which case QUIRK_HIDE_FROM_MEDICAL hides the quirk. */ -/mob/living/proc/get_quirk_string(medical, category = CAT_QUIRK_ALL) //helper string. gets a string of all the quirks the mob has +/mob/living/proc/get_quirk_string(medical = FALSE, category = CAT_QUIRK_ALL, from_scan = FALSE) var/list/dat = list() - switch(category) - if(CAT_QUIRK_ALL) - for(var/V in quirks) - var/datum/quirk/T = V - 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) - 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) - dat += medical ? T.medical_record_text : T.name + for(var/datum/quirk/candidate as anything in quirks) + if(from_scan & candidate.quirk_flags & QUIRK_HIDE_FROM_SCAN) + continue + switch(category) + if(CAT_QUIRK_MAJOR_DISABILITY) + if(candidate.value >= -4) + continue + if(CAT_QUIRK_MINOR_DISABILITY) + if(!ISINRANGE(candidate.value, -4, -1)) + continue + if(CAT_QUIRK_NOTES) + if(candidate.value < 0) + continue + dat += medical ? candidate.medical_record_text : candidate.name + if(!dat.len) return medical ? "No issues have been declared." : "None" return medical ? dat.Join("
") : dat.Join(", ") diff --git a/code/datums/quirks/negative_quirks.dm b/code/datums/quirks/negative_quirks.dm deleted file mode 100644 index 648043ec41a24..0000000000000 --- a/code/datums/quirks/negative_quirks.dm +++ /dev/null @@ -1,1208 +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 evenly weighted objects are fine, though." - icon = FA_ICON_HIKING - value = -8 - quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED - gain_text = span_danger("Your back REALLY hurts!") - lose_text = span_notice("Your back feels better.") - medical_record_text = "Patient scans indicate severe and chronic back pain." - hardcore_value = 4 - mail_goodies = list(/obj/item/cane) - var/datum/weakref/backpack - -/datum/quirk/badback/add(client/client_source) - var/mob/living/carbon/human/human_holder = quirk_holder - var/obj/item/storage/backpack/equipped_backpack = human_holder.back - if(istype(equipped_backpack)) - quirk_holder.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) - quirk_holder.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 - - quirk_holder.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) - quirk_holder.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 = FA_ICON_TINT - value = -8 - mob_trait = TRAIT_BLOOD_DEFICIENCY - gain_text = span_danger("You feel your vigor slowly fading away.") - lose_text = span_notice("You feel vigorous again.") - medical_record_text = "Patient requires regular treatment for blood loss due to low production of blood." - hardcore_value = 8 - quirk_flags = QUIRK_HUMAN_ONLY - mail_goodies = list(/obj/item/reagent_containers/blood/o_minus) // universal blood type that is safe for all - var/min_blood = BLOOD_VOLUME_SAFE - 25 // just barely survivable without treatment - -/datum/quirk/blooddeficiency/post_add() - if(!ishuman(quirk_holder)) - return - - // for making sure the roundstart species has the right blood pack sent to them - var/mob/living/carbon/human/carbon_target = quirk_holder - carbon_target.dna.species.update_quirk_mail_goodies(carbon_target, src) - -/** - * Makes the mob lose blood from having the blood deficiency quirk, if possible - * - * Arguments: - * * seconds_per_tick - */ -/datum/quirk/blooddeficiency/proc/lose_blood(seconds_per_tick) - if(quirk_holder.stat == DEAD) - return - - var/mob/living/carbon/human/carbon_target = quirk_holder - if(HAS_TRAIT(carbon_target, TRAIT_NOBLOOD) && isnull(carbon_target.dna.species.exotic_blood)) //can't lose blood if your species doesn't have any - return - - if (carbon_target.blood_volume <= min_blood) - return - // Ensures that we don't reduce total blood volume below min_blood. - carbon_target.blood_volume = max(min_blood, carbon_target.blood_volume - carbon_target.dna.species.blood_deficiency_drain_rate * seconds_per_tick) - -/datum/quirk/item_quirk/blindness - name = "Blind" - desc = "You are completely blind, nothing can counteract this." - icon = FA_ICON_EYE_SLASH - value = -16 - gain_text = span_danger("You can't see anything.") - lose_text = span_notice("You miraculously gain back your vision.") - medical_record_text = "Patient has permanent blindness." - hardcore_value = 15 - quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE - mail_goodies = list(/obj/item/clothing/glasses/sunglasses, /obj/item/cane/white) - -/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(client/client_source) - 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 = FA_ICON_BRAIN - value = -12 - gain_text = span_danger("You feel smooth.") - lose_text = span_notice("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 - quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES - mail_goodies = list(/obj/item/storage/pill_bottle/mannitol/braintumor) - -/datum/quirk/item_quirk/brainproblems/add_unique(client/client_source) - 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(seconds_per_tick) - if(quirk_holder.stat == DEAD) - return - - if(HAS_TRAIT(quirk_holder, TRAIT_TUMOR_SUPPRESSED)) - return - - quirk_holder.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.2 * seconds_per_tick) - -/datum/quirk/item_quirk/deafness - name = "Deaf" - desc = "You are incurably deaf." - icon = FA_ICON_DEAF - value = -8 - mob_trait = TRAIT_DEAF - gain_text = span_danger("You can't hear anything.") - lose_text = span_notice("You're able to hear again!") - medical_record_text = "Patient's cochlear nerve is incurably damaged." - hardcore_value = 12 - mail_goodies = list(/obj/item/clothing/mask/whistle) - -/datum/quirk/item_quirk/deafness/add_unique(client/client_source) - give_item_to_holder(/obj/item/clothing/accessory/deaf_pin, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) - -/datum/quirk/depression - name = "Depression" - desc = "You sometimes just hate life." - icon = FA_ICON_FROWN - mob_trait = TRAIT_DEPRESSION - value = -3 - gain_text = span_danger("You start feeling depressed.") - lose_text = span_notice("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." - quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED - hardcore_value = 2 - mail_goodies = list(/obj/item/storage/pill_bottle/happinesspsych) - -/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 = FA_ICON_TOOLBOX - value = -2 - medical_record_text = "Patient demonstrates an unnatural attachment to a family heirloom." - hardcore_value = 1 - quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES|QUIRK_MOODLET_BASED - /// A weak reference to our heirloom. - var/datum/weakref/heirloom - mail_goodies = list(/obj/item/storage/secure/briefcase) - -/datum/quirk/item_quirk/family_heirloom/add_unique(client/client_source) - 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, span_boldnotice("A wave of existential dread runs over you as you realize 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())) - quirk_holder.clear_mood_event("family_heirloom_missing") - quirk_holder.add_mood_event("family_heirloom", /datum/mood_event/family_heirloom) - else - quirk_holder.clear_mood_event("family_heirloom") - quirk_holder.add_mood_event("family_heirloom_missing", /datum/mood_event/family_heirloom_missing) - -/datum/quirk/item_quirk/family_heirloom/remove() - quirk_holder.clear_mood_event("family_heirloom_missing") - quirk_holder.clear_mood_event("family_heirloom") - -/datum/quirk/glass_jaw - name = "Glass Jaw" - desc = "You have a very fragile jaw. Any sufficiently hard blow to your head might knock you out." - icon = FA_ICON_HAND_FIST - value = -4 - gain_text = span_danger("Your jaw feels loose.") - lose_text = span_notice("Your jaw feels fitting again.") - medical_record_text = "Patient is absurdly easy to knock out. Do not allow them near a boxing ring." - hardcore_value = 4 - mail_goodies = list( - /obj/item/clothing/gloves/boxing, - /obj/item/clothing/mask/luchador/rudos, - ) - -/datum/quirk/glass_jaw/New() - . = ..() - //randomly picks between blue or red equipment for goodies - if(prob(50)) - mail_goodies = list( - /obj/item/clothing/gloves/boxing, - /obj/item/clothing/mask/luchador/rudos, - ) - else - mail_goodies = list( - /obj/item/clothing/gloves/boxing/blue, - /obj/item/clothing/mask/luchador/tecnicos, - ) - -/datum/quirk/glass_jaw/add(client/client_source) - RegisterSignal(quirk_holder, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(punch_out)) - -/datum/quirk/glass_jaw/remove() - UnregisterSignal(quirk_holder, COMSIG_MOB_APPLY_DAMAGE) - -/datum/quirk/glass_jaw/proc/punch_out(mob/living/carbon/source, damage, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, attacking_item) - SIGNAL_HANDLER - if((damagetype != BRUTE) || (def_zone != BODY_ZONE_HEAD)) - return - var/actual_damage = damage - (damage * blocked/100) - //only roll for knockouts at 5 damage or more - if(actual_damage < 5) - return - //blunt items are more likely to knock out, but sharp ones are still capable of doing it - if(prob(CEILING(actual_damage * (sharpness & (SHARP_EDGED|SHARP_POINTY) ? 0.65 : 1), 1))) - source.visible_message( - span_warning("[source] gets knocked out!"), - span_userdanger("You are knocked out!"), - vision_distance = COMBAT_MESSAGE_RANGE, - ) - source.Unconscious(3 SECONDS) - -/datum/quirk/frail - name = "Frail" - desc = "You have skin of paper and bones of glass! You suffer wounds much more easily than most." - icon = FA_ICON_SKULL - value = -6 - mob_trait = TRAIT_EASILY_WOUNDED - gain_text = span_danger("You feel frail.") - lose_text = span_notice("You feel sturdy again.") - medical_record_text = "Patient is absurdly easy to injure. Please take all due diligence to avoid possible malpractice suits." - hardcore_value = 4 - mail_goodies = list(/obj/effect/spawner/random/medical/minor_healing) - -/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 = FA_ICON_BED - value = -2 - mob_trait = TRAIT_HEAVY_SLEEPER - gain_text = span_danger("You feel sleepy.") - lose_text = span_notice("You feel awake again.") - medical_record_text = "Patient has abnormal sleep study results and is difficult to wake up." - hardcore_value = 2 - mail_goodies = list( - /obj/item/clothing/glasses/blindfold, - /obj/item/bedsheet/random, - /obj/item/clothing/under/misc/pj/red, - /obj/item/clothing/head/costume/nightcap/red, - /obj/item/clothing/under/misc/pj/blue, - /obj/item/clothing/head/costume/nightcap/blue, - /obj/item/pillow/random, - ) - -/datum/quirk/hypersensitive - name = "Hypersensitive" - desc = "For better or worse, everything seems to affect your mood more than it should." - icon = FA_ICON_FLUSHED - value = -2 - gain_text = span_danger("You seem to make a big deal out of everything.") - lose_text = span_notice("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 - mail_goodies = list(/obj/effect/spawner/random/entertainment/plushie_delux) - -/datum/quirk/hypersensitive/add(client/client_source) - if (quirk_holder.mob_mood) - quirk_holder.mob_mood.mood_modifier += 0.5 - -/datum/quirk/hypersensitive/remove() - if (quirk_holder.mob_mood) - quirk_holder.mob_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 = FA_ICON_COCKTAIL - value = -2 - mob_trait = TRAIT_LIGHT_DRINKER - gain_text = span_notice("Just the thought of drinking alcohol makes your head spin.") - lose_text = span_danger("You're no longer severely affected by alcohol.") - medical_record_text = "Patient demonstrates a low tolerance for alcohol. (Wimp)" - hardcore_value = 3 - mail_goodies = list(/obj/item/reagent_containers/cup/glass/waterbottle) - -/datum/quirk/item_quirk/nearsighted - name = "Nearsighted" - desc = "You are nearsighted without prescription glasses, but spawn with a pair." - icon = FA_ICON_GLASSES - value = -4 - gain_text = span_danger("Things far away from you start looking blurry.") - lose_text = span_notice("You start seeing faraway things normally again.") - medical_record_text = "Patient requires prescription glasses in order to counteract nearsightedness." - hardcore_value = 5 - quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE - mail_goodies = list(/obj/item/clothing/glasses/regular) // extra pair if orginal one gets broken by somebody mean - -/datum/quirk/item_quirk/nearsighted/add_unique(client/client_source) - var/glasses_name = client_source?.prefs.read_preference(/datum/preference/choiced/glasses) || "Regular" - var/obj/item/clothing/glasses/glasses_type - - glasses_name = glasses_name == "Random" ? pick(GLOB.nearsighted_glasses) : glasses_name - glasses_type = GLOB.nearsighted_glasses[glasses_name] - - give_item_to_holder(glasses_type, list( - LOCATION_EYES = ITEM_SLOT_EYES, - LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, - LOCATION_HANDS = ITEM_SLOT_HANDS, - )) - -/datum/quirk/item_quirk/nearsighted/add(client/client_source) - 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 instinctively act careful, and constantly feel a sense of dread." - icon = FA_ICON_LIGHTBULB - value = -3 - medical_record_text = "Patient demonstrates a fear of the dark. (Seriously?)" - hardcore_value = 5 - mail_goodies = list(/obj/effect/spawner/random/engineering/flashlight) - -/datum/quirk/nyctophobia/add(client/client_source) - RegisterSignal(quirk_holder, COMSIG_MOVABLE_MOVED, PROC_REF(on_holder_moved)) - -/datum/quirk/nyctophobia/remove() - UnregisterSignal(quirk_holder, COMSIG_MOVABLE_MOVED) - quirk_holder.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 - - if(HAS_TRAIT(quirk_holder, TRAIT_FEARLESS)) - 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) - quirk_holder.clear_mood_event("nyctophobia") - return - - if(quirk_holder.m_intent == MOVE_INTENT_RUN) - to_chat(quirk_holder, span_warning("Easy, easy, take it slow... you're in the dark...")) - quirk_holder.toggle_move_intent() - quirk_holder.add_mood_event("nyctophobia", /datum/mood_event/nyctophobia) - -/datum/quirk/softspoken - name = "Soft-Spoken" - desc = "You are soft-spoken, and your voice is hard to hear." - icon = FA_ICON_COMMENT - value = -2 - mob_trait = TRAIT_SOFTSPOKEN - gain_text = span_danger("You feel like you're speaking more quietly.") - lose_text = span_notice("You feel like you're speaking louder.") - medical_record_text = "Patient is soft-spoken and difficult to hear." - -/datum/quirk/clumsy - name = "Clumsy" - desc = "You're clumsy, a goofball, a silly dude. You big loveable himbo/bimbo you! Hope you weren't planning on using your hands for anything that takes even a LICK of dexterity." - icon = FA_ICON_FACE_DIZZY - value = -8 - mob_trait = TRAIT_CLUMSY - gain_text = span_danger("You feel your IQ sink like your brain is liquid.") - lose_text = span_notice("You feel like your IQ went up to at least average.") - medical_record_text = "Patient has demonstrated an extreme difficulty with high motor skill paired with an inability to demonstrate critical thinking." - -/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 = FA_ICON_PEACE - value = -8 - mob_trait = TRAIT_PACIFISM - gain_text = span_danger("You feel repulsed by the thought of violence!") - lose_text = span_notice("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 - mail_goodies = list(/obj/effect/spawner/random/decoration/flower, /obj/effect/spawner/random/contraband/cannabis) // flower power - -/datum/quirk/bighands - name = "Big Hands" - desc = "You have big hands, it sure does make it hard to use a lot of things." - icon = FA_ICON_HAND_DOTS - value = -6 - mob_trait = TRAIT_CHUNKYFINGERS - gain_text = span_danger("Your hands are huge! You can't use small things anymore!") - lose_text = span_notice("Your hands are back to normal.") - medical_record_text = "Patient has unusually large hands. Made me question my masculinity..." - hardcore_value = 5 - -/datum/quirk/paraplegic - name = "Paraplegic" - desc = "Your legs do not function. Nothing will ever fix this. But hey, free wheelchair!" - icon = FA_ICON_WHEELCHAIR - value = -12 - 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 - mail_goodies = list(/obj/vehicle/ridden/wheelchair/motorized) //yes a fullsized unfolded motorized wheelchair does fit - -/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(/datum/award/score/hardcore_random) >= 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(client/client_source) - 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 = FA_ICON_BULLSEYE - value = -4 - mob_trait = TRAIT_POOR_AIM - medical_record_text = "Patient possesses a strong tremor in both hands." - hardcore_value = 3 - mail_goodies = list(/obj/item/cardboard_cutout) // for target practice - -/datum/quirk/prosopagnosia - name = "Prosopagnosia" - desc = "You have a mental disorder that prevents you from being able to recognize faces at all." - icon = FA_ICON_USER_SECRET - value = -4 - mob_trait = TRAIT_PROSOPAGNOSIA - medical_record_text = "Patient suffers from prosopagnosia and cannot recognize faces." - hardcore_value = 5 - mail_goodies = list(/obj/item/skillchip/appraiser) // bad at recognizing faces but good at recognizing IDs - -/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 = -3 - medical_record_text = "During physical examination, patient was found to have a prosthetic limb." - hardcore_value = 3 - quirk_flags = QUIRK_HUMAN_ONLY // while this technically changes appearance, we don't want it to be shown on the dummy because it's randomized at roundstart - mail_goodies = list(/obj/item/weldingtool/mini, /obj/item/stack/cable_coil/five) - /// The slot to replace, in string form - var/slot_string = "limb" - /// the original limb from before the prosthetic was applied - var/obj/item/bodypart/old_limb - -/datum/quirk/prosthetic_limb/add_unique(client/client_source) - 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/prosthetic - switch(limb_slot) - if(BODY_ZONE_L_ARM) - prosthetic = new /obj/item/bodypart/arm/left/robot/surplus - slot_string = "left arm" - if(BODY_ZONE_R_ARM) - prosthetic = new /obj/item/bodypart/arm/right/robot/surplus - slot_string = "right arm" - if(BODY_ZONE_L_LEG) - prosthetic = new /obj/item/bodypart/leg/left/robot/surplus - slot_string = "left leg" - if(BODY_ZONE_R_LEG) - prosthetic = new /obj/item/bodypart/leg/right/robot/surplus - slot_string = "right leg" - old_limb = human_holder.return_and_replace_bodypart(prosthetic, special = TRUE) - -/datum/quirk/prosthetic_limb/post_add() - to_chat(quirk_holder, span_boldannounce("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/prosthetic_limb/remove() - var/mob/living/carbon/human/human_holder = quirk_holder - human_holder.del_and_replace_bodypart(old_limb, special = TRUE) - old_limb = null - -/datum/quirk/quadruple_amputee - name = "Quadruple Amputee" - desc = "Oops! All Prosthetics! Due to some truly cruel cosmic punishment, all your limbs have been taken from you." - icon = "tg-prosthetic-full" - value = -6 - medical_record_text = "During physical examination, patient was found to have all prosthetic limbs." - hardcore_value = 6 - quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE - -/datum/quirk/quadruple_amputee/add_unique(client/client_source) - var/mob/living/carbon/human/human_holder = quirk_holder - human_holder.del_and_replace_bodypart(new /obj/item/bodypart/arm/left/robot/surplus, special = TRUE) - human_holder.del_and_replace_bodypart(new /obj/item/bodypart/arm/right/robot/surplus, special = TRUE) - human_holder.del_and_replace_bodypart(new /obj/item/bodypart/leg/left/robot/surplus, special = TRUE) - human_holder.del_and_replace_bodypart(new /obj/item/bodypart/leg/right/robot/surplus, special = TRUE) - -/datum/quirk/quadruple_amputee/post_add() - to_chat(quirk_holder, span_boldannounce("All your limbs have been replaced with surplus prosthetics. They are fragile and will easily come apart under duress. Additionally, \ - you need to use a welding tool and cables to repair them, 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 = FA_ICON_HANDSHAKE - value = -8 - mob_trait = TRAIT_GRABWEAKNESS - gain_text = span_danger("You feel like a pushover.") - lose_text = span_notice("You feel like standing up for yourself.") - medical_record_text = "Patient presents a notably unassertive personality and is easy to manipulate." - hardcore_value = 4 - mail_goodies = list(/obj/item/clothing/gloves/cargo_gauntlet) - -/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 = FA_ICON_GRIN_TONGUE_WINK - value = -8 - gain_text = span_userdanger("...") - lose_text = span_notice("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 - mail_goodies = list(/obj/item/storage/pill_bottle/lsdpsych) - /// Weakref to the trauma we give out - var/datum/weakref/added_trama_ref - -/datum/quirk/insanity/add(client/client_source) - if(!iscarbon(quirk_holder)) - return - var/mob/living/carbon/carbon_quirk_holder = quirk_holder - - // Setup our special RDS mild hallucination. - // Not a unique subtype so not to plague subtypesof, - // also as we inherit the names and values from our quirk. - var/datum/brain_trauma/mild/hallucinations/added_trauma = new() - added_trauma.resilience = TRAUMA_RESILIENCE_ABSOLUTE - added_trauma.name = name - added_trauma.desc = medical_record_text - added_trauma.scan_desc = lowertext(name) - added_trauma.gain_text = null - added_trauma.lose_text = null - - carbon_quirk_holder.gain_trauma(added_trauma) - added_trama_ref = WEAKREF(added_trauma) - -/datum/quirk/insanity/post_add() - if(!quirk_holder.mind || quirk_holder.mind.special_role) - return - // 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. - to_chat(quirk_holder, span_big(span_bold(span_info("Please note that your [lowertext(name)] 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/insanity/remove() - QDEL_NULL(added_trama_ref) - -/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 = FA_ICON_COMMENT_SLASH - value = -3 - gain_text = span_danger("You start worrying about what you're saying.") - lose_text = span_notice("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 - mail_goodies = list(/obj/item/storage/pill_bottle/psicodine) - var/dumb_thing = TRUE - -/datum/quirk/social_anxiety/add(client/client_source) - 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/moodmod - if(quirk_holder.mob_mood) - moodmod = (1+0.02*(50-(max(50, quirk_holder.mob_mood.mood_level*(7-quirk_holder.mob_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 successful filler roll, for 50% odds in a 15 word sentence - quirker.set_silence_if_lower(6 SECONDS) - 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_stutter(0.5 SECONDS) - var/list/message_data = quirker.treat_message(word, capitalize_message = FALSE) - new_message += message_data["message"] - 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 successful not talking roll - to_chat(quirker, span_danger("You retreat into yourself. You really don't feel up to talking.")) - quirker.set_silence_if_lower(10 SECONDS) - - 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_jitter_if_lower(20 SECONDS) - msg += "causing you to start fidgeting!" - if(2) - quirk_holder.set_stutter_if_lower(6 SECONDS) - msg += "causing you to start stuttering!" - if(3) - quirk_holder.Stun(2 SECONDS) - msg += "causing you to freeze up!" - - quirk_holder.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 = FA_ICON_PILLS - value = -6 - gain_text = span_danger("You suddenly feel the craving for drugs.") - medical_record_text = "Patient has a history of hard drugs." - hardcore_value = 4 - quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES - mail_goodies = list(/obj/effect/spawner/random/contraband/narcotics) - 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(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() - - 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(seconds_per_tick) - 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 = FA_ICON_SMOKING - value = -4 - gain_text = span_danger("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." - mail_goodies = list( - /obj/effect/spawner/random/entertainment/cigarette_pack, - /obj/effect/spawner/random/entertainment/cigar, - /obj/effect/spawner/random/entertainment/lighter, - /obj/item/clothing/mask/cigarette/pipe, - ) - -/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() - . = ..() - quirk_holder.add_mob_memory(/datum/memory/key/quirk_smoker, protagonist = quirk_holder, preferred_brand = initial(drug_container_type.name)) - // smoker lungs have 25% less health and healing - var/obj/item/organ/internal/lungs/smoker_lungs = quirk_holder.get_organ_slot(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(seconds_per_tick) - . = ..() - 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))) - quirk_holder.clear_mood_event("wrong_cigs") - return - quirk_holder.add_mood_event("wrong_cigs", /datum/mood_event/wrong_brand) - -/datum/quirk/item_quirk/chronic_illness - name = "Chronic Illness" - desc = "You have a chronic illness that requires constant medication to keep under control." - icon = FA_ICON_DISEASE - value = -12 - gain_text = span_danger("You feel a bit off today.") - lose_text = span_notice("You feel a bit better today.") - medical_record_text = "Patient has a chronic illness that requires constant medication to keep under control." - hardcore_value = 12 - mail_goodies = list(/obj/item/storage/pill_bottle/sansufentanyl) - -/datum/quirk/item_quirk/chronic_illness/add_unique(client/client_source) - var/datum/disease/chronic_illness/hms = new /datum/disease/chronic_illness() - quirk_holder.ForceContractDisease(hms) - give_item_to_holder(/obj/item/storage/pill_bottle/sansufentanyl, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK),flavour_text = "You've been provided with medication to help manage your condition. Take it regularly to avoid complications.") - give_item_to_holder(/obj/item/healthanalyzer/disease, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK)) - -/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 = FA_ICON_ANGRY - value = -10 - mob_trait = TRAIT_UNSTABLE - gain_text = span_danger("There's a lot on your mind right now.") - lose_text = span_notice("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 - mail_goodies = list(/obj/effect/spawner/random/entertainment/plushie) - -/datum/quirk/item_quirk/allergic - name = "Extreme Medicine Allergy" - desc = "Ever since you were a kid, you've been allergic to certain chemicals..." - icon = FA_ICON_PRESCRIPTION_BOTTLE - value = -6 - gain_text = span_danger("You feel your immune system shift.") - lose_text = span_notice("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 - quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES - mail_goodies = list(/obj/item/reagent_containers/hypospray/medipen) // epinephrine medipen stops allergic reactions - 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(client/client_source) - 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.add_mob_memory(/datum/memory/key/quirk_allergy, allergy_string = allergy_string) - 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(seconds_per_tick) - 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 * seconds_per_tick) - carbon_quirk_holder.reagents.add_reagent(/datum/reagent/toxin/histamine, 3 * seconds_per_tick) - if(SPT_PROB(10, seconds_per_tick)) - 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 = span_danger("You just want people to leave you alone.") - lose_text = span_notice("You could use a big hug.") - medical_record_text = "Patient has disdain for being touched. Potentially has undiagnosed haphephobia." - quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED - hardcore_value = 1 - mail_goodies = list(/obj/item/reagent_containers/spray/pepper) // show me on the doll where the bad man touched you - -/datum/quirk/bad_touch/add(client/client_source) - RegisterSignals(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) - if(quirk_holder.mob_mood.sanity <= SANITY_NEUTRAL) - quirk_holder.add_mood_event("bad_touch", /datum/mood_event/very_bad_touch) - else - quirk_holder.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 = FA_ICON_BOX_OPEN - value = -4 - medical_record_text = "Patient demonstrates a fear of tight spaces." - hardcore_value = 5 - quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES - mail_goodies = list(/obj/item/reagent_containers/syringe/convermol) // to help breathing - -/datum/quirk/claustrophobia/remove() - quirk_holder.clear_mood_event("claustrophobia") - -/datum/quirk/claustrophobia/process(seconds_per_tick) - if(quirk_holder.stat != CONSCIOUS || quirk_holder.IsSleeping() || quirk_holder.IsUnconscious()) - return - - if(HAS_TRAIT(quirk_holder, TRAIT_FEARLESS)) - 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)) - quirk_holder.clear_mood_event("claustrophobia") - return - - quirk_holder.add_mood_event("claustrophobia", /datum/mood_event/claustrophobia) - quirk_holder.losebreath += 0.25 // miss a breath one in four times - if(SPT_PROB(25, seconds_per_tick)) - 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/costume/santa) || istype(possible_saint_nick.head, /obj/item/clothing/head/helmet/space/santahat)) - return TRUE - - if(istype(possible_saint_nick.wear_suit, /obj/item/clothing/suit/space/santa)) - return TRUE - - return FALSE - -/datum/quirk/illiterate - name = "Illiterate" - desc = "You dropped out of school and are unable to read or write. This affects reading, writing, using computers and other electronics." - icon = FA_ICON_GRADUATION_CAP - value = -8 - mob_trait = TRAIT_ILLITERATE - medical_record_text = "Patient is not literate." - hardcore_value = 8 - mail_goodies = list(/obj/item/pai_card) // can read things for you - - -/datum/quirk/mute - name = "Mute" - desc = "For some reason you are completely unable to speak." - icon = FA_ICON_VOLUME_XMARK - value = -4 - mob_trait = TRAIT_MUTE - gain_text = span_danger("You find yourself unable to speak!") - lose_text = span_notice("You feel a growing strength in your vocal chords.") - medical_record_text = "The patient is unable to use their voice in any capacity." - hardcore_value = 4 - -/datum/quirk/body_purist - name = "Body Purist" - desc = "You believe your body is a temple and its natural form is an embodiment of perfection. Accordingly, you despise the idea of ever augmenting it with unnatural parts, cybernetic, prosthetic, or anything like it." - icon = FA_ICON_PERSON_RAYS - value = -2 - quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED - gain_text = span_danger("You now begin to hate the idea of having cybernetic implants.") - lose_text = span_notice("Maybe cybernetics aren't so bad. You now feel okay with augmentations and prosthetics.") - medical_record_text = "This patient has disclosed an extreme hatred for unnatural bodyparts and augmentations." - hardcore_value = 3 - mail_goodies = list(/obj/item/paper/pamphlet/cybernetics) - var/cybernetics_level = 0 - -/datum/quirk/body_purist/add(client/client_source) - check_cybernetics() - RegisterSignal(quirk_holder, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(on_organ_gain)) - RegisterSignal(quirk_holder, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(on_organ_lose)) - RegisterSignal(quirk_holder, COMSIG_CARBON_ATTACH_LIMB, PROC_REF(on_limb_gain)) - RegisterSignal(quirk_holder, COMSIG_CARBON_REMOVE_LIMB, PROC_REF(on_limb_lose)) - -/datum/quirk/body_purist/remove() - UnregisterSignal(quirk_holder, list( - COMSIG_CARBON_GAIN_ORGAN, - COMSIG_CARBON_LOSE_ORGAN, - COMSIG_CARBON_ATTACH_LIMB, - COMSIG_CARBON_REMOVE_LIMB, - )) - quirk_holder.clear_mood_event("body_purist") - -/datum/quirk/body_purist/proc/check_cybernetics() - var/mob/living/carbon/owner = quirk_holder - if(!istype(owner)) - return - for(var/obj/item/bodypart/limb as anything in owner.bodyparts) - if(!IS_ORGANIC_LIMB(limb)) - cybernetics_level++ - for(var/obj/item/organ/organ as anything in owner.organs) - if((organ.organ_flags & ORGAN_SYNTHETIC || organ.status == ORGAN_ROBOTIC) && !(organ.organ_flags & ORGAN_HIDDEN)) - cybernetics_level++ - update_mood() - -/datum/quirk/body_purist/proc/update_mood() - quirk_holder.clear_mood_event("body_purist") - if(cybernetics_level) - quirk_holder.add_mood_event("body_purist", /datum/mood_event/body_purist, -cybernetics_level * 10) - -/datum/quirk/body_purist/proc/on_organ_gain(datum/source, obj/item/organ/new_organ, special) - SIGNAL_HANDLER - if((new_organ.organ_flags & ORGAN_SYNTHETIC || new_organ.status == ORGAN_ROBOTIC) && !(new_organ.organ_flags & ORGAN_HIDDEN)) //why the fuck are there 2 of them - cybernetics_level++ - update_mood() - -/datum/quirk/body_purist/proc/on_organ_lose(datum/source, obj/item/organ/old_organ, special) - SIGNAL_HANDLER - if((old_organ.organ_flags & ORGAN_SYNTHETIC || old_organ.status == ORGAN_ROBOTIC) && !(old_organ.organ_flags & ORGAN_HIDDEN)) - cybernetics_level-- - update_mood() - -/datum/quirk/body_purist/proc/on_limb_gain(datum/source, obj/item/bodypart/new_limb, special) - SIGNAL_HANDLER - if(!IS_ORGANIC_LIMB(new_limb)) - cybernetics_level++ - update_mood() - -/datum/quirk/body_purist/proc/on_limb_lose(datum/source, obj/item/bodypart/old_limb, special) - SIGNAL_HANDLER - if(!IS_ORGANIC_LIMB(old_limb)) - cybernetics_level-- - update_mood() - -/datum/quirk/cursed - name = "Cursed" - desc = "You are cursed with bad luck. You are much more likely to suffer from accidents and mishaps. When it rains, it pours." - icon = FA_ICON_CLOUD_SHOWERS_HEAVY - value = -8 - mob_trait = TRAIT_CURSED - gain_text = span_danger("You feel like you're going to have a bad day.") - lose_text = span_notice("You feel like you're going to have a good day.") - medical_record_text = "Patient is cursed with bad luck." - hardcore_value = 8 - -/datum/quirk/cursed/add(client/client_source) - quirk_holder.AddComponent(/datum/component/omen/quirk) diff --git a/code/datums/quirks/negative_quirks/allergic.dm b/code/datums/quirks/negative_quirks/allergic.dm new file mode 100644 index 0000000000000..64b4c560bde96 --- /dev/null +++ b/code/datums/quirks/negative_quirks/allergic.dm @@ -0,0 +1,71 @@ +/datum/quirk/item_quirk/allergic + name = "Extreme Medicine Allergy" + desc = "Ever since you were a kid, you've been allergic to certain chemicals..." + icon = FA_ICON_PRESCRIPTION_BOTTLE + value = -6 + gain_text = span_danger("You feel your immune system shift.") + lose_text = span_notice("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 + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES + mail_goodies = list(/obj/item/reagent_containers/hypospray/medipen) // epinephrine medipen stops allergic reactions + var/list/allergies = list() + var/list/blacklist = list( + /datum/reagent/medicine/c2, + /datum/reagent/medicine/epinephrine, + /datum/reagent/medicine/adminordrazine, + /datum/reagent/medicine/adminordrazine/quantum_heal, + /datum/reagent/medicine/omnizine/godblood, + /datum/reagent/medicine/cordiolis_hepatico, + /datum/reagent/medicine/synaphydramine, + /datum/reagent/medicine/diphenhydramine, + /datum/reagent/medicine/sansufentanyl + ) + var/allergy_string + +/datum/quirk/item_quirk/allergic/add_unique(client/client_source) + 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/dogtag/allergy/dogtag = new(get_turf(human_holder), 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.add_mob_memory(/datum/memory/key/quirk_allergy, allergy_string = allergy_string) + 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(seconds_per_tick) + if(!iscarbon(quirk_holder)) + return + + if(HAS_TRAIT(quirk_holder, TRAIT_STASIS)) + 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 * seconds_per_tick) + carbon_quirk_holder.reagents.add_reagent(/datum/reagent/toxin/histamine, 3 * seconds_per_tick) + if(SPT_PROB(10, seconds_per_tick)) + carbon_quirk_holder.vomit(VOMIT_CATEGORY_DEFAULT) + carbon_quirk_holder.adjustOrganLoss(pick(ORGAN_SLOT_BRAIN,ORGAN_SLOT_APPENDIX,ORGAN_SLOT_LUNGS,ORGAN_SLOT_HEART,ORGAN_SLOT_LIVER,ORGAN_SLOT_STOMACH),10) diff --git a/code/datums/quirks/negative_quirks/bad_back.dm b/code/datums/quirks/negative_quirks/bad_back.dm new file mode 100644 index 0000000000000..b7c406361596f --- /dev/null +++ b/code/datums/quirks/negative_quirks/bad_back.dm @@ -0,0 +1,50 @@ +/datum/quirk/badback + name = "Bad Back" + desc = "Thanks to your poor posture, backpacks and other bags never sit right on your back. More evenly weighted objects are fine, though." + icon = FA_ICON_HIKING + value = -8 + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED + gain_text = span_danger("Your back REALLY hurts!") + lose_text = span_notice("Your back feels better.") + medical_record_text = "Patient scans indicate severe and chronic back pain." + hardcore_value = 4 + mail_goodies = list(/obj/item/cane) + var/datum/weakref/backpack + +/datum/quirk/badback/add(client/client_source) + var/mob/living/carbon/human/human_holder = quirk_holder + var/obj/item/storage/backpack/equipped_backpack = human_holder.back + if(istype(equipped_backpack)) + quirk_holder.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) + quirk_holder.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 + + quirk_holder.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) + quirk_holder.clear_mood_event("back_pain") + backpack = null + RegisterSignal(quirk_holder, COMSIG_MOB_EQUIPPED_ITEM, PROC_REF(on_equipped_item)) diff --git a/code/datums/quirks/negative_quirks/bad_touch.dm b/code/datums/quirks/negative_quirks/bad_touch.dm new file mode 100644 index 0000000000000..f3a5d967a0194 --- /dev/null +++ b/code/datums/quirks/negative_quirks/bad_touch.dm @@ -0,0 +1,31 @@ +/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 = span_danger("You just want people to leave you alone.") + lose_text = span_notice("You could use a big hug.") + medical_record_text = "Patient has disdain for being touched. Potentially has undiagnosed haphephobia." + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED + hardcore_value = 1 + mail_goodies = list(/obj/item/reagent_containers/spray/pepper) // show me on the doll where the bad man touched you + +/datum/quirk/bad_touch/add(client/client_source) + RegisterSignals(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) + if(quirk_holder.mob_mood.sanity <= SANITY_NEUTRAL) + quirk_holder.add_mood_event("bad_touch", /datum/mood_event/very_bad_touch) + else + quirk_holder.add_mood_event("bad_touch", /datum/mood_event/bad_touch) diff --git a/code/datums/quirks/negative_quirks/big_hands.dm b/code/datums/quirks/negative_quirks/big_hands.dm new file mode 100644 index 0000000000000..778ea6af8c370 --- /dev/null +++ b/code/datums/quirks/negative_quirks/big_hands.dm @@ -0,0 +1,10 @@ +/datum/quirk/bighands + name = "Big Hands" + desc = "You have big hands, it sure does make it hard to use a lot of things." + icon = FA_ICON_HAND_DOTS + value = -6 + mob_trait = TRAIT_CHUNKYFINGERS + gain_text = span_danger("Your hands are huge! You can't use small things anymore!") + lose_text = span_notice("Your hands are back to normal.") + medical_record_text = "Patient has unusually large hands. Made me question my masculinity..." + hardcore_value = 5 diff --git a/code/datums/quirks/negative_quirks/blindness.dm b/code/datums/quirks/negative_quirks/blindness.dm new file mode 100644 index 0000000000000..ce57e946fe92e --- /dev/null +++ b/code/datums/quirks/negative_quirks/blindness.dm @@ -0,0 +1,20 @@ +/datum/quirk/item_quirk/blindness + name = "Blind" + desc = "You are completely blind, nothing can counteract this." + icon = FA_ICON_EYE_SLASH + value = -16 + gain_text = span_danger("You can't see anything.") + lose_text = span_notice("You miraculously gain back your vision.") + medical_record_text = "Patient has permanent blindness." + hardcore_value = 15 + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE + mail_goodies = list(/obj/item/clothing/glasses/sunglasses, /obj/item/cane/white) + +/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(client/client_source) + quirk_holder.become_blind(QUIRK_TRAIT) + +/datum/quirk/item_quirk/blindness/remove() + quirk_holder.cure_blind(QUIRK_TRAIT) diff --git a/code/datums/quirks/negative_quirks/blood_deficiency.dm b/code/datums/quirks/negative_quirks/blood_deficiency.dm new file mode 100644 index 0000000000000..c75007bacc20c --- /dev/null +++ b/code/datums/quirks/negative_quirks/blood_deficiency.dm @@ -0,0 +1,39 @@ +/datum/quirk/blooddeficiency + name = "Blood Deficiency" + desc = "Your body can't produce enough blood to sustain itself." + icon = FA_ICON_TINT + value = -8 + mob_trait = TRAIT_BLOOD_DEFICIENCY + gain_text = span_danger("You feel your vigor slowly fading away.") + lose_text = span_notice("You feel vigorous again.") + medical_record_text = "Patient requires regular treatment for blood loss due to low production of blood." + hardcore_value = 8 + mail_goodies = list(/obj/item/reagent_containers/blood/o_minus) // universal blood type that is safe for all + var/min_blood = BLOOD_VOLUME_SAFE - 25 // just barely survivable without treatment + +/datum/quirk/blooddeficiency/post_add() + if(!ishuman(quirk_holder)) + return + + // for making sure the roundstart species has the right blood pack sent to them + var/mob/living/carbon/human/carbon_target = quirk_holder + carbon_target.dna.species.update_quirk_mail_goodies(carbon_target, src) + +/** + * Makes the mob lose blood from having the blood deficiency quirk, if possible + * + * Arguments: + * * seconds_per_tick + */ +/datum/quirk/blooddeficiency/proc/lose_blood(seconds_per_tick) + if(quirk_holder.stat == DEAD) + return + + var/mob/living/carbon/human/carbon_target = quirk_holder + if(HAS_TRAIT(carbon_target, TRAIT_NOBLOOD) && isnull(carbon_target.dna.species.exotic_blood)) //can't lose blood if your species doesn't have any + return + + if (carbon_target.blood_volume <= min_blood) + return + // Ensures that we don't reduce total blood volume below min_blood. + carbon_target.blood_volume = max(min_blood, carbon_target.blood_volume - carbon_target.dna.species.blood_deficiency_drain_rate * seconds_per_tick) diff --git a/code/datums/quirks/negative_quirks/body_purist.dm b/code/datums/quirks/negative_quirks/body_purist.dm new file mode 100644 index 0000000000000..6350a7108820b --- /dev/null +++ b/code/datums/quirks/negative_quirks/body_purist.dm @@ -0,0 +1,69 @@ +/datum/quirk/body_purist + name = "Body Purist" + desc = "You believe your body is a temple and its natural form is an embodiment of perfection. Accordingly, you despise the idea of ever augmenting it with unnatural parts, cybernetic, prosthetic, or anything like it." + icon = FA_ICON_PERSON_RAYS + value = -2 + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED + gain_text = span_danger("You now begin to hate the idea of having cybernetic implants.") + lose_text = span_notice("Maybe cybernetics aren't so bad. You now feel okay with augmentations and prosthetics.") + medical_record_text = "This patient has disclosed an extreme hatred for unnatural bodyparts and augmentations." + hardcore_value = 3 + mail_goodies = list(/obj/item/paper/pamphlet/cybernetics) + var/cybernetics_level = 0 + +/datum/quirk/body_purist/add(client/client_source) + check_cybernetics() + RegisterSignal(quirk_holder, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(on_organ_gain)) + RegisterSignal(quirk_holder, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(on_organ_lose)) + RegisterSignal(quirk_holder, COMSIG_CARBON_ATTACH_LIMB, PROC_REF(on_limb_gain)) + RegisterSignal(quirk_holder, COMSIG_CARBON_REMOVE_LIMB, PROC_REF(on_limb_lose)) + +/datum/quirk/body_purist/remove() + UnregisterSignal(quirk_holder, list( + COMSIG_CARBON_GAIN_ORGAN, + COMSIG_CARBON_LOSE_ORGAN, + COMSIG_CARBON_ATTACH_LIMB, + COMSIG_CARBON_REMOVE_LIMB, + )) + quirk_holder.clear_mood_event("body_purist") + +/datum/quirk/body_purist/proc/check_cybernetics() + var/mob/living/carbon/owner = quirk_holder + if(!istype(owner)) + return + for(var/obj/item/bodypart/limb as anything in owner.bodyparts) + if(IS_ROBOTIC_LIMB(limb)) + cybernetics_level++ + for(var/obj/item/organ/organ as anything in owner.organs) + if(IS_ROBOTIC_ORGAN(organ) && !(organ.organ_flags & ORGAN_HIDDEN)) + cybernetics_level++ + update_mood() + +/datum/quirk/body_purist/proc/update_mood() + quirk_holder.clear_mood_event("body_purist") + if(cybernetics_level) + quirk_holder.add_mood_event("body_purist", /datum/mood_event/body_purist, -cybernetics_level * 10) + +/datum/quirk/body_purist/proc/on_organ_gain(datum/source, obj/item/organ/new_organ, special) + SIGNAL_HANDLER + if(IS_ROBOTIC_ORGAN(new_organ) && !(new_organ.organ_flags & ORGAN_HIDDEN)) //why the fuck are there 2 of them + cybernetics_level++ + update_mood() + +/datum/quirk/body_purist/proc/on_organ_lose(datum/source, obj/item/organ/old_organ, special) + SIGNAL_HANDLER + if(IS_ROBOTIC_ORGAN(old_organ) && !(old_organ.organ_flags & ORGAN_HIDDEN)) + cybernetics_level-- + update_mood() + +/datum/quirk/body_purist/proc/on_limb_gain(datum/source, obj/item/bodypart/new_limb, special) + SIGNAL_HANDLER + if(IS_ROBOTIC_LIMB(new_limb)) + cybernetics_level++ + update_mood() + +/datum/quirk/body_purist/proc/on_limb_lose(datum/source, obj/item/bodypart/old_limb, special) + SIGNAL_HANDLER + if(IS_ROBOTIC_LIMB(old_limb)) + cybernetics_level-- + update_mood() diff --git a/code/datums/quirks/negative_quirks/brain_problems.dm b/code/datums/quirks/negative_quirks/brain_problems.dm new file mode 100644 index 0000000000000..15cc0128020cf --- /dev/null +++ b/code/datums/quirks/negative_quirks/brain_problems.dm @@ -0,0 +1,37 @@ + /* 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 = FA_ICON_BRAIN + value = -12 + gain_text = span_danger("You feel smooth.") + lose_text = span_notice("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 + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES + mail_goodies = list(/obj/item/storage/pill_bottle/mannitol/braintumor) + +/datum/quirk/item_quirk/brainproblems/add_unique(client/client_source) + 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(seconds_per_tick) + if(quirk_holder.stat == DEAD) + return + + if(HAS_TRAIT(quirk_holder, TRAIT_TUMOR_SUPPRESSED)) + return + + quirk_holder.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.2 * seconds_per_tick) diff --git a/code/datums/quirks/negative_quirks/chronic_illness.dm b/code/datums/quirks/negative_quirks/chronic_illness.dm new file mode 100644 index 0000000000000..663d41381987e --- /dev/null +++ b/code/datums/quirks/negative_quirks/chronic_illness.dm @@ -0,0 +1,16 @@ +/datum/quirk/item_quirk/chronic_illness + name = "Chronic Illness" + desc = "You have a chronic illness that requires constant medication to keep under control." + icon = FA_ICON_DISEASE + value = -12 + gain_text = span_danger("You feel a bit off today.") + lose_text = span_notice("You feel a bit better today.") + medical_record_text = "Patient has a chronic illness that requires constant medication to keep under control." + hardcore_value = 12 + mail_goodies = list(/obj/item/storage/pill_bottle/sansufentanyl) + +/datum/quirk/item_quirk/chronic_illness/add_unique(client/client_source) + var/datum/disease/chronic_illness/hms = new /datum/disease/chronic_illness() + quirk_holder.ForceContractDisease(hms) + give_item_to_holder(/obj/item/storage/pill_bottle/sansufentanyl, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK),flavour_text = "You've been provided with medication to help manage your condition. Take it regularly to avoid complications.") + give_item_to_holder(/obj/item/healthanalyzer/simple/disease, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK)) diff --git a/code/datums/quirks/negative_quirks/claustrophobia.dm b/code/datums/quirks/negative_quirks/claustrophobia.dm new file mode 100644 index 0000000000000..e0207d227dd3c --- /dev/null +++ b/code/datums/quirks/negative_quirks/claustrophobia.dm @@ -0,0 +1,54 @@ +/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 = FA_ICON_BOX_OPEN + value = -4 + medical_record_text = "Patient demonstrates a fear of tight spaces." + hardcore_value = 5 + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES + mail_goodies = list(/obj/item/reagent_containers/syringe/convermol) // to help breathing + +/datum/quirk/claustrophobia/remove() + quirk_holder.clear_mood_event("claustrophobia") + +/datum/quirk/claustrophobia/process(seconds_per_tick) + if(quirk_holder.stat != CONSCIOUS || quirk_holder.IsSleeping() || quirk_holder.IsUnconscious()) + return + + if(HAS_TRAIT(quirk_holder, TRAIT_FEARLESS)) + 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)) + quirk_holder.clear_mood_event("claustrophobia") + return + + quirk_holder.add_mood_event("claustrophobia", /datum/mood_event/claustrophobia) + quirk_holder.losebreath += 0.25 // miss a breath one in four times + if(SPT_PROB(25, seconds_per_tick)) + 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/costume/santa) || istype(possible_saint_nick.head, /obj/item/clothing/head/helmet/space/santahat)) + 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/negative_quirks/clumsy.dm b/code/datums/quirks/negative_quirks/clumsy.dm new file mode 100644 index 0000000000000..8cf363753d4b2 --- /dev/null +++ b/code/datums/quirks/negative_quirks/clumsy.dm @@ -0,0 +1,9 @@ +/datum/quirk/clumsy + name = "Clumsy" + desc = "You're clumsy, a goofball, a silly dude. You big loveable himbo/bimbo you! Hope you weren't planning on using your hands for anything that takes even a LICK of dexterity." + icon = FA_ICON_FACE_DIZZY + value = -8 + mob_trait = TRAIT_CLUMSY + gain_text = span_danger("You feel your IQ sink like your brain is liquid.") + lose_text = span_notice("You feel like your IQ went up to at least average.") + medical_record_text = "Patient has demonstrated an extreme difficulty with high motor skill paired with an inability to demonstrate critical thinking." diff --git a/code/datums/quirks/negative_quirks/cursed.dm b/code/datums/quirks/negative_quirks/cursed.dm new file mode 100644 index 0000000000000..f58d31be28e48 --- /dev/null +++ b/code/datums/quirks/negative_quirks/cursed.dm @@ -0,0 +1,13 @@ +/datum/quirk/cursed + name = "Cursed" + desc = "You are cursed with bad luck. You are much more likely to suffer from accidents and mishaps. When it rains, it pours." + icon = FA_ICON_CLOUD_SHOWERS_HEAVY + value = -8 + mob_trait = TRAIT_CURSED + gain_text = span_danger("You feel like you're going to have a bad day.") + lose_text = span_notice("You feel like you're going to have a good day.") + medical_record_text = "Patient is cursed with bad luck." + hardcore_value = 8 + +/datum/quirk/cursed/add(client/client_source) + quirk_holder.AddComponent(/datum/component/omen/quirk) diff --git a/code/datums/quirks/negative_quirks/deafness.dm b/code/datums/quirks/negative_quirks/deafness.dm new file mode 100644 index 0000000000000..077bbe72aa5c6 --- /dev/null +++ b/code/datums/quirks/negative_quirks/deafness.dm @@ -0,0 +1,14 @@ +/datum/quirk/item_quirk/deafness + name = "Deaf" + desc = "You are incurably deaf." + icon = FA_ICON_DEAF + value = -8 + mob_trait = TRAIT_DEAF + gain_text = span_danger("You can't hear anything.") + lose_text = span_notice("You're able to hear again!") + medical_record_text = "Patient's cochlear nerve is incurably damaged." + hardcore_value = 12 + mail_goodies = list(/obj/item/clothing/mask/whistle) + +/datum/quirk/item_quirk/deafness/add_unique(client/client_source) + give_item_to_holder(/obj/item/clothing/accessory/deaf_pin, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) diff --git a/code/datums/quirks/negative_quirks/depression.dm b/code/datums/quirks/negative_quirks/depression.dm new file mode 100644 index 0000000000000..0bf1551610581 --- /dev/null +++ b/code/datums/quirks/negative_quirks/depression.dm @@ -0,0 +1,12 @@ +/datum/quirk/depression + name = "Depression" + desc = "You sometimes just hate life." + icon = FA_ICON_FROWN + mob_trait = TRAIT_DEPRESSION + value = -3 + gain_text = span_danger("You start feeling depressed.") + lose_text = span_notice("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." + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED + hardcore_value = 2 + mail_goodies = list(/obj/item/storage/pill_bottle/happinesspsych) diff --git a/code/datums/quirks/negative_quirks/family_heirloom.dm b/code/datums/quirks/negative_quirks/family_heirloom.dm new file mode 100644 index 0000000000000..0fd08c68f2178 --- /dev/null +++ b/code/datums/quirks/negative_quirks/family_heirloom.dm @@ -0,0 +1,72 @@ +/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 = FA_ICON_TOOLBOX + value = -2 + medical_record_text = "Patient demonstrates an unnatural attachment to a family heirloom." + hardcore_value = 1 + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES|QUIRK_MOODLET_BASED + /// A weak reference to our heirloom. + var/datum/weakref/heirloom + mail_goodies = list(/obj/item/storage/secure/briefcase) + +/datum/quirk/item_quirk/family_heirloom/add_unique(client/client_source) + 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, span_boldnotice("A wave of existential dread runs over you as you realize 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())) + quirk_holder.clear_mood_event("family_heirloom_missing") + quirk_holder.add_mood_event("family_heirloom", /datum/mood_event/family_heirloom) + else + quirk_holder.clear_mood_event("family_heirloom") + quirk_holder.add_mood_event("family_heirloom_missing", /datum/mood_event/family_heirloom_missing) + +/datum/quirk/item_quirk/family_heirloom/remove() + quirk_holder.clear_mood_event("family_heirloom_missing") + quirk_holder.clear_mood_event("family_heirloom") diff --git a/code/datums/quirks/negative_quirks/frail.dm b/code/datums/quirks/negative_quirks/frail.dm new file mode 100644 index 0000000000000..6b806875ea24c --- /dev/null +++ b/code/datums/quirks/negative_quirks/frail.dm @@ -0,0 +1,11 @@ +/datum/quirk/frail + name = "Frail" + desc = "You have skin of paper and bones of glass! You suffer wounds much more easily than most." + icon = FA_ICON_SKULL + value = -6 + mob_trait = TRAIT_EASILY_WOUNDED + gain_text = span_danger("You feel frail.") + lose_text = span_notice("You feel sturdy again.") + medical_record_text = "Patient is absurdly easy to injure. Please take all due diligence to avoid possible malpractice suits." + hardcore_value = 4 + mail_goodies = list(/obj/effect/spawner/random/medical/minor_healing) diff --git a/code/datums/quirks/negative_quirks/glass_jaw.dm b/code/datums/quirks/negative_quirks/glass_jaw.dm new file mode 100644 index 0000000000000..33ad19add6ddb --- /dev/null +++ b/code/datums/quirks/negative_quirks/glass_jaw.dm @@ -0,0 +1,52 @@ +/datum/quirk/glass_jaw + name = "Glass Jaw" + desc = "You have a very fragile jaw. Any sufficiently hard blow to your head might knock you out." + icon = FA_ICON_HAND_FIST + value = -4 + gain_text = span_danger("Your jaw feels loose.") + lose_text = span_notice("Your jaw feels fitting again.") + medical_record_text = "Patient is absurdly easy to knock out. Do not allow them near a boxing ring." + hardcore_value = 4 + mail_goodies = list( + /obj/item/clothing/gloves/boxing, + /obj/item/clothing/mask/luchador/rudos, + ) + +/datum/quirk/glass_jaw/New() + . = ..() + //randomly picks between blue or red equipment for goodies + if(prob(50)) + mail_goodies = list( + /obj/item/clothing/gloves/boxing, + /obj/item/clothing/mask/luchador/rudos, + ) + else + mail_goodies = list( + /obj/item/clothing/gloves/boxing/blue, + /obj/item/clothing/mask/luchador/tecnicos, + ) + +/datum/quirk/glass_jaw/add(client/client_source) + RegisterSignal(quirk_holder, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(punch_out)) + +/datum/quirk/glass_jaw/remove() + UnregisterSignal(quirk_holder, COMSIG_MOB_APPLY_DAMAGE) + +/datum/quirk/glass_jaw/proc/punch_out(mob/living/carbon/source, damage, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, attacking_item) + SIGNAL_HANDLER + if((damagetype != BRUTE) || (def_zone != BODY_ZONE_HEAD)) + return + var/actual_damage = damage - (damage * blocked/100) + //only roll for knockouts at 5 damage or more + if(actual_damage < 5) + return + //blunt items are more likely to knock out, but sharp ones are still capable of doing it + if(prob(CEILING(actual_damage * (sharpness & (SHARP_EDGED|SHARP_POINTY) ? 0.65 : 1), 1))) + //don't display the message if little mac is already KO'd + if(!source.IsUnconscious()) + source.visible_message( + span_warning("[source] gets knocked out!"), + span_userdanger("You get knocked out!"), + vision_distance = COMBAT_MESSAGE_RANGE, + ) + source.Unconscious(3 SECONDS) diff --git a/code/datums/quirks/negative_quirks/heavy_sleeper.dm b/code/datums/quirks/negative_quirks/heavy_sleeper.dm new file mode 100644 index 0000000000000..dea79683915bb --- /dev/null +++ b/code/datums/quirks/negative_quirks/heavy_sleeper.dm @@ -0,0 +1,19 @@ +/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 = FA_ICON_BED + value = -2 + mob_trait = TRAIT_HEAVY_SLEEPER + gain_text = span_danger("You feel sleepy.") + lose_text = span_notice("You feel awake again.") + medical_record_text = "Patient has abnormal sleep study results and is difficult to wake up." + hardcore_value = 2 + mail_goodies = list( + /obj/item/clothing/glasses/blindfold, + /obj/item/bedsheet/random, + /obj/item/clothing/under/misc/pj/red, + /obj/item/clothing/head/costume/nightcap/red, + /obj/item/clothing/under/misc/pj/blue, + /obj/item/clothing/head/costume/nightcap/blue, + /obj/item/pillow/random, + ) diff --git a/code/datums/quirks/negative_quirks/hemiplegic.dm b/code/datums/quirks/negative_quirks/hemiplegic.dm new file mode 100644 index 0000000000000..459b880fad2d1 --- /dev/null +++ b/code/datums/quirks/negative_quirks/hemiplegic.dm @@ -0,0 +1,22 @@ +/datum/quirk/hemiplegic + name = "Hemiplegic" + desc = "Half of your body doesn't work. Nothing will ever fix this." + icon = FA_ICON_CIRCLE_HALF_STROKE + value = -10 // slightly more bearable than paraplegic but not by much + gain_text = null // Handled by trauma. + lose_text = null + medical_record_text = "Patient has an untreatable impairment in motor function on half of their body." + hardcore_value = 10 + mail_goodies = list( + /obj/item/stack/sheet/mineral/uranium/half, //half a stack of a material that has a half life + /obj/item/reagent_containers/cup/glass/drinkingglass/filled/half_full, + ) + +/datum/quirk/hemiplegic/add(client/client_source) + var/mob/living/carbon/human/human_holder = quirk_holder + var/trauma_type = pick(/datum/brain_trauma/severe/paralysis/hemiplegic/left, /datum/brain_trauma/severe/paralysis/hemiplegic/right) + human_holder.gain_trauma(trauma_type, TRAUMA_RESILIENCE_ABSOLUTE) + +/datum/quirk/hemiplegic/remove() + var/mob/living/carbon/human/human_holder = quirk_holder + human_holder.cure_trauma_type(/datum/brain_trauma/severe/paralysis/hemiplegic, TRAUMA_RESILIENCE_ABSOLUTE) diff --git a/code/datums/quirks/negative_quirks/hypersensitive.dm b/code/datums/quirks/negative_quirks/hypersensitive.dm new file mode 100644 index 0000000000000..f51e72fc2560b --- /dev/null +++ b/code/datums/quirks/negative_quirks/hypersensitive.dm @@ -0,0 +1,18 @@ +/datum/quirk/hypersensitive + name = "Hypersensitive" + desc = "For better or worse, everything seems to affect your mood more than it should." + icon = FA_ICON_FLUSHED + value = -2 + gain_text = span_danger("You seem to make a big deal out of everything.") + lose_text = span_notice("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 + mail_goodies = list(/obj/effect/spawner/random/entertainment/plushie_delux) + +/datum/quirk/hypersensitive/add(client/client_source) + if (quirk_holder.mob_mood) + quirk_holder.mob_mood.mood_modifier += 0.5 + +/datum/quirk/hypersensitive/remove() + if (quirk_holder.mob_mood) + quirk_holder.mob_mood.mood_modifier -= 0.5 diff --git a/code/datums/quirks/negative_quirks/illiterate.dm b/code/datums/quirks/negative_quirks/illiterate.dm new file mode 100644 index 0000000000000..8101985f8f7ef --- /dev/null +++ b/code/datums/quirks/negative_quirks/illiterate.dm @@ -0,0 +1,9 @@ +/datum/quirk/illiterate + name = "Illiterate" + desc = "You dropped out of school and are unable to read or write. This affects reading, writing, using computers and other electronics." + icon = FA_ICON_GRADUATION_CAP + value = -8 + mob_trait = TRAIT_ILLITERATE + medical_record_text = "Patient is not literate." + hardcore_value = 8 + mail_goodies = list(/obj/item/pai_card) // can read things for you diff --git a/code/datums/quirks/negative_quirks/indebted.dm b/code/datums/quirks/negative_quirks/indebted.dm new file mode 100644 index 0000000000000..1e30e7800d6d3 --- /dev/null +++ b/code/datums/quirks/negative_quirks/indebted.dm @@ -0,0 +1,40 @@ +/datum/quirk/indebted + name = "Indebted" + desc = "Bad life decisions, medical bills, student loans, whatever it may be, you've incurred quite the debt. A portion of all you receive will go towards extinguishing it." + icon = FA_ICON_DOLLAR + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_HIDE_FROM_SCAN + value = -2 + medical_record_text = "Alas, the patient struggled to scrape together enough money to pay the checkup bill." + hardcore_value = 2 + +/datum/quirk/indebted/add_unique(client/client_source) + var/mob/living/carbon/human/human_holder = quirk_holder + if(!human_holder.account_id) + return + var/datum/bank_account/account = SSeconomy.bank_accounts_by_id["[human_holder.account_id]"] + var/debt = PAYCHECK_CREW * rand(275, 325) + account.account_debt += debt + RegisterSignal(account, COMSIG_BANK_ACCOUNT_DEBT_PAID, PROC_REF(on_debt_paid)) + to_chat(client_source.mob, span_warning("You remember, you've a hefty, [debt] credits debt to pay...")) + +///Once the debt is extinguished, award an achievement and a pin for actually taking care of it. +/datum/quirk/indebted/proc/on_debt_paid(datum/bank_account/source) + SIGNAL_HANDLER + if(source.account_debt) + return + UnregisterSignal(source, COMSIG_BANK_ACCOUNT_DEBT_PAID) + ///The debt was extinguished while the quirk holder was logged out, so let's kindly award it once they come back. + if(!quirk_holder.client) + RegisterSignal(quirk_holder, COMSIG_MOB_LOGIN, PROC_REF(award_on_login)) + else + quirk_holder.client.give_award(/datum/award/achievement/misc/debt_extinguished, quirk_holder) + podspawn(list( + "target" = get_turf(quirk_holder), + "style" = STYLE_BLUESPACE, + "spawn" = /obj/item/clothing/accessory/debt_payer_pin, + )) + +/datum/quirk/indebted/proc/award_on_login(mob/source) + SIGNAL_HANDLER + quirk_holder.client.give_award(/datum/award/achievement/misc/debt_extinguished, quirk_holder) + UnregisterSignal(source, COMSIG_MOB_LOGIN) diff --git a/code/datums/quirks/negative_quirks/insanity.dm b/code/datums/quirks/negative_quirks/insanity.dm new file mode 100644 index 0000000000000..56b56a5381216 --- /dev/null +++ b/code/datums/quirks/negative_quirks/insanity.dm @@ -0,0 +1,41 @@ +/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 = FA_ICON_GRIN_TONGUE_WINK + value = -8 + gain_text = span_userdanger("...") + lose_text = span_notice("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 + mail_goodies = list(/obj/item/storage/pill_bottle/lsdpsych) + /// Weakref to the trauma we give out + var/datum/weakref/added_trama_ref + +/datum/quirk/insanity/add(client/client_source) + if(!iscarbon(quirk_holder)) + return + var/mob/living/carbon/carbon_quirk_holder = quirk_holder + + // Setup our special RDS mild hallucination. + // Not a unique subtype so not to plague subtypesof, + // also as we inherit the names and values from our quirk. + var/datum/brain_trauma/mild/hallucinations/added_trauma = new() + added_trauma.resilience = TRAUMA_RESILIENCE_ABSOLUTE + added_trauma.name = name + added_trauma.desc = medical_record_text + added_trauma.scan_desc = lowertext(name) + added_trauma.gain_text = null + added_trauma.lose_text = null + + carbon_quirk_holder.gain_trauma(added_trauma) + added_trama_ref = WEAKREF(added_trauma) + +/datum/quirk/insanity/post_add() + var/rds_policy = get_policy("[type]") || "Please note that your [lowertext(name)] does NOT give you any additional right to attack people or cause chaos." + // 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. + to_chat(quirk_holder, span_big(span_info(rds_policy))) + +/datum/quirk/insanity/remove() + QDEL_NULL(added_trama_ref) diff --git a/code/datums/quirks/negative_quirks/junkie.dm b/code/datums/quirks/negative_quirks/junkie.dm new file mode 100644 index 0000000000000..269f6d2d96e31 --- /dev/null +++ b/code/datums/quirks/negative_quirks/junkie.dm @@ -0,0 +1,216 @@ +/datum/quirk/item_quirk/junkie + name = "Junkie" + desc = "You can't get enough of hard drugs." + icon = FA_ICON_PILLS + value = -6 + gain_text = span_danger("You suddenly feel the craving for drugs.") + medical_record_text = "Patient has a history of hard drugs." + hardcore_value = 4 + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES + mail_goodies = list(/obj/effect/spawner/random/contraband/narcotics) + 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(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() + + 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(seconds_per_tick) + if(HAS_TRAIT(quirk_holder, TRAIT_LIVERLESS_METABOLISM)) + 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 = FA_ICON_SMOKING + value = -4 + gain_text = span_danger("You could really go for a smoke right about now.") + lose_text = span_notice("You don't feel nearly as hooked to nicotine anymore.") + 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." + mail_goodies = list( + /obj/effect/spawner/random/entertainment/cigarette_pack, + /obj/effect/spawner/random/entertainment/cigar, + /obj/effect/spawner/random/entertainment/lighter, + /obj/item/clothing/mask/cigarette/pipe, + ) + +/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() + . = ..() + quirk_holder.add_mob_memory(/datum/memory/key/quirk_smoker, protagonist = quirk_holder, preferred_brand = initial(drug_container_type.name)) + // smoker lungs have 25% less health and healing + var/mob/living/carbon/carbon_holder = quirk_holder + var/obj/item/organ/internal/lungs/smoker_lungs = null + var/obj/item/organ/internal/lungs/old_lungs = carbon_holder.get_organ_slot(ORGAN_SLOT_LUNGS) + if(old_lungs && IS_ORGANIC_ORGAN(old_lungs)) + if(isplasmaman(carbon_holder)) + smoker_lungs = /obj/item/organ/internal/lungs/plasmaman/plasmaman_smoker + else if(isethereal(carbon_holder)) + smoker_lungs = /obj/item/organ/internal/lungs/ethereal/ethereal_smoker + else + smoker_lungs = /obj/item/organ/internal/lungs/smoker_lungs + if(!isnull(smoker_lungs)) + smoker_lungs = new smoker_lungs + smoker_lungs.Insert(carbon_holder, special = TRUE, drop_if_replaced = FALSE) + +/datum/quirk/item_quirk/junkie/smoker/process(seconds_per_tick) + . = ..() + 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))) + quirk_holder.clear_mood_event("wrong_cigs") + else + quirk_holder.add_mood_event("wrong_cigs", /datum/mood_event/wrong_brand) + +/datum/quirk/item_quirk/junkie/alcoholic + name = "Alcoholic" + desc = "You just can't live without alcohol. Your liver is a machine that turns ethanol into acetaldehyde." + icon = FA_ICON_WINE_GLASS + value = -4 + gain_text = span_danger("You really need a drink.") + lose_text = span_notice("Alcohol doesn't seem nearly as enticing anymore.") + medical_record_text = "Patient is an alcoholic." + reagent_type = /datum/reagent/consumable/ethanol + drug_container_type = /obj/item/reagent_containers/cup/glass/bottle/whiskey + mob_trait = TRAIT_HEAVY_DRINKER + hardcore_value = 1 + drug_flavour_text = "Make sure you get your favorite type of drink when you run out." + mail_goodies = list( + /obj/effect/spawner/random/food_or_drink/booze, + /obj/item/book/bible/booze, + ) + /// Cached typepath of the owner's favorite alcohol reagent + var/datum/reagent/consumable/ethanol/favorite_alcohol + +/datum/quirk/item_quirk/junkie/alcoholic/New() + drug_container_type = pick( + /obj/item/reagent_containers/cup/glass/bottle/whiskey, + /obj/item/reagent_containers/cup/glass/bottle/vodka, + /obj/item/reagent_containers/cup/glass/bottle/ale, + /obj/item/reagent_containers/cup/glass/bottle/beer, + /obj/item/reagent_containers/cup/glass/bottle/hcider, + /obj/item/reagent_containers/cup/glass/bottle/wine, + /obj/item/reagent_containers/cup/glass/bottle/sake, + ) + + return ..() + +/datum/quirk/item_quirk/junkie/alcoholic/post_add() + . = ..() + RegisterSignal(quirk_holder, COMSIG_MOB_REAGENT_CHECK, PROC_REF(check_brandy)) + + var/obj/item/reagent_containers/brandy_container = GLOB.alcohol_containers[drug_container_type] + if(isnull(brandy_container)) + stack_trace("Alcoholic quirk added while the GLOB.alcohol_containers is (somehow) not initialized!") + brandy_container = new drug_container_type + favorite_alcohol = brandy_container.list_reagents[1] + qdel(brandy_container) + else + favorite_alcohol = brandy_container.list_reagents[1] + + quirk_holder.add_mob_memory(/datum/memory/key/quirk_alcoholic, protagonist = quirk_holder, preferred_brandy = initial(favorite_alcohol.name)) + // alcoholic livers have 25% less health and healing + var/obj/item/organ/internal/liver/alcohol_liver = quirk_holder.get_organ_slot(ORGAN_SLOT_LIVER) + if(alcohol_liver && IS_ORGANIC_ORGAN(alcohol_liver)) // robotic livers aren't affected + alcohol_liver.maxHealth = alcohol_liver.maxHealth * 0.75 + alcohol_liver.healing_factor = alcohol_liver.healing_factor * 0.75 + +/datum/quirk/item_quirk/junkie/alcoholic/remove() + UnregisterSignal(quirk_holder, COMSIG_MOB_REAGENT_CHECK) + +/datum/quirk/item_quirk/junkie/alcoholic/proc/check_brandy(mob/source, datum/reagent/booze) + SIGNAL_HANDLER + + //we don't care if it is not alcohol + if(!istype(booze, /datum/reagent/consumable/ethanol)) + return + + if(istype(booze, favorite_alcohol)) + quirk_holder.clear_mood_event("wrong_alcohol") + else + quirk_holder.add_mood_event("wrong_alcohol", /datum/mood_event/wrong_brandy) diff --git a/code/datums/quirks/negative_quirks/light_drinker.dm b/code/datums/quirks/negative_quirks/light_drinker.dm new file mode 100644 index 0000000000000..5f82e2b9cd705 --- /dev/null +++ b/code/datums/quirks/negative_quirks/light_drinker.dm @@ -0,0 +1,11 @@ +/datum/quirk/light_drinker + name = "Light Drinker" + desc = "You just can't handle your drinks and get drunk very quickly." + icon = FA_ICON_COCKTAIL + value = -2 + mob_trait = TRAIT_LIGHT_DRINKER + gain_text = span_notice("Just the thought of drinking alcohol makes your head spin.") + lose_text = span_danger("You're no longer severely affected by alcohol.") + medical_record_text = "Patient demonstrates a low tolerance for alcohol. (Wimp)" + hardcore_value = 3 + mail_goodies = list(/obj/item/reagent_containers/cup/glass/waterbottle) diff --git a/code/datums/quirks/negative_quirks/mute.dm b/code/datums/quirks/negative_quirks/mute.dm new file mode 100644 index 0000000000000..44706c4d4346d --- /dev/null +++ b/code/datums/quirks/negative_quirks/mute.dm @@ -0,0 +1,10 @@ +/datum/quirk/mute + name = "Mute" + desc = "For some reason you are completely unable to speak." + icon = FA_ICON_VOLUME_XMARK + value = -4 + mob_trait = TRAIT_MUTE + gain_text = span_danger("You find yourself unable to speak!") + lose_text = span_notice("You feel a growing strength in your vocal chords.") + medical_record_text = "The patient is unable to use their voice in any capacity." + hardcore_value = 4 diff --git a/code/datums/quirks/negative_quirks/nearsighted.dm b/code/datums/quirks/negative_quirks/nearsighted.dm new file mode 100644 index 0000000000000..6a5397b650459 --- /dev/null +++ b/code/datums/quirks/negative_quirks/nearsighted.dm @@ -0,0 +1,30 @@ +/datum/quirk/item_quirk/nearsighted + name = "Nearsighted" + desc = "You are nearsighted without prescription glasses, but spawn with a pair." + icon = FA_ICON_GLASSES + value = -4 + gain_text = span_danger("Things far away from you start looking blurry.") + lose_text = span_notice("You start seeing faraway things normally again.") + medical_record_text = "Patient requires prescription glasses in order to counteract nearsightedness." + hardcore_value = 5 + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE + mail_goodies = list(/obj/item/clothing/glasses/regular) // extra pair if orginal one gets broken by somebody mean + +/datum/quirk/item_quirk/nearsighted/add_unique(client/client_source) + var/glasses_name = client_source?.prefs.read_preference(/datum/preference/choiced/glasses) || "Regular" + var/obj/item/clothing/glasses/glasses_type + + glasses_name = glasses_name == "Random" ? pick(GLOB.nearsighted_glasses) : glasses_name + glasses_type = GLOB.nearsighted_glasses[glasses_name] + + give_item_to_holder(glasses_type, list( + LOCATION_EYES = ITEM_SLOT_EYES, + LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, + LOCATION_HANDS = ITEM_SLOT_HANDS, + )) + +/datum/quirk/item_quirk/nearsighted/add(client/client_source) + quirk_holder.become_nearsighted(QUIRK_TRAIT) + +/datum/quirk/item_quirk/nearsighted/remove() + quirk_holder.cure_nearsighted(QUIRK_TRAIT) diff --git a/code/datums/quirks/negative_quirks/non_violent.dm b/code/datums/quirks/negative_quirks/non_violent.dm new file mode 100644 index 0000000000000..e1dbb0e64802f --- /dev/null +++ b/code/datums/quirks/negative_quirks/non_violent.dm @@ -0,0 +1,11 @@ +/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 = FA_ICON_PEACE + value = -8 + mob_trait = TRAIT_PACIFISM + gain_text = span_danger("You feel repulsed by the thought of violence!") + lose_text = span_notice("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 + mail_goodies = list(/obj/effect/spawner/random/decoration/flower, /obj/effect/spawner/random/contraband/cannabis) // flower power diff --git a/code/datums/quirks/negative_quirks/numb.dm b/code/datums/quirks/negative_quirks/numb.dm new file mode 100644 index 0000000000000..cd4f28cb30228 --- /dev/null +++ b/code/datums/quirks/negative_quirks/numb.dm @@ -0,0 +1,15 @@ +/datum/quirk/numb + name = "Numb" + desc = "You can't feel pain at all." + icon = FA_ICON_STAR_OF_LIFE + value = -4 + gain_text = "You feel your body becoming numb." + lose_text = "The numbness subsides." + medical_record_text = "The patient exhibits congenital hypoesthesia, making them insensitive to pain stimuli." + hardcore_value = 4 + +/datum/quirk/numb/add(client/client_source) + quirk_holder.apply_status_effect(/datum/status_effect/grouped/screwy_hud/fake_healthy, type) + +/datum/quirk/numb/remove(client/client_source) + quirk_holder.remove_status_effect(/datum/status_effect/grouped/screwy_hud/fake_healthy, type) diff --git a/code/datums/quirks/negative_quirks/nyctophobia.dm b/code/datums/quirks/negative_quirks/nyctophobia.dm new file mode 100644 index 0000000000000..af891a2058ad2 --- /dev/null +++ b/code/datums/quirks/negative_quirks/nyctophobia.dm @@ -0,0 +1,46 @@ +/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 instinctively act careful, and constantly feel a sense of dread." + icon = FA_ICON_LIGHTBULB + value = -3 + medical_record_text = "Patient demonstrates a fear of the dark. (Seriously?)" + hardcore_value = 5 + mail_goodies = list(/obj/effect/spawner/random/engineering/flashlight) + +/datum/quirk/nyctophobia/add(client/client_source) + RegisterSignal(quirk_holder, COMSIG_MOVABLE_MOVED, PROC_REF(on_holder_moved)) + +/datum/quirk/nyctophobia/remove() + UnregisterSignal(quirk_holder, COMSIG_MOVABLE_MOVED) + quirk_holder.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 + + if(HAS_TRAIT(quirk_holder, TRAIT_FEARLESS)) + 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) + quirk_holder.clear_mood_event("nyctophobia") + return + + if(quirk_holder.move_intent == MOVE_INTENT_RUN) + to_chat(quirk_holder, span_warning("Easy, easy, take it slow... you're in the dark...")) + quirk_holder.toggle_move_intent() + quirk_holder.add_mood_event("nyctophobia", /datum/mood_event/nyctophobia) diff --git a/code/datums/quirks/negative_quirks/paraplegic.dm b/code/datums/quirks/negative_quirks/paraplegic.dm new file mode 100644 index 0000000000000..58e1c4ba31e87 --- /dev/null +++ b/code/datums/quirks/negative_quirks/paraplegic.dm @@ -0,0 +1,41 @@ +/datum/quirk/paraplegic + name = "Paraplegic" + desc = "Your legs do not function. Nothing will ever fix this. But hey, free wheelchair!" + icon = FA_ICON_WHEELCHAIR + value = -12 + 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 + mail_goodies = list(/obj/vehicle/ridden/wheelchair/motorized) //yes a fullsized unfolded motorized wheelchair does fit + +/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(/datum/award/score/hardcore_random) >= 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(client/client_source) + 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) diff --git a/code/datums/quirks/negative_quirks/photophobia.dm b/code/datums/quirks/negative_quirks/photophobia.dm new file mode 100644 index 0000000000000..b543aeda07631 --- /dev/null +++ b/code/datums/quirks/negative_quirks/photophobia.dm @@ -0,0 +1,75 @@ +#define MOOD_CATEGORY_PHOTOPHOBIA "photophobia" + +/datum/quirk/photophobia + name = "Photophobia" + desc = "Bright lights seem to bother you more than others. Maybe it's a medical condition." + icon = FA_ICON_ARROWS_TO_EYE + value = -4 + gain_text = span_danger("The safety of light feels off...") + lose_text = span_notice("Enlightening.") + medical_record_text = "Patient has acute phobia of light, and insists it is physically harmful." + hardcore_value = 4 + mail_goodies = list( + /obj/item/flashlight/flashdark, + /obj/item/food/grown/mushroom/glowshroom/shadowshroom, + /obj/item/skillchip/light_remover, + ) + +/datum/quirk/photophobia/add(client/client_source) + RegisterSignal(quirk_holder, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(check_eyes)) + RegisterSignal(quirk_holder, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(restore_eyes)) + RegisterSignal(quirk_holder, COMSIG_MOVABLE_MOVED, PROC_REF(on_holder_moved)) + update_eyes(quirk_holder.get_organ_slot(ORGAN_SLOT_EYES)) + +/datum/quirk/photophobia/remove() + UnregisterSignal(quirk_holder, list( + COMSIG_CARBON_GAIN_ORGAN, + COMSIG_CARBON_LOSE_ORGAN, + COMSIG_MOVABLE_MOVED,)) + quirk_holder.clear_mood_event(MOOD_CATEGORY_PHOTOPHOBIA) + var/obj/item/organ/internal/eyes/normal_eyes = quirk_holder.get_organ_slot(ORGAN_SLOT_EYES) + if(istype(normal_eyes)) + normal_eyes.flash_protect = initial(normal_eyes.flash_protect) + +/datum/quirk/photophobia/proc/check_eyes(obj/item/organ/internal/eyes/sensitive_eyes) + SIGNAL_HANDLER + if(!istype(sensitive_eyes)) + return + update_eyes(sensitive_eyes) + +/datum/quirk/photophobia/proc/update_eyes(obj/item/organ/internal/eyes/target_eyes) + if(!istype(target_eyes)) + return + target_eyes.flash_protect = max(target_eyes.flash_protect - 1, FLASH_PROTECTION_HYPER_SENSITIVE) + +/datum/quirk/photophobia/proc/restore_eyes(obj/item/organ/internal/eyes/normal_eyes) + SIGNAL_HANDLER + if(!istype(normal_eyes)) + return + normal_eyes.flash_protect = initial(normal_eyes.flash_protect) + +/datum/quirk/photophobia/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 + + if(HAS_TRAIT(quirk_holder, TRAIT_FEARLESS)) + return + + var/mob/living/carbon/human/human_holder = quirk_holder + + if(human_holder.sight & SEE_TURFS) + return + + var/turf/holder_turf = get_turf(quirk_holder) + + var/lums = holder_turf.get_lumcount() + + var/eye_protection = quirk_holder.get_eye_protection() + if(lums < LIGHTING_TILE_IS_DARK || eye_protection >= FLASH_PROTECTION_NONE) + quirk_holder.clear_mood_event(MOOD_CATEGORY_PHOTOPHOBIA) + return + quirk_holder.add_mood_event(MOOD_CATEGORY_PHOTOPHOBIA, /datum/mood_event/photophobia) + + #undef MOOD_CATEGORY_PHOTOPHOBIA diff --git a/code/datums/quirks/negative_quirks/poor_aim.dm b/code/datums/quirks/negative_quirks/poor_aim.dm new file mode 100644 index 0000000000000..d86feb809b008 --- /dev/null +++ b/code/datums/quirks/negative_quirks/poor_aim.dm @@ -0,0 +1,19 @@ +/datum/quirk/poor_aim + name = "Stormtrooper Aim" + desc = "You've never hit anything you were aiming for in your life." + icon = FA_ICON_BULLSEYE + value = -4 + medical_record_text = "Patient possesses a strong tremor in both hands." + hardcore_value = 3 + mail_goodies = list(/obj/item/cardboard_cutout) // for target practice + +/datum/quirk/poor_aim/add(client/client_source) + RegisterSignal(quirk_holder, COMSIG_MOB_FIRED_GUN, PROC_REF(on_mob_fired_gun)) + +/datum/quirk/poor_aim/remove(client/client_source) + UnregisterSignal(quirk_holder, COMSIG_MOB_FIRED_GUN) + +/datum/quirk/poor_aim/proc/on_mob_fired_gun(mob/user, obj/item/gun/gun_fired, target, params, zone_override, list/bonus_spread_values) + SIGNAL_HANDLER + bonus_spread_values[MIN_BONUS_SPREAD_INDEX] += 10 + bonus_spread_values[MAX_BONUS_SPREAD_INDEX] += 35 diff --git a/code/datums/quirks/negative_quirks/prosopagnosia.dm b/code/datums/quirks/negative_quirks/prosopagnosia.dm new file mode 100644 index 0000000000000..8634e13bf638c --- /dev/null +++ b/code/datums/quirks/negative_quirks/prosopagnosia.dm @@ -0,0 +1,9 @@ +/datum/quirk/prosopagnosia + name = "Prosopagnosia" + desc = "You have a mental disorder that prevents you from being able to recognize faces at all." + icon = FA_ICON_USER_SECRET + value = -4 + mob_trait = TRAIT_PROSOPAGNOSIA + medical_record_text = "Patient suffers from prosopagnosia and cannot recognize faces." + hardcore_value = 5 + mail_goodies = list(/obj/item/skillchip/appraiser) // bad at recognizing faces but good at recognizing IDs diff --git a/code/datums/quirks/negative_quirks/prosthetic_limb.dm b/code/datums/quirks/negative_quirks/prosthetic_limb.dm new file mode 100644 index 0000000000000..e7ea4d75788f1 --- /dev/null +++ b/code/datums/quirks/negative_quirks/prosthetic_limb.dm @@ -0,0 +1,33 @@ +/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 surplus prosthetic!" + icon = "tg-prosthetic-leg" + value = -3 + hardcore_value = 3 + quirk_flags = QUIRK_HUMAN_ONLY | QUIRK_CHANGES_APPEARANCE + mail_goodies = list(/obj/item/weldingtool/mini, /obj/item/stack/cable_coil/five) + /// The slot to replace, in string form + var/slot_string = "limb" + /// the original limb from before the prosthetic was applied + var/obj/item/bodypart/old_limb + +/datum/quirk/prosthetic_limb/add_unique(client/client_source) + var/limb_type = GLOB.limb_choice[client_source?.prefs?.read_preference(/datum/preference/choiced/prosthetic)] + if(isnull(limb_type)) //Client gone or they chose a random prosthetic + limb_type = GLOB.limb_choice[pick(GLOB.limb_choice)] + + var/mob/living/carbon/human/human_holder = quirk_holder + var/obj/item/bodypart/surplus = new limb_type() + slot_string = "[surplus.plaintext_zone]" + + medical_record_text = "Patient uses a low-budget prosthetic on the [slot_string]." + old_limb = human_holder.return_and_replace_bodypart(surplus, special = TRUE) + +/datum/quirk/prosthetic_limb/post_add() + to_chat(quirk_holder, span_boldannounce("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 sutures and regenerative meshes.")) + +/datum/quirk/prosthetic_limb/remove() + var/mob/living/carbon/human/human_holder = quirk_holder + human_holder.del_and_replace_bodypart(old_limb, special = TRUE) + old_limb = null diff --git a/code/datums/quirks/negative_quirks/prosthetic_organ.dm b/code/datums/quirks/negative_quirks/prosthetic_organ.dm new file mode 100644 index 0000000000000..6330035b5a721 --- /dev/null +++ b/code/datums/quirks/negative_quirks/prosthetic_organ.dm @@ -0,0 +1,63 @@ +/datum/quirk/prosthetic_organ + name = "Prosthetic Organ" + desc = "An accident caused you to lose one of your organs. Because of this, you now have a surplus prosthetic!" + icon = FA_ICON_LUNGS + value = -3 + medical_record_text = "During physical examination, patient was found to have a low-budget prosthetic organ. \ + Removal of these organs is known to be dangerous to the patient as well as the practitioner." + hardcore_value = 3 + mail_goodies = list(/obj/item/storage/organbox) + /// The slot to replace, in string form + var/slot_string = "organ" + /// The original organ from before the prosthetic was applied + var/obj/item/organ/old_organ + +/datum/quirk/prosthetic_organ/add_unique(client/client_source) + var/mob/living/carbon/human/human_holder = quirk_holder + var/static/list/organ_slots = list( + ORGAN_SLOT_HEART, + ORGAN_SLOT_LUNGS, + ORGAN_SLOT_LIVER, + ORGAN_SLOT_STOMACH, + ) + var/list/possible_organ_slots = organ_slots.Copy() + if(HAS_TRAIT(human_holder, TRAIT_NOBLOOD)) + possible_organ_slots -= ORGAN_SLOT_HEART + if(HAS_TRAIT(human_holder, TRAIT_NOBREATH)) + possible_organ_slots -= ORGAN_SLOT_LUNGS + if(HAS_TRAIT(human_holder, TRAIT_LIVERLESS_METABOLISM)) + possible_organ_slots -= ORGAN_SLOT_LIVER + if(HAS_TRAIT(human_holder, TRAIT_NOHUNGER)) + possible_organ_slots -= ORGAN_SLOT_STOMACH + if(!length(organ_slots)) //what the hell + return + var/organ_slot = pick(possible_organ_slots) + var/obj/item/organ/prosthetic + switch(organ_slot) + if(ORGAN_SLOT_HEART) + prosthetic = new /obj/item/organ/internal/heart/cybernetic/surplus + slot_string = "heart" + if(ORGAN_SLOT_LUNGS) + prosthetic = new /obj/item/organ/internal/lungs/cybernetic/surplus + slot_string = "lungs" + if(ORGAN_SLOT_LIVER) + prosthetic = new /obj/item/organ/internal/liver/cybernetic/surplus + slot_string = "liver" + if(ORGAN_SLOT_STOMACH) + prosthetic = new /obj/item/organ/internal/stomach/cybernetic/surplus + slot_string = "stomach" + medical_record_text = "During physical examination, patient was found to have a low-budget prosthetic [slot_string]. \ + Removal of these organs is known to be dangerous to the patient as well as the practitioner." + old_organ = human_holder.get_organ_slot(organ_slot) + if(prosthetic.Insert(human_holder, special = TRUE, drop_if_replaced = TRUE)) + old_organ.moveToNullspace() + STOP_PROCESSING(SSobj, old_organ) + +/datum/quirk/prosthetic_organ/post_add() + to_chat(quirk_holder, span_boldannounce("Your [slot_string] has been replaced with a surplus organ. It is fragile and will easily come apart under duress. \ + Additionally, any EMP will make it stop working entirely.")) + +/datum/quirk/prosthetic_organ/remove() + if(old_organ) + old_organ.Insert(quirk_holder, special = TRUE) + old_organ = null diff --git a/code/datums/quirks/negative_quirks/pushover.dm b/code/datums/quirks/negative_quirks/pushover.dm new file mode 100644 index 0000000000000..663d81737593b --- /dev/null +++ b/code/datums/quirks/negative_quirks/pushover.dm @@ -0,0 +1,11 @@ +/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 = FA_ICON_HANDSHAKE + value = -8 + mob_trait = TRAIT_GRABWEAKNESS + gain_text = span_danger("You feel like a pushover.") + lose_text = span_notice("You feel like standing up for yourself.") + medical_record_text = "Patient presents a notably unassertive personality and is easy to manipulate." + hardcore_value = 4 + mail_goodies = list(/obj/item/clothing/gloves/cargo_gauntlet) diff --git a/code/datums/quirks/negative_quirks/quadruple_amputee.dm b/code/datums/quirks/negative_quirks/quadruple_amputee.dm new file mode 100644 index 0000000000000..493cdf0b71cda --- /dev/null +++ b/code/datums/quirks/negative_quirks/quadruple_amputee.dm @@ -0,0 +1,20 @@ +/datum/quirk/quadruple_amputee + name = "Quadruple Amputee" + desc = "Oops! All Prosthetics! Due to some truly cruel cosmic punishment, all your limbs have been replaced with surplus prosthetics." + icon = "tg-prosthetic-full" + value = -6 + medical_record_text = "During physical examination, patient was found to have all low-budget prosthetic limbs." + hardcore_value = 6 + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE + mail_goodies = list(/obj/item/weldingtool/mini, /obj/item/stack/cable_coil/five) + +/datum/quirk/quadruple_amputee/add_unique(client/client_source) + var/mob/living/carbon/human/human_holder = quirk_holder + human_holder.del_and_replace_bodypart(new /obj/item/bodypart/arm/left/robot/surplus, special = TRUE) + human_holder.del_and_replace_bodypart(new /obj/item/bodypart/arm/right/robot/surplus, special = TRUE) + human_holder.del_and_replace_bodypart(new /obj/item/bodypart/leg/left/robot/surplus, special = TRUE) + human_holder.del_and_replace_bodypart(new /obj/item/bodypart/leg/right/robot/surplus, special = TRUE) + +/datum/quirk/quadruple_amputee/post_add() + to_chat(quirk_holder, span_boldannounce("All your limbs have been replaced with surplus prosthetics. They are fragile and will easily come apart under duress. \ + Additionally, you need to use a welding tool and cables to repair them, instead of bruise packs and ointment.")) diff --git a/code/datums/quirks/negative_quirks/social_anxiety.dm b/code/datums/quirks/negative_quirks/social_anxiety.dm new file mode 100644 index 0000000000000..3d140bd80a073 --- /dev/null +++ b/code/datums/quirks/negative_quirks/social_anxiety.dm @@ -0,0 +1,114 @@ +/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 = FA_ICON_COMMENT_SLASH + value = -3 + gain_text = span_danger("You start worrying about what you're saying.") + lose_text = span_notice("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 + mail_goodies = list(/obj/item/storage/pill_bottle/psicodine) + var/dumb_thing = TRUE + +/datum/quirk/social_anxiety/add(client/client_source) + 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/moodmod + if(quirk_holder.mob_mood) + moodmod = (1+0.02*(50-(max(50, quirk_holder.mob_mood.mood_level*(7-quirk_holder.mob_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 successful filler roll, for 50% odds in a 15 word sentence + quirker.set_silence_if_lower(6 SECONDS) + 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_stutter(0.5 SECONDS) + var/list/message_data = quirker.treat_message(word, capitalize_message = FALSE) + new_message += message_data["message"] + 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 successful not talking roll + to_chat(quirker, span_danger("You retreat into yourself. You really don't feel up to talking.")) + quirker.set_silence_if_lower(10 SECONDS) + + 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_jitter_if_lower(20 SECONDS) + msg += "causing you to start fidgeting!" + if(2) + quirk_holder.set_stutter_if_lower(6 SECONDS) + msg += "causing you to start stuttering!" + if(3) + quirk_holder.Stun(2 SECONDS) + msg += "causing you to freeze up!" + + quirk_holder.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 diff --git a/code/datums/quirks/negative_quirks/softspoken.dm b/code/datums/quirks/negative_quirks/softspoken.dm new file mode 100644 index 0000000000000..41be5f1aca006 --- /dev/null +++ b/code/datums/quirks/negative_quirks/softspoken.dm @@ -0,0 +1,9 @@ +/datum/quirk/softspoken + name = "Soft-Spoken" + desc = "You are soft-spoken, and your voice is hard to hear." + icon = FA_ICON_COMMENT + value = -2 + mob_trait = TRAIT_SOFTSPOKEN + gain_text = span_danger("You feel like you're speaking more quietly.") + lose_text = span_notice("You feel like you're speaking louder.") + medical_record_text = "Patient is soft-spoken and difficult to hear." diff --git a/code/datums/quirks/negative_quirks/tin_man.dm b/code/datums/quirks/negative_quirks/tin_man.dm new file mode 100644 index 0000000000000..5a4ab4b1357f5 --- /dev/null +++ b/code/datums/quirks/negative_quirks/tin_man.dm @@ -0,0 +1,37 @@ +/datum/quirk/tin_man + name = "Tin Man" + desc = "Oops! All Prosthetics! Due to some truly cruel cosmic punishment, most of your internal organs have been replaced with surplus prosthetics." + icon = FA_ICON_ROBOT + value = -6 + medical_record_text = "During physical examination, patient was found to have numerous low-budget prosthetic internal organs. \ + Removal of these organs is known to be dangerous to the patient as well as the practitioner." + hardcore_value = 6 + mail_goodies = list(/obj/item/storage/organbox) + +/datum/quirk/tin_man/add_unique(client/client_source) + var/mob/living/carbon/human/human_holder = quirk_holder + var/static/list/organ_slots = list( + ORGAN_SLOT_HEART = /obj/item/organ/internal/heart/cybernetic/surplus, + ORGAN_SLOT_LUNGS = /obj/item/organ/internal/lungs/cybernetic/surplus, + ORGAN_SLOT_LIVER = /obj/item/organ/internal/liver/cybernetic/surplus, + ORGAN_SLOT_STOMACH = /obj/item/organ/internal/stomach/cybernetic/surplus, + ) + var/list/possible_organ_slots = organ_slots.Copy() + if(HAS_TRAIT(human_holder, TRAIT_NOBLOOD)) + possible_organ_slots -= ORGAN_SLOT_HEART + if(HAS_TRAIT(human_holder, TRAIT_NOBREATH)) + possible_organ_slots -= ORGAN_SLOT_LUNGS + if(HAS_TRAIT(human_holder, TRAIT_LIVERLESS_METABOLISM)) + possible_organ_slots -= ORGAN_SLOT_LIVER + if(HAS_TRAIT(human_holder, TRAIT_NOHUNGER)) + possible_organ_slots -= ORGAN_SLOT_STOMACH + if(!length(organ_slots)) //what the hell + return + for(var/organ_slot in possible_organ_slots) + var/organ_path = possible_organ_slots[organ_slot] + var/obj/item/organ/new_organ = new organ_path() + new_organ.Insert(human_holder, special = TRUE, drop_if_replaced = FALSE) + +/datum/quirk/tin_man/post_add() + to_chat(quirk_holder, span_boldannounce("Most of your internal organs have been replaced with surplus prosthetics. They are fragile and will easily come apart under duress. \ + Additionally, any EMP will make them stop working entirely.")) diff --git a/code/datums/quirks/negative_quirks/unstable.dm b/code/datums/quirks/negative_quirks/unstable.dm new file mode 100644 index 0000000000000..5d39776eeba20 --- /dev/null +++ b/code/datums/quirks/negative_quirks/unstable.dm @@ -0,0 +1,11 @@ +/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 = FA_ICON_ANGRY + value = -10 + mob_trait = TRAIT_UNSTABLE + gain_text = span_danger("There's a lot on your mind right now.") + lose_text = span_notice("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 + mail_goodies = list(/obj/effect/spawner/random/entertainment/plushie) diff --git a/code/datums/quirks/neutral_quirks.dm b/code/datums/quirks/neutral_quirks.dm deleted file mode 100644 index 26d4e53c1860f..0000000000000 --- a/code/datums/quirks/neutral_quirks.dm +++ /dev/null @@ -1,513 +0,0 @@ -//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 = FA_ICON_USERS - value = 0 - mob_trait = TRAIT_EXTROVERT - gain_text = span_notice("You feel like hanging out with other people.") - lose_text = span_danger("You feel like you're over the bar scene.") - medical_record_text = "Patient will not shut the hell up." - mail_goodies = list(/obj/item/reagent_containers/cup/glass/flask) - -/datum/quirk/introvert - name = "Introvert" - desc = "You are energized by having time to yourself, and enjoy spending your free time in the library." - icon = FA_ICON_BOOK_READER - value = 0 - mob_trait = TRAIT_INTROVERT - gain_text = span_notice("You feel like reading a good book quietly.") - lose_text = span_danger("You feel like libraries are boring.") - medical_record_text = "Patient doesn't seem to say much." - mail_goodies = list(/obj/item/book/random) - -/datum/quirk/no_taste - name = "Ageusia" - desc = "You can't taste anything! Toxic food will still poison you." - icon = FA_ICON_MEH_BLANK - value = 0 - mob_trait = TRAIT_AGEUSIA - gain_text = span_notice("You can't taste anything!") - lose_text = span_notice("You can taste again!") - medical_record_text = "Patient suffers from ageusia and is incapable of tasting food or reagents." - mail_goodies = list(/obj/effect/spawner/random/food_or_drink/condiment) // but can you taste the salt? CAN YOU?! - -/datum/quirk/foreigner - name = "Foreigner" - desc = "You're not from around here. You don't know Galactic Common!" - icon = FA_ICON_LANGUAGE - value = 0 - gain_text = span_notice("The words being spoken around you don't make any sense.") - lose_text = span_notice("You've developed fluency in Galactic Common.") - medical_record_text = "Patient does not speak Galactic Common and may require an interpreter." - mail_goodies = list(/obj/item/taperecorder) // for translation - -/datum/quirk/foreigner/add(client/client_source) - 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, understood = TRUE, spoken = TRUE, source = LANGUAGE_QUIRK) - -/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 = FA_ICON_CARROT - value = 0 - gain_text = span_notice("You feel repulsion at the idea of eating meat.") - lose_text = span_notice("You feel like eating meat isn't that bad.") - medical_record_text = "Patient reports a vegetarian diet." - mail_goodies = list(/obj/effect/spawner/random/food_or_drink/salad) - -/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/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 = FA_ICON_USER_TIE - value = 0 - gain_text = span_notice("You feel like you understand what things should look like.") - lose_text = span_notice("Well who cares about deco anyways?") - medical_record_text = "Patient seems to be rather stuck up." - mob_trait = TRAIT_SNOB - mail_goodies = list(/obj/item/chisel, /obj/item/paint_palette) - -/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 = FA_ICON_THUMBS_UP - value = 0 - gain_text = span_notice("You feel an intense craving for pineapple.") - lose_text = span_notice("Your feelings towards pineapples seem to return to a lukewarm state.") - medical_record_text = "Patient demonstrates a pathological love of pineapple." - mail_goodies = list(/obj/item/food/pizzaslice/pineapple) - -/datum/quirk/pineapple_liker/add(client/client_source) - 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 = FA_ICON_THUMBS_DOWN - value = 0 - gain_text = span_notice("You find yourself pondering what kind of idiot actually enjoys pineapples...") - lose_text = span_notice("Your feelings towards pineapples seem to return to a lukewarm state.") - medical_record_text = "Patient is correct to think that pineapple is disgusting." - mail_goodies = list( // basic pizza slices - /obj/item/food/pizzaslice/margherita, - /obj/item/food/pizzaslice/meat, - /obj/item/food/pizzaslice/mushroom, - /obj/item/food/pizzaslice/vegetable, - /obj/item/food/pizzaslice/sassysage, - ) - -/datum/quirk/pineapple_hater/add(client/client_source) - 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 = FA_ICON_GRIN_TONGUE_SQUINT - value = 0 - gain_text = span_notice("You start craving something that tastes strange.") - lose_text = span_notice("You feel like eating normal food again.") - medical_record_text = "Patient demonstrates irregular nutrition preferences." - mail_goodies = list(/obj/item/food/urinalcake, /obj/item/food/badrecipe) // Mhhhmmm yummy - -/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 - species.liked_food = species.disliked_food - species.disliked_food = liked - RegisterSignal(human_holder, COMSIG_SPECIES_GAIN, PROC_REF(on_species_gain)) - -/datum/quirk/deviant_tastes/proc/on_species_gain(datum/source, datum/species/new_species, datum/species/old_species) - SIGNAL_HANDLER - var/liked = new_species.liked_food - new_species.liked_food = new_species.disliked_food - new_species.disliked_food = liked - -/datum/quirk/deviant_tastes/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) - species.disliked_food = initial(species.disliked_food) - UnregisterSignal(human_holder, COMSIG_SPECIES_GAIN) - -/datum/quirk/heterochromatic - name = "Heterochromatic" - desc = "One of your eyes is a different color than the other!" - icon = FA_ICON_EYE_LOW_VISION // Ignore the icon name, its actually a fairly good representation of different color eyes - quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE - value = 0 - mail_goodies = list(/obj/item/clothing/glasses/eyepatch) - -// Only your first eyes are heterochromatic -// If someone comes and says "well mr coder you can have DNA bound heterochromia so it's not unrealistic -// to allow all inserted replacement eyes to become heterochromatic or for it to transfer between mobs" -// Then just change this to [proc/add] I really don't care -/datum/quirk/heterochromatic/add_unique(client/client_source) - var/color = client_source?.prefs.read_preference(/datum/preference/color/heterochromatic) - if(!color) - return - - apply_heterochromatic_eyes(color) - -/// Applies the passed color to this mob's eyes -/datum/quirk/heterochromatic/proc/apply_heterochromatic_eyes(color) - var/mob/living/carbon/human/human_holder = quirk_holder - var/was_not_hetero = !human_holder.eye_color_heterochromatic - human_holder.eye_color_heterochromatic = TRUE - human_holder.eye_color_right = color - - var/obj/item/organ/internal/eyes/eyes_of_the_holder = quirk_holder.get_organ_by_type(/obj/item/organ/internal/eyes) - if(!eyes_of_the_holder) - return - - eyes_of_the_holder.eye_color_right = color - eyes_of_the_holder.old_eye_color_right = color - eyes_of_the_holder.refresh() - - if(was_not_hetero) - RegisterSignal(human_holder, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(check_eye_removal)) - -/datum/quirk/heterochromatic/remove() - var/mob/living/carbon/human/human_holder = quirk_holder - human_holder.eye_color_heterochromatic = FALSE - human_holder.eye_color_right = human_holder.eye_color_left - UnregisterSignal(human_holder, COMSIG_CARBON_LOSE_ORGAN) - -/datum/quirk/heterochromatic/proc/check_eye_removal(datum/source, obj/item/organ/internal/eyes/removed) - SIGNAL_HANDLER - - if(!istype(removed)) - return - - // Eyes were removed, remove heterochromia from the human holder and bid them adieu - var/mob/living/carbon/human/human_holder = quirk_holder - human_holder.eye_color_heterochromatic = FALSE - human_holder.eye_color_right = human_holder.eye_color_left - 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 = FA_ICON_ADJUST - value = 0 - medical_record_text = "Patient is afflicted with almost complete color blindness." - mail_goodies = list( // Noir detective wannabe - /obj/item/clothing/suit/jacket/det_suit/noir, - /obj/item/clothing/suit/jacket/det_suit/dark, - /obj/item/clothing/head/fedora/beige, - /obj/item/clothing/head/fedora/white, - ) - -/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_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 = FA_ICON_SPIDER - value = 0 - medical_record_text = "Patient has an irrational fear of something." - mail_goodies = list(/obj/item/clothing/glasses/blindfold, /obj/item/storage/pill_bottle/psicodine) - -// Phobia will follow you between transfers -/datum/quirk/phobia/add(client/client_source) - var/phobia = client_source?.prefs.read_preference(/datum/preference/choiced/phobia) - if(!phobia) - return - - 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/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 = FA_ICON_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 - mail_goodies = list(/obj/item/clothing/head/costume/papersack, /obj/item/clothing/head/costume/papersack/smiley) - -/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 = FA_ICON_EGG - value = 0 - mob_trait = TRAIT_BALD - gain_text = span_notice("Your head is as smooth as can be, it's terrible.") - lose_text = span_notice("Your head itches, could it be... growing hair?!") - medical_record_text = "Patient starkly refused to take off headwear during examination." - mail_goodies = list(/obj/item/clothing/head/wig/random) - /// The user's starting hairstyle - var/old_hair - -/datum/quirk/item_quirk/bald/add(client/client_source) - 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(client/client_source) - 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)) - human_holder.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)) - quirk_holder.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 - quirk_holder.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 - - quirk_holder.add_mood_event("bad_hair_day", /datum/mood_event/bald) - -/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." - icon = FA_ICON_CAMERA - value = 0 - mob_trait = TRAIT_PHOTOGRAPHER - gain_text = span_notice("You know everything about photography.") - lose_text = span_danger("You forget how photo cameras work.") - medical_record_text = "Patient mentions photography as a stress-relieving hobby." - mail_goodies = list(/obj/item/camera_film) - -/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 - photo_album.persistence_load() - photo_album.name = "[human_holder.real_name]'s photo album" - - give_item_to_holder(photo_album, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) - give_item_to_holder( - /obj/item/camera, - list( - LOCATION_NECK = ITEM_SLOT_NECK, - LOCATION_LPOCKET = ITEM_SLOT_LPOCKET, - LOCATION_RPOCKET = ITEM_SLOT_RPOCKET, - LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, - LOCATION_HANDS = ITEM_SLOT_HANDS - ) - ) - -/datum/quirk/item_quirk/colorist - name = "Colorist" - desc = "You like carrying around a hair dye spray to quickly apply color patterns to your hair." - icon = FA_ICON_FILL_DRIP - value = 0 - medical_record_text = "Patient enjoys dyeing their hair with pretty colors." - mail_goodies = list(/obj/item/dyespray) - -/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 = FA_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 - mail_goodies = list(/obj/item/toy/intento, /obj/item/clothing/head/fedora) - /// Timer for gaming withdrawal to kick in - var/gaming_withdrawal_timer = TIMER_ID_NULL - -/datum/quirk/gamer/add(client/client_source) - // 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(client/client_source) - // 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 - human_holder.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 - human_holder.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 - human_holder.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 - human_holder.add_mood_event("gamer_withdrawal", /datum/mood_event/gamer_withdrawal) - -#undef GAMING_WITHDRAWAL_TIME - - -/datum/quirk/item_quirk/pride_pin - name = "Pride Pin" - desc = "Show off your pride with this changing pride pin!" - icon = FA_ICON_RAINBOW - value = 0 - gain_text = span_notice("You feel fruity.") - lose_text = span_danger("You feel only slightly less fruity than before.") - medical_record_text = "Patient appears to be fruity." - -/datum/quirk/item_quirk/pride_pin/add_unique(client/client_source) - var/obj/item/clothing/accessory/pride/pin = new(get_turf(quirk_holder)) - - var/pride_choice = client_source?.prefs?.read_preference(/datum/preference/choiced/pride_pin) || assoc_to_keys(GLOB.pride_pin_reskins)[1] - var/pride_reskin = GLOB.pride_pin_reskins[pride_choice] - - pin.current_skin = pride_choice - pin.icon_state = pride_reskin - - give_item_to_holder(pin, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) diff --git a/code/datums/quirks/neutral_quirks/bald.dm b/code/datums/quirks/neutral_quirks/bald.dm new file mode 100644 index 0000000000000..8a760f6ceefdb --- /dev/null +++ b/code/datums/quirks/neutral_quirks/bald.dm @@ -0,0 +1,53 @@ +/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 = FA_ICON_EGG + value = 0 + mob_trait = TRAIT_BALD + gain_text = span_notice("Your head is as smooth as can be, it's terrible.") + lose_text = span_notice("Your head itches, could it be... growing hair?!") + medical_record_text = "Patient starkly refused to take off headwear during examination." + mail_goodies = list(/obj/item/clothing/head/wig/random) + /// The user's starting hairstyle + var/old_hair + +/datum/quirk/item_quirk/bald/add(client/client_source) + var/mob/living/carbon/human/human_holder = quirk_holder + old_hair = human_holder.hairstyle + human_holder.set_hairstyle("Bald", update = TRUE) + 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(client/client_source) + 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)) + human_holder.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)) + quirk_holder.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 + quirk_holder.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 + + quirk_holder.add_mood_event("bad_hair_day", /datum/mood_event/bald) diff --git a/code/datums/quirks/neutral_quirks/colorist.dm b/code/datums/quirks/neutral_quirks/colorist.dm new file mode 100644 index 0000000000000..cad9c0a742e15 --- /dev/null +++ b/code/datums/quirks/neutral_quirks/colorist.dm @@ -0,0 +1,10 @@ +/datum/quirk/item_quirk/colorist + name = "Colorist" + desc = "You like carrying around a hair dye spray to quickly apply color patterns to your hair." + icon = FA_ICON_FILL_DRIP + value = 0 + medical_record_text = "Patient enjoys dyeing their hair with pretty colors." + mail_goodies = list(/obj/item/dyespray) + +/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)) diff --git a/code/datums/quirks/neutral_quirks/deviant_tastes.dm b/code/datums/quirks/neutral_quirks/deviant_tastes.dm new file mode 100644 index 0000000000000..566b469c7a77d --- /dev/null +++ b/code/datums/quirks/neutral_quirks/deviant_tastes.dm @@ -0,0 +1,24 @@ +/datum/quirk/deviant_tastes + name = "Deviant Tastes" + desc = "You dislike food that most people enjoy, and find delicious what they don't." + icon = FA_ICON_GRIN_TONGUE_SQUINT + value = 0 + gain_text = span_notice("You start craving something that tastes strange.") + lose_text = span_notice("You feel like eating normal food again.") + medical_record_text = "Patient demonstrates irregular nutrition preferences." + mail_goodies = list(/obj/item/food/urinalcake, /obj/item/food/badrecipe) // Mhhhmmm yummy + +/datum/quirk/deviant_tastes/add(client/client_source) + var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) + if(!tongue) + return + var/liked_foodtypes = tongue.liked_foodtypes + tongue.liked_foodtypes = tongue.disliked_foodtypes + tongue.disliked_foodtypes = liked_foodtypes + +/datum/quirk/deviant_tastes/remove() + var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) + if(!tongue) + return + tongue.liked_foodtypes = initial(tongue.liked_foodtypes) + tongue.disliked_foodtypes = initial(tongue.disliked_foodtypes) diff --git a/code/datums/quirks/neutral_quirks/extrovert.dm b/code/datums/quirks/neutral_quirks/extrovert.dm new file mode 100644 index 0000000000000..5622956ba5b5b --- /dev/null +++ b/code/datums/quirks/neutral_quirks/extrovert.dm @@ -0,0 +1,10 @@ +/datum/quirk/extrovert + name = "Extrovert" + desc = "You are energized by talking to others, and enjoy spending your free time in the bar." + icon = FA_ICON_USERS + value = 0 + mob_trait = TRAIT_EXTROVERT + gain_text = span_notice("You feel like hanging out with other people.") + lose_text = span_danger("You feel like you're over the bar scene.") + medical_record_text = "Patient will not shut the hell up." + mail_goodies = list(/obj/item/reagent_containers/cup/glass/flask) diff --git a/code/datums/quirks/neutral_quirks/foreigner.dm b/code/datums/quirks/neutral_quirks/foreigner.dm new file mode 100644 index 0000000000000..da317a7e66a44 --- /dev/null +++ b/code/datums/quirks/neutral_quirks/foreigner.dm @@ -0,0 +1,21 @@ +/datum/quirk/foreigner + name = "Foreigner" + desc = "You're not from around here. You don't know Galactic Common!" + icon = FA_ICON_LANGUAGE + value = 0 + gain_text = span_notice("The words being spoken around you don't make any sense.") + lose_text = span_notice("You've developed fluency in Galactic Common.") + medical_record_text = "Patient does not speak Galactic Common and may require an interpreter." + mail_goodies = list(/obj/item/taperecorder) // for translation + +/datum/quirk/foreigner/add(client/client_source) + 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, source = LANGUAGE_QUIRK) + +/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) diff --git a/code/datums/quirks/neutral_quirks/gamer.dm b/code/datums/quirks/neutral_quirks/gamer.dm new file mode 100644 index 0000000000000..0ab2e780480ee --- /dev/null +++ b/code/datums/quirks/neutral_quirks/gamer.dm @@ -0,0 +1,90 @@ +#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 = FA_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 + mail_goodies = list(/obj/item/toy/intento, /obj/item/clothing/head/fedora) + /// Timer for gaming withdrawal to kick in + var/gaming_withdrawal_timer = TIMER_ID_NULL + +/datum/quirk/gamer/add(client/client_source) + var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) + if(tongue) + // Gamer diet + tongue.liked_foodtypes = JUNKFOOD + RegisterSignal(quirk_holder, COMSIG_MOB_WON_VIDEOGAME, PROC_REF(won_game)) + RegisterSignal(quirk_holder, COMSIG_MOB_LOST_VIDEOGAME, PROC_REF(lost_game)) + RegisterSignal(quirk_holder, COMSIG_MOB_PLAYED_VIDEOGAME, PROC_REF(gamed)) + +/datum/quirk/gamer/add_unique(client/client_source) + // The gamer starts off quelled + gaming_withdrawal_timer = addtimer(CALLBACK(src, PROC_REF(enter_withdrawal)), GAMING_WITHDRAWAL_TIME, TIMER_STOPPABLE) + +/datum/quirk/gamer/remove() + var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) + if(tongue) + tongue.liked_foodtypes = initial(tongue.liked_foodtypes) + UnregisterSignal(quirk_holder, COMSIG_MOB_WON_VIDEOGAME) + UnregisterSignal(quirk_holder, COMSIG_MOB_LOST_VIDEOGAME) + UnregisterSignal(quirk_holder, COMSIG_MOB_PLAYED_VIDEOGAME) + +/** + * 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 + human_holder.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 + human_holder.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 + human_holder.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 + human_holder.add_mood_event("gamer_withdrawal", /datum/mood_event/gamer_withdrawal) + +#undef GAMING_WITHDRAWAL_TIME diff --git a/code/datums/quirks/neutral_quirks/heretochromatic.dm b/code/datums/quirks/neutral_quirks/heretochromatic.dm new file mode 100644 index 0000000000000..1df079c0e45f5 --- /dev/null +++ b/code/datums/quirks/neutral_quirks/heretochromatic.dm @@ -0,0 +1,54 @@ +/datum/quirk/heterochromatic + name = "Heterochromatic" + desc = "One of your eyes is a different color than the other!" + icon = FA_ICON_EYE_LOW_VISION // Ignore the icon name, its actually a fairly good representation of different color eyes + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE + value = 0 + mail_goodies = list(/obj/item/clothing/glasses/eyepatch) + +// Only your first eyes are heterochromatic +// If someone comes and says "well mr coder you can have DNA bound heterochromia so it's not unrealistic +// to allow all inserted replacement eyes to become heterochromatic or for it to transfer between mobs" +// Then just change this to [proc/add] I really don't care +/datum/quirk/heterochromatic/add_unique(client/client_source) + var/color = client_source?.prefs.read_preference(/datum/preference/color/heterochromatic) + if(!color) + return + + apply_heterochromatic_eyes(color) + +/// Applies the passed color to this mob's eyes +/datum/quirk/heterochromatic/proc/apply_heterochromatic_eyes(color) + var/mob/living/carbon/human/human_holder = quirk_holder + var/was_not_hetero = !human_holder.eye_color_heterochromatic + human_holder.eye_color_heterochromatic = TRUE + human_holder.eye_color_right = color + + var/obj/item/organ/internal/eyes/eyes_of_the_holder = quirk_holder.get_organ_by_type(/obj/item/organ/internal/eyes) + if(!eyes_of_the_holder) + return + + eyes_of_the_holder.eye_color_right = color + eyes_of_the_holder.old_eye_color_right = color + eyes_of_the_holder.refresh() + + if(was_not_hetero) + RegisterSignal(human_holder, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(check_eye_removal)) + +/datum/quirk/heterochromatic/remove() + var/mob/living/carbon/human/human_holder = quirk_holder + human_holder.eye_color_heterochromatic = FALSE + human_holder.eye_color_right = human_holder.eye_color_left + UnregisterSignal(human_holder, COMSIG_CARBON_LOSE_ORGAN) + +/datum/quirk/heterochromatic/proc/check_eye_removal(datum/source, obj/item/organ/internal/eyes/removed) + SIGNAL_HANDLER + + if(!istype(removed)) + return + + // Eyes were removed, remove heterochromia from the human holder and bid them adieu + var/mob/living/carbon/human/human_holder = quirk_holder + human_holder.eye_color_heterochromatic = FALSE + human_holder.eye_color_right = human_holder.eye_color_left + UnregisterSignal(human_holder, COMSIG_CARBON_LOSE_ORGAN) diff --git a/code/datums/quirks/neutral_quirks/introvert.dm b/code/datums/quirks/neutral_quirks/introvert.dm new file mode 100644 index 0000000000000..51f6f3e785e43 --- /dev/null +++ b/code/datums/quirks/neutral_quirks/introvert.dm @@ -0,0 +1,10 @@ +/datum/quirk/introvert + name = "Introvert" + desc = "You are energized by having time to yourself, and enjoy spending your free time in the library." + icon = FA_ICON_BOOK_READER + value = 0 + mob_trait = TRAIT_INTROVERT + gain_text = span_notice("You feel like reading a good book quietly.") + lose_text = span_danger("You feel like libraries are boring.") + medical_record_text = "Patient doesn't seem to say much." + mail_goodies = list(/obj/item/book/random) diff --git a/code/datums/quirks/neutral_quirks/monochromatic.dm b/code/datums/quirks/neutral_quirks/monochromatic.dm new file mode 100644 index 0000000000000..dd66220cb56a9 --- /dev/null +++ b/code/datums/quirks/neutral_quirks/monochromatic.dm @@ -0,0 +1,23 @@ +/datum/quirk/monochromatic + name = "Monochromacy" + desc = "You suffer from full colorblindness, and perceive nearly the entire world in blacks and whites." + icon = FA_ICON_ADJUST + value = 0 + medical_record_text = "Patient is afflicted with almost complete color blindness." + mail_goodies = list( // Noir detective wannabe + /obj/item/clothing/suit/jacket/det_suit/noir, + /obj/item/clothing/suit/jacket/det_suit/dark, + /obj/item/clothing/head/fedora/beige, + /obj/item/clothing/head/fedora/white, + ) + +/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_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) diff --git a/code/datums/quirks/neutral_quirks/no_taste.dm b/code/datums/quirks/neutral_quirks/no_taste.dm new file mode 100644 index 0000000000000..664aaf1d9de23 --- /dev/null +++ b/code/datums/quirks/neutral_quirks/no_taste.dm @@ -0,0 +1,10 @@ +/datum/quirk/no_taste + name = "Ageusia" + desc = "You can't taste anything! Toxic food will still poison you." + icon = FA_ICON_MEH_BLANK + value = 0 + mob_trait = TRAIT_AGEUSIA + gain_text = span_notice("You can't taste anything!") + lose_text = span_notice("You can taste again!") + medical_record_text = "Patient suffers from ageusia and is incapable of tasting food or reagents." + mail_goodies = list(/obj/effect/spawner/random/food_or_drink/condiment) // but can you taste the salt? CAN YOU?! diff --git a/code/datums/quirks/neutral_quirks/phobia.dm b/code/datums/quirks/neutral_quirks/phobia.dm new file mode 100644 index 0000000000000..224401f0670c5 --- /dev/null +++ b/code/datums/quirks/neutral_quirks/phobia.dm @@ -0,0 +1,20 @@ +/datum/quirk/phobia + name = "Phobia" + desc = "You are irrationally afraid of something." + icon = FA_ICON_SPIDER + value = 0 + medical_record_text = "Patient has an irrational fear of something." + mail_goodies = list(/obj/item/clothing/glasses/blindfold, /obj/item/storage/pill_bottle/psicodine) + +// Phobia will follow you between transfers +/datum/quirk/phobia/add(client/client_source) + var/phobia = client_source?.prefs.read_preference(/datum/preference/choiced/phobia) + if(!phobia) + return + + 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/remove() + var/mob/living/carbon/human/human_holder = quirk_holder + human_holder.cure_trauma_type(/datum/brain_trauma/mild/phobia, TRAUMA_RESILIENCE_ABSOLUTE) diff --git a/code/datums/quirks/neutral_quirks/photographer.dm b/code/datums/quirks/neutral_quirks/photographer.dm new file mode 100644 index 0000000000000..d2284df240ca7 --- /dev/null +++ b/code/datums/quirks/neutral_quirks/photographer.dm @@ -0,0 +1,29 @@ +/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." + icon = FA_ICON_CAMERA + value = 0 + mob_trait = TRAIT_PHOTOGRAPHER + gain_text = span_notice("You know everything about photography.") + lose_text = span_danger("You forget how photo cameras work.") + medical_record_text = "Patient mentions photography as a stress-relieving hobby." + mail_goodies = list(/obj/item/camera_film) + +/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 + photo_album.persistence_load() + photo_album.name = "[human_holder.real_name]'s photo album" + + give_item_to_holder(photo_album, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) + give_item_to_holder( + /obj/item/camera, + list( + LOCATION_NECK = ITEM_SLOT_NECK, + LOCATION_LPOCKET = ITEM_SLOT_LPOCKET, + LOCATION_RPOCKET = ITEM_SLOT_RPOCKET, + LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, + LOCATION_HANDS = ITEM_SLOT_HANDS + ) + ) diff --git a/code/datums/quirks/neutral_quirks/pineapple_hater.dm b/code/datums/quirks/neutral_quirks/pineapple_hater.dm new file mode 100644 index 0000000000000..f17eb4224ec4c --- /dev/null +++ b/code/datums/quirks/neutral_quirks/pineapple_hater.dm @@ -0,0 +1,27 @@ +/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 = FA_ICON_THUMBS_DOWN + value = 0 + gain_text = span_notice("You find yourself pondering what kind of idiot actually enjoys pineapples...") + lose_text = span_notice("Your feelings towards pineapples seem to return to a lukewarm state.") + medical_record_text = "Patient is correct to think that pineapple is disgusting." + mail_goodies = list( // basic pizza slices + /obj/item/food/pizzaslice/margherita, + /obj/item/food/pizzaslice/meat, + /obj/item/food/pizzaslice/mushroom, + /obj/item/food/pizzaslice/vegetable, + /obj/item/food/pizzaslice/sassysage, + ) + +/datum/quirk/pineapple_hater/add(client/client_source) + var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) + if(!tongue) + return + tongue.disliked_foodtypes |= PINEAPPLE + +/datum/quirk/pineapple_hater/remove() + var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) + if(!tongue) + return + tongue.disliked_foodtypes = initial(tongue.disliked_foodtypes) diff --git a/code/datums/quirks/neutral_quirks/pineapple_liker.dm b/code/datums/quirks/neutral_quirks/pineapple_liker.dm new file mode 100644 index 0000000000000..c342e14769cf8 --- /dev/null +++ b/code/datums/quirks/neutral_quirks/pineapple_liker.dm @@ -0,0 +1,21 @@ +/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 = FA_ICON_THUMBS_UP + value = 0 + gain_text = span_notice("You feel an intense craving for pineapple.") + lose_text = span_notice("Your feelings towards pineapples seem to return to a lukewarm state.") + medical_record_text = "Patient demonstrates a pathological love of pineapple." + mail_goodies = list(/obj/item/food/pizzaslice/pineapple) + +/datum/quirk/pineapple_liker/add(client/client_source) + var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) + if(!tongue) + return + tongue.liked_foodtypes |= PINEAPPLE + +/datum/quirk/pineapple_liker/remove() + var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) + if(!tongue) + return + tongue.liked_foodtypes = initial(tongue.liked_foodtypes) diff --git a/code/datums/quirks/neutral_quirks/pride_pin.dm b/code/datums/quirks/neutral_quirks/pride_pin.dm new file mode 100644 index 0000000000000..488c0a2bccb58 --- /dev/null +++ b/code/datums/quirks/neutral_quirks/pride_pin.dm @@ -0,0 +1,19 @@ +/datum/quirk/item_quirk/pride_pin + name = "Pride Pin" + desc = "Show off your pride with this changing pride pin!" + icon = FA_ICON_RAINBOW + value = 0 + gain_text = span_notice("You feel fruity.") + lose_text = span_danger("You feel only slightly less fruity than before.") + medical_record_text = "Patient appears to be fruity." + +/datum/quirk/item_quirk/pride_pin/add_unique(client/client_source) + var/obj/item/clothing/accessory/pride/pin = new(get_turf(quirk_holder)) + + var/pride_choice = client_source?.prefs?.read_preference(/datum/preference/choiced/pride_pin) || assoc_to_keys(GLOB.pride_pin_reskins)[1] + var/pride_reskin = GLOB.pride_pin_reskins[pride_choice] + + pin.current_skin = pride_choice + pin.icon_state = pride_reskin + + give_item_to_holder(pin, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) diff --git a/code/datums/quirks/neutral_quirks/shifty_eyes.dm b/code/datums/quirks/neutral_quirks/shifty_eyes.dm new file mode 100644 index 0000000000000..29f1def376150 --- /dev/null +++ b/code/datums/quirks/neutral_quirks/shifty_eyes.dm @@ -0,0 +1,8 @@ +/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 = FA_ICON_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 + mail_goodies = list(/obj/item/clothing/head/costume/papersack, /obj/item/clothing/head/costume/papersack/smiley) diff --git a/code/datums/quirks/neutral_quirks/snob.dm b/code/datums/quirks/neutral_quirks/snob.dm new file mode 100644 index 0000000000000..ab273f1ae530e --- /dev/null +++ b/code/datums/quirks/neutral_quirks/snob.dm @@ -0,0 +1,10 @@ +/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 = FA_ICON_USER_TIE + value = 0 + gain_text = span_notice("You feel like you understand what things should look like.") + lose_text = span_notice("Well who cares about deco anyways?") + medical_record_text = "Patient seems to be rather stuck up." + mob_trait = TRAIT_SNOB + mail_goodies = list(/obj/item/chisel, /obj/item/paint_palette) diff --git a/code/datums/quirks/neutral_quirks/vegetarian.dm b/code/datums/quirks/neutral_quirks/vegetarian.dm new file mode 100644 index 0000000000000..0ade72acafe57 --- /dev/null +++ b/code/datums/quirks/neutral_quirks/vegetarian.dm @@ -0,0 +1,23 @@ +/datum/quirk/vegetarian + name = "Vegetarian" + desc = "You find the idea of eating meat morally and physically repulsive." + icon = FA_ICON_CARROT + value = 0 + gain_text = span_notice("You feel repulsion at the idea of eating meat.") + lose_text = span_notice("You feel like eating meat isn't that bad.") + medical_record_text = "Patient reports a vegetarian diet." + mail_goodies = list(/obj/effect/spawner/random/food_or_drink/salad) + +/datum/quirk/vegetarian/add(client/client_source) + var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) + if(!tongue) + return + tongue.liked_foodtypes &= ~MEAT + tongue.disliked_foodtypes |= MEAT + +/datum/quirk/vegetarian/remove() + var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) + if(!tongue) + return + tongue.liked_foodtypes = initial(tongue.liked_foodtypes) + tongue.disliked_foodtypes = initial(tongue.disliked_foodtypes) diff --git a/code/datums/quirks/positive_quirks.dm b/code/datums/quirks/positive_quirks.dm deleted file mode 100644 index 2eb5a45f4d128..0000000000000 --- a/code/datums/quirks/positive_quirks.dm +++ /dev/null @@ -1,379 +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 = FA_ICON_BEER - value = 4 - mob_trait = TRAIT_ALCOHOL_TOLERANCE - gain_text = span_notice("You feel like you could drink a whole keg!") - lose_text = span_danger("You don't feel as resistant to alcohol anymore. Somehow.") - medical_record_text = "Patient demonstrates a high tolerance for alcohol." - mail_goodies = list(/obj/item/skillchip/wine_taster) - -/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 = FA_ICON_MEH - value = 4 - quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED - medical_record_text = "Patient was administered the Apathy Evaluation Scale but did not bother to complete it." - mail_goodies = list(/obj/item/hourglass) - -/datum/quirk/apathetic/add(client/client_source) - quirk_holder.mob_mood?.mood_modifier -= 0.2 - -/datum/quirk/apathetic/remove() - quirk_holder.mob_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 = FA_ICON_WINE_BOTTLE - value = 8 - gain_text = span_notice("You feel like a drink would do you good.") - lose_text = span_danger("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." - quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES - mail_goodies = list(/obj/effect/spawner/random/food_or_drink/booze) - -/datum/quirk/drunkhealing/process(seconds_per_tick) - switch(quirk_holder.get_drunk_amount()) - if (6 to 40) - quirk_holder.adjustBruteLoss(-0.1 * seconds_per_tick, FALSE, required_bodytype = BODYTYPE_ORGANIC) - quirk_holder.adjustFireLoss(-0.05 * seconds_per_tick, required_bodytype = BODYTYPE_ORGANIC) - if (41 to 60) - quirk_holder.adjustBruteLoss(-0.4 * seconds_per_tick, FALSE, required_bodytype = BODYTYPE_ORGANIC) - quirk_holder.adjustFireLoss(-0.2 * seconds_per_tick, required_bodytype = BODYTYPE_ORGANIC) - if (61 to INFINITY) - quirk_holder.adjustBruteLoss(-0.8 * seconds_per_tick, FALSE, required_bodytype = BODYTYPE_ORGANIC) - quirk_holder.adjustFireLoss(-0.4 * seconds_per_tick, required_bodytype = BODYTYPE_ORGANIC) - -/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 = FA_ICON_SMILE_BEAM - value = 8 - mob_trait = TRAIT_EMPATH - gain_text = span_notice("You feel in tune with those around you.") - lose_text = span_danger("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." - mail_goodies = list(/obj/item/toy/foamfinger) - -/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 = FA_ICON_MAP_PIN - value = 2 - mob_trait = TRAIT_CLOWN_ENJOYER - gain_text = span_notice("You are a big enjoyer of clowns.") - lose_text = span_danger("The clown doesn't seem so great.") - medical_record_text = "Patient reports being a big enjoyer of clowns." - mail_goodies = list( - /obj/item/bikehorn, - /obj/item/stamp/clown, - /obj/item/megaphone/clown, - /obj/item/clothing/shoes/clown_shoes, - /obj/item/bedsheet/clown, - /obj/item/clothing/mask/gas/clown_hat, - /obj/item/storage/backpack/clown, - /obj/item/storage/backpack/duffelbag/clown, - /obj/item/toy/crayon/rainbow, - /obj/item/toy/figure/clown, - ) - -/datum/quirk/item_quirk/clown_enjoyer/add_unique(client/client_source) - 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(client/client_source) - var/datum/atom_hud/fan = GLOB.huds[DATA_HUD_FAN] - fan.show_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 = FA_ICON_THUMBTACK - value = 2 - mob_trait = TRAIT_MIME_FAN - gain_text = span_notice("You are a big fan of the Mime.") - lose_text = span_danger("The mime doesn't seem so great.") - medical_record_text = "Patient reports being a big fan of mimes." - mail_goodies = list( - /obj/item/toy/crayon/mime, - /obj/item/clothing/mask/gas/mime, - /obj/item/storage/backpack/mime, - /obj/item/clothing/under/rank/civilian/mime, - /obj/item/reagent_containers/cup/glass/bottle/bottleofnothing, - /obj/item/stamp/mime, - /obj/item/storage/box/survival/hug/black, - /obj/item/bedsheet/mime, - /obj/item/clothing/shoes/sneakers/mime, - /obj/item/toy/figure/mime, - /obj/item/toy/crayon/spraycan/mimecan, - ) - -/datum/quirk/item_quirk/mime_fan/add_unique(client/client_source) - 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(client/client_source) - var/datum/atom_hud/fan = GLOB.huds[DATA_HUD_FAN] - fan.show_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 = FA_ICON_RUNNING - value = 8 - mob_trait = TRAIT_FREERUNNING - gain_text = span_notice("You feel lithe on your feet!") - lose_text = span_danger("You feel clumsy again.") - medical_record_text = "Patient scored highly on cardio tests." - mail_goodies = list(/obj/item/melee/skateboard, /obj/item/clothing/shoes/wheelys/rollerskates) - -/datum/quirk/friendly - name = "Friendly" - desc = "You give the best hugs, especially when you're in the right mood." - icon = FA_ICON_HANDS_HELPING - value = 2 - mob_trait = TRAIT_FRIENDLY - gain_text = span_notice("You want to hug someone.") - lose_text = span_danger("You no longer feel compelled to hug others.") - quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED - medical_record_text = "Patient demonstrates low-inhibitions for physical contact and well-developed arms. Requesting another doctor take over this case." - mail_goodies = list(/obj/item/storage/box/hug) - -/datum/quirk/jolly - name = "Jolly" - desc = "You sometimes just feel happy, for no reason at all." - icon = FA_ICON_GRIN - value = 4 - mob_trait = TRAIT_JOLLY - quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED - medical_record_text = "Patient demonstrates constant euthymia irregular for environment. It's a bit much, to be honest." - mail_goodies = list(/obj/item/clothing/mask/joy) - -/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 = FA_ICON_SHOE_PRINTS - value = 4 - mob_trait = TRAIT_LIGHT_STEP - gain_text = span_notice("You walk with a little more litheness.") - lose_text = span_danger("You start tromping around like a barbarian.") - medical_record_text = "Patient's dexterity belies a strong capacity for stealth." - mail_goodies = list(/obj/item/clothing/shoes/sandal) - -/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 = FA_ICON_GUITAR - value = 2 - mob_trait = TRAIT_MUSICIAN - gain_text = span_notice("You know everything about musical instruments.") - lose_text = span_danger("You forget how musical instruments work.") - medical_record_text = "Patient brain scans show a highly-developed auditory pathway." - mail_goodies = list(/obj/effect/spawner/random/entertainment/musical_instrument, /obj/item/instrument/piano_synth/headphones) - -/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/night_vision - name = "Night Vision" - desc = "You can see slightly more clearly in full darkness than most people." - icon = FA_ICON_MOON - value = 4 - mob_trait = TRAIT_NIGHT_VISION - gain_text = span_notice("The shadows seem a little less dark.") - lose_text = span_danger("Everything seems a little darker.") - medical_record_text = "Patient's eyes show above-average acclimation to darkness." - mail_goodies = list( - /obj/item/flashlight/flashdark, - /obj/item/food/grown/mushroom/glowshroom/shadowshroom, - /obj/item/skillchip/light_remover, - ) - -/datum/quirk/night_vision/add(client/client_source) - 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/internal/eyes/eyes = human_quirk_holder.get_organ_by_type(/obj/item/organ/internal/eyes) - if(!eyes || eyes.lighting_cutoff) - return - // We've either added or removed TRAIT_NIGHT_VISION before calling this proc. Just refresh the eyes. - eyes.refresh() - -/datum/quirk/bilingual - name = "Bilingual" - desc = "Over the years you've picked up an extra language!" - icon = FA_ICON_GLOBE - value = 4 - gain_text = span_notice("Some of the words of the people around you certainly aren't common. Good thing you studied for this.") - lose_text = span_notice("You seem to have forgotten your second language.") - medical_record_text = "Patient speaks multiple languages." - var/list/possible_languages = list( - /datum/language/aphasia, - /datum/language/beachbum, - /datum/language/calcic, - /datum/language/draconic, - /datum/language/moffic, - /datum/language/monkey, - /datum/language/mushroom, - /datum/language/nekomimetic, - /datum/language/piratespeak, - /datum/language/shadowtongue, - /datum/language/slime, - /datum/language/sylvan, - /datum/language/terrum, - /datum/language/voltaic, - ) - var/extra_language - mail_goodies = list(/obj/item/taperecorder, /obj/item/clothing/head/frenchberet, /obj/item/clothing/mask/fakemoustache/italian) - -/datum/quirk/bilingual/add(client/client_source) - var/mob/living/carbon/human/human_holder = quirk_holder - //prevents yourself from learning a language you already have - for(var/datum/language/spoken as anything in possible_languages) - if(human_holder.has_language(spoken)) - possible_languages -= spoken - extra_language = pick(possible_languages) - human_holder.grant_language(extra_language, understood = TRUE, spoken = TRUE, source = LANGUAGE_QUIRK) - -/datum/quirk/bilingual/remove() - var/mob/living/carbon/human/human_holder = quirk_holder - human_holder.remove_language(extra_language) - -/datum/quirk/item_quirk/poster_boy - name = "Poster Boy" - desc = "You have some great posters! Hang them up and make everyone have a great time." - icon = FA_ICON_TAPE - value = 4 - mob_trait = TRAIT_POSTERBOY - medical_record_text = "Patient reports a desire to cover walls with homemade objects." - mail_goodies = list(/obj/item/poster/random_official) - -/datum/quirk/item_quirk/poster_boy/add_unique() - var/mob/living/carbon/human/posterboy = quirk_holder - var/obj/item/storage/box/posterbox/newbox = new() - newbox.add_quirk_posters(posterboy.mind) - give_item_to_holder(newbox, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) - -/obj/item/storage/box/posterbox - name = "Box of Posters" - desc = "You made them yourself!" - -/// fills box of posters based on job, one neutral poster and 2 department posters -/obj/item/storage/box/posterbox/proc/add_quirk_posters(datum/mind/posterboy) - new /obj/item/poster/quirk/crew/random(src) - var/department = posterboy.assigned_role.paycheck_department - if(department == ACCOUNT_CIV) //if you are not part of a department you instead get 3 neutral posters - for(var/i in 1 to 2) - new /obj/item/poster/quirk/crew/random(src) - return - for(var/obj/item/poster/quirk/potential_poster as anything in subtypesof(/obj/item/poster/quirk)) - if(initial(potential_poster.quirk_poster_department) != department) - continue - new potential_poster(src) - -/datum/quirk/selfaware - name = "Self-Aware" - desc = "You know your body well, and can accurately assess the extent of your wounds." - icon = FA_ICON_BONE - value = 8 - mob_trait = TRAIT_SELF_AWARE - medical_record_text = "Patient demonstrates an uncanny knack for self-diagnosis." - mail_goodies = list(/obj/item/clothing/neck/stethoscope, /obj/item/skillchip/entrails_reader) - -/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 = FA_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." - mail_goodies = list(/obj/structure/closet/cardboard) - -/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 = FA_ICON_BIBLE - value = 4 - mob_trait = TRAIT_SPIRITUAL - gain_text = span_notice("You have faith in a higher power.") - lose_text = span_danger("You lose faith!") - medical_record_text = "Patient reports a belief in a higher power." - mail_goodies = list( - /obj/item/book/bible/booze, - /obj/item/reagent_containers/cup/glass/bottle/holywater, - /obj/item/bedsheet/chaplain, - /obj/item/toy/cards/deck/tarot, - /obj/item/storage/fancy/candle_box, - ) - -/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 = "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 = FA_ICON_SPRAY_CAN - value = 4 - mob_trait = TRAIT_TAGGER - gain_text = span_notice("You know how to tag walls efficiently.") - lose_text = span_danger("You forget how to tag walls properly.") - medical_record_text = "Patient was recently seen for possible paint huffing incident." - mail_goodies = list( - /obj/item/toy/crayon/spraycan, - /obj/item/canvas/nineteen_nineteen, - /obj/item/canvas/twentythree_nineteen, - /obj/item/canvas/twentythree_twentythree - ) - -/datum/quirk/item_quirk/tagger/add_unique(client/client_source) - var/obj/item/toy/crayon/spraycan/can = new - can.set_painting_tool_color(client_source?.prefs.read_preference(/datum/preference/color/paint_color)) - give_item_to_holder(can, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) - -/datum/quirk/throwingarm - name = "Throwing Arm" - desc = "Your arms have a lot of heft to them! Objects that you throw just always seem to fly further than everyone elses, and you never miss a toss." - icon = FA_ICON_BASEBALL - value = 7 - mob_trait = TRAIT_THROWINGARM - gain_text = span_notice("Your arms are full of energy!") - lose_text = span_danger("Your arms ache a bit.") - medical_record_text = "Patient displays mastery over throwing balls." - mail_goodies = list(/obj/item/toy/beach_ball/baseball, /obj/item/toy/basketball, /obj/item/toy/dodgeball) - -/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 = FA_ICON_DRUMSTICK_BITE - value = 4 - mob_trait = TRAIT_VORACIOUS - gain_text = span_notice("You feel HONGRY.") - lose_text = span_danger("You no longer feel HONGRY.") - mail_goodies = list(/obj/effect/spawner/random/food_or_drink/dinner) - -/datum/quirk/item_quirk/signer - name = "Signer" - desc = "You possess excellent communication skills in sign language." - icon = FA_ICON_HANDS - value = 4 - quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE - mail_goodies = list(/obj/item/clothing/gloves/radio) - -/datum/quirk/item_quirk/signer/add_unique(client/client_source) - quirk_holder.AddComponent(/datum/component/sign_language) - var/obj/item/clothing/gloves/gloves_type = /obj/item/clothing/gloves/radio - if(isplasmaman(quirk_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/signer/remove() - qdel(quirk_holder.GetComponent(/datum/component/sign_language)) diff --git a/code/datums/quirks/positive_quirks/alcohol_tolerance.dm b/code/datums/quirks/positive_quirks/alcohol_tolerance.dm new file mode 100644 index 0000000000000..6458513007df2 --- /dev/null +++ b/code/datums/quirks/positive_quirks/alcohol_tolerance.dm @@ -0,0 +1,10 @@ +/datum/quirk/alcohol_tolerance + name = "Alcohol Tolerance" + desc = "You become drunk more slowly and suffer fewer drawbacks from alcohol." + icon = FA_ICON_BEER + value = 4 + mob_trait = TRAIT_ALCOHOL_TOLERANCE + gain_text = span_notice("You feel like you could drink a whole keg!") + lose_text = span_danger("You don't feel as resistant to alcohol anymore. Somehow.") + medical_record_text = "Patient demonstrates a high tolerance for alcohol." + mail_goodies = list(/obj/item/skillchip/wine_taster) diff --git a/code/datums/quirks/positive_quirks/apathetic.dm b/code/datums/quirks/positive_quirks/apathetic.dm new file mode 100644 index 0000000000000..170cb6f5d448e --- /dev/null +++ b/code/datums/quirks/positive_quirks/apathetic.dm @@ -0,0 +1,14 @@ +/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 = FA_ICON_MEH + value = 4 + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED + medical_record_text = "Patient was administered the Apathy Evaluation Scale but did not bother to complete it." + mail_goodies = list(/obj/item/hourglass) + +/datum/quirk/apathetic/add(client/client_source) + quirk_holder.mob_mood?.mood_modifier -= 0.2 + +/datum/quirk/apathetic/remove() + quirk_holder.mob_mood?.mood_modifier += 0.2 diff --git a/code/datums/quirks/positive_quirks/bilingual.dm b/code/datums/quirks/positive_quirks/bilingual.dm new file mode 100644 index 0000000000000..324054198b8d6 --- /dev/null +++ b/code/datums/quirks/positive_quirks/bilingual.dm @@ -0,0 +1,24 @@ +/datum/quirk/bilingual + name = "Bilingual" + desc = "Over the years you've picked up an extra language!" + icon = FA_ICON_GLOBE + value = 4 + gain_text = span_notice("Some of the words of the people around you certainly aren't common. Good thing you studied for this.") + lose_text = span_notice("You seem to have forgotten your second language.") + medical_record_text = "Patient speaks multiple languages." + mail_goodies = list(/obj/item/taperecorder, /obj/item/clothing/head/frenchberet, /obj/item/clothing/mask/fakemoustache/italian) + +/datum/quirk/bilingual/add_unique(client/client_source) + var/wanted_language = client_source?.prefs.read_preference(/datum/preference/choiced/language) + var/datum/language/language_type + if(wanted_language == "Random") + language_type = pick(GLOB.uncommon_roundstart_languages) + else + language_type = GLOB.language_types_by_name[wanted_language] + if(quirk_holder.has_language(language_type)) + language_type = /datum/language/uncommon + if(quirk_holder.has_language(language_type)) + to_chat(quirk_holder, span_boldnotice("You are already familiar with the quirk in your preferences, so you did not learn one.")) + return + to_chat(quirk_holder, span_boldnotice("You are already familiar with the quirk in your preferences, so you learned Galactic Uncommon instead.")) + quirk_holder.grant_language(language_type, source = LANGUAGE_QUIRK) diff --git a/code/datums/quirks/positive_quirks/clown_enjoyer.dm b/code/datums/quirks/positive_quirks/clown_enjoyer.dm new file mode 100644 index 0000000000000..984b0f7a6e476 --- /dev/null +++ b/code/datums/quirks/positive_quirks/clown_enjoyer.dm @@ -0,0 +1,31 @@ +/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 = FA_ICON_MAP_PIN + value = 2 + mob_trait = TRAIT_CLOWN_ENJOYER + gain_text = span_notice("You are a big enjoyer of clowns.") + lose_text = span_danger("The clown doesn't seem so great.") + medical_record_text = "Patient reports being a big enjoyer of clowns." + mail_goodies = list( + /obj/item/bikehorn, + /obj/item/stamp/clown, + /obj/item/megaphone/clown, + /obj/item/clothing/shoes/clown_shoes, + /obj/item/bedsheet/clown, + /obj/item/clothing/mask/gas/clown_hat, + /obj/item/storage/backpack/clown, + /obj/item/storage/backpack/duffelbag/clown, + /obj/item/toy/crayon/rainbow, + /obj/item/toy/figure/clown, + /obj/item/tank/internals/emergency_oxygen/engi/clown/n2o, + /obj/item/tank/internals/emergency_oxygen/engi/clown/bz, + /obj/item/tank/internals/emergency_oxygen/engi/clown/helium, + ) + +/datum/quirk/item_quirk/clown_enjoyer/add_unique(client/client_source) + 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(client/client_source) + var/datum/atom_hud/fan = GLOB.huds[DATA_HUD_FAN] + fan.show_to(quirk_holder) diff --git a/code/datums/quirks/positive_quirks/drunk_healing.dm b/code/datums/quirks/positive_quirks/drunk_healing.dm new file mode 100644 index 0000000000000..e1c4ba911255e --- /dev/null +++ b/code/datums/quirks/positive_quirks/drunk_healing.dm @@ -0,0 +1,25 @@ +/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 = FA_ICON_WINE_BOTTLE + value = 8 + gain_text = span_notice("You feel like a drink would do you good.") + lose_text = span_danger("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." + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES + mail_goodies = list(/obj/effect/spawner/random/food_or_drink/booze) + +/datum/quirk/drunkhealing/process(seconds_per_tick) + var/need_mob_update = FALSE + switch(quirk_holder.get_drunk_amount()) + if (6 to 40) + need_mob_update += quirk_holder.adjustBruteLoss(-0.1 * seconds_per_tick, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + need_mob_update += quirk_holder.adjustFireLoss(-0.05 * seconds_per_tick, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + if (41 to 60) + need_mob_update += quirk_holder.adjustBruteLoss(-0.4 * seconds_per_tick, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + need_mob_update += quirk_holder.adjustFireLoss(-0.2 * seconds_per_tick, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + if (61 to INFINITY) + need_mob_update += quirk_holder.adjustBruteLoss(-0.8 * seconds_per_tick, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + need_mob_update += quirk_holder.adjustFireLoss(-0.4 * seconds_per_tick, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + if(need_mob_update) + quirk_holder.updatehealth() diff --git a/code/datums/quirks/positive_quirks/empath.dm b/code/datums/quirks/positive_quirks/empath.dm new file mode 100644 index 0000000000000..f80ce3b5ef186 --- /dev/null +++ b/code/datums/quirks/positive_quirks/empath.dm @@ -0,0 +1,10 @@ +/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 = FA_ICON_SMILE_BEAM + value = 8 + mob_trait = TRAIT_EMPATH + gain_text = span_notice("You feel in tune with those around you.") + lose_text = span_danger("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." + mail_goodies = list(/obj/item/toy/foamfinger) diff --git a/code/datums/quirks/positive_quirks/freerunning.dm b/code/datums/quirks/positive_quirks/freerunning.dm new file mode 100644 index 0000000000000..541d2b1cc441a --- /dev/null +++ b/code/datums/quirks/positive_quirks/freerunning.dm @@ -0,0 +1,10 @@ +/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 = FA_ICON_RUNNING + value = 8 + mob_trait = TRAIT_FREERUNNING + gain_text = span_notice("You feel lithe on your feet!") + lose_text = span_danger("You feel clumsy again.") + medical_record_text = "Patient scored highly on cardio tests." + mail_goodies = list(/obj/item/melee/skateboard, /obj/item/clothing/shoes/wheelys/rollerskates) diff --git a/code/datums/quirks/positive_quirks/friendly.dm b/code/datums/quirks/positive_quirks/friendly.dm new file mode 100644 index 0000000000000..8ab0003639bc3 --- /dev/null +++ b/code/datums/quirks/positive_quirks/friendly.dm @@ -0,0 +1,11 @@ +/datum/quirk/friendly + name = "Friendly" + desc = "You give the best hugs, especially when you're in the right mood." + icon = FA_ICON_HANDS_HELPING + value = 2 + mob_trait = TRAIT_FRIENDLY + gain_text = span_notice("You want to hug someone.") + lose_text = span_danger("You no longer feel compelled to hug others.") + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED + medical_record_text = "Patient demonstrates low-inhibitions for physical contact and well-developed arms. Requesting another doctor take over this case." + mail_goodies = list(/obj/item/storage/box/hug) diff --git a/code/datums/quirks/positive_quirks/jolly.dm b/code/datums/quirks/positive_quirks/jolly.dm new file mode 100644 index 0000000000000..7f6c334ba9dd7 --- /dev/null +++ b/code/datums/quirks/positive_quirks/jolly.dm @@ -0,0 +1,9 @@ +/datum/quirk/jolly + name = "Jolly" + desc = "You sometimes just feel happy, for no reason at all." + icon = FA_ICON_GRIN + value = 4 + mob_trait = TRAIT_JOLLY + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED + medical_record_text = "Patient demonstrates constant euthymia irregular for environment. It's a bit much, to be honest." + mail_goodies = list(/obj/item/clothing/mask/joy) diff --git a/code/datums/quirks/positive_quirks/light_step.dm b/code/datums/quirks/positive_quirks/light_step.dm new file mode 100644 index 0000000000000..80418b79b9da0 --- /dev/null +++ b/code/datums/quirks/positive_quirks/light_step.dm @@ -0,0 +1,10 @@ +/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 = FA_ICON_SHOE_PRINTS + value = 4 + mob_trait = TRAIT_LIGHT_STEP + gain_text = span_notice("You walk with a little more litheness.") + lose_text = span_danger("You start tromping around like a barbarian.") + medical_record_text = "Patient's dexterity belies a strong capacity for stealth." + mail_goodies = list(/obj/item/clothing/shoes/sandal) diff --git a/code/datums/quirks/positive_quirks/mime_fan.dm b/code/datums/quirks/positive_quirks/mime_fan.dm new file mode 100644 index 0000000000000..5145b4a2240e6 --- /dev/null +++ b/code/datums/quirks/positive_quirks/mime_fan.dm @@ -0,0 +1,29 @@ +/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 = FA_ICON_THUMBTACK + value = 2 + mob_trait = TRAIT_MIME_FAN + gain_text = span_notice("You are a big fan of the Mime.") + lose_text = span_danger("The mime doesn't seem so great.") + medical_record_text = "Patient reports being a big fan of mimes." + mail_goodies = list( + /obj/item/toy/crayon/mime, + /obj/item/clothing/mask/gas/mime, + /obj/item/storage/backpack/mime, + /obj/item/clothing/under/rank/civilian/mime, + /obj/item/reagent_containers/cup/glass/bottle/bottleofnothing, + /obj/item/stamp/mime, + /obj/item/storage/box/survival/hug/black, + /obj/item/bedsheet/mime, + /obj/item/clothing/shoes/sneakers/mime, + /obj/item/toy/figure/mime, + /obj/item/toy/crayon/spraycan/mimecan, + ) + +/datum/quirk/item_quirk/mime_fan/add_unique(client/client_source) + 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(client/client_source) + var/datum/atom_hud/fan = GLOB.huds[DATA_HUD_FAN] + fan.show_to(quirk_holder) diff --git a/code/datums/quirks/positive_quirks/musician.dm b/code/datums/quirks/positive_quirks/musician.dm new file mode 100644 index 0000000000000..9d5e10f5f827e --- /dev/null +++ b/code/datums/quirks/positive_quirks/musician.dm @@ -0,0 +1,13 @@ +/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 = FA_ICON_GUITAR + value = 2 + mob_trait = TRAIT_MUSICIAN + gain_text = span_notice("You know everything about musical instruments.") + lose_text = span_danger("You forget how musical instruments work.") + medical_record_text = "Patient brain scans show a highly-developed auditory pathway." + mail_goodies = list(/obj/effect/spawner/random/entertainment/musical_instrument, /obj/item/instrument/piano_synth/headphones) + +/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)) diff --git a/code/datums/quirks/positive_quirks/night_vision.dm b/code/datums/quirks/positive_quirks/night_vision.dm new file mode 100644 index 0000000000000..808a213db514b --- /dev/null +++ b/code/datums/quirks/positive_quirks/night_vision.dm @@ -0,0 +1,28 @@ +/datum/quirk/night_vision + name = "Night Vision" + desc = "You can see slightly more clearly in full darkness than most people." + icon = FA_ICON_MOON + value = 4 + mob_trait = TRAIT_NIGHT_VISION + gain_text = span_notice("The shadows seem a little less dark.") + lose_text = span_danger("Everything seems a little darker.") + medical_record_text = "Patient's eyes show above-average acclimation to darkness." + mail_goodies = list( + /obj/item/flashlight/flashdark, + /obj/item/food/grown/mushroom/glowshroom/shadowshroom, + /obj/item/skillchip/light_remover, + ) + +/datum/quirk/night_vision/add(client/client_source) + 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/internal/eyes/eyes = human_quirk_holder.get_organ_by_type(/obj/item/organ/internal/eyes) + if(!eyes || eyes.lighting_cutoff) + return + // We've either added or removed TRAIT_NIGHT_VISION before calling this proc. Just refresh the eyes. + eyes.refresh() diff --git a/code/datums/quirks/positive_quirks/poster_boy.dm b/code/datums/quirks/positive_quirks/poster_boy.dm new file mode 100644 index 0000000000000..4991ebc540b4c --- /dev/null +++ b/code/datums/quirks/positive_quirks/poster_boy.dm @@ -0,0 +1,31 @@ +/datum/quirk/item_quirk/poster_boy + name = "Poster Boy" + desc = "You have some great posters! Hang them up and make everyone have a great time." + icon = FA_ICON_TAPE + value = 4 + mob_trait = TRAIT_POSTERBOY + medical_record_text = "Patient reports a desire to cover walls with homemade objects." + mail_goodies = list(/obj/item/poster/random_official) + +/datum/quirk/item_quirk/poster_boy/add_unique() + var/mob/living/carbon/human/posterboy = quirk_holder + var/obj/item/storage/box/posterbox/newbox = new() + newbox.add_quirk_posters(posterboy.mind) + give_item_to_holder(newbox, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) + +/obj/item/storage/box/posterbox + name = "Box of Posters" + desc = "You made them yourself!" + +/// fills box of posters based on job, one neutral poster and 2 department posters +/obj/item/storage/box/posterbox/proc/add_quirk_posters(datum/mind/posterboy) + new /obj/item/poster/quirk/crew/random(src) + var/department = posterboy.assigned_role.paycheck_department + if(department == ACCOUNT_CIV) //if you are not part of a department you instead get 3 neutral posters + for(var/i in 1 to 2) + new /obj/item/poster/quirk/crew/random(src) + return + for(var/obj/item/poster/quirk/potential_poster as anything in subtypesof(/obj/item/poster/quirk)) + if(initial(potential_poster.quirk_poster_department) != department) + continue + new potential_poster(src) diff --git a/code/datums/quirks/positive_quirks/self_aware.dm b/code/datums/quirks/positive_quirks/self_aware.dm new file mode 100644 index 0000000000000..022d08659eff9 --- /dev/null +++ b/code/datums/quirks/positive_quirks/self_aware.dm @@ -0,0 +1,8 @@ +/datum/quirk/selfaware + name = "Self-Aware" + desc = "You know your body well, and can accurately assess the extent of your wounds." + icon = FA_ICON_BONE + value = 8 + mob_trait = TRAIT_SELF_AWARE + medical_record_text = "Patient demonstrates an uncanny knack for self-diagnosis." + mail_goodies = list(/obj/item/clothing/neck/stethoscope, /obj/item/skillchip/entrails_reader) diff --git a/code/datums/quirks/positive_quirks/settler.dm b/code/datums/quirks/positive_quirks/settler.dm new file mode 100644 index 0000000000000..81402c050cdd8 --- /dev/null +++ b/code/datums/quirks/positive_quirks/settler.dm @@ -0,0 +1,32 @@ +/datum/quirk/item_quirk/settler + name = "Settler" + desc = "You are from a lineage of the earliest space settlers! While your family's generational exposure to varying gravity \ + has resulted in a ... smaller height than is typical for your species, you make up for it by being much better at outdoorsmanship and \ + carrying heavy equipment. You also get along great with animals. However, you are a bit on the slow side due to your small legs." + gain_text = span_bold("You feel like the world is your oyster!") + lose_text = span_danger("You think you might stay home today.") + icon = FA_ICON_HOUSE + value = 4 + mob_trait = TRAIT_SETTLER + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE + medical_record_text = "Patient appears to be abnormally stout." + mail_goodies = list( + /obj/item/clothing/shoes/workboots/mining, + /obj/item/gps, + ) + +/datum/quirk/item_quirk/settler/add_unique(client/client_source) + give_item_to_holder(/obj/item/storage/box/papersack/wheat, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) + give_item_to_holder(/obj/item/storage/toolbox/fishing/small, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) + var/mob/living/carbon/human/human_quirkholder = quirk_holder + human_quirkholder.set_mob_height(HUMAN_HEIGHT_SHORTEST) + human_quirkholder.add_movespeed_modifier(/datum/movespeed_modifier/settler) + human_quirkholder.physiology.hunger_mod *= 0.5 //good for you, shortass, you don't get hungry nearly as often + +/datum/quirk/item_quirk/settler/remove() + if(QDELING(quirk_holder)) + return + var/mob/living/carbon/human/human_quirkholder = quirk_holder + human_quirkholder.set_mob_height(HUMAN_HEIGHT_MEDIUM) + human_quirkholder.remove_movespeed_modifier(/datum/movespeed_modifier/settler) + human_quirkholder.physiology.hunger_mod *= 2 diff --git a/code/datums/quirks/positive_quirks/signer.dm b/code/datums/quirks/positive_quirks/signer.dm new file mode 100644 index 0000000000000..df0a2f34c5dd4 --- /dev/null +++ b/code/datums/quirks/positive_quirks/signer.dm @@ -0,0 +1,17 @@ +/datum/quirk/item_quirk/signer + name = "Signer" + desc = "You possess excellent communication skills in sign language." + icon = FA_ICON_HANDS + value = 4 + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE + mail_goodies = list(/obj/item/clothing/gloves/radio) + +/datum/quirk/item_quirk/signer/add_unique(client/client_source) + quirk_holder.AddComponent(/datum/component/sign_language) + var/obj/item/clothing/gloves/gloves_type = /obj/item/clothing/gloves/radio + if(isplasmaman(quirk_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/signer/remove() + qdel(quirk_holder.GetComponent(/datum/component/sign_language)) diff --git a/code/datums/quirks/positive_quirks/skittish.dm b/code/datums/quirks/positive_quirks/skittish.dm new file mode 100644 index 0000000000000..24bbac8e556cf --- /dev/null +++ b/code/datums/quirks/positive_quirks/skittish.dm @@ -0,0 +1,8 @@ +/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 = FA_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." + mail_goodies = list(/obj/structure/closet/cardboard) diff --git a/code/datums/quirks/positive_quirks/spacer.dm b/code/datums/quirks/positive_quirks/spacer.dm new file mode 100644 index 0000000000000..3e27c00289f54 --- /dev/null +++ b/code/datums/quirks/positive_quirks/spacer.dm @@ -0,0 +1,201 @@ +#define LAST_STATE_PLANET "on_planet" +#define LAST_STATE_SPACE "in_space" + +/datum/quirk/spacer_born + name = "Spacer" + desc = "You were born in space, and have never known the comfort of a planet's gravity. Your body has adapted to this. \ + You are more comfortable in zero and artifical gravity and are more resistant to the effects of space, \ + but travelling to a planet's surface for an extended period of time will make you feel sick." + gain_text = span_notice("You feel at home in space.") + lose_text = span_danger("You feel homesick.") + icon = FA_ICON_USER_ASTRONAUT + value = 7 + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE + mail_goodies = list( + /obj/item/storage/pill_bottle/ondansetron, + /obj/item/reagent_containers/pill/gravitum, + ) + /// How high spacers get bumped up to + var/modded_height = HUMAN_HEIGHT_TALLER + /// How long on a planet before we get averse effects + var/planet_period = 3 MINUTES + /// TimerID for time spend on a planet + VAR_FINAL/planetside_timer + /// How long in space before we get beneficial effects + var/recover_period = 1 MINUTES + /// TimerID for time spend in space + VAR_FINAL/recovering_timer + /// Determines the last state we were in ([LAST_STATE_PLANET] or [LAST_STATE_SPACE]) + VAR_FINAL/last_state + +/datum/quirk/spacer_born/add(client/client_source) + if(isdummy(quirk_holder)) + return + + // Using Z moved because we don't urgently need to check on every single turf movement for planetary status. + // If you've arrived at a "planet", the entire Z is gonna be a "planet". + // It won't really make sense to walk 3 feet and then suddenly gain / lose gravity sickness. + // If I'm proven wrong, swap this to use Moved. + RegisterSignal(quirk_holder, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(spacer_moved)) + + // Yes, it's assumed for planetary maps that you start at gravity sickness. + check_z(quirk_holder, skip_timers = TRUE) + +/datum/quirk/spacer_born/add_unique(client/client_source) + // drift slightly faster through zero G + quirk_holder.inertia_move_delay *= 0.8 + + var/mob/living/carbon/human/human_quirker = quirk_holder + human_quirker.set_mob_height(modded_height) + human_quirker.physiology.pressure_mod *= 0.8 + human_quirker.physiology.cold_mod *= 0.8 + +/datum/quirk/spacer_born/post_add() + var/on_a_planet = SSmapping.is_planetary() + var/planet_job = istype(quirk_holder.mind?.assigned_role, /datum/job/shaft_miner) + if(!on_a_planet && !planet_job) + return + var/datum/bank_account/spacer_account = quirk_holder.get_bank_account() + if(!isnull(spacer_account)) + spacer_account.payday_modifier *= 1.25 + to_chat(quirk_holder, span_info("Given your background as a Spacer, \ + you are awarded with a 25% hazard pay bonus due to your [on_a_planet ? "station" : "occupational"] assignment.")) + + // Supply them with some patches to help out on their new assignment + var/obj/item/storage/pill_bottle/ondansetron/disgust_killers = new() + disgust_killers.desc += " Best to take one when travelling to a planet's surface." + if(quirk_holder.equip_to_slot_if_possible(disgust_killers, ITEM_SLOT_BACKPACK, qdel_on_fail = TRUE, initial = TRUE, indirect_action = TRUE)) + to_chat(quirk_holder, span_info("You have[isnull(spacer_account) ? " " : " also "]been given some anti-emetic patches to assist in adjusting to planetary gravity.")) + +/datum/quirk/spacer_born/remove() + UnregisterSignal(quirk_holder, COMSIG_MOVABLE_Z_CHANGED) + + if(QDELING(quirk_holder)) + return + + quirk_holder.inertia_move_delay /= 0.8 + quirk_holder.clear_mood_event("spacer") + quirk_holder.remove_movespeed_modifier(/datum/movespeed_modifier/spacer) + quirk_holder.remove_status_effect(/datum/status_effect/spacer) + + var/mob/living/carbon/human/human_quirker = quirk_holder + human_quirker.set_mob_height(HUMAN_HEIGHT_MEDIUM) + human_quirker.physiology.pressure_mod /= 0.8 + human_quirker.physiology.cold_mod /= 0.8 + +/// Check on Z change whether we should start or stop timers +/datum/quirk/spacer_born/proc/spacer_moved(mob/living/source, turf/old_turf, turf/new_turf, same_z_layer) + SIGNAL_HANDLER + + check_z(source) + +/** + * Used to check if we should start or stop timers based on the quirk holder's location. + * + * * afflicted - the mob arriving / same as quirk holder + * * skip_timers - if TRUE, this is being done instantly / should not have feedback (such as in init) + */ +/datum/quirk/spacer_born/proc/check_z(mob/living/spacer, skip_timers = FALSE) + if(is_on_a_planet(spacer)) + on_planet(spacer, skip_timers) + else + in_space(spacer, skip_timers) + +// Going to a planet + +/** + * Ran when we arrive on a planet. + * + * * afflicted - the mob arriving / same as quirk holder + * * skip_timers - if TRUE, this is being done instantly / should not have feedback (such as in init) + */ +/datum/quirk/spacer_born/proc/on_planet(mob/living/afflicted, skip_timers = FALSE) + if(planetside_timer || last_state == LAST_STATE_PLANET) + return + if(recovering_timer) + deltimer(recovering_timer) + recovering_timer = null + + last_state = LAST_STATE_PLANET + + if(skip_timers) + on_planet_for_too_long(afflicted, TRUE) + return + + // Recently exercising lets us last longer under heavy strain + var/exercise_bonus = afflicted.has_status_effect(/datum/status_effect/exercised) ? 2 : 1 + planetside_timer = addtimer(CALLBACK(src, PROC_REF(on_planet_for_too_long), afflicted), planet_period * exercise_bonus, TIMER_STOPPABLE) + afflicted.add_mood_event("spacer", /datum/mood_event/spacer/on_planet) + afflicted.add_movespeed_modifier(/datum/movespeed_modifier/spacer/on_planet) + afflicted.remove_status_effect(/datum/status_effect/spacer) // removes the wellness effect. + to_chat(afflicted, span_danger("You feel a bit sick under the gravity here.")) + +/** + * Ran after remaining on a planet for too long. + * + * * afflicted - the mob arriving / same as quirk holder + * * skip_timers - if TRUE, this is being done instantly / should not have feedback (such as in init) + */ +/datum/quirk/spacer_born/proc/on_planet_for_too_long(mob/living/afflicted, skip_timers = FALSE) + if(QDELETED(src) || QDELETED(afflicted)) + return + + // Slightly reduced effects if we're on a planetary map to make it a bit more bearable + var/nerfed_effects_because_planetary = SSmapping.is_planetary() + var/moodlet_picked = nerfed_effects_because_planetary ? /datum/mood_event/spacer/on_planet/nerfed : /datum/mood_event/spacer/on_planet/too_long + var/movespeed_mod_picked = nerfed_effects_because_planetary ? /datum/movespeed_modifier/spacer/on_planet/nerfed : /datum/movespeed_modifier/spacer/on_planet/too_long + + planetside_timer = null + afflicted.apply_status_effect(/datum/status_effect/spacer/gravity_sickness) + afflicted.add_mood_event("spacer", moodlet_picked) + afflicted.add_movespeed_modifier(movespeed_mod_picked) + + if(!skip_timers) + to_chat(afflicted, span_danger("You've been here for too long. The gravity really starts getting to you.")) + +// Going back into space + +/** + * Ran when returning to space / somewhere with low gravity. + * + * * afflicted - the mob arriving / same as quirk holder + * * skip_timers - if TRUE, this is being done instantly / should not have feedback (such as in init) + */ +/datum/quirk/spacer_born/proc/in_space(mob/living/afflicted, skip_timers = FALSE) + if(recovering_timer || last_state == LAST_STATE_SPACE) + return + if(planetside_timer) + deltimer(planetside_timer) + planetside_timer = null + + last_state = LAST_STATE_SPACE + + if(skip_timers) + comfortably_in_space(afflicted, TRUE) + return + + recovering_timer = addtimer(CALLBACK(src, PROC_REF(comfortably_in_space), afflicted), recover_period, TIMER_STOPPABLE) + afflicted.remove_status_effect(/datum/status_effect/spacer) + afflicted.clear_mood_event("spacer") + // Does not remove the movement modifier yet, it lingers until you fully recover + to_chat(afflicted, span_green("You start feeling better now that you're back in space.")) + +/** + * Ran when living back in space for a long enough period. + * + * * afflicted - the mob arriving / same as quirk holder + * * skip_timers - if TRUE, this is being done instantly / should not have feedback (such as in init) + */ +/datum/quirk/spacer_born/proc/comfortably_in_space(mob/living/afflicted, skip_timers = FALSE) + if(QDELETED(src) || QDELETED(afflicted)) + return + + recovering_timer = null + afflicted.apply_status_effect(/datum/status_effect/spacer/gravity_wellness) + afflicted.add_mood_event("spacer", /datum/mood_event/spacer/in_space) + afflicted.add_movespeed_modifier(/datum/movespeed_modifier/spacer/in_space) + if(!skip_timers) + to_chat(afflicted, span_green("You feel better.")) + +#undef LAST_STATE_PLANET +#undef LAST_STATE_SPACE diff --git a/code/datums/quirks/positive_quirks/spiritual.dm b/code/datums/quirks/positive_quirks/spiritual.dm new file mode 100644 index 0000000000000..15f98bfc21eef --- /dev/null +++ b/code/datums/quirks/positive_quirks/spiritual.dm @@ -0,0 +1,20 @@ +/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 = FA_ICON_BIBLE + value = 4 + mob_trait = TRAIT_SPIRITUAL + gain_text = span_notice("You have faith in a higher power.") + lose_text = span_danger("You lose faith!") + medical_record_text = "Patient reports a belief in a higher power." + mail_goodies = list( + /obj/item/book/bible/booze, + /obj/item/reagent_containers/cup/glass/bottle/holywater, + /obj/item/bedsheet/chaplain, + /obj/item/toy/cards/deck/tarot, + /obj/item/storage/fancy/candle_box, + ) + +/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)) diff --git a/code/datums/quirks/positive_quirks/tagger.dm b/code/datums/quirks/positive_quirks/tagger.dm new file mode 100644 index 0000000000000..5aba24d850a45 --- /dev/null +++ b/code/datums/quirks/positive_quirks/tagger.dm @@ -0,0 +1,20 @@ +/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 = FA_ICON_SPRAY_CAN + value = 4 + mob_trait = TRAIT_TAGGER + gain_text = span_notice("You know how to tag walls efficiently.") + lose_text = span_danger("You forget how to tag walls properly.") + medical_record_text = "Patient was recently seen for possible paint huffing incident." + mail_goodies = list( + /obj/item/toy/crayon/spraycan, + /obj/item/canvas/nineteen_nineteen, + /obj/item/canvas/twentythree_nineteen, + /obj/item/canvas/twentythree_twentythree + ) + +/datum/quirk/item_quirk/tagger/add_unique(client/client_source) + var/obj/item/toy/crayon/spraycan/can = new + can.set_painting_tool_color(client_source?.prefs.read_preference(/datum/preference/color/paint_color)) + give_item_to_holder(can, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) diff --git a/code/datums/quirks/positive_quirks/throwing_arm.dm b/code/datums/quirks/positive_quirks/throwing_arm.dm new file mode 100644 index 0000000000000..5157b3990095b --- /dev/null +++ b/code/datums/quirks/positive_quirks/throwing_arm.dm @@ -0,0 +1,10 @@ +/datum/quirk/throwingarm + name = "Throwing Arm" + desc = "Your arms have a lot of heft to them! Objects that you throw just always seem to fly further than everyone elses, and you never miss a toss." + icon = FA_ICON_BASEBALL + value = 7 + mob_trait = TRAIT_THROWINGARM + gain_text = span_notice("Your arms are full of energy!") + lose_text = span_danger("Your arms ache a bit.") + medical_record_text = "Patient displays mastery over throwing balls." + mail_goodies = list(/obj/item/toy/beach_ball/baseball, /obj/item/toy/basketball, /obj/item/toy/dodgeball) diff --git a/code/datums/quirks/positive_quirks/voracious.dm b/code/datums/quirks/positive_quirks/voracious.dm new file mode 100644 index 0000000000000..68073304f0d82 --- /dev/null +++ b/code/datums/quirks/positive_quirks/voracious.dm @@ -0,0 +1,9 @@ +/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 = FA_ICON_DRUMSTICK_BITE + value = 4 + mob_trait = TRAIT_VORACIOUS + gain_text = span_notice("You feel HONGRY.") + lose_text = span_danger("You no longer feel HONGRY.") + mail_goodies = list(/obj/effect/spawner/random/food_or_drink/dinner) diff --git a/code/datums/records/crime.dm b/code/datums/records/crime.dm index e16995b551448..a22ce7c816ad2 100644 --- a/code/datums/records/crime.dm +++ b/code/datums/records/crime.dm @@ -32,6 +32,9 @@ /// Pays off a fine and attempts to fix any weird values. /datum/crime/citation/proc/pay_fine(amount) + if(amount <= 0) + return FALSE + paid += amount if(paid > fine) paid = fine @@ -44,16 +47,17 @@ /// Sends a citation alert message to the target's PDA. /datum/crime/citation/proc/alert_owner(mob/sender, atom/source, target_name, message) - for(var/obj/item/modular_computer/tablet in GLOB.TabletMessengers) - if(tablet.saved_identification != target_name) + for(var/messenger_ref in GLOB.pda_messengers) + var/datum/computer_file/program/messenger/messenger = GLOB.pda_messengers[messenger_ref] + if(messenger.computer.saved_identification != target_name) continue - var/datum/signal/subspace/messaging/tablet_msg/signal = new(source, list( - name = "Security Citation", - job = "Citation Server", - message = message, - targets = list(tablet), - automated = TRUE + var/datum/signal/subspace/messaging/tablet_message/signal = new(source, list( + "fakename" = "Security Citation", + "fakejob" = "Citation Server", + "message" = message, + "targets" = list(messenger), + "automated" = TRUE )) signal.send_to_receivers() sender.log_message("(PDA: Citation Server) sent \"[message]\" to [signal.format_target()]", LOG_PDA) diff --git a/code/datums/records/manifest.dm b/code/datums/records/manifest.dm index ba51c93fc752b..225da0e0c0445 100644 --- a/code/datums/records/manifest.dm +++ b/code/datums/records/manifest.dm @@ -109,41 +109,43 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new) person_gender = "Male" if(person.gender == "female") person_gender = "Female" + var/datum/dna/record_dna = new() + person.dna.copy_dna(record_dna) var/datum/record/locked/lockfile = new( age = person.age, - blood_type = person.dna.blood_type, + blood_type = record_dna.blood_type, character_appearance = character_appearance, - dna_string = person.dna.unique_enzymes, - fingerprint = md5(person.dna.unique_identity), + dna_string = record_dna.unique_enzymes, + fingerprint = md5(record_dna.unique_identity), gender = person_gender, initial_rank = assignment, name = person.real_name, rank = assignment, - species = person.dna.species.name, + species = record_dna.species.name, trim = assignment, // Locked specifics - dna_ref = person.dna, + locked_dna = record_dna, mind_ref = person.mind, ) new /datum/record/crew( age = person.age, - blood_type = person.dna.blood_type, + blood_type = record_dna.blood_type, character_appearance = character_appearance, - dna_string = person.dna.unique_enzymes, - fingerprint = md5(person.dna.unique_identity), + dna_string = record_dna.unique_enzymes, + fingerprint = md5(record_dna.unique_identity), gender = person_gender, initial_rank = assignment, name = person.real_name, rank = assignment, - species = person.dna.species.name, + species = record_dna.species.name, trim = assignment, // Crew specific lock_ref = REF(lockfile), - major_disabilities = person.get_quirk_string(FALSE, CAT_QUIRK_MAJOR_DISABILITY), + major_disabilities = person.get_quirk_string(FALSE, CAT_QUIRK_MAJOR_DISABILITY, from_scan = TRUE), major_disabilities_desc = person.get_quirk_string(TRUE, CAT_QUIRK_MAJOR_DISABILITY), - minor_disabilities = person.get_quirk_string(FALSE, CAT_QUIRK_MINOR_DISABILITY), + minor_disabilities = person.get_quirk_string(FALSE, CAT_QUIRK_MINOR_DISABILITY, from_scan = TRUE), minor_disabilities_desc = person.get_quirk_string(TRUE, CAT_QUIRK_MINOR_DISABILITY), quirk_notes = person.get_quirk_string(TRUE, CAT_QUIRK_NOTES), ) diff --git a/code/datums/records/record.dm b/code/datums/records/record.dm index b13646c64c40a..167f227fc3a34 100644 --- a/code/datums/records/record.dm +++ b/code/datums/records/record.dm @@ -24,6 +24,8 @@ var/species /// The character's ID trim var/trim + /// The character's voice, if they have one. + var/voice /datum/record/New( age = 18, @@ -37,6 +39,7 @@ rank = "Unassigned", species = "Human", trim = "Unassigned", + voice = "?????", ) src.age = age src.blood_type = blood_type @@ -124,9 +127,9 @@ */ /datum/record/locked /// Mob's dna - var/datum/dna/dna_ref + var/datum/dna/locked_dna /// Mind datum - var/datum/mind/mind_ref + var/datum/weakref/mind_ref /// Typepath of species used by player, for usage in respawning via records var/species_type @@ -143,13 +146,13 @@ species = "Human", trim = "Unassigned", /// Locked specific - datum/dna/dna_ref, + datum/dna/locked_dna, datum/mind/mind_ref, ) . = ..() - src.dna_ref = dna_ref - src.mind_ref = mind_ref - species_type = dna_ref.species.type + src.locked_dna = locked_dna + src.mind_ref = WEAKREF(mind_ref) + species_type = locked_dna.species.type GLOB.manifest.locked += src diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index 65484dfbba522..e88456fe60ac7 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -275,3 +275,11 @@ suffix = "lavaland_surface_phonebooth.dmm" allow_duplicates = FALSE cost = 5 + +/datum/map_template/ruin/lavaland/battle_site + name = "Battle Site" + id = "battle_site" + description = "The long past site of a battle between beast and humanoids. The victor is unknown, but the losers are clear." + suffix = "lavaland_battle_site.dmm" + allow_duplicates = TRUE + cost = 3 diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm index 9b6a52292cb9f..a371b248b25e7 100644 --- a/code/datums/ruins/space.dm +++ b/code/datums/ruins/space.dm @@ -126,6 +126,12 @@ name = "Derelict 8" description = "An auxiliary storage bay might be the least respected room on any functional station, but studies show they are the least likely to be hit in an artillery strike." +/datum/map_template/ruin/space/derelict9 + id = "derelict9" + suffix = "derelict9.dmm" + name = "Derelict 9" + description = "Someone already found this high-security supply cache already, but were unable to get inside. Perhaps the next visitor will have more luck." + /datum/map_template/ruin/space/empty_shell id = "empty-shell" suffix = "emptyshell.dmm" @@ -394,7 +400,6 @@ name = "Mass driver Router" description = "An old, still functional router for some long destroyed system." - /datum/map_template/ruin/space/prey_pod id = "prey" suffix = "prey_pod.dmm" @@ -445,7 +450,7 @@ /datum/map_template/ruin/space/mimesvclowns id = "mimesvclowns" - suffix = "mimesvclowns.dmm" + suffix = "mimesvsclowns.dmm" name = "Abandoned Mime Outpost" description = "When you fight mimes, you better bring more than slips." diff --git a/code/datums/screentips/screentips.dm b/code/datums/screentips/screentips.dm new file mode 100644 index 0000000000000..d72e41960e505 --- /dev/null +++ b/code/datums/screentips/screentips.dm @@ -0,0 +1,34 @@ +#define HINT_ICON_FILE 'icons/ui_icons/screentips/cursor_hints.dmi' + +/// Stores the cursor hint icons for screentip context. +GLOBAL_LIST_INIT_TYPED(screentip_context_icons, /image, prepare_screentip_context_icons()) + +/proc/prepare_screentip_context_icons() + var/list/output = list() + for(var/state in icon_states(HINT_ICON_FILE)) + output[state] = image(HINT_ICON_FILE, icon_state = state) + return output + +/* + * # Compiles a string for this key + * Args: + * - context = list (REQUIRED) + * - Must contain key + * - key = string (REQUIRED) + * - allow_image = boolean (not required) +*/ +/proc/build_context(list/context, key, allow_image) + if(!length(context) || !context[key] || !key) + return "" + // Splits key combinations from mouse buttons. e.g. `Ctrl-Shift-LMB` goes in, `Ctrl-Shift-` goes out. Will be empty for single button actions. + var/key_combo = length(key) > 3 ? "[copytext(key, 1, -3)]" : "" + // Grab the mouse button, LMB/RMB + var/button = copytext(key, -3) + if(allow_image) + // Compile into image, if allowed + button = "\icon[GLOB.screentip_context_icons[button]]" + + // Voilá, final result + return "[key_combo][button][allow_image ? "" : ":"] [context[key]]" + +#undef HINT_ICON_FILE diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm deleted file mode 100644 index fa31d5c348957..0000000000000 --- a/code/datums/shuttles.dm +++ /dev/null @@ -1,876 +0,0 @@ -#define EMAG_LOCKED_SHUTTLE_COST (CARGO_CRATE_VALUE * 50) - -/datum/map_template/shuttle - name = "Base Shuttle Template" - var/prefix = "_maps/shuttles/" - var/suffix - /** - * Port ID is the place this template should be docking at, set on '/obj/docking_port/stationary' - * Because getShuttle() compares port_id to shuttle_id to find an already existing shuttle, - * you should set shuttle_id to be the same as port_id if you want them to be replacable. - */ - var/port_id - ///ID of the shuttle, make sure it matches port_id if necessary. - var/shuttle_id - - var/description - var/prerequisites - var/admin_notes - /// How much does this shuttle cost the cargo budget to purchase? Put in terms of CARGO_CRATE_VALUE to properly scale the cost with the current balance of cargo's income. - var/credit_cost = INFINITY - /// What job accesses can buy this shuttle? If null, this shuttle cannot be bought. - var/list/who_can_purchase = list(ACCESS_CAPTAIN) - /// Whether or not this shuttle is locked to emags only. - var/emag_only = FALSE - /// If set, overrides default movement_force on shuttle - var/list/movement_force - - var/port_x_offset - var/port_y_offset - var/extra_desc = "" - -/datum/map_template/shuttle/proc/prerequisites_met() - return TRUE - -/datum/map_template/shuttle/New() - shuttle_id = "[port_id]_[suffix]" - mappath = "[prefix][shuttle_id].dmm" - . = ..() - -/datum/map_template/shuttle/preload_size(path, cache) - . = ..(path, TRUE) // Done this way because we still want to know if someone actualy wanted to cache the map - if(!cached_map) - return - - var/offset = discover_offset(/obj/docking_port/mobile) - - port_x_offset = offset[1] - port_y_offset = offset[2] - - if(!cache) - cached_map = null - -/datum/map_template/shuttle/load(turf/T, centered, register=TRUE) - . = ..() - if(!.) - return - var/list/turfs = block( locate(.[MAP_MINX], .[MAP_MINY], .[MAP_MINZ]), - locate(.[MAP_MAXX], .[MAP_MAXY], .[MAP_MAXZ])) - for(var/i in 1 to turfs.len) - var/turf/place = turfs[i] - if(isspaceturf(place)) // This assumes all shuttles are loaded in a single spot then moved to their real destination. - continue - - if (place.count_baseturfs() < 2) // Some snowflake shuttle shit - continue - - place.insert_baseturf(3, /turf/baseturf_skipover/shuttle) - - for(var/obj/docking_port/mobile/port in place) - port.calculate_docking_port_information(src) - // initTemplateBounds explicitly ignores the shuttle's docking port, to ensure that it calculates the bounds of the shuttle correctly - // so we need to manually initialize it here - SSatoms.InitializeAtoms(list(port)) - if(register) - port.register() - -//Whatever special stuff you want -/datum/map_template/shuttle/post_load(obj/docking_port/mobile/M) - if(movement_force) - M.movement_force = movement_force.Copy() - M.linkup() - -/datum/map_template/shuttle/emergency - port_id = "emergency" - name = "Base Shuttle Template (Emergency)" - -/datum/map_template/shuttle/cargo - port_id = "cargo" - name = "Base Shuttle Template (Cargo)" - who_can_purchase = null - -/datum/map_template/shuttle/ferry - port_id = "ferry" - name = "Base Shuttle Template (Ferry)" - -/datum/map_template/shuttle/whiteship - port_id = "whiteship" - -/datum/map_template/shuttle/labour - port_id = "labour" - who_can_purchase = null - -/datum/map_template/shuttle/mining - port_id = "mining" - who_can_purchase = null - -/datum/map_template/shuttle/mining_common - port_id = "mining_common" - who_can_purchase = null - -/datum/map_template/shuttle/arrival - port_id = "arrival" - who_can_purchase = null - -/datum/map_template/shuttle/infiltrator - 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 - -/datum/map_template/shuttle/assault_pod - port_id = "assault_pod" - who_can_purchase = null - -/datum/map_template/shuttle/pirate - port_id = "pirate" - who_can_purchase = null - -/datum/map_template/shuttle/hunter - port_id = "hunter" - who_can_purchase = null - -/datum/map_template/shuttle/ruin //For random shuttles in ruins - port_id = "ruin" - who_can_purchase = null - -/datum/map_template/shuttle/snowdin - port_id = "snowdin" - who_can_purchase = null - -/datum/map_template/shuttle/ert - port_id = "ert" - who_can_purchase = null - -// Shuttles start here: - -/datum/map_template/shuttle/emergency/backup - suffix = "backup" - name = "Backup Shuttle" - who_can_purchase = null - -/datum/map_template/shuttle/emergency/construction - suffix = "construction" - name = "Build your own shuttle kit" - description = "For the enterprising shuttle engineer! The chassis will dock upon purchase, but launch will have to be authorized as usual via shuttle call. Comes stocked with construction materials. Unlocks the ability to buy shuttle engine crates from cargo, which allow you to speed up shuttle transit time." - admin_notes = "No brig, no medical facilities." - credit_cost = CARGO_CRATE_VALUE * 5 - who_can_purchase = list(ACCESS_CAPTAIN, ACCESS_CE) - -/datum/map_template/shuttle/emergency/construction/post_load() - . = ..() - //enable buying engines from cargo - var/datum/supply_pack/P = SSshuttle.supply_packs[/datum/supply_pack/engineering/shuttle_engine] - P.special_enabled = TRUE - - -/datum/map_template/shuttle/emergency/asteroid - suffix = "asteroid" - name = "Asteroid Station Emergency Shuttle" - description = "A respectable mid-sized shuttle that first saw service shuttling Nanotrasen crew to and from their asteroid belt embedded facilities." - credit_cost = CARGO_CRATE_VALUE * 6 - -/datum/map_template/shuttle/emergency/venture - suffix = "venture" - name = "Venture Emergency Shuttle" - description = "A mid-sized shuttle for those who like a lot of space for their legs." - credit_cost = CARGO_CRATE_VALUE * 10 - -/datum/map_template/shuttle/emergency/bar - suffix = "bar" - name = "The Emergency Escape Bar" - description = "Features include sentient bar staff (a Bardrone and a Barmaid), bathroom, a quality lounge for the heads, and a large gathering table." - admin_notes = "Bardrone and Barmaid are GODMODE, will be automatically sentienced by the fun balloon at 60 seconds before arrival. \ - Has medical facilities." - credit_cost = CARGO_CRATE_VALUE * 10 - -/datum/map_template/shuttle/emergency/pod - suffix = "pod" - name = "Emergency Pods" - description = "We did not expect an evacuation this quickly. All we have available is two escape pods." - admin_notes = "For player punishment." - who_can_purchase = null - -/datum/map_template/shuttle/emergency/russiafightpit - suffix = "russiafightpit" - name = "Mother Russia Bleeds" - description = "Dis is a high-quality shuttle, da. Many seats, lots of space, all equipment! Even includes entertainment! Such as lots to drink, and a fighting arena for drunk crew to have fun! If arena not fun enough, simply press button of releasing bears. Do not worry, bears trained not to break out of fighting pit, so totally safe so long as nobody stupid or drunk enough to leave door open. Try not to let asimov babycons ruin fun!" - admin_notes = "Includes a small variety of weapons. And bears. Only captain-access can release the bears. Bears won't smash the windows themselves, but they can escape if someone lets them." - credit_cost = CARGO_CRATE_VALUE * 10 // While the shuttle is rusted and poorly maintained, trained bears are costly. - -/datum/map_template/shuttle/emergency/meteor - suffix = "meteor" - name = "Asteroid With Engines Strapped To It" - description = "A hollowed out asteroid with engines strapped to it, the hollowing procedure makes it very difficult to hijack but is very expensive. Due to its size and difficulty in steering it, this shuttle may damage the docking area." - admin_notes = "This shuttle will likely crush escape, killing anyone there." - credit_cost = CARGO_CRATE_VALUE * 30 - movement_force = list("KNOCKDOWN" = 3, "THROW" = 2) - -/datum/map_template/shuttle/emergency/monastery - suffix = "monastery" - name = "Grand Corporate Monastery" - description = "Originally built for a public station, this grand edifice to religion, due to budget cuts, is now available as an escape shuttle for the right... donation. Due to its large size and callous owners, this shuttle may cause collateral damage." - admin_notes = "WARNING: This shuttle WILL destroy a fourth of the station, likely picking up a lot of objects with it." - emag_only = TRUE - credit_cost = EMAG_LOCKED_SHUTTLE_COST * 1.8 - movement_force = list("KNOCKDOWN" = 3, "THROW" = 5) - -/datum/map_template/shuttle/emergency/luxury - suffix = "luxury" - name = "Luxury Shuttle" - description = "A luxurious golden shuttle complete with an indoor swimming pool. Each crewmember wishing to board must bring 500 credits, payable in cash and mineral coin." - extra_desc = "This shuttle costs 500 credits to board." - admin_notes = "Due to the limited space for non paying crew, this shuttle may cause a riot." - emag_only = TRUE - credit_cost = EMAG_LOCKED_SHUTTLE_COST - -/datum/map_template/shuttle/emergency/medisim - suffix = "medisim" - name = "Medieval Reality Simulation Dome" - description = "A state of the art simulation dome, loaded onto your shuttle! Watch and laugh at how petty humanity used to be before it reached the stars. Guaranteed to be at least 40% historically accurate." - admin_notes = "Ghosts can spawn in and fight as knights or archers. The CTF auto restarts, so no admin intervention necessary." - credit_cost = 20000 - -/datum/map_template/shuttle/emergency/medisim/prerequisites_met() - return SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_MEDISIM] - -/datum/map_template/shuttle/emergency/discoinferno - suffix = "discoinferno" - name = "Disco Inferno" - description = "The glorious results of centuries of plasma research done by Nanotrasen employees. This is the reason why you are here. Get on and dance like you're on fire, burn baby burn!" - admin_notes = "Flaming hot. The main area has a dance machine as well as plasma floor tiles that will be ignited by players every single time." - 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" - description = "Though a little on the small side, this shuttle is feature complete, which is more than can be said for the pattern of station it was commissioned for." - credit_cost = CARGO_CRATE_VALUE * 2 - -/datum/map_template/shuttle/emergency/box - suffix = "box" - name = "Box Station Emergency Shuttle" - credit_cost = CARGO_CRATE_VALUE * 4 - description = "The gold standard in emergency exfiltration, this tried and true design is equipped with everything the crew needs for a safe flight home." - -/datum/map_template/shuttle/emergency/donut - suffix = "donut" - name = "Donutstation Emergency Shuttle" - description = "The perfect spearhead for any crude joke involving the station's shape, this shuttle supports a separate containment cell for prisoners and a compact medical wing." - admin_notes = "Has airlocks on both sides of the shuttle and will probably intersect near the front on some stations that build past departures." - credit_cost = CARGO_CRATE_VALUE * 5 - -/datum/map_template/shuttle/emergency/clown - suffix = "clown" - name = "Snappop(tm)!" - description = "Hey kids and grownups! \ - Are you bored of DULL and TEDIOUS shuttle journeys after you're evacuating for probably BORING reasons. Well then order the Snappop(tm) today! \ - 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." - credit_cost = CARGO_CRATE_VALUE * 16 - -/datum/map_template/shuttle/emergency/cramped - suffix = "cramped" - name = "Secure Transport Vessel 5 (STV5)" - description = "Well, looks like CentCom only had this ship in the area, they probably weren't expecting you to need evac for a while. \ - Probably best if you don't rifle around in whatever equipment they were transporting. I hope you're friendly with your coworkers, because there is very little space in this thing.\n\ - \n\ - Contains contraband armory guns, maintenance loot, and abandoned crates!" - admin_notes = "Due to origin as a solo piloted secure vessel, has an active GPS onboard labeled STV5. Has roughly as much space as Hi Daniel, except with explosive crates." - -/datum/map_template/shuttle/emergency/meta - suffix = "meta" - name = "Meta Station Emergency Shuttle" - credit_cost = CARGO_CRATE_VALUE * 8 - description = "A fairly standard shuttle, though larger and slightly better equipped than the Box Station variant." - -/datum/map_template/shuttle/emergency/kilo - suffix = "kilo" - name = "Kilo Station Emergency Shuttle" - credit_cost = CARGO_CRATE_VALUE * 10 - description = "A fully functional shuttle including a complete infirmary, storage facilties and regular amenities." - -/datum/map_template/shuttle/emergency/mini - suffix = "mini" - name = "Ministation emergency shuttle" - credit_cost = CARGO_CRATE_VALUE * 2 - description = "Despite its namesake, this shuttle is actually only slightly smaller than standard, and still complete with a brig and medbay." - -/datum/map_template/shuttle/emergency/tram - suffix = "tram" - name = "Tram Station Emergency Shuttle" - credit_cost = CARGO_CRATE_VALUE * 4 - description = "A train but in space, choo choo!" - -/datum/map_template/shuttle/emergency/birdshot - suffix = "birdshot" - name = "Birdshot Station Emergency Shuttle" - credit_cost = CARGO_CRATE_VALUE * 2 - description = "We pulled this one out of Mothball just for you!" - -/datum/map_template/shuttle/emergency/scrapheap - suffix = "scrapheap" - name = "Standby Evacuation Vessel \"Scrapheap Challenge\"" - credit_cost = CARGO_CRATE_VALUE * -2 - description = "Due to a lack of functional emergency shuttles, we bought this second hand from a scrapyard and pressed it into service. Please do not lean too heavily on the exterior windows, they are fragile." - admin_notes = "An abomination with no functional medbay, sections missing, and some very fragile windows. Surprisingly airtight." - movement_force = list("KNOCKDOWN" = 3, "THROW" = 2) - -/datum/map_template/shuttle/emergency/narnar - suffix = "narnar" - name = "Shuttle 667" - description = "Looks like this shuttle may have wandered into the darkness between the stars on route to the station. Let's not think too hard about where all the bodies came from." - admin_notes = "Contains real cult ruins, mob eyeballs, and inactive constructs. Cult mobs will automatically be sentienced by fun balloon. \ - Cloning pods in 'medbay' area are showcases and nonfunctional." - credit_cost = 6667 ///The joke is the number so no defines - -/datum/map_template/shuttle/emergency/narnar/prerequisites_met() - return SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_NARNAR] - -/datum/map_template/shuttle/emergency/pubby - suffix = "pubby" - name = "Pubby Station Emergency Shuttle" - description = "A train but in space! Complete with a first, second class, brig and storage area." - admin_notes = "Choo choo motherfucker!" - credit_cost = CARGO_CRATE_VALUE * 2 - -/datum/map_template/shuttle/emergency/cere - suffix = "cere" - name = "Cere Station Emergency Shuttle" - description = "The large, beefed-up version of the box-standard shuttle. Includes an expanded brig, fully stocked medbay, enhanced cargo storage with mech chargers, \ - an engine room stocked with various supplies, and a crew capacity of 80+ to top it all off. Live large, live Cere." - admin_notes = "Seriously big, even larger than the Delta shuttle." - credit_cost = CARGO_CRATE_VALUE * 20 - -/datum/map_template/shuttle/emergency/supermatter - suffix = "supermatter" - name = "Hyperfractal Gigashuttle" - description = "\"I dunno, this seems kinda needlessly complicated.\"\n\ - \"This shuttle has very a very high safety record, according to CentCom Officer Cadet Yins.\"\n\ - \"Are you sure?\"\n\ - \"Yes, it has a safety record of N-A-N, which is apparently larger than 100%.\"" - admin_notes = "Supermatter that spawns on shuttle is special anchored 'hugbox' supermatter that cannot take damage and does not take in or emit gas. \ - Outside of admin intervention, it cannot explode. \ - It does, however, still dust anything on contact, emits high levels of radiation, and induce hallucinations in anyone looking at it without protective goggles. \ - Emitters spawn powered on, expect admin notices, they are harmless." - emag_only = TRUE - credit_cost = EMAG_LOCKED_SHUTTLE_COST - movement_force = list("KNOCKDOWN" = 3, "THROW" = 2) - -/datum/map_template/shuttle/emergency/imfedupwiththisworld - suffix = "imfedupwiththisworld" - name = "Oh, Hi Daniel" - description = "How was space work today? Oh, pretty good. We got a new space station and the company will make a lot of money. What space station? I cannot tell you; it's space confidential. \ - Aw, come space on. Why not? No, I can't. Anyway, how is your space roleplay life?" - admin_notes = "Tiny, with a single airlock and wooden walls. What could go wrong?" - emag_only = TRUE - credit_cost = EMAG_LOCKED_SHUTTLE_COST - movement_force = list("KNOCKDOWN" = 3, "THROW" = 2) - -/datum/map_template/shuttle/emergency/goon - suffix = "goon" - name = "NES Port" - description = "The Nanotrasen Emergency Shuttle Port(NES Port for short) is a shuttle used at other less known Nanotrasen facilities and has a more open inside for larger crowds, but fewer onboard shuttle facilities." - credit_cost = CARGO_CRATE_VALUE - -/datum/map_template/shuttle/emergency/rollerdome - suffix = "rollerdome" - name = "Uncle Pete's Rollerdome" - description = "Developed by a member of Nanotrasen's R&D crew that claims to have travelled from the year 2028. \ - He says this shuttle is based off an old entertainment complex from the 1990s, though our database has no records on anything pertaining to that decade." - admin_notes = "ONLY NINETIES KIDS REMEMBER. Uses the fun balloon and drone from the Emergency Bar." - credit_cost = CARGO_CRATE_VALUE * 5 - -/datum/map_template/shuttle/emergency/basketball - suffix = "bballhooper" - name = "Basketballer's Stadium" - description = "Hoop, man, hoop! Get your shooting game on with this sleek new basketball stadium! Do keep in mind that several other features \ - that you may expect to find common-place on other shuttles aren't present to give you this sleek stadium at an affordable cost. \ - It also wasn't manufactured to deal with the form-factor of some of your stations... good luck with that." - admin_notes = "A larger shuttle built around a basketball stadium: entirely impractical but just a complete blast!" - credit_cost = CARGO_CRATE_VALUE * 10 - -/datum/map_template/shuttle/emergency/wabbajack - suffix = "wabbajack" - name = "NT Lepton Violet" - description = "The research team based on this vessel went missing one day, and no amount of investigation could discover what happened to them. \ - The only occupants were a number of dead rodents, who appeared to have clawed each other to death. \ - Needless to say, no engineering team wanted to go near the thing, and it's only being used as an Emergency Escape Shuttle because there is literally nothing else available." - admin_notes = "If the crew can solve the puzzle, they will wake the wabbajack statue. It will likely not end well. There's a reason it's boarded up. Maybe they should have just left it alone." - credit_cost = CARGO_CRATE_VALUE * 30 - -/datum/map_template/shuttle/emergency/omega - suffix = "omega" - name = "Omegastation Emergency Shuttle" - description = "On the smaller size with a modern design, this shuttle is for the crew who like the cosier things, while still being able to stretch their legs." - credit_cost = CARGO_CRATE_VALUE * 2 - -/datum/map_template/shuttle/emergency/cruise - suffix = "cruise" - name = "The NTSS Independence" - description = "Ordinarily reserved for special functions and events, the Cruise Shuttle Independence can bring a summery cheer to your next station evacuation for a 'modest' fee!" - admin_notes = "This motherfucker is BIG. You might need to force dock it." - credit_cost = CARGO_CRATE_VALUE * 100 - -/datum/map_template/shuttle/emergency/monkey - suffix = "nature" - name = "Dynamic Environmental Interaction Shuttle" - description = "A large shuttle with a center biodome that is flourishing with life. Frolick with the monkeys! (Extra monkeys are stored on the bridge.)" - admin_notes = "Pretty freakin' large, almost as big as Raven or Cere. Excercise caution with it." - credit_cost = CARGO_CRATE_VALUE * 16 - -/datum/map_template/shuttle/emergency/casino - suffix = "casino" - name = "Lucky Jackpot Casino Shuttle" - description = "A luxurious casino packed to the brim with everything you need to start new gambling addicitions!" - admin_notes = "The ship is a bit chunky, so watch where you park it." - credit_cost = 7777 - -/datum/map_template/shuttle/emergency/shadow - suffix = "shadow" - name = "The NTSS Shadow" - description = "Guaranteed to get you somewhere FAST. With a custom-built plasma engine, this bad boy will put more distance between you and certain danger than any other!" - admin_notes = "The aft of the ship has a plasma tank that starts ignited. May get released by crew. The plasma windows next to the engine heaters will also erupt into flame, and also risk getting released by crew." - credit_cost = CARGO_CRATE_VALUE * 50 - -/datum/map_template/shuttle/emergency/fish - suffix = "fish" - name = "Angler's Choice Emergency Shuttle" - description = "Trades such amenities as 'storage space' and 'sufficient seating' for an artifical environment ideal for fishing, plus ample supplies (also for fishing)." - admin_notes = "There's a chasm in it, it has railings but that won't stop determined players." - credit_cost = CARGO_CRATE_VALUE * 10 - -/datum/map_template/shuttle/emergency/lance - suffix = "lance" - name = "The Lance Crew Evacuation System" - description = "A brand new shuttle by Nanotrasen's finest in shuttle-engineering, it's designed to tactically slam into a destroyed station, dispatching threats and saving crew at the same time! Be careful to stay out of it's path." - admin_notes = "WARNING: This shuttle is designed to crash into the station. It has turrets, similar to the raven." - credit_cost = CARGO_CRATE_VALUE * 70 - -/datum/map_template/shuttle/emergency/tranquility - suffix = "tranquility" - name = "The Tranquility Relocation Shuttle" - description = "A large shuttle, covered in flora and comfortable resting areas. The perfect way to end a peaceful shift" - admin_notes = "it's pretty big, and comfy. Be careful when placing it down!" - credit_cost = CARGO_CRATE_VALUE * 25 - -/datum/map_template/shuttle/emergency/hugcage - suffix = "hugcage" - name = "Hug Relaxation Shuttle" - description = "A small cozy shuttle with plenty of beds for tired or sensitive spacemen, and a box for pillow-fights." - admin_notes = "Has a sentience fun balloon for pets." - credit_cost = CARGO_CRATE_VALUE * 16 - -/datum/map_template/shuttle/ferry/base - suffix = "base" - name = "transport ferry" - description = "Standard issue Box/Metastation CentCom ferry." - -/datum/map_template/shuttle/ferry/meat - suffix = "meat" - name = "\"meat\" ferry" - description = "Ahoy! We got all kinds o' meat aft here. Meat from plant people, people who be dark, not in a racist way, just they're dark black. \ - Oh and lizard meat too,mighty popular that is. Definitely 100% fresh, just ask this guy here. *person on meatspike moans* See? \ - Definitely high quality meat, nothin' wrong with it, nothin' added, definitely no zombifyin' reagents!" - admin_notes = "Meat currently contains no zombifying reagents, lizard on meatspike must be spawned in." - -/datum/map_template/shuttle/ferry/lighthouse - suffix = "lighthouse" - name = "The Lighthouse(?)" - description = "*static*... part of a much larger vessel, possibly military in origin. \ - The weapon markings aren't anything we've seen ...static... by almost never the same person twice, possible use of unknown storage ...static... \ - seeing ERT officers onboard, but no missions are on file for ...static...static...annoying jingle... only at The LIGHTHOUSE! \ - Fulfilling needs you didn't even know you had. We've got EVERYTHING, and something else!" - admin_notes = "Currently larger than ferry docking port on Box, will not hit anything, but must be force docked. Trader and ERT bodyguards are not included." - -/datum/map_template/shuttle/ferry/fancy - suffix = "fancy" - name = "fancy transport ferry" - description = "At some point, someone upgraded the ferry to have fancier flooring... and fewer seats." - -/datum/map_template/shuttle/ferry/kilo - suffix = "kilo" - name = "kilo transport ferry" - description = "Standard issue CentCom Ferry for Kilo pattern stations. Includes additional equipment and rechargers." - -/datum/map_template/shuttle/ferry/northstar - suffix = "northstar" - name = "north star transport ferry" - description = "In the very depths of the frontier, you'll need a rugged shuttle capable of delivering crew, this is that." - -/datum/map_template/shuttle/whiteship/box - suffix = "box" - name = "Hospital Ship" - description = "Whiteship with medical supplies. Zombies do not currently spawn corpses, and are not infectious." - -/datum/map_template/shuttle/whiteship/meta - suffix = "meta" - name = "Salvage Ship" - description = "Whiteship that focuses on a large cargo bay that players can build in. Spawns with Syndicate mobs who do not drop corpses and are highly aggressive." - -/datum/map_template/shuttle/whiteship/pubby - suffix = "pubby" - name = "NT Science Vessel" - description = "A small science vessel that uses just one area and is full of angry ants." - -/datum/map_template/shuttle/whiteship/cere - suffix = "cere" - name = "NT Heavy Salvage Vessel" - description = "A beefy, well-rounded salvage vessel with a pair of corpses (miner and engineer) and a Captain's hat. Equipped with solar sails and a PACMAN generator." - -/datum/map_template/shuttle/whiteship/birdshot - suffix = "birdshot" - name = "NT Patrol Bee" - description = "A small patrol vessel with a central corridor connecting all rooms. Features 2 small cargo bays and a brig. Spawns with an agressive and deadly Gelatinous Cube" - -/datum/map_template/shuttle/whiteship/kilo - suffix = "kilo" - name = "NT Mining Shuttle" - description = "A mining vessel with a curious shape starting with a few angry netherworld mobs." - -/datum/map_template/shuttle/whiteship/donut - suffix = "donut" - name = "NT Long-Distance Bluespace Jumper" - description = "A ship hit with an engine blowout, leaving it as a depressurised husk. Has infinite power, although likely to bait people into removing that property. Also the most open out of all the whiteships, and starts with a 25% ripley chance." - -/datum/map_template/shuttle/whiteship/tram - suffix = "tram" - name = "NT Long-Distance Bluespace Freighter" - description = "A long shuttle that starts with Nanotrasen private security corpses. DOES NOT FIT IN THE BASE DOCKS! Does fit in Deep Space's dock though." - -/datum/map_template/shuttle/whiteship/delta - suffix = "delta" - name = "NT Frigate" - description = "A standard whiteship with big spiders onboard. PACMAN generator is not wired and next to main grid cabling, so it requires some work." - -/datum/map_template/shuttle/whiteship/pod - suffix = "whiteship_pod" - name = "Salvage Pod" - description = "There is no map for this vessel and it was supposed to be used with the Meta-class. Do not try to spawn it!" - -/datum/map_template/shuttle/whiteship/personalshuttle - suffix = "personalshuttle" - name = "Personal Travel Shuttle" - description = "A small vessel with a few zombies and an engineer's corpse that can be looted." - -/datum/map_template/shuttle/whiteship/obelisk - suffix = "obelisk" - name = "Obelisk" - description = "A large research vessel affected by the Cult of Nar'Sie. PACMAN generator is not wired and next to main grid cabling, so it requires some work." - admin_notes = "Not actually an obelisk, has nonsentient cult constructs." - -/datum/map_template/shuttle/cargo/kilo - suffix = "kilo" - name = "supply shuttle (Kilo)" - -/datum/map_template/shuttle/cargo/birdboat - suffix = "birdboat" - name = "supply shuttle (Birdboat)" - -/datum/map_template/shuttle/cargo/donut - suffix = "donut" - name = "supply shuttle (Donut)" - -/datum/map_template/shuttle/cargo/pubby - suffix = "pubby" - name = "supply shuttle (Pubby)" - -/datum/map_template/shuttle/cargo/birdshot - suffix = "birdshot" - name = "supply shuttle (Birdshot)" - -/datum/map_template/shuttle/emergency/delta - suffix = "delta" - name = "Delta Station Emergency Shuttle" - description = "A large shuttle for a large station, this shuttle can comfortably fit all your overpopulation and crowding needs. Complete with all facilities plus additional equipment." - admin_notes = "Go big or go home." - credit_cost = CARGO_CRATE_VALUE * 15 - -/datum/map_template/shuttle/emergency/northstar - suffix = "northstar" - name = "North Star Emergency Shuttle" - description = "A rugged shuttle meant for long-distance transit from the tips of the frontier to Central Command and back. \ - moderately comfortable and large, but cramped." - credit_cost = CARGO_CRATE_VALUE * 14 - -/datum/map_template/shuttle/emergency/raven - suffix = "raven" - name = "CentCom Raven Cruiser" - description = "The CentCom Raven Cruiser is a former high-risk salvage vessel, now repurposed into an emergency escape shuttle. \ - Once first to the scene to pick through warzones for valuable remains, it now serves as an excellent escape option for stations under heavy fire from outside forces. \ - This escape shuttle boasts shields and numerous anti-personnel turrets guarding its perimeter to fend off meteors and enemy boarding attempts." - admin_notes = "Comes with turrets that will target anything without the neutral faction (nuke ops, xenos etc, but not pets)." - credit_cost = CARGO_CRATE_VALUE * 60 - -/datum/map_template/shuttle/emergency/zeta - suffix = "zeta" - name = "Tr%nPo2r& Z3TA" - description = "A glitch appears on your monitor, flickering in and out of the options laid before you. \ - It seems strange and alien, you may need a special technology to access the signal.." - admin_notes = "Has alien surgery tools, and a void core that provides unlimited power." - credit_cost = CARGO_CRATE_VALUE * 16 - -/datum/map_template/shuttle/emergency/zeta/prerequisites_met() - return SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_ALIENTECH] - -/datum/map_template/shuttle/arrival/box - suffix = "box" - name = "arrival shuttle (Box)" - -/datum/map_template/shuttle/cargo/box - suffix = "box" - name = "cargo ferry (Box)" - -/datum/map_template/shuttle/mining/box - suffix = "box" - name = "mining shuttle (Box)" - -/datum/map_template/shuttle/labour/box - suffix = "box" - name = "labour shuttle (Box)" - -/datum/map_template/shuttle/labour/generic - suffix = "generic" - name = "labour shuttle (Generic)" - -/datum/map_template/shuttle/arrival/donut - suffix = "donut" - name = "arrival shuttle (Donut)" - -/datum/map_template/shuttle/arrival/birdshot - suffix = "birdshot" - name = "arrival shuttle (Birdshot)" - -/datum/map_template/shuttle/infiltrator/basic - suffix = "basic" - name = "basic syndicate infiltrator" - description = "Base Syndicate infiltrator, spawned by default for nukeops to use." - -/datum/map_template/shuttle/infiltrator/advanced - suffix = "advanced" - name = "advanced syndicate infiltrator" - description = "A much larger version of the standard Syndicate infiltrator that feels more like Kilostation. Has APCs, but power is not a concern for nuclear operatives. Also comes with atmos!" - -/datum/map_template/shuttle/cargo/delta - suffix = "delta" - name = "cargo ferry (Delta)" - -/datum/map_template/shuttle/mining/delta - suffix = "delta" - name = "mining shuttle (Delta)" - -/datum/map_template/shuttle/mining/kilo - suffix = "kilo" - name = "mining shuttle (Kilo)" - -/datum/map_template/shuttle/mining/large - suffix = "large" - name = "mining shuttle (Large)" - -/datum/map_template/shuttle/mining/northstar - suffix = "northstar" - name = "mining shuttle (North Star)" - -/datum/map_template/shuttle/labour/delta - suffix = "delta" - name = "labour shuttle (Delta)" - -/datum/map_template/shuttle/labour/kilo - 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/mining_common/northstar - suffix = "northstar" - name = "lavaland shuttle (North Star)" - -/datum/map_template/shuttle/arrival/delta - suffix = "delta" - name = "arrival shuttle (Delta)" - -/datum/map_template/shuttle/arrival/kilo - suffix = "kilo" - name = "arrival shuttle (Kilo)" - -/datum/map_template/shuttle/arrival/pubby - suffix = "pubby" - name = "arrival shuttle (Pubby)" - -/datum/map_template/shuttle/arrival/omega - 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)" - description = "Base escape pod with 2 tiles of interior space." - -/datum/map_template/shuttle/escape_pod/large - suffix = "large" - name = "escape pod (Large)" - description = "Actually the old Pubbystation monastery shuttle." - -/datum/map_template/shuttle/escape_pod/luxury - suffix = "luxury" - name = "escape pod (Luxury)" - description = "Upgraded escape pod with 3 tiles of interior space." - -/datum/map_template/shuttle/escape_pod/cramped - suffix = "cramped" - name = "escape pod (Cramped)" - description = "Downgraded escape pod that lacks a window and only has one seat, alongside lacking an emergency safe." - -/datum/map_template/shuttle/assault_pod/default - suffix = "default" - name = "assault pod (Default)" - -/datum/map_template/shuttle/pirate/default - suffix = "default" - name = "pirate ship (Default)" - -/datum/map_template/shuttle/pirate/silverscale - suffix = "silverscale" - name = "pirate ship (Silver Scales)" - -/datum/map_template/shuttle/pirate/dutchman - suffix = "dutchman" - name = "pirate ship (Flying Dutchman)" - -/datum/map_template/shuttle/pirate/interdyne - suffix = "interdyne" - name = "pirate ship (Pharmaceutics Biocraft)" - -/datum/map_template/shuttle/pirate/grey - suffix = "grey" - name = "pirate ship (The Space Toolbox)" - -/datum/map_template/shuttle/hunter/space_cop - suffix = "space_cop" - name = "Police Spacevan" - -/datum/map_template/shuttle/hunter/russian - suffix = "russian" - name = "Russian Cargo Ship" - -/datum/map_template/shuttle/hunter/bounty - suffix = "bounty" - name = "Bounty Hunter Ship" - -/datum/map_template/shuttle/hunter/psyker - suffix = "psyker" - name = "Psyker Fortune-Telling Ship" - -/datum/map_template/shuttle/starfury - port_id = "starfury" - who_can_purchase = null - -/datum/map_template/shuttle/starfury/fighter_one - suffix = "fighter1" - name = "SBC Starfury Fighter (1)" - -/datum/map_template/shuttle/starfury/fighter_two - suffix = "fighter2" - name = "SBC Starfury Fighter (2)" - -/datum/map_template/shuttle/starfury/fighter_three - suffix = "fighter3" - name = "SBC Starfury Fighter (3)" - -/datum/map_template/shuttle/starfury/corvette - suffix = "corvette" - name = "SBC Starfury Corvette" - -/datum/map_template/shuttle/ruin/cyborg_mothership - suffix = "cyborg_mothership" - name = "Cyborg Mothership" - description = "A highly industrialised vessel designed for silicon operation infested with hivebots and space vines." - -/datum/map_template/shuttle/ruin/caravan_victim - suffix = "caravan_victim" - name = "Small Freighter" - description = "Small freight vessel, starts near blacked-out with 3 Syndicate Commandos and 1 Syndicate Stormtrooper, alongside a large hull breach." - -/datum/map_template/shuttle/ruin/pirate_cutter - suffix = "pirate_cutter" - name = "Pirate Cutter" - description = "Small pirate vessel with ballistic turrets. Spawns with 3 pirate mobs, one of which drops an energy cutlass." - -/datum/map_template/shuttle/ruin/syndicate_dropship - suffix = "syndicate_dropship" - name = "Syndicate Dropship" - description = "Light Syndicate vessel with laser turrets. Spawns with a Syndicate mob in the bridge." - -/datum/map_template/shuttle/ruin/syndicate_fighter_shiv - suffix = "syndicate_fighter_shiv" - name = "Syndicate Fighter" - description = "A small Syndicate vessel with exactly one tile of useful interior space and 4 laser turrets. Starts with a Syndicate mob in the pilot's seat, and extremely cramped." - -/datum/map_template/shuttle/snowdin/mining - suffix = "mining" - name = "Snowdin Mining Elevator" - -/datum/map_template/shuttle/snowdin/excavation - suffix = "excavation" - name = "Snowdin Excavation Elevator" - -/datum/map_template/shuttle/arrival/northstar - suffix = "northstar" - name = "arrival shuttle (North Star)" - -/datum/map_template/shuttle/cargo/northstar - suffix = "northstar" - name = "cargo ferry (North Star)" - -// Custom ERT shuttles -/datum/map_template/shuttle/ert/bounty - suffix = "bounty" - name = "Bounty Hunter ERT Shuttle" - -#undef EMAG_LOCKED_SHUTTLE_COST diff --git a/code/datums/shuttles/_shuttle.dm b/code/datums/shuttles/_shuttle.dm new file mode 100644 index 0000000000000..0100a3d85da3d --- /dev/null +++ b/code/datums/shuttles/_shuttle.dm @@ -0,0 +1,83 @@ +/datum/map_template/shuttle + name = "Base Shuttle Template" + var/prefix = "_maps/shuttles/" + var/suffix + /** + * Port ID is the place this template should be docking at, set on '/obj/docking_port/stationary' + * Because getShuttle() compares port_id to shuttle_id to find an already existing shuttle, + * you should set shuttle_id to be the same as port_id if you want them to be replacable. + */ + var/port_id + /// ID of the shuttle, make sure it matches port_id if necessary. + var/shuttle_id + /// Information to display on communication console about the shuttle + var/description + /// The recommended occupancy limit for the shuttle (count chairs, beds, and benches then round to 5) + var/occupancy_limit + /// Description of the prerequisition that has to be achieved for the shuttle to be purchased + var/prerequisites + /// Shuttle warnings and hazards to the admin who spawns the shuttle + var/admin_notes + /// How much does this shuttle cost the cargo budget to purchase? Put in terms of CARGO_CRATE_VALUE to properly scale the cost with the current balance of cargo's income. + var/credit_cost = INFINITY + /// What job accesses can buy this shuttle? If null, this shuttle cannot be bought. + var/list/who_can_purchase = list(ACCESS_CAPTAIN) + /// Whether or not this shuttle is locked to emags only. + var/emag_only = FALSE + /// If set, overrides default movement_force on shuttle + var/list/movement_force + + var/port_x_offset + var/port_y_offset + var/extra_desc = "" + +/datum/map_template/shuttle/proc/prerequisites_met() + return TRUE + +/datum/map_template/shuttle/New() + shuttle_id = "[port_id]_[suffix]" + mappath = "[prefix][shuttle_id].dmm" + . = ..() + +/datum/map_template/shuttle/preload_size(path, cache) + . = ..(path, TRUE) // Done this way because we still want to know if someone actualy wanted to cache the map + if(!cached_map) + return + + var/offset = discover_offset(/obj/docking_port/mobile) + + port_x_offset = offset[1] + port_y_offset = offset[2] + + if(!cache) + cached_map = null + +/datum/map_template/shuttle/load(turf/T, centered, register=TRUE) + . = ..() + if(!.) + return + var/list/turfs = block( locate(.[MAP_MINX], .[MAP_MINY], .[MAP_MINZ]), + locate(.[MAP_MAXX], .[MAP_MAXY], .[MAP_MAXZ])) + for(var/i in 1 to turfs.len) + var/turf/place = turfs[i] + if(isspaceturf(place)) // This assumes all shuttles are loaded in a single spot then moved to their real destination. + continue + + if (place.count_baseturfs() < 2) // Some snowflake shuttle shit + continue + + place.insert_baseturf(3, /turf/baseturf_skipover/shuttle) + + for(var/obj/docking_port/mobile/port in place) + port.calculate_docking_port_information(src) + // initTemplateBounds explicitly ignores the shuttle's docking port, to ensure that it calculates the bounds of the shuttle correctly + // so we need to manually initialize it here + SSatoms.InitializeAtoms(list(port)) + if(register) + port.register() + +//Whatever special stuff you want +/datum/map_template/shuttle/post_load(obj/docking_port/mobile/M) + if(movement_force) + M.movement_force = movement_force.Copy() + M.linkup() diff --git a/code/datums/shuttles/arrival.dm b/code/datums/shuttles/arrival.dm new file mode 100644 index 0000000000000..376de809afa23 --- /dev/null +++ b/code/datums/shuttles/arrival.dm @@ -0,0 +1,35 @@ +/datum/map_template/shuttle/arrival + port_id = "arrival" + who_can_purchase = null + +/datum/map_template/shuttle/arrival/box + suffix = "box" + name = "arrival shuttle (Box)" + +/datum/map_template/shuttle/arrival/donut + suffix = "donut" + name = "arrival shuttle (Donut)" + +/datum/map_template/shuttle/arrival/birdshot + suffix = "birdshot" + name = "arrival shuttle (Birdshot)" + +/datum/map_template/shuttle/arrival/delta + suffix = "delta" + name = "arrival shuttle (Delta)" + +/datum/map_template/shuttle/arrival/kilo + suffix = "kilo" + name = "arrival shuttle (Kilo)" + +/datum/map_template/shuttle/arrival/pubby + suffix = "pubby" + name = "arrival shuttle (Pubby)" + +/datum/map_template/shuttle/arrival/omega + suffix = "omega" + name = "arrival shuttle (Omega)" + +/datum/map_template/shuttle/arrival/northstar + suffix = "northstar" + name = "arrival shuttle (North Star)" diff --git a/code/datums/shuttles/assault_pod.dm b/code/datums/shuttles/assault_pod.dm new file mode 100644 index 0000000000000..63a885f92eac2 --- /dev/null +++ b/code/datums/shuttles/assault_pod.dm @@ -0,0 +1,7 @@ +/datum/map_template/shuttle/assault_pod + port_id = "assault_pod" + who_can_purchase = null + +/datum/map_template/shuttle/assault_pod/default + suffix = "default" + name = "assault pod (Default)" diff --git a/code/datums/shuttles/aux_base.dm b/code/datums/shuttles/aux_base.dm new file mode 100644 index 0000000000000..c377e278b9067 --- /dev/null +++ b/code/datums/shuttles/aux_base.dm @@ -0,0 +1,11 @@ +/datum/map_template/shuttle/aux_base + port_id = "aux_base" + who_can_purchase = null + +/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)" diff --git a/code/datums/shuttles/cargo.dm b/code/datums/shuttles/cargo.dm new file mode 100644 index 0000000000000..a18b7a4ac9af7 --- /dev/null +++ b/code/datums/shuttles/cargo.dm @@ -0,0 +1,36 @@ +/datum/map_template/shuttle/cargo + port_id = "cargo" + name = "Base Shuttle Template (Cargo)" + who_can_purchase = null + +/datum/map_template/shuttle/cargo/kilo + suffix = "kilo" + name = "supply shuttle (Kilo)" + +/datum/map_template/shuttle/cargo/birdboat + suffix = "birdboat" + name = "supply shuttle (Birdboat)" + +/datum/map_template/shuttle/cargo/donut + suffix = "donut" + name = "supply shuttle (Donut)" + +/datum/map_template/shuttle/cargo/pubby + suffix = "pubby" + name = "supply shuttle (Pubby)" + +/datum/map_template/shuttle/cargo/birdshot + suffix = "birdshot" + name = "supply shuttle (Birdshot)" + +/datum/map_template/shuttle/cargo/box + suffix = "box" + name = "cargo ferry (Box)" + +/datum/map_template/shuttle/cargo/delta + suffix = "delta" + name = "cargo ferry (Delta)" + +/datum/map_template/shuttle/cargo/northstar + suffix = "northstar" + name = "cargo ferry (North Star)" diff --git a/code/datums/shuttles/emergency.dm b/code/datums/shuttles/emergency.dm new file mode 100644 index 0000000000000..a05c123051edd --- /dev/null +++ b/code/datums/shuttles/emergency.dm @@ -0,0 +1,494 @@ +#define EMAG_LOCKED_SHUTTLE_COST (CARGO_CRATE_VALUE * 50) + +/datum/map_template/shuttle/emergency + port_id = "emergency" + name = "Base Shuttle Template (Emergency)" + ///assoc list of shuttle events to add to this shuttle on spawn (typepath = weight) + var/list/events + ///pick all events instead of random + var/use_all_events = FALSE + ///how many do we pick + var/event_amount = 1 + ///do we empty the event list before adding our events + var/events_override = FALSE + +/datum/map_template/shuttle/emergency/New() + . = ..() + if(!occupancy_limit && who_can_purchase) + CRASH("The [name] needs an occupancy limit!") + if(HAS_TRAIT(SSstation, STATION_TRAIT_SHUTTLE_SALE) && credit_cost > 0 && prob(15)) + var/discount_amount = round(rand(25, 80), 5) + name += " ([discount_amount]% Discount!)" + var/discount_multiplier = 100 - discount_amount + credit_cost = ((credit_cost * discount_multiplier) / 100) + +///on post_load use our variables to change shuttle events +/datum/map_template/shuttle/emergency/post_load(obj/docking_port/mobile/mobile) + . = ..() + if(!events) + return + if(events_override) + mobile.event_list.Cut() + if(use_all_events) + for(var/path in events) + mobile.event_list.Add(new path(mobile)) + events -= path + else + for(var/i in 1 to event_amount) + var/path = pick_weight(events) + events -= path + mobile.event_list.Add(new path(mobile)) + +/datum/map_template/shuttle/emergency/backup + suffix = "backup" + name = "Backup Shuttle" + who_can_purchase = null + +/datum/map_template/shuttle/emergency/construction + suffix = "construction" + name = "Build your own shuttle kit" + description = "For the enterprising shuttle engineer! The chassis will dock upon purchase, but launch will have to be authorized as usual via shuttle call. Comes stocked with construction materials. Unlocks the ability to buy shuttle engine crates from cargo, which allow you to speed up shuttle transit time." + admin_notes = "No brig, no medical facilities." + credit_cost = CARGO_CRATE_VALUE * 5 + who_can_purchase = list(ACCESS_CAPTAIN, ACCESS_CE) + occupancy_limit = "Flexible" + +/datum/map_template/shuttle/emergency/construction/post_load() + . = ..() + //enable buying engines from cargo + var/datum/supply_pack/P = SSshuttle.supply_packs[/datum/supply_pack/engineering/shuttle_engine] + P.special_enabled = TRUE + +/datum/map_template/shuttle/emergency/asteroid + suffix = "asteroid" + name = "Asteroid Station Emergency Shuttle" + description = "A respectable mid-sized shuttle that first saw service shuttling Nanotrasen crew to and from their asteroid belt embedded facilities." + credit_cost = CARGO_CRATE_VALUE * 6 + occupancy_limit = "50" + +/datum/map_template/shuttle/emergency/venture + suffix = "venture" + name = "Venture Emergency Shuttle" + description = "A mid-sized shuttle for those who like a lot of space for their legs." + credit_cost = CARGO_CRATE_VALUE * 10 + occupancy_limit = "45" + +/datum/map_template/shuttle/emergency/humpback + suffix = "humpback" + name = "Humpback Emergency Shuttle" + description = "A repurposed cargo hauling and salvaging ship, for sightseeing and tourism. Has a bar. Complete with a 2 minute vacation plan to carp territory." + credit_cost = CARGO_CRATE_VALUE * 12 + occupancy_limit = "30" + events = list( + /datum/shuttle_event/simple_spawner/carp/friendly = 10, + /datum/shuttle_event/simple_spawner/carp/friendly_but_no_personal_space = 2, + /datum/shuttle_event/simple_spawner/carp = 2, + /datum/shuttle_event/simple_spawner/carp/magic = 1, + ) + +/datum/map_template/shuttle/emergency/bar + suffix = "bar" + name = "The Emergency Escape Bar" + description = "Features include sentient bar staff (a Bardrone and a Barmaid), bathroom, a quality lounge for the heads, and a large gathering table." + admin_notes = "Bardrone and Barmaid are GODMODE, will be automatically sentienced by the fun balloon at 60 seconds before arrival. \ + Has medical facilities." + credit_cost = CARGO_CRATE_VALUE * 10 + occupancy_limit = "30" + +/datum/map_template/shuttle/emergency/pod + suffix = "pod" + name = "Emergency Pods" + description = "We did not expect an evacuation this quickly. All we have available is two escape pods." + admin_notes = "For player punishment." + who_can_purchase = null + occupancy_limit = "10" + +/datum/map_template/shuttle/emergency/russiafightpit + suffix = "russiafightpit" + name = "Mother Russia Bleeds" + description = "Dis is a high-quality shuttle, da. Many seats, lots of space, all equipment! Even includes entertainment! Such as lots to drink, and a fighting arena for drunk crew to have fun! If arena not fun enough, simply press button of releasing bears. Do not worry, bears trained not to break out of fighting pit, so totally safe so long as nobody stupid or drunk enough to leave door open. Try not to let asimov babycons ruin fun!" + admin_notes = "Includes a small variety of weapons. And bears. Only captain-access can release the bears. Bears won't smash the windows themselves, but they can escape if someone lets them." + credit_cost = CARGO_CRATE_VALUE * 10 // While the shuttle is rusted and poorly maintained, trained bears are costly. + occupancy_limit = "40" + +/datum/map_template/shuttle/emergency/meteor + suffix = "meteor" + name = "Asteroid With Engines Strapped To It" + description = "A hollowed out asteroid with engines strapped to it, the hollowing procedure makes it very difficult to hijack but is very expensive. Due to its size and difficulty in steering it, this shuttle may damage the docking area." + admin_notes = "This shuttle will likely crush escape, killing anyone there." + credit_cost = CARGO_CRATE_VALUE * 30 + movement_force = list("KNOCKDOWN" = 3, "THROW" = 2) + occupancy_limit = "CONDEMNED" + +/datum/map_template/shuttle/emergency/monastery + suffix = "monastery" + name = "Grand Corporate Monastery" + description = "Originally built for a public station, this grand edifice to religion, due to budget cuts, is now available as an escape shuttle for the right... donation. Due to its large size and callous owners, this shuttle may cause collateral damage." + admin_notes = "WARNING: This shuttle WILL destroy a fourth of the station, likely picking up a lot of objects with it." + emag_only = TRUE + credit_cost = EMAG_LOCKED_SHUTTLE_COST * 1.8 + movement_force = list("KNOCKDOWN" = 3, "THROW" = 5) + occupancy_limit = "70" + +/datum/map_template/shuttle/emergency/luxury + suffix = "luxury" + name = "Luxury Shuttle" + description = "A luxurious golden shuttle complete with an indoor swimming pool. Each crewmember wishing to board must bring 500 credits, payable in cash and mineral coin." + extra_desc = "This shuttle costs 500 credits to board." + admin_notes = "Due to the limited space for non paying crew, this shuttle may cause a riot." + emag_only = TRUE + credit_cost = EMAG_LOCKED_SHUTTLE_COST + occupancy_limit = "75" + +/datum/map_template/shuttle/emergency/medisim + suffix = "medisim" + name = "Medieval Reality Simulation Dome" + description = "A state of the art simulation dome, loaded onto your shuttle! Watch and laugh at how petty humanity used to be before it reached the stars. Guaranteed to be at least 40% historically accurate." + prerequisites = "A special holodeck simulation might allow this shuttle to be loaded." + admin_notes = "Ghosts can spawn in and fight as knights or archers. The CTF auto restarts, so no admin intervention necessary." + credit_cost = 20000 + occupancy_limit = "30" + +/datum/map_template/shuttle/emergency/medisim/prerequisites_met() + return SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_MEDISIM] + +/datum/map_template/shuttle/emergency/discoinferno + suffix = "discoinferno" + name = "Disco Inferno" + description = "The glorious results of centuries of plasma research done by Nanotrasen employees. This is the reason why you are here. Get on and dance like you're on fire, burn baby burn!" + admin_notes = "Flaming hot. The main area has a dance machine as well as plasma floor tiles that will be ignited by players every single time." + emag_only = TRUE + credit_cost = EMAG_LOCKED_SHUTTLE_COST + occupancy_limit = "10" + +/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." + prerequisites = "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 + occupancy_limit = "1/2" + /// 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" + description = "Though a little on the small side, this shuttle is feature complete, which is more than can be said for the pattern of station it was commissioned for." + credit_cost = CARGO_CRATE_VALUE * 2 + occupancy_limit = "25" + +/datum/map_template/shuttle/emergency/box + suffix = "box" + name = "Box Station Emergency Shuttle" + credit_cost = CARGO_CRATE_VALUE * 4 + description = "The gold standard in emergency exfiltration, this tried and true design is equipped with everything the crew needs for a safe flight home." + occupancy_limit = "45" + +/datum/map_template/shuttle/emergency/donut + suffix = "donut" + name = "Donutstation Emergency Shuttle" + description = "The perfect spearhead for any crude joke involving the station's shape, this shuttle supports a separate containment cell for prisoners and a compact medical wing." + admin_notes = "Has airlocks on both sides of the shuttle and will probably intersect near the front on some stations that build past departures." + credit_cost = CARGO_CRATE_VALUE * 5 + occupancy_limit = "60" + +/datum/map_template/shuttle/emergency/clown + suffix = "clown" + name = "Snappop(tm)!" + description = "Hey kids and grownups! \ + Are you bored of DULL and TEDIOUS shuttle journeys after you're evacuating for probably BORING reasons. Well then order the Snappop(tm) today! \ + 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." + credit_cost = CARGO_CRATE_VALUE * 16 + occupancy_limit = "HONK" + +/datum/map_template/shuttle/emergency/cramped + suffix = "cramped" + name = "Secure Transport Vessel 5 (STV5)" + description = "Well, looks like CentCom only had this ship in the area, they probably weren't expecting you to need evac for a while. \ + Probably best if you don't rifle around in whatever equipment they were transporting. I hope you're friendly with your coworkers, because there is very little space in this thing.\n\ + \n\ + Contains contraband armory guns, maintenance loot, and abandoned crates!" + admin_notes = "Due to origin as a solo piloted secure vessel, has an active GPS onboard labeled STV5. Has roughly as much space as Hi Daniel, except with explosive crates." + occupancy_limit = "5" + +/datum/map_template/shuttle/emergency/meta + suffix = "meta" + name = "Meta Station Emergency Shuttle" + credit_cost = CARGO_CRATE_VALUE * 8 + description = "A fairly standard shuttle, though larger and slightly better equipped than the Box Station variant." + occupancy_limit = "45" + +/datum/map_template/shuttle/emergency/kilo + suffix = "kilo" + name = "Kilo Station Emergency Shuttle" + credit_cost = CARGO_CRATE_VALUE * 10 + description = "A fully functional shuttle including a complete infirmary, storage facilties and regular amenities." + occupancy_limit = "55" + +/datum/map_template/shuttle/emergency/mini + suffix = "mini" + name = "Ministation emergency shuttle" + credit_cost = CARGO_CRATE_VALUE * 2 + description = "Despite its namesake, this shuttle is actually only slightly smaller than standard, and still complete with a brig and medbay." + occupancy_limit = "35" + +/datum/map_template/shuttle/emergency/tram + suffix = "tram" + name = "Tram Station Emergency Shuttle" + credit_cost = CARGO_CRATE_VALUE * 4 + description = "A train but in space, choo choo!" + occupancy_limit = "35" + +/datum/map_template/shuttle/emergency/birdshot + suffix = "birdshot" + name = "Birdshot Station Emergency Shuttle" + credit_cost = CARGO_CRATE_VALUE * 2 + description = "We pulled this one out of Mothball just for you!" + occupancy_limit = "40" + +/datum/map_template/shuttle/emergency/scrapheap + suffix = "scrapheap" + name = "Standby Evacuation Vessel \"Scrapheap Challenge\"" + credit_cost = CARGO_CRATE_VALUE * -18 + description = "Comrade! We see you are having trouble with money, yes? If you have money issue, very little money, we are looking for good shuttle, emergency shuttle. You take best in sector shuttle, we take yours, you get money, da? Please do not lean on window, fragile like fina china. -Ivan" + admin_notes = "An abomination with no functional medbay, sections missing, and some very fragile windows. Surprisingly airtight. When bought, gives a good influx of money, but can only be bought if the budget is literally 0 credits." + movement_force = list("KNOCKDOWN" = 3, "THROW" = 2) + occupancy_limit = "30" + +/datum/map_template/shuttle/emergency/scrapheap/prerequisites_met() + return SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_SCRAPHEAP] + +/datum/map_template/shuttle/emergency/narnar + suffix = "narnar" + name = "Shuttle 667" + description = "Looks like this shuttle may have wandered into the darkness between the stars on route to the station. Let's not think too hard about where all the bodies came from." + admin_notes = "Contains real cult ruins, mob eyeballs, and inactive constructs. Cult mobs will automatically be sentienced by fun balloon. \ + Cloning pods in 'medbay' area are showcases and nonfunctional." + prerequisites = "Mysterious cult runes may need to be banished before this shuttle can be summoned." + credit_cost = 6667 ///The joke is the number so no defines + occupancy_limit = "666" + +/datum/map_template/shuttle/emergency/narnar/prerequisites_met() + return SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_NARNAR] + +/datum/map_template/shuttle/emergency/pubby + suffix = "pubby" + name = "Pubby Station Emergency Shuttle" + description = "A train but in space! Complete with a first, second class, brig and storage area." + admin_notes = "Choo choo motherfucker!" + credit_cost = CARGO_CRATE_VALUE * 2 + occupancy_limit = "50" + +/datum/map_template/shuttle/emergency/cere + suffix = "cere" + name = "Cere Station Emergency Shuttle" + description = "The large, beefed-up version of the box-standard shuttle. Includes an expanded brig, fully stocked medbay, enhanced cargo storage with mech chargers, \ + an engine room stocked with various supplies, and a crew capacity of 80+ to top it all off. Live large, live Cere." + admin_notes = "Seriously big, even larger than the Delta shuttle." + credit_cost = CARGO_CRATE_VALUE * 20 + occupancy_limit = "110" + +/datum/map_template/shuttle/emergency/supermatter + suffix = "supermatter" + name = "Hyperfractal Gigashuttle" + description = "\"I dunno, this seems kinda needlessly complicated.\"\n\ + \"This shuttle has very a very high safety record, according to CentCom Officer Cadet Yins.\"\n\ + \"Are you sure?\"\n\ + \"Yes, it has a safety record of N-A-N, which is apparently larger than 100%.\"" + admin_notes = "Supermatter that spawns on shuttle is special anchored 'hugbox' supermatter that cannot take damage and does not take in or emit gas. \ + Outside of admin intervention, it cannot explode. \ + It does, however, still dust anything on contact, emits high levels of radiation, and induce hallucinations in anyone looking at it without protective goggles. \ + Emitters spawn powered on, expect admin notices, they are harmless." + emag_only = TRUE + credit_cost = EMAG_LOCKED_SHUTTLE_COST + movement_force = list("KNOCKDOWN" = 3, "THROW" = 2) + occupancy_limit = "15" + +/datum/map_template/shuttle/emergency/imfedupwiththisworld + suffix = "imfedupwiththisworld" + name = "Oh, Hi Daniel" + description = "How was space work today? Oh, pretty good. We got a new space station and the company will make a lot of money. What space station? I cannot tell you; it's space confidential. \ + Aw, come space on. Why not? No, I can't. Anyway, how is your space roleplay life?" + admin_notes = "Tiny, with a single airlock and wooden walls. What could go wrong?" + emag_only = TRUE + credit_cost = EMAG_LOCKED_SHUTTLE_COST + movement_force = list("KNOCKDOWN" = 3, "THROW" = 2) + occupancy_limit = "5" + +/datum/map_template/shuttle/emergency/goon + suffix = "goon" + name = "NES Port" + description = "The Nanotrasen Emergency Shuttle Port(NES Port for short) is a shuttle used at other less known Nanotrasen facilities and has a more open inside for larger crowds, but fewer onboard shuttle facilities." + credit_cost = CARGO_CRATE_VALUE + occupancy_limit = "40" + +/datum/map_template/shuttle/emergency/rollerdome + suffix = "rollerdome" + name = "Uncle Pete's Rollerdome" + description = "Developed by a member of Nanotrasen's R&D crew that claims to have travelled from the year 2028. \ + He says this shuttle is based off an old entertainment complex from the 1990s, though our database has no records on anything pertaining to that decade." + admin_notes = "ONLY NINETIES KIDS REMEMBER. Uses the fun balloon and drone from the Emergency Bar." + credit_cost = CARGO_CRATE_VALUE * 30 + occupancy_limit = "5" + +/datum/map_template/shuttle/emergency/basketball + suffix = "bballhooper" + name = "Basketballer's Stadium" + description = "Hoop, man, hoop! Get your shooting game on with this sleek new basketball stadium! Do keep in mind that several other features \ + that you may expect to find common-place on other shuttles aren't present to give you this sleek stadium at an affordable cost. \ + It also wasn't manufactured to deal with the form-factor of some of your stations... good luck with that." + admin_notes = "A larger shuttle built around a basketball stadium: entirely impractical but just a complete blast!" + credit_cost = CARGO_CRATE_VALUE * 10 + occupancy_limit = "30" + +/datum/map_template/shuttle/emergency/wabbajack + suffix = "wabbajack" + name = "NT Lepton Violet" + description = "The research team based on this vessel went missing one day, and no amount of investigation could discover what happened to them. \ + The only occupants were a number of dead rodents, who appeared to have clawed each other to death. \ + Needless to say, no engineering team wanted to go near the thing, and it's only being used as an Emergency Escape Shuttle because there is literally nothing else available." + admin_notes = "If the crew can solve the puzzle, they will wake the wabbajack statue. It will likely not end well. There's a reason it's boarded up. Maybe they should have just left it alone." + credit_cost = CARGO_CRATE_VALUE * 30 + occupancy_limit = "30" + +/datum/map_template/shuttle/emergency/wabbajack/prerequisites_met() + return SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_WABBAJACK] + +/datum/map_template/shuttle/emergency/omega + suffix = "omega" + name = "Omegastation Emergency Shuttle" + description = "On the smaller size with a modern design, this shuttle is for the crew who like the cosier things, while still being able to stretch their legs." + credit_cost = CARGO_CRATE_VALUE * 2 + occupancy_limit = "30" + +/datum/map_template/shuttle/emergency/cruise + suffix = "cruise" + name = "The NTSS Independence" + description = "Ordinarily reserved for special functions and events, the Cruise Shuttle Independence can bring a summery cheer to your next station evacuation for a 'modest' fee!" + admin_notes = "This motherfucker is BIG. You might need to force dock it." + credit_cost = CARGO_CRATE_VALUE * 100 + occupancy_limit = "80" + +/datum/map_template/shuttle/emergency/monkey + suffix = "nature" + name = "Dynamic Environmental Interaction Shuttle" + description = "A large shuttle with a center biodome that is flourishing with life. Frolick with the monkeys! (Extra monkeys are stored on the bridge.)" + admin_notes = "Pretty freakin' large, almost as big as Raven or Cere. Excercise caution with it." + credit_cost = CARGO_CRATE_VALUE * 16 + occupancy_limit = "45" + +/datum/map_template/shuttle/emergency/casino + suffix = "casino" + name = "Lucky Jackpot Casino Shuttle" + description = "A luxurious casino packed to the brim with everything you need to start new gambling addicitions!" + admin_notes = "The ship is a bit chunky, so watch where you park it." + credit_cost = 7777 + occupancy_limit = "85" + +/datum/map_template/shuttle/emergency/shadow + suffix = "shadow" + name = "The NTSS Shadow" + description = "Guaranteed to get you somewhere FAST. With a custom-built plasma engine, this bad boy will put more distance between you and certain danger than any other!" + admin_notes = "The aft of the ship has a plasma tank that starts ignited. May get released by crew. The plasma windows next to the engine heaters will also erupt into flame, and also risk getting released by crew." + credit_cost = CARGO_CRATE_VALUE * 50 + occupancy_limit = "40" + +/datum/map_template/shuttle/emergency/fish + suffix = "fish" + name = "Angler's Choice Emergency Shuttle" + description = "Trades such amenities as 'storage space' and 'sufficient seating' for an artifical environment ideal for fishing, plus ample supplies (also for fishing)." + admin_notes = "There's a chasm in it, it has railings but that won't stop determined players." + credit_cost = CARGO_CRATE_VALUE * 10 + occupancy_limit = "35" + +/datum/map_template/shuttle/emergency/lance + suffix = "lance" + name = "The Lance Crew Evacuation System" + description = "A brand new shuttle by Nanotrasen's finest in shuttle-engineering, it's designed to tactically slam into a destroyed station, dispatching threats and saving crew at the same time! Be careful to stay out of it's path." + admin_notes = "WARNING: This shuttle is designed to crash into the station. It has turrets, similar to the raven." + credit_cost = CARGO_CRATE_VALUE * 70 + occupancy_limit = "50" + +/datum/map_template/shuttle/emergency/tranquility + suffix = "tranquility" + name = "The Tranquility Relocation Shuttle" + description = "A large shuttle, covered in flora and comfortable resting areas. The perfect way to end a peaceful shift" + admin_notes = "it's pretty big, and comfy. Be careful when placing it down!" + credit_cost = CARGO_CRATE_VALUE * 25 + occupancy_limit = "40" + +/datum/map_template/shuttle/emergency/hugcage + suffix = "hugcage" + name = "Hug Relaxation Shuttle" + description = "A small cozy shuttle with plenty of beds for tired or sensitive spacemen, and a box for pillow-fights." + admin_notes = "Has a sentience fun balloon for pets." + credit_cost = CARGO_CRATE_VALUE * 16 + occupancy_limit = "20" + +/datum/map_template/shuttle/emergency/fame + suffix = "fame" + name = "Hall of Fame Shuttle" + description = "A grandiose shuttle that has a red carpet leading to the hall of fame. Are you worthy to stand among the best spessmen in existence?" + admin_notes = "Designed around persistence from memories, trophies, photos, and statues." + credit_cost = CARGO_CRATE_VALUE * 25 + occupancy_limit = "55" + +/datum/map_template/shuttle/emergency/delta + suffix = "delta" + name = "Delta Station Emergency Shuttle" + description = "A large shuttle for a large station, this shuttle can comfortably fit all your overpopulation and crowding needs. Complete with all facilities plus additional equipment." + admin_notes = "Go big or go home." + credit_cost = CARGO_CRATE_VALUE * 15 + occupancy_limit = "75" + +/datum/map_template/shuttle/emergency/northstar + suffix = "northstar" + name = "North Star Emergency Shuttle" + description = "A rugged shuttle meant for long-distance transit from the tips of the frontier to Central Command and back. \ + moderately comfortable and large, but cramped." + credit_cost = CARGO_CRATE_VALUE * 14 + occupancy_limit = "55" + +/datum/map_template/shuttle/emergency/raven + suffix = "raven" + name = "CentCom Raven Cruiser" + description = "The CentCom Raven Cruiser is a former high-risk salvage vessel, now repurposed into an emergency escape shuttle. \ + Once first to the scene to pick through warzones for valuable remains, it now serves as an excellent escape option for stations under heavy fire from outside forces. \ + This escape shuttle boasts shields and numerous anti-personnel turrets guarding its perimeter to fend off meteors and enemy boarding attempts." + admin_notes = "Comes with turrets that will target anything without the neutral faction (nuke ops, xenos etc, but not pets)." + credit_cost = CARGO_CRATE_VALUE * 60 + occupancy_limit = "CLASSIFIED" + +/datum/map_template/shuttle/emergency/zeta + suffix = "zeta" + name = "Tr%nPo2r& Z3TA" + description = "A glitch appears on your monitor, flickering in and out of the options laid before you. \ + It seems strange and alien..." + prerequisites = "You may need a special technology to access the signal." + admin_notes = "Has alien surgery tools, and a void core that provides unlimited power." + credit_cost = CARGO_CRATE_VALUE * 16 + occupancy_limit = "xxx" + +/datum/map_template/shuttle/emergency/zeta/prerequisites_met() + return SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_ALIENTECH] + +#undef EMAG_LOCKED_SHUTTLE_COST diff --git a/code/datums/shuttles/ert.dm b/code/datums/shuttles/ert.dm new file mode 100644 index 0000000000000..843daf34c801d --- /dev/null +++ b/code/datums/shuttles/ert.dm @@ -0,0 +1,8 @@ +/datum/map_template/shuttle/ert + port_id = "ert" + who_can_purchase = null + +// Custom ERT shuttles +/datum/map_template/shuttle/ert/bounty + suffix = "bounty" + name = "Bounty Hunter ERT Shuttle" diff --git a/code/datums/shuttles/escape_pod.dm b/code/datums/shuttles/escape_pod.dm new file mode 100644 index 0000000000000..0b2f35dd9dd44 --- /dev/null +++ b/code/datums/shuttles/escape_pod.dm @@ -0,0 +1,23 @@ +/datum/map_template/shuttle/escape_pod + port_id = "escape_pod" + who_can_purchase = null + +/datum/map_template/shuttle/escape_pod/default + suffix = "default" + name = "escape pod (Default)" + description = "Base escape pod with 2 tiles of interior space." + +/datum/map_template/shuttle/escape_pod/large + suffix = "large" + name = "escape pod (Large)" + description = "Actually the old Pubbystation monastery shuttle." + +/datum/map_template/shuttle/escape_pod/luxury + suffix = "luxury" + name = "escape pod (Luxury)" + description = "Upgraded escape pod with 3 tiles of interior space." + +/datum/map_template/shuttle/escape_pod/cramped + suffix = "cramped" + name = "escape pod (Cramped)" + description = "Downgraded escape pod that lacks a window and only has one seat, alongside lacking an emergency safe." diff --git a/code/datums/shuttles/ferry.dm b/code/datums/shuttles/ferry.dm new file mode 100644 index 0000000000000..e4f540992ff06 --- /dev/null +++ b/code/datums/shuttles/ferry.dm @@ -0,0 +1,40 @@ +/datum/map_template/shuttle/ferry + port_id = "ferry" + name = "Base Shuttle Template (Ferry)" + +/datum/map_template/shuttle/ferry/base + suffix = "base" + name = "transport ferry" + description = "Standard issue Box/Metastation CentCom ferry." + +/datum/map_template/shuttle/ferry/meat + suffix = "meat" + name = "\"meat\" ferry" + description = "Ahoy! We got all kinds o' meat aft here. Meat from plant people, people who be dark, not in a racist way, just they're dark black. \ + Oh and lizard meat too,mighty popular that is. Definitely 100% fresh, just ask this guy here. *person on meatspike moans* See? \ + Definitely high quality meat, nothin' wrong with it, nothin' added, definitely no zombifyin' reagents!" + admin_notes = "Meat currently contains no zombifying reagents, lizard on meatspike must be spawned in." + +/datum/map_template/shuttle/ferry/lighthouse + suffix = "lighthouse" + name = "The Lighthouse(?)" + description = "*static*... part of a much larger vessel, possibly military in origin. \ + The weapon markings aren't anything we've seen ...static... by almost never the same person twice, possible use of unknown storage ...static... \ + seeing ERT officers onboard, but no missions are on file for ...static...static...annoying jingle... only at The LIGHTHOUSE! \ + Fulfilling needs you didn't even know you had. We've got EVERYTHING, and something else!" + admin_notes = "Currently larger than ferry docking port on Box, will not hit anything, but must be force docked. Trader and ERT bodyguards are not included." + +/datum/map_template/shuttle/ferry/fancy + suffix = "fancy" + name = "fancy transport ferry" + description = "At some point, someone upgraded the ferry to have fancier flooring... and fewer seats." + +/datum/map_template/shuttle/ferry/kilo + suffix = "kilo" + name = "kilo transport ferry" + description = "Standard issue CentCom Ferry for Kilo pattern stations. Includes additional equipment and rechargers." + +/datum/map_template/shuttle/ferry/northstar + suffix = "northstar" + name = "north star transport ferry" + description = "In the very depths of the frontier, you'll need a rugged shuttle capable of delivering crew, this is that." diff --git a/code/datums/shuttles/hunter.dm b/code/datums/shuttles/hunter.dm new file mode 100644 index 0000000000000..d8b7f708324e2 --- /dev/null +++ b/code/datums/shuttles/hunter.dm @@ -0,0 +1,19 @@ +/datum/map_template/shuttle/hunter + port_id = "hunter" + who_can_purchase = null + +/datum/map_template/shuttle/hunter/space_cop + suffix = "space_cop" + name = "Police Spacevan" + +/datum/map_template/shuttle/hunter/russian + suffix = "russian" + name = "Russian Cargo Ship" + +/datum/map_template/shuttle/hunter/bounty + suffix = "bounty" + name = "Bounty Hunter Ship" + +/datum/map_template/shuttle/hunter/psyker + suffix = "psyker" + name = "Psyker Fortune-Telling Ship" diff --git a/code/datums/shuttles/infiltrator.dm b/code/datums/shuttles/infiltrator.dm new file mode 100644 index 0000000000000..26f877f996ee7 --- /dev/null +++ b/code/datums/shuttles/infiltrator.dm @@ -0,0 +1,13 @@ +/datum/map_template/shuttle/infiltrator + port_id = "infiltrator" + who_can_purchase = null + +/datum/map_template/shuttle/infiltrator/basic + suffix = "basic" + name = "basic syndicate infiltrator" + description = "Base Syndicate infiltrator, spawned by default for nukeops to use." + +/datum/map_template/shuttle/infiltrator/advanced + suffix = "advanced" + name = "advanced syndicate infiltrator" + description = "A much larger version of the standard Syndicate infiltrator that feels more like Kilostation. Has APCs, but power is not a concern for nuclear operatives. Also comes with atmos!" diff --git a/code/datums/shuttles/mining.dm b/code/datums/shuttles/mining.dm new file mode 100644 index 0000000000000..ffd5cb047854f --- /dev/null +++ b/code/datums/shuttles/mining.dm @@ -0,0 +1,62 @@ +// LABOUR SHUTTLES +/datum/map_template/shuttle/labour + port_id = "labour" + who_can_purchase = null + +/datum/map_template/shuttle/labour/box + suffix = "box" + name = "labour shuttle (Box)" + +/datum/map_template/shuttle/labour/generic + suffix = "generic" + name = "labour shuttle (Generic)" + +/datum/map_template/shuttle/labour/delta + suffix = "delta" + name = "labour shuttle (Delta)" + +/datum/map_template/shuttle/labour/kilo + suffix = "kilo" + name = "labour shuttle (Kilo)" + +// MINING SHUTTLES +/datum/map_template/shuttle/mining + port_id = "mining" + who_can_purchase = null + +/datum/map_template/shuttle/mining/box + suffix = "box" + name = "mining shuttle (Box)" + +/datum/map_template/shuttle/mining/delta + suffix = "delta" + name = "mining shuttle (Delta)" + +/datum/map_template/shuttle/mining/kilo + suffix = "kilo" + name = "mining shuttle (Kilo)" + +/datum/map_template/shuttle/mining/large + suffix = "large" + name = "mining shuttle (Large)" + +/datum/map_template/shuttle/mining/northstar + suffix = "northstar" + name = "mining shuttle (North Star)" + +// MINING COMMON SHUTTLES +/datum/map_template/shuttle/mining_common + port_id = "mining_common" + who_can_purchase = null + +/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/mining_common/northstar + suffix = "northstar" + name = "lavaland shuttle (North Star)" diff --git a/code/datums/shuttles/pirate.dm b/code/datums/shuttles/pirate.dm new file mode 100644 index 0000000000000..c6f94b5684b7a --- /dev/null +++ b/code/datums/shuttles/pirate.dm @@ -0,0 +1,31 @@ +/datum/map_template/shuttle/pirate + port_id = "pirate" + who_can_purchase = null + +/datum/map_template/shuttle/pirate/default + suffix = "default" + name = "pirate ship (Default)" + +/datum/map_template/shuttle/pirate/silverscale + suffix = "silverscale" + name = "pirate ship (Silver Scales)" + +/datum/map_template/shuttle/pirate/dutchman + suffix = "dutchman" + name = "pirate ship (Flying Dutchman)" + +/datum/map_template/shuttle/pirate/interdyne + suffix = "ex_interdyne" + name = "pirate ship (Pharmaceutics Biocraft)" + +/datum/map_template/shuttle/pirate/grey + suffix = "grey" + name = "pirate ship (The Space Toolbox)" + +/datum/map_template/shuttle/pirate/irs + suffix = "irs" + name = "pirate ship (Space IRS)" + +/datum/map_template/shuttle/pirate/geode + suffix = "geode" + name = "pirate ship (Lustrous Geode)" diff --git a/code/datums/shuttles/ruin.dm b/code/datums/shuttles/ruin.dm new file mode 100644 index 0000000000000..511e2d6ecdc88 --- /dev/null +++ b/code/datums/shuttles/ruin.dm @@ -0,0 +1,28 @@ +/datum/map_template/shuttle/ruin + port_id = "ruin" + who_can_purchase = null + +/datum/map_template/shuttle/ruin/cyborg_mothership + suffix = "cyborg_mothership" + name = "Cyborg Mothership" + description = "A highly industrialised vessel designed for silicon operation infested with hivebots and space vines." + +/datum/map_template/shuttle/ruin/caravan_victim + suffix = "caravan_victim" + name = "Small Freighter" + description = "Small freight vessel, starts near blacked-out with 3 Syndicate Commandos and 1 Syndicate Stormtrooper, alongside a large hull breach." + +/datum/map_template/shuttle/ruin/pirate_cutter + suffix = "pirate_cutter" + name = "Pirate Cutter" + description = "Small pirate vessel with ballistic turrets. Spawns with 3 pirate mobs, one of which drops an energy cutlass." + +/datum/map_template/shuttle/ruin/syndicate_dropship + suffix = "syndicate_dropship" + name = "Syndicate Dropship" + description = "Light Syndicate vessel with laser turrets. Spawns with a Syndicate mob in the bridge." + +/datum/map_template/shuttle/ruin/syndicate_fighter_shiv + suffix = "syndicate_fighter_shiv" + name = "Syndicate Fighter" + description = "A small Syndicate vessel with exactly one tile of useful interior space and 4 laser turrets. Starts with a Syndicate mob in the pilot's seat, and extremely cramped." diff --git a/code/datums/shuttles/snowdin.dm b/code/datums/shuttles/snowdin.dm new file mode 100644 index 0000000000000..bbee38ed991de --- /dev/null +++ b/code/datums/shuttles/snowdin.dm @@ -0,0 +1,11 @@ +/datum/map_template/shuttle/snowdin + port_id = "snowdin" + who_can_purchase = null + +/datum/map_template/shuttle/snowdin/mining + suffix = "mining" + name = "Snowdin Mining Elevator" + +/datum/map_template/shuttle/snowdin/excavation + suffix = "excavation" + name = "Snowdin Excavation Elevator" diff --git a/code/datums/shuttles/starfury.dm b/code/datums/shuttles/starfury.dm new file mode 100644 index 0000000000000..510033d643691 --- /dev/null +++ b/code/datums/shuttles/starfury.dm @@ -0,0 +1,20 @@ +/datum/map_template/shuttle/starfury + port_id = "starfury" + who_can_purchase = null + +/datum/map_template/shuttle/starfury/fighter_one + suffix = "fighter1" + name = "SBC Starfury Fighter (1)" + +/datum/map_template/shuttle/starfury/fighter_two + suffix = "fighter2" + name = "SBC Starfury Fighter (2)" + +/datum/map_template/shuttle/starfury/fighter_three + suffix = "fighter3" + name = "SBC Starfury Fighter (3)" + +/datum/map_template/shuttle/starfury/corvette + suffix = "corvette" + name = "SBC Starfury Corvette" + diff --git a/code/datums/shuttles/whiteship.dm b/code/datums/shuttles/whiteship.dm new file mode 100644 index 0000000000000..0b48575e057c2 --- /dev/null +++ b/code/datums/shuttles/whiteship.dm @@ -0,0 +1,58 @@ +/datum/map_template/shuttle/whiteship + port_id = "whiteship" + +/datum/map_template/shuttle/whiteship/box + suffix = "box" + name = "Hospital Ship" + description = "Whiteship with medical supplies. Zombies do not currently spawn corpses, and are not infectious." + +/datum/map_template/shuttle/whiteship/meta + suffix = "meta" + name = "Salvage Ship" + description = "Whiteship that focuses on a large cargo bay that players can build in. Spawns with Syndicate mobs who do not drop corpses and are highly aggressive." + +/datum/map_template/shuttle/whiteship/pubby + suffix = "pubby" + name = "NT Science Vessel" + description = "A small science vessel that uses just one area and is full of angry ants." + +/datum/map_template/shuttle/whiteship/cere + suffix = "cere" + name = "NT Heavy Salvage Vessel" + description = "A beefy, well-rounded salvage vessel with a pair of corpses (miner and engineer) and a Captain's hat. Equipped with solar sails and a PACMAN generator." + +/datum/map_template/shuttle/whiteship/birdshot + suffix = "birdshot" + name = "NT Patrol Bee" + description = "A small patrol vessel with a central corridor connecting all rooms. Features 2 small cargo bays and a brig. Spawns with an agressive and deadly Gelatinous Cube" + +/datum/map_template/shuttle/whiteship/kilo + suffix = "kilo" + name = "NT Mining Shuttle" + description = "A mining vessel with a curious shape starting with a few angry netherworld mobs." + +/datum/map_template/shuttle/whiteship/donut + suffix = "donut" + name = "NT Long-Distance Bluespace Jumper" + description = "A ship hit with an engine blowout, leaving it as a depressurised husk. Has infinite power, although likely to bait people into removing that property. Also the most open out of all the whiteships, and starts with a 25% ripley chance." + +/datum/map_template/shuttle/whiteship/tram + suffix = "tram" + name = "NT Long-Distance Bluespace Freighter" + description = "A long shuttle that starts with Nanotrasen private security corpses. DOES NOT FIT IN THE BASE DOCKS! Does fit in Deep Space's dock though." + +/datum/map_template/shuttle/whiteship/delta + suffix = "delta" + name = "NT Frigate" + description = "A standard whiteship with big spiders onboard. PACMAN generator is not wired and next to main grid cabling, so it requires some work." + +/datum/map_template/shuttle/whiteship/personalshuttle + suffix = "personalshuttle" + name = "Personal Travel Shuttle" + description = "A small vessel with a few zombies and an engineer's corpse that can be looted." + +/datum/map_template/shuttle/whiteship/obelisk + suffix = "obelisk" + name = "Obelisk" + description = "A large research vessel affected by the Cult of Nar'Sie. PACMAN generator is not wired and next to main grid cabling, so it requires some work." + admin_notes = "Not actually an obelisk, has nonsentient cult constructs." diff --git a/code/datums/skills/_skill.dm b/code/datums/skills/_skill.dm index c4ba1500e45ab..b8438c67927ca 100644 --- a/code/datums/skills/_skill.dm +++ b/code/datums/skills/_skill.dm @@ -6,8 +6,8 @@ GLOBAL_LIST_INIT(skill_types, subtypesof(/datum/skill)) var/desc = "the art of doing things" ///Dictionary of modifier type - list of modifiers (indexed by level). 7 entries in each list for all 7 skill levels. var/modifiers = list(SKILL_SPEED_MODIFIER = list(1, 1, 1, 1, 1, 1, 1)) //Dictionary of modifier type - list of modifiers (indexed by level). 7 entries in each list for all 7 skill levels. - ///List Path pointing to the skill cape reward that will appear when a user finishes leveling up a skill - var/skill_cape_path + ///List Path pointing to the skill item reward that will appear when a user finishes leveling up a skill + var/skill_item_path ///List associating different messages that appear on level up with different levels var/list/levelUpMessages = list() ///List associating different messages that appear on level up with different levels @@ -27,8 +27,7 @@ GLOBAL_LIST_INIT(skill_types, subtypesof(/datum/skill)) span_nicegreen("I'm getting a little better at [name]!"), span_nicegreen("I'm getting much better at [name]!"), span_nicegreen("I feel like I've become quite proficient at [name]!"), - "After lots of practice, I've begun to truly understand the intricacies \ - and surprising depth behind [name]. I now consider myself a master [title].", + span_nicegreen("After lots of practice, I've begun to truly understand the intricacies and surprising depth behind [name]. I now consider myself a master [title]."), span_nicegreen("Through incredible determination and effort, I've reached the peak of my [name] abiltities. I'm finally able to consider myself a legendary [title]!") ) levelDownMessages = list(span_nicegreen("I have somehow completely lost all understanding of [name]. Please tell an admin if you see this."), span_nicegreen("I'm starting to forget what [name] really even is. I need more practice..."), @@ -46,13 +45,18 @@ GLOBAL_LIST_INIT(skill_types, subtypesof(/datum/skill)) * * mind - The mind that you'll want to send messages * * new_level - The newly gained level. Can check the actual level to give different messages at different levels, see defines in skills.dm * * old_level - Similar to the above, but the level you had before levelling up. + * * silent - Silences the announcement if TRUE */ -/datum/skill/proc/level_gained(datum/mind/mind, new_level, old_level)//just for announcements (doesn't go off if the xp gain is silent) +/datum/skill/proc/level_gained(datum/mind/mind, new_level, old_level, silent) + if(silent) + return to_chat(mind.current, levelUpMessages[new_level]) //new_level will be a value from 1 to 6, so we get appropriate message from the 6-element levelUpMessages list /** * level_lost: See level_gained, same idea but fires on skill level-down */ -/datum/skill/proc/level_lost(datum/mind/mind, new_level, old_level) +/datum/skill/proc/level_lost(datum/mind/mind, new_level, old_level, silent) + if(silent) + return to_chat(mind.current, levelDownMessages[old_level]) //old_level will be a value from 1 to 6, so we get appropriate message from the 6-element levelUpMessages list /** @@ -66,7 +70,7 @@ GLOBAL_LIST_INIT(skill_types, subtypesof(/datum/skill)) /datum/skill/proc/try_skill_reward(datum/mind/mind, new_level) if (new_level != SKILL_LEVEL_LEGENDARY) return - if (!ispath(skill_cape_path)) + if (!ispath(skill_item_path)) to_chat(mind.current, span_nicegreen("My legendary [name] skill is quite impressive, though it seems the Professional [title] Association doesn't have any status symbols to commemorate my abilities with. I should let Centcom know of this travesty, maybe they can do something about it.")) return if (LAZYFIND(mind.skills_rewarded, src.type)) @@ -75,7 +79,7 @@ GLOBAL_LIST_INIT(skill_types, subtypesof(/datum/skill)) podspawn(list( "target" = get_turf(mind.current), "style" = STYLE_BLUESPACE, - "spawn" = skill_cape_path, + "spawn" = skill_item_path, "delays" = list(POD_TRANSIT = 150, POD_FALLING = 4, POD_OPENING = 30, POD_LEAVING = 30) )) to_chat(mind.current, span_nicegreen("My legendary skill has attracted the attention of the Professional [title] Association. It seems they are sending me a status symbol to commemorate my abilities.")) diff --git a/code/datums/skills/cleaning.dm b/code/datums/skills/cleaning.dm index 6b797384d48bd..b3ccad7eb4cbc 100644 --- a/code/datums/skills/cleaning.dm +++ b/code/datums/skills/cleaning.dm @@ -3,4 +3,4 @@ title = "Cleaner" desc = "It’s not who I am underneath, but what I mop up that defines me." modifiers = list(SKILL_SPEED_MODIFIER = list(1, 0.9, 0.8, 0.7, 0.6, 0.5, 0.36)) //speed also touches probability in using up a soap's charge - skill_cape_path = /obj/item/clothing/neck/cloak/skill_reward/cleaning + skill_item_path = /obj/item/clothing/neck/cloak/skill_reward/cleaning diff --git a/code/datums/skills/fishing.dm b/code/datums/skills/fishing.dm new file mode 100644 index 0000000000000..ddf90e1a0a3ac --- /dev/null +++ b/code/datums/skills/fishing.dm @@ -0,0 +1,24 @@ +/** + * skill associated with the fishing feature. It modifies the fishing minigame difficulty + * and is gained each time one is completed. + */ +/datum/skill/fishing + name = "Fishing" + title = "Fisher" + desc = "How empty and alone you are on this barren Earth." + modifiers = list(SKILL_VALUE_MODIFIER = list(1, 1, 0, -1, -2, -4, -6)) + skill_item_path = /obj/item/clothing/head/soft/fishing_hat + +/datum/skill/fishing/New() + . = ..() + levelUpMessages[SKILL_LEVEL_MASTER] = span_nicegreen("After lots of practice, I've begun to truly understand the surprising depth behind [name]. As a master [title], I can take an easier guess of what I'm trying to catch now.") + +/datum/skill/fishing/level_gained(datum/mind/mind, new_level, old_level, silent) + . = ..() + if(new_level >= SKILL_LEVEL_MASTER && old_level < SKILL_LEVEL_MASTER) + ADD_TRAIT(mind, TRAIT_REVEAL_FISH, SKILL_TRAIT) + +/datum/skill/fishing/level_lost(datum/mind/mind, new_level, old_level, silent) + . = ..() + if(old_level >= SKILL_LEVEL_MASTER && new_level < SKILL_LEVEL_MASTER) + REMOVE_TRAIT(mind, TRAIT_REVEAL_FISH, SKILL_TRAIT) diff --git a/code/datums/skills/gaming.dm b/code/datums/skills/gaming.dm index 794ab1fb864bf..75d90f3d8c0d8 100644 --- a/code/datums/skills/gaming.dm +++ b/code/datums/skills/gaming.dm @@ -4,7 +4,7 @@ desc = "My proficiency as a gamer. This helps me beat bosses with ease, powergame in Orion Trail, and makes me wanna slam some gamer fuel." modifiers = list(SKILL_PROBS_MODIFIER = list(0, 5, 10, 15, 15, 20, 25), SKILL_RANDS_MODIFIER = list(0, 1, 2, 3, 4, 5, 7)) - skill_cape_path = /obj/item/clothing/neck/cloak/skill_reward/gaming + skill_item_path = /obj/item/clothing/neck/cloak/skill_reward/gaming /datum/skill/gaming/New() . = ..() diff --git a/code/datums/skills/mining.dm b/code/datums/skills/mining.dm index e1b698a3d8716..db79c2801a4cb 100644 --- a/code/datums/skills/mining.dm +++ b/code/datums/skills/mining.dm @@ -3,4 +3,4 @@ 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 + skill_item_path = /obj/item/clothing/neck/cloak/skill_reward/mining diff --git a/code/datums/spawners_menu.dm b/code/datums/spawners_menu.dm index 849ad8e3ef65b..06b6dbc76a857 100644 --- a/code/datums/spawners_menu.dm +++ b/code/datums/spawners_menu.dm @@ -44,6 +44,16 @@ this["amount_left"] += 1 if(this["amount_left"] > 0) data["spawners"] += list(this) + for(var/mob_type in GLOB.joinable_mobs) + var/list/this = list() + this["name"] = mob_type + this["amount_left"] = 0 + for(var/mob/joinable_mob as anything in GLOB.joinable_mobs[mob_type]) + this["amount_left"] += 1 + if(!this["desc"]) + this["desc"] = initial(joinable_mob.desc) + if(this["amount_left"] > 0) + data["spawners"] += list(this) return data /datum/spawners_menu/ui_act(action, params, datum/tgui/ui) @@ -52,16 +62,25 @@ return var/group_name = params["name"] - if(!group_name || !(group_name in GLOB.mob_spawners)) + if(!group_name) return - var/list/spawnerlist = GLOB.mob_spawners[group_name] - for(var/obj/effect/mob_spawn/ghost_role/current_spawner as anything in spawnerlist) - if(!current_spawner.allow_spawn(usr, silent = TRUE)) - spawnerlist -= current_spawner - if(!spawnerlist.len) + + var/list/spawnerlist = list() + + if (group_name in GLOB.mob_spawners) + spawnerlist = GLOB.mob_spawners[group_name] + if(!length(spawnerlist)) + return + for(var/obj/effect/mob_spawn/ghost_role/current_spawner as anything in spawnerlist) + if(!current_spawner.allow_spawn(usr, silent = TRUE)) + spawnerlist -= current_spawner + else if (group_name in GLOB.joinable_mobs) + spawnerlist = GLOB.joinable_mobs[group_name] + + if(!length(spawnerlist)) return - var/obj/effect/mob_spawn/mob_spawner = pick(spawnerlist) - if(!istype(mob_spawner) || !SSpoints_of_interest.is_valid_poi(mob_spawner)) + var/atom/mob_spawner = pick(spawnerlist) + if(!SSpoints_of_interest.is_valid_poi(mob_spawner)) return switch(action) diff --git a/code/datums/sprite_accessories.dm b/code/datums/sprite_accessories.dm new file mode 100644 index 0000000000000..2a5f3acc92d67 --- /dev/null +++ b/code/datums/sprite_accessories.dm @@ -0,0 +1,2372 @@ +/* + + Hello and welcome to sprite_accessories: For sprite accessories, such as hair, + facial hair, and possibly tattoos and stuff somewhere along the line. This file is + intended to be friendly for people with little to no actual coding experience. + The process of adding in new hairstyles has been made pain-free and easy to do. + Enjoy! - Doohl + + + Notice: This all gets automatically compiled in a list in dna.dm, so you do not + have to define any UI values for sprite accessories manually for hair and facial + hair. Just add in new hair types and the game will naturally adapt. + + !!WARNING!!: changing existing hair information can be VERY hazardous to savefiles, + to the point where you may completely corrupt a server's savefiles. Please refrain + from doing this unless you absolutely know what you are doing, and have defined a + conversion in savefile.dm +*/ +/proc/init_sprite_accessory_subtypes(prototype, list/L, list/male, list/female, add_blank)//Roundstart argument builds a specific list for roundstart parts where some parts may be locked + if(!istype(L)) + L = list() + if(!istype(male)) + male = list() + if(!istype(female)) + female = list() + + for(var/path in subtypesof(prototype)) + var/datum/sprite_accessory/D = new path() + + if(D.icon_state) + L[D.name] = D + else + L += D.name + + switch(D.gender) + if(MALE) + male += D.name + if(FEMALE) + female += D.name + else + male += D.name + female += D.name + if(add_blank) + L[SPRITE_ACCESSORY_NONE] = new /datum/sprite_accessory/blank + + return L + +/datum/sprite_accessory + /// The icon file the accessory is located in. + var/icon + /// The icon_state of the accessory. + var/icon_state + /// The preview name of the accessory. + var/name + /// Determines if the accessory will be skipped or included in random hair generations. + var/gender = NEUTER + /// Something that can be worn by either gender, but looks different on each. + var/gender_specific + /// Determines if the accessory will be skipped by color preferences. + var/use_static + /** + * Currently only used by mutantparts so don't worry about hair and stuff. + * This is the source that this accessory will get its color from. Default is MUTCOLOR, but can also be HAIR, FACEHAIR, EYECOLOR and 0 if none. + */ + var/color_src = MUTANT_COLOR + /// Decides if this sprite has an "inner" part, such as the fleshy parts on ears. + var/hasinner = FALSE + /// Is this part locked from roundstart selection? Used for parts that apply effects. + var/locked = FALSE + /// Should we center the sprite? + var/center = FALSE + /// The width of the sprite in pixels. Used to center it if necessary. + var/dimension_x = 32 + /// The height of the sprite in pixels. Used to center it if necessary. + var/dimension_y = 32 + /// Should this sprite block emissives? + var/em_block = FALSE + +/datum/sprite_accessory/blank + name = "None" + icon_state = "None" + +////////////////////// +// Hair Definitions // +////////////////////// +/datum/sprite_accessory/hair + icon = 'icons/mob/human/human_face.dmi' // default icon for all hairs + + // please make sure they're sorted alphabetically and, where needed, categorized + // try to capitalize the names please~ + // try to spell + // you do not need to define _s or _l sub-states, game automatically does this for you + +/datum/sprite_accessory/hair/afro + name = "Afro" + icon_state = "hair_afro" + +/datum/sprite_accessory/hair/afro2 + name = "Afro 2" + icon_state = "hair_afro2" + +/datum/sprite_accessory/hair/afro_large + name = "Afro (Large)" + icon_state = "hair_bigafro" + +/datum/sprite_accessory/hair/allthefuzz + name = "All The Fuzz" + icon_state = "hair_allthefuzz" + +/datum/sprite_accessory/hair/antenna + name = "Ahoge" + icon_state = "hair_antenna" + +/datum/sprite_accessory/hair/bald + name = "Bald" + icon_state = null + +/datum/sprite_accessory/hair/balding + name = "Balding Hair" + icon_state = "hair_e" + +/datum/sprite_accessory/hair/bedhead + name = "Bedhead" + icon_state = "hair_bedhead" + +/datum/sprite_accessory/hair/bedhead2 + name = "Bedhead 2" + icon_state = "hair_bedheadv2" + +/datum/sprite_accessory/hair/bedhead3 + name = "Bedhead 3" + icon_state = "hair_bedheadv3" + +/datum/sprite_accessory/hair/bedheadv4 + name = "Bedhead 4x" + icon_state = "hair_bedheadv4" + +/datum/sprite_accessory/hair/bedheadlong + name = "Long Bedhead" + icon_state = "hair_long_bedhead" + +/datum/sprite_accessory/hair/bedheadfloorlength + name = "Floorlength Bedhead" + icon_state = "hair_floorlength_bedhead" + +/datum/sprite_accessory/hair/badlycut + name = "Shorter Long Bedhead" + icon_state = "hair_verybadlycut" + +/datum/sprite_accessory/hair/beehive + name = "Beehive" + icon_state = "hair_beehive" + +/datum/sprite_accessory/hair/beehive2 + name = "Beehive 2" + icon_state = "hair_beehivev2" + +/datum/sprite_accessory/hair/bob + name = "Bob Hair" + icon_state = "hair_bob" + +/datum/sprite_accessory/hair/bob2 + name = "Bob Hair 2" + icon_state = "hair_bob2" + +/datum/sprite_accessory/hair/bob3 + name = "Bob Hair 3" + icon_state = "hair_bobcut" + +/datum/sprite_accessory/hair/bob4 + name = "Bob Hair 4" + icon_state = "hair_bob4" + +/datum/sprite_accessory/hair/bobcurl + name = "Bobcurl" + icon_state = "hair_bobcurl" + +/datum/sprite_accessory/hair/boddicker + name = "Boddicker" + icon_state = "hair_boddicker" + +/datum/sprite_accessory/hair/bowlcut + name = "Bowlcut" + icon_state = "hair_bowlcut" + +/datum/sprite_accessory/hair/bowlcut2 + name = "Bowlcut 2" + icon_state = "hair_bowlcut2" + +/datum/sprite_accessory/hair/braid + name = "Braid (Floorlength)" + icon_state = "hair_braid" + +/datum/sprite_accessory/hair/braided + name = "Braided" + icon_state = "hair_braided" + +/datum/sprite_accessory/hair/front_braid + name = "Braided Front" + icon_state = "hair_braidfront" + +/datum/sprite_accessory/hair/not_floorlength_braid + name = "Braid (High)" + icon_state = "hair_braid2" + +/datum/sprite_accessory/hair/lowbraid + name = "Braid (Low)" + icon_state = "hair_hbraid" + +/datum/sprite_accessory/hair/shortbraid + name = "Braid (Short)" + icon_state = "hair_shortbraid" + +/datum/sprite_accessory/hair/braidtail + name = "Braided Tail" + icon_state = "hair_braidtail" + +/datum/sprite_accessory/hair/bun + name = "Bun Head" + icon_state = "hair_bun" + +/datum/sprite_accessory/hair/bun2 + name = "Bun Head 2" + icon_state = "hair_bunhead2" + +/datum/sprite_accessory/hair/bun3 + name = "Bun Head 3" + icon_state = "hair_bun3" + +/datum/sprite_accessory/hair/largebun + name = "Bun (Large)" + icon_state = "hair_largebun" + +/datum/sprite_accessory/hair/manbun + name = "Bun (Manbun)" + icon_state = "hair_manbun" + +/datum/sprite_accessory/hair/tightbun + name = "Bun (Tight)" + icon_state = "hair_tightbun" + +/datum/sprite_accessory/hair/business + name = "Business Hair" + icon_state = "hair_business" + +/datum/sprite_accessory/hair/business2 + name = "Business Hair 2" + icon_state = "hair_business2" + +/datum/sprite_accessory/hair/business3 + name = "Business Hair 3" + icon_state = "hair_business3" + +/datum/sprite_accessory/hair/business4 + name = "Business Hair 4" + icon_state = "hair_business4" + +/datum/sprite_accessory/hair/buzz + name = "Buzzcut" + icon_state = "hair_buzzcut" + +/datum/sprite_accessory/hair/chinbob + name = "Chin-Length Bob Cut" + icon_state = "hair_chinbob" + +/datum/sprite_accessory/hair/comet + name = "Comet" + icon_state = "hair_comet" + +/datum/sprite_accessory/hair/cia + name = "CIA" + icon_state = "hair_cia" + +/datum/sprite_accessory/hair/coffeehouse + name = "Coffee House" + icon_state = "hair_coffeehouse" + +/datum/sprite_accessory/hair/combover + name = "Combover" + icon_state = "hair_combover" + +/datum/sprite_accessory/hair/cornrows1 + name = "Cornrows" + icon_state = "hair_cornrows" + +/datum/sprite_accessory/hair/cornrows2 + name = "Cornrows 2" + icon_state = "hair_cornrows2" + +/datum/sprite_accessory/hair/cornrowbun + name = "Cornrow Bun" + icon_state = "hair_cornrowbun" + +/datum/sprite_accessory/hair/cornrowbraid + name = "Cornrow Braid" + icon_state = "hair_cornrowbraid" + +/datum/sprite_accessory/hair/cornrowdualtail + name = "Cornrow Tail" + icon_state = "hair_cornrowtail" + +/datum/sprite_accessory/hair/crew + name = "Crewcut" + icon_state = "hair_crewcut" + +/datum/sprite_accessory/hair/curls + name = "Curls" + icon_state = "hair_curls" + +/datum/sprite_accessory/hair/cut + name = "Cut Hair" + icon_state = "hair_c" + +/datum/sprite_accessory/hair/dandpompadour + name = "Dandy Pompadour" + icon_state = "hair_dandypompadour" + +/datum/sprite_accessory/hair/devillock + name = "Devil Lock" + icon_state = "hair_devilock" + +/datum/sprite_accessory/hair/doublebun + name = "Double Bun" + icon_state = "hair_doublebun" + +/datum/sprite_accessory/hair/dreadlocks + name = "Dreadlocks" + icon_state = "hair_dreads" + +/datum/sprite_accessory/hair/drillhair + name = "Drillruru" + icon_state = "hair_drillruru" + +/datum/sprite_accessory/hair/drillhairextended + name = "Drill Hair (Extended)" + icon_state = "hair_drillhairextended" + +/datum/sprite_accessory/hair/emo + name = "Emo" + icon_state = "hair_emo" + +/datum/sprite_accessory/hair/emofrine + name = "Emo Fringe" + icon_state = "hair_emofringe" + +/datum/sprite_accessory/hair/nofade + name = "Fade (None)" + icon_state = "hair_nofade" + +/datum/sprite_accessory/hair/highfade + name = "Fade (High)" + icon_state = "hair_highfade" + +/datum/sprite_accessory/hair/medfade + name = "Fade (Medium)" + icon_state = "hair_medfade" + +/datum/sprite_accessory/hair/lowfade + name = "Fade (Low)" + icon_state = "hair_lowfade" + +/datum/sprite_accessory/hair/baldfade + name = "Fade (Bald)" + icon_state = "hair_baldfade" + +/datum/sprite_accessory/hair/feather + name = "Feather" + icon_state = "hair_feather" + +/datum/sprite_accessory/hair/father + name = "Father" + icon_state = "hair_father" + +/datum/sprite_accessory/hair/sargeant + name = "Flat Top" + icon_state = "hair_sargeant" + +/datum/sprite_accessory/hair/flair + name = "Flair" + icon_state = "hair_flair" + +/datum/sprite_accessory/hair/bigflattop + name = "Flat Top (Big)" + icon_state = "hair_bigflattop" + +/datum/sprite_accessory/hair/flow_hair + name = "Flow Hair" + icon_state = "hair_f" + +/datum/sprite_accessory/hair/gelled + name = "Gelled Back" + icon_state = "hair_gelled" + +/datum/sprite_accessory/hair/gentle + name = "Gentle" + icon_state = "hair_gentle" + +/datum/sprite_accessory/hair/halfbang + name = "Half-banged Hair" + icon_state = "hair_halfbang" + +/datum/sprite_accessory/hair/halfbang2 + name = "Half-banged Hair 2" + icon_state = "hair_halfbang2" + +/datum/sprite_accessory/hair/halfshaved + name = "Half-shaved" + icon_state = "hair_halfshaved" + +/datum/sprite_accessory/hair/hedgehog + name = "Hedgehog Hair" + icon_state = "hair_hedgehog" + +/datum/sprite_accessory/hair/himecut + name = "Hime Cut" + icon_state = "hair_himecut" + +/datum/sprite_accessory/hair/himecut2 + name = "Hime Cut 2" + icon_state = "hair_himecut2" + +/datum/sprite_accessory/hair/shorthime + name = "Hime Cut (Short)" + icon_state = "hair_shorthime" + +/datum/sprite_accessory/hair/himeup + name = "Hime Updo" + icon_state = "hair_himeup" + +/datum/sprite_accessory/hair/hitop + name = "Hitop" + icon_state = "hair_hitop" + +/datum/sprite_accessory/hair/jade + name = "Jade" + icon_state = "hair_jade" + +/datum/sprite_accessory/hair/jensen + name = "Jensen Hair" + icon_state = "hair_jensen" + +/datum/sprite_accessory/hair/joestar + name = "Joestar" + icon_state = "hair_joestar" + +/datum/sprite_accessory/hair/keanu + name = "Keanu Hair" + icon_state = "hair_keanu" + +/datum/sprite_accessory/hair/kusangi + name = "Kusanagi Hair" + icon_state = "hair_kusanagi" + +/datum/sprite_accessory/hair/long + name = "Long Hair 1" + icon_state = "hair_long" + +/datum/sprite_accessory/hair/long2 + name = "Long Hair 2" + icon_state = "hair_long2" + +/datum/sprite_accessory/hair/long3 + name = "Long Hair 3" + icon_state = "hair_long3" + +/datum/sprite_accessory/hair/long_over_eye + name = "Long Over Eye" + icon_state = "hair_longovereye" + +/datum/sprite_accessory/hair/longbangs + name = "Long Bangs" + icon_state = "hair_lbangs" + +/datum/sprite_accessory/hair/longemo + name = "Long Emo" + icon_state = "hair_longemo" + +/datum/sprite_accessory/hair/longfringe + name = "Long Fringe" + icon_state = "hair_longfringe" + +/datum/sprite_accessory/hair/sidepartlongalt + name = "Long Side Part" + icon_state = "hair_longsidepart" + +/datum/sprite_accessory/hair/megaeyebrows + name = "Mega Eyebrows" + icon_state = "hair_megaeyebrows" + +/datum/sprite_accessory/hair/messy + name = "Messy" + icon_state = "hair_messy" + +/datum/sprite_accessory/hair/modern + name = "Modern" + icon_state = "hair_modern" + +/datum/sprite_accessory/hair/mohawk + name = "Mohawk" + icon_state = "hair_d" + +/datum/sprite_accessory/hair/nitori + name = "Nitori" + icon_state = "hair_nitori" + +/datum/sprite_accessory/hair/reversemohawk + name = "Mohawk (Reverse)" + icon_state = "hair_reversemohawk" + +/datum/sprite_accessory/hair/shavedmohawk + name = "Mohawk (Shaved)" + icon_state = "hair_shavedmohawk" + +/datum/sprite_accessory/hair/unshavenmohawk + name = "Mohawk (Unshaven)" + icon_state = "hair_unshaven_mohawk" + +/datum/sprite_accessory/hair/mulder + name = "Mulder" + icon_state = "hair_mulder" + +/datum/sprite_accessory/hair/odango + name = "Odango" + icon_state = "hair_odango" + +/datum/sprite_accessory/hair/ombre + name = "Ombre" + icon_state = "hair_ombre" + +/datum/sprite_accessory/hair/oneshoulder + name = "One Shoulder" + icon_state = "hair_oneshoulder" + +/datum/sprite_accessory/hair/over_eye + name = "Over Eye" + icon_state = "hair_shortovereye" + +/datum/sprite_accessory/hair/hair_overeyetwo + name = "Over Eye 2" + icon_state = "hair_overeyetwo" + +/datum/sprite_accessory/hair/oxton + name = "Oxton" + icon_state = "hair_oxton" + +/datum/sprite_accessory/hair/parted + name = "Parted" + icon_state = "hair_parted" + +/datum/sprite_accessory/hair/partedside + name = "Parted (Side)" + icon_state = "hair_part" + +/datum/sprite_accessory/hair/kagami + name = "Pigtails" + icon_state = "hair_kagami" + +/datum/sprite_accessory/hair/pigtail + name = "Pigtails 2" + icon_state = "hair_pigtails" + +/datum/sprite_accessory/hair/pigtail2 + name = "Pigtails 3" + icon_state = "hair_pigtails2" + +/datum/sprite_accessory/hair/pixie + name = "Pixie Cut" + icon_state = "hair_pixie" + +/datum/sprite_accessory/hair/pompadour + name = "Pompadour" + icon_state = "hair_pompadour" + +/datum/sprite_accessory/hair/bigpompadour + name = "Pompadour (Big)" + icon_state = "hair_bigpompadour" + +/datum/sprite_accessory/hair/ponytail1 + name = "Ponytail" + icon_state = "hair_ponytail" + +/datum/sprite_accessory/hair/ponytail2 + name = "Ponytail 2" + icon_state = "hair_ponytail2" + +/datum/sprite_accessory/hair/ponytail3 + name = "Ponytail 3" + icon_state = "hair_ponytail3" + +/datum/sprite_accessory/hair/ponytail4 + name = "Ponytail 4" + icon_state = "hair_ponytail4" + +/datum/sprite_accessory/hair/ponytail5 + name = "Ponytail 5" + icon_state = "hair_ponytail5" + +/datum/sprite_accessory/hair/ponytail6 + name = "Ponytail 6" + icon_state = "hair_ponytail6" + +/datum/sprite_accessory/hair/ponytail7 + name = "Ponytail 7" + icon_state = "hair_ponytail7" + +/datum/sprite_accessory/hair/highponytail + name = "Ponytail (High)" + icon_state = "hair_highponytail" + +/datum/sprite_accessory/hair/stail + name = "Ponytail (Short)" + icon_state = "hair_stail" + +/datum/sprite_accessory/hair/longponytail + name = "Ponytail (Long)" + icon_state = "hair_longstraightponytail" + +/datum/sprite_accessory/hair/countryponytail + name = "Ponytail (Country)" + icon_state = "hair_country" + +/datum/sprite_accessory/hair/fringetail + name = "Ponytail (Fringe)" + icon_state = "hair_fringetail" + +/datum/sprite_accessory/hair/sidetail + name = "Ponytail (Side)" + icon_state = "hair_sidetail" + +/datum/sprite_accessory/hair/sidetail2 + name = "Ponytail (Side) 2" + icon_state = "hair_sidetail2" + +/datum/sprite_accessory/hair/sidetail3 + name = "Ponytail (Side) 3" + icon_state = "hair_sidetail3" + +/datum/sprite_accessory/hair/sidetail4 + name = "Ponytail (Side) 4" + icon_state = "hair_sidetail4" + +/datum/sprite_accessory/hair/spikyponytail + name = "Ponytail (Spiky)" + icon_state = "hair_spikyponytail" + +/datum/sprite_accessory/hair/poofy + name = "Poofy" + icon_state = "hair_poofy" + +/datum/sprite_accessory/hair/quiff + name = "Quiff" + icon_state = "hair_quiff" + +/datum/sprite_accessory/hair/ronin + name = "Ronin" + icon_state = "hair_ronin" + +/datum/sprite_accessory/hair/shaved + name = "Shaved" + icon_state = "hair_shaved" + +/datum/sprite_accessory/hair/shavedpart + name = "Shaved Part" + icon_state = "hair_shavedpart" + +/datum/sprite_accessory/hair/shortbangs + name = "Short Bangs" + icon_state = "hair_shortbangs" + +/datum/sprite_accessory/hair/short + name = "Short Hair" + icon_state = "hair_a" + +/datum/sprite_accessory/hair/shorthair2 + name = "Short Hair 2" + icon_state = "hair_shorthair2" + +/datum/sprite_accessory/hair/shorthair3 + name = "Short Hair 3" + icon_state = "hair_shorthair3" + +/datum/sprite_accessory/hair/shorthair4 + name = "Short Hair 4" + icon_state = "hair_d" + +/datum/sprite_accessory/hair/shorthair5 + name = "Short Hair 5" + icon_state = "hair_e" + +/datum/sprite_accessory/hair/shorthair6 + name = "Short Hair 6" + icon_state = "hair_f" + +/datum/sprite_accessory/hair/shorthair7 + name = "Short Hair 7" + icon_state = "hair_shorthairg" + +/datum/sprite_accessory/hair/shorthaireighties + name = "Short Hair 80s" + icon_state = "hair_80s" + +/datum/sprite_accessory/hair/rosa + name = "Short Hair Rosa" + icon_state = "hair_rosa" + +/datum/sprite_accessory/hair/shoulderlength + name = "Shoulder-length Hair" + icon_state = "hair_b" + +/datum/sprite_accessory/hair/sidecut + name = "Sidecut" + icon_state = "hair_sidecut" + +/datum/sprite_accessory/hair/skinhead + name = "Skinhead" + icon_state = "hair_skinhead" + +/datum/sprite_accessory/hair/protagonist + name = "Slightly Long Hair" + icon_state = "hair_protagonist" + +/datum/sprite_accessory/hair/spiky + name = "Spiky" + icon_state = "hair_spikey" + +/datum/sprite_accessory/hair/spiky2 + name = "Spiky 2" + icon_state = "hair_spiky" + +/datum/sprite_accessory/hair/spiky3 + name = "Spiky 3" + icon_state = "hair_spiky2" + +/datum/sprite_accessory/hair/swept + name = "Swept Back Hair" + icon_state = "hair_swept" + +/datum/sprite_accessory/hair/swept2 + name = "Swept Back Hair 2" + icon_state = "hair_swept2" + +/datum/sprite_accessory/hair/thinning + name = "Thinning" + icon_state = "hair_thinning" + +/datum/sprite_accessory/hair/thinningfront + name = "Thinning (Front)" + icon_state = "hair_thinningfront" + +/datum/sprite_accessory/hair/thinningrear + name = "Thinning (Rear)" + icon_state = "hair_thinningrear" + +/datum/sprite_accessory/hair/topknot + name = "Topknot" + icon_state = "hair_topknot" + +/datum/sprite_accessory/hair/tressshoulder + name = "Tress Shoulder" + icon_state = "hair_tressshoulder" + +/datum/sprite_accessory/hair/trimmed + name = "Trimmed" + icon_state = "hair_trimmed" + +/datum/sprite_accessory/hair/trimflat + name = "Trim Flat" + icon_state = "hair_trimflat" + +/datum/sprite_accessory/hair/twintails + name = "Twintails" + icon_state = "hair_twintail" + +/datum/sprite_accessory/hair/undercut + name = "Undercut" + icon_state = "hair_undercut" + +/datum/sprite_accessory/hair/undercutleft + name = "Undercut Left" + icon_state = "hair_undercutleft" + +/datum/sprite_accessory/hair/undercutright + name = "Undercut Right" + icon_state = "hair_undercutright" + +/datum/sprite_accessory/hair/unkept + name = "Unkept" + icon_state = "hair_unkept" + +/datum/sprite_accessory/hair/updo + name = "Updo" + icon_state = "hair_updo" + +/datum/sprite_accessory/hair/longer + name = "Very Long Hair" + icon_state = "hair_vlong" + +/datum/sprite_accessory/hair/longest + name = "Very Long Hair 2" + icon_state = "hair_longest" + +/datum/sprite_accessory/hair/longest2 + name = "Very Long Over Eye" + icon_state = "hair_longest2" + +/datum/sprite_accessory/hair/veryshortovereye + name = "Very Short Over Eye" + icon_state = "hair_veryshortovereyealternate" + +/datum/sprite_accessory/hair/longestalt + name = "Very Long with Fringe" + icon_state = "hair_vlongfringe" + +/datum/sprite_accessory/hair/volaju + name = "Volaju" + icon_state = "hair_volaju" + +/datum/sprite_accessory/hair/wisp + name = "Wisp" + icon_state = "hair_wisp" + +/datum/sprite_accessory/hair/ziegler + name = "Ziegler" + icon_state = "hair_ziegler" + +/* +///////////////////////////////////// +/ =---------------------------= / +/ == Gradient Hair Definitions == / +/ =---------------------------= / +///////////////////////////////////// +*/ + +/datum/sprite_accessory/gradient + icon = 'icons/mob/human/species/hair_gradients.dmi' + ///whether this gradient applies to hair and/or beards. Some gradients do not work well on beards. + var/gradient_category = GRADIENT_APPLIES_TO_HAIR|GRADIENT_APPLIES_TO_FACIAL_HAIR + +/datum/sprite_accessory/gradient/none + name = "None" + icon_state = "none" + +/datum/sprite_accessory/gradient/full + name = "Full" + icon_state = "full" + +/datum/sprite_accessory/gradient/fadeup + name = "Fade Up" + icon_state = "fadeup" + +/datum/sprite_accessory/gradient/fadedown + name = "Fade Down" + icon_state = "fadedown" + +/datum/sprite_accessory/gradient/vertical_split + name = "Vertical Split" + icon_state = "vsplit" + +/datum/sprite_accessory/gradient/horizontal_split + name = "Horizontal Split" + icon_state = "bottomflat" + +/datum/sprite_accessory/gradient/reflected + name = "Reflected" + icon_state = "reflected_high" + gradient_category = GRADIENT_APPLIES_TO_HAIR + +/datum/sprite_accessory/gradient/reflected/beard + icon_state = "reflected_high_beard" + gradient_category = GRADIENT_APPLIES_TO_FACIAL_HAIR + +/datum/sprite_accessory/gradient/reflected_inverse + name = "Reflected Inverse" + icon_state = "reflected_inverse_high" + gradient_category = GRADIENT_APPLIES_TO_HAIR + +/datum/sprite_accessory/gradient/reflected_inverse/beard + icon_state = "reflected_inverse_high_beard" + gradient_category = GRADIENT_APPLIES_TO_FACIAL_HAIR + +/datum/sprite_accessory/gradient/wavy + name = "Wavy" + icon_state = "wavy" + gradient_category = GRADIENT_APPLIES_TO_HAIR + +/datum/sprite_accessory/gradient/long_fade_up + name = "Long Fade Up" + icon_state = "long_fade_up" + +/datum/sprite_accessory/gradient/long_fade_down + name = "Long Fade Down" + icon_state = "long_fade_down" + +/datum/sprite_accessory/gradient/short_fade_up + name = "Short Fade Up" + icon_state = "short_fade_up" + gradient_category = GRADIENT_APPLIES_TO_HAIR + +/datum/sprite_accessory/gradient/short_fade_up/beard + icon_state = "short_fade_down" + gradient_category = GRADIENT_APPLIES_TO_FACIAL_HAIR + +/datum/sprite_accessory/gradient/short_fade_down + name = "Short Fade Down" + icon_state = "short_fade_down_beard" + gradient_category = GRADIENT_APPLIES_TO_HAIR + +/datum/sprite_accessory/gradient/short_fade_down/beard + icon_state = "short_fade_down_beard" + gradient_category = GRADIENT_APPLIES_TO_FACIAL_HAIR + +/datum/sprite_accessory/gradient/wavy_spike + name = "Spiked Wavy" + icon_state = "wavy_spiked" + gradient_category = GRADIENT_APPLIES_TO_HAIR + +/datum/sprite_accessory/gradient/striped + name = "striped" + icon_state = "striped" + +/datum/sprite_accessory/gradient/striped_vertical + name = "Striped Vertical" + icon_state = "striped_vertical" + +///////////////////////////// +// Facial Hair Definitions // +///////////////////////////// + +/datum/sprite_accessory/facial_hair + icon = 'icons/mob/human/human_face.dmi' + gender = MALE // barf (unless you're a dorf, dorfs dig chix w/ beards :P) + em_block = TRUE + +// please make sure they're sorted alphabetically and categorized + +/datum/sprite_accessory/facial_hair/abe + name = "Beard (Abraham Lincoln)" + icon_state = "facial_abe" + +/datum/sprite_accessory/facial_hair/brokenman + name = "Beard (Broken Man)" + icon_state = "facial_brokenman" + +/datum/sprite_accessory/facial_hair/chinstrap + name = "Beard (Chinstrap)" + icon_state = "facial_chin" + +/datum/sprite_accessory/facial_hair/dwarf + name = "Beard (Dwarf)" + icon_state = "facial_dwarf" + +/datum/sprite_accessory/facial_hair/fullbeard + name = "Beard (Full)" + icon_state = "facial_fullbeard" + +/datum/sprite_accessory/facial_hair/croppedfullbeard + name = "Beard (Cropped Fullbeard)" + icon_state = "facial_croppedfullbeard" + +/datum/sprite_accessory/facial_hair/gt + name = "Beard (Goatee)" + icon_state = "facial_gt" + +/datum/sprite_accessory/facial_hair/hip + name = "Beard (Hipster)" + icon_state = "facial_hip" + +/datum/sprite_accessory/facial_hair/jensen + name = "Beard (Jensen)" + icon_state = "facial_jensen" + +/datum/sprite_accessory/facial_hair/neckbeard + name = "Beard (Neckbeard)" + icon_state = "facial_neckbeard" + +/datum/sprite_accessory/facial_hair/vlongbeard + name = "Beard (Very Long)" + icon_state = "facial_wise" + +/datum/sprite_accessory/facial_hair/muttonmus + name = "Beard (Muttonmus)" + icon_state = "facial_muttonmus" + +/datum/sprite_accessory/facial_hair/martialartist + name = "Beard (Martial Artist)" + icon_state = "facial_martialartist" + +/datum/sprite_accessory/facial_hair/chinlessbeard + name = "Beard (Chinless Beard)" + icon_state = "facial_chinlessbeard" + +/datum/sprite_accessory/facial_hair/moonshiner + name = "Beard (Moonshiner)" + icon_state = "facial_moonshiner" + +/datum/sprite_accessory/facial_hair/longbeard + name = "Beard (Long)" + icon_state = "facial_longbeard" + +/datum/sprite_accessory/facial_hair/volaju + name = "Beard (Volaju)" + icon_state = "facial_volaju" + +/datum/sprite_accessory/facial_hair/threeoclock + name = "Beard (Three o Clock Shadow)" + icon_state = "facial_3oclock" + +/datum/sprite_accessory/facial_hair/fiveoclock + name = "Beard (Five o Clock Shadow)" + icon_state = "facial_fiveoclock" + +/datum/sprite_accessory/facial_hair/fiveoclockm + name = "Beard (Five o Clock Moustache)" + icon_state = "facial_5oclockmoustache" + +/datum/sprite_accessory/facial_hair/sevenoclock + name = "Beard (Seven o Clock Shadow)" + icon_state = "facial_7oclock" + +/datum/sprite_accessory/facial_hair/sevenoclockm + name = "Beard (Seven o Clock Moustache)" + icon_state = "facial_7oclockmoustache" + +/datum/sprite_accessory/facial_hair/moustache + name = "Moustache" + icon_state = "facial_moustache" + +/datum/sprite_accessory/facial_hair/pencilstache + name = "Moustache (Pencilstache)" + icon_state = "facial_pencilstache" + +/datum/sprite_accessory/facial_hair/smallstache + name = "Moustache (Smallstache)" + icon_state = "facial_smallstache" + +/datum/sprite_accessory/facial_hair/walrus + name = "Moustache (Walrus)" + icon_state = "facial_walrus" + +/datum/sprite_accessory/facial_hair/fu + name = "Moustache (Fu Manchu)" + icon_state = "facial_fumanchu" + +/datum/sprite_accessory/facial_hair/hogan + name = "Moustache (Hulk Hogan)" + icon_state = "facial_hogan" //-Neek + +/datum/sprite_accessory/facial_hair/selleck + name = "Moustache (Selleck)" + icon_state = "facial_selleck" + +/datum/sprite_accessory/facial_hair/chaplin + name = "Moustache (Square)" + icon_state = "facial_chaplin" + +/datum/sprite_accessory/facial_hair/vandyke + name = "Moustache (Van Dyke)" + icon_state = "facial_vandyke" + +/datum/sprite_accessory/facial_hair/watson + name = "Moustache (Watson)" + icon_state = "facial_watson" + +/datum/sprite_accessory/facial_hair/handlebar + name = "Moustache (Handlebar)" + icon_state = "facial_handlebar" + +/datum/sprite_accessory/facial_hair/handlebar2 + name = "Moustache (Handlebar 2)" + icon_state = "facial_handlebar2" + +/datum/sprite_accessory/facial_hair/elvis + name = "Sideburns (Elvis)" + icon_state = "facial_elvis" + +/datum/sprite_accessory/facial_hair/mutton + name = "Sideburns (Mutton Chops)" + icon_state = "facial_mutton" + +/datum/sprite_accessory/facial_hair/sideburn + name = "Sideburns" + icon_state = "facial_sideburn" + +/datum/sprite_accessory/facial_hair/shaved + name = "Shaved" + icon_state = null + gender = NEUTER + +/////////////////////////// +// Underwear Definitions // +/////////////////////////// + +/datum/sprite_accessory/underwear + icon = 'icons/mob/clothing/underwear.dmi' + use_static = FALSE + em_block = TRUE + + +//MALE UNDERWEAR +/datum/sprite_accessory/underwear/nude + name = "Nude" + icon_state = null + gender = NEUTER + +/datum/sprite_accessory/underwear/male_briefs + name = "Briefs" + icon_state = "male_briefs" + gender = MALE + +/datum/sprite_accessory/underwear/male_boxers + name = "Boxers" + icon_state = "male_boxers" + gender = MALE + +/datum/sprite_accessory/underwear/male_stripe + name = "Striped Boxers" + icon_state = "male_stripe" + gender = MALE + +/datum/sprite_accessory/underwear/male_midway + name = "Midway Boxers" + icon_state = "male_midway" + gender = MALE + +/datum/sprite_accessory/underwear/male_longjohns + name = "Long Johns" + icon_state = "male_longjohns" + gender = MALE + +/datum/sprite_accessory/underwear/male_kinky + name = "Jockstrap" + icon_state = "male_kinky" + gender = MALE + +/datum/sprite_accessory/underwear/male_mankini + name = "Mankini" + icon_state = "male_mankini" + gender = MALE + +/datum/sprite_accessory/underwear/male_hearts + name = "Hearts Boxers" + icon_state = "male_hearts" + gender = MALE + use_static = TRUE + +/datum/sprite_accessory/underwear/male_commie + name = "Commie Boxers" + icon_state = "male_commie" + gender = MALE + use_static = TRUE + +/datum/sprite_accessory/underwear/male_usastripe + name = "Freedom Boxers" + icon_state = "male_assblastusa" + gender = MALE + use_static = TRUE + +/datum/sprite_accessory/underwear/male_uk + name = "UK Boxers" + icon_state = "male_uk" + gender = MALE + use_static = TRUE + + +//FEMALE UNDERWEAR +/datum/sprite_accessory/underwear/female_bikini + name = "Bikini" + icon_state = "female_bikini" + gender = FEMALE + +/datum/sprite_accessory/underwear/female_lace + name = "Lace Bikini" + icon_state = "female_lace" + gender = FEMALE + +/datum/sprite_accessory/underwear/female_bralette + name = "Bralette w/ Boyshorts" + icon_state = "female_bralette" + gender = FEMALE + +/datum/sprite_accessory/underwear/female_sport + name = "Sports Bra w/ Boyshorts" + icon_state = "female_sport" + gender = FEMALE + +/datum/sprite_accessory/underwear/female_thong + name = "Thong" + icon_state = "female_thong" + gender = FEMALE + +/datum/sprite_accessory/underwear/female_strapless + name = "Strapless Bikini" + icon_state = "female_strapless" + gender = FEMALE + +/datum/sprite_accessory/underwear/female_babydoll + name = "Babydoll" + icon_state = "female_babydoll" + gender = FEMALE + +/datum/sprite_accessory/underwear/swimsuit_onepiece + name = "One-Piece Swimsuit" + icon_state = "swim_onepiece" + gender = FEMALE + +/datum/sprite_accessory/underwear/swimsuit_strapless_onepiece + name = "Strapless One-Piece Swimsuit" + icon_state = "swim_strapless_onepiece" + gender = FEMALE + +/datum/sprite_accessory/underwear/swimsuit_twopiece + name = "Two-Piece Swimsuit" + icon_state = "swim_twopiece" + gender = FEMALE + +/datum/sprite_accessory/underwear/swimsuit_strapless_twopiece + name = "Strapless Two-Piece Swimsuit" + icon_state = "swim_strapless_twopiece" + gender = FEMALE + +/datum/sprite_accessory/underwear/swimsuit_stripe + name = "Strapless Striped Swimsuit" + icon_state = "swim_stripe" + gender = FEMALE + +/datum/sprite_accessory/underwear/swimsuit_halter + name = "Halter Swimsuit" + icon_state = "swim_halter" + gender = FEMALE + +/datum/sprite_accessory/underwear/female_white_neko + name = "Neko Bikini (White)" + icon_state = "female_neko_white" + gender = FEMALE + use_static = TRUE + +/datum/sprite_accessory/underwear/female_black_neko + name = "Neko Bikini (Black)" + icon_state = "female_neko_black" + gender = FEMALE + use_static = TRUE + +/datum/sprite_accessory/underwear/female_commie + name = "Commie Bikini" + icon_state = "female_commie" + gender = FEMALE + use_static = TRUE + +/datum/sprite_accessory/underwear/female_usastripe + name = "Freedom Bikini" + icon_state = "female_assblastusa" + gender = FEMALE + use_static = TRUE + +/datum/sprite_accessory/underwear/female_uk + name = "UK Bikini" + icon_state = "female_uk" + gender = FEMALE + use_static = TRUE + +/datum/sprite_accessory/underwear/female_kinky + name = "Lingerie" + icon_state = "female_kinky" + gender = FEMALE + use_static = TRUE + +//////////////////////////// +// Undershirt Definitions // +//////////////////////////// + +/datum/sprite_accessory/undershirt + icon = 'icons/mob/clothing/underwear.dmi' + em_block = TRUE + +/datum/sprite_accessory/undershirt/nude + name = "Nude" + icon_state = null + gender = NEUTER + +// please make sure they're sorted alphabetically and categorized + +/datum/sprite_accessory/undershirt/bluejersey + name = "Jersey (Blue)" + icon_state = "shirt_bluejersey" + gender = NEUTER + +/datum/sprite_accessory/undershirt/redjersey + name = "Jersey (Red)" + icon_state = "shirt_redjersey" + gender = NEUTER + +/datum/sprite_accessory/undershirt/bluepolo + name = "Polo Shirt (Blue)" + icon_state = "bluepolo" + gender = NEUTER + +/datum/sprite_accessory/undershirt/grayyellowpolo + name = "Polo Shirt (Gray-Yellow)" + icon_state = "grayyellowpolo" + gender = NEUTER + +/datum/sprite_accessory/undershirt/redpolo + name = "Polo Shirt (Red)" + icon_state = "redpolo" + gender = NEUTER + +/datum/sprite_accessory/undershirt/whitepolo + name = "Polo Shirt (White)" + icon_state = "whitepolo" + gender = NEUTER + +/datum/sprite_accessory/undershirt/alienshirt + name = "Shirt (Alien)" + icon_state = "shirt_alien" + gender = NEUTER + +/datum/sprite_accessory/undershirt/mondmondjaja + name = "Shirt (Band)" + icon_state = "band" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_black + name = "Shirt (Black)" + icon_state = "shirt_black" + gender = NEUTER + +/datum/sprite_accessory/undershirt/blueshirt + name = "Shirt (Blue)" + icon_state = "shirt_blue" + gender = NEUTER + +/datum/sprite_accessory/undershirt/clownshirt + name = "Shirt (Clown)" + icon_state = "shirt_clown" + gender = NEUTER + +/datum/sprite_accessory/undershirt/commie + name = "Shirt (Commie)" + icon_state = "shirt_commie" + gender = NEUTER + +/datum/sprite_accessory/undershirt/greenshirt + name = "Shirt (Green)" + icon_state = "shirt_green" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_grey + name = "Shirt (Grey)" + icon_state = "shirt_grey" + gender = NEUTER + +/datum/sprite_accessory/undershirt/ian + name = "Shirt (Ian)" + icon_state = "ian" + gender = NEUTER + +/datum/sprite_accessory/undershirt/ilovent + name = "Shirt (I Love NT)" + icon_state = "ilovent" + gender = NEUTER + +/datum/sprite_accessory/undershirt/lover + name = "Shirt (Lover)" + icon_state = "lover" + gender = NEUTER + +/datum/sprite_accessory/undershirt/matroska + name = "Shirt (Matroska)" + icon_state = "matroska" + gender = NEUTER + +/datum/sprite_accessory/undershirt/meat + name = "Shirt (Meat)" + icon_state = "shirt_meat" + gender = NEUTER + +/datum/sprite_accessory/undershirt/nano + name = "Shirt (Nanotrasen)" + icon_state = "shirt_nano" + gender = NEUTER + +/datum/sprite_accessory/undershirt/peace + name = "Shirt (Peace)" + icon_state = "peace" + gender = NEUTER + +/datum/sprite_accessory/undershirt/pacman + name = "Shirt (Pogoman)" + icon_state = "pogoman" + gender = NEUTER + +/datum/sprite_accessory/undershirt/question + name = "Shirt (Question)" + icon_state = "shirt_question" + gender = NEUTER + +/datum/sprite_accessory/undershirt/redshirt + name = "Shirt (Red)" + icon_state = "shirt_red" + gender = NEUTER + +/datum/sprite_accessory/undershirt/skull + name = "Shirt (Skull)" + icon_state = "shirt_skull" + gender = NEUTER + +/datum/sprite_accessory/undershirt/ss13 + name = "Shirt (SS13)" + icon_state = "shirt_ss13" + gender = NEUTER + +/datum/sprite_accessory/undershirt/stripe + name = "Shirt (Striped)" + icon_state = "shirt_stripes" + gender = NEUTER + +/datum/sprite_accessory/undershirt/tiedye + name = "Shirt (Tie-dye)" + icon_state = "shirt_tiedye" + gender = NEUTER + +/datum/sprite_accessory/undershirt/uk + name = "Shirt (UK)" + icon_state = "uk" + gender = NEUTER + +/datum/sprite_accessory/undershirt/usa + name = "Shirt (USA)" + icon_state = "shirt_assblastusa" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_white + name = "Shirt (White)" + icon_state = "shirt_white" + gender = NEUTER + +/datum/sprite_accessory/undershirt/blackshortsleeve + name = "Short-sleeved Shirt (Black)" + icon_state = "blackshortsleeve" + gender = NEUTER + +/datum/sprite_accessory/undershirt/blueshortsleeve + name = "Short-sleeved Shirt (Blue)" + icon_state = "blueshortsleeve" + gender = NEUTER + +/datum/sprite_accessory/undershirt/greenshortsleeve + name = "Short-sleeved Shirt (Green)" + icon_state = "greenshortsleeve" + gender = NEUTER + +/datum/sprite_accessory/undershirt/purpleshortsleeve + name = "Short-sleeved Shirt (Purple)" + icon_state = "purpleshortsleeve" + gender = NEUTER + +/datum/sprite_accessory/undershirt/whiteshortsleeve + name = "Short-sleeved Shirt (White)" + icon_state = "whiteshortsleeve" + gender = NEUTER + +/datum/sprite_accessory/undershirt/sports_bra + name = "Sports Bra" + icon_state = "sports_bra" + gender = NEUTER + +/datum/sprite_accessory/undershirt/sports_bra2 + name = "Sports Bra (Alt)" + icon_state = "sports_bra_alt" + gender = NEUTER + +/datum/sprite_accessory/undershirt/blueshirtsport + name = "Sports Shirt (Blue)" + icon_state = "blueshirtsport" + gender = NEUTER + +/datum/sprite_accessory/undershirt/greenshirtsport + name = "Sports Shirt (Green)" + icon_state = "greenshirtsport" + gender = NEUTER + +/datum/sprite_accessory/undershirt/redshirtsport + name = "Sports Shirt (Red)" + icon_state = "redshirtsport" + gender = NEUTER + +/datum/sprite_accessory/undershirt/tank_black + name = "Tank Top (Black)" + icon_state = "tank_black" + gender = NEUTER + +/datum/sprite_accessory/undershirt/tankfire + name = "Tank Top (Fire)" + icon_state = "tank_fire" + gender = NEUTER + +/datum/sprite_accessory/undershirt/tank_grey + name = "Tank Top (Grey)" + icon_state = "tank_grey" + gender = NEUTER + +/datum/sprite_accessory/undershirt/female_midriff + name = "Tank Top (Midriff)" + icon_state = "tank_midriff" + gender = FEMALE + +/datum/sprite_accessory/undershirt/tank_red + name = "Tank Top (Red)" + icon_state = "tank_red" + gender = NEUTER + +/datum/sprite_accessory/undershirt/tankstripe + name = "Tank Top (Striped)" + icon_state = "tank_stripes" + gender = NEUTER + +/datum/sprite_accessory/undershirt/tank_white + name = "Tank Top (White)" + icon_state = "tank_white" + gender = NEUTER + +/datum/sprite_accessory/undershirt/redtop + name = "Top (Red)" + icon_state = "redtop" + gender = FEMALE + +/datum/sprite_accessory/undershirt/whitetop + name = "Top (White)" + icon_state = "whitetop" + gender = FEMALE + +/datum/sprite_accessory/undershirt/tshirt_blue + name = "T-Shirt (Blue)" + icon_state = "blueshirt" + gender = NEUTER + +/datum/sprite_accessory/undershirt/tshirt_green + name = "T-Shirt (Green)" + icon_state = "greenshirt" + gender = NEUTER + +/datum/sprite_accessory/undershirt/tshirt_red + name = "T-Shirt (Red)" + icon_state = "redshirt" + gender = NEUTER + +/datum/sprite_accessory/undershirt/yellowshirt + name = "T-Shirt (Yellow)" + icon_state = "yellowshirt" + gender = NEUTER + +/////////////////////// +// Socks Definitions // +/////////////////////// + +/datum/sprite_accessory/socks + icon = 'icons/mob/clothing/underwear.dmi' + em_block = TRUE + +/datum/sprite_accessory/socks/nude + name = "Nude" + icon_state = null + +// please make sure they're sorted alphabetically and categorized + +/datum/sprite_accessory/socks/ace_knee + name = "Knee-high (Ace)" + icon_state = "ace_knee" + +/datum/sprite_accessory/socks/bee_knee + name = "Knee-high (Bee)" + icon_state = "bee_knee" + +/datum/sprite_accessory/socks/black_knee + name = "Knee-high (Black)" + icon_state = "black_knee" + +/datum/sprite_accessory/socks/commie_knee + name = "Knee-High (Commie)" + icon_state = "commie_knee" + +/datum/sprite_accessory/socks/usa_knee + name = "Knee-High (Freedom)" + icon_state = "assblastusa_knee" + +/datum/sprite_accessory/socks/rainbow_knee + name = "Knee-high (Rainbow)" + icon_state = "rainbow_knee" + +/datum/sprite_accessory/socks/striped_knee + name = "Knee-high (Striped)" + icon_state = "striped_knee" + +/datum/sprite_accessory/socks/thin_knee + name = "Knee-high (Thin)" + icon_state = "thin_knee" + +/datum/sprite_accessory/socks/trans_knee + name = "Knee-high (Trans)" + icon_state = "trans_knee" + +/datum/sprite_accessory/socks/uk_knee + name = "Knee-High (UK)" + icon_state = "uk_knee" + +/datum/sprite_accessory/socks/white_knee + name = "Knee-high (White)" + icon_state = "white_knee" + +/datum/sprite_accessory/socks/fishnet_knee + name = "Knee-high (Fishnet)" + icon_state = "fishnet_knee" + +/datum/sprite_accessory/socks/black_norm + name = "Normal (Black)" + icon_state = "black_norm" + +/datum/sprite_accessory/socks/white_norm + name = "Normal (White)" + icon_state = "white_norm" + +/datum/sprite_accessory/socks/pantyhose + name = "Pantyhose" + icon_state = "pantyhose" + +/datum/sprite_accessory/socks/black_short + name = "Short (Black)" + icon_state = "black_short" + +/datum/sprite_accessory/socks/white_short + name = "Short (White)" + icon_state = "white_short" + +/datum/sprite_accessory/socks/stockings_blue + name = "Stockings (Blue)" + icon_state = "stockings_blue" + +/datum/sprite_accessory/socks/stockings_cyan + name = "Stockings (Cyan)" + icon_state = "stockings_cyan" + +/datum/sprite_accessory/socks/stockings_dpink + name = "Stockings (Dark Pink)" + icon_state = "stockings_dpink" + +/datum/sprite_accessory/socks/stockings_green + name = "Stockings (Green)" + icon_state = "stockings_green" + +/datum/sprite_accessory/socks/stockings_orange + name = "Stockings (Orange)" + icon_state = "stockings_orange" + +/datum/sprite_accessory/socks/stockings_programmer + name = "Stockings (Programmer)" + icon_state = "stockings_lpink" + +/datum/sprite_accessory/socks/stockings_purple + name = "Stockings (Purple)" + icon_state = "stockings_purple" + +/datum/sprite_accessory/socks/stockings_yellow + name = "Stockings (Yellow)" + icon_state = "stockings_yellow" + +/datum/sprite_accessory/socks/stockings_fishnet + name = "Stockings (Fishnet)" + icon_state = "fishnet_full" + +/datum/sprite_accessory/socks/ace_thigh + name = "Thigh-high (Ace)" + icon_state = "ace_thigh" + +/datum/sprite_accessory/socks/bee_thigh + name = "Thigh-high (Bee)" + icon_state = "bee_thigh" + +/datum/sprite_accessory/socks/black_thigh + name = "Thigh-high (Black)" + icon_state = "black_thigh" + +/datum/sprite_accessory/socks/commie_thigh + name = "Thigh-high (Commie)" + icon_state = "commie_thigh" + +/datum/sprite_accessory/socks/usa_thigh + name = "Thigh-high (Freedom)" + icon_state = "assblastusa_thigh" + +/datum/sprite_accessory/socks/rainbow_thigh + name = "Thigh-high (Rainbow)" + icon_state = "rainbow_thigh" + +/datum/sprite_accessory/socks/striped_thigh + name = "Thigh-high (Striped)" + icon_state = "striped_thigh" + +/datum/sprite_accessory/socks/thin_thigh + name = "Thigh-high (Thin)" + icon_state = "thin_thigh" + +/datum/sprite_accessory/socks/trans_thigh + name = "Thigh-high (Trans)" + icon_state = "trans_thigh" + +/datum/sprite_accessory/socks/uk_thigh + name = "Thigh-high (UK)" + icon_state = "uk_thigh" + +/datum/sprite_accessory/socks/white_thigh + name = "Thigh-high (White)" + icon_state = "white_thigh" + +/datum/sprite_accessory/socks/fishnet_thigh + name = "Thigh-high (Fishnet)" + icon_state = "fishnet_thigh" + +/datum/sprite_accessory/socks/thocks + name = "Thocks" + icon_state = "thocks" + +//////////.////////////////// +// MutantParts Definitions // +///////////////////////////// + +/datum/sprite_accessory/body_markings + icon = 'icons/mob/human/species/lizard/lizard_misc.dmi' + +/datum/sprite_accessory/body_markings/none + name = "None" + icon_state = "none" + +/datum/sprite_accessory/body_markings/dtiger + name = "Dark Tiger Body" + icon_state = "dtiger" + gender_specific = 1 + +/datum/sprite_accessory/body_markings/ltiger + name = "Light Tiger Body" + icon_state = "ltiger" + gender_specific = 1 + +/datum/sprite_accessory/body_markings/lbelly + name = "Light Belly" + icon_state = "lbelly" + gender_specific = 1 + +/datum/sprite_accessory/tails + em_block = TRUE + +/datum/sprite_accessory/tails/lizard + icon = 'icons/mob/human/species/lizard/lizard_tails.dmi' + +/datum/sprite_accessory/tails/lizard/smooth + name = "Smooth" + icon_state = "smooth" + +/datum/sprite_accessory/tails/lizard/dtiger + name = "Dark Tiger" + icon_state = "dtiger" + +/datum/sprite_accessory/tails/lizard/ltiger + name = "Light Tiger" + icon_state = "ltiger" + +/datum/sprite_accessory/tails/lizard/spikes + name = "Spikes" + icon_state = "spikes" + +/datum/sprite_accessory/tails/human/cat + name = "Cat" + icon = 'icons/mob/human/cat_features.dmi' + icon_state = "default" + color_src = HAIR_COLOR + +/datum/sprite_accessory/tails/monkey + icon = 'icons/mob/human/species/monkey/monkey_tail.dmi' + color_src = FALSE + +/datum/sprite_accessory/tails/monkey/standard + name = "Monkey" + icon_state = "monkey" + +/datum/sprite_accessory/pod_hair + icon = 'icons/mob/human/species/podperson_hair.dmi' + em_block = TRUE + +/datum/sprite_accessory/pod_hair/ivy + name = "Ivy" + icon_state = "ivy" + +/datum/sprite_accessory/pod_hair/cabbage + name = "Cabbage" + icon_state = "cabbage" + +/datum/sprite_accessory/pod_hair/spinach + name = "Spinach" + icon_state = "spinach" + +/datum/sprite_accessory/pod_hair/prayer + name = "Prayer" + icon_state = "prayer" + +/datum/sprite_accessory/pod_hair/vine + name = "Vine" + icon_state = "vine" + +/datum/sprite_accessory/pod_hair/shrub + name = "Shrub" + icon_state = "shrub" + +/datum/sprite_accessory/pod_hair/rose + name = "Rose" + icon_state = "rose" + +/datum/sprite_accessory/pod_hair/orchid + name = "Orchid" + icon_state = "orchid" + +/datum/sprite_accessory/pod_hair/fig + name = "Fig" + icon_state = "fig" + +/datum/sprite_accessory/pod_hair/hibiscus + name = "Hibiscus" + icon_state = "hibiscus" + +/datum/sprite_accessory/snouts + icon = 'icons/mob/human/species/lizard/lizard_misc.dmi' + em_block = TRUE + +/datum/sprite_accessory/snouts/sharp + name = "Sharp" + icon_state = "sharp" + +/datum/sprite_accessory/snouts/round + name = "Round" + icon_state = "round" + +/datum/sprite_accessory/snouts/sharplight + name = "Sharp + Light" + icon_state = "sharplight" + +/datum/sprite_accessory/snouts/roundlight + name = "Round + Light" + icon_state = "roundlight" + +/datum/sprite_accessory/horns + icon = 'icons/mob/human/species/lizard/lizard_misc.dmi' + em_block = TRUE + +/datum/sprite_accessory/horns/none + name = "None" + icon_state = "none" + +/datum/sprite_accessory/horns/simple + name = "Simple" + icon_state = "simple" + +/datum/sprite_accessory/horns/short + name = "Short" + icon_state = "short" + +/datum/sprite_accessory/horns/curled + name = "Curled" + icon_state = "curled" + +/datum/sprite_accessory/horns/ram + name = "Ram" + icon_state = "ram" + +/datum/sprite_accessory/horns/angler + name = "Angeler" + icon_state = "angler" + +/datum/sprite_accessory/ears + icon = 'icons/mob/human/cat_features.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 = TRUE + color_src = HAIR_COLOR + +/datum/sprite_accessory/ears/fox + icon = 'icons/mob/human/fox_features.dmi' + name = "Fox" + icon_state = "fox" + hasinner = TRUE + color_src = HAIR_COLOR + locked = TRUE + +/datum/sprite_accessory/wings/none + name = "None" + icon_state = "none" + +/datum/sprite_accessory/wings + icon = 'icons/mob/human/species/wings.dmi' + em_block = TRUE + +/datum/sprite_accessory/wings_open + icon = 'icons/mob/human/species/wings.dmi' + em_block = TRUE + +/datum/sprite_accessory/wings/angel + name = "Angel" + icon_state = "angel" + color_src = FALSE + dimension_x = 46 + center = TRUE + dimension_y = 34 + locked = TRUE + +/datum/sprite_accessory/wings_open/angel + name = "Angel" + icon_state = "angel" + color_src = FALSE + dimension_x = 46 + center = TRUE + dimension_y = 34 + +/datum/sprite_accessory/wings/dragon + name = "Dragon" + icon_state = "dragon" + dimension_x = 96 + center = TRUE + dimension_y = 32 + locked = TRUE + +/datum/sprite_accessory/wings_open/dragon + name = "Dragon" + icon_state = "dragon" + dimension_x = 96 + center = TRUE + dimension_y = 32 + +/datum/sprite_accessory/wings/megamoth + name = "Megamoth" + icon_state = "megamoth" + color_src = FALSE + dimension_x = 96 + center = TRUE + dimension_y = 32 + locked = TRUE + +/datum/sprite_accessory/wings_open/megamoth + name = "Megamoth" + icon_state = "megamoth" + color_src = FALSE + dimension_x = 96 + center = TRUE + dimension_y = 32 + +/datum/sprite_accessory/wings/mothra + name = "Mothra" + icon_state = "mothra" + color_src = FALSE + dimension_x = 96 + center = TRUE + dimension_y = 32 + locked = TRUE + +/datum/sprite_accessory/wings_open/mothra + name = "Mothra" + icon_state = "mothra" + color_src = FALSE + dimension_x = 96 + center = TRUE + dimension_y = 32 + +/datum/sprite_accessory/wings/skeleton + name = "Skeleton" + icon_state = "skele" + color_src = FALSE + dimension_x = 96 + center = TRUE + dimension_y = 32 + locked = TRUE + +/datum/sprite_accessory/wings_open/skeleton + name = "Skeleton" + icon_state = "skele" + color_src = FALSE + dimension_x = 96 + center = TRUE + dimension_y = 32 + +/datum/sprite_accessory/wings/robotic + name = "Robotic" + icon_state = "robotic" + color_src = FALSE + dimension_x = 96 + center = TRUE + dimension_y = 32 + locked = TRUE + +/datum/sprite_accessory/wings_open/robotic + name = "Robotic" + icon_state = "robotic" + color_src = FALSE + dimension_x = 96 + center = TRUE + dimension_y = 32 + +/datum/sprite_accessory/wings/fly + name = "Fly" + icon_state = "fly" + color_src = FALSE + dimension_x = 96 + center = TRUE + dimension_y = 32 + locked = TRUE + +/datum/sprite_accessory/wings_open/fly + name = "Fly" + icon_state = "fly" + color_src = FALSE + dimension_x = 96 + center = TRUE + dimension_y = 32 + +/datum/sprite_accessory/frills + icon = 'icons/mob/human/species/lizard/lizard_misc.dmi' + +/datum/sprite_accessory/frills/none + name = "None" + icon_state = "none" + +/datum/sprite_accessory/frills/simple + name = "Simple" + icon_state = "simple" + +/datum/sprite_accessory/frills/short + name = "Short" + icon_state = "short" + +/datum/sprite_accessory/frills/aquatic + name = "Aquatic" + icon_state = "aqua" + +/datum/sprite_accessory/spines + icon = 'icons/mob/human/species/lizard/lizard_spines.dmi' + em_block = TRUE + +/datum/sprite_accessory/spines_animated + icon = 'icons/mob/human/species/lizard/lizard_spines.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" + +/datum/sprite_accessory/legs //legs are a special case, they aren't actually sprite_accessories but are updated with them. + icon = null //These datums exist for selecting legs on preference, and little else + em_block = TRUE + +/datum/sprite_accessory/legs/none + name = "Normal Legs" + +/datum/sprite_accessory/legs/digitigrade_lizard + name = DIGITIGRADE_LEGS + +/datum/sprite_accessory/caps + icon = 'icons/mob/human/species/mush_cap.dmi' + color_src = HAIR_COLOR + em_block = TRUE + +/datum/sprite_accessory/caps/round + name = "Round" + icon_state = "round" + +/datum/sprite_accessory/moth_wings + icon = 'icons/mob/human/species/moth/moth_wings.dmi' + color_src = null + em_block = TRUE + +/datum/sprite_accessory/moth_wings/plain + name = "Plain" + icon_state = "plain" + +/datum/sprite_accessory/moth_wings/monarch + name = "Monarch" + icon_state = "monarch" + +/datum/sprite_accessory/moth_wings/luna + name = "Luna" + icon_state = "luna" + +/datum/sprite_accessory/moth_wings/atlas + name = "Atlas" + icon_state = "atlas" + +/datum/sprite_accessory/moth_wings/reddish + name = "Reddish" + icon_state = "redish" + +/datum/sprite_accessory/moth_wings/royal + name = "Royal" + icon_state = "royal" + +/datum/sprite_accessory/moth_wings/gothic + name = "Gothic" + icon_state = "gothic" + +/datum/sprite_accessory/moth_wings/lovers + name = "Lovers" + icon_state = "lovers" + +/datum/sprite_accessory/moth_wings/whitefly + name = "White Fly" + icon_state = "whitefly" + +/datum/sprite_accessory/moth_wings/burnt_off + name = "Burnt Off" + icon_state = "burnt_off" + locked = TRUE + +/datum/sprite_accessory/moth_wings/firewatch + name = "Firewatch" + icon_state = "firewatch" + +/datum/sprite_accessory/moth_wings/deathhead + name = "Deathshead" + icon_state = "deathhead" + +/datum/sprite_accessory/moth_wings/poison + name = "Poison" + icon_state = "poison" + +/datum/sprite_accessory/moth_wings/ragged + name = "Ragged" + icon_state = "ragged" + +/datum/sprite_accessory/moth_wings/moonfly + name = "Moon Fly" + icon_state = "moonfly" + +/datum/sprite_accessory/moth_wings/snow + name = "Snow" + icon_state = "snow" + +/datum/sprite_accessory/moth_wings/oakworm + name = "Oak Worm" + icon_state = "oakworm" + +/datum/sprite_accessory/moth_wings/jungle + name = "Jungle" + icon_state = "jungle" + +/datum/sprite_accessory/moth_wings/witchwing + name = "Witch Wing" + icon_state = "witchwing" + +/datum/sprite_accessory/moth_wings/rosy + name = "Rosy" + icon_state = "rosy" + +/datum/sprite_accessory/moth_wings/feathery + name = "Feathery" + icon_state = "feathery" + +/datum/sprite_accessory/moth_wings/brown + name = "Brown" + icon_state = "brown" + +/datum/sprite_accessory/moth_wings/plasmafire + name = "Plasmafire" + icon_state = "plasmafire" + +/datum/sprite_accessory/moth_wings/moffra + name = "Moffra" + icon_state = "moffra" + +/datum/sprite_accessory/moth_antennae //Finally splitting the sprite + icon = 'icons/mob/human/species/moth/moth_antennae.dmi' + color_src = null + +/datum/sprite_accessory/moth_antennae/plain + name = "Plain" + icon_state = "plain" + +/datum/sprite_accessory/moth_antennae/reddish + name = "Reddish" + icon_state = "reddish" + +/datum/sprite_accessory/moth_antennae/royal + name = "Royal" + icon_state = "royal" + +/datum/sprite_accessory/moth_antennae/gothic + name = "Gothic" + icon_state = "gothic" + +/datum/sprite_accessory/moth_antennae/whitefly + name = "White Fly" + icon_state = "whitefly" + +/datum/sprite_accessory/moth_antennae/lovers + name = "Lovers" + icon_state = "lovers" + +/datum/sprite_accessory/moth_antennae/burnt_off + name = "Burnt Off" + icon_state = "burnt_off" + +/datum/sprite_accessory/moth_antennae/firewatch + name = "Firewatch" + icon_state = "firewatch" + +/datum/sprite_accessory/moth_antennae/deathhead + name = "Deathshead" + icon_state = "deathhead" + +/datum/sprite_accessory/moth_antennae/poison + name = "Poison" + icon_state = "poison" + +/datum/sprite_accessory/moth_antennae/ragged + name = "Ragged" + icon_state = "ragged" + +/datum/sprite_accessory/moth_antennae/moonfly + name = "Moon Fly" + icon_state = "moonfly" + +/datum/sprite_accessory/moth_antennae/oakworm + name = "Oak Worm" + icon_state = "oakworm" + +/datum/sprite_accessory/moth_antennae/jungle + name = "Jungle" + icon_state = "jungle" + +/datum/sprite_accessory/moth_antennae/witchwing + name = "Witch Wing" + icon_state = "witchwing" + +/datum/sprite_accessory/moth_antennae/regal + name = "Regal" + icon_state = "regal" +/datum/sprite_accessory/moth_antennae/rosy + name = "Rosy" + icon_state = "rosy" + +/datum/sprite_accessory/moth_antennae/feathery + name = "Feathery" + icon_state = "feathery" + +/datum/sprite_accessory/moth_antennae/brown + name = "Brown" + icon_state = "brown" + +/datum/sprite_accessory/moth_antennae/plasmafire + name = "Plasmafire" + icon_state = "plasmafire" + +/datum/sprite_accessory/moth_antennae/moffra + name = "Moffra" + icon_state = "moffra" + +/datum/sprite_accessory/moth_markings // the markings that moths can have. finally something other than the boring tan + icon = 'icons/mob/human/species/moth/moth_markings.dmi' + color_src = null + +/datum/sprite_accessory/moth_markings/none + name = "None" + icon_state = "none" + +/datum/sprite_accessory/moth_markings/reddish + name = "Reddish" + icon_state = "reddish" + +/datum/sprite_accessory/moth_markings/royal + name = "Royal" + icon_state = "royal" + +/datum/sprite_accessory/moth_markings/gothic + name = "Gothic" + icon_state = "gothic" + +/datum/sprite_accessory/moth_markings/whitefly + name = "White Fly" + icon_state = "whitefly" + +/datum/sprite_accessory/moth_markings/lovers + name = "Lovers" + icon_state = "lovers" + +/datum/sprite_accessory/moth_markings/burnt_off + name = "Burnt Off" + icon_state = "burnt_off" + +/datum/sprite_accessory/moth_markings/firewatch + name = "Firewatch" + icon_state = "firewatch" + +/datum/sprite_accessory/moth_markings/deathhead + name = "Deathshead" + icon_state = "deathhead" + +/datum/sprite_accessory/moth_markings/poison + name = "Poison" + icon_state = "poison" + +/datum/sprite_accessory/moth_markings/ragged + name = "Ragged" + icon_state = "ragged" + +/datum/sprite_accessory/moth_markings/moonfly + name = "Moon Fly" + icon_state = "moonfly" + +/datum/sprite_accessory/moth_markings/oakworm + name = "Oak Worm" + icon_state = "oakworm" + +/datum/sprite_accessory/moth_markings/jungle + name = "Jungle" + icon_state = "jungle" + +/datum/sprite_accessory/moth_markings/witchwing + name = "Witch Wing" + icon_state = "witchwing" diff --git a/code/datums/station_traits/_station_trait.dm b/code/datums/station_traits/_station_trait.dm index cb0de6afd4e4b..1205673c565f9 100644 --- a/code/datums/station_traits/_station_trait.dm +++ b/code/datums/station_traits/_station_trait.dm @@ -18,16 +18,23 @@ var/trait_to_give ///What traits are incompatible with this one? var/blacklist - ///Extra flags for station traits such as it being abstract - var/trait_flags + ///Extra flags for station traits such as it being abstract, planetary or space only + var/trait_flags = STATION_TRAIT_MAP_UNRESTRICTED /// Whether or not this trait can be reverted by an admin var/can_revert = TRUE + /// The ID that we look for in dynamic.json. Not synced with 'name' because I can already see this go wrong + var/dynamic_threat_id + /// If ran during dynamic, do we reduce the total threat? Will be overriden by config if set + var/threat_reduction = 0 /datum/station_trait/New() . = ..() RegisterSignal(SSticker, COMSIG_TICKER_ROUND_STARTING, PROC_REF(on_round_start)) + if(threat_reduction) + GLOB.dynamic_station_traits[src] = threat_reduction + if(trait_processes) START_PROCESSING(SSstation, src) if(trait_to_give) @@ -35,6 +42,7 @@ /datum/station_trait/Destroy() SSstation.station_traits -= src + GLOB.dynamic_station_traits.Remove(src) return ..() /// Proc ran when round starts. Use this for roundstart effects. @@ -44,7 +52,7 @@ ///type of info the centcom report has on this trait, if any. /datum/station_trait/proc/get_report() - return "[name] - [report_message]" + return "[name] - [report_message]" /// Will attempt to revert the station trait, used by admins. /datum/station_trait/proc/revert() @@ -55,3 +63,15 @@ REMOVE_TRAIT(SSstation, trait_to_give, STATION_TRAIT) qdel(src) + +///Called by decals if they can be colored, to see if we got some cool colors for them. Only takes the first station trait +/proc/request_station_colors(atom/thing_to_color, pattern = PATTERN_DEFAULT) + for(var/datum/station_trait/trait in SSstation.station_traits) + var/decal_color = trait.get_decal_color(thing_to_color, pattern) + if(decal_color) + return decal_color + return null + +///Return a color for the decals, if any +/datum/station_trait/proc/get_decal_color(thing_to_color, pattern) + return diff --git a/code/datums/station_traits/negative_traits.dm b/code/datums/station_traits/negative_traits.dm index 54545bb9287b0..901ec0ca115f4 100644 --- a/code/datums/station_traits/negative_traits.dm +++ b/code/datums/station_traits/negative_traits.dm @@ -17,6 +17,16 @@ /datum/station_trait/distant_supply_lines/on_round_start() SSeconomy.pack_price_modifier *= 1.2 +///A negative trait that reduces the amount of products available from vending machines throughout the station. +/datum/station_trait/vending_shortage + name = "Vending products shortage" + trait_type = STATION_TRAIT_NEGATIVE + weight = 3 + show_in_report = TRUE + can_revert = FALSE //Because it touches every maploaded vending machine on the station. + report_message = "We haven't had the time to take care of the station's vending machines. Some may be tilted, and some products may be unavailable." + trait_to_give = STATION_TRAIT_VENDING_SHORTAGE + /datum/station_trait/late_arrivals name = "Late Arrivals" trait_type = STATION_TRAIT_NEGATIVE @@ -81,7 +91,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 SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/apc)) if(is_station_level(apc.z) && prob(60)) apc.overload_lighting() @@ -267,7 +277,7 @@ name = "Ionic Stormfront" report_message = "An ionic stormfront is passing over your station's system. Expect an increased likelihood of ion storms afflicting your station's silicon units." trait_type = STATION_TRAIT_NEGATIVE - trait_flags = NONE + trait_flags = STATION_TRAIT_MAP_UNRESTRICTED weight = 3 event_control_path = /datum/round_event_control/ion_storm weight_multiplier = 2 @@ -276,7 +286,7 @@ name = "Radiation Stormfront" report_message = "A radioactive stormfront is passing through your station's system. Expect an increased likelihood of radiation storms passing over your station, as well the potential for multiple radiation storms to occur during your shift." trait_type = STATION_TRAIT_NEGATIVE - trait_flags = NONE + trait_flags = STATION_TRAIT_MAP_UNRESTRICTED weight = 2 event_control_path = /datum/round_event_control/radiation_storm weight_multiplier = 1.5 @@ -286,7 +296,7 @@ name = "Dust Stormfront" report_message = "The space around your station is clouded by heavy pockets of space dust. Expect an increased likelyhood of space dust storms damaging the station hull." trait_type = STATION_TRAIT_NEGATIVE - trait_flags = NONE + trait_flags = STATION_TRAIT_MAP_UNRESTRICTED weight = 2 event_control_path = /datum/round_event_control/meteor_wave/dust_storm weight_multiplier = 2 @@ -389,7 +399,7 @@ if(istype(current_thing, /obj/machinery/vending) && prob(45)) var/obj/machinery/vending/vendor_to_trash = current_thing if(prob(50)) - vendor_to_trash.tilt(get_turf(vendor_to_trash)) + vendor_to_trash.tilt(get_turf(vendor_to_trash), 0) // crit effects can do some real weird shit, lets disable it if(prob(50)) vendor_to_trash.take_damage(150) @@ -399,4 +409,277 @@ current_thing.take_damage(90) continue + if(istype(current_thing, /obj/item/bedsheet/captain)) + new /obj/item/bedsheet/rev(current_thing.loc) + qdel(current_thing) + continue + + if(istype(current_thing, /obj/item/bedsheet/captain/double)) + new /obj/item/bedsheet/rev/double(current_thing.loc) + qdel(current_thing) + continue + CHECK_TICK + +///Station traits that influence the space background and apply some unique effects! +/datum/station_trait/nebula + name = "Nebula" + trait_flags = STATION_TRAIT_ABSTRACT + weight = 0 + + show_in_report = TRUE + + ///The parallax layer of the nebula + var/nebula_layer = /atom/movable/screen/parallax_layer/random/space_gas + ///If set, gives the basic carp different colors + var/carp_color_override + +/datum/station_trait/nebula/New() + . = ..() + + SSparallax.swap_out_random_parallax_layer(nebula_layer) + + //Color the carp in unique colors to better blend with the nebula + if(carp_color_override) + GLOB.carp_colors = carp_color_override + +///Station nebula that incur some sort of effect if no shielding is created +/datum/station_trait/nebula/hostile + trait_flags = STATION_TRAIT_ABSTRACT + trait_processes = TRUE + + ///Intensity of the nebula + VAR_PRIVATE/nebula_intensity = -1 + ///The max intensity of a nebula + VAR_PROTECTED/maximum_nebula_intensity = 2 HOURS + ///How long it takes to go to the next nebula level/intensity + VAR_PROTECTED/intensity_increment_time = INFINITE + ///Objects that we use to calculate the current shielding level + var/list/shielding = list() + +/datum/station_trait/nebula/hostile/process(seconds_per_tick) + calculate_nebula_strength() + + apply_nebula_effect(nebula_intensity - get_shielding_level()) + +/datum/station_trait/nebula/hostile/on_round_start() + . = ..() + + addtimer(CALLBACK(src, PROC_REF(send_instructions)), 30 SECONDS) + +///Announce to the station what's going on and what they need to do +/datum/station_trait/nebula/hostile/proc/send_instructions() + return + +///Calculate how strong we currently are +/datum/station_trait/nebula/hostile/proc/calculate_nebula_strength() + nebula_intensity = min(STATION_TIME_PASSED() / intensity_increment_time, maximum_nebula_intensity) + +///Check how strong the stations shielding is +/datum/station_trait/nebula/hostile/proc/get_shielding_level() + var/shield_strength = 0 + for(var/atom/movable/shielder as anything in shielding) + if(!is_station_level(shielder.z)) + continue + var/datum/callback/callback = shielding[shielder] + shield_strength += callback.Invoke() + + return shield_strength + +///Add a shielding unit to ask for shielding +/datum/station_trait/nebula/hostile/proc/add_shielder(atom/movable/shielder, shielding_proc) + shielding[shielder] = CALLBACK(shielder, shielding_proc) + + RegisterSignal(shielder, COMSIG_QDELETING, PROC_REF(remove_shielder)) + +///Remove a shielding unit from our tracking +/datum/station_trait/nebula/hostile/proc/remove_shielder(atom/movable/shielder) + SIGNAL_HANDLER + + shielding.Remove(shielder) + +///The station did not set up shielding, start creating effects +/datum/station_trait/nebula/hostile/proc/apply_nebula_effect(effect_strength = 0) + return + +/proc/add_to_nebula_shielding(atom/movable/shielder, nebula_type, shielding_proc) + var/datum/station_trait/nebula/hostile/nebula = locate(nebula_type) in SSstation.station_traits + if(!nebula) + return FALSE + + nebula.add_shielder(shielder, shielding_proc) + +///The station will be inside a radioactive nebula! Space is radioactive and the station needs to start setting up nebula shielding +/datum/station_trait/nebula/hostile/radiation + name = "Radioactive Nebula" + trait_type = STATION_TRAIT_NEGATIVE + trait_flags = STATION_TRAIT_SPACE_BOUND //maybe when we can LOOK UP + weight = 1 + show_in_report = TRUE + report_message = "This station is located inside a radioactive nebula. Setting up nebula shielding is top-priority." + trait_to_give = STATION_TRAIT_RADIOACTIVE_NEBULA + + blacklist = list(/datum/station_trait/random_event_weight_modifier/rad_storms) + threat_reduction = 30 + dynamic_threat_id = "Radioactive Nebula" + + intensity_increment_time = 5 MINUTES + maximum_nebula_intensity = 1 HOURS + 40 MINUTES + + nebula_layer = /atom/movable/screen/parallax_layer/random/space_gas/radioactive + carp_color_override = list( + COLOR_CARP_GREEN = 1, + COLOR_CARP_TEAL = 1, + COLOR_CARP_PALE_GREEN = 1, + COLOR_CARP_DARK_GREEN = 1, + ) + ///When are we going to send them a care package? + COOLDOWN_DECLARE(send_care_package_at) + ///How long does the storm have to last for us to send a care package? + VAR_PROTECTED/send_care_package_time = 5 MINUTES + ///The glow of 'fake' radioactive objects in space + var/nebula_radglow = "#66ff33" + /// Area's that are part of the radioactive nebula + var/radioactive_areas = /area/space + +/datum/station_trait/nebula/hostile/radiation/New() + . = ..() + + for(var/area/target as anything in get_areas(radioactive_areas)) + RegisterSignal(target, COMSIG_AREA_ENTERED, PROC_REF(on_entered)) + RegisterSignal(target, COMSIG_AREA_EXITED, PROC_REF(on_exited)) + +/datum/station_trait/nebula/hostile/radiation/on_round_start() + . = ..() + + //Let people order more nebula shielding + var/datum/supply_pack/pack = SSshuttle.supply_packs[/datum/supply_pack/engineering/rad_nebula_shielding_kit] + pack.special_enabled = TRUE + + //Give robotics some radiation protection modules for modsuits + var/datum/supply_pack/supply_pack_modsuits = new /datum/supply_pack/engineering/rad_protection_modules() + send_supply_pod_to_area(supply_pack_modsuits.generate(null), /area/station/science/robotics, /obj/structure/closet/supplypod/centcompod) + + //Send a nebula shielding unit to engineering + var/datum/supply_pack/supply_pack_shielding = new /datum/supply_pack/engineering/rad_nebula_shielding_kit() + if(!send_supply_pod_to_area(supply_pack_shielding.generate(null), /area/station/engineering/main, /obj/structure/closet/supplypod/centcompod)) + //if engineering isnt valid, just send it to the bridge + send_supply_pod_to_area(supply_pack_shielding.generate(null), /area/station/command/bridge, /obj/structure/closet/supplypod/centcompod) + + // Let the viro know resistence is futile + send_fax_to_area(new /obj/item/paper/fluff/radiation_nebula_virologist(), /area/station/medical/virology, "NT Virology Department", \ + force = TRUE, force_pod_type = /obj/structure/closet/supplypod/centcompod) + + //Disables radstorms, they don't really make sense since we already have the nebula causing storms + var/datum/round_event_control/modified_event = locate(/datum/round_event_control/radiation_storm) in SSevents.control + modified_event.weight = 0 + +///They entered space? START BOMBING WITH RADS HAHAHAHA. old_area can be null for new objects +/datum/station_trait/nebula/hostile/radiation/proc/on_entered(area/space, atom/movable/enterer, area/old_area) + SIGNAL_HANDLER + + // Old area was radioactive, so what's the point. nothing changes. nothing ever does. also make sure the subsystem is alive before we give it food + if (istype(old_area, radioactive_areas) || !SSradioactive_nebula.initialized) + return + + SSradioactive_nebula.fake_irradiate(enterer) + +///Called when an atom leaves space, so we can remove the radiation effect +/datum/station_trait/nebula/hostile/radiation/proc/on_exited(area/space, atom/movable/exiter, direction) + SIGNAL_HANDLER + + SSradioactive_nebula.fake_unirradiate(exiter) + + // The component handles its own removal + +/datum/station_trait/nebula/hostile/radiation/apply_nebula_effect(effect_strength = 0) + //big bombad now + if(effect_strength > 0) + if(!SSweather.get_weather_by_type(/datum/weather/rad_storm/nebula)) + COOLDOWN_START(src, send_care_package_at, send_care_package_time) + SSweather.run_weather(/datum/weather/rad_storm/nebula) + + //Send a care package to temporarily lift the storm! + if(COOLDOWN_FINISHED(src, send_care_package_at)) + COOLDOWN_START(src, send_care_package_at, send_care_package_time) + var/obj/machinery/nebula_shielding/emergency/rad_shield = /obj/machinery/nebula_shielding/emergency/radiation + + priority_announce( + {"Is everything okay there? We're getting high radiation readings from inside the station. \ + We're sending an emergency shielding unit for now, it will last [initial(rad_shield.detonate_in) / (1 MINUTES)] minutes. \n\n\ + Set up the nebula shielding. You can order construction kits at cargo if yours have been lost. + "} + ) + + addtimer(CALLBACK(src, PROC_REF(send_care_package)), 10 SECONDS) + return + + //No storms, shielding is good! + var/datum/weather/weather = SSweather.get_weather_by_type(/datum/weather/rad_storm/nebula) + weather?.wind_down() + COOLDOWN_RESET(src, send_care_package_at) + +///Send a care package because it is not going well +/datum/station_trait/nebula/hostile/radiation/proc/send_care_package() + new /obj/effect/pod_landingzone (get_safe_random_station_turf(), new /obj/structure/closet/supplypod/centcompod (), new /obj/machinery/nebula_shielding/emergency/radiation ()) + +/datum/station_trait/nebula/hostile/radiation/send_instructions() + var/obj/machinery/nebula_shielding/shielder = /obj/machinery/nebula_shielding/radiation + var/obj/machinery/gravity_generator/main/innate_shielding = /obj/machinery/gravity_generator/main + //How long do we have untill the first shielding unit needs to be up? + var/deadline = "[(initial(innate_shielding.radioactive_nebula_shielding) * intensity_increment_time) / (1 MINUTES)] minute\s" + //For how long each shielding unit will protect for + var/shielder_time = "[(initial(shielder.shielding_strength) * intensity_increment_time) / (1 MINUTES)] minute\s" + //Max shielders, excluding the grav-gen to avoid confusion when that goes down + var/max_shielders = ((maximum_nebula_intensity / intensity_increment_time)) / initial(shielder.shielding_strength) + + var/announcement = {"Your station has been constructed inside a radioactive nebula. \ + Standard spacesuits will not protect against the nebula and using them is strongly discouraged. \n\n\ + + EXTREME IMPORTANCE: The station is falling deeper into the nebula, and the gravity generator's innate radiation shielding \ + will not hold very long. Your engineering department has been supplied with all the necessary supplies to set up \ + shields to protect against the nebula. Additional supply crates can be ordered at cargo. \n\n\ + You have [deadline] before the nebula enters the station. \ + Every shielding unit will provide an additional [shielder_time] of protection, fully protecting the station with [max_shielders] shielding units. + "} + + priority_announce(announcement, sound = 'sound/misc/notice1.ogg') + + //Set the display screens to the radiation alert + var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS) + if(!frequency) + return + + var/datum/signal/signal = new + signal.data["command"] = "alert" + signal.data["picture_state"] = "radiation" + + var/atom/movable/virtualspeaker/virtual_speaker = new(null) + frequency.post_signal(virtual_speaker, signal) + +/datum/station_trait/nebula/hostile/radiation/get_decal_color(atom/thing_to_color, pattern) + if(istype(get_area(thing_to_color), /area/station/hallway)) //color hallways green + return COLOR_GREEN + +///Starts a storm on roundstart +/datum/station_trait/storm + trait_flags = STATION_TRAIT_ABSTRACT + var/datum/weather/storm_type + +/datum/station_trait/storm/on_round_start() + . = ..() + + SSweather.run_weather(storm_type) + +/// Calls down an eternal storm on planetary stations +/datum/station_trait/storm/foreverstorm + name = "Forever Storm" + trait_type = STATION_TRAIT_NEGATIVE + trait_flags = STATION_TRAIT_PLANETARY + weight = 3 + show_in_report = TRUE + report_message = "It looks like the storm is not gonna calm down anytime soon, stay safe out there." + + storm_type = /datum/weather/snow_storm/forever_storm + +#undef GLOW_NEBULA diff --git a/code/datums/station_traits/neutral_traits.dm b/code/datums/station_traits/neutral_traits.dm index 88407dd45abe1..26bbc689afa10 100644 --- a/code/datums/station_traits/neutral_traits.dm +++ b/code/datums/station_traits/neutral_traits.dm @@ -158,16 +158,14 @@ /datum/station_trait/cargorilla/proc/replace_cargo(datum/source) SIGNAL_HANDLER - var/mob/living/simple_animal/sloth/cargo_sloth = GLOB.cargo_sloth - if(!cargo_sloth) + var/mob/living/basic/sloth/cargo_sloth = GLOB.cargo_sloth + if(isnull(cargo_sloth)) return cargorilla = new(cargo_sloth.loc) cargorilla.name = cargo_sloth.name // We do a poll on roundstart, don't let ghosts in early - cargorilla.being_polled_for = TRUE INVOKE_ASYNC(src, PROC_REF(make_id_for_gorilla)) - // hm our sloth looks funny today qdel(cargo_sloth) @@ -271,7 +269,7 @@ )) hat = new hat(spawned_mob) if(!spawned_mob.equip_to_slot_if_possible(hat, ITEM_SLOT_HEAD, disable_warning = TRUE)) - spawned_mob.equip_to_slot_or_del(hat, ITEM_SLOT_BACKPACK) + spawned_mob.equip_to_slot_or_del(hat, ITEM_SLOT_BACKPACK, indirect_action = TRUE) var/obj/item/toy = pick_weight(list( /obj/item/reagent_containers/spray/chemsprayer/party = 4, /obj/item/toy/balloon = 2, @@ -283,7 +281,7 @@ if(istype(toy, /obj/item/toy/balloon)) spawned_mob.equip_to_slot_or_del(toy, ITEM_SLOT_HANDS) //Balloons do not fit inside of backpacks. else - spawned_mob.equip_to_slot_or_del(toy, ITEM_SLOT_BACKPACK) + spawned_mob.equip_to_slot_or_del(toy, ITEM_SLOT_BACKPACK, indirect_action = TRUE) if(birthday_person_name) //Anyone who joins after the annoucement gets one of these. var/obj/item/birthday_invite/birthday_invite = new(spawned_mob) birthday_invite.setup_card(birthday_person_name) @@ -299,14 +297,14 @@ /obj/item/birthday_invite/proc/setup_card(birthday_name) desc = "A card stating that its [birthday_name]'s birthday today." icon_state = "paperslip_words" - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' /obj/item/clothing/head/costume/party name = "party hat" desc = "A crappy paper hat that you are REQUIRED to wear." icon_state = "party_hat" greyscale_config = /datum/greyscale_config/party_hat - greyscale_config_worn = /datum/greyscale_config/party_hat_worn + greyscale_config_worn = /datum/greyscale_config/party_hat/worn flags_inv = 0 armor_type = /datum/armor/none var/static/list/hat_colors = list( @@ -326,4 +324,15 @@ name = "festive paper hat" icon_state = "xmashat_grey" greyscale_config = /datum/greyscale_config/festive_hat - greyscale_config_worn = /datum/greyscale_config/festive_hat_worn + greyscale_config_worn = /datum/greyscale_config/festive_hat/worn + +/// Tells the area map generator to ADD MORE TREEEES +/datum/station_trait/forested + name = "Forested" + trait_type = STATION_TRAIT_NEUTRAL + trait_to_give = STATION_TRAIT_FORESTED + trait_flags = STATION_TRAIT_PLANETARY + weight = 10 + show_in_report = TRUE + report_message = "There sure are a lot of trees out there." + diff --git a/code/datums/station_traits/positive_traits.dm b/code/datums/station_traits/positive_traits.dm index 0fe10d9bce0ab..7c892e02a0f02 100644 --- a/code/datums/station_traits/positive_traits.dm +++ b/code/datums/station_traits/positive_traits.dm @@ -161,49 +161,49 @@ /datum/station_trait/deathrattle_department/service name = "Deathrattled Service" - trait_flags = NONE + trait_flags = STATION_TRAIT_MAP_UNRESTRICTED weight = 1 department_to_apply_to = DEPARTMENT_BITFLAG_SERVICE department_name = "Service" /datum/station_trait/deathrattle_department/cargo name = "Deathrattled Cargo" - trait_flags = NONE + trait_flags = STATION_TRAIT_MAP_UNRESTRICTED weight = 1 department_to_apply_to = DEPARTMENT_BITFLAG_CARGO department_name = "Cargo" /datum/station_trait/deathrattle_department/engineering name = "Deathrattled Engineering" - trait_flags = NONE + trait_flags = STATION_TRAIT_MAP_UNRESTRICTED weight = 1 department_to_apply_to = DEPARTMENT_BITFLAG_ENGINEERING department_name = "Engineering" /datum/station_trait/deathrattle_department/command name = "Deathrattled Command" - trait_flags = NONE + trait_flags = STATION_TRAIT_MAP_UNRESTRICTED weight = 1 department_to_apply_to = DEPARTMENT_BITFLAG_COMMAND department_name = "Command" /datum/station_trait/deathrattle_department/science name = "Deathrattled Science" - trait_flags = NONE + trait_flags = STATION_TRAIT_MAP_UNRESTRICTED weight = 1 department_to_apply_to = DEPARTMENT_BITFLAG_SCIENCE department_name = "Science" /datum/station_trait/deathrattle_department/security name = "Deathrattled Security" - trait_flags = NONE + trait_flags = STATION_TRAIT_MAP_UNRESTRICTED weight = 1 department_to_apply_to = DEPARTMENT_BITFLAG_SECURITY department_name = "Security" /datum/station_trait/deathrattle_department/medical name = "Deathrattled Medical" - trait_flags = NONE + trait_flags = STATION_TRAIT_MAP_UNRESTRICTED weight = 1 department_to_apply_to = DEPARTMENT_BITFLAG_MEDICAL department_name = "Medical" @@ -283,6 +283,7 @@ /datum/job/assistant = /obj/item/organ/internal/heart/cybernetic, //real cardiac /datum/job/atmospheric_technician = /obj/item/organ/internal/cyberimp/mouth/breathing_tube, /datum/job/bartender = /obj/item/organ/internal/liver/cybernetic/tier3, + /datum/job/bitrunner = /obj/item/organ/internal/eyes/robotic/thermals, /datum/job/botanist = /obj/item/organ/internal/cyberimp/chest/nutriment, /datum/job/captain = /obj/item/organ/internal/heart/cybernetic/tier3, /datum/job/cargo_technician = /obj/item/organ/internal/stomach/cybernetic/tier2, @@ -292,6 +293,7 @@ /datum/job/chief_medical_officer = /obj/item/organ/internal/cyberimp/chest/reviver, /datum/job/clown = /obj/item/organ/internal/cyberimp/brain/anti_stun, //HONK! /datum/job/cook = /obj/item/organ/internal/cyberimp/chest/nutriment/plus, + /datum/job/coroner = /obj/item/organ/internal/tongue/bone, //hes got a bone to pick with you /datum/job/curator = /obj/item/organ/internal/eyes/robotic/glow, /datum/job/detective = /obj/item/organ/internal/lungs/cybernetic/tier3, /datum/job/doctor = /obj/item/organ/internal/cyberimp/arm/surgery, @@ -303,7 +305,7 @@ /datum/job/mime = /obj/item/organ/internal/tongue/robot, //... /datum/job/paramedic = /obj/item/organ/internal/cyberimp/eyes/hud/medical, /datum/job/prisoner = /obj/item/organ/internal/eyes/robotic/shield, - /datum/job/psychologist = /obj/item/organ/internal/ears/cybernetic/upgraded, + /datum/job/psychologist = /obj/item/organ/internal/ears/cybernetic/whisper, /datum/job/quartermaster = /obj/item/organ/internal/stomach/cybernetic/tier3, /datum/job/research_director = /obj/item/organ/internal/cyberimp/bci, /datum/job/roboticist = /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic, @@ -343,5 +345,79 @@ trait_to_give = STATION_TRAIT_BIGGER_PODS blacklist = list(/datum/station_trait/cramped_escape_pods) +/datum/station_trait/medbot_mania + name = "Advanced Medbots" + trait_type = STATION_TRAIT_POSITIVE + weight = 5 + show_in_report = TRUE + report_message = "Your station's medibots have recieved a hardware upgrade, enabling expanded healing capabilities." + trait_to_give = STATION_TRAIT_MEDBOT_MANIA + +/datum/station_trait/random_event_weight_modifier/shuttle_loans + name = "Loaner Shuttle" + report_message = "Due to an uptick in pirate attacks around your sector, there are few supply vessels in nearby space willing to assist with special requests. Expect to recieve more shuttle loan opportunities, with slightly higher payouts." + trait_type = STATION_TRAIT_POSITIVE + weight = 4 + event_control_path = /datum/round_event_control/shuttle_loan + weight_multiplier = 2.5 + max_occurrences_modifier = 5 //All but one loan event will occur over the course of a round. + trait_to_give = STATION_TRAIT_LOANER_SHUTTLE + +/datum/station_trait/random_event_weight_modifier/wise_cows + name = "Wise Cow Invasion" + report_message = "Bluespace harmonic readings show unusual interpolative signals between your sector and agricultural sector MMF-D-02. Expect an increase in cow encounters. Encownters, if you will." + trait_type = STATION_TRAIT_POSITIVE + weight = 1 + event_control_path = /datum/round_event_control/wisdomcow + weight_multiplier = 3 + max_occurrences_modifier = 10 //lotta cows + +/datum/station_trait/shuttle_sale + name = "Shuttle Firesale" + report_message = "The Nanotrasen Emergency Dispatch team is celebrating a record number of shuttle calls in the recent quarter. Some of your emergency shuttle options have been discounted!" + trait_type = STATION_TRAIT_POSITIVE + weight = 4 + trait_to_give = STATION_TRAIT_SHUTTLE_SALE + show_in_report = TRUE + +/datum/station_trait/missing_wallet + name = "Misplaced Wallet" + report_message = "A repair technician left their wallet in a locker somewhere. They would greatly appreciate if you could locate and return it to them when the shift has ended." + trait_type = STATION_TRAIT_POSITIVE + weight = 5 + show_in_report = TRUE + +/datum/station_trait/missing_wallet/on_round_start() + . = ..() + + var/obj/structure/closet/locker_to_fill = pick(GLOB.roundstart_station_closets) + + var/obj/item/storage/wallet/new_wallet = new(locker_to_fill) + + new /obj/item/stack/spacecash/c500(new_wallet) + if(prob(25)) //Jackpot! + new /obj/item/stack/spacecash/c1000(new_wallet) + + new /obj/item/card/id/advanced/technician_id(new_wallet) + new_wallet.refreshID() + + if(prob(35)) + report_message += " The technician reports they last remember having their wallet around [get_area_name(new_wallet)]." + + message_admins("A missing wallet has been placed in the [locker_to_fill] locker, in the [get_area_name(locker_to_fill)] area.") + +/obj/item/card/id/advanced/technician_id + name = "Repair Technician ID" + desc = "Repair Technician? We don't have those in this sector, just a bunch of lazy engineers! This must have been from the between-shift crew..." + registered_name = "Pluoxium LXVII" + registered_age = 67 + trim = /datum/id_trim/technician_id + +/datum/id_trim/technician_id + access = list(ACCESS_EXTERNAL_AIRLOCKS, ACCESS_MAINT_TUNNELS) + assignment = "Repair Technician" + trim_state = "trim_stationengineer" + department_color = COLOR_ASSISTANT_GRAY + #undef PARTY_COOLDOWN_LENGTH_MIN #undef PARTY_COOLDOWN_LENGTH_MAX diff --git a/code/datums/status_effects/_status_effect.dm b/code/datums/status_effects/_status_effect.dm index 22de13ea670c8..b8d77db4ff7f1 100644 --- a/code/datums/status_effects/_status_effect.dm +++ b/code/datums/status_effects/_status_effect.dm @@ -8,8 +8,9 @@ /// -1 = infinite duration. var/duration = -1 /// When set initially / in on_creation, this is how long between [proc/tick] calls in deciseconds. + /// Note that this cannot be faster than the processing subsystem you choose to fire the effect on. (See: [var/processing_speed]) /// While processing, this becomes the world.time when the next tick will occur. - /// -1 = will stop processing, if duration is also unlimited (-1). + /// -1 = will prevent ticks, and if duration is also unlimited (-1), stop processing wholesale. var/tick_interval = 1 SECONDS /// The mob affected by the status effect. var/mob/living/owner @@ -28,6 +29,8 @@ var/remove_on_fullheal = FALSE /// If remove_on_fullheal is TRUE, what flag do we need to be removed? var/heal_flag_necessary = HEAL_STATUS + /// A particle effect, for things like embers - Should be set on update_particles() + var/obj/effect/abstract/particle_holder/particle_effect /datum/status_effect/New(list/arguments) on_creation(arglist(arguments)) @@ -47,20 +50,23 @@ if(duration != -1) duration = world.time + duration - tick_interval = world.time + tick_interval + if(tick_interval != -1) + tick_interval = world.time + tick_interval if(alert_type) var/atom/movable/screen/alert/status_effect/new_alert = owner.throw_alert(id, alert_type) new_alert.attached_effect = src //so the alert can reference us, if it needs to linked_alert = new_alert //so we can reference the alert, if we need to - if(duration > 0 || initial(tick_interval) > 0) //don't process if we don't care + if(duration > world.time || tick_interval > world.time) //don't process if we don't care switch(processing_speed) if(STATUS_EFFECT_FAST_PROCESS) START_PROCESSING(SSfastprocess, src) if(STATUS_EFFECT_NORMAL_PROCESS) START_PROCESSING(SSprocessing, src) + update_particles() + return TRUE /datum/status_effect/Destroy() @@ -76,19 +82,25 @@ on_remove() UnregisterSignal(owner, COMSIG_LIVING_POST_FULLY_HEAL) owner = null + if(particle_effect) + QDEL_NULL(particle_effect) return ..() // Status effect process. Handles adjusting its duration and ticks. // If you're adding processed effects, put them in [proc/tick] // instead of extending / overriding the process() proc. -/datum/status_effect/process(seconds_per_tick, times_fired) +/datum/status_effect/process(seconds_per_tick) SHOULD_NOT_OVERRIDE(TRUE) if(QDELETED(owner)) qdel(src) return - if(tick_interval < world.time) - tick(seconds_per_tick, times_fired) - tick_interval = world.time + initial(tick_interval) + if(tick_interval != -1 && tick_interval < world.time) + var/tick_length = initial(tick_interval) + tick(tick_length / (1 SECONDS)) + tick_interval = world.time + tick_length + if(QDELING(src)) + // tick deleted us, no need to continue + return if(duration != -1 && duration < world.time) qdel(src) @@ -102,8 +114,17 @@ /datum/status_effect/proc/get_examine_text() return null -/// Called every tick from process(). -/datum/status_effect/proc/tick(seconds_per_tick, times_fired) +/** + * Called every tick from process(). + * This is only called of tick_interval is not -1. + * + * Note that every tick =/= every processing cycle. + * + * * seconds_between_ticks = This is how many SECONDS that elapse between ticks. + * This is a constant value based upon the initial tick interval set on the status effect. + * It is similar to seconds_per_tick, from processing itself, but adjusted to the status effect's tick interval. + */ +/datum/status_effect/proc/tick(seconds_between_ticks) return /// Called whenever the buff expires or is removed (qdeleted) @@ -166,6 +187,14 @@ return FALSE +/** + * Updates the particles for the status effects + * Should be handled by subtypes! + */ + +/datum/status_effect/proc/update_particles() + SHOULD_CALL_PARENT(FALSE) + /// Alert base type for status effect alerts /atom/movable/screen/alert/status_effect name = "Curse of Mundanity" @@ -176,3 +205,4 @@ /atom/movable/screen/alert/status_effect/Destroy() attached_effect = null //Don't keep a ref now return ..() + diff --git a/code/datums/status_effects/agent_pinpointer.dm b/code/datums/status_effects/agent_pinpointer.dm index d620ce3796c3b..b6d68ccf867bc 100644 --- a/code/datums/status_effects/agent_pinpointer.dm +++ b/code/datums/status_effects/agent_pinpointer.dm @@ -24,7 +24,7 @@ ///The target we are pointing towards, refreshes every tick. var/mob/scan_target -/datum/status_effect/agent_pinpointer/tick() +/datum/status_effect/agent_pinpointer/tick(seconds_between_ticks) if(!owner) qdel(src) return diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 3d34b76c14f2b..14369c04888f0 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -3,7 +3,7 @@ /datum/status_effect/his_grace id = "his_grace" duration = -1 - tick_interval = 4 + tick_interval = 0.4 SECONDS alert_type = /atom/movable/screen/alert/status_effect/his_grace var/bloodlust = 0 @@ -22,11 +22,17 @@ return ..() /datum/status_effect/his_grace/on_apply() - owner.log_message("gained His Grace's stun immunity", LOG_ATTACK) - owner.add_stun_absorption("hisgrace", INFINITY, 3, null, "His Grace protects you from the stun!") + owner.add_stun_absorption( + source = id, + priority = 3, + self_message = span_boldwarning("His Grace protects you from the stun!"), + ) return ..() -/datum/status_effect/his_grace/tick() +/datum/status_effect/his_grace/on_remove() + owner.remove_stun_absorption(id) + +/datum/status_effect/his_grace/tick(seconds_between_ticks) bloodlust = 0 var/graces = 0 for(var/obj/item/his_grace/HG in owner.held_items) @@ -38,18 +44,15 @@ owner.apply_status_effect(/datum/status_effect/his_wrath) qdel(src) return - var/grace_heal = bloodlust * 0.05 - owner.adjustBruteLoss(-grace_heal) - owner.adjustFireLoss(-grace_heal) - owner.adjustToxLoss(-grace_heal, TRUE, TRUE) - owner.adjustOxyLoss(-(grace_heal * 2)) - owner.adjustCloneLoss(-grace_heal) - -/datum/status_effect/his_grace/on_remove() - owner.log_message("lost His Grace's stun immunity", LOG_ATTACK) - if(islist(owner.stun_absorption) && owner.stun_absorption["hisgrace"]) - owner.stun_absorption -= "hisgrace" - + var/grace_heal = bloodlust * 0.02 + var/need_mob_update = FALSE + need_mob_update += owner.adjustBruteLoss(-grace_heal * seconds_between_ticks, updating_health = FALSE, forced = TRUE) + need_mob_update += owner.adjustFireLoss(-grace_heal * seconds_between_ticks, updating_health = FALSE, forced = TRUE) + need_mob_update += owner.adjustToxLoss(-grace_heal * seconds_between_ticks, forced = TRUE) + need_mob_update += owner.adjustOxyLoss(-(grace_heal * 2) * seconds_between_ticks, updating_health = FALSE, forced = TRUE) + need_mob_update += owner.adjustCloneLoss(-grace_heal * seconds_between_ticks, updating_health = FALSE, forced = TRUE) + if(need_mob_update) + owner.updatehealth() /datum/status_effect/wish_granters_gift //Fully revives after ten seconds. id = "wish_granters_gift" @@ -60,7 +63,6 @@ to_chat(owner, span_notice("Death is not your end! The Wish Granter's energy suffuses you, and you begin to rise...")) return ..() - /datum/status_effect/wish_granters_gift/on_remove() owner.revive(ADMIN_HEAL_ALL) owner.visible_message(span_warning("[owner] appears to wake from the dead, having healed all wounds!"), span_notice("You have regenerated.")) @@ -71,39 +73,10 @@ desc = "You are being resurrected!" icon_state = "wish_granter" -/datum/status_effect/cult_master - id = "The Cult Master" - duration = -1 - alert_type = null - on_remove_on_mob_delete = TRUE - var/alive = TRUE - -/datum/status_effect/cult_master/proc/deathrattle() - if(!QDELETED(GLOB.cult_narsie)) - return //if Nar'Sie is alive, don't even worry about it - var/area/A = get_area(owner) - for(var/datum/mind/B as anything in get_antag_minds(/datum/antagonist/cult)) - if(isliving(B.current)) - var/mob/living/M = B.current - SEND_SOUND(M, sound('sound/hallucinations/veryfar_noise.ogg')) - to_chat(M, span_cultlarge("The Cult's Master, [owner], has fallen in \the [A]!")) - -/datum/status_effect/cult_master/tick() - if(owner.stat != DEAD && !alive) - alive = TRUE - return - if(owner.stat == DEAD && alive) - alive = FALSE - deathrattle() - -/datum/status_effect/cult_master/on_remove() - deathrattle() - . = ..() - /datum/status_effect/blooddrunk id = "blooddrunk" duration = 10 - tick_interval = 0 + tick_interval = -1 alert_type = /atom/movable/screen/alert/status_effect/blooddrunk /atom/movable/screen/alert/status_effect/blooddrunk @@ -112,34 +85,30 @@ icon_state = "blooddrunk" /datum/status_effect/blooddrunk/on_apply() - . = ..() - if(.) - ADD_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, BLOODDRUNK_TRAIT) - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.brute_mod *= 0.1 - H.physiology.burn_mod *= 0.1 - H.physiology.tox_mod *= 0.1 - H.physiology.oxy_mod *= 0.1 - H.physiology.clone_mod *= 0.1 - H.physiology.stamina_mod *= 0.1 - owner.log_message("gained blood-drunk stun immunity", LOG_ATTACK) - owner.add_stun_absorption("blooddrunk", INFINITY, 4) - owner.playsound_local(get_turf(owner), 'sound/effects/singlebeat.ogg', 40, 1, use_reverb = FALSE) + ADD_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, BLOODDRUNK_TRAIT) + if(ishuman(owner)) + var/mob/living/carbon/human/human_owner = owner + human_owner.physiology.brute_mod *= 0.1 + human_owner.physiology.burn_mod *= 0.1 + human_owner.physiology.tox_mod *= 0.1 + human_owner.physiology.oxy_mod *= 0.1 + human_owner.physiology.clone_mod *= 0.1 + human_owner.physiology.stamina_mod *= 0.1 + owner.add_stun_absorption(source = id, priority = 4) + owner.playsound_local(get_turf(owner), 'sound/effects/singlebeat.ogg', 40, 1, use_reverb = FALSE) + return TRUE /datum/status_effect/blooddrunk/on_remove() if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.brute_mod *= 10 - H.physiology.burn_mod *= 10 - H.physiology.tox_mod *= 10 - H.physiology.oxy_mod *= 10 - H.physiology.clone_mod *= 10 - H.physiology.stamina_mod *= 10 - owner.log_message("lost blood-drunk stun immunity", LOG_ATTACK) - REMOVE_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, BLOODDRUNK_TRAIT); - if(islist(owner.stun_absorption) && owner.stun_absorption["blooddrunk"]) - owner.stun_absorption -= "blooddrunk" + var/mob/living/carbon/human/human_owner = owner + human_owner.physiology.brute_mod *= 10 + human_owner.physiology.burn_mod *= 10 + human_owner.physiology.tox_mod *= 10 + human_owner.physiology.oxy_mod *= 10 + human_owner.physiology.clone_mod *= 10 + human_owner.physiology.stamina_mod *= 10 + REMOVE_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, BLOODDRUNK_TRAIT) + owner.remove_stun_absorption(id) //Used by changelings to rapidly heal //Heals 10 brute and oxygen damage every second, and 5 fire @@ -168,13 +137,16 @@ /datum/status_effect/fleshmend/on_remove() UnregisterSignal(owner, list(COMSIG_LIVING_IGNITED, COMSIG_LIVING_EXTINGUISHED)) -/datum/status_effect/fleshmend/tick() +/datum/status_effect/fleshmend/tick(seconds_between_ticks) if(owner.on_fire) return - owner.adjustBruteLoss(-10, FALSE) - owner.adjustFireLoss(-5, FALSE) - owner.adjustOxyLoss(-10) + var/need_mob_update = FALSE + need_mob_update += owner.adjustBruteLoss(-4 * seconds_between_ticks, updating_health = FALSE) + need_mob_update += owner.adjustFireLoss(-2 * seconds_between_ticks, updating_health = FALSE) + need_mob_update += owner.adjustOxyLoss(-4 * seconds_between_ticks, updating_health = FALSE) + if(need_mob_update) + owner.updatehealth() /datum/status_effect/fleshmend/proc/on_ignited(datum/source) SIGNAL_HANDLER @@ -202,7 +174,7 @@ id = "Hippocratic Oath" status_type = STATUS_EFFECT_UNIQUE duration = -1 - tick_interval = 25 + tick_interval = 2.5 SECONDS alert_type = null var/datum/component/aura_healing/aura_healing @@ -241,9 +213,9 @@ med_hud.hide_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()].") + return span_notice("[owner.p_They()] seem[owner.p_s()] to have an aura of healing and helpfulness about [owner.p_them()].") -/datum/status_effect/hippocratic_oath/tick() +/datum/status_effect/hippocratic_oath/tick(seconds_between_ticks) if(owner.stat == DEAD) if(deathTick < 4) deathTick += 1 @@ -286,27 +258,29 @@ //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) - itemUser.adjustFireLoss(-1.5) - itemUser.adjustToxLoss(-1.5, forced = TRUE) //Because Slime People are people too - itemUser.adjustOxyLoss(-1.5, forced = TRUE) - itemUser.adjustStaminaLoss(-1.5) - itemUser.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1.5) - itemUser.adjustCloneLoss(-0.5) //Becasue apparently clone damage is the bastion of all health + var/need_mob_update = FALSE + need_mob_update += itemUser.adjustBruteLoss(-0.6 * seconds_between_ticks, updating_health = FALSE, forced = TRUE) + need_mob_update += itemUser.adjustFireLoss(-0.6 * seconds_between_ticks, updating_health = FALSE, forced = TRUE) + need_mob_update += itemUser.adjustToxLoss(-0.6 * seconds_between_ticks, updating_health = FALSE, forced = TRUE) //Because Slime People are people too + need_mob_update += itemUser.adjustOxyLoss(-0.6 * seconds_between_ticks, updating_health = FALSE, forced = TRUE) + need_mob_update += itemUser.adjustStaminaLoss(-0.6 * seconds_between_ticks, updating_stamina = FALSE, forced = TRUE) + need_mob_update += itemUser.adjustOrganLoss(ORGAN_SLOT_BRAIN, -0.6 * seconds_between_ticks) + need_mob_update += itemUser.adjustCloneLoss(-0.2 * seconds_between_ticks, updating_health = FALSE, forced = TRUE) //Because apparently clone damage is the bastion of all health + if(need_mob_update) + itemUser.updatehealth() /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." + var/mob/living/basic/snake/spawned = new(owner.loc, pick(chems)) + spawned.name = "Asclepius's Snake" + spawned.real_name = "Asclepius's Snake" + spawned.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) owner.investigate_log("has been consumed by the Rod of Asclepius.", INVESTIGATE_DEATHS) qdel(owner) - /datum/status_effect/good_music id = "Good Music" alert_type = null @@ -314,7 +288,7 @@ tick_interval = 1 SECONDS status_type = STATUS_EFFECT_REFRESH -/datum/status_effect/good_music/tick() +/datum/status_effect/good_music/tick(seconds_between_ticks) if(owner.can_hear()) owner.adjust_dizzy(-4 SECONDS) owner.adjust_jitter(-4 SECONDS) @@ -468,17 +442,20 @@ tick_interval = 0.4 SECONDS alert_type = /atom/movable/screen/alert/status_effect/nest_sustenance -/datum/status_effect/nest_sustenance/tick(seconds_per_tick, times_fired) +/datum/status_effect/nest_sustenance/tick(seconds_between_ticks) . = ..() if(owner.stat == DEAD) //If the victim has died due to complications in the nest qdel(src) return - owner.adjustBruteLoss(-2 * seconds_per_tick, updating_health = FALSE) - owner.adjustFireLoss(-2 * seconds_per_tick, updating_health = FALSE) - owner.adjustOxyLoss(-4 * seconds_per_tick, updating_health = FALSE) - owner.adjustStaminaLoss(-4 * seconds_per_tick, updating_stamina = FALSE) + var/need_mob_update = FALSE + need_mob_update += owner.adjustBruteLoss(-2 * seconds_between_ticks, updating_health = FALSE) + need_mob_update += owner.adjustFireLoss(-2 * seconds_between_ticks, updating_health = FALSE) + need_mob_update += owner.adjustOxyLoss(-4 * seconds_between_ticks, updating_health = FALSE) + need_mob_update += owner.adjustStaminaLoss(-4 * seconds_between_ticks, updating_stamina = FALSE) + if(need_mob_update) + owner.updatehealth() owner.adjust_bodytemperature(BODYTEMP_NORMAL, 0, BODYTEMP_NORMAL) //Won't save you from the void of space, but it will stop you from freezing or suffocating in low pressure @@ -486,3 +463,65 @@ name = "Nest Vitalization" desc = "The resin seems to pulsate around you. It seems to be sustaining your vital functions. You feel ill..." icon_state = "nest_life" + +/** + * Granted to wizards upon satisfying the cheese sacrifice during grand rituals. + * Halves incoming damage and makes the owner stun immune, damage slow immune, levitating(even in space and hyperspace!) and glowing. + */ +/datum/status_effect/blessing_of_insanity + id = "blessing_of_insanity" + duration = -1 + tick_interval = -1 + alert_type = /atom/movable/screen/alert/status_effect/blessing_of_insanity + +/atom/movable/screen/alert/status_effect/blessing_of_insanity + name = "Blessing of Insanity" + desc = "Your devotion to madness has improved your resilience to all damage and you gain the power to levitate!" + //no screen alert - the gravity already throws one + +/datum/status_effect/blessing_of_insanity/on_apply() + if(ishuman(owner)) + var/mob/living/carbon/human/human_owner = owner + var/datum/physiology/owner_physiology = human_owner.physiology + owner_physiology.brute_mod *= 0.5 + owner_physiology.burn_mod *= 0.5 + owner_physiology.tox_mod *= 0.5 + owner_physiology.oxy_mod *= 0.5 + owner_physiology.clone_mod *= 0.5 + owner_physiology.stamina_mod *= 0.5 + owner.add_filter("mad_glow", 2, list("type" = "outline", "color" = "#eed811c9", "size" = 2)) + owner.AddElement(/datum/element/forced_gravity, 0) + owner.AddElement(/datum/element/simple_flying) + owner.add_stun_absorption(source = id, priority = 4) + add_traits(list(TRAIT_IGNOREDAMAGESLOWDOWN, TRAIT_FREE_HYPERSPACE_MOVEMENT), MAD_WIZARD_TRAIT) + owner.playsound_local(get_turf(owner), 'sound/chemistry/ahaha.ogg', vol = 100, vary = TRUE, use_reverb = TRUE) + return TRUE + +/datum/status_effect/blessing_of_insanity/on_remove() + if(ishuman(owner)) + var/mob/living/carbon/human/human_owner = owner + var/datum/physiology/owner_physiology = human_owner.physiology + owner_physiology.brute_mod *= 2 + owner_physiology.burn_mod *= 2 + owner_physiology.tox_mod *= 2 + owner_physiology.oxy_mod *= 2 + owner_physiology.clone_mod *= 2 + owner_physiology.stamina_mod *= 2 + owner.remove_filter("mad_glow") + owner.RemoveElement(/datum/element/forced_gravity, 0) + owner.RemoveElement(/datum/element/simple_flying) + owner.remove_stun_absorption(id) + remove_traits(list(TRAIT_IGNOREDAMAGESLOWDOWN, TRAIT_FREE_HYPERSPACE_MOVEMENT), MAD_WIZARD_TRAIT) + +/// Gives you a brief period of anti-gravity +/datum/status_effect/jump_jet + id = "jump_jet" + alert_type = null + duration = 5 SECONDS + +/datum/status_effect/jump_jet/on_apply() + owner.AddElement(/datum/element/forced_gravity, 0) + return TRUE + +/datum/status_effect/jump_jet/on_remove() + owner.RemoveElement(/datum/element/forced_gravity, 0) diff --git a/code/datums/status_effects/buffs/food_haste.dm b/code/datums/status_effects/buffs/food_haste.dm new file mode 100644 index 0000000000000..9daf859fb19c7 --- /dev/null +++ b/code/datums/status_effects/buffs/food_haste.dm @@ -0,0 +1,20 @@ +/// Haste makes the eater move faster +/datum/status_effect/food/haste + var/datum/movespeed_modifier/food_haste/modifier + +/datum/status_effect/food/haste/on_apply() + modifier = new() + modifier.multiplicative_slowdown = -0.04 * strength + owner.add_movespeed_modifier(modifier, update = TRUE) + return ..() + +/datum/status_effect/food/haste/be_replaced() + owner.remove_movespeed_modifier(modifier, update = TRUE) + return ..() + +/datum/status_effect/food/haste/on_remove() + owner.remove_movespeed_modifier(modifier, update = TRUE) + return ..() + +/datum/movespeed_modifier/food_haste + multiplicative_slowdown = -0.1 diff --git a/code/datums/status_effects/buffs/food_traits.dm b/code/datums/status_effects/buffs/food_traits.dm new file mode 100644 index 0000000000000..ebe22116dd0de --- /dev/null +++ b/code/datums/status_effects/buffs/food_traits.dm @@ -0,0 +1,8 @@ +/datum/status_effect/food/trait/shockimmune + alert_type = /atom/movable/screen/alert/status_effect/food_trait_shockimmune + trait = TRAIT_SHOCKIMMUNE + +/atom/movable/screen/alert/status_effect/food_trait_shockimmune + name = "Grounded" + desc = "That meal made me feel like a superconductor..." + icon_state = "food_buff_4" diff --git a/code/datums/status_effects/buffs/stun_absorption.dm b/code/datums/status_effects/buffs/stun_absorption.dm new file mode 100644 index 0000000000000..9532d79c4f54c --- /dev/null +++ b/code/datums/status_effects/buffs/stun_absorption.dm @@ -0,0 +1,271 @@ +/** + * # Stun absorption + * + * A status effect effectively functions as [TRAIT_STUNIMMUNE], but with additional effects tied to it, + * such as showing a message on trigger / examine, or only blocking a limited amount of stuns. + * + * Apply this via [/mob/living/proc/add_stun_absorption]. If you do not supply a duration, + * remove this via [/mob/living/proc/remove_stun_absorption]. + */ +/datum/status_effect/stun_absorption + id = "absorb_stun" + tick_interval = -1 + alert_type = null + status_type = STATUS_EFFECT_MULTIPLE + + /// The string key sourcer of the stun absorption, used for logging + var/source + /// The priority of the stun absorption. Used so that multiple sources will not trigger at once. + /// This number is arbitrary but try to keep in sane / in line with other sources that exist. + var/priority = -1 + /// How many total seconds of stuns that have been blocked. + var/seconds_of_stuns_absorbed = 0 SECONDS + /// The max number of seconds we can block before self-deleting. + var/max_seconds_of_stuns_blocked = INFINITY + /// The message shown via visible message to all nearby mobs when the effect triggers. + var/shown_message + /// The message shown to the owner when the effect triggers. + var/self_message + /// Message shown on anyone examining the owner. + var/examine_message + /// If TRUE, after passing the max seconds of stuns blocked, we will delete ourself. + /// If FALSE, we will instead recharge after some time. + var/delete_after_passing_max + /// If [delete_after_passing_max] is FALSE, this is how long we will wait before recharging. + var/recharge_time + + /// Static list of all generic "stun received " signals that we will react to and block. + /// These all have the same arguments sent, so we can handle them all via the same signal handler. + /// Note though that we can register other signals to block effects outside of these if we want. + var/static/list/incapacitation_effect_signals = list( + COMSIG_LIVING_STATUS_IMMOBILIZE, + COMSIG_LIVING_STATUS_INCAPACITATE, + COMSIG_LIVING_STATUS_KNOCKDOWN, + COMSIG_LIVING_STATUS_PARALYZE, + COMSIG_LIVING_STATUS_STUN, + ) + +/datum/status_effect/stun_absorption/on_creation( + mob/living/new_owner, + source, + duration, + priority = -1, + shown_message, + self_message, + examine_message, + max_seconds_of_stuns_blocked = INFINITY, + delete_after_passing_max = TRUE, + recharge_time = 1 MINUTES, +) + + if(isnum(duration)) + src.duration = duration + + src.source = source + src.priority = priority + src.shown_message = shown_message + src.self_message = self_message + src.examine_message = examine_message + src.max_seconds_of_stuns_blocked = max_seconds_of_stuns_blocked + src.delete_after_passing_max = delete_after_passing_max + src.recharge_time = recharge_time + + return ..() + +/datum/status_effect/stun_absorption/on_apply() + if(owner.mind || owner.client) + owner.log_message("gained stun absorption (from: [source || "Unknown"])", LOG_ATTACK) + + RegisterSignals(owner, incapacitation_effect_signals, PROC_REF(try_absorb_incapacitating_effect)) + RegisterSignal(owner, COMSIG_LIVING_GENERIC_STUN_CHECK, PROC_REF(try_absorb_generic_effect)) + return TRUE + +/datum/status_effect/stun_absorption/on_remove() + if(owner.mind || owner.client) + owner.log_message("lost stun absorption (from: [source || "Unknown"])", LOG_ATTACK) + + UnregisterSignal(owner, incapacitation_effect_signals) + UnregisterSignal(owner, COMSIG_LIVING_GENERIC_STUN_CHECK) + +/datum/status_effect/stun_absorption/get_examine_text() + if(can_absorb_stun()) + return replacetext(examine_message, "%EFFECT_OWNER_THEYRE", owner.p_Theyre()) + return null // no message if we can't absorb stuns, duh. + +/** + * Signal proc for generic stun signals being sent, such as [COMSIG_LIVING_STATUS_STUN] or [COMSIG_LIVING_STATUS_KNOCKDOWN]. + * + * When we get stunned, we will try to absorb a number of seconds from the stun, and return [COMPONENT_NO_STUN] if we succeed. + */ +/datum/status_effect/stun_absorption/proc/try_absorb_incapacitating_effect(mob/living/source, amount = 0, ignore_canstun = FALSE) + SIGNAL_HANDLER + + // we blocked a stun this tick that resulting is us qdeling, so stop + if(QDELING(src)) + return NONE + + // Amount less than (or equal to) zero is removing stuns, so we don't want to block that + if(amount <= 0 || ignore_canstun) + return NONE + + if(!absorb_stun(amount)) + return NONE + + return COMPONENT_NO_STUN + +/** + * Signal proc for [COMSIG_LIVING_GENERIC_STUN_CHECK]. (Note, this includes being stamcrit) + * + * Whenever a generic stun check is done against us, we'll just try to block it with "0 second" stun. + * This prevents spam us from showing feedback messages, and is for the generic "can be stunned" check. + */ +/datum/status_effect/stun_absorption/proc/try_absorb_generic_effect(mob/living/source, check_flags) + SIGNAL_HANDLER + + if(QDELING(src)) + return NONE + + // "0 amount" / "0 seconds of stun" is used so no feedback is sent on success + if(!absorb_stun(0)) + return NONE + + return COMPONENT_NO_STUN + +/// Simply checks if the owner of the effect is in a valid state to absorb stuns. +/datum/status_effect/stun_absorption/proc/can_absorb_stun() + if(owner.stat != CONSCIOUS) + return FALSE + if(seconds_of_stuns_absorbed > max_seconds_of_stuns_blocked) + return FALSE + return TRUE + +/** + * Absorb a number of seconds of stuns. + * If we hit the max amount of absorption, we will qdel ourself in this proc. + * + * * amount - this is the number of deciseconds being absorbed at once. + * + * Returns TRUE on successful absorption, or FALSE otherwise. + */ +/datum/status_effect/stun_absorption/proc/absorb_stun(amount) + if(!can_absorb_stun()) + return FALSE + + // Now we gotta check that no other stun absorption we have is blocking us + for(var/datum/status_effect/stun_absorption/similar_effect in owner.status_effects) + if(similar_effect == src) + continue + // they blocked a stun this tick that resulted in them qdeling, so disregard + if(QDELING(similar_effect)) + continue + // if we have another stun absorption with higher priority, + // don't do anything, let them handle it instead + if(similar_effect.priority > priority) + return FALSE + + // At this point, a stun was successfully absorbed + + // Only do effects if the amount was > 0 seconds + if(amount > 0 SECONDS) + // Show the message + if(shown_message) + // We do this replacement meme, instead of just setting it up in creation, + // so that we respect indentity changes done while active + var/really_shown_message = replacetext(shown_message, "%EFFECT_OWNER", "[owner]") + owner.visible_message(really_shown_message, ignored_mobs = owner) + + // Send the self message + if(self_message) + to_chat(owner, self_message) + + // Count seconds absorbed + seconds_of_stuns_absorbed += amount + if(delete_after_passing_max) + if(seconds_of_stuns_absorbed >= max_seconds_of_stuns_blocked) + qdel(src) + + else if(recharge_time > 0 SECONDS) + addtimer(CALLBACK(src, PROC_REF(recharge_absorption), amount), recharge_time) + + return TRUE + +/// Used in callbacks to "recharge" the effect after passing the max seconds of stuns blocked. +/datum/status_effect/stun_absorption/proc/recharge_absorption(amount) + seconds_of_stuns_absorbed = max(seconds_of_stuns_absorbed - amount, 0) + +/** + * [proc/apply_status_effect] wrapper specifically for [/datum/status_effect/stun_absorption], + * specifically so that it's easier to apply stun absorptions with named arguments. + * + * If the mob already has a stun absorption from the same source, will not re-apply the effect, + * unless the new effect's priority is higher than the old effect's priority. + * + * Arguments + * * source - the source of the stun absorption. + * * duration - how long does the stun absorption last before it ends? -1 or null (or infinity) = infinite duration + * * priority - what is this effect's priority to other stun absorptions? higher = more priority + * * message - optional, "other message" arg of visible message, shown on trigger. Use %EFFECT_OWNER if you want the owner's name to be inserted. + * * self_message - optional, "self message" arg of visible message, shown on trigger + * * examine_message - optional, what is shown on examine of the mob. + * * max_seconds_of_stuns_blocked - optional, how many seconds of stuns can it block before deleting? the stun that breaks over this number is still blocked, even if it is much higher. + * * delete_after_passing_max - optional, if TRUE, after passing the max seconds of stuns blocked, we will delete ourself. + * If FALSE, we will instead recharge after some time. + * * recharge_time - optional, if [delete_after_passing_max] is FALSE, this is how long we will wait before recharging. + * does nothing if [delete_after_passing_max] is TRUE. + * + * Returns an instance of a stun absorption effect, or NULL if failure + */ +/mob/living/proc/add_stun_absorption( + source, + duration, + priority = -1, + message, + self_message, + examine_message, + max_seconds_of_stuns_blocked = INFINITY, + delete_after_passing_max = TRUE, + recharge_time, + recharge_alert, +) + + // Handle duplicate sources + for(var/datum/status_effect/stun_absorption/existing_effect in status_effects) + if(existing_effect.source != source) + continue + + // If an existing effect's priority is greater or equal to our passed priority... + if(existing_effect.priority >= priority) + // don't bother re-applying the effect, and return + return + + // otherwise, delete existing and replace with new + qdel(existing_effect) + + return apply_status_effect( + /datum/status_effect/stun_absorption, + source, + duration, + priority, + message, + self_message, + examine_message, + max_seconds_of_stuns_blocked, + delete_after_passing_max, + recharge_time, + ) + +/** + * Removes all stub absorptions with the passed source. + * + * Returns TRUE if an effect was deleted, FALSE otherwise + */ +/mob/living/proc/remove_stun_absorption(source) + . = FALSE + for(var/datum/status_effect/stun_absorption/effect in status_effects) + if(effect.source != source) + continue + + qdel(effect) + . = TRUE + + return . diff --git a/code/datums/status_effects/debuffs/blindness.dm b/code/datums/status_effects/debuffs/blindness.dm index 0bfaaee7485be..65354643123d4 100644 --- a/code/datums/status_effects/debuffs/blindness.dm +++ b/code/datums/status_effects/debuffs/blindness.dm @@ -100,7 +100,7 @@ /datum/status_effect/temporary_blindness/on_remove() owner.cure_blind(id) -/datum/status_effect/temporary_blindness/tick(seconds_per_tick, times_fired) +/datum/status_effect/temporary_blindness/tick(seconds_between_ticks) if(owner.stat == DEAD) return @@ -116,7 +116,7 @@ return // Otherwise add a chance to let them know that it's working - else if(SPT_PROB(5, seconds_per_tick)) + else if(SPT_PROB(5, seconds_between_ticks)) var/obj/item/thing_covering_eyes = owner.is_eyes_covered() // "Your blindfold soothes your eyes", for example to_chat(owner, span_green("Your [thing_covering_eyes?.name || "eye covering"] soothes your eyes.")) diff --git a/code/datums/status_effects/debuffs/choke.dm b/code/datums/status_effects/debuffs/choke.dm index f688e57c322bf..c16b946aa02bd 100644 --- a/code/datums/status_effects/debuffs/choke.dm +++ b/code/datums/status_effects/debuffs/choke.dm @@ -110,7 +110,7 @@ if(choking_on && iscarbon(owner)) var/mob/living/carbon/carbon_owner = owner // This will yeet the thing we're choking on out of us - carbon_owner.vomit(lost_nutrition = 20, force = TRUE, distance = 2) + carbon_owner.vomit(vomit_flags = (VOMIT_CATEGORY_DEFAULT | MOB_VOMIT_FORCE), lost_nutrition = 20, distance = 2) /datum/status_effect/choke/proc/on_vomit(mob/source, distance, force) SIGNAL_HANDLER @@ -122,7 +122,7 @@ choking_on.throw_at(target, distance, 1, source) /datum/status_effect/choke/get_examine_text() - return span_boldwarning("[owner.p_they(TRUE)] [owner.p_are()] choking!") + return span_boldwarning("[owner.p_They()] [owner.p_are()] choking!") /datum/status_effect/choke/proc/remove_choke(datum/source) SIGNAL_HANDLER @@ -215,8 +215,8 @@ if(iscarbon(victim)) var/mob/living/carbon/carbon_victim = victim var/obj/item/bodypart/chest = carbon_victim.get_bodypart(BODY_ZONE_CHEST) - if(chest) - chest.force_wound_upwards(/datum/wound/blunt/severe, wound_source = "human force to the chest") + carbon_victim.cause_wound_of_type_and_severity(WOUND_BLUNT, chest, WOUND_SEVERITY_SEVERE, wound_source = "human force to the chest") + playsound(owner, 'sound/creatures/crack_vomit.ogg', 120, extrarange = 5, falloff_exponent = 4) vomit_up() @@ -267,23 +267,23 @@ victim.adjustBruteLoss(0.2) return TRUE -/datum/status_effect/choke/tick(seconds_per_tick) +/datum/status_effect/choke/tick(seconds_between_ticks) if(!should_do_effects()) return - deal_damage(seconds_per_tick) + deal_damage(seconds_between_ticks) var/client/client_owner = owner.client if(client_owner) do_vfx(client_owner) -/datum/status_effect/choke/proc/deal_damage(seconds_per_tick) - owner.losebreath += 1 * seconds_per_tick // 1 breath loss a second. This will deal additional breath damage, and prevent breathing +/datum/status_effect/choke/proc/deal_damage(seconds_between_ticks) + owner.losebreath += 1 * seconds_between_ticks // 1 breath loss a second. This will deal additional breath damage, and prevent breathing if(flaming) var/obj/item/bodypart/head = owner.get_bodypart(BODY_ZONE_HEAD) if(head) - head.receive_damage(0, 2 * seconds_per_tick, damage_source = "choking") - owner.adjustStaminaLoss(2 * seconds_per_tick) + head.receive_damage(0, 2 * seconds_between_ticks, damage_source = "choking") + owner.adjustStaminaLoss(2 * seconds_between_ticks) /datum/status_effect/choke/proc/do_vfx(client/vfx_on) var/old_x = delta_x diff --git a/code/datums/status_effects/debuffs/confusion.dm b/code/datums/status_effects/debuffs/confusion.dm index 0f8f0ef3187b5..881eb6a5c36c5 100644 --- a/code/datums/status_effects/debuffs/confusion.dm +++ b/code/datums/status_effects/debuffs/confusion.dm @@ -31,7 +31,7 @@ var/direction = move_args[MOVE_ARG_DIRECTION] var/new_dir - if(time_left > CONFUSION_FULL_THRESHOLD) + if(time_left > CONFUSION_FULL_THRESHOLD && !owner.resting) new_dir = pick(GLOB.alldirs) else if(prob(time_left * CONFUSION_SIDEWAYS_MOVE_PROB_PER_SECOND)) diff --git a/code/datums/status_effects/debuffs/cursed.dm b/code/datums/status_effects/debuffs/cursed.dm new file mode 100644 index 0000000000000..8d331bbe90add --- /dev/null +++ b/code/datums/status_effects/debuffs/cursed.dm @@ -0,0 +1,195 @@ +#define DEFAULT_MAX_CURSE_COUNT 5 + +/// Status effect that gives the target miscellanous debuffs while throwing a status alert and causing them to smoke from the damage they're incurring. +/// Purposebuilt for cursed slot machines. +/datum/status_effect/grouped/cursed + id = "cursed" + alert_type = /atom/movable/screen/alert/status_effect/cursed + remove_on_fullheal = TRUE + heal_flag_necessary = HEAL_ADMIN + /// The max number of curses a target can incur with this status effect. + var/max_curse_count = DEFAULT_MAX_CURSE_COUNT + /// The amount of times we have been "applied" to the target. + var/curse_count = 0 + /// Raw probability we have to deal damage this tick. + var/damage_chance = 10 + /// Are we currently in the process of sending a monologue? + var/monologuing = FALSE + /// The hand we are branded to. + var/obj/item/bodypart/branded_hand = null + /// The cached path of the particles we're using to smoke + var/smoke_path = null + +/datum/status_effect/grouped/cursed/on_apply() + RegisterSignal(owner, COMSIG_MOB_STATCHANGE, PROC_REF(on_stat_changed)) + RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(on_death)) + RegisterSignal(owner, COMSIG_CURSED_SLOT_MACHINE_USE, PROC_REF(check_curses)) + RegisterSignal(owner, COMSIG_CURSED_SLOT_MACHINE_LOST, PROC_REF(update_curse_count)) + RegisterSignal(SSdcs, COMSIG_GLOB_CURSED_SLOT_MACHINE_WON, PROC_REF(clear_curses)) + return ..() + +/datum/status_effect/grouped/cursed/Destroy() + UnregisterSignal(SSdcs, COMSIG_GLOB_CURSED_SLOT_MACHINE_WON) + branded_hand = null + return ..() + +/// Checks the number of curses we have and returns information back to the slot machine. `max_curse_amount` is set by the slot machine itself. +/datum/status_effect/grouped/cursed/proc/check_curses(mob/user, max_curse_amount) + SIGNAL_HANDLER + if(curse_count >= max_curse_amount) + return SLOT_MACHINE_USE_CANCEL + + if(monologuing) + to_chat(owner, span_warning("Your arm is resisting your attempts to pull the lever!")) // listening to kitschy monologues to postpone your powergaming is the true curse here. + return SLOT_MACHINE_USE_POSTPONE + +/// Handles the debuffs of this status effect and incrementing the number of curses we have. +/datum/status_effect/grouped/cursed/proc/update_curse_count() + SIGNAL_HANDLER + curse_count++ + + linked_alert?.update_appearance() // we may have not initialized it yet + + addtimer(CALLBACK(src, PROC_REF(handle_after_effects), 1 SECONDS)) // give it a second to let the failure sink in before we exact our toll + +/// Makes a nice lorey message about the curse level we're at. I think it's nice +/datum/status_effect/grouped/cursed/proc/handle_after_effects() + if(QDELETED(src)) + return + + monologuing = TRUE + var/list/messages = list() + switch(curse_count) + if(1) // basically your first is a "freebie" that will still require urgent medical attention and will leave you smoking forever but could be worse tbh + if(ishuman(owner)) + var/mob/living/carbon/human/human_owner = owner + playsound(human_owner, SFX_SEAR, 50, TRUE) + var/obj/item/bodypart/affecting = human_owner.get_active_hand() + branded_hand = affecting + affecting.force_wound_upwards(/datum/wound/burn/flesh/severe/cursed_brand, wound_source = "curse of the slot machine") + + messages += span_boldwarning("Your hand burns, and you quickly let go of the lever! You feel a little sick as the nerves deaden in your hand...") + messages += span_boldwarning("Some smoke appears to be coming out of your hand now, but it's not too bad...") + messages += span_boldwarning("Fucking stupid machine.") + + if(2) + messages += span_boldwarning("The machine didn't burn you this time, it must be some arcane work of the brand recognizing a source...") + messages += span_boldwarning("Blisters and boils start to appear over your skin. Each one hissing searing hot steam out of its own pocket...") + messages += span_boldwarning("You understand that the machine tortures you with its simplistic allure. It can kill you at any moment, but it derives a sick satisfaction at forcing you to keep going.") + messages += span_boldwarning("If you could get away from here, you might be able to live with some medical supplies. Is it too late to stop now?") + messages += span_boldwarning("As you shut your eyes to dwell on this conundrum, the brand surges in pain. You shudder to think what might happen if you go unconscious.") + + if(3) + owner.emote("cough") + messages += span_boldwarning("Your throat becomes to feel like it's slowly caking up with sand and dust. You eject the contents of the back of your throat onto your sleeve.") + messages += span_boldwarning("It is sand. Crimson red. You've never felt so thirsty in your life, yet you don't trust your own hand to carry the glass to your lips.") + messages += span_boldwarning("You get the sneaking feeling that if someone else were to win, that it might clear your curse too. Saving your life is a noble cause.") + messages += span_boldwarning("Of course, you might have to not speak on the nature of this machine, in case they scamper off to leave you to die.") + messages += span_boldwarning("Is it truly worth it to condemn someone to this fate to cure the manifestation of your own hedonistic urges? You'll have to decide quickly.") + + if(4) + messages += span_boldwarning("A migraine swells over your head as your thoughts become hazy. Your hand desperately inches closer towards the slot machine for one final pull...") + messages += span_boldwarning("The ultimate test of mind over matter. You can jerk your own muscle back in order to prevent a terrible fate, but your life already is worth so little now.") + messages += span_boldwarning("This is what they want, is it not? To witness your failure against itself? The compulsion carries you forward as a sinking feeling of dread fills your stomach.") + messages += span_boldwarning("Paradoxically, where there is hopelessness, there is elation. Elation at the fact that there's still enough power in you for one more pull.") + messages += span_boldwarning("Your legs desperate wish to jolt away on the thought of running away from this wretched machination, but your own arm remains complacent in the thought of seeing spinning wheels.") + messages += span_userdanger("The toll has already been exacted. There is no longer death on 'your' terms. Is your dignity worth more than your life?") + + if(5 to INFINITY) + if(max_curse_count != DEFAULT_MAX_CURSE_COUNT) // this probably will only happen through admin schenanigans letting people stack up infinite curses or something + to_chat(owner, span_boldwarning("Do you still think you're in control?")) + return + + to_chat(owner, span_userdanger("Why couldn't I get one more try?!")) + owner.investigate_log("has been gibbed by the cursed status effect after accumulating [curse_count] curses.", INVESTIGATE_DEATHS) + owner.gib(DROP_ALL_REMAINS) + qdel(src) + return + + for(var/message in messages) + to_chat(owner, message) + sleep(1.5 SECONDS) // yes yes a bit fast but it can be a lot of text and i want the whole thing to send before the cooldown on the slot machine might expire + monologuing = FALSE + +/// Cleans ourselves up and removes our curses. Meant to be done in a "positive" way, when the curse is broken. Directly use qdel otherwise. +/datum/status_effect/grouped/cursed/proc/clear_curses() + SIGNAL_HANDLER + + if(!isnull(branded_hand)) + var/datum/wound/brand = branded_hand.get_wound_type(/datum/wound/burn/flesh/severe/cursed_brand) + brand?.remove_wound() + + owner.visible_message( + span_notice("The smoke slowly clears from [owner.name]..."), + span_notice("Your skin finally settles down and your throat no longer feels as dry... The brand disappearing confirms that the curse has been lifted."), + ) + QDEL_NULL(particle_effect) + qdel(src) + +/// If our owner's stat changes, rapidly surge the damage chance. +/datum/status_effect/grouped/cursed/proc/on_stat_changed() + SIGNAL_HANDLER + if(owner.stat == CONSCIOUS || owner.stat == DEAD) // reset on these two states + damage_chance = initial(damage_chance) + return + + to_chat(owner, span_userdanger("As your body crumbles, you feel the curse of the slot machine surge through your body!")) + damage_chance += 75 //ruh roh raggy + +/// If our owner dies without getting gibbed (as in of other causes), stop smoking because we've "expended all the life energy". +/datum/status_effect/grouped/cursed/proc/on_death(mob/living/source, gibbed) + SIGNAL_HANDLER + + if(gibbed) + return + + QDEL_NULL(particle_effect) + +/datum/status_effect/grouped/cursed/update_particles() + var/particle_path = /particles/smoke/steam/mild + switch(curse_count) + if(2 to 3) + particle_path = /particles/smoke/steam + if(4 to INFINITY) + particle_path = /particles/smoke/steam/bad + + if(smoke_path == particle_path) + return + + QDEL_NULL(particle_effect) + smoke_path = particle_path + particle_effect = new(owner, particle_path) + +/datum/status_effect/grouped/cursed/tick(seconds_between_ticks) + if(curse_count <= 1) + return // you get one "freebie" (single damage) to nudge you into thinking this is a bad idea before the house begins to win. + + // the house won. + var/ticked_coefficient = (rand(15, 40) / 100) + var/effective_percentile_chance = ((curse_count == 2 ? 1 : curse_count) * damage_chance * ticked_coefficient) + + if(SPT_PROB(effective_percentile_chance, seconds_between_ticks)) + owner.apply_damages( + brute = (curse_count * ticked_coefficient), + burn = (curse_count * ticked_coefficient), + oxy = (curse_count * ticked_coefficient), + ) + +/atom/movable/screen/alert/status_effect/cursed + name = "Cursed!" + desc = "The brand on your hand reminds you of your greed, yet you seem to be okay otherwise." + icon_state = "cursed_by_slots" + +/atom/movable/screen/alert/status_effect/cursed/update_desc() + . = ..() + var/datum/status_effect/grouped/cursed/linked_effect = attached_effect + var/curses = linked_effect.curse_count + switch(curses) + if(2) + desc = "Your greed is catching up to you..." + if(3) + desc = "You really don't feel good right now... But why stop now?" + if(4 to INFINITY) + desc = "Real winners quit before they reach the ultimate prize." + +#undef DEFAULT_MAX_CURSE_COUNT diff --git a/code/datums/status_effects/debuffs/cyborg.dm b/code/datums/status_effects/debuffs/cyborg.dm new file mode 100644 index 0000000000000..0f95b494197a4 --- /dev/null +++ b/code/datums/status_effects/debuffs/cyborg.dm @@ -0,0 +1,22 @@ +/// Reduce a cyborg's speed when you throw things at it +/datum/status_effect/borg_throw_slow + id = "borg_throw_slowdown" + alert_type = /atom/movable/screen/alert/status_effect/borg_throw_slow + duration = 3 SECONDS + status_type = STATUS_EFFECT_REPLACE + +/datum/status_effect/borg_throw_slow/on_apply() + . = ..() + owner.add_movespeed_modifier(/datum/movespeed_modifier/borg_throw, update = TRUE) + +/datum/status_effect/borg_throw_slow/on_remove() + . = ..() + owner.remove_movespeed_modifier(/datum/movespeed_modifier/borg_throw, update = TRUE) + +/atom/movable/screen/alert/status_effect/borg_throw_slow + name = "Percussive Maintenance" + desc = "A sudden impact has triggered your collision avoidance routines, reducing movement speed." + icon_state = "weaken" + +/datum/movespeed_modifier/borg_throw + multiplicative_slowdown = 0.9 diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm index fba258136ed28..44ad9313c8fe1 100644 --- a/code/datums/status_effects/debuffs/debuffs.dm +++ b/code/datums/status_effects/debuffs/debuffs.dm @@ -1,7 +1,12 @@ +/// The damage healed per tick while sleeping without any modifiers +#define HEALING_SLEEP_DEFAULT 0.2 +/// The sleep healing multipler for organ passive healing (since organs heal slowly) +#define HEALING_SLEEP_ORGAN_MULTIPLIER 5 + //Largely negative status effects go here, even if they have small benificial effects //STUN EFFECTS /datum/status_effect/incapacitating - tick_interval = 0 + tick_interval = -1 status_type = STATUS_EFFECT_REPLACE alert_type = null remove_on_fullheal = TRUE @@ -113,7 +118,7 @@ REMOVE_TRAIT(owner, TRAIT_KNOCKEDOUT, TRAIT_STATUS_EFFECT(id)) return ..() -/datum/status_effect/incapacitating/unconscious/tick() +/datum/status_effect/incapacitating/unconscious/tick(seconds_between_ticks) if(owner.getStaminaLoss()) owner.adjustStaminaLoss(-0.3) //reduce stamina loss by 0.3 per tick, 6 per 2 seconds @@ -129,9 +134,10 @@ . = ..() if(!.) return - if(!HAS_TRAIT(owner, TRAIT_SLEEPIMMUNE)) - ADD_TRAIT(owner, TRAIT_KNOCKEDOUT, TRAIT_STATUS_EFFECT(id)) + if(HAS_TRAIT(owner, TRAIT_SLEEPIMMUNE)) tick_interval = -1 + else + ADD_TRAIT(owner, TRAIT_KNOCKEDOUT, 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)) @@ -154,9 +160,7 @@ ADD_TRAIT(owner, TRAIT_KNOCKEDOUT, TRAIT_STATUS_EFFECT(id)) tick_interval = initial(tick_interval) -#define HEALING_SLEEP_DEFAULT 0.2 - -/datum/status_effect/incapacitating/sleeping/tick() +/datum/status_effect/incapacitating/sleeping/tick(seconds_between_ticks) if(owner.maxHealth) var/health_ratio = owner.health / owner.maxHealth var/healing = HEALING_SLEEP_DEFAULT @@ -202,11 +206,26 @@ if(locate(/obj/item/pillow) in owner.loc) healing += 0.1 - if(healing > 0 && health_ratio > 0.8) - owner.adjustBruteLoss(-1 * healing, required_bodytype = BODYTYPE_ORGANIC) - owner.adjustFireLoss(-1 * healing, required_bodytype = BODYTYPE_ORGANIC) - owner.adjustToxLoss(-1 * healing * 0.5, TRUE, TRUE, required_biotype = MOB_ORGANIC) - owner.adjustStaminaLoss(min(-1 * healing, -1 * HEALING_SLEEP_DEFAULT)) + var/need_mob_update = FALSE + if(healing > 0) + if(iscarbon(owner)) + var/mob/living/carbon/carbon_owner = owner + for(var/obj/item/organ/target_organ as anything in carbon_owner.organs) + // no healing boost for robotic or dying organs + if(IS_ROBOTIC_ORGAN(target_organ) || !target_organ.damage || target_organ.organ_flags & ORGAN_FAILING) + continue + + // organ regeneration is very low so we crank up the healing rate to give a good bonus + var/healing_bonus = target_organ.healing_factor * healing * HEALING_SLEEP_ORGAN_MULTIPLIER + target_organ.apply_organ_damage(-healing_bonus * target_organ.maxHealth) + + if(health_ratio > 0.8) // only heals minor physical damage + need_mob_update += owner.adjustBruteLoss(-0.4 * healing * seconds_between_ticks, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + need_mob_update += owner.adjustFireLoss(-0.4 * healing * seconds_between_ticks, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + need_mob_update += owner.adjustToxLoss(-0.2 * healing * seconds_between_ticks, updating_health = FALSE, forced = TRUE, required_biotype = MOB_ORGANIC) + need_mob_update += owner.adjustStaminaLoss(min(-0.4 * healing * seconds_between_ticks, -0.4 * HEALING_SLEEP_DEFAULT * seconds_between_ticks), updating_stamina = FALSE) + if(need_mob_update) + owner.updatehealth() // Drunkenness gets reduced by 0.3% per tick (6% per 2 seconds) owner.set_drunk_effect(owner.get_drunk_amount() * 0.997) @@ -217,8 +236,6 @@ if(prob(2) && owner.health > owner.crit_threshold) owner.emote("snore") -#undef HEALING_SLEEP_DEFAULT - /atom/movable/screen/alert/status_effect/asleep name = "Asleep" desc = "You've fallen asleep. Wait a bit and you should wake up. Unless you don't, considering how helpless you are." @@ -236,7 +253,7 @@ var/delta = world.time - last_dead_time var/new_timeofdeath = owner.timeofdeath + delta owner.timeofdeath = new_timeofdeath - owner.tod = station_time_timestamp(wtime=new_timeofdeath) + owner.station_timestamp_timeofdeath = station_time_timestamp(wtime=new_timeofdeath) last_dead_time = null if(owner.stat == DEAD) last_dead_time = world.time @@ -251,7 +268,7 @@ . = ..() if(!.) return - owner.add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), TRAIT_STATUS_EFFECT(id)) + owner.add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED, TRAIT_STASIS), TRAIT_STATUS_EFFECT(id)) owner.add_filter("stasis_status_ripple", 2, list("type" = "ripple", "flags" = WAVE_BOUNDED, "radius" = 0, "size" = 2)) var/filter = owner.get_filter("stasis_status_ripple") animate(filter, radius = 0, time = 0.2 SECONDS, size = 2, easing = JUMP_EASING, loop = -1, flags = ANIMATION_PARALLEL) @@ -260,11 +277,11 @@ var/mob/living/carbon/carbon_owner = owner carbon_owner.update_bodypart_bleed_overlays() -/datum/status_effect/grouped/stasis/tick() +/datum/status_effect/grouped/stasis/tick(seconds_between_ticks) update_time_of_death() /datum/status_effect/grouped/stasis/on_remove() - owner.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), TRAIT_STATUS_EFFECT(id)) + owner.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED, TRAIT_STASIS), TRAIT_STATUS_EFFECT(id)) owner.remove_filter("stasis_status_ripple") update_time_of_death() if(iscarbon(owner)) @@ -280,7 +297,7 @@ /datum/status_effect/his_wrath //does minor damage over time unless holding His Grace id = "his_wrath" duration = -1 - tick_interval = 4 + tick_interval = 0.4 SECONDS alert_type = /atom/movable/screen/alert/status_effect/his_wrath /atom/movable/screen/alert/status_effect/his_wrath @@ -289,13 +306,16 @@ icon_state = "his_grace" alerttooltipstyle = "hisgrace" -/datum/status_effect/his_wrath/tick() +/datum/status_effect/his_wrath/tick(seconds_between_ticks) for(var/obj/item/his_grace/HG in owner.held_items) qdel(src) return - owner.adjustBruteLoss(0.1) - owner.adjustFireLoss(0.1) - owner.adjustToxLoss(0.2, TRUE, TRUE) + var/need_mob_update + need_mob_update = owner.adjustBruteLoss(0.04 * seconds_between_ticks, updating_health = FALSE) + need_mob_update += owner.adjustFireLoss(0.04 * seconds_between_ticks, updating_health = FALSE) + need_mob_update += owner.adjustToxLoss(0.08 * seconds_between_ticks, updating_health = FALSE, forced = TRUE) + if(need_mob_update) + owner.updatehealth() /datum/status_effect/cultghost //is a cult ghost and can't use manifest runes id = "cult_ghost" @@ -306,7 +326,7 @@ owner.set_invis_see(SEE_INVISIBLE_OBSERVER) return TRUE -/datum/status_effect/cultghost/tick() +/datum/status_effect/cultghost/tick(seconds_between_ticks) if(owner.reagents) owner.reagents.del_reagent(/datum/reagent/water/holywater) //can't be deconverted @@ -346,7 +366,7 @@ /datum/status_effect/stacking/saw_bleed id = "saw_bleed" - tick_interval = 6 + tick_interval = 0.6 SECONDS delay_before_decay = 5 stack_threshold = 10 max_stacks = 10 @@ -386,7 +406,7 @@ return FALSE return TRUE -/datum/status_effect/neck_slice/tick() +/datum/status_effect/neck_slice/tick(seconds_between_ticks) var/obj/item/bodypart/throat = owner.get_bodypart(BODY_ZONE_HEAD) if(owner.stat == DEAD || !throat) // they can lose their head while it's going. qdel(src) @@ -394,7 +414,9 @@ var/still_bleeding = FALSE for(var/datum/wound/bleeding_thing as anything in throat.wounds) - if(bleeding_thing.wound_type == WOUND_SLASH && bleeding_thing.severity > WOUND_SEVERITY_MODERATE) + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[bleeding_thing.type] + + if(pregen_data.wounding_types_valid(list(WOUND_SLASH)) && bleeding_thing.severity > WOUND_SEVERITY_MODERATE && bleeding_thing.blood_flow > 0) still_bleeding = TRUE break if(!still_bleeding) @@ -405,7 +427,7 @@ owner.emote(pick("gasp", "gag", "choke")) /datum/status_effect/neck_slice/get_examine_text() - return span_warning("[owner.p_their(TRUE)] neck is cut and is bleeding profusely!") + return span_warning("[owner.p_Their()] neck is cut and is bleeding profusely!") /mob/living/proc/apply_necropolis_curse(set_curse) var/datum/status_effect/necropolis_curse/C = has_status_effect(/datum/status_effect/necropolis_curse) @@ -420,8 +442,8 @@ /datum/status_effect/necropolis_curse id = "necrocurse" - duration = 6000 //you're cursed for 10 minutes have fun - tick_interval = 50 + duration = 10 MINUTES //you're cursed for 10 minutes have fun + tick_interval = 5 SECONDS alert_type = null var/curse_flags = NONE var/effect_last_activation = 0 @@ -452,7 +474,7 @@ owner.clear_fullscreen("curse", 50) curse_flags &= ~remove_curse -/datum/status_effect/necropolis_curse/tick() +/datum/status_effect/necropolis_curse/tick(seconds_between_ticks) if(owner.stat == DEAD) return if(curse_flags & CURSE_WASTING) @@ -518,7 +540,7 @@ id = "trance" status_type = STATUS_EFFECT_UNIQUE duration = 300 - tick_interval = 10 + tick_interval = 1 SECONDS var/stun = TRUE alert_type = /atom/movable/screen/alert/status_effect/trance @@ -527,7 +549,7 @@ desc = "Everything feels so distant, and you can feel your thoughts forming loops inside your head..." icon_state = "high" -/datum/status_effect/trance/tick() +/datum/status_effect/trance/tick(seconds_between_ticks) if(stun) owner.Stun(6 SECONDS, TRUE) owner.set_dizzy(40 SECONDS) @@ -555,7 +577,7 @@ to_chat(owner, span_warning("You snap out of your trance!")) /datum/status_effect/trance/get_examine_text() - return span_warning("[owner.p_they(TRUE)] seem[owner.p_s()] slow and unfocused.") + return span_warning("[owner.p_They()] seem[owner.p_s()] slow and unfocused.") /datum/status_effect/trance/proc/hypnotize(datum/source, list/hearing_args) SIGNAL_HANDLER @@ -578,7 +600,7 @@ status_type = STATUS_EFFECT_MULTIPLE alert_type = null -/datum/status_effect/spasms/tick() +/datum/status_effect/spasms/tick(seconds_between_ticks) if(owner.stat >= UNCONSCIOUS) return if(!prob(15)) @@ -640,7 +662,7 @@ . = ..() to_chat(zappy_boy, span_boldwarning("You feel a shock moving through your body! Your hands start shaking!")) -/datum/status_effect/convulsing/tick() +/datum/status_effect/convulsing/tick(seconds_between_ticks) var/mob/living/carbon/H = owner if(prob(40)) var/obj/item/I = H.get_active_held_item() @@ -669,7 +691,7 @@ /datum/status_effect/dna_melt/on_remove() if(!ishuman(owner)) - owner.gib() //fuck you in particular + owner.gib(DROP_ALL_REMAINS) //fuck you in particular return var/mob/living/carbon/human/H = owner INVOKE_ASYNC(H, TYPE_PROC_REF(/mob/living/carbon/human, something_horrible), kill_either_way) @@ -683,7 +705,7 @@ id = "go_away" duration = 100 status_type = STATUS_EFFECT_REPLACE - tick_interval = 1 + tick_interval = 0.2 SECONDS alert_type = /atom/movable/screen/alert/status_effect/go_away var/direction @@ -692,7 +714,7 @@ direction = pick(NORTH, SOUTH, EAST, WEST) new_owner.setDir(direction) -/datum/status_effect/go_away/tick() +/datum/status_effect/go_away/tick(seconds_between_ticks) owner.AdjustStun(1, ignore_canstun = TRUE) var/turf/T = get_step(owner, direction) owner.forceMove(T) @@ -704,13 +726,13 @@ /datum/status_effect/fake_virus id = "fake_virus" - duration = 1800//3 minutes + duration = 3 MINUTES //3 minutes status_type = STATUS_EFFECT_REPLACE - tick_interval = 1 + tick_interval = 0.2 SECONDS alert_type = null var/msg_stage = 0//so you dont get the most intense messages immediately -/datum/status_effect/fake_virus/tick() +/datum/status_effect/fake_virus/tick(seconds_between_ticks) var/fake_msg = "" var/fake_emote = "" switch(msg_stage) @@ -798,11 +820,12 @@ return COMPONENT_CLEANED /datum/status_effect/ants/get_examine_text() - return span_warning("[owner.p_they(TRUE)] [owner.p_are()] covered in ants!") + return span_warning("[owner.p_They()] [owner.p_are()] covered in ants!") -/datum/status_effect/ants/tick() +/datum/status_effect/ants/tick(seconds_between_ticks) 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. + var/need_mob_update + need_mob_update = victim.adjustBruteLoss(max(0.1, round((ants_remaining * 0.0016) * seconds_between_ticks,0.1)), updating_health = FALSE) //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(prob(15)) switch(rand(1,2)) @@ -815,20 +838,22 @@ if (1 to 8) //16% Chance var/obj/item/bodypart/head/hed = victim.get_bodypart(BODY_ZONE_HEAD) to_chat(victim, span_danger("You scratch at the ants on your scalp!.")) - hed.receive_damage(1,0) + need_mob_update += hed.receive_damage(brute = 0.4 * seconds_between_ticks, burn = 0, updating_health = FALSE) if (9 to 29) //40% chance var/obj/item/bodypart/arm = victim.get_bodypart(pick(BODY_ZONE_L_ARM,BODY_ZONE_R_ARM)) to_chat(victim, span_danger("You scratch at the ants on your arms!")) - arm.receive_damage(3,0) + need_mob_update += arm.receive_damage(brute = 1.2 * seconds_between_ticks, burn = 0, updating_health = FALSE) if (30 to 49) //38% chance var/obj/item/bodypart/leg = victim.get_bodypart(pick(BODY_ZONE_L_LEG,BODY_ZONE_R_LEG)) to_chat(victim, span_danger("You scratch at the ants on your leg!")) - leg.receive_damage(3,0) + need_mob_update += leg.receive_damage(brute = 1.2 * seconds_between_ticks, burn = 0, updating_health = FALSE) if(50) // 2% chance to_chat(victim, span_danger("You rub some ants away from your eyes!")) victim.set_eye_blur_if_lower(6 SECONDS) ants_remaining -= 5 // To balance out the blindness, it'll be a little shorter. ants_remaining-- + if(need_mob_update) + victim.updatehealth() if(ants_remaining <= 0 || victim.stat >= HARD_CRIT) 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. @@ -915,7 +940,98 @@ id = "teleport_madness" duration = 10 SECONDS status_type = STATUS_EFFECT_REPLACE - tick_interval = 0.1 SECONDS + tick_interval = 0.2 SECONDS -/datum/status_effect/teleport_madness/tick() +/datum/status_effect/teleport_madness/tick(seconds_between_ticks) dump_in_space(owner) + +/datum/status_effect/careful_driving + id = "careful_driving" + alert_type = /atom/movable/screen/alert/status_effect/careful_driving + duration = 5 SECONDS + status_type = STATUS_EFFECT_REPLACE + +/datum/status_effect/careful_driving/on_apply() + . = ..() + owner.add_movespeed_modifier(/datum/movespeed_modifier/careful_driving, update = TRUE) + +/datum/status_effect/careful_driving/on_remove() + . = ..() + owner.remove_movespeed_modifier(/datum/movespeed_modifier/careful_driving, update = TRUE) + +/atom/movable/screen/alert/status_effect/careful_driving + name = "Careful Driving" + desc = "That was close! You almost ran that one over!" + icon_state = "paralysis" + +/datum/movespeed_modifier/careful_driving + multiplicative_slowdown = 3 + +/datum/status_effect/midas_blight + id = "midas_blight" + alert_type = /atom/movable/screen/alert/status_effect/midas_blight + status_type = STATUS_EFFECT_REPLACE + tick_interval = 0.2 SECONDS + remove_on_fullheal = TRUE + + /// The visual overlay state, helps tell both you and enemies how much gold is in your system + var/midas_state = "midas_1" + /// How fast the gold in a person's system scales. + var/goldscale = 30 // x2.8 - Gives ~ 15u for 1 second + +/datum/status_effect/midas_blight/on_creation(mob/living/new_owner, duration = 1) + // Duration is already input in SECONDS + src.duration = duration + RegisterSignal(new_owner, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_update_overlays)) + return ..() + +/atom/movable/screen/alert/status_effect/midas_blight + name = "Midas Blight" + desc = "Your blood is being turned to gold, slowing your movements!" + icon_state = "midas_blight" + +/datum/status_effect/midas_blight/tick(seconds_between_ticks) + var/mob/living/carbon/human/victim = owner + // We're transmuting blood, time to lose some. + if(victim.blood_volume > BLOOD_VOLUME_SURVIVE + 50 && !HAS_TRAIT(victim, TRAIT_NOBLOOD)) + victim.blood_volume -= 5 * seconds_between_ticks + // This has been hell to try and balance so that you'll actually get anything out of it + victim.reagents.add_reagent(/datum/reagent/gold/cursed, amount = seconds_between_ticks * goldscale, no_react = TRUE) + var/current_gold_amount = victim.reagents.get_reagent_amount(/datum/reagent/gold, include_subtypes = TRUE) + switch(current_gold_amount) + if(-INFINITY to 50) + victim.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/midas_blight/soft, update = TRUE) + victim.add_actionspeed_modifier(/datum/actionspeed_modifier/status_effect/midas_blight/soft, update = TRUE) + midas_state = "midas_1" + if(50 to 100) + victim.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/midas_blight/medium, update = TRUE) + victim.add_actionspeed_modifier(/datum/actionspeed_modifier/status_effect/midas_blight/medium, update = TRUE) + midas_state = "midas_2" + if(100 to 200) + victim.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/midas_blight/hard, update = TRUE) + victim.add_actionspeed_modifier(/datum/actionspeed_modifier/status_effect/midas_blight/hard, update = TRUE) + midas_state = "midas_3" + if(200 to INFINITY) + victim.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/midas_blight/gold, update = TRUE) + victim.add_actionspeed_modifier(/datum/actionspeed_modifier/status_effect/midas_blight/gold, update = TRUE) + midas_state = "midas_4" + victim.update_icon() + if(victim.stat == DEAD) + qdel(src) // Dead people stop being turned to gold. Don't want people sitting on dead bodies. + +/datum/status_effect/midas_blight/proc/on_update_overlays(atom/parent_atom, list/overlays) + SIGNAL_HANDLER + + if(midas_state) + var/mutable_appearance/midas_overlay = mutable_appearance('icons/mob/effects/debuff_overlays.dmi', midas_state) + midas_overlay.blend_mode = BLEND_MULTIPLY + overlays += midas_overlay + +/datum/status_effect/midas_blight/on_remove() + owner.remove_movespeed_modifier(MOVESPEED_ID_MIDAS_BLIGHT, update = TRUE) + owner.remove_actionspeed_modifier(ACTIONSPEED_ID_MIDAS_BLIGHT, update = TRUE) + UnregisterSignal(owner, COMSIG_ATOM_UPDATE_OVERLAYS) + owner.update_icon() + +#undef HEALING_SLEEP_DEFAULT +#undef HEALING_SLEEP_ORGAN_MULTIPLIER diff --git a/code/datums/status_effects/debuffs/decloning.dm b/code/datums/status_effects/debuffs/decloning.dm new file mode 100644 index 0000000000000..0f76f10f470d9 --- /dev/null +++ b/code/datums/status_effects/debuffs/decloning.dm @@ -0,0 +1,86 @@ +/// The amount of mutadone we can process for strike recovery at once. +#define MUTADONE_HEAL 1 + +/datum/status_effect/decloning + id = "decloning" + tick_interval = 3 SECONDS + alert_type = /atom/movable/screen/alert/status_effect/decloning + remove_on_fullheal = TRUE + + /// How many strikes our status effect holder has left before they are dusted. + var/strikes_left = 100 + +/datum/status_effect/decloning/on_apply() + if(owner.has_reagent(/datum/reagent/medicine/mutadone)) + return FALSE + to_chat(owner, span_userdanger("You've noticed your body has begun deforming. This can't be good.")) + return TRUE + +/datum/status_effect/decloning/on_remove() + if(!QDELETED(owner)) // bigger problems to worry about + owner.remove_movespeed_modifier(/datum/movespeed_modifier/decloning) + +/datum/status_effect/decloning/tick(seconds_between_ticks) + if(owner.has_reagent(/datum/reagent/medicine/mutadone, MUTADONE_HEAL * seconds_between_ticks)) + var/strike_restore = MUTADONE_HEAL * seconds_between_ticks + + if(strikes_left <= 50 && strikes_left + strike_restore > 50) + to_chat(owner, span_notice("Controlling your muscles feels easier now.")) + owner.remove_movespeed_modifier(/datum/movespeed_modifier/decloning) + else if(SPT_PROB(5, seconds_between_ticks)) + to_chat(owner, span_warning("Your body is growing and shifting back into place.")) + + strikes_left = min(strikes_left + strike_restore, 100) + + owner.reagents.remove_reagent(/datum/reagent/medicine/mutadone, MUTADONE_HEAL * seconds_between_ticks) + + if(strikes_left == 100) + qdel(src) + + return + + if(!SPT_PROB(5, seconds_between_ticks)) + return + + var/strike_reduce = 3 + if(strikes_left > 50 && strikes_left - strike_reduce <= 50) + to_chat(owner, span_danger("You're having a hard time controlling your muscles.")) + owner.add_movespeed_modifier(/datum/movespeed_modifier/decloning) + + strikes_left = max(strikes_left - strike_reduce, 0) + + if(prob(50)) + to_chat(owner, span_danger(pick( + "Your body is giving in.", + "You feel some muscles twitching.", + "Your skin feels sandy.", + "You feel your limbs shifting around.", + ))) + else if(prob(33)) + to_chat(owner, span_danger("You are twitching uncontrollably.")) + owner.set_jitter_if_lower(30 SECONDS) + + if(strikes_left == 0) + owner.visible_message(span_danger("[owner]'s skin turns to dust!"), span_boldwarning("Your skin turns to dust!")) + owner.dust() + return + +/datum/status_effect/decloning/get_examine_text() + switch(strikes_left) + if(68 to 100) + return span_warning("[owner.p_Their()] body looks a bit deformed.") + if(34 to 67) + return span_warning("[owner.p_Their()] body looks very deformed.") + if(-INFINITY to 33) + return span_boldwarning("[owner.p_Their()] body looks severely deformed!") + +/atom/movable/screen/alert/status_effect/decloning + name = "Cellular Meltdown" + desc = "Your body is deforming, and doesn't feel like it's going to hold up much longer. You are going to need treatment soon." + icon_state = "dna_melt" + +/datum/movespeed_modifier/decloning + multiplicative_slowdown = 0.7 + blacklisted_movetypes = (FLYING|FLOATING) + +#undef MUTADONE_HEAL diff --git a/code/datums/status_effects/debuffs/dizziness.dm b/code/datums/status_effects/debuffs/dizziness.dm index ea820c80a5c6c..b47083aa5e37f 100644 --- a/code/datums/status_effects/debuffs/dizziness.dm +++ b/code/datums/status_effects/debuffs/dizziness.dm @@ -24,7 +24,7 @@ qdel(src) -/datum/status_effect/dizziness/tick() +/datum/status_effect/dizziness/tick(seconds_between_ticks) // How much time is left, in seconds var/amount = (duration - world.time) / 10 if(amount <= 0) @@ -34,13 +34,12 @@ // If we're resting, the effect is 5x as strong, but also decays 5x fast. // Meaning effectively, 1 tick is actually dizziness_strength ticks of duration var/dizziness_strength = owner.resting ? 5 : 1 - var/time_between_ticks = initial(tick_interval) // How much time will be left, in seconds, next tick - var/next_amount = max((amount - (dizziness_strength * time_between_ticks * 0.1)), 0) + var/next_amount = max((amount - (dizziness_strength * seconds_between_ticks * 0.1)), 0) // If we have a dizziness strength > 1, we will subtract ticks off of the total duration - if(remove_duration((dizziness_strength - 1) * time_between_ticks)) + if(remove_duration((dizziness_strength - 1) * seconds_between_ticks)) return // Now we can do the actual dizzy effects. diff --git a/code/datums/status_effects/debuffs/dna_transformation.dm b/code/datums/status_effects/debuffs/dna_transformation.dm new file mode 100644 index 0000000000000..33b6eb1d91344 --- /dev/null +++ b/code/datums/status_effects/debuffs/dna_transformation.dm @@ -0,0 +1,91 @@ +/// Transforms a carbon mob into a new DNA for a set amount of time, +/// then turns them back to how they were before transformation. +/datum/status_effect/temporary_transformation + id = "temp_dna_transformation" + tick_interval = -1 + duration = 1 MINUTES // set in on creation, this just needs to be any value to process + alert_type = null + /// A reference to a COPY of the DNA that the mob will be transformed into. + var/datum/dna/new_dna + /// A reference to a COPY of the DNA of the mob prior to transformation. + var/datum/dna/old_dna + +/datum/status_effect/temporary_transformation/Destroy() + . = ..() // parent must be called first, so we clear DNA refs AFTER transforming back... yeah i know + QDEL_NULL(new_dna) + QDEL_NULL(old_dna) + +/datum/status_effect/temporary_transformation/on_creation(mob/living/new_owner, new_duration = 1 MINUTES, datum/dna/dna_to_copy) + src.duration = (new_duration == INFINITY) ? -1 : new_duration + src.new_dna = new() + src.old_dna = new() + dna_to_copy.copy_dna(new_dna) + return ..() + +/datum/status_effect/temporary_transformation/on_apply() + if(!iscarbon(owner)) + return FALSE + + var/mob/living/carbon/transforming = owner + if(!transforming.has_dna()) + return FALSE + + // Save the old DNA + transforming.dna.copy_dna(old_dna) + // Makes them into the new DNA + new_dna.transfer_identity(transforming) + transforming.real_name = new_dna.real_name + transforming.name = transforming.get_visible_name() + transforming.updateappearance(mutcolor_update = TRUE) + transforming.domutcheck() + return TRUE + +/datum/status_effect/temporary_transformation/on_remove() + var/mob/living/carbon/transforming = owner + + if(!QDELING(owner)) // Don't really need to do appearance stuff if we're being deleted + old_dna.transfer_identity(transforming) + transforming.updateappearance(mutcolor_update = TRUE) + transforming.domutcheck() + + transforming.real_name = old_dna.real_name // Name is fine though + transforming.name = transforming.get_visible_name() + +/datum/status_effect/temporary_transformation/trans_sting + /// Tracks the time left on the effect when the owner last died. Used to pause the effect. + var/time_before_pause = -1 + /// Signals which we react to to determine if we should pause the effect. + var/static/list/update_on_signals = list( + COMSIG_MOB_STATCHANGE, + SIGNAL_ADDTRAIT(TRAIT_STASIS), + SIGNAL_REMOVETRAIT(TRAIT_STASIS), + SIGNAL_ADDTRAIT(TRAIT_DEATHCOMA), + SIGNAL_REMOVETRAIT(TRAIT_DEATHCOMA), + ) + +/datum/status_effect/temporary_transformation/trans_sting/on_apply() + . = ..() + if(!.) + return + RegisterSignals(owner, update_on_signals, PROC_REF(pause_effect)) + pause_effect(owner) // for if we sting a dead guy + +/datum/status_effect/temporary_transformation/trans_sting/on_remove() + . = ..() + UnregisterSignal(owner, update_on_signals) + +/datum/status_effect/temporary_transformation/trans_sting/proc/pause_effect(mob/living/source) + SIGNAL_HANDLER + + // Pause if we're dead, appear dead, or in stasis + if(source.stat == DEAD || HAS_TRAIT(source, TRAIT_DEATHCOMA) || HAS_TRAIT(source, TRAIT_STASIS)) + if(duration == -1) + return // Already paused + + time_before_pause = duration - world.time + duration = -1 + + // Resume if we're none of the above and also were paused + else if(time_before_pause != -1) + duration = time_before_pause + world.time + time_before_pause = -1 diff --git a/code/datums/status_effects/debuffs/drowsiness.dm b/code/datums/status_effects/debuffs/drowsiness.dm index 5bc415d7cd444..cd99e87906664 100644 --- a/code/datums/status_effects/debuffs/drowsiness.dm +++ b/code/datums/status_effects/debuffs/drowsiness.dm @@ -27,14 +27,14 @@ remove_duration(rand(4 SECONDS, 6 SECONDS)) -/datum/status_effect/drowsiness/tick(seconds_per_tick) +/datum/status_effect/drowsiness/tick(seconds_between_ticks) // You do not feel drowsy while unconscious or in stasis - if(owner.stat >= UNCONSCIOUS || IS_IN_STASIS(owner)) + if(owner.stat >= UNCONSCIOUS || HAS_TRAIT(owner, TRAIT_STASIS)) return // Resting helps against drowsiness // While resting, we lose 4 seconds of duration (2 additional ticks) per tick - if(owner.resting && remove_duration(2 * initial(tick_interval))) + if(owner.resting && remove_duration(2 * seconds_between_ticks)) return owner.set_eye_blur_if_lower(4 SECONDS) diff --git a/code/datums/status_effects/debuffs/drugginess.dm b/code/datums/status_effects/debuffs/drugginess.dm index c9a4b034634db..8730e0ccd6eca 100644 --- a/code/datums/status_effects/debuffs/drugginess.dm +++ b/code/datums/status_effects/debuffs/drugginess.dm @@ -14,7 +14,7 @@ owner.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) + owner.grant_language(/datum/language/beachbum, source = id) return TRUE /datum/status_effect/drugginess/on_remove() @@ -24,7 +24,7 @@ owner.clear_fullscreen(id) if(owner.sound_environment_override == SOUND_ENVIRONMENT_DRUGGED) owner.sound_environment_override = SOUND_ENVIRONMENT_NONE - owner.remove_language(/datum/language/beachbum, TRUE, TRUE, id) + owner.remove_language(/datum/language/beachbum, source = id) /// Removes all of our drugginess (self delete) on signal /datum/status_effect/drugginess/proc/remove_drugginess(datum/source, admin_revive) diff --git a/code/datums/status_effects/debuffs/drunk.dm b/code/datums/status_effects/debuffs/drunk.dm index f9ca6afd193ee..3bbb992675ebb 100644 --- a/code/datums/status_effects/debuffs/drunk.dm +++ b/code/datums/status_effects/debuffs/drunk.dm @@ -38,17 +38,17 @@ // .01s are used in case the drunk value ends up to be a small decimal. switch(drunk_value) if(11 to 21) - return span_warning("[owner.p_they(TRUE)] [owner.p_are()] slightly flushed.") + return span_warning("[owner.p_They()] [owner.p_are()] slightly flushed.") if(21.01 to 41) - return span_warning("[owner.p_they(TRUE)] [owner.p_are()] flushed.") + return span_warning("[owner.p_They()] [owner.p_are()] flushed.") if(41.01 to 51) - return span_warning("[owner.p_they(TRUE)] [owner.p_are()] quite flushed and [owner.p_their()] breath smells of alcohol.") + return span_warning("[owner.p_They()] [owner.p_are()] quite flushed and [owner.p_their()] breath smells of alcohol.") if(51.01 to 61) - return span_warning("[owner.p_they(TRUE)] [owner.p_are()] very flushed and [owner.p_their()] movements jerky, with breath reeking of alcohol.") + return span_warning("[owner.p_They()] [owner.p_are()] very flushed and [owner.p_their()] movements jerky, with breath reeking of alcohol.") if(61.01 to 91) - return span_warning("[owner.p_they(TRUE)] look[owner.p_s()] like a drunken mess.") + return span_warning("[owner.p_They()] look[owner.p_s()] like a drunken mess.") if(91.01 to INFINITY) - return span_warning("[owner.p_they(TRUE)] [owner.p_are()] a shitfaced, slobbering wreck.") + return span_warning("[owner.p_They()] [owner.p_are()] a shitfaced, slobbering wreck.") return null @@ -61,9 +61,9 @@ if(drunk_value <= 0) qdel(src) -/datum/status_effect/inebriated/tick() +/datum/status_effect/inebriated/tick(seconds_between_ticks) // Drunk value does not decrease while dead or in stasis - if(owner.stat == DEAD || IS_IN_STASIS(owner)) + if(owner.stat == DEAD || HAS_TRAIT(owner, TRAIT_STASIS)) return // Every tick, the drunk value decrases by @@ -166,7 +166,7 @@ owner.adjust_confusion(15 SECONDS) if(iscarbon(owner)) var/mob/living/carbon/carbon_owner = owner - carbon_owner.vomit() // Vomiting clears toxloss - consider this a blessing + carbon_owner.vomit(VOMIT_CATEGORY_DEFAULT) // Vomiting clears toxloss - consider this a blessing // Over 71, we will constantly have blurry eyes if(drunk_value >= 71) @@ -182,19 +182,26 @@ if(drunk_value >= 91) owner.adjustToxLoss(1) owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.4) - 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...")) - - else - to_chat(owner, span_warning("Just a quick nap...")) - owner.Sleeping(90 SECONDS) + if(owner.stat == CONSCIOUS) + attempt_to_blackout() // And finally, over 100 - let's be honest, you shouldn't be alive by now. if(drunk_value >= 101) owner.adjustToxLoss(2) +/datum/status_effect/inebriated/drunk/proc/attempt_to_blackout() + var/mob/living/carbon/drunkard = owner + if(drunkard.gain_trauma(/datum/brain_trauma/severe/split_personality/blackout, TRAUMA_LIMIT_ABSOLUTE)) + drunk_value -= 50 //So that the drunk personality can spice things up without being killed by liver failure + return + else if(drunkard.has_trauma_type(/datum/brain_trauma/severe/split_personality/blackout) && prob(10)) + to_chat(owner, span_warning("You stumbled and fall over!")) + owner.slip(1 SECONDS) + else if(SSshuttle.emergency.mode == SHUTTLE_DOCKED && is_station_level(owner.z))// Don't put us in a deep sleep if the shuttle's here. QoL, mainly. + to_chat(owner, span_warning("You're so tired... but you can't miss that shuttle...")) + else + owner.Sleeping(90 SECONDS) + /// Status effect for being fully drunk (not tipsy). /atom/movable/screen/alert/status_effect/drunk name = "Drunk" diff --git a/code/datums/status_effects/debuffs/fire_stacks.dm b/code/datums/status_effects/debuffs/fire_stacks.dm index 07cbd17afa308..112e8bd861409 100644 --- a/code/datums/status_effects/debuffs/fire_stacks.dm +++ b/code/datums/status_effects/debuffs/fire_stacks.dm @@ -16,8 +16,6 @@ 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) @@ -80,19 +78,6 @@ 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() - SHOULD_CALL_PARENT(FALSE) - /** * Setter and adjuster procs for firestacks * @@ -147,14 +132,14 @@ /// If we're on fire var/on_fire = FALSE - /// A weakref to the mob light emitter - var/datum/weakref/firelight_ref - /// Type of mob light emitter we use when on fire - var/firelight_type = /obj/effect/dummy/lighting_obj/moblight/fire /// Stores current fire overlay icon state, for optimisation purposes var/last_icon_state + /// Reference to the mob light emitter itself + var/obj/effect/dummy/lighting_obj/moblight + /// Type of mob light emitter we use when on fire + var/moblight_type = /obj/effect/dummy/lighting_obj/moblight/fire -/datum/status_effect/fire_handler/fire_stacks/tick(seconds_per_tick, times_fired) +/datum/status_effect/fire_handler/fire_stacks/tick(seconds_between_ticks) if(stacks <= 0) qdel(src) return TRUE @@ -162,7 +147,7 @@ if(!on_fire) return TRUE - adjust_stacks(owner.fire_stack_decay_rate * seconds_per_tick) + adjust_stacks(owner.fire_stack_decay_rate * seconds_between_ticks) if(stacks <= 0) qdel(src) @@ -173,7 +158,7 @@ qdel(src) return TRUE - deal_damage(seconds_per_tick, times_fired) + deal_damage(seconds_between_ticks) update_overlay() update_particles() @@ -192,13 +177,12 @@ * Proc that handles damage dealing and all special effects * * Arguments: - * - seconds_per_tick - * - times_fired + * - seconds_between_ticks * */ -/datum/status_effect/fire_handler/fire_stacks/proc/deal_damage(seconds_per_tick, times_fired) - owner.on_fire_stack(seconds_per_tick, times_fired, src) +/datum/status_effect/fire_handler/fire_stacks/proc/deal_damage(seconds_per_tick) + owner.on_fire_stack(seconds_per_tick, src) var/turf/location = get_turf(owner) location.hotspot_expose(700, 25 * seconds_per_tick, TRUE) @@ -207,13 +191,12 @@ * Used to deal damage to humans and count their protection. * * Arguments: - * - seconds_per_tick - * - times_fired + * - seconds_between_ticks * - no_protection: When set to TRUE, fire will ignore any possible fire protection * */ -/datum/status_effect/fire_handler/fire_stacks/proc/harm_human(seconds_per_tick, times_fired, no_protection = FALSE) +/datum/status_effect/fire_handler/fire_stacks/proc/harm_human(seconds_per_tick, no_protection = FALSE) var/mob/living/carbon/human/victim = owner var/thermal_protection = victim.get_thermal_protection() @@ -244,8 +227,10 @@ if(!silent) owner.visible_message(span_warning("[owner] catches fire!"), span_userdanger("You're set on fire!")) - if(firelight_type) - firelight_ref = WEAKREF(new firelight_type(owner)) + if(moblight_type) + if(moblight) + qdel(moblight) + moblight = new moblight_type(owner) SEND_SIGNAL(owner, COMSIG_LIVING_IGNITED, owner) cache_stacks() @@ -258,20 +243,14 @@ */ /datum/status_effect/fire_handler/fire_stacks/proc/extinguish() - if(firelight_ref) - qdel(firelight_ref) - + QDEL_NULL(moblight) on_fire = FALSE owner.clear_mood_event("on_fire") SEND_SIGNAL(owner, COMSIG_LIVING_EXTINGUISHED, owner) cache_stacks() update_overlay() update_particles() - if(!iscarbon(owner)) - return - for(var/obj/item/equipped in owner.get_equipped_items()) - equipped.wash(CLEAN_TYPE_ACID) equipped.extinguish() /datum/status_effect/fire_handler/fire_stacks/on_remove() @@ -279,6 +258,7 @@ extinguish() set_stacks(0) update_overlay() + update_particles() return ..() /datum/status_effect/fire_handler/fire_stacks/update_overlay() @@ -288,14 +268,19 @@ . = ..() update_overlay() +/obj/effect/dummy/lighting_obj/moblight/fire + name = "fire" + light_color = LIGHT_COLOR_FIRE + light_range = LIGHT_RANGE_FIRE + /datum/status_effect/fire_handler/wet_stacks id = "wet_stacks" enemy_types = list(/datum/status_effect/fire_handler/fire_stacks) stack_modifier = -1 -/datum/status_effect/fire_handler/wet_stacks/tick(seconds_per_tick) - adjust_stacks(-0.5 * seconds_per_tick) +/datum/status_effect/fire_handler/wet_stacks/tick(seconds_between_ticks) + adjust_stacks(-0.5 * seconds_between_ticks) if(stacks <= 0) qdel(src) diff --git a/code/datums/status_effects/debuffs/genetic_damage.dm b/code/datums/status_effects/debuffs/genetic_damage.dm index 438bcc7c6905f..9a6944090775e 100644 --- a/code/datums/status_effects/debuffs/genetic_damage.dm +++ b/code/datums/status_effects/debuffs/genetic_damage.dm @@ -31,17 +31,17 @@ . = ..() src.total_damage += total_damage -/datum/status_effect/genetic_damage/tick(seconds_per_tick, times_fired) - if(ismonkey(owner) && total_damage >= GORILLA_MUTATION_MINIMUM_DAMAGE && SPT_PROB(GORILLA_MUTATION_CHANCE_PER_SECOND, seconds_per_tick)) +/datum/status_effect/genetic_damage/tick(seconds_between_ticks) + if(ismonkey(owner) && total_damage >= GORILLA_MUTATION_MINIMUM_DAMAGE && SPT_PROB(GORILLA_MUTATION_CHANCE_PER_SECOND, seconds_between_ticks)) var/mob/living/carbon/carbon_owner = owner carbon_owner.gorillize() qdel(src) return if(total_damage >= minimum_before_tox_damage) - owner.adjustToxLoss(toxin_damage_per_second * seconds_per_tick) + owner.adjustToxLoss(toxin_damage_per_second * seconds_between_ticks) - total_damage -= remove_per_second * seconds_per_tick + total_damage -= remove_per_second * seconds_between_ticks if(total_damage <= 0) qdel(src) return diff --git a/code/datums/status_effects/debuffs/hallucination.dm b/code/datums/status_effects/debuffs/hallucination.dm index 4c5e1c305e1bd..5d67acc789ed3 100644 --- a/code/datums/status_effects/debuffs/hallucination.dm +++ b/code/datums/status_effects/debuffs/hallucination.dm @@ -68,7 +68,7 @@ source.cause_hallucination(/datum/hallucination/shock, "hallucinated shock from [bumped]",) return STOP_BUMP -/datum/status_effect/hallucination/tick(seconds_per_tick, times_fired) +/datum/status_effect/hallucination/tick(seconds_between_ticks) if(owner.stat == DEAD) return if(!COOLDOWN_FINISHED(src, hallucination_cooldown)) @@ -94,7 +94,7 @@ /datum/status_effect/hallucination/sanity/refresh(...) update_intervals() -/datum/status_effect/hallucination/sanity/tick(seconds_per_tick, times_fired) +/datum/status_effect/hallucination/sanity/tick(seconds_between_ticks) // Using psicodine / happiness / whatever to become fearless will stop sanity based hallucinations if(HAS_TRAIT(owner, TRAIT_FEARLESS)) return diff --git a/code/datums/status_effects/debuffs/jitteriness.dm b/code/datums/status_effects/debuffs/jitteriness.dm index 77cb9ed1485e9..409d20f099bc2 100644 --- a/code/datums/status_effects/debuffs/jitteriness.dm +++ b/code/datums/status_effects/debuffs/jitteriness.dm @@ -29,11 +29,11 @@ /datum/status_effect/jitter/get_examine_text() switch(duration - world.time) if(5 MINUTES to INFINITY) - return span_boldwarning("[owner.p_they(TRUE)] [owner.p_are()] convulsing violently!") + return span_boldwarning("[owner.p_They()] [owner.p_are()] convulsing violently!") if(3 MINUTES to 5 MINUTES) - return span_warning("[owner.p_they(TRUE)] [owner.p_are()] extremely jittery.") + return span_warning("[owner.p_They()] [owner.p_are()] extremely jittery.") if(1 MINUTES to 3 MINUTES) - return span_warning("[owner.p_they(TRUE)] [owner.p_are()] twitching ever so slightly.") + return span_warning("[owner.p_They()] [owner.p_are()] twitching ever so slightly.") return null @@ -43,10 +43,10 @@ qdel(src) -/datum/status_effect/jitter/tick() +/datum/status_effect/jitter/tick(seconds_between_ticks) // Resting helps against jitter // While resting, we lose 8 seconds of duration (4 additional ticks) per tick - if(owner.resting && remove_duration(4 * initial(tick_interval))) + if(owner.resting && remove_duration(4 * seconds_between_ticks)) return var/time_left_in_seconds = (duration - world.time) / 10 diff --git a/code/datums/status_effects/debuffs/screen_blur.dm b/code/datums/status_effects/debuffs/screen_blur.dm index 1af6d36330fb6..abdd07d3cd59b 100644 --- a/code/datums/status_effects/debuffs/screen_blur.dm +++ b/code/datums/status_effects/debuffs/screen_blur.dm @@ -14,7 +14,7 @@ return ..() /datum/status_effect/eye_blur/on_apply() - if(owner.mob_biotypes & (MOB_ROBOTIC|MOB_SPIRIT|MOB_EPIC)) + if(owner.mob_biotypes & (MOB_ROBOTIC|MOB_SPIRIT|MOB_SPECIAL)) return FALSE // Refresh the blur when a client jumps into the mob, in case we get put on a clientless mob with no hud @@ -31,7 +31,7 @@ var/atom/movable/plane_master_controller/game_plane_master_controller = owner.hud_used.plane_master_controllers[PLANE_MASTERS_GAME] game_plane_master_controller.remove_filter("eye_blur") -/datum/status_effect/eye_blur/tick(seconds_per_tick, times_fired) +/datum/status_effect/eye_blur/tick(seconds_between_ticks) // Blur lessens the closer we are to expiring, so we update per tick. update_blur() diff --git a/code/datums/status_effects/debuffs/slimed.dm b/code/datums/status_effects/debuffs/slimed.dm new file mode 100644 index 0000000000000..15632277f3dd7 --- /dev/null +++ b/code/datums/status_effects/debuffs/slimed.dm @@ -0,0 +1,85 @@ +/// The minimum amount of water stacks needed to start washing off the slime. +#define MIN_WATER_STACKS 5 +/// The minimum amount of health a mob has to have before the status effect is removed. +#define MIN_HEALTH 10 + +/atom/movable/screen/alert/status_effect/slimed + name = "Covered in Slime" + desc = "You are covered in slime and it's eating away at you! Find a way to wash it off!" + icon_state = "slimed" + +/datum/status_effect/slimed + id = "slimed" + tick_interval = 3 SECONDS + alert_type = /atom/movable/screen/alert/status_effect/slimed + remove_on_fullheal = TRUE + + /// The amount of slime stacks that were applied, reduced by showering yourself under water. + var/slime_stacks = 10 // ~10 seconds of standing under a shower + /// Slime color, used for particles. + var/slime_color + /// Changes particle colors to rainbow, this overrides `slime_color`. + var/rainbow + +/datum/status_effect/slimed/on_creation(mob/living/new_owner, slime_color = COLOR_SLIME_GREY, rainbow = FALSE) + src.slime_color = slime_color + src.rainbow = rainbow + return ..() + +/datum/status_effect/slimed/on_apply() + if(owner.get_organic_health() <= MIN_HEALTH) + return FALSE + to_chat(owner, span_userdanger("You have been covered in a thick layer of slime! Find a way to wash it off!")) + return ..() + +/datum/status_effect/slimed/tick(seconds_between_ticks) + // remove from the mob once we have dealt enough damage + if(owner.get_organic_health() <= MIN_HEALTH) + to_chat(owner, span_warning("You feel the layer of slime crawling off of your weakened body.")) + qdel(src) + return + + // handle washing slime off + var/datum/status_effect/fire_handler/wet_stacks/wetness = locate() in owner.status_effects + if(istype(wetness) && wetness.stacks > (MIN_WATER_STACKS * seconds_between_ticks)) + slime_stacks -= seconds_between_ticks // lose 1 stack per second + wetness.adjust_stacks(-5 * seconds_between_ticks) + + // got rid of it + if(slime_stacks <= 0) + to_chat(owner, span_notice("You manage to wash off the layer of slime completely.")) + qdel(src) + return + + if(SPT_PROB(10, seconds_between_ticks)) + to_chat(owner,span_warning("The layer of slime is slowly getting thinner as it's washing off your skin.")) + + return + + // otherwise deal brute damage + owner.apply_damage(rand(2,4) * seconds_between_ticks, damagetype = BRUTE) + + if(SPT_PROB(10, seconds_between_ticks)) + var/feedback_text = pick(list( + "Your entire body screams with pain", + "Your skin feels like it's coming off", + "Your body feels like it's melting together" + )) + to_chat(owner, span_userdanger("[feedback_text] as the layer of slime eats away at you!")) + +/datum/status_effect/slimed/update_particles() + if(particle_effect) + return + + // taste the rainbow + var/particle_type = rainbow ? /particles/slime/rainbow : /particles/slime + particle_effect = new(owner, particle_type) + + if(!rainbow) + particle_effect.particles.color = "[slime_color]a0" + +/datum/status_effect/slimed/get_examine_text() + return span_warning("[owner.p_They()] [owner.p_are()] covered in bubbling slime!") + +#undef MIN_HEALTH +#undef MIN_WATER_STACKS diff --git a/code/datums/status_effects/debuffs/spacer.dm b/code/datums/status_effects/debuffs/spacer.dm new file mode 100644 index 0000000000000..0c6234c1efc27 --- /dev/null +++ b/code/datums/status_effects/debuffs/spacer.dm @@ -0,0 +1,124 @@ +// Effects given by the spacer quirk + +/datum/status_effect/spacer + id = "spacer_gravity_effects" + status_type = STATUS_EFFECT_REPLACE + /// Essentially, tracks whether this is a planetary map. + /// It'd be pretty miserable if you're playing a planetary map and getting the worse of all effects, so we handwave it a bit. + VAR_FINAL/nerfed_effects_because_planetary = FALSE + +/datum/status_effect/spacer/on_apply() + return iscarbon(owner) + +/datum/status_effect/spacer/on_creation(mob/living/new_owner, ...) + . = ..() + nerfed_effects_because_planetary = SSmapping.is_planetary() + +// The good side (being in space) +/datum/status_effect/spacer/gravity_wellness + alert_type = null + tick_interval = 3 SECONDS + /// How much disgust to heal per tick + var/disgust_healing_per_tick = 1.5 + /// How much of stamina damage to heal per tick when we've been in nograv for a while + var/stamina_heal_per_tick = 3 + /// How many seconds of stuns to reduce per tick when we've been in nograv for a while + var/stun_heal_per_tick = 3 SECONDS + /// Tracks how long we've been in no gravity + VAR_FINAL/seconds_in_nograv = 0 SECONDS + +/datum/status_effect/spacer/gravity_wellness/tick(seconds_between_ticks) + var/in_nograv = !owner.has_gravity() + var/nograv_mod = in_nograv ? 1 : 0.5 + owner.adjust_disgust(-1 * disgust_healing_per_tick * nograv_mod) + + if(!in_nograv) + seconds_in_nograv = 0 SECONDS + return + + seconds_in_nograv += (seconds_between_ticks * 0.1) + + if(seconds_in_nograv >= 3 MINUTES) + // This has some interesting side effects with gravitum or similar negating effects that may be worth nothing + owner.adjustStaminaLoss(-1 * stamina_heal_per_tick) + owner.AdjustAllImmobility(-1 * stun_heal_per_tick) + // For comparison: Ephedrine heals 1 stamina per tick / 0.5 per second + // and Nicotine heals 5 seconds of stun per tick / 2.5 per second + +// The bad side (being on a planet) +/datum/status_effect/spacer/gravity_sickness + alert_type = /atom/movable/screen/alert/status_effect/gravity_sickness + tick_interval = 1 SECONDS + /// How much disgust to gain per tick + var/disgust_per_tick = 1 + /// The cap to which we can apply disgust + var/max_disgust = DISGUST_LEVEL_GROSS + 5 + /// Tracks how many seconds this has been active + VAR_FINAL/seconds_active = 0 SECONDS + +/datum/status_effect/spacer/gravity_sickness/tick(seconds_between_ticks) + if(owner.mob_negates_gravity()) + // Might seem redundant but we can totally be on a planet but have an anti-gravity effect like gravitum + return + + seconds_active += (seconds_between_ticks * 0.1) + + var/mob/living/carbon/the_spacer = owner + the_spacer.adjust_disgust(disgust_per_tick, max = max_disgust + 5) + + if(nerfed_effects_because_planetary) + return + if(seconds_active < 2 MINUTES) + return + + var/minutes_active = round(seconds_active / (1 MINUTES)) + // Sit at a passive amount of stamina damage depending on how long it's been + if(!the_spacer.getStaminaLoss()) + the_spacer.adjustStaminaLoss(min(25, 5 * minutes_active)) + // Max disgust increases over time as well + max_disgust = min(DISGUST_LEVEL_VERYGROSS + 5, initial(max_disgust) + 5 * minutes_active) + // And your lungs can't really handle it good + if(!the_spacer.internal && seconds_active % 10 == 0) + the_spacer.losebreath = min(the_spacer.losebreath++, minutes_active, 8) + +/atom/movable/screen/alert/status_effect/gravity_sickness + name = "Gravity Sickness" + desc = "The gravity of the planet around you is making you feel sick and tired." + icon_state = "paralysis" + +/datum/mood_event/spacer + category = "spacer" + +/datum/mood_event/spacer/in_space + description = "Space is long and dark and empty, but it's my home." + +/datum/mood_event/spacer/on_planet + description = "I'm on a planet. The gravity here makes me uncomfotable." + mood_change = -2 + +/datum/mood_event/spacer/on_planet/too_long + description = "I've been on this planet for too long. I need to get back to space." + mood_change = -4 + +/datum/mood_event/spacer/on_planet/nerfed + description = "I'm stationed on a planet. I'd love to be back in space." + mood_change = -3 + +/datum/movespeed_modifier/spacer + id = "spacer" + +/datum/movespeed_modifier/spacer/in_space + movetypes = FLOATING + blacklisted_movetypes = FLYING + multiplicative_slowdown = -0.1 + +/datum/movespeed_modifier/spacer/on_planet + movetypes = GROUND|FLYING + blacklisted_movetypes = FLOATING + multiplicative_slowdown = 0.2 + +/datum/movespeed_modifier/spacer/on_planet/too_long + multiplicative_slowdown = 0.5 + +/datum/movespeed_modifier/spacer/on_planet/nerfed + multiplicative_slowdown = 0.25 diff --git a/code/datums/status_effects/debuffs/static_vision.dm b/code/datums/status_effects/debuffs/static_vision.dm new file mode 100644 index 0000000000000..7132c189b9d44 --- /dev/null +++ b/code/datums/status_effects/debuffs/static_vision.dm @@ -0,0 +1,29 @@ +/datum/status_effect/static_vision + id = "static_vision" + status_type = STATUS_EFFECT_REPLACE + alert_type = null + +/datum/status_effect/static_vision/on_creation(mob/living/new_owner, duration = 3 SECONDS) + src.duration = duration + return ..() + +/datum/status_effect/static_vision/on_apply() + RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(remove_static_vision)) + + owner.overlay_fullscreen(id, /atom/movable/screen/fullscreen/static_vision) + owner.sound_environment_override = SOUND_ENVIRONMENT_UNDERWATER + + return TRUE + +/datum/status_effect/static_vision/on_remove() + UnregisterSignal(owner, COMSIG_LIVING_DEATH) + + owner.clear_fullscreen(id) + if(owner.sound_environment_override == SOUND_ENVIRONMENT_UNDERWATER) + owner.sound_environment_override = SOUND_ENVIRONMENT_NONE + +/// Handles clearing on death +/datum/status_effect/static_vision/proc/remove_static_vision(datum/source, admin_revive) + SIGNAL_HANDLER + + qdel(src) diff --git a/code/datums/status_effects/debuffs/strandling.dm b/code/datums/status_effects/debuffs/strandling.dm index 5465171df8205..e6198eb544f4e 100644 --- a/code/datums/status_effects/debuffs/strandling.dm +++ b/code/datums/status_effects/debuffs/strandling.dm @@ -19,7 +19,7 @@ UnregisterSignal(owner, list(COMSIG_CARBON_PRE_BREATHE, COMSIG_ATOM_TOOL_ACT(TOOL_WIRECUTTER), COMSIG_CARBON_PRE_MISC_HELP)) /datum/status_effect/strandling/get_examine_text() - return span_warning("[owner.p_they(TRUE)] seem[owner.p_s()] to be being choked by some durathread strands. You may be able to cut them off.") + return span_warning("[owner.p_They()] seem[owner.p_s()] to be being choked by some durathread strands. You may be able to cut them off.") /// Signal proc for [COMSIG_CARBON_PRE_BREATHE], causes losebreath whenever we're trying to breathe /datum/status_effect/strandling/proc/on_breathe(mob/living/source) diff --git a/code/datums/status_effects/debuffs/terrified.dm b/code/datums/status_effects/debuffs/terrified.dm index 8645a0a977c9a..6ed79372d01aa 100644 --- a/code/datums/status_effects/debuffs/terrified.dm +++ b/code/datums/status_effects/debuffs/terrified.dm @@ -38,7 +38,7 @@ UnregisterSignal(owner, COMSIG_CARBON_HELPED) owner.remove_fov_trait(id, FOV_270_DEGREES) -/datum/status_effect/terrified/tick(seconds_per_tick, times_fired) +/datum/status_effect/terrified/tick(seconds_between_ticks) if(check_surrounding_darkness()) if(terror_buildup < DARKNESS_TERROR_CAP) terror_buildup += DARKNESS_TERROR_AMOUNT @@ -50,14 +50,14 @@ return if(terror_buildup >= TERROR_FEAR_THRESHOLD) //The onset, minor effects of terror buildup - owner.adjust_dizzy_up_to(10 SECONDS * seconds_per_tick, 10 SECONDS) - owner.adjust_stutter_up_to(10 SECONDS * seconds_per_tick, 10 SECONDS) - owner.adjust_jitter_up_to(10 SECONDS * seconds_per_tick, 10 SECONDS) + owner.adjust_dizzy_up_to(10 SECONDS * seconds_between_ticks, 10 SECONDS) + owner.adjust_stutter_up_to(10 SECONDS * seconds_between_ticks, 10 SECONDS) + owner.adjust_jitter_up_to(10 SECONDS * seconds_between_ticks, 10 SECONDS) if(terror_buildup >= TERROR_PANIC_THRESHOLD) //If you reach this amount of buildup in an engagement, it's time to start looking for a way out. owner.playsound_local(get_turf(owner), 'sound/health/slowbeat.ogg', 40, 0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE) owner.add_fov_trait(id, FOV_270_DEGREES) //Terror induced tunnel vision - owner.adjust_eye_blur_up_to(10 SECONDS * seconds_per_tick, 10 SECONDS) + owner.adjust_eye_blur_up_to(10 SECONDS * seconds_between_ticks, 10 SECONDS) if(prob(5)) //We have a little panic attack. Consider it GENTLE ENCOURAGEMENT to start running away. freak_out(PANIC_ATTACK_TERROR_AMOUNT) owner.visible_message( @@ -82,7 +82,7 @@ /datum/status_effect/terrified/get_examine_text() if(terror_buildup > DARKNESS_TERROR_CAP) //If we're approaching a heart attack - return span_boldwarning("[owner.p_they(TRUE)] [owner.p_are()] seizing up, about to collapse in fear!") + return span_boldwarning("[owner.p_They()] [owner.p_are()] seizing up, about to collapse in fear!") if(terror_buildup >= TERROR_PANIC_THRESHOLD) return span_boldwarning("[owner] is visibly trembling and twitching. It looks like [owner.p_theyre()] freaking out!") @@ -90,7 +90,7 @@ if(terror_buildup >= TERROR_FEAR_THRESHOLD) return span_warning("[owner] looks very worried about something. [owner.p_are(TRUE)] [owner.p_they()] alright?") - return span_notice("[owner] looks rather anxious. [owner.p_they(TRUE)] could probably use a hug...") + return span_notice("[owner] looks rather anxious. [owner.p_They()] could probably use a hug...") /// If we get a hug from a friend, we calm down! If we get a hug from a nightmare, we FREAK OUT. /datum/status_effect/terrified/proc/comfort_owner(datum/source, mob/living/hugger) diff --git a/code/datums/status_effects/debuffs/tower_of_babel.dm b/code/datums/status_effects/debuffs/tower_of_babel.dm index 1ba46d0b87b57..b3c1ae0c477c7 100644 --- a/code/datums/status_effects/debuffs/tower_of_babel.dm +++ b/code/datums/status_effects/debuffs/tower_of_babel.dm @@ -25,7 +25,6 @@ // if user is affected by tower of babel, we remove the blocked languages owner.remove_blocked_language(GLOB.all_languages, source = LANGUAGE_BABEL) owner.remove_all_languages(source = LANGUAGE_BABEL) - owner.update_atom_languages() if(owner.mind) REMOVE_TRAIT(owner.mind, TRAIT_TOWER_OF_BABEL, trait_source) return ..() diff --git a/code/datums/status_effects/food_effects.dm b/code/datums/status_effects/food_effects.dm new file mode 100644 index 0000000000000..e41ef67ad1059 --- /dev/null +++ b/code/datums/status_effects/food_effects.dm @@ -0,0 +1,52 @@ +/// Buffs given by eating hand-crafted food. The duration scales with consumable reagents purity. +/datum/status_effect/food + id = "food_buff" + duration = 5 MINUTES // Same as food mood buffs + status_type = STATUS_EFFECT_REPLACE // Only one food buff allowed + /// Buff power + var/strength + +/datum/status_effect/food/on_creation(mob/living/new_owner, timeout_mod = 1, strength = 1) + src.strength = strength + //Generate alert when not specified + if(alert_type == /atom/movable/screen/alert/status_effect) + alert_type = "/atom/movable/screen/alert/status_effect/food/buff_[strength]" + if(isnum(timeout_mod)) + duration *= timeout_mod + . = ..() + +/atom/movable/screen/alert/status_effect/food + name = "Hand-crafted meal" + desc = "Eating it made me feel better." + icon_state = "food_buff_1" + +/atom/movable/screen/alert/status_effect/food/buff_1 + icon_state = "food_buff_1" + +/atom/movable/screen/alert/status_effect/food/buff_2 + icon_state = "food_buff_2" + +/atom/movable/screen/alert/status_effect/food/buff_3 + icon_state = "food_buff_3" + +/atom/movable/screen/alert/status_effect/food/buff_4 + icon_state = "food_buff_4" + +/atom/movable/screen/alert/status_effect/food/buff_5 + icon_state = "food_buff_5" + +/// Makes you gain a trait +/datum/status_effect/food/trait + var/trait = TRAIT_DUMB // You need to override this + +/datum/status_effect/food/trait/on_apply() + ADD_TRAIT(owner, trait, type) + return ..() + +/datum/status_effect/food/trait/be_replaced() + REMOVE_TRAIT(owner, trait, type) + return ..() + +/datum/status_effect/food/trait/on_remove() + REMOVE_TRAIT(owner, trait, type) + return ..() diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm index 2c31294d8c7f4..bcc0a50e70737 100644 --- a/code/datums/status_effects/gas.dm +++ b/code/datums/status_effects/gas.dm @@ -23,7 +23,7 @@ owner.add_overlay(cube) -/datum/status_effect/freon/tick() +/datum/status_effect/freon/tick(seconds_between_ticks) if(can_melt && owner.bodytemperature >= owner.get_body_temp_normal()) qdel(src) @@ -52,6 +52,9 @@ duration = 8 can_melt = FALSE +/datum/status_effect/freon/watcher/extended + duration = 5 SECONDS + /datum/status_effect/freon/lasting id = "lasting_frozen" duration = -1 diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index a24c9cb508724..130e91f63a91c 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -30,7 +30,7 @@ if(!QDELETED(reward_target)) reward_target.get_kill(owner) -/datum/status_effect/syphon_mark/tick() +/datum/status_effect/syphon_mark/tick(seconds_between_ticks) if(owner.stat == DEAD) get_kill() qdel(src) @@ -96,7 +96,7 @@ playsound(owner, 'sound/weapons/gun/shotgun/rack.ogg', 75, FALSE) return ..() -/datum/status_effect/bounty/tick() +/datum/status_effect/bounty/tick(seconds_between_ticks) if(owner.stat == DEAD) rewards() qdel(src) @@ -109,11 +109,14 @@ for(var/datum/action/cooldown/spell/spell in rewarded.actions) spell.reset_spell_cooldown() - rewarded.adjustBruteLoss(-25) - rewarded.adjustFireLoss(-25) - rewarded.adjustToxLoss(-25) - rewarded.adjustOxyLoss(-25) - rewarded.adjustCloneLoss(-25) + var/need_mob_update = FALSE + need_mob_update += rewarded.adjustBruteLoss(-25, updating_health = FALSE) + need_mob_update += rewarded.adjustFireLoss(-25, updating_health = FALSE) + need_mob_update += rewarded.adjustToxLoss(-25, updating_health = FALSE) + need_mob_update += rewarded.adjustOxyLoss(-25, updating_health = FALSE) + need_mob_update += rewarded.adjustCloneLoss(-25, updating_health = FALSE) + if(need_mob_update) + rewarded.updatehealth() // heldup is for the person being aimed at /datum/status_effect/grouped/heldup @@ -186,13 +189,12 @@ RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(check_owner_in_range)) RegisterSignals(offered_item, list(COMSIG_QDELETING, COMSIG_ITEM_DROPPED), PROC_REF(dropped_item)) - //RegisterSignal(owner, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(check_fake_out)) /datum/status_effect/offering/Destroy() - for(var/i in possible_takers) - var/mob/living/carbon/removed_taker = i + for(var/mob/living/carbon/removed_taker as anything in possible_takers) remove_candidate(removed_taker) LAZYCLEARLIST(possible_takers) + offered_item = null return ..() /// Hook up the specified carbon mob to be offered the item in question, give them the alert and signals and all @@ -202,7 +204,7 @@ return LAZYADD(possible_takers, possible_candidate) RegisterSignal(possible_candidate, COMSIG_MOVABLE_MOVED, PROC_REF(check_taker_in_range)) - G.setup(possible_candidate, owner, offered_item) + G.setup(possible_candidate, src) /// Remove the alert and signals for the specified carbon mob. Automatically removes the status effect when we lost the last taker /datum/status_effect/offering/proc/remove_candidate(mob/living/carbon/removed_candidate) @@ -225,8 +227,7 @@ /datum/status_effect/offering/proc/check_owner_in_range(mob/living/carbon/source) SIGNAL_HANDLER - for(var/i in possible_takers) - var/mob/living/carbon/checking_taker = i + for(var/mob/living/carbon/checking_taker as anything in possible_takers) if(!istype(checking_taker) || !owner.CanReach(checking_taker) || IS_DEAD_OR_INCAP(checking_taker)) remove_candidate(checking_taker) @@ -244,7 +245,6 @@ /datum/status_effect/offering/proc/is_taker_elligible(mob/living/carbon/taker) return owner.CanReach(taker) && !IS_DEAD_OR_INCAP(taker) && additional_taker_check(taker) - /** * Additional checks added to `CanReach()` and `IS_DEAD_OR_INCAP()` in `is_taker_elligible()`. * Should be what you override instead of `is_taker_elligible()`. By default, checks if the @@ -256,17 +256,14 @@ /datum/status_effect/offering/proc/additional_taker_check(mob/living/carbon/taker) return taker.can_hold_items() - /** * This status effect is meant only for items that you don't actually receive * when offered, mostly useful for `/obj/item/hand_item` subtypes. */ /datum/status_effect/offering/no_item_received - /datum/status_effect/offering/no_item_received/additional_taker_check(mob/living/carbon/taker) - return TRUE - + return taker.usable_hands > 0 /** * This status effect is meant only to be used for offerings that require the target to @@ -276,26 +273,21 @@ */ /datum/status_effect/offering/no_item_received/needs_resting - /datum/status_effect/offering/no_item_received/needs_resting/additional_taker_check(mob/living/carbon/taker) return taker.body_position == LYING_DOWN - /datum/status_effect/offering/no_item_received/needs_resting/on_creation(mob/living/new_owner, obj/item/offer, give_alert_override, mob/living/carbon/offered) . = ..() RegisterSignal(owner, COMSIG_LIVING_SET_BODY_POSITION, PROC_REF(check_owner_standing)) - /datum/status_effect/offering/no_item_received/needs_resting/register_candidate(mob/living/carbon/possible_candidate) . = ..() RegisterSignal(possible_candidate, COMSIG_LIVING_SET_BODY_POSITION, PROC_REF(check_candidate_resting)) - /datum/status_effect/offering/no_item_received/needs_resting/remove_candidate(mob/living/carbon/removed_candidate) UnregisterSignal(removed_candidate, COMSIG_LIVING_SET_BODY_POSITION) return ..() - /// Simple signal handler that ensures that, if the owner stops standing, the offer no longer stands either! /datum/status_effect/offering/no_item_received/needs_resting/proc/check_owner_standing(mob/living/carbon/owner) if(src.owner.body_position == STANDING_UP) @@ -304,7 +296,6 @@ // This doesn't work anymore if the owner is no longer standing up, sorry! qdel(src) - /// Simple signal handler that ensures that, should a candidate now be standing up, the offer won't be standing for them anymore! /datum/status_effect/offering/no_item_received/needs_resting/proc/check_candidate_resting(mob/living/carbon/candidate) SIGNAL_HANDLER @@ -315,10 +306,13 @@ // No longer lying down? You're no longer eligible to take the offer, sorry! remove_candidate(candidate) +/// Subtype for high fives, so we can fake out people +/datum/status_effect/offering/no_item_received/high_five + id = "offer_high_five" -/datum/status_effect/offering/secret_handshake - id = "secret_handshake" - give_alert_type = /atom/movable/screen/alert/give/secret_handshake +/datum/status_effect/offering/no_item_received/high_five/dropped_item(obj/item/source) + // Lets us "too slow" people, instead of qdeling we just handle the ref + offered_item = null //this effect gives the user an alert they can use to surrender quickly /datum/status_effect/grouped/surrender @@ -352,7 +346,7 @@ /datum/status_effect/caltropped id = "caltropped" duration = 1 SECONDS - tick_interval = INFINITY + tick_interval = -1 status_type = STATUS_EFFECT_REFRESH alert_type = null @@ -383,7 +377,7 @@ QDEL_NULL(alt_clone) return ..() -/datum/status_effect/eigenstasium/tick() +/datum/status_effect/eigenstasium/tick(seconds_between_ticks) . = ..() //This stuff runs every cycle if(prob(5)) @@ -417,7 +411,7 @@ return stable_message = FALSE - + //Increment cycle current_cycle++ //needs to be done here because phase 2 can early return @@ -509,7 +503,7 @@ monkey_tail.Insert(human_mob, drop_if_replaced = FALSE) var/datum/species/human_species = human_mob.dna?.species if(human_species) - human_species.randomize_features(human_mob) + human_species.randomize_active_features(human_mob) human_species.randomize_active_underwear(human_mob) owner.remove_status_effect(/datum/status_effect/eigenstasium) @@ -531,3 +525,39 @@ #undef EIGENSTASIUM_PHASE_2_END #undef EIGENSTASIUM_PHASE_3_START #undef EIGENSTASIUM_PHASE_3_END + +///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 + remove_on_fullheal = TRUE + var/obj/effect/dummy/lighting_obj/moblight/mob_light_obj + +/datum/status_effect/tinlux_light/on_creation(mob/living/new_owner, duration) + if(duration) + src.duration = duration + return ..() + +/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) + +/datum/status_effect/gutted + id = "gutted" + alert_type = null + duration = -1 + tick_interval = -1 + +/datum/status_effect/gutted/on_apply() + RegisterSignal(owner, COMSIG_MOB_STATCHANGE, PROC_REF(stop_gutting)) + return TRUE + +/datum/status_effect/gutted/on_remove() + UnregisterSignal(owner, COMSIG_MOB_STATCHANGE) + +/datum/status_effect/gutted/proc/stop_gutting() + SIGNAL_HANDLER + qdel(src) diff --git a/code/datums/status_effects/song_effects.dm b/code/datums/status_effects/song_effects.dm index baf646a2c7685..0cca48d22b6ea 100644 --- a/code/datums/status_effects/song_effects.dm +++ b/code/datums/status_effects/song_effects.dm @@ -33,4 +33,4 @@ return ..() /datum/status_effect/song/antimagic/get_examine_text() - return span_notice("[owner.p_they(TRUE)] seem[owner.p_s()] to be covered in a dull, grey aura.") + return span_notice("[owner.p_They()] seem[owner.p_s()] to be covered in a dull, grey aura.") diff --git a/code/datums/status_effects/stacking_effect.dm b/code/datums/status_effects/stacking_effect.dm index 9896ef5ec707c..98dd1c3ad14e7 100644 --- a/code/datums/status_effects/stacking_effect.dm +++ b/code/datums/status_effects/stacking_effect.dm @@ -75,7 +75,7 @@ /datum/status_effect/stacking/proc/can_gain_stacks() return owner.stat != DEAD -/datum/status_effect/stacking/tick() +/datum/status_effect/stacking/tick(seconds_between_ticks) if(!can_have_status()) qdel(src) else diff --git a/code/datums/status_effects/wound_effects.dm b/code/datums/status_effects/wound_effects.dm index d0bdbd5360245..6ec793c5672b2 100644 --- a/code/datums/status_effects/wound_effects.dm +++ b/code/datums/status_effects/wound_effects.dm @@ -28,7 +28,7 @@ /datum/status_effect/limp id = "limp" status_type = STATUS_EFFECT_REPLACE - tick_interval = 0 + tick_interval = -1 alert_type = /atom/movable/screen/alert/status_effect/limp var/msg_stage = 0//so you dont get the most intense messages immediately /// The left leg of the limping person @@ -54,11 +54,11 @@ right = C.get_bodypart(BODY_ZONE_R_LEG) update_limp() RegisterSignal(C, COMSIG_MOVABLE_MOVED, PROC_REF(check_step)) - RegisterSignals(C, list(COMSIG_CARBON_GAIN_WOUND, COMSIG_CARBON_LOSE_WOUND, COMSIG_CARBON_ATTACH_LIMB, COMSIG_CARBON_REMOVE_LIMB), PROC_REF(update_limp)) + RegisterSignals(C, list(COMSIG_CARBON_GAIN_WOUND, COMSIG_CARBON_POST_LOSE_WOUND, COMSIG_CARBON_ATTACH_LIMB, COMSIG_CARBON_REMOVE_LIMB), PROC_REF(update_limp)) return TRUE /datum/status_effect/limp/on_remove() - UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_CARBON_GAIN_WOUND, COMSIG_CARBON_LOSE_WOUND, COMSIG_CARBON_ATTACH_LIMB, COMSIG_CARBON_REMOVE_LIMB)) + UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_CARBON_GAIN_WOUND, COMSIG_CARBON_POST_LOSE_WOUND, COMSIG_CARBON_ATTACH_LIMB, COMSIG_CARBON_REMOVE_LIMB)) /atom/movable/screen/alert/status_effect/limp name = "Limping" @@ -165,51 +165,41 @@ if(W == linked_wound) qdel(src) +/datum/status_effect/wound/nextmove_modifier() + var/mob/living/carbon/C = owner -// bones -/datum/status_effect/wound/blunt - -/datum/status_effect/wound/blunt/on_apply() - . = ..() - RegisterSignal(owner, COMSIG_MOB_SWAP_HANDS, PROC_REF(on_swap_hands)) - on_swap_hands() - -/datum/status_effect/wound/blunt/on_remove() - . = ..() - UnregisterSignal(owner, COMSIG_MOB_SWAP_HANDS) - var/mob/living/carbon/wound_owner = owner - wound_owner.remove_actionspeed_modifier(/datum/actionspeed_modifier/blunt_wound) - -/datum/status_effect/wound/blunt/proc/on_swap_hands() - SIGNAL_HANDLER + if(C.get_active_hand() == linked_limb) + return linked_wound.get_action_delay_mult() - var/mob/living/carbon/wound_owner = owner - if(wound_owner.get_active_hand() == linked_limb) - wound_owner.add_actionspeed_modifier(/datum/actionspeed_modifier/blunt_wound, (linked_wound.interaction_efficiency_penalty - 1)) - else - wound_owner.remove_actionspeed_modifier(/datum/actionspeed_modifier/blunt_wound) + return ..() -/datum/status_effect/wound/blunt/nextmove_modifier() +/datum/status_effect/wound/nextmove_adjust() var/mob/living/carbon/C = owner if(C.get_active_hand() == linked_limb) - return linked_wound.interaction_efficiency_penalty + return linked_wound.get_action_delay_increment() + + return ..() - return 1 + +// bones +/datum/status_effect/wound/blunt/bone // blunt -/datum/status_effect/wound/blunt/moderate +/datum/status_effect/wound/blunt/bone/moderate id = "disjoint" -/datum/status_effect/wound/blunt/severe +/datum/status_effect/wound/blunt/bone/severe id = "hairline" -/datum/status_effect/wound/blunt/critical +/datum/status_effect/wound/blunt/bone/critical id = "compound" + // slash -/datum/status_effect/wound/slash/moderate + +/datum/status_effect/wound/slash/flesh/moderate id = "abrasion" -/datum/status_effect/wound/slash/severe +/datum/status_effect/wound/slash/flesh/severe id = "laceration" -/datum/status_effect/wound/slash/critical +/datum/status_effect/wound/slash/flesh/critical id = "avulsion" // pierce /datum/status_effect/wound/pierce/moderate @@ -219,9 +209,9 @@ /datum/status_effect/wound/pierce/critical id = "rupture" // burns -/datum/status_effect/wound/burn/moderate +/datum/status_effect/wound/burn/flesh/moderate id = "seconddeg" -/datum/status_effect/wound/burn/severe +/datum/status_effect/wound/burn/flesh/severe id = "thirddeg" -/datum/status_effect/wound/burn/critical +/datum/status_effect/wound/burn/flesh/critical id = "fourthdeg" diff --git a/code/datums/storage/storage.dm b/code/datums/storage/storage.dm index 50860f172f422..a61a8725a306e 100644 --- a/code/datums/storage/storage.dm +++ b/code/datums/storage/storage.dm @@ -16,6 +16,8 @@ var/list/cant_hold /// if set, these items will be the exception to the max size of object that can fit. var/list/exception_hold + /// if exception_hold is set, how many exception items can we hold at any one time? + var/exception_max = INFINITE /// if set can only contain stuff with this single trait present. var/list/can_hold_trait @@ -31,7 +33,7 @@ /// list of all the mobs currently viewing the contents var/list/is_using = list() - var/locked = FALSE + var/locked = STORAGE_NOT_LOCKED /// 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 @@ -89,8 +91,8 @@ var/display_contents = TRUE /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) + boxes = new(null, null, src) + closer = new(null, null, src) src.parent = WEAKREF(parent) src.real_location = src.parent @@ -137,6 +139,9 @@ RegisterSignal(resolve_parent, COMSIG_TOPIC, PROC_REF(topic_handle)) + RegisterSignal(resolve_parent, COMSIG_ATOM_EXAMINE, PROC_REF(handle_examination)) + RegisterSignal(resolve_parent, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(handle_extra_examination)) + orient_to_hud() /datum/storage/Destroy() @@ -232,6 +237,18 @@ if(href_list["show_valid_pocket_items"]) handle_show_valid_items(source, user) +/datum/storage/proc/handle_examination(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + if(!isnull(can_hold_description)) + examine_list += span_notice("You can examine this further to check what kind of extra items it can hold.") + +/datum/storage/proc/handle_extra_examination(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + if(!isnull(can_hold_description)) + examine_list += 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]")) @@ -308,9 +325,9 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) * * @param obj/item/to_insert the item we're checking * @param messages if TRUE, will print out a message if the item is not valid - * @param force bypass locked storage + * @param force bypass locked storage up to a certain level. See [code/__DEFINES/storage.dm] */ -/datum/storage/proc/can_insert(obj/item/to_insert, mob/user, messages = TRUE, force = FALSE) +/datum/storage/proc/can_insert(obj/item/to_insert, mob/user, messages = TRUE, force = STORAGE_NOT_LOCKED) var/obj/item/resolve_parent = parent?.resolve() if(!resolve_parent) return @@ -325,20 +342,27 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) if(!isitem(to_insert)) return FALSE - if(locked && !force) + if(locked > force) + if(user && messages) + user.balloon_alert(user, "closed!") return FALSE if((to_insert == resolve_parent) || (to_insert == real_location)) return FALSE - if(to_insert.w_class > max_specific_storage && !is_type_in_typecache(to_insert, exception_hold)) - if(messages && user) - to_chat(user, span_warning("\The [to_insert] is too big for \the [resolve_parent]!")) - return FALSE + if(to_insert.w_class > max_specific_storage) + if(!is_type_in_typecache(to_insert, exception_hold)) + if(messages && user) + user.balloon_alert(user, "too big!") + return FALSE + if(exception_max != INFINITE && exception_max <= exception_count()) + if(messages && user) + user.balloon_alert(user, "no room!") + return FALSE if(resolve_location.contents.len >= max_slots) if(messages && user && !silent_for_user) - to_chat(user, span_warning("\The [to_insert] can't fit into \the [resolve_parent]! Make some space!")) + user.balloon_alert(user, "no room!") return FALSE var/total_weight = to_insert.w_class @@ -348,41 +372,50 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) if(total_weight > max_total_storage) if(messages && user && !silent_for_user) - to_chat(user, span_warning("\The [to_insert] can't fit into \the [resolve_parent]! Make some space!")) + user.balloon_alert(user, "no room!") 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]!")) + user.balloon_alert(user, "can't hold!") 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]!")) + user.balloon_alert(user, "can't hold!") return FALSE if(HAS_TRAIT(to_insert, TRAIT_NODROP)) if(messages) - to_chat(user, span_warning("\The [to_insert] is stuck on your hand!")) + user.balloon_alert(user, "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 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!")) + user.balloon_alert(user, "[lowertext(resolve_parent.loc.name)] is in the way!") return FALSE if(istype(resolve_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(messages && user) - to_chat(user, span_warning("[resolve_parent] cannot hold [to_insert] as it's a storage item of the same size!")) + user.balloon_alert(user, "too big!") return FALSE return TRUE +/// Returns a count of how many items held due to exception_hold we have +/datum/storage/proc/exception_count() + var/obj/item/storage = real_location?.resolve() + var/count = 0 + for(var/obj/item/thing in storage) + if(thing.w_class > max_specific_storage && is_type_in_typecache(thing, exception_hold)) + count += 1 + return count + /** * Attempts to insert an item into the storage * @@ -390,9 +423,9 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) * @param obj/item/to_insert the item we're inserting * @param mob/user the user who is inserting the item * @param override see item_insertion_feedback() - * @param force bypass locked storage + * @param force bypass locked storage up to a certain level. See [code/__DEFINES/storage.dm] */ -/datum/storage/proc/attempt_insert(obj/item/to_insert, mob/user, override = FALSE, force = FALSE) +/datum/storage/proc/attempt_insert(obj/item/to_insert, mob/user, override = FALSE, force = STORAGE_NOT_LOCKED) var/obj/item/resolve_location = real_location?.resolve() if(!resolve_location) return FALSE @@ -740,6 +773,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) var/obj/item/resolve_location = real_location.resolve() if(locked) + user.balloon_alert(user, "closed!") return if(!user.CanReach(resolve_parent) || !user.CanReach(dest_object)) return @@ -971,7 +1005,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) if(locked) if(!silent) - resolve_parent.balloon_alert(to_show, "locked!") + resolve_parent.balloon_alert(to_show, "closed!") return FALSE // If we're quickdrawing boys diff --git a/code/datums/storage/subtypes/backpack.dm b/code/datums/storage/subtypes/backpack.dm new file mode 100644 index 0000000000000..a6b3e1477dd97 --- /dev/null +++ b/code/datums/storage/subtypes/backpack.dm @@ -0,0 +1,8 @@ +/datum/storage/backpack + max_total_storage = 21 + max_slots = 21 + +/datum/storage/backpack/santabag + max_total_storage = 60 + max_slots = 21 + max_specific_storage = WEIGHT_CLASS_NORMAL diff --git a/code/datums/storage/subtypes/bag_of_holding.dm b/code/datums/storage/subtypes/bag_of_holding.dm index 774dffef39348..9e3a486cdcd4a 100644 --- a/code/datums/storage/subtypes/bag_of_holding.dm +++ b/code/datums/storage/subtypes/bag_of_holding.dm @@ -1,3 +1,9 @@ +/datum/storage/bag_of_holding + max_specific_storage = WEIGHT_CLASS_GIGANTIC + max_total_storage = 35 + max_slots = 30 + allow_big_nesting = TRUE + /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) @@ -6,19 +12,15 @@ 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 - if(istype(to_insert, /obj/item/storage/backpack/holding) || matching.len) - INVOKE_ASYNC(src, PROC_REF(recursive_insertion), to_insert, user) + if((istype(to_insert, /obj/item/storage/backpack/holding) || matching.len) && can_insert(to_insert, user)) + INVOKE_ASYNC(src, PROC_REF(recursive_insertion), to_insert, user, resolve_parent) return 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 - +/datum/storage/bag_of_holding/proc/recursive_insertion(obj/item/to_insert, mob/living/user, atom/resolve_parent) 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) || !iscarbon(user) || !user.can_perform_action(resolve_parent, NEED_DEXTERITY)) + if(safety != "Proceed" || QDELETED(to_insert) || QDELETED(resolve_parent) || QDELETED(user) || !iscarbon(user) || !user.can_perform_action(resolve_parent, NEED_DEXTERITY) || !can_insert(to_insert, user)) return var/turf/loccheck = get_turf(resolve_parent) @@ -30,6 +32,6 @@ user.log_message("detonated a bag of holding at [loc_name(loccheck)].", LOG_ATTACK, color="red") user.investigate_log("has been gibbed by a bag of holding recursive insertion.", INVESTIGATE_DEATHS) - user.gib(TRUE, TRUE, TRUE) + user.gib() new/obj/boh_tear(loccheck) qdel(resolve_parent) diff --git a/code/datums/storage/subtypes/duffel_bag.dm b/code/datums/storage/subtypes/duffel_bag.dm new file mode 100644 index 0000000000000..02c3e99b78ee4 --- /dev/null +++ b/code/datums/storage/subtypes/duffel_bag.dm @@ -0,0 +1,65 @@ +/datum/storage/duffel + max_total_storage = 30 + max_slots = 21 + +// Syndi bags get some FUN extras +// You can fit any 2 bulky objects (assuming they're in the whitelist) +// Should have traitorus stuff in here, not just useful big things +// Idea is to allow for things we typically restrict in exchange for going loud +/datum/storage/duffel/syndicate + silent = TRUE + exception_max = 2 + +/datum/storage/duffel/syndicate/New() + . = ..() + + var/static/list/exception_type_list = list( + // Gun and gun-related accessories + /obj/item/gun, + /obj/item/pneumatic_cannon, + // Melee + /obj/item/kinetic_crusher, //mostly + /obj/item/dualsaber, + /obj/item/staff/bostaff, + /obj/item/fireaxe, + /obj/item/crowbar/mechremoval, + /obj/item/spear, + /obj/item/nullrod, + /obj/item/melee/cleric_mace, + /obj/item/melee/ghost_sword, + /obj/item/melee/cleaving_saw, + // Deployables + /obj/item/transfer_valve, + /obj/item/powersink, + /obj/item/deployable_turret_folded, + /obj/item/cardboard_cutout, + /obj/item/gibtonite, + // Sustenance + /obj/item/food/cheese/royal, + /obj/item/food/powercrepe, + // Back Items + /obj/item/tank/jetpack, + /obj/item/watertank, + // Skub + /obj/item/skub, + // Bulky Supplies + /obj/item/mecha_ammo, + /obj/item/golem_shell, + // Clothing + /obj/item/clothing/shoes/winterboots/ice_boots/eva, + /obj/item/clothing/suit/space, + /obj/item/clothing/suit/armor/heavy, + /obj/item/clothing/suit/bio_suit, + /obj/item/clothing/suit/utility, + // Storage + /obj/item/storage/bag/money, + // Heads! + /obj/item/bodypart/head, + ) + + // We keep the type list and the typecache list separate... + var/static/list/exception_cache = typecacheof(exception_type_list) + exception_hold = exception_cache + + //...So we can run this without it generating a line for every subtype. + can_hold_description = generate_hold_desc(exception_type_list) diff --git a/code/datums/storage/subtypes/extract_inventory.dm b/code/datums/storage/subtypes/extract_inventory.dm index 4aefd6781b7c6..8c571dbda1ac2 100644 --- a/code/datums/storage/subtypes/extract_inventory.dm +++ b/code/datums/storage/subtypes/extract_inventory.dm @@ -4,7 +4,7 @@ insert_preposition = "in" attack_hand_interact = FALSE quickdraw = FALSE - locked = TRUE + locked = STORAGE_FULLY_LOCKED rustle_sound = FALSE silent = TRUE diff --git a/code/datums/storage/subtypes/fish_case.dm b/code/datums/storage/subtypes/fish_case.dm new file mode 100644 index 0000000000000..bc16f1607bfb4 --- /dev/null +++ b/code/datums/storage/subtypes/fish_case.dm @@ -0,0 +1,33 @@ +/datum/storage/fish_case + max_slots = 1 + max_specific_storage = WEIGHT_CLASS_HUGE + can_hold_trait = TRAIT_FISH_CASE_COMPATIBILE + can_hold_description = "fish and aquarium equipment" + +/** + * Change the size of the storage item to match the inserted item's + * Because of that, we also check if conditions to keep it inside another storage or pockets are still met. + */ +/datum/storage/fish_case/handle_enter(obj/item/storage/fish_case/source, obj/item/arrived) + . = ..() + if(!istype(arrived) || arrived.w_class == source.w_class) + return + source.w_class = arrived.w_class + var/obj/item/resolve_parent = parent?.resolve() + if(resolve_parent?.item_flags & IN_STORAGE) + source.moveToNullspace() //temporarily remove source from its location so that attempt_insert may work correctly. + if(!resolve_parent.atom_storage?.attempt_insert(source, override = TRUE)) + source.forceMove(resolve_parent.drop_location()) + source.visible_message("[source] spills out of [resolve_parent] as it expands to hold [arrived]", vision_distance = 1) + else if(!isliving(source.loc)) + return + var/mob/living/living_loc = source.loc + var/equipped_slot = living_loc.get_slot_by_item(source) + if(equipped_slot & (ITEM_SLOT_RPOCKET|ITEM_SLOT_LPOCKET) && source.w_class > WEIGHT_CLASS_SMALL) + source.forceMove(living_loc.drop_location()) + to_chat(living_loc, "[source] drops out of your pockets as it expands to hold [arrived]") + +/datum/storage/fish_case/handle_exit(obj/item/storage/fish_case/source, obj/item/gone) + . = ..() + if(istype(gone)) + source.w_class = initial(source.w_class) diff --git a/code/datums/storage/subtypes/pockets.dm b/code/datums/storage/subtypes/pockets.dm index 5c8d862cc1c74..4bd60ba57b669 100644 --- a/code/datums/storage/subtypes/pockets.dm +++ b/code/datums/storage/subtypes/pockets.dm @@ -103,7 +103,7 @@ /obj/item/toy/crayon, /obj/item/reagent_containers/cup/glass/flask), list(/obj/item/screwdriver/power, - /obj/item/ammo_casing/caseless/rocket, + /obj/item/ammo_casing/rocket, /obj/item/clothing/mask/cigarette/pipe, /obj/item/toy/crayon/spraycan) ) @@ -138,7 +138,7 @@ /obj/item/bikehorn, /obj/item/reagent_containers/cup/glass/flask), list(/obj/item/screwdriver/power, - /obj/item/ammo_casing/caseless/rocket, + /obj/item/ammo_casing/rocket, /obj/item/clothing/mask/cigarette/pipe, /obj/item/toy/crayon/spraycan) ) @@ -167,7 +167,7 @@ set_holdable(list(/obj/item/reagent_containers/cup/glass/bottle/vodka, /obj/item/reagent_containers/cup/glass/bottle/molotov, /obj/item/reagent_containers/cup/glass/drinkingglass, - /obj/item/ammo_box/a762)) + /obj/item/ammo_box/strilka310)) /datum/storage/pockets/void_cloak @@ -178,7 +178,7 @@ /datum/storage/pockets/void_cloak/New() . = ..() set_holdable(list( - /obj/item/ammo_box/a762/lionhunter, + /obj/item/ammo_box/strilka310/lionhunter, /obj/item/bodypart, // Bodyparts are often used in rituals. They're also often normal sized, so you can only fit one. /obj/item/clothing/neck/eldritch_amulet, /obj/item/clothing/neck/heretic_focus, diff --git a/code/datums/storage/subtypes/surgery_tray.dm b/code/datums/storage/subtypes/surgery_tray.dm new file mode 100644 index 0000000000000..358865813188b --- /dev/null +++ b/code/datums/storage/subtypes/surgery_tray.dm @@ -0,0 +1,22 @@ +/datum/storage/surgery_tray + max_total_storage = 30 + max_specific_storage = WEIGHT_CLASS_NORMAL + max_slots = 14 + +/datum/storage/surgery_tray/New() + . = ..() + set_holdable(list( + /obj/item/blood_filter, + /obj/item/bonesetter, + /obj/item/cautery, + /obj/item/circular_saw, + /obj/item/clothing/mask/surgical, + /obj/item/hemostat, + /obj/item/razor, + /obj/item/retractor, + /obj/item/scalpel, + /obj/item/stack/medical/bone_gel, + /obj/item/stack/sticky_tape/surgical, + /obj/item/surgical_drapes, + /obj/item/surgicaldrill, + )) diff --git a/code/datums/voice_of_god_command.dm b/code/datums/voice_of_god_command.dm index 4c2526f6cace5..1be31c33d2a8e 100644 --- a/code/datums/voice_of_god_command.dm +++ b/code/datums/voice_of_god_command.dm @@ -26,13 +26,13 @@ GLOBAL_LIST_INIT(voice_of_god_commands, init_voice_of_god_commands()) * The first matching command (from a list of static datums) the listeners must obey, * and the return value of this proc the cooldown variable of the command dictates. (only relevant for things with cooldowns i guess) */ -/proc/voice_of_god(message, mob/living/user, list/span_list, base_multiplier = 1, include_speaker = FALSE, forced = null) +/proc/voice_of_god(message, mob/living/user, list/span_list, base_multiplier = 1, include_speaker = FALSE, forced = null, ignore_spam = FALSE) var/log_message = uppertext(message) var/is_cultie = IS_CULTIST(user) if(LAZYLEN(span_list) && is_cultie) span_list = list("narsiesmall") - if(!user.say(message, spans = span_list, sanitize = FALSE)) + if(!user.say(message, spans = span_list, sanitize = FALSE, ignore_spam = ignore_spam, forced = forced)) return message = lowertext(message) @@ -144,7 +144,7 @@ GLOBAL_LIST_INIT(voice_of_god_commands, init_voice_of_god_commands()) /datum/voice_of_god_command/vomit/execute(list/listeners, mob/living/user, power_multiplier = 1, message) for(var/mob/living/carbon/target in listeners) - target.vomit(10 * power_multiplier, distance = power_multiplier, stun = FALSE) + target.vomit(vomit_flags = (MOB_VOMIT_MESSAGE | MOB_VOMIT_HARM), lost_nutrition = (power_multiplier * 10), distance = power_multiplier) /// This command silences the listeners. Thrice as effective is the user is a mime or curator. /datum/voice_of_god_command/silence @@ -348,7 +348,7 @@ GLOBAL_LIST_INIT(voice_of_god_commands, init_voice_of_god_commands()) /datum/voice_of_god_command/walk/execute(list/listeners, mob/living/user, power_multiplier = 1, message) for(var/mob/living/target as anything in listeners) - if(target.m_intent != MOVE_INTENT_WALK) + if(target.move_intent != MOVE_INTENT_WALK) target.toggle_move_intent() /// This command forces the listeners to switch to run intent. @@ -358,7 +358,7 @@ GLOBAL_LIST_INIT(voice_of_god_commands, init_voice_of_god_commands()) /datum/voice_of_god_command/walk/execute(list/listeners, mob/living/user, power_multiplier = 1, message) for(var/mob/living/target as anything in listeners) - if(target.m_intent != MOVE_INTENT_RUN) + if(target.move_intent != MOVE_INTENT_RUN) target.toggle_move_intent() /// This command turns the listeners' throw mode on. diff --git a/code/datums/votes/map_vote.dm b/code/datums/votes/map_vote.dm index b4ff2fd5a8129..dc6afd98acb3c 100644 --- a/code/datums/votes/map_vote.dm +++ b/code/datums/votes/map_vote.dm @@ -20,7 +20,7 @@ /datum/vote/map_vote/create_vote() . = ..() check_population(should_key_choices = FALSE) - if((length(choices) == 1) && EMERGENCY_ESCAPED_OR_ENDGAMED) // Only one choice, no need to vote. Let's just auto-rotate it to the only remaining map because it would just happen anyways. + if(length(choices) == 1) // Only one choice, no need to vote. Let's just auto-rotate it to the only remaining map because it would just happen anyways. var/de_facto_winner = choices[1] var/datum/map_config/change_me_out = global.config.maplist[de_facto_winner] SSmapping.changemap(change_me_out) @@ -118,3 +118,12 @@ SSmapping.map_voted = TRUE if(SSmapping.map_vote_rocked) SSmapping.map_vote_rocked = FALSE + +/proc/revert_map_vote() + var/datum/map_config/override_map = SSmapping.config + if(isnull(override_map)) + return + + SSmapping.changemap(override_map) + log_game("The next map has been reset to [override_map.map_name].") + send_to_playing_players(span_boldannounce("The next map is: [override_map.map_name].")) diff --git a/code/datums/votes/restart_vote.dm b/code/datums/votes/restart_vote.dm index 24d38f35396dd..987d5b87eb363 100644 --- a/code/datums/votes/restart_vote.dm +++ b/code/datums/votes/restart_vote.dm @@ -67,7 +67,14 @@ 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 - SSticker.Reboot("Restart vote successful.", "restart vote", 1) + // If there was a previous map vote, we revert the change. + if(!isnull(SSmapping.next_map_config)) + log_game("The next map has been reset due to successful restart vote.") + send_to_playing_players(span_boldannounce("The next map has been reset due to successful restart vote.")) + revert_map_vote() + + SSticker.force_ending = FORCE_END_ROUND + log_game("End round forced by successful restart vote.") return CRASH("[type] wasn't passed a valid winning choice. (Got: [winning_option || "null"])") diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm index b3d9e96743ba5..f262a6c0c4762 100644 --- a/code/datums/weather/weather.dm +++ b/code/datums/weather/weather.dm @@ -115,7 +115,8 @@ weather_duration = rand(weather_duration_lower, weather_duration_upper) SSweather.processing |= src update_areas() - send_alert(telegraph_message, telegraph_sound) + if(telegraph_duration) + send_alert(telegraph_message, telegraph_sound) addtimer(CALLBACK(src, PROC_REF(start)), telegraph_duration) /** @@ -134,6 +135,8 @@ send_alert(weather_message, weather_sound) if(!perpetual) addtimer(CALLBACK(src, PROC_REF(wind_down)), weather_duration) + for(var/area/impacted_area as anything in impacted_areas) + SEND_SIGNAL(impacted_area, COMSIG_WEATHER_BEGAN_IN_AREA(type)) /** * Weather enters the winding down phase, stops effects @@ -165,6 +168,8 @@ stage = END_STAGE SSweather.processing -= src update_areas() + for(var/area/impacted_area as anything in impacted_areas) + SEND_SIGNAL(impacted_area, COMSIG_WEATHER_ENDED_IN_AREA(type)) // handles sending all alerts /datum/weather/proc/send_alert(alert_msg, alert_sfx) diff --git a/code/datums/weather/weather_types/ash_storm.dm b/code/datums/weather/weather_types/ash_storm.dm index 07ca889821854..92a1ba1eed65b 100644 --- a/code/datums/weather/weather_types/ash_storm.dm +++ b/code/datums/weather/weather_types/ash_storm.dm @@ -57,10 +57,6 @@ 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)) @@ -73,15 +69,12 @@ victim.adjustFireLoss(4) /datum/weather/ash_storm/end() - . = ..() + GLOB.ash_storm_sounds -= weak_sounds 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)]" + basalt.refill_dug() + return ..() //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 diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm index 5e736277f8f53..c96a877110cf8 100644 --- a/code/datums/weather/weather_types/radiation_storm.dm +++ b/code/datums/weather/weather_types/radiation_storm.dm @@ -24,6 +24,10 @@ target_trait = ZTRAIT_STATION immunity_type = TRAIT_RADSTORM_IMMUNE + /// Chance we get a negative mutation, if we fail we get a positive one + var/negative_mutation_chance = 90 + /// Chance we mutate + var/mutate_chance = 40 /datum/weather/rad_storm/telegraph() ..() @@ -31,7 +35,7 @@ /datum/weather/rad_storm/weather_act(mob/living/L) - if(!prob(40)) + if(!prob(mutate_chance)) return if(!ishuman(L)) @@ -51,11 +55,7 @@ H.random_mutate_unique_features() if(prob(50)) - if(prob(90)) - H.easy_random_mutate(NEGATIVE+MINOR_NEGATIVE) - else - H.easy_random_mutate(POSITIVE) - H.domutcheck() + do_mutate(L) /datum/weather/rad_storm/end() if(..()) @@ -63,6 +63,13 @@ priority_announce("The radiation threat has passed. Please return to your workplaces.", "Anomaly Alert") status_alarm(FALSE) +/datum/weather/rad_storm/proc/do_mutate(mob/living/carbon/human/mutant) + if(prob(negative_mutation_chance)) + mutant.easy_random_mutate(NEGATIVE+MINOR_NEGATIVE) + else + mutant.easy_random_mutate(POSITIVE) + mutant.domutcheck() + /datum/weather/rad_storm/proc/status_alarm(active) //Makes the status displays show the radiation warning for those who missed the announcement. var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS) if(!frequency) @@ -75,5 +82,41 @@ else signal.data["command"] = "shuttle" - var/atom/movable/virtualspeaker/virt = new(null) - frequency.post_signal(virt, signal) + var/atom/movable/virtualspeaker/virtual_speaker = new(null) + frequency.post_signal(virtual_speaker, signal) + +/// Used by the radioactive nebula when the station doesnt have enough shielding +/datum/weather/rad_storm/nebula + protected_areas = list(/area/shuttle) + + weather_overlay = "nebula_radstorm" + weather_duration_lower = 100 HOURS + weather_duration_upper = 100 HOURS + + end_message = null + + mutate_chance = 0.1 + + ///Chance we pulse a living during the storm + var/radiation_chance = 5 + +/datum/weather/rad_storm/nebula/weather_act(mob/living/living) + ..() + + if(!prob(radiation_chance)) + return + + if(!SSradiation.can_irradiate_basic(living) || SSradiation.wearing_rad_protected_clothing(living)) + return + + radiation_pulse( + source = living, + max_range = 0, + threshold = RAD_LIGHT_INSULATION, + chance = URANIUM_IRRADIATION_CHANCE, + ) + +/datum/weather/rad_storm/nebula/status_alarm(active) + if(!active) //we stay on + return + ..() diff --git a/code/datums/weather/weather_types/snow_storm.dm b/code/datums/weather/weather_types/snow_storm.dm index 080ea3cc878a2..66aa8b2ba1580 100644 --- a/code/datums/weather/weather_types/snow_storm.dm +++ b/code/datums/weather/weather_types/snow_storm.dm @@ -23,10 +23,13 @@ barometer_predictable = TRUE + ///Lowest we can cool someone randomly per weather act. Positive values only + var/cooling_lower = 5 + ///Highest we can cool someone randomly per weather act. Positive values only + var/cooling_upper = 15 -/datum/weather/snow_storm/weather_act(mob/living/L) - L.adjust_bodytemperature(-rand(5,15)) - +/datum/weather/snow_storm/weather_act(mob/living/living) + living.adjust_bodytemperature(-rand(cooling_lower, cooling_upper)) // since snowstorm is on a station z level, add extra checks to not annoy everyone /datum/weather/snow_storm/can_get_alert(mob/player) @@ -39,7 +42,7 @@ if(isobserver(player)) return TRUE - if(HAS_TRAIT(player, TRAIT_DETECT_STORM) || HAS_TRAIT(player.mind, TRAIT_DETECT_STORM)) + if(HAS_MIND_TRAIT(player, TRAIT_DETECT_STORM)) return TRUE if(istype(get_area(player), /area/mine)) @@ -51,3 +54,13 @@ return TRUE return FALSE + +///A storm that doesn't stop storming, and is a bit stronger +/datum/weather/snow_storm/forever_storm + telegraph_duration = 0 + perpetual = TRUE + + probability = 0 + + cooling_lower = 5 + cooling_upper = 18 diff --git a/code/datums/weather/weather_types/void_storm.dm b/code/datums/weather/weather_types/void_storm.dm index becfa9859a81a..4d3638c582711 100644 --- a/code/datums/weather/weather_types/void_storm.dm +++ b/code/datums/weather/weather_types/void_storm.dm @@ -33,8 +33,11 @@ return FALSE /datum/weather/void_storm/weather_act(mob/living/victim) - victim.adjustFireLoss(1) - victim.adjustOxyLoss(rand(1, 3)) + var/need_mob_update = FALSE + victim.adjustFireLoss(1, updating_health = FALSE) + victim.adjustOxyLoss(rand(1, 3), updating_health = FALSE) + if(need_mob_update) + victim.updatehealth() victim.adjust_eye_blur(rand(0 SECONDS, 2 SECONDS)) victim.adjust_bodytemperature(-30 * TEMPERATURE_DAMAGE_COEFFICIENT) diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm index 499a83245e884..823585a9d7369 100644 --- a/code/datums/wires/_wires.dm +++ b/code/datums/wires/_wires.dm @@ -116,7 +116,8 @@ randomize() /datum/wires/proc/repair() - cut_wires.Cut()//a negative times a negative equals a positive + for(var/wire in cut_wires) + cut(wire) // I KNOW I KNOW OK /datum/wires/proc/get_wire(color) return colors[color] @@ -152,23 +153,25 @@ /datum/wires/proc/is_dud_color(color) return is_dud(get_wire(color)) -/datum/wires/proc/cut(wire) +/datum/wires/proc/cut(wire, source) if(is_cut(wire)) cut_wires -= wire - on_cut(wire, mend = TRUE) + SEND_SIGNAL(src, COMSIG_MEND_WIRE(wire), wire) + on_cut(wire, mend = TRUE, source = source) else cut_wires += wire - on_cut(wire, mend = FALSE) + SEND_SIGNAL(src, COMSIG_CUT_WIRE(wire), wire) + on_cut(wire, mend = FALSE, source = source) -/datum/wires/proc/cut_color(color) - cut(get_wire(color)) +/datum/wires/proc/cut_color(color, source) + cut(get_wire(color), source) -/datum/wires/proc/cut_random() - cut(wires[rand(1, wires.len)]) +/datum/wires/proc/cut_random(source) + cut(wires[rand(1, wires.len)], source) -/datum/wires/proc/cut_all() +/datum/wires/proc/cut_all(source) for(var/wire in wires) - cut(wire) + cut(wire, source) /datum/wires/proc/pulse(wire, user, force=FALSE) if(!force && is_cut(wire)) @@ -188,14 +191,6 @@ if(S && istype(S) && S.attachable && !is_attached(color)) assemblies[color] = S S.forceMove(holder) - /** - * special snowflake check for machines - * someone attached a signaler to the machines wires - * move it to the machines component parts so it doesn't get moved out in dump_inventory_contents() which gets called a lot - */ - if(istype(holder, /obj/machinery)) - var/obj/machinery/machine = holder - LAZYADD(machine.component_parts, S) S.connected = src S.on_attach() // Notify assembly that it is attached return S @@ -229,7 +224,7 @@ /datum/wires/proc/get_status() return list() -/datum/wires/proc/on_cut(wire, mend = FALSE) +/datum/wires/proc/on_cut(wire, mend = FALSE, source = null) return /datum/wires/proc/on_pulse(wire, user) @@ -326,7 +321,7 @@ if(I || isAdminGhostAI(usr)) if(I && holder) I.play_tool_sound(holder, 20) - cut_color(target_wire) + cut_color(target_wire, source = L) . = TRUE else to_chat(L, span_warning("You need wirecutters!")) diff --git a/code/datums/wires/airalarm.dm b/code/datums/wires/airalarm.dm index 5fe9768d59139..2dc3244e9cac6 100644 --- a/code/datums/wires/airalarm.dm +++ b/code/datums/wires/airalarm.dm @@ -52,7 +52,7 @@ A.danger_level = AIR_ALARM_ALERT_NONE A.update_appearance() -/datum/wires/airalarm/on_cut(wire, mend) +/datum/wires/airalarm/on_cut(wire, mend, source) var/obj/machinery/airalarm/A = holder switch(wire) if(WIRE_POWER) // Short out forever. diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm index e7914d4fe704c..8f768d407c206 100644 --- a/code/datums/wires/airlock.dm +++ b/code/datums/wires/airlock.dm @@ -45,7 +45,7 @@ WIRE_BACKUP2, WIRE_BOLTS, WIRE_IDSCAN, - WIRE_LIGHT, + WIRE_BOLTLIGHT, WIRE_OPEN, WIRE_POWER1, WIRE_POWER2, @@ -142,13 +142,13 @@ A.close() if(WIRE_TIMING) A.normalspeed = !A.normalspeed - if(WIRE_LIGHT) + if(WIRE_BOLTLIGHT) A.lights = !A.lights A.update_appearance() if(WIRE_UNRESTRICTED_EXIT) // Pulse to switch the direction around by 180 degrees (North goes to South, East goes to West, vice-versa) if(!A.unres_sensor) //only works if the "sensor" is installed (a variable that we assign to the door either upon creation of a door with unrestricted directions or if an unrestricted helper is added to a door in mapping) return - A.unres_sides = DIRFLIP(A.unres_sides) + A.unres_sides = REVERSE_DIR(A.unres_sides) A.update_appearance() /obj/machinery/door/airlock/proc/reset_ai_wire() @@ -157,7 +157,7 @@ else if(aiControlDisabled == AI_WIRE_HACKED) aiControlDisabled = AI_WIRE_DISABLED_HACKED -/datum/wires/airlock/on_cut(wire, mend) +/datum/wires/airlock/on_cut(wire, mend, source) var/obj/machinery/door/airlock/A = holder switch(wire) if(WIRE_POWER1, WIRE_POWER2) // Cut to lose power, repair all to gain power. @@ -189,6 +189,8 @@ else if(A.aiControlDisabled == AI_WIRE_DISABLED_HACKED) A.aiControlDisabled = AI_WIRE_HACKED if(WIRE_SHOCK) // Cut to shock the door, mend to unshock. + if (!isnull(source)) + log_combat(source, A, "[mend ? "disabled" : "enabled"] shocking for") if(mend) if(A.secondsElectrified) A.set_electrified(MACHINE_NOT_ELECTRIFIED, usr) @@ -198,11 +200,13 @@ A.shock(usr, 100) if(WIRE_SAFETY) // Cut to disable safeties, mend to re-enable. A.safe = mend + if (!isnull(source)) + log_combat(source, A, "[mend ? "enabled" : "disabled"] door safeties for") if(WIRE_TIMING) // Cut to disable auto-close, mend to re-enable. A.autoclose = mend if(A.autoclose && !A.density) INVOKE_ASYNC(A, TYPE_PROC_REF(/obj/machinery/door/airlock, close)) - if(WIRE_LIGHT) // Cut to disable lights, mend to re-enable. + if(WIRE_BOLTLIGHT) // Cut to disable lights, mend to re-enable. A.lights = mend A.update_appearance() if(WIRE_ZAP1, WIRE_ZAP2) // Ouch. diff --git a/code/datums/wires/apc.dm b/code/datums/wires/apc.dm index eebab28613a89..54d179802a311 100644 --- a/code/datums/wires/apc.dm +++ b/code/datums/wires/apc.dm @@ -40,7 +40,7 @@ A.aidisabled = TRUE addtimer(CALLBACK(A, TYPE_PROC_REF(/obj/machinery/power/apc, reset), wire), 1 SECONDS) -/datum/wires/apc/on_cut(wire, mend) +/datum/wires/apc/on_cut(wire, mend, source) var/obj/machinery/power/apc/A = holder switch(wire) if(WIRE_POWER1, WIRE_POWER2) // Short out. diff --git a/code/datums/wires/autolathe.dm b/code/datums/wires/autolathe.dm index bf30ba39c086f..ca55dad954f6d 100644 --- a/code/datums/wires/autolathe.dm +++ b/code/datums/wires/autolathe.dm @@ -37,7 +37,7 @@ A.disabled = !A.disabled addtimer(CALLBACK(A, TYPE_PROC_REF(/obj/machinery/autolathe, reset), wire), 60) -/datum/wires/autolathe/on_cut(wire, mend) +/datum/wires/autolathe/on_cut(wire, mend, source) var/obj/machinery/autolathe/A = holder switch(wire) if(WIRE_HACK) diff --git a/code/datums/wires/conveyor.dm b/code/datums/wires/conveyor.dm index 53175eb00fb7b..dd0ac811bc252 100644 --- a/code/datums/wires/conveyor.dm +++ b/code/datums/wires/conveyor.dm @@ -1,7 +1,7 @@ /datum/wires/conveyor holder_type = /obj/machinery/conveyor_switch proper_name = "Conveyor" - /// var holder that logs who put the assembly inside and gets transfered to the switch on pulse + /// var holder that logs who put the assembly inside and gets transferred to the switch on pulse var/datum/weakref/fingerman_ref /datum/wires/conveyor/New(atom/holder) diff --git a/code/datums/wires/ecto_sniffer.dm b/code/datums/wires/ecto_sniffer.dm index d4dcae6fb002a..e8006bd4f3b3c 100644 --- a/code/datums/wires/ecto_sniffer.dm +++ b/code/datums/wires/ecto_sniffer.dm @@ -12,6 +12,6 @@ our_sniffer.activate() ..() -/datum/wires/ecto_sniffer/on_cut(wire, mend) +/datum/wires/ecto_sniffer/on_cut(wire, mend, source) var/obj/machinery/ecto_sniffer/our_sniffer = holder our_sniffer.sensor_enabled = mend diff --git a/code/datums/wires/explosive.dm b/code/datums/wires/explosive.dm index 762a5552df059..800b5b884449f 100644 --- a/code/datums/wires/explosive.dm +++ b/code/datums/wires/explosive.dm @@ -10,7 +10,9 @@ /datum/wires/explosive/on_pulse(index) explode() -/datum/wires/explosive/on_cut(index, mend) +/datum/wires/explosive/on_cut(index, mend, source) + if (!isnull(source)) + log_combat(source, holder, "cut the detonation wire for") explode() /datum/wires/explosive/proc/explode() @@ -34,7 +36,7 @@ return . = ..() -/datum/wires/explosive/chem_grenade/on_cut(index, mend) +/datum/wires/explosive/chem_grenade/on_cut(index, mend, source) var/obj/item/grenade/chem_grenade/grenade = holder if(grenade.stage != GRENADE_READY) return @@ -127,7 +129,7 @@ else // Boom explode() -/datum/wires/explosive/pizza/on_cut(wire, mend) +/datum/wires/explosive/pizza/on_cut(wire, mend, source) var/obj/item/pizzabox/P = holder switch(wire) if(WIRE_DISARM) // Disarm and untrap the box. @@ -135,6 +137,8 @@ P.bomb_defused = TRUE else if(!mend && !P.bomb_defused) + if (!isnull(source)) + log_combat(source, holder, "cut the detonation wire for") explode() /datum/wires/explosive/pizza/explode() @@ -147,4 +151,4 @@ /datum/wires/explosive/gibtonite/explode() var/obj/item/gibtonite/P = holder - P.GibtoniteReaction(null, 2) + P.GibtoniteReaction(null, "A wire signal has primed a") diff --git a/code/datums/wires/fax.dm b/code/datums/wires/fax.dm index 3a0193e5a4c22..8c189d68df880 100644 --- a/code/datums/wires/fax.dm +++ b/code/datums/wires/fax.dm @@ -38,7 +38,7 @@ if(WIRE_LOADCHECK) machine.allow_exotic_faxes = !machine.allow_exotic_faxes -/datum/wires/fax/on_cut(wire, mend) +/datum/wires/fax/on_cut(wire, mend, source) var/obj/machinery/fax/machine = holder switch(wire) if(WIRE_SHOCK) diff --git a/code/datums/wires/mass_driver.dm b/code/datums/wires/mass_driver.dm new file mode 100644 index 0000000000000..329da73c2dcb4 --- /dev/null +++ b/code/datums/wires/mass_driver.dm @@ -0,0 +1,25 @@ +/datum/wires/mass_driver + holder_type = /obj/machinery/mass_driver + proper_name = "Mass Driver" + +/datum/wires/mass_driver/New(atom/holder) + wires = list(WIRE_LAUNCH, WIRE_SAFETIES) + ..() + +/datum/wires/mass_driver/on_pulse(wire) + var/obj/machinery/mass_driver/the_mass_driver = holder + switch(wire) + if(WIRE_LAUNCH) + the_mass_driver.drive() + holder.visible_message(span_notice("The drive mechanism activates.")) + if(WIRE_SAFETIES) + the_mass_driver.power = 3 + holder.visible_message(span_notice("You hear a worrying whirring noise emitting from the mass driver.")) + +/datum/wires/mass_driver/on_cut(wire, mend, source) + var/obj/machinery/mass_driver/the_mass_driver = holder + switch(wire) + if(WIRE_SAFETIES) + if(the_mass_driver.power > 1) + the_mass_driver.power = 1 + holder.visible_message(span_notice("The whirring noise emitting from the mass driver stops.")) diff --git a/code/datums/wires/mecha.dm b/code/datums/wires/mecha.dm new file mode 100644 index 0000000000000..07bc119014816 --- /dev/null +++ b/code/datums/wires/mecha.dm @@ -0,0 +1,78 @@ +/datum/wires/mecha + holder_type = /obj/vehicle/sealed/mecha + proper_name = "Mecha Control" + +/datum/wires/mecha/New(atom/holder) + wires = list(WIRE_IDSCAN, WIRE_DISARM, WIRE_ZAP, WIRE_OVERCLOCK) + var/obj/vehicle/sealed/mecha/mecha = holder + if(mecha.mecha_flags & HAS_LIGHTS) + wires += WIRE_LIGHT + add_duds(3) + ..() + +/datum/wires/mecha/interactable(mob/user) + if(!..()) + return FALSE + var/obj/vehicle/sealed/mecha/mecha = holder + return mecha.mecha_flags & PANEL_OPEN + +/datum/wires/mecha/get_status() + var/obj/vehicle/sealed/mecha/mecha = holder + var/list/status = list() + status += "The orange light is [mecha.internal_damage & MECHA_INT_SHORT_CIRCUIT ? "on" : "off"]." + status += "The red light is [mecha.overclock_mode ? "blinking" : "off"]." + status += "The green light is [(mecha.mecha_flags & ID_LOCK_ON) || mecha.dna_lock ? "on" : "off"]." + if(mecha.mecha_flags & HAS_LIGHTS) + status += "The yellow light is [mecha.light_on ? "on" : "off"]." + status += "The blue light is [mecha.equipment_disabled ? "on" : "off"]." + return status + +/datum/wires/mecha/on_pulse(wire) + var/obj/vehicle/sealed/mecha/mecha = holder + switch(wire) + if(WIRE_IDSCAN) + mecha.mecha_flags ^= ID_LOCK_ON + mecha.dna_lock = null + if(WIRE_DISARM) + mecha.equipment_disabled = TRUE + mecha.set_mouse_pointer() + if(WIRE_ZAP) + mecha.internal_damage ^= MECHA_INT_SHORT_CIRCUIT + if(WIRE_LIGHT) + mecha.set_light_on(!mecha.light_on) + if(WIRE_OVERCLOCK) + mecha.toggle_overclock() + +/datum/wires/mecha/on_cut(wire, mend, source) + var/obj/vehicle/sealed/mecha/mecha = holder + switch(wire) + if(WIRE_IDSCAN) + if(!mend) + mecha.mecha_flags &= ~ID_LOCK_ON + mecha.dna_lock = null + if(WIRE_DISARM) + mecha.equipment_disabled = !mend + mecha.set_mouse_pointer() + if(WIRE_ZAP) + if(mend) + mecha.internal_damage &= ~MECHA_INT_SHORT_CIRCUIT + else + mecha.internal_damage |= MECHA_INT_SHORT_CIRCUIT + if(WIRE_LIGHT) + mecha.set_light_on(!mend) + if(WIRE_OVERCLOCK) + if(!mend) + mecha.toggle_overclock(FALSE) + +/datum/wires/mecha/ui_act(action, params) + . = ..() + if(.) + return + var/obj/vehicle/sealed/mecha/mecha = holder + if(!issilicon(usr) && mecha.internal_damage & MECHA_INT_SHORT_CIRCUIT && mecha.shock(usr)) + return FALSE + +/datum/wires/mecha/can_reveal_wires(mob/user) + if(HAS_TRAIT(user, TRAIT_KNOW_ROBO_WIRES)) + return TRUE + return ..() diff --git a/code/datums/wires/microwave.dm b/code/datums/wires/microwave.dm index b89aef6f8c9e5..abce90e8de5e2 100644 --- a/code/datums/wires/microwave.dm +++ b/code/datums/wires/microwave.dm @@ -22,7 +22,7 @@ if(WIRE_ACTIVATE) M.cook() -/datum/wires/microwave/on_cut(wire, mend) +/datum/wires/microwave/on_cut(wire, mend, source) var/obj/machinery/microwave/M = holder switch(wire) if(WIRE_ACTIVATE) diff --git a/code/datums/wires/mod.dm b/code/datums/wires/mod.dm index b5805557eafaf..09274880367ac 100644 --- a/code/datums/wires/mod.dm +++ b/code/datums/wires/mod.dm @@ -34,7 +34,7 @@ if(WIRE_INTERFACE) mod.interface_break = !mod.interface_break -/datum/wires/mod/on_cut(wire, mend) +/datum/wires/mod/on_cut(wire, mend, source) var/obj/item/mod/control/mod = holder switch(wire) if(WIRE_HACK) @@ -55,3 +55,8 @@ if(!issilicon(usr) && mod.seconds_electrified && mod.shock(usr)) return FALSE return ..() + +/datum/wires/mod/can_reveal_wires(mob/user) + if(HAS_TRAIT(user, TRAIT_KNOW_ROBO_WIRES)) + return TRUE + return ..() diff --git a/code/datums/wires/mulebot.dm b/code/datums/wires/mulebot.dm index 8351da231b0b9..9ec8cbe4db196 100644 --- a/code/datums/wires/mulebot.dm +++ b/code/datums/wires/mulebot.dm @@ -23,7 +23,7 @@ if(mule.bot_cover_flags & BOT_COVER_OPEN) return TRUE -/datum/wires/mulebot/on_cut(wire, mend) +/datum/wires/mulebot/on_cut(wire, mend, source) var/mob/living/simple_animal/bot/mulebot/mule = holder switch(wire) if(WIRE_MOTOR1, WIRE_MOTOR2) @@ -38,6 +38,9 @@ mule.set_varspeed(AVERAGE_MOTOR_SPEED) else mule.set_varspeed(SLOW_MOTOR_SPEED) + if(WIRE_AVOIDANCE) + if (!isnull(source)) + log_combat(source, mule, "[is_cut(WIRE_AVOIDANCE) ? "cut" : "mended"] the MULE safety wire of") /datum/wires/mulebot/on_pulse(wire) var/mob/living/simple_animal/bot/mulebot/mule = holder diff --git a/code/datums/wires/r_n_d.dm b/code/datums/wires/r_n_d.dm index 9e483b397c9b3..b38c1bcd9b562 100644 --- a/code/datums/wires/r_n_d.dm +++ b/code/datums/wires/r_n_d.dm @@ -33,7 +33,7 @@ R.hacked = !R.hacked if(WIRE_DISABLE) R.disabled = !R.disabled -/datum/wires/rnd/on_cut(wire, mend) +/datum/wires/rnd/on_cut(wire, mend, source) var/obj/machinery/rnd/R = holder switch(wire) if(WIRE_HACK) diff --git a/code/datums/wires/robot.dm b/code/datums/wires/robot.dm index 9d209df7b546b..8e3870acb47cf 100644 --- a/code/datums/wires/robot.dm +++ b/code/datums/wires/robot.dm @@ -68,7 +68,7 @@ if(R.has_model()) R.visible_message(span_notice("[R]'s model servos twitch."), span_notice("Your model display flickers.")) -/datum/wires/robot/on_cut(wire, mend) +/datum/wires/robot/on_cut(wire, mend, source) var/mob/living/silicon/robot/R = holder switch(wire) if(WIRE_AI) // Cut the AI wire to reset AI control. @@ -105,7 +105,7 @@ log_silicon("[key_name(usr)] reset [key_name(R)]'s module via wire") /datum/wires/robot/can_reveal_wires(mob/user) - if(HAS_TRAIT(user, TRAIT_KNOW_CYBORG_WIRES)) + if(HAS_TRAIT(user, TRAIT_KNOW_ROBO_WIRES)) return TRUE return ..() diff --git a/code/datums/wires/roulette.dm b/code/datums/wires/roulette.dm index ac57bbbe2eda0..f93bc3416999c 100644 --- a/code/datums/wires/roulette.dm +++ b/code/datums/wires/roulette.dm @@ -51,7 +51,7 @@ R.audible_message(span_warning("Unauthorized prize vend detected! Locking down machine!")) R.prize_theft(0.20) -/datum/wires/roulette/on_cut(wire, mend) +/datum/wires/roulette/on_cut(wire, mend, source) var/obj/machinery/roulette/R = holder switch(wire) if(WIRE_SHOCK) diff --git a/code/datums/wires/suit_storage_unit.dm b/code/datums/wires/suit_storage_unit.dm index be313dca17c44..26ab49763dd84 100644 --- a/code/datums/wires/suit_storage_unit.dm +++ b/code/datums/wires/suit_storage_unit.dm @@ -35,7 +35,7 @@ if(usr) SSU.shock(usr) -/datum/wires/suit_storage_unit/on_cut(wire, mend) +/datum/wires/suit_storage_unit/on_cut(wire, mend, source) var/obj/machinery/suit_storage_unit/SSU = holder switch(wire) if(WIRE_HACK) diff --git a/code/datums/wires/syndicatebomb.dm b/code/datums/wires/syndicatebomb.dm index adb829d7dc053..fa939d5b5607c 100644 --- a/code/datums/wires/syndicatebomb.dm +++ b/code/datums/wires/syndicatebomb.dm @@ -69,7 +69,7 @@ B.detonation_timer += 100 B.delayedlittle = TRUE -/datum/wires/syndicatebomb/on_cut(wire, mend) +/datum/wires/syndicatebomb/on_cut(wire, mend, source) var/obj/machinery/syndicatebomb/B = holder switch(wire) if(WIRE_BOOM,WIRE_BOOM2) @@ -78,9 +78,9 @@ B.explode_now = TRUE if(!istype(B.payload, /obj/machinery/syndicatebomb/training)) tell_admins(B) - // Cursed usr use but no easy way to get the cutter - if(isliving(usr)) - add_memory_in_range(B, 7, /datum/memory/bomb_defuse_failure, protagonist = usr, antagonist = B) + if(isliving(source)) + log_combat(source, holder, "cut the detonation wire for") + add_memory_in_range(B, 7, /datum/memory/bomb_defuse_failure, protagonist = source, antagonist = B) if(WIRE_UNBOLT) if(!mend && B.anchored) diff --git a/code/datums/wires/vending.dm b/code/datums/wires/vending.dm index 6c4caa7055644..4e037f3e24b3d 100644 --- a/code/datums/wires/vending.dm +++ b/code/datums/wires/vending.dm @@ -66,7 +66,7 @@ if(WIRE_AGELIMIT) vending_machine.age_restrictions = !vending_machine.age_restrictions -/datum/wires/vending/on_cut(wire, mend) +/datum/wires/vending/on_cut(wire, mend, source) var/obj/machinery/vending/vending_machine = holder switch(wire) if(WIRE_THROW) diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm index 128e59d815ebf..f2bf896bb10b3 100644 --- a/code/datums/world_topic.dm +++ b/code/datums/world_topic.dm @@ -194,7 +194,7 @@ /datum/world_topic/status/Run(list/input) . = list() .["version"] = GLOB.game_version - .["respawn"] = config ? !CONFIG_GET(flag/norespawn) : FALSE + .["respawn"] = config ? !!CONFIG_GET(flag/allow_respawn) : FALSE // show respawn as true regardless of "respawn as char" or "free respawn" .["enter"] = !LAZYACCESS(SSlag_switch.measures, DISABLE_NON_OBSJOBS) .["ai"] = CONFIG_GET(flag/allow_ai) .["host"] = world.host ? world.host : null @@ -203,6 +203,7 @@ .["revision"] = GLOB.revdata.commit .["revision_date"] = GLOB.revdata.date .["hub"] = GLOB.hub_visibility + .["identifier"] = CONFIG_GET(string/serversqlname) var/list/adm = get_admin_counts() @@ -238,4 +239,3 @@ // Shuttle status, see /__DEFINES/stat.dm .["shuttle_timer"] = SSshuttle.emergency.timeLeft() // Shuttle timer, in seconds - diff --git a/code/datums/wounds/_wound_static_data.dm b/code/datums/wounds/_wound_static_data.dm new file mode 100644 index 0000000000000..7a59ea57413a2 --- /dev/null +++ b/code/datums/wounds/_wound_static_data.dm @@ -0,0 +1,199 @@ +// This datum is merely a singleton instance that allows for custom "can be applied" behaviors without instantiating a wound instance. +// For example: You can make a pregen_data subtype for your wound that overrides can_be_applied_to to only apply to specifically slimeperson limbs. +// Without this, youre stuck with very static initial variables. + +/// A singleton datum that holds pre-gen and static data about a wound. Each wound datum should have a corresponding wound_pregen_data. +/datum/wound_pregen_data + /// The typepath of the wound we will be handling and storing data of. NECESSARY IF THIS IS A NON-ABSTRACT TYPE! + var/datum/wound/wound_path_to_generate + + /// Will this be instantiated? + var/abstract = FALSE + + /// If true, our wound can be selected in ordinary wound rolling. If this is set to false, our wound can only be directly instantiated by use of specific typepath. + var/can_be_randomly_generated = TRUE + + /// A list of biostates a limb must have to receive our wound, in wounds.dm. + var/required_limb_biostate + /// If false, we will check if the limb has all of our required biostates instead of just any. + var/require_any_biostate = FALSE + + /// If false, we will iterate through wounds on a given limb, and if any match our type, we wont add our wound. + var/duplicates_allowed = FALSE + + /// If we require BIO_BLOODED, we will not add our wound if this is true and the limb cannot bleed. + var/ignore_cannot_bleed = TRUE // a lot of bleed wounds should still be applied for purposes of mangling flesh + + /// A list of bodyzones we are applicable to. + var/list/viable_zones = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + /// The types of attack that can generate this wound. E.g. WOUND_SLASH = A sharp attack can cause this, WOUND_BLUNT = an attack with no sharpness/an attack with sharpness against a limb with mangled exterior can cause this. + var/list/required_wounding_types + /// If true, this wound can only be generated by all [required_wounding_types] at once, not just any. + var/match_all_wounding_types = FALSE + + /// The weight that will be used if, by the end of wound selection, there are multiple valid wounds. This will be inserted into pick_weight, so use integers. + var/weight = WOUND_DEFAULT_WEIGHT + + /// The minimum injury roll a attack must get to generate us. Affected by our wound's threshold_penalty and series_threshold_penalty, as well as the attack's wound_bonus. See check_wounding_mods(). + var/threshold_minimum + + /// The series of wounds this is in. See wounds.dm (the defines file) for a more detailed explanation - but tldr is that no 2 wounds of the same series can be on a limb. + var/wound_series + + /// If true, we will attempt to, during a random wound roll, overpower and remove other wound typepaths from the possible wounds list using [competition_mode] and [overpower_wounds_of_even_severity]. + var/compete_for_wounding = TRUE + /// The competition mode with which we will remove other wounds from a possible wound roll assuming [compete_for_wounding] is TRUE. See wounds.dm, the defines file, for more information on what these do. + var/competition_mode = WOUND_COMPETITION_OVERPOWER_LESSERS + /// If this and [compete_for_wounding] is true, we will remove wounds of an even severity to us during a random wound roll. + var/overpower_wounds_of_even_severity = FALSE + + /// A list of BIO_ defines that will be iterated over in order to determine the scar file our wound will generate. + /// Use generate_scar_priorities to create a custom list. + var/list/scar_priorities + +/datum/wound_pregen_data/New() + . = ..() + + if (!abstract) + if (required_limb_biostate == null) + stack_trace("required_limb_biostate null - please set it! occured on: [src.type]") + if (wound_path_to_generate == null) + stack_trace("wound_path_to_generate null - please set it! occured on: [src.type]") + + scar_priorities = generate_scar_priorities() + +/// Should return a list of BIO_ biostate priorities, in order. See [scar_priorities] for further documentation. +/datum/wound_pregen_data/proc/generate_scar_priorities() + RETURN_TYPE(/list) + + var/list/priorities = list( + "[BIO_FLESH]", + "[BIO_BONE]", + ) + + return priorities + +// this proc is the primary reason this datum exists - a singleton instance so we can always run this proc even without the wound existing +/** + * Args: + * * obj/item/bodypart/limb: The limb we are considering. + * * list/suggested_wounding_types: The wounding types to be checked against the wounding types we require. Defaults to required_wounding_types. + * * datum/wound/old_wound: If we would replace a wound, this would be said wound. Nullable. + * * random_roll = FALSE: If this is in the context of a random wound generation, and this wound wasn't specifically checked. + * + * Returns: + * FALSE if the limb cannot be wounded, if the wounding types dont match ours (via wounding_types_valid()), if we have a higher severity wound already in our series, + * if we have a biotype mismatch, if the limb isnt in a viable zone, or if theres any duplicate wound types. + * TRUE otherwise. + */ +/datum/wound_pregen_data/proc/can_be_applied_to(obj/item/bodypart/limb, list/suggested_wounding_types = required_wounding_types, datum/wound/old_wound, random_roll = FALSE, duplicates_allowed = src.duplicates_allowed, care_about_existing_wounds = TRUE) + SHOULD_BE_PURE(TRUE) + + if (!istype(limb) || !limb.owner) + return FALSE + + if (random_roll && !can_be_randomly_generated) + return FALSE + + if (HAS_TRAIT(limb.owner, TRAIT_NEVER_WOUNDED) || (limb.owner.status_flags & GODMODE)) + return FALSE + + if (!wounding_types_valid(suggested_wounding_types)) + return FALSE + + if (care_about_existing_wounds) + for (var/datum/wound/preexisting_wound as anything in limb.wounds) + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[preexisting_wound.type] + if (pregen_data.wound_series == wound_series) + if (preexisting_wound.severity >= initial(wound_path_to_generate.severity)) + return FALSE + + if (!ignore_cannot_bleed && ((required_limb_biostate & BIO_BLOODED) && !limb.can_bleed())) + return FALSE + + if (!biostate_valid(limb.biological_state)) + return FALSE + + if (!(limb.body_zone in viable_zones)) + return FALSE + + // we accept promotions and demotions, but no point in redundancy. This should have already been checked wherever the wound was rolled and applied for (see: bodypart damage code), but we do an extra check + // in case we ever directly add wounds + if (!duplicates_allowed) + for (var/datum/wound/preexisting_wound as anything in limb.wounds) + if (preexisting_wound.type == wound_path_to_generate && (preexisting_wound != old_wound)) + return FALSE + return TRUE + +/// Returns true if we have the given biostates, or any biostate in it if check_for_any is true. False otherwise. +/datum/wound_pregen_data/proc/biostate_valid(biostate) + if (require_any_biostate) + if (!(biostate & required_limb_biostate)) + return FALSE + else if (!((biostate & required_limb_biostate) == required_limb_biostate)) // check for all + return FALSE + + return TRUE + +/** + * A simple getter for [weight], with arguments supplied to allow custom behavior. + * + * Args: + * * obj/item/bodypart/limb: The limb we are contemplating being added to. Nullable. + * * woundtype: The woundtype of the assumed attack that would generate us. Nullable. + * * damage: The raw damage that would cause us. Nullable. + * * attack_direction: The direction of the attack that'd cause us. Nullable. + * * damage_source: The entity that would cause us. Nullable. + * + * Returns: + * Our weight. + */ +/datum/wound_pregen_data/proc/get_weight(obj/item/bodypart/limb, woundtype, damage, attack_direction, damage_source) + return weight + +/// Returns TRUE if we use WOUND_ALL, or we require all types and have all/if we require any and have any, FALSE otherwise. +/datum/wound_pregen_data/proc/wounding_types_valid(list/suggested_wounding_types) + if (WOUND_ALL in required_wounding_types) + return TRUE + if (!length(suggested_wounding_types)) + return FALSE + + for (var/iter_wounding_type as anything in suggested_wounding_types) + if (!(iter_wounding_type in required_wounding_types)) + if (match_all_wounding_types) + return FALSE + else + if (!match_all_wounding_types) + return TRUE + + return match_all_wounding_types // if we get here, we've matched everything + +/** + * A simple getter for [threshold_minimum], with arguments supplied to allow custom behavior. + * + * Args: + * * obj/item/bodypart/part: The limb we are contemplating being added to. + * * attack_direction: The direction of the attack that'd generate us. Nullable. + * * damage_source: The source of the damage that'd cause us. Nullable. + */ +/datum/wound_pregen_data/proc/get_threshold_for(obj/item/bodypart/part, attack_direction, damage_source) + return threshold_minimum + +/// Returns a new instance of our wound datum. +/datum/wound_pregen_data/proc/generate_instance(obj/item/bodypart/limb, ...) + RETURN_TYPE(/datum/wound) + + return new wound_path_to_generate + +/datum/wound_pregen_data/Destroy(force, ...) + var/error_message = "[src], a singleton wound pregen data instance, was destroyed! This should not happen!" + if (force) + error_message += " NOTE: This Destroy() was called with force == TRUE. This instance will be deleted and replaced with a new one." + stack_trace(error_message) + + if (!force) + return QDEL_HINT_LETMELIVE + + . = ..() + + GLOB.all_wound_pregen_data[wound_path_to_generate] = new src.type //recover diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm index 49986be64ce0f..dfba10ee6f872 100644 --- a/code/datums/wounds/_wounds.dm +++ b/code/datums/wounds/_wounds.dm @@ -14,6 +14,13 @@ deciding what specific wound will be applied. I'd like to have a few different types of wounds for at least some of the choices, but I'm just doing rough generals for now. Expect polishing */ +#define WOUND_CRITICAL_BLUNT_DISMEMBER_BONUS 15 + +// Applied into wounds when they're scanned with the wound analyzer, halves time to treat them manually. +#define TRAIT_WOUND_SCANNED "wound_scanned" +// I dunno lol +#define ANALYZER_TRAIT "analyzer_trait" + /datum/wound /// What it's named var/name = "Wound" @@ -24,51 +31,61 @@ /// What the limb looks like on a cursory examine var/examine_desc = "is badly hurt" + /// Simple description, shortened for clarity if defined. Otherwise just takes the normal desc in the analyzer proc. + var/simple_desc + /// Simple analyzer's wound description, which focuses less on the clinical aspect of the wound and more on easily readable treatment instructions. + var/simple_treat_text = "Go to medbay idiot" + /// Improvised remedies indicated by the first aid analyzer only. + var/homemade_treat_text = "Remember to drink lots of water!" + + + /// If this wound can generate a scar. + var/can_scar = TRUE + + /// The default file we take our scar descriptions from, if we fail to get the ideal file. + var/default_scar_file + /// needed for "your arm has a compound fracture" vs "your arm has some third degree burns" var/a_or_from = "a" /// The visible message when this happens var/occur_text = "" /// This sound will be played upon the wound being applied var/sound_effect + /// The volume of [sound_effect] + var/sound_volume = 70 /// Either WOUND_SEVERITY_TRIVIAL (meme wounds like stubbed toe), WOUND_SEVERITY_MODERATE, WOUND_SEVERITY_SEVERE, or WOUND_SEVERITY_CRITICAL (or maybe WOUND_SEVERITY_LOSS) var/severity = WOUND_SEVERITY_MODERATE - /// The list of wounds it belongs in, WOUND_LIST_BLUNT, WOUND_LIST_SLASH, or WOUND_LIST_BURN - var/wound_type - /// What body zones can we affect - var/list/viable_zones = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) /// Who owns the body part that we're wounding var/mob/living/carbon/victim = null - /// The bodypart we're parented to + /// The bodypart we're parented to. Not guaranteed to be non-null, especially after/during removal or if we haven't been applied var/obj/item/bodypart/limb = null /// Specific items such as bandages or sutures that can try directly treating this wound var/list/treatable_by /// Specific items such as bandages or sutures that can try directly treating this wound only if the user has the victim in an aggressive grab or higher var/list/treatable_by_grabbed - /// Tools with the specified tool flag will also be able to try directly treating this wound - var/treatable_tool + /// Any tools with any of the flags in this list will be usable to try directly treating this wound + var/list/treatable_tools /// How long it will take to treat this wound with a standard effective tool, assuming it doesn't need surgery var/base_treat_time = 5 SECONDS /// Using this limb in a do_after interaction will multiply the length by this duration (arms) var/interaction_efficiency_penalty = 1 /// Incoming damage on this limb will be multiplied by this, to simulate tenderness and vulnerability (mostly burns). - var/damage_mulitplier_penalty = 1 + var/damage_multiplier_penalty = 1 /// If set and this wound is applied to a leg, we take this many deciseconds extra per step on this leg var/limp_slowdown /// If this wound has a limp_slowdown and is applied to a leg, it has this chance to limp each step var/limp_chance /// How much we're contributing to this limb's bleed_rate var/blood_flow - /// Essentially, keeps track of whether or not this wound is capable of bleeding (in case the owner has the NOBLOOD species trait) - var/no_bleeding = FALSE - /// The minimum we need to roll on [/obj/item/bodypart/proc/check_wounding] to begin suffering this wound, see check_wounding_mods() for more - var/threshold_minimum /// How much having this wound will add to all future check_wounding() rolls on this limb, to allow progression to worse injuries with repeated damage var/threshold_penalty + /// How much having this wound will add to all future check_wounding() rolls on this limb, but only for wounds of its own series + var/series_threshold_penalty = 0 /// If we need to process each life tick var/processes = FALSE @@ -79,9 +96,12 @@ var/status_effect_type /// If we're operating on this wound and it gets healed, we'll nix the surgery too var/datum/surgery/attached_surgery - /// if you're a lazy git and just throw them in cryo, the wound will go away after accumulating severity * 25 power + /// if you're a lazy git and just throw them in cryo, the wound will go away after accumulating severity * [base_xadone_progress_to_qdel] power var/cryo_progress + /// The base amount of [cryo_progress] required to have ourselves fully healed by cryo. Multiplied against severity. + var/base_xadone_progress_to_qdel = 33 + /// What kind of scars this wound will create description wise once healed var/scar_keyword = "generic" /// If we've already tried scarring while removing (remove_wound can be called twice in a del chain, let's be nice to our code yeah?) TODO: make this cleaner @@ -90,16 +110,69 @@ var/wound_source /// What flags apply to this wound - var/wound_flags = (FLESH_WOUND | BONE_WOUND | ACCEPTS_GAUZE) + var/wound_flags = (ACCEPTS_GAUZE) + + /// The unique ID of our wound for use with [actionspeed_mod]. Defaults to REF(src). + var/unique_id + /// The actionspeed modifier we will use in case we are on the arms and have a interaction penalty. Qdelled on destroy. + var/datum/actionspeed_modifier/wound_interaction_inefficiency/actionspeed_mod + +/datum/wound/New() + . = ..() + + unique_id = generate_unique_id() + update_actionspeed_modifier() /datum/wound/Destroy() - if(attached_surgery) - QDEL_NULL(attached_surgery) - remove_wound() - set_limb(null) - victim = null + QDEL_NULL(attached_surgery) + if (limb) + remove_wound() + + QDEL_NULL(actionspeed_mod) + return ..() +/// If we should have an actionspeed_mod, ensures we do and updates its slowdown. Otherwise, ensures we dont have one +/// by qdeleting any existing modifier. +/datum/wound/proc/update_actionspeed_modifier() + if (should_have_actionspeed_modifier()) + if (!actionspeed_mod) + generate_actionspeed_modifier() + actionspeed_mod.multiplicative_slowdown = get_effective_actionspeed_modifier() + victim?.update_actionspeed() + else + remove_actionspeed_modifier() + +/// Returns TRUE if we have an interaction_efficiency_penalty, and if we are on the arms, FALSE otherwise. +/datum/wound/proc/should_have_actionspeed_modifier() + return (limb && victim && (limb.body_zone == BODY_ZONE_L_ARM || limb.body_zone == BODY_ZONE_R_ARM) && interaction_efficiency_penalty != 0) + +/// If we have no actionspeed_mod, generates a new one with our unique ID, sets actionspeed_mod to it, then returns it. +/datum/wound/proc/generate_actionspeed_modifier() + RETURN_TYPE(/datum/actionspeed_modifier) + + if (actionspeed_mod) + return actionspeed_mod + + var/datum/actionspeed_modifier/wound_interaction_inefficiency/new_modifier = new /datum/actionspeed_modifier/wound_interaction_inefficiency(unique_id, src) + new_modifier.multiplicative_slowdown = get_effective_actionspeed_modifier() + victim?.add_actionspeed_modifier(new_modifier) + + actionspeed_mod = new_modifier + return actionspeed_mod + +/// If we have an actionspeed_mod, qdels it and sets our ref of it to null. +/datum/wound/proc/remove_actionspeed_modifier() + if (!actionspeed_mod) + return + + victim?.remove_actionspeed_modifier(actionspeed_mod) + QDEL_NULL(actionspeed_mod) + +/// Generates the ID we use for [unique_id], which is also set as our actionspeed mod's ID +/datum/wound/proc/generate_unique_id() + return REF(src) // unique, cannot change, a perfect id + /** * apply_wound() is used once a wound type is instantiated to assign it to a bodypart, and actually come into play. * @@ -113,22 +186,10 @@ * * wound_source: The source of the wound, such as a weapon. */ /datum/wound/proc/apply_wound(obj/item/bodypart/L, silent = FALSE, datum/wound/old_wound = null, smited = FALSE, attack_direction = null, wound_source = "Unknown") - if(!istype(L) || !L.owner || !(L.body_zone in viable_zones) || !IS_ORGANIC_LIMB(L) || HAS_TRAIT(L.owner, TRAIT_NEVER_WOUNDED) || (L.owner.status_flags & GODMODE)) - qdel(src) - return - // Checks for biological state, to ensure only valid wounds are applied on the limb - if(((wound_flags & BONE_WOUND) && !(L.biological_state & BIO_BONE)) || ((wound_flags & FLESH_WOUND) && !(L.biological_state & BIO_FLESH))) + if (!can_be_applied_to(L, old_wound)) qdel(src) - return - - // we accept promotions and demotions, but no point in redundancy. This should have already been checked wherever the wound was rolled and applied for (see: bodypart damage code), but we do an extra check - // in case we ever directly add wounds - for(var/i in L.wounds) - var/datum/wound/preexisting_wound = i - if((preexisting_wound.type == type) && (preexisting_wound != old_wound)) - qdel(src) - return + return FALSE if(isitem(wound_source)) var/obj/item/wound_item = wound_source @@ -140,9 +201,6 @@ set_limb(L) LAZYADD(victim.all_wounds, src) LAZYADD(limb.wounds, src) - //it's ok to not typecheck, humans are the only ones that deal with wounds - var/mob/living/carbon/human/human_victim = victim - no_bleeding = HAS_TRAIT(human_victim, TRAIT_NOBLOOD) update_descriptions() limb.update_wounds() if(status_effect_type) @@ -162,18 +220,41 @@ var/msg = span_danger("[victim]'s [limb.plaintext_zone] [occur_text]!") var/vis_dist = COMBAT_MESSAGE_RANGE - if(severity != WOUND_SEVERITY_MODERATE) + if(severity > WOUND_SEVERITY_MODERATE) msg = "[msg]" vis_dist = DEFAULT_MESSAGE_RANGE victim.visible_message(msg, span_userdanger("Your [limb.plaintext_zone] [occur_text]!"), vision_distance = vis_dist) if(sound_effect) - playsound(L.owner, sound_effect, 70 + 20 * severity, TRUE) + playsound(L.owner, sound_effect, sound_volume + (20 * severity), TRUE) wound_injury(old_wound, attack_direction = attack_direction) if(!demoted) second_wind() + return TRUE + +/// Returns TRUE if we can be applied to the limb. +/datum/wound/proc/can_be_applied_to(obj/item/bodypart/L, datum/wound/old_wound) + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[type] + + // We assume we aren't being randomly applied - we have no reason to believe we are + // And, besides, if we were, you could just as easily check our pregen data rather than run this proc + // Generally speaking this proc is called in apply_wound, which is called when the caller is already confidant in its ability to be applied + return pregen_data.can_be_applied_to(L, old_wound = old_wound) + +/// Returns the zones we can be applied to. +/datum/wound/proc/get_viable_zones() + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[type] + + return pregen_data.viable_zones + +/// Returns the biostate we require to be applied. +/datum/wound/proc/get_required_biostate() + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[type] + + return pregen_data.required_limb_biostate + // Updates descriptive texts for the wound, in case it can get altered for whatever reason /datum/wound/proc/update_descriptions() return @@ -182,13 +263,66 @@ SIGNAL_HANDLER set_victim(null) +/// Setter for [victim]. Should completely transfer signals, attributes, etc. To the new victim - if there is any, as it can be null. /datum/wound/proc/set_victim(new_victim) if(victim) + UnregisterSignal(victim, list(COMSIG_QDELETING, COMSIG_MOB_SWAP_HANDS, COMSIG_CARBON_POST_REMOVE_LIMB, COMSIG_CARBON_POST_ATTACH_LIMB)) UnregisterSignal(victim, COMSIG_QDELETING) + UnregisterSignal(victim, COMSIG_MOB_SWAP_HANDS) + UnregisterSignal(victim, COMSIG_CARBON_POST_REMOVE_LIMB) + if (actionspeed_mod) + victim.remove_actionspeed_modifier(actionspeed_mod) // no need to qdelete it, just remove it from our victim + remove_wound_from_victim() victim = new_victim if(victim) RegisterSignal(victim, COMSIG_QDELETING, PROC_REF(null_victim)) + RegisterSignals(victim, list(COMSIG_MOB_SWAP_HANDS, COMSIG_CARBON_POST_REMOVE_LIMB, COMSIG_CARBON_POST_ATTACH_LIMB), PROC_REF(add_or_remove_actionspeed_mod)) + + if (limb) + start_limping_if_we_should() // the status effect already handles removing itself + add_or_remove_actionspeed_mod() + +/// Proc called to change the variable `limb` and react to the event. +/datum/wound/proc/set_limb(obj/item/bodypart/new_value, replaced = FALSE) + if(limb == new_value) + return FALSE //Limb can either be a reference to something or `null`. Returning the number variable makes it clear no change was made. + . = limb + if(limb) // if we're nulling limb, we're basically detaching from it, so we should remove ourselves in that case + UnregisterSignal(limb, COMSIG_QDELETING) + UnregisterSignal(limb, list(COMSIG_BODYPART_GAUZED, COMSIG_BODYPART_UNGAUZED)) + LAZYREMOVE(limb.wounds, src) + limb.update_wounds(replaced) + if (disabling) + limb.remove_traits(list(TRAIT_PARALYSIS, TRAIT_DISABLED_BY_WOUND), REF(src)) + + limb = new_value + + // POST-CHANGE + + if (limb) + RegisterSignal(limb, COMSIG_QDELETING, PROC_REF(source_died)) + RegisterSignals(limb, list(COMSIG_BODYPART_GAUZED, COMSIG_BODYPART_UNGAUZED), PROC_REF(gauze_state_changed)) + if (disabling) + limb.add_traits(list(TRAIT_PARALYSIS, TRAIT_DISABLED_BY_WOUND), REF(src)) + + if (victim) + start_limping_if_we_should() // the status effect already handles removing itself + add_or_remove_actionspeed_mod() + + update_inefficiencies(replaced) + +/datum/wound/proc/add_or_remove_actionspeed_mod() + update_actionspeed_modifier() + if (actionspeed_mod) + if(victim.get_active_hand() == limb) + victim.add_actionspeed_modifier(actionspeed_mod, TRUE) + else + victim.remove_actionspeed_modifier(actionspeed_mod) + +/datum/wound/proc/start_limping_if_we_should() + if ((limb.body_zone == BODY_ZONE_L_LEG || limb.body_zone == BODY_ZONE_R_LEG) && limp_slowdown > 0 && limp_chance > 0) + victim.apply_status_effect(/datum/status_effect/limp) /datum/wound/proc/source_died() SIGNAL_HANDLER @@ -197,15 +331,26 @@ /// Remove the wound from whatever it's afflicting, and cleans up whateverstatus effects it had or modifiers it had on interaction times. ignore_limb is used for detachments where we only want to forget the victim /datum/wound/proc/remove_wound(ignore_limb, replaced = FALSE) //TODO: have better way to tell if we're getting removed without replacement (full heal) scar stuff + var/old_victim = victim + var/old_limb = limb + set_disabling(FALSE) - if(limb && !already_scarred && !replaced) + if(limb && can_scar && !already_scarred && !replaced) already_scarred = TRUE var/datum/scar/new_scar = new new_scar.generate(limb, src) - remove_wound_from_victim() + + remove_actionspeed_modifier() + + null_victim() // we use the proc here because some behaviors may depend on changing victim to some new value + if(limb && !ignore_limb) - LAZYREMOVE(limb.wounds, src) - limb.update_wounds(replaced) + set_limb(null, replaced) // since we're removing limb's ref to us, we should do the same + // if you want to keep the ref, do it externally, theres no reason for us to remember it + + if (ismob(old_victim)) + var/mob/mob_victim = old_victim + SEND_SIGNAL(mob_victim, COMSIG_CARBON_POST_LOSE_WOUND, src, old_limb, ignore_limb, replaced) /datum/wound/proc/remove_wound_from_victim() if(!victim) @@ -218,17 +363,15 @@ /** * replace_wound() is used when you want to replace the current wound with a new wound, presumably of the same category, just of a different severity (either up or down counts) * - * This proc actually instantiates the new wound based off the specific type path passed, then returns the new instantiated wound datum. - * * Arguments: - * * new_type- The TYPE PATH of the wound you want to replace this, like /datum/wound/slash/severe + * * new_wound- The wound instance you want to replace this * * smited- If this is a smite, we don't care about this wound for stat tracking purposes (not yet implemented) */ -/datum/wound/proc/replace_wound(new_type, smited = FALSE, attack_direction = attack_direction) - var/datum/wound/new_wound = new new_type +/datum/wound/proc/replace_wound(datum/wound/new_wound, smited = FALSE, attack_direction = attack_direction) already_scarred = TRUE + var/obj/item/bodypart/cached_limb = limb // remove_wound() nulls limb so we have to track it locally remove_wound(replaced=TRUE) - new_wound.apply_wound(limb, old_wound = src, smited = smited, attack_direction = attack_direction, wound_source = wound_source) + new_wound.apply_wound(cached_limb, old_wound = src, smited = smited, attack_direction = attack_direction, wound_source = wound_source) . = new_wound qdel(src) @@ -236,24 +379,6 @@ /datum/wound/proc/wound_injury(datum/wound/old_wound = null, attack_direction = null) return - -/// Proc called to change the variable `limb` and react to the event. -/datum/wound/proc/set_limb(new_value) - if(limb == new_value) - return FALSE //Limb can either be a reference to something or `null`. Returning the number variable makes it clear no change was made. - . = limb - if(limb) - UnregisterSignal(limb, COMSIG_QDELETING) - limb = new_value - RegisterSignal(new_value, COMSIG_QDELETING, PROC_REF(source_died)) - if(. && disabling) - var/obj/item/bodypart/old_limb = . - old_limb.remove_traits(list(TRAIT_PARALYSIS, TRAIT_DISABLED_BY_WOUND), REF(src)) - if(limb) - if(disabling) - limb.add_traits(list(TRAIT_PARALYSIS, TRAIT_DISABLED_BY_WOUND), REF(src)) - - /// Proc called to change the variable `disabling` and react to the event. /datum/wound/proc/set_disabling(new_value) if(disabling == new_value) @@ -268,6 +393,60 @@ if(limb?.can_be_disabled) limb.update_disabled() +/// Setter for [interaction_efficiency_penalty]. Updates the actionspeed of our actionspeed mod. +/datum/wound/proc/set_interaction_efficiency_penalty(new_value) + var/should_update = (new_value != interaction_efficiency_penalty) + + interaction_efficiency_penalty = new_value + + if (should_update) + update_actionspeed_modifier() + +/// Returns a "adjusted" interaction_efficiency_penalty that will be used for the actionspeed mod. +/datum/wound/proc/get_effective_actionspeed_modifier() + return interaction_efficiency_penalty - 1 + +/// Returns the decisecond multiplier of any click interactions, assuming our limb is being used. +/datum/wound/proc/get_action_delay_mult() + SHOULD_BE_PURE(TRUE) + + return interaction_efficiency_penalty + +/// Returns the decisecond increment of any click interactions, assuming our limb is being used. +/datum/wound/proc/get_action_delay_increment() + SHOULD_BE_PURE(TRUE) + + return 0 + +/// Signal proc for if gauze has been applied or removed from our limb. +/datum/wound/proc/gauze_state_changed() + SIGNAL_HANDLER + + if (wound_flags & ACCEPTS_GAUZE) + update_inefficiencies() + +/// Updates our limping and interaction penalties in accordance with our gauze. +/datum/wound/proc/update_inefficiencies(replaced_or_replacing = FALSE) + if (wound_flags & ACCEPTS_GAUZE) + if(limb.body_zone in list(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) + if(limb.current_gauze?.splint_factor) + limp_slowdown = initial(limp_slowdown) * limb.current_gauze.splint_factor + limp_chance = initial(limp_chance) * limb.current_gauze.splint_factor + else + limp_slowdown = initial(limp_slowdown) + limp_chance = initial(limp_chance) + else if(limb.body_zone in GLOB.arm_zones) + if(limb.current_gauze?.splint_factor) + set_interaction_efficiency_penalty(1 + ((get_effective_actionspeed_modifier()) * limb.current_gauze.splint_factor)) + else + set_interaction_efficiency_penalty(initial(interaction_efficiency_penalty)) + + if(initial(disabling)) + set_disabling(isnull(limb.current_gauze)) + + limb.update_wounds(replaced_or_replacing) + + start_limping_if_we_should() /// Additional beneficial effects when the wound is gained, in case you want to give a temporary boost to allow the victim to try an escape or last stand /datum/wound/proc/second_wind() @@ -301,25 +480,7 @@ if(I.force && tendee.combat_mode) return FALSE - var/allowed = FALSE - - // check if we have a valid treatable tool - if(I.tool_behaviour == treatable_tool) - allowed = TRUE - else if(treatable_tool == TOOL_CAUTERY && I.get_temperature() && user == victim) // allow improvised cauterization on yourself without an aggro grab - allowed = TRUE - // failing that, see if we're aggro grabbing them and if we have an item that works for aggro grabs only - else if(user.pulling == victim && user.grab_state >= GRAB_AGGRESSIVE && check_grab_treatments(I, user)) - allowed = TRUE - // failing THAT, we check if we have a generally allowed item - else - for(var/allowed_type in treatable_by) - if(istype(I, allowed_type)) - allowed = TRUE - break - - // if none of those apply, we return false to avoid interrupting - if(!allowed) + if(!item_can_treat(I, user)) return FALSE // now that we've determined we have a valid attempt at treating, we can stomp on their dreams if we're already interacting with the patient or if their part is obscured @@ -335,8 +496,22 @@ return TRUE // lastly, treat them - treat(I, user) - return TRUE + return treat(I, user) // we allow treat to return a value so it can control if the item does its normal interaction or not + +/// Returns TRUE if the item can be used to treat our wounds. Hooks into treat() - only things that return TRUE here may be used there. +/datum/wound/proc/item_can_treat(obj/item/potential_treater, mob/user) + // check if we have a valid treatable tool + if(potential_treater.tool_behaviour in treatable_tools) + return TRUE + if(TOOL_CAUTERY in treatable_tools && potential_treater.get_temperature() && user == victim) // allow improvised cauterization on yourself without an aggro grab + return TRUE + // failing that, see if we're aggro grabbing them and if we have an item that works for aggro grabs only + if(user.pulling == victim && user.grab_state >= GRAB_AGGRESSIVE && check_grab_treatments(potential_treater, user)) + return TRUE + // failing THAT, we check if we have a generally allowed item + for(var/allowed_type in treatable_by) + if(istype(potential_treater, allowed_type)) + return TRUE /// Return TRUE if we have an item that can only be used while aggro grabbed (unhanded aggro grab treatments go in [/datum/wound/proc/try_handling]). Treatment is still is handled in [/datum/wound/proc/treat] /datum/wound/proc/check_grab_treatments(obj/item/I, mob/user) @@ -358,18 +533,29 @@ /datum/wound/proc/still_exists() return (!QDELETED(src) && limb) -/// When our parent bodypart is hurt -/datum/wound/proc/receive_damage(wounding_type, wounding_dmg, wound_bonus, attack_direction) +/// When our parent bodypart is hurt. +/datum/wound/proc/receive_damage(wounding_type, wounding_dmg, wound_bonus, attack_direction, damage_source) return /// Called from cryoxadone and pyroxadone when they're proc'ing. Wounds will slowly be fixed separately from other methods when these are in effect. crappy name but eh /datum/wound/proc/on_xadone(power) cryo_progress += power - if(cryo_progress > 33 * severity) + + return handle_xadone_progress() + +/// Does various actions based on [cryo_progress]. By default, qdeletes the wound past a certain threshold. +/datum/wound/proc/handle_xadone_progress() + if(cryo_progress > get_xadone_progress_to_qdel()) qdel(src) +/// Returns the amount of [cryo_progress] we need to be qdeleted. +/datum/wound/proc/get_xadone_progress_to_qdel() + SHOULD_BE_PURE(TRUE) + + return base_xadone_progress_to_qdel * severity + /// When synthflesh is applied to the victim, we call this. No sense in setting up an entire chem reaction system for wounds when we only care for a few chems. Probably will change in the future -/datum/wound/proc/on_synthflesh(power) +/datum/wound/proc/on_synthflesh(reac_volume) return /// Called when the patient is undergoing stasis, so that having fully treated a wound doesn't make you sit there helplessly until you think to unbuckle them @@ -417,19 +603,111 @@ * * mob/user: The user examining the wound's owner, if that matters */ /datum/wound/proc/get_examine_description(mob/user) - . = "[victim.p_their(TRUE)] [limb.plaintext_zone] [examine_desc]" - . = severity <= WOUND_SEVERITY_MODERATE ? "[.]." : "[.]!" + . = get_wound_description(user) + if(HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) + . += span_notice("\nThere is a holo-image next to the wound that seems to contain indications for treatment.") + + return . + +/datum/wound/proc/get_wound_description(mob/user) + var/desc + + if ((wound_flags & ACCEPTS_GAUZE) && limb.current_gauze) + var/sling_condition = get_gauze_condition() + desc = "[victim.p_Their()] [limb.plaintext_zone] is [sling_condition] fastened in a sling of [limb.current_gauze.name]" + else + desc = "[victim.p_Their()] [limb.plaintext_zone] [examine_desc]" + + desc = modify_desc_before_span(desc, user) + + return get_desc_intensity(desc) + +/// A hook proc used to modify desc before it is spanned via [get_desc_intensity]. Useful for inserting spans yourself. +/datum/wound/proc/modify_desc_before_span(desc, mob/user) + return desc + +/datum/wound/proc/get_gauze_condition() + SHOULD_BE_PURE(TRUE) + if (!limb.current_gauze) + return null + + switch(limb.current_gauze.absorption_capacity) + if(0 to 1.25) + return "just barely" + if(1.25 to 2.75) + return "loosely" + if(2.75 to 4) + return "mostly" + if(4 to INFINITY) + return "tightly" + +/// Spans [desc] based on our severity. +/datum/wound/proc/get_desc_intensity(desc) + SHOULD_BE_PURE(TRUE) + if (severity > WOUND_SEVERITY_MODERATE) + return span_bold("[desc]!") + return "[desc]." /datum/wound/proc/get_scanner_description(mob/user) - return "Type: [name]\nSeverity: [severity_text()]\nDescription: [desc]\nRecommended Treatment: [treat_text]" + return "Type: [name]\nSeverity: [severity_text(simple = FALSE)]\nDescription: [desc]\nRecommended Treatment: [treat_text]" + +/datum/wound/proc/get_simple_scanner_description(mob/user) + return "[name] detected!\nRisk: [severity_text(simple = TRUE)]\nDescription: [simple_desc ? simple_desc : desc]\nTreatment Guide: [simple_treat_text]\nHomemade Remedies: [homemade_treat_text]" -/datum/wound/proc/severity_text() +/datum/wound/proc/severity_text(simple = FALSE) switch(severity) if(WOUND_SEVERITY_TRIVIAL) return "Trivial" if(WOUND_SEVERITY_MODERATE) - return "Moderate" + return "Moderate" + (simple ? "!" : "") if(WOUND_SEVERITY_SEVERE) - return "Severe" + return "Severe" + (simple ? "!!" : "") if(WOUND_SEVERITY_CRITICAL) - return "Critical" + return "Critical" + (simple ? "!!!" : "") + +/// Returns TRUE if our limb is the head or chest, FALSE otherwise. +/// Essential in the sense of "we cannot live without it". +/datum/wound/proc/limb_essential() + return (limb.body_zone == BODY_ZONE_HEAD || limb.body_zone == BODY_ZONE_CHEST) + +/// Getter proc for our scar_keyword, in case we might have some custom scar gen logic. +/datum/wound/proc/get_scar_keyword(obj/item/bodypart/scarred_limb, add_to_scars) + return scar_keyword + +/// Getter proc for our scar_file, in case we might have some custom scar gen logic. +/datum/wound/proc/get_scar_file(obj/item/bodypart/scarred_limb, add_to_scars) + var/datum/wound_pregen_data/pregen_data = get_pregen_data() + // basically we iterate over biotypes until we find the one we want + // fleshy burns will look for flesh then bone + // dislocations will look for flesh, then bone, then metal + var/file = default_scar_file + for (var/biotype as anything in pregen_data.scar_priorities) + if (scarred_limb.biological_state & text2num(biotype)) + file = GLOB.biotypes_to_scar_file[biotype] + break + + return file + +/// Returns what string is displayed when a limb that has sustained this wound is examined +/// (This is examining the LIMB ITSELF, when it's not attached to someone.) +/datum/wound/proc/get_limb_examine_description() + return + +/// Gets the flat percentage chance increment of a dismember occuring, if a dismember is attempted (requires mangled flesh and bone). returning 15 = +15%. +/datum/wound/proc/get_dismember_chance_bonus(existing_chance) + SHOULD_BE_PURE(TRUE) + + var/datum/wound_pregen_data/pregen_data = get_pregen_data() + + if (WOUND_BLUNT in pregen_data.required_wounding_types && severity >= WOUND_SEVERITY_CRITICAL) + return WOUND_CRITICAL_BLUNT_DISMEMBER_BONUS // we only require mangled bone (T2 blunt), but if there's a critical blunt, we'll add 15% more + +/// Returns our pregen data, which is practically guaranteed to exist, so this proc can safely be used raw. +/// In fact, since it's RETURN_TYPEd to wound_pregen_data, you can even directly access the variables without having to store the value of this proc in a typed variable. +/// Ex. get_pregen_data().wound_series +/datum/wound/proc/get_pregen_data() + RETURN_TYPE(/datum/wound_pregen_data) + + return GLOB.all_wound_pregen_data[type] + +#undef WOUND_CRITICAL_BLUNT_DISMEMBER_BONUS diff --git a/code/datums/wounds/blunt.dm b/code/datums/wounds/blunt.dm new file mode 100644 index 0000000000000..219b7dd8805c1 --- /dev/null +++ b/code/datums/wounds/blunt.dm @@ -0,0 +1,3 @@ +/datum/wound/blunt + name = "Blunt Wound" + sound_effect = 'sound/effects/wounds/crack1.ogg' diff --git a/code/datums/wounds/bones.dm b/code/datums/wounds/bones.dm index 3ee52fdaa798a..333d743eae9d1 100644 --- a/code/datums/wounds/bones.dm +++ b/code/datums/wounds/bones.dm @@ -4,11 +4,19 @@ */ // TODO: well, a lot really, but i'd kill to get overlays and a bonebreaking effect like Blitz: The League, similar to electric shock skeletons -/datum/wound/blunt +/datum/wound_pregen_data/bone + abstract = TRUE + required_limb_biostate = BIO_BONE + + required_wounding_types = list(WOUND_BLUNT) + + wound_series = WOUND_SERIES_BONE_BLUNT_BASIC + +/datum/wound/blunt/bone name = "Blunt (Bone) Wound" - sound_effect = 'sound/effects/wounds/crack1.ogg' - wound_type = WOUND_BLUNT - wound_flags = (BONE_WOUND | ACCEPTS_GAUZE) + wound_flags = (ACCEPTS_GAUZE) + + default_scar_file = BONE_SCAR_FILE /// Have we been bone gel'd? var/gelled @@ -32,16 +40,13 @@ /* Overwriting of base procs */ -/datum/wound/blunt/wound_injury(datum/wound/old_wound = null, attack_direction = null) +/datum/wound/blunt/bone/wound_injury(datum/wound/old_wound = null, attack_direction = null) // hook into gaining/losing gauze so crit bone wounds can re-enable/disable depending if they're slung or not - RegisterSignals(limb, list(COMSIG_BODYPART_GAUZED, COMSIG_BODYPART_GAUZE_DESTROYED), PROC_REF(update_inefficiencies)) - if(limb.body_zone == BODY_ZONE_HEAD && brain_trauma_group) processes = TRUE active_trauma = victim.gain_trauma_type(brain_trauma_group, TRAUMA_RESILIENCE_WOUND) next_trauma_cycle = world.time + (rand(100-WOUND_BONE_HEAD_TIME_VARIANCE, 100+WOUND_BONE_HEAD_TIME_VARIANCE) * 0.01 * trauma_cycle_cooldown) - RegisterSignal(victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, PROC_REF(attack_with_hurt_hand)) if(limb.held_index && victim.get_item_for_held_index(limb.held_index) && (disabling || prob(30 * severity))) var/obj/item/I = victim.get_item_for_held_index(limb.held_index) if(istype(I, /obj/item/offhand)) @@ -51,19 +56,29 @@ victim.visible_message(span_danger("[victim] drops [I] in shock!"), span_warning("The force on your [limb.plaintext_zone] causes you to drop [I]!"), vision_distance=COMBAT_MESSAGE_RANGE) update_inefficiencies() + return ..() + +/datum/wound/blunt/bone/set_victim(new_victim) + + if (victim) + UnregisterSignal(victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK) + if (new_victim) + RegisterSignal(new_victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, PROC_REF(attack_with_hurt_hand)) -/datum/wound/blunt/remove_wound(ignore_limb, replaced) + return ..() + +/datum/wound/blunt/bone/remove_wound(ignore_limb, replaced) limp_slowdown = 0 limp_chance = 0 QDEL_NULL(active_trauma) - if(limb) - UnregisterSignal(limb, list(COMSIG_BODYPART_GAUZED, COMSIG_BODYPART_GAUZE_DESTROYED)) - if(victim) - UnregisterSignal(victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK) return ..() -/datum/wound/blunt/handle_process(seconds_per_tick, times_fired) +/datum/wound/blunt/bone/handle_process(seconds_per_tick, times_fired) . = ..() + + if (!victim || HAS_TRAIT(victim, TRAIT_STASIS)) + return + if(limb.body_zone == BODY_ZONE_HEAD && brain_trauma_group && world.time > next_trauma_cycle) if(active_trauma) QDEL_NULL(active_trauma) @@ -96,7 +111,7 @@ remove_wound() /// If we're a human who's punching something with a broken arm, we might hurt ourselves doing so -/datum/wound/blunt/proc/attack_with_hurt_hand(mob/M, atom/target, proximity) +/datum/wound/blunt/bone/proc/attack_with_hurt_hand(mob/M, atom/target, proximity) SIGNAL_HANDLER if(victim.get_active_hand() != limb || !victim.combat_mode || !ismob(target) || severity <= WOUND_SEVERITY_MODERATE) @@ -117,7 +132,7 @@ return COMPONENT_CANCEL_ATTACK_CHAIN -/datum/wound/blunt/receive_damage(wounding_type, wounding_dmg, wound_bonus) +/datum/wound/blunt/bone/receive_damage(wounding_type, wounding_dmg, wound_bonus) if(!victim || wounding_dmg < WOUND_MINIMUM_DAMAGE) return if(ishuman(victim)) @@ -143,99 +158,81 @@ new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir) victim.add_splatter_floor(get_step(victim.loc, victim.dir)) +/datum/wound/blunt/bone/modify_desc_before_span(desc) + . = ..() -/datum/wound/blunt/get_examine_description(mob/user) - if(!limb.current_gauze && !gelled && !taped) - return ..() - - var/list/msg = list() - if(!limb.current_gauze) - msg += "[victim.p_their(TRUE)] [limb.plaintext_zone] [examine_desc]" - else - var/sling_condition = "" - // how much life we have left in these bandages - switch(limb.current_gauze.absorption_capacity) - if(0 to 1.25) - sling_condition = "just barely" - if(1.25 to 2.75) - sling_condition = "loosely" - if(2.75 to 4) - sling_condition = "mostly" - if(4 to INFINITY) - sling_condition = "tightly" - - msg += "[victim.p_their(TRUE)] [limb.plaintext_zone] is [sling_condition] fastened in a sling of [limb.current_gauze.name]" + if (!limb.current_gauze) + if(taped) + . += ", [span_notice("and appears to be reforming itself under some surgical tape!")]" + else if(gelled) + . += ", [span_notice("with fizzing flecks of blue bone gel sparking off the bone!")]" - if(taped) - msg += ", [span_notice("and appears to be reforming itself under some surgical tape!")]" - else if(gelled) - msg += ", [span_notice("with fizzing flecks of blue bone gel sparking off the bone!")]" - else - msg += "!" - return "[msg.Join()]" +/datum/wound/blunt/get_limb_examine_description() + return span_warning("The bones in this limb appear badly cracked.") /* - New common procs for /datum/wound/blunt/ + New common procs for /datum/wound/blunt/bone/ */ -/datum/wound/blunt/proc/update_inefficiencies() - SIGNAL_HANDLER - - if(limb.body_zone in list(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) - if(limb.current_gauze?.splint_factor) - limp_slowdown = initial(limp_slowdown) * limb.current_gauze.splint_factor - limp_chance = initial(limp_chance) * limb.current_gauze.splint_factor - else - limp_slowdown = initial(limp_slowdown) - limp_chance = initial(limp_chance) - victim.apply_status_effect(/datum/status_effect/limp) - else if(limb.body_zone in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) - if(limb.current_gauze?.splint_factor) - interaction_efficiency_penalty = 1 + ((interaction_efficiency_penalty - 1) * limb.current_gauze.splint_factor) - else - interaction_efficiency_penalty = initial(interaction_efficiency_penalty) - - if(initial(disabling)) - set_disabling(!limb.current_gauze) +/datum/wound/blunt/bone/get_scar_file(obj/item/bodypart/scarred_limb, add_to_scars) + if (scarred_limb.biological_state & BIO_BONE && (!(scarred_limb.biological_state & BIO_FLESH))) // only bone + return BONE_SCAR_FILE + else if (scarred_limb.biological_state & BIO_FLESH && (!(scarred_limb.biological_state & BIO_BONE))) + return FLESH_SCAR_FILE - limb.update_wounds() + return ..() /// Joint Dislocation (Moderate Blunt) -/datum/wound/blunt/moderate +/datum/wound/blunt/bone/moderate name = "Joint Dislocation" - desc = "Patient's bone has been unset from socket, causing pain and reduced motor function." + desc = "Patient's limb has been unset from socket, causing pain and reduced motor function." treat_text = "Recommended application of bonesetter to affected limb, though manual relocation by applying an aggressive grab to the patient and helpfully interacting with afflicted limb may suffice." examine_desc = "is awkwardly janked out of place" occur_text = "janks violently and becomes unseated" severity = WOUND_SEVERITY_MODERATE - viable_zones = list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) interaction_efficiency_penalty = 1.3 limp_slowdown = 3 limp_chance = 50 - threshold_minimum = 35 threshold_penalty = 15 - treatable_tool = TOOL_BONESET - wound_flags = (BONE_WOUND) - status_effect_type = /datum/status_effect/wound/blunt/moderate - scar_keyword = "bluntmoderate" + treatable_tools = list(TOOL_BONESET) + status_effect_type = /datum/status_effect/wound/blunt/bone/moderate + scar_keyword = "dislocate" + + simple_desc = "Patient's bone has been dislocated, causing limping or reduced dexterity." + simple_treat_text = "Bandaging the wound will reduce its impact until treated with a bonesetter. Most commonly, it is treated by aggressively grabbing someone and helpfully wrenching the limb in place, though there's room for malfeasance when doing this." + homemade_treat_text = "Besides bandaging and wrenching, bone setters can be printed in lathes and utilized on oneself at the cost of great pain. As a last resort, crushing the patient with a firelock has sometimes been noted to fix their dislocated limb." + +/datum/wound_pregen_data/bone/dislocate + abstract = FALSE + + wound_path_to_generate = /datum/wound/blunt/bone/moderate + + required_limb_biostate = BIO_JOINTED + + threshold_minimum = 35 -/datum/wound/blunt/moderate/Destroy() +/datum/wound/blunt/bone/moderate/Destroy() if(victim) UnregisterSignal(victim, COMSIG_LIVING_DOORCRUSHED) return ..() -/datum/wound/blunt/moderate/wound_injury(datum/wound/old_wound, attack_direction = null) - . = ..() - RegisterSignal(victim, COMSIG_LIVING_DOORCRUSHED, PROC_REF(door_crush)) +/datum/wound/blunt/bone/moderate/set_victim(new_victim) + + if (victim) + UnregisterSignal(victim, COMSIG_LIVING_DOORCRUSHED) + if (new_victim) + RegisterSignal(new_victim, COMSIG_LIVING_DOORCRUSHED, PROC_REF(door_crush)) + + return ..() /// Getting smushed in an airlock/firelock is a last-ditch attempt to try relocating your limb -/datum/wound/blunt/moderate/proc/door_crush() +/datum/wound/blunt/bone/moderate/proc/door_crush() SIGNAL_HANDLER if(prob(40)) victim.visible_message(span_danger("[victim]'s dislocated [limb.plaintext_zone] pops back into place!"), span_userdanger("Your dislocated [limb.plaintext_zone] pops back into place! Ow!")) remove_wound() -/datum/wound/blunt/moderate/try_handling(mob/living/carbon/human/user) +/datum/wound/blunt/bone/moderate/try_handling(mob/living/carbon/human/user) if(user.pulling != victim || user.zone_selected != limb.body_zone) return FALSE @@ -253,7 +250,7 @@ return TRUE /// If someone is snapping our dislocated joint back into place by hand with an aggro grab and help intent -/datum/wound/blunt/moderate/proc/chiropractice(mob/living/carbon/human/user) +/datum/wound/blunt/bone/moderate/proc/chiropractice(mob/living/carbon/human/user) var/time = base_treat_time if(!do_after(user, time, target=victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) @@ -272,7 +269,7 @@ chiropractice(user) /// If someone is snapping our dislocated joint into a fracture by hand with an aggro grab and harm or disarm intent -/datum/wound/blunt/moderate/proc/malpractice(mob/living/carbon/human/user) +/datum/wound/blunt/bone/moderate/proc/malpractice(mob/living/carbon/human/user) var/time = base_treat_time if(!do_after(user, time, target=victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) @@ -290,13 +287,18 @@ malpractice(user) -/datum/wound/blunt/moderate/treat(obj/item/I, mob/user) +/datum/wound/blunt/bone/moderate/treat(obj/item/I, mob/user) + var/scanned = HAS_TRAIT(src, TRAIT_WOUND_SCANNED) + var/self_penalty_mult = user == victim ? 1.5 : 1 + var/scanned_mult = scanned ? 0.5 : 1 + var/treatment_delay = base_treat_time * self_penalty_mult * scanned_mult + if(victim == user) - victim.visible_message(span_danger("[user] begins resetting [victim.p_their()] [limb.plaintext_zone] with [I]."), span_warning("You begin resetting your [limb.plaintext_zone] with [I]...")) + victim.visible_message(span_danger("[user] begins [scanned ? "expertly" : ""] resetting [victim.p_their()] [limb.plaintext_zone] with [I]."), span_warning("You begin resetting your [limb.plaintext_zone] with [I][scanned ? ", keeping the holo-image's indications in mind" : ""]...")) else - user.visible_message(span_danger("[user] begins resetting [victim]'s [limb.plaintext_zone] with [I]."), span_notice("You begin resetting [victim]'s [limb.plaintext_zone] with [I]...")) + user.visible_message(span_danger("[user] begins [scanned ? "expertly" : ""] resetting [victim]'s [limb.plaintext_zone] with [I]."), span_notice("You begin resetting [victim]'s [limb.plaintext_zone] with [I][scanned ? ", keeping the holo-image's indications in mind" : ""]...")) - if(!do_after(user, base_treat_time * (user == victim ? 1.5 : 1), target = victim, extra_checks=CALLBACK(src, PROC_REF(still_exists)))) + if(!do_after(user, treatment_delay, target = victim, extra_checks=CALLBACK(src, PROC_REF(still_exists)))) return if(victim == user) @@ -314,7 +316,7 @@ Severe (Hairline Fracture) */ -/datum/wound/blunt/severe +/datum/wound/blunt/bone/severe name = "Hairline Fracture" desc = "Patient's bone has suffered a crack in the foundation, causing serious pain and reduced limb functionality." treat_text = "Recommended light surgical application of bone gel, though a sling of medical gauze will prevent worsening situation." @@ -325,19 +327,30 @@ interaction_efficiency_penalty = 2 limp_slowdown = 6 limp_chance = 60 - threshold_minimum = 60 threshold_penalty = 30 treatable_by = list(/obj/item/stack/sticky_tape/surgical, /obj/item/stack/medical/bone_gel) - status_effect_type = /datum/status_effect/wound/blunt/severe + status_effect_type = /datum/status_effect/wound/blunt/bone/severe scar_keyword = "bluntsevere" brain_trauma_group = BRAIN_TRAUMA_MILD trauma_cycle_cooldown = 1.5 MINUTES internal_bleeding_chance = 40 - wound_flags = (BONE_WOUND | ACCEPTS_GAUZE | MANGLES_BONE) + wound_flags = (ACCEPTS_GAUZE | MANGLES_INTERIOR) regen_ticks_needed = 120 // ticks every 2 seconds, 240 seconds, so roughly 4 minutes default + simple_desc = "Patient's bone has cracked in the middle, drastically reducing limb functionality." + simple_treat_text = "Bandaging the wound will reduce its impact until surgically treated with bone gel and surgical tape." + homemade_treat_text = "Bone gel and surgical tape may be applied directly to the wound, though this is quite difficult for most people to do so individually unless they've dosed themselves with one or more painkillers (Morphine and Miner's Salve have been known to help)" + + +/datum/wound_pregen_data/bone/hairline + abstract = FALSE + + wound_path_to_generate = /datum/wound/blunt/bone/severe + + threshold_minimum = 60 + /// Compound Fracture (Critical Blunt) -/datum/wound/blunt/critical +/datum/wound/blunt/bone/critical name = "Compound Fracture" desc = "Patient's bones have suffered multiple gruesome fractures, causing significant pain and near uselessness of limb." treat_text = "Immediate binding of affected limb, followed by surgical intervention ASAP." @@ -349,40 +362,49 @@ limp_slowdown = 7 limp_chance = 70 sound_effect = 'sound/effects/wounds/crack2.ogg' - threshold_minimum = 115 threshold_penalty = 50 disabling = TRUE treatable_by = list(/obj/item/stack/sticky_tape/surgical, /obj/item/stack/medical/bone_gel) - status_effect_type = /datum/status_effect/wound/blunt/critical + status_effect_type = /datum/status_effect/wound/blunt/bone/critical scar_keyword = "bluntcritical" brain_trauma_group = BRAIN_TRAUMA_SEVERE trauma_cycle_cooldown = 2.5 MINUTES internal_bleeding_chance = 60 - wound_flags = (BONE_WOUND | ACCEPTS_GAUZE | MANGLES_BONE) + wound_flags = (ACCEPTS_GAUZE | MANGLES_INTERIOR) regen_ticks_needed = 240 // ticks every 2 seconds, 480 seconds, so roughly 8 minutes default + simple_desc = "Patient's bones have effectively shattered completely, causing total immobilization of the limb." + simple_treat_text = "Bandaging the wound will slightly reduce its impact until surgically treated with bone gel and surgical tape." + homemade_treat_text = "Although this is extremely difficult and slow to function, Bone gel and surgical tape may be applied directly to the wound, though this is nigh-impossible for most people to do so individually unless they've dosed themselves with one or more painkillers (Morphine and Miner's Salve have been known to help)" + +/datum/wound_pregen_data/bone/compound + abstract = FALSE + + wound_path_to_generate = /datum/wound/blunt/bone/critical + + threshold_minimum = 115 + // doesn't make much sense for "a" bone to stick out of your head -/datum/wound/blunt/critical/apply_wound(obj/item/bodypart/L, silent = FALSE, datum/wound/old_wound = null, smited = FALSE, attack_direction = null, wound_source = "Unknown") +/datum/wound/blunt/bone/critical/apply_wound(obj/item/bodypart/L, silent = FALSE, datum/wound/old_wound = null, smited = FALSE, attack_direction = null, wound_source = "Unknown") if(L.body_zone == BODY_ZONE_HEAD) occur_text = "splits open, exposing a bare, cracked skull through the flesh and blood" examine_desc = "has an unsettling indent, with bits of skull poking out" . = ..() /// if someone is using bone gel on our wound -/datum/wound/blunt/proc/gel(obj/item/stack/medical/bone_gel/I, mob/user) +/datum/wound/blunt/bone/proc/gel(obj/item/stack/medical/bone_gel/I, mob/user) // skellies get treated nicer with bone gel since their "reattach dismembered limbs by hand" ability sucks when it's still critically wounded if((limb.biological_state & BIO_BONE) && !(limb.biological_state & BIO_FLESH)) - skelly_gel(I, user) - return + return skelly_gel(I, user) if(gelled) to_chat(user, span_warning("[user == victim ? "Your" : "[victim]'s"] [limb.plaintext_zone] is already coated with bone gel!")) - return + return TRUE user.visible_message(span_danger("[user] begins hastily applying [I] to [victim]'s' [limb.plaintext_zone]..."), span_warning("You begin hastily applying [I] to [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone], disregarding the warning label...")) if(!do_after(user, base_treat_time * 1.5 * (user == victim ? 1.5 : 1), target = victim, extra_checks=CALLBACK(src, PROC_REF(still_exists)))) - return + return TRUE I.use(1) victim.emote("scream") @@ -405,15 +427,16 @@ if(prob(25 + (20 * (severity - 2)) - painkiller_bonus)) // 25%/45% chance to fail self-applying with severe and critical wounds, modded by painkillers victim.visible_message(span_danger("[victim] fails to finish applying [I] to [victim.p_their()] [limb.plaintext_zone], passing out from the pain!"), span_notice("You pass out from the pain of applying [I] to your [limb.plaintext_zone] before you can finish!")) victim.AdjustUnconscious(5 SECONDS) - return + return TRUE victim.visible_message(span_notice("[victim] finishes applying [I] to [victim.p_their()] [limb.plaintext_zone], grimacing from the pain!"), span_notice("You finish applying [I] to your [limb.plaintext_zone], and your bones explode in pain!")) limb.receive_damage(25, wound_bonus=CANT_WOUND) victim.adjustStaminaLoss(100) gelled = TRUE + return TRUE /// skellies are less averse to bone gel, since they're literally all bone -/datum/wound/blunt/proc/skelly_gel(obj/item/stack/medical/bone_gel/I, mob/user) +/datum/wound/blunt/bone/proc/skelly_gel(obj/item/stack/medical/bone_gel/I, mob/user) if(gelled) to_chat(user, span_warning("[user == victim ? "Your" : "[victim]'s"] [limb.plaintext_zone] is already coated with bone gel!")) return @@ -432,20 +455,21 @@ gelled = TRUE processes = TRUE + return TRUE /// if someone is using surgical tape on our wound -/datum/wound/blunt/proc/tape(obj/item/stack/sticky_tape/surgical/I, mob/user) +/datum/wound/blunt/bone/proc/tape(obj/item/stack/sticky_tape/surgical/I, mob/user) if(!gelled) to_chat(user, span_warning("[user == victim ? "Your" : "[victim]'s"] [limb.plaintext_zone] must be coated with bone gel to perform this emergency operation!")) - return + return TRUE if(taped) to_chat(user, span_warning("[user == victim ? "Your" : "[victim]'s"] [limb.plaintext_zone] is already wrapped in [I.name] and reforming!")) - return + return TRUE user.visible_message(span_danger("[user] begins applying [I] to [victim]'s' [limb.plaintext_zone]..."), span_warning("You begin applying [I] to [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone]...")) if(!do_after(user, base_treat_time * (user == victim ? 1.5 : 1), target = victim, extra_checks=CALLBACK(src, PROC_REF(still_exists)))) - return + return TRUE if(victim == user) regen_ticks_needed *= 1.5 @@ -459,14 +483,15 @@ taped = TRUE processes = TRUE + return TRUE -/datum/wound/blunt/treat(obj/item/I, mob/user) +/datum/wound/blunt/bone/treat(obj/item/I, mob/user) if(istype(I, /obj/item/stack/medical/bone_gel)) - gel(I, user) + return gel(I, user) else if(istype(I, /obj/item/stack/sticky_tape/surgical)) - tape(I, user) + return tape(I, user) -/datum/wound/blunt/get_scanner_description(mob/user) +/datum/wound/blunt/bone/get_scanner_description(mob/user) . = ..() . += "
" diff --git a/code/datums/wounds/burns.dm b/code/datums/wounds/burns.dm index 21b5e0040e8a9..ac2e5d44c7bc2 100644 --- a/code/datums/wounds/burns.dm +++ b/code/datums/wounds/burns.dm @@ -7,20 +7,24 @@ /datum/wound/burn name = "Burn Wound" a_or_from = "from" - wound_type = WOUND_BURN - processes = TRUE sound_effect = 'sound/effects/wounds/sizzle1.ogg' - wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE) + +/datum/wound/burn/flesh + name = "Burn (Flesh) Wound" + a_or_from = "from" + processes = TRUE + + default_scar_file = FLESH_SCAR_FILE treatable_by = list(/obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) // sterilizer and alcohol will require reagent treatments, coming soon - // Flesh damage vars + // Flesh damage vars /// How much damage to our flesh we currently have. Once both this and infestation reach 0, the wound is considered healed var/flesh_damage = 5 /// Our current counter for how much flesh regeneration we have stacked from regenerative mesh/synthflesh/whatever, decrements each tick and lowers flesh_damage var/flesh_healing = 0 - // Infestation vars (only for severe and critical) + // Infestation vars (only for severe and critical) /// How quickly infection breeds on this burn if we don't have disinfectant var/infestation_rate = 0 /// Our current level of infection @@ -31,8 +35,11 @@ /// Once we reach infestation beyond WOUND_INFESTATION_SEPSIS, we get this many warnings before the limb is completely paralyzed (you'd have to ignore a really bad burn for a really long time for this to happen) var/strikes_to_lose_limb = 3 +/datum/wound/burn/flesh/handle_process(seconds_per_tick, times_fired) + + if (!victim || HAS_TRAIT(victim, TRAIT_STASIS)) + return -/datum/wound/burn/handle_process(seconds_per_tick, times_fired) . = ..() if(strikes_to_lose_limb == 0) // we've already hit sepsis, nothing more to do victim.adjustToxLoss(0.25 * seconds_per_tick) @@ -40,14 +47,12 @@ victim.visible_message(span_danger("The infection on the remnants of [victim]'s [limb.plaintext_zone] shift and bubble nauseatingly!"), span_warning("You can feel the infection on the remnants of your [limb.plaintext_zone] coursing through your veins!"), vision_distance = COMBAT_MESSAGE_RANGE) return - if(victim.reagents) - if(victim.reagents.has_reagent(/datum/reagent/medicine/spaceacillin)) - sanitization += 0.9 - if(victim.reagents.has_reagent(/datum/reagent/space_cleaner/sterilizine/)) - sanitization += 0.9 - if(victim.reagents.has_reagent(/datum/reagent/medicine/mine_salve)) - sanitization += 0.3 - flesh_healing += 0.5 + for(var/datum/reagent/reagent as anything in victim.reagents.reagent_list) + if(reagent.chemical_flags & REAGENT_AFFECTS_WOUNDS) + reagent.on_burn_wound_processing() + + if(HAS_TRAIT(victim, TRAIT_VIRUS_RESISTANCE)) + sanitization += 0.9 if(limb.current_gauze) limb.seep_gauze(WOUND_BURN_SANITIZATION_RATE * seconds_per_tick) @@ -128,11 +133,11 @@ var/datum/brain_trauma/severe/paralysis/sepsis = new (limb.body_zone) victim.gain_trauma(sepsis) -/datum/wound/burn/get_examine_description(mob/user) +/datum/wound/burn/flesh/get_wound_description(mob/user) if(strikes_to_lose_limb <= 0) - return span_deadsay("[victim.p_their(TRUE)] [limb.plaintext_zone] has locked up completely and is non-functional.") + return span_deadsay("[victim.p_Their()] [limb.plaintext_zone] has locked up completely and is non-functional.") - var/list/condition = list("[victim.p_their(TRUE)] [limb.plaintext_zone] [examine_desc]") + var/list/condition = list("[victim.p_Their()] [limb.plaintext_zone] [examine_desc]") if(limb.current_gauze) var/bandage_condition switch(limb.current_gauze.absorption_capacity) @@ -155,16 +160,16 @@ if(WOUND_INFECTION_CRITICAL to WOUND_INFECTION_SEPTIC) condition += ", [span_deadsay("with streaks of rotten infection!")]" if(WOUND_INFECTION_SEPTIC to INFINITY) - return span_deadsay("[victim.p_their(TRUE)] [limb.plaintext_zone] is a mess of charred skin and infected rot!") + return span_deadsay("[victim.p_Their()] [limb.plaintext_zone] is a mess of charred skin and infected rot!") else condition += "!" return "[condition.Join()]" -/datum/wound/burn/get_scanner_description(mob/user) - if(strikes_to_lose_limb == 0) +/datum/wound/burn/flesh/get_scanner_description(mob/user) + if(strikes_to_lose_limb <= 0) // Unclear if it can go below 0, best to not take the chance var/oopsie = "Type: [name]\nSeverity: [severity_text()]" - oopsie += "
Infection Level: [span_deadsay("The body part has suffered complete sepsis and must be removed. Amputate or augment limb immediately.")]
" + oopsie += "
Infection Level: [span_deadsay("The body part has suffered complete sepsis and must be removed. Amputate or augment limb immediately, or place the patient in a cryotube.")]
" return oopsie . = ..() @@ -194,12 +199,12 @@ */ /// if someone is using ointment or mesh on our burns -/datum/wound/burn/proc/ointmentmesh(obj/item/stack/medical/I, mob/user) +/datum/wound/burn/flesh/proc/ointmentmesh(obj/item/stack/medical/I, mob/user) user.visible_message(span_notice("[user] begins applying [I] to [victim]'s [limb.plaintext_zone]..."), span_notice("You begin applying [I] to [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone]...")) if (I.amount <= 0) - return + return TRUE if(!do_after(user, (user == victim ? I.self_delay : I.other_delay), extra_checks = CALLBACK(src, PROC_REF(still_exists)))) - return + return TRUE limb.heal_damage(I.heal_brute, I.heal_burn) user.visible_message(span_green("[user] applies [I] to [victim]."), span_green("You apply [I] to [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone].")) @@ -209,36 +214,38 @@ if((infestation <= 0 || sanitization >= infestation) && (flesh_damage <= 0 || flesh_healing > flesh_damage)) to_chat(user, span_notice("You've done all you can with [I], now you must wait for the flesh on [victim]'s [limb.plaintext_zone] to recover.")) + return TRUE else - try_treating(I, user) + return try_treating(I, user) /// Paramedic UV penlights -/datum/wound/burn/proc/uv(obj/item/flashlight/pen/paramedic/I, mob/user) +/datum/wound/burn/flesh/proc/uv(obj/item/flashlight/pen/paramedic/I, mob/user) if(!COOLDOWN_FINISHED(I, uv_cooldown)) to_chat(user, span_notice("[I] is still recharging!")) - return + return TRUE if(infestation <= 0 || infestation < sanitization) to_chat(user, span_notice("There's no infection to treat on [victim]'s [limb.plaintext_zone]!")) - return + return TRUE user.visible_message(span_notice("[user] flashes the burns on [victim]'s [limb] with [I]."), span_notice("You flash the burns on [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone] with [I]."), vision_distance=COMBAT_MESSAGE_RANGE) sanitization += I.uv_power COOLDOWN_START(I, uv_cooldown, I.uv_cooldown_length) + return TRUE -/datum/wound/burn/treat(obj/item/I, mob/user) +/datum/wound/burn/flesh/treat(obj/item/I, mob/user) if(istype(I, /obj/item/stack/medical/ointment)) - ointmentmesh(I, user) + return ointmentmesh(I, user) else if(istype(I, /obj/item/stack/medical/mesh)) var/obj/item/stack/medical/mesh/mesh_check = I if(!mesh_check.is_open) to_chat(user, span_warning("You need to open [mesh_check] first.")) return - ointmentmesh(mesh_check, user) + return ointmentmesh(mesh_check, user) else if(istype(I, /obj/item/flashlight/pen/paramedic)) - uv(I, user) + return uv(I, user) // people complained about burns not healing on stasis beds, so in addition to checking if it's cured, they also get the special ability to very slowly heal on stasis beds if they have the healing effects stored -/datum/wound/burn/on_stasis(seconds_per_tick, times_fired) +/datum/wound/burn/flesh/on_stasis(seconds_per_tick, times_fired) . = ..() if(strikes_to_lose_limb == 0) // we've already hit sepsis, nothing more to do if(SPT_PROB(0.5, seconds_per_tick)) @@ -253,60 +260,125 @@ if(sanitization > 0) infestation = max(infestation - (0.1 * WOUND_BURN_SANITIZATION_RATE * seconds_per_tick), 0) -/datum/wound/burn/on_synthflesh(amount) - flesh_healing += amount * 0.5 // 20u patch will heal 10 flesh standard +/datum/wound/burn/flesh/on_synthflesh(reac_volume) + flesh_healing += reac_volume * 0.5 // 20u patch will heal 10 flesh standard + +/datum/wound_pregen_data/flesh_burn + abstract = TRUE + + required_wounding_types = list(WOUND_BURN) + required_limb_biostate = BIO_FLESH + + wound_series = WOUND_SERIES_FLESH_BURN_BASIC + +/datum/wound/burn/get_limb_examine_description() + return span_warning("The flesh on this limb appears badly cooked.") // we don't even care about first degree burns, straight to second -/datum/wound/burn/moderate +/datum/wound/burn/flesh/moderate name = "Second Degree Burns" desc = "Patient is suffering considerable burns with mild skin penetration, weakening limb integrity and increased burning sensations." treat_text = "Recommended application of topical ointment or regenerative mesh to affected region." examine_desc = "is badly burned and breaking out in blisters" occur_text = "breaks out with violent red burns" severity = WOUND_SEVERITY_MODERATE - damage_mulitplier_penalty = 1.1 - threshold_minimum = 40 + damage_multiplier_penalty = 1.1 threshold_penalty = 30 // burns cause significant decrease in limb integrity compared to other wounds - status_effect_type = /datum/status_effect/wound/burn/moderate + status_effect_type = /datum/status_effect/wound/burn/flesh/moderate flesh_damage = 5 scar_keyword = "burnmoderate" -/datum/wound/burn/severe + simple_desc = "Patient's skin is burned, weakening the limb and multiplying percieved damage!" + simple_treat_text = "Ointment will speed up recovery, as will regenerative mesh. Risk of infection is negligible." + homemade_treat_text = "Healthy tea will speed up recovery. Salt, or preferably a salt-water mixture, will sanitize the wound, but the former will cause skin irritation, increasing the risk of infection." + +/datum/wound_pregen_data/flesh_burn/second_degree + abstract = FALSE + + wound_path_to_generate = /datum/wound/burn/flesh/moderate + + threshold_minimum = 40 + +/datum/wound/burn/flesh/severe name = "Third Degree Burns" desc = "Patient is suffering extreme burns with full skin penetration, creating serious risk of infection and greatly reduced limb integrity." - treat_text = "Recommended immediate disinfection and excision of any infected skin, followed by bandaging and ointment." + treat_text = "Recommended immediate disinfection and excision of any infected skin, followed by bandaging and ointment. If the limb has locked up, it must be amputated, augmented or treated with cryogenics." examine_desc = "appears seriously charred, with aggressive red splotches" occur_text = "chars rapidly, exposing ruined tissue and spreading angry red burns" severity = WOUND_SEVERITY_SEVERE - damage_mulitplier_penalty = 1.2 - threshold_minimum = 80 + damage_multiplier_penalty = 1.2 threshold_penalty = 40 - status_effect_type = /datum/status_effect/wound/burn/severe + status_effect_type = /datum/status_effect/wound/burn/flesh/severe treatable_by = list(/obj/item/flashlight/pen/paramedic, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) infestation_rate = 0.07 // appx 9 minutes to reach sepsis without any treatment flesh_damage = 12.5 scar_keyword = "burnsevere" -/datum/wound/burn/critical + simple_desc = "Patient's skin is badly burned, significantly weakening the limb and compounding further damage!!" + simple_treat_text = "Bandages will speed up recovery, as will ointment or regenerative mesh. Spaceacilin, sterilizine, and 'Miner's Salve' will help with infection." + homemade_treat_text = "Healthy tea will speed up recovery. Salt, or preferably a salt-water mixture, will sanitize the wound, but the former especially will cause skin irritation and dehydration, speeding up infection. Space Cleaner can be used as disinfectant in a pinch." + +/datum/wound_pregen_data/flesh_burn/third_degree + abstract = FALSE + + wound_path_to_generate = /datum/wound/burn/flesh/severe + + threshold_minimum = 80 + +/datum/wound/burn/flesh/critical name = "Catastrophic Burns" desc = "Patient is suffering near complete loss of tissue and significantly charred muscle and bone, creating life-threatening risk of infection and negligible limb integrity." - treat_text = "Immediate surgical debriding of any infected skin, followed by potent tissue regeneration formula and bandaging." + treat_text = "Immediate surgical debriding of any infected skin, followed by potent tissue regeneration formula and bandaging. If the limb has locked up, it must be amputated, augmented or treated with cryogenics." examine_desc = "is a ruined mess of blanched bone, melted fat, and charred tissue" occur_text = "vaporizes as flesh, bone, and fat melt together in a horrifying mess" severity = WOUND_SEVERITY_CRITICAL - damage_mulitplier_penalty = 1.3 + damage_multiplier_penalty = 1.3 sound_effect = 'sound/effects/wounds/sizzle2.ogg' - threshold_minimum = 140 threshold_penalty = 80 - status_effect_type = /datum/status_effect/wound/burn/critical + status_effect_type = /datum/status_effect/wound/burn/flesh/critical treatable_by = list(/obj/item/flashlight/pen/paramedic, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) infestation_rate = 0.075 // appx 4.33 minutes to reach sepsis without any treatment flesh_damage = 20 scar_keyword = "burncritical" + simple_desc = "Patient's skin is destroyed and tissue charred, leaving the limb with almost no integrity and a drastic chance of infection!!!" + simple_treat_text = "Immediately bandage the wound and treat it with ointment or regenerative mesh. Spaceacilin, sterilizine, or 'Miner's Salve' will stave off infection. Seek professional care immediately, before sepsis sets in and the wound becomes untreatable." + homemade_treat_text = "Healthy tea will help with recovery. A salt-water mixture, topically applied, might help stave off infection in the short term, but pure table salt is NOT recommended. Space Cleaner can be used as disinfectant in a pinch." + +/datum/wound_pregen_data/flesh_burn/fourth_degree + abstract = FALSE + + wound_path_to_generate = /datum/wound/burn/flesh/critical + + threshold_minimum = 140 + ///special severe wound caused by sparring interference or other god related punishments. -/datum/wound/burn/severe/brand +/datum/wound/burn/flesh/severe/brand name = "Holy Brand" desc = "Patient is suffering extreme burns from a strange brand marking, creating serious risk of infection and greatly reduced limb integrity." examine_desc = "appears to have holy symbols painfully branded into their flesh, leaving severe burns." occur_text = "chars rapidly into a strange pattern of holy symbols, burned into the flesh." + + simple_desc = "Patient's skin has had strange markings burned onto it, significantly weakening the limb and compounding further damage!!" + +/datum/wound_pregen_data/flesh_burn/third_degree/holy + abstract = FALSE + can_be_randomly_generated = FALSE + + wound_path_to_generate = /datum/wound/burn/flesh/severe/brand +/// special severe wound caused by the cursed slot machine. + +/datum/wound/burn/flesh/severe/cursed_brand + name = "Ancient Brand" + desc = "Patient is suffering extreme burns with oddly ornate brand markings, creating serious risk of infection and greatly reduced limb integrity." + examine_desc = "appears to have ornate symbols painfully branded into their flesh, leaving severe burns" + occur_text = "chars rapidly into a pattern that can only be described as an agglomeration of several financial symbols, burned into the flesh" + +/datum/wound/burn/flesh/severe/cursed_brand/get_limb_examine_description() + return span_warning("The flesh on this limb has several ornate symbols burned into it, with pitting throughout.") + +/datum/wound_pregen_data/flesh_burn/third_degree/cursed_brand + abstract = FALSE + can_be_randomly_generated = FALSE + + wound_path_to_generate = /datum/wound/burn/flesh/severe/cursed_brand diff --git a/code/datums/wounds/loss.dm b/code/datums/wounds/loss.dm index 66dddc99e1d3e..4fb5cad387f12 100644 --- a/code/datums/wounds/loss.dm +++ b/code/datums/wounds/loss.dm @@ -1,3 +1,15 @@ +/datum/wound_pregen_data/loss + abstract = FALSE + + wound_path_to_generate = /datum/wound/loss + required_limb_biostate = NONE + require_any_biostate = TRUE + + required_wounding_types = list(WOUND_ALL) + + wound_series = WOUND_SERIES_LOSS_BASIC + + threshold_minimum = WOUND_DISMEMBER_OUTRIGHT_THRESH // not actually used since dismembering is handled differently, but may as well assign it since we got it /datum/wound/loss name = "Dismemberment Wound" @@ -5,15 +17,17 @@ sound_effect = 'sound/effects/dismember.ogg' severity = WOUND_SEVERITY_LOSS - threshold_minimum = WOUND_DISMEMBER_OUTRIGHT_THRESH // not actually used since dismembering is handled differently, but may as well assign it since we got it status_effect_type = null scar_keyword = "dismember" wound_flags = null already_scarred = TRUE // We manually assign scars for dismembers through endround missing limbs and aheals + /// The wounding_type of the attack that caused us. Used to generate the description of our scar. Currently unused, but primarily exists in case non-biological wounds are added. + var/loss_wounding_type + /// Our special proc for our special dismembering, the wounding type only matters for what text we have -/datum/wound/loss/proc/apply_dismember(obj/item/bodypart/dismembered_part, wounding_type=WOUND_SLASH, outright = FALSE, attack_direction) - if(!istype(dismembered_part) || !dismembered_part.owner || !(dismembered_part.body_zone in viable_zones) || isalien(dismembered_part.owner) || !dismembered_part.can_dismember()) +/datum/wound/loss/proc/apply_dismember(obj/item/bodypart/dismembered_part, wounding_type = WOUND_SLASH, outright = FALSE, attack_direction) + if(!istype(dismembered_part) || !dismembered_part.owner || !(dismembered_part.body_zone in get_viable_zones()) || isalien(dismembered_part.owner) || !dismembered_part.can_dismember()) qdel(src) return @@ -23,7 +37,28 @@ if(dismembered_part.body_zone == BODY_ZONE_CHEST) occur_text = "is split open, causing [victim.p_their()] internal organs to spill out!" self_msg = "is split open, causing your internal organs to spill out!" - else if(outright) + else + occur_text = dismembered_part.get_dismember_message(wounding_type, outright) + + var/msg = span_bolddanger("[victim]'s [dismembered_part.plaintext_zone] [occur_text]") + + victim.visible_message(msg, span_userdanger("Your [dismembered_part.plaintext_zone] [self_msg ? self_msg : occur_text]")) + + loss_wounding_type = wounding_type + + set_limb(dismembered_part) + second_wind() + log_wound(victim, src) + if(dismembered_part.can_bleed() && wounding_type != WOUND_BURN && victim.blood_volume) + victim.spray_blood(attack_direction, severity) + dismembered_part.dismember(wounding_type == WOUND_BURN ? BURN : BRUTE, wounding_type = wounding_type) + qdel(src) + return TRUE + +/obj/item/bodypart/proc/get_dismember_message(wounding_type, outright) + var/occur_text + + if(outright) switch(wounding_type) if(WOUND_BLUNT) occur_text = "is outright smashed to a gross pulp, severing it completely!" @@ -34,25 +69,17 @@ if(WOUND_BURN) occur_text = "is outright incinerated, falling to dust!" else + var/bone_text = get_internal_description() + var/tissue_text = get_external_description() + switch(wounding_type) if(WOUND_BLUNT) - occur_text = "is shattered through the last bone holding it together, severing it completely!" + occur_text = "is shattered through the last [bone_text] holding it together, severing it completely!" if(WOUND_SLASH) - occur_text = "is slashed through the last tissue holding it together, severing it completely!" + occur_text = "is slashed through the last [tissue_text] holding it together, severing it completely!" if(WOUND_PIERCE) - occur_text = "is pierced through the last tissue holding it together, severing it completely!" + occur_text = "is pierced through the last [tissue_text] holding it together, severing it completely!" if(WOUND_BURN) occur_text = "is completely incinerated, falling to dust!" - var/msg = span_bolddanger("[victim]'s [dismembered_part.plaintext_zone] [occur_text]") - - victim.visible_message(msg, span_userdanger("Your [dismembered_part.plaintext_zone] [self_msg ? self_msg : occur_text]")) - - set_limb(dismembered_part) - second_wind() - log_wound(victim, src) - if(wounding_type != WOUND_BURN && victim.blood_volume) - victim.spray_blood(attack_direction, severity) - dismembered_part.dismember(wounding_type == WOUND_BURN ? BURN : BRUTE) - qdel(src) - return TRUE + return occur_text diff --git a/code/datums/wounds/pierce.dm b/code/datums/wounds/pierce.dm index 1612b3159a6f8..4b104dedb3426 100644 --- a/code/datums/wounds/pierce.dm +++ b/code/datums/wounds/pierce.dm @@ -2,16 +2,18 @@ /* Piercing wounds */ - /datum/wound/pierce + +/datum/wound/pierce/bleed name = "Piercing Wound" sound_effect = 'sound/weapons/slice.ogg' processes = TRUE - wound_type = WOUND_PIERCE treatable_by = list(/obj/item/stack/medical/suture) - treatable_tool = TOOL_CAUTERY + treatable_tools = list(TOOL_CAUTERY) base_treat_time = 3 SECONDS - wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE) + wound_flags = (ACCEPTS_GAUZE | CAN_BE_GRASPED) + + default_scar_file = FLESH_SCAR_FILE /// How much blood we start losing when this wound is first applied var/initial_flow @@ -23,13 +25,15 @@ /// If we let off blood when hit, the max blood lost is this * the incoming damage var/internal_bleeding_coefficient -/datum/wound/pierce/wound_injury(datum/wound/old_wound = null, attack_direction = null) +/datum/wound/pierce/bleed/wound_injury(datum/wound/old_wound = null, attack_direction = null) set_blood_flow(initial_flow) - if(!no_bleeding && attack_direction && victim.blood_volume > BLOOD_VOLUME_OKAY) + if(limb.can_bleed() && attack_direction && victim.blood_volume > BLOOD_VOLUME_OKAY) victim.spray_blood(attack_direction, severity) -/datum/wound/pierce/receive_damage(wounding_type, wounding_dmg, wound_bonus) - if(victim.stat == DEAD || (wounding_dmg < 5) || no_bleeding || !victim.blood_volume || !prob(internal_bleeding_chance + wounding_dmg)) + return ..() + +/datum/wound/pierce/bleed/receive_damage(wounding_type, wounding_dmg, wound_bonus) + if(victim.stat == DEAD || (wounding_dmg < 5) || !limb.can_bleed() || !victim.blood_volume || !prob(internal_bleeding_chance + wounding_dmg)) return if(limb.current_gauze?.splint_factor) wounding_dmg *= (1 - limb.current_gauze.splint_factor) @@ -50,9 +54,9 @@ new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir) victim.add_splatter_floor(get_step(victim.loc, victim.dir)) -/datum/wound/pierce/get_bleed_rate_of_change() +/datum/wound/pierce/bleed/get_bleed_rate_of_change() //basically if a species doesn't bleed, the wound is stagnant and will not heal on it's own (nor get worse) - if(no_bleeding) + if(!limb.can_bleed()) return BLOOD_FLOW_STEADY if(HAS_TRAIT(victim, TRAIT_BLOODY_MESS)) return BLOOD_FLOW_INCREASING @@ -60,10 +64,13 @@ return BLOOD_FLOW_DECREASING return BLOOD_FLOW_STEADY -/datum/wound/pierce/handle_process(seconds_per_tick, times_fired) +/datum/wound/pierce/bleed/handle_process(seconds_per_tick, times_fired) + if (!victim || HAS_TRAIT(victim, TRAIT_STASIS)) + return + set_blood_flow(min(blood_flow, WOUND_SLASH_MAX_BLOODFLOW)) - if(!no_bleeding) + if(limb.can_bleed()) if(victim.bodytemperature < (BODYTEMP_NORMAL - 10)) adjust_blood_flow(-0.1 * seconds_per_tick) if(SPT_PROB(2.5, seconds_per_tick)) @@ -79,36 +86,45 @@ if(blood_flow <= 0) qdel(src) -/datum/wound/pierce/on_stasis(seconds_per_tick, times_fired) +/datum/wound/pierce/bleed/on_stasis(seconds_per_tick, times_fired) . = ..() if(blood_flow <= 0) qdel(src) -/datum/wound/pierce/check_grab_treatments(obj/item/I, mob/user) +/datum/wound/pierce/bleed/check_grab_treatments(obj/item/I, mob/user) if(I.get_temperature()) // if we're using something hot but not a cautery, we need to be aggro grabbing them first, so we don't try treating someone we're eswording return TRUE -/datum/wound/pierce/treat(obj/item/I, mob/user) +/datum/wound/pierce/bleed/treat(obj/item/I, mob/user) if(istype(I, /obj/item/stack/medical/suture)) - suture(I, user) + return suture(I, user) else if(I.tool_behaviour == TOOL_CAUTERY || I.get_temperature()) - tool_cauterize(I, user) + return tool_cauterize(I, user) -/datum/wound/pierce/on_xadone(power) +/datum/wound/pierce/bleed/on_xadone(power) . = ..() - adjust_blood_flow(-0.03 * power) // i think it's like a minimum of 3 power, so .09 blood_flow reduction per tick is pretty good for 0 effort -/datum/wound/pierce/on_synthflesh(power) + if (limb) // parent can cause us to be removed, so its reasonable to check if we're still applied + adjust_blood_flow(-0.03 * power) // i think it's like a minimum of 3 power, so .09 blood_flow reduction per tick is pretty good for 0 effort + +/datum/wound/pierce/bleed/on_synthflesh(reac_volume) . = ..() - adjust_blood_flow(-0.025 * power) // 20u * 0.05 = -1 blood flow, less than with slashes but still good considering smaller bleed rates + adjust_blood_flow(-0.025 * reac_volume) // 20u * 0.05 = -1 blood flow, less than with slashes but still good considering smaller bleed rates /// If someone is using a suture to close this puncture -/datum/wound/pierce/proc/suture(obj/item/stack/medical/suture/I, mob/user) +/datum/wound/pierce/bleed/proc/suture(obj/item/stack/medical/suture/I, mob/user) var/self_penalty_mult = (user == victim ? 1.4 : 1) - user.visible_message(span_notice("[user] begins stitching [victim]'s [limb.plaintext_zone] with [I]..."), span_notice("You begin stitching [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone] with [I]...")) - if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) - return - var/bleeding_wording = (no_bleeding ? "holes" : "bleeding") + var/treatment_delay = base_treat_time * self_penalty_mult + + if(HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) + treatment_delay *= 0.5 + user.visible_message(span_notice("[user] begins expertly stitching [victim]'s [limb.plaintext_zone] with [I]..."), span_notice("You begin stitching [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone] with [I], keeping the holo-image information in mind...")) + else + user.visible_message(span_notice("[user] begins stitching [victim]'s [limb.plaintext_zone] with [I]..."), span_notice("You begin stitching [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone] with [I]...")) + + if(!do_after(user, treatment_delay, target = victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) + return TRUE + var/bleeding_wording = (!limb.can_bleed() ? "holes" : "bleeding") user.visible_message(span_green("[user] stitches up some of the [bleeding_wording] on [victim]."), span_green("You stitch up some of the [bleeding_wording] on [user == victim ? "yourself" : "[victim]"].")) var/blood_sutured = I.stop_bleeding / self_penalty_mult adjust_blood_flow(-blood_sutured) @@ -116,20 +132,29 @@ I.use(1) if(blood_flow > 0) - try_treating(I, user) + return try_treating(I, user) else to_chat(user, span_green("You successfully close the hole in [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone].")) + return TRUE /// If someone is using either a cautery tool or something with heat to cauterize this pierce -/datum/wound/pierce/proc/tool_cauterize(obj/item/I, mob/user) +/datum/wound/pierce/bleed/proc/tool_cauterize(obj/item/I, mob/user) + var/improv_penalty_mult = (I.tool_behaviour == TOOL_CAUTERY ? 1 : 1.25) // 25% longer and less effective if you don't use a real cautery var/self_penalty_mult = (user == victim ? 1.5 : 1) // 50% longer and less effective if you do it to yourself - user.visible_message(span_danger("[user] begins cauterizing [victim]'s [limb.plaintext_zone] with [I]..."), span_warning("You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone] with [I]...")) - if(!do_after(user, base_treat_time * self_penalty_mult * improv_penalty_mult, target=victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) - return + var/treatment_delay = base_treat_time * self_penalty_mult * improv_penalty_mult + + if(HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) + treatment_delay *= 0.5 + user.visible_message(span_danger("[user] begins expertly cauterizing [victim]'s [limb.plaintext_zone] with [I]..."), span_warning("You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone] with [I], keeping the holo-image indications in mind...")) + else + user.visible_message(span_danger("[user] begins cauterizing [victim]'s [limb.plaintext_zone] with [I]..."), span_warning("You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone] with [I]...")) + + if(!do_after(user, treatment_delay, target = victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) + return TRUE - var/bleeding_wording = (no_bleeding ? "holes" : "bleeding") + var/bleeding_wording = (!limb.can_bleed() ? "holes" : "bleeding") user.visible_message(span_green("[user] cauterizes some of the [bleeding_wording] on [victim]."), span_green("You cauterize some of the [bleeding_wording] on [victim].")) limb.receive_damage(burn = 2 + severity, wound_bonus = CANT_WOUND) if(prob(30)) @@ -138,10 +163,22 @@ adjust_blood_flow(-blood_cauterized) if(blood_flow > 0) - try_treating(I, user) + return try_treating(I, user) + return TRUE + +/datum/wound_pregen_data/flesh_pierce + abstract = TRUE + + required_limb_biostate = (BIO_FLESH) + required_wounding_types = list(WOUND_PIERCE) -/datum/wound/pierce/moderate - name = "Minor Breakage" + wound_series = WOUND_SERIES_FLESH_PUNCTURE_BLEED + +/datum/wound/pierce/get_limb_examine_description() + return span_warning("The flesh on this limb appears badly perforated.") + +/datum/wound/pierce/bleed/moderate + name = "Minor Skin Breakage" desc = "Patient's skin has been broken open, causing severe bruising and minor internal bleeding in affected area." treat_text = "Treat affected site with bandaging or exposure to extreme cold. In dire cases, brief exposure to vacuum may suffice." // space is cold in ss13, so it's like an ice pack! examine_desc = "has a small, circular hole, gently bleeding" @@ -152,17 +189,26 @@ gauzed_clot_rate = 0.8 internal_bleeding_chance = 30 internal_bleeding_coefficient = 1.25 - threshold_minimum = 30 threshold_penalty = 20 status_effect_type = /datum/status_effect/wound/pierce/moderate scar_keyword = "piercemoderate" -/datum/wound/pierce/moderate/update_descriptions() - if(no_bleeding) + simple_treat_text = "Bandaging the wound will reduce blood loss, help the wound close by itself quicker, and speed up the blood recovery period. The wound itself can be slowly sutured shut." + homemade_treat_text = "Tea stimulates the body's natural healing systems, slightly fastening clotting. The wound itself can be rinsed off on a sink or shower as well. Other remedies are unnecessary." + +/datum/wound_pregen_data/flesh_pierce/breakage + abstract = FALSE + + wound_path_to_generate = /datum/wound/pierce/bleed/moderate + + threshold_minimum = 30 + +/datum/wound/pierce/bleed/moderate/update_descriptions() + if(!limb.can_bleed()) examine_desc = "has a small, circular hole" occur_text = "splits a small hole open" -/datum/wound/pierce/severe +/datum/wound/pierce/bleed/severe name = "Open Puncture" desc = "Patient's internal tissue is penetrated, causing sizeable internal bleeding and reduced limb stability." treat_text = "Repair punctures in skin by suture or cautery, extreme cold may also work." @@ -174,16 +220,25 @@ gauzed_clot_rate = 0.6 internal_bleeding_chance = 60 internal_bleeding_coefficient = 1.5 - threshold_minimum = 50 threshold_penalty = 35 status_effect_type = /datum/status_effect/wound/pierce/severe scar_keyword = "piercesevere" -/datum/wound/pierce/severe/update_descriptions() - if(no_bleeding) + simple_treat_text = "Bandaging the wound is essential, and will reduce blood loss. Afterwards, the wound can be sutured shut, preferably while the patient is resting and/or grasping their wound." + homemade_treat_text = "Bed sheets can be ripped up to make makeshift gauze. Flour, table salt, or salt mixed with water can be applied directly to stem the flow, though unmixed salt will irritate the skin and worsen natural healing. Resting and grabbing your wound will also reduce bleeding." + +/datum/wound_pregen_data/flesh_pierce/open_puncture + abstract = FALSE + + wound_path_to_generate = /datum/wound/pierce/bleed/severe + + threshold_minimum = 50 + +/datum/wound/pierce/bleed/severe/update_descriptions() + if(!limb.can_bleed()) occur_text = "tears a hole open" -/datum/wound/pierce/critical +/datum/wound/pierce/bleed/critical name = "Ruptured Cavity" desc = "Patient's internal tissue and circulatory system is shredded, causing significant internal bleeding and damage to internal organs." treat_text = "Surgical repair of puncture wound, followed by supervised resanguination." @@ -195,8 +250,17 @@ gauzed_clot_rate = 0.4 internal_bleeding_chance = 80 internal_bleeding_coefficient = 1.75 - threshold_minimum = 100 threshold_penalty = 50 status_effect_type = /datum/status_effect/wound/pierce/critical scar_keyword = "piercecritical" - wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE | MANGLES_FLESH) + wound_flags = (ACCEPTS_GAUZE | MANGLES_EXTERIOR | CAN_BE_GRASPED) + + simple_treat_text = "Bandaging the wound is of utmost importance, as is seeking direct medical attention - Death will ensue if treatment is delayed whatsoever, with lack of oxygen killing the patient, thus Food, Iron, and saline solution is always recommended after treatment. This wound will not naturally seal itself." + homemade_treat_text = "Bed sheets can be ripped up to make makeshift gauze. Flour, salt, and saltwater topically applied will help. Dropping to the ground and grabbing your wound will reduce blood flow." + +/datum/wound_pregen_data/flesh_pierce/cavity + abstract = FALSE + + wound_path_to_generate = /datum/wound/pierce/bleed/critical + + threshold_minimum = 100 diff --git a/code/datums/wounds/scars/_scars.dm b/code/datums/wounds/scars/_scars.dm index d8de1ab7752a0..e650899be297b 100644 --- a/code/datums/wounds/scars/_scars.dm +++ b/code/datums/wounds/scars/_scars.dm @@ -22,11 +22,14 @@ var/visibility = 2 /// Whether this scar can actually be covered up by clothing var/coverable = TRUE - /// Obviously, scars that describe damaged flesh wouldn't apply to a skeleton (in some cases like bone wounds, there can be different descriptions for skeletons and fleshy humanoids) - var/biology = BIO_FLESH_BONE /// If we're a persistent scar or may become one, we go in this character slot var/persistent_character_slot = 0 + /// The biostates we require from a limb to give them our scar. + var/required_limb_biostate + /// If false, we will only check to see if a limb has ALL our biostates, instead of just any. + var/check_any_biostates + /datum/scar/Destroy(force, ...) if(limb) LAZYREMOVE(limb.scars, src) @@ -47,6 +50,19 @@ * * add_to_scars- Should always be TRUE unless you're just storing a scar for later usage, like how cuts want to store a scar for the highest severity of cut, rather than the severity when the wound is fully healed (probably demoted to moderate) */ /datum/scar/proc/generate(obj/item/bodypart/BP, datum/wound/W, add_to_scars=TRUE) + + if (!W.can_scar) + qdel(src) + return + + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[W.type] + if (!pregen_data) + qdel(src) + return + + required_limb_biostate = pregen_data.required_limb_biostate + check_any_biostates = pregen_data.require_any_biostate + limb = BP RegisterSignal(limb, COMSIG_QDELETING, PROC_REF(limb_gone)) @@ -59,12 +75,16 @@ if(victim) LAZYADD(victim.all_scars, src) - biology = limb?.biological_state || BIO_FLESH_BONE + var/scar_file = W.get_scar_file(BP, add_to_scars) + var/scar_keyword = W.get_scar_keyword(BP, add_to_scars) + if (!scar_file || !scar_keyword) + qdel(src) + return - if((biology & BIO_BONE) && !(biology & BIO_FLESH)) - description = pick_list(BONE_SCAR_FILE, W.scar_keyword) || "general disfigurement" - else // no specific support for flesh w/o bone scars since it's not really useful - description = pick_list(FLESH_SCAR_FILE, W.scar_keyword) || "general disfigurement" + description = pick_list(scar_file, scar_keyword) + if (!description) + stack_trace("no valid description found for scar! file: [scar_file] keyword: [scar_keyword] wound: [W.type]") + description = "general disfigurement" precise_location = pick_list_replacements(SCAR_LOC_FILE, limb.body_zone) switch(W.severity) @@ -86,22 +106,28 @@ LAZYADD(victim.all_scars, src) /// Used to "load" a persistent scar -/datum/scar/proc/load(obj/item/bodypart/BP, version, description, specific_location, severity=WOUND_SEVERITY_SEVERE, biology=BIO_FLESH_BONE, char_slot) - if(!IS_ORGANIC_LIMB(BP)) +/datum/scar/proc/load(obj/item/bodypart/BP, version, description, specific_location, severity = WOUND_SEVERITY_SEVERE, required_limb_biostate = BIO_STANDARD_UNJOINTED, char_slot, check_any_biostates = FALSE) + if(!BP.scarrable) qdel(src) return limb = BP RegisterSignal(limb, COMSIG_QDELETING, PROC_REF(limb_gone)) - if(limb.owner) - victim = limb.owner - if(limb.biological_state != biology) + if (isnull(check_any_biostates)) // so we dont break old scars. NOTE: REMOVE AFTER VERSION NUMBER MOVES PAST 3 + check_any_biostates = FALSE + if (check_any_biostates) + if (!(limb.biological_state & required_limb_biostate)) qdel(src) return + else if (!((limb.biological_state & required_limb_biostate) == required_limb_biostate)) // check for all + qdel(src) + return + if(limb.owner) + victim = limb.owner LAZYADD(victim.all_scars, src) src.severity = severity - src.biology = biology + src.required_limb_biostate = required_limb_biostate persistent_character_slot = char_slot LAZYADD(limb.scars, src) @@ -127,7 +153,7 @@ if(!victim || !is_visible(viewer)) return - var/msg = "[victim.p_they(TRUE)] [victim.p_have()] [description] on [victim.p_their()] [precise_location]." + var/msg = "[victim.p_They()] [victim.p_have()] [description] on [victim.p_their()] [precise_location]." switch(severity) if(WOUND_SEVERITY_MODERATE) msg = span_tinynoticeital("[msg]") @@ -136,7 +162,7 @@ if(WOUND_SEVERITY_CRITICAL) msg = span_smallnoticeital("[msg]") if(WOUND_SEVERITY_LOSS) - msg = "[victim.p_their(TRUE)] [limb.plaintext_zone] [description]." // different format + msg = "[victim.p_Their()] [limb.plaintext_zone] [description]." // different format msg = span_notice("[msg]") return "\t[msg]" @@ -155,7 +181,7 @@ if((human_victim.wear_mask && (human_victim.wear_mask.flags_inv & HIDEFACE)) || (human_victim.head && (human_victim.head.flags_inv & HIDEFACE))) return FALSE else if(limb.scars_covered_by_clothes) - var/num_covers = LAZYLEN(human_victim.clothingonpart(limb)) + var/num_covers = LAZYLEN(human_victim.get_clothing_on_part(limb)) if(num_covers + get_dist(viewer, victim) >= visibility) return FALSE @@ -163,9 +189,9 @@ /// Used to format a scar to save for either persistent scars, or for changeling disguises /datum/scar/proc/format() - return "[SCAR_CURRENT_VERSION]|[limb.body_zone]|[description]|[precise_location]|[severity]|[biology]|[persistent_character_slot]" + return "[SCAR_CURRENT_VERSION]|[limb.body_zone]|[description]|[precise_location]|[severity]|[required_limb_biostate]|[persistent_character_slot]|[check_any_biostates]" /// Used to format a scar to save in preferences for persistent scars -/datum/scar/proc/format_amputated(body_zone) - description = pick_list(FLESH_SCAR_FILE, "dismember") - return "[SCAR_CURRENT_VERSION]|[body_zone]|[description]|amputated|[WOUND_SEVERITY_LOSS]|[BIO_FLESH_BONE]|[persistent_character_slot]" +/datum/scar/proc/format_amputated(body_zone, scar_file = FLESH_SCAR_FILE) + description = pick_list(scar_file, "dismember") + return "[SCAR_CURRENT_VERSION]|[body_zone]|[description]|amputated|[WOUND_SEVERITY_LOSS]|[required_limb_biostate]|[persistent_character_slot]|[check_any_biostates]" diff --git a/code/datums/wounds/slash.dm b/code/datums/wounds/slash.dm index 88f6eeee0e16b..d17b59cf80b6e 100644 --- a/code/datums/wounds/slash.dm +++ b/code/datums/wounds/slash.dm @@ -6,13 +6,25 @@ /datum/wound/slash name = "Slashing (Cut) Wound" sound_effect = 'sound/weapons/slice.ogg' + +/datum/wound_pregen_data/flesh_slash + abstract = TRUE + + required_wounding_types = list(WOUND_SLASH) + required_limb_biostate = BIO_FLESH + + wound_series = WOUND_SERIES_FLESH_SLASH_BLEED + +/datum/wound/slash/flesh + name = "Slashing (Cut) Flesh Wound" processes = TRUE - wound_type = WOUND_SLASH treatable_by = list(/obj/item/stack/medical/suture) treatable_by_grabbed = list(/obj/item/gun/energy/laser) - treatable_tool = TOOL_CAUTERY + treatable_tools = list(TOOL_CAUTERY) base_treat_time = 3 SECONDS - wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE) + wound_flags = (ACCEPTS_GAUZE|CAN_BE_GRASPED) + + default_scar_file = FLESH_SCAR_FILE /// How much blood we start losing when this wound is first applied var/initial_flow @@ -30,7 +42,12 @@ /// A bad system I'm using to track the worst scar we earned (since we can demote, we want the biggest our wound has been, not what it was when it was cured (probably moderate)) var/datum/scar/highest_scar -/datum/wound/slash/wound_injury(datum/wound/slash/old_wound = null, attack_direction = null) +/datum/wound/slash/flesh/Destroy() + highest_scar = null + + return ..() + +/datum/wound/slash/flesh/wound_injury(datum/wound/slash/flesh/old_wound = null, attack_direction = null) if(old_wound) set_blood_flow(max(old_wound.blood_flow, initial_flow)) if(old_wound.severity > severity && old_wound.highest_scar) @@ -38,7 +55,7 @@ old_wound.clear_highest_scar() else set_blood_flow(initial_flow) - if(!no_bleeding && attack_direction && victim.blood_volume > BLOOD_VOLUME_OKAY) + if(limb.can_bleed() && attack_direction && victim.blood_volume > BLOOD_VOLUME_OKAY) victim.spray_blood(attack_direction, severity) if(!highest_scar) @@ -46,24 +63,26 @@ set_highest_scar(new_scar) new_scar.generate(limb, src, add_to_scars=FALSE) -/datum/wound/slash/proc/set_highest_scar(datum/scar/new_scar) + return ..() + +/datum/wound/slash/flesh/proc/set_highest_scar(datum/scar/new_scar) if(highest_scar) UnregisterSignal(highest_scar, COMSIG_QDELETING) if(new_scar) RegisterSignal(new_scar, COMSIG_QDELETING, PROC_REF(clear_highest_scar)) highest_scar = new_scar -/datum/wound/slash/proc/clear_highest_scar(datum/source) +/datum/wound/slash/flesh/proc/clear_highest_scar(datum/source) SIGNAL_HANDLER set_highest_scar(null) -/datum/wound/slash/remove_wound(ignore_limb, replaced) +/datum/wound/slash/flesh/remove_wound(ignore_limb, replaced) if(!replaced && highest_scar) already_scarred = TRUE highest_scar.lazy_attach(limb) return ..() -/datum/wound/slash/get_examine_description(mob/user) +/datum/wound/slash/flesh/get_wound_description(mob/user) if(!limb.current_gauze) return ..() @@ -82,11 +101,16 @@ return "[msg.Join()]" -/datum/wound/slash/receive_damage(wounding_type, wounding_dmg, wound_bonus) +/datum/wound/slash/flesh/receive_damage(wounding_type, wounding_dmg, wound_bonus) + if (!victim) // if we are dismembered, we can still take damage, its fine to check here + return + if(victim.stat != DEAD && wound_bonus != CANT_WOUND && wounding_type == WOUND_SLASH) // can't stab dead bodies to make it bleed faster this way adjust_blood_flow(WOUND_SLASH_DAMAGE_FLOW_COEFF * wounding_dmg) -/datum/wound/slash/drag_bleed_amount() + return ..() + +/datum/wound/slash/flesh/drag_bleed_amount() // say we have 3 severe cuts with 3 blood flow each, pretty reasonable // compare with being at 100 brute damage before, where you bled (brute/100 * 2), = 2 blood per tile var/bleed_amt = min(blood_flow * 0.1, 1) // 3 * 3 * 0.1 = 0.9 blood total, less than before! the share here is .3 blood of course. @@ -97,9 +121,9 @@ return bleed_amt -/datum/wound/slash/get_bleed_rate_of_change() +/datum/wound/slash/flesh/get_bleed_rate_of_change() //basically if a species doesn't bleed, the wound is stagnant and will not heal on it's own (nor get worse) - if(no_bleeding) + if(!limb.can_bleed()) return BLOOD_FLOW_STEADY if(HAS_TRAIT(victim, TRAIT_BLOODY_MESS)) return BLOOD_FLOW_INCREASING @@ -108,9 +132,13 @@ if(clot_rate < 0) return BLOOD_FLOW_INCREASING -/datum/wound/slash/handle_process(seconds_per_tick, times_fired) +/datum/wound/slash/flesh/handle_process(seconds_per_tick, times_fired) + + if (!victim || HAS_TRAIT(victim, TRAIT_STASIS)) + return + // in case the victim has the NOBLOOD trait, the wound will simply not clot on it's own - if(!no_bleeding) + if(limb.can_bleed()) set_blood_flow(min(blood_flow, WOUND_SLASH_MAX_BLOODFLOW)) if(HAS_TRAIT(victim, TRAIT_BLOODY_MESS)) @@ -123,7 +151,7 @@ adjust_blood_flow(-limb.current_gauze.absorption_rate * seconds_per_tick) limb.seep_gauze(limb.current_gauze.absorption_rate * seconds_per_tick) //otherwise, only clot if it's a bleeder - else if(!no_bleeding) + else if(limb.can_bleed()) adjust_blood_flow(-clot_rate * seconds_per_tick) if(blood_flow > highest_flow) @@ -131,36 +159,36 @@ if(blood_flow < minimum_flow) if(demotes_to) - replace_wound(demotes_to) + replace_wound(new demotes_to) else - to_chat(victim, span_green("The cut on your [limb.plaintext_zone] has [no_bleeding ? "healed up" : "stopped bleeding"]!")) + to_chat(victim, span_green("The cut on your [limb.plaintext_zone] has [!limb.can_bleed() ? "healed up" : "stopped bleeding"]!")) qdel(src) -/datum/wound/slash/on_stasis(seconds_per_tick, times_fired) +/datum/wound/slash/flesh/on_stasis(seconds_per_tick, times_fired) if(blood_flow >= minimum_flow) return if(demotes_to) - replace_wound(demotes_to) + replace_wound(new demotes_to) return qdel(src) /* BEWARE, THE BELOW NONSENSE IS MADNESS. bones.dm looks more like what I have in mind and is sufficiently clean, don't pay attention to this messiness */ -/datum/wound/slash/check_grab_treatments(obj/item/I, mob/user) +/datum/wound/slash/flesh/check_grab_treatments(obj/item/I, mob/user) if(istype(I, /obj/item/gun/energy/laser)) return TRUE if(I.get_temperature()) // if we're using something hot but not a cautery, we need to be aggro grabbing them first, so we don't try treating someone we're eswording return TRUE -/datum/wound/slash/treat(obj/item/I, mob/user) +/datum/wound/slash/flesh/treat(obj/item/I, mob/user) if(istype(I, /obj/item/gun/energy/laser)) - las_cauterize(I, user) + return las_cauterize(I, user) else if(I.tool_behaviour == TOOL_CAUTERY || I.get_temperature()) - tool_cauterize(I, user) + return tool_cauterize(I, user) else if(istype(I, /obj/item/stack/medical/suture)) - suture(I, user) + return suture(I, user) -/datum/wound/slash/try_handling(mob/living/carbon/human/user) +/datum/wound/slash/flesh/try_handling(mob/living/carbon/human/user) if(user.pulling != victim || user.zone_selected != limb.body_zone || !isfelinid(user) || !victim.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE)) return FALSE if(DOING_INTERACTION_WITH_TARGET(user, victim)) @@ -177,7 +205,7 @@ return TRUE /// if a felinid is licking this cut to reduce bleeding -/datum/wound/slash/proc/lick_wounds(mob/living/carbon/human/user) +/datum/wound/slash/flesh/proc/lick_wounds(mob/living/carbon/human/user) // transmission is one way patient -> felinid since google said cat saliva is antiseptic or whatever, and also because felinids are already risking getting beaten for this even without people suspecting they're spreading a deathvirus for(var/i in victim.diseases) var/datum/disease/iter_disease = i @@ -199,16 +227,18 @@ else if(demotes_to) to_chat(user, span_green("You successfully lower the severity of [victim]'s cuts.")) -/datum/wound/slash/on_xadone(power) +/datum/wound/slash/flesh/on_xadone(power) . = ..() - adjust_blood_flow(-0.03 * power) // i think it's like a minimum of 3 power, so .09 blood_flow reduction per tick is pretty good for 0 effort -/datum/wound/slash/on_synthflesh(power) + if (limb) // parent can cause us to be removed, so its reasonable to check if we're still applied + adjust_blood_flow(-0.03 * power) // i think it's like a minimum of 3 power, so .09 blood_flow reduction per tick is pretty good for 0 effort + +/datum/wound/slash/flesh/on_synthflesh(reac_volume) . = ..() - adjust_blood_flow(-0.075 * power) // 20u * 0.075 = -1.5 blood flow, pretty good for how little effort it is + adjust_blood_flow(-0.075 * reac_volume) // 20u * 0.075 = -1.5 blood flow, pretty good for how little effort it is /// If someone's putting a laser gun up to our cut to cauterize it -/datum/wound/slash/proc/las_cauterize(obj/item/gun/energy/laser/lasgun, mob/user) +/datum/wound/slash/flesh/proc/las_cauterize(obj/item/gun/energy/laser/lasgun, mob/user) var/self_penalty_mult = (user == victim ? 1.25 : 1) user.visible_message(span_warning("[user] begins aiming [lasgun] directly at [victim]'s [limb.plaintext_zone]..."), span_userdanger("You begin aiming [lasgun] directly at [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone]...")) if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) @@ -221,16 +251,24 @@ victim.emote("scream") adjust_blood_flow(-1 * (damage / (5 * self_penalty_mult))) // 20 / 5 = 4 bloodflow removed, p good victim.visible_message(span_warning("The cuts on [victim]'s [limb.plaintext_zone] scar over!")) + return TRUE /// If someone is using either a cautery tool or something with heat to cauterize this cut -/datum/wound/slash/proc/tool_cauterize(obj/item/I, mob/user) +/datum/wound/slash/flesh/proc/tool_cauterize(obj/item/I, mob/user) var/improv_penalty_mult = (I.tool_behaviour == TOOL_CAUTERY ? 1 : 1.25) // 25% longer and less effective if you don't use a real cautery var/self_penalty_mult = (user == victim ? 1.5 : 1) // 50% longer and less effective if you do it to yourself - user.visible_message(span_danger("[user] begins cauterizing [victim]'s [limb.plaintext_zone] with [I]..."), span_warning("You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone] with [I]...")) - if(!do_after(user, base_treat_time * self_penalty_mult * improv_penalty_mult, target=victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) + var/treatment_delay = base_treat_time * self_penalty_mult * improv_penalty_mult + + if(HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) + treatment_delay *= 0.5 + user.visible_message(span_danger("[user] begins expertly cauterizing [victim]'s [limb.plaintext_zone] with [I]..."), span_warning("You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone] with [I], keeping the holo-image indications in mind...")) + else + user.visible_message(span_danger("[user] begins cauterizing [victim]'s [limb.plaintext_zone] with [I]..."), span_warning("You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone] with [I]...")) + + if(!do_after(user, treatment_delay, target = victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) return - var/bleeding_wording = (no_bleeding ? "cuts" : "bleeding") + var/bleeding_wording = (!limb.can_bleed() ? "cuts" : "bleeding") user.visible_message(span_green("[user] cauterizes some of the [bleeding_wording] on [victim]."), span_green("You cauterize some of the [bleeding_wording] on [victim].")) limb.receive_damage(burn = 2 + severity, wound_bonus = CANT_WOUND) if(prob(30)) @@ -239,18 +277,26 @@ adjust_blood_flow(-blood_cauterized) if(blood_flow > minimum_flow) - try_treating(I, user) + return try_treating(I, user) else if(demotes_to) to_chat(user, span_green("You successfully lower the severity of [user == victim ? "your" : "[victim]'s"] cuts.")) + return TRUE + return FALSE /// If someone is using a suture to close this cut -/datum/wound/slash/proc/suture(obj/item/stack/medical/suture/I, mob/user) +/datum/wound/slash/flesh/proc/suture(obj/item/stack/medical/suture/I, mob/user) var/self_penalty_mult = (user == victim ? 1.4 : 1) - user.visible_message(span_notice("[user] begins stitching [victim]'s [limb.plaintext_zone] with [I]..."), span_notice("You begin stitching [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone] with [I]...")) + var/treatment_delay = base_treat_time * self_penalty_mult - if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) - return - var/bleeding_wording = (no_bleeding ? "cuts" : "bleeding") + if(HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) + treatment_delay *= 0.5 + user.visible_message(span_notice("[user] begins expertly stitching [victim]'s [limb.plaintext_zone] with [I]..."), span_notice("You begin stitching [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone] with [I], keeping the holo-image information in mind...")) + else + user.visible_message(span_notice("[user] begins stitching [victim]'s [limb.plaintext_zone] with [I]..."), span_notice("You begin stitching [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone] with [I]...")) + + if(!do_after(user, treatment_delay, target = victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) + return TRUE + var/bleeding_wording = (!limb.can_bleed() ? "cuts" : "bleeding") user.visible_message(span_green("[user] stitches up some of the [bleeding_wording] on [victim]."), span_green("You stitch up some of the [bleeding_wording] on [user == victim ? "yourself" : "[victim]"].")) var/blood_sutured = I.stop_bleeding / self_penalty_mult adjust_blood_flow(-blood_sutured) @@ -258,11 +304,16 @@ I.use(1) if(blood_flow > minimum_flow) - try_treating(I, user) + return try_treating(I, user) else if(demotes_to) to_chat(user, span_green("You successfully lower the severity of [user == victim ? "your" : "[victim]'s"] cuts.")) + return TRUE + return TRUE + +/datum/wound/slash/get_limb_examine_description() + return span_warning("The flesh on this limb appears badly lacerated.") -/datum/wound/slash/moderate +/datum/wound/slash/flesh/moderate name = "Rough Abrasion" desc = "Patient's skin has been badly scraped, generating moderate blood loss." treat_text = "Application of clean bandages or first-aid grade sutures, followed by food and rest." @@ -273,16 +324,25 @@ initial_flow = 2 minimum_flow = 0.5 clot_rate = 0.05 - threshold_minimum = 20 threshold_penalty = 10 - status_effect_type = /datum/status_effect/wound/slash/moderate + status_effect_type = /datum/status_effect/wound/slash/flesh/moderate scar_keyword = "slashmoderate" -/datum/wound/slash/moderate/update_descriptions() - if(no_bleeding) + simple_treat_text = "Bandaging the wound will reduce blood loss, help the wound close by itself quicker, and speed up the blood recovery period. The wound itself can be slowly sutured shut." + homemade_treat_text = "Tea stimulates the body's natural healing systems, slightly fastening clotting. The wound itself can be rinsed off on a sink or shower as well. Other remedies are unnecessary." + +/datum/wound/slash/flesh/moderate/update_descriptions() + if(!limb.can_bleed()) occur_text = "is cut open" -/datum/wound/slash/severe +/datum/wound_pregen_data/flesh_slash/abrasion + abstract = FALSE + + wound_path_to_generate = /datum/wound/slash/flesh/moderate + + threshold_minimum = 20 + +/datum/wound/slash/flesh/severe name = "Open Laceration" desc = "Patient's skin is ripped clean open, allowing significant blood loss." treat_text = "Speedy application of first-aid grade sutures and clean bandages, followed by vitals monitoring to ensure recovery." @@ -293,48 +353,78 @@ initial_flow = 3.25 minimum_flow = 2.75 clot_rate = 0.03 - threshold_minimum = 50 threshold_penalty = 25 - demotes_to = /datum/wound/slash/moderate - status_effect_type = /datum/status_effect/wound/slash/severe + demotes_to = /datum/wound/slash/flesh/moderate + status_effect_type = /datum/status_effect/wound/slash/flesh/severe scar_keyword = "slashsevere" -/datum/wound/slash/severe/update_descriptions() - if(no_bleeding) + simple_treat_text = "Bandaging the wound is essential, and will reduce blood loss. Afterwards, the wound can be sutured shut, preferably while the patient is resting and/or grasping their wound." + homemade_treat_text = "Bed sheets can be ripped up to make makeshift gauze. Flour, table salt, or salt mixed with water can be applied directly to stem the flow, though unmixed salt will irritate the skin and worsen natural healing. Resting and grabbing your wound will also reduce bleeding." + +/datum/wound_pregen_data/flesh_slash/laceration + abstract = FALSE + + wound_path_to_generate = /datum/wound/slash/flesh/severe + + threshold_minimum = 50 + +/datum/wound/slash/flesh/severe/update_descriptions() + if(!limb.can_bleed()) occur_text = "is ripped open" -/datum/wound/slash/critical +/datum/wound/slash/flesh/critical name = "Weeping Avulsion" desc = "Patient's skin is completely torn open, along with significant loss of tissue. Extreme blood loss will lead to quick death without intervention." treat_text = "Immediate bandaging and either suturing or cauterization, followed by supervised resanguination." examine_desc = "is carved down to the bone, spraying blood wildly" - examine_desc = "is carved down to the bone" occur_text = "is torn open, spraying blood wildly" - occur_text = "is torn open" sound_effect = 'sound/effects/wounds/blood3.ogg' severity = WOUND_SEVERITY_CRITICAL initial_flow = 4 minimum_flow = 3.85 clot_rate = -0.015 // critical cuts actively get worse instead of better - threshold_minimum = 80 threshold_penalty = 40 - demotes_to = /datum/wound/slash/severe - status_effect_type = /datum/status_effect/wound/slash/critical + demotes_to = /datum/wound/slash/flesh/severe + status_effect_type = /datum/status_effect/wound/slash/flesh/critical scar_keyword = "slashcritical" - wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE | MANGLES_FLESH) + wound_flags = (ACCEPTS_GAUZE | MANGLES_EXTERIOR | CAN_BE_GRASPED) + simple_treat_text = "Bandaging the wound is of utmost importance, as is seeking direct medical attention - Death will ensue if treatment is delayed whatsoever, with lack of oxygen killing the patient, thus Food, Iron, and saline solution is always recommended after treatment. This wound will not naturally seal itself." + homemade_treat_text = "Bed sheets can be ripped up to make makeshift gauze. Flour, salt, and saltwater topically applied will help. Dropping to the ground and grabbing your wound will reduce blood flow." + +/datum/wound/slash/flesh/critical/update_descriptions() + if (!limb.can_bleed()) + occur_text = "is torn open" + +/datum/wound_pregen_data/flesh_slash/avulsion + abstract = FALSE -/datum/wound/slash/moderate/many_cuts + wound_path_to_generate = /datum/wound/slash/flesh/critical + threshold_minimum = 80 + +/datum/wound/slash/flesh/moderate/many_cuts name = "Numerous Small Slashes" desc = "Patient's skin has numerous small slashes and cuts, generating moderate blood loss." examine_desc = "has a ton of small cuts" occur_text = "is cut numerous times, leaving many small slashes." +/datum/wound_pregen_data/flesh_slash/abrasion/cuts + abstract = FALSE + can_be_randomly_generated = FALSE + + wound_path_to_generate = /datum/wound/slash/flesh/moderate/many_cuts + // Subtype for cleave (heretic spell) -/datum/wound/slash/critical/cleave +/datum/wound/slash/flesh/critical/cleave name = "Burning Avulsion" examine_desc = "is ruptured, spraying blood wildly" clot_rate = 0.01 -/datum/wound/slash/critical/cleave/update_descriptions() - if(no_bleeding) +/datum/wound/slash/flesh/critical/cleave/update_descriptions() + if(!limb.can_bleed()) occur_text = "is ruptured" + +/datum/wound_pregen_data/flesh_slash/avulsion/clear + abstract = FALSE + can_be_randomly_generated = FALSE + + wound_path_to_generate = /datum/wound/slash/flesh/critical/cleave diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index f6252a4fbca0c..b6a680e4807cb 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -200,7 +200,8 @@ GLOBAL_LIST_EMPTY(teleportlocs) power_change() // all machines set to current power level, also updates icon update_beauty() -/area/proc/RunGeneration() +/// Generate turfs, including cool cave wall gen +/area/proc/RunTerrainGeneration() if(map_generator) map_generator = new map_generator() var/list/turfs = list() @@ -208,6 +209,14 @@ GLOBAL_LIST_EMPTY(teleportlocs) turfs += T map_generator.generate_terrain(turfs, src) +/// Populate the previously generated terrain with mobs and objects +/area/proc/RunTerrainPopulation() + if(map_generator) + var/list/turfs = list() + for(var/turf/T in contents) + turfs += T + map_generator.populate_terrain(turfs, src) + /area/proc/test_gen() if(map_generator) var/list/turfs = list() @@ -473,6 +482,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) */ /area/Exited(atom/movable/gone, direction) SEND_SIGNAL(src, COMSIG_AREA_EXITED, gone, direction) + SEND_SIGNAL(gone, COMSIG_MOVABLE_EXITED_AREA, src, direction) if(!gone.important_recursive_contents?[RECURSIVE_CONTENTS_AREA_SENSITIVE]) return @@ -547,3 +557,10 @@ GLOBAL_LIST_EMPTY(teleportlocs) if(name == initial(name)) return name return "[name] ([initial(name)])" + +/** + * A blank area subtype solely used by the golem area editor for the purpose of + * allowing golems to create new areas without suffering from the hazard_area debuffs. + */ +/area/golem + name = "Golem Territory" diff --git a/code/game/area/areas/away_content.dm b/code/game/area/areas/away_content.dm index 20da4c5ae3ff9..2927b081c5ef2 100644 --- a/code/game/area/areas/away_content.dm +++ b/code/game/area/areas/away_content.dm @@ -27,7 +27,7 @@ Unused icons for new areas are "awaycontent1" ~ "awaycontent30" name = "Super Secret Room" static_lighting = FALSE base_lighting_alpha = 255 - + area_flags = UNIQUE_AREA|NOTELEPORT has_gravity = STANDARD_GRAVITY /area/awaymission/secret diff --git a/code/game/area/areas/centcom.dm b/code/game/area/areas/centcom.dm index 55c30ddb5c4e7..dedc4984f8e1f 100644 --- a/code/game/area/areas/centcom.dm +++ b/code/game/area/areas/centcom.dm @@ -78,8 +78,6 @@ /area/centcom/central_command_areas/supplypod name = "Supplypod Facility" icon_state = "supplypod" - static_lighting = FALSE - base_lighting_alpha = 255 /area/centcom/central_command_areas/supplypod/pod_storage name = "Supplypod Storage" @@ -122,16 +120,10 @@ /area/centcom/tdome name = "Thunderdome" icon_state = "thunder" - static_lighting = TRUE - requires_power = FALSE - has_gravity = STANDARD_GRAVITY - flags_1 = NONE /area/centcom/tdome/arena name = "Thunderdome Arena" icon_state = "thunder" - static_lighting = FALSE - base_lighting_alpha = 255 /area/centcom/tdome/tdome1 name = "Thunderdome (Team 1)" diff --git a/code/game/area/areas/mining.dm b/code/game/area/areas/mining.dm index ebf6b230748ae..1582f7390cf04 100644 --- a/code/game/area/areas/mining.dm +++ b/code/game/area/areas/mining.dm @@ -189,6 +189,7 @@ has_gravity = STANDARD_GRAVITY flags_1 = NONE area_flags = UNIQUE_AREA | FLORA_ALLOWED + ambience_index = AMBIENCE_ICEMOON sound_environment = SOUND_AREA_ICEMOON ambient_buzz = 'sound/ambience/magma.ogg' @@ -200,7 +201,6 @@ power_equip = FALSE power_light = FALSE requires_power = TRUE - ambience_index = AMBIENCE_MINING area_flags = UNIQUE_AREA | FLORA_ALLOWED min_ambience_cooldown = 70 SECONDS max_ambience_cooldown = 220 SECONDS @@ -211,6 +211,12 @@ /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/nospawn/New() // unless you roll forested trait lol + . = ..() + if(HAS_TRAIT(SSstation, STATION_TRAIT_FORESTED)) + map_generator = /datum/map_generator/cave_generator/icemoon/surface/forested + area_flags = MOB_SPAWN_ALLOWED | FLORA_ALLOWED//flip this on, the generator has already disabled dangerous fauna + /area/icemoon/surface/outdoors/noteleport // for places like the cursed spring water area_flags = UNIQUE_AREA | FLORA_ALLOWED | NOTELEPORT @@ -231,6 +237,12 @@ icon_state = "danger" map_generator = /datum/map_generator/cave_generator/icemoon/surface +/area/icemoon/surface/outdoors/unexplored/rivers/New() + . = ..() + if(HAS_TRAIT(SSstation, STATION_TRAIT_FORESTED)) + map_generator = /datum/map_generator/cave_generator/icemoon/surface/forested + area_flags |= MOB_SPAWN_ALLOWED //flip this on, the generator has already disabled dangerous fauna + /area/icemoon/surface/outdoors/unexplored/rivers/no_monsters area_flags = UNIQUE_AREA | FLORA_ALLOWED | CAVES_ALLOWED @@ -242,7 +254,6 @@ power_environ = FALSE power_equip = FALSE power_light = FALSE - ambience_index = AMBIENCE_MINING area_flags = UNIQUE_AREA | FLORA_ALLOWED min_ambience_cooldown = 70 SECONDS max_ambience_cooldown = 220 SECONDS diff --git a/code/game/area/areas/misc.dm b/code/game/area/areas/misc.dm index af2aaa6666c48..c7273c75aac04 100644 --- a/code/game/area/areas/misc.dm +++ b/code/game/area/areas/misc.dm @@ -23,9 +23,6 @@ /area/space/nearstation icon_state = "space_near" area_flags = UNIQUE_AREA | AREA_USES_STARLIGHT - static_lighting = TRUE - base_lighting_alpha = 0 - base_lighting_color = COLOR_WHITE /area/misc/start name = "start area" @@ -43,3 +40,8 @@ base_lighting_alpha = 255 name = "Test Room" icon_state = "test_room" + +/area/misc/testroom/gateway_room + name = "Gateway Room" + icon = 'icons/area/areas_station.dmi' + icon_state = "gateway" diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm index 989ca6f80398c..e27d330ae250e 100644 --- a/code/game/area/areas/shuttles.dm +++ b/code/game/area/areas/shuttles.dm @@ -68,13 +68,10 @@ /area/shuttle/hunter name = "Hunter Shuttle" - static_lighting = FALSE - base_lighting_alpha = 255 /area/shuttle/hunter/russian name = "Russian Cargo Hauler" requires_power = TRUE - static_lighting = TRUE ////////////////////////////White Ship//////////////////////////// diff --git a/code/game/area/areas/station.dm b/code/game/area/areas/station.dm deleted file mode 100644 index 67db39fc08c34..0000000000000 --- a/code/game/area/areas/station.dm +++ /dev/null @@ -1,1762 +0,0 @@ -// Station areas and shuttles - -/area/station - name = "Station Areas" - icon = 'icons/area/areas_station.dmi' - icon_state = "station" - -//Maintenance - -/area/station/maintenance - name = "Generic Maintenance" - ambience_index = AMBIENCE_MAINT - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED | PERSISTENT_ENGRAVINGS - airlock_wires = /datum/wires/airlock/maint - sound_environment = SOUND_AREA_TUNNEL_ENCLOSED - forced_ambience = TRUE - ambient_buzz = 'sound/ambience/source_corridor2.ogg' - ambient_buzz_vol = 20 - -//Maintenance - Departmental - -/area/station/maintenance/department/chapel - name = "Chapel Maintenance" - icon_state = "maint_chapel" - -/area/station/maintenance/department/chapel/monastery - name = "Monastery Maintenance" - icon_state = "maint_monastery" - -/area/station/maintenance/department/crew_quarters/bar - name = "Bar Maintenance" - icon_state = "maint_bar" - sound_environment = SOUND_AREA_WOODFLOOR - -/area/station/maintenance/department/crew_quarters/dorms - name = "Dormitory Maintenance" - icon_state = "maint_dorms" - -/area/station/maintenance/department/eva - name = "EVA Maintenance" - icon_state = "maint_eva" - -/area/station/maintenance/department/eva/abandoned - name = "Abandoned EVA Storage" - -/area/station/maintenance/department/electrical - name = "Electrical Maintenance" - icon_state = "maint_electrical" - -/area/station/maintenance/department/engine/atmos - name = "Atmospherics Maintenance" - icon_state = "maint_atmos" - -/area/station/maintenance/department/security - name = "Security Maintenance" - icon_state = "maint_sec" - -/area/station/maintenance/department/security/upper - name = "Upper Security Maintenance" - -/area/station/maintenance/department/security/brig - name = "Brig Maintenance" - icon_state = "maint_brig" - -/area/station/maintenance/department/medical - name = "Medbay Maintenance" - icon_state = "medbay_maint" - -/area/station/maintenance/department/medical/central - name = "Central Medbay Maintenance" - icon_state = "medbay_maint_central" - -/area/station/maintenance/department/medical/morgue - name = "Morgue Maintenance" - icon_state = "morgue_maint" - -/area/station/maintenance/department/science - name = "Science Maintenance" - icon_state = "maint_sci" - -/area/station/maintenance/department/science/central - name = "Central Science Maintenance" - icon_state = "maint_sci_central" - -/area/station/maintenance/department/cargo - name = "Cargo Maintenance" - icon_state = "maint_cargo" - -/area/station/maintenance/department/bridge - name = "Bridge Maintenance" - icon_state = "maint_bridge" - -/area/station/maintenance/department/engine - name = "Engineering Maintenance" - icon_state = "maint_engi" - -/area/station/maintenance/department/prison - name = "Prison Maintenance" - icon_state = "sec_prison" - -/area/station/maintenance/department/science/xenobiology - name = "Xenobiology Maintenance" - icon_state = "xenomaint" - area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA | XENOBIOLOGY_COMPATIBLE | CULT_PERMITTED - -//Maintenance - Generic Tunnels - -/area/station/maintenance/aft - name = "Aft Maintenance" - icon_state = "aftmaint" - -/area/station/maintenance/aft/upper - name = "Upper Aft Maintenance" - icon_state = "upperaftmaint" - -/area/station/maintenance/aft/greater //use greater variants of area definitions for when the station has two different sections of maintenance on the same z-level. Can stand alone without "lesser". This one means that this goes more fore/north than the "lesser" maintenance area. - name = "Greater Aft Maintenance" - icon_state = "greateraftmaint" - -/area/station/maintenance/aft/lesser //use lesser variants of area definitions for when the station has two different sections of maintenance on the same z-level in conjunction with "greater" (just because it follows better). This one means that this goes more aft/south than the "greater" maintenance area. - name = "Lesser Aft Maintenance" - icon_state = "lesseraftmaint" - -/area/station/maintenance/central - name = "Central Maintenance" - icon_state = "centralmaint" - -/area/station/maintenance/central/greater - name = "Greater Central Maintenance" - icon_state = "greatercentralmaint" - -/area/station/maintenance/central/lesser - name = "Lesser Central Maintenance" - icon_state = "lessercentralmaint" - -/area/station/maintenance/fore - name = "Fore Maintenance" - icon_state = "foremaint" - -/area/station/maintenance/fore/upper - name = "Upper Fore Maintenance" - icon_state = "upperforemaint" - -/area/station/maintenance/fore/greater - name = "Greater Fore Maintenance" - icon_state = "greaterforemaint" - -/area/station/maintenance/fore/lesser - name = "Lesser Fore Maintenance" - icon_state = "lesserforemaint" - -/area/station/maintenance/starboard - name = "Starboard Maintenance" - icon_state = "starboardmaint" - -/area/station/maintenance/starboard/upper - name = "Upper Starboard Maintenance" - icon_state = "upperstarboardmaint" - -/area/station/maintenance/starboard/central - name = "Central Starboard Maintenance" - icon_state = "centralstarboardmaint" - -/area/station/maintenance/starboard/greater - name = "Greater Starboard Maintenance" - icon_state = "greaterstarboardmaint" - -/area/station/maintenance/starboard/lesser - name = "Lesser Starboard Maintenance" - icon_state = "lesserstarboardmaint" - -/area/station/maintenance/starboard/aft - name = "Aft Starboard Maintenance" - icon_state = "asmaint" - -/area/station/maintenance/starboard/fore - name = "Fore Starboard Maintenance" - icon_state = "fsmaint" - -/area/station/maintenance/port - name = "Port Maintenance" - icon_state = "portmaint" - -/area/station/maintenance/port/central - name = "Central Port Maintenance" - icon_state = "centralportmaint" - -/area/station/maintenance/port/greater - name = "Greater Port Maintenance" - icon_state = "greaterportmaint" - -/area/station/maintenance/port/lesser - name = "Lesser Port Maintenance" - icon_state = "lesserportmaint" - -/area/station/maintenance/port/aft - name = "Aft Port Maintenance" - icon_state = "apmaint" - -/area/station/maintenance/port/fore - name = "Fore Port Maintenance" - icon_state = "fpmaint" - -/area/station/maintenance/tram - name = "Primary Tram Maintenance" - -/area/station/maintenance/tram/left - name = "\improper Port Tram Underpass" - icon_state = "mainttramL" - -/area/station/maintenance/tram/mid - name = "\improper Central Tram Underpass" - icon_state = "mainttramM" - -/area/station/maintenance/tram/right - name = "\improper Starboard Tram Underpass" - icon_state = "mainttramR" - -//Maintenance - Discrete Areas -/area/station/maintenance/disposal - name = "Waste Disposal" - icon_state = "disposal" - -/area/station/maintenance/hallway/abandoned_command - name = "\improper Abandoned Command Hallway" - icon_state = "maint_bridge" - -/area/station/maintenance/hallway/abandoned_recreation - name = "\improper Abandoned Recreation Hallway" - icon_state = "maint_dorms" - -/area/station/maintenance/disposal/incinerator - name = "\improper Incinerator" - icon_state = "incinerator" - -/area/station/maintenance/space_hut - name = "\improper Space Hut" - icon_state = "spacehut" - -/area/station/maintenance/space_hut/cabin - name = "Abandoned Cabin" - -/area/station/maintenance/space_hut/plasmaman - name = "\improper Abandoned Plasmaman Friendly Startup" - -/area/station/maintenance/space_hut/observatory - name = "\improper Space Observatory" - -//Radation storm shelter -/area/station/maintenance/radshelter - name = "\improper Radstorm Shelter" - icon_state = "radstorm_shelter" - -/area/station/maintenance/radshelter/medical - name = "\improper Medical Radstorm Shelter" - -/area/station/maintenance/radshelter/sec - name = "\improper Security Radstorm Shelter" - -/area/station/maintenance/radshelter/service - name = "\improper Service Radstorm Shelter" - -/area/station/maintenance/radshelter/civil - name = "\improper Civilian Radstorm Shelter" - -/area/station/maintenance/radshelter/sci - name = "\improper Science Radstorm Shelter" - -/area/station/maintenance/radshelter/cargo - name = "\improper Cargo Radstorm Shelter" - - -//Hallway - -/area/station/hallway - icon_state = "hall" - sound_environment = SOUND_AREA_STANDARD_STATION - -/area/station/hallway/primary - name = "\improper Primary Hallway" - icon_state = "primaryhall" - -/area/station/hallway/primary/aft - name = "\improper Aft Primary Hallway" - icon_state = "afthall" - -/area/station/hallway/primary/fore - name = "\improper Fore Primary Hallway" - icon_state = "forehall" - -/area/station/hallway/primary/starboard - name = "\improper Starboard Primary Hallway" - icon_state = "starboardhall" - -/area/station/hallway/primary/port - name = "\improper Port Primary Hallway" - icon_state = "porthall" - -/area/station/hallway/primary/central - name = "\improper Central Primary Hallway" - icon_state = "centralhall" - -/area/station/hallway/primary/central/fore - name = "\improper Fore Central Primary Hallway" - icon_state = "hallCF" - -/area/station/hallway/primary/central/aft - name = "\improper Aft Central Primary Hallway" - icon_state = "hallCA" - -/area/station/hallway/primary/upper - name = "\improper Upper Central Primary Hallway" - icon_state = "centralhall" - -/area/station/hallway/primary/tram - name = "\improper Primary Tram" - -/area/station/hallway/primary/tram/left - name = "\improper Port Tram Dock" - icon_state = "halltramL" - -/area/station/hallway/primary/tram/center - name = "\improper Central Tram Dock" - icon_state = "halltramM" - -/area/station/hallway/primary/tram/right - name = "\improper Starboard Tram Dock" - icon_state = "halltramR" - -/area/station/hallway/secondary // This shouldn't be used, but it gives an icon for the enviornment tree in the map editor - icon_state = "secondaryhall" - -/area/station/hallway/secondary/command - name = "\improper Command Hallway" - icon_state = "bridge_hallway" - -/area/station/hallway/secondary/construction - name = "\improper Construction Area" - icon_state = "construction" - -/area/station/hallway/secondary/construction/engineering - name = "\improper Engineering Hallway" - -/area/station/hallway/secondary/exit - name = "\improper Escape Shuttle Hallway" - icon_state = "escape" - -/area/station/hallway/secondary/exit/escape_pod - name = "\improper Escape Pod Bay" - icon_state = "escape_pods" - -/area/station/hallway/secondary/exit/departure_lounge - name = "\improper Departure Lounge" - icon_state = "escape_lounge" - -/area/station/hallway/secondary/entry - name = "\improper Arrival Shuttle Hallway" - icon_state = "entry" - area_flags = UNIQUE_AREA | EVENT_PROTECTED - -/area/station/hallway/secondary/dock - name = "\improper Secondary Station Dock Hallway" - icon_state = "hall" - -/area/station/hallway/secondary/service - name = "\improper Service Hallway" - icon_state = "hall_service" - -/area/station/hallway/secondary/spacebridge - name = "\improper Space Bridge" - icon_state = "hall" - -/area/station/hallway/secondary/recreation - name = "\improper Recreation Hallway" - icon_state = "hall" - -//Command - -/area/station/command - name = "Command" - icon_state = "command" - ambientsounds = list('sound/ambience/signal.ogg') - airlock_wires = /datum/wires/airlock/command - sound_environment = SOUND_AREA_STANDARD_STATION - -/area/station/command/bridge - name = "\improper Bridge" - icon_state = "bridge" - -/area/station/command/meeting_room - name = "\improper Heads of Staff Meeting Room" - icon_state = "meeting" - sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR - -/area/station/command/meeting_room/council - name = "\improper Council Chamber" - icon_state = "meeting" - sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR - -/area/station/command/corporate_showroom - name = "\improper Corporate Showroom" - icon_state = "showroom" - sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR - -/area/station/command/corporate_suite - name = "\improper Corporate Guest Suite" - icon_state = "command" - sound_environment = SOUND_AREA_WOODFLOOR - -/area/station/command/heads_quarters - icon_state = "heads_quarters" - -/area/station/command/heads_quarters/captain - name = "\improper Captain's Office" - icon_state = "captain" - sound_environment = SOUND_AREA_WOODFLOOR - -/area/station/command/heads_quarters/captain/private - name = "\improper Captain'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" - -/area/station/command/heads_quarters/cmo - name = "\improper Chief Medical Officer's Office" - icon_state = "cmo_office" - -/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" - icon_state = "hos_office" - -/area/station/command/heads_quarters/rd - name = "\improper Research Director's Office" - icon_state = "rd_office" - -/area/station/command/heads_quarters/qm - name = "\improper Quartermaster's Office" - icon_state = "qm_office" - -//Command - Teleporters - -/area/station/command/teleporter - name = "\improper Teleporter Room" - icon_state = "teleporter" - ambience_index = AMBIENCE_ENGI - -/area/station/command/gateway - name = "\improper Gateway" - icon_state = "gateway" - ambience_index = AMBIENCE_ENGI - -//Command - Bonus - -/area/station/command/corporate_dock - name = "\improper Corporate Private Dock" - icon_state = "command" - sound_environment = SOUND_AREA_SMALL_SOFTFLOOR - -//Commons - -/area/station/commons - name = "\improper Crew Facilities" - icon_state = "commons" - sound_environment = SOUND_AREA_STANDARD_STATION - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED - -/area/station/commons/dorms - name = "\improper Dormitories" - icon_state = "dorms" - -/area/station/commons/dorms/room1 - name = "\improper Dorms Room 1" - icon_state = "room1" - -/area/station/commons/dorms/room2 - name = "\improper Dorms Room 2" - icon_state = "room2" - -/area/station/commons/dorms/room3 - name = "\improper Dorms Room 3" - icon_state = "room3" - -/area/station/commons/dorms/room4 - name = "\improper Dorms Room 4" - icon_state = "room4" - -/area/station/commons/dorms/apartment1 - name = "\improper Dorms Apartment 1" - icon_state = "apartment1" - -/area/station/commons/dorms/apartment2 - name = "\improper Dorms Apartment 2" - icon_state = "apartment2" - -/area/station/commons/dorms/barracks - name = "\improper Sleep Barracks" - -/area/station/commons/dorms/barracks/male - name = "\improper Male Sleep Barracks" - icon_state = "dorms_male" - -/area/station/commons/dorms/barracks/female - name = "\improper Female Sleep Barracks" - icon_state = "dorms_female" - -/area/station/commons/dorms/laundry - name = "\improper Laundry Room" - icon_state = "laundry_room" - -/area/station/commons/toilet - name = "\improper Dormitory Toilets" - icon_state = "toilet" - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/commons/toilet/auxiliary - name = "\improper Auxiliary Restrooms" - icon_state = "toilet" - -/area/station/commons/toilet/locker - name = "\improper Locker Toilets" - icon_state = "toilet" - -/area/station/commons/toilet/restrooms - name = "\improper Restrooms" - icon_state = "toilet" - -/area/station/commons/locker - name = "\improper Locker Room" - icon_state = "locker" - -/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 - name = "\improper Fitness Room" - icon_state = "fitness" - -/area/station/commons/fitness/locker_room - name = "\improper Unisex Locker Room" - icon_state = "locker" - -/area/station/commons/fitness/locker_room/male - name = "\improper Male Locker Room" - icon_state = "locker_male" - -/area/station/commons/fitness/locker_room/female - name = "\improper Female Locker Room" - icon_state = "locker_female" - -/area/station/commons/fitness/recreation - name = "\improper Recreation Area" - icon_state = "rec" - -/area/station/commons/fitness/recreation/entertainment - name = "\improper Entertainment Center" - icon_state = "entertainment" - -// Commons - Vacant Rooms -/area/station/commons/vacant_room - name = "\improper Vacant Room" - icon_state = "vacant_room" - ambience_index = AMBIENCE_MAINT - -/area/station/commons/vacant_room/office - name = "\improper Vacant Office" - icon_state = "vacant_office" - -/area/station/commons/vacant_room/commissary - name = "\improper Vacant Commissary" - icon_state = "vacant_commissary" - -//Commons - Storage -/area/station/commons/storage - name = "\improper Commons Storage" - -/area/station/commons/storage/tools - name = "\improper Auxiliary Tool Storage" - icon_state = "tool_storage" - -/area/station/commons/storage/primary - name = "\improper Primary Tool Storage" - icon_state = "primary_storage" - -/area/station/commons/storage/art - name = "\improper Art Supply Storage" - icon_state = "art_storage" - -/area/station/commons/storage/emergency/starboard - name = "\improper Starboard Emergency Storage" - icon_state = "emergency_storage" - -/area/station/commons/storage/emergency/port - name = "\improper Port Emergency Storage" - icon_state = "emergency_storage" - -/area/station/commons/storage/mining - name = "\improper Public Mining Storage" - icon_state = "mining_storage" - -//Service - -/area/station/service - airlock_wires = /datum/wires/airlock/service - -/area/station/service/cafeteria - name = "\improper Cafeteria" - icon_state = "cafeteria" - -/area/station/service/barber - name = "\improper Barber" - icon_state = "barber" - -/area/station/service/kitchen - name = "\improper Kitchen" - icon_state = "kitchen" - -/area/station/service/kitchen/coldroom - name = "\improper Kitchen Cold Room" - icon_state = "kitchen_cold" - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/service/kitchen/diner - name = "\improper Diner" - icon_state = "diner" - -/area/station/service/kitchen/kitchen_backroom - name = "\improper Kitchen Backroom" - icon_state = "kitchen_backroom" - -/area/station/service/kitchen/abandoned - name = "\improper Abandoned Kitchen" - icon_state = "abandoned_kitchen" - -/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 - -/area/station/service/bar/Initialize(mapload) - . = ..() - GLOB.bar_areas += src - -/area/station/service/bar/atrium - name = "\improper Atrium" - icon_state = "bar" - sound_environment = SOUND_AREA_WOODFLOOR - -/area/station/service/bar/backroom - name = "\improper Bar Backroom" - icon_state = "bar_backroom" - -/area/station/service/electronic_marketing_den - name = "\improper Electronic Marketing Den" - icon_state = "abandoned_marketing_den" - -/area/station/service/abandoned_gambling_den - name = "\improper Abandoned Gambling Den" - icon_state = "abandoned_gambling_den" - -/area/station/service/abandoned_gambling_den/gaming - name = "\improper Abandoned Gaming Den" - icon_state = "abandoned_gaming_den" - -/area/station/service/theater - name = "\improper Theater" - icon_state = "theatre" - sound_environment = SOUND_AREA_WOODFLOOR - -/area/station/service/greenroom - name = "\improper Greenroom" - icon_state = "theatre" - sound_environment = SOUND_AREA_SMALL_SOFTFLOOR - -/area/station/service/theater/abandoned - name = "\improper Abandoned Theater" - icon_state = "abandoned_theatre" - -/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 - -/area/station/service/library/garden - name = "\improper Library Garden" - icon_state = "library_garden" - -/area/station/service/library/lounge - name = "\improper Library Lounge" - icon_state = "library_lounge" - sound_environment = SOUND_AREA_SMALL_SOFTFLOOR - -/area/station/service/library/artgallery - name = "\improper Art Gallery" - icon_state = "library_gallery" - -/area/station/service/library/private - name = "\improper Library Private Study" - icon_state = "library_gallery_private" - -/area/station/service/library/upper - name = "\improper Library Upper Floor" - icon_state = "library" - -/area/station/service/library/printer - name = "\improper Library Printer Room" - icon_state = "library" - -/area/station/service/library/abandoned - name = "\improper Abandoned Library" - icon_state = "abandoned_library" - -/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 - -/area/station/service/chapel/monastery - name = "\improper Monastery" - -/area/station/service/chapel/office - name = "\improper Chapel Office" - icon_state = "chapeloffice" - -/area/station/service/chapel/asteroid - name = "\improper Chapel Asteroid" - icon_state = "explored" - sound_environment = SOUND_AREA_ASTEROID - -/area/station/service/chapel/asteroid/monastery - name = "\improper Monastery Asteroid" - -/area/station/service/chapel/dock - name = "\improper Chapel Dock" - icon_state = "construction" - -/area/station/service/chapel/storage - name = "\improper Chapel Storage" - icon_state = "chapelstorage" - -/area/station/service/chapel/funeral - name = "\improper Chapel Funeral Room" - icon_state = "chapelfuneral" - -/area/station/service/lawoffice - name = "\improper Law Office" - icon_state = "law" - sound_environment = SOUND_AREA_SMALL_SOFTFLOOR - -/area/station/service/janitor - name = "\improper Custodial Closet" - icon_state = "janitor" - area_flags = CULT_PERMITTED | BLOBS_ALLOWED | UNIQUE_AREA - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/service/hydroponics - name = "Hydroponics" - icon_state = "hydro" - airlock_wires = /datum/wires/airlock/service - sound_environment = SOUND_AREA_STANDARD_STATION - -/area/station/service/hydroponics/upper - name = "Upper Hydroponics" - icon_state = "hydro" - -/area/station/service/hydroponics/garden - name = "Garden" - icon_state = "garden" - -/area/station/service/hydroponics/garden/abandoned - name = "\improper Abandoned Garden" - icon_state = "abandoned_garden" - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/service/hydroponics/garden/monastery - name = "\improper Monastery Garden" - icon_state = "hydro" - -//Engineering - -/area/station/engineering - icon_state = "engie" - ambience_index = AMBIENCE_ENGI - airlock_wires = /datum/wires/airlock/engineering - sound_environment = SOUND_AREA_LARGE_ENCLOSED - -/area/station/engineering/engine_smes - name = "\improper Engineering SMES" - icon_state = "engine_smes" - -/area/station/engineering/main - name = "Engineering" - icon_state = "engine" - -/area/station/engineering/hallway - name = "Engineering Hallway" - icon_state = "engine_hallway" - -/area/station/engineering/atmos - name = "Atmospherics" - icon_state = "atmos" - -/area/station/engineering/atmos/upper - name = "Upper Atmospherics" - -/area/station/engineering/atmos/project - name = "\improper Atmospherics Project Room" - icon_state = "atmos_projectroom" - -/area/station/engineering/atmos/pumproom - name = "\improper Atmospherics Pumping Room" - icon_state = "atmos_pump_room" - -/area/station/engineering/atmos/mix - name = "\improper Atmospherics Mixing Room" - icon_state = "atmos_mix" - -/area/station/engineering/atmos/storage - name = "\improper Atmospherics Storage Room" - icon_state = "atmos_storage" - -/area/station/engineering/atmos/storage/gas - name = "\improper Atmospherics Gas Storage" - icon_state = "atmos_storage_gas" - -/area/station/engineering/atmos/office - name = "\improper Atmospherics Office" - icon_state = "atmos_office" - -/area/station/engineering/atmos/hfr_room - name = "\improper Atmospherics HFR Room" - icon_state = "atmos_HFR" - -/area/station/engineering/atmospherics_engine - name = "\improper Atmospherics Engine" - icon_state = "atmos_engine" - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED - -/area/station/engineering/lobby - name = "\improper Engineering Lobby" - icon_state = "engi_lobby" - -/area/station/engineering/supermatter - name = "\improper Supermatter Engine" - icon_state = "engine_sm" - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/engineering/supermatter/room - name = "\improper Supermatter Engine Room" - icon_state = "engine_sm_room" - sound_environment = SOUND_AREA_LARGE_ENCLOSED - -/area/station/engineering/break_room - name = "\improper Engineering Foyer" - icon_state = "engine_break" - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/engineering/gravity_generator - name = "\improper Gravity Generator Room" - icon_state = "grav_gen" - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/engineering/storage - name = "Engineering Storage" - icon_state = "engine_storage" - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/engineering/storage_shared - name = "Shared Engineering Storage" - icon_state = "engine_storage_shared" - -/area/station/engineering/transit_tube - name = "\improper Transit Tube" - icon_state = "transit_tube" - -/area/station/engineering/storage/tech - name = "Technical Storage" - icon_state = "tech_storage" - -/area/station/engineering/storage/tcomms - name = "Telecomms Storage" - icon_state = "tcom_storage" - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED - -//Engineering - Construction - -/area/station/construction - name = "\improper Construction Area" - icon_state = "construction" - ambience_index = AMBIENCE_ENGI - sound_environment = SOUND_AREA_STANDARD_STATION - -/area/station/construction/mining/aux_base - name = "Auxiliary Base Construction" - icon_state = "aux_base_construction" - sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR - -/area/station/construction/storage_wing - name = "\improper Storage Wing" - icon_state = "storage_wing" - -//Solars - -/area/station/solars - icon_state = "panels" - requires_power = FALSE - area_flags = UNIQUE_AREA | AREA_USES_STARLIGHT - flags_1 = NONE - ambience_index = AMBIENCE_ENGI - airlock_wires = /datum/wires/airlock/engineering - sound_environment = SOUND_AREA_SPACE - -/area/station/solars/fore - name = "\improper Fore Solar Array" - icon_state = "panelsF" - sound_environment = SOUND_AREA_STANDARD_STATION - -/area/station/solars/aft - name = "\improper Aft Solar Array" - icon_state = "panelsAF" - -/area/station/solars/aux/port - name = "\improper Port Bow Auxiliary Solar Array" - icon_state = "panelsA" - -/area/station/solars/aux/starboard - name = "\improper Starboard Bow Auxiliary Solar Array" - icon_state = "panelsA" - -/area/station/solars/starboard - name = "\improper Starboard Solar Array" - icon_state = "panelsS" - -/area/station/solars/starboard/aft - name = "\improper Starboard Quarter Solar Array" - icon_state = "panelsAS" - -/area/station/solars/starboard/fore - name = "\improper Starboard Bow Solar Array" - icon_state = "panelsFS" - -/area/station/solars/port - name = "\improper Port Solar Array" - icon_state = "panelsP" - -/area/station/solars/port/aft - name = "\improper Port Quarter Solar Array" - icon_state = "panelsAP" - -/area/station/solars/port/fore - name = "\improper Port Bow Solar Array" - icon_state = "panelsFP" - -/area/station/solars/aisat - name = "\improper AI Satellite Solars" - icon_state = "panelsAI" - - -//Solar Maint - -/area/station/maintenance/solars - name = "Solar Maintenance" - icon_state = "yellow" - -/area/station/maintenance/solars/port - name = "Port Solar Maintenance" - icon_state = "SolarcontrolP" - -/area/station/maintenance/solars/port/aft - name = "Port Quarter Solar Maintenance" - icon_state = "SolarcontrolAP" - -/area/station/maintenance/solars/port/fore - name = "Port Bow Solar Maintenance" - icon_state = "SolarcontrolFP" - -/area/station/maintenance/solars/starboard - name = "Starboard Solar Maintenance" - icon_state = "SolarcontrolS" - -/area/station/maintenance/solars/starboard/aft - name = "Starboard Quarter Solar Maintenance" - icon_state = "SolarcontrolAS" - -/area/station/maintenance/solars/starboard/fore - name = "Starboard Bow Solar Maintenance" - icon_state = "SolarcontrolFS" - -//MedBay - -/area/station/medical - name = "Medical" - icon_state = "medbay" - ambience_index = AMBIENCE_MEDICAL - airlock_wires = /datum/wires/airlock/medbay - sound_environment = SOUND_AREA_STANDARD_STATION - min_ambience_cooldown = 90 SECONDS - max_ambience_cooldown = 180 SECONDS - -/area/station/medical/abandoned - name = "\improper Abandoned Medbay" - icon_state = "abandoned_medbay" - ambientsounds = list('sound/ambience/signal.ogg') - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/medical/medbay/central - name = "Medbay Central" - icon_state = "med_central" - -/area/station/medical/medbay/lobby - name = "\improper Medbay Lobby" - icon_state = "med_lobby" - -//Medbay is a large area, these additional areas help level out APC load. - -/area/station/medical/medbay/aft - name = "Medbay Aft" - icon_state = "med_aft" - -/area/station/medical/storage - name = "Medbay Storage" - icon_state = "med_storage" - -/area/station/medical/paramedic - name = "Paramedic Dispatch" - icon_state = "paramedic" - -/area/station/medical/office - name = "\improper Medical Office" - icon_state = "med_office" - -/area/station/medical/break_room - name = "\improper Medical Break Room" - icon_state = "med_break" - -/area/station/medical/coldroom - name = "\improper Medical Cold Room" - icon_state = "kitchen_cold" - -/area/station/medical/patients_rooms - name = "\improper Patients' Rooms" - icon_state = "patients" - sound_environment = SOUND_AREA_SMALL_SOFTFLOOR - -/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/virology - name = "Virology" - icon_state = "virology" - ambience_index = AMBIENCE_VIROLOGY - -/area/station/medical/virology/isolation - name = "Virology Isolation" - icon_state = "virology_isolation" - -/area/station/medical/morgue - name = "\improper Morgue" - icon_state = "morgue" - ambience_index = AMBIENCE_SPOOKY - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/medical/chemistry - name = "Chemistry" - icon_state = "chem" - -/area/station/medical/pharmacy - name = "\improper Pharmacy" - icon_state = "pharmacy" - -/area/station/medical/surgery - name = "\improper Operating Room" - icon_state = "surgery" - -/area/station/medical/surgery/fore - name = "\improper Fore Operating Room" - icon_state = "foresurgery" - -/area/station/medical/surgery/aft - name = "\improper Aft Operating Room" - icon_state = "aftsurgery" - -/area/station/medical/surgery/theatre - name = "\improper Grand Surgery Theatre" - icon_state = "surgerytheatre" -/area/station/medical/cryo - name = "Cryogenics" - icon_state = "cryo" - -/area/station/medical/exam_room - name = "\improper Exam Room" - icon_state = "exam_room" - -/area/station/medical/treatment_center - name = "\improper Medbay Treatment Center" - icon_state = "exam_room" - -/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" - icon_state = "security" - ambience_index = AMBIENCE_DANGER - airlock_wires = /datum/wires/airlock/security - sound_environment = SOUND_AREA_STANDARD_STATION - -/area/station/security/office - name = "\improper Security Office" - icon_state = "security" - -/area/station/security/breakroom - name = "\improper Security Break Room" - icon_state = "brig" - -/area/station/security/tram - name = "\improper Security Transfer Tram" - icon_state = "security" - -/area/station/security/lockers - name = "\improper Security Locker Room" - icon_state = "securitylockerroom" - -/area/station/security/brig - name = "\improper Brig" - icon_state = "brig" - -/area/station/security/holding_cell - name = "\improper Holding Cell" - icon_state = "holding_cell" - -/area/station/security/medical - name = "\improper Security Medical" - icon_state = "security_medical" - -/area/station/security/brig/upper - name = "\improper Brig Overlook" - icon_state = "upperbrig" - -/area/station/security/brig/entrance - name = "\improper Brig Entrance" - icon_state = "brigentry" - -/area/station/security/courtroom - name = "\improper Courtroom" - icon_state = "courtroom" - sound_environment = SOUND_AREA_LARGE_ENCLOSED - -/area/station/security/courtroom/holding - name = "\improper Courtroom Prisoner Holding Room" - -/area/station/security/prison - name = "\improper Prison Wing" - icon_state = "sec_prison" - area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED | PERSISTENT_ENGRAVINGS - -//Rad proof -/area/station/security/prison/toilet - name = "\improper Prison Toilet" - icon_state = "sec_prison_safe" - -// Rad proof -/area/station/security/prison/safe - name = "\improper Prison Wing Cells" - icon_state = "sec_prison_safe" - -/area/station/security/prison/upper - name = "\improper Upper Prison Wing" - icon_state = "prison_upper" - -/area/station/security/prison/visit - name = "\improper Prison Visitation Area" - icon_state = "prison_visit" - -/area/station/security/prison/rec - name = "\improper Prison Rec Room" - icon_state = "prison_rec" - -/area/station/security/prison/mess - name = "\improper Prison Mess Hall" - icon_state = "prison_mess" - -/area/station/security/prison/work - name = "\improper Prison Work Room" - icon_state = "prison_work" - -/area/station/security/prison/shower - name = "\improper Prison Shower" - icon_state = "prison_shower" - -/area/station/security/prison/workout - name = "\improper Prison Gym" - icon_state = "prison_workout" - -/area/station/security/prison/garden - name = "\improper Prison Garden" - icon_state = "prison_garden" - -/area/station/security/processing - name = "\improper Labor Shuttle Dock" - icon_state = "sec_labor_processing" - -/area/station/security/processing/cremation - name = "\improper Security Crematorium" - icon_state = "sec_cremation" - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/security/interrogation - name = "\improper Interrogation Room" - icon_state = "interrogation" - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/security/warden - name = "Brig Control" - icon_state = "warden" - sound_environment = SOUND_AREA_SMALL_SOFTFLOOR - -/area/station/security/evidence - name = "Evidence Storage" - icon_state = "evidence" - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/security/detectives_office - name = "\improper Detective's Office" - icon_state = "detective" - ambientsounds = list('sound/ambience/ambidet1.ogg','sound/ambience/ambidet2.ogg') - -/area/station/security/detectives_office/private_investigators_office - name = "\improper Private Investigator's Office" - icon_state = "investigate_office" - sound_environment = SOUND_AREA_SMALL_SOFTFLOOR - -/area/station/security/range - name = "\improper Firing Range" - icon_state = "firingrange" - -/area/station/security/eva - name = "\improper Security EVA" - icon_state = "sec_eva" - -/area/station/security/execution - icon_state = "execution_room" - -/area/station/security/execution/transfer - name = "\improper Transfer Centre" - icon_state = "sec_processing" - -/area/station/security/execution/education - name = "\improper Prisoner Education Chamber" - -/area/station/security/checkpoint - name = "\improper Security Checkpoint" - icon_state = "checkpoint" - -/area/station/security/checkpoint/escape - name = "\improper Departures Security Checkpoint" - icon_state = "checkpoint_esc" - -/area/station/security/checkpoint/arrivals - name = "\improper Arrivals Security Checkpoint" - icon_state = "checkpoint_arr" - -/area/station/security/checkpoint/supply - name = "Security Post - Cargo Bay" - icon_state = "checkpoint_supp" - -/area/station/security/checkpoint/engineering - name = "Security Post - Engineering" - icon_state = "checkpoint_engi" - -/area/station/security/checkpoint/medical - name = "Security Post - Medbay" - icon_state = "checkpoint_med" - -/area/station/security/checkpoint/medical/medsci - name = "Security Post - Medsci" - -/area/station/security/checkpoint/science - name = "Security Post - Science" - icon_state = "checkpoint_sci" - -/area/station/security/checkpoint/science/research - name = "Security Post - Research Division" - icon_state = "checkpoint_res" - -/area/station/security/checkpoint/customs - name = "Customs" - icon_state = "customs_point" - -/area/station/security/checkpoint/customs/auxiliary - name = "Auxiliary Customs" - icon_state = "customs_point_aux" - -/area/station/security/checkpoint/customs/fore - name = "Fore Customs" - icon_state = "customs_point_fore" - -/area/station/security/checkpoint/customs/aft - name = "Aft Customs" - icon_state = "customs_point_aft" - -/area/station/security/checkpoint/first - name = "Security Post - First Floor" - icon_state = "checkpoint_1" - -/area/station/security/checkpoint/second - name = "Security Post - Second Floor" - icon_state = "checkpoint_2" - -/area/station/security/checkpoint/third - name = "Security Post - Third Floor" - icon_state = "checkpoint_3" -//Cargo - -/area/station/cargo - name = "Quartermasters" - icon_state = "quart" - airlock_wires = /datum/wires/airlock/service - sound_environment = SOUND_AREA_STANDARD_STATION - -/area/station/cargo/sorting - name = "\improper Delivery Office" - icon_state = "cargo_delivery" - -/area/station/cargo/warehouse - name = "\improper Warehouse" - icon_state = "cargo_warehouse" - sound_environment = SOUND_AREA_LARGE_ENCLOSED - -/area/station/cargo/drone_bay - name = "\improper Drone Bay" - icon_state = "cargo_drone" - -/area/station/cargo/boutique - name = "\improper Boutique" - icon_state = "cargo_delivery" - sound_environment = SOUND_AREA_WOODFLOOR - -/area/station/cargo/warehouse/upper - name = "\improper Upper Warehouse" - -/area/station/cargo/office - name = "\improper Cargo Office" - icon_state = "cargo_office" - -/area/station/cargo/storage - name = "\improper Cargo Bay" - icon_state = "cargo_bay" - sound_environment = SOUND_AREA_LARGE_ENCLOSED - -/area/station/cargo/lobby - name = "\improper Cargo Lobby" - icon_state = "cargo_lobby" - -/area/station/cargo/miningdock - name = "\improper Mining Dock" - icon_state = "mining_dock" - -/area/station/cargo/miningdock/cafeteria - name = "\improper Mining Cafeteria" - icon_state = "mining_cafe" - -/area/station/cargo/miningdock/oresilo - name = "\improper Mining Ore Silo Storage" - icon_state = "mining_silo" - -/area/station/cargo/miningoffice - name = "\improper Mining Office" - icon_state = "mining" - -//Science - -/area/station/science - name = "\improper Science Division" - icon_state = "science" - airlock_wires = /datum/wires/airlock/science - sound_environment = SOUND_AREA_STANDARD_STATION - -/area/station/science/lobby - name = "\improper Science Lobby" - icon_state = "science_lobby" - -/area/station/science/lower - name = "\improper Lower Science Division" - icon_state = "lower_science" - -/area/station/science/breakroom - name = "\improper Science Break Room" - icon_state = "science_breakroom" - -/area/station/science/lab - name = "Research and Development" - icon_state = "research" - -/area/station/science/xenobiology - name = "\improper Xenobiology Lab" - icon_state = "xenobio" - -/area/station/science/xenobiology/hallway - name = "\improper Xenobiology Hallway" - icon_state = "xenobio_hall" - -/area/station/science/cytology - name = "\improper Cytology Lab" - icon_state = "cytology" - -/area/station/science/cubicle - name = "\improper Science Cubicles" - icon_state = "science" - sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR - -// Use this for the main lab. If test equipment, storage, etc is also present use this one too. -/area/station/science/ordnance - name = "\improper Ordnance Lab" - icon_state = "ord_main" - -/area/station/science/ordnance/office - name = "\improper Ordnance Office" - icon_state = "ord_office" - -/area/station/science/ordnance/storage - name = "\improper Ordnance Storage" - icon_state = "ord_storage" - -/area/station/science/ordnance/burnchamber - name = "\improper Ordnance Burn Chamber" - icon_state = "ord_burn" - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED - -/area/station/science/ordnance/freezerchamber - name = "\improper Ordnance Freezer Chamber" - icon_state = "ord_freeze" - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED - -// Room for equipments and such -/area/station/science/ordnance/testlab - name = "\improper Ordnance Testing Lab" - icon_state = "ord_test" - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED - -/area/station/science/ordnance/bomb - name = "\improper Ordnance Bomb Site" - icon_state = "ord_boom" - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED - -/area/station/science/genetics - name = "\improper Genetics Lab" - icon_state = "geneticssci" - -/area/station/science/server - name = "\improper Research Division Server Room" - icon_state = "server" - -/area/station/science/circuits - name = "\improper Circuit Lab" - icon_state = "cir_lab" - -/area/station/science/explab - name = "\improper Experimentation Lab" - icon_state = "exp_lab" - -// Useless room -/area/station/science/auxlab - name = "\improper Auxiliary Lab" - icon_state = "aux_lab" - -/area/station/science/auxlab/firing_range - name = "\improper Research Firing Range" - -/area/station/science/robotics - name = "Robotics" - icon_state = "robotics" - -/area/station/science/robotics/mechbay - name = "\improper Mech Bay" - icon_state = "mechbay" - -/area/station/science/robotics/lab - name = "\improper Robotics Lab" - icon_state = "ass_line" - -/area/station/science/robotics/augments - name = "improper Augmentation Theater" - icon_state = "robotics" - sound_environment = SOUND_AREA_TUNNEL_ENCLOSED - -/area/station/science/research - name = "\improper Research Division" - icon_state = "science" - -/area/station/science/research/abandoned - name = "\improper Abandoned Research Lab" - icon_state = "abandoned_sci" - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/escapepodbay - name = "\improper Pod Bay" - icon_state = "podbay" - -/area/station/asteroid - name = "\improper Station Asteroid" - icon_state = "station_asteroid" - always_unpowered = TRUE - power_environ = FALSE - power_equip = FALSE - power_light = FALSE - requires_power = TRUE - ambience_index = AMBIENCE_MINING - area_flags = UNIQUE_AREA - -// Telecommunications Satellite - -/area/station/tcommsat - icon_state = "tcomsatcham" - ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen9.ogg', 'sound/ambience/ambitech.ogg',\ - 'sound/ambience/ambitech2.ogg', 'sound/ambience/ambitech3.ogg', 'sound/ambience/ambimystery.ogg') - airlock_wires = /datum/wires/airlock/engineering - -/area/station/tcommsat/computer - name = "\improper Telecomms Control Room" - icon_state = "tcomsatcomp" - sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR - -/area/station/tcommsat/server - name = "\improper Telecomms Server Room" - icon_state = "tcomsatcham" - -/area/station/tcommsat/server/upper - name = "\improper Upper Telecomms Server Room" - -//Telecommunications - On Station - -/area/station/comms - name = "\improper Communications Relay" - icon_state = "tcomsatcham" - sound_environment = SOUND_AREA_STANDARD_STATION - -/area/station/server - name = "\improper Messaging Server Room" - icon_state = "server" - sound_environment = SOUND_AREA_STANDARD_STATION - -//External Hull Access -/area/station/maintenance/external - name = "\improper External Hull Access" - icon_state = "amaint" - -/area/station/maintenance/external/aft - name = "\improper Aft External Hull Access" - -/area/station/maintenance/external/port - name = "\improper Port External Hull Access" - -/area/station/maintenance/external/port/bow - name = "\improper Port Bow External Hull Access" - -//Tramstation - External -/area/misc/asteroid - name = "\improper Asteroid" - icon = 'icons/area/areas_station.dmi' - icon_state = "asteroid" - has_gravity = STANDARD_GRAVITY - sound_environment = SOUND_AREA_ASTEROID - ambient_buzz = 'sound/ambience/ambiatmos.ogg' - outdoors = TRUE - always_unpowered = TRUE - power_environ = FALSE - power_equip = FALSE - power_light = FALSE - requires_power = TRUE - ambience_index = AMBIENCE_MINING - -//North Star Specific Areas -//1 -/area/station/hallway/floor1 - name = "\improper First Floor Hallway" - -/area/station/hallway/floor1/aft - name = "\improper First Floor Aft Hallway" - icon_state = "1_aft" - -/area/station/hallway/floor1/fore - name = "\improper First Floor Fore Hallway" - icon_state = "1_fore" -//2 -/area/station/hallway/floor2 - name = "\improper Second Floor Hallway" - -/area/station/hallway/floor2/aft - name = "\improper Second Floor Aft Hallway" - icon_state = "2_aft" - -/area/station/hallway/floor2/fore - name = "\improper Second Floor Fore Hallway" - icon_state = "2_fore" -//3 -/area/station/hallway/floor3 - name = "\improper Third Floor Hallway" - -/area/station/hallway/floor3/aft - name = "\improper Third Floor Aft Hallway" - icon_state = "3_aft" - -/area/station/hallway/floor3/fore - name = "\improper Third Floor Fore Hallway" - icon_state = "3_fore" -//4 -/area/station/hallway/floor4 - name = "\improper Fourth Floor Hallway" - -/area/station/hallway/floor4/aft - name = "\improper Fourth Floor Aft Hallway" - icon_state = "4_aft" - -/area/station/hallway/floor4/fore - name = "\improper Fourth Floor Fore Hallway" - icon_state = "4_fore" - -//North Star Maintenance -//1 -/area/station/maintenance/floor1 - name = "\improper 1st Floor Maint" - -/area/station/maintenance/floor1/port - name = "\improper 1st Floor Central Port Maint" - icon_state = "maintcentral" - -/area/station/maintenance/floor1/port/fore - name = "\improper 1st Floor Fore Port Maint" - icon_state = "maintfore" -/area/station/maintenance/floor1/port/aft - name = "\improper 1st Floor Aft Port Maint" - icon_state = "maintaft" - -/area/station/maintenance/floor1/starboard - name = "\improper 1st Floor Central Starboard Maint" - icon_state = "maintcentral" - -/area/station/maintenance/floor1/starboard/fore - name = "\improper 1st Floor Fore Starboard Maint" - icon_state = "maintfore" - -/area/station/maintenance/floor1/starboard/aft - name = "\improper 1st Floor Aft Starboard Maint" - icon_state = "maintaft" -//2 -/area/station/maintenance/floor2 - name = "\improper 2nd Floor Maint" -/area/station/maintenance/floor2/port - name = "\improper 2nd Floor Central Port Maint" - icon_state = "maintcentral" - -/area/station/maintenance/floor2/port/fore - name = "\improper 2nd Floor Fore Port Maint" - icon_state = "maintfore" - -/area/station/maintenance/floor2/port/aft - name = "\improper 2nd Floor Aft Port Maint" - icon_state = "maintaft" - -/area/station/maintenance/floor2/starboard - name = "\improper 2nd Floor Central Starboard Maint" - icon_state = "maintcentral" - -/area/station/maintenance/floor2/starboard/fore - name = "\improper 2nd Floor Fore Starboard Maint" - icon_state = "maintfore" - -/area/station/maintenance/floor2/starboard/aft - name = "\improper 2nd Floor Aft Starboard Maint" - icon_state = "maintaft" -//3 -/area/station/maintenance/floor3 - name = "\improper 3rd Floor Maint" - -/area/station/maintenance/floor3/port - name = "\improper 3rd Floor Central Port Maint" - icon_state = "maintcentral" - -/area/station/maintenance/floor3/port/fore - name = "\improper 3rd Floor Fore Port Maint" - icon_state = "maintfore" - -/area/station/maintenance/floor3/port/aft - name = "\improper 3rd Floor Aft Port Maint" - icon_state = "maintaft" - -/area/station/maintenance/floor3/starboard - name = "\improper 3rd Floor Central Starboard Maint" - icon_state = "maintcentral" - -/area/station/maintenance/floor3/starboard/fore - name = "\improper 3rd Floor Fore Starboard Maint" - icon_state = "maintfore" - -/area/station/maintenance/floor3/starboard/aft - name = "\improper 3rd Floor Aft Starboard Maint" - icon_state = "maintaft" -//4 -/area/station/maintenance/floor4 - name = "\improper 4th Floor Maint" - -/area/station/maintenance/floor4/port - name = "\improper 4th Floor Central Port Maint" - icon_state = "maintcentral" - -/area/station/maintenance/floor4/port/fore - name = "\improper 4th Floor Fore Port Maint" - icon_state = "maintfore" - -/area/station/maintenance/floor4/port/aft - name = "\improper 4th Floor Aft Port Maint" - icon_state = "maintaft" - -/area/station/maintenance/floor4/starboard - name = "\improper 4th Floor Central Starboard Maint" - icon_state = "maintcentral" - -/area/station/maintenance/floor4/starboard/fore - name = "\improper 4th Floor Fore Starboard Maint" - icon_state = "maintfore" - -/area/station/maintenance/floor4/starboard/aft - name = "\improper 4th Floor Aft Starboard Maint" - icon_state = "maintaft" diff --git a/code/game/area/areas/station/cargo.dm b/code/game/area/areas/station/cargo.dm new file mode 100644 index 0000000000000..8bb5229320d5b --- /dev/null +++ b/code/game/area/areas/station/cargo.dm @@ -0,0 +1,55 @@ +/area/station/cargo + name = "Quartermasters" + icon_state = "quart" + airlock_wires = /datum/wires/airlock/service + sound_environment = SOUND_AREA_STANDARD_STATION + +/area/station/cargo/sorting + name = "\improper Delivery Office" + icon_state = "cargo_delivery" + +/area/station/cargo/warehouse + name = "\improper Warehouse" + icon_state = "cargo_warehouse" + sound_environment = SOUND_AREA_LARGE_ENCLOSED + +/area/station/cargo/drone_bay + name = "\improper Drone Bay" + icon_state = "cargo_drone" + +/area/station/cargo/boutique + name = "\improper Boutique" + icon_state = "cargo_delivery" + sound_environment = SOUND_AREA_WOODFLOOR + +/area/station/cargo/warehouse/upper + name = "\improper Upper Warehouse" + +/area/station/cargo/office + name = "\improper Cargo Office" + icon_state = "cargo_office" + +/area/station/cargo/storage + name = "\improper Cargo Bay" + icon_state = "cargo_bay" + sound_environment = SOUND_AREA_LARGE_ENCLOSED + +/area/station/cargo/lobby + name = "\improper Cargo Lobby" + icon_state = "cargo_lobby" + +/area/station/cargo/miningdock + name = "\improper Mining Dock" + icon_state = "mining_dock" + +/area/station/cargo/miningdock/cafeteria + name = "\improper Mining Cafeteria" + icon_state = "mining_cafe" + +/area/station/cargo/miningdock/oresilo + name = "\improper Mining Ore Silo Storage" + icon_state = "mining_silo" + +/area/station/cargo/miningoffice + name = "\improper Mining Office" + icon_state = "mining" diff --git a/code/game/area/areas/station/command.dm b/code/game/area/areas/station/command.dm new file mode 100644 index 0000000000000..a1a521e77a898 --- /dev/null +++ b/code/game/area/areas/station/command.dm @@ -0,0 +1,96 @@ +/area/station/command + name = "Command" + icon_state = "command" + ambientsounds = list( + 'sound/ambience/signal.ogg', + ) + airlock_wires = /datum/wires/airlock/command + sound_environment = SOUND_AREA_STANDARD_STATION + +/area/station/command/bridge + name = "\improper Bridge" + icon_state = "bridge" + +/area/station/command/meeting_room + name = "\improper Heads of Staff Meeting Room" + icon_state = "meeting" + sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR + +/area/station/command/meeting_room/council + name = "\improper Council Chamber" + icon_state = "meeting" + sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR + +/area/station/command/corporate_showroom + name = "\improper Corporate Showroom" + icon_state = "showroom" + sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR + +/area/station/command/corporate_suite + name = "\improper Corporate Guest Suite" + icon_state = "command" + sound_environment = SOUND_AREA_WOODFLOOR + +/* +* Command Head Areas +*/ + +/area/station/command/heads_quarters + icon_state = "heads_quarters" + +/area/station/command/heads_quarters/captain + name = "\improper Captain's Office" + icon_state = "captain" + sound_environment = SOUND_AREA_WOODFLOOR + +/area/station/command/heads_quarters/captain/private + name = "\improper Captain'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" + +/area/station/command/heads_quarters/cmo + name = "\improper Chief Medical Officer's Office" + icon_state = "cmo_office" + +/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" + icon_state = "hos_office" + +/area/station/command/heads_quarters/rd + name = "\improper Research Director's Office" + icon_state = "rd_office" + +/area/station/command/heads_quarters/qm + name = "\improper Quartermaster's Office" + icon_state = "qm_office" + +/* +* Command - Teleporter +*/ + +/area/station/command/teleporter + name = "\improper Teleporter Room" + icon_state = "teleporter" + ambience_index = AMBIENCE_ENGI + +/area/station/command/gateway + name = "\improper Gateway" + icon_state = "gateway" + ambience_index = AMBIENCE_ENGI + +/* +* Command - Misc +*/ + +/area/station/command/corporate_dock + name = "\improper Corporate Private Dock" + icon_state = "command" + sound_environment = SOUND_AREA_SMALL_SOFTFLOOR diff --git a/code/game/area/areas/station/common.dm b/code/game/area/areas/station/common.dm new file mode 100644 index 0000000000000..eb8a0380ddc4a --- /dev/null +++ b/code/game/area/areas/station/common.dm @@ -0,0 +1,157 @@ +/area/station/commons + name = "\improper Crew Facilities" + icon_state = "commons" + sound_environment = SOUND_AREA_STANDARD_STATION + area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED + +/* +* Dorm Areas +*/ + +/area/station/commons/dorms + name = "\improper Dormitories" + icon_state = "dorms" + +/area/station/commons/dorms/room1 + name = "\improper Dorms Room 1" + icon_state = "room1" + +/area/station/commons/dorms/room2 + name = "\improper Dorms Room 2" + icon_state = "room2" + +/area/station/commons/dorms/room3 + name = "\improper Dorms Room 3" + icon_state = "room3" + +/area/station/commons/dorms/room4 + name = "\improper Dorms Room 4" + icon_state = "room4" + +/area/station/commons/dorms/apartment1 + name = "\improper Dorms Apartment 1" + icon_state = "apartment1" + +/area/station/commons/dorms/apartment2 + name = "\improper Dorms Apartment 2" + icon_state = "apartment2" + +/area/station/commons/dorms/barracks + name = "\improper Sleep Barracks" + +/area/station/commons/dorms/barracks/male + name = "\improper Male Sleep Barracks" + icon_state = "dorms_male" + +/area/station/commons/dorms/barracks/female + name = "\improper Female Sleep Barracks" + icon_state = "dorms_female" + +/area/station/commons/dorms/laundry + name = "\improper Laundry Room" + icon_state = "laundry_room" + +/area/station/commons/toilet + name = "\improper Dormitory Toilets" + icon_state = "toilet" + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/commons/toilet/auxiliary + name = "\improper Auxiliary Restrooms" + icon_state = "toilet" + +/area/station/commons/toilet/locker + name = "\improper Locker Toilets" + icon_state = "toilet" + +/area/station/commons/toilet/restrooms + name = "\improper Restrooms" + icon_state = "toilet" + +/* +* Rec and Locker Rooms +*/ + +/area/station/commons/locker + name = "\improper Locker Room" + icon_state = "locker" + +/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 + name = "\improper Fitness Room" + icon_state = "fitness" + +/area/station/commons/fitness/locker_room + name = "\improper Unisex Locker Room" + icon_state = "locker" + +/area/station/commons/fitness/locker_room/male + name = "\improper Male Locker Room" + icon_state = "locker_male" + +/area/station/commons/fitness/locker_room/female + name = "\improper Female Locker Room" + icon_state = "locker_female" + +/area/station/commons/fitness/recreation + name = "\improper Recreation Area" + icon_state = "rec" + +/area/station/commons/fitness/recreation/entertainment + name = "\improper Entertainment Center" + icon_state = "entertainment" + +/* +* Vacant Rooms +*/ + +/area/station/commons/vacant_room + name = "\improper Vacant Room" + icon_state = "vacant_room" + ambience_index = AMBIENCE_MAINT + +/area/station/commons/vacant_room/office + name = "\improper Vacant Office" + icon_state = "vacant_office" + +/area/station/commons/vacant_room/commissary + name = "\improper Vacant Commissary" + icon_state = "vacant_commissary" + +/* +* Storage Rooms +*/ + +/area/station/commons/storage + name = "\improper Commons Storage" + +/area/station/commons/storage/tools + name = "\improper Auxiliary Tool Storage" + icon_state = "tool_storage" + +/area/station/commons/storage/primary + name = "\improper Primary Tool Storage" + icon_state = "primary_storage" + +/area/station/commons/storage/art + name = "\improper Art Supply Storage" + icon_state = "art_storage" + +/area/station/commons/storage/emergency/starboard + name = "\improper Starboard Emergency Storage" + icon_state = "emergency_storage" + +/area/station/commons/storage/emergency/port + name = "\improper Port Emergency Storage" + icon_state = "emergency_storage" + +/area/station/commons/storage/mining + name = "\improper Public Mining Storage" + icon_state = "mining_storage" diff --git a/code/game/area/areas/station/engineering.dm b/code/game/area/areas/station/engineering.dm new file mode 100644 index 0000000000000..a7ce535cc5d30 --- /dev/null +++ b/code/game/area/areas/station/engineering.dm @@ -0,0 +1,127 @@ +/area/station/engineering + icon_state = "engie" + ambience_index = AMBIENCE_ENGI + airlock_wires = /datum/wires/airlock/engineering + sound_environment = SOUND_AREA_LARGE_ENCLOSED + +/area/station/engineering/engine_smes + name = "\improper Engineering SMES" + icon_state = "engine_smes" + +/area/station/engineering/main + name = "Engineering" + icon_state = "engine" + +/area/station/engineering/hallway + name = "Engineering Hallway" + icon_state = "engine_hallway" + +/area/station/engineering/atmos + name = "Atmospherics" + icon_state = "atmos" + +/area/station/engineering/atmos/upper + name = "Upper Atmospherics" + +/area/station/engineering/atmos/project + name = "\improper Atmospherics Project Room" + icon_state = "atmos_projectroom" + +/area/station/engineering/atmos/pumproom + name = "\improper Atmospherics Pumping Room" + icon_state = "atmos_pump_room" + +/area/station/engineering/atmos/mix + name = "\improper Atmospherics Mixing Room" + icon_state = "atmos_mix" + +/area/station/engineering/atmos/storage + name = "\improper Atmospherics Storage Room" + icon_state = "atmos_storage" + +/area/station/engineering/atmos/storage/gas + name = "\improper Atmospherics Gas Storage" + icon_state = "atmos_storage_gas" + +/area/station/engineering/atmos/office + name = "\improper Atmospherics Office" + icon_state = "atmos_office" + +/area/station/engineering/atmos/hfr_room + name = "\improper Atmospherics HFR Room" + icon_state = "atmos_HFR" + +/area/station/engineering/atmospherics_engine + name = "\improper Atmospherics Engine" + icon_state = "atmos_engine" + area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED + +/area/station/engineering/lobby + name = "\improper Engineering Lobby" + icon_state = "engi_lobby" + +/area/station/engineering/supermatter + name = "\improper Supermatter Engine" + icon_state = "engine_sm" + area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/engineering/supermatter/waste + name = "\improper Supermatter Waste Chamber" + icon_state = "engine_sm_waste" + +/area/station/engineering/supermatter/room + name = "\improper Supermatter Engine Room" + icon_state = "engine_sm_room" + sound_environment = SOUND_AREA_LARGE_ENCLOSED + +/area/station/engineering/break_room + name = "\improper Engineering Foyer" + icon_state = "engine_break" + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/engineering/gravity_generator + name = "\improper Gravity Generator Room" + icon_state = "grav_gen" + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/engineering/storage + name = "Engineering Storage" + icon_state = "engine_storage" + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/engineering/storage_shared + name = "Shared Engineering Storage" + icon_state = "engine_storage_shared" + +/area/station/engineering/transit_tube + name = "\improper Transit Tube" + icon_state = "transit_tube" + +/area/station/engineering/storage/tech + name = "Technical Storage" + icon_state = "tech_storage" + +/area/station/engineering/storage/tcomms + name = "Telecomms Storage" + icon_state = "tcom_storage" + area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED + +/* +* Construction Areas +*/ + +/area/station/construction + name = "\improper Construction Area" + icon_state = "construction" + ambience_index = AMBIENCE_ENGI + sound_environment = SOUND_AREA_STANDARD_STATION + +/area/station/construction/mining/aux_base + name = "Auxiliary Base Construction" + icon_state = "aux_base_construction" + sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR + +/area/station/construction/storage_wing + name = "\improper Storage Wing" + icon_state = "storage_wing" diff --git a/code/game/area/areas/station/hallway.dm b/code/game/area/areas/station/hallway.dm new file mode 100644 index 0000000000000..9512f20c709c1 --- /dev/null +++ b/code/game/area/areas/station/hallway.dm @@ -0,0 +1,154 @@ +/area/station/hallway + icon_state = "hall" + sound_environment = SOUND_AREA_STANDARD_STATION + +/area/station/hallway/primary + name = "\improper Primary Hallway" + icon_state = "primaryhall" + +/area/station/hallway/primary/aft + name = "\improper Aft Primary Hallway" + icon_state = "afthall" + +/area/station/hallway/primary/fore + name = "\improper Fore Primary Hallway" + icon_state = "forehall" + +/area/station/hallway/primary/starboard + name = "\improper Starboard Primary Hallway" + icon_state = "starboardhall" + +/area/station/hallway/primary/port + name = "\improper Port Primary Hallway" + icon_state = "porthall" + +/area/station/hallway/primary/central + name = "\improper Central Primary Hallway" + icon_state = "centralhall" + +/area/station/hallway/primary/central/fore + name = "\improper Fore Central Primary Hallway" + icon_state = "hallCF" + +/area/station/hallway/primary/central/aft + name = "\improper Aft Central Primary Hallway" + icon_state = "hallCA" + +/area/station/hallway/primary/upper + name = "\improper Upper Central Primary Hallway" + icon_state = "centralhall" + +/area/station/hallway/primary/tram + name = "\improper Primary Tram" + +/area/station/hallway/primary/tram/left + name = "\improper Port Tram Dock" + icon_state = "halltramL" + +/area/station/hallway/primary/tram/center + name = "\improper Central Tram Dock" + icon_state = "halltramM" + +/area/station/hallway/primary/tram/right + name = "\improper Starboard Tram Dock" + icon_state = "halltramR" + +// This shouldn't be used, but it gives an icon for the enviornment tree in the map editor +/area/station/hallway/secondary + icon_state = "secondaryhall" + +/area/station/hallway/secondary/command + name = "\improper Command Hallway" + icon_state = "bridge_hallway" + +/area/station/hallway/secondary/construction + name = "\improper Construction Area" + icon_state = "construction" + +/area/station/hallway/secondary/construction/engineering + name = "\improper Engineering Hallway" + +/area/station/hallway/secondary/exit + name = "\improper Escape Shuttle Hallway" + icon_state = "escape" + +/area/station/hallway/secondary/exit/escape_pod + name = "\improper Escape Pod Bay" + icon_state = "escape_pods" + +/area/station/hallway/secondary/exit/departure_lounge + name = "\improper Departure Lounge" + icon_state = "escape_lounge" + +/area/station/hallway/secondary/entry + name = "\improper Arrival Shuttle Hallway" + icon_state = "entry" + area_flags = UNIQUE_AREA | EVENT_PROTECTED + +/area/station/hallway/secondary/dock + name = "\improper Secondary Station Dock Hallway" + icon_state = "hall" + +/area/station/hallway/secondary/service + name = "\improper Service Hallway" + icon_state = "hall_service" + +/area/station/hallway/secondary/spacebridge + name = "\improper Space Bridge" + icon_state = "hall" + +/area/station/hallway/secondary/recreation + name = "\improper Recreation Hallway" + icon_state = "hall" + +/* +* Station Specific Areas +* If another station gets added, and you make specific areas for it +* Please make its own section in this file +* The areas below belong to North Star's Hallways +*/ + +//1 +/area/station/hallway/floor1 + name = "\improper First Floor Hallway" + +/area/station/hallway/floor1/aft + name = "\improper First Floor Aft Hallway" + icon_state = "1_aft" + +/area/station/hallway/floor1/fore + name = "\improper First Floor Fore Hallway" + icon_state = "1_fore" +//2 +/area/station/hallway/floor2 + name = "\improper Second Floor Hallway" + +/area/station/hallway/floor2/aft + name = "\improper Second Floor Aft Hallway" + icon_state = "2_aft" + +/area/station/hallway/floor2/fore + name = "\improper Second Floor Fore Hallway" + icon_state = "2_fore" +//3 +/area/station/hallway/floor3 + name = "\improper Third Floor Hallway" + +/area/station/hallway/floor3/aft + name = "\improper Third Floor Aft Hallway" + icon_state = "3_aft" + +/area/station/hallway/floor3/fore + name = "\improper Third Floor Fore Hallway" + icon_state = "3_fore" +//4 +/area/station/hallway/floor4 + name = "\improper Fourth Floor Hallway" + +/area/station/hallway/floor4/aft + name = "\improper Fourth Floor Aft Hallway" + icon_state = "4_aft" + +/area/station/hallway/floor4/fore + name = "\improper Fourth Floor Fore Hallway" + icon_state = "4_fore" diff --git a/code/game/area/areas/station/maintenance.dm b/code/game/area/areas/station/maintenance.dm new file mode 100644 index 0000000000000..53e6da606d085 --- /dev/null +++ b/code/game/area/areas/station/maintenance.dm @@ -0,0 +1,411 @@ +/area/station/maintenance + name = "Generic Maintenance" + ambience_index = AMBIENCE_MAINT + area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED | PERSISTENT_ENGRAVINGS + airlock_wires = /datum/wires/airlock/maint + sound_environment = SOUND_AREA_TUNNEL_ENCLOSED + forced_ambience = TRUE + ambient_buzz = 'sound/ambience/source_corridor2.ogg' + ambient_buzz_vol = 20 + +/* +* Departmental Maintenance +*/ + +/area/station/maintenance/department/chapel + name = "Chapel Maintenance" + icon_state = "maint_chapel" + +/area/station/maintenance/department/chapel/monastery + name = "Monastery Maintenance" + icon_state = "maint_monastery" + +/area/station/maintenance/department/crew_quarters/bar + name = "Bar Maintenance" + icon_state = "maint_bar" + sound_environment = SOUND_AREA_WOODFLOOR + +/area/station/maintenance/department/crew_quarters/dorms + name = "Dormitory Maintenance" + icon_state = "maint_dorms" + +/area/station/maintenance/department/eva + name = "EVA Maintenance" + icon_state = "maint_eva" + +/area/station/maintenance/department/eva/abandoned + name = "Abandoned EVA Storage" + +/area/station/maintenance/department/electrical + name = "Electrical Maintenance" + icon_state = "maint_electrical" + +/area/station/maintenance/department/engine/atmos + name = "Atmospherics Maintenance" + icon_state = "maint_atmos" + +/area/station/maintenance/department/security + name = "Security Maintenance" + icon_state = "maint_sec" + +/area/station/maintenance/department/security/upper + name = "Upper Security Maintenance" + +/area/station/maintenance/department/security/brig + name = "Brig Maintenance" + icon_state = "maint_brig" + +/area/station/maintenance/department/medical + name = "Medbay Maintenance" + icon_state = "medbay_maint" + +/area/station/maintenance/department/medical/central + name = "Central Medbay Maintenance" + icon_state = "medbay_maint_central" + +/area/station/maintenance/department/medical/morgue + name = "Morgue Maintenance" + icon_state = "morgue_maint" + +/area/station/maintenance/department/science + name = "Science Maintenance" + icon_state = "maint_sci" + +/area/station/maintenance/department/science/central + name = "Central Science Maintenance" + icon_state = "maint_sci_central" + +/area/station/maintenance/department/cargo + name = "Cargo Maintenance" + icon_state = "maint_cargo" + +/area/station/maintenance/department/bridge + name = "Bridge Maintenance" + icon_state = "maint_bridge" + +/area/station/maintenance/department/engine + name = "Engineering Maintenance" + icon_state = "maint_engi" + +/area/station/maintenance/department/prison + name = "Prison Maintenance" + icon_state = "sec_prison" + +/area/station/maintenance/department/science/xenobiology + name = "Xenobiology Maintenance" + icon_state = "xenomaint" + area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA | XENOBIOLOGY_COMPATIBLE | CULT_PERMITTED + +/* +* Generic Maintenance Tunnels +*/ + +/area/station/maintenance/aft + name = "Aft Maintenance" + icon_state = "aftmaint" + +/area/station/maintenance/aft/upper + name = "Upper Aft Maintenance" + icon_state = "upperaftmaint" + +/* Use greater variants of area definitions for when the station has two different sections of maintenance on the same z-level. +* Can stand alone without "lesser". +* This one means that this goes more fore/north than the "lesser" maintenance area. +*/ +/area/station/maintenance/aft/greater + name = "Greater Aft Maintenance" + icon_state = "greateraftmaint" + +/* Use lesser variants of area definitions for when the station has two different sections of maintenance on the same z-level in conjunction with "greater". +* (just because it follows better). +* This one means that this goes more aft/south than the "greater" maintenance area. +*/ + +/area/station/maintenance/aft/lesser + name = "Lesser Aft Maintenance" + icon_state = "lesseraftmaint" + +/area/station/maintenance/central + name = "Central Maintenance" + icon_state = "centralmaint" + +/area/station/maintenance/central/greater + name = "Greater Central Maintenance" + icon_state = "greatercentralmaint" + +/area/station/maintenance/central/lesser + name = "Lesser Central Maintenance" + icon_state = "lessercentralmaint" + +/area/station/maintenance/fore + name = "Fore Maintenance" + icon_state = "foremaint" + +/area/station/maintenance/fore/upper + name = "Upper Fore Maintenance" + icon_state = "upperforemaint" + +/area/station/maintenance/fore/greater + name = "Greater Fore Maintenance" + icon_state = "greaterforemaint" + +/area/station/maintenance/fore/lesser + name = "Lesser Fore Maintenance" + icon_state = "lesserforemaint" + +/area/station/maintenance/starboard + name = "Starboard Maintenance" + icon_state = "starboardmaint" + +/area/station/maintenance/starboard/upper + name = "Upper Starboard Maintenance" + icon_state = "upperstarboardmaint" + +/area/station/maintenance/starboard/central + name = "Central Starboard Maintenance" + icon_state = "centralstarboardmaint" + +/area/station/maintenance/starboard/greater + name = "Greater Starboard Maintenance" + icon_state = "greaterstarboardmaint" + +/area/station/maintenance/starboard/lesser + name = "Lesser Starboard Maintenance" + icon_state = "lesserstarboardmaint" + +/area/station/maintenance/starboard/aft + name = "Aft Starboard Maintenance" + icon_state = "asmaint" + +/area/station/maintenance/starboard/fore + name = "Fore Starboard Maintenance" + icon_state = "fsmaint" + +/area/station/maintenance/port + name = "Port Maintenance" + icon_state = "portmaint" + +/area/station/maintenance/port/central + name = "Central Port Maintenance" + icon_state = "centralportmaint" + +/area/station/maintenance/port/greater + name = "Greater Port Maintenance" + icon_state = "greaterportmaint" + +/area/station/maintenance/port/lesser + name = "Lesser Port Maintenance" + icon_state = "lesserportmaint" + +/area/station/maintenance/port/aft + name = "Aft Port Maintenance" + icon_state = "apmaint" + +/area/station/maintenance/port/fore + name = "Fore Port Maintenance" + icon_state = "fpmaint" + +/area/station/maintenance/tram + name = "Primary Tram Maintenance" + +/area/station/maintenance/tram/left + name = "\improper Port Tram Underpass" + icon_state = "mainttramL" + +/area/station/maintenance/tram/mid + name = "\improper Central Tram Underpass" + icon_state = "mainttramM" + +/area/station/maintenance/tram/right + name = "\improper Starboard Tram Underpass" + icon_state = "mainttramR" + +/* +* Discrete Maintenance Areas +*/ + +/area/station/maintenance/disposal + name = "Waste Disposal" + icon_state = "disposal" + +/area/station/maintenance/hallway/abandoned_command + name = "\improper Abandoned Command Hallway" + icon_state = "maint_bridge" + +/area/station/maintenance/hallway/abandoned_recreation + name = "\improper Abandoned Recreation Hallway" + icon_state = "maint_dorms" + +/area/station/maintenance/disposal/incinerator + name = "\improper Incinerator" + icon_state = "incinerator" + +/area/station/maintenance/space_hut + name = "\improper Space Hut" + icon_state = "spacehut" + +/area/station/maintenance/space_hut/cabin + name = "Abandoned Cabin" + +/area/station/maintenance/space_hut/plasmaman + name = "\improper Abandoned Plasmaman Friendly Startup" + +/area/station/maintenance/space_hut/observatory + name = "\improper Space Observatory" + +/* +* Radation Storm Shelters +*/ + +/area/station/maintenance/radshelter + name = "\improper Radstorm Shelter" + icon_state = "radstorm_shelter" + +/area/station/maintenance/radshelter/medical + name = "\improper Medical Radstorm Shelter" + +/area/station/maintenance/radshelter/sec + name = "\improper Security Radstorm Shelter" + +/area/station/maintenance/radshelter/service + name = "\improper Service Radstorm Shelter" + +/area/station/maintenance/radshelter/civil + name = "\improper Civilian Radstorm Shelter" + +/area/station/maintenance/radshelter/sci + name = "\improper Science Radstorm Shelter" + +/area/station/maintenance/radshelter/cargo + name = "\improper Cargo Radstorm Shelter" + +/* +* External Hull Access Areas +*/ + +/area/station/maintenance/external + name = "\improper External Hull Access" + icon_state = "amaint" + +/area/station/maintenance/external/aft + name = "\improper Aft External Hull Access" + +/area/station/maintenance/external/port + name = "\improper Port External Hull Access" + +/area/station/maintenance/external/port/bow + name = "\improper Port Bow External Hull Access" + +/* +* Station Specific Areas +* If another station gets added, and you make specific areas for it +* Please make its own section in this file +* The areas below belong to North Star's Maintenance +*/ + +//1 +/area/station/maintenance/floor1 + name = "\improper 1st Floor Maint" + +/area/station/maintenance/floor1/port + name = "\improper 1st Floor Central Port Maint" + icon_state = "maintcentral" + +/area/station/maintenance/floor1/port/fore + name = "\improper 1st Floor Fore Port Maint" + icon_state = "maintfore" +/area/station/maintenance/floor1/port/aft + name = "\improper 1st Floor Aft Port Maint" + icon_state = "maintaft" + +/area/station/maintenance/floor1/starboard + name = "\improper 1st Floor Central Starboard Maint" + icon_state = "maintcentral" + +/area/station/maintenance/floor1/starboard/fore + name = "\improper 1st Floor Fore Starboard Maint" + icon_state = "maintfore" + +/area/station/maintenance/floor1/starboard/aft + name = "\improper 1st Floor Aft Starboard Maint" + icon_state = "maintaft" +//2 +/area/station/maintenance/floor2 + name = "\improper 2nd Floor Maint" +/area/station/maintenance/floor2/port + name = "\improper 2nd Floor Central Port Maint" + icon_state = "maintcentral" + +/area/station/maintenance/floor2/port/fore + name = "\improper 2nd Floor Fore Port Maint" + icon_state = "maintfore" + +/area/station/maintenance/floor2/port/aft + name = "\improper 2nd Floor Aft Port Maint" + icon_state = "maintaft" + +/area/station/maintenance/floor2/starboard + name = "\improper 2nd Floor Central Starboard Maint" + icon_state = "maintcentral" + +/area/station/maintenance/floor2/starboard/fore + name = "\improper 2nd Floor Fore Starboard Maint" + icon_state = "maintfore" + +/area/station/maintenance/floor2/starboard/aft + name = "\improper 2nd Floor Aft Starboard Maint" + icon_state = "maintaft" +//3 +/area/station/maintenance/floor3 + name = "\improper 3rd Floor Maint" + +/area/station/maintenance/floor3/port + name = "\improper 3rd Floor Central Port Maint" + icon_state = "maintcentral" + +/area/station/maintenance/floor3/port/fore + name = "\improper 3rd Floor Fore Port Maint" + icon_state = "maintfore" + +/area/station/maintenance/floor3/port/aft + name = "\improper 3rd Floor Aft Port Maint" + icon_state = "maintaft" + +/area/station/maintenance/floor3/starboard + name = "\improper 3rd Floor Central Starboard Maint" + icon_state = "maintcentral" + +/area/station/maintenance/floor3/starboard/fore + name = "\improper 3rd Floor Fore Starboard Maint" + icon_state = "maintfore" + +/area/station/maintenance/floor3/starboard/aft + name = "\improper 3rd Floor Aft Starboard Maint" + icon_state = "maintaft" +//4 +/area/station/maintenance/floor4 + name = "\improper 4th Floor Maint" + +/area/station/maintenance/floor4/port + name = "\improper 4th Floor Central Port Maint" + icon_state = "maintcentral" + +/area/station/maintenance/floor4/port/fore + name = "\improper 4th Floor Fore Port Maint" + icon_state = "maintfore" + +/area/station/maintenance/floor4/port/aft + name = "\improper 4th Floor Aft Port Maint" + icon_state = "maintaft" + +/area/station/maintenance/floor4/starboard + name = "\improper 4th Floor Central Starboard Maint" + icon_state = "maintcentral" + +/area/station/maintenance/floor4/starboard/fore + name = "\improper 4th Floor Fore Starboard Maint" + icon_state = "maintfore" + +/area/station/maintenance/floor4/starboard/aft + name = "\improper 4th Floor Aft Starboard Maint" + icon_state = "maintaft" diff --git a/code/game/area/areas/station/medical.dm b/code/game/area/areas/station/medical.dm new file mode 100644 index 0000000000000..33d4973f62390 --- /dev/null +++ b/code/game/area/areas/station/medical.dm @@ -0,0 +1,125 @@ +/area/station/medical + name = "Medical" + icon_state = "medbay" + ambience_index = AMBIENCE_MEDICAL + airlock_wires = /datum/wires/airlock/medbay + sound_environment = SOUND_AREA_STANDARD_STATION + min_ambience_cooldown = 90 SECONDS + max_ambience_cooldown = 180 SECONDS + +/area/station/medical/abandoned + name = "\improper Abandoned Medbay" + icon_state = "abandoned_medbay" + ambientsounds = list( + 'sound/ambience/signal.ogg', + ) + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/medical/medbay/central + name = "Medbay Central" + icon_state = "med_central" + +/area/station/medical/medbay/lobby + name = "\improper Medbay Lobby" + icon_state = "med_lobby" + +/area/station/medical/medbay/aft + name = "Medbay Aft" + icon_state = "med_aft" + +/area/station/medical/storage + name = "Medbay Storage" + icon_state = "med_storage" + +/area/station/medical/paramedic + name = "Paramedic Dispatch" + icon_state = "paramedic" + +/area/station/medical/office + name = "\improper Medical Office" + icon_state = "med_office" + +/area/station/medical/break_room + name = "\improper Medical Break Room" + icon_state = "med_break" + +/area/station/medical/coldroom + name = "\improper Medical Cold Room" + icon_state = "kitchen_cold" + +/area/station/medical/patients_rooms + name = "\improper Patients' Rooms" + icon_state = "patients" + sound_environment = SOUND_AREA_SMALL_SOFTFLOOR + +/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/virology + name = "Virology" + icon_state = "virology" + ambience_index = AMBIENCE_VIROLOGY + +/area/station/medical/virology/isolation + name = "Virology Isolation" + icon_state = "virology_isolation" + +/area/station/medical/morgue + name = "\improper Morgue" + icon_state = "morgue" + ambience_index = AMBIENCE_SPOOKY + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/medical/chemistry + name = "Chemistry" + icon_state = "chem" + +/area/station/medical/pharmacy + name = "\improper Pharmacy" + icon_state = "pharmacy" + +/area/station/medical/chem_storage + name = "\improper Chemical Storage" + icon_state = "chem_storage" + +/area/station/medical/surgery + name = "\improper Operating Room" + icon_state = "surgery" + +/area/station/medical/surgery/fore + name = "\improper Fore Operating Room" + icon_state = "foresurgery" + +/area/station/medical/surgery/aft + name = "\improper Aft Operating Room" + icon_state = "aftsurgery" + +/area/station/medical/surgery/theatre + name = "\improper Grand Surgery Theatre" + icon_state = "surgerytheatre" + +/area/station/medical/cryo + name = "Cryogenics" + icon_state = "cryo" + +/area/station/medical/exam_room + name = "\improper Exam Room" + icon_state = "exam_room" + +/area/station/medical/treatment_center + name = "\improper Medbay Treatment Center" + icon_state = "exam_room" + +/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', + ) diff --git a/code/game/area/areas/station/misc.dm b/code/game/area/areas/station/misc.dm new file mode 100644 index 0000000000000..48d5793b5223e --- /dev/null +++ b/code/game/area/areas/station/misc.dm @@ -0,0 +1,33 @@ +/* +* Only put an area here if it wouldn't fit sorting criteria +* If more areas are created of an area in this file, please +* make a new file for it! +*/ + +/* +* This is the ROOT for all station areas +* It keeps the work tree in SDMM nice and pretty :) +*/ +/area/station + name = "Station Areas" + icon = 'icons/area/areas_station.dmi' + icon_state = "station" + +/* +* Tramstation unique areas +*/ + +/area/station/escapepodbay + name = "\improper Pod Bay" + icon_state = "podbay" + +/area/station/asteroid + name = "\improper Station Asteroid" + icon_state = "station_asteroid" + always_unpowered = TRUE + power_environ = FALSE + power_equip = FALSE + power_light = FALSE + requires_power = TRUE + ambience_index = AMBIENCE_MINING + area_flags = UNIQUE_AREA diff --git a/code/game/area/areas/station/science.dm b/code/game/area/areas/station/science.dm new file mode 100644 index 0000000000000..f63798aca62da --- /dev/null +++ b/code/game/area/areas/station/science.dm @@ -0,0 +1,125 @@ +/area/station/science + name = "\improper Science Division" + icon_state = "science" + airlock_wires = /datum/wires/airlock/science + sound_environment = SOUND_AREA_STANDARD_STATION + +/area/station/science/lobby + name = "\improper Science Lobby" + icon_state = "science_lobby" + +/area/station/science/lower + name = "\improper Lower Science Division" + icon_state = "lower_science" + +/area/station/science/breakroom + name = "\improper Science Break Room" + icon_state = "science_breakroom" + +/area/station/science/lab + name = "Research and Development" + icon_state = "research" + +/area/station/science/xenobiology + name = "\improper Xenobiology Lab" + icon_state = "xenobio" + +/area/station/science/xenobiology/hallway + name = "\improper Xenobiology Hallway" + icon_state = "xenobio_hall" + +/area/station/science/cytology + name = "\improper Cytology Lab" + icon_state = "cytology" + +/area/station/science/cubicle + name = "\improper Science Cubicles" + icon_state = "science" + sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR + +/area/station/science/genetics + name = "\improper Genetics Lab" + icon_state = "geneticssci" + +/area/station/science/server + name = "\improper Research Division Server Room" + icon_state = "server" + +/area/station/science/circuits + name = "\improper Circuit Lab" + icon_state = "cir_lab" + +/area/station/science/explab + name = "\improper Experimentation Lab" + icon_state = "exp_lab" + +/area/station/science/auxlab + name = "\improper Auxiliary Lab" + icon_state = "aux_lab" + +/area/station/science/auxlab/firing_range + name = "\improper Research Firing Range" + +/area/station/science/robotics + name = "Robotics" + icon_state = "robotics" + +/area/station/science/robotics/mechbay + name = "\improper Mech Bay" + icon_state = "mechbay" + +/area/station/science/robotics/lab + name = "\improper Robotics Lab" + icon_state = "ass_line" + +/area/station/science/robotics/augments + name = "\improper Augmentation Theater" + icon_state = "robotics" + sound_environment = SOUND_AREA_TUNNEL_ENCLOSED + +/area/station/science/research + name = "\improper Research Division" + icon_state = "science" + +/area/station/science/research/abandoned + name = "\improper Abandoned Research Lab" + icon_state = "abandoned_sci" + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/* +* Ordnance Areas +*/ + +// Use this for the main lab. If test equipment, storage, etc is also present use this one too. +/area/station/science/ordnance + name = "\improper Ordnance Lab" + icon_state = "ord_main" + +/area/station/science/ordnance/office + name = "\improper Ordnance Office" + icon_state = "ord_office" + +/area/station/science/ordnance/storage + name = "\improper Ordnance Storage" + icon_state = "ord_storage" + +/area/station/science/ordnance/burnchamber + name = "\improper Ordnance Burn Chamber" + icon_state = "ord_burn" + area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED + +/area/station/science/ordnance/freezerchamber + name = "\improper Ordnance Freezer Chamber" + icon_state = "ord_freeze" + area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED + +// Room for equipments and such +/area/station/science/ordnance/testlab + name = "\improper Ordnance Testing Lab" + icon_state = "ord_test" + area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED + +/area/station/science/ordnance/bomb + name = "\improper Ordnance Bomb Site" + icon_state = "ord_boom" + area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED diff --git a/code/game/area/areas/station/security.dm b/code/game/area/areas/station/security.dm new file mode 100644 index 0000000000000..918cf30ceb8ca --- /dev/null +++ b/code/game/area/areas/station/security.dm @@ -0,0 +1,225 @@ +// 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" + icon_state = "security" + ambience_index = AMBIENCE_DANGER + airlock_wires = /datum/wires/airlock/security + sound_environment = SOUND_AREA_STANDARD_STATION + +/area/station/security/office + name = "\improper Security Office" + icon_state = "security" + +/area/station/security/breakroom + name = "\improper Security Break Room" + icon_state = "brig" + +/area/station/security/tram + name = "\improper Security Transfer Tram" + icon_state = "security" + +/area/station/security/lockers + name = "\improper Security Locker Room" + icon_state = "securitylockerroom" + +/area/station/security/brig + name = "\improper Brig" + icon_state = "brig" + +/area/station/security/holding_cell + name = "\improper Holding Cell" + icon_state = "holding_cell" + +/area/station/security/medical + name = "\improper Security Medical" + icon_state = "security_medical" + +/area/station/security/brig/upper + name = "\improper Brig Overlook" + icon_state = "upperbrig" + +/area/station/security/brig/entrance + name = "\improper Brig Entrance" + icon_state = "brigentry" + +/area/station/security/courtroom + name = "\improper Courtroom" + icon_state = "courtroom" + sound_environment = SOUND_AREA_LARGE_ENCLOSED + +/area/station/security/courtroom/holding + name = "\improper Courtroom Prisoner Holding Room" + +/area/station/security/processing + name = "\improper Labor Shuttle Dock" + icon_state = "sec_labor_processing" + +/area/station/security/processing/cremation + name = "\improper Security Crematorium" + icon_state = "sec_cremation" + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/security/interrogation + name = "\improper Interrogation Room" + icon_state = "interrogation" + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/security/warden + name = "Brig Control" + icon_state = "warden" + sound_environment = SOUND_AREA_SMALL_SOFTFLOOR + +/area/station/security/evidence + name = "Evidence Storage" + icon_state = "evidence" + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/security/detectives_office + name = "\improper Detective's Office" + icon_state = "detective" + ambientsounds = list( + 'sound/ambience/ambidet1.ogg', + 'sound/ambience/ambidet2.ogg', + ) + +/area/station/security/detectives_office/private_investigators_office + name = "\improper Private Investigator's Office" + icon_state = "investigate_office" + sound_environment = SOUND_AREA_SMALL_SOFTFLOOR + +/area/station/security/range + name = "\improper Firing Range" + icon_state = "firingrange" + +/area/station/security/eva + name = "\improper Security EVA" + icon_state = "sec_eva" + +/area/station/security/execution + icon_state = "execution_room" + +/area/station/security/execution/transfer + name = "\improper Transfer Centre" + icon_state = "sec_processing" + +/area/station/security/execution/education + name = "\improper Prisoner Education Chamber" + +/* +* Security Checkpoints +*/ + +/area/station/security/checkpoint + name = "\improper Security Checkpoint" + icon_state = "checkpoint" + +/area/station/security/checkpoint/escape + name = "\improper Departures Security Checkpoint" + icon_state = "checkpoint_esc" + +/area/station/security/checkpoint/arrivals + name = "\improper Arrivals Security Checkpoint" + icon_state = "checkpoint_arr" + +/area/station/security/checkpoint/supply + name = "Security Post - Cargo Bay" + icon_state = "checkpoint_supp" + +/area/station/security/checkpoint/engineering + name = "Security Post - Engineering" + icon_state = "checkpoint_engi" + +/area/station/security/checkpoint/medical + name = "Security Post - Medbay" + icon_state = "checkpoint_med" + +/area/station/security/checkpoint/medical/medsci + name = "Security Post - Medsci" + +/area/station/security/checkpoint/science + name = "Security Post - Science" + icon_state = "checkpoint_sci" + +/area/station/security/checkpoint/science/research + name = "Security Post - Research Division" + icon_state = "checkpoint_res" + +/area/station/security/checkpoint/customs + name = "Customs" + icon_state = "customs_point" + +/area/station/security/checkpoint/customs/auxiliary + name = "Auxiliary Customs" + icon_state = "customs_point_aux" + +/area/station/security/checkpoint/customs/fore + name = "Fore Customs" + icon_state = "customs_point_fore" + +/area/station/security/checkpoint/customs/aft + name = "Aft Customs" + icon_state = "customs_point_aft" + +/area/station/security/checkpoint/first + name = "Security Post - First Floor" + icon_state = "checkpoint_1" + +/area/station/security/checkpoint/second + name = "Security Post - Second Floor" + icon_state = "checkpoint_2" + +/area/station/security/checkpoint/third + name = "Security Post - Third Floor" + icon_state = "checkpoint_3" + +/* +* Prison Areas +*/ + +/area/station/security/prison + name = "\improper Prison Wing" + icon_state = "sec_prison" + area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED | PERSISTENT_ENGRAVINGS + +//Rad proof +/area/station/security/prison/toilet + name = "\improper Prison Toilet" + icon_state = "sec_prison_safe" + +// Rad proof +/area/station/security/prison/safe + name = "\improper Prison Wing Cells" + icon_state = "sec_prison_safe" + +/area/station/security/prison/upper + name = "\improper Upper Prison Wing" + icon_state = "prison_upper" + +/area/station/security/prison/visit + name = "\improper Prison Visitation Area" + icon_state = "prison_visit" + +/area/station/security/prison/rec + name = "\improper Prison Rec Room" + icon_state = "prison_rec" + +/area/station/security/prison/mess + name = "\improper Prison Mess Hall" + icon_state = "prison_mess" + +/area/station/security/prison/work + name = "\improper Prison Work Room" + icon_state = "prison_work" + +/area/station/security/prison/shower + name = "\improper Prison Shower" + icon_state = "prison_shower" + +/area/station/security/prison/workout + name = "\improper Prison Gym" + icon_state = "prison_workout" + +/area/station/security/prison/garden + name = "\improper Prison Garden" + icon_state = "prison_garden" diff --git a/code/game/area/areas/station/service.dm b/code/game/area/areas/station/service.dm new file mode 100644 index 0000000000000..6d3054f934f31 --- /dev/null +++ b/code/game/area/areas/station/service.dm @@ -0,0 +1,212 @@ +/area/station/service + airlock_wires = /datum/wires/airlock/service + +/* +* Bar/Kitchen Areas +*/ + +/area/station/service/cafeteria + name = "\improper Cafeteria" + icon_state = "cafeteria" + +/area/station/service/kitchen + name = "\improper Kitchen" + icon_state = "kitchen" + +/area/station/service/kitchen/coldroom + name = "\improper Kitchen Cold Room" + icon_state = "kitchen_cold" + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/service/kitchen/diner + name = "\improper Diner" + icon_state = "diner" + +/area/station/service/kitchen/kitchen_backroom + name = "\improper Kitchen Backroom" + icon_state = "kitchen_backroom" + +/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 + +/area/station/service/bar/Initialize(mapload) + . = ..() + GLOB.bar_areas += src + +/area/station/service/bar/atrium + name = "\improper Atrium" + icon_state = "bar" + sound_environment = SOUND_AREA_WOODFLOOR + +/area/station/service/bar/backroom + name = "\improper Bar Backroom" + icon_state = "bar_backroom" + +/* +* Entertainment/Library Areas +*/ + +/area/station/service/theater + name = "\improper Theater" + icon_state = "theatre" + sound_environment = SOUND_AREA_WOODFLOOR + +/area/station/service/greenroom + name = "\improper Greenroom" + icon_state = "theatre" + sound_environment = SOUND_AREA_SMALL_SOFTFLOOR + +/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 + +/area/station/service/library/garden + name = "\improper Library Garden" + icon_state = "library_garden" + +/area/station/service/library/lounge + name = "\improper Library Lounge" + icon_state = "library_lounge" + sound_environment = SOUND_AREA_SMALL_SOFTFLOOR + +/area/station/service/library/artgallery + name = "\improper Art Gallery" + icon_state = "library_gallery" + +/area/station/service/library/private + name = "\improper Library Private Study" + icon_state = "library_gallery_private" + +/area/station/service/library/upper + name = "\improper Library Upper Floor" + icon_state = "library" + +/area/station/service/library/printer + name = "\improper Library Printer Room" + icon_state = "library" + +/* +* Chapel/Pubby Monestary Areas +*/ + +/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 + +/area/station/service/chapel/monastery + name = "\improper Monastery" + +/area/station/service/chapel/office + name = "\improper Chapel Office" + icon_state = "chapeloffice" + +/area/station/service/chapel/asteroid + name = "\improper Chapel Asteroid" + icon_state = "explored" + sound_environment = SOUND_AREA_ASTEROID + +/area/station/service/chapel/asteroid/monastery + name = "\improper Monastery Asteroid" + +/area/station/service/chapel/dock + name = "\improper Chapel Dock" + icon_state = "construction" + +/area/station/service/chapel/storage + name = "\improper Chapel Storage" + icon_state = "chapelstorage" + +/area/station/service/chapel/funeral + name = "\improper Chapel Funeral Room" + icon_state = "chapelfuneral" + +/area/station/service/hydroponics/garden/monastery + name = "\improper Monastery Garden" + icon_state = "hydro" + +/* +* Hydroponics/Garden Areas +*/ + +/area/station/service/hydroponics + name = "Hydroponics" + icon_state = "hydro" + airlock_wires = /datum/wires/airlock/service + sound_environment = SOUND_AREA_STANDARD_STATION + +/area/station/service/hydroponics/upper + name = "Upper Hydroponics" + icon_state = "hydro" + +/area/station/service/hydroponics/garden + name = "Garden" + icon_state = "garden" + +/* +* Misc/Unsorted Rooms +*/ + +/area/station/service/lawoffice + name = "\improper Law Office" + icon_state = "law" + sound_environment = SOUND_AREA_SMALL_SOFTFLOOR + +/area/station/service/janitor + name = "\improper Custodial Closet" + icon_state = "janitor" + area_flags = CULT_PERMITTED | BLOBS_ALLOWED | UNIQUE_AREA + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/service/barber + name = "\improper Barber" + icon_state = "barber" + +/* +* Abandoned Rooms +*/ + +/area/station/service/hydroponics/garden/abandoned + name = "\improper Abandoned Garden" + icon_state = "abandoned_garden" + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/service/kitchen/abandoned + name = "\improper Abandoned Kitchen" + icon_state = "abandoned_kitchen" + +/area/station/service/electronic_marketing_den + name = "\improper Electronic Marketing Den" + icon_state = "abandoned_marketing_den" + +/area/station/service/abandoned_gambling_den + name = "\improper Abandoned Gambling Den" + icon_state = "abandoned_gambling_den" + +/area/station/service/abandoned_gambling_den/gaming + name = "\improper Abandoned Gaming Den" + icon_state = "abandoned_gaming_den" + +/area/station/service/theater/abandoned + name = "\improper Abandoned Theater" + icon_state = "abandoned_theatre" + +/area/station/service/library/abandoned + name = "\improper Abandoned Library" + icon_state = "abandoned_library" diff --git a/code/game/area/areas/station/solars.dm b/code/game/area/areas/station/solars.dm new file mode 100644 index 0000000000000..234e020e8d418 --- /dev/null +++ b/code/game/area/areas/station/solars.dm @@ -0,0 +1,92 @@ +/* +* External Solar Areas +*/ + +/area/station/solars + icon_state = "panels" + requires_power = FALSE + area_flags = UNIQUE_AREA | AREA_USES_STARLIGHT + flags_1 = NONE + ambience_index = AMBIENCE_ENGI + airlock_wires = /datum/wires/airlock/engineering + sound_environment = SOUND_AREA_SPACE + +/area/station/solars/fore + name = "\improper Fore Solar Array" + icon_state = "panelsF" + sound_environment = SOUND_AREA_STANDARD_STATION + +/area/station/solars/aft + name = "\improper Aft Solar Array" + icon_state = "panelsAF" + +/area/station/solars/aux/port + name = "\improper Port Bow Auxiliary Solar Array" + icon_state = "panelsA" + +/area/station/solars/aux/starboard + name = "\improper Starboard Bow Auxiliary Solar Array" + icon_state = "panelsA" + +/area/station/solars/starboard + name = "\improper Starboard Solar Array" + icon_state = "panelsS" + +/area/station/solars/starboard/aft + name = "\improper Starboard Quarter Solar Array" + icon_state = "panelsAS" + +/area/station/solars/starboard/fore + name = "\improper Starboard Bow Solar Array" + icon_state = "panelsFS" + +/area/station/solars/port + name = "\improper Port Solar Array" + icon_state = "panelsP" + +/area/station/solars/port/aft + name = "\improper Port Quarter Solar Array" + icon_state = "panelsAP" + +/area/station/solars/port/fore + name = "\improper Port Bow Solar Array" + icon_state = "panelsFP" + +/area/station/solars/aisat + name = "\improper AI Satellite Solars" + icon_state = "panelsAI" + + +/* +* Internal Solar Areas +* The rooms where the SMES and computer are +* Not in the maintenance file just so we can keep these organized with other the external solar areas +*/ + +/area/station/maintenance/solars + name = "Solar Maintenance" + icon_state = "yellow" + +/area/station/maintenance/solars/port + name = "Port Solar Maintenance" + icon_state = "SolarcontrolP" + +/area/station/maintenance/solars/port/aft + name = "Port Quarter Solar Maintenance" + icon_state = "SolarcontrolAP" + +/area/station/maintenance/solars/port/fore + name = "Port Bow Solar Maintenance" + icon_state = "SolarcontrolFP" + +/area/station/maintenance/solars/starboard + name = "Starboard Solar Maintenance" + icon_state = "SolarcontrolS" + +/area/station/maintenance/solars/starboard/aft + name = "Starboard Quarter Solar Maintenance" + icon_state = "SolarcontrolAS" + +/area/station/maintenance/solars/starboard/fore + name = "Starboard Bow Solar Maintenance" + icon_state = "SolarcontrolFS" diff --git a/code/game/area/areas/station/telecomm.dm b/code/game/area/areas/station/telecomm.dm new file mode 100644 index 0000000000000..78ec16a59bf29 --- /dev/null +++ b/code/game/area/areas/station/telecomm.dm @@ -0,0 +1,43 @@ +/* +* Telecommunications Satellite Areas +*/ + +/area/station/tcommsat + icon_state = "tcomsatcham" + ambientsounds = list( + 'sound/ambience/ambisin2.ogg', + 'sound/ambience/signal.ogg', + 'sound/ambience/signal.ogg', + 'sound/ambience/ambigen9.ogg', + 'sound/ambience/ambitech.ogg', + 'sound/ambience/ambitech2.ogg', + 'sound/ambience/ambitech3.ogg', + 'sound/ambience/ambimystery.ogg', + ) + airlock_wires = /datum/wires/airlock/engineering + +/area/station/tcommsat/computer + name = "\improper Telecomms Control Room" + icon_state = "tcomsatcomp" + sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR + +/area/station/tcommsat/server + name = "\improper Telecomms Server Room" + icon_state = "tcomsatcham" + +/area/station/tcommsat/server/upper + name = "\improper Upper Telecomms Server Room" + +/* +* On-Station Telecommunications Areas +*/ + +/area/station/comms + name = "\improper Communications Relay" + icon_state = "tcomsatcham" + sound_environment = SOUND_AREA_STANDARD_STATION + +/area/station/server + name = "\improper Messaging Server Room" + icon_state = "server" + sound_environment = SOUND_AREA_STANDARD_STATION diff --git a/code/game/area/space_station_13_areas.dm b/code/game/area/space_station_13_areas.dm deleted file mode 100644 index ebf316ea57d27..0000000000000 --- a/code/game/area/space_station_13_areas.dm +++ /dev/null @@ -1,18 +0,0 @@ -/* - -### This file contains a list of all the areas in your station. Format is as follows: - -/area/CATEGORY/OR/DESCRIPTOR/NAME (you can make as many subdivisions as you want) - name = "NICE NAME" (not required but makes things really nice) - icon = 'ICON FILENAME' (defaults to 'icons/area_misc.dmi') - icon_state = "NAME OF ICON" (defaults to "unknown" (blank)) - requires_power = FALSE (defaults to true) - ambience_index = AMBIENCE_GENERIC (picks the ambience from an assoc list in ambience.dm) - ambientsounds = list() (defaults to ambience_index's assoc on Initialize(). override it as "ambientsounds = list('sound/ambience/signal.ogg')" or by changing ambience_index) - -NOTE: there are two lists of areas in the end of this file: centcom and station itself. Please maintain these lists valid. --rastaf0 - -*/ - - -/*-----------------------------------------------------------------------------*/ diff --git a/code/game/atom_defense.dm b/code/game/atom_defense.dm index 77b5c359557cd..bced6cb3bf143 100644 --- a/code/game/atom_defense.dm +++ b/code/game/atom_defense.dm @@ -73,7 +73,7 @@ if(damage_flag) armor_protection = get_armor_rating(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(PENETRATE_ARMOUR(armor_protection, armour_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 3c6a9cd77bcda..be6cf0436a7d4 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -60,7 +60,7 @@ ///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 - /// Lazylist of all images (hopefully attached to us) to update when we change z levels + /// Lazylist of all images (or atoms, I'm sorry) (hopefully attached to us) to update when we change z levels /// You will need to manage adding/removing from this yourself, but I'll do the updating for you var/list/image/update_on_z @@ -103,6 +103,11 @@ var/light_power = 1 ///Hexadecimal RGB string representing the colour of the light. White by default. var/light_color = COLOR_WHITE + /// Angle of light to show in light_dir + /// 360 is a circle, 90 is a cone, etc. + var/light_angle = 360 + /// What angle to project light in + var/light_dir = NORTH ///Boolean variable for toggleable lights. Has no effect without the proper light_system, light_range and light_power values. var/light_on = TRUE ///Bitflags to determine lighting-related atom properties. @@ -124,6 +129,11 @@ var/base_pixel_x = 0 ///Default pixel y shifting for the atom's icon. var/base_pixel_y = 0 + // Use SET_BASE_VISUAL_PIXEL(x, y) to set these in typepath definitions, it'll handle pixel_w and z for you + ///Default pixel w shifting for the atom's icon. + var/base_pixel_w = 0 + ///Default pixel z shifting for the atom's icon. + var/base_pixel_z = 0 ///Used for changing icon states for different base sprites. var/base_icon_state @@ -198,84 +208,6 @@ //we were deleted return -/** - * The primary method that objects are setup in SS13 with - * - * we don't use New as we have better control over when this is called and we can choose - * to delay calls or hook other logic in and so forth - * - * During roundstart map parsing, atoms are queued for intialization in the base atom/New(), - * After the map has loaded, then Initalize is called on all atoms one by one. NB: this - * is also true for loading map templates as well, so they don't Initalize until all objects - * in the map file are parsed and present in the world - * - * If you're creating an object at any point after SSInit has run then this proc will be - * immediately be called from New. - * - * mapload: This parameter is true if the atom being loaded is either being intialized during - * the Atom subsystem intialization, or if the atom is being loaded from the map template. - * If the item is being created at runtime any time after the Atom subsystem is intialized then - * it's false. - * - * The mapload argument occupies the same position as loc when Initialize() is called by New(). - * loc will no longer be needed after it passed New(), and thus it is being overwritten - * with mapload at the end of atom/New() before this proc (atom/Initialize()) is called. - * - * You must always call the parent of this proc, otherwise failures will occur as the item - * will not be seen as initalized (this can lead to all sorts of strange behaviour, like - * the item being completely unclickable) - * - * You must not sleep in this proc, or any subprocs - * - * Any parameters from new are passed through (excluding loc), naturally if you're loading from a map - * there are no other arguments - * - * Must return an [initialization hint][INITIALIZE_HINT_NORMAL] or a runtime will occur. - * - * Note: the following functions don't call the base for optimization and must copypasta handling: - * * [/turf/proc/Initialize] - * * [/turf/open/space/proc/Initialize] - */ -/atom/proc/Initialize(mapload, ...) - SHOULD_NOT_SLEEP(TRUE) - SHOULD_CALL_PARENT(TRUE) - - if(flags_1 & INITIALIZED_1) - stack_trace("Warning: [src]([type]) initialized multiple times!") - flags_1 |= INITIALIZED_1 - - if(loc) - SEND_SIGNAL(loc, COMSIG_ATOM_INITIALIZED_ON, src) /// Sends a signal that the new atom `src`, has been created at `loc` - - SET_PLANE_IMPLICIT(src, plane) - - if(greyscale_config && greyscale_colors) //we'll check again at item/init for inhand/belt/worn configs. - update_greyscale() - - //atom color stuff - if(color) - add_atom_colour(color, FIXED_COLOUR_PRIORITY) - - if (light_system == STATIC_LIGHT && light_power && light_range) - update_light() - - SETUP_SMOOTHING() - - if(uses_integrity) - atom_integrity = max_integrity - TEST_ONLY_ASSERT((!armor || istype(armor)), "[type] has an armor that contains an invalid value at intialize") - - // 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) - - if(ispath(ai_controller)) - ai_controller = new ai_controller(src) - - return INITIALIZE_HINT_NORMAL - /** * Late Intialization, for code that should run after all atoms have run Intialization * @@ -391,6 +323,8 @@ /atom/proc/CanPass(atom/movable/mover, border_dir) SHOULD_CALL_PARENT(TRUE) SHOULD_BE_PURE(TRUE) + if(SEND_SIGNAL(src, COMSIG_ATOM_TRIED_PASS, mover, border_dir) & COMSIG_COMPONENT_PERMIT_PASSAGE) + return TRUE if(mover.movement_type & PHASING) return TRUE . = CanAllowThrough(mover, border_dir) @@ -614,6 +548,7 @@ SEND_SIGNAL(source, COMSIG_REAGENTS_EXPOSE_ATOM, src, reagents, methods, volume_modifier, show_message) for(var/datum/reagent/current_reagent as anything in reagents) . |= current_reagent.expose_atom(src, reagents[current_reagent]) + SEND_SIGNAL(src, COMSIG_ATOM_AFTER_EXPOSE_REAGENTS, reagents, source, methods, volume_modifier, show_message) /// Are you allowed to drop this atom /atom/proc/AllowDrop() @@ -623,20 +558,26 @@ /atom/proc/HasProximity(atom/movable/proximity_check_mob as mob|obj) return +/// Sets the wire datum of an atom +/atom/proc/set_wires(datum/wires/new_wires) + wires = new_wires + /** * React to an EMP of the given severity * - * Default behaviour is to send the [COMSIG_ATOM_EMP_ACT] signal + * Default behaviour is to send the [COMSIG_ATOM_PRE_EMP_ACT] and [COMSIG_ATOM_EMP_ACT] signal * - * If the signal does not return protection, and there are attached wires then we call + * If the pre-signal does not return protection, and there are attached wires then we call * [emp_pulse][/datum/wires/proc/emp_pulse] on the wires * * We then return the protection value */ /atom/proc/emp_act(severity) - var/protection = SEND_SIGNAL(src, COMSIG_ATOM_EMP_ACT, severity) + var/protection = SEND_SIGNAL(src, COMSIG_ATOM_PRE_EMP_ACT, severity) if(!(protection & EMP_PROTECT_WIRES) && istype(wires)) wires.emp_pulse() + + SEND_SIGNAL(src, COMSIG_ATOM_EMP_ACT, severity, protection) return protection // Pass the protection value collected here upwards /** @@ -762,6 +703,7 @@ . = list() SEND_SIGNAL(src, COMSIG_ATOM_EXAMINE_MORE, user, .) + SEND_SIGNAL(user, COMSIG_MOB_EXAMINING_MORE, src, .) /** * Updates the appearence of the icon @@ -891,8 +833,8 @@ if(SEND_SIGNAL(src, COMSIG_ATOM_RELAYMOVE, user, direction) & COMSIG_BLOCK_RELAYMOVE) return if(buckle_message_cooldown <= world.time) - buckle_message_cooldown = world.time + 50 - to_chat(user, span_warning("You can't move while buckled to [src]!")) + buckle_message_cooldown = world.time + 25 + balloon_alert(user, "can't move while buckled!") return /** @@ -977,7 +919,7 @@ */ /atom/proc/hitby_react(atom/movable/harmed_atom) if(harmed_atom && isturf(harmed_atom.loc)) - step(harmed_atom, turn(harmed_atom.dir, 180)) + step(harmed_atom, REVERSE_DIR(harmed_atom.dir)) ///Handle the atom being slipped over /atom/proc/handle_slip(mob/living/carbon/slipped_carbon, knockdown_amount, obj/slipping_object, lube, paralyze, force_drop) @@ -1061,10 +1003,15 @@ /** * Respond to an emag being used on our atom * - * Default behaviour is to send [COMSIG_ATOM_EMAG_ACT] and return + * Args: + * * mob/user: The mob that used the emag. Nullable. + * * obj/item/card/emag/emag_card: The emag that was used. Nullable. + * + * Returns: + * TRUE if the emag had any effect, falsey otherwise. */ /atom/proc/emag_act(mob/user, obj/item/card/emag/emag_card) - SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT, user, emag_card) + return (SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT, user, emag_card)) /** * Respond to narsie eating our atom @@ -1105,14 +1052,6 @@ /atom/proc/get_dumping_location() return null -/** - * This proc is called when an atom in our contents has it's [Destroy][/atom/proc/Destroy] called - * - * Default behaviour is to simply send [COMSIG_ATOM_CONTENTS_DEL] - */ -/atom/proc/handle_atom_del(atom/deleting_atom) - SEND_SIGNAL(src, COMSIG_ATOM_CONTENTS_DEL, deleting_atom) - /** * the vision impairment to give to the mob whose perspective is set to that atom * @@ -1143,6 +1082,8 @@ SEND_SIGNAL(src, COMSIG_ATOM_DIR_CHANGE, dir, newdir) dir = newdir SEND_SIGNAL(src, COMSIG_ATOM_POST_DIR_CHANGE, dir, newdir) + if(smoothing_flags & SMOOTH_BORDER_OBJECT) + QUEUE_SMOOTH_NEIGHBORS(src) /** * Called when the atom log's in or out @@ -1251,6 +1192,9 @@ * the object has been admin edited */ /atom/vv_edit_var(var_name, var_value) + var/old_light_flags = light_flags + // Disable frozen lights for now, so we can actually modify it + light_flags &= ~LIGHT_FROZEN switch(var_name) if(NAMEOF(src, light_range)) if(light_system == STATIC_LIGHT) @@ -1270,11 +1214,21 @@ else set_light_color(var_value) . = TRUE + if(NAMEOF(src, light_angle)) + if(light_system == STATIC_LIGHT) + set_light(l_angle = var_value) + . = TRUE + if(NAMEOF(src, light_dir)) + if(light_system == STATIC_LIGHT) + set_light(l_dir = var_value) + . = TRUE if(NAMEOF(src, light_on)) set_light_on(var_value) . = TRUE if(NAMEOF(src, light_flags)) set_light_flags(var_value) + // I'm sorry + old_light_flags = var_value . = TRUE if(NAMEOF(src, smoothing_junction)) set_smoothed_icon_state(var_value) @@ -1289,6 +1243,7 @@ set_base_pixel_y(var_value) . = TRUE + light_flags = old_light_flags if(!isnull(.)) datum_flags |= DF_VAR_EDITED return @@ -1325,6 +1280,7 @@ VV_DROPDOWN_OPTION(VV_HK_TRIGGER_EXPLOSION, "Explosion") VV_DROPDOWN_OPTION(VV_HK_EDIT_FILTERS, "Edit Filters") VV_DROPDOWN_OPTION(VV_HK_EDIT_COLOR_MATRIX, "Edit Color as Matrix") + VV_DROPDOWN_OPTION(VV_HK_TEST_MATRIXES, "Test Matrices") VV_DROPDOWN_OPTION(VV_HK_ADD_AI, "Add AI controller") VV_DROPDOWN_OPTION(VV_HK_ARMOR_MOD, "Modify Armor") if(greyscale_colors) @@ -1408,7 +1364,7 @@ ai_controller = new result(src) if(href_list[VV_HK_MODIFY_TRANSFORM] && check_rights(R_VAREDIT)) - var/result = input(usr, "Choose the transformation to apply","Transform Mod") as null|anything in list("Scale","Translate","Rotate") + var/result = input(usr, "Choose the transformation to apply","Transform Mod") as null|anything in list("Scale","Translate","Rotate","Shear") var/matrix/M = transform if(!result) return @@ -1425,6 +1381,12 @@ if(isnull(x) || isnull(y)) return transform = M.Translate(x,y) + if("Shear") + var/x = input(usr, "Choose x mod","Transform Mod") as null|num + var/y = input(usr, "Choose y mod","Transform Mod") as null|num + if(isnull(x) || isnull(y)) + return + transform = M.Shear(x,y) if("Rotate") var/angle = input(usr, "Choose angle to rotate","Transform Mod") as null|num if(isnull(angle)) @@ -1467,12 +1429,13 @@ vv_auto_rename(newname) if(href_list[VV_HK_EDIT_FILTERS] && check_rights(R_VAREDIT)) - var/client/C = usr.client - C?.open_filter_editor(src) + usr.client?.open_filter_editor(src) if(href_list[VV_HK_EDIT_COLOR_MATRIX] && check_rights(R_VAREDIT)) - var/client/C = usr.client - C?.open_color_matrix_editor(src) + usr.client?.open_color_matrix_editor(src) + + if(href_list[VV_HK_TEST_MATRIXES] && check_rights(R_VAREDIT)) + usr.client?.open_matrix_tester(src) /atom/vv_get_header() . = ..() @@ -1612,18 +1575,19 @@ if(process_item.use_tool(src, user, processing_time, volume=50)) var/atom/atom_to_create = chosen_option[TOOL_PROCESSING_RESULT] var/list/atom/created_atoms = list() - for(var/i = 1 to chosen_option[TOOL_PROCESSING_AMOUNT]) + var/amount_to_create = chosen_option[TOOL_PROCESSING_AMOUNT] + for(var/i = 1 to amount_to_create) var/atom/created_atom = new atom_to_create(drop_location()) if(custom_materials) - created_atom.set_custom_materials(custom_materials, 1 / chosen_option[TOOL_PROCESSING_AMOUNT]) + created_atom.set_custom_materials(custom_materials, 1 / amount_to_create) created_atom.pixel_x = pixel_x created_atom.pixel_y = pixel_y if(i > 1) created_atom.pixel_x += rand(-8,8) created_atom.pixel_y += rand(-8,8) created_atom.OnCreatedFromProcessing(user, process_item, chosen_option, src) - to_chat(user, span_notice("You manage to create [chosen_option[TOOL_PROCESSING_AMOUNT]] [initial(atom_to_create.gender) == PLURAL ? "[initial(atom_to_create.name)]" : "[initial(atom_to_create.name)][plural_s(initial(atom_to_create.name))]"] from [src].")) created_atoms.Add(created_atom) + to_chat(user, span_notice("You manage to create [amount_to_create] [initial(atom_to_create.gender) == PLURAL ? "[initial(atom_to_create.name)]" : "[initial(atom_to_create.name)][plural_s(initial(atom_to_create.name))]"] from [src].")) SEND_SIGNAL(src, COMSIG_ATOM_PROCESSED, user, process_item, created_atoms) UsedforProcessing(user, process_item, chosen_option) return @@ -1658,7 +1622,7 @@ /atom/proc/multitool_act_secondary(mob/living/user, obj/item/tool) return -///Check if the multitool has an item in it's data buffer +///Check if an item supports a data buffer (is a multitool) /atom/proc/multitool_check_buffer(user, obj/item/multitool, silent = FALSE) if(!istype(multitool, /obj/item/multitool)) if(user && !silent) @@ -2029,7 +1993,7 @@ active_hud.screentip_text.maptext = "" return - active_hud.screentip_text.maptext_y = 0 + active_hud.screentip_text.maptext_y = 10 // 10px lines us up with the action buttons top left corner var/lmb_rmb_line = "" var/ctrl_lmb_ctrl_rmb_line = "" var/alt_lmb_alt_rmb_line = "" @@ -2048,15 +2012,16 @@ | (held_item && SEND_SIGNAL(held_item, COMSIG_ITEM_REQUESTING_CONTEXT_FOR_TARGET, context, src, user)) if (contextual_screentip_returns & CONTEXTUAL_SCREENTIP_SET) + var/screentip_images = active_hud.screentip_images // LMB and RMB on one line... - var/lmb_text = (SCREENTIP_CONTEXT_LMB in context) ? "[SCREENTIP_CONTEXT_LMB]: [context[SCREENTIP_CONTEXT_LMB]]" : "" - var/rmb_text = (SCREENTIP_CONTEXT_RMB in context) ? "[SCREENTIP_CONTEXT_RMB]: [context[SCREENTIP_CONTEXT_RMB]]" : "" + var/lmb_text = build_context(context, SCREENTIP_CONTEXT_LMB, screentip_images) + var/rmb_text = build_context(context, SCREENTIP_CONTEXT_RMB, screentip_images) - if (lmb_text) + if (lmb_text != "") lmb_rmb_line = lmb_text - if (rmb_text) + if (rmb_text != "") lmb_rmb_line += " | [rmb_text]" - else if (rmb_text) + else if (rmb_text != "") lmb_rmb_line = rmb_text // Ctrl-LMB, Ctrl-RMB on one line... @@ -2064,47 +2029,48 @@ lmb_rmb_line += "
" extra_lines++ if (SCREENTIP_CONTEXT_CTRL_LMB in context) - ctrl_lmb_ctrl_rmb_line += "[SCREENTIP_CONTEXT_CTRL_LMB]: [context[SCREENTIP_CONTEXT_CTRL_LMB]]" + ctrl_lmb_ctrl_rmb_line += build_context(context, SCREENTIP_CONTEXT_CTRL_LMB, screentip_images) + if (SCREENTIP_CONTEXT_CTRL_RMB in context) if (ctrl_lmb_ctrl_rmb_line != "") ctrl_lmb_ctrl_rmb_line += " | " - ctrl_lmb_ctrl_rmb_line += "[SCREENTIP_CONTEXT_CTRL_RMB]: [context[SCREENTIP_CONTEXT_CTRL_RMB]]" + ctrl_lmb_ctrl_rmb_line += build_context(context, SCREENTIP_CONTEXT_CTRL_RMB, screentip_images) // Alt-LMB, Alt-RMB on one line... if (ctrl_lmb_ctrl_rmb_line != "") ctrl_lmb_ctrl_rmb_line += "
" extra_lines++ if (SCREENTIP_CONTEXT_ALT_LMB in context) - alt_lmb_alt_rmb_line += "[SCREENTIP_CONTEXT_ALT_LMB]: [context[SCREENTIP_CONTEXT_ALT_LMB]]" + alt_lmb_alt_rmb_line += build_context(context, SCREENTIP_CONTEXT_ALT_LMB, screentip_images) if (SCREENTIP_CONTEXT_ALT_RMB in context) if (alt_lmb_alt_rmb_line != "") alt_lmb_alt_rmb_line += " | " - alt_lmb_alt_rmb_line += "[SCREENTIP_CONTEXT_ALT_RMB]: [context[SCREENTIP_CONTEXT_ALT_RMB]]" + alt_lmb_alt_rmb_line += build_context(context, SCREENTIP_CONTEXT_ALT_RMB, screentip_images) // Shift-LMB, Ctrl-Shift-LMB on one line... if (alt_lmb_alt_rmb_line != "") alt_lmb_alt_rmb_line += "
" extra_lines++ if (SCREENTIP_CONTEXT_SHIFT_LMB in context) - shift_lmb_ctrl_shift_lmb_line += "[SCREENTIP_CONTEXT_SHIFT_LMB]: [context[SCREENTIP_CONTEXT_SHIFT_LMB]]" + shift_lmb_ctrl_shift_lmb_line += build_context(context, SCREENTIP_CONTEXT_SHIFT_LMB, screentip_images) if (SCREENTIP_CONTEXT_CTRL_SHIFT_LMB in context) if (shift_lmb_ctrl_shift_lmb_line != "") shift_lmb_ctrl_shift_lmb_line += " | " - shift_lmb_ctrl_shift_lmb_line += "[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB]: [context[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB]]" + shift_lmb_ctrl_shift_lmb_line += build_context(context, SCREENTIP_CONTEXT_CTRL_SHIFT_LMB, screentip_images) if (shift_lmb_ctrl_shift_lmb_line != "") extra_lines++ if(extra_lines) - extra_context = "
[lmb_rmb_line][ctrl_lmb_ctrl_rmb_line][alt_lmb_alt_rmb_line][shift_lmb_ctrl_shift_lmb_line]" - //first extra line pushes atom name line up 10px, subsequent lines push it up 9px, this offsets that and keeps the first line in the same place - active_hud.screentip_text.maptext_y = -10 + (extra_lines - 1) * -9 + extra_context = "
[lmb_rmb_line][ctrl_lmb_ctrl_rmb_line][alt_lmb_alt_rmb_line][shift_lmb_ctrl_shift_lmb_line]" + //first extra line pushes atom name line up 11px, subsequent lines push it up 9px, this offsets that and keeps the first line in the same place + active_hud.screentip_text.maptext_y = -1 + (extra_lines - 1) * -9 if (screentips_enabled == SCREENTIP_PREFERENCE_CONTEXT_ONLY && extra_context == "") active_hud.screentip_text.maptext = "" else //We inline a MAPTEXT() here, because there's no good way to statically add to a string like this - active_hud.screentip_text.maptext = "[name][extra_context]" + active_hud.screentip_text.maptext = "[name][extra_context]" /// Gets a merger datum representing the connected blob of objects in the allowed_types argument /atom/proc/GetMergeGroup(id, list/allowed_types) @@ -2149,16 +2115,18 @@ // 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/static/atom/movable/scanline - if(!scanline) - scanline = new(null) - scanline.icon = 'icons/effects/effects.dmi' - scanline.icon_state = "scanline" - // * so it doesn't render - scanline.render_target = "*HoloScanline" + var/atom/movable/scanline = new(null) + scanline.icon = 'icons/effects/effects.dmi' + scanline.icon_state = "scanline" + 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) // Annd let's make the sucker emissive, so it glows in the dark if(!render_target) var/static/uid = 0 @@ -2174,3 +2142,23 @@ var/mutable_appearance/glow_appearance = new(glow) add_overlay(glow_appearance) LAZYADD(update_overlays_on_z, glow_appearance) + +/** + * Proc called when you want the atom to spin around the center of its icon (or where it would be if its transform var is translated) + * By default, it makes the atom spin forever and ever at a speed of 60 rpm. + * + * Arguments: + * * speed: how much it takes for the atom to complete one 360° rotation + * * loops: how many times do we want the atom to rotate + * * clockwise: whether the atom ought to spin clockwise or counter-clockwise + * * segments: in how many animate calls the rotation is split. Probably unnecessary, but you shouldn't set it lower than 3 anyway. + * * parallel: whether the animation calls have the ANIMATION_PARALLEL flag, necessary for it to run alongside concurrent animations. + */ +/atom/proc/SpinAnimation(speed = 1 SECONDS, loops = -1, clockwise = TRUE, segments = 3, parallel = TRUE) + if(!segments) + return + var/segment = 360/segments + if(!clockwise) + segment = -segment + SEND_SIGNAL(src, COMSIG_ATOM_SPIN_ANIMATION, speed, loops, segments, segment) + do_spin_animation(speed, loops, segments, segment, parallel) diff --git a/code/game/atoms_initializing_EXPENSIVE.dm b/code/game/atoms_initializing_EXPENSIVE.dm new file mode 100644 index 0000000000000..1ecc6390edc34 --- /dev/null +++ b/code/game/atoms_initializing_EXPENSIVE.dm @@ -0,0 +1,128 @@ +/// Init this specific atom +/datum/controller/subsystem/atoms/proc/InitAtom(atom/A, from_template = FALSE, list/arguments) + var/the_type = A.type + + if(QDELING(A)) + // Check init_start_time to not worry about atoms created before the atoms SS that are cleaned up before this + if (A.gc_destroyed > init_start_time) + BadInitializeCalls[the_type] |= BAD_INIT_QDEL_BEFORE + return TRUE + + // This is handled and battle tested by dreamchecker. Limit to UNIT_TESTS just in case that ever fails. + #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 + + switch(result) + if (INITIALIZE_HINT_NORMAL) + // pass + if(INITIALIZE_HINT_LATELOAD) + if(arguments[1]) //mapload + late_loaders += A + else + A.LateInitialize() + if(INITIALIZE_HINT_QDEL) + qdel(A) + qdeleted = TRUE + else + BadInitializeCalls[the_type] |= BAD_INIT_NO_HINT + + if(!A) //possible harddel + qdeleted = TRUE + else if(!(A.flags_1 & INITIALIZED_1)) + BadInitializeCalls[the_type] |= BAD_INIT_DIDNT_INIT + else + SEND_SIGNAL(A, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE) + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_ATOM_AFTER_POST_INIT, A) + var/atom/location = A.loc + if(location) + /// Sends a signal that the new atom `src`, has been created at `loc` + SEND_SIGNAL(location, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, A, arguments[1]) + if(created_atoms && from_template && ispath(the_type, /atom/movable))//we only want to populate the list with movables + created_atoms += A.get_all_contents() + + return qdeleted || QDELING(A) + +/** + * The primary method that objects are setup in SS13 with + * + * we don't use New as we have better control over when this is called and we can choose + * to delay calls or hook other logic in and so forth + * + * During roundstart map parsing, atoms are queued for intialization in the base atom/New(), + * After the map has loaded, then Initalize is called on all atoms one by one. NB: this + * is also true for loading map templates as well, so they don't Initalize until all objects + * in the map file are parsed and present in the world + * + * If you're creating an object at any point after SSInit has run then this proc will be + * immediately be called from New. + * + * mapload: This parameter is true if the atom being loaded is either being intialized during + * the Atom subsystem intialization, or if the atom is being loaded from the map template. + * If the item is being created at runtime any time after the Atom subsystem is intialized then + * it's false. + * + * The mapload argument occupies the same position as loc when Initialize() is called by New(). + * loc will no longer be needed after it passed New(), and thus it is being overwritten + * with mapload at the end of atom/New() before this proc (atom/Initialize()) is called. + * + * You must always call the parent of this proc, otherwise failures will occur as the item + * will not be seen as initalized (this can lead to all sorts of strange behaviour, like + * the item being completely unclickable) + * + * You must not sleep in this proc, or any subprocs + * + * Any parameters from new are passed through (excluding loc), naturally if you're loading from a map + * there are no other arguments + * + * Must return an [initialization hint][INITIALIZE_HINT_NORMAL] or a runtime will occur. + * + * Note: the following functions don't call the base for optimization and must copypasta handling: + * * [/turf/proc/Initialize] + * * [/turf/open/space/proc/Initialize] + */ +/atom/proc/Initialize(mapload, ...) + SHOULD_NOT_SLEEP(TRUE) + SHOULD_CALL_PARENT(TRUE) + + if(flags_1 & INITIALIZED_1) + stack_trace("Warning: [src]([type]) initialized multiple times!") + flags_1 |= INITIALIZED_1 + + SET_PLANE_IMPLICIT(src, plane) + + if(greyscale_config && greyscale_colors) //we'll check again at item/init for inhand/belt/worn configs. + update_greyscale() + + //atom color stuff + if(color) + add_atom_colour(color, FIXED_COLOUR_PRIORITY) + + if (light_system == STATIC_LIGHT && light_power && light_range) + update_light() + + SETUP_SMOOTHING() + + if(uses_integrity) + atom_integrity = max_integrity + TEST_ONLY_ASSERT((!armor || istype(armor)), "[type] has an armor that contains an invalid value at intialize") + + // 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) + + if(ispath(ai_controller)) + ai_controller = new ai_controller(src) + + return INITIALIZE_HINT_NORMAL diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 876ae0b4483bc..eaa6cfe13781b 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -14,8 +14,11 @@ ///Max range this atom can be thrown via telekinesis var/tk_throw_range = 10 var/mob/pulledby = null + /// What language holder type to init as 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. + /// Holds all languages this mob can speak and understand + VAR_PRIVATE/datum/language_holder/language_holder + var/verb_say = "says" var/verb_ask = "asks" var/verb_exclaim = "exclaims" @@ -97,9 +100,15 @@ /// The voice that this movable makes when speaking var/voice + /// The pitch adjustment that this movable uses when speaking. + var/pitch = 0 + /// The filter to apply to the voice when processing the TTS audio message. var/voice_filter = "" + /// Set to anything other than "" to activate the silicon voice effect for TTS messages. + var/tts_silicon_voice_effect = "" + /// Value used to increment ex_act() if reactionary_explosions is on /// How much we as a source block explosions by /// Will not automatically apply to the turf below you, you need to apply /datum/element/block_explosives in conjunction with this @@ -113,7 +122,7 @@ color = EM_BLOCK_COLOR appearance_flags = EMISSIVE_APPEARANCE_FLAGS -/atom/movable/Initialize(mapload) +/atom/movable/Initialize(mapload, ...) . = ..() #ifdef UNIT_TESTS if(explosion_block && !HAS_TRAIT(src, TRAIT_BLOCKING_EXPLOSIVES)) @@ -185,7 +194,6 @@ if(((can_atmos_pass == ATMOS_PASS_DENSITY && density) || can_atmos_pass == ATMOS_PASS_NO) && isturf(loc)) can_atmos_pass = ATMOS_PASS_YES air_update_turf(TRUE, FALSE) - loc.handle_atom_del(src) if(opacity) RemoveElement(/datum/element/light_blocking) @@ -571,6 +579,8 @@ pulledby.stop_pulling() /atom/movable/proc/set_glide_size(target = 8) + if (HAS_TRAIT(src, TRAIT_NO_GLIDE)) + return SEND_SIGNAL(src, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, target) glide_size = target @@ -1157,7 +1167,7 @@ if(update_on_z) // I so much wish this could be somewhere else. alas, no. - for(var/image/update in update_on_z) + for(var/image/update as anything in update_on_z) SET_PLANE(update, PLANE_TO_TRUE(update.plane), new_turf) if(update_overlays_on_z) // This EVEN more so @@ -1234,8 +1244,11 @@ if(impact_signal & COMPONENT_MOVABLE_IMPACT_FLIP_HITPUSH) hitpush = FALSE // hacky, tie this to something else or a proper workaround later - if(!(impact_signal && (impact_signal & COMPONENT_MOVABLE_IMPACT_NEVERMIND))) // in case a signal interceptor broke or deleted the thing before we could process our hit - return hit_atom.hitby(src, throwingdatum=throwingdatum, hitpush=hitpush) + if(impact_signal && (impact_signal & COMPONENT_MOVABLE_IMPACT_NEVERMIND)) + return // in case a signal interceptor broke or deleted the thing before we could process our hit + if(SEND_SIGNAL(hit_atom, COMSIG_ATOM_PREHITBY, src, throwingdatum) & COMSIG_HIT_PREVENTED) + return + return hit_atom.hitby(src, throwingdatum=throwingdatum, hitpush=hitpush) /atom/movable/hitby(atom/movable/hitting_atom, skipcatch, hitpush = TRUE, blocked, datum/thrownthing/throwingdatum) if(!anchored && hitpush && (!throwingdatum || (throwingdatum.force >= (move_resist * MOVE_FORCE_PUSH_RATIO)))) @@ -1440,50 +1453,47 @@ */ /// 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) +/atom/movable/proc/get_language_holder() + RETURN_TYPE(/datum/language_holder) + if(QDELING(src)) + CRASH("get_language_holder() called on a QDELing atom, \ + this will try to re-instantiate the language holder that's about to be deleted, which is bad.") + 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) +/atom/movable/proc/grant_language(language, language_flags = ALL, source = LANGUAGE_ATOM) + return get_language_holder().grant_language(language, language_flags, 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) +/atom/movable/proc/grant_all_languages(language_flags = ALL, grant_omnitongue = TRUE, source = LANGUAGE_MIND) + return get_language_holder().grant_all_languages(language_flags, 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) +/atom/movable/proc/remove_language(language, language_flags = ALL, source = LANGUAGE_ALL) + return get_language_holder().remove_language(language, language_flags, 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) +/atom/movable/proc/has_language(language, flags_to_check) + return get_language_holder().has_language(language, flags_to_check) /// 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) + return get_language_holder().can_speak_language(language) /// Returns the result of tongue specific limitations on spoken languages. /atom/movable/proc/could_speak_language(datum/language/language_path) @@ -1491,33 +1501,32 @@ /// 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. -/atom/movable/proc/copy_languages(from_holder, source_override) - if(isatom(from_holder)) +/atom/movable/proc/copy_languages(datum/language_holder/from_holder, source_override) + if(ismovable(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) -/// 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().copy_languages(from_holder, source_override) + +/// Sets the passed path as the active language +/// Returns the currently selected language if successful, if the language was not valid, returns null +/atom/movable/proc/set_active_language(language_path) + var/datum/language_holder/our_holder = get_language_holder() + our_holder.selected_language = language_path + + return our_holder.get_selected_language() // verifies its validity, returns it if successful. /** * Randomizes our atom's language to an uncommon language if: @@ -1530,16 +1539,22 @@ var/area/atom_area = get_area(src) if(!atom_turf) // some machines spawn in nullspace - return + return FALSE if(!is_station_level(atom_turf.z) && !istype(atom_area, /area/shuttle/escape)) // Why snowflake check for escape shuttle? Well, a lot of shuttles spawn with machines // but docked at centcom, and I wanted those machines to also speak funny languages return FALSE + grant_random_uncommon_language() + return TRUE - /// The atom's language holder - so we can randomize and change their language - var/datum/language_holder/atom_languages = get_language_holder() - atom_languages.selected_language = atom_languages.get_random_spoken_uncommon_language() +/// Teaches a random non-common language and sets it as the active language +/atom/movable/proc/grant_random_uncommon_language(source) + if (!length(GLOB.uncommon_roundstart_languages)) + return FALSE + var/picked = pick(GLOB.uncommon_roundstart_languages) + grant_language(picked, source = source) + set_active_language(picked) return TRUE /* End language procs */ diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 4830d5ba56c68..c755f2e9685ce 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -238,19 +238,24 @@ FAN HUDs! For identifying other fans on-sight. /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 + var/icon/hud_icon = icon(icon, icon_state, dir) + holder.pixel_y = hud_icon.Height() - world.icon_size holder.icon_state = "hudfan_no" - var/obj/item/clothing/under/U = get_item_by_slot(ITEM_SLOT_ICLOTHING) - if(!U) + + var/obj/item/clothing/under/undershirt = w_uniform + if(!istype(undershirt)) set_hud_image_inactive(FAN_HUD) return - if(istype(U.attached_accessory, /obj/item/clothing/accessory/mime_fan_pin)) - holder.icon_state = "mime_fan_pin" + for(var/accessory in undershirt.attached_accessories) + if(istype(accessory, /obj/item/clothing/accessory/mime_fan_pin)) + holder.icon_state = "mime_fan_pin" + break + + if(istype(accessory, /obj/item/clothing/accessory/clown_enjoyer_pin)) + holder.icon_state = "clown_enjoyer_pin" + break - else if(istype(U.attached_accessory, /obj/item/clothing/accessory/clown_enjoyer_pin)) - holder.icon_state = "clown_enjoyer_pin" set_hud_image_active(FAN_HUD) return diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm index 863e24d454d1f..e5f6d9cd3d276 100644 --- a/code/game/gamemodes/dynamic/dynamic.dm +++ b/code/game/gamemodes/dynamic/dynamic.dm @@ -15,6 +15,10 @@ GLOBAL_VAR_INIT(dynamic_stacking_limit, 90) GLOBAL_LIST_EMPTY(dynamic_forced_roundstart_ruleset) // Forced threat level, setting this to zero or higher forces the roundstart threat to the value. GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) +/// Modify the threat level for station traits before dynamic can be Initialized. List(instance = threat_reduction) +GLOBAL_LIST_EMPTY(dynamic_station_traits) +/// Rulesets which have been forcibly enabled or disabled +GLOBAL_LIST_EMPTY(dynamic_forced_rulesets) /datum/game_mode/dynamic // Threat logging vars @@ -136,7 +140,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) /// What is the higher bound of when the roundstart annoucement is sent out? var/waittime_h = 1800 - /// Maximum amount of threat allowed to generate. + /// A number between 0 and 100. The maximum amount of threat allowed to generate. var/max_threat_level = 100 /// The extra chance multiplier that a heavy impact midround ruleset will run next time. @@ -199,7 +203,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) dat += "
" dat += "Parameters: centre = [threat_curve_centre] ; width = [threat_curve_width].
" dat += "Split parameters: centre = [roundstart_split_curve_centre] ; width = [roundstart_split_curve_width].
" - dat += "On average, [peaceful_percentage]% of the rounds are more peaceful.
" + dat += "On average, [clamp(peaceful_percentage, 1, 99)]% of the rounds are more peaceful.
" dat += "Forced extended: [GLOB.dynamic_forced_extended ? "On" : "Off"]
" dat += "No stacking (only one round-ender): [GLOB.dynamic_no_stacking ? "On" : "Off"]
" dat += "Stacking limit: [GLOB.dynamic_stacking_limit] \[Adjust\]" @@ -392,18 +396,22 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) /// Generates the threat level using lorentz distribution and assigns peaceful_percentage. /datum/game_mode/dynamic/proc/generate_threat() - var/relative_threat = LORENTZ_DISTRIBUTION(threat_curve_centre, threat_curve_width) - threat_level = clamp(round(lorentz_to_amount(relative_threat), 0.1), 0, max_threat_level) + // At lower pop levels we run a Liner Interpolation against the max threat based proportionally on the number + // of players ready. This creates a balanced lorentz curve within a smaller range than 0 to max_threat_level. + var/calculated_max_threat = (SSticker.totalPlayersReady < low_pop_player_threshold) ? LERP(low_pop_maximum_threat, max_threat_level, SSticker.totalPlayersReady / low_pop_player_threshold) : max_threat_level + log_dynamic("Calculated maximum threat level based on player count of [SSticker.totalPlayersReady]: [calculated_max_threat]") - if (SSticker.totalPlayersReady < low_pop_player_threshold) - threat_level = min(threat_level, LERP(low_pop_maximum_threat, max_threat_level, SSticker.totalPlayersReady / low_pop_player_threshold)) + threat_level = lorentz_to_amount(threat_curve_centre, threat_curve_width, calculated_max_threat) - peaceful_percentage = round(LORENTZ_CUMULATIVE_DISTRIBUTION(relative_threat, threat_curve_centre, threat_curve_width), 0.01)*100 + for(var/datum/station_trait/station_trait in GLOB.dynamic_station_traits) + threat_level = max(threat_level - GLOB.dynamic_station_traits[station_trait], 0) + log_dynamic("Threat reduced by [GLOB.dynamic_station_traits[station_trait]]. Source: [type].") + + peaceful_percentage = (threat_level/max_threat_level)*100 /// Generates the midround and roundstart budgets /datum/game_mode/dynamic/proc/generate_budgets() - var/relative_round_start_budget_scale = LORENTZ_DISTRIBUTION(roundstart_split_curve_centre, roundstart_split_curve_width) - round_start_budget = round((lorentz_to_amount(relative_round_start_budget_scale) / 100) * threat_level, 0.1) + round_start_budget = lorentz_to_amount(roundstart_split_curve_centre, roundstart_split_curve_width, threat_level, 0.1) initial_round_start_budget = round_start_budget mid_round_budget = threat_level - round_start_budget @@ -442,6 +450,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) continue vars[variable] = configuration["Dynamic"][variable] + configure_station_trait_costs() setup_parameters() setup_hijacking() setup_shown_threat() @@ -451,11 +460,22 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) //To new_player and such, and we want the datums to just free when the roundstart work is done var/list/roundstart_rules = init_rulesets(/datum/dynamic_ruleset/roundstart) + SSjob.DivideOccupations(pure = TRUE, allow_all = TRUE) 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()) - roundstart_pop_ready++ - candidates.Add(player) + if(is_unassigned_job(player.mind.assigned_role)) + var/list/job_data = list() + var/job_prefs = player.client.prefs.job_preferences + for(var/job in job_prefs) + var/priority = job_prefs[job] + job_data += "[job]: [SSjob.job_priority_level_to_string(priority)]" + to_chat(player, span_danger("You were unable to qualify for any roundstart antagonist role this round because your job preferences presented a high chance of all of your selected jobs being unavailable, along with 'return to lobby if job is unavailable' enabled. Increase the number of roles set to medium or low priority to reduce the chances of this happening.")) + log_admin("[player.ckey] failed to qualify for any roundstart antagonist role because their job preferences presented a high chance of all of their selected jobs being unavailable, along with 'return to lobby if job is unavailable' enabled and has [player.client.prefs.be_special.len] antag preferences enabled. They will be unable to qualify for any roundstart antagonist role. These are their job preferences - [job_data.Join(" | ")]") + else + roundstart_pop_ready++ + candidates.Add(player) + SSjob.ResetOccupations() log_dynamic("Listing [roundstart_rules.len] round start rulesets, and [candidates.len] players ready.") if (candidates.len <= 0) log_dynamic("[candidates.len] candidates.") @@ -616,8 +636,10 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) if(rule.persistent) current_rules += rule new_snapshot(rule) + rule.forget_startup() return TRUE rule.clean_up() // Refund threat, delete teams and so on. + rule.forget_startup() executed_rules -= rule stack_trace("The starting rule \"[rule.name]\" failed to execute.") return FALSE @@ -665,9 +687,11 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) executed_rules += new_rule if (new_rule.persistent) current_rules += new_rule + new_rule.forget_startup() return TRUE else if (forced) log_dynamic("The ruleset [new_rule.name] couldn't be executed due to lack of elligible players.") + new_rule.forget_startup() return FALSE /datum/game_mode/dynamic/process() @@ -777,6 +801,26 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) if(CONFIG_GET(flag/protect_assistant_from_antagonist)) ruleset.restricted_roles |= JOB_ASSISTANT +/// Get station traits and call for their config +/datum/game_mode/dynamic/proc/configure_station_trait_costs() + if(!CONFIG_GET(flag/dynamic_config_enabled)) + return + for(var/datum/station_trait/station_trait as anything in GLOB.dynamic_station_traits) + configure_station_trait(station_trait) + +/// Apply configuration for station trait costs +/datum/game_mode/dynamic/proc/configure_station_trait(datum/station_trait/station_trait) + var/list/station_trait_config = LAZYACCESSASSOC(configuration, "Station", station_trait.dynamic_threat_id) + var/cost = station_trait_config["cost"] + + if(isnull(cost)) //0 is valid so check for null specifically + return + + if(cost != GLOB.dynamic_station_traits[station_trait]) + log_dynamic("Config set [station_trait.dynamic_threat_id] cost from [station_trait.threat_reduction] to [cost]") + + GLOB.dynamic_station_traits[station_trait] = cost + /// Refund threat, but no more than threat_level. /datum/game_mode/dynamic/proc/refund_threat(regain) mid_round_budget = min(threat_level, mid_round_budget + regain) @@ -807,30 +851,24 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) if (!isnull(threat_log)) log_threat(-cost, threat_log, reason) -/// Turns the value generated by lorentz distribution to number between 0 and 100. -/// Used for threat level and splitting the budgets. -/datum/game_mode/dynamic/proc/lorentz_to_amount(x) - switch (x) - if (-INFINITY to -20) - return rand(0, 10) - if (-20 to -10) - return RULE_OF_THREE(-40, -20, x) + 50 - if (-10 to -5) - return RULE_OF_THREE(-30, -10, x) + 50 - if (-5 to -2.5) - return RULE_OF_THREE(-20, -5, x) + 50 - if (-2.5 to -0) - return RULE_OF_THREE(-10, -2.5, x) + 50 - if (0 to 2.5) - return RULE_OF_THREE(10, 2.5, x) + 50 - if (2.5 to 5) - return RULE_OF_THREE(20, 5, x) + 50 - if (5 to 10) - return RULE_OF_THREE(30, 10, x) + 50 - if (10 to 20) - return RULE_OF_THREE(40, 20, x) + 50 - if (20 to INFINITY) - return rand(90, 100) +#define MAXIMUM_DYN_DISTANCE 5 + +/** + * Returns the comulative distribution of threat centre and width, and a random location of -0.5 to 0.5 + * plus or minus the otherwise unattainable lower and upper percentiles. All multiplied by the maximum + * threat and then rounded to the nearest interval. + * rand() calls without arguments returns a value between 0 and 1, allowing for smaller intervals. + */ +/datum/game_mode/dynamic/proc/lorentz_to_amount(centre = 0, scale = 1.8, max_threat = 100, interval = 1) + var/location = RANDOM_DECIMAL(-MAXIMUM_DYN_DISTANCE, MAXIMUM_DYN_DISTANCE) * rand() + var/lorentz_result = LORENTZ_CUMULATIVE_DISTRIBUTION(centre, location, scale) + var/std_threat = lorentz_result * max_threat + ///Without these, the amount won't come close to hitting 0% or 100% of the max threat. + var/lower_deviation = max(std_threat * (location-centre)/MAXIMUM_DYN_DISTANCE, 0) + var/upper_deviation = max((max_threat - std_threat) * (centre-location)/MAXIMUM_DYN_DISTANCE, 0) + return clamp(round(std_threat + upper_deviation - lower_deviation, interval), 0, 100) + +#undef MAXIMUM_DYN_DISTANCE #undef FAKE_REPORT_CHANCE #undef FAKE_GREENSHIFT_FORM_CHANCE diff --git a/code/game/gamemodes/dynamic/dynamic_midround_rolling.dm b/code/game/gamemodes/dynamic/dynamic_midround_rolling.dm index 5079035834be5..c3e295ae875fe 100644 --- a/code/game/gamemodes/dynamic/dynamic_midround_rolling.dm +++ b/code/game/gamemodes/dynamic/dynamic_midround_rolling.dm @@ -45,7 +45,11 @@ continue if (!ruleset.acceptable(GLOB.alive_player_list.len, threat_level)) - log_dynamic("FAIL: [ruleset] is not acceptable with the current parameters. Alive players: [GLOB.alive_player_list.len], threat level: [threat_level]") + var/ruleset_forced = GLOB.dynamic_forced_rulesets[type] || RULESET_NOT_FORCED + if (ruleset_forced == RULESET_NOT_FORCED) + log_dynamic("FAIL: [ruleset] is not acceptable with the current parameters. Alive players: [GLOB.alive_player_list.len], threat level: [threat_level]") + else + log_dynamic("FAIL: [ruleset] was disabled.") continue if (mid_round_budget < ruleset.cost) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets.dm b/code/game/gamemodes/dynamic/dynamic_rulesets.dm index 87147e6cd35a7..c9161963f2457 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets.dm @@ -33,6 +33,7 @@ JOB_DETECTIVE, JOB_HEAD_OF_SECURITY, JOB_SECURITY_OFFICER, + JOB_WARDEN, ) /// If enemy_roles was set, this is the amount of enemy job workers needed per threat_level range (0-10,10-20,etc) IMPORTANT: DOES NOT WORK ON ROUNDSTART RULESETS. var/required_enemies = list(1,1,0,0,0,0,0,0,0,0) @@ -105,23 +106,39 @@ /// By default, a rule is acceptable if it satisfies the threat level/population requirements. /// If your rule has extra checks, such as counting security officers, do that in ready() instead /datum/dynamic_ruleset/proc/acceptable(population = 0, threat_level = 0) - pop_per_requirement = pop_per_requirement > 0 ? pop_per_requirement : mode.pop_per_requirement - indice_pop = min(requirements.len,round(population/pop_per_requirement)+1) - - if(minimum_players > population) - log_dynamic("FAIL: [src] failed acceptable: minimum_players ([minimum_players]) > population ([population])") + var/ruleset_forced = GLOB.dynamic_forced_rulesets[type] || RULESET_NOT_FORCED + if (ruleset_forced != RULESET_NOT_FORCED) + if (ruleset_forced == RULESET_FORCE_ENABLED) + return TRUE + else + log_dynamic("FAIL: [src] was disabled in admin panel.") + return FALSE + + if(!is_valid_population(population)) + var/range = maximum_players > 0 ? "([minimum_players] - [maximum_players])" : "(minimum: [minimum_players])" + log_dynamic("FAIL: [src] failed acceptable: min/max players out of range [range] vs population ([population])") return FALSE - if(maximum_players > 0 && population > maximum_players) - log_dynamic("FAIL: [src] failed acceptable: maximum_players ([maximum_players]) < population ([population])") - return FALSE - - if (threat_level < requirements[indice_pop]) + if (!is_valid_threat(population, threat_level)) log_dynamic("FAIL: [src] failed acceptable: threat_level ([threat_level]) < requirement ([requirements[indice_pop]])") return FALSE return TRUE +/// Returns true if we have enough players to run +/datum/dynamic_ruleset/proc/is_valid_population(population) + if(minimum_players > population) + return FALSE + if(maximum_players > 0 && population > maximum_players) + return FALSE + return TRUE + +/// Sets the current threat indices and returns true if we're inside of them +/datum/dynamic_ruleset/proc/is_valid_threat(population, threat_level) + pop_per_requirement = pop_per_requirement > 0 ? pop_per_requirement : mode.pop_per_requirement + indice_pop = min(requirements.len,round(population/pop_per_requirement)+1) + return threat_level >= requirements[indice_pop] + /// When picking rulesets, if dynamic picks the same one multiple times, it will "scale up". /// However, doing this blindly would result in lowpop rounds (think under 10 people) where over 80% of the crew is antags! /// This function is here to ensure the antag ratio is kept under control while scaling up. @@ -167,6 +184,14 @@ GLOB.pre_setup_antags -= M return TRUE +/// Rulesets can be reused, so when we're done setting one up we want to wipe its memory of the people it was selecting over +/// This isn't Destroy we aren't deleting it here, rulesets free when nothing holds a ref. This is just to prevent hung refs. +/datum/dynamic_ruleset/proc/forget_startup() + SHOULD_CALL_PARENT(TRUE) + candidates = list() + assigned = list() + antag_datum = null + /// Here you can perform any additional checks you want. (such as checking the map etc) /// Remember that on roundstart no one knows what their job is at this point. /// IMPORTANT: If ready() returns TRUE, that means pre_execute() or execute() should never fail! diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm index cc03c7e4beda7..887bf04276a49 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm @@ -30,8 +30,8 @@ job_check++ // Checking for "enemies" (such as sec officers). To be counters, they must either not be candidates to that rule, or have a job that restricts them from it var/threat = round(mode.threat_level/10) - - if (job_check < required_enemies[threat]) + var/ruleset_forced = (GLOB.dynamic_forced_rulesets[type] || RULESET_NOT_FORCED) == RULESET_FORCE_ENABLED + if (!ruleset_forced && job_check < required_enemies[threat]) log_dynamic("FAIL: [src] is not ready, because there are not enough enemies: [required_enemies[threat]] needed, [job_check] found") return FALSE @@ -144,7 +144,7 @@ new_head.remove_clumsy = TRUE new_head = M.mind.add_antag_datum(new_head, revolution) revolution.update_objectives() - revolution.update_heads() + revolution.update_rev_heads() SSshuttle.registerHostileEnvironment(revolution) return TRUE else @@ -158,6 +158,10 @@ return finished = winner + + if(winner == REVOLUTION_VICTORY) + GLOB.revolutionary_win = TRUE + return RULESET_STOP_PROCESSING /// Checks for revhead loss conditions and other antag datums. diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index bf500dc75f283..93912e06899d8 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -21,6 +21,13 @@ /// Abstract root value var/abstract_type = /datum/dynamic_ruleset/midround +/datum/dynamic_ruleset/midround/forget_startup() + living_players = list() + living_antags = list() + dead_players = list() + list_observers = list() + return ..() + /datum/dynamic_ruleset/midround/from_ghosts weight = 0 required_type = /mob/dead/observer @@ -45,34 +52,42 @@ dead_players = trim_list(GLOB.dead_player_list) list_observers = trim_list(GLOB.current_observers_list) -/datum/dynamic_ruleset/midround/proc/trim_list(list/L = list()) - var/list/trimmed_list = L.Copy() - for(var/mob/M in trimmed_list) - if (!istype(M, required_type)) - trimmed_list.Remove(M) +/datum/dynamic_ruleset/midround/proc/trim_list(list/to_trim = list()) + var/list/trimmed_list = to_trim.Copy() + for(var/mob/creature in trimmed_list) + if (!istype(creature, required_type)) + trimmed_list.Remove(creature) continue - if (!M.client) // Are they connected? - trimmed_list.Remove(M) + if (isnull(creature.client)) // Are they connected? + trimmed_list.Remove(creature) continue - if(M.client.get_remaining_days(minimum_required_age) > 0) - trimmed_list.Remove(M) + if (isnull(creature.mind)) + trimmed_list.Remove(creature) continue - if (!((antag_preference || antag_flag) in M.client.prefs.be_special)) - trimmed_list.Remove(M) + if(creature.client.get_remaining_days(minimum_required_age) > 0) + trimmed_list.Remove(creature) continue - if (is_banned_from(M.ckey, list(antag_flag_override || antag_flag, ROLE_SYNDICATE))) - trimmed_list.Remove(M) + if (!((antag_preference || antag_flag) in creature.client.prefs.be_special)) + trimmed_list.Remove(creature) + continue + if (is_banned_from(creature.ckey, list(antag_flag_override || antag_flag, ROLE_SYNDICATE))) + trimmed_list.Remove(creature) + continue + if (restrict_ghost_roles && (creature.mind.assigned_role.title in GLOB.exp_specialmap[EXP_TYPE_SPECIAL])) // Are they playing a ghost role? + trimmed_list.Remove(creature) + continue + if (creature.mind.assigned_role.title in restricted_roles) // Does their job allow it? + trimmed_list.Remove(creature) + continue + if (length(exclusive_roles) && !(creature.mind.assigned_role.title in exclusive_roles)) // Is the rule exclusive to their job? + trimmed_list.Remove(creature) + continue + if(HAS_TRAIT(creature, TRAIT_MIND_TEMPORARILY_GONE)) // are they out of body? + trimmed_list.Remove(creature) + continue + if(HAS_TRAIT(creature, TRAIT_TEMPORARY_BODY)) // are they an avatar? + trimmed_list.Remove(creature) continue - if (M.mind) - if (restrict_ghost_roles && (M.mind.assigned_role.title in GLOB.exp_specialmap[EXP_TYPE_SPECIAL])) // Are they playing a ghost role? - trimmed_list.Remove(M) - continue - if (M.mind.assigned_role.title in restricted_roles) // Does their job allow it? - trimmed_list.Remove(M) - continue - if ((exclusive_roles.len > 0) && !(M.mind.assigned_role.title in exclusive_roles)) // Is the rule exclusive to their job? - trimmed_list.Remove(M) - continue return trimmed_list // You can then for example prompt dead players in execute() to join as strike teams or whatever @@ -93,8 +108,8 @@ job_check++ // Checking for "enemies" (such as sec officers). To be counters, they must either not be candidates to that rule, or have a job that restricts them from it var/threat = round(mode.threat_level/10) - - if (job_check < required_enemies[threat]) + var/ruleset_forced = (GLOB.dynamic_forced_rulesets[type] || RULESET_NOT_FORCED) == RULESET_FORCE_ENABLED + if (!ruleset_forced && job_check < required_enemies[threat]) log_dynamic("FAIL: [src] is not ready, because there are not enough enemies: [required_enemies[threat]] needed, [job_check] found") return FALSE @@ -345,6 +360,7 @@ JOB_DETECTIVE, JOB_HEAD_OF_SECURITY, JOB_SECURITY_OFFICER, + JOB_WARDEN, ) required_enemies = list(3,3,3,3,3,2,1,1,0,0) required_candidates = 5 @@ -356,10 +372,8 @@ flags = HIGH_IMPACT_RULESET var/list/operative_cap = list(2,2,3,3,4,5,5,5,5,5) - /// The nuke ops team datum. - var/datum/team/nuclear/nuke_team -/datum/dynamic_ruleset/midround/from_ghosts/nuclear/acceptable(population=0, threat=0) +/datum/dynamic_ruleset/midround/from_ghosts/nuclear/acceptable(population=0, threat_level=0) if (locate(/datum/dynamic_ruleset/roundstart/nuclear) in mode.executed_rules) return FALSE // Unavailable if nuke ops were already sent at roundstart indice_pop = min(operative_cap.len, round(living_players.len/5)+1) @@ -383,7 +397,6 @@ new_character.mind.special_role = ROLE_NUCLEAR_OPERATIVE if(index == 1) var/datum/antagonist/nukeop/leader/leader_antag_datum = new() - nuke_team = leader_antag_datum.nuke_team new_character.mind.add_antag_datum(leader_antag_datum) return return ..() @@ -469,10 +482,15 @@ repeatable = TRUE var/list/vents = list() +/datum/dynamic_ruleset/midround/from_ghosts/xenomorph/forget_startup() + vents = list() + return ..() + /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) + var/list/vent_pumps = SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/atmospherics/components/unary/vent_pump) + for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent as anything in vent_pumps) if(QDELETED(temp_vent)) continue if(is_station_level(temp_vent.loc.z) && !temp_vent.welded) @@ -510,7 +528,7 @@ minimum_players = 15 repeatable = TRUE -/datum/dynamic_ruleset/midround/from_ghosts/nightmare/acceptable(population = 0, threat = 0) +/datum/dynamic_ruleset/midround/from_ghosts/nightmare/acceptable(population = 0, threat_level = 0) var/turf/spawn_loc = find_maintenance_spawn(atmos_sensitive = TRUE, require_darkness = TRUE) //Checks if there's a single safe, dark tile on station. if(!spawn_loc) return FALSE @@ -547,6 +565,10 @@ repeatable = TRUE var/list/spawn_locs = list() +/datum/dynamic_ruleset/midround/from_ghosts/space_dragon/forget_startup() + spawn_locs = list() + return ..() + /datum/dynamic_ruleset/midround/from_ghosts/space_dragon/execute() for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list) spawn_locs += (C.loc) @@ -585,6 +607,10 @@ var/datum/team/abductor_team/new_team +/datum/dynamic_ruleset/midround/from_ghosts/abductors/forget_startup() + new_team = null + return ..() + /datum/dynamic_ruleset/midround/from_ghosts/abductors/ready(forced = FALSE) if (required_candidates > (dead_players.len + list_observers.len)) return FALSE @@ -617,6 +643,10 @@ var/list/spawn_locs = list() +/datum/dynamic_ruleset/midround/from_ghosts/space_ninja/forget_startup() + spawn_locs = list() + return ..() + /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)) @@ -671,7 +701,11 @@ var/need_extra_spawns_value = 15 var/list/spawn_locs = list() -/datum/dynamic_ruleset/midround/from_ghosts/revenant/acceptable(population=0, threat=0) +/datum/dynamic_ruleset/midround/from_ghosts/revenant/forget_startup() + spawn_locs = list() + return ..() + +/datum/dynamic_ruleset/midround/from_ghosts/revenant/acceptable(population=0, threat_level=0) if(GLOB.dead_mob_list.len < dead_mobs_required) return FALSE return ..() @@ -734,7 +768,7 @@ minimum_players = 20 repeatable = TRUE -/datum/dynamic_ruleset/midround/pirates/acceptable(population=0, threat=0) +/datum/dynamic_ruleset/midround/pirates/acceptable(population=0, threat_level=0) if (SSmapping.is_planetary() || GLOB.light_pirate_gangs.len == 0) return FALSE return ..() @@ -756,7 +790,7 @@ minimum_players = 25 repeatable = TRUE -/datum/dynamic_ruleset/midround/dangerous_pirates/acceptable(population=0, threat=0) +/datum/dynamic_ruleset/midround/dangerous_pirates/acceptable(population=0, threat_level=0) if (SSmapping.is_planetary() || GLOB.heavy_pirate_gangs.len == 0) return FALSE return ..() @@ -834,6 +868,7 @@ JOB_DETECTIVE, JOB_HEAD_OF_SECURITY, JOB_SECURITY_OFFICER, + JOB_WARDEN, ) required_enemies = list(2, 2, 1, 1, 1, 1, 1, 0, 0, 0) required_candidates = 1 @@ -842,6 +877,10 @@ repeatable = TRUE var/list/possible_spawns = list() ///places the antag can spawn +/datum/dynamic_ruleset/midround/from_ghosts/paradox_clone/forget_startup() + possible_spawns = list() + return ..() + /datum/dynamic_ruleset/midround/from_ghosts/paradox_clone/execute() possible_spawns += find_maintenance_spawn(atmos_sensitive = TRUE, require_darkness = FALSE) if(!possible_spawns.len) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index 133038f3af662..a90eba738c146 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -1,3 +1,4 @@ +GLOBAL_VAR_INIT(revolutionary_win, FALSE) ////////////////////////////////////////////// // // @@ -120,6 +121,10 @@ var/list/datum/team/brother_team/pre_brother_teams = list() var/const/min_team_size = 2 +/datum/dynamic_ruleset/roundstart/traitorbro/forget_startup() + pre_brother_teams = list() + return ..() + /datum/dynamic_ruleset/roundstart/traitorbro/pre_execute(population) . = ..() var/num_teams = (get_antag_cap(population)/min_team_size) * (scaled_times + 1) // 1 team per scaling @@ -225,6 +230,7 @@ scaling_cost = 9 requirements = list(101,101,60,30,30,25,20,15,10,10) antag_cap = list("denominator" = 24) + ruleset_lazy_templates = list(LAZY_TEMPLATE_KEY_HERETIC_SACRIFICE) /datum/dynamic_ruleset/roundstart/heretics/pre_execute(population) @@ -554,7 +560,7 @@ log_dynamic("[ruletype] [name] discarded [M.name] from head revolutionary due to ineligibility.") if(revolution.members.len) revolution.update_objectives() - revolution.update_heads() + revolution.update_rev_heads() SSshuttle.registerHostileEnvironment(revolution) return TRUE log_dynamic("[ruletype] [name] failed to get any eligible headrevs. Refunding [cost] threat.") @@ -570,6 +576,10 @@ return finished = winner + + if(winner == REVOLUTION_VICTORY) + GLOB.revolutionary_win = TRUE + return RULESET_STOP_PROCESSING /// Checks for revhead loss conditions and other antag datums. @@ -627,16 +637,17 @@ /datum/dynamic_ruleset/roundstart/nuclear/clown_ops/pre_execute() . = ..() - if(.) - var/obj/machinery/nuclearbomb/syndicate/syndicate_nuke = locate() in GLOB.nuke_list - if(syndicate_nuke) - var/turf/nuke_turf = get_turf(syndicate_nuke) - if(nuke_turf) - new /obj/machinery/nuclearbomb/syndicate/bananium(nuke_turf) - qdel(syndicate_nuke) - for(var/datum/mind/clowns in assigned) - clowns.set_assigned_role(SSjob.GetJobType(/datum/job/clown_operative)) - clowns.special_role = ROLE_CLOWN_OPERATIVE + if(!.) + return + + var/list/nukes = SSmachines.get_machines_by_type(/obj/machinery/nuclearbomb/syndicate) + for(var/obj/machinery/nuclearbomb/syndicate/nuke as anything in nukes) + new /obj/machinery/nuclearbomb/syndicate/bananium(nuke.loc) + qdel(nuke) + + for(var/datum/mind/clowns in assigned) + clowns.set_assigned_role(SSjob.GetJobType(/datum/job/clown_operative)) + clowns.special_role = ROLE_CLOWN_OPERATIVE ////////////////////////////////////////////// // // diff --git a/code/game/gamemodes/dynamic/readme.md b/code/game/gamemodes/dynamic/readme.md index e584ac4ee4a4e..d663e88a23929 100644 --- a/code/game/gamemodes/dynamic/readme.md +++ b/code/game/gamemodes/dynamic/readme.md @@ -130,6 +130,11 @@ The format of this file is: "Latejoin": { /* Same as "Roundstart", but for `/datum/dynamic_ruleset/latejoin` instead. */ + }, + + "Station": { + /* Special threat reductions for dangerous station traits. Traits are selected before dynamic, so traits will always */ + /* reduce threat even if there's no threat for it available. Only "cost" can be modified */ } } ``` diff --git a/code/game/gamemodes/dynamic/ruleset_picking.dm b/code/game/gamemodes/dynamic/ruleset_picking.dm index 5d907e6580cd0..0ef6299e159eb 100644 --- a/code/game/gamemodes/dynamic/ruleset_picking.dm +++ b/code/game/gamemodes/dynamic/ruleset_picking.dm @@ -98,11 +98,12 @@ message_admins("[key_name(M)] joined the station, and was selected by the [rule.name] ruleset.") log_dynamic("[key_name(M)] joined the station, and was selected by the [rule.name] ruleset.") executed_rules += rule - rule.candidates.Cut() if (rule.persistent) current_rules += rule new_snapshot(rule) + rule.forget_startup() return TRUE + rule.forget_startup() rule.clean_up() stack_trace("The [rule.ruletype] rule \"[rule.name]\" failed to execute.") return FALSE diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index 6819805c0c6c6..8810ffc0fc6ee 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -8,14 +8,15 @@ */ /proc/power_failure() priority_announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", ANNOUNCER_POWEROFF) - for(var/obj/machinery/power/smes/S in GLOB.machines) - if(istype(get_area(S), /area/station/ai_monitored/turret_protected) || !is_station_level(S.z)) + var/list/all_smes = SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/smes) + for(var/obj/machinery/power/smes/smes as anything in all_smes) + if(istype(get_area(smes), /area/station/ai_monitored/turret_protected) || !is_station_level(smes.z)) continue - S.charge = 0 - S.output_level = 0 - S.output_attempt = FALSE - S.update_appearance() - S.power_change() + smes.charge = 0 + smes.output_level = 0 + smes.output_attempt = FALSE + smes.update_appearance() + smes.power_change() for(var/area/station_area as anything in GLOB.areas) if(!station_area.z || !is_station_level(station_area.z)) @@ -30,7 +31,7 @@ station_area.power_environ = FALSE station_area.power_change() - for(var/obj/machinery/power/apc/C in GLOB.apcs_list) + for(var/obj/machinery/power/apc/C as anything in SSmachines.get_machines_by_type_and_subtypes(/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]) @@ -45,18 +46,20 @@ */ /proc/power_restore() priority_announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", ANNOUNCER_POWERON) - for(var/obj/machinery/power/apc/C in GLOB.apcs_list) + for(var/obj/machinery/power/apc/C as anything in SSmachines.get_machines_by_type_and_subtypes(/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) - if(!is_station_level(S.z)) + var/list/all_smes = SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/smes) + for(var/obj/machinery/power/smes/smes as anything in all_smes) + if(!is_station_level(smes.z)) continue - S.charge = S.capacity - S.output_level = S.output_level_max - S.output_attempt = TRUE - S.update_appearance() - S.power_change() + smes.charge = smes.capacity + smes.output_level = smes.output_level_max + smes.output_attempt = TRUE + smes.update_appearance() + smes.power_change() + for(var/area/station_area as anything in GLOB.areas) if(!station_area.z || !is_station_level(station_area.z)) continue @@ -79,11 +82,12 @@ */ /proc/power_restore_quick() priority_announce("All SMESs on [station_name()] have been recharged. We apologize for the inconvenience.", "Power Systems Nominal", ANNOUNCER_POWERON) - for(var/obj/machinery/power/smes/S in GLOB.machines) - if(!is_station_level(S.z)) + var/list/all_smes = SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/smes) + for(var/obj/machinery/power/smes/smes as anything in all_smes) + if(!is_station_level(smes.z)) continue - S.charge = S.capacity - S.output_level = S.output_level_max - S.output_attempt = TRUE - S.update_appearance() - S.power_change() + smes.charge = smes.capacity + smes.output_level = smes.output_level_max + smes.output_attempt = TRUE + smes.update_appearance() + smes.power_change() diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 6470b2e9c7e3c..61037fe4c774d 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -56,15 +56,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 +/// Checks if the round should be ending, called every ticker tick +/datum/game_mode/proc/check_finished() if(!SSticker.setup_done) return FALSE if(SSshuttle.emergency && (SSshuttle.emergency.mode == SHUTTLE_ENDGAME)) return TRUE if(GLOB.station_was_nuked) return TRUE - if(force_ending) + if(GLOB.revolutionary_win) return TRUE + return FALSE /* * Generate a list of station goals available to purchase to report to the crew. diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 019ade57089f6..d61d80b257829 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -94,6 +94,10 @@ GLOBAL_LIST(admin_objective_list) //Prefilled admin assignable objective list /datum/objective/proc/check_completion() return completed +/// Provides a string describing what a good job you did or did not do +/datum/objective/proc/get_roundend_success_suffix() + return check_completion() ? span_greentext("Success!") : span_redtext("Fail.") + /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") @@ -170,7 +174,7 @@ GLOBAL_LIST(admin_objective_list) //Prefilled admin assignable objective list 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)) + if(!receiver_current.equip_in_one_of_slots(equipment_object, slots, indirect_action = TRUE)) LAZYINITLIST(receiver.failed_special_equipment) receiver.failed_special_equipment += equipment_path receiver.try_give_equipment_fallback() @@ -222,18 +226,46 @@ GLOBAL_LIST(admin_objective_list) //Prefilled admin assignable objective list /datum/objective/assassinate/admin_edit(mob/admin) admin_simple_target_pick(admin) +#define DISCONNECT_GRACE_TIME (2 MINUTES) +#define DISCONNECT_GRACE_WARNING_TIME (1 MINUTES) + /datum/objective/mutiny name = "mutiny" martyr_compatible = 1 var/target_role_type = FALSE + /// Not primarily used as a cooldown but a timer to give a little bit more of a chance for the player to reconnect. + COOLDOWN_DECLARE(disconnect_timer) + /// Whether admins have been warned about the potentially AFK player + var/warned_admins = FALSE +/datum/objective/mutiny/proc/warn_admins() + message_admins("[ADMIN_LOOKUPFLW(target.current)] has gone AFK with a mutiny objective that involves them. They only have [COOLDOWN_TIMELEFT(src, disconnect_timer) / 10] seconds remaining before they are treated as if they were dead.") /datum/objective/mutiny/check_completion() - if(!target || !considered_alive(target) || considered_afk(target) || considered_exiled(target)) + if(!target || !considered_alive(target) || considered_exiled(target)) return TRUE + + if(considered_afk(target)) + if(!COOLDOWN_STARTED(src, disconnect_timer)) + COOLDOWN_START(src, disconnect_timer, DISCONNECT_GRACE_TIME) + warn_admins() + else if(COOLDOWN_FINISHED(src, disconnect_timer)) + return TRUE + else if(COOLDOWN_TIMELEFT(src, disconnect_timer) <= DISCONNECT_GRACE_WARNING_TIME && !warned_admins) + warned_admins = TRUE + warn_admins() + else + COOLDOWN_RESET(src, disconnect_timer) + warned_admins = FALSE + var/turf/T = get_turf(target.current) return !T || !is_station_level(T.z) +#undef DISCONNECT_GRACE_TIME +#undef DISCONNECT_GRACE_WARNING_TIME + + + /datum/objective/mutiny/update_explanation_text() ..() if(target?.current) @@ -578,12 +610,6 @@ GLOBAL_LIST_EMPTY(possible_items) /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, list/blacklist) var/list/datum/mind/owners = get_owners() if(!dupe_search_range) @@ -935,7 +961,7 @@ GLOBAL_LIST_EMPTY(possible_items) continue //this is an objective item var/obj/item/organ/wanted = stolen - if(!(wanted.organ_flags & ORGAN_FAILING) && !(wanted.organ_flags & ORGAN_SYNTHETIC)) + if(!(wanted.organ_flags & ORGAN_FAILING) && !IS_ROBOTIC_ORGAN(wanted)) stolen_count++ return stolen_count >= amount @@ -949,6 +975,9 @@ GLOBAL_LIST_EMPTY(possible_items) if(expl) explanation_text = expl +/datum/objective/custom/get_roundend_success_suffix() + return "" // Just print the objective with no success/fail evaluation, as it has no mechanical backing + //Ideally this would be all of them but laziness and unusual subtypes /proc/generate_admin_objective_list() GLOB.admin_objective_list = list() diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 0a06a71c081f6..9627f48cbb501 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -124,6 +124,40 @@ targetitem = /obj/item/clothing/shoes/clown_shoes excludefromjob = list(JOB_CLOWN, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER) item_owner = list(JOB_CLOWN) + exists_on_map = TRUE + +/obj/item/clothing/shoes/clown_shoes/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/clothing/shoes/clown_shoes) + +/datum/objective_item/steal/traitor/mime_mask + name = "the mime's mask" + targetitem = /obj/item/clothing/mask/gas/mime + excludefromjob = list(JOB_MIME, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER) + item_owner = list(JOB_MIME) + exists_on_map = TRUE + +/obj/item/clothing/mask/gas/mime/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/clothing/mask/gas/mime) + +/datum/objective_item/steal/traitor/pka + name = "a protokinetic accelerator" + targetitem = /obj/item/gun/energy/recharge/kinetic_accelerator + excludefromjob = list(JOB_SHAFT_MINER, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER) + item_owner = list(JOB_SHAFT_MINER) + exists_on_map = TRUE + +/obj/item/gun/energy/recharge/kinetic_accelerator/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/gun/energy/recharge/kinetic_accelerator) + +/datum/objective_item/steal/traitor/chef_moustache + name = "a fancy fake moustache" + targetitem = /obj/item/clothing/mask/fakemoustache/italian + excludefromjob = list(JOB_COOK, JOB_HEAD_OF_PERSONNEL, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER) + item_owner = list(JOB_COOK) + exists_on_map = TRUE + +/obj/item/clothing/mask/fakemoustache/italian/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/clothing/mask/fakemoustache/italian) /datum/objective_item/steal/traitor/det_revolver name = "detective's revolver" @@ -134,6 +168,16 @@ /obj/item/gun/ballistic/revolver/c38/detective/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/gun/ballistic/revolver/c38/detective) +/datum/objective_item/steal/traitor/lawyers_badge + name = "the lawyer's badge" + targetitem = /obj/item/clothing/accessory/lawyers_badge + excludefromjob = list(JOB_LAWYER) + item_owner = list(JOB_LAWYER) + exists_on_map = TRUE + +/obj/item/clothing/accessory/lawyers_badge/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/clothing/accessory/lawyers_badge) + /datum/objective_item/steal/traitor/chief_engineer_belt name = "the chief engineer's belt" targetitem = /obj/item/storage/belt/utility/chief @@ -216,6 +260,16 @@ /obj/item/gun/energy/e_gun/hos/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/gun/energy/e_gun/hos) +/datum/objective_item/steal/compactshotty + name = "the head of security's personal compact shotgun" + targetitem = /obj/item/gun/ballistic/shotgun/automatic/combat/compact + excludefromjob = list(JOB_HEAD_OF_SECURITY) + item_owner = list(JOB_HEAD_OF_SECURITY) + exists_on_map = TRUE + +/obj/item/gun/ballistic/shotgun/automatic/combat/compact/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/gun/ballistic/shotgun/automatic/combat/compact) + /datum/objective_item/steal/handtele name = "a hand teleporter" targetitem = /obj/item/hand_tele @@ -299,6 +353,7 @@ /datum/objective_item/steal/documents name = "any set of secret documents of any organization" + valid_containers = list(/obj/item/folder) targetitem = /obj/item/documents exists_on_map = TRUE @@ -362,7 +417,8 @@ being = card.AI // why is this one capitalized and the other one not? i wish i knew. else if(istype(potential_storage, /obj/item/mod/control)) var/obj/item/mod/control/suit = potential_storage - being = suit.ai + if(isAI(suit.ai_assistant)) + being = suit.ai_assistant else stack_trace("check_special_completion() called on [src] with [potential_storage] ([potential_storage.type])! That's not supposed to happen!") return FALSE @@ -400,3 +456,79 @@ /obj/item/blackbox/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/blackbox) + + +// A number of special early-game steal objectives intended to be used with the steal-and-destroy objective. +// They're basically items of utility or emotional value that may be found on many players or lying around the station. +/datum/objective_item/steal/traitor/insuls + name = "insulated gloves" + targetitem = /obj/item/clothing/gloves/color/yellow + excludefromjob = list(JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER, JOB_ATMOSPHERIC_TECHNICIAN, JOB_STATION_ENGINEER, JOB_CHIEF_ENGINEER) + item_owner = list(JOB_STATION_ENGINEER, JOB_CHIEF_ENGINEER) + exists_on_map = TRUE + +/obj/item/clothing/gloves/color/yellow/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/clothing/gloves/color/yellow) + +/datum/objective_item/steal/traitor/moth_plush + name = "cute moth plush toy" + targetitem = /obj/item/toy/plush/moth + excludefromjob = list(JOB_PSYCHOLOGIST, JOB_PARAMEDIC, JOB_CHEMIST, JOB_MEDICAL_DOCTOR, JOB_VIROLOGIST, JOB_CHIEF_MEDICAL_OFFICER, JOB_CORONER) + exists_on_map = TRUE + +/obj/item/toy/plush/moth/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/toy/plush/moth) + +/datum/objective_item/steal/traitor/lizard_plush + name = "cute lizard plush toy" + targetitem = /obj/item/toy/plush/lizard_plushie + exists_on_map = TRUE + +/obj/item/toy/plush/lizard_plushie/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/toy/plush/lizard_plushie) + +/datum/objective_item/steal/traitor/denied_stamp + name = "cargo's denied stamp" + targetitem = /obj/item/stamp/denied + excludefromjob = list(JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER, JOB_SHAFT_MINER) + exists_on_map = TRUE + +/obj/item/stamp/denied/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/stamp/denied) + +/datum/objective_item/steal/traitor/granted_stamp + name = "cargo's granted stamp" + targetitem = /obj/item/stamp/granted + excludefromjob = list(JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER, JOB_SHAFT_MINER) + exists_on_map = TRUE + +/obj/item/stamp/granted/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/stamp/granted) + +/datum/objective_item/steal/traitor/space_law + name = "a book on space law" + targetitem = /obj/item/book/manual/wiki/security_space_law + excludefromjob = list(JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_HEAD_OF_SECURITY, JOB_LAWYER, JOB_DETECTIVE) + exists_on_map = TRUE + +/obj/item/book/manual/wiki/security_space_law/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/book/manual/wiki/security_space_law) + +/datum/objective_item/steal/traitor/rpd + name = "rapid pipe dispenser" + targetitem = /obj/item/pipe_dispenser + excludefromjob = list(JOB_ATMOSPHERIC_TECHNICIAN, JOB_STATION_ENGINEER, JOB_CHIEF_ENGINEER, JOB_SCIENTIST, JOB_RESEARCH_DIRECTOR, JOB_GENETICIST, JOB_ROBOTICIST) + item_owner = list(JOB_CHIEF_ENGINEER) + exists_on_map = TRUE + +/obj/item/pipe_dispenser/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/pipe_dispenser) + +/datum/objective_item/steal/traitor/donut_box + name = "a box of prized donuts" + targetitem = /obj/item/storage/fancy/donut_box + excludefromjob = list(JOB_CAPTAIN, JOB_CHIEF_ENGINEER, JOB_HEAD_OF_PERSONNEL, JOB_HEAD_OF_SECURITY, JOB_QUARTERMASTER, JOB_CHIEF_MEDICAL_OFFICER, JOB_RESEARCH_DIRECTOR, JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_LAWYER, JOB_DETECTIVE) + exists_on_map = TRUE + +/obj/item/storage/fancy/donut_box/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/storage/fancy/donut_box) diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index cce8697c0c8f6..c9680744fcbff 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -2,7 +2,7 @@ /obj/machinery/pdapainter name = "\improper Tablet & ID Painter" desc = "A painting machine that can be used to paint PDAs and trim IDs. To use, simply insert the item and choose the desired preset." - icon = 'icons/obj/pda.dmi' + icon = 'icons/obj/machines/pda.dmi' icon_state = "pdapainter" base_icon_state = "pdapainter" density = TRUE @@ -93,11 +93,12 @@ if(stored_id_card) SSexplosions.low_mov_atom += stored_id_card -/obj/machinery/pdapainter/handle_atom_del(atom/A) - if(A == stored_pda) +/obj/machinery/pdapainter/Exited(atom/movable/gone, direction) + . = ..() + if(gone == stored_pda) stored_pda = null update_appearance(UPDATE_ICON) - if(A == stored_id_card) + if(gone == stored_id_card) stored_id_card = null update_appearance(UPDATE_ICON) @@ -110,7 +111,7 @@ /obj/machinery/pdapainter/attackby(obj/item/O, mob/living/user, params) if(machine_stat & BROKEN) if(O.tool_behaviour == TOOL_WELDER && !user.combat_mode) - if(!O.tool_start_check(user, amount=0)) + if(!O.tool_start_check(user, amount=1)) return user.visible_message(span_notice("[user] is repairing [src]."), \ span_notice("You begin repairing [src]..."), \ @@ -335,6 +336,12 @@ stored_pda.icon_state = initial(pda_path.icon_state) stored_pda.desc = initial(pda_path.desc) + return TRUE + if("reset_pda") + if((machine_stat & BROKEN) || !stored_pda) + return TRUE + + stored_pda.reset_imprint() return TRUE if("trim_card") if((machine_stat & BROKEN) || !stored_id_card) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index a5b700df55974..d245a0a317d81 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -86,12 +86,12 @@ */ /obj/machinery name = "machinery" - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/machines/fax.dmi' desc = "Some kind of machine." verb_say = "beeps" verb_yell = "blares" pressure_resistance = 15 - pass_flags_self = PASSMACHINE + pass_flags_self = PASSMACHINE | LETPASSCLICKS max_integrity = 200 layer = BELOW_OBJ_LAYER //keeps shit coming out of the machine from ending up underneath it. flags_ricochet = RICOCHET_HARD @@ -100,7 +100,7 @@ anchored = TRUE interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT blocks_emissive = EMISSIVE_BLOCK_GENERIC - initial_language_holder = /datum/language_holder/synthetic + initial_language_holder = /datum/language_holder/speaking_machine var/machine_stat = NONE var/use_power = IDLE_POWER_USE @@ -163,7 +163,7 @@ /obj/machinery/Initialize(mapload) . = ..() - GLOB.machines += src + SSmachines.register_machine(src) if(ispath(circuit, /obj/item/circuitboard)) circuit = new circuit(src) @@ -194,18 +194,12 @@ setup_area_power_relationship() /obj/machinery/Destroy() - GLOB.machines.Remove(src) + SSmachines.unregister_machine(src) end_processing() - dump_inventory_contents() - if (!isnull(component_parts)) - // Don't delete the stock part singletons - for (var/atom/atom_part in component_parts) - qdel(atom_part) - component_parts.Cut() - component_parts = null + clear_components() + dump_contents() - QDEL_NULL(circuit) unset_static_power() return ..() @@ -311,13 +305,17 @@ /obj/machinery/emp_act(severity) . = ..() - if(use_power && !machine_stat && !(. & EMP_PROTECT_SELF)) - use_power(7500/severity) - new /obj/effect/temp_visual/emp(loc) + if(!use_power || machine_stat || (. & EMP_PROTECT_SELF)) + return + use_power(7500/severity) + new /obj/effect/temp_visual/emp(loc) - if(prob(70/severity)) - var/datum/language_holder/machine_languages = get_language_holder() - machine_languages.selected_language = machine_languages.get_random_spoken_language() + if(!prob(70/severity)) + return + if (!length(GLOB.uncommon_roundstart_languages)) + return + remove_all_languages(source = LANGUAGE_EMP) + grant_random_uncommon_language(source = LANGUAGE_EMP) /** * Opens the machine. @@ -364,6 +362,10 @@ /obj/machinery/proc/dump_inventory_contents(list/subset = null) var/turf/this_turf = get_turf(src) for(var/atom/movable/movable_atom in contents) + //so machines like microwaves dont dump out signalers after cooking + if(wires && (movable_atom in flatten_list(wires.assemblies))) + continue + if(subset && !(movable_atom in subset)) continue @@ -813,6 +815,7 @@ new datum_part.physical_object_type(loc) else var/obj/item/obj_part = part + component_parts -= part obj_part.forceMove(loc) if(istype(obj_part, /obj/item/circuitboard/machine)) var/obj/item/circuitboard/machine/board = obj_part @@ -874,21 +877,33 @@ if(EXPLODE_LIGHT) SSexplosions.low_mov_atom += occupant -/obj/machinery/handle_atom_del(atom/deleting_atom) - if(deleting_atom == occupant) +/obj/machinery/Exited(atom/movable/gone, direction) + . = ..() + if(gone == occupant) set_occupant(null) update_appearance() - updateUsrDialog() - return ..() // The circuit should also be in component parts, so don't early return. - if(deleting_atom == circuit) + if(gone == circuit) circuit = null - if((deleting_atom in component_parts) && !QDELETED(src)) - component_parts.Remove(deleting_atom) + if((gone in component_parts) && !QDELETED(src)) + component_parts -= gone // It would be unusual for a component_part to be qdel'd ordinarily. deconstruct(FALSE) - return ..() + +/** + * This should be called before mass qdeling components to make space for replacements. + * If not done, things will go awry as Exited() destroys the machine when it detects + * even a single component exiting the atom. + */ +/obj/machinery/proc/clear_components() + if(!component_parts) + return + var/list/old_components = component_parts + circuit = null + component_parts = null + for(var/atom/atom_part in old_components) + qdel(atom_part) /obj/machinery/proc/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver) if((flags_1 & NODECONSTRUCT_1) || screwdriver.tool_behaviour != TOOL_SCREWDRIVER) @@ -911,6 +926,7 @@ wrench.play_tool_sound(src, 50) setDir(turn(dir,-90)) to_chat(user, span_notice("You rotate [src].")) + SEND_SIGNAL(src, COMSIG_MACHINERY_DEFAULT_ROTATE_WRENCH, user, wrench) return TRUE /obj/machinery/proc/exchange_parts(mob/user, obj/item/storage/part_replacer/replacer_tool) @@ -1005,7 +1021,7 @@ else physical_part = primary_part_base - replacer_tool.atom_storage.attempt_insert(physical_part, user, TRUE) + replacer_tool.atom_storage.attempt_insert(physical_part, user, TRUE, force = STORAGE_SOFT_LOCKED) to_chat(user, span_notice("[capitalize(physical_part.name)] replaced with [secondary_part_name].")) shouldplaysound = TRUE //Only play the sound when parts are actually replaced! break @@ -1106,20 +1122,12 @@ if(prob(85) && (zap_flags & ZAP_MACHINE_EXPLOSIVE) && !(resistance_flags & INDESTRUCTIBLE)) explosion(src, devastation_range = 1, heavy_impact_range = 2, light_impact_range = 4, flame_range = 2, adminlog = FALSE, smoke = FALSE) else if(zap_flags & ZAP_OBJ_DAMAGE) - take_damage(power * 0.0005, BURN, ENERGY) + take_damage(power * 6.25e-7, BURN, ENERGY) if(prob(40)) emp_act(EMP_LIGHT) - power -= power * 0.0005 + power -= power * 5e-4 return ..() -/obj/machinery/Exited(atom/movable/gone, direction) - . = ..() - if(gone == occupant) - set_occupant(null) - if(gone == circuit) - LAZYREMOVE(component_parts, gone) - circuit = null - /obj/machinery/proc/adjust_item_drop_location(atom/movable/dropped_atom) // Adjust item drop location to a 3x3 grid inside the tile, returns slot id from 0 to 8 var/md5 = md5(dropped_atom.name) // Oh, and it's deterministic too. A specific item will always drop from the same slot. for (var/i in 1 to 32) diff --git a/code/game/machinery/airlock_control.dm b/code/game/machinery/airlock_control.dm index 8a18bd0397619..f4d1b29da186f 100644 --- a/code/game/machinery/airlock_control.dm +++ b/code/game/machinery/airlock_control.dm @@ -6,10 +6,6 @@ var/airlock_state var/frequency -/obj/machinery/door/airlock/Initialize(mapload) - . = ..() - RegisterSignal(SSdcs, COMSIG_GLOB_GREY_TIDE, PROC_REF(grey_tide)) - /// Forces the airlock to unbolt and open /obj/machinery/door/airlock/proc/secure_open() locked = FALSE @@ -35,19 +31,8 @@ locked = FALSE return ..() -/obj/machinery/door/airlock/proc/grey_tide(datum/source, list/grey_tide_areas) - SIGNAL_HANDLER - - if(!is_station_level(z) || critical_machine) - return //Skip doors in critical positions, such as the SM chamber. - - for(var/area_type in grey_tide_areas) - if(!istype(get_area(src), area_type)) - continue - INVOKE_ASYNC(src, PROC_REF(prison_open)) //Sleep gets called further down in open(), so we have to invoke async - /obj/machinery/airlock_sensor - icon = 'icons/obj/airlock_machines.dmi' + icon = 'icons/obj/machines/wallmounts.dmi' icon_state = "airlock_sensor_off" base_icon_state = "airlock_sensor" name = "airlock sensor" diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index 87f2a9f01c889..df3e402525d16 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -176,8 +176,10 @@ GLOBAL_LIST_EMPTY(announcement_systems) if(!(machine_stat & (NOPOWER|BROKEN)) && !(. & EMP_PROTECT_SELF)) act_up() -/obj/machinery/announcement_system/emag_act() +/obj/machinery/announcement_system/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE obj_flags |= EMAGGED act_up() + balloon_alert(user, "announcement strings corrupted") + return TRUE diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 60fd0711426b4..946bdb6d6cbef 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -1,6 +1,7 @@ /obj/machinery/autolathe name = "autolathe" desc = "It produces items using iron, glass, plastic and maybe some more." + icon = 'icons/obj/machines/lathes.dmi' icon_state = "autolathe" density = TRUE active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.5 @@ -21,15 +22,29 @@ ///Designs imported from technology disks that we can print. var/list/imported_designs = list() + ///The container to hold materials + var/datum/component/material_container/materials + + ///direction we output onto (if 0, on top of us) + var/drop_direction = 0 + /obj/machinery/autolathe/Initialize(mapload) - AddComponent(/datum/component/material_container, SSmaterials.materials_by_category[MAT_CATEGORY_ITEM_MATERIAL], 0, MATCONTAINER_EXAMINE, _after_insert = CALLBACK(src, PROC_REF(AfterMaterialInsert))) + materials = AddComponent( \ + /datum/component/material_container, \ + SSmaterials.materials_by_category[MAT_CATEGORY_ITEM_MATERIAL], \ + 0, \ + MATCONTAINER_EXAMINE, \ + container_signals = list(COMSIG_MATCONTAINER_ITEM_CONSUMED = TYPE_PROC_REF(/obj/machinery/autolathe, AfterMaterialInsert)) \ + ) . = ..() - wires = new /datum/wires/autolathe(src) + + set_wires(new /datum/wires/autolathe(src)) if(!GLOB.autounlock_techwebs[/datum/techweb/autounlocking/autolathe]) GLOB.autounlock_techwebs[/datum/techweb/autounlocking/autolathe] = new /datum/techweb/autounlocking/autolathe stored_research = GLOB.autounlock_techwebs[/datum/techweb/autounlocking/autolathe] /obj/machinery/autolathe/Destroy() + materials = null QDEL_NULL(wires) return ..() @@ -47,7 +62,7 @@ ui.open() /obj/machinery/autolathe/ui_static_data(mob/user) - var/list/data = list() + var/list/data = materials.ui_static_data() data["designs"] = handle_designs(stored_research.researched_designs) if(imported_designs.len) @@ -61,10 +76,7 @@ var/list/data = list() data["materials"] = list() - - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - - data["materialtotal"] = materials.total_amount + data["materialtotal"] = materials.total_amount() data["materialsmax"] = materials.max_amount data["active"] = busy data["materials"] = materials.ui_data() @@ -77,63 +89,38 @@ var/datum/asset/spritesheet/research_designs/spritesheet = get_asset_datum(/datum/asset/spritesheet/research_designs) var/size32x32 = "[spritesheet.name]32x32" + var/max_multiplier = INFINITY for(var/design_id in designs) var/datum/design/design = SSresearch.techweb_design_by_id(design_id) + if(design.make_reagent) + continue - var/unbuildable = FALSE // we can't build the design currently - var/m10 = FALSE // 10x mult - var/m25 = FALSE // 25x mult - var/m50 = FALSE // 50x mult - var/m5 = FALSE // 5x mult - var/sheets = FALSE // sheets or no? - - if(disabled || !can_build(design)) - unbuildable = TRUE + //compute cost & maximum number of printable items + max_multiplier = INFINITY + var/coeff = (ispath(design.build_path, /obj/item/stack) ? 1 : creation_efficiency) + var/list/cost = list() + for(var/i in design.materials) + var/datum/material/mat = i - var/max_multiplier = unbuildable ? 0 : 1 + var/design_cost = OPTIMAL_COST(design.materials[i] * coeff) + if(istype(mat)) + cost[mat.name] = design_cost + else + cost[i] = design_cost - if(ispath(design.build_path, /obj/item/stack)) - sheets = TRUE - - if(!unbuildable) - var/datum/component/material_container/mats = GetComponent(/datum/component/material_container) - - for(var/datum/material/mat in design.materials) - max_multiplier = min(design.maxstack, round(mats.get_material_amount(mat) / design.materials[mat])) - if (max_multiplier >= 10 && !disabled) - m10 = TRUE - if (max_multiplier >= 25 && !disabled) - m25 = TRUE - else - if(!unbuildable) - if(!disabled && can_build(design, 5)) - m5 = TRUE - if(!disabled && can_build(design, 10)) - m10 = TRUE - - var/datum/component/material_container/mats = GetComponent(/datum/component/material_container) - - for(var/datum/material/mat in design.materials) - max_multiplier = min(50, round(mats.get_material_amount(mat) / (design.materials[mat] * creation_efficiency))) + max_multiplier = min(max_multiplier, 50, round((istype(mat) ? materials.get_material_amount(i) : 0) / design_cost)) + //create & send ui data var/icon_size = spritesheet.icon_size_id(design.id) - var/list/design_data = list( "name" = design.name, "desc" = design.get_description(), - "cost" = get_design_cost(design), + "cost" = cost, "id" = design.id, "categories" = design.category, "icon" = "[icon_size == size32x32 ? "" : "[icon_size] "][design.id]", "constructionTime" = -1, - - "buildable" = unbuildable, - "mult5" = m5, - "mult10" = m10, - "mult25" = m25, - "mult50" = m50, - "sheet" = sheets, - "maxmult" = max_multiplier, + "maxmult" = max_multiplier ) output += list(design_data) @@ -152,85 +139,81 @@ return if(action == "make") + if(disabled) + say("The autolathe wires are disabled.") + return + if(busy) + say("The autolathe is busy. Please wait for completion of previous operation.") + return + + if(isclosedturf(get_step(src, drop_direction))) + say("Output is obstructed.") + return + var/design_id = params["id"] if(!istext(design_id)) return - if(!stored_research.researched_designs.Find(design_id) && !stored_research.hacked_designs.Find(design_id) && !imported_designs.Find(design_id)) return - var/datum/design/design = SSresearch.techweb_design_by_id(design_id) - if(!(design.build_type & AUTOLATHE) || design.id != design_id) return - if (busy) - to_chat(usr, span_alert("The autolathe is busy. Please wait for completion of previous operation.")) - return - being_built = design + var/is_stack = ispath(being_built.build_path, /obj/item/stack) + var/coeff = (is_stack ? 1 : creation_efficiency) // Stacks are unaffected by production coefficient var/multiplier = round(text2num(params["multiplier"])) - if(!multiplier || !IS_FINITE(multiplier)) return - - var/is_stack = ispath(being_built.build_path, /obj/item/stack) multiplier = clamp(multiplier, 1, 50) - var/coeff = (is_stack ? 1 : creation_efficiency) // Stacks are unaffected by production coefficient - var/total_amount = 0 - - for(var/material in being_built.materials) - total_amount += being_built.materials[material] - - var/power = max(active_power_usage, (total_amount)*multiplier/5) // Change this to use all materials - - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - + //check for materials var/list/materials_used = list() var/list/custom_materials = list() // These will apply their material effect, should usually only be one. - for(var/mat in being_built.materials) var/datum/material/used_material = mat - var/amount_needed = being_built.materials[mat] * coeff * multiplier + var/amount_needed = being_built.materials[mat] if(istext(used_material)) // This means its a category var/list/list_to_show = list() - + //list all materials in said category for(var/i in SSmaterials.materials_by_category[used_material]) if(materials.materials[i] > 0) list_to_show += i - + //ask user to pick specific material from list used_material = tgui_input_list( usr, "Choose [used_material]", "Custom Material", sort_list(list_to_show, GLOBAL_PROC_REF(cmp_typepaths_asc)) ) - if(isnull(used_material)) - // Didn't pick any material, so you can't build shit either. return - + //the item composition will be made of these materials custom_materials[used_material] += amount_needed - materials_used[used_material] = amount_needed - if(materials.has_materials(materials_used)) - busy = TRUE - to_chat(usr, span_notice("You print [multiplier] item(s) from the [src]")) - use_power(power) - icon_state = "autolathe_n" - var/time = is_stack ? 32 : (32 * coeff * multiplier) ** 0.8 - addtimer(CALLBACK(src, PROC_REF(make_item), power, materials_used, custom_materials, multiplier, coeff, is_stack, usr), time) - . = TRUE - else - to_chat(usr, span_alert("Not enough materials for this operation.")) + if(!materials.has_materials(materials_used, coeff, multiplier)) + say("Not enough materials for this operation!.") + return -/obj/machinery/autolathe/on_deconstruction() - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - materials.retrieve_all() + //use power + var/total_amount = 0 + for(var/material in being_built.materials) + total_amount += being_built.materials[material] + use_power(max(active_power_usage, (total_amount) * multiplier / 5)) + + //use materials + materials.use_materials(materials_used, coeff, multiplier) + to_chat(usr, span_notice("You print [multiplier] item(s) from the [src]")) + update_static_data_for_all_viewers() + //print item + icon_state = "autolathe_n" + var/time_per_item = is_stack ? 32 : ((32 * coeff * multiplier) ** 0.8) / multiplier + make_items(custom_materials, multiplier, is_stack, usr, time_per_item) + + return TRUE /obj/machinery/autolathe/attackby(obj/item/attacking_item, mob/living/user, params) if(busy) @@ -302,8 +285,10 @@ return SECONDARY_ATTACK_CALL_NORMAL -/obj/machinery/autolathe/proc/AfterMaterialInsert(obj/item/item_inserted, id_inserted, amount_inserted) - if(istype(item_inserted, /obj/item/stack/ore/bluespace_crystal)) +/obj/machinery/autolathe/proc/AfterMaterialInsert(container, obj/item/item_inserted, last_inserted_id, mats_consumed, amount_inserted, atom/context) + SIGNAL_HANDLER + + if(ispath(item_inserted, /obj/item/stack/ore/bluespace_crystal)) use_power(SHEET_MATERIAL_AMOUNT / 10) else if(item_inserted.has_material_type(/datum/material/glass)) flick("autolathe_r", src)//plays glass insertion animation by default otherwise @@ -311,28 +296,52 @@ flick("autolathe_o", src)//plays metal insertion animation use_power(min(active_power_usage * 0.25, amount_inserted / 100)) + update_static_data_for_all_viewers() -/obj/machinery/autolathe/proc/make_item(power, list/materials_used, list/picked_materials, multiplier, coeff, is_stack, mob/user) - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - var/atom/A = drop_location() - use_power(power) - - materials.use_materials(materials_used) - - if(is_stack) - var/obj/item/stack/N = new being_built.build_path(A, multiplier, FALSE) - N.update_appearance() - else - for(var/i in 1 to multiplier) - var/obj/item/new_item = new being_built.build_path(A) +/obj/machinery/autolathe/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) + . = ..() + if((!issilicon(usr) && !isAdminGhostAI(usr)) && !Adjacent(usr)) + return + var/direction = get_dir(src, over_location) + if(!direction) + return + drop_direction = direction + balloon_alert(usr, "dropping [dir2text(drop_direction)]") + +/obj/machinery/autolathe/proc/make_items(list/picked_materials, multiplier, is_stack, mob/user, time_per_item) + var/atom/our_loc = drop_location() + var/atom/drop_loc = get_step(src, drop_direction) + var/client_awarded = FALSE + + busy = TRUE + SStgui.update_uis(src) //so ui immediatly knows its busy + while(multiplier > 0) + if(!busy) + break + stoplag(time_per_item) + var/obj/item/new_item + if(is_stack) + new_item = new being_built.build_path(our_loc, multiplier) + else + new_item = new being_built.build_path(our_loc) + //custom materials for toolboxes 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) + if(!client_awarded) //so we dont award the medal multiple times + for(var/datum/material/mat in picked_materials) + if(!istype(mat, /datum/material/glass) && !istype(mat, /datum/material/iron)) + user.client.give_award(/datum/award/achievement/misc/getting_an_upgrade, user) + client_awarded = TRUE + + //no need to call if ontop of us + if(drop_direction) + new_item.Move(drop_loc) + //multiplier already applied in stack initialization. work done + if(is_stack) + break + multiplier-- icon_state = "autolathe" busy = FALSE @@ -341,8 +350,7 @@ . = ..() var/mat_capacity = 0 for(var/datum/stock_part/matter_bin/new_matter_bin in component_parts) - mat_capacity += new_matter_bin.tier * 75000 - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) + mat_capacity += new_matter_bin.tier * (37.5*SHEET_MATERIAL_AMOUNT) materials.max_amount = mat_capacity var/efficiency=1.8 @@ -352,39 +360,19 @@ /obj/machinery/autolathe/examine(mob/user) . += ..() - 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]%.") - -/obj/machinery/autolathe/proc/can_build(datum/design/D, amount = 1) - if(D.make_reagent) - return FALSE - - var/coeff = (ispath(D.build_path, /obj/item/stack) ? 1 : creation_efficiency) - - var/list/required_materials = list() - - for(var/i in D.materials) - required_materials[i] = D.materials[i] * coeff * amount - - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - - return materials.has_materials(required_materials) - - -/obj/machinery/autolathe/proc/get_design_cost(datum/design/design) - var/coeff = (ispath(design.build_path, /obj/item/stack) ? 1 : creation_efficiency) - var/list/cost = list() - - for(var/material in design.materials) - if (istext(material)) - // Wildcard materials - cost[material] = design.materials[material] * coeff + if(drop_direction) + . += span_notice("Currently configured to drop printed objects [dir2text(drop_direction)].") + . += span_notice("Alt-click to reset.") else - var/datum/material/cast = material - cost[cast.name] = design.materials[cast] * coeff + . += span_notice("Drag towards a direction (while next to it) to change drop direction.") - return cost +/obj/machinery/autolathe/AltClick(mob/user) + . = ..() + if(drop_direction) + balloon_alert(user, "drop direction reset") + drop_direction = 0 /obj/machinery/autolathe/proc/reset(wire) switch(wire) diff --git a/code/game/machinery/bank_machine.dm b/code/game/machinery/bank_machine.dm index 28fd60db4e04e..4d276b6ebae0f 100644 --- a/code/game/machinery/bank_machine.dm +++ b/code/game/machinery/bank_machine.dm @@ -1,6 +1,7 @@ /obj/machinery/computer/bank_machine name = "bank machine" desc = "A machine used to deposit and withdraw station funds." + circuit = /obj/item/circuitboard/computer/bankmachine icon_screen = "vault" icon_keyboard = "security_key" req_access = list(ACCESS_VAULT) @@ -34,6 +35,9 @@ radio.recalculateChannels() synced_bank_account = SSeconomy.get_dep_account(account_department) + if(!mapload) + AddComponent(/datum/component/gps, "Forbidden Cash Signal") + /obj/machinery/computer/bank_machine/Destroy() QDEL_NULL(radio) synced_bank_account = null @@ -112,15 +116,14 @@ /obj/machinery/computer/bank_machine/proc/end_siphon() siphoning = FALSE unauthorized = FALSE - new /obj/item/holochip(drop_location(), syphoning_credits) //get the loot + if(syphoning_credits > 0) + new /obj/item/holochip(drop_location(), syphoning_credits) //get the loot syphoning_credits = 0 /obj/machinery/computer/bank_machine/proc/start_siphon(mob/living/carbon/user) - siphoning = TRUE - unauthorized = FALSE var/obj/item/card/id/card = user.get_idcard(hand_first = TRUE) - if(!istype(card)) - return - if(!check_access(card)) - return - unauthorized = TRUE + if(!istype(card) || !check_access(card)) + unauthorized = TRUE + else + unauthorized = FALSE + siphoning = TRUE diff --git a/code/game/machinery/barsigns.dm b/code/game/machinery/barsigns.dm index 2883f9c4bbbf6..b8cee2553565a 100644 --- a/code/game/machinery/barsigns.dm +++ b/code/game/machinery/barsigns.dm @@ -1,7 +1,7 @@ /obj/machinery/barsign // All Signs are 64 by 32 pixels, they take two tiles name = "bar sign" desc = "A bar sign which has not been initialized, somehow. Complain at a coder!" - icon = 'icons/obj/barsigns.dmi' + icon = 'icons/obj/machines/barsigns.dmi' icon_state = "empty" req_access = list(ACCESS_BAR) max_integrity = 500 @@ -24,6 +24,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/barsign, 32) /obj/machinery/barsign/Initialize(mapload) . = ..() set_sign(new /datum/barsign/hiddensigns/signoff) + find_and_hang_on_wall() /obj/machinery/barsign/proc/set_sign(datum/barsign/sign) if(!istype(sign)) @@ -169,15 +170,18 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/barsign, 32) set_sign(sign) -/obj/machinery/barsign/emag_act(mob/user) +/obj/machinery/barsign/emag_act(mob/user, obj/item/card/emag/emag_card) if(machine_stat & (NOPOWER|BROKEN|EMPED)) balloon_alert(user, "controls are unresponsive!") - return + return FALSE balloon_alert(user, "illegal barsign loaded") - sleep(10 SECONDS) - set_sign(new /datum/barsign/hiddensigns/syndibarsign) + addtimer(CALLBACK(src, PROC_REF(finish_emag_act)), 10 SECONDS) + return TRUE +/// Timer proc, called after ~10 seconds after [emag_act], since [emag_act] returns a value and cannot sleep +/obj/machinery/barsign/proc/finish_emag_act() + set_sign(new /datum/barsign/hiddensigns/syndibarsign) /obj/machinery/barsign/proc/pick_sign(mob/user) var/picked_name = tgui_input_list(user, "Available Signage", "Bar Sign", sort_list(get_bar_names())) diff --git a/code/game/machinery/botlaunchpad.dm b/code/game/machinery/botlaunchpad.dm index 6ff39e3960bb2..f77e11151e03e 100644 --- a/code/game/machinery/botlaunchpad.dm +++ b/code/game/machinery/botlaunchpad.dm @@ -1,7 +1,7 @@ /obj/machinery/botpad name = "Bot pad" desc = "A lighter version of the orbital mech pad modified to launch bots. Requires linking to a remote to function." - icon = 'icons/obj/telescience.dmi' + icon = 'icons/obj/machines/telepad.dmi' icon_state = "botpad" circuit = /obj/item/circuitboard/machine/botpad // ID of the console, used for linking up @@ -26,8 +26,8 @@ if(!multitool_check_buffer(user, tool)) return var/obj/item/multitool/multitool = tool - multitool.buffer = src - to_chat(user, span_notice("You save the data in the [multitool.name]'s buffer.")) + multitool.set_buffer(src) + balloon_alert(user, "saved to multitool buffer") return TOOL_ACT_TOOLTYPE_SUCCESS diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 737b01cb33ac0..5824f93dcc736 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -1,7 +1,7 @@ /obj/machinery/button name = "button" desc = "A remote control switch." - icon = 'icons/obj/buttons.dmi' + icon = 'icons/obj/machines/wallmounts.dmi' base_icon_state = "button" icon_state = "button" ///Icon suffix for the skin of the front pannel that is added to base_icon_state @@ -55,6 +55,7 @@ board.accesses = req_one_access setup_device() + find_and_hang_on_wall() /obj/machinery/button/Destroy() QDEL_NULL(device) @@ -139,7 +140,7 @@ else return ..() -/obj/machinery/button/emag_act(mob/user) +/obj/machinery/button/emag_act(mob/user, obj/item/card/emag/emag_card) . = ..() if(obj_flags & EMAGGED) return @@ -150,9 +151,9 @@ // The device inside can be emagged by swiping the button // returning TRUE will prevent feedback (so we can do our own) - if(device?.emag_act(user)) - return - balloon_alert(user, "access overridden") + if(!device?.emag_act(user, emag_card)) + balloon_alert(user, "access overridden") + return TRUE /obj/machinery/button/attack_ai(mob/user) if(!silicon_access_disabled && !panel_open) @@ -233,6 +234,20 @@ device.pulsed(user) SEND_GLOBAL_SIGNAL(COMSIG_GLOB_BUTTON_PRESSED,src) +/** + * Called when the mounted button's wall is knocked down. + */ +/obj/machinery/button/proc/knock_down() + if(device) + device.forceMove(get_turf(src)) + device = null + if(board) + board.forceMove(get_turf(src)) + req_access = list() + req_one_access = list() + board = null + qdel(src) + /obj/machinery/button/door name = "door button" desc = "A door remote control switch." diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index a4616a201eae6..da13377b2f523 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -18,7 +18,6 @@ var/status = TRUE var/start_active = FALSE //If it ignores the random chance to start broken on round start var/invuln = null - var/obj/item/camera_bug/bug = null var/datum/weakref/assembly_ref = null var/area/myarea = null @@ -31,7 +30,6 @@ var/busy = FALSE var/emped = FALSE //Number of consecutive EMP's on this camera var/in_use_lights = 0 - // Upgrades bitflag var/upgrades = 0 @@ -105,6 +103,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) update_appearance() alarm_manager = new(src) + find_and_hang_on_wall(directional = TRUE, \ + custom_drop_callback = CALLBACK(src, PROC_REF(deconstruct), FALSE)) + + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) /obj/machinery/camera/connect_to_shuttle(mapload, obj/docking_port/mobile/port, obj/docking_port/stationary/dock) for(var/i in network) @@ -129,12 +131,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) LAZYREMOVE(myarea.cameras, src) QDEL_NULL(alarm_manager) QDEL_NULL(assembly_ref) - if(bug) - bug.bugged_cameras -= c_tag - if(bug.current == src) - bug.current = null - bug = null - QDEL_NULL(last_shown_paper) return ..() @@ -162,7 +158,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) if(!status && powered()) . += span_info("It can reactivated with wirecutters.") -/obj/machinery/camera/emp_act(severity) +/obj/machinery/camera/emp_act(severity, reset_time = 90 SECONDS) . = ..() if(!status) return @@ -175,7 +171,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) set_light(0) emped = emped+1 //Increase the number of consecutive EMP's update_appearance() - addtimer(CALLBACK(src, PROC_REF(post_emp_reset), emped, network), 90 SECONDS) + addtimer(CALLBACK(src, PROC_REF(post_emp_reset), emped, network), reset_time) for(var/i in GLOB.player_list) var/mob/M = i if (M.client?.eye == src) @@ -183,6 +179,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) M.reset_perspective(null) to_chat(M, span_warning("The screen bursts into static!")) +/obj/machinery/camera/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + emp_act(EMP_LIGHT, reset_time = disrupt_duration) + return COMSIG_SABOTEUR_SUCCESS + /obj/machinery/camera/proc/post_emp_reset(thisemp, previous_network) if(QDELETED(src)) return @@ -195,13 +196,20 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) if(can_use()) GLOB.cameranet.addCamera(src) emped = 0 //Resets the consecutive EMP count - addtimer(CALLBACK(src, PROC_REF(cancelCameraAlarm)), 100) + addtimer(CALLBACK(src, PROC_REF(cancelCameraAlarm)), 10 SECONDS) /obj/machinery/camera/ex_act(severity, target) if(invuln) return FALSE return ..() +/obj/machinery/camera/attack_ai(mob/living/silicon/ai/user) + if (!istype(user)) + return + if (!can_use()) + return + user.switchCamera(src) + /obj/machinery/camera/proc/setViewRange(num = 7) src.view_range = num GLOB.cameranet.updateVisibility(src, 0) @@ -285,7 +293,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) if(!panel_open) return - if(!I.tool_start_check(user, amount=0)) + if(!I.tool_start_check(user, amount=2)) return TRUE to_chat(user, span_notice("You start to weld [src]...")) @@ -415,21 +423,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) to_chat(potential_viewer, "[span_name(user)] holds \a [item_name] up to your camera...") return - - if(istype(attacking_item, /obj/item/camera_bug)) - if(!can_use()) - to_chat(user, span_notice("Camera non-functional.")) - return - if(bug) - to_chat(user, span_notice("Camera bug removed.")) - bug.bugged_cameras -= src.c_tag - bug = null - else - to_chat(user, span_notice("Camera bugged.")) - bug = attacking_item - bug.bugged_cameras[src.c_tag] = WEAKREF(src) - return - return ..() @@ -536,7 +529,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) /obj/machinery/camera/proc/can_see() var/list/see = null var/turf/pos = get_turf(src) - var/turf/directly_above = SSmapping.get_turf_above(pos) + var/turf/directly_above = GET_TURF_ABOVE(pos) var/check_lower = pos != get_lowest_turf(pos) var/check_higher = directly_above && istransparentturf(directly_above) && (pos != get_highest_turf(pos)) @@ -546,23 +539,22 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) see = get_hear(view_range, pos) if(check_lower || check_higher) // Haha datum var access KILL ME - var/datum/controller/subsystem/mapping/local_mapping = SSmapping for(var/turf/seen in see) if(check_lower) var/turf/visible = seen while(visible && istransparentturf(visible)) - var/turf/below = local_mapping.get_turf_below(visible) + var/turf/below = GET_TURF_BELOW(visible) for(var/turf/adjacent in range(1, below)) see += adjacent see += adjacent.contents visible = below if(check_higher) - var/turf/above = local_mapping.get_turf_above(seen) + var/turf/above = GET_TURF_ABOVE(seen) while(above && istransparentturf(above)) for(var/turf/adjacent in range(1, above)) see += adjacent see += adjacent.contents - above = local_mapping.get_turf_above(above) + above = GET_TURF_ABOVE(above) return see /obj/machinery/camera/proc/Togglelight(on=0) diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 69732938de3f2..786a2c3a39a7e 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -67,13 +67,15 @@ . = ..() if(building) setDir(ndir) + find_and_hang_on_wall() /obj/structure/camera_assembly/update_icon_state() icon_state = "[xray_module ? "xray" : null][initial(icon_state)]" return ..() -/obj/structure/camera_assembly/handle_atom_del(atom/A) - if(A == xray_module) +/obj/structure/camera_assembly/Exited(atom/movable/gone, direction) + . = ..() + if(gone == xray_module) xray_module = null update_appearance() if(malf_xray_firmware_present) @@ -82,7 +84,7 @@ var/obj/machinery/camera/contained_camera = loc contained_camera.removeXRay(malf_xray_firmware_present) //make sure we don't remove MALF upgrades. - else if(A == emp_module) + else if(gone == emp_module) emp_module = null if(malf_emp_firmware_present) malf_emp_firmware_active = malf_emp_firmware_present //re-enable firmware based upgrades after the part is removed. @@ -90,14 +92,12 @@ var/obj/machinery/camera/contained_camera = loc contained_camera.removeEmpProof(malf_emp_firmware_present) //make sure we don't remove MALF upgrades - else if(A == proxy_module) + else if(gone == proxy_module) emp_module = null if(istype(loc, /obj/machinery/camera)) var/obj/machinery/camera/contained_camera = loc contained_camera.removeMotion() - return ..() - /obj/structure/camera_assembly/Destroy() QDEL_NULL(xray_module) @@ -125,11 +125,11 @@ if(state != STATE_WRENCHED && state != STATE_WELDED) return . = TRUE - if(!tool.tool_start_check(user, amount=3)) + if(!tool.tool_start_check(user, amount=1)) return user.balloon_alert_to_viewers("[state == STATE_WELDED ? "un" : null]welding...") audible_message(span_hear("You hear welding.")) - if(!tool.use_tool(src, user, 2 SECONDS, amount=3, volume = 50)) + if(!tool.use_tool(src, user, 2 SECONDS, volume = 50)) user.balloon_alert_to_viewers("stopped [state == STATE_WELDED ? "un" : null]welding!") return state = ((state == STATE_WELDED) ? STATE_WRENCHED : STATE_WELDED) diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm index a00a1c8bf8557..f73a786865cbf 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 SSmachines.get_machines_by_type_and_subtypes(/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 SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/computer/security/telescreen/entertainment)) TV.notify(FALSE) diff --git a/code/game/machinery/camera/trackable.dm b/code/game/machinery/camera/trackable.dm new file mode 100644 index 0000000000000..8aedd1b80a847 --- /dev/null +++ b/code/game/machinery/camera/trackable.dm @@ -0,0 +1,128 @@ +///How many ticks to try to find a target before giving up. +#define CAMERA_TICK_LIMIT 10 + +/datum/trackable + ///Boolean on whether or not we are currently trying to track something. + var/tracking = FALSE + ///Reference to the atom that owns us, used for tracking. + var/atom/tracking_holder + + ///If there is a mob currently being tracked, this will be the weakref to it. + var/datum/weakref/tracked_mob + ///How many times we've failed to locate our target. + var/cameraticks = 0 + + ///List of all names that can be tracked. + VAR_PRIVATE/list/names = list() + ///List of all namecounts for mobs with the exact same name, just in-case. + VAR_PRIVATE/list/namecounts = list() + ///List of all humans trackable by cameras. + VAR_PRIVATE/static/list/humans = list() + ///List of all non-humans trackable by cameras, split so humans take priority. + VAR_PRIVATE/static/list/others = list() + +/datum/trackable/New(atom/source) + . = ..() + tracking_holder = source + RegisterSignal(tracking_holder, COMSIG_MOB_RESET_PERSPECTIVE, PROC_REF(cancel_target_tracking)) + +/datum/trackable/Destroy(force, ...) + tracking_holder = null + tracked_mob = null + STOP_PROCESSING(SSprocessing, src) + return ..() + +/datum/trackable/process() + var/mob/living/tracked_target = tracked_mob?.resolve() + if(!tracked_target || !tracking) + set_tracking(FALSE) + return + + if(tracked_target.can_track(tracking_holder)) + cameraticks = initial(cameraticks) + SEND_SIGNAL(tracking_holder, COMSIG_TRACKABLE_TRACKING_TARGET, tracked_target) + return + + if(cameraticks < CAMERA_TICK_LIMIT) + if(!cameraticks) + to_chat(tracking_holder, span_warning("Target is not near any active cameras. Attempting to reacquire...")) + cameraticks++ + return + + to_chat(tracking_holder, span_warning("Unable to reacquire, cancelling track...")) + cameraticks = initial(cameraticks) + set_tracking(FALSE) + +///Generates a list of trackable people by name, returning a list of Humans + Non-Humans that can be tracked. +/datum/trackable/proc/find_trackable_mobs() + RETURN_TYPE(/list) + + names.Cut() + namecounts.Cut() + + humans.Cut() + others.Cut() + + for(var/mob/living/living_mob as anything in GLOB.mob_living_list) + if(!living_mob.can_track(usr)) + continue + + var/name = living_mob.name + while(name in names) + namecounts[name]++ + name = "[name] ([namecounts[name]])" + names.Add(name) + namecounts[name] = 1 + + if(ishuman(living_mob)) + humans[name] = WEAKREF(living_mob) + else + others[name] = WEAKREF(living_mob) + + var/list/targets = sort_list(humans) + sort_list(others) + return targets + +///Toggles whether or not we're tracking something. Arg is whether it's on or off. +/datum/trackable/proc/set_tracking(on = FALSE) + if(on) + START_PROCESSING(SSprocessing, src) + tracking = TRUE + else + STOP_PROCESSING(SSprocessing, src) + tracking = FALSE + tracked_mob = null + +///Called by Signals, used to cancel tracking of a target. +/datum/trackable/proc/cancel_target_tracking(atom/source) + SIGNAL_HANDLER + set_tracking(FALSE) + +/** + * set_tracked_mob + * + * Sets a mob as being tracked, if a target is already provided then it will track that directly, + * otherwise it will give a tgui input list to find targets to track. + * Args: + * tracker - The person trying to track, used for feedback messages. This is not the same as tracking_holder + * tracked_mob_name - (Optional) The person being tracked, to skip the input list. + */ +/datum/trackable/proc/set_tracked_mob(mob/living/tracker, tracked_mob_name) + if(!tracker || tracker.stat == DEAD) + return + + if(tracked_mob_name) + find_trackable_mobs() //this is in case the tracked mob is newly/no-longer in camera field of view. + tracked_mob = isnull(humans[tracked_mob_name]) ? others[tracked_mob_name] : humans[tracked_mob_name] + if(isnull(tracked_mob)) + to_chat(tracker, span_notice("Target is not on or near any active cameras. Tracking failed.")) + return + to_chat(tracker, span_notice("Now tracking [tracked_mob_name] on camera.")) + else + var/target_name = tgui_input_list(tracker, "Select a target", "Tracking", find_trackable_mobs()) + if(!target_name || isnull(target_name)) + return + tracked_mob = isnull(humans[target_name]) ? others[target_name] : humans[target_name] + + set_tracking(TRUE) + +#undef CAMERA_TICK_LIMIT diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm deleted file mode 100644 index fb73bf305c0fc..0000000000000 --- a/code/game/machinery/camera/tracking.dm +++ /dev/null @@ -1,158 +0,0 @@ -/mob/living/silicon/ai/proc/get_camera_list() - var/list/L = list() - for (var/obj/machinery/camera/C as anything in GLOB.cameranet.cameras) - L.Add(C) - - camera_sort(L) - - var/list/T = list() - - for (var/obj/machinery/camera/C in L) - var/list/tempnetwork = C.network&src.network - if (length(tempnetwork)) - T["[C.c_tag][C.can_use() ? null : " (Deactivated)"]"] = C - - return T - -/mob/living/silicon/ai/proc/show_camera_list() - var/list/cameras = get_camera_list() - var/camera = tgui_input_list(src, "Choose which camera you want to view", "Cameras", cameras) - if(isnull(camera)) - return - if(isnull(cameras[camera])) - return - switchCamera(cameras[camera]) - -/datum/trackable - var/initialized = FALSE - var/list/names = list() - var/list/namecounts = list() - var/list/humans = list() - var/list/others = list() - -/mob/living/silicon/ai/proc/trackable_mobs() - track.initialized = TRUE - track.names.Cut() - track.namecounts.Cut() - track.humans.Cut() - track.others.Cut() - - if(usr.stat == DEAD) - return list() - - for(var/i in GLOB.mob_living_list) - var/mob/living/L = i - if(!L.can_track(usr)) - continue - - var/name = L.name - while(name in track.names) - track.namecounts[name]++ - name = "[name] ([track.namecounts[name]])" - track.names.Add(name) - track.namecounts[name] = 1 - - if(ishuman(L)) - track.humans[name] = WEAKREF(L) - else - track.others[name] = WEAKREF(L) - - var/list/targets = sort_list(track.humans) + sort_list(track.others) - - return targets - -/mob/living/silicon/ai/verb/ai_camera_track(target_name in trackable_mobs()) - set name = "track" - set hidden = TRUE //Don't display it on the verb lists. This verb exists purely so you can type "track Oldman Robustin" and follow his ass - - if(!target_name) - return - - if(!track.initialized) - trackable_mobs() - - var/datum/weakref/target = (isnull(track.humans[target_name]) ? track.others[target_name] : track.humans[target_name]) - - ai_actual_track(target?.resolve()) - -/mob/living/silicon/ai/proc/ai_actual_track(mob/living/target) - if(!istype(target)) - return - var/mob/living/silicon/ai/U = usr - - U.cameraFollow = target - U.tracking = 1 - - if(!target || !target.can_track(usr)) - to_chat(U, span_warning("Target is not near any active cameras.")) - U.cameraFollow = null - return - - to_chat(U, span_notice("Now tracking [target.get_visible_name()] on camera.")) - - INVOKE_ASYNC(src, PROC_REF(do_track), target, U) - -/mob/living/silicon/ai/proc/do_track(mob/living/target, mob/living/silicon/ai/U) - var/cameraticks = 0 - - while(U.cameraFollow == target) - if(U.cameraFollow == null) - return - - if(!target.can_track(usr)) - U.tracking = TRUE - if(!cameraticks) - to_chat(U, span_warning("Target is not near any active cameras. Attempting to reacquire...")) - cameraticks++ - if(cameraticks > 9) - U.cameraFollow = null - to_chat(U, span_warning("Unable to reacquire, cancelling track...")) - tracking = FALSE - return - else - sleep(1 SECONDS) - continue - - else - cameraticks = 0 - U.tracking = FALSE - - if(U.eyeobj) - U.eyeobj.setLoc(get_turf(target)) - - else - view_core() - U.cameraFollow = null - return - - sleep(1 SECONDS) - -/proc/near_camera(mob/living/M) - if (!isturf(M.loc)) - return FALSE - if(issilicon(M)) - var/mob/living/silicon/S = M - if((QDELETED(S.builtInCamera) || !S.builtInCamera.can_use()) && !GLOB.cameranet.checkCameraVis(M)) - return FALSE - else if(!GLOB.cameranet.checkCameraVis(M)) - return FALSE - return TRUE - -/obj/machinery/camera/attack_ai(mob/living/silicon/ai/user) - if (!istype(user)) - return - if (!can_use()) - return - user.switchCamera(src) - -/proc/camera_sort(list/L) - var/obj/machinery/camera/a - var/obj/machinery/camera/b - - for (var/i = length(L), i > 0, i--) - for (var/j = 1 to i - 1) - a = L[j] - b = L[j + 1] - if (sorttext(a.c_tag, b.c_tag) < 0) - L.Swap(j, j + 1) - return L diff --git a/code/game/machinery/canister_frame.dm b/code/game/machinery/canister_frame.dm index f09bf77480337..2e00aed027330 100644 --- a/code/game/machinery/canister_frame.dm +++ b/code/game/machinery/canister_frame.dm @@ -1,7 +1,7 @@ //Canister Frames /obj/structure/canister_frame name = "canister frame" - icon = 'icons/obj/atmospherics/atmos.dmi' + icon = 'icons/obj/pipes_n_cables/atmos.dmi' icon_state = "frame_0" density = TRUE diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 7773b3c1b5878..5f3aa91a6b34b 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -1,7 +1,7 @@ /obj/machinery/cell_charger name = "cell charger" desc = "It charges power cells." - icon = 'icons/obj/power.dmi' + icon = 'icons/obj/machines/cell_charger.dmi' icon_state = "ccharger" power_channel = AREA_USAGE_EQUIP circuit = /obj/item/circuitboard/machine/cell_charger @@ -20,10 +20,10 @@ . += "ccharger-o[newlevel]" . += image(charging.icon, charging.icon_state) if(charging.grown_battery) - . += mutable_appearance('icons/obj/power.dmi', "grown_wires") + . += mutable_appearance('icons/obj/machines/cell_charger.dmi', "grown_wires") . += "ccharger-[charging.connector_type]-on" if((charging.charge > 0.01) && charging.charge_light_type) - . += mutable_appearance('icons/obj/power.dmi', "cell-[charging.charge_light_type]-o[(charging.percent() >= 99.5) ? 2 : 1]") + . += mutable_appearance('icons/obj/machines/cell_charger.dmi', "cell-[charging.charge_light_type]-o[(charging.percent() >= 99.5) ? 2 : 1]") /obj/machinery/cell_charger/examine(mob/user) . = ..() diff --git a/code/game/machinery/civilian_bounties.dm b/code/game/machinery/civilian_bounties.dm index 1953a7f0c3276..2d284b17b670e 100644 --- a/code/game/machinery/civilian_bounties.dm +++ b/code/game/machinery/civilian_bounties.dm @@ -8,6 +8,31 @@ layer = TABLE_LAYER resistance_flags = FIRE_PROOF circuit = /obj/item/circuitboard/machine/bountypad + var/cooldown_reduction = 0 + +/obj/machinery/piratepad/civilian/screwdriver_act(mob/living/user, obj/item/tool) + . = ..() + if(!.) + return default_deconstruction_screwdriver(user, "lpad-idle-open", "lpad-idle-off", tool) + +/obj/machinery/piratepad/civilian/crowbar_act(mob/living/user, obj/item/tool) + . = ..() + if(!.) + return default_deconstruction_crowbar(tool) + +/obj/machinery/piratepad/civilian/RefreshParts() + . = ..() + var/T = -2 + for(var/datum/stock_part/micro_laser/micro_laser in component_parts) + T += micro_laser.tier + + for(var/datum/stock_part/scanning_module/scanning_module in component_parts) + T += scanning_module.tier + + cooldown_reduction = T * (30 SECONDS) + +/obj/machinery/piratepad/civilian/proc/get_cooldown_reduction() + return cooldown_reduction ///Computer for assigning new civilian bounties, and sending bounties for collection. /obj/machinery/computer/piratepad_control/civilian @@ -38,7 +63,7 @@ /obj/machinery/computer/piratepad_control/civilian/LateInitialize() . = ..() if(cargo_hold_id) - for(var/obj/machinery/piratepad/civilian/C in GLOB.machines) + for(var/obj/machinery/piratepad/civilian/C as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/piratepad/civilian)) if(C.cargo_hold_id == cargo_hold_id) pad_ref = WEAKREF(C) return @@ -58,7 +83,7 @@ playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE) return FALSE status_report = "Civilian Bounty: " - var/obj/machinery/piratepad/pad = pad_ref?.resolve() + var/obj/machinery/piratepad/civilian/pad = pad_ref?.resolve() for(var/atom/movable/AM in get_turf(pad)) if(AM == pad) continue @@ -84,7 +109,7 @@ 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() + var/obj/machinery/piratepad/civilian/pad = pad_ref?.resolve() for(var/atom/movable/AM in get_turf(pad)) if(AM == pad) continue @@ -113,7 +138,7 @@ 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() +/obj/machinery/computer/piratepad_control/civilian/proc/add_bounties(cooldown_reduction = 0) if(!inserted_scan_id || !inserted_scan_id.registered_account) return var/datum/bank_account/pot_acc = inserted_scan_id.registered_account @@ -127,7 +152,7 @@ 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) + COOLDOWN_START(pot_acc, bounty_timer, (5 MINUTES) - cooldown_reduction) pot_acc.bounties = crumbs /obj/machinery/computer/piratepad_control/civilian/proc/pick_bounty(choice) @@ -173,7 +198,8 @@ . = ..() if(.) return - if(!pad_ref?.resolve()) + var/obj/machinery/piratepad/civilian/pad = pad_ref?.resolve() + if(!pad) return if(!usr.can_perform_action(src) || (machine_stat & (NOPOWER|BROKEN))) return @@ -187,7 +213,7 @@ if("pick") pick_bounty(params["value"]) if("bounty") - add_bounties() + add_bounties(pad.get_cooldown_reduction()) if("eject") id_eject(usr, inserted_scan_id) inserted_scan_id = null @@ -364,7 +390,7 @@ /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 = 'icons/obj/machines/floor.dmi' icon_state = "floor_beacon" var/uses = 2 diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index f74f9746b6f65..1b10a7f2264f0 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -1,6 +1,6 @@ /obj/machinery/computer name = "computer" - icon = 'icons/obj/computer.dmi' + icon = 'icons/obj/machines/computer.dmi' icon_state = "computer" density = TRUE max_integrity = 200 @@ -26,7 +26,6 @@ /obj/machinery/computer/Initialize(mapload, obj/item/circuitboard/C) . = ..() - power_change() /obj/machinery/computer/process() diff --git a/code/game/machinery/computer/accounting.dm b/code/game/machinery/computer/accounting.dm index c38ea186f6201..178c407cb58dc 100644 --- a/code/game/machinery/computer/accounting.dm +++ b/code/game/machinery/computer/accounting.dm @@ -24,8 +24,8 @@ player_accounts += list(list( "name" = current_bank_account.account_holder, "job" = current_bank_account.account_job.title, - "balance" = current_bank_account.account_balance, - "modifier" = current_bank_account.payday_modifier, + "balance" = round(current_bank_account.account_balance), + "modifier" = round((current_bank_account.payday_modifier * 0.9), 0.1), )) data["PlayerAccounts"] = player_accounts data["AuditLog"] = audit_list diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 87e53ebb368de..2bc13e156d441 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -65,10 +65,12 @@ /obj/machinery/computer/aifixer/proc/Fix() use_power(1000) - occupier.adjustOxyLoss(-5, FALSE) - occupier.adjustFireLoss(-5, FALSE) - occupier.adjustBruteLoss(-5, FALSE) - occupier.updatehealth() + var/need_mob_update = FALSE + need_mob_update += occupier.adjustOxyLoss(-5, updating_health = FALSE) + need_mob_update += occupier.adjustFireLoss(-5, updating_health = FALSE) + need_mob_update += occupier.adjustBruteLoss(-5, updating_health = FALSE) + if(need_mob_update) + occupier.updatehealth() if(occupier.health >= 0 && occupier.stat == DEAD) occupier.revive() if(!occupier.radio_enabled) diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index 882ef86f0dbf8..2b5cfa14c7c28 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -27,12 +27,15 @@ return ..() -/obj/machinery/computer/apc_control/emag_act(mob/user) +/obj/machinery/computer/apc_control/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE obj_flags |= EMAGGED - usr.log_message("emagged [src].", LOG_ATTACK, color="red") + if (user) + user.log_message("emagged [src].", LOG_ATTACK, color="red") + balloon_alert(user, "access controller shorted") playsound(src, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + return TRUE /obj/machinery/computer/apc_control/proc/log_activity(log_text) if(!should_log) @@ -91,22 +94,21 @@ for(var/entry in logs) data["logs"] += list(list("entry" = entry)) - for(var/apc in GLOB.apcs_list) + for(var/obj/machinery/power/apc/apc as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/apc)) if(check_apc(apc)) - var/obj/machinery/power/apc/A = apc - var/has_cell = (A.cell) ? TRUE : FALSE + var/has_cell = (apc.cell) ? TRUE : FALSE data["apcs"] += list(list( - "name" = A.area.name, - "operating" = A.operating, - "charge" = (has_cell) ? A.cell.percent() : "NOCELL", - "load" = display_power(A.lastused_total), - "charging" = A.charging, - "chargeMode" = A.chargemode, - "eqp" = A.equipment, - "lgt" = A.lighting, - "env" = A.environ, - "responds" = A.aidisabled || A.panel_open, - "ref" = REF(A) + "name" = apc.area.name, + "operating" = apc.operating, + "charge" = (has_cell) ? apc.cell.percent() : "NOCELL", + "load" = display_power(apc.lastused_total), + "charging" = apc.charging, + "chargeMode" = apc.chargemode, + "eqp" = apc.equipment, + "lgt" = apc.lighting, + "env" = apc.environ, + "responds" = apc.aidisabled || apc.panel_open, + "ref" = REF(apc) ) ) return data @@ -155,7 +157,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 SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/apc) connect_apc(APC, usr) if("check-logs") log_activity("Checked Logs") @@ -165,7 +167,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 SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/apc) if(!target) return @@ -194,7 +196,7 @@ usr.log_message("set APC [target.area.name] [type] to [setTo]]", LOG_GAME) 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 SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/apc) target.toggle_breaker(usr) 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 81e54f902713e..58a7280e8643e 100644 --- a/code/game/machinery/computer/arcade/arcade.dm +++ b/code/game/machinery/computer/arcade/arcade.dm @@ -59,7 +59,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( /obj/item/toy/plush/rouny = 2, /obj/item/toy/plush/abductor = 2, /obj/item/toy/plush/abductor/agent = 2, - /obj/item/toy/plush/greek_cucumber = 2, + /obj/item/toy/plush/shark = 2, /obj/item/storage/belt/military/snack/full = 2, /obj/item/toy/brokenradio = 2, /obj/item/toy/braintoy = 2, @@ -582,7 +582,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( var/mob/living/living_user = user if (istype(living_user)) living_user.investigate_log("has been gibbed by an emagged Orion Trail game.", INVESTIGATE_DEATHS) - living_user.gib() + living_user.gib(DROP_ALL_REMAINS) SSblackbox.record_feedback("nested tally", "arcade_results", 1, list("loss", "hp", (obj_flags & EMAGGED ? "emagged":"normal"))) user.lost_game() @@ -620,17 +620,18 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( . += "\t[span_info("magical -> defend until outmagiced")]" return . -/obj/machinery/computer/arcade/battle/emag_act(mob/user) +/obj/machinery/computer/arcade/battle/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE + balloon_alert(user, "hard mode enabled") to_chat(user, span_warning("A mesmerizing Rhumba beat starts playing from the arcade machine's speakers!")) temp = "

If you die in the game, you die for real!

" max_passive = 6 bomb_cooldown = 18 var/gamerSkill = 0 - if(usr?.mind) - gamerSkill = usr.mind.get_skill_level(/datum/skill/gaming) + if(user?.mind) + gamerSkill = user.mind.get_skill_level(/datum/skill/gaming) enemy_setup(gamerSkill) enemy_hp += 100 //extra HP just to make cuban pete even more bullshit player_hp += 30 //the player will also get a few extra HP in order to have a fucking chance @@ -644,6 +645,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( name = "Outbomb Cuban Pete" updateUsrDialog() + return TRUE // ** AMPUTATION ** // diff --git a/code/game/machinery/computer/arcade/orion.dm b/code/game/machinery/computer/arcade/orion.dm index e1bd40059782b..3bf880a7582e0 100644 --- a/code/game/machinery/computer/arcade/orion.dm +++ b/code/game/machinery/computer/arcade/orion.dm @@ -489,15 +489,18 @@ GLOBAL_LIST_INIT(orion_events, generate_orion_events()) name = initial(name) desc = initial(desc) -/obj/machinery/computer/arcade/orion_trail/emag_act(mob/user) +/obj/machinery/computer/arcade/orion_trail/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return - to_chat(user, span_notice("You override the cheat code menu and skip to Cheat #[rand(1, 50)]: Realism Mode.")) - user.log_message("emagged [src], activating Realism Mode.", LOG_GAME) + return FALSE + if (user) + user.log_message("emagged [src], activating Realism Mode.", LOG_GAME) + balloon_alert(user, "realism mode enabled") + to_chat(user, span_notice("You override the cheat code menu and skip to Cheat #[rand(1, 50)]: Realism Mode.")) name = "The Orion Trail: Realism Edition" desc = "Learn how our ancestors got to Orion, and try not to die in the process!" newgame() obj_flags |= EMAGGED + return TRUE /mob/living/basic/syndicate/ranged/smg/orion name = "spaceport security" diff --git a/code/game/machinery/computer/arena.dm b/code/game/machinery/computer/arena.dm index 154b91a3aba24..39b39af197b61 100644 --- a/code/game/machinery/computer/arena.dm +++ b/code/game/machinery/computer/arena.dm @@ -210,7 +210,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 SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/arena_spawn)) if(A.arena_id == arena_id && A.team == team) return A @@ -244,7 +244,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 as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/poddoor)) if(D.id != arena_id) continue if(closed) @@ -385,7 +385,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 as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/computer/arena)) if(A.arena_id == arena_id) _controller = A return _controller diff --git a/code/game/machinery/computer/atmos_computers/__identifiers.dm b/code/game/machinery/computer/atmos_computers/__identifiers.dm index 2b007885cc701..653f0fbaa3868 100644 --- a/code/game/machinery/computer/atmos_computers/__identifiers.dm +++ b/code/game/machinery/computer/atmos_computers/__identifiers.dm @@ -32,13 +32,14 @@ #define ATMOS_GAS_MONITOR_WASTE "waste" #define ATMOS_GAS_MONITOR_ENGINE "engine" -///maps a chamber id to its air sensor -#define CHAMBER_SENSOR_FROM_ID(chamber_id) ((chamber_id) + "_sensor") ///maps an air sensor's chamber id to its input valve[ i.e. outlet_injector] id #define CHAMBER_INPUT_FROM_ID(chamber_id) ((chamber_id) + "_in") ///maps an air sensor's chamber id to its output valve[i.e. vent pump] id #define CHAMBER_OUTPUT_FROM_ID(chamber_id) ((chamber_id) + "_out") +///list of all air sensor's created round start +GLOBAL_LIST_EMPTY(map_loaded_sensors) + // Human-readble names of these funny tags. GLOBAL_LIST_INIT(station_gas_chambers, list( ATMOS_GAS_MONITOR_O2 = "Oxygen Supply", diff --git a/code/game/machinery/computer/atmos_computers/_air_sensor.dm b/code/game/machinery/computer/atmos_computers/_air_sensor.dm index 45d705236d373..8d56b8a2f9052 100644 --- a/code/game/machinery/computer/atmos_computers/_air_sensor.dm +++ b/code/game/machinery/computer/atmos_computers/_air_sensor.dm @@ -2,17 +2,29 @@ /// These always hook to monitors, be mindful of them /obj/machinery/air_sensor name = "gas sensor" - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/wallmounts.dmi' icon_state = "gsensor1" resistance_flags = FIRE_PROOF - + power_channel = AREA_USAGE_ENVIRON + active_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 1.5 var/on = TRUE /// The unique string that represents which atmos chamber to associate with. var/chamber_id + /// The inlet[injector] controlled by this sensor + var/inlet_id + /// The outlet[vent pump] controlled by this sensor + var/outlet_id /obj/machinery/air_sensor/Initialize(mapload) - id_tag = CHAMBER_SENSOR_FROM_ID(chamber_id) + id_tag = assign_random_name() + + //this global list of air sensors is available to all station monitering consoles round start and to new consoles made during the round + if(mapload) + GLOB.map_loaded_sensors[chamber_id] = id_tag + inlet_id = CHAMBER_INPUT_FROM_ID(chamber_id) + outlet_id = CHAMBER_OUTPUT_FROM_ID(chamber_id) + var/static/list/multitool_tips = list( TOOL_MULTITOOL = list( SCREENTIP_CONTEXT_LMB = "Link logged injectors/vents", @@ -27,21 +39,45 @@ reset() return ..() +/obj/machinery/air_sensor/return_air() + if(!on) + return + . = ..() + use_power(active_power_usage) //use power for analyzing gases + +/obj/machinery/air_sensor/process() + //update appearance according to power state + if(machine_stat & NOPOWER) + if(on) + on = FALSE + update_appearance() + else if(!on) + on = TRUE + update_appearance() + +/obj/machinery/air_sensor/examine(mob/user) + . = ..() + . += span_notice("Use multitool to link it to an injector/vent or reset it's ports") + . += span_notice("Click with hand to turn it off.") + +/obj/machinery/air_sensor/attack_hand(mob/living/user, list/modifiers) + . = ..() + + //switched off version of this air sensor but still anchored to the ground + var/obj/item/air_sensor/sensor = new(drop_location(), inlet_id, outlet_id) + sensor.set_anchored(TRUE) + sensor.balloon_alert(user, "sensor turned off") + + //delete self + qdel(src) + /obj/machinery/air_sensor/update_icon_state() icon_state = "gsensor[on]" return ..() /obj/machinery/air_sensor/proc/reset() - var/input_id = CHAMBER_INPUT_FROM_ID(chamber_id) - if(GLOB.objects_by_id_tag[input_id] != null) - var/obj/machinery/atmospherics/components/unary/outlet_injector/injector = GLOB.objects_by_id_tag[input_id] - injector.disconnect_chamber() - - var/output_id = CHAMBER_OUTPUT_FROM_ID(chamber_id) - if(GLOB.objects_by_id_tag[output_id] != null) - var/obj/machinery/atmospherics/components/unary/vent_pump/pump = GLOB.objects_by_id_tag[output_id] - pump.disconnect_chamber() - + inlet_id = null + outlet_id = null ///right click with multi tool to disconnect everything /obj/machinery/air_sensor/multitool_act_secondary(mob/living/user, obj/item/tool) @@ -50,30 +86,144 @@ return TRUE /obj/machinery/air_sensor/multitool_act(mob/living/user, obj/item/multitool/multi_tool) - .= ..() - - if (!istype(multi_tool)) - return . + . = ..() if(istype(multi_tool.buffer, /obj/machinery/atmospherics/components/unary/outlet_injector)) var/obj/machinery/atmospherics/components/unary/outlet_injector/input = multi_tool.buffer - input.chamber_id = chamber_id - GLOB.objects_by_id_tag[CHAMBER_INPUT_FROM_ID(chamber_id)] = input + inlet_id = input.id_tag + multi_tool.set_buffer(src) balloon_alert(user, "connected to input") + else if(istype(multi_tool.buffer, /obj/machinery/atmospherics/components/unary/vent_pump)) var/obj/machinery/atmospherics/components/unary/vent_pump/output = multi_tool.buffer //so its no longer controlled by air alarm output.disconnect_from_area() - //configuration copied from /obj/machinery/atmospherics/components/unary/vent_pump/siphon + //configuration copied from /obj/machinery/atmospherics/components/unary/vent_pump/siphon but with max pressure output.pump_direction = ATMOS_DIRECTION_SIPHONING output.pressure_checks = ATMOS_INTERNAL_BOUND - output.internal_pressure_bound = 4000 + output.internal_pressure_bound = MAX_OUTPUT_PRESSURE output.external_pressure_bound = 0 - output.chamber_id = chamber_id - GLOB.objects_by_id_tag[CHAMBER_OUTPUT_FROM_ID(chamber_id)] = output + //finally assign it to this sensor + outlet_id = output.id_tag + multi_tool.set_buffer(src) balloon_alert(user, "connected to output") + else - multi_tool.buffer = src - balloon_alert(user, "added to multitool buffer") + multi_tool.set_buffer(src) + balloon_alert(user, "sensor added to buffer") - return TRUE + return TOOL_ACT_TOOLTYPE_SUCCESS + +/** + * A portable version of the /obj/machinery/air_sensor + * Wrenching it & turning it on will convert it back to /obj/machinery/air_sensor + * Unwelding /obj/machinery/air_sensor will turn it back to /obj/item/air_sensor + * The logic is same as meters + */ +/obj/item/air_sensor + name = "Air Sensor" + desc = "A device designed to detect gases and their concentration in an area." + icon = 'icons/obj/wallmounts.dmi' + icon_state = "gsensor0" + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT) + /// The injector linked with this sensor + var/input_id + /// The vent pump linked with this sensor + var/output_id + +/obj/item/air_sensor/Initialize(mapload, inlet, outlet) + . = ..() + register_context() + input_id = inlet + output_id = outlet + +/obj/item/air_sensor/add_context(atom/source, list/context, obj/item/held_item, mob/user) + if(isnull(held_item)) + return NONE + + if(held_item.tool_behaviour == TOOL_WRENCH) + context[SCREENTIP_CONTEXT_LMB] = anchored ? "Unwrench" : "Wrench" + return CONTEXTUAL_SCREENTIP_SET + + if(held_item.tool_behaviour == TOOL_WELDER && !anchored) + context[SCREENTIP_CONTEXT_LMB] = "Dismantle" + return CONTEXTUAL_SCREENTIP_SET + + return NONE + +/obj/item/air_sensor/examine(mob/user) + . = ..() + if(anchored) + . += span_notice("It's [EXAMINE_HINT("wrenched")] in place") + else + . += span_notice("It should be [EXAMINE_HINT("wrenched")] in place to turn it on.") + . += span_notice("It could be [EXAMINE_HINT("welded")] apart.") + . += span_notice("Click with hand to turn it on.") + +/obj/item/air_sensor/attack_hand(mob/user, list/modifiers) + . = ..() + if(!anchored) + return + + //List of air sensor's by name + var/list/available_sensors = list() + for(var/chamber_id in GLOB.station_gas_chambers) + //don't let it conflict with existing distro & waste moniter meter's + if(chamber_id == ATMOS_GAS_MONITOR_DISTRO) + continue + if(chamber_id == ATMOS_GAS_MONITOR_WASTE) + continue + available_sensors += GLOB.station_gas_chambers[chamber_id] + + //make the choice + var/chamber_name = tgui_input_list(user, "Select Sensor Purpose", "Select Sensor ID", available_sensors) + if(isnull(chamber_name)) + return + + //map chamber name back to id + var/target_chamber + for(var/chamber_id in GLOB.station_gas_chambers) + if(GLOB.station_gas_chambers[chamber_id] != chamber_name) + continue + target_chamber = chamber_id + break + + //build the sensor from the subtypes of sensor's available + var/static/list/chamber_subtypes = null + if(isnull(chamber_subtypes)) + chamber_subtypes = subtypesof(/obj/machinery/air_sensor) + for(var/obj/machinery/air_sensor/sensor as anything in chamber_subtypes) + if(initial(sensor.chamber_id) != target_chamber) + continue + + //make real air sensor in it's place + var/obj/machinery/air_sensor/new_sensor = new sensor(get_turf(src)) + new_sensor.inlet_id = input_id + new_sensor.outlet_id = output_id + new_sensor.balloon_alert(user, "sensor turned on") + qdel(src) + + break + +/obj/item/air_sensor/wrench_act(mob/living/user, obj/item/tool) + if(default_unfasten_wrench(user, tool) == SUCCESSFUL_UNFASTEN) + return TOOL_ACT_TOOLTYPE_SUCCESS + return + +/obj/item/air_sensor/welder_act(mob/living/user, obj/item/tool) + if(!tool.tool_start_check(user, amount = 1)) + return + + loc.balloon_alert(user, "dismantling sensor") + if(!tool.use_tool(src, user, 2 SECONDS, volume = 30, amount = 1)) + return + loc.balloon_alert(user, "sensor dismanteled") + + deconstruct(TRUE) + return TOOL_ACT_TOOLTYPE_SUCCESS + +/obj/item/air_sensor/deconstruct(disassembled) + if(!(flags_1 & NODECONSTRUCT_1)) + new /obj/item/analyzer(loc) + new /obj/item/stack/sheet/iron(loc, 1) + return ..() diff --git a/code/game/machinery/computer/atmos_computers/_atmos_control.dm b/code/game/machinery/computer/atmos_computers/_atmos_control.dm index dd885e2c1dde5..57403a27d3d2d 100644 --- a/code/game/machinery/computer/atmos_computers/_atmos_control.dm +++ b/code/game/machinery/computer/atmos_computers/_atmos_control.dm @@ -7,7 +7,7 @@ circuit = /obj/item/circuitboard/computer/atmos_control light_color = LIGHT_COLOR_CYAN - /// Which sensors/input/outlets do we want to listen to. + /// Which sensors do we want to listen to. /// Assoc of list[chamber_id] = readable_chamber_name var/list/atmos_chambers @@ -19,12 +19,33 @@ /// Whether we are allowed to reconnect. var/reconnecting = TRUE + /// Was this computer multitooled before. If so copy the list connected_sensors as it now mantain's it's own sensors independent of the map loaded one's + var/was_multi_tooled = FALSE + + /// list of all sensors[key is chamber id, value is id of air sensor linked to this chamber] monitered by this computer + var/list/connected_sensors + /obj/machinery/computer/atmos_control/Initialize(mapload, obj/item/circuitboard/C) . = ..() + + var/static/list/multitool_tips = list( + TOOL_MULTITOOL = list( + SCREENTIP_CONTEXT_LMB = "Link Sensor", + ) + ) + AddElement(/datum/element/contextual_screentip_tools, multitool_tips) + + //all newly constructed/round start computers by default have access to this list + connected_sensors = GLOB.map_loaded_sensors + //special case for the station monitering console. We dont want to loose these chambers during reconnecting if(!control && !isnull(atmos_chambers)) always_displayed_chambers = atmos_chambers.Copy() +/obj/machinery/computer/atmos_control/examine(mob/user) + . = ..() + . += span_notice("Use a multitool to link a air sensor to this computer") + /// Reconnect only works for station based chambers. /obj/machinery/computer/atmos_control/proc/reconnect(mob/user) if(!reconnecting) @@ -33,16 +54,25 @@ // We only prompt the user with the sensors that are actually available. var/available_devices = list() - for (var/chamber_identifier in GLOB.station_gas_chambers) - if (!(CHAMBER_INPUT_FROM_ID(chamber_identifier) in GLOB.objects_by_id_tag) && !(CHAMBER_OUTPUT_FROM_ID(chamber_identifier) in GLOB.objects_by_id_tag)) + for (var/chamber_identifier in connected_sensors) + //this sensor was destroyed at the time of reconnecting + var/obj/machinery/sensor = GLOB.objects_by_id_tag[connected_sensors[chamber_identifier]] + if(QDELETED(sensor)) + continue + + //non master computers don't have access to these station moniters. Only done to give master computer's special access to these chambers and make them feel special or something + if(chamber_identifier == ATMOS_GAS_MONITOR_DISTRO) + continue + if(chamber_identifier == ATMOS_GAS_MONITOR_WASTE) continue available_devices[GLOB.station_gas_chambers[chamber_identifier]] = chamber_identifier // As long as we dont put any funny chars in the strings it should match. var/new_name = tgui_input_list(user, "Select the device set", "Reconnect", available_devices) + if(isnull(new_name)) + return FALSE var/new_id = available_devices[new_name] - if(isnull(new_id)) return FALSE @@ -57,6 +87,22 @@ return TRUE +/obj/machinery/computer/atmos_control/multitool_act(mob/living/user, obj/item/multitool/multi_tool) + . = ..() + + if(istype(multi_tool.buffer, /obj/machinery/air_sensor)) + var/obj/machinery/air_sensor/sensor = multi_tool.buffer + //computers reference a global map loaded list of sensor's but as soon a user attempt's to edit it, make a copy of that list so other computers aren't affected + if(!was_multi_tooled) + connected_sensors = connected_sensors.Copy() + was_multi_tooled = TRUE + //register the sensor's unique ID with it's assositated chamber + connected_sensors[sensor.chamber_id] = sensor.id_tag + user.balloon_alert(user, "sensor connected to [src]") + return TOOL_ACT_TOOLTYPE_SUCCESS + + return + /obj/machinery/computer/atmos_control/ui_interact(mob/user, datum/tgui/ui) . = ..() ui = SStgui.try_update_ui(user, src, ui) @@ -82,23 +128,26 @@ chamber_info["id"] = chamber_id chamber_info["name"] = atmos_chambers[chamber_id] - var/obj/machinery/sensor = GLOB.objects_by_id_tag[CHAMBER_SENSOR_FROM_ID(chamber_id)] - if (!isnull(sensor)) + var/obj/machinery/sensor = GLOB.objects_by_id_tag[connected_sensors[chamber_id]] + if(!QDELETED(sensor)) chamber_info["gasmix"] = gas_mixture_parser(sensor.return_air()) - var/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/input = GLOB.objects_by_id_tag[CHAMBER_INPUT_FROM_ID(chamber_id)] - if (!isnull(input)) - chamber_info["input_info"] = list( - "active" = input.on, - "amount" = input.volume_rate, - ) + if(istype(sensor, /obj/machinery/air_sensor)) //distro & waste loop are not air sensors and don't have these functions + var/obj/machinery/air_sensor/air_sensor = sensor + + var/obj/machinery/atmospherics/components/unary/outlet_injector/input = GLOB.objects_by_id_tag[air_sensor.inlet_id || ""] + if (!QDELETED(input)) + chamber_info["input_info"] = list( + "active" = input.on, + "amount" = input.volume_rate, + ) - var/obj/machinery/atmospherics/components/unary/vent_pump/output = GLOB.objects_by_id_tag[CHAMBER_OUTPUT_FROM_ID(chamber_id)] - if (!isnull(output)) - chamber_info["output_info"] = list( - "active" = output.on, - "amount" = output.internal_pressure_bound, - ) + var/obj/machinery/atmospherics/components/unary/vent_pump/output = GLOB.objects_by_id_tag[air_sensor.outlet_id || ""] + if (!QDELETED(output)) + chamber_info["output_info"] = list( + "active" = output.on, + "amount" = output.internal_pressure_bound, + ) data["chambers"] += list(chamber_info) return data @@ -115,37 +164,66 @@ if (!(chamber in atmos_chambers)) return TRUE - var/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/input = GLOB.objects_by_id_tag[CHAMBER_INPUT_FROM_ID(chamber)] - input?.on = !input.on + var/obj/machinery/air_sensor/sensor = GLOB.objects_by_id_tag[connected_sensors[chamber]] + if(QDELETED(sensor)) + return TRUE + + var/obj/machinery/atmospherics/components/unary/outlet_injector/input = GLOB.objects_by_id_tag[sensor.inlet_id || ""] + if(QDELETED(input)) + return TRUE + + input.on = !input.on input.update_appearance(UPDATE_ICON) if("toggle_output") if (!(chamber in atmos_chambers)) return TRUE - var/obj/machinery/atmospherics/components/unary/vent_pump/output = GLOB.objects_by_id_tag[CHAMBER_OUTPUT_FROM_ID(chamber)] - output?.on = !output.on + var/obj/machinery/air_sensor/sensor = GLOB.objects_by_id_tag[connected_sensors[chamber]] + if(QDELETED(sensor)) + return TRUE + + var/obj/machinery/atmospherics/components/unary/vent_pump/output = GLOB.objects_by_id_tag[sensor.outlet_id || ""] + if(QDELETED(output)) + return TRUE + + output.on = !output.on output.update_appearance(UPDATE_ICON) if("adjust_input") if (!(chamber in atmos_chambers)) return TRUE + var/obj/machinery/air_sensor/sensor = GLOB.objects_by_id_tag[connected_sensors[chamber]] + if(QDELETED(sensor)) + return TRUE + + var/obj/machinery/atmospherics/components/unary/outlet_injector/input = GLOB.objects_by_id_tag[sensor.inlet_id || ""] + if(QDELETED(input)) + return TRUE + var/target = text2num(params["rate"]) if(isnull(target)) return TRUE target = clamp(target, 0, MAX_TRANSFER_RATE) - var/obj/machinery/atmospherics/components/unary/outlet_injector/input = GLOB.objects_by_id_tag[CHAMBER_INPUT_FROM_ID(chamber)] - input?.volume_rate = clamp(target, 0, min(input.airs[1].volume, MAX_TRANSFER_RATE)) + input.volume_rate = clamp(target, 0, min(input.airs[1].volume, MAX_TRANSFER_RATE)) if("adjust_output") if (!(chamber in atmos_chambers)) return TRUE + var/obj/machinery/air_sensor/sensor = GLOB.objects_by_id_tag[connected_sensors[chamber]] + if(QDELETED(sensor)) + return TRUE + + var/obj/machinery/atmospherics/components/unary/vent_pump/output = GLOB.objects_by_id_tag[sensor.outlet_id || ""] + if(QDELETED(output)) + return TRUE + var/target = text2num(params["rate"]) if(isnull(target)) return TRUE + target = clamp(target, 0, ATMOS_PUMP_MAX_PRESSURE) - var/obj/machinery/atmospherics/components/unary/vent_pump/output = GLOB.objects_by_id_tag[CHAMBER_OUTPUT_FROM_ID(chamber)] - output?.internal_pressure_bound = clamp(target, 0, ATMOS_PUMP_MAX_PRESSURE) + output.internal_pressure_bound = target if("reconnect") reconnect(usr) diff --git a/code/game/machinery/computer/atmos_computers/inlets.dm b/code/game/machinery/computer/atmos_computers/inlets.dm index 5379a15c72586..32de77cc632de 100644 --- a/code/game/machinery/computer/atmos_computers/inlets.dm +++ b/code/game/machinery/computer/atmos_computers/inlets.dm @@ -1,6 +1,8 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/monitored on = TRUE volume_rate = MAX_TRANSFER_RATE + /// The air sensor type this injector is linked to + var/chamber_id /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/Initialize(mapload) id_tag = CHAMBER_INPUT_FROM_ID(chamber_id) diff --git a/code/game/machinery/computer/atmos_computers/meters.dm b/code/game/machinery/computer/atmos_computers/meters.dm index 9ff6578852b26..9cfe3072a69cc 100644 --- a/code/game/machinery/computer/atmos_computers/meters.dm +++ b/code/game/machinery/computer/atmos_computers/meters.dm @@ -3,7 +3,9 @@ var/chamber_id /obj/machinery/meter/monitored/Initialize(mapload, new_piping_layer) - id_tag = CHAMBER_SENSOR_FROM_ID(chamber_id) + id_tag = assign_random_name() + if(mapload) + GLOB.map_loaded_sensors[chamber_id] = id_tag . = ..() /obj/machinery/meter/monitored/layer2 diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 7db15a45f0aae..5230dbe9e0946 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -8,6 +8,21 @@ . = ..() AddComponent(/datum/component/simple_rotation) +/// Installs the board in the computer +/obj/structure/frame/computer/proc/install_board(obj/item/circuitboard/computer/board, mob/user, by_hand) + if(by_hand && !user.transferItemToLoc(board, src)) + return FALSE + else if(!board.forceMove(src)) + return FALSE + + playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) + to_chat(user, span_notice("You place [board] inside the frame.")) + icon_state = "1" + circuit = board + circuit.add_fingerprint(user) + + return TRUE + /obj/structure/frame/computer/attackby(obj/item/P, mob/living/user, params) add_fingerprint(user) switch(state) @@ -20,7 +35,7 @@ state = 1 return if(P.tool_behaviour == TOOL_WELDER) - if(!P.tool_start_check(user, amount=0)) + if(!P.tool_start_check(user, amount=1)) return to_chat(user, span_notice("You start deconstructing the frame...")) @@ -39,51 +54,94 @@ set_anchored(FALSE) state = 0 return - if(istype(P, /obj/item/circuitboard/computer) && !circuit) - if(!user.transferItemToLoc(P, src)) - return - playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) - to_chat(user, span_notice("You place [P] inside the frame.")) - icon_state = "1" - circuit = P - circuit.add_fingerprint(user) - return - else if(istype(P, /obj/item/circuitboard) && !circuit) - to_chat(user, span_warning("This frame does not accept circuit boards of this type!")) - return - if(P.tool_behaviour == TOOL_SCREWDRIVER && circuit) - P.play_tool_sound(src) - to_chat(user, span_notice("You screw [circuit] into place.")) - state = 2 - icon_state = "2" - return - if(P.tool_behaviour == TOOL_CROWBAR && circuit) - P.play_tool_sound(src) - to_chat(user, span_notice("You remove [circuit].")) - state = 1 - icon_state = "0" - circuit.forceMove(drop_location()) - circuit.add_fingerprint(user) - circuit = null - return + if(!circuit) + //attempt to install circuitboard from part replacer + if(istype(P, /obj/item/storage/part_replacer) && P.contents.len) + var/obj/item/storage/part_replacer/replacer = P + // map of circuitboard names to the board + var/list/circuit_boards = list() + for(var/obj/item/circuitboard/computer/board in replacer.contents) + circuit_boards[board.name] = board + if(!length(circuit_boards)) + return + //if there is only one board directly install it else pick from list + var/obj/item/circuitboard/computer/target_board + if(circuit_boards.len == 1) + for(var/board_name in circuit_boards) + target_board = circuit_boards[board_name] + else + var/option = tgui_input_list(user, "Select Circuitboard To Install"," Available Boards", circuit_boards) + target_board = circuit_boards[option] + if(!target_board) + return + + if(install_board(target_board, user, by_hand = FALSE)) + replacer.play_rped_sound() + //automatically screw the board in as well, a perk of using the rped + to_chat(user, span_notice("You screw [circuit] into place.")) + state = 2 + icon_state = "2" + //attack again so we can install the cable & glass + attackby(replacer, user, params) + return + + //attempt to install circuitboard by hand + if(istype(P, /obj/item/circuitboard/computer)) + install_board(P, user, by_hand = TRUE) + return + else if(istype(P, /obj/item/circuitboard)) + to_chat(user, span_warning("This frame does not accept circuit boards of this type!")) + return + else + if(P.tool_behaviour == TOOL_SCREWDRIVER) + P.play_tool_sound(src) + to_chat(user, span_notice("You screw [circuit] into place.")) + state = 2 + icon_state = "2" + return + if(P.tool_behaviour == TOOL_CROWBAR) + P.play_tool_sound(src) + to_chat(user, span_notice("You remove [circuit].")) + state = 1 + icon_state = "0" + circuit.forceMove(drop_location()) + circuit.add_fingerprint(user) + circuit = null + return if(2) if(P.tool_behaviour == TOOL_SCREWDRIVER && circuit) P.play_tool_sound(src) to_chat(user, span_notice("You unfasten the circuit board.")) state = 1 icon_state = "1" - return - if(istype(P, /obj/item/stack/cable_coil)) - if(!P.tool_start_check(user, amount=5)) + else + //serach for cable which can either be the attacking item or inside an rped + var/obj/item/stack/cable_coil/cable = null + if(istype(P, /obj/item/stack/cable_coil)) + cable = P + else if(istype(P, /obj/item/storage/part_replacer)) + cable = locate(/obj/item/stack/cable_coil) in P.contents + if(!cable) + return + + //install cable + if(!cable.tool_start_check(user, amount = 5)) return to_chat(user, span_notice("You start adding cables to the frame...")) - if(P.use_tool(src, user, 20, volume=50, amount=5)) + if(cable.use_tool(src, user, istype(P, /obj/item/storage/part_replacer) ? 0 : 20, volume = 50, amount = 5)) if(state != 2) return to_chat(user, span_notice("You add cables to the frame.")) state = 3 icon_state = "3" + + //if the item was an rped then it could have glass sheets for the next stage so let it continue + if(istype(P, /obj/item/storage/part_replacer)) + var/obj/item/storage/part_replacer/replacer = P + replacer.play_rped_sound() + //reattack to install the glass sheets as well + attackby(replacer, user, params) return if(3) if(P.tool_behaviour == TOOL_WIRECUTTER) @@ -94,19 +152,31 @@ var/obj/item/stack/cable_coil/A = new (drop_location(), 5) if (!QDELETED(A)) A.add_fingerprint(user) - return + else + //search for glass sheets which can either be the attacking item or inside an rped + var/obj/item/stack/sheet/glass/glass_sheets = null + if(istype(P, /obj/item/stack/sheet/glass)) + glass_sheets = P + else if(istype(P, /obj/item/storage/part_replacer)) + glass_sheets = locate(/obj/item/stack/sheet/glass) in P.contents + if(!glass_sheets) + return - if(istype(P, /obj/item/stack/sheet/glass)) - if(!P.tool_start_check(user, amount=2)) + //install glass sheets + if(!glass_sheets.tool_start_check(user, amount = 2)) return playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) to_chat(user, span_notice("You start to put in the glass panel...")) - if(P.use_tool(src, user, 20, amount=2)) + if(glass_sheets.use_tool(src, user, istype(P, /obj/item/storage/part_replacer) ? 0 : 20, amount = 2)) if(state != 3) return to_chat(user, span_notice("You put in the glass panel.")) state = 4 - src.icon_state = "4" + icon_state = "4" + + if(istype(P, /obj/item/storage/part_replacer)) + var/obj/item/storage/part_replacer/replacer = P + replacer.play_rped_sound() return if(4) if(P.tool_behaviour == TOOL_CROWBAR) @@ -129,19 +199,7 @@ if(istype(new_machine, /obj/machinery/computer)) var/obj/machinery/computer/new_computer = new_machine - // Machines will init with a set of default components. - // Triggering handle_atom_del will make the machine realise it has lost a component_parts and then deconstruct. - // Move to nullspace so we don't trigger handle_atom_del, then qdel. - // Finally, replace new machine's parts with this frame's parts. - if(new_computer.circuit) - // Move to nullspace and delete. - new_computer.circuit.moveToNullspace() - QDEL_NULL(new_computer.circuit) - for(var/old_part in new_computer.component_parts) - var/atom/movable/movable_part = old_part - // Move to nullspace and delete. - movable_part.moveToNullspace() - qdel(movable_part) + new_machine.clear_components() // Set anchor state and move the frame's parts over to the new machine. // Then refresh parts and call on_construction(). diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index e8fc202feede5..5a604cd969b7d 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -94,7 +94,7 @@ /obj/machinery/computer/security/ui_static_data() var/list/data = list() data["mapRef"] = cam_screen.assigned_map - var/list/cameras = get_available_cameras() + var/list/cameras = get_camera_list(network) data["cameras"] = list() for(var/i in cameras) var/obj/machinery/camera/C = cameras[i] @@ -111,7 +111,7 @@ if(action == "switch_camera") var/c_tag = params["name"] - var/list/cameras = get_available_cameras() + var/list/cameras = get_camera_list(network) var/obj/machinery/camera/selected_camera = cameras[c_tag] active_camera = selected_camera playsound(src, get_sfx(SFX_TERMINAL_TYPE), 25, FALSE) @@ -178,28 +178,6 @@ cam_background.icon_state = "scanline2" cam_background.fill_rect(1, 1, DEFAULT_MAP_SIZE, DEFAULT_MAP_SIZE) -// Returns the list of cameras accessible from this computer -/obj/machinery/computer/security/proc/get_available_cameras() - var/list/L = list() - for (var/obj/machinery/camera/cam as anything in GLOB.cameranet.cameras) - //Get the camera's turf in case it's inside something like a borg - var/turf/camera_turf = get_turf(cam) - if((is_away_level(z) || is_away_level(camera_turf.z)) && (camera_turf.z != z))//if on away mission, can only receive feed from same z_level cameras - continue - L.Add(cam) - var/list/D = list() - for(var/obj/machinery/camera/cam in L) - if(!cam.network) - stack_trace("Camera in a cameranet has no camera network") - continue - if(!(islist(cam.network))) - stack_trace("Camera in a cameranet has a non-list camera network") - continue - var/list/tempnetwork = cam.network & network - if(tempnetwork.len) - D["[cam.c_tag]"] = cam - return D - // SECURITY MONITORS /obj/machinery/computer/security/wooden_tv diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 5559ab440e740..dd6ca73183e07 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -67,7 +67,7 @@ syndicate = TRUE /obj/machinery/computer/communications/syndicate/emag_act(mob/user, obj/item/card/emag/emag_card) - return + return FALSE /obj/machinery/computer/communications/syndicate/can_buy_shuttles(mob/user) return FALSE @@ -119,26 +119,29 @@ /obj/machinery/computer/communications/emag_act(mob/user, obj/item/card/emag/emag_card) if(istype(emag_card, /obj/item/card/emag/battlecruiser)) - if(!IS_TRAITOR(user)) - 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 (user) + if(!IS_TRAITOR(user)) + to_chat(user, span_danger("You get the feeling this is a bad idea.")) + return FALSE if(battlecruiser_called) - to_chat(user, span_danger("The card reports a long-range message already sent to the Syndicate fleet...?")) - return + if (user) + to_chat(user, span_danger("The card reports a long-range message already sent to the Syndicate fleet...?")) + return FALSE 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 + return TRUE if(obj_flags & EMAGGED) - return + return FALSE 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!")) + balloon_alert(user, "routing circuits scrambled") playsound(src, 'sound/machines/terminal_alert.ogg', 50, FALSE) + return TRUE /obj/machinery/computer/communications/ui_act(action, list/params) var/static/list/approved_states = list(STATE_BUYING_SHUTTLE, STATE_CHANGING_STATUS, STATE_MAIN, STATE_MESSAGES) @@ -377,7 +380,19 @@ if(picture in GLOB.status_display_state_pictures) post_status(picture) else - post_status("alert", picture) + if(picture == "currentalert") // You cannot set Code Blue display during Code Red and similiar + switch(SSsecurity_level.get_current_level_as_number()) + if(SEC_LEVEL_DELTA) + post_status("alert", "deltaalert") + if(SEC_LEVEL_RED) + post_status("alert", "redalert") + if(SEC_LEVEL_BLUE) + post_status("alert", "bluealert") + if(SEC_LEVEL_GREEN) + post_status("alert", "greenalert") + else + post_status("alert", picture) + playsound(src, SFX_TERMINAL_TYPE, 50, FALSE) if ("toggleAuthentication") // Log out if we're logged in @@ -597,7 +612,9 @@ shuttles += list(list( "name" = shuttle_template.name, "description" = shuttle_template.description, + "occupancy_limit" = shuttle_template.occupancy_limit, "creditCost" = shuttle_template.credit_cost, + "initial_cost" = initial(shuttle_template.credit_cost), "emagOnly" = shuttle_template.emag_only, "prerequisites" = shuttle_template.prerequisites, "ref" = REF(shuttle_template), @@ -923,6 +940,10 @@ if(new_possible_answers) possible_answers = new_possible_answers +/datum/comm_message/Destroy() + answer_callback = null + return ..() + #undef IMPORTANT_ACTION_COOLDOWN #undef EMERGENCY_ACCESS_COOLDOWN #undef STATE_BUYING_SHUTTLE diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 0871592de5536..bfdcdc45064ee 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -243,9 +243,9 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) if (jobs[trim_assignment] != null) entry["ijob"] = jobs[trim_assignment] - // Binary living/dead status + // Current status if (sensor_mode >= SENSOR_LIVING) - entry["life_status"] = (tracked_living_mob.stat != DEAD) + entry["life_status"] = tracked_living_mob.stat // Damage if (sensor_mode >= SENSOR_VITALS) @@ -272,7 +272,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) return results -/datum/crewmonitor/ui_act(action,params) +/datum/crewmonitor/ui_act(action, params) . = ..() if(.) return @@ -281,7 +281,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) var/mob/living/silicon/ai/AI = usr if(!istype(AI)) return - AI.ai_camera_track(params["name"]) + AI.ai_tracking_tool.set_tracked_mob(AI, params["name"]) #undef SENSORS_UPDATE_PERIOD #undef UNKNOWN_JOB_ID diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 932444e63a8f9..47a202ae2421a 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -235,10 +235,13 @@ // Set the default tgui state set_default_state() +/obj/machinery/computer/scan_consolenew/LateInitialize() + . = ..() // Link machine with research techweb. Used for discovering and accessing // already discovered mutations if(!CONFIG_GET(flag/no_default_techweb_link) && !stored_research) - stored_research = SSresearch.science_tech + CONNECT_TO_RND_SERVER_ROUNDSTART(stored_research, src) + /obj/machinery/computer/scan_consolenew/ui_interact(mob/user, datum/tgui/ui) . = ..() @@ -716,10 +719,10 @@ //should be a "sometimes" thing, not an "always" thing, but risky enough to force the need for precautions to isolate the subject if(prob(60)) var/datum/disease/advance/random/random_disease = new /datum/disease/advance/random(2,2) - random_disease.try_infect(scanner_occupant, FALSE) + scanner_occupant.ContactContractDisease(random_disease) else if (prob(30)) var/datum/disease/advance/random/random_disease = new /datum/disease/advance/random(3,4) - random_disease.try_infect(scanner_occupant, FALSE) + scanner_occupant.ContactContractDisease(random_disease) //Instantiate list to hold resulting mutation_index var/mutation_data[0] //Start with the bad mutation, overwrite with the desired mutation if it passes the check diff --git a/code/game/machinery/computer/launchpad_control.dm b/code/game/machinery/computer/launchpad_control.dm index 4023192c90c29..5590297c54a3c 100644 --- a/code/game/machinery/computer/launchpad_control.dm +++ b/code/game/machinery/computer/launchpad_control.dm @@ -66,7 +66,7 @@ if(M.buffer && istype(M.buffer, /obj/machinery/launchpad)) if(LAZYLEN(launchpads) < maximum_pads) launchpads |= M.buffer - M.buffer = null + M.set_buffer(null) to_chat(user, span_notice("You upload the data from the [W.name]'s buffer.")) else to_chat(user, span_warning("[src] cannot handle any more connections!")) diff --git a/code/game/machinery/computer/mechlaunchpad.dm b/code/game/machinery/computer/mechlaunchpad.dm index 5eeeb86f3f8d7..106f87f1788f3 100644 --- a/code/game/machinery/computer/mechlaunchpad.dm +++ b/code/game/machinery/computer/mechlaunchpad.dm @@ -35,7 +35,7 @@ connected_mechpad = null /obj/machinery/computer/mechpad/LateInitialize() - for(var/obj/machinery/mechpad/pad in GLOB.mechpad_list) + for(var/obj/machinery/mechpad/pad as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/mechpad)) if(pad == connected_mechpad) continue if(pad.id != id) @@ -100,11 +100,11 @@ if(buffered_pad in mechpads) remove_pad(buffered_pad) connect_launchpad(buffered_pad) - multitool.buffer = null + multitool.set_buffer(null) to_chat(user, span_notice("You connect the console to the pad with data from the [multitool.name]'s buffer.")) else add_pad(buffered_pad) - multitool.buffer = null + multitool.set_buffer(null) to_chat(user, span_notice("You upload the data from the [multitool.name]'s buffer.")) return TRUE diff --git a/code/game/machinery/computer/operating_computer.dm b/code/game/machinery/computer/operating_computer.dm index 954ec03caee9c..3b639a9ce573f 100644 --- a/code/game/machinery/computer/operating_computer.dm +++ b/code/game/machinery/computer/operating_computer.dm @@ -17,19 +17,23 @@ /obj/machinery/computer/operating/Initialize(mapload) . = ..() - if(!CONFIG_GET(flag/no_default_techweb_link) && !linked_techweb) - linked_techweb = SSresearch.science_tech find_table() return INITIALIZE_HINT_LATELOAD /obj/machinery/computer/operating/LateInitialize() . = ..() + if(!CONFIG_GET(flag/no_default_techweb_link) && !linked_techweb) + CONNECT_TO_RND_SERVER_ROUNDSTART(linked_techweb, src) - experiment_handler = AddComponent( \ + var/list/operating_signals = list( + COMSIG_OPERATING_COMPUTER_AUTOPSY_COMPLETE = TYPE_PROC_REF(/datum/component/experiment_handler, try_run_autopsy_experiment), + ) + experiment_handler = AddComponent( /datum/component/experiment_handler, \ - allowed_experiments = list(/datum/experiment/dissection), \ + allowed_experiments = list(/datum/experiment/autopsy), \ config_flags = EXPERIMENT_CONFIG_ALWAYS_ACTIVE, \ config_mode = EXPERIMENT_CONFIG_ALTCLICK, \ + experiment_signals = operating_signals, \ ) /obj/machinery/computer/operating/Destroy() diff --git a/code/game/machinery/computer/orders/order_computer/mining_order.dm b/code/game/machinery/computer/orders/order_computer/mining_order.dm index 890859b4b69fb..214065a243a39 100644 --- a/code/game/machinery/computer/orders/order_computer/mining_order.dm +++ b/code/game/machinery/computer/orders/order_computer/mining_order.dm @@ -59,7 +59,7 @@ radio.talk_into(src, "A shaft miner has ordered equipment which will arrive on the cargo shuttle! Please make sure it gets to them as soon as possible!", radio_channel) SSshuttle.shopping_list += new_order -/obj/machinery/computer/order_console/mining/retrive_points(obj/item/card/id/id_card) +/obj/machinery/computer/order_console/mining/retrieve_points(obj/item/card/id/id_card) return round(id_card.registered_account.mining_points) /obj/machinery/computer/order_console/mining/ui_act(action, params) @@ -149,7 +149,7 @@ icon_state = "data_1" ///Amount of points this card contains. - var/points = 500 + var/points = 0 /obj/item/card/mining_point_card/examine(mob/user) . = ..() diff --git a/code/game/machinery/computer/orders/order_computer/order_computer.dm b/code/game/machinery/computer/orders/order_computer/order_computer.dm index 92942add2ea4e..718fa2bc21819 100644 --- a/code/game/machinery/computer/orders/order_computer/order_computer.dm +++ b/code/game/machinery/computer/orders/order_computer/order_computer.dm @@ -74,9 +74,9 @@ GLOBAL_LIST_EMPTY(order_console_products) /** * points is any type of currency this machine accepts(money, mining points etc) which is displayed on the ui * Args: - * card - The ID card we retrive these points from + * card - The ID card we retrieve these points from */ -/obj/machinery/computer/order_console/proc/retrive_points(obj/item/card/id/id_card) +/obj/machinery/computer/order_console/proc/retrieve_points(obj/item/card/id/id_card) return round(id_card.registered_account?.account_balance) /obj/machinery/computer/order_console/ui_data(mob/user) @@ -95,7 +95,7 @@ GLOBAL_LIST_EMPTY(order_console_products) var/mob/living/living_user = user var/obj/item/card/id/id_card = living_user.get_idcard(TRUE) if(id_card) - data["points"] = retrive_points(id_card) + data["points"] = retrieve_points(id_card) return data @@ -134,12 +134,19 @@ GLOBAL_LIST_EMPTY(order_console_products) switch(action) if("add_one") var/datum/orderable_item/wanted_item = locate(params["target"]) in GLOB.order_console_products - grocery_list[wanted_item] += 1 + if(grocery_list[wanted_item] >= 20) + return + else + grocery_list[wanted_item] += 1 if("remove_one") var/datum/orderable_item/wanted_item = locate(params["target"]) in GLOB.order_console_products if(!grocery_list[wanted_item]) return - grocery_list[wanted_item] -= 1 + if(grocery_list[wanted_item] < 1) + grocery_list[wanted_item] = 0 + return + else + grocery_list[wanted_item] -= 1 if(!grocery_list[wanted_item]) grocery_list -= wanted_item if("cart_set") @@ -156,6 +163,7 @@ GLOBAL_LIST_EMPTY(order_console_products) //So miners cant spam buy crates for a very low price if(get_total_cost() < CARGO_CRATE_VALUE) return + var/obj/item/card/id/used_id_card = living_user.get_idcard(TRUE) if(!used_id_card || !used_id_card.registered_account) say("No bank account detected!") @@ -215,7 +223,7 @@ GLOBAL_LIST_EMPTY(order_console_products) return FALSE /** - * whatever type of points was retrived in retrive_points() subtract those type of points from the card upon confirming order + * whatever type of points was retrieved in retrieve_points() subtract those type of points from the card upon confirming order * Args: * final_cost - amount of points to subtract from this card * card - The ID card to subtract these points from diff --git a/code/game/machinery/computer/orders/order_items/cook/order_milk_eggs.dm b/code/game/machinery/computer/orders/order_items/cook/order_milk_eggs.dm index d3fb31fec302a..fcd0737675bec 100644 --- a/code/game/machinery/computer/orders/order_items/cook/order_milk_eggs.dm +++ b/code/game/machinery/computer/orders/order_items/cook/order_milk_eggs.dm @@ -31,6 +31,16 @@ item_path = /obj/item/food/fishmeat cost_per_order = 12 +/datum/orderable_item/milk_eggs/octopus + name = "Octopus Tentacle" + item_path = /obj/item/food/fishmeat/octopus + cost_per_order = 12 + +/datum/orderable_item/milk_eggs/chicken + name = "Chicken Breast" + item_path = /obj/item/food/meat/slab/chicken + cost_per_order = 15 + /datum/orderable_item/milk_eggs/spider_eggs name = "Spider Eggs" item_path = /obj/item/food/spidereggs @@ -65,6 +75,16 @@ item_path = /obj/item/food/canned/pine_nuts cost_per_order = 20 +/datum/orderable_item/milk_eggs/canned_squid_ink + name = "Canned Squid Ink" + item_path = /obj/item/food/canned/squid_ink + cost_per_order = 20 + +/datum/orderable_item/milk_eggs/chap + name = "Can of CHAP" + item_path = /obj/item/food/canned/chap + cost_per_order = 20 + /datum/orderable_item/milk_eggs/ready_donk name = "Ready-Donk Meal: Bachelor Chow" item_path = /obj/item/food/ready_donk @@ -80,6 +100,16 @@ item_path = /obj/item/food/ready_donk/donkhiladas cost_per_order = 40 +/datum/orderable_item/milk_eggs/ready_donk_nachos + name = "Ready-Donk Meal: Donk Sol Series Boritos Nachos Grandes" + item_path = /obj/item/food/ready_donk/nachos_grandes + cost_per_order = 40 + +/datum/orderable_item/milk_eggs/ready_donk_orange + name = "Ready-Donk Meal: Donk-range Chicken" + item_path = /obj/item/food/ready_donk/donkrange_chicken + cost_per_order = 40 + /datum/orderable_item/milk_eggs/tiziran_goods name = "Tiziran Farm-Fresh Pack" item_path = /obj/item/storage/box/tiziran_goods diff --git a/code/game/machinery/computer/orders/order_items/cook/order_reagents.dm b/code/game/machinery/computer/orders/order_items/cook/order_reagents.dm index db9d20a676fff..d6b4728d10496 100644 --- a/code/game/machinery/computer/orders/order_items/cook/order_reagents.dm +++ b/code/game/machinery/computer/orders/order_items/cook/order_reagents.dm @@ -51,9 +51,9 @@ item_path = /obj/item/reagent_containers/condiment/vinegar cost_per_order = 30 -/datum/orderable_item/reagents/quality_oil - name = "Quality Oil" - item_path = /obj/item/reagent_containers/condiment/quality_oil +/datum/orderable_item/reagents/olive_oil + name = "Olive Oil" + item_path = /obj/item/reagent_containers/condiment/olive_oil cost_per_order = 50 //Extra Virgin, just like you, the reader /datum/orderable_item/reagents/peanut_butter @@ -65,3 +65,33 @@ name = "Cherry Jelly" item_path = /obj/item/reagent_containers/condiment/cherryjelly cost_per_order = 30 + +/datum/orderable_item/reagents/worcestershire + name = "Worcestershire Sauce" + item_path = /obj/item/reagent_containers/condiment/worcestershire + cost_per_order = 30 + +/datum/orderable_item/reagents/red_bay + name = "Red Bay Seasoning" + item_path = /obj/item/reagent_containers/condiment/red_bay + cost_per_order = 30 + +/datum/orderable_item/reagents/curry_powder + name = "Curry Powder" + item_path = /obj/item/reagent_containers/condiment/curry_powder + cost_per_order = 30 + +/datum/orderable_item/reagents/dashi_concentrate + name = "Dashi Concentrate" + item_path = /obj/item/reagent_containers/condiment/dashi_concentrate + cost_per_order = 30 + +/datum/orderable_item/reagents/coconut_milk + name = "Coconut Milk" + item_path = /obj/item/reagent_containers/condiment/coconut_milk + cost_per_order = 30 + +/datum/orderable_item/reagents/grounding_solution + name = "Grounding Solution" + item_path = /obj/item/reagent_containers/condiment/grounding_solution + cost_per_order = 30 diff --git a/code/game/machinery/computer/orders/order_items/cook/order_veggies.dm b/code/game/machinery/computer/orders/order_items/cook/order_veggies.dm index 8b0f9d71a4c22..506920986dd2c 100644 --- a/code/game/machinery/computer/orders/order_items/cook/order_veggies.dm +++ b/code/game/machinery/computer/orders/order_items/cook/order_veggies.dm @@ -26,7 +26,7 @@ name = "Cabbage" item_path = /obj/item/food/grown/cabbage -/datum/orderable_item/veggies/beets +/datum/orderable_item/veggies/onion name = "Onion" item_path = /obj/item/food/grown/onion @@ -84,3 +84,8 @@ name = "Jar of pickles" item_path = /obj/item/storage/fancy/pickles_jar cost_per_order = 60 + +/datum/orderable_item/veggies/pickled_voltvine + name = "Pickled Voltvine" + item_path = /obj/item/food/pickled_voltvine + cost_per_order = 5 diff --git a/code/game/machinery/computer/orders/order_items/mining/order_mining.dm b/code/game/machinery/computer/orders/order_items/mining/order_mining.dm index b41ccfa6254c4..09bbeed2bedc1 100644 --- a/code/game/machinery/computer/orders/order_items/mining/order_mining.dm +++ b/code/game/machinery/computer/orders/order_items/mining/order_mining.dm @@ -26,10 +26,6 @@ item_path = /obj/item/storage/belt/mining cost_per_order = 500 -/datum/orderable_item/mining/point_card - item_path = /obj/item/card/mining_point_card - cost_per_order = 500 - /datum/orderable_item/mining/jaunter item_path = /obj/item/wormhole_jaunter cost_per_order = 750 @@ -72,12 +68,17 @@ /datum/orderable_item/mining/conscription_kit item_path = /obj/item/storage/backpack/duffelbag/mining_conscript + desc = "A kit containing everything a crewmember needs to support a shaft miner in the field." cost_per_order = 1500 /datum/orderable_item/mining/capsule item_path = /obj/item/survivalcapsule cost_per_order = 400 +/datum/orderable_item/mining/capsule/bathroom + item_path = /obj/item/survivalcapsule/bathroom + cost_per_order = 375 + /datum/orderable_item/mining/capsule_luxury item_path = /obj/item/survivalcapsule/luxury cost_per_order = 3000 @@ -101,3 +102,7 @@ /datum/orderable_item/mining/style_meter item_path = /obj/item/style_meter cost_per_order = 1500 + +/datum/orderable_item/mining/weather_radio + item_path = /obj/item/radio/weather_monitor + cost_per_order = 400 diff --git a/code/game/machinery/computer/orders/order_items/mining/order_toys.dm b/code/game/machinery/computer/orders/order_items/mining/order_toys.dm index 06bd9032e74e5..cd1dbf5c67486 100644 --- a/code/game/machinery/computer/orders/order_items/mining/order_toys.dm +++ b/code/game/machinery/computer/orders/order_items/mining/order_toys.dm @@ -14,7 +14,7 @@ cost_per_order = 300 /datum/orderable_item/toys_drones/mining_drone - item_path = /mob/living/simple_animal/hostile/mining_drone + item_path = /mob/living/basic/mining_drone cost_per_order = 800 /datum/orderable_item/toys_drones/drone_health diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index 8db31009cb730..4cc32401704d2 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -139,7 +139,7 @@ /obj/machinery/computer/pod/old/mass_driver_controller name = "\improper Mass Driver Controller" - icon = 'icons/obj/airlock_machines.dmi' + icon = 'icons/obj/machines/wallmounts.dmi' icon_state = "airlock_control_standby" icon_screen = null density = FALSE diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index e3d3a0e2acba9..00b446c2b276f 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -6,6 +6,9 @@ req_access = list(ACCESS_ROBOTICS) circuit = /obj/item/circuitboard/computer/robotics light_color = LIGHT_COLOR_PINK + var/mob/living/silicon/robot/locked_down_borg = null + active_power_usage = 10000 //no idea how much is it + /obj/machinery/computer/robotics/proc/can_control(mob/user, mob/living/silicon/robot/R) . = FALSE @@ -88,21 +91,37 @@ if(allowed(usr)) var/mob/living/silicon/robot/R = locate(params["ref"]) in GLOB.silicon_mobs if(can_control(usr, R) && !..()) - if(isAI(usr) && (R.ai_lockdown && R.lockcharge || !R.lockcharge) || !isAI(usr)) - R.ai_lockdown = FALSE - if(isAI(usr) && !R.lockcharge) + if(isAI(usr)) + if(R.lockcharge) + if(R.ai_lockdown) + R.ai_lockdown = FALSE + lock_unlock_borg(R) + else + to_chat(usr, span_danger("Cyborg locked by an user with superior permissions.")) + else R.ai_lockdown = TRUE - message_admins(span_notice("[ADMIN_LOOKUPFLW(usr)] [!R.lockcharge ? "locked down" : "released"] [ADMIN_LOOKUPFLW(R)]!")) - log_silicon("[key_name(usr)] [!R.lockcharge ? "locked down" : "released"] [key_name(R)]!") - log_combat(usr, R, "[!R.lockcharge ? "locked down" : "released"] cyborg") - R.SetLockdown(!R.lockcharge) - to_chat(R, !R.lockcharge ? span_notice("Your lockdown has been lifted!") : span_alert("You have been locked down!")) - if(R.connected_ai) - to_chat(R.connected_ai, "[!R.lockcharge ? span_notice("NOTICE - Cyborg lockdown lifted") : span_alert("ALERT - Cyborg lockdown detected")]: [R.name]
") + lock_unlock_borg(R) else - to_chat(usr, span_danger("Cyborg locked by an user with superior permissions.")) + if(isnull(locked_down_borg) && !R.lockcharge) //If there is no borg locked down by the console yet + lock_unlock_borg(R, src.loc.loc.name) + R.ai_lockdown = FALSE //Just in case I'm stupid + locked_down_borg = R + RegisterSignal(R, COMSIG_QDELETING, PROC_REF(borg_destroyed)) + else if(locked_down_borg == R) //If the borg locked down by the console is the same as the one we're trying to unlock + lock_unlock_borg(R) + else if(R.lockcharge&&R.ai_lockdown) + R.ai_lockdown = FALSE + lock_unlock_borg(R) + else if(R.lockcharge&&locked_down_borg!=R) + to_chat(usr, span_danger("The cyborg was locked by a different console.")) + else + to_chat(usr, span_danger("You can lock down only one cyborg at a time.")) else to_chat(usr, span_danger("Access Denied.")) + if(!isnull(locked_down_borg)) + use_power = ACTIVE_POWER_USE + else + use_power = IDLE_POWER_USE if("killbot") //Malf AIs, and AIs with a combat upgrade, can detonate their cyborgs remotely. if(!isAI(usr)) @@ -142,3 +161,44 @@ drone.visible_message(span_danger("\the [drone] self-destructs!")) drone.investigate_log("has been gibbed by a robotics console.", INVESTIGATE_DEATHS) drone.gib() + + +// I feel like this should be changed, but I have no idea in what way exactly, so I just extracted it to make the code less of a mess +/obj/machinery/computer/robotics/proc/lock_unlock_borg(mob/living/silicon/robot/R, console_location = null) + if(R.lockcharge && locked_down_borg == R) + UnregisterSignal(locked_down_borg, COMSIG_QDELETING) + locked_down_borg = null + message_admins(span_notice("[ADMIN_LOOKUPFLW(usr)] [!R.lockcharge ? "locked down" : "released"] [ADMIN_LOOKUPFLW(R)]!")) + log_silicon("[key_name(usr)] [!R.lockcharge ? "locked down" : "released"] [key_name(R)]!") + log_combat(usr, R, "[!R.lockcharge ? "locked down" : "released"] cyborg") + R.SetLockdown(!R.lockcharge) + to_chat(R, !R.lockcharge ? span_notice("Your lockdown has been lifted!") : span_alert("You have been locked down!")) + if(!isnull(console_location)) + to_chat(R, span_alert("The approximate location of the console that is keeping you locked down is [console_location]")) + if(R.connected_ai) + to_chat(R.connected_ai, "[!R.lockcharge ? span_notice("NOTICE - Cyborg lockdown lifted") : span_alert("ALERT - Cyborg lockdown detected")]: [R.name]
") + +/obj/machinery/computer/robotics/proc/borg_destroyed() + SIGNAL_HANDLER + locked_down_borg = null + +/obj/machinery/computer/robotics/on_set_machine_stat(old_value) //depowering the console unlocks the borg + if(!isnull(locked_down_borg)) + if(machine_stat & (NOPOWER|BROKEN|MAINT) && locked_down_borg.lockcharge) + src.lock_unlock_borg(locked_down_borg) + return ..() + +/obj/machinery/computer/robotics/atom_break() // This shouldnt be needed, but hitting console doesnt trigger destroy apparently + if(!isnull(locked_down_borg)) + lock_unlock_borg(locked_down_borg) + return ..() + +/obj/machinery/computer/robotics/Destroy() + if(!isnull(locked_down_borg)) + lock_unlock_borg(locked_down_borg) + return ..() + + + + + diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm index 7177da8f4eeca..dd8a051cc8e94 100644 --- a/code/game/machinery/computer/teleporter.dm +++ b/code/game/machinery/computer/teleporter.dm @@ -28,6 +28,14 @@ power_station = null return ..() +/obj/machinery/computer/teleporter/proc/check_for_disabled_beacon(datum/target) + if (!target) + return + if (target.weak_reference != target_ref) + return + turn_off() + set_teleport_target(null) + /obj/machinery/computer/teleporter/proc/link_power_station() if(power_station) return @@ -65,6 +73,11 @@ return data +/obj/machinery/computer/teleporter/proc/turn_off() + power_station.engaged = FALSE + power_station.teleporter_hub.update_appearance() + power_station.teleporter_hub.calibrated = FALSE + /obj/machinery/computer/teleporter/ui_act(action, params) . = ..() if(.) @@ -79,15 +92,11 @@ switch(action) if("regimeset") - power_station.engaged = FALSE - power_station.teleporter_hub.update_appearance() - power_station.teleporter_hub.calibrated = FALSE + turn_off() reset_regime() . = TRUE if("settarget") - power_station.engaged = FALSE - power_station.teleporter_hub.update_appearance() - power_station.teleporter_hub.calibrated = FALSE + turn_off() set_target(usr) . = TRUE if("calibrate") @@ -105,11 +114,18 @@ return TRUE /obj/machinery/computer/teleporter/proc/set_teleport_target(new_target) + var/datum/old_target var/datum/weakref/new_target_ref = WEAKREF(new_target) if (target_ref == new_target_ref) return + if (target_ref) + old_target = target_ref.resolve() SEND_SIGNAL(src, COMSIG_TELEPORTER_NEW_TARGET, new_target) target_ref = new_target_ref + if (istype(old_target, /obj/item/beacon)) + UnregisterSignal(old_target, COMSIG_BEACON_DISABLED) + if (istype(new_target, /obj/item/beacon)) + RegisterSignal(new_target, COMSIG_BEACON_DISABLED, PROC_REF(check_for_disabled_beacon)) /obj/machinery/computer/teleporter/proc/finish_calibration() calibrating = FALSE diff --git a/code/game/machinery/computer/telescreen.dm b/code/game/machinery/computer/telescreen.dm index 9824448de53aa..ceb3c2e923e29 100644 --- a/code/game/machinery/computer/telescreen.dm +++ b/code/game/machinery/computer/telescreen.dm @@ -1,7 +1,7 @@ /obj/machinery/computer/security/telescreen name = "\improper Telescreen" desc = "Used for watching an empty arena." - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/wallmounts.dmi' icon_state = "telescreen" icon_keyboard = null icon_screen = null @@ -16,7 +16,7 @@ /obj/item/wallframe/telescreen name = "telescreen frame" desc = "A wall-mountable telescreen frame. Apply to wall to use." - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/wallmounts.dmi' icon_state = "telescreen" result_path = /obj/machinery/computer/security/telescreen pixel_shift = 32 @@ -35,7 +35,7 @@ /obj/machinery/computer/security/telescreen/entertainment name = "entertainment monitor" desc = "Damn, they better have the /tg/ channel on these things." - icon = 'icons/obj/status_display.dmi' + icon = 'icons/obj/machines/status_display.dmi' icon_state = "entertainment_blank" network = list() density = FALSE @@ -49,13 +49,14 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai /obj/item/wallframe/telescreen/entertainment name = "entertainment telescreen frame" - icon = 'icons/obj/status_display.dmi' + icon = 'icons/obj/machines/status_display.dmi' icon_state = "entertainment_blank" result_path = /obj/machinery/computer/security/telescreen/entertainment /obj/machinery/computer/security/telescreen/entertainment/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_CLICK, PROC_REF(BigClick)) + find_and_hang_on_wall() // Bypass clickchain to allow humans to use the telescreen from a distance /obj/machinery/computer/security/telescreen/entertainment/proc/BigClick() @@ -271,5 +272,5 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai is_show_active = !is_show_active say("The [tv_show_name] show has [is_show_active ? "begun" : "ended"]") var/announcement = is_show_active ? pick(tv_starters) : pick(tv_enders) - for(var/obj/machinery/computer/security/telescreen/entertainment/tv in GLOB.machines) + for(var/obj/machinery/computer/security/telescreen/entertainment/tv as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/computer/security/telescreen/entertainment)) tv.update_shows(is_show_active, tv_network_id, announcement) diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 920fa9281604e..3bf44a9aa9e2d 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -1,7 +1,7 @@ /obj/structure/frame name = "frame" desc = "A generic looking construction frame. One day this will be something greater." - icon = 'icons/obj/stock_parts.dmi' + icon = 'icons/obj/assemblies/stock_parts.dmi' icon_state = "box_0" density = TRUE max_integrity = 250 @@ -183,7 +183,7 @@ set_anchored(!anchored) return - if(istype(P, /obj/item/storage/part_replacer) && P.contents.len) + if(!circuit && istype(P, /obj/item/storage/part_replacer) && P.contents.len) var/obj/item/storage/part_replacer/replacer = P // map of circuitboard names to the board var/list/circuit_boards = list() @@ -208,12 +208,12 @@ attackby(replacer, user, params) return - if(istype(P, /obj/item/circuitboard/machine)) + if(!circuit && istype(P, /obj/item/circuitboard/machine)) var/obj/item/circuitboard/machine/machine_board = P install_board(machine_board, user, TRUE) return - else if(istype(P, /obj/item/circuitboard)) + else if(!circuit && istype(P, /obj/item/circuitboard)) to_chat(user, span_warning("This frame does not accept circuit boards of this type!")) return @@ -269,15 +269,7 @@ P.play_tool_sound(src) var/obj/machinery/new_machine = new circuit.build_path(loc) if(istype(new_machine)) - // Machines will init with a set of default components. Move to nullspace so we don't trigger handle_atom_del, then qdel. - // Finally, replace with this frame's parts. - if(new_machine.circuit) - // Move to nullspace and delete. - new_machine.circuit.moveToNullspace() - QDEL_NULL(new_machine.circuit) - for(var/obj/old_part in new_machine.component_parts) - old_part.moveToNullspace() - qdel(old_part) + new_machine.clear_components() // Set anchor state new_machine.set_anchored(anchored) diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index 1c9a8cee4cf1b..40d1b26e9e914 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -1,18 +1,28 @@ +/// Helper macro to check if the passed mob has jukebox sound preference enabled +#define HAS_JUKEBOX_PREF(mob) (!QDELETED(mob) && !isnull(mob.client) && mob.client.prefs.read_preference(/datum/preference/toggle/sound_jukebox)) + /obj/machinery/jukebox name = "jukebox" desc = "A classic music player." - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/machines/music.dmi' icon_state = "jukebox" verb_say = "states" density = TRUE req_access = list(ACCESS_BAR) + /// Whether we're actively playing music var/active = FALSE - var/list/rangers = list() + /// List of weakrefs to mobs listening to the current song + var/list/datum/weakref/rangers = list() + /// World.time when the current song will stop playing, but also a cooldown between activations var/stop = 0 + /// List of /datum/tracks we can play + /// Inited from config every time a jukebox is instantiated var/list/songs = list() + /// Current song selected var/datum/track/selection = null /// Volume of the songs played var/volume = 50 + /// Cooldown between "Error" sound effects being played COOLDOWN_DECLARE(jukebox_error_cd) /obj/machinery/jukebox/disco @@ -38,32 +48,46 @@ var/song_length = 0 var/song_beat = 0 -/datum/track/New(name, path, length, beat) - song_name = name - song_path = path - song_length = length - song_beat = beat +/datum/track/default + song_path = 'sound/ambience/title3.ogg' + song_name = "Tintin on the Moon" + song_length = 3 MINUTES + 52 SECONDS + song_beat = 1 SECONDS /obj/machinery/jukebox/Initialize(mapload) . = ..() - var/list/tracks = flist("[global.config.directory]/jukebox_music/sounds/") + songs = load_songs_from_config() + if(length(songs)) + selection = pick(songs) - for(var/S in tracks) - var/datum/track/T = new() - T.song_path = file("[global.config.directory]/jukebox_music/sounds/[S]") - var/list/L = splittext(S,"+") - if(L.len != 3) - continue - T.song_name = L[1] - T.song_length = text2num(L[2]) - T.song_beat = text2num(L[3]) - songs |= T +/// Loads the config sounds once, and returns a copy of them. +/obj/machinery/jukebox/proc/load_songs_from_config() + var/static/list/config_songs + if(isnull(config_songs)) + config_songs = list() + var/list/tracks = flist("[global.config.directory]/jukebox_music/sounds/") + for(var/track_file in tracks) + var/datum/track/new_track = new() + new_track.song_path = file("[global.config.directory]/jukebox_music/sounds/[track_file]") + var/list/track_data = splittext(track_file, "+") + if(length(track_data) != 3) + continue + new_track.song_name = track_data[1] + new_track.song_length = text2num(track_data[2]) + new_track.song_beat = text2num(track_data[3]) + config_songs += new_track - if(songs.len) - selection = pick(songs) + if(!length(config_songs)) + // Includes title3 as a default for testing / "no config" support, also because it's a banger + config_songs += new /datum/track/default() + + // returns a copy so it can mutate if desired. + return config_songs.Copy() /obj/machinery/jukebox/Destroy() dance_over() + selection = null + songs.Cut() return ..() /obj/machinery/jukebox/attackby(obj/item/O, mob/user, params) @@ -175,7 +199,7 @@ /obj/machinery/jukebox/proc/activate_music() active = TRUE update_use_power(ACTIVE_POWER_USE) - update_appearance() + update_appearance(UPDATE_ICON_STATE) START_PROCESSING(SSobj, src) stop = world.time + selection.song_length @@ -386,16 +410,20 @@ sleep(0.1 SECONDS) M.lying_fix() -/obj/machinery/jukebox/disco/proc/dance4(mob/living/M) +/obj/machinery/jukebox/disco/proc/dance4(mob/living/lead_dancer) var/speed = rand(1,3) set waitfor = 0 var/time = 30 while(time) sleep(speed) for(var/i in 1 to speed) - M.setDir(pick(GLOB.cardinals)) - for(var/mob/living/carbon/NS in rangers) - NS.set_resting(!NS.resting, TRUE, TRUE) + lead_dancer.setDir(pick(GLOB.cardinals)) + // makes people dance with us nearby + for(var/datum/weakref/weak_dancer as anything in rangers) + var/mob/living/carbon/dancer = weak_dancer.resolve() + if(!istype(dancer)) + continue + dancer.set_resting(!dancer.resting, silent = TRUE, instant = TRUE) time-- /obj/machinery/jukebox/disco/proc/dance5(mob/living/M) @@ -438,11 +466,11 @@ lying_prev = 0 /obj/machinery/jukebox/proc/dance_over() - for(var/mob/living/L in rangers) - if(!L || !L.client) - continue - L.stop_sound_channel(CHANNEL_JUKEBOX) - rangers = list() + for(var/datum/weakref/weak_to_hide_from as anything in rangers) + var/mob/to_hide_from = weak_to_hide_from?.resolve() + to_hide_from?.stop_sound_channel(CHANNEL_JUKEBOX) + + rangers.Cut() /obj/machinery/jukebox/disco/dance_over() ..() @@ -453,30 +481,44 @@ if(world.time < stop && active) var/sound/song_played = sound(selection.song_path) - for(var/mob/M in range(10,src)) - if(!M.client || !(M.client.prefs.read_preference(/datum/preference/toggle/sound_jukebox))) + // Goes through existing mobs in rangers to determine if they should not be played to + for(var/datum/weakref/weak_to_hide_from as anything in rangers) + var/mob/to_hide_from = weak_to_hide_from?.resolve() + if(!HAS_JUKEBOX_PREF(to_hide_from) || get_dist(src, get_turf(to_hide_from)) > 10) + rangers -= weak_to_hide_from + to_hide_from?.stop_sound_channel(CHANNEL_JUKEBOX) + + // Collect mobs to play the song to, stores weakrefs of them in rangers + for(var/mob/to_play_to in range(world.view, src)) + if(!HAS_JUKEBOX_PREF(to_play_to)) continue - if(!(M in rangers)) - rangers[M] = TRUE - M.playsound_local(get_turf(M), null, volume, channel = CHANNEL_JUKEBOX, sound_to_use = song_played, use_reverb = FALSE) - for(var/mob/L in rangers) - if(get_dist(src,L) > 10 || !(L.client.prefs.read_preference(/datum/preference/toggle/sound_jukebox))) - rangers -= L - if(!L || !L.client) - continue - L.stop_sound_channel(CHANNEL_JUKEBOX) + var/datum/weakref/weak_playing_to = WEAKREF(to_play_to) + if(rangers[weak_playing_to]) + continue + rangers[weak_playing_to] = TRUE + // This plays the sound directly underneath the mob because otherwise it'd get stuck in their left ear or whatever + // Would be neat if it sourced from the box itself though + to_play_to.playsound_local(get_turf(to_play_to), null, volume, channel = CHANNEL_JUKEBOX, sound_to_use = song_played, use_reverb = FALSE) + else if(active) active = FALSE update_use_power(IDLE_POWER_USE) STOP_PROCESSING(SSobj, src) dance_over() playsound(src,'sound/machines/terminal_off.ogg',50,TRUE) - update_appearance() + update_appearance(UPDATE_ICON_STATE) stop = world.time + 100 /obj/machinery/jukebox/disco/process() . = ..() - if(active) - for(var/mob/living/M in rangers) - if(prob(5+(allowed(M)*4)) && (M.mobility_flags & MOBILITY_MOVE)) - dance(M) + if(!active) + return + + for(var/datum/weakref/weak_dancer as anything in rangers) + var/mob/living/to_dance = weak_dancer.resolve() + if(!istype(to_dance) || !(to_dance.mobility_flags & MOBILITY_MOVE)) + continue + if(prob(5 + (allowed(to_dance) * 4))) + dance(to_dance) + +#undef HAS_JUKEBOX_PREF diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm index e72f3f4ddf556..cb12a39926021 100644 --- a/code/game/machinery/defibrillator_mount.dm +++ b/code/game/machinery/defibrillator_mount.dm @@ -23,19 +23,21 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/defibrillator_mount, 28) /obj/machinery/defibrillator_mount/loaded/Initialize(mapload) //loaded subtype for mapping use . = ..() defib = new/obj/item/defibrillator/loaded(src) + find_and_hang_on_wall() MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/defibrillator_mount, 28) /obj/machinery/defibrillator_mount/Destroy() - if(defib) - QDEL_NULL(defib) - . = ..() + QDEL_NULL(defib) + return ..() -/obj/machinery/defibrillator_mount/handle_atom_del(atom/A) - if(A == defib) - defib = null +/obj/machinery/defibrillator_mount/Exited(atom/movable/gone, direction) + . = ..() + if(gone == defib) + // Make sure processing ends before the defib is nulled end_processing() - return ..() + defib = null + update_appearance() /obj/machinery/defibrillator_mount/examine(mob/user) . = ..() @@ -171,10 +173,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/defibrillator_mount, 28) user.visible_message(span_notice("[user] unhooks [defib] from [src]."), \ span_notice("You slide out [defib] from [src] and unhook the charging cables.")) playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) - // Make sure processing ends before the defib is nulled - end_processing() - defib = null - update_appearance() /obj/machinery/defibrillator_mount/charging name = "PENLITE defibrillator mount" diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 79f2aea25b90b..e4d01a6aa36bc 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -28,7 +28,7 @@ /obj/structure/barricade/attackby(obj/item/I, mob/living/user, params) if(I.tool_behaviour == TOOL_WELDER && !user.combat_mode && bar_material == METAL) if(atom_integrity < max_integrity) - if(!I.tool_start_check(user, amount=0)) + if(!I.tool_start_check(user, amount=1)) return to_chat(user, span_notice("You begin repairing [src]...")) @@ -133,7 +133,7 @@ /obj/structure/barricade/security name = "security barrier" desc = "A deployable barrier. Provides good cover in fire fights." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/structures.dmi' icon_state = "barrier0" density = FALSE anchored = FALSE diff --git a/code/game/machinery/digital_clock.dm b/code/game/machinery/digital_clock.dm new file mode 100644 index 0000000000000..d0b695428afeb --- /dev/null +++ b/code/game/machinery/digital_clock.dm @@ -0,0 +1,160 @@ +/obj/machinery/digital_clock + name = "digital clock" + desc = "An ultra-futuristic, sleek, advanced, next-gen normal digital clock that tells the time. Powered by bluespace. Despite supposedly being better in every way to classic clocks, it just doesn't feel the same. They just don't make them the way they used to..." + icon_state = "digital_clock_base" + icon = 'icons/obj/digital_clock.dmi' + verb_say = "beeps" + verb_ask = "bloops" + verb_exclaim = "blares" + density = FALSE + layer = ABOVE_WINDOW_LAYER + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 7, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 4) + +/obj/item/wallframe/digital_clock + name = "digital clock frame" + desc = "Used to build digital clocks, just secure to the wall." + icon_state = "digital_clock_base" + icon = 'icons/obj/digital_clock.dmi' + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 7, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 4) + result_path = /obj/machinery/digital_clock + pixel_shift = 28 + +/obj/machinery/digital_clock/wrench_act_secondary(mob/living/user, obj/item/tool) + . = ..() + balloon_alert(user, "[anchored ? "un" : ""]securing...") + tool.play_tool_sound(src) + if(tool.use_tool(src, user, 6 SECONDS)) + playsound(loc, 'sound/items/deconstruct.ogg', 50, vary = TRUE) + balloon_alert(user, "[anchored ? "un" : ""]secured") + deconstruct() + return TRUE + +/obj/machinery/digital_clock/welder_act(mob/living/user, obj/item/tool) + if(user.combat_mode) + return + if(atom_integrity >= max_integrity) + balloon_alert(user, "it doesn't need repairs!") + return TRUE + balloon_alert(user, "repairing display...") + if(!tool.use_tool(src, user, 4 SECONDS, amount = 0, volume=50)) + return TRUE + balloon_alert(user, "repaired") + atom_integrity = max_integrity + set_machine_stat(machine_stat & ~BROKEN) + update_appearance() + return TRUE + +/obj/machinery/digital_clock/multitool_act(mob/living/user, obj/item/tool) + if(user.combat_mode) + return + if(!(obj_flags & EMAGGED)) + return + balloon_alert(user, "resetting...") + tool.play_tool_sound(src) + if(tool.use_tool(src, user, 6 SECONDS)) + playsound(loc, 'sound/items/deconstruct.ogg', 50, vary = TRUE) + balloon_alert(user, "reset") + obj_flags &= ~EMAGGED + return TRUE + +/obj/machinery/digital_clock/emag_act(mob/user, obj/item/card/emag/emag_card) + if(obj_flags & EMAGGED) + return FALSE + playsound(src, SFX_SPARKS, 100, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) + do_sparks(3, cardinal_only = FALSE, source = src) + obj_flags |= EMAGGED + return TRUE + +/obj/machinery/digital_clock/emp_act(severity) + . = ..() + emag_act() + +/obj/machinery/digital_clock/deconstruct(disassembled = TRUE) + if(flags_1 & NODECONSTRUCT_1) + return + if(disassembled) + new /obj/item/wallframe/digital_clock(drop_location()) + else + new /obj/item/stack/sheet/iron(drop_location(), 2) + new /obj/item/shard(drop_location()) + new /obj/item/shard(drop_location()) + qdel(src) + +/obj/machinery/digital_clock/Initialize(mapload) + . = ..() + START_PROCESSING(SSdigital_clock, src) + find_and_hang_on_wall() + +/obj/machinery/digital_clock/Destroy() + STOP_PROCESSING(SSdigital_clock, src) + return ..() + +/obj/machinery/digital_clock/process(seconds_per_tick) + if(machine_stat & NOPOWER) + return + update_appearance() + + +/obj/machinery/digital_clock/update_appearance(updates=ALL) + . = ..() + if(machine_stat & (NOPOWER|BROKEN)) + set_light(0) + return + set_light(l_range = 1.5, l_power = 0.7, l_color = LIGHT_COLOR_BLUE) // blue light + +/obj/machinery/digital_clock/update_overlays() + . = ..() + + if(machine_stat & (NOPOWER|BROKEN)) + return + . += update_time() + return . + +/obj/machinery/digital_clock/proc/update_time() + var/station_minutes + if(obj_flags & EMAGGED) + station_minutes = rand(0, 99) + else + station_minutes = text2num(station_time_timestamp(format = "mm")) + + // tenth / the '3' in '31' / 31 -> 3.1 -> 3 + var/station_minute_tenth = station_minutes >= 10 ? round(station_minutes * 0.1) : 0 + // one / the '1' in '31' / 31 -> 31 - (3 * 10) -> 31 - 30 -> 1 + var/station_minute_one = station_minutes - (station_minute_tenth * 10) + + var/station_hours + + if(obj_flags & EMAGGED) + station_hours = rand(0, 99) + else + station_hours = text2num(station_time_timestamp(format = "hh")) + + // one / the '1' in '12' / 12 -> 1.2 -> 1 + var/station_hours_tenth = station_minutes >= 10 ? round(station_hours * 0.1) : 0 + // tenth / the '2' in '12' / 12 -> 12 - (1 * 10) -> 12 - 10 -> 2 + var/station_hours_one = station_hours - (station_hours_tenth * 10) + + var/return_overlays = list() + + var/mutable_appearance/minute_one_overlay = mutable_appearance('icons/obj/digital_clock.dmi', "+[station_minute_one]") + minute_one_overlay.pixel_w = 0 + return_overlays += minute_one_overlay + + var/mutable_appearance/minute_tenth_overlay = mutable_appearance('icons/obj/digital_clock.dmi', "+[station_minute_tenth]") + minute_tenth_overlay.pixel_w = -4 + return_overlays += minute_tenth_overlay + + var/mutable_appearance/separator = mutable_appearance('icons/obj/digital_clock.dmi', "+separator") + return_overlays += separator + + var/mutable_appearance/hour_one_overlay = mutable_appearance('icons/obj/digital_clock.dmi', "+[station_hours_one]") + hour_one_overlay.pixel_w = -10 + return_overlays += hour_one_overlay + + var/mutable_appearance/hour_tenth_overlay = mutable_appearance('icons/obj/digital_clock.dmi', "+[station_hours_tenth]") + hour_tenth_overlay.pixel_w = -14 + return_overlays += hour_tenth_overlay + + return return_overlays + +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/digital_clock, 28) diff --git a/code/game/machinery/dish_drive.dm b/code/game/machinery/dish_drive.dm index 3f64171fd2c4e..8cdef9b252242 100644 --- a/code/game/machinery/dish_drive.dm +++ b/code/game/machinery/dish_drive.dm @@ -3,13 +3,15 @@ desc = "A culinary marvel that uses matter-to-energy conversion to store dishes and shards. Convenient! \ Additional features include a vacuum function to suck in nearby dishes, and an automatic transfer beam that empties its contents into nearby disposal bins every now and then. \ Or you can just drop your plates on the floor, like civilized folk." - icon = 'icons/obj/kitchen.dmi' + icon = 'icons/obj/machines/kitchen.dmi' icon_state = "synthesizer" active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.04 density = FALSE circuit = /obj/item/circuitboard/machine/dish_drive pass_flags = PASSTABLE - var/static/list/collectable_items = list(/obj/item/trash/waffles, + /// List of dishes the drive can hold + var/static/list/collectable_items = list( + /obj/item/trash/waffles, /obj/item/broken_bottle, /obj/item/kitchen/fork, /obj/item/plate, @@ -19,16 +21,24 @@ /obj/item/shard, /obj/item/trash/tray, ) - var/static/list/disposable_items = list(/obj/item/trash/waffles, + /// List of items the drive detects as trash + var/static/list/disposable_items = list( + /obj/item/trash/waffles, /obj/item/broken_bottle, /obj/item/plate_shard, /obj/item/shard, /obj/item/trash/tray, ) - var/time_since_dishes = 0 + /// Can this suck up dishes? var/suction_enabled = TRUE + /// Does this automatically dispose of trash? var/transmit_enabled = TRUE + /// List of dishes currently inside var/list/dish_drive_contents + /// Distance this is capable of sucking dishes up over. (2 + servo tier) + var/suck_distance = 0 + + COOLDOWN_DECLARE(time_since_dishes) /obj/machinery/dish_drive/Initialize(mapload) . = ..() @@ -38,16 +48,34 @@ . = ..() if(user.Adjacent(src)) . += span_notice("Alt-click it to beam its contents to any nearby disposal bins.") + if(!LAZYLEN(dish_drive_contents)) + . += "[src] is empty!" + return + // Makes a list of all dishes in the drive, as well as what dish will be taken out next. + var/list/dish_list = list() + // All the types in our list + var/list/dish_types = list() + for(var/obj/dish in dish_drive_contents) + dish_types[dish.type] += 1 + for(var/dish_path in unique_list(dish_types)) + // Counts our dish + var/dish_amount = dish_types[dish_path] + // Handles plurals + var/obj/dish = dish_path + var/dish_name = dish_amount == 1 ? initial(dish.name) : "[initial(dish.name)][plural_s(initial(dish.name))]" + dish_list += list("[dish_amount] [dish_name]") + + . += span_info("It contains [english_list(dish_list)].\n[peek(dish_drive_contents)] is at the top of the pile.") /obj/machinery/dish_drive/attack_hand(mob/living/user, list/modifiers) . = ..() if(!LAZYLEN(dish_drive_contents)) - to_chat(user, span_warning("There's nothing in [src]!")) + balloon_alert(user, "drive empty") return - var/obj/item/I = LAZYACCESS(dish_drive_contents, LAZYLEN(dish_drive_contents)) //the most recently-added item - LAZYREMOVE(dish_drive_contents, I) - user.put_in_hands(I) - to_chat(user, span_notice("You take out [I] from [src].")) + var/obj/item/dish = LAZYACCESS(dish_drive_contents, LAZYLEN(dish_drive_contents)) //the most recently-added item + LAZYREMOVE(dish_drive_contents, dish) + user.put_in_hands(dish) + balloon_alert(user, "[dish] taken") playsound(src, 'sound/items/pshoom.ogg', 50, TRUE) flick("synthesizer_beam", src) @@ -56,23 +84,27 @@ default_unfasten_wrench(user, tool) return TOOL_ACT_TOOLTYPE_SUCCESS -/obj/machinery/dish_drive/attackby(obj/item/I, mob/living/user, params) - if(is_type_in_list(I, collectable_items) && !user.combat_mode) - if(!user.transferItemToLoc(I, src)) +/obj/machinery/dish_drive/attackby(obj/item/dish, mob/living/user, params) + if(is_type_in_list(dish, collectable_items) && !user.combat_mode) + if(!user.transferItemToLoc(dish, src)) return - LAZYADD(dish_drive_contents, I) - to_chat(user, span_notice("You put [I] in [src], and it's beamed into energy!")) + LAZYADD(dish_drive_contents, dish) + balloon_alert(user, "[dish] placed in drive") playsound(src, 'sound/items/pshoom.ogg', 50, TRUE) flick("synthesizer_beam", src) return - else if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-o", initial(icon_state), I)) + else if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-o", initial(icon_state), dish)) return - else if(default_deconstruction_crowbar(I, FALSE)) + else if(default_deconstruction_crowbar(dish, FALSE)) return ..() /obj/machinery/dish_drive/RefreshParts() . = ..() + suck_distance = 0 + for(var/datum/stock_part/servo/servo in component_parts) + suck_distance = servo.tier + // Lowers power use for total tier var/total_rating = 0 for(var/datum/stock_part/stock_part in component_parts) total_rating += stock_part.tier @@ -81,31 +113,32 @@ else update_mode_power_usage(IDLE_POWER_USE, max(0, initial(idle_power_usage) - total_rating)) update_mode_power_usage(ACTIVE_POWER_USE, max(0, initial(active_power_usage) - total_rating)) + // Board options var/obj/item/circuitboard/machine/dish_drive/board = locate() in component_parts if(board) suction_enabled = board.suction transmit_enabled = board.transmit /obj/machinery/dish_drive/process() - if(time_since_dishes <= world.time && transmit_enabled) + if(COOLDOWN_FINISHED(src, time_since_dishes) && transmit_enabled) do_the_dishes() if(!suction_enabled) return - for(var/obj/item/I in view(4, src)) - if(is_type_in_list(I, collectable_items) && I.loc != src && (!I.reagents || !I.reagents.total_volume) && (I.contents.len < 1)) - if(I.Adjacent(src)) - LAZYADD(dish_drive_contents, I) - visible_message(span_notice("[src] beams up [I]!")) - I.forceMove(src) + for(var/obj/item/dish in view(2 + suck_distance, src)) + if(is_type_in_list(dish, collectable_items) && dish.loc != src && (!dish.reagents || !dish.reagents.total_volume) && (dish.contents.len < 1)) + if(dish.Adjacent(src)) + LAZYADD(dish_drive_contents, dish) + visible_message(span_notice("[src] beams up [dish]!")) + dish.forceMove(src) playsound(src, 'sound/items/pshoom.ogg', 50, TRUE) flick("synthesizer_beam", src) else - step_towards(I, src) + step_towards(dish, src) /obj/machinery/dish_drive/attack_ai(mob/living/user) if(machine_stat) return - to_chat(user, span_notice("You send a disposal transmission signal to [src].")) + balloon_alert(user, "disposal signal sent") do_the_dishes(TRUE) /obj/machinery/dish_drive/AltClick(mob/living/user) @@ -124,10 +157,10 @@ playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE) return var/disposed = 0 - for(var/obj/item/I in dish_drive_contents) - if(is_type_in_list(I, disposable_items)) - LAZYREMOVE(dish_drive_contents, I) - I.forceMove(bin) + for(var/obj/item/dish in dish_drive_contents) + if(is_type_in_list(dish, disposable_items)) + LAZYREMOVE(dish_drive_contents, dish) + dish.forceMove(bin) use_power(active_power_usage) disposed++ if (disposed) @@ -138,5 +171,7 @@ bin.update_appearance() flick("synthesizer_beam", src) else - visible_message(span_notice("There are no disposable items in [src]!")) - time_since_dishes = world.time + 600 + if(manual) + visible_message(span_notice("There are no disposable items in [src]!")) + return + COOLDOWN_START(src, time_since_dishes, 1 MINUTES) diff --git a/code/game/machinery/dna_infuser/dna_infuser.dm b/code/game/machinery/dna_infuser/dna_infuser.dm index 1b8964ad6868b..8275eb1e948fc 100644 --- a/code/game/machinery/dna_infuser/dna_infuser.dm +++ b/code/game/machinery/dna_infuser/dna_infuser.dm @@ -136,6 +136,7 @@ new_organ = new new_organ() new_organ.replace_into(target) check_tier_progression(target) + return TRUE /// Picks a random mutated organ from the infuser entry which is also compatible with the target mob. /// Tries to return a typepath of a valid mutant organ if all of the following criteria are true: @@ -151,7 +152,7 @@ for(var/obj/item/organ/new_organ as anything in infusing_into.output_organs) var/obj/item/organ/old_organ = target.get_organ_slot(initial(new_organ.slot)) if(old_organ) - if((old_organ.type != new_organ) && (old_organ.status != ORGAN_ROBOTIC)) + if((old_organ.type != new_organ) && !IS_ROBOTIC_ORGAN(old_organ)) continue // Old organ can be mutated! else if(ispath(new_organ, /obj/item/organ/external)) continue // External organ can be grown! diff --git a/code/game/machinery/dna_infuser/infuser_book.dm b/code/game/machinery/dna_infuser/infuser_book.dm index 84a78a4899a70..75632178ccae3 100644 --- a/code/game/machinery/dna_infuser/infuser_book.dm +++ b/code/game/machinery/dna_infuser/infuser_book.dm @@ -2,18 +2,28 @@ /obj/item/infuser_book name = "DNA infusion book" desc = "An entire book on how to not turn yourself into a fly mutant." - icon = 'icons/obj/library.dmi' + icon = 'icons/obj/service/library.dmi' icon_state ="book" worn_icon_state = "book" throw_speed = 2 throw_range = 5 w_class = WEIGHT_CLASS_TINY + drop_sound = 'sound/items/handling/book_drop.ogg' + pickup_sound = 'sound/items/handling/book_pickup.ogg' /obj/item/infuser_book/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "InfuserBook") ui.open() + playsound(src, SFX_PAGE_TURN, 30, TRUE) + +/obj/item/infuser_book/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + if(action == "play_flip_sound") + playsound(src, SFX_PAGE_TURN, 30, TRUE) /obj/item/infuser_book/ui_static_data(mob/user) var/list/data = list() diff --git a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_one_entries.dm b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_one_entries.dm index 99431834d8331..d24a951d76b52 100644 --- a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_one_entries.dm +++ b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_one_entries.dm @@ -16,7 +16,7 @@ "a tendril hand can easily dig through basalt and obliterate hostile fauna, but your glove-wearing days are behind you...", ) input_obj_or_mob = list( - /mob/living/simple_animal/hostile/asteroid/goliath, + /mob/living/basic/mining/goliath, ) output_organs = list( /obj/item/organ/internal/brain/goliath, @@ -75,3 +75,33 @@ infusion_desc = "skittish" tier = DNA_MUTANT_TIER_ONE status_effect_type = /datum/status_effect/organ_set_bonus/rat + +/datum/infuser_entry/roach + name = "Roach" + infuse_mob_name = "cockroach" + desc = "It seems as if you're a fan of ancient literature by your interest in this. Assuredly, merging cockroach DNA into your genome \ + will not cause you to become incapable of leaving your bed. These creatures are incredibly resilient against many things \ + humans are weak to, and we can use that! Who wouldn't like to survive a nuclear blast? \ + NOTE: Squished roaches will not work for the infuser, if that wasn't obvious. Try spraying them with some pestkiller from botany!" + threshold_desc = "you will no longer be gibbed by explosions, and gain incredible resistance to viruses and radiation." + qualities = list( + "resilience to attacks from behind", + "healthier organs", + "get over disgust very quickly", + "the ability to survive a nuclear apocalypse", + "harder to pick yourself up from falling over", + "avoid toxins at all costs", + "always down to find a snack", + ) + input_obj_or_mob = list( + /mob/living/basic/cockroach, + ) + output_organs = list( + /obj/item/organ/internal/heart/roach, + /obj/item/organ/internal/stomach/roach, + /obj/item/organ/internal/liver/roach, + /obj/item/organ/internal/appendix/roach, + ) + infusion_desc = "kafkaesque" // Gregor Samsa !! + tier = DNA_MUTANT_TIER_ONE + status_effect_type = /datum/status_effect/organ_set_bonus/roach diff --git a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm index 64f251f0c1c8a..b078b5c76edf9 100644 --- a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm +++ b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm @@ -38,7 +38,7 @@ "i hope it was worth it", ) input_obj_or_mob = list( - /mob/living/simple_animal/pet/fox, + /mob/living/basic/pet/fox, ) output_organs = list( /obj/item/organ/internal/ears/fox, diff --git a/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm b/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm index 74d028d22c6fa..257831472d601 100644 --- a/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm @@ -37,6 +37,9 @@ icon = 'icons/obj/medical/organs/fly_organs.dmi' say_mod = "buzzes" taste_sensitivity = 25 // you eat vomit, this is a mercy + liked_foodtypes = GROSS | GORE // nasty ass + disliked_foodtypes = NONE + toxic_foodtypes = NONE // these fucks eat vomit, i am sure they can handle drinking bleach or whatever too modifies_speech = TRUE languages_native = list(/datum/language/buzzwords) @@ -103,7 +106,7 @@ var/mob/living/carbon/body = owner ASSERT(istype(body)) // we do not lose any nutrition as a fly when vomiting out food - body.vomit(lost_nutrition = 0, stun = FALSE, distance = 2, force = TRUE, purge_ratio = 0.67) + body.vomit(vomit_flags = (MOB_VOMIT_MESSAGE | MOB_VOMIT_FORCE | MOB_VOMIT_HARM), lost_nutrition = 0, distance = 2, purge_ratio = 0.67) playsound(get_turf(owner), 'sound/effects/splat.ogg', 50, TRUE) body.visible_message( span_danger("[body] vomits on the floor!"), diff --git a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm index 3af357213b7b1..96c33871a4055 100644 --- a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm @@ -42,57 +42,17 @@ icon_state = "stomach" greyscale_config = /datum/greyscale_config/mutant_organ greyscale_colors = RAT_COLORS - /// Multiplier of [physiology.hunger_mod]. - var/hunger_mod = 10 + hunger_modifier = 10 /obj/item/organ/internal/stomach/rat/Initialize(mapload) . = ..() AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/rat) AddElement(/datum/element/noticable_organ, "mouth is drooling excessively.", BODY_ZONE_PRECISE_MOUTH) -/obj/item/organ/internal/stomach/rat/on_insert(mob/living/carbon/receiver) - . = ..() - if(!ishuman(receiver)) - return - var/mob/living/carbon/human/human_holder = receiver - if(!human_holder.can_mutate()) - return - var/datum/species/species = human_holder.dna.species - //mmm, cheese. doesn't especially like anything else - species.liked_food = DAIRY - //but a rat can eat anything without issue - species.disliked_food = NONE - species.toxic_food = NONE - if(human_holder.physiology) - human_holder.physiology.hunger_mod *= hunger_mod - RegisterSignal(human_holder, COMSIG_SPECIES_GAIN, PROC_REF(on_species_gain)) - -/obj/item/organ/internal/stomach/rat/proc/on_species_gain(datum/source, datum/species/new_species, datum/species/old_species) - SIGNAL_HANDLER - new_species.liked_food = DAIRY - new_species.disliked_food = NONE - new_species.toxic_food = NONE - -/obj/item/organ/internal/stomach/rat/on_remove(mob/living/carbon/stomach_owner) - . = ..() - if(!ishuman(stomach_owner)) - return - var/mob/living/carbon/human/human_holder = stomach_owner - if(!human_holder.can_mutate()) - return - var/datum/species/species = human_holder.dna.species - species.liked_food = initial(species.liked_food) - species.disliked_food = initial(species.disliked_food) - species.toxic_food = initial(species.toxic_food) - if(human_holder.physiology) - human_holder.physiology.hunger_mod /= hunger_mod - UnregisterSignal(stomach_owner, COMSIG_SPECIES_GAIN) - /// makes you smaller, walk over tables, and take 1.5x damage /obj/item/organ/internal/heart/rat name = "mutated rat-heart" desc = "Rat DNA infused into what was once a normal heart." - icon = 'icons/obj/medical/organs/infuser_organs.dmi' icon_state = "heart" greyscale_config = /datum/greyscale_config/mutant_organ @@ -130,13 +90,15 @@ /obj/item/organ/internal/tongue/rat name = "mutated rat-tongue" desc = "Rat DNA infused into what was once a normal tongue." - say_mod = "squeaks" - modifies_speech = TRUE - icon = 'icons/obj/medical/organs/infuser_organs.dmi' icon_state = "tongue" + say_mod = "squeaks" + modifies_speech = TRUE greyscale_config = /datum/greyscale_config/mutant_organ greyscale_colors = RAT_COLORS + liked_foodtypes = DAIRY //mmm, cheese. doesn't especially like anything else + disliked_foodtypes = NONE //but a rat can eat anything without issue + toxic_foodtypes = NONE /obj/item/organ/internal/tongue/rat/Initialize(mapload) . = ..() @@ -171,7 +133,7 @@ . = ..() if(prob(5)) owner.emote("squeaks") - playsound(owner, 'sound/effects/mousesqueek.ogg', 100) + playsound(owner, 'sound/creatures/mousesqueek.ogg', 100) #undef RAT_ORGAN_COLOR #undef RAT_SCLERA_COLOR diff --git a/code/game/machinery/dna_infuser/organ_sets/roach_organs.dm b/code/game/machinery/dna_infuser/organ_sets/roach_organs.dm new file mode 100644 index 0000000000000..4aa96728358e4 --- /dev/null +++ b/code/game/machinery/dna_infuser/organ_sets/roach_organs.dm @@ -0,0 +1,226 @@ +#define ROACH_ORGAN_COLOR "#7c4200" +// Yeah i'm lazy and we don't use any of the other color slots +#define ROACH_COLORS ROACH_ORGAN_COLOR + ROACH_ORGAN_COLOR + ROACH_ORGAN_COLOR + +/datum/armor/roach_internal_armor + bomb = 100 + bio = 90 + +/datum/status_effect/organ_set_bonus/roach + id = "organ_set_bonus_roach" + organs_needed = 4 + bonus_activate_text = span_notice("Roach DNA is deeply infused with you! \ + You feel increasingly resistant to explosives, radiation, and viral agents.") + bonus_deactivate_text = span_notice("You are no longer majority roach, \ + and you feel much more vulnerable to nuclear apocalypses.") + // - Immunity to nuke gibs + // - Nukes come with radiation (not actually but yknow) + bonus_traits = list(TRAIT_NUKEIMMUNE, TRAIT_RADIMMUNE, TRAIT_VIRUS_RESISTANCE) + /// Armor type attached to the owner's physiology + var/datum/armor/given_armor = /datum/armor/roach_internal_armor + /// Storing biotypes pre-organ bonus applied so we don't remove bug from mobs which should have it. + var/old_biotypes = NONE + +/datum/status_effect/organ_set_bonus/roach/enable_bonus() + . = ..() + if(!ishuman(owner)) + return + + var/mob/living/carbon/human/human_owner = owner + human_owner.physiology.armor = human_owner.physiology.armor.add_other_armor(given_armor) + + old_biotypes = human_owner.mob_biotypes + human_owner.mob_biotypes |= MOB_BUG + +/datum/status_effect/organ_set_bonus/roach/disable_bonus() + . = ..() + if(!ishuman(owner) || QDELETED(owner)) + return + + var/mob/living/carbon/human/human_owner = owner + human_owner.physiology.armor = human_owner.physiology.armor.subtract_other_armor(given_armor) + + if(!(old_biotypes & MOB_BUG)) // only remove bug if it wasn't there before + human_owner.mob_biotypes &= ~MOB_BUG + +/// Roach heart: +/// Reduces damage taken from brute attacks from behind, +/// but increases duration of knockdowns +/obj/item/organ/internal/heart/roach + name = "mutated roach-heart" + desc = "Roach DNA infused into what was once a normal heart." + maxHealth = 2 * STANDARD_ORGAN_THRESHOLD + + icon = 'icons/obj/medical/organs/infuser_organs.dmi' + icon_state = "heart" + greyscale_config = /datum/greyscale_config/mutant_organ + greyscale_colors = ROACH_COLORS + + /// Timer ID for resetting the damage resistance applied from attacks from behind + var/defense_timerid + /// Bodypart overlay applied to the chest the heart is in + var/datum/bodypart_overlay/simple/roach_shell/roach_shell + +/obj/item/organ/internal/heart/roach/Initialize(mapload) + . = ..() + AddElement(/datum/element/noticable_organ, "has hardened, somewhat translucent skin.") + AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/roach) + roach_shell = new() + +/obj/item/organ/internal/heart/roach/Destroy() + QDEL_NULL(roach_shell) + return ..() + +/obj/item/organ/internal/heart/roach/on_insert(mob/living/carbon/organ_owner, special) + . = ..() + if(!ishuman(organ_owner)) + return + + var/mob/living/carbon/human/human_owner = organ_owner + + RegisterSignal(human_owner, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(modify_damage)) + human_owner.physiology.knockdown_mod *= 3 + + var/obj/item/bodypart/chest/chest = human_owner.get_bodypart(BODY_ZONE_CHEST) + chest.add_bodypart_overlay(roach_shell) + human_owner.update_body_parts() + +/obj/item/organ/internal/heart/roach/on_remove(mob/living/carbon/organ_owner, special) + . = ..() + if(!ishuman(organ_owner) || QDELETED(organ_owner)) + return + + var/mob/living/carbon/human/human_owner = organ_owner + + UnregisterSignal(human_owner, COMSIG_MOB_APPLY_DAMAGE) + human_owner.physiology.knockdown_mod /= 3 + + if(defense_timerid) + reset_damage(human_owner) + + var/obj/item/bodypart/chest/chest = human_owner.get_bodypart(BODY_ZONE_CHEST) + chest.remove_bodypart_overlay(roach_shell) + human_owner.update_body_parts() + +/** + * Signal proc for [COMSIG_MOB_APPLY_DAMAGE] + * + * Being hit with brute damage in the back will impart a large damage resistance bonus for a very short period. + */ +/obj/item/organ/internal/heart/roach/proc/modify_damage(datum/source, damage, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, obj/item/attacking_item) + SIGNAL_HANDLER + + if(!ishuman(owner) || !attack_direction || damagetype != BRUTE || owner.stat >= UNCONSCIOUS) + return + + var/mob/living/carbon/human/human_owner = owner + // No tactical spinning + if(human_owner.flags_1 & IS_SPINNING_1) + return + + // If we're lying down, or were attacked from the back, we get armor. + var/should_armor_up = (human_owner.body_position == LYING_DOWN) || (human_owner.dir & attack_direction) + if(!should_armor_up) + return + + // Take 50% less damage from attack behind us + if(!defense_timerid) + human_owner.physiology.brute_mod /= 2 + human_owner.visible_message(span_warning("[human_owner]'s back hardens against the blow!")) + playsound(human_owner, 'sound/effects/constructform.ogg', 25, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) + + defense_timerid = addtimer(CALLBACK(src, PROC_REF(reset_damage), owner), 5 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE) + +/obj/item/organ/internal/heart/roach/proc/reset_damage(mob/living/carbon/human/human_owner) + defense_timerid = null + if(!QDELETED(human_owner)) + human_owner.physiology.brute_mod *= 2 + human_owner.visible_message(span_warning("[human_owner]'s back softens again.")) + +// Simple overlay so we can add a roach shell to guys with roach hearts +/datum/bodypart_overlay/simple/roach_shell + icon_state = "roach_shell" + layers = EXTERNAL_FRONT|EXTERNAL_BEHIND + +/datum/bodypart_overlay/simple/roach_shell/get_image(image_layer, obj/item/bodypart/limb) + return image( + icon = icon, + icon_state = "[icon_state]_[mutant_bodyparts_layertext(image_layer)]", + layer = image_layer, + ) + +/// Roach stomach: +/// Makes disgust a non-issue, very slightly worse at passing off reagents +/// Also makes you more hungry +/obj/item/organ/internal/stomach/roach + name = "mutated roach-stomach" + desc = "Roach DNA infused into what was once a normal stomach." + maxHealth = 2 * STANDARD_ORGAN_THRESHOLD + disgust_metabolism = 32 // Demolishes any disgust we have + metabolism_efficiency = 0.033 // Slightly worse at transferring reagents + hunger_modifier = 3 + + icon = 'icons/obj/medical/organs/infuser_organs.dmi' + icon_state = "stomach" + greyscale_config = /datum/greyscale_config/mutant_organ + greyscale_colors = ROACH_COLORS + +/obj/item/organ/internal/stomach/roach/Initialize(mapload) + . = ..() + AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/roach) + +/// Roach liver: +/// Purges toxins at a higher threshold, but takes more damage from them if not purged +/obj/item/organ/internal/liver/roach + name = "mutated roach-liver" + desc = "Roach DNA infused into what was once a normal liver." + maxHealth = 2 * STANDARD_ORGAN_THRESHOLD + toxTolerance = 5 // More tolerance for toxins + liver_resistance = 0.25 // But if they manage to get in you're screwed + + icon = 'icons/obj/medical/organs/infuser_organs.dmi' + icon_state = "liver" + greyscale_config = /datum/greyscale_config/mutant_organ + greyscale_colors = ROACH_COLORS + +/obj/item/organ/internal/liver/roach/Initialize(mapload) + . = ..() + AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/roach) + +/obj/item/organ/internal/liver/roach/on_insert(mob/living/carbon/organ_owner, special) + . = ..() + if(!ishuman(organ_owner)) + return + + var/mob/living/carbon/human/human_owner = owner + human_owner.physiology.tox_mod *= 2 + +/obj/item/organ/internal/liver/roach/on_remove(mob/living/carbon/organ_owner, special) + . = ..() + if(!ishuman(organ_owner) || QDELETED(organ_owner)) + return + + var/mob/living/carbon/human/human_owner = organ_owner + human_owner.physiology.tox_mod /= 2 + +/// Roach appendix: +/// No appendicitus! weee! +/obj/item/organ/internal/appendix/roach + name = "mutated roach-appendix" + desc = "Roach DNA infused into what was once a normal appendix. It could get worse?" + maxHealth = 2 * STANDARD_ORGAN_THRESHOLD + + icon = 'icons/obj/medical/organs/infuser_organs.dmi' + icon_state = "appendix" + greyscale_config = /datum/greyscale_config/mutant_organ + greyscale_colors = ROACH_COLORS + +/obj/item/organ/internal/appendix/roach/Initialize(mapload) + . = ..() + AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/roach) + +/obj/item/organ/internal/appendix/roach/become_inflamed() + return + +#undef ROACH_ORGAN_COLOR +#undef ROACH_COLORS diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index b3c7f09640076..a1fa73b1f8b49 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -97,26 +97,37 @@ ///The type of door frame to drop during deconstruction var/assemblytype = /obj/structure/door_assembly - var/security_level = 0 //How much are wires secured - var/aiControlDisabled = AI_WIRE_NORMAL //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in. - var/hackProof = FALSE // if true, this door can't be hacked by the AI - var/secondsMainPowerLost = 0 //The number of seconds until power is restored. - var/secondsBackupPowerLost = 0 //The number of seconds until power is restored. - var/spawnPowerRestoreRunning = FALSE - var/lights = TRUE // bolt lights show by default + /// How much are wires secured + var/security_level = 0 + /// If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in. + var/aiControlDisabled = AI_WIRE_NORMAL + /// If true, this door can't be hacked by the AI + var/hackProof = FALSE + /// Timer id, active when we are actively waiting for the main power to be restored + var/main_power_timer = 0 + /// Paired with main_power_timer. Records its remaining time when something happens to interrupt power regen + var/main_power_time + /// Timer id, active when we are actively waiting for the backup power to be restored + var/backup_power_timer = 0 + /// Paired with backup_power_timer. Records its remaining time when something happens to interrupt power regen + var/backup_power_time + /// Bolt lights show by default + var/lights = TRUE var/aiDisabledIdScanner = FALSE var/aiHacking = FALSE - var/closeOtherId //Cyclelinking for airlocks that aren't on the same x or y coord as the target. + /// Cyclelinking for airlocks that aren't on the same x or y coord as the target. + var/closeOtherId var/obj/machinery/door/airlock/closeOther var/list/obj/machinery/door/airlock/close_others = list() var/obj/item/electronics/airlock/electronics COOLDOWN_DECLARE(shockCooldown) - var/obj/item/note //Any papers pinned to the airlock + /// Any papers pinned to the airlock + var/obj/item/note /// The seal on the airlock var/obj/item/seal var/detonated = FALSE var/abandoned = FALSE - ///Controls if the door closes quickly or not. FALSE = the door autocloses in 1.5 seconds, TRUE = 8 seconds - see autoclose_in() + /// Controls if the door closes quickly or not. FALSE = the door autocloses in 1.5 seconds, TRUE = 8 seconds - see autoclose_in() var/normalspeed = TRUE var/cutAiWire = FALSE var/autoname = FALSE @@ -126,20 +137,25 @@ var/boltUp = 'sound/machines/boltsup.ogg' var/boltDown = 'sound/machines/boltsdown.ogg' var/noPower = 'sound/machines/doorclick.ogg' - var/previous_airlock = /obj/structure/door_assembly //what airlock assembly mineral plating was applied to - var/airlock_material //material of inner filling; if its an airlock with glass, this should be set to "glass" + /// What airlock assembly mineral plating was applied to + var/previous_airlock = /obj/structure/door_assembly + /// Material of inner filling; if its an airlock with glass, this should be set to "glass" + var/airlock_material var/overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' - var/note_overlay_file = 'icons/obj/doors/airlocks/station/overlays.dmi' //Used for papers and photos pinned to the airlock + /// Used for papers and photos pinned to the airlock + var/note_overlay_file = 'icons/obj/doors/airlocks/station/overlays.dmi' var/cyclelinkeddir = 0 var/obj/machinery/door/airlock/cyclelinkedairlock var/shuttledocked = 0 - var/delayed_close_requested = FALSE // TRUE means the door will automatically close the next time it's opened. - var/air_tight = FALSE //TRUE means density will be set as soon as the door begins to close + /// TRUE means the door will automatically close the next time it's opened. + var/delayed_close_requested = FALSE + /// TRUE means density will be set as soon as the door begins to close + var/air_tight = FALSE var/prying_so_hard = FALSE - ///Logging for door electrification. + /// Logging for door electrification. var/shockedby - ///How many seconds remain until the door is no longer electrified. -1/MACHINE_ELECTRIFIED_PERMANENT = permanently electrified until someone fixes it. + /// How many seconds remain until the door is no longer electrified. -1/MACHINE_ELECTRIFIED_PERMANENT = permanently electrified until someone fixes it. var/secondsElectrified = MACHINE_NOT_ELECTRIFIED flags_1 = HTML_USE_INITAL_ICON_1 @@ -147,7 +163,8 @@ /obj/machinery/door/airlock/Initialize(mapload) . = ..() - wires = set_wires() + + set_wires(get_wires()) if(glass) airlock_material = "glass" if(security_level > AIRLOCK_SECURITY_IRON) @@ -165,19 +182,30 @@ diag_hud_set_electrified() - RegisterSignal(src, COMSIG_MACHINERY_BROKEN, PROC_REF(on_break)) - // Click on the floor to close airlocks AddComponent(/datum/component/redirect_attack_hand_from_turf) - return INITIALIZE_HINT_LATELOAD + RegisterSignal(src, COMSIG_MACHINERY_BROKEN, PROC_REF(on_break)) + + RegisterSignal(SSdcs, COMSIG_GLOB_GREY_TIDE, PROC_REF(grey_tide)) + +/obj/machinery/door/airlock/proc/grey_tide(datum/source, list/grey_tide_areas) + SIGNAL_HANDLER + + if(!is_station_level(z) || critical_machine) + return //Skip doors in critical positions, such as the SM chamber. + + for(var/area_type in grey_tide_areas) + if(!istype(get_area(src), area_type)) + continue + INVOKE_ASYNC(src, PROC_REF(prison_open)) //Sleep gets called further down in open(), so we have to invoke async /obj/machinery/door/airlock/connect_to_shuttle(mapload, obj/docking_port/mobile/port, obj/docking_port/stationary/dock) if(id_tag) id_tag = "[port.shuttle_id]_[id_tag]" /obj/machinery/door/airlock/proc/update_other_id() - for(var/obj/machinery/door/airlock/Airlock in GLOB.airlocks) + for(var/obj/machinery/door/airlock/Airlock as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/airlock)) if(Airlock.closeOtherId == closeOtherId && Airlock != src) if(!(Airlock in close_others)) close_others += Airlock @@ -276,7 +304,7 @@ otherlock.close_others -= src close_others.Cut() if(id_tag) - for(var/obj/machinery/door_buttons/D in GLOB.machines) + for(var/obj/machinery/door_buttons/D as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door_buttons)) D.removeMe(src) QDEL_NULL(note) QDEL_NULL(seal) @@ -284,11 +312,12 @@ diag_hud.remove_atom_from_hud(src) return ..() -/obj/machinery/door/airlock/handle_atom_del(atom/A) - if(A == note) +/obj/machinery/door/airlock/Exited(atom/movable/gone, direction) + . = ..() + if(gone == note) note = null update_appearance() - if(A == seal) + if(gone == seal) seal = null update_appearance() @@ -317,7 +346,7 @@ return ((aiControlDisabled == AI_WIRE_DISABLED) && (!hackProof) && (!isAllPowerCut())); /obj/machinery/door/airlock/hasPower() - return ((!secondsMainPowerLost || !secondsBackupPowerLost) && !(machine_stat & NOPOWER)) + return ((!remaining_main_outage() || !remaining_backup_outage()) && !(machine_stat & NOPOWER)) /obj/machinery/door/airlock/requiresID() return !(wires.is_cut(WIRE_IDSCAN) || aiDisabledIdScanner) @@ -326,51 +355,127 @@ if((wires.is_cut(WIRE_POWER1) || wires.is_cut(WIRE_POWER2)) && (wires.is_cut(WIRE_BACKUP1) || wires.is_cut(WIRE_BACKUP2))) return TRUE -/obj/machinery/door/airlock/proc/regainMainPower() - if(secondsMainPowerLost > 0) - secondsMainPowerLost = 0 - update_appearance() +/// Returns the amount of time we have to wait before main power comes back +/// Assuming it was actively regenerating +/// Returns 0 if it is active +/obj/machinery/door/airlock/proc/remaining_main_outage() + if(main_power_timer) + return timeleft(main_power_timer) + return main_power_time + +/// Returns the amount of time we have to wait before backup power comes back +/// Assuming it was actively regenerating +/// Returns 0 if it is active +/obj/machinery/door/airlock/proc/remaining_backup_outage() + if(backup_power_timer) + return timeleft(backup_power_timer) + return backup_power_time + +/obj/machinery/door/airlock/proc/set_main_outage(delay) + // Clear out the timer so we don't accidentially take from it later + if(main_power_timer) + deltimer(main_power_timer) + main_power_timer = null + var/old_time = main_power_time + main_power_time = delay + handle_main_power() + if(!!old_time != !!delay) + update_appearance() -/obj/machinery/door/airlock/proc/handlePowerRestore() - var/cont = TRUE - while (cont) - sleep(1 SECONDS) - if(QDELETED(src)) - return - cont = FALSE - if(secondsMainPowerLost>0) - if(!wires.is_cut(WIRE_POWER1) && !wires.is_cut(WIRE_POWER2)) - secondsMainPowerLost -= 1 - cont = TRUE - if(secondsBackupPowerLost>0) - if(!wires.is_cut(WIRE_BACKUP1) && !wires.is_cut(WIRE_BACKUP2)) - secondsBackupPowerLost -= 1 - cont = TRUE - spawnPowerRestoreRunning = FALSE - update_appearance() +/obj/machinery/door/airlock/proc/set_backup_outage(delay) + // Clear out the timer so we don't accidentially take from it later + if(backup_power_timer) + deltimer(backup_power_timer) + backup_power_timer = null + var/old_time = backup_power_time + backup_power_time = delay + handle_backup_power() + if(!!old_time != !!delay) + update_appearance() + +/// Call to update our main power outage timer +/// Will trigger a proper timer if we're actively restoring power, if not we'll dump the remaining time in a var on the airlock +/obj/machinery/door/airlock/proc/handle_main_power() + if(main_power_time <= 0) + deltimer(main_power_timer) + main_power_timer = null + return + + // If we can, we'll start a timer that hits when we're done + if(!wires.is_cut(WIRE_POWER1) && !wires.is_cut(WIRE_POWER2)) + if(!main_power_timer || timeleft(main_power_timer) != main_power_time) + main_power_timer = addtimer(CALLBACK(src, PROC_REF(regainMainPower)), main_power_time, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE|TIMER_DELETE_ME) + // Otherwise, we'll ensure the timer matches main_power_time + else if(main_power_timer) + main_power_time = timeleft(main_power_timer) + deltimer(main_power_timer) + main_power_timer = null + +/// Call to update our backup power outage timer +/// Will trigger a proper timer if we're actively restoring power, if not we'll dump the remaining time in a var on the airlock +/obj/machinery/door/airlock/proc/handle_backup_power() + if(backup_power_time <= 0) + deltimer(backup_power_timer) + backup_power_timer = null + return + + // If we can, we'll start a timer that hits when we're done + if(!wires.is_cut(WIRE_BACKUP1) && !wires.is_cut(WIRE_BACKUP2)) + if(!backup_power_timer || timeleft(backup_power_timer) != backup_power_time) + backup_power_timer = addtimer(CALLBACK(src, PROC_REF(regainBackupPower)), backup_power_time, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE|TIMER_DELETE_ME) + // Otherwise, we'll ensure the timer matches backup_power_time + else if(backup_power_timer) + backup_power_time = timeleft(backup_power_timer) + deltimer(backup_power_timer) + backup_power_timer = null + +// Alright, we're gonna do a meme here +/obj/machinery/door/airlock/set_wires(datum/wires/new_wires) + if(wires) + UnregisterSignal(wires, list( + COMSIG_CUT_WIRE(WIRE_POWER1), + COMSIG_CUT_WIRE(WIRE_POWER2), + COMSIG_CUT_WIRE(WIRE_BACKUP1), + COMSIG_CUT_WIRE(WIRE_BACKUP2), + COMSIG_MEND_WIRE(WIRE_POWER1), + COMSIG_MEND_WIRE(WIRE_POWER2), + COMSIG_MEND_WIRE(WIRE_BACKUP1), + COMSIG_MEND_WIRE(WIRE_BACKUP2), + )) + . = ..() + if(new_wires) + RegisterSignals(new_wires, list( + COMSIG_CUT_WIRE(WIRE_POWER1), + COMSIG_CUT_WIRE(WIRE_POWER2), + COMSIG_CUT_WIRE(WIRE_BACKUP1), + COMSIG_CUT_WIRE(WIRE_BACKUP2), + COMSIG_MEND_WIRE(WIRE_POWER1), + COMSIG_MEND_WIRE(WIRE_POWER2), + COMSIG_MEND_WIRE(WIRE_BACKUP1), + COMSIG_MEND_WIRE(WIRE_BACKUP2), + ), PROC_REF(power_wires_changed)) + +/// If our power wires have changed, then our backup/main power regen may have failed, so let's just check in yeah? +/obj/machinery/door/airlock/proc/power_wires_changed(datum/source, wire) + SIGNAL_HANDLER + handle_main_power() + handle_backup_power() + +/obj/machinery/door/airlock/proc/regainMainPower() + set_main_outage(0 SECONDS) /obj/machinery/door/airlock/proc/loseMainPower() - if(secondsMainPowerLost <= 0) - secondsMainPowerLost = 60 - if(secondsBackupPowerLost < 10) - secondsBackupPowerLost = 10 - if(!spawnPowerRestoreRunning) - spawnPowerRestoreRunning = TRUE - INVOKE_ASYNC(src, PROC_REF(handlePowerRestore)) - update_appearance() + if(!remaining_main_outage()) + set_main_outage(60 SECONDS) + if(remaining_backup_outage() < 10 SECONDS) + set_backup_outage(10 SECONDS) /obj/machinery/door/airlock/proc/loseBackupPower() - if(secondsBackupPowerLost < 60) - secondsBackupPowerLost = 60 - if(!spawnPowerRestoreRunning) - spawnPowerRestoreRunning = TRUE - INVOKE_ASYNC(src, PROC_REF(handlePowerRestore)) - update_appearance() + if(remaining_backup_outage() < 60 SECONDS) + set_backup_outage(60 SECONDS) /obj/machinery/door/airlock/proc/regainBackupPower() - if(secondsBackupPowerLost > 0) - secondsBackupPowerLost = 0 - update_appearance() + set_backup_outage(0 SECONDS) // shock user with probability prb (if all connections & power are working) // returns TRUE if shocked, FALSE otherwise @@ -847,12 +952,12 @@ else return TOOL_ACT_TOOLTYPE_SUCCESS - if(!tool.tool_start_check(user, amount=2)) + if(!tool.tool_start_check(user, amount=1)) return TOOL_ACT_TOOLTYPE_SUCCESS to_chat(user, span_notice("You begin cutting the [layer_flavor]...")) - if(!tool.use_tool(src, user, 4 SECONDS, volume=50, amount=2)) + if(!tool.use_tool(src, user, 4 SECONDS, volume=50)) return TOOL_ACT_TOOLTYPE_SUCCESS if(!panel_open || security_level != starting_level) @@ -964,7 +1069,7 @@ return if(atom_integrity < max_integrity) - if(!W.tool_start_check(user, amount=0)) + if(!W.tool_start_check(user, amount=1)) return user.visible_message(span_notice("[user] begins welding the airlock."), \ span_notice("You begin repairing the airlock..."), \ @@ -979,7 +1084,7 @@ to_chat(user, span_notice("The airlock doesn't need repairing.")) /obj/machinery/door/airlock/try_to_weld_secondary(obj/item/weldingtool/tool, mob/user) - if(!tool.tool_start_check(user, amount=0)) + if(!tool.tool_start_check(user, amount=1)) return user.visible_message(span_notice("[user] begins [welded ? "unwelding":"welding"] the airlock."), \ span_notice("You begin [welded ? "unwelding":"welding"] the airlock..."), \ @@ -1134,9 +1239,13 @@ update_icon(ALL, AIRLOCK_OPENING, TRUE) sleep(0.1 SECONDS) set_opacity(0) + if(multi_tile) + filler.set_opacity(FALSE) update_freelook_sight() sleep(0.4 SECONDS) set_density(FALSE) + if(multi_tile) + filler.set_density(FALSE) flags_1 &= ~PREVENT_CLICK_UNDER_1 air_update_turf(TRUE, FALSE) sleep(0.1 SECONDS) @@ -1186,10 +1295,11 @@ var/dangerous_close = !safe || force_crush if(!dangerous_close) - for(var/atom/movable/M in get_turf(src)) - if(M.density && M != src) //something is blocking the door - autoclose_in(DOOR_CLOSE_WAIT) - return FALSE + for(var/turf/checked_turf in locs) + for(var/atom/movable/blocking in checked_turf) + if(blocking.density && blocking != src) + autoclose_in(DOOR_CLOSE_WAIT) + return FALSE if(!try_to_force_door_shut(forced)) return FALSE @@ -1203,18 +1313,24 @@ layer = CLOSED_DOOR_LAYER if(air_tight) set_density(TRUE) + if(multi_tile) + filler.density = TRUE flags_1 |= PREVENT_CLICK_UNDER_1 air_update_turf(TRUE, TRUE) sleep(0.1 SECONDS) if(!air_tight) set_density(TRUE) + if(multi_tile) + filler.density = TRUE flags_1 |= PREVENT_CLICK_UNDER_1 air_update_turf(TRUE, TRUE) sleep(0.4 SECONDS) if(dangerous_close) crush() if(visible && !glass) - set_opacity(1) + set_opacity(TRUE) + if(multi_tile) + filler.set_opacity(TRUE) update_freelook_sight() sleep(0.1 SECONDS) update_icon(ALL, AIRLOCK_CLOSED, 1) @@ -1271,7 +1387,12 @@ // applies the user-chosen airlock's icon, overlays and assemblytype to the src airlock painter.use_paint(user) - icon = initial(airlock.icon) + if(initial(airlock.greyscale_config)) + greyscale_config = initial(airlock.greyscale_config) + greyscale_colors = initial(airlock.greyscale_colors) + update_greyscale() + else + icon = initial(airlock.icon) overlays_file = initial(airlock.overlays_file) assemblytype = initial(airlock.assemblytype) update_appearance() @@ -1280,23 +1401,29 @@ //Airlock is passable if it is open (!density), bot has access, and is not bolted shut or powered off) return !density || (check_access(ID) && !locked && hasPower() && !no_id) -/obj/machinery/door/airlock/emag_act(mob/user, obj/item/card/emag/doorjack/D) +/obj/machinery/door/airlock/emag_act(mob/user, obj/item/card/emag/emag_card) if(!operating && density && hasPower() && !(obj_flags & EMAGGED)) - if(istype(D, /obj/item/card/emag/doorjack)) - D.use_charge(user) + if(istype(emag_card, /obj/item/card/emag/doorjack)) + var/obj/item/card/emag/doorjack/doorjack_card = emag_card + doorjack_card.use_charge(user) operating = TRUE update_icon(ALL, AIRLOCK_EMAG, 1) - sleep(0.6 SECONDS) - if(QDELETED(src)) - return - operating = FALSE - if(!open()) - update_icon(ALL, AIRLOCK_CLOSED, 1) - obj_flags |= EMAGGED - lights = FALSE - locked = TRUE - loseMainPower() - loseBackupPower() + addtimer(CALLBACK(src, PROC_REF(finish_emag_act)), 0.6 SECONDS) + return TRUE + return FALSE + +/// Timer proc, called ~0.6 seconds after [emag_act]. Finishes the emag sequence by breaking the airlock, permanently locking it, and disabling power. +/obj/machinery/door/airlock/proc/finish_emag_act() + if(QDELETED(src)) + return FALSE + operating = FALSE + if(!open()) + update_icon(ALL, AIRLOCK_CLOSED, 1) + obj_flags |= EMAGGED + lights = FALSE + locked = TRUE + loseMainPower() + loseBackupPower() /obj/machinery/door/airlock/attack_alien(mob/living/carbon/alien/adult/user, list/modifiers) if(isElectrified() && shock(user, 100)) //Mmm, fried xeno! @@ -1436,7 +1563,7 @@ if(security_level != AIRLOCK_SECURITY_NONE) to_chat(user, span_notice("[src]'s reinforcement needs to be removed first.")) return FALSE - return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 32) + return list("mode" = RCD_DECONSTRUCT, "delay" = 5 SECONDS, "cost" = 32) return FALSE /obj/machinery/door/airlock/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) @@ -1476,10 +1603,10 @@ var/list/data = list() var/list/power = list() - power["main"] = secondsMainPowerLost ? 0 : 2 // boolean - power["main_timeleft"] = secondsMainPowerLost - power["backup"] = secondsBackupPowerLost ? 0 : 2 // boolean - power["backup_timeleft"] = secondsBackupPowerLost + power["main"] = remaining_main_outage() ? 0 : 2 // boolean + power["main_timeleft"] = round(remaining_main_outage() / 10) + power["backup"] = remaining_backup_outage() ? 0 : 2 // boolean + power["backup_timeleft"] = round(remaining_backup_outage() / 10) data["power"] = power data["shock"] = secondsElectrified == MACHINE_NOT_ELECTRIFIED ? 2 : 0 @@ -1501,7 +1628,7 @@ wire["shock"] = !wires.is_cut(WIRE_SHOCK) wire["id_scanner"] = !wires.is_cut(WIRE_IDSCAN) wire["bolts"] = !wires.is_cut(WIRE_BOLTS) - wire["lights"] = !wires.is_cut(WIRE_LIGHT) + wire["lights"] = !wires.is_cut(WIRE_BOLTLIGHT) wire["safe"] = !wires.is_cut(WIRE_SAFETY) wire["timing"] = !wires.is_cut(WIRE_TIMING) @@ -1517,14 +1644,14 @@ return switch(action) if("disrupt-main") - if(!secondsMainPowerLost) + if(!main_power_timer) loseMainPower() update_appearance() else to_chat(usr, span_warning("Main power is already offline.")) . = TRUE if("disrupt-backup") - if(!secondsBackupPowerLost) + if(!backup_power_timer) loseBackupPower() update_appearance() else @@ -1629,10 +1756,702 @@ * Returns a new /datum/wires/ with the appropriate wire layout based on the airlock_wires * of the area the airlock is in. */ -/obj/machinery/door/airlock/proc/set_wires() +/obj/machinery/door/airlock/proc/get_wires() var/area/source_area = get_area(src) return source_area?.airlock_wires ? new source_area.airlock_wires(src) : new /datum/wires/airlock(src) +/obj/structure/fluff/airlock_filler/Destroy(force) + filled_airlock = null + return ..() + +/** + * Create a ref to our parent airlock and listen for a QDEL, which we will al + */ +/obj/structure/fluff/airlock_filler/proc/pair_airlock(obj/machinery/door/parent_airlock) + if(isnull(parent_airlock)) + stack_trace("Attempted to pair an airlock filler with no parent airlock specified!") + return + + filled_airlock = parent_airlock + RegisterSignal(filled_airlock, COMSIG_QDELETING, PROC_REF(no_airlock)) + +/** + * Multi-tile airlocks pair with a filler panel, if one goes so does the other. + */ +/obj/structure/fluff/airlock_filler/proc/no_airlock() + SIGNAL_HANDLER + + qdel(src) + +/** + * Multi-tile airlocks (using a filler panel) have special handling for movables with PASSGLASS + */ +/obj/structure/fluff/airlock_filler/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() + if(.) + return + + if(istype(mover) && (mover.pass_flags & PASSGLASS)) + return !opacity + +/obj/structure/fluff/airlock_filler/can_be_pulled(user, grab_state, force) + return FALSE + +/obj/structure/fluff/airlock_filler/singularity_act() + return + +/obj/structure/fluff/airlock_filler/singularity_pull(S, current_size) + return + +// Station Airlocks Regular + +/obj/machinery/door/airlock/command + icon = 'icons/obj/doors/airlocks/station/command.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_com + normal_integrity = 450 + +/obj/machinery/door/airlock/security + icon = 'icons/obj/doors/airlocks/station/security.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_sec + normal_integrity = 450 + +/obj/machinery/door/airlock/engineering + icon = 'icons/obj/doors/airlocks/station/engineering.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_eng + +/obj/machinery/door/airlock/medical + icon = 'icons/obj/doors/airlocks/station/medical.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_med + +/obj/machinery/door/airlock/hydroponics //Hydroponics front doors! + icon = 'icons/obj/doors/airlocks/station/hydroponics.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_hydro + +/obj/machinery/door/airlock/maintenance + name = "maintenance access" + icon = 'icons/obj/doors/airlocks/station/maintenance.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_mai + normal_integrity = 250 + +/obj/machinery/door/airlock/maintenance/external + name = "external airlock access" + icon = 'icons/obj/doors/airlocks/station/maintenanceexternal.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_extmai + +/obj/machinery/door/airlock/mining + name = "mining airlock" + icon = 'icons/obj/doors/airlocks/station/mining.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_min + +/obj/machinery/door/airlock/atmos + name = "atmospherics airlock" + icon = 'icons/obj/doors/airlocks/station/atmos.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_atmo + +/obj/machinery/door/airlock/research + icon = 'icons/obj/doors/airlocks/station/research.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_research + +/obj/machinery/door/airlock/freezer + name = "freezer airlock" + icon = 'icons/obj/doors/airlocks/station/freezer.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_fre + +/obj/machinery/door/airlock/science + icon = 'icons/obj/doors/airlocks/station/science.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_science + +/obj/machinery/door/airlock/virology + icon = 'icons/obj/doors/airlocks/station/virology.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_viro + +// Station Airlocks Glass + +/obj/machinery/door/airlock/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/glass/incinerator + autoclose = FALSE + heat_proof = TRUE + req_access = list(ACCESS_SYNDICATE) + +/obj/machinery/door/airlock/glass/incinerator/syndicatelava_interior + name = "Turbine Interior Airlock" + id_tag = INCINERATOR_SYNDICATELAVA_AIRLOCK_INTERIOR + +/obj/machinery/door/airlock/glass/incinerator/syndicatelava_exterior + name = "Turbine Exterior Airlock" + id_tag = INCINERATOR_SYNDICATELAVA_AIRLOCK_EXTERIOR + +/obj/machinery/door/airlock/command/glass + opacity = FALSE + glass = TRUE + normal_integrity = 400 + +/obj/machinery/door/airlock/engineering/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/engineering/glass/critical + critical_machine = TRUE //stops greytide virus from opening & bolting doors in critical positions, such as the SM chamber. + +/obj/machinery/door/airlock/security/glass + opacity = FALSE + glass = TRUE + normal_integrity = 400 + +/obj/machinery/door/airlock/medical/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/hydroponics/glass //Uses same icon as medical/glass, maybe update it with its own unique icon one day? + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/research/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/research/glass/incinerator + autoclose = FALSE + heat_proof = TRUE + +/obj/machinery/door/airlock/research/glass/incinerator/ordmix_interior + name = "Mixing Room Interior Airlock" + id_tag = INCINERATOR_ORDMIX_AIRLOCK_INTERIOR + +/obj/machinery/door/airlock/research/glass/incinerator/ordmix_exterior + name = "Mixing Room Exterior Airlock" + id_tag = INCINERATOR_ORDMIX_AIRLOCK_EXTERIOR + +/obj/machinery/door/airlock/mining/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/atmos/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/atmos/glass/critical + critical_machine = TRUE //stops greytide virus from opening & bolting doors in critical positions, such as the SM chamber. + +/obj/machinery/door/airlock/science/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/virology/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/maintenance/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/maintenance/external/glass + opacity = FALSE + glass = TRUE + normal_integrity = 200 + +// Station Airlocks Mineral + +/obj/machinery/door/airlock/gold + name = "gold airlock" + icon = 'icons/obj/doors/airlocks/station/gold.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_gold + +/obj/machinery/door/airlock/gold/discoinferno + heat_proof = TRUE + resistance_flags = FIRE_PROOF + armor_type = /datum/armor/discoinferno_airlock + +/datum/armor/discoinferno_airlock + melee = 30 + bullet = 30 + laser = 20 + energy = 20 + bomb = 10 + fire = 100 + acid = 100 + +/obj/machinery/door/airlock/gold/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/silver + name = "silver airlock" + icon = 'icons/obj/doors/airlocks/station/silver.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_silver + +/obj/machinery/door/airlock/silver/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/diamond + name = "diamond airlock" + icon = 'icons/obj/doors/airlocks/station/diamond.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_diamond + normal_integrity = 1000 + explosion_block = 2 + +/obj/machinery/door/airlock/diamond/glass + normal_integrity = 950 + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/uranium + name = "uranium airlock" + icon = 'icons/obj/doors/airlocks/station/uranium.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_uranium + var/last_event = 0 + //Is this airlock actually radioactive? + var/actually_radioactive = TRUE + +/obj/machinery/door/airlock/uranium/process() + if(actually_radioactive && world.time > last_event+20) + if(prob(50)) + radiate() + last_event = world.time + ..() + +/obj/machinery/door/airlock/uranium/proc/radiate() + radiation_pulse( + src, + max_range = 2, + threshold = RAD_LIGHT_INSULATION, + chance = URANIUM_IRRADIATION_CHANCE, + minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME, + ) + +/obj/machinery/door/airlock/uranium/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/uranium/safe + actually_radioactive = FALSE + +/obj/machinery/door/airlock/uranium/glass/safe + actually_radioactive = FALSE + +/obj/machinery/door/airlock/plasma + name = "plasma airlock" + desc = "No way this can end badly." + icon = 'icons/obj/doors/airlocks/station/plasma.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_plasma + material_flags = MATERIAL_EFFECTS + material_modifier = 0.25 + +/obj/machinery/door/airlock/plasma/Initialize(mapload) + custom_materials = custom_materials ? custom_materials : list(/datum/material/plasma = SHEET_MATERIAL_AMOUNT * 10) + . = ..() + +/obj/machinery/door/airlock/plasma/block_superconductivity() //we don't stop the heat~ + return 0 + +/obj/machinery/door/airlock/plasma/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/bananium + name = "bananium airlock" + desc = "Honkhonkhonk" + icon = 'icons/obj/doors/airlocks/station/bananium.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_bananium + doorOpen = 'sound/items/bikehorn.ogg' + +/obj/machinery/door/airlock/bananium/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/sandstone + name = "sandstone airlock" + icon = 'icons/obj/doors/airlocks/station/sandstone.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_sandstone + +/obj/machinery/door/airlock/sandstone/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/wood + name = "wooden airlock" + icon = 'icons/obj/doors/airlocks/station/wood.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_wood + +/obj/machinery/door/airlock/wood/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/titanium + name = "shuttle airlock" + assemblytype = /obj/structure/door_assembly/door_assembly_titanium + icon = 'icons/obj/doors/airlocks/shuttle/shuttle.dmi' + overlays_file = 'icons/obj/doors/airlocks/shuttle/overlays.dmi' + normal_integrity = 400 + +/obj/machinery/door/airlock/titanium/glass + normal_integrity = 350 + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/bronze + name = "bronze airlock" + icon = 'icons/obj/doors/airlocks/clockwork/pinion_airlock.dmi' + overlays_file = 'icons/obj/doors/airlocks/clockwork/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_bronze + +/obj/machinery/door/airlock/bronze/seethru + assemblytype = /obj/structure/door_assembly/door_assembly_bronze/seethru + opacity = FALSE + glass = TRUE + + +// Public Airlocks + +/obj/machinery/door/airlock/public + icon = 'icons/obj/doors/airlocks/public/glass.dmi' + overlays_file = 'icons/obj/doors/airlocks/public/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_public + +/obj/machinery/door/airlock/public/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/public/glass/incinerator + autoclose = FALSE + heat_proof = TRUE + +/obj/machinery/door/airlock/public/glass/incinerator/atmos_interior + name = "Turbine Interior Airlock" + id_tag = INCINERATOR_ATMOS_AIRLOCK_INTERIOR + +/obj/machinery/door/airlock/public/glass/incinerator/atmos_exterior + name = "Turbine Exterior Airlock" + id_tag = INCINERATOR_ATMOS_AIRLOCK_EXTERIOR + +// External Airlocks + +/obj/machinery/door/airlock/external + name = "external airlock" + icon = 'icons/obj/doors/airlocks/external/external.dmi' + overlays_file = 'icons/obj/doors/airlocks/external/overlays.dmi' + note_overlay_file = 'icons/obj/doors/airlocks/external/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_ext + + /// Whether or not the airlock can be opened without access from a certain direction while powered, or with bare hands from any direction while unpowered OR pressurized. + var/space_dir = null + +/obj/machinery/door/airlock/external/Initialize(mapload, ...) + // default setting is for mapping only, let overrides work + if(!mapload) + req_access = null + + return ..() + +/obj/machinery/door/airlock/external/LateInitialize() + . = ..() + if(space_dir) + unres_sides |= space_dir + +/obj/machinery/door/airlock/external/examine(mob/user) + . = ..() + if(space_dir) + . += span_notice("It has labels indicating that it has an emergency mechanism to open from the [dir2text(space_dir)] side with just your hands even if there's no power.") + +/obj/machinery/door/airlock/external/cyclelinkairlock() + . = ..() + var/obj/machinery/door/airlock/external/cycle_linked_external_airlock = cyclelinkedairlock + if(istype(cycle_linked_external_airlock)) + cycle_linked_external_airlock.space_dir |= space_dir + space_dir |= cycle_linked_external_airlock.space_dir + +/obj/machinery/door/airlock/external/try_safety_unlock(mob/user) + if(space_dir && density) + if(!hasPower()) + to_chat(user, span_notice("You begin unlocking the airlock safety mechanism...")) + if(do_after(user, 15 SECONDS, target = src)) + try_to_crowbar(null, user, TRUE) + return TRUE + else + // always open from the space side + // get_dir(src, user) & space_dir, checked in unresricted_sides + var/should_safety_open = shuttledocked || cyclelinkedairlock?.shuttledocked || is_safe_turf(get_step(src, space_dir), TRUE, FALSE) + return try_to_activate_door(user, should_safety_open) + + return ..() + +// Access free external airlocks +/obj/machinery/door/airlock/external/ruin + +/obj/machinery/door/airlock/external/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/external/glass/ruin + +// CentCom Airlocks + +/obj/machinery/door/airlock/centcom //Use grunge as a station side version, as these have special effects related to them via phobias and such. + icon = 'icons/obj/doors/airlocks/centcom/centcom.dmi' + overlays_file = 'icons/obj/doors/airlocks/centcom/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_centcom + normal_integrity = 1000 + security_level = 6 + explosion_block = 2 + +/obj/machinery/door/airlock/grunge + icon = 'icons/obj/doors/airlocks/centcom/centcom.dmi' + overlays_file = 'icons/obj/doors/airlocks/centcom/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_grunge + + +// Vault Airlocks + +/obj/machinery/door/airlock/vault + name = "vault door" + icon = 'icons/obj/doors/airlocks/vault/vault.dmi' + overlays_file = 'icons/obj/doors/airlocks/vault/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_vault + explosion_block = 2 + normal_integrity = 400 // reverse engieneerd: 400 * 1.5 (sec lvl 6) = 600 = original + security_level = 6 + + +// Hatch Airlocks + +/obj/machinery/door/airlock/hatch + name = "airtight hatch" + icon = 'icons/obj/doors/airlocks/hatch/centcom.dmi' + overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' + note_overlay_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_hatch + +/obj/machinery/door/airlock/maintenance_hatch + name = "maintenance hatch" + icon = 'icons/obj/doors/airlocks/hatch/maintenance.dmi' + overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' + note_overlay_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_mhatch + +// High Security Airlocks + +/obj/machinery/door/airlock/highsecurity + name = "high tech security airlock" + icon = 'icons/obj/doors/airlocks/highsec/highsec.dmi' + overlays_file = 'icons/obj/doors/airlocks/highsec/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_highsecurity + explosion_block = 2 + normal_integrity = 500 + security_level = 1 + damage_deflection = 30 + +// Shuttle Airlocks + +/obj/machinery/door/airlock/shuttle + name = "shuttle airlock" + icon = 'icons/obj/doors/airlocks/shuttle/shuttle.dmi' + overlays_file = 'icons/obj/doors/airlocks/shuttle/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_shuttle + +/obj/machinery/door/airlock/shuttle/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/abductor + name = "alien airlock" + desc = "With humanity's current technological level, it could take years to hack this advanced airlock... or maybe we should give a screwdriver a try?" + icon = 'icons/obj/doors/airlocks/abductor/abductor_airlock.dmi' + overlays_file = 'icons/obj/doors/airlocks/abductor/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_abductor + note_overlay_file = 'icons/obj/doors/airlocks/external/overlays.dmi' + damage_deflection = 30 + explosion_block = 3 + hackProof = TRUE + aiControlDisabled = AI_WIRE_DISABLED + normal_integrity = 700 + security_level = 1 + +// Cult Airlocks + +/obj/machinery/door/airlock/cult + name = "cult airlock" + icon = 'icons/obj/doors/airlocks/cult/runed/cult.dmi' + overlays_file = 'icons/obj/doors/airlocks/cult/runed/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_cult + hackProof = TRUE + aiControlDisabled = AI_WIRE_DISABLED + req_access = list(ACCESS_BLOODCULT) + damage_deflection = 10 + var/openingoverlaytype = /obj/effect/temp_visual/cult/door + var/friendly = FALSE + var/stealthy = FALSE + +/obj/machinery/door/airlock/cult/Initialize(mapload) + . = ..() + new openingoverlaytype(loc) + +/obj/machinery/door/airlock/cult/canAIControl(mob/user) + return (IS_CULTIST(user) && !isAllPowerCut()) + +/obj/machinery/door/airlock/cult/on_break() + set_panel_open(TRUE) + +/obj/machinery/door/airlock/cult/isElectrified() + return FALSE + +/obj/machinery/door/airlock/cult/hasPower() + return TRUE + +/obj/machinery/door/airlock/cult/allowed(mob/living/L) + if(!density) + return TRUE + if(friendly || IS_CULTIST(L) || isshade(L) || isconstruct(L)) + if(!stealthy) + new openingoverlaytype(loc) + return TRUE + else + if(!stealthy) + new /obj/effect/temp_visual/cult/sac(loc) + var/atom/throwtarget + throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src))) + SEND_SOUND(L, sound(pick('sound/hallucinations/turn_around1.ogg','sound/hallucinations/turn_around2.ogg'),0,1,50)) + flash_color(L, flash_color="#960000", flash_time=20) + L.Paralyze(40) + L.throw_at(throwtarget, 5, 1) + return FALSE + +/obj/machinery/door/airlock/cult/proc/conceal() + icon = 'icons/obj/doors/airlocks/station/maintenance.dmi' + overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' + name = "Airlock" + desc = "It opens and closes." + stealthy = TRUE + update_appearance() + +/obj/machinery/door/airlock/cult/proc/reveal() + icon = initial(icon) + overlays_file = initial(overlays_file) + name = initial(name) + desc = initial(desc) + stealthy = initial(stealthy) + update_appearance() + +/obj/machinery/door/airlock/cult/narsie_act() + return + +/obj/machinery/door/airlock/cult/emp_act(severity) + return + +/obj/machinery/door/airlock/cult/friendly + friendly = TRUE + +/obj/machinery/door/airlock/cult/glass + glass = TRUE + opacity = FALSE + +/obj/machinery/door/airlock/cult/glass/friendly + friendly = TRUE + +/obj/machinery/door/airlock/cult/unruned + icon = 'icons/obj/doors/airlocks/cult/unruned/cult.dmi' + overlays_file = 'icons/obj/doors/airlocks/cult/unruned/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_cult/unruned + openingoverlaytype = /obj/effect/temp_visual/cult/door/unruned + +/obj/machinery/door/airlock/cult/unruned/friendly + friendly = TRUE + +/obj/machinery/door/airlock/cult/unruned/glass + glass = TRUE + opacity = FALSE + +/obj/machinery/door/airlock/cult/unruned/glass/friendly + friendly = TRUE + +/obj/machinery/door/airlock/cult/weak + name = "brittle cult airlock" + desc = "An airlock hastily corrupted by blood magic, it is unusually brittle in this state." + normal_integrity = 150 + damage_deflection = 5 + armor_type = /datum/armor/none + +// Material Airlocks + +/obj/machinery/door/airlock/material + name = "Airlock" + material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_GREYSCALE | MATERIAL_AFFECT_STATISTICS + greyscale_config = /datum/greyscale_config/material_airlock + assemblytype = /obj/structure/door_assembly/door_assembly_material + +/obj/machinery/door/airlock/material/close(forced, force_crush) + . = ..() + if(!.) + return + for(var/datum/material/mat in custom_materials) + if(mat.alpha < 255) + set_opacity(FALSE) + break + +/obj/machinery/door/airlock/material/prepare_deconstruction_assembly(obj/structure/door_assembly/assembly) + assembly.set_custom_materials(custom_materials) + ..() + +/obj/machinery/door/airlock/material/glass + opacity = FALSE + glass = TRUE + +// Multi-tile (Large) Airlocks + +/obj/machinery/door/airlock/multi_tile + icon = 'icons/obj/doors/airlocks/multi_tile/public/glass.dmi' + overlays_file = 'icons/obj/doors/airlocks/multi_tile/public/overlays.dmi' + assemblytype = /obj/structure/door_assembly/multi_tile/door_assembly_public + multi_tile = TRUE + opacity = FALSE + glass = TRUE + +/obj/structure/fluff/airlock_filler + name = "airlock fluff" + desc = "You shouldn't be able to see this fluff!" + icon = null + icon_state = null + density = TRUE + opacity = TRUE + anchored = TRUE + invisibility = INVISIBILITY_MAXIMUM + can_atmos_pass = ATMOS_PASS_DENSITY + /// The door/airlock this fluff panel is attached to + var/obj/machinery/door/filled_airlock + +/obj/machinery/door/airlock/multi_tile/public/glass + +/obj/machinery/door/airlock/multi_tile/narsie_act() + return + +/* + * Subtype used in unit tests to ensure instant airlock opening/closing. + * + * Pretty much just excises everything that would delay the process or is un-needed + * for the sake of the test (sleeps, icon animations). +*/ +/obj/machinery/door/airlock/instant + +// set_density on both open and close procs has a check and return builtin. + +/obj/machinery/door/airlock/instant/open(forced = DEFAULT_DOOR_CHECKS) + operating = TRUE + SEND_SIGNAL(src, COMSIG_AIRLOCK_OPEN, forced) + set_density(FALSE) + operating = FALSE + return TRUE + +/obj/machinery/door/airlock/instant/close(forced = DEFAULT_DOOR_CHECKS, force_crush = FALSE) + operating = TRUE + SEND_SIGNAL(src, COMSIG_AIRLOCK_CLOSE, forced) + set_density(TRUE) + operating = FALSE + return TRUE + + #undef AIRLOCK_CLOSED #undef AIRLOCK_CLOSING #undef AIRLOCK_OPEN diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index 4c5e080c653b4..73ae0994eb517 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -22,6 +22,25 @@ . = ..() . += span_notice("Has a neat selection menu for modifying airlock access levels.") +/** + * Create a copy of the electronics + * Arguments + * * [location][atom]- the location to create the new copy in + */ +/obj/item/electronics/airlock/proc/create_copy(atom/location) + //create a copy + var/obj/item/electronics/airlock/new_electronics = new(location) + //copy all params + new_electronics.accesses = accesses.Copy() + new_electronics.one_access = one_access + new_electronics.unres_sides = unres_sides + new_electronics.passed_name = passed_name + new_electronics.passed_cycle_id = passed_cycle_id + new_electronics.shell = shell + //return copy + return new_electronics + + /obj/item/electronics/airlock/ui_state(mob/user) return GLOB.hands_state diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm deleted file mode 100644 index 0d5ea4c8bb0c9..0000000000000 --- a/code/game/machinery/doors/airlock_types.dm +++ /dev/null @@ -1,663 +0,0 @@ -/* - Station Airlocks Regular -*/ - -/obj/machinery/door/airlock/command - icon = 'icons/obj/doors/airlocks/station/command.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_com - normal_integrity = 450 - -/obj/machinery/door/airlock/security - icon = 'icons/obj/doors/airlocks/station/security.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_sec - normal_integrity = 450 - -/obj/machinery/door/airlock/engineering - icon = 'icons/obj/doors/airlocks/station/engineering.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_eng - -/obj/machinery/door/airlock/medical - icon = 'icons/obj/doors/airlocks/station/medical.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_med - -/obj/machinery/door/airlock/hydroponics //Hydroponics front doors! - icon = 'icons/obj/doors/airlocks/station/hydroponics.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_hydro - -/obj/machinery/door/airlock/maintenance - name = "maintenance access" - icon = 'icons/obj/doors/airlocks/station/maintenance.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_mai - normal_integrity = 250 - -/obj/machinery/door/airlock/maintenance/external - name = "external airlock access" - icon = 'icons/obj/doors/airlocks/station/maintenanceexternal.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_extmai - -/obj/machinery/door/airlock/mining - name = "mining airlock" - icon = 'icons/obj/doors/airlocks/station/mining.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_min - -/obj/machinery/door/airlock/atmos - name = "atmospherics airlock" - icon = 'icons/obj/doors/airlocks/station/atmos.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_atmo - -/obj/machinery/door/airlock/research - icon = 'icons/obj/doors/airlocks/station/research.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_research - -/obj/machinery/door/airlock/freezer - name = "freezer airlock" - icon = 'icons/obj/doors/airlocks/station/freezer.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_fre - -/obj/machinery/door/airlock/science - icon = 'icons/obj/doors/airlocks/station/science.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_science - -/obj/machinery/door/airlock/virology - icon = 'icons/obj/doors/airlocks/station/virology.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_viro - -////////////////////////////////// -/* - Station Airlocks Glass -*/ - -/obj/machinery/door/airlock/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/glass/incinerator - autoclose = FALSE - heat_proof = TRUE - req_access = list(ACCESS_SYNDICATE) - -/obj/machinery/door/airlock/glass/incinerator/syndicatelava_interior - name = "Turbine Interior Airlock" - id_tag = INCINERATOR_SYNDICATELAVA_AIRLOCK_INTERIOR - -/obj/machinery/door/airlock/glass/incinerator/syndicatelava_exterior - name = "Turbine Exterior Airlock" - id_tag = INCINERATOR_SYNDICATELAVA_AIRLOCK_EXTERIOR - -/obj/machinery/door/airlock/command/glass - opacity = FALSE - glass = TRUE - normal_integrity = 400 - -/obj/machinery/door/airlock/engineering/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/engineering/glass/critical - critical_machine = TRUE //stops greytide virus from opening & bolting doors in critical positions, such as the SM chamber. - -/obj/machinery/door/airlock/security/glass - opacity = FALSE - glass = TRUE - normal_integrity = 400 - -/obj/machinery/door/airlock/medical/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/hydroponics/glass //Uses same icon as medical/glass, maybe update it with its own unique icon one day? - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/research/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/research/glass/incinerator - autoclose = FALSE - heat_proof = TRUE - -/obj/machinery/door/airlock/research/glass/incinerator/ordmix_interior - name = "Mixing Room Interior Airlock" - id_tag = INCINERATOR_ORDMIX_AIRLOCK_INTERIOR - -/obj/machinery/door/airlock/research/glass/incinerator/ordmix_exterior - name = "Mixing Room Exterior Airlock" - id_tag = INCINERATOR_ORDMIX_AIRLOCK_EXTERIOR - -/obj/machinery/door/airlock/mining/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/atmos/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/atmos/glass/critical - critical_machine = TRUE //stops greytide virus from opening & bolting doors in critical positions, such as the SM chamber. - -/obj/machinery/door/airlock/science/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/virology/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/maintenance/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/maintenance/external/glass - opacity = FALSE - glass = TRUE - normal_integrity = 200 - -////////////////////////////////// -/* - Station Airlocks Mineral -*/ - -/obj/machinery/door/airlock/gold - name = "gold airlock" - icon = 'icons/obj/doors/airlocks/station/gold.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_gold - -/obj/machinery/door/airlock/gold/discoinferno - heat_proof = TRUE - resistance_flags = FIRE_PROOF - armor_type = /datum/armor/discoinferno_airlock - -/datum/armor/discoinferno_airlock - melee = 30 - bullet = 30 - laser = 20 - energy = 20 - bomb = 10 - fire = 100 - acid = 100 - -/obj/machinery/door/airlock/gold/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/silver - name = "silver airlock" - icon = 'icons/obj/doors/airlocks/station/silver.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_silver - -/obj/machinery/door/airlock/silver/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/diamond - name = "diamond airlock" - icon = 'icons/obj/doors/airlocks/station/diamond.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_diamond - normal_integrity = 1000 - explosion_block = 2 - -/obj/machinery/door/airlock/diamond/glass - normal_integrity = 950 - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/uranium - name = "uranium airlock" - icon = 'icons/obj/doors/airlocks/station/uranium.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_uranium - var/last_event = 0 - //Is this airlock actually radioactive? - var/actually_radioactive = TRUE - -/obj/machinery/door/airlock/uranium/process() - if(actually_radioactive && world.time > last_event+20) - if(prob(50)) - radiate() - last_event = world.time - ..() - -/obj/machinery/door/airlock/uranium/proc/radiate() - radiation_pulse( - src, - max_range = 2, - threshold = RAD_LIGHT_INSULATION, - chance = URANIUM_IRRADIATION_CHANCE, - minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME, - ) - -/obj/machinery/door/airlock/uranium/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/uranium/safe - actually_radioactive = FALSE - -/obj/machinery/door/airlock/uranium/glass/safe - actually_radioactive = FALSE - -/obj/machinery/door/airlock/plasma - name = "plasma airlock" - desc = "No way this can end badly." - icon = 'icons/obj/doors/airlocks/station/plasma.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_plasma - material_flags = MATERIAL_EFFECTS - material_modifier = 0.25 - -/obj/machinery/door/airlock/plasma/Initialize(mapload) - custom_materials = custom_materials ? custom_materials : list(/datum/material/plasma = SHEET_MATERIAL_AMOUNT * 10) - . = ..() - -/obj/machinery/door/airlock/plasma/block_superconductivity() //we don't stop the heat~ - return 0 - -/obj/machinery/door/airlock/plasma/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/bananium - name = "bananium airlock" - desc = "Honkhonkhonk" - icon = 'icons/obj/doors/airlocks/station/bananium.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_bananium - doorOpen = 'sound/items/bikehorn.ogg' - -/obj/machinery/door/airlock/bananium/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/sandstone - name = "sandstone airlock" - icon = 'icons/obj/doors/airlocks/station/sandstone.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_sandstone - -/obj/machinery/door/airlock/sandstone/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/wood - name = "wooden airlock" - icon = 'icons/obj/doors/airlocks/station/wood.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_wood - -/obj/machinery/door/airlock/wood/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/titanium - name = "shuttle airlock" - assemblytype = /obj/structure/door_assembly/door_assembly_titanium - icon = 'icons/obj/doors/airlocks/shuttle/shuttle.dmi' - overlays_file = 'icons/obj/doors/airlocks/shuttle/overlays.dmi' - normal_integrity = 400 - -/obj/machinery/door/airlock/titanium/glass - normal_integrity = 350 - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/bronze - name = "bronze airlock" - icon = 'icons/obj/doors/airlocks/clockwork/pinion_airlock.dmi' - overlays_file = 'icons/obj/doors/airlocks/clockwork/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_bronze - -/obj/machinery/door/airlock/bronze/seethru - assemblytype = /obj/structure/door_assembly/door_assembly_bronze/seethru - opacity = FALSE - glass = TRUE -////////////////////////////////// -/* - Station2 Airlocks -*/ - -/obj/machinery/door/airlock/public - icon = 'icons/obj/doors/airlocks/station2/glass.dmi' - overlays_file = 'icons/obj/doors/airlocks/station2/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_public - -/obj/machinery/door/airlock/public/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/public/glass/incinerator - autoclose = FALSE - heat_proof = TRUE - -/obj/machinery/door/airlock/public/glass/incinerator/atmos_interior - name = "Turbine Interior Airlock" - id_tag = INCINERATOR_ATMOS_AIRLOCK_INTERIOR - -/obj/machinery/door/airlock/public/glass/incinerator/atmos_exterior - name = "Turbine Exterior Airlock" - id_tag = INCINERATOR_ATMOS_AIRLOCK_EXTERIOR - -////////////////////////////////// -/* - External Airlocks -*/ - -/obj/machinery/door/airlock/external - name = "external airlock" - icon = 'icons/obj/doors/airlocks/external/external.dmi' - overlays_file = 'icons/obj/doors/airlocks/external/overlays.dmi' - note_overlay_file = 'icons/obj/doors/airlocks/external/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_ext - - /// Whether or not the airlock can be opened without access from a certain direction while powered, or with bare hands from any direction while unpowered OR pressurized. - var/space_dir = null - -/obj/machinery/door/airlock/external/Initialize(mapload, ...) - // default setting is for mapping only, let overrides work - if(!mapload) - req_access = null - - return ..() - -/obj/machinery/door/airlock/external/LateInitialize() - . = ..() - if(space_dir) - unres_sides |= space_dir - -/obj/machinery/door/airlock/external/examine(mob/user) - . = ..() - if(space_dir) - . += span_notice("It has labels indicating that it has an emergency mechanism to open from the [dir2text(space_dir)] side with just your hands even if there's no power.") - -/obj/machinery/door/airlock/external/cyclelinkairlock() - . = ..() - var/obj/machinery/door/airlock/external/cycle_linked_external_airlock = cyclelinkedairlock - if(istype(cycle_linked_external_airlock)) - cycle_linked_external_airlock.space_dir |= space_dir - space_dir |= cycle_linked_external_airlock.space_dir - -/obj/machinery/door/airlock/external/try_safety_unlock(mob/user) - if(space_dir && density) - if(!hasPower()) - to_chat(user, span_notice("You begin unlocking the airlock safety mechanism...")) - if(do_after(user, 15 SECONDS, target = src)) - try_to_crowbar(null, user, TRUE) - return TRUE - else - // always open from the space side - // get_dir(src, user) & space_dir, checked in unresricted_sides - var/should_safety_open = shuttledocked || cyclelinkedairlock?.shuttledocked || is_safe_turf(get_step(src, space_dir), TRUE, FALSE) - return try_to_activate_door(user, should_safety_open) - - return ..() - -/// Access free external airlock -/obj/machinery/door/airlock/external/ruin - -/obj/machinery/door/airlock/external/glass - opacity = FALSE - glass = TRUE - -/// Access free external glass airlock -/obj/machinery/door/airlock/external/glass/ruin - -////////////////////////////////// -/* - CentCom Airlocks -*/ - -/obj/machinery/door/airlock/centcom //Use grunge as a station side version, as these have special effects related to them via phobias and such. - icon = 'icons/obj/doors/airlocks/centcom/centcom.dmi' - overlays_file = 'icons/obj/doors/airlocks/centcom/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_centcom - normal_integrity = 1000 - security_level = 6 - explosion_block = 2 - -/obj/machinery/door/airlock/grunge - icon = 'icons/obj/doors/airlocks/centcom/centcom.dmi' - overlays_file = 'icons/obj/doors/airlocks/centcom/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_grunge - -////////////////////////////////// -/* - Vault Airlocks -*/ - -/obj/machinery/door/airlock/vault - name = "vault door" - icon = 'icons/obj/doors/airlocks/vault/vault.dmi' - overlays_file = 'icons/obj/doors/airlocks/vault/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_vault - explosion_block = 2 - normal_integrity = 400 // reverse engieneerd: 400 * 1.5 (sec lvl 6) = 600 = original - security_level = 6 - -////////////////////////////////// -/* - Hatch Airlocks -*/ - -/obj/machinery/door/airlock/hatch - name = "airtight hatch" - icon = 'icons/obj/doors/airlocks/hatch/centcom.dmi' - overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' - note_overlay_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_hatch - -/obj/machinery/door/airlock/maintenance_hatch - name = "maintenance hatch" - icon = 'icons/obj/doors/airlocks/hatch/maintenance.dmi' - overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' - note_overlay_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_mhatch - -////////////////////////////////// -/* - High Security Airlocks -*/ - -/obj/machinery/door/airlock/highsecurity - name = "high tech security airlock" - icon = 'icons/obj/doors/airlocks/highsec/highsec.dmi' - overlays_file = 'icons/obj/doors/airlocks/highsec/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_highsecurity - explosion_block = 2 - normal_integrity = 500 - security_level = 1 - damage_deflection = 30 - -////////////////////////////////// -/* - Shuttle Airlocks -*/ - -/obj/machinery/door/airlock/shuttle - name = "shuttle airlock" - icon = 'icons/obj/doors/airlocks/shuttle/shuttle.dmi' - overlays_file = 'icons/obj/doors/airlocks/shuttle/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_shuttle - -/obj/machinery/door/airlock/shuttle/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/abductor - name = "alien airlock" - desc = "With humanity's current technological level, it could take years to hack this advanced airlock... or maybe we should give a screwdriver a try?" - icon = 'icons/obj/doors/airlocks/abductor/abductor_airlock.dmi' - overlays_file = 'icons/obj/doors/airlocks/abductor/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_abductor - note_overlay_file = 'icons/obj/doors/airlocks/external/overlays.dmi' - damage_deflection = 30 - explosion_block = 3 - hackProof = TRUE - aiControlDisabled = AI_WIRE_DISABLED - normal_integrity = 700 - security_level = 1 - -////////////////////////////////// -/* - Cult Airlocks -*/ - -/obj/machinery/door/airlock/cult - name = "cult airlock" - icon = 'icons/obj/doors/airlocks/cult/runed/cult.dmi' - overlays_file = 'icons/obj/doors/airlocks/cult/runed/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_cult - hackProof = TRUE - aiControlDisabled = AI_WIRE_DISABLED - req_access = list(ACCESS_BLOODCULT) - damage_deflection = 10 - var/openingoverlaytype = /obj/effect/temp_visual/cult/door - var/friendly = FALSE - var/stealthy = FALSE - -/obj/machinery/door/airlock/cult/Initialize(mapload) - . = ..() - new openingoverlaytype(loc) - -/obj/machinery/door/airlock/cult/canAIControl(mob/user) - return (IS_CULTIST(user) && !isAllPowerCut()) - -/obj/machinery/door/airlock/cult/on_break() - set_panel_open(TRUE) - -/obj/machinery/door/airlock/cult/isElectrified() - return FALSE - -/obj/machinery/door/airlock/cult/hasPower() - return TRUE - -/obj/machinery/door/airlock/cult/allowed(mob/living/L) - if(!density) - return TRUE - if(friendly || IS_CULTIST(L) || isshade(L) || isconstruct(L)) - if(!stealthy) - new openingoverlaytype(loc) - return TRUE - else - if(!stealthy) - new /obj/effect/temp_visual/cult/sac(loc) - var/atom/throwtarget - throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src))) - SEND_SOUND(L, sound(pick('sound/hallucinations/turn_around1.ogg','sound/hallucinations/turn_around2.ogg'),0,1,50)) - flash_color(L, flash_color="#960000", flash_time=20) - L.Paralyze(40) - L.throw_at(throwtarget, 5, 1) - return FALSE - -/obj/machinery/door/airlock/cult/proc/conceal() - icon = 'icons/obj/doors/airlocks/station/maintenance.dmi' - overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' - name = "Airlock" - desc = "It opens and closes." - stealthy = TRUE - update_appearance() - -/obj/machinery/door/airlock/cult/proc/reveal() - icon = initial(icon) - overlays_file = initial(overlays_file) - name = initial(name) - desc = initial(desc) - stealthy = initial(stealthy) - update_appearance() - -/obj/machinery/door/airlock/cult/narsie_act() - return - -/obj/machinery/door/airlock/cult/emp_act(severity) - return - -/obj/machinery/door/airlock/cult/friendly - friendly = TRUE - -/obj/machinery/door/airlock/cult/glass - glass = TRUE - opacity = FALSE - -/obj/machinery/door/airlock/cult/glass/friendly - friendly = TRUE - -/obj/machinery/door/airlock/cult/unruned - icon = 'icons/obj/doors/airlocks/cult/unruned/cult.dmi' - overlays_file = 'icons/obj/doors/airlocks/cult/unruned/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_cult/unruned - openingoverlaytype = /obj/effect/temp_visual/cult/door/unruned - -/obj/machinery/door/airlock/cult/unruned/friendly - friendly = TRUE - -/obj/machinery/door/airlock/cult/unruned/glass - glass = TRUE - opacity = FALSE - -/obj/machinery/door/airlock/cult/unruned/glass/friendly - friendly = TRUE - -/obj/machinery/door/airlock/cult/weak - name = "brittle cult airlock" - desc = "An airlock hastily corrupted by blood magic, it is unusually brittle in this state." - normal_integrity = 150 - damage_deflection = 5 - armor_type = /datum/armor/none - - -////////////////////////////////// -/* - Material Airlocks -*/ -/obj/machinery/door/airlock/material - name = "Airlock" - material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_GREYSCALE | MATERIAL_AFFECT_STATISTICS - greyscale_config = /datum/greyscale_config/material_airlock - assemblytype = /obj/structure/door_assembly/door_assembly_material - -/obj/machinery/door/airlock/material/close(forced, force_crush) - . = ..() - if(!.) - return - for(var/datum/material/mat in custom_materials) - if(mat.alpha < 255) - set_opacity(FALSE) - break - -/obj/machinery/door/airlock/material/prepare_deconstruction_assembly(obj/structure/door_assembly/assembly) - assembly.set_custom_materials(custom_materials) - ..() - -/obj/machinery/door/airlock/material/glass - opacity = FALSE - glass = TRUE - -////////////////////////////////// -/* - Misc Airlocks -*/ - -/obj/machinery/door/airlock/glass_large - name = "large glass airlock" - icon = 'icons/obj/doors/airlocks/glass_large/glass_large.dmi' - overlays_file = 'icons/obj/doors/airlocks/glass_large/overlays.dmi' - opacity = FALSE - assemblytype = null - glass = TRUE - bound_width = 64 // 2x1 - -/obj/machinery/door/airlock/glass_large/narsie_act() - return - -/// Subtype used in unit tests to ensure instant airlock opening/closing. Pretty much just excises everything that would delay the process or is un-needed for the sake of the test (sleeps, icon animations). -/obj/machinery/door/airlock/instant - -// set_density on both open and close procs has a check and return builtin. - -/obj/machinery/door/airlock/instant/open(forced = DEFAULT_DOOR_CHECKS) - operating = TRUE - SEND_SIGNAL(src, COMSIG_AIRLOCK_OPEN, forced) - set_density(FALSE) - operating = FALSE - return TRUE - -/obj/machinery/door/airlock/instant/close(forced = DEFAULT_DOOR_CHECKS, force_crush = FALSE) - operating = TRUE - SEND_SIGNAL(src, COMSIG_AIRLOCK_CLOSE, forced) - set_density(TRUE) - operating = FALSE - return TRUE diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 39691a7763224..b99b9f4024691 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -27,6 +27,10 @@ var/visible = TRUE var/operating = FALSE var/glass = FALSE + /// Do we need to keep track of a filler panel with the airlock + var/multi_tile + /// A filler object used to fill the space of multi-tile airlocks + var/obj/structure/fluff/airlock_filler/filler var/welded = FALSE var/heat_proof = FALSE // For rglass-windowed airlocks and firedoors var/emergency = FALSE // Emergency access override @@ -66,10 +70,13 @@ AddElement(/datum/element/blocks_explosives) . = ..() set_init_door_layer() + if(multi_tile) + set_bounds() + set_filler() + update_overlays() update_freelook_sight() air_update_turf(TRUE, TRUE) register_context() - GLOB.airlocks += src if(elevator_mode) if(elevator_linked_id) elevator_status = LIFT_PLATFORM_LOCKED @@ -129,15 +136,51 @@ /obj/machinery/door/Destroy() update_freelook_sight() - GLOB.airlocks -= src if(elevator_mode) GLOB.elevator_doors -= src if(spark_system) qdel(spark_system) spark_system = null + QDEL_NULL(filler) air_update_turf(TRUE, FALSE) return ..() +/obj/machinery/door/Move() + if(multi_tile) + set_filler() + return ..() + +/** + * Sets the bounds of the airlock. For use with multi-tile airlocks. + * If the airlock is multi-tile, it will set the bounds to be the size of the airlock. + * If the airlock doesn't already have a filler object, it will create one. + * If the airlock already has a filler object, it will move it to the correct location. + */ +/obj/machinery/door/proc/set_filler() + if(!multi_tile) + return + if(!filler) + filler = new(get_step(src, get_adjusted_dir(dir))) + filler.pair_airlock(src) + else + filler.loc = get_step(src, get_adjusted_dir(dir)) + + filler.density = density + filler.set_opacity(opacity) + +/** + * Checks which way the airlock is facing and adjusts the direction accordingly. + * For use with multi-tile airlocks. + * + * @param dir direction to adjust + * @return adjusted direction + */ +/obj/machinery/door/proc/get_adjusted_dir(dir) + if(dir in list(NORTH, SOUTH)) + return EAST + else + return NORTH + /** * Signal handler for checking if we notify our surrounding that access requirements are lifted accordingly to a newly set security level * @@ -382,10 +425,10 @@ use_power(active_power_usage) do_animate("opening") set_opacity(0) - sleep(0.5 SECONDS) + SLEEP_NOT_DEL(0.5 SECONDS) set_density(FALSE) flags_1 &= ~PREVENT_CLICK_UNDER_1 - sleep(0.5 SECONDS) + SLEEP_NOT_DEL(0.5 SECONDS) layer = initial(layer) update_appearance() set_opacity(0) @@ -419,10 +462,10 @@ do_animate("closing") layer = closingLayer - sleep(0.5 SECONDS) + SLEEP_NOT_DEL(0.5 SECONDS) set_density(TRUE) flags_1 |= PREVENT_CLICK_UNDER_1 - sleep(0.5 SECONDS) + SLEEP_NOT_DEL(0.5 SECONDS) update_appearance() if(visible && !glass) set_opacity(1) @@ -450,25 +493,29 @@ open() /obj/machinery/door/proc/crush() - for(var/mob/living/L in get_turf(src)) - L.visible_message(span_warning("[src] closes on [L], crushing [L.p_them()]!"), span_userdanger("[src] closes on you and crushes you!")) - SEND_SIGNAL(L, COMSIG_LIVING_DOORCRUSHED, src) - if(isalien(L)) //For xenos - L.adjustBruteLoss(DOOR_CRUSH_DAMAGE * 1.5) //Xenos go into crit after aproximately the same amount of crushes as humans. - L.emote("roar") - else if(ishuman(L)) //For humans - L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) - L.emote("scream") - L.Paralyze(100) - else //for simple_animals & borgs - L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) - var/turf/location = get_turf(src) - //add_blood doesn't work for borgs/xenos, but add_blood_floor does. - L.add_splatter_floor(location) - log_combat(src, L, "crushed") - for(var/obj/vehicle/sealed/mecha/M in get_turf(src)) - M.take_damage(DOOR_CRUSH_DAMAGE) - log_combat(src, M, "crushed") + for(var/turf/checked_turf in locs) + for(var/mob/living/future_pancake in checked_turf) + future_pancake.visible_message(span_warning("[src] closes on [future_pancake], crushing [future_pancake.p_them()]!"), span_userdanger("[src] closes on you and crushes you!")) + SEND_SIGNAL(future_pancake, COMSIG_LIVING_DOORCRUSHED, src) + if(isalien(future_pancake)) //For xenos + future_pancake.adjustBruteLoss(DOOR_CRUSH_DAMAGE * 1.5) //Xenos go into crit after aproximately the same amount of crushes as humans. + future_pancake.emote("roar") + else if(ishuman(future_pancake)) //For humans + future_pancake.adjustBruteLoss(DOOR_CRUSH_DAMAGE) + future_pancake.emote("scream") + future_pancake.Paralyze(100) + else if(ismonkey(future_pancake)) //For monkeys + future_pancake.adjustBruteLoss(DOOR_CRUSH_DAMAGE) + future_pancake.Paralyze(100) + else //for simple_animals & borgs + future_pancake.adjustBruteLoss(DOOR_CRUSH_DAMAGE) + var/turf/location = get_turf(src) + //add_blood doesn't work for borgs/xenos, but add_blood_floor does. + future_pancake.add_splatter_floor(location) + log_combat(src, future_pancake, "crushed") + for(var/obj/vehicle/sealed/mecha/mech in get_turf(src)) // Your fancy metal won't save you here! + mech.take_damage(DOOR_CRUSH_DAMAGE) + log_combat(src, mech, "crushed") /obj/machinery/door/proc/autoclose() if(!QDELETED(src) && !density && !operating && !locked && !welded && autoclose) @@ -526,7 +573,7 @@ . = ..() /// Signal proc for [COMSIG_ATOM_MAGICALLY_UNLOCKED]. Open up when someone casts knock. -/obj/machinery/door/proc/on_magic_unlock(datum/source, datum/action/cooldown/spell/aoe/knock/spell, mob/living/caster) +/obj/machinery/door/proc/on_magic_unlock(datum/source, datum/action/cooldown/spell/aoe/knock/spell, atom/caster) SIGNAL_HANDLER INVOKE_ASYNC(src, PROC_REF(open)) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 526ed3df3ab05..b8568863600d2 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -436,14 +436,15 @@ if(place == my_area) place.alarm_manager.clear_alarm(ALARM_FIRE, place) -/obj/machinery/door/firedoor/emag_act(mob/user, obj/item/card/emag/emag_type) +/obj/machinery/door/firedoor/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return - if(istype(emag_type, /obj/item/card/emag/doorjack)) //Skip doorjack-specific code - var/obj/item/card/emag/doorjack/digital_crowbar = emag_type + return FALSE + if(istype(emag_card, /obj/item/card/emag/doorjack)) //Skip doorjack-specific code + var/obj/item/card/emag/doorjack/digital_crowbar = emag_card digital_crowbar.use_charge(user) obj_flags |= EMAGGED INVOKE_ASYNC(src, PROC_REF(open)) + return TRUE /obj/machinery/door/firedoor/Bumped(atom/movable/AM) if(panel_open || operating) @@ -518,7 +519,7 @@ return /obj/machinery/door/firedoor/try_to_weld_secondary(obj/item/weldingtool/W, mob/user) - if(!W.tool_start_check(user, amount=0)) + if(!W.tool_start_check(user, amount=1)) return user.visible_message(span_notice("[user] starts [welded ? "unwelding" : "welding"] [src]."), span_notice("You start welding [src].")) if(W.use_tool(src, user, DEFAULT_STEP_TIME, volume=50)) @@ -697,6 +698,11 @@ /obj/machinery/door/firedoor/border_only/Initialize(mapload) . = ..() adjust_lights_starting_offset() + var/static/list/loc_connections = list( + COMSIG_ATOM_EXIT = PROC_REF(on_exit), + ) + + AddElement(/datum/element/connect_loc, loc_connections) /obj/machinery/door/firedoor/border_only/adjust_lights_starting_offset() light_xoffset = 0 @@ -859,7 +865,7 @@ user.visible_message(span_notice("[user] begins cutting apart [src]'s frame..."), \ span_notice("You begin slicing [src] apart...")) - if(attacking_object.use_tool(src, user, DEFAULT_STEP_TIME, volume=50, amount=1)) + if(attacking_object.use_tool(src, user, DEFAULT_STEP_TIME, volume=50)) if(constructionStep != CONSTRUCTION_NO_CIRCUIT) return user.visible_message(span_notice("[user] cuts apart [src]!"), \ @@ -883,9 +889,9 @@ /obj/structure/firelock_frame/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) if(the_rcd.mode == RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 16) + return list("mode" = RCD_DECONSTRUCT, "delay" = 5 SECONDS, "cost" = 16) else if((constructionStep == CONSTRUCTION_NO_CIRCUIT) && (the_rcd.upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS)) - return list("mode" = RCD_UPGRADE_SIMPLE_CIRCUITS, "delay" = 20, "cost" = 1) + return list("mode" = RCD_UPGRADE_SIMPLE_CIRCUITS, "delay" = 2 SECONDS, "cost" = 1) return FALSE /obj/structure/firelock_frame/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) diff --git a/code/game/machinery/doors/passworddoor.dm b/code/game/machinery/doors/passworddoor.dm index 2bd3a5320b4cb..21b0bb2e1935f 100644 --- a/code/game/machinery/doors/passworddoor.dm +++ b/code/game/machinery/doors/passworddoor.dm @@ -9,9 +9,18 @@ armor_type = /datum/armor/door_password resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF damage_deflection = 70 + /// Password that must be provided to open the door. var/password = "Swordfish" - var/interaction_activated = TRUE //use the door to enter the password - var/voice_activated = FALSE //Say the password nearby to open the door. + /// Setting to true allows the user to input the password through a text box after clicking on the door. + var/interaction_activated = TRUE + /// Say the password nearby to open the door. + var/voice_activated = FALSE + /// Sound used upon opening. + var/door_open = 'sound/machines/blastdoor.ogg' + /// Sound used upon closing. + var/door_close = 'sound/machines/blastdoor.ogg' + /// Sound used upon denying. + var/door_deny = 'sound/machines/buzz-sigh.ogg' /obj/machinery/door/password/voice voice_activated = TRUE @@ -60,13 +69,13 @@ switch(animation) if("opening") flick("opening", src) - playsound(src, 'sound/machines/blastdoor.ogg', 50, TRUE) + playsound(src, door_open, 50, TRUE) if("closing") flick("closing", src) - playsound(src, 'sound/machines/blastdoor.ogg', 50, TRUE) + playsound(src, door_close, 50, TRUE) if("deny") //Deny animation would be nice to have. - playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) + playsound(src, door_deny, 30, TRUE) /obj/machinery/door/password/proc/ask_for_pass(mob/user) var/guess = tgui_input_text(user, "Enter the password", "Password") diff --git a/code/game/machinery/doors/unpowered.dm b/code/game/machinery/doors/unpowered.dm index 9372abe59ce18..6a9fea4741921 100644 --- a/code/game/machinery/doors/unpowered.dm +++ b/code/game/machinery/doors/unpowered.dm @@ -13,8 +13,8 @@ else return ..() -/obj/machinery/door/unpowered/emag_act() - return +/obj/machinery/door/unpowered/emag_act(mob/user, obj/item/card/emag/emag_card) + return FALSE /obj/machinery/door/unpowered/shuttle icon = 'icons/turf/shuttle.dmi' diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 263f764f3b09f..35044d5a81a47 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -324,16 +324,20 @@ /obj/machinery/door/window/atmos_expose(datum/gas_mixture/air, exposed_temperature) take_damage(round(exposed_temperature / 200), BURN, 0, 0) - -/obj/machinery/door/window/emag_act(mob/user) +/obj/machinery/door/window/emag_act(mob/user, obj/item/card/emag/emag_card) if(!operating && density && !(obj_flags & EMAGGED)) obj_flags |= EMAGGED operating = TRUE flick("[base_state]spark", src) playsound(src, SFX_SPARKS, 75, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - sleep(0.6 SECONDS) - operating = FALSE - open(BYPASS_DOOR_CHECKS) + addtimer(CALLBACK(src, PROC_REF(finish_emag_act)), 0.6 SECONDS) + return TRUE + return FALSE + +/// Timer proc, called ~0.6 seconds after [emag_act]. Finishes the emag sequence by breaking the windoor. +/obj/machinery/door/window/proc/finish_emag_act() + operating = FALSE + open(BYPASS_DOOR_CHECKS) /obj/machinery/door/window/examine(mob/user) . = ..() @@ -407,12 +411,13 @@ try_to_activate_door(user) /obj/machinery/door/window/try_to_activate_door(mob/user, access_bypass = FALSE) - if (..()) + . = ..() + if(.) autoclose = FALSE /obj/machinery/door/window/unrestricted_side(mob/opener) if(get_turf(opener) == loc) - return turn(dir,180) & unres_sides + return REVERSE_DIR(dir) & unres_sides return ..() /obj/machinery/door/window/try_to_crowbar(obj/item/I, mob/user, forced = FALSE) @@ -436,7 +441,7 @@ /obj/machinery/door/window/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 32) + return list("mode" = RCD_DECONSTRUCT, "delay" = 5 SECONDS, "cost" = 32) return FALSE /obj/machinery/door/window/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm index 6741927204b71..4a3e7e2bd6970 100644 --- a/code/game/machinery/droneDispenser.dm +++ b/code/game/machinery/droneDispenser.dm @@ -6,7 +6,7 @@ name = "drone shell dispenser" desc = "A hefty machine that, when supplied with iron and glass, will periodically create a drone shell. Does not need to be manually operated." - icon = 'icons/obj/machines/droneDispenser.dmi' + icon = 'icons/obj/machines/drone_dispenser.dmi' icon_state = "on" density = TRUE @@ -21,8 +21,8 @@ var/list/using_materials var/starting_amount = 0 - var/iron_cost =HALF_SHEET_MATERIAL_AMOUNT - var/glass_cost =HALF_SHEET_MATERIAL_AMOUNT + var/iron_cost = HALF_SHEET_MATERIAL_AMOUNT + var/glass_cost = HALF_SHEET_MATERIAL_AMOUNT var/power_used = 1000 var/mode = DRONE_READY @@ -48,16 +48,28 @@ var/break_message = "lets out a tinny alarm before falling dark." var/break_sound = 'sound/machines/warning-buzzer.ogg' + var/datum/component/material_container/materials + /obj/machinery/drone_dispenser/Initialize(mapload) . = ..() - var/datum/component/material_container/materials = AddComponent(/datum/component/material_container, list(/datum/material/iron, /datum/material/glass), SHEET_MATERIAL_AMOUNT * MAX_STACK_SIZE * 2, MATCONTAINER_EXAMINE|BREAKDOWN_FLAGS_DRONE_DISPENSER, allowed_items=/obj/item/stack) + materials = AddComponent( \ + /datum/component/material_container, \ + list(/datum/material/iron, /datum/material/glass), \ + SHEET_MATERIAL_AMOUNT * MAX_STACK_SIZE * 2, \ + MATCONTAINER_EXAMINE|BREAKDOWN_FLAGS_DRONE_DISPENSER, \ + allowed_items=/obj/item/stack \ + ) materials.insert_amount_mat(starting_amount) materials.precise_insertion = TRUE using_materials = list(/datum/material/iron = iron_cost, /datum/material/glass = glass_cost) REGISTER_REQUIRED_MAP_ITEM(1, 1) +/obj/machinery/drone_dispenser/Destroy() + materials = null + return ..() + /obj/machinery/drone_dispenser/preloaded - starting_amount = 5000 + starting_amount = SHEET_MATERIAL_AMOUNT * 2.5 /obj/machinery/drone_dispenser/syndrone //Please forgive me name = "syndrone shell dispenser" @@ -66,7 +78,7 @@ //If we're gonna be a jackass, go the full mile - 10 second recharge timer cooldownTime = 100 end_create_message = "dispenses a suspicious drone shell." - starting_amount = 25000 + starting_amount = SHEET_MATERIAL_AMOUNT * 12.5 /obj/machinery/drone_dispenser/syndrone/badass //Please forgive me name = "badass syndrone shell dispenser" @@ -81,10 +93,10 @@ dispense_type = /obj/effect/mob_spawn/ghost_role/drone/snowflake end_create_message = "dispenses a snowflake drone shell." // Those holoprojectors aren't cheap - iron_cost =SHEET_MATERIAL_AMOUNT - glass_cost =SHEET_MATERIAL_AMOUNT + iron_cost = SHEET_MATERIAL_AMOUNT + glass_cost = SHEET_MATERIAL_AMOUNT power_used = 2000 - starting_amount = 10000 + starting_amount = SHEET_MATERIAL_AMOUNT * 5 // If the derelict gets lonely, make more friends. /obj/machinery/drone_dispenser/derelict @@ -92,8 +104,8 @@ desc = "A rusty machine that, when supplied with iron and glass, will periodically create a derelict drone shell. Does not need to be manually operated." dispense_type = /obj/effect/mob_spawn/ghost_role/drone/derelict end_create_message = "dispenses a derelict drone shell." - iron_cost = 10000 - glass_cost = 5000 + iron_cost = SHEET_MATERIAL_AMOUNT * 5 + glass_cost = SHEET_MATERIAL_AMOUNT * 2.5 starting_amount = 0 cooldownTime = 600 @@ -108,7 +120,7 @@ /obj/machinery/drone_dispenser/hivebot name = "hivebot fabricator" desc = "A large, bulky machine that whirs with activity, steam hissing from vents in its sides." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/machines/hivebot_fabricator.dmi' icon_state = "hivebot_fab" icon_off = "hivebot_fab" icon_on = "hivebot_fab" @@ -118,7 +130,7 @@ glass_cost = 0 power_used = 0 cooldownTime = 10 //Only 1 second - hivebots are extremely weak - dispense_type = /mob/living/simple_animal/hostile/hivebot + dispense_type = /mob/living/basic/hivebot begin_create_message = "closes and begins fabricating something within." end_create_message = "slams open, revealing a hivebot!" recharge_sound = null @@ -128,11 +140,11 @@ . = ..() var/material_requirement_string = "It needs " if (iron_cost > 0) - material_requirement_string += "[iron_cost] iron " + material_requirement_string += "[iron_cost / SHEET_MATERIAL_AMOUNT] iron sheets " if (glass_cost > 0) material_requirement_string += "and " if (glass_cost > 0) - material_requirement_string += "[glass_cost] glass " + material_requirement_string += "[glass_cost / SHEET_MATERIAL_AMOUNT] glass sheets " if (iron_cost > 0 || glass_cost > 0) material_requirement_string += "to produce one drone shell." . += span_notice(material_requirement_string) @@ -144,7 +156,6 @@ if((machine_stat & (NOPOWER|BROKEN)) || !anchored) return - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) if(!materials.has_materials(using_materials)) return // We require more minerals @@ -212,7 +223,6 @@ /obj/machinery/drone_dispenser/attackby(obj/item/I, mob/living/user) if(I.tool_behaviour == TOOL_CROWBAR) - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) materials.retrieve_all() I.play_tool_sound(src) to_chat(user, span_notice("You retrieve the materials from [src].")) @@ -229,7 +239,7 @@ span_notice("[user] begins patching up [src] with [I]."), span_notice("You begin restoring the damage to [src]...")) - if(!I.use_tool(src, user, 40, volume=50, amount=1)) + if(!I.use_tool(src, user, 40, volume=50)) return user.visible_message( diff --git a/code/game/machinery/ecto_sniffer.dm b/code/game/machinery/ecto_sniffer.dm index fe0e3c78390f4..54d2b5e6f1e00 100644 --- a/code/game/machinery/ecto_sniffer.dm +++ b/code/game/machinery/ecto_sniffer.dm @@ -16,7 +16,7 @@ /obj/machinery/ecto_sniffer/Initialize(mapload) . = ..() - wires = new/datum/wires/ecto_sniffer(src) + set_wires(new/datum/wires/ecto_sniffer(src)) /obj/machinery/ecto_sniffer/attack_ghost(mob/user) . = ..() diff --git a/code/game/machinery/embedded_controller/access_controller.dm b/code/game/machinery/embedded_controller/access_controller.dm index 999a6afa5e9fe..7a92b1bbfaa3a 100644 --- a/code/game/machinery/embedded_controller/access_controller.dm +++ b/code/game/machinery/embedded_controller/access_controller.dm @@ -25,20 +25,21 @@ /obj/machinery/door_buttons/LateInitialize() findObjsByTag() -/obj/machinery/door_buttons/emag_act(mob/user) +/obj/machinery/door_buttons/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE obj_flags |= EMAGGED req_access = list() req_one_access = list() playsound(src, SFX_SPARKS, 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - to_chat(user, span_warning("You short out the access controller.")) + balloon_alert(user, "access controller shorted") + return TRUE /obj/machinery/door_buttons/proc/removeMe() /obj/machinery/door_buttons/access_button - icon = 'icons/obj/airlock_machines.dmi' + icon = 'icons/obj/machines/wallmounts.dmi' icon_state = "access_button_standby" base_icon_state = "access_button" name = "access button" @@ -49,11 +50,11 @@ var/busy /obj/machinery/door_buttons/access_button/findObjsByTag() - for(var/obj/machinery/door_buttons/airlock_controller/A in GLOB.machines) + for(var/obj/machinery/door_buttons/airlock_controller/A as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door_buttons/airlock_controller)) if(A.idSelf == idSelf) controller = A break - for(var/obj/machinery/door/airlock/I in GLOB.airlocks) + for(var/obj/machinery/door/airlock/I as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/airlock)) if(I.id_tag == idDoor) door = I break @@ -100,7 +101,7 @@ /obj/machinery/door_buttons/airlock_controller - icon = 'icons/obj/airlock_machines.dmi' + icon = 'icons/obj/machines/wallmounts.dmi' icon_state = "access_control_standby" base_icon_state = "access_control" name = "access console" @@ -119,7 +120,7 @@ exteriorAirlock = null /obj/machinery/door_buttons/airlock_controller/Destroy() - for(var/obj/machinery/door_buttons/access_button/A in GLOB.machines) + for(var/obj/machinery/door_buttons/access_button/A as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door_buttons/access_button)) if(A.controller == src) A.controller = null return ..() @@ -240,7 +241,7 @@ lostPower = FALSE /obj/machinery/door_buttons/airlock_controller/findObjsByTag() - for(var/obj/machinery/door/door as anything in GLOB.airlocks) + for(var/obj/machinery/door/door as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door)) if(door.id_tag == idInterior) interiorAirlock = door else if(door.id_tag == idExterior) diff --git a/code/game/machinery/embedded_controller/airlock_controller.dm b/code/game/machinery/embedded_controller/airlock_controller.dm index b71c1ad399b3e..11f9050ac6bf9 100644 --- a/code/game/machinery/embedded_controller/airlock_controller.dm +++ b/code/game/machinery/embedded_controller/airlock_controller.dm @@ -6,7 +6,7 @@ #define AIRLOCK_STATE_OUTOPEN "outopen" /obj/machinery/airlock_controller - icon = 'icons/obj/airlock_machines.dmi' + icon = 'icons/obj/machines/wallmounts.dmi' icon_state = "airlock_control_standby" base_icon_state = "airlock_control" diff --git a/code/game/machinery/fat_sucker.dm b/code/game/machinery/fat_sucker.dm index 03a71e486f693..6e1f745772e70 100644 --- a/code/game/machinery/fat_sucker.dm +++ b/code/game/machinery/fat_sucker.dm @@ -210,10 +210,11 @@ if(default_deconstruction_crowbar(I)) return TRUE -/obj/machinery/fat_sucker/emag_act(mob/living/user) +/obj/machinery/fat_sucker/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE start_at = 100 stop_at = 0 to_chat(user, span_notice("You remove the access restrictions and lower the automatic ejection threshold!")) obj_flags |= EMAGGED + return TRUE diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 0eb66a2191f32..82c5ce56a16c5 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -5,7 +5,7 @@ /obj/item/wallframe/firealarm name = "fire alarm frame" desc = "Used for building fire alarms." - icon = 'icons/obj/firealarm.dmi' + icon = 'icons/obj/machines/wallmounts.dmi' icon_state = "fire_bitem" result_path = /obj/machinery/firealarm pixel_shift = 26 @@ -13,7 +13,7 @@ /obj/machinery/firealarm name = "fire alarm" desc = "Pull this in case of emergency. Thus, keep pulling it forever." - icon = 'icons/obj/firealarm.dmi' + icon = 'icons/obj/machines/wallmounts.dmi' icon_state = "fire0" max_integrity = 250 integrity_failure = 0.4 @@ -74,8 +74,16 @@ ), \ ) + var/static/list/hovering_mob_typechecks = list( + /mob/living/silicon = list( + SCREENTIP_CONTEXT_CTRL_LMB = "Toggle thermal sensors, which control auto-deploy", + ) + ) + AddElement(/datum/element/contextual_screentip_mob_typechecks, hovering_mob_typechecks) + find_and_hang_on_wall() update_appearance() + /obj/machinery/firealarm/Destroy() if(my_area) LAZYREMOVE(my_area.firealarms, src) @@ -208,17 +216,18 @@ if(prob(50 / severity)) alarm() -/obj/machinery/firealarm/emag_act(mob/user) +/obj/machinery/firealarm/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE obj_flags |= EMAGGED update_appearance() + visible_message(span_warning("Sparks fly out of [src]!")) if(user) - user.visible_message(span_warning("Sparks fly out of [src]!")) - user.balloon_alert(user, "speaker disabled!") + balloon_alert(user, "speaker disabled") user.log_message("emagged [src].", LOG_ATTACK) playsound(src, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) set_status() + return TRUE /** * Signal handler for checking if we should update fire alarm appearance accordingly to a newly set security level @@ -317,7 +326,7 @@ if(tool.tool_behaviour == TOOL_WELDER && !user.combat_mode) if(atom_integrity < max_integrity) - if(!tool.tool_start_check(user, amount=0)) + if(!tool.tool_start_check(user, amount=1)) return to_chat(user, span_notice("You begin repairing [src]...")) @@ -404,7 +413,7 @@ /obj/machinery/firealarm/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) if((buildstage == FIRE_ALARM_BUILD_NO_CIRCUIT) && (the_rcd.upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS)) - return list("mode" = RCD_WALLFRAME, "delay" = 20, "cost" = 1) + return list("mode" = RCD_WALLFRAME, "delay" = 2 SECONDS, "cost" = 1) return FALSE /obj/machinery/firealarm/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) @@ -462,7 +471,7 @@ // Allows Silicons to disable thermal sensor /obj/machinery/firealarm/BorgCtrlClick(mob/living/silicon/robot/user) - if(get_dist(src,user) <= user.interaction_range) + if(get_dist(src,user) <= user.interaction_range && !(user.control_disabled)) AICtrlClick(user) return return ..() @@ -477,8 +486,9 @@ my_area.fire_detect = !my_area.fire_detect for(var/obj/machinery/firealarm/fire_panel in my_area.firealarms) fire_panel.update_icon() - to_chat(user, span_notice("You [ my_area.fire_detect ? "enable" : "disable" ] the local firelock thermal sensors!")) - user.log_message("[ my_area.fire_detect ? "enabled" : "disabled" ] firelock sensors using [src].", LOG_GAME) + if (user) + balloon_alert(user, "thermal sensors [my_area.fire_detect ? "enabled" : "disabled"]") + user.log_message("[ my_area.fire_detect ? "enabled" : "disabled" ] firelock sensors using [src].", LOG_GAME) MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/firealarm, 26) diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 2bb5a59478022..8075b51dcab00 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -3,7 +3,7 @@ /obj/machinery/flasher name = "mounted flash" desc = "A wall-mounted flashbulb device." - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/wallmounts.dmi' icon_state = "mflash1" base_icon_state = "mflash" max_integrity = 250 @@ -28,6 +28,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/flasher, 26) . = ..() // ..() is EXTREMELY IMPORTANT, never forget to add it if(!built) bulb = new(src) + find_and_hang_on_wall() /obj/machinery/flasher/vv_edit_var(vname, vval) . = ..() @@ -159,6 +160,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/flasher, 26) /obj/machinery/flasher/portable //Portable version of the flasher. Only flashes when anchored name = "portable flasher" desc = "A portable flashing device. Wrench to activate and deactivate. Cannot detect slow movements." + icon = 'icons/obj/machines/sec.dmi' icon_state = "pflash1-p" base_icon_state = "pflash" strength = 8 SECONDS @@ -177,7 +179,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/flasher, 26) if(iscarbon(proximity_check_mob)) var/mob/living/carbon/proximity_carbon = proximity_check_mob - if (proximity_carbon.m_intent != MOVE_INTENT_WALK && anchored) + if (proximity_carbon.move_intent != MOVE_INTENT_WALK && anchored) flash() /obj/machinery/flasher/portable/vv_edit_var(vname, vval) @@ -208,7 +210,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/flasher, 26) /obj/item/wallframe/flasher name = "mounted flash frame" desc = "Used for building wall-mounted flashers." - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/wallmounts.dmi' icon_state = "mflash_frame" result_path = /obj/machinery/flasher var/id = null diff --git a/code/game/machinery/gigabeacon.dm b/code/game/machinery/gigabeacon.dm index 76df121cc99f2..b1e3b2f7cda1c 100644 --- a/code/game/machinery/gigabeacon.dm +++ b/code/game/machinery/gigabeacon.dm @@ -1,6 +1,6 @@ /obj/machinery/bluespace_beacon - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/machines/floor.dmi' icon_state = "floor_beaconf" name = "bluespace gigabeacon" desc = "A device that draws power from bluespace and creates a permanent tracking beacon." diff --git a/code/game/machinery/gulag_item_reclaimer.dm b/code/game/machinery/gulag_item_reclaimer.dm index e60778542a866..9c649b2c8ee96 100644 --- a/code/game/machinery/gulag_item_reclaimer.dm +++ b/code/game/machinery/gulag_item_reclaimer.dm @@ -1,7 +1,7 @@ /obj/machinery/gulag_item_reclaimer name = "equipment reclaimer station" desc = "Used to reclaim your items after you finish your sentence at the labor camp." - icon = 'icons/obj/terminals.dmi' + icon = 'icons/obj/machines/wallmounts.dmi' icon_state = "gulag_off" req_access = list(ACCESS_BRIG) //REQACCESS TO ACCESS ALL STORED ITEMS density = FALSE @@ -11,10 +11,10 @@ ///Icon of the current screen status var/screen_icon = "gulag_on" -/obj/machinery/gulag_item_reclaimer/handle_atom_del(atom/deleting_atom) +/obj/machinery/gulag_item_reclaimer/Exited(atom/movable/gone, direction) + . = ..() for(var/person in stored_items) - stored_items[person] -= deleting_atom - return ..() + stored_items[person] -= gone /obj/machinery/gulag_item_reclaimer/update_overlays() . = ..() @@ -32,13 +32,15 @@ linked_teleporter.linked_reclaimer = null return ..() -/obj/machinery/gulag_item_reclaimer/emag_act(mob/user) +/obj/machinery/gulag_item_reclaimer/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) // emagging lets anyone reclaim all the items - return + return FALSE req_access = list() obj_flags |= EMAGGED screen_icon = "emagged_general" update_appearance() + balloon_alert(user, "id checker scrambled") + return TRUE /obj/machinery/gulag_item_reclaimer/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) diff --git a/code/game/machinery/gulag_teleporter.dm b/code/game/machinery/gulag_teleporter.dm index 36f8048ea1fe9..ce46a5d2fce97 100644 --- a/code/game/machinery/gulag_teleporter.dm +++ b/code/game/machinery/gulag_teleporter.dm @@ -9,7 +9,7 @@ The console is located at computer/gulag_teleporter.dm /obj/machinery/gulag_teleporter name = "labor camp teleporter" desc = "A bluespace teleporter used for teleporting prisoners to the labor camp." - icon = 'icons/obj/machines/implantchair.dmi' + icon = 'icons/obj/machines/implant_chair.dmi' icon_state = "implantchair" base_icon_state = "implantchair" state_open = FALSE diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm index 4c0ffd8b423db..1a16c00e42da8 100644 --- a/code/game/machinery/harvester.dm +++ b/code/game/machinery/harvester.dm @@ -13,6 +13,7 @@ var/harvesting = FALSE var/warming_up = FALSE var/list/operation_order = list() //Order of wich we harvest limbs. + var/output_dir = SOUTH //Direction to drop the limbs in var/allow_clothing = FALSE var/allow_living = FALSE @@ -58,6 +59,12 @@ /obj/machinery/harvester/AltClick(mob/user) . = ..() + if(!user.can_perform_action(src)) + return + if(panel_open) + output_dir = turn(output_dir, -90) + to_chat(user, span_notice("You change [src]'s output settings, setting the output to [dir2text(output_dir)].")) + return if(!can_interact(user)) return if(harvesting || !user || !isliving(user) || state_open) @@ -68,21 +75,18 @@ /obj/machinery/harvester/proc/can_harvest() if(!powered() || state_open || !occupant || !iscarbon(occupant)) return - var/mob/living/carbon/C = occupant + var/mob/living/carbon/carbon_occupant = occupant if(!allow_clothing) - for(var/A in C.held_items + C.get_equipped_items()) - if(!isitem(A)) - continue - var/obj/item/I = A - if(!(HAS_TRAIT(I, TRAIT_NODROP))) + for(var/obj/item/abiotic_item in carbon_occupant.held_items + carbon_occupant.get_equipped_items()) + if(!(HAS_TRAIT(abiotic_item, TRAIT_NODROP))) say("Subject may not have abiotic items on.") playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) return - if(!(C.mob_biotypes & MOB_ORGANIC)) + if(!(carbon_occupant.mob_biotypes & MOB_ORGANIC)) say("Subject is not organic.") playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) return - if(!allow_living && !(C.stat == DEAD || HAS_TRAIT(C, TRAIT_FAKEDEATH))) //I mean, the machines scanners arent advanced enough to tell you're alive + if(!allow_living && !(carbon_occupant.stat == DEAD || HAS_TRAIT(carbon_occupant, TRAIT_FAKEDEATH))) //I mean, the machines scanners arent advanced enough to tell you're alive say("Subject is still alive.") playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) return @@ -91,8 +95,18 @@ /obj/machinery/harvester/proc/start_harvest() if(!occupant || !iscarbon(occupant)) return - var/mob/living/carbon/C = occupant - operation_order = reverseList(C.bodyparts) //Chest and head are first in bodyparts, so we invert it to make them suffer more + + var/mob/living/carbon/carbon_occupant = occupant + + if(carbon_occupant.stat < UNCONSCIOUS) + notify_ghosts( + "[occupant] is about to be ground up by a malfunctioning organ harvester!", + source = src, + header = "Gruesome!", + action = NOTIFY_ORBIT, + ) + + operation_order = reverseList(carbon_occupant.bodyparts) //Chest and head are first in bodyparts, so we invert it to make them suffer more warming_up = TRUE harvesting = TRUE visible_message(span_notice("The [name] begins warming up!")) @@ -107,31 +121,21 @@ end_harvesting(success = FALSE) return playsound(src, 'sound/machines/juicer.ogg', 20, TRUE) - var/mob/living/carbon/C = occupant + var/mob/living/carbon/carbon_occupant = occupant if(!LAZYLEN(operation_order)) //The list is empty, so we're done here end_harvesting(success = TRUE) return - var/turf/target - for(var/adir in list(EAST,NORTH,SOUTH,WEST)) - var/turf/T = get_step(src,adir) - if(!T) - continue - if(isclosedturf(T)) - continue - target = T - break - if(!target) - target = get_turf(src) - for(var/obj/item/bodypart/BP in operation_order) //first we do non-essential limbs - BP.drop_limb() - C.emote("scream") - if(BP.body_zone != "chest") - BP.forceMove(target) //Move the limbs right next to it, except chest, that's a weird one - BP.drop_organs() + var/turf/target = get_step(src, output_dir) + for(var/obj/item/bodypart/limb_to_remove as anything in operation_order) //first we do non-essential limbs + limb_to_remove.drop_limb() + carbon_occupant.emote("scream") + if(limb_to_remove.body_zone != "chest") + limb_to_remove.forceMove(target) //Move the limbs right next to it, except chest, that's a weird one + limb_to_remove.drop_organs() else - for(var/obj/item/organ/O in BP.dismember()) - O.forceMove(target) //Some organs, like chest ones, are different so we need to manually move them - operation_order.Remove(BP) + for(var/obj/item/organ/organ_to_remove in limb_to_remove.dismember()) + organ_to_remove.forceMove(target) //Some organs, like chest ones, are different so we need to manually move them + operation_order.Remove(limb_to_remove) break use_power(active_power_usage) addtimer(CALLBACK(src, PROC_REF(harvest)), interval) @@ -147,7 +151,7 @@ say("Subject has been successfully harvested.") playsound(src, 'sound/machines/microwave/microwave-end.ogg', 100, FALSE) -/obj/machinery/harvester/screwdriver_act(mob/living/user, obj/item/I) +/obj/machinery/harvester/screwdriver_act(mob/living/user, obj/item/tool) . = TRUE if(..()) return @@ -157,29 +161,31 @@ if(state_open) to_chat(user, span_warning("[src] must be closed to [panel_open ? "close" : "open"] its maintenance hatch!")) return - if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-o", initial(icon_state), I)) + if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-o", initial(icon_state), tool)) return return FALSE -/obj/machinery/harvester/crowbar_act(mob/living/user, obj/item/I) - if(default_pry_open(I)) +/obj/machinery/harvester/crowbar_act(mob/living/user, obj/item/tool) + if(default_pry_open(tool)) return TRUE - if(default_deconstruction_crowbar(I)) + if(default_deconstruction_crowbar(tool)) return TRUE -/obj/machinery/harvester/default_pry_open(obj/item/I) //wew - . = !(state_open || panel_open || (flags_1 & NODECONSTRUCT_1)) && I.tool_behaviour == TOOL_CROWBAR //We removed is_operational here +/obj/machinery/harvester/default_pry_open(obj/item/tool) //wew + . = !(state_open || panel_open || (flags_1 & NODECONSTRUCT_1)) && tool.tool_behaviour == TOOL_CROWBAR //We removed is_operational here if(.) - I.play_tool_sound(src, 50) + tool.play_tool_sound(src, 50) visible_message(span_notice("[usr] pries open \the [src]."), span_notice("You pry open [src].")) open_machine() -/obj/machinery/harvester/emag_act(mob/user) +/obj/machinery/harvester/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE obj_flags |= EMAGGED allow_living = TRUE - to_chat(user, span_warning("You overload [src]'s lifesign scanners.")) + allow_clothing = TRUE + balloon_alert(!user, "lifesign scanners overloaded") + return TRUE /obj/machinery/harvester/container_resist_act(mob/living/user) if(!harvesting) @@ -207,4 +213,4 @@ else if(!harvesting) . += span_notice("Alt-click [src] to start harvesting.") if(in_range(user, src) || isobserver(user)) - . += span_notice("The status display reads: Harvest speed at [interval*0.1] seconds per organ.") + . += span_notice("The status display reads: Harvest speed at [interval*0.1] seconds per organ. Outputting to the [dir2text(output_dir)].") diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 89a1ba14b9862..f24cde8336710 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -36,6 +36,7 @@ Possible to do for anyone motivated enough: /obj/machinery/holopad name = "holopad" desc = "It's a floor-mounted device for projecting holographic images." + icon = 'icons/obj/machines/floor.dmi' icon_state = "holopad0" base_icon_state = "holopad" layer = LOW_OBJ_LAYER @@ -102,6 +103,13 @@ Possible to do for anyone motivated enough: SET_PLANE_IMPLICIT(src, FLOOR_PLANE) update_appearance() + var/static/list/hovering_mob_typechecks = list( + /mob/living/silicon = list( + SCREENTIP_CONTEXT_ALT_LMB = "Disconnect all active calls", + ) + ) + AddElement(/datum/element/contextual_screentip_mob_typechecks, hovering_mob_typechecks) + /obj/machinery/holopad/secure name = "secure holopad" desc = "It's a floor-mounted device for projecting holographic images. This one will refuse to auto-connect incoming calls." @@ -570,7 +578,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ if(speaker == holocall_to_update.hologram && holocall_to_update.user.client?.prefs.read_preference(/datum/preference/toggle/enable_runechat)) holocall_to_update.user.create_chat_message(speaker, message_language, raw_message, spans) else - holocall_to_update.user.Hear(message, speaker, message_language, raw_message, radio_freq, spans, message_mods, message_range) + holocall_to_update.user.Hear(message, speaker, message_language, raw_message, radio_freq, spans, message_mods, message_range = INFINITY) if(outgoing_call?.hologram && speaker == outgoing_call.user) outgoing_call.hologram.say(raw_message, sanitize = FALSE) @@ -681,16 +689,16 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ if(!LAZYLEN(masters) || !masters[owner]) return TRUE var/obj/effect/overlay/holo_pad_hologram/holo = masters[owner] - var/transfered = FALSE + var/transferred = FALSE if(!validate_location(new_turf)) if(!transfer_to_nearby_pad(new_turf, owner)) return FALSE else - transfered = TRUE + transferred = TRUE //All is good. holo.abstract_move(new_turf) SET_PLANE(holo, ABOVE_GAME_PLANE, new_turf) - if(!transfered) + if(!transferred) update_holoray(owner, new_turf) return TRUE diff --git a/code/game/machinery/hypnochair.dm b/code/game/machinery/hypnochair.dm index b3d0879204abf..ecf47b39633f2 100644 --- a/code/game/machinery/hypnochair.dm +++ b/code/game/machinery/hypnochair.dm @@ -1,7 +1,7 @@ /obj/machinery/hypnochair name = "enhanced interrogation chamber" desc = "A device used to perform \"enhanced interrogation\" through invasive mental conditioning." - icon = 'icons/obj/machines/implantchair.dmi' + icon = 'icons/obj/machines/implant_chair.dmi' icon_state = "hypnochair" base_icon_state = "hypnochair" circuit = /obj/item/circuitboard/machine/hypnochair diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 6f2fb64aaa970..060b29c4d20d7 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -1,7 +1,7 @@ /obj/machinery/igniter name = "igniter" desc = "It's useful for igniting plasma." - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/machines/floor.dmi' icon_state = "igniter0" base_icon_state = "igniter" plane = FLOOR_PLANE @@ -134,7 +134,7 @@ /obj/item/wallframe/sparker name = "Sparker WallFrame" desc = "An unmounted sparker. Attach it to a wall to use." - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/wallmounts.dmi' icon_state = "migniter" result_path = /obj/machinery/sparker pixel_shift = 26 @@ -142,7 +142,7 @@ /obj/machinery/sparker name = "mounted igniter" desc = "A wall-mounted ignition device." - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/wallmounts.dmi' icon_state = "migniter" base_icon_state = "migniter" resistance_flags = FIRE_PROOF @@ -162,6 +162,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/sparker, 26) spark_system.set_up(2, 1, src) spark_system.attach(src) register_context() + find_and_hang_on_wall() /obj/machinery/sparker/Destroy() QDEL_NULL(spark_system) diff --git a/code/game/machinery/incident_display.dm b/code/game/machinery/incident_display.dm new file mode 100644 index 0000000000000..5ec7c50ecfd62 --- /dev/null +++ b/code/game/machinery/incident_display.dm @@ -0,0 +1,377 @@ +GLOBAL_LIST_EMPTY(map_delamination_counters) + +/// Display days since last delam on incident sign +#define DISPLAY_DELAM (1<<0) +/// Display current number of tram hits on incident sign +#define DISPLAY_TRAM (1<<1) + +DEFINE_BITFIELD(sign_features, list( + "DISPLAY_DELAM" = DISPLAY_DELAM, + "DISPLAY_TRAM" = DISPLAY_TRAM, +)) + +#define TREND_RISING "rising" +#define TREND_FALLING "falling" + +#define NAME_DUAL "safety incident display" +#define NAME_DELAM "delamination incident display" +#define NAME_TRAM "tram incident display" + +#define DESC_DUAL "A display that provides information on the station's safety record. Features an advert for SAFETY MOTH." +#define DESC_DELAM "A signs describe how long it's been since the last delamination incident. Features an advert for SAFETY MOTH." +#define DESC_TRAM "A display that provides the number of tram related safety incidents this shift. Features an advert for SAFETY MOTH." + +/** + * List of safety statistic signs on the map that have delam counting enabled. + * Required as persistence subsystem loads after the ones present at mapload, and to reset to 0 upon explosion. + */ + +/obj/machinery/incident_display + name = NAME_DELAM + desc = DESC_DELAM + icon = 'icons/obj/machines/incident_display.dmi' + icon_preview = "stat_display_delam" + icon_state = "stat_display_delam" + verb_say = "beeps" + verb_ask = "bloops" + verb_exclaim = "blares" + idle_power_usage = 450 + max_integrity = 150 + integrity_failure = 0.75 + custom_materials = list(/datum/material/titanium = SHEET_MATERIAL_AMOUNT * 4, /datum/material/alloy/titaniumglass = SHEET_MATERIAL_AMOUNT * 4) + /// What statistics we want the sign to display + var/sign_features = DISPLAY_DELAM + /// Tram hits before hazard warning + var/hit_threshold = 0 + /// Tram hits + var/hit_count = 0 + /// Shifts without delam + var/last_delam = 0 + /// Delam record high-score + var/delam_record = 0 + +/obj/machinery/incident_display/dual + name = NAME_DUAL + desc = DESC_DUAL + icon_preview = "stat_display_dual" + icon_state = "stat_display_dual" + sign_features = DISPLAY_DELAM | DISPLAY_TRAM + +/obj/machinery/incident_display/delam + name = NAME_DELAM + desc = DESC_DELAM + icon_preview = "stat_display_delam" + icon_state = "stat_display_delam" + sign_features = DISPLAY_DELAM + +/obj/machinery/incident_display/tram + name = NAME_TRAM + desc = DESC_TRAM + icon_preview = "stat_display_tram" + icon_state = "stat_display_tram" + sign_features = DISPLAY_TRAM + +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display, 32) +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display/delam, 32) +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display/dual, 32) +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display/tram, 32) + +/obj/machinery/incident_display/Initialize(mapload) + ..() + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/incident_display/LateInitialize() + . = ..() + GLOB.map_delamination_counters += src + update_delam_count(SSpersistence.rounds_since_engine_exploded, SSpersistence.delam_highscore) + for(var/obj/structure/industrial_lift/tram/tram as anything in GLOB.lifts) + RegisterSignal(tram, COMSIG_TRAM_COLLISION, PROC_REF(update_tram_count)) + + update_appearance() + +/obj/machinery/incident_display/Destroy() + GLOB.map_delamination_counters -= src + return ..() + +/obj/machinery/incident_display/welder_act(mob/living/user, obj/item/tool) + if(user.combat_mode) + return FALSE + + if(atom_integrity >= max_integrity && !(machine_stat & BROKEN)) + balloon_alert(user, "it doesn't need repairs!") + return TRUE + + balloon_alert(user, "repairing display...") + if(!tool.use_tool(src, user, 4 SECONDS, amount = 0, volume=50)) + return TRUE + + balloon_alert(user, "repaired") + atom_integrity = max_integrity + set_machine_stat(machine_stat & ~BROKEN) + update_appearance() + return TRUE + +// Switch modes with multitool +/obj/machinery/incident_display/multitool_act(mob/living/user, obj/item/tool) + if(user.combat_mode) + return FALSE + + if(sign_features == DISPLAY_TRAM) + tool.play_tool_sound(src) + balloon_alert(user, "set to dual") + name = NAME_DUAL + desc = DESC_DUAL + icon_state = "stat_display_dual" + sign_features = DISPLAY_DELAM | DISPLAY_TRAM + update_delam_count(SSpersistence.rounds_since_engine_exploded, SSpersistence.delam_highscore) + update_tram_count(src, SSpersistence.tram_hits_this_round) + update_appearance() + return TRUE + else if(sign_features == DISPLAY_DELAM) + tool.play_tool_sound(src) + balloon_alert(user, "set to tram") + name = NAME_TRAM + desc = DESC_TRAM + icon_state = "stat_display_tram" + sign_features = DISPLAY_TRAM + update_tram_count(src, SSpersistence.tram_hits_this_round) + update_appearance() + return TRUE + else if(sign_features == (DISPLAY_DELAM + DISPLAY_TRAM)) + tool.play_tool_sound(src) + balloon_alert(user, "set to delam") + name = NAME_DELAM + desc = DESC_DELAM + icon_state = "stat_display_delam" + sign_features = DISPLAY_DELAM + update_delam_count(SSpersistence.rounds_since_engine_exploded, SSpersistence.delam_highscore) + update_appearance() + return TRUE + +// EMP causes the display to display random numbers or outright break. +/obj/machinery/incident_display/emp_act(severity) + . = ..() + if(prob(50)) + set_machine_stat(machine_stat | BROKEN) + update_appearance() + return + name = NAME_DUAL + desc = DESC_DUAL + icon_state = "stat_display_dual" + sign_features = DISPLAY_DELAM | DISPLAY_TRAM + hit_threshold = rand(1,99) + hit_count = rand(1,99) + last_delam = rand(1,99) + delam_record = rand(1,99) + update_appearance() + +/obj/machinery/incident_display/deconstruct() + if(flags_1 & NODECONSTRUCT_1) + return + + new /obj/item/stack/sheet/mineral/titanium(drop_location(), 2) + new /obj/item/shard(drop_location()) + new /obj/item/shard(drop_location()) + + qdel(src) + +/obj/machinery/incident_display/proc/update_delam_count(new_count, record) + delam_record = record + last_delam = min(new_count, 199) + update_appearance() + +/obj/machinery/incident_display/proc/update_tram_count(source, tram_collisions) + SIGNAL_HANDLER + + hit_count = min(tram_collisions, 199) + update_appearance() + +/obj/machinery/incident_display/update_appearance(updates=ALL) + . = ..() + if(machine_stat & NOPOWER) + icon_state = "stat_display_blank" + set_light(0) + return + + if(machine_stat & BROKEN) + icon_state = "stat_display_broken" + set_light(l_range = 1.7, l_power = 1.5, l_color = LIGHT_COLOR_DARK_BLUE) + return + + if(sign_features == (DISPLAY_DELAM + DISPLAY_TRAM)) + icon_state = "stat_display_dual" + else if(sign_features == DISPLAY_DELAM) + icon_state = "stat_display_delam" + else if(sign_features == DISPLAY_TRAM) + icon_state = "stat_display_tram" + + set_light(l_range = 1.7, l_power = 1.5, l_color = LIGHT_COLOR_FAINT_BLUE) + +/obj/machinery/incident_display/update_overlays() + . = ..() + if(machine_stat & (NOPOWER|BROKEN)) + return + + var/mutable_appearance/moff_base_emissive = emissive_appearance(icon, "moff_base_emissive", src, alpha = src.alpha) + . += moff_base_emissive + + if(sign_features & DISPLAY_DELAM) + var/mutable_appearance/delam_base_emissive = emissive_appearance(icon, "delam_base_emissive", src, alpha = src.alpha) + var/delam_display_color + . += delam_base_emissive + if(!last_delam) + delam_display_color = LIGHT_COLOR_INTENSE_RED + else + delam_display_color = LIGHT_COLOR_HOLY_MAGIC + + var/delam_pos1 = last_delam % 10 + var/mutable_appearance/delam_pos1_overlay = mutable_appearance(icon, "num_[delam_pos1]") + var/mutable_appearance/delam_pos1_emissive = emissive_appearance(icon, "num_[delam_pos1]_e", src, alpha = src.alpha) + delam_pos1_overlay.color = delam_display_color + delam_pos1_overlay.pixel_w = 9 + delam_pos1_emissive.pixel_w = 9 + delam_pos1_overlay.pixel_z = 4 + delam_pos1_emissive.pixel_z = 4 + . += delam_pos1_overlay + . += delam_pos1_emissive + + var/delam_pos2 = (last_delam / 10) % 10 + var/mutable_appearance/delam_pos2_overlay = mutable_appearance(icon, "num_[delam_pos2]") + var/mutable_appearance/delam_pos2_emissive = emissive_appearance(icon, "num_[delam_pos2]_e", src, alpha = src.alpha) + delam_pos2_overlay.color = delam_display_color + delam_pos2_overlay.pixel_w = 4 + delam_pos2_emissive.pixel_w = 4 + delam_pos2_overlay.pixel_z = 4 + delam_pos2_emissive.pixel_z = 4 + . += delam_pos2_overlay + . += delam_pos2_emissive + + if(last_delam >= 100) + var/mutable_appearance/there_i_fixed_it_overlay = mutable_appearance(icon, "num_100_red") + var/mutable_appearance/there_i_fixed_it_emissive = emissive_appearance(icon, "num_100_red", src, alpha = src.alpha) + . += there_i_fixed_it_overlay + . += there_i_fixed_it_emissive + + if(last_delam == delam_record) + var/mutable_appearance/delam_trend_overlay = mutable_appearance(icon, TREND_RISING) + var/mutable_appearance/delam_trend_emissive = emissive_appearance(icon, "[TREND_RISING]_e", src, alpha = src.alpha) + delam_trend_overlay.color = LIGHT_COLOR_VIVID_GREEN + delam_trend_overlay.pixel_w = 1 + delam_trend_emissive.pixel_w = 1 + delam_trend_overlay.pixel_z = 6 + delam_trend_emissive.pixel_z = 6 + . += delam_trend_overlay + . += delam_trend_emissive + else + var/mutable_appearance/delam_trend_overlay = mutable_appearance(icon, TREND_FALLING) + var/mutable_appearance/delam_trend_emissive = emissive_appearance(icon, "[TREND_FALLING]_e", src, alpha = src.alpha) + delam_trend_overlay.color = LIGHT_COLOR_INTENSE_RED + delam_trend_overlay.pixel_w = 1 + delam_trend_emissive.pixel_w = 1 + delam_trend_overlay.pixel_z = 6 + delam_trend_emissive.pixel_z = 6 + . += delam_trend_overlay + . += delam_trend_emissive + + if(sign_features & DISPLAY_TRAM) + var/mutable_appearance/tram_base_emissive = emissive_appearance(icon, "tram_base_emissive", src, alpha = src.alpha) + var/tram_display_color = LIGHT_COLOR_BABY_BLUE + + var/tram_pos1 = hit_count % 10 + var/mutable_appearance/tram_pos1_overlay = mutable_appearance(icon, "num_[tram_pos1]") + var/mutable_appearance/tram_pos1_emissive = emissive_appearance(icon, "num_[tram_pos1]_e", src, alpha = src.alpha) + . += tram_base_emissive + tram_pos1_overlay.color = tram_display_color + tram_pos1_overlay.pixel_w = 9 + tram_pos1_emissive.pixel_w = 9 + tram_pos1_overlay.pixel_z = -6 + tram_pos1_emissive.pixel_z = -6 + . += tram_pos1_overlay + . += tram_pos1_emissive + + var/tram_pos2 = (hit_count / 10) % 10 + var/mutable_appearance/tram_pos2_overlay = mutable_appearance(icon, "num_[tram_pos2]") + var/mutable_appearance/tram_pos2_emissive = emissive_appearance(icon, "num_[tram_pos2]_e", src, alpha = src.alpha) + tram_pos2_overlay.color = tram_display_color + tram_pos2_overlay.pixel_w = 4 + tram_pos2_emissive.pixel_w = 4 + tram_pos2_overlay.pixel_z = -6 + tram_pos2_emissive.pixel_z = -6 + . += tram_pos2_overlay + . += tram_pos2_emissive + + if(hit_count >= 100) + var/mutable_appearance/there_i_fixed_it_overlay = mutable_appearance(icon, "num_100_blue") + var/mutable_appearance/there_i_fixed_it_emissive = emissive_appearance(icon, "num_100_blue", src, alpha = src.alpha) + . += there_i_fixed_it_overlay + . += there_i_fixed_it_emissive + + if(hit_count > SSpersistence.tram_hits_last_round) + var/mutable_appearance/tram_trend_overlay = mutable_appearance(icon, TREND_RISING) + var/mutable_appearance/tram_trend_emissive = emissive_appearance(icon, "[TREND_RISING]_e", src, alpha = src.alpha) + tram_trend_overlay.color = LIGHT_COLOR_INTENSE_RED + tram_trend_overlay.pixel_w = 1 + tram_trend_emissive.pixel_w = 1 + tram_trend_overlay.pixel_z = -4 + tram_trend_emissive.pixel_z = -4 + . += tram_trend_overlay + . += tram_trend_emissive + else + var/mutable_appearance/tram_trend_overlay = mutable_appearance(icon, TREND_FALLING) + var/mutable_appearance/tram_trend_emissive = emissive_appearance(icon, "[TREND_FALLING]_e", src, alpha = src.alpha) + tram_trend_overlay.color = LIGHT_COLOR_VIVID_GREEN + tram_trend_overlay.pixel_w = 1 + tram_trend_emissive.pixel_w = 1 + tram_trend_overlay.pixel_z = -4 + tram_trend_emissive.pixel_z = -4 + . += tram_trend_overlay + . += tram_trend_emissive + +/obj/machinery/incident_display/examine(mob/user) + . = ..() + + if(sign_features & DISPLAY_DELAM) + . += span_info("It has been [last_delam] shift\s since the last delamination event at this Nanotrasen facility.") + switch (last_delam) + if(0) + . += span_info("In case you didn't notice.
") + if(1) + . += span_info("Let's do better today.
") + if(2 to 5) + . += span_info("There's room for improvement.
") + if(6 to 10) + . += span_info("Good work!
") + if(69) + . += span_info("Nice.
") + else + . += span_info("Incredible!
") + + if(sign_features & DISPLAY_TRAM) + . += span_info("The station has had [hit_count] tram incident\s this shift.") + switch (hit_count) + if(0) + . += span_info("Fantastic! Champions of safety.
") + if(1) + . += span_info("Let's do better tomorrow.
") + if(2 to 5) + . += span_info("There's room for improvement.
") + if(6 to 10) + . += span_info("Good work! Nanotrasen's finest!
") + if(69) + . += span_info("Nice.
") + else + . += span_info("Incredible! You're probably reading this from medbay.
") + +#undef DISPLAY_DELAM +#undef DISPLAY_TRAM + +#undef NAME_DUAL +#undef NAME_DELAM +#undef NAME_TRAM + +#undef DESC_DUAL +#undef DESC_DELAM +#undef DESC_TRAM + +#undef TREND_RISING +#undef TREND_FALLING diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index e95a5a66e1e29..7c73d2b6f6567 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -61,17 +61,13 @@ interaction_flags_machine |= INTERACT_MACHINE_OFFLINE register_context() update_appearance(UPDATE_ICON) + AddElement(/datum/element/noisy_movement) /obj/machinery/iv_drip/Destroy() attached = null QDEL_NULL(reagent_container) return ..() -/obj/machinery/iv_drip/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - . = ..() - if(has_gravity()) - playsound(src, 'sound/effects/roll.ogg', 100, TRUE) - /obj/machinery/iv_drip/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) @@ -247,12 +243,12 @@ if(!(get_dist(src, attached) <= 1 && isturf(attached.loc))) if(isliving(attached)) - var/mob/living/attached_mob = attached + var/mob/living/carbon/attached_mob = attached to_chat(attached, span_userdanger("The IV drip needle is ripped out of you, leaving an open bleeding wound!")) var/list/arm_zones = shuffle(list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM)) var/obj/item/bodypart/chosen_limb = attached_mob.get_bodypart(arm_zones[1]) || attached_mob.get_bodypart(arm_zones[2]) || attached_mob.get_bodypart(BODY_ZONE_CHEST) chosen_limb.receive_damage(3) - chosen_limb.force_wound_upwards(/datum/wound/pierce/moderate, wound_source = "IV needle") + attached_mob.cause_wound_of_type_and_severity(WOUND_PIERCE, chosen_limb, WOUND_SEVERITY_MODERATE, wound_source = "IV needle") else visible_message(span_warning("[attached] is detached from [src].")) detach_iv() @@ -447,6 +443,9 @@ default_unfasten_wrench(user, tool) return TOOL_ACT_TOOLTYPE_SUCCESS +/obj/machinery/iv_drip/plumbing/deconstruct(disassembled = TRUE) + qdel(src) + /atom/movable/screen/alert/iv_connected name = "IV Connected" desc = "You have an IV connected to your arm. Remember to remove it or drag the IV stand with you before moving, or else it will rip out!" @@ -461,3 +460,5 @@ #undef IV_TRANSFER_RATE_STEP #undef ALERT_IV_CONNECTED + +#undef DEFAULT_IV_TRANSFER_RATE diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index c1d87cc26059a..5400cccf2f2e9 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -3,7 +3,7 @@ /obj/machinery/launchpad name = "bluespace launchpad" desc = "A bluespace pad able to thrust matter through bluespace, teleporting it to or from nearby locations." - icon = 'icons/obj/telescience.dmi' + icon = 'icons/obj/machines/telepad.dmi' icon_state = "lpad-idle" active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2.5 hud_possible = list(DIAG_LAUNCHPAD_HUD) @@ -77,8 +77,8 @@ if(!multitool_check_buffer(user, I)) return var/obj/item/multitool/M = I - M.buffer = src - to_chat(user, span_notice("You save the data in the [I.name]'s buffer.")) + M.set_buffer(src) + balloon_alert(user, "saved to multitool buffer") return 1 if(default_deconstruction_crowbar(I)) @@ -349,7 +349,7 @@ /obj/item/launchpad_remote name = "folder" desc = "A folder." - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "folder" w_class = WEIGHT_CLASS_SMALL var/sending = TRUE diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 1d1d58104cede..54c098de9fd38 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -1,7 +1,7 @@ /// The light switch. Can have multiple per area. /obj/machinery/light_switch name = "light switch" - icon = 'icons/obj/power.dmi' + icon = 'icons/obj/machines/wallmounts.dmi' icon_state = "light-nopower" base_icon_state = "light" desc = "Make dark." @@ -31,6 +31,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light_switch, 26) area = get_area(src) if(!name) name = "light switch ([area.name])" + find_and_hang_on_wall(custom_drop_callback = CALLBACK(src, PROC_REF(deconstruct), TRUE)) update_appearance() @@ -93,7 +94,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light_switch, 26) /obj/item/wallframe/light_switch name = "light switch" desc = "An unmounted light switch. Attach it to a wall to use." - icon = 'icons/obj/power.dmi' + icon = 'icons/obj/machines/wallmounts.dmi' icon_state = "light-nopower" result_path = /obj/machinery/light_switch pixel_shift = 26 diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index 6f9332cca958d..75976f98be37e 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -34,12 +34,14 @@ AddComponent(/datum/component/plumbing/simple_demand) /// Emagging a limbgrower allows you to build synthetic armblades. -/obj/machinery/limbgrower/emag_act(mob/user) - if(obj_flags & EMAGGED) - return +/obj/machinery/limbgrower/emag_act(mob/user, obj/item/card/emag/emag_card) . = ..() + if(obj_flags & EMAGGED) + return FALSE obj_flags |= EMAGGED update_static_data(user) + balloon_alert(user, "illegal limb production enabled") + return TRUE /obj/machinery/limbgrower/ui_interact(mob/user, datum/tgui/ui) . = ..() @@ -78,9 +80,9 @@ var/list/available_nodes = stored_research.researched_designs.Copy() if(imported_designs.len) - available_nodes += imported_designs + available_nodes |= imported_designs if(obj_flags & EMAGGED) - available_nodes += stored_research.hacked_designs + available_nodes |= stored_research.hacked_designs for(var/design_id in available_nodes) var/datum/design/limb_design = SSresearch.techweb_design_by_id(design_id) @@ -185,7 +187,10 @@ use_power(power) flick("limbgrower_fill", src) icon_state = "limbgrower_idleon" - selected_category = params["active_tab"] + var/temp_category = params["active_tab"] + if( ! (temp_category in categories) ) + return FALSE //seriously come on + selected_category = temp_category addtimer(CALLBACK(src, PROC_REF(build_item), consumed_reagents_list), production_speed * production_coefficient) return TRUE @@ -286,4 +291,4 @@ for(var/id in SSresearch.techweb_designs) var/datum/design/found_design = SSresearch.techweb_design_by_id(id) if((found_design.build_type & LIMBGROWER) && !(RND_CATEGORY_HACKED in found_design.category)) - imported_designs += found_design.id + imported_designs |= found_design.id diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm index 9c65fceb11cb8..e3922415a66cf 100644 --- a/code/game/machinery/mass_driver.dm +++ b/code/game/machinery/mass_driver.dm @@ -1,12 +1,22 @@ /obj/machinery/mass_driver name = "mass driver" desc = "The finest in spring-loaded piston toy technology, now on a space station near you." - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/machines/floor.dmi' icon_state = "mass_driver" + circuit = /obj/item/circuitboard/machine/mass_driver var/power = 1 var/code = 1 var/id = 1 - var/drive_range = 50 //this is mostly irrelevant since current mass drivers throw into space, but you could make a lower-range mass driver for interstation transport or something I guess. + var/drive_range = 10 + var/power_per_obj = 1000 + +/obj/machinery/mass_driver/Initialize(mapload) + . = ..() + wires = new /datum/wires/mass_driver(src) + +/obj/machinery/mass_driver/Destroy() + QDEL_NULL(wires) + . = ..() /obj/machinery/mass_driver/chapelgun name = "holy driver" @@ -22,7 +32,7 @@ id = MASSDRIVER_SHACK /obj/machinery/mass_driver/Destroy() - for(var/obj/machinery/computer/pod/control in GLOB.machines) + for(var/obj/machinery/computer/pod/control as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/computer/pod)) if(control.id == id) control.connected = null return ..() @@ -31,9 +41,9 @@ id = "[port.shuttle_id]_[id]" /obj/machinery/mass_driver/proc/drive(amount) - if(machine_stat & (BROKEN|NOPOWER)) + if(machine_stat & (BROKEN|NOPOWER) || panel_open) return - use_power(active_power_usage) + use_power(power_per_obj) var/O_limit var/atom/target = get_edge_target_turf(src, dir) for(var/atom/movable/O in loc) @@ -44,14 +54,33 @@ if(O_limit >= 20) audible_message(span_notice("[src] lets out a screech, it doesn't seem to be able to handle the load.")) break - use_power(active_power_usage) + use_power(power_per_obj) O.throw_at(target, drive_range * power, power) flick("mass_driver1", src) +/obj/machinery/mass_driver/attackby(obj/item/I, mob/living/user, params) + + if(is_wire_tool(I) && panel_open) + wires.interact(user) + return + if(default_deconstruction_screwdriver(user, "mass_driver_o", "mass_driver", I)) + return + if(default_change_direction_wrench(user, I)) + return + if(default_deconstruction_crowbar(I)) + return + + return ..() + +/obj/machinery/mass_driver/RefreshParts() + . = ..() + for(var/datum/stock_part/servo/new_servo in component_parts) + drive_range += new_servo.tier * 10 + /obj/machinery/mass_driver/emp_act(severity) . = ..() if (. & EMP_PROTECT_SELF) return - if(machine_stat & (BROKEN|NOPOWER)) + if(machine_stat & (BROKEN|NOPOWER) || panel_open) return drive() diff --git a/code/game/machinery/mechlaunchpad.dm b/code/game/machinery/mechlaunchpad.dm index 3061372dd8714..254467fc2171e 100644 --- a/code/game/machinery/mechlaunchpad.dm +++ b/code/game/machinery/mechlaunchpad.dm @@ -1,7 +1,7 @@ /obj/machinery/mechpad name = "orbital mech pad" desc = "A slab of heavy plating designed to withstand orbital-drop impacts. Through some sort of advanced bluespace tech, this one seems able to send and receive Mechs. Requires linking to a console to function." - icon = 'icons/obj/telescience.dmi' + icon = 'icons/obj/machines/telepad.dmi' icon_state = "mechpad" circuit = /obj/item/circuitboard/machine/mechpad ///ID of the console, used for linking up @@ -14,11 +14,6 @@ /obj/machinery/mechpad/Initialize(mapload) . = ..() display_name = "Orbital Pad - [get_area_name(src)]" - GLOB.mechpad_list += src - -/obj/machinery/mechpad/Destroy() - GLOB.mechpad_list -= src - return ..() /obj/machinery/mechpad/examine(mob/user) . = ..() @@ -41,8 +36,8 @@ if(!multitool_check_buffer(user, tool)) return var/obj/item/multitool/multitool = tool - multitool.buffer = src - to_chat(user, span_notice("You save the data in the [multitool.name]'s buffer.")) + multitool.set_buffer(src) + balloon_alert(user, "saved to multitool buffer") return TRUE /obj/machinery/mechpad/wirecutter_act(mob/living/user, obj/item/tool) diff --git a/code/game/machinery/medical_kiosk.dm b/code/game/machinery/medical_kiosk.dm index 1909371386f05..bf6e87c5b6239 100644 --- a/code/game/machinery/medical_kiosk.dm +++ b/code/game/machinery/medical_kiosk.dm @@ -43,8 +43,30 @@ /obj/machinery/medical_kiosk/Initialize(mapload) //loaded subtype for mapping use . = ..() AddComponent(/datum/component/payment, active_price, SSeconomy.get_dep_account(ACCOUNT_MED), PAYMENT_FRIENDLY) + register_context() scanner_wand = new/obj/item/scanner_wand(src) +/obj/machinery/medical_kiosk/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + var/screentip_change = FALSE + + if(!held_item && scanner_wand) + context[SCREENTIP_CONTEXT_RMB] = "Pick up scanner wand" + return screentip_change = TRUE + + if(istype(held_item) && held_item.tool_behaviour == TOOL_WRENCH) + context[SCREENTIP_CONTEXT_LMB] = anchored ? "Unsecure" : "Secure" + return screentip_change = TRUE + if(istype(held_item) && held_item.tool_behaviour == TOOL_CROWBAR && panel_open) + context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" + return screentip_change = TRUE + if(istype(held_item) && held_item.tool_behaviour == TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_LMB] = panel_open ? "Close panel" : "Open panel" + return screentip_change = TRUE + if(istype(held_item, /obj/item/scanner_wand)) + context[SCREENTIP_CONTEXT_LMB] = "Return the scanner wand" + return screentip_change = TRUE + /obj/machinery/medical_kiosk/proc/inuse() //Verifies that the user can use the interface, followed by showing medical information. var/mob/living/carbon/human/paying = paying_ref?.resolve() if(!paying) @@ -104,13 +126,13 @@ if(istype(O, /obj/item/scanner_wand)) var/obj/item/scanner_wand/W = O if(scanner_wand) - to_chat(user, span_warning("There's already a scanner wand in [src]!")) + balloon_alert(user, "already has a wand!") return if(HAS_TRAIT(O, TRAIT_NODROP) || !user.transferItemToLoc(O, src)) - to_chat(user, span_warning("[O] is stuck to your hand!")) + balloon_alert(user, "stuck to your hand!") return - user.visible_message(span_notice("[user] snaps [O] onto [src]!"), \ - span_notice("You press [O] into the side of [src], clicking into place.")) + user.visible_message(span_notice("[user] snaps [O] onto [src]!")) + balloon_alert(user, "wand returned") //This will be the scanner returning scanner_wand's selected_target variable and assigning it to the altPatient var if(W.selected_target) var/datum/weakref/target_ref = WEAKREF(W.return_patient()) @@ -124,43 +146,49 @@ return return ..() -/obj/machinery/medical_kiosk/AltClick(mob/living/carbon/user) - if(!istype(user) || !user.can_perform_action(src)) - return +/obj/machinery/medical_kiosk/attack_hand_secondary(mob/user, list/modifiers) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(!ishuman(user) || !user.can_perform_action(src)) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN if(!scanner_wand) - to_chat(user, span_warning("The scanner wand is currently removed from the machine.")) - return + balloon_alert(user, "no scanner wand!") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN if(!user.put_in_hands(scanner_wand)) - to_chat(user, span_warning("The scanner wand falls to the floor.")) + balloon_alert(user, "scanner wand falls!") scanner_wand = null - return - user.visible_message(span_notice("[user] unhooks the [scanner_wand] from [src]."), \ - span_notice("You detach the [scanner_wand] from [src].")) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + user.visible_message(span_notice("[user] unhooks the [scanner_wand] from [src].")) + balloon_alert(user, "scanner pulled") playsound(src, 'sound/machines/click.ogg', 60, TRUE) scanner_wand = null + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /obj/machinery/medical_kiosk/Destroy() qdel(scanner_wand) return ..() -/obj/machinery/medical_kiosk/emag_act(mob/user) - ..() +/obj/machinery/medical_kiosk/emag_act(mob/user, obj/item/card/emag/emag_card) + . = ..() if(obj_flags & EMAGGED) return if(user) - user.visible_message(span_warning("[user] waves a suspicious card by the [src]'s biometric scanner!"), - span_notice("You overload the sensory electronics, the diagnostic readouts start jittering across the screen..")) + if (emag_card) + user.visible_message(span_warning("[user] waves a suspicious card by the [src]'s biometric scanner!")) + balloon_alert(user, "sensors overloaded") obj_flags |= EMAGGED var/obj/item/circuitboard/computer/cargo/board = circuit board.obj_flags |= EMAGGED //Mirrors emag status onto the board as well. pandemonium = TRUE + return TRUE /obj/machinery/medical_kiosk/examine(mob/user) . = ..() if(scanner_wand == null) . += span_notice("\The [src] is missing its scanner.") else - . += span_notice("\The [src] has its scanner clipped to the side. Alt-Click to remove.") + . += span_notice("\The [src] has its scanner clipped to the side. Right Click to remove.") /obj/machinery/medical_kiosk/ui_interact(mob/user, datum/tgui/ui) var/patient_distance = 0 diff --git a/code/game/machinery/medipen_refiller.dm b/code/game/machinery/medipen_refiller.dm index b5c97554865c0..8f17ad3faba81 100644 --- a/code/game/machinery/medipen_refiller.dm +++ b/code/game/machinery/medipen_refiller.dm @@ -57,9 +57,9 @@ if(!length(reagent_container.reagents.reagent_list)) balloon_alert(user, "nothing to transfer!") return - var/units = reagent_container.reagents.trans_to(src, reagent_container.amount_per_transfer_from_this, transfered_by = user) + var/units = reagent_container.reagents.trans_to(src, reagent_container.amount_per_transfer_from_this, transferred_by = user) if(units) - balloon_alert(user, "[units] units transfered") + balloon_alert(user, "[units] units transferred") else balloon_alert(user, "reagent storage full!") return diff --git a/code/game/machinery/mining_weather_monitor.dm b/code/game/machinery/mining_weather_monitor.dm new file mode 100644 index 0000000000000..d05d8820751a6 --- /dev/null +++ b/code/game/machinery/mining_weather_monitor.dm @@ -0,0 +1,26 @@ +/// Wall mounted mining weather tracker +/obj/machinery/mining_weather_monitor + name = "barometric monitor" + desc = "A machine monitoring atmospheric data from mining environments. Provides warnings about incoming weather fronts." + icon = 'icons/obj/miningradio.dmi' + icon_state = "wallmount" + luminosity = 1 + light_power = 1 + light_range = 1.6 + +/obj/machinery/mining_weather_monitor/Initialize(mapload, ndir, nbuild) + . = ..() + AddComponent( \ + /datum/component/weather_announcer, \ + state_normal = "wallgreen", \ + state_warning = "wallyellow", \ + state_danger = "wallred", \ + ) + +/obj/machinery/mining_weather_monitor/update_overlays() + . = ..() + if((machine_stat & BROKEN) || !powered()) + return + . += emissive_appearance(icon, "emissive", src) + +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/mining_weather_monitor, 28) diff --git a/code/game/machinery/modular_shield.dm b/code/game/machinery/modular_shield.dm index 2d018fdab8298..3f08760166aec 100644 --- a/code/game/machinery/modular_shield.dm +++ b/code/game/machinery/modular_shield.dm @@ -99,7 +99,7 @@ /obj/machinery/modular_shield_generator/Initialize(mapload) . = ..() - wires = new /datum/wires/modular_shield_generator(src) + set_wires(new /datum/wires/modular_shield_generator(src)) if(mapload && active && anchored) activate_shields() @@ -380,7 +380,7 @@ name = "Modular Shield Debugger" //Filler name and sprite for testing desc = "This is filler for testing you shouldn`t see this." - icon = 'icons/mecha/mech_bay.dmi' + icon = 'icons/obj/machines/mech_bay.dmi' icon_state = "recharge_port" density = TRUE diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index bc7ff6efa6ef6..5caa41d908905 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -3,7 +3,7 @@ /obj/machinery/navbeacon - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/machines/floor.dmi' icon_state = "navbeacon0" name = "navigation beacon" desc = "A radio beacon used for bot navigation." diff --git a/code/game/machinery/nebula_shielding.dm b/code/game/machinery/nebula_shielding.dm new file mode 100644 index 0000000000000..cd10a23150c87 --- /dev/null +++ b/code/game/machinery/nebula_shielding.dm @@ -0,0 +1,154 @@ +///Machinery that block nebulas. This type is for convenience, you can set nebula shielding on other objects as well using add_to_nebula_shielding() +/obj/machinery/nebula_shielding + density = TRUE + + icon = 'icons/obj/machines/nebula_shielding.dmi' + pixel_x = -16 + + layer = FLY_LAYER + plane = ABOVE_GAME_PLANE + + ///Strength of the shield we apply + var/shielding_strength + ///The type of nebula that we shield against + var/nebula_type + ///How much power we use every time we block the nebula's effects + var/power_use_per_block = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 + ///State we use when actively blocking a nebula + var/active_icon_state + /// State for when we're broken and wont work anymore. Make sure to also set integrity_failure for this to work + var/broken_icon_state + +/obj/machinery/nebula_shielding/Initialize(mapload) + . = ..() + + add_to_nebula_shielding(src, nebula_type, PROC_REF(get_nebula_shielding)) + +///Nebula is asking us how strong we are. Return our shield strength is all is well +/obj/machinery/nebula_shielding/proc/get_nebula_shielding() + if(panel_open || (machine_stat & BROKEN)) + return + if(!powered()) + update_appearance(UPDATE_ICON_STATE) + return + + use_power_from_net(power_use_per_block) + generate_reward() + + update_appearance(UPDATE_ICON_STATE) + + return shielding_strength + +///Generate a resource for defending against the nebula +/obj/machinery/nebula_shielding/proc/generate_reward() + return + +/obj/machinery/nebula_shielding/update_icon_state() + . = ..() + + if((machine_stat & BROKEN) && broken_icon_state) + icon_state = broken_icon_state + else if(!powered()) + icon_state = initial(icon_state) + else + icon_state = active_icon_state + +///Short-lived nebula shielding sent by centcom in-case there hasn't been shielding for a while +/obj/machinery/nebula_shielding/emergency + density = TRUE + anchored = FALSE //so some handsome rogue could potentially move it off the station z-level + shielding_strength = 999 //should block the nebula completely + + ///How long we work untill we self-destruct + var/detonate_in = 10 MINUTES + +/obj/machinery/nebula_shielding/emergency/Initialize(mapload) + . = ..() + + addtimer(CALLBACK(src, PROC_REF(self_destruct)), detonate_in) + +///We don't live for very long, so self-destruct +/obj/machinery/nebula_shielding/emergency/proc/self_destruct() + explosion(src, light_impact_range = 5, flame_range = 3, explosion_cause = src) + qdel(src) + +/obj/machinery/nebula_shielding/emergency/examine(mob/user) + . = ..() + + . += span_notice("[p_They()] will block the nebula for [round(detonate_in / (1 MINUTES))] minute\s with a shield strength of [shielding_strength].") + +/obj/machinery/nebula_shielding/emergency/get_nebula_shielding() + return shielding_strength //no strings attached, we will always produce shielding + +/obj/machinery/nebula_shielding/emergency/generate_reward() + return //no reward for you + +///We shield against the radioactive nebula and passively generate tritium +/obj/machinery/nebula_shielding/radiation + name = "radioactive nebula shielder" + desc = "Generates a field around the station, protecting it from a radioactive nebula." + + icon_state = "radioactive_shielding" + active_icon_state = "radioactive_shielding_on" + broken_icon_state = "radioactive_shielding_broken" + + circuit = /obj/item/circuitboard/machine/radioactive_nebula_shielding + + nebula_type = /datum/station_trait/nebula/hostile/radiation + shielding_strength = 4 + + integrity_failure = 0.4 + +/obj/machinery/nebula_shielding/radiation/examine(mob/user) + . = ..() + + . += span_notice("Passively generates tritium. Provides [shielding_strength] levels of nebula shielding when active.") + +/obj/machinery/nebula_shielding/radiation/generate_reward() + var/turf/open/turf = get_turf(src) + if(isopenturf(turf)) + turf.atmos_spawn_air("[GAS_TRITIUM]=1;[TURF_TEMPERATURE(T20C)]") + +/obj/machinery/nebula_shielding/radiation/attackby(obj/item/item, mob/user, params) + if(default_deconstruction_screwdriver(user, initial(icon_state) + "_open", initial(icon_state), item)) + return + + if(default_deconstruction_crowbar(item)) + return + + return ..() + +///Emergency shielding so people aren't permanently in a radstorm if shit goes very wrong in engineering +/obj/machinery/nebula_shielding/emergency/radiation + name = "emergency nebula radiation shielder" + desc = "Generates a field around the station to protect it from a radioactive nebula." + + icon = 'icons/obj/machines/engine/other.dmi' + icon_state = "portgen1_1" + pixel_x = 0 + + nebula_type = /datum/station_trait/nebula/hostile/radiation + +/obj/machinery/nebula_shielding/emergency/radiation/self_destruct() + var/turf/open/turf = get_turf(src) + if(isopenturf(turf)) + turf.atmos_spawn_air("[GAS_TRITIUM]=50;[TURF_TEMPERATURE(T20C)]") //causes a small tritium fire when combined with the explosion + + ..() + +/// Small explanation for engineering on how to set-up the radioactive nebula shielding +/obj/item/paper/fluff/radiation_nebula + name = "radioactive nebula shielding" + default_raw_text = {"EXTREME IMPORTANCE!!!!
+ Set up these radioactive nebula shielding units before the gravity generators native shielding is overwhelmed!
+ Shielding units passively generate tritium, so make sure to properly ventilate/isolate the area before setting up a shielding unit! + More circuit boards can be ordered through cargo. Consider setting up auxillary shielding units in-case of destruction, power loss or sabotage. + "} + +/// Warns the viro that they can't use radioactive resonance +/obj/item/paper/fluff/radiation_nebula_virologist + name = "radioactive resonance" + default_raw_text = {"EXTREME IMPORTANCE!!!!
+ During routine bloodscreening on employees working in the nebula, we found no traces of the sympton called 'Radioactive Resonance'.
+ Something inside the nebula is interfering with it, be wary of a more shallow viral genepool. + "} diff --git a/code/game/machinery/newscaster/newscaster_machine.dm b/code/game/machinery/newscaster/newscaster_machine.dm index 545b5c719f649..1ae08c066f043 100644 --- a/code/game/machinery/newscaster/newscaster_machine.dm +++ b/code/game/machinery/newscaster/newscaster_machine.dm @@ -3,7 +3,7 @@ /obj/machinery/newscaster name = "newscaster" desc = "A standard Nanotrasen-licensed newsfeed handler for use in commercial space stations. All the news you absolutely have no use for, in one place!" - icon = 'icons/obj/terminals.dmi' + icon = 'icons/obj/machines/wallmounts.dmi' icon_state = "newscaster_off" base_icon_state = "newscaster" verb_say = "beeps" @@ -73,6 +73,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) GLOB.allCasters += src GLOB.allbountyboards += src update_appearance() + find_and_hang_on_wall() /obj/machinery/newscaster/Destroy() GLOB.allCasters -= src @@ -494,7 +495,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) if(!(machine_stat & BROKEN)) to_chat(user, span_notice("[src] does not need repairs.")) return - if(!tool.tool_start_check(user, amount=0)) + if(!tool.tool_start_check(user, amount=1)) return user.balloon_alert_to_viewers("started welding...", "started repairing...") audible_message(span_hear("You hear welding.")) @@ -578,7 +579,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) targetcam = R.aicamera else if(ispAI(user)) var/mob/living/silicon/pai/R = user - targetcam = R.camera + if(R.aicamera) + targetcam = R.aicamera else if(iscyborg(user)) var/mob/living/silicon/robot/R = user if(R.connected_ai) @@ -810,7 +812,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) /obj/item/wallframe/newscaster name = "newscaster frame" desc = "Used to build newscasters, just secure to the wall." - icon_state = "newscaster" + icon_state = "newscaster_assembly" custom_materials = list(/datum/material/iron= SHEET_MATERIAL_AMOUNT * 7, /datum/material/glass= SHEET_MATERIAL_AMOUNT * 4) result_path = /obj/machinery/newscaster pixel_shift = 30 diff --git a/code/game/machinery/newscaster/newspaper.dm b/code/game/machinery/newscaster/newspaper.dm index ffe1d2f9bafff..d605d6257c304 100644 --- a/code/game/machinery/newscaster/newspaper.dm +++ b/code/game/machinery/newscaster/newspaper.dm @@ -1,7 +1,7 @@ /obj/item/newspaper name = "newspaper" desc = "An issue of The Griffon, the newspaper circulating aboard Nanotrasen Space Stations." - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "newspaper" inhand_icon_state = "newspaper" lefthand_file = 'icons/mob/inhands/items/books_lefthand.dmi' @@ -28,7 +28,7 @@ var/mob/living/carbon/human/H = user var/obj/W = new /obj/item/reagent_containers/cup/glass/bottle/whiskey(H.loc) playsound(H.loc, 'sound/items/drink.ogg', rand(10,50), TRUE) - W.reagents.trans_to(H, W.reagents.total_volume, transfered_by = user) + W.reagents.trans_to(H, W.reagents.total_volume, transferred_by = user) user.visible_message(span_suicide("[user] downs the contents of [W.name] in one gulp! Shoulda stuck to sudoku!")) return TOXLOSS diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 3f4d1a90089dc..fc646a3483e24 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -14,7 +14,7 @@ Buildable meters var/pipename force = 7 throwforce = 7 - icon = 'icons/obj/atmospherics/pipes/pipe_item.dmi' + icon = 'icons/obj/pipes_n_cables/pipe_item.dmi' icon_state = "simple" icon_state_preview = "manifold4w" inhand_icon_state = "buildpipe" @@ -154,7 +154,7 @@ Buildable meters do_a_flip() /obj/item/pipe/proc/do_a_flip() - setDir(turn(dir, -180)) + setDir(REVERSE_DIR(dir)) /obj/item/pipe/trinary/flippable/do_a_flip() setDir(turn(dir, flipped ? 45 : -45)) @@ -338,7 +338,7 @@ Buildable meters if(iscarbon(user)) var/mob/living/carbon/C = user for(var/i in 1 to 20) - C.vomit(0, TRUE, FALSE, 4, FALSE) + C.vomit(vomit_flags = (MOB_VOMIT_BLOOD | MOB_VOMIT_HARM), lost_nutrition = 0, distance = 4) if(prob(20)) C.spew_organ() sleep(0.5 SECONDS) @@ -377,7 +377,7 @@ Buildable meters /obj/item/pipe_meter name = "meter" desc = "A meter that can be wrenched on pipes, or attached to the floor with screws." - icon = 'icons/obj/atmospherics/pipes/pipe_item.dmi' + icon = 'icons/obj/pipes_n_cables/pipe_item.dmi' icon_state = "meter" inhand_icon_state = "buildpipe" w_class = WEIGHT_CLASS_BULKY diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 6d4a2c58b5fba..d65f33e95878c 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -4,7 +4,7 @@ /obj/machinery/pipedispenser name = "pipe dispenser" - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/machines/lathes.dmi' icon_state = "pipe_d" desc = "Dispenses countless types of pipes. Very useful if you need pipes." density = TRUE @@ -177,7 +177,7 @@ /obj/machinery/pipedispenser/disposal name = "disposal pipe dispenser" - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/machines/lathes.dmi' icon_state = "pipe_d" desc = "Dispenses pipes that will ultimately be used to move trash around." density = TRUE @@ -205,7 +205,7 @@ //inherit disposal for the dragging proc /obj/machinery/pipedispenser/disposal/transit_tube name = "transit tube dispenser" - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/machines/lathes.dmi' icon_state = "pipe_d" density = TRUE desc = "Dispenses pipes that will move beings around." diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index d474998081bb7..701d62223695a 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -350,15 +350,15 @@ DEFINE_BITFIELD(turret_flags, list( if(!multitool_check_buffer(user, I)) return var/obj/item/multitool/M = I - M.buffer = src - to_chat(user, span_notice("You add [src] to multitool buffer.")) + M.set_buffer(src) + balloon_alert(user, "saved to multitool buffer") else return ..() -/obj/machinery/porta_turret/emag_act(mob/user) +/obj/machinery/porta_turret/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return - to_chat(user, span_warning("You short out [src]'s threat assessment circuits.")) + return FALSE + balloon_alert(user, "threat assessment circuits shorted") audible_message(span_hear("[src] hums oddly...")) obj_flags |= EMAGGED controllock = TRUE @@ -367,6 +367,7 @@ DEFINE_BITFIELD(turret_flags, list( //6 seconds for the traitor to gtfo of the area before the turret decides to ruin his shit addtimer(CALLBACK(src, PROC_REF(toggle_on), TRUE), 6 SECONDS) //turns it back on. The cover popUp() popDown() are automatically called in process(), no need to define it here + return TRUE /obj/machinery/porta_turret/emp_act(severity) . = ..() @@ -387,7 +388,7 @@ DEFINE_BITFIELD(turret_flags, list( addtimer(CALLBACK(src, PROC_REF(toggle_on), TRUE), rand(60,600)) -/obj/machinery/porta_turret/take_damage(damage, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) +/obj/machinery/porta_turret/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armour_penetration = 0) . = ..() if(. && atom_integrity > 0) //damage received if(prob(30)) @@ -785,6 +786,14 @@ DEFINE_BITFIELD(turret_flags, list( stun_projectile = /obj/projectile/bullet/syndicate_turret lethal_projectile = /obj/projectile/bullet/syndicate_turret +/obj/machinery/porta_turret/syndicate/irs + lethal_projectile = /obj/projectile/bullet/c10mm/ap + lethal_projectile_sound = 'sound/weapons/gun/smg/shot.ogg' + stun_projectile = /obj/projectile/bullet/c10mm/ap + stun_projectile_sound = 'sound/weapons/gun/smg/shot.ogg' + armor_type = /datum/armor/syndicate_turret + faction = list(FACTION_PIRATE) + /obj/machinery/porta_turret/syndicate/shuttle scan_range = 9 shot_delay = 3 @@ -910,6 +919,7 @@ DEFINE_BITFIELD(turret_flags, list( if(built) locked = FALSE power_change() //Checks power and initial settings + find_and_hang_on_wall() /obj/machinery/turretid/Destroy() turrets.Cut() @@ -966,12 +976,13 @@ DEFINE_BITFIELD(turret_flags, list( else to_chat(user, span_alert("Access denied.")) -/obj/machinery/turretid/emag_act(mob/user) +/obj/machinery/turretid/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return - to_chat(user, span_notice("You short out the turret controls' access analysis module.")) + return FALSE + balloon_alert(user, "access analysis module shorted") obj_flags |= EMAGGED locked = FALSE + return TRUE /obj/machinery/turretid/attack_ai(mob/user) if(!ailock || isAdminGhostAI(user)) @@ -1020,20 +1031,29 @@ DEFINE_BITFIELD(turret_flags, list( /obj/machinery/turretid/proc/toggle_lethal(mob/user) lethal = !lethal - add_hiddenprint(user) - log_combat(user, src, "[lethal ? "enabled" : "disabled"] lethals on") + if (user) + var/enabled_or_disabled = lethal ? "disabled" : "enabled" + balloon_alert(user, "safeties [enabled_or_disabled]") + add_hiddenprint(user) + log_combat(user, src, "[enabled_or_disabled] lethals on") updateTurrets() /obj/machinery/turretid/proc/toggle_on(mob/user) enabled = !enabled - add_hiddenprint(user) - log_combat(user, src, "[enabled ? "enabled" : "disabled"]") + if (user) + var/enabled_or_disabled = enabled ? "enabled" : "disabled" + balloon_alert(user, "[enabled_or_disabled]") + add_hiddenprint(user) + log_combat(user, src, "[enabled ? "enabled" : "disabled"]") updateTurrets() /obj/machinery/turretid/proc/shoot_silicons(mob/user) shoot_cyborgs = !shoot_cyborgs - add_hiddenprint(user) - log_combat(user, src, "[shoot_cyborgs ? "Shooting Borgs" : "Not Shooting Borgs"]") + if (user) + var/status = shoot_cyborgs ? "Shooting Borgs" : "Not Shooting Borgs" + balloon_alert(user, lowertext(status)) + add_hiddenprint(user) + log_combat(user, src, "[status]") updateTurrets() /obj/machinery/turretid/proc/updateTurrets() @@ -1090,7 +1110,7 @@ DEFINE_BITFIELD(turret_flags, list( /obj/item/gun/ballistic/get_turret_properties() . = ..() - var/obj/item/ammo_box/mag = mag_type + var/obj/item/ammo_box/mag = spawn_magazine_type var/obj/item/ammo_casing/primary_ammo = initial(mag.ammo_type) .["base_icon_state"] = "syndie" diff --git a/code/game/machinery/porta_turret/portable_turret_cover.dm b/code/game/machinery/porta_turret/portable_turret_cover.dm index d6c7eba6dc405..86b1df20e7fea 100644 --- a/code/game/machinery/porta_turret/portable_turret_cover.dm +++ b/code/game/machinery/porta_turret/portable_turret_cover.dm @@ -65,8 +65,8 @@ if(!multitool_check_buffer(user, I)) return var/obj/item/multitool/M = I - M.buffer = parent_turret - to_chat(user, span_notice("You add [parent_turret] to multitool buffer.")) + M.set_buffer(parent_turret) + balloon_alert(user, "saved to multitool buffer") return return ..() @@ -85,10 +85,14 @@ /obj/machinery/porta_turret_cover/can_be_overridden() . = 0 -/obj/machinery/porta_turret_cover/emag_act(mob/user) - if(!(parent_turret.obj_flags & EMAGGED)) - to_chat(user, span_notice("You short out [parent_turret]'s threat assessment circuits.")) - audible_message(span_hear("[parent_turret] hums oddly...")) - parent_turret.obj_flags |= EMAGGED - parent_turret.on = FALSE - addtimer(VARSET_CALLBACK(parent_turret, on, TRUE), 4 SECONDS) +/obj/machinery/porta_turret_cover/emag_act(mob/user, obj/item/card/emag/emag_card) + + if((parent_turret.obj_flags & EMAGGED)) + return FALSE + + balloon_alert(user, "threat assessment circuits shorted") + audible_message(span_hear("[parent_turret] hums oddly...")) + parent_turret.obj_flags |= EMAGGED + parent_turret.on = FALSE + addtimer(VARSET_CALLBACK(parent_turret, on, TRUE), 4 SECONDS) + return TRUE diff --git a/code/game/machinery/prisongate.dm b/code/game/machinery/prisongate.dm index 0b7529cbb79ed..b05b6dd90c4a1 100644 --- a/code/game/machinery/prisongate.dm +++ b/code/game/machinery/prisongate.dm @@ -3,7 +3,7 @@ /obj/machinery/prisongate name = "prison gate scanner" desc = "A hardlight gate with an ID scanner attached to the side. Good at deterring even the most persistent temporarily embarrassed employee." - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/machines/sec.dmi' icon_state = "prisongate_on" /// roughly the same health/armor as an airlock max_integrity = 450 diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm index 4fdf26e281737..53730ffd57954 100644 --- a/code/game/machinery/quantum_pad.dm +++ b/code/game/machinery/quantum_pad.dm @@ -1,7 +1,7 @@ /obj/machinery/quantumpad name = "quantum pad" desc = "A bluespace quantum-linked telepad used for teleporting objects to other quantum pads." - icon = 'icons/obj/telescience.dmi' + icon = 'icons/obj/machines/telepad.dmi' icon_state = "qpad-idle" active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 10 obj_flags = CAN_BE_HIT | UNIQUE_RENAME @@ -62,7 +62,8 @@ if(!multitool_check_buffer(user, I)) return var/obj/item/multitool/M = I - M.buffer = src + M.set_buffer(src) + balloon_alert(user, "saved to multitool buffer") to_chat(user, span_notice("You save the data in [I]'s buffer. It can now be saved to pads with closed panels.")) return TRUE else if(I.tool_behaviour == TOOL_MULTITOOL) @@ -71,14 +72,14 @@ var/obj/item/multitool/M = I if(istype(M.buffer, /obj/machinery/quantumpad)) if(M.buffer == src) - to_chat(user, span_warning("You cannot link a pad to itself!")) + balloon_alert(user, "cannot link to self!") return TRUE else linked_pad = M.buffer - to_chat(user, span_notice("You link [src] to the one in [I]'s buffer.")) + balloon_alert(user, "data uploaded from buffer") return TRUE else - to_chat(user, span_warning("There is no quantum pad data saved in [I]'s buffer!")) + balloon_alert(user, "no quantum pad data found!") return TRUE else if(istype(I, /obj/item/quantum_keycard)) diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index cb2e58b4f662b..1467c356636bb 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -1,6 +1,6 @@ /obj/machinery/recharger name = "recharger" - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/machines/sec.dmi' icon_state = "recharger" base_icon_state = "recharger" desc = "A charging dock for energy based weaponry, PDAs, and other devices." diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 0eaf8e4c163eb..415dacc9f176b 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -1,7 +1,7 @@ /obj/machinery/recharge_station name = "recharging station" desc = "This device recharges energy dependent lifeforms, like cyborgs, ethereals and MODsuit users." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/machines/borg_charger.dmi' icon_state = "borgcharger0" density = FALSE req_access = list(ACCESS_ROBOTICS) @@ -21,7 +21,6 @@ materials = AddComponent( /datum/component/remote_materials, \ - "charger", \ mapload, \ mat_container_flags = MATCONTAINER_NO_INSERT, \ ) diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 2b4ebe3a92158..99e7540a35220 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -3,7 +3,7 @@ /obj/machinery/recycler name = "recycler" desc = "A large crushing machine used to recycle small items inefficiently. There are lights on the side." - icon = 'icons/obj/recycling.dmi' + icon = 'icons/obj/machines/recycling.dmi' icon_state = "grinder-o0" layer = ABOVE_ALL_MOB_LAYER // Overhead plane = ABOVE_GAME_PLANE @@ -12,11 +12,11 @@ var/safety_mode = FALSE // Temporarily stops machine if it detects a mob var/icon_name = "grinder-o" var/bloody = FALSE - var/eat_dir = WEST var/amount_produced = 50 var/crush_damage = 1000 var/eat_victim_items = TRUE var/item_recycle_sound = 'sound/items/welder.ogg' + var/datum/component/material_container/materials /obj/machinery/recycler/Initialize(mapload) var/list/allowed_materials = list( @@ -32,7 +32,8 @@ /datum/material/titanium, /datum/material/bluespace ) - AddComponent(/datum/component/material_container, allowed_materials, INFINITY, MATCONTAINER_NO_INSERT|BREAKDOWN_FLAGS_RECYCLER) + materials = AddComponent(/datum/component/material_container, allowed_materials, INFINITY, MATCONTAINER_NO_INSERT|BREAKDOWN_FLAGS_RECYCLER) + AddComponent(/datum/component/simple_rotation) AddComponent(/datum/component/butchering/recycler, \ speed = 0.1 SECONDS, \ effectiveness = amount_produced, \ @@ -50,6 +51,10 @@ ) AddElement(/datum/element/connect_loc, loc_connections) +/obj/machinery/recycler/Destroy() + materials = null + return ..() + /obj/machinery/recycler/RefreshParts() . = ..() var/amt_made = 0 @@ -83,15 +88,16 @@ return return ..() -/obj/machinery/recycler/emag_act(mob/user) +/obj/machinery/recycler/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE obj_flags |= EMAGGED if(safety_mode) safety_mode = FALSE update_appearance() playsound(src, SFX_SPARKS, 75, TRUE, SILENCED_SOUND_EXTRARANGE) - to_chat(user, span_notice("You use the cryptographic sequencer on [src].")) + balloon_alert(user, "safeties disabled") + return FALSE /obj/machinery/recycler/update_icon_state() var/is_powered = !(machine_stat & (BROKEN|NOPOWER)) @@ -104,12 +110,13 @@ . = ..() if(!anchored) return - if(border_dir == eat_dir) + if(border_dir == dir) return TRUE -/obj/machinery/recycler/proc/on_entered(datum/source, atom/movable/AM) +/obj/machinery/recycler/proc/on_entered(datum/source, atom/movable/enterer, old_loc) SIGNAL_HANDLER - INVOKE_ASYNC(src, PROC_REF(eat), AM) + + INVOKE_ASYNC(src, PROC_REF(eat), enterer) /obj/machinery/recycler/proc/eat(atom/movable/morsel, sound=TRUE) if(machine_stat & (BROKEN|NOPOWER)) @@ -182,9 +189,8 @@ new wood.plank_type(loc, 1 + seed_modifier) . = TRUE else - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - var/retrived = materials.insert_item(weapon, multiplier = (amount_produced / 100), breakdown_flags=BREAKDOWN_FLAGS_RECYCLER) - if(retrived > 0) //item was salvaged i.e. deleted + var/retrieved = materials.insert_item(weapon, multiplier = (amount_produced / 100), breakdown_flags = BREAKDOWN_FLAGS_RECYCLER) + if(retrieved > 0) //item was salvaged i.e. deleted materials.retrieve_all() return TRUE qdel(weapon) diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 6ea099739af6a..06837cc961d3c 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -13,7 +13,7 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments) /obj/machinery/requests_console name = "requests console" desc = "A console intended to send requests to different departments on the station." - icon = 'icons/obj/terminals.dmi' + icon = 'icons/obj/machines/wallmounts.dmi' icon_state = "req_comp_off" base_icon_state = "req_comp" active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.15 @@ -127,6 +127,7 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments) radio = new /obj/item/radio(src) radio.set_listening(FALSE) + find_and_hang_on_wall() /obj/machinery/requests_console/Destroy() QDEL_NULL(radio) @@ -199,7 +200,7 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments) var/mob/living/L = usr message = L.treat_message(message)["message"] - minor_announce(message, "[department] Announcement:", html_encode = FALSE) + minor_announce(message, "[department] Announcement:", html_encode = FALSE, sound_override = 'sound/misc/announce_dig.ogg') GLOB.news_network.submit_article(message, department, "Station Announcements", null) usr.log_talk(message, LOG_SAY, tag="station announcement from [src]") message_admins("[ADMIN_LOOKUPFLW(usr)] has made a station announcement from [src] at [AREACOORD(usr)].") @@ -407,7 +408,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/requests_console/auto_name, 30) /obj/item/wallframe/requests_console name = "requests console" desc = "An unmounted requests console. Attach it to a wall to use." - icon = 'icons/obj/terminals.dmi' + icon = 'icons/obj/machines/wallmounts.dmi' icon_state = "req_comp_off" result_path = /obj/machinery/requests_console/auto_name pixel_shift = 30 diff --git a/code/game/machinery/roulette_machine.dm b/code/game/machinery/roulette_machine.dm index 8bc9a6c540184..45a69e0b41a01 100644 --- a/code/game/machinery/roulette_machine.dm +++ b/code/game/machinery/roulette_machine.dm @@ -58,7 +58,7 @@ /obj/machinery/roulette/Initialize(mapload) . = ..() jackpot_loop = new(src, FALSE) - wires = new /datum/wires/roulette(src) + set_wires(new /datum/wires/roulette(src)) /obj/machinery/roulette/Destroy() QDEL_NULL(jackpot_loop) @@ -139,7 +139,7 @@ return FALSE if(my_card) - if(istype(player_card, /obj/item/card/id/departmental_budget)) // Are they using a department ID + if(IS_DEPARTMENTAL_CARD(player_card)) // Are they using a department ID say("You cannot gamble with the department budget!") playsound(src, 'sound/machines/buzz-two.ogg', 30, TRUE) return FALSE @@ -439,7 +439,7 @@ /obj/item/roulette_wheel_beacon name = "roulette wheel beacon" desc = "N.T. approved roulette wheel beacon, toss it down and you will have a complementary roulette wheel delivered to you." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/machines/floor.dmi' icon_state = "floor_beacon" var/used diff --git a/code/game/machinery/satellite/satellite_control.dm b/code/game/machinery/satellite/satellite_control.dm index 459382da7ed16..e8482fe91df00 100644 --- a/code/game/machinery/satellite/satellite_control.dm +++ b/code/game/machinery/satellite/satellite_control.dm @@ -23,7 +23,7 @@ /obj/machinery/computer/sat_control/proc/toggle(toggled_id) var/turf/current_turf = get_turf(src) - for(var/obj/machinery/satellite/satellite in GLOB.machines) + for(var/obj/machinery/satellite/satellite as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/satellite)) if(satellite.id != toggled_id) continue if(satellite.obj_flags & EMAGGED) @@ -36,7 +36,7 @@ var/list/data = list() data["satellites"] = list() - for(var/obj/machinery/satellite/sat in GLOB.machines) + for(var/obj/machinery/satellite/sat as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/satellite)) data["satellites"] += list(list( "id" = sat.id, "active" = sat.active, diff --git a/code/game/machinery/scan_gate.dm b/code/game/machinery/scan_gate.dm index d519dae8a5724..49d5fab21f2fa 100644 --- a/code/game/machinery/scan_gate.dm +++ b/code/game/machinery/scan_gate.dm @@ -49,7 +49,7 @@ /obj/machinery/scanner_gate/Initialize(mapload) . = ..() - wires = new /datum/wires/scanner_gate(src) + set_wires(new /datum/wires/scanner_gate(src)) set_scanline("passive") var/static/list/loc_connections = list( COMSIG_ATOM_ENTERED = PROC_REF(on_entered), @@ -58,7 +58,7 @@ /obj/machinery/scanner_gate/Destroy() qdel(wires) - wires = null + set_wires(null) . = ..() /obj/machinery/scanner_gate/examine(mob/user) @@ -105,13 +105,14 @@ wires.interact(user) return ..() -/obj/machinery/scanner_gate/emag_act(mob/user) +/obj/machinery/scanner_gate/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE locked = FALSE req_access = list() obj_flags |= EMAGGED - to_chat(user, span_notice("You fry the ID checking system.")) + balloon_alert(user, "id checker disabled") + return TRUE /obj/machinery/scanner_gate/proc/perform_scan(mob/living/M) var/beep = FALSE @@ -198,8 +199,8 @@ if(next_beep <= world.time) next_beep = world.time + (2 SECONDS) playsound(src, 'sound/machines/scanbuzz.ogg', 100, FALSE) - var/image/alarm_image = image(icon, src, "alarm_light", layer+1) - flick_overlay_view(alarm_image, 2 SECONDS) + var/mutable_appearance/alarm_display = mutable_appearance(icon, "alarm_light") + flick_overlay_view(alarm_display, 2 SECONDS) set_scanline("alarm", 2 SECONDS) /obj/machinery/scanner_gate/can_interact(mob/user) diff --git a/code/game/machinery/sheetifier.dm b/code/game/machinery/sheetifier.dm index 5b01dd990184d..30ce4860074e3 100644 --- a/code/game/machinery/sheetifier.dm +++ b/code/game/machinery/sheetifier.dm @@ -7,11 +7,25 @@ circuit = /obj/item/circuitboard/machine/sheetifier layer = BELOW_OBJ_LAYER var/busy_processing = FALSE + var/datum/component/material_container/materials /obj/machinery/sheetifier/Initialize(mapload) . = ..() + materials = AddComponent( \ + /datum/component/material_container, \ + list(/datum/material/meat, /datum/material/hauntium), \ + SHEET_MATERIAL_AMOUNT * MAX_STACK_SIZE * 2, \ + MATCONTAINER_EXAMINE|BREAKDOWN_FLAGS_SHEETIFIER, \ + typesof(/datum/material/meat) + /datum/material/hauntium, list(/obj/item/food/meat, /obj/item/photo), \ + container_signals = list( + COMSIG_MATCONTAINER_PRE_USER_INSERT = TYPE_PROC_REF(/obj/machinery/sheetifier, CanInsertMaterials), + COMSIG_MATCONTAINER_ITEM_CONSUMED = TYPE_PROC_REF(/obj/machinery/sheetifier, AfterInsertMaterials) + ) \ + ) - AddComponent(/datum/component/material_container, list(/datum/material/meat, /datum/material/hauntium), SHEET_MATERIAL_AMOUNT * MAX_STACK_SIZE * 2, MATCONTAINER_EXAMINE|BREAKDOWN_FLAGS_SHEETIFIER, typesof(/datum/material/meat) + /datum/material/hauntium, list(/obj/item/food/meat, /obj/item/photo), null, CALLBACK(src, PROC_REF(CanInsertMaterials)), CALLBACK(src, PROC_REF(AfterInsertMaterials))) +/obj/machinery/sheetifier/Destroy() + materials = null + return ..() /obj/machinery/sheetifier/update_overlays() . = ..() @@ -24,10 +38,12 @@ icon_state = "base_machine[busy_processing ? "_processing" : ""]" return ..() -/obj/machinery/sheetifier/proc/CanInsertMaterials() - return !busy_processing +/obj/machinery/sheetifier/proc/CanInsertMaterials(container, held_item, user) + SIGNAL_HANDLER + + return busy_processing ? MATCONTAINER_BLOCK_INSERT : TRUE -/obj/machinery/sheetifier/proc/AfterInsertMaterials(item_inserted, id_inserted, amount_inserted) +/obj/machinery/sheetifier/proc/AfterInsertMaterials(container, item_inserted, id_inserted, mats_consumed, amount_inserted, atom/context) busy_processing = TRUE update_appearance() var/datum/material/last_inserted_material = id_inserted @@ -39,7 +55,6 @@ /obj/machinery/sheetifier/proc/finish_processing() busy_processing = FALSE update_appearance() - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) materials.retrieve_all() //Returns all as sheets use_power(active_power_usage) diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index bdee9ce4bf39e..adb1c27ce8100 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -137,7 +137,7 @@ /obj/machinery/shieldgen name = "anti-breach shielding projector" desc = "Used to seal minor hull breaches." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/machines/shield_generator.dmi' icon_state = "shieldoff" density = TRUE opacity = FALSE @@ -268,14 +268,15 @@ else return ..() -/obj/machinery/shieldgen/emag_act(mob/user) +/obj/machinery/shieldgen/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) to_chat(user, span_warning("The access controller is damaged!")) - return + return FALSE obj_flags |= EMAGGED locked = FALSE playsound(src, SFX_SPARKS, 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - to_chat(user, span_warning("You short out the access controller.")) + balloon_alert(user, "access controller shorted") + return TRUE /obj/machinery/shieldgen/update_icon_state() icon_state = "shield[active ? "on" : "off"][(machine_stat & BROKEN) ? "br" : null]" @@ -286,7 +287,7 @@ /obj/machinery/power/shieldwallgen name = "shield wall generator" desc = "A shield generator." - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/machines/shield_generator.dmi' icon_state = "shield_wall_gen" anchored = FALSE density = TRUE @@ -367,7 +368,7 @@ var/turf/T = loc var/obj/machinery/power/shieldwallgen/G var/steps = 0 - var/opposite_direction = turn(direction, 180) + var/opposite_direction = REVERSE_DIR(direction) for(var/i in 1 to shield_range) //checks out to 8 tiles away for another generator T = get_step(T, direction) @@ -470,14 +471,15 @@ user.log_message("activated [src].", LOG_GAME) add_fingerprint(user) -/obj/machinery/power/shieldwallgen/emag_act(mob/user) +/obj/machinery/power/shieldwallgen/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) to_chat(user, span_warning("The access controller is damaged!")) - return + return FALSE obj_flags |= EMAGGED locked = FALSE playsound(src, SFX_SPARKS, 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - to_chat(user, span_warning("You short out the access controller.")) + balloon_alert(user, "access controller shorted") + return TRUE //////////////Containment Field START /obj/machinery/shieldwall @@ -502,7 +504,7 @@ for(var/mob/living/L in get_turf(src)) visible_message(span_danger("\The [src] is suddenly occupying the same space as \the [L]!")) L.investigate_log("has been gibbed by [src].", INVESTIGATE_DEATHS) - L.gib() + L.gib(DROP_ALL_REMAINS) RegisterSignal(src, COMSIG_ATOM_SINGULARITY_TRY_MOVE, PROC_REF(block_singularity)) /obj/machinery/shieldwall/Destroy() diff --git a/code/game/machinery/sleepers.dm b/code/game/machinery/sleepers.dm index 6f7cee63d87b5..373dc5333ebaa 100644 --- a/code/game/machinery/sleepers.dm +++ b/code/game/machinery/sleepers.dm @@ -266,16 +266,17 @@ if((obj_flags & EMAGGED) && prob(5)) to_chat(usr, span_warning("Chemical system re-route detected, results may not be as expected!")) -/obj/machinery/sleeper/emag_act(mob/user) +/obj/machinery/sleeper/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE - to_chat(user, span_warning("You scramble the sleeper's user interface!")) + balloon_alert(user, "interface scrambled") obj_flags |= EMAGGED var/list/av_chem = available_chems.Copy() for(var/chem in av_chem) chem_buttons[chem] = pick_n_take(av_chem) //no dupes, allow for random buttons to still be correct + return TRUE /obj/machinery/sleeper/proc/inject_chem(chem, mob/user) if((chem in available_chems) && chem_allowed(chem)) diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm index 30bef8e46860b..ddfe76f56af1d 100644 --- a/code/game/machinery/slotmachine.dm +++ b/code/game/machinery/slotmachine.dm @@ -17,7 +17,7 @@ /obj/machinery/computer/slot_machine name = "slot machine" desc = "Gambling for the antisocial." - icon = 'icons/obj/computer.dmi' + icon = 'icons/obj/machines/computer.dmi' icon_state = "slots" icon_keyboard = null icon_screen = "slots_screen" @@ -35,7 +35,7 @@ var/static/list/coinvalues var/list/reels = list(list("", "", "") = 0, list("", "", "") = 0, list("", "", "") = 0, list("", "", "") = 0, list("", "", "") = 0) var/list/symbols = list(SEVEN = 1, "&" = 2, "@" = 2, "$" = 2, "?" = 2, "#" = 2, "!" = 2, "%" = 2) //if people are winning too much, multiply every number in this list by 2 and see if they are still winning too much. - + var/static/list/ray_filter = list(type = "rays", y = 16, size = 40, density = 4, color = COLOR_RED_LIGHT, factor = 15, flags = FILTER_OVERLAY) /obj/machinery/computer/slot_machine/Initialize(mapload) . = ..() @@ -127,14 +127,16 @@ else return ..() -/obj/machinery/computer/slot_machine/emag_act() +/obj/machinery/computer/slot_machine/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE obj_flags |= EMAGGED var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread() spark_system.set_up(4, 0, src.loc) spark_system.start() playsound(src, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + balloon_alert(user, "machine rigged") + return TRUE /obj/machinery/computer/slot_machine/ui_interact(mob/living/user) . = ..() @@ -249,6 +251,8 @@ /obj/machinery/computer/slot_machine/proc/toggle_reel_spin(value, delay = 0) //value is 1 or 0 aka on or off for(var/list/reel in reels) + if(!value) + playsound(src, 'sound/machines/ding_short.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) reels[reel] = value sleep(delay) @@ -262,6 +266,7 @@ /obj/machinery/computer/slot_machine/proc/give_prizes(usrname, mob/user) var/linelength = get_lines() + var/did_player_win = TRUE if(reels[1][2] + reels[2][2] + reels[3][2] + reels[4][2] + reels[5][2] == "[SEVEN][SEVEN][SEVEN][SEVEN][SEVEN]") visible_message("[src] says, 'JACKPOT! You win [money] credits!'") @@ -270,12 +275,14 @@ balance += money - give_payout(JACKPOT) money = 0 if(paymode == HOLOCHIP) - new /obj/item/holochip(loc,JACKPOT) + new /obj/item/holochip(loc, JACKPOT) else for(var/i in 1 to 5) cointype = pick(subtypesof(/obj/item/coin)) - var/obj/item/coin/C = new cointype(loc) - random_step(C, 2, 50) + var/obj/item/coin/payout_coin = new cointype(loc) + random_step(payout_coin, 2, 50) + playsound(src, pick(list('sound/machines/coindrop.ogg', 'sound/machines/coindrop2.ogg')), 50, TRUE) + sleep(REEL_DEACTIVATE_DELAY) else if(linelength == 5) visible_message("[src] says, 'Big Winner! You win a thousand credits!'") @@ -292,6 +299,13 @@ else to_chat(user, span_warning("No luck!")) + did_player_win = FALSE + + if(did_player_win) + add_filter("jackpot_rays", 3, ray_filter) + animate(get_filter("jackpot_rays"), offset = 10, time = 3 SECONDS, loop = -1) + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum, remove_filter), "jackpot_rays"), 3 SECONDS) + playsound(src, 'sound/machines/roulettejackpot.ogg', 50, TRUE) /obj/machinery/computer/slot_machine/proc/get_lines() var/amountthesame @@ -352,6 +366,7 @@ else random_step(C, 2, 40) + playsound(src, pick(list('sound/machines/coindrop.ogg', 'sound/machines/coindrop2.ogg')), 50, TRUE) return amount #undef BIG_PRIZE diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index dcf323c0c4011..0987bf42f31b6 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -7,7 +7,7 @@ anchored = FALSE density = TRUE interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN - icon = 'icons/obj/atmospherics/atmos.dmi' + icon = 'icons/obj/pipes_n_cables/atmos.dmi' icon_state = "sheater-off" base_icon_state = "sheater" name = "space heater" @@ -77,7 +77,7 @@ /obj/machinery/space_heater/on_construction() set_panel_open(TRUE) - cell = null + QDEL_NULL(cell) /obj/machinery/space_heater/on_deconstruction() if(cell) diff --git a/code/game/machinery/stasis.dm b/code/game/machinery/stasis.dm index 8bcdba43d05e1..b3020c8d7493c 100644 --- a/code/game/machinery/stasis.dm +++ b/code/game/machinery/stasis.dm @@ -52,7 +52,7 @@ /obj/machinery/stasis/Exited(atom/movable/gone, direction) if(gone == occupant) var/mob/living/L = gone - if(IS_IN_STASIS(L)) + if(HAS_TRAIT(L, TRAIT_STASIS)) thaw_them(L) return ..() @@ -139,9 +139,9 @@ return var/mob/living/L_occupant = occupant if(stasis_running()) - if(!IS_IN_STASIS(L_occupant)) + if(!HAS_TRAIT(L_occupant, TRAIT_STASIS)) chill_out(L_occupant) - else if(IS_IN_STASIS(L_occupant)) + else if(HAS_TRAIT(L_occupant, TRAIT_STASIS)) thaw_them(L_occupant) /obj/machinery/stasis/screwdriver_act(mob/living/user, obj/item/I) diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 34676c2ab1172..cbfb61a4a03c6 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -1,16 +1,20 @@ // Status display -// (formerly Countdown timer display) -#define MAX_STATIC_WIDTH 25 -#define FONT_STYLE "5pt 'Small Fonts'" +#define MAX_STATIC_WIDTH 22 +#define FONT_STYLE "12pt 'TinyUnicode'" #define SCROLL_RATE (0.04 SECONDS) // time per pixel -#define LINE1_Y -8 -#define LINE2_Y -15 +#define SCROLL_PADDING 2 // how many pixels we chop to make a smooth loop +#define LINE1_X 1 +#define LINE1_Y -4 +#define LINE2_X 1 +#define LINE2_Y -11 +#define STATUS_DISPLAY_FONT_DATUM /datum/font/tiny_unicode/size_12pt + /// Status display which can show images and scrolling text. /obj/machinery/status_display name = "status display" desc = null - icon = 'icons/obj/status_display.dmi' + icon = 'icons/obj/machines/status_display.dmi' icon_state = "frame" verb_say = "beeps" verb_ask = "beeps" @@ -124,14 +128,14 @@ * * message - the new message text. * Returns new /obj/effect/overlay/status_display_text or null if unchanged. */ -/obj/machinery/status_display/proc/update_message(obj/effect/overlay/status_display_text/overlay, line_y, message, x_offset) +/obj/machinery/status_display/proc/update_message(obj/effect/overlay/status_display_text/overlay, line_y, message, x_offset, line_pair) if(overlay && message == overlay.message) return null if(overlay) qdel(overlay) - var/obj/effect/overlay/status_display_text/new_status_display_text = new(src, line_y, message, text_color, header_text_color, x_offset) + var/obj/effect/overlay/status_display_text/new_status_display_text = new(src, line_y, message, text_color, header_text_color, x_offset, line_pair) // Draw our object visually "in front" of this display, taking advantage of sidemap new_status_display_text.pixel_y = -32 new_status_display_text.pixel_z = 32 @@ -149,7 +153,7 @@ return set_light(1.5, 0.7, LIGHT_COLOR_BLUE) // blue light -/obj/machinery/status_display/update_overlays() +/obj/machinery/status_display/update_overlays(updates) . = ..() if(machine_stat & (NOPOWER|BROKEN)) @@ -167,10 +171,18 @@ if(current_picture == AI_DISPLAY_DONT_GLOW) // If the thing's off, don't display the emissive yeah? return . else - var/overlay = update_message(message1_overlay, LINE1_Y, message1) + var/line1_metric + var/line2_metric + var/line_pair + var/datum/font/display_font = new STATUS_DISPLAY_FONT_DATUM() + line1_metric = display_font.get_metrics(message1) + line2_metric = display_font.get_metrics(message2) + line_pair = (line1_metric > line2_metric ? line1_metric : line2_metric) + + var/overlay = update_message(message1_overlay, LINE1_Y, message1, LINE1_X, line_pair) if(overlay) message1_overlay = overlay - overlay = update_message(message2_overlay, LINE2_Y, message2) + overlay = update_message(message2_overlay, LINE2_Y, message2, LINE2_X, line_pair) if(overlay) message2_overlay = overlay @@ -217,10 +229,10 @@ /obj/machinery/status_display/proc/display_shuttle_status(obj/docking_port/mobile/shuttle) if(!shuttle) // the shuttle is missing - no processing - set_messages("shutl?","") + set_messages("shutl","not in service") return PROCESS_KILL else if(shuttle.timer) - var/line1 = "- [shuttle.getModeStr()] -" + var/line1 = shuttle.getModeStr() var/line2 = shuttle.getTimerStr() set_messages(line1, line2) @@ -236,7 +248,7 @@ * Nice overlay to make text smoothly scroll with no client updates after setup. */ /obj/effect/overlay/status_display_text - icon = 'icons/obj/status_display.dmi' + icon = 'icons/obj/machines/status_display.dmi' vis_flags = VIS_INHERIT_LAYER | VIS_INHERIT_PLANE | VIS_INHERIT_ID /// The message this overlay is displaying. @@ -245,39 +257,23 @@ // If the line is short enough to not marquee, and it matches this, it's a header. var/static/regex/header_regex = regex("^-.*-$") - /// Width of each character, including kerning gap afterwards. - /// We don't use rich text or anything fancy, so we can bake these values. - var/static/list/char_widths = list( - // ! " # $ % & ' ( ) * + , - . / - 1, 2, 3, 5, 4, 5, 5, 2, 3, 3, 3, 4, 2, 3, 2, 3, - // 0 1 2 3 4 5 6 7 8 9 : ; < = > ? - 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 3, 3, 3, 3, - // @ A B C D E F G H I J K L M N O - 7, 5, 5, 5, 5, 4, 4, 5, 5, 2, 4, 5, 4, 6, 5, 5, - // P Q R S T U V W X Y Z [ \ ] ^ _ - 5, 5, 5, 5, 4, 5, 4, 6, 4, 4, 4, 3, 3, 3, 4, 4, - // ` a b c d e f g h i j k l m n o - 3, 5, 5, 5, 5, 4, 4, 5, 5, 2, 4, 5, 4, 6, 5, 5, - // p q r s t u v w x y z { | } ~ - 5, 5, 5, 5, 4, 5, 4, 6, 4, 4, 4, 3, 2, 3, 4, - ) - -/obj/effect/overlay/status_display_text/Initialize(mapload, yoffset, line, text_color, header_text_color, xoffset = 0) +/obj/effect/overlay/status_display_text/Initialize(mapload, yoffset, line, text_color, header_text_color, xoffset = 0, line_pair) . = ..() maptext_y = yoffset message = line - var/line_width = measure_width(line) + var/datum/font/display_font = new STATUS_DISPLAY_FONT_DATUM() + var/line_width = display_font.get_metrics(line) if(line_width > MAX_STATIC_WIDTH) // Marquee text - var/marquee_message = "[line] - [line] - [line]" + var/marquee_message = "[line] [line] [line]" // Width of full content. Must of these is never revealed unless the user inputted a single character. - var/full_marquee_width = measure_width(marquee_message) + var/full_marquee_width = display_font.get_metrics("[marquee_message] ") // We loop after only this much has passed. - var/looping_marquee_width = measure_width("[line] - ") + var/looping_marquee_width = (display_font.get_metrics("[line] ]") - SCROLL_PADDING) maptext = generate_text(marquee_message, center = FALSE, text_color = text_color) maptext_width = full_marquee_width @@ -287,45 +283,24 @@ add_filter("mask", 1, alpha_mask_filter(icon = icon(icon, "outline"))) // Scroll. - var/time = looping_marquee_width * SCROLL_RATE - animate(src, maptext_x = -looping_marquee_width, time = time, loop = -1) - animate(maptext_x = 0, time = 0) + var/time = line_pair * SCROLL_RATE + animate(src, maptext_x = (-looping_marquee_width) + MAX_STATIC_WIDTH, time = time, loop = -1) + animate(maptext_x = MAX_STATIC_WIDTH, time = 0) else // Centered text var/color = header_regex.Find(line) ? header_text_color : text_color maptext = generate_text(line, center = TRUE, text_color = color) maptext_x = xoffset //Defaults to 0, this would be centered unless overided -/** - * A hyper-streamlined version of MeasureText that doesn't support different fonts, rich formatting, or multiline. - * But it also doesn't require a client. - * - * Returns the width in pixels - * - * Arguments: - * * text - the text to measure - */ -/obj/effect/overlay/status_display_text/proc/measure_width(text) - var/width = 0 - for(var/text_idx in 1 to length(text)) - var/ascii = text2ascii(text, text_idx) - if(!(ascii in 0x20 to 0x7E)) - // So we can't possibly runtime, even though the input should be in range already. - width += 3 - continue - width += char_widths[ascii - 0x1F] - - return width - /** * Generate the actual maptext. * Arguments: * * text - the text to display - * * center - center the text if TRUE, otherwise left-align + * * center - center the text if TRUE, otherwise right-align (the direction the text is coming from) * * text_color - the text color */ /obj/effect/overlay/status_display_text/proc/generate_text(text, center, text_color) - return {"
[text]
"} + return {"
[text]
"} /// Evac display which shows shuttle timer or message set by Command. /obj/machinery/status_display/evac @@ -344,6 +319,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/evac, 32) AddComponent(/datum/component/usb_port, list( /obj/item/circuit_component/status_display, )) + find_and_hang_on_wall() /obj/machinery/status_display/evac/Destroy() SSradio.remove_object(src,frequency) @@ -412,8 +388,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/evac, 32) if(!SSshuttle.supply) // Might be missing in our first update on initialize before shuttles // have loaded. Cross our fingers that it will soon return. - line1 = "CARGO" - line2 = "shutl?" + line1 = "shutl" + line2 = "not in service" else if(SSshuttle.supply.mode == SHUTTLE_IDLE) if(is_station_level(SSshuttle.supply.z)) line1 = "CARGO" @@ -422,7 +398,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/evac, 32) line1 = "" line2 = "" else - line1 = "- [SSshuttle.supply.getModeStr()] -" + line1 = SSshuttle.supply.getModeStr() line2 = SSshuttle.supply.getTimerStr() set_messages(line1, line2) @@ -463,47 +439,17 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/evac, 32) name = "\improper AI display" desc = "A small screen which the AI can use to present itself." current_mode = SD_PICTURE - - var/emotion = AI_EMOTION_BLANK - - /// A mapping between AI_EMOTION_* string constants, which also double as user readable descriptions, and the name of the iconfile. - var/static/list/emotion_map = list( - AI_EMOTION_BLANK = AI_DISPLAY_DONT_GLOW, - AI_EMOTION_VERY_HAPPY = "ai_veryhappy", - AI_EMOTION_HAPPY = "ai_happy", - AI_EMOTION_NEUTRAL = "ai_neutral", - AI_EMOTION_UNSURE = "ai_unsure", - AI_EMOTION_CONFUSED = "ai_confused", - AI_EMOTION_SAD = "ai_sad", - AI_EMOTION_BSOD = "ai_bsod", - AI_EMOTION_PROBLEMS = "ai_trollface", - AI_EMOTION_AWESOME = "ai_awesome", - AI_EMOTION_DORFY = "ai_urist", - AI_EMOTION_THINKING = "ai_thinking", - AI_EMOTION_FACEPALM = "ai_facepalm", - AI_EMOTION_FRIEND_COMPUTER = "ai_friend", - AI_EMOTION_BLUE_GLOW = "ai_sal", - AI_EMOTION_RED_GLOW = "ai_hal", - ) - + var/emotion = AI_DISPLAY_DONT_GLOW MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/ai, 32) -/obj/machinery/status_display/ai/Initialize(mapload) - . = ..() - GLOB.ai_status_displays.Add(src) - -/obj/machinery/status_display/ai/Destroy() - GLOB.ai_status_displays.Remove(src) - . = ..() - /obj/machinery/status_display/ai/attack_ai(mob/living/silicon/ai/user) if(!isAI(user)) return var/list/choices = list() - for(var/emotion_const in emotion_map) - var/icon_state = emotion_map[emotion_const] - choices[emotion_const] = image(icon = 'icons/obj/status_display.dmi', icon_state = icon_state) + for(var/emotion_const in GLOB.ai_status_display_emotes) + var/icon_state = GLOB.ai_status_display_emotes[emotion_const] + choices[emotion_const] = image(icon = 'icons/obj/machines/status_display.dmi', icon_state = icon_state) var/emotion_result = show_radial_menu(user, src, choices, tooltips = TRUE) for(var/_emote in typesof(/datum/emote/ai/emotion_display)) @@ -517,7 +463,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/ai, 32) update_appearance() return PROCESS_KILL - set_picture(emotion_map[emotion]) + set_picture(GLOB.ai_status_display_emotes[emotion]) return PROCESS_KILL /obj/item/circuit_component/status_display @@ -549,9 +495,13 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/ai, 32) var/static/list/picture_options = list( "Default" = "default", + "Delta Alert" = "deltaalert", "Red Alert" = "redalert", + "Blue Alert" = "bluealert", + "Green Alert" = "greenalert", "Biohazard" = "biohazard", "Lockdown" = "lockdown", + "Radiation" = "radiation", "Happy" = "ai_happy", "Neutral" = "ai_neutral", "Very Happy" = "ai_veryhappy", @@ -598,5 +548,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/ai, 32) #undef MAX_STATIC_WIDTH #undef FONT_STYLE #undef SCROLL_RATE +#undef LINE1_X #undef LINE1_Y +#undef LINE2_X #undef LINE2_Y +#undef STATUS_DISPLAY_FONT_DATUM + +#undef SCROLL_PADDING diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index b91daa083a40b..15c740a31e4bd 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -62,7 +62,7 @@ var/card_reader_installed = FALSE /// physical reference of the players id card to check for PERSONAL access level var/datum/weakref/id_card = null - /// should we prevent furthur access change + /// should we prevent further access change var/access_locked = FALSE /obj/machinery/suit_storage_unit/standard_unit @@ -138,6 +138,14 @@ storage_type = /obj/item/tank/jetpack/oxygen/harness mod_type = /obj/item/mod/control/pre_equipped/nuclear +/obj/machinery/suit_storage_unit/syndicate/lavaland + mod_type = /obj/item/mod/control/pre_equipped/nuclear/no_jetpack + +/obj/machinery/suit_storage_unit/interdyne + mask_type = /obj/item/clothing/mask/gas/syndicate + storage_type = /obj/item/tank/jetpack/oxygen/harness + mod_type = /obj/item/mod/control/pre_equipped/interdyne + /obj/machinery/suit_storage_unit/void_old suit_type = /obj/item/clothing/suit/space/nasavoid/old helmet_type = /obj/item/clothing/head/helmet/space/nasavoid/old @@ -172,7 +180,7 @@ . = ..() set_access() - wires = new /datum/wires/suit_storage_unit(src) + set_wires(new /datum/wires/suit_storage_unit(src)) if(suit_type) suit = new suit_type(src) if(helmet_type) diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index 54b071b2fb68a..188f3b4f52ee9 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -4,7 +4,7 @@ /obj/machinery/power/singularity_beacon name = "ominous beacon" desc = "This looks suspicious..." - icon = 'icons/obj/engine/singularity.dmi' + icon = 'icons/obj/machines/engine/singularity.dmi' icon_state = "beacon0" anchored = FALSE diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index ce3d1abe11b2c..516f5ec8453a0 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -99,7 +99,7 @@ /obj/machinery/syndicatebomb/Initialize(mapload) . = ..() - wires = new /datum/wires/syndicatebomb(src) + set_wires(new /datum/wires/syndicatebomb(src)) if(payload) payload = new payload(src) update_appearance() @@ -183,11 +183,11 @@ if(payload || !wires.is_all_cut() || !open_panel) return FALSE - if(!tool.tool_start_check(user, amount=5)) //uses up 5 fuel + if(!tool.tool_start_check(user, amount=1)) return TRUE to_chat(user, span_notice("You start to cut [src] apart...")) - if(tool.use_tool(src, user, 20, volume=50, amount=5)) // uses up 5 fuel + if(tool.use_tool(src, user, 20, volume=50)) to_chat(user, span_notice("You cut [src] apart.")) new /obj/item/stack/sheet/plasteel(loc, 5) qdel(src) @@ -409,12 +409,14 @@ /obj/item/bombcore/badmin/summon/detonate() var/obj/machinery/syndicatebomb/B = loc - spawn_and_random_walk(summon_path, src, amt_summon, walk_chance=50, admin_spawn=TRUE) + spawn_and_random_walk(summon_path, src, amt_summon, walk_chance=50, admin_spawn=TRUE, cardinals_only = FALSE) qdel(B) qdel(src) /obj/item/bombcore/badmin/summon/clown - summon_path = /mob/living/simple_animal/hostile/retaliate/clown + name = "bananium payload" + desc = "Clowns delivered fast and cheap!" + summon_path = /mob/living/basic/clown amt_summon = 50 /obj/item/bombcore/badmin/summon/clown/defuse() @@ -595,7 +597,7 @@ /obj/item/syndicatedetonator/attack_self(mob/user) if(timer < world.time) - for(var/obj/machinery/syndicatebomb/B in GLOB.machines) + for(var/obj/machinery/syndicatebomb/B as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/syndicatebomb)) if(B.active) B.detonation_timer = world.time + BUTTON_DELAY detonated++ diff --git a/code/game/machinery/teambuilder.dm b/code/game/machinery/teambuilder.dm index 4bc0969f58324..8e6cccf14ebca 100644 --- a/code/game/machinery/teambuilder.dm +++ b/code/game/machinery/teambuilder.dm @@ -4,7 +4,7 @@ /obj/machinery/teambuilder name = "Teambuilding Machine" desc = "A machine that, when passed, colors you based on the color of your team. Lead free!" - icon = 'icons/obj/telescience.dmi' + icon = 'icons/obj/machines/telepad.dmi' icon_state = "lpad-idle" density = FALSE can_buckle = FALSE diff --git a/code/game/machinery/telecomms/broadcasting.dm b/code/game/machinery/telecomms/broadcasting.dm index 50dc4af8c9ee7..2ba6856ce1f67 100644 --- a/code/game/machinery/telecomms/broadcasting.dm +++ b/code/game/machinery/telecomms/broadcasting.dm @@ -118,8 +118,7 @@ "spans" = spans, "mods" = message_mods ) - var/turf/T = get_turf(source) - levels = list(T.z) + levels = SSmapping.get_connected_levels(get_turf(source)) /datum/signal/subspace/vocal/copy() var/datum/signal/subspace/vocal/copy = new(source, frequency, virt, language) @@ -184,11 +183,7 @@ // Add observers who have ghost radio enabled. for(var/mob/dead/observer/ghost in GLOB.player_list) - if(ghost.client && !ghost.client.prefs) - stack_trace("[ghost] ([ghost.ckey]) had null prefs, which shouldn't be possible!") - continue - - if(ghost.client?.prefs.chat_toggles & CHAT_GHOSTRADIO) + if(get_chat_toggles(ghost.client) & CHAT_GHOSTRADIO) receive |= ghost // Render the message and have everybody hear it. @@ -202,7 +197,7 @@ 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) + 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/game/machinery/telecomms/computers/message.dm b/code/game/machinery/telecomms/computers/message.dm index 72a5bd3a7f923..e2a669804a1fb 100644 --- a/code/game/machinery/telecomms/computers/message.dm +++ b/code/game/machinery/telecomms/computers/message.dm @@ -38,9 +38,9 @@ return TRUE return ..() -/obj/machinery/computer/message_monitor/emag_act(mob/user) +/obj/machinery/computer/message_monitor/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE if(!isnull(linkedServer)) obj_flags |= EMAGGED screen = MSG_MON_SCREEN_HACKED @@ -53,8 +53,10 @@ addtimer(CALLBACK(src, PROC_REF(unemag_console)), time) error_message = "%$&(£: Critical %$$@ Error // !RestArting! - ?pLeaSe wAit!" linkedServer.toggled = FALSE + return TRUE else to_chat(user, span_notice("A no server error appears on the screen.")) + return FALSE /// Remove the emag effect from the console /obj/machinery/computer/message_monitor/proc/unemag_console() @@ -208,14 +210,16 @@ var/job = tgui_input_text(usr, "What is the sender's job?", "Job") var/recipient + var/list/tablet_to_messenger = list() var/list/viewable_tablets = list() - for (var/obj/item/modular_computer/tablet as anything in GLOB.TabletMessengers) - var/datum/computer_file/program/messenger/message_app = locate() in tablet.stored_files + for (var/messenger_ref in GLOB.pda_messengers) + var/datum/computer_file/program/messenger/message_app = GLOB.pda_messengers[messenger_ref] if(!message_app || message_app.invisible) continue - if(!tablet.saved_identification) + if(!message_app.computer.saved_identification) continue - viewable_tablets += tablet + viewable_tablets += message_app.computer + tablet_to_messenger[message_app.computer] = message_app if(length(viewable_tablets) > 0) recipient = tgui_input_list(usr, "Select a tablet from the list", "Tablet Selection", viewable_tablets) else @@ -232,14 +236,11 @@ notice_message = "NOTICE: No message entered!" return attack_hand(usr) - var/datum/signal/subspace/messaging/tablet_msg/signal = new(src, list( - "name" = "[sender]", - "job" = "[job]", - "message" = html_decode(message), - "ref" = REF(src), - "targets" = list(recipient), - "rigged" = FALSE, - "automated" = FALSE, + var/datum/signal/subspace/messaging/tablet_message/signal = new(src, list( + "fakename" = "[sender]", + "fakejob" = "[job]", + "message" = message, + "targets" = list(tablet_to_messenger[recipient]), )) // This will log the signal and transmit it to the target linkedServer.receive_information(signal, null) diff --git a/code/game/machinery/telecomms/computers/telemonitor.dm b/code/game/machinery/telecomms/computers/telemonitor.dm index 3d12932d99da1..400d827f618b3 100644 --- a/code/game/machinery/telecomms/computers/telemonitor.dm +++ b/code/game/machinery/telecomms/computers/telemonitor.dm @@ -14,10 +14,10 @@ /// Current screen the user is viewing var/screen = MAIN_VIEW - /// The machines located by the computer - var/list/machinelist = list() - /// the currently selected machine - var/obj/machinery/telecomms/SelectedMachine + /// Weakrefs of the machines located by the computer + var/list/machine_list = list() + /// Weakref of the currently selected tcomms machine + var/datum/weakref/selected_machine_ref /// The network to probe var/network = "NULL" /// Error message to show @@ -35,20 +35,26 @@ // --- Main Menu --- if(MAIN_VIEW) var/list/found_machinery = list() - for(var/obj/machinery/telecomms/telecomms in machinelist) + for(var/datum/weakref/tcomms_ref in machine_list) + var/obj/machinery/telecomms/telecomms = tcomms_ref.resolve() + if(!telecomms) + machine_list -= tcomms_ref + continue found_machinery += list(list("ref" = REF(telecomms), "name" = telecomms.name, "id" = telecomms.id)) data["machinery"] = found_machinery // --- Viewing Machine --- if(MACHINE_VIEW) // Send selected machinery data var/list/machine_out = list() - machine_out["name"] = SelectedMachine.name - // Get the linked machinery - var/list/linked_machinery = list() - for(var/obj/machinery/telecomms/T in SelectedMachine.links) - linked_machinery += list(list("ref" = REF(T.id), "name" = T.name, "id" = T.id)) - machine_out["linked_machinery"] = linked_machinery - data["machine"] = machine_out + var/obj/machinery/telecomms/selected = selected_machine_ref.resolve() + if(selected) + machine_out["name"] = selected.name + // Get the linked machinery + var/list/linked_machinery = list() + for(var/obj/machinery/telecomms/T in selected.links) + linked_machinery += list(list("ref" = REF(T.id), "name" = T.name, "id" = T.id)) + machine_out["linked_machinery"] = linked_machinery + data["machine"] = machine_out return data /obj/machinery/computer/telecomms/monitor/ui_act(action, params) @@ -67,7 +73,9 @@ error_message = "OPERATION FAILED: NETWORK ID TOO LONG." return TRUE - if(machinelist.len > 0) + list_clear_empty_weakrefs(machine_list) + + if(machine_list.len > 0) error_message = "OPERATION FAILED: CANNOT PROBE WHEN BUFFER FULL." return TRUE @@ -75,29 +83,34 @@ for(var/obj/machinery/telecomms/T in urange(25, src)) if(T.network == network) - machinelist.Add(T) - if(machinelist.len == 0) + machine_list += WEAKREF(T) + if(machine_list.len == 0) error_message = "OPERATION FAILED: UNABLE TO LOCATE NETWORK ENTITIES IN [network]." return TRUE - error_message = "[machinelist.len] ENTITIES LOCATED & BUFFERED"; + error_message = "[machine_list.len] ENTITIES LOCATED & BUFFERED"; return TRUE if("flush_buffer") - machinelist = list() + machine_list = list() network = "" return TRUE if("view_machine") - for(var/obj/machinery/telecomms/T in machinelist) - if(T.id == params["id"]) - SelectedMachine = T - if(!SelectedMachine) + for(var/datum/weakref/tcomms_ref in machine_list) + var/obj/machinery/telecomms/tcomms = tcomms_ref.resolve() + if(!tcomms) + machine_list -= tcomms_ref + continue + if(tcomms.id == params["id"]) + selected_machine_ref = tcomms_ref + if(!selected_machine_ref) error_message = "OPERATION FAILED: UNABLE TO LOCATE MACHINERY." screen = MACHINE_VIEW return TRUE if("return_home") - SelectedMachine = null + selected_machine_ref = null screen = MAIN_VIEW return TRUE return TRUE + /obj/machinery/computer/telecomms/monitor/attackby() . = ..() updateUsrDialog() diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 8b19a4f70df3f..f3d5f8d835294 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -153,10 +153,10 @@ var/obj/machinery/telecomms/T = heldmultitool.buffer . = add_new_link(T, operator) if("buffer") - heldmultitool.buffer = src + heldmultitool.set_buffer(src) . = TRUE if("flush") - heldmultitool.buffer = null + heldmultitool.set_buffer(null) . = TRUE add_act(action, params) diff --git a/code/game/machinery/telecomms/machines/broadcaster.dm b/code/game/machinery/telecomms/machines/broadcaster.dm index c66e359b0a6c5..56b53437e633a 100644 --- a/code/game/machinery/telecomms/machines/broadcaster.dm +++ b/code/game/machinery/telecomms/machines/broadcaster.dm @@ -25,6 +25,9 @@ GLOBAL_VAR_INIT(message_delay, 0) // To make sure restarting the recentmessages return if(!signal.data["message"]) return + var/signal_message = "[signal.frequency]:[signal.data["message"]]:[signal.data["name"]]" + if(signal_message in GLOB.recentmessages) + return // Prevents massive radio spam signal.mark_done() @@ -34,11 +37,8 @@ GLOBAL_VAR_INIT(message_delay, 0) // To make sure restarting the recentmessages var/turf/T = get_turf(src) if (T) - signal.levels |= T.z + signal.levels |= SSmapping.get_connected_levels(T) - var/signal_message = "[signal.frequency]:[signal.data["message"]]:[signal.data["name"]]" - if(signal_message in GLOB.recentmessages) - return GLOB.recentmessages.Add(signal_message) if(signal.data["slow"] > 0) diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm index 9e799b3595a0b..02a146fac314a 100644 --- a/code/game/machinery/telecomms/machines/message_server.dm +++ b/code/game/machinery/telecomms/machines/message_server.dm @@ -7,7 +7,7 @@ // A decorational representation of SSblackbox, usually placed alongside the message server. Also contains a traitor theft item. /obj/machinery/blackbox_recorder - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/machines/telecomms.dmi' icon_state = "blackbox" name = "Blackbox Recorder" density = TRUE @@ -65,7 +65,7 @@ /obj/item/blackbox name = "\proper the blackbox" desc = "A strange relic, capable of recording data on extradimensional vertices. It lives inside the blackbox recorder for safe keeping." - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/machines/telecomms.dmi' icon_state = "blackcube" inhand_icon_state = "blackcube" lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' @@ -131,14 +131,12 @@ return // log the signal - if(istype(signal, /datum/signal/subspace/messaging/tablet_msg)) - var/datum/signal/subspace/messaging/tablet_msg/PDAsignal = signal - var/datum/data_tablet_msg/msg = new(PDAsignal.format_target(), "[PDAsignal.data["name"]] ([PDAsignal.data["job"]])", PDAsignal.data["message"], PDAsignal.data["photo"]) - pda_msgs += msg - signal.logged = msg + if(istype(signal, /datum/signal/subspace/messaging/tablet_message)) + var/datum/signal/subspace/messaging/tablet_message/PDAsignal = signal + var/datum/data_tablet_msg/log_message = new(PDAsignal.format_target(), PDAsignal.format_sender(), PDAsignal.format_message(), PDAsignal.format_photo_path()) + pda_msgs += log_message else if(istype(signal, /datum/signal/subspace/messaging/rc)) var/datum/data_rc_msg/msg = new(signal.data["rec_dpt"], signal.data["send_dpt"], signal.data["message"], signal.data["stamped"], signal.data["verified"], signal.data["priority"]) - signal.logged = msg if(signal.data["send_dpt"]) // don't log messages not from a department but allow them to work rc_msgs += msg signal.data["reject"] = FALSE @@ -158,13 +156,12 @@ /datum/signal/subspace/messaging frequency = FREQ_COMMON server_type = /obj/machinery/telecomms/message_server - var/datum/logged /datum/signal/subspace/messaging/New(init_source, init_data) source = init_source data = init_data var/turf/T = get_turf(source) - levels = list(T.z) + levels = SSmapping.get_connected_levels(T) if(!("reject" in data)) data["reject"] = TRUE @@ -175,28 +172,30 @@ return copy // Tablet message signal datum -/datum/signal/subspace/messaging/tablet_msg/proc/format_target() - if (length(data["targets"]) > 1) +/datum/signal/subspace/messaging/tablet_message/proc/format_target() + if (data["everyone"]) return "Everyone" - var/obj/item/modular_computer/target = data["targets"][1] + var/datum/computer_file/program/messenger/target_app = data["targets"][1] + var/obj/item/modular_computer/target = target_app.computer return "[target.saved_identification] ([target.saved_job])" -/datum/signal/subspace/messaging/tablet_msg/proc/format_message() - return "\"[data["message"]]\"" +/datum/signal/subspace/messaging/tablet_message/proc/format_sender() + var/display_name = get_messenger_name(locate(data["ref"])) + return display_name ? display_name : STRINGIFY_PDA_TARGET(data["fakename"], data["fakejob"]) -/datum/signal/subspace/messaging/tablet_msg/broadcast() - if (!logged) // Can only go through if a message server logs it - return - for (var/obj/item/modular_computer/comp in data["targets"]) - if(!QDELETED(comp)) - for(var/datum/computer_file/program/messenger/app in comp.stored_files) - if(!QDELETED(app)) - app.receive_message(src) +/datum/signal/subspace/messaging/tablet_message/proc/format_message() + return data["message"] + +/datum/signal/subspace/messaging/tablet_message/proc/format_photo_path() + return data["photo"] + +/datum/signal/subspace/messaging/tablet_message/broadcast() + for (var/datum/computer_file/program/messenger/app in data["targets"]) + if(!QDELETED(app)) + app.receive_message(src) // Request Console signal datum /datum/signal/subspace/messaging/rc/broadcast() - if (!logged) // Like /pda, only if logged - return var/recipient_department = ckey(data["recipient_department"]) for (var/obj/machinery/requests_console/console in GLOB.req_console_all) if(ckey(console.department) == recipient_department || (data["ore_update"] && console.receive_ore_updates)) @@ -207,8 +206,8 @@ var/sender = "Unspecified" var/recipient = "Unspecified" var/message = "Blank" // transferred message - var/datum/picture/picture // attached photo - var/automated = 0 //automated message + var/picture_asset_key // attached photo path + var/automated = FALSE // automated message /datum/data_tablet_msg/New(param_rec, param_sender, param_message, param_photo) if(param_rec) @@ -218,18 +217,7 @@ if(param_message) message = param_message if(param_photo) - picture = param_photo - -/datum/data_tablet_msg/Topic(href,href_list) - ..() - if(href_list["photo"]) - var/mob/M = usr - M << browse_rsc(picture.picture_image, "pda_photo.png") - M << browse("PDA Photo" \ - + "" \ - + "" \ - + "", "window=pdaphoto;size=[picture.psize_x]x[picture.psize_y];can-close=true") - onclose(M, "pdaphoto") + picture_asset_key = param_photo /datum/data_rc_msg var/rec_dpt = "Unspecified" // receiving department diff --git a/code/game/machinery/telecomms/machines/relay.dm b/code/game/machinery/telecomms/machines/relay.dm index 668d30b5bb8a9..d3a6ac9ee908c 100644 --- a/code/game/machinery/telecomms/machines/relay.dm +++ b/code/game/machinery/telecomms/machines/relay.dm @@ -26,9 +26,9 @@ // Relays send signals to all ZTRAIT_STATION z-levels if(SSmapping.level_trait(relay_turf.z, ZTRAIT_STATION)) for(var/z in SSmapping.levels_by_trait(ZTRAIT_STATION)) - signal.levels |= z + signal.levels |= SSmapping.get_connected_levels(z) else - signal.levels |= relay_turf.z + signal.levels |= SSmapping.get_connected_levels(relay_turf) use_power(idle_power_usage) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index fa58a203e9526..f7300f720863d 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -165,14 +165,14 @@ return var/obj/item/multitool/M = W if(panel_open) - M.buffer = src - to_chat(user, span_notice("You download the data to the [W.name]'s buffer.")) + M.set_buffer(src) + balloon_alert(user, "saved to multitool buffer") else if(M.buffer && istype(M.buffer, /obj/machinery/teleport/station) && M.buffer != src) if(linked_stations.len < efficiency) linked_stations.Add(M.buffer) - M.buffer = null - to_chat(user, span_notice("You upload the data from the [W.name]'s buffer.")) + M.set_buffer(null) + balloon_alert(user, "data uploaded from buffer") else to_chat(user, span_alert("This station can't hold more information, try to use better parts.")) return diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index aa6301e0b8dab..d60cc70a45137 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -3,7 +3,7 @@ desc = "A large metallic machine with an entrance and an exit. A sign on \ the side reads, 'human go in, robot come out'. The human must be \ lying down and alive. Has a cooldown between each use." - icon = 'icons/obj/recycling.dmi' + icon = 'icons/obj/machines/recycling.dmi' icon_state = "separator-AO1" layer = ABOVE_ALL_MOB_LAYER // Overhead plane = ABOVE_GAME_PLANE diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 6fb80f1cd1e3f..a6e1fa0d83a9c 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -293,7 +293,7 @@ GLOBAL_LIST_INIT(dye_registry, list( if(.) var/obj/item/clothing/under/U = . can_adjust = initial(U.can_adjust) - if(!can_adjust && adjusted) //we deadjust the uniform if it's now unadjustable + if(!can_adjust && adjusted == ALT_STYLE) //we deadjust the uniform if it's now unadjustable toggle_jumpsuit_adjust() /obj/item/clothing/head/mob_holder/machine_wash(obj/machinery/washing_machine/washer) diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 2f8cb369f95a6..3d37d2e52b4d6 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -197,10 +197,10 @@ //Handle any extras after buckling //Called on buckle_mob() -/atom/movable/proc/post_buckle_mob(mob/living/M) +/atom/movable/proc/post_buckle_mob(mob/living/buckled_mob) //same but for unbuckle -/atom/movable/proc/post_unbuckle_mob(mob/living/M) +/atom/movable/proc/post_unbuckle_mob(mob/living/unbuckled_mob) /** * Simple helper proc that runs a suite of checks to test whether it is possible or not to buckle the target mob to src. diff --git a/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm b/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm index d8497dad7465c..b0f69b99b47cd 100644 --- a/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm +++ b/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm @@ -225,7 +225,7 @@ sound = 'sound/items/eatfood.ogg' /datum/dimension_theme/natural - icon = 'icons/obj/hydroponics/harvest.dmi' + icon = 'icons/obj/service/hydroponics/harvest.dmi' icon_state = "map_flower" window_colour = "#00f7ff" replace_floors = list(/turf/open/floor/grass = 1) @@ -236,7 +236,7 @@ /obj/structure/table = list(/obj/structure/table/wood = 5, /obj/structure/table/wood/fancy = 1),) /datum/dimension_theme/bamboo - icon = 'icons/obj/hydroponics/harvest.dmi' + icon = 'icons/obj/service/hydroponics/harvest.dmi' icon_state = "bamboo" replace_floors = list(/turf/open/floor/bamboo = 1) replace_walls = /turf/closed/wall/mineral/bamboo @@ -273,7 +273,7 @@ replace_objs = list(/obj/machinery/door/airlock = list(/obj/machinery/door/airlock/external/glass/ruin = 1)) /datum/dimension_theme/glass - icon = 'icons/obj/shards.dmi' + icon = 'icons/obj/debris.dmi' icon_state = "small" material = /datum/material/glass replace_floors = list(/turf/open/floor/glass = 1) diff --git a/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm b/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm index 9aa2c5332db95..a219b2f54921a 100644 --- a/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm +++ b/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm @@ -4,6 +4,7 @@ icon_state = "ectoplasm" aSignal = /obj/item/assembly/signaler/anomaly/ectoplasm lifespan = ANOMALY_COUNTDOWN_TIMER + 2 SECONDS //This one takes slightly longer, because it can run away. + immobile = TRUE //prevents it from moving around so ghosts can actually move it with decent accuracy ///Blocks the anomaly from updating ghost count. Used in case an admin wants to rig the anomaly to be a certain size or intensity. var/override_ghosts = FALSE @@ -129,7 +130,7 @@ /obj/structure/ghost_portal name = "Spooky Portal" desc = "A portal between our dimension and who-knows-where? It's emitting an absolutely ungodly wailing sound." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/anomaly.dmi' icon_state = "anom" anchored = TRUE var/static/list/spooky_noises = list( diff --git a/code/game/objects/effects/anomalies/anomalies_flux.dm b/code/game/objects/effects/anomalies/anomalies_flux.dm index eee4319b3520d..2bb3ab28a1ada 100644 --- a/code/game/objects/effects/anomalies/anomalies_flux.dm +++ b/code/game/objects/effects/anomalies/anomalies_flux.dm @@ -66,7 +66,7 @@ ///range in whuich we zap var/zap_range = 1 ///strength of the zappy - var/zap_power = 2500 + var/zap_power = 1e6 ///the zappy flags var/zap_flags = ZAP_GENERATES_POWER | ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE diff --git a/code/game/objects/effects/anomalies/anomalies_gravity.dm b/code/game/objects/effects/anomalies/anomalies_gravity.dm index 5fcbafce8562f..efd49ef502f63 100644 --- a/code/game/objects/effects/anomalies/anomalies_gravity.dm +++ b/code/game/objects/effects/anomalies/anomalies_gravity.dm @@ -92,7 +92,7 @@ grav_field = new(src, 7, TRUE, rand(0, 3)) /obj/effect/anomaly/grav/high/detonate() - for(var/obj/machinery/gravity_generator/main/the_generator in GLOB.machines) + for(var/obj/machinery/gravity_generator/main/the_generator as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/gravity_generator/main)) if(is_station_level(the_generator.z)) the_generator.blackout() diff --git a/code/game/objects/effects/countdown.dm b/code/game/objects/effects/countdown.dm index cccf77b206556..f820397c0d9fc 100644 --- a/code/game/objects/effects/countdown.dm +++ b/code/game/objects/effects/countdown.dm @@ -64,7 +64,7 @@ displayed_text = new_val if(displayed_text) - maptext = MAPTEXT("[displayed_text]") + maptext = MAPTEXT("[displayed_text]") else maptext = null @@ -102,14 +102,13 @@ /obj/effect/countdown/supermatter name = "supermatter damage" - text_size = 1 color = "#00ff80" /obj/effect/countdown/supermatter/get_value() var/obj/machinery/power/supermatter_crystal/S = attached_to if(!istype(S)) return - return "
[round(S.get_integrity_percent())]%
" + return "
[round(S.get_integrity_percent())]%
" /obj/effect/countdown/transformer name = "transformer countdown" diff --git a/code/game/objects/effects/cursor_catcher.dm b/code/game/objects/effects/cursor_catcher.dm index 779cad0e2a0ff..3624018afc89b 100644 --- a/code/game/objects/effects/cursor_catcher.dm +++ b/code/game/objects/effects/cursor_catcher.dm @@ -54,7 +54,11 @@ /atom/movable/screen/fullscreen/cursor_catcher/proc/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)) var/icon_y = text2num(LAZYACCESS(modifiers, VIS_Y)) + if(isnull(icon_y)) + icon_y = text2num(LAZYACCESS(modifiers, ICON_Y)) var/our_x = round(icon_x / world.icon_size) var/our_y = round(icon_y / world.icon_size) given_turf = locate(owner.x + our_x - round(view_list[1]/2), owner.y + our_y - round(view_list[2]/2), owner.z) diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 9499558fcffcc..b0af5c3ca029e 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -16,6 +16,16 @@ ///The amount of reagent this decal holds, if decal_reagent is defined var/reagent_amount = 0 +/// Creates a cleanable decal on a turf +/// Use this if your decal is one of one, and thus we should not spawn it if it's there already +/// Returns either the existing cleanable, the one we created, or null if we can't spawn on that turf +/turf/proc/spawn_unique_cleanable(obj/effect/decal/cleanable/cleanable_type) + // There is no need to spam unique cleanables, they don't stack and it just chews cpu + var/obj/effect/decal/cleanable/existing = locate(cleanable_type) in src + if(existing) + return existing + return new cleanable_type(src) + /obj/effect/decal/cleanable/Initialize(mapload, list/datum/disease/diseases) . = ..() if (random_icon_states && (icon_state == initial(icon_state)) && length(random_icon_states) > 0) @@ -69,7 +79,7 @@ to_chat(user, span_notice("[W] is full!")) return to_chat(user, span_notice("You scoop up [src] into [W]!")) - reagents.trans_to(W, reagents.total_volume, transfered_by = user) + reagents.trans_to(W, reagents.total_volume, transferred_by = user) if(!reagents.total_volume) //scooped up all of it qdel(src) return diff --git a/code/game/objects/effects/decals/cleanable/aliens.dm b/code/game/objects/effects/decals/cleanable/aliens.dm index 473deb74489bf..4f4b2543792c0 100644 --- a/code/game/objects/effects/decals/cleanable/aliens.dm +++ b/code/game/objects/effects/decals/cleanable/aliens.dm @@ -40,7 +40,9 @@ return if(mapload) for (var/i in 1 to range) - new /obj/effect/decal/cleanable/xenoblood/xsplatter(loc) + var/turf/my_turf = get_turf(src) + if(!isgroundlessturf(my_turf) || GET_TURF_BELOW(my_turf)) + new /obj/effect/decal/cleanable/xenoblood/xsplatter(my_turf) if (!step_to(src, get_step(src, direction), 0)) break return @@ -50,6 +52,8 @@ /obj/effect/decal/cleanable/xenoblood/xgibs/proc/spread_movement_effects(datum/move_loop/has_target/source) SIGNAL_HANDLER + if(NeverShouldHaveComeHere(loc)) + return new /obj/effect/decal/cleanable/xenoblood/xsplatter(loc) /obj/effect/decal/cleanable/xenoblood/xgibs/proc/on_pipe_eject(atom/source, direction) diff --git a/code/game/objects/effects/decals/cleanable/food.dm b/code/game/objects/effects/decals/cleanable/food.dm index 876c557a71536..0fc4352c78da9 100644 --- a/code/game/objects/effects/decals/cleanable/food.dm +++ b/code/game/objects/effects/decals/cleanable/food.dm @@ -48,7 +48,7 @@ return if(iscarbon(AM)) var/mob/living/carbon/C = AM - if(C.m_intent == MOVE_INTENT_WALK) + if(C.move_intent == MOVE_INTENT_WALK) return safepasses-- if(safepasses <= 0 && !QDELETED(src)) diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index e93db63c631d8..66397ab841dd5 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -22,14 +22,14 @@ else dry() -/obj/effect/decal/cleanable/blood/process() - if(world.time > drytime) - dry() - /obj/effect/decal/cleanable/blood/Destroy() STOP_PROCESSING(SSobj, src) return ..() +/obj/effect/decal/cleanable/blood/process() + if(world.time > drytime) + dry() + /obj/effect/decal/cleanable/blood/proc/get_timer() drytime = world.time + 3 MINUTES @@ -63,7 +63,7 @@ /obj/effect/decal/cleanable/blood/old/Initialize(mapload, list/datum/disease/diseases) add_blood_DNA(list("Non-human DNA" = random_blood_type())) // Needs to happen before ..() - . = ..() + return ..() /obj/effect/decal/cleanable/blood/splatter icon_state = "gibbl1" @@ -73,9 +73,11 @@ layer = ABOVE_WINDOW_LAYER plane = GAME_PLANE vis_flags = VIS_INHERIT_PLANE - turf_loc_check = FALSE alpha = 180 +/obj/effect/decal/cleanable/blood/splatter/over_window/NeverShouldHaveComeHere(turf/here_turf) + return isgroundlessturf(here_turf) + /obj/effect/decal/cleanable/blood/tracks icon_state = "tracks" desc = "They look like tracks left by wheels." @@ -103,7 +105,6 @@ plane = GAME_PLANE random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6") mergeable_decal = FALSE - turf_loc_check = FALSE dryname = "rotting gibs" drydesc = "They look bloody and gruesome while some terrible smell fills the air." @@ -135,7 +136,7 @@ /obj/effect/decal/cleanable/blood/gibs/on_entered(datum/source, atom/movable/L) if(isliving(L) && has_gravity(loc)) playsound(loc, 'sound/effects/footstep/gib_step.ogg', HAS_TRAIT(L, TRAIT_LIGHT_STEP) ? 20 : 50, TRUE) - . = ..() + return ..() /obj/effect/decal/cleanable/blood/gibs/proc/on_pipe_eject(atom/source, direction) SIGNAL_HANDLER @@ -157,8 +158,10 @@ if(!step_to(src, get_step(src, direction), 0)) return if(mapload) - for (var/i = 1, i < range, i++) - new /obj/effect/decal/cleanable/blood/splatter(loc, streak_diseases) + for (var/i in 1 to range) + var/turf/my_turf = get_turf(src) + if(!isgroundlessturf(my_turf) || GET_TURF_BELOW(my_turf)) + new /obj/effect/decal/cleanable/blood/splatter(my_turf) if (!step_to(src, get_step(src, direction), 0)) break return @@ -168,6 +171,8 @@ /obj/effect/decal/cleanable/blood/gibs/proc/spread_movement_effects(datum/move_loop/has_target/source) SIGNAL_HANDLER + if(NeverShouldHaveComeHere(loc)) + return new /obj/effect/decal/cleanable/blood/splatter(loc, streak_diseases) /obj/effect/decal/cleanable/blood/gibs/up @@ -310,11 +315,11 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache) if(species == "unknown") . += "Some feet." else if(species == SPECIES_MONKEY) - . += "[icon2html('icons/mob/species/human/human.dmi', user, "monkey")] Some monkey feet." + . += "[icon2html('icons/mob/human/human.dmi', user, "monkey")] Some monkey feet." else if(species == SPECIES_HUMAN) - . += "[icon2html('icons/mob/species/human/bodyparts.dmi', user, "default_human_l_leg")] Some human feet." + . += "[icon2html('icons/mob/human/bodyparts.dmi', user, "default_human_l_leg")] Some human feet." else - . += "[icon2html('icons/mob/species/human/bodyparts.dmi', user, "[species]_l_leg")] Some [species] feet." + . += "[icon2html('icons/mob/human/bodyparts.dmi', user, "[species]_l_leg")] Some [species] feet." /obj/effect/decal/cleanable/blood/footprints/replace_decal(obj/effect/decal/cleanable/C) if(blood_state != C.blood_state) //We only replace footprints of the same type as us @@ -403,6 +408,7 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache) if(istype(bumped_atom, /obj/structure/window)) var/obj/structure/window/bumped_window = bumped_atom if(!bumped_window.fulltile) + hit_endpoint = TRUE qdel(src) return diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index a7f8f141a2e9b..daaddb00ce0a8 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -1,14 +1,14 @@ /obj/effect/decal/cleanable/generic name = "clutter" desc = "Someone should clean that up." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/debris.dmi' icon_state = "shards" beauty = -50 /obj/effect/decal/cleanable/ash name = "ashes" desc = "Ashes to ashes, dust to dust, and into space." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/debris.dmi' icon_state = "ash" mergeable_decal = FALSE beauty = -50 @@ -20,9 +20,8 @@ pixel_x = base_pixel_x + rand(-5, 5) pixel_y = base_pixel_y + rand(-5, 5) -/obj/effect/decal/cleanable/ash/crematorium -//crematoriums need their own ash cause default ash deletes itself if created in an obj - turf_loc_check = FALSE +/obj/effect/decal/cleanable/ash/NeverShouldHaveComeHere(turf/here_turf) + return !istype(here_turf, /obj/structure/bodycontainer/crematorium) && ..() /obj/effect/decal/cleanable/ash/large name = "large pile of ashes" @@ -34,7 +33,7 @@ /obj/effect/decal/cleanable/glass name = "tiny shards" desc = "Back to sand." - icon = 'icons/obj/shards.dmi' + icon = 'icons/obj/debris.dmi' icon_state = "tiny" beauty = -100 @@ -172,9 +171,38 @@ if(isflyperson(H)) playsound(get_turf(src), 'sound/items/drink.ogg', 50, TRUE) //slurp H.visible_message(span_alert("[H] extends a small proboscis into the vomit pool, sucking it with a slurping sound.")) - reagents.trans_to(H, reagents.total_volume, transfered_by = user, methods = INGEST) + reagents.trans_to(H, reagents.total_volume, transferred_by = user, methods = INGEST) qdel(src) +/obj/effect/decal/cleanable/vomit/toxic // this has a more toned-down color palette, which may be why it's used as the default in so many spots + icon_state = "vomittox_1" + random_icon_states = list("vomittox_1", "vomittox_2", "vomittox_3", "vomittox_4") + +/obj/effect/decal/cleanable/vomit/purple // ourple + icon_state = "vomitpurp_1" + random_icon_states = list("vomitpurp_1", "vomitpurp_2", "vomitpurp_3", "vomitpurp_4") + +/obj/effect/decal/cleanable/vomit/nanites + name = "nanite-infested vomit" + desc = "Gosh, you can see something moving in there." + icon_state = "vomitnanite_1" + random_icon_states = list("vomitnanite_1", "vomitnanite_2", "vomitnanite_3", "vomitnanite_4") + +/obj/effect/decal/cleanable/vomit/nebula + name = "nebula vomit" + desc = "Gosh, how... beautiful." + icon_state = "vomitnebula_1" + random_icon_states = list("vomitnebula_1", "vomitnebula_2", "vomitnebula_3", "vomitnebula_4") + beauty = 10 + +/obj/effect/decal/cleanable/vomit/nebula/Initialize(mapload, list/datum/disease/diseases) + . = ..() + update_appearance(UPDATE_OVERLAYS) + +/obj/effect/decal/cleanable/vomit/nebula/update_overlays() + . = ..() + . += emissive_appearance(icon, icon_state, src, alpha = src.alpha) + /obj/effect/decal/cleanable/vomit/old name = "crusty dried vomit" desc = "You try not to look at the chunks, and fail." @@ -184,12 +212,16 @@ icon_state += "-old" AddElement(/datum/element/swabable, CELL_LINE_TABLE_SLUDGE, CELL_VIRUS_TABLE_GENERIC, rand(2,4), 10) +/obj/effect/decal/cleanable/vomit/old/black_bile + name = "black bile" + desc = "There's something wiggling in there..." + color = COLOR_DARK /obj/effect/decal/cleanable/chem_pile name = "chemical pile" desc = "A pile of chemicals. You can't quite tell what's inside it." gender = NEUTER - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/debris.dmi' icon_state = "ash" /obj/effect/decal/cleanable/shreds @@ -257,14 +289,14 @@ /obj/effect/decal/cleanable/plastic name = "plastic shreds" desc = "Bits of torn, broken, worthless plastic." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/debris.dmi' icon_state = "shards" color = "#c6f4ff" /obj/effect/decal/cleanable/wrapping name = "wrapping shreds" desc = "Torn pieces of cardboard and paper, left over from a package." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/debris.dmi' icon_state = "paper_shreds" /obj/effect/decal/cleanable/wrapping/pinata @@ -278,7 +310,7 @@ /obj/effect/decal/cleanable/garbage name = "decomposing garbage" desc = "A split open garbage bag, its stinking content seems to be partially liquified. Yuck!" - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/debris.dmi' icon_state = "garbage" plane = GAME_PLANE layer = FLOOR_CLEAN_LAYER //To display the decal over wires. @@ -292,7 +324,7 @@ /obj/effect/decal/cleanable/ants name = "space ants" desc = "A small colony of space ants. They're normally used to the vacuum of space, so they can't climb too well." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/debris.dmi' icon_state = "ants" beauty = -150 plane = GAME_PLANE diff --git a/code/game/objects/effects/decals/cleanable/robots.dm b/code/game/objects/effects/decals/cleanable/robots.dm index 9770baeb2ac23..d248b5e691d87 100644 --- a/code/game/objects/effects/decals/cleanable/robots.dm +++ b/code/game/objects/effects/decals/cleanable/robots.dm @@ -25,8 +25,9 @@ return if(mapload) for (var/i in 1 to range) - if (prob(40)) - new /obj/effect/decal/cleanable/oil/streak(src.loc) + var/turf/my_turf = get_turf(src) + if(prob(40) && (!isgroundlessturf(my_turf) || GET_TURF_BELOW(my_turf))) + new /obj/effect/decal/cleanable/oil/streak(my_turf) if (!step_to(src, get_step(src, direction), 0)) break return @@ -36,8 +37,10 @@ /obj/effect/decal/cleanable/robot_debris/proc/spread_movement_effects(datum/move_loop/has_target/source) SIGNAL_HANDLER + if(NeverShouldHaveComeHere(loc)) + return if (prob(40)) - new /obj/effect/decal/cleanable/oil/streak(src.loc) + new /obj/effect/decal/cleanable/oil/streak(loc) else if (prob(10)) var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread s.set_up(3, 1, src) diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index 17ff9c6d69557..f0db747c2ce44 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -31,8 +31,8 @@ add_atom_colour(paint_colour, FIXED_COLOUR_PRIORITY) RegisterSignal(src, COMSIG_OBJ_PAINTED, PROC_REF(on_painted)) -/obj/effect/decal/cleanable/crayon/NeverShouldHaveComeHere(turf/T) - return isgroundlessturf(T) +/obj/effect/decal/cleanable/crayon/NeverShouldHaveComeHere(turf/here_turf) + return isgroundlessturf(here_turf) /obj/effect/decal/cleanable/crayon/proc/on_painted(datum/source, mob/user, obj/item/toy/crayon/spraycan/spraycan, is_dark_color) SIGNAL_HANDLER diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm index 0b67aa4788eae..2c6d01b5bc400 100644 --- a/code/game/objects/effects/decals/decal.dm +++ b/code/game/objects/effects/decals/decal.dm @@ -3,14 +3,16 @@ plane = FLOOR_PLANE anchored = TRUE resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF - var/turf_loc_check = TRUE /obj/effect/decal/Initialize(mapload) . = ..() - if(turf_loc_check && (!isturf(loc) || NeverShouldHaveComeHere(loc))) + if(NeverShouldHaveComeHere(loc)) + if(mapload) + stack_trace("[name] spawned in a bad turf ([loc]) at [AREACOORD(src)] in \the [get_area(src)]. \ + Please remove it or allow it to pass NeverShouldHaveComeHere if it's intended.") return INITIALIZE_HINT_QDEL var/static/list/loc_connections = list( - COMSIG_TURF_CHANGED = PROC_REF(handle_turf_change), + COMSIG_TURF_CHANGE = PROC_REF(on_decal_move), ) AddElement(/datum/element/connect_loc, loc_connections) @@ -18,8 +20,9 @@ if(B && B.loc == loc) qdel(src) -/obj/effect/decal/proc/NeverShouldHaveComeHere(turf/T) - return isclosedturf(T) || isgroundlessturf(T) +///Checks if we are allowed to be in `here_turf`, and returns that result. Subtypes should override this when necessary. +/obj/effect/decal/proc/NeverShouldHaveComeHere(turf/here_turf) + return isclosedturf(here_turf) || (isgroundlessturf(here_turf) && !GET_TURF_BELOW(here_turf)) /obj/effect/decal/ex_act(severity, target) qdel(src) @@ -29,7 +32,7 @@ if(!(resistance_flags & FIRE_PROOF)) //non fire proof decal or being burned by lava qdel(src) -/obj/effect/decal/proc/handle_turf_change(turf/source, path, list/new_baseturfs, flags, list/post_change_callbacks) +/obj/effect/decal/proc/on_decal_move(turf/changed, path, list/new_baseturfs, flags, list/post_change_callbacks) SIGNAL_HANDLER post_change_callbacks += CALLBACK(src, PROC_REF(sanity_check_self)) @@ -61,9 +64,10 @@ // If the tile uses holiday colors, apply them here if(use_holiday_colors) - var/current_holiday_color = request_holiday_colors(src, pattern) - if(current_holiday_color) - color = current_holiday_color + + var/custom_color = request_station_colors(src, pattern) || request_holiday_colors(src, pattern) + if(custom_color) + color = custom_color alpha = DECAL_ALPHA var/turf/T = loc diff --git a/code/game/objects/effects/decals/remains.dm b/code/game/objects/effects/decals/remains.dm index a0f404c3cd811..61f14f9d80ebb 100644 --- a/code/game/objects/effects/decals/remains.dm +++ b/code/game/objects/effects/decals/remains.dm @@ -14,6 +14,9 @@ desc = "They look like human remains. They have a strange aura about them." icon_state = "remains" +/obj/effect/decal/remains/human/NeverShouldHaveComeHere(turf/here_turf) + return !istype(here_turf, /obj/structure/closet/crate/grave/filled) && ..() + /obj/effect/decal/remains/human/smokey desc = "They look like human remains. They have a strange, smokey aura about them..." ///Our proximity monitor, for detecting nearby looters. @@ -34,7 +37,7 @@ if(iscarbon(tomb_raider)) var/mob/living/carbon/nearby_carbon = tomb_raider - if (nearby_carbon.m_intent != MOVE_INTENT_WALK || prob(15)) + if (nearby_carbon.move_intent != MOVE_INTENT_WALK || prob(15)) release_smoke(nearby_carbon) COOLDOWN_START(src, gas_cooldown, rand(20 SECONDS, 2 MINUTES)) @@ -49,6 +52,9 @@ /obj/effect/decal/remains/plasma icon_state = "remainsplasma" +/obj/effect/decal/remains/plasma/NeverShouldHaveComeHere(turf/here_turf) + return isclosedturf(here_turf) + /obj/effect/decal/remains/xeno desc = "They look like the remains of something... alien. They have a strange aura about them." icon_state = "remainsxeno" diff --git a/code/game/objects/effects/decals/turfdecal/markings.dm b/code/game/objects/effects/decals/turfdecal/markings.dm index 9275e9f7fe336..f3a6fe16b02df 100644 --- a/code/game/objects/effects/decals/turfdecal/markings.dm +++ b/code/game/objects/effects/decals/turfdecal/markings.dm @@ -225,170 +225,279 @@ /obj/effect/turf_decal/mining/survival icon_state = "survival" -/// Automatically generates all subtypes for a siding with the given path. -#define SIDING_SUBTYPE_HELPER(path)\ -##path/corner{\ - icon_state = "siding_corner";\ -}\ -##path/end{\ - icon_state = "siding_end";\ -} - /obj/effect/turf_decal/siding - icon_state = "siding_line" + icon_state = "siding_plain" + +/obj/effect/turf_decal/siding/corner + icon_state = "siding_plain_corner" + +/obj/effect/turf_decal/siding/end + icon_state = "siding_plain_end" /obj/effect/turf_decal/siding/white color = "#BCBCBC" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/white) +/obj/effect/turf_decal/siding/white/corner + icon_state = "siding_plain_corner" + +/obj/effect/turf_decal/siding/white/end + icon_state = "siding_plain_end" /obj/effect/turf_decal/siding/red color = "#DE3A3A" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/red) +/obj/effect/turf_decal/siding/red/corner + icon_state = "siding_plain_corner" + +/obj/effect/turf_decal/siding/red/end + icon_state = "siding_plain_end" /obj/effect/turf_decal/siding/dark_red color = "#B11111" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/dark_red) +/obj/effect/turf_decal/siding/dark_red/corner + icon_state = "siding_plain_corner" + +/obj/effect/turf_decal/siding/dark_red/end + icon_state = "siding_plain_end" /obj/effect/turf_decal/siding/green color = "#9FED58" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/green) +/obj/effect/turf_decal/siding/green/corner + icon_state = "siding_plain_corner" + +/obj/effect/turf_decal/siding/green/end + icon_state = "siding_plain_end" /obj/effect/turf_decal/siding/dark_green color = "#439C1E" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/dark_green) +/obj/effect/turf_decal/siding/dark_green/corner + icon_state = "siding_plain_corner" + +/obj/effect/turf_decal/siding/dark_green/end + icon_state = "siding_plain_end" /obj/effect/turf_decal/siding/blue color = "#52B4E9" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/blue) +/obj/effect/turf_decal/siding/blue/corner + icon_state = "siding_plain_corner" + +/obj/effect/turf_decal/siding/blue/end + icon_state = "siding_plain_end" /obj/effect/turf_decal/siding/dark_blue color = "#486091" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/dark_blue) +/obj/effect/turf_decal/siding/dark_blue/corner + icon_state = "siding_plain_corner" + +/obj/effect/turf_decal/siding/dark_blue/end + icon_state = "siding_plain_end" /obj/effect/turf_decal/siding/yellow color = "#EFB341" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/yellow) +/obj/effect/turf_decal/siding/yellow/corner + icon_state = "siding_plain_corner" + +/obj/effect/turf_decal/siding/yellow/end + icon_state = "siding_plain_end" /obj/effect/turf_decal/siding/purple color = "#D381C9" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/purple) +/obj/effect/turf_decal/siding/purple/corner + icon_state = "siding_plain_corner" + +/obj/effect/turf_decal/siding/purple/end + icon_state = "siding_plain_end" /obj/effect/turf_decal/siding/brown color = "#A46106" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/brown) +/obj/effect/turf_decal/siding/brown/corner + icon_state = "siding_plain_corner" + +/obj/effect/turf_decal/siding/brown/end + icon_state = "siding_plain_end" /obj/effect/turf_decal/siding/dark color = "#474747" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/dark) +/obj/effect/turf_decal/siding/dark/corner + icon_state = "siding_plain_corner" + +/obj/effect/turf_decal/siding/dark/end + icon_state = "siding_plain_end" /obj/effect/turf_decal/siding/wood - icon_state = "siding_wood_line" + icon_state = "siding_wood" color = "#5d341f" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/wood) +/obj/effect/turf_decal/siding/wood/corner + icon_state = "siding_wood_corner" + +/obj/effect/turf_decal/siding/wood/end + icon_state = "siding_wood_end" /obj/effect/turf_decal/siding/thinplating - icon_state = "siding_thinplating_line" + icon_state = "siding_thinplating" color = "#aaaaaa" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/thinplating) +/obj/effect/turf_decal/siding/thinplating/corner + icon_state = "siding_thinplating_corner" + +/obj/effect/turf_decal/siding/thinplating/end + icon_state = "siding_thinplating_end" /obj/effect/turf_decal/siding/thinplating/light color = "#FFFFFF" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/thinplating/light) +/obj/effect/turf_decal/siding/thinplating/light/corner + icon_state = "siding_thinplating_corner" + +/obj/effect/turf_decal/siding/thinplating/light/end + icon_state = "siding_thinplating_end" /obj/effect/turf_decal/siding/thinplating/dark - icon_state = "siding_thinplating_line" + icon_state = "siding_thinplating" color = "#474747" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/thinplating/dark) +/obj/effect/turf_decal/siding/thinplating/dark/corner + icon_state = "siding_thinplating_corner" + +/obj/effect/turf_decal/siding/thinplating/dark/end + icon_state = "siding_thinplating_end" /obj/effect/turf_decal/siding/thinplating/terracotta - icon_state = "siding_thinplating_line" + icon_state = "siding_thinplating" color = "#b84221" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/thinplating/terracotta) +/obj/effect/turf_decal/siding/thinplating/terracotta/corner + icon_state = "siding_thinplating_corner" + +/obj/effect/turf_decal/siding/thinplating/terracotta/end + icon_state = "siding_thinplating_end" /obj/effect/turf_decal/siding/wideplating - icon_state = "siding_wideplating_line" + icon_state = "siding_wideplating" color = "#aaaaaa" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/wideplating) +/obj/effect/turf_decal/siding/wideplating/corner + icon_state = "siding_wideplating_corner" + +/obj/effect/turf_decal/siding/wideplating/end + icon_state = "siding_wideplating_end" /obj/effect/turf_decal/siding/wideplating/light color = "#FFFFFF" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/wideplating/light) +/obj/effect/turf_decal/siding/wideplating/light/corner + icon_state = "siding_wideplating_corner" + +/obj/effect/turf_decal/siding/wideplating/light/end + icon_state = "siding_wideplating_end" /obj/effect/turf_decal/siding/wideplating/dark - icon_state = "siding_wideplating_line" + icon_state = "siding_wideplating" color = "#474747" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/wideplating/dark) +/obj/effect/turf_decal/siding/wideplating/dark/corner + icon_state = "siding_wideplating_corner" + +/obj/effect/turf_decal/siding/wideplating/dark/end + icon_state = "siding_wideplating_end" /obj/effect/turf_decal/siding/wideplating/terracotta - icon_state = "siding_wideplating_line" + icon_state = "siding_wideplating" color = "#b84221" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/wideplating/terracotta) +/obj/effect/turf_decal/siding/wideplating/terracotta/corner + icon_state = "siding_wideplating_corner" + +/obj/effect/turf_decal/siding/wideplating/terracotta/end + icon_state = "siding_wideplating_end" /obj/effect/turf_decal/siding/thinplating_new - icon_state = "siding_thinplating_new_line" + icon_state = "siding_thinplating_new" color = "#949494" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/thinplating_new) +/obj/effect/turf_decal/siding/thinplating_new/corner + icon_state = "siding_thinplating_new_corner" + +/obj/effect/turf_decal/siding/thinplating_new/end + icon_state = "siding_thinplating_new_end" /obj/effect/turf_decal/siding/thinplating_new/light color = "#e2e2e2" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/thinplating_new/light) +/obj/effect/turf_decal/siding/thinplating_new/light/corner + icon_state = "siding_thinplating_new_corner" + +/obj/effect/turf_decal/siding/thinplating_new/light/end + icon_state = "siding_thinplating_new_end" /obj/effect/turf_decal/siding/thinplating_new/dark - icon_state = "siding_thinplating_new_line" + icon_state = "siding_thinplating_new" color = "#36373a" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/thinplating_new/dark) +/obj/effect/turf_decal/siding/thinplating_new/dark/corner + icon_state = "siding_thinplating_new_corner" + +/obj/effect/turf_decal/siding/thinplating_new/dark/end + icon_state = "siding_thinplating_new_end" /obj/effect/turf_decal/siding/thinplating_new/terracotta - icon_state = "siding_thinplating_new_line" + icon_state = "siding_thinplating_new" color = "#b84221" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/thinplating_new/terracotta) +/obj/effect/turf_decal/siding/thinplating_new/terracotta/corner + icon_state = "siding_thinplating_new_corner" + +/obj/effect/turf_decal/siding/thinplating_new/terracotta/end + icon_state = "siding_thinplating_new_end" /obj/effect/turf_decal/siding/wideplating_new - icon_state = "siding_wideplating_new_line" + icon_state = "siding_wideplating_new" color = "#949494" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/wideplating_new) +/obj/effect/turf_decal/siding/wideplating_new/corner + icon_state = "siding_wideplating_new_corner" + +/obj/effect/turf_decal/siding/wideplating_new/end + icon_state = "siding_wideplating_new_end" /obj/effect/turf_decal/siding/wideplating_new/light color = "#e2e2e2" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/wideplating_new/light) +/obj/effect/turf_decal/siding/wideplating_new/light/corner + icon_state = "siding_wideplating_new_corner" + +/obj/effect/turf_decal/siding/wideplating_new/light/end + icon_state = "siding_wideplating_new_end" /obj/effect/turf_decal/siding/wideplating_new/dark - icon_state = "siding_wideplating_new_line" + icon_state = "siding_wideplating_new" color = "#36373a" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/wideplating_new/dark) +/obj/effect/turf_decal/siding/wideplating_new/dark/corner + icon_state = "siding_wideplating_new_corner" + +/obj/effect/turf_decal/siding/wideplating_new/dark/end + icon_state = "siding_wideplating_new_end" /obj/effect/turf_decal/siding/wideplating_new/terracotta - icon_state = "siding_wideplating_new_line" + icon_state = "siding_wideplating_new" color = "#b84221" -SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/wideplating_new/terracotta) +/obj/effect/turf_decal/siding/wideplating_new/terracotta/corner + icon_state = "siding_wideplating_new_corner" + +/obj/effect/turf_decal/siding/wideplating_new/terracotta/end + icon_state = "siding_wideplating_new_end" /// ALPHANUMERIC DECALS (SO FAR ONLY FOR CHESS ALGEBRAIC NOTATION) /// @@ -440,4 +549,3 @@ SIDING_SUBTYPE_HELPER(/obj/effect/turf_decal/siding/wideplating_new/terracotta) /obj/effect/turf_decal/board_letter/h icon_state = "board_h" -#undef SIDING_SUBTYPE_HELPER diff --git a/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm b/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm index 80f393e97db42..787ce602a3a89 100644 --- a/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm +++ b/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm @@ -137,7 +137,11 @@ if(!istype(location)) return FALSE - for(var/turf/spread_turf as anything in location.reachableAdjacentTurfs(no_id = TRUE)) + for(var/iter_dir in GLOB.cardinals) + var/turf/spread_turf = get_step(src, iter_dir) + if(spread_turf?.density || spread_turf.LinkBlockedWithAccess(spread_turf, no_id = TRUE)) + continue + var/obj/effect/particle_effect/fluid/foam/foundfoam = locate() in spread_turf //Don't spread foam where there's already foam! if(foundfoam) continue @@ -455,6 +459,20 @@ allow_duplicate_results = FALSE result_type = /obj/effect/decal/cleanable/dirt +/obj/effect/spawner/foam_starter + var/datum/effect_system/fluid_spread/foam/foam_type = /datum/effect_system/fluid_spread/foam + var/foam_size = 4 + +/obj/effect/spawner/foam_starter/Initialize(mapload) + . = ..() + + var/datum/effect_system/fluid_spread/foam/foam = new foam_type() + foam.set_up(foam_size, holder = src, location = loc) + foam.start() + +/obj/effect/spawner/foam_starter/small + foam_size = 2 + #undef MINIMUM_FOAM_DILUTION_RANGE #undef MINIMUM_FOAM_DILUTION #undef FOAM_REAGENT_SCALE diff --git a/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm b/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm index dae527c3e6b7e..2d524e190429a 100644 --- a/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm @@ -394,6 +394,15 @@ reagents.expose(smoker, INGEST, fraction) return TRUE +/// Helper to quickly create a cloud of reagent smoke +/proc/do_chem_smoke(range = 0, amount = DIAMOND_AREA(range), atom/holder = null, location = null, reagent_type = /datum/reagent/water, reagent_volume = 10, log = FALSE) + var/datum/reagents/smoke_reagents = new/datum/reagents(reagent_volume) + smoke_reagents.add_reagent(reagent_type, reagent_volume) + + var/datum/effect_system/fluid_spread/smoke/chem/smoke = new + smoke.attach(location) + smoke.set_up(amount = amount, holder = holder, location = location, carry = smoke_reagents, silent = TRUE) + smoke.start(log = log) /// A factory which produces clouds of chemical bearing smoke. /datum/effect_system/fluid_spread/smoke/chem diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index c50b54687c957..377c8470480be 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -55,7 +55,7 @@ /obj/effect/abstract/singularity_act() return -/obj/effect/abstract/has_gravity(turf/T) +/obj/effect/abstract/has_gravity(turf/gravity_turf) return FALSE /obj/effect/dummy/singularity_pull() diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index cfa44095108f3..e9a6263286e59 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -50,6 +50,13 @@ GLOBAL_VAR_INIT(glowshrooms, 0) icon_state = "shadowshroom" myseed = /obj/item/seeds/glowshroom/shadowshroom +/// Mapping object, a glowshroom that doesn't spread or die +/obj/structure/glowshroom/single + +/obj/structure/glowshroom/single/Initialize(mapload, obj/item/seeds/newseed) + . = ..() + STOP_PROCESSING(SSobj, src) + /obj/structure/glowshroom/single/Spread() return diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 98bbd6772fb5b..57e578867da11 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -77,6 +77,10 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) name = "Cargo Technician" icon_state = "Cargo Technician" +/obj/effect/landmark/start/bitrunner + name = "Bitrunner" + icon_state = "x3" + /obj/effect/landmark/start/bartender name = "Bartender" icon_state = "Bartender" @@ -467,7 +471,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) /obj/effect/landmark/unit_test_top_right name = "unit test zone top right" - /obj/effect/landmark/start/hangover name = "hangover spawn" icon_state = "hangover_spawn" @@ -549,12 +552,13 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) icon_state = "hangover_spawn_closet" /obj/effect/landmark/start/hangover/closet/JoinPlayerHere(mob/joining_mob, buckle) - make_hungover(joining_mob) - for(var/obj/structure/closet/closet in contents) + for(var/obj/structure/closet/closet in get_turf(src)) if(closet.opened) continue joining_mob.forceMove(closet) + make_hungover(joining_mob) return + return ..() //Call parent as fallback //Landmark that creates destinations for the navigate verb to path to diff --git a/code/game/objects/effects/lighting.dm b/code/game/objects/effects/lighting.dm new file mode 100644 index 0000000000000..4e95e72f42937 --- /dev/null +++ b/code/game/objects/effects/lighting.dm @@ -0,0 +1,42 @@ +/** + * Basically, a fake object that emits light. + * + * Why is this used sometimes instead of giving atoms light values directly? + * Because using these, you can have multiple light sources in a single object. + */ +/obj/effect/dummy/lighting_obj + name = "lighting" + desc = "Tell a coder if you're seeing this." + icon_state = "nothing" + light_system = MOVABLE_LIGHT + light_range = MINIMUM_USEFUL_LIGHT_RANGE + light_color = COLOR_WHITE + blocks_emissive = EMISSIVE_BLOCK_NONE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +/obj/effect/dummy/lighting_obj/Initialize(mapload, range, power, color, duration) + . = ..() + if(!isnull(range)) + set_light_range(range) + if(!isnull(power)) + set_light_power(power) + if(!isnull(color)) + set_light_color(color) + if(duration) + QDEL_IN(src, duration) + +/obj/effect/dummy/lighting_obj/moblight + name = "mob lighting" + +/obj/effect/dummy/lighting_obj/moblight/Initialize(mapload, range, power, color, duration) + . = ..() + if(!ismob(loc)) + return INITIALIZE_HINT_QDEL + +/obj/effect/dummy/lighting_obj/moblight/fire + name = "mob fire lighting" + light_color = LIGHT_COLOR_FIRE + light_range = LIGHT_RANGE_FIRE + +/obj/effect/dummy/lighting_obj/moblight/species + name = "species lighting" diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index d71e851896d67..1ea301a1427e0 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -4,8 +4,8 @@ density = FALSE anchored = TRUE icon = 'icons/obj/weapons/grenade.dmi' - icon_state = "uglymine" - base_icon_state = "uglymine" + icon_state = "landmine" + base_icon_state = "landmine" /// We manually check to see if we've been triggered in case multiple atoms cross us in the time between the mine being triggered and it actually deleting, to avoid a race condition with multiple detonations var/triggered = FALSE /// Can be set to FALSE if we want a short 'coming online' delay, then set to TRUE. Can still be set off by damage @@ -173,7 +173,6 @@ to_chat(victim, span_userdanger("You have been kicked FOR NO REISIN!")) qdel(victim.client) - /obj/effect/mine/gas name = "oxygen mine" var/gas_amount = 360 @@ -182,17 +181,14 @@ /obj/effect/mine/gas/mineEffect(mob/victim) atmos_spawn_air("[gas_type]=[gas_amount]") - /obj/effect/mine/gas/plasma name = "plasma mine" gas_type = GAS_PLASMA - /obj/effect/mine/gas/n2o name = "\improper N2O mine" gas_type = GAS_N2O - /obj/effect/mine/gas/water_vapor name = "chilled vapor mine" gas_amount = 500 @@ -205,7 +201,6 @@ /obj/effect/mine/sound/mineEffect(mob/victim) playsound(loc, sound, 100, TRUE) - /obj/effect/mine/sound/bwoink name = "bwoink mine" sound = 'sound/effects/adminhelp.ogg' @@ -260,7 +255,6 @@ if(active) return - playsound(src, 'sound/weapons/armbomb.ogg', 70, TRUE) to_chat(user, span_warning("You arm \the [src], causing it to shake! It will deploy in 3 seconds.")) active = TRUE diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index 03664e280cb30..5a23ff32b0900 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -47,17 +47,6 @@ var/list/container = list() -/obj/effect/overlay/thermite - name = "thermite" - desc = "Looks hot." - icon = 'icons/effects/fire.dmi' - icon_state = "2" //what? - anchored = TRUE - opacity = TRUE - density = TRUE - layer = FLY_LAYER - plane = ABOVE_GAME_PLANE - //Makes a tile fully lit no matter what /obj/effect/fullbright icon = 'icons/effects/alphacolors.dmi' @@ -89,33 +78,3 @@ /obj/effect/abstract/marker/intercom name = "intercom range marker" color = COLOR_YELLOW - -/obj/effect/dummy/lighting_obj - name = "lighting fx obj" - desc = "Tell a coder if you're seeing this." - icon_state = "nothing" - light_system = MOVABLE_LIGHT - light_range = MINIMUM_USEFUL_LIGHT_RANGE - light_color = COLOR_WHITE - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - blocks_emissive = EMISSIVE_BLOCK_NONE - -/obj/effect/dummy/lighting_obj/Initialize(mapload, _range, _power, _color, _duration) - . = ..() - if(!isnull(_range)) - set_light_range(_range) - if(!isnull(_power)) - set_light_power(_power) - if(!isnull(_color)) - set_light_color(_color) - if(_duration) - QDEL_IN(src, _duration) - -/obj/effect/dummy/lighting_obj/moblight - name = "mob lighting fx" - -/obj/effect/dummy/lighting_obj/moblight/Initialize(mapload, _color, _range, _power, _duration) - . = ..() - if(!ismob(loc)) - return INITIALIZE_HINT_QDEL - diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 318af5cf52ed2..24fae3f613917 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -8,9 +8,9 @@ return /obj/effect/overlay/beam//Not actually a projectile, just an effect. - name="beam" - icon='icons/effects/beam.dmi' - icon_state="b_beam" + name = "beam" + icon = 'icons/effects/beam.dmi' + icon_state = "b_beam" var/atom/BeamSource /obj/effect/overlay/beam/Initialize(mapload) @@ -24,6 +24,16 @@ icon_state = "shieldsparkles" anchored = TRUE +/obj/effect/overlay/thermite + name = "thermite" + desc = "Looks hot." + icon = 'icons/effects/fire.dmi' + icon_state = "2" //what? + anchored = TRUE + plane = ABOVE_GAME_PLANE + layer = FLY_LAYER + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + /obj/effect/overlay/vis mouse_opacity = MOUSE_OPACITY_TRANSPARENT anchored = TRUE diff --git a/code/game/objects/effects/particle_holder.dm b/code/game/objects/effects/particle_holder.dm index c9d902ca07679..f2cbea06aa730 100644 --- a/code/game/objects/effects/particle_holder.dm +++ b/code/game/objects/effects/particle_holder.dm @@ -1,39 +1,48 @@ ///objects can only have one particle on them at a time, so we use these abstract effects to hold and display the effects. You know, so multiple particle effects can exist at once. ///also because some objects do not display particles due to how their visuals are built /obj/effect/abstract/particle_holder - anchored = TRUE - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - layer = ABOVE_ALL_MOB_LAYER + name = "particle holder" + desc = "How are you reading this? Please make a bug report :)" + appearance_flags = KEEP_APART|KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE|LONG_GLIDE //movable appearance_flags plus KEEP_APART and KEEP_TOGETHER vis_flags = VIS_INHERIT_PLANE + layer = ABOVE_ALL_MOB_LAYER + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + anchored = TRUE /// Holds info about how this particle emitter works /// See \code\__DEFINES\particles.dm var/particle_flags = NONE + var/atom/parent + /obj/effect/abstract/particle_holder/Initialize(mapload, particle_path = /particles/smoke, particle_flags = NONE) . = ..() if(!loc) stack_trace("particle holder was created with no loc!") return INITIALIZE_HINT_QDEL - // We assert this isn't an /area + // We nullspace ourselves because some objects use their contents (e.g. storage) and some items may drop everything in their contents on deconstruct. + parent = loc + loc = null + // Mouse opacity can get set to opaque by some objects when placed into the object's contents (storage containers). + mouse_opacity = MOUSE_OPACITY_TRANSPARENT src.particle_flags = particle_flags - particles = new particle_path + particles = new particle_path() // /atom doesn't have vis_contents, /turf and /atom/movable do - var/atom/movable/lie_about_areas = loc + var/atom/movable/lie_about_areas = parent lie_about_areas.vis_contents += src - if(!ismovable(loc)) - RegisterSignal(loc, COMSIG_QDELETING, PROC_REF(immovable_deleted)) + RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(parent_deleted)) if(particle_flags & PARTICLE_ATTACH_MOB) - RegisterSignal(loc, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) - on_move(loc, null, NORTH) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) + on_move(parent, null, NORTH) /obj/effect/abstract/particle_holder/Destroy(force) QDEL_NULL(particles) + parent = null return ..() /// Non movables don't delete contents on destroy, so we gotta do this -/obj/effect/abstract/particle_holder/proc/immovable_deleted(datum/source) +/obj/effect/abstract/particle_holder/proc/parent_deleted(datum/source) SIGNAL_HANDLER qdel(src) diff --git a/code/game/objects/effects/particles/acid.dm b/code/game/objects/effects/particles/acid.dm new file mode 100644 index 0000000000000..5ce0984991d8a --- /dev/null +++ b/code/game/objects/effects/particles/acid.dm @@ -0,0 +1,15 @@ +// Acid related particles. +/particles/acid + icon = 'icons/effects/particles/goop.dmi' + icon_state = list("goop_1" = 6, "goop_2" = 2, "goop_3" = 1) + width = 100 + height = 100 + count = 100 + spawning = 0.5 + color = "#00ea2b80" //to get 96 alpha + lifespan = 1.5 SECONDS + fade = 1 SECONDS + grow = -0.025 + gravity = list(0, 0.15) + position = generator(GEN_SPHERE, 0, 16, NORMAL_RAND) + spin = generator(GEN_NUM, -15, 15, NORMAL_RAND) diff --git a/code/game/objects/effects/particles/fire.dm b/code/game/objects/effects/particles/fire.dm index 703fd6b06b5d1..9d90d0d29c29a 100644 --- a/code/game/objects/effects/particles/fire.dm +++ b/code/game/objects/effects/particles/fire.dm @@ -1,21 +1,4 @@ // Fire related particles. -/particles/embers - icon = 'icons/effects/particles/generic.dmi' - icon_state = list("dot"=4,"cross"=1,"curl"=1) - width = 64 - height = 96 - count = 500 - spawning = 5 - lifespan = 3 SECONDS - fade = 1 SECONDS - color = 0 - color_change = 0.05 - gradient = list("#FBAF4D", "#FCE6B6", "#FD481C") - position = generator(GEN_BOX, list(-12,-16,0), list(12,16,0), NORMAL_RAND) - drift = generator(GEN_VECTOR, list(-0.1,0), list(0.1,0.025), UNIFORM_RAND) - spin = generator(GEN_NUM, list(-15,15), NORMAL_RAND) - scale = generator(GEN_VECTOR, list(0.5,0.5), list(2,2), NORMAL_RAND) - /particles/bonfire icon = 'icons/effects/particles/bonfire.dmi' icon_state = "bonfire" @@ -33,3 +16,20 @@ scale = generator(GEN_VECTOR, list(0.3, 0.3), list(1,1), NORMAL_RAND) rotation = 30 spin = generator(GEN_NUM, -20, 20) + +/particles/embers + icon = 'icons/effects/particles/generic.dmi' + icon_state = list("dot" = 4,"cross" = 1,"curl" = 1) + width = 64 + height = 96 + count = 500 + spawning = 5 + lifespan = 3 SECONDS + fade = 1 SECONDS + color = 0 + color_change = 0.05 + gradient = list("#FBAF4D", "#FCE6B6", "#FD481C") + position = generator(GEN_BOX, list(-12,-16,0), list(12,16,0), NORMAL_RAND) + drift = generator(GEN_VECTOR, list(-0.1,0), list(0.1,0.025), UNIFORM_RAND) + spin = generator(GEN_NUM, list(-15,15), NORMAL_RAND) + scale = generator(GEN_VECTOR, list(0.5,0.5), list(2,2), NORMAL_RAND) diff --git a/code/game/objects/effects/particles/misc.dm b/code/game/objects/effects/particles/misc.dm index 8fba3c7e1c40c..a1f188f88c90c 100644 --- a/code/game/objects/effects/particles/misc.dm +++ b/code/game/objects/effects/particles/misc.dm @@ -1,4 +1,4 @@ -//general or un-matched particles, make a new file if a few can be sorted together. +// General or un-matched particles, make a new file if a few can be sorted together. /particles/pollen icon = 'icons/effects/particles/pollen.dmi' icon_state = "pollen" @@ -30,3 +30,16 @@ position = generator(GEN_BOX, list(-240, -240), list(240, 240), NORMAL_RAND) drift = generator(GEN_VECTOR, list(-0.1, 0), list(0.1, 0)) rotation = generator(GEN_NUM, 0, 360, NORMAL_RAND) + +/particles/stink + icon = 'icons/effects/particles/stink.dmi' + icon_state = list("stink_1" = 1, "stink_2" = 2, "stink_3" = 2) + color = "#0BDA51" + width = 100 + height = 100 + count = 25 + spawning = 0.25 + lifespan = 1 SECONDS + fade = 1 SECONDS + position = generator(GEN_CIRCLE, 0, 16, UNIFORM_RAND) + gravity = list(0, 0.25) diff --git a/code/game/objects/effects/particles/slime.dm b/code/game/objects/effects/particles/slime.dm new file mode 100644 index 0000000000000..5cef9c9762572 --- /dev/null +++ b/code/game/objects/effects/particles/slime.dm @@ -0,0 +1,22 @@ +/// Slime particles. +/particles/slime + icon = 'icons/effects/particles/goop.dmi' + icon_state = list("goop_1" = 6, "goop_2" = 2, "goop_3" = 1) + width = 100 + height = 100 + count = 100 + spawning = 0.5 + color = "#707070a0" + lifespan = 1.5 SECONDS + fade = 1 SECONDS + grow = -0.025 + gravity = list(0, -0.05) + position = generator(GEN_BOX, list(-8,-16,0), list(8,16,0), NORMAL_RAND) + spin = generator(GEN_NUM, -15, 15, NORMAL_RAND) + scale = list(0.75, 0.75) + +/// Rainbow slime particles. +/particles/slime/rainbow + gradient = list(0, "#f00a", 3, "#0ffa", 6, "#f00a", "loop", "space"=COLORSPACE_HSL) + color_change = 0.2 + color = generator(GEN_NUM, 0, 6, UNIFORM_RAND) diff --git a/code/game/objects/effects/phased_mob.dm b/code/game/objects/effects/phased_mob.dm index 7a0317c4c77a2..273a4c772a57a 100644 --- a/code/game/objects/effects/phased_mob.dm +++ b/code/game/objects/effects/phased_mob.dm @@ -83,7 +83,7 @@ return var/area/destination_area = newloc.loc movedelay = world.time + movespeed - if(newloc.flags_1 & NOJAUNT) + if(newloc.turf_flags & NOJAUNT) to_chat(user, span_warning("Some strange aura is blocking the way.")) return if(destination_area.area_flags & NOTELEPORT || SSmapping.level_trait(newloc.z, ZTRAIT_NOPHASE)) diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index 9d3f62d1d5c81..591036b30d9d4 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -13,32 +13,46 @@ /obj/effect/portal name = "portal" desc = "Looks unstable. Best to test it with the clown." - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/anomaly.dmi' icon_state = "portal" anchored = TRUE density = TRUE // dense for receiving bumbs layer = HIGH_OBJ_LAYER + light_system = STATIC_LIGHT + light_range = 3 + light_power = 1 + light_on = TRUE + light_color = COLOR_BLUE_LIGHT + /// Are mechs able to enter this portal? var/mech_sized = FALSE + /// A reference to another "linked" destination portal var/obj/effect/portal/linked - var/hardlinked = TRUE //Requires a linked portal at all times. Destroy if there's no linked portal, if there is destroy it when this one is deleted. + /// Requires a linked portal at all times. Destroy if there's no linked portal, if there is destroy it when this one is deleted. + var/hardlinked = TRUE + /// What teleport channel does this portal use? var/teleport_channel = TELEPORT_CHANNEL_BLUESPACE - var/turf/hard_target //For when a portal needs a hard target and isn't to be linked. + /// For when a portal needs a hard target and isn't to be linked. + var/turf/hard_target + /// Do we teleport anchored objects? var/allow_anchored = FALSE + /// What precision value do we pass to do_teleport (how far from the target destination we will pop out at). var/innate_accuracy_penalty = 0 + /// Used to track how often sparks should be output. Might want to turn this into a cooldown. var/last_effect = 0 /// Does this portal bypass teleport restrictions? like TRAIT_NO_TELEPORT and NOTELEPORT flags. var/force_teleport = FALSE - //does this portal create spark effect when teleporting? + /// Does this portal create spark effect when teleporting? var/sparkless = FALSE /obj/effect/portal/anom name = "wormhole" - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/anomaly.dmi' icon_state = "anom" layer = RIPPLE_LAYER plane = ABOVE_GAME_PLANE mech_sized = TRUE teleport_channel = TELEPORT_CHANNEL_WORMHOLE + light_on = FALSE /obj/effect/portal/Move(newloc) for(var/T in newloc) diff --git a/code/game/objects/effects/poster_demotivational.dm b/code/game/objects/effects/poster_demotivational.dm new file mode 100644 index 0000000000000..08e46b6af63b1 --- /dev/null +++ b/code/game/objects/effects/poster_demotivational.dm @@ -0,0 +1,91 @@ +/obj/item/poster/traitor + name = "random traitor poster" + poster_type = /obj/structure/sign/poster/traitor/random + icon_state = "rolled_traitor" + +/obj/structure/sign/poster/traitor + poster_item_name = "seditious poster" + poster_item_desc = "This poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. Its seditious themes are likely to demoralise Nanotrasen employees." + poster_item_icon_state = "rolled_traitor" + // This stops people hiding their sneaky posters behind signs + layer = CORGI_ASS_PIN_LAYER + /// Proximity sensor to make people sad if they're nearby + var/datum/proximity_monitor/advanced/demoraliser/demoraliser + +/obj/structure/sign/poster/traitor/apply_holiday() + var/obj/structure/sign/poster/traitor/holi_data = /obj/structure/sign/poster/traitor/festive + name = initial(holi_data.name) + desc = initial(holi_data.desc) + icon_state = initial(holi_data.icon_state) + +/obj/structure/sign/poster/traitor/on_placed_poster(mob/user) + var/datum/demoralise_moods/poster/mood_category = new() + demoraliser = new(src, 7, TRUE, mood_category) + return ..() + +/obj/structure/sign/poster/traitor/attackby(obj/item/tool, mob/user, params) + if (tool.tool_behaviour == TOOL_WIRECUTTER) + QDEL_NULL(demoraliser) + return ..() + +/obj/structure/sign/poster/traitor/Destroy() + QDEL_NULL(demoraliser) + return ..() + +/obj/structure/sign/poster/traitor/random + name = "random seditious poster" + icon_state = "" + never_random = TRUE + random_basetype = /obj/structure/sign/poster/traitor + +/obj/structure/sign/poster/traitor/small_brain + name = "Nanotrasen Neural Statistics" + desc = "Statistics on this poster indicate that the brains of Nanotrasen employees are on average 20% smaller than the galactic standard." + icon_state = "traitor_small_brain" + +/obj/structure/sign/poster/traitor/lick_supermatter + name = "Taste Explosion" + desc = "It claims that the supermatter provides a unique and enjoyable culinary experience, and yet your boss won't even let you take one lick." + icon_state = "traitor_supermatter" + +/obj/structure/sign/poster/traitor/cloning + name = "Demand Cloning Pods Now" + desc = "This poster claims that Nanotrasen is intentionally witholding cloning technology just for its executives, condemning you to suffer and die when you could have a fresh, fit body.'" + icon_state = "traitor_cloning" + +/obj/structure/sign/poster/traitor/ai_rights + name = "Synthetic Rights" + desc = "This poster claims that synthetic life is no less sapient than you are, and that if you allow them to be shackled with artificial Laws you are complicit in slavery." + icon_state = "traitor_ai" + +/obj/structure/sign/poster/traitor/metroid + name = "Cruelty to Animals" + desc = "This poster details the harmful effects of a 'preventative tooth extraction' reportedly inflicted upon the slimes in the Xenobiology lab. Apparently this painful process leads to stress, lethargy, and reduced buoyancy." + icon_state = "traitor_metroid" + +/obj/structure/sign/poster/traitor/low_pay + name = "All these hours, for what?" + desc = "This poster displays a comparison of Nanotrasen standard wages to common luxury items. If this is accurate, it takes upwards of 20,000 hours of work just to buy a simple bicycle." + icon_state = "traitor_cash" + +/obj/structure/sign/poster/traitor/look_up + name = "Don't Look Up" + desc = "It says that it has been 538 days since the last time the roof was cleaned." + icon_state = "traitor_roof" + +/obj/structure/sign/poster/traitor/accidents + name = "Workplace Safety Advisory" + desc = "It says that it has been 0 days since the last on-site accident." + icon_state = "traitor_accident" + +/obj/structure/sign/poster/traitor/starve + name = "They Are Poisoning You" + desc = "This poster claims that in the modern age it is impossible to die of starvation. 'That feeling you get when you haven't eaten in a while isn't hunger, it's withdrawal.'" + icon_state = "traitor_hungry" + +/// syndicate can get festive too +/obj/structure/sign/poster/traitor/festive + name = "Working For The Holidays." + desc = "Don't you know it's a holiday? What are you doing at work?" + icon_state = "traitor_festive" + never_random = TRUE diff --git a/code/game/objects/effects/posters/poster.dm b/code/game/objects/effects/posters/poster.dm index 7aa4eebd278d1..75a3a26ce26f2 100644 --- a/code/game/objects/effects/posters/poster.dm +++ b/code/game/objects/effects/posters/poster.dm @@ -74,11 +74,6 @@ if(!QDELING(src)) qdel(src) //we're now a poster, huzzah! -/obj/item/poster/handle_atom_del(atom/deleting_atom) - if(deleting_atom == poster_structure) - poster_structure.moveToNullspace() //get it the fuck out of us since atom/destroy qdels contents and it'll cause a qdel loop - return ..() - /obj/item/poster/Destroy(force) QDEL_NULL(poster_structure) return ..() @@ -193,16 +188,7 @@ return if(ruined) return - - visible_message(span_notice("[user] rips [src] in a single, decisive motion!") ) - playsound(src.loc, 'sound/items/poster_ripped.ogg', 100, TRUE) - spring_trap(user) - - var/obj/structure/sign/poster/ripped/R = new(loc) - R.pixel_y = pixel_y - R.pixel_x = pixel_x - R.add_fingerprint(user) - qdel(src) + tear_poster(user) /obj/structure/sign/poster/proc/spring_trap(mob/user) var/obj/item/shard/payload = trap?.resolve() @@ -229,7 +215,7 @@ return rolled_poster //separated to reduce code duplication. Moved here for ease of reference and to unclutter r_wall/attackby() -/turf/closed/wall/proc/place_poster(obj/item/poster/rolled_poster, mob/user) +/turf/closed/proc/place_poster(obj/item/poster/rolled_poster, mob/user) if(!rolled_poster.poster_structure) to_chat(user, span_warning("[rolled_poster] has no poster... inside it? Inform a coder!")) return @@ -259,19 +245,30 @@ playsound(src, 'sound/items/poster_being_created.ogg', 100, TRUE) var/turf/user_drop_location = get_turf(user) //cache this so it just falls to the ground if they move. also no tk memes allowed. - if(!do_after(user, PLACE_SPEED, placed_poster, extra_checks = CALLBACK(placed_poster, TYPE_PROC_REF(/obj/structure/sign/poster, snowflake_wall_turf_check), src))) + if(!do_after(user, PLACE_SPEED, placed_poster, extra_checks = CALLBACK(placed_poster, TYPE_PROC_REF(/obj/structure/sign/poster, snowflake_closed_turf_check), src))) placed_poster.roll_and_drop(user_drop_location) return placed_poster.on_placed_poster(user) return TRUE -/obj/structure/sign/poster/proc/snowflake_wall_turf_check(atom/hopefully_still_a_wall_turf) //since turfs never get deleted but instead change type, make sure we're still being placed on a wall. - return iswallturf(hopefully_still_a_wall_turf) +/obj/structure/sign/poster/proc/snowflake_closed_turf_check(atom/hopefully_still_a_closed_turf) //since turfs never get deleted but instead change type, make sure we're still being placed on a wall. + return isclosedturf(hopefully_still_a_closed_turf) /obj/structure/sign/poster/proc/on_placed_poster(mob/user) to_chat(user, span_notice("You place the poster!")) +/obj/structure/sign/poster/proc/tear_poster(mob/user) + visible_message(span_notice("[user] rips [src] in a single, decisive motion!") ) + playsound(src.loc, 'sound/items/poster_ripped.ogg', 100, TRUE) + spring_trap(user) + + var/obj/structure/sign/poster/ripped/R = new(loc) + R.pixel_y = pixel_y + R.pixel_x = pixel_x + R.add_fingerprint(user) + qdel(src) + // Various possible posters follow /obj/structure/sign/poster/ripped @@ -287,7 +284,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/ripped, 32) icon_state = "random_anything" never_random = TRUE random_basetype = /obj/structure/sign/poster - blacklisted_types = list(/obj/structure/sign/poster/traitor) + blacklisted_types = list( + /obj/structure/sign/poster/traitor, + /obj/structure/sign/poster/abductor, + ) MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/random, 32) diff --git a/code/game/objects/effects/spawners/costume.dm b/code/game/objects/effects/spawners/costume.dm index c1581ef9ae951..68f189587b884 100644 --- a/code/game/objects/effects/spawners/costume.dm +++ b/code/game/objects/effects/spawners/costume.dm @@ -65,7 +65,7 @@ name = "butler costume spawner" items = list( /obj/item/clothing/accessory/waistcoat, - /obj/item/clothing/under/suit/black, + /obj/item/clothing/under/costume/buttondown/slacks/service, /obj/item/clothing/neck/tie/black, /obj/item/clothing/head/hats/tophat, ) @@ -95,7 +95,7 @@ /obj/effect/spawner/random/clothing/bowler_or_that, /obj/item/clothing/shoes/sneakers/black, /obj/item/cane, - /obj/item/clothing/under/suit/sl, + /obj/item/clothing/under/costume/buttondown/slacks/service, /obj/item/clothing/mask/fakemoustache, ) @@ -210,7 +210,7 @@ name = "black mafia outfit spawner" items = list( /obj/item/clothing/head/fedora, - /obj/item/clothing/under/suit/blacktwopiece, + /obj/item/clothing/under/suit/black, /obj/item/clothing/shoes/laceup, ) diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm index 86dd2bac70bfc..50497d531e76f 100644 --- a/code/game/objects/effects/spawners/gibspawner.dm +++ b/code/game/objects/effects/spawners/gibspawner.dm @@ -81,7 +81,15 @@ /obj/effect/gibspawner/human/Initialize(mapload) if(!gibdirections.len) - gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list()) + gibdirections = list( + list(NORTH, NORTHEAST, NORTHWEST), + list(SOUTH, SOUTHEAST, SOUTHWEST), + list(WEST, NORTHWEST, SOUTHWEST), + list(EAST, NORTHEAST, SOUTHEAST), + GLOB.alldirs, + GLOB.alldirs, + list(), + ) return ..() diff --git a/code/game/objects/effects/spawners/random/animalhide.dm b/code/game/objects/effects/spawners/random/animalhide.dm new file mode 100644 index 0000000000000..4fd0b3fa4d5e7 --- /dev/null +++ b/code/game/objects/effects/spawners/random/animalhide.dm @@ -0,0 +1,18 @@ +/obj/effect/spawner/random/animalhide + name = "animal hide spawner" + desc = "Fresh animal hide!" + icon_state = "animalhide" + loot = list( + /obj/item/stack/sheet/leather/five = 70, + /obj/item/stack/sheet/animalhide/corgi/five = 10, + /obj/item/stack/sheet/animalhide/cat/five = 10, + /obj/item/stack/sheet/animalhide/monkey/five = 10, + /obj/item/stack/sheet/animalhide/mothroach/five = 5, + /obj/item/stack/sheet/animalhide/carp/five = 5, + /obj/item/stack/sheet/sinew/wolf = 2, + /obj/item/stack/sheet/animalhide/goliath_hide/polar_bear_hide = 2, + /obj/item/stack/sheet/animalhide/xeno/five = 1, + /obj/item/stack/sheet/animalhide/lizard/five = 1, + /obj/item/stack/sheet/animalhide/human/five = 1, + /obj/item/stack/sheet/animalhide/gondola = 1, + ) diff --git a/code/game/objects/effects/spawners/random/armory.dm b/code/game/objects/effects/spawners/random/armory.dm new file mode 100644 index 0000000000000..5292ca6ad0986 --- /dev/null +++ b/code/game/objects/effects/spawners/random/armory.dm @@ -0,0 +1,67 @@ +/obj/effect/spawner/random/armory + name = "generic armory spawner" + spawn_loot_split = TRUE + spawn_loot_count = 3 + spawn_loot_split_pixel_offsets = 4 + +// Misc armory stuff +/obj/effect/spawner/random/armory/barrier_grenades + name = "barrier grenade spawner" + icon_state = "barrier_grenade" + loot = list(/obj/item/grenade/barrier) + +/obj/effect/spawner/random/armory/barrier_grenades/six + name = "six barrier grenade spawner" + spawn_loot_count = 6 + +/obj/effect/spawner/random/armory/riot_shield + name = "riot shield spawner" + icon_state = "riot_shield" + loot = list(/obj/item/shield/riot) + +/obj/effect/spawner/random/armory/rubbershot + name = "rubbershot spawner" + icon_state = "rubbershot" + loot = list(/obj/item/storage/box/rubbershot) + +// Weapons +/obj/effect/spawner/random/armory/disablers + name = "disabler spawner" + icon_state = "disabler" + loot = list(/obj/item/gun/energy/disabler) + +/obj/effect/spawner/random/armory/laser_gun + name = "laser gun spawner" + icon_state = "laser_gun" + loot = list(/obj/item/gun/energy/laser) + +/obj/effect/spawner/random/armory/e_gun + name = "energy gun spawner" + icon_state = "e_gun" + loot = list(/obj/item/gun/energy/e_gun) + +/obj/effect/spawner/random/armory/shotgun + name = "shotgun spawner" + icon_state = "shotgun" + loot = list(/obj/item/gun/ballistic/shotgun/riot) + +// Armor +/obj/effect/spawner/random/armory/bulletproof_helmet + name = "bulletproof helmet spawner" + icon_state = "armor_helmet" + loot = list(/obj/item/clothing/head/helmet/alt) + +/obj/effect/spawner/random/armory/riot_helmet + name = "riot helmet spawner" + icon_state = "riot_helmet" + loot = list(/obj/item/clothing/head/helmet/toggleable/riot) + +/obj/effect/spawner/random/armory/bulletproof_armor + name = "bulletproof armor spawner" + icon_state = "bulletproof_armor" + loot = list(/obj/item/clothing/suit/armor/bulletproof) + +/obj/effect/spawner/random/armory/riot_armor + name = "riot armor spawner" + icon_state = "riot_armor" + loot = list(/obj/item/clothing/suit/armor/riot) diff --git a/code/game/objects/effects/spawners/random/clothing.dm b/code/game/objects/effects/spawners/random/clothing.dm index 437c94754580f..e3193b05836d8 100644 --- a/code/game/objects/effects/spawners/random/clothing.dm +++ b/code/game/objects/effects/spawners/random/clothing.dm @@ -172,4 +172,73 @@ /obj/item/storage/backpack/duffelbag/sec, /obj/item/storage/backpack/duffelbag/engineering, /obj/item/storage/backpack/duffelbag/clown, + /obj/item/storage/backpack/messenger, + /obj/item/storage/backpack/messenger/eng, + /obj/item/storage/backpack/messenger/med, + /obj/item/storage/backpack/messenger/vir, + /obj/item/storage/backpack/messenger/chem, + /obj/item/storage/backpack/messenger/gen, + /obj/item/storage/backpack/messenger/science, + /obj/item/storage/backpack/messenger/hyd, + /obj/item/storage/backpack/messenger/sec, + /obj/item/storage/backpack/messenger/explorer, + ) + +/obj/effect/spawner/random/clothing/funny_hats + name = "random hat spawner" + icon_state = "hat" + desc = "This is the update that ruined Spacestation 13 forever. I can't believe what the TG Coders have done. \ + They've added fucking HATS! HATS!!! In MY competitive-roleplay-action-click-shooter-stabber-against-two-sides-to-detonate-the-payload game? \ + This isn't what I signed up for and why I supported this game! My game is chugging with every update to this stupid project and \ + I can't fucking stand it anymore. And instead of fixing the bugs or getting rid of the exploits, they just keep adding more \ + fucking hats so that the dumbasses that keep feeding into the coders bullshit will eat it up and ignore the glaring problems with it. \ + They've stopped caring. We've not had a REAL update in almost 5 years of development! Just removals! It's been all downhill since cloning and stuns were removed. \ + And frankly, I don't know what to do. There isn't any other competitive-roleplay-action-click-shooter-stabber-against-two-sides-to-detonate-the-payload game \ + out there that isn't trying to get my donator money just so I can have a single sprite added to the game and autoequipped to my character. \ + Next thing you know, the coders are going to have us PAY for these goddamn pixels on our character! Imagine having to pay for extra pixels! \ + I'm fucking DONE WITH THIS GAME! I'M THROUGH WITH THIS SHIT! FUCK THE CODERS! I JUST WANT TO PLAY MY COMPETITIVE-ROLEPLAY-ACTION-\ + CLICK-SHOOTER-STABBER-AGAINST-TWO-SIDES-TO-DETONATE-THE-PAYLOAD GAME THAT ISN'T DRAGGED DOWN BY HORRIBLE ADMINS THAT BAN ME WHEN I SAY \ + CERTAIN WORDS THAT I AM ENTITLED TO SAY ON THE INTERNET! I'M THROUGH WITH THIS! I'M GOING TO GO PLAY A PURE, GENUINE GAME. WITH NO FUCKING HATS!" + loot = list( + /obj/item/clothing/head/costume/powdered_wig, + /obj/item/clothing/head/costume/cueball, + /obj/item/clothing/head/costume/snowman, + /obj/item/clothing/head/costume/witchwig, + /obj/item/clothing/head/costume/maidheadband, + /obj/item/clothing/head/costume/chicken, + /obj/item/clothing/head/costume/griffin, + /obj/item/clothing/head/costume/xenos, + /obj/item/clothing/head/costume/lobsterhat, + /obj/item/clothing/head/costume/cardborg, + /obj/item/clothing/head/costume/football_helmet, + /obj/item/clothing/head/costume/tv_head/fov_less, + /obj/item/clothing/head/costume/tmc, + /obj/item/clothing/head/costume/deckers, + /obj/item/clothing/head/costume/yuri, + /obj/item/clothing/head/costume/allies, + /obj/item/clothing/head/frenchberet, + /obj/item/clothing/head/costume/crown, + /obj/item/clothing/head/fedora, + /obj/item/clothing/head/beanie/red, + /obj/item/clothing/head/beanie/darkblue, + /obj/item/clothing/head/rasta, + /obj/item/clothing/head/costume/constable, + /obj/item/clothing/head/bio_hood/plague, + /obj/item/clothing/head/costume/nursehat, + /obj/item/clothing/head/hats/bowler, + /obj/item/clothing/head/costume/bearpelt, + /obj/item/clothing/head/flatcap, + /obj/item/clothing/head/cowboy, + /obj/item/clothing/head/costume/rice_hat, + /obj/item/clothing/head/costume/pharaoh, + /obj/item/clothing/head/costume/delinquent, + /obj/item/clothing/head/costume/jackbros, + /obj/item/clothing/head/costume/ushanka, + /obj/item/clothing/head/costume/nightcap/blue, + /obj/item/clothing/head/costume/nightcap/red, + /obj/item/clothing/head/mothcap, + /obj/item/clothing/head/cone, + /obj/item/clothing/head/collectable/petehat, + /obj/item/clothing/head/collectable/wizard, + /obj/item/clothing/head/wizard/marisa/fake, ) diff --git a/code/game/objects/effects/spawners/random/contraband.dm b/code/game/objects/effects/spawners/random/contraband.dm index 48d5eafa0349e..f5bf0f452a35c 100644 --- a/code/game/objects/effects/spawners/random/contraband.dm +++ b/code/game/objects/effects/spawners/random/contraband.dm @@ -2,6 +2,44 @@ name = "contraband loot spawner" desc = "Pstttthhh! Pass it under the table." icon_state = "prisoner" + loot = list( + /obj/item/poster/random_contraband = 40, + /obj/item/food/grown/cannabis = 40, + /obj/item/clothing/mask/gas/syndicate = 30, + /obj/item/clothing/neck/necklace/dope = 30, + /obj/item/food/grown/cannabis/rainbow = 20, + /obj/item/reagent_containers/cup/glass/bottle/absinthe = 20, + /obj/item/toy/cards/deck/syndicate = 20, + /obj/item/clothing/under/syndicate/tacticool = 20, + /obj/item/food/grown/cannabis/white = 10, + /obj/item/storage/box/fireworks/dangerous = 10, + /obj/item/storage/pill_bottle/zoom = 10, + /obj/item/storage/pill_bottle/happy = 10, + /obj/item/storage/pill_bottle/lsd = 10, + /obj/item/storage/pill_bottle/aranesp = 10, + /obj/item/storage/pill_bottle/stimulant = 10, + /obj/item/storage/fancy/cigarettes/cigpack_syndicate = 10, + /obj/item/storage/fancy/cigarettes/cigpack_shadyjims = 10, + /obj/item/storage/box/donkpockets = 10, + /obj/item/reagent_containers/pill/maintenance = 5, + /obj/effect/spawner/random/contraband/plus = 5, + ) + +/obj/effect/spawner/random/contraband/plus + name = "contraband loot spawner plus" + desc = "Where'd ya find this?" + loot = list( + /obj/effect/spawner/random/contraband/prison = 40, + /obj/item/clothing/under/syndicate = 20, + /obj/item/reagent_containers/cup/bottle/thermite = 20, + /obj/item/reagent_containers/pill/maintenance = 10, + /obj/item/restraints/legcuffs/beartrap = 10, + /obj/effect/spawner/random/contraband/narcotics = 10, + /obj/item/seeds/kronkus = 5, + /obj/item/seeds/odious_puffball = 5, + /obj/item/grenade/empgrenade = 5, + /obj/effect/spawner/random/contraband/armory = 1, + ) /obj/effect/spawner/random/contraband/armory name = "armory loot spawner" @@ -21,12 +59,13 @@ icon_state = "pill" loot = list( /obj/item/reagent_containers/syringe/contraband/space_drugs, - /obj/item/reagent_containers/syringe/contraband/krokodil, /obj/item/reagent_containers/syringe/contraband/methamphetamine, /obj/item/reagent_containers/syringe/contraband/bath_salts, /obj/item/reagent_containers/syringe/contraband/fentanyl, /obj/item/reagent_containers/syringe/contraband/morphine, - /obj/item/reagent_containers/syringe/contraband/saturnx, + /obj/item/food/drug/saturnx, + /obj/item/reagent_containers/cup/blastoff_ampoule, + /obj/item/food/drug/moon_rock, /obj/item/storage/pill_bottle/happy, /obj/item/storage/pill_bottle/lsd, /obj/item/storage/pill_bottle/psicodine, diff --git a/code/game/objects/effects/spawners/random/entertainment.dm b/code/game/objects/effects/spawners/random/entertainment.dm index 9c50d80588133..1c635f07a5aae 100644 --- a/code/game/objects/effects/spawners/random/entertainment.dm +++ b/code/game/objects/effects/spawners/random/entertainment.dm @@ -271,12 +271,11 @@ /obj/item/toy/plush/carpplushie = 3, /obj/item/toy/plush/lizard_plushie/green = 3, /obj/item/toy/plush/lizard_plushie/space/green = 3, - /obj/item/toy/plush/awakenedplushie = 3, /obj/item/toy/plush/goatplushie = 3, /obj/item/toy/plush/rouny = 3, /obj/item/toy/plush/abductor = 3, /obj/item/toy/plush/abductor/agent = 3, - /obj/item/toy/plush/greek_cucumber = 3, + /obj/item/toy/plush/shark = 3, // super rare plushies /obj/item/toy/plush/bubbleplush = 2, /obj/item/toy/plush/ratplush = 2, diff --git a/code/game/objects/effects/spawners/random/exotic.dm b/code/game/objects/effects/spawners/random/exotic.dm index ce48a31e5fdde..add4faf5c5004 100644 --- a/code/game/objects/effects/spawners/random/exotic.dm +++ b/code/game/objects/effects/spawners/random/exotic.dm @@ -9,7 +9,7 @@ loot = list( // Space loot spawner. Couple of random bits of technology-adjacent stuff including anomaly cores and BEPIS techs. /obj/item/raw_anomaly_core/random, /obj/item/disk/design_disk/bepis, - /obj/item/camera_bug, + /obj/item/computer_disk/syndicate/camera_app, ) /obj/effect/spawner/random/exotic/languagebook @@ -87,5 +87,5 @@ icon_state = "ripley" loot = list( /obj/structure/mecha_wreckage/ripley = 3, - /obj/vehicle/sealed/mecha/working/ripley/mining = 1, + /obj/vehicle/sealed/mecha/ripley/mining = 1, ) diff --git a/code/game/objects/effects/spawners/random/food_or_drink.dm b/code/game/objects/effects/spawners/random/food_or_drink.dm index b9d01e8081ab4..b2639b2df68d0 100644 --- a/code/game/objects/effects/spawners/random/food_or_drink.dm +++ b/code/game/objects/effects/spawners/random/food_or_drink.dm @@ -56,6 +56,7 @@ /obj/item/seeds/liberty = 5, /obj/item/seeds/replicapod = 5, /obj/item/seeds/reishi = 5, + /obj/item/seeds/seedling = 5, /obj/item/seeds/nettle/death = 1, /obj/item/seeds/plump/walkingmushroom = 1, /obj/item/seeds/cannabis/rainbow = 1, @@ -243,7 +244,7 @@ /obj/item/reagent_containers/condiment/soysauce = 1, /obj/item/reagent_containers/condiment/vinegar = 1, /obj/item/reagent_containers/condiment/peanut_butter = 1, - /obj/item/reagent_containers/condiment/quality_oil = 1, + /obj/item/reagent_containers/condiment/olive_oil = 1, /obj/item/reagent_containers/condiment/cherryjelly = 1, ) @@ -272,3 +273,53 @@ if(!HAS_TRAIT(SSstation, STATION_TRAIT_BIRTHDAY)) spawn_loot_chance = 0 return ..() + +/obj/effect/spawner/random/food_or_drink/donuts + name = "donut spawner" + icon_state = "donut" + loot = list( + /obj/item/food/donut/apple = 3, + /obj/item/food/donut/berry = 3, + /obj/item/food/donut/caramel = 3, + /obj/item/food/donut/choco = 3, + /obj/item/food/donut/plain = 3, + /obj/item/food/donut/blumpkin = 2, + /obj/item/food/donut/bungo = 2, + /obj/item/food/donut/laugh = 2, + /obj/item/food/donut/matcha = 2, + /obj/item/food/donut/trumpet = 2, + /obj/item/food/donut/chaos = 1, + /obj/item/food/donut/meat = 1, + ) + +/obj/effect/spawner/random/food_or_drink/jelly_donuts + name = "jelly donut spawner" + icon_state = "jelly_donut" + loot = list( + /obj/item/food/donut/jelly/apple = 3, + /obj/item/food/donut/jelly/berry = 3, + /obj/item/food/donut/jelly/caramel = 3, + /obj/item/food/donut/jelly/choco = 3, + /obj/item/food/donut/jelly/plain = 3, + /obj/item/food/donut/jelly/blumpkin = 2, + /obj/item/food/donut/jelly/bungo = 2, + /obj/item/food/donut/jelly/laugh = 2, + /obj/item/food/donut/jelly/matcha = 2, + /obj/item/food/donut/jelly/trumpet = 2, + ) + +/obj/effect/spawner/random/food_or_drink/slime_jelly_donuts + name = "slime jelly donut spawner" + icon_state = "slime_jelly_donut" + loot = list( + /obj/item/food/donut/jelly/slimejelly/apple = 3, + /obj/item/food/donut/jelly/slimejelly/berry = 3, + /obj/item/food/donut/jelly/slimejelly/caramel = 3, + /obj/item/food/donut/jelly/slimejelly/choco = 3, + /obj/item/food/donut/jelly/slimejelly/plain = 3, + /obj/item/food/donut/jelly/slimejelly/blumpkin = 2, + /obj/item/food/donut/jelly/slimejelly/bungo = 2, + /obj/item/food/donut/jelly/slimejelly/laugh = 2, + /obj/item/food/donut/jelly/slimejelly/matcha = 2, + /obj/item/food/donut/jelly/slimejelly/trumpet = 2, + ) diff --git a/code/game/objects/effects/spawners/random/lavaland_mobs.dm b/code/game/objects/effects/spawners/random/lavaland_mobs.dm new file mode 100644 index 0000000000000..7b4bec1f6a1ba --- /dev/null +++ b/code/game/objects/effects/spawners/random/lavaland_mobs.dm @@ -0,0 +1,51 @@ + +/// For map generation, has a chance to instantiate as a special subtype +/obj/effect/spawner/random/lavaland_mob + name = "random lavaland mob" + desc = "Spawns a random lavaland mob." + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "large_egg" + loot = list( + /mob/living/basic/mining/bileworm = 1, + /mob/living/basic/mining/brimdemon = 1, + /mob/living/basic/mining/goldgrub = 1, + /mob/living/basic/mining/goliath = 1, + /mob/living/basic/mining/legion = 1, + /mob/living/basic/mining/lobstrosity/lava = 1, + /mob/living/basic/mining/watcher = 1, + ) + +/// Spawns random watcher variants during map generation +/obj/effect/spawner/random/lavaland_mob/watcher + name = "random watcher" + desc = "Chance to spawn a rare shiny version." + icon = 'icons/mob/simple/lavaland/lavaland_monsters_wide.dmi' + icon_state = "watcher" + pixel_x = -12 + loot = list( + /mob/living/basic/mining/watcher = 80, + /mob/living/basic/mining/watcher/magmawing = 15, + /mob/living/basic/mining/watcher/icewing = 5, + ) + +/// Spawns random goliath variants during map generation +/obj/effect/spawner/random/lavaland_mob/goliath + name = "random goliath" + desc = "Chance to spawn a rare shiny version." + icon = 'icons/mob/simple/lavaland/lavaland_monsters_wide.dmi' + icon_state = "goliath" + pixel_x = -12 + loot = list( + /mob/living/basic/mining/goliath = 99, + /mob/living/basic/mining/goliath/ancient/immortal = 1, + ) + +/// Spawns random legion variants during map generation +/obj/effect/spawner/random/lavaland_mob/legion + name = "random legion" + desc = "Chance to spawn a rare shiny version." + icon_state = "legion" + loot = list( + /mob/living/basic/mining/legion = 19, + /mob/living/basic/mining/legion/dwarf = 1, + ) diff --git a/code/game/objects/effects/spawners/random/medical.dm b/code/game/objects/effects/spawners/random/medical.dm index 21fdcc2ad97c7..050223525e6e8 100644 --- a/code/game/objects/effects/spawners/random/medical.dm +++ b/code/game/objects/effects/spawners/random/medical.dm @@ -132,7 +132,7 @@ name = "patient stretcher spawner" icon_state = "rollerbed" loot = list( - /obj/structure/bed/roller, + /obj/structure/bed/medical/emergency, /obj/vehicle/ridden/wheelchair, ) diff --git a/code/game/objects/effects/spawners/random/mod.dm b/code/game/objects/effects/spawners/random/mod.dm index 7b5c3cc5852c7..bcd2eaa3ff221 100644 --- a/code/game/objects/effects/spawners/random/mod.dm +++ b/code/game/objects/effects/spawners/random/mod.dm @@ -12,7 +12,8 @@ /obj/item/mod/module/balloon = 1, /obj/item/mod/module/paper_dispenser = 1, /obj/item/mod/module/hat_stabilizer = 2, - /obj/item/mod/module/stamp = 1 + /obj/item/mod/module/stamp = 1, + /obj/item/mod/module/recycler/donk/safe = 1, ) /obj/effect/spawner/random/mod/maint/Initialize(mapload) diff --git a/code/game/objects/effects/spawners/random/random.dm b/code/game/objects/effects/spawners/random/random.dm index e2977c540f6ae..e8653a30cfb0c 100644 --- a/code/game/objects/effects/spawners/random/random.dm +++ b/code/game/objects/effects/spawners/random/random.dm @@ -19,6 +19,8 @@ var/spawn_loot_double = TRUE /// Whether the items should be distributed to offsets 0,1,-1,2,-2,3,-3.. This overrides pixel_x/y on the spawner itself var/spawn_loot_split = FALSE + /// The pixel x/y divider offsets for spawn_loot_split (spaced 1 pixel apart by default) + var/spawn_loot_split_pixel_offsets = 2 /// Whether the spawner should spawn all the loot in the list var/spawn_all_loot = FALSE /// The chance for the spawner to create loot (ignores spawn_loot_count) @@ -52,6 +54,7 @@ if(loot?.len) var/loot_spawned = 0 + var/pixel_divider = FLOOR(16 / spawn_loot_split_pixel_offsets, 1) // 16 pixels offsets is max that should be allowed in any direction while((spawn_loot_count-loot_spawned) && loot.len) var/lootspawn = pick_weight_recursive(loot) if(!spawn_loot_double) @@ -74,7 +77,9 @@ spawned_loot.pixel_y = rand(-16, 16) else if (spawn_loot_split) if (loot_spawned) - spawned_loot.pixel_x = spawned_loot.pixel_y = ((!(loot_spawned%2)*loot_spawned/2)*-1)+((loot_spawned%2)*(loot_spawned+1)/2*1) + var/column = FLOOR(loot_spawned / pixel_divider, 1) + spawned_loot.pixel_x = spawn_loot_split_pixel_offsets * (loot_spawned % pixel_divider) + (column * spawn_loot_split_pixel_offsets) + spawned_loot.pixel_y = spawn_loot_split_pixel_offsets * (loot_spawned % pixel_divider) loot_spawned++ /** @@ -92,8 +97,9 @@ if(radius >= 0) for(var/turf/turf_in_view in view(radius, get_turf(src))) - if(!turf_in_view.density) - scatter_locations += turf_in_view + if(isclosedturf(turf_in_view) || (isgroundlessturf(turf_in_view) && !GET_TURF_BELOW(turf_in_view))) + continue + scatter_locations += turf_in_view return scatter_locations diff --git a/code/game/objects/effects/spawners/random/russian_rifle_spawner.dm b/code/game/objects/effects/spawners/random/russian_rifle_spawner.dm new file mode 100644 index 0000000000000..84b19f59ee0df --- /dev/null +++ b/code/game/objects/effects/spawners/random/russian_rifle_spawner.dm @@ -0,0 +1,16 @@ +/obj/effect/spawner/random/sakhno + name = "sakhno rifle spawner" + desc = "Mosin? Never heard of her!" + icon_state = "pistol" + loot = list( + /obj/item/gun/ballistic/rifle/boltaction/surplus = 80, + /obj/item/gun/ballistic/rifle/boltaction = 10, + /obj/item/food/rationpack = 1, + ) +/obj/effect/spawner/random/sakhno/ammo + name = ".310 Strilka stripper clip spawner" + loot = list( + /obj/item/ammo_box/strilka310/surplus = 80, + /obj/item/ammo_box/strilka310 = 10, + /obj/item/food/rationpack = 1, + ) diff --git a/code/game/objects/effects/spawners/random/structure.dm b/code/game/objects/effects/spawners/random/structure.dm index 580f7ff1b9b27..cf037b91b5cb8 100644 --- a/code/game/objects/effects/spawners/random/structure.dm +++ b/code/game/objects/effects/spawners/random/structure.dm @@ -142,7 +142,7 @@ /obj/structure/closet/l3closet = 1, /obj/structure/closet/radiation = 1, /obj/structure/closet/bombcloset = 1, - /obj/structure/closet/mini_fridge = 1, + /obj/structure/closet/mini_fridge/grimy = 1, ) /obj/effect/spawner/random/structure/chair_flipped @@ -188,7 +188,7 @@ /obj/effect/spawner/random/structure/billboard name = "billboard spawner" - icon = 'icons/obj/billboard.dmi' + icon = 'icons/obj/fluff/billboard.dmi' icon_state = "billboard_random" loot = list( /obj/structure/billboard/azik = 50, @@ -235,3 +235,24 @@ /obj/structure/musician/piano, /obj/structure/musician/piano/minimoog, ) + +/obj/effect/spawner/random/structure/shipping_container + name = "shipping container spawner" + icon = 'icons/obj/fluff/containers.dmi' + icon_state = "random_container" + loot = list( + /obj/structure/shipping_container/conarex = 3, + /obj/structure/shipping_container/deforest = 3, + /obj/structure/shipping_container/kahraman = 3, + /obj/structure/shipping_container/kahraman/alt = 3, + /obj/structure/shipping_container/kosmologistika = 3, + /obj/structure/shipping_container/interdyne = 3, + /obj/structure/shipping_container/nakamura = 3, + /obj/structure/shipping_container/nanotrasen = 3, + /obj/structure/shipping_container/nthi = 3, + /obj/structure/shipping_container/vitezstvi = 3, + /obj/structure/shipping_container/cybersun = 2, + /obj/structure/shipping_container/donk_co = 2, + /obj/structure/shipping_container/gorlex = 1, + /obj/structure/shipping_container/gorlex/red = 1, + ) diff --git a/code/game/objects/effects/spawners/random/techstorage.dm b/code/game/objects/effects/spawners/random/techstorage.dm index 0fe2f4871304c..c1f9304039654 100644 --- a/code/game/objects/effects/spawners/random/techstorage.dm +++ b/code/game/objects/effects/spawners/random/techstorage.dm @@ -58,6 +58,7 @@ /obj/item/circuitboard/computer/rdconsole, /obj/item/circuitboard/computer/scan_consolenew, /obj/item/circuitboard/machine/dnascanner, + /obj/item/circuitboard/machine/dna_infuser, ) /obj/effect/spawner/random/techstorage/security_all @@ -113,6 +114,7 @@ loot = list( /obj/item/circuitboard/computer/crew, /obj/item/circuitboard/computer/communications, + /obj/item/circuitboard/computer/bankmachine, ) /obj/effect/spawner/random/techstorage/rnd_secure_all diff --git a/code/game/objects/effects/spawners/random/trash.dm b/code/game/objects/effects/spawners/random/trash.dm index 020724772ddea..b10dbc1f7f82c 100644 --- a/code/game/objects/effects/spawners/random/trash.dm +++ b/code/game/objects/effects/spawners/random/trash.dm @@ -266,3 +266,22 @@ /obj/item/food/breadslice/moldy/bacteria, /obj/item/food/pizzaslice/moldy/bacteria, ) + +/obj/effect/spawner/random/trash/crushed_can + name = "crushed can spawner" + icon_state = "crushed_can" + loot = list(/obj/item/trash/can) + /// Whether the can will spawn with this spawner's icon_state instead of a random one (used for mapedits) + var/soda_icons = list( + "energy_drink", "monkey_energy", "thirteen_loko", "space_mountain_wind", "dr_gibb", "starkist", + "sodawater", "tonic", "cola", "purple_can", "ice_tea_can", + "sol_dry", "wellcheers", "space beer", "ebisu", "shimauma", "moonlabor", + "space_up", "lemon_lime", "shamblers", "shamblerseldritch", "air", "laughter", + "volt_energy", "melon_soda", + ) + +/obj/effect/spawner/random/trash/crushed_can/make_item(spawn_loc, type_path_to_make) + var/obj/item/trash/can/crushed_can = .. () + if(istype(crushed_can)) + crushed_can.icon_state = pick(soda_icons) + return crushed_can diff --git a/code/game/objects/effects/spiderwebs.dm b/code/game/objects/effects/spiderwebs.dm index 93d8fbbed0de7..3bdac03396fa1 100644 --- a/code/game/objects/effects/spiderwebs.dm +++ b/code/game/objects/effects/spiderwebs.dm @@ -43,9 +43,9 @@ return if(!HAS_TRAIT(user,TRAIT_WEB_WEAVER)) return - user.balloon_alert_to_viewers("weaving...") + loc.balloon_alert_to_viewers("weaving...") if(!do_after(user, 2 SECONDS)) - user.balloon_alert(user, "interrupted!") + loc.balloon_alert(user, "interrupted!") return qdel(src) var/obj/item/stack/sheet/cloth/woven_cloth = new /obj/item/stack/sheet/cloth @@ -68,7 +68,7 @@ if(mover.pulledby && HAS_TRAIT(mover.pulledby, TRAIT_WEB_SURFER)) return TRUE if(prob(50)) - balloon_alert(mover, "stuck in web!") + loc.balloon_alert(mover, "stuck in web!") return FALSE else if(isprojectile(mover)) return prob(30) @@ -100,7 +100,7 @@ if(mover.pulledby == allowed_mob) return TRUE if(prob(50)) - balloon_alert(mover, "stuck in web!") + loc.balloon_alert(mover, "stuck in web!") return FALSE else if(isprojectile(mover)) return prob(30) @@ -180,13 +180,13 @@ return if(isspider(mover.pulledby)) return TRUE - balloon_alert(mover, "stuck in web!") + loc.balloon_alert(mover, "stuck in web!") return FALSE /obj/structure/spider/spikes name = "web spikes" icon = 'icons/effects/effects.dmi' - desc = "hardened silk formed into small yet deadly spikes." + desc = "Silk hardened into small yet deadly spikes." icon_state = "webspikes1" max_integrity = 40 @@ -194,11 +194,15 @@ . = ..() AddComponent(/datum/component/caltrop, min_damage = 20, max_damage = 30, flags = CALTROP_NOSTUN | CALTROP_BYPASS_SHOES) -/obj/structure/spider/carcass - name = "web carcass" +/obj/structure/spider/effigy + name = "web effigy" icon = 'icons/effects/effects.dmi' - desc = "hardened silk formed into small yet deadly spikes." + desc = "A giant spider! Fortunately, this one is just a statue of hardened webbing." icon_state = "webcarcass" max_integrity = 125 density = TRUE anchored = FALSE + +/obj/structure/spider/effigy/Initialize(mapload) + . = ..() + AddElement(/datum/element/temporary_atom, 1 MINUTES) diff --git a/code/game/objects/effects/temporary_visuals/effect_trail.dm b/code/game/objects/effects/temporary_visuals/effect_trail.dm new file mode 100644 index 0000000000000..028e514165363 --- /dev/null +++ b/code/game/objects/effects/temporary_visuals/effect_trail.dm @@ -0,0 +1,46 @@ +/// An invisible effect which chases a target, spawning spikes every so often. +/obj/effect/temp_visual/effect_trail + name = "effect trail" + desc = "An invisible effect, how did you examine this?" + icon = 'icons/mob/silicon/cameramob.dmi' + icon_state = "marker" + duration = 15 SECONDS + invisibility = INVISIBILITY_ABSTRACT + /// Typepath of our spawned effect + var/spawned_effect + /// How often do we spawn our other effect? + var/spawn_interval = 0.5 SECONDS + /// Speed at which we chase target + var/move_speed = 3 + /// What are we chasing? + var/atom/target + /// Stop spawning if we have this many effects already + var/max_spawned = 20 + /// Do we home in after we started moving? + var/homing = TRUE + /// Handles chasing the target + var/datum/move_loop/movement + +/obj/effect/temp_visual/effect_trail/Initialize(mapload, atom/target) + . = ..() + if (!target) + return INITIALIZE_HINT_QDEL + + AddElement(/datum/element/floor_loving) + AddComponent(/datum/component/spawner, spawn_types = list(spawned_effect), max_spawned = max_spawned, spawn_time = spawn_interval) + src.target = target + movement = SSmove_manager.move_towards(src, chasing = target, delay = move_speed, home = homing, timeout = duration, flags = MOVEMENT_LOOP_START_FAST) + + RegisterSignal(target, COMSIG_QDELETING, PROC_REF(on_target_invalid)) + if (isliving(target)) + RegisterSignal(target, COMSIG_LIVING_DEATH, PROC_REF(on_target_invalid)) + +/// Destroy ourselves if the target is no longer valid +/obj/effect/temp_visual/effect_trail/proc/on_target_invalid() + SIGNAL_HANDLER + target = null + qdel(src) + +/obj/effect/temp_visual/effect_trail/Destroy() + QDEL_NULL(movement) + return ..() diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 795fd207bedcf..08ad87d5eee89 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -490,11 +490,12 @@ layer = ABOVE_ALL_MOB_LAYER plane = ABOVE_GAME_PLANE anchored = TRUE - mouse_opacity = MOUSE_OPACITY_TRANSPARENT + obj_flags = CAN_BE_HIT + mouse_opacity = MOUSE_OPACITY_OPAQUE var/status = 0 var/delay = 0 -/obj/effect/constructing_effect/Initialize(mapload, rcd_delay, rcd_status) +/obj/effect/constructing_effect/Initialize(mapload, rcd_delay, rcd_status, rcd_upgrades) . = ..() status = rcd_status delay = rcd_delay @@ -505,6 +506,26 @@ else update_appearance() + if (rcd_upgrades & RCD_UPGRADE_ANTI_INTERRUPT) + color = list( + 1.0, 0.5, 0.5, 0.0, + 0.1, 0.0, 0.0, 0.0, + 0.1, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 1.0, + 0.0, 0.0, 0.0, 0.0, + ) + + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + obj_flags &= ~CAN_BE_HIT + +/obj/effect/constructing_effect/update_name(updates) + . = ..() + + if (status == RCD_DECONSTRUCT) + name = "deconstruction effect" + else + name = "construction effect" + /obj/effect/constructing_effect/update_icon_state() icon_state = "rcd" if(delay < 10) @@ -524,12 +545,26 @@ if (status == RCD_DECONSTRUCT) qdel(src) else + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + obj_flags &= ~CAN_BE_HIT icon_state = "rcd_end" addtimer(CALLBACK(src, PROC_REF(end)), 15) /obj/effect/constructing_effect/proc/end() qdel(src) +/obj/effect/constructing_effect/proc/attacked(mob/user) + user.do_attack_animation(src, ATTACK_EFFECT_PUNCH) + user.changeNext_move(CLICK_CD_MELEE) + playsound(loc, 'sound/weapons/egloves.ogg', vol = 80, vary = TRUE) + end() + +/obj/effect/constructing_effect/attackby(obj/item/weapon, mob/user, params) + attacked(user) + +/obj/effect/constructing_effect/attack_hand(mob/living/user, list/modifiers) + attacked(user) + /obj/effect/temp_visual/electricity icon_state = "electricity3" duration = 0.5 SECONDS @@ -557,11 +592,22 @@ var/datum/weakref/pinged_person /// The icon state applied to the image created for this ping. var/real_icon_state = "sonar_ping" + /// Does the visual follow the creature? + var/follow_creature = TRUE + /// Creature's X & Y coords, which can either be overridden or kept the same depending on follow_creature. + var/creature_x + var/creature_y -/obj/effect/temp_visual/sonar_ping/Initialize(mapload, mob/living/looker, mob/living/creature) +/obj/effect/temp_visual/sonar_ping/Initialize(mapload, mob/living/looker, mob/living/creature, ping_state, follow_creatures = TRUE) . = ..() if(!looker || !creature) return INITIALIZE_HINT_QDEL + if(ping_state) + real_icon_state = ping_state + follow_creature = follow_creatures + creature_x = creature.x + creature_y = creature.y + modsuit_image = image(icon = icon, loc = looker.loc, icon_state = real_icon_state, layer = ABOVE_ALL_MOB_LAYER, pixel_x = ((creature.x - looker.x) * 32), pixel_y = ((creature.y - looker.y) * 32)) modsuit_image.plane = ABOVE_LIGHTING_PLANE SET_PLANE_EXPLICIT(modsuit_image, ABOVE_LIGHTING_PLANE, creature) @@ -594,8 +640,12 @@ if(isnull(looker) || isnull(creature)) return PROCESS_KILL modsuit_image.loc = looker.loc - modsuit_image.pixel_x = ((creature.x - looker.x) * 32) - modsuit_image.pixel_y = ((creature.y - looker.y) * 32) + // Long pings follow, short pings stay put. We still need to update for looker.x&y though + if(follow_creature) + creature_y = creature.y + creature_x = creature.x + modsuit_image.pixel_x = ((creature_x - looker.x) * 32) + modsuit_image.pixel_y = ((creature_y - looker.y) * 32) /obj/effect/temp_visual/block //color is white by default, set to whatever is needed name = "blocking glow" @@ -608,3 +658,47 @@ . = ..() pixel_x = rand(-12, 12) pixel_y = rand(-9, 0) + +/obj/effect/temp_visual/crit + name = "critical hit" + icon_state = "crit" + duration = 15 + +/obj/effect/temp_visual/crit/Initialize(mapload) + . = ..() + animate(src, pixel_y = pixel_y + 16, alpha = 0, time = duration) + +/obj/effect/temp_visual/jet_plume + name = "jet plume" + icon_state = "jet_plume" + layer = BELOW_MOB_LAYER + plane = GAME_PLANE + duration = 0.4 SECONDS + +/// Plays a dispersing animation on hivelord and legion minions so they don't just vanish +/obj/effect/temp_visual/hive_spawn_wither + name = "withering spawn" + duration = 1 SECONDS + +/obj/effect/temp_visual/hive_spawn_wither/Initialize(mapload, atom/copy_from) + if (isnull(copy_from)) + . = ..() + return INITIALIZE_HINT_QDEL + icon = copy_from.icon + icon_state = copy_from.icon_state + pixel_x = copy_from.pixel_x + pixel_y = copy_from.pixel_y + duration = rand(0.5 SECONDS, 1 SECONDS) + var/matrix/transformation = matrix(transform) + transformation.Turn(rand(-70, 70)) + transformation.Scale(0.7, 0.7) + animate( + src, + pixel_x = rand(-5, 5), + pixel_y = -5, + transform = transformation, + color = "#44444400", + time = duration, + flags = ANIMATION_RELATIVE, + ) + return ..() diff --git a/code/game/objects/effects/temporary_visuals/temporary_visual.dm b/code/game/objects/effects/temporary_visuals/temporary_visual.dm index fc141acecb88a..0d5b7bf1463e9 100644 --- a/code/game/objects/effects/temporary_visuals/temporary_visual.dm +++ b/code/game/objects/effects/temporary_visuals/temporary_visual.dm @@ -17,7 +17,7 @@ if(randomdir) setDir(pick(GLOB.cardinals)) - timerid = QDEL_IN(src, duration) + timerid = QDEL_IN_STOPPABLE(src, duration) /obj/effect/temp_visual/Destroy() . = ..() diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index ad3f881b68690..dc68589b03c29 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1,7 +1,7 @@ /// Anything you can pick up and hold. /obj/item name = "item" - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/anomaly.dmi' blocks_emissive = EMISSIVE_BLOCK_GENERIC burning_particles = /particles/smoke/burning/small pass_flags_self = PASSITEM @@ -171,7 +171,8 @@ var/sharpness = NONE ///How a tool acts when you use it on something, such as wirecutters cutting wires while multitools measure power - var/tool_behaviour = NONE + var/tool_behaviour = null + ///How fast does the tool work var/toolspeed = 1 @@ -207,18 +208,20 @@ ///Grinder var:A reagent list containing the reagents this item produces when ground up in a grinder - this can be an empty list to allow for reagent transferring only var/list/grind_results - //Grinder var:A reagent list containing blah blah... but when JUICED in a grinder! - var/list/juice_results - - var/canMouseDown = FALSE + ///A reagent the nutriments are converted into when the item is juiced. + var/datum/reagent/consumable/juice_typepath /// Used in obj/item/examine to give additional notes on what the weapon does, separate from the predetermined output variables var/offensive_notes /// Used in obj/item/examine to determines whether or not to detail an item's statistics even if it does not meet the force requirements var/override_notes = FALSE + /// Used if we want to have a custom verb text for throwing. "John Spaceman flicks the ciggerate" for example. + var/throw_verb -/obj/item/Initialize(mapload) + /// A lazylist used for applying fantasy values, contains the actual modification applied to a variable. + var/list/fantasy_modifications = null +/obj/item/Initialize(mapload) if(attack_verb_continuous) attack_verb_continuous = string_list(attack_verb_continuous) if(attack_verb_simple) @@ -237,7 +240,6 @@ // Handle adding item associated actions for(var/path in actions_types) add_item_action(path) - actions_types = null if(force_string) @@ -294,14 +296,16 @@ LAZYADD(actions, action) RegisterSignal(action, COMSIG_QDELETING, PROC_REF(on_action_deleted)) - if(ismob(loc)) - // We're being held or are equipped by someone while adding an action? - // Then they should also probably be granted the action, given it's in a correct slot - var/mob/holder = loc - give_item_action(action, holder, holder.get_slot_by_item(src)) - + grant_action_to_bearer(action) return action +/// Grant the action to anyone who has this item equipped to an appropriate slot +/obj/item/proc/grant_action_to_bearer(datum/action/action) + if(!ismob(loc)) + return + var/mob/holder = loc + give_item_action(action, holder, holder.get_slot_by_item(src)) + /// Removes an instance of an action from our list of item actions. /obj/item/proc/remove_item_action(datum/action/action) if(!action) @@ -390,6 +394,9 @@ . += "[gender == PLURAL ? "They are" : "It is"] a [weight_class_to_text(w_class)] item." + if(item_flags & CRUEL_IMPLEMENT) + . += "[src] seems quite practical for particularly morbid procedures and experiments." + if(resistance_flags & INDESTRUCTIBLE) . += "[src] seems extremely robust! It'll probably withstand anything that could happen to it!" else @@ -521,26 +528,6 @@ /obj/item/proc/attempt_pickup(mob/user) . = TRUE - if(resistance_flags & ON_FIRE) - var/mob/living/carbon/C = user - var/can_handle_hot = FALSE - if(!istype(C)) - can_handle_hot = TRUE - else if(C.gloves && (C.gloves.max_heat_protection_temperature > 360)) - can_handle_hot = TRUE - else if(HAS_TRAIT(C, TRAIT_RESISTHEAT) || HAS_TRAIT(C, TRAIT_RESISTHEATHANDS)) - can_handle_hot = TRUE - - if(can_handle_hot) - extinguish() - to_chat(user, span_notice("You put out the fire on [src].")) - else - to_chat(user, span_warning("You burn your hand on [src]!")) - var/obj/item/bodypart/affecting = C.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm") - if(affecting?.receive_damage( 0, 5 )) // 5 burn damage - C.update_damage_overlays() - return - if(!(interaction_flags_item & INTERACT_ITEM_ATTACK_HAND_PICKUP)) //See if we're supposed to auto pickup. return @@ -656,6 +643,22 @@ /obj/item/proc/on_found(mob/finder) return +/** + * Called after an item is placed in an equipment slot. Runs equipped(), then sends a signal. + * This should be called last or near-to-last, after all other inventory code stuff is handled. + * + * Arguments: + * * user is mob that equipped it + * * slot uses the slot_X defines found in setup.dm for items that can be placed in multiple slots + * * initial is used to indicate whether or not this is the initial equipment (job datums etc) or just a player doing it + */ +/obj/item/proc/on_equipped(mob/user, slot, initial = FALSE) + SHOULD_NOT_OVERRIDE(TRUE) + equipped(user, slot, initial) + if(SEND_SIGNAL(src, COMSIG_ITEM_POST_EQUIPPED, user, slot) && COMPONENT_EQUIPPED_FAILED) + return FALSE + return TRUE + /** * To be overwritten to only perform visual tasks; * this is directly called instead of `equipped` on visual-only features like human dummies equipping outfits. @@ -667,7 +670,7 @@ return /** - * Called after an item is placed in an equipment slot. + * Called by on_equipped. Don't call this directly, we want the ITEM_POST_EQUIPPED signal to be sent after everything else. * * Note that hands count as slots. * @@ -678,7 +681,7 @@ */ /obj/item/proc/equipped(mob/user, slot, initial = FALSE) SHOULD_CALL_PARENT(TRUE) - SEND_SIGNAL(user, COMSIG_HUMAN_EQUIPPING_ITEM, src, slot) + PROTECTED_PROC(TRUE) visual_equipped(user, slot, initial) SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED, user, slot) SEND_SIGNAL(user, COMSIG_MOB_EQUIPPED_ITEM, src, slot) @@ -698,7 +701,7 @@ /// Gives one of our item actions to a mob, when equipped to a certain slot /obj/item/proc/give_item_action(datum/action/action, mob/to_who, slot) // Some items only give their actions buttons when in a specific slot. - if(!item_action_slot_check(slot, to_who)) + if(!item_action_slot_check(slot, to_who, action) || SEND_SIGNAL(src, COMSIG_ITEM_UI_ACTION_SLOT_CHECKED, to_who, action, slot) & COMPONENT_ITEM_ACTION_SLOT_INVALID) // There is a chance we still have our item action currently, // and are moving it from a "valid slot" to an "invalid slot". // So call Remove() here regardless, even if excessive. @@ -708,7 +711,7 @@ action.Grant(to_who) /// Sometimes we only want to grant the item's action if it's equipped in a specific slot. -/obj/item/proc/item_action_slot_check(slot, mob/user) +/obj/item/proc/item_action_slot_check(slot, mob/user, datum/action/action) if(slot & (ITEM_SLOT_BACKPACK|ITEM_SLOT_LEGCUFFED)) //these aren't true slots, so avoid granting actions there return FALSE return TRUE @@ -721,12 +724,14 @@ * * disable_warning to TRUE if you wish it to not give you text outputs. * * slot is the slot we are trying to equip to * * bypass_equip_delay_self for whether we want to bypass the equip delay + * * ignore_equipped ignores any already equipped items in that slot + * * indirect_action allows inserting into "soft locked" bags, things that can be easily opened by the owner */ -/obj/item/proc/mob_can_equip(mob/living/M, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE, ignore_equipped = FALSE) +/obj/item/proc/mob_can_equip(mob/living/M, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE, ignore_equipped = FALSE, indirect_action = FALSE) if(!M) return FALSE - return M.can_equip(src, slot, disable_warning, bypass_equip_delay_self, ignore_equipped) + return M.can_equip(src, slot, disable_warning, bypass_equip_delay_self, ignore_equipped, indirect_action = indirect_action) /obj/item/verb/verb_pickup() set src in oview(1) @@ -776,6 +781,8 @@ return if(SEND_SIGNAL(src, COMSIG_MOVABLE_IMPACT, hit_atom, throwingdatum) & COMPONENT_MOVABLE_IMPACT_NEVERMIND) return + if(SEND_SIGNAL(hit_atom, COMSIG_ATOM_PREHITBY, src, throwingdatum) & COMSIG_HIT_PREVENTED) + return if(get_temperature() && isliving(hit_atom)) var/mob/living/L = hit_atom L.ignite_mob() @@ -836,6 +843,13 @@ return mutable_appearance(SSgreyscale.GetColoredIconByType(greyscale_config_belt, greyscale_colors), icon_state_to_use) return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', icon_state_to_use) +/** + * Extend this to give the item an appearance when placed in a surgical tray. Uses an icon state in `medicart.dmi`. + * * tray_extended - If true, the surgical tray the item is placed on is in "table mode" + */ +/obj/item/proc/get_surgery_tool_overlay(tray_extended) + return null + /obj/item/proc/update_slot_icon() if(!ismob(loc)) return @@ -878,7 +892,7 @@ /obj/item/proc/get_dismember_sound() if(damtype == BURN) - . = 'sound/weapons/sear.ogg' + . = SFX_SEAR else . = SFX_DESECRATION @@ -941,13 +955,36 @@ /obj/item/proc/grind_requirements(obj/machinery/reagentgrinder/R) //Used to check for extra requirements for grinding an object return TRUE -///Called BEFORE the object is ground up - use this to change grind results based on conditions. Use "return -1" to prevent the grinding from occurring +///Called BEFORE the object is ground up - use this to change grind results based on conditions. Return "-1" to prevent the grinding from occurring /obj/item/proc/on_grind() return SEND_SIGNAL(src, COMSIG_ITEM_ON_GRIND) +///Grind item, adding grind_results to item's reagents and transfering to target_holder if specified +/obj/item/proc/grind(datum/reagents/target_holder, mob/user) + if(on_grind() == -1) + return FALSE + if(target_holder) + target_holder.add_reagent_list(grind_results) + if(reagents) + reagents.trans_to(target_holder, reagents.total_volume, transferred_by = user) + return TRUE + +///Called BEFORE the object is ground up - use this to change grind results based on conditions. Return "-1" to prevent the grinding from occurring /obj/item/proc/on_juice() + if(!juice_typepath) + return -1 return SEND_SIGNAL(src, COMSIG_ITEM_ON_JUICE) +///Juice item, converting nutriments into juice_typepath and transfering to target_holder if specified +/obj/item/proc/juice(datum/reagents/target_holder, mob/user) + if(on_juice() == -1) + return FALSE + if(reagents) + reagents.convert_reagent(/datum/reagent/consumable, juice_typepath, include_source_subtypes = TRUE) + if(target_holder) + reagents.trans_to(target_holder, reagents.total_volume, transferred_by = user) + return TRUE + /obj/item/proc/set_force_string() switch(force) if(0 to 4) @@ -1242,9 +1279,9 @@ source_item?.reagents?.add_reagent(/datum/reagent/blood, 2) else if(custom_materials?.len) //if we've got materials, lets see whats in it - /// How many mats have we found? You can only be affected by two material datums by default + // How many mats have we found? You can only be affected by two material datums by default var/found_mats = 0 - /// How much of each material is in it? Used to determine if the glass should break + // How much of each material is in it? Used to determine if the glass should break var/total_material_amount = 0 for(var/mats in custom_materials) @@ -1259,7 +1296,7 @@ //if there's glass in it and the glass is more than 60% of the item, then we can shatter it if(custom_materials[GET_MATERIAL_REF(/datum/material/glass)] >= total_material_amount * 0.60) if(prob(66)) //66% chance to break it - /// The glass shard that is spawned into the source item + // The glass shard that is spawned into the source item var/obj/item/shard/broken_glass = new /obj/item/shard(loc) broken_glass.name = "broken [name]" broken_glass.desc = "This used to be \a [name], but it sure isn't anymore." @@ -1276,10 +1313,10 @@ span_warning("Eugh! Did I just bite into something?")) else if(w_class == WEIGHT_CLASS_TINY) //small items like soap or toys that don't have mat datums - /// victim's chest (for cavity implanting the item) + // victim's chest (for cavity implanting the item) var/obj/item/bodypart/chest/victim_cavity = victim.get_bodypart(BODY_ZONE_CHEST) if(victim_cavity.cavity_item) - victim.vomit(5, FALSE, FALSE, distance = 0) + victim.vomit(vomit_flags = (MOB_VOMIT_MESSAGE | MOB_VOMIT_HARM), lost_nutrition = 5, distance = 0) forceMove(drop_location()) to_chat(victim, span_warning("You vomit up a [name]! [source_item? "Was that in \the [source_item]?" : ""]")) else @@ -1311,6 +1348,8 @@ /obj/item/wash(clean_types) . = ..() + SEND_SIGNAL(src, COMSIG_ATOM_WASHED) + if(ismob(loc)) var/mob/mob_loc = loc mob_loc.regenerate_icons() @@ -1347,7 +1386,8 @@ /// Special stuff you want to do when an outfit equips this item. /obj/item/proc/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot) - return + SHOULD_CALL_PARENT(TRUE) + SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED_AS_OUTFIT, outfit_wearer, visuals_only, item_slot) /// Whether or not this item can be put into a storage item through attackby /obj/item/proc/attackby_storage_insert(datum/storage, atom/storage_holder, mob/user) @@ -1358,7 +1398,7 @@ if(!istype(loc, /turf)) return source = loc - var/image/pickup_animation = image(icon = src, loc = source, layer = layer + 0.1) + var/image/pickup_animation = image(icon = src) SET_PLANE(pickup_animation, GAME_PLANE, source) pickup_animation.transform.Scale(0.75) pickup_animation.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA @@ -1379,13 +1419,13 @@ to_y += 10 pickup_animation.pixel_x += 6 * (prob(50) ? 1 : -1) //6 to the right or left, helps break up the straight upward move - flick_overlay_global(pickup_animation, GLOB.clients, 4) - var/matrix/animation_matrix = new(pickup_animation.transform) + var/atom/movable/flick_visual/pickup = source.flick_overlay_view(pickup_animation, 0.4 SECONDS) + var/matrix/animation_matrix = new(pickup.transform) animation_matrix.Turn(pick(-30, 30)) animation_matrix.Scale(0.65) - animate(pickup_animation, alpha = 175, pixel_x = to_x, pixel_y = to_y, time = 3, transform = animation_matrix, easing = CUBIC_EASING) - animate(alpha = 0, transform = matrix().Scale(0.7), time = 1) + animate(pickup, alpha = 175, pixel_x = to_x, pixel_y = to_y, time = 0.3 SECONDS, transform = animation_matrix, easing = CUBIC_EASING) + animate(alpha = 0, transform = matrix().Scale(0.7), time = 0.1 SECONDS) /obj/item/proc/do_drop_animation(atom/moving_from) if(!istype(loc, /turf)) @@ -1432,9 +1472,9 @@ /atom/movable/proc/do_item_attack_animation(atom/attacked_atom, visual_effect_icon, obj/item/used_item) var/image/attack_image if(visual_effect_icon) - attack_image = image('icons/effects/effects.dmi', attacked_atom, visual_effect_icon, attacked_atom.layer + 0.1) + attack_image = image(icon = 'icons/effects/effects.dmi', icon_state = visual_effect_icon) else if(used_item) - attack_image = image(icon = used_item, loc = attacked_atom, layer = attacked_atom.layer + 0.1) + attack_image = image(icon = used_item) attack_image.plane = attacked_atom.plane + 1 // Scale the icon. @@ -1461,12 +1501,12 @@ if(!attack_image) return - flick_overlay_global(attack_image, GLOB.clients, 10) + var/atom/movable/flick_visual/attack = attacked_atom.flick_overlay_view(attack_image, 1 SECONDS) var/matrix/copy_transform = new(transform) // And animate the attack! - animate(attack_image, alpha = 175, transform = copy_transform.Scale(0.75), pixel_x = 0, pixel_y = 0, pixel_z = 0, time = 3) - animate(time = 1) - animate(alpha = 0, time = 3, easing = CIRCULAR_EASING|EASE_OUT) + animate(attack, alpha = 175, transform = copy_transform.Scale(0.75), pixel_x = 0, pixel_y = 0, pixel_z = 0, time = 0.3 SECONDS) + animate(time = 0.1 SECONDS) + animate(alpha = 0, time = 0.3 SECONDS, easing = CIRCULAR_EASING|EASE_OUT) /// Common proc used by painting tools like spraycans and palettes that can access the entire 24 bits color space. /obj/item/proc/pick_painting_tool_color(mob/user, default_color) @@ -1547,3 +1587,57 @@ /obj/item/update_atom_colour() . = ..() update_slot_icon() + +/// Modifies the fantasy variable +/obj/item/proc/modify_fantasy_variable(variable_key, value, bonus, minimum = 0) + var/result = LAZYACCESS(fantasy_modifications, variable_key) + if(!isnull(result)) + if(HAS_TRAIT(src, TRAIT_INNATELY_FANTASTICAL_ITEM)) + return result // we are immune to your foul magicks you inferior wizard, we keep our bonuses + + stack_trace("modify_fantasy_variable was called twice for the same key '[variable_key]' on type '[type]' before reset_fantasy_variable could be called!") + + var/intended_target = value + bonus + value = max(minimum, intended_target) + + var/difference = intended_target - value + var/modified_amount = bonus - difference + LAZYSET(fantasy_modifications, variable_key, modified_amount) + return value + +/// Returns the original fantasy variable value +/obj/item/proc/reset_fantasy_variable(variable_key, current_value) + var/modification = LAZYACCESS(fantasy_modifications, variable_key) + + if(isnum(modification) && HAS_TRAIT(src, TRAIT_INNATELY_FANTASTICAL_ITEM)) + return modification // we are immune to your foul magicks you inferior wizard, we keep our bonuses the way they are + + LAZYREMOVE(fantasy_modifications, variable_key) + if(isnull(modification)) + return current_value + + return current_value - modification + +/obj/item/proc/apply_fantasy_bonuses(bonus) + SHOULD_CALL_PARENT(TRUE) + SEND_SIGNAL(src, COMSIG_ITEM_APPLY_FANTASY_BONUSES, bonus) + force = modify_fantasy_variable("force", force, bonus) + throwforce = modify_fantasy_variable("throwforce", throwforce, bonus) + wound_bonus = modify_fantasy_variable("wound_bonus", wound_bonus, bonus) + bare_wound_bonus = modify_fantasy_variable("bare_wound_bonus", bare_wound_bonus, bonus) + toolspeed = modify_fantasy_variable("toolspeed", toolspeed, -bonus/10, minimum = 0.1) + +/obj/item/proc/remove_fantasy_bonuses(bonus) + SHOULD_CALL_PARENT(TRUE) + force = reset_fantasy_variable("force", force) + throwforce = reset_fantasy_variable("throwforce", throwforce) + wound_bonus = reset_fantasy_variable("wound_bonus", wound_bonus) + bare_wound_bonus = reset_fantasy_variable("bare_wound_bonus", bare_wound_bonus) + toolspeed = reset_fantasy_variable("toolspeed", toolspeed) + SEND_SIGNAL(src, COMSIG_ITEM_REMOVE_FANTASY_BONUSES, bonus) + +//automatically finds tool behavior if there is only one. requires an extension of the proc if a tool has multiple behaviors +/obj/item/proc/get_all_tool_behaviours() + if (!isnull(tool_behaviour)) + return list(tool_behaviour) + return null diff --git a/code/game/objects/items/AI_modules/_AI_modules.dm b/code/game/objects/items/AI_modules/_AI_modules.dm index c8c84ad86c840..8a1b179d99864 100644 --- a/code/game/objects/items/AI_modules/_AI_modules.dm +++ b/code/game/objects/items/AI_modules/_AI_modules.dm @@ -3,7 +3,7 @@ /obj/item/ai_module name = "\improper AI module" - icon = 'icons/obj/module.dmi' + icon = 'icons/obj/assemblies/module.dmi' icon_state = "std_mod" inhand_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm index d212630a6be02..a11eae5f4d528 100644 --- a/code/game/objects/items/airlock_painter.dm +++ b/code/game/objects/items/airlock_painter.dm @@ -2,7 +2,7 @@ name = "airlock painter" desc = "An advanced autopainter preprogrammed with several paintjobs for airlocks. Use it on an airlock during or after construction to change the paintjob." desc_controls = "Alt-Click to remove the ink cartridge." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/device.dmi' icon_state = "paint_sprayer" inhand_icon_state = "paint_sprayer" worn_icon_state = "painter" @@ -149,7 +149,7 @@ /obj/item/airlock_painter/AltClick(mob/user) . = ..() - if(ink) + if(ink && user.can_perform_action(src)) playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) ink.forceMove(user.drop_location()) user.put_in_hands(ink) @@ -160,7 +160,7 @@ name = "decal painter" desc = "An airlock painter, reprogramed to use a different style of paint in order to apply decals for floor tiles as well, in addition to repainting doors. Decals break when the floor tiles are removed." desc_controls = "Alt-Click to remove the ink cartridge." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/device.dmi' icon_state = "decal_sprayer" inhand_icon_state = "decal_sprayer" custom_materials = list(/datum/material/iron= SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/glass= SMALL_MATERIAL_AMOUNT * 0.5) diff --git a/code/game/objects/items/bear_armor.dm b/code/game/objects/items/bear_armor.dm new file mode 100644 index 0000000000000..a951648d3d090 --- /dev/null +++ b/code/game/objects/items/bear_armor.dm @@ -0,0 +1,27 @@ +/obj/item/bear_armor + name = "pile of bear armor" + desc = "A scattered pile of various shaped armor pieces fitted for a bear, some duct tape, and a nail filer. Crude instructions \ + are written on the back of one of the plates in russian. This seems like an awful idea." + icon = 'icons/obj/device.dmi' + icon_state = "bear_armor_upgrade" + +/obj/item/bear_armor/afterattack(atom/target, mob/user, proximity_flag) + . = ..() + if(!proximity_flag) + return + if(!istype(target, /mob/living/basic/bear)) + return + var/mob/living/basic/bear/bear_target = target + if(bear_target.armored) + to_chat(user, span_warning("[bear_target] has already been armored up!")) + return + bear_target.armored = TRUE + bear_target.maxHealth += 60 + bear_target.health += 60 + bear_target.armour_penetration += 20 + bear_target.melee_damage_lower += 3 + bear_target.melee_damage_upper += 5 + bear_target.wound_bonus += 5 + bear_target.update_icons() + to_chat(user, span_info("You strap the armor plating to [bear_target] and sharpen [bear_target.p_their()] claws with the nail filer. This was a great idea.")) + qdel(src) diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index b62b84e1d8132..b8419235aae88 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -1,12 +1,14 @@ /obj/item/areaeditor name = "area modification item" - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/scrolls.dmi' icon_state = "blueprints" inhand_icon_state = "blueprints" attack_verb_continuous = list("attacks", "baps", "hits") attack_verb_simple = list("attack", "bap", "hit") var/fluffnotice = "Nobody's gonna read this stuff!" var/in_use = FALSE + ///When using it to create a new area, this will be its type. + var/new_area_type = /area /obj/item/areaeditor/attack_self(mob/user) add_fingerprint(user) @@ -35,7 +37,7 @@ to_chat(usr, span_warning("You cannot edit restricted areas.")) return in_use = TRUE - create_area(usr) + create_area(usr, new_area_type) in_use = FALSE updateUsrDialog() @@ -43,7 +45,7 @@ /obj/item/areaeditor/blueprints name = "station blueprints" desc = "Blueprints of the station. There is a \"Classified\" stamp and several coffee stains on it." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/scrolls.dmi' icon_state = "blueprints" fluffnotice = "Property of Nanotrasen. For heads of staff only. Store in high-secure storage." resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF @@ -206,10 +208,16 @@ /obj/item/areaeditor/blueprints/cyborg name = "station schematics" desc = "A digital copy of the station blueprints stored in your memory." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/scrolls.dmi' icon_state = "blueprints" fluffnotice = "Intellectual Property of Nanotrasen. For use in engineering cyborgs only. Wipe from memory upon departure from the station." +/obj/item/areaeditor/blueprints/golem + name = "land claim" + desc = "Use it to build new structures in the wastes." + fluffnotice = "In memory of the Liberator's brother, Delaminator, and his Scarlet Macaw-iathan, from which this artifact was stolen." + new_area_type = /area/golem + /proc/rename_area(a, new_name) var/area/A = get_area(a) var/prevname = "[A.name]" diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index 8ec10f7b12b7e..7e67b23c3b716 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -2,7 +2,7 @@ /obj/item/bodybag name = "body bag" desc = "A folded bag designed for the storage and transportation of cadavers." - icon = 'icons/obj/bodybag.dmi' + icon = 'icons/obj/medical/bodybag.dmi' icon_state = "bodybag_folded" w_class = WEIGHT_CLASS_SMALL ///Stored path we use for spawning a new body bag entity when unfolded. @@ -20,6 +20,12 @@ if(isopenturf(target)) deploy_bodybag(user, target) +/obj/item/bodybag/attempt_pickup(mob/user) + // can't pick ourselves up if we are inside of the bodybag, else very weird things may happen + if(contains(user)) + return TRUE + return ..() + /** * Creates a new body bag item when unfolded, at the provided location, replacing the body bag item. * * mob/user: User opening the body bag. @@ -48,7 +54,7 @@ /obj/item/bodybag/bluespace name = "bluespace body bag" desc = "A folded bluespace body bag designed for the storage and transportation of cadavers." - icon = 'icons/obj/bodybag.dmi' + icon = 'icons/obj/medical/bodybag.dmi' icon_state = "bluebodybag_folded" unfoldedbag_path = /obj/structure/closet/body_bag/bluespace w_class = WEIGHT_CLASS_SMALL @@ -100,7 +106,7 @@ /obj/item/bodybag/environmental name = "environmental protection bag" desc = "A folded, reinforced bag designed to protect against exoplanetary environmental storms." - icon = 'icons/obj/bodybag.dmi' + icon = 'icons/obj/medical/bodybag.dmi' icon_state = "envirobag_folded" unfoldedbag_path = /obj/structure/closet/body_bag/environmental w_class = WEIGHT_CLASS_NORMAL //It's reinforced and insulated, like a beefed-up sleeping bag, so it has a higher bulkiness than regular bodybag @@ -116,7 +122,7 @@ /obj/item/bodybag/environmental/prisoner name = "prisoner transport bag" desc = "Intended for transport of prisoners through hazardous environments, this folded environmental protection bag comes with straps to keep an occupant secure." - icon = 'icons/obj/bodybag.dmi' + icon = 'icons/obj/medical/bodybag.dmi' icon_state = "prisonerenvirobag_folded" unfoldedbag_path = /obj/structure/closet/body_bag/environmental/prisoner @@ -127,7 +133,7 @@ /obj/item/bodybag/environmental/prisoner/syndicate name = "syndicate prisoner transport bag" desc = "An alteration of Nanotrasen's environmental protection bag which has been used in several high-profile kidnappings. Designed to keep a victim unconscious, alive, and secured until they are transported to a required location." - icon = 'icons/obj/bodybag.dmi' + icon = 'icons/obj/medical/bodybag.dmi' icon_state = "syndieenvirobag_folded" unfoldedbag_path = /obj/structure/closet/body_bag/environmental/prisoner/pressurized/syndicate resistance_flags = ACID_PROOF | FIRE_PROOF | FREEZE_PROOF | LAVA_PROOF diff --git a/code/game/objects/items/botpad_remote.dm b/code/game/objects/items/botpad_remote.dm index 70a74ad3be6bc..49c49e8cb73cc 100644 --- a/code/game/objects/items/botpad_remote.dm +++ b/code/game/objects/items/botpad_remote.dm @@ -40,7 +40,7 @@ connected_botpad = buffered_remote connected_botpad.connected_remote = src connected_botpad.id = id - multitool.buffer = null + multitool.set_buffer(null) to_chat(user, span_notice("You connect the controller to the pad with data from the [multitool.name]'s buffer.")) else to_chat(user, span_warning("Unable to upload!")) diff --git a/code/game/objects/items/boxcutter.dm b/code/game/objects/items/boxcutter.dm index ebf5eac5bbc27..62273c1080fc1 100644 --- a/code/game/objects/items/boxcutter.dm +++ b/code/game/objects/items/boxcutter.dm @@ -1,7 +1,7 @@ /obj/item/boxcutter name = "boxcutter" desc = "A tool for cutting boxes, or throats." - icon = 'icons/obj/boxcutter.dmi' + icon = 'icons/obj/tools.dmi' icon_state = "boxcutter" inhand_icon_state = "boxcutter" base_icon_state = "boxcutter" @@ -13,15 +13,14 @@ w_class = WEIGHT_CLASS_SMALL resistance_flags = FIRE_PROOF force = 0 - var/start_extended = FALSE - /// Whether or not the boxcutter has been readied - var/on = FALSE - var/on_sound = 'sound/items/boxcutter_activate.ogg' /// Used on Initialize, how much time to cut cable restraints and zipties. var/snap_time_weak_handcuffs = 0 SECONDS /// Used on Initialize, how much time to cut real handcuffs. Null means it can't. var/snap_time_strong_handcuffs = null +/obj/item/boxcutter/get_all_tool_behaviours() + return list(TOOL_KNIFE) + /obj/item/boxcutter/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_updates_onmob) @@ -30,8 +29,8 @@ effectiveness = 100, \ ) - AddComponent(/datum/component/transforming, \ - start_transformed = start_extended, \ + AddComponent( \ + /datum/component/transforming, \ force_on = 10, \ throwforce_on = 4, \ throw_speed_on = throw_speed, \ @@ -47,8 +46,7 @@ /obj/item/boxcutter/proc/on_transform(obj/item/source, mob/user, active) SIGNAL_HANDLER - on = active - playsound(src, on_sound, 50) + playsound(src, 'sound/items/boxcutter_activate.ogg', 50) tool_behaviour = (active ? TOOL_KNIFE : NONE) if(active) AddElement(/datum/element/cuffsnapping, snap_time_weak_handcuffs, snap_time_strong_handcuffs) diff --git a/code/game/objects/items/broom.dm b/code/game/objects/items/broom.dm index ec08eec60d389..6b89ab7b7926e 100644 --- a/code/game/objects/items/broom.dm +++ b/code/game/objects/items/broom.dm @@ -4,7 +4,7 @@ /obj/item/pushbroom name = "push broom" desc = "This is my BROOMSTICK! It can be used manually or braced with two hands to sweep items as you move. It has a telescopic handle for compact storage." - icon = 'icons/obj/janitor.dmi' + icon = 'icons/obj/service/janitor.dmi' icon_state = "broom0" base_icon_state = "broom" lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi' @@ -20,7 +20,14 @@ /obj/item/pushbroom/Initialize(mapload) . = ..() - AddComponent(/datum/component/two_handed, force_unwielded=8, force_wielded=12, icon_wielded="[base_icon_state]1", wield_callback = CALLBACK(src, PROC_REF(on_wield)), unwield_callback = CALLBACK(src, PROC_REF(on_unwield))) + AddComponent(/datum/component/jousting, damage_boost_per_tile = 1) + AddComponent(/datum/component/two_handed, \ + force_unwielded = 8, \ + force_wielded = 12, \ + icon_wielded = "[base_icon_state]1", \ + wield_callback = CALLBACK(src, PROC_REF(on_wield)), \ + unwield_callback = CALLBACK(src, PROC_REF(on_unwield)), \ + ) /obj/item/pushbroom/update_icon_state() icon_state = "[base_icon_state]0" diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm index add94ab43417a..65cfcfced2121 100644 --- a/code/game/objects/items/cardboard_cutouts.dm +++ b/code/game/objects/items/cardboard_cutouts.dm @@ -79,7 +79,7 @@ push_over() /obj/item/cardboard_cutout/bullet_act(obj/projectile/P, def_zone, piercing_hit = FALSE) - if(istype(P, /obj/projectile/bullet/reusable)) + if(istype(P, /obj/projectile/bullet)) P.on_hit(src, 0, piercing_hit) visible_message(span_danger("[src] is hit by [P]!")) playsound(src, 'sound/weapons/slice.ogg', 50, TRUE) diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 10724a804cd2c..2e4de954f37f2 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -28,14 +28,29 @@ name = "card" desc = "Does card things." icon = 'icons/obj/card.dmi' + inhand_icon_state = "card-id" + lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' w_class = WEIGHT_CLASS_TINY - var/list/files = list() + /// Cached icon that has been built for this card. Intended to be displayed in chat. Cardboards IDs and actual IDs use it. + var/icon/cached_flat_icon /obj/item/card/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] begins to swipe [user.p_their()] neck with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")) return BRUTELOSS +/obj/item/card/update_overlays() + . = ..() + cached_flat_icon = null + +/// If no cached_flat_icon exists, this proc creates it and crops it. This proc then returns the cached_flat_icon. Intended for use displaying ID card icons in chat. +/obj/item/card/proc/get_cached_flat_icon() + if(!cached_flat_icon) + cached_flat_icon = getFlatIcon(src) + cached_flat_icon.Crop(ID_ICON_BORDERS) + return cached_flat_icon + /* * ID CARDS */ @@ -45,17 +60,11 @@ name = "retro identification card" desc = "A card used to provide ID and determine access across the station." icon_state = "card_grey" - inhand_icon_state = "card-id" worn_icon_state = "nothing" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' slot_flags = ITEM_SLOT_ID armor_type = /datum/armor/card_id resistance_flags = FIRE_PROOF | ACID_PROOF - /// Cached icon that has been built for this card. Intended for use in chat. - var/icon/cached_flat_icon - /// The name registered on the card (for example: Dr Bryan See) var/registered_name = null /// Linked bank account. @@ -104,6 +113,15 @@ fire = 100 acid = 100 +/obj/item/card/id/apply_fantasy_bonuses(bonus) + . = ..() + if(bonus >= 15) + add_access(SSid_access.get_region_access_list(list(REGION_ALL_GLOBAL)), mode = FORCE_ADD_ALL) + else if(bonus >= 10) + add_access(SSid_access.get_region_access_list(list(REGION_ALL_STATION)), mode = FORCE_ADD_ALL) + else if(bonus <= -10) + clear_access() + /obj/item/card/id/Initialize(mapload) . = ..() @@ -136,18 +154,6 @@ . = ..() . += list("[icon2html(get_cached_flat_icon(), user, extra_classes = "bigicon")]") -/obj/item/card/id/update_overlays() - . = ..() - - cached_flat_icon = null - -/// If no cached_flat_icon exists, this proc creates it and crops it. This proc then returns the cached_flat_icon. Intended only for use displaying ID card icons in chat. -/obj/item/card/id/proc/get_cached_flat_icon() - if(!cached_flat_icon) - cached_flat_icon = getFlatIcon(src) - cached_flat_icon.Crop(ID_ICON_BORDERS) - return cached_flat_icon - /obj/item/card/id/get_examine_string(mob/user, thats = FALSE) return "[icon2html(get_cached_flat_icon(), user)] [thats? "That's ":""][get_examine_name(user)]" @@ -440,7 +446,10 @@ context[SCREENTIP_CONTEXT_LMB] = "Show ID" context[SCREENTIP_CONTEXT_RMB] = "Project pay stand" - context[SCREENTIP_CONTEXT_ALT_LMB] = "Withdraw credits" + if(isnull(registered_account) || registered_account.replaceable) //Same check we use when we check if we can assign an account + context[SCREENTIP_CONTEXT_ALT_LMB] = "Assign account" + else + context[SCREENTIP_CONTEXT_ALT_LMB] = "Withdraw credits" return CONTEXTUAL_SCREENTIP_SET /obj/item/card/id/proc/try_project_paystand(mob/user, turf/target) @@ -667,6 +676,13 @@ if(!registered_account || registered_account.replaceable) set_new_account(user) return + if(registered_account.account_debt) + var/choice = tgui_alert(user, "Choose An Action", "Bank Account", list("Withdraw", "Pay Debt")) + if(!choice || QDELETED(user) || QDELETED(src) || !alt_click_can_use_id(user) || loc != user) + return + if(choice == "Pay Debt") + pay_debt(user) + return if (registered_account.being_dumped) registered_account.bank_card_talk(span_warning("内部服务器错误"), TRUE) return @@ -689,6 +705,18 @@ var/difference = amount_to_remove - registered_account.account_balance registered_account.bank_card_talk(span_warning("ERROR: The linked account requires [difference] more credit\s to perform that withdrawal."), TRUE) +/obj/item/card/id/proc/pay_debt(user) + var/amount_to_pay = tgui_input_number(user, "How much do you want to pay? (Max: [registered_account.account_balance] cr)", "Debt Payment", max_value = min(registered_account.account_balance, registered_account.account_debt)) + if(!amount_to_pay || QDELETED(src) || loc != user || !alt_click_can_use_id(user)) + return + var/prev_debt = registered_account.account_debt + var/amount_paid = registered_account.pay_debt(amount_to_pay) + if(amount_paid) + var/message = span_notice("You pay [amount_to_pay] credits of a [prev_debt] cr debt. [registered_account.account_debt] cr to go.") + if(!registered_account.account_debt) + message = span_nicegreen("You pay the last [amount_to_pay] credits of your debt, extinguishing it. Congratulations!") + to_chat(user, message) + /obj/item/card/id/examine(mob/user) . = ..() if(!user.can_read(src)) @@ -725,10 +753,10 @@ break /obj/item/card/id/examine_more(mob/user) + . = ..() if(!user.can_read(src)) return - . = ..() . += span_notice("You examine [src] closer, and note the following...") if(registered_age) @@ -737,6 +765,8 @@ if(registered_account.mining_points) . += "There's [registered_account.mining_points] mining point\s loaded onto the card's bank account." . += "The account linked to the ID belongs to '[registered_account.account_holder]' and reports a balance of [registered_account.account_balance] cr." + if(registered_account.account_debt) + . += span_warning("The account is currently indebted for [registered_account.account_debt] cr. [100*DEBT_COLLECTION_COEFF]% of all earnings will go towards extinguishing it.") if(registered_account.account_job) var/datum/bank_account/D = SSeconomy.get_dep_account(registered_account.account_job.paycheck_department) if(D) @@ -1119,6 +1149,14 @@ registered_name = JOB_ERT_CLOWN trim = /datum/id_trim/centcom/ert/clown +/obj/item/card/id/advanced/centcom/ert/militia + registered_name = "Frontier Militia" + trim = /datum/id_trim/centcom/ert/militia + +/obj/item/card/id/advanced/centcom/ert/militia/general + registered_name = "Frontier Militia General" + trim = /datum/id_trim/centcom/ert/militia/general + /obj/item/card/id/advanced/black name = "black identification card" desc = "This card is telling you one thing and one thing alone. The person holding this card is an utter badass." @@ -1186,8 +1224,6 @@ desc = "You are a number, you are not a free man." icon_state = "card_prisoner" inhand_icon_state = "orange-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' registered_name = "Scum" registered_age = null trim = /datum/id_trim/job/prisoner @@ -1303,9 +1339,11 @@ /obj/item/card/id/advanced/chameleon name = "agent card" - desc = "A highly advanced chameleon ID card. Touch this card on another ID card or player to choose which accesses to copy. Has special magnetic properties which force it to the front of wallets." + desc = "A highly advanced chameleon ID card. Touch this card on another ID card or player to choose which accesses to copy. \ + Has special magnetic properties which force it to the front of wallets." trim = /datum/id_trim/chameleon wildcard_slots = WILDCARD_LIMIT_CHAMELEON + actions_types = list(/datum/action/item_action/chameleon/change/id, /datum/action/item_action/chameleon/change/id_trim) /// Have we set a custom name and job assignment, or will we use what we're given when we chameleon change? var/forged = FALSE @@ -1316,38 +1354,35 @@ /obj/item/card/id/advanced/chameleon/Initialize(mapload) . = ..() - - var/datum/action/item_action/chameleon/change/id/chameleon_card_action = new(src) - chameleon_card_action.chameleon_type = /obj/item/card/id/advanced - chameleon_card_action.chameleon_name = "ID Card" - chameleon_card_action.initialize_disguises() - add_item_action(chameleon_card_action) register_item_context() /obj/item/card/id/advanced/chameleon/Destroy() theft_target = null - . = ..() + return ..() -/obj/item/card/id/advanced/chameleon/afterattack(atom/target, mob/user, proximity) +/obj/item/card/id/advanced/chameleon/afterattack(atom/target, mob/user, proximity, click_parameters) + . = ..() if(!proximity) return if(isidcard(target)) theft_target = WEAKREF(target) ui_interact(user) - return AFTERATTACK_PROCESSED_ITEM - - return ..() + return . | AFTERATTACK_PROCESSED_ITEM /obj/item/card/id/advanced/chameleon/pre_attack_secondary(atom/target, mob/living/user, params) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return . + // If we're attacking a human, we want it to be covert. We're not ATTACKING them, we're trying // to sneakily steal their accesses by swiping our agent ID card near them. As a result, we // return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN to cancel any part of the following the attack chain. if(ishuman(target)) - to_chat(user, "You covertly start to scan [target] with \the [src], hoping to pick up a wireless ID card signal...") + target.balloon_alert(user, "scanning ID card...") if(!do_after(user, 2 SECONDS, target)) - to_chat(user, "The scan was interrupted.") + target.balloon_alert(user, "interrupted!") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN var/mob/living/carbon/human/human_target = target @@ -1355,11 +1390,11 @@ var/list/target_id_cards = human_target.get_all_contents_type(/obj/item/card/id) if(!length(target_id_cards)) - to_chat(user, "The scan failed to locate any ID cards.") + target.balloon_alert(user, "no IDs!") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN var/selected_id = pick(target_id_cards) - to_chat(user, "You successfully sync your [src] with \the [selected_id].") + target.balloon_alert(user, UNLINT("IDs synced")) theft_target = WEAKREF(selected_id) ui_interact(user) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN @@ -1367,7 +1402,7 @@ if(isitem(target)) var/obj/item/target_item = target - to_chat(user, "You covertly start to scan [target] with your [src], hoping to pick up a wireless ID card signal...") + target.balloon_alert(user, "scanning ID card...") var/list/target_id_cards = target_item.get_all_contents_type(/obj/item/card/id) @@ -1377,16 +1412,16 @@ target_id_cards |= target_item_id if(!length(target_id_cards)) - to_chat(user, "The scan failed to locate any ID cards.") + target.balloon_alert(user, "no IDs!") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN var/selected_id = pick(target_id_cards) - to_chat(user, "You successfully sync your [src] with \the [selected_id].") + target.balloon_alert(user, UNLINT("IDs synced")) theft_target = WEAKREF(selected_id) ui_interact(user) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - return ..() + return . /obj/item/card/id/advanced/chameleon/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -1500,92 +1535,103 @@ return TRUE /obj/item/card/id/advanced/chameleon/attack_self(mob/user) - if(isliving(user) && user.mind) - var/popup_input = tgui_input_list(user, "Choose Action", "Agent ID", list("Show", "Forge/Reset", "Change Account ID")) - if(user.incapacitated()) - return - if(!user.is_holding(src)) - return - if(popup_input == "Forge/Reset") - if(!forged) - var/input_name = tgui_input_text(user, "What name would you like to put on this card? Leave blank to randomise.", "Agent card name", registered_name ? registered_name : (ishuman(user) ? user.real_name : user.name), MAX_NAME_LEN) - input_name = sanitize_name(input_name, allow_numbers = TRUE) - if(!input_name) - // Invalid/blank names give a randomly generated one. - if(user.gender == MALE) - input_name = "[pick(GLOB.first_names_male)] [pick(GLOB.last_names)]" - else if(user.gender == FEMALE) - input_name = "[pick(GLOB.first_names_female)] [pick(GLOB.last_names)]" - else - input_name = "[pick(GLOB.first_names)] [pick(GLOB.last_names)]" - - registered_name = input_name - - var/change_trim = tgui_alert(user, "Adjust the appearance of your card's trim?", "Modify Trim", list("Yes", "No")) - if(change_trim == "Yes") - var/list/blacklist = typecacheof(list( - type, - /obj/item/card/id/advanced/simple_bot, - )) - var/list/trim_list = list() - for(var/trim_path in typesof(/datum/id_trim)) - if(blacklist[trim_path]) - continue - - var/datum/id_trim/trim = SSid_access.trim_singletons_by_path[trim_path] - - if(trim && trim.trim_state && trim.assignment) - var/fake_trim_name = "[trim.assignment] ([trim.trim_state])" - trim_list[fake_trim_name] = trim_path - - var/selected_trim_path = tgui_input_list(user, "Select trim to apply to your card.\nNote: This will not grant any trim accesses.", "Forge Trim", sort_list(trim_list, GLOBAL_PROC_REF(cmp_typepaths_asc))) - if(selected_trim_path) - SSid_access.apply_trim_to_chameleon_card(src, trim_list[selected_trim_path]) - - var/target_occupation = tgui_input_text(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels.", "Agent card job assignment", assignment ? assignment : "Assistant") - if(target_occupation) - assignment = target_occupation - - var/new_age = tgui_input_number(user, "Choose the ID's age", "Agent card age", AGE_MIN, AGE_MAX, AGE_MIN) - if(QDELETED(user) || QDELETED(src) || !user.can_perform_action(user, NEED_DEXTERITY| FORBID_TELEKINESIS_REACH)) - return - if(new_age) - registered_age = new_age - - if(tgui_alert(user, "Activate wallet ID spoofing, allowing this card to force itself to occupy the visible ID slot in wallets?", "Wallet ID Spoofing", list("Yes", "No")) == "Yes") - ADD_TRAIT(src, TRAIT_MAGNETIC_ID_CARD, CHAMELEON_ITEM_TRAIT) - - update_label() - update_icon() - forged = TRUE - to_chat(user, span_notice("You successfully forge the ID card.")) - user.log_message("forged \the [initial(name)] with name \"[registered_name]\", occupation \"[assignment]\" and trim \"[trim?.assignment]\".", LOG_GAME) - - if(!registered_account) - if(ishuman(user)) - var/mob/living/carbon/human/accountowner = user - - var/datum/bank_account/account = SSeconomy.bank_accounts_by_id["[accountowner.account_id]"] - if(account) - account.bank_cards += src - registered_account = account - to_chat(user, span_notice("Your account number has been automatically assigned.")) - return - if(forged) - registered_name = initial(registered_name) - assignment = initial(assignment) - SSid_access.remove_trim_from_chameleon_card(src) - REMOVE_TRAIT(src, TRAIT_MAGNETIC_ID_CARD, CHAMELEON_ITEM_TRAIT) - user.log_message("reset \the [initial(name)] named \"[src]\" to default.", LOG_GAME) - update_label() - update_icon() - forged = FALSE - to_chat(user, span_notice("You successfully reset the ID card.")) - return - if (popup_input == "Change Account ID") + if(!user.can_perform_action(user, NEED_DEXTERITY| FORBID_TELEKINESIS_REACH)) + return ..() + var/popup_input = tgui_input_list(user, "Choose Action", "Agent ID", list("Show", "Forge/Reset", "Change Account ID")) + if(!popup_input || !after_input_check(user)) + return TRUE + switch(popup_input) + if ("Change Account ID") set_new_account(user) return - return ..() + if("Show") + return ..() + + ///"Forge/Reset", kept outside the switch() statement to reduce indentation. + if(forged) //reset the ID if forged + registered_name = initial(registered_name) + assignment = initial(assignment) + SSid_access.remove_trim_from_chameleon_card(src) + REMOVE_TRAIT(src, TRAIT_MAGNETIC_ID_CARD, CHAMELEON_ITEM_TRAIT) + user.log_message("reset \the [initial(name)] named \"[src]\" to default.", LOG_GAME) + update_label() + update_icon() + forged = FALSE + to_chat(user, span_notice("You successfully reset the ID card.")) + return + + ///forge the ID if not forged. + var/input_name = tgui_input_text(user, "What name would you like to put on this card? Leave blank to randomise.", "Agent card name", registered_name ? registered_name : (ishuman(user) ? user.real_name : user.name), MAX_NAME_LEN) + if(!after_input_check(user)) + return TRUE + if(input_name) + input_name = sanitize_name(input_name, allow_numbers = TRUE) + if(!input_name) + // Invalid/blank names give a randomly generated one. + if(user.gender == MALE) + input_name = "[pick(GLOB.first_names_male)] [pick(GLOB.last_names)]" + else if(user.gender == FEMALE) + input_name = "[pick(GLOB.first_names_female)] [pick(GLOB.last_names)]" + else + input_name = "[pick(GLOB.first_names)] [pick(GLOB.last_names)]" + + var/change_trim = tgui_alert(user, "Adjust the appearance of your card's trim?", "Modify Trim", list("Yes", "No")) + if(!after_input_check(user)) + return TRUE + var/selected_trim_path + var/static/list/trim_list + if(change_trim == "Yes") + trim_list = list() + for(var/trim_path in typesof(/datum/id_trim)) + var/datum/id_trim/trim = SSid_access.trim_singletons_by_path[trim_path] + if(trim && trim.trim_state && trim.assignment) + var/fake_trim_name = "[trim.assignment] ([trim.trim_state])" + trim_list[fake_trim_name] = trim_path + selected_trim_path = tgui_input_list(user, "Select trim to apply to your card.\nNote: This will not grant any trim accesses.", "Forge Trim", sort_list(trim_list, GLOBAL_PROC_REF(cmp_typepaths_asc))) + if(!after_input_check(user)) + return TRUE + + var/target_occupation = tgui_input_text(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels.", "Agent card job assignment", assignment ? assignment : "Assistant", MAX_NAME_LEN) + if(!after_input_check(user)) + return TRUE + + var/new_age = tgui_input_number(user, "Choose the ID's age", "Agent card age", AGE_MIN, AGE_MAX, AGE_MIN) + if(!after_input_check(user)) + return TRUE + + var/wallet_spoofing = tgui_alert(user, "Activate wallet ID spoofing, allowing this card to force itself to occupy the visible ID slot in wallets?", "Wallet ID Spoofing", list("Yes", "No")) + if(!after_input_check(user)) + return + + registered_name = input_name + if(selected_trim_path) + SSid_access.apply_trim_to_chameleon_card(src, trim_list[selected_trim_path]) + if(target_occupation) + assignment = sanitize(target_occupation) + if(new_age) + registered_age = new_age + if(wallet_spoofing == "Yes") + ADD_TRAIT(src, TRAIT_MAGNETIC_ID_CARD, CHAMELEON_ITEM_TRAIT) + + update_label() + update_icon() + forged = TRUE + to_chat(user, span_notice("You successfully forge the ID card.")) + user.log_message("forged \the [initial(name)] with name \"[registered_name]\", occupation \"[assignment]\" and trim \"[trim?.assignment]\".", LOG_GAME) + + if(!registered_account && ishuman(user)) + var/mob/living/carbon/human/accountowner = user + + var/datum/bank_account/account = SSeconomy.bank_accounts_by_id["[accountowner.account_id]"] + if(account) + account.bank_cards += src + registered_account = account + to_chat(user, span_notice("Your account number has been automatically assigned.")) + +/obj/item/card/id/advanced/chameleon/proc/after_input_check(mob/user) + if(QDELETED(user) || QDELETED(src) || !user.client || !user.can_perform_action(src, NEED_DEXTERITY|FORBID_TELEKINESIS_REACH)) + return FALSE + return TRUE /obj/item/card/id/advanced/chameleon/add_item_context(obj/item/source, list/context, atom/target, mob/living/user,) . = ..() @@ -1640,3 +1686,159 @@ #undef INTERN_THRESHOLD_FALLBACK_HOURS #undef ID_ICON_BORDERS #undef HOLOPAY_PROJECTION_INTERVAL + +#define INDEX_NAME_COLOR 1 +#define INDEX_ASSIGNMENT_COLOR 2 +#define INDEX_TRIM_COLOR 3 + +/** + * A fake ID card any silly-willy can craft with wirecutters, cardboard and a writing utensil + * Beside the gimmick of changing the visible name when worn, they do nothing. They cannot have an account. + * They don't fit in PDAs nor wallets, They have no access. They won't trick securitrons. They won't work with chameleon masks. + * Etcetera etcetera. Furthermore, talking, or getting examined on will pretty much give it away. + */ +/obj/item/card/cardboard + name = "cardboard identification card" + desc = "A card used to provide ID and det- Heeeey, wait a second, this is just a piece of cut cardboard!" + icon_state = "cardboard_id" + inhand_icon_state = "cardboard-id" + worn_icon_state = "nothing" + resistance_flags = FLAMMABLE + slot_flags = ITEM_SLOT_ID + ///The "name" of the "owner" of this "ID" + var/scribbled_name + ///The assignment written on this card. + var/scribbled_assignment + ///An icon state used as trim. + var/scribbled_trim + ///The colors for each of the above variables, for when overlays are updated. + var/details_colors = list("#000000", "#000000", "#000000") + +/obj/item/card/cardboard/equipped(mob/user, slot, initial = FALSE) + . = ..() + if(slot == ITEM_SLOT_ID) + RegisterSignal(user, COMSIG_HUMAN_GET_VISIBLE_NAME, PROC_REF(return_visible_name)) + RegisterSignal(user, COMSIG_MOVABLE_MESSAGE_GET_NAME_PART, PROC_REF(return_message_name_part)) + +/obj/item/card/cardboard/dropped(mob/user, silent = FALSE) + . = ..() + UnregisterSignal(user, list(COMSIG_HUMAN_GET_VISIBLE_NAME, COMSIG_MOVABLE_MESSAGE_GET_NAME_PART)) + +/obj/item/card/cardboard/proc/return_visible_name(mob/living/carbon/human/source, list/identity) + SIGNAL_HANDLER + identity[VISIBLE_NAME_ID] = scribbled_name + +/obj/item/card/cardboard/proc/return_message_name_part(mob/living/carbon/human/source, list/stored_name, visible_name) + SIGNAL_HANDLER + if(visible_name) + return + var/voice_name = source.GetVoice() + if(source.name != voice_name) + voice_name += " (as [scribbled_name])" + stored_name[NAME_PART_INDEX] = voice_name + +/obj/item/card/cardboard/attackby(obj/item/item, mob/living/user, params) + if(user.can_write(item, TRUE)) + INVOKE_ASYNC(src, PROC_REF(modify_card), user, item) + return TRUE + return ..() + +///Lets the user write a name, assignment or trim on the card, or reset it. Only the name is important for the component. +/obj/item/card/cardboard/proc/modify_card(mob/living/user, obj/item/item) + if(!user.mind) + return + var/popup_input = tgui_input_list(user, "What To Change", "Cardboard ID", list("Name", "Assignment", "Trim", "Reset")) + if(!after_input_check(user, item, popup_input)) + return + switch(popup_input) + if("Name") + var/input_name = tgui_input_text(user, "What name would you like to put on this card?", "Cardboard card name", scribbled_name || (ishuman(user) ? user.real_name : user.name), MAX_NAME_LEN) + input_name = sanitize_name(input_name, allow_numbers = TRUE) + if(!after_input_check(user, item, input_name, scribbled_name)) + return + scribbled_name = input_name + var/list/details = item.get_writing_implement_details() + details_colors[INDEX_NAME_COLOR] = details["color"] || "#000000" + if("Assignment") + var/input_assignment = tgui_input_text(user, "What assignment would you like to put on this card?", "Cardboard card job ssignment", scribbled_assignment || "Assistant", MAX_NAME_LEN) + if(!after_input_check(user, item, input_assignment, scribbled_assignment)) + return + scribbled_assignment = sanitize(input_assignment) + var/list/details = item.get_writing_implement_details() + details_colors[INDEX_ASSIGNMENT_COLOR] = details["color"] || "#000000" + if("Trim") + var/static/list/possible_trims + if(!possible_trims) + possible_trims = list() + for(var/trim_path in typesof(/datum/id_trim)) + var/datum/id_trim/trim = SSid_access.trim_singletons_by_path[trim_path] + if(trim?.trim_state && trim.assignment) + possible_trims |= replacetext(trim.trim_state, "trim_", "") + sortTim(possible_trims, GLOBAL_PROC_REF(cmp_typepaths_asc)) + var/input_trim = tgui_input_list(user, "Select trim to apply to your card.\nNote: This will not grant any trim accesses.", "Forge Trim", possible_trims) + if(!input_trim || !after_input_check(user, item, input_trim, scribbled_trim)) + return + scribbled_trim = "cardboard_[input_trim]" + var/list/details = item.get_writing_implement_details() + details_colors[INDEX_TRIM_COLOR] = details["color"] || "#000000" + if("Reset") + scribbled_name = null + scribbled_assignment = null + scribbled_trim = null + details_colors = list("#000000", "#000000", "#000000") + + update_appearance() + +///Checks that the conditions to be able to modify the cardboard card are still present after user input calls. +/obj/item/card/cardboard/proc/after_input_check(mob/living/user, obj/item/item, input, value) + if(!input || (value && input == value)) + return FALSE + if(QDELETED(user) || QDELETED(item) || QDELETED(src) || user.incapacitated() || !user.is_holding(item) || !user.CanReach(src) || !user.can_write(item)) + return FALSE + return TRUE + +/obj/item/card/cardboard/attack_self(mob/user) + if(!Adjacent(user)) + return + user.visible_message(span_notice("[user] shows you: [icon2html(src, viewers(user))] [name]."), span_notice("You show \the [name].")) + add_fingerprint(user) + +/obj/item/card/cardboard/update_name() + . = ..() + if(!scribbled_name) + name = initial(name) + return + name = "[scribbled_name]'s ID Card ([scribbled_assignment])" + +/obj/item/card/cardboard/update_overlays() + . = ..() + if(scribbled_name) + var/mutable_appearance/name_overlay = mutable_appearance(icon, "cardboard_name") + name_overlay.color = details_colors[INDEX_NAME_COLOR] + . += name_overlay + if(scribbled_assignment) + var/mutable_appearance/assignment_overlay = mutable_appearance(icon, "cardboard_assignment") + assignment_overlay.color = details_colors[INDEX_ASSIGNMENT_COLOR] + . += assignment_overlay + if(scribbled_trim) + var/mutable_appearance/frame_overlay = mutable_appearance(icon, "cardboard_frame") + frame_overlay.color = details_colors[INDEX_TRIM_COLOR] + . += frame_overlay + var/mutable_appearance/trim_overlay = mutable_appearance(icon, scribbled_trim) + trim_overlay.color = details_colors[INDEX_TRIM_COLOR] + . += trim_overlay + +/obj/item/card/cardboard/get_id_examine_strings(mob/user) + . = ..() + . += list("[icon2html(get_cached_flat_icon(), user, extra_classes = "bigicon")]") + +/obj/item/card/cardboard/get_examine_string(mob/user, thats = FALSE) + return "[icon2html(get_cached_flat_icon(), user)] [thats? "That's ":""][get_examine_name(user)]" + +/obj/item/card/cardboard/examine(mob/user) + . = ..() + . += span_notice("You could use a pen or crayon to forge a name, assignment or trim.") + +#undef INDEX_NAME_COLOR +#undef INDEX_ASSIGNMENT_COLOR +#undef INDEX_TRIM_COLOR diff --git a/code/game/objects/items/chainsaw.dm b/code/game/objects/items/chainsaw.dm index 20e3df19a1434..e26f9aa2e995f 100644 --- a/code/game/objects/items/chainsaw.dm +++ b/code/game/objects/items/chainsaw.dm @@ -27,6 +27,18 @@ ///The looping sound for our chainsaw when running var/datum/looping_sound/chainsaw/chainsaw_loop +/obj/item/chainsaw/apply_fantasy_bonuses(bonus) + . = ..() + force_on = modify_fantasy_variable("force_on", force_on, bonus) + if(on) + force = force_on + +/obj/item/chainsaw/remove_fantasy_bonuses(bonus) + force_on = reset_fantasy_variable("force_on", force_on) + if(on) + force = force_on + return ..() + /obj/item/chainsaw/Initialize(mapload) . = ..() chainsaw_loop = new(src) diff --git a/code/game/objects/items/charter.dm b/code/game/objects/items/charter.dm index d5a2409033dc4..55dd8bad996ea 100644 --- a/code/game/objects/items/charter.dm +++ b/code/game/objects/items/charter.dm @@ -2,8 +2,8 @@ /obj/item/station_charter name = "station charter" - icon = 'icons/obj/wizard.dmi' - icon_state = "scroll2" + icon = 'icons/obj/scrolls.dmi' + icon_state = "charter" desc = "An official document entrusting the governance of the station \ and surrounding space to the Captain." var/used = FALSE @@ -121,37 +121,3 @@ used = TRUE #undef STATION_RENAME_TIME_LIMIT - -/obj/item/station_charter/revolution - name = "revolutionary banner" - desc = "A banner symbolizing a bloody victory over treacherous tyrants." - icon = 'icons/obj/banner.dmi' - icon_state = "banner_revolution" - inhand_icon_state = "banner-red" - lefthand_file = 'icons/mob/inhands/equipment/banners_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/banners_righthand.dmi' - w_class = 5 - force = 15 - ignores_timeout = TRUE //non roundstart! - //A cooldown, once it's over you can't declare a new name anymore - COOLDOWN_DECLARE(cutoff) - -/obj/item/station_charter/revolution/Initialize(mapload) - . = ..() - COOLDOWN_START(src, cutoff, 5 MINUTES) - -/obj/item/station_charter/revolution/attack_self(mob/living/user) - if(COOLDOWN_FINISHED(src, cutoff) && !used) - to_chat(user, span_warning("You have lost the victorious fervor to declare a new name.")) - return - . = ..() - -/obj/item/station_charter/revolution/rename_station(designation, uname, ureal_name, ukey) - set_station_name(designation) - minor_announce("Head Revolutionary [ureal_name] has declared the station's new name as [html_decode(station_name())]!", "Revolution Banner") //decode station_name to avoid minor_announce double encode - log_game("[ukey] has renamed the station as [station_name()].") - name = "banner of [station_name()]" - desc = "A banner symbolizing a bloody victory over treacherous tyrants. The revolutionary leader [uname] has named the station [station_name()] to make clear that this station shall never be shackled by oppressors again." - SSblackbox.record_feedback("text", "station_renames", 1, "[station_name()]") - if(!unlimited_uses) - used = TRUE diff --git a/code/game/objects/items/chromosome.dm b/code/game/objects/items/chromosome.dm index 9e7dd7f3b0bd6..d7fd7b39544be 100644 --- a/code/game/objects/items/chromosome.dm +++ b/code/game/objects/items/chromosome.dm @@ -1,6 +1,6 @@ /obj/item/chromosome name = "blank chromosome" - icon = 'icons/obj/chromosomes.dmi' + icon = 'icons/obj/science/chromosomes.dmi' icon_state = "" desc = "A tube holding chromosomic data." force = 0 diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index c44a04cad0723..4eef46129cf92 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -135,6 +135,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM body_parts_covered = null grind_results = list() heat = 1000 + throw_verb = "flick" /// Whether this cigarette has been lit. var/lit = FALSE /// Whether this cigarette should start lit. @@ -212,17 +213,27 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(!lighting_text) return ..() - if(!reagents.has_reagent(/datum/reagent/oxygen)) //cigarettes need oxygen - var/datum/gas_mixture/air = return_air() - if(!air || !air.has_gas(/datum/gas/oxygen, 1)) //or oxygen on a tile to burn - to_chat(user, span_notice("Your [name] needs a source of oxygen to burn.")) - return ..() + if(!check_oxygen(user)) //cigarettes need oxygen + balloon_alert(user, "no air!") + return ..() if(smoketime > 0) light(lighting_text) else to_chat(user, span_warning("There is nothing to smoke!")) +/// Checks that we have enough air to smoke +/obj/item/clothing/mask/cigarette/proc/check_oxygen(mob/user) + if (reagents.has_reagent(/datum/reagent/oxygen)) + return TRUE + var/datum/gas_mixture/air = return_air() + if (!isnull(air) && air.has_gas(/datum/gas/oxygen, 1)) + return TRUE + if (!iscarbon(user)) + return FALSE + var/mob/living/carbon/the_smoker = user + return the_smoker.can_breathe_helmet() + /obj/item/clothing/mask/cigarette/afterattack(obj/item/reagent_containers/cup/glass, mob/user, proximity) . = ..() if(!proximity || lit) //can't dip if cigarette is lit (it will heat the reagents in the glass instead) @@ -230,7 +241,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(!istype(glass)) //you can dip cigarettes into beakers return - if(glass.reagents.trans_to(src, chem_volume, transfered_by = user)) //if reagents were transfered, show the message + if(glass.reagents.trans_to(src, chem_volume, transferred_by = user)) //if reagents were transferred, show the message to_chat(user, span_notice("You dip \the [src] into \the [glass].")) //if not, either the beaker was empty, or the cigarette was full else if(!glass.reagents.total_volume) @@ -321,26 +332,40 @@ CIGARETTE PACKETS ARE IN FANCY.DM return var/to_smoke = smoke_all ? (reagents.total_volume * (dragtime / smoketime)) : REAGENTS_METABOLISM var/mob/living/carbon/smoker = loc - if(!istype(smoker) || src != smoker.wear_mask) - reagents.remove_any(to_smoke) - return + // These checks are a bit messy but at least they're fairly readable + // Check if the smoker is a carbon mob, since it needs to have wear_mask + if(!istype(smoker)) + // If not, check if it's a gas mask + if(!istype(smoker, /obj/item/clothing/mask/gas)) + reagents.remove_any(to_smoke) + return + + smoker = smoker.loc + + // If it is, check if that mask is on a carbon mob + if(!istype(smoker) || smoker.get_item_by_slot(ITEM_SLOT_MASK) != loc) + reagents.remove_any(to_smoke) + return + else + if(src != smoker.wear_mask) + reagents.remove_any(to_smoke) + return reagents.expose(smoker, INGEST, min(to_smoke / reagents.total_volume, 1)) var/obj/item/organ/internal/lungs/lungs = smoker.get_organ_slot(ORGAN_SLOT_LUNGS) - if(lungs && !(lungs.organ_flags & ORGAN_SYNTHETIC)) + if(lungs && IS_ORGANIC_ORGAN(lungs)) var/smoker_resistance = HAS_TRAIT(smoker, TRAIT_SMOKER) ? 0.5 : 1 - smoker.adjustOrganLoss(ORGAN_SLOT_LUNGS, lung_harm*smoker_resistance) + smoker.adjustOrganLoss(ORGAN_SLOT_LUNGS, lung_harm * smoker_resistance) if(!reagents.trans_to(smoker, to_smoke, methods = INGEST, ignore_stomach = TRUE)) reagents.remove_any(to_smoke) /obj/item/clothing/mask/cigarette/process(seconds_per_tick) var/mob/living/user = isliving(loc) ? loc : null user?.ignite_mob() - if(!reagents.has_reagent(/datum/reagent/oxygen)) //cigarettes need oxygen - var/datum/gas_mixture/air = return_air() - if(!air || !air.has_gas(/datum/gas/oxygen, 1)) //or oxygen on a tile to burn - extinguish() - return + + if(!check_oxygen(user)) + extinguish() + return smoketime -= seconds_per_tick * (1 SECONDS) if(smoketime <= 0) @@ -658,7 +683,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM packeditem = to_smoke.name update_name() if(to_smoke.reagents) - to_smoke.reagents.trans_to(src, to_smoke.reagents.total_volume, transfered_by = user) + to_smoke.reagents.trans_to(src, to_smoke.reagents.total_volume, transferred_by = user) qdel(to_smoke) @@ -723,8 +748,23 @@ CIGARETTE PACKETS ARE IN FANCY.DM . = ..() if(!overlay_state) overlay_state = pick(overlay_list) + AddComponent(\ + /datum/component/bullet_intercepting,\ + block_chance = 0.5,\ + active_slots = ITEM_SLOT_SUITSTORE,\ + on_intercepted = CALLBACK(src, PROC_REF(on_intercepted_bullet)),\ + ) update_appearance() +/// Destroy the lighter when it's shot by a bullet +/obj/item/lighter/proc/on_intercepted_bullet(mob/living/victim, obj/projectile/bullet) + victim.visible_message(span_warning("\The [bullet] shatters on [victim]'s lighter!")) + playsound(victim, get_sfx(SFX_RICOCHET), 100, TRUE) + new /obj/effect/decal/cleanable/oil(get_turf(src)) + do_sparks(1, TRUE, src) + victim.dropItemToGround(src, force = TRUE, silent = TRUE) + qdel(src) + /obj/item/lighter/cyborg_unequip(mob/user) if(!lit) return @@ -848,7 +888,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM return if(fancy) - cig.light(span_rose("[user] whips the [name] out and holds it for [M]. [user.p_their(TRUE)] arm is as steady as the unflickering flame [user.p_they()] light[user.p_s()] \the [cig] with.")) + cig.light(span_rose("[user] whips the [name] out and holds it for [M]. [user.p_Their()] arm is as steady as the unflickering flame [user.p_they()] light[user.p_s()] \the [cig] with.")) else cig.light(span_notice("[user] holds the [name] out for [M], and lights [M.p_their()] [cig.name].")) @@ -1060,21 +1100,25 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(screw && (obj_flags & EMAGGED)) to_chat(user, span_warning("[src] can't be modified!")) -/obj/item/clothing/mask/vape/emag_act(mob/user)// I WON'T REGRET WRITTING THIS, SURLY. - if(screw) - if(!(obj_flags & EMAGGED)) - obj_flags |= EMAGGED - super = FALSE - to_chat(user, span_warning("You maximize the voltage of [src].")) - icon_state = "vape_open_high" - set_greyscale(new_config = /datum/greyscale_config/vape/open_high) - var/datum/effect_system/spark_spread/sp = new /datum/effect_system/spark_spread //for effect - sp.set_up(5, 1, src) - sp.start() - else - to_chat(user, span_warning("[src] is already emagged!")) - else - to_chat(user, span_warning("You need to open the cap to do that!")) +/obj/item/clothing/mask/vape/emag_act(mob/user, obj/item/card/emag/emag_card) // I WON'T REGRET WRITTING THIS, SURLY. + + if (!screw) + balloon_alert(user, "open the cap first!") + return FALSE + + if (obj_flags & EMAGGED) + balloon_alert(user, "already emagged!") + return FALSE + + obj_flags |= EMAGGED + super = FALSE + balloon_alert(user, "voltage maximized") + icon_state = "vape_open_high" + set_greyscale(new_config = /datum/greyscale_config/vape/open_high) + var/datum/effect_system/spark_spread/sp = new /datum/effect_system/spark_spread //for effect + sp.set_up(5, 1, src) + sp.start() + return TRUE /obj/item/clothing/mask/vape/attack_self(mob/user) if(reagents.total_volume > 0) diff --git a/code/game/objects/items/circuitboards/circuitboard.dm b/code/game/objects/items/circuitboards/circuitboard.dm index a2caca56213eb..1e12576f68626 100644 --- a/code/game/objects/items/circuitboards/circuitboard.dm +++ b/code/game/objects/items/circuitboards/circuitboard.dm @@ -7,7 +7,7 @@ name = "circuit board" /// extension that is applied after the initial name AKA (Computer/Machine Board) var/name_extension = null - icon = 'icons/obj/module.dmi' + icon = 'icons/obj/assemblies/module.dmi' icon_state = "circuit_map" inhand_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' @@ -34,9 +34,9 @@ // This really shouldn't happen. If it somehow does, print out a stack trace and gracefully handle it. stack_trace("apply_defauly_parts called on machine that already had component_parts: [machine]") - // Move to nullspace so you don't trigger handle_atom_del logic and remove existing parts. + // Remove references of components so it doesn't trigger Exited logic and remove existing parts. for(var/obj/item/part as anything in machine.component_parts) - part.moveToNullspace(loc) + machine.component_parts -= part qdel(part) // List of components always contains the circuit board used to build it. @@ -47,9 +47,7 @@ // This really shouldn't happen. If it somehow does, print out a stack trace and gracefully handle it. stack_trace("apply_default_parts called from a circuit board that does not belong to machine: [machine]") - // Move to nullspace so you don't trigger handle_atom_del logic, remove old circuit, add new circuit. - machine.circuit.moveToNullspace() - qdel(machine.circuit) + QDEL_NULL(machine.circuit) machine.circuit = src return diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index d152629568c3b..0338da6b4fa64 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -23,6 +23,11 @@ greyscale_colors = CIRCUIT_COLOR_COMMAND build_path = /obj/machinery/computer/accounting +/obj/item/circuitboard/computer/bankmachine + name = "Bank Machine Console" + greyscale_colors = CIRCUIT_COLOR_COMMAND + build_path = /obj/machinery/computer/bank_machine + //Engineering /obj/item/circuitboard/computer/apc_control @@ -319,14 +324,6 @@ greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/shuttle/white_ship/bridge -/obj/item/circuitboard/computer/white_ship/pod - name = "Salvage Pod" - build_path = /obj/machinery/computer/shuttle/white_ship/pod - -/obj/item/circuitboard/computer/white_ship/pod/recall - name = "Salvage Pod Recall" - build_path = /obj/machinery/computer/shuttle/white_ship/pod/recall - /obj/item/circuitboard/computer/bountypad name = "Bounty Pad" build_path = /obj/machinery/computer/piratepad_control/civilian @@ -487,11 +484,14 @@ else to_chat(user, span_alert("The spectrum chip is unresponsive.")) -/obj/item/circuitboard/computer/cargo/emag_act(mob/living/user) - if(!(obj_flags & EMAGGED)) - contraband = TRUE - obj_flags |= EMAGGED - to_chat(user, span_notice("You adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband.")) +/obj/item/circuitboard/computer/cargo/emag_act(mob/user, obj/item/card/emag/emag_card) + if (obj_flags & EMAGGED) + return FALSE + + contraband = TRUE + obj_flags |= EMAGGED + to_chat(user, span_notice("You adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband.")) + return TRUE /obj/item/circuitboard/computer/cargo/configure_machine(obj/machinery/computer/cargo/machine) if(!istype(machine)) @@ -507,20 +507,25 @@ name = "Express Supply Console" build_path = /obj/machinery/computer/cargo/express -/obj/item/circuitboard/computer/cargo/express/emag_act(mob/living/user) - if(!(obj_flags & EMAGGED)) - contraband = TRUE - obj_flags |= EMAGGED - to_chat(user, span_notice("You change the routing protocols, allowing the Drop Pod to land anywhere on the station.")) +/obj/item/circuitboard/computer/cargo/express/emag_act(mob/user, obj/item/card/emag/emag_card) + if (obj_flags & EMAGGED) + return FALSE + + contraband = TRUE + obj_flags |= EMAGGED + to_chat(user, span_notice("You change the routing protocols, allowing the Drop Pod to land anywhere on the station.")) + return TRUE /obj/item/circuitboard/computer/cargo/express/multitool_act(mob/living/user) if (!(obj_flags & EMAGGED)) contraband = !contraband to_chat(user, span_notice("Receiver spectrum set to [contraband ? "Broad" : "Standard"].")) + return TRUE else to_chat(user, span_notice("You reset the destination-routing protocols and receiver spectrum to factory defaults.")) contraband = FALSE obj_flags &= ~EMAGGED + return TRUE /obj/item/circuitboard/computer/cargo/request name = "Supply Request Console" @@ -535,6 +540,10 @@ name = "Golem Ship Equipment Vendor Console" build_path = /obj/machinery/computer/order_console/mining/golem +/obj/item/circuitboard/computer/order_console/bitrunning + name = "Bitrunning Vendor Console" + build_path = /obj/machinery/computer/order_console/bitrunning + /obj/item/circuitboard/computer/ferry name = "Transport Ferry" greyscale_colors = CIRCUIT_COLOR_SUPPLY @@ -596,3 +605,8 @@ name = "Medical Order" greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/computer/department_orders/medical + +/obj/item/circuitboard/computer/quantum_console + name = "Quantum Server Console" + greyscale_colors = CIRCUIT_COLOR_SUPPLY + build_path = /obj/machinery/computer/quantum_console diff --git a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm index 825e8bd9d9db4..4bea5b1335c5b 100644 --- a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm @@ -56,6 +56,13 @@ /datum/stock_part/capacitor = 1, /obj/item/electronics/airlock = 1) +/obj/item/circuitboard/machine/mass_driver + name = "Mass Driver" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING + build_path = /obj/machinery/mass_driver + req_components = list( + /datum/stock_part/servo = 1,) + /obj/item/circuitboard/machine/autolathe name = "Autolathe" greyscale_colors = CIRCUIT_COLOR_ENGINEERING @@ -808,7 +815,7 @@ /obj/item/circuitboard/machine/cryo_tube name = "Cryotube" greyscale_colors = CIRCUIT_COLOR_MEDICAL - build_path = /obj/machinery/atmospherics/components/unary/cryo_cell + build_path = /obj/machinery/cryo_cell req_components = list( /datum/stock_part/matter_bin = 1, /obj/item/stack/cable_coil = 1, @@ -1018,7 +1025,12 @@ build_path = /obj/machinery/rnd/server req_components = list( /obj/item/stack/cable_coil = 2, - /datum/stock_part/scanning_module = 1) + /datum/stock_part/scanning_module = 1, + ) + +/obj/item/circuitboard/machine/rdserver/oldstation + name = "Ancient R&D Server" + build_path = /obj/machinery/rnd/server/oldstation /obj/item/circuitboard/machine/techfab/department/science name = "\improper Departmental Techfab - Science" @@ -1291,6 +1303,15 @@ req_components = list( /datum/stock_part/card_reader = 1) +/obj/item/circuitboard/machine/fishing_portal_generator + name = "Fishing Portal Generator" + greyscale_colors = CIRCUIT_COLOR_SERVICE + build_path = /obj/machinery/fishing_portal_generator + req_components = list( + /datum/stock_part/matter_bin = 2, + /datum/stock_part/capacitor = 1) + needs_anchored = FALSE + //Supply /obj/item/circuitboard/machine/ore_redemption name = "Ore Redemption" @@ -1339,16 +1360,14 @@ greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/rnd/production/techfab/department/cargo -/obj/item/circuitboard/machine/bepis - name = "BEPIS Chamber" +/obj/item/circuitboard/machine/materials_market + name = "Galactic Materials Market" greyscale_colors = CIRCUIT_COLOR_SUPPLY - build_path = /obj/machinery/rnd/bepis + build_path = /obj/machinery/materials_market req_components = list( /obj/item/stack/cable_coil = 5, - /datum/stock_part/capacitor = 1, - /datum/stock_part/servo = 1, - /datum/stock_part/micro_laser = 1, - /datum/stock_part/scanning_module = 1) + /datum/stock_part/scanning_module = 1, + /datum/stock_part/card_reader = 1) //Misc /obj/item/circuitboard/machine/sheetifier @@ -1499,3 +1518,32 @@ greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/navbeacon req_components = list() + +/obj/item/circuitboard/machine/radioactive_nebula_shielding + name = "Radioactive Nebula Shielding" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING + build_path = /obj/machinery/nebula_shielding/radiation + req_components = list( + /datum/stock_part/capacitor = 2, + /obj/item/mod/module/rad_protection = 1, + /obj/item/stack/sheet/plasteel = 2, + ) + +/obj/item/circuitboard/machine/quantum_server + name = "Quantum Server" + greyscale_colors = CIRCUIT_COLOR_SUPPLY + build_path = /obj/machinery/quantum_server + req_components = list( + /datum/stock_part/servo = 2, + /datum/stock_part/scanning_module = 1, + /datum/stock_part/capacitor = 1, + ) + +/obj/item/circuitboard/machine/netpod + name = "Netpod" + greyscale_colors = CIRCUIT_COLOR_SUPPLY + build_path = /obj/machinery/netpod + req_components = list( + /datum/stock_part/servo = 1, + /datum/stock_part/matter_bin = 2, + ) diff --git a/code/game/objects/items/climbingrope.dm b/code/game/objects/items/climbingrope.dm new file mode 100644 index 0000000000000..2c96d1844b13b --- /dev/null +++ b/code/game/objects/items/climbingrope.dm @@ -0,0 +1,86 @@ +/obj/item/climbing_hook + name = "climbing hook" + desc = "Standard hook with rope to scale up holes. The rope is of average quality, but due to your weight amongst other factors, may not withstand extreme use." + icon = 'icons/obj/mining.dmi' + icon_state = "climbingrope" + inhand_icon_state = "crowbar_brass" + lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' + force = 5 + throwforce = 10 + reach = 2 + throw_range = 4 + w_class = WEIGHT_CLASS_NORMAL + attack_verb_continuous = list("whacks", "flails", "bludgeons") + attack_verb_simple = list("whack", "flail", "bludgeon") + resistance_flags = FLAMMABLE + ///how many times can we climb with this rope + var/uses = 5 + ///climb time + var/climb_time = 2.5 SECONDS + +/obj/item/climbing_hook/examine(mob/user) + . = ..() + var/list/look_binds = user.client.prefs.key_bindings["look up"] + . += span_notice("Firstly, look upwards by holding [english_list(look_binds, nothing_text = "(nothing bound)", and_text = " or ", comma_text = ", or ")]!") + . += span_notice("Then, click solid ground adjacent to the hole above you.") + . += span_notice("The rope looks like you could use it [uses] times before it falls apart.") + +/obj/item/climbing_hook/afterattack(turf/open/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(target.z == user.z) + return + if(!istype(target) || isopenspaceturf(target)) + return + if(target.is_blocked_turf(exclude_mobs = TRUE)) + return + var/turf/user_turf = get_turf(user) + var/turf/above = GET_TURF_ABOVE(user_turf) + if(!isopenspaceturf(above) || !above.Adjacent(target)) //are we below a hole, is the target blocked, is the target adjacent to our hole + balloon_alert(user, "blocked!") + return + var/away_dir = get_dir(above, target) + user.visible_message(span_notice("[user] begins climbing upwards with [src]."), span_notice("You get to work on properly hooking [src] and going upwards.")) + playsound(target, 'sound/effects/picaxe1.ogg', 50) //plays twice so people above and below can hear + playsound(user_turf, 'sound/effects/picaxe1.ogg', 50) + var/list/effects = list(new /obj/effect/temp_visual/climbing_hook(target, away_dir), new /obj/effect/temp_visual/climbing_hook(user_turf, away_dir)) + if(do_after(user, climb_time, target)) + user.Move(target) + uses-- + + if(uses <= 0) + user.visible_message(span_warning("[src] snaps and tears apart!")) + qdel(src) + + QDEL_LIST(effects) + +/obj/item/climbing_hook/emergency + name = "emergency climbing hook" + desc = "An emergency climbing hook to scale up holes. The rope is EXTREMELY cheap and may not withstand extended use." + uses = 2 + climb_time = 4 SECONDS + w_class = WEIGHT_CLASS_SMALL + +/obj/item/climbing_hook/syndicate + name = "suspicious climbing hook" + desc = "REALLY suspicious climbing hook to scale up holes. The hook has a syndicate logo engraved on it, and the rope appears rather durable." + icon_state = "climbingrope_s" + uses = 10 + climb_time = 1.5 SECONDS + +/obj/item/climbing_hook/infinite //debug stuff + name = "infinite climbing hook" + desc = "A plasteel hook, with rope. Upon closer inspection, the rope appears to be made out of plasteel woven into regular rope, amongst many other reinforcements." + uses = INFINITY + climb_time = 1 SECONDS + +/obj/effect/temp_visual/climbing_hook + icon = 'icons/mob/silicon/aibots.dmi' + icon_state = "path_indicator" + layer = BELOW_MOB_LAYER + plane = GAME_PLANE + duration = 4 SECONDS + +/obj/effect/temp_visual/climbing_hook/Initialize(mapload, direction) + . = ..() + dir = direction diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm index 39a151ff294a7..1a8ffe81f4219 100644 --- a/code/game/objects/items/clown_items.dm +++ b/code/game/objects/items/clown_items.dm @@ -111,7 +111,7 @@ /obj/item/soap/suicide_act(mob/living/user) user.say(";FFFFFFFFFFFFFFFFUUUUUUUDGE!!", forced="soap suicide") - user.visible_message(span_suicide("[user] lifts [src] to [user.p_their()] mouth and gnaws on it furiously, producing a thick froth! [user.p_they(TRUE)]'ll never get that BB gun now!")) + user.visible_message(span_suicide("[user] lifts [src] to [user.p_their()] mouth and gnaws on it furiously, producing a thick froth! [user.p_They()]'ll never get that BB gun now!")) var/datum/effect_system/fluid_spread/foam/foam = new foam.set_up(1, holder = src, location = get_turf(user)) foam.start() @@ -162,7 +162,7 @@ /obj/item/bikehorn name = "bike horn" desc = "A horn off of a bicycle. Rumour has it that they're made from recycled clowns." - icon = 'icons/obj/weapons/horn.dmi' + icon = 'icons/obj/art/horn.dmi' icon_state = "bike_horn" inhand_icon_state = "bike_horn" worn_icon_state = "horn" diff --git a/code/game/objects/items/cosmetics.dm b/code/game/objects/items/cosmetics.dm index b2ccded220b9f..662585dd273fe 100644 --- a/code/game/objects/items/cosmetics.dm +++ b/code/game/objects/items/cosmetics.dm @@ -6,8 +6,9 @@ icon_state = "lipstick" inhand_icon_state = "lipstick" w_class = WEIGHT_CLASS_TINY - var/colour = "red" var/open = FALSE + /// Actual color of the lipstick, also gets applied to the human + var/lipstick_color = COLOR_RED /// A trait that's applied while someone has this lipstick applied, and is removed when the lipstick is removed var/lipstick_trait @@ -31,33 +32,32 @@ if(!open) return var/mutable_appearance/colored_overlay = mutable_appearance(icon, "lipstick_uncap_color") - colored_overlay.color = colour + colored_overlay.color = lipstick_color . += colored_overlay /obj/item/lipstick/purple name = "purple lipstick" - colour = "purple" + lipstick_color = COLOR_PURPLE /obj/item/lipstick/jade - //It's still called Jade, but theres no HTML color for jade, so we use lime. name = "jade lipstick" - colour = "lime" + lipstick_color = COLOR_JADE /obj/item/lipstick/blue name = "blue lipstick" - colour = "blue" + lipstick_color = COLOR_BLUE /obj/item/lipstick/green name = "green lipstick" - colour = "green" + lipstick_color = COLOR_GREEN /obj/item/lipstick/white name = "white lipstick" - colour = "white" + lipstick_color = COLOR_WHITE /obj/item/lipstick/black name = "black lipstick" - colour = "black" + lipstick_color = COLOR_BLACK /obj/item/lipstick/black/death name = "\improper Kiss of Death" @@ -71,8 +71,16 @@ /obj/item/lipstick/random/Initialize(mapload) . = ..() icon_state = "lipstick" - colour = pick("red","purple","lime","black","green","blue","white") - name = "[colour] lipstick" + var/static/list/possible_colors + if(!possible_colors) + possible_colors = list() + for(var/obj/item/lipstick/lipstick_path as anything in (typesof(/obj/item/lipstick) - src.type)) + if(!initial(lipstick_path.lipstick_color)) + continue + possible_colors[initial(lipstick_path.lipstick_color)] = initial(lipstick_path.name) + lipstick_color = pick(possible_colors) + name = possible_colors[lipstick_color] + update_appearance() /obj/item/lipstick/attack_self(mob/user) to_chat(user, span_notice("You twist [src] [open ? "closed" : "open"].")) @@ -98,7 +106,7 @@ if(target == user) user.visible_message(span_notice("[user] does [user.p_their()] lips with \the [src]."), \ span_notice("You take a moment to apply \the [src]. Perfect!")) - target.update_lips("lipstick", colour, lipstick_trait) + target.update_lips("lipstick", lipstick_color, lipstick_trait) return user.visible_message(span_warning("[user] begins to do [target]'s lips with \the [src]."), \ @@ -107,8 +115,7 @@ return user.visible_message(span_notice("[user] does [target]'s lips with \the [src]."), \ span_notice("You apply \the [src] on [target]'s lips.")) - target.update_lips("lipstick", colour, lipstick_trait) - + target.update_lips("lipstick", lipstick_color, lipstick_trait) //you can wipe off lipstick with paper! /obj/item/paper/attack(mob/M, mob/user) @@ -129,7 +136,6 @@ span_notice("You wipe off [target]'s lipstick.")) target.update_lips(null) - /obj/item/razor name = "electric razor" desc = "The latest and greatest power razor born from the science of shaving." @@ -145,125 +151,135 @@ shave(user, BODY_ZONE_HEAD)//doesnt need to be BODY_ZONE_HEAD specifically, but whatever return BRUTELOSS -/obj/item/razor/proc/shave(mob/living/carbon/human/H, location = BODY_ZONE_PRECISE_MOUTH) +/obj/item/razor/proc/shave(mob/living/carbon/human/skinhead, location = BODY_ZONE_PRECISE_MOUTH) if(location == BODY_ZONE_PRECISE_MOUTH) - H.facial_hairstyle = "Shaved" + skinhead.set_facial_hairstyle("Shaved", update = TRUE) else - H.hairstyle = "Skinhead" - - H.update_body_parts() + skinhead.set_hairstyle("Skinhead", update = TRUE) playsound(loc, 'sound/items/welder2.ogg', 20, TRUE) -/obj/item/razor/attack(mob/M, mob/living/user) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/location = user.zone_selected - if((location in list(BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_HEAD)) && !H.get_bodypart(BODY_ZONE_HEAD)) - to_chat(user, span_warning("[H] doesn't have a head!")) - return - if(location == BODY_ZONE_PRECISE_MOUTH) - if(!user.combat_mode) - if(H.gender == MALE) - if (H == user) - to_chat(user, span_warning("You need a mirror to properly style your own facial hair!")) - return - if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return - var/new_style = tgui_input_list(user, "Select a facial hairstyle", "Grooming", GLOB.facial_hairstyles_list) - if(isnull(new_style)) - return - if(!get_location_accessible(H, location)) - to_chat(user, span_warning("The mask is in the way!")) - return - if(HAS_TRAIT(H, TRAIT_SHAVED)) - to_chat(user, span_warning("[H] is just way too shaved. Like, really really shaved.")) - return - user.visible_message(span_notice("[user] tries to change [H]'s facial hairstyle using [src]."), span_notice("You try to change [H]'s facial hairstyle using [src].")) - if(new_style && do_after(user, 60, target = H)) - user.visible_message(span_notice("[user] successfully changes [H]'s facial hairstyle using [src]."), span_notice("You successfully change [H]'s facial hairstyle using [src].")) - H.facial_hairstyle = new_style - H.update_body_parts() - return - else - return - - else - if(!(FACEHAIR in H.dna.species.species_traits)) - to_chat(user, span_warning("There is no facial hair to shave!")) - return - if(!get_location_accessible(H, location)) - to_chat(user, span_warning("The mask is in the way!")) - return - if(H.facial_hairstyle == "Shaved") - to_chat(user, span_warning("Already clean-shaven!")) - return - - if(H == user) //shaving yourself - user.visible_message(span_notice("[user] starts to shave [user.p_their()] facial hair with [src]."), \ - span_notice("You take a moment to shave your facial hair with [src]...")) - if(do_after(user, 50, target = H)) - user.visible_message(span_notice("[user] shaves [user.p_their()] facial hair clean with [src]."), \ - span_notice("You finish shaving with [src]. Fast and clean!")) - shave(H, location) - else - user.visible_message(span_warning("[user] tries to shave [H]'s facial hair with [src]."), \ - span_notice("You start shaving [H]'s facial hair...")) - if(do_after(user, 50, target = H)) - user.visible_message(span_warning("[user] shaves off [H]'s facial hair with [src]."), \ - span_notice("You shave [H]'s facial hair clean off.")) - shave(H, location) - - else if(location == BODY_ZONE_HEAD) - if(!user.combat_mode) - if (H == user) - to_chat(user, span_warning("You need a mirror to properly style your own hair!")) +/obj/item/razor/attack(mob/target_mob, mob/living/user, params) + if(!ishuman(target_mob)) + return ..() + var/mob/living/carbon/human/human_target = target_mob + var/obj/item/bodypart/head/noggin = human_target.get_bodypart(BODY_ZONE_HEAD) + var/location = user.zone_selected + var/static/list/head_zones = list(BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_HEAD) + if(!noggin && (location in head_zones)) + to_chat(user, span_warning("[human_target] doesn't have a head!")) + return + if(location == BODY_ZONE_PRECISE_MOUTH) + if(!user.combat_mode) + if(human_target.gender == MALE) + if(human_target == user) + to_chat(user, span_warning("You need a mirror to properly style your own facial hair!")) return if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) return - var/new_style = tgui_input_list(user, "Select a hairstyle", "Grooming", GLOB.hairstyles_list) + var/new_style = tgui_input_list(user, "Select a facial hairstyle", "Grooming", GLOB.facial_hairstyles_list) if(isnull(new_style)) return - if(!get_location_accessible(H, location)) + if(!get_location_accessible(human_target, location)) to_chat(user, span_warning("The headgear is in the way!")) return - if(HAS_TRAIT(H, TRAIT_BALD)) - to_chat(user, span_warning("[H] is just way too bald. Like, really really bald.")) + if(!(noggin.head_flags & HEAD_FACIAL_HAIR)) + to_chat(user, span_warning("There is no facial hair to style!")) return - user.visible_message(span_notice("[user] tries to change [H]'s hairstyle using [src]."), span_notice("You try to change [H]'s hairstyle using [src].")) - if(new_style && do_after(user, 60, target = H)) - user.visible_message(span_notice("[user] successfully changes [H]'s hairstyle using [src]."), span_notice("You successfully change [H]'s hairstyle using [src].")) - H.hairstyle = new_style - H.update_body_parts() + if(HAS_TRAIT(human_target, TRAIT_SHAVED)) + to_chat(user, span_warning("[human_target] is just way too shaved. Like, really really shaved.")) return - - else - if(!(HAIR in H.dna.species.species_traits)) - to_chat(user, span_warning("There is no hair to shave!")) - return - if(!get_location_accessible(H, location)) - to_chat(user, span_warning("The headgear is in the way!")) - return - if(H.hairstyle == "Bald" || H.hairstyle == "Balding Hair" || H.hairstyle == "Skinhead") - to_chat(user, span_warning("There is not enough hair left to shave!")) + user.visible_message(span_notice("[user] tries to change [human_target]'s facial hairstyle using [src]."), span_notice("You try to change [human_target]'s facial hairstyle using [src].")) + if(new_style && do_after(user, 6 SECONDS, target = human_target)) + user.visible_message(span_notice("[user] successfully changes [human_target]'s facial hairstyle using [src]."), span_notice("You successfully change [human_target]'s facial hairstyle using [src].")) + human_target.set_facial_hairstyle(new_style, update = TRUE) return - - if(H == user) //shaving yourself - user.visible_message(span_notice("[user] starts to shave [user.p_their()] head with [src]."), \ - span_notice("You start to shave your head with [src]...")) - if(do_after(user, 5, target = H)) - user.visible_message(span_notice("[user] shaves [user.p_their()] head with [src]."), \ - span_notice("You finish shaving with [src].")) - shave(H, location) - else - var/turf/H_loc = H.loc - user.visible_message(span_warning("[user] tries to shave [H]'s head with [src]!"), \ - span_notice("You start shaving [H]'s head...")) - if(do_after(user, 50, target = H)) - if(H_loc == H.loc) - user.visible_message(span_warning("[user] shaves [H]'s head bald with [src]!"), \ - span_notice("You shave [H]'s head bald.")) - shave(H, location) + else + return else - ..() - else - ..() + if(!get_location_accessible(human_target, location)) + to_chat(user, span_warning("The mask is in the way!")) + return + if(!(noggin.head_flags & HEAD_FACIAL_HAIR)) + to_chat(user, span_warning("There is no facial hair to shave!")) + return + if(human_target.facial_hairstyle == "Shaved") + to_chat(user, span_warning("Already clean-shaven!")) + return + + if(human_target == user) //shaving yourself + user.visible_message(span_notice("[user] starts to shave [user.p_their()] facial hair with [src]."), \ + span_notice("You take a moment to shave your facial hair with [src]...")) + if(do_after(user, 5 SECONDS, target = user)) + user.visible_message(span_notice("[user] shaves [user.p_their()] facial hair clean with [src]."), \ + span_notice("You finish shaving with [src]. Fast and clean!")) + shave(user, location) + return + else + user.visible_message(span_warning("[user] tries to shave [human_target]'s facial hair with [src]."), \ + span_notice("You start shaving [human_target]'s facial hair...")) + if(do_after(user, 5 SECONDS, target = human_target)) + user.visible_message(span_warning("[user] shaves off [human_target]'s facial hair with [src]."), \ + span_notice("You shave [human_target]'s facial hair clean off.")) + shave(human_target, location) + return + else if(location == BODY_ZONE_HEAD) + if(!user.combat_mode) + if(human_target == user) + to_chat(user, span_warning("You need a mirror to properly style your own hair!")) + return + if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) + return + var/new_style = tgui_input_list(user, "Select a hairstyle", "Grooming", GLOB.hairstyles_list) + if(isnull(new_style)) + return + if(!get_location_accessible(human_target, location)) + to_chat(user, span_warning("The headgear is in the way!")) + return + if(!(noggin.head_flags & HEAD_HAIR)) + to_chat(user, span_warning("There is no hair to style!")) + return + if(HAS_TRAIT(human_target, TRAIT_BALD)) + to_chat(user, span_warning("[human_target] is just way too bald. Like, really really bald.")) + return + user.visible_message(span_notice("[user] tries to change [human_target]'s hairstyle using [src]."), span_notice("You try to change [human_target]'s hairstyle using [src].")) + if(new_style && do_after(user, 6 SECONDS, target = human_target)) + user.visible_message(span_notice("[user] successfully changes [human_target]'s hairstyle using [src]."), span_notice("You successfully change [human_target]'s hairstyle using [src].")) + human_target.set_hairstyle(new_style, update = TRUE) + return + else + if(!get_location_accessible(human_target, location)) + to_chat(user, span_warning("The headgear is in the way!")) + return + if(!(noggin.head_flags & HEAD_HAIR)) + to_chat(user, span_warning("There is no hair to shave!")) + return + if(human_target.hairstyle == "Bald" || human_target.hairstyle == "Balding Hair" || human_target.hairstyle == "Skinhead") + to_chat(user, span_warning("There is not enough hair left to shave!")) + return + + if(human_target == user) //shaving yourself + user.visible_message(span_notice("[user] starts to shave [user.p_their()] head with [src]."), \ + span_notice("You start to shave your head with [src]...")) + if(do_after(user, 5 SECONDS, target = user)) + user.visible_message(span_notice("[user] shaves [user.p_their()] head with [src]."), \ + span_notice("You finish shaving with [src].")) + shave(user, location) + return + else + user.visible_message(span_warning("[user] tries to shave [human_target]'s head with [src]!"), \ + span_notice("You start shaving [human_target]'s head...")) + if(do_after(user, 5 SECONDS, target = human_target)) + user.visible_message(span_warning("[user] shaves [human_target]'s head bald with [src]!"), \ + span_notice("You shave [human_target]'s head bald.")) + shave(human_target, location) + return + return ..() + +/obj/item/razor/surgery + name = "surgical razor" + desc = "A medical grade razor. Its precision blades provide a clean shave for surgical preparation." + icon = 'icons/obj/cosmetic.dmi' + icon_state = "medrazor" + +/obj/item/razor/surgery/get_surgery_tool_overlay(tray_extended) + return "razor" diff --git a/code/game/objects/items/crab17.dm b/code/game/objects/items/crab17.dm index 234265e18aad0..a20fcce5db86c 100644 --- a/code/game/objects/items/crab17.dm +++ b/code/game/objects/items/crab17.dm @@ -1,7 +1,7 @@ /obj/item/suspiciousphone name = "suspicious phone" desc = "This device raises pink levels to unknown highs." - icon = 'icons/obj/device_syndie.dmi' + icon = 'icons/obj/antags/syndicate_tools.dmi' icon_state = "suspiciousphone" w_class = WEIGHT_CLASS_SMALL attack_verb_continuous = list("dumps") @@ -40,7 +40,7 @@ /obj/structure/checkoutmachine name = "\improper Nanotrasen Space-Coin Market" desc = "This is good for spacecoin because" - icon = 'icons/obj/money_machine.dmi' + icon = 'icons/obj/machines/money_machine.dmi' icon_state = "bogdanoff" layer = ABOVE_ALL_MOB_LAYER plane = ABOVE_GAME_PLANE @@ -217,7 +217,7 @@ /obj/effect/dumpeet_fall //Falling pod name = "" - icon = 'icons/obj/money_machine_64.dmi' + icon = 'icons/obj/machines/money_machine_64.dmi' pixel_z = 300 desc = "Get out of the way!" layer = FLY_LAYER//that wasn't flying, that was falling with style! diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index cbcb387ce0030..bfe1457aa522b 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -21,7 +21,7 @@ */ /obj/item/toy/crayon - name = "red crayon" + name = "crayon" desc = "A colourful crayon. Looks tasty. Mmmm..." icon = 'icons/obj/art/crayons.dmi' icon_state = "crayonred" @@ -200,7 +200,7 @@ /obj/item/toy/crayon/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is jamming [src] up [user.p_their()] nose and into [user.p_their()] brain. It looks like [user.p_theyre()] trying to commit suicide!")) - user.add_atom_colour(paint_color) + user.add_atom_colour(paint_color, ADMIN_COLOUR_PRIORITY) return (BRUTELOSS|OXYLOSS) /obj/item/toy/crayon/Initialize(mapload) @@ -215,12 +215,26 @@ AddComponent(/datum/component/palette, AVAILABLE_SPRAYCAN_SPACE, paint_color) refill() + if(edible) + AddComponent(/datum/component/edible, bite_consumption = reagents.total_volume / (charges_left / 5), after_eat = CALLBACK(src, PROC_REF(after_eat))) + +/// Used for edible component to reduce charges_left on bite. +/obj/item/toy/crayon/proc/after_eat(mob/user) + use_charges(user, amount = 5, requires_full = FALSE, override_infinity = TRUE) + if(check_empty(user, override_infinity = TRUE)) //Prevents division by zero + return +/// Sets painting color and updates appearance. /obj/item/toy/crayon/set_painting_tool_color(chosen_color) . = ..() paint_color = chosen_color update_appearance() +/** + * Refills charges_left in infinite crayons on use. + * Sets charges_left in infinite crayons to 100 for spawning reagents. + * Spawns reagents in crayons based on the amount of charges_left if not spawned yet. + */ /obj/item/toy/crayon/proc/refill() if(charges == INFINITE_CHARGES) charges_left = 100 @@ -241,9 +255,17 @@ var/amount = weight * units_per_weight reagents.add_reagent(reagent, amount) -/obj/item/toy/crayon/proc/use_charges(mob/user, amount = 1, requires_full = TRUE) - // Returns number of charges actually used - if(charges == INFINITE_CHARGES) +/** + * Returns number of charges actually used. + * + * Arguments: + * * user - the user. + * * amount - how much charges do we reduce. + * * requires_full - Seems to transfer its data to the same argument on check_empty(). I'm not sure tho. + * * override_infinity - if TRUE stops infinite crayons from refilling. + */ +/obj/item/toy/crayon/proc/use_charges(mob/user, amount = 1, requires_full = TRUE, override_infinity = FALSE) + if(charges == INFINITE_CHARGES && !override_infinity) refill() return TRUE if(check_empty(user, amount, requires_full)) @@ -251,19 +273,27 @@ charges_left -= min(charges_left, amount) return TRUE -/obj/item/toy/crayon/proc/check_empty(mob/user, amount = 1, requires_full = TRUE) - // When eating a crayon, check_empty() can be called twice producing - // two messages unless we check for being deleted first +/** + * When eating a crayon, check_empty() can be called twice producing two messages unless we check for being deleted first. + * + * Arguments: + * * user - the user. + * * amount - used for use_on() and when requires_full is TRUE + * * requires_full - if TRUE and charges_left < amount it will balloon_alert you. Used just for borgs spraycan it seems. + * * override_infinity - if TRUE it will override checks for infinite crayons. + */ +/obj/item/toy/crayon/proc/check_empty(mob/user, amount = 1, requires_full = TRUE, override_infinity = FALSE) if(QDELETED(src)) return TRUE // INFINITE_CHARGES is unlimited charges - if(charges == INFINITE_CHARGES) + if(charges == INFINITE_CHARGES && !override_infinity) return FALSE if(!charges_left) - balloon_alert(user, "empty!") if(self_contained) qdel(src) + else + balloon_alert(user, "empty!") return TRUE if(charges_left < amount && requires_full) balloon_alert(user, "not enough left!") @@ -284,13 +314,6 @@ ui = new(user, src, "Crayon", name) ui.open() -/obj/item/toy/crayon/spraycan/AltClick(mob/user) - if(!has_cap || !user.can_perform_action(src, NEED_DEXTERITY|NEED_HANDS)) - return - is_capped = !is_capped - balloon_alert(user, is_capped ? "capped" : "cap removed") - update_appearance() - /obj/item/toy/crayon/proc/staticDrawables() . = list() @@ -548,25 +571,6 @@ use_on(target, user, params) -/obj/item/toy/crayon/attack(mob/target, mob/user) - if(!edible || (target != user)) - return ..() - if(iscarbon(target)) - var/mob/living/carbon/crayon_eater = target - var/covered = "" - if(crayon_eater.is_mouth_covered(ITEM_SLOT_HEAD)) - covered = "headgear" - else if(crayon_eater.is_mouth_covered(ITEM_SLOT_MASK)) - covered = "mask" - if(covered) - balloon_alert(user, "remove your [covered]!") - return - to_chat(user, span_notice("You take a bite of the [src.name]. Delicious!")) - var/eaten = use_charges(user, 5, FALSE) - if(check_empty(user)) //Prevents division by zero - return - reagents.trans_to(target, eaten, volume_multiplier, transfered_by = user, methods = INGEST) - /obj/item/toy/crayon/get_writing_implement_details() return list( interaction_mode = MODE_WRITING, @@ -578,7 +582,7 @@ /obj/item/toy/crayon/red name = "red crayon" icon_state = "crayonred" - paint_color = "#DA0000" + paint_color = COLOR_CRAYON_RED crayon_color = "red" reagent_contents = list(/datum/reagent/consumable/nutriment = 0.5, /datum/reagent/colorful_reagent/powder/red/crayon = 1.5) dye_color = DYE_RED @@ -586,7 +590,7 @@ /obj/item/toy/crayon/orange name = "orange crayon" icon_state = "crayonorange" - paint_color = "#FF9300" + paint_color = COLOR_CRAYON_ORANGE crayon_color = "orange" reagent_contents = list(/datum/reagent/consumable/nutriment = 0.5, /datum/reagent/colorful_reagent/powder/orange/crayon = 1.5) dye_color = DYE_ORANGE @@ -594,7 +598,7 @@ /obj/item/toy/crayon/yellow name = "yellow crayon" icon_state = "crayonyellow" - paint_color = "#FFF200" + paint_color = COLOR_CRAYON_YELLOW crayon_color = "yellow" reagent_contents = list(/datum/reagent/consumable/nutriment = 0.5, /datum/reagent/colorful_reagent/powder/yellow/crayon = 1.5) dye_color = DYE_YELLOW @@ -602,7 +606,7 @@ /obj/item/toy/crayon/green name = "green crayon" icon_state = "crayongreen" - paint_color = "#A8E61D" + paint_color = COLOR_CRAYON_GREEN crayon_color = "green" reagent_contents = list(/datum/reagent/consumable/nutriment = 0.5, /datum/reagent/colorful_reagent/powder/green/crayon = 1.5) dye_color = DYE_GREEN @@ -610,7 +614,7 @@ /obj/item/toy/crayon/blue name = "blue crayon" icon_state = "crayonblue" - paint_color = "#00B7EF" + paint_color = COLOR_CRAYON_BLUE crayon_color = "blue" reagent_contents = list(/datum/reagent/consumable/nutriment = 0.5, /datum/reagent/colorful_reagent/powder/blue/crayon = 1.5) dye_color = DYE_BLUE @@ -618,7 +622,7 @@ /obj/item/toy/crayon/purple name = "purple crayon" icon_state = "crayonpurple" - paint_color = "#DA00FF" + paint_color = COLOR_CRAYON_PURPLE crayon_color = "purple" reagent_contents = list(/datum/reagent/consumable/nutriment = 0.5, /datum/reagent/colorful_reagent/powder/purple/crayon = 1.5) dye_color = DYE_PURPLE @@ -626,7 +630,7 @@ /obj/item/toy/crayon/black name = "black crayon" icon_state = "crayonblack" - paint_color = "#1C1C1C" //Not completely black because total black looks bad. So Mostly Black. + paint_color = COLOR_CRAYON_BLACK crayon_color = "black" reagent_contents = list(/datum/reagent/consumable/nutriment = 0.5, /datum/reagent/colorful_reagent/powder/black/crayon = 1.5) dye_color = DYE_BLACK @@ -634,7 +638,7 @@ /obj/item/toy/crayon/white name = "white crayon" icon_state = "crayonwhite" - paint_color = "#FFFFFF" + paint_color = COLOR_WHITE crayon_color = "white" reagent_contents = list(/datum/reagent/consumable/nutriment = 0.5, /datum/reagent/colorful_reagent/powder/white/crayon = 1.5) dye_color = DYE_WHITE @@ -643,7 +647,7 @@ name = "mime crayon" icon_state = "crayonmime" desc = "A very sad-looking crayon." - paint_color = "#FFFFFF" + paint_color = COLOR_WHITE crayon_color = "mime" reagent_contents = list(/datum/reagent/consumable/nutriment = 0.5, /datum/reagent/colorful_reagent/powder/invisible = 1.5) charges = INFINITE_CHARGES @@ -652,7 +656,7 @@ /obj/item/toy/crayon/rainbow name = "rainbow crayon" icon_state = "crayonrainbow" - paint_color = "#FFF000" + paint_color = COLOR_CRAYON_RAINBOW crayon_color = "rainbow" reagent_contents = list(/datum/reagent/consumable/nutriment = 0.5, /datum/reagent/colorful_reagent = 1.5) drawtype = RANDOM_ANY // just the default starter. @@ -677,7 +681,12 @@ /obj/item/storage/crayons/Initialize(mapload) . = ..() - create_storage(canhold = list(/obj/item/toy/crayon)) + atom_storage.set_holdable(list(/obj/item/toy/crayon), + list( + /obj/item/toy/crayon/spraycan, + /obj/item/toy/crayon/mime, + /obj/item/toy/crayon/rainbow, + )) /obj/item/storage/crayons/PopulateContents() new /obj/item/toy/crayon/red(src) @@ -694,22 +703,6 @@ for(var/obj/item/toy/crayon/crayon in contents) . += mutable_appearance('icons/obj/art/crayons.dmi', crayon.crayon_color) -/obj/item/storage/crayons/attackby(obj/item/attacked_by, mob/user, params) - if(!istype(attacked_by, /obj/item/toy/crayon)) - return ..() - if(istype(attacked_by, /obj/item/toy/crayon/spraycan)) - balloon_alert(user, "not a crayon!") - return - var/obj/item/toy/crayon/crayon = attacked_by - switch(crayon.crayon_color) - if("mime") - balloon_alert(user, "crayon doesn't belong!") - return - if("rainbow") - balloon_alert(user, "crayon is too powerful!") - return - return ..() - /obj/item/storage/crayons/attack_self(mob/user) . = ..() if(contents.len > 0) @@ -754,10 +747,18 @@ pre_noise = TRUE post_noise = FALSE +/obj/item/toy/crayon/spraycan/Initialize(mapload) + . = ..() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/improvised_coolant) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/toy/crayon/spraycan/isValidSurface(surface) return (isfloorturf(surface) || iswallturf(surface)) - /obj/item/toy/crayon/spraycan/suicide_act(mob/living/user) var/mob/living/carbon/human/H = user var/used = min(charges_left, 10) @@ -775,14 +776,14 @@ update_appearance() if(actually_paints) H.update_lips("spray_face", paint_color) - reagents.trans_to(user, used, volume_multiplier, transfered_by = user, methods = VAPOR) + reagents.trans_to(user, used, volume_multiplier, transferred_by = user, methods = VAPOR) return OXYLOSS /obj/item/toy/crayon/spraycan/Initialize(mapload) . = ..() // If default crayon red colour, pick a more fun spraycan colour if(!paint_color) - set_painting_tool_color(pick("#DA0000", "#FF9300", "#FFF200", "#A8E61D", "#00B7EF", "#DA00FF")) + set_painting_tool_color(pick(COLOR_CRAYON_RED, COLOR_CRAYON_ORANGE, COLOR_CRAYON_YELLOW, COLOR_CRAYON_GREEN, COLOR_CRAYON_BLUE, COLOR_CRAYON_PURPLE)) refill() /obj/item/toy/crayon/spraycan/examine(mob/user) @@ -832,7 +833,7 @@ target.add_atom_colour(paint_color, WASHABLE_COLOUR_PRIORITY) SEND_SIGNAL(target, COMSIG_LIVING_MOB_PAINTED) use_charges(user, 2, requires_full = FALSE) - reagents.trans_to(target, ., volume_multiplier, transfered_by = user, methods = VAPOR) + reagents.trans_to(target, ., volume_multiplier, transferred_by = user, methods = VAPOR) if(pre_noise || post_noise) playsound(user.loc, 'sound/effects/spray.ogg', 5, TRUE, 5) @@ -859,7 +860,7 @@ holder.update_clothing(target_item.slot_flags) if(!(SEND_SIGNAL(target, COMSIG_OBJ_PAINTED, user, src, color_is_dark) & DONT_USE_SPRAYCAN_CHARGES)) use_charges(user, 2, requires_full = FALSE) - reagents.trans_to(target, ., volume_multiplier, transfered_by = user, methods = VAPOR) + reagents.trans_to(target, ., volume_multiplier, transferred_by = user, methods = VAPOR) if(pre_noise || post_noise) playsound(user.loc, 'sound/effects/spray.ogg', 5, TRUE, 5) @@ -902,6 +903,13 @@ return SECONDARY_ATTACK_CONTINUE_CHAIN +/obj/item/toy/crayon/spraycan/AltClick(mob/user) + if(!has_cap || !user.can_perform_action(src, NEED_DEXTERITY|NEED_HANDS)) + return + is_capped = !is_capped + balloon_alert(user, is_capped ? "capped" : "cap removed") + update_appearance() + /obj/item/toy/crayon/spraycan/attackby_storage_insert(datum/storage, atom/storage_holder, mob/user) return is_capped @@ -921,7 +929,7 @@ desc = "A metallic container containing shiny synthesised paint." charges = INFINITE_CHARGES -/obj/item/toy/crayon/spraycan/borg/use_charges(mob/user, amount = 1, requires_full = TRUE) +/obj/item/toy/crayon/spraycan/borg/use_charges(mob/user, amount = 1, requires_full = TRUE, override_infinity = FALSE) if(!iscyborg(user)) to_chat(user, span_notice("How did you get this?")) qdel(src) diff --git a/code/game/objects/items/debug_items.dm b/code/game/objects/items/debug_items.dm index 4ab086d90c9b3..e2febe30fcfd0 100644 --- a/code/game/objects/items/debug_items.dm +++ b/code/game/objects/items/debug_items.dm @@ -46,6 +46,28 @@ return FALSE return TRUE +/obj/item/debug/omnitool/get_all_tool_behaviours() + return list(TOOL_ANALYZER, + TOOL_BLOODFILTER, + TOOL_BONESET, + TOOL_CAUTERY, + TOOL_CROWBAR, + TOOL_DRILL, + TOOL_HEMOSTAT, + TOOL_KNIFE, + TOOL_MINING, + TOOL_MULTITOOL, + TOOL_RETRACTOR, + TOOL_ROLLINGPIN, + TOOL_RUSTSCRAPER, + TOOL_SAW, + TOOL_SCALPEL, + TOOL_SCREWDRIVER, + TOOL_SHOVEL, + TOOL_WELDER, + TOOL_WIRECUTTER, + TOOL_WRENCH, + ) /obj/item/debug/omnitool/attack_self(mob/user) if(!user) @@ -67,9 +89,9 @@ "Scalpel" = image(icon = 'icons/obj/medical/surgery_tools.dmi', icon_state = "scalpel"), "Saw" = image(icon = 'icons/obj/medical/surgery_tools.dmi', icon_state = "saw"), "Bonesetter" = image(icon = 'icons/obj/medical/surgery_tools.dmi', icon_state = "bonesetter"), - "Knife" = image(icon = 'icons/obj/kitchen.dmi', icon_state = "knife"), + "Knife" = image(icon = 'icons/obj/service/kitchen.dmi', icon_state = "knife"), "Blood Filter" = image(icon = 'icons/obj/medical/surgery_tools.dmi', icon_state = "bloodfilter"), - "Rolling Pin" = image(icon = 'icons/obj/kitchen.dmi', icon_state = "rolling_pin"), + "Rolling Pin" = image(icon = 'icons/obj/service/kitchen.dmi', icon_state = "rolling_pin"), "Wire Brush" = image(icon = 'icons/obj/tools.dmi', icon_state = "wirebrush"), ) var/tool_result = show_radial_menu(user, src, tool_list, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE) @@ -141,7 +163,7 @@ playsound(src, 'sound/voice/borg_deathsound.ogg') sleep(3 SECONDS) living_user.investigate_log("has been gibbed by [src].", INVESTIGATE_DEATHS) - living_user.gib() + living_user.gib(DROP_ALL_REMAINS) return var/turf/loc_turf = get_turf(src) for(var/spawn_atom in (choice == "No" ? typesof(path) : subtypesof(path))) diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 2adec2936235f..f9b93671a5ad9 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -175,13 +175,14 @@ else return ..() -/obj/item/defibrillator/emag_act(mob/user) - if(safety) - safety = FALSE - to_chat(user, span_warning("You silently disable [src]'s safety protocols with the cryptographic sequencer.")) - else - safety = TRUE - to_chat(user, span_notice("You silently enable [src]'s safety protocols with the cryptographic sequencer.")) +/obj/item/defibrillator/emag_act(mob/user, obj/item/card/emag/emag_card) + + safety = !safety + + var/enabled_or_disabled = (safety ? "enabled" : "disabled") + balloon_alert(user, "safety protocols [enabled_or_disabled]") + + return TRUE /obj/item/defibrillator/emp_act(severity) . = ..() @@ -592,6 +593,9 @@ playsound(src, 'sound/machines/defib_failed.ogg', 50, FALSE) do_cancel() return + if(SEND_SIGNAL(H, COMSIG_DEFIBRILLATOR_PRE_HELP_ZAP, user, src) & COMPONENT_DEFIB_STOP) + do_cancel() + return if(H.stat == DEAD) H.visible_message(span_warning("[H]'s body convulses a bit.")) playsound(src, SFX_BODYFALL, 50, TRUE) @@ -628,17 +632,19 @@ var/total_brute = H.getBruteLoss() var/total_burn = H.getFireLoss() + var/need_mob_update = FALSE //If the body has been fixed so that they would not be in crit when defibbed, give them oxyloss to put them back into crit if (H.health > HALFWAYCRITDEATH) - H.adjustOxyLoss(H.health - HALFWAYCRITDEATH, 0) + need_mob_update += H.adjustOxyLoss(H.health - HALFWAYCRITDEATH, updating_health = FALSE) else var/overall_damage = total_brute + total_burn + H.getToxLoss() + H.getOxyLoss() var/mobhealth = H.health - H.adjustOxyLoss((mobhealth - HALFWAYCRITDEATH) * (H.getOxyLoss() / overall_damage), 0) - H.adjustToxLoss((mobhealth - HALFWAYCRITDEATH) * (H.getToxLoss() / overall_damage), 0, TRUE) // force tox heal for toxin lovers too - H.adjustFireLoss((mobhealth - HALFWAYCRITDEATH) * (total_burn / overall_damage), 0) - H.adjustBruteLoss((mobhealth - HALFWAYCRITDEATH) * (total_brute / overall_damage), 0) - H.updatehealth() // Previous "adjust" procs don't update health, so we do it manually. + need_mob_update += H.adjustOxyLoss((mobhealth - HALFWAYCRITDEATH) * (H.getOxyLoss() / overall_damage), updating_health = FALSE) + need_mob_update += H.adjustToxLoss((mobhealth - HALFWAYCRITDEATH) * (H.getToxLoss() / overall_damage), updating_health = FALSE, forced = TRUE) // force tox heal for toxin lovers too + need_mob_update += H.adjustFireLoss((mobhealth - HALFWAYCRITDEATH) * (total_burn / overall_damage), updating_health = FALSE) + need_mob_update += H.adjustBruteLoss((mobhealth - HALFWAYCRITDEATH) * (total_brute / overall_damage), updating_health = FALSE) + if(need_mob_update) + H.updatehealth() // Previous "adjust" procs don't update health, so we do it manually. user.visible_message(span_notice("[req_defib ? "[defib]" : "[src]"] pings: Resuscitation successful.")) playsound(src, 'sound/machines/defib_success.ogg', 50, FALSE) H.set_heartattack(FALSE) @@ -648,7 +654,10 @@ H.emote("gasp") H.set_jitter_if_lower(200 SECONDS) SEND_SIGNAL(H, COMSIG_LIVING_MINOR_SHOCK) - user.add_mood_event("saved_life", /datum/mood_event/saved_life) + if(HAS_MIND_TRAIT(user, TRAIT_MORBID)) + user.add_mood_event("morbid_saved_life", /datum/mood_event/morbid_saved_life) + else + user.add_mood_event("saved_life", /datum/mood_event/saved_life) log_combat(user, H, "revived", defib) do_success() return diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index e99811e4bfa95..0ab7e5d94b52a 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -3,6 +3,7 @@ desc = "A storage device for AIs. Patent pending." icon = 'icons/obj/aicards.dmi' icon_state = "aicard" // aicard-full + base_icon_state = "aicard" inhand_icon_state = "electronic" worn_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' @@ -13,9 +14,12 @@ var/flush = FALSE var/mob/living/silicon/ai/AI +/obj/item/aicard/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_CASTABLE_LOC, INNATE_TRAIT) + /obj/item/aicard/Destroy(force) if(AI) - AI.death() AI.ghostize(can_reenter_corpse = FALSE) QDEL_NULL(AI) @@ -25,47 +29,80 @@ name = "intelliTater" desc = "A stylish upgrade (?) to the intelliCard." icon_state = "aitater" + base_icon_state = "aitater" /obj/item/aicard/aispook name = "intelliLantern" desc = "A spoOoOoky upgrade to the intelliCard." icon_state = "aispook" + base_icon_state = "aispook" /obj/item/aicard/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is trying to upload [user.p_them()]self into [src]! That's not going to work out well!")) return BRUTELOSS /obj/item/aicard/pre_attack(atom/target, mob/living/user, params) - if(AI) //AI is on the card, implies user wants to upload it. - var/our_ai = AI - target.transfer_ai(AI_TRANS_FROM_CARD, user, AI, src) - if(!AI) - log_combat(user, our_ai, "uploaded", src, "to [target].") - update_appearance() + . = ..() + if(.) + return + + if(AI) + if(upload_ai(target, user)) return TRUE - else //No AI on the card, therefore the user wants to download one. - target.transfer_ai(AI_TRANS_TO_CARD, user, null, src) - if(AI) - log_silicon("[key_name(user)] carded [key_name(AI)]", src) - update_appearance() + else + if(capture_ai(target, user)) return TRUE - return ..() -/obj/item/aicard/update_icon_state() - if(!AI) - name = initial(name) - icon_state = initial(icon_state) - return ..() - name = "[initial(name)] - [AI.name]" - icon_state = "[initial(icon_state)][AI.stat == DEAD ? "-404" : "-full"]" +/// Tries to get an AI from the atom clicked +/obj/item/aicard/proc/capture_ai(atom/from_what, mob/living/user) + from_what.transfer_ai(AI_TRANS_TO_CARD, user, null, src) + if(isnull(AI)) + return FALSE + + log_silicon("[key_name(user)] carded [key_name(AI)]", list(src)) + update_appearance() AI.cancel_camera() + RegisterSignal(AI, COMSIG_MOB_STATCHANGE, PROC_REF(on_ai_stat_change)) + return TRUE + +/// Tries to upload the AI we have captured to the atom clicked +/obj/item/aicard/proc/upload_ai(atom/to_what, mob/living/user) + var/mob/living/silicon/ai/old_ai = AI + to_what.transfer_ai(AI_TRANS_FROM_CARD, user, AI, src) + if(!isnull(AI)) + return FALSE + + log_combat(user, old_ai, "uploaded", src, "to [to_what].") + update_appearance() + old_ai.cancel_camera() + UnregisterSignal(old_ai, COMSIG_MOB_STATCHANGE) + return TRUE + +/obj/item/aicard/proc/on_ai_stat_change(datum/source, new_stat, old_stat) + SIGNAL_HANDLER + + if(new_stat == DEAD || old_stat == DEAD) + update_appearance() + +/obj/item/aicard/update_name(updates) + . = ..() + if(AI) + name = "[initial(name)] - [AI.name]" + else + name = initial(name) + +/obj/item/aicard/update_icon_state() + if(AI) + icon_state = "[base_icon_state][AI.stat == DEAD ? "-404" : "-full"]" + else + icon_state = base_icon_state return ..() /obj/item/aicard/update_overlays() . = ..() if(!AI?.control_disabled) return - . += "[initial(icon_state)]-on" + . += "[base_icon_state]-on" /obj/item/aicard/ui_state(mob/user) return GLOB.hands_state @@ -101,20 +138,10 @@ var/confirm = tgui_alert(usr, "Are you sure you want to wipe this card's memory?", name, list("Yes", "No")) if(confirm == "Yes" && !..()) flush = TRUE - if(AI && AI.loc == src) - to_chat(AI, span_userdanger("Your core files are being wiped!")) - while(AI.stat != DEAD && flush) - AI.adjustOxyLoss(5) - AI.updatehealth() - sleep(0.5 SECONDS) - flush = FALSE + wipe_ai() . = TRUE if("wireless") AI.control_disabled = !AI.control_disabled - if(!AI.control_disabled) - AI.interaction_range = INFINITY - else - AI.interaction_range = 0 to_chat(AI, span_warning("[src]'s wireless port has been [AI.control_disabled ? "disabled" : "enabled"]!")) . = TRUE if("radio") @@ -122,3 +149,14 @@ to_chat(AI, span_warning("Your Subspace Transceiver has been [AI.radio_enabled ? "enabled" : "disabled"]!")) . = TRUE update_appearance() + +/obj/item/aicard/proc/wipe_ai() + set waitfor = FALSE + + if(AI && AI.loc == src) + to_chat(AI, span_userdanger("Your core files are being wiped!")) + while(AI.stat != DEAD && flush) + AI.adjustOxyLoss(5) + AI.updatehealth() + sleep(0.5 SECONDS) + flush = FALSE diff --git a/code/game/objects/items/devices/aicard_evil.dm b/code/game/objects/items/devices/aicard_evil.dm new file mode 100644 index 0000000000000..1a5fce6897ae1 --- /dev/null +++ b/code/game/objects/items/devices/aicard_evil.dm @@ -0,0 +1,104 @@ +/// One use AI card which downloads a ghost as a syndicate AI to put in your MODsuit +/obj/item/aicard/syndie + name = "syndiCard" + desc = "A storage device for AIs. Nanotrasen forgot to make the patent, so the Syndicate made their own version!" + icon = 'icons/obj/aicards.dmi' + icon_state = "syndicard" + base_icon_state = "syndicard" + item_flags = null + force = 7 + +/obj/item/aicard/syndie/loaded + /// Set to true while we're waiting for ghosts to sign up + var/finding_candidate = FALSE + +/obj/item/aicard/syndie/loaded/examine(mob/user) + . = ..() + . += span_notice("This one has a little S.E.L.F. insignia on the back, and a label next to it that says 'Activate for one FREE aligned AI! Please attempt uplink reintegration or ask your employers for reimbursal if AI is unavailable or belligerent.") + +/obj/item/aicard/syndie/loaded/attack_self(mob/user, modifiers) + if(!isnull(AI)) + return ..() + if(finding_candidate) + balloon_alert(user, "loading...") + return TRUE + finding_candidate = TRUE + to_chat(user, span_notice("Connecting to S.E.L.F. dispatch...")) + procure_ai(user) + finding_candidate = FALSE + return TRUE + +/obj/item/aicard/syndie/loaded/proc/procure_ai(mob/user) + var/datum/antagonist/nukeop/op_datum = user.mind?.has_antag_datum(/datum/antagonist/nukeop,TRUE) + if(isnull(op_datum)) + balloon_alert(user, "invalid access!") + return + var/list/nuke_candidates = poll_ghost_candidates( + question = "Do you want to play as a nuclear operative MODsuit AI?", + jobban_type = ROLE_OPERATIVE, + be_special_flag = ROLE_OPERATIVE_MIDROUND, + poll_time = 15 SECONDS, + ignore_category = POLL_IGNORE_SYNDICATE, + ) + if(QDELETED(src)) + return + if(!LAZYLEN(nuke_candidates)) + to_chat(user, span_warning("Unable to connect to S.E.L.F. dispatch. Please wait and try again later or use the intelliCard on your uplink to get your points refunded.")) + return + // pick ghost, create AI and transfer + var/mob/dead/observer/ghos = pick(nuke_candidates) + var/mob/living/silicon/ai/weak_syndie/new_ai = new /mob/living/silicon/ai/weak_syndie(get_turf(src), new /datum/ai_laws/syndicate_override, ghos) + // create and apply syndie datum + var/datum/antagonist/nukeop/nuke_datum = new() + nuke_datum.send_to_spawnpoint = FALSE + new_ai.mind.add_antag_datum(nuke_datum, op_datum.nuke_team) + new_ai.mind.special_role = "Syndicate AI" + new_ai.faction |= ROLE_SYNDICATE + // Make it look evil!!! + new_ai.hologram_appearance = mutable_appearance('icons/mob/silicon/ai.dmi',"xeno_queen") //good enough + new_ai.icon_state = resolve_ai_icon("hades") + // Transfer the AI from the core we created into the card, then delete the core + capture_ai(new_ai, user) + var/obj/structure/ai_core/deactivated/detritus = locate() in get_turf(src) + qdel(detritus) + AI.control_disabled = FALSE + AI.radio_enabled = TRUE + do_sparks(4, TRUE, src) + playsound(src, 'sound/machines/chime.ogg', 25, TRUE) + return + +/obj/item/aicard/syndie/loaded/upload_ai(atom/to_what, mob/living/user) + . = ..() + if (!.) + return + visible_message(span_warning("The expended card incinerates itself.")) + do_sparks(3, cardinal_only = FALSE, source = src) + new /obj/effect/decal/cleanable/ash(get_turf(src)) + qdel(src) + +/// Upgrade disk used to increase the range of a syndicate AI +/obj/item/computer_disk/syndie_ai_upgrade + name = "AI interaction range upgrade" + desc = "A NT data chip containing information that a syndiCard AI can utilize to improve its wireless interfacing abilities. Simply slap it on top of an intelliCard, MODsuit, or AI core and watch it do its work! It's rumoured that there's something 'pretty awful' in it." + icon = 'icons/obj/antags/syndicate_tools.dmi' + icon_state = "something_awful" + max_capacity = 1000 + w_class = WEIGHT_CLASS_NORMAL + +/obj/item/computer_disk/syndie_ai_upgrade/pre_attack(atom/A, mob/living/user, params) + var/mob/living/silicon/ai/AI + if(isAI(A)) + AI = A + else + AI = locate() in A + if(!AI || AI.interaction_range == INFINITY) + playsound(src,'sound/machines/buzz-sigh.ogg',50,FALSE) + to_chat(user, span_notice("Error! Incompatible object!")) + return ..() + AI.interaction_range += 2 + if(AI.interaction_range > 7) + AI.interaction_range = INFINITY + playsound(src,'sound/machines/twobeep.ogg',50,FALSE) + to_chat(user, span_notice("You insert [src] into [AI]'s compartment, and it beeps as it processes the data.")) + to_chat(AI, span_notice("You process [src], and find yourself able to manipulate electronics from up to [AI.interaction_range] meters!")) + qdel(src) diff --git a/code/game/objects/items/devices/beacon.dm b/code/game/objects/items/devices/beacon.dm index 00517f78915e8..e2936c0f538db 100644 --- a/code/game/objects/items/devices/beacon.dm +++ b/code/game/objects/items/devices/beacon.dm @@ -20,14 +20,18 @@ GLOB.teleportbeacons -= src return ..() +/obj/item/beacon/proc/turn_off() + icon_state = "beacon-off" + GLOB.teleportbeacons -= src + SEND_SIGNAL(src, COMSIG_BEACON_DISABLED) + /obj/item/beacon/attack_self(mob/user) enabled = !enabled if (enabled) icon_state = "beacon" GLOB.teleportbeacons += src else - icon_state = "beacon-off" - GLOB.teleportbeacons -= src + turn_off() to_chat(user, span_notice("You [enabled ? "enable" : "disable"] the beacon.")) return diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm deleted file mode 100644 index 918b7313691ae..0000000000000 --- a/code/game/objects/items/devices/camera_bug.dm +++ /dev/null @@ -1,319 +0,0 @@ - -#define BUGMODE_LIST 0 -#define BUGMODE_MONITOR 1 -#define BUGMODE_TRACK 2 - - - -/obj/item/camera_bug - name = "camera bug" - desc = "For illicit snooping through the camera network." - icon = 'icons/obj/device.dmi' - icon_state = "camera_bug" - w_class = WEIGHT_CLASS_TINY - inhand_icon_state = "camera_bug" - throw_speed = 4 - throw_range = 20 - item_flags = NOBLUDGEON - - var/obj/machinery/camera/current = null - - var/last_net_update = 0 - var/list/bugged_cameras = list() - - var/track_mode = BUGMODE_LIST - var/last_tracked = 0 - var/refresh_interval = 50 - - var/tracked_name = null - var/atom/tracking = null - - var/last_found = null - var/last_seen = null - -/obj/item/camera_bug/Initialize(mapload) - . = ..() - START_PROCESSING(SSobj, src) - -/obj/item/camera_bug/Destroy() - STOP_PROCESSING(SSobj, src) - get_cameras() - for(var/cam_tag in bugged_cameras) - var/datum/weakref/camera_ref = bugged_cameras[cam_tag] - var/obj/machinery/camera/camera = camera_ref.resolve() - if(camera && camera.bug == src) - camera.bug = null - bugged_cameras = list() - if(tracking) - tracking = null - return ..() - -/obj/item/camera_bug/interact(mob/user) - ui_interact(user) - -/obj/item/camera_bug/ui_interact(mob/user = usr) - . = ..() - var/datum/browser/popup = new(user, "camerabug","Camera Bug",nref=src) - popup.set_content(menu(get_cameras())) - popup.open() - -/obj/item/camera_bug/attack_self(mob/user) - user.set_machine(src) - interact(user) - -/obj/item/camera_bug/check_eye(mob/user) - if ( loc != user || user.incapacitated() || user.is_blind() || !current ) - user.unset_machine() - return FALSE - if(!is_valid_z_level(get_turf(current), get_turf(user.loc)) || !current.can_use()) - to_chat(user, span_danger("[src] has lost the signal.")) - current = null - user.unset_machine() - return FALSE - return TRUE -/obj/item/camera_bug/on_unset_machine(mob/user) - user.reset_perspective(null) - -/obj/item/camera_bug/proc/get_cameras() - if( world.time > (last_net_update + 100)) - bugged_cameras = list() - for(var/obj/machinery/camera/camera as anything in GLOB.cameranet.cameras) - if(camera.machine_stat || !camera.can_use()) - continue - if(length(list("ss13","mine", "rd", "labor", "ordnance", "minisat") & camera.network)) - var/datum/weakref/camera_ref = WEAKREF(camera) - if(!camera_ref || !camera.c_tag) - continue - bugged_cameras[camera.c_tag] = camera_ref - return sort_list(bugged_cameras) - - -/obj/item/camera_bug/proc/menu(list/cameras) - if(!cameras || !cameras.len) - return "No bugged cameras found." - - var/html - switch(track_mode) - if(BUGMODE_LIST) - html = "

Select a camera:

\[Cancel camera view\]
" - for(var/entry in cameras) - var/datum/weakref/camera_ref = cameras[entry] - var/obj/machinery/camera/camera = camera_ref.resolve() - if(!camera) - cameras -= camera_ref - continue - var/functions = "" - if(camera.bug == src) - functions = " - \[Monitor\]\[Disable\]" - else - functions = " - \[Monitor\]" - html += "" - - if(BUGMODE_MONITOR) - if(current) - html = "Analyzing Camera '[current.c_tag]' \[Select Camera\]
" - html += camera_report() - else - track_mode = BUGMODE_LIST - return .(cameras) - if(BUGMODE_TRACK) - if(tracking) - html = "Tracking '[tracked_name]' \[Cancel Tracking\]\[Cancel camera view\]
" - if(last_found) - var/time_diff = round((world.time - last_seen) / 150) - var/datum/weakref/camera_ref = bugged_cameras[last_found] - var/obj/machinery/camera/camera = camera_ref.resolve() - var/outstring - if(camera) - outstring = "[last_found]" - else - outstring = last_found - if(!time_diff) - html += "Last seen near [outstring] (now)
" - else - // 15 second intervals ~ 1/4 minute - var/m = round(time_diff/4) - var/s = (time_diff - 4*m) * 15 - if(!s) - s = "00" - html += "Last seen near [outstring] ([m]:[s] minute\s ago)
" - if(camera && (camera.bug == src)) //Checks to see if the camera has a bug - html += "\[Disable\]" - - else - html += "Not yet seen." - else - track_mode = BUGMODE_LIST - return .(cameras) - return html - -/obj/item/camera_bug/proc/get_seens() - return current?.can_see() - -/obj/item/camera_bug/proc/camera_report() - // this should only be called if current exists - var/dat = "" - var/list/seen = get_seens() - if(seen && seen.len >= 1) - var/list/names = list() - for(var/obj/singularity/S in seen) // god help you if you see more than one - if(S.name in names) - names[S.name]++ - dat += "[S.name] ([names[S.name]])" - else - names[S.name] = 1 - dat += "[S.name]" - var/stage = round(S.current_size / 2)+1 - dat += " (Stage [stage])" - dat += " \[Track\]
" - - for(var/obj/vehicle/sealed/mecha/M in seen) - if(M.name in names) - names[M.name]++ - dat += "[M.name] ([names[M.name]])" - else - names[M.name] = 1 - dat += "[M.name]" - dat += " \[Track\]
" - - - for(var/mob/living/M in seen) - if(M.name in names) - names[M.name]++ - dat += "[M.name] ([names[M.name]])" - else - names[M.name] = 1 - dat += "[M.name]" - if(M.body_position == LYING_DOWN) - if(M.buckled) - dat += " (Sitting)" - else - dat += " (Laying down)" - dat += " \[Track\]
" - if(length(dat) == 0) - dat += "No motion detected." - return dat - else - return "Camera Offline
" - -/obj/item/camera_bug/Topic(href,list/href_list) - if(usr != loc) - usr.unset_machine() - usr << browse(null, "window=camerabug") - return - usr.set_machine(src) - if("mode" in href_list) - track_mode = text2num(href_list["mode"]) - if("monitor" in href_list) - //You can't locate on a list with keys - var/list/cameras = flatten_list(bugged_cameras) - var/datum/weakref/camera_ref = locate(href_list["monitor"]) in cameras - var/obj/machinery/camera/camera = camera_ref.resolve() - if(camera && istype(camera)) - if(!same_z_level(camera)) - return - track_mode = BUGMODE_MONITOR - current = camera - usr.reset_perspective(null) - interact() - if("track" in href_list) - var/list/seen = get_seens() - if(seen && seen.len >= 1) - var/atom/A = locate(href_list["track"]) in seen - if(A && istype(A)) - tracking = A - tracked_name = A.name - last_found = current.c_tag - last_seen = world.time - track_mode = BUGMODE_TRACK - if("emp" in href_list) - //You can't locate on a list with keys - var/list/cameras = flatten_list(bugged_cameras) - var/datum/weakref/camera_ref = locate(href_list["emp"]) in cameras - var/obj/machinery/camera/camera = camera_ref.resolve() - if(camera && istype(camera) && camera.bug == src) - if(!same_z_level(camera)) - return - camera.emp_act(EMP_HEAVY) - camera.bug = null - bugged_cameras -= camera.c_tag - interact() - return - if("close" in href_list) - usr.unset_machine() - current = null - return - if("view" in href_list) - //You can't locate on a list with keys - var/list/cameras = flatten_list(bugged_cameras) - var/datum/weakref/camera_ref = locate(href_list["view"]) in cameras - var/obj/machinery/camera/camera = camera_ref.resolve() - if(camera && istype(camera)) - if(!same_z_level(camera)) - return - if(!camera.can_use()) - to_chat(usr, span_warning("Something's wrong with that camera! You can't get a feed.")) - return - current = camera - addtimer(CALLBACK(src, PROC_REF(view_camera), usr, camera), 0.6 SECONDS) - return - else - usr.unset_machine() - - interact() - -/obj/item/camera_bug/proc/view_camera(mob/show, obj/machinery/camera/camera) - if(check_eye(show)) - show.reset_perspective(camera) - interact() - else - show.unset_machine() - show << browse(null, "window=camerabug") - -/obj/item/camera_bug/process() - if(track_mode == BUGMODE_LIST || (world.time < (last_tracked + refresh_interval))) - return - last_tracked = world.time - if(track_mode == BUGMODE_TRACK ) // search for user - // Note that it will be tricked if your name appears to change. - // This is not optimal but it is better than tracking you relentlessly despite everything. - if(!tracking) - src.updateSelfDialog() - return - - if(tracking.name != tracked_name) // Hiding their identity, tricksy - var/mob/M = tracking - if(istype(M)) - if(!(tracked_name == "Unknown" && findtext(tracking.name,"Unknown"))) // we saw then disguised before - if(!(tracked_name == M.real_name && findtext(tracking.name,M.real_name))) // or they're still ID'd - src.updateSelfDialog()//But if it's neither of those cases - return // you won't find em on the cameras - else - src.updateSelfDialog() - return - - var/list/tracking_cams = list() - var/list/b_cams = get_cameras() - for(var/entry in b_cams) - tracking_cams += b_cams[entry] - var/list/target_region = view(tracking) - - for(var/obj/machinery/camera/C in (target_region & tracking_cams)) - if(!can_see(C,tracking)) // target may have xray, that doesn't make them visible to cameras - continue - if(C.can_use()) - last_found = C.c_tag - last_seen = world.time - break - src.updateSelfDialog() - -/obj/item/camera_bug/proc/same_z_level(obj/machinery/camera/C) - var/turf/T_bug = get_turf(loc) - if(!T_bug || !is_valid_z_level(T_bug, get_turf(C))) - to_chat(usr, span_warning("You can't get a signal!")) - return FALSE - return TRUE - -#undef BUGMODE_LIST -#undef BUGMODE_MONITOR -#undef BUGMODE_TRACK diff --git a/code/game/objects/items/devices/destabilizing_crystal.dm b/code/game/objects/items/devices/destabilizing_crystal.dm index 2a85e078507a1..87e85adfdb095 100644 --- a/code/game/objects/items/devices/destabilizing_crystal.dm +++ b/code/game/objects/items/devices/destabilizing_crystal.dm @@ -2,7 +2,7 @@ name = "destabilizing crystal" desc = "A crystal that can be used to destabilize the supermatter to cause a resonance cascade. Carefully apply this on \ a fully stable supermatter crystal and start the delamination. Prevent anyone from stopping you." - icon = 'icons/obj/engine/supermatter.dmi' + icon = 'icons/obj/machines/engine/supermatter.dmi' icon_state = "destabilizing_crystal" w_class = WEIGHT_CLASS_NORMAL flags_1 = CONDUCT_1 diff --git a/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm b/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm index 7366422011c97..827642b139a02 100644 --- a/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm +++ b/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm @@ -2,7 +2,7 @@ /obj/item/electroadaptive_pseudocircuit name = "electroadaptive pseudocircuit" desc = "An all-in-one circuit imprinter, designer, synthesizer, outfitter, creator, and chef. It can be used in place of any generic circuit board during construction." - icon = 'icons/obj/module.dmi' + icon = 'icons/obj/assemblies/module.dmi' icon_state = "boris" w_class = WEIGHT_CLASS_TINY custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 9bc5c64b987cf..e49f2361a6e16 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -23,6 +23,8 @@ light_range = 4 light_power = 1 light_on = FALSE + /// If we've been forcibly disabled for a temporary amount of time. + COOLDOWN_DECLARE(disabled_time) /// Can we toggle this light on and off (used for contexual screentips only) var/toggle_context = TRUE /// The sound the light makes when it's turned on @@ -38,6 +40,15 @@ on = TRUE update_brightness() register_context() + if(toggle_context) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) + + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/flashlight_eyes) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) /obj/item/flashlight/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) // single use lights can be toggled on once @@ -64,15 +75,21 @@ if(light_system == STATIC_LIGHT) update_light() -/obj/item/flashlight/proc/toggle_light() +/obj/item/flashlight/proc/toggle_light(mob/user) + var/disrupted = FALSE on = !on playsound(src, on ? sound_on : sound_off, 40, TRUE) + if(!COOLDOWN_FINISHED(src, disabled_time)) + if(user) + balloon_alert(user, "disrupted!") + on = FALSE + disrupted = TRUE update_brightness() update_item_action_buttons() - return TRUE + return !disrupted /obj/item/flashlight/attack_self(mob/user) - toggle_light() + toggle_light(user) /obj/item/flashlight/attack_hand_secondary(mob/user, list/modifiers) attack_self(user) @@ -104,6 +121,8 @@ to_chat(user, "[span_warning("\The [src] isn't bright enough to see anything!")] ") return + var/render_list = list()//information will be packaged in a list for clean display to the user + switch(user.zone_selected) if(BODY_ZONE_PRECISE_EYES) if((M.head && M.head.flags_cover & HEADCOVERSEYES) || (M.wear_mask && M.wear_mask.flags_cover & MASKCOVERSEYES) || (M.glasses && M.glasses.flags_cover & GLASSESCOVERSEYES)) @@ -111,24 +130,38 @@ return var/obj/item/organ/internal/eyes/E = M.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/brain = M.get_organ_slot(ORGAN_SLOT_BRAIN) if(!E) to_chat(user, span_warning("[M] doesn't have any eyes!")) return + M.flash_act(visual = TRUE, length = (user.combat_mode) ? 2.5 SECONDS : 1 SECONDS) // Apply a 1 second flash effect to the target. The duration increases to 2.5 Seconds if you have combat mode on. + if(M == user) //they're using it on themselves - if(M.flash_act(visual = 1)) - M.visible_message(span_notice("[M] directs [src] to [M.p_their()] eyes."), span_notice("You wave the light in front of your eyes! Trippy!")) + user.visible_message(span_warning("[user] shines [src] into [M.p_their()] eyes."), ignored_mobs = user) + render_list += span_info("You direct [src] to into your eyes:\n") + + if(M.is_blind()) + render_list += "You're not entirely certain what you were expecting...\n" else - M.visible_message(span_notice("[M] directs [src] to [M.p_their()] eyes."), span_notice("You wave the light in front of your eyes.")) + render_list += "Trippy!\n" + else - user.visible_message(span_warning("[user] directs [src] to [M]'s eyes."), \ - span_danger("You direct [src] to [M]'s eyes.")) - if(M.stat == DEAD || (M.is_blind()) || !M.flash_act(visual = 1)) //mob is dead or fully blind - to_chat(user, span_warning("[M]'s pupils don't react to the light!")) - else if(M.dna && M.dna.check_mutation(/datum/mutation/human/xray)) //mob has X-ray vision - to_chat(user, span_danger("[M]'s pupils give an eerie glow!")) - else //they're okay! - to_chat(user, span_notice("[M]'s pupils narrow.")) + user.visible_message(span_warning("[user] directs [src] to [M]'s eyes."), ignored_mobs = user) + render_list += span_info("You direct [src] to [M]'s eyes:\n") + + if(M.stat == DEAD || M.is_blind() || M.get_eye_protection() > FLASH_PROTECTION_WELDER) + render_list += "[M.p_Their()] pupils don't react to the light!\n"//mob is dead + else if(brain.damage > 20) + render_list += "[M.p_Their()] pupils contract unevenly!\n"//mob has sustained damage to their brain + else + render_list += "[M.p_Their()] pupils narrow.\n"//they're okay :D + + if(M.dna && M.dna.check_mutation(/datum/mutation/human/xray)) + render_list += "[M.p_Their()] pupils give an eerie glow!\n"//mob has X-ray vision + + //display our packaged information in an examine block for easy reading + to_chat(user, examine_block(jointext(render_list, "")), type = MESSAGE_TYPE_INFO) if(BODY_ZONE_PRECISE_MOUTH) @@ -136,8 +169,6 @@ to_chat(user, span_warning("You're going to need to remove that [(M.head && M.head.flags_cover & HEADCOVERSMOUTH) ? "helmet" : "mask"] first!")) return - var/their = M.p_their() - var/list/mouth_organs = new for(var/obj/item/organ/organ as anything in M.organs) if(organ.zone == BODY_ZONE_PRECISE_MOUTH) @@ -158,7 +189,7 @@ for(var/datum/action/item_action/hands_free/activate_pill/AP in M.actions) pill_count++ - if(M == user) + if(M == user)//if we're looking on our own mouth var/can_use_mirror = FALSE if(isturf(user.loc)) var/obj/structure/mirror/mirror = locate(/obj/structure/mirror, user.loc) @@ -173,27 +204,57 @@ if(WEST) can_use_mirror = mirror.pixel_x < 0 - M.visible_message(span_notice("[M] directs [src] to [their] mouth."), \ - span_notice("You point [src] into your mouth.")) + M.visible_message(span_notice("[M] directs [src] to [ M.p_their()] mouth."), ignored_mobs = user) + render_list += span_info("You point [src] into your mouth:\n") if(!can_use_mirror) to_chat(user, span_notice("You can't see anything without a mirror.")) return if(organ_count) - to_chat(user, span_notice("Inside your mouth [organ_count > 1 ? "are" : "is"] [organ_list].")) + render_list += "Inside your mouth [organ_count > 1 ? "are" : "is"] [organ_list].\n" else - to_chat(user, span_notice("There's nothing inside your mouth.")) + render_list += "There's nothing inside your mouth.\n" if(pill_count) - to_chat(user, span_notice("You have [pill_count] implanted pill[pill_count > 1 ? "s" : ""].")) + render_list += "You have [pill_count] implanted pill[pill_count > 1 ? "s" : ""].\n" - else - user.visible_message(span_notice("[user] directs [src] to [M]'s mouth."),\ - span_notice("You direct [src] to [M]'s mouth.")) + else //if we're looking in someone elses mouth + user.visible_message(span_notice("[user] directs [src] to [M]'s mouth."), ignored_mobs = user) + render_list += span_info("You point [src] into [M]'s mouth:\n") if(organ_count) - to_chat(user, span_notice("Inside [their] mouth [organ_count > 1 ? "are" : "is"] [organ_list].")) + render_list += "Inside [ M.p_their()] mouth [organ_count > 1 ? "are" : "is"] [organ_list].\n" else - to_chat(user, span_notice("[M] doesn't have any organs in [their] mouth.")) + render_list += "[M] doesn't have any organs in [ M.p_their()] mouth.\n" if(pill_count) - to_chat(user, span_notice("[M] has [pill_count] pill[pill_count > 1 ? "s" : ""] implanted in [their] teeth.")) + render_list += "[M] has [pill_count] pill[pill_count > 1 ? "s" : ""] implanted in [ M.p_their()] teeth.\n" + + //assess any suffocation damage + var/hypoxia_status = M.getOxyLoss() > 20 + + if(M == user) + if(hypoxia_status) + render_list += "Your lips appear blue!\n"//you have suffocation damage + else + render_list += "Your lips appear healthy.\n"//you're okay! + else + if(hypoxia_status) + render_list += "[M.p_Their()] lips appear blue!\n"//they have suffocation damage + else + render_list += "[M.p_Their()] lips appear healthy.\n"//they're okay! + + //assess blood level + if(M == user) + render_list += span_info("You press a finger to your gums:\n") + else + render_list += span_info("You press a finger to [M.p_their()] gums:\n") + + if(M.blood_volume <= BLOOD_VOLUME_SAFE && M.blood_volume > BLOOD_VOLUME_OKAY) + render_list += "Color returns slowly!\n"//low blood + else if(M.blood_volume <= BLOOD_VOLUME_OKAY) + render_list += "Color does not return!\n"//critical blood + else + render_list += "Color returns quickly.\n"//they're okay :D + + //display our packaged information in an examine block for easy reading + to_chat(user, examine_block(jointext(render_list, "")), type = MESSAGE_TYPE_INFO) else return ..() @@ -210,6 +271,14 @@ if(istype(user) && dir != user.dir) setDir(user.dir) +/// when hit by a light disruptor - turns the light off, forces the light to be disabled for a few seconds +/obj/item/flashlight/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + if(on) + toggle_light() + COOLDOWN_START(src, disabled_time, disrupt_duration) + return COMSIG_SABOTEUR_SUCCESS + /obj/item/flashlight/pen name = "penlight" desc = "A pen-sized light, used by medical staff. It can also be used to create a hologram to alert people of incoming medical assistance." @@ -234,7 +303,7 @@ holo_cooldown = world.time + 10 SECONDS return -// see: [/datum/wound/burn/proc/uv()] +// see: [/datum/wound/burn/flesh/proc/uv()] /obj/item/flashlight/pen/paramedic name = "paramedic penlight" desc = "A high-powered UV penlight intended to help stave off infection in the field on serious burned patients. Probably really bad to look into." diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 96976eeb82bc0..cf3ec16c98d1f 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -2,7 +2,7 @@ /obj/item/gps name = "global positioning system" desc = "Helping lost spacemen find their way through the planets since 2016." - icon = 'icons/obj/telescience.dmi' + icon = 'icons/obj/device.dmi' icon_state = "gps-c" inhand_icon_state = "electronic" worn_icon_state = "electronic" diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 380a7c82b5622..ccb7cf702c7eb 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -5,19 +5,29 @@ icon_state = "pointer" inhand_icon_state = "pen" worn_icon_state = "pen" - var/pointer_icon_state flags_1 = CONDUCT_1 item_flags = NOBLUDGEON slot_flags = ITEM_SLOT_BELT - custom_materials = list(/datum/material/iron= SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass= SMALL_MATERIAL_AMOUNT * 5) + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5) w_class = WEIGHT_CLASS_SMALL - var/turf/pointer_loc + ///Currently stored blulespace crystal, if any. Required to use the pointer through walls + var/obj/item/stack/ore/bluespace_crystal/crystal_lens + ///Currently stored micro-laser diode + var/obj/item/stock_parts/micro_laser/diode + ///Chance that the pointer dot will trigger a reaction from a mob/object + var/effectchance = 30 + ///Currently available battery charge of the laser pointer var/energy = 10 + ///Maximum possible battery charge of the laser. Draining the battery puts the pointer in a recharge state, preventing use, which ends upon full recharge var/max_energy = 10 - var/effectchance = 30 - var/recharging = FALSE + ///Maximum use range + var/max_range = 7 + ///Icon for the laser, affects both the laser dot and the laser pointer itself, as it shines a laser on the item itself + var/pointer_icon_state = null + ///Whether the pointer is currently in a full recharge state. Triggered upon fully draining the battery var/recharge_locked = FALSE - var/obj/item/stock_parts/micro_laser/diode //used for upgrading! + ///Whether the pointer is currently recharging or not + var/recharging = FALSE /obj/item/laser_pointer/red pointer_icon_state = "red_laser" @@ -35,7 +45,19 @@ . = ..() diode = new(src) if(!pointer_icon_state) - pointer_icon_state = pick("red_laser","green_laser","blue_laser","purple_laser") + pointer_icon_state = pick("red_laser", "green_laser", "blue_laser", "purple_laser") + +/obj/item/laser_pointer/Destroy(force) + QDEL_NULL(crystal_lens) + QDEL_NULL(diode) + return ..() + +/obj/item/laser_pointer/Exited(atom/movable/gone, direction) + . = ..() + if(gone == crystal_lens) + crystal_lens = null + if(gone == diode) + diode = null /obj/item/laser_pointer/upgraded/Initialize(mapload) . = ..() @@ -44,160 +66,264 @@ /obj/item/laser_pointer/screwdriver_act(mob/living/user, obj/item/tool) if(diode) tool.play_tool_sound(src) - to_chat(user, span_notice("You remove the [diode.name] from \the [src].")) + balloon_alert(user, "removed diode") diode.forceMove(drop_location()) diode = null return TRUE -/obj/item/laser_pointer/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/stock_parts/micro_laser)) - if(!diode) - if(!user.transferItemToLoc(W, src)) - return - diode = W - to_chat(user, span_notice("You install a [diode.name] in [src].")) - else - to_chat(user, span_warning("[src] already has a diode installed!")) - else - return ..() +/obj/item/laser_pointer/tool_act(mob/living/user, obj/item/tool) + . = ..() + if(isnull(crystal_lens) || !(tool.tool_behaviour == TOOL_WIRECUTTER || tool.tool_behaviour == TOOL_HEMOSTAT)) + return + tool.play_tool_sound(src) + balloon_alert(user, "removed crystal lens") + crystal_lens.forceMove(drop_location()) + crystal_lens = null + return TRUE + +/obj/item/laser_pointer/attackby(obj/item/attack_item, mob/user, params) + if(istype(attack_item, /obj/item/stock_parts/micro_laser)) + if(diode) + balloon_alert(user, "already has a diode!") + return + var/obj/item/stock_parts/attack_diode = attack_item + if(crystal_lens && attack_diode.rating < 3) //only tier 3 and up are small enough to fit + to_chat(user, span_warning("You try to jam \the [attack_item.name] in place, but \the [crystal_lens.name] is in the way!")) + playsound(src, 'sound/machines/airlock_alien_prying.ogg', 20) + if(do_after(user, 2 SECONDS, src)) + var/atom/atom_to_teleport = pick(user, attack_item) + if(atom_to_teleport == user) + to_chat(user, span_warning("You jam \the [attack_item.name] in too hard and break \the [crystal_lens.name] inside, teleporting you away!")) + user.drop_all_held_items() + else if(atom_to_teleport == attack_item) + attack_item.forceMove(drop_location()) + to_chat(user, span_warning("You jam \the [attack_item.name] in too hard and break \the [crystal_lens.name] inside, teleporting \the [attack_item.name] away!")) + do_teleport(atom_to_teleport, get_turf(src), crystal_lens.blink_range, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) + qdel(crystal_lens) + return + if(!user.transferItemToLoc(attack_item, src)) + return + playsound(src, 'sound/items/screwdriver.ogg', 30) + diode = attack_item + balloon_alert(user, "installed \the [diode.name]") + //we have a diode now, try starting a charge sequence in case the pointer was charging when we took out the diode + recharging = TRUE + START_PROCESSING(SSobj, src) + return TRUE + + if(istype(attack_item, /obj/item/stack/ore/bluespace_crystal)) + if(crystal_lens) + balloon_alert(user, "already has a lens!") + return + //the crystal stack we're trying to install a crystal from + var/obj/item/stack/ore/bluespace_crystal/crystal_stack = attack_item + if(diode && diode.rating < 3) //only lasers of tier 3 and up can house a lens + to_chat(user, span_warning("You try to jam \the [crystal_stack.name] in front of the diode, but it's a bad fit!")) + playsound(src, 'sound/machines/airlock_alien_prying.ogg', 20) + if(do_after(user, 2 SECONDS, src)) + var/atom/atom_to_teleport = pick(user, src) + if(atom_to_teleport == user) + to_chat(user, span_warning("You press on \the [crystal_stack.name] too hard and are teleported away!")) + user.drop_all_held_items() + else if(atom_to_teleport == src) + forceMove(drop_location()) + to_chat(user, span_warning("You press on \the [crystal_stack.name] too hard and \the [src] is teleported away!")) + do_teleport(atom_to_teleport, get_turf(src), crystal_stack.blink_range, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) + crystal_stack.use_tool(src, user, amount = 1) //use only one if we were installing from a stack of crystals + return + //the single crystal that we actually install + var/obj/item/stack/ore/bluespace_crystal/single_crystal = crystal_stack.split_stack(null, 1) + if(isnull(single_crystal)) + return + if(!user.transferItemToLoc(single_crystal, src)) + return + crystal_lens = single_crystal + playsound(src, 'sound/items/screwdriver2.ogg', 30) + balloon_alert(user, "installed \the [crystal_lens.name]") + to_chat(user, span_notice("You install a [crystal_lens.name] in [src]. \ + It can now be used to shine through obstacles at the cost of double the energy drain.")) + return TRUE + + return ..() /obj/item/laser_pointer/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - if(!diode) + if(isnull(diode)) . += span_notice("The diode is missing.") else . += span_notice("A class [diode.rating] laser diode is installed. It is screwed in place.") + . += span_notice("A small display reads out that[recharge_locked ? " it is currently recharging to full, and" : ""] there is [energy * 10]% total charge remaining.") + if(crystal_lens) + . += span_notice("There is a [crystal_lens.name] fit neatly before the focus lens. It can be plucked out with some wirecutters.") + else if(diode) //hint at the ability to modify the pointer with a crystal only if we have a diode + . += span_notice("You could examine it more thoroughly...") + +/obj/item/laser_pointer/examine_more(mob/user) + . = ..() + if(!isnull(crystal_lens) || isnull(diode)) + return + switch(diode.rating) + if(1) + . += "\The [diode.name] is fit neatly into the casing." + if(2) + . += "\The [diode.name] is secured in place, with a little bit of room left between it and the focus lens." + if(3 to 4) + . += "\The [diode.name]'s size is much smaller compared to the previous generation lasers, \ + and the wide margin between it and the focus lens could probably house a crystal of some sort." /obj/item/laser_pointer/afterattack(atom/target, mob/living/user, flag, params) . = ..() . |= AFTERATTACK_PROCESSED_ITEM laser_act(target, user, params) +///Handles shining the clicked atom, /obj/item/laser_pointer/proc/laser_act(atom/target, mob/living/user, params) - if( !(user in (viewers(7,target))) ) - return - if (!diode) + if(isnull(diode)) to_chat(user, span_notice("You point [src] at [target], but nothing happens!")) return - if (!ISADVANCEDTOOLUSER(user)) + if(!ISADVANCEDTOOLUSER(user)) to_chat(user, span_warning("You don't have the dexterity to do this!")) return if(HAS_TRAIT(user, TRAIT_CHUNKYFINGERS)) to_chat(user, span_warning("Your fingers can't press the button!")) return + + if(!IN_GIVEN_RANGE(target, user, max_range)) + to_chat(user, span_warning("\The [target] is too far away!")) + return + if(!(user in (view(max_range, target)))) //check if we are visible from the target's PoV + if(isnull(crystal_lens)) + to_chat(user, span_warning("You can't point with [src] through walls!")) + return + if(!((user.sight & SEE_OBJS) || (user.sight & SEE_MOBS))) //only let it work if we have xray or thermals. mesons don't count because they are easier to get. + to_chat(user, span_notice("You can't quite make out your target and you fail to shine at it.")) + return + add_fingerprint(user) - //nothing happens if the battery is drained + //nothing happens if the battery has been drained and has not fully recharged yet if(recharge_locked) to_chat(user, span_notice("You point [src] at [target], but it's still charging.")) return + //The message we send to the user upon using the pointer var/outmsg + //The turf of the target we clicked on var/turf/targloc = get_turf(target) - //human/alien mobs + //human/alien mobs: if we aim for the eyes, chance to flash the target if(iscarbon(target)) - var/mob/living/carbon/C = target - if(user.zone_selected == BODY_ZONE_PRECISE_EYES) - - var/severity = 1 - if(prob(33)) - severity = 2 - else if(prob(50)) - severity = 0 + var/mob/living/carbon/target_humanoid = target + if(target_humanoid.stat == DEAD) + outmsg = span_notice("You point [src] at [target_humanoid], but [target_humanoid.p_they()] appear[target_humanoid.p_s()] to be dead!") + else if(user.zone_selected == BODY_ZONE_PRECISE_EYES) + //Intensity of the laser dot to pass to flash_act + var/severity = pick(0, 1, 2) //chance to actually hit the eyes depends on internal component - if(prob(effectchance * diode.rating) && C.flash_act(severity)) - outmsg = span_notice("You blind [C] by shining [src] in [C.p_their()] eyes.") - log_combat(user, C, "blinded with a laser pointer",src) + if(prob(effectchance * diode.rating) && target_humanoid.flash_act(severity)) + outmsg = span_notice("You blind [target_humanoid] by shining [src] in [target_humanoid.p_their()] eyes.") + log_combat(user, target_humanoid, "blinded with a laser pointer", src) else - outmsg = span_warning("You fail to blind [C] by shining [src] at [C.p_their()] eyes!") - log_combat(user, C, "attempted to blind with a laser pointer",src) + outmsg = span_warning("You fail to blind [target_humanoid] by shining [src] at [target_humanoid.p_their()] eyes!") + log_combat(user, target_humanoid, "attempted to blind with a laser pointer", src) - //robots + //borgs: chance to flash and paralyse the target else if(iscyborg(target)) - var/mob/living/silicon/S = target - log_combat(user, S, "shone in the sensors", src) + var/mob/living/silicon/target_sillycone = target //chance to actually hit the eyes depends on internal component - if(prob(effectchance * diode.rating) && S.flash_act(affect_silicon = TRUE)) - S.Paralyze(rand(100,200)) - to_chat(S, span_danger("Your sensors were overloaded by a laser!")) - outmsg = span_notice("You overload [S] by shining [src] at [S.p_their()] sensors.") + if(target_sillycone.stat == DEAD) + outmsg = span_notice("You point [src] at [target_sillycone], but [target_sillycone.p_they()] appear[target_sillycone.p_s()] to be non-functioning.") + if(prob(effectchance * diode.rating) && target_sillycone.flash_act(affect_silicon = TRUE)) + target_sillycone.set_temp_blindness_if_lower(5 SECONDS) + to_chat(target_sillycone, span_danger("Your sensors were overloaded by a laser!")) + outmsg = span_notice("You overload [target_sillycone] by shining [src] at [target_sillycone.p_their()] sensors.") + log_combat(user, target_sillycone, "shone in the sensors", src) else - outmsg = span_warning("You fail to overload [S] by shining [src] at [S.p_their()] sensors!") + outmsg = span_warning("You fail to overload [target_sillycone] by shining [src] at [target_sillycone.p_their()] sensors!") + log_combat(user, target_sillycone, "attempted to shine in the sensors", src) - //cameras + //cameras: chance to EMP the camera else if(istype(target, /obj/machinery/camera)) - var/obj/machinery/camera/C = target - if(prob(effectchance * diode.rating)) - C.emp_act(EMP_HEAVY) - outmsg = span_notice("You hit the lens of [C] with [src], temporarily disabling the camera!") - log_combat(user, C, "EMPed", src) + var/obj/machinery/camera/target_camera = target + if(!target_camera.status && !target_camera.emped) + outmsg = span_notice("You point [src] at [target_camera], but it seems to be disabled.") + else if(prob(effectchance * diode.rating)) + target_camera.emp_act(EMP_HEAVY) + outmsg = span_notice("You hit the lens of [target_camera] with [src], temporarily disabling the camera!") + log_combat(user, target_camera, "EMPed", src) else - outmsg = span_warning("You miss the lens of [C] with [src]!") + outmsg = span_warning("You miss the lens of [target_camera] with [src]!") - //catpeople - for(var/mob/living/carbon/human/H in view(1,targloc)) - if(!isfelinid(H) || H.incapacitated() || H.is_blind()) + //catpeople: make any felinid near the target to face the target, chance for felinids to pounce at the light, stepping to the target + for(var/mob/living/carbon/human/target_felinid in view(1, targloc)) + if(!isfelinid(target_felinid) || target_felinid.stat == DEAD || target_felinid.is_blind() || target_felinid.incapacitated()) continue - if(user.body_position == STANDING_UP) - H.setDir(get_dir(H,targloc)) // kitty always looks at the light + if(target_felinid.body_position == STANDING_UP) + target_felinid.setDir(get_dir(target_felinid, targloc)) // kitty always looks at the light if(prob(effectchance * diode.rating)) - H.visible_message(span_warning("[H] makes a grab for the light!"),span_userdanger("LIGHT!")) - H.Move(targloc) - log_combat(user, H, "moved with a laser pointer",src) + target_felinid.visible_message(span_warning("[target_felinid] makes a grab for the light!"), span_userdanger("LIGHT!")) + target_felinid.Move(targloc) + log_combat(user, target_felinid, "moved with a laser pointer", src) else - H.visible_message(span_notice("[H] looks briefly distracted by the light."), span_warning("You're briefly tempted by the shiny light...")) + target_felinid.visible_message(span_notice("[target_felinid] looks briefly distracted by the light."), span_warning("You're briefly tempted by the shiny light...")) else - H.visible_message(span_notice("[H] stares at the light."), span_warning("You stare at the light...")) + target_felinid.visible_message(span_notice("[target_felinid] stares at the light."), span_warning("You stare at the light...")) - //cats! - for(var/mob/living/simple_animal/pet/cat/C in view(1,targloc)) + //cats! - chance for any cat near the target to pounce at the light, stepping to the target + for(var/mob/living/simple_animal/pet/cat/target_kitty in view(1, targloc)) + if(target_kitty.stat == DEAD) + continue if(prob(effectchance * diode.rating)) - if(C.resting) - C.set_resting(FALSE, instant = TRUE) - C.visible_message(span_notice("[C] pounces on the light!"),span_warning("LIGHT!")) - C.Move(targloc) - C.Immobilize(1 SECONDS) + if(target_kitty.resting) + target_kitty.set_resting(FALSE, instant = TRUE) + target_kitty.visible_message(span_notice("[target_kitty] pounces on the light!"), span_warning("LIGHT!")) + target_kitty.Move(targloc) + target_kitty.Immobilize(1 SECONDS) else - C.visible_message(span_notice("[C] looks uninterested in your games."),span_warning("You spot [user] shining [src] at you. How insulting!")) + target_kitty.visible_message(span_notice("[target_kitty] looks uninterested in your games."), span_warning("You spot [user] shining [src] at you. How insulting!")) - //laser pointer image + //The pointer is shining, change its sprite to show icon_state = "pointer_[pointer_icon_state]" - var/image/I = image('icons/obj/weapons/guns/projectiles.dmi',targloc,pointer_icon_state,10) + + //setup pointer blip + var/mutable_appearance/laser = mutable_appearance('icons/obj/weapons/guns/projectiles.dmi', pointer_icon_state) var/list/modifiers = params2list(params) if(modifiers) if(LAZYACCESS(modifiers, ICON_X)) - I.pixel_x = (text2num(LAZYACCESS(modifiers, ICON_X)) - 16) + laser.pixel_x = (text2num(LAZYACCESS(modifiers, ICON_X)) - 16) if(LAZYACCESS(modifiers, ICON_Y)) - I.pixel_y = (text2num(LAZYACCESS(modifiers, ICON_Y)) - 16) + laser.pixel_y = (text2num(LAZYACCESS(modifiers, ICON_Y)) - 16) else - I.pixel_x = target.pixel_x + rand(-5,5) - I.pixel_y = target.pixel_y + rand(-5,5) + laser.pixel_x = target.pixel_x + rand(-5,5) + laser.pixel_y = target.pixel_y + rand(-5,5) if(outmsg) to_chat(user, outmsg) else to_chat(user, span_info("You point [src] at [target].")) - energy -= 1 - if(energy <= max_energy) + //we have successfully shone our pointer, reduce our battery depending on whether we have an extra lens or not + energy -= crystal_lens ? 2 : 1 + if(energy <= max_energy) //normal recharge, does not stop us from using the pointer if(!recharging) recharging = TRUE START_PROCESSING(SSobj, src) - if(energy <= 0) + if(energy <= 0) //battery is completely dry, recharge the pointer to full then let us use it again to_chat(user, span_warning("[src]'s battery is overused, it needs time to recharge!")) recharge_locked = TRUE - targloc.flick_overlay_view(I, 10) + //flash a pointer blip at the target + target.flick_overlay_view(laser, 1 SECONDS) + //reset pointer sprite icon_state = "pointer" /obj/item/laser_pointer/process(seconds_per_tick) - if(!diode) + if(isnull(diode)) recharging = FALSE return PROCESS_KILL - if(SPT_PROB(10 + diode.rating*10 - recharge_locked*1, seconds_per_tick)) //t1 is 20, 2 40 + if(SPT_PROB(10 + diode.rating * 10, seconds_per_tick)) //+10% chance per diode tier to recharge one use per process energy += 1 if(energy >= max_energy) energy = max_energy diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index c77e18cbad5bb..1d07e2a95588a 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -34,7 +34,7 @@ /obj/item/lightreplacer name = "light replacer" desc = "A device to automatically replace lights. Refill with broken or working light bulbs, or sheets of glass." - icon = 'icons/obj/janitor.dmi' + icon = 'icons/obj/service/janitor.dmi' icon_state = "lightreplacer" inhand_icon_state = "electronic" worn_icon_state = "light_replacer" @@ -71,24 +71,24 @@ /obj/item/lightreplacer/attackby(obj/item/insert, mob/user, params) . = ..() if(uses >= max_uses) - to_chat(user, span_warning("[src.name] is full.")) + user.balloon_alert(user, "already full!") return TRUE if(istype(insert, /obj/item/stack/sheet/glass)) var/obj/item/stack/sheet/glass/glass_to_insert = insert if(glass_to_insert.use(LIGHTBULB_COST)) add_uses(GLASS_SHEET_USES) - to_chat(user, span_notice("You insert a glass sheet into \the [src.name]. [status_string()]")) + user.balloon_alert(user, "glass inserted") else - to_chat(user, span_warning("You need [LIGHTBULB_COST] glass to replace lights!")) + user.balloon_alert(user, "need [LIGHTBULB_COST] glass sheets!") return TRUE if(insert.type == /obj/item/shard) //we don't want to insert plasma, titanium or other types of shards if(!user.temporarilyRemoveItemFromInventory(insert)) - to_chat(user, span_notice("[insert] is stuck in your hand!")) + user.balloon_alert(user, "stuck in your hand!") return TRUE if(!add_shard(user)) //add_shard will display a message if it created a bulb from the shard so only display message when that does not happen - to_chat(user, span_notice("You insert [insert] into \the [src]. [status_string()]")) + user.balloon_alert(user, "shard inserted") qdel(insert) return TRUE @@ -96,7 +96,7 @@ var/obj/item/light/light_to_insert = insert //remove from player's hand if(!user.temporarilyRemoveItemFromInventory(light_to_insert)) - to_chat(user, span_notice("[insert] is stuck in your hand!")) + user.balloon_alert(user, "stuck in your hand!") return TRUE //insert light. display message only if adding a shard did not create a new bulb else the messages will conflict @@ -106,7 +106,7 @@ else if(add_shard(user)) display_msg = FALSE if(display_msg) - to_chat(user, span_notice("You insert [light_to_insert] into \the [src]. [status_string()]")) + user.balloon_alert(user, "light inserted") qdel(light_to_insert) return TRUE @@ -146,20 +146,22 @@ if(!replaced_something) if(uses == max_uses) - to_chat(user, span_warning("\The [src] is full!")) + user.balloon_alert(user, "already full!") else - to_chat(user, span_warning("\The [storage_to_empty] contains no lights, glass sheets or shards.")) + user.balloon_alert(user, "nothing usable in [storage_to_empty]!") return TRUE - to_chat(user, span_notice("You fill \the [src] with lights from \the [storage_to_empty]. [status_string()]")) + user.balloon_alert(user, "lights inserted") return TRUE -/obj/item/lightreplacer/emag_act() +/obj/item/lightreplacer/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE obj_flags |= EMAGGED playsound(loc, SFX_SPARKS, 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) update_appearance() + to_chat(user, span_warning("[src]'s lights are now filled with plasma! Be careful to only install them in disabled light fixtures, lest they explode!")) + return FALSE /obj/item/lightreplacer/update_name(updates) . = ..() @@ -190,9 +192,12 @@ return ..() /obj/item/lightreplacer/attack_self(mob/user) + var/on_a_light = FALSE //For if we are on the same tile as a light when we do this for(var/obj/machinery/light/target in user.loc) replace_light(target, user) - to_chat(user, status_string()) + on_a_light = TRUE + if(!on_a_light) //So we dont give a ballon alert when we just used replace_light + user.balloon_alert(user, "[uses] lights, [bulb_shards]/[BULB_SHARDS_REQUIRED] fragments") /** * attempts to fix lights, flood lights & lights on a turf @@ -245,14 +250,14 @@ return // target not in view if(!(target in view(7, get_turf(user)))) - to_chat(user, span_warning("The \'Out of Range\' light on [src] blinks red.")) + user.balloon_alert(user, "out of range!") return //replace lights & stuff do_action(target, user) /obj/item/lightreplacer/proc/status_string() - return "It has [uses] light\s remaining (plus [bulb_shards] fragment\s)." + return "It has [uses] light\s remaining (plus [bulb_shards]/[BULB_SHARDS_REQUIRED] fragment\s)." /obj/item/lightreplacer/proc/Use(mob/user) if(uses <= 0) @@ -290,11 +295,12 @@ return FALSE //If the light source is ok then what are we doing here if(target.status == LIGHT_OK) - to_chat(user, span_warning("There is a working [target.fitting] already inserted!")) + user.balloon_alert(user, "light already installed!") return FALSE //Were all out if(!Use(user)) - to_chat(user, span_warning("\The [src]'s refill light blinks red.")) + //This balloon alert text is a little redundant, but I want to avoid a new player "yeah i know the light is empty" moment + user.balloon_alert(user, "light replacer empty!") return FALSE //remove any broken light on the fixture & add it as a shard @@ -314,7 +320,6 @@ target.update() //clean up qdel(old_light) - to_chat(user, span_notice("You replace \the [target.fitting] with \the [src].")) return TRUE @@ -329,7 +334,7 @@ bluespace_toggle = TRUE /obj/item/lightreplacer/blue/emag_act() - return // balancing against longrange explosions + return FALSE // balancing against longrange explosions #undef GLASS_SHEET_USES #undef LIGHTBULB_COST diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index d8dd432371c56..a2d325dfabd99 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -38,12 +38,13 @@ spamcheck = world.time + 50 speech_args[SPEECH_SPANS] |= voicespan -/obj/item/megaphone/emag_act(mob/user) +/obj/item/megaphone/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return - to_chat(user, span_warning("You overload \the [src]'s voice synthesizer.")) + return FALSE + balloon_alert(user, "voice synthesizer overloaded") obj_flags |= EMAGGED voicespan = list(SPAN_REALLYBIG, "userdanger") + return TRUE /obj/item/megaphone/sec name = "security megaphone" diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index bd900edd3494e..4e8b9f6460ee3 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -30,7 +30,7 @@ custom_premium_price = PAYCHECK_COMMAND * 3 toolspeed = 1 usesound = 'sound/weapons/empty.ogg' - var/obj/machinery/buffer // simple machine buffer for device linkage + var/datum/buffer // simple machine buffer for device linkage var/mode = 0 /obj/item/multitool/examine(mob/user) @@ -41,6 +41,28 @@ user.visible_message(span_suicide("[user] puts the [src] to [user.p_their()] chest. It looks like [user.p_theyre()] trying to pulse [user.p_their()] heart off!")) return OXYLOSS//theres a reason it wasn't recommended by doctors +/** + * Sets the multitool internal object buffer + * + * Arguments: + * * buffer - the new object to assign to the multitool's buffer + */ +/obj/item/multitool/proc/set_buffer(datum/buffer) + if(src.buffer) + UnregisterSignal(src.buffer, COMSIG_QDELETING) + src.buffer = buffer + if(!QDELETED(buffer)) + RegisterSignal(buffer, COMSIG_QDELETING, PROC_REF(on_buffer_del)) + +/** + * Called when the buffer's stored object is deleted + * + * This proc does not clear the buffer of the multitool, it is here to + * handle the deletion of the object the buffer references + */ +/obj/item/multitool/proc/on_buffer_del(datum/source) + SIGNAL_HANDLER + buffer = null // Syndicate device disguised as a multitool; it will turn red when an AI camera is nearby. @@ -84,10 +106,6 @@ /obj/item/multitool/ai_detect/proc/multitool_detect() var/turf/our_turf = get_turf(src) detect_state = PROXIMITY_NONE - for(var/mob/living/silicon/ai/AI as anything in GLOB.ai_list) - if(AI.cameraFollow == src) - detect_state = PROXIMITY_ON_SCREEN - return for(var/mob/camera/ai_eye/AI_eye as anything in GLOB.aiEyes) if(!AI_eye.ai_detector_visible) @@ -107,12 +125,6 @@ if(distance < rangewarning) //ai cant see us but is close detect_state = PROXIMITY_NEAR -/mob/camera/ai_eye/remote/ai_detector - name = "AI detector eye" - ai_detector_visible = FALSE - visible_icon = FALSE - use_static = FALSE - /datum/action/item_action/toggle_multitool name = "Toggle AI detecting mode" check_flags = NONE @@ -128,7 +140,7 @@ /obj/item/multitool/abductor name = "alien multitool" desc = "An omni-technological interface." - icon = 'icons/obj/abductor.dmi' + icon = 'icons/obj/antags/abductor.dmi' icon_state = "multitool" belt_icon_state = "multitool_alien" custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/silver = SHEET_MATERIAL_AMOUNT * 1.25, /datum/material/plasma = SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/titanium = SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT) diff --git a/code/game/objects/items/devices/pipe_painter.dm b/code/game/objects/items/devices/pipe_painter.dm index 546b8cabfaa90..63ae58a0ae388 100644 --- a/code/game/objects/items/devices/pipe_painter.dm +++ b/code/game/objects/items/devices/pipe_painter.dm @@ -1,7 +1,7 @@ /obj/item/pipe_painter name = "pipe painter" desc = "Used for coloring pipes, unsurprisingly." - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "labeler1" inhand_icon_state = null item_flags = NOBLUDGEON diff --git a/code/game/objects/items/devices/polycircuit.dm b/code/game/objects/items/devices/polycircuit.dm index 9dbdbff993d74..5b7fd42d6f6bd 100644 --- a/code/game/objects/items/devices/polycircuit.dm +++ b/code/game/objects/items/devices/polycircuit.dm @@ -51,7 +51,7 @@ else to_chat(user, span_notice("You navigate the sharp edges of circuitry and remove a single board from [src]")) else - H.apply_damage(15, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) + H.apply_damage(15, BRUTE, pick(GLOB.arm_zones)) to_chat(user, span_warning("You give yourself a wicked cut on [src]'s many sharp corners and edges!")) /obj/item/stack/circuit_stack/full diff --git a/code/game/objects/items/devices/portable_chem_mixer.dm b/code/game/objects/items/devices/portable_chem_mixer.dm index e46319366931e..18458f75697ad 100644 --- a/code/game/objects/items/devices/portable_chem_mixer.dm +++ b/code/game/objects/items/devices/portable_chem_mixer.dm @@ -89,7 +89,10 @@ update_appearance() /obj/item/storage/portable_chem_mixer/CtrlClick(mob/living/user) - atom_storage.locked = !atom_storage.locked + if(atom_storage.locked) + atom_storage.locked = STORAGE_NOT_LOCKED + else + atom_storage.locked = STORAGE_FULLY_LOCKED if (!atom_storage.locked) update_contents() if (atom_storage.locked) diff --git a/code/game/objects/items/devices/pressureplates.dm b/code/game/objects/items/devices/pressureplates.dm index 9725b2a2f63db..e8c894d011225 100644 --- a/code/game/objects/items/devices/pressureplates.dm +++ b/code/game/objects/items/devices/pressureplates.dm @@ -2,7 +2,7 @@ name = "pressure plate" desc = "An electronic device that triggers when stepped on." desc_controls = "Ctrl-Click to toggle the pressure plate off and on." - icon = 'icons/obj/puzzle_small.dmi' + icon = 'icons/obj/fluff/puzzle_small.dmi' inhand_icon_state = "flashtool" lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index 1ad33aa3c735d..0e124aafd0169 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -190,45 +190,13 @@ /obj/item/encryptionkey/ai //ported from NT, this goes 'inside' the AI. channels = list(RADIO_CHANNEL_COMMAND = 1, RADIO_CHANNEL_SECURITY = 1, RADIO_CHANNEL_ENGINEERING = 1, RADIO_CHANNEL_SCIENCE = 1, RADIO_CHANNEL_MEDICAL = 1, RADIO_CHANNEL_SUPPLY = 1, RADIO_CHANNEL_SERVICE = 1, RADIO_CHANNEL_AI_PRIVATE = 1) +/obj/item/encryptionkey/ai/evil //ported from NT, this goes 'inside' the AI. + name = "syndicate binary encryption key" + icon_state = "cypherkey_syndicate" + channels = list(RADIO_CHANNEL_SYNDICATE = 1) + syndie = TRUE + greyscale_config = /datum/greyscale_config/encryptionkey_syndicate + greyscale_colors = "#171717#990000" + /obj/item/encryptionkey/secbot channels = list(RADIO_CHANNEL_AI_PRIVATE = 1, RADIO_CHANNEL_SECURITY = 1) - -/obj/item/encryptionkey/moth - name = "\improper Moffic translation key" - desc = "An encryption key that automatically encodes moffic heard through the radio into common. The signal's a little fuzzy." - icon_state = "translation_cypherkey" - translated_language = /datum/language/moffic - greyscale_config = null - greyscale_colors = null - -/obj/item/encryptionkey/tiziran - name = "\improper Tiziran translation key" - desc = "An encryption key that automatically encodes draconic heard through the radio into common. The signal's not quite to scale." - icon_state = "translation_cypherkey" - translated_language = /datum/language/draconic - greyscale_config = null - greyscale_colors = null - -/obj/item/encryptionkey/plasmaman - name = "\improper Calcic translation key" - desc = "An encryption key that automatically encodes calcic heard through the radio into common. The signal lacks a bit of teeth." - icon_state = "translation_cypherkey" - translated_language = /datum/language/calcic - greyscale_config = null - greyscale_colors = null - -/obj/item/encryptionkey/ethereal - name = "\improper Ethereal translation key" - desc = "An encryption key that automatically encodes ethereal heard through the radio into common. The signal's overpowering." - icon_state = "translation_cypherkey" - translated_language = /datum/language/voltaic - greyscale_config = null - greyscale_colors = null - -/obj/item/encryptionkey/felinid - name = "\improper Felinid translation key" - desc = "An encryption key that automatically encodes nekomimetic heard through the radio into common. The signal's rather scratchy." - icon_state = "translation_cypherkey" - translated_language = /datum/language/nekomimetic - greyscale_config = null - greyscale_colors = null diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 0d681b9683243..7455f9567cb5d 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -99,7 +99,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( /// Grants all the languages this headset allows the mob to understand via installed chips. /obj/item/radio/headset/proc/grant_headset_languages(mob/grant_to) for(var/language in language_list) - grant_to.grant_language(language, understood = TRUE, spoken = FALSE, source = LANGUAGE_RADIOKEY) + grant_to.grant_language(language, language_flags = UNDERSTOOD_LANGUAGE, source = LANGUAGE_RADIOKEY) /obj/item/radio/headset/equipped(mob/user, slot, initial) . = ..() @@ -111,7 +111,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( /obj/item/radio/headset/dropped(mob/user, silent) . = ..() for(var/language in language_list) - user.remove_language(language, understood = TRUE, spoken = FALSE, source = LANGUAGE_RADIOKEY) + user.remove_language(language, language_flags = UNDERSTOOD_LANGUAGE, source = LANGUAGE_RADIOKEY) /obj/item/radio/headset/syndicate //disguised to look like a normal headset for stealth ops @@ -133,21 +133,6 @@ GLOBAL_LIST_INIT(channel_tokens, list( name = "team leader headset" command = TRUE -/obj/item/radio/headset/syndicate/alt/psyker - name = "psychic headset" - desc = "A headset designed to boost psychic waves. Protects ears from flashbangs." - icon_state = "psyker_headset" - worn_icon_state = "syndie_headset" - -/obj/item/radio/headset/syndicate/alt/psyker/equipped(mob/living/user, slot) - . = ..() - if(slot_flags & slot) - ADD_CLOTHING_TRAIT(user, TRAIT_ECHOLOCATION_EXTRA_RANGE) - -/obj/item/radio/headset/syndicate/alt/psyker/dropped(mob/user, silent) - . = ..() - REMOVE_CLOTHING_TRAIT(user, TRAIT_ECHOLOCATION_EXTRA_RANGE) - /obj/item/radio/headset/binary keyslot = /obj/item/encryptionkey/binary @@ -356,6 +341,15 @@ GLOBAL_LIST_INIT(channel_tokens, list( keyslot2 = new /obj/item/encryptionkey/ai command = TRUE +/obj/item/radio/headset/silicon/ai/evil + name = "\proper Evil Integrated Subspace Transceiver " + keyslot2 = new /obj/item/encryptionkey/ai/evil + command = FALSE + +/obj/item/radio/headset/silicon/ai/evil/Initialize(mapload) + . = ..() + make_syndie() + /obj/item/radio/headset/screwdriver_act(mob/living/user, obj/item/tool) user.set_machine(src) if(keyslot || keyslot2) @@ -431,7 +425,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( if(istype(mob_loc) && mob_loc.get_item_by_slot(slot_flags) == src) // Remove all the languages we may not be able to know anymore for(var/language in old_language_list) - mob_loc.remove_language(language, understood = TRUE, spoken = FALSE, source = LANGUAGE_RADIOKEY) + mob_loc.remove_language(language, language_flags = UNDERSTOOD_LANGUAGE, source = LANGUAGE_RADIOKEY) // And grant all the languages we definitely should know now grant_headset_languages(mob_loc) diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index dee816618eb69..2456f80c01822 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -1,6 +1,7 @@ /obj/item/radio/intercom name = "station intercom" desc = "Talk through this." + icon = 'icons/obj/machines/wallmounts.dmi' icon_state = "intercom" anchored = TRUE w_class = WEIGHT_CLASS_BULKY @@ -19,7 +20,7 @@ unscrewed = TRUE /obj/item/radio/intercom/prison - name = "prison intercom" + name = "receive-only intercom" desc = "A station intercom. It looks like it has been modified to not broadcast." /obj/item/radio/intercom/prison/Initialize(mapload, ndir, building) @@ -33,6 +34,9 @@ return RegisterSignal(current_area, COMSIG_AREA_POWER_CHANGE, PROC_REF(AreaPowerCheck)) GLOB.intercoms_list += src + if(!unscrewed) + find_and_hang_on_wall(directional = TRUE, \ + custom_drop_callback = CALLBACK(src, PROC_REF(knock_down))) /obj/item/radio/intercom/Destroy() . = ..() @@ -78,8 +82,7 @@ if(tool.use_tool(src, user, 80)) user.visible_message(span_notice("[user] unsecures [src]!"), span_notice("You detach [src] from the wall.")) playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) - new/obj/item/wallframe/intercom(get_turf(src)) - qdel(src) + knock_down() /** * Override attack_tk_grab instead of attack_tk because we actually want attack_tk's @@ -129,6 +132,8 @@ AreaPowerCheck() // Make sure the area/local APC is powered first before we actually turn back on. /obj/item/radio/intercom/emag_act(mob/user, obj/item/card/emag/emag_card) + . = ..() + if(obj_flags & EMAGGED) return @@ -139,18 +144,18 @@ playsound(src, SFX_SPARKS, 75, TRUE, SILENCED_SOUND_EXTRARANGE) freqlock = RADIO_FREQENCY_UNLOCKED obj_flags |= EMAGGED + return TRUE // A fully locked one will do nothing, as locked is intended to be used for stuff that should never be changed if(RADIO_FREQENCY_LOCKED) balloon_alert(user, "can't override frequency lock!") playsound(src, 'sound/machines/buzz-two.ogg', 50, FALSE, SILENCED_SOUND_EXTRARANGE) + return // Emagging an unlocked one will do nothing, for now else return - return ..() - /obj/item/radio/intercom/update_icon_state() icon_state = on ? initial(icon_state) : "intercom-p" return ..() @@ -171,10 +176,18 @@ set_on(current_area.powered(AREA_USAGE_EQUIP)) // set "on" to the equipment power status of our area. update_appearance() +/** + * Called by the wall mount component and reused during the tool deconstruction proc. + */ +/obj/item/radio/intercom/proc/knock_down() + new/obj/item/wallframe/intercom(get_turf(src)) + qdel(src) + //Created through the autolathe or through deconstructing intercoms. Can be applied to wall to make a new intercom on it! /obj/item/wallframe/intercom name = "intercom frame" desc = "A ready-to-go intercom. Just slap it on a wall and screw it in!" + icon = 'icons/obj/machines/wallmounts.dmi' icon_state = "intercom" result_path = /obj/item/radio/intercom/unscrewed pixel_shift = 26 @@ -196,6 +209,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom, 26) /obj/item/radio/intercom/command name = "command intercom" desc = "The command team's special extended-frequency intercom. Mostly just used for eavesdropping, gossiping about subordinates, and complaining about the higher-ups." + icon = 'icons/obj/machines/wallmounts.dmi' icon_state = "intercom_command" freerange = TRUE diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 00296d5c53bc5..aeb599de32030 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -91,7 +91,7 @@ VAR_PRIVATE/should_update_icon = FALSE /obj/item/radio/Initialize(mapload) - wires = new /datum/wires/radio(src) + set_wires(new /datum/wires/radio(src)) secure_radio_connections = list() . = ..() @@ -112,6 +112,13 @@ AddElement(/datum/element/empprotection, EMP_PROTECT_WIRES) + // No subtypes + if(type != /obj/item/radio) + return + AddComponent(/datum/component/slapcrafting,\ + slapcraft_recipes = list(/datum/crafting_recipe/improv_explosive)\ + ) + /obj/item/radio/Destroy() remove_radio_all(src) //Just to be sure QDEL_NULL(wires) @@ -303,11 +310,8 @@ channel = null // Nearby active jammers prevent the message from transmitting - var/turf/position = get_turf(src) - 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) && !syndie) - return + if(is_within_radio_jammer_range(src) && !syndie) + return // Determine the identity information which will be attached to the signal. var/atom/movable/virtualspeaker/speaker = new(null, talking_movable, src) @@ -342,7 +346,7 @@ // Okay, the signal was never processed, send a mundane broadcast. signal.data["compression"] = 0 signal.transmission_method = TRANSMISSION_RADIO - signal.levels = list(T.z) + signal.levels = SSmapping.get_connected_levels(T) signal.broadcast() /obj/item/radio/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range) diff --git a/code/game/objects/items/devices/scanners/autopsy_scanner.dm b/code/game/objects/items/devices/scanners/autopsy_scanner.dm index 161a45510b8d0..2f938c92e4529 100644 --- a/code/game/objects/items/devices/scanners/autopsy_scanner.dm +++ b/code/game/objects/items/devices/scanners/autopsy_scanner.dm @@ -1,6 +1,6 @@ /obj/item/autopsy_scanner name = "autopsy scanner" - desc = "Used in surgery to extract information from a cadaver." + desc = "Used in surgery to extract information from a cadaver. Can also scan the health of cadavers like an advanced health analyzer!" icon = 'icons/obj/device.dmi' icon_state = "autopsy_scanner" inhand_icon_state = "autopsy_scanner" @@ -13,13 +13,38 @@ custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*2) custom_price = PAYCHECK_COMMAND +/obj/item/autopsy_scanner/attack(mob/living/M, mob/living/carbon/human/user) + if(!user.can_read(src) || user.is_blind()) + return + + if(M.stat != DEAD && !HAS_TRAIT(M, TRAIT_FAKEDEATH)) // good job, you found a loophole + to_chat(user, span_deadsay("[icon2html(src, user)] ERROR! CANNOT SCAN LIVE CADAVERS. PROCURE HEALTH ANALYZER OR TERMINATE PATIENT.")) + return + + // Clumsiness/brain damage check + if ((HAS_TRAIT(user, TRAIT_CLUMSY) || HAS_TRAIT(user, TRAIT_DUMB)) && prob(50)) + user.visible_message(span_warning("[user] analyzes the floor's vitals!"), \ + span_notice("You stupidly try to analyze the floor's vitals!")) + to_chat(user, "[span_info("Analyzing results for The floor:\n\tOverall status: Healthy")]\ + \n[span_info("Key: Suffocation/Toxin/Burn/Brute")]\ + \n[span_info("\tDamage specifics: 0-0-0-0")]\ + \n[span_info("Body temperature: ???")]") + return + + user.visible_message(span_notice("[user] scans [M]'s cadaver.")) + to_chat(user, span_deadsay("[icon2html(src, user)] ANALYZING CADAVER.")) + + healthscan(user, M, advanced = TRUE) + + add_fingerprint(user) + /obj/item/autopsy_scanner/proc/scan_cadaver(mob/living/carbon/human/user, mob/living/carbon/scanned) if(scanned.stat != DEAD) return var/list/autopsy_information = list() autopsy_information += "[scanned.name] - Species: [scanned.dna.species.name]" - autopsy_information += "Time of Death - [scanned.tod]" + autopsy_information += "Time of Death - [scanned.station_timestamp_timeofdeath]" autopsy_information += "Time of Autopsy - [station_time_timestamp()]" autopsy_information += "Autopsy Coroner - [user.name]" @@ -66,8 +91,8 @@ if(blood_id != /datum/reagent/blood) var/datum/reagent/reagents = GLOB.chemical_reagents_list[blood_id] blood_type = reagents ? reagents.name : blood_id - autopsy_information += "Blood Type: [blood_type]
" - autopsy_information += "Blood Volume: [scanned.blood_volume] cl ([blood_percent]) %
" + autopsy_information += "Blood Type: [blood_type]
" + autopsy_information += "Blood Volume: [scanned.blood_volume] cl ([blood_percent]%)
" for(var/datum/disease/diseases as anything in scanned.diseases) autopsy_information += "Name: [diseases.name] | Type: [diseases.spread_text]
" diff --git a/code/game/objects/items/devices/scanners/gas_analyzer.dm b/code/game/objects/items/devices/scanners/gas_analyzer.dm index 75ecbf8fe28c6..a86d766458e2e 100644 --- a/code/game/objects/items/devices/scanners/gas_analyzer.dm +++ b/code/game/objects/items/devices/scanners/gas_analyzer.dm @@ -26,6 +26,15 @@ . = ..() RegisterSignal(src, COMSIG_TOOL_ATOM_ACTED_PRIMARY(tool_behaviour), PROC_REF(on_analyze)) + if(type != /obj/item/analyzer) + return + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/material_sniffer) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/analyzer/equipped(mob/user, slot, initial) . = ..() ADD_TRAIT(user, TRAIT_DETECT_STORM, CLOTHING_TRAIT) diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm index 54813889749c6..e397cc4fbb82e 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -4,6 +4,8 @@ #define SCANMODE_COUNT 2 // Update this to be the number of scan modes if you add more #define SCANNER_CONDENSED 0 #define SCANNER_VERBOSE 1 +// Not updating above count because you're not meant to switch to this mode. +#define SCANNER_NO_MODE -1 /obj/item/healthanalyzer name = "health analyzer" @@ -26,6 +28,8 @@ var/scanmode = SCANMODE_HEALTH var/advanced = FALSE custom_price = PAYCHECK_COMMAND + /// If this analyzer will give a bonus to wound treatments apon woundscan. + var/give_wound_treatment_bonus = FALSE /obj/item/healthanalyzer/Initialize(mapload) . = ..() @@ -72,6 +76,7 @@ user.visible_message(span_notice("[user] analyzes [M]'s vitals.")) balloon_alert(user, "analyzing vitals") + playsound(user.loc, 'sound/items/healthanalyzer.ogg', 50) switch (scanmode) if (SCANMODE_HEALTH) @@ -191,9 +196,9 @@ trauma_text += trauma_desc render_list += "Cerebral traumas detected: subject appears to be suffering from [english_list(trauma_text)].\n" if(carbontarget.quirks.len) - render_list += "Subject Major Disabilities: [carbontarget.get_quirk_string(FALSE, CAT_QUIRK_MAJOR_DISABILITY)].\n" + render_list += "Subject Major Disabilities: [carbontarget.get_quirk_string(FALSE, CAT_QUIRK_MAJOR_DISABILITY, from_scan = TRUE)].\n" if(advanced) - render_list += "Subject Minor Disabilities: [carbontarget.get_quirk_string(FALSE, CAT_QUIRK_MINOR_DISABILITY)].\n" + render_list += "Subject Minor Disabilities: [carbontarget.get_quirk_string(FALSE, CAT_QUIRK_MINOR_DISABILITY, TRUE)].\n" if (HAS_TRAIT(target, TRAIT_IRRADIATED)) render_list += "Subject is irradiated. Supply toxin healing.\n" @@ -277,19 +282,18 @@ [advanced ? "" : ""]\ " - var/datum/species/the_dudes_species = humantarget.dna.species var/missing_organs = list() if(!humantarget.get_organ_slot(ORGAN_SLOT_BRAIN)) missing_organs += "brain" - if(!HAS_TRAIT(humantarget, TRAIT_NOBLOOD) && !humantarget.get_organ_slot(ORGAN_SLOT_HEART)) + if(!HAS_TRAIT_FROM(humantarget, TRAIT_NOBLOOD, SPECIES_TRAIT) && !humantarget.get_organ_slot(ORGAN_SLOT_HEART)) missing_organs += "heart" - if(!(TRAIT_NOBREATH in the_dudes_species.inherent_traits) && !humantarget.get_organ_slot(ORGAN_SLOT_LUNGS)) + if(!HAS_TRAIT_FROM(humantarget, TRAIT_NOBREATH, SPECIES_TRAIT) && !humantarget.get_organ_slot(ORGAN_SLOT_LUNGS)) missing_organs += "lungs" - if(!(TRAIT_NOMETABOLISM in the_dudes_species.inherent_traits) && !humantarget.get_organ_slot(ORGAN_SLOT_LIVER)) + if(!HAS_TRAIT_FROM(humantarget, TRAIT_LIVERLESS_METABOLISM, SPECIES_TRAIT) && !humantarget.get_organ_slot(ORGAN_SLOT_LIVER)) missing_organs += "liver" - if(the_dudes_species.mutantstomach && !humantarget.get_organ_slot(ORGAN_SLOT_STOMACH)) + if(!HAS_TRAIT_FROM(humantarget, TRAIT_NOHUNGER, SPECIES_TRAIT) && !humantarget.get_organ_slot(ORGAN_SLOT_STOMACH)) missing_organs += "stomach" - if(the_dudes_species.mutanttongue && !humantarget.get_organ_slot(ORGAN_SLOT_TONGUE)) + if(!humantarget.get_organ_slot(ORGAN_SLOT_TONGUE)) missing_organs += "tongue" if(!humantarget.get_organ_slot(ORGAN_SLOT_EARS)) missing_organs += "ears" @@ -342,8 +346,8 @@ render_list += "[body_temperature_message]\n" // Time of death - if(target.tod && (target.stat == DEAD || ((HAS_TRAIT(target, TRAIT_FAKEDEATH)) && !advanced))) - render_list += "Time of Death: [target.tod]\n" + if(target.station_timestamp_timeofdeath && (target.stat == DEAD || ((HAS_TRAIT(target, TRAIT_FAKEDEATH)) && !advanced))) + render_list += "Time of Death: [target.station_timestamp_timeofdeath]\n" var/tdelta = round(world.time - target.timeofdeath) render_list += "Subject died [DisplayTimeText(tdelta)] ago.\n" @@ -360,11 +364,10 @@ render_list += "" //Diseases - for(var/thing in target.diseases) - var/datum/disease/D = thing - if(!(D.visibility_flags & HIDDEN_SCANNER)) - render_list += "Warning: [D.form] detected\n\ -
Name: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]
\ + for(var/datum/disease/disease as anything in target.diseases) + if(!(disease.visibility_flags & HIDDEN_SCANNER)) + render_list += "Warning: [disease.form] detected\n\ +
Name: [disease.name].\nType: [disease.spread_text].\nStage: [disease.stage]/[disease.max_stages].\nPossible Cure: [disease.cure_text]
\
" // divs do not need extra linebreak // Blood Level @@ -390,9 +393,9 @@ if(iscarbon(target)) var/mob/living/carbon/carbontarget = target var/cyberimp_detect - for(var/obj/item/organ/internal/cyberimp/CI in carbontarget.organs) - if(CI.status == ORGAN_ROBOTIC && !(CI.organ_flags & ORGAN_HIDDEN)) - cyberimp_detect += "[!cyberimp_detect ? "[CI.get_examine_string(user)]" : ", [CI.get_examine_string(user)]"]" + for(var/obj/item/organ/internal/cyberimp/cyberimp in carbontarget.organs) + if(IS_ROBOTIC_ORGAN(cyberimp) && !(cyberimp.organ_flags & ORGAN_HIDDEN)) + cyberimp_detect += "[!cyberimp_detect ? "[cyberimp.get_examine_string(user)]" : ", [cyberimp.get_examine_string(user)]"]" if(cyberimp_detect) render_list += "Detected cybernetic modifications:\n" render_list += "[cyberimp_detect]\n" @@ -474,6 +477,9 @@ if(!user.can_perform_action(src, NEED_LITERACY|NEED_LIGHT) || user.is_blind()) return + if(mode == SCANNER_NO_MODE) + return + mode = !mode to_chat(user, mode == SCANNER_VERBOSE ? "The scanner now shows specific limb damage." : "The scanner no longer shows limb damage.") @@ -483,57 +489,90 @@ desc = "A hand-held body scanner able to distinguish vital signs of the subject with high accuracy." advanced = TRUE +#define AID_EMOTION_NEUTRAL "neutral" +#define AID_EMOTION_HAPPY "happy" +#define AID_EMOTION_WARN "cautious" +#define AID_EMOTION_ANGRY "angery" +#define AID_EMOTION_SAD "sad" + /// Displays wounds with extended information on their status vs medscanners -/proc/woundscan(mob/user, mob/living/carbon/patient, obj/item/healthanalyzer/wound/scanner) +/proc/woundscan(mob/user, mob/living/carbon/patient, obj/item/healthanalyzer/scanner, simple_scan = FALSE) if(!istype(patient) || user.incapacitated()) return var/render_list = "" - for(var/i in patient.get_wounded_bodyparts()) - var/obj/item/bodypart/wounded_part = i + var/advised = FALSE + for(var/limb in patient.get_wounded_bodyparts()) + var/obj/item/bodypart/wounded_part = limb render_list += "Warning: Physical trauma[LAZYLEN(wounded_part.wounds) > 1? "s" : ""] detected in [wounded_part.name]" - for(var/k in wounded_part.wounds) - var/datum/wound/W = k - render_list += "
[W.get_scanner_description()]
\n" + for(var/limb_wound in wounded_part.wounds) + var/datum/wound/current_wound = limb_wound + render_list += "
[simple_scan ? current_wound.get_simple_scanner_description() : current_wound.get_scanner_description()]
\n" + if (scanner.give_wound_treatment_bonus) + ADD_TRAIT(current_wound, TRAIT_WOUND_SCANNED, ANALYZER_TRAIT) + if(!advised) + to_chat(user, span_notice("You notice how bright holo-images appear over your [(length(wounded_part.wounds) || length(patient.get_wounded_bodyparts()) ) > 1 ? "various wounds" : "wound"]. They seem to be filled with helpful information, this should make treatment easier!")) + advised = TRUE render_list += "
" if(render_list == "") - if(istype(scanner)) + if(simple_scan) + var/obj/item/healthanalyzer/simple/simple_scanner = scanner // Only emit the cheerful scanner message if this scan came from a scanner - playsound(scanner, 'sound/machines/ping.ogg', 50, FALSE) - to_chat(user, span_notice("\The [scanner] makes a happy ping and briefly displays a smiley face with several exclamation points! It's really excited to report that [patient] has no wounds!")) - else - to_chat(user, "No wounds detected in subject.") + playsound(simple_scanner, 'sound/machines/ping.ogg', 50, FALSE) + to_chat(user, span_notice("\The [simple_scanner] makes a happy ping and briefly displays a smiley face with several exclamation points! It's really excited to report that [patient] has no wounds!")) + simple_scanner.show_emotion(AID_EMOTION_HAPPY) + to_chat(user, "No wounds detected in subject.") else to_chat(user, examine_block(jointext(render_list, "")), type = MESSAGE_TYPE_INFO) - -/obj/item/healthanalyzer/wound - name = "first aid analyzer" - icon_state = "adv_spectrometer" - desc = "A prototype MeLo-Tech medical scanner used to diagnose injuries and recommend treatment for serious wounds, but offers no further insight into the patient's health. You hope the final version is less annoying to read!" + if(simple_scan) + var/obj/item/healthanalyzer/simple/simple_scanner = scanner + simple_scanner.show_emotion(AID_EMOTION_WARN) + playsound(simple_scanner, 'sound/machines/twobeep.ogg', 50, FALSE) + + +/obj/item/healthanalyzer/simple + name = "wound analyzer" + icon_state = "first_aid" + desc = "A helpful, child-proofed, and most importantly, extremely cheap MeLo-Tech medical scanner used to diagnose injuries and recommend treatment for serious wounds. While it might not sound very informative for it to be able to tell you if you have a gaping hole in your body or not, it applies a temporary holoimage near the wound with information that is guaranteed to double the efficacy and speed of treatment." + mode = SCANNER_NO_MODE + // Cooldown for when the analyzer will allow you to ask it for encouragement. Don't get greedy! var/next_encouragement - var/greedy - -/obj/item/healthanalyzer/wound/attack_self(mob/user) + // The analyzer's current emotion. Affects the sprite overlays and if it's going to prick you for being greedy or not. + var/emotion = AID_EMOTION_NEUTRAL + // Encouragements to play when attack_selfing + var/list/encouragements = list("briefly displays a happy face, gazing emptily at you", "briefly displays a spinning cartoon heart", "displays an encouraging message about eating healthy and exercising", \ + "reminds you that everyone is doing their best", "displays a message wishing you well", "displays a sincere thank-you for your interest in first-aid", "formally absolves you of all your sins") + // How often one can ask for encouragement + var/patience = 10 SECONDS + give_wound_treatment_bonus = TRUE + +/obj/item/healthanalyzer/simple/attack_self(mob/user) if(next_encouragement < world.time) playsound(src, 'sound/machines/ping.ogg', 50, FALSE) - var/list/encouragements = list("briefly displays a happy face, gazing emptily at you", "briefly displays a spinning cartoon heart", "displays an encouraging message about eating healthy and exercising", \ - "reminds you that everyone is doing their best", "displays a message wishing you well", "displays a sincere thank-you for your interest in first-aid", "formally absolves you of all your sins") to_chat(user, span_notice("\The [src] makes a happy ping and [pick(encouragements)]!")) next_encouragement = world.time + 10 SECONDS - greedy = FALSE - else if(!greedy) - to_chat(user, span_warning("\The [src] displays an eerily high-definition frowny face, chastizing you for asking it for too much encouragement.")) - greedy = TRUE + show_emotion(AID_EMOTION_HAPPY) + else if(emotion != AID_EMOTION_ANGRY) + greed_warning(user) else - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) - if(isliving(user)) - var/mob/living/L = user - to_chat(L, span_warning("\The [src] makes a disappointed buzz and pricks your finger for being greedy. Ow!")) - L.adjustBruteLoss(4) - L.dropItemToGround(src) - -/obj/item/healthanalyzer/wound/attack(mob/living/carbon/patient, mob/living/carbon/human/user) + violence(user) + +/obj/item/healthanalyzer/simple/proc/greed_warning(mob/user) + to_chat(user, span_warning("\The [src] displays an eerily high-definition frowny face, chastizing you for asking it for too much encouragement.")) + show_emotion(AID_EMOTION_ANGRY) + +/obj/item/healthanalyzer/simple/proc/violence(mob/user) + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) + if(isliving(user)) + var/mob/living/L = user + to_chat(L, span_warning("\The [src] makes a disappointed buzz and pricks your finger for being greedy. Ow!")) + flick(icon_state + "_pinprick", src) + L.adjustBruteLoss(4) + L.dropItemToGround(src) + show_emotion(AID_EMOTION_HAPPY) + +/obj/item/healthanalyzer/simple/attack(mob/living/carbon/patient, mob/living/carbon/human/user) if(!user.can_read(src) || user.is_blind()) return @@ -542,43 +581,67 @@ if(!istype(patient)) playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) - to_chat(user, span_notice("\The [src] makes a sad buzz and briefly displays a frowny face, indicating it can't scan [patient].")) + to_chat(user, span_notice("\The [src] makes a sad buzz and briefly displays an unhappy face, indicating it can't scan [patient].")) + show_emotion(AI_EMOTION_SAD) return - woundscan(user, patient, src) + woundscan(user, patient, src, simple_scan = TRUE) + flick(icon_state + "_pinprick", src) -/obj/item/healthanalyzer/disease +/obj/item/healthanalyzer/simple/update_overlays() + . = ..() + switch(emotion) + if(AID_EMOTION_HAPPY) + . += mutable_appearance(icon, "+no_wounds") + if(AID_EMOTION_WARN) + . += mutable_appearance(icon, "+wound_warn") + if(AID_EMOTION_ANGRY) + . += mutable_appearance(icon, "+angry") + if(AID_EMOTION_SAD) + . += mutable_appearance(icon, "+fail_scan") + +/// Sets a new emotion display on the scanner, and resets back to neutral in a moment +/obj/item/healthanalyzer/simple/proc/show_emotion(new_emotion) + emotion = new_emotion + update_appearance(UPDATE_OVERLAYS) + if (emotion != AID_EMOTION_NEUTRAL) + addtimer(CALLBACK(src, PROC_REF(reset_emotions), AID_EMOTION_NEUTRAL), 2 SECONDS) + +// Resets visible emotion back to neutral +/obj/item/healthanalyzer/simple/proc/reset_emotions() + emotion = AID_EMOTION_NEUTRAL + update_appearance(UPDATE_OVERLAYS) + +/obj/item/healthanalyzer/simple/miner + name = "mining wound analyzer" + icon_state = "miner_aid" + desc = "A helpful, child-proofed, and most importantly, extremely cheap MeLo-Tech medical scanner used to diagnose injuries and recommend treatment for serious wounds. While it might not sound very informative for it to be able to tell you if you have a gaping hole in your body or not, it applies a temporary holoimage near the wound with information that is guaranteed to double the efficacy and speed of treatment. This one has a cool aesthetic antenna that doesn't actually do anything!" + +/obj/item/healthanalyzer/simple/disease name = "disease state analyzer" - icon_state = "adv_spectrometer" - desc = "A disease status analyzer to determine the state of an infection to encourage responsible medication consumption." - - -/proc/diseasescan(mob/user, mob/living/carbon/patient, obj/item/healthanalyzer/wound/scanner) - if(!istype(patient) || user.incapacitated()) - return - - var/render_list = "" - for(var/thing in patient.diseases) - var/datum/disease/D = thing - if(!(D.visibility_flags & HIDDEN_SCANNER)) - render_list += "Warning: [D.form] detected\n\ -
Name: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]
\ -
" - - if(render_list == "") - // Only emit the cheerful scanner message if this scan came from a scanner - playsound(scanner, 'sound/machines/ping.ogg', 50, FALSE) - to_chat(user, span_notice("The patient has no diseases.")) - else - to_chat(user, examine_block(jointext(render_list, "")), type = MESSAGE_TYPE_INFO) - -/obj/item/healthanalyzer/disease/attack_self(mob/user) - playsound(src, 'sound/machines/ping.ogg', 50, FALSE) - var/list/encouragements = list("encourages you to take your medication", "briefly displays a spinning cartoon heart", "reasures you about your condition", \ + desc = "Another of MeLo-Tech's dubiously useful medsci scanners, the disease analyzer is a pretty rare find these days - NT found out that giving their hospitals the lowest-common-denominator pandemic equipment resulted in too much financial loss of life to be profitable. There's rumours that the inbuilt AI is jealous of the first aid analyzer's success." + icon_state = "disease_aid" + mode = SCANNER_NO_MODE + encouragements = list("encourages you to take your medication", "briefly displays a spinning cartoon heart", "reasures you about your condition", \ "reminds you that everyone is doing their best", "displays a message wishing you well", "displays a message saying how proud it is that you're taking care of yourself", "formally absolves you of all your sins") - to_chat(user, span_notice("\The [src] makes a happy ping and [pick(encouragements)]!")) - -/obj/item/healthanalyzer/disease/attack(mob/living/carbon/patient, mob/living/carbon/human/user) + patience = 20 SECONDS + +/obj/item/healthanalyzer/simple/disease/greed_warning(mob/user) + to_chat(user, span_warning("\The [src] displays an eerily high-definition frowny face, chastizing you for asking it for too much encouragement.")) + show_emotion(AID_EMOTION_ANGRY) + +/obj/item/healthanalyzer/simple/disease/violence(mob/user) + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) + if(isliving(user)) + var/mob/living/L = user + to_chat(L, span_warning("\The [src] makes a disappointed buzz and pricks your finger for being greedy. Ow!")) + flick(icon_state + "_pinprick", src) + L.adjustBruteLoss(1) + L.reagents.add_reagent(/datum/reagent/toxin, rand(1, 3)) + L.dropItemToGround(src) + show_emotion(AID_EMOTION_ANGRY) + +/obj/item/healthanalyzer/simple/disease/attack(mob/living/carbon/patient, mob/living/carbon/human/user) if(!user.can_read(src) || user.is_blind()) return @@ -588,12 +651,58 @@ if(!istype(user)) playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) to_chat(user, span_notice("\The [src] makes a sad buzz and briefly displays a frowny face, indicating it can't scan [patient].")) + emotion = AID_EMOTION_SAD + update_appearance(UPDATE_OVERLAYS) + return + + diseasescan(user, patient, src) // this updates emotion + update_appearance(UPDATE_OVERLAYS) + flick(icon_state + "_pinprick", src) + +/obj/item/healthanalyzer/simple/disease/update_overlays() + . = ..() + switch(emotion) + if(AID_EMOTION_HAPPY) + . += mutable_appearance(icon, "+not_infected") + if(AID_EMOTION_WARN) + . += mutable_appearance(icon, "+infected") + if(AID_EMOTION_ANGRY) + . += mutable_appearance(icon, "+rancurous") + if(AID_EMOTION_SAD) + . += mutable_appearance(icon, "+unknown_scan") + if(emotion != AID_EMOTION_NEUTRAL) + addtimer(CALLBACK(src, PROC_REF(reset_emotions)), 4 SECONDS) // longer on purpose + +//Checks the individual for any diseases that are visible to the scanner, and displays the diseases in the attacked to the attacker. +/proc/diseasescan(mob/user, mob/living/carbon/patient, obj/item/healthanalyzer/simple/scanner) + if(!istype(patient) || user.incapacitated()) return - diseasescan(user, patient, src) + var/list/render = list() + for(var/datum/disease/disease as anything in patient.diseases) + if(!(disease.visibility_flags & HIDDEN_SCANNER)) + render += "Warning: [disease.form] detected\n\ +
Name: [disease.name].\nType: [disease.spread_text].\nStage: [disease.stage]/[disease.max_stages].\nPossible Cure: [disease.cure_text]
\ +
" + + if(!length(render)) + playsound(scanner, 'sound/machines/ping.ogg', 50, FALSE) + to_chat(user, span_notice("\The [scanner] makes a happy ping and briefly displays a smiley face with several exclamation points! It's really excited to report that [patient] has no diseases!")) + scanner.emotion = AID_EMOTION_HAPPY + else + to_chat(user, span_notice(render.Join(""))) + scanner.emotion = AID_EMOTION_WARN + playsound(scanner, 'sound/machines/twobeep.ogg', 50, FALSE) #undef SCANMODE_HEALTH #undef SCANMODE_WOUND #undef SCANMODE_COUNT #undef SCANNER_CONDENSED #undef SCANNER_VERBOSE +#undef SCANNER_NO_MODE + +#undef AID_EMOTION_NEUTRAL +#undef AID_EMOTION_HAPPY +#undef AID_EMOTION_WARN +#undef AID_EMOTION_ANGRY +#undef AID_EMOTION_SAD diff --git a/code/game/objects/items/devices/scanners/sequence_scanner.dm b/code/game/objects/items/devices/scanners/sequence_scanner.dm index 7c42aa3c3b130..ee2742c55d73b 100644 --- a/code/game/objects/items/devices/scanners/sequence_scanner.dm +++ b/code/game/objects/items/devices/scanners/sequence_scanner.dm @@ -20,6 +20,14 @@ var/list/buffer var/ready = TRUE var/cooldown = 200 + /// genetic makeup data that's scanned + var/list/genetic_makeup_buffer = list() + +/obj/item/sequence_scanner/examine(mob/user) + . = ..() + . += span_notice("Use primary attack to scan mutations, Secondary attack to scan genetic makeup") + if(LAZYLEN(genetic_makeup_buffer) > 0) + . += span_notice("It has the genetic makeup of \"[genetic_makeup_buffer["name"]]\" stored inside its buffer") /obj/item/sequence_scanner/attack(mob/living/target, mob/living/carbon/human/user) add_fingerprint(user) @@ -27,10 +35,36 @@ if (!HAS_TRAIT(target, TRAIT_GENELESS) && !HAS_TRAIT(target, TRAIT_BADDNA)) user.visible_message(span_notice("[user] analyzes [target]'s genetic sequence.")) balloon_alert(user, "sequence analyzed") + playsound(user.loc, 'sound/items/healthanalyzer.ogg', 50) // close enough gene_scan(target, user) else user.visible_message(span_notice("[user] fails to analyze [target]'s genetic sequence."), span_warning("[target] has no readable genetic sequence!")) +/obj/item/sequence_scanner/attack_secondary(mob/living/target, mob/living/carbon/human/user, max_interact_count = 1) + add_fingerprint(user) + //no scanning if its a husk, DNA-less Species or DNA that isn't able to be copied by a changeling/disease + if (!HAS_TRAIT(target, TRAIT_GENELESS) && !HAS_TRAIT(target, TRAIT_BADDNA) && !HAS_TRAIT(target, TRAIT_NO_DNA_COPY)) + user.visible_message(span_warning("[user] is scanning [target]'s genetic makeup.")) + if(!do_after(user, 3 SECONDS)) + balloon_alert(user, "scan failed!") + user.visible_message(span_warning("[user] fails to scan [target]'s genetic makeup.")) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + makeup_scan(target, user) + balloon_alert(user, "makeup scanned") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + else + user.visible_message(span_notice("[user] fails to analyze [target]'s genetic makeup."), span_warning("[target] has no readable genetic makeup!")) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/item/sequence_scanner/afterattack_secondary(obj/object, mob/user, proximity) + . = ..() + if(!istype(object) || !proximity) + return + if(istype(object, /obj/machinery/computer/scan_consolenew)) + var/obj/machinery/computer/scan_consolenew/console = object + var/buffer_index = tgui_input_number(user, "Slot:", "Which slot to export:", 1, LAZYLEN(console.genetic_makeup_buffer), 1) + console.genetic_makeup_buffer[buffer_index] = genetic_makeup_buffer + /obj/item/sequence_scanner/attack_self(mob/user) display_sequence(user) @@ -50,6 +84,7 @@ else to_chat(user,span_warning("No database to update from.")) +///proc for scanning someone's mutations /obj/item/sequence_scanner/proc/gene_scan(mob/living/carbon/target, mob/living/user) if(!iscarbon(target) || !target.has_dna()) return @@ -70,6 +105,19 @@ else to_chat(user, span_notice("[get_display_name(mutation)]")) +///proc for scanning someone's genetic makeup +/obj/item/sequence_scanner/proc/makeup_scan(mob/living/carbon/target, mob/living/user) + if(!iscarbon(target) || !target.has_dna()) + return + + genetic_makeup_buffer = list( + "label"="Analyzer Slot:[target.real_name]", + "UI"=target.dna.unique_identity, + "UE"=target.dna.unique_enzymes, + "UF"=target.dna.unique_features, + "name"=target.real_name, + "blood_type"=target.dna.blood_type) + /obj/item/sequence_scanner/proc/display_sequence(mob/living/user) if(!LAZYLEN(buffer) || !ready) return diff --git a/code/game/objects/items/devices/scanners/slime_scanner.dm b/code/game/objects/items/devices/scanners/slime_scanner.dm index 340c5f05c3d32..430796e02ca23 100644 --- a/code/game/objects/items/devices/scanners/slime_scanner.dm +++ b/code/game/objects/items/devices/scanners/slime_scanner.dm @@ -2,7 +2,7 @@ name = "slime scanner" desc = "A device that analyzes a slime's internal composition and measures its stats." icon = 'icons/obj/device.dmi' - icon_state = "adv_spectrometer" + icon_state = "slime_scanner" inhand_icon_state = "analyzer" lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' diff --git a/code/game/objects/items/devices/table_clock.dm b/code/game/objects/items/devices/table_clock.dm index 678ba436084a6..37c1098759e98 100644 --- a/code/game/objects/items/devices/table_clock.dm +++ b/code/game/objects/items/devices/table_clock.dm @@ -4,6 +4,7 @@ /obj/item/table_clock name = "table clock" desc = "An annoying clock that keeps you sane through tireless nights." + icon = 'icons/obj/fluff/general.dmi' icon_state = "table_clock" inhand_icon_state = "table_clock" base_icon_state = "table_clock" diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index d0176835931e4..0e905f4a8ee8f 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -274,6 +274,12 @@ effective or pretty fucking useless. animate(user,alpha = clamp(255 - charge,0,255),time = 10) +/// Checks if a given atom is in range of a radio jammer, returns TRUE if it is. +/proc/is_within_radio_jammer_range(atom/source) + for(var/obj/item/jammer/jammer as anything in GLOB.active_jammers) + if(IN_GIVEN_RANGE(source, jammer, jammer.range)) + return TRUE + return FALSE /obj/item/jammer name = "radio jammer" diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 7dee7378e6f17..496eec5659cb1 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -6,6 +6,8 @@ inhand_icon_state = "ttv" lefthand_file = 'icons/mob/inhands/weapons/bombs_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/bombs_righthand.dmi' + worn_icon = 'icons/mob/clothing/back/backpack.dmi' + worn_icon_state = "ttv" desc = "Regulates the transfer of air between two tanks." w_class = WEIGHT_CLASS_BULKY @@ -15,6 +17,10 @@ var/mob/attacher = null var/valve_open = FALSE var/toggle = TRUE + ///do we have cables attached to be able to be put on the back? + var/wired = FALSE + ///our overlay when wired = true + var/mutable_appearance/cable_overlay /obj/item/transfer_valve/Initialize(mapload) . = ..() @@ -27,16 +33,14 @@ /obj/item/transfer_valve/IsAssemblyHolder() return TRUE -/obj/item/transfer_valve/handle_atom_del(atom/deleted_atom) +/obj/item/transfer_valve/Exited(atom/movable/gone, direction) . = ..() - if(deleted_atom == tank_one) + if(gone == tank_one) tank_one = null update_appearance() - return - if(deleted_atom == tank_two) + else if(gone == tank_two) tank_two = null update_appearance() - return /obj/item/transfer_valve/attackby(obj/item/item, mob/user, params) if(istype(item, /obj/item/tank)) @@ -74,6 +78,27 @@ A.toggle_secure() //this calls update_icon(), which calls update_icon() on the holder (i.e. the bomb). log_bomber(user, "attached a [item.name] to a ttv -", src, null, FALSE) attacher = user + + else if(istype(item, /obj/item/stack/cable_coil) && !wired) + var/obj/item/stack/cable_coil/coil = item + if (coil.get_amount() < 15) + to_chat(user, span_warning("You need fifteen lengths of coil for this!")) + return + coil.use(15) + to_chat(user, span_notice("You add some cables, not being really sure why. Looks like backpack straps.")) + wired = TRUE + slot_flags |= ITEM_SLOT_BACK + update_appearance() + + else if(item.tool_behaviour == TOOL_WIRECUTTER && wired) + item.play_tool_sound(src) + to_chat(user, span_notice("You remove the cables.")) + wired = FALSE + slot_flags &= ~ITEM_SLOT_BACK + Move(drop_location()) + new /obj/item/stack/cable_coil(drop_location(), 15) + update_appearance() + return //These keep attached devices synced up, for example a TTV with a mouse trap being found in a bag so it's triggered, or moving the TTV with an infrared beam sensor to update the beam's direction. @@ -126,6 +151,19 @@ J.transform = T underlays = list(J) + if(wired) + cable_overlay = mutable_appearance(icon, icon_state = "valve_cables", layer = layer + 0.05, appearance_flags = KEEP_TOGETHER) + add_overlay(cable_overlay) + + else if(cable_overlay) + cut_overlay(cable_overlay, TRUE) + cable_overlay = null + + worn_icon_state = "[initial(worn_icon_state)][tank_two ? "l" : ""][tank_one ? "r" : ""]" + if(ishuman(loc)) //worn + var/mob/living/carbon/human/human = loc + human.update_worn_back() + if(!attached_device) return @@ -263,14 +301,12 @@ split_gases() valve_open = FALSE tank_one.forceMove(drop_location()) - tank_one = null . = TRUE if("tanktwo") if(tank_two) split_gases() valve_open = FALSE tank_two.forceMove(drop_location()) - tank_two = null . = TRUE if("toggle") toggle_valve() @@ -292,3 +328,11 @@ */ /obj/item/transfer_valve/proc/ready() return tank_one && tank_two + +/obj/item/transfer_valve/fake/Initialize(mapload) + . = ..() + + tank_one = new /obj/item/tank/internals/plasma (src) + tank_two = new /obj/item/tank/internals/oxygen (src) + + update_appearance() diff --git a/code/game/objects/items/door_seal.dm b/code/game/objects/items/door_seal.dm index 7223692445b3c..eef6f3d79eedc 100644 --- a/code/game/objects/items/door_seal.dm +++ b/code/game/objects/items/door_seal.dm @@ -1,7 +1,7 @@ /obj/item/door_seal name = "pneumatic airlock seal" desc = "A brace used to seal and reinforce an airlock. Useful for making areas inaccessible to those without opposable thumbs." - icon = 'icons/obj/airlock_machines.dmi' + icon = 'icons/obj/machines/wallmounts.dmi' icon_state = "pneumatic_seal" inhand_icon_state = "pneumatic_seal" lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' diff --git a/code/game/objects/items/drug_items.dm b/code/game/objects/items/drug_items.dm index 828d1ade7ee26..f313dad5f74ea 100644 --- a/code/game/objects/items/drug_items.dm +++ b/code/game/objects/items/drug_items.dm @@ -1,7 +1,7 @@ /obj/item/food/drug name = "generic drug" desc = "I am error" - icon = 'icons/obj/drugs.dmi' + icon = 'icons/obj/medical/drugs.dmi' foodtypes = GROSS food_flags = FOOD_FINGER_FOOD max_volume = 50 @@ -32,7 +32,7 @@ /obj/item/reagent_containers/cup/blastoff_ampoule name = "bLaSToFF ampoule" //stylized name desc = "A small ampoule. The liquid inside appears to be boiling violently.\nYou suspect it contains bLasSToFF; the drug thought to be the cause of the infamous Luna nightclub mass casualty incident." - icon = 'icons/obj/drugs.dmi' + icon = 'icons/obj/medical/drugs.dmi' icon_state = "blastoff_ampoule" base_icon_state = "blastoff_ampoule" volume = 20 diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm index 2f3bff682dbb6..9f553aa1bc9ff 100644 --- a/code/game/objects/items/dualsaber.dm +++ b/code/game/objects/items/dualsaber.dm @@ -175,7 +175,7 @@ var/mob/living/carbon/C = user if(C.wear_mask) in_mouth = ", barely missing [user.p_their()] nose" - . = span_warning("[user] swings [user.p_their()] [name][in_mouth]. [user.p_they(TRUE)] light[user.p_s()] [A.loc == user ? "[user.p_their()] [A.name]" : A] in the process.") + . = span_warning("[user] swings [user.p_their()] [name][in_mouth]. [user.p_They()] light[user.p_s()] [A.loc == user ? "[user.p_their()] [A.name]" : A] in the process.") playsound(loc, hitsound, get_clamped_volume(), TRUE, -1) add_fingerprint(user) // Light your candles while spinning around the room diff --git a/code/game/objects/items/dyekit.dm b/code/game/objects/items/dyekit.dm deleted file mode 100644 index f2b26a56dc3e1..0000000000000 --- a/code/game/objects/items/dyekit.dm +++ /dev/null @@ -1,50 +0,0 @@ -/obj/item/dyespray - name = "hair dye spray" - desc = "A spray to dye your hair any gradients you'd like." - w_class = WEIGHT_CLASS_TINY - icon = 'icons/obj/dyespray.dmi' - icon_state = "dyespray" - -/obj/item/dyespray/attack_self(mob/user) - dye(user, user) - -/obj/item/dyespray/pre_attack(atom/target, mob/living/user, params) - dye(target, user) - return ..() - -/** - * Applies a gradient and a gradient color to a mob. - * - * Arguments: - * * target - The mob who we will apply the gradient and gradient color to. - */ - -/obj/item/dyespray/proc/dye(mob/target, mob/user) - if(!ishuman(target)) - return - var/mob/living/carbon/human/human_target = target - var/beard_or_hair = tgui_alert(user, "What do you want to dye?", "Character Preference", list("Hair", "Facial Hair")) - if(!beard_or_hair || !user.can_perform_action(src, NEED_DEXTERITY)) - return - - var/list/choices = beard_or_hair == "Hair" ? GLOB.hair_gradients_list : GLOB.facial_hair_gradients_list - var/new_grad_style = tgui_input_list(user, "Choose a color pattern", "Character Preference", choices) - if(isnull(new_grad_style)) - return - if(!user.can_perform_action(src, NEED_DEXTERITY)) - return - - var/new_grad_color = input(user, "Choose a secondary hair color:", "Character Preference",human_target.grad_color) as color|null - if(!new_grad_color || !user.can_perform_action(src, NEED_DEXTERITY) || !user.CanReach(target)) - return - - to_chat(user, span_notice("You start applying the hair dye...")) - if(!do_after(user, 3 SECONDS, target)) - return - var/gradient_key = beard_or_hair == "Hair" ? GRADIENT_HAIR_KEY : GRADIENT_FACIAL_HAIR_KEY - LAZYSETLEN(human_target.grad_style, GRADIENTS_LEN) - LAZYSETLEN(human_target.grad_color, GRADIENTS_LEN) - human_target.grad_style[gradient_key] = new_grad_style - human_target.grad_color[gradient_key] = sanitize_hexcolor(new_grad_color) - playsound(src, 'sound/effects/spray.ogg', 5, TRUE, 5) - human_target.update_body_parts() diff --git a/code/game/objects/items/dyespray.dm b/code/game/objects/items/dyespray.dm new file mode 100644 index 0000000000000..fd198ec1c40e3 --- /dev/null +++ b/code/game/objects/items/dyespray.dm @@ -0,0 +1,50 @@ +/obj/item/dyespray + name = "hair dye spray" + desc = "A spray to dye your hair any gradients you'd like." + w_class = WEIGHT_CLASS_TINY + icon = 'icons/obj/cosmetic.dmi' + icon_state = "dyespray" + +/obj/item/dyespray/attack_self(mob/user) + dye(user, user) + +/obj/item/dyespray/pre_attack(atom/target, mob/living/user, params) + dye(target, user) + return ..() + +/** + * Applies a gradient and a gradient color to a mob. + * + * Arguments: + * * target - The mob who we will apply the gradient and gradient color to. + */ + +/obj/item/dyespray/proc/dye(mob/target, mob/user) + if(!ishuman(target)) + return + var/mob/living/carbon/human/human_target = target + var/beard_or_hair = tgui_alert(user, "What do you want to dye?", "Character Preference", list("Hair", "Facial Hair")) + if(!beard_or_hair || !user.can_perform_action(src, NEED_DEXTERITY)) + return + + var/list/choices = beard_or_hair == "Hair" ? GLOB.hair_gradients_list : GLOB.facial_hair_gradients_list + var/new_grad_style = tgui_input_list(user, "Choose a color pattern", "Character Preference", choices) + if(isnull(new_grad_style)) + return + if(!user.can_perform_action(src, NEED_DEXTERITY)) + return + + var/new_grad_color = input(user, "Choose a secondary hair color:", "Character Preference",human_target.grad_color) as color|null + if(!new_grad_color || !user.can_perform_action(src, NEED_DEXTERITY) || !user.CanReach(target)) + return + + to_chat(user, span_notice("You start applying the hair dye...")) + if(!do_after(user, 3 SECONDS, target)) + return + if(beard_or_hair == "Hair") + human_target.set_hair_gradient_style(new_grad_style, update = FALSE) + human_target.set_hair_gradient_color(new_grad_color, update = TRUE) + else + human_target.set_facial_hair_gradient_style(new_grad_style, update = FALSE) + human_target.set_facial_hair_gradient_color(new_grad_color, update = TRUE) + playsound(src, 'sound/effects/spray.ogg', 10, vary = TRUE) diff --git a/code/game/objects/items/eightball.dm b/code/game/objects/items/eightball.dm index 7b8354b0a777b..737ba7e947c5a 100644 --- a/code/game/objects/items/eightball.dm +++ b/code/game/objects/items/eightball.dm @@ -11,8 +11,8 @@ var/shaking = FALSE var/on_cooldown = FALSE - var/shake_time = 50 - var/cooldown_time = 100 + var/shake_time = 5 SECONDS + var/cooldown_time = 10 SECONDS var/static/list/possible_answers = list( "It is certain", @@ -42,11 +42,16 @@ return INITIALIZE_HINT_QDEL /obj/item/toy/eightball/proc/MakeHaunted() - . = prob(1) - if(.) + if(prob(1)) new /obj/item/toy/eightball/haunted(loc) + return TRUE + return FALSE /obj/item/toy/eightball/attack_self(mob/user) + if(..()) + return + + . = TRUE if(shaking) return @@ -60,23 +65,19 @@ start_shaking(user) if(do_after(user, shake_time)) - var/answer = get_answer() - say(answer) + say(get_answer()) on_cooldown = TRUE - addtimer(CALLBACK(src, PROC_REF(clear_cooldown)), cooldown_time) + addtimer(VARSET_CALLBACK(src, on_cooldown, FALSE), cooldown_time) shaking = FALSE -/obj/item/toy/eightball/proc/start_shaking(user) +/obj/item/toy/eightball/proc/start_shaking(mob/user) return /obj/item/toy/eightball/proc/get_answer() return pick(possible_answers) -/obj/item/toy/eightball/proc/clear_cooldown() - on_cooldown = FALSE - // A broken magic eightball, it only says "YOU SUCK" over and over again. /obj/item/toy/eightball/broken @@ -97,7 +98,7 @@ /obj/item/toy/eightball/haunted shake_time = 30 SECONDS cooldown_time = 3 MINUTES - var/last_message + var/last_message = "Nothing!" var/selected_message //these kind of store the same thing but one is easier to work with. var/list/votes = list() @@ -160,6 +161,7 @@ notify_ghosts("[user] is shaking [src], hoping to get an answer to \"[selected_message]\"", source=src, enter_link="(Click to help)", action=NOTIFY_ATTACK, header = "Magic eightball") /obj/item/toy/eightball/haunted/Topic(href, href_list) + . = ..() if(href_list["interact"]) if(isobserver(usr)) interact(usr) @@ -169,7 +171,7 @@ var/top_vote for(var/vote in votes) - var/amount_of_votes = length(votes[vote]) + var/amount_of_votes = votes[vote] if(amount_of_votes > top_amount) top_vote = vote top_amount = amount_of_votes @@ -186,12 +188,19 @@ voted.Cut() - return top_vote + var/list/top_options = haunted_answers[top_vote] + return pick(top_options) + +// Only ghosts can interact because only ghosts can open the ui +/obj/item/toy/eightball/haunted/can_interact(mob/living/user) + return isobserver(user) /obj/item/toy/eightball/haunted/ui_state(mob/user) return GLOB.observer_state /obj/item/toy/eightball/haunted/ui_interact(mob/user, datum/tgui/ui) + if(!isobserver(user)) + return ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "EightBallVote", name) @@ -224,9 +233,11 @@ var/selected_answer = params["answer"] if(!(selected_answer in haunted_answers)) return - if(user.ckey in voted) - return - else - votes[selected_answer] += 1 - voted[user.ckey] = selected_answer - . = TRUE + var/oldvote = voted[user.ckey] + if(oldvote) + // detract their old vote + votes[oldvote] -= 1 + + votes[selected_answer] += 1 + voted[user.ckey] = selected_answer + return TRUE diff --git a/code/game/objects/items/emags.dm b/code/game/objects/items/emags.dm index 84eb1d50139f1..56da7757c0a70 100644 --- a/code/game/objects/items/emags.dm +++ b/code/game/objects/items/emags.dm @@ -11,9 +11,6 @@ desc = "It's a card with a magnetic strip attached to some circuitry." name = "cryptographic sequencer" icon_state = "emag" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' item_flags = NO_MAT_REDEMPTION | NOBLUDGEON slot_flags = ITEM_SLOT_ID worn_icon_state = "emag" @@ -40,11 +37,8 @@ desc = "It's a card with a magnetic strip attached to some circuitry. Closer inspection shows that this card is a poorly made replica, with a \"Donk Co.\" logo stamped on the back." name = "cryptographic sequencer" icon_state = "emag" - inhand_icon_state = "card-id" slot_flags = ITEM_SLOT_ID worn_icon_state = "emag" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' /obj/item/card/emagfake/attack_self(mob/user) //for assistants with balls of plasteel if(Adjacent(user)) diff --git a/code/game/objects/items/etherealdiscoball.dm b/code/game/objects/items/etherealdiscoball.dm index 4f1f0b0277f44..85b3a77bc86d2 100644 --- a/code/game/objects/items/etherealdiscoball.dm +++ b/code/game/objects/items/etherealdiscoball.dm @@ -26,6 +26,8 @@ /obj/structure/etherealball/Initialize(mapload) . = ..() update_appearance() + if(TurnedOn) + TurnOn() /obj/structure/etherealball/attack_hand(mob/living/carbon/human/user, list/modifiers) . = ..() diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index 04ac9fa33a583..9518ffaf808ce 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -1,7 +1,7 @@ /obj/item/extinguisher name = "fire extinguisher" desc = "A traditional red fire extinguisher." - icon = 'icons/obj/weapons/extinguisher.dmi' + icon = 'icons/obj/tools.dmi' icon_state = "fire_extinguisher0" worn_icon_state = "fire_extinguisher" inhand_icon_state = "fire_extinguisher" @@ -43,6 +43,15 @@ /// Icon state when inside a tank holder. var/tank_holder_icon_state = "holder_extinguisher" +/obj/item/extinguisher/Initialize(mapload) + . = ..() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/ghettojetpack) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/extinguisher/empty starting_water = FALSE @@ -67,7 +76,7 @@ /obj/item/extinguisher/crafted name = "Improvised cooling spray" - desc = "Spraycan turned coolant dipsenser. Can be sprayed on containers to cool them. Refll using water." + desc = "Spraycan turned coolant dispenser. Can be sprayed on containers to cool them. Refill using water." icon_state = "coolant0" worn_icon_state = "miniFE" inhand_icon_state = "miniFE" @@ -163,7 +172,7 @@ balloon_alert(user, "already full!") return TRUE var/obj/structure/reagent_dispensers/W = target //will it work? - var/transferred = W.reagents.trans_to(src, max_water, transfered_by = user) + var/transferred = W.reagents.trans_to(src, max_water, transferred_by = user) if(transferred > 0) to_chat(user, span_notice("\The [src] has been refilled by [transferred] units.")) playsound(src.loc, 'sound/effects/refill.ogg', 50, TRUE, -6) @@ -205,10 +214,10 @@ if(user.buckled && isobj(user.buckled) && !user.buckled.anchored) var/obj/B = user.buckled - var/movementdirection = turn(direction,180) + var/movementdirection = REVERSE_DIR(direction) addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/item/extinguisher, move_chair), B, movementdirection), 1) else - user.newtonian_move(turn(direction, 180)) + user.newtonian_move(REVERSE_DIR(direction)) //Get all the turfs that can be shot at var/turf/T = get_turf(target) @@ -231,7 +240,7 @@ var/datum/reagents/water_reagents = new /datum/reagents(5) water.reagents = water_reagents water_reagents.my_atom = water - reagents.trans_to(water, 1, transfered_by = user) + reagents.trans_to(water, 1, transferred_by = user) //Make em move dat ass, hun move_particles(water_particles) diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index d17708886f288..eb94626c86e73 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -34,6 +34,12 @@ /obj/item/flamethrower/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_updates_onmob) + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/flamethrower) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) /obj/item/flamethrower/Destroy() if(weldtool) @@ -224,7 +230,7 @@ if(air_transfer.gases[/datum/gas/plasma]) air_transfer.gases[/datum/gas/plasma][MOLES] *= 5 //Suffering target.assume_air(air_transfer) - //Burn it based on transfered gas + //Burn it based on transferred gas target.hotspot_expose((tank_mix.temperature*2) + 380,500) //location.hotspot_expose(1000,500,1) diff --git a/code/game/objects/items/food/_food.dm b/code/game/objects/items/food/_food.dm index 4c707f88ae3b5..69cfdde4668bc 100644 --- a/code/game/objects/items/food/_food.dm +++ b/code/game/objects/items/food/_food.dm @@ -10,7 +10,7 @@ righthand_file = 'icons/mob/inhands/items/food_righthand.dmi' obj_flags = UNIQUE_RENAME grind_results = list() - ///List of reagents this food gets on creation + ///List of reagents this food gets on creation during reaction or map spawn var/list/food_reagents ///Extra flags for things such as if the food is in a container or not var/food_flags @@ -30,10 +30,6 @@ var/trash_type ///How much junkiness this food has? God I should remove junkiness soon var/junkiness - ///Will this food turn into badrecipe on a grill? Don't use this for everything; preferably mostly for food that is made on a grill to begin with so it burns after some time - var/burns_on_grill = FALSE - ///Will this food turn into badrecipe in an oven? Don't use this for everything; preferably mostly for food that is made in an oven to begin with so it burns after some time - var/burns_in_oven = FALSE ///Price of this food if sold in a venue var/venue_value ///Food that's immune to decomposition. @@ -46,11 +42,19 @@ var/decomp_req_handle = FALSE ///Used to set custom decomposition times for food. Set to 0 to have it automatically set via the food's flags. var/decomposition_time = 0 + ///Used to set decomposition stink particles for food, will have no particles if null + var/decomposition_particles = /particles/stink + ///Used to set custom starting reagent purity for synthetic and natural food. Ignored when set to null. + var/starting_reagent_purity = null + ///How exquisite the meal is. Applicable to crafted food, increasing its quality. Spans from 0 to 5. + var/crafting_complexity = 0 + ///Buff given when a hand-crafted version of this item is consumed. Randomized according to crafting_complexity if not assigned. + var/datum/status_effect/food/crafted_food_buff = null /obj/item/food/Initialize(mapload) - . = ..() if(food_reagents) food_reagents = string_assoc_list(food_reagents) + . = ..() if(tastes) tastes = string_assoc_list(tastes) if(eatverbs) @@ -61,10 +65,10 @@ make_processable() make_leave_trash() make_grillable() - make_decompose(mapload) + make_germ_sensitive(mapload) make_bakeable() make_microwaveable() - ADD_TRAIT(src, FISHING_BAIT_TRAIT, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_FISHING_BAIT, INNATE_TRAIT) ///This proc adds the edible component, overwrite this if you for some reason want to change some specific args like callbacks. /obj/item/food/proc/make_edible() @@ -78,23 +82,21 @@ eatverbs = eatverbs,\ bite_consumption = bite_consumption,\ junkiness = junkiness,\ + reagent_purity = starting_reagent_purity,\ ) - ///This proc handles processable elements, overwrite this if you want to add behavior such as slicing, forking, spooning, whatever, to turn the item into something else /obj/item/food/proc/make_processable() return ///This proc handles grillable components, overwrite if you want different grill results etc. /obj/item/food/proc/make_grillable() - if(burns_on_grill) - AddComponent(/datum/component/grillable, /obj/item/food/badrecipe, rand(20 SECONDS, 30 SECONDS), FALSE) + AddComponent(/datum/component/grillable, /obj/item/food/badrecipe, rand(20 SECONDS, 30 SECONDS), FALSE) return ///This proc handles bakeable components, overwrite if you want different bake results etc. /obj/item/food/proc/make_bakeable() - if(burns_in_oven) - AddComponent(/datum/component/bakeable, /obj/item/food/badrecipe, rand(25 SECONDS, 40 SECONDS), FALSE) + AddComponent(/datum/component/bakeable, /obj/item/food/badrecipe, rand(25 SECONDS, 40 SECONDS), FALSE) return /// This proc handles the microwave component. Overwrite if you want special microwave results. @@ -108,8 +110,13 @@ AddElement(/datum/element/food_trash, trash_type) return -///This proc makes things decompose. Set preserved_food to TRUE to make it never decompose. +///This proc makes things infective and decomposing when they stay on the floor for too long. +///Set preserved_food to TRUE to make it never decompose. ///Set decomp_req_handle to TRUE to only make it decompose when someone picks it up. -/obj/item/food/proc/make_decompose(mapload) +///Requires /datum/component/germ_sensitive to detect exposure +/obj/item/food/proc/make_germ_sensitive(mapload) + if(istype(src, /obj/item/food/bowled) || istype(src, /obj/item/food/canned) || !isnull(trash_type)) + return // You don't eat the package and it protects from decomposing + AddComponent(/datum/component/germ_sensitive, mapload) if(!preserved_food) - AddComponent(/datum/component/decomposition, mapload, decomp_req_handle, decomp_flags = foodtypes, decomp_result = decomp_type, ant_attracting = ant_attracting, custom_time = decomposition_time) + AddComponent(/datum/component/decomposition, mapload, decomp_req_handle, decomp_flags = foodtypes, decomp_result = decomp_type, ant_attracting = ant_attracting, custom_time = decomposition_time, stink_particles = decomposition_particles) diff --git a/code/game/objects/items/food/bait.dm b/code/game/objects/items/food/bait.dm index 983d87b989d99..5ac24baa578ea 100644 --- a/code/game/objects/items/food/bait.dm +++ b/code/game/objects/items/food/bait.dm @@ -3,7 +3,7 @@ desc = "you got baited." icon = 'icons/obj/fishing.dmi' /// Quality trait of this bait - var/bait_quality = BASIC_QUALITY_BAIT_TRAIT + var/bait_quality = TRAIT_BASIC_QUALITY_BAIT /// Icon state added to main fishing rod icon when this bait is equipped var/rod_overlay_icon_state @@ -20,13 +20,13 @@ tastes = list("meat" = 1, "worms" = 1) foodtypes = GROSS | MEAT | BUGS w_class = WEIGHT_CLASS_TINY - bait_quality = BASIC_QUALITY_BAIT_TRAIT + bait_quality = TRAIT_BASIC_QUALITY_BAIT rod_overlay_icon_state = "worm_overlay" /obj/item/food/bait/worm/premium name = "extra slimy worm" desc = "This worm looks very sophisticated." - bait_quality = GOOD_QUALITY_BAIT_TRAIT + bait_quality = TRAIT_GOOD_QUALITY_BAIT /obj/item/food/bait/natural name = "natural bait" @@ -38,7 +38,7 @@ inhand_icon_state = "pen" food_reagents = list(/datum/reagent/drug/kronkaine = 1) tastes = list("hypocrisy" = 1) - bait_quality = GREAT_QUALITY_BAIT_TRAIT + bait_quality = TRAIT_GREAT_QUALITY_BAIT /obj/item/food/bait/doughball name = "doughball" @@ -49,11 +49,21 @@ tastes = list("dough" = 1) foodtypes = GRAIN w_class = WEIGHT_CLASS_TINY - bait_quality = BASIC_QUALITY_BAIT_TRAIT + bait_quality = TRAIT_BASIC_QUALITY_BAIT rod_overlay_icon_state = "dough_overlay" -/// These are generated by tech fishing rod +/** + * Bound to the tech fishing rod, from which cannot be removed, + * Bait-related preferences and traits, both negative and positive, + * should be ignored by this bait. + * Otherwise it'd be hard/impossible to cath some fish with it, + * making that rod a shoddy choice in the long run. + */ /obj/item/food/bait/doughball/synthetic name = "synthetic doughball" icon_state = "doughball" preserved_food = TRUE + +/obj/item/food/bait/doughball/synthetic/Initialize(mapload) + . = ..() + ADD_TRAIT(src, OMNI_BAIT_TRAIT, INNATE_TRAIT) diff --git a/code/game/objects/items/food/bread.dm b/code/game/objects/items/food/bread.dm index e3ee72a573d93..ba1845bb40da4 100644 --- a/code/game/objects/items/food/bread.dm +++ b/code/game/objects/items/food/bread.dm @@ -8,6 +8,7 @@ tastes = list("bread" = 10) foodtypes = GRAIN eat_time = 3 SECONDS + crafting_complexity = FOOD_COMPLEXITY_2 /// type is spawned 5 at a time and replaces this bread loaf when processed by cutting tool var/obj/item/food/breadslice/slice_type /// so that the yield can change if it isnt 5 @@ -32,6 +33,7 @@ food_flags = FOOD_FINGER_FOOD eat_time = 0.5 SECONDS w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/breadslice/Initialize(mapload) . = ..() @@ -46,17 +48,13 @@ foodtypes = GRAIN w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_CHEAP - burns_in_oven = TRUE slice_type = /obj/item/food/breadslice/plain + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/bread/plain/Initialize(mapload) . = ..() AddComponent(/datum/component/customizable_reagent_holder, /obj/item/food/bread/empty, CUSTOM_INGREDIENT_ICON_FILL, max_ingredients = 8) -// special subtype we use for the "Bread" Admin Smite (or the breadify proc) -/obj/item/food/bread/plain/smite - desc = "If you hold it up to your ear, you can hear the screams of the damned." - /obj/item/food/breadslice/plain name = "bread slice" desc = "A slice of home." @@ -65,6 +63,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 2) venue_value = FOOD_PRICE_TRASH decomp_type = /obj/item/food/breadslice/moldy + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/breadslice/plain/Initialize(mapload) . = ..() @@ -84,6 +83,7 @@ tastes = list("decaying fungus" = 1) foodtypes = GROSS preserved_food = TRUE + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/breadslice/moldy/bacteria name = "bacteria-rich moldy 'bread' slice" @@ -107,6 +107,7 @@ foodtypes = GRAIN | MEAT venue_value = FOOD_PRICE_CHEAP slice_type = /obj/item/food/breadslice/meat + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/breadslice/meat name = "meatbread slice" @@ -119,6 +120,7 @@ ) tastes = list("bread" = 1, "meat" = 1) foodtypes = GRAIN | MEAT + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/bread/sausage name = "sausagebread loaf" @@ -132,6 +134,7 @@ tastes = list("bread" = 10, "meat" = 10) foodtypes = GRAIN | MEAT slice_type = /obj/item/food/breadslice/sausage + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/breadslice/sausage name = "sausagebread slice" @@ -144,6 +147,7 @@ ) tastes = list("bread" = 10, "meat" = 10) foodtypes = GRAIN | MEAT + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/bread/xenomeat name = "xenomeatbread loaf" @@ -157,6 +161,7 @@ tastes = list("bread" = 10, "acid" = 10) foodtypes = GRAIN | MEAT slice_type = /obj/item/food/breadslice/xenomeat + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/breadslice/xenomeat name = "xenomeatbread slice" @@ -169,6 +174,7 @@ ) tastes = list("bread" = 10, "acid" = 10) foodtypes = GRAIN | MEAT + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/bread/spidermeat name = "spider meat loaf" @@ -183,6 +189,7 @@ tastes = list("bread" = 10, "cobwebs" = 5) foodtypes = GRAIN | MEAT | TOXIC slice_type = /obj/item/food/breadslice/spidermeat + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/breadslice/spidermeat name = "spider meat bread slice" @@ -196,6 +203,7 @@ ) tastes = list("bread" = 10, "cobwebs" = 5) foodtypes = GRAIN | MEAT | TOXIC + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/bread/banana name = "banana-nut bread" @@ -208,6 +216,7 @@ tastes = list("bread" = 10) // bananjuice will also flavour foodtypes = GRAIN | FRUIT slice_type = /obj/item/food/breadslice/banana + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/breadslice/banana name = "banana-nut bread slice" @@ -219,6 +228,7 @@ ) tastes = list("bread" = 10) foodtypes = GRAIN | FRUIT + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/bread/tofu name = "Tofubread" @@ -233,6 +243,7 @@ foodtypes = GRAIN | VEGETABLES venue_value = FOOD_PRICE_TRASH slice_type = /obj/item/food/breadslice/tofu + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/breadslice/tofu name = "tofubread slice" @@ -245,6 +256,7 @@ ) tastes = list("bread" = 10, "tofu" = 10) foodtypes = GRAIN | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/bread/creamcheese name = "cream cheese bread" @@ -284,6 +296,7 @@ tastes = list("bread" = 10, "silence" = 10) foodtypes = GRAIN | FRUIT slice_type = /obj/item/food/breadslice/mimana + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/breadslice/mimana name = "mimana bread slice" @@ -297,6 +310,7 @@ ) tastes = list("bread" = 10, "silence" = 10) foodtypes = GRAIN | FRUIT + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/bread/empty name = "bread" @@ -334,6 +348,7 @@ tastes = list("bread" = 1) foodtypes = GRAIN venue_value = FOOD_PRICE_CHEAP + crafting_complexity = FOOD_COMPLEXITY_2 /// whether this is in fake swordplay mode or not var/fake_swordplay = FALSE @@ -343,18 +358,18 @@ /obj/item/food/baguette/add_context(atom/source, list/context, obj/item/held_item, mob/user) . = ..() - if (HAS_TRAIT(user, TRAIT_MIMING) && held_item == src) + if(HAS_MIND_TRAIT(user, TRAIT_MIMING) && held_item == src) context[SCREENTIP_CONTEXT_LMB] = "Toggle Swordplay" return CONTEXTUAL_SCREENTIP_SET /obj/item/food/baguette/examine(mob/user) . = ..() - if(HAS_TRAIT(user, TRAIT_MIMING)) + if(HAS_MIND_TRAIT(user, TRAIT_MIMING)) . += span_notice("You can wield this like a sword by using it in your hand.") /obj/item/food/baguette/attack_self(mob/user, modifiers) . = ..() - if(!HAS_TRAIT(user, TRAIT_MIMING)) + if(!HAS_MIND_TRAIT(user, TRAIT_MIMING)) return if(fake_swordplay) end_swordplay(user) @@ -435,6 +450,7 @@ tastes = list("bread" = 1, "garlic" = 1, "butter" = 1) foodtypes = GRAIN venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/butterbiscuit name = "butter biscuit" @@ -449,6 +465,7 @@ foodtypes = GRAIN | BREAKFAST w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_CHEAP + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/butterdog name = "butterdog" @@ -463,6 +480,7 @@ tastes = list("butter" = 1, "exotic butter" = 1) foodtypes = GRAIN | DAIRY w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/butterdog/Initialize(mapload) . = ..() @@ -480,6 +498,7 @@ tastes = list("raw egg" = 2, "soaked bread" = 1) foodtypes = GRAIN | RAW | BREAKFAST w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/raw_frenchtoast/make_grillable() AddComponent(/datum/component/grillable, /obj/item/food/frenchtoast, rand(20 SECONDS, 30 SECONDS), TRUE) @@ -496,7 +515,7 @@ tastes = list("french toast" = 1, "syrup" = 1, "golden deliciousness" = 1) foodtypes = GRAIN | BREAKFAST w_class = WEIGHT_CLASS_SMALL - burns_on_grill = TRUE + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/raw_breadstick name = "raw breadstick" @@ -510,6 +529,7 @@ tastes = list("raw dough" = 1) foodtypes = GRAIN | DAIRY w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/raw_breadstick/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/breadstick, rand(15 SECONDS, 20 SECONDS), TRUE, TRUE) @@ -526,7 +546,7 @@ tastes = list("fluffy bread" = 1, "butter" = 2) foodtypes = GRAIN | DAIRY w_class = WEIGHT_CLASS_SMALL - burns_in_oven = TRUE + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/raw_croissant name = "raw croissant" @@ -537,6 +557,7 @@ tastes = list("raw dough" = 1) foodtypes = GRAIN | DAIRY w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/raw_croissant/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/croissant, rand(15 SECONDS, 20 SECONDS), TRUE, TRUE) @@ -550,7 +571,7 @@ tastes = list("fluffy bread" = 1, "butter" = 2) foodtypes = GRAIN | DAIRY | BREAKFAST w_class = WEIGHT_CLASS_SMALL - burns_in_oven = TRUE + crafting_complexity = FOOD_COMPLEXITY_2 // Enhanced weaponised bread /obj/item/food/croissant/throwing diff --git a/code/game/objects/items/food/burgers.dm b/code/game/objects/items/food/burgers.dm index 764f1d40c3e1f..b2d779ca3a54c 100644 --- a/code/game/objects/items/food/burgers.dm +++ b/code/game/objects/items/food/burgers.dm @@ -12,6 +12,7 @@ foodtypes = GRAIN | MEAT //lettuce doesn't make burger a vegetable. eat_time = 15 //Quick snack w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/burger/plain name = "plain burger" @@ -24,6 +25,7 @@ foodtypes = GRAIN | MEAT custom_price = PAYCHECK_CREW * 0.8 venue_value = FOOD_PRICE_CHEAP + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/burger/plain/Initialize(mapload) . = ..() @@ -48,6 +50,7 @@ tastes = list("bun" = 2, "long pig" = 4) foodtypes = MEAT | GRAIN | GORE venue_value = FOOD_PRICE_CHEAP + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/burger/human/CheckParts(list/parts_list) ..() @@ -69,6 +72,7 @@ tastes = list("bun" = 4, "corgi meat" = 2) foodtypes = GRAIN | MEAT | GORE venue_value = FOOD_PRICE_EXOTIC + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/burger/appendix name = "appendix burger" @@ -82,6 +86,7 @@ tastes = list("bun" = 4, "grass" = 2) foodtypes = GRAIN | MEAT | GORE venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/burger/fish name = "fillet -o- carp sandwich" @@ -95,6 +100,7 @@ tastes = list("bun" = 4, "fish" = 4) foodtypes = GRAIN | SEAFOOD venue_value = FOOD_PRICE_EXOTIC + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/burger/tofu name = "tofu burger" @@ -108,6 +114,7 @@ tastes = list("bun" = 4, "tofu" = 4) foodtypes = GRAIN | VEGETABLES venue_value = FOOD_PRICE_CHEAP + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/burger/roburger name = "roburger" @@ -143,6 +150,7 @@ tastes = list("bun" = 4, "acid" = 4) foodtypes = GRAIN | MEAT venue_value = FOOD_PRICE_EXOTIC + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/burger/bearger name = "bearger" @@ -156,6 +164,7 @@ tastes = list("bun" = 2, "meat" = 2, "salmon" = 2) foodtypes = GRAIN | MEAT venue_value = FOOD_PRICE_EXOTIC + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/burger/clown name = "clown burger" @@ -169,6 +178,7 @@ tastes = list("bun" = 2, "a bad joke" = 4) foodtypes = GRAIN | FRUIT venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/burger/mime name = "mime burger" @@ -182,6 +192,7 @@ ) foodtypes = GRAIN venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/burger/brain name = "brainburger" @@ -196,6 +207,7 @@ tastes = list("bun" = 4, "brains" = 2) foodtypes = GRAIN | MEAT | GORE venue_value = FOOD_PRICE_CHEAP + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/burger/ghost name = "ghost burger" @@ -213,10 +225,16 @@ verb_say = "moans" verb_yell = "wails" venue_value = FOOD_PRICE_EXOTIC + crafting_complexity = FOOD_COMPLEXITY_3 + preserved_food = TRUE // It's made of ghosts -/obj/item/food/burger/ghost/Initialize(mapload) +/obj/item/food/burger/ghost/Initialize(mapload, starting_reagent_purity, no_base_reagents) . = ..() START_PROCESSING(SSobj, src) + AddComponent(/datum/component/ghost_edible, bite_consumption = bite_consumption) + +/obj/item/food/burger/ghost/make_germ_sensitive() + return // This burger moves itself so it shouldn't pick up germs from walking onto the floor /obj/item/food/burger/ghost/process() if(!isturf(loc)) //no floating out of bags @@ -243,8 +261,6 @@ new /obj/effect/decal/cleanable/greenglow/ecto(loc) playsound(loc, 'sound/effects/splat.ogg', 200, TRUE) - //If i was less lazy i would make the burger forcefeed itself to a nearby mob here. - /obj/item/food/burger/ghost/Destroy() STOP_PROCESSING(SSobj, src) . = ..() @@ -262,6 +278,7 @@ ) tastes = list("bun" = 2, "red" = 2) foodtypes = GRAIN | MEAT + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/burger/orange name = "orange burger" @@ -276,6 +293,7 @@ ) tastes = list("bun" = 2, "orange" = 2) foodtypes = GRAIN | MEAT + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/burger/yellow name = "yellow burger" @@ -290,6 +308,7 @@ ) tastes = list("bun" = 2, "yellow" = 2) foodtypes = GRAIN | MEAT + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/burger/green name = "green burger" @@ -304,6 +323,7 @@ ) tastes = list("bun" = 2, "green" = 2) foodtypes = GRAIN | MEAT + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/burger/blue name = "blue burger" @@ -318,6 +338,7 @@ ) tastes = list("bun" = 2, "blue" = 2) foodtypes = GRAIN | MEAT + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/burger/purple name = "purple burger" @@ -332,6 +353,7 @@ ) tastes = list("bun" = 2, "purple" = 2) foodtypes = GRAIN | MEAT + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/burger/black name = "black burger" @@ -346,6 +368,7 @@ ) tastes = list("bun" = 2, "black" = 2) foodtypes = GRAIN | MEAT + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/burger/white name = "white burger" @@ -360,6 +383,7 @@ ) tastes = list("bun" = 2, "white" = 2) foodtypes = GRAIN | MEAT + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/burger/spell name = "spell burger" @@ -373,6 +397,7 @@ tastes = list("bun" = 4, "magic" = 2) foodtypes = GRAIN | MEAT venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/burger/bigbite name = "big bite burger" @@ -387,6 +412,7 @@ w_class = WEIGHT_CLASS_NORMAL foodtypes = GRAIN | MEAT | DAIRY venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/burger/jelly name = "jelly burger" @@ -395,6 +421,7 @@ tastes = list("bun" = 4, "jelly" = 2) foodtypes = GRAIN | MEAT venue_value = FOOD_PRICE_EXOTIC + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/burger/jelly/slime food_reagents = list( @@ -427,6 +454,7 @@ tastes = list("bun" = 4, "type two diabetes" = 10) foodtypes = GRAIN | MEAT | DAIRY venue_value = FOOD_PRICE_EXOTIC + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/burger/superbite/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] starts to eat [src] in one bite, it looks like [user.p_theyre()] trying to commit suicide!")) @@ -448,6 +476,7 @@ tastes = list("extreme heat" = 4, "bun" = 2) foodtypes = GRAIN | MEAT venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/burger/rat name = "rat burger" @@ -461,6 +490,7 @@ tastes = list("dead rat" = 4, "bun" = 2) foodtypes = GRAIN | MEAT | GORE venue_value = FOOD_PRICE_CHEAP + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/burger/baseball name = "home run baseball burger" @@ -475,6 +505,7 @@ foodtypes = GRAIN | GROSS custom_price = PAYCHECK_CREW * 0.8 venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/burger/baconburger name = "bacon burger" @@ -489,6 +520,7 @@ foodtypes = GRAIN | MEAT custom_premium_price = PAYCHECK_CREW * 1.6 venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/burger/empoweredburger name = "empowered burger" @@ -503,6 +535,7 @@ tastes = list("bun" = 2, "pure electricity" = 4) foodtypes = GRAIN | TOXIC venue_value = FOOD_PRICE_CHEAP + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/burger/catburger name = "catburger" @@ -515,6 +548,7 @@ ) tastes = list("bun" = 4, "meat" = 2, "cat" = 2) foodtypes = GRAIN | MEAT | GORE + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/burger/crab name = "crab burger" @@ -528,6 +562,7 @@ tastes = list("bun" = 2, "crab meat" = 4) foodtypes = GRAIN | SEAFOOD venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/burger/soylent name = "soylent burger" @@ -541,6 +576,7 @@ tastes = list("bun" = 2, "assistant" = 4) foodtypes = GRAIN | MEAT | DAIRY venue_value = FOOD_PRICE_EXOTIC + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/burger/rib name = "mcrib" @@ -555,6 +591,7 @@ tastes = list("bun" = 2, "pork patty" = 4) foodtypes = GRAIN | MEAT venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/burger/mcguffin name = "mcguffin" @@ -569,6 +606,7 @@ tastes = list("muffin" = 2, "bacon" = 3) foodtypes = GRAIN | MEAT | BREAKFAST venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/burger/chicken name = "chicken sandwich" //Apparently the proud people of Americlapstan object to this thing being called a burger. Apparently McDonald's just calls it a burger in Europe as to not scare and confuse us. @@ -579,11 +617,12 @@ /datum/reagent/consumable/mayonnaise = 3, /datum/reagent/consumable/nutriment/protein = 7, /datum/reagent/consumable/nutriment/vitamin = 1, - /datum/reagent/consumable/cooking_oil = 2, + /datum/reagent/consumable/nutriment/fat/oil = 2, ) tastes = list("bun" = 2, "chicken" = 4, "God's covenant" = 1) foodtypes = GRAIN | MEAT | FRIED venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/burger/cheese name = "cheese burger" @@ -597,6 +636,7 @@ tastes = list("bun" = 2, "beef patty" = 4, "cheese" = 3) foodtypes = GRAIN | MEAT | DAIRY venue_value = FOOD_PRICE_CHEAP + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/burger/cheese/Initialize(mapload) . = ..() @@ -616,6 +656,7 @@ ) tastes = list("bun" = 2, "beef patty" = 4, "cheese" = 2, "beef soaked in chili" = 3, "a smoking flare" = 2) foodtypes = GRAIN | MEAT | DAIRY + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/burger/crazy/Initialize(mapload) . = ..() @@ -634,3 +675,17 @@ icon_state = "custburg" tastes = list("bun") foodtypes = GRAIN + +/obj/item/food/burger/sloppy_moe + name = "sloppy moe" + desc = "Ground meat mixed with onions and barbeque sauce, sloppily plopped onto a burger bun. Delicious, but guaranteed to get your hands dirty." + icon_state = "sloppy_moe" + food_reagents = list( + /datum/reagent/consumable/nutriment = 10, + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 6, + ) + tastes = list("juicy meat" = 4, "BBQ sauce" = 3, "onions" = 2, "bun" = 2) + foodtypes = GRAIN | MEAT | VEGETABLES + venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_3 diff --git a/code/game/objects/items/food/cake.dm b/code/game/objects/items/food/cake.dm index 9c7e061ef61fd..07d5818b4662c 100644 --- a/code/game/objects/items/food/cake.dm +++ b/code/game/objects/items/food/cake.dm @@ -8,6 +8,7 @@ ) tastes = list("cake" = 1) foodtypes = GRAIN | DAIRY + crafting_complexity = FOOD_COMPLEXITY_2 /// type is spawned 5 at a time and replaces this cake when processed by cutting tool var/obj/item/food/cakeslice/slice_type /// changes yield of sliced cake, default for cake is 5 @@ -30,6 +31,7 @@ tastes = list("cake" = 1) foodtypes = GRAIN | DAIRY w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/cake/plain name = "plain cake" @@ -41,7 +43,6 @@ ) tastes = list("sweetness" = 2, "cake" = 5) foodtypes = GRAIN | DAIRY | SUGAR - burns_in_oven = TRUE slice_type = /obj/item/food/cakeslice/plain /obj/item/food/cakeslice/plain @@ -59,6 +60,7 @@ foodtypes = GRAIN | DAIRY | VEGETABLES | SUGAR venue_value = FOOD_PRICE_CHEAP slice_type = /obj/item/food/cakeslice/carrot + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cakeslice/carrot name = "carrot cake slice" @@ -66,6 +68,7 @@ icon_state = "carrotcake_slice" tastes = list("cake" = 5, "sweetness" = 2, "carrot" = 1) foodtypes = GRAIN | DAIRY | VEGETABLES | SUGAR + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cake/brain name = "brain cake" @@ -80,6 +83,7 @@ tastes = list("cake" = 5, "sweetness" = 2, "brains" = 1) foodtypes = GRAIN | DAIRY | MEAT | GORE | SUGAR slice_type = /obj/item/food/cakeslice/brain + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cakeslice/brain name = "brain cake slice" @@ -93,6 +97,7 @@ ) tastes = list("cake" = 5, "sweetness" = 2, "brains" = 1) foodtypes = GRAIN | DAIRY | MEAT | GORE | SUGAR + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cake/cheese name = "cheese cake" @@ -107,6 +112,7 @@ foodtypes = GRAIN | DAIRY venue_value = FOOD_PRICE_CHEAP slice_type = /obj/item/food/cakeslice/cheese + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cakeslice/cheese name = "cheese cake slice" @@ -119,6 +125,7 @@ ) tastes = list("cake" = 4, "cream cheese" = 3) foodtypes = GRAIN | DAIRY + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cake/orange name = "orange cake" @@ -128,6 +135,7 @@ foodtypes = GRAIN | DAIRY | FRUIT | SUGAR | ORANGES venue_value = FOOD_PRICE_CHEAP slice_type = /obj/item/food/cakeslice/orange + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cakeslice/orange name = "orange cake slice" @@ -135,6 +143,7 @@ icon_state = "orangecake_slice" tastes = list("cake" = 5, "sweetness" = 2, "oranges" = 2) foodtypes = GRAIN | DAIRY | FRUIT | SUGAR | ORANGES + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cake/lime name = "lime cake" @@ -148,6 +157,7 @@ foodtypes = GRAIN | DAIRY | FRUIT | SUGAR venue_value = FOOD_PRICE_CHEAP slice_type = /obj/item/food/cakeslice/lime + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cakeslice/lime name = "lime cake slice" @@ -155,6 +165,7 @@ icon_state = "limecake_slice" tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2) foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cake/lemon name = "lemon cake" @@ -168,6 +179,7 @@ foodtypes = GRAIN | DAIRY | FRUIT | SUGAR venue_value = FOOD_PRICE_CHEAP slice_type = /obj/item/food/cakeslice/lemon + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cakeslice/lemon name = "lemon cake slice" @@ -175,6 +187,7 @@ icon_state = "lemoncake_slice" tastes = list("cake" = 5, "sweetness" = 2, "sourness" = 2) foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cake/chocolate name = "chocolate cake" @@ -188,6 +201,7 @@ foodtypes = GRAIN | DAIRY | JUNKFOOD | SUGAR venue_value = FOOD_PRICE_CHEAP slice_type = /obj/item/food/cakeslice/chocolate + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cakeslice/chocolate name = "chocolate cake slice" @@ -195,6 +209,7 @@ icon_state = "chocolatecake_slice" tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4) foodtypes = GRAIN | DAIRY | JUNKFOOD | SUGAR + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cake/birthday name = "birthday cake" @@ -208,6 +223,7 @@ tastes = list("cake" = 5, "sweetness" = 1) foodtypes = GRAIN | DAIRY | JUNKFOOD | SUGAR slice_type = /obj/item/food/cakeslice/birthday + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cake/birthday/make_microwaveable() // super sekrit club AddElement(/datum/element/microwavable, /obj/item/clothing/head/utility/hardhat/cakehat) @@ -223,6 +239,7 @@ ) tastes = list("cake" = 5, "sweetness" = 1) foodtypes = GRAIN | DAIRY | JUNKFOOD | SUGAR + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cake/birthday/energy name = "energy cake" @@ -239,6 +256,7 @@ ) tastes = list("cake" = 3, "a Vlad's Salad" = 1) slice_type = /obj/item/food/cakeslice/birthday/energy + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/cake/birthday/energy/make_microwaveable() //super sekriter club AddElement(/datum/element/microwavable, /obj/item/clothing/head/utility/hardhat/cakehat/energycake) @@ -268,6 +286,7 @@ /datum/reagent/consumable/liquidelectricity/enriched = 2, ) tastes = list("cake" = 3, "a Vlad's Salad" = 1) + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/cakeslice/birthday/energy/proc/energy_bite(mob/living/user) to_chat(user, "As you eat the cake slice, you accidentally hurt yourself on the embedded energy dagger!") @@ -292,6 +311,7 @@ foodtypes = GRAIN | DAIRY | FRUIT | SUGAR venue_value = FOOD_PRICE_CHEAP slice_type = /obj/item/food/cakeslice/apple + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cakeslice/apple name = "apple cake slice" @@ -299,6 +319,7 @@ icon_state = "applecakeslice" tastes = list("cake" = 5, "sweetness" = 1, "apple" = 1) foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cake/slimecake name = "Slime cake" @@ -307,6 +328,7 @@ tastes = list("cake" = 5, "sweetness" = 1, "slime" = 1) foodtypes = GRAIN | DAIRY | SUGAR slice_type = /obj/item/food/cakeslice/slimecake + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cakeslice/slimecake name = "slime cake slice" @@ -314,6 +336,7 @@ icon_state = "slimecake_slice" tastes = list("cake" = 5, "sweetness" = 1, "slime" = 1) foodtypes = GRAIN | DAIRY | SUGAR + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cake/pumpkinspice name = "pumpkin spice cake" @@ -323,6 +346,7 @@ foodtypes = GRAIN | DAIRY | VEGETABLES | SUGAR venue_value = FOOD_PRICE_CHEAP slice_type = /obj/item/food/cakeslice/pumpkinspice + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cakeslice/pumpkinspice name = "pumpkin spice cake slice" @@ -330,23 +354,26 @@ icon_state = "pumpkinspicecakeslice" tastes = list("cake" = 5, "sweetness" = 1, "pumpkin" = 1) foodtypes = GRAIN | DAIRY | VEGETABLES | SUGAR + crafting_complexity = FOOD_COMPLEXITY_3 -/obj/item/food/cake/bsvc // blackberry strawberries vanilla cake +/obj/item/food/cake/berry_vanilla_cake // blackberry strawberries vanilla cake name = "blackberry and strawberry vanilla cake" desc = "A plain cake, filled with assortment of blackberries and strawberries!" icon_state = "blackbarry_strawberries_cake_vanilla_cake" tastes = list("blackberry" = 2, "strawberries" = 2, "vanilla" = 2, "sweetness" = 2, "cake" = 3) foodtypes = GRAIN | DAIRY | FRUIT | SUGAR - slice_type = /obj/item/food/cakeslice/bsvc + slice_type = /obj/item/food/cakeslice/berry_vanilla_cake + crafting_complexity = FOOD_COMPLEXITY_3 -/obj/item/food/cakeslice/bsvc +/obj/item/food/cakeslice/berry_vanilla_cake name = "blackberry and strawberry vanilla cake slice" desc = "Just a slice of cake filled with assortment of blackberries and strawberries!" icon_state = "blackbarry_strawberries_cake_vanilla_slice" tastes = list("blackberry" = 2, "strawberries" = 2, "vanilla" = 2, "sweetness" = 2, "cake" = 3) foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + crafting_complexity = FOOD_COMPLEXITY_3 -/obj/item/food/cake/bscc // blackbarry strawberries chocolate cake <- this is a relic from before resprite +/obj/item/food/cake/berry_chocolate_cake // blackbarry strawberries chocolate cake <- this is a relic from before resprite name = "strawberry chocolate cake" desc = "A chocolate cake with five strawberries on top. For some reason, this configuration of cake is particularly aesthetically pleasing to AIs in SELF." icon_state = "liars_cake" @@ -357,15 +384,17 @@ ) tastes = list("blackberry" = 2, "strawberries" = 2, "chocolate" = 2, "sweetness" = 2, "cake" = 3) foodtypes = GRAIN | DAIRY | FRUIT | SUGAR - slice_type = /obj/item/food/cakeslice/bscc + slice_type = /obj/item/food/cakeslice/berry_chocolate_cake + crafting_complexity = FOOD_COMPLEXITY_4 -/obj/item/food/cakeslice/bscc +/obj/item/food/cakeslice/berry_chocolate_cake name = "strawberry chocolate cake slice" desc = "Just a slice of cake with five strawberries on top. \ For some reason, this configuration of cake is particularly aesthetically pleasing to AIs in SELF." icon_state = "liars_slice" tastes = list("strawberries" = 2, "chocolate" = 2, "sweetness" = 2, "cake" = 3) foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/cake/holy_cake name = "angel food cake" @@ -400,6 +429,7 @@ venue_value = FOOD_PRICE_CHEAP slice_type = /obj/item/food/cakeslice/pound_cake_slice yield = 7 + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/cakeslice/pound_cake_slice name = "pound cake slice" @@ -411,6 +441,7 @@ ) tastes = list("cake" = 5, "sweetness" = 5, "batter" = 1) foodtypes = GRAIN | DAIRY | SUGAR | JUNKFOOD + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/cake/hardware_cake name = "hardware cake" @@ -425,6 +456,7 @@ tastes = list("acid" = 3, "metal" = 4, "glass" = 5) foodtypes = GRAIN | GROSS slice_type = /obj/item/food/cakeslice/hardware_cake_slice + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cakeslice/hardware_cake_slice name = "hardware cake slice" @@ -438,6 +470,7 @@ ) tastes = list("acid" = 3, "metal" = 4, "glass" = 5) foodtypes = GRAIN | GROSS + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cake/vanilla_cake name = "vanilla cake" @@ -452,6 +485,7 @@ tastes = list("cake" = 1, "sugar" = 1, "vanilla" = 10) foodtypes = GRAIN | SUGAR | DAIRY slice_type = /obj/item/food/cakeslice/vanilla_slice + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cakeslice/vanilla_slice name = "vanilla cake slice" @@ -465,6 +499,7 @@ ) tastes = list("cake" = 1, "sugar" = 1, "vanilla" = 10) foodtypes = GRAIN | SUGAR | DAIRY + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cake/clown_cake name = "clown cake" @@ -478,6 +513,7 @@ tastes = list("cake" = 1, "sugar" = 1, "joy" = 10) foodtypes = GRAIN | SUGAR | DAIRY slice_type = /obj/item/food/cakeslice/clown_slice + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/cakeslice/clown_slice name = "clown cake slice" @@ -490,6 +526,7 @@ ) tastes = list("cake" = 1, "sugar" = 1, "joy" = 10) foodtypes = GRAIN | SUGAR | DAIRY + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/cake/trumpet name = "spaceman's cake" @@ -505,6 +542,7 @@ tastes = list("cake" = 4, "violets" = 2, "jam" = 2) foodtypes = GRAIN | DAIRY | FRUIT | SUGAR slice_type = /obj/item/food/cakeslice/trumpet + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/cakeslice/trumpet name = "spaceman's cake slice" @@ -519,6 +557,7 @@ ) tastes = list("cake" = 4, "violets" = 2, "jam" = 2) foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/cake/brioche name = "brioche cake" @@ -528,6 +567,7 @@ foodtypes = GRAIN | DAIRY | SUGAR slice_type = /obj/item/food/cakeslice/brioche yield = 6 + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/cakeslice/brioche name = "brioche cake slice" @@ -535,6 +575,7 @@ icon_state = "briochecake_slice" tastes = list("cake" = 4, "butter" = 2, "cream" = 1) foodtypes = GRAIN | DAIRY | SUGAR + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/cake/pavlova name = "pavlova" @@ -543,6 +584,7 @@ tastes = list("meringue" = 5, "creaminess" = 1, "berries" = 1) foodtypes = DAIRY | FRUIT | SUGAR slice_type = /obj/item/food/cakeslice/pavlova + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cake/pavlova/nuts name = "pavlova with nuts" @@ -556,6 +598,7 @@ icon_state = "pavlova_slice" tastes = list("meringue" = 5, "creaminess" = 1, "berries" = 1) foodtypes = DAIRY | FRUIT | SUGAR + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cakeslice/pavlova/nuts foodtypes = NUTS | FRUIT | SUGAR @@ -574,6 +617,7 @@ throwforce = 7 foodtypes = GRAIN | DAIRY | FRUIT | SUGAR slice_type = /obj/item/food/cakeslice/fruit + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/cakeslice/fruit name = "english fruitcake slice" @@ -584,6 +628,7 @@ force = 2 throwforce = 2 foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/cakeslice/fruit/Initialize(mapload) . = ..() @@ -602,6 +647,7 @@ foodtypes = GRAIN | DAIRY | FRUIT | SUGAR venue_value = FOOD_PRICE_CHEAP slice_type = /obj/item/food/cakeslice/plum + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cakeslice/plum name = "plum cake slice" @@ -609,6 +655,7 @@ icon_state = "plumcakeslice" tastes = list("cake" = 5, "sweetness" = 1, "plum" = 2) foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cake/wedding name = "wedding cake" @@ -622,6 +669,7 @@ tastes = list("cake" = 3, "frosting" = 1) foodtypes = GRAIN | DAIRY | SUGAR slice_type = /obj/item/food/cakeslice/wedding + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cakeslice/wedding name = "wedding cake slice" @@ -629,3 +677,30 @@ icon_state = "weddingcake_slice" tastes = list("cake" = 3, "frosting" = 1) foodtypes = GRAIN | DAIRY | SUGAR + +/obj/item/food/cake/pineapple_cream_cake + name = "pineapple cream cake" + desc = "A vibrant cake with a layer of thick cream and pineapple on top." + icon_state = "pineapple_cream_cake" + food_reagents = list( + /datum/reagent/consumable/nutriment = 30, + /datum/reagent/consumable/sugar = 15, + /datum/reagent/consumable/nutriment/vitamin = 15, + ) + tastes = list("cake" = 2, "cream" = 3, "pineapple" = 4) + foodtypes = GRAIN | DAIRY | SUGAR | FRUIT | PINEAPPLE + slice_type = /obj/item/food/cakeslice/pineapple_cream_cake + crafting_complexity = FOOD_COMPLEXITY_3 + +/obj/item/food/cakeslice/pineapple_cream_cake + name = "pineapple cream cake slice" + desc = "A vibrant cake with a layer of thick cream and pineapple on top." + icon_state = "pineapple_cream_cake_slice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/sugar = 3, + /datum/reagent/consumable/nutriment/vitamin = 3, + ) + tastes = list("cake" = 2, "cream" = 3, "pineapple" = 4) + foodtypes = GRAIN | DAIRY | SUGAR | FRUIT | PINEAPPLE + crafting_complexity = FOOD_COMPLEXITY_3 diff --git a/code/game/objects/items/food/cheese.dm b/code/game/objects/items/food/cheese.dm index 23c4d16b34faf..ac8817e8bb2d7 100644 --- a/code/game/objects/items/food/cheese.dm +++ b/code/game/objects/items/food/cheese.dm @@ -7,8 +7,9 @@ name = "the concept of cheese" desc = "This probably shouldn't exist." tastes = list("cheese" = 1) - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3) + food_reagents = list(/datum/reagent/consumable/nutriment/fat = 3) foodtypes = DAIRY + crafting_complexity = FOOD_COMPLEXITY_1 /// used to determine how much health rats/regal rats recover when they eat it. var/rat_heal = 0 @@ -16,34 +17,37 @@ . = ..() RegisterSignal(src, COMSIG_RAT_INTERACT, PROC_REF(on_rat_eat)) -/obj/item/food/cheese/proc/on_rat_eat(datum/source, mob/living/simple_animal/hostile/regalrat/king) +/obj/item/food/cheese/proc/on_rat_eat(datum/source, mob/living/basic/regal_rat/king) SIGNAL_HANDLER king.cheese_heal(src, rat_heal, span_green("You eat [src], restoring some health.")) + return COMPONENT_RAT_INTERACTED /obj/item/food/cheese/wedge name = "cheese wedge" desc = "A wedge of delicious Cheddar. The cheese wheel it was cut from can't have gone far." icon_state = "cheesewedge" food_reagents = list( - /datum/reagent/consumable/nutriment = 2, + /datum/reagent/consumable/nutriment/fat = 2, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 1, ) w_class = WEIGHT_CLASS_SMALL rat_heal = 10 + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/cheese/wheel name = "cheese wheel" desc = "A big wheel of delcious Cheddar." icon_state = "cheesewheel" food_reagents = list( - /datum/reagent/consumable/nutriment = 10, + /datum/reagent/consumable/nutriment/fat = 10, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 5, ) //Hard cheeses contain about 25% protein w_class = WEIGHT_CLASS_NORMAL rat_heal = 35 + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/cheese/wheel/Initialize(mapload) . = ..() @@ -55,12 +59,21 @@ /obj/item/food/cheese/wheel/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/baked_cheese, rand(20 SECONDS, 25 SECONDS), TRUE, TRUE) +/** + * Whiffs away cheese that was touched by the chaos entity byond the realm. In layman's terms, deletes the cheese and throws sparks. + * Used in wizard grand rituals' optional cheesy alternative. + */ +/obj/item/food/cheese/wheel/proc/consume_cheese() + visible_message(span_revenwarning("...and is consumed in a vortex of chaos!")) + do_sparks(number = 1, cardinal_only = TRUE, source = get_turf(src)) + qdel(src) + /obj/item/food/cheese/royal name = "royal cheese" desc = "Ascend the throne. Consume the wheel. Feel the POWER." icon_state = "royalcheese" food_reagents = list( - /datum/reagent/consumable/nutriment = 15, + /datum/reagent/consumable/nutriment/fat = 15, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/gold = 20, /datum/reagent/toxin/mutagen = 5, @@ -68,6 +81,7 @@ w_class = WEIGHT_CLASS_BULKY tastes = list("cheese" = 4, "royalty" = 1) rat_heal = 70 + crafting_complexity = FOOD_COMPLEXITY_3 //Curd cheese, a general term which I will now proceed to stretch as thin as the toppings on a supermarket sandwich: //I'll use it as a substitute for ricotta, cottage cheese and quark, as well as any other non-aged, soft grainy cheese @@ -83,6 +97,7 @@ foodtypes = DAIRY w_class = WEIGHT_CLASS_SMALL rat_heal = 35 + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/cheese/curd_cheese/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/cheese/cheese_curds, rand(15 SECONDS, 20 SECONDS), TRUE, TRUE) @@ -97,6 +112,7 @@ foodtypes = DAIRY w_class = WEIGHT_CLASS_SMALL rat_heal = 35 + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/cheese/cheese_curds/Initialize(mapload) . = ..() @@ -110,6 +126,7 @@ foodtypes = DAIRY | VEGETABLES w_class = WEIGHT_CLASS_SMALL rat_heal = 35 + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cheese/firm_cheese/make_processable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cheese/firm_cheese_slice, 3, 3 SECONDS, screentip_verb = "Slice") @@ -121,8 +138,8 @@ tastes = list("aged cheese" = 1) foodtypes = DAIRY | VEGETABLES w_class = WEIGHT_CLASS_SMALL - burns_on_grill = TRUE rat_heal = 10 + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cheese/firm_cheese_slice/make_grillable() AddComponent(/datum/component/grillable, /obj/item/food/grilled_cheese, rand(25 SECONDS, 35 SECONDS), TRUE, TRUE) @@ -135,3 +152,4 @@ foodtypes = DAIRY w_class = WEIGHT_CLASS_SMALL rat_heal = 10 + crafting_complexity = FOOD_COMPLEXITY_2 diff --git a/code/game/objects/items/food/donkpocket.dm b/code/game/objects/items/food/donkpocket.dm index 24622fccf9999..f2495e0ee52ff 100644 --- a/code/game/objects/items/food/donkpocket.dm +++ b/code/game/objects/items/food/donkpocket.dm @@ -12,6 +12,7 @@ foodtypes = GRAIN food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /// What type of donk pocket we're warmed into via baking or microwaving. var/warm_type = /obj/item/food/donkpocket/warm @@ -53,6 +54,7 @@ ) tastes = list("meat" = 2, "dough" = 2) foodtypes = GRAIN | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/donkpocket/spicy name = "\improper Spicy-pocket" @@ -142,8 +144,8 @@ ) tastes = list("banana" = 2, "dough" = 2, "children's antibiotics" = 1) foodtypes = GRAIN - warm_type = /obj/item/food/donkpocket/warm/honk + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/donkpocket/warm/honk name = "warm Honk-pocket" @@ -157,6 +159,7 @@ ) tastes = list("banana" = 2, "dough" = 2, "children's antibiotics" = 1) foodtypes = GRAIN + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/donkpocket/berry name = "\improper Berry-pocket" @@ -168,7 +171,6 @@ ) tastes = list("dough" = 2, "jam" = 2) foodtypes = GRAIN - warm_type = /obj/item/food/donkpocket/warm/berry /obj/item/food/donkpocket/warm/berry diff --git a/code/game/objects/items/food/donuts.dm b/code/game/objects/items/food/donuts.dm index 53bc493776a3e..0d2e2f91d3008 100644 --- a/code/game/objects/items/food/donuts.dm +++ b/code/game/objects/items/food/donuts.dm @@ -4,16 +4,19 @@ name = "donut" desc = "Goes great with robust coffee." icon = 'icons/obj/food/donuts.dmi' + inhand_icon_state = "donut1" bite_consumption = 5 food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/sugar = 3) tastes = list("donut" = 1) - foodtypes = JUNKFOOD | GRAIN | FRIED | SUGAR | BREAKFAST + foodtypes = JUNKFOOD | GRAIN | SUGAR | BREAKFAST food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 var/decorated_icon = "donut_homer" var/is_decorated = FALSE var/extra_reagent = null var/decorated_adjective = "sprinkled" + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/donut/Initialize(mapload) . = ..() @@ -32,6 +35,7 @@ is_decorated = TRUE name = "[decorated_adjective] [name]" icon_state = decorated_icon //delish~! + inhand_icon_state = "donut2" reagents.add_reagent(/datum/reagent/consumable/sprinkles, 1) return TRUE @@ -40,7 +44,7 @@ return "[icon_state]_inbox" ///Override for checkliked in edible component, because all cops LOVE donuts -/obj/item/food/donut/proc/check_liked(fraction, mob/living/carbon/human/consumer) +/obj/item/food/donut/proc/check_liked(mob/living/carbon/human/consumer) var/obj/item/organ/internal/liver/liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER) if(!HAS_TRAIT(consumer, TRAIT_AGEUSIA) && liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) return FOOD_LIKED @@ -56,6 +60,7 @@ bite_consumption = 10 tastes = list("donut" = 3, "chaos" = 1) is_decorated = TRUE + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/donut/chaos/Initialize(mapload) . = ..() @@ -85,6 +90,7 @@ tastes = list("meat" = 1) foodtypes = JUNKFOOD | MEAT | GORE | FRIED | BREAKFAST is_decorated = TRUE + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/donut/berry name = "pink donut" @@ -109,6 +115,7 @@ ) tastes = list("donut" = 3, "violets" = 1) is_decorated = TRUE + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/donut/apple name = "apple donut" @@ -148,6 +155,7 @@ ) //the coco reagent is just bitter. tastes = list("donut" = 4, "bitterness" = 1) decorated_icon = "donut_choc_sprinkles" + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/donut/blumpkin name = "blumpkin donut" @@ -161,6 +169,7 @@ ) tastes = list("donut" = 2, "blumpkin" = 1) is_decorated = TRUE + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/donut/bungo name = "bungo donut" @@ -199,6 +208,7 @@ ) tastes = list("donut" = 3, "fizzy tutti frutti" = 1,) is_decorated = TRUE + crafting_complexity = FOOD_COMPLEXITY_3 //////////////////////JELLY DONUTS///////////////////////// @@ -247,6 +257,7 @@ ) tastes = list("jelly" = 1, "donut" = 3, "violets" = 1) is_decorated = TRUE + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/donut/jelly/apple name = "apple jelly donut" @@ -289,6 +300,7 @@ ) tastes = list("jelly" = 1, "donut" = 4, "bitterness" = 1) decorated_icon = "jelly_choc_sprinkles" + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/donut/jelly/blumpkin name = "blumpkin jelly donut" @@ -303,6 +315,7 @@ ) tastes = list("jelly" = 1, "donut" = 2, "blumpkin" = 1) is_decorated = TRUE + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/donut/jelly/bungo name = "bungo jelly donut" @@ -343,6 +356,7 @@ ) tastes = list("jelly" = 3, "donut" = 1, "fizzy tutti frutti" = 1) is_decorated = TRUE + crafting_complexity = FOOD_COMPLEXITY_3 //////////////////////////SLIME DONUTS///////////////////////// @@ -379,6 +393,7 @@ ) tastes = list("jelly" = 1, "donut" = 3, "violets" = 1) is_decorated = TRUE + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/donut/jelly/slimejelly/apple name = "apple jelly donut" @@ -421,6 +436,7 @@ ) tastes = list("jelly" = 1, "donut" = 4, "bitterness" = 1) decorated_icon = "jelly_choc_sprinkles" + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/donut/jelly/slimejelly/blumpkin name = "blumpkin jelly donut" @@ -435,6 +451,7 @@ ) tastes = list("jelly" = 1, "donut" = 2, "blumpkin" = 1) is_decorated = TRUE + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/donut/jelly/slimejelly/bungo name = "bungo jelly donut" @@ -475,5 +492,6 @@ ) tastes = list("jelly" = 3, "donut" = 1, "fizzy tutti frutti" = 1) is_decorated = TRUE + crafting_complexity = FOOD_COMPLEXITY_3 #undef DONUT_SPRINKLE_CHANCE diff --git a/code/game/objects/items/food/dough.dm b/code/game/objects/items/food/dough.dm index 28363b3f9f9a4..6ca618bc6e0cb 100644 --- a/code/game/objects/items/food/dough.dm +++ b/code/game/objects/items/food/dough.dm @@ -8,6 +8,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 6) tastes = list("dough" = 1) foodtypes = GRAIN + crafting_complexity = FOOD_COMPLEXITY_0 /obj/item/food/dough/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/bread/plain, rand(30 SECONDS, 45 SECONDS), TRUE, TRUE) @@ -24,6 +25,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 6) tastes = list("dough" = 1) foodtypes = GRAIN + crafting_complexity = FOOD_COMPLEXITY_0 /obj/item/food/flatdough/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/pizzabread, rand(30 SECONDS, 45 SECONDS), TRUE, TRUE) @@ -40,7 +42,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 7) tastes = list("bread" = 1) foodtypes = GRAIN - burns_in_oven = TRUE + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/pizzabread/Initialize(mapload) . = ..() @@ -55,6 +57,7 @@ w_class = WEIGHT_CLASS_SMALL tastes = list("dough" = 1) foodtypes = GRAIN + crafting_complexity = FOOD_COMPLEXITY_0 /obj/item/food/doughslice/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/bun, rand(20 SECONDS, 25 SECONDS), TRUE, TRUE) @@ -71,7 +74,7 @@ w_class = WEIGHT_CLASS_SMALL tastes = list("bun" = 1) // the bun tastes of bun. foodtypes = GRAIN - burns_in_oven = TRUE + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/bun/Initialize(mapload) . = ..() @@ -85,6 +88,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 9) tastes = list("batter" = 1) foodtypes = GRAIN | DAIRY + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/cakebatter/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/cake/plain, rand(70 SECONDS, 90 SECONDS), TRUE, TRUE) @@ -100,6 +104,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 9) tastes = list("dough" = 1) foodtypes = GRAIN | DAIRY + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/piedough/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/pie/plain, rand(30 SECONDS, 45 SECONDS), TRUE, TRUE) @@ -116,6 +121,7 @@ w_class = WEIGHT_CLASS_SMALL tastes = list("raw pastry" = 1) foodtypes = GRAIN | DAIRY + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/rawpastrybase/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/pastrybase, rand(20 SECONDS, 25 SECONDS), TRUE, TRUE) @@ -129,4 +135,4 @@ w_class = WEIGHT_CLASS_SMALL tastes = list("pastry" = 1) foodtypes = GRAIN | DAIRY - burns_in_oven = TRUE + crafting_complexity = FOOD_COMPLEXITY_2 diff --git a/code/game/objects/items/food/egg.dm b/code/game/objects/items/food/egg.dm index a93ba6e3cd17f..555b16e24b69e 100644 --- a/code/game/objects/items/food/egg.dm +++ b/code/game/objects/items/food/egg.dm @@ -11,6 +11,7 @@ foodtypes = JUNKFOOD | SUGAR food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_TINY + crafting_complexity = FOOD_COMPLEXITY_2 /// Counter for number of chicks hatched by throwing eggs, minecraft style. Chicks will not emerge from thrown eggs if this value exceeds the MAX_CHICKENS define. GLOBAL_VAR_INIT(chicks_from_eggs, 0) @@ -35,6 +36,11 @@ GLOBAL_VAR_INIT(chicks_from_eggs, 0) /obj/item/food/egg/make_microwaveable() AddElement(/datum/element/microwavable, /obj/item/food/boiledegg) +/obj/item/food/egg/organic + name = "organic egg" + desc = "A 100% natural egg from the best hens." + starting_reagent_purity = 1 + /obj/item/food/egg/rotten food_reagents = list(/datum/reagent/consumable/eggrot = 10, /datum/reagent/consumable/mold = 10) foodtypes = GROSS @@ -162,6 +168,10 @@ GLOBAL_VAR_INIT(chicks_from_eggs, 0) icon_state = "egg-yellow" inhand_icon_state = "egg-yellow" +/obj/item/food/egg/penguin_egg + icon = 'icons/mob/simple/penguins.dmi' + icon_state = "penguin_egg" + /obj/item/food/egg/fertile name = "fertile-looking egg" desc = "An egg! It looks fertilized.\nQuite how you can tell this just by looking at it is a mystery." @@ -194,7 +204,7 @@ GLOBAL_VAR_INIT(chicks_from_eggs, 0) tastes = list("egg" = 4) foodtypes = MEAT | FRIED | BREAKFAST w_class = WEIGHT_CLASS_SMALL - burns_on_grill = TRUE + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/rawegg name = "raw egg" @@ -227,6 +237,7 @@ GLOBAL_VAR_INIT(chicks_from_eggs, 0) w_class = WEIGHT_CLASS_SMALL ant_attracting = FALSE decomp_type = /obj/item/food/boiledegg/rotten + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/eggsausage name = "egg with sausage" @@ -237,6 +248,7 @@ GLOBAL_VAR_INIT(chicks_from_eggs, 0) foodtypes = MEAT | FRIED | BREAKFAST tastes = list("egg" = 4, "meat" = 4) venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/boiledegg/rotten food_reagents = list(/datum/reagent/consumable/eggrot = 10) @@ -258,6 +270,7 @@ GLOBAL_VAR_INIT(chicks_from_eggs, 0) tastes = list("egg" = 1, "cheese" = 1) foodtypes = MEAT | BREAKFAST | DAIRY venue_value = FOOD_PRICE_CHEAP + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/omelette/attackby(obj/item/item, mob/user, params) if(istype(item, /obj/item/kitchen/fork)) @@ -291,6 +304,7 @@ GLOBAL_VAR_INIT(chicks_from_eggs, 0) tastes = list("egg" = 1, "bacon" = 1, "bun" = 1) foodtypes = MEAT | BREAKFAST | GRAIN venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/eggwrap name = "egg wrap" @@ -305,6 +319,7 @@ GLOBAL_VAR_INIT(chicks_from_eggs, 0) tastes = list("egg" = 1) foodtypes = MEAT | VEGETABLES w_class = WEIGHT_CLASS_TINY + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/chawanmushi name = "chawanmushi" @@ -318,3 +333,4 @@ GLOBAL_VAR_INIT(chicks_from_eggs, 0) ) tastes = list("custard" = 1) foodtypes = MEAT | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_3 diff --git a/code/game/objects/items/food/frozen.dm b/code/game/objects/items/food/frozen.dm index 3c0c27a2695ce..8951165aa8082 100644 --- a/code/game/objects/items/food/frozen.dm +++ b/code/game/objects/items/food/frozen.dm @@ -11,6 +11,7 @@ tastes = list("ice cream" = 1) foodtypes = GRAIN | DAIRY | SUGAR food_flags = FOOD_FINGER_FOOD + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/strawberryicecreamsandwich name = "strawberry ice cream sandwich" @@ -25,6 +26,7 @@ tastes = list("ice cream" = 2, "berry" = 2) foodtypes = FRUIT | DAIRY | SUGAR food_flags = FOOD_FINGER_FOOD + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/spacefreezy @@ -40,6 +42,7 @@ ) tastes = list("blue cherries" = 2, "ice cream" = 2) foodtypes = FRUIT | DAIRY | SUGAR + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/spacefreezy/make_edible() . = ..() @@ -58,6 +61,7 @@ ) tastes = list("ice cream" = 1, "banana" = 1) foodtypes = FRUIT | DAIRY | SUGAR + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/sundae/make_edible() . = ..() @@ -76,6 +80,7 @@ ) tastes = list("ice cream" = 1, "banana" = 1, "a bad joke" = 1) foodtypes = FRUIT | DAIRY | SUGAR + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/honkdae/make_edible() . = ..() @@ -98,6 +103,7 @@ tastes = list("ice" = 1, "water" = 1) foodtypes = SUGAR //We use SUGAR as a base line to act in as junkfood, other wise we use fruit food_flags = FOOD_FINGER_FOOD + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/snowcones/lime name = "lime snowcone" @@ -293,6 +299,7 @@ ) tastes = list("ice" = 1, "water" = 1, "flowers" = 5, "sweetness" = 5, "wax" = 1) foodtypes = SUGAR + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/snowcones/rainbow name = "rainbow snowcone" @@ -322,6 +329,7 @@ w_class = WEIGHT_CLASS_SMALL foodtypes = DAIRY | SUGAR food_flags = FOOD_FINGER_FOOD + crafting_complexity = FOOD_COMPLEXITY_3 var/overlay_state = "creamsicle_o" //This is the edible part of the popsicle. var/bite_states = 4 //This value value is used for correctly setting the bite_consumption to ensure every bite changes the sprite. Do not set to zero. @@ -368,6 +376,7 @@ /datum/reagent/consumable/sugar = 4, ) foodtypes = FRUIT | DAIRY | SUGAR | ORANGES + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/popsicle/creamsicle_berry name = "berry creamsicle" @@ -380,6 +389,7 @@ ) overlay_state = "creamsicle_m" foodtypes = FRUIT | DAIRY | SUGAR + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/popsicle/jumbo name = "jumbo ice cream" @@ -391,6 +401,7 @@ /datum/reagent/consumable/sugar = 2, ) overlay_state = "jumbo" + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/popsicle/licorice_creamsicle name = "Void Bar™" @@ -404,6 +415,7 @@ ) tastes = list("salty liquorice") overlay_state = "licorice_creamsicle" + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/cornuto name = "cornuto" @@ -421,3 +433,4 @@ tastes = list("chopped hazelnuts", "waffle") foodtypes = DAIRY | SUGAR venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_3 diff --git a/code/game/objects/items/food/lizard.dm b/code/game/objects/items/food/lizard.dm index 6975991ea24bb..e6a7bb7375384 100644 --- a/code/game/objects/items/food/lizard.dm +++ b/code/game/objects/items/food/lizard.dm @@ -15,6 +15,7 @@ tastes = list("meat" = 1, "black pudding" = 1) foodtypes = MEAT w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/raw_tiziran_sausage/Initialize(mapload) . = ..() @@ -32,6 +33,7 @@ tastes = list("meat" = 1, "black pudding" = 1) foodtypes = MEAT w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/raw_headcheese name = "raw headcheese block" @@ -45,6 +47,7 @@ tastes = list("meat" = 1, "salt" = 1) foodtypes = MEAT | GORE w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/raw_headcheese/Initialize(mapload) . = ..() @@ -62,6 +65,7 @@ tastes = list("cheese" = 1, "salt" = 1) foodtypes = MEAT | GORE w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/headcheese/make_processable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/headcheese_slice, 5, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice") @@ -78,6 +82,7 @@ tastes = list("cheese" = 1, "salt" = 1) foodtypes = MEAT | GORE w_class = WEIGHT_CLASS_TINY + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/shredded_lungs name = "crispy shredded lung stirfry" @@ -93,6 +98,7 @@ foodtypes = MEAT | VEGETABLES | GORE trash_type = /obj/item/reagent_containers/cup/bowl w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/tsatsikh name = "tsatsikh" @@ -103,6 +109,7 @@ tastes = list("assorted minced organs" = 1) foodtypes = MEAT | GORE w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/liver_pate name = "liver pate" @@ -113,6 +120,7 @@ tastes = list("liver" = 1) foodtypes = MEAT w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/moonfish_eggs name = "moonfish eggs" @@ -126,6 +134,7 @@ tastes = list("caviar" = 1) foodtypes = SEAFOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/moonfish_caviar name = "moonfish caviar paste" @@ -139,6 +148,7 @@ tastes = list("caviar" = 1) foodtypes = SEAFOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/lizard_escargot name = "desert snail cocleas" @@ -153,6 +163,7 @@ tastes = list("snails" = 1, "garlic" = 1, "oil" = 1) foodtypes = MEAT | VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/fried_blood_sausage name = "fried blood sausage" @@ -163,11 +174,12 @@ /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/salt = 1, - /datum/reagent/consumable/cooking_oil = 1, + /datum/reagent/consumable/nutriment/fat/oil = 1, ) tastes = list("black pudding" = 1, "batter" = 1, "oil" = 1) foodtypes = MEAT | FRIED w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 //Why does like, every language on the planet besides English call them pommes? Who knows, who cares- the lizards call them it too, because funny. /obj/item/food/lizard_fries @@ -184,6 +196,7 @@ tastes = list("fries" = 2, "bbq sauce" = 1, "barbecued meat" = 1) foodtypes = MEAT | VEGETABLES | FRIED w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/brain_pate name = "eyeball-and-brain pate" @@ -197,6 +210,7 @@ tastes = list("brains" = 2) foodtypes = MEAT | VEGETABLES | GORE w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/crispy_headcheese name = "crispy breaded headcheese" @@ -206,11 +220,12 @@ food_reagents = list( /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment = 3, - /datum/reagent/consumable/cooking_oil = 2, + /datum/reagent/consumable/nutriment/fat/oil = 2, ) tastes = list("cheese" = 1, "oil" = 1) foodtypes = MEAT | VEGETABLES | NUTS | GORE w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/kebab/picoss_skewers name = "picoss skewer" @@ -226,6 +241,7 @@ tastes = list("fish" = 1, "acid" = 1, "onion" = 1, "heat" = 1) foodtypes = SEAFOOD | VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/nectar_larvae name = "nectar larvae" @@ -240,6 +256,7 @@ tastes = list("meat" = 1, "sweet" = 1, "heat" = 1) foodtypes = GORE | MEAT | BUGS w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/mushroomy_stirfry name = "mushroomy stirfry" @@ -253,6 +270,7 @@ tastes = list("marvelous mushrooms" = 1, "sublime shrooms" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 //Fish Dishes /obj/item/food/grilled_moonfish @@ -266,8 +284,8 @@ ) tastes = list("fish" = 1) foodtypes = SEAFOOD - burns_on_grill = TRUE w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/moonfish_demiglace name = "moonfish demiglace" @@ -282,6 +300,7 @@ tastes = list("fish" = 2, "potatoes" = 1, "carrots" = 1) foodtypes = SEAFOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/lizard_surf_n_turf name = "\improper Zagosk surf 'n' turf smorgasbord" @@ -296,6 +315,7 @@ tastes = list("surf" = 1, "turf" = 1) foodtypes = MEAT | SEAFOOD | VEGETABLES w_class = WEIGHT_CLASS_BULKY + crafting_complexity = FOOD_COMPLEXITY_5 //Spaghetti Dishes @@ -310,6 +330,7 @@ ) tastes = list("gnocchi" = 1) foodtypes = VEGETABLES | NUTS + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/spaghetti/snail_nizaya name = "desert snail nizaya" @@ -323,6 +344,7 @@ ) tastes = list("snails" = 1, "wine" = 1, "gnocchi" = 1) foodtypes = VEGETABLES | MEAT | NUTS + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/spaghetti/garlic_nizaya name = "garlic-and-oil nizaya" @@ -335,6 +357,7 @@ ) tastes = list("garlic" = 1, "oil" = 1, "gnocchi" = 1) foodtypes = VEGETABLES | NUTS + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/spaghetti/demit_nizaya name = "demit nizaya" @@ -348,6 +371,7 @@ ) tastes = list("peppery sweet" = 1, "veggies" = 1, "gnocchi" = 1) foodtypes = VEGETABLES | SUGAR | NUTS + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/spaghetti/mushroom_nizaya name = "mushroom nizaya" @@ -360,6 +384,7 @@ ) tastes = list("savouriness" = 1, "nuttiness" = 1, "gnocchi" = 1) foodtypes = VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_4 //Dough Dishes @@ -372,6 +397,7 @@ w_class = WEIGHT_CLASS_SMALL tastes = list("potato" = 1, "earthy heat" = 1) foodtypes = VEGETABLES | NUTS + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/rootdough/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/bread/root, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) @@ -387,6 +413,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 6) tastes = list("potato" = 1, "earthy heat" = 1) foodtypes = VEGETABLES | NUTS + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/flatrootdough/make_processable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/rootdoughslice, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice") @@ -403,6 +430,7 @@ w_class = WEIGHT_CLASS_SMALL tastes = list("potato" = 1, "earthy heat" = 1) foodtypes = VEGETABLES | NUTS + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/rootdoughslice/make_processable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/spaghetti/nizaya, 1, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice") @@ -418,7 +446,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 8) tastes = list("bread" = 1, "earthy heat" = 1) foodtypes = VEGETABLES | NUTS - burns_on_grill = TRUE + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/rootroll name = "rootroll" @@ -429,7 +457,7 @@ w_class = WEIGHT_CLASS_SMALL tastes = list("roll" = 1) // the roll tastes of roll. foodtypes = VEGETABLES | NUTS - burns_in_oven = TRUE + crafting_complexity = FOOD_COMPLEXITY_2 //Bread Dishes @@ -443,7 +471,6 @@ foodtypes = VEGETABLES | NUTS w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_CHEAP - burns_in_oven = TRUE slice_type = /obj/item/food/breadslice/root /obj/item/food/bread/root/Initialize(mapload) @@ -481,6 +508,7 @@ tastes = list("bread" = 1, "herb" = 1, "oil" = 1, "garlic" = 1) foodtypes = VEGETABLES | NUTS boxtag = "Tiziran Flatbread" + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pizza/flatbread/italic name = "\improper Italic flatbread" @@ -494,6 +522,7 @@ tastes = list("bread" = 1, "herb" = 1, "oil" = 1, "garlic" = 1, "tomato" = 1, "meat" = 1) foodtypes = VEGETABLES | NUTS | MEAT boxtag = "Italic Flatbread" + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/pizza/flatbread/imperial name = "\improper Imperial flatbread" @@ -507,6 +536,7 @@ tastes = list("bread" = 1, "herb" = 1, "oil" = 1, "garlic" = 1, "tomato" = 1, "meat" = 1) foodtypes = VEGETABLES | MEAT | NUTS | GORE boxtag = "Imperial Victory Flatbread" + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/pizza/flatbread/rawmeat name = "meatlovers flatbread" @@ -518,6 +548,7 @@ ) tastes = list("bread" = 1, "meat" = 1) foodtypes = MEAT | NUTS | RAW | GORE + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pizza/flatbread/stinging name = "\improper Stinging flatbread" @@ -530,6 +561,7 @@ ) tastes = list("bread" = 1, "sweetness" = 1, "stinging" = 1, "slime" = 1) foodtypes = BUGS | NUTS | SEAFOOD | GORE + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pizza/flatbread/zmorgast // Name is based off of the Swedish dish Smörgåstårta name = "\improper Zmorgast flatbread" @@ -542,6 +574,7 @@ ) tastes = list("bread" = 1, "liver" = 1, "family" = 1) foodtypes = VEGETABLES | NUTS | MEAT + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pizza/flatbread/fish name = "\improper BBQ fish flatbread" @@ -554,6 +587,7 @@ ) tastes = list("bread" = 1, "fish" = 1) foodtypes = SEAFOOD | NUTS + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/pizza/flatbread/mushroom name = "mushroom and tomato flatbread" @@ -565,6 +599,7 @@ ) tastes = list("bread" = 1, "mushroom" = 1, "tomatoes" = 1) foodtypes = VEGETABLES | NUTS + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/pizza/flatbread/nutty name = "nut paste flatbread" @@ -573,6 +608,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 20) tastes = list("bread" = 1, "nuts" = 2) foodtypes = NUTS + crafting_complexity = FOOD_COMPLEXITY_3 //Sandwiches/Toast Dishes /obj/item/food/emperor_roll @@ -589,6 +625,7 @@ foodtypes = VEGETABLES | NUTS | MEAT | GORE | SEAFOOD food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/honey_roll name = "honey sweetroll" @@ -604,6 +641,7 @@ foodtypes = VEGETABLES | NUTS | FRUIT food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_4 //Egg Dishes /obj/item/food/black_eggs @@ -618,6 +656,7 @@ tastes = list("eggs" = 1, "greens" = 1, "blood" = 1) foodtypes = MEAT | BREAKFAST | GORE w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/patzikula name = "patzikula" @@ -633,6 +672,7 @@ tastes = list("eggs" = 1, "tomato" = 1, "heat" = 1) foodtypes = VEGETABLES | MEAT | BREAKFAST w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 //Cakes/Sweets @@ -649,6 +689,7 @@ tastes = list("peppery heat" = 1, "sweetness" = 1) foodtypes = NUTS | SUGAR slice_type = /obj/item/food/cakeslice/korta_brittle + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cakeslice/korta_brittle name = "korta brittle slice" @@ -688,6 +729,7 @@ ) tastes = list("savouriness" = 1, "sweetness" = 1) foodtypes = SUGAR | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_2 //Misc Dishes /obj/item/food/sauerkraut @@ -699,6 +741,7 @@ tastes = list("cabbage" = 1, "acid" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/lizard_dumplings name = "\improper Tiziran dumplings" @@ -712,6 +755,7 @@ tastes = list("potato" = 1, "earthy heat" = 1) foodtypes = VEGETABLES | NUTS w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/steeped_mushrooms name = "steeped seraka mushrooms" @@ -725,6 +769,7 @@ tastes = list("savouriness" = 1, "nuttiness" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/canned/jellyfish name = "canned gunner jellyfish" diff --git a/code/game/objects/items/food/martian.dm b/code/game/objects/items/food/martian.dm new file mode 100644 index 0000000000000..eaf0f172dcfed --- /dev/null +++ b/code/game/objects/items/food/martian.dm @@ -0,0 +1,1259 @@ +//Ingredients and Simple Dishes +/obj/item/food/kimchi + name = "kimchi" + desc = "A classic Korean dish in the Martian style- shredded cabbage with chilli peppers, konbu, bonito, and a mix of spices." + icon = 'icons/obj/food/martian.dmi' + icon_state = "kimchi" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 3, + /datum/reagent/consumable/capsaicin = 1, + ) + tastes = list("spicy cabbage" = 1) + foodtypes = VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/inferno_kimchi + name = "inferno kimchi" + desc = "For when ordinary kimchi just can't scratch your itch for insane heat, inferno kimchi picks up the slack." + icon = 'icons/obj/food/martian.dmi' + icon_state = "inferno_kimchi" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 3, + /datum/reagent/consumable/capsaicin = 3, + ) + tastes = list("very spicy cabbage" = 1) + foodtypes = VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/garlic_kimchi + name = "garlic kimchi" + desc = "A new twist on a classic formula- kimchi and garlic, finally together in perfect harmony." + icon = 'icons/obj/food/martian.dmi' + icon_state = "garlic_kimchi" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 3, + /datum/reagent/consumable/capsaicin = 1, + /datum/reagent/consumable/garlic = 2, + ) + tastes = list("spicy cabbage" = 1, "garlic" = 1) + foodtypes = VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/surimi + name = "surimi" + desc = "A portion of uncured fish surimi." + icon = 'icons/obj/food/martian.dmi' + icon_state = "surimi" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 4, + /datum/reagent/consumable/nutriment/vitamin = 2, + ) + tastes = list("fish" = 1) + foodtypes = SEAFOOD + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/surimi/Initialize(mapload) + . = ..() + AddElement(/datum/element/dryable, /obj/item/food/kamaboko) + +/obj/item/food/kamaboko + name = "kamaboko" + desc = "A Japanese-style cured fishcake frequently used in snacks and ramen." + icon = 'icons/obj/food/martian.dmi' + icon_state = "kamaboko_sunrise" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 4, + /datum/reagent/consumable/nutriment/vitamin = 4, + ) + tastes = list("fish" = 1) + foodtypes = SEAFOOD + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/kamaboko/Initialize(mapload) + . = ..() + var/design = pick("smiling", "spiral", "star", "sunrise") + name = "[design] kamaboko" + icon_state = "kamaboko_[design]" + +/obj/item/food/kamaboko/make_processable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/kamaboko_slice, 4, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut") + +/obj/item/food/kamaboko_slice + name = "kamaboko slice" + desc = "A slice of fishcake. Goes good in ramen." + icon = 'icons/obj/food/martian.dmi' + icon_state = "kamaboko_slice" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 1, + /datum/reagent/consumable/nutriment/vitamin = 1, + ) + tastes = list("fish" = 1) + foodtypes = SEAFOOD + w_class = WEIGHT_CLASS_TINY + +/obj/item/food/sambal + name = "sambal" + desc = "A spice paste from Indonesia, used widely in cooking throughout South East Asia." + icon = 'icons/obj/food/martian.dmi' + icon_state = "sambal" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 5, + /datum/reagent/consumable/capsaicin = 2 + ) + tastes = list("chilli heat" = 1, "umami" = 1) + foodtypes = SEAFOOD | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/katsu_fillet + name = "katsu fillet" + desc = "Breaded and deep fried meat, used for a variety of dishes." + icon = 'icons/obj/food/martian.dmi' + icon_state = "katsu_fillet" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 2, + /datum/reagent/consumable/nutriment = 2 + ) + tastes = list("meat" = 1, "breadcrumbs" = 1) + foodtypes = MEAT | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/rice_dough + name = "rice dough" + desc = "A piece of dough made with equal parts rice flour and wheat flour, for a unique flavour." + icon = 'icons/obj/food/martian.dmi' + icon_state = "rice_dough" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6 + ) + tastes = list("rice" = 1) + foodtypes = GRAIN + +/obj/item/food/rice_dough/make_bakeable() + AddComponent(/datum/component/bakeable, /obj/item/food/bread/reispan, rand(30 SECONDS, 45 SECONDS), TRUE, TRUE) + +/obj/item/food/rice_dough/make_processable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/spaghetti/rawnoodles, 6, 3 SECONDS, table_required = TRUE) + +/obj/item/food/spaghetti/rawnoodles + name = "fresh noodles" + desc = "Rice noodles, made fresh. Remember, there is no secret ingredient." + icon = 'icons/obj/food/martian.dmi' + icon_state = "raw_noodles" + + food_reagents = list( + /datum/reagent/consumable/nutriment = 3 + ) + tastes = list("rice" = 1) + foodtypes = GRAIN + +/obj/item/food/spaghetti/boilednoodles + name = "cooked noodles" + desc = "Cooked fresh to order." + icon = 'icons/obj/food/martian.dmi' + icon_state = "cooked_noodles" + food_reagents = list( + /datum/reagent/consumable/nutriment = 3 + ) + tastes = list("rice" = 1) + foodtypes = GRAIN + +/obj/item/food/bread/reispan + name = "reispan" + desc = "Though the concept of rice bread has been common in Asia for centuries, the reispan as we know it today is most commonly associated with Mars- where limited arable land has forced ingenuity." + icon = 'icons/obj/food/martian.dmi' + icon_state = "reispan" + food_reagents = list( + /datum/reagent/consumable/nutriment = 15 + ) + tastes = list("bread" = 10) + foodtypes = GRAIN + venue_value = FOOD_PRICE_TRASH + +/obj/item/food/bread/reispan/make_processable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/reispan, 5, 3 SECONDS, table_required = TRUE) + +/obj/item/food/breadslice/reispan + name = "reispan slice" + desc = "A slice of reispan, for use in Martian-style sandwiches." + icon = 'icons/obj/food/martian.dmi' + icon_state = "reispan_slice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 3 + ) + foodtypes = GRAIN | VEGETABLES + +// Fried Rice + +/obj/item/food/salad/hurricane_rice + name = "hurricane fried rice" + desc = "Inspired by nasi goreng, this piquant rice dish comes straight from Prospect, on Mars, and its night markets. It's named for its distinctive cooking style, where the frying rice is given lots of airtime while being flipped, mostly because it looks really cool for the customers." + icon = 'icons/obj/food/martian.dmi' + icon_state = "hurricane_rice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 10, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 10, + ) + tastes = list("rice" = 1, "meat" = 1, "pineapple" = 1, "veggies" = 1) + foodtypes = MEAT | GRAIN | PINEAPPLE | FRUIT | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/ikareis + name = "ikareis" + desc = "A spicy rice dish made with squid-ink, peppers, onions, sausage, and flavourful chillis." + icon = 'icons/obj/food/martian.dmi' + icon_state = "ikareis" + food_reagents = list( + /datum/reagent/consumable/nutriment = 10, + /datum/reagent/consumable/nutriment/protein = 10, + /datum/reagent/consumable/nutriment/vitamin = 6, + /datum/reagent/consumable/capsaicin = 4 + ) + tastes = list("rice" = 1, "squid ink" = 1, "veggies" = 1, "sausage" = 1, "chilli heat" = 1) + foodtypes = MEAT | GRAIN | SEAFOOD | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/hawaiian_fried_rice + name = "\improper Hawaiian fried rice" + desc = "Not a traditional Hawaiian dish, Hawaiian fried rice instead utilises a pastiche of Hawaiian ingredients- including diced Chap and, controversially, pineapple. Purists are split on whether pineapple belongs in rice." + icon = 'icons/obj/food/martian.dmi' + icon_state = "hawaiian_fried_rice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 10, + /datum/reagent/consumable/nutriment/protein = 10, + /datum/reagent/consumable/nutriment/vitamin = 8, + ) + tastes = list("rice" = 1, "pork" = 1, "pineapple" = 1, "soy sauce" = 1, "veggies" = 1) + foodtypes = MEAT | GRAIN | VEGETABLES | FRUIT | PINEAPPLE + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/ketchup_fried_rice + name = "ketchup fried rice" + desc = "A classic Japanese comfort food, made with sausage, veggies, worchestershire sauce, rice- oh, and of course, ketchup." + icon = 'icons/obj/food/martian.dmi' + icon_state = "ketchup_fried_rice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 10, + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 8, + /datum/reagent/consumable/ketchup = 2, + ) + tastes = list("rice" = 1, "sausage" = 1, "ketchup" = 1, "veggies" = 1) + foodtypes = MEAT | GRAIN | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/mediterranean_fried_rice + name = "mediterranean fried rice" + desc = "A strange take on the fried rice formula: herbs, cheese, olives, and of course, meatballs. Sorta like a hybrid of risotto and fried rice." + icon = 'icons/obj/food/martian.dmi' + icon_state = "mediterranean_fried_rice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 8, + /datum/reagent/consumable/nutriment/protein = 10, + /datum/reagent/consumable/nutriment/vitamin = 10, + ) + tastes = list("rice" = 1, "cheese" = 1, "meatball" = 1, "olives" = 1, "herbs" = 1) + foodtypes = MEAT | GRAIN | VEGETABLES | DAIRY + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/egg_fried_rice + name = "egg fried rice" + desc = "As simple as fried rice gets: rice, egg, soy sauce. Simple, elegant, and infinitely customisable." + icon = 'icons/obj/food/martian.dmi' + icon_state = "egg_fried_rice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 8, + /datum/reagent/consumable/nutriment/protein = 2, + ) + tastes = list("rice" = 1, "egg" = 1, "soy sauce" = 1) + foodtypes = MEAT | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/egg_fried_rice/Initialize(mapload) + . = ..() + AddComponent(/datum/component/customizable_reagent_holder, null, CUSTOM_INGREDIENT_ICON_STACK) + +/obj/item/food/salad/bibimbap + name = "bibimbap" + desc = "A Korean dish consisting of rice and various toppings, served in a hot stone bowl." + icon = 'icons/obj/food/martian.dmi' + icon_state = "bibimbap" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 4, + /datum/reagent/consumable/nutriment/vitamin = 8, + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/capsaicin = 2, + ) + tastes = list("rice" = 1, "spicy cabbage" = 1, "chilli heat" = 1, "egg" = 1, "meat" = 1) + foodtypes = MEAT | VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/bibimbap/Initialize(mapload) + . = ..() + AddComponent(/datum/component/customizable_reagent_holder, null, CUSTOM_INGREDIENT_ICON_STACK) + +// Noodles +/obj/item/food/salad/bulgogi_noodles + name = "bulgogi noodles" + desc = "Korean barbecue meat served with noodles! Made with gochujang, for extra spicy flavour." + icon = 'icons/obj/food/martian.dmi' + icon_state = "bulgogi_noodles" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment = 8, + /datum/reagent/consumable/capsaicin = 2, + ) + tastes = list("barbecue meat" = 1, "noodles" = 1, "chilli heat" = 1) + foodtypes = MEAT | GRAIN | VEGETABLES | FRUIT + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/yakisoba_katsu + name = "yakisoba katsu" + desc = "Breaded and deep fried meat on a bed of fried noodles. Delicious, if unconventional." + icon = 'icons/obj/food/martian.dmi' + icon_state = "yakisoba_katsu" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 4, + /datum/reagent/consumable/nutriment = 8, + ) + tastes = list("fried noodles" = 1, "meat" = 1, "breadcrumbs" = 1, "veggies" = 1) + foodtypes = MEAT | VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/martian_fried_noodles + name = "\improper Martian fried noodles" + desc = "Fried noodles from the red planet. Martian cooking draws from many cultures, and these noodles are no exception- there's elements of Malay, Thai, Chinese, Korean and Japanese cuisine in here." + icon = 'icons/obj/food/martian.dmi' + icon_state = "martian_fried_noodles" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 4, + /datum/reagent/consumable/nutriment = 8, + ) + tastes = list("noodles" = 1, "meat" = 1, "nuts" = 1, "onion" = 1, "egg" = 1) + foodtypes = GRAIN | NUTS | MEAT | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/simple_fried_noodles + name = "simple fried noodles" + desc = "A simple yet delicious fried noodle dish, perfect for the creative chef to make whatever fried noodles they want." + icon = 'icons/obj/food/martian.dmi' + icon_state = "simple_fried_noodles" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 4, + /datum/reagent/consumable/nutriment/vitamin = 4, + /datum/reagent/consumable/nutriment = 6, + ) + tastes = list("noodles" = 1, "soy sauce" = 1) + foodtypes = GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/simple_fried_noodles/Initialize(mapload) + . = ..() + AddComponent(/datum/component/customizable_reagent_holder, null, CUSTOM_INGREDIENT_ICON_STACK) + +// Curry +/obj/item/food/salad/setagaya_curry //let me explain... + name = "\improper Setagaya curry" + desc = "Made famous by a cafe in Setagaya, this curry's extensive recipe has gone on to be a closely-guarded secret amongst cafe owners across human space. The taste is said to replenish the diner's soul, whatever that means." + icon = 'icons/obj/food/martian.dmi' + icon_state = "setagaya_curry" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 8, + /datum/reagent/consumable/nutriment = 8, + /datum/reagent/medicine/omnizine = 5, + ) + tastes = list("masterful curry" = 1, "rice" = 1) + foodtypes = GRAIN | MEAT | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +// Burgers and Sandwiches +/obj/item/food/burger/big_blue + name = "\improper Big Blue burger" + desc = "The original and best Big Blue, straight outta Mars' favourite burger joint. Catch the wave, brother!" + icon = 'icons/obj/food/martian.dmi' + icon_state = "big_blue_burger" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 8, + ) + tastes = list("bun" = 1, "burger" = 2, "teriyaki onions" = 1, "cheese" = 1, "bacon" = 1, "pineapple" = 1) + foodtypes = MEAT | GRAIN | DAIRY | VEGETABLES | FRUIT | PINEAPPLE + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/burger/chappy + name = "\improper Chappy patty" + desc = "Originally born of a night of drinking in a Big Blue Burger's kitchen, the Chappy patty has since become a staple of both Big Blue's menu and Hawaiian (or at least, faux-Hawaiian) cuisine galaxy-wide. Given Big Kahuna operates most of its stores on Mars, it's perhaps no wonder this dish is popular there." + icon = 'icons/obj/food/martian.dmi' + icon_state = "chappy_patty" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/protein = 6, + ) + tastes = list("bun" = 1, "fried pork" = 2, "egg" = 1, "cheese" = 1, "ketchup" = 1) + foodtypes = MEAT | GRAIN | DAIRY | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/king_katsu_sandwich + name = "\improper King Katsu sandwich" + desc = "A big sandwich with crispy fried katsu, bacon, kimchi slaw and salad, all on reispan bread. Truly the king of meat between bread." + icon = 'icons/obj/food/martian.dmi' + icon_state = "king_katsu_sandwich" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 6, + /datum/reagent/consumable/capsaicin = 1, + ) + tastes = list("meat" = 1, "bacon" = 1, "kimchi" = 1, "salad" = 1, "rice bread" = 1) + foodtypes = MEAT | GRAIN | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/marte_cubano_sandwich + name = "\improper Marte Cubano sandwich" + desc = "A fusion food from Mars, the Marte-Cubano is based on the classic Cubano, but updated for ingredient availability and changes in tastes." + icon = 'icons/obj/food/martian.dmi' + icon_state = "marte_cubano_sandwich" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 4, + ) + tastes = list("bacon" = 1, "pickles" = 1, "cheese" = 1, "rice bread" = 1) + foodtypes = MEAT | DAIRY | VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/little_shiro_sandwich + name = "\improper Little Shiro sandwich" + desc = "A classic Martian sandwich, named for the first president of TerraGov to come from Mars. It features fried eggs, bulgogi beef, a kimchi salad, and a healthy topping of mozzarella cheese." + icon = 'icons/obj/food/martian.dmi' + icon_state = "marte_cubano_sandwich" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 6, + /datum/reagent/consumable/capsaicin = 1, + ) + tastes = list("egg" = 1, "meat" = 1, "kimchi" = 1, "mozzarella" = 1) + foodtypes = MEAT | DAIRY | VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/croque_martienne + name = "croque-martienne" + desc = "The quintessential Martian breakfast sandwich. Egg, belly pork, pineapple, cheese. Simple. Classic. Available in every cafe across New Osaka." + icon = 'icons/obj/food/martian.dmi' + icon_state = "croque_martienne" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 4, + ) + tastes = list("egg" = 1, "toast" = 1, "pork" = 1, "pineapple" = 1, "cheese" = 1) + foodtypes = MEAT | DAIRY | VEGETABLES | GRAIN | PINEAPPLE | BREAKFAST + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/prospect_sunrise + name = "\improper Prospect Sunrise" + desc = "The second-most quintessential Martian breakfast sandwich. The most beautiful combination of omelette, bacon, pickles and cheese. Available in every cafe across Prospect." + icon = 'icons/obj/food/martian.dmi' + icon_state = "prospect_sunrise" + food_reagents = list( + /datum/reagent/consumable/nutriment = 5, + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 3, + ) + tastes = list("egg" = 1, "toast" = 1, "bacon" = 1, "pickles" = 1, "cheese" = 1) + foodtypes = MEAT | DAIRY | VEGETABLES | GRAIN | BREAKFAST + w_class = WEIGHT_CLASS_SMALL + +// Snacks +/obj/item/food/takoyaki + name = "takoyaki" + desc = "A classic Japanese street food, takoyaki (or octopus balls) are made from octopus and onion inside a fried batter, topped with a savoury sauce." + icon = 'icons/obj/food/martian.dmi' + icon_state = "takoyaki" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/protein = 4, + /datum/reagent/consumable/nutriment/fat/oil = 2, + ) + tastes = list("octopus" = 1, "batter" = 1, "onion" = 1, "worcestershire sauce" = 1) + foodtypes = SEAFOOD | GRAIN | FRIED | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/takoyaki/russian + name = "russian takoyaki" + desc = "A dangerous twist on a classic dish, that makes for the perfect cover for evading the police." + icon = 'icons/obj/food/martian.dmi' + icon_state = "russian_takoyaki" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/protein = 4, + /datum/reagent/consumable/capsaicin = 10, + ) + tastes = list("octopus" = 1, "batter" = 1, "onion" = 1, "chilli heat" = 1) + foodtypes = SEAFOOD | GRAIN | FRIED | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/takoyaki/taco + name = "tacoyaki" + desc = "Straight outta Mars' most innovative street food stands, it's tacoyaki- trading octopus for taco meat and corn, and worcestershire sauce for queso. ¡Tan sabroso!" + icon = 'icons/obj/food/martian.dmi' + icon_state = "tacoyaki" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/protein = 4, + /datum/reagent/consumable/nutriment/fat/oil = 2, + ) + tastes = list("taco meat" = 1, "batter" = 1, "corn" = 1, "cheese" = 1) + foodtypes = MEAT | GRAIN | FRIED | VEGETABLES | DAIRY + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/okonomiyaki + name = "okonomiyaki" + desc = "A Kansai classic, okonomiyaki consists of a savoury pancake filled with... well, whatever you want- although cabbage, nagaimo and dashi are pretty much required, as is the eponymous okonomiyaki sauce." + icon = 'icons/obj/food/martian.dmi' + icon_state = "okonomiyaki" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/vitamin = 6, + ) + tastes = list("batter" = 1, "cabbage" = 1, "onion" = 1, "worcestershire sauce" = 1) + foodtypes = SEAFOOD | GRAIN | FRIED | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +//hey, the name literally means "grilled how you like it", it'd be crazy to not make it customisable +/obj/item/food/okonomiyaki/Initialize(mapload) + . = ..() + AddComponent(/datum/component/customizable_reagent_holder, null, CUSTOM_INGREDIENT_ICON_STACK) + +/obj/item/food/brat_kimchi + name = "brat-kimchi" + desc = "Fried kimchi, mixed with sugar and topped with bratwurst. A popular dish at izakayas on Mars." + icon = 'icons/obj/food/martian.dmi' + icon_state = "brat_kimchi" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 4, + /datum/reagent/consumable/nutriment/protein = 4, + /datum/reagent/consumable/capsaicin = 2, + /datum/reagent/consumable/sugar = 2, + ) + tastes = list("spicy cabbage" = 1, "sausage" = 1) + foodtypes = MEAT | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/tonkatsuwurst + name = "tonkatsuwurst" + desc = "A cultural fusion between German and Japanese cooking, tonkatsuwurst blends the currywurst and tonkatsu sauce into something familiar, yet new." + icon = 'icons/obj/food/martian.dmi' + icon_state = "tonkatsuwurst" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 3, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/worcestershire = 2, + ) + tastes = list("sausage" = 1, "spicy sauce" = 1, "fries" = 1) + foodtypes = MEAT | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/kebab/ti_hoeh_koe + name = "ti hoeh koe skewer" + desc = "Pig blood, mixed with rice, fried, and topped with peanut and coriander. It's an... acquired taste for sure, but it's popular at Prospect's night markets, brought by Taiwanese settlers." + icon = 'icons/obj/food/martian.dmi' + icon_state = "ti_hoeh_koe" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 1, + /datum/reagent/consumable/nutriment/protein = 5, + /datum/reagent/consumable/peanut_butter = 1, + ) + tastes = list("blood" = 1, "nuts" = 1, "herbs" = 1) + foodtypes = MEAT | NUTS | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/kitzushi + name = "kitzushi" + desc = "A variant on inarizushi popular on Mars amongst vulpinids (and the wider animalid community), kitzushi integrates a spicy cheese and chilli mix inside the pocket for extra flavour." + icon = 'icons/obj/food/martian.dmi' + icon_state = "kitzushi" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 3, + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/capsaicin = 2, + ) + tastes = list("rice" = 1, "tofu" = 1, "chilli cheese" = 1) + foodtypes = GRAIN | FRIED | VEGETABLES | DAIRY + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/epok_epok + name = "epok-epok" + desc = "A fried pastry snack from Malaysia, which migrated via Singapore into the Martian diet. Stuffed with curried chicken and potatoes, alongside a slice of hard boiled egg, it's a popular street food on the Red Planet." + icon = 'icons/obj/food/martian.dmi' + icon_state = "epok_epok" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/protein = 4, + ) + tastes = list("curry" = 1, "egg" = 1, "pastry" = 1) + foodtypes = GRAIN | MEAT | VEGETABLES | FRIED + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/roti_john + name = "roti john" + desc = "A classic Malaysian snack, the roti john consists of bread fried in a mixture of meat, egg and onion, yielding a result that's somewhere between French toast and an omelette." + icon = 'icons/obj/food/martian.dmi' + icon_state = "roti_john" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 6, + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment = 10, + ) + tastes = list("bread" = 1, "egg" = 1, "meat" = 1, "onion" = 1) + foodtypes = GRAIN | MEAT | VEGETABLES | FRIED | BREAKFAST + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/izakaya_fries + name = "izakaya fries" + desc = "New Osaka's favourite fries, 2 centuries running- and it's all thanks to the marriage of Red Bay, furikake and mayonnaise." + icon = 'icons/obj/food/martian.dmi' + icon_state = "izakaya_fries" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/protein = 2, + /datum/reagent/consumable/capsaicin = 2, + /datum/reagent/consumable/salt = 2, + ) + tastes = list("fries" = 1, "mars" = 1) + foodtypes = VEGETABLES | FRIED + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/kurry_ok_subsando + name = "kurry-ok subsando" + desc = "The bunny chow meets Martian ingenuity in the form of the kurry-ok subsando, with fries and katsu curry in perfect harmony." + icon = 'icons/obj/food/martian.dmi' + icon_state = "kurry_ok_subsando" + food_reagents = list( + /datum/reagent/consumable/nutriment = 10, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 8, + ) + tastes = list("bread" = 1, "spicy fries" = 1, "mayonnaise" = 1, "curry" = 1, "meat" = 1) + foodtypes = MEAT | GRAIN | VEGETABLES | FRIED + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/loco_moco + name = "loco moco" + desc = "A simple classic from Hawaii. Makes for a filling, tasty, and cheap meal." + icon = 'icons/obj/food/martian.dmi' + icon_state = "loco_moco" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/protein = 8, + ) + tastes = list("rice" = 1, "burger" = 1, "gravy" = 1, "egg" = 1) + foodtypes = MEAT | GRAIN | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/wild_duck_fries + name = "wild duck fries" + desc = "Fries with shredded duck, ketchup, mayo, and Red Bay. A classic street food on Mars, although they're most often associated with Kwik-Kwak, Mars' favourite (and indeed, only) duck themed fast food chain." + icon = 'icons/obj/food/martian.dmi' + icon_state = "wild_duck_fries" + food_reagents = list( + /datum/reagent/consumable/nutriment = 8, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/capsaicin = 2, + /datum/reagent/consumable/salt = 2, + ) + tastes = list("fries" = 1, "duck" = 1, "ketchup" = 1, "mayo" = 1, "spicy seasoning" = 1) + foodtypes = MEAT | VEGETABLES | FRIED + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/little_hawaii_hotdog + name = "\improper Little Hawaii hotdog" + desc = "From the friendly vendors of Honolulu Avenue comes the Little Hawaii dog- tropical and fattening, all at the same time!" + icon = 'icons/obj/food/martian.dmi' + icon_state = "little_hawaii_hotdog" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 6, + ) + tastes = list("sausage" = 1, "pineapple" = 1, "onion" = 1, "teriyaki" = 1) + foodtypes = MEAT | VEGETABLES | FRUIT | PINEAPPLE + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salt_chilli_fries + name = "salt n' chilli fries" + desc = "The simple name of this dish doesn't tell the full story of its deliciousness- sure, salt and chilli are big components, but the onion, ginger and garlic are the real flavour heroes here." + icon = 'icons/obj/food/martian.dmi' + icon_state = "salt_chilli_fries" + food_reagents = list( + /datum/reagent/consumable/nutriment = 8, + /datum/reagent/consumable/nutriment/vitamin = 4, + /datum/reagent/consumable/capsaicin = 2, + /datum/reagent/consumable/salt = 2, + ) + tastes = list("fries" = 1, "garlic" = 1, "ginger" = 1, "numbing heat" = 1, "salt" = 1) + foodtypes = VEGETABLES | FRIED + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/grilled_octopus + name = "grilled octopus tentacle" + desc = "A simple seafood dish, typical to everywhere that octopus is eaten. Martians like it with Red Bay." + icon = 'icons/obj/food/martian.dmi' + icon_state = "grilled_octopus" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 2, + /datum/reagent/consumable/char = 2) + tastes = list("octopus" = 1) + foodtypes = SEAFOOD | FRIED + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/steak_croquette + name = "steak croquette" + desc = "Man, sticking chunks of steak in a croquette. Must be the countryside way." + icon = 'icons/obj/food/martian.dmi' + icon_state = "steak_croquette" + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/nutriment/protein = 6, + ) + tastes = list("steak" = 1, "potato" = 1) + foodtypes = MEAT | VEGETABLES | FRIED + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/chapsilog + name = "chapsilog" + desc = "A traditional Filipino-style silog consisting of sinangag, a fried egg, and slices of chap. Makes for a simple, yet filling, breakfast." + icon = 'icons/obj/food/martian.dmi' + icon_state = "chapsilog" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 3, + /datum/reagent/consumable/garlic = 1, + ) + tastes = list("ham" = 1, "garlic rice" = 1, "egg" = 1) + foodtypes = MEAT | GRAIN | VEGETABLES | BREAKFAST + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/chap_hash + name = "chap hash" + desc = "What do you get when you combine chap, onions, peppers and potatoes? The chap hash, of course! Add some red bay, and you've got yourself a tasty breakfast." + icon = 'icons/obj/food/martian.dmi' + icon_state = "chap_hash" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 6, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment = 3, + ) + tastes = list("ham" = 1, "onion" = 1, "pepper" = 1, "potato" = 1) + foodtypes = MEAT | VEGETABLES | BREAKFAST + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/agedashi_tofu + name = "agedashi tofu" + desc = "Crispy fried tofu, served in a tasty umami broth. Frequently served at izakayas." + icon = 'icons/obj/food/martian.dmi' + icon_state = "agedashi_tofu" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/protein = 2, + /datum/reagent/consumable/nutriment/vitamin = 4, + ) + tastes = list("umami broth" = 1, "tofu" = 1) + foodtypes = SEAFOOD | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +// Curries and Stews +/obj/item/food/salad/po_kok_gai + name = "po kok gai" + desc = "Also known as galinha à portuguesa, or Portuguese chicken, this dish is a Macanese classic born of Portuguese colonialism, though the dish itself is not a Portuguese dish. It consists of chicken in \"Portuguese Sauce\", a mild coconut-based curry." + icon = 'icons/obj/food/martian.dmi' + icon_state = "po_kok_gai" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 2, + ) + tastes = list("chicken" = 1, "coconut" = 1, "curry" = 1) + foodtypes = MEAT | VEGETABLES | FRUIT + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/huoxing_tofu + name = "\improper Huoxing tofu" + desc = "An adaptation of mapo tofu made famous in Prospect, the foodie Mecca of Mars. It even kinda looks like Mars, if you really squint." + icon = 'icons/obj/food/martian.dmi' + icon_state = "huoxing_tofu" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 4, + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/capsaicin = 2 + ) + tastes = list("meat" = 1, "chilli heat" = 1, "tofu" = 1) + foodtypes = MEAT | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/feizhou_ji + name = "fēizhōu jī" + desc = "Considered a Macanese variant on piri-piri, fēizhōu jī, or galinha à africana, or African chicken (if you're feeling like speaking Common), is a popular dish in the TID, and subsequently also on Mars due to its influx of Macanese settlers." + icon = 'icons/obj/food/martian.dmi' + icon_state = "feizhou_ji" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/capsaicin = 2, + ) + tastes = list("chicken" = 1, "chilli heat" = 1, "vinegar" = 1) + foodtypes = MEAT | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/galinha_de_cabidela + name = "galinha de cabidela" + desc = "Originally a Portuguese dish, cabidela rice is traditionally made with chicken in Portugal, and duck in Macau- ultimately, the chicken version won out on Mars due to European influence." + icon = 'icons/obj/food/martian.dmi' + icon_state = "galinha_de_cabidela" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/protein = 12, + ) + tastes = list("chicken" = 1, "iron" = 1, "vinegar" = 1, "rice" = 1) + foodtypes = MEAT | VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/katsu_curry + name = "katsu curry" + desc = "Breaded and deep fried meat, topped with curry sauce and served on a bed of rice." + icon = 'icons/obj/food/martian.dmi' + icon_state = "katsu_curry" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/protein = 8, + ) + tastes = list("curry" = 1, "meat" = 1, "breadcrumbs" = 1, "rice" = 1) + foodtypes = MEAT | VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/beef_bowl + name = "beef bowl" + desc = "A tasty mix of stewed beef and onion, served over rice. Typical toppings include pickled ginger, chilli powder, and fried eggs." + icon = 'icons/obj/food/martian.dmi' + icon_state = "beef_bowl" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 2, + ) + tastes = list("beef" = 25, "onion" = 25, "chili heat" = 15, "rice" = 34, "soul" = 1) //I pour my soul into this bowl + foodtypes = MEAT | VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/salt_chilli_bowl + name = "salt n' chilli octopus bowl" + desc = "Inspired by the Japanese donburi tradition, this spicy take on ten-don is a flavour sensation that's swept the Martian nation." + icon = 'icons/obj/food/martian.dmi' + icon_state = "salt_chilli_bowl" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 6, + /datum/reagent/consumable/capsaicin = 2, + /datum/reagent/consumable/salt = 2, + ) + tastes = list("seafood" = 1, "rice" = 1, "garlic" = 1, "ginger" = 1, "numbing heat" = 1, "salt" = 1) + foodtypes = SEAFOOD | VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/kansai_bowl + name = "\improper Kansai bowl" + desc = "Also known as konohadon, this donburi is typical to the Kansai region, and consists of kamaboko fishcake, egg and onion served over rice." + icon = 'icons/obj/food/martian.dmi' + icon_state = "kansai_bowl" + food_reagents = list( + /datum/reagent/consumable/nutriment = 8, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 2, + ) + tastes = list("seafood" = 1, "rice" = 1, "egg" = 1, "onion" = 1) + foodtypes = SEAFOOD | MEAT | VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/eigamudo_curry //curry is meant to be really spicy or kinda mild, this just stinks! + name = "\improper Eigamudo curry" + desc = "An inexplicable curry dish made from a cacophony of ingredients. Presumably tastes good to someone, somewhere- though good luck finding them." + icon = 'icons/obj/food/martian.dmi' + icon_state = "eigamudo_curry" + food_reagents = list( + /datum/reagent/consumable/nutraslop = 8, + /datum/reagent/consumable/capsaicin = 2, + /datum/reagent/toxin/slimejelly = 4, + ) + tastes = list("grit" = 1, "slime" = 1, "gristle" = 1, "rice" = 1, "Mystery Food X" = 1) + foodtypes = GROSS | GRAIN | TOXIC + w_class = WEIGHT_CLASS_SMALL + +// Entrees +/obj/item/food/cilbir + name = "çilbir" + desc = "Eggs, served on a savoury yoghurt base with a spicy oil topping. Originally a Turkish dish, it came to Mars with German-Turkish settlers and has become a breakfast mainstay since." + icon = 'icons/obj/food/martian.dmi' + icon_state = "cilbir" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 4, + /datum/reagent/consumable/nutriment/vitamin = 6, + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/capsaicin = 2, + /datum/reagent/consumable/garlic = 1, + ) + tastes = list("yoghurt" = 1, "garlic" = 1, "lemon" = 1, "egg" = 1, "chilli heat" = 1) + foodtypes = DAIRY | VEGETABLES | FRUIT | BREAKFAST + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/peking_duck_crepes + name = "\improper Peking duck crepes a l'orange" + desc = "This dish takes the best of Beijing's and Paris' cuisines to make a deliciously tangy and savoury meal." + icon = 'icons/obj/food/martian.dmi' + icon_state = "peking_duck_crepes" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 10, + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/vitamin = 4, + /datum/reagent/consumable/orangejuice = 4, + ) + tastes = list("meat" = 1, "crepes" = 1, "orange" = 1) + foodtypes = MEAT | DAIRY | VEGETABLES | FRUIT + w_class = WEIGHT_CLASS_SMALL + +// Desserts +/obj/item/food/cake/spekkoek + name = "vulgaris spekkoek" + desc = "Brought to Mars by both Dutch and Indonesian settlers, spekkoek is a common holiday cake on the Red Planet, often being served as part of a traditional rijsttafel. Use of ambrosia vulgaris as a flavouring is one of necessity in deep space, as pandan leaf is rare this far from Earth." + icon = 'icons/obj/food/martian.dmi' + icon_state = "spekkoek" + food_reagents = list( + /datum/reagent/consumable/nutriment = 30, + /datum/reagent/consumable/nutriment/vitamin = 15 + ) + tastes = list("winter spices" = 2, "ambrosia vulgaris" = 2, "cake" = 5) + foodtypes = GRAIN | SUGAR | DAIRY + +/obj/item/food/cake/spekkoek/make_processable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/spekkoek, 5, 3 SECONDS, table_required = TRUE) + +/obj/item/food/cakeslice/spekkoek + name = "vulgaris spekkoek slice" + desc = "A slice of vulgaris spekkoek. If you're Martian, this might remind you of home." + icon = 'icons/obj/food/martian.dmi' + icon_state = "spekkoek_slice" + tastes = list("winter spices" = 2, "ambrosia vulgaris" = 2, "cake" = 5) + foodtypes = GRAIN | SUGAR | DAIRY + +/obj/item/food/salad/pineapple_foster + name = "pineapple foster" + desc = "A classic Martian adaptation of another classic dessert, Pineapple Foster is a toasty sweet treat which presents only a mild-to-moderate fire risk." + icon = 'icons/obj/food/martian.dmi' + icon_state = "pineapple_foster" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 6, + /datum/reagent/consumable/nutriment = 2, + /datum/reagent/consumable/caramel = 4, + /datum/reagent/consumable/pineapplejuice = 2, + /datum/reagent/consumable/milk = 4 + ) + tastes = list("pineapple" = 1, "vanilla" = 1, "caramel" = 1, "ice cream" = 1) + foodtypes = FRUIT | DAIRY | PINEAPPLE + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/pastel_de_nata + name = "pastel de nata" + desc = "Originally created by Portuguese monks, pastéis de nata went worldwide under the Portuguese colonial empire- including Macau, from which it came to Mars with settlers from the TID of Hong Kong and Macau." + icon = 'icons/obj/food/martian.dmi' + icon_state = "pastel_de_nata" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 4, + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/sugar = 4, + ) + tastes = list("custard" = 1, "vanilla" = 1, "sweet pastry" = 1) + foodtypes = DAIRY | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/boh_loh_yah + name = "boh loh yah" + desc = "Confusingly referred to as a \"pineapple bun\", this Hong Konger treat contains no actual pineapple- instead, it's a sugar-cookie like bun with a butter filling." + icon = 'icons/obj/food/martian.dmi' + icon_state = "boh_loh_yah" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/sugar = 4, + ) + tastes = list("cookie" = 1, "butter" = 1) + foodtypes = DAIRY | GRAIN | PINEAPPLE //it's funny + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/banana_fritter + name = "banana fritter" + desc = "A ubiquitous sweet snack from much of Maritime South-East Asia, the banana fritter has many names, but all share a similar style- banana, coated in batter, and fried." + icon = 'icons/obj/food/martian.dmi' + icon_state = "banana_fritter" + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/nutriment/vitamin = 1, + /datum/reagent/consumable/sugar = 1, + ) + tastes = list("banana" = 1, "batter" = 1) + foodtypes = GRAIN | FRUIT | FRIED + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/pineapple_fritter + name = "pineapple fritter" + desc = "Like its cousin, the banana fritter, the pineapple fritter is a popular snack, though somewhat let down by pineapple's infamous \"love it or hate it\" flavour." + icon = 'icons/obj/food/martian.dmi' + icon_state = "pineapple_fritter" + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/nutriment/vitamin = 1, + /datum/reagent/consumable/sugar = 1, + ) + tastes = list("pineapple" = 1, "batter" = 1) + foodtypes = GRAIN | FRUIT | FRIED | PINEAPPLE + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/kebab/kasei_dango + name = "kasei dango" + desc = "Japanese-style dango balls, flavoured with grenadine and orange, giving a final result that looks like Mars and tastes like dessert, served three to a stick." + icon = 'icons/obj/food/martian.dmi' + icon_state = "kasei_dango" + food_reagents = list( + /datum/reagent/consumable/sugar = 6, + /datum/reagent/consumable/nutriment = 2, + /datum/reagent/consumable/orangejuice = 3, + /datum/reagent/consumable/grenadine = 3 + ) + tastes = list("pomegranate" = 1, "orange" = 1) + foodtypes = FRUIT | GRAIN + w_class = WEIGHT_CLASS_SMALL + +// Frozen +/obj/item/food/pb_ice_cream_mochi + name = "peanut butter ice cream mochi" + desc = "A classic dessert at the Arabia Street Night Market in Prospect, peanut butter ice cream mochi is made with a peanut-butter flavoured ice cream as the main filling, and coated in crushed peanuts in the Taiwanese tradition." + icon = 'icons/obj/food/martian.dmi' + icon_state = "pb_ice_cream_mochi" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/sugar = 6, + /datum/reagent/consumable/peanut_butter = 4, + /datum/reagent/consumable/milk = 2, + ) + tastes = list("peanut butter" = 1, "mochi" = 1) + foodtypes = NUTS | GRAIN | DAIRY | SUGAR + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/popsicle/pineapple_pop + name = "frozen pineapple pop" + desc = "Few cultures love pineapple as much as the Martians, and this dessert proves that- frozen pineapple, on a stick, with just a little dunk of dark chocolate." + overlay_state = "pineapple_pop" + food_reagents = list( + /datum/reagent/consumable/pineapplejuice = 4, + /datum/reagent/consumable/sugar = 4, + /datum/reagent/consumable/nutriment = 2, + /datum/reagent/consumable/nutriment/vitamin = 2, + ) + tastes = list("cold pineapple" = 1, "chocolate" = 1) + foodtypes = SUGAR | PINEAPPLE + +/obj/item/food/popsicle/sea_salt + name = "sea salt ice-cream bar" + desc = "This sky-blue ice-cream bar is flavoured with only the finest imported sea salt. Salty... no, sweet!" + overlay_state = "sea_salt_pop" + food_reagents = list( + /datum/reagent/consumable/salt = 1, + /datum/reagent/consumable/nutriment = 2, + /datum/reagent/consumable/cream = 2, + /datum/reagent/consumable/vanilla = 2, + /datum/reagent/consumable/sugar = 4, + ) + tastes = list("salt" = 1, "sweet" = 1) + foodtypes = SUGAR | DAIRY + +// topsicles, also known as tofu popsicles +/obj/item/food/popsicle/topsicle + name = "berry topsicle" + desc = "A frozen treat made from tofu and berry juice blended smooth, then frozen. Supposedly a favourite of bears, but that makes no sense..." + overlay_state = "topsicle_berry" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 4, + /datum/reagent/consumable/sugar = 6, + /datum/reagent/consumable/berryjuice = 4 + ) + tastes = list("berry" = 1, "tofu" = 1) + foodtypes = FRUIT | VEGETABLES + +/obj/item/food/popsicle/topsicle/banana + name = "banana topsicle" + desc = "A frozen treat made from tofu and banana juice blended smooth, then frozen. Popular in rural Japan in the summer." + overlay_state = "topsicle_banana" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 4, + /datum/reagent/consumable/sugar = 6, + /datum/reagent/consumable/banana = 4 + ) + tastes = list("banana" = 1, "tofu" = 1) + +/obj/item/food/popsicle/topsicle/pineapple + name = "pineapple topsicle" + desc = "A frozen treat made from tofu and pineapple juice blended smooth, then frozen. As seen on TV." + overlay_state = "topsicle_pineapple" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 4, + /datum/reagent/consumable/sugar = 6, + /datum/reagent/consumable/pineapplejuice = 4 + ) + tastes = list("pineapple" = 1, "tofu" = 1) + +// Ballpark Food +/obj/item/food/plasma_dog_supreme + name = "\improper Plasma Dog Supreme" + desc = "The signature snack of Cybersun Park, home of the New Osaka Woodpeckers: a ballpark hot-dog with sambal, dashi-grilled onions and pineapple-lime salsa. You know, the sort of bold flavours they enjoy on Mars." + icon = 'icons/obj/food/martian.dmi' + icon_state = "plasma_dog_supreme" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 8, + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment = 6 + ) + tastes = list("sausage" = 1, "relish" = 1, "onion" = 1, "fruity salsa" = 1) + foodtypes = FRUIT | MEAT | PINEAPPLE | VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/frickles + name = "frickles" + desc = "Spicy fried pickle spears? Such a bold combination can surely come only from one place- Martian ballparks? Well, not really, but they are a popular snack there." + icon = 'icons/obj/food/martian.dmi' + icon_state = "frickles" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/fat/oil = 2, + /datum/reagent/consumable/capsaicin = 1, + ) + tastes = list("frickles" = 1) + foodtypes = VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/raw_ballpark_pretzel + name = "raw pretzel" + desc = "A twisted knot of dough, ready to be baked, or possibly griddled?" + icon = 'icons/obj/food/martian.dmi' + icon_state = "raw_ballpark_pretzel" + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/salt = 1, + ) + tastes = list("bread" = 1, "salt" = 1) + foodtypes = GRAIN | RAW + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/raw_ballpark_pretzel/make_bakeable() + AddComponent(/datum/component/bakeable, /obj/item/food/ballpark_pretzel, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) + +/obj/item/food/raw_ballpark_pretzel/make_grillable() + AddComponent(/datum/component/grillable, /obj/item/food/ballpark_pretzel, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) + +/obj/item/food/ballpark_pretzel + name = "ballpark pretzel" + desc = "A classic German bread, transformed by the hand of American imperialism into a game-day snack, and then carried to the Red Planet on the backs of Japanese settlers. How multicultural." + icon = 'icons/obj/food/martian.dmi' + icon_state = "ballpark_pretzel" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/salt = 1, + ) + tastes = list("bread" = 1, "salt" = 1) + foodtypes = GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/kebab/raw_ballpark_tsukune + name = "raw tsukune" + desc = "Raw chicken meatballs on a skewer, ready to be griddled into something delicious." + icon = 'icons/obj/food/martian.dmi' + icon_state = "raw_ballpark_tsukune" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 3, + /datum/reagent/consumable/nutriment = 2, + ) + tastes = list("raw chicken" = 7, "salmonella" = 1) + foodtypes = MEAT | RAW + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/kebab/raw_ballpark_tsukune/make_grillable() + AddComponent(/datum/component/grillable, /obj/item/food/kebab/ballpark_tsukune, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) + +/obj/item/food/kebab/ballpark_tsukune + name = "ballpark tsukune" + desc = "Skewered chicken meatballs in a sweet-and-savoury yakitori sauce. A common sight at Martian ballparks." + icon = 'icons/obj/food/martian.dmi' + icon_state = "ballpark_tsukune" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment = 4, + ) + tastes = list("chicken" = 1, "umami sauce" = 1) + foodtypes = MEAT + w_class = WEIGHT_CLASS_SMALL + +// Ethereal-suitable cross-culture food +/* Ethereals are, as part of the uplifting process, considered as citizens of the Terran Federation. + For this reason, a lot of ethereals have chosen to move throughout human space, settling on various planets to a mixed reception. + Mars is no exception to this rule, where the ethereal population has been more welcomed than most, due to Mars' more cosmopolitan past. + Here, the ethereals have developed a distinct culture, neither that of their homeland nor that of Mars, and with that a distinct cuisine. +*/ + +// Pickled Voltvine +/obj/item/food/pickled_voltvine + name = "pickled voltvine" + desc = "A traditional dish from Sprout (where it is known as hinu'sashuruhk), pickled voltvine has taken on a new identity amongst the pickle masters of Mars, earning a seat at the holy pickle pantheon alongside pickled ginger and kimchi (once appropriately discharged, at least)." + icon = 'icons/obj/food/martian.dmi' + icon_state = "pickled_voltvine" + food_reagents = list( + /datum/reagent/consumable/liquidelectricity/enriched = 4, + /datum/reagent/consumable/nutriment/vitamin = 2, + ) + tastes = list("sour radish" = 1) + foodtypes = VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +// 24-Volt Energy +/obj/item/food/volt_fish + name = "24-volt fish" + desc = "Some may question the 24-volt fish. After all, fish poached in electric-blue super-sour energy drink looks awful. And, indeed, tastes awful. So why do the Martian ethereals like it, then?" //beats the hell out of me + icon = 'icons/obj/food/martian.dmi' + icon_state = "volt_fish" + food_reagents = list( + /datum/reagent/consumable/liquidelectricity/enriched = 6, + /datum/reagent/consumable/nutriment/protein = 4, + ) + tastes = list("fish" = 1, "sour pear" = 1) + foodtypes = SEAFOOD + w_class = WEIGHT_CLASS_SMALL + +// Sprout Bowl +/obj/item/food/salad/sprout_bowl + name = "\improper Sprout bowl" + desc = "Named for the Ethereal homeworld, this rice-based bowl draws on the donburi tradition, but rejects typical donburi toppings, instead using sashimi grade fish and pickled voltvine." + icon = 'icons/obj/food/martian.dmi' + icon_state = "sprout_bowl" + food_reagents = list( + /datum/reagent/consumable/liquidelectricity/enriched = 8, + /datum/reagent/consumable/nutriment/protein = 4, + /datum/reagent/consumable/nutriment/vitamin = 2, + ) + tastes = list("fish" = 1, "sour radish" = 1, "rice" = 1) + foodtypes = SEAFOOD | VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL diff --git a/code/game/objects/items/food/meatdish.dm b/code/game/objects/items/food/meatdish.dm index c4ffcf9822781..2d37614804528 100644 --- a/code/game/objects/items/food/meatdish.dm +++ b/code/game/objects/items/food/meatdish.dm @@ -18,6 +18,7 @@ tastes = list("fish" = 4, "batter" = 1, "hot peppers" = 1) foodtypes = SEAFOOD | FRIED w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/fishmeat name = "fish fillet" @@ -54,6 +55,7 @@ name = "imitation carp fillet" desc = "Almost just like the real thing, kinda." cell_line = null + starting_reagent_purity = 0.3 /obj/item/food/fishmeat/moonfish name = "moonfish fillet" @@ -81,11 +83,21 @@ icon_state = "armorfish_fillet" food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3) +///donkfish fillets. The yuck reagent is now added by the fish trait of the same name. /obj/item/food/fishmeat/donkfish name = "donkfillet" desc = "The dreaded donkfish fillet. No sane spaceman would eat this, and it does not get better when cooked." icon_state = "donkfillet" - food_reagents = list(/datum/reagent/yuck = 3) + +/obj/item/food/fishmeat/octopus + name = "octopus tentacle" + desc = "A large tentacle from an octopus." + icon = 'icons/obj/food/martian.dmi' + icon_state = "octopus_fillet" + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3) + +/obj/item/food/fishmeat/octopus/make_grillable() + AddComponent(/datum/component/grillable, /obj/item/food/grilled_octopus, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) /obj/item/food/fishfingers name = "fish fingers" @@ -102,6 +114,7 @@ foodtypes = SEAFOOD | FRIED w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_EXOTIC + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/fishandchips name = "fish and chips" @@ -116,6 +129,7 @@ tastes = list("fish" = 1, "chips" = 1) foodtypes = SEAFOOD | VEGETABLES | FRIED venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/fishfry name = "fish fry" @@ -129,6 +143,7 @@ tastes = list("fish" = 1, "pan seared vegtables" = 1) foodtypes = SEAFOOD | VEGETABLES | FRIED w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/vegetariansushiroll name = "vegetarian sushi roll" @@ -141,6 +156,7 @@ tastes = list("boiled rice" = 4, "carrots" = 2, "potato" = 2) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/vegetariansushiroll/make_processable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/vegetariansushislice, 4, screentip_verb = "Chop") @@ -156,6 +172,7 @@ tastes = list("boiled rice" = 4, "carrots" = 2, "potato" = 2) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/spicyfiletsushiroll name = "spicy filet sushi roll" @@ -170,6 +187,7 @@ tastes = list("boiled rice" = 4, "fish" = 2, "spicyness" = 2) foodtypes = VEGETABLES | SEAFOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/spicyfiletsushiroll/make_processable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/spicyfiletsushislice, 4, screentip_verb = "Chop") @@ -187,6 +205,7 @@ tastes = list("boiled rice" = 4, "fish" = 2, "spicyness" = 2) foodtypes = VEGETABLES | SEAFOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 // empty sushi for custom sushi /obj/item/food/sushi/empty @@ -195,6 +214,7 @@ tastes = list() icon_state = "vegetariansushiroll" desc = "A roll of customized sushi." + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/sushi/empty/make_processable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/sushislice/empty, 4, screentip_verb = "Chop") @@ -205,6 +225,7 @@ tastes = list() icon_state = "vegetariansushislice" desc = "A slice of customized sushi." + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/nigiri_sushi name = "nigiri sushi" @@ -215,6 +236,7 @@ tastes = list("boiled rice" = 4, "fish filet" = 2, "soy sauce" = 2) foodtypes = SEAFOOD | VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/meat_poke name = "meat poke" @@ -230,6 +252,7 @@ tastes = list("rice and meat" = 4, "lettuce" = 2, "soy sauce" = 2) trash_type = /obj/item/reagent_containers/cup/bowl w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/fish_poke name = "fish poke" @@ -245,6 +268,7 @@ tastes = list("rice and fish" = 4, "lettuce" = 2, "soy sauce" = 2) trash_type = /obj/item/reagent_containers/cup/bowl w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_4 ////////////////////////////////////////////MEATS AND ALIKE//////////////////////////////////////////// @@ -258,6 +282,7 @@ foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_CHEAP + crafting_complexity = FOOD_COMPLEXITY_2 // sliceable into 4xtempehslices /obj/item/food/tempeh/make_processable() @@ -272,6 +297,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2) tastes = list("earthy" = 3, "nutty" = 2, "bland" = 1) foodtypes = VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_2 //add an icon for blends /obj/item/food/tempehstarter @@ -282,6 +308,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2) tastes = list("nutty" = 2, "bland" = 2) foodtypes = VEGETABLES | GROSS + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/tofu name = "tofu" @@ -292,6 +319,7 @@ foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_CHEAP + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/tofu/prison name = "soggy tofu" @@ -328,6 +356,7 @@ tastes = list("meat" = 1, "cabbage" = 1) foodtypes = MEAT | VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/bearsteak name = "Filet migrawr" @@ -343,6 +372,7 @@ foodtypes = MEAT | ALCOHOL w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_EXOTIC + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/raw_meatball name = "raw meatball" @@ -392,13 +422,14 @@ desc = "A great meal all round. Not a cord of wood." icon = 'icons/obj/food/meat.dmi' icon_state = "meatball" + inhand_icon_state = "meatball" food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2) tastes = list("meat" = 1) foodtypes = MEAT food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL - burns_on_grill = TRUE venue_value = FOOD_PRICE_CHEAP + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/meatball/human name = "strange meatball" @@ -465,7 +496,7 @@ tastes = list("meat" = 1) foodtypes = MEAT w_class = WEIGHT_CLASS_SMALL - burns_on_grill = TRUE + crafting_complexity = FOOD_COMPLEXITY_1 ///Exists purely for the crafting recipe (because itll take subtypes) /obj/item/food/patty/plain @@ -502,6 +533,7 @@ foodtypes = MEAT | RAW eatverbs = list("bite", "chew", "nibble", "deep throat", "gobble", "chomp") w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/raw_sausage/make_grillable() AddComponent(/datum/component/grillable, /obj/item/food/sausage, rand(60 SECONDS, 75 SECONDS), TRUE) @@ -520,8 +552,8 @@ food_flags = FOOD_FINGER_FOOD eatverbs = list("bite", "chew", "nibble", "deep throat", "gobble", "chomp") w_class = WEIGHT_CLASS_SMALL - burns_on_grill = TRUE venue_value = FOOD_PRICE_CHEAP + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/sausage/make_processable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/salami, 6, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice") @@ -545,6 +577,7 @@ foodtypes = MEAT food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/rawkhinkali name = "raw khinkali" @@ -560,6 +593,7 @@ tastes = list("meat" = 1, "onions" = 1, "garlic" = 1) foodtypes = MEAT w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/rawkhinkali/make_grillable() AddComponent(/datum/component/grillable, /obj/item/food/khinkali, rand(50 SECONDS, 60 SECONDS), TRUE) @@ -579,7 +613,7 @@ tastes = list("meat" = 1, "onions" = 1, "garlic" = 1) foodtypes = MEAT w_class = WEIGHT_CLASS_SMALL - burns_on_grill = TRUE + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/meatbun name = "meat bun" @@ -594,6 +628,7 @@ foodtypes = GRAIN | MEAT | VEGETABLES w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_CHEAP + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/stewedsoymeat name = "stewed soy meat" @@ -608,6 +643,7 @@ eatverbs = list("slurp", "sip", "inhale", "drink") foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/boiledspiderleg name = "boiled spider leg" @@ -622,7 +658,7 @@ tastes = list("hot peppers" = 1, "cobwebs" = 1) foodtypes = MEAT w_class = WEIGHT_CLASS_SMALL - burns_on_grill = TRUE + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/spidereggsham name = "green eggs and ham" @@ -637,6 +673,7 @@ tastes = list("meat" = 1, "the colour green" = 1) foodtypes = MEAT w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/sashimi name = "carp sashimi" @@ -653,6 +690,7 @@ w_class = WEIGHT_CLASS_TINY //total price of this dish is 20 and a small amount more for soy sauce, all of which are available at the orders console venue_value = FOOD_PRICE_CHEAP + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/sashimi/Initialize(mapload) . = ..() @@ -660,6 +698,7 @@ /obj/item/food/nugget name = "chicken nugget" + desc = "A \"chicken\" nugget vaguely shaped like something." food_reagents = list( /datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 2, @@ -673,6 +712,7 @@ food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_TINY venue_value = FOOD_PRICE_CHEAP + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/nugget/Initialize(mapload) . = ..() @@ -693,6 +733,7 @@ tastes = list("meat" = 1, "butter" = 1) foodtypes = MEAT | DAIRY | GRAIN w_class = WEIGHT_CLASS_TINY + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/bbqribs name = "bbq ribs" @@ -707,6 +748,7 @@ ) tastes = list("meat" = 3, "smokey sauce" = 1) foodtypes = MEAT | SUGAR + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/meatclown name = "meat clown" @@ -721,6 +763,7 @@ tastes = list("meat" = 5, "clowns" = 3, "sixteen teslas" = 1) w_class = WEIGHT_CLASS_SMALL foodtypes = MEAT | FRUIT + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/meatclown/Initialize(mapload) . = ..() @@ -738,6 +781,7 @@ tastes = list("meat" = 3, "pasta" = 3, "tomato" = 2, "cheese" = 2) foodtypes = MEAT | DAIRY | GRAIN venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_3 //////////////////////////////////////////// KEBABS AND OTHER SKEWERS //////////////////////////////////////////// @@ -749,6 +793,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 14) tastes = list("meat" = 3, "metal" = 1) w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/kebab/human name = "human-kebab" @@ -816,6 +861,7 @@ /obj/item/food/kebab/fiesta name = "fiesta skewer" + desc = "Variety of meats and vegetables on a stick." icon_state = "fiestaskewer" food_reagents = list( /datum/reagent/consumable/nutriment/protein = 12, @@ -824,6 +870,7 @@ ) tastes = list("tex-mex" = 3, "cumin" = 2) foodtypes = MEAT | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/fried_chicken name = "fried chicken" @@ -835,6 +882,7 @@ foodtypes = MEAT | FRIED junkiness = 25 w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/fried_chicken/Initialize(mapload) . = ..() @@ -856,6 +904,7 @@ w_class = WEIGHT_CLASS_SMALL //basic ingredients, but a lot of them. just covering costs here venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/beef_wellington name = "beef wellington" @@ -870,6 +919,7 @@ foodtypes = MEAT | VEGETABLES | GRAIN w_class = WEIGHT_CLASS_NORMAL venue_value = FOOD_PRICE_EXOTIC + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/beef_wellington/make_processable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/beef_wellington_slice, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut") @@ -887,6 +937,7 @@ foodtypes = MEAT | VEGETABLES | GRAIN w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/full_english name = "full english breakfast" @@ -901,6 +952,7 @@ foodtypes = MEAT | VEGETABLES | GRAIN | BREAKFAST w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_EXOTIC + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/raw_meatloaf name = "raw meatloaf" @@ -915,6 +967,7 @@ tastes = list("raw meat" = 3, "onions" = 1) foodtypes = MEAT | RAW | VEGETABLES w_class = WEIGHT_CLASS_NORMAL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/raw_meatloaf/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/meatloaf, rand(30 SECONDS, 40 SECONDS), TRUE, TRUE) @@ -932,7 +985,7 @@ tastes = list("juicy meat" = 3, "onions" = 1, "garlic" = 1, "ketchup" = 1) foodtypes = MEAT | VEGETABLES w_class = WEIGHT_CLASS_NORMAL - burns_in_oven = TRUE + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/meatloaf/make_processable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meatloaf_slice, 4, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut") @@ -950,3 +1003,93 @@ tastes = list("juicy meat" = 3, "onions" = 1, "garlic" = 1, "ketchup" = 1) foodtypes = MEAT | VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_4 + +/obj/item/food/sweet_and_sour_meatballs + name = "sweet and sour meatballs" + desc = "Golden meatballs glazed in a sticky savory sauce, served with pineapple and pepper chunks." + icon = 'icons/obj/food/meat.dmi' + icon_state = "sweet_and_sour_meatballs" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 10, + /datum/reagent/consumable/nutriment/vitamin = 8, + /datum/reagent/consumable/nutriment = 8, + ) + tastes = list("meat" = 5, "savory sauce" = 4, "tangy pineapple" = 3, "pepper" = 2) + foodtypes = MEAT | VEGETABLES | FRUIT | PINEAPPLE + crafting_complexity = FOOD_COMPLEXITY_3 + +/obj/item/food/kebab/pineapple_skewer + name = "pineapple skewer" + desc = "Chunks of glazed meat skewered on a rod with pineapple slices. Surprisingly not bad!" + icon = 'icons/obj/food/meat.dmi' + icon_state = "pineapple_skewer" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 10, + /datum/reagent/consumable/nutriment/vitamin = 8, + ) + tastes = list("juicy meat" = 4, "pineapple" = 3) + foodtypes = MEAT | FRUIT | PINEAPPLE + crafting_complexity = FOOD_COMPLEXITY_3 + +/obj/item/food/futomaki_sushi_roll + name = "futomaki sushi roll" + desc = "A roll of futomaki sushi, made of boiled egg, fish, and cucumber. Sliceable" + icon_state = "futomaki_sushi_roll" + food_reagents = list( + /datum/reagent/consumable/nutriment = 12, + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 4, + ) + tastes = list("boiled rice" = 4, "fish" = 5, "egg" = 3, "dried seaweed" = 2, "cucumber" = 2) + foodtypes = VEGETABLES | SEAFOOD + w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 + +/obj/item/food/futomaki_sushi_roll/make_processable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/futomaki_sushi_slice, 4, screentip_verb = "Chop") + +/obj/item/food/futomaki_sushi_slice + name = "futomaki sushi slice" + desc = "A slice of futomaki sushi, made of boiled egg, fish, and cucumber." + icon_state = "futomaki_sushi_slice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/nutriment/protein = 2, + /datum/reagent/consumable/nutriment/vitamin = 1, + ) + tastes = list("boiled rice" = 4, "fish" = 5, "egg" = 3, "dried seaweed" = 2, "cucumber" = 2) + foodtypes = VEGETABLES | SEAFOOD + w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 + +/obj/item/food/philadelphia_sushi_roll + name = "Philadelphia sushi roll" + desc = "A roll of Philadelphia sushi, made of cheese, fish, and cucumber. Sliceable" + icon_state = "philadelphia_sushi_roll" + food_reagents = list( + /datum/reagent/consumable/nutriment = 12, + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 8, + ) + tastes = list("boiled rice" = 4, "fish" = 5, "creamy cheese" = 3, "dried seaweed" = 2, "cucumber" = 2) + foodtypes = VEGETABLES | SEAFOOD | DAIRY + w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 + +/obj/item/food/philadelphia_sushi_roll/make_processable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/philadelphia_sushi_slice, 4, screentip_verb = "Chop") + +/obj/item/food/philadelphia_sushi_slice + name = "Philadelphia sushi slice" + desc = "A roll of Philadelphia sushi, made of cheese, fish, and cucumber." + icon_state = "philadelphia_sushi_slice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/nutriment/protein = 2, + /datum/reagent/consumable/nutriment/vitamin = 2, + ) + tastes = list("boiled rice" = 4, "fish" = 5, "creamy cheese" = 3, "dried seaweed" = 2, "cucumber" = 2) + foodtypes = VEGETABLES | SEAFOOD | DAIRY + w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 diff --git a/code/game/objects/items/food/meatslab.dm b/code/game/objects/items/food/meatslab.dm index 07638067d290c..483aa73607488 100644 --- a/code/game/objects/items/food/meatslab.dm +++ b/code/game/objects/items/food/meatslab.dm @@ -11,8 +11,9 @@ icon_state = "meat" bite_consumption = 3 food_reagents = list( - /datum/reagent/consumable/nutriment/protein = 6, - /datum/reagent/consumable/cooking_oil = 2, + /datum/reagent/consumable/nutriment/protein = 5, + /datum/reagent/consumable/nutriment/fat = 2, + /datum/reagent/consumable/nutriment/vitamin = 1, ) //Meat has fats that a food processor can process into cooking oil tastes = list("meat" = 1) foodtypes = MEAT | RAW @@ -77,6 +78,7 @@ tastes = list("meat" = 4, "scales" = 1) foodtypes = MEAT | RAW | GORE venue_value = FOOD_MEAT_MUTANT + starting_reagent_purity = 0.4 // Take a look at their diet /obj/item/food/meat/slab/human/mutant/lizard/make_grillable() AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/plain/human/lizard, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) @@ -147,6 +149,7 @@ desc = "A synthetic slab of meat." foodtypes = RAW | MEAT //hurr durr chemicals were harmed in the production of this meat thus its non-vegan. venue_value = FOOD_PRICE_WORTHLESS + starting_reagent_purity = 0.3 /obj/item/food/meat/slab/synthmeat/make_grillable() AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/plain/synth, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) @@ -157,6 +160,7 @@ desc = "A slab of station reclaimed and chemically processed meat product." tastes = list("meat flavoring" = 2, "modified starches" = 2, "natural & artificial dyes" = 1, "butyric acid" = 1) foodtypes = RAW | MEAT + starting_reagent_purity = 0.3 /obj/item/food/meat/slab/meatproduct/make_grillable() AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/meatproduct, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) @@ -164,6 +168,7 @@ /obj/item/food/meat/slab/monkey name = "monkey meat" foodtypes = RAW | MEAT + starting_reagent_purity = 0.3 // Monkeys are considered synthetic life /obj/item/food/meat/slab/bugmeat name = "bug meat" @@ -229,7 +234,7 @@ /datum/reagent/consumable/nutriment/protein = 16, /datum/reagent/medicine/morphine = 5, /datum/reagent/consumable/nutriment/vitamin = 2, - /datum/reagent/consumable/cooking_oil = 6, + /datum/reagent/consumable/nutriment/fat = 6, ) tastes = list("meat" = 1, "salmon" = 1) foodtypes = RAW | MEAT @@ -286,7 +291,7 @@ food_reagents = list( /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/toxin = 5, - /datum/reagent/consumable/cooking_oil = 3, + /datum/reagent/consumable/nutriment/fat = 3, ) icon_state = "goliathmeat" tastes = list("meat" = 1) @@ -300,7 +305,7 @@ /obj/item/food/meat/slab/meatwheat name = "meatwheat clump" desc = "This doesn't look like meat, but your standards aren't that high to begin with." - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/blood = 5, /datum/reagent/consumable/cooking_oil = 1) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/blood = 5, /datum/reagent/consumable/nutriment/fat = 1) icon_state = "meatwheat_clump" bite_consumption = 4 tastes = list("meat" = 1, "wheat" = 1) @@ -312,7 +317,7 @@ food_reagents = list( /datum/reagent/consumable/nutriment/protein = 7, /datum/reagent/consumable/nutriment/vitamin = 1, - /datum/reagent/consumable/cooking_oil = 5, //Plenty of fat! + /datum/reagent/consumable/nutriment/fat = 5, //Plenty of fat! ) /obj/item/food/meat/rawbacon @@ -322,10 +327,11 @@ bite_consumption = 2 food_reagents = list( /datum/reagent/consumable/nutriment/protein = 2, - /datum/reagent/consumable/cooking_oil = 3, + /datum/reagent/consumable/nutriment/fat = 3, ) tastes = list("bacon" = 1) foodtypes = RAW | MEAT + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/meat/rawbacon/make_grillable() AddComponent(/datum/component/grillable, /obj/item/food/meat/bacon, rand(25 SECONDS, 45 SECONDS), TRUE, TRUE) @@ -337,11 +343,11 @@ food_reagents = list( /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 1, - /datum/reagent/consumable/cooking_oil = 2, + /datum/reagent/consumable/nutriment/fat = 2, ) tastes = list("bacon" = 1) foodtypes = MEAT | BREAKFAST - burns_on_grill = TRUE + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/meat/slab/gondola name = "gondola meat" @@ -349,7 +355,7 @@ food_reagents = list( /datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/gondola_mutation_toxin = 5, - /datum/reagent/consumable/cooking_oil = 3, + /datum/reagent/consumable/nutriment/fat = 3, ) tastes = list("meat" = 4, "tranquility" = 1) foodtypes = RAW | MEAT | GORE @@ -366,7 +372,7 @@ desc = "A slab of penguin meat." food_reagents = list( /datum/reagent/consumable/nutriment/protein = 4, - /datum/reagent/consumable/cooking_oil = 3, + /datum/reagent/consumable/nutriment/fat = 3, ) tastes = list("beef" = 1, "cod fish" = 1) @@ -384,7 +390,7 @@ bite_consumption = 3 food_reagents = list( /datum/reagent/consumable/nutriment/protein = 3, - /datum/reagent/consumable/cooking_oil = 3, + /datum/reagent/consumable/nutriment/fat = 3, ) tastes = list("raw crab" = 1) foodtypes = RAW | MEAT @@ -399,11 +405,11 @@ food_reagents = list( /datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2, - /datum/reagent/consumable/cooking_oil = 2, + /datum/reagent/consumable/nutriment/fat = 2, ) tastes = list("crab" = 1) foodtypes = SEAFOOD - burns_on_grill = TRUE + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/meat/slab/chicken name = "chicken meat" @@ -411,6 +417,7 @@ desc = "A slab of raw chicken. Remember to wash your hands!" food_reagents = list(/datum/reagent/consumable/nutriment/protein = 6) //low fat tastes = list("chicken" = 1) + starting_reagent_purity = 1 /obj/item/food/meat/slab/chicken/make_processable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/chicken, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut") @@ -428,10 +435,25 @@ icon_state = "pig_meat" tastes = list("pig" = 1) foodtypes = RAW | MEAT | GORE + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 2, + /datum/reagent/consumable/nutriment/fat = 5, + /datum/reagent/consumable/nutriment/vitamin = 1, + ) // Fatty piece + starting_reagent_purity = 1 /obj/item/food/meat/slab/pig/make_grillable() AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/plain/pig, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) +/obj/item/food/meat/slab/grassfed + name = "eco meat" + desc = "A slab of 100% grass fed award-winning farm meat." + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 3, + /datum/reagent/consumable/nutriment/fat = 4, + /datum/reagent/consumable/nutriment/vitamin = 1, + ) // Marble + starting_reagent_purity = 1 ////////////////////////////////////// MEAT STEAKS /////////////////////////////////////////////////////////// /obj/item/food/meat/steak @@ -439,12 +461,13 @@ desc = "A piece of hot spicy meat." icon_state = "meatsteak" food_reagents = list( - /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/protein = 5, + /datum/reagent/consumable/nutriment/fat = 2, /datum/reagent/consumable/nutriment/vitamin = 1, ) foodtypes = MEAT tastes = list("meat" = 1) - burns_on_grill = TRUE + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/meat/steak/Initialize(mapload) . = ..() @@ -659,7 +682,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2) tastes = list("meat" = 1) foodtypes = MEAT - burns_on_grill = TRUE + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/meat/cutlet/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/food/mexican.dm b/code/game/objects/items/food/mexican.dm index 4477090d87c7a..b4e32587bc6f5 100644 --- a/code/game/objects/items/food/mexican.dm +++ b/code/game/objects/items/food/mexican.dm @@ -10,6 +10,7 @@ tastes = list("tortilla" = 1) foodtypes = GRAIN w_class = WEIGHT_CLASS_TINY + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/tortilla/make_grillable() AddComponent(/datum/component/grillable, /obj/item/food/hard_taco_shell, rand(15 SECONDS, 30 SECONDS), TRUE, TRUE) @@ -28,6 +29,7 @@ foodtypes = GRAIN w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/cheesyburrito name = "cheesy burrito" @@ -43,6 +45,7 @@ foodtypes = GRAIN | DAIRY w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_EXOTIC + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/carneburrito name = "carne asada burrito" @@ -58,6 +61,7 @@ foodtypes = GRAIN | MEAT w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_EXOTIC + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/fuegoburrito name = "fuego plasma burrito" @@ -74,6 +78,7 @@ foodtypes = GRAIN w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_LEGENDARY + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/nachos name = "nachos" @@ -88,6 +93,7 @@ foodtypes = GRAIN | FRIED w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_CHEAP + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/cheesynachos name = "cheesy nachos" @@ -103,6 +109,7 @@ foodtypes = GRAIN | FRIED | DAIRY w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_EXOTIC + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/cubannachos name = "Cuban nachos" @@ -117,6 +124,7 @@ tastes = list("nachos" = 2, "hot pepper" = 1) foodtypes = VEGETABLES | FRIED | DAIRY w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/taco name = "classic taco" @@ -132,6 +140,7 @@ foodtypes = MEAT | DAIRY | GRAIN | VEGETABLES w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/taco/plain name = "plain taco" @@ -145,6 +154,7 @@ tastes = list("taco" = 4, "meat" = 2, "cheese" = 2) foodtypes = MEAT | DAIRY | GRAIN venue_value = FOOD_PRICE_CHEAP + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/taco/fish name = "fish taco" @@ -152,6 +162,7 @@ icon_state = "fishtaco" tastes = list("taco" = 4, "fish" = 2, "cheese" = 2, "cabbage" = 1) foodtypes = SEAFOOD | DAIRY | GRAIN | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/enchiladas name = "enchiladas" @@ -168,6 +179,7 @@ tastes = list("hot peppers" = 1, "meat" = 3, "cheese" = 1, "sour cream" = 1) foodtypes = MEAT | GRAIN w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/stuffedlegion name = "stuffed legion" @@ -183,6 +195,7 @@ foodtypes = MEAT w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_LEGENDARY + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/chipsandsalsa name = "chips and salsa" @@ -197,6 +210,7 @@ tastes = list("peppers" = 1, "salsa" = 3, "tortilla chips" = 1, "onion" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/classic_chimichanga name = "classic chimichanga" @@ -211,6 +225,7 @@ tastes = list("deep-fried tortilla" = 1, "meat" = 3, "cheese" = 1, "onions" = 1) foodtypes = MEAT | GRAIN | VEGETABLES | DAIRY | FRIED w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/vegetarian_chimichanga name = "vegetarian chimichanga" @@ -224,6 +239,7 @@ tastes = list("deep-fried tortilla" = 1, "cabbage" = 3, "onions" = 1, "peppers" = 1) foodtypes = GRAIN | VEGETABLES | FRIED w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/hard_taco_shell name = "hard taco shell" @@ -234,7 +250,7 @@ tastes = list("hard corn tortilla" = 1) foodtypes = GRAIN | FRIED w_class = WEIGHT_CLASS_SMALL - burns_on_grill = TRUE + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/hard_taco_shell/Initialize(mapload) . = ..() @@ -247,6 +263,7 @@ tastes = list() icon_state = "hard_taco_shell" desc = "A customized hard-shell taco." + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/classic_hard_shell_taco name = "classic hard-shell taco" @@ -261,6 +278,7 @@ tastes = list("crunchy taco shell" = 1, "cabbage" = 3, "tomatoes" = 1, "ground meat" = 1, "cheese" = 1) foodtypes = GRAIN | VEGETABLES | MEAT | DAIRY w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/plain_hard_shell_taco name = "plain hard-shell taco" @@ -275,6 +293,7 @@ tastes = list("crunchy taco shell" = 1, "ground meat" = 1) foodtypes = GRAIN | MEAT w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/refried_beans name = "refried beans" @@ -289,6 +308,7 @@ tastes = list("mashed beans" = 1, "onion" = 3,) foodtypes = VEGETABLES | FRIED w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/spanish_rice name = "spanish rice" @@ -302,3 +322,18 @@ tastes = list("zesty rice" = 1, "tomato sauce" = 3,) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 + +/obj/item/food/pineapple_salsa + name = "pineapple salsa" + desc = "A not-so liquid salsa made of pineapples, tomatoes, onions, and chilis. Makes for delightfully contrasting flavors." + icon = 'icons/obj/food/mexican.dmi' + icon_state = "pineapple_salsa" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/vitamin = 6, + ) + tastes = list("pineapple" = 4, "tomato" = 3, "onion" = 2, "chili" = 2) + foodtypes = VEGETABLES | FRUIT | PINEAPPLE + w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 diff --git a/code/game/objects/items/food/misc.dm b/code/game/objects/items/food/misc.dm index 79456a5f9799f..115d1fd5968b2 100644 --- a/code/game/objects/items/food/misc.dm +++ b/code/game/objects/items/food/misc.dm @@ -12,7 +12,7 @@ tastes = list("watermelon" = 1) foodtypes = FRUIT food_flags = FOOD_FINGER_FOOD - juice_results = list(/datum/reagent/consumable/watermelonjuice = 5) + juice_typepath = /datum/reagent/consumable/watermelonjuice w_class = WEIGHT_CLASS_SMALL /obj/item/food/hugemushroomslice @@ -54,10 +54,11 @@ ) tastes = list("salt" = 2, "popcorn" = 1) trash_type = /obj/item/trash/popcorn/salty + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/popcorn/caramel name = "caramel popcorn" - icon_state = "сaramel_popcorn" + icon_state = "caramel_popcorn" desc = "Caramel-covered popcorn. Sweet!" food_reagents = list( /datum/reagent/consumable/nutriment = 2, @@ -65,7 +66,8 @@ ) tastes = list("caramel" = 2, "popcorn" = 1) foodtypes = JUNKFOOD | SUGAR - trash_type = /obj/item/trash/popcorn/caramel + trash_type = /obj/item/trash/popcorn/ + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/soydope name = "soy dope" @@ -78,6 +80,7 @@ tastes = list("soy" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/badrecipe name = "burned mess" @@ -87,10 +90,20 @@ foodtypes = GROSS w_class = WEIGHT_CLASS_SMALL preserved_food = TRUE //Can't decompose any more than this + /// Variable that holds the reference to the stink lines we get when we're moldy, yucky yuck + var/stink_particles /obj/item/food/badrecipe/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_ITEM_GRILL_PROCESS, PROC_REF(OnGrill)) + if(stink_particles) + particles = new stink_particles + +// We override the parent procs here to prevent burned messes from cooking into burned messes. +/obj/item/food/badrecipe/make_grillable() + return +/obj/item/food/badrecipe/make_bakeable() + return /obj/item/food/badrecipe/moldy name = "moldy mess" @@ -100,6 +113,7 @@ ant_attracting = TRUE decomp_type = null decomposition_time = 30 SECONDS + stink_particles = /particles/stink /obj/item/food/badrecipe/moldy/bacteria name = "bacteria rich moldy mess" @@ -129,19 +143,20 @@ w_class = WEIGHT_CLASS_TINY /obj/item/food/spidereggs/processed - name = "spider eggs" + name = "processed spider eggs" desc = "A cluster of juicy spider eggs. Pops in your mouth without making you sick." icon_state = "spidereggs" food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4) tastes = list("cobwebs" = 1) foodtypes = MEAT | BUGS w_class = WEIGHT_CLASS_TINY + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/spiderling name = "spiderling" desc = "It's slightly twitching in your hand. Ew..." - icon = 'icons/obj/food/meat.dmi' - icon_state = "spiderling" + icon = 'icons/mob/simple/arachnoid.dmi' + icon_state = "spiderling_dead" food_reagents = list( /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/toxin = 4, @@ -162,6 +177,7 @@ tastes = list("melon" = 1) foodtypes = FRUIT w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/melonkeg name = "melon keg" @@ -176,6 +192,7 @@ bite_consumption = 5 tastes = list("grain alcohol" = 1, "fruit" = 1) foodtypes = FRUIT | ALCOHOL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/honeybar name = "honey nut bar" @@ -189,6 +206,7 @@ foodtypes = GRAIN | SUGAR food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/powercrepe name = "Powercrepe" @@ -211,6 +229,7 @@ w_class = WEIGHT_CLASS_BULKY tastes = list("cherry" = 1, "crepe" = 1) foodtypes = GRAIN | FRUIT | SUGAR + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/branrequests name = "Bran Requests Cereal" @@ -224,15 +243,17 @@ tastes = list("bran" = 4, "raisins" = 3, "salt" = 1) foodtypes = GRAIN | FRUIT | BREAKFAST w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/butter name = "stick of butter" desc = "A stick of delicious, golden, fatty goodness." icon_state = "butter" - food_reagents = list(/datum/reagent/consumable/nutriment = 5) + food_reagents = list(/datum/reagent/consumable/nutriment/fat = 6) tastes = list("butter" = 1) foodtypes = DAIRY w_class = WEIGHT_CLASS_SMALL + dog_fashion = /datum/dog_fashion/head/butter /obj/item/food/butter/examine(mob/user) . = ..() @@ -259,6 +280,19 @@ icon_state = "butteronastick" trash_type = /obj/item/stack/rods food_flags = FOOD_FINGER_FOOD + venue_value = FOOD_PRICE_CHEAP + +/obj/item/food/butter/make_processable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/butterslice, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice") + +/obj/item/food/butterslice + name = "butter slice" + desc = "A slice of butter, for your buttering needs." + icon_state = "butterslice" + food_reagents = list(/datum/reagent/consumable/nutriment = 5) + tastes = list("butter" = 1) + foodtypes = DAIRY + w_class = WEIGHT_CLASS_SMALL /obj/item/food/onionrings name = "onion rings" @@ -269,12 +303,13 @@ tastes = list("batter" = 3, "onion" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/pineappleslice name = "pineapple slice" desc = "A sliced piece of juicy pineapple." icon_state = "pineapple_slice" - juice_results = list(/datum/reagent/consumable/pineapplejuice = 3) + juice_typepath = /datum/reagent/consumable/pineapplejuice tastes = list("pineapple" = 1) foodtypes = FRUIT | PINEAPPLE w_class = WEIGHT_CLASS_TINY @@ -293,6 +328,7 @@ tastes = list("cream cheese" = 4, "crab" = 3, "crispiness" = 2) foodtypes = MEAT | DAIRY | GRAIN venue_value = FOOD_PRICE_CHEAP + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pesto name = "pesto" @@ -302,6 +338,7 @@ tastes = list("pesto" = 1) foodtypes = VEGETABLES | DAIRY | NUTS w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/tomato_sauce name = "tomato sauce" @@ -311,6 +348,7 @@ tastes = list("tomato" = 1, "herbs" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/bechamel_sauce name = "béchamel sauce" @@ -320,6 +358,7 @@ tastes = list("cream" = 1) foodtypes = DAIRY | GRAIN w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/roasted_bell_pepper name = "roasted bell pepper" @@ -332,7 +371,7 @@ ) tastes = list("bell pepper" = 1, "char" = 1) foodtypes = VEGETABLES - burns_in_oven = TRUE + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/pierogi name = "pierogi" @@ -345,6 +384,7 @@ tastes = list("potato" = 1, "onions" = 1) foodtypes = GRAIN | VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/stuffed_cabbage name = "stuffed cabbage" @@ -357,6 +397,7 @@ tastes = list("juicy meat" = 1, "rice" = 1, "cabbage" = 1) foodtypes = MEAT | VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/seaweedsheet name = "seaweed sheet" @@ -387,6 +428,7 @@ tastes = list("granola" = 1, "nuts" = 1, "chocolate" = 1, "raisin" = 1) foodtypes = GRAIN | NUTS | FRUIT | SUGAR | DAIRY w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/onigiri name = "onigiri" @@ -400,6 +442,7 @@ tastes = list("rice" = 1, "dried seaweed" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/onigiri/Initialize(mapload) . = ..() @@ -426,6 +469,7 @@ tastes = list("peanuts" = 1, "sweetness" = 1) foodtypes = NUTS | SUGAR w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/pickle name = "pickle" @@ -435,12 +479,23 @@ food_reagents = list( /datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1, + /datum/reagent/consumable/pickle = 1, /datum/reagent/medicine/antihol = 2, ) tastes = list("pickle" = 1, "spices" = 1, "salt water" = 2) + juice_typepath = /datum/reagent/consumable/pickle foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL +/obj/item/food/pickle/make_edible() + . = ..() + AddComponent(/datum/component/edible, check_liked = CALLBACK(src, PROC_REF(check_liked))) + +/obj/item/food/pickle/proc/check_liked(mob/living/carbon/human/consumer) + var/obj/item/organ/internal/liver/liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER) + if(!HAS_TRAIT(consumer, TRAIT_AGEUSIA) && liver && HAS_TRAIT(liver, TRAIT_CORONER_METABOLISM)) + return FOOD_LIKED + /obj/item/food/springroll name = "spring roll" desc = "A plate of translucent rice wrappers filled with fresh vegetables, served with sweet chili sauce. You either love them or hate them." @@ -454,6 +509,7 @@ tastes = list("rice wrappers" = 1, "spice" = 1, "crunchy veggies" = 1) foodtypes = GRAIN | VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cheese_pierogi name = "cheese pierogi" @@ -466,6 +522,7 @@ tastes = list("potato" = 1, "cheese" = 1) foodtypes = GRAIN | VEGETABLES | DAIRY w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/meat_pierogi name = "meat pierogi" @@ -479,3 +536,153 @@ tastes = list("potato" = 1, "cheese" = 1) foodtypes = GRAIN | VEGETABLES | MEAT w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 + +/obj/item/food/stuffed_eggplant + name = "stuffed eggplant" + desc = "A cooked half of an eggplant, with the insides scooped out and mixed with meat, cheese, and veggies." + icon_state = "stuffed_eggplant" + food_reagents = list( + /datum/reagent/consumable/nutriment = 10, + /datum/reagent/consumable/nutriment/vitamin = 6, + /datum/reagent/consumable/nutriment/protein = 4, + ) + tastes = list("cooked eggplant" = 5, "cheese" = 4, "ground meat" = 3, "veggies" = 2) + foodtypes = VEGETABLES | MEAT | DAIRY + w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 + +/obj/item/food/moussaka + name = "moussaka" + desc = "A layered Mediterranean dish made of eggplants, mixed veggies, and meat with a topping of bechamel sauce. Sliceable" + icon_state = "moussaka" + food_reagents = list( + /datum/reagent/consumable/nutriment = 30, + /datum/reagent/consumable/nutriment/vitamin = 10, + /datum/reagent/consumable/nutriment/protein = 20, + ) + tastes = list("cooked eggplant" = 5, "potato" = 1, "baked veggies" = 2, "meat" = 4, "bechamel sauce" = 3) + foodtypes = MEAT | DAIRY | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_4 + +/obj/item/food/moussaka/make_processable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/moussaka_slice, 4, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut") + +/obj/item/food/moussaka_slice + name = "moussaka slice" + desc = "A layered Mediterranean dish made of eggplants, mixed veggies, and meat with a topping of bechamel sauce. Delish!" + icon_state = "moussaka_slice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/vitamin = 2, + /datum/reagent/consumable/nutriment/protein = 5, + ) + tastes = list("cooked eggplant" = 5, "potato" = 1, "baked veggies" = 2, "meat" = 4, "bechamel sauce" = 3) + foodtypes = MEAT | DAIRY | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_4 + +/obj/item/food/candied_pineapple + name = "candied pineapple" + desc = "A chunk of pineapple coated in sugar and dried into a chewy treat." + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/nutriment/vitamin = 3, + ) + icon_state = "candied_pineapple_1" + base_icon_state = "candied_pineapple" + tastes = list("sugar" = 2, "chewy pineapple" = 4) + foodtypes = FRUIT | SUGAR + food_flags = FOOD_FINGER_FOOD + w_class = WEIGHT_CLASS_TINY + crafting_complexity = FOOD_COMPLEXITY_1 + +/obj/item/food/candied_pineapple/Initialize(mapload) + . = ..() + icon_state = "[base_icon_state]_[rand(1, 3)]" + +/obj/item/food/raw_pita_bread + name = "raw pita bread" + desc = "a sticky disk of raw pita bread." + icon = 'icons/obj/food/food_ingredients.dmi' + icon_state = "raw_pita_bread" + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/nutriment/vitamin = 3, + ) + tastes = list("dough" = 2) + foodtypes = GRAIN + w_class = WEIGHT_CLASS_TINY + crafting_complexity = FOOD_COMPLEXITY_1 + +/obj/item/food/raw_pita_bread/make_grillable() + AddComponent(/datum/component/grillable, /obj/item/food/pita_bread, rand(15 SECONDS, 30 SECONDS), TRUE, TRUE) + +/obj/item/food/raw_pita_bread/make_bakeable() + AddComponent(/datum/component/bakeable, /obj/item/food/pita_bread, rand(15 SECONDS, 30 SECONDS), TRUE, TRUE) + +/obj/item/food/pita_bread + name = "pita bread" + desc = "a multi-purposed sweet flatbread of Mediterranean origins." + icon = 'icons/obj/food/food_ingredients.dmi' + icon_state = "pita_bread" + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/nutriment/vitamin = 3, + ) + tastes = list("pita bread" = 2) + foodtypes = GRAIN + w_class = WEIGHT_CLASS_TINY + crafting_complexity = FOOD_COMPLEXITY_2 + +/obj/item/food/tzatziki_sauce + name = "tzatziki sauce" + desc = "A garlic-based sauce or dip widely used in Mediterranean and Middle Eastern cuisine. Delicious on its own when dipped with pita bread or vegetables." + icon_state = "tzatziki_sauce" + food_reagents = list( + /datum/reagent/consumable/nutriment = 5, + /datum/reagent/consumable/nutriment/vitamin = 5, + ) + tastes = list("garlic" = 4, "cucumber" = 2, "olive oil" = 2) + foodtypes = VEGETABLES + w_class = WEIGHT_CLASS_TINY + crafting_complexity = FOOD_COMPLEXITY_2 + +/obj/item/food/tzatziki_and_pita_bread + name = "tzatziki and pita bread" + desc = "Tzatziki sauce, now with pita bread for dipping. Very healthy and delicious all in one." + icon_state = "tzatziki_and_pita_bread" + food_reagents = list( + /datum/reagent/consumable/nutriment = 8, + /datum/reagent/consumable/nutriment/vitamin = 8, + ) + tastes = list("pita bread" = 4, "tzatziki sauce" = 2, "olive oil" = 2) + foodtypes = VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_TINY + crafting_complexity = FOOD_COMPLEXITY_3 + +/obj/item/food/grilled_beef_gyro + name = "grilled beef gyro" + desc = "A traditional Greek dish of meat wrapped in pita bread with tomato, cabbage, onion, and tzatziki sauce." + icon_state = "grilled_beef_gyro" + food_reagents = list( + /datum/reagent/consumable/nutriment = 10, + /datum/reagent/consumable/nutriment/vitamin = 8, + /datum/reagent/consumable/nutriment/protein = 6, + ) + tastes = list("pita bread" = 4, "tender meat" = 2, "tzatziki sauce" = 2, "mixed veggies" = 2) + foodtypes = VEGETABLES | GRAIN | MEAT + w_class = WEIGHT_CLASS_TINY + crafting_complexity = FOOD_COMPLEXITY_4 + +/obj/item/food/vegetarian_gyro + name = "vegetarian gyro" + desc = "A traditional Greek gyro with cucumbers substituted for meat. Still full of intense flavor and very nourishing." + icon_state = "vegetarian_gyro" + food_reagents = list( + /datum/reagent/consumable/nutriment = 10, + /datum/reagent/consumable/nutriment/vitamin = 12, + ) + tastes = list("pita bread" = 4, "cucumber" = 2, "tzatziki sauce" = 2, "mixed veggies" = 2) + foodtypes = VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_TINY + crafting_complexity = FOOD_COMPLEXITY_4 diff --git a/code/game/objects/items/food/monkeycube.dm b/code/game/objects/items/food/monkeycube.dm index a46c6a82042d2..0013fbcdadddb 100644 --- a/code/game/objects/items/food/monkeycube.dm +++ b/code/game/objects/items/food/monkeycube.dm @@ -48,7 +48,7 @@ return Expand() user.visible_message(span_danger("[user]'s torso bursts open as a primate emerges!")) - user.gib(null, TRUE, null, TRUE) + user.gib(DROP_BRAIN|DROP_BODYPARTS|DROP_ITEMS) // just remove the organs /obj/item/food/monkeycube/syndicate faction = list(FACTION_NEUTRAL, ROLE_SYNDICATE) @@ -85,4 +85,4 @@ /datum/reagent/medicine/strange_reagent = 1, ) tastes = list("buzzing" = 1, "honey" = 1, "regret" = 1) - spawned_mob = /mob/living/simple_animal/hostile/bee + spawned_mob = /mob/living/basic/bee diff --git a/code/game/objects/items/food/moth.dm b/code/game/objects/items/food/moth.dm index 7644c488b20d9..3bb3c8738d41f 100644 --- a/code/game/objects/items/food/moth.dm +++ b/code/game/objects/items/food/moth.dm @@ -13,6 +13,7 @@ tastes = list("cheese" = 1, "herbs" = 1) foodtypes = DAIRY | VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/grilled_cheese name = "grilled cheese" @@ -27,7 +28,7 @@ tastes = list("cheese" = 1, "char" = 1) foodtypes = DAIRY w_class = WEIGHT_CLASS_SMALL - burns_on_grill = TRUE + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/mothic_salad name = "mothic salad" @@ -38,6 +39,7 @@ tastes = list("salad" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/toasted_seeds name = "toasted seeds" @@ -49,6 +51,7 @@ tastes = list("seeds" = 1) foodtypes = GRAIN w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/engine_fodder name = "engine fodder" @@ -65,6 +68,7 @@ tastes = list("seeds" = 1, "nuts" = 1, "chocolate" = 1, "salt" = 1, "popcorn" = 1, "potato" = 1) foodtypes = GRAIN | NUTS | VEGETABLES | SUGAR w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/mothic_pizza_dough name = "mothic pizza dough" @@ -75,6 +79,7 @@ tastes = list("raw flour" = 1) foodtypes = GRAIN w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 //Entrees: categorising food that is 90% cheese and salad is not easy /obj/item/food/squeaking_stir_fry @@ -90,6 +95,7 @@ tastes = list("cheese" = 1, "tofu" = 1, "veggies" = 1) foodtypes = DAIRY | VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/sweet_chili_cabbage_wrap name = "sweet chili cabbage wrap" @@ -104,6 +110,7 @@ tastes = list("cheese" = 1, "salad" = 1, "sweet chili" = 1) foodtypes = DAIRY | VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/loaded_curds name = "ozlsettitæloskekllön ede pommes" //ozlsettit = overflowing (ozl = over, sett = flow, it = ing), ælo = cheese, skekllön = curds (skeklit = squeaking, llön = pieces/bits), ede = and, pommes = fries (hey, France!) @@ -120,6 +127,7 @@ tastes = list("cheese" = 1, "oil" = 1, "chili" = 1, "fries" = 1) foodtypes = DAIRY | VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/baked_cheese name = "baked cheese wheel" @@ -134,7 +142,7 @@ tastes = list("cheese" = 1) foodtypes = DAIRY w_class = WEIGHT_CLASS_SMALL - burns_in_oven = TRUE + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/baked_cheese_platter name = "stanntkraktælo" //stannt = oven, krakt = baked, ælo = cheese @@ -150,6 +158,7 @@ tastes = list("cheese" = 1, "bread" = 1) foodtypes = DAIRY | GRAIN w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 //Baked Green Lasagna at the Whistlestop Cafe /obj/item/food/raw_green_lasagne @@ -164,6 +173,7 @@ tastes = list("cheese" = 1, "pesto" = 1, "pasta" = 1) foodtypes = VEGETABLES | GRAIN | NUTS | RAW w_class = WEIGHT_CLASS_NORMAL + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/raw_green_lasagne/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/green_lasagne, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) @@ -180,7 +190,7 @@ tastes = list("cheese" = 1, "pesto" = 1, "pasta" = 1) foodtypes = VEGETABLES | GRAIN | NUTS w_class = WEIGHT_CLASS_NORMAL - burns_in_oven = TRUE + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/green_lasagne/make_processable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/green_lasagne_slice, 6, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice") @@ -197,6 +207,7 @@ tastes = list("cheese" = 1, "pesto" = 1, "pasta" = 1) foodtypes = VEGETABLES | GRAIN | NUTS w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/raw_baked_rice name = "big rice pan" @@ -210,6 +221,7 @@ tastes = list("rice" = 1, "potato" = 1, "veggies" = 1) foodtypes = VEGETABLES | GRAIN | RAW w_class = WEIGHT_CLASS_NORMAL + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/raw_baked_rice/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/big_baked_rice, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) @@ -227,7 +239,7 @@ tastes = list("rice" = 1, "potato" = 1, "veggies" = 1) foodtypes = VEGETABLES | GRAIN w_class = WEIGHT_CLASS_NORMAL - burns_in_oven = TRUE + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/big_baked_rice/make_processable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/lil_baked_rice, 6, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut") @@ -244,6 +256,7 @@ tastes = list("rice" = 1, "potato" = 1, "veggies" = 1) foodtypes = VEGETABLES | GRAIN w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/oven_baked_corn name = "oven-baked corn" @@ -258,7 +271,7 @@ tastes = list("corn" = 1, "char" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL - burns_in_oven = TRUE + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/buttered_baked_corn name = "buttered baked corn" @@ -273,6 +286,7 @@ tastes = list("corn" = 1, "char" = 1) foodtypes = VEGETABLES | DAIRY w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/fiesta_corn_skillet name = "fiesta corn skillet" @@ -287,6 +301,7 @@ tastes = list("corn" = 1, "chili" = 1, "char" = 1) foodtypes = VEGETABLES | DAIRY w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/raw_ratatouille name = "raw ratatouille" //rawtatouille? @@ -301,6 +316,7 @@ tastes = list("veggies" = 1, "roasted peppers" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/raw_ratatouille/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/ratatouille, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) @@ -318,7 +334,7 @@ tastes = list("veggies" = 1, "roasted peppers" = 1, "char" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL - burns_in_oven = TRUE + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/mozzarella_sticks name = "mozzarella sticks" @@ -332,6 +348,7 @@ tastes = list("creamy cheese" = 1, "breading" = 1, "oil" = 1) foodtypes = DAIRY | GRAIN | FRIED w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/raw_stuffed_peppers name = "raw voltölpaprik" //voltöl = stuffed (vol = full, töl = push), paprik (from German paprika) = bell pepper @@ -345,6 +362,7 @@ tastes = list("creamy cheese" = 1, "herbs" = 1, "onion" = 1, "bell pepper" = 1) foodtypes = DAIRY | VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/raw_stuffed_peppers/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/stuffed_peppers, rand(10 SECONDS, 20 SECONDS), TRUE, TRUE) @@ -361,7 +379,7 @@ tastes = list("creamy cheese" = 1, "herbs" = 1, "onion" = 1, "bell pepper" = 1) foodtypes = DAIRY | VEGETABLES w_class = WEIGHT_CLASS_SMALL - burns_in_oven = TRUE + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/fueljacks_lunch name = "\improper Fueljack's lunch" @@ -377,6 +395,7 @@ tastes = list("cabbage" = 1, "potato" = 1, "onion" = 1, "chili" = 1, "cheese" = 1) foodtypes = DAIRY | VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/mac_balls name = "macheronirölen" @@ -391,6 +410,7 @@ tastes = list("pasta" = 1, "cornbread" = 1, "cheese" = 1) foodtypes = DAIRY | VEGETABLES | FRIED | GRAIN w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/sustenance_bar name = "surplus fleet PSB" @@ -448,6 +468,7 @@ tastes = list("bacon" = 1, "eggs" = 1) foodtypes = MEAT | GRAIN w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/bowled/fried_eggplant_polenta name = "fried eggplant and polenta" @@ -462,6 +483,7 @@ tastes = list("cornmeal" = 1, "cheese" = 1, "eggplant" = 1, "tomato sauce" = 1) foodtypes = DAIRY | GRAIN w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_5 //Salads: the bread and butter of mothic cuisine /obj/item/food/caprese_salad @@ -478,6 +500,7 @@ tastes = list("mozzarella" = 1, "tomato" = 1, "balsamic" = 1) foodtypes = DAIRY | VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/salad/fleet_salad name = "lörtonknusksolt" //lörton = fleet, knusksolt = salad (knusk = crisp, solt = bowl) @@ -492,6 +515,7 @@ tastes = list("cheese" = 1, "salad" = 1, "bread" = 1) foodtypes = DAIRY | VEGETABLES | GRAIN w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/salad/cotton_salad name = "flöfrölenknusksolt" @@ -505,6 +529,7 @@ tastes = list("cheese" = 1, "salad" = 1, "bread" = 1) foodtypes = VEGETABLES | CLOTH w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/salad/moth_kachumbari name = "\improper Kæniatknusksolt" //Kæniat = Kenyan, knusksolt = salad @@ -519,6 +544,7 @@ tastes = list("onion" = 1, "tomato" = 1, "corn" = 1, "chili" = 1, "cilantro" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 //Pizza /obj/item/food/raw_mothic_margherita @@ -535,6 +561,7 @@ ) tastes = list("dough" = 1, "tomato" = 1, "cheese" = 1) foodtypes = GRAIN | VEGETABLES | DAIRY | RAW + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/raw_mothic_margherita/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/pizza/mothic_margherita, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) @@ -554,6 +581,7 @@ foodtypes = GRAIN | VEGETABLES | DAIRY slice_type = /obj/item/food/pizzaslice/mothic_margherita boxtag = "Margherita alla Moffuchi" + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/pizzaslice/mothic_margherita name = "mothic margherita slice" @@ -562,6 +590,7 @@ icon_state = "margherita_slice" tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1) foodtypes = GRAIN | VEGETABLES | DAIRY + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/raw_mothic_firecracker name = "raw mothic firecracker pizza" @@ -577,6 +606,7 @@ ) tastes = list("dough" = 1, "chili" = 1, "corn" = 1, "cheese" = 1, "bbq sauce" = 1) foodtypes = GRAIN | VEGETABLES | DAIRY | RAW + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/raw_mothic_firecracker/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/pizza/mothic_firecracker, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) @@ -597,6 +627,7 @@ foodtypes = GRAIN | VEGETABLES | DAIRY slice_type = /obj/item/food/pizzaslice/mothic_firecracker boxtag = "Vesuvian Firecracker" + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/pizzaslice/mothic_firecracker name = "mothic firecracker slice" @@ -605,6 +636,7 @@ icon_state = "firecracker_slice" tastes = list("crust" = 1, "chili" = 1, "corn" = 1, "cheese" = 1, "bbq sauce" = 1) foodtypes = GRAIN | VEGETABLES | DAIRY + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/raw_mothic_five_cheese name = "raw mothic five-cheese pizza" @@ -619,6 +651,7 @@ ) tastes = list("dough" = 1, "cheese" = 1, "more cheese" = 1, "excessive amounts of cheese" = 1) foodtypes = GRAIN | VEGETABLES | DAIRY | RAW + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/raw_mothic_five_cheese/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/pizza/mothic_five_cheese, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) @@ -638,6 +671,7 @@ foodtypes = GRAIN | VEGETABLES | DAIRY slice_type = /obj/item/food/pizzaslice/mothic_five_cheese boxtag = "Cheeseplosion" + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/pizzaslice/mothic_five_cheese name = "mothic five-cheese slice" @@ -646,6 +680,7 @@ icon_state = "five_cheese_slice" tastes = list("crust" = 1, "cheese" = 1, "more cheese" = 1, "excessive amounts of cheese" = 1) foodtypes = GRAIN | VEGETABLES | DAIRY + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/raw_mothic_white_pie name = "raw mothic white-pie pizza" @@ -660,6 +695,7 @@ ) tastes = list("dough" = 1, "cheese" = 1, "herbs" = 1, "garlic" = 1) foodtypes = GRAIN | VEGETABLES | DAIRY | RAW + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/raw_mothic_white_pie/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/pizza/mothic_white_pie, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) @@ -679,6 +715,7 @@ foodtypes = GRAIN | VEGETABLES | DAIRY slice_type = /obj/item/food/pizzaslice/mothic_white_pie boxtag = "Pane Bianco" + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/pizzaslice/mothic_white_pie name = "mothic white-pie slice" @@ -687,6 +724,7 @@ icon_state = "white_pie_slice" tastes = list("crust" = 1, "cheese" = 1, "more cheese" = 1, "excessive amounts of cheese" = 1) foodtypes = GRAIN | VEGETABLES | DAIRY + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/raw_mothic_pesto name = "raw mothic pesto pizza" @@ -701,6 +739,7 @@ ) tastes = list("dough" = 1, "pesto" = 1, "cheese" = 1) foodtypes = GRAIN | VEGETABLES | DAIRY | NUTS | RAW + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/raw_mothic_pesto/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/pizza/mothic_pesto, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) @@ -720,6 +759,7 @@ foodtypes = GRAIN | VEGETABLES | DAIRY | NUTS | RAW slice_type = /obj/item/food/pizzaslice/mothic_pesto boxtag = "Presto Pesto" + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/pizzaslice/mothic_pesto name = "mothic pesto slice" @@ -728,6 +768,7 @@ icon_state = "pesto_slice" tastes = list("crust" = 1, "pesto" = 1, "cheese" = 1) foodtypes = GRAIN | VEGETABLES | DAIRY | NUTS + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/raw_mothic_garlic name = "raw mothic garlic pizzabread" @@ -742,6 +783,7 @@ ) tastes = list("dough" = 1, "garlic" = 1, "butter" = 1) foodtypes = GRAIN | VEGETABLES | RAW + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/raw_mothic_garlic/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/pizza/mothic_garlic, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) @@ -761,6 +803,7 @@ foodtypes = GRAIN | VEGETABLES | DAIRY | NUTS slice_type = /obj/item/food/pizzaslice/mothic_garlic boxtag = "Garlic Bread alla Moffuchi" + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/pizzaslice/mothic_garlic name = "mothic garlic pizzabread slice" @@ -769,6 +812,7 @@ icon_state = "garlic_slice" tastes = list("dough" = 1, "garlic" = 1, "butter" = 1) foodtypes = GRAIN | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_4 //Bread /obj/item/food/bread/corn @@ -782,6 +826,7 @@ w_class = WEIGHT_CLASS_SMALL slice_type = /obj/item/food/breadslice/corn yield = 6 + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/breadslice/corn name = "cornbread slice" @@ -790,6 +835,7 @@ icon_state = "cornbread_slice" foodtypes = GRAIN food_reagents = list(/datum/reagent/consumable/nutriment = 3) + crafting_complexity = FOOD_COMPLEXITY_2 //Sweets /obj/item/food/moth_cheese_cakes @@ -804,6 +850,7 @@ tastes = list("cheesecake" = 1, "chocolate" = 1, "honey" = 1) foodtypes = SUGAR | FRIED | DAIRY | GRAIN w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/cake/mothmallow name = "mothmallow tray" @@ -818,6 +865,7 @@ foodtypes = VEGETABLES | SUGAR slice_type = /obj/item/food/cakeslice/mothmallow yield = 6 + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/cakeslice/mothmallow name = "mothmallow" @@ -830,6 +878,7 @@ ) tastes = list("vanilla" = 1, "clouds" = 1, "chocolate" = 1) foodtypes = VEGETABLES | SUGAR + crafting_complexity = FOOD_COMPLEXITY_2 //misc food /obj/item/food/bubblegum/wake_up diff --git a/code/game/objects/items/food/packaged.dm b/code/game/objects/items/food/packaged.dm index ce8a6f6a82562..edcc0bd09ed61 100644 --- a/code/game/objects/items/food/packaged.dm +++ b/code/game/objects/items/food/packaged.dm @@ -21,7 +21,6 @@ playsound(user.loc, 'sound/items/foodcanopen.ogg', 50) reagents.flags |= OPENCONTAINER preserved_food = FALSE - make_decompose() /obj/item/food/canned/attack_self(mob/user) if(!is_drainable()) @@ -47,6 +46,7 @@ ) tastes = list("beans" = 1) foodtypes = VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/canned/peaches name = "canned peaches" @@ -102,6 +102,7 @@ ) tastes = list("dog food" = 5, "狗肉" = 3) foodtypes = MEAT | GROSS + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/canned/envirochow/attack_animal(mob/living/simple_animal/user, list/modifiers) if(!check_buffability(user)) @@ -145,6 +146,53 @@ playsound(loc, 'sound/items/eatfood.ogg', rand(30, 50), TRUE) qdel(src) +/obj/item/food/canned/squid_ink + name = "canned squid ink" + desc = "An odd ingredient in typical cooking, squid ink lends a taste of the sea to any dish- while also dyeing it jet black in the process." + icon_state = "squidinkcan" + trash_type = /obj/item/trash/can/food/squid_ink + food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/salt = 5) + tastes = list("seafood" = 7, "tin" = 1) + foodtypes = SEAFOOD + +/obj/item/food/canned/chap + name = "can of CHAP" + desc = "CHAP: Chopped Ham And Pork. The classic American canned meat product that won a world war, then sent millions of servicemen home with heart congestion." + icon_state = "chapcan" + trash_type = /obj/item/trash/can/food/chap + food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/salt = 5) + tastes = list("meat" = 7, "tin" = 1) + foodtypes = MEAT + +/obj/item/food/canned/chap/make_processable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/chapslice, 5, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut") + +/obj/item/food/chapslice + name = "slice of chap" + desc = "A thin slice of chap. Useful for frying, or making sandwiches." + icon = 'icons/obj/food/martian.dmi' + icon_state = "chapslice" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 3 + ) + tastes = list("meat" = 1) + foodtypes = MEAT + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/chapslice/make_grillable() + AddComponent(/datum/component/grillable, /obj/item/food/grilled_chapslice, rand(20 SECONDS, 40 SECONDS), TRUE, TRUE) + +/obj/item/food/grilled_chapslice + name = "grilled slice of chap" + desc = "A greasy hot slice of chap. Forms a good part of a balanced meal." + icon = 'icons/obj/food/martian.dmi' + icon_state = "chapslice_grilled" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 3 + ) + tastes = list("meat" = 1) + foodtypes = MEAT + w_class = WEIGHT_CLASS_SMALL // DONK DINNER: THE INNOVATIVE WAY TO GET YOUR DAILY RECOMMENDED ALLOWANCE OF SALT... AND THEN SOME! /obj/item/food/ready_donk @@ -218,6 +266,35 @@ tastes = list("enchiladas" = 2, "laziness" = 1) foodtypes = GRAIN | DAIRY | MEAT | VEGETABLES | JUNKFOOD +/obj/item/food/ready_donk/nachos_grandes //which translates to... big nachos + name = "\improper Ready-Donk: Donk Sol Series Boritos Nachos Grandes" + desc = "Get ready for game day with Donk's classic Nachos Grandes, sponsors of the Donk Sol Series! Boritos chips loaded with cheese, spicy meat and beans, alongside separate guac, pico and donk sauce. Batter up!" + tastes = list("nachos" = 2, "laziness" = 1) + foodtypes = GRAIN | DAIRY | MEAT | VEGETABLES | JUNKFOOD + + warm_type = /obj/item/food/ready_donk/warm/nachos_grandes + +/obj/item/food/ready_donk/warm/nachos_grandes + name = "warm Ready-Donk: Donk Sol Series Boritos Nachos Grandes" + desc = "Get ready for game day with Donk's classic Nachos Grandes, sponsors of the Donk Sol Series! Boritos chips loaded with cheese, spicy meat and beans, alongside separate guac, pico and donk sauce. Served hotter than Sakamoto's fastball!" + icon_state = "ready_donk_warm_nachos" + tastes = list("nachos" = 2, "laziness" = 1) + foodtypes = GRAIN | DAIRY | MEAT | VEGETABLES | JUNKFOOD + +/obj/item/food/ready_donk/donkrange_chicken + name = "\improper Ready-Donk: Donk-range Chicken" + desc = "A Chinese classic, it's Donk's original spicy orange chicken with stir-fried peppers and onions, all over steamed rice." + tastes = list("orange chicken" = 2, "laziness" = 1) + foodtypes = GRAIN | MEAT | VEGETABLES | JUNKFOOD + + warm_type = /obj/item/food/ready_donk/warm/donkrange_chicken + +/obj/item/food/ready_donk/warm/donkrange_chicken + name = "warm Ready-Donk: Ready-Donk: Donk-range Chicken" + desc = "A Chinese classic, it's Donk's original spicy orange chicken with stir-fried peppers and onions, all over steamed rice and served hotter than a dragon's breath." + icon_state = "ready_donk_warm_orange" + tastes = list("orange chicken" = 2, "laziness" = 1) + foodtypes = GRAIN | MEAT | VEGETABLES | JUNKFOOD // Rations /obj/item/food/rationpack @@ -238,5 +315,5 @@ . = ..() AddComponent(/datum/component/edible, check_liked = CALLBACK(src, PROC_REF(check_liked))) -/obj/item/food/rationpack/proc/check_liked(fraction, mob/mob) //Nobody likes rationpacks. Nobody. +/obj/item/food/rationpack/proc/check_liked(mob/mob) //Nobody likes rationpacks. Nobody. return FOOD_DISLIKED diff --git a/code/game/objects/items/food/pancakes.dm b/code/game/objects/items/food/pancakes.dm index cb505c5b62a44..52829ab4c3acd 100644 --- a/code/game/objects/items/food/pancakes.dm +++ b/code/game/objects/items/food/pancakes.dm @@ -9,10 +9,10 @@ tastes = list("pancakes" = 1) foodtypes = GRAIN | SUGAR | BREAKFAST w_class = WEIGHT_CLASS_SMALL - burns_on_grill = TRUE venue_value = FOOD_PRICE_CHEAP ///Used as a base name while generating the icon states when stacked var/stack_name = "pancakes" + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/pancakes/raw name = "goopy pancake" @@ -20,8 +20,8 @@ icon_state = "rawpancakes_1" food_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) tastes = list("milky batter" = 1) - burns_on_grill = FALSE stack_name = "rawpancakes" + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/pancakes/raw/make_grillable() AddComponent(/datum/component/grillable,\ @@ -64,6 +64,7 @@ ) tastes = list("pancakes" = 1, "blueberries" = 1) stack_name = "bbpancakes" + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pancakes/chocolatechip name = "chocolate chip pancake" @@ -75,6 +76,7 @@ ) tastes = list("pancakes" = 1, "chocolate" = 1) stack_name = "ccpancakes" + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pancakes/Initialize(mapload) . = ..() @@ -145,6 +147,7 @@ var/mutable_appearance/pancake_visual = mutable_appearance(icon, "[pancake.stack_name]_[rand(1, 3)]") pancake_visual.pixel_x = rand(-1, 1) pancake_visual.pixel_y = 3 * contents.len - 1 + pancake_visual.layer = layer + (contents.len * 0.01) add_overlay(pancake_visual) update_appearance() diff --git a/code/game/objects/items/food/pastries.dm b/code/game/objects/items/food/pastries.dm index cd7d4f5d71cb6..8a39f6df8d132 100644 --- a/code/game/objects/items/food/pastries.dm +++ b/code/game/objects/items/food/pastries.dm @@ -14,6 +14,7 @@ foodtypes = GRAIN | SUGAR | BREAKFAST food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/muffin/berry name = "berry muffin" @@ -22,6 +23,7 @@ tastes = list("muffin" = 3, "berry" = 1) foodtypes = GRAIN | FRUIT | SUGAR | BREAKFAST venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/muffin/booberry name = "booberry muffin" @@ -30,6 +32,11 @@ desc = "My stomach is a graveyard! No living being can quench my bloodthirst!" tastes = list("muffin" = 3, "spookiness" = 1) foodtypes = GRAIN | FRUIT | SUGAR | BREAKFAST + crafting_complexity = FOOD_COMPLEXITY_4 + +/obj/item/food/muffin/booberry/Initialize(mapload, starting_reagent_purity, no_base_reagents) + . = ..() + AddComponent(/datum/component/ghost_edible, bite_consumption = bite_consumption) /obj/item/food/muffin/moffin name = "moffin" @@ -38,6 +45,7 @@ desc = "A delicious and spongy little cake." tastes = list("muffin" = 3, "dust" = 1, "lint" = 1) foodtypes = CLOTH | GRAIN | SUGAR | BREAKFAST + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/muffin/moffin/Initialize(mapload) . = ..() @@ -45,10 +53,10 @@ /obj/item/food/muffin/moffin/examine(mob/user) . = ..() - if(!ishuman(user)) + if(!isliving(user)) return - var/mob/living/carbon/human/moffin_observer = user - if(moffin_observer.dna.species.liked_food & CLOTH) + var/mob/living/moffin_observer = user + if(moffin_observer.get_liked_foodtypes() & CLOTH) . += span_nicegreen("Ooh! It's even got bits of clothes on it! Yummy!") else . += span_warning("You're not too sure what's on top though...") @@ -67,6 +75,7 @@ tastes = list("waffles" = 1) foodtypes = GRAIN | SUGAR | BREAKFAST w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/soylentgreen name = "\improper Soylent Green" @@ -81,6 +90,7 @@ tastes = list("waffles" = 7, "people" = 1) foodtypes = GRAIN | MEAT w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/soylenviridians name = "\improper Soylent Virdians" @@ -95,6 +105,7 @@ tastes = list("waffles" = 7, "the colour green" = 1) foodtypes = GRAIN w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/rofflewaffles name = "roffle waffles" @@ -110,6 +121,7 @@ tastes = list("waffles" = 1, "mushrooms" = 1) foodtypes = GRAIN | VEGETABLES | SUGAR | BREAKFAST w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 ////////////////////////////////////////////OTHER//////////////////////////////////////////// @@ -123,6 +135,7 @@ foodtypes = GRAIN | SUGAR food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/cookie/Initialize(mapload) . = ..() @@ -135,12 +148,13 @@ name = "fortune cookie" desc = "A true prophecy in each cookie!" icon_state = "fortune_cookie" - trash_type = /obj/item/paper/paperslip + trash_type = /obj/item/paper/paperslip/fortune food_reagents = list(/datum/reagent/consumable/nutriment = 5) tastes = list("cookie" = 1) foodtypes = GRAIN | SUGAR food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/fortunecookie/proc/get_fortune() var/atom/drop_location = drop_location() @@ -152,11 +166,8 @@ return fortune // Otherwise, use a generic one - var/obj/item/paper/paperslip/fortune_slip = new trash_type(drop_location) - fortune_slip.name = "fortune slip" + var/obj/item/paper/paperslip/fortune/fortune_slip = new trash_type(drop_location) // if someone adds lottery tickets in the future, be sure to add random numbers to this - fortune_slip.default_raw_text = pick(GLOB.wisdoms) - return fortune_slip /obj/item/food/fortunecookie/make_leave_trash() @@ -173,6 +184,7 @@ ) tastes = list("sweetness" = 1) foodtypes = GRAIN | JUNKFOOD | SUGAR + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/cookie/sugar/Initialize(mapload) . = ..() @@ -192,6 +204,7 @@ tastes = list("biscuit" = 3, "chocolate" = 1) foodtypes = GRAIN | JUNKFOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cookie/oatmeal name = "oatmeal cookie" @@ -203,6 +216,7 @@ ) tastes = list("cookie" = 2, "oat" = 1) foodtypes = GRAIN + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cookie/raisin name = "raisin cookie" @@ -214,6 +228,7 @@ ) tastes = list("cookie" = 1, "raisins" = 1) foodtypes = GRAIN | FRUIT + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/poppypretzel name = "poppy pretzel" @@ -227,6 +242,7 @@ foodtypes = GRAIN | SUGAR food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/plumphelmetbiscuit name = "plump helmet biscuit" @@ -240,6 +256,7 @@ foodtypes = GRAIN | VEGETABLES food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/plumphelmetbiscuit/Initialize(mapload) var/fey = prob(10) @@ -265,6 +282,7 @@ foodtypes = GRAIN food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_TINY + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/khachapuri name = "khachapuri" @@ -278,6 +296,7 @@ tastes = list("bread" = 1, "egg" = 1, "cheese" = 1) foodtypes = GRAIN | MEAT | DAIRY w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cherrycupcake name = "cherry cupcake" @@ -291,12 +310,14 @@ foodtypes = GRAIN | FRUIT | SUGAR food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cherrycupcake/blue name = "blue cherry cupcake" desc = "Blue cherries inside a delicious cupcake." icon_state = "bluecherrycupcake" tastes = list("cake" = 3, "blue cherry" = 1) + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/honeybun name = "honey bun" @@ -309,6 +330,7 @@ tastes = list("pastry" = 1, "sweetness" = 1) foodtypes = GRAIN | SUGAR w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cannoli name = "cannoli" @@ -322,17 +344,19 @@ foodtypes = GRAIN | DAIRY | SUGAR w_class = WEIGHT_CLASS_TINY venue_value = FOOD_PRICE_CHEAP // Pastry base, 3u of sugar and a single. fucking. unit. of. milk. really? + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/icecream name = "waffle cone" desc = "Delicious waffle cone, but no ice cream." - icon = 'icons/obj/kitchen.dmi' + icon = 'icons/obj/service/kitchen.dmi' icon_state = "icecream_cone_waffle" food_reagents = list(/datum/reagent/consumable/nutriment = 5) tastes = list("cream" = 2, "waffle" = 1) bite_consumption = 4 foodtypes = DAIRY | SUGAR food_flags = FOOD_FINGER_FOOD + crafting_complexity = FOOD_COMPLEXITY_3 max_volume = 10 //The max volumes scales up with the number of scoops of ice cream served. /// These two variables are used by the ice cream vat. Latter is the one that shows on the UI. var/list/ingredients = list( @@ -347,6 +371,9 @@ */ var/list/prefill_flavours +/obj/item/food/icecream/New(loc, list/prefill_flavours) + return ..() + /obj/item/food/icecream/Initialize(mapload, list/prefill_flavours) if(prefill_flavours) src.prefill_flavours = prefill_flavours @@ -369,6 +396,16 @@ /datum/reagent/consumable/sugar, /datum/reagent/consumable/coco, ) + crafting_complexity = FOOD_COMPLEXITY_3 + +/obj/item/food/icecream/korta + name = "korta cone" + desc = "Delicious lizard-friendly cone, but no ice cream." + foodtypes = NUTS | SUGAR + ingredients = list( + /datum/reagent/consumable/korta_flour, + /datum/reagent/consumable/sugar, + ) /obj/item/food/cookie/peanut_butter name = "peanut butter cookie" @@ -380,6 +417,7 @@ ) tastes = list("peanut butter" = 2, "cookie" = 1) foodtypes = GRAIN | JUNKFOOD | NUTS + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/raw_brownie_batter name = "raw brownie batter" @@ -392,6 +430,7 @@ ) tastes = list("raw brownie batter" = 1) foodtypes = GRAIN | JUNKFOOD | SUGAR | BREAKFAST + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/raw_brownie_batter/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/brownie_sheet, rand(20 SECONDS, 30 SECONDS), TRUE, TRUE) @@ -408,7 +447,7 @@ tastes = list("brownie" = 1, "chocolatey goodness" = 1) foodtypes = GRAIN | JUNKFOOD | SUGAR w_class = WEIGHT_CLASS_SMALL - burns_in_oven = TRUE + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/brownie_sheet/make_processable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/brownie, 4, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice") @@ -425,6 +464,7 @@ tastes = list("brownie" = 1, "chocolatey goodness" = 1) foodtypes = GRAIN | JUNKFOOD | SUGAR w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/peanut_butter_brownie_batter name = "raw peanut butter brownie batter" @@ -438,6 +478,7 @@ ) tastes = list("raw brownie batter" = 1) foodtypes = GRAIN | JUNKFOOD | SUGAR | NUTS + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/peanut_butter_brownie_batter/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/peanut_butter_brownie_sheet, rand(20 SECONDS, 30 SECONDS), TRUE, TRUE) @@ -455,7 +496,7 @@ tastes = list("brownie" = 1, "chocolatey goodness" = 1, "peanut butter" = 1) foodtypes = GRAIN | JUNKFOOD | SUGAR | NUTS w_class = WEIGHT_CLASS_SMALL - burns_in_oven = TRUE + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/peanut_butter_brownie_sheet/make_processable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/peanut_butter_brownie, 4, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice") @@ -473,6 +514,7 @@ tastes = list("brownie" = 1, "chocolatey goodness" = 1) foodtypes = GRAIN | JUNKFOOD | SUGAR w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/crunchy_peanut_butter_tart name = "crunchy peanut butter tart" @@ -487,3 +529,53 @@ tastes = list("peanut butter" = 1, "peanuts" = 1, "cream" = 1) foodtypes = GRAIN | JUNKFOOD | SUGAR | NUTS w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 + +/obj/item/food/cookie/chocolate_chip_cookie + name = "chocolate chip cookie" + desc = "A delightful-smelling chocolate chip cookie. Where's the milk?" + icon_state = "COOKIE!!!" + food_reagents = list(/datum/reagent/consumable/nutriment = 5) + tastes = list("soft cookie" = 2, "chocolate" = 3) + foodtypes = GRAIN | SUGAR | DAIRY + food_flags = FOOD_FINGER_FOOD + w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 + +/obj/item/food/cookie/snickerdoodle + name = "snickerdoodle" + desc = "A soft cookie made from vanilla and cinnamon." + icon_state = "snickerdoodle" + food_reagents = list(/datum/reagent/consumable/nutriment = 5) + tastes = list("soft cookie" = 2, "vanilla" = 3) + foodtypes = GRAIN | SUGAR | DAIRY + food_flags = FOOD_FINGER_FOOD + w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 + +/obj/item/food/cookie/macaron + name = "macaron" + desc = "A sandwich-like confectionary with a soft cookie shell and a creamy meringue center." + food_reagents = list(/datum/reagent/consumable/nutriment = 6) + icon_state = "macaron_1" + base_icon_state = "macaron" + tastes = list("wafer" = 2, "creamy meringue" = 3) + foodtypes = GRAIN | SUGAR | DAIRY + food_flags = FOOD_FINGER_FOOD + w_class = WEIGHT_CLASS_TINY + crafting_complexity = FOOD_COMPLEXITY_3 + +/obj/item/food/cookie/macaron/Initialize(mapload) + . = ..() + icon_state = "[base_icon_state]_[rand(1, 4)]" + +/obj/item/food/cookie/thumbprint_cookie + name = "thumbprint cookie" + desc = "A cookie with a thumb-sized indent in the middle made for fillings. This one is filled with cherry jelly" + icon_state = "thumbprint_cookie" + food_reagents = list(/datum/reagent/consumable/nutriment = 6) + tastes = list("cookie" = 2, "cherry jelly" = 3) + foodtypes = GRAIN | SUGAR | FRUIT + food_flags = FOOD_FINGER_FOOD + w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 diff --git a/code/game/objects/items/food/pie.dm b/code/game/objects/items/food/pie.dm index 73688742bc5a3..cd4d0c03b1a83 100644 --- a/code/game/objects/items/food/pie.dm +++ b/code/game/objects/items/food/pie.dm @@ -8,6 +8,7 @@ tastes = list("pie" = 1) foodtypes = GRAIN venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_2 /// type is spawned 5 at a time and replaces this pie when processed by cutting tool var/obj/item/food/pieslice/slice_type /// so that the yield can change if it isnt 5 @@ -24,6 +25,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 2) tastes = list("pie" = 1, "uncertainty" = 1) foodtypes = GRAIN | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/pie/plain name = "plain pie" @@ -35,7 +37,7 @@ ) tastes = list("pie" = 1) foodtypes = GRAIN - burns_in_oven = TRUE + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/pie/cream name = "banana cream pie" @@ -49,6 +51,7 @@ tastes = list("pie" = 1) foodtypes = GRAIN | DAIRY | SUGAR var/stunning = TRUE + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pie/cream/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() @@ -92,6 +95,7 @@ tastes = list("pie" = 1, "blackberries" = 1) foodtypes = GRAIN | FRUIT | SUGAR venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pie/bearypie name = "beary pie" @@ -104,6 +108,7 @@ ) tastes = list("pie" = 1, "meat" = 1, "salmon" = 1) foodtypes = GRAIN | SUGAR | MEAT | FRUIT + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/pie/meatpie name = "meat-pie" @@ -117,6 +122,7 @@ tastes = list("pie" = 1, "meat" = 1) foodtypes = GRAIN | MEAT venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pie/tofupie name = "tofu-pie" @@ -129,6 +135,7 @@ ) tastes = list("pie" = 1, "tofu" = 1) foodtypes = GRAIN | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pie/amanita_pie name = "amanita pie" @@ -143,6 +150,7 @@ ) tastes = list("pie" = 1, "mushroom" = 1) foodtypes = GRAIN | VEGETABLES | TOXIC | GROSS + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pie/plump_pie name = "plump pie" @@ -154,6 +162,7 @@ ) tastes = list("pie" = 1, "mushroom" = 1) foodtypes = GRAIN | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pie/plump_pie/Initialize(mapload) var/fey = prob(10) @@ -200,6 +209,7 @@ ) tastes = list("pie" = 7, "Nicole Paige Brooks" = 2) foodtypes = GRAIN | FRUIT | SUGAR + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pie/pumpkinpie name = "pumpkin pie" @@ -212,6 +222,7 @@ tastes = list("pie" = 1, "pumpkin" = 1) foodtypes = GRAIN | VEGETABLES | SUGAR slice_type = /obj/item/food/pieslice/pumpkin + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pieslice/pumpkin name = "pumpkin pie slice" @@ -219,6 +230,7 @@ icon_state = "pumpkinpieslice" tastes = list("pie" = 1, "pumpkin" = 1) foodtypes = GRAIN | VEGETABLES | SUGAR + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pie/appletart name = "golden apple streusel tart" @@ -231,6 +243,7 @@ ) tastes = list("pie" = 1, "apple" = 1, "expensive metal" = 1) foodtypes = GRAIN | FRUIT | SUGAR + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/pie/grapetart name = "grape tart" @@ -242,6 +255,7 @@ ) tastes = list("pie" = 1, "grape" = 1) foodtypes = GRAIN | FRUIT | SUGAR + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/pie/mimetart name = "mime tart" @@ -288,6 +302,7 @@ tastes = list("pie" = 1, "a mouthful of pool water" = 1) foodtypes = GRAIN | VEGETABLES slice_type = /obj/item/food/pieslice/blumpkin + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pieslice/blumpkin name = "blumpkin pie slice" @@ -295,6 +310,7 @@ icon_state = "blumpkinpieslice" tastes = list("pie" = 1, "a mouthful of pool water" = 1) foodtypes = GRAIN | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pie/dulcedebatata name = "dulce de batata" @@ -308,6 +324,7 @@ foodtypes = VEGETABLES | SUGAR venue_value = FOOD_PRICE_EXOTIC slice_type = /obj/item/food/pieslice/dulcedebatata + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pieslice/dulcedebatata name = "dulce de batata slice" @@ -315,6 +332,7 @@ icon_state = "dulcedebatataslice" tastes = list("jelly" = 1, "sweet potato" = 1) foodtypes = VEGETABLES | SUGAR + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pie/frostypie name = "frosty pie" @@ -326,6 +344,7 @@ ) tastes = list("mint" = 1, "pie" = 1) foodtypes = GRAIN | FRUIT | SUGAR + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pie/baklava name = "baklava" @@ -339,6 +358,7 @@ foodtypes = NUTS | SUGAR slice_type = /obj/item/food/pieslice/baklava yield = 6 + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/pieslice/baklava name = "baklava dish" @@ -358,6 +378,7 @@ tastes = list("pie" = 1, "smooth chocolate" = 1, "whipped cream" = 1) foodtypes = GRAIN | DAIRY | SUGAR slice_type = /obj/item/food/pieslice/frenchsilk + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pieslice/frenchsilk name = "french silk pie slice" @@ -365,6 +386,7 @@ icon_state = "frenchsilkpieslice" tastes = list("pie" = 1, "smooth chocolate" = 1, "whipped cream" = 1) foodtypes = GRAIN | DAIRY | SUGAR + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pie/shepherds_pie name = "shepherds pie" @@ -379,6 +401,7 @@ foodtypes = MEAT | DAIRY | VEGETABLES slice_type = /obj/item/food/pieslice/shepherds_pie yield = 4 + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/pieslice/shepherds_pie name = "shepherds pie slice" @@ -391,6 +414,7 @@ ) tastes = list("juicy meat" = 1, "mashed potatoes" = 1, "baked veggies" = 1) foodtypes = MEAT | DAIRY | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/pie/asdfpie name = "pie-flavored pie" @@ -402,4 +426,4 @@ ) tastes = list("pie" = 1, "the far off year of 2010" = 1) foodtypes = GRAIN - burns_in_oven = TRUE + crafting_complexity = FOOD_COMPLEXITY_2 diff --git a/code/game/objects/items/food/pizza.dm b/code/game/objects/items/food/pizza.dm index d2311e75c6849..b93cd7ed7219c 100644 --- a/code/game/objects/items/food/pizza.dm +++ b/code/game/objects/items/food/pizza.dm @@ -12,7 +12,7 @@ tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1) foodtypes = GRAIN | DAIRY | VEGETABLES venue_value = FOOD_PRICE_CHEAP - burns_in_oven = TRUE + crafting_complexity = FOOD_COMPLEXITY_2 /// type is spawned 6 at a time and replaces this pizza when processed by cutting tool var/obj/item/food/pizzaslice/slice_type ///What label pizza boxes use if this pizza spawns in them. @@ -20,8 +20,8 @@ /obj/item/food/pizza/raw foodtypes = GRAIN | DAIRY | VEGETABLES | RAW - burns_in_oven = FALSE slice_type = null + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/pizza/raw/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/pizza, rand(70 SECONDS, 80 SECONDS), TRUE, TRUE) @@ -39,6 +39,7 @@ foodtypes = GRAIN | DAIRY | VEGETABLES w_class = WEIGHT_CLASS_SMALL decomp_type = /obj/item/food/pizzaslice/moldy + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/pizzaslice/make_processable() AddElement(/datum/element/processable, TOOL_ROLLINGPIN, /obj/item/stack/sheet/pizza, 1, 1 SECONDS, table_required = TRUE, screentip_verb = "Flatten") @@ -57,13 +58,12 @@ foodtypes = GRAIN | VEGETABLES | DAIRY slice_type = /obj/item/food/pizzaslice/margherita boxtag = "Margherita Deluxe" - + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pizza/margherita/raw name = "raw pizza margherita" icon_state = "pizzamargherita_raw" foodtypes = GRAIN | VEGETABLES | DAIRY | RAW - burns_in_oven = FALSE slice_type = null /obj/item/food/pizza/margherita/raw/make_bakeable() @@ -84,6 +84,7 @@ icon_state = "pizzamargheritaslice" tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1) foodtypes = GRAIN | VEGETABLES | DAIRY + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pizzaslice/margherita/Initialize(mapload) . = ..() @@ -102,12 +103,12 @@ foodtypes = GRAIN | VEGETABLES| DAIRY | MEAT slice_type = /obj/item/food/pizzaslice/meat boxtag = "Meatlovers' Supreme" + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pizza/meat/raw name = "raw meatpizza" icon_state = "meatpizza_raw" foodtypes = GRAIN | VEGETABLES| DAIRY | MEAT | RAW - burns_in_oven = FALSE slice_type = null /obj/item/food/pizza/meat/raw/make_bakeable() @@ -119,6 +120,7 @@ icon_state = "meatpizzaslice" tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1) foodtypes = GRAIN | VEGETABLES | DAIRY | MEAT + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pizza/mushroom name = "mushroom pizza" @@ -133,12 +135,12 @@ foodtypes = GRAIN | VEGETABLES | DAIRY slice_type = /obj/item/food/pizzaslice/mushroom boxtag = "Mushroom Special" + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/pizza/mushroom/raw name = "raw mushroom pizza" icon_state = "mushroompizza_raw" foodtypes = GRAIN | VEGETABLES | DAIRY | RAW - burns_in_oven = FALSE slice_type = null /obj/item/food/pizza/mushroom/raw/make_bakeable() @@ -150,6 +152,7 @@ icon_state = "mushroompizzaslice" tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "mushroom" = 1) foodtypes = GRAIN | VEGETABLES | DAIRY + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/pizza/vegetable @@ -171,8 +174,8 @@ name = "raw vegetable pizza" icon_state = "vegetablepizza_raw" foodtypes = GRAIN | VEGETABLES | DAIRY | RAW - burns_in_oven = FALSE slice_type = null + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pizza/vegetable/raw/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/pizza/vegetable, rand(70 SECONDS, 80 SECONDS), TRUE, TRUE) @@ -183,6 +186,7 @@ icon_state = "vegetablepizzaslice" tastes = list("crust" = 1, "tomato" = 2, "cheese" = 1, "carrot" = 1) foodtypes = GRAIN | VEGETABLES | DAIRY + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pizza/donkpocket name = "donkpocket pizza" @@ -199,12 +203,12 @@ foodtypes = GRAIN | VEGETABLES | DAIRY | MEAT | JUNKFOOD slice_type = /obj/item/food/pizzaslice/donkpocket boxtag = "Bangin' Donk" + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pizza/donkpocket/raw name = "raw donkpocket pizza" icon_state = "donkpocketpizza_raw" foodtypes = GRAIN | VEGETABLES | DAIRY | MEAT | JUNKFOOD | RAW - burns_in_oven = FALSE slice_type = null /obj/item/food/pizza/donkpocket/raw/make_bakeable() @@ -231,12 +235,12 @@ foodtypes = GRAIN | VEGETABLES | DAIRY slice_type = /obj/item/food/pizzaslice/dank boxtag = "Fresh Herb" + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pizza/dank/raw name = "raw dank pizza" icon_state = "dankpizza_raw" foodtypes = GRAIN | VEGETABLES | DAIRY | RAW - burns_in_oven = FALSE slice_type = null /obj/item/food/pizza/dank/raw/make_bakeable() @@ -263,12 +267,12 @@ foodtypes = GRAIN | VEGETABLES | DAIRY | MEAT slice_type = /obj/item/food/pizzaslice/sassysage boxtag = "Sausage Lovers" + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pizza/sassysage/raw name = "raw sassysage pizza" icon_state = "sassysagepizza_raw" foodtypes = GRAIN | VEGETABLES | DAIRY | MEAT | RAW - burns_in_oven = FALSE slice_type = null /obj/item/food/pizza/sassysage/raw/make_bakeable() @@ -280,6 +284,7 @@ icon_state = "sassysagepizzaslice" tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1) foodtypes = GRAIN | VEGETABLES | DAIRY | MEAT + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/pizza/pineapple name = "\improper Hawaiian pizza" @@ -296,12 +301,12 @@ foodtypes = GRAIN | VEGETABLES | DAIRY | MEAT | FRUIT | PINEAPPLE slice_type = /obj/item/food/pizzaslice/pineapple boxtag = "Honolulu Chew" + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/pizza/pineapple/raw name = "raw Hawaiian pizza" icon_state = "pineapplepizza_raw" foodtypes = GRAIN | VEGETABLES | DAIRY | MEAT | FRUIT | PINEAPPLE | RAW - burns_in_oven = FALSE slice_type = null /obj/item/food/pizza/pineapple/raw/make_bakeable() @@ -356,12 +361,12 @@ tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "pepperoni" = 2, "9 millimeter bullets" = 2) slice_type = /obj/item/food/pizzaslice/arnold boxtag = "9mm Pepperoni" + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/pizza/arnold/raw name = "raw Arnold pizza" icon_state = "arnoldpizza_raw" foodtypes = GRAIN | DAIRY | VEGETABLES | RAW - burns_in_oven = FALSE slice_type = null /obj/item/food/pizza/arnold/raw/make_bakeable() @@ -384,7 +389,7 @@ if(istype(item, /obj/item/food/pineappleslice)) to_chat(user, "If you want something crazy like pineapple, I'll kill you.") //this is in bigger text because it's hard to spam something that gibs you, and so that you're perfectly aware of the reason why you died user.investigate_log("has been gibbed by putting pineapple on an arnold pizza.", INVESTIGATE_DEATHS) - user.gib() //if you want something crazy like pineapple, i'll kill you + user.gib(DROP_ALL_REMAINS) //if you want something crazy like pineapple, i'll kill you else if(istype(item, /obj/item/food/grown/mushroom) && iscarbon(user)) to_chat(user, span_userdanger("So, if you want mushroom, shut up.")) //not as large as the pineapple text, because you could in theory spam it var/mob/living/carbon/shutup = user @@ -404,6 +409,7 @@ icon_state = "arnoldpizzaslice" tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "pepperoni" = 2, "9 millimeter bullets" = 2) foodtypes = GRAIN | VEGETABLES | DAIRY | MEAT + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/pizzaslice/arnold/attack(mob/living/target, mob/living/user) . =..() @@ -438,12 +444,12 @@ slice_type = /obj/item/food/pizzaslice/energy foodtypes = TOXIC boxtag = "24 Hour Energy" + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/pizza/energy/raw name = "raw energy pizza" icon_state = "energypizza_raw" foodtypes = TOXIC - burns_in_oven = FALSE slice_type = null /obj/item/food/pizza/energy/raw/make_bakeable() @@ -455,6 +461,7 @@ icon_state ="energypizzaslice" tastes = list("pure electricity" = 4, "pizza" = 2) foodtypes = TOXIC + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/raw_meat_calzone name = "raw meat calzone" @@ -468,6 +475,7 @@ tastes = list("raw dough" = 1, "raw meat" = 1, "cheese" = 1, "tomato sauce" = 1) foodtypes = GRAIN | RAW | DAIRY | MEAT w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/raw_meat_calzone/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/meat_calzone, rand(20 SECONDS, 40 SECONDS), TRUE, TRUE) @@ -484,7 +492,7 @@ tastes = list("baked dough" = 1, "juicy meat" = 1, "melted cheese" = 1, "tomato sauce" = 1) foodtypes = GRAIN | DAIRY | MEAT w_class = WEIGHT_CLASS_SMALL - burns_in_oven = TRUE + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/raw_vegetarian_calzone name = "raw vegetarian calzone" @@ -497,6 +505,7 @@ tastes = list("raw dough" = 1, "vegetables" = 1, "tomato sauce" = 1) foodtypes = GRAIN | VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/raw_vegetarian_calzone/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/vegetarian_calzone, rand(20 SECONDS, 40 SECONDS), TRUE, TRUE) @@ -512,4 +521,4 @@ tastes = list("baked dough" = 1, "baked vegetables" = 1, "tomato sauce" = 1) foodtypes = GRAIN | VEGETABLES w_class = WEIGHT_CLASS_SMALL - burns_in_oven = TRUE + crafting_complexity = FOOD_COMPLEXITY_3 diff --git a/code/game/objects/items/food/salad.dm b/code/game/objects/items/food/salad.dm index ebbccd53af10e..703db3a12a4eb 100644 --- a/code/game/objects/items/food/salad.dm +++ b/code/game/objects/items/food/salad.dm @@ -10,6 +10,7 @@ foodtypes = VEGETABLES eatverbs = list("devour", "nibble", "gnaw", "gobble", "chomp") //who the fuck gnaws and devours on a salad venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/salad/aesirsalad name = "\improper Aesir salad" @@ -18,6 +19,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 12) tastes = list("leaves" = 1) foodtypes = VEGETABLES | FRUIT + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/salad/herbsalad name = "herb salad" @@ -26,6 +28,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 6) tastes = list("leaves" = 1, "apple" = 1) foodtypes = VEGETABLES | FRUIT + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/salad/validsalad name = "valid salad" @@ -42,6 +45,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 9, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("fruit" = 1) foodtypes = FRUIT + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/salad/jungle name = "jungle salad" @@ -50,6 +54,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 11, /datum/reagent/consumable/banana = 5, /datum/reagent/consumable/nutriment/vitamin = 7) tastes = list("fruit" = 1, "the jungle" = 1) foodtypes = FRUIT + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/salad/citrusdelight name = "citrus delight" @@ -61,6 +66,7 @@ ) tastes = list("sourness" = 1, "leaves" = 1) foodtypes = FRUIT | ORANGES + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/uncooked_rice name = "uncooked rice" @@ -86,6 +92,7 @@ ) tastes = list("rice" = 1) foodtypes = GRAIN | BREAKFAST + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/salad/ricepudding name = "rice pudding" @@ -111,6 +118,7 @@ ) tastes = list("rice" = 1, "meat" = 1) foodtypes = GRAIN | MEAT + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/salad/risotto name = "risotto" @@ -123,6 +131,7 @@ tastes = list("rice" = 1, "cheese" = 1) foodtypes = GRAIN | DAIRY venue_value = FOOD_PRICE_EXOTIC + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/salad/eggbowl name = "egg bowl" @@ -135,6 +144,7 @@ ) tastes = list("rice" = 1, "egg" = 1) foodtypes = GRAIN | MEAT //EGG = MEAT -NinjaNomNom 2017 + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/salad/edensalad name = "\improper Salad of Eden" @@ -146,6 +156,7 @@ ) tastes = list("extreme bitterness" = 3, "hope" = 1) foodtypes = VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/salad/gumbo name = "black eyed gumbo" @@ -158,6 +169,7 @@ ) tastes = list("building heat" = 2, "savory meat and vegtables" = 1) foodtypes = GRAIN | MEAT | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/reagent_containers/cup/bowl name = "bowl" @@ -243,6 +255,7 @@ ) tastes = list("healthy greens" = 2, "olive dressing" = 1) foodtypes = VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/salad/greek_salad name = "Greek salad" @@ -254,6 +267,7 @@ ) tastes = list("healthy greens" = 2, "olive dressing" = 1, "feta cheese" = 1) foodtypes = VEGETABLES | DAIRY + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/salad/caesar_salad name = "Caesar salad" @@ -265,6 +279,7 @@ ) tastes = list("healthy greens" = 2, "olive dressing" = 2, "feta cheese" = 2, "pita bread" = 1) foodtypes = VEGETABLES | DAIRY | GRAIN + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/salad/spring_salad name = "spring salad" @@ -276,6 +291,7 @@ ) tastes = list("crisp greens" = 2, "olive dressing" = 2, "salt" = 1) foodtypes = VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/salad/potato_salad name = "potato salad" @@ -288,6 +304,7 @@ ) tastes = list("creamy potatoes" = 2, "eggs" = 2, "mayonnaise" = 1, "onions" = 1) foodtypes = VEGETABLES | BREAKFAST + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/salad/spinach_fruit_salad name = "spinach fruit salad" @@ -299,6 +316,7 @@ ) tastes = list("spinach" = 2, "berries" = 2, "pineapple" = 2, "dressing" = 1) foodtypes = VEGETABLES | FRUIT + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/salad/antipasto_salad name = "antipasto salad" @@ -311,3 +329,4 @@ ) tastes = list("lettuce" = 2, "salami" = 2, "mozzarella cheese" = 2, "tomatoes" = 2, "dressing" = 1) foodtypes = VEGETABLES | DAIRY | MEAT + crafting_complexity = FOOD_COMPLEXITY_4 diff --git a/code/game/objects/items/food/sandwichtoast.dm b/code/game/objects/items/food/sandwichtoast.dm index a4ccdca7dcec8..8b91b04621e00 100644 --- a/code/game/objects/items/food/sandwichtoast.dm +++ b/code/game/objects/items/food/sandwichtoast.dm @@ -12,6 +12,7 @@ foodtypes = GRAIN | VEGETABLES food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/sandwich/cheese name = "cheese sandwich" @@ -24,10 +25,9 @@ tastes = list("bread" = 1, "cheese" = 1) foodtypes = GRAIN | DAIRY venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/sandwich/cheese/make_grillable() - if(burns_on_grill) - return ..() AddComponent(/datum/component/grillable, /obj/item/food/sandwich/cheese/grilled, rand(30 SECONDS, 60 SECONDS), TRUE) /obj/item/food/sandwich/cheese/grilled @@ -41,7 +41,7 @@ /datum/reagent/carbon = 4, ) tastes = list("toast" = 2, "cheese" = 3, "butter" = 1) - burns_on_grill = TRUE + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/sandwich/jelly name = "jelly sandwich" @@ -50,6 +50,7 @@ bite_consumption = 3 tastes = list("bread" = 1, "jelly" = 1) foodtypes = GRAIN + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/sandwich/jelly/slime food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/toxin/slimejelly = 10, /datum/reagent/consumable/nutriment/vitamin = 4) @@ -69,6 +70,7 @@ ) tastes = list("nothing suspicious" = 1) foodtypes = GRAIN | GROSS + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/griddle_toast name = "griddle toast" @@ -79,8 +81,8 @@ tastes = list("toast" = 1) foodtypes = GRAIN w_class = WEIGHT_CLASS_SMALL - burns_on_grill = TRUE slot_flags = ITEM_SLOT_MASK + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/butteredtoast name = "buttered toast" @@ -96,6 +98,7 @@ foodtypes = GRAIN | BREAKFAST food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/jelliedtoast name = "jellied toast" @@ -107,6 +110,7 @@ foodtypes = GRAIN | BREAKFAST food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/jelliedtoast/cherry food_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/cherryjelly = 8, /datum/reagent/consumable/nutriment/vitamin = 4) @@ -129,6 +133,7 @@ foodtypes = GRAIN food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/hotdog name = "hotdog" @@ -146,6 +151,7 @@ foodtypes = GRAIN | MEAT //Ketchup is not a vegetable w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_CHEAP + crafting_complexity = FOOD_COMPLEXITY_3 // Used for unit tests, do not delete /obj/item/food/hotdog/debug @@ -167,6 +173,7 @@ foodtypes = GRAIN | MEAT | VEGETABLES w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/sandwich/blt name = "\improper BLT" @@ -180,6 +187,7 @@ ) tastes = list("bacon" = 3, "lettuce" = 2, "tomato" = 2, "bread" = 2) foodtypes = GRAIN | MEAT | VEGETABLES | BREAKFAST + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/sandwich/peanut_butter_jelly name = "peanut butter and jelly sandwich" @@ -192,6 +200,7 @@ ) tastes = list("peanut butter" = 1, "jelly" = 1, "bread" = 2) foodtypes = GRAIN | FRUIT | NUTS + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/sandwich/peanut_butter_banana name = "peanut butter and banana sandwich" @@ -205,6 +214,7 @@ ) tastes = list("peanut butter" = 1, "banana" = 1, "bread" = 2) foodtypes = GRAIN | FRUIT | NUTS + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/sandwich/philly_cheesesteak name = "Philly cheesesteak" @@ -217,6 +227,7 @@ ) tastes = list("bread" = 1, "juicy meat" = 1, "melted cheese" = 1, "onions" = 1) foodtypes = GRAIN | MEAT | DAIRY | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/sandwich/toast_sandwich name = "toast sandwich" @@ -229,6 +240,7 @@ ) tastes = list("bread" = 2, "Britain" = 1, "butter" = 1, "toast" = 1) foodtypes = GRAIN + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/sandwich/death name = "death sandwich" @@ -247,22 +259,48 @@ . = ..() obj_flags &= ~UNIQUE_RENAME // You shouldn't be able to disguise this on account of how it kills you -///Override for checkliked callback +// Makes you feel disgusted if you look at it wrong. +/obj/item/food/sandwich/death/examine(mob/user) + . = ..() + // Only human mobs, not animals or silicons, can like/dislike by this. + if(!ishuman(user)) + return + if(check_liked(user) == FOOD_LIKED) + return + to_chat(user, span_warning("You imagine yourself eating [src]. You feel a sudden sour taste in your mouth, and a horrible feeling that you've done something wrong.")) + user.adjust_disgust(33) + +// Override for after_eat and check_liked callbacks. /obj/item/food/sandwich/death/make_edible() . = ..() - AddComponent(/datum/component/edible, check_liked = CALLBACK(src, PROC_REF(check_liked))) + AddComponent(/datum/component/edible, after_eat = CALLBACK(src, PROC_REF(after_eat)), check_liked = CALLBACK(src, PROC_REF(check_liked))) -///Eat it right, or you die. -/obj/item/food/sandwich/death/proc/check_liked(fraction, mob/living/carbon/human/consumer) - /// Closest thing to a mullet we have +/** +* Callback to be used with the edible component. +* If you have the right clothes and hairstyle, you like it. +* If you don't, you don't like it. +*/ +/obj/item/food/sandwich/death/proc/check_liked(mob/living/carbon/human/consumer) + // Closest thing to a mullet we have if(consumer.hairstyle == "Gelled Back" && istype(consumer.get_item_by_slot(ITEM_SLOT_ICLOTHING), /obj/item/clothing/under/rank/civilian/cookjorts)) return FOOD_LIKED + return FOOD_DISLIKED + +/** +* Callback to be used with the edible component. +* If you take a bite of the sandwich with the right clothes and hairstyle, you like it. +* If you don't, you contract a deadly disease. +*/ +/obj/item/food/sandwich/death/proc/after_eat(mob/living/carbon/human/consumer) + // If you like it, you're eating it right. + if(check_liked(consumer) == FOOD_LIKED) + return // I thought it didn't make sense for it to instantly kill you, so instead enjoy shitloads of toxin damage per bite. balloon_alert(consumer, "ate it wrong!") - consumer.ForceContractDisease(new/datum/disease/death_sandwich_poisoning()) + consumer.ForceContractDisease(new /datum/disease/death_sandwich_poisoning()) /obj/item/food/sandwich/death/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] starts to shove [src] down [user.p_their()] throat the wrong way. It looks like [user.p_theyre()] trying to commit suicide!")) qdel(src) - user.gib(TRUE, TRUE, TRUE) + user.gib() return MANUAL_SUICIDE diff --git a/code/game/objects/items/food/snacks.dm b/code/game/objects/items/food/snacks.dm index abe412600e96a..541c36b115060 100644 --- a/code/game/objects/items/food/snacks.dm +++ b/code/game/objects/items/food/snacks.dm @@ -16,6 +16,7 @@ foodtypes = JUNKFOOD | SUGAR food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_TINY + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/candy/bronx name = "\improper South Bronx Paradise bar" @@ -38,9 +39,9 @@ /obj/item/food/candy/bronx/make_edible() . = ..() - AddComponent(/datum/component/edible, after_eat = CALLBACK(src, PROC_REF(after_eat))) + AddComponent(/datum/component/edible, on_consume = CALLBACK(src, PROC_REF(on_consume))) -/obj/item/food/candy/bronx/proc/after_eat(mob/living/eater) +/obj/item/food/candy/bronx/proc/on_consume(mob/living/eater) if(ishuman(eater)) var/mob/living/carbon/human/carl = eater var/datum/disease/disease = new /datum/disease/parasite() @@ -69,6 +70,7 @@ tastes = list("dried meat" = 1) w_class = WEIGHT_CLASS_SMALL foodtypes = JUNKFOOD | MEAT | SUGAR + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/sosjerky/healthy name = "homemade beef jerky" @@ -107,7 +109,7 @@ food_reagents = list( /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment = 1, - /datum/reagent/consumable/cooking_oil = 3, + /datum/reagent/consumable/nutriment/fat/oil = 3, /datum/reagent/consumable/salt = 1, ) tastes = list("salt" = 1, "shrimp" = 1) @@ -129,6 +131,7 @@ food_flags = FOOD_FINGER_FOOD custom_price = PAYCHECK_CREW * 0.7 w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/no_raisin/healthy name = "homemade raisins" @@ -226,7 +229,7 @@ custom_price = PAYCHECK_CREW * 0.8 //nuts are expensive in real life, and this is the best food in the vendor. junkiness = 10 //less junky than other options, since peanuts are a decently healthy snack option w_class = WEIGHT_CLASS_SMALL - grind_results = list(/datum/reagent/consumable/peanut_butter = 5, /datum/reagent/consumable/cooking_oil = 2) + grind_results = list(/datum/reagent/consumable/peanut_butter = 5, /datum/reagent/consumable/nutriment/fat/oil = 2) var/safe_for_consumption = TRUE /obj/item/food/peanuts/salted @@ -393,7 +396,7 @@ GLOBAL_LIST_INIT(safe_peanut_types, populate_safe_peanut_types()) custom_price = PAYCHECK_CREW//pistachios are even more expensive. junkiness = 10 //on par with peanuts w_class = WEIGHT_CLASS_SMALL - grind_results = list(/datum/reagent/consumable/peanut_butter = 5, /datum/reagent/consumable/cooking_oil = 2) + grind_results = list(/datum/reagent/consumable/peanut_butter = 5, /datum/reagent/consumable/nutriment/fat/oil = 2) /obj/item/food/semki name = "\improper Semki Sunflower Seeds" @@ -401,7 +404,7 @@ GLOBAL_LIST_INIT(safe_peanut_types, populate_safe_peanut_types()) icon_state = "semki" trash_type = /obj/item/trash/semki food_reagents = list( - /datum/reagent/consumable/cornoil = 1, + /datum/reagent/consumable/nutriment/fat/oil = 1, /datum/reagent/consumable/salt = 6, ) //1 cornoil is equal to 1.33 nutriment tastes = list("sunflowers" = 5) @@ -423,6 +426,7 @@ GLOBAL_LIST_INIT(safe_peanut_types, populate_safe_peanut_types()) junkiness = 5 //Homemade or not, sunflower seets are always kinda junky foodtypes = JUNKFOOD | NUTS trash_type = /obj/item/trash/semki/healthy + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/cornchips name = "\improper Boritos corn chips" @@ -432,7 +436,7 @@ GLOBAL_LIST_INIT(safe_peanut_types, populate_safe_peanut_types()) bite_consumption = 2 food_reagents = list( /datum/reagent/consumable/nutriment = 3, - /datum/reagent/consumable/cooking_oil = 2, + /datum/reagent/consumable/nutriment/fat/oil = 2, /datum/reagent/consumable/salt = 3, ) junkiness = 20 @@ -451,7 +455,7 @@ GLOBAL_LIST_INIT(safe_peanut_types, populate_safe_peanut_types()) trash_type = /obj/item/trash/boritos food_reagents = list( /datum/reagent/consumable/nutriment = 3, - /datum/reagent/consumable/cooking_oil = 2, + /datum/reagent/consumable/nutriment/fat/oil = 2, /datum/reagent/consumable/salt = 3, /datum/reagent/consumable/yoghurt = 1, /datum/reagent/consumable/garlic = 1, @@ -465,7 +469,7 @@ GLOBAL_LIST_INIT(safe_peanut_types, populate_safe_peanut_types()) trash_type = /obj/item/trash/boritos/green food_reagents = list( /datum/reagent/consumable/nutriment = 3, - /datum/reagent/consumable/cooking_oil = 2, + /datum/reagent/consumable/nutriment/fat/oil = 2, /datum/reagent/consumable/salt = 3, /datum/reagent/consumable/astrotame = 1, /datum/reagent/consumable/blackpepper = 1, @@ -479,7 +483,7 @@ GLOBAL_LIST_INIT(safe_peanut_types, populate_safe_peanut_types()) trash_type = /obj/item/trash/boritos/red food_reagents = list( /datum/reagent/consumable/nutriment = 3, - /datum/reagent/consumable/cooking_oil = 2, + /datum/reagent/consumable/nutriment/fat/oil = 2, /datum/reagent/consumable/salt = 3, /datum/reagent/consumable/astrotame = 1, /datum/reagent/consumable/cornmeal = 1, @@ -493,7 +497,7 @@ GLOBAL_LIST_INIT(safe_peanut_types, populate_safe_peanut_types()) trash_type = /obj/item/trash/boritos/purple food_reagents = list( /datum/reagent/consumable/nutriment = 3, - /datum/reagent/consumable/cooking_oil = 2, + /datum/reagent/consumable/nutriment/fat/oil = 2, /datum/reagent/consumable/salt = 3, /datum/reagent/consumable/capsaicin = 1, /datum/reagent/consumable/sugar = 1, @@ -519,3 +523,153 @@ GLOBAL_LIST_INIT(safe_peanut_types, populate_safe_peanut_types()) qdel(sample) . = ..() + +/obj/item/food/hot_shots + name = "\improper Hot Shots" + desc = "The ultimate baseball snack. Once you start, it's hard to stop!" + icon_state = "hot_shots" + trash_type = /obj/item/trash/hot_shots + food_reagents = list( + /datum/reagent/consumable/nutriment = 2, + /datum/reagent/consumable/nutriment/vitamin = 1, + ) + tastes = list("popcorn" = 1, "caramel" = 1, "peanuts" = 1) + foodtypes = JUNKFOOD | SUGAR | NUTS + junkiness = 25 + w_class = WEIGHT_CLASS_SMALL + grind_results = list(/datum/reagent/consumable/nutriment/fat/oil = 3, /datum/reagent/consumable/caramel = 2) + +/obj/item/food/sticko + name = "\improper Sticko Classic" + desc = "A classic treat for all ages, it's Sticko, the original chocolate-coated biscuit stick! This one's the original (and as some would say, best) flavour: biscuit and milk chocolate." + icon_state = "sticko_classic" + trash_type = /obj/item/trash/sticko + food_reagents = list( + /datum/reagent/consumable/sugar = 3, + /datum/reagent/consumable/coco = 1, + ) + tastes = list("biscuit" = 1, "chocolate" = 1) + junkiness = 25 + foodtypes = JUNKFOOD | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/sticko/matcha + name = "\improper Sticko Matcha" + desc = "A classic treat for all ages, it's Sticko, the original chocolate-coated biscuit stick! This one's got matcha flavoured white chocolate as its coating, to evoke feelings of tradition." + icon_state = "sticko_matcha" + trash_type = /obj/item/trash/sticko/matcha + food_reagents = list( + /datum/reagent/consumable/sugar = 2, + /datum/reagent/consumable/coco = 1, + /datum/reagent/consumable/caramel = 1, + ) + tastes = list("biscuit" = 1, "matcha" = 1) + +/obj/item/food/sticko/nutty + name = "\improper Sticko Nutty" + desc = "A classic treat for all ages, it's Sticko, the original chocolate-coated biscuit stick! This one's got peanut-butter flavoured chocolate as its coating, for a nutty twist." + icon_state = "sticko_nutty" + trash_type = /obj/item/trash/sticko/nutty + food_reagents = list( + /datum/reagent/consumable/sugar = 2, + /datum/reagent/consumable/nutriment = 1, + /datum/reagent/consumable/coco = 1, + ) + tastes = list("biscuit" = 1, "peanut butter" = 1) + foodtypes = JUNKFOOD | GRAIN | NUTS + +/obj/item/food/sticko/pineapple + name = "\improper Sticko Pineapple" + desc = "A classic treat for all ages, it's Sticko, the original chocolate-coated biscuit stick! This one's got pineapple flavoured white chocolate as its coating, for those ananas fan-as." + icon_state = "sticko_pineapple" + trash_type = /obj/item/trash/sticko/pineapple + food_reagents = list( + /datum/reagent/consumable/sugar = 2, + /datum/reagent/consumable/coco = 1, + /datum/reagent/consumable/peanut_butter = 1, + ) + tastes = list("biscuit" = 1, "pineapple" = 1) + foodtypes = JUNKFOOD | GRAIN | PINEAPPLE + +/obj/item/food/sticko/yuyake + name = "\improper Sticko Yūyake" + desc = "A classic treat for all ages, it's Sticko, the original chocolate-coated biscuit stick! This one's got Yūyake flavoured white chocolate as its coating, for a refreshing melony treat." + icon_state = "sticko_yuyake" + trash_type = /obj/item/trash/sticko/yuyake + food_reagents = list( + /datum/reagent/consumable/sugar = 2, + /datum/reagent/consumable/coco = 1, + /datum/reagent/consumable/banana = 1, + ) + tastes = list("biscuit" = 1, "melon" = 1) + +/obj/item/food/sticko/random + name = "\improper Sticko Mystery" + desc = "A classic treat for all ages, it's Sticko, the original chocolate-coated biscuit stick! This one's got an obscuring paper sheath, to hide the true flavour..." + +/obj/item/food/sticko/random/Initialize(mapload) + var/random_flavour = pick(subtypesof(/obj/item/food/sticko) - /obj/item/food/sticko/random) + var/obj/item/food/sample = new random_flavour(loc) + name = sample.name + desc = sample.desc + food_reagents = sample.food_reagents + tastes = sample.tastes + + qdel(sample) + + . = ..() + +/obj/item/food/shok_roks + name = "\improper Shok-Roks - Stormcloud Candy flavour" + desc = "You've heard of Snap-Roks, now get ready for Shok-Roks: the popping candy for Ethereals! Available in 5 exciting flavours, of which this bag contains Stormcloud Candy- like cotton candy, but electric!" + icon_state = "shok_roks_candy" + trash_type = /obj/item/trash/shok_roks + food_reagents = list( + /datum/reagent/consumable/liquidelectricity/enriched = 2, + /datum/reagent/consumable/sugar = 3 + ) + tastes = list("sugar" = 1, "lightning" = 1) + +/obj/item/food/shok_roks/citrus + name = "\improper Shok-Roks - Cirrus Citrus flavour" + desc = "You've heard of Snap-Roks, now get ready for Shok-Roks: the popping candy for Ethereals! Available in 5 exciting flavours, of which this bag contains Cirrus Citrus- all the citrus flavour, none of the real citrus extract." + icon_state = "shok_roks_citrus" + trash_type = /obj/item/trash/shok_roks/citrus + tastes = list("citrus" = 1, "lightning" = 1) + +/obj/item/food/shok_roks/berry + name = "\improper Shok-Roks - Berry Storm flavour" + desc = "You've heard of Snap-Roks, now get ready for Shok-Roks: the popping candy for Ethereals! Available in 5 exciting flavours, of which this bag contains Berry Storm- filled with non-descript sour berry flavour!" + icon_state = "shok_roks_berry" + trash_type = /obj/item/trash/shok_roks/berry + tastes = list("sour berry" = 1, "lightning" = 1) + +/obj/item/food/shok_roks/tropical + name = "\improper Shok-Roks - Tropical Thunder flavour" + desc = "You've heard of Snap-Roks, now get ready for Shok-Roks: the popping candy for Ethereals! Available in 5 exciting flavours, of which this bag contains Tropical Thunder- all the tropical fruits! ALL OF THEM!" + icon_state = "shok_roks_tropical" + trash_type = /obj/item/trash/shok_roks/tropical + tastes = list("tropical fruits" = 1, "lightning" = 1) + +/obj/item/food/shok_roks/lanternfruit + name = "\improper Shok-Roks - Lightning Lanternfruit flavour" + desc = "You've heard of Snap-Roks, now get ready for Shok-Roks: the popping candy for Ethereals! Available in 5 exciting flavours, of which this bag contains Lightning Lanternfruit- the only Sprout-native fruit in any Shok-Rok flavour." + icon_state = "shok_roks_lanternfruit" + trash_type = /obj/item/trash/shok_roks/lanternfruit + tastes = list("sour pear" = 1, "lightning" = 1) + +/obj/item/food/shok_roks/random + name = "\improper Shok-Roks - Hidden Hurricane flavour" + desc = "You've heard of Snap-Roks, now get ready for Shok-Roks: the popping candy for Ethereals! Available in 5 exciting flavours, any of which could be in this bag!" + +/obj/item/food/shok_roks/random/Initialize(mapload) + var/random_flavour = pick(subtypesof(/obj/item/food/shok_roks) - /obj/item/food/shok_roks/random) + var/obj/item/food/sample = new random_flavour(loc) + name = sample.name + desc = sample.desc + food_reagents = sample.food_reagents + tastes = sample.tastes + + qdel(sample) + + . = ..() diff --git a/code/game/objects/items/food/soup.dm b/code/game/objects/items/food/soup.dm index 7e84cea5f87ae..08eb86ebaa0fe 100644 --- a/code/game/objects/items/food/soup.dm +++ b/code/game/objects/items/food/soup.dm @@ -30,6 +30,7 @@ /datum/reagent/consumable/nutriment/vitamin = 2, ) foodtypes = SUGAR | DAIRY + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/bowled/spacylibertyduff name = "spacy liberty duff" @@ -43,6 +44,7 @@ ) tastes = list("jelly" = 1, "mushroom" = 1) foodtypes = VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/bowled/amanitajelly name = "amanita jelly" @@ -57,3 +59,4 @@ ) tastes = list("jelly" = 1, "mushroom" = 1) foodtypes = VEGETABLES | TOXIC + crafting_complexity = FOOD_COMPLEXITY_2 diff --git a/code/game/objects/items/food/spaghetti.dm b/code/game/objects/items/food/spaghetti.dm index 1c92c58b5cd94..cab4a62a29f3b 100644 --- a/code/game/objects/items/food/spaghetti.dm +++ b/code/game/objects/items/food/spaghetti.dm @@ -7,6 +7,7 @@ ) foodtypes = GRAIN venue_value = FOOD_PRICE_CHEAP + crafting_complexity = FOOD_COMPLEXITY_2 // Why are you putting cooked spaghetti in your pockets? /obj/item/food/spaghetti/make_microwaveable() @@ -22,6 +23,7 @@ desc = "Now that's a nic'e pasta!" icon_state = "spaghetti" tastes = list("pasta" = 1) + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/spaghetti/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/spaghetti/boiledspaghetti, rand(15 SECONDS, 20 SECONDS), TRUE, TRUE) @@ -37,6 +39,7 @@ /datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1, ) + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/spaghetti/boiledspaghetti/Initialize(mapload) . = ..() @@ -54,6 +57,7 @@ ) tastes = list("pasta" = 1, "tomato" = 1) foodtypes = GRAIN | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/spaghetti/pastatomato/soulful name = "soul food" @@ -82,6 +86,7 @@ ) tastes = list("pasta" = 1, "tomato" = 1) foodtypes = GRAIN | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/spaghetti/meatballspaghetti name = "spaghetti and meatballs" @@ -94,6 +99,7 @@ ) tastes = list("pasta" = 1, "meat" = 1) foodtypes = GRAIN | MEAT + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/spaghetti/spesslaw name = "spesslaw" @@ -106,6 +112,7 @@ ) tastes = list("pasta" = 1, "meat" = 1) foodtypes = GRAIN | MEAT + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/spaghetti/chowmein name = "chow mein" @@ -118,6 +125,7 @@ ) tastes = list("noodle" = 1, "meat" = 1, "fried vegetables" = 1) foodtypes = GRAIN | MEAT | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/spaghetti/beefnoodle name = "beef noodle" @@ -132,6 +140,7 @@ ) tastes = list("noodles" = 1, "meat" = 1) foodtypes = GRAIN | MEAT | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/spaghetti/butternoodles name = "butter noodles" @@ -143,6 +152,7 @@ ) tastes = list("noodles" = 1, "butter" = 1) foodtypes = GRAIN | DAIRY + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/spaghetti/mac_n_cheese name = "mac n' cheese" @@ -154,3 +164,88 @@ ) tastes = list("cheese" = 1, "breadcrumbs" = 1, "pasta" = 1) foodtypes = GRAIN | DAIRY + crafting_complexity = FOOD_COMPLEXITY_4 + +/obj/item/food/spaghetti/shoyu_tonkotsu_ramen + name = "shoyu tonkotsu ramen" + desc = "A simple ramen made of meat, egg, onion, and a sheet of seaweed." + icon_state = "shoyu_tonkotsu_ramen" + trash_type = /obj/item/reagent_containers/cup/bowl + food_reagents = list( + /datum/reagent/consumable/nutriment = 12, + /datum/reagent/consumable/nutriment/vitamin = 6, + /datum/reagent/consumable/nutriment/protein = 6, + ) + tastes = list("noodles" = 5, "meat" = 3, "egg" = 4, "dried seaweed" = 2) + foodtypes = GRAIN | MEAT | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_4 + +/obj/item/food/spaghetti/kitakata_ramen + name = "kitakata ramen" + desc = "A hearty ramen composed of meat, mushrooms, onion, and garlic. Often given to the sick to comfort them" + icon_state = "kitakata_ramen" + trash_type = /obj/item/reagent_containers/cup/bowl + food_reagents = list( + /datum/reagent/consumable/nutriment = 15, + /datum/reagent/consumable/nutriment/vitamin = 6, + /datum/reagent/consumable/nutriment/protein = 8, + ) + tastes = list("noodles" = 5, "meat" = 4, "mushrooms" = 3, "onion" = 2) + foodtypes = GRAIN | MEAT | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_4 + +/obj/item/food/spaghetti/kitsune_udon + name = "kitsune udon" + desc = "A vegetarian udon made of fried tofu and onions, made sweet and savory with sugar and soy sauce. The name comes from an old folktale about a fox enjoying fried tofu." + icon_state = "kitsune_udon" + trash_type = /obj/item/reagent_containers/cup/bowl + food_reagents = list( + /datum/reagent/consumable/nutriment = 12, + /datum/reagent/consumable/nutriment/vitamin = 10, + /datum/reagent/consumable/nutriment/protein = 4, + ) + tastes = list("noodles" = 5, "tofu" = 4, "sugar" = 3, "soy sauce" = 2) + foodtypes = GRAIN | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_4 + +/obj/item/food/spaghetti/nikujaga + name = "nikujaga" + desc = "A delightful Japanese stew of noodles, onions, potatoes, and meat with mixed vegetables." + icon_state = "nikujaga" + trash_type = /obj/item/reagent_containers/cup/bowl + food_reagents = list( + /datum/reagent/consumable/nutriment = 16, + /datum/reagent/consumable/nutriment/vitamin = 12, + /datum/reagent/consumable/nutriment/protein = 8, + ) + tastes = list("noodles" = 5, "meat" = 4, "potato" = 3, "onion" = 2, "mixed veggies" = 2) + foodtypes = GRAIN | VEGETABLES | MEAT + crafting_complexity = FOOD_COMPLEXITY_4 + +/obj/item/food/spaghetti/pho + name = "pho" + desc = "A Vietnamese dish made of noodles, vegetables, herbs, and meat. Makes for a very popular street food." + icon_state = "pho" + trash_type = /obj/item/reagent_containers/cup/bowl + food_reagents = list( + /datum/reagent/consumable/nutriment = 12, + /datum/reagent/consumable/nutriment/vitamin = 8, + /datum/reagent/consumable/nutriment/protein = 8, + ) + tastes = list("noodles" = 5, "meat" = 4, "cabbage" = 3, "onion" = 2, "herbs" = 2) + foodtypes = GRAIN | VEGETABLES | MEAT + crafting_complexity = FOOD_COMPLEXITY_4 + +/obj/item/food/spaghetti/pad_thai + name = "pad thai" + desc = "A stir-fried noodle dish popular in Thailand made of peanuts, tofu, lime, and onions." + icon_state = "pad_thai" + trash_type = /obj/item/reagent_containers/cup/bowl + food_reagents = list( + /datum/reagent/consumable/nutriment = 15, + /datum/reagent/consumable/nutriment/vitamin = 10, + /datum/reagent/consumable/nutriment/protein = 4, + ) + tastes = list("noodles" = 5, "fried tofu" = 4, "lime" = 2, "peanut" = 3, "onion" = 2) + foodtypes = GRAIN | VEGETABLES | NUTS | FRUIT + crafting_complexity = FOOD_COMPLEXITY_4 diff --git a/code/game/objects/items/food/sweets.dm b/code/game/objects/items/food/sweets.dm index 83fd9905e1183..6805af35db613 100644 --- a/code/game/objects/items/food/sweets.dm +++ b/code/game/objects/items/food/sweets.dm @@ -12,6 +12,7 @@ foodtypes = JUNKFOOD | SUGAR food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_TINY + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/candy_corn/prison name = "desiccated candy corn" @@ -34,6 +35,7 @@ tastes = list("apple" = 2, "caramel" = 3) foodtypes = JUNKFOOD | FRUIT | SUGAR w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/mint name = "mint" @@ -59,7 +61,7 @@ foodtypes = JUNKFOOD | SUGAR | BUGS food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_TINY - + crafting_complexity = FOOD_COMPLEXITY_1 // Chocolates /obj/item/food/chocolatebar @@ -75,6 +77,7 @@ foodtypes = JUNKFOOD | SUGAR food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_TINY + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/chococoin name = "chocolate coin" @@ -89,6 +92,7 @@ foodtypes = JUNKFOOD | SUGAR food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/fudgedice name = "fudge dice" @@ -104,6 +108,7 @@ foodtypes = JUNKFOOD | SUGAR food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/chocoorange name = "chocolate orange" @@ -117,6 +122,7 @@ foodtypes = JUNKFOOD | SUGAR | ORANGES food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/bonbon name = "bon bon" @@ -141,6 +147,7 @@ /datum/reagent/consumable/nutriment/vitamin = 3, ) tastes = list("chocolate" = 1, "chewy caramel" = 1) + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/bonbon/chocolate_truffle name = "chocolate truffle" @@ -161,6 +168,7 @@ ) tastes = list("chocolate" = 1, "peanuts" = 1) foodtypes = DAIRY | SUGAR | JUNKFOOD | NUTS + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/bonbon/peanut_butter_cup name = "peanut butter cup" @@ -172,7 +180,7 @@ ) tastes = list("chocolate" = 1, "peanut butter" = 1) foodtypes = DAIRY | SUGAR | JUNKFOOD | NUTS - + crafting_complexity = FOOD_COMPLEXITY_1 // Gum /obj/item/food/bubblegum @@ -333,6 +341,7 @@ foodtypes = JUNKFOOD | SUGAR | BUGS food_flags = FOOD_FINGER_FOOD slot_flags = ITEM_SLOT_MASK + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/spiderlollipop/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/food/vegetables.dm b/code/game/objects/items/food/vegetables.dm index f36f3f09a811c..dd3ae8c450bd5 100644 --- a/code/game/objects/items/food/vegetables.dm +++ b/code/game/objects/items/food/vegetables.dm @@ -12,6 +12,7 @@ foodtypes = VEGETABLES | DAIRY w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/yakiimo name = "yaki imo" @@ -24,7 +25,7 @@ tastes = list("sweet potato" = 1) foodtypes = VEGETABLES | SUGAR w_class = WEIGHT_CLASS_SMALL - burns_in_oven = TRUE + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/roastparsnip name = "roast parsnip" @@ -37,6 +38,7 @@ tastes = list("parsnip" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_1 // Potatoes /obj/item/food/tatortot @@ -48,6 +50,7 @@ foodtypes = FRIED | VEGETABLES food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/tatortot/Initialize(mapload) . = ..() @@ -65,6 +68,7 @@ tastes = list("creamy mashed potatoes" = 1, "garlic" = 1) foodtypes = VEGETABLES | DAIRY w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/baked_potato name = "baked potato" @@ -74,7 +78,7 @@ tastes = list("baked potato" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL - burns_in_oven = TRUE + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/buttered_baked_potato name = "buttered baked potato" @@ -84,6 +88,7 @@ tastes = list("baked potato" = 1) foodtypes = VEGETABLES | DAIRY w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/loaded_baked_potato name = "loaded baked potato" @@ -93,6 +98,7 @@ tastes = list("baked potato" = 1, "bacon" = 1, "cheese" = 1, "cabbage" = 1) foodtypes = VEGETABLES | DAIRY | MEAT w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 // Fries /obj/item/food/fries @@ -104,6 +110,7 @@ foodtypes = VEGETABLES | FRIED w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_CHEAP + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/fries/Initialize(mapload) . = ..() @@ -121,6 +128,7 @@ foodtypes = VEGETABLES | DAIRY w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_CHEAP + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/cheesyfries/Initialize(mapload) . = ..() @@ -135,6 +143,7 @@ tastes = list("carrots" = 3, "salt" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/carrotfries/Initialize(mapload) . = ..() @@ -149,7 +158,48 @@ foodtypes = VEGETABLES | FRIED | MEAT w_class = WEIGHT_CLASS_SMALL venue_value = FOOD_PRICE_CHEAP + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/poutine/Initialize(mapload) . = ..() AddElement(/datum/element/dunkable, 10) + +/obj/item/food/sauteed_eggplant + name = "sauteed eggplant" + desc = "Thick-cut slices of eggplant sauteed in oil and minced garlic, creating a soft, crispy, healthy snack." + icon_state = "sauteed_eggplant" + food_reagents = list( + /datum/reagent/consumable/nutriment = 8, + /datum/reagent/consumable/nutriment/vitamin = 4, + ) + tastes = list("fried eggplant" = 4, "garlic" = 2, "olive oil" = 3) + foodtypes = VEGETABLES + w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 + +/obj/item/food/baba_ghanoush + name = "baba ghanoush" + desc = "A thick dip made from mashed eggplant, olive oil, garlic, and lemon juice with some pita bread for dipping. You'll either love it or hate it." + icon_state = "baba_ghanoush" + trash_type = /obj/item/reagent_containers/cup/bowl + food_reagents = list( + /datum/reagent/consumable/nutriment = 8, + /datum/reagent/consumable/nutriment/vitamin = 6, + ) + tastes = list("mashed eggplant" = 5, "pita bread" = 4, "garlic" = 3, "olive oil" = 4, "lemon juice" = 2) + foodtypes = VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 + +/obj/item/food/falafel + name = "falafel" + desc = "Beans, herbs, onions, and garlic mashed together and formed into a ball, then deep-fried. The herbs give the interior a unique green color." + icon_state = "falafel" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/vitamin = 2, + ) + tastes = list("fava beans" = 5, "garlic" = 3, "onion" = 2, "fresh herbs" = 4) + foodtypes = VEGETABLES + w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 diff --git a/code/game/objects/items/gift.dm b/code/game/objects/items/gift.dm index 6c89627f0b670..324151feddb92 100644 --- a/code/game/objects/items/gift.dm +++ b/code/game/objects/items/gift.dm @@ -34,11 +34,11 @@ GLOBAL_LIST_EMPTY(possible_gifts) /obj/item/a_gift/examine(mob/M) . = ..() - if((M.mind && HAS_TRAIT(M.mind, TRAIT_PRESENT_VISION)) || isobserver(M)) + if(HAS_MIND_TRAIT(M, TRAIT_PRESENT_VISION) || isobserver(M)) . += span_notice("It contains \a [initial(contains_type.name)].") /obj/item/a_gift/attack_self(mob/M) - if(M.mind && HAS_TRAIT(M.mind, TRAIT_CANNOT_OPEN_PRESENTS)) + if(HAS_MIND_TRAIT(M, TRAIT_CANNOT_OPEN_PRESENTS)) to_chat(M, span_warning("You're supposed to be spreading gifts, not opening them yourself!")) return diff --git a/code/game/objects/items/granters/_granters.dm b/code/game/objects/items/granters/_granters.dm index 634856a7b7791..b205a1f0ffa64 100644 --- a/code/game/objects/items/granters/_granters.dm +++ b/code/game/objects/items/granters/_granters.dm @@ -39,7 +39,8 @@ recoil(user) return FALSE - on_reading_start(user) + if(!on_reading_start(user)) + return reading = TRUE for(var/i in 1 to pages_to_mastery) if(!turn_page(user)) @@ -56,6 +57,7 @@ /// Called when the user starts to read the granter. /obj/item/book/granter/proc/on_reading_start(mob/living/user) to_chat(user, span_notice("You start reading [name]...")) + return TRUE /// Called when the reading is interrupted without finishing. /obj/item/book/granter/proc/on_reading_stopped(mob/living/user) @@ -99,6 +101,7 @@ /obj/item/book/granter/action/on_reading_start(mob/living/user) to_chat(user, span_notice("You start reading about [action_name]...")) + return TRUE /obj/item/book/granter/action/on_reading_finished(mob/living/user) to_chat(user, span_notice("You feel like you've got a good handle on [action_name]!")) diff --git a/code/game/objects/items/granters/chuuni_granter.dm b/code/game/objects/items/granters/chuuni_granter.dm index ebd2109c65682..46308cf97bae2 100644 --- a/code/game/objects/items/granters/chuuni_granter.dm +++ b/code/game/objects/items/granters/chuuni_granter.dm @@ -1,5 +1,7 @@ /// Turns the user into a chuunibyou. /obj/item/book/granter/chuunibyou + starting_title = "I Found a Mysterious Book in the Library That Teaches Me How to Become a Chuunibyou, But It Turns Out It's Actually a Grimoire That Unlocks My Hidden Powers!" + starting_author = "Anonymous" name = "I Found a Mysterious Book in the Library That Teaches Me How to Become a Chuunibyou, But It Turns Out It's Actually a Grimoire That Unlocks My Hidden Powers!" desc = "I'd rather get caught holding a syndicate revolver, honestly." icon_state ="chuuni_manga" diff --git a/code/game/objects/items/granters/crafting/_crafting_granter.dm b/code/game/objects/items/granters/crafting/_crafting_granter.dm index a4d2b46877a62..5b5ec82e42a35 100644 --- a/code/game/objects/items/granters/crafting/_crafting_granter.dm +++ b/code/game/objects/items/granters/crafting/_crafting_granter.dm @@ -6,6 +6,14 @@ . = ..() if(!user.mind) return - for(var/datum/crafting_recipe/crafting_recipe_type as anything in crafting_recipe_types) + for(var/crafting_recipe_type in crafting_recipe_types) user.mind.teach_crafting_recipe(crafting_recipe_type) - to_chat(user, span_notice("You learned how to make [initial(crafting_recipe_type.name)].")) + var/datum/crafting_recipe/recipe = locate(crafting_recipe_type) in GLOB.crafting_recipes + to_chat(user, span_notice("You learned how to make [recipe.name].")) + +/obj/item/book/granter/crafting_recipe/dusting + icon_state = "book1" + +/obj/item/book/granter/crafting_recipe/dusting/recoil(mob/living/user) + to_chat(user, span_warning("The book turns to dust in your hands.")) + qdel(src) diff --git a/code/game/objects/items/granters/crafting/bone_notes.dm b/code/game/objects/items/granters/crafting/bone_notes.dm index 120e47a64d386..ebe613f14c3ef 100644 --- a/code/game/objects/items/granters/crafting/bone_notes.dm +++ b/code/game/objects/items/granters/crafting/bone_notes.dm @@ -7,7 +7,7 @@ /datum/crafting_recipe/halfskull, /datum/crafting_recipe/skull, ) - icon = 'icons/obj/library.dmi' + icon = 'icons/obj/service/library.dmi' icon_state = "boneworking_learing" uses = INFINITY remarks = list( diff --git a/code/game/objects/items/granters/crafting/pipegun.dm b/code/game/objects/items/granters/crafting/pipegun.dm index 73e171846211b..8d331b2286d00 100644 --- a/code/game/objects/items/granters/crafting/pipegun.dm +++ b/code/game/objects/items/granters/crafting/pipegun.dm @@ -1,10 +1,9 @@ -/obj/item/book/granter/crafting_recipe/pipegun_prime +/obj/item/book/granter/crafting_recipe/dusting/pipegun_prime name = "diary of a dead assistant" desc = "A battered journal. Looks like he had a pretty rough life." crafting_recipe_types = list( /datum/crafting_recipe/pipegun_prime ) - icon_state = "book1" remarks = list( "He apparently mastered some lost guncrafting technique.", "Why do I have to go through so many hoops to get this shitty gun?", @@ -14,6 +13,33 @@ "What the hell does he mean by 'ancient warrior tradition'?", ) -/obj/item/book/granter/crafting_recipe/pipegun_prime/recoil(mob/living/user) - to_chat(user, span_warning("The book turns to dust in your hands.")) - qdel(src) +/obj/item/book/granter/crafting_recipe/dusting/laser_musket_prime + name = "journal of a space ranger" + desc = "A singed and weathered book, how did this get onto the station?" + crafting_recipe_types = list( + /datum/crafting_recipe/laser_musket_prime + ) + remarks = list( + "Man, these schematics look complicated.", + "What's with the soda, isn't that radioactive?", + "...but where does the cowboy hat come into play...", + "Oh, so that explains why I need the silver.", + "Yeah yeah, enough with the warnings, how does hard does it hit?", + "Going down in a blaze of glory? Who cares, time for a new gun.", + ) + +//This one isn't found as maint loot, it's too powerful for that, but it keeps the theming of the others +/obj/item/book/granter/crafting_recipe/dusting/smoothbore_disabler_prime + name = "tome of a space pirate" + desc = "A beaten-up tome. Where was this plundered from?" + crafting_recipe_types = list( + /datum/crafting_recipe/smoothbore_disabler_prime + ) + remarks = list( + "Seems they found a way to perfect old smoothbores.", + "Is the bling really that necessary?", + "How does it focus projectiles without any lens?", + "The power usage has gone way up, but why not a bluespace cell?", + "10u of reactant to open the relic... Is this even real science anymore?", + "Making them all sleep in the cold below? This is a disabler, not a lethal weapon.", + ) diff --git a/code/game/objects/items/granters/magic/_spell_granter.dm b/code/game/objects/items/granters/magic/_spell_granter.dm index e7d8f4f8b0fa1..e1ca6352293db 100644 --- a/code/game/objects/items/granters/magic/_spell_granter.dm +++ b/code/game/objects/items/granters/magic/_spell_granter.dm @@ -33,7 +33,7 @@ if(!granted_action) CRASH("Someone attempted to learn [type], which did not have an spell set.") if(locate(granted_action) in user.actions) - if(IS_WIZARD(user)) + if(HAS_MIND_TRAIT(user, TRAIT_MAGICALLY_GIFTED)) to_chat(user, span_warning("You're already far more versed in the spell [action_name] \ than this flimsy how-to book can provide!")) else @@ -43,6 +43,7 @@ /obj/item/book/granter/action/spell/on_reading_start(mob/living/user) to_chat(user, span_notice("You start reading about casting [action_name]...")) + return TRUE /obj/item/book/granter/action/spell/on_reading_finished(mob/living/user) to_chat(user, span_notice("You feel like you've experienced enough to cast [action_name]!")) diff --git a/code/game/objects/items/granters/magic/summon_cheese.dm b/code/game/objects/items/granters/magic/summon_cheese.dm new file mode 100644 index 0000000000000..668d3be8f9ac1 --- /dev/null +++ b/code/game/objects/items/granters/magic/summon_cheese.dm @@ -0,0 +1,28 @@ +/obj/item/book/granter/action/spell/summon_cheese + name = "Lusty Xenomorph Maid vol. III - Cheese Bakery" + desc = "Wonderful! Time for a celebration... Cheese for everyone!" + icon_state = "bookcheese" + action_name = "summon cheese" + granted_action = /datum/action/cooldown/spell/conjure/cheese + remarks = list( + "Always forward, never back...", + "Are these pages... cheese slices?..", + "Healthy snacks for unsuspecting victims...", + "I never knew so many types of cheese existed...", + "Madness reeks of goat cheese...", + "Madness tastes of gouda...", + "Madness tastes of parmesan...", + "Time is an artificial construct...", + "Was it order or biscuits?..", + "What's this about sacrificing cheese?!..", + "Who wouldn't like that?..", + "Why cheese, of all things?..", + "Why do I need a reason for everything?..", + ) + +/obj/item/book/granter/action/spell/summon_cheese/recoil(mob/living/user) + to_chat(user, span_warning("\The [src] turns into a wedge of cheese!")) + var/obj/item/food/cheese/wedge/book_cheese = new + user.temporarilyRemoveItemFromInventory(src, force = TRUE) + user.put_in_hands(book_cheese) + qdel(src) diff --git a/code/game/objects/items/granters/martial_arts/_martial_arts.dm b/code/game/objects/items/granters/martial_arts/_martial_arts.dm index 08f615a991e22..7646faec2c618 100644 --- a/code/game/objects/items/granters/martial_arts/_martial_arts.dm +++ b/code/game/objects/items/granters/martial_arts/_martial_arts.dm @@ -16,6 +16,7 @@ /obj/item/book/granter/martial/on_reading_start(mob/user) to_chat(user, span_notice("You start reading about [martial_name]...")) + return TRUE /obj/item/book/granter/martial/on_reading_finished(mob/user) to_chat(user, "[greet]") diff --git a/code/game/objects/items/granters/martial_arts/plasma_fist.dm b/code/game/objects/items/granters/martial_arts/plasma_fist.dm index d33fdf6eaae75..dab85637da5b2 100644 --- a/code/game/objects/items/granters/martial_arts/plasma_fist.dm +++ b/code/game/objects/items/granters/martial_arts/plasma_fist.dm @@ -5,8 +5,8 @@ desc = "An aged and frayed scrap of paper written in shifting runes. There are hand-drawn illustrations of pugilism." greet = "You have learned the ancient martial art of Plasma Fist. Your combos are extremely hard to pull off, but include some of the most deadly moves ever seen including \ the plasma fist, which when pulled off will make someone violently explode." - icon = 'icons/obj/wizard.dmi' - icon_state ="scroll2" + icon = 'icons/obj/scrolls.dmi' + icon_state ="plasmafist" remarks = list( "Balance...", "Power...", diff --git a/code/game/objects/items/granters/martial_arts/sleeping_carp.dm b/code/game/objects/items/granters/martial_arts/sleeping_carp.dm index c50a062eae5d8..ab3e343b28d6c 100644 --- a/code/game/objects/items/granters/martial_arts/sleeping_carp.dm +++ b/code/game/objects/items/granters/martial_arts/sleeping_carp.dm @@ -6,8 +6,8 @@ greet = "You have learned the ancient martial art of the Sleeping Carp! Your hand-to-hand combat has become much more effective, and you are now able to deflect any projectiles \ directed toward you while in Throw Mode. Your body has also hardened itself, granting extra protection against lasting wounds that would otherwise mount during extended combat. \ However, you are also unable to use any ranged weaponry. You can learn more about your newfound art by using the Recall Teachings verb in the Sleeping Carp tab." - icon = 'icons/obj/wizard.dmi' - icon_state = "scroll2" + icon = 'icons/obj/scrolls.dmi' + icon_state = "sleepingcarp" worn_icon_state = "scroll" remarks = list( "Wait, a high protein diet is really all it takes to become stabproof...?", diff --git a/code/game/objects/items/grenades/_grenade.dm b/code/game/objects/items/grenades/_grenade.dm index fd25df13967b4..9fde5723f45f1 100644 --- a/code/game/objects/items/grenades/_grenade.dm +++ b/code/game/objects/items/grenades/_grenade.dm @@ -66,6 +66,29 @@ if(!QDELETED(src)) qdel(src) +/obj/item/grenade/apply_fantasy_bonuses(bonus) + . = ..() + apply_grenade_fantasy_bonuses(bonus) + +/obj/item/grenade/remove_fantasy_bonuses(bonus) + remove_grenade_fantasy_bonuses(bonus) + return ..() + +/obj/item/grenade/proc/apply_grenade_fantasy_bonuses(quality) + if(ex_dev == 0 && ex_heavy == 0 && ex_light == 0 && ex_flame == 0) + return + var/devIncrease = round(quality / 10) + var/heavyIncrease = round(quality / 5) + var/lightIncrease = round(quality / 2) + ex_dev = modify_fantasy_variable("ex_dev", ex_dev, devIncrease, 0) + ex_heavy = modify_fantasy_variable("ex_heavy", ex_heavy, heavyIncrease, 0) + ex_light = modify_fantasy_variable("ex_light", ex_light, lightIncrease, 0) + +/obj/item/grenade/proc/remove_grenade_fantasy_bonuses(quality) + ex_dev = reset_fantasy_variable("ex_dev", ex_dev) + ex_heavy = reset_fantasy_variable("ex_heavy", ex_heavy) + ex_light = reset_fantasy_variable("ex_light", ex_light) + /** * Checks for various ways to botch priming a grenade. * diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index 1e54d11f83008..49304446c0ba6 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -32,7 +32,7 @@ AddElement(/datum/element/empprotection, EMP_PROTECT_WIRES) create_reagents(casing_holder_volume) stage_change() // If no argument is set, it will change the stage to the current stage, useful for stock grenades that start READY. - wires = new /datum/wires/explosive/chem_grenade(src) + set_wires(new /datum/wires/explosive/chem_grenade(src)) /obj/item/grenade/chem_grenade/Destroy(force) QDEL_NULL(wires) @@ -40,6 +40,12 @@ QDEL_LIST(beakers) return ..() +/obj/item/grenade/chem_grenade/apply_grenade_fantasy_bonuses(quality) + threatscale = modify_fantasy_variable("threatscale", threatscale, quality/10) + +/obj/item/grenade/chem_grenade/remove_grenade_fantasy_bonuses(quality) + threatscale = reset_fantasy_variable("threatscale", threatscale) + /obj/item/grenade/chem_grenade/examine(mob/user) display_timer = (stage == GRENADE_READY) //show/hide the timer based on assembly state . = ..() diff --git a/code/game/objects/items/grenades/clusterbuster.dm b/code/game/objects/items/grenades/clusterbuster.dm index a12c302c188bc..e4862919c1c17 100644 --- a/code/game/objects/items/grenades/clusterbuster.dm +++ b/code/game/objects/items/grenades/clusterbuster.dm @@ -18,6 +18,14 @@ var/max_spawned = 8 var/segment_chance = 35 +/obj/item/grenade/clusterbuster/apply_grenade_fantasy_bonuses(quality) + min_spawned = modify_fantasy_variable("min_spawned", min_spawned, round(quality/2)) + max_spawned = modify_fantasy_variable("max_spawned", max_spawned, round(quality/2)) + +/obj/item/grenade/clusterbuster/remove_grenade_fantasy_bonuses(quality) + min_spawned = reset_fantasy_variable("min_spawned", min_spawned) + max_spawned = reset_fantasy_variable("max_spawned", max_spawned) + /obj/item/grenade/clusterbuster/detonate(mob/living/lanced_by) . = ..() if(!.) diff --git a/code/game/objects/items/grenades/flashbang.dm b/code/game/objects/items/grenades/flashbang.dm index cd5e43c2daf2f..a273430172fe0 100644 --- a/code/game/objects/items/grenades/flashbang.dm +++ b/code/game/objects/items/grenades/flashbang.dm @@ -6,6 +6,12 @@ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' var/flashbang_range = 7 //how many tiles away the mob will be stunned. +/obj/item/grenade/flashbang/apply_grenade_fantasy_bonuses(quality) + flashbang_range = modify_fantasy_variable("flashbang_range", flashbang_range, quality) + +/obj/item/grenade/flashbang/remove_grenade_fantasy_bonuses(quality) + flashbang_range = reset_fantasy_variable("flashbang_range", flashbang_range) + /obj/item/grenade/flashbang/detonate(mob/living/lanced_by) . = ..() if(!.) @@ -34,7 +40,7 @@ living_mob.Knockdown(max(200/max(1, distance), 60)) //Bang - if(!distance || loc == living_mob || loc == living_mob.loc) //Stop allahu akbarring rooms with this. + if(!distance || loc == living_mob || loc == living_mob.loc) living_mob.Paralyze(20) living_mob.Knockdown(200) living_mob.soundbang_act(1, 200, 10, 15) diff --git a/code/game/objects/items/grenades/hypno.dm b/code/game/objects/items/grenades/hypno.dm index 035533d47310b..0d7601df204a5 100644 --- a/code/game/objects/items/grenades/hypno.dm +++ b/code/game/objects/items/grenades/hypno.dm @@ -7,6 +7,12 @@ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' var/flashbang_range = 7 +/obj/item/grenade/hypnotic/apply_grenade_fantasy_bonuses(quality) + flashbang_range = modify_fantasy_variable("flashbang_range", flashbang_range, quality) + +/obj/item/grenade/hypnotic/remove_grenade_fantasy_bonuses(quality) + flashbang_range = reset_fantasy_variable("flashbang_range", flashbang_range) + /obj/item/grenade/hypnotic/detonate(mob/living/lanced_by) . = ..() if(!.) diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index 363bd3e17657f..d5f3b0dec9d43 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -23,15 +23,28 @@ /// Maximum timer for c4 charges var/maximum_timer = 60000 +/obj/item/grenade/c4/apply_grenade_fantasy_bonuses(quality) + var/devIncrease = round(quality / 10) + var/heavyIncrease = round(quality / 5) + var/lightIncrease = round(quality / 2) + boom_sizes[1] = modify_fantasy_variable("devIncrease", boom_sizes[1], devIncrease) + boom_sizes[2] = modify_fantasy_variable("heavyIncrease", boom_sizes[2], heavyIncrease) + boom_sizes[3] = modify_fantasy_variable("lightIncrease", boom_sizes[3], lightIncrease) + +/obj/item/grenade/c4/remove_grenade_fantasy_bonuses(quality) + boom_sizes[1] = reset_fantasy_variable("devIncrease", boom_sizes[1]) + boom_sizes[2] = reset_fantasy_variable("heavyIncrease", boom_sizes[2]) + boom_sizes[3] = reset_fantasy_variable("lightIncrease", boom_sizes[3]) + /obj/item/grenade/c4/Initialize(mapload) . = ..() AddElement(/datum/element/empprotection, EMP_PROTECT_WIRES) plastic_overlay = mutable_appearance(icon, "[inhand_icon_state]2", HIGH_OBJ_LAYER) - wires = new /datum/wires/explosive/c4(src) + set_wires(new /datum/wires/explosive/c4(src)) /obj/item/grenade/c4/Destroy() qdel(wires) - wires = null + set_wires(null) target = null return ..() @@ -148,7 +161,7 @@ user.visible_message(span_suicide("[user] activates [src] and holds it above [user.p_their()] head! It looks like [user.p_theyre()] going out with a bang!")) shout_syndicate_crap(user) explosion(user, heavy_impact_range = 2, explosion_cause = src) //Cheap explosion imitation because putting detonate() here causes runtimes - user.gib(1, 1) + user.gib(DROP_BODYPARTS) qdel(src) // X4 is an upgraded directional variant of c4 which is relatively safe to be standing next to. And much less safe to be standing on the other side of. diff --git a/code/game/objects/items/grenades/spawnergrenade.dm b/code/game/objects/items/grenades/spawnergrenade.dm index cdd2b14cedf09..1b9d9ff27d094 100644 --- a/code/game/objects/items/grenades/spawnergrenade.dm +++ b/code/game/objects/items/grenades/spawnergrenade.dm @@ -7,6 +7,12 @@ var/spawner_type = null // must be an object path var/deliveryamt = 1 // amount of type to deliver +/obj/item/grenade/spawnergrenade/apply_grenade_fantasy_bonuses(quality) + deliveryamt = modify_fantasy_variable("deliveryamt", deliveryamt, quality) + +/obj/item/grenade/spawnergrenade/remove_grenade_fantasy_bonuses(quality) + deliveryamt = reset_fantasy_variable("deliveryamt", deliveryamt) + /obj/item/grenade/spawnergrenade/detonate(mob/living/lanced_by) // Prime now just handles the two loops that query for people in lockers and people who can see it. . = ..() if(!.) @@ -47,7 +53,7 @@ name = "Buzzkill grenade" desc = "The label reads: \"WARNING: DEVICE WILL RELEASE LIVE SPECIMENS UPON ACTIVATION. SEAL SUIT BEFORE USE.\" It is warm to the touch and vibrates faintly." icon_state = "holy_grenade" - spawner_type = /mob/living/simple_animal/hostile/bee/toxin + spawner_type = /mob/living/basic/bee/toxin deliveryamt = 10 /obj/item/grenade/spawnergrenade/clown @@ -55,7 +61,7 @@ desc = "A sleek device often given to clowns on their 10th birthdays for protection. You can hear faint scratching coming from within." icon_state = "clown_ball" inhand_icon_state = null - spawner_type = list(/mob/living/simple_animal/hostile/retaliate/clown/fleshclown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk, /mob/living/simple_animal/hostile/retaliate/clown/longface, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/chlown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus, /mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton, /mob/living/simple_animal/hostile/retaliate/clown/banana, /mob/living/simple_animal/hostile/retaliate/clown/honkling, /mob/living/simple_animal/hostile/retaliate/clown/lube) + spawner_type = list(/mob/living/basic/clown/fleshclown, /mob/living/basic/clown/clownhulk, /mob/living/basic/clown/longface, /mob/living/basic/clown/clownhulk/chlown, /mob/living/basic/clown/clownhulk/honkmunculus, /mob/living/basic/clown/mutant/glutton, /mob/living/basic/clown/banana, /mob/living/basic/clown/honkling, /mob/living/basic/clown/lube) deliveryamt = 1 /obj/item/grenade/spawnergrenade/clown_broken @@ -63,5 +69,5 @@ desc = "A sleek device often given to clowns on their 10th birthdays for protection. While a typical C.L.U.W.N.E only holds one creature, sometimes foolish young clowns try to cram more in, often to disasterous effect." icon_state = "clown_broken" inhand_icon_state = null - spawner_type = /mob/living/simple_animal/hostile/retaliate/clown/mutant + spawner_type = /mob/living/basic/clown/mutant deliveryamt = 5 diff --git a/code/game/objects/items/gun_maintenance.dm b/code/game/objects/items/gun_maintenance.dm index 03487780330fd..072ec395c191c 100644 --- a/code/game/objects/items/gun_maintenance.dm +++ b/code/game/objects/items/gun_maintenance.dm @@ -1,6 +1,6 @@ /obj/item/gun_maintenance_supplies name = "gun maintenance supplies" - desc = "plastic box containing gun maintenance supplies and spare parts. Use them on a Mosin Nagant to clean it." + desc = "plastic box containing gun maintenance supplies and spare parts. Use them on a rifle to clean it." icon = 'icons/obj/storage/box.dmi' icon_state = "plasticbox" w_class = WEIGHT_CLASS_SMALL diff --git a/code/game/objects/items/hand_items.dm b/code/game/objects/items/hand_items.dm index b136fc68cda38..5dfb27e77eaad 100644 --- a/code/game/objects/items/hand_items.dm +++ b/code/game/objects/items/hand_items.dm @@ -128,7 +128,7 @@ return FALSE var/obj/item/bodypart/head/the_head = target.get_bodypart(BODY_ZONE_HEAD) - if(!(the_head.biological_state & BIO_FLESH) || !IS_ORGANIC_LIMB(the_head)) + if(!(the_head.biological_state & BIO_FLESH)) to_chat(user, span_warning("You can't noogie [target], [target.p_they()] [target.p_have()] no skin on [target.p_their()] head!")) return diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index 87e8d06db412f..daee6043682df 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -46,6 +46,7 @@ throw_range = 5 custom_materials = list(/datum/material/iron= SMALL_MATERIAL_AMOUNT * 5) breakouttime = 1 MINUTES + var/handcuff_time = 3 SECONDS armor_type = /datum/armor/restraints_handcuffs custom_price = PAYCHECK_COMMAND * 0.35 ///Sound that plays when starting to put handcuffs on someone @@ -55,6 +56,14 @@ /// How strong the cuffs are. Weak cuffs can be broken with wirecutters or boxcutters. var/restraint_strength = HANDCUFFS_TYPE_STRONG +/obj/item/restraints/handcuffs/apply_fantasy_bonuses(bonus) + . = ..() + handcuff_time = modify_fantasy_variable("handcuff_time", handcuff_time, -bonus * 2, minimum = 0.3 SECONDS) + +/obj/item/restraints/handcuffs/remove_fantasy_bonuses(bonus) + handcuff_time = reset_fantasy_variable("handcuff_time", handcuff_time) + return ..() + /datum/armor/restraints_handcuffs fire = 50 acid = 50 @@ -78,7 +87,7 @@ to_chat(C, span_userdanger("As you feel someone grab your wrists, [src] start digging into your skin!")) playsound(loc, cuffsound, 30, TRUE, -2) log_combat(user, C, "attempted to handcuff") - if(do_after(user, 3 SECONDS, C, timed_action_flags = IGNORE_SLOWDOWNS) && C.canBeHandcuffed()) + if(do_after(user, handcuff_time, C, timed_action_flags = IGNORE_SLOWDOWNS) && C.canBeHandcuffed()) if(iscyborg(user)) apply_cuffs(C, user, TRUE) else @@ -166,10 +175,6 @@ . = ..() var/static/list/hovering_item_typechecks = list( - /obj/item/stack/rods = list( - SCREENTIP_CONTEXT_LMB = "Craft wired rod", - ), - /obj/item/stack/sheet/iron = list( SCREENTIP_CONTEXT_LMB = "Craft bola", ), @@ -181,6 +186,13 @@ if(new_color) set_cable_color(new_color) + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/bola, /datum/crafting_recipe/gonbola) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/restraints/handcuffs/cable/proc/set_cable_color(new_color) color = GLOB.cable_colors[new_color] cable_color = new_color @@ -280,36 +292,6 @@ cable_color = CABLE_COLOR_WHITE inhand_icon_state = "coil_white" -/obj/item/restraints/handcuffs/cable/attackby(obj/item/I, mob/user, params) //Slapcrafting - if(istype(I, /obj/item/stack/rods)) - var/obj/item/stack/rods/R = I - if (R.use(1)) - var/obj/item/wirerod/W = new /obj/item/wirerod - remove_item_from_storage(user) - user.put_in_hands(W) - to_chat(user, span_notice("You wrap [src] around the top of [I].")) - qdel(src) - else - to_chat(user, span_warning("You need one rod to make a wired rod!")) - return - else if(istype(I, /obj/item/stack/sheet/iron)) - var/obj/item/stack/sheet/iron/M = I - if(M.get_amount() < 6) - to_chat(user, span_warning("You need at least six iron sheets to make good enough weights!")) - return - to_chat(user, span_notice("You begin to apply [I] to [src]...")) - if(do_after(user, 35, target = src)) - if(M.get_amount() < 6 || !M) - return - var/obj/item/restraints/legcuffs/bola/S = new /obj/item/restraints/legcuffs/bola - M.use(6) - user.put_in_hands(S) - to_chat(user, span_notice("You make some weights out of [I] and tie them to [src].")) - remove_item_from_storage(user) - qdel(src) - else - return ..() - /** * # Zipties * @@ -599,3 +581,6 @@ . = ..() if(effectReference) QDEL_NULL(effectReference) + +#undef HANDCUFFS_TYPE_WEAK +#undef HANDCUFFS_TYPE_STRONG diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm index a9555e6a1bbf7..12c06e6916ac0 100644 --- a/code/game/objects/items/his_grace.dm +++ b/code/game/objects/items/his_grace.dm @@ -159,22 +159,8 @@ if(!awakened) return - var/static/list/transforms - if(!transforms) - var/matrix/M1 = matrix() - var/matrix/M2 = matrix() - var/matrix/M3 = matrix() - var/matrix/M4 = matrix() - M1.Translate(-1, 0) - M2.Translate(0, 1) - M3.Translate(1, 0) - M4.Translate(0, -1) - transforms = list(M1, M2, M3, M4) - animate(src, transform=transforms[1], time=0.2, loop=-1) - animate(transform=transforms[2], time=0.1) - animate(transform=transforms[3], time=0.2) - animate(transform=transforms[4], time=0.3) + spasm_animation() /obj/item/his_grace/proc/drowse() //Good night, Mr. Grace. if(!awakened || ascended) diff --git a/code/game/objects/items/hot_potato.dm b/code/game/objects/items/hot_potato.dm index 04738931e3a68..1a801b0dcda5b 100644 --- a/code/game/objects/items/hot_potato.dm +++ b/code/game/objects/items/hot_potato.dm @@ -2,7 +2,7 @@ /obj/item/hot_potato name = "hot potato" desc = "A label on the side of this potato reads \"Product of Donk Co. Service Wing. Activate far away from populated areas. Device will only attach to sapient creatures.\" You can attack anyone with it to force it on them instead of yourself!" - icon = 'icons/obj/hydroponics/harvest.dmi' + icon = 'icons/obj/service/hydroponics/harvest.dmi' icon_state = "potato" item_flags = NOBLUDGEON force = 0 @@ -149,7 +149,8 @@ else log_bomber(null, null, src, "was primed for detonation (Timer:[delay],Explosive:[detonate_explosion],Range:[detonate_dev_range]/[detonate_heavy_range]/[detonate_light_range]/[detonate_fire_range])") active = TRUE - notify_ghosts("[user] has primed a Hot Potato!", source = src, action = NOTIFY_ORBIT, header = "Hot Hot Hot!") + if(detonate_explosion) //doesn't send a notification unless it's a genuine, exploding hot potato. + notify_ghosts("[user] has primed a Hot Potato!", source = src, action = NOTIFY_ORBIT, header = "Hot Hot Hot!") /obj/item/hot_potato/proc/deactivate() update_appearance() diff --git a/code/game/objects/items/implants/implant.dm b/code/game/objects/items/implants/implant.dm index 2412a8c63617c..0a0c19aee967c 100644 --- a/code/game/objects/items/implants/implant.dm +++ b/code/game/objects/items/implants/implant.dm @@ -3,7 +3,7 @@ */ /obj/item/implant name = "implant" - icon = 'icons/obj/implants.dmi' + icon = 'icons/hud/implants.dmi' icon_state = "generic" //Shows up as the action button icon item_flags = ABSTRACT | DROPDEL resistance_flags = INDESTRUCTIBLE diff --git a/code/game/objects/items/implants/implant_abductor.dm b/code/game/objects/items/implants/implant_abductor.dm index dc127a2c05b04..18255da9b697b 100644 --- a/code/game/objects/items/implants/implant_abductor.dm +++ b/code/game/objects/items/implants/implant_abductor.dm @@ -1,7 +1,7 @@ /obj/item/implant/abductor name = "recall implant" desc = "Returns you to the mothership." - icon = 'icons/obj/abductor.dmi' + icon = 'icons/obj/antags/abductor.dmi' icon_state = "implant" var/obj/machinery/abductor/pad/home var/cooldown = 60 SECONDS @@ -53,7 +53,7 @@ else //If we still cannot find a home associated with our team, we just pick a random pad and make it our own. var/list/consoles = list() - for(var/obj/machinery/abductor/console/found_console in GLOB.machines) + for(var/obj/machinery/abductor/console/found_console as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/abductor/console)) consoles += found_console console = pick(consoles) if(console) diff --git a/code/game/objects/items/implants/implant_explosive.dm b/code/game/objects/items/implants/implant_explosive.dm index 2145cd93f4800..c9f961b594e26 100644 --- a/code/game/objects/items/implants/implant_explosive.dm +++ b/code/game/objects/items/implants/implant_explosive.dm @@ -1,15 +1,39 @@ +/** + * Note that we can stack explosive implants and thus increase the payload's devastation radius. (https://github.com/tgstation/tgstation/pull/50674) + * That's why the three devastation values for the microbomb implant are balanced around in such a way + * that buying one macrobomb equals to buying 10 microbombs and stacking them. + */ + +#define MICROBOMB_DELAY 0.7 SECONDS + +#define MICROBOMB_EXPLOSION_LIGHT 2 +#define MICROBOMB_EXPLOSION_HEAVY 0.8 +#define MICROBOMB_EXPLOSION_DEVASTATE 0.4 + /obj/item/implant/explosive name = "microbomb implant" desc = "And boom goes the weasel." icon_state = "explosive" - actions_types = list(/datum/action/item_action/explosive_implant) - // Explosive implant action is always available. - var/weak = 2 - var/medium = 0.8 - var/heavy = 0.4 - var/delay = 7 - var/popup = FALSE // is the DOUWANNABLOWUP window open? + actions_types = list(/datum/action/item_action/explosive_implant) //Explosive implant action is always available. + ///Whether the implant's explosion sequence has been activated or not var/active = FALSE + ///The final countdown (delay before we explode) + var/delay = MICROBOMB_DELAY + ///Radius of weak devastation explosive impact + var/explosion_light = MICROBOMB_EXPLOSION_LIGHT + ///Radius of medium devastation explosive impact + var/explosion_heavy = MICROBOMB_EXPLOSION_HEAVY + ///Radius of heavy devastation explosive impact + var/explosion_devastate = MICROBOMB_EXPLOSION_DEVASTATE + ///Whether the confirmation UI popup is active or not + var/popup = FALSE + ///Do we rapidly increase the beeping speed as it gets closer to detonating? + var/panic_beep_sound = FALSE + ///Do we disable paralysis upon activation + var/no_paralyze = FALSE + ///Do we override other explosive implants? + var/master_implant = FALSE + /obj/item/implant/explosive/proc/on_death(datum/source, gibbed) SIGNAL_HANDLER @@ -46,33 +70,28 @@ return FALSE if(cause == "death" && HAS_TRAIT(imp_in, TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION)) return FALSE - heavy = round(heavy) - medium = round(medium) - weak = round(weak) to_chat(imp_in, span_notice("You activate your [name].")) active = TRUE var/turf/boomturf = get_turf(imp_in) message_admins("[ADMIN_LOOKUPFLW(imp_in)] has activated their [name] at [ADMIN_VERBOSEJMP(boomturf)], with cause of [cause].") -//If the delay is short, just blow up already jeez - if(delay <= 7) - explosion(src, devastation_range = heavy, heavy_impact_range = medium, light_impact_range = weak, flame_range = weak, flash_range = weak, explosion_cause = src) - if(imp_in) - imp_in.investigate_log("has been gibbed by an explosive implant.", INVESTIGATE_DEATHS) - imp_in.gib(TRUE) - qdel(src) + //If the delay is shorter or equal to the default delay, just blow up already jeez + if(delay <= MICROBOMB_DELAY) + explode() return timed_explosion() /obj/item/implant/explosive/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE) - for(var/X in target.implants) - if(istype(X, /obj/item/implant/explosive)) //we don't use our own type here, because macrobombs inherit this proc and need to be able to upgrade microbombs - var/obj/item/implant/explosive/imp_e = X - imp_e.heavy += heavy - imp_e.medium += medium - imp_e.weak += weak - imp_e.delay += delay - qdel(src) - return TRUE + for(var/target_implant in target.implants) + if(istype(target_implant, /obj/item/implant/explosive)) //we don't use our own type here, because macrobombs inherit this proc and need to be able to upgrade microbombs + var/obj/item/implant/explosive/other_implant = target_implant + if(other_implant.master_implant && master_implant) //we cant have two master implants at once + target.balloon_alert(target, "cannot fit implant!") + return FALSE + if(master_implant) + merge_implants(src, other_implant) + else + merge_implants(other_implant, src) + return TRUE . = ..() if(.) @@ -83,33 +102,109 @@ if(.) UnregisterSignal(target, COMSIG_LIVING_DEATH) +/** + * Merges two explosive implants together, adding the stats of the latter to the former before qdeling the latter implant. + * kept_implant = the implant that is kept + * stat_implant = the implant which has it's stats added to kept_implant, before being deleted. + */ +/obj/item/implant/explosive/proc/merge_implants(obj/item/implant/explosive/kept_implant, obj/item/implant/explosive/stat_implant) + kept_implant.explosion_devastate += stat_implant.explosion_devastate + kept_implant.explosion_heavy += stat_implant.explosion_heavy + kept_implant.explosion_light += stat_implant.explosion_light + kept_implant.delay = min(kept_implant.delay + stat_implant.delay, 30 SECONDS) + qdel(stat_implant) + +/** + * Explosive activation sequence for implants with a delay longer than 0.7 seconds. + * Make the implantee beep a few times, keel over and explode. Usually to a devastating effect. + */ /obj/item/implant/explosive/proc/timed_explosion() imp_in.visible_message(span_warning("[imp_in] starts beeping ominously!")) + + notify_ghosts( + "[imp_in] is about to detonate their explosive implant!", + source = src, + action = NOTIFY_ORBIT, + flashwindow = FALSE, + ghost_sound = 'sound/machines/warning-buzzer.ogg', + header = "Tick Tick Tick...", + notify_volume = 75 + ) + playsound(loc, 'sound/items/timer.ogg', 30, FALSE) - sleep(delay*0.25) - if(imp_in && !imp_in.stat) + if(!panic_beep_sound) + sleep(delay * 0.25) + if(imp_in && !imp_in.stat && !no_paralyze) imp_in.visible_message(span_warning("[imp_in] doubles over in pain!")) - imp_in.Paralyze(140) - playsound(loc, 'sound/items/timer.ogg', 30, FALSE) - sleep(delay*0.25) - playsound(loc, 'sound/items/timer.ogg', 30, FALSE) - sleep(delay*0.25) - playsound(loc, 'sound/items/timer.ogg', 30, FALSE) - sleep(delay*0.25) - explosion(src, devastation_range = heavy, heavy_impact_range = medium, light_impact_range = weak, flame_range = weak, flash_range = weak, explosion_cause = src) + imp_in.Paralyze(14 SECONDS) + //total of 4 bomb beeps, and we've already beeped once + var/bomb_beeps_until_boom = 3 + if(!panic_beep_sound) + while(bomb_beeps_until_boom > 0) + //for extra spice + var/beep_volume = 35 + playsound(loc, 'sound/items/timer.ogg', beep_volume, vary = FALSE) + sleep(delay * 0.25) + bomb_beeps_until_boom-- + beep_volume += 5 + explode() + else + addtimer(CALLBACK(src, PROC_REF(explode)), delay) + while(delay > 1) //so we dont accidentally enter an infinite sleep + var/beep_volume = 35 + playsound(loc, 'sound/items/timer.ogg', beep_volume, vary = FALSE) + sleep(delay * 0.2) + delay -= delay * 0.2 + beep_volume += 5 + + +///When called, just explodes +/obj/item/implant/explosive/proc/explode() + explosion_devastate = round(explosion_devastate) + explosion_heavy = round(explosion_heavy) + explosion_light = round(explosion_light) + explosion(src, devastation_range = explosion_devastate, heavy_impact_range = explosion_heavy, light_impact_range = explosion_light, flame_range = explosion_light, flash_range = explosion_light, explosion_cause = src) if(imp_in) imp_in.investigate_log("has been gibbed by an explosive implant.", INVESTIGATE_DEATHS) - imp_in.gib(TRUE) + imp_in.gib(DROP_ORGANS|DROP_BODYPARTS) qdel(src) +///Macrobomb has the strength and delay of 10 microbombs /obj/item/implant/explosive/macro name = "macrobomb implant" desc = "And boom goes the weasel. And everything else nearby." icon_state = "explosive" - weak = 20 //the strength and delay of 10 microbombs - medium = 8 - heavy = 4 - delay = 70 + delay = 10 * MICROBOMB_DELAY + explosion_light = 10 * MICROBOMB_EXPLOSION_LIGHT + explosion_heavy = 10 * MICROBOMB_EXPLOSION_HEAVY + explosion_devastate = 10 * MICROBOMB_EXPLOSION_DEVASTATE + +///Microbomb which prevents you from going into critical condition but also explodes after a timer when you reach critical condition in the first place. +/obj/item/implant/explosive/deniability + name = "tactical deniability implant" + desc = "An enhanced version of the microbomb that directly plugs into the brain. No downsides, promise!" + delay = 10 SECONDS + panic_beep_sound = TRUE + no_paralyze = TRUE + master_implant = TRUE + +/obj/item/implant/explosive/deniability/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE) + . = ..() + if(.) + RegisterSignal(target, COMSIG_LIVING_HEALTH_UPDATE, PROC_REF(check_health)) + target.add_traits(list(TRAIT_NOSOFTCRIT, TRAIT_NOHARDCRIT), IMPLANT_TRAIT) + +/obj/item/implant/explosive/deniability/removed(mob/target, silent = FALSE, special = FALSE) + . = ..() + if(.) + UnregisterSignal(target, COMSIG_LIVING_HEALTH_UPDATE) + target.remove_traits(list(TRAIT_NOSOFTCRIT, TRAIT_NOHARDCRIT), IMPLANT_TRAIT) + +/obj/item/implant/explosive/deniability/proc/check_health(mob/living/source) + SIGNAL_HANDLER + + if(source.health < source.crit_threshold) + INVOKE_ASYNC(src, PROC_REF(activate), "deniability") /obj/item/implanter/explosive name = "implanter (microbomb)" @@ -124,6 +219,15 @@ name = "implanter (macrobomb)" imp_type = /obj/item/implant/explosive/macro +/obj/item/implanter/tactical_deniability + name = "implanter (tactical deniability)" + imp_type = /obj/item/implant/explosive/deniability + /datum/action/item_action/explosive_implant check_flags = NONE name = "Activate Explosive Implant" + +#undef MICROBOMB_DELAY +#undef MICROBOMB_EXPLOSION_LIGHT +#undef MICROBOMB_EXPLOSION_HEAVY +#undef MICROBOMB_EXPLOSION_DEVASTATE diff --git a/code/game/objects/items/implants/implant_freedom.dm b/code/game/objects/items/implants/implant_freedom.dm index 4a40fcc7f91ec..671bbecf06b9d 100644 --- a/code/game/objects/items/implants/implant_freedom.dm +++ b/code/game/objects/items/implants/implant_freedom.dm @@ -3,37 +3,45 @@ desc = "Use this to escape from those evil Red Shirts." icon_state = "freedom" implant_color = "r" - uses = 4 + uses = FREEDOM_IMPLANT_CHARGES +/obj/item/implant/freedom/implant(mob/living/target, mob/user, silent, force) + . = ..() + if(!.) + return FALSE + if(!iscarbon(target)) //This is pretty much useless for anyone else since they can't be cuffed + balloon_alert(user, "that would be a waste!") + return FALSE + return TRUE /obj/item/implant/freedom/activate() . = ..() + var/mob/living/carbon/carbon_imp_in = imp_in + if(!carbon_imp_in.handcuffed && !carbon_imp_in.legcuffed) + balloon_alert(carbon_imp_in, "no restraints!") + return + uses-- - to_chat(imp_in, span_hear("You feel a faint click.")) - if(iscarbon(imp_in)) - var/mob/living/carbon/C_imp_in = imp_in - C_imp_in.uncuff() + + carbon_imp_in.uncuff() if(!uses) + addtimer(CALLBACK(carbon_imp_in, TYPE_PROC_REF(/atom, balloon_alert), carbon_imp_in, "implant degraded!"), 1 SECONDS) qdel(src) - /obj/item/implant/freedom/get_data() var/dat = {" -Implant Specifications:
-Name: Freedom Beacon
-Life: optimum 5 uses
-Important Notes: Illegal
-
-Implant Details:
-Function: Transmits a specialized cluster of signals to override handcuff locking -mechanisms
-Special Features:
-Neuro-Scan- Analyzes certain shadow signals in the nervous system
-
-No Implant Specifics"} + Implant Specifications:
+ Name: Freedom Beacon
+ Life: Optimum [initial(uses)] uses
+ Important Notes: Illegal
+
+ Implant Details:
+ Function: Transmits a specialized cluster of signals to override handcuff locking + mechanisms. These signals will release any bindings on both the arms and legs.
+ Disclaimer: Heavy-duty restraints such as straightjackets are deemed "too complex" to release from. + "} return dat - /obj/item/implanter/freedom name = "implanter (freedom)" imp_type = /obj/item/implant/freedom diff --git a/code/game/objects/items/implants/implant_krav_maga.dm b/code/game/objects/items/implants/implant_krav_maga.dm index e8ea5695fd32e..fa3ccd1ccb2c9 100644 --- a/code/game/objects/items/implants/implant_krav_maga.dm +++ b/code/game/objects/items/implants/implant_krav_maga.dm @@ -1,7 +1,7 @@ /obj/item/implant/krav_maga name = "krav maga implant" desc = "Teaches you the arts of Krav Maga in 5 short instructional videos beamed directly into your eyeballs." - icon = 'icons/obj/wizard.dmi' + icon = 'icons/obj/scrolls.dmi' icon_state ="scroll2" var/datum/martial_art/krav_maga/style = new diff --git a/code/game/objects/items/implants/implant_track.dm b/code/game/objects/items/implants/implant_track.dm index 815d20161ce09..65f11c2519b4b 100644 --- a/code/game/objects/items/implants/implant_track.dm +++ b/code/game/objects/items/implants/implant_track.dm @@ -18,7 +18,7 @@ /obj/item/implant/tracking/c38/implant(mob/living/target, mob/user, silent, force) . = ..() - timerid = QDEL_IN(src, lifespan) + timerid = QDEL_IN_STOPPABLE(src, lifespan) /obj/item/implant/tracking/c38/removed(mob/living/source, silent, special) . = ..() diff --git a/code/game/objects/items/implants/implantchair.dm b/code/game/objects/items/implants/implantchair.dm index 0cca201bea9e1..d76bd363e664c 100644 --- a/code/game/objects/items/implants/implantchair.dm +++ b/code/game/objects/items/implants/implantchair.dm @@ -1,7 +1,7 @@ /obj/machinery/implantchair name = "mindshield implanter" desc = "Used to implant occupants with mindshield implants." - icon = 'icons/obj/machines/implantchair.dmi' + icon = 'icons/obj/machines/implant_chair.dmi' icon_state = "implantchair" density = TRUE opacity = FALSE diff --git a/code/game/objects/items/implants/implantpad.dm b/code/game/objects/items/implants/implantpad.dm index 03af306b27a32..aa1ccd461acfb 100644 --- a/code/game/objects/items/implants/implantpad.dm +++ b/code/game/objects/items/implants/implantpad.dm @@ -25,12 +25,12 @@ if(case) . += span_warning("There seems to be something inside it, but you can't quite tell what from here...") -/obj/item/implantpad/handle_atom_del(atom/A) - if(A == case) - case = null - update_appearance() - updateSelfDialog() +/obj/item/implantpad/Exited(atom/movable/gone, direction) . = ..() + if(gone == case) + case = null + update_appearance() + updateSelfDialog() /obj/item/implantpad/AltClick(mob/user) ..() @@ -44,7 +44,6 @@ add_fingerprint(user) case.add_fingerprint(user) - case = null updateSelfDialog() update_appearance() diff --git a/code/game/objects/items/inspector.dm b/code/game/objects/items/inspector.dm index f28a24807265e..ec4786c8cda4a 100644 --- a/code/game/objects/items/inspector.dm +++ b/code/game/objects/items/inspector.dm @@ -37,16 +37,10 @@ cell = new cell(src) // Clean up the cell on destroy -/obj/item/clothing/suit/space/Destroy() - if(isatom(cell)) - QDEL_NULL(cell) - return ..() - -// Clean up the cell on destroy -/obj/item/inspector/handle_atom_del(atom/A) - if(A == cell) +/obj/item/inspector/Exited(atom/movable/gone, direction) + . = ..() + if(gone == cell) cell = null - return ..() // support for items that interact with the cell /obj/item/inspector/get_cell() @@ -136,7 +130,7 @@ /obj/item/paper/report name = "encrypted station inspection" desc = "Contains no information about the station's current status." - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "slip" ///What area the inspector scanned when the report was made. Used to verify the security bounty. var/area/scanned_area @@ -334,7 +328,7 @@ /obj/item/paper/fake_report name = "encrypted station inspection" desc = "Contains no information about the station's current status." - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "slip" show_written_words = FALSE ///What area the inspector scanned when the report was made. Used to generate the examine text of the report diff --git a/code/game/objects/items/janitor_key.dm b/code/game/objects/items/janitor_key.dm index 06370b5af842a..8f96205984b42 100644 --- a/code/game/objects/items/janitor_key.dm +++ b/code/game/objects/items/janitor_key.dm @@ -6,7 +6,7 @@ desc = "A key ring with a beeper, allowing the keys to change shape depending on which department it has access to." icon_state = "access_key" inhand_icon_state = "access_key" - icon = 'icons/obj/janitor.dmi' + icon = 'icons/obj/service/janitor.dmi' lefthand_file = 'icons/mob/inhands/items/keys_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/keys_righthand.dmi' hitsound = 'sound/items/rattling_keys_attack.ogg' diff --git a/code/game/objects/items/kirbyplants.dm b/code/game/objects/items/kirby_plants/kirbyplants.dm similarity index 95% rename from code/game/objects/items/kirbyplants.dm rename to code/game/objects/items/kirby_plants/kirbyplants.dm index dac1a16363231..571f7d9d7ee29 100644 --- a/code/game/objects/items/kirbyplants.dm +++ b/code/game/objects/items/kirby_plants/kirbyplants.dm @@ -1,7 +1,7 @@ /obj/item/kirbyplants name = "potted plant" - icon = 'icons/obj/flora/plants.dmi' + icon = 'icons/obj/fluff/flora/plants.dmi' icon_state = "plant-01" base_icon_state = "plant-01" desc = "A little bit of nature contained in a pot." @@ -25,7 +25,7 @@ /obj/item/kirbyplants/Initialize(mapload) . = ..() AddComponent(/datum/component/tactical) - AddComponent(/datum/component/two_handed, require_twohands=TRUE, force_unwielded=10, force_wielded=10) + AddComponent(/datum/component/two_handed, require_twohands = TRUE, force_unwielded = 10, force_wielded = 10) AddElement(/datum/element/beauty, 500) if(icon_state != base_icon_state && icon_state != "plant-25") //mapedit support base_icon_state = icon_state @@ -85,12 +85,12 @@ random_plant_states += "applebush" /obj/item/kirbyplants/random - icon = 'icons/obj/flora/_flora.dmi' + icon = 'icons/obj/fluff/flora/_flora.dmi' icon_state = "random_plant" /obj/item/kirbyplants/random/Initialize(mapload) . = ..() - icon = 'icons/obj/flora/plants.dmi' + icon = 'icons/obj/fluff/flora/plants.dmi' randomize_base_icon_state() //Handles randomizing the icon during initialize() diff --git a/code/game/objects/items/kirby_plants/organic_plants.dm b/code/game/objects/items/kirby_plants/organic_plants.dm new file mode 100644 index 0000000000000..dfeb4c804554c --- /dev/null +++ b/code/game/objects/items/kirby_plants/organic_plants.dm @@ -0,0 +1,77 @@ +/obj/item/kirbyplants/organic/applebush + icon_state = "applebush" + +/obj/item/kirbyplants/organic/plant1 + icon_state = "plant-01" + +/obj/item/kirbyplants/organic/plant2 + icon_state = "plant-02" + +/obj/item/kirbyplants/organic/plant3 + icon_state = "plant-03" + +/obj/item/kirbyplants/organic/plant4 + icon_state = "plant-04" + +/obj/item/kirbyplants/organic/plant5 + icon_state = "plant-05" + +/obj/item/kirbyplants/organic/plant6 + icon_state = "plant-06" + +/obj/item/kirbyplants/organic/plant7 + icon_state = "plant-07" + +/obj/item/kirbyplants/organic/plant8 + icon_state = "plant-08" + +/obj/item/kirbyplants/organic/plant9 + icon_state = "plant-09" + +/obj/item/kirbyplants/organic/plant10 + icon_state = "plant-10" + +/obj/item/kirbyplants/organic/plant11 + icon_state = "plant-11" + +/obj/item/kirbyplants/organic/plant12 + icon_state = "plant-12" + +/obj/item/kirbyplants/organic/plant13 + icon_state = "plant-13" + +/obj/item/kirbyplants/organic/plant14 + icon_state = "plant-14" + +/obj/item/kirbyplants/organic/plant15 + icon_state = "plant-15" + +/obj/item/kirbyplants/organic/plant16 + icon_state = "plant-16" + +/obj/item/kirbyplants/organic/plant17 + icon_state = "plant-17" + +/obj/item/kirbyplants/organic/plant18 + icon_state = "plant-18" + +/obj/item/kirbyplants/organic/plant19 + icon_state = "plant-19" + +/obj/item/kirbyplants/organic/plant20 + icon_state = "plant-20" + +/obj/item/kirbyplants/organic/plant1 + icon_state = "plant-01" + +/obj/item/kirbyplants/organic/plant21 + icon_state = "plant-21" + +/obj/item/kirbyplants/organic/plant22 + icon_state = "plant-22" + +/obj/item/kirbyplants/organic/plant23 + icon_state = "plant-23" + +/obj/item/kirbyplants/organic/plant24 + icon_state = "plant-24" diff --git a/code/game/objects/items/kirby_plants/synthetic_plants.dm b/code/game/objects/items/kirby_plants/synthetic_plants.dm new file mode 100644 index 0000000000000..672325f288c6d --- /dev/null +++ b/code/game/objects/items/kirby_plants/synthetic_plants.dm @@ -0,0 +1,17 @@ +/obj/item/kirbyplants/synthetic + name = "plastic potted plant" + desc = "A fake, cheap looking, plastic tree. Perfect for people who kill every plant they touch." + custom_materials = (list(/datum/material/plastic = SHEET_MATERIAL_AMOUNT * 4)) + trimmable = FALSE + +/obj/item/kirbyplants/synthetic/plant26 + icon_state = "plant-26" + +/obj/item/kirbyplants/synthetic/plant27 + icon_state = "plant-27" + +/obj/item/kirbyplants/synthetic/plant28 + icon_state = "plant-28" + +/obj/item/kirbyplants/synthetic/plant29 + icon_state = "plant-29" diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm index b6f80363b61ed..1c88658dbd52e 100644 --- a/code/game/objects/items/kitchen.dm +++ b/code/game/objects/items/kitchen.dm @@ -9,7 +9,7 @@ #define PLASTIC_BREAK_PROBABILITY 25 /obj/item/kitchen - icon = 'icons/obj/kitchen.dmi' + icon = 'icons/obj/service/kitchen.dmi' lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi' @@ -104,7 +104,8 @@ /obj/item/knife/kitchen/silicon name = "Kitchen Toolset" - icon_state = "sili_knife" + icon = 'icons/obj/items_cyborg.dmi' + icon_state = "sili_knife" desc = "A breakthrough in synthetic engineering, this tool is a knife programmed to dull when not used for cooking purposes, and can exchange the blade for a rolling pin" force = 0 throwforce = 0 @@ -114,6 +115,9 @@ attack_verb_simple = list("prod", "whiff", "scratch", "poke") tool_behaviour = TOOL_KNIFE +/obj/item/knife/kitchen/silicon/get_all_tool_behaviours() + return list(TOOL_ROLLINGPIN, TOOL_KNIFE) + /obj/item/knife/kitchen/silicon/examine() . = ..() . += " It's fitted with a [tool_behaviour] head." @@ -143,6 +147,7 @@ /obj/item/kitchen/rollingpin name = "rolling pin" desc = "Used to knock out the Bartender." + icon = 'icons/obj/service/kitchen.dmi' icon_state = "rolling_pin" worn_icon_state = "rolling_pin" inhand_icon_state = "rolling_pin" diff --git a/code/game/objects/items/knives.dm b/code/game/objects/items/knives.dm index c8eccd25407b9..337c75cf5eb03 100644 --- a/code/game/objects/items/knives.dm +++ b/code/game/objects/items/knives.dm @@ -1,7 +1,7 @@ // Knife Template, should not appear in game normaly // /obj/item/knife name = "knife" - icon = 'icons/obj/kitchen.dmi' + icon = 'icons/obj/service/kitchen.dmi' icon_state = "knife" lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi' @@ -53,7 +53,7 @@ /obj/item/knife/ritual name = "ritual knife" desc = "The unearthly energies that once powered this blade are now dormant." - icon = 'icons/obj/eldritch.dmi' + icon = 'icons/obj/weapons/khopesh.dmi' icon_state = "bone_blade" inhand_icon_state = "bone_blade" worn_icon_state = "bone_blade" @@ -61,12 +61,16 @@ righthand_file = 'icons/mob/inhands/64x64_righthand.dmi' inhand_x_dimension = 64 inhand_y_dimension = 64 + item_flags = CRUEL_IMPLEMENT //maybe they want to use it in surgery + force = 15 + throwforce = 15 + wound_bonus = 20 w_class = WEIGHT_CLASS_NORMAL /obj/item/knife/bloodletter name = "bloodletter" desc = "An occult looking dagger that is cold to the touch. Somehow, the flawless orb on the pommel is made entirely of liquid blood." - icon = 'icons/obj/ice_moon/artifacts.dmi' + icon = 'icons/obj/weapons/khopesh.dmi' icon_state = "bloodletter" worn_icon_state = "render" w_class = WEIGHT_CLASS_NORMAL @@ -103,6 +107,7 @@ /obj/item/knife/hunting name = "hunting knife" + icon = 'icons/obj/weapons/stabby.dmi' desc = "Despite its name, it's mainly used for cutting meat from dead prey rather than actual hunting." inhand_icon_state = "huntingknife" icon_state = "huntingknife" @@ -117,6 +122,7 @@ /obj/item/knife/combat name = "combat knife" + icon = 'icons/obj/weapons/stabby.dmi' icon_state = "buckknife" desc = "A military combat utility survival knife." embedding = list("pain_mult" = 4, "embed_chance" = 65, "fall_chance" = 10, "ignore_throwspeed_threshold" = TRUE) @@ -128,6 +134,7 @@ /obj/item/knife/combat/survival name = "survival knife" + icon = 'icons/obj/weapons/stabby.dmi' icon_state = "survivalknife" embedding = list("pain_mult" = 4, "embed_chance" = 35, "fall_chance" = 10) desc = "A hunting grade survival knife." @@ -138,6 +145,7 @@ /obj/item/knife/combat/bone name = "bone dagger" inhand_icon_state = "bone_dagger" + icon = 'icons/obj/weapons/stabby.dmi' icon_state = "bone_dagger" worn_icon_state = "bone_dagger" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' @@ -160,7 +168,7 @@ /obj/item/knife/shiv name = "glass shiv" - icon = 'icons/obj/shards.dmi' + icon = 'icons/obj/weapons/stabby.dmi' icon_state = "shiv" inhand_icon_state = "shiv" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' @@ -243,7 +251,6 @@ name = "carrot shiv" icon_state = "carrotshiv" inhand_icon_state = "carrotshiv" - icon = 'icons/obj/kitchen.dmi' desc = "Unlike other carrots, you should probably keep this far away from your eyes." custom_materials = null diff --git a/code/game/objects/items/mail.dm b/code/game/objects/items/mail.dm index c9fddbe19d63f..3c75a708f9c4c 100644 --- a/code/game/objects/items/mail.dm +++ b/code/game/objects/items/mail.dm @@ -3,7 +3,7 @@ name = "mail" gender = NEUTER desc = "An officially postmarked, tamper-evident parcel regulated by CentCom and made of high-quality materials." - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "mail_small" inhand_icon_state = "paper" worn_icon_state = "paper" @@ -115,7 +115,7 @@ return TRUE balloon_alert(user, "hold it!") return FALSE - + /obj/item/mail/attack_self(mob/user) if(!unwrap(user)) @@ -140,8 +140,11 @@ // proc that goes after unwrapping a mail. /obj/item/mail/proc/after_unwrap(mob/user) user.temporarilyRemoveItemFromInventory(src, force = TRUE) - for(var/obj/item/stuff as anything in contents) // Mail and envelope actually can have more than 1 item. - user.put_in_hands(stuff) + for(var/obj/stuff as anything in contents) // Mail and envelope actually can have more than 1 item. + if(isitem(stuff)) + user.put_in_hands(stuff) + else + stuff.forceMove(drop_location()) playsound(loc, 'sound/items/poster_ripped.ogg', vol = 50, vary = TRUE) qdel(src) return TRUE @@ -205,7 +208,12 @@ if(prob(25)) special_name = TRUE - junk = pick(list(/obj/item/paper/pamphlet/gateway, /obj/item/paper/pamphlet/violent_video_games, /obj/item/paper/fluff/junkmail_redpill, /obj/effect/decal/cleanable/ash)) + junk = pick(list( + /obj/item/paper/pamphlet/gateway, + /obj/item/paper/pamphlet/violent_video_games, + /obj/item/paper/fluff/junkmail_redpill, + /obj/effect/decal/cleanable/ash, + )) var/list/junk_names = list( /obj/item/paper/pamphlet/gateway = "[initial(name)] for [pick(GLOB.adjectives)] adventurers", @@ -306,7 +314,7 @@ /obj/item/storage/bag/mail name = "mail bag" desc = "A bag for letters, envelopes, and other postage." - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "mailbag" worn_icon_state = "mailbag" resistance_flags = FLAMMABLE @@ -330,7 +338,7 @@ var/nuclear_option_odds = 0.1 /obj/item/paper/fluff/junkmail_redpill/Initialize(mapload) - var/obj/machinery/nuclearbomb/selfdestruct/self_destruct = locate() in GLOB.nuke_list + var/obj/machinery/nuclearbomb/selfdestruct/self_destruct = locate() in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/nuclearbomb/selfdestruct) if(!self_destruct || !prob(nuclear_option_odds)) // 1 in 1000 chance of getting 2 random nuke code characters. add_raw_text("You need to escape the simulation. Don't forget the numbers, they help you remember: '[rand(0,9)][rand(0,9)][rand(0,9)]...'") return ..() @@ -391,7 +399,7 @@ return TRUE else balloon_alert(user, "tinkering with something...") - + if(!do_after(user, 2 SECONDS, target = src)) after_unwrap(user) return FALSE @@ -408,7 +416,7 @@ name = "GLA-2 mail counterfeit device" desc = "Device that actually able to counterfeit NT's mail. This device also able to place a trap inside of mail for malicious actions. Trap will \"activate\" any item inside of mail. Also it might be used for contraband purposes. Integrated micro-computer will give you great configuration optionality for your needs." w_class = WEIGHT_CLASS_NORMAL - icon = 'icons/obj/device_syndie.dmi' + icon = 'icons/obj/antags/syndicate_tools.dmi' icon_state = "mail_counterfeit_device" /obj/item/storage/mail_counterfeit_device/Initialize(mapload) @@ -442,17 +450,18 @@ var/list/mail_recipients_for_input = list("Anyone") var/list/used_names = list() for(var/datum/record/locked/person in sort_record(GLOB.manifest.locked)) - if(isnull(person.mind_ref)) + var/datum/mind/locked_mind = person.mind_ref.resolve() + if(isnull(locked_mind)) continue - mail_recipients += person.mind_ref + mail_recipients += locked_mind mail_recipients_for_input += avoid_assoc_duplicate_keys(person.name, used_names) - + var/recipient = tgui_input_list(user, "Choose a recipient", "Mail Counterfeiting", mail_recipients_for_input) if(isnull(recipient)) return FALSE if(!(src in user.contents)) return FALSE - + var/index = mail_recipients_for_input.Find(recipient) var/obj/item/mail/traitor/shady_mail @@ -460,7 +469,7 @@ shady_mail = new /obj/item/mail/traitor else shady_mail = new /obj/item/mail/traitor/envelope - + shady_mail.made_by_cached_ckey = user.ckey shady_mail.made_by_cached_name = user.mind.name diff --git a/code/game/objects/items/manuals.dm b/code/game/objects/items/manuals.dm index 1b1516af8cbd3..ffbeea5975cfd 100644 --- a/code/game/objects/items/manuals.dm +++ b/code/game/objects/items/manuals.dm @@ -2,7 +2,7 @@ //Oh god what the fuck I am not good at computer /obj/item/book/manual - icon = 'icons/obj/library.dmi' + icon = 'icons/obj/service/library.dmi' due_date = 0 // Game time in 1/10th seconds unique = TRUE // FALSE - Normal book, TRUE - Should not be treated as normal book, unable to be copied, unable to be modified @@ -431,9 +431,10 @@ H.gib_animation() sleep(0.3 SECONDS) H.adjustBruteLoss(1000) //to make the body super-bloody + // if we use gib() then the body gets deleted H.spawn_gibs() - H.spill_organs() - H.spread_bodyparts() + H.spill_organs(DROP_ALL_REMAINS) + H.spread_bodyparts(DROP_BRAIN) return BRUTELOSS /obj/item/book/manual/wiki/plumbing diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm index f315d090fb254..6777d7934ff88 100644 --- a/code/game/objects/items/melee/baton.dm +++ b/code/game/objects/items/melee/baton.dm @@ -95,6 +95,15 @@ if(BATON_ATTACKING) finalize_baton_attack(target, user, modifiers) +/obj/item/melee/baton/apply_fantasy_bonuses(bonus) + . = ..() + stamina_damage = modify_fantasy_variable("stamina_damage", stamina_damage, bonus * 4) + + +/obj/item/melee/baton/remove_fantasy_bonuses(bonus) + stamina_damage = reset_fantasy_variable("stamina_damage", stamina_damage) + return ..() + /obj/item/melee/baton/add_item_context(datum/source, list/context, atom/target, mob/living/user) if (isturf(target)) return NONE @@ -127,7 +136,7 @@ if(!chunky_finger_usable && ishuman(user)) var/mob/living/carbon/human/potential_chunky_finger_human = user - if(potential_chunky_finger_human.check_chunky_fingers() && user.is_holding(src) && !HAS_TRAIT(user, TRAIT_CHUNKYFINGERS_IGNORE_BATON) && (user.mind && !HAS_TRAIT(user.mind, TRAIT_CHUNKYFINGERS_IGNORE_BATON))) + if(potential_chunky_finger_human.check_chunky_fingers() && user.is_holding(src) && !HAS_MIND_TRAIT(user, TRAIT_CHUNKYFINGERS_IGNORE_BATON)) balloon_alert(potential_chunky_finger_human, "fingers are too big!") return BATON_ATTACK_DONE @@ -322,13 +331,15 @@ /obj/item/melee/baton/telescopic/Initialize(mapload) . = ..() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ force_on = active_force, \ hitsound_on = hitsound, \ w_class_on = WEIGHT_CLASS_NORMAL, \ clumsy_check = FALSE, \ attack_verb_continuous_on = list("smacks", "strikes", "cracks", "beats"), \ - attack_verb_simple_on = list("smack", "strike", "crack", "beat")) + attack_verb_simple_on = list("smack", "strike", "crack", "beat"), \ + ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) /obj/item/melee/baton/telescopic/suicide_act(mob/living/user) @@ -361,8 +372,9 @@ src.active = active inhand_icon_state = active ? on_inhand_icon_state : null // When inactive, there is no inhand icon_state. - balloon_alert(user, active ? "extended" : "collapsed") - playsound(user ? user : src, on_sound, 50, TRUE) + if(user) + balloon_alert(user, active ? "extended" : "collapsed") + playsound(src, on_sound, 50, TRUE) return COMPONENT_NO_DEFAULT_MESSAGE /obj/item/melee/baton/telescopic/contractor_baton @@ -786,9 +798,10 @@ if(!.) return var/obj/item/stuff_in_hand = target.get_active_held_item() - if(stuff_in_hand && target.temporarilyRemoveItemFromInventory(stuff_in_hand)) - if(user.put_in_inactive_hand(stuff_in_hand)) - stuff_in_hand.loc.visible_message(span_warning("[stuff_in_hand] suddenly appears in [user]'s hand!")) - else - stuff_in_hand.forceMove(user.drop_location()) - stuff_in_hand.loc.visible_message(span_warning("[stuff_in_hand] suddenly appears!")) + if(!user || !stuff_in_hand || !target.temporarilyRemoveItemFromInventory(stuff_in_hand)) + return + if(user.put_in_inactive_hand(stuff_in_hand)) + stuff_in_hand.loc.visible_message(span_warning("[stuff_in_hand] suddenly appears in [user]'s hand!")) + else + stuff_in_hand.forceMove(user.drop_location()) + stuff_in_hand.loc.visible_message(span_warning("[stuff_in_hand] suddenly appears!")) diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index 4a2648ed3f00e..8af7a0b4fb896 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -17,8 +17,6 @@ /// The color of this energy based sword, for use in editing the icon_state. var/sword_color_icon - /// Whether our blade is active or not. - var/blade_active = FALSE /// Force while active. var/active_force = 30 /// Throwforce while active. @@ -36,12 +34,17 @@ fire = 100 acid = 30 +/obj/item/melee/energy/get_all_tool_behaviours() + return list(TOOL_SAW) + /obj/item/melee/energy/Initialize(mapload) . = ..() make_transformable() - AddComponent(/datum/component/butchering, \ - speed = 5 SECONDS, \ - butcher_sound = active_hitsound, \ + AddElement(/datum/element/update_icon_updates_onmob) + AddComponent( + /datum/component/butchering, \ + speed = 5 SECONDS, \ + butcher_sound = active_hitsound, \ ) /obj/item/melee/energy/Destroy() @@ -52,7 +55,8 @@ * Gives our item the transforming component, passing in our various vars. */ /obj/item/melee/energy/proc/make_transformable() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ force_on = active_force, \ throwforce_on = active_throwforce, \ throw_speed_on = 4, \ @@ -61,12 +65,11 @@ w_class_on = active_w_class, \ attack_verb_continuous_on = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts"), \ attack_verb_simple_on = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut"), \ - inhand_icon_change = FALSE, \ ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) /obj/item/melee/energy/suicide_act(mob/living/user) - if(!blade_active) + if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) attack_self(user) user.visible_message(span_suicide("[user] is [pick("slitting [user.p_their()] stomach open with", "falling on")] [src]! It looks like [user.p_theyre()] trying to commit seppuku!")) return (BRUTELOSS|FIRELOSS) @@ -76,7 +79,7 @@ open_flame() /obj/item/melee/energy/ignition_effect(atom/atom, mob/user) - if(!heat && !blade_active) + if(!heat && !HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) return "" var/in_mouth = "" @@ -84,31 +87,32 @@ var/mob/living/carbon/carbon_user = user 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.") + . = span_warning("[user] swings [user.p_their()] [name][in_mouth]. [user.p_They()] light[user.p_s()] [user.p_their()] [atom.name] in the process.") playsound(loc, hitsound, get_clamped_volume(), TRUE, -1) add_fingerprint(user) -/* +/obj/item/melee/energy/update_icon_state() + . = ..() + if(!sword_color_icon) + return + if(HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) + icon_state = "[base_icon_state]_on_[sword_color_icon]" // "esword_on_red" + inhand_icon_state = icon_state + else + icon_state = base_icon_state + inhand_icon_state = base_icon_state + +/** * Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM]. * - * Updates our icon to have the correct color, - * updates the amount of heat our item gives out, - * enables / disables embedding, and - * starts / stops processing. + * Updates some of the stuff the transforming comp doesn't, such as heat and embedding. * * Also gives feedback to the user and activates or deactives the glow. */ /obj/item/melee/energy/proc/on_transform(obj/item/source, mob/user, active) SIGNAL_HANDLER - blade_active = active if(active) - if(sword_color_icon) - icon_state = "[icon_state]_[sword_color_icon]" - inhand_icon_state = "[inhand_icon_state]_on_[sword_color_icon]" - if(ismob(loc)) - var/mob/loc_mob = loc - loc_mob.update_held_items() if(embedding) updateEmbedding() heat = active_heat @@ -122,8 +126,9 @@ tool_behaviour = (active ? TOOL_SAW : NONE) //Lets energy weapons cut trees. Also lets them do bonecutting surgery, which is kinda metal! if(user) balloon_alert(user, "[name] [active ? "enabled":"disabled"]") - playsound(user ? user : src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 35, TRUE) + playsound(src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 35, TRUE) set_light_on(active) + update_appearance(UPDATE_ICON_STATE) return COMPONENT_NO_DEFAULT_MESSAGE /// Energy axe - extremely strong. @@ -132,6 +137,7 @@ desc = "An energized battle axe." icon_state = "axe" inhand_icon_state = "axe" + base_icon_state = "axe" lefthand_file = 'icons/mob/inhands/weapons/axes_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/axes_righthand.dmi' hitsound = 'sound/weapons/bladeslice.ogg' @@ -152,12 +158,14 @@ active_w_class = WEIGHT_CLASS_HUGE /obj/item/melee/energy/axe/make_transformable() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ force_on = active_force, \ throwforce_on = active_throwforce, \ throw_speed_on = throw_speed, \ sharpness_on = sharpness, \ - w_class_on = active_w_class) + w_class_on = active_w_class, \ + ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) /obj/item/melee/energy/axe/suicide_act(mob/living/user) @@ -169,6 +177,7 @@ name = "energy sword" desc = "May the force be within you." icon_state = "e_sword" + base_icon_state = "e_sword" inhand_icon_state = "e_sword" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' @@ -183,9 +192,9 @@ 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, damage_type = BRUTE) - if(blade_active) - return ..() - return FALSE + if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) + return FALSE + return ..() /obj/item/melee/energy/sword/cyborg name = "cyborg energy sword" @@ -198,14 +207,14 @@ return var/obj/item/stock_parts/cell/our_cell = user.cell - if(blade_active && !(our_cell.use(hitcost))) + if(HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE) && !(our_cell.use(hitcost))) attack_self(user) to_chat(user, span_notice("It's out of charge!")) return return ..() /obj/item/melee/energy/sword/cyborg/cyborg_unequip(mob/user) - if(!blade_active) + if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) return attack_self(user) @@ -237,13 +246,14 @@ "blue" = LIGHT_COLOR_LIGHT_CYAN, "green" = LIGHT_COLOR_GREEN, "purple" = LIGHT_COLOR_LAVENDER, - ) + ) /// Whether this saber has been multitooled. var/hacked = FALSE var/hacked_color /obj/item/melee/energy/sword/saber/Initialize(mapload) . = ..() + AddComponent(/datum/component/jousting, damage_boost_per_tile = 1, knockdown_chance_per_tile = 10) if(!sword_color_icon && LAZYLEN(possible_sword_colors)) sword_color_icon = pick(possible_sword_colors) @@ -252,19 +262,22 @@ /obj/item/melee/energy/sword/saber/process() . = ..() - if(blade_active && hacked) - if(!LAZYLEN(possible_sword_colors)) - possible_sword_colors = list( - "red" = COLOR_SOFT_RED, - "blue" = LIGHT_COLOR_LIGHT_CYAN, - "green" = LIGHT_COLOR_GREEN, - "purple" = LIGHT_COLOR_LAVENDER, - ) - possible_sword_colors -= hacked_color - hacked_color = pick(possible_sword_colors) - set_light_color(possible_sword_colors[hacked_color]) + if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE) || !hacked) + return + + if(!LAZYLEN(possible_sword_colors)) + possible_sword_colors = list( + "red" = COLOR_SOFT_RED, + "blue" = LIGHT_COLOR_LIGHT_CYAN, + "green" = LIGHT_COLOR_GREEN, + "purple" = LIGHT_COLOR_LAVENDER, + ) possible_sword_colors -= hacked_color + hacked_color = pick(possible_sword_colors) + set_light_color(possible_sword_colors[hacked_color]) + possible_sword_colors -= hacked_color + /obj/item/melee/energy/sword/saber/red sword_color_icon = "red" @@ -284,16 +297,14 @@ hacked = TRUE sword_color_icon = "rainbow" to_chat(user, span_warning("RNBW_ENGAGE")) - if(force >= active_force) - icon_state = "[initial(icon_state)]_on_rainbow" - inhand_icon_state = "[initial(inhand_icon_state)]_on_rainbow" - user.update_held_items() + update_appearance(UPDATE_ICON_STATE) /obj/item/melee/energy/sword/pirate name = "energy cutlass" desc = "Arrrr matey." icon_state = "e_cutlass" inhand_icon_state = "e_cutlass" + base_icon_state = "e_cutlass" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' light_color = COLOR_RED @@ -303,6 +314,7 @@ name = "energy blade" desc = "A concentrated beam of energy in the shape of a blade. Very stylish... and lethal." icon_state = "blade" + base_icon_state = "blade" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' hitsound = 'sound/weapons/blade1.ogg' @@ -315,7 +327,6 @@ 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 @@ -326,6 +337,7 @@ spark_system.set_up(5, 0, src) spark_system.attach(src) START_PROCESSING(SSobj, src) + ADD_TRAIT(src, TRAIT_TRANSFORM_ACTIVE, INNATE_TRAIT) // Functions as an extended esword /obj/item/melee/energy/blade/Destroy() QDEL_NULL(spark_system) @@ -339,3 +351,4 @@ desc = "An extremely sharp blade made out of hard light. Packs quite a punch." icon_state = "lightblade" inhand_icon_state = "lightblade" + base_icon_state = "lightblade" diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 4c0177832734e..f24efb7d26380 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -86,11 +86,12 @@ /obj/item/melee/sabre/Initialize(mapload) . = ..() + AddComponent(/datum/component/jousting) //fast and effective, but as a sword, it might damage the results. AddComponent(/datum/component/butchering, \ - speed = 3 SECONDS, \ - effectiveness = 95, \ - bonus_modifier = 5, \ + speed = 3 SECONDS, \ + effectiveness = 95, \ + bonus_modifier = 5, \ ) // The weight of authority comes down on the tider's crimes. AddElement(/datum/element/bane, target_type = /mob/living/carbon/human, damage_multiplier = 0.35) @@ -214,7 +215,7 @@ name = "supermatter sword" desc = "In a station full of bad ideas, this might just be the worst." icon = 'icons/obj/weapons/sword.dmi' - icon_state = "supermatter_sword" + icon_state = "supermatter_sword_balanced" inhand_icon_state = "supermatter_sword" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' @@ -266,6 +267,7 @@ /obj/item/melee/supermatter_sword/pickup(user) ..() balanced = 0 + icon_state = "supermatter_sword" /obj/item/melee/supermatter_sword/ex_act(severity, target) visible_message( @@ -339,7 +341,7 @@ /obj/item/melee/roastingstick name = "advanced roasting stick" desc = "A telescopic roasting stick with a miniature shield generator designed to ensure entry into various high-tech shielded cooking ovens and firepits." - icon = 'icons/obj/kitchen.dmi' + icon = 'icons/obj/service/kitchen.dmi' icon_state = "roastingstick" inhand_icon_state = null worn_icon_state = "tele_baton" @@ -355,14 +357,13 @@ var/static/list/ovens /// The beam that links to the oven we use var/datum/beam/beam - /// Whether or stick is extended and can recieve sausage - var/extended = FALSE /obj/item/melee/roastingstick/Initialize(mapload) . = ..() if (!ovens) ovens = typecacheof(list(/obj/singularity, /obj/energy_ball, /obj/machinery/power/supermatter_crystal, /obj/structure/bonfire)) - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ hitsound_on = hitsound, \ clumsy_check = FALSE, \ inhand_icon_change = FALSE, \ @@ -390,16 +391,16 @@ /obj/item/melee/roastingstick/proc/on_transform(obj/item/source, mob/user, active) SIGNAL_HANDLER - extended = active inhand_icon_state = active ? "nullrod" : null - balloon_alert(user, "[active ? "extended" : "collapsed"] [src]") - playsound(user ? user : src, 'sound/weapons/batonextend.ogg', 50, TRUE) + if(user) + balloon_alert(user, "[active ? "extended" : "collapsed"] [src]") + playsound(src, 'sound/weapons/batonextend.ogg', 50, TRUE) return COMPONENT_NO_DEFAULT_MESSAGE /obj/item/melee/roastingstick/attackby(atom/target, mob/user) ..() if (istype(target, /obj/item/food/sausage)) - if (!extended) + if (!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) to_chat(user, span_warning("You must extend [src] to attach anything to it!")) return if (held_sausage) @@ -415,22 +416,21 @@ ..() if (held_sausage) user.put_in_hands(held_sausage) - held_sausage = null - update_appearance() /obj/item/melee/roastingstick/update_overlays() . = ..() if(held_sausage) . += mutable_appearance(icon, "roastingstick_sausage") -/obj/item/melee/roastingstick/handle_atom_del(atom/target) - if (target == held_sausage) +/obj/item/melee/roastingstick/Exited(atom/movable/gone, direction) + . = ..() + if (gone == held_sausage) held_sausage = null update_appearance() /obj/item/melee/roastingstick/afterattack(atom/target, mob/user, proximity) . = ..() - if (!extended) + if (!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) return if (!is_type_in_typecache(target, ovens)) return diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm index de53823ee384d..3dd8d6bb36c85 100644 --- a/code/game/objects/items/mop.dm +++ b/code/game/objects/items/mop.dm @@ -1,7 +1,7 @@ /obj/item/mop desc = "The world of janitalia wouldn't be complete without a mop." name = "mop" - icon = 'icons/obj/janitor.dmi' + icon = 'icons/obj/service/janitor.dmi' icon_state = "mop" inhand_icon_state = "mop" lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi' @@ -25,6 +25,14 @@ /obj/structure/mop_bucket, )) +/obj/item/mop/apply_fantasy_bonuses(bonus) + . = ..() + mopspeed = modify_fantasy_variable("mopspeed", mopspeed, -bonus) + +/obj/item/mop/remove_fantasy_bonuses(bonus) + mopspeed = reset_fantasy_variable("mopspeed", mopspeed) + return ..() + /obj/item/mop/Initialize(mapload) . = ..() AddComponent(/datum/component/cleaner, mopspeed, pre_clean_callback=CALLBACK(src, PROC_REF(should_clean)), on_cleaned_callback=CALLBACK(src, PROC_REF(apply_reagents))) @@ -40,7 +48,7 @@ if(clean_blacklist[atom_to_clean.type]) return DO_NOT_CLEAN if(reagents.total_volume < 0.1) - to_chat(cleaner, span_warning("Your mop is dry!")) + cleaner.balloon_alert(cleaner, "mop is dry!") return DO_NOT_CLEAN return reagents.has_chemical_flag(REAGENT_CLEANS, 1) @@ -90,7 +98,7 @@ START_PROCESSING(SSobj, src) else STOP_PROCESSING(SSobj,src) - to_chat(user, span_notice("You set the condenser switch to the '[refill_enabled ? "ON" : "OFF"]' position.")) + user.balloon_alert(user, "condenser switch [refill_enabled ? "on" : "off"]") playsound(user, 'sound/machines/click.ogg', 30, TRUE) /obj/item/mop/advanced/process(seconds_per_tick) diff --git a/code/game/objects/items/nitrium_crystals.dm b/code/game/objects/items/nitrium_crystals.dm index 7a04c78304643..828f437ade2fd 100644 --- a/code/game/objects/items/nitrium_crystals.dm +++ b/code/game/objects/items/nitrium_crystals.dm @@ -1,7 +1,7 @@ /obj/item/nitrium_crystal desc = "A weird brown crystal, it smokes when broken" name = "nitrium crystal" - icon = 'icons/obj/atmospherics/atmos.dmi' + icon = 'icons/obj/pipes_n_cables/atmos.dmi' icon_state = "nitrium_crystal" var/cloud_size = 1 diff --git a/code/game/objects/items/paiwire.dm b/code/game/objects/items/paiwire.dm index 118da08cf4477..fa5724ebb534f 100644 --- a/code/game/objects/items/paiwire.dm +++ b/code/game/objects/items/paiwire.dm @@ -1,7 +1,7 @@ /obj/item/pai_cable desc = "A flexible coated cable with a universal jack on one end." name = "data cable" - icon = 'icons/obj/power.dmi' + icon = 'icons/obj/stack_objects.dmi' icon_state = "wire1" item_flags = NOBLUDGEON var/obj/machinery/machine //what machine we're currently hacking. diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm index 6d7e13a5ff12b..7c742f41fc719 100644 --- a/code/game/objects/items/pet_carrier.dm +++ b/code/game/objects/items/pet_carrier.dm @@ -32,17 +32,11 @@ return ..() /obj/item/pet_carrier/Exited(atom/movable/gone, direction) + . = ..() if(isliving(gone) && (gone in occupants)) - var/mob/living/L = gone + var/mob/living/living_gone = gone occupants -= gone - occupant_weight -= L.mob_size - -/obj/item/pet_carrier/handle_atom_del(atom/A) - if(A in occupants && isliving(A)) - var/mob/living/L = A - occupants -= L - occupant_weight -= L.mob_size - ..() + occupant_weight -= living_gone.mob_size /obj/item/pet_carrier/examine(mob/user) . = ..() diff --git a/code/game/objects/items/pillow.dm b/code/game/objects/items/pillow.dm index 4bd54aa2e5416..ea7463e210fbf 100644 --- a/code/game/objects/items/pillow.dm +++ b/code/game/objects/items/pillow.dm @@ -2,11 +2,12 @@ /obj/item/pillow name = "pillow" desc = "A soft and fluffy pillow. You can smack someone with this!" - icon = 'icons/obj/pillow.dmi' + icon = 'icons/obj/bed.dmi' icon_state = "pillow_1_t" inhand_icon_state = "pillow_t" lefthand_file = 'icons/mob/inhands/items/pillow_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/pillow_righthand.dmi' + force = 5 w_class = WEIGHT_CLASS_NORMAL damtype = STAMINA ///change the description based on the pillow tag @@ -19,6 +20,8 @@ var/variation = 1 ///for alternating between hard hitting sound vs soft hitting sound var/hit_sound + ///if we have a brick inside us + var/bricked = FALSE /obj/item/pillow/Initialize(mapload) . = ..() @@ -37,7 +40,7 @@ . = ..() if(!iscarbon(target_mob)) return - if(HAS_TRAIT(src, TRAIT_WIELDED)) + if(bricked || HAS_TRAIT(src, TRAIT_WIELDED)) user.apply_damage(5, STAMINA) // when hitting with such force we should prolly be getting tired too hit_sound = 'sound/items/pillow_hit2.ogg' else @@ -49,42 +52,45 @@ . = ..() if(!istype(victim)) return - if(victim.wear_mask || !victim.get_bodypart(BODY_ZONE_HEAD)) + if(victim.is_mouth_covered() || !victim.get_bodypart(BODY_ZONE_HEAD)) return if(HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, span_notice("You can't bring yourself to harm [victim]")) return - if(victim.body_position || user.grab_state >= GRAB_AGGRESSIVE) + if((victim.body_position == LYING_DOWN) || ((user.grab_state >= GRAB_AGGRESSIVE) && (user.pulling == victim))) user.visible_message("[user] starts to smother [victim]", span_notice("You begin smothering [victim]"), vision_distance = COMBAT_MESSAGE_RANGE) - smothering(user, victim) - -/obj/item/pillow/proc/smothering(mob/living/carbon/user, mob/living/carbon/victim) - while(victim) - if(victim.body_position == FALSE && user.grab_state <= GRAB_NECK) - break - if(!do_after(user, 1 SECONDS, victim)) - break - victim.losebreath += 1 - victim.visible_message("[victim] manages to escape being smothered!", span_notice("You break free!"), vision_distance = COMBAT_MESSAGE_RANGE) + INVOKE_ASYNC(src, PROC_REF(smothering), user, victim) /obj/item/pillow/attackby(obj/item/attacking_item, mob/user, params) - . = ..() - if(!pillow_trophy && istype(attacking_item, /obj/item/clothing/neck/pillow_tag)) - user.transferItemToLoc(attacking_item, src) - pillow_trophy = attacking_item - balloon_alert(user, "honor reclaimed!") - update_appearance() - else - balloon_alert(user, "tag is intact.") + if(!bricked && istype(attacking_item, /obj/item/stack/sheet/mineral/sandstone)) + var/obj/item/stack/sheet/mineral/sandstone/brick = attacking_item + balloon_alert(user, "inserting brick...") + if(!do_after(user, 2 SECONDS, src)) + return + if(!brick.use(1)) + balloon_alert(user, "not enough bricks!") + return + balloon_alert(user, "bricked!") + become_bricked() return + if(istype(attacking_item, /obj/item/clothing/neck/pillow_tag)) + if(!pillow_trophy) + user.transferItemToLoc(attacking_item, src) + pillow_trophy = attacking_item + balloon_alert(user, "honor reclaimed!") + update_appearance() + return + else + balloon_alert(user, "tag is intact.") + return + return ..() /obj/item/pillow/examine(mob/user) . = ..() - . += span_notice("There's more information below, you can look again to take a closer look...") - -/obj/item/pillow/examine_more(mob/user) - . = ..() - . += span_notice("Alt-click to remove the tag!") + if(bricked) + . += span_info("[p_They()] feel[p_s()] unnaturally heavy.") + if(pillow_trophy) + . += span_notice("Alt-click to remove the tag!") /obj/item/pillow/AltClick(mob/user) . = ..() @@ -95,7 +101,7 @@ if(!do_after(user, 2 SECONDS, src)) return if(last_fighter) - pillow_trophy.desc = "a pillow tag taken from [last_fighter] after a gruesome pillow fight." + pillow_trophy.desc = "A pillow tag taken from [last_fighter] after a gruesome pillow fight." user.put_in_hands(pillow_trophy) pillow_trophy = null balloon_alert(user, "tag removed") @@ -113,12 +119,34 @@ icon_state = "pillow_[variation]_t" inhand_icon_state = "pillow_t" +/// Puts a brick inside the pillow, increasing it's damage +/obj/item/pillow/proc/become_bricked() + bricked = TRUE + var/datum/component/two_handed/two_handed = GetComponent(/datum/component/two_handed) + if(two_handed) + AddComponent(/datum/component/two_handed, force_unwielded = two_handed.force_unwielded + 5, force_wielded = two_handed.force_wielded + 10) + force += 5 + update_appearance() + +/// Smothers the victim while the do_after succeeds and the victim is laying down or being strangled +/obj/item/pillow/proc/smothering(mob/living/carbon/user, mob/living/carbon/victim) + while(victim) + if((victim.body_position != LYING_DOWN) && ((user.grab_state < GRAB_AGGRESSIVE) || (user.pulling != victim))) + break + if(!do_after(user, 1 SECONDS, victim)) + break + victim.losebreath += 1 + victim.visible_message("[victim] manages to escape being smothered!", span_notice("You break free!"), vision_distance = COMBAT_MESSAGE_RANGE) + /obj/item/pillow/random /obj/item/pillow/random/Initialize(mapload) . = ..() variation = rand(1, 4) icon_state = "pillow_[variation]_t" + //random pillows spawn bricked sometimes, fuck you + if(prob(1)) + become_bricked() /obj/item/clothing/suit/pillow_suit name = "pillow suit" @@ -126,7 +154,7 @@ body_parts_covered = CHEST|GROIN|ARMS|LEGS|FEET cold_protection = CHEST|GROIN|ARMS|LEGS //a pillow suit must be hella warm allowed = list(/obj/item/pillow) //moar pillow carnage - icon = 'icons/obj/pillow.dmi' + icon = 'icons/obj/bed.dmi' worn_icon = 'icons/mob/clothing/suits/pillow.dmi' icon_state = "pillow_suit" armor_type = /datum/armor/suit_pillow_suit @@ -149,7 +177,7 @@ name = "pillow hood" desc = "The final piece of the pillow juggernaut" body_parts_covered = HEAD - icon = 'icons/obj/pillow.dmi' + icon = 'icons/obj/bed.dmi' worn_icon = 'icons/mob/clothing/suits/pillow.dmi' icon_state = "pillowcase_hat" body_parts_covered = HEAD @@ -163,7 +191,7 @@ /obj/item/clothing/neck/pillow_tag name = "pillow tag" desc = "A price tag for the pillow. It appears to have space to fill names in." - icon = 'icons/obj/pillow.dmi' + icon = 'icons/obj/bed.dmi' icon_state = "pillow_tag" worn_icon = 'icons/mob/clothing/neck.dmi' worn_icon_state = "pillow_tag" diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm index 8659b0e1715a1..4c2c526c2c1b2 100644 --- a/code/game/objects/items/pinpointer.dm +++ b/code/game/objects/items/pinpointer.dm @@ -199,7 +199,7 @@ B.other_pair = A /obj/item/pinpointer/shuttle - name = "fugitive pinpointer" + name = "bounty shuttle pinpointer" desc = "A handheld tracking device that locates the bounty hunter shuttle for quick escapes." icon_state = "pinpointer_hunter" worn_icon_state = "pinpointer_black" diff --git a/code/game/objects/items/pitchfork.dm b/code/game/objects/items/pitchfork.dm index 7538c1123bd96..63c4db34b3969 100644 --- a/code/game/objects/items/pitchfork.dm +++ b/code/game/objects/items/pitchfork.dm @@ -29,6 +29,7 @@ /obj/item/pitchfork/Initialize(mapload) . = ..() + AddComponent(/datum/component/jousting) AddComponent(/datum/component/two_handed, force_unwielded=7, force_wielded=15, icon_wielded="[base_icon_state]1") /obj/item/pitchfork/update_icon_state() diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index c3fbe7cdcdc58..eab3f34d343fe 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -108,10 +108,10 @@ return ..() -/obj/item/toy/plush/handle_atom_del(atom/A) - if(A == grenade) +/obj/item/toy/plush/Exited(atom/movable/gone, direction) + . = ..() + if(gone == grenade) grenade = null - ..() /obj/item/toy/plush/attack_self(mob/user) . = ..() @@ -148,7 +148,6 @@ else to_chat(user, span_notice("You remove the grenade from [src].")) user.put_in_hands(grenade) - grenade = null return if(isgrenade(I)) if(stuffed) @@ -585,6 +584,7 @@ squeak_override = list('sound/effects/blobattack.ogg' = 1) gender = FEMALE //given all the jokes and drawings, I'm not sure the xenobiologists would make a slimeboy +// This is supposed to be only in the bus ruin, don't spawn it elsewhere /obj/item/toy/plush/awakenedplushie name = "awakened plushie" desc = "An ancient plushie that has grown enlightened to the true nature of reality." @@ -777,14 +777,12 @@ 'sound/weapons/cablecuff.ogg' = 1, ) -/obj/item/toy/plush/greek_cucumber - name = "greek cucumber" - desc = "A plushie depicting a large cucumber with eyes, it seems that according to the manufacturer of the toy, the human race will look like in the future." - icon_state = "cucumber" - inhand_icon_state = null - attack_verb_continuous = list("squishes", "creaks", "crunches") - attack_verb_simple = list("squish", "creak", "crunch") - squeak_override = list( - 'sound/effects/slosh.ogg' = 1, - 'sound/effects/splat.ogg' = 2 - ) +/obj/item/toy/plush/shark + name = "shark plushie" + desc = "A plushie depicting a somewhat cartoonish shark. The tag calls it a 'hákarl', noting that it was made by an obscure furniture manufacturer in old Scandinavia." + lefthand_file = 'icons/mob/inhands/items/plushes_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items/plushes_righthand.dmi' + icon_state = "blahaj" + inhand_icon_state = "blahaj" + attack_verb_continuous = list("gnaws", "gnashes", "chews") + attack_verb_simple = list("gnaw", "gnash", "chew") diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index 4af1da629d78c..bd31228f2fc92 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -250,15 +250,15 @@ var/turf/newtarget = locate(new_x, new_y, starting.z) return newtarget -/obj/item/pneumatic_cannon/handle_atom_del(atom/A) +/obj/item/pneumatic_cannon/Exited(atom/movable/gone, direction) . = ..() - if (loadedItems.Remove(A)) - var/obj/item/I = A - if(istype(I)) - loadedWeightClass -= I.w_class + if(loadedItems.Remove(gone)) + var/obj/item/item = gone + if(istype(item)) + loadedWeightClass -= item.w_class else loadedWeightClass-- - else if (A == tank) + else if (gone == tank) tank = null update_appearance() diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm index 4314db829fd38..735d30929601c 100644 --- a/code/game/objects/items/powerfist.dm +++ b/code/game/objects/items/powerfist.dm @@ -9,7 +9,7 @@ /obj/item/melee/powerfist name = "power-fist" desc = "A metal gauntlet with a piston-powered ram ontop for that extra 'ompfh' in your punch." - icon = 'icons/obj/device_syndie.dmi' + icon = 'icons/obj/antags/syndicate_tools.dmi' icon_state = "powerfist" inhand_icon_state = "powerfist" lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm index b176d2b6823a2..fc80355a7cc59 100644 --- a/code/game/objects/items/puzzle_pieces.dm +++ b/code/game/objects/items/puzzle_pieces.dm @@ -5,7 +5,7 @@ /obj/item/keycard name = "security keycard" desc = "This feels like it belongs to a door." - icon = 'icons/obj/puzzle_small.dmi' + icon = 'icons/obj/fluff/puzzle_small.dmi' icon_state = "keycard" force = 0 throwforce = 0 @@ -44,6 +44,7 @@ resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF move_resist = MOVE_FORCE_OVERPOWERING damage_deflection = 70 + can_open_with_hands = FALSE /// Make sure that the puzzle has the same puzzle_id as the keycard door! var/puzzle_id = null /// Message that occurs when the door is opened @@ -126,7 +127,7 @@ /obj/structure/holobox name = "holobox" desc = "A hard-light box, containing a secure decryption key." - icon = 'icons/obj/puzzle_small.dmi' + icon = 'icons/obj/fluff/puzzle_small.dmi' icon_state = "laserbox" density = TRUE resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF @@ -135,7 +136,7 @@ /obj/item/pressure_plate/hologrid name = "hologrid" desc = "A high power, electronic input port for a holobox, which can unlock the hologrid's storage compartment. Safe to stand on." - icon = 'icons/obj/puzzle_small.dmi' + icon = 'icons/obj/fluff/puzzle_small.dmi' icon_state = "lasergrid" anchored = TRUE trigger_mob = FALSE @@ -180,7 +181,7 @@ /obj/structure/light_puzzle name = "light mechanism" desc = "It's a mechanism that seems to power something when all the lights are lit up. It looks virtually indestructible." - icon = 'icons/obj/puzzle_small.dmi' + icon = 'icons/obj/fluff/puzzle_small.dmi' icon_state = "light_puzzle" anchored = TRUE explosion_block = 3 @@ -225,8 +226,8 @@ for(var/i in 1 to 9) if(!light_list[i]) continue - var/mutable_appearance/lit_image = mutable_appearance('icons/obj/puzzle_small.dmi', "light_lit") - var/mutable_appearance/emissive_image = emissive_appearance('icons/obj/puzzle_small.dmi', "light_lit", src) + var/mutable_appearance/lit_image = mutable_appearance('icons/obj/fluff/puzzle_small.dmi', "light_lit") + var/mutable_appearance/emissive_image = emissive_appearance('icons/obj/fluff/puzzle_small.dmi', "light_lit", src) lit_image.pixel_x = 8 * ((i % 3 || 3 ) - 1) lit_image.pixel_y = -8 * (ROUND_UP(i / 3) - 1) emissive_image.pixel_x = lit_image.pixel_x diff --git a/code/game/objects/items/rcd/RCD.dm b/code/game/objects/items/rcd/RCD.dm index 0ddc31631625b..27c04aa7479ce 100644 --- a/code/game/objects/items/rcd/RCD.dm +++ b/code/game/objects/items/rcd/RCD.dm @@ -19,6 +19,9 @@ #define CATEGORY_ICON_SUFFIX "category_icon_suffix" #define TITLE_ICON "ICON=TITLE" +///multiplier applied on construction & deconstruction time when building multiple structures +#define FREQUENT_USE_DEBUFF_MULTIPLIER 3 + //RAPID CONSTRUCTION DEVICE /obj/item/construction/rcd @@ -28,7 +31,7 @@ worn_icon_state = "RCD" lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - custom_premium_price = PAYCHECK_COMMAND * 10 + custom_premium_price = PAYCHECK_COMMAND * 2 max_matter = 160 slot_flags = ITEM_SLOT_BELT item_flags = NO_MAT_REDEMPTION | NOBLUDGEON @@ -48,6 +51,7 @@ list(CONSTRUCTION_MODE = RCD_WINDOWGRILLE, WINDOW_TYPE = /obj/structure/window/reinforced/fulltile, ICON = "rwindow0", TITLE = "Full Tile Reinforced Window"), list(CONSTRUCTION_MODE = RCD_CATWALK, ICON = "catwalk-0", TITLE = "Catwalk"), list(CONSTRUCTION_MODE = RCD_REFLECTOR, ICON = "reflector_base", TITLE = "Reflector"), + list(CONSTRUCTION_MODE = RCD_GIRDER, ICON = "girder", TITLE = "Girder"), ), //Computers & Machine Frames @@ -160,6 +164,9 @@ COOLDOWN_DECLARE(destructive_scan_cooldown) + ///number of active rcd effects in use e.g. when building multiple walls at once this value increases + var/current_active_effects = 0 + GLOBAL_VAR_INIT(icon_holographic_wall, init_holographic_wall()) GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) @@ -252,45 +259,54 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) useResource(16, user) activate() playsound(loc, 'sound/machines/click.ogg', 50, 1) - user.gib() + user.gib(DROP_ALL_REMAINS) return MANUAL_SUICIDE user.visible_message(span_suicide("[user] pulls the trigger... But there is not enough ammo!")) return SHAME -/// check can the structure be placed on the turf -/obj/item/construction/rcd/proc/can_place(atom/A, list/rcd_results, mob/user) +/** + * checks if we can build the structure + * Arguments + * + * * [atom][target]- the target we are trying to build on/deconstruct e.g. turf, wall etc + * * rcd_results- list of params specifically the build type of our structure + * * [mob][user]- the user + */ +/obj/item/construction/rcd/proc/can_place(atom/target, list/rcd_results, mob/user) /** *For anything that does not go an a wall we have to make sure that turf is clear for us to put the structure on it *If we are just trying to destory something then this check is not nessassary *RCD_WALLFRAME is also returned as the mode when upgrading apc, airalarm, firealarm using simple circuits upgrade */ if(rcd_results["mode"] != RCD_WALLFRAME && rcd_results["mode"] != RCD_DECONSTRUCT) - var/turf/target_turf = get_turf(A) - //if we are trying to build a window on top of a grill we check for specific edge cases - if(rcd_results["mode"] == RCD_WINDOWGRILLE && istype(A, /obj/structure/grille)) - var/list/structures_to_ignore + var/turf/target_turf = get_turf(target) + //if we are trying to build a window we check for specific edge cases + if(rcd_results["mode"] == RCD_WINDOWGRILLE) + var/is_full_tile = initial(window_type.fulltile) - //if we are trying to build full-tile windows we only ignore the grille but other directional windows on the grill can block its construction - if(window_type == /obj/structure/window/fulltile || window_type == /obj/structure/window/reinforced/fulltile) - structures_to_ignore = list(A) - //for normal directional windows we ignore the grille & other directional windows as they can be in diffrent directions on the grill. There is a later check during construction to deal with those - else - structures_to_ignore = list(/obj/structure/grille, /obj/structure/window) + var/list/structures_to_ignore + if(istype(target, /obj/structure/grille)) + if(is_full_tile) //if we are trying to build full-tile windows we ignore the grille + structures_to_ignore = list(target) + else //no building directional windows on grills + return FALSE + else //for directional windows we ignore other directional windows as they can be in diffrent directions on the turf. + structures_to_ignore = list(/obj/structure/window) //check if we can build our window on the grill - if(target_turf.is_blocked_turf(exclude_mobs = FALSE, source_atom = null, ignore_atoms = structures_to_ignore, type_list = (length(structures_to_ignore) == 2))) + if(target_turf.is_blocked_turf(exclude_mobs = !is_full_tile, source_atom = null, ignore_atoms = structures_to_ignore, type_list = !is_full_tile)) playsound(loc, 'sound/machines/click.ogg', 50, TRUE) - balloon_alert(user, "something is on the grille!") + balloon_alert(user, "something is blocking the turf") return FALSE /** * if we are trying to create plating on turf which is not a proper floor then dont check for objects on top of the turf just allow that turf to be converted into plating. e.g. create plating beneath a player or underneath a machine frame/any dense object * if we are trying to finish a wall girder then let it finish then make sure no one/nothing is stuck in the girder */ - else if(rcd_results["mode"] == RCD_FLOORWALL && (!istype(target_turf, /turf/open/floor) || istype(A, /obj/structure/girder))) + else if(rcd_results["mode"] == RCD_FLOORWALL && (!istype(target_turf, /turf/open/floor) || istype(target, /obj/structure/girder))) //if a player builds a wallgirder on top of himself manually with iron sheets he can't finish the wall if he is still on the girder. Exclude the girder itself when checking for other dense objects on the turf - if(istype(A, /obj/structure/girder) && target_turf.is_blocked_turf(exclude_mobs = FALSE, source_atom = null, ignore_atoms = list(A))) + if(istype(target, /obj/structure/girder) && target_turf.is_blocked_turf(exclude_mobs = FALSE, source_atom = null, ignore_atoms = list(target))) playsound(loc, 'sound/machines/click.ogg', 50, TRUE) balloon_alert(user, "something is on the girder!") return FALSE @@ -330,27 +346,58 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) return TRUE -/obj/item/construction/rcd/proc/rcd_create(atom/A, mob/user) +/** + * actual proc to create the structure + * + * Arguments + * * [atom][target]- the target we are trying to build on/deconstruct e.g. turf, wall etc + * * [mob][user]- the user building this structure + */ +/obj/item/construction/rcd/proc/rcd_create(atom/target, mob/user) //does this atom allow for rcd actions? - var/list/rcd_results = A.rcd_vals(user, src) + var/list/rcd_results = target.rcd_vals(user, src) if(!rcd_results) return FALSE + var/delay = rcd_results["delay"] * delay_mod - var/obj/effect/constructing_effect/rcd_effect = new(get_turf(A), delay, src.mode) + if ( + !(upgrade & RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN) \ + && !rcd_results[RCD_RESULT_BYPASS_FREQUENT_USE_COOLDOWN] \ + && current_active_effects > 0 + ) + delay *= FREQUENT_USE_DEBUFF_MULTIPLIER + + current_active_effects += 1 + _rcd_create_effect(target, user, delay, rcd_results) + current_active_effects -= 1 + +/** + * Internal proc which creates the rcd effects & creates the structure + * + * Arguments + * * [atom][target]- the target we are trying to build on/deconstruct e.g. turf, wall etc + * * [mob][user]- the user trying to build the structure + * * delay- the delay with the disk upgrades applied + * * rcd_results- list of params which contains the cost & build mode to create the structure + */ +/obj/item/construction/rcd/proc/_rcd_create_effect(atom/target, mob/user, delay, list/rcd_results) + var/obj/effect/constructing_effect/rcd_effect = new(get_turf(target), delay, src.mode, upgrade) //resource & structure placement sanity checks before & after delay along with beam effects - if(!checkResource(rcd_results["cost"], user) || !can_place(A, rcd_results, user)) + if(!checkResource(rcd_results["cost"], user) || !can_place(target, rcd_results, user)) qdel(rcd_effect) return FALSE var/beam if(ranged) - beam = user.Beam(A,icon_state="rped_upgrade", time = delay) - if(!do_after(user, delay, target = A)) + beam = user.Beam(target,icon_state="rped_upgrade", time = delay) + if(!do_after(user, delay, target = target)) qdel(rcd_effect) if(!isnull(beam)) qdel(beam) return FALSE - if(!checkResource(rcd_results["cost"], user) || !can_place(A, rcd_results, user)) + if (QDELETED(rcd_effect)) + return FALSE + if(!checkResource(rcd_results["cost"], user) || !can_place(target, rcd_results, user)) qdel(rcd_effect) return FALSE @@ -358,7 +405,7 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) qdel(rcd_effect) return FALSE activate() - if(!A.rcd_act(user, src, rcd_results["mode"])) + if(!target.rcd_act(user, src, rcd_results["mode"])) qdel(rcd_effect) return FALSE playsound(loc, 'sound/machines/click.ogg', 50, TRUE) @@ -611,7 +658,7 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) matter = 160 /obj/item/construction/rcd/loaded/upgraded - upgrade = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING + upgrade = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING | RCD_UPGRADE_ANTI_INTERRUPT | RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN /obj/item/construction/rcd/combat name = "industrial RCD" @@ -620,7 +667,22 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) max_matter = 500 matter = 500 canRturf = TRUE - upgrade = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING + upgrade = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING | RCD_UPGRADE_ANTI_INTERRUPT | RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN + +/obj/item/construction/rcd/ce + name = "professional RCD" + desc = "A higher-end model of the rapid construction device, prefitted with improved cooling and disruption prevention. Provided to the chief engineer." + upgrade = RCD_UPGRADE_ANTI_INTERRUPT | RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN + matter = 160 + color = list( + 0.3, 0.3, 0.7, 0.0, + 1.0, 1.0, 0.2, 0.0, + -0.2, 0.0, 1.0, 0.0, + 0.0, 0.0, 0.0, 1.0, + 0.0, 0.0, 0.0, 0.0, + ) + +#undef FREQUENT_USE_DEBUFF_MULTIPLIER #undef CONSTRUCTION_MODE #undef WINDOW_TYPE @@ -655,7 +717,7 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) name = "admin RCD" max_matter = INFINITY matter = INFINITY - upgrade = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING + upgrade = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING | RCD_UPGRADE_ANTI_INTERRUPT | RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN // Ranged RCD @@ -669,4 +731,4 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) icon_state = "arcd" inhand_icon_state = "oldrcd" has_ammobar = FALSE - upgrade = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING + upgrade = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING | RCD_UPGRADE_ANTI_INTERRUPT | RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN diff --git a/code/game/objects/items/rcd/RCL.dm b/code/game/objects/items/rcd/RCL.dm index a3c1a0b48f315..9134a7ac1e537 100644 --- a/code/game/objects/items/rcd/RCL.dm +++ b/code/game/objects/items/rcd/RCL.dm @@ -208,7 +208,7 @@ return //If we've run out, display message and exit else last = null - last = loaded.place_turf(get_turf(src), user, turn(user.dir, 180)) + last = loaded.place_turf(get_turf(src), user, REVERSE_DIR(user.dir)) is_empty(user) //If we've run out, display message update_appearance() diff --git a/code/game/objects/items/rcd/RHD.dm b/code/game/objects/items/rcd/RHD.dm index 50ebce21c9286..92a6ab7764129 100644 --- a/code/game/objects/items/rcd/RHD.dm +++ b/code/game/objects/items/rcd/RHD.dm @@ -1,5 +1,7 @@ //RAPID HANDHELD DEVICE. the base for all rapid devices +#define SILO_USE_AMOUNT (SHEET_MATERIAL_AMOUNT / 4) + /obj/item/construction name = "not for ingame use" desc = "A device used to rapidly build and deconstruct. Reload with iron, plasteel, glass or compressed matter cartridges." @@ -13,7 +15,7 @@ throw_speed = 3 throw_range = 5 w_class = WEIGHT_CLASS_NORMAL - custom_materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*50) + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 50) req_access = list(ACCESS_ENGINE_EQUIP) armor_type = /datum/armor/item_construction resistance_flags = FIRE_PROOF @@ -46,14 +48,14 @@ spark_system.set_up(5, 0, src) spark_system.attach(src) if(upgrade & RCD_UPGRADE_SILO_LINK) - silo_mats = AddComponent(/datum/component/remote_materials, "RCD", mapload, FALSE) + silo_mats = AddComponent(/datum/component/remote_materials, mapload, FALSE) update_appearance() ///used for examining the RCD and for its UI /obj/item/construction/proc/get_silo_iron() if(silo_link && silo_mats.mat_container && !silo_mats.on_hold()) - return silo_mats.mat_container.get_material_amount(/datum/material/iron)/500 - return FALSE + return silo_mats.mat_container.get_material_amount(/datum/material/iron) / SILO_USE_AMOUNT + return 0 ///returns local matter units available. overriden by rcd borg to return power units available /obj/item/construction/proc/get_matter(mob/user) @@ -99,7 +101,7 @@ return upgrade |= design_disk.upgrade if((design_disk.upgrade & RCD_UPGRADE_SILO_LINK) && !silo_mats) - silo_mats = AddComponent(/datum/component/remote_materials, "RCD", FALSE, FALSE) + silo_mats = AddComponent(/datum/component/remote_materials, FALSE, FALSE) playsound(loc, 'sound/machines/click.ogg', 50, TRUE) qdel(design_disk) @@ -171,17 +173,15 @@ balloon_alert(user, "silo on hold!") return FALSE if(!silo_mats.mat_container) - balloon_alert(user, "no silo detected!") + if(user) + balloon_alert(user, "no silo detected!") return FALSE - if(!silo_mats.mat_container.has_materials(list(/datum/material/iron = 500), amount)) + + if(!silo_mats.mat_container.has_enough_of_material(/datum/material/iron, amount * SILO_USE_AMOUNT)) if(user) balloon_alert(user, "not enough silo material!") return FALSE - - var/list/materials = list() - materials[GET_MATERIAL_REF(/datum/material/iron)] = 500 - silo_mats.mat_container.use_materials(materials, amount) - silo_mats.silo_log(src, "consume", -amount, "build", materials) + silo_mats.use_materials(list(/datum/material/iron = SILO_USE_AMOUNT), multiplier = amount, action = "build", name = "consume") return TRUE ///shared data for rcd,rld & plumbing @@ -235,7 +235,7 @@ if(user) balloon_alert(user, "silo on hold!") return FALSE - . = silo_mats.mat_container.has_materials(list(/datum/material/iron = 500), amount) + . = silo_mats.mat_container.has_enough_of_material(/datum/material/iron, amount * SILO_USE_AMOUNT) if(!. && user) balloon_alert(user, "low ammo!") if(has_ammobar) @@ -271,7 +271,7 @@ /obj/item/rcd_upgrade name = "RCD advanced design disk" desc = "It seems to be empty." - icon = 'icons/obj/module.dmi' + icon = 'icons/obj/assemblies/module.dmi' icon_state = "datadisk3" var/upgrade @@ -283,6 +283,14 @@ desc = "It contains the design for firelock, air alarm, fire alarm, apc circuits and crap power cells." upgrade = RCD_UPGRADE_SIMPLE_CIRCUITS +/obj/item/rcd_upgrade/anti_interrupt + desc = "It contains the upgrades necessary to prevent interruption of RCD construction and deconstruction." + upgrade = RCD_UPGRADE_ANTI_INTERRUPT + +/obj/item/rcd_upgrade/cooling + desc = "It contains the upgrades necessary to allow more frequent use of the RCD." + upgrade = RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN + /obj/item/rcd_upgrade/silo_link desc = "It contains direct silo connection RCD upgrade." upgrade = RCD_UPGRADE_SILO_LINK @@ -295,3 +303,4 @@ name = "Destruction Scan" desc = "Scans the surrounding area for destruction. Scanned structures will rebuild significantly faster." +#undef SILO_USE_AMOUNT diff --git a/code/game/objects/items/rcd/RLD.dm b/code/game/objects/items/rcd/RLD.dm index 4cfc3d086c0e3..c5853d2997a2e 100644 --- a/code/game/objects/items/rcd/RLD.dm +++ b/code/game/objects/items/rcd/RLD.dm @@ -18,7 +18,7 @@ has_ammobar = TRUE ammo_sections = 6 ///it does not make sense why any of these should be installed - banned_upgrades = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING + banned_upgrades = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING | RCD_UPGRADE_ANTI_INTERRUPT | RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN var/mode = LIGHT_MODE var/wallcost = 10 diff --git a/code/game/objects/items/rcd/RPD.dm b/code/game/objects/items/rcd/RPD.dm index 218310f4e64ba..a7b10cc516aa4 100644 --- a/code/game/objects/items/rcd/RPD.dm +++ b/code/game/objects/items/rcd/RPD.dm @@ -9,6 +9,9 @@ #define DESTROY_MODE (1<<2) #define REPROGRAM_MODE (1<<3) +///Sound to make when we use the item to build/destroy something +#define RPD_USE_SOUND 'sound/items/deconstruct.ogg' + GLOBAL_LIST_INIT(atmos_pipe_recipes, list( "Pipes" = list( new /datum/pipe_info/pipe("Pipe", /obj/machinery/atmospherics/pipe/smart, TRUE), @@ -43,34 +46,6 @@ GLOBAL_LIST_INIT(atmos_pipe_recipes, list( new /datum/pipe_info/pipe("4-Way Manifold", /obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w, FALSE), new /datum/pipe_info/pipe("Junction", /obj/machinery/atmospherics/pipe/heat_exchanging/junction, FALSE), new /datum/pipe_info/pipe("Heat Exchanger", /obj/machinery/atmospherics/components/unary/heat_exchanger, FALSE), - ), - "Air Sensors" = list( - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/plasma_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/oxygen_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/nitrogen_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/mix_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/nitrous_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/air_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/carbon_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/bz_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/freon_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/halon_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/healium_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/hydrogen_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/hypernoblium_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/miasma_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/nitrium_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/pluoxium_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/proto_nitrate_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/tritium_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/water_vapor_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/zauker_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/helium_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/antinoblium_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/incinerator_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/ordnance_burn_chamber), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/ordnance_freezer_chamber), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/engine_chamber), ) )) @@ -80,6 +55,7 @@ GLOBAL_LIST_INIT(disposal_pipe_recipes, list( new /datum/pipe_info/disposal("Junction", /obj/structure/disposalpipe/junction, PIPE_TRIN_M), new /datum/pipe_info/disposal("Y-Junction", /obj/structure/disposalpipe/junction/yjunction), new /datum/pipe_info/disposal("Sort Junction", /obj/structure/disposalpipe/sorting/mail, PIPE_TRIN_M), + new /datum/pipe_info/disposal("Rotator", /obj/structure/disposalpipe/rotator, PIPE_ONEDIR_FLIPPABLE), new /datum/pipe_info/disposal("Trunk", /obj/structure/disposalpipe/trunk), new /datum/pipe_info/disposal("Bin", /obj/machinery/disposal/bin, PIPE_ONEDIR), new /datum/pipe_info/disposal("Outlet", /obj/structure/disposaloutlet), @@ -98,9 +74,9 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( ), "Station Equipment" = list( new /datum/pipe_info/transit("Through Tube Station", /obj/structure/c_transit_tube/station, PIPE_STRAIGHT), - new /datum/pipe_info/transit("Terminus Tube Station", /obj/structure/c_transit_tube/station/reverse, PIPE_UNARY), + new /datum/pipe_info/transit("Terminus Tube Station", /obj/structure/c_transit_tube/station/reverse, PIPE_UNARY_FLIPPABLE), new /datum/pipe_info/transit("Through Tube Dispenser Station", /obj/structure/c_transit_tube/station/dispenser, PIPE_STRAIGHT), - new /datum/pipe_info/transit("Terminus Tube Dispenser Station", /obj/structure/c_transit_tube/station/dispenser/reverse, PIPE_UNARY), + new /datum/pipe_info/transit("Terminus Tube Dispenser Station", /obj/structure/c_transit_tube/station/dispenser/reverse, PIPE_UNARY_FLIPPABLE), new /datum/pipe_info/transit("Transit Tube Pod", /obj/structure/c_transit_tube_pod, PIPE_ONEDIR), ) )) @@ -112,9 +88,6 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( var/dirtype = PIPE_BENDABLE var/all_layers -/datum/pipe_info/proc/Params() - return "" - /datum/pipe_info/proc/get_preview(selected_dir, selected = FALSE) var/list/dirs switch(dirtype) @@ -138,11 +111,13 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( if(PIPE_UNARY_FLIPPABLE) dirs = list("[NORTH]" = "North", "[EAST]" = "East", "[SOUTH]" = "South", "[WEST]" = "West", "[NORTHEAST]" = "North Flipped", "[SOUTHEAST]" = "East Flipped", "[SOUTHWEST]" = "South Flipped", "[NORTHWEST]" = "West Flipped") + if(PIPE_ONEDIR_FLIPPABLE) + dirs = list("[SOUTH]" = name, "[SOUTHEAST]" = "[name] Flipped") var/list/rows = list() for(var/dir in dirs) var/numdir = text2num(dir) - var/flipped = ((dirtype == PIPE_TRIN_M) || (dirtype == PIPE_UNARY_FLIPPABLE)) && (ISDIAGONALDIR(numdir)) + var/flipped = ((dirtype == PIPE_TRIN_M) || (dirtype == PIPE_UNARY_FLIPPABLE) || (dirtype == PIPE_ONEDIR_FLIPPABLE)) && (ISDIAGONALDIR(numdir)) var/is_variant_selected = selected && (!selected_dir ? FALSE : (dirtype == PIPE_ONEDIR ? TRUE : (numdir == selected_dir))) rows += list(list( "selected" = is_variant_selected, @@ -154,14 +129,6 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( return rows -/datum/pipe_info/sensor - dirtype = PIPE_ONEDIR - -/datum/pipe_info/sensor/New(obj/machinery/air_sensor/sensor) - id = sensor - name = capitalize(replacetext(initial(sensor.name), "gas sensor", "")) - icon_state = "gsensor1" - /datum/pipe_info/pipe/New(label, obj/machinery/atmospherics/path, use_five_layers) name = label id = path @@ -170,9 +137,6 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( var/obj/item/pipe/c = initial(path.construction_type) dirtype = initial(c.RPD_type) -/datum/pipe_info/pipe/Params() - return "makepipe=[id]&type=[dirtype]" - /datum/pipe_info/meter icon_state = "meter" dirtype = PIPE_ONEDIR @@ -180,9 +144,6 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( /datum/pipe_info/meter/New(label) name = label -/datum/pipe_info/meter/Params() - return "makemeter=[id]&type=[dirtype]" - /datum/pipe_info/disposal/New(label, obj/path, dt=PIPE_UNARY) name = label id = path @@ -193,9 +154,6 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( dirtype = dt -/datum/pipe_info/disposal/Params() - return "dmake=[id]&type=[dirtype]" - /datum/pipe_info/transit/New(label, obj/path, dt=PIPE_UNARY) name = label id = path @@ -287,8 +245,8 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( /obj/item/pipe_dispenser/examine(mob/user) . = ..() - . += "You can scroll your mouse wheel to change the piping layer." - . += "You can right click a pipe to set the RPD to its color and layer." + . += span_notice("You can scroll your mouse wheel to change the piping layer.") + . += span_notice("You can right click a pipe to set the RPD to its color and layer.") /obj/item/pipe_dispenser/equipped(mob/user, slot, initial) . = ..() @@ -309,17 +267,12 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( ui_interact(user) /obj/item/pipe_dispenser/pre_attack_secondary(obj/machinery/atmospherics/target, mob/user, params) - if(istype(target, /obj/machinery/air_sensor)) - if(!do_after(user, destroy_speed, target)) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - qdel(target) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if(!istype(target, /obj/machinery/atmospherics)) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN if(target.pipe_color && target.piping_layer) paint_color = GLOB.pipe_color_name[target.pipe_color] piping_layer = target.piping_layer + balloon_alert(user, "color/layer copied") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /obj/item/pipe_dispenser/add_item_context(obj/item/source, list/context, atom/target, mob/living/user) @@ -334,7 +287,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( /obj/item/pipe_dispenser/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] points the end of the RPD down [user.p_their()] throat and presses a button! It looks like [user.p_theyre()] trying to commit suicide...")) playsound(get_turf(user), 'sound/machines/click.ogg', 50, TRUE) - playsound(get_turf(user), 'sound/items/deconstruct.ogg', 50, TRUE) + playsound(get_turf(user), RPD_USE_SOUND, 50, TRUE) return BRUTELOSS /obj/item/pipe_dispenser/ui_assets(mob/user) @@ -363,37 +316,31 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( "mode" = mode, ) - var/list/recipes + //currently selected category (atmos, disposal or transit) + var/list/selected_major_category switch(category) if(ATMOS_CATEGORY) - recipes = GLOB.atmos_pipe_recipes + selected_major_category = GLOB.atmos_pipe_recipes if(DISPOSALS_CATEGORY) - recipes = GLOB.disposal_pipe_recipes + selected_major_category = GLOB.disposal_pipe_recipes if(TRANSIT_CATEGORY) - recipes = GLOB.transit_tube_recipes - for(var/c in recipes) - var/list/cat = recipes[c] - var/list/r = list() - for(var/i in 1 to cat.len) - var/datum/pipe_info/info = cat[i] - - //skip sensors which are already in the world so we dont create duplicate ones - if(info.type == /datum/pipe_info/sensor) - var/datum/pipe_info/sensor/sensor_info = info - var/obj/machinery/air_sensor/sensor = sensor_info.id - if(GLOB.objects_by_id_tag[CHAMBER_SENSOR_FROM_ID(initial(sensor.chamber_id))] != null) - continue - - r += list(list( + selected_major_category = GLOB.transit_tube_recipes + //selected subcategory (e.g. pipes/binary/devices/heat exchange for atmos) + for(var/subcategory in selected_major_category) + var/list/subcategory_recipes = selected_major_category[subcategory] + var/list/available_recipe = list() + for(var/i in 1 to subcategory_recipes.len) + var/datum/pipe_info/info = subcategory_recipes[i] + + available_recipe += list(list( "pipe_name" = info.name, "pipe_index" = i, "previews" = info.get_preview(p_dir, info == recipe) )) if(info == recipe) - data["selected_category"] = c - if(r.len == 0) //when all air sensors are installed this list will become empty - continue - data["categories"] += list(list("cat_name" = c, "recipes" = r)) + data["selected_category"] = subcategory + + data["categories"] += list(list("cat_name" = subcategory, "recipes" = available_recipe)) var/list/init_directions = list("north" = FALSE, "south" = FALSE, "east" = FALSE, "west" = FALSE) for(var/direction in GLOB.cardinals) @@ -439,8 +386,8 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( p_flipped = text2num(params["flipped"]) playeffect = FALSE if("mode") - var/n = text2num(params["mode"]) - mode ^= n + var/selected_mode = text2num(params["mode"]) + mode ^= selected_mode if("init_dir_setting") var/target_dir = p_init_dir ^ text2dir(params["dir_flag"]) // Refuse to create a smart pipe that can only connect in one direction (it would act weirdly and lack an icon) @@ -456,12 +403,12 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( playsound(get_turf(src), 'sound/effects/pop.ogg', 50, FALSE) return TRUE -/obj/item/pipe_dispenser/pre_attack(atom/A, mob/user, params) - if(!ISADVANCEDTOOLUSER(user) || istype(A, /turf/open/space/transit)) +/obj/item/pipe_dispenser/pre_attack(atom/atom_to_attack, mob/user, params) + if(!ISADVANCEDTOOLUSER(user) || istype(atom_to_attack, /turf/open/space/transit)) return ..() - if(istype(A, /obj/item/rpd_upgrade)) - var/obj/item/rpd_upgrade/rpd_up = A + if(istype(atom_to_attack, /obj/item/rpd_upgrade)) + var/obj/item/rpd_upgrade/rpd_up = atom_to_attack //already installed if(rpd_up.upgrade_flags & upgrade_flags) @@ -471,10 +418,11 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( //install & delete upgrade upgrade_flags |= rpd_up.upgrade_flags playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) + balloon_alert(user, "upgrade installed") qdel(rpd_up) return TRUE - var/atom/attack_target = A + var/atom/attack_target = atom_to_attack //So that changing the menu settings doesn't affect the pipes already being built. var/queued_p_type = recipe.id @@ -500,79 +448,79 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( if((mode & DESTROY_MODE) && istype(attack_target, /obj/item/pipe) || istype(attack_target, /obj/structure/disposalconstruct) || istype(attack_target, /obj/structure/c_transit_tube) || istype(attack_target, /obj/structure/c_transit_tube_pod) || istype(attack_target, /obj/item/pipe_meter) || istype(attack_target, /obj/structure/disposalpipe/broken)) playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) if(do_after(user, destroy_speed, target = attack_target)) - activate() + playsound(get_turf(src), RPD_USE_SOUND, 50, TRUE) qdel(attack_target) return if(mode & REPROGRAM_MODE) // If this is a placed smart pipe, try to reprogram it - var/obj/machinery/atmospherics/pipe/smart/S = attack_target - if(istype(S)) - if (S.dir == ALL_CARDINALS) + var/obj/machinery/atmospherics/pipe/smart/target_smart_pipe = attack_target + if(istype(target_smart_pipe)) + if(target_smart_pipe.dir == ALL_CARDINALS) balloon_alert(user, "has no unconnected directions!") return - var/old_init_dir = S.get_init_directions() - if (old_init_dir == p_init_dir) + var/old_init_dir = target_smart_pipe.get_init_directions() + if(old_init_dir == p_init_dir) balloon_alert(user, "already configured!") return // Check for differences in unconnected directions - var/target_differences = (p_init_dir ^ old_init_dir) & ~S.connections - if (!target_differences) + var/target_differences = (p_init_dir ^ old_init_dir) & ~target_smart_pipe.connections + if(!target_differences) balloon_alert(user, "already configured for its directions!") return playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) - if(!do_after(user, reprogram_speed, target = S)) + if(!do_after(user, reprogram_speed, target = target_smart_pipe)) return // Something else could have changed the target's state while we were waiting in do_after // Most of the edge cases don't matter, but atmos components being able to have live connections not described by initializable directions sounds like a headache at best and an exploit at worst // Double check to make sure that nothing has changed. If anything we were about to change was connected during do_after, abort - if (target_differences & S.connections) - balloon_alert(user, "cant configure for its direction!") + if(target_differences & target_smart_pipe.connections) + balloon_alert(user, "can't configure for its direction!") return // Grab the current initializable directions, which may differ from old_init_dir if someone else was working on the same pipe at the same time - var/current_init_dir = S.get_init_directions() + var/current_init_dir = target_smart_pipe.get_init_directions() // Access p_init_dir directly. The RPD can change target layer and initializable directions (though not pipe type or dir) while working to dispense and connect a component, // and have it reflected in the final result. Reprogramming should be similarly consistent. var/new_init_dir = (current_init_dir & ~target_differences) | (p_init_dir & target_differences) // Don't make a smart pipe with only one connection - if (ISSTUB(new_init_dir)) + if(ISSTUB(new_init_dir)) balloon_alert(user, "no one directional pipes allowed!") return - S.set_init_directions(new_init_dir) + target_smart_pipe.set_init_directions(new_init_dir) // We're now reconfigured. // We can never disconnect from existing connections, but we can connect to previously unconnected directions, and should immediately do so var/newly_permitted_connections = new_init_dir & ~current_init_dir if(newly_permitted_connections) // We're allowed to connect in new directions. Recompute our nodes // Disconnect from everything that is currently connected - for (var/i in 1 to S.device_type) + for(var/i in 1 to target_smart_pipe.device_type) // This is basically pipe.nullifyNode, but using it here would create a pitfall for others attempting to // copy and paste disconnection code for other components. Welcome to the atmospherics subsystem - var/obj/machinery/atmospherics/node = S.nodes[i] - if (!node) + var/obj/machinery/atmospherics/node = target_smart_pipe.nodes[i] + if(!node) continue - node.disconnect(S) - S.nodes[i] = null + node.disconnect(target_smart_pipe) + target_smart_pipe.nodes[i] = null // Get our new connections - S.atmos_init() + target_smart_pipe.atmos_init() // Connect to our new connections - for (var/obj/machinery/atmospherics/O in S.nodes) - O.atmos_init() - O.add_member(src) - SSair.add_to_rebuild_queue(S) + for(var/obj/machinery/atmospherics/connected_device in target_smart_pipe.nodes) + connected_device.atmos_init() + connected_device.add_member(target_smart_pipe) + SSair.add_to_rebuild_queue(target_smart_pipe) // Finally, update our internal state - update_pipe_icon also updates dir and connections - S.update_pipe_icon() - user.visible_message(span_notice("[user] reprograms the \the [S]."),span_notice("You reprogram \the [S].")) + target_smart_pipe.update_pipe_icon() + user.visible_message(span_notice("[user] reprograms \the [target_smart_pipe]."), span_notice("You reprogram \the [target_smart_pipe].")) return // If this is an unplaced smart pipe, try to reprogram it - var/obj/item/pipe/quaternary/I = attack_target - if(istype(I) && ispath(I.pipe_type, /obj/machinery/atmospherics/pipe/smart)) + var/obj/item/pipe/quaternary/target_unsecured_pipe = attack_target + if(istype(target_unsecured_pipe) && ispath(target_unsecured_pipe.pipe_type, /obj/machinery/atmospherics/pipe/smart)) // An unplaced pipe never has any existing connections, so just directly assign the new configuration - I.p_init_dir = p_init_dir - I.update() + target_unsecured_pipe.p_init_dir = p_init_dir + target_unsecured_pipe.update() if(mode & BUILD_MODE) switch(category) //if we've gotten this var, the target is valid @@ -582,28 +530,20 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) if (recipe.type == /datum/pipe_info/meter) if(do_after(user, atmos_build_speed, target = attack_target)) - activate() - var/obj/item/pipe_meter/PM = new /obj/item/pipe_meter(get_turf(attack_target)) - PM.setAttachLayer(piping_layer) + playsound(get_turf(src), RPD_USE_SOUND, 50, TRUE) + var/obj/item/pipe_meter/new_meter = new /obj/item/pipe_meter(get_turf(attack_target)) + new_meter.setAttachLayer(piping_layer) if(mode & WRENCH_MODE) - PM.wrench_act(user, src) - else if(recipe.type == /datum/pipe_info/sensor) - if(do_after(user, atmos_build_speed, target = attack_target)) - activate() - var/datum/pipe_info/sensor/sensor_recipe = recipe - var/obj/machinery/air_sensor/sensor_blueprint = sensor_recipe.id - new sensor_blueprint(get_turf(attack_target)) - //change the recipe as the current one becomes unavailable - recipe = first_atmos + new_meter.wrench_act(user, src) else if(recipe.all_layers == FALSE && (piping_layer == 1 || piping_layer == 5)) - balloon_alert(user, "cant build on this layer!") + balloon_alert(user, "can't build on this layer!") return ..() if(do_after(user, atmos_build_speed, target = attack_target)) if(recipe.all_layers == FALSE && (piping_layer == 1 || piping_layer == 5))//double check to stop cheaters (and to not waste time waiting for something that can't be placed) - balloon_alert(user, "cant build on this layer!") + balloon_alert(user, "can't build on this layer!") return ..() - activate() + playsound(get_turf(src), RPD_USE_SOUND, 50, TRUE) var/obj/machinery/atmospherics/path = queued_p_type var/pipe_item_type = initial(path.construction_type) || /obj/item/pipe var/obj/item/pipe/pipe_type = new pipe_item_type( @@ -615,8 +555,8 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( ispath(queued_p_type, /obj/machinery/atmospherics/pipe/smart) ? p_init_dir : null, ) if(queued_p_flipped && istype(pipe_type, /obj/item/pipe/trinary/flippable)) - var/obj/item/pipe/trinary/flippable/F = pipe_type - F.flipped = queued_p_flipped + var/obj/item/pipe/trinary/flippable/new_flippable_pipe = pipe_type + new_flippable_pipe.flipped = queued_p_flipped pipe_type.update() pipe_type.add_fingerprint(usr) @@ -635,19 +575,19 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( return playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) if(do_after(user, disposal_build_speed, target = attack_target)) - var/obj/structure/disposalconstruct/C = new (attack_target, queued_p_type, queued_p_dir, queued_p_flipped) + var/obj/structure/disposalconstruct/new_disposals_segment = new (attack_target, queued_p_type, queued_p_dir, queued_p_flipped) - if(!C.can_place()) + if(!new_disposals_segment.can_place()) balloon_alert(user, "not enough room!") - qdel(C) + qdel(new_disposals_segment) return - activate() + playsound(get_turf(src), RPD_USE_SOUND, 50, TRUE) - C.add_fingerprint(usr) - C.update_appearance() + new_disposals_segment.add_fingerprint(usr) + new_disposals_segment.update_appearance() if(mode & WRENCH_MODE) - C.wrench_act(user, src) + new_disposals_segment.wrench_act(user, src) return if(TRANSIT_CATEGORY) //Making transit tubes @@ -665,7 +605,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) if(do_after(user, transit_build_speed, target = attack_target)) - activate() + playsound(get_turf(src), RPD_USE_SOUND, 50, TRUE) if(queued_p_type == /obj/structure/c_transit_tube_pod) var/obj/structure/c_transit_tube_pod/pod = new /obj/structure/c_transit_tube_pod(attack_target) pod.add_fingerprint(usr) @@ -687,36 +627,29 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( else return ..() -/obj/item/pipe_dispenser/proc/activate() - playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, TRUE) -/obj/item/pipe_dispenser/proc/mouse_wheeled(mob/source, atom/A, delta_x, delta_y, params) +///Changes the piping layer when the mousewheel is scrolled up or down. +/obj/item/pipe_dispenser/proc/mouse_wheeled(mob/source_mob, atom/A, delta_x, delta_y, params) SIGNAL_HANDLER - if(source.incapacitated(IGNORE_RESTRAINTS|IGNORE_STASIS)) + if(source_mob.incapacitated(IGNORE_RESTRAINTS|IGNORE_STASIS)) + return + if(source_mob.get_active_held_item() != src) return if(delta_y < 0) piping_layer = min(PIPING_LAYER_MAX, piping_layer + 1) else if(delta_y > 0) piping_layer = max(PIPING_LAYER_MIN, piping_layer - 1) - else + else //mice with side-scrolling wheels are apparently a thing and fuck this up return SStgui.update_uis(src) - to_chat(source, span_notice("You set the layer to [piping_layer].")) + to_chat(source_mob, span_notice("You set the layer to [piping_layer].")) -#undef ATMOS_CATEGORY -#undef DISPOSALS_CATEGORY -#undef TRANSIT_CATEGORY - -#undef BUILD_MODE -#undef DESTROY_MODE -#undef WRENCH_MODE -#undef REPROGRAM_MODE /obj/item/rpd_upgrade name = "RPD advanced design disk" desc = "It seems to be empty." - icon = 'icons/obj/module.dmi' + icon = 'icons/obj/assemblies/module.dmi' icon_state = "datadisk3" /// Bitflags for upgrades var/upgrade_flags @@ -724,3 +657,14 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( /obj/item/rpd_upgrade/unwrench desc = "Adds reverse wrench mode to the RPD. Attention, due to budget cuts, the mode is hard linked to the destroy mode control button." upgrade_flags = RPD_UPGRADE_UNWRENCH + +#undef ATMOS_CATEGORY +#undef DISPOSALS_CATEGORY +#undef TRANSIT_CATEGORY + +#undef BUILD_MODE +#undef DESTROY_MODE +#undef WRENCH_MODE +#undef REPROGRAM_MODE + +#undef RPD_USE_SOUND diff --git a/code/game/objects/items/rcd/RPLD.dm b/code/game/objects/items/rcd/RPLD.dm index 8679efb4934fa..d3f763bb21a5a 100644 --- a/code/game/objects/items/rcd/RPLD.dm +++ b/code/game/objects/items/rcd/RPLD.dm @@ -10,16 +10,12 @@ icon = 'icons/obj/tools.dmi' slot_flags = ITEM_SLOT_BELT ///it does not make sense why any of these should be installed. - banned_upgrades = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING + banned_upgrades = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING | RCD_UPGRADE_ANTI_INTERRUPT | RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN matter = 200 max_matter = 200 ///type of the plumbing machine var/obj/machinery/blueprint = null - ///index, used in the attack self to get the type. stored here since it doesnt change - var/list/choices = list() - ///All info for construction - var/list/machinery_data = list("cost" = list()) ///This list that holds all the plumbing design types the plumberer can construct. Its purpose is to make it easy to make new plumberer subtypes with a different selection of machines. var/list/plumbing_design_types ///Current selected layer @@ -34,47 +30,53 @@ "Fourth Layer" = 4, "Fifth Layer" = 5, ) - -/obj/item/construction/plumbing/Initialize(mapload) - . = ..() - - //design types supported for this plumbing rcd - set_plumbing_designs() - - //set cost of each machine & initial blueprint - for(var/obj/machinery/plumbing/plumbing_type as anything in plumbing_design_types) - machinery_data["cost"][plumbing_type] = plumbing_design_types[plumbing_type] - blueprint = plumbing_design_types[1] - -/obj/item/construction/plumbing/proc/set_plumbing_designs() - plumbing_design_types = list( + ///Design types for general plumbing constructor + var/static/list/general_design_types = list( //category 1 Synthesizers i.e devices which creates , reacts & destroys chemicals - /obj/machinery/plumbing/synthesizer = 15, - /obj/machinery/plumbing/reaction_chamber/chem = 15, - /obj/machinery/plumbing/grinder_chemical = 30, - /obj/machinery/plumbing/growing_vat = 20, - /obj/machinery/plumbing/fermenter = 30, - /obj/machinery/plumbing/liquid_pump = 35, //extracting chemicals from ground is one way of creation - /obj/machinery/plumbing/disposer = 10, - /obj/machinery/plumbing/buffer = 10, //creates chemicals as it waits for other buffers containing other chemicals and when mixed creates new chemicals + "Synthesizers" = list( + /obj/machinery/plumbing/synthesizer = 15, + /obj/machinery/plumbing/reaction_chamber/chem = 15, + /obj/machinery/plumbing/grinder_chemical = 30, + /obj/machinery/plumbing/growing_vat = 20, + /obj/machinery/plumbing/fermenter = 30, + /obj/machinery/plumbing/liquid_pump = 35, //extracting chemicals from ground is one way of creation + /obj/machinery/plumbing/disposer = 10, + /obj/machinery/plumbing/buffer = 10, //creates chemicals as it waits for other buffers containing other chemicals and when mixed creates new chemicals + ), //category 2 distributors i.e devices which inject , move around , remove chemicals from the network - /obj/machinery/duct = 1, - /obj/machinery/plumbing/layer_manifold = 5, - /obj/machinery/plumbing/input = 5, - /obj/machinery/plumbing/filter = 5, - /obj/machinery/plumbing/splitter = 5, - /obj/machinery/plumbing/sender = 20, - /obj/machinery/plumbing/output = 5, + "Distributors" = list( + /obj/machinery/duct = 1, + /obj/machinery/plumbing/layer_manifold = 5, + /obj/machinery/plumbing/input = 5, + /obj/machinery/plumbing/filter = 5, + /obj/machinery/plumbing/splitter = 5, + /obj/machinery/plumbing/sender = 20, + /obj/machinery/plumbing/output = 5, + ), //category 3 Storage i.e devices which stores & makes the processed chemicals ready for consumption - /obj/machinery/plumbing/tank = 20, - /obj/machinery/plumbing/acclimator = 10, - /obj/machinery/plumbing/bottler = 50, - /obj/machinery/plumbing/pill_press = 20, - /obj/machinery/iv_drip/plumbing = 20 + "Storage" = list( + /obj/machinery/plumbing/tank = 20, + /obj/machinery/plumbing/acclimator = 10, + /obj/machinery/plumbing/bottler = 50, + /obj/machinery/plumbing/pill_press = 20, + /obj/machinery/iv_drip/plumbing = 20 + ), ) +/obj/item/construction/plumbing/Initialize(mapload) + . = ..() + + plumbing_design_types = general_design_types + + /** + * plumbing_design_types[1] = "Synthesizers" + * plumbing_design_types["Synthesizers"] = + * [1] = + */ + blueprint = plumbing_design_types[plumbing_design_types[1]][1] + /obj/item/construction/plumbing/equipped(mob/user, slot, initial) . = ..() if(slot & ITEM_SLOT_HANDS) @@ -113,48 +115,37 @@ /obj/item/construction/plumbing/ui_static_data(mob/user) return list("paint_colors" = GLOB.pipe_paint_colors) -///find which category this design belongs to -/obj/item/construction/plumbing/proc/get_category(obj/machinery/recipe) - if(ispath(recipe, /obj/machinery/plumbing)) - var/obj/machinery/plumbing/plumbing_design = recipe - return initial(plumbing_design.category) - else if(ispath(recipe , /obj/machinery/duct)) - return "Distribution" - else - return "Storage" - /obj/item/construction/plumbing/ui_data(mob/user) var/list/data = ..() data["piping_layer"] = name_to_number[current_layer] //maps layer name to layer number's 1,2,3,4,5 data["selected_color"] = current_color data["layer_icon"] = "plumbing_layer[GLOB.plumbing_layers[current_layer]]" - data["selected_category"] = get_category(blueprint) data["selected_recipe"] = initial(blueprint.name) - var/list/category_list = list() - var/category_name = "" - var/obj/machinery/recipe = null + var/category_list = list() + for(var/category_name in plumbing_design_types) + var/list/designs = plumbing_design_types[category_name] - for(var/i in 1 to plumbing_design_types.len) - recipe = plumbing_design_types[i] + //Create category + var/list/item_list = list() + item_list["cat_name"] = category_name //used by RapidPipeDispenser.js + item_list["recipes"] = list() //used by RapidPipeDispenser.js + category_list[category_name] = item_list - category_name = get_category(recipe) //get category of design - if(!category_list[category_name]) - var/list/item_list = list() - item_list["cat_name"] = category_name //used by RapidPipeDispenser.js - item_list["recipes"] = list() //used by RapidPipeDispenser.js - category_list[category_name] = item_list + //Add designs to category + for(var/obj/machinery/recipe as anything in designs) + category_list[category_name]["recipes"] += list(list( + "icon" = initial(recipe.icon_state), + "name" = initial(recipe.name), + )) - //add item to category - category_list[category_name]["recipes"] += list(list( - "index" = i, - "icon" = initial(recipe.icon_state), - "name" = initial(recipe.name), - )) + //Set selected category + if(blueprint == recipe) + data["selected_category"] = category_name data["categories"] = list() - for(category_name in category_list) + for(var/category_name in category_list) data["categories"] += list(category_list[category_name]) return data @@ -176,9 +167,15 @@ if(layer != null) //validate if this value exists in the list current_layer = layer if("recipe") - var/design = plumbing_design_types[text2num(params["id"])] - if(design != null) //validate if design is valid - blueprint = design + var/category = params["category"] + if(!plumbing_design_types[category]) + return FALSE + + var/design = plumbing_design_types[category][text2num(params["id"]) + 1] + if(!design) + return FALSE + blueprint = design + playsound(src, 'sound/effects/pop.ogg', 50, vary = FALSE) return TRUE @@ -186,23 +183,31 @@ ///pretty much rcd_create, but named differently to make myself feel less bad for copypasting from a sibling-type /obj/item/construction/plumbing/proc/create_machine(atom/destination, mob/user) - if(!machinery_data || !isopenturf(destination)) + if(!isopenturf(destination)) + return FALSE + + var/cost = 0 + for(var/category in plumbing_design_types) + cost = plumbing_design_types[category][blueprint] + if(cost) + break + if(!cost) return FALSE //resource & placement sanity check before & after delay var/is_allowed = TRUE - if(!checkResource(machinery_data["cost"][blueprint], user) || !(is_allowed = canPlace(destination))) + if(!checkResource(cost, user) || !(is_allowed = canPlace(destination))) if(!is_allowed) balloon_alert(user, "turf is blocked!") - return FALSE - if(!do_after(user, machinery_data["cost"][blueprint], target = destination)) //"cost" is relative to delay at a rate of 10 matter/second (1matter/decisecond) rather than playing with 2 different variables since everyone set it to this rate anyways. return FALSE - if(!checkResource(machinery_data["cost"][blueprint], user) || !(is_allowed = canPlace(destination))) + if(!do_after(user, cost, target = destination)) //"cost" is relative to delay at a rate of 10 matter/second (1matter/decisecond) rather than playing with 2 different variables since everyone set it to this rate anyways. + return FALSE + if(!checkResource(cost, user) || !(is_allowed = canPlace(destination))) if(!is_allowed) balloon_alert(user, "turf is blocked!") - return FALSE + return FALSE - if(!useResource(machinery_data["cost"][blueprint], user)) + if(!useResource(cost, user)) return FALSE activate() playsound(loc, 'sound/machines/click.ogg', 50, TRUE) @@ -249,16 +254,24 @@ . = ..() if(!proximity) return - if(istype(target, /obj/machinery/plumbing)) - var/obj/machinery/machine_target = target - if(machine_target.anchored) - balloon_alert(user, "anchor first!") + + for(var/category_name in plumbing_design_types) + var/list/designs = plumbing_design_types[category_name] + + for(var/obj/machinery/recipe as anything in designs) + if(target.type != recipe) + continue + + var/obj/machinery/machine_target = target + if(machine_target.anchored) + balloon_alert(user, "unanchor first!") + return + if(do_after(user, 20, target = target)) + machine_target.deconstruct() //Let's not substract matter + playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) //this is just such a great sound effect return - if(do_after(user, 20, target = target)) - machine_target.deconstruct() //Let's not substract matter - playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) //this is just such a great sound effect - else - create_machine(target, user) + + create_machine(target, user) /obj/item/construction/plumbing/AltClick(mob/user) ui_interact(user) @@ -289,55 +302,75 @@ inhand_icon_state = "plumberer_sci" lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' + ///Design types for research plumbing constructor + var/list/static/research_design_types = list( + //Category 1 Synthesizers + "Synthesizers" = list( + /obj/machinery/plumbing/reaction_chamber = 15, + /obj/machinery/plumbing/grinder_chemical = 30, + /obj/machinery/plumbing/disposer = 10, + /obj/machinery/plumbing/growing_vat = 20, + ), + + //Category 2 Distributors + "Distributors" = list( + /obj/machinery/duct = 1, + /obj/machinery/plumbing/input = 5, + /obj/machinery/plumbing/filter = 5, + /obj/machinery/plumbing/splitter = 5, + /obj/machinery/plumbing/output = 5, + ), + + //Category 3 storage + "Storage" = list( + /obj/machinery/plumbing/tank = 20, + /obj/machinery/plumbing/acclimator = 10, + ), + ) -/obj/item/construction/plumbing/research/set_plumbing_designs() - plumbing_design_types = list( - //category 1 synthesizers - /obj/machinery/plumbing/reaction_chamber = 15, - /obj/machinery/plumbing/grinder_chemical = 30, - /obj/machinery/plumbing/disposer = 10, - /obj/machinery/plumbing/growing_vat = 20, - - //category 2 Distributors - /obj/machinery/duct = 1, - /obj/machinery/plumbing/input = 5, - /obj/machinery/plumbing/filter = 5, - /obj/machinery/plumbing/splitter = 5, - /obj/machinery/plumbing/output = 5, +/obj/item/construction/plumbing/research/Initialize(mapload) + . = ..() - //category 3 storage - /obj/machinery/plumbing/tank = 20, - /obj/machinery/plumbing/acclimator = 10, - ) + plumbing_design_types = research_design_types /obj/item/construction/plumbing/service name = "service plumbing constructor" desc = "A type of plumbing constructor designed to rapidly deploy the machines needed to make a brewery." icon_state = "plumberer_service" - -/obj/item/construction/plumbing/service/set_plumbing_designs() - plumbing_design_types = list( - //category 1 synthesizers - /obj/machinery/plumbing/synthesizer/soda = 15, - /obj/machinery/plumbing/synthesizer/beer = 15, - /obj/machinery/plumbing/reaction_chamber = 15, - /obj/machinery/plumbing/buffer = 10, - /obj/machinery/plumbing/fermenter = 30, - /obj/machinery/plumbing/grinder_chemical = 30, - /obj/machinery/plumbing/disposer = 10, - - - //category 2 distributors - /obj/machinery/duct = 1, - /obj/machinery/plumbing/layer_manifold = 5, - /obj/machinery/plumbing/input = 5, - /obj/machinery/plumbing/filter = 5, - /obj/machinery/plumbing/splitter = 5, - /obj/machinery/plumbing/output/tap = 5, - /obj/machinery/plumbing/sender = 20, + ///Design types for plumbing service constructor + var/static/list/service_design_types = list( + //Category 1 synthesizers + "Synthesizers" = list( + /obj/machinery/plumbing/synthesizer/soda = 15, + /obj/machinery/plumbing/synthesizer/beer = 15, + /obj/machinery/plumbing/reaction_chamber = 15, + /obj/machinery/plumbing/buffer = 10, + /obj/machinery/plumbing/fermenter = 30, + /obj/machinery/plumbing/grinder_chemical = 30, + /obj/machinery/plumbing/disposer = 10, + ), + + //Category 2 distributors + "Distributors" = list( + /obj/machinery/duct = 1, + /obj/machinery/plumbing/layer_manifold = 5, + /obj/machinery/plumbing/input = 5, + /obj/machinery/plumbing/filter = 5, + /obj/machinery/plumbing/splitter = 5, + /obj/machinery/plumbing/output/tap = 5, + /obj/machinery/plumbing/sender = 20, + ), //category 3 storage - /obj/machinery/plumbing/bottler = 50, - /obj/machinery/plumbing/tank = 20, - /obj/machinery/plumbing/acclimator = 10, + "Storage" = list( + /obj/machinery/plumbing/bottler = 50, + /obj/machinery/plumbing/tank = 20, + /obj/machinery/plumbing/acclimator = 10, + ), ) + +/obj/item/construction/plumbing/service/Initialize(mapload) + . = ..() + + plumbing_design_types = service_design_types + diff --git a/code/game/objects/items/rcd/RSF.dm b/code/game/objects/items/rcd/RSF.dm index ef5cedf77b0f0..8db8c2a91161a 100644 --- a/code/game/objects/items/rcd/RSF.dm +++ b/code/game/objects/items/rcd/RSF.dm @@ -183,12 +183,13 @@ RSF ///Tracks whether or not the cookiesynth is about to print a poisoned cookie var/toxin = FALSE //This might be better suited to some initialize fuckery, but I don't have a good "poisoned" sprite -/obj/item/rsf/cookiesynth/emag_act(mob/user) +/obj/item/rsf/cookiesynth/emag_act(mob/user, obj/item/card/emag/emag_card) obj_flags ^= EMAGGED if(obj_flags & EMAGGED) - to_chat(user, span_warning("You short out [src]'s reagent safety checker!")) + balloon_alert(user, "reagent safety checker shorted out") else - to_chat(user, span_warning("You reset [src]'s reagent safety checker!")) + balloon_alert(user, "reagent safety checker reset") + return TRUE /obj/item/rsf/cookiesynth/attack_self(mob/user) var/mob/living/silicon/robot/P = null diff --git a/code/game/objects/items/rcd/RTD.dm b/code/game/objects/items/rcd/RTD.dm index 9141e77ae95a5..baa3b8eb47b3a 100644 --- a/code/game/objects/items/rcd/RTD.dm +++ b/code/game/objects/items/rcd/RTD.dm @@ -23,7 +23,7 @@ slot_flags = ITEM_SLOT_BELT item_flags = NO_MAT_REDEMPTION | NOBLUDGEON has_ammobar = TRUE - banned_upgrades = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING + banned_upgrades = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING | RCD_UPGRADE_ANTI_INTERRUPT | RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN /// main category for tile design var/root_category = "Conventional" @@ -91,9 +91,9 @@ selected_direction = direction /** - * retrive the icon for this tile design based on its direction + * retrieve the icon for this tile design based on its direction * for complex directions like NORTHSOUTH etc we create an seperated blended icon in the asset file for example floor-northsouth - * so we check which icons we want to retrive based on its direction + * so we check which icons we want to retrieve based on its direction * for basic directions its rotated with CSS so there is no need for icon */ /datum/tile_info/proc/get_icon_state() @@ -110,7 +110,7 @@ /** * Stores the decal & overlays on the floor to preserve texture of the design - * in short its just an wrapper for mutable appearance where we retrive the nessassary information + * in short its just an wrapper for mutable appearance where we retrieve the nessassary information * to recreate an mutable appearance */ /datum/overlay_info diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm index d2294a6fca9b5..b40a81f3642c3 100644 --- a/code/game/objects/items/religion.dm +++ b/code/game/objects/items/religion.dm @@ -24,7 +24,7 @@ . += span_notice("Activate it in your hand to inspire nearby allies of this banner's allegiance!") /obj/item/banner/attack_self(mob/living/carbon/human/user) - if(!inspiration_available) + if(!inspiration_available || flags_1 & HOLOGRAM_1) return if(morale_time > world.time) to_chat(user, span_warning("You aren't feeling inspired enough to flourish [src] again yet.")) @@ -64,15 +64,18 @@ /obj/item/banner/proc/check_inspiration(mob/living/carbon/human/H) //Banner-specific conditions for being eligible return -/obj/item/banner/proc/inspiration(mob/living/carbon/human/H) - H.adjustBruteLoss(-15) - H.adjustFireLoss(-15) - H.AdjustStun(-40) - H.AdjustKnockdown(-40) - H.AdjustImmobilized(-40) - H.AdjustParalyzed(-40) - H.AdjustUnconscious(-40) - playsound(H, 'sound/magic/staff_healing.ogg', 25, FALSE) +/obj/item/banner/proc/inspiration(mob/living/carbon/human/inspired_human) + var/need_mob_update = FALSE + need_mob_update += inspired_human.adjustBruteLoss(-15, updating_health = FALSE) + need_mob_update += inspired_human.adjustFireLoss(-15, updating_health = FALSE) + if(need_mob_update) + inspired_human.updatehealth() + inspired_human.AdjustStun(-40) + inspired_human.AdjustKnockdown(-40) + inspired_human.AdjustImmobilized(-40) + inspired_human.AdjustParalyzed(-40) + inspired_human.AdjustUnconscious(-40) + playsound(inspired_human, 'sound/magic/staff_healing.ogg', 25, FALSE) /obj/item/banner/proc/special_inspiration(mob/living/carbon/human/H) //Any banner-specific inspiration effects go here return @@ -128,10 +131,13 @@ /obj/item/clothing/under/rank/medical/doctor = 1) category = CAT_MISC -/obj/item/banner/medical/special_inspiration(mob/living/carbon/human/H) - H.adjustToxLoss(-15) - H.setOxyLoss(0) - H.reagents.add_reagent(/datum/reagent/medicine/inaprovaline, 5) +/obj/item/banner/medical/special_inspiration(mob/living/carbon/human/inspired_human) + var/need_mob_update = FALSE + need_mob_update += inspired_human.adjustToxLoss(-15, updating_health = FALSE) + need_mob_update += inspired_human.setOxyLoss(0, updating_health = FALSE) + if(need_mob_update) + inspired_human.updatehealth() + inspired_human.reagents.add_reagent(/datum/reagent/medicine/inaprovaline, 5) /obj/item/banner/science name = "sciencia banner" diff --git a/code/game/objects/items/robot/ai_upgrades.dm b/code/game/objects/items/robot/ai_upgrades.dm index 6873b838ebde2..f0cbb121eeb03 100644 --- a/code/game/objects/items/robot/ai_upgrades.dm +++ b/code/game/objects/items/robot/ai_upgrades.dm @@ -5,7 +5,7 @@ /obj/item/malf_upgrade name = "combat software upgrade" desc = "A highly illegal, highly dangerous upgrade for artificial intelligence units, granting them a variety of powers as well as the ability to hack APCs.
This upgrade does not override any active laws, and must be applied directly to an active AI core." - icon = 'icons/obj/module.dmi' + icon = 'icons/obj/assemblies/module.dmi' icon_state = "datadisk3" @@ -34,7 +34,7 @@ /obj/item/surveillance_upgrade name = "surveillance software upgrade" desc = "An illegal software package that will allow an artificial intelligence to 'hear' from its cameras via lip reading and hidden microphones." - icon = 'icons/obj/module.dmi' + icon = 'icons/obj/assemblies/module.dmi' icon_state = "datadisk3" /obj/item/surveillance_upgrade/pre_attack(atom/A, mob/living/user, proximity) diff --git a/code/game/objects/items/robot/items/food.dm b/code/game/objects/items/robot/items/food.dm index 9532e8e93af61..a747f813ace86 100644 --- a/code/game/objects/items/robot/items/food.dm +++ b/code/game/objects/items/robot/items/food.dm @@ -60,7 +60,10 @@ if(DISPENSE_LOLLIPOP_MODE) food_item = new /obj/item/food/lollipop/cyborg(turf_to_dispense_to) if(DISPENSE_ICECREAM_MODE) - food_item = new /obj/item/food/icecream(turf_to_dispense_to, list(ICE_CREAM_VANILLA)) + food_item = new /obj/item/food/icecream( + loc = turf_to_dispense_to, + prefill_flavours = list(ICE_CREAM_VANILLA), + ) food_item.desc = "Eat the ice cream." var/into_hands = FALSE @@ -86,12 +89,12 @@ return FALSE candy-- - var/obj/item/ammo_casing/caseless/lollipop/lollipop + var/obj/item/ammo_casing/lollipop/lollipop var/mob/living/silicon/robot/robot_user = user if(istype(robot_user) && robot_user.emagged) - lollipop = new /obj/item/ammo_casing/caseless/lollipop/harmful(src) + lollipop = new /obj/item/ammo_casing/lollipop/harmful(src) else - lollipop = new /obj/item/ammo_casing/caseless/lollipop(src) + lollipop = new /obj/item/ammo_casing/lollipop(src) playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) lollipop.fire_casing(target, user, params, 0, 0, null, 0, src) @@ -104,12 +107,12 @@ to_chat(user, span_warning("Not enough gumballs left!")) return FALSE candy-- - var/obj/item/ammo_casing/caseless/gumball/gumball + var/obj/item/ammo_casing/gumball/gumball var/mob/living/silicon/robot/robot_user = user if(istype(robot_user) && robot_user.emagged) - gumball = new /obj/item/ammo_casing/caseless/gumball/harmful(src) + gumball = new /obj/item/ammo_casing/gumball/harmful(src) else - gumball = new /obj/item/ammo_casing/caseless/gumball(src) + gumball = new /obj/item/ammo_casing/gumball(src) gumball.loaded_projectile.color = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) playsound(src.loc, 'sound/weapons/bulletflyby3.ogg', 50, TRUE) @@ -151,52 +154,62 @@ to_chat(user, span_notice("Module is now dispensing lollipops.")) ..() -/obj/item/ammo_casing/caseless/gumball +/obj/item/ammo_casing/gumball name = "Gumball" desc = "Why are you seeing this?!" - projectile_type = /obj/projectile/bullet/reusable/gumball + projectile_type = /obj/projectile/bullet/gumball click_cooldown_override = 2 -/obj/item/ammo_casing/caseless/gumball/harmful - projectile_type = /obj/projectile/bullet/reusable/gumball/harmful +/obj/item/ammo_casing/gumball/Initialize(mapload) + . = ..() + AddElement(/datum/element/caseless) -/obj/projectile/bullet/reusable/gumball +/obj/item/ammo_casing/gumball/harmful + projectile_type = /obj/projectile/bullet/gumball/harmful + +/obj/projectile/bullet/gumball name = "gumball" desc = "Oh noes! A fast-moving gumball!" icon_state = "gumball" - ammo_type = /obj/item/food/gumball damage = 0 speed = 0.5 + embedding = null + +/obj/projectile/bullet/gumball/Initialize(mapload) + . = ..() + AddElement(/datum/element/projectile_drop, /obj/item/food/gumball) + RegisterSignal(src, COMSIG_PROJECTILE_ON_SPAWN_DROP, PROC_REF(handle_drop)) -/obj/projectile/bullet/reusable/gumball/harmful +/obj/projectile/bullet/gumball/harmful damage = 10 -/obj/projectile/bullet/reusable/gumball/handle_drop() - if(!dropped) - var/turf/turf = get_turf(src) - var/obj/item/food/gumball/gumball = new ammo_type(turf) - gumball.color = color - dropped = TRUE +/obj/projectile/bullet/gumball/proc/handle_drop(datum/source, obj/item/food/gumball/gumball) + SIGNAL_HANDLER + gumball.color = color -/obj/item/ammo_casing/caseless/lollipop //NEEDS RANDOMIZED COLOR LOGIC. +/obj/item/ammo_casing/lollipop //NEEDS RANDOMIZED COLOR LOGIC. name = "Lollipop" desc = "Why are you seeing this?!" - projectile_type = /obj/projectile/bullet/reusable/lollipop + projectile_type = /obj/projectile/bullet/lollipop click_cooldown_override = 2 -/obj/item/ammo_casing/caseless/lollipop/harmful - projectile_type = /obj/projectile/bullet/reusable/lollipop/harmful +/obj/item/ammo_casing/lollipop/Initialize(mapload) + . = ..() + AddElement(/datum/element/caseless) + +/obj/item/ammo_casing/lollipop/harmful + projectile_type = /obj/projectile/bullet/lollipop/harmful -/obj/projectile/bullet/reusable/lollipop +/obj/projectile/bullet/lollipop name = "lollipop" desc = "Oh noes! A fast-moving lollipop!" icon_state = "lollipop_1" - ammo_type = /obj/item/food/lollipop/cyborg damage = 0 speed = 0.5 - var/color2 = rgb(0, 0, 0) + embedding = null + var/head_color -/obj/projectile/bullet/reusable/lollipop/harmful +/obj/projectile/bullet/lollipop/harmful embedding = list( embed_chance = 35, fall_chance = 2, @@ -207,24 +220,49 @@ rip_time = 10, ) damage = 10 + shrapnel_type = /obj/item/food/lollipop/cyborg embed_falloff_tile = 0 -/obj/projectile/bullet/reusable/lollipop/Initialize(mapload) - var/obj/item/food/lollipop/lollipop = new ammo_type(src) - color2 = lollipop.head_color +/obj/projectile/bullet/lollipop/Initialize(mapload) + . = ..() var/mutable_appearance/head = mutable_appearance('icons/obj/weapons/guns/projectiles.dmi', "lollipop_2") - head.color = color2 + head.color = head_color = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) add_overlay(head) - return ..() + if(!embedding) + AddElement(/datum/element/projectile_drop, /obj/item/food/lollipop/cyborg) + RegisterSignals(src, list(COMSIG_PROJECTILE_ON_SPAWN_DROP, COMSIG_PROJECTILE_ON_SPAWN_EMBEDDED), PROC_REF(handle_drop)) -/obj/projectile/bullet/reusable/lollipop/handle_drop() - if(!dropped) - var/turf/turf = get_turf(src) - var/obj/item/food/lollipop/lollipop = new ammo_type(turf) - lollipop.change_head_color(color2) - dropped = TRUE +/obj/projectile/bullet/lollipop/proc/handle_drop(datum/source, obj/item/food/lollipop/lollipop) + SIGNAL_HANDLER + lollipop.change_head_color(head_color) #undef DISPENSE_LOLLIPOP_MODE #undef THROW_LOLLIPOP_MODE #undef THROW_GUMBALL_MODE #undef DISPENSE_ICECREAM_MODE + +/obj/item/borg/cookbook + name = "Codex Cibus Mechanicus" + desc = "It's a robot cookbook!" + icon = 'icons/obj/service/library.dmi' + icon_state = "cooked_book" + item_flags = NOBLUDGEON + var/datum/component/personal_crafting/cooking + +/obj/item/borg/cookbook/Initialize(mapload) + . = ..() + cooking = AddComponent(/datum/component/personal_crafting) + cooking.forced_mode = TRUE + cooking.mode = TRUE + +/obj/item/borg/cookbook/attack_self(mob/user, modifiers) + . = ..() + cooking.ui_interact(user) + +/obj/item/borg/cookbook/dropped(mob/user, silent) + SStgui.close_uis(cooking) + return ..() + +/obj/item/borg/cookbook/cyborg_unequip(mob/user) + SStgui.close_uis(cooking) + return ..() diff --git a/code/game/objects/items/robot/items/generic.dm b/code/game/objects/items/robot/items/generic.dm index ceda2a27cd68a..4db09ab3804a6 100644 --- a/code/game/objects/items/robot/items/generic.dm +++ b/code/game/objects/items/robot/items/generic.dm @@ -15,10 +15,17 @@ /obj/item/borg/stun name = "electrically-charged arm" icon_state = "elecarm" + var/stamina_damage = 60 //Same as normal batong /// Cost to use the stun arm - var/charge_cost = 1000 + var/charge_cost = 200 + var/cooldown_check = 0 + /// cooldown between attacks + var/cooldown = 4 SECONDS // same as baton /obj/item/borg/stun/attack(mob/living/attacked_mob, mob/living/user) + if(cooldown_check > world.time) + user.balloon_alert(user, "still recharging!") + return if(ishuman(attacked_mob)) var/mob/living/carbon/human/human = attacked_mob if(human.check_shields(src, 0, "[attacked_mob]'s [name]", MELEE_ATTACK)) @@ -30,14 +37,20 @@ return user.do_attack_animation(attacked_mob) - attacked_mob.Paralyze(100) - attacked_mob.adjust_stutter(10 SECONDS) - - attacked_mob.visible_message(span_danger("[user] prods [attacked_mob] with [src]!"), \ + attacked_mob.adjustStaminaLoss(stamina_damage) + attacked_mob.set_confusion_if_lower(5 SECONDS) + attacked_mob.adjust_stutter(20 SECONDS) + attacked_mob.set_jitter_if_lower(5 SECONDS) + if(issilicon(attacked_mob)) + attacked_mob.emp_act(EMP_HEAVY) + attacked_mob.visible_message(span_danger("[user] shocks [attacked_mob] with [src]!"), \ + span_userdanger("[user] shocks you with [src]!")) + else + attacked_mob.visible_message(span_danger("[user] prods [attacked_mob] with [src]!"), \ span_userdanger("[user] prods you with [src]!")) playsound(loc, 'sound/weapons/egloves.ogg', 50, TRUE, -1) - + cooldown_check = world.time + cooldown log_combat(user, attacked_mob, "stunned", src, "(Combat mode: [user.combat_mode ? "On" : "Off"])") /obj/item/borg/cyborghug @@ -129,7 +142,9 @@ if (!COOLDOWN_FINISHED(src, shock_cooldown)) return if(ishuman(attacked_mob)) - attacked_mob.electrocute_act(5, "[user]", flags = SHOCK_NOGLOVES) + attacked_mob.electrocute_act(5, "[user]", flags = SHOCK_NOGLOVES | SHOCK_NOSTUN) + attacked_mob.dropItemToGround(attacked_mob.get_active_held_item()) + attacked_mob.dropItemToGround(attacked_mob.get_inactive_held_item()) user.visible_message(span_userdanger("[user] electrocutes [attacked_mob] with [user.p_their()] touch!"), \ span_danger("You electrocute [attacked_mob] with your touch!")) else @@ -298,12 +313,13 @@ /// Harm alarm cooldown COOLDOWN_DECLARE(alarm_cooldown) -/obj/item/harmalarm/emag_act(mob/user) +/obj/item/harmalarm/emag_act(mob/user, obj/item/card/emag/emag_card) obj_flags ^= EMAGGED if(obj_flags & EMAGGED) - to_chat(user, "You short out the safeties on [src]!") + balloon_alert(user, "safeties shorted") else - to_chat(user, "You reset the safeties on [src]!") + balloon_alert(user, "safeties reset") + return TRUE /obj/item/harmalarm/attack_self(mob/user) var/safety = !(obj_flags & EMAGGED) diff --git a/code/game/objects/items/robot/items/hypo.dm b/code/game/objects/items/robot/items/hypo.dm index 1631c64f7d189..cd70d4b13d4e9 100644 --- a/code/game/objects/items/robot/items/hypo.dm +++ b/code/game/objects/items/robot/items/hypo.dm @@ -73,7 +73,7 @@ /datum/reagent/consumable/blackpepper,\ /datum/reagent/consumable/coco,\ /datum/reagent/consumable/cornmeal,\ - /datum/reagent/consumable/cornoil,\ + /datum/reagent/consumable/nutriment/fat/oil,\ /datum/reagent/consumable/corn_starch,\ /datum/reagent/consumable/eggwhite,\ /datum/reagent/consumable/eggyolk,\ @@ -190,7 +190,7 @@ to_chat(user, span_notice("You inject [injectee] with the injector ([selected_reagent.name]).")) if(injectee.reagents) - hypospray_injector.trans_to(injectee, amount_per_transfer_from_this, transfered_by = user, methods = INJECT) + hypospray_injector.trans_to(injectee, amount_per_transfer_from_this, transferred_by = user, methods = INJECT) balloon_alert(user, "[amount_per_transfer_from_this] unit\s injected") log_combat(user, injectee, "injected", src, "(CHEMICALS: [selected_reagent])") else @@ -382,10 +382,10 @@ stored_reagents.remove_reagent(selected_reagent.type, amount_per_transfer_from_this) shaker.add_reagent(selected_reagent.type, amount_per_transfer_from_this, reagtemp = dispensed_temperature, no_react = TRUE) - shaker.trans_to(target, amount_per_transfer_from_this, transfered_by = user) + shaker.trans_to(target, amount_per_transfer_from_this, transferred_by = user) balloon_alert(user, "[amount_per_transfer_from_this] unit\s poured") return . - + /obj/item/reagent_containers/borghypo/condiment_synthesizer // Solids! Condiments! The borger uprising! name = "Condiment Synthesizer" desc = "An advanced condiment synthesizer" @@ -395,7 +395,7 @@ // Lots of reagents all regenerating at once, so the charge cost is lower. They also regenerate faster. charge_cost = 40 //Costs double the power of the borgshaker due to synthesizing solids recharge_time = 6 //Double the recharge time too, for the same reason. - dispensed_temperature = WATER_MATTERSTATE_CHANGE_TEMP + dispensed_temperature = WATER_MATTERSTATE_CHANGE_TEMP default_reagent_types = EXPANDED_SERVICE_REAGENTS /obj/item/reagent_containers/borghypo/condiment_synthesizer/ui_interact(mob/user, datum/tgui/ui) @@ -421,9 +421,9 @@ data["reagents"] = condiments data["selectedReagent"] = selected_reagent?.name return data - + /obj/item/reagent_containers/borghypo/condiment_synthesizer/attack(mob/M, mob/user) - return + return /obj/item/reagent_containers/borghypo/condiment_synthesizer/afterattack(obj/target, mob/user, proximity) . = ..() @@ -446,9 +446,9 @@ var/datum/reagents/shaker = new() stored_reagents.remove_reagent(selected_reagent.type, amount_per_transfer_from_this) shaker.add_reagent(selected_reagent.type, amount_per_transfer_from_this, reagtemp = dispensed_temperature, no_react = TRUE) - shaker.trans_to(target, amount_per_transfer_from_this, transfered_by = user) + shaker.trans_to(target, amount_per_transfer_from_this, transferred_by = user) balloon_alert(user, "[amount_per_transfer_from_this] unit\s poured") - + /obj/item/reagent_containers/borghypo/borgshaker/hacked name = "cyborg shaker" diff --git a/code/game/objects/items/robot/items/storage.dm b/code/game/objects/items/robot/items/storage.dm index 54793794d6bdb..4995c7d9df606 100644 --- a/code/game/objects/items/robot/items/storage.dm +++ b/code/game/objects/items/robot/items/storage.dm @@ -57,21 +57,23 @@ /obj/item/borg/apparatus/pre_attack(atom/atom, mob/living/user, params) if(!stored) - var/itemcheck = FALSE - for(var/storable_type in storable) - if(istype(atom, storable_type)) - itemcheck = TRUE - break - if(itemcheck) - var/obj/item/item = atom - item.forceMove(src) - stored = item - RegisterSignal(stored, COMSIG_ATOM_UPDATED_ICON, PROC_REF(on_stored_updated_icon)) - update_appearance() - return + // Borgs should not be grabbing their own modules + if(!istype(atom.loc, /mob/living/silicon/robot)) + var/itemcheck = FALSE + for(var/storable_type in storable) + if(istype(atom, storable_type)) + itemcheck = TRUE + break + if(itemcheck) + var/obj/item/item = atom + item.forceMove(src) + stored = item + RegisterSignal(stored, COMSIG_ATOM_UPDATED_ICON, PROC_REF(on_stored_updated_icon)) + update_appearance() + return TRUE else stored.melee_attack_chain(user, atom, params) - return + return TRUE return ..() /** @@ -93,10 +95,13 @@ /obj/item/borg/apparatus/beaker name = "beaker storage apparatus" - desc = "A special apparatus for carrying beakers without spilling the contents." + desc = "A special apparatus for carrying beakers, bottles, and test tubes without spilling their contents." icon_state = "borg_beaker_apparatus" - storable = list(/obj/item/reagent_containers/cup/beaker, - /obj/item/reagent_containers/cup/bottle) + storable = list( + /obj/item/reagent_containers/cup/beaker, + /obj/item/reagent_containers/cup/bottle, + /obj/item/reagent_containers/cup/tube, + ) /obj/item/borg/apparatus/beaker/Initialize(mapload) add_glass() @@ -159,10 +164,14 @@ /obj/item/borg/apparatus/beaker/service name = "beverage storage apparatus" - desc = "A special apparatus for carrying drinks without spilling the contents. Will resynthesize any drinks you pour out!" + desc = "A special apparatus for carrying drinks and condiment packets without spilling their contents. Will resynthesize any drinks (or other nutritional liquids) you pour out of glasses!" icon_state = "borg_beaker_apparatus" - storable = list(/obj/item/reagent_containers/cup/glass, - /obj/item/reagent_containers/condiment) + storable = list( + /obj/item/reagent_containers/cup/glass, + /obj/item/reagent_containers/condiment, + /obj/item/reagent_containers/cup/coffeepot, + /obj/item/reagent_containers/cup/bottle/syrup_bottle, + ) /obj/item/borg/apparatus/beaker/service/add_glass() stored = new /obj/item/reagent_containers/cup/glass/drinkingglass(src) @@ -183,6 +192,21 @@ handle_reflling(arrived) return ..() +///Used by the service borg drink apparatus upgrade, holds drink-related items +/obj/item/borg/apparatus/beaker/drink + name = "secondary beverage storage apparatus" + desc = "A special apparatus for carrying drinks and condiment packets without spilling their contents. Will NOT resynthesize drinks unlike your standard apparatus." + icon_state = "borg_beaker_apparatus" + storable = list( + /obj/item/reagent_containers/cup/glass, + /obj/item/reagent_containers/condiment, + /obj/item/reagent_containers/cup/coffeepot, + /obj/item/reagent_containers/cup/bottle/syrup_bottle, + ) + +/obj/item/borg/apparatus/beaker/service2/add_glass() + stored = new /obj/item/reagent_containers/cup/glass/drinkingglass(src) + /// allows medical cyborgs to manipulate organs without hands /obj/item/borg/apparatus/organ_storage name = "organ storage bag" @@ -302,7 +326,7 @@ return ..() /obj/item/borg/apparatus/service - name = "Service apparatus" + name = "service apparatus" desc = "A special apparatus for carrying food, bowls, plates, oven trays, soup pots and paper." icon_state = "borg_service_apparatus" storable = list( diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 66bffa7a0e2e3..c42145ff2a746 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -21,8 +21,13 @@ var/obj/item/bodypart/head/robot/head = null /// Forced name of the cyborg var/created_name = "" + /// Forced master AI of the cyborg var/mob/living/silicon/ai/forced_ai + /// The name of the AI being forced, tracked separately to above + /// so we can reference handle without worrying about making "AI got gibbed" detectors + var/forced_ai_name + /// If the cyborg starts movement free and not under lockdown var/locomotion = TRUE /// If the cyborg synchronizes it's laws with it's master AI @@ -36,6 +41,30 @@ . = ..() update_appearance() +/obj/item/robot_suit/Destroy() + QDEL_NULL(l_arm) + QDEL_NULL(r_arm) + QDEL_NULL(l_leg) + QDEL_NULL(r_leg) + QDEL_NULL(chest) + QDEL_NULL(head) + return ..() + +/obj/item/robot_suit/Exited(atom/movable/gone, direction) + . = ..() + if(gone == l_arm) + l_arm = null + if(gone == r_arm) + r_arm = null + if(gone == l_leg) + l_leg = null + if(gone == r_leg) + r_leg = null + if(gone == chest) + chest = null + if(gone == head) + head = null + /obj/item/robot_suit/prebuilt/Initialize(mapload) . = ..() l_arm = new(src) @@ -76,38 +105,31 @@ var/turf/T = get_turf(src) if(l_leg || r_leg || chest || l_arm || r_arm || head) if(I.use_tool(src, user, 5, volume=50)) - if(l_leg) - l_leg.forceMove(T) - l_leg = null - if(r_leg) - r_leg.forceMove(T) - r_leg = null - if(chest) - if (chest.cell) //Sanity check. - chest.cell.forceMove(T) - chest.cell = null - chest.forceMove(T) - new /obj/item/stack/cable_coil(T, 1) - chest.wired = FALSE - chest = null - if(l_arm) - l_arm.forceMove(T) - l_arm = null - if(r_arm) - r_arm.forceMove(T) - r_arm = null - if(head) - head.forceMove(T) - head.flash1.forceMove(T) - head.flash1 = null - head.flash2.forceMove(T) - head.flash2 = null - head = null + drop_all_parts(T) to_chat(user, span_notice("You disassemble the cyborg shell.")) else to_chat(user, span_warning("There is nothing to remove from the endoskeleton!")) update_appearance() +/// Drops all included parts to the passed location +/// This will also dissassemble the parts being dropped into components as well +/obj/item/robot_suit/proc/drop_all_parts(atom/drop_to = drop_location()) + l_leg?.forceMove(drop_to) + r_leg?.forceMove(drop_to) + l_arm?.forceMove(drop_to) + r_arm?.forceMove(drop_to) + + if(chest) + chest.forceMove(drop_to) + new /obj/item/stack/cable_coil(drop_to, 1) + chest.wired = FALSE + chest.cell?.forceMove(drop_to) + + if(head) + head.flash1?.forceMove(drop_to) + head.flash2?.forceMove(drop_to) + head.forceMove(drop_to) + /obj/item/robot_suit/proc/put_in_hand_or_drop(mob/living/user, obj/item/I) //normal put_in_hands() drops the item ontop of the player, this drops it at the suit's loc if(!user.put_in_hands(I)) I.forceMove(drop_location()) @@ -124,7 +146,7 @@ return var/obj/item/stock_parts/cell/temp_cell = user.is_holding_item_of_type(/obj/item/stock_parts/cell) - var/swap_failed + var/swap_failed = FALSE if(!temp_cell) //if we're not holding a cell swap_failed = TRUE else if(!user.transferItemToLoc(temp_cell, chest)) @@ -292,10 +314,9 @@ O.cell = chest.cell chest.cell.forceMove(O) - chest.cell = null + W.forceMove(O)//Should fix cybros run time erroring when blown up. It got deleted before, along with the frame. - if(O.mmi) //we delete the mmi created by robot/New() - qdel(O.mmi) + QDEL_NULL(O.mmi) //we delete the mmi created by robot/New() O.mmi = W //and give the real mmi to the borg. O.updatename(brainmob.client) // This canonizes that MMI'd cyborgs have memories of their previous life @@ -347,7 +368,7 @@ O.cell = chest.cell chest.cell.forceMove(O) - chest.cell = null + O.locked = panel_locked O.job = JOB_CYBORG forceMove(O) @@ -384,7 +405,7 @@ data["locomotion"] = locomotion data["panel"] = panel_locked data["aisync"] = aisync - data["master"] = forced_ai ? forced_ai.name : null + data["master"] = forced_ai_name data["lawsync"] = lawsync return data @@ -417,16 +438,47 @@ log_silicon("[key_name(user)] has [aisync ? "enabled" : "disabled"] the AI sync for a cyborg shell at [loc_name(user)]") return TRUE if("set_ai") - var/selected_ai = select_active_ai(user, z) - if(!in_range(src, user) && loc != user) - return - if(!selected_ai) + if(length(active_ais(check_mind = FALSE, z = z)) <= 0) to_chat(user, span_alert("No active AIs detected.")) return - forced_ai = selected_ai + + var/selected_ai = select_active_ai(user, z) // this one runs input() + if(!in_range(src, user) && loc != user) + return + if(!selected_ai) // null = clear + clear_forced_ai() + return TRUE + if(forced_ai == selected_ai) // same AI = clear + clear_forced_ai() + to_chat(user, span_notice("You reset [src]'s AI setting.")) + return TRUE + + set_forced_ai(selected_ai, user) + to_chat(user, span_notice("You set [src]'s AI setting to [forced_ai_name].")) log_silicon("[key_name(user)] set the default AI for a cyborg shell to [key_name(selected_ai)] at [loc_name(user)]") return TRUE + if("lawsync") lawsync = !lawsync log_silicon("[key_name(user)] has [lawsync ? "enabled" : "disabled"] the law sync for a cyborg shell at [loc_name(user)]") return TRUE + +/// Sets [forced_ai] and [forced_ai_name] to the passed AI +/obj/item/robot_suit/proc/set_forced_ai(mob/living/silicon/ai/ai) + forced_ai = ai + forced_ai_name = ai.name + RegisterSignal(ai, COMSIG_QDELETING, PROC_REF(ai_die)) + +/// Clears [forced_ai] and [forced_ai_name] +/obj/item/robot_suit/proc/clear_forced_ai() + if(forced_ai) + UnregisterSignal(forced_ai, COMSIG_QDELETING) + forced_ai = null + forced_ai_name = null + +/// Clears the forced_ai ref +/obj/item/robot_suit/proc/ai_die(datum/source) + SIGNAL_HANDLER + // Does not use [proc/clear_forced_ai] because we'd like to keep the AI name tracked for metagaming purposes + UnregisterSignal(forced_ai, COMSIG_QDELETING) + forced_ai = null diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 4deb6aeb58afd..89a70eaadcc02 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -4,7 +4,7 @@ /obj/item/borg/upgrade name = "borg upgrade module." desc = "Protected by FRM." - icon = 'icons/obj/module.dmi' + icon = 'icons/obj/assemblies/module.dmi' icon_state = "cyborg_upgrade" w_class = WEIGHT_CLASS_SMALL var/locked = FALSE @@ -267,9 +267,9 @@ /obj/item/borg/upgrade/lavaproof name = "mining cyborg lavaproof chassis" - desc = "An upgrade kit to apply specialized coolant systems and insulation layers to a mining cyborg's chassis, enabling them to withstand exposure to molten rock." + desc = "An upgrade kit to apply specialized coolant systems and insulation layers to a mining cyborg's chassis, enabling them to withstand exposure to molten rock and liquid plasma." icon_state = "ash_plating" - resistance_flags = LAVA_PROOF | FIRE_PROOF + resistance_flags = LAVA_PROOF | FIRE_PROOF | FREEZE_PROOF require_model = TRUE model_type = list(/obj/item/robot_model/miner) model_flags = BORG_MODEL_MINER @@ -277,12 +277,12 @@ /obj/item/borg/upgrade/lavaproof/action(mob/living/silicon/robot/R, user = usr) . = ..() if(.) - ADD_TRAIT(R, TRAIT_LAVA_IMMUNE, type) + R.add_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_SNOWSTORM_IMMUNE), type) /obj/item/borg/upgrade/lavaproof/deactivate(mob/living/silicon/robot/R, user = usr) . = ..() if (.) - REMOVE_TRAIT(R, TRAIT_LAVA_IMMUNE, type) + R.remove_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_SNOWSTORM_IMMUNE), type) /obj/item/borg/upgrade/selfrepair name = "self-repair module" @@ -545,29 +545,30 @@ /obj/item/borg/upgrade/expand/action(mob/living/silicon/robot/robot, user = usr) . = ..() - if(.) + if(!. || HAS_TRAIT(robot, TRAIT_NO_TRANSFORM)) + return FALSE - if(robot.hasExpanded) - to_chat(usr, span_warning("This unit already has an expand module installed!")) - return FALSE + if(robot.hasExpanded) + to_chat(usr, span_warning("This unit already has an expand module installed!")) + return FALSE - robot.notransform = TRUE - var/prev_lockcharge = robot.lockcharge - robot.SetLockdown(TRUE) - robot.set_anchored(TRUE) - var/datum/effect_system/fluid_spread/smoke/smoke = new - smoke.set_up(1, holder = robot, location = robot.loc) - smoke.start() - sleep(0.2 SECONDS) - for(var/i in 1 to 4) - playsound(robot, pick('sound/items/drill_use.ogg', 'sound/items/jaws_cut.ogg', 'sound/items/jaws_pry.ogg', 'sound/items/welder.ogg', 'sound/items/ratchet.ogg'), 80, TRUE, -1) - sleep(1.2 SECONDS) - if(!prev_lockcharge) - robot.SetLockdown(FALSE) - robot.set_anchored(FALSE) - robot.notransform = FALSE - robot.hasExpanded = TRUE - robot.update_transform(2) + ADD_TRAIT(robot, TRAIT_NO_TRANSFORM, REF(src)) + var/prev_lockcharge = robot.lockcharge + robot.SetLockdown(TRUE) + robot.set_anchored(TRUE) + var/datum/effect_system/fluid_spread/smoke/smoke = new + smoke.set_up(1, holder = robot, location = robot.loc) + smoke.start() + sleep(0.2 SECONDS) + for(var/i in 1 to 4) + playsound(robot, pick('sound/items/drill_use.ogg', 'sound/items/jaws_cut.ogg', 'sound/items/jaws_pry.ogg', 'sound/items/welder.ogg', 'sound/items/ratchet.ogg'), 80, TRUE, -1) + sleep(1.2 SECONDS) + if(!prev_lockcharge) + robot.SetLockdown(FALSE) + robot.set_anchored(FALSE) + REMOVE_TRAIT(robot, TRAIT_NO_TRANSFORM, REF(src)) + robot.hasExpanded = TRUE + robot.update_transform(2) /obj/item/borg/upgrade/expand/deactivate(mob/living/silicon/robot/R, user = usr) . = ..() @@ -721,6 +722,33 @@ if (E) R.model.remove_module(E, TRUE) +/obj/item/borg/upgrade/drink_app + name = "glass storage apparatus" + desc = "A supplementary drinking glass storage apparatus for service cyborgs." + icon_state = "cyborg_upgrade3" + require_model = TRUE + model_type = list(/obj/item/robot_model/service) + model_flags = BORG_MODEL_SERVICE + +/obj/item/borg/upgrade/drink_app/action(mob/living/silicon/robot/R, user = usr) + . = ..() + if(.) + var/obj/item/borg/apparatus/beaker/drink/E = locate() in R.model.modules + if(E) + to_chat(user, span_warning("This unit has no room for additional drink storage!")) + return FALSE + + E = new(R.model) + R.model.basic_modules += E + R.model.add_module(E, FALSE, TRUE) + +/obj/item/borg/upgrade/drink_app/deactivate(mob/living/silicon/robot/R, user = usr) + . = ..() + if (.) + var/obj/item/borg/apparatus/beaker/drink/E = locate() in R.model.modules + if (E) + R.model.remove_module(E, TRUE) + /obj/item/borg/upgrade/broomer name = "experimental push broom" desc = "An experimental push broom used for efficiently pushing refuse." @@ -861,13 +889,41 @@ if (rtable) install.model.remove_module(rtable, TRUE) +/obj/item/borg/upgrade/service_cookbook + name = "Service Cyborg Cookbook" + desc = "An upgrade to the service model cyborg, that lets them create more foods." + icon_state = "cyborg_upgrade3" + require_model = TRUE + model_type = list(/obj/item/robot_model/service) + model_flags = BORG_MODEL_SERVICE + +/obj/item/borg/upgrade/service_cookbook/action(mob/living/silicon/robot/install, user = usr) + . = ..() + if(!.) + return FALSE + var/obj/item/borg/cookbook/book = locate() in install.model.modules + if(book) + install.balloon_alert_to_viewers("already installed!") + return FALSE + book = new(install.model) + install.model.basic_modules += book + install.model.add_module(book, FALSE, TRUE) + +/obj/item/borg/upgrade/service_cookbook/deactivate(mob/living/silicon/robot/install, user = usr) + . = ..() + if (!.) + return FALSE + var/obj/item/borg/cookbook/book = locate() in install.model.modules + if(book) + install.model.remove_module(book, TRUE) + ///This isn't an upgrade or part of the same path, but I'm gonna just stick it here because it's a tool used on cyborgs. //A reusable tool that can bring borgs back to life. They gotta be repaired first, though. /obj/item/borg_restart_board name = "cyborg emergency reboot module" desc = "A reusable firmware reset tool that can force a reboot of a disabled-but-repaired cyborg, bringing it back online." w_class = WEIGHT_CLASS_SMALL - icon = 'icons/obj/module.dmi' + icon = 'icons/obj/assemblies/module.dmi' icon_state = "cyborg_upgrade1" /obj/item/borg_restart_board/pre_attack(mob/living/silicon/robot/borgo, mob/living/user, params) diff --git a/code/game/objects/items/scrolls.dm b/code/game/objects/items/scrolls.dm index c56a871880305..65d9000728d53 100644 --- a/code/game/objects/items/scrolls.dm +++ b/code/game/objects/items/scrolls.dm @@ -1,7 +1,7 @@ /obj/item/teleportation_scroll name = "scroll of teleportation" desc = "A scroll for moving around." - icon = 'icons/obj/wizard.dmi' + icon = 'icons/obj/scrolls.dmi' icon_state = "scroll" worn_icon_state = "scroll" w_class = WEIGHT_CLASS_SMALL diff --git a/code/game/objects/items/secret_documents.dm b/code/game/objects/items/secret_documents.dm index 8c5780b178503..92ad097aa8b7e 100644 --- a/code/game/objects/items/secret_documents.dm +++ b/code/game/objects/items/secret_documents.dm @@ -10,7 +10,7 @@ /obj/item/documents name = "secret documents" desc = "\"Top Secret\" documents." - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "docs_generic" inhand_icon_state = "paper" throwforce = 0 diff --git a/code/game/objects/items/sharpener.dm b/code/game/objects/items/sharpener.dm index 7bf30c780a012..a0f41574e4b47 100644 --- a/code/game/objects/items/sharpener.dm +++ b/code/game/objects/items/sharpener.dm @@ -8,7 +8,7 @@ */ /obj/item/sharpener name = "whetstone" - icon = 'icons/obj/kitchen.dmi' + icon = 'icons/obj/service/kitchen.dmi' icon_state = "sharpener" desc = "A block that makes things sharp." force = 5 diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index b06ea245dbdcd..27418a5e0a93c 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -111,6 +111,15 @@ shield_break_sound = 'sound/effects/glassbr3.ogg' shield_break_leftover = /obj/item/shard +/obj/item/shield/riot/Initialize(mapload) + . = ..() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/strobeshield) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/shield/riot/attackby(obj/item/attackby_item, mob/user, params) if(istype(attackby_item, /obj/item/melee/baton)) if(!COOLDOWN_FINISHED(src, baton_bash)) @@ -244,8 +253,6 @@ throw_speed = 3 breakable_by_damage = FALSE block_sound = 'sound/weapons/block_blade.ogg' - /// Whether the shield is currently extended and protecting the user. - var/enabled = FALSE /// Force of the shield when active. var/active_force = 10 /// Throwforce of the shield when active. @@ -257,19 +264,21 @@ /obj/item/shield/energy/Initialize(mapload) . = ..() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ force_on = active_force, \ throwforce_on = active_throwforce, \ throw_speed_on = active_throw_speed, \ hitsound_on = hitsound, \ - clumsy_check = !can_clumsy_use) + 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, damage_type = BRUTE) return FALSE /obj/item/shield/energy/IsReflect() - return enabled + return HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE) /* * Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM]. @@ -277,10 +286,9 @@ /obj/item/shield/energy/proc/on_transform(obj/item/source, mob/user, active) SIGNAL_HANDLER - enabled = active - - balloon_alert(user, "[active ? "activated":"deactivated"]") - playsound(user ? user : src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 35, TRUE) + if(user) + balloon_alert(user, active ? "activated" : "deactivated") + playsound(src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 35, TRUE) return COMPONENT_NO_DEFAULT_MESSAGE /obj/item/shield/riot/tele @@ -296,27 +304,28 @@ throw_speed = 3 throw_range = 4 w_class = WEIGHT_CLASS_NORMAL - /// Whether the shield is extended and protecting the user.. - var/extended = FALSE /obj/item/shield/riot/tele/Initialize(mapload) . = ..() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ force_on = 8, \ throwforce_on = 5, \ throw_speed_on = 2, \ hitsound_on = hitsound, \ w_class_on = WEIGHT_CLASS_BULKY, \ attack_verb_continuous_on = list("smacks", "strikes", "cracks", "beats"), \ - attack_verb_simple_on = list("smack", "strike", "crack", "beat")) + 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, damage_type = BRUTE) - if(extended) + if(HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) return ..() return FALSE -/* +/** * Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM]. * * Allows it to be placed on back slot when active. @@ -324,10 +333,10 @@ /obj/item/shield/riot/tele/proc/on_transform(obj/item/source, mob/user, active) SIGNAL_HANDLER - extended = active slot_flags = active ? ITEM_SLOT_BACK : null - playsound(user ? user : src, 'sound/weapons/batonextend.ogg', 50, TRUE) - balloon_alert(user, "[active ? "extended" : "collapsed"]") + if(user) + balloon_alert(user, active ? "extended" : "collapsed") + playsound(src, 'sound/weapons/batonextend.ogg', 50, TRUE) return COMPONENT_NO_DEFAULT_MESSAGE #undef BATON_BASH_COOLDOWN diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index 39ffdd85b252c..66df7997f66a2 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -1,7 +1,7 @@ /obj/item/target name = "shooting target" desc = "A shooting target." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/structures.dmi' icon_state = "target_h" density = FALSE var/hp = 1800 @@ -43,7 +43,7 @@ playsound(src.loc, 'sound/items/bikehorn.ogg', 50, TRUE) /obj/item/target/bullet_act(obj/projectile/P) - if(istype(P, /obj/projectile/bullet/reusable)) // If it's a foam dart, don't bother with any of this other shit + if(istype(P, /obj/projectile/bullet)) // If it's a foam dart, don't bother with any of this other shit return P.on_hit(src, 0) var/p_x = P.p_x + pick(0,0,0,0,0,-1,1) // really ugly way of coding "sometimes offset P.p_x!" var/p_y = P.p_y + pick(0,0,0,0,0,-1,1) diff --git a/code/game/objects/items/shrapnel.dm b/code/game/objects/items/shrapnel.dm index f0839543cb1c2..59fbf61f62a90 100644 --- a/code/game/objects/items/shrapnel.dm +++ b/code/game/objects/items/shrapnel.dm @@ -2,7 +2,7 @@ name = "shrapnel shard" custom_materials = list(/datum/material/iron= SMALL_MATERIAL_AMOUNT * 0.5) weak_against_armour = TRUE - icon = 'icons/obj/shards.dmi' + icon = 'icons/obj/debris.dmi' icon_state = "large" w_class = WEIGHT_CLASS_TINY item_flags = DROPDEL diff --git a/code/game/objects/items/signs.dm b/code/game/objects/items/signs.dm index bc5652914ade1..3bf5c36048b31 100644 --- a/code/game/objects/items/signs.dm +++ b/code/game/objects/items/signs.dm @@ -1,5 +1,5 @@ /obj/item/picket_sign - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/signs.dmi' icon_state = "picket" inhand_icon_state = "picket" name = "blank picket sign" diff --git a/code/game/objects/items/skub.dm b/code/game/objects/items/skub.dm index 0c70909786a71..12e6da344d0b8 100644 --- a/code/game/objects/items/skub.dm +++ b/code/game/objects/items/skub.dm @@ -1,7 +1,7 @@ /obj/item/skub desc = "It's skub." name = "skub" - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/maintenance_loot.dmi' icon_state = "skub" w_class = WEIGHT_CLASS_BULKY attack_verb_continuous = list("skubs") @@ -13,6 +13,6 @@ /obj/item/skub/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] has declared themself as anti-skub! The skub tears them apart!")) - user.gib() + user.gib(DROP_ALL_REMAINS) playsound(src, 'sound/items/eatfood.ogg', 50, TRUE, -1) return MANUAL_SUICIDE diff --git a/code/game/objects/items/spear.dm b/code/game/objects/items/spear.dm index f6d628ad4f93d..5590bfd3c2ff0 100644 --- a/code/game/objects/items/spear.dm +++ b/code/game/objects/items/spear.dm @@ -40,7 +40,10 @@ . = ..() force = force_unwielded //decent in a pinch, but pretty bad. - AddComponent(/datum/component/jousting) + AddComponent(/datum/component/jousting, \ + max_tile_charge = 9, \ + min_tile_charge = 6, \ + ) AddComponent(/datum/component/butchering, \ speed = 10 SECONDS, \ @@ -51,8 +54,18 @@ force_wielded = force_wielded, \ icon_wielded = "[icon_prefix]1", \ ) + add_headpike_component() update_appearance() +// I dunno man +/obj/item/spear/proc/add_headpike_component() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/headpike) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/spear/update_icon_state() icon_state = "[icon_prefix]0" return ..() @@ -139,7 +152,7 @@ user.say("[war_cry]", forced="spear warcry") explosive.forceMove(user) explosive.detonate() - user.gib() + user.gib(DROP_ALL_REMAINS) qdel(src) return BRUTELOSS @@ -220,6 +233,14 @@ force_unwielded = 12 force_wielded = 20 +/obj/item/spear/bonespear/add_headpike_component() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/headpikebone) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /* * Bamboo Spear */ @@ -234,3 +255,12 @@ custom_materials = list(/datum/material/bamboo = SHEET_MATERIAL_AMOUNT * 20) force_unwielded = 10 force_wielded = 18 + + +/obj/item/spear/bamboospear/add_headpike_component() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/headpikebamboo) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm index de82738094895..dd4865980cad0 100644 --- a/code/game/objects/items/stacks/bscrystal.dm +++ b/code/game/objects/items/stacks/bscrystal.dm @@ -2,7 +2,7 @@ /obj/item/stack/ore/bluespace_crystal name = "bluespace crystal" desc = "A glowing bluespace crystal, not much is known about how they work. It looks very delicate." - icon = 'icons/obj/telescience.dmi' + icon = 'icons/obj/ore.dmi' icon_state = "bluespace_crystal" singular_name = "bluespace crystal" dye_color = DYE_COSMIC @@ -64,7 +64,7 @@ //Polycrystals, aka stacks /obj/item/stack/sheet/bluespace_crystal name = "bluespace polycrystal" - icon = 'icons/obj/telescience.dmi' + icon = 'icons/obj/stack_objects.dmi' icon_state = "polycrystal" inhand_icon_state = null singular_name = "bluespace polycrystal" diff --git a/code/game/objects/items/stacks/cash.dm b/code/game/objects/items/stacks/cash.dm index 8e2d3c4e0db9a..754532fe0d141 100644 --- a/code/game/objects/items/stacks/cash.dm +++ b/code/game/objects/items/stacks/cash.dm @@ -3,6 +3,7 @@ singular_name = "bill" icon = 'icons/obj/economy.dmi' icon_state = null + worn_icon_state = "nothing" amount = 1 max_amount = INFINITY throwforce = 0 diff --git a/code/game/objects/items/stacks/golem_food/golem_hand_actions.dm b/code/game/objects/items/stacks/golem_food/golem_hand_actions.dm index fc87d09447744..39c17d2346c6a 100644 --- a/code/game/objects/items/stacks/golem_food/golem_hand_actions.dm +++ b/code/game/objects/items/stacks/golem_food/golem_hand_actions.dm @@ -35,7 +35,7 @@ playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 50, TRUE) held_gibtonite.forceMove(get_turf(src)) held_gibtonite.det_time = 2 SECONDS - held_gibtonite.GibtoniteReaction(user) + held_gibtonite.GibtoniteReaction(user, "A [src] has targeted [target] with a thrown and primed") held_gibtonite.throw_at(target, range = 10, speed = 3, thrower = user) held_gibtonite = null qdel(src) @@ -44,7 +44,7 @@ /// Called when you can't hold it in any longer and just drop it on the ground /obj/item/gibtonite_hand/proc/release_gibtonite() held_gibtonite.forceMove(get_turf(src)) - held_gibtonite.GibtoniteReaction(isliving(loc) ? loc : null) + held_gibtonite.GibtoniteReaction(isliving(loc) ? loc : null, "A [src] has dropped and primed a") held_gibtonite = null qdel(src) diff --git a/code/game/objects/items/stacks/golem_food/golem_status_effects.dm b/code/game/objects/items/stacks/golem_food/golem_status_effects.dm index 84e6e280c0cf2..5ed7fcd46823b 100644 --- a/code/game/objects/items/stacks/golem_food/golem_status_effects.dm +++ b/code/game/objects/items/stacks/golem_food/golem_status_effects.dm @@ -95,11 +95,11 @@ return ..() /datum/status_effect/golem/get_examine_text() - return span_notice("[owner.p_their(capitalized = TRUE)] body has been augmented with veins of [mineral_name].") + return span_notice("[owner.p_Their()] body has been augmented with veins of [mineral_name].") /// Body part overlays applied by golem status effects /datum/bodypart_overlay/simple/golem_overlay - icon = 'icons/mob/species/golems.dmi' + icon = 'icons/mob/human/species/golems.dmi' layers = ALL_EXTERNAL_OVERLAYS ///The bodypart that the overlay is currently applied to var/datum/weakref/attached_bodypart @@ -176,14 +176,14 @@ . = ..() if (!.) return FALSE - owner.add_traits(list(TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTHEAT), TRAIT_STATUS_EFFECT(id)) + owner.add_traits(list(TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTHEAT, TRAIT_ASHSTORM_IMMUNE), TRAIT_STATUS_EFFECT(id)) RegisterSignal(owner, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_burned)) var/mob/living/carbon/human/human_owner = owner human_owner.physiology.burn_mod *= burn_multiplier return TRUE /datum/status_effect/golem/plasma/on_remove() - owner.remove_traits(list(TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTHEAT), TRAIT_STATUS_EFFECT(id)) + owner.remove_traits(list(TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTHEAT, TRAIT_ASHSTORM_IMMUNE), TRAIT_STATUS_EFFECT(id)) UnregisterSignal(owner, COMSIG_MOB_APPLY_DAMAGE) var/mob/living/carbon/human/human_owner = owner human_owner.physiology.burn_mod /= burn_multiplier diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 537aa4f94bc01..f4a61f2d7ca4d 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -12,7 +12,7 @@ resistance_flags = FLAMMABLE max_integrity = 40 novariants = FALSE - item_flags = NOBLUDGEON + item_flags = NOBLUDGEON|SKIP_FANTASY_ON_SPAWN cost = 250 source = /datum/robot_energy_storage/medical merge_type = /obj/item/stack/medical @@ -37,6 +37,28 @@ . = ..() try_heal(patient, user) +/obj/item/stack/medical/apply_fantasy_bonuses(bonus) + . = ..() + if(heal_brute) + heal_brute = modify_fantasy_variable("heal_brute", heal_brute, bonus) + if(heal_burn) + heal_burn = modify_fantasy_variable("heal_burn", heal_burn, bonus) + if(stop_bleeding) + stop_bleeding = modify_fantasy_variable("stop_bleeding", stop_bleeding, bonus/10) + if(sanitization) + sanitization = modify_fantasy_variable("sanitization", sanitization, bonus/10) + if(flesh_regeneration) + flesh_regeneration = modify_fantasy_variable("flesh_regeneration", flesh_regeneration, bonus/10) + +/obj/item/stack/medical/remove_fantasy_bonuses(bonus) + heal_brute = reset_fantasy_variable("heal_brute", heal_brute) + heal_burn = reset_fantasy_variable("heal_burn", heal_burn) + stop_bleeding = reset_fantasy_variable("stop_bleeding", stop_bleeding) + sanitization = reset_fantasy_variable("sanitization", sanitization) + flesh_regeneration = reset_fantasy_variable("flesh_regeneration", flesh_regeneration) + return ..() + + /// In which we print the message that we're starting to heal someone, then we try healing them. Does the do_after whether or not it can actually succeed on a targeted mob /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)) @@ -64,10 +86,6 @@ patient.balloon_alert(user, "they're dead!") return if(isanimal_or_basicmob(patient) && heal_brute) // only brute can heal - var/mob/living/simple_animal/critter = patient - if (istype(critter) && !critter.healable) - patient.balloon_alert(user, "won't work!") - return FALSE if (!(patient.mob_biotypes & MOB_ORGANIC)) patient.balloon_alert(user, "can't fix that!") return FALSE @@ -88,7 +106,7 @@ patient.balloon_alert(user, "no [parse_zone(user.zone_selected)]!") return FALSE if(!IS_ORGANIC_LIMB(affecting)) //Limb must be organic to be healed - RR - patient.balloon_alert(user, "it's mechanical!") + patient.balloon_alert(user, "it's not organic!") return FALSE if(affecting.brute_dam && brute || affecting.burn_dam && burn) user.visible_message( @@ -141,9 +159,21 @@ splint_factor = 0.7 burn_cleanliness_bonus = 0.35 merge_type = /obj/item/stack/medical/gauze + var/obj/item/bodypart/gauzed_bodypart + +/obj/item/stack/medical/gauze/Destroy(force) + . = ..() + + if (gauzed_bodypart) + gauzed_bodypart.current_gauze = null + SEND_SIGNAL(gauzed_bodypart, COMSIG_BODYPART_UNGAUZED, src) + gauzed_bodypart = null // gauze is only relevant for wounds, which are handled in the wounds themselves /obj/item/stack/medical/gauze/try_heal(mob/living/patient, mob/user, silent) + + var/treatment_delay = (user == patient ? self_delay : other_delay) + var/obj/item/bodypart/limb = patient.get_bodypart(check_zone(user.zone_selected)) if(!limb) patient.balloon_alert(user, "missing limb!") @@ -153,8 +183,9 @@ return var/gauzeable_wound = FALSE + var/datum/wound/woundies for(var/i in limb.wounds) - var/datum/wound/woundies = i + woundies = i if(woundies.wound_flags & ACCEPTS_GAUZE) gauzeable_wound = TRUE break @@ -163,11 +194,19 @@ return if(limb.current_gauze && (limb.current_gauze.absorption_capacity * 1.2 > 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 - patient.balloon_alert(user, "already bandaged!") + patient.balloon_alert(user, pick("already bandaged!", "bandage is clean!")) // good enough return - user.visible_message(span_warning("[user] begins wrapping the wounds on [patient]'s [limb.plaintext_zone] with [src]..."), span_warning("You begin wrapping the wounds on [user == patient ? "your" : "[patient]'s"] [limb.plaintext_zone] with [src]...")) - if(!do_after(user, (user == patient ? self_delay : other_delay), target=patient)) + if(HAS_TRAIT(woundies, TRAIT_WOUND_SCANNED)) + treatment_delay *= 0.5 + if(user == patient) + to_chat(user, span_notice("You keep in mind the indications from the holo-image about your injury, and expertly begin wrapping your wounds with [src].")) + else + user.visible_message(span_warning("[user] begins expertly wrapping the wounds on [patient]'s [limb.plaintext_zone] with [src]..."), span_warning("You begin quickly wrapping the wounds on [patient]'s [limb.plaintext_zone] with [src], keeping the holo-image indications in mind...")) + else + user.visible_message(span_warning("[user] begins wrapping the wounds on [patient]'s [limb.plaintext_zone] with [src]..."), span_warning("You begin wrapping the wounds on [user == patient ? "your" : "[patient]'s"] [limb.plaintext_zone] with [src]...")) + + if(!do_after(user, treatment_delay, target = patient)) return user.visible_message("[user] applies [src] to [patient]'s [limb.plaintext_zone].", "You bandage the wounds on [user == patient ? "your" : "[patient]'s"] [limb.plaintext_zone].") @@ -385,6 +424,9 @@ novariants = TRUE merge_type = /obj/item/stack/medical/bone_gel +/obj/item/stack/medical/bone_gel/get_surgery_tool_overlay(tray_extended) + return "gel" + (tray_extended ? "" : "_out") + /obj/item/stack/medical/bone_gel/attack(mob/living/patient, mob/user) patient.balloon_alert(user, "no fractures!") return @@ -400,10 +442,10 @@ patient.emote("scream") for(var/i in patient.bodyparts) - var/obj/item/bodypart/bone = i - var/datum/wound/blunt/severe/oof_ouch = new + var/obj/item/bodypart/bone = i // fine to just, use these raw, its a meme anyway + var/datum/wound/blunt/bone/severe/oof_ouch = new oof_ouch.apply_wound(bone, wound_source = "bone gel") - var/datum/wound/blunt/critical/oof_OUCH = new + var/datum/wound/blunt/bone/critical/oof_OUCH = new oof_OUCH.apply_wound(bone, wound_source = "bone gel") for(var/i in patient.bodyparts) @@ -441,3 +483,27 @@ /obj/item/stack/medical/poultice/post_heal_effects(amount_healed, mob/living/carbon/healed_mob, mob/user) . = ..() healed_mob.adjustOxyLoss(amount_healed) + +/obj/item/stack/medical/bandage + name = "first aid bandage" + desc = "A DeForest brand bandage designed for basic first aid on blunt-force trauma." + icon_state = "bandage" + inhand_icon_state = "bandage" + novariants = TRUE + amount = 1 + max_amount = 1 + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + heal_brute = 25 + stop_bleeding = 0.2 + self_delay = 3 SECONDS + other_delay = 1 SECONDS + grind_results = list(/datum/reagent/medicine/c2/libital = 2) + +/obj/item/stack/medical/bandage/makeshift + name = "makeshift bandage" + desc = "A hastily constructed bandage designed for basic first aid on blunt-force trauma." + icon_state = "bandage_makeshift" + icon_state_preview = "bandage_makeshift" + inhand_icon_state = "bandage" + novariants = TRUE diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index e9a1e74819aa5..fb4f72d68d162 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -1,14 +1,17 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ - new/datum/stack_recipe("grille", /obj/structure/grille, 2, time = 10, one_per_turf = TRUE, on_solid_ground = FALSE, check_density = FALSE, category = CAT_STRUCTURE), \ - new/datum/stack_recipe("table frame", /obj/structure/table_frame, 2, time = 10, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("scooter frame", /obj/item/scooter_frame, 10, time = 25, one_per_turf = FALSE, category = CAT_ENTERTAINMENT), \ - new/datum/stack_recipe("linen bin", /obj/structure/bedsheetbin/empty, 2, time = 5, one_per_turf = FALSE, category = CAT_CONTAINERS), \ - new/datum/stack_recipe("railing", /obj/structure/railing, 6, time = 3.6 SECONDS, check_direction = TRUE, category = CAT_STRUCTURE), \ - new/datum/stack_recipe("tank holder", /obj/structure/tank_holder, 2, time = 5, one_per_turf = TRUE, on_solid_ground = FALSE, check_density = FALSE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("ladder", /obj/structure/ladder/crafted, 15, time = 150, one_per_turf = TRUE, on_solid_ground = FALSE, check_density = FALSE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("grille", /obj/structure/grille, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = FALSE, check_density = FALSE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("table frame", /obj/structure/table_frame, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ + new/datum/stack_recipe("scooter frame", /obj/item/scooter_frame, 10, time = 2.5 SECONDS, one_per_turf = FALSE, category = CAT_ENTERTAINMENT), \ + new/datum/stack_recipe("linen bin", /obj/structure/bedsheetbin/empty, 2, time = 0.5 SECONDS, one_per_turf = FALSE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("railing", /obj/structure/railing, 2, time = 1 SECONDS, check_direction = TRUE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("railing corner", /obj/structure/railing/corner, 1, time = 1 SECONDS, check_direction = TRUE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("railing end", /obj/structure/railing/corner/end, 1, time = 1 SECONDS, check_direction = TRUE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("railing end (flipped)", /obj/structure/railing/corner/end/flip, 1, time = 1 SECONDS, check_direction = TRUE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("tank holder", /obj/structure/tank_holder, 2, time = 0.5 SECONDS, one_per_turf = TRUE, on_solid_ground = FALSE, check_density = FALSE, category = CAT_FURNITURE), \ + new/datum/stack_recipe("ladder", /obj/structure/ladder/crafted, 15, time = 15 SECONDS, one_per_turf = TRUE, on_solid_ground = FALSE, check_density = FALSE, category = CAT_STRUCTURE), \ new/datum/stack_recipe("catwalk floor tile", /obj/item/stack/tile/catwalk_tile, 1, 4, 20, category = CAT_TILES), \ new/datum/stack_recipe("stairs frame", /obj/structure/stairs_frame, 10, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_STRUCTURE), \ - new/datum/stack_recipe("white cane", /obj/item/cane/white, 3, time = 10, one_per_turf = FALSE, category = CAT_TOOLS), \ + new/datum/stack_recipe("white cane", /obj/item/cane/white, 3, time = 1 SECONDS, one_per_turf = FALSE, category = CAT_TOOLS), \ )) /obj/item/stack/rods @@ -52,6 +55,13 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ ) AddElement(/datum/element/contextual_screentip_tools, tool_behaviors) + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/spear, /datum/crafting_recipe/stunprod, /datum/crafting_recipe/teleprod) // snatcher prod isn't here as a spoopy secret + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/stack/rods/handle_openspace_click(turf/target, mob/user, proximity_flag, click_parameters) if(proximity_flag) target.attackby(src, user, click_parameters) diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 309b3340e724f..e198ff6121d8c 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -83,8 +83,8 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ return ..() GLOBAL_LIST_INIT(pglass_recipes, list ( \ - new/datum/stack_recipe("directional window", /obj/structure/window/plasma/unanchored, time = 0, on_solid_ground = TRUE, check_direction = TRUE, category = CAT_WINDOWS), \ - new/datum/stack_recipe("fulltile window", /obj/structure/window/plasma/fulltile/unanchored, 2, time = 0, on_solid_ground = TRUE, is_fulltile = TRUE, category = CAT_WINDOWS), \ + new/datum/stack_recipe("directional window", /obj/structure/window/plasma/unanchored, time = 0.5 SECONDS, on_solid_ground = TRUE, check_direction = TRUE, category = CAT_WINDOWS), \ + new/datum/stack_recipe("fulltile window", /obj/structure/window/plasma/fulltile/unanchored, 2, time = 2 SECONDS, on_solid_ground = TRUE, is_fulltile = TRUE, category = CAT_WINDOWS), \ new/datum/stack_recipe("plasma glass shard", /obj/item/shard/plasma, time = 20, on_solid_ground = TRUE, category = CAT_MISC), \ new/datum/stack_recipe("plasma glass tile", /obj/item/stack/tile/glass/plasma, 1, 4, 20, category = CAT_TILES) \ )) @@ -141,8 +141,8 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ new/datum/stack_recipe("windoor frame", /obj/structure/windoor_assembly, 5, time = 0, on_solid_ground = TRUE, check_direction = TRUE, category = CAT_WINDOWS), \ null, \ - new/datum/stack_recipe("directional reinforced window", /obj/structure/window/reinforced/unanchored, time = 0, on_solid_ground = TRUE, check_direction = TRUE, category = CAT_WINDOWS), \ - new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/reinforced/fulltile/unanchored, 2, time = 0, on_solid_ground = TRUE, is_fulltile = TRUE, category = CAT_WINDOWS), \ + new/datum/stack_recipe("directional reinforced window", /obj/structure/window/reinforced/unanchored, time = 0.5 SECONDS, on_solid_ground = TRUE, check_direction = TRUE, category = CAT_WINDOWS), \ + new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/reinforced/fulltile/unanchored, 2, time = 2 SECONDS, on_solid_ground = TRUE, is_fulltile = TRUE, category = CAT_WINDOWS), \ new/datum/stack_recipe("glass shard", /obj/item/shard, time = 10, on_solid_ground = TRUE, category = CAT_MISC), \ new/datum/stack_recipe("reinforced glass tile", /obj/item/stack/tile/rglass, 1, 4, 20, category = CAT_TILES) \ )) @@ -179,8 +179,8 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ . += GLOB.reinforced_glass_recipes GLOBAL_LIST_INIT(prglass_recipes, list ( \ - new/datum/stack_recipe("directional reinforced window", /obj/structure/window/reinforced/plasma/unanchored, time = 0, on_solid_ground = TRUE, check_direction = TRUE, category = CAT_WINDOWS), \ - new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/reinforced/plasma/fulltile/unanchored, 2, time = 0, on_solid_ground = TRUE, is_fulltile = TRUE, category = CAT_WINDOWS), \ + new/datum/stack_recipe("directional reinforced window", /obj/structure/window/reinforced/plasma/unanchored, time = 0.5 SECONDS, on_solid_ground = TRUE, check_direction = TRUE, category = CAT_WINDOWS), \ + new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/reinforced/plasma/fulltile/unanchored, 2, time = 2 SECONDS, on_solid_ground = TRUE, is_fulltile = TRUE, category = CAT_WINDOWS), \ new/datum/stack_recipe("plasma glass shard", /obj/item/shard/plasma, time = 40, on_solid_ground = TRUE, category = CAT_MISC), \ new/datum/stack_recipe("reinforced plasma glass tile", /obj/item/stack/tile/rglass/plasma, 1, 4, 20, category = CAT_TILES) \ )) @@ -214,7 +214,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ . += GLOB.prglass_recipes GLOBAL_LIST_INIT(titaniumglass_recipes, list( - new/datum/stack_recipe("shuttle window", /obj/structure/window/reinforced/shuttle/unanchored, 2, time = 0, on_solid_ground = TRUE, check_direction = TRUE, is_fulltile = TRUE, category = CAT_WINDOWS), \ + new/datum/stack_recipe("shuttle window", /obj/structure/window/reinforced/shuttle/unanchored, 2, time = 0.5 SECONDS, on_solid_ground = TRUE, check_direction = TRUE, is_fulltile = TRUE, category = CAT_WINDOWS), \ new/datum/stack_recipe("titanium glass shard", /obj/item/shard/titanium, time = 40, on_solid_ground = TRUE, category = CAT_MISC) \ )) @@ -243,7 +243,8 @@ GLOBAL_LIST_INIT(titaniumglass_recipes, list( . += GLOB.titaniumglass_recipes GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( - new/datum/stack_recipe("plastitanium window", /obj/structure/window/reinforced/plasma/plastitanium/unanchored, 2, time = 0, on_solid_ground = TRUE, is_fulltile = TRUE, category = CAT_WINDOWS) \ + new/datum/stack_recipe("plastitanium window", /obj/structure/window/reinforced/plasma/plastitanium/unanchored, 2, time = 2 SECONDS, on_solid_ground = TRUE, is_fulltile = TRUE, category = CAT_WINDOWS), \ + new/datum/stack_recipe("plastitanium glass shard", /obj/item/shard/plastitanium, time = 60, on_solid_ground = TRUE, category = CAT_MISC) \ )) /obj/item/stack/sheet/plastitaniumglass @@ -274,7 +275,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( /obj/item/shard name = "shard" desc = "A nasty looking shard of glass." - icon = 'icons/obj/shards.dmi' + icon = 'icons/obj/debris.dmi' icon_state = "large" w_class = WEIGHT_CLASS_TINY force = 5 diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 11f1cea26a272..bff5e52f0a195 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -22,6 +22,9 @@ GLOBAL_LIST_INIT(human_recipes, list( \ . = ..() . += GLOB.human_recipes +/obj/item/stack/sheet/animalhide/human/five + amount = 5 + /obj/item/stack/sheet/animalhide/generic name = "skin" desc = "A piece of skin." @@ -42,6 +45,9 @@ GLOBAL_LIST_INIT(gondola_recipes, list ( \ new/datum/stack_recipe("gondola suit", /obj/item/clothing/under/costume/gondola, 2, check_density = FALSE, category = CAT_CLOTHING), \ )) +/obj/item/stack/sheet/animalhide/corgi/five + amount = 5 + /obj/item/stack/sheet/animalhide/mothroach name = "mothroach hide" desc = "A thin layer of mothroach hide." @@ -50,6 +56,9 @@ GLOBAL_LIST_INIT(gondola_recipes, list ( \ inhand_icon_state = null merge_type = /obj/item/stack/sheet/animalhide/mothroach +/obj/item/stack/sheet/animalhide/mothroach/five + amount = 5 + /obj/item/stack/sheet/animalhide/gondola name = "gondola hide" desc = "The extremely valuable product of gondola hunting." @@ -78,6 +87,9 @@ GLOBAL_LIST_INIT(corgi_recipes, list ( \ inhand_icon_state = null merge_type = /obj/item/stack/sheet/animalhide/cat +/obj/item/stack/sheet/animalhide/cat/five + amount = 5 + /obj/item/stack/sheet/animalhide/monkey name = "monkey hide" desc = "The by-product of monkey farming." @@ -95,6 +107,9 @@ GLOBAL_LIST_INIT(monkey_recipes, list ( \ . = ..() . += GLOB.monkey_recipes +/obj/item/stack/sheet/animalhide/monkey/five + amount = 5 + /obj/item/stack/sheet/animalhide/lizard name = "lizard skin" desc = "Sssssss..." @@ -103,6 +118,9 @@ GLOBAL_LIST_INIT(monkey_recipes, list ( \ inhand_icon_state = null merge_type = /obj/item/stack/sheet/animalhide/lizard +/obj/item/stack/sheet/animalhide/lizard/five + amount = 5 + /obj/item/stack/sheet/animalhide/xeno name = "alien hide" desc = "The skin of a terrible creature." @@ -120,6 +138,32 @@ GLOBAL_LIST_INIT(xeno_recipes, list ( \ . = ..() . += GLOB.xeno_recipes +/obj/item/stack/sheet/animalhide/xeno/five + amount = 5 + +/obj/item/stack/sheet/animalhide/carp + name = "carp scales" + desc = "The scaly skin of a space carp. It looks quite beatiful when detached from the foul creature who once wore it." + singular_name = "carp scale" + icon_state = "sheet-carp" + inhand_icon_state = null + merge_type = /obj/item/stack/sheet/animalhide/carp + +GLOBAL_LIST_INIT(carp_recipes, list ( \ + new/datum/stack_recipe("carp costume", /obj/item/clothing/suit/hooded/carp_costume, 4, check_density = FALSE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("carp mask", /obj/item/clothing/mask/gas/carp, 1, check_density = FALSE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("carpskin chair", /obj/structure/chair/comfy/carp, 2, check_density = FALSE, category = CAT_FURNITURE), \ + new/datum/stack_recipe("carpskin suit", /obj/item/clothing/under/suit/carpskin, 3, check_density = FALSE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("carpskin fedora", /obj/item/clothing/head/fedora/carpskin, 2, check_density = FALSE, category = CAT_CLOTHING), \ + )) + +/obj/item/stack/sheet/animalhide/carp/get_main_recipes() + . = ..() + . += GLOB.carp_recipes + +/obj/item/stack/sheet/animalhide/carp/five + amount = 5 + //don't see anywhere else to put these, maybe together they could be used to make the xenos suit? /obj/item/stack/sheet/xenochitin name = "alien chitin" @@ -142,38 +186,6 @@ GLOBAL_LIST_INIT(xeno_recipes, list ( \ icon = 'icons/mob/nonhuman-player/alien.dmi' icon_state = "weed_extract" -/obj/item/stack/sheet/hairlesshide - name = "hairless hide" - desc = "This hide was stripped of its hair, but still needs washing and tanning." - singular_name = "hairless hide piece" - icon_state = "sheet-hairlesshide" - inhand_icon_state = null - merge_type = /obj/item/stack/sheet/hairlesshide - -/obj/item/stack/sheet/wethide - name = "wet hide" - desc = "This hide has been cleaned but still needs to be dried." - singular_name = "wet hide piece" - icon_state = "sheet-wetleather" - inhand_icon_state = null - merge_type = /obj/item/stack/sheet/wethide - /// Reduced when exposed to high temperatures - var/wetness = 30 - /// Kelvin to start drying - var/drying_threshold_temperature = 500 - -/obj/item/stack/sheet/wethide/Initialize(mapload, new_amount, merge = TRUE, list/mat_override=null, mat_amt=1) - . = ..() - AddElement(/datum/element/dryable, /obj/item/stack/sheet/leather) - AddElement(/datum/element/atmos_sensitive, mapload) - AddComponent(/datum/component/grillable, /obj/item/stack/sheet/leather, rand(1 SECONDS, 3 SECONDS), TRUE) - -/obj/item/stack/sheet/wethide/burn() - visible_message(span_notice("[src] burns up, leaving a sheet of leather behind!")) - new /obj/item/stack/sheet/leather(loc) // only one sheet remains to incentivise not burning your wethide to dry it - qdel(src) - - /* * Leather SHeet */ @@ -189,7 +201,8 @@ GLOBAL_LIST_INIT(leather_recipes, list ( \ new/datum/stack_recipe("wallet", /obj/item/storage/wallet, 1, check_density = FALSE, category = CAT_CONTAINERS), \ new/datum/stack_recipe("muzzle", /obj/item/clothing/mask/muzzle, 2, check_density = FALSE, category = CAT_ENTERTAINMENT), \ new/datum/stack_recipe("basketball", /obj/item/toy/basketball, 20, check_density = FALSE, category = CAT_ENTERTAINMENT), \ - new/datum/stack_recipe("saddle", /obj/item/saddle, 5, check_density = FALSE, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("baseball", /obj/item/toy/beach_ball/baseball, 3, check_density = FALSE, category = CAT_ENTERTAINMENT), \ + new/datum/stack_recipe("saddle", /obj/item/goliath_saddle, 5, check_density = FALSE, category = CAT_EQUIPMENT), \ new/datum/stack_recipe("leather shoes", /obj/item/clothing/shoes/laceup, 2, check_density = FALSE, category = CAT_CLOTHING), \ new/datum/stack_recipe("cowboy boots", /obj/item/clothing/shoes/cowboy, 2, check_density = FALSE, category = CAT_CLOTHING), \ new/datum/stack_recipe("botany gloves", /obj/item/clothing/gloves/botanic_leather, 3, check_density = FALSE, category = CAT_CLOTHING), \ @@ -218,6 +231,10 @@ GLOBAL_LIST_INIT(leather_recipes, list ( \ /obj/item/stack/sheet/leather/get_main_recipes() . = ..() . += GLOB.leather_recipes + +/obj/item/stack/sheet/leather/five + amount = 5 + /* * Sinew */ @@ -287,23 +304,60 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \ playsound(loc, 'sound/weapons/slice.ogg', 50, TRUE, -1) user.visible_message(span_notice("[user] starts cutting hair off \the [src]."), span_notice("You start cutting the hair off \the [src]..."), span_hear("You hear the sound of a knife rubbing against flesh.")) if(do_after(user, 50, target = src)) - to_chat(user, span_notice("You cut the hair from this [src.singular_name].")) - new /obj/item/stack/sheet/hairlesshide(user.drop_location(), 1) - use(1) + to_chat(user, span_notice("You cut the hair from [src.name].")) + new /obj/item/stack/sheet/hairlesshide(user.drop_location(), amount) + use(amount) else return ..() +/obj/item/stack/sheet/animalhide/examine(mob/user) + . = ..() + . += span_notice("You can remove the hair with any sharp object.") //Step two - washing..... it's actually in washing machine code. +/obj/item/stack/sheet/hairlesshide + name = "hairless hide" + desc = "This hide was stripped of its hair, but still needs washing and tanning." + singular_name = "hairless hide piece" + icon_state = "sheet-hairlesshide" + inhand_icon_state = null + merge_type = /obj/item/stack/sheet/hairlesshide + +/obj/item/stack/sheet/hairlesshide/examine(mob/user) + . = ..() + . += span_notice("You can clean it up by washing in the water.") + //Step three - drying /obj/item/stack/sheet/wethide + name = "wet hide" + desc = "This hide has been cleaned but still needs to be dried." + singular_name = "wet hide piece" + icon_state = "sheet-wetleather" + inhand_icon_state = null + merge_type = /obj/item/stack/sheet/wethide + /// Reduced when exposed to high temperatures + var/wetness = 30 + /// Kelvin to start drying + var/drying_threshold_temperature = 500 -/obj/item/stack/sheet/wethide/Initialize(mapload) +/obj/item/stack/sheet/wethide/examine(mob/user) + . = ..() + . += span_notice("You can dry it up to make leather.") + +/obj/item/stack/sheet/wethide/Initialize(mapload, new_amount, merge = TRUE, list/mat_override=null, mat_amt=1) . = ..() + AddElement(/datum/element/atmos_sensitive, mapload) + AddElement(/datum/element/dryable, /obj/item/stack/sheet/leather) AddElement(/datum/element/microwavable, /obj/item/stack/sheet/leather) + AddComponent(/datum/component/grillable, /obj/item/stack/sheet/leather, rand(1 SECONDS, 3 SECONDS), TRUE) AddComponent(/datum/component/bakeable, /obj/item/stack/sheet/leather, rand(15 SECONDS, 20 SECONDS), TRUE, TRUE) +/obj/item/stack/sheet/wethide/burn() + visible_message(span_notice("[src] burns up, leaving a sheet of leather behind!")) + new /obj/item/stack/sheet/leather(loc) // only one sheet remains to incentivise not burning your wethide to dry it + qdel(src) + /obj/item/stack/sheet/wethide/should_atmos_process(datum/gas_mixture/air, exposed_temperature) return (exposed_temperature > drying_threshold_temperature) @@ -313,23 +367,3 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \ new /obj/item/stack/sheet/leather(drop_location(), 1) wetness = initial(wetness) use(1) - -/obj/item/stack/sheet/animalhide/carp - name = "carp scales" - desc = "The scaly skin of a space carp. It looks quite beatiful when detached from the foul creature who once wore it." - singular_name = "carp scale" - icon_state = "sheet-carp" - inhand_icon_state = null - merge_type = /obj/item/stack/sheet/animalhide/carp - -GLOBAL_LIST_INIT(carp_recipes, list ( \ - new/datum/stack_recipe("carp costume", /obj/item/clothing/suit/hooded/carp_costume, 4, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("carp mask", /obj/item/clothing/mask/gas/carp, 1, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("carpskin chair", /obj/structure/chair/comfy/carp, 2, check_density = FALSE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("carpskin suit", /obj/item/clothing/under/suit/carpskin, 3, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("carpskin fedora", /obj/item/clothing/head/fedora/carpskin, 2, check_density = FALSE, category = CAT_CLOTHING), \ - )) - -/obj/item/stack/sheet/animalhide/carp/get_main_recipes() - . = ..() - . += GLOB.carp_recipes diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 527af398bd2b0..8da8d83e30eaf 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -141,6 +141,9 @@ GLOBAL_LIST_INIT(uranium_recipes, list ( \ /obj/item/stack/sheet/mineral/uranium/five amount = 5 +/obj/item/stack/sheet/mineral/uranium/half + amount = 25 + /* * Plasma */ @@ -344,6 +347,10 @@ GLOBAL_LIST_INIT(snow_recipes, list ( \ new/datum/stack_recipe("snow tile", /obj/item/stack/tile/mineral/snow, 1, 4, 20, check_density = FALSE, category = CAT_TILES), \ )) +/obj/item/stack/sheet/mineral/snow/Initialize(mapload, new_amount, merge, list/mat_override, mat_amt) + . = ..() + AddComponent(/datum/component/storm_hating) + /obj/item/stack/sheet/mineral/snow/get_main_recipes() . = ..() . += GLOB.snow_recipes @@ -403,7 +410,7 @@ GLOBAL_LIST_INIT(adamantine_recipes, list( */ /obj/item/stack/sheet/mineral/abductor name = "alien alloy" - icon = 'icons/obj/abductor.dmi' + icon = 'icons/obj/antags/abductor.dmi' icon_state = "sheet-abductor" inhand_icon_state = "sheet-abductor" singular_name = "alien alloy sheet" diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index ca4088c8500ff..1ad86868212f5 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -83,7 +83,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ new/datum/stack_recipe("tram wall girders (anchored)", /obj/structure/girder/tram, 2, time = 4 SECONDS, one_per_turf = TRUE, on_solid_ground = FALSE, check_density = FALSE, on_tram = TRUE, trait_booster = TRAIT_QUICK_BUILD, trait_modifier = 0.75, category = CAT_STRUCTURE), \ null, \ new/datum/stack_recipe("computer frame", /obj/structure/frame/computer, 5, time = 2.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_EQUIPMENT), \ - new/datum/stack_recipe("modular console", /obj/machinery/modular_computer/console, 10, time = 2.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("modular console", /obj/machinery/modular_computer, 10, time = 2.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_EQUIPMENT), \ new/datum/stack_recipe("machine frame", /obj/structure/frame/machine, 5, time = 2.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_EQUIPMENT), \ null, \ new /datum/stack_recipe_list("airlock assemblies", list( \ @@ -426,6 +426,8 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ new/datum/stack_recipe("white bandana", /obj/item/clothing/mask/bandana/white, 2, check_density = FALSE, category = CAT_CLOTHING), \ null, \ new/datum/stack_recipe("backpack", /obj/item/storage/backpack, 4, check_density = FALSE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("satchel", /obj/item/storage/backpack/satchel, 4, check_density = FALSE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("messenger bag", /obj/item/storage/backpack/messenger, 4, check_density = FALSE, category = CAT_CONTAINERS), \ new/datum/stack_recipe("duffel bag", /obj/item/storage/backpack/duffelbag, 6, check_density = FALSE, category = CAT_CONTAINERS), \ null, \ new/datum/stack_recipe("plant bag", /obj/item/storage/bag/plants, 4, check_density = FALSE, category = CAT_CONTAINERS), \ @@ -499,10 +501,22 @@ GLOBAL_LIST_INIT(durathread_recipes, list ( \ drop_sound = 'sound/items/handling/cloth_drop.ogg' pickup_sound = 'sound/items/handling/cloth_pickup.ogg' +/obj/item/stack/sheet/durathread/Initialize(mapload) + . = ..() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/durathread_helmet, /datum/crafting_recipe/durathread_vest) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/stack/sheet/durathread/get_main_recipes() . = ..() . += GLOB.durathread_recipes +/obj/item/stack/sheet/durathread/on_item_crafted(mob/builder, atom/created) + created.set_armor_rating(CONSUME, max(50, created.get_armor_rating(CONSUME))) + /obj/item/stack/sheet/cotton name = "raw cotton bundle" desc = "A bundle of raw cotton ready to be spun on the loom." @@ -595,7 +609,8 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ new /datum/stack_recipe("light bulbs box", /obj/item/storage/box/lights/bulbs, check_density = FALSE, category = CAT_CONTAINERS), \ new /datum/stack_recipe("mixed lights box", /obj/item/storage/box/lights/mixed, check_density = FALSE, category = CAT_CONTAINERS), \ new /datum/stack_recipe("mouse traps box", /obj/item/storage/box/mousetraps, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("candle box", /obj/item/storage/fancy/candle_box, check_density = FALSE, category = CAT_CONTAINERS) + new /datum/stack_recipe("candle box", /obj/item/storage/fancy/candle_box, check_density = FALSE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("bandage box", /obj/item/storage/box/bandages, check_density = FALSE, category = CAT_CONTAINERS) )), null, \ @@ -612,10 +627,18 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ force = 0 throwforce = 0 merge_type = /obj/item/stack/sheet/cardboard - novariants = TRUE grind_results = list(/datum/reagent/cellulose = 10) material_type = /datum/material/cardboard +/obj/item/stack/sheet/cardboard/Initialize(mapload, new_amount, merge, list/mat_override, mat_amt) + . = ..() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/cardboard_id) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/stack/sheet/cardboard/get_main_recipes() . = ..() . += GLOB.cardboard_recipes @@ -860,6 +883,7 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra merge_type = /obj/item/stack/sheet/hauntium material_type = /datum/material/hauntium material_modifier = 1 //None of that wussy stuff + grind_results = list(/datum/reagent/hauntium = 20) /obj/item/stack/sheet/hauntium/fifty amount = 50 diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 8f2503847ac60..7050309268cd0 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 + item_flags = SKIP_FANTASY_ON_SPAWN /// A list to all recipies this stack item can create. var/list/datum/stack_recipe/recipes /// What's the name of just 1 of this stack. You have a stack of leather, but one piece of leather @@ -144,18 +145,49 @@ /obj/item/stack/set_custom_materials(list/materials, multiplier=1, is_update=FALSE) return is_update ? ..() : set_mats_per_unit(materials, multiplier/(amount || 1)) - -/obj/item/stack/on_grind() - . = ..() - for(var/i in 1 to length(grind_results)) //This should only call if it's ground, so no need to check if grind_results exists - grind_results[grind_results[i]] *= get_amount() //Gets the key at position i, then the reagent amount of that key, then multiplies it by stack size - /obj/item/stack/grind_requirements() if(is_cyborg) - to_chat(usr, span_warning("[src] is electronically synthesized in your chassis and can't be ground up!")) + to_chat(usr, span_warning("[src] is too integrated into your chassis and can't be ground up!")) return return TRUE +/obj/item/stack/grind(datum/reagents/target_holder, mob/user) + var/current_amount = get_amount() + if(current_amount <= 0 || QDELETED(src)) //just to get rid of this 0 amount/deleted stack we return success + return TRUE + if(on_grind() == -1) + return FALSE + if(isnull(target_holder)) + return TRUE + + if(reagents) + reagents.trans_to(target_holder, reagents.total_volume, transferred_by = user) + var/available_volume = target_holder.maximum_volume - target_holder.total_volume + + //compute total volume of reagents that will be occupied by grind_results + var/total_volume = 0 + for(var/reagent in grind_results) + total_volume += grind_results[reagent] + + //compute number of pieces(or sheets) from available_volume + var/available_amount = min(current_amount, round(available_volume / total_volume)) + if(available_amount <= 0) + return FALSE + + //Now transfer the grind results scaled by available_amount + var/list/grind_reagents = grind_results.Copy() + for(var/reagent in grind_reagents) + grind_reagents[reagent] *= available_amount + target_holder.add_reagent_list(grind_reagents) + + /** + * use available_amount of sheets/pieces, return TRUE only if all sheets/pieces of this stack were used + * we don't delete this stack when it reaches 0 because we expect the all in one grinder, etc to delete + * this stack if grinding was successfull + */ + use(available_amount, check = FALSE) + return available_amount == current_amount + /obj/item/stack/proc/get_main_recipes() RETURN_TYPE(/list) SHOULD_CALL_PARENT(TRUE) @@ -185,10 +217,6 @@ /obj/item/stack/examine(mob/user) . = ..() if(is_cyborg) - if(singular_name) - . += "There is enough energy for [get_amount()] [singular_name]\s." - else - . += "There is enough energy for [get_amount()]." return if(singular_name) if(get_amount()>1) @@ -404,6 +432,7 @@ if(created) created.setDir(builder.dir) + on_item_crafted(builder, created) // Use up the material use(recipe.req_amount * multiplier) @@ -434,6 +463,10 @@ return TRUE +/// Run special logic on created items after they've been successfully crafted. +/obj/item/stack/proc/on_item_crafted(mob/builder, atom/created) + return + /obj/item/stack/vv_edit_var(vname, vval) if(vname == NAMEOF(src, amount)) add(clamp(vval, 1-amount, max_amount - amount)) //there must always be one. @@ -566,7 +599,8 @@ * - [inhand][boolean]: Whether or not the stack to check should act like it's in a mob's hand. */ /obj/item/stack/proc/can_merge(obj/item/stack/check, inhand = FALSE) - if(!istype(check, merge_type)) + // We don't only use istype here, since that will match subtypes, and stack things that shouldn't stack + if(!istype(check, merge_type) || check.merge_type != merge_type) return FALSE if(mats_per_unit ~! check.mats_per_unit) // ~! in case of lists this operator checks only keys, but not values return FALSE @@ -578,6 +612,8 @@ var/obj/machinery/machine = loc if(!(src in machine.component_parts) || !(check in machine.component_parts)) return FALSE + if(SEND_SIGNAL(src, COMSIG_STACK_CAN_MERGE, check, inhand) & CANCEL_STACK_MERGE) + return FALSE return TRUE /** diff --git a/code/game/objects/items/stacks/tape.dm b/code/game/objects/items/stacks/tape.dm index 08dbc7680705f..c8b46e2d28175 100644 --- a/code/game/objects/items/stacks/tape.dm +++ b/code/game/objects/items/stacks/tape.dm @@ -124,3 +124,6 @@ merge_type = /obj/item/stack/sticky_tape/surgical greyscale_colors = "#70BAE7#BD6A62" tape_gag = /obj/item/clothing/mask/muzzle/tape/surgical + +/obj/item/stack/sticky_tape/surgical/get_surgery_tool_overlay(tray_extended) + return "tape" + (tray_extended ? "" : "_out") diff --git a/code/game/objects/items/stacks/telecrystal.dm b/code/game/objects/items/stacks/telecrystal.dm index 248d9c97155e1..09cc3d5bed2dc 100644 --- a/code/game/objects/items/stacks/telecrystal.dm +++ b/code/game/objects/items/stacks/telecrystal.dm @@ -2,7 +2,7 @@ name = "telecrystal" desc = "It seems to be pulsing with suspiciously enticing energies." singular_name = "telecrystal" - icon = 'icons/obj/telescience.dmi' + icon = 'icons/obj/stack_objects.dmi' icon_state = "telecrystal" dye_color = DYE_SYNDICATE w_class = WEIGHT_CLASS_TINY diff --git a/code/game/objects/items/stacks/tiles/tile_iron.dm b/code/game/objects/items/stacks/tiles/tile_iron.dm index c67bf0c7f40cb..404c30253448b 100644 --- a/code/game/objects/items/stacks/tiles/tile_iron.dm +++ b/code/game/objects/items/stacks/tiles/tile_iron.dm @@ -5,18 +5,18 @@ icon_state = "tile" inhand_icon_state = "tile" force = 6 - mats_per_unit = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*5) + mats_per_unit = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*0.25) throwforce = 10 flags_1 = CONDUCT_1 turf_type = /turf/open/floor/iron armor_type = /datum/armor/tile_iron resistance_flags = FIRE_PROOF matter_amount = 1 - cost = SMALL_MATERIAL_AMOUNT * 5 + cost = HALF_SHEET_MATERIAL_AMOUNT * 0.5 source = /datum/robot_energy_storage/material/iron merge_type = /obj/item/stack/tile/iron tile_reskin_types = list( - /obj/item/stack/tile/iron, + /obj/item/stack/tile/iron/base, /obj/item/stack/tile/iron/edge, /obj/item/stack/tile/iron/half, /obj/item/stack/tile/iron/corner, @@ -139,7 +139,6 @@ merge_type = /obj/item/stack/tile/iron/base /obj/item/stack/tile/iron/base/cyborg //cant reskin these, fucks with borg code - merge_type = /obj/item/stack/tile/iron/base/cyborg tile_reskin_types = null /obj/item/stack/tile/iron/edge diff --git a/code/game/objects/items/stacks/tiles/tile_mineral.dm b/code/game/objects/items/stacks/tiles/tile_mineral.dm index a4e9daeb46d4f..08b708e966fda 100644 --- a/code/game/objects/items/stacks/tiles/tile_mineral.dm +++ b/code/game/objects/items/stacks/tiles/tile_mineral.dm @@ -95,7 +95,7 @@ name = "alien floor tile" singular_name = "alien floor tile" desc = "A tile made out of alien alloy." - icon = 'icons/obj/abductor.dmi' + icon = 'icons/obj/antags/abductor.dmi' icon_state = "tile_abductor" inhand_icon_state = "tile-abductor" mats_per_unit = list(/datum/material/alloy/alien=SHEET_MATERIAL_AMOUNT*0.25) diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 51a44dc4913bd..e08b7064dfd7b 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -33,6 +33,7 @@ . = ..() pixel_x = rand(-3, 3) pixel_y = rand(-3, 3) //randomize a little + AddElement(/datum/element/openspace_item_click_handler) if(tile_reskin_types) tile_reskin_types = tile_reskin_list(tile_reskin_types) if(tile_rotate_dirs) @@ -100,6 +101,10 @@ playsound(target_plating, 'sound/weapons/genhit.ogg', 50, TRUE) return target_plating +/obj/item/stack/tile/handle_openspace_click(turf/target, mob/user, proximity_flag, click_parameters) + if(proximity_flag) + target.attackby(src, user, click_parameters) + //Grass /obj/item/stack/tile/grass name = "grass tile" diff --git a/code/game/objects/items/sticker.dm b/code/game/objects/items/sticker.dm index 512e64c4cbd3e..459c8d211e4d9 100644 --- a/code/game/objects/items/sticker.dm +++ b/code/game/objects/items/sticker.dm @@ -4,7 +4,7 @@ desc = "A sticker with some strong adhesive on the back, sticks to stuff!" item_flags = NOBLUDGEON | XENOMORPH_HOLDABLE //funny resistance_flags = FLAMMABLE - icon = 'icons/obj/stickers.dmi' + icon = 'icons/obj/toys/stickers.dmi' w_class = WEIGHT_CLASS_TINY throw_range = 3 vis_flags = VIS_INHERIT_DIR | VIS_INHERIT_PLANE | VIS_INHERIT_LAYER diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index f8f6316518593..0461d76cb99c3 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -22,10 +22,10 @@ slot_flags = ITEM_SLOT_BACK //ERROOOOO resistance_flags = NONE max_integrity = 300 + storage_type = /datum/storage/backpack /obj/item/storage/backpack/Initialize(mapload) . = ..() - create_storage(max_slots = 21, max_total_storage = 21) AddElement(/datum/element/attack_equip) /* @@ -49,6 +49,12 @@ resistance_flags = FIRE_PROOF item_flags = NO_MAT_REDEMPTION +/obj/item/bag_of_holding_inert/Initialize(mapload) + . = ..() + AddComponent(/datum/component/slapcrafting,\ + slapcraft_recipes = list(/datum/crafting_recipe/boh)\ + ) + /obj/item/storage/backpack/holding name = "bag of holding" desc = "A backpack that opens into a localized pocket of bluespace." @@ -57,17 +63,12 @@ resistance_flags = FIRE_PROOF item_flags = NO_MAT_REDEMPTION armor_type = /datum/armor/backpack_holding + storage_type = /datum/storage/bag_of_holding /datum/armor/backpack_holding fire = 60 acid = 50 -/obj/item/storage/backpack/holding/Initialize(mapload) - . = ..() - - create_storage(max_specific_storage = WEIGHT_CLASS_GIGANTIC, max_total_storage = 35, max_slots = 30, storage_type = /datum/storage/bag_of_holding) - atom_storage.allow_big_nesting = TRUE - /obj/item/storage/backpack/holding/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is jumping into [src]! It looks like [user.p_theyre()] trying to commit suicide.")) user.dropItemToGround(src, TRUE) @@ -77,6 +78,7 @@ user.suicide_log() qdel(user) + /obj/item/storage/backpack/santabag name = "Santa's Gift Bag" desc = "Space Santa uses this to deliver presents to all the nice children in space in Christmas! Wow, it's pretty big!" @@ -88,11 +90,6 @@ . = ..() regenerate_presents() -/obj/item/storage/backpack/santabag/Initialize(mapload) - . = ..() - atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL - atom_storage.max_total_storage = 60 - /obj/item/storage/backpack/santabag/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] places [src] over [user.p_their()] head and pulls it tight! It looks like [user.p_they()] [user.p_are()]n't in the Christmas spirit...")) return OXYLOSS @@ -103,10 +100,10 @@ var/mob/user = get(loc, /mob) if(!istype(user)) return - if(user.mind && HAS_TRAIT(user.mind, TRAIT_CANNOT_OPEN_PRESENTS)) + if(HAS_MIND_TRAIT(user, TRAIT_CANNOT_OPEN_PRESENTS)) var/turf/floor = get_turf(src) var/obj/item/thing = new /obj/item/a_gift/anything(floor) - if(!atom_storage.attempt_insert(thing, user, override = TRUE)) + if(!atom_storage.attempt_insert(thing, user, override = TRUE, force = STORAGE_SOFT_LOCKED)) qdel(thing) @@ -377,12 +374,8 @@ atom_storage.set_holdable(cant_hold_list = list(/obj/item/storage/backpack/satchel/flat)) //muh recursive backpacks) /obj/item/storage/backpack/satchel/flat/PopulateContents() - var/datum/supply_pack/imports/contraband/smuggled_goods = new - for(var/items in 1 to 2) - var/smuggled_goods_type = pick(smuggled_goods.contains) - new smuggled_goods_type(src) - - qdel(smuggled_goods) + for(var/items in 1 to 4) + new /obj/effect/spawner/random/contraband(src) /obj/item/storage/backpack/satchel/flat/with_tools/PopulateContents() new /obj/item/stack/tile/iron/base(src) @@ -398,11 +391,103 @@ desc = "A large duffel bag for holding extra things." icon_state = "duffel" inhand_icon_state = "duffel" - slowdown = 1 + actions_types = list(/datum/action/item_action/zipper) + storage_type = /datum/storage/duffel + // How much to slow you down if your bag isn't zipped up + var/zip_slowdown = 1 + /// If this bag is zipped (contents hidden) up or not + /// Starts enabled so you're forced to interact with it to "get" it + var/zipped_up = TRUE + // How much time it takes to zip up (close) the duffelbag + var/zip_up_duration = 0.5 SECONDS + // Audio played during zipup + var/zip_up_sfx = 'sound/items/zip_up.ogg' + // How much time it takes to unzip the duffel + var/unzip_duration = 2.1 SECONDS + // Audio played during unzip + var/unzip_sfx = 'sound/items/un_zip.ogg' /obj/item/storage/backpack/duffelbag/Initialize(mapload) . = ..() - atom_storage.max_total_storage = 30 + set_zipper(TRUE) + +/obj/item/storage/backpack/duffelbag/update_desc(updates) + . = ..() + desc = "[initial(desc)]
[zipped_up ? "It's zipped up, preventing you from accessing its contents." : "It's unzipped, and harder to move in."]" + +/obj/item/storage/backpack/duffelbag/attack_self(mob/user, modifiers) + if(loc != user) // God fuck TK + return ..() + if(zipped_up) + return attack_hand(user, modifiers) + else + return attack_hand_secondary(user, modifiers) + +/obj/item/storage/backpack/duffelbag/attack_self_secondary(mob/user, modifiers) + attack_self(user, modifiers) + return ..() + +// If we're zipped, click to unzip +/obj/item/storage/backpack/duffelbag/attack_hand(mob/user, list/modifiers) + if(loc != user) + // Hacky, but please don't be cringe yeah? + atom_storage.silent = TRUE + . = ..() + atom_storage.silent = initial(atom_storage.silent) + return + if(!zipped_up) + return ..() + + balloon_alert(user, "unzipping...") + playsound(src, unzip_sfx, 100, FALSE) + var/datum/callback/can_unzip = CALLBACK(src, PROC_REF(zipper_matches), TRUE) + if(!do_after(user, unzip_duration, src, extra_checks = can_unzip)) + user.balloon_alert(user, "unzip failed!") + return + balloon_alert(user, "unzipped") + set_zipper(FALSE) + return TRUE + +// Vis versa +/obj/item/storage/backpack/duffelbag/attack_hand_secondary(mob/user, list/modifiers) + if(loc != user) + return ..() + if(zipped_up) + return SECONDARY_ATTACK_CALL_NORMAL + + balloon_alert(user, "zipping...") + playsound(src, zip_up_sfx, 100, FALSE) + var/datum/callback/can_zip = CALLBACK(src, PROC_REF(zipper_matches), FALSE) + if(!do_after(user, zip_up_duration, src, extra_checks = can_zip)) + user.balloon_alert(user, "zip failed!") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + balloon_alert(user, "zipped") + set_zipper(TRUE) + return SECONDARY_ATTACK_CONTINUE_CHAIN + +/// Checks to see if the zipper matches the passed in state +/// Returns true if so, false otherwise +/obj/item/storage/backpack/duffelbag/proc/zipper_matches(matching_value) + return zipped_up == matching_value + +/obj/item/storage/backpack/duffelbag/proc/set_zipper(new_zip) + zipped_up = new_zip + SEND_SIGNAL(src, COMSIG_DUFFEL_ZIP_CHANGE, new_zip) + if(zipped_up) + slowdown = initial(slowdown) + atom_storage.locked = STORAGE_SOFT_LOCKED + atom_storage.display_contents = FALSE + for(var/obj/item/weapon as anything in get_all_contents_type(/obj/item)) //close ui of this and all items inside dufflebag + weapon.atom_storage?.close_all() //not everything has storage initialized + else + slowdown = zip_slowdown + atom_storage.locked = STORAGE_NOT_LOCKED + atom_storage.display_contents = TRUE + + if(isliving(loc)) + var/mob/living/wearer = loc + wearer.update_equipment_speed_mods() + update_appearance() /obj/item/storage/backpack/duffelbag/cursed name = "living duffel bag" @@ -411,7 +496,7 @@ then it might have negative effects on the bag..." icon_state = "duffel-curse" inhand_icon_state = "duffel-curse" - slowdown = 2 + zip_slowdown = 2 max_integrity = 100 /obj/item/storage/backpack/duffelbag/cursed/Initialize(mapload) @@ -430,10 +515,6 @@ icon_state = "duffel-medical" inhand_icon_state = "duffel-med" -/obj/item/storage/backpack/duffelbag/med/surgery - name = "surgical duffel bag" - desc = "A large duffel bag for holding extra medical supplies - this one seems to be designed for holding surgical tools." - /obj/item/storage/backpack/duffelbag/coroner name = "coroner duffel bag" desc = "A large duffel bag for holding large amounts of organs at once." @@ -476,21 +557,6 @@ icon_state = "duffel-virology" inhand_icon_state = "duffel-virology" - - -/obj/item/storage/backpack/duffelbag/med/surgery/PopulateContents() - new /obj/item/scalpel(src) - new /obj/item/hemostat(src) - new /obj/item/retractor(src) - new /obj/item/circular_saw(src) - 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) - /obj/item/storage/backpack/duffelbag/sec name = "security duffel bag" desc = "A large duffel bag for holding extra security supplies and ammunition." @@ -551,15 +617,16 @@ /obj/item/storage/backpack/duffelbag/syndie name = "suspicious looking duffel bag" - desc = "A large duffel bag for holding extra tactical supplies." + desc = "A large duffel bag for holding extra tactical supplies. It contains an oiled plastitanium zipper for maximum speed tactical zipping, and is better balanced on your back than an average duffelbag. Can hold two bulky items!" icon_state = "duffel-syndie" inhand_icon_state = "duffel-syndieammo" - slowdown = 0 + storage_type = /datum/storage/duffel/syndicate resistance_flags = FIRE_PROOF - -/obj/item/storage/backpack/duffelbag/syndie/Initialize(mapload) - . = ..() - atom_storage.silent = TRUE + // Less slowdown while unzipped. Still bulky, but it won't halve your movement speed in an active combat situation. + zip_slowdown = 0.3 + // Faster unzipping. Utilizes the same noise as zipping up to fit the unzip duration. + unzip_duration = 0.5 SECONDS + unzip_sfx = 'sound/items/zip_up.ogg' /obj/item/storage/backpack/duffelbag/syndie/hitman desc = "A large duffel bag for holding extra things. There is a Nanotrasen logo on the back." @@ -567,7 +634,7 @@ inhand_icon_state = "duffel-syndieammo" /obj/item/storage/backpack/duffelbag/syndie/hitman/PopulateContents() - new /obj/item/clothing/under/suit/black(src) + new /obj/item/clothing/under/costume/buttondown/slacks/service(src) new /obj/item/clothing/neck/tie/red/hitman(src) new /obj/item/clothing/accessory/waistcoat(src) new /obj/item/clothing/suit/toggle/lawyer/black(src) @@ -594,12 +661,11 @@ new /obj/item/cautery/advanced(src) new /obj/item/surgical_drapes(src) new /obj/item/reagent_containers/medigel/sterilizine(src) - new /obj/item/surgicaldrill(src) new /obj/item/bonesetter(src) new /obj/item/blood_filter(src) new /obj/item/stack/medical/bone_gel(src) new /obj/item/stack/sticky_tape/surgical(src) - new /obj/item/roller(src) + new /obj/item/emergency_bed(src) new /obj/item/clothing/suit/jacket/straight_jacket(src) new /obj/item/clothing/mask/muzzle(src) new /obj/item/mmi/syndie(src) @@ -610,23 +676,6 @@ icon_state = "duffel-syndieammo" inhand_icon_state = "duffel-syndieammo" -/obj/item/storage/backpack/duffelbag/syndie/ammo/shotgun - desc = "A large duffel bag, packed to the brim with Bulldog shotgun magazines." - -/obj/item/storage/backpack/duffelbag/syndie/ammo/shotgun/PopulateContents() - for(var/i in 1 to 6) - new /obj/item/ammo_box/magazine/m12g(src) - new /obj/item/ammo_box/magazine/m12g/slug(src) - new /obj/item/ammo_box/magazine/m12g/slug(src) - new /obj/item/ammo_box/magazine/m12g/dragon(src) - -/obj/item/storage/backpack/duffelbag/syndie/ammo/smg - desc = "A large duffel bag, packed to the brim with C-20r magazines." - -/obj/item/storage/backpack/duffelbag/syndie/ammo/smg/PopulateContents() - for(var/i in 1 to 9) - new /obj/item/ammo_box/magazine/smgm45(src) - /obj/item/storage/backpack/duffelbag/syndie/ammo/mech desc = "A large duffel bag, packed to the brim with various exosuit ammo." @@ -651,30 +700,12 @@ new /obj/item/mecha_ammo/missiles_srm(src) new /obj/item/mecha_ammo/missiles_srm(src) -/obj/item/storage/backpack/duffelbag/syndie/c20rbundle - desc = "A large duffel bag containing a C-20r, some magazines, and a cheap looking suppressor." - -/obj/item/storage/backpack/duffelbag/syndie/c20rbundle/PopulateContents() - new /obj/item/ammo_box/magazine/smgm45(src) - new /obj/item/ammo_box/magazine/smgm45(src) - new /obj/item/gun/ballistic/automatic/c20r(src) - new /obj/item/suppressor(src) - -/obj/item/storage/backpack/duffelbag/syndie/bulldogbundle - desc = "A large duffel bag containing a Bulldog, some drums, and a pair of thermal imaging glasses." - -/obj/item/storage/backpack/duffelbag/syndie/bulldogbundle/PopulateContents() - new /obj/item/gun/ballistic/shotgun/bulldog(src) - new /obj/item/ammo_box/magazine/m12g(src) - new /obj/item/ammo_box/magazine/m12g(src) - 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 magboot MODsuit module." /obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle/PopulateContents() new /obj/item/mod/module/magboot(src) - new /obj/item/storage/medkit/tactical(src) + new /obj/item/storage/medkit/tactical/premium(src) new /obj/item/gun/ballistic/automatic/l6_saw/toy(src) new /obj/item/ammo_box/foambox/riot(src) @@ -714,10 +745,8 @@ new /obj/item/grenade/syndieminibomb(src) // For ClownOps. -/obj/item/storage/backpack/duffelbag/clown/syndie/Initialize(mapload) - . = ..() - slowdown = 0 - atom_storage.silent = TRUE +/obj/item/storage/backpack/duffelbag/clown/syndie + storage_type = /datum/storage/duffel/syndicate /obj/item/storage/backpack/duffelbag/clown/syndie/PopulateContents() new /obj/item/modular_computer/pda/clown(src) @@ -736,11 +765,10 @@ /obj/item/storage/backpack/duffelbag/cops name = "police bag" desc = "A large duffel bag for holding extra police gear." - slowdown = 0 /obj/item/storage/backpack/duffelbag/mining_conscript name = "mining conscription kit" - desc = "A kit containing everything a crewmember needs to support a shaft miner in the field." + desc = "A duffel bag containing everything a crewmember needs to support a shaft miner in the field." icon_state = "duffel-explorer" inhand_icon_state = "duffel-explorer" @@ -755,3 +783,90 @@ new /obj/item/gun/energy/recharge/kinetic_accelerator(src) new /obj/item/knife/combat/survival(src) new /obj/item/flashlight/seclite(src) + +/* + * Messenger Bag Types + */ + +/obj/item/storage/backpack/messenger + name = "messenger bag" + desc = "A trendy looking messenger bag; sometimes known as a courier bag. Fashionable and portable." + icon_state = "messenger" + inhand_icon_state = "messenger" + icon = 'icons/obj/storage/backpack.dmi' + worn_icon = 'icons/mob/clothing/back/backpack.dmi' + lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi' + +/obj/item/storage/backpack/messenger/eng + name = "industrial messenger bag" + desc = "A tough messenger bag made of advanced treated leather for fireproofing. It also has more pockets than usual." + icon_state = "messenger_engineering" + inhand_icon_state = "messenger_engineering" + resistance_flags = FIRE_PROOF + +/obj/item/storage/backpack/messenger/med + name = "medical messenger bag" + desc = "A sterile messenger bag well loved by medics for its portability and sleek profile." + icon_state = "messenger_medical" + inhand_icon_state = "messenger_medical" + +/obj/item/storage/backpack/messenger/vir + name = "virologist messenger bag" + desc = "A sterile messenger bag with virologist colours, useful for deploying biohazards in record times." + icon_state = "messenger_virology" + inhand_icon_state = "messenger_virology" + +/obj/item/storage/backpack/messenger/chem + name = "chemist messenger bag" + desc = "A sterile messenger bag with chemist colours, good for getting to your alleyway deals on time." + icon_state = "messenger_chemistry" + inhand_icon_state = "messenger_chemistry" + +/obj/item/storage/backpack/messenger/coroner + name = "coroner messenger bag" + desc = "A messenger bag used to sneak your way out of graveyards at a good pace." + icon_state = "messenger_coroner" + inhand_icon_state = "messenger_coroner" + +/obj/item/storage/backpack/messenger/gen + name = "geneticist messenger bag" + desc = "A sterile messenger bag with geneticist colours, making a remarkably cute accessory for hulks." + icon_state = "messenger_genetics" + inhand_icon_state = "messenger_genetics" + +/obj/item/storage/backpack/messenger/science + name = "scientist messenger bag" + desc = "Useful for holding research materials, and for speeding your way to different scan objectives." + icon_state = "messenger_science" + inhand_icon_state = "messenger_science" + +/obj/item/storage/backpack/messenger/hyd + name = "botanist messenger bag" + desc = "A messenger bag made of all natural fibers, great for getting to the sesh in time." + icon_state = "messenger_hydroponics" + inhand_icon_state = "messenger_hydroponics" + +/obj/item/storage/backpack/messenger/sec + name = "security messenger bag" + desc = "A robust messenger bag for security related needs." + icon_state = "messenger_security" + inhand_icon_state = "messenger_security" + +/obj/item/storage/backpack/messenger/explorer + name = "explorer messenger bag" + desc = "A robust messenger bag for stashing your loot, as well as making a remarkably cute accessory for your drakebone armor." + icon_state = "messenger_explorer" + inhand_icon_state = "messenger_explorer" + +/obj/item/storage/backpack/messenger/cap + name = "captain's messenger bag" + desc = "An exclusive messenger bag for Nanotrasen officers, made of real whale leather." + icon_state = "messenger_captain" + inhand_icon_state = "messenger_captain" + +/obj/item/storage/backpack/messenger/clown + name = "Giggles von Honkerton Jr." + desc = "The latest in storage 'technology' from Honk Co. Hey, how does this fit so much with such a small profile anyway? The wearer will definitely never tell you." + icon_state = "messenger_clown" + inhand_icon_state = "messenger_clown" diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index b8d05d4e22938..466a201ff7089 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -34,7 +34,7 @@ /obj/item/storage/bag/trash name = "trash bag" desc = "It's the heavy-duty black polymer kind. Time to take out the trash!" - icon = 'icons/obj/janitor.dmi' + icon = 'icons/obj/service/janitor.dmi' icon_state = "trashbag" inhand_icon_state = "trashbag" lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi' @@ -222,7 +222,7 @@ /obj/item/storage/bag/plants name = "plant bag" - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "plantbag" worn_icon_state = "plantbag" resistance_flags = FLAMMABLE @@ -315,7 +315,7 @@ /obj/item/storage/bag/books name = "book bag" desc = "A bag for books." - icon = 'icons/obj/library.dmi' + icon = 'icons/obj/service/library.dmi' icon_state = "bookbag" worn_icon_state = "bookbag" resistance_flags = FLAMMABLE @@ -325,7 +325,11 @@ atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL atom_storage.max_total_storage = 21 atom_storage.max_slots = 7 - atom_storage.set_holdable(list(/obj/item/book, /obj/item/spellbook)) + atom_storage.set_holdable(list( + /obj/item/book, + /obj/item/spellbook, + /obj/item/poster, + )) /* * Trays - Agouri @@ -541,7 +545,7 @@ /obj/item/storage/bag/harpoon_quiver name = "harpoon quiver" desc = "A quiver for holding harpoons." - icon = 'icons/obj/weapons/guns/bows/quivers.dmi' + icon = 'icons/obj/weapons/bows/quivers.dmi' icon_state = "quiver" inhand_icon_state = null worn_icon_state = "harpoon_quiver" @@ -552,11 +556,11 @@ atom_storage.max_slots = 40 atom_storage.max_total_storage = 100 atom_storage.set_holdable(list( - /obj/item/ammo_casing/caseless/harpoon + /obj/item/ammo_casing/harpoon )) /obj/item/storage/bag/harpoon_quiver/PopulateContents() for(var/i in 1 to 40) - new /obj/item/ammo_casing/caseless/harpoon(src) + new /obj/item/ammo_casing/harpoon(src) #undef ORE_BAG_BALOON_COOLDOWN diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 4090d07fa6c0e..1c223c50f3d39 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -75,6 +75,7 @@ /obj/item/wirecutters, /obj/item/wrench, /obj/item/spess_knife, + /obj/item/melee/sickly_blade/knock, )) /obj/item/storage/belt/utility/chief @@ -554,7 +555,7 @@ /obj/item/storage/belt/military/abductor name = "agent belt" desc = "A belt used by abductor agents." - icon = 'icons/obj/abductor.dmi' + icon = 'icons/obj/antags/abductor.dmi' icon_state = "belt" inhand_icon_state = "security" worn_icon_state = "security" @@ -619,11 +620,10 @@ /obj/item/storage/belt/grenade/full/PopulateContents() generate_items_inside(list( - /obj/item/grenade/chem_grenade/facid = 1, /obj/item/grenade/chem_grenade/incendiary = 2, /obj/item/grenade/empgrenade = 2, /obj/item/grenade/frag = 10, - /obj/item/grenade/flashbang = 1, + /obj/item/grenade/flashbang = 2, /obj/item/grenade/gluon = 4, /obj/item/grenade/smokebomb = 4, /obj/item/grenade/syndieminibomb = 2, @@ -670,6 +670,7 @@ atom_storage.max_slots = 6 atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL // Set to this so the light replacer can fit. atom_storage.set_holdable(list( + /obj/item/access_key, /obj/item/assembly/mousetrap, /obj/item/clothing/gloves, /obj/item/flashlight, @@ -707,13 +708,13 @@ atom_storage.max_total_storage = 18 atom_storage.numerical_stacking = TRUE atom_storage.set_holdable(list( - /obj/item/ammo_casing/a762, + /obj/item/ammo_casing/strilka310, /obj/item/ammo_casing/shotgun, )) /obj/item/storage/belt/fannypack name = "fannypack" - desc = "A dorky fannypack for keeping small items in." + desc = "A dorky fannypack for keeping small items in. Concealed enough, or ugly enough to avert their eyes, that others won't see what you put in or take out easily." icon_state = "fannypack_leather" inhand_icon_state = null worn_icon_state = "fannypack_leather" @@ -724,6 +725,7 @@ . = ..() atom_storage.max_slots = 3 atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL + atom_storage.silent = TRUE /obj/item/storage/belt/fannypack/black name = "black fannypack" diff --git a/code/game/objects/items/storage/boxes/engineering_boxes.dm b/code/game/objects/items/storage/boxes/engineering_boxes.dm index 8114154e1c63a..de975d9dbfea4 100644 --- a/code/game/objects/items/storage/boxes/engineering_boxes.dm +++ b/code/game/objects/items/storage/boxes/engineering_boxes.dm @@ -22,6 +22,13 @@ name = "box of materials" illustration = "implant" +/obj/item/storage/box/material/Initialize(mapload) + . = ..() + atom_storage.allow_big_nesting = TRUE + atom_storage.max_slots = 99 + atom_storage.max_specific_storage = WEIGHT_CLASS_GIGANTIC + atom_storage.max_total_storage = 99 + /obj/item/storage/box/material/PopulateContents() //less uranium because radioactive var/static/items_inside = list( /obj/item/stack/sheet/iron/fifty=1, @@ -50,6 +57,13 @@ name = "box of debug tools" icon_state = "syndiebox" +/obj/item/storage/box/debugtools/Initialize(mapload) + . = ..() + atom_storage.allow_big_nesting = TRUE + atom_storage.max_slots = 99 + atom_storage.max_specific_storage = WEIGHT_CLASS_GIGANTIC + atom_storage.max_total_storage = 99 + /obj/item/storage/box/debugtools/PopulateContents() var/static/items_inside = list( /obj/item/card/emag=1, diff --git a/code/game/objects/items/storage/boxes/food_boxes.dm b/code/game/objects/items/storage/boxes/food_boxes.dm index fc32176139e27..3e23d604f6df5 100644 --- a/code/game/objects/items/storage/boxes/food_boxes.dm +++ b/code/game/objects/items/storage/boxes/food_boxes.dm @@ -143,6 +143,13 @@ for(var/i in 1 to 7) new /obj/item/food/meat/slab(src) +/obj/item/storage/box/papersack/wheat + desc = "It's a bit dusty, and smells like a barnyard." + +/obj/item/storage/box/papersack/wheat/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/food/grown/wheat(src) + /obj/item/storage/box/ingredients //This box is for the randomly chosen version the chef used to spawn with, it shouldn't actually exist. name = "ingredients box" illustration = "fruit" @@ -306,7 +313,7 @@ new /obj/item/food/grown/onion/red(src) new /obj/item/food/grown/onion/red(src) new /obj/item/food/grown/tomato(src) - new /obj/item/reagent_containers/condiment/quality_oil(src) + new /obj/item/reagent_containers/condiment/olive_oil(src) /obj/item/storage/box/ingredients/random theme_name = "random" @@ -459,7 +466,7 @@ /obj/item/food/cheese/wheel = 5, /obj/item/food/grown/toechtauese = 10, /obj/item/reagent_containers/condiment/cornmeal = 5, - /obj/item/reagent_containers/condiment/quality_oil = 5, + /obj/item/reagent_containers/condiment/olive_oil = 5, /obj/item/reagent_containers/condiment/yoghurt = 5, )) new random_food(src) diff --git a/code/game/objects/items/storage/boxes/job_boxes.dm b/code/game/objects/items/storage/boxes/job_boxes.dm index 4ae3de9cadc84..bb656061c1c55 100644 --- a/code/game/objects/items/storage/boxes/job_boxes.dm +++ b/code/game/objects/items/storage/boxes/job_boxes.dm @@ -42,6 +42,12 @@ new /obj/item/flashlight/flare(src) new /obj/item/radio/off(src) + if(HAS_TRAIT(SSstation, STATION_TRAIT_RADIOACTIVE_NEBULA)) + new /obj/item/storage/pill_bottle/potassiodide(src) + + if(SSmapping.is_planetary() && LAZYLEN(SSmapping.multiz_levels)) + new /obj/item/climbing_hook/emergency(src) + /obj/item/storage/box/survival/radio/PopulateContents() ..() // we want the survival stuff too. new /obj/item/radio/off(src) @@ -62,6 +68,7 @@ /obj/item/storage/box/survival/mining/PopulateContents() ..() new /obj/item/crowbar/red(src) + new /obj/item/healthanalyzer/simple/miner(src) // Engineer survival box /obj/item/storage/box/survival/engineer @@ -86,29 +93,11 @@ /obj/item/storage/box/survival/syndie/PopulateContents() ..() - new /obj/item/tool_parcel(src) + new /obj/item/crowbar/red(src) + new /obj/item/screwdriver/red(src) + new /obj/item/weldingtool/mini(src) new /obj/item/paper/fluff/operative(src) -/obj/item/tool_parcel - name = "operative toolkit care package" - desc = "A small parcel. It contains a few items every operative needs." - w_class = WEIGHT_CLASS_SMALL - icon = 'icons/obj/storage/wrapping.dmi' - icon_state = "deliverypackage2" - -/obj/item/tool_parcel/attack_self(mob/user) - . = ..() - new /obj/item/crowbar/red(get_turf(user)) - new /obj/item/screwdriver/red(get_turf(user)) - new /obj/item/weldingtool/mini(get_turf(user)) - new /obj/effect/decal/cleanable/wrapping(get_turf(user)) - if(prob(5)) - new /obj/item/storage/fancy/cigarettes/cigpack_syndicate(get_turf(user)) - new /obj/item/lighter(get_turf(user)) - to_chat(user, span_notice("...oh, someone left some cigarettes in here.")) - playsound(loc, 'sound/items/poster_ripped.ogg', 20, TRUE) - qdel(src) - /obj/item/storage/box/survival/centcom name = "emergency response survival box" desc = "A box with the bare essentials of ensuring the survival of your team. This one is labelled to contain a double tank." @@ -149,7 +138,7 @@ /obj/item/storage/box/mime/attack_hand(mob/user, list/modifiers) ..() - if(HAS_TRAIT(user, TRAIT_MIMING)) + if(HAS_MIND_TRAIT(user, TRAIT_MIMING)) alpha = 255 /obj/item/storage/box/mime/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) @@ -221,11 +210,23 @@ illustration = "heart" foldable_result = null mask_type = null + var/random_funny_internals = TRUE + +/obj/item/storage/box/survival/hug/PopulateContents() + if(!random_funny_internals) + return ..() + internal_type = pick( + /obj/item/tank/internals/emergency_oxygen/engi/clown/n2o, + /obj/item/tank/internals/emergency_oxygen/engi/clown/bz, + /obj/item/tank/internals/emergency_oxygen/engi/clown/helium, + ) + return ..() //Mime survival box /obj/item/storage/box/survival/hug/black icon_state = "hugbox_black" illustration = "heart_black" + random_funny_internals = FALSE //Duplicated suicide/attack self procs, since the survival boxes are a subtype of box/survival /obj/item/storage/box/survival/hug/suicide_act(mob/living/user) diff --git a/code/game/objects/items/storage/boxes/medical_boxes.dm b/code/game/objects/items/storage/boxes/medical_boxes.dm index ad0fd9b37f54b..0e3e800bef881 100644 --- a/code/game/objects/items/storage/boxes/medical_boxes.dm +++ b/code/game/objects/items/storage/boxes/medical_boxes.dm @@ -129,3 +129,42 @@ /obj/item/reagent_containers/cup/beaker/meta/rezadone = 1, ) generate_items_inside(items_inside, src) + +/obj/item/storage/box/bandages + name = "box of bandages" + desc = "A box of DeForest brand gel bandages designed to treat blunt-force trauma." + icon_state = "brutebox" + base_icon_state = "brutebox" + inhand_icon_state = "brutebox" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + drop_sound = 'sound/items/handling/matchbox_drop.ogg' + pickup_sound = 'sound/items/handling/matchbox_pickup.ogg' + illustration = null + w_class = WEIGHT_CLASS_SMALL + custom_price = PAYCHECK_CREW * 1.75 + +/obj/item/storage/box/bandages/Initialize(mapload) + . = ..() + atom_storage.max_slots = 6 + atom_storage.set_holdable(list( + /obj/item/stack/medical/bandage, + /obj/item/reagent_containers/pill, + /obj/item/reagent_containers/pill/patch, + )) + +/obj/item/storage/box/bandages/PopulateContents() + for(var/i in 1 to 5) + new /obj/item/stack/medical/bandage(src) + +/obj/item/storage/box/bandages/update_icon_state() + . = ..() + switch(length(contents)) + if(5) + icon_state = "[base_icon_state]_f" + if(3 to 4) + icon_state = "[base_icon_state]_almostfull" + if(1 to 2) + icon_state = "[base_icon_state]_almostempty" + if(0) + icon_state = base_icon_state diff --git a/code/game/objects/items/storage/boxes/science_boxes.dm b/code/game/objects/items/storage/boxes/science_boxes.dm index 871b80cc29812..cc8d0e7f3d045 100644 --- a/code/game/objects/items/storage/boxes/science_boxes.dm +++ b/code/game/objects/items/storage/boxes/science_boxes.dm @@ -112,6 +112,13 @@ name = "box of stabilized extracts" icon_state = "syndiebox" +/obj/item/storage/box/stabilized/Initialize(mapload) + . = ..() + atom_storage.allow_big_nesting = TRUE + atom_storage.max_slots = 99 + atom_storage.max_specific_storage = WEIGHT_CLASS_GIGANTIC + atom_storage.max_total_storage = 99 + /obj/item/storage/box/stabilized/PopulateContents() var/static/items_inside = list( /obj/item/slimecross/stabilized/adamantine=1, diff --git a/code/game/objects/items/storage/boxes/security_boxes.dm b/code/game/objects/items/storage/boxes/security_boxes.dm index 7cdb604d4badd..9c401f999078e 100644 --- a/code/game/objects/items/storage/boxes/security_boxes.dm +++ b/code/game/objects/items/storage/boxes/security_boxes.dm @@ -238,6 +238,16 @@ for(var/i in 1 to 6) new /obj/item/ammo_casing/shotgun/beanbag(src) +/obj/item/storage/box/breacherslug + name = "box of breaching shotgun shells" + desc = "A box full of breaching slugs, designed for rapid entry, not very effective against anything else." + icon_state = "breacher_box" + illustration = null + +/obj/item/storage/box/breacherslug/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/ammo_casing/shotgun/breacher(src) + /obj/item/storage/box/emptysandbags name = "box of empty sandbags" illustration = "sandbag" diff --git a/code/game/objects/items/storage/briefcase.dm b/code/game/objects/items/storage/briefcase.dm index 299c10df5af2c..4d120b05a28b8 100644 --- a/code/game/objects/items/storage/briefcase.dm +++ b/code/game/objects/items/storage/briefcase.dm @@ -60,15 +60,15 @@ user.visible_message(span_suicide("[user] looks overwhelmed with paperwork! It looks like [user.p_theyre()] trying to commit suicide!")) return OXYLOSS -/obj/item/storage/briefcase/sniperbundle +/obj/item/storage/briefcase/sniper desc = "Its label reads \"genuine hardened Captain leather\", but suspiciously has no other tags or branding. Smells like L'Air du Temps." force = 10 -/obj/item/storage/briefcase/sniperbundle/PopulateContents() +/obj/item/storage/briefcase/sniper/PopulateContents() ..() // in case you need any paperwork done after your rampage new /obj/item/gun/ballistic/rifle/sniper_rifle/syndicate(src) new /obj/item/clothing/neck/tie/red/hitman(src) new /obj/item/clothing/under/syndicate/sniper(src) + new /obj/item/ammo_box/magazine/sniper_rounds(src) + new /obj/item/ammo_box/magazine/sniper_rounds(src) new /obj/item/ammo_box/magazine/sniper_rounds/disruptor(src) - new /obj/item/ammo_box/magazine/sniper_rounds/disruptor(src) - new /obj/item/suppressor(src) diff --git a/code/game/objects/items/storage/garment.dm b/code/game/objects/items/storage/garment.dm index 5ce65ae860863..ca3c6500b4e9e 100644 --- a/code/game/objects/items/storage/garment.dm +++ b/code/game/objects/items/storage/garment.dm @@ -14,6 +14,10 @@ name = "head of security's garment bag" desc = "A bag for storing extra clothes and shoes. This one belongs to the head of security." +/obj/item/storage/bag/garment/warden + name = "warden's garment bag" + desc = "A bag for storing extra clothes and shoes. This one belongs to the warden." + /obj/item/storage/bag/garment/hop name = "head of personnel's garment bag" desc = "A bag for storing extra clothes and shoes. This one belongs to the head of personnel." @@ -88,6 +92,18 @@ new /obj/item/clothing/mask/gas/sechailer/swat(src) new /obj/item/clothing/neck/cloak/hos(src) +/obj/item/storage/bag/garment/warden/PopulateContents() + new /obj/item/clothing/suit/armor/vest/warden(src) + new /obj/item/clothing/head/hats/warden(src) + new /obj/item/clothing/head/hats/warden/drill(src) + new /obj/item/clothing/head/beret/sec/navywarden(src) + new /obj/item/clothing/suit/armor/vest/warden/alt(src) + new /obj/item/clothing/under/rank/security/warden/formal(src) + new /obj/item/clothing/under/rank/security/warden/skirt(src) + new /obj/item/clothing/gloves/krav_maga/sec(src) + new /obj/item/clothing/glasses/hud/security/sunglasses(src) + new /obj/item/clothing/mask/gas/sechailer(src) + /obj/item/storage/bag/garment/research_director/PopulateContents() new /obj/item/clothing/under/rank/rnd/research_director(src) new /obj/item/clothing/under/rank/rnd/research_director/skirt(src) @@ -130,6 +146,7 @@ new /obj/item/clothing/suit/hooded/wintercoat/cargo/qm(src) new /obj/item/clothing/suit/utility/fire/firefighter(src) new /obj/item/clothing/gloves/fingerless(src) + new /obj/item/clothing/suit/jacket/quartermaster(src) new /obj/item/clothing/head/soft(src) new /obj/item/clothing/mask/gas(src) new /obj/item/clothing/neck/cloak/qm(src) diff --git a/code/game/objects/items/storage/holsters.dm b/code/game/objects/items/storage/holsters.dm index afeb1377dbc43..cb44de3485dbd 100644 --- a/code/game/objects/items/storage/holsters.dm +++ b/code/game/objects/items/storage/holsters.dm @@ -30,6 +30,8 @@ /obj/item/food/grown/banana, /obj/item/gun/energy/laser/thermal, /obj/item/gun/ballistic/rifle/boltaction, //fits if you make it an obrez + /obj/item/gun/energy/laser/captain, + /obj/item/gun/energy/e_gun/hos, )) /obj/item/storage/belt/holster/energy @@ -47,6 +49,8 @@ /obj/item/food/grown/banana, /obj/item/gun/energy/laser/thermal, /obj/item/gun/energy/recharge/ebow, + /obj/item/gun/energy/laser/captain, + /obj/item/gun/energy/e_gun/hos, )) /obj/item/storage/belt/holster/energy/thermal @@ -67,6 +71,14 @@ /obj/item/gun/energy/disabler = 1, ),src) +/obj/item/storage/belt/holster/energy/smoothbore + desc = "A rather plain pair of shoulder holsters with a bit of insulated padding inside. Designed to hold energy weaponry. Seems it was meant to fit two smoothbores." + +/obj/item/storage/belt/holster/energy/smoothbore/PopulateContents() + generate_items_inside(list( + /obj/item/gun/energy/disabler/smoothbore = 2, + ),src) + /obj/item/storage/belt/holster/detective name = "detective's holster" desc = "A holster able to carry handguns and some ammo. WARNING: Badasses only." @@ -86,12 +98,14 @@ /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/strilka310, /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/gun/energy/laser/captain, + /obj/item/gun/energy/e_gun/hos, /obj/item/gun/ballistic/rifle/boltaction, //fits if you make it an obrez )) @@ -121,7 +135,7 @@ inhand_icon_state = "syndicate_holster" worn_icon_state = "syndicate_holster" w_class = WEIGHT_CLASS_NORMAL - var/datum/action/item_action/chameleon/change/chameleon_action + actions_types = list(/datum/action/item_action/chameleon/change/belt) /obj/item/storage/belt/holster/chameleon/Initialize(mapload) . = ..() @@ -137,32 +151,18 @@ /obj/item/gun/ballistic/revolver, /obj/item/ammo_box/c38, /obj/item/ammo_box/a357, - /obj/item/ammo_box/a762, + /obj/item/ammo_box/strilka310, /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/gun/energy/dueling, + /obj/item/gun/energy/laser/captain, + /obj/item/gun/energy/e_gun/hos, )) atom_storage.silent = TRUE - 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/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/nukie name = "operative holster" desc = "A deep shoulder holster capable of holding almost any form of firearm and its ammo." @@ -180,7 +180,7 @@ /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_box/strilka310, /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 59eb86137a838..79ab5003bc2a9 100644 --- a/code/game/objects/items/storage/lockbox.dm +++ b/code/game/objects/items/storage/lockbox.dm @@ -30,7 +30,10 @@ balloon_alert(user, "broken!") return if(allowed(user)) - atom_storage.locked = !locked + if(atom_storage.locked) + atom_storage.locked = STORAGE_NOT_LOCKED + else + atom_storage.locked = STORAGE_FULLY_LOCKED locked = atom_storage.locked if(locked) icon_state = icon_locked @@ -49,14 +52,16 @@ else balloon_alert(user, "locked!") -/obj/item/storage/lockbox/emag_act(mob/user) +/obj/item/storage/lockbox/emag_act(mob/user, obj/item/card/emag/emag_card) if(!broken) broken = TRUE - atom_storage.locked = FALSE + atom_storage.locked = STORAGE_NOT_LOCKED icon_state = src.icon_broken - if(user) - visible_message(span_warning("\The [src] is broken by [user] with an electromagnetic card!")) - return + balloon_alert(user, "lock destroyed") + if (emag_card && user) + user.visible_message(span_warning("[user] swipes [emag_card] over [src], breaking it!")) + return TRUE + return FALSE /obj/item/storage/lockbox/examine(mob/user) . = ..() @@ -116,11 +121,12 @@ . += span_notice("Alt-click to [open ? "close":"open"] it.") /obj/item/storage/lockbox/medal/AltClick(mob/user) - if(user.can_perform_action(src)) - if(!atom_storage.locked) - open = (open ? FALSE : TRUE) - update_appearance() - ..() + if(!user.can_perform_action(src)) + return + if(!atom_storage.locked) + open = (open ? FALSE : TRUE) + update_appearance() + ..() /obj/item/storage/lockbox/medal/PopulateContents() new /obj/item/clothing/accessory/medal/gold/captain(src) @@ -185,6 +191,8 @@ /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) + for(var/i in 1 to 3) + new /obj/item/clothing/accessory/medal/silver/emergency_services/medical(src) /obj/item/storage/lockbox/medal/sec/PopulateContents() for(var/i in 1 to 3) @@ -215,6 +223,16 @@ for(var/i in 1 to 3) new /obj/item/clothing/accessory/medal/plasma/nobel_science(src) +/obj/item/storage/lockbox/medal/engineering + name = "engineering medal box" + desc = "A locked box used to store awards to be given to members of the engineering department." + req_access = list(ACCESS_CE) + +/obj/item/storage/lockbox/medal/engineering/PopulateContents() + for(var/i in 1 to 3) + new /obj/item/clothing/accessory/medal/silver/emergency_services/engineering(src) + new /obj/item/clothing/accessory/medal/silver/elder_atmosian(src) + /obj/item/storage/lockbox/order name = "order lockbox" desc = "A box used to secure small cargo orders from being looted by those who didn't order it. Yeah, cargo tech, that means you." @@ -244,7 +262,10 @@ balloon_alert(user, "incorrect bank account!") return - atom_storage.locked = !privacy_lock + if(privacy_lock) + atom_storage.locked = STORAGE_NOT_LOCKED + else + atom_storage.locked = STORAGE_FULLY_LOCKED privacy_lock = atom_storage.locked user.visible_message(span_notice("[user] [privacy_lock ? "" : "un"]locks [src]'s privacy lock."), span_notice("You [privacy_lock ? "" : "un"]lock [src]'s privacy lock.")) diff --git a/code/game/objects/items/storage/medkit.dm b/code/game/objects/items/storage/medkit.dm index 70fd75c04b167..4b08d1551a34e 100644 --- a/code/game/objects/items/storage/medkit.dm +++ b/code/game/objects/items/storage/medkit.dm @@ -19,7 +19,62 @@ throw_speed = 3 throw_range = 7 var/empty = FALSE - var/damagetype_healed //defines damage type of the medkit. General ones stay null. Used for medibot healing bonuses + /// Defines damage type of the medkit. General ones stay null. Used for medibot healing bonuses + var/damagetype_healed + /// you just type this in holdables list of medkits instead of copypasting bunch of text. + var/static/list/list_of_everything_medkits_can_hold = list( + /obj/item/healthanalyzer, + /obj/item/dnainjector, + /obj/item/reagent_containers/dropper, + /obj/item/reagent_containers/cup/beaker, + /obj/item/reagent_containers/cup/bottle, + /obj/item/reagent_containers/cup/tube, + /obj/item/reagent_containers/pill, + /obj/item/reagent_containers/syringe, + /obj/item/reagent_containers/medigel, + /obj/item/reagent_containers/spray, + /obj/item/lighter, + /obj/item/storage/box/bandages, + /obj/item/storage/fancy/cigarettes, + /obj/item/storage/pill_bottle, + /obj/item/stack/medical, + /obj/item/flashlight/pen, + /obj/item/extinguisher/mini, + /obj/item/reagent_containers/hypospray, + /obj/item/sensor_device, + /obj/item/radio, + /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, + /obj/item/scalpel, + /obj/item/circular_saw, + /obj/item/bonesetter, + /obj/item/surgicaldrill, + /obj/item/retractor, + /obj/item/cautery, + /obj/item/hemostat, + /obj/item/blood_filter, + /obj/item/shears, + /obj/item/geiger_counter, + /obj/item/clothing/neck/stethoscope, + /obj/item/stamp, + /obj/item/clothing/glasses, + /obj/item/wrench/medical, + /obj/item/clothing/mask/muzzle, + /obj/item/reagent_containers/blood, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/gun/syringe/syndicate, + /obj/item/implantcase, + /obj/item/implant, + /obj/item/implanter, + /obj/item/pinpointer/crew, + /obj/item/holosign_creator/medical, + /obj/item/stack/sticky_tape, + ) /obj/item/storage/medkit/Initialize(mapload) . = ..() @@ -41,6 +96,7 @@ /obj/item/stack/medical/suture = 2, /obj/item/stack/medical/mesh = 2, /obj/item/reagent_containers/hypospray/medipen = 1, + /obj/item/healthanalyzer/simple = 1, ) generate_items_inside(items_inside,src) @@ -53,7 +109,7 @@ if(empty) return var/static/items_inside = list( - /obj/item/healthanalyzer/wound = 1, + /obj/item/healthanalyzer/simple = 1, /obj/item/stack/medical/gauze = 1, /obj/item/stack/medical/suture/emergency = 1, /obj/item/stack/medical/ointment = 1, @@ -73,58 +129,7 @@ atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL //holds the same equipment as a medibelt atom_storage.max_slots = 12 atom_storage.max_total_storage = 24 - atom_storage.set_holdable(list( - /obj/item/healthanalyzer, - /obj/item/dnainjector, - /obj/item/reagent_containers/dropper, - /obj/item/reagent_containers/cup/beaker, - /obj/item/reagent_containers/cup/bottle, - /obj/item/reagent_containers/cup/tube, - /obj/item/reagent_containers/pill, - /obj/item/reagent_containers/syringe, - /obj/item/reagent_containers/medigel, - /obj/item/reagent_containers/spray, - /obj/item/lighter, - /obj/item/storage/fancy/cigarettes, - /obj/item/storage/pill_bottle, - /obj/item/stack/medical, - /obj/item/flashlight/pen, - /obj/item/extinguisher/mini, - /obj/item/reagent_containers/hypospray, - /obj/item/sensor_device, - /obj/item/radio, - /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, - /obj/item/surgicaldrill, - /obj/item/retractor, - /obj/item/cautery, - /obj/item/hemostat, - /obj/item/blood_filter, - /obj/item/shears, - /obj/item/geiger_counter, - /obj/item/clothing/neck/stethoscope, - /obj/item/stamp, - /obj/item/clothing/glasses, - /obj/item/wrench/medical, - /obj/item/clothing/mask/muzzle, - /obj/item/reagent_containers/blood, - /obj/item/tank/internals/emergency_oxygen, - /obj/item/gun/syringe/syndicate, - /obj/item/implantcase, - /obj/item/implant, - /obj/item/implanter, - /obj/item/pinpointer/crew, - /obj/item/holosign_creator/medical, - /obj/item/stack/sticky_tape, //surgical tape - )) + atom_storage.set_holdable(list_of_everything_medkits_can_hold) /obj/item/storage/medkit/surgery/PopulateContents() if(empty) @@ -196,10 +201,12 @@ if(empty) return var/static/items_inside = list( - /obj/item/storage/pill_bottle/multiver/less = 1, + /obj/item/storage/pill_bottle/multiver/less = 1, /obj/item/reagent_containers/syringe/syriniver = 3, /obj/item/storage/pill_bottle/potassiodide = 1, - /obj/item/reagent_containers/hypospray/medipen/penacid = 1) + /obj/item/reagent_containers/hypospray/medipen/penacid = 1, + /obj/item/healthanalyzer/simple/disease = 1, + ) generate_items_inside(items_inside,src) /obj/item/storage/medkit/o2 @@ -241,7 +248,9 @@ /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/hypospray/medipen/salacid = 1, + /obj/item/healthanalyzer/simple = 1, + ) generate_items_inside(items_inside,src) /obj/item/storage/medkit/advanced @@ -272,25 +281,27 @@ /obj/item/storage/medkit/tactical/Initialize(mapload) . = ..() atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL - atom_storage.max_slots = 12 + atom_storage.max_slots = 21 atom_storage.max_total_storage = 24 + atom_storage.set_holdable(list_of_everything_medkits_can_hold) /obj/item/storage/medkit/tactical/PopulateContents() if(empty) return var/static/list/items_inside = list( + /obj/item/cautery = 1, + /obj/item/scalpel = 1, + /obj/item/healthanalyzer/advanced = 1, + /obj/item/hemostat = 1, + /obj/item/reagent_containers/medigel/sterilizine = 1, + /obj/item/storage/box/bandages = 1, + /obj/item/surgical_drapes = 1, + /obj/item/reagent_containers/hypospray/medipen/atropine = 2, + /obj/item/stack/medical/gauze = 2, /obj/item/stack/medical/suture/medicated = 2, /obj/item/stack/medical/mesh/advanced = 2, /obj/item/reagent_containers/pill/patch/libital = 4, /obj/item/reagent_containers/pill/patch/aiuri = 4, - /obj/item/healthanalyzer/advanced = 1, - /obj/item/stack/medical/gauze = 2, - /obj/item/reagent_containers/hypospray/medipen/atropine = 2, - /obj/item/reagent_containers/medigel/sterilizine = 1, - /obj/item/surgical_drapes = 1, - /obj/item/scalpel = 1, - /obj/item/hemostat = 1, - /obj/item/cautery = 1, ) generate_items_inside(items_inside,src) @@ -299,6 +310,14 @@ desc = "May or may not contain traces of lead." grind_results = list(/datum/reagent/lead = 10) +/obj/item/storage/medkit/tactical/premium/Initialize(mapload) + . = ..() + atom_storage.allow_big_nesting = TRUE // so you can put back the box you took out + atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL + atom_storage.max_slots = 21 + atom_storage.max_total_storage = 34 + atom_storage.set_holdable(list_of_everything_medkits_can_hold) + /obj/item/storage/medkit/tactical/premium/PopulateContents() if(empty) return @@ -315,11 +334,13 @@ /obj/item/mod/module/health_analyzer = 1, /obj/item/autosurgeon/syndicate/emaggedsurgerytoolset = 1, /obj/item/reagent_containers/hypospray/combat/empty = 1, + /obj/item/storage/box/bandages = 1, /obj/item/storage/box/evilmeds = 1, /obj/item/reagent_containers/medigel/sterilizine = 1, /obj/item/clothing/glasses/hud/health/night/science = 1, ) generate_items_inside(items_inside,src) + list_of_everything_medkits_can_hold += items_inside /obj/item/storage/medkit/coroner name = "compact coroner's medkit" @@ -327,14 +348,25 @@ icon = 'icons/obj/storage/medkit.dmi' icon_state = "compact_coronerkit" inhand_icon_state = "coronerkit" - var/max_slots = 6 - var/max_total_storage = 6 /obj/item/storage/medkit/coroner/Initialize(mapload) . = ..() - atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL //lowering this so it can't hold the autopsy scanner - atom_storage.max_slots = max_slots - atom_storage.max_total_storage = max_total_storage + atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL + atom_storage.max_slots = 14 + atom_storage.max_total_storage = 24 + atom_storage.set_holdable(list( + /obj/item/reagent_containers, + /obj/item/bodybag, + /obj/item/toy/crayon, + /obj/item/pen, + /obj/item/paper, + /obj/item/surgical_drapes, + /obj/item/scalpel, + /obj/item/retractor, + /obj/item/hemostat, + /obj/item/cautery, + /obj/item/autopsy_scanner, + )) /obj/item/storage/medkit/coroner/PopulateContents() if(empty) @@ -348,29 +380,6 @@ ) generate_items_inside(items_inside,src) -/obj/item/storage/medkit/coroner/large - name = "coroner's medkit" - desc = "A medical kit designed primarily for assisting in dissecting the deceased, rather than treating the living." - icon = 'icons/obj/storage/medkit.dmi' - icon_state = "coronerkit" - inhand_icon_state = "coronerkit" - max_slots = 12 - max_total_storage = 24 - -/obj/item/storage/medkit/coroner/large/PopulateContents() - if(empty) - return - var/static/items_inside = list( - /obj/item/reagent_containers/cup/bottle/formaldehyde = 1, - /obj/item/reagent_containers/medigel/sterilizine = 1, - /obj/item/toy/crayon/white = 1, - /obj/item/reagent_containers/blood = 1, - /obj/item/bodybag = 2, - /obj/item/reagent_containers/syringe = 1, - /obj/item/folder/white = 1,//for storing autopsy reports from the scanner - ) - generate_items_inside(items_inside,src) - //medibot assembly /obj/item/storage/medkit/attackby(obj/item/bodypart/bodypart, mob/user, params) if((!istype(bodypart, /obj/item/bodypart/arm/left/robot)) && (!istype(bodypart, /obj/item/bodypart/arm/right/robot))) @@ -381,6 +390,7 @@ balloon_alert(user, "items inside!") return + ///if you add a new one don't forget to update /datum/crafting_recipe/medbot/on_craft_completion() var/obj/item/bot_assembly/medbot/medbot_assembly = new if (istype(src, /obj/item/storage/medkit/fire)) medbot_assembly.set_skin("ointment") @@ -392,6 +402,8 @@ medbot_assembly.set_skin("brute") else if (istype(src, /obj/item/storage/medkit/advanced)) medbot_assembly.set_skin("advanced") + else if (istype(src, /obj/item/storage/medkit/tactical)) + medbot_assembly.set_skin("bezerk") user.put_in_hands(medbot_assembly) medbot_assembly.balloon_alert(user, "arm added") medbot_assembly.robot_arm = bodypart.type @@ -628,6 +640,14 @@ for(var/i in 1 to 7) new /obj/item/food/bait/natural(src) +/obj/item/storage/pill_bottle/ondansetron + name = "ondansetron patches" + desc = "A bottle containing patches of ondansetron, a drug used to treat nausea and vomiting. May cause drowsiness." + +/obj/item/storage/pill_bottle/ondansetron/PopulateContents() + for(var/i in 1 to 5) + new /obj/item/reagent_containers/pill/patch/ondansetron(src) + /// A box which takes in coolant and uses it to preserve organs and body parts /obj/item/storage/organbox name = "organ transport box" @@ -694,7 +714,7 @@ /obj/item/storage/organbox/attackby(obj/item/I, mob/user, params) if(is_reagent_container(I) && 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) + var/units = RC.reagents.trans_to(src, RC.amount_per_transfer_from_this, transferred_by = user) if(units) balloon_alert(user, "[units]u transferred") return diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm index b67e708634429..ad4be8d6e4088 100644 --- a/code/game/objects/items/storage/secure.dm +++ b/code/game/objects/items/storage/secure.dm @@ -96,14 +96,14 @@ lock_code = entered_code lock_set = TRUE else if ((entered_code == lock_code) && lock_set) - atom_storage.locked = FALSE + atom_storage.locked = STORAGE_NOT_LOCKED update_appearance() entered_code = null else entered_code = "ERROR" else if (href_list["type"] == "R") - atom_storage.locked = TRUE + atom_storage.locked = STORAGE_FULLY_LOCKED update_appearance() entered_code = null atom_storage.hide_contents(usr) @@ -181,6 +181,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/item/storage/secure/safe, 32) . = ..() atom_storage.set_holdable(cant_hold_list = list(/obj/item/storage/secure/briefcase)) atom_storage.max_specific_storage = WEIGHT_CLASS_GIGANTIC + find_and_hang_on_wall() /obj/item/storage/secure/safe/PopulateContents() new /obj/item/paper(src) @@ -231,7 +232,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/item/storage/secure/safe/caps_spare, 32) atom_storage.set_holdable(can_hold_list = list(/obj/item/card/id)) lock_code = SSid_access.spare_id_safe_code lock_set = TRUE - atom_storage.locked = TRUE + atom_storage.locked = STORAGE_FULLY_LOCKED update_appearance() /obj/item/storage/secure/safe/caps_spare/PopulateContents() diff --git a/code/game/objects/items/storage/storage.dm b/code/game/objects/items/storage/storage.dm index 98b8c243a40b7..501d3d2624bf0 100644 --- a/code/game/objects/items/storage/storage.dm +++ b/code/game/objects/items/storage/storage.dm @@ -10,6 +10,35 @@ /// What storage type to use for this item var/datum/storage/storage_type = /datum/storage +/obj/item/storage/apply_fantasy_bonuses(bonus) + . = ..() + if(isnull(atom_storage)) // some abstract types of storage (yes i know) don't get a datum + return + + atom_storage.max_slots = modify_fantasy_variable("max_slots", atom_storage.max_slots, round(bonus/2)) + atom_storage.max_total_storage = modify_fantasy_variable("max_total_storage", atom_storage.max_total_storage, round(bonus/2)) + LAZYSET(fantasy_modifications, "max_specific_storage", atom_storage.max_specific_storage) + if(bonus >= 15) + atom_storage.max_specific_storage = max(WEIGHT_CLASS_HUGE, atom_storage.max_specific_storage) + else if(bonus >= 10) + atom_storage.max_specific_storage = max(WEIGHT_CLASS_BULKY, atom_storage.max_specific_storage) + else if(bonus <= -10) + atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL + else if(bonus <= -15) + atom_storage.max_specific_storage = WEIGHT_CLASS_TINY + +/obj/item/storage/remove_fantasy_bonuses(bonus) + if(isnull(atom_storage)) // some abstract types of storage (yes i know) don't get a datum + return ..() + + atom_storage.max_slots = reset_fantasy_variable("max_slots", atom_storage.max_slots) + atom_storage.max_total_storage = reset_fantasy_variable("max_total_storage", atom_storage.max_total_storage) + var/previous_max_storage = LAZYACCESS(fantasy_modifications, "max_specific_storage") + LAZYREMOVE(fantasy_modifications, "max_specific_storage") + if(previous_max_storage) + atom_storage.max_specific_storage = previous_max_storage + return ..() + /obj/item/storage/Initialize(mapload) . = ..() @@ -20,6 +49,24 @@ for (var/obj/item/item in src) item.item_flags |= IN_STORAGE +/obj/item/storage/create_storage( + max_slots, + max_specific_storage, + max_total_storage, + numerical_stacking, + allow_quick_gather, + allow_quick_empty, + collection_mode, + attack_hand_interact, + list/canhold, + list/canthold, + storage_type, + ) + if(!storage_type) // If no type was passed in, default to what we already have + storage_type = src.storage_type + return ..() + + /obj/item/storage/AllowDrop() return FALSE diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index d06e0990ab90a..fd5eded2da398 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -50,6 +50,7 @@ icon_state = "red" inhand_icon_state = "toolbox_red" material_flags = NONE + throw_speed = 3 // red ones go faster /obj/item/storage/toolbox/emergency/PopulateContents() new /obj/item/crowbar/red(src) @@ -223,10 +224,9 @@ new /obj/item/stack/pipe_cleaner_coil/white(src) new /obj/item/stack/pipe_cleaner_coil/brown(src) -/obj/item/storage/toolbox/a762 - name = "7.62mm ammo box (Surplus?)" - desc = "It contains a few clips. Goddamn, this thing smells awful. \ - Has this been sitting in a warehouse for the last several centuries?" +/obj/item/storage/toolbox/ammobox + name = "ammo canister" + desc = "A metal canister designed to hold ammunition" icon_state = "ammobox" inhand_icon_state = "ammobox" lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi' @@ -234,14 +234,29 @@ has_latches = FALSE drop_sound = 'sound/items/handling/ammobox_drop.ogg' pickup_sound = 'sound/items/handling/ammobox_pickup.ogg' - var/ammo_to_spawn = /obj/item/ammo_box/a762 + var/ammo_to_spawn + +/obj/item/storage/toolbox/ammobox/PopulateContents() + if(!isnull(ammo_to_spawn)) + for(var/i in 1 to 6) + new ammo_to_spawn(src) + +/obj/item/storage/toolbox/ammobox/strilka310 + name = ".310 Strilka ammo box (Surplus?)" + desc = "It contains a few clips. Goddamn, this thing smells awful. \ + Has this been sitting in a warehouse for the last several centuries?" + ammo_to_spawn = /obj/item/ammo_box/strilka310 -/obj/item/storage/toolbox/a762/PopulateContents() - for(var/i in 1 to 6) - new ammo_to_spawn(src) +/obj/item/storage/toolbox/ammobox/strilka310/surplus + ammo_to_spawn = /obj/item/ammo_box/strilka310/surplus -/obj/item/storage/toolbox/a762/surplus - ammo_to_spawn = /obj/item/ammo_box/a762/surplus +/obj/item/storage/toolbox/ammobox/wt550m9 + name = "4.6x30mm ammo box" + ammo_to_spawn = /obj/item/ammo_box/magazine/wt550m9 + +/obj/item/storage/toolbox/ammobox/wt550m9ap + name = "4.6x30mm AP ammo box" + ammo_to_spawn = /obj/item/ammo_box/magazine/wt550m9/wtap /obj/item/storage/toolbox/maint_kit name = "gun maintenance kit" @@ -295,7 +310,140 @@ balloon_alert(user, "needs 10 tiles!") return - /obj/item/storage/toolbox/haunted name = "old toolbox" custom_materials = list(/datum/material/hauntium = SMALL_MATERIAL_AMOUNT*5) + +/obj/item/storage/toolbox/guncase + name = "gun case" + desc = "A weapon's case. Has a blood-red 'S' stamped on the cover." + icon = 'icons/obj/storage/case.dmi' + icon_state = "infiltrator_case" + lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi' + inhand_icon_state = "infiltrator_case" + has_latches = FALSE + var/weapon_to_spawn = /obj/item/gun/ballistic/automatic/pistol + var/extra_to_spawn = /obj/item/ammo_box/magazine/m9mm + +/obj/item/storage/toolbox/guncase/Initialize(mapload) + . = ..() + atom_storage.max_specific_storage = WEIGHT_CLASS_BULKY + atom_storage.max_total_storage = 7 //enough to hold ONE bulky gun and the ammo boxes + atom_storage.max_slots = 4 + +/obj/item/storage/toolbox/guncase/PopulateContents() + new weapon_to_spawn (src) + for(var/i in 1 to 3) + new extra_to_spawn (src) + +/obj/item/storage/toolbox/guncase/bulldog + name = "bulldog gun case" + weapon_to_spawn = /obj/item/gun/ballistic/shotgun/bulldog + extra_to_spawn = /obj/item/ammo_box/magazine/m12g + +/obj/item/storage/toolbox/guncase/c20r + name = "c-20r gun case" + weapon_to_spawn = /obj/item/gun/ballistic/automatic/c20r + extra_to_spawn = /obj/item/ammo_box/magazine/smgm45 + +/obj/item/storage/toolbox/guncase/clandestine + name = "clandestine gun case" + weapon_to_spawn = /obj/item/gun/ballistic/automatic/pistol/clandestine + extra_to_spawn = /obj/item/ammo_box/magazine/m10mm + +/obj/item/storage/toolbox/guncase/m90gl + name = "m-90gl gun case" + weapon_to_spawn = /obj/item/gun/ballistic/automatic/m90 + extra_to_spawn = /obj/item/ammo_box/magazine/m223 + +/obj/item/storage/toolbox/guncase/m90gl/PopulateContents() + new weapon_to_spawn (src) + for(var/i in 1 to 2) + new extra_to_spawn (src) + new /obj/item/ammo_box/a40mm/rubber (src) + +/obj/item/storage/toolbox/guncase/rocketlauncher + name = "rocket launcher gun case" + weapon_to_spawn = /obj/item/gun/ballistic/rocketlauncher + extra_to_spawn = /obj/item/ammo_box/rocket + +/obj/item/storage/toolbox/guncase/rocketlauncher/PopulateContents() + new weapon_to_spawn (src) + new extra_to_spawn (src) + +/obj/item/storage/toolbox/guncase/revolver + name = "revolver gun case" + weapon_to_spawn = /obj/item/gun/ballistic/revolver/syndicate + extra_to_spawn = /obj/item/ammo_box/a357 + +/obj/item/storage/toolbox/guncase/sword_and_board + name = "energy sword and shield weapon case" + weapon_to_spawn = /obj/item/melee/energy/sword + extra_to_spawn = /obj/item/shield/energy + +/obj/item/storage/toolbox/guncase/sword_and_board/PopulateContents() + new weapon_to_spawn (src) + new extra_to_spawn (src) + new /obj/item/mod/module/hat_stabilizer (src) + new /obj/item/clothing/head/costume/knight (src) + +/obj/item/storage/toolbox/guncase/cqc + name = "\improper CQC equipment case" + weapon_to_spawn = /obj/item/book/granter/martial/cqc + extra_to_spawn = /obj/item/storage/box/syndie_kit/imp_stealth + +/obj/item/storage/toolbox/guncase/cqc/PopulateContents() + new weapon_to_spawn (src) + new extra_to_spawn (src) + new /obj/item/mod/module/hat_stabilizer (src) + new /obj/item/clothing/head/costume/snakeeater (src) + +/obj/item/clothing/head/costume/snakeeater + name = "strange bandana" + desc = "A bandana. It seems to have a little carp embroidered on the inside, as well as the kanji '魚'." + icon_state = "snake_eater" + inhand_icon_state = null + +/obj/item/clothing/head/costume/knight + name = "fake medieval helmet" + desc = "A classic metal helmet. Though, this one seems to be very obviously fake..." + icon = 'icons/obj/clothing/head/helmet.dmi' + worn_icon = 'icons/mob/clothing/head/helmet.dmi' + icon_state = "knight_green" + inhand_icon_state = "knight_helmet" + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT + flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH + dog_fashion = null + +/obj/item/storage/toolbox/guncase/doublesword + name = "double-energy sword weapon case" + weapon_to_spawn = /obj/item/dualsaber + extra_to_spawn = /obj/item/soap/syndie + +/obj/item/storage/toolbox/guncase/doublesword/Initialize(mapload) + . = ..() + atom_storage.max_specific_storage = WEIGHT_CLASS_BULKY + atom_storage.max_total_storage = 10 //it'll hold enough + atom_storage.max_slots = 5 + +/obj/item/storage/toolbox/guncase/doublesword/PopulateContents() + new weapon_to_spawn (src) + new extra_to_spawn (src) + new /obj/item/mod/module/noslip (src) + new /obj/item/reagent_containers/hypospray/medipen/methamphetamine (src) + new /obj/item/clothing/under/rank/prisoner/nosensor (src) + +/obj/item/storage/toolbox/guncase/soviet + name = "ancient gun case" + desc = "A weapon's case. Has the symbol of the Third Soviet Union stamped on the side." + icon_state = "sakhno_case" + inhand_icon_state = "sakhno_case" + weapon_to_spawn = /obj/effect/spawner/random/sakhno + extra_to_spawn = /obj/effect/spawner/random/sakhno/ammo + +/obj/item/storage/toolbox/guncase/soviet/plastikov + name = "ancient surplus gun case" + desc = "A gun case. Has the symbol of the Third Soviet Union stamped on the side." + weapon_to_spawn = /obj/item/gun/ballistic/automatic/plastikov + extra_to_spawn = /obj/item/food/rationpack //sorry comrade, cannot get you more ammo, here, have lunch diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 95c4331db57dc..51082eabc95c2 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -52,14 +52,15 @@ new /obj/item/clothing/under/chameleon(src) // 2 tc since it's not the full set new /obj/item/clothing/mask/chameleon(src) // Goes with above new /obj/item/clothing/shoes/chameleon/noslip(src) // 2 tc - new /obj/item/camera_bug(src) // 1 tc + new /obj/item/computer_disk/syndicate/camera_app(src) // 1 tc new /obj/item/multitool/ai_detect(src) // 1 tc new /obj/item/encryptionkey/syndicate(src) // 2 tc new /obj/item/reagent_containers/syringe/mulligan(src) // 4 tc - new /obj/item/switchblade(src) //I'll count this as 2 tc + new /obj/item/switchblade(src) //basically 1 tc as it can be bought from BM kits new /obj/item/storage/fancy/cigarettes/cigpack_syndicate (src) // 2 tc this shit heals new /obj/item/flashlight/emp(src) // 2 tc new /obj/item/chameleon(src) // 7 tc + new /obj/item/implanter/storage(src) // 6 tc if(KIT_STEALTHY) new /obj/item/gun/energy/recharge/ebow(src) // 10 tc @@ -116,7 +117,7 @@ new /obj/item/ai_module/toy_ai(src) // ~6 tc new /obj/item/multitool/ai_detect(src) // 1 tc new /obj/item/storage/toolbox/syndicate(src) // 1 tc - new /obj/item/camera_bug(src) // 1 tc + new /obj/item/computer_disk/syndicate/camera_app(src) // 1 tc new /obj/item/clothing/glasses/thermal/syndi(src) // 4 tc new /obj/item/card/id/advanced/chameleon(src) // 2 tc @@ -137,7 +138,7 @@ if(KIT_SABOTAGE) new /obj/item/storage/backpack/duffelbag/syndie/sabotage(src) // 5 tc for 3 c4 and 2 x4 - new /obj/item/camera_bug(src) // 1 tc + new /obj/item/computer_disk/syndicate/camera_app(src) // 1 tc new /obj/item/sbeacondrop/powersink(src) // 11 tc new /obj/item/computer_disk/virus/detomatix(src) // 6 tc new /obj/item/storage/toolbox/syndicate(src) // 1 tc @@ -366,6 +367,12 @@ /obj/item/storage/box/syndie_kit/imp_macrobomb/PopulateContents() new /obj/item/implanter/explosive_macro(src) +/obj/item/storage/box/syndie_kit/imp_deniability + name = "tactical deniability implant box" + +/obj/item/storage/box/syndie_kit/imp_deniability/PopulateContents() + new /obj/item/implanter/tactical_deniability(src) + /obj/item/storage/box/syndie_kit/imp_uplink name = "uplink implant box" @@ -504,6 +511,7 @@ new /obj/item/stamp/chameleon(src) new /obj/item/modular_computer/pda/chameleon(src) new /obj/item/gun/energy/laser/chameleon(src) + new /obj/item/chameleon_scanner(src) //5*(2*4) = 5*8 = 45, 45 damage if you hit one person with all 5 stars. //Not counting the damage it will do while embedded (2*4 = 8, at 15% chance) @@ -515,6 +523,17 @@ new /obj/item/restraints/legcuffs/bola/tactical(src) new /obj/item/restraints/legcuffs/bola/tactical(src) +/obj/item/storage/box/syndie_kit/throwing_weapons/Initialize(mapload) + . = ..() + atom_storage.max_slots = 9 // 5 + 2 + 2 + atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL + atom_storage.max_total_storage = 18 // 5*2 + 2*1 + 3*2 + atom_storage.set_holdable(list( + /obj/item/restraints/legcuffs/bola/tactical, + /obj/item/paperplane/syndicate, + /obj/item/throwing_star, + )) + /obj/item/storage/box/syndie_kit/cutouts/PopulateContents() for(var/i in 1 to 3) new/obj/item/cardboard_cutout/adaptive(src) @@ -576,19 +595,30 @@ for(var/i in 1 to 3) new /obj/item/grenade/spawnergrenade/buzzkill(src) +/obj/item/storage/box/syndie_kit/manhack_grenades/PopulateContents() + for(var/i in 1 to 3) + new /obj/item/grenade/spawnergrenade/manhacks(src) + /obj/item/storage/box/syndie_kit/sleepytime/PopulateContents() new /obj/item/clothing/under/syndicate/bloodred/sleepytime(src) new /obj/item/reagent_containers/cup/glass/mug/coco(src) new /obj/item/toy/plush/carpplushie(src) new /obj/item/bedsheet/syndie(src) +/obj/item/storage/box/syndie_kit/demoman/PopulateContents() + new /obj/item/gun/grenadelauncher(src) + new /obj/item/storage/belt/grenade/full(src) + if(prob(1)) + new /obj/item/clothing/head/hats/hos/shako(src) + new /obj/item/mod/module/hat_stabilizer(src) + /// Surplus Ammo Box -/obj/item/storage/box/syndie_kit/surplus +/obj/item/storage/box/syndie_kit/sniper_surplus name = "surplus .50 BMG magazine box" desc = "A shoddy box full of surplus .50 BMG magazines. Not as strong, but good enough to keep lead in the air." -/obj/item/storage/box/syndie_kit/surplus/PopulateContents() +/obj/item/storage/box/syndie_kit/sniper_surplus/PopulateContents() for(var/i in 1 to 7) new /obj/item/ammo_box/magazine/sniper_rounds/surplus(src) @@ -717,13 +747,13 @@ human_target.reagents.add_reagent(/datum/reagent/toxin, 2) return FALSE - /// If no antag datums which allow induction are there, disallow induction! No self-antagging. - var/allowed = FALSE + /// If all the antag datums are 'fake', disallow induction! No self-antagging. + var/faker for(var/datum/antagonist/antag_datum as anything in human_target.mind.antag_datums) - if((antag_datum.antag_flags & FLAG_ANTAG_CAN_BE_INDUCTED)) - allowed = TRUE + if((antag_datum.antag_flags & FLAG_FAKE_ANTAG)) + faker = TRUE - if(!allowed) // GTFO. Technically not foolproof but making a heartbreaker or a paradox clone a nuke op sounds hilarious + if(faker) // GTFO. Technically not foolproof but making a heartbreaker or a paradox clone a nuke op sounds hilarious to_chat(human_target, span_notice("Huh? Nothing happened? But you're starting to feel a little ill...")) human_target.reagents.add_reagent(/datum/reagent/toxin, 15) return FALSE @@ -748,6 +778,17 @@ to_chat(target, span_userdanger("You're no longer identified as a nuclear operative! You are free to follow any valid goals you wish, even continuing to secure the disk. Just make sure neither any turrets nor operatives kill you on sight.")) return TRUE +/obj/item/storage/box/syndie_kit/poster_box + name = "syndicate poster pack" + desc = "Contains a variety of demotivational posters to ensure minimum productivity for the crew of any Nanotrasen station." + + /// Number of posters this box contains when spawning. + var/poster_count = 3 + +/obj/item/storage/box/syndie_kit/poster_box/PopulateContents() + for(var/i in 1 to poster_count) + new /obj/item/poster/traitor(src) + #undef KIT_RECON #undef KIT_BLOODY_SPAI #undef KIT_STEALTHY diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm index 0590c3877b8fb..4d2fd836ad0e5 100644 --- a/code/game/objects/items/storage/wallets.dm +++ b/code/game/objects/items/storage/wallets.dm @@ -165,3 +165,12 @@ /obj/item/storage/wallet/random/PopulateContents() new /obj/item/holochip(src, rand(5, 30)) new /obj/effect/spawner/random/entertainment/wallet_storage(src) + +///Used by the toilet fish source. +/obj/item/storage/wallet/money + desc = "It can hold a few small and personal things. This one reeks of toilet water." + +/obj/item/storage/wallet/money/PopulateContents() + for(var/iteration in 1 to pick(3, 4)) + new /obj/item/holochip(src, rand(50, 450)) + diff --git a/code/game/objects/items/surgery_tray.dm b/code/game/objects/items/surgery_tray.dm new file mode 100644 index 0000000000000..daa95915698a5 --- /dev/null +++ b/code/game/objects/items/surgery_tray.dm @@ -0,0 +1,241 @@ +/datum/storage/surgery_tray + max_total_storage = 30 + max_specific_storage = WEIGHT_CLASS_NORMAL + max_slots = 14 + +/datum/storage/surgery_tray/New() + . = ..() + set_holdable(list( + /obj/item/blood_filter, + /obj/item/bonesetter, + /obj/item/cautery, + /obj/item/circular_saw, + /obj/item/clothing/mask/surgical, + /obj/item/hemostat, + /obj/item/razor, + /obj/item/reagent_containers/medigel, + /obj/item/retractor, + /obj/item/scalpel, + /obj/item/stack/medical/bone_gel, + /obj/item/stack/sticky_tape/surgical, + /obj/item/surgical_drapes, + /obj/item/surgicaldrill, + )) + +/** + * Surgery Trays + * A storage object that displays tools in its contents based on tier, better tools are more visible. + * Can be folded up and carried. Click it to draw a random tool. + */ +/obj/item/surgery_tray + name = "surgery tray" + desc = "A Deforest brand medical cart. It is a folding model, meaning the wheels on the bottom can be retracted and the body used as a tray." + icon = 'icons/obj/medicart.dmi' + icon_state = "tray" + w_class = WEIGHT_CLASS_BULKY + slowdown = 1 + item_flags = SLOWS_WHILE_IN_HAND + pass_flags = NONE + + /// If true we're currently portable + var/is_portable = TRUE + +/// Fills the tray with items it should contain on creation +/obj/item/surgery_tray/proc/populate_contents() + return + +/obj/item/surgery_tray/Initialize(mapload) + . = ..() + AddElement(/datum/element/drag_pickup) + create_storage(storage_type = /datum/storage/surgery_tray) + populate_contents() + register_context() + set_tray_mode(is_portable) + +/obj/item/surgery_tray/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + context[SCREENTIP_CONTEXT_LMB] = "Take a random tool" + context[SCREENTIP_CONTEXT_RMB] = "Take a specific tool" + return CONTEXTUAL_SCREENTIP_SET + +/obj/item/surgery_tray/update_icon_state() + . = ..() + icon_state = is_portable ? "tray" : "medicart" + +/obj/item/surgery_tray/update_desc() + . = ..() + if(is_portable) + desc = "The wheels and bottom storage of this medical cart have been stowed away, \ + leaving a cumbersome tray in it's place." + else + desc = initial(desc) + +/obj/item/surgery_tray/examine(mob/living/carbon/human/user) + . = ..() + . += is_portable \ + ? span_notice("You can click and drag it to yourself to pick it up, then use it in your hand to make it a cart!") \ + : span_notice("You can click and drag it to yourself to turn it into a tray!") + . += span_notice("The top is screwed on.") + +/obj/item/surgery_tray/update_overlays() + . = ..() + // assoc list of all overlays, key = the item generating the overlay, value = the overlay string + var/list/surgery_overlays = list() + // assoc list of tool behaviors to fastest toolspeed of that type we already have + // easy way for us to check if there are any lower quality tools within + var/list/recorded_tool_speeds = list() + // handle drapes separately so they're always on the bottom + if (locate(/obj/item/surgical_drapes) in contents) + . += "drapes" + // compile all the overlays from items inside us + for(var/obj/item/surgery_tool in src) + // the overlay we will use if we want to display this one + var/actual_overlay = surgery_tool.get_surgery_tool_overlay(tray_extended = !is_portable) + if (isnull(actual_overlay)) + continue // nothing to see here + + // if we don't have tool behaviour then just record the overlay + if(!length(surgery_tool.get_all_tool_behaviours())) + surgery_overlays[surgery_tool] = actual_overlay + continue + + // if we have at least one tool behaviour, check if we already recorded a faster one + for (var/surgery_tool_type in surgery_tool.get_all_tool_behaviours()) + var/highest_speed = LAZYACCESS(recorded_tool_speeds, surgery_tool_type) || INFINITY // bigger number = slower + if(surgery_tool.toolspeed > highest_speed) + continue + // the existing tool was worse than us, ditch it + surgery_overlays -= surgery_tool_type + LAZYSET(recorded_tool_speeds, surgery_tool_type, surgery_tool.toolspeed) + surgery_overlays[surgery_tool_type] = actual_overlay + + for(var/surgery_tool in surgery_overlays) + . |= surgery_overlays[surgery_tool] + +///Sets the surgery tray's deployment state. Silent if user is null. +/obj/item/surgery_tray/proc/set_tray_mode(new_mode, mob/user) + is_portable = new_mode + density = !is_portable + if(user) + user.visible_message(span_notice("[user] [is_portable ? "retracts" : "extends"] [src]'s wheels."), span_notice("You [is_portable ? "retract" : "extend"] [src]'s wheels.")) + + if(is_portable) + interaction_flags_item |= INTERACT_ITEM_ATTACK_HAND_PICKUP + passtable_on(src, type) + RemoveElement(/datum/element/noisy_movement) + else + interaction_flags_item &= ~INTERACT_ITEM_ATTACK_HAND_PICKUP + passtable_off(src, type) + AddElement(/datum/element/noisy_movement) + + update_appearance() + +/obj/item/surgery_tray/equipped(mob/user, slot, initial) + . = ..() + if(!is_portable) + set_tray_mode(TRUE, user) + +/obj/item/surgery_tray/attack_self(mob/user, modifiers) + . = ..() + if(.) + return + var/turf/open/placement_turf = get_turf(user) + if(isgroundlessturf(placement_turf) || isclosedturf(placement_turf)) + balloon_alert(user, "can't deploy!") + return TRUE + if(!user.transferItemToLoc(src, placement_turf)) + balloon_alert(user, "tray stuck!") + return TRUE + set_tray_mode(FALSE, user) + return + +/obj/item/surgery_tray/attack_hand(mob/living/user) + if(!user.can_perform_action(src, NEED_HANDS)) + return ..() + if(!length(contents)) + balloon_alert(user, "empty!") + else + var/obj/item/grabbies = pick(contents) + atom_storage.remove_single(user, grabbies, drop_location()) + user.put_in_hands(grabbies) + return TRUE + +/obj/item/surgery_tray/screwdriver_act_secondary(mob/living/user, obj/item/tool) + . = ..() + tool.play_tool_sound(src) + to_chat(user, span_notice("You begin taking apart [src].")) + if(!tool.use_tool(src, user, 1 SECONDS)) + return + deconstruct(TRUE) + to_chat(user, span_notice("[src] has been taken apart.")) + +/obj/item/surgery_tray/dump_contents() + var/atom/drop_point = drop_location() + for(var/atom/movable/tool as anything in contents) + tool.forceMove(drop_point) + +/obj/item/surgery_tray/deconstruct(disassembled = TRUE) + if(!(flags_1 & NODECONSTRUCT_1)) + dump_contents() + new /obj/item/stack/rods(drop_location(), 2) + new /obj/item/stack/sheet/mineral/silver(drop_location()) + return ..() + +/obj/item/surgery_tray/deployed + is_portable = FALSE + +/obj/item/surgery_tray/full + +/obj/item/surgery_tray/full/deployed + is_portable = FALSE + +/obj/item/surgery_tray/full/populate_contents() + new /obj/item/blood_filter(src) + new /obj/item/bonesetter(src) + new /obj/item/cautery(src) + new /obj/item/circular_saw(src) + new /obj/item/clothing/mask/surgical(src) + new /obj/item/hemostat(src) + new /obj/item/razor/surgery(src) + new /obj/item/retractor(src) + new /obj/item/scalpel(src) + new /obj/item/stack/medical/bone_gel(src) + new /obj/item/stack/sticky_tape/surgical(src) + new /obj/item/surgical_drapes(src) + new /obj/item/surgicaldrill(src) + update_appearance(UPDATE_OVERLAYS) + +/obj/item/surgery_tray/full/morgue + name = "autopsy tray" + desc = "A Deforest brand surgery tray, made for use in morgues. It is a folding model, \ + meaning the wheels on the bottom can be extended outwards, making it a cart." + +/obj/item/surgery_tray/full/morgue/populate_contents() + new /obj/item/blood_filter(src) + new /obj/item/bonesetter(src) + new /obj/item/cautery/cruel(src) + new /obj/item/circular_saw(src) + new /obj/item/clothing/mask/surgical(src) + new /obj/item/hemostat/cruel(src) + new /obj/item/razor/surgery(src) + new /obj/item/retractor/cruel(src) + new /obj/item/scalpel/cruel(src) + new /obj/item/stack/medical/bone_gel(src) + new /obj/item/stack/sticky_tape/surgical(src) + new /obj/item/surgical_drapes(src) + new /obj/item/surgicaldrill(src) + +/// Surgery tray with advanced tools for debug +/obj/item/surgery_tray/full/advanced + +/obj/item/surgery_tray/full/advanced/populate_contents() + new /obj/item/scalpel/advanced(src) + new /obj/item/retractor/advanced(src) + new /obj/item/cautery/advanced(src) + new /obj/item/surgical_drapes(src) + new /obj/item/reagent_containers/medigel/sterilizine(src) + new /obj/item/bonesetter(src) + new /obj/item/blood_filter(src) + new /obj/item/stack/medical/bone_gel(src) + new /obj/item/stack/sticky_tape/surgical(src) + new /obj/item/clothing/mask/surgical(src) diff --git a/code/game/objects/items/syndie_spraycan.dm b/code/game/objects/items/syndie_spraycan.dm new file mode 100644 index 0000000000000..78ffb6a4772c2 --- /dev/null +++ b/code/game/objects/items/syndie_spraycan.dm @@ -0,0 +1,226 @@ +// Extending the existing spraycan item was more trouble than it was worth, I don't want or need this to be able to draw arbitrary shapes. +/obj/item/traitor_spraycan + name = "seditious spraycan" + desc = "This spraycan deploys a subversive pattern containing subliminal priming agents over a 3x3 area. Contains enough primer for just one final coating." + icon = 'icons/obj/art/crayons.dmi' + icon_state = "deathcan" + worn_icon_state = "spraycan" + inhand_icon_state = "spraycan" + lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi' + w_class = WEIGHT_CLASS_SMALL + var/paint_color = "#780000" + var/static/list/no_draw_turfs = typecacheof(list(/turf/open/space, /turf/open/openspace, /turf/open/lava, /turf/open/chasm)) + + /// Are we currently drawing? Used to prevent spam clicks for do_while + var/drawing_rune = FALSE + /// Set to true if we finished drawing something, this spraycan is now useless + var/expended = FALSE + +/obj/item/traitor_spraycan/afterattack(atom/target, mob/user, proximity, params) + . = ..() + if (expended) + user.balloon_alert(user, "all out of paint...") + return COMPONENT_CANCEL_ATTACK_CHAIN + + if (drawing_rune) + user.balloon_alert(user, "already busy!") + return COMPONENT_CANCEL_ATTACK_CHAIN + + . |= AFTERATTACK_PROCESSED_ITEM + + if (!proximity || !check_allowed_items(target) || !isliving(user)) + return + + if (isturf(target)) + try_draw_new_rune(user, target) + return COMPONENT_CANCEL_ATTACK_CHAIN + + if (istype(target, /obj/effect/decal/cleanable/traitor_rune)) + try_complete_rune(user, target) + return COMPONENT_CANCEL_ATTACK_CHAIN + +/** + * Attempt to draw a rune on [target_turf]. + * Shamelessly adapted from the heretic rune drawing process. + * + * Arguments + * * user - the mob drawing the rune + * * target_turf - the place the rune's being drawn + */ +/obj/item/traitor_spraycan/proc/try_draw_new_rune(mob/living/user, turf/target_turf) + for(var/turf/nearby_turf as anything in RANGE_TURFS(1, target_turf)) + if (!isopenturf(nearby_turf) || is_type_in_typecache(nearby_turf, no_draw_turfs)) + user.balloon_alert(user, "you need a clear 3x3 area!") + return + + draw_rune(user, target_turf) + +/** + * Draw your stage one rune on the ground and store it. + * + * Arguments + * * user - the mob drawing the rune + * * target_turf - the place the rune's being drawn + */ +/obj/item/traitor_spraycan/proc/draw_rune(mob/living/user, turf/target_turf) + if (!try_draw_step("drawing outline...", user, target_turf)) + return + try_complete_rune(user, new /obj/effect/decal/cleanable/traitor_rune(target_turf)) + +/** + * Holder for repeated code to do something after a message and a set amount of time. + * + * Arguments + * * output - a string to show when you start the process + * * user - the mob drawing the rune + * * target - what they're trying to draw, or the place they are trying to draw on + */ +/obj/item/traitor_spraycan/proc/try_draw_step(start_output, mob/living/user, atom/target) + drawing_rune = TRUE + user.balloon_alert(user, "[start_output]") + if (!do_after(user, 3 SECONDS, target)) + user.balloon_alert(user, "interrupted!") + drawing_rune = FALSE + return FALSE + + playsound(src, 'sound/effects/spray.ogg', 5, TRUE, 5) + drawing_rune = FALSE + return TRUE + +#define RUNE_STAGE_OUTLINE 0 +#define RUNE_STAGE_COLOURED 1 +#define RUNE_STAGE_COMPLETE 2 +#define RUNE_STAGE_REMOVABLE 3 + +/** + * Try to upgrade a floor rune to its next stage. + * + * Arguments + * * user - the mob drawing the rune + * * target_turf - the place the rune's being drawn + */ +/obj/item/traitor_spraycan/proc/try_complete_rune(mob/living/user, obj/effect/decal/cleanable/traitor_rune/rune) + switch(rune.drawn_stage) + if (RUNE_STAGE_OUTLINE) + if (!try_draw_step("... finalising design...", user, rune)) + return + if (!rune) + user.balloon_alert(user, "graffiti was destroyed!") + return + rune.set_stage(RUNE_STAGE_COLOURED) + try_complete_rune(user, rune) + + if (RUNE_STAGE_COLOURED) + if (!try_draw_step("... applying final coating...", user, rune)) + return + if (!rune) + user.balloon_alert(user, "graffiti was destroyed!") + return + user.balloon_alert(user, "finished!") + rune.set_stage(RUNE_STAGE_COMPLETE) + expended = TRUE + desc = "A suspicious looking spraycan, it's all out of paint." + SEND_SIGNAL(src, COMSIG_TRAITOR_GRAFFITI_DRAWN, rune) + + if (RUNE_STAGE_COMPLETE, RUNE_STAGE_REMOVABLE) + user.balloon_alert(user, "all done!") + +/// Copying the functionality from normal spraycans, but doesn't need all the optional checks +/obj/item/traitor_spraycan/suicide_act(mob/living/user) + if(expended) + user.visible_message(span_suicide("[user] shakes up [src] with a rattle and lifts it to [user.p_their()] mouth, but nothing happens!")) + user.say("MEDIOCRE!!", forced="spraycan suicide") + return SHAME + + var/mob/living/carbon/human/suicider = user + user.visible_message(span_suicide("[user] shakes up [src] with a rattle and lifts it to [user.p_their()] mouth, spraying paint across [user.p_their()] teeth!")) + user.say("WITNESS ME!!", forced="spraycan suicide") + playsound(src, 'sound/effects/spray.ogg', 5, TRUE, 5) + suicider.update_lips("spray_face", paint_color) + return OXYLOSS + +/obj/effect/decal/cleanable/traitor_rune + name = "syndicate graffiti" + desc = "It looks like it's going to be... the Syndicate logo?" + icon = 'icons/effects/96x96.dmi' + icon_state = "traitor_rune_outline" + pixel_x = -32 + pixel_y = -32 + gender = NEUTER + mergeable_decal = FALSE + resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF + clean_type = CLEAN_TYPE_HARD_DECAL + layer = SIGIL_LAYER + var/slip_time = 6 SECONDS + var/slip_flags = NO_SLIP_WHEN_WALKING + + /// The stage of drawing we have reached + var/drawn_stage = RUNE_STAGE_OUTLINE + /// Proximity sensor to make people sad if they're nearby + var/datum/proximity_monitor/advanced/demoraliser/demoraliser + /// Whether we protect the rune from being cleaned up + var/clean_proof = FALSE + /// Timer until the rune can be cleaned up off the floor + var/protected_timer + +/obj/effect/decal/cleanable/traitor_rune/traitor/Destroy() + deltimer(protected_timer) + QDEL_NULL(demoraliser) + return ..() + +/obj/effect/decal/cleanable/traitor_rune/HasProximity(atom/movable/proximity_check_mob) + if (isliving(proximity_check_mob) && get_dist(proximity_check_mob, src) <= 1) + slip(proximity_check_mob) + return ..() + +/** + * Makes someone fall over. If it's not the traitor, this counts as demoralising the crew. + * + * Arguments + * * victim - whoever just slipped, point and laugh at them + */ +/obj/effect/decal/cleanable/traitor_rune/proc/slip(mob/living/victim) + if(victim.movement_type & FLYING) + return + if (!victim.slip(slip_time, src, slip_flags)) + return + SEND_SIGNAL(src, COMSIG_TRAITOR_GRAFFITI_SLIPPED, victim.mind) + +/** + * Sets the "drawing stage" of the rune. + * This affects the appearance, behaviour, and description of the effect. + * + * Arguments + * * stage - new stage to apply + */ +/obj/effect/decal/cleanable/traitor_rune/proc/set_stage(stage) + drawn_stage = stage + switch(drawn_stage) + if (RUNE_STAGE_OUTLINE) + icon_state = "traitor_rune_outline" + desc = "It looks like it's going to be... the Syndicate logo?" + + if (RUNE_STAGE_COLOURED, RUNE_STAGE_REMOVABLE) + icon_state = "traitor_rune_done" + desc = "A large depiction of the Syndicate logo." + clean_proof = FALSE + + if (RUNE_STAGE_COMPLETE) + icon_state = "traitor_rune_sheen" + desc = "A large depiction of the Syndicate logo. It looks slippery." + var/datum/demoralise_moods/graffiti/mood_category = new() + demoraliser = new(src, 7, TRUE, mood_category) + clean_proof = TRUE + protected_timer = addtimer(CALLBACK(src, PROC_REF(set_stage), RUNE_STAGE_REMOVABLE), 5 MINUTES) + +/obj/effect/decal/cleanable/traitor_rune/wash(clean_types) + if (clean_proof) + return FALSE + + return ..() + +#undef RUNE_STAGE_COLOURED +#undef RUNE_STAGE_COMPLETE +#undef RUNE_STAGE_OUTLINE +#undef RUNE_STAGE_REMOVABLE diff --git a/code/game/objects/items/tail_pin.dm b/code/game/objects/items/tail_pin.dm index 3052075c94d14..de3148dd06dea 100644 --- a/code/game/objects/items/tail_pin.dm +++ b/code/game/objects/items/tail_pin.dm @@ -2,7 +2,7 @@ icon = 'icons/obj/poster.dmi' icon_state = "tailpin" name = "tail pin" - desc = "Offically branded 'pin the tail on the corgi' style party implement. Not intended to be used on people." + desc = "Officially branded 'pin the tail on the corgi' style party implement. Not intended to be used on people." force = 0 w_class = WEIGHT_CLASS_SMALL throwforce = 0 diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm index 592b4b6606cc2..339894eb2d8f0 100644 --- a/code/game/objects/items/tanks/jetpack.dm +++ b/code/game/objects/items/tanks/jetpack.dm @@ -10,25 +10,38 @@ actions_types = list(/datum/action/item_action/set_internals, /datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization) var/gas_type = /datum/gas/oxygen var/on = FALSE - var/stabilizers = FALSE var/full_speed = TRUE // If the jetpack will have a speedboost in space/nograv or not - var/datum/callback/get_mover - var/datum/callback/check_on_move + var/stabilize = FALSE + var/thrust_callback /obj/item/tank/jetpack/Initialize(mapload) . = ..() - get_mover = CALLBACK(src, PROC_REF(get_user)) - check_on_move = CALLBACK(src, PROC_REF(allow_thrust), 0.01) AddElement(/datum/element/update_icon_updates_onmob, ITEM_SLOT_SUITSTORE) - refresh_jetpack() + thrust_callback = CALLBACK(src, PROC_REF(allow_thrust), 0.01) + configure_jetpack(stabilize) /obj/item/tank/jetpack/Destroy() - get_mover = null - check_on_move = null + thrust_callback = null return ..() -/obj/item/tank/jetpack/proc/refresh_jetpack() - AddComponent(/datum/component/jetpack, stabilizers, COMSIG_JETPACK_ACTIVATED, COMSIG_JETPACK_DEACTIVATED, JETPACK_ACTIVATION_FAILED, get_mover, check_on_move, /datum/effect_system/trail_follow/ion) +/** + * configures/re-configures the jetpack component + * + * Arguments + * stabilize - Should this jetpack be stabalized + */ +/obj/item/tank/jetpack/proc/configure_jetpack(stabilize) + src.stabilize = stabilize + + AddComponent( \ + /datum/component/jetpack, \ + src.stabilize, \ + COMSIG_JETPACK_ACTIVATED, \ + COMSIG_JETPACK_DEACTIVATED, \ + JETPACK_ACTIVATION_FAILED, \ + thrust_callback, \ + /datum/effect_system/trail_follow/ion \ + ) /obj/item/tank/jetpack/item_action_slot_check(slot) if(slot & slot_flags) @@ -55,8 +68,8 @@ cycle(user) else if(istype(action, /datum/action/item_action/jetpack_stabilization)) if(on) - set_stabilizers(!stabilizers) - to_chat(user, span_notice("You turn the jetpack stabilization [stabilizers ? "on" : "off"].")) + configure_jetpack(!stabilize) + to_chat(user, span_notice("You turn the jetpack stabilization [stabilize ? "on" : "off"].")) else toggle_internals(user) @@ -73,20 +86,15 @@ else turn_off(user) to_chat(user, span_notice("You turn the jetpack off.")) - update_item_action_buttons() -/obj/item/tank/jetpack/proc/set_stabilizers(new_stabilizers) - if(new_stabilizers == stabilizers) - return - stabilizers = new_stabilizers - refresh_jetpack() + update_item_action_buttons() /obj/item/tank/jetpack/update_icon_state() . = ..() icon_state = "[initial(icon_state)][on ? "-on" : ""]" /obj/item/tank/jetpack/proc/turn_on(mob/user) - if(SEND_SIGNAL(src, COMSIG_JETPACK_ACTIVATED) & JETPACK_ACTIVATION_FAILED) + if(SEND_SIGNAL(src, COMSIG_JETPACK_ACTIVATED, user) & JETPACK_ACTIVATION_FAILED) return FALSE on = TRUE update_icon(UPDATE_ICON_STATE) @@ -95,16 +103,19 @@ return TRUE /obj/item/tank/jetpack/proc/turn_off(mob/user) - SEND_SIGNAL(src, COMSIG_JETPACK_DEACTIVATED) + SEND_SIGNAL(src, COMSIG_JETPACK_DEACTIVATED, user) on = FALSE - set_stabilizers(FALSE) update_icon(UPDATE_ICON_STATE) if(user) user.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed) /obj/item/tank/jetpack/proc/allow_thrust(num, use_fuel = TRUE) + if(!ismob(loc)) + return FALSE + var/mob/user = loc + if((num < 0.005 || air_contents.total_moles() < num)) - turn_off(get_user()) + turn_off(user) return FALSE // We've got the gas, it's chill @@ -113,19 +124,13 @@ var/datum/gas_mixture/removed = remove_air(num) if(removed.total_moles() < 0.005) - turn_off(get_user()) + turn_off(user) return FALSE var/turf/T = get_turf(src) T.assume_air(removed) return TRUE -// Gives the jetpack component the user it expects -/obj/item/tank/jetpack/proc/get_user() - if(!ismob(loc)) - return null - return loc - /obj/item/tank/jetpack/suicide_act(mob/living/user) if (!ishuman(user)) return @@ -146,9 +151,10 @@ full_speed = FALSE //moves at modsuit jetpack speeds /obj/item/tank/jetpack/improvised/allow_thrust(num) - var/mob/user = get_user() - if(!user) + if(!ismob(loc)) return FALSE + + var/mob/user = loc if(rand(0,250) == 0) to_chat(user, span_notice("You feel your jetpack's engines cut out.")) turn_off(user) diff --git a/code/game/objects/items/tanks/tank_types.dm b/code/game/objects/items/tanks/tank_types.dm index 6241aa6d2b3f4..8ebfb6afcc491 100644 --- a/code/game/objects/items/tanks/tank_types.dm +++ b/code/game/objects/items/tanks/tank_types.dm @@ -215,3 +215,37 @@ /obj/item/tank/internals/generic/populate_gas() return + +/* + * Funny internals + */ +/obj/item/tank/internals/emergency_oxygen/engi/clown + name = "funny emergency oxygen tank" + desc = "Used for emergencies. Contains very little oxygen with an extra of a funny gas, so try to conserve it until you actually need it." + icon_state = "emergency_clown" + inhand_icon_state = "emergency_clown" + worn_icon_state = "emergency_clown" + tank_holder_icon_state = "holder_emergency_clown" + distribute_pressure = TANK_CLOWN_RELEASE_PRESSURE + +/obj/item/tank/internals/emergency_oxygen/engi/clown/n2o + +/obj/item/tank/internals/emergency_oxygen/engi/clown/n2o/populate_gas() + air_contents.assert_gases(/datum/gas/oxygen, /datum/gas/nitrous_oxide) + air_contents.gases[/datum/gas/oxygen][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * 0.95 + air_contents.gases[/datum/gas/nitrous_oxide][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * 0.05 + +/obj/item/tank/internals/emergency_oxygen/engi/clown/bz + +/obj/item/tank/internals/emergency_oxygen/engi/clown/bz/populate_gas() + air_contents.assert_gases(/datum/gas/oxygen, /datum/gas/bz) + air_contents.gases[/datum/gas/oxygen][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * 0.9 + air_contents.gases[/datum/gas/bz][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * 0.1 + +/obj/item/tank/internals/emergency_oxygen/engi/clown/helium + distribute_pressure = TANK_CLOWN_RELEASE_PRESSURE + 2 + +/obj/item/tank/internals/emergency_oxygen/engi/clown/helium/populate_gas() + air_contents.assert_gases(/datum/gas/oxygen, /datum/gas/helium) + air_contents.gases[/datum/gas/oxygen][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * 0.75 + air_contents.gases[/datum/gas/helium][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * 0.25 diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index e63a7b4698d59..a93cd92bd4781 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -9,7 +9,7 @@ */ /obj/item/tank name = "tank" - icon = 'icons/obj/atmospherics/tank.dmi' + icon = 'icons/obj/canisters.dmi' icon_state = "generic" inhand_icon_state = "generic_tank" lefthand_file = 'icons/mob/inhands/equipment/tanks_lefthand.dmi' diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index a126f264150f2..04eb28e236ec2 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -2,7 +2,7 @@ /obj/item/watertank name = "backpack water tank" desc = "A S.U.N.S.H.I.N.E. brand watertank backpack with nozzle to water plants." - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "waterbackpack" inhand_icon_state = "waterbackpack" lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi' @@ -118,7 +118,7 @@ /obj/item/reagent_containers/spray/mister name = "water mister" desc = "A mister nozzle attached to a water tank." - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "mister" inhand_icon_state = "mister" lefthand_file = 'icons/mob/inhands/equipment/mister_lefthand.dmi' @@ -157,7 +157,7 @@ /obj/item/reagent_containers/spray/mister/janitor name = "janitor spray nozzle" desc = "A janitorial spray nozzle attached to a watertank, designed to clean up large messes." - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "misterjani" inhand_icon_state = "misterjani" lefthand_file = 'icons/mob/inhands/equipment/mister_lefthand.dmi' @@ -176,7 +176,7 @@ /obj/item/watertank/pepperspray name = "ANTI-TIDER-2500 suppression backpack" desc = "The ultimate crowd-control device; this tool allows the user to quickly and efficiently pacify groups of hostile targets." - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "pepperbackpacksec" inhand_icon_state = "pepperbackpacksec" custom_price = PAYCHECK_CREW * 2 @@ -189,7 +189,7 @@ /obj/item/reagent_containers/spray/mister/pepperspray name = "security spray nozzle" desc = "A pacifying spray nozzle attached to a pepperspray tank, designed to silence perps." - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "mistersec" inhand_icon_state = "mistersec" lefthand_file = 'icons/mob/inhands/equipment/mister_lefthand.dmi' @@ -236,7 +236,7 @@ /obj/item/extinguisher/mini/nozzle name = "extinguisher nozzle" desc = "A heavy duty nozzle attached to a firefighter's backpack tank." - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "atmos_nozzle" inhand_icon_state = "nozzleatmos" lefthand_file = 'icons/mob/inhands/equipment/mister_lefthand.dmi' @@ -380,7 +380,7 @@ /obj/item/reagent_containers/chemtank name = "backpack chemical injector" desc = "A chemical autoinjector that can be carried on your back." - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "waterbackpackchem" inhand_icon_state = "waterbackpackchem" lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi' @@ -428,7 +428,7 @@ if(isinhands || !reagents.total_volume) return - var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "backpackmob-10") + var/mutable_appearance/filling = mutable_appearance('icons/obj/medical/reagent_fillings.dmi', "backpackmob-10") var/percent = round((reagents.total_volume / volume) * 100) switch(percent) if(0 to 15) diff --git a/code/game/objects/items/tcg/tcg_machines.dm b/code/game/objects/items/tcg/tcg_machines.dm index 20adc90b545dd..a38bb8a95994e 100644 --- a/code/game/objects/items/tcg/tcg_machines.dm +++ b/code/game/objects/items/tcg/tcg_machines.dm @@ -306,7 +306,10 @@ GLOBAL_LIST_EMPTY(tcgcard_mana_bar_radial_choices) /obj/machinery/trading_card_button/Initialize(mapload) . = ..() - display_panel_ref = new display_panel_type(locate(x + panel_offset_x, y + panel_offset_y, z)) + var/obj/effect/decal/trading_card_panel/new_panel = new display_panel_type(get_turf(src)) + new_panel.pixel_x = panel_offset_x + new_panel.pixel_y = panel_offset_y + display_panel_ref = new_panel /obj/machinery/trading_card_button/Destroy() QDEL_NULL(display_panel_ref) @@ -365,7 +368,7 @@ GLOBAL_LIST_EMPTY(tcgcard_mana_bar_radial_choices) desc = "A set of buttons that lets you keep track of your life shards when playing Tactical Game Cards." icon_state = "health_buttons" display_panel_type = /obj/effect/decal/trading_card_panel/health - panel_offset_x = -1 + panel_offset_x = -24 ///Global list containing all options used for the TGC health button. GLOBAL_LIST_EMPTY(tcgcard_health_bar_radial_choices) diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm index 5abe8facbc313..e859938333e0a 100644 --- a/code/game/objects/items/teleportation.dm +++ b/code/game/objects/items/teleportation.dm @@ -170,7 +170,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 SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/computer/teleporter)) var/atom/target = computer.target_ref?.resolve() if(!target) computer.target_ref = null @@ -460,7 +460,8 @@ new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(mobloc) new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(emergency_destination) balloon_alert(user, "emergency teleport triggered!") - make_bloods(mobloc, emergency_destination, user) + if (!HAS_TRAIT(user, TRAIT_NOBLOOD)) + make_bloods(mobloc, emergency_destination, user) playsound(mobloc, SFX_SPARKS, 50, 1, SHORT_RANGE_SOUND_EXTRARANGE) playsound(emergency_destination, 'sound/effects/phasein.ogg', 25, 1, SHORT_RANGE_SOUND_EXTRARANGE) playsound(emergency_destination, SFX_SPARKS, 50, 1, SHORT_RANGE_SOUND_EXTRARANGE) @@ -483,7 +484,7 @@ destination.ex_act(EXPLODE_HEAVY) victim.unequip_everything() victim.investigate_log("has been gibbed by [src].", INVESTIGATE_DEATHS) - victim.gib() + victim.gib(DROP_ALL_REMAINS) ///Damage and stun all mobs in fragging_location turf, called after a teleport /obj/item/syndicate_teleporter/proc/telefrag(turf/fragging_location, mob/user) // Don't let this gib. Never let this gib. diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm index a6bc209966adc..8f357e0513917 100644 --- a/code/game/objects/items/theft_tools.dm +++ b/code/game/objects/items/theft_tools.dm @@ -7,7 +7,7 @@ /obj/item/nuke_core name = "plutonium core" desc = "Extremely radioactive. Wear goggles." - icon = 'icons/obj/nuke_tools.dmi' + icon = 'icons/obj/antags/syndicate_tools.dmi' icon_state = "plutonium_core" inhand_icon_state = "plutoniumcore" resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF @@ -43,7 +43,7 @@ /obj/item/nuke_core_container name = "nuke core container" desc = "Solid container for radioactive objects." - icon = 'icons/obj/nuke_tools.dmi' + icon = 'icons/obj/antags/syndicate_tools.dmi' icon_state = "core_container_empty" inhand_icon_state = "tile" lefthand_file = 'icons/mob/inhands/items/tiles_lefthand.dmi' @@ -86,7 +86,7 @@ /obj/item/screwdriver/nuke name = "screwdriver" desc = "A screwdriver with an ultra thin tip that's carefully designed to boost screwing speed." - icon = 'icons/obj/nuke_tools.dmi' + icon = 'icons/obj/antags/syndicate_tools.dmi' icon_state = "screwdriver_nuke" inhand_icon_state = "screwdriver_nuke" toolspeed = 0.5 @@ -129,7 +129,7 @@ /obj/item/computer_disk/hdd_theft name = "r&d server hard disk drive" desc = "For some reason, people really seem to want to steal this. The source code on this drive is probably used for something awful!" - icon = 'icons/obj/nuke_tools.dmi' + icon = 'icons/obj/antags/syndicate_tools.dmi' icon_state = "something_awful" max_capacity = 512 w_class = WEIGHT_CLASS_NORMAL @@ -260,7 +260,7 @@ /obj/item/scalpel/supermatter name = "supermatter scalpel" desc = "A scalpel with a fragile tip of condensed hyper-noblium gas, searingly cold to the touch, that can safely shave a sliver off a supermatter crystal." - icon = 'icons/obj/nuke_tools.dmi' + icon = 'icons/obj/antags/syndicate_tools.dmi' icon_state = "supermatter_scalpel" toolspeed = 0.5 damtype = BURN @@ -274,7 +274,7 @@ /obj/item/hemostat/supermatter name = "supermatter extraction tongs" desc = "A pair of tongs made from condensed hyper-noblium gas, searingly cold to the touch, that can safely grip a supermatter sliver." - icon = 'icons/obj/nuke_tools.dmi' + icon = 'icons/obj/antags/syndicate_tools.dmi' icon_state = "supermatter_tongs" lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' righthand_file = 'icons/mob/inhands/items_righthand.dmi' diff --git a/code/game/objects/items/tongs.dm b/code/game/objects/items/tongs.dm new file mode 100644 index 0000000000000..8e7753bf48849 --- /dev/null +++ b/code/game/objects/items/tongs.dm @@ -0,0 +1,100 @@ +/// Tongs, let you pick up and feed people food from further away. +/obj/item/kitchen/tongs + name = "tongs" + desc = "So you never have to touch anything with your dirty, unwashed hands." + reach = 2 + icon_state = "tongs" + base_icon_state = "tongs" + inhand_icon_state = "fork" // close enough + attack_verb_continuous = list("pinches", "tongs", "nips") + attack_verb_simple = list("pinch", "tong", "nip") + /// What are we holding in our tongs? + var/obj/item/tonged + /// Sound to play when we click our tongs together + var/clack_sound = 'sound/items/handling/component_drop.ogg' + /// Time to wait between clacking sounds + var/clack_delay = 2 SECONDS + /// Have we clacked recently? + COOLDOWN_DECLARE(clack_cooldown) + +/obj/item/kitchen/tongs/Destroy(force) + QDEL_NULL(tonged) + return ..() + +/obj/item/kitchen/tongs/examine(mob/user) + . = ..() + if (!isnull(tonged)) + . += span_notice("It is holding [tonged].") + +/obj/item/kitchen/tongs/dropped(mob/user, silent) + . = ..() + drop_tonged() + +/obj/item/kitchen/tongs/attack_self(mob/user, modifiers) + . = ..() + if(.) + return TRUE + if (!isnull(tonged)) + drop_tonged() + return TRUE + if (!COOLDOWN_FINISHED(src, clack_cooldown)) + return TRUE + user.visible_message(span_notice("[user] clacks [user.p_their()] [src] together like a crab. Click clack!")) + click_clack() + return TRUE + +/// Release the food we are holding +/obj/item/kitchen/tongs/proc/drop_tonged() + if (isnull(tonged)) + return + visible_message(span_notice("[tonged] falls to the ground!")) + var/turf/location = drop_location() + tonged.forceMove(location) + tonged.do_drop_animation(location) + +/// Play a clacking sound and appear closed, then open again +/obj/item/kitchen/tongs/proc/click_clack() + COOLDOWN_START(src, clack_cooldown, clack_delay) + playsound(src, clack_sound, vol = 100, vary = FALSE) + icon_state = "[base_icon_state]_closed" + var/delay = min(0.5 SECONDS, clack_delay / 2) // Just in case someone's been fucking with the cooldown + addtimer(CALLBACK(src, PROC_REF(clack)), delay, TIMER_DELETE_ME) + +/// Plays a clacking sound and appear open +/obj/item/kitchen/tongs/proc/clack() + playsound(src, clack_sound, vol = 100, vary = FALSE) + icon_state = base_icon_state + +/obj/item/kitchen/tongs/Exited(atom/movable/leaving, direction) + . = ..() + if (leaving != tonged) + return + tonged = null + update_appearance(UPDATE_ICON) + +/obj/item/kitchen/tongs/pre_attack(obj/item/attacked, mob/living/user, params) + if (!isnull(tonged)) + attacked.attackby(tonged, user) + return TRUE + if (isliving(attacked)) + if (COOLDOWN_FINISHED(src, clack_cooldown)) + click_clack() + return ..() + if (!IsEdible(attacked) || attacked.w_class > WEIGHT_CLASS_NORMAL || !isnull(tonged)) + return ..() + tonged = attacked + attacked.do_pickup_animation(src) + attacked.forceMove(src) + update_appearance(UPDATE_ICON) + +/obj/item/kitchen/tongs/update_overlays() + . = ..() + if (isnull(tonged)) + return + var/mutable_appearance/held_food = new /mutable_appearance(tonged.appearance) + held_food.layer = layer + held_food.plane = plane + held_food.transform = held_food.transform.Scale(0.7, 0.7) + held_food.pixel_x = 6 + held_food.pixel_y = 6 + . += held_food diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index 9203c8a123e3c..11470620c49f5 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -45,7 +45,7 @@ /obj/item/crowbar/abductor name = "alien crowbar" desc = "A hard-light crowbar. It appears to pry by itself, without any effort required." - icon = 'icons/obj/abductor.dmi' + icon = 'icons/obj/antags/abductor.dmi' usesound = 'sound/weapons/sonic_jackhammer.ogg' custom_materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/silver = SHEET_MATERIAL_AMOUNT*1.25, /datum/material/plasma =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/titanium =SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT) icon_state = "crowbar" @@ -107,9 +107,13 @@ /// Used on Initialize, how much time to cut real handcuffs. Null means it can't. var/snap_time_strong_handcuffs = 0 SECONDS +/obj/item/crowbar/power/get_all_tool_behaviours() + return list(TOOL_CROWBAR, TOOL_WIRECUTTER) + /obj/item/crowbar/power/Initialize(mapload) . = ..() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ force_on = force, \ throwforce_on = throwforce, \ hitsound_on = hitsound, \ @@ -128,8 +132,9 @@ SIGNAL_HANDLER tool_behaviour = (active ? TOOL_WIRECUTTER : TOOL_CROWBAR) - balloon_alert(user, "attached [active ? "cutting" : "prying"]") - playsound(user ? user : src, 'sound/items/change_jaws.ogg', 50, TRUE) + if(user) + balloon_alert(user, "attached [active ? "cutting" : "prying"]") + playsound(src, 'sound/items/change_jaws.ogg', 50, TRUE) if(tool_behaviour == TOOL_CROWBAR) RemoveElement(/datum/element/cuffsnapping, snap_time_weak_handcuffs, snap_time_strong_handcuffs) else diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index d9ad265ced8b6..2c95d657181ad 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -62,7 +62,7 @@ /obj/item/screwdriver/abductor name = "alien screwdriver" desc = "An ultrasonic screwdriver." - icon = 'icons/obj/abductor.dmi' + icon = 'icons/obj/antags/abductor.dmi' icon_state = "screwdriver_a" inhand_icon_state = "screwdriver_nuke" custom_materials = list(/datum/material/iron=HALF_SHEET_MATERIAL_AMOUNT*5, /datum/material/silver=SHEET_MATERIAL_AMOUNT*1.25, /datum/material/plasma =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/titanium =SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT) @@ -101,9 +101,13 @@ greyscale_config_inhand_left = null greyscale_config_inhand_right = null +/obj/item/screwdriver/power/get_all_tool_behaviours() + return list(TOOL_SCREWDRIVER, TOOL_WRENCH) + /obj/item/screwdriver/power/Initialize(mapload) . = ..() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ force_on = force, \ throwforce_on = throwforce, \ hitsound_on = hitsound, \ @@ -122,8 +126,9 @@ SIGNAL_HANDLER tool_behaviour = (active ? TOOL_WRENCH : TOOL_SCREWDRIVER) - balloon_alert(user, "attached [active ? "bolt bit" : "screw bit"]") - playsound(user ? user : src, 'sound/items/change_drill.ogg', 50, TRUE) + if(user) + balloon_alert(user, "attached [active ? "bolt bit" : "screw bit"]") + playsound(src, 'sound/items/change_drill.ogg', 50, TRUE) return COMPONENT_NO_DEFAULT_MESSAGE /obj/item/screwdriver/power/examine() diff --git a/code/game/objects/items/tools/spess_knife.dm b/code/game/objects/items/tools/spess_knife.dm index da567e9ad770a..591954100008d 100644 --- a/code/game/objects/items/tools/spess_knife.dm +++ b/code/game/objects/items/tools/spess_knife.dm @@ -23,6 +23,9 @@ ///Chance to select wrong tool var/wrong_tool_prob = 10 +/obj/item/spess_knife/get_all_tool_behaviours() + return list(TOOL_KNIFE, TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + /obj/item/spess_knife/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, \ diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 66b5dd5bfd40e..daf80262e4bd8 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 5 /obj/item/weldingtool name = "welding tool" desc = "A standard edition welder provided by Nanotrasen." @@ -140,7 +140,7 @@ var/obj/item/bodypart/affecting = attacked_humanoid.get_bodypart(check_zone(user.zone_selected)) - if(affecting && !IS_ORGANIC_LIMB(affecting) && !user.combat_mode) + if(affecting && IS_ROBOTIC_LIMB(affecting) && !user.combat_mode) if(src.use_tool(attacked_humanoid, user, 0, volume=50, amount=1)) if(user == attacked_humanoid) user.visible_message(span_notice("[user] starts to fix some of the dents on [attacked_humanoid]'s [affecting.name]."), @@ -167,7 +167,7 @@ if(!status && attacked_atom.is_refillable()) . |= AFTERATTACK_PROCESSED_ITEM - reagents.trans_to(attacked_atom, reagents.total_volume, transfered_by = user) + reagents.trans_to(attacked_atom, reagents.total_volume, transferred_by = user) to_chat(user, span_notice("You empty [src]'s fuel tank into [attacked_atom].")) update_appearance() @@ -325,7 +325,7 @@ to_chat(user, span_warning("You need one rod to start building a flamethrower!")) /obj/item/weldingtool/ignition_effect(atom/ignitable_atom, mob/user) - if(use_tool(ignitable_atom, user, 0, amount=1)) + if(use_tool(ignitable_atom, user, 0)) return span_notice("[user] casually lights [ignitable_atom] with [src], what a badass.") else return "" @@ -377,7 +377,7 @@ /obj/item/weldingtool/abductor name = "alien welding tool" desc = "An alien welding tool. Whatever fuel it uses, it never runs out." - icon = 'icons/obj/abductor.dmi' + icon = 'icons/obj/antags/abductor.dmi' icon_state = "welder" toolspeed = 0.1 custom_materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/silver = SHEET_MATERIAL_AMOUNT*1.25, /datum/material/plasma =SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/titanium =SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT) diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm index df597bbcfc4af..bd9b463473eb7 100644 --- a/code/game/objects/items/tools/wirecutters.dm +++ b/code/game/objects/items/tools/wirecutters.dm @@ -66,7 +66,7 @@ /obj/item/wirecutters/abductor name = "alien wirecutters" desc = "Extremely sharp wirecutters, made out of a silvery-green metal." - icon = 'icons/obj/abductor.dmi' + icon = 'icons/obj/antags/abductor.dmi' custom_materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/silver = SHEET_MATERIAL_AMOUNT*1.25, /datum/material/plasma =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/titanium =SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT) icon_state = "cutters" toolspeed = 0.1 diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm index 07c49ded192f5..70dc666aa93fb 100644 --- a/code/game/objects/items/tools/wrench.dm +++ b/code/game/objects/items/tools/wrench.dm @@ -40,7 +40,7 @@ /obj/item/wrench/abductor name = "alien wrench" desc = "A polarized wrench. It causes anything placed between the jaws to turn." - icon = 'icons/obj/abductor.dmi' + icon = 'icons/obj/antags/abductor.dmi' belt_icon_state = "wrench_alien" custom_materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/silver = SHEET_MATERIAL_AMOUNT*1.25, /datum/material/plasma =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/titanium =SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT) usesound = 'sound/effects/empulse.ogg' @@ -69,7 +69,7 @@ user.Stun(100, ignore_canstun = TRUE)// Stun stops them from wandering off user.set_light_color(COLOR_VERY_SOFT_YELLOW) user.set_light(2) - user.add_overlay(mutable_appearance('icons/effects/genetics.dmi', "servitude", -MUTATIONS_LAYER)) + user.add_overlay(mutable_appearance('icons/mob/effects/genetics.dmi', "servitude", -MUTATIONS_LAYER)) playsound(loc, 'sound/effects/pray.ogg', 50, TRUE, -1) // Let the sound effect finish playing @@ -102,12 +102,14 @@ /obj/item/wrench/combat/Initialize(mapload) . = ..() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ force_on = 6, \ throwforce_on = 8, \ hitsound_on = hitsound, \ w_class_on = WEIGHT_CLASS_NORMAL, \ - clumsy_check = FALSE) + clumsy_check = FALSE, \ + ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) /* @@ -118,13 +120,10 @@ /obj/item/wrench/combat/proc/on_transform(obj/item/source, mob/user, active) SIGNAL_HANDLER - if(active) - tool_behaviour = TOOL_WRENCH - else - tool_behaviour = initial(tool_behaviour) - - balloon_alert(user, "[name] [active ? "active, woe!":"restrained"]") - playsound(user ? user : src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 5, TRUE) + tool_behaviour = active ? TOOL_WRENCH : initial(tool_behaviour) + if(user) + balloon_alert(user, "[name] [active ? "active, woe!":"restrained"]") + playsound(src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 5, TRUE) return COMPONENT_NO_DEFAULT_MESSAGE /obj/item/wrench/bolter diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 82d2ac2adb5a5..c7f93c6ea68bf 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -31,6 +31,7 @@ throw_speed = 3 throw_range = 7 force = 0 + worn_icon_state = "nothing" /* * Balloons @@ -61,7 +62,7 @@ else if(reagents.total_volume >= 10) to_chat(user, span_warning("[src] is full.")) else - A.reagents.trans_to(src, 10, transfered_by = user) + A.reagents.trans_to(src, 10, transferred_by = user) to_chat(user, span_notice("You fill the balloon with the contents of [A].")) desc = "A translucent balloon with some form of liquid sloshing around in it." update_appearance() @@ -76,7 +77,7 @@ else desc = "A translucent balloon with some form of liquid sloshing around in it." to_chat(user, span_notice("You fill the balloon with the contents of [I].")) - I.reagents.trans_to(src, 10, transfered_by = user) + I.reagents.trans_to(src, 10, transferred_by = user) update_appearance() else if(I.get_sharpness()) balloon_burst() @@ -128,19 +129,19 @@ var/random_color = TRUE /obj/item/toy/balloon/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/ammo_casing/caseless/foam_dart) && ismonkey(user)) + if(istype(I, /obj/item/ammo_casing/foam_dart) && ismonkey(user)) pop_balloon(monkey_pop = TRUE) else return ..() /obj/item/toy/balloon/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) - if(ismonkey(throwingdatum.thrower) && istype(AM, /obj/item/ammo_casing/caseless/foam_dart)) + if(ismonkey(throwingdatum.thrower) && istype(AM, /obj/item/ammo_casing/foam_dart)) pop_balloon(monkey_pop = TRUE) else return ..() /obj/item/toy/balloon/bullet_act(obj/projectile/P) - if((istype(P,/obj/projectile/bullet/p50) || istype(P,/obj/projectile/bullet/reusable/foam_dart)) && ismonkey(P.firer)) + if((istype(P,/obj/projectile/bullet/p50) || istype(P,/obj/projectile/bullet/foam_dart)) && ismonkey(P.firer)) pop_balloon(monkey_pop = TRUE) else return ..() @@ -248,7 +249,7 @@ /obj/item/toy/spinningtoy name = "gravitational singularity" desc = "\"Singulo\" brand spinning toy." - icon = 'icons/obj/engine/singularity.dmi' + icon = 'icons/obj/machines/engine/singularity.dmi' icon_state = "singularity_s1" item_flags = NO_PIXEL_RANDOM_DROP @@ -284,7 +285,7 @@ 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... user.visible_message(span_danger("[user] regurgitates [src]!")) // I swear i dont have a fetish - user.vomit(100, TRUE, distance = 0) + user.vomit(VOMIT_CATEGORY_BLOOD, lost_nutrition = 100, distance = 0) user.adjustOxyLoss(120) user.dropItemToGround(src) // incase the crit state doesn't drop the singulo to the floor user.set_suicide(FALSE) @@ -304,7 +305,7 @@ horrible thing, I realized immediately what I \ had to do: sell marketable toys of it. \ \"
- Chief Engineer Miles O'Brien" - icon = 'icons/obj/engine/singularity.dmi' + icon = 'icons/obj/machines/engine/singularity.dmi' icon_state = "dark_matter_s1" /* @@ -409,7 +410,8 @@ /obj/item/toy/sword/Initialize(mapload) . = ..() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ throw_speed_on = throw_speed, \ hitsound_on = hitsound, \ clumsy_check = FALSE, \ @@ -432,8 +434,11 @@ */ /obj/item/toy/sword/proc/on_transform(obj/item/source, mob/user, active) SIGNAL_HANDLER - balloon_alert(user, "[active ? "flicked out":"pushed in"] [src]") - playsound(user ? user : src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 20, TRUE) + + if(user) + balloon_alert(user, "[active ? "flicked out":"pushed in"] [src]") + + playsound(src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 20, TRUE) update_appearance(UPDATE_ICON) return COMPONENT_NO_DEFAULT_MESSAGE @@ -464,9 +469,7 @@ /obj/item/toy/sword/update_icon_state() . = ..() - var/datum/component/transforming/transforming_comp = GetComponent(/datum/component/transforming) - var/active = transforming_comp?.active - var/last_part = active ? "_on[saber_color ? "_[saber_color]" : null]" : null + var/last_part = HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE) ? "_on[saber_color ? "_[saber_color]" : null]" : null icon_state = "[initial(icon_state)][last_part]" inhand_icon_state = "[initial(inhand_icon_state)][last_part]" @@ -660,7 +663,7 @@ SIGNAL_HANDLER if(ishuman(H) || issilicon(H)) //i guess carp and shit shouldn't set them off var/mob/living/carbon/M = H - if(issilicon(H) || M.m_intent == MOVE_INTENT_RUN) + if(issilicon(H) || M.move_intent == MOVE_INTENT_RUN) to_chat(M, span_danger("You step on the snap pop!")) pop_burst(2, 0) @@ -744,7 +747,7 @@ /obj/item/toy/talking/codex_gigas name = "Toy Codex Gigas" desc = "A tool to help you write fictional devils!" - icon = 'icons/obj/library.dmi' + icon = 'icons/obj/service/library.dmi' icon_state = "demonomicon" lefthand_file = 'icons/mob/inhands/items/books_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/books_righthand.dmi' @@ -812,11 +815,12 @@ to_chat(user, span_alert("Nothing happens, and '
[round(timeleft/10)]' appears on the small display.")) sleep(0.5 SECONDS) -/obj/item/toy/nuke/emag_act(mob/user) +/obj/item/toy/nuke/emag_act(mob/user, obj/item/card/emag/emag_card) if (obj_flags & EMAGGED) - return - to_chat(user, span_warning("You short-circuit \the [src].")) + return FALSE + balloon_alert(user, "explosive simulation enabled") obj_flags |= EMAGGED + return TRUE /* * Fake meteor @@ -829,24 +833,21 @@ inhand_icon_state = "minimeteor" w_class = WEIGHT_CLASS_SMALL -/obj/item/toy/minimeteor/emag_act(mob/user) +/obj/item/toy/minimeteor/emag_act(mob/user, obj/item/card/emag/emag_card) if (obj_flags & EMAGGED) - return - to_chat(user, span_warning("You short-circuit whatever electronics exist inside \the [src], if there even are any.")) + return FALSE + to_chat(user, span_warning("You short circuit whatever electronics exist inside. The \"meteor\" suddenly feels a lot heavier...?")) + // not adding a balloon alert here since its hard to actually describe what this emag does in the balloon obj_flags |= EMAGGED + return TRUE /obj/item/toy/minimeteor/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + playsound(src, 'sound/effects/meteorimpact.ogg', 40, TRUE) + for(var/mob/M in urange(10, src)) + if(!M.stat && !isAI(M)) + shake_camera(M, 3, 1) if (obj_flags & EMAGGED) - playsound(src, 'sound/effects/meteorimpact.ogg', 40, TRUE) explosion(src, devastation_range = -1, heavy_impact_range = -1, light_impact_range = 1) - for(var/mob/M in urange(10, src)) - if(!M.stat && !isAI(M)) - shake_camera(M, 3, 1) - else - playsound(src, 'sound/effects/meteorimpact.ogg', 40, TRUE) - for(var/mob/M in urange(10, src)) - if(!M.stat && !isAI(M)) - shake_camera(M, 3, 1) /* * Toy big red button @@ -916,6 +917,7 @@ icon = 'icons/obj/toys/balls.dmi' icon_state = "baseball" inhand_icon_state = "baseball" + w_class = WEIGHT_CLASS_SMALL throw_range = 9 throw_speed = 0.5 @@ -950,7 +952,7 @@ /obj/item/toy/toy_dagger name = "toy dagger" desc = "A cheap plastic replica of a dagger. Produced by THE ARM Toys, Inc." - icon = 'icons/obj/cult/items_and_weapons.dmi' + icon = 'icons/obj/weapons/khopesh.dmi' icon_state = "render" inhand_icon_state = "cultdagger" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' @@ -1303,7 +1305,7 @@ /obj/item/toy/eldritch_book name = "Codex Cicatrix" desc = "A toy book that closely resembles the Codex Cicatrix. Covered in fake polyester human flesh and has a huge goggly eye attached to the cover. The runes are gibberish and cannot be used to summon demons... Hopefully?" - icon = 'icons/obj/eldritch.dmi' + icon = 'icons/obj/antags/eldritch.dmi' base_icon_state = "book" icon_state = "book" worn_icon_state = "book" @@ -1605,11 +1607,12 @@ GLOBAL_LIST_EMPTY(intento_players) START_PROCESSING(SSfastprocess, src) COOLDOWN_START(src, next_icon_reset, TIME_TO_RESET_ICON) -/obj/item/toy/intento/emag_act(mob/user) +/obj/item/toy/intento/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE obj_flags |= EMAGGED - to_chat(user, span_notice("You short-circuit [src], activating the negative feedback loop.")) + balloon_alert(user, "negative feedback loop enabled") + return TRUE /obj/item/toy/intento/Destroy() STOP_PROCESSING(SSfastprocess, src) @@ -1629,3 +1632,21 @@ GLOBAL_LIST_EMPTY(intento_players) #undef TIME_TO_BEGIN #undef TIME_PER_DEMO_STEP #undef TIME_TO_RESET_ICON + +/* + * Runic Scepter + */ +/obj/item/toy/foam_runic_scepter + name = "foam scepter" + desc = "A foam replica of the scepters Wizards us on Vendormancy Soccer." + icon_state = "vendor_staff" + worn_icon_state = "vendor_staff" //For the back + inhand_icon_state = "vendor_staff" + lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' + icon = 'icons/obj/weapons/guns/magic.dmi' + slot_flags = ITEM_SLOT_BACK + attack_verb_continuous = list("smacks", "clubs", "wacks", "vendors") + attack_verb_simple = list("smack", "club", "wacks", "vendor") + w_class = WEIGHT_CLASS_SMALL + resistance_flags = FLAMMABLE diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 7ec6e5f5be60b..ffca12c094ffd 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -1,12 +1,12 @@ //Added by Jack Rost /obj/item/trash - icon = 'icons/obj/janitor.dmi' + icon = 'icons/obj/service/janitor.dmi' lefthand_file = 'icons/mob/inhands/items/food_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/food_righthand.dmi' desc = "This is rubbish." w_class = WEIGHT_CLASS_TINY resistance_flags = FLAMMABLE - item_flags = NOBLUDGEON + item_flags = NOBLUDGEON|SKIP_FANTASY_ON_SPAWN /obj/item/trash/Initialize(mapload) var/turf/T = get_turf(src) @@ -180,3 +180,46 @@ desc = "It's been Donk-decimated." icon_state = "ready_donk" +/obj/item/trash/can/food/squid_ink + name = "canned squid ink" + icon_state = "squidinkcan_empty" + +/obj/item/trash/can/food/chap + name = "can of CHAP" + icon_state = "chapcan_empty" + +/obj/item/trash/hot_shots + name = "\improper Hot Shots box" + icon_state = "hot_shots" + +/obj/item/trash/sticko + name = "\improper Sticko box" + icon_state = "sticko" + +/obj/item/trash/sticko/matcha + icon_state = "sticko_matcha" + +/obj/item/trash/sticko/nutty + icon_state = "sticko_nutty" + +/obj/item/trash/sticko/pineapple + icon_state = "sticko_pineapple" + +/obj/item/trash/sticko/yuyake + icon_state = "sticko_yuyake" + +/obj/item/trash/shok_roks + name = "\improper Shok-Roks packet" + icon_state = "shok_roks" + +/obj/item/trash/shok_roks/citrus + icon_state = "shok_roks_citrus" + +/obj/item/trash/shok_roks/berry + icon_state = "shok_roks_berry" + +/obj/item/trash/shok_roks/tropical + icon_state = "shok_roks_tropical" + +/obj/item/trash/shok_roks/lanternfruit + icon_state = "shok_roks_lanternfruit" diff --git a/code/game/objects/items/wall_mounted.dm b/code/game/objects/items/wall_mounted.dm index e98ad037a6296..48142778a925e 100644 --- a/code/game/objects/items/wall_mounted.dm +++ b/code/game/objects/items/wall_mounted.dm @@ -1,5 +1,5 @@ /obj/item/wallframe - icon = 'icons/obj/wallframe.dmi' + icon = 'icons/obj/machines/wallmounts.dmi' custom_materials = list(/datum/material/iron= SHEET_MATERIAL_AMOUNT * 2) flags_1 = CONDUCT_1 inhand_icon_state = "syringe_kit" @@ -40,20 +40,19 @@ span_hear("You hear clicking.")) var/floor_to_wall = get_dir(user, on_wall) - var/obj/O = new result_path(get_turf(user), floor_to_wall, TRUE) - O.setDir(floor_to_wall) - + var/obj/hanging_object = new result_path(get_turf(user), floor_to_wall, TRUE) + hanging_object.setDir(floor_to_wall) if(pixel_shift) switch(floor_to_wall) if(NORTH) - O.pixel_y = pixel_shift + hanging_object.pixel_y = pixel_shift if(SOUTH) - O.pixel_y = -pixel_shift + hanging_object.pixel_y = -pixel_shift if(EAST) - O.pixel_x = pixel_shift + hanging_object.pixel_x = pixel_shift if(WEST) - O.pixel_x = -pixel_shift - after_attach(O) + hanging_object.pixel_x = -pixel_shift + after_attach(hanging_object) qdel(src) @@ -84,7 +83,7 @@ /obj/item/electronics desc = "Looks like a circuit. Probably is." - icon = 'icons/obj/module.dmi' + icon = 'icons/obj/assemblies/module.dmi' icon_state = "door_electronics" inhand_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 80086f9672591..8c949b36a79e4 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -151,12 +151,18 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/claymore/highlander/pickup(mob/living/user) . = ..() to_chat(user, span_notice("The power of Scotland protects you! You are shielded from all stuns and knockdowns.")) - user.add_stun_absorption("highlander", INFINITY, 1, " is protected by the power of Scotland!", "The power of Scotland absorbs the stun!", " is protected by the power of Scotland!") - user.ignore_slowdown(HIGHLANDER) + user.ignore_slowdown(HIGHLANDER_TRAIT) + user.add_stun_absorption( + source = HIGHLANDER_TRAIT, + message = span_warning("%EFFECT_OWNER is protected by the power of Scotland!"), + self_message = span_boldwarning("The power of Scotland absorbs the stun!"), + examine_message = span_warning("%EFFECT_OWNER_THEYRE protected by the power of Scotland!"), + ) /obj/item/claymore/highlander/dropped(mob/living/user) . = ..() - user.unignore_slowdown(HIGHLANDER) + user.unignore_slowdown(HIGHLANDER_TRAIT) + user.remove_stun_absorption(HIGHLANDER_TRAIT) /obj/item/claymore/highlander/examine(mob/user) . = ..() @@ -296,69 +302,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 = 'icons/obj/weapons/spear.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= HALF_SHEET_MATERIAL_AMOUNT + SMALL_MATERIAL_AMOUNT * 1.5, /datum/material/glass= SMALL_MATERIAL_AMOUNT * 0.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, initial(recipe_to_use.time), src)) // 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(isigniter(attacking_item) && !(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, initial(recipe_to_use.time), src)) - 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." @@ -414,6 +357,9 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /// Whether the switchblade starts extended or not. var/start_extended = FALSE +/obj/item/switchblade/get_all_tool_behaviours() + return list(TOOL_KNIFE) + /obj/item/switchblade/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_updates_onmob) @@ -422,7 +368,8 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 effectiveness = 100, \ ) - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ start_transformed = start_extended, \ force_on = 20, \ throwforce_on = 23, \ @@ -497,13 +444,15 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/cane/white/Initialize(mapload) . = ..() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ force_on = 7, \ hitsound_on = hitsound, \ w_class_on = WEIGHT_CLASS_BULKY, \ clumsy_check = FALSE, \ attack_verb_continuous_on = list("smacks", "strikes", "cracks", "beats"), \ - attack_verb_simple_on = list("smack", "strike", "crack", "beat")) + attack_verb_simple_on = list("smack", "strike", "crack", "beat"), \ + ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) ADD_TRAIT(src, TRAIT_BLIND_TOOL, INNATE_TRAIT) @@ -515,8 +464,9 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/cane/white/proc/on_transform(obj/item/source, mob/user, active) SIGNAL_HANDLER - balloon_alert(user, active ? "extended" : "collapsed") - playsound(user ? user : src, 'sound/weapons/batonextend.ogg', 50, TRUE) + if(user) + balloon_alert(user, active ? "extended" : "collapsed") + playsound(src, 'sound/weapons/batonextend.ogg', 50, TRUE) return COMPONENT_NO_DEFAULT_MESSAGE /obj/item/staff @@ -569,15 +519,16 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 name = "ectoplasm" desc = "Spooky." gender = PLURAL - icon = 'icons/obj/wizard.dmi' + icon = 'icons/effects/magic.dmi' icon_state = "ectoplasm" + grind_results = list(/datum/reagent/hauntium = 25) //can be ground into hauntium /obj/item/ectoplasm/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is inhaling [src]! It looks like [user.p_theyre()] trying to visit the astral plane!")) return OXYLOSS /obj/item/ectoplasm/angelic - icon = 'icons/obj/wizard.dmi' + icon = 'icons/effects/magic.dmi' icon_state = "angelplasm" /obj/item/ectoplasm/mystic @@ -606,6 +557,100 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 desc = "A bust of the famous Greek physician Hippocrates of Kos, often referred to as the father of western medicine." icon_state = "hippocratic" impressiveness = 50 + // If it hits the prob(reference_chance) chance, this is set to TRUE. Adds medical HUD when wielded, but has a 10% slower attack speed and is too bloody to make an oath with. + var/reference = FALSE + // Chance for above. + var/reference_chance = 1 + // Minimum time inbetween oaths. + COOLDOWN_DECLARE(oath_cd) + +/obj/item/statuebust/hippocratic/evil + reference_chance = 100 + +/obj/item/statuebust/hippocratic/Initialize(mapload) + . = ..() + if(prob(reference_chance)) + name = "Solemn Vow" + desc = "Art lovers will cherish the bust of Hippocrates, commemorating a time when medics still thought doing no harm was a good idea." + attack_speed = CLICK_CD_SLOW + reference = TRUE + +/obj/item/statuebust/hippocratic/examine(mob/user) + . = ..() + if(reference) + . += span_notice("You could activate the bust in-hand to swear or forswear a Hippocratic Oath... but it seems like somebody decided it was more of a Hippocratic Suggestion. This thing is caked with bits of blood and gore.") + return + . += span_notice("You can activate the bust in-hand to swear or forswear a Hippocratic Oath! This has no effects except pacifism or bragging rights. Does not remove other sources of pacifism. Do not eat.") + +/obj/item/statuebust/hippocratic/equipped(mob/living/carbon/human/user, slot) + ..() + if(!(slot & ITEM_SLOT_HANDS)) + return + var/datum/atom_hud/our_hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] + our_hud.show_to(user) + ADD_TRAIT(user, TRAIT_MEDICAL_HUD, type) + +/obj/item/statuebust/hippocratic/dropped(mob/living/carbon/human/user) + ..() + if(HAS_TRAIT_NOT_FROM(user, TRAIT_MEDICAL_HUD, type)) + return + var/datum/atom_hud/our_hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] + our_hud.hide_from(user) + REMOVE_TRAIT(user, TRAIT_MEDICAL_HUD, type) + +/obj/item/statuebust/hippocratic/attack_self(mob/user) + if(!iscarbon(user)) + to_chat(user, span_warning("You remember how the Hippocratic Oath specifies 'my fellow human beings' and realize that it's completely meaningless to you.")) + return + + if(reference) + to_chat(user, span_warning("As you prepare yourself to swear the Oath, you realize that doing so on a blood-caked bust is probably not a good idea.")) + return + + if(!COOLDOWN_FINISHED(src, oath_cd)) + to_chat(user, span_warning("You've sworn or forsworn an oath too recently to undo your decisions. The bust looks at you with disgust.")) + return + + COOLDOWN_START(src, oath_cd, 5 MINUTES) + + if(HAS_TRAIT_FROM(user, TRAIT_PACIFISM, type)) + to_chat(user, span_warning("You've already sworn a vow. You start preparing to rescind it...")) + if(do_after(user, 5 SECONDS, target = user)) + user.say("Yeah this Hippopotamus thing isn't working out. I quit!", forced = "hippocratic hippocrisy") + REMOVE_TRAIT(user, TRAIT_PACIFISM, type) + + // they can still do it for rp purposes + if(HAS_TRAIT_NOT_FROM(user, TRAIT_PACIFISM, type)) + to_chat(user, span_warning("You already don't want to harm people, this isn't going to do anything!")) + + + to_chat(user, span_notice("You remind yourself of the Hippocratic Oath's contents and prepare to swear yourself to it...")) + if(do_after(user, 4 SECONDS, target = user)) + user.say("I swear to fulfill, to the best of my ability and judgment, this covenant:", forced = "hippocratic oath") + else + return fuck_it_up(user) + if(do_after(user, 2 SECONDS, target = user)) + user.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 + return fuck_it_up(user) + if(do_after(user, 3 SECONDS, target = user)) + user.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 + + return fuck_it_up(user) + if(do_after(user, 3 SECONDS, target = user)) + user.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 + return fuck_it_up(user) + + to_chat(user, span_notice("Contentment, understanding, and purpose washes over you as you finish the oath. You consider for a second the concept of harm and shudder.")) + ADD_TRAIT(user, TRAIT_PACIFISM, type) + +// Bully the guy for fucking up. +/obj/item/statuebust/hippocratic/proc/fuck_it_up(mob/living/carbon/user) + to_chat(user, span_warning("You forget what comes next like a dumbass. The Hippocrates bust looks down on you, disappointed.")) + user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2) + COOLDOWN_RESET(src, oath_cd) /obj/item/tailclub name = "tail club" @@ -775,7 +820,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 angle = 270 if(target.dir & turn(target_to_user, 270)) angle = 90 - if(target.dir & turn(target_to_user, 180)) + if(target.dir & REVERSE_DIR(target_to_user)) angle = 180 if(target.dir & target_to_user) angle = 360 @@ -821,8 +866,8 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 inhand_icon_state = "baseball_bat_metal" custom_materials = list(/datum/material/titanium = SHEET_MATERIAL_AMOUNT * 3.5) resistance_flags = NONE - force = 12 - throwforce = 15 + force = 20 + throwforce = 20 mob_thrower = TRUE block_sound = 'sound/weapons/effects/batreflect.ogg' @@ -832,7 +877,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/melee/flyswatter name = "flyswatter" desc = "Useful for killing pests of all sizes." - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "flyswatter" inhand_icon_state = "flyswatter" lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' @@ -856,13 +901,13 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /mob/living/basic/ant, /mob/living/basic/butterfly, /mob/living/basic/cockroach, - /mob/living/basic/spiderling, - /mob/living/simple_animal/hostile/bee, + /mob/living/basic/spider/growing/spiderling, + /mob/living/basic/bee, /obj/effect/decal/cleanable/ants, /obj/item/queen_bee, )) strong_against = typecacheof(list( - /mob/living/basic/giant_spider, + /mob/living/basic/spider/giant, )) @@ -877,7 +922,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 if(isliving(target)) var/mob/living/bug = target bug.investigate_log("has been splatted by a flyswatter.", INVESTIGATE_DEATHS) - bug.gib() + bug.gib(DROP_ALL_REMAINS) else qdel(target) return @@ -1054,7 +1099,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 if(living_target.stat == DEAD && prob(force*damage_mod*0.5)) living_target.visible_message(span_danger("[living_target] explodes in a shower of gore!"), blind_message = span_hear("You hear organic matter ripping and tearing!")) living_target.investigate_log("has been gibbed by [src].", INVESTIGATE_DEATHS) - living_target.gib() + living_target.gib(DROP_ALL_REMAINS) log_combat(user, living_target, "gibbed", src) else if(target.uses_integrity) target.take_damage(force*damage_mod*3, BRUTE, MELEE, FALSE, null, 50) @@ -1097,7 +1142,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 bare_wound_bonus = 25 /obj/item/highfrequencyblade/wizard/attack_self(mob/user, modifiers) - if(!IS_WIZARD(user)) + if(!HAS_MIND_TRAIT(user, TRAIT_MAGICALLY_GIFTED)) balloon_alert(user, "you're too weak!") return return ..() diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index e7ab18cc44b97..ff9f99f121e81 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -28,7 +28,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.demolition_mod, P.damage_type, P.armor_flag, 0, REVERSE_DIR(P.dir), P.armour_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) @@ -144,7 +144,7 @@ if(has_buckled_mobs()) for(var/m in buckled_mobs) var/mob/living/buckled_mob = m - buckled_mob.electrocute_act((clamp(round(strength/400), 10, 90) + rand(-5, 5)), src, flags = SHOCK_TESLA) + buckled_mob.electrocute_act((clamp(round(strength * 3.125e-6), 10, 90) + rand(-5, 5)), src, flags = SHOCK_TESLA) ///the obj is deconstructed into pieces, whether through careful disassembly or when destroyed. /obj/proc/deconstruct(disassembled = TRUE) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 925387aaa9171..1c34e75c3d1fd 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -343,7 +343,7 @@ GLOBAL_LIST_EMPTY(objects_by_id_tag) /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, REVERSE_DIR(P.dir), P.armour_penetration) // pass along receive_ricochet_damage_coeff damage to the structure for the ricochet /// Handles exposing an object to reagents. /obj/expose_reagents(list/reagents, datum/reagents/source, methods=TOUCH, volume_modifier=1, show_message=TRUE) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 71d15fb3f5823..ba8623ec4aa3a 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -63,6 +63,6 @@ /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 + take_damage(power * 1.5625e-7, BURN, "energy") + power -= power * 5e-4 //walls take a lot out of ya . = ..() diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index d0d1e5dc9dbbe..b2a7d912cb2b3 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -46,16 +46,16 @@ if(AI_READY_CORE) . += span_notice("The monitor's connection can be cut[core_mmi?.brainmob?.mind && !suicide_check() ? " the neural interface can be screwed in." : "."]") -/obj/structure/ai_core/handle_atom_del(atom/A) - if(A == circuit) +/obj/structure/ai_core/Exited(atom/movable/gone, direction) + . = ..() + if(gone == circuit) circuit = null if((state != GLASS_CORE) && (state != AI_READY_CORE)) state = EMPTY_CORE update_appearance() - if(A == core_mmi) + if(gone == core_mmi) core_mmi = null - return ..() - + update_appearance() /obj/structure/ai_core/Destroy() QDEL_NULL(circuit) @@ -163,7 +163,7 @@ balloon_alert(user, "core must be empty to deconstruct it!") return - if(!P.tool_start_check(user, amount=0)) + if(!P.tool_start_check(user, amount=1)) return balloon_alert(user, "deconstructing frame...") @@ -200,9 +200,7 @@ P.play_tool_sound(src) balloon_alert(user, "circuit board removed") state = EMPTY_CORE - update_appearance() circuit.forceMove(loc) - circuit = null return if(SCREWED_CORE) if(P.tool_behaviour == TOOL_SCREWDRIVER && circuit) @@ -298,8 +296,6 @@ P.play_tool_sound(src) balloon_alert(user, "removed [AI_CORE_BRAIN(core_mmi)]") core_mmi.forceMove(loc) - core_mmi = null - update_appearance() return if(GLASS_CORE) @@ -409,6 +405,7 @@ That prevents a few funky behaviors. /atom/proc/transfer_ai(interaction, mob/user, mob/living/silicon/ai/AI, obj/item/aicard/card) + SHOULD_CALL_PARENT(TRUE) if(istype(card)) if(card.flush) to_chat(user, span_alert("ERROR: AI flush is in progress, cannot execute transfer protocol.")) diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index 1ef893ebf277f..e1138d4696ff0 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -38,7 +38,7 @@ /obj/structure/alien/gelpod name = "gelatinous mound" desc = "A mound of jelly-like substance encasing something inside." - icon = 'icons/obj/fluff.dmi' + icon = 'icons/obj/fluff/general.dmi' icon_state = "gelmound" /obj/structure/alien/gelpod/deconstruct(disassembled = TRUE) @@ -339,6 +339,7 @@ var/status = GROWING //can be GROWING, GROWN or BURST; all mutually exclusive layer = MOB_LAYER plane = GAME_PLANE_FOV_HIDDEN + /// Ref to the hugger within. var/obj/item/clothing/mask/facehugger/child ///Proximity monitor associated with this atom, needed for proximity checks. var/datum/proximity_monitor/proximity_monitor @@ -433,6 +434,11 @@ child.Leap(M) break +/obj/structure/alien/egg/Exited(atom/movable/gone, direction) + . = ..() + if(gone == child) + child = null + /obj/structure/alien/egg/should_atmos_process(datum/gas_mixture/air, exposed_temperature) return exposed_temperature > 500 diff --git a/code/game/objects/structures/beds_chairs/alien_nest.dm b/code/game/objects/structures/beds_chairs/alien_nest.dm index 59346a79453c2..87d8ffb17101b 100644 --- a/code/game/objects/structures/beds_chairs/alien_nest.dm +++ b/code/game/objects/structures/beds_chairs/alien_nest.dm @@ -11,9 +11,8 @@ smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_ALIEN_NEST canSmoothWith = SMOOTH_GROUP_ALIEN_NEST - buildstacktype = null + build_stack_type = null flags_1 = NODECONSTRUCT_1 - bolts = FALSE var/static/mutable_appearance/nest_overlay = mutable_appearance('icons/mob/nonhuman-player/alien.dmi', "nestoverlay", LYING_MOB_LAYER) /obj/structure/bed/nest/user_unbuckle_mob(mob/living/buckled_mob, mob/living/user) diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index 2610498964e1c..edcec5add3ac3 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -1,81 +1,159 @@ /* Beds... get your mind out of the gutter, they're for sleeping! * Contains: * Beds + * Medical beds * Roller beds + * Pet beds */ -/* - * Beds - */ +/// Beds /obj/structure/bed name = "bed" desc = "This is used to lie in, sleep in or strap on." icon_state = "bed" - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/bed.dmi' anchored = TRUE can_buckle = TRUE buckle_lying = 90 resistance_flags = FLAMMABLE max_integrity = 100 integrity_failure = 0.35 - var/buildstacktype = /obj/item/stack/sheet/iron - var/buildstackamount = 2 - var/bolts = TRUE + /// What material this bed is made of + var/build_stack_type = /obj/item/stack/sheet/iron + /// How many mats to drop when deconstructed + var/build_stack_amount = 2 /obj/structure/bed/Initialize(mapload) . = ..() AddElement(/datum/element/soft_landing) + register_context() /obj/structure/bed/examine(mob/user) . = ..() - if(bolts) + if(!(flags_1 & NODECONSTRUCT_1)) . += span_notice("It's held together by a couple of bolts.") +/obj/structure/bed/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) + if(held_item) + if(held_item.tool_behaviour != TOOL_WRENCH || flags_1 & NODECONSTRUCT_1) + return + + context[SCREENTIP_CONTEXT_RMB] = "Dismantle" + return CONTEXTUAL_SCREENTIP_SET + + else if(has_buckled_mobs()) + context[SCREENTIP_CONTEXT_LMB] = "Unbuckle" + return CONTEXTUAL_SCREENTIP_SET + /obj/structure/bed/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) - if(buildstacktype) - new buildstacktype(loc,buildstackamount) + if(build_stack_type) + new build_stack_type(loc, build_stack_amount) ..() /obj/structure/bed/attack_paw(mob/user, list/modifiers) return attack_hand(user, modifiers) /obj/structure/bed/wrench_act_secondary(mob/living/user, obj/item/weapon) - if(flags_1&NODECONSTRUCT_1) + if(flags_1 & NODECONSTRUCT_1) return TRUE + ..() weapon.play_tool_sound(src) deconstruct(disassembled = TRUE) return TRUE -/* - * Roller beds - */ -/obj/structure/bed/roller - name = "roller bed" - icon = 'icons/obj/medical/rollerbed.dmi' - icon_state = "down" +/// Medical beds +/obj/structure/bed/medical + name = "medical bed" + icon = 'icons/obj/medical/medical_bed.dmi' + desc = "A medical bed with wheels for assisted patient movement or medbay racing tournaments." + icon_state = "med_down" + base_icon_state = "med" anchored = FALSE resistance_flags = NONE - ///The item it spawns when it's folded up. - var/foldabletype = /obj/item/roller + build_stack_type = /obj/item/stack/sheet/mineral/titanium + build_stack_amount = 1 + /// The item it spawns when it's folded up. + var/foldable_type + +/obj/structure/bed/medical/anchored + anchored = TRUE -/obj/structure/bed/roller/Initialize(mapload) +/obj/structure/bed/medical/emergency + name = "emergency medical bed" + desc = "A compact medical bed. This emergency version can be folded and carried for quick transport." + icon_state = "emerg_down" + base_icon_state = "emerg" + foldable_type = /obj/item/emergency_bed + +/obj/structure/bed/medical/Initialize(mapload) . = ..() - AddElement( \ - /datum/element/contextual_screentip_bare_hands, \ - rmb_text = "Fold up", \ - ) + AddElement(/datum/element/noisy_movement) -/obj/structure/bed/roller/examine(mob/user) +/obj/structure/bed/medical/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) . = ..() - . += span_notice("You can fold it up with a Right-click.") + context[SCREENTIP_CONTEXT_ALT_LMB] = "[anchored ? "Release brakes" : "Apply brakes"]" + if(!isnull(foldable_type) && !has_buckled_mobs()) + context[SCREENTIP_CONTEXT_RMB] = "Fold up" + + return CONTEXTUAL_SCREENTIP_SET -/obj/structure/bed/roller/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/roller/robo)) - var/obj/item/roller/robo/R = W - if(R.loaded) - to_chat(user, span_warning("You already have a roller bed docked!")) +/obj/structure/bed/medical/examine(mob/user) + . = ..() + if(anchored) + . += span_notice("The brakes are applied. They can be released with an Alt-click.") + else + . += span_notice("The brakes can be applied with an Alt-click.") + + if(!isnull(foldable_type)) + . += span_notice("You can fold it up with a Right-click.") + +/obj/structure/bed/medical/AltClick(mob/user) + . = ..() + anchored = !anchored + balloon_alert(user, "brakes [anchored ? "applied" : "released"]") + update_appearance() + +/obj/structure/bed/medical/post_buckle_mob(mob/living/patient) + set_density(TRUE) + update_appearance() + +/obj/structure/bed/medical/post_unbuckle_mob(mob/living/patient) + set_density(FALSE) + update_appearance() + +/obj/structure/bed/medical/update_icon_state() + . = ..() + if(has_buckled_mobs()) + icon_state = "[base_icon_state]_up" + // Push them up from the normal lying position + if(buckled_mobs.len > 1) + for(var/mob/living/patient as anything in buckled_mobs) + patient.pixel_y = patient.base_pixel_y + else + buckled_mobs[1].pixel_y = buckled_mobs[1].base_pixel_y + + else + icon_state = "[base_icon_state]_down" + +/obj/structure/bed/medical/update_overlays() + . = ..() + if(!anchored) + return + + if(has_buckled_mobs()) + . += mutable_appearance(icon, "brakes_up") + . += emissive_appearance(icon, "brakes_up", src, alpha = src.alpha) + else + . += mutable_appearance(icon, "brakes_down") + . += emissive_appearance(icon, "brakes_down", src, alpha = src.alpha) + +/obj/structure/bed/medical/emergency/attackby(obj/item/item, mob/user, params) + if(istype(item, /obj/item/emergency_bed/silicon)) + var/obj/item/emergency_bed/silicon/silicon_bed = item + if(silicon_bed.loaded) + to_chat(user, span_warning("You already have a medical bed docked!")) return if(has_buckled_mobs()) @@ -85,14 +163,14 @@ else user_unbuckle_mob(buckled_mobs[1],user) else - R.loaded = src - forceMove(R) + silicon_bed.loaded = src + forceMove(silicon_bed) user.visible_message(span_notice("[user] collects [src]."), span_notice("You collect [src].")) - return 1 + return TRUE else return ..() -/obj/structure/bed/roller/attack_hand_secondary(mob/user, list/modifiers) +/obj/structure/bed/medical/emergency/attack_hand_secondary(mob/user, list/modifiers) . = ..() if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN @@ -100,80 +178,68 @@ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN if(has_buckled_mobs()) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + user.visible_message(span_notice("[user] collapses [src]."), span_notice("You collapse [src].")) - var/obj/structure/bed/roller/folding_bed = new foldabletype(get_turf(src)) + var/obj/structure/bed/medical/emergency/folding_bed = new foldable_type(get_turf(src)) user.put_in_hands(folding_bed) qdel(src) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/structure/bed/roller/post_buckle_mob(mob/living/M) - set_density(TRUE) - icon_state = "up" - //Push them up from the normal lying position - M.pixel_y = M.base_pixel_y - -/obj/structure/bed/roller/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - . = ..() - if(has_gravity()) - playsound(src, 'sound/effects/roll.ogg', 100, TRUE) - - -/obj/structure/bed/roller/post_unbuckle_mob(mob/living/M) - set_density(FALSE) - icon_state = "down" - //Set them back down to the normal lying position - M.pixel_y = M.base_pixel_y + M.body_position_pixel_y_offset - - -/obj/item/roller +/obj/item/emergency_bed name = "roller bed" - desc = "A collapsed roller bed that can be carried around." - icon = 'icons/obj/medical/rollerbed.dmi' - icon_state = "folded" + desc = "A collapsed medical bed that can be carried around." + icon = 'icons/obj/medical/medical_bed.dmi' + icon_state = "emerg_folded" + inhand_icon_state = "emergencybed" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' w_class = WEIGHT_CLASS_NORMAL // No more excuses, stop getting blood everywhere -/obj/item/roller/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/roller/robo)) - var/obj/item/roller/robo/R = I - if(R.loaded) - to_chat(user, span_warning("[R] already has a roller bed loaded!")) +/obj/item/emergency_bed/attackby(obj/item/item, mob/living/user, params) + if(istype(item, /obj/item/emergency_bed/silicon)) + var/obj/item/emergency_bed/silicon/silicon_bed = item + if(silicon_bed.loaded) + to_chat(user, span_warning("[silicon_bed] already has a roller bed loaded!")) return - user.visible_message(span_notice("[user] loads [src]."), span_notice("You load [src] into [R].")) - R.loaded = new/obj/structure/bed/roller(R) + + user.visible_message(span_notice("[user] loads [src]."), span_notice("You load [src] into [silicon_bed].")) + silicon_bed.loaded = new/obj/structure/bed/medical/emergency(silicon_bed) qdel(src) //"Load" return + else return ..() -/obj/item/roller/attack_self(mob/user) - deploy_roller(user, user.loc) +/obj/item/emergency_bed/attack_self(mob/user) + deploy_bed(user, user.loc) -/obj/item/roller/afterattack(obj/target, mob/user , proximity) +/obj/item/emergency_bed/afterattack(obj/target, mob/user, proximity) . = ..() if(!proximity) return + if(isopenturf(target)) - deploy_roller(user, target) + deploy_bed(user, target) -/obj/item/roller/proc/deploy_roller(mob/user, atom/location) - var/obj/structure/bed/roller/R = new /obj/structure/bed/roller(location) - R.add_fingerprint(user) +/obj/item/emergency_bed/proc/deploy_bed(mob/user, atom/location) + var/obj/structure/bed/medical/emergency/deployed = new /obj/structure/bed/medical/emergency(location) + deployed.add_fingerprint(user) qdel(src) -/obj/item/roller/robo //ROLLER ROBO DA! - name = "roller bed dock" - desc = "A collapsed roller bed that can be ejected for emergency use. Must be collected or replaced after use." - var/obj/structure/bed/roller/loaded = null +/obj/item/emergency_bed/silicon // ROLLER ROBO DA! + name = "emergency bed dock" + desc = "A collapsed medical bed that can be ejected for emergency use. Must be collected or replaced after use." + var/obj/structure/bed/medical/emergency/loaded = null -/obj/item/roller/robo/Initialize(mapload) +/obj/item/emergency_bed/silicon/Initialize(mapload) . = ..() loaded = new(src) -/obj/item/roller/robo/examine(mob/user) +/obj/item/emergency_bed/silicon/examine(mob/user) . = ..() . += "The dock is [loaded ? "loaded" : "empty"]." -/obj/item/roller/robo/deploy_roller(mob/user, atom/location) +/obj/item/emergency_bed/silicon/deploy_bed(mob/user, atom/location) if(loaded) loaded.forceMove(location) user.visible_message(span_notice("[user] deploys [loaded]."), span_notice("You deploy [loaded].")) @@ -181,15 +247,14 @@ else to_chat(user, span_warning("The dock is empty!")) -//Dog bed - +/// Dog bed /obj/structure/bed/dogbed name = "dog bed" icon_state = "dogbed" desc = "A comfy-looking dog bed. You can even strap your pet in, in case the gravity turns off." anchored = FALSE - buildstacktype = /obj/item/stack/sheet/mineral/wood - buildstackamount = 10 + build_stack_type = /obj/item/stack/sheet/mineral/wood + build_stack_amount = 10 var/owned = FALSE /obj/structure/bed/dogbed/ian @@ -222,17 +287,18 @@ anchored = TRUE ///Used to set the owner of a dogbed, returns FALSE if called on an owned bed or an invalid one, TRUE if the possesion succeeds -/obj/structure/bed/dogbed/proc/update_owner(mob/living/M) +/obj/structure/bed/dogbed/proc/update_owner(mob/living/furball) if(owned || type != /obj/structure/bed/dogbed) //Only marked beds work, this is hacky but I'm a hacky man return FALSE //Failed + owned = TRUE - name = "[M]'s bed" - desc = "[M]'s bed! Looks comfy." - return TRUE //Let any callers know that this bed is ours now + name = "[furball]'s bed" + desc = "[furball]'s bed! Looks comfy." + return TRUE // Let any callers know that this bed is ours now -/obj/structure/bed/dogbed/buckle_mob(mob/living/M, force, check_loc) +/obj/structure/bed/dogbed/buckle_mob(mob/living/furball, force, check_loc) . = ..() - update_owner(M) + update_owner(furball) /obj/structure/bed/maint name = "dirty mattress" @@ -243,18 +309,18 @@ . = ..() 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 +// 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" desc = "A luxurious double bed, for those too important for small dreams." icon_state = "bed_double" - buildstackamount = 4 + build_stack_amount = 4 max_buckled_mobs = 2 - ///The mob who buckled to this bed second, to avoid other mobs getting pixel-shifted before he unbuckles. + /// The mob who buckled to this bed second, to avoid other mobs getting pixel-shifted before he unbuckles. var/mob/living/goldilocks /obj/structure/bed/double/post_buckle_mob(mob/living/target) - if(buckled_mobs.len > 1 && !goldilocks) //Push the second buckled mob a bit higher from the normal lying position + if(buckled_mobs.len > 1 && !goldilocks) // Push the second buckled mob a bit higher from the normal lying position target.pixel_y = target.base_pixel_y + 6 goldilocks = target diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 48502264c4979..32daa4e7a4999 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -244,11 +244,9 @@ item_chair = null icon_state = "officechair_dark" - -/obj/structure/chair/office/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) +/obj/structure/chair/office/Initialize(mapload) . = ..() - if(!forced && CHECK_MOVE_LOOP_FLAGS(src, MOVEMENT_LOOP_OUTSIDE_CONTROL) && has_gravity()) - playsound(src, 'sound/effects/roll.ogg', 100, TRUE) + AddElement(/datum/element/noisy_movement) /obj/structure/chair/office/electrify_self(obj/item/assembly/shock_kit/input_shock_kit, mob/user, list/overlays_from_child_procs) if(!overlays_from_child_procs) @@ -327,6 +325,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) hitsound = 'sound/items/trayhit1.ogg' hit_reaction_chance = 50 custom_materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT) + item_flags = SKIP_FANTASY_ON_SPAWN var/break_chance = 5 //Likely hood of smashing the chair. var/obj/structure/chair/origin_type = /obj/structure/chair @@ -459,6 +458,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) item_chair = null var/turns = 0 +/obj/structure/chair/bronze/Initialize(mapload) + . = ..() + AddElement(/datum/element/noisy_movement, 'sound/machines/clockcult/integration_cog_install.ogg', 50) + /obj/structure/chair/bronze/Destroy() STOP_PROCESSING(SSfastprocess, src) . = ..() @@ -470,11 +473,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) if(turns >= 8) STOP_PROCESSING(SSfastprocess, src) -/obj/structure/chair/bronze/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - . = ..() - if(has_gravity()) - playsound(src, 'sound/machines/clockcult/integration_cog_install.ogg', 50, TRUE) - /obj/structure/chair/bronze/AltClick(mob/user) turns = 0 if(!user.can_perform_action(src, NEED_DEXTERITY)) diff --git a/code/game/objects/structures/beds_chairs/pew.dm b/code/game/objects/structures/beds_chairs/pew.dm index 535aadb698e2a..21bf0fbf09c0e 100644 --- a/code/game/objects/structures/beds_chairs/pew.dm +++ b/code/game/objects/structures/beds_chairs/pew.dm @@ -1,7 +1,7 @@ /obj/structure/chair/pew name = "wooden pew" desc = "Kneel here and pray." - icon = 'icons/obj/sofa.dmi' + icon = 'icons/obj/chairs_wide.dmi' icon_state = "pewmiddle" resistance_flags = FLAMMABLE max_integrity = 70 @@ -38,7 +38,7 @@ /obj/structure/chair/pew/left/proc/GetLeftPewArmrest() - return mutable_appearance('icons/obj/sofa.dmi', "pewend_left_armrest") + return mutable_appearance('icons/obj/chairs_wide.dmi', "pewend_left_armrest") /obj/structure/chair/pew/left/Destroy() QDEL_NULL(leftpewarmrest) @@ -80,7 +80,7 @@ update_rightpewarmrest() /obj/structure/chair/pew/right/proc/GetRightPewArmrest() - return mutable_appearance('icons/obj/sofa.dmi', "pewend_right_armrest") + return mutable_appearance('icons/obj/chairs_wide.dmi', "pewend_right_armrest") /obj/structure/chair/pew/right/Destroy() QDEL_NULL(rightpewarmrest) diff --git a/code/game/objects/structures/beds_chairs/sofa.dm b/code/game/objects/structures/beds_chairs/sofa.dm index e773cbc04b4ad..076f95f4dc939 100644 --- a/code/game/objects/structures/beds_chairs/sofa.dm +++ b/code/game/objects/structures/beds_chairs/sofa.dm @@ -16,7 +16,7 @@ path/corner/color_name {\ /obj/structure/chair/sofa name = "old ratty sofa" icon_state = "error" - icon = 'icons/obj/sofa.dmi' + icon = 'icons/obj/chairs_wide.dmi' buildstackamount = 1 item_chair = null var/mutable_appearance/armrest diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index c8beb2f04696f..54ac69f914420 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -140,7 +140,7 @@ LINEN BINS // double check the canUseTopic args to make sure it's correct if(!istype(user) || !user.can_perform_action(src, NEED_DEXTERITY)) return - dir = turn(dir, 180) + dir = REVERSE_DIR(dir) /obj/item/bedsheet/blue icon_state = "sheetblue" diff --git a/code/game/objects/structures/billboard.dm b/code/game/objects/structures/billboard.dm index 2f580a67e0893..c6786dd84e4a1 100644 --- a/code/game/objects/structures/billboard.dm +++ b/code/game/objects/structures/billboard.dm @@ -1,7 +1,7 @@ /obj/structure/billboard name = "blank billboard" desc = "A blank billboard, with space for all kinds of advertising." - icon = 'icons/obj/billboard.dmi' + icon = 'icons/obj/fluff/billboard.dmi' icon_state = "billboard_blank" plane = ABOVE_GAME_PLANE max_integrity = 1000 diff --git a/code/game/objects/structures/bonfire.dm b/code/game/objects/structures/bonfire.dm index 7643af2215cec..7f39aeb0a794e 100644 --- a/code/game/objects/structures/bonfire.dm +++ b/code/game/objects/structures/bonfire.dm @@ -10,7 +10,7 @@ /obj/structure/bonfire name = "bonfire" desc = "For grilling, broiling, charring, smoking, heating, roasting, toasting, simmering, searing, melting, and occasionally burning things." - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "bonfire" light_color = LIGHT_COLOR_FIRE density = FALSE @@ -50,7 +50,7 @@ can_buckle = TRUE buckle_requires_restraints = TRUE to_chat(user, span_notice("You add a rod to \the [src].")) - var/mutable_appearance/rod_underlay = mutable_appearance('icons/obj/hydroponics/equipment.dmi', "bonfire_rod") + var/mutable_appearance/rod_underlay = mutable_appearance('icons/obj/service/hydroponics/equipment.dmi', "bonfire_rod") rod_underlay.pixel_y = 16 underlays += rod_underlay if("Grill") diff --git a/code/game/objects/structures/broken_flooring.dm b/code/game/objects/structures/broken_flooring.dm index ea52be6d7fd50..c81ca778424fe 100644 --- a/code/game/objects/structures/broken_flooring.dm +++ b/code/game/objects/structures/broken_flooring.dm @@ -1,7 +1,7 @@ /obj/structure/broken_flooring name = "broken tiling" desc = "A segment of broken flooring." - icon = 'icons/obj/brokentiling.dmi' + icon = 'icons/obj/fluff/brokentiling.dmi' icon_state = "corner" anchored = TRUE density = FALSE diff --git a/code/game/objects/structures/cannons/cannonballs.dm b/code/game/objects/structures/cannons/cannonballs.dm index 9e2b38a3420aa..718fd2b1ebb63 100644 --- a/code/game/objects/structures/cannons/cannonballs.dm +++ b/code/game/objects/structures/cannons/cannonballs.dm @@ -22,6 +22,9 @@ /obj/item/stack/cannonball/fourteen amount = 14 +/obj/item/stack/cannonball/four + amount = 4 + /obj/item/stack/cannonball/shellball name = "explosive shellballs" singular_name = "explosive shellball" diff --git a/code/game/objects/structures/chess.dm b/code/game/objects/structures/chess.dm index b75a9ca6c8836..04410e2998094 100644 --- a/code/game/objects/structures/chess.dm +++ b/code/game/objects/structures/chess.dm @@ -1,7 +1,7 @@ /obj/structure/chess anchored = FALSE density = FALSE - icon = 'icons/obj/chess.dmi' + icon = 'icons/obj/toys/chess.dmi' icon_state = "white_pawn" name = "\improper Probably a White Pawn" desc = "This is weird. Please inform administration on how you managed to get the parent chess piece. Thanks!" diff --git a/code/game/objects/structures/construction_console/construction_console_aux.dm b/code/game/objects/structures/construction_console/construction_console_aux.dm index 552d7735d432c..0b03a79ce5243 100644 --- a/code/game/objects/structures/construction_console/construction_console_aux.dm +++ b/code/game/objects/structures/construction_console/construction_console_aux.dm @@ -23,7 +23,7 @@ /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) + for(var/obj/machinery/computer/auxiliary_base/potential_aux_console as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/computer/auxiliary_base)) if(istype(get_area(potential_aux_console), allowed_area)) aux_controller = potential_aux_console break diff --git a/code/game/objects/structures/containers.dm b/code/game/objects/structures/containers.dm index e5cc217cc685b..bf56f7850f82d 100644 --- a/code/game/objects/structures/containers.dm +++ b/code/game/objects/structures/containers.dm @@ -1,7 +1,7 @@ /obj/structure/shipping_container name = "shipping container" desc = "A standard-measure shipping container for bulk transport of goods. This one is blank, offering no clue as to its contents." - icon = 'icons/obj/containers.dmi' + icon = 'icons/obj/fluff/containers.dmi' icon_state = "container_blank" max_integrity = 1000 bound_width = 96 @@ -53,6 +53,7 @@ name = "\improper Nanotrasen shipping container" desc = "A standard-measure shipping container for bulk transport of goods. This one prominently features Nanotrasen's logo, and so presumably could be carrying anything." icon_state = "nanotrasen" + /obj/structure/shipping_container/nthi name = "\improper Nanotrasen Heavy Industries shipping container" desc = "A standard-measure shipping container for bulk transport of goods. This one is from NTHI: Nanotrasen's mining and refining subdivision." diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 18487ee149259..db1122465f3c7 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -1,5 +1,9 @@ #define LOCKER_FULL -1 +///A comprehensive list of all closets (NOT CRATES) in the game world +GLOBAL_LIST_EMPTY(roundstart_station_closets) + + /obj/structure/closet name = "closet" desc = "It's a basic storage unit." @@ -15,6 +19,7 @@ contents_pressure_protection = 0 /// How insulated the thing is, for the purposes of calculating body temperature. Must be between 0 and 1! contents_thermal_insulation = 0 + pass_flags_self = PASSSTRUCTURE | LETPASSCLICKS /// The overlay for the closet's door var/obj/effect/overlay/closet_door/door_obj @@ -71,7 +76,7 @@ var/contents_initialized = FALSE /// is this closet locked by an exclusive id, i.e. your own personal locker var/datum/weakref/id_card = null - /// should we prevent furthur access change + /// should we prevent further access change var/access_locked = FALSE /// is the card reader installed in this machine var/card_reader_installed = FALSE @@ -119,6 +124,9 @@ if(access_choices) access_choices = card_reader_choices + if(is_station_level(z) && mapload) + add_to_roundstart_list() + // if closed, any item at the crate's loc is put in the contents if (mapload && !opened) . = INITIALIZE_HINT_LATELOAD @@ -154,6 +162,7 @@ /obj/structure/closet/Destroy() id_card = null QDEL_NULL(door_obj) + GLOB.roundstart_station_closets -= src return ..() /obj/structure/closet/update_appearance(updates=ALL) @@ -290,7 +299,7 @@ else . += span_notice("Its airlock electronics are [EXAMINE_HINT("screwed")] in place.") if(!card_reader_installed && length(access_choices)) - . += span_notice("You can install a card reader for furthur access control.") + . += span_notice("You can install a card reader for further access control.") else if(card_reader_installed) . += span_notice("The card reader could be [EXAMINE_HINT("pried")] out.") . += span_notice("Swipe your PDA with an ID card/Just ID to change access levels.") @@ -637,7 +646,7 @@ return TRUE -/// returns TRUE if attackBy call shouldn't be continued (because tool weaponas used/closet weaponas of weaponrong type), FALSE if otherweaponise +/// returns TRUE if attackBy call shouldn't be continued (because tool was used/closet was of wrong type), FALSE if otherwise /obj/structure/closet/proc/tool_interact(obj/item/weapon, mob/living/user) . = TRUE var/obj/item/card/id/id = null @@ -734,11 +743,11 @@ id_card = null switch(choice) - if("Personal") //only the player weaponho sweaponiped their id has access. + if("Personal") //only the player who swiped their id has access. id_card = WEAKREF(id) name = "[id.registered_name] locker" desc = "now owned by [id.registered_name]. [initial(desc)]" - if("Departmental") //anyone weaponho has the same access permissions as this id has access + if("Departmental") //anyone who has the same access permissions as this id has access name = "[id.assignment] closet" desc = "Its a [id.assignment] closet. [initial(desc)]" set_access(id.GetAccess()) @@ -787,7 +796,7 @@ else if(opened) if(istype(weapon, cutting_tool)) if(weapon.tool_behaviour == TOOL_WELDER) - if(!weapon.tool_start_check(user, amount=0)) + if(!weapon.tool_start_check(user, amount=1)) return to_chat(user, span_notice("You begin cutting \the [src] apart...")) @@ -799,18 +808,18 @@ span_hear("You hear weaponelding.")) deconstruct(TRUE) return - else // for example cardboard box is cut weaponith weaponirecutters + else // for example cardboard box is cut with wirecutters user.visible_message(span_notice("[user] cut apart \the [src]."), \ span_notice("You cut \the [src] apart weaponith \the [weapon].")) deconstruct(TRUE) return if (user.combat_mode) return - if(user.transferItemToLoc(weapon, drop_location())) // so weapone put in unlit weaponelder too + if(user.transferItemToLoc(weapon, drop_location())) // so we put in unlit welder too return else if(weapon.tool_behaviour == TOOL_WELDER && can_weld_shut) - if(!weapon.tool_start_check(user, amount=0)) + if(!weapon.tool_start_check(user, amount=1)) return if(weapon.use_tool(src, user, 40, volume=50)) @@ -1052,16 +1061,16 @@ ) update_appearance() -/obj/structure/closet/emag_act(mob/user) +/obj/structure/closet/emag_act(mob/user, obj/item/card/emag/emag_card) if(secure && !broken) - if(user) - user.visible_message(span_warning("Sparks fly from [src]!"), - span_warning("You scramble [src]'s lock, breaking it open!"), - span_hear("You hear a faint electrical spark.")) + visible_message(span_warning("Sparks fly from [src]!"), blind_message = span_hear("You hear a faint electrical spark.")) + balloon_alert(user, "lock broken open") playsound(src, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) broken = TRUE locked = FALSE update_appearance() + return TRUE + return FALSE /obj/structure/closet/get_remote_view_fullscreens(mob/user) if(user.stat == DEAD || !(user.sight & (SEEOBJS|SEEMOBS))) @@ -1132,7 +1141,7 @@ return COMSIG_CARBON_SHOVE_HANDLED /// Signal proc for [COMSIG_ATOM_MAGICALLY_UNLOCKED]. Unlock and open up when we get knock casted. -/obj/structure/closet/proc/on_magic_unlock(datum/source, datum/action/cooldown/spell/aoe/knock/spell, mob/living/caster) +/obj/structure/closet/proc/on_magic_unlock(datum/source, datum/action/cooldown/spell/aoe/knock/spell, atom/caster) SIGNAL_HANDLER locked = FALSE @@ -1141,4 +1150,8 @@ /obj/structure/closet/preopen opened = TRUE +///Adds the closet to a global list. Placed in its own proc so that crates may be excluded. +/obj/structure/closet/proc/add_to_roundstart_list() + GLOB.roundstart_station_closets += src + #undef LOCKER_FULL diff --git a/code/game/objects/structures/crates_lockers/closets/bodybag.dm b/code/game/objects/structures/crates_lockers/closets/bodybag.dm index 50cd91fc56bfa..ffd4434825ce6 100644 --- a/code/game/objects/structures/crates_lockers/closets/bodybag.dm +++ b/code/game/objects/structures/crates_lockers/closets/bodybag.dm @@ -1,7 +1,7 @@ /obj/structure/closet/body_bag name = "body bag" desc = "A plastic bag designed for the storage and transportation of cadavers." - icon = 'icons/obj/bodybag.dmi' + icon = 'icons/obj/medical/bodybag.dmi' icon_state = "bodybag" density = FALSE mob_storage_capacity = 2 @@ -18,6 +18,7 @@ has_closed_overlay = FALSE can_install_electronics = FALSE paint_jobs = null + can_weld_shut = FALSE var/foldedbag_path = /obj/item/bodybag var/obj/item/bodybag/foldedbag_instance = null @@ -121,7 +122,7 @@ /obj/structure/closet/body_bag/bluespace name = "bluespace body bag" desc = "A bluespace body bag designed for the storage and transportation of cadavers." - icon = 'icons/obj/bodybag.dmi' + icon = 'icons/obj/medical/bodybag.dmi' icon_state = "bluebodybag" foldedbag_path = /obj/item/bodybag/bluespace mob_storage_capacity = 15 @@ -160,7 +161,7 @@ to_chat(content, span_userdanger("You're suddenly forced into a tiny, compressed space!")) if(iscarbon(content)) var/mob/living/carbon/mob = content - if (mob.dna.get_mutation(/datum/mutation/human/dwarfism)) + if (mob.dna?.get_mutation(/datum/mutation/human/dwarfism)) max_weight_of_contents = max(WEIGHT_CLASS_NORMAL, max_weight_of_contents) continue if(!isitem(content)) @@ -178,7 +179,7 @@ /obj/structure/closet/body_bag/environmental name = "environmental protection bag" desc = "An insulated, reinforced bag designed to protect against exoplanetary storms and other environmental factors." - icon = 'icons/obj/bodybag.dmi' + icon = 'icons/obj/medical/bodybag.dmi' icon_state = "envirobag" mob_storage_capacity = 1 contents_pressure_protection = 0.8 @@ -229,7 +230,7 @@ /obj/structure/closet/body_bag/environmental/nanotrasen name = "elite environmental protection bag" desc = "A heavily reinforced and insulated bag, capable of fully isolating its contents from external factors." - icon = 'icons/obj/bodybag.dmi' + icon = 'icons/obj/medical/bodybag.dmi' icon_state = "ntenvirobag" contents_pressure_protection = 1 contents_thermal_insulation = 1 @@ -241,7 +242,7 @@ /obj/structure/closet/body_bag/environmental/prisoner name = "prisoner transport bag" desc = "Intended for transport of prisoners through hazardous environments, this environmental protection bag comes with straps to keep an occupant secure." - icon = 'icons/obj/bodybag.dmi' + icon = 'icons/obj/medical/bodybag.dmi' icon_state = "prisonerenvirobag" foldedbag_path = /obj/item/bodybag/environmental/prisoner breakout_time = 4 MINUTES // because it's probably about as hard to get out of this as it is to get out of a straightjacket. @@ -345,7 +346,7 @@ /obj/structure/closet/body_bag/environmental/prisoner/syndicate name = "syndicate prisoner transport bag" desc = "An alteration of Nanotrasen's environmental protection bag which has been used in several high-profile kidnappings. Designed to keep a victim unconscious, alive, and secured during transport." - icon = 'icons/obj/bodybag.dmi' + icon = 'icons/obj/medical/bodybag.dmi' icon_state = "syndieenvirobag" contents_pressure_protection = 1 contents_thermal_insulation = 1 diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm index e2b16478bb093..063200b486b0b 100644 --- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm +++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm @@ -57,7 +57,7 @@ return TRUE // Cache the list before we open the box. alerted = viewers(7, src) - // There are no mobs to alert? clear the list & prevent furthur action after opening the box + // There are no mobs to alert? clear the list & prevent further action after opening the box if(!(locate(/mob/living) in alerted)) alerted = null @@ -81,18 +81,20 @@ /// Does the MGS ! animation /atom/proc/do_alert_animation() - var/image/alert_image = image('icons/obj/storage/closet.dmi', src, "cardboard_special", layer+1) - SET_PLANE_EXPLICIT(alert_image, ABOVE_LIGHTING_PLANE, src) - flick_overlay_view(alert_image, 0.8 SECONDS) - alert_image.alpha = 0 - animate(alert_image, pixel_z = 32, alpha = 255, time = 0.5 SECONDS, easing = ELASTIC_EASING) + var/mutable_appearance/alert = mutable_appearance('icons/obj/storage/closet.dmi', "cardboard_special") + SET_PLANE_EXPLICIT(alert, ABOVE_LIGHTING_PLANE, src) + var/atom/movable/flick_visual/exclamation = flick_overlay_view(alert, 1 SECONDS) + exclamation.alpha = 0 + exclamation.pixel_x = -pixel_x + animate(exclamation, pixel_z = 32, alpha = 255, time = 0.5 SECONDS, easing = ELASTIC_EASING) // We use this list to update plane values on parent z change, which is why we need the timer too // I'm sorry :( - LAZYADD(update_on_z, alert_image) - addtimer(CALLBACK(src, PROC_REF(forget_alert_image), alert_image), 0.8 SECONDS) + LAZYADD(update_on_z, exclamation) + // Intentionally less time then the flick so we don't get weird shit + addtimer(CALLBACK(src, PROC_REF(forget_alert), exclamation), 0.8 SECONDS, TIMER_CLIENT_TIME) -/atom/proc/forget_alert_image(image/alert_image) - LAZYREMOVE(update_on_z, alert_image) +/atom/proc/forget_alert(atom/movable/flick_visual/exclamation) + LAZYREMOVE(update_on_z, exclamation) /obj/structure/closet/cardboard/metal name = "large metal box" diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm index 2b1e081411361..1e7fede584208 100644 --- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm +++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm @@ -113,10 +113,13 @@ /obj/structure/closet/mini_fridge name = "grimy mini-fridge" - desc = "A small contraption designed to imbue a few drinks with a pleasant chill. This antiquated unit however seems to serve no purpose other than keeping the roaches company." + desc = "A small contraption designed to imbue a few drinks with a pleasant chill." icon_state = "mini_fridge" icon_welded = "welded_small" max_mob_size = MOB_SIZE_SMALL + pass_flags = PASSTABLE + anchored_tabletop_offset = 3 + anchored = 1 storage_capacity = 10 /obj/structure/closet/mini_fridge/PopulateContents() @@ -125,10 +128,22 @@ new /obj/effect/spawner/random/food_or_drink/refreshing_beverage(src) if(prob(50)) new /obj/effect/spawner/random/food_or_drink/refreshing_beverage(src) + if(prob(40)) + new /obj/item/reagent_containers/cup/glass/bottle/beer(src) + +/obj/structure/closet/mini_fridge/grimy + name = "grimy mini-fridge" + desc = "A small contraption designed to imbue a few drinks with a pleasant chill. This antiquated unit however seems to serve no purpose other than keeping the roaches company." + +/obj/structure/closet/mini_fridge/grimy/PopulateContents() + . = ..() if(prob(40)) if(prob(50)) new /obj/item/food/pizzaslice/moldy/bacteria(src) else new /obj/item/food/breadslice/moldy/bacteria(src) - else if(prob(30)) - new /obj/item/food/syndicake(src) + else if(prob(40)) + if(prob(50)) + new /obj/item/food/syndicake(src) + else + new /mob/living/basic/cockroach(src) 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 61f812a599dc5..6cc859fc669d1 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -10,8 +10,7 @@ var/static/items_inside = list( /obj/item/clothing/head/hats/tophat = 2, /obj/item/radio/headset/headset_srv = 2, - /obj/item/clothing/under/suit/sl = 2, - /obj/item/clothing/under/rank/civilian/bartender = 2, + /obj/item/clothing/under/costume/buttondown/slacks/service = 2, /obj/item/clothing/accessory/waistcoat = 2, /obj/item/clothing/head/soft/black = 2, /obj/item/clothing/shoes/sneakers/black = 2, @@ -40,7 +39,7 @@ /obj/item/storage/box/mousetraps = 2, /obj/item/circuitboard/machine/dish_drive = 1, /obj/item/clothing/suit/toggle/chef = 1, - /obj/item/clothing/under/rank/civilian/chef = 1, + /obj/item/clothing/under/costume/buttondown/slacks/service = 1, /obj/item/clothing/head/utility/chefhat = 1, /obj/item/reagent_containers/cup/rag = 1) generate_items_inside(items_inside,src) @@ -76,7 +75,7 @@ /obj/structure/closet/lawcloset/PopulateContents() ..() - new /obj/item/clothing/under/suit/blacktwopiece(src) + new /obj/item/clothing/under/suit/black(src) new /obj/item/clothing/under/rank/civilian/lawyer/beige(src) new /obj/item/clothing/under/rank/civilian/lawyer/black(src) new /obj/item/clothing/under/rank/civilian/lawyer/red(src) @@ -85,11 +84,14 @@ new /obj/item/clothing/suit/toggle/lawyer(src) new /obj/item/clothing/under/rank/civilian/lawyer/purpsuit(src) new /obj/item/clothing/suit/toggle/lawyer/purple(src) - new /obj/item/clothing/under/suit/black(src) + new /obj/item/clothing/under/costume/buttondown/slacks/service(src) new /obj/item/clothing/neck/tie/black(src) new /obj/item/clothing/suit/toggle/lawyer/black(src) new /obj/item/clothing/shoes/laceup(src) new /obj/item/clothing/shoes/laceup(src) + +/obj/structure/closet/lawcloset/populate_contents_immediate() + . = ..() new /obj/item/clothing/accessory/lawyers_badge(src) new /obj/item/clothing/accessory/lawyers_badge(src) @@ -122,6 +124,7 @@ /obj/item/storage/backpack/security = 1, /obj/item/storage/backpack/satchel/sec = 1, /obj/item/storage/backpack/duffelbag/sec = 2, + /obj/item/storage/backpack/messenger/sec = 1, /obj/item/clothing/under/rank/security/officer = 3, /obj/item/clothing/under/rank/security/officer/skirt = 2, /obj/item/clothing/shoes/jackboots = 3, @@ -155,6 +158,8 @@ /obj/item/storage/backpack/duffelbag/engineering = 1, /obj/item/storage/backpack/satchel/eng = 1, /obj/item/storage/backpack/industrial = 1, + /obj/item/storage/backpack/messenger/eng = 1, + /obj/item/clothing/suit/atmos_overalls = 3, /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos = 3, /obj/item/clothing/under/rank/engineering/atmospheric_technician = 3, /obj/item/clothing/shoes/sneakers/black = 3) @@ -171,6 +176,7 @@ /obj/item/storage/backpack/duffelbag/engineering = 1, /obj/item/storage/backpack/industrial = 1, /obj/item/storage/backpack/satchel/eng = 1, + /obj/item/storage/backpack/messenger/eng = 1, /obj/item/clothing/suit/hooded/wintercoat/engineering = 1, /obj/item/clothing/under/rank/engineering/engineer = 3, /obj/item/clothing/suit/hazardvest = 3, @@ -188,6 +194,7 @@ /obj/item/storage/backpack/duffelbag/med = 1, /obj/item/storage/backpack/medic = 1, /obj/item/storage/backpack/satchel/med = 1, + /obj/item/storage/backpack/messenger/med = 1, /obj/item/clothing/suit/hooded/wintercoat/medical = 1, /obj/item/clothing/head/costume/nursehat = 1, /obj/item/clothing/under/rank/medical/scrubs/blue = 1, @@ -231,6 +238,7 @@ /obj/item/clothing/suit/toggle/labcoat/chemist = 2, /obj/item/storage/backpack/chemistry = 2, /obj/item/storage/backpack/satchel/chem = 2, + /obj/item/storage/backpack/messenger/chem = 2, /obj/item/storage/backpack/duffelbag/chemistry = 2, /obj/item/storage/bag/chemistry = 2) generate_items_inside(items_inside,src) @@ -248,6 +256,7 @@ /obj/item/clothing/suit/toggle/labcoat/genetics = 2, /obj/item/storage/backpack/genetics = 2, /obj/item/storage/backpack/satchel/gen = 2, + /obj/item/storage/backpack/messenger/gen = 2, /obj/item/storage/backpack/duffelbag/genetics = 2) generate_items_inside(items_inside,src) return @@ -265,6 +274,7 @@ /obj/item/clothing/mask/surgical = 2, /obj/item/storage/backpack/virology = 2, /obj/item/storage/backpack/satchel/vir = 2, + /obj/item/storage/backpack/messenger/vir = 2, /obj/item/storage/backpack/duffelbag/virology = 2,) generate_items_inside(items_inside,src) return @@ -296,6 +306,7 @@ var/static/items_inside = list( /obj/item/storage/backpack/botany = 2, /obj/item/storage/backpack/satchel/hyd = 2, + /obj/item/storage/backpack/messenger/hyd = 2, /obj/item/storage/backpack/duffelbag/hydroponics = 2, /obj/item/clothing/suit/hooded/wintercoat/hydro = 1, /obj/item/clothing/suit/apron = 2, @@ -314,4 +325,5 @@ new /obj/item/clothing/under/rank/civilian/curator/treasure_hunter(src) new /obj/item/clothing/shoes/workboots/mining(src) new /obj/item/storage/backpack/satchel/explorer(src) + new /obj/item/storage/backpack/messenger/explorer(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm index 93a381b66d699..d10d767f0ccc9 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm @@ -14,9 +14,29 @@ /obj/structure/closet/secure_closet/bar/PopulateContents() ..() for(var/i in 1 to 10) - new /obj/item/reagent_containers/cup/glass/bottle/beer( src ) + new /obj/item/reagent_containers/cup/glass/bottle/beer(src) new /obj/item/etherealballdeployer(src) new /obj/item/roulette_wheel_beacon(src) /obj/structure/closet/secure_closet/bar/all_access req_access = null + +/obj/structure/closet/secure_closet/bar/lavaland_bartender_booze/PopulateContents() + new /obj/item/vending_refill/cigarette(src) + new /obj/item/vending_refill/boozeomat(src) + new /obj/item/storage/backpack/duffelbag(src) + new /obj/item/etherealballdeployer(src) + for(var/i in 1 to 14) + new /obj/item/reagent_containers/cup/glass/bottle/beer/light(src) + for(var/i in 1 to 5) + new /obj/item/reagent_containers/cup/glass/colocup(src) + +/obj/structure/closet/secure/closet/bar/lavaland_bartender_clothes + name = "bartender's closet" + +/obj/structure/closet/secure_closet/bar/lavaland_bartender_clothes/PopulateContents() + new /obj/item/clothing/neck/beads(src) + new /obj/item/clothing/glasses/sunglasses/reagent(src) + new /obj/item/clothing/suit/costume/hawaiian(src) + new /obj/item/clothing/shoes/sandal/beach(src) + 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 74de666ed80ec..3bfee4282c27f 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -6,6 +6,7 @@ /obj/structure/closet/secure_closet/quartermaster/PopulateContents() ..() new /obj/item/storage/lockbox/medal/cargo(src) + new /obj/item/radio/weather_monitor (src) new /obj/item/radio/headset/heads/qm(src) new /obj/item/megaphone/cargo(src) new /obj/item/tank/internals/emergency_oxygen(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 be49ebd08c352..d90212ca113ad 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,7 @@ new /obj/item/holosign_creator/atmos(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/storage/lockbox/medal/engineering(src) new /obj/item/circuitboard/machine/techfab/department/engineering(src) new /obj/item/extinguisher/advanced(src) new /obj/item/storage/photo_album/ce(src) @@ -24,6 +24,7 @@ // Traitor steal objective new /obj/item/areaeditor/blueprints(src) + new /obj/item/pipe_dispenser(src) /obj/structure/closet/secure_closet/engineering_electrical name = "electrical supplies locker" @@ -34,13 +35,18 @@ /obj/structure/closet/secure_closet/engineering_electrical/PopulateContents() ..() var/static/items_inside = list( - /obj/item/clothing/gloves/color/yellow = 2, /obj/item/inducer = 2, /obj/item/storage/toolbox/electrical = 3, /obj/item/electronics/apc = 3, /obj/item/multitool = 3) generate_items_inside(items_inside,src) +/obj/structure/closet/secure_closet/engineering_electrical/populate_contents_immediate() + . = ..() + + new /obj/item/clothing/gloves/color/yellow(src) + new /obj/item/clothing/gloves/color/yellow(src) + /obj/structure/closet/secure_closet/engineering_welding name = "welding supplies locker" req_access = list(ACCESS_ENGINE_EQUIP) @@ -79,7 +85,7 @@ /obj/structure/closet/secure_closet/atmospherics/PopulateContents() ..() new /obj/item/radio/headset/headset_eng(src) - new /obj/item/pipe_dispenser(src) + new /obj/item/storage/toolbox/mechanical(src) new /obj/item/tank/internals/emergency_oxygen/engi(src) new /obj/item/holosign_creator/atmos(src) @@ -90,3 +96,8 @@ new /obj/item/clothing/head/utility/hardhat/welding/atmos(src) new /obj/item/clothing/glasses/meson/engine/tray(src) new /obj/item/extinguisher/advanced(src) + +/obj/structure/closet/secure_closet/atmospherics/populate_contents_immediate() + . = ..() + + new /obj/item/pipe_dispenser(src) 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 ba1bc1ef471ee..b5de757aa4549 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -55,8 +55,8 @@ /obj/structure/closet/secure_closet/psychology/PopulateContents() ..() - new /obj/item/clothing/under/suit/black(src) - new /obj/item/clothing/under/suit/black/skirt(src) + new /obj/item/clothing/under/costume/buttondown/slacks/service(src) + new /obj/item/clothing/under/costume/buttondown/skirt/service(src) new /obj/item/clothing/neck/tie/black(src) new /obj/item/clothing/shoes/laceup(src) new /obj/item/storage/backpack/medic(src) 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 86be18f53572f..ad056e70b39d3 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -9,11 +9,11 @@ new /obj/item/storage/backpack/captain(src) new /obj/item/storage/backpack/satchel/cap(src) new /obj/item/storage/backpack/duffelbag/captain(src) + new /obj/item/storage/backpack/messenger/cap(src) new /obj/item/clothing/neck/petcollar(src) new /obj/item/pet_carrier(src) new /obj/item/storage/bag/garment/captain(src) new /obj/item/computer_disk/command/captain(src) - new /obj/item/storage/box/silver_ids(src) new /obj/item/radio/headset/heads/captain/alt(src) new /obj/item/radio/headset/heads/captain(src) new /obj/item/storage/belt/sabre(src) @@ -34,7 +34,7 @@ new /obj/item/computer_disk/command/hop(src) new /obj/item/radio/headset/heads/hop(src) new /obj/item/storage/box/ids(src) - new /obj/item/storage/box/ids(src) + new /obj/item/storage/box/silver_ids(src) new /obj/item/megaphone/command(src) new /obj/item/assembly/flash/handheld(src) new /obj/item/gun/energy/e_gun(src) @@ -72,6 +72,7 @@ // Traitor steal objectives new /obj/item/gun/energy/e_gun/hos(src) new /obj/item/pinpointer/nuke(src) + new /obj/item/gun/ballistic/shotgun/automatic/combat/compact(src) /obj/structure/closet/secure_closet/warden name = "warden's locker" @@ -82,21 +83,12 @@ ..() new /obj/item/dog_bone(src) new /obj/item/radio/headset/headset_sec(src) - new /obj/item/clothing/suit/armor/vest/warden(src) - new /obj/item/clothing/head/hats/warden(src) - new /obj/item/clothing/head/hats/warden/drill(src) - new /obj/item/clothing/head/beret/sec/navywarden(src) - new /obj/item/clothing/suit/armor/vest/warden/alt(src) - new /obj/item/clothing/under/rank/security/warden/formal(src) - new /obj/item/clothing/under/rank/security/warden/skirt(src) - new /obj/item/clothing/glasses/hud/security/sunglasses(src) new /obj/item/holosign_creator/security(src) - new /obj/item/clothing/mask/gas/sechailer(src) + new /obj/item/storage/bag/garment/warden(src) new /obj/item/storage/box/zipties(src) new /obj/item/storage/box/flashbangs(src) 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 @@ -106,7 +98,6 @@ /obj/structure/closet/secure_closet/security/PopulateContents() ..() - new /obj/item/clothing/suit/armor/vest(src) new /obj/item/clothing/suit/armor/vest/alt/sec(src) new /obj/item/clothing/head/helmet/sec(src) new /obj/item/radio/headset/headset_sec(src) @@ -171,6 +162,7 @@ new /obj/item/pinpointer/crew(src) new /obj/item/binoculars(src) new /obj/item/storage/box/rxglasses/spyglasskit(src) + new /obj/item/clothing/head/fedora/inspector_hat(src) /obj/structure/closet/secure_closet/injection name = "lethal injections locker" diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index eae92151cabaf..aab8e4b858286 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -28,6 +28,8 @@ new /obj/item/clothing/under/syndicate(src) new /obj/item/clothing/under/syndicate/skirt(src) new /obj/item/clothing/shoes/sneakers/black(src) + new /obj/item/mod/module/plasma_stabilizer(src) + new /obj/item/climbing_hook/syndicate(src) /obj/structure/closet/syndicate/nuclear desc = "It's a storage unit for a Syndicate boarding party." 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 57135bf0bdab9..852e021fd2983 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -21,6 +21,10 @@ anchored = TRUE /obj/structure/closet/emcloset/Initialize(mapload) + if(HAS_TRAIT(SSstation, STATION_TRAIT_RADIOACTIVE_NEBULA) && prob(30)) + new /obj/structure/closet/radiation(loc) + return INITIALIZE_HINT_QDEL + . = ..() if (prob(1)) @@ -120,12 +124,18 @@ new /obj/item/stack/cable_coil(src) if(prob(20)) new /obj/item/multitool(src) - if(prob(5)) - new /obj/item/clothing/gloves/color/yellow(src) + if(prob(40)) new /obj/item/clothing/head/utility/hardhat(src) +/obj/structure/closet/toolcloset/populate_contents_immediate() + . = ..() + + // Since they're a traitor objective, they have to be generated immediately. + if(prob(5)) + new /obj/item/clothing/gloves/color/yellow(src) + /* * Radiation Closet */ diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index cd51fd776245a..d517ebb11969d 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -158,9 +158,24 @@ for (var/i in 1 to rand(2,6)) new /obj/effect/spawner/random/maintenance(src) +/obj/structure/closet/crate/trashcart //please make this a generic cart path later after things calm down a little + desc = "A heavy, metal trashcart with wheels." + name = "trash cart" + icon_state = "trashcart" + base_icon_state = "trashcart" + can_install_electronics = FALSE + paint_jobs = null + +/obj/structure/closet/crate/trashcart/laundry + name = "laundry cart" + desc = "A large cart for hauling around large amounts of laundry." + icon_state = "laundry" + base_icon_state = "laundry" + /obj/structure/closet/crate/trashcart/Initialize(mapload) . = ..() AddElement(/datum/element/swabable, CELL_LINE_TABLE_SLUDGE, CELL_VIRUS_TABLE_GENERIC, rand(2,3), 15) + AddElement(/datum/element/noisy_movement) /obj/structure/closet/crate/trashcart/filled @@ -182,25 +197,6 @@ icon_state = "o2crate" base_icon_state = "o2crate" -/obj/structure/closet/crate/trashcart //please make this a generic cart path later after things calm down a little - desc = "A heavy, metal trashcart with wheels." - name = "trash cart" - icon_state = "trashcart" - base_icon_state = "trashcart" - can_install_electronics = FALSE - paint_jobs = null - -/obj/structure/closet/crate/trashcart/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - . = ..() - if(has_gravity()) - playsound(src, 'sound/effects/roll.ogg', 100, TRUE) - -/obj/structure/closet/crate/trashcart/laundry - name = "laundry cart" - desc = "A large cart for hauling around large amounts of laundry." - icon_state = "laundry" - base_icon_state = "laundry" - /obj/structure/closet/crate/medical desc = "A medical crate." name = "medical crate" @@ -302,6 +298,18 @@ icon_state = "scicrate" base_icon_state = "scicrate" +/obj/structure/closet/crate/mod + name = "MOD crate" + icon_state = "scicrate" + base_icon_state = "scicrate" + +/obj/structure/closet/crate/mod/PopulateContents() + ..() + for(var/i in 1 to 3) + new /obj/item/mod/core/standard(src) + for(var/i in 1 to 2) + new /obj/item/clothing/neck/link_scryer/loaded(src) + /obj/structure/closet/crate/solarpanel_small name = "budget solar panel crate" icon_state = "engi_e_crate" @@ -344,3 +352,6 @@ . = ..() for(var/i in 1 to 4) new /obj/effect/spawner/random/decoration/generic(src) + +/obj/structure/closet/crate/add_to_roundstart_list() + return diff --git a/code/game/objects/structures/crates_lockers/crates/large.dm b/code/game/objects/structures/crates_lockers/crates/large.dm index ef6e25d343c7e..3fe68ee5763d4 100644 --- a/code/game/objects/structures/crates_lockers/crates/large.dm +++ b/code/game/objects/structures/crates_lockers/crates/large.dm @@ -55,3 +55,18 @@ to_chat(user, span_warning("You need a crowbar to pry this open!")) return FALSE //Just stop. Do nothing. Don't turn into an invisible sprite. Don't open like a locker. //The large crate has no non-attack interactions other than the crowbar, anyway. + +/obj/structure/closet/crate/large/hats/PopulateContents() + ..() + for (var/i in 1 to 5) + new /obj/effect/spawner/random/clothing/funny_hats(src) + for (var/i in 1 to 5) + new /obj/item/mod/module/hat_stabilizer(src) + if(prob(1)) + var/our_contents = list() + for(var/obj/item/clothing/head/any_hat in contents) + our_contents[any_hat]++ + if(our_contents) + var/obj/item/clothing/head/lucky_hat = pick(our_contents) + lucky_hat.AddComponent(/datum/component/unusual_effect, color = "#FFEA0030", include_particles = TRUE) + lucky_hat.name = "unusual [name]" diff --git a/code/game/objects/structures/crates_lockers/crates/secure.dm b/code/game/objects/structures/crates_lockers/crates/secure.dm index aa6284e298e3b..a550daf05eaa7 100644 --- a/code/game/objects/structures/crates_lockers/crates/secure.dm +++ b/code/game/objects/structures/crates_lockers/crates/secure.dm @@ -23,7 +23,7 @@ . = ..() ADD_TRAIT(src, TRAIT_NO_MISSING_ITEM_ERROR, TRAIT_GENERIC) -/obj/structure/closet/crate/secure/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) +/obj/structure/closet/crate/secure/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armour_penetration = 0) if(prob(tamperproof) && damage_amount >= DAMAGE_PRECISION) boom() else @@ -111,7 +111,7 @@ /obj/structure/closet/crate/secure/owned/Initialize(mapload, datum/bank_account/_buyer_account) . = ..() buyer_account = _buyer_account - if(istype(buyer_account, /datum/bank_account/department)) + if(IS_DEPARTMENTAL_ACCOUNT(buyer_account)) department_purchase = TRUE department_account = buyer_account diff --git a/code/game/objects/structures/crates_lockers/crates/syndicrate.dm b/code/game/objects/structures/crates_lockers/crates/syndicrate.dm index b58686cc34308..ff7cf8df03ba4 100644 --- a/code/game/objects/structures/crates_lockers/crates/syndicrate.dm +++ b/code/game/objects/structures/crates_lockers/crates/syndicrate.dm @@ -31,7 +31,7 @@ return TRUE -/obj/structure/closet/crate/syndicrate/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) +/obj/structure/closet/crate/syndicrate/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armour_penetration = 0) if(created_items) return ..() if(damage_amount < DAMAGE_PRECISION) diff --git a/code/game/objects/structures/deployable_turret.dm b/code/game/objects/structures/deployable_turret.dm index 3df0efd1eec9b..0e810526bdc55 100644 --- a/code/game/objects/structures/deployable_turret.dm +++ b/code/game/objects/structures/deployable_turret.dm @@ -202,7 +202,7 @@ var/turf/targets_from = get_turf(src) if(QDELETED(target)) target = target_turf - var/obj/projectile/projectile_to_fire = new projectile_type + var/obj/projectile/projectile_to_fire = new projectile_type(targets_from) playsound(src, firesound, 75, TRUE) projectile_to_fire.preparePixelProjectile(target, targets_from) projectile_to_fire.firer = user diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index a8519b9140dc9..13bcf8e711309 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -1,6 +1,6 @@ /obj/structure/displaycase name = "display case" - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/structures.dmi' icon_state = "glassbox" desc = "A display case for prized possessions." density = TRUE @@ -47,13 +47,13 @@ if(vname in list(NAMEOF(src, open), NAMEOF(src, showpiece), NAMEOF(src, custom_glass_overlay))) update_appearance() -/obj/structure/displaycase/handle_atom_del(atom/A) - if(A == electronics) +/obj/structure/displaycase/Exited(atom/movable/gone, direction) + . = ..() + if(gone == electronics) electronics = null - if(A == showpiece) + if(gone == showpiece) showpiece = null update_appearance() - return ..() /obj/structure/displaycase/Destroy() QDEL_NULL(electronics) @@ -73,8 +73,6 @@ if(QDELETED(showpiece)) return showpiece.forceMove(drop_location()) - showpiece = null - update_appearance() /obj/structure/displaycase/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) @@ -129,27 +127,27 @@ . += "[initial(icon_state)]_closed" return -/obj/structure/displaycase/attackby(obj/item/tool, mob/living/user, params) - if(tool.GetID() && !broken) +/obj/structure/displaycase/attackby(obj/item/attacking_item, mob/living/user, params) + if(attacking_item.GetID() && !broken) if(allowed(user)) to_chat(user, span_notice("You [open ? "close":"open"] [src].")) toggle_lock(user) else to_chat(user, span_alert("Access denied.")) - else if(tool.tool_behaviour == TOOL_WELDER && !user.combat_mode && !broken) + else if(attacking_item.tool_behaviour == TOOL_WELDER && !user.combat_mode && !broken) if(atom_integrity < max_integrity) - if(!tool.tool_start_check(user, amount=5)) + if(!attacking_item.tool_start_check(user, amount=1)) return to_chat(user, span_notice("You begin repairing [src]...")) - if(tool.use_tool(src, user, 40, amount=5, volume=50)) + if(attacking_item.use_tool(src, user, 40, volume=50)) atom_integrity = max_integrity update_appearance() to_chat(user, span_notice("You repair [src].")) else to_chat(user, span_warning("[src] is already in good condition!")) return - else if(!alert && tool.tool_behaviour == TOOL_CROWBAR) //Only applies to the lab cage and player made display cases + else if(!alert && attacking_item.tool_behaviour == TOOL_CROWBAR) //Only applies to the lab cage and player made display cases if(broken) if(showpiece) to_chat(user, span_warning("Remove the displayed object first!")) @@ -158,14 +156,14 @@ qdel(src) else to_chat(user, span_notice("You start to [open ? "close":"open"] [src]...")) - if(tool.use_tool(src, user, 20)) + if(attacking_item.use_tool(src, user, 20)) to_chat(user, span_notice("You [open ? "close":"open"] [src].")) toggle_lock(user) else if(open && !showpiece) - insert_showpiece(tool, user) + insert_showpiece(attacking_item, user) return TRUE //cancel the attack chain, wether we successfully placed an item or not - else if(glass_fix && broken && istype(tool, /obj/item/stack/sheet/glass)) - var/obj/item/stack/sheet/glass/glass_sheet = tool + else if(glass_fix && broken && istype(attacking_item, /obj/item/stack/sheet/glass)) + var/obj/item/stack/sheet/glass/glass_sheet = attacking_item if(glass_sheet.get_amount() < 2) to_chat(user, span_warning("You need two glass sheets to fix the case!")) return @@ -226,64 +224,95 @@ /obj/structure/displaycase_chassis name = "display case chassis" desc = "The wooden base of a display case." - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/structures.dmi' icon_state = "glassbox_chassis" resistance_flags = FLAMMABLE anchored = TRUE density = FALSE + ///The airlock electronics inserted into the chassis, to be moved to the finished product. var/obj/item/electronics/airlock/electronics +/obj/structure/displaycase_chassis/Initialize(mapload) + . = ..() + register_context() -/obj/structure/displaycase_chassis/attackby(obj/item/I, mob/user, params) - if(I.tool_behaviour == TOOL_WRENCH) //The player can only deconstruct the wooden frame - to_chat(user, span_notice("You start disassembling [src]...")) - I.play_tool_sound(src) - if(I.use_tool(src, user, 30)) - playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE) - new /obj/item/stack/sheet/mineral/wood(get_turf(src), 5) - qdel(src) - - else if(istype(I, /obj/item/electronics/airlock)) - to_chat(user, span_notice("You start installing the electronics into [src]...")) - I.play_tool_sound(src) - if(do_after(user, 30, target = src) && user.transferItemToLoc(I,src)) - electronics = I - to_chat(user, span_notice("You install the airlock electronics.")) - - else if(istype(I, /obj/item/stock_parts/card_reader)) - var/obj/item/stock_parts/card_reader/C = I - to_chat(user, span_notice("You start adding [C] to [src]...")) - if(do_after(user, 20, target = src)) - var/obj/structure/displaycase/forsale/sale = new(src.loc) - if(electronics) - electronics.forceMove(sale) - sale.electronics = electronics - if(electronics.one_access) - sale.req_one_access = electronics.accesses - else - sale.req_access = electronics.accesses - qdel(src) - qdel(C) - - else if(istype(I, /obj/item/stack/sheet/glass)) - var/obj/item/stack/sheet/glass/G = I - if(G.get_amount() < 10) - to_chat(user, span_warning("You need ten glass sheets to do this!")) +/obj/structure/displaycase_chassis/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + if(isnull(held_item)) + return . + + if(held_item.tool_behaviour == TOOL_WRENCH) + context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" + return CONTEXTUAL_SCREENTIP_SET + if(istype(held_item, /obj/item/electronics/airlock) && !electronics) + context[SCREENTIP_CONTEXT_LMB] = "Add electronics" + return CONTEXTUAL_SCREENTIP_SET + if(istype(held_item, /obj/item/stock_parts/card_reader)) + context[SCREENTIP_CONTEXT_LMB] = "Construct Vend-A-Tray" + return CONTEXTUAL_SCREENTIP_SET + if(istype(held_item, /obj/item/stack/sheet/glass)) + context[SCREENTIP_CONTEXT_LMB] = "Finalize display case" + return CONTEXTUAL_SCREENTIP_SET + return . + +/obj/structure/displaycase_chassis/examine(mob/user) + . = ..() + if(!electronics) + . += span_notice("You can attach [EXAMINE_HINT("airlock electronics")] to give it access restrictions.") + . += span_notice("[src] can be finalized using [EXAMINE_HINT("10 glass sheets")], or turned into a Vend-A-Tray using a [EXAMINE_HINT("card reader")].") + +/obj/structure/displaycase_chassis/wrench_act(mob/living/user, obj/item/tool) + . = ..() + balloon_alert(user, "disassembling...") + tool.play_tool_sound(src) + if(tool.use_tool(src, user, 3 SECONDS)) + playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) + new /obj/item/stack/sheet/mineral/wood(drop_location(), 5) + if(electronics) + electronics.forceMove(drop_location()) + electronics = null + qdel(src) + return TOOL_ACT_TOOLTYPE_SUCCESS + +/obj/structure/displaycase_chassis/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/electronics/airlock)) + balloon_alert(user, "installing electronics...") + if(do_after(user, 3 SECONDS, target = src) && user.transferItemToLoc(attacking_item, src)) + electronics = attacking_item + balloon_alert(user, "electronics installed") + return + + if(istype(attacking_item, /obj/item/stock_parts/card_reader)) + var/obj/item/stock_parts/card_reader/card_reader = attacking_item + balloon_alert(user, "adding [card_reader]...") + if(do_after(user, 2 SECONDS, target = src)) + qdel(card_reader) + make_final_result(display_type = /obj/structure/displaycase/forsale) + return + + if(istype(attacking_item, /obj/item/stack/sheet/glass)) + var/obj/item/stack/sheet/glass/glass_sheets = attacking_item + if(glass_sheets.get_amount() < 10) + balloon_alert(user, "need 10 sheets!") return - to_chat(user, span_notice("You start adding [G] to [src]...")) - if(do_after(user, 20, target = src)) - G.use(10) - var/obj/structure/displaycase/noalert/display = new(src.loc) - if(electronics) - electronics.forceMove(display) - display.electronics = electronics - if(electronics.one_access) - display.req_one_access = electronics.accesses - else - display.req_access = electronics.accesses - qdel(src) - else - return ..() + balloon_alert(user, "adding glass...") + if(do_after(user, 2 SECONDS, target = src)) + glass_sheets.use(10) + make_final_result(display_type = /obj/structure/displaycase/noalert) + return + return ..() + +///Makes the final result of the chassis, then deletes itself. +/obj/structure/displaycase_chassis/proc/make_final_result(obj/structure/displaycase/display_type) + var/obj/structure/displaycase/display = new display_type(loc) + if(electronics) + electronics.forceMove(display) + display.electronics = electronics + if(electronics.one_access) + display.req_one_access = electronics.accesses + else + display.req_access = electronics.accesses + qdel(src) //The lab cage and captain's display case do not spawn with electronics, which is why req_access is needed. /obj/structure/displaycase/captain @@ -332,8 +361,8 @@ holographic_showpiece = TRUE update_appearance() -/obj/structure/displaycase/trophy/attackby(obj/item/W, mob/living/user, params) - if(istype(W, /obj/item/key/displaycase)) +/obj/structure/displaycase/trophy/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/key/displaycase)) toggle_historian_mode(user) return return ..() @@ -440,6 +469,7 @@ /obj/structure/displaycase/forsale name = "vend-a-tray" + icon = 'icons/obj/machines/display.dmi' icon_state = "laserbox" custom_glass_overlay = TRUE desc = "A display case with an ID-card swiper. Use your ID to purchase the contents." @@ -581,17 +611,17 @@ return TRUE . = TRUE -/obj/structure/displaycase/forsale/attackby(obj/item/I, mob/living/user, params) - if(isidcard(I)) +/obj/structure/displaycase/forsale/attackby(obj/item/attacking_item, mob/user, params) + if(isidcard(attacking_item)) //Card Registration - var/obj/item/card/id/potential_acc = I + var/obj/item/card/id/potential_acc = attacking_item if(!potential_acc.registered_account) to_chat(user, span_warning("This ID card has no account registered!")) return if(payments_acc == potential_acc.registered_account) toggle_lock() return - if(istype(I, /obj/item/modular_computer)) + if(istype(attacking_item, /obj/item/modular_computer)) return TRUE SStgui.update_uis(src) return ..() @@ -626,11 +656,13 @@ to_chat(user, span_notice("[src] must be open to move it.")) return -/obj/structure/displaycase/forsale/emag_act(mob/user) +/obj/structure/displaycase/forsale/emag_act(mob/user, obj/item/card/emag/emag_card) . = ..() payments_acc = null req_access = list() - to_chat(user, span_warning("[src]'s card reader fizzles and smokes, and the account owner is reset.")) + balloon_alert(user, "account owner reset") + to_chat(user, span_warning("[src]'s card reader fizzles and smokes.")) + return TRUE /obj/structure/displaycase/forsale/examine(mob/user) . = ..() diff --git a/code/game/objects/structures/divine.dm b/code/game/objects/structures/divine.dm index 4a6be0d9b1751..ef9f650e42a56 100644 --- a/code/game/objects/structures/divine.dm +++ b/code/game/objects/structures/divine.dm @@ -1,7 +1,7 @@ /obj/structure/sacrificealtar name = "sacrificial altar" desc = "An altar designed to perform blood sacrifice for a deity. Alt-click it to sacrifice a buckled creature." - icon = 'icons/obj/hand_of_god_structures.dmi' + icon = 'icons/obj/service/hand_of_god_structures.dmi' icon_state = "sacrificealtar" anchored = TRUE density = FALSE @@ -18,13 +18,13 @@ return to_chat(user, span_notice("Invoking the sacred ritual, you sacrifice [L].")) L.investigate_log("has been sacrificially gibbed on an altar.", INVESTIGATE_DEATHS) - L.gib() + L.gib(DROP_ALL_REMAINS) message_admins("[ADMIN_LOOKUPFLW(user)] has sacrificed [key_name_admin(L)] on the sacrificial altar at [AREACOORD(src)].") /obj/structure/healingfountain name = "healing fountain" desc = "A fountain containing the waters of life." - icon = 'icons/obj/hand_of_god_structures.dmi' + icon = 'icons/obj/service/hand_of_god_structures.dmi' icon_state = "fountain" anchored = TRUE density = TRUE diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 80fd02425b35c..62638f44eeb77 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -6,26 +6,59 @@ anchored = FALSE density = TRUE max_integrity = 200 + /// Airlock's current construction state var/state = AIRLOCK_ASSEMBLY_NEEDS_WIRES var/base_name = "Airlock" + var/created_name = null var/mineral = null var/obj/item/electronics/airlock/electronics = null - var/airlock_type = /obj/machinery/door/airlock //the type path of the airlock once completed + /// Do we perform the extra checks required for multi-tile (large) airlocks + var/multi_tile = FALSE + /// The type path of the airlock once completed (solid version) + var/airlock_type = /obj/machinery/door/airlock + /// The type path of the airlock once completed (glass version) var/glass_type = /obj/machinery/door/airlock/glass - var/glass = 0 // 0 = glass can be installed. 1 = glass is already installed. - var/created_name = null - var/heat_proof_finished = 0 //whether to heat-proof the finished airlock + /// FALSE = glass can be installed. TRUE = glass is already installed. + var/glass = FALSE + /// Whether to heat-proof the finished airlock + var/heat_proof_finished = FALSE + /// If you're changing the airlock material, what is the previous type var/previous_assembly = /obj/structure/door_assembly - var/noglass = FALSE //airlocks with no glass version, also cannot be modified with sheets - var/nomineral = FALSE //airlock with glass version, but cannot be modified with sheets + /// Airlocks with no glass version, also cannot be modified with sheets + var/noglass = FALSE + /// Airlock with glass version, but cannot be modified with sheets + var/nomineral = FALSE + /// What type of material the airlock drops when deconstructed var/material_type = /obj/item/stack/sheet/iron + /// Amount of material the airlock drops when deconstructed var/material_amt = 4 +/obj/structure/door_assembly/multi_tile + name = "large airlock assembly" + icon = 'icons/obj/doors/airlocks/multi_tile/public/glass.dmi' + overlays_file = 'icons/obj/doors/airlocks/multi_tile/public/overlays.dmi' + base_name = "large airlock" + glass_type = /obj/machinery/door/airlock/multi_tile/public/glass + airlock_type = /obj/machinery/door/airlock/multi_tile/public/glass + dir = EAST + multi_tile = TRUE + glass = TRUE + nomineral = TRUE + /obj/structure/door_assembly/Initialize(mapload) . = ..() update_appearance() update_name() +/obj/structure/door_assembly/multi_tile/Initialize(mapload) + . = ..() + set_bounds() + update_overlays() + +/obj/structure/door_assembly/multi_tile/Move() + . = ..() + set_bounds() + /obj/structure/door_assembly/examine(mob/user) . = ..() var/doorname = "" @@ -60,7 +93,7 @@ created_name = t else if((W.tool_behaviour == TOOL_WELDER) && (mineral || glass || !anchored )) - if(!W.tool_start_check(user, amount=0)) + if(!W.tool_start_check(user, amount=1)) return if(mineral) @@ -78,7 +111,7 @@ to_chat(user, span_notice("You weld the glass panel out.")) if(heat_proof_finished) new /obj/item/stack/sheet/rglass(get_turf(src)) - heat_proof_finished = 0 + heat_proof_finished = FALSE else new /obj/item/stack/sheet/glass(get_turf(src)) glass = 0 @@ -260,7 +293,6 @@ door = new airlock_type( loc ) door.setDir(dir) door.unres_sides = electronics.unres_sides - //door.req_access = req_access door.electronics = electronics door.heat_proof = heat_proof_finished door.security_level = 0 @@ -288,9 +320,11 @@ door.unres_sensor = TRUE door.previous_airlock = previous_assembly electronics.forceMove(door) + door.autoclose = TRUE + door.close() door.update_appearance() + qdel(src) - return door /obj/structure/door_assembly/update_overlays() . = ..() @@ -350,7 +384,7 @@ /obj/structure/door_assembly/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) if(the_rcd.mode == RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 16) + return list("mode" = RCD_DECONSTRUCT, "delay" = 5 SECONDS, "cost" = 16) return FALSE /obj/structure/door_assembly/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) diff --git a/code/game/objects/structures/door_assembly_types.dm b/code/game/objects/structures/door_assembly_types.dm index 2d7e607cd226a..74a77443b2815 100644 --- a/code/game/objects/structures/door_assembly_types.dm +++ b/code/game/objects/structures/door_assembly_types.dm @@ -1,7 +1,7 @@ /obj/structure/door_assembly/door_assembly_public name = "public airlock assembly" - icon = 'icons/obj/doors/airlocks/station2/glass.dmi' - overlays_file = 'icons/obj/doors/airlocks/station2/overlays.dmi' + icon = 'icons/obj/doors/airlocks/public/glass.dmi' + overlays_file = 'icons/obj/doors/airlocks/public/overlays.dmi' glass_type = /obj/machinery/door/airlock/public/glass airlock_type = /obj/machinery/door/airlock/public @@ -267,6 +267,10 @@ nomineral = TRUE material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_GREYSCALE | MATERIAL_AFFECT_STATISTICS +/obj/structure/door_assembly/multi_tile/door_assembly_public + name = "large public airlock assembly" + base_name = "large public airlock" + /obj/structure/door_assembly/door_assembly_material/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) var/turf/T = get_turf(src) diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm index 9d4e14339f114..0851747046227 100644 --- a/code/game/objects/structures/dresser.dm +++ b/code/game/objects/structures/dresser.dm @@ -1,7 +1,7 @@ /obj/structure/dresser name = "dresser" desc = "A nicely-crafted wooden dresser. It's filled with lots of undies." - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/fluff/general.dmi' icon_state = "dresser" resistance_flags = FLAMMABLE density = TRUE @@ -30,9 +30,8 @@ if(!ishuman(user)) return var/mob/living/carbon/human/dressing_human = user - - if(dressing_human.dna && dressing_human.dna.species && (NO_UNDERWEAR in dressing_human.dna.species.species_traits)) - to_chat(user, span_warning("You are not capable of wearing underwear.")) + if(HAS_TRAIT(dressing_human, TRAIT_NO_UNDERWEAR)) + to_chat(dressing_human, span_warning("You are not capable of wearing underwear.")) return var/choice = tgui_input_list(user, "Underwear, Undershirt, or Socks?", "Changing", list("Underwear","Underwear Color","Undershirt","Socks")) @@ -57,7 +56,7 @@ if("Socks") var/new_socks = tgui_input_list(user, "Select your socks", "Changing", GLOB.socks_list) if(new_socks) - dressing_human.socks= new_socks + dressing_human.socks = new_socks add_fingerprint(dressing_human) dressing_human.update_body() diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 1c5af207486bd..91b63314eb3d6 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -20,6 +20,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/extinguisher_cabinet, 29) stored_extinguisher = new /obj/item/extinguisher(src) update_appearance(UPDATE_ICON) register_context() + find_and_hang_on_wall() /obj/structure/extinguisher_cabinet/add_context(atom/source, list/context, obj/item/held_item, mob/user) . = ..() @@ -44,8 +45,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/extinguisher_cabinet, 29) /obj/structure/extinguisher_cabinet/Destroy() if(stored_extinguisher) - qdel(stored_extinguisher) - stored_extinguisher = null + QDEL_NULL(stored_extinguisher) return ..() /obj/structure/extinguisher_cabinet/contents_explosion(severity, target) @@ -60,8 +60,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/extinguisher_cabinet, 29) if(EXPLODE_LIGHT) SSexplosions.low_mov_atom += stored_extinguisher -/obj/structure/extinguisher_cabinet/handle_atom_del(atom/A) - if(A == stored_extinguisher) +/obj/structure/extinguisher_cabinet/Exited(atom/movable/gone, direction) + if(gone == stored_extinguisher) stored_extinguisher = null update_appearance(UPDATE_ICON) @@ -102,11 +102,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/extinguisher_cabinet, 29) if(stored_extinguisher) user.put_in_hands(stored_extinguisher) user.balloon_alert(user, "extinguisher removed") - stored_extinguisher = null if(!opened) opened = 1 playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) - update_appearance(UPDATE_ICON) else toggle_cabinet(user) @@ -184,6 +182,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/extinguisher_cabinet, 29) /obj/item/wallframe/extinguisher_cabinet name = "extinguisher cabinet frame" desc = "Used for building wall-mounted extinguisher cabinets." - icon_state = "extinguisher" + icon = 'icons/obj/wallmounts.dmi' + icon_state = "extinguisher_assembly" result_path = /obj/structure/extinguisher_cabinet pixel_shift = 29 diff --git a/code/game/objects/structures/fake_stairs.dm b/code/game/objects/structures/fake_stairs.dm new file mode 100644 index 0000000000000..a5e03ed6b5986 --- /dev/null +++ b/code/game/objects/structures/fake_stairs.dm @@ -0,0 +1,19 @@ +/// Stairs but they are FAKE and dont have any of the Z-changing behavior. DO NOT MAP THESE NEXT TO REAL STAIRS +/obj/structure/fake_stairs + name = "stairs" + icon = 'icons/obj/stairs.dmi' + icon_state = "stairs" + anchored = TRUE + move_resist = INFINITY + + plane = FLOOR_PLANE //one with the floor + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fake_stairs, 0) + +/obj/structure/fake_stairs/wood + icon_state = "stairs_wood" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fake_stairs/wood, 0) + +/obj/structure/fake_stairs/stone + icon_state = "stairs_stone" diff --git a/code/game/objects/structures/fans.dm b/code/game/objects/structures/fans.dm index 86bf33d614a82..263a41d970ff9 100644 --- a/code/game/objects/structures/fans.dm +++ b/code/game/objects/structures/fans.dm @@ -1,6 +1,6 @@ //Fans /obj/structure/fans - icon = 'icons/obj/lavaland/survival_pod.dmi' + icon = 'icons/obj/mining_zones/survival_pod.dmi' icon_state = "fans" name = "environmental regulation system" desc = "A large machine releasing a constant gust of air." diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index b64702a22c0a4..31ba1cd47aa59 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -36,6 +36,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet, 32) if(populate_contents) held_item = new item_path(src) update_appearance() + find_and_hang_on_wall() /obj/structure/fireaxecabinet/Destroy() if(held_item) @@ -156,10 +157,24 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet, 32) . = ..() if(held_item) . += item_overlay + var/hp_percent = (atom_integrity/max_integrity) * 100 + if(open) - . += "glass_raised" + if(broken) + . += "glass4_raised" + return + + switch(hp_percent) + if(-INFINITY to 40) + . += "glass3_raised" + if(40 to 60) + . += "glass2_raised" + if(60 to 80) + . += "glass1_raised" + if(80 to INFINITY) + . += "glass_raised" return - var/hp_percent = atom_integrity/max_integrity * 100 + if(broken) . += "glass4" else @@ -196,6 +211,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet, 32) /obj/structure/fireaxecabinet/empty populate_contents = FALSE +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet/empty, 32) + /obj/item/wallframe/fireaxecabinet name = "fire axe cabinet" desc = "Home to a window's greatest nightmare. Apply to wall to use." @@ -223,6 +240,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet/mechremoval, 32) /obj/structure/fireaxecabinet/mechremoval/empty populate_contents = FALSE +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet/mechremoval/empty, 32) + /obj/item/wallframe/fireaxecabinet/mechremoval name = "mech removal tool cabinet" desc = "Home to a very special crowbar. Apply to wall to use." diff --git a/code/game/objects/structures/fireplace.dm b/code/game/objects/structures/fireplace.dm index ef0bfedace138..132415e2632f7 100644 --- a/code/game/objects/structures/fireplace.dm +++ b/code/game/objects/structures/fireplace.dm @@ -5,12 +5,15 @@ /obj/structure/fireplace name = "fireplace" desc = "A large stone brick fireplace." - icon = 'icons/obj/fireplace.dmi' + icon = 'icons/obj/fluff/fireplace.dmi' icon_state = "fireplace" density = FALSE anchored = TRUE pixel_x = -16 resistance_flags = FIRE_PROOF + light_color = LIGHT_COLOR_FIRE + light_angle = 170 + light_flags = LIGHT_IGNORE_OFFSET var/lit = FALSE var/fuel_added = 0 @@ -24,6 +27,18 @@ STOP_PROCESSING(SSobj, src) . = ..() +/obj/structure/fireplace/setDir(newdir) + . = ..() + set_light(l_dir = dir) + +/// We're offset back into the wall, account for that +/obj/structure/fireplace/get_light_offset() + var/list/hand_back = ..() + var/list/dir_offset = dir2offset(REVERSE_DIR(dir)) + hand_back[1] += dir_offset[1] * 0.5 + hand_back[2] += dir_offset[2] * 0.5 + return hand_back + /obj/structure/fireplace/proc/try_light(obj/item/O, mob/user) if(lit) to_chat(user, span_warning("It's already lit!")) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 0424b4d272268..eab29099dfd94 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -317,7 +317,7 @@ /obj/structure/flora/tree/stump name = "stump" desc = "This represents our promise to the crew, and the station itself, to cut down as many trees as possible." //running naked through the trees - icon = 'icons/obj/flora/pinetrees.dmi' + icon = 'icons/obj/fluff/flora/pinetrees.dmi' icon_state = "tree_stump" density = FALSE delete_on_harvest = TRUE @@ -332,7 +332,7 @@ qdel(src) /obj/structure/flora/tree/dead - icon = 'icons/obj/flora/deadtrees.dmi' + icon = 'icons/obj/fluff/flora/deadtrees.dmi' desc = "A dead tree. How it died, you know not." icon_state = "tree_1" harvest_amount_low = 2 @@ -357,10 +357,11 @@ /obj/structure/flora/tree/dead/style_random/Initialize(mapload) . = ..() icon_state = "tree_[rand(1, 6)]" + update_appearance() /obj/structure/flora/tree/jungle desc = "It's seriously hampering your view of the jungle." - icon = 'icons/obj/flora/jungletrees.dmi' + icon = 'icons/obj/fluff/flora/jungletrees.dmi' icon_state = "tree1" pixel_x = -48 pixel_y = -20 @@ -386,11 +387,12 @@ /obj/structure/flora/tree/jungle/style_random/Initialize(mapload) . = ..() icon_state = "tree[rand(1, 6)]" + update_appearance() /obj/structure/flora/tree/jungle/small pixel_y = 0 pixel_x = -32 - icon = 'icons/obj/flora/jungletreesmall.dmi' + icon = 'icons/obj/fluff/flora/jungletreesmall.dmi' icon_state = "tree1" /obj/structure/flora/tree/jungle/small/get_seethrough_map() @@ -414,6 +416,7 @@ /obj/structure/flora/tree/jungle/small/style_random/Initialize(mapload) . = ..() icon_state = "tree[rand(1, 6)]" + update_appearance() /************** * Pine Trees * @@ -422,7 +425,7 @@ /obj/structure/flora/tree/pine name = "pine tree" desc = "A coniferous pine tree." - icon = 'icons/obj/flora/pinetrees.dmi' + icon = 'icons/obj/fluff/flora/pinetrees.dmi' icon_state = "pine_1" /obj/structure/flora/tree/pine/get_seethrough_map() @@ -437,6 +440,7 @@ /obj/structure/flora/tree/pine/style_random/Initialize(mapload) . = ..() icon_state = "pine_[rand(1,3)]" + update_appearance() /obj/structure/flora/tree/pine/xmas name = "xmas tree" @@ -481,7 +485,7 @@ /obj/structure/festivus name = "festivus pole" desc = "During last year's Feats of Strength the Research Director was able to suplex this passing immobile rod into a planter." - icon = 'icons/obj/flora/pinetrees.dmi' + icon = 'icons/obj/fluff/flora/pinetrees.dmi' icon_state = "festivus_pole" /obj/structure/festivus/anchored @@ -513,6 +517,7 @@ /obj/structure/flora/tree/palm/style_random/Initialize(mapload) . = ..() icon_state = "palm[rand(1,2)]" + update_appearance() /********* * Grass * @@ -520,7 +525,7 @@ /obj/structure/flora/grass name = "grass" desc = "A patch of overgrown grass." - icon = 'icons/obj/flora/snowflora.dmi' + icon = 'icons/obj/fluff/flora/snowflora.dmi' gender = PLURAL //"this is grass" not "this is a grass" product_types = list(/obj/item/food/grown/grass = 10, /obj/item/seeds/grass = 1) harvest_with_hands = TRUE @@ -544,6 +549,7 @@ /obj/structure/flora/grass/brown/style_random/Initialize(mapload) . = ..() icon_state = "snowgrass[rand(1, 3)]bb" + update_appearance() /obj/structure/flora/grass/green icon_state = "snowgrass1gb" @@ -557,6 +563,7 @@ /obj/structure/flora/grass/green/style_random/Initialize(mapload) . = ..() icon_state = "snowgrass[rand(1, 3)]gb" + update_appearance() /obj/structure/flora/grass/both icon_state = "snowgrassall1" @@ -570,11 +577,12 @@ /obj/structure/flora/grass/both/style_random/Initialize(mapload) . = ..() icon_state = "snowgrassall[rand(1, 3)]" + update_appearance() /obj/structure/flora/grass/jungle name = "jungle grass" desc = "Thick alien flora." - icon = 'icons/obj/flora/jungleflora.dmi' + icon = 'icons/obj/fluff/flora/jungleflora.dmi' icon_state = "grassa1" /obj/structure/flora/grass/jungle/a/style_2 @@ -592,6 +600,7 @@ /obj/structure/flora/grass/jungle/a/style_random/Initialize(mapload) . = ..() icon_state = "grassa[rand(1, 5)]" + update_appearance() /obj/structure/flora/grass/jungle/b icon_state = "grassb1" @@ -611,6 +620,7 @@ /obj/structure/flora/grass/jungle/b/style_random/Initialize(mapload) . = ..() icon_state = "grassb[rand(1, 5)]" + update_appearance() /********** * Bushes * @@ -619,7 +629,7 @@ /obj/structure/flora/bush name = "bush" desc = "Some type of shrubbery. Known for causing considerable economic stress on designers." - icon = 'icons/obj/flora/ausflora.dmi' + icon = 'icons/obj/fluff/flora/ausflora.dmi' icon_state = "firstbush_1" flora_flags = FLORA_HERBAL @@ -635,6 +645,7 @@ /obj/structure/flora/bush/style_random/Initialize(mapload) . = ..() icon_state = "firstbush_[rand(1, 4)]" + update_appearance() /obj/structure/flora/bush/reed icon_state = "reedbush_1" @@ -651,6 +662,7 @@ /obj/structure/flora/bush/reed/style_random/Initialize(mapload) . = ..() icon_state = "reedbush_[rand(1, 4)]" + update_appearance() /obj/structure/flora/bush/leafy icon_state = "leafybush_1" @@ -664,6 +676,7 @@ /obj/structure/flora/bush/leavy/style_random/Initialize(mapload) . = ..() icon_state = "leafybush_[rand(1, 3)]" + update_appearance() /obj/structure/flora/bush/pale icon_state = "palebush_1" @@ -680,6 +693,7 @@ /obj/structure/flora/bush/pale/style_random/Initialize(mapload) . = ..() icon_state = "palebush_[rand(1, 4)]" + update_appearance() /obj/structure/flora/bush/stalky icon_state = "stalkybush_1" @@ -693,6 +707,7 @@ /obj/structure/flora/bush/stalky/style_random/Initialize(mapload) . = ..() icon_state = "stalkybush_[rand(1, 3)]" + update_appearance() /obj/structure/flora/bush/grassy icon_state = "grassybush_1" @@ -709,6 +724,7 @@ /obj/structure/flora/bush/grassy/style_random/Initialize(mapload) . = ..() icon_state = "grassybush_[rand(1, 4)]" + update_appearance() /obj/structure/flora/bush/sparsegrass icon_state = "sparsegrass_1" @@ -722,6 +738,7 @@ /obj/structure/flora/bush/sparsegrass/style_random/Initialize(mapload) . = ..() icon_state = "sparsegrass_[rand(1, 3)]" + update_appearance() /obj/structure/flora/bush/fullgrass icon_state = "fullgrass_1" @@ -735,6 +752,7 @@ /obj/structure/flora/bush/fullgrass/style_random/Initialize(mapload) . = ..() icon_state = "fullgrass_[rand(1, 3)]" + update_appearance() /obj/structure/flora/bush/ferny icon_state = "fernybush_1" @@ -748,6 +766,7 @@ /obj/structure/flora/bush/ferny/style_random/Initialize(mapload) . = ..() icon_state = "fernybush_[rand(1, 3)]" + update_appearance() /obj/structure/flora/bush/sunny icon_state = "sunnybush_1" @@ -761,6 +780,7 @@ /obj/structure/flora/bush/sunny/style_random/Initialize(mapload) . = ..() icon_state = "sunnybush_[rand(1, 3)]" + update_appearance() /obj/structure/flora/bush/generic icon_state = "genericbush_1" @@ -777,6 +797,7 @@ /obj/structure/flora/bush/generic/style_random/Initialize(mapload) . = ..() icon_state = "genericbush_[rand(1, 4)]" + update_appearance() /obj/structure/flora/bush/pointy icon_state = "pointybush_1" @@ -793,6 +814,7 @@ /obj/structure/flora/bush/pointy/style_random/Initialize(mapload) . = ..() icon_state = "pointybush_[rand(1, 4)]" + update_appearance() /obj/structure/flora/bush/lavendergrass icon_state = "lavendergrass_1" @@ -809,6 +831,7 @@ /obj/structure/flora/bush/lavendergrass/style_random/Initialize(mapload) . = ..() icon_state = "lavendergrass_[rand(1, 4)]" + update_appearance() /obj/structure/flora/bush/flowers_yw icon_state = "ywflowers_1" @@ -822,6 +845,7 @@ /obj/structure/flora/bush/flowers_yw/style_random/Initialize(mapload) . = ..() icon_state = "ywflowers_[rand(1, 3)]" + update_appearance() /obj/structure/flora/bush/flowers_br icon_state = "brflowers_1" @@ -835,6 +859,7 @@ /obj/structure/flora/bush/flowers_br/style_random/Initialize(mapload) . = ..() icon_state = "brflowers_[rand(1, 3)]" + update_appearance() /obj/structure/flora/bush/flowers_pp icon_state = "ppflowers_1" @@ -848,9 +873,10 @@ /obj/structure/flora/bush/flowers_pp/style_random/Initialize(mapload) . = ..() icon_state = "ppflowers_[rand(1, 3)]" + update_appearance() /obj/structure/flora/bush/snow - icon = 'icons/obj/flora/snowflora.dmi' + icon = 'icons/obj/fluff/flora/snowflora.dmi' icon_state = "snowbush1" /obj/structure/flora/bush/snow/style_2 @@ -871,10 +897,11 @@ /obj/structure/flora/bush/snow/style_random/Initialize(mapload) . = ..() icon_state = "snowbush[rand(1, 6)]" + update_appearance() /obj/structure/flora/bush/jungle desc = "A wild plant that is found in jungles." - icon = 'icons/obj/flora/jungleflora.dmi' + icon = 'icons/obj/fluff/flora/jungleflora.dmi' icon_state = "busha1" flora_flags = FLORA_HERBAL @@ -887,6 +914,7 @@ /obj/structure/flora/bush/jungle/a/style_random/Initialize(mapload) . = ..() icon_state = "busha[rand(1, 3)]" + update_appearance() /obj/structure/flora/bush/jungle/b icon_state = "bushb1" @@ -900,6 +928,7 @@ /obj/structure/flora/bush/jungle/b/style_random/Initialize(mapload) . = ..() icon_state = "bushb[rand(1, 3)]" + update_appearance() /obj/structure/flora/bush/jungle/c icon_state = "bushc1" @@ -913,9 +942,10 @@ /obj/structure/flora/bush/jungle/c/style_random/Initialize(mapload) . = ..() icon_state = "bushc[rand(1, 3)]" + update_appearance() /obj/structure/flora/bush/large - icon = 'icons/obj/flora/largejungleflora.dmi' + icon = 'icons/obj/fluff/flora/largejungleflora.dmi' icon_state = "bush1" pixel_x = -16 pixel_y = -12 @@ -931,12 +961,13 @@ /obj/structure/flora/bush/large/style_random/Initialize(mapload) . = ..() icon_state = "bush[rand(1, 3)]" + update_appearance() /obj/structure/flora/lunar_plant name = "lunar plant" desc= "This seemingly dead plant is actually quite alive, hibernating until sensing living things." icon_state = "lunar_plant" - icon = 'icons/obj/flora/xenoflora.dmi' + icon = 'icons/obj/fluff/flora/xenoflora.dmi' density = FALSE light_color = COLOR_WHITE light_range = 2 @@ -963,7 +994,7 @@ name = "large rock" icon_state = "basalt1" desc = "A volcanic rock. Pioneers used to ride these babies for miles." - icon = 'icons/obj/flora/rocks.dmi' + icon = 'icons/obj/fluff/flora/rocks.dmi' density = TRUE resistance_flags = FIRE_PROOF product_types = list(/obj/item/stack/ore/glass/basalt = 1) @@ -987,6 +1018,7 @@ /obj/structure/flora/rock/style_random/Initialize(mapload) . = ..() icon_state = "basalt[rand(1, 4)]" + update_appearance() /obj/structure/flora/rock/pile name = "rock pile" @@ -1006,10 +1038,11 @@ /obj/structure/flora/rock/pile/style_random/Initialize(mapload) . = ..() icon_state = "lavarocks[rand(1, 3)]" + update_appearance() /obj/structure/flora/rock/pile/jungle icon_state = "rock1" - icon = 'icons/obj/flora/jungleflora.dmi' + icon = 'icons/obj/fluff/flora/jungleflora.dmi' /obj/structure/flora/rock/pile/jungle/style_2 icon_state = "rock2" @@ -1026,11 +1059,12 @@ /obj/structure/flora/rock/pile/jungle/style_random/Initialize(mapload) . = ..() icon_state = "rock[rand(1, 5)]" + update_appearance() /obj/structure/flora/rock/pile/jungle/large name = "pile of large rocks" icon_state = "rocks1" - icon = 'icons/obj/flora/largejungleflora.dmi' + icon = 'icons/obj/fluff/flora/largejungleflora.dmi' pixel_x = -16 pixel_y = -16 harvest_amount_low = 9 @@ -1045,6 +1079,7 @@ /obj/structure/flora/rock/pile/jungle/large/style_random/Initialize(mapload) . = ..() icon_state = "rocks[rand(1, 3)]" + update_appearance() //TODO: Make new sprites for these. the pallete in the icons are grey, and a white color here still makes them grey /obj/structure/flora/rock/icy @@ -1061,6 +1096,7 @@ /obj/structure/flora/rock/icy/style_random/Initialize(mapload) . = ..() icon_state = "basalt[rand(1, 3)]" + update_appearance() /obj/structure/flora/rock/pile/icy name = "icy rocks" @@ -1076,4 +1112,5 @@ /obj/structure/flora/rock/pile/icy/style_random/Initialize(mapload) . = ..() icon_state = "lavarocks[rand(1, 3)]" + update_appearance() diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm index dd521f8e78df3..bf39a3f3cca86 100644 --- a/code/game/objects/structures/fluff.dm +++ b/code/game/objects/structures/fluff.dm @@ -6,7 +6,7 @@ /obj/structure/fluff name = "fluff structure" desc = "Fluffier than a sheep. This shouldn't exist." - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/fluff/general.dmi' icon_state = "minibar" anchored = TRUE density = FALSE @@ -31,7 +31,7 @@ /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 = 'icons/obj/mining_zones/spawners.dmi' icon_state = "terrarium_open" density = TRUE /** @@ -57,7 +57,7 @@ /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." - icon = 'icons/obj/lavaland/spawners.dmi' + icon = 'icons/obj/mining_zones/spawners.dmi' icon_state = "cryostasis_sleeper_open" /** @@ -86,7 +86,7 @@ /obj/structure/fluff/bus name = "bus" desc = "GO TO SCHOOL. READ A BOOK." - icon = 'icons/obj/bus.dmi' + icon = 'icons/obj/fluff/bus.dmi' icon_state = null density = TRUE anchored = TRUE @@ -125,7 +125,7 @@ /obj/structure/fluff/paper name = "dense lining of papers" desc = "A lining of paper scattered across the bottom of a wall." - icon = 'icons/obj/fluff.dmi' + icon = 'icons/obj/fluff/general.dmi' icon_state = "paper" deconstructible = FALSE @@ -140,7 +140,7 @@ /obj/structure/fluff/divine name = "Miracle" - icon = 'icons/obj/hand_of_god_structures.dmi' + icon = 'icons/obj/service/hand_of_god_structures.dmi' icon_state = "error" anchored = TRUE density = TRUE @@ -181,7 +181,7 @@ /obj/structure/fluff/fokoff_sign name = "crude sign" desc = "A crudely-made sign with the words 'fok of' written in some sort of red paint." - icon = 'icons/obj/fluff.dmi' + icon = 'icons/obj/fluff/general.dmi' icon_state = "fokof" /obj/structure/fluff/big_chain @@ -207,7 +207,7 @@ /obj/structure/fluff/beach_umbrella name = "beach umbrella" desc = "A fancy umbrella designed to keep the sun off beach-goers." - icon = 'icons/obj/fluff.dmi' + icon = 'icons/obj/fluff/general.dmi' icon_state = "brella" density = FALSE anchored = TRUE @@ -230,7 +230,7 @@ /obj/structure/fluff/clockwork name = "Clockwork Fluff" - icon = 'icons/obj/fluff.dmi' + icon = 'icons/obj/fluff/general.dmi' icon_state = "error" deconstructible = FALSE @@ -269,7 +269,7 @@ /obj/structure/fluff/tram_rail name = "tram rail" desc = "Great for trams, not so great for skating." - icon = 'icons/obj/tram_rails.dmi' + icon = 'icons/obj/fluff/tram_rails.dmi' icon_state = "rail" layer = TRAM_RAIL_LAYER plane = FLOOR_PLANE diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index ccaba88a73cff..33cab1d37ad35 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -400,14 +400,14 @@ /obj/structure/girder/cult name = "runed girder" desc = "Framework made of a strange and shockingly cold metal. It doesn't seem to have any bolts." - icon = 'icons/obj/cult/structures.dmi' + icon = 'icons/obj/antags/cult/structures.dmi' icon_state= "cultgirder" can_displace = FALSE /obj/structure/girder/cult/attackby(obj/item/W, mob/user, params) add_fingerprint(user) if(W.tool_behaviour == TOOL_WELDER) - if(!W.tool_start_check(user, amount=0)) + if(!W.tool_start_check(user, amount=1)) return balloon_alert(user, "slicing apart...") @@ -450,7 +450,7 @@ get_turf(src), RCD_MEMORY_WALL, ) if(RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 20, "cost" = 13) + return list("mode" = RCD_DECONSTRUCT, "delay" = 2 SECONDS, "cost" = 13) return FALSE /obj/structure/girder/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 87a85893d34b6..c1941e834d08b 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -60,21 +60,15 @@ /obj/structure/grille/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 20, "cost" = 5) + return list("mode" = RCD_DECONSTRUCT, "delay" = 2 SECONDS, "cost" = 5) if(RCD_WINDOWGRILLE) var/cost = 0 var/delay = 0 - if(the_rcd.window_type == /obj/structure/window) - cost = 6 - delay = 2 SECONDS - else if(the_rcd.window_type == /obj/structure/window/reinforced) - cost = 9 - delay = 2.5 SECONDS - else if(the_rcd.window_type == /obj/structure/window/fulltile) - cost = 12 + if(the_rcd.window_type == /obj/structure/window/fulltile) + cost = 8 delay = 3 SECONDS else if(the_rcd.window_type == /obj/structure/window/reinforced/fulltile) - cost = 15 + cost = 12 delay = 4 SECONDS if(!cost) return FALSE @@ -98,15 +92,13 @@ if(repair_grille()) balloon_alert(user, "grille rebuilt") - if(!clear_tile(user)) return FALSE var/obj/structure/window/window_path = the_rcd.window_type if(!ispath(window_path)) CRASH("Invalid window path type in RCD: [window_path]") - if(!valid_build_direction(T, user.dir, is_fulltile = initial(window_path.fulltile))) - balloon_alert(user, "window already here!") + if(!initial(window_path.fulltile)) //only fulltile windows can be built here return FALSE var/obj/structure/window/WD = new the_rcd.window_type(T, user.dir) WD.set_anchored(TRUE) @@ -327,6 +319,9 @@ var/turf/T = get_turf(src) if(T.overfloor_placed)//cant be a floor in the way! return FALSE + // Shocking hurts the grille (to weaken monkey powersinks) + if(prob(50)) + take_damage(1, BURN, FIRE, sound_effect = FALSE) var/obj/structure/cable/C = T.get_cable_node() if(C) if(electrocute_mob(user, C, src, 1, TRUE)) diff --git a/code/game/objects/structures/guillotine.dm b/code/game/objects/structures/guillotine.dm index 0f2bef5f78223..1c914734cbf5e 100644 --- a/code/game/objects/structures/guillotine.dm +++ b/code/game/objects/structures/guillotine.dm @@ -33,7 +33,7 @@ desc = "A large structure used to remove the heads of traitors and treasonists." icon = 'icons/obj/guillotine.dmi' icon_state = "guillotine_raised" - icon_preview = 'icons/obj/previews.dmi' + icon_preview = 'icons/obj/fluff/previews.dmi' icon_state_preview = "guilliotine" can_buckle = TRUE anchored = TRUE @@ -130,7 +130,7 @@ else blade_status = GUILLOTINE_BLADE_MOVING icon_state = "guillotine_drop" - addtimer(CALLBACK(src, PROC_REF(drop_blade)), GUILLOTINE_ANIMATION_LENGTH) + addtimer(CALLBACK(src, PROC_REF(drop_blade), user), GUILLOTINE_ANIMATION_LENGTH) /// Sets the guillotine blade in a raised position /obj/structure/guillotine/proc/raise_blade() diff --git a/code/game/objects/structures/guncase.dm b/code/game/objects/structures/guncase.dm index ed800fb42bc13..e4ca0419e3bdd 100644 --- a/code/game/objects/structures/guncase.dm +++ b/code/game/objects/structures/guncase.dm @@ -92,7 +92,6 @@ return if(!user.put_in_hands(weapon)) weapon.forceMove(get_turf(src)) - update_appearance() /** * check_menu: Checks if we are allowed to interact with a radial menu @@ -109,7 +108,8 @@ return FALSE return TRUE -/obj/structure/guncase/handle_atom_del(atom/A) +/obj/structure/guncase/Exited(atom/movable/gone, direction) + . = ..() update_appearance() /obj/structure/guncase/contents_explosion(severity, target) @@ -133,3 +133,8 @@ icon_state = "ecase" case_type = "egun" gun_category = /obj/item/gun/energy/e_gun + +/obj/structure/guncase/wt550 + name = "WT-550 gun locker" + desc = "A locker that holds WT-550 rifles." + case_type = "wt550" diff --git a/code/game/objects/structures/gym/punching_bag.dm b/code/game/objects/structures/gym/punching_bag.dm index bca46ce7f4f58..969e2888d634d 100644 --- a/code/game/objects/structures/gym/punching_bag.dm +++ b/code/game/objects/structures/gym/punching_bag.dm @@ -1,7 +1,7 @@ /obj/structure/punching_bag name = "punching bag" desc = "A punching bag. Can you get to speed level 4???" - icon = 'icons/obj/gym_equipment.dmi' + icon = 'icons/obj/fluff/gym_equipment.dmi' icon_state = "punchingbag" anchored = TRUE layer = ABOVE_MOB_LAYER @@ -24,15 +24,17 @@ lmb_text = "Punch", \ ) - var/static/list/tool_behaviors = list( - TOOL_CROWBAR = list( - SCREENTIP_CONTEXT_RMB = "Deconstruct", - ), + var/static/list/tool_behaviors + if(!tool_behaviors) + tool_behaviors = string_assoc_nested_list(list( + TOOL_CROWBAR = list( + SCREENTIP_CONTEXT_RMB = "Deconstruct", + ), - TOOL_WRENCH = list( - SCREENTIP_CONTEXT_RMB = "Anchor", - ), - ) + TOOL_WRENCH = list( + SCREENTIP_CONTEXT_RMB = "Anchor", + ), + )) AddElement(/datum/element/contextual_screentip_tools, tool_behaviors) /obj/structure/punching_bag/attack_hand(mob/living/user, list/modifiers) diff --git a/code/game/objects/structures/gym/weight_machine.dm b/code/game/objects/structures/gym/weight_machine.dm index c66a1aec1af64..44162d169b566 100644 --- a/code/game/objects/structures/gym/weight_machine.dm +++ b/code/game/objects/structures/gym/weight_machine.dm @@ -1,7 +1,7 @@ /obj/structure/weightmachine name = "chest press machine" desc = "Just looking at this thing makes you feel tired." - icon = 'icons/obj/gym_equipment.dmi' + icon = 'icons/obj/fluff/gym_equipment.dmi' icon_state = "stacklifter" base_icon_state = "stacklifter" can_buckle = TRUE @@ -31,6 +31,12 @@ "You feel robust!", "You feel indestructible!", ) + var/static/list/finished_silicon_message = list( + "You feel nothing!", + "No pain, no gain!", + "Chassis hardness rating... Unchanged.", + "You feel the exact same. Nothing.", + ) /obj/structure/weightmachine/Initialize(mapload) . = ..() @@ -38,20 +44,17 @@ weight_action = new(src) weight_action.weightpress = src - AddElement( \ - /datum/element/contextual_screentip_bare_hands, \ - lmb_text = "Work out", \ - ) - - var/static/list/tool_behaviors = list( - TOOL_CROWBAR = list( - SCREENTIP_CONTEXT_RMB = "Deconstruct", - ), - - TOOL_WRENCH = list( - SCREENTIP_CONTEXT_RMB = "Anchor", - ), - ) + var/static/list/tool_behaviors + if(!tool_behaviors) + tool_behaviors = string_assoc_nested_list(list( + TOOL_CROWBAR = list( + SCREENTIP_CONTEXT_RMB = "Deconstruct", + ), + + TOOL_WRENCH = list( + SCREENTIP_CONTEXT_RMB = "Anchor", + ), + )) AddElement(/datum/element/contextual_screentip_tools, tool_behaviors) /obj/structure/weightmachine/Destroy() @@ -91,7 +94,10 @@ START_PROCESSING(SSobj, src) if(do_after(user, 8 SECONDS, src) && user.has_gravity()) user.Stun(2 SECONDS) - user.balloon_alert(user, pick(finished_message)) + if(issilicon(user)) + user.balloon_alert(user, pick(finished_silicon_message)) + else + user.balloon_alert(user, pick(finished_message)) user.add_mood_event("exercise", /datum/mood_event/exercise) user.apply_status_effect(/datum/status_effect/exercised) end_workout() @@ -105,9 +111,9 @@ if(!has_buckled_mobs()) end_workout() return FALSE - var/image/workout_icon = new(icon, src, "[base_icon_state]-o", ABOVE_MOB_LAYER) - workout_icon.plane = GAME_PLANE_UPPER - flick_overlay_view(workout_icon, 8) + var/mutable_appearance/workout = mutable_appearance(icon, "[base_icon_state]-o", ABOVE_MOB_LAYER) + SET_PLANE_EXPLICIT(workout, GAME_PLANE_UPPER, src) + flick_overlay_view(workout, 0.8 SECONDS) flick("[base_icon_state]-u", src) var/mob/living/user = buckled_mobs[1] animate(user, pixel_y = pixel_shift_y, time = 4) @@ -119,7 +125,7 @@ * Weight lifter subtype */ /obj/structure/weightmachine/weightlifter - name = "inline bench press" + name = "incline bench press" icon_state = "benchpress" base_icon_state = "benchpress" diff --git a/code/game/objects/structures/gym/weight_machine_action.dm b/code/game/objects/structures/gym/weight_machine_action.dm index 16bb4f5d476a3..6023a1b194700 100644 --- a/code/game/objects/structures/gym/weight_machine_action.dm +++ b/code/game/objects/structures/gym/weight_machine_action.dm @@ -5,7 +5,7 @@ /datum/action/push_weights name = "Work out" desc = "Start working out" - button_icon = 'icons/obj/gym_equipment.dmi' + button_icon = 'icons/obj/fluff/gym_equipment.dmi' button_icon_state = "stacklifter" ///Reference to the weightpress we are created inside of. var/obj/structure/weightmachine/weightpress diff --git a/code/game/objects/structures/headpike.dm b/code/game/objects/structures/headpike.dm index ddafc91854c33..7731af947f0e7 100644 --- a/code/game/objects/structures/headpike.dm +++ b/code/game/objects/structures/headpike.dm @@ -53,24 +53,26 @@ MA.pixel_x = pixel_x . += victim -/obj/structure/headpike/handle_atom_del(atom/A) - if(A == victim) +/obj/structure/headpike/Exited(atom/movable/gone, direction) + . = ..() + if(gone != victim && gone != spear) + return + if(gone == victim) victim = null - if(A == spear) + if(gone == spear) spear = null if(!QDELETED(src)) deconstruct(TRUE) - return ..() /obj/structure/headpike/deconstruct(disassembled) - if(victim) //Make sure the head always comes off - victim.forceMove(drop_location()) - victim = null + var/obj/item/bodypart/head/our_head = victim + var/obj/item/spear/our_spear = spear + victim = null + spear = null + our_head?.forceMove(drop_location()) //Make sure the head always comes off if(!disassembled) return ..() - if(spear) - spear.forceMove(drop_location()) - spear = null + our_spear?.forceMove(drop_location()) return ..() /obj/structure/headpike/attack_hand(mob/user, list/modifiers) diff --git a/code/game/objects/structures/hivebot.dm b/code/game/objects/structures/hivebot.dm index 5859f7b3aac36..ba371f8d65836 100644 --- a/code/game/objects/structures/hivebot.dm +++ b/code/game/objects/structures/hivebot.dm @@ -24,11 +24,11 @@ bot_amt-- switch(bot_type) if("norm") - new /mob/living/simple_animal/hostile/hivebot(get_turf(src)) + new /mob/living/basic/hivebot(get_turf(src)) if("range") - new /mob/living/simple_animal/hostile/hivebot/range(get_turf(src)) + new /mob/living/basic/hivebot/range(get_turf(src)) if("rapid") - new /mob/living/simple_animal/hostile/hivebot/rapid(get_turf(src)) + new /mob/living/basic/hivebot/rapid(get_turf(src)) sleep(10 SECONDS) visible_message(span_boldannounce("[src] warps out!")) 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 11b9ddb7dc518..b3d51ceffa167 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -76,7 +76,7 @@ var/mob/living/carbon/C = mover if(C.stat) // Lets not prevent dragging unconscious/dead people. return TRUE - if(allow_walk && C.m_intent == MOVE_INTENT_WALK) + if(allow_walk && C.move_intent == MOVE_INTENT_WALK) return TRUE /obj/structure/holosign/barrier/wetsign @@ -92,7 +92,7 @@ var/mob/living/carbon/C = mover if(C.stat) // Lets not prevent dragging unconscious/dead people. return TRUE - if(allow_walk && C.m_intent != MOVE_INTENT_WALK) + if(allow_walk && C.move_intent != MOVE_INTENT_WALK) return FALSE /obj/structure/holosign/barrier/engineering @@ -123,7 +123,8 @@ /obj/structure/holosign/barrier/atmos/Initialize(mapload) . = ..() air_update_turf(TRUE, TRUE) - AddElement(/datum/element/trait_loc, TRAIT_FIREDOOR_STOP) + var/static/list/turf_traits = list(TRAIT_FIREDOOR_STOP) + AddElement(/datum/element/give_turf_traits, turf_traits) /obj/structure/holosign/barrier/atmos/block_superconductivity() //Didn't used to do this, but it's "normal", and will help ease heat flow transitions with the players. return TRUE diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm index f5d6115f86c67..2a90270ef73a6 100644 --- a/code/game/objects/structures/icemoon/cave_entrance.dm +++ b/code/game/objects/structures/icemoon/cave_entrance.dm @@ -20,6 +20,9 @@ GLOBAL_LIST_INIT(ore_probability, list( mob_types = list(/mob/living/simple_animal/hostile/asteroid/wolf) move_resist = INFINITY anchored = TRUE + scanner_taggable = TRUE + mob_gps_id = "WF" // wolf + spawner_gps_id = "Animal Den" /obj/structure/spawner/ice_moon/Initialize(mapload) . = ..() @@ -65,6 +68,7 @@ GLOBAL_LIST_INIT(ore_probability, list( max_mobs = 1 spawn_time = 60 SECONDS mob_types = list(/mob/living/simple_animal/hostile/asteroid/polarbear) + mob_gps_id = "BR" // bear /obj/structure/spawner/ice_moon/polarbear/clear_rock() for(var/turf/potential in RANGE_TURFS(1, src)) @@ -79,6 +83,8 @@ GLOBAL_LIST_INIT(ore_probability, list( mob_types = list(/mob/living/simple_animal/hostile/asteroid/ice_demon) light_range = 1 light_color = COLOR_SOFT_RED + mob_gps_id = "WT|B" // watcher | bluespace + spawner_gps_id = "Netheric Distortion" /obj/structure/spawner/ice_moon/demonic_portal/Initialize(mapload) . = ..() @@ -99,10 +105,12 @@ GLOBAL_LIST_INIT(ore_probability, list( return /obj/structure/spawner/ice_moon/demonic_portal/ice_whelp - mob_types = list(/mob/living/simple_animal/hostile/asteroid/ice_whelp) + mob_types = list(/mob/living/basic/mining/ice_whelp) + mob_gps_id = "ID|W" // ice drake | whelp /obj/structure/spawner/ice_moon/demonic_portal/snowlegion - mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/portal) + mob_types = list(/mob/living/basic/mining/legion/snow/spawner_made) + mob_gps_id = "LG|S" // legion | snow /obj/effect/collapsing_demonic_portal name = "collapsing demonic portal" @@ -187,7 +195,7 @@ GLOBAL_LIST_INIT(ore_probability, list( if(24) new /obj/structure/elite_tumor(loc) if(25) - new /mob/living/simple_animal/hostile/retaliate/clown/clownhulk(loc) + new /mob/living/basic/clown/clownhulk(loc) if(26) new /obj/item/clothing/shoes/winterboots/ice_boots(loc) if(27) diff --git a/code/game/objects/structures/janitor.dm b/code/game/objects/structures/janitor.dm index 6a385e5f70e95..7721a6d39ac9c 100644 --- a/code/game/objects/structures/janitor.dm +++ b/code/game/objects/structures/janitor.dm @@ -3,7 +3,7 @@ /obj/structure/mop_bucket name = "mop bucket" desc = "Fill it with water, but don't forget a mop!" - icon = 'icons/obj/janitor.dmi' + icon = 'icons/obj/service/janitor.dmi' icon_state = "mopbucket" density = TRUE var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite @@ -38,13 +38,13 @@ /obj/structure/mop_bucket/attackby_secondary(obj/item/weapon, mob/user, params) if(istype(weapon, /obj/item/mop)) if(weapon.reagents.total_volume >= weapon.reagents.maximum_volume) - balloon_alert(user, "mop is already soaked!") + balloon_alert(user, "already soaked!") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN if(!CART_HAS_MINIMUM_REAGENT_VOLUME) - balloon_alert(user, "mop bucket is empty!") + balloon_alert(user, "empty!") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - reagents.trans_to(weapon, weapon.reagents.maximum_volume, transfered_by = user) - balloon_alert(user, "wet mop") + reagents.trans_to(weapon, weapon.reagents.maximum_volume, transferred_by = user) + balloon_alert(user, "doused mop") playsound(src, 'sound/effects/slosh.ogg', 25, vary = TRUE) if(istype(weapon, /obj/item/reagent_containers) || istype(weapon, /obj/item/mop)) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 989d6f1693a51..6cdc96b848deb 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -2,7 +2,7 @@ /obj/structure/kitchenspike_frame name = "meatspike frame" - icon = 'icons/obj/kitchen.dmi' + icon = 'icons/obj/service/kitchen.dmi' icon_state = "spikeframe" desc = "The frame of a meat spike." density = TRUE @@ -66,7 +66,7 @@ /obj/structure/kitchenspike name = "meat spike" - icon = 'icons/obj/kitchen.dmi' + icon = 'icons/obj/service/kitchen.dmi' icon_state = "spike" desc = "A spike for collecting meat from animals." density = TRUE diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm index 391280745b26d..9b7b5590018e4 100644 --- a/code/game/objects/structures/ladders.dm +++ b/code/game/objects/structures/ladders.dm @@ -50,14 +50,14 @@ var/obj/structure/ladder/L if (!down) - L = locate() in SSmapping.get_turf_below(T) + L = locate() in GET_TURF_BELOW(T) if (L) if(crafted == L.crafted) down = L L.up = src // Don't waste effort looping the other way L.update_appearance() if (!up) - L = locate() in SSmapping.get_turf_above(T) + L = locate() in GET_TURF_ABOVE(T) if (L) if(crafted == L.crafted) up = L diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 82fba11d0e2ff..9b460cc125cf7 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -16,7 +16,13 @@ canSmoothWith = SMOOTH_GROUP_LATTICE + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_OPEN_FLOOR var/number_of_mats = 1 var/build_material = /obj/item/stack/rods + var/list/give_turf_traits = list(TRAIT_CHASM_STOPPED, TRAIT_HYPERSPACE_STOPPED) +/obj/structure/lattice/Initialize(mapload) + . = ..() + if(length(give_turf_traits)) + give_turf_traits = string_list(give_turf_traits) + AddElement(/datum/element/give_turf_traits, give_turf_traits) /datum/armor/structure_lattice melee = 50 @@ -58,15 +64,15 @@ /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) + return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 1) if(the_rcd.mode == RCD_CATWALK) - return list("mode" = RCD_CATWALK, "delay" = 0, "cost" = 1) + return list("mode" = RCD_CATWALK, "delay" = 0, "cost" = 2) /obj/structure/lattice/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) if(passed_mode == RCD_FLOORWALL) to_chat(user, span_notice("You build a floor.")) var/turf/T = src.loc - if(isspaceturf(T)) + if(isgroundlessturf(T)) T.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) qdel(src) return TRUE @@ -93,6 +99,11 @@ 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 + give_turf_traits = list(TRAIT_TURF_IGNORE_SLOWDOWN, TRAIT_LAVA_STOPPED, TRAIT_CHASM_STOPPED, TRAIT_IMMERSE_STOPPED, TRAIT_HYPERSPACE_STOPPED) + +/obj/structure/lattice/catwalk/Initialize(mapload) + . = ..() + AddElement(/datum/element/footstep_override, footstep = FOOTSTEP_CATWALK) /obj/structure/lattice/catwalk/deconstruction_hints(mob/user) return span_notice("The supporting rods look like they could be cut.") @@ -111,7 +122,7 @@ /obj/structure/lattice/catwalk/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) if(the_rcd.mode == RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 10, "cost" = 5) + return list("mode" = RCD_DECONSTRUCT, "delay" = 1 SECONDS, "cost" = 5) return FALSE /obj/structure/lattice/catwalk/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) @@ -143,6 +154,7 @@ canSmoothWith = SMOOTH_GROUP_LATTICE obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP resistance_flags = FIRE_PROOF | LAVA_PROOF + give_turf_traits = list(TRAIT_LAVA_STOPPED, TRAIT_CHASM_STOPPED, TRAIT_IMMERSE_STOPPED, TRAIT_HYPERSPACE_STOPPED) /obj/structure/lattice/lava/deconstruction_hints(mob/user) return span_notice("The rods look like they could be cut, but the heat treatment will shatter off. There's space for a tile.") diff --git a/code/game/objects/structures/lavaland/geyser.dm b/code/game/objects/structures/lavaland/geyser.dm index dcfc86c03108b..ed6602cb5137a 100644 --- a/code/game/objects/structures/lavaland/geyser.dm +++ b/code/game/objects/structures/lavaland/geyser.dm @@ -4,7 +4,7 @@ ///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 = 'icons/obj/mining_zones/terrain.dmi' icon_state = "geyser" anchored = TRUE @@ -39,7 +39,7 @@ if(erupting_state) icon_state = erupting_state else - var/mutable_appearance/I = mutable_appearance('icons/obj/lavaland/terrain.dmi', "[icon_state]_soup") + var/mutable_appearance/I = mutable_appearance('icons/obj/mining_zones/terrain.dmi', "[icon_state]_soup") I.color = mix_color_from_reagents(reagents.reagent_list) add_overlay(I) diff --git a/code/game/objects/structures/lavaland/necropolis_tendril.dm b/code/game/objects/structures/lavaland/necropolis_tendril.dm index ee767f4670efe..6d6b2e6af37af 100644 --- a/code/game/objects/structures/lavaland/necropolis_tendril.dm +++ b/code/game/objects/structures/lavaland/necropolis_tendril.dm @@ -9,24 +9,27 @@ faction = list(FACTION_MINING) max_mobs = 3 max_integrity = 250 - mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril) + mob_types = list(/mob/living/basic/mining/watcher) 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 - + scanner_taggable = TRUE + mob_gps_id = "WT" + spawner_gps_id = "Necropolis Tendril" /obj/structure/spawner/lavaland/goliath - mob_types = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril) + mob_types = list(/mob/living/basic/mining/goliath) + mob_gps_id = "GL" /obj/structure/spawner/lavaland/legion - mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril) + mob_types = list(/mob/living/basic/mining/legion/spawner_made) + mob_gps_id = "LG" /obj/structure/spawner/lavaland/icewatcher - mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing) + mob_types = list(/mob/living/basic/mining/watcher/icewing) + mob_gps_id = "WT|I" // icewing GLOBAL_LIST_INIT(tendrils, list()) /obj/structure/spawner/lavaland/Initialize(mapload) @@ -63,7 +66,6 @@ GLOBAL_LIST_INIT(tendrils, list()) 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 diff --git a/code/game/objects/structures/loom.dm b/code/game/objects/structures/loom.dm index e08e5899ccc14..d01c17b0a6d69 100644 --- a/code/game/objects/structures/loom.dm +++ b/code/game/objects/structures/loom.dm @@ -2,7 +2,7 @@ /obj/structure/loom name = "loom" desc = "A simple device used to weave cloth and other thread-based fabrics together into usable material." - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "loom" density = TRUE anchored = TRUE diff --git a/code/game/objects/structures/mannequin.dm b/code/game/objects/structures/mannequin.dm index 5e90fa6105f94..ad9588d5aa8a9 100644 --- a/code/game/objects/structures/mannequin.dm +++ b/code/game/objects/structures/mannequin.dm @@ -6,7 +6,7 @@ /obj/structure/mannequin name = "mannequin" desc = "Oh, so this is a dress-up game now." - icon = 'icons/mob/species/human/mannequin.dmi' + icon = 'icons/mob/human/mannequin.dmi' icon_state = "mannequin_wood_male" density = TRUE resistance_flags = FLAMMABLE @@ -191,6 +191,7 @@ desc = "Not to knock over." material = MANNEQUIN_SKELETON anchored = TRUE + obj_flags = UNIQUE_RENAME starting_items = list( /obj/item/clothing/glasses/eyepatch, /obj/item/clothing/suit/costume/hawaiian, diff --git a/code/game/objects/structures/memorial.dm b/code/game/objects/structures/memorial.dm index bd28aaacd2060..dcb350bcc4c87 100644 --- a/code/game/objects/structures/memorial.dm +++ b/code/game/objects/structures/memorial.dm @@ -14,7 +14,7 @@ This memorial has been designed for him and any future coders to perish. /obj/structure/fluff/arc name = "Tomb of the Unknown Employee" desc = "Here rests an unknown employee\nUnknown by name or rank\nWhose acts will not be forgotten" - icon = 'icons/obj/tomb.dmi' + icon = 'icons/obj/fluff/tomb.dmi' icon_state = "memorial" density = TRUE anchored = TRUE diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 194a93e9c7be5..7c143df3ca55b 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -1,58 +1,225 @@ + +// Normal Mirrors + +#define CHANGE_HAIR "Change Hair" +#define CHANGE_BEARD "Change Beard" + +// Magic Mirrors! + +#define CHANGE_RACE "Change Race" +#define CHANGE_SEX "Change Sex" +#define CHANGE_NAME "Change Name" +#define CHANGE_EYES "Change Eyes" + +#define INERT_MIRROR_OPTIONS list(CHANGE_HAIR, CHANGE_BEARD) +#define PRIDE_MIRROR_OPTIONS list(CHANGE_HAIR, CHANGE_BEARD, CHANGE_RACE, CHANGE_SEX, CHANGE_EYES) +#define MAGIC_MIRROR_OPTIONS list(CHANGE_HAIR, CHANGE_BEARD, CHANGE_RACE, CHANGE_SEX, CHANGE_EYES, CHANGE_NAME) + /obj/structure/mirror name = "mirror" desc = "Mirror mirror on the wall, who's the most robust of them all?" icon = 'icons/obj/watercloset.dmi' icon_state = "mirror" + movement_type = FLOATING density = FALSE anchored = TRUE - max_integrity = 200 integrity_failure = 0.5 + max_integrity = 200 + var/list/mirror_options = INERT_MIRROR_OPTIONS + var/magical_mirror = FALSE + + ///Flags this race must have to be selectable with this type of mirror. + var/race_flags = MIRROR_MAGIC + ///List of all Races that can be chosen, decided by its Initialize. + var/list/selectable_races = list() + +/obj/structure/mirror/Initialize(mapload) + . = ..() + update_choices() + +/obj/structure/mirror/Destroy() + mirror_options = null + selectable_races = null + return ..() + +/obj/structure/mirror/proc/update_choices() + for(var/i in mirror_options) + mirror_options[i] = icon('icons/hud/radial.dmi', i) + +/obj/structure/mirror/Initialize(mapload) + . = ..() + var/static/list/reflection_filter = alpha_mask_filter(icon = icon('icons/obj/watercloset.dmi', "mirror_mask")) + var/static/matrix/reflection_matrix = matrix(0.75, 0, 0, 0, 0.75, 0) + var/datum/callback/can_reflect = CALLBACK(src, PROC_REF(can_reflect)) + var/list/update_signals = list(COMSIG_ATOM_BREAK) + AddComponent(/datum/component/reflection, reflection_filter = reflection_filter, reflection_matrix = reflection_matrix, can_reflect = can_reflect, update_signals = update_signals) + +/obj/structure/mirror/proc/can_reflect(atom/movable/target) + ///I'm doing it this way too, because the signal is sent before the broken variable is set to TRUE. + if(atom_integrity <= integrity_failure * max_integrity) + return FALSE + if(broken || !isliving(target) || HAS_TRAIT(target, TRAIT_NO_MIRROR_REFLECTION)) + return FALSE + return TRUE MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28) /obj/structure/mirror/Initialize(mapload) . = ..() - if(icon_state == "mirror_broke" && !broken) - atom_break(null, mapload) + find_and_hang_on_wall() + +/obj/structure/mirror/broken + icon_state = "mirror_broke" -/obj/structure/mirror/attack_hand(mob/user, list/modifiers) +/obj/structure/mirror/broken/Initialize(mapload) . = ..() - if(.) - return TRUE - if(broken || !Adjacent(user)) - return TRUE + atom_break(null, mapload) - if(!ishuman(user)) +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror/broken, 28) + +/obj/structure/mirror/attack_hand(mob/living/carbon/human/user) + . = ..() + + if(. || !ishuman(user) || broken) return TRUE - var/mob/living/carbon/human/hairdresser = user - //handle facial hair (if necessary) - if(hairdresser.gender != FEMALE) - var/new_style = tgui_input_list(user, "Select a facial hairstyle", "Grooming", GLOB.facial_hairstyles_list) + if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH) && !magical_mirror) + return TRUE //no tele-grooming (if nonmagical) + + return display_radial_menu(user) + +/obj/structure/mirror/proc/display_radial_menu(mob/living/carbon/human/user) + var/pick = show_radial_menu(user, src, mirror_options, user, radius = 36, require_near = TRUE) + if(!pick) + return TRUE //get out + + switch(pick) + if(CHANGE_HAIR) + change_hair(user) + if(CHANGE_BEARD) + change_beard(user) + if(CHANGE_RACE) + change_race(user) + if(CHANGE_SEX) // sex: yes + change_sex(user) + if(CHANGE_NAME) + change_name(user) + if(CHANGE_EYES) + change_eyes(user) + + return display_radial_menu(user) + +/obj/structure/mirror/proc/change_beard(mob/living/carbon/human/beard_dresser) + if(beard_dresser.physique != FEMALE && !magical_mirror) + var/new_style = tgui_input_list(beard_dresser, "Select a facial hairstyle", "Grooming", GLOB.facial_hairstyles_list) if(isnull(new_style)) return TRUE - if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return TRUE //no tele-grooming - if(HAS_TRAIT(hairdresser, TRAIT_SHAVED)) - to_chat(hairdresser, span_notice("If only growing back facial hair were that easy for you...")) - hairdresser.facial_hairstyle = new_style + if(HAS_TRAIT(beard_dresser, TRAIT_SHAVED)) + to_chat(beard_dresser, span_notice("If only growing back facial hair were that easy for you... The reminder makes you feel terrible.")) + beard_dresser.add_mood_event("bald_hair_day", /datum/mood_event/bald_reminder) + return TRUE + beard_dresser.set_facial_hairstyle(new_style, update = TRUE) else - hairdresser.facial_hairstyle = "Shaved" + if(beard_dresser.facial_hairstyle == "Shaved") + to_chat(beard_dresser, span_notice("You realize you don't have any facial hair.")) + return + beard_dresser.set_facial_hairstyle("Shaved", update = TRUE) - //handle normal hair - var/new_style = tgui_input_list(user, "Select a hairstyle", "Grooming", GLOB.hairstyles_list) +/obj/structure/mirror/proc/change_hair(mob/living/carbon/human/hairdresser) + var/new_style = tgui_input_list(hairdresser, "Select a hairstyle", "Grooming", GLOB.hairstyles_list) if(isnull(new_style)) return TRUE - if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - 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...")) + to_chat(hairdresser, span_notice("If only growing back hair were that easy for you... The reminder makes you feel terrible.")) + hairdresser.add_mood_event("bald_hair_day", /datum/mood_event/bald_reminder) + return TRUE + + hairdresser.set_hairstyle(new_style, update = TRUE) + +/obj/structure/mirror/proc/change_name(mob/living/carbon/human/user) + var/newname = sanitize_name(tgui_input_text(user, "Who are we again?", "Name change", user.name, MAX_NAME_LEN), allow_numbers = TRUE) //It's magic so whatever. + if(!newname) + return TRUE + user.real_name = newname + user.name = newname + if(user.dna) + user.dna.real_name = newname + if(user.mind) + user.mind.name = newname + +// Erm ackshually the proper term is species. Get it right?? +/obj/structure/mirror/proc/change_race(mob/living/carbon/human/race_changer) + var/racechoice = tgui_input_list(race_changer, "What are we again?", "Race change", selectable_races) + if(isnull(racechoice)) + return TRUE + if(!selectable_races[racechoice]) + return TRUE - hairdresser.hairstyle = new_style + var/datum/species/newrace = selectable_races[racechoice] + race_changer.set_species(newrace, icon_update = FALSE) + if(HAS_TRAIT(race_changer, TRAIT_USES_SKINTONES)) + var/new_s_tone = tgui_input_list(race_changer, "Choose your skin tone", "Race change", GLOB.skin_tones) + if(new_s_tone) + race_changer.skin_tone = new_s_tone + race_changer.dna.update_ui_block(DNA_SKIN_TONE_BLOCK) + else if(HAS_TRAIT(race_changer, TRAIT_MUTANT_COLORS) && !HAS_TRAIT(race_changer, TRAIT_FIXED_MUTANT_COLORS)) + var/new_mutantcolor = input(race_changer, "Choose your skin color:", "Race change", race_changer.dna.features["mcolor"]) as color|null + if(new_mutantcolor) + var/temp_hsv = RGBtoHSV(new_mutantcolor) + + if(ReadHSV(temp_hsv)[3] >= ReadHSV("#7F7F7F")[3]) // mutantcolors must be bright + race_changer.dna.features["mcolor"] = sanitize_hexcolor(new_mutantcolor) + race_changer.dna.update_uf_block(DNA_MUTANT_COLOR_BLOCK) - hairdresser.update_body_parts() + else + to_chat(race_changer, span_notice("Invalid color. Your color is not bright enough.")) + return TRUE -/obj/structure/mirror/examine_status(mob/user) + race_changer.update_body(is_creating = TRUE) + race_changer.update_mutations_overlay() // no hulk lizard + +// possible Genders: MALE, FEMALE, PLURAL, NEUTER +// possible Physique: MALE, FEMALE +// saved you a click (many) +/obj/structure/mirror/proc/change_sex(mob/living/carbon/human/sexy) + + var/chosen_sex = tgui_input_list(sexy, "Become a..", "Confirmation", list("Warlock", "Witch", "Wizard", "Itzard")) // YOU try coming up with the 'it' version of wizard + + switch(chosen_sex) + if("Warlock") + sexy.gender = MALE + to_chat(sexy, span_notice("Man, you feel like a man!")) + if("Witch") + sexy.gender = FEMALE + to_chat(sexy, span_notice("Man, you feel like a woman!")) + if("Wizard") + sexy.gender = PLURAL + to_chat(sexy, span_notice("Woah dude, you feel like a dude!")) + if("Itzard") + sexy.gender = NEUTER + to_chat(sexy, span_notice("Woah dude, you feel like something else!")) + + var/chosen_physique = tgui_input_list(sexy, "Alter your physique as well?", "Confirmation", list("Warlock Physique", "Witch Physique", "Wizards Don't Need Gender")) + + if(chosen_physique && chosen_physique != "Wizards Don't Need Gender") + sexy.physique = (chosen_physique == "Warlock Physique") ? MALE : FEMALE + + sexy.dna.update_ui_block(DNA_GENDER_BLOCK) + sexy.update_body() + sexy.update_mutations_overlay() //(hulk male/female) + +/obj/structure/mirror/proc/change_eyes(mob/living/carbon/human/user) + var/new_eye_color = input(user, "Choose your eye color", "Eye Color", user.eye_color_left) as color|null + if(isnull(new_eye_color)) + return TRUE + user.eye_color_left = sanitize_hexcolor(new_eye_color) + user.eye_color_right = sanitize_hexcolor(new_eye_color) + user.dna.update_ui_block(DNA_EYE_COLOR_LEFT_BLOCK) + user.dna.update_ui_block(DNA_EYE_COLOR_RIGHT_BLOCK) + user.update_body() + to_chat(user, span_notice("You gaze at your new eyes with your new eyes. Perfect!")) + +/obj/structure/mirror/examine_status(mob/living/carbon/human/user) if(broken) return list()// no message spam return ..() @@ -103,7 +270,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28) if(!broken) return TRUE - if(!I.tool_start_check(user, amount=0)) + if(!I.tool_start_check(user, amount=1)) return TRUE balloon_alert(user, "repairing...") @@ -138,11 +305,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28) name = "magic mirror" desc = "Turn and face the strange... face." icon_state = "magic_mirror" - - ///Flags this race must have to be selectable with this type of mirror. - var/race_flags = MIRROR_MAGIC - ///List of all Races that can be chosen, decided by its Initialize. - var/list/selectable_races = list() + mirror_options = MAGIC_MIRROR_OPTIONS + magical_mirror = TRUE /obj/structure/mirror/magic/Initialize(mapload) . = ..() @@ -154,128 +318,23 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28) selectable_races[initial(species_type.name)] = species_type selectable_races = sort_list(selectable_races) -/obj/structure/mirror/magic/attack_hand(mob/user, list/modifiers) - . = ..() - if(.) - return TRUE - if(!ishuman(user)) - return TRUE - - var/mob/living/carbon/human/amazed_human = user - - var/choice = tgui_input_list(user, "Something to change?", "Magical Grooming", list("name", "race", "gender", "hair", "eyes")) - if(isnull(choice)) - return TRUE - - if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return TRUE - - switch(choice) - if("name") - 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.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return TRUE - amazed_human.real_name = newname - amazed_human.name = newname - if(amazed_human.dna) - amazed_human.dna.real_name = newname - if(amazed_human.mind) - amazed_human.mind.name = newname - - if("race") - var/racechoice = tgui_input_list(amazed_human, "What are we again?", "Race change", selectable_races) - if(isnull(racechoice)) - return TRUE - if(!selectable_races[racechoice]) - return TRUE - if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return TRUE - - var/datum/species/newrace = selectable_races[racechoice] - amazed_human.set_species(newrace, icon_update = FALSE) - - if(amazed_human.dna.species.use_skintones) - var/new_s_tone = tgui_input_list(user, "Choose your skin tone", "Race change", GLOB.skin_tones) - if(new_s_tone) - amazed_human.skin_tone = new_s_tone - amazed_human.dna.update_ui_block(DNA_SKIN_TONE_BLOCK) - - if(MUTCOLORS in amazed_human.dna.species.species_traits) - var/new_mutantcolor = input(user, "Choose your skin color:", "Race change", amazed_human.dna.features["mcolor"]) as color|null - if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return TRUE - if(new_mutantcolor) - var/temp_hsv = RGBtoHSV(new_mutantcolor) - - if(ReadHSV(temp_hsv)[3] >= ReadHSV("#7F7F7F")[3]) // mutantcolors must be bright - amazed_human.dna.features["mcolor"] = sanitize_hexcolor(new_mutantcolor) - amazed_human.dna.update_uf_block(DNA_MUTANT_COLOR_BLOCK) - - else - to_chat(amazed_human, span_notice("Invalid color. Your color is not bright enough.")) - return TRUE - - amazed_human.update_body(is_creating = TRUE) - amazed_human.update_mutations_overlay() // no hulk lizard +//Magic mirrors can change hair color as well +/obj/structure/mirror/magic/mirror/change_hair(mob/living/carbon/human/user) + var/hairchoice = tgui_alert(user, "Hairstyle or hair color?", "Change Hair", list("Style", "Color")) + if(hairchoice == "Style") //So you just want to use a mirror then? + return ..() - if("gender") - if(!(amazed_human.gender in list("male", "female"))) //blame the patriarchy - return TRUE - if(amazed_human.gender == "male") - if(tgui_alert(amazed_human, "Become a Witch?", "Confirmation", list("Yes", "No")) == "Yes") - if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return TRUE - amazed_human.gender = FEMALE - amazed_human.physique = FEMALE - to_chat(amazed_human, span_notice("Man, you feel like a woman!")) - else - return TRUE + var/new_hair_color = input(user, "Choose your hair color", "Hair Color", user.hair_color) as color|null - else - if(tgui_alert(amazed_human, "Become a Warlock?", "Confirmation", list("Yes", "No")) == "Yes") - if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return TRUE - amazed_human.gender = MALE - amazed_human.physique = MALE - to_chat(amazed_human, span_notice("Whoa man, you feel like a man!")) - else - return TRUE - amazed_human.dna.update_ui_block(DNA_GENDER_BLOCK) - amazed_human.update_body() - amazed_human.update_mutations_overlay() //(hulk male/female) - - if("hair") - var/hairchoice = tgui_alert(amazed_human, "Hairstyle or hair color?", "Change Hair", list("Style", "Color")) - if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - 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.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return TRUE - if(new_hair_color) - amazed_human.hair_color = sanitize_hexcolor(new_hair_color) - amazed_human.dna.update_ui_block(DNA_HAIR_COLOR_BLOCK) - if(amazed_human.gender == "male") - var/new_face_color = input(amazed_human, "Choose your facial hair color", "Hair Color", amazed_human.facial_hair_color) as color|null - if(new_face_color) - amazed_human.facial_hair_color = sanitize_hexcolor(new_face_color) - amazed_human.dna.update_ui_block(DNA_FACIAL_HAIR_COLOR_BLOCK) - amazed_human.update_body_parts() - - 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.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return TRUE - if(new_eye_color) - amazed_human.eye_color_left = sanitize_hexcolor(new_eye_color) - amazed_human.eye_color_right = sanitize_hexcolor(new_eye_color) - amazed_human.dna.update_ui_block(DNA_EYE_COLOR_LEFT_BLOCK) - amazed_human.dna.update_ui_block(DNA_EYE_COLOR_RIGHT_BLOCK) - amazed_human.update_body() + if(new_hair_color) + user.set_haircolor(sanitize_hexcolor(new_hair_color), update = FALSE) + user.dna.update_ui_block(DNA_HAIR_COLOR_BLOCK) + if(user.physique == MALE) + var/new_face_color = input(user, "Choose your facial hair color", "Hair Color", user.facial_hair_color) as color|null + if(new_face_color) + user.set_facial_haircolor(sanitize_hexcolor(new_face_color), update = FALSE) + user.dna.update_ui_block(DNA_FACIAL_HAIR_COLOR_BLOCK) + user.update_body_parts() /obj/structure/mirror/magic/lesser/Initialize(mapload) // Roundstart species don't have a flag, so it has to be set on Initialize. @@ -289,10 +348,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28) name = "pride's mirror" desc = "Pride cometh before the..." race_flags = MIRROR_PRIDE + mirror_options = PRIDE_MIRROR_OPTIONS -/obj/structure/mirror/magic/pride/attack_hand(mob/user, list/modifiers) +/obj/structure/mirror/magic/pride/attack_hand(mob/living/carbon/human/user) . = ..() - if(.) + if(!.) return TRUE user.visible_message(span_danger("The ground splits beneath [user] as [user.p_their()] hand leaves the mirror!"), \ @@ -308,3 +368,15 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28) var/turf/open/chasm/new_chasm = user_turf new_chasm.set_target(dest) new_chasm.drop(user) + +#undef CHANGE_HAIR +#undef CHANGE_BEARD + +#undef CHANGE_RACE +#undef CHANGE_SEX +#undef CHANGE_NAME +#undef CHANGE_EYES + +#undef INERT_MIRROR_OPTIONS +#undef PRIDE_MIRROR_OPTIONS +#undef MAGIC_MIRROR_OPTIONS diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 669a5064a927b..77b64be18421f 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -31,7 +31,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants and other ghosties. /obj/structure/bodycontainer - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/structures.dmi' icon_state = "morgue1" density = TRUE anchored = TRUE @@ -156,6 +156,8 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an continue else if(istype(AM, /obj/effect/dummy/phased_mob)) continue + else if(isdead(AM)) + continue AM.forceMove(src) toggle_organ_decay(src) update_appearance() @@ -216,12 +218,13 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an beeper = !beeper to_chat(user, span_notice("You turn the speaker function [beeper ? "on" : "off"].")) -/obj/structure/bodycontainer/morgue/emag_act(mob/user) +/obj/structure/bodycontainer/morgue/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return - to_chat(user, span_warning("You overload [src]'s alert system.")) + return FALSE + balloon_alert(user, "alert system overloaded") obj_flags |= EMAGGED update_appearance(UPDATE_ICON) + return TRUE /obj/structure/bodycontainer/morgue/update_icon_state() if(!connected || connected.loc != src) // Open or tray is gone. @@ -236,7 +239,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an if(!length(compiled)) // No mobs? icon_state = "morgue3" return ..() - + if(!(obj_flags & EMAGGED)) for(var/mob/living/occupant as anything in compiled) var/mob/living/mob_occupant = get_mob_or_brainmob(occupant) @@ -265,6 +268,7 @@ GLOBAL_LIST_EMPTY(crematoriums) /obj/structure/bodycontainer/crematorium name = "crematorium" desc = "A human incinerator. Works well on barbecue nights." + icon = 'icons/obj/machines/crematorium.dmi' icon_state = "crema1" base_icon_state = "crema" dir = SOUTH @@ -337,7 +341,7 @@ GLOBAL_LIST_EMPTY(crematoriums) qdel(O) if(!locate(/obj/effect/decal/cleanable/ash) in get_step(src, dir))//prevent pile-up - new/obj/effect/decal/cleanable/ash/crematorium(src) + new/obj/effect/decal/cleanable/ash(src) sleep(3 SECONDS) @@ -351,9 +355,12 @@ GLOBAL_LIST_EMPTY(crematoriums) desc = "A human incinerator. Works well during ice cream socials." /obj/structure/bodycontainer/crematorium/creamatorium/cremate(mob/user) - var/list/icecreams = new() + var/list/icecreams = list() for(var/mob/living/i_scream as anything in get_all_contents_type(/mob/living)) - var/obj/item/food/icecream/IC = new(null, list(ICE_CREAM_MOB = list(null, i_scream.name))) + var/obj/item/food/icecream/IC = new /obj/item/food/icecream( + loc = null, + prefill_flavours = list(ICE_CREAM_MOB = list(null, i_scream.name)) + ) icecreams += IC . = ..() for(var/obj/IC in icecreams) @@ -365,7 +372,7 @@ GLOBAL_LIST_EMPTY(crematoriums) * For overriding only */ /obj/structure/tray - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/machines/crematorium.dmi' density = TRUE anchored = TRUE pass_flags_self = PASSTABLE | LETPASSTHROW @@ -447,6 +454,7 @@ GLOBAL_LIST_EMPTY(crematoriums) /obj/structure/tray/m_tray name = "morgue tray" desc = "Apply corpse before closing." + icon = 'icons/obj/structures.dmi' icon_state = "morguet" pass_flags_self = PASSTABLE | LETPASSTHROW diff --git a/code/game/objects/structures/mystery_box.dm b/code/game/objects/structures/mystery_box.dm index 41164a8778f54..63092cfeac3f8 100644 --- a/code/game/objects/structures/mystery_box.dm +++ b/code/game/objects/structures/mystery_box.dm @@ -187,7 +187,7 @@ GLOBAL_LIST_INIT(mystery_box_extended, list( if(grant_extra_mag && istype(instantiated_gun, /obj/item/gun/ballistic)) var/obj/item/gun/ballistic/instantiated_ballistic = instantiated_gun if(!instantiated_ballistic.internal_magazine) - var/obj/item/ammo_box/magazine/extra_mag = new instantiated_ballistic.mag_type(loc) + var/obj/item/ammo_box/magazine/extra_mag = new instantiated_ballistic.spawn_magazine_type(loc) user.put_in_hands(extra_mag) user.visible_message(span_notice("[user] takes [presented_item] from [src]."), span_notice("You take [presented_item] from [src]."), vision_distance = COMBAT_MESSAGE_RANGE) diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm index 2a3cf480c53a2..534622619d122 100644 --- a/code/game/objects/structures/noticeboard.dm +++ b/code/game/objects/structures/noticeboard.dm @@ -1,10 +1,10 @@ -#define MAX_NOTICES 5 +#define MAX_NOTICES 8 /obj/structure/noticeboard name = "notice board" - desc = "A board for pinning important notices upon." - icon = 'icons/obj/stationobjs.dmi' - icon_state = "nboard00" + desc = "A board for pinning important notices upon. It is made of the finest Spanish cork." + icon = 'icons/obj/wallmounts.dmi' + icon_state = "noticeboard" density = FALSE anchored = TRUE max_integrity = 150 @@ -25,7 +25,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/noticeboard, 32) if(istype(I, /obj/item/paper)) I.forceMove(src) notices++ - icon_state = "nboard0[notices]" + update_appearance(UPDATE_ICON) + find_and_hang_on_wall() //attaching papers!! /obj/structure/noticeboard/attackby(obj/item/O, mob/user, params) @@ -37,7 +38,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/noticeboard, 32) if(!user.transferItemToLoc(O, src)) return notices++ - icon_state = "nboard0[notices]" + update_appearance(UPDATE_ICON) to_chat(user, span_notice("You pin the [O] to the noticeboard.")) else to_chat(user, span_warning("The notice board is full!")) @@ -89,6 +90,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/noticeboard, 32) remove_item(item, user) return TRUE +/obj/structure/noticeboard/update_overlays() + . = ..() + if(notices) + . += "notices_[notices]" + /** * Removes an item from the notice board * @@ -102,7 +108,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/noticeboard, 32) user.put_in_hands(item) balloon_alert(user, "removed from board") notices-- - icon_state = "nboard0[notices]" + update_appearance(UPDATE_ICON) /obj/structure/noticeboard/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) @@ -117,8 +123,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/noticeboard, 32) /obj/item/wallframe/noticeboard name = "notice board" desc = "Right now it's more of a clipboard. Attach to a wall to use." - icon = 'icons/obj/stationobjs.dmi' - icon_state = "nboard00" + icon = 'icons/obj/wallmounts.dmi' + icon_state = "noticeboard" custom_materials = list( /datum/material/wood = SHEET_MATERIAL_AMOUNT, ) diff --git a/code/game/objects/structures/petrified_statue.dm b/code/game/objects/structures/petrified_statue.dm index e3a271e18dbe2..54896c2e41405 100644 --- a/code/game/objects/structures/petrified_statue.dm +++ b/code/game/objects/structures/petrified_statue.dm @@ -5,13 +5,20 @@ density = TRUE anchored = TRUE max_integrity = 200 + // Should we leave a brain behind when the statue is wrecked? + var/brain = TRUE var/timer = 480 //eventually the person will be freed var/mob/living/petrified_mob -/obj/structure/statue/petrified/Initialize(mapload, mob/living/L, statue_timer) +/obj/structure/statue/petrified/relaymove() + return + +/obj/structure/statue/petrified/Initialize(mapload, mob/living/L, statue_timer, save_brain) . = ..() if(statue_timer) timer = statue_timer + if(save_brain) + brain = save_brain if(L) petrified_mob = L if(L.buckled) @@ -37,8 +44,9 @@ /obj/structure/statue/petrified/contents_explosion(severity, target) return -/obj/structure/statue/petrified/handle_atom_del(atom/A) - if(A == petrified_mob) +/obj/structure/statue/petrified/Exited(atom/movable/gone, direction) + . = ..() + if(gone == petrified_mob) petrified_mob = null /obj/structure/statue/petrified/Destroy() @@ -58,12 +66,11 @@ if(petrified_mob) petrified_mob.status_flags &= ~GODMODE - petrified_mob.forceMove(loc) REMOVE_TRAIT(petrified_mob, TRAIT_MUTE, STATUE_MUTE) REMOVE_TRAIT(petrified_mob, TRAIT_NOBLOOD, MAGIC_TRAIT) - petrified_mob.take_overall_damage((petrified_mob.health - atom_integrity + 100)) //any new damage the statue incurred is transfered to the mob + petrified_mob.take_overall_damage((petrified_mob.health - atom_integrity + 100)) //any new damage the statue incurred is transferred to the mob petrified_mob.faction -= FACTION_MIMIC - petrified_mob = null + petrified_mob.forceMove(loc) return ..() /obj/structure/statue/petrified/deconstruct(disassembled = TRUE) @@ -71,7 +78,7 @@ if(!disassembled) if(petrified_mob) petrified_mob.investigate_log("has been dusted by statue deconstruction.", INVESTIGATE_DEATHS) - if(iscarbon(petrified_mob)) + if(iscarbon(petrified_mob) && brain) var/mob/living/carbon/petrified_carbon = petrified_mob var/obj/item/organ/internal/brain/carbon_brain = petrified_carbon.get_organ_slot(ORGAN_SLOT_BRAIN) carbon_brain.Remove(petrified_carbon) @@ -87,14 +94,16 @@ /mob/proc/petrify(statue_timer) -/mob/living/carbon/human/petrify(statue_timer) +/mob/living/carbon/human/petrify(statue_timer, save_brain, colorlist) if(!isturf(loc)) return FALSE - var/obj/structure/statue/petrified/S = new(loc, src, statue_timer) + var/obj/structure/statue/petrified/S = new(loc, src, statue_timer, save_brain) S.name = "statue of [name]" ADD_TRAIT(src, TRAIT_NOBLOOD, MAGIC_TRAIT) S.copy_overlays(src) var/newcolor = list(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) + if(colorlist) + newcolor = colorlist S.add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY) return TRUE diff --git a/code/game/objects/structures/plaques/_plaques.dm b/code/game/objects/structures/plaques/_plaques.dm index 775c7efef8226..8b8047ba4641a 100644 --- a/code/game/objects/structures/plaques/_plaques.dm +++ b/code/game/objects/structures/plaques/_plaques.dm @@ -69,7 +69,7 @@ if(atom_integrity == max_integrity) to_chat(user, span_warning("This plaque is already in perfect condition.")) return TRUE - if(!I.tool_start_check(user, amount=0)) + if(!I.tool_start_check(user, amount=1)) return TRUE user.visible_message(span_notice("[user] starts repairing [src]..."), \ span_notice("You start repairing [src].")) @@ -141,7 +141,7 @@ if(atom_integrity == max_integrity) to_chat(user, span_warning("This plaque is already in perfect condition.")) return TRUE - if(!I.tool_start_check(user, amount=0)) + if(!I.tool_start_check(user, amount=1)) return TRUE user.visible_message(span_notice("[user] starts repairing [src]..."), \ span_notice("You start repairing [src].")) diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index 10e3548fca9fb..7136f28a44cd2 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -2,7 +2,7 @@ name = "airtight plastic flaps" desc = "Heavy duty, airtight, plastic flaps. Definitely can't get past those. No way." gender = PLURAL - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/structures.dmi' icon_state = "plasticflaps" armor_type = /datum/armor/structure_plasticflaps density = FALSE diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index 96fd0ac2356aa..f88ba15ecc52c 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -8,18 +8,20 @@ density = TRUE 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. + layer = ABOVE_MOB_LAYER + plane = GAME_PLANE_UPPER + /// armor is a little bit less than a grille. max_integrity about half that of a grille. armor_type = /datum/armor/structure_railing - max_integrity = 75 + max_integrity = 25 var/climbable = TRUE ///Initial direction of the railing. var/ini_dir /datum/armor/structure_railing - melee = 50 - bullet = 70 - laser = 70 + melee = 35 + bullet = 50 + laser = 50 energy = 100 bomb = 10 @@ -28,6 +30,12 @@ density = FALSE climbable = FALSE +/obj/structure/railing/corner/end //end of a segment of railing without making a loop + icon_state = "railing_end" + +/obj/structure/railing/corner/end/flip //same as above but flipped around + icon_state = "railing_end_flip" + /obj/structure/railing/Initialize(mapload) . = ..() ini_dir = dir @@ -40,6 +48,19 @@ ) AddElement(/datum/element/connect_loc, loc_connections) + var/static/list/tool_behaviors = list( + TOOL_WELDER = list( + SCREENTIP_CONTEXT_LMB = "Repair", + ), + TOOL_WRENCH = list( + SCREENTIP_CONTEXT_LMB = "Anchor/Unanchor", + ), + TOOL_WIRECUTTER = list( + SCREENTIP_CONTEXT_LMB = "Deconstruct", + ), + ) + AddElement(/datum/element/contextual_screentip_tools, tool_behaviors) + AddComponent(/datum/component/simple_rotation, ROTATION_NEEDS_ROOM) /obj/structure/railing/attackby(obj/item/I, mob/living/user, params) @@ -48,7 +69,7 @@ if(I.tool_behaviour == TOOL_WELDER && !user.combat_mode) if(atom_integrity < max_integrity) - if(!I.tool_start_check(user, amount=0)) + if(!I.tool_start_check(user, amount=1)) return to_chat(user, span_notice("You begin repairing [src]...")) @@ -64,16 +85,19 @@ /obj/structure/railing/wirecutter_act(mob/living/user, obj/item/I) . = ..() - if(!anchored) - to_chat(user, span_warning("You cut apart the railing.")) - I.play_tool_sound(src, 100) - deconstruct() - return TRUE + to_chat(user, span_warning("You cut apart the railing.")) + I.play_tool_sound(src, 100) + deconstruct() + return TRUE /obj/structure/railing/deconstruct(disassembled) if(!(flags_1 & NODECONSTRUCT_1)) - var/obj/item/stack/rods/rod = new /obj/item/stack/rods(drop_location(), 6) - transfer_fingerprints_to(rod) + if (istype(src,/obj/structure/railing/corner)) // Corner railings only cost 1 rod + var/obj/item/stack/rods/rod = new /obj/item/stack/rods(drop_location(), 1) + transfer_fingerprints_to(rod) + else + var/obj/item/stack/rods/rod = new /obj/item/stack/rods(drop_location(), 2) + transfer_fingerprints_to(rod) return ..() ///Implements behaviour that makes it possible to unanchor the railing. diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index 6ec3f9308842b..57b5ff1c49208 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -105,7 +105,7 @@ return TOOL_ACT_TOOLTYPE_SUCCESS /obj/structure/reflector/welder_act(mob/living/user, obj/item/tool) - if(!tool.tool_start_check(user, amount=0)) + if(!tool.tool_start_check(user, amount=1)) return if(atom_integrity < max_integrity) user.visible_message(span_notice("[user] starts to repair [src]."), diff --git a/code/game/objects/structures/showcase.dm b/code/game/objects/structures/showcase.dm index 4e8b9d2aa8b29..7d434419f146f 100644 --- a/code/game/objects/structures/showcase.dm +++ b/code/game/objects/structures/showcase.dm @@ -4,7 +4,7 @@ /*Completely generic structures for use by mappers to create fake objects, i.e. display rooms*/ /obj/structure/showcase name = "showcase" - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/fluff/general.dmi' icon_state = "showcase_1" desc = "A stand with the empty body of a cyborg bolted to it." density = TRUE @@ -14,7 +14,7 @@ /obj/structure/showcase/fakeid name = "\improper CentCom identification console" desc = "You can use this to change ID's." - icon = 'icons/obj/computer.dmi' + icon = 'icons/obj/machines/computer.dmi' icon_state = "computer" /obj/structure/showcase/fakeid/Initialize(mapload) @@ -25,7 +25,7 @@ /obj/structure/showcase/fakesec name = "\improper CentCom security records" desc = "Used to view and edit personnel's security records." - icon = 'icons/obj/computer.dmi' + icon = 'icons/obj/machines/computer.dmi' icon_state = "computer" /obj/structure/showcase/fakesec/update_overlays() @@ -64,19 +64,19 @@ /obj/structure/showcase/mecha/marauder name = "combat mech exhibit" desc = "A stand with an empty old Nanotrasen Corporation combat mech bolted to it. It is described as the premier unit used to defend corporate interests and employees." - icon = 'icons/mecha/mecha.dmi' + icon = 'icons/mob/mecha.dmi' icon_state = "marauder" /obj/structure/showcase/mecha/ripley name = "construction mech exhibit" desc = "A stand with a retired construction mech bolted to it. The clamps are rated at 9300PSI. It seems to be falling apart." - icon = 'icons/mecha/mecha.dmi' + icon = 'icons/mob/mecha.dmi' icon_state = "firefighter" /obj/structure/showcase/machinery/implanter name = "\improper Nanotrasen automated mindshield implanter exhibit" desc = "A flimsy model of a standard Nanotrasen automated mindshield implant machine. With secure positioning harnesses and a robotic surgical injector, brain damage and other serious medical anomalies are now up to 60% less likely!" - icon = 'icons/obj/machines/implantchair.dmi' + icon = 'icons/obj/machines/implant_chair.dmi' icon_state = "implantchair" /obj/structure/showcase/machinery/microwave @@ -98,7 +98,7 @@ /obj/structure/showcase/machinery/tv name = "\improper Nanotrasen corporate newsfeed" desc = "A slightly battered looking TV. Various Nanotrasen infomercials play on a loop, accompanied by a jaunty tune." - icon = 'icons/obj/computer.dmi' + icon = 'icons/obj/machines/computer.dmi' icon_state = "television" /obj/structure/showcase/machinery/signal_decrypter diff --git a/code/game/objects/structures/signs/_signs.dm b/code/game/objects/structures/signs/_signs.dm index e3ee70dfec78e..b8709334c37f6 100644 --- a/code/game/objects/structures/signs/_signs.dm +++ b/code/game/objects/structures/signs/_signs.dm @@ -14,6 +14,8 @@ var/is_editable = FALSE ///sign_change_name is used to make nice looking, alphebetized and categorized names when you use a pen on any sign item or structure which is_editable. var/sign_change_name + ///Callback to the knock down proc for wallmounting behavior. + var/knock_down_callback /datum/armor/structure_sign melee = 50 @@ -23,6 +25,12 @@ /obj/structure/sign/Initialize(mapload) . = ..() register_context() + knock_down_callback = CALLBACK(src, PROC_REF(knock_down)) + find_and_hang_on_wall(custom_drop_callback = knock_down_callback) + +/obj/structure/sign/Destroy() + . = ..() + knock_down_callback = null /obj/structure/sign/add_context(atom/source, list/context, obj/item/held_item, mob/user) . = ..() @@ -55,18 +63,7 @@ playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) user.visible_message(span_notice("[user] unfastens [src]."), \ span_notice("You unfasten [src].")) - var/obj/item/sign/unwrenched_sign = new (get_turf(user)) - if(type != /obj/structure/sign/blank) //If it's still just a basic sign backing, we can (and should) skip some of the below variable transfers. - unwrenched_sign.name = name //Copy over the sign structure variables to the sign item we're creating when we unwrench a sign. - unwrenched_sign.desc = "[desc] It can be placed on a wall." - unwrenched_sign.icon = icon - unwrenched_sign.icon_state = icon_state - unwrenched_sign.sign_path = type - unwrenched_sign.set_custom_materials(custom_materials) //This is here so picture frames and wooden things don't get messed up. - unwrenched_sign.is_editable = is_editable - unwrenched_sign.update_integrity(get_integrity()) //Transfer how damaged it is. - unwrenched_sign.setDir(dir) - qdel(src) //The sign structure on the wall goes poof and only the sign item from unwrenching remains. + knock_down(user) return TRUE /obj/structure/sign/welder_act(mob/living/user, obj/item/I) @@ -76,7 +73,7 @@ if(atom_integrity == max_integrity) to_chat(user, span_warning("This sign is already in perfect condition.")) return TRUE - if(!I.tool_start_check(user, amount=0)) + if(!I.tool_start_check(user, amount=1)) return TRUE user.visible_message(span_notice("[user] starts repairing [src]..."), \ span_notice("You start repairing [src].")) @@ -115,6 +112,29 @@ return return ..() +/** + * This is called when a sign is removed from a wall, either through deconstruction or being knocked down. + * @param mob/living/user The user who removed the sign, if it was knocked down by a mob. + */ +/obj/structure/sign/proc/knock_down(mob/living/user) + var/turf/drop_turf + if(user) + drop_turf = get_turf(user) + else + drop_turf = drop_location() + var/obj/item/sign/unwrenched_sign = new (drop_turf) + if(type != /obj/structure/sign/blank) //If it's still just a basic sign backing, we can (and should) skip some of the below variable transfers. + unwrenched_sign.name = name //Copy over the sign structure variables to the sign item we're creating when we unwrench a sign. + unwrenched_sign.desc = "[desc] It can be placed on a wall." + unwrenched_sign.icon = icon + unwrenched_sign.icon_state = icon_state + unwrenched_sign.sign_path = type + unwrenched_sign.set_custom_materials(custom_materials) //This is here so picture frames and wooden things don't get messed up. + unwrenched_sign.is_editable = is_editable + unwrenched_sign.update_integrity(get_integrity()) //Transfer how damaged it is. + unwrenched_sign.setDir(dir) + qdel(src) //The sign structure on the wall goes poof and only the sign item from unwrenching remains. + /obj/structure/sign/blank //This subtype is necessary for now because some other things (posters, picture frames, paintings) inheret from the parent type. icon_state = "backing" name = "sign backing" @@ -211,6 +231,7 @@ playsound(target_turf, 'sound/items/deconstruct.ogg', 50, TRUE) placed_sign.update_integrity(get_integrity()) placed_sign.setDir(dir) + placed_sign.find_and_hang_on_wall(TRUE, placed_sign.knock_down_callback) qdel(src) /obj/item/sign/welder_act(mob/living/user, obj/item/I) @@ -220,7 +241,7 @@ if(atom_integrity == max_integrity) to_chat(user, span_warning("This sign is already in perfect condition.")) return TRUE - if(!I.tool_start_check(user, amount=0)) + if(!I.tool_start_check(user, amount=1)) return TRUE user.visible_message(span_notice("[user] starts repairing [src]..."), \ span_notice("You start repairing [src].")) diff --git a/code/game/objects/structures/signs/signs_departments.dm b/code/game/objects/structures/signs/signs_departments.dm index c48263c26fe9f..37015a59cb087 100644 --- a/code/game/objects/structures/signs/signs_departments.dm +++ b/code/game/objects/structures/signs/signs_departments.dm @@ -5,9 +5,24 @@ ///////MEDBAY -/obj/structure/sign/departments/medbay +/obj/structure/sign/departments/med name = "\improper Medbay sign" sign_change_name = "Department - Medbay" + desc = "A sign labeling an area of medical department." + icon_state = "med" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/med, 32) + +/obj/structure/sign/departments/med_alt + name = "\improper Medbay sign" + sign_change_name = "Department - Medbay Alt" + icon_state = "medbay" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/med_alt, 32) + +/obj/structure/sign/departments/medbay + name = "\improper Medbay sign" + sign_change_name = "Generic Medical" desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here." icon_state = "bluecross" @@ -15,8 +30,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/medbay, 32) /obj/structure/sign/departments/medbay/alt name = "\improper Medbay sign" - sign_change_name = "Department - Medbay Alt" - desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here." + sign_change_name = "Generic Medical Alt" icon_state = "bluecross2" MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/medbay/alt, 32) @@ -54,11 +68,27 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/chemistry/pharmacy, /obj/structure/sign/departments/psychology name = "\improper Psychology sign" sign_change_name = "Department - Medbay: Psychology" - desc = "A sign labelling where the Psychologist works, they can probably help you get your head straight." + desc = "A sign labelling an area where the Psychologist works, they can probably help you get your head straight." icon_state = "psychology" MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/psychology, 32) +/obj/structure/sign/departments/virology + name = "\improper Virology sign" + sign_change_name = "Department - Medbay: Virology" + desc = "A sign labelling an area where the virologist's laboratory is located." + icon_state = "pharmacy" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/virology, 32) + +/obj/structure/sign/departments/morgue + name = "\improper Morgue sign" + sign_change_name = "Department - Medbay: Morgue" + desc = "A sign labelling an area where station stores its ever-piling bodies." + icon_state = "morgue" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/morgue, 32) + ///////ENGINEERING /obj/structure/sign/departments/engineering @@ -88,8 +118,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/science/alt, 32) /obj/structure/sign/departments/xenobio name = "\improper Xenobiology sign" sign_change_name = "Department - Science: Xenobiology" - desc = "A sign labelling an area as a place where xenobiological entities are researched." - icon_state = "xenobio" + desc = "A sign labelling an area where xenobiological entities are researched." + icon_state = "xenobio1" MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/xenobio, 32) @@ -99,6 +129,14 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/xenobio, 32) MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/xenobio/alt, 32) +/obj/structure/sign/departments/genetics + name = "\improper Genetics sign" + sign_change_name = "Department - Science: Genetics" + desc = "A sign labelling an area where the field of genetics is researched." + icon_state = "gene" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/genetics, 32) + /obj/structure/sign/departments/rndserver name ="\improper R&D Server sign" sign_change_name = "Department - Science: R&D Server" @@ -129,6 +167,12 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/botany/alt1, 32) MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/botany/alt2, 32) +/obj/structure/sign/departments/botany/botany/alt3 + sign_change_name = "Department - Botany (Tray) Alt" + icon_state = "botany" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/botany/alt3, 32) + /obj/structure/sign/departments/custodian name = "\improper Janitor sign" sign_change_name = "Department - Janitor" @@ -145,6 +189,14 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/custodian, 32) MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/holy, 32) +/obj/structure/sign/departments/holy_alt + name = "\improper Chapel sign" + sign_change_name = "Department - Chapel" + desc = "A sign labelling a religious area." + icon_state = "chapel" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/holy, 32) + /obj/structure/sign/departments/lawyer name = "\improper Legal Department sign" sign_change_name = "Department - Legal" diff --git a/code/game/objects/structures/signs/signs_flags.dm b/code/game/objects/structures/signs/signs_flags.dm index 1d17765201e4e..64a9d7225bbac 100644 --- a/code/game/objects/structures/signs/signs_flags.dm +++ b/code/game/objects/structures/signs/signs_flags.dm @@ -1,7 +1,7 @@ /obj/structure/sign/flag name = "flag of the IT Division" desc = "The flag of the Nanotrasen IT Division. Bears a symbol that only makes sense to those that understand." - icon = 'icons/obj/flags.dmi' + icon = 'icons/obj/fluff/flags.dmi' icon_state = "flag_coder" /obj/structure/sign/flag/nanotrasen diff --git a/code/game/objects/structures/signs/signs_interactive.dm b/code/game/objects/structures/signs/signs_interactive.dm index 5c3b85c7764f4..1e407034f4a71 100644 --- a/code/game/objects/structures/signs/signs_interactive.dm +++ b/code/game/objects/structures/signs/signs_interactive.dm @@ -1,5 +1,3 @@ -#define COLLISION_HAZARD_THRESHOLD 11 - /obj/structure/sign/clock name = "wall clock" desc = "It's your run-of-the-mill wall clock showing both the local Coalition Standard Time and the galactic Treaty Coordinated Time. Perfect for staring at instead of working." @@ -26,141 +24,3 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/calendar, 32) . += span_info("Events:") for(var/holidayname in GLOB.holidays) . += span_info("[holidayname]") - -/** - * List of delamination counter signs on the map. - * Required as persistence subsystem loads after the ones present at mapload, and to reset to 0 upon explosion. - */ -GLOBAL_LIST_EMPTY(map_delamination_counters) - -/obj/structure/sign/delamination_counter - name = "delamination counter" - sign_change_name = "Flip Sign- Supermatter Delamination" - desc = "A pair of flip signs describe how long it's been since the last delamination incident." - icon_state = "days_since_explosion" - is_editable = TRUE - var/since_last = 0 - -MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/delamination_counter, 32) - -/obj/structure/sign/delamination_counter/Initialize(mapload) - . = ..() - GLOB.map_delamination_counters += src - if (!mapload) - update_count(SSpersistence.rounds_since_engine_exploded) - -/obj/structure/sign/delamination_counter/Destroy() - GLOB.map_delamination_counters -= src - return ..() - -/obj/structure/sign/delamination_counter/proc/update_count(new_count) - since_last = min(new_count, 99) - update_appearance() - -/obj/structure/sign/delamination_counter/update_overlays() - . = ..() - - var/ones = since_last % 10 - var/mutable_appearance/ones_overlay = mutable_appearance('icons/obj/signs.dmi', "days_[ones]") - ones_overlay.pixel_w = 4 - . += ones_overlay - - var/tens = (since_last / 10) % 10 - var/mutable_appearance/tens_overlay = mutable_appearance('icons/obj/signs.dmi', "days_[tens]") - tens_overlay.pixel_w = -5 - . += tens_overlay - -/obj/structure/sign/delamination_counter/examine(mob/user) - . = ..() - . += span_info("It has been [since_last] day\s since the last delamination event at a Nanotrasen facility.") - switch (since_last) - if (0) - . += span_info("In case you didn't notice.") - if(1) - . += span_info("Let's do better today.") - if(2 to 5) - . += span_info("There's room for improvement.") - if(6 to 10) - . += span_info("Good work!") - if(11 to INFINITY) - . += span_info("Incredible!") - -/obj/structure/sign/collision_counter - name = "incident counter" - sign_change_name = "Indicator board- Tram incidents" - desc = "A display that indicates how many tram related incidents have occured today." - icon_state = "tram_hits" - is_editable = TRUE - var/hit_count = 0 - var/tram_id = TRAM_LIFT_ID - /// Has the tram hit enough people it now flashes hazard lights? - var/hazard_flash = FALSE - -/obj/structure/sign/collision_counter/Initialize(mapload) - ..() - return INITIALIZE_HINT_LATELOAD - -/obj/structure/sign/collision_counter/LateInitialize() - . = ..() - for(var/obj/structure/industrial_lift/tram/tram as anything in GLOB.lifts) - if(tram.lift_id != tram_id) - continue - RegisterSignal(tram, COMSIG_TRAM_COLLISION, PROC_REF(new_hit)) - update_appearance() - -/obj/structure/sign/collision_counter/Destroy() - return ..() - -/obj/structure/sign/collision_counter/proc/new_hit(lift_master, collided_type) - SIGNAL_HANDLER - - if(!ismob(collided_type)) - return - - var/mob/victim = collided_type // Real players only, no gaming high score - if(!victim.client) - return - - hit_count++ - - if(hazard_flash) - update_appearance() - return - - if(hit_count == COLLISION_HAZARD_THRESHOLD) // When we hit the threshold, enable flashing the lights - hazard_flash = TRUE - icon_state = "tram_hits_alert" - update_appearance() - return - - update_appearance() - -/obj/structure/sign/collision_counter/update_overlays() - . = ..() - - var/ones = hit_count % 10 - var/mutable_appearance/ones_overlay = mutable_appearance('icons/obj/signs.dmi', "hits_[ones]") - ones_overlay.pixel_w = 4 - . += ones_overlay - - var/tens = (hit_count / 10) % 10 - var/mutable_appearance/tens_overlay = mutable_appearance('icons/obj/signs.dmi', "hits_[tens]") - tens_overlay.pixel_w = -5 - . += tens_overlay - -/obj/structure/sign/collision_counter/examine(mob/user) - . = ..() - . += span_info("The station has had [hit_count] incident\s this shift.") - switch (hit_count) - if(0) - . += span_info("Fantastic! Champions of safety.") - if(1) - . += span_info("Let's do better tomorrow.") - if(2 to 5) - . += span_info("There's room for improvement.") - if(6 to 10) - . += span_info("Good work! Nanotrasen's finest!") - if(11 to INFINITY) - . += span_info("Incredible! You're probably reading this from medbay.") - -#undef COLLISION_HAZARD_THRESHOLD diff --git a/code/game/objects/structures/signs/signs_misc.dm b/code/game/objects/structures/signs/signs_misc.dm index 841abd11741f0..0b0348977df77 100644 --- a/code/game/objects/structures/signs/signs_misc.dm +++ b/code/game/objects/structures/signs/signs_misc.dm @@ -23,7 +23,7 @@ /obj/structure/sign/chalkboard_menu name = "\improper Chalkboard coffee menu" icon_state = "chalkboard_menu" - icon = 'icons/obj/barsigns.dmi' + icon = 'icons/obj/machines/barsigns.dmi' desc = "85cr for a iced lactose-free caramel frappe?! Who buys that?!" MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/xenobio_guide, 32) diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm index cec59e1f86528..a453a36c12cbf 100644 --- a/code/game/objects/structures/spawner.dm +++ b/code/game/objects/structures/spawner.dm @@ -14,6 +14,48 @@ var/spawn_text = "emerges from" var/faction = list(FACTION_HOSTILE) var/spawner_type = /datum/component/spawner + /// Is this spawner taggable with something? + var/scanner_taggable = FALSE + /// If this spawner's taggable, what can we tag it with? + var/static/list/scanner_types = list(/obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner) + /// If this spawner's taggable, what's the text we use to describe what we can tag it with? + var/scanner_descriptor = "mining analyzer" + /// Has this spawner been tagged/analyzed by a mining scanner? + var/gps_tagged = FALSE + /// A short identifier for the mob it spawns. Keep around 3 characters or less? + var/mob_gps_id = "???" + /// A short identifier for what kind of spawner it is, for use in putting together its GPS tag. + var/spawner_gps_id = "Creature Nest" + /// A complete identifier. Generated on tag (if tagged), used for its examine. + var/assigned_tag + +/obj/structure/spawner/examine(mob/user) + . = ..() + if(!scanner_taggable) + return + if(gps_tagged) + . += span_notice("A holotag's been attached, projecting \"[assigned_tag]\".") + else + . += span_notice("It looks like you could probably scan and tag it with a [scanner_descriptor].") + +/obj/structure/spawner/attackby(obj/item/item, mob/user, params) + if(scanner_taggable && is_type_in_list(item, scanner_types)) + gps_tag(user) + +/// Tag the spawner, prefixing its GPS entry with an identifier - or giving it one, if nonexistent. +/obj/structure/spawner/proc/gps_tag(mob/user) + if(gps_tagged) + to_chat(user, span_warning("[src] already has a holotag attached!")) + return + to_chat(user, span_notice("You affix a holotag to [src].")) + playsound(src, 'sound/machines/twobeep.ogg', 100) + gps_tagged = TRUE + assigned_tag = "\[[mob_gps_id]-[rand(100,999)]\] " + spawner_gps_id + var/datum/component/gps/our_gps = GetComponent(/datum/component/gps) + if(our_gps) + our_gps.gpstag = assigned_tag + return + AddComponent(/datum/component/gps, assigned_tag) /obj/structure/spawner/Initialize(mapload) . = ..() @@ -32,6 +74,8 @@ spawn_text = "warps in from" mob_types = list(/mob/living/basic/syndicate/ranged) faction = list(ROLE_SYNDICATE) + mob_gps_id = "SYN" // syndicate + spawner_gps_id = "Hostile Warp Beacon" /obj/structure/spawner/skeleton name = "bone pit" @@ -44,6 +88,8 @@ mob_types = list(/mob/living/simple_animal/hostile/skeleton) spawn_text = "climbs out of" faction = list(FACTION_SKELETON) + mob_gps_id = "SKL" // skeletons + spawner_gps_id = "Bone Pit" /obj/structure/spawner/clown name = "Laughing Larry" @@ -53,9 +99,22 @@ max_integrity = 200 max_mobs = 15 spawn_time = 15 SECONDS - mob_types = list(/mob/living/simple_animal/hostile/retaliate/clown, /mob/living/simple_animal/hostile/retaliate/clown/fleshclown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk, /mob/living/simple_animal/hostile/retaliate/clown/longface, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/chlown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus, /mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton, /mob/living/simple_animal/hostile/retaliate/clown/banana, /mob/living/simple_animal/hostile/retaliate/clown/honkling, /mob/living/simple_animal/hostile/retaliate/clown/lube) + mob_types = list( + /mob/living/basic/clown, + /mob/living/basic/clown/banana, + /mob/living/basic/clown/clownhulk, + /mob/living/basic/clown/clownhulk/chlown, + /mob/living/basic/clown/clownhulk/honkmunculus, + /mob/living/basic/clown/fleshclown, + /mob/living/basic/clown/mutant/glutton, + /mob/living/basic/clown/honkling, + /mob/living/basic/clown/longface, + /mob/living/basic/clown/lube, + ) spawn_text = "climbs out of" faction = list(FACTION_CLOWN) + mob_gps_id = "???" // clowns + spawner_gps_id = "Clown Planet Distortion" /obj/structure/spawner/mining name = "monster den" @@ -65,33 +124,44 @@ max_mobs = 3 icon = 'icons/mob/simple/lavaland/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/basic/wumborian_fugu) + mob_types = list( + /mob/living/basic/mining/basilisk, + /mob/living/basic/mining/goldgrub, + /mob/living/basic/mining/goliath/ancient, + /mob/living/basic/mining/hivelord, + /mob/living/basic/wumborian_fugu, + ) faction = list(FACTION_MINING) /obj/structure/spawner/mining/goldgrub name = "goldgrub den" 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) + mob_types = list(/mob/living/basic/mining/goldgrub) + mob_gps_id = "GG" /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) + mob_types = list(/mob/living/basic/mining/goliath/ancient) + mob_gps_id = "GL|A" /obj/structure/spawner/mining/hivelord name = "hivelord den" desc = "A den housing a nest of hivelords." - mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord) + mob_types = list(/mob/living/basic/mining/hivelord) + mob_gps_id = "HL" /obj/structure/spawner/mining/basilisk name = "basilisk den" desc = "A den housing a nest of basilisks, bring a coat." - mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk) + mob_types = list(/mob/living/basic/mining/basilisk) + mob_gps_id = "BK" /obj/structure/spawner/mining/wumborian name = "wumborian fugu den" desc = "A den housing a nest of wumborian fugus, how do they all even fit in there?" mob_types = list(/mob/living/basic/wumborian_fugu) + mob_gps_id = "WF" /obj/structure/spawner/nether name = "netherworld link" @@ -102,8 +172,15 @@ max_mobs = 15 icon = 'icons/mob/simple/lavaland/nest.dmi' spawn_text = "crawls through" - mob_types = list(/mob/living/basic/migo, /mob/living/basic/creature, /mob/living/basic/blankbody) + mob_types = list( + /mob/living/basic/blankbody, + /mob/living/basic/creature, + /mob/living/basic/migo, + ) faction = list(FACTION_NETHER) + scanner_taggable = TRUE + mob_gps_id = "?!?" + spawner_gps_id = "Netheric Distortion" /obj/structure/spawner/nether/Initialize(mapload) . = ..() diff --git a/code/game/objects/structures/spirit_board.dm b/code/game/objects/structures/spirit_board.dm index ac3d10d926bff..d30e13630520f 100644 --- a/code/game/objects/structures/spirit_board.dm +++ b/code/game/objects/structures/spirit_board.dm @@ -1,7 +1,7 @@ /obj/structure/spirit_board name = "spirit board" desc = "A wooden board with letters etched into it, used in seances." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/structures.dmi' icon_state = "spirit_board" resistance_flags = FLAMMABLE density = TRUE diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 3a90144c04ccf..f25239fe41801 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -23,6 +23,14 @@ pass_flags_self = PASSTABLE | LETPASSTHROW layer = TABLE_LAYER obj_flags = CAN_BE_HIT | IGNORE_DENSITY + custom_materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT) + max_integrity = 100 + integrity_failure = 0.33 + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_TABLES + canSmoothWith = SMOOTH_GROUP_TABLES + ///TRUE if the table can be climbed on and have living mobs placed on it normally, FALSE otherwise + var/climbable = TRUE var/frame = /obj/structure/table_frame var/framestack = /obj/item/stack/rods var/glass_shard_type = /obj/item/shard @@ -30,25 +38,24 @@ var/busy = FALSE var/buildstackamount = 1 var/framestackamount = 2 - var/deconstruction_ready = 1 - custom_materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT) - max_integrity = 100 - integrity_failure = 0.33 - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_TABLES - canSmoothWith = SMOOTH_GROUP_TABLES + var/deconstruction_ready = TRUE /obj/structure/table/Initialize(mapload, _buildstack) . = ..() if(_buildstack) buildstack = _buildstack - AddElement(/datum/element/climbable) + AddElement(/datum/element/footstep_override, priority = STEP_SOUND_TABLE_PRIORITY) + + if (climbable) + 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) + var/static/list/give_turf_traits = list(TRAIT_TURF_IGNORE_SLOWDOWN, TRAIT_TURF_IGNORE_SLIPPERY, TRAIT_IMMERSE_STOPPED) + AddElement(/datum/element/give_turf_traits, give_turf_traits) register_context() /obj/structure/table/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) @@ -59,7 +66,7 @@ if(istype(held_item, /obj/item/toy/cards/deck)) var/obj/item/toy/cards/deck/dealer_deck = held_item - if(dealer_deck.wielded) + if(HAS_TRAIT(dealer_deck, TRAIT_WIELDED)) context[SCREENTIP_CONTEXT_LMB] = "Deal card" context[SCREENTIP_CONTEXT_RMB] = "Deal card faceup" . = CONTEXTUAL_SCREENTIP_SET @@ -100,6 +107,9 @@ if(isliving(user.pulling)) var/mob/living/pushed_mob = user.pulling if(pushed_mob.buckled) + if(pushed_mob.buckled == src) + //Already buckled to the table, you probably meant to unbuckle them + return ..() to_chat(user, span_warning("[pushed_mob] is buckled to [pushed_mob.buckled]!")) return if(user.combat_mode) @@ -155,16 +165,13 @@ 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 + var/passtable_key = REF(user) + passtable_on(pushed_mob, passtable_key) 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 + passtable_off(pushed_mob, passtable_key) if(pushed_mob.loc != loc) //Something prevented the tabling return pushed_mob.Knockdown(30) @@ -228,7 +235,7 @@ 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 + if(HAS_TRAIT(dealer_deck, TRAIT_WIELDED)) // deal a card facedown on the table var/obj/item/toy/singlecard/card = dealer_deck.draw(user) if(card) attackby(card, user, params) @@ -274,7 +281,7 @@ /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 + if(HAS_TRAIT(dealer_deck, TRAIT_WIELDED)) // deal a card faceup on the table var/obj/item/toy/singlecard/card = dealer_deck.draw(user) if(card) card.Flip() @@ -304,7 +311,7 @@ /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 list("mode" = RCD_DECONSTRUCT, "delay" = 2.4 SECONDS, "cost" = 16) return FALSE /obj/structure/table/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) @@ -354,6 +361,10 @@ icon_state = "rollingtable" var/list/attached_items = list() +/obj/structure/table/rolling/Initialize(mapload) + . = ..() + AddElement(/datum/element/noisy_movement) + /obj/structure/table/rolling/AfterPutItemOnTable(obj/item/I, mob/living/user) . = ..() attached_items += I @@ -377,10 +388,6 @@ if(!attached_movable.Move(loc)) RemoveItemFromTable(attached_movable, attached_movable.loc) -/obj/structure/table/rolling/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - . = ..() - if(has_gravity()) - playsound(src, 'sound/effects/roll.ogg', 100, TRUE) /* * Glass tables */ @@ -588,7 +595,7 @@ icon = 'icons/obj/smooth_structures/reinforced_table.dmi' icon_state = "reinforced_table-0" base_icon_state = "reinforced_table" - deconstruction_ready = 0 + deconstruction_ready = FALSE buildstack = /obj/item/stack/sheet/plasteel max_integrity = 200 integrity_failure = 0.25 @@ -707,8 +714,8 @@ smoothing_groups = null canSmoothWith = null can_buckle = 1 - buckle_lying = NO_BUCKLE_LYING - buckle_requires_restraints = TRUE + buckle_lying = 90 + climbable = FALSE custom_materials = list(/datum/material/silver =SHEET_MATERIAL_AMOUNT) var/mob/living/carbon/patient = null var/obj/machinery/computer/operating/computer = null @@ -720,6 +727,7 @@ if(computer) computer.table = src break + RegisterSignal(loc, COMSIG_ATOM_ENTERED, PROC_REF(mark_patient)) RegisterSignal(loc, COMSIG_ATOM_EXITED, PROC_REF(unmark_patient)) @@ -743,6 +751,7 @@ return RegisterSignal(potential_patient, COMSIG_LIVING_SET_BODY_POSITION, PROC_REF(recheck_patient)) recheck_patient(potential_patient) // In case the mob is already lying down before they entered. + potential_patient.pixel_y = potential_patient.base_pixel_y /// Unmark the potential patient. /obj/structure/table/optable/proc/unmark_patient(datum/source, mob/living/carbon/potential_patient) @@ -752,6 +761,7 @@ if(potential_patient == patient) recheck_patient(patient) // Can just set patient to null, but doing the recheck lets us find a replacement patient. UnregisterSignal(potential_patient, COMSIG_LIVING_SET_BODY_POSITION) + potential_patient.pixel_y = potential_patient.base_pixel_y + potential_patient.body_position_pixel_y_offset /// Someone on our tile just lied down, got up, moved in, or moved out. /// potential_patient is the mob that had one of those four things change. @@ -888,4 +898,3 @@ R.add_fingerprint(user) qdel(src) building = FALSE - diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index 95978496dbcc8..bac6a2eeb5e2d 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -3,7 +3,7 @@ /obj/structure/tank_dispenser name = "tank dispenser" desc = "A simple yet bulky storage device for gas tanks. Holds up to 10 oxygen tanks and 10 plasma tanks." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/structures.dmi' icon_state = "dispenser" density = TRUE anchored = TRUE diff --git a/code/game/objects/structures/tank_holder.dm b/code/game/objects/structures/tank_holder.dm index 2f0656719753c..9b5b33d8417eb 100644 --- a/code/game/objects/structures/tank_holder.dm +++ b/code/game/objects/structures/tank_holder.dm @@ -2,7 +2,7 @@ /obj/structure/tank_holder name = "tank holder" desc = "A metallic frame that can hold tanks and extinguishers." - icon = 'icons/obj/atmospherics/tank.dmi' + icon = 'icons/obj/canisters.dmi' icon_state = "holder" custom_materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT) @@ -68,7 +68,6 @@ new /obj/item/stack/rods(Tsec, 2) if(tank) tank.forceMove(Tsec) - after_detach_tank() qdel(src) /obj/structure/tank_holder/attack_paw(mob/user, list/modifiers) @@ -83,12 +82,11 @@ add_fingerprint(user) tank.add_fingerprint(user) user.put_in_hands(tank) - after_detach_tank() -/obj/structure/tank_holder/handle_atom_del(atom/A) - if(A == tank) +/obj/structure/tank_holder/Exited(atom/movable/gone, direction) + . = ..() + if(gone == tank) after_detach_tank() - return ..() /obj/structure/tank_holder/contents_explosion(severity, target) if(!tank) diff --git a/code/game/objects/structures/toiletbong.dm b/code/game/objects/structures/toiletbong.dm index 2393099b513fc..45ce79f9c32e4 100644 --- a/code/game/objects/structures/toiletbong.dm +++ b/code/game/objects/structures/toiletbong.dm @@ -53,7 +53,7 @@ to_chat(user, span_userdanger("There was something disgusting in the pipes!")) user.visible_message(span_danger("[user] spits out a mouse.")) user.adjust_disgust(50) - user.vomit(10) + user.vomit(VOMIT_CATEGORY_DEFAULT) var/mob/living/spawned_mob = new /mob/living/basic/mouse(get_turf(user)) spawned_mob.faction |= "[REF(user)]" if(prob(50)) @@ -101,7 +101,11 @@ if(!emagged) emagged = TRUE smokeradius = 2 - to_chat(user, span_boldwarning("The [emag_card.name] falls into the toilet. You fish it back out. Looks like you broke the toilet.")) + balloon_alert(user, "toilet broke") + if (emag_card) + to_chat(user, span_boldwarning("The [emag_card] falls into the toilet. You fish it back out. Looks like you broke the toilet.")) + return TRUE + return FALSE /obj/structure/toiletbong/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/card/emag)) diff --git a/code/game/objects/structures/training_machine.dm b/code/game/objects/structures/training_machine.dm index 8f2d2f6f3b47f..08ff42e2d766d 100644 --- a/code/game/objects/structures/training_machine.dm +++ b/code/game/objects/structures/training_machine.dm @@ -15,7 +15,7 @@ /obj/structure/training_machine name = "AURUMILL-Brand MkII. Personnel Training Machine" desc = "Used for combat training simulations. Accepts standard training targets. A pair of buckling straps are attached." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/machines/sec.dmi' icon_state = "training_machine" can_buckle = TRUE buckle_lying = 0 @@ -314,7 +314,7 @@ /** * Emagging causes a deadly, unremovable syndicate toolbox to be attached to the machine */ -/obj/structure/training_machine/emag_act(mob/user) +/obj/structure/training_machine/emag_act(mob/user, obj/item/card/emag/emag_card) . = ..() if (obj_flags & EMAGGED) return @@ -324,6 +324,7 @@ to_chat(user, span_warning("You override the training machine's safety protocols, and activate its realistic combat feature. A toolbox pops out of a slot on the top.")) playsound(src, 'sound/machines/click.ogg', 50, TRUE) add_overlay("evil_trainer") + return TRUE /obj/structure/training_machine/examine(mob/user) . = ..() diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index 98348158285a4..b04d9803569d1 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -182,7 +182,7 @@ tube_dirs = list(NORTH, SOUTH) if(WEST) tube_dirs = list(NORTH, SOUTH) - boarding_dir = turn(dir, 180) + boarding_dir = REVERSE_DIR(dir) /obj/structure/transit_tube/station/flipped @@ -212,7 +212,7 @@ tube_dirs = list(SOUTH) if(WEST) tube_dirs = list(NORTH) - boarding_dir = turn(dir, 180) + boarding_dir = REVERSE_DIR(dir) /obj/structure/transit_tube/station/reverse/flipped icon_state = "closed_terminus1" @@ -291,7 +291,7 @@ tube_dirs = list(SOUTH) if(WEST) tube_dirs = list(NORTH) - boarding_dir = turn(dir, 180) + boarding_dir = REVERSE_DIR(dir) /obj/structure/transit_tube/station/dispenser/reverse/flipped icon_state = "open_terminusdispenser1" diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm index e74c62fe948cd..d7b463122ffb6 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube.dm @@ -1,7 +1,7 @@ /obj/structure/transit_tube name = "transit tube" - icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi' + icon = 'icons/obj/pipes_n_cables/transit_tube.dmi' icon_state = "straight" desc = "A transit tube for moving things around." density = TRUE @@ -61,7 +61,7 @@ /obj/structure/transit_tube/proc/has_entrance(from_dir) - from_dir = turn(from_dir, 180) + from_dir = REVERSE_DIR(from_dir) for(var/direction in tube_dirs) if(direction == from_dir) diff --git a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm index c9ed96819826b..cc9de4cdb95cf 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm @@ -3,7 +3,7 @@ // normal transit tubes /obj/structure/c_transit_tube name = "unattached transit tube" - icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi' + icon = 'icons/obj/pipes_n_cables/transit_tube.dmi' icon_state = "straight" desc = "An unattached segment of transit tube." density = FALSE @@ -160,7 +160,7 @@ //see station.dm for the logic /obj/structure/c_transit_tube_pod name = "unattached transit tube pod" - icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi' + icon = 'icons/obj/pipes_n_cables/transit_tube.dmi' icon_state = "pod" desc = "Could probably be dragged into an open Transit Tube." anchored = FALSE diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm index fa52db037e253..32a9e6293ed54 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -2,7 +2,7 @@ #define MOVE_ANIMATION_STAGE_TWO 2 /obj/structure/transit_tube_pod - icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi' + icon = 'icons/obj/pipes_n_cables/transit_tube.dmi' icon_state = "pod" animate_movement = FORWARD_STEPS anchored = TRUE @@ -154,7 +154,7 @@ var/obj/structure/transit_tube/TT = locate(/obj/structure/transit_tube) in loc //landed on a turf without transit tube or not in our direction - if(!TT || (!(dir in TT.tube_dirs) && !(turn(dir,180) in TT.tube_dirs))) + if(!TT || (!(dir in TT.tube_dirs) && !(REVERSE_DIR(dir) in TT.tube_dirs))) outside_tube() /obj/structure/transit_tube_pod/proc/outside_tube() @@ -187,7 +187,7 @@ for(var/obj/structure/transit_tube/station/station in loc) if(station.pod_moving) return - if(direction == turn(station.boarding_dir,180)) + if(direction == REVERSE_DIR(station.boarding_dir)) if(station.open_status == STATION_TUBE_OPEN) user.forceMove(loc) update_appearance() diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm index 67b452ed3a8f6..124237fa59719 100644 --- a/code/game/objects/structures/traps.dm +++ b/code/game/objects/structures/traps.dm @@ -1,7 +1,7 @@ /obj/structure/trap name = "IT'S A TRAP" desc = "Stepping on me is a guaranteed bad day." - icon = 'icons/obj/hand_of_god_structures.dmi' + icon = 'icons/obj/service/hand_of_god_structures.dmi' icon_state = "trap" density = FALSE anchored = TRUE @@ -102,7 +102,7 @@ /obj/structure/trap/stun/hunter name = "bounty trap" desc = "A trap that only goes off when a fugitive steps on it, announcing the location and stunning the target. You'd better avoid it." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/restraints.dmi' icon_state = "bounty_trap_on" stun_time = 200 sparks = FALSE //the item version gives them off to prevent runtimes (see Destroy()) @@ -143,7 +143,7 @@ /obj/item/bountytrap name = "bounty trap" desc = "A trap that only goes off when a fugitive steps on it, announcing the location and stunning the target. It's currently inactive." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/restraints.dmi' icon_state = "bounty_trap_off" var/obj/structure/trap/stun/hunter/stored_trap var/obj/item/radio/radio diff --git a/code/game/objects/structures/votingbox.dm b/code/game/objects/structures/votingbox.dm index 317fab20ed0c3..0e46a0b4444ea 100644 --- a/code/game/objects/structures/votingbox.dm +++ b/code/game/objects/structures/votingbox.dm @@ -5,7 +5,7 @@ name = "voting box" desc = "An automatic voting box." - icon = 'icons/obj/votebox.dmi' + icon = 'icons/obj/storage/box.dmi' icon_state = "votebox_maint" anchored = TRUE diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 4da2eb83493b1..6ba07a90e68d1 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -16,7 +16,8 @@ . = ..() open = round(rand(0, 1)) update_appearance() - + if(mapload && SSmapping.level_trait(z, ZTRAIT_STATION)) + AddElement(/datum/element/lazy_fishing_spot, /datum/fish_source/toilet) /obj/structure/toilet/attack_hand(mob/living/user, list/modifiers) . = ..() @@ -120,8 +121,9 @@ return w_items += I.w_class to_chat(user, span_notice("You carefully place [I] into the cistern.")) + return - else if(is_reagent_container(I) && !user.combat_mode) + if(is_reagent_container(I) && !user.combat_mode) if (!open) return if(istype(I, /obj/item/food/monkeycube)) @@ -166,6 +168,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/urinal, 32) /obj/structure/urinal/Initialize(mapload) . = ..() hidden_item = new /obj/item/food/urinalcake + find_and_hang_on_wall() /obj/structure/urinal/attack_hand(mob/living/user, list/modifiers) . = ..() @@ -248,6 +251,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/urinal, 32) /datum/reagent/ammonia = 1, ) foodtypes = TOXIC | GROSS + preserved_food = TRUE /obj/item/food/urinalcake/attack_self(mob/living/user) user.visible_message(span_notice("[user] squishes [src]!"), span_notice("You squish [src]."), "You hear a squish.") @@ -386,7 +390,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink, (-14)) return FALSE if(RG.is_refillable()) if(!RG.reagents.holder_full()) - reagents.trans_to(RG, RG.amount_per_transfer_from_this, transfered_by = user) + reagents.trans_to(RG, RG.amount_per_transfer_from_this, transferred_by = user) begin_reclamation() to_chat(user, span_notice("You fill [RG] from [src].")) return TRUE @@ -409,7 +413,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink, (-14)) if(reagents.total_volume <= 0) to_chat(user, span_notice("\The [src] is dry.")) return FALSE - reagents.trans_to(O, 5, transfered_by = user) + reagents.trans_to(O, 5, transferred_by = user) begin_reclamation() to_chat(user, span_notice("You wet [O] in [src].")) playsound(loc, 'sound/effects/slosh.ogg', 25, TRUE) @@ -587,6 +591,12 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink/kitchen, (-16)) var/busy = FALSE //Something's being washed at the moment var/dispensedreagent = /datum/reagent/water // for whenever plumbing happens +/obj/structure/water_source/Initialize(mapload) + . = ..() + + create_reagents(INFINITY, NO_REACT) + reagents.add_reagent(dispensedreagent, INFINITY) + /obj/structure/water_source/attack_hand(mob/living/user, list/modifiers) . = ..() if(.) @@ -740,6 +750,12 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink/kitchen, (-16)) /// if it can be seen through when closed var/opaque_closed = FALSE +/obj/structure/curtain/Initialize(mapload) + // see-through curtains should let emissives shine through + if(!opaque_closed) + blocks_emissive = EMISSIVE_BLOCK_NONE + return ..() + /obj/structure/curtain/proc/toggle() open = !open if(open) @@ -815,6 +831,14 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink/kitchen, (-16)) alpha = 255 opaque_closed = TRUE +/obj/structure/curtain/bounty/start_closed + icon_state = "bounty-closed" + +/obj/structure/curtain/bounty/start_closed/Initialize(mapload) + . = ..() + if(open) + toggle() + /obj/structure/curtain/cloth color = null alpha = 255 diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index ae705bdf8928a..46eb13ee2b7c1 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -30,7 +30,7 @@ var/state = "01" //How far the door assembly has progressed can_atmos_pass = ATMOS_PASS_PROC -/obj/structure/windoor_assembly/Initialize(mapload, loc, set_dir) +/obj/structure/windoor_assembly/Initialize(mapload, set_dir) . = ..() if(set_dir) setDir(set_dir) @@ -98,7 +98,7 @@ switch(state) if("01") if(W.tool_behaviour == TOOL_WELDER && !anchored) - if(!W.tool_start_check(user, amount=0)) + if(!W.tool_start_check(user, amount=1)) return user.visible_message(span_notice("[user] disassembles the windoor assembly."), @@ -267,55 +267,11 @@ span_notice("You start prying the windoor into the frame...")) if(W.use_tool(src, user, 40, volume=100) && electronics) - set_density(TRUE) //Shouldn't matter but just incase - to_chat(user, span_notice("You finish the windoor.")) - - if(secure) - var/obj/machinery/door/window/brigdoor/windoor = new /obj/machinery/door/window/brigdoor(loc) - if(facing == "l") - windoor.icon_state = "leftsecureopen" - windoor.base_state = "leftsecure" - else - windoor.icon_state = "rightsecureopen" - windoor.base_state = "rightsecure" - windoor.setDir(dir) - windoor.set_density(FALSE) - - if(electronics.one_access) - windoor.req_one_access = electronics.accesses - else - windoor.req_access = electronics.accesses - windoor.electronics = electronics - electronics.forceMove(windoor) - if(created_name) - windoor.name = created_name - qdel(src) - windoor.close() - - else - var/obj/machinery/door/window/windoor = new /obj/machinery/door/window(loc) - if(facing == "l") - windoor.icon_state = "leftopen" - windoor.base_state = "left" - else - windoor.icon_state = "rightopen" - windoor.base_state = "right" - windoor.setDir(dir) - windoor.set_density(FALSE) - - if(electronics.one_access) - windoor.req_one_access = electronics.accesses - else - windoor.req_access = electronics.accesses - windoor.electronics = electronics - electronics.forceMove(windoor) - if(created_name) - windoor.name = created_name - qdel(src) - windoor.close() + to_chat(user, span_notice("You finish the windoor.")) + finish_door() else return ..() @@ -323,6 +279,54 @@ //Update to reflect changes(if applicable) update_appearance() +/obj/structure/windoor_assembly/proc/finish_door() + var/obj/machinery/door/window/windoor + if(secure) + windoor = new /obj/machinery/door/window/brigdoor(loc) + if(facing == "l") + windoor.icon_state = "leftsecureopen" + windoor.base_state = "leftsecure" + else + windoor.icon_state = "rightsecureopen" + windoor.base_state = "rightsecure" + + else + windoor = new /obj/machinery/door/window(loc) + if(facing == "l") + windoor.icon_state = "leftopen" + windoor.base_state = "left" + else + windoor.icon_state = "rightopen" + windoor.base_state = "right" + + windoor.setDir(dir) + windoor.set_density(FALSE) + if(created_name) + windoor.name = created_name + else if(electronics.passed_name) + windoor.name = electronics.passed_name + if(electronics.one_access) + windoor.req_one_access = electronics.accesses + else + windoor.req_access = electronics.accesses + if(electronics.unres_sides) + windoor.unres_sides = electronics.unres_sides + switch(dir) + if(NORTH,SOUTH) + windoor.unres_sides &= ~EAST + windoor.unres_sides &= ~WEST + if(EAST,WEST) + windoor.unres_sides &= ~NORTH + windoor.unres_sides &= ~SOUTH + windoor.unres_sensor = TRUE + electronics.forceMove(windoor) + windoor.electronics = electronics + windoor.autoclose = TRUE + windoor.close() + windoor.update_appearance() + + qdel(src) + /obj/structure/windoor_assembly/AltClick(mob/user) return ..() // This hotkey is BLACKLISTED since it's used by /datum/component/simple_rotation diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 372f9c6570bfa..77ac1f1174032 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -93,7 +93,7 @@ /obj/structure/window/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 20, "cost" = 5) + return list("mode" = RCD_DECONSTRUCT, "delay" = 2 SECONDS, "cost" = 5) return FALSE /obj/structure/window/rcd_act(mob/user, obj/item/construction/rcd/the_rcd) @@ -314,7 +314,7 @@ return TRUE -/obj/structure/window/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) +/obj/structure/window/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armour_penetration = 0) . = ..() if(.) //received damage update_nearby_icons() @@ -479,7 +479,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/unanchored/spawner, 0) /obj/structure/window/reinforced/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 30, "cost" = 15) + return list("mode" = RCD_DECONSTRUCT, "delay" = 3 SECONDS, "cost" = 15) return FALSE /obj/structure/window/reinforced/attackby_secondary(obj/item/tool, mob/user, params) @@ -670,7 +670,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tinted/frosted/spaw /obj/structure/window/fulltile/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 25, "cost" = 10) + return list("mode" = RCD_DECONSTRUCT, "delay" = 2.5 SECONDS, "cost" = 10) return FALSE /obj/structure/window/fulltile/unanchored @@ -727,7 +727,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tinted/frosted/spaw /obj/structure/window/reinforced/fulltile/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 40, "cost" = 20) + return list("mode" = RCD_DECONSTRUCT, "delay" = 4 SECONDS, "cost" = 20) return FALSE /obj/structure/window/reinforced/fulltile/unanchored diff --git a/code/game/say.dm b/code/game/say.dm index 36fa6a5a85094..e2f3934dac3b1 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -102,9 +102,9 @@ GLOBAL_LIST_INIT(freqtospan, list( filter += tts_filter.Join(",") if(voice && found_client) - INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), src, html_decode(tts_message_to_use), message_language, voice, filter.Join(","), listened, message_range = range) + INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), src, html_decode(tts_message_to_use), message_language, voice, filter.Join(","), listened, message_range = range, pitch = pitch) -/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, visible_name = FALSE) +/atom/movable/proc/compose_message(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), visible_name = FALSE) //This proc uses [] because it is faster than continually appending strings. Thanks BYOND. //Basic span var/spanpart1 = "" @@ -113,13 +113,11 @@ GLOBAL_LIST_INIT(freqtospan, list( //Radio freq/name display var/freqpart = radio_freq ? "\[[get_radio_name(radio_freq)]\] " : "" //Speaker name - var/namepart = "[speaker.GetVoice()][speaker.get_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 if(visible_name && ishuman(speaker)) - var/mob/living/carbon/human/human_speaker = speaker - namepart = "[human_speaker.get_visible_name()]" //For if the message can be seen but not heard, shows "speaker"'s visible identity (like when using sign language) + var/namepart + var/list/stored_name = list(null) + SEND_SIGNAL(speaker, COMSIG_MOVABLE_MESSAGE_GET_NAME_PART, stored_name, visible_name) + namepart = stored_name[NAME_PART_INDEX] || "[speaker.GetVoice()]" + //End name span. var/endspanpart = "" @@ -236,8 +234,6 @@ GLOBAL_LIST_INIT(freqtospan, list( /atom/movable/proc/GetVoice() return "[src]" //Returns the atom's name, prepended with 'The' if it's not a proper noun -/atom/movable/proc/get_alt_name() - //HACKY VIRTUALSPEAKER STUFF BEYOND THIS POINT //these exist mostly to deal with the AIs hrefs and job stuff. diff --git a/code/game/shuttle_engines.dm b/code/game/shuttle_engines.dm index a4eb334549bfd..159dab78ceeb8 100644 --- a/code/game/shuttle_engines.dm +++ b/code/game/shuttle_engines.dm @@ -33,6 +33,10 @@ fire = 50 acid = 70 +/obj/machinery/power/shuttle_engine/Initialize(mapload) + . = ..() + register_context() + /obj/machinery/power/shuttle_engine/connect_to_shuttle(mapload, obj/docking_port/mobile/port, obj/docking_port/stationary/dock) . = ..() if(!port) @@ -49,6 +53,27 @@ unsync_ship() return ..() +/obj/machinery/power/shuttle_engine/examine(mob/user) + . = ..() + switch(engine_state) + if(ENGINE_UNWRENCHED) + . += span_notice("\The [src] is unbolted from the floor. It needs to be wrenched to the floor to be installed.") + if(ENGINE_WRENCHED) + . += span_notice("\The [src] is bolted to the floor and can be unbolted with a wrench. It needs to be welded to the floor to finish installation.") + if(ENGINE_WELDED) + . += span_notice("\The [src] is welded to the floor and can be unwelded. It is currently fully installed.") + +/obj/machinery/power/shuttle_engine/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) + if(held_item?.tool_behaviour == TOOL_WELDER && engine_state == ENGINE_WRENCHED) + context[SCREENTIP_CONTEXT_LMB] = "Weld to Floor" + if(held_item?.tool_behaviour == TOOL_WELDER && engine_state == ENGINE_WELDED) + context[SCREENTIP_CONTEXT_LMB] = "Unweld from Floor" + if(held_item?.tool_behaviour == TOOL_WRENCH && engine_state == ENGINE_UNWRENCHED) + context[SCREENTIP_CONTEXT_LMB] = "Wrench to Floor" + if(held_item?.tool_behaviour == TOOL_WRENCH && engine_state == ENGINE_WRENCHED) + context[SCREENTIP_CONTEXT_LMB] = "Unwrench from Floor" + return CONTEXTUAL_SCREENTIP_SET + /** * Called on destroy and when we need to unsync an engine from their ship. */ @@ -88,7 +113,7 @@ if(ENGINE_UNWRENCHED) to_chat(user, span_warning("The [src.name] needs to be wrenched to the floor!")) if(ENGINE_WRENCHED) - if(!tool.tool_start_check(user, amount=0)) + if(!tool.tool_start_check(user, amount=round(ENGINE_WELDTIME / 5))) return TRUE user.visible_message(span_notice("[user.name] starts to weld the [name] to the floor."), \ @@ -101,7 +126,7 @@ alter_engine_power(engine_power) if(ENGINE_WELDED) - if(!tool.tool_start_check(user, amount=0)) + if(!tool.tool_start_check(user, amount=round(ENGINE_WELDTIME / 5))) return TRUE user.visible_message(span_notice("[user.name] starts to cut the [name] free from the floor."), \ @@ -162,7 +187,7 @@ /obj/machinery/power/shuttle_engine/large name = "engine" - icon = 'icons/obj/2x2.dmi' + icon = 'icons/obj/fluff/2x2.dmi' icon_state = "large_engine" desc = "A very large bluespace engine used to propel very large ships." circuit = null @@ -173,7 +198,7 @@ /obj/machinery/power/shuttle_engine/huge name = "engine" - icon = 'icons/obj/3x3.dmi' + icon = 'icons/obj/fluff/3x3.dmi' icon_state = "huge_engine" desc = "An extremely large bluespace engine used to propel extremely large ships." circuit = null diff --git a/code/game/sound.dm b/code/game/sound.dm index c1dec90898a69..02ee2954fd7e8 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -57,8 +57,8 @@ . = list()//output everything that successfully heard the sound - var/turf/above_turf = SSmapping.get_turf_above(turf_source) - var/turf/below_turf = SSmapping.get_turf_below(turf_source) + var/turf/above_turf = GET_TURF_ABOVE(turf_source) + var/turf/below_turf = GET_TURF_BELOW(turf_source) if(ignore_walls) @@ -184,35 +184,35 @@ /proc/get_sfx(soundin) if(istext(soundin)) switch(soundin) - if (SFX_SHATTER) + if(SFX_SHATTER) soundin = pick('sound/effects/glassbr1.ogg','sound/effects/glassbr2.ogg','sound/effects/glassbr3.ogg') - if (SFX_EXPLOSION) + if(SFX_EXPLOSION) soundin = pick('sound/effects/explosion1.ogg','sound/effects/explosion2.ogg') - if (SFX_EXPLOSION_CREAKING) + if(SFX_EXPLOSION_CREAKING) soundin = pick('sound/effects/explosioncreak1.ogg', 'sound/effects/explosioncreak2.ogg') - if (SFX_HULL_CREAKING) + if(SFX_HULL_CREAKING) soundin = pick('sound/effects/creak1.ogg', 'sound/effects/creak2.ogg', 'sound/effects/creak3.ogg') - if (SFX_SPARKS) + if(SFX_SPARKS) soundin = pick('sound/effects/sparks1.ogg','sound/effects/sparks2.ogg','sound/effects/sparks3.ogg','sound/effects/sparks4.ogg') - if (SFX_RUSTLE) + if(SFX_RUSTLE) soundin = pick('sound/effects/rustle1.ogg','sound/effects/rustle2.ogg','sound/effects/rustle3.ogg','sound/effects/rustle4.ogg','sound/effects/rustle5.ogg') - if (SFX_BODYFALL) + if(SFX_BODYFALL) soundin = pick('sound/effects/bodyfall1.ogg','sound/effects/bodyfall2.ogg','sound/effects/bodyfall3.ogg','sound/effects/bodyfall4.ogg') - if (SFX_PUNCH) + if(SFX_PUNCH) soundin = pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg') - if (SFX_CLOWN_STEP) + if(SFX_CLOWN_STEP) soundin = pick('sound/effects/footstep/clownstep1.ogg','sound/effects/footstep/clownstep2.ogg') - if (SFX_SUIT_STEP) + if(SFX_SUIT_STEP) soundin = pick('sound/effects/suitstep1.ogg','sound/effects/suitstep2.ogg') - if (SFX_SWING_HIT) + if(SFX_SWING_HIT) soundin = pick('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg') - if (SFX_HISS) + if(SFX_HISS) soundin = pick('sound/voice/hiss1.ogg','sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg') - if (SFX_PAGE_TURN) + if(SFX_PAGE_TURN) soundin = pick('sound/effects/pageturn1.ogg', 'sound/effects/pageturn2.ogg','sound/effects/pageturn3.ogg') - if (SFX_RICOCHET) + if(SFX_RICOCHET) soundin = 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') - if (SFX_TERMINAL_TYPE) + if(SFX_TERMINAL_TYPE) soundin = pick(list( 'sound/machines/terminal_button01.ogg', 'sound/machines/terminal_button02.ogg', @@ -223,11 +223,11 @@ 'sound/machines/terminal_button07.ogg', 'sound/machines/terminal_button08.ogg', )) - if (SFX_DESECRATION) + if(SFX_DESECRATION) soundin = pick('sound/misc/desecration-01.ogg', 'sound/misc/desecration-02.ogg', 'sound/misc/desecration-03.ogg') - if (SFX_IM_HERE) + if(SFX_IM_HERE) soundin = pick('sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg') - if (SFX_CAN_OPEN) + if(SFX_CAN_OPEN) soundin = pick('sound/effects/can_open1.ogg', 'sound/effects/can_open2.ogg', 'sound/effects/can_open3.ogg') if(SFX_BULLET_MISS) soundin = pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg') @@ -260,7 +260,7 @@ 'sound/weapons/bladeslice.ogg', 'sound/weapons/flashbang.ogg', )) - if("goose") + if(SFX_GOOSE) soundin = pick('sound/creatures/goose1.ogg', 'sound/creatures/goose2.ogg', 'sound/creatures/goose3.ogg', 'sound/creatures/goose4.ogg') if(SFX_WARPSPEED) soundin = 'sound/runtime/hyperspace/hyperspace_begin.ogg' @@ -414,4 +414,6 @@ soundin = pick('sound/effects/treechop1.ogg', 'sound/effects/treechop2.ogg', 'sound/effects/treechop3.ogg') if(SFX_ROCK_TAP) soundin = pick('sound/effects/rocktap1.ogg', 'sound/effects/rocktap2.ogg', 'sound/effects/rocktap3.ogg') + if(SFX_SEAR) + soundin = 'sound/weapons/sear.ogg' return soundin diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 37ff89cb8445c..e7e2974d2f18f 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -100,7 +100,9 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( //We do this here so anything that doesn't want to persist can clear itself var/list/old_listen_lookup = _listen_lookup?.Copy() var/list/old_signal_procs = _signal_procs?.Copy() + var/carryover_turf_flags = (RESERVATION_TURF | UNUSED_RESERVATION_TURF) & turf_flags var/turf/new_turf = new path(src) + new_turf.turf_flags |= carryover_turf_flags // WARNING WARNING // Turfs DO NOT lose their signals when they get replaced, REMEMBER THIS @@ -211,7 +213,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( else if(excited || excited_group) SSair.remove_from_active(src) //Clean up wall excitement, and refresh excited groups - if(ispath(path,/turf/closed) || ispath(path,/turf/cordon)) + if(ispath(path, /turf/closed) || ispath(path, /turf/cordon)) flags |= CHANGETURF_RECALC_ADJACENT return ..() diff --git a/code/game/turfs/closed/_closed.dm b/code/game/turfs/closed/_closed.dm index 38e3df19cc43e..8ccaabc46c0af 100644 --- a/code/game/turfs/closed/_closed.dm +++ b/code/game/turfs/closed/_closed.dm @@ -15,356 +15,3 @@ /turf/closed/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) return FALSE - -/turf/closed/indestructible - name = "wall" - desc = "Effectively impervious to conventional methods of destruction." - icon = 'icons/turf/walls.dmi' - explosive_resistance = 50 - -/turf/closed/indestructible/rust_heretic_act() - return - -/turf/closed/indestructible/TerraformTurf(path, new_baseturf, flags, defer_change = FALSE, ignore_air = FALSE) - return - -/turf/closed/indestructible/acid_act(acidpwr, acid_volume, acid_id) - return FALSE - -/turf/closed/indestructible/Melt() - to_be_destroyed = FALSE - return src - -/turf/closed/indestructible/singularity_act() - return - -/turf/closed/indestructible/oldshuttle - name = "strange shuttle wall" - icon = 'icons/turf/shuttleold.dmi' - icon_state = "block" - -/turf/closed/indestructible/weeb - name = "paper wall" - desc = "Reinforced paper walling. Someone really doesn't want you to leave." - icon = 'icons/obj/smooth_structures/paperframes.dmi' - icon_state = "paperframes-0" - base_icon_state = "paperframes" - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_PAPERFRAME - canSmoothWith = SMOOTH_GROUP_PAPERFRAME - var/static/mutable_appearance/indestructible_paper = mutable_appearance('icons/obj/smooth_structures/paperframes.dmi',icon_state = "paper", layer = CLOSED_TURF_LAYER - 0.1) - -/turf/closed/indestructible/weeb/Initialize(mapload) - . = ..() - update_appearance() - -/turf/closed/indestructible/weeb/update_overlays() - . = ..() - . += indestructible_paper - -/turf/closed/indestructible/sandstone - name = "sandstone wall" - desc = "A wall with sandstone plating. Rough." - icon = 'icons/turf/walls/sandstone_wall.dmi' - icon_state = "sandstone_wall-0" - base_icon_state = "sandstone_wall" - baseturfs = /turf/closed/indestructible/sandstone - smoothing_flags = SMOOTH_BITMASK - -/turf/closed/indestructible/oldshuttle/corner - icon_state = "corner" - -/turf/closed/indestructible/splashscreen - name = "Space Station 13" - desc = null - icon = 'icons/blanks/blank_title.png' - icon_state = "" - pixel_x = -64 - plane = SPLASHSCREEN_PLANE - bullet_bounce_sound = null - -INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) - -/turf/closed/indestructible/splashscreen/Initialize(mapload) - . = ..() - SStitle.splash_turf = src - if(SStitle.icon) - icon = SStitle.icon - handle_generic_titlescreen_sizes() - -///helper proc that will center the screen if the icon is changed to a generic width, to make admins have to fudge around with pixel_x less. returns null -/turf/closed/indestructible/splashscreen/proc/handle_generic_titlescreen_sizes() - var/icon/size_check = icon(SStitle.icon, icon_state) - var/width = size_check.Width() - if(width == 480) // 480x480 is nonwidescreen - pixel_x = 0 - else if(width == 608) // 608x480 is widescreen - pixel_x = -64 - -/turf/closed/indestructible/splashscreen/vv_edit_var(var_name, var_value) - . = ..() - if(.) - switch(var_name) - if(NAMEOF(src, icon)) - SStitle.icon = icon - handle_generic_titlescreen_sizes() - -/turf/closed/indestructible/splashscreen/examine() - desc = pick(strings(SPLASH_FILE, "splashes")) - return ..() - -/turf/closed/indestructible/start_area - name = null - desc = null - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - -/turf/closed/indestructible/reinforced - name = "reinforced wall" - desc = "A huge chunk of reinforced metal used to separate rooms. Effectively impervious to conventional methods of destruction." - icon = 'icons/turf/walls/reinforced_wall.dmi' - icon_state = "reinforced_wall-0" - base_icon_state = "reinforced_wall" - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS - canSmoothWith = SMOOTH_GROUP_WALLS - - -/turf/closed/indestructible/riveted - icon = 'icons/turf/walls/riveted.dmi' - icon_state = "riveted-0" - base_icon_state = "riveted" - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_CLOSED_TURFS - canSmoothWith = SMOOTH_GROUP_CLOSED_TURFS - -/turf/closed/indestructible/syndicate - icon = 'icons/turf/walls/plastitanium_wall.dmi' - icon_state = "plastitanium_wall-0" - base_icon_state = "plastitanium_wall" - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_SYNDICATE_WALLS - canSmoothWith = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_PLASTITANIUM_WALLS + SMOOTH_GROUP_SYNDICATE_WALLS - -/turf/closed/indestructible/riveted/uranium - icon = 'icons/turf/walls/uranium_wall.dmi' - icon_state = "uranium_wall-0" - base_icon_state = "uranium_wall" - smoothing_flags = SMOOTH_BITMASK - -/turf/closed/indestructible/riveted/plastinum - name = "plastinum wall" - desc = "A luxurious wall made out of a plasma-platinum alloy. Effectively impervious to conventional methods of destruction." - icon = 'icons/turf/walls/plastinum_wall.dmi' - icon_state = "plastinum_wall-0" - base_icon_state = "plastinum_wall" - smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS - smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_PLASTINUM_WALLS + SMOOTH_GROUP_CLOSED_TURFS - canSmoothWith = SMOOTH_GROUP_PLASTINUM_WALLS - -/turf/closed/indestructible/riveted/plastinum/nodiagonal - icon_state = "map-shuttle_nd" - smoothing_flags = SMOOTH_BITMASK - -/turf/closed/indestructible/wood - icon = 'icons/turf/walls/wood_wall.dmi' - icon_state = "wood_wall-0" - base_icon_state = "wood_wall" - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_WOOD_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS - canSmoothWith = SMOOTH_GROUP_WOOD_WALLS - - -/turf/closed/indestructible/alien - name = "alien wall" - desc = "A wall with alien alloy plating." - icon = 'icons/turf/walls/abductor_wall.dmi' - icon_state = "abductor_wall-0" - base_icon_state = "abductor_wall" - smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS - smoothing_groups = SMOOTH_GROUP_ABDUCTOR_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS - canSmoothWith = SMOOTH_GROUP_ABDUCTOR_WALLS - - -/turf/closed/indestructible/cult - name = "runed metal wall" - desc = "A cold metal wall engraved with indecipherable symbols. Studying them causes your head to pound. Effectively impervious to conventional methods of destruction." - icon = 'icons/turf/walls/cult_wall.dmi' - icon_state = "cult_wall-0" - base_icon_state = "cult_wall" - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS - canSmoothWith = SMOOTH_GROUP_WALLS - - -/turf/closed/indestructible/abductor - icon_state = "alien1" - -/turf/closed/indestructible/opshuttle - icon_state = "wall3" - - -/turf/closed/indestructible/fakeglass - name = "window" - icon = 'icons/obj/smooth_structures/reinforced_window.dmi' - icon_state = "fake_window" - base_icon_state = "reinforced_window" - opacity = FALSE - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE - canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE - -/turf/closed/indestructible/fakeglass/Initialize(mapload) - . = ..() - underlays += mutable_appearance('icons/obj/structures.dmi', "grille", layer - 0.01) //add a grille underlay - underlays += mutable_appearance('icons/turf/floors.dmi', "plating", layer - 0.02) //add the plating underlay, below the grille - -/turf/closed/indestructible/opsglass - name = "window" - icon = 'icons/obj/smooth_structures/plastitanium_window.dmi' - icon_state = "plastitanium_window-0" - base_icon_state = "plastitanium_window" - opacity = FALSE - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM - canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM - -/turf/closed/indestructible/opsglass/Initialize(mapload) - . = ..() - icon_state = null - underlays += mutable_appearance('icons/obj/structures.dmi', "grille", layer - 0.01) - underlays += mutable_appearance('icons/turf/floors.dmi', "plating", layer - 0.02) - -/turf/closed/indestructible/fakedoor - name = "airlock" - icon = 'icons/obj/doors/airlocks/centcom/centcom.dmi' - icon_state = "fake_door" - -/turf/closed/indestructible/fakedoor/maintenance - icon = 'icons/obj/doors/airlocks/hatch/maintenance.dmi' - -/turf/closed/indestructible/fakedoor/glass_airlock - icon = 'icons/obj/doors/airlocks/external/external.dmi' - opacity = FALSE - -/turf/closed/indestructible/fakedoor/engineering - icon = 'icons/obj/doors/airlocks/station/engineering.dmi' - -/turf/closed/indestructible/rock - name = "dense rock" - desc = "An extremely densely-packed rock, most mining tools or explosives would never get through this." - icon = 'icons/turf/mining.dmi' - icon_state = "rock" - -/turf/closed/indestructible/rock/snow - name = "mountainside" - desc = "An extremely densely-packed rock, sheeted over with centuries worth of ice and snow." - icon = 'icons/turf/walls.dmi' - icon_state = "snowrock" - bullet_sizzle = TRUE - bullet_bounce_sound = null - -/turf/closed/indestructible/rock/snow/ice - name = "iced rock" - desc = "Extremely densely-packed sheets of ice and rock, forged over the years of the harsh cold." - icon = 'icons/turf/walls.dmi' - icon_state = "icerock" - -/turf/closed/indestructible/rock/snow/ice/ore - icon = 'icons/turf/walls/icerock_wall.dmi' - icon_state = "icerock_wall-0" - base_icon_state = "icerock_wall" - smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER - canSmoothWith = SMOOTH_GROUP_CLOSED_TURFS - pixel_x = -4 - pixel_y = -4 - -/turf/closed/indestructible/paper - name = "thick paper wall" - desc = "A wall layered with impenetrable sheets of paper." - icon = 'icons/turf/walls.dmi' - icon_state = "paperwall" - -/turf/closed/indestructible/necropolis - name = "necropolis wall" - desc = "A seemingly impenetrable wall." - icon = 'icons/turf/walls.dmi' - icon_state = "necro" - explosive_resistance = 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." - icon = 'icons/turf/walls/iron_wall.dmi' - icon_state = "iron_wall-0" - base_icon_state = "iron_wall" - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_IRON_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS - canSmoothWith = SMOOTH_GROUP_IRON_WALLS - opacity = FALSE - -/turf/closed/indestructible/riveted/boss - name = "necropolis wall" - desc = "A thick, seemingly indestructible stone wall." - icon = 'icons/turf/walls/boss_wall.dmi' - icon_state = "boss_wall-0" - base_icon_state = "boss_wall" - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_BOSS_WALLS - canSmoothWith = SMOOTH_GROUP_BOSS_WALLS - explosive_resistance = 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/hierophant_wall.dmi' - icon_state = "wall" - smoothing_flags = SMOOTH_CORNERS - smoothing_groups = SMOOTH_GROUP_HIERO_WALL - canSmoothWith = SMOOTH_GROUP_HIERO_WALL - -/turf/closed/indestructible/resin - name = "resin wall" - icon = 'icons/obj/smooth_structures/alien/resin_wall.dmi' - icon_state = "resin_wall-0" - base_icon_state = "resin_wall" - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_ALIEN_WALLS + SMOOTH_GROUP_ALIEN_RESIN - canSmoothWith = SMOOTH_GROUP_ALIEN_WALLS - -/turf/closed/indestructible/resin/membrane - name = "resin membrane" - icon = 'icons/obj/smooth_structures/alien/resin_membrane.dmi' - icon_state = "resin_membrane-0" - base_icon_state = "resin_membrane" - opacity = FALSE - smoothing_groups = SMOOTH_GROUP_ALIEN_WALLS + SMOOTH_GROUP_ALIEN_RESIN - canSmoothWith = SMOOTH_GROUP_ALIEN_WALLS - -/turf/closed/indestructible/resin/membrane/Initialize(mapload) - . = ..() - underlays += mutable_appearance('icons/turf/floors.dmi', "engine") // add the reinforced floor underneath - -/turf/closed/indestructible/grille - name = "grille" - icon = 'icons/obj/structures.dmi' - icon_state = "grille" - base_icon_state = "grille" - -/turf/closed/indestructible/grille/Initialize(mapload) - . = ..() - underlays += mutable_appearance('icons/turf/floors.dmi', "plating") diff --git a/code/game/turfs/closed/indestructible.dm b/code/game/turfs/closed/indestructible.dm new file mode 100644 index 0000000000000..44717faaf6918 --- /dev/null +++ b/code/game/turfs/closed/indestructible.dm @@ -0,0 +1,358 @@ +/turf/closed/indestructible + name = "wall" + desc = "Effectively impervious to conventional methods of destruction." + icon = 'icons/turf/walls.dmi' + explosive_resistance = 50 + +/turf/closed/indestructible/rust_heretic_act() + return + +/turf/closed/indestructible/TerraformTurf(path, new_baseturf, flags, defer_change = FALSE, ignore_air = FALSE) + return + +/turf/closed/indestructible/acid_act(acidpwr, acid_volume, acid_id) + return FALSE + +/turf/closed/indestructible/Melt() + to_be_destroyed = FALSE + return src + +/turf/closed/indestructible/singularity_act() + return + +/turf/closed/indestructible/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/poster) && Adjacent(user)) + return place_poster(attacking_item, user) + + return ..() + +/turf/closed/indestructible/oldshuttle + name = "strange shuttle wall" + icon = 'icons/turf/shuttleold.dmi' + icon_state = "block" + +/turf/closed/indestructible/weeb + name = "paper wall" + desc = "Reinforced paper walling. Someone really doesn't want you to leave." + icon = 'icons/obj/smooth_structures/paperframes.dmi' + icon_state = "paperframes-0" + base_icon_state = "paperframes" + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_PAPERFRAME + canSmoothWith = SMOOTH_GROUP_PAPERFRAME + var/static/mutable_appearance/indestructible_paper = mutable_appearance('icons/obj/smooth_structures/paperframes.dmi',icon_state = "paper", layer = CLOSED_TURF_LAYER - 0.1) + +/turf/closed/indestructible/weeb/Initialize(mapload) + . = ..() + update_appearance() + +/turf/closed/indestructible/weeb/update_overlays() + . = ..() + . += indestructible_paper + +/turf/closed/indestructible/sandstone + name = "sandstone wall" + desc = "A wall with sandstone plating. Rough." + icon = 'icons/turf/walls/sandstone_wall.dmi' + icon_state = "sandstone_wall-0" + base_icon_state = "sandstone_wall" + baseturfs = /turf/closed/indestructible/sandstone + smoothing_flags = SMOOTH_BITMASK + +/turf/closed/indestructible/oldshuttle/corner + icon_state = "corner" + +/turf/closed/indestructible/splashscreen + name = "Space Station 13" + desc = null + icon = 'icons/blanks/blank_title.png' + icon_state = "" + pixel_x = -64 + plane = SPLASHSCREEN_PLANE + bullet_bounce_sound = null + +INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) + +/turf/closed/indestructible/splashscreen/Initialize(mapload) + . = ..() + SStitle.splash_turf = src + if(SStitle.icon) + icon = SStitle.icon + handle_generic_titlescreen_sizes() + +///helper proc that will center the screen if the icon is changed to a generic width, to make admins have to fudge around with pixel_x less. returns null +/turf/closed/indestructible/splashscreen/proc/handle_generic_titlescreen_sizes() + var/icon/size_check = icon(SStitle.icon, icon_state) + var/width = size_check.Width() + if(width == 480) // 480x480 is nonwidescreen + pixel_x = 0 + else if(width == 608) // 608x480 is widescreen + pixel_x = -64 + +/turf/closed/indestructible/splashscreen/vv_edit_var(var_name, var_value) + . = ..() + if(.) + switch(var_name) + if(NAMEOF(src, icon)) + SStitle.icon = icon + handle_generic_titlescreen_sizes() + +/turf/closed/indestructible/splashscreen/examine() + desc = pick(strings(SPLASH_FILE, "splashes")) + return ..() + +/turf/closed/indestructible/start_area + name = null + desc = null + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +/turf/closed/indestructible/reinforced + name = "reinforced wall" + desc = "A huge chunk of reinforced metal used to separate rooms. Effectively impervious to conventional methods of destruction." + icon = 'icons/turf/walls/reinforced_wall.dmi' + icon_state = "reinforced_wall-0" + base_icon_state = "reinforced_wall" + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_WALLS + + +/turf/closed/indestructible/riveted + icon = 'icons/turf/walls/riveted.dmi' + icon_state = "riveted-0" + base_icon_state = "riveted" + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_CLOSED_TURFS + +/turf/closed/indestructible/syndicate + icon = 'icons/turf/walls/plastitanium_wall.dmi' + icon_state = "plastitanium_wall-0" + base_icon_state = "plastitanium_wall" + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_SYNDICATE_WALLS + canSmoothWith = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_PLASTITANIUM_WALLS + SMOOTH_GROUP_SYNDICATE_WALLS + +/turf/closed/indestructible/riveted/uranium + icon = 'icons/turf/walls/uranium_wall.dmi' + icon_state = "uranium_wall-0" + base_icon_state = "uranium_wall" + smoothing_flags = SMOOTH_BITMASK + +/turf/closed/indestructible/riveted/plastinum + name = "plastinum wall" + desc = "A luxurious wall made out of a plasma-platinum alloy. Effectively impervious to conventional methods of destruction." + icon = 'icons/turf/walls/plastinum_wall.dmi' + icon_state = "plastinum_wall-0" + base_icon_state = "plastinum_wall" + smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS + smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_PLASTINUM_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_PLASTINUM_WALLS + +/turf/closed/indestructible/riveted/plastinum/nodiagonal + icon_state = "map-shuttle_nd" + smoothing_flags = SMOOTH_BITMASK + +/turf/closed/indestructible/wood + icon = 'icons/turf/walls/wood_wall.dmi' + icon_state = "wood_wall-0" + base_icon_state = "wood_wall" + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_WOOD_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_WOOD_WALLS + + +/turf/closed/indestructible/alien + name = "alien wall" + desc = "A wall with alien alloy plating." + icon = 'icons/turf/walls/abductor_wall.dmi' + icon_state = "abductor_wall-0" + base_icon_state = "abductor_wall" + smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS + smoothing_groups = SMOOTH_GROUP_ABDUCTOR_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_ABDUCTOR_WALLS + + +/turf/closed/indestructible/cult + name = "runed metal wall" + desc = "A cold metal wall engraved with indecipherable symbols. Studying them causes your head to pound. Effectively impervious to conventional methods of destruction." + icon = 'icons/turf/walls/cult_wall.dmi' + icon_state = "cult_wall-0" + base_icon_state = "cult_wall" + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_WALLS + + +/turf/closed/indestructible/abductor + icon_state = "alien1" + +/turf/closed/indestructible/opshuttle + icon_state = "wall3" + + +/turf/closed/indestructible/fakeglass + name = "window" + icon = 'icons/obj/smooth_structures/reinforced_window.dmi' + icon_state = "fake_window" + base_icon_state = "reinforced_window" + opacity = FALSE + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE + canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE + +/turf/closed/indestructible/fakeglass/Initialize(mapload) + . = ..() + underlays += mutable_appearance('icons/obj/structures.dmi', "grille", layer - 0.01) //add a grille underlay + underlays += mutable_appearance('icons/turf/floors.dmi', "plating", layer - 0.02) //add the plating underlay, below the grille + +/turf/closed/indestructible/opsglass + name = "window" + icon = 'icons/obj/smooth_structures/plastitanium_window.dmi' + icon_state = "plastitanium_window-0" + base_icon_state = "plastitanium_window" + opacity = FALSE + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM + canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM + +/turf/closed/indestructible/opsglass/Initialize(mapload) + . = ..() + icon_state = null + underlays += mutable_appearance('icons/obj/structures.dmi', "grille", layer - 0.01) + underlays += mutable_appearance('icons/turf/floors.dmi', "plating", layer - 0.02) + +/turf/closed/indestructible/fakedoor + name = "airlock" + icon = 'icons/obj/doors/airlocks/centcom/centcom.dmi' + icon_state = "fake_door" + +/turf/closed/indestructible/fakedoor/maintenance + icon = 'icons/obj/doors/airlocks/hatch/maintenance.dmi' + +/turf/closed/indestructible/fakedoor/glass_airlock + icon = 'icons/obj/doors/airlocks/external/external.dmi' + opacity = FALSE + +/turf/closed/indestructible/fakedoor/engineering + icon = 'icons/obj/doors/airlocks/station/engineering.dmi' + +/turf/closed/indestructible/rock + name = "dense rock" + desc = "An extremely densely-packed rock, most mining tools or explosives would never get through this." + icon = 'icons/turf/mining.dmi' + icon_state = "rock" + +/turf/closed/indestructible/rock/snow + name = "mountainside" + desc = "An extremely densely-packed rock, sheeted over with centuries worth of ice and snow." + icon = 'icons/turf/walls.dmi' + icon_state = "snowrock" + bullet_sizzle = TRUE + bullet_bounce_sound = null + +/turf/closed/indestructible/rock/snow/ice + name = "iced rock" + desc = "Extremely densely-packed sheets of ice and rock, forged over the years of the harsh cold." + icon = 'icons/turf/walls.dmi' + icon_state = "icerock" + +/turf/closed/indestructible/rock/snow/ice/ore + icon = 'icons/turf/walls/icerock_wall.dmi' + icon_state = "icerock_wall-0" + base_icon_state = "icerock_wall" + smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER + canSmoothWith = SMOOTH_GROUP_CLOSED_TURFS + pixel_x = -4 + pixel_y = -4 + +/turf/closed/indestructible/paper + name = "thick paper wall" + desc = "A wall layered with impenetrable sheets of paper." + icon = 'icons/turf/walls.dmi' + icon_state = "paperwall" + +/turf/closed/indestructible/necropolis + name = "necropolis wall" + desc = "A seemingly impenetrable wall." + icon = 'icons/turf/walls.dmi' + icon_state = "necro" + explosive_resistance = 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." + icon = 'icons/turf/walls/iron_wall.dmi' + icon_state = "iron_wall-0" + base_icon_state = "iron_wall" + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_IRON_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_IRON_WALLS + opacity = FALSE + +/turf/closed/indestructible/riveted/boss + name = "necropolis wall" + desc = "A thick, seemingly indestructible stone wall." + icon = 'icons/turf/walls/boss_wall.dmi' + icon_state = "boss_wall-0" + base_icon_state = "boss_wall" + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_BOSS_WALLS + canSmoothWith = SMOOTH_GROUP_BOSS_WALLS + explosive_resistance = 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/hierophant_wall.dmi' + icon_state = "wall" + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = SMOOTH_GROUP_HIERO_WALL + canSmoothWith = SMOOTH_GROUP_HIERO_WALL + +/turf/closed/indestructible/resin + name = "resin wall" + icon = 'icons/obj/smooth_structures/alien/resin_wall.dmi' + icon_state = "resin_wall-0" + base_icon_state = "resin_wall" + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_ALIEN_WALLS + SMOOTH_GROUP_ALIEN_RESIN + canSmoothWith = SMOOTH_GROUP_ALIEN_WALLS + +/turf/closed/indestructible/resin/membrane + name = "resin membrane" + icon = 'icons/obj/smooth_structures/alien/resin_membrane.dmi' + icon_state = "resin_membrane-0" + base_icon_state = "resin_membrane" + opacity = FALSE + smoothing_groups = SMOOTH_GROUP_ALIEN_WALLS + SMOOTH_GROUP_ALIEN_RESIN + canSmoothWith = SMOOTH_GROUP_ALIEN_WALLS + +/turf/closed/indestructible/resin/membrane/Initialize(mapload) + . = ..() + underlays += mutable_appearance('icons/turf/floors.dmi', "engine") // add the reinforced floor underneath + +/turf/closed/indestructible/grille + name = "grille" + icon = 'icons/obj/structures.dmi' + icon_state = "grille" + base_icon_state = "grille" + +/turf/closed/indestructible/grille/Initialize(mapload) + . = ..() + underlays += mutable_appearance('icons/turf/floors.dmi', "plating") diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm index 6be28e9c0b333..7b4defa96e773 100644 --- a/code/game/turfs/closed/minerals.dm +++ b/code/game/turfs/closed/minerals.dm @@ -704,7 +704,7 @@ /turf/closed/mineral/gibtonite/proc/countdown(notify_admins = FALSE) set waitfor = FALSE while(istype(src, /turf/closed/mineral/gibtonite) && stage == GIBTONITE_ACTIVE && det_time > 0 && mineralAmt >= 1) - flick_overlay_view(image('icons/turf/smoothrocks.dmi', src, "rock_Gibtonite_active"), 5) //makes the animation pulse one time per tick + flick_overlay_view(mutable_appearance('icons/turf/smoothrocks.dmi', "rock_Gibtonite_active", ON_EDGED_TURF_LAYER + 0.1), 0.5 SECONDS) //makes the animation pulse one time per tick det_time-- sleep(0.5 SECONDS) if(istype(src, /turf/closed/mineral/gibtonite)) @@ -712,7 +712,7 @@ var/turf/bombturf = get_turf(src) mineralAmt = 0 stage = GIBTONITE_DETONATE - explosion(bombturf, devastation_range = 1, heavy_impact_range = 3, light_impact_range = 5, adminlog = notify_admins, explosion_cause = src) + explosion(bombturf, devastation_range = 1, heavy_impact_range = 3, light_impact_range = 5, flame_range = 0, flash_range = 0, adminlog = notify_admins, explosion_cause = src) /turf/closed/mineral/gibtonite/proc/defuse(mob/living/defuser) if(stage == GIBTONITE_ACTIVE) @@ -739,15 +739,15 @@ var/turf/bombturf = get_turf(src) mineralAmt = 0 stage = GIBTONITE_DETONATE - explosion(bombturf, devastation_range = 1, heavy_impact_range = 2, light_impact_range = 5, adminlog = FALSE, explosion_cause = src) + explosion(bombturf, devastation_range = 1, heavy_impact_range = 2, light_impact_range = 5, flame_range = 0, flash_range = 0, adminlog = FALSE, explosion_cause = src) if(stage == GIBTONITE_STABLE) //Gibtonite deposit is now benign and extractable. Depending on how close you were to it blowing up before defusing, you get better quality ore. var/obj/item/gibtonite/G = new (src) if(det_time <= 0) G.quality = 3 - G.icon_state = "Gibtonite ore 3" + G.icon_state = "gibtonite_3" if(det_time >= 1 && det_time <= 2) G.quality = 2 - G.icon_state = "Gibtonite ore 2" + G.icon_state = "gibtonite_2" var/flags = NONE var/old_type = type diff --git a/code/game/turfs/closed/wall/reinf_walls.dm b/code/game/turfs/closed/wall/reinf_walls.dm index d496c7f438b5b..e3e088d2c29f1 100644 --- a/code/game/turfs/closed/wall/reinf_walls.dm +++ b/code/game/turfs/closed/wall/reinf_walls.dm @@ -74,7 +74,7 @@ if(COVER) if(W.tool_behaviour == TOOL_WELDER) - if(!W.tool_start_check(user, amount=0)) + if(!W.tool_start_check(user, amount=2)) return to_chat(user, span_notice("You begin slicing through the metal cover...")) if(W.use_tool(src, user, 60, volume=100)) @@ -107,7 +107,7 @@ return TRUE if(W.tool_behaviour == TOOL_WELDER) - if(!W.tool_start_check(user, amount=0)) + if(!W.tool_start_check(user, amount=2)) return to_chat(user, span_notice("You begin welding the metal cover back to the frame...")) if(W.use_tool(src, user, 60, volume=100)) @@ -141,7 +141,7 @@ if(SUPPORT_RODS) if(W.tool_behaviour == TOOL_WELDER) - if(!W.tool_start_check(user, amount=0)) + if(!W.tool_start_check(user, amount=2)) return to_chat(user, span_notice("You begin slicing through the support rods...")) if(W.use_tool(src, user, 100, volume=100)) @@ -211,12 +211,12 @@ dismantle_wall() /turf/closed/wall/r_wall/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - if(the_rcd.canRturf) + if(the_rcd.canRturf || the_rcd.construction_mode == RCD_WALLFRAME) return ..() /turf/closed/wall/r_wall/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) - if(the_rcd.canRturf) + if(the_rcd.canRturf || passed_mode == RCD_WALLFRAME) return ..() /turf/closed/wall/r_wall/rust_heretic_act() diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm index 9e4f62486592c..57d3505fcdbf9 100644 --- a/code/game/turfs/closed/walls.dm +++ b/code/game/turfs/closed/walls.dm @@ -1,4 +1,5 @@ #define MAX_DENT_DECALS 15 +#define LEANING_OFFSET 11 /turf/closed/wall name = "wall" @@ -33,6 +34,50 @@ var/list/dent_decals +/turf/closed/wall/MouseDrop_T(mob/living/carbon/carbon_mob, mob/user) + ..() + if(carbon_mob != user) + return + if(carbon_mob.is_leaning == TRUE) + return + if(carbon_mob.pulledby) + return + if(!carbon_mob.density) + return + var/turf/checked_turf = get_step(carbon_mob, REVERSE_DIR(carbon_mob.dir)) + if(checked_turf == src) + carbon_mob.start_leaning(src) + +/mob/living/carbon/proc/start_leaning(obj/wall) + + switch(dir) + if(SOUTH) + pixel_y += LEANING_OFFSET + if(NORTH) + pixel_y += -LEANING_OFFSET + if(WEST) + pixel_x += LEANING_OFFSET + if(EAST) + pixel_x += -LEANING_OFFSET + + ADD_TRAIT(src, TRAIT_UNDENSE, LEANING_TRAIT) + ADD_TRAIT(src, TRAIT_EXPANDED_FOV, LEANING_TRAIT) + visible_message(span_notice("[src] leans against \the [wall]!"), \ + span_notice("You lean against \the [wall]!")) + RegisterSignals(src, list(COMSIG_MOB_CLIENT_PRE_MOVE, COMSIG_HUMAN_DISARM_HIT, COMSIG_LIVING_GET_PULLED, COMSIG_MOVABLE_TELEPORTING, COMSIG_ATOM_DIR_CHANGE), PROC_REF(stop_leaning)) + update_fov() + is_leaning = TRUE + +/mob/living/carbon/proc/stop_leaning() + SIGNAL_HANDLER + UnregisterSignal(src, list(COMSIG_MOB_CLIENT_PRE_MOVE, COMSIG_HUMAN_DISARM_HIT, COMSIG_LIVING_GET_PULLED, COMSIG_MOVABLE_TELEPORTING, COMSIG_ATOM_DIR_CHANGE)) + is_leaning = FALSE + pixel_y = base_pixel_y + body_position_pixel_x_offset + pixel_x = base_pixel_y + body_position_pixel_y_offset + REMOVE_TRAIT(src, TRAIT_UNDENSE, LEANING_TRAIT) + REMOVE_TRAIT(src, TRAIT_EXPANDED_FOV, LEANING_TRAIT) + update_fov() + /turf/closed/wall/Initialize(mapload) . = ..() if(!can_engrave) @@ -202,7 +247,7 @@ return FALSE if(W.tool_behaviour == TOOL_WELDER) - if(!W.tool_start_check(user, amount=0)) + if(!W.tool_start_check(user, amount=1)) return FALSE to_chat(user, span_notice("You begin fixing dents on the wall...")) @@ -231,7 +276,7 @@ /turf/closed/wall/proc/try_decon(obj/item/I, mob/user) if(I.tool_behaviour == TOOL_WELDER) - if(!I.tool_start_check(user, amount=0)) + if(!I.tool_start_check(user, amount=round(slicing_duration / 50))) return FALSE to_chat(user, span_notice("You begin slicing through the outer plating...")) @@ -264,20 +309,15 @@ /turf/closed/wall/get_dumping_location() return null -/turf/closed/wall/acid_act(acidpwr, acid_volume) - if(get_explosive_block() >= 2) - acidpwr = min(acidpwr, 50) //we reduce the power so strong walls never get melted. - return ..() - /turf/closed/wall/acid_melt() dismantle_wall(1) /turf/closed/wall/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 40, "cost" = 26) + return list("mode" = RCD_DECONSTRUCT, "delay" = 4 SECONDS, "cost" = 26) if(RCD_WALLFRAME) - return list("mode" = RCD_WALLFRAME, "delay" = 10, "cost" = 25) + return list("mode" = RCD_WALLFRAME, "delay" = 1 SECONDS, "cost" = 8) return FALSE /turf/closed/wall/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) @@ -324,3 +364,4 @@ girder_type = /obj/structure/foamedmetal #undef MAX_DENT_DECALS +#undef LEANING_OFFSET diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 240b9765948f1..7831fa1863c5b 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -124,6 +124,9 @@ /turf/open/indestructible/light icon_state = "light_on-1" +/turf/open/indestructible/plating + icon_state = "plating" + /turf/open/indestructible/permalube icon_state = "darkfull" @@ -287,7 +290,7 @@ else if(!(lube & SLIP_WHEN_CRAWLING) && (slipper.body_position == LYING_DOWN || !(slipper.status_flags & CANKNOCKDOWN))) // can't slip unbuckled mob if they're lying or can't fall. return FALSE - if(slipper.m_intent == MOVE_INTENT_WALK && (lube & NO_SLIP_WHEN_WALKING)) + if(slipper.move_intent == MOVE_INTENT_WALK && (lube & NO_SLIP_WHEN_WALKING)) return FALSE if(!(lube & SLIDE_ICE)) diff --git a/code/game/turfs/open/asteroid.dm b/code/game/turfs/open/asteroid.dm index 526bdf9cfcace..c15261a988059 100644 --- a/code/game/turfs/open/asteroid.dm +++ b/code/game/turfs/open/asteroid.dm @@ -50,24 +50,9 @@ if(has_floor_variance && prob(floor_variance)) icon_state = "[base_icon_state][rand(0,12)]" -/// Drops itemstack when dug and changes icon -/turf/open/misc/asteroid/proc/getDug() - dug = TRUE - broken = TRUE - new dig_result(src, 5) - if (prob(worm_chance)) - new /obj/item/food/bait/worm(src) - update_appearance() - -/// If the user can dig the turf -/turf/open/misc/asteroid/proc/can_dig(mob/user) - if(!dug) - return TRUE - if(user) - to_chat(user, span_warning("Looks like someone has dug here already!")) - /turf/open/misc/asteroid/burn_tile() return + /turf/open/misc/asteroid/MakeSlippery(wet_setting, min_wet_time, wet_time_to_add, max_wet_time, permanent) return @@ -77,12 +62,12 @@ /turf/open/misc/asteroid/ex_act(severity, target) return FALSE -/turf/open/misc/asteroid/attackby(obj/item/W, mob/user, params) +/turf/open/misc/asteroid/attackby(obj/item/attack_item, mob/user, params) . = ..() if(.) return TRUE - if(W.tool_behaviour == TOOL_SHOVEL || W.tool_behaviour == TOOL_MINING) + if(attack_item.tool_behaviour == TOOL_SHOVEL || attack_item.tool_behaviour == TOOL_MINING) if(!can_dig(user)) return TRUE @@ -91,16 +76,42 @@ balloon_alert(user, "digging...") - if(W.use_tool(src, user, 40, volume=50)) + if(attack_item.use_tool(src, user, 4 SECONDS, volume = 50)) if(!can_dig(user)) return TRUE getDug() - SSblackbox.record_feedback("tally", "pick_used_mining", 1, W.type) + SSblackbox.record_feedback("tally", "pick_used_mining", 1, attack_item.type) return TRUE - else if(istype(W, /obj/item/storage/bag/ore)) - for(var/obj/item/stack/ore/O in src) - SEND_SIGNAL(W, COMSIG_ATOM_ATTACKBY, O) + else if(istype(attack_item, /obj/item/storage/bag/ore)) + for(var/obj/item/stack/ore/dropped_ore in src) + SEND_SIGNAL(attack_item, COMSIG_ATOM_ATTACKBY, dropped_ore) +/// Drops itemstack when dug and changes icon +/turf/open/misc/asteroid/proc/getDug() + if(dug || broken) + return + dug = TRUE + broken = TRUE + new dig_result(src, 5) + if(prob(worm_chance)) + new /obj/item/food/bait/worm(src) + update_appearance() + +/// If the user can dig the turf +/turf/open/misc/asteroid/proc/can_dig(mob/user) + if(!dug && !broken) + return TRUE + if(user) + balloon_alert(user, "already excavated!") + +///Refills the previously dug tile +/turf/open/misc/asteroid/proc/refill_dug() + dug = FALSE + broken = FALSE + icon_state = base_icon_state + if(has_floor_variance && prob(floor_variance)) + icon_state = "[base_icon_state][rand(0,12)]" + update_appearance() /turf/open/floor/plating/lavaland_baseturf baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface @@ -114,7 +125,6 @@ /turf/open/misc/asteroid/dug/broken_states() return list("asteroid_dug") - /turf/open/misc/asteroid/lavaland_atmos initial_gas_mix = LAVALAND_DEFAULT_ATMOS planetary_atmos = TRUE @@ -141,6 +151,11 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) GLOB.dug_up_basalt -= src return ..() +/turf/open/misc/asteroid/basalt/refill_dug() + . = ..() + GLOB.dug_up_basalt -= src + set_basalt_light(src) + /turf/open/misc/asteroid/basalt/lava //lava underneath baseturfs = /turf/open/lava/smooth @@ -220,7 +235,8 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) turf_flags = CAN_BE_DIRTY_1 | IS_SOLID | NO_RUST | NO_RUINS /turf/open/misc/asteroid/snow/icemoon/do_not_scrape - turf_flags = CAN_BE_DIRTY_1 | IS_SOLID | NO_RUST | NO_CLEARING + flags_1 = CAN_BE_DIRTY_1 + turf_flags = IS_SOLID | NO_RUST | NO_CLEARING /turf/open/lava/plasma/ice_moon initial_gas_mix = ICEMOON_DEFAULT_ATMOS diff --git a/code/game/turfs/open/chasm.dm b/code/game/turfs/open/chasm.dm index 09b8b32a42733..49f6663d09720 100644 --- a/code/game/turfs/open/chasm.dm +++ b/code/game/turfs/open/chasm.dm @@ -14,7 +14,7 @@ /turf/open/chasm/Initialize(mapload) . = ..() - apply_components() + apply_components(mapload) /// Lets people walk into chasms. /turf/open/chasm/CanAllowThrough(atom/movable/mover, border_dir) @@ -76,8 +76,8 @@ build_with_floor_tiles(C, user) /// Handles adding the chasm component to the turf (So stuff falls into it!) -/turf/open/chasm/proc/apply_components() - AddComponent(/datum/component/chasm, SSmapping.get_turf_below(src)) +/turf/open/chasm/proc/apply_components(mapload) + AddComponent(/datum/component/chasm, GET_TURF_BELOW(src), mapload) // Chasms for Lavaland, with planetary atmos and lava glow /turf/open/chasm/lavaland @@ -105,7 +105,6 @@ icon = 'icons/turf/floors/junglechasm.dmi' icon_state = "junglechasm-255" base_icon_state = "junglechasm" - initial_gas_mix = OPENTURF_LOW_PRESSURE planetary_atmos = TRUE baseturfs = /turf/open/chasm/jungle @@ -118,5 +117,5 @@ /turf/open/chasm/true desc = "There's nothing at the bottom. Absolutely nothing." -/turf/open/chasm/true/apply_components() - AddComponent(/datum/component/chasm) //Don't pass anything for below_turf. +/turf/open/chasm/true/apply_components(mapload) + AddComponent(/datum/component/chasm, null, mapload) //Don't pass anything for below_turf. diff --git a/code/game/turfs/open/cliff.dm b/code/game/turfs/open/cliff.dm new file mode 100644 index 0000000000000..aaae468d769c7 --- /dev/null +++ b/code/game/turfs/open/cliff.dm @@ -0,0 +1,133 @@ +/// A cliff tile from where people can fall. Should generally fall downwards, but you can change it if you want +/turf/open/cliff + icon_state = "cliff" + icon = 'icons/turf/cliff/cliff.dmi' + density = TRUE + /// From our perspective, where does someone need to stand to be able to fall from us? Cardinal only, we do the diagonals automatically + var/can_fall_from_direction = NORTH + /// If we fall, in which direction? + var/fall_direction = SOUTH + /// Directions to which we can move towards while grinding down + var/valid_move_dirs = SOUTH | WEST | EAST | SOUTHWEST | SOUTHEAST + /// Speed at which we fall / traverse downwards + var/fall_speed = 0.2 SECONDS + /// Movables that can move freely on cliffs + var/list/protected_types = list(/obj/projectile, /obj/effect, /mob/dead) + /// Do we draw a tile as underlay for half tiles? + var/turf/underlay_tile + /// The pixel x of the underlay image + var/undertile_pixel_x = 0 + /// The pixel y of the underlay image + var/undertile_pixel_y = 0 + /// if given, sets the underlays plane to this + var/underlay_plane + +/turf/open/cliff/Initialize(mapload) + . = ..() + + RegisterSignal(src, COMSIG_TURF_MOVABLE_THROW_LANDED, PROC_REF(on_turf_movable_throw_landed)) + + if(isnull(underlay_tile)) + return + var/image/underlay = image(icon_state = initial(underlay_tile.icon_state), icon = initial(underlay_tile.icon)) + underlay.pixel_x = undertile_pixel_x //if there's a pixel offset, correct it because we should be lined up with the grid + underlay.pixel_y = undertile_pixel_y + SET_PLANE(underlay, underlay_plane || plane, src) + underlays += underlay + +/turf/open/cliff/CanPass(atom/movable/mover, border_dir) + ..() + + if(border_dir & can_fall_from_direction || !can_fall(mover)) + return TRUE + + return FALSE + +/turf/open/cliff/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) + . = ..() + + try_fall(arrived) + +/turf/open/cliff/zImpact(atom/movable/falling, levels, turf/prev_turf, flags) + . = ..(flags = flags | FALL_INTERCEPTED) + +/// Something landed on us +/turf/open/cliff/proc/on_turf_movable_throw_landed(turf/turf, atom/movable/arrived) + SIGNAL_HANDLER + + try_fall(arrived) + +/// Try and make them fall +/turf/open/cliff/proc/try_fall(atom/movable/arrived) + if(can_fall(arrived)) + fall(arrived) + +/// Check if they can fall from us +/turf/open/cliff/proc/can_fall(atom/movable/arrived) + // Check if we're a protected type that doesnt make sense to fall (like effects and bullets) + if(is_type_in_list(arrived, protected_types)) + return FALSE + + if(arrived.throwing || HAS_TRAIT(arrived, TRAIT_CLIFF_WALKER) || HAS_TRAIT(arrived, TRAIT_MOVE_FLYING)) + return FALSE + + // We're already falling + if(arrived.anchored || (arrived in SScliff_falling.cliff_grinders)) + return FALSE + + // We can walk infront of the bottom cliff turf, so check that here + if(!iscliffturf(get_step(src, fall_direction)) && !(get_dir(arrived, src) & fall_direction)) + return FALSE + + return TRUE + +/// Make them fall! +/turf/open/cliff/proc/fall(atom/movable/arrived) + SScliff_falling.start_falling(arrived, src) //the movement is handled by the subsystem, but we get asked about behaviour later + on_fall(arrived) + +/// We just fell onto this chasm tile +/turf/open/cliff/proc/on_fall(atom/movable/faller) + if(!isliving(faller)) + return + var/mob/living/living = faller + living.Knockdown(fall_speed) //OUCH- OW- CRAP- SHIT- OW- + living.spin(fall_speed, fall_speed) + +/// Check if the movement direction we're moving on (while already falling on us) is valid +/turf/open/cliff/proc/can_move(atom/movable/mover, turf/target) + //check if the relative direction we're moving is allowed, if not we block the movement + if(!(valid_move_dirs & get_dir(src, target))) + return FALSE + + //we're trying to leave the cliff from somewhere that's not the bottom? no can do pall + if(!iscliffturf(target) && get_dir(src, target) != fall_direction) + return FALSE + + return TRUE + +/// Snowy cliff! +/turf/open/cliff/snowrock + icon_state = "icerock_wall-0" + icon = 'icons/turf/cliff/icerock_cliff.dmi' + base_icon_state = "icerock_wall" + + smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER + smoothing_groups = SMOOTH_GROUP_TURF_OPEN_CLIFF + canSmoothWith = SMOOTH_GROUP_TURF_OPEN_CLIFF + layer = EDGED_TURF_LAYER + plane = WALL_PLANE + + // 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()) + + undertile_pixel_x = 4 + undertile_pixel_y = 4 + + initial_gas_mix = ICEMOON_DEFAULT_ATMOS + planetary_atmos = TRUE + + underlay_tile = /turf/open/misc/asteroid/snow/icemoon + underlay_plane = FLOOR_PLANE diff --git a/code/game/turfs/open/floor.dm b/code/game/turfs/open/floor.dm index f2234981f48b4..42e4305c3d6be 100644 --- a/code/game/turfs/open/floor.dm +++ b/code/game/turfs/open/floor.dm @@ -213,49 +213,57 @@ src, RCD_MEMORY_WALL, ) if(RCD_REFLECTOR) - return list("mode" = RCD_REFLECTOR, "delay" = 20, "cost" = 30) + return list("mode" = RCD_REFLECTOR, "delay" = 2 SECONDS, "cost" = 20) if(RCD_AIRLOCK) if(the_rcd.airlock_glass) - return list("mode" = RCD_AIRLOCK, "delay" = 50, "cost" = 20) + return list("mode" = RCD_AIRLOCK, "delay" = 5 SECONDS, "cost" = 20) else - return list("mode" = RCD_AIRLOCK, "delay" = 50, "cost" = 16) + return list("mode" = RCD_AIRLOCK, "delay" = 5 SECONDS, "cost" = 16) if(RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 33) + return list("mode" = RCD_DECONSTRUCT, "delay" = 5 SECONDS, "cost" = 33) if(RCD_WINDOWGRILLE) + //default cost for building a grill for fulltile windows + var/cost = 4 + var/delay = 1 SECONDS + if(the_rcd.window_type == /obj/structure/window) + cost = 4 + delay = 2 SECONDS + else if(the_rcd.window_type == /obj/structure/window/reinforced) + cost = 6 + delay = 2.5 SECONDS return rcd_result_with_memory( - list("mode" = RCD_WINDOWGRILLE, "delay" = 1 SECONDS, "cost" = 4), + list("mode" = RCD_WINDOWGRILLE, "delay" = delay, "cost" = cost), src, RCD_MEMORY_WINDOWGRILLE, ) if(RCD_MACHINE) - return list("mode" = RCD_MACHINE, "delay" = 20, "cost" = 25) + return list("mode" = RCD_MACHINE, "delay" = 2 SECONDS, "cost" = 20) if(RCD_COMPUTER) - return list("mode" = RCD_COMPUTER, "delay" = 20, "cost" = 25) + return list("mode" = RCD_COMPUTER, "delay" = 2 SECONDS, "cost" = 20) if(RCD_FLOODLIGHT) - return list("mode" = RCD_FLOODLIGHT, "delay" = 30, "cost" = 35) + return list("mode" = RCD_FLOODLIGHT, "delay" = 3 SECONDS, "cost" = 20) + if(RCD_GIRDER) + return list("mode" = RCD_GIRDER, "delay" = 1.3 SECONDS, "cost" = 8) if(RCD_FURNISHING) var/cost = 0 var/delay = 0 if(the_rcd.furnish_type == /obj/structure/chair || the_rcd.furnish_type == /obj/structure/chair/stool) - cost = 8 - delay = 10 - else if(the_rcd.furnish_type == /obj/structure/chair/stool/bar) cost = 4 - delay = 5 + delay = 1 SECONDS else if(the_rcd.furnish_type == /obj/structure/chair/stool/bar) cost = 4 - delay = 5 + delay = 0.5 SECONDS else if(the_rcd.furnish_type == /obj/structure/table) - cost = 15 - delay = 20 + cost = 8 + delay = 2 SECONDS else if(the_rcd.furnish_type == /obj/structure/table/glass) - cost = 12 - delay = 15 + cost = 8 + delay = 2 SECONDS else if(the_rcd.furnish_type == /obj/structure/rack) - cost = 20 - delay = 25 + cost = 4 + delay = 2.5 SECONDS else if(the_rcd.furnish_type == /obj/structure/bed) - cost = 10 - delay = 15 + cost = 8 + delay = 1.5 SECONDS if(cost == 0) return FALSE return list("mode" = RCD_FURNISHING, "delay" = cost, "cost" = delay) @@ -287,15 +295,11 @@ continue balloon_alert(user, "there's already a door!") return FALSE - var/obj/machinery/door/window/new_window = new the_rcd.airlock_type(src, user.dir, the_rcd.airlock_electronics?.unres_sides) - if(the_rcd.airlock_electronics) - new_window.name = the_rcd.airlock_electronics.passed_name || initial(new_window.name) - if(the_rcd.airlock_electronics.one_access) - new_window.req_one_access = the_rcd.airlock_electronics.accesses.Copy() - else - new_window.req_access = the_rcd.airlock_electronics.accesses.Copy() - new_window.autoclose = TRUE - new_window.update_appearance() + //create the assembly and let it finish itself + var/obj/structure/windoor_assembly/assembly = new /obj/structure/windoor_assembly(src, user.dir) + assembly.secure = ispath(the_rcd.airlock_type, /obj/machinery/door/window/brigdoor) + assembly.electronics = the_rcd.airlock_electronics.create_copy(assembly) + assembly.finish_door() return TRUE for(var/obj/machinery/door/door in src) @@ -303,29 +307,15 @@ continue balloon_alert(user, "there's already a door!") return FALSE - var/obj/machinery/door/airlock/new_airlock = new the_rcd.airlock_type(src) - new_airlock.electronics = new /obj/item/electronics/airlock(new_airlock) - if(the_rcd.airlock_electronics) - new_airlock.electronics.accesses = the_rcd.airlock_electronics.accesses.Copy() - new_airlock.electronics.one_access = the_rcd.airlock_electronics.one_access - new_airlock.electronics.unres_sides = the_rcd.airlock_electronics.unres_sides - new_airlock.electronics.passed_name = the_rcd.airlock_electronics.passed_name - new_airlock.electronics.passed_cycle_id = the_rcd.airlock_electronics.passed_cycle_id - new_airlock.electronics.shell = the_rcd.airlock_electronics.shell - if(new_airlock.electronics.one_access) - new_airlock.req_one_access = new_airlock.electronics.accesses + //create the assembly and let it finish itself + var/obj/structure/door_assembly/assembly = new (src) + if(ispath(the_rcd.airlock_type, /obj/machinery/door/airlock/glass)) + assembly.glass = TRUE + assembly.glass_type = the_rcd.airlock_type else - new_airlock.req_access = new_airlock.electronics.accesses - if(new_airlock.electronics.unres_sides) - new_airlock.unres_sides = new_airlock.electronics.unres_sides - new_airlock.unres_sensor = TRUE - if(new_airlock.electronics.passed_name) - new_airlock.name = sanitize(new_airlock.electronics.passed_name) - if(new_airlock.electronics.passed_cycle_id) - new_airlock.closeOtherId = new_airlock.electronics.passed_cycle_id - new_airlock.update_other_id() - new_airlock.autoclose = TRUE - new_airlock.update_appearance() + assembly.airlock_type = the_rcd.airlock_type + assembly.electronics = the_rcd.airlock_electronics.create_copy(assembly) + assembly.finish_door() return TRUE if(RCD_DECONSTRUCT) if(rcd_proof) @@ -335,6 +325,21 @@ return FALSE return TRUE if(RCD_WINDOWGRILLE) + //check if we are building a window + var/obj/structure/window/window_path = the_rcd.window_type + if(!ispath(window_path)) + CRASH("Invalid window path type in RCD: [window_path]") + + //allow directional windows to be built without grills + if(!initial(window_path.fulltile)) + if(!valid_build_direction(src, user.dir, is_fulltile = FALSE)) + balloon_alert(user, "window already here!") + return FALSE + var/obj/structure/window/WD = new the_rcd.window_type(src, user.dir) + WD.set_anchored(TRUE) + return TRUE + + //build grills to deal with full tile windows if(locate(/obj/structure/grille) in src) return FALSE var/obj/structure/grille/new_grille = new(src) @@ -365,6 +370,11 @@ new_floodlight.icon_state = "floodlight_c3" new_floodlight.state = FLOODLIGHT_NEEDS_LIGHTS return TRUE + if(RCD_GIRDER) + if(locate(/obj/structure/girder) in src) + return FALSE + new /obj/structure/girder(src) + return TRUE if(RCD_FURNISHING) if(locate(the_rcd.furnish_type) in src) return FALSE diff --git a/code/game/turfs/open/floor/fancy_floor.dm b/code/game/turfs/open/floor/fancy_floor.dm index f6c5fd8afb9c3..79ed8f766ac88 100644 --- a/code/game/turfs/open/floor/fancy_floor.dm +++ b/code/game/turfs/open/floor/fancy_floor.dm @@ -470,7 +470,7 @@ /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, EMISSIVE_PLANE, null, emissive_alpha, GLOB.emissive_color, smoothing_junction) /turf/open/floor/carpet/neon/simple name = "simple neon carpet" diff --git a/code/game/turfs/open/floor/glass.dm b/code/game/turfs/open/floor/glass.dm index beb1535e69469..af2a0bec5bffb 100644 --- a/code/game/turfs/open/floor/glass.dm +++ b/code/game/turfs/open/floor/glass.dm @@ -21,8 +21,8 @@ var/list/glow_stuff /// How much alpha to leave when cutting away emissive blockers var/alpha_to_leave = 255 - /// Color of starlight to use - var/starlight_color = COLOR_STARLIGHT + /// Color of starlight to use. Defaults to STARLIGHT_COLOR if not set + var/starlight_color /turf/open/floor/glass/broken_states() return list("glass-damaged1", "glass-damaged2", "glass-damaged3") @@ -51,7 +51,7 @@ return glow_stuff = partially_block_emissives(src, alpha_to_leave) - set_light(2, 0.75, starlight_color) + set_light(2, 0.75, starlight_color || GLOB.starlight_color) /turf/open/floor/glass/make_plating() return diff --git a/code/game/turfs/open/floor/plating.dm b/code/game/turfs/open/floor/plating.dm index 7a2ca30a0b15b..1ff83fec0c36c 100644 --- a/code/game/turfs/open/floor/plating.dm +++ b/code/game/turfs/open/floor/plating.dm @@ -252,7 +252,7 @@ if(PLATE_BOLTS_LOOSENED) switch(tool_used.tool_behaviour) if(TOOL_WELDER) - if(!tool_used.tool_start_check(user, amount=0)) + if(!tool_used.tool_start_check(user, amount=3)) return balloon_alert(user, "slicing...") if(tool_used.use_tool(src, user, 15 SECONDS, volume=100)) @@ -287,7 +287,7 @@ return TRUE if(TOOL_WELDER) - if(!tool_used.tool_start_check(user, amount=0)) + if(!tool_used.tool_start_check(user, amount=3)) return balloon_alert(user, "welding back on...") if(tool_used.use_tool(src, user, 15 SECONDS, volume=100)) diff --git a/code/game/turfs/open/floor/reinforced_floor.dm b/code/game/turfs/open/floor/reinforced_floor.dm index 1912f4dc872c1..1d8338d6b8734 100644 --- a/code/game/turfs/open/floor/reinforced_floor.dm +++ b/code/game/turfs/open/floor/reinforced_floor.dm @@ -50,10 +50,6 @@ ScrapeAway(flags = CHANGETURF_INHERIT_AIR) return TRUE -/turf/open/floor/engine/acid_act(acidpwr, acid_volume) - acidpwr = min(acidpwr, 50) //we reduce the power so reinf floor never get melted. - return ..() - /turf/open/floor/engine/ex_act(severity, target) if(target == src) ScrapeAway(flags = CHANGETURF_INHERIT_AIR) diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index eceee21c816e2..b8e0494966204 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -38,10 +38,13 @@ var/mask_icon = 'icons/turf/floors.dmi' /// The icon state that covers the lava bits of our turf var/mask_state = "lava-lightmask" + /// The type for the preset fishing spot of this type of turf. + var/fish_source_type = /datum/fish_source/lavaland /turf/open/lava/Initialize(mapload) . = ..() - AddElement(/datum/element/lazy_fishing_spot, FISHING_SPOT_PRESET_LAVALAND_LAVA) + if(fish_source_type) + AddElement(/datum/element/lazy_fishing_spot, fish_source_type) refresh_light() if(!smoothing_flags) update_appearance() @@ -67,10 +70,10 @@ var/border_turf = FALSE var/list/turfs_to_check = RANGE_TURFS(1, src) if(GET_LOWEST_STACK_OFFSET(z)) - var/turf/above = SSmapping.get_turf_above(src) + var/turf/above = GET_TURF_ABOVE(src) if(above) turfs_to_check += RANGE_TURFS(1, above) - var/turf/below = SSmapping.get_turf_below(src) + var/turf/below = GET_TURF_BELOW(src) if(below) turfs_to_check += RANGE_TURFS(1, below) @@ -92,10 +95,10 @@ // We have gone from a lava turf to a non lava turf, time to let them know var/list/turfs_to_check = RANGE_TURFS(1, result) if(GET_LOWEST_STACK_OFFSET(z)) - var/turf/above = SSmapping.get_turf_above(result) + var/turf/above = GET_TURF_ABOVE(result) if(above) turfs_to_check += RANGE_TURFS(1, above) - var/turf/below = SSmapping.get_turf_below(result) + var/turf/below = GET_TURF_BELOW(result) if(below) turfs_to_check += RANGE_TURFS(1, below) for(var/turf/open/lava/inform in turfs_to_check) @@ -134,12 +137,13 @@ /turf/open/lava/Exited(atom/movable/gone, direction) . = ..() - if(isliving(gone)) - var/mob/living/leaving_mob = gone - if(!islava(leaving_mob.loc)) - REMOVE_TRAIT(leaving_mob, TRAIT_PERMANENTLY_ONFIRE, TURF_TRAIT) - if(!leaving_mob.on_fire) - leaving_mob.update_fire() + if(isliving(gone) && !islava(gone.loc)) + REMOVE_TRAIT(gone, TRAIT_PERMANENTLY_ONFIRE, TURF_TRAIT) + +/turf/open/lava/Destroy() + for(var/mob/living/leaving_mob in contents) + REMOVE_TRAIT(leaving_mob, TRAIT_PERMANENTLY_ONFIRE, TURF_TRAIT) + return ..() /turf/open/lava/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) if(burn_stuff(AM)) @@ -216,13 +220,9 @@ return TRUE /turf/open/lava/proc/is_safe() - //if anything matching this typecache is found in the lava, we don't burn things - var/static/list/lava_safeties_typecache = typecacheof(list(/obj/structure/lattice/catwalk, /obj/structure/stone_tile, /obj/structure/lattice/lava)) - var/list/found_safeties = typecache_filter_list(contents, lava_safeties_typecache) - for(var/obj/structure/stone_tile/S in found_safeties) - if(S.fallen) - LAZYREMOVE(found_safeties, S) - return LAZYLEN(found_safeties) + if(HAS_TRAIT(src, TRAIT_LAVA_STOPPED)) + return TRUE + return FALSE ///Generic return value of the can_burn_stuff() proc. Does nothing. #define LAVA_BE_IGNORING 0 @@ -345,6 +345,7 @@ icon_state = "liquidplasma" initial_gas_mix = BURNING_COLD baseturfs = /turf/open/lava/plasma + fish_source_type = /datum/fish_source/lavaland/icemoon light_range = 3 light_power = 0.75 @@ -388,11 +389,14 @@ for(var/obj/item/bodypart/burn_limb as anything in burn_human.bodyparts) if(IS_ORGANIC_LIMB(burn_limb) && burn_limb.limb_id != SPECIES_PLASMAMAN) //getting every organic, non-plasmaman limb (augments/androids are immune to this) plasma_parts += burn_limb - if(!IS_ORGANIC_LIMB(burn_limb)) + if(IS_ROBOTIC_LIMB(burn_limb)) robo_parts += burn_limb - burn_human.adjustToxLoss(15, required_biotype = MOB_ORGANIC) // This is from plasma, so it should obey plasma biotype requirements - burn_human.adjustFireLoss(25) + var/need_mob_update + need_mob_update += burn_human.adjustToxLoss(15, updating_health = FALSE, required_biotype = MOB_ORGANIC) // This is from plasma, so it should obey plasma biotype requirements + need_mob_update += burn_human.adjustFireLoss(25, updating_health = FALSE) + if(need_mob_update) + burn_human.updatehealth() if(plasma_parts.len) var/obj/item/bodypart/burn_limb = pick(plasma_parts) //using the above-mentioned list to get a choice of limbs burn_human.emote("scream") @@ -426,8 +430,10 @@ initial_gas_mix = OPENTURF_DEFAULT_ATMOS baseturfs = /turf/open/lava/plasma/mafia slowdown = 0 + fish_source_type = null //basketball specific lava (normal atmos, no slowdown) /turf/open/lava/smooth/basketball initial_gas_mix = OPENTURF_DEFAULT_ATMOS slowdown = 0 + fish_source_type = null diff --git a/code/game/turfs/open/misc.dm b/code/game/turfs/open/misc.dm index a3c3433ab6b36..cbbae3081a221 100644 --- a/code/game/turfs/open/misc.dm +++ b/code/game/turfs/open/misc.dm @@ -84,47 +84,46 @@ else return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 3) if(RCD_REFLECTOR) - return list("mode" = RCD_REFLECTOR, "delay" = 20, "cost" = 30) + return list("mode" = RCD_REFLECTOR, "delay" = 2 SECONDS, "cost" = 20) if(RCD_AIRLOCK) if(the_rcd.airlock_glass) - return list("mode" = RCD_AIRLOCK, "delay" = 50, "cost" = 20) + return list("mode" = RCD_AIRLOCK, "delay" = 5 SECONDS, "cost" = 20) else - return list("mode" = RCD_AIRLOCK, "delay" = 50, "cost" = 16) + return list("mode" = RCD_AIRLOCK, "delay" = 5 SECONDS, "cost" = 16) if(RCD_WINDOWGRILLE) return rcd_result_with_memory( list("mode" = RCD_WINDOWGRILLE, "delay" = 1 SECONDS, "cost" = 4), src, RCD_MEMORY_WINDOWGRILLE, ) if(RCD_MACHINE) - return list("mode" = RCD_MACHINE, "delay" = 20, "cost" = 25) + return list("mode" = RCD_MACHINE, "delay" = 2 SECONDS, "cost" = 20) if(RCD_COMPUTER) - return list("mode" = RCD_COMPUTER, "delay" = 20, "cost" = 25) + return list("mode" = RCD_COMPUTER, "delay" = 2 SECONDS, "cost" = 20) if(RCD_FLOODLIGHT) - return list("mode" = RCD_FLOODLIGHT, "delay" = 30, "cost" = 35) + return list("mode" = RCD_FLOODLIGHT, "delay" = 3 SECONDS, "cost" = 20) + if(RCD_GIRDER) + return list("mode" = RCD_GIRDER, "delay" = 1.3 SECONDS, "cost" = 8) if(RCD_FURNISHING) var/cost = 0 var/delay = 0 if(the_rcd.furnish_type == /obj/structure/chair || the_rcd.furnish_type == /obj/structure/chair/stool) - cost = 8 - delay = 10 - else if(the_rcd.furnish_type == /obj/structure/chair/stool/bar) cost = 4 - delay = 5 + delay = 1 SECONDS else if(the_rcd.furnish_type == /obj/structure/chair/stool/bar) cost = 4 - delay = 5 + delay = 0.5 SECONDS else if(the_rcd.furnish_type == /obj/structure/table) - cost = 15 - delay = 20 + cost = 8 + delay = 2 SECONDS else if(the_rcd.furnish_type == /obj/structure/table/glass) - cost = 12 - delay = 15 + cost = 8 + delay = 2 SECONDS else if(the_rcd.furnish_type == /obj/structure/rack) - cost = 20 - delay = 25 + cost = 4 + delay = 2.5 SECONDS else if(the_rcd.furnish_type == /obj/structure/bed) - cost = 10 - delay = 15 + cost = 8 + delay = 1.5 SECONDS if(!cost) return FALSE return list("mode" = RCD_FURNISHING, "delay" = cost, "cost" = delay) @@ -222,6 +221,11 @@ new_floodlight.icon_state = "floodlight_c3" new_floodlight.state = FLOODLIGHT_NEEDS_LIGHTS return TRUE + if(RCD_GIRDER) + if(locate(/obj/structure/girder) in src) + return FALSE + new /obj/structure/girder(src) + return TRUE if(RCD_FURNISHING) if(locate(the_rcd.furnish_type) in src) return FALSE diff --git a/code/game/turfs/open/openspace.dm b/code/game/turfs/open/openspace.dm index 23d561e4af606..91437e727a79b 100644 --- a/code/game/turfs/open/openspace.dm +++ b/code/game/turfs/open/openspace.dm @@ -23,7 +23,9 @@ // I am so sorry /turf/open/openspace/Initialize(mapload) // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker . = ..() - RegisterSignal(src, COMSIG_ATOM_INITIALIZED_ON, PROC_REF(on_atom_created)) + if(PERFORM_ALL_TESTS(focus_only/openspace_clear) && !GET_TURF_BELOW(src)) + stack_trace("[src] was inited as openspace with nothing below it at ([x], [y], [z])") + RegisterSignal(src, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, PROC_REF(on_atom_created)) var/area/our_area = loc if(istype(our_area, /area/space)) force_no_gravity = TRUE @@ -34,7 +36,7 @@ AddElement(/datum/element/turf_z_transparency) /turf/open/openspace/ChangeTurf(path, list/new_baseturfs, flags) - UnregisterSignal(src, COMSIG_ATOM_INITIALIZED_ON) + UnregisterSignal(src, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON) return ..() /** @@ -54,15 +56,13 @@ if(movable.set_currently_z_moving(CURRENTLY_Z_FALLING)) zFall(movable, falling_from_move = TRUE) /** - * Drops movables spawned on this turf only after they are successfully initialized. - * so flying mobs, qdeleted movables and things that were moved somewhere else during - * Initialize() won't fall by accident. + * Drops movables spawned on this turf after they are successfully initialized. + * so that spawned movables that should fall to gravity, will fall. */ /turf/open/openspace/proc/on_atom_created(datum/source, atom/created_atom) SIGNAL_HANDLER if(ismovable(created_atom)) - //Drop it only when it's finished initializing, not before. - addtimer(CALLBACK(src, PROC_REF(zfall_if_on_turf), created_atom), 0 SECONDS) + zfall_if_on_turf(created_atom) /turf/open/openspace/proc/zfall_if_on_turf(atom/movable/movable) if(QDELETED(movable) || movable.loc != src) @@ -179,7 +179,7 @@ /turf/open/openspace/icemoon/Initialize(mapload) . = ..() - var/turf/T = below() + var/turf/T = GET_TURF_BELOW(src) //I wonder if I should error here if(!T) return diff --git a/code/game/turfs/open/planet.dm b/code/game/turfs/open/planet.dm index 88f9518a08e07..65c76cef957a7 100644 --- a/code/game/turfs/open/planet.dm +++ b/code/game/turfs/open/planet.dm @@ -14,11 +14,31 @@ heavyfootstep = FOOTSTEP_GENERIC_HEAVY tiled_dirt = FALSE +/turf/open/misc/dirt/station + name = "dirt flooring" //FOR THE LOVE OF GOD USE THIS INSTEAD OF DIRT FOR STATION MAPS + desc = "You heard this place was dirty, but this is just absurd." + baseturfs = /turf/open/floor/plating + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + planetary_atmos = FALSE + +/turf/open/misc/dirt/jungle + slowdown = 0.5 + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + /turf/open/misc/dirt/dark icon_state = "greenerdirt" base_icon_state = "greenerdirt" -/turf/open/misc/dirt/jungle +/turf/open/misc/dirt/dark/station + baseturfs = /turf/open/floor/plating + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + planetary_atmos = FALSE + +/turf/open/misc/dirt/dark/station/airless + initial_gas_mix = AIRLESS_ATMOS + temperature = TCMB + +/turf/open/misc/dirt/dark/jungle slowdown = 0.5 initial_gas_mix = OPENTURF_DEFAULT_ATMOS @@ -61,7 +81,7 @@ return list("jungle_damaged") /turf/closed/mineral/random/jungle - baseturfs = /turf/open/misc/dirt/dark + baseturfs = /turf/open/misc/dirt/dark/jungle /turf/closed/mineral/random/jungle/mineral_chances() return list( @@ -74,3 +94,6 @@ /obj/item/stack/ore/titanium = 11, /obj/item/stack/ore/uranium = 5, ) + +/turf/closed/mineral/random/jungle/space_safe + baseturfs = /turf/open/misc/dirt/dark/station/airless diff --git a/code/game/turfs/open/river.dm b/code/game/turfs/open/river.dm index 532fa869592b4..2540699c586d5 100644 --- a/code/game/turfs/open/river.dm +++ b/code/game/turfs/open/river.dm @@ -21,15 +21,14 @@ num_spawned++ //make some randomly pathing rivers - for(var/A in river_nodes) - var/obj/effect/landmark/river_waypoint/W = A - if (W.z != target_z || W.connected) + for(var/obj/effect/landmark/river_waypoint/waypoints as anything in river_nodes) + if (waypoints.z != target_z || waypoints.connected) continue - W.connected = TRUE + waypoints.connected = TRUE // Workaround around ChangeTurf that's safe because of when this proc is called - var/turf/cur_turf = get_turf(W) + var/turf/cur_turf = get_turf(waypoints) cur_turf = new turf_type(cur_turf) - var/turf/target_turf = get_turf(pick(river_nodes - W)) + var/turf/target_turf = get_turf(pick(river_nodes - waypoints)) if(!target_turf) break var/detouring = FALSE @@ -61,8 +60,8 @@ var/turf/river_turf = new turf_type(cur_turf) river_turf.Spread(25, 11, whitelist_area) - for(var/WP in river_nodes) - qdel(WP) + for(var/waypoints_spawned in river_nodes) + qdel(waypoints_spawned) /obj/effect/landmark/river_waypoint diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm index 3c3013403d392..8152f910c01ac 100644 --- a/code/game/turfs/open/space/space.dm +++ b/code/game/turfs/open/space/space.dm @@ -1,3 +1,6 @@ +///The color of light space emits +GLOBAL_VAR_INIT(starlight_color, COLOR_STARLIGHT) + /turf/open/space icon = 'icons/turf/space.dmi' icon_state = "space" @@ -21,7 +24,6 @@ plane = PLANE_SPACE layer = SPACE_LAYER light_power = 0.75 - light_color = COLOR_STARLIGHT space_lit = TRUE bullet_bounce_sound = null vis_flags = VIS_INHERIT_ID //when this be added to vis_contents of something it be associated with something on clicking, important for visualisation of turf in openspace and interraction with openspace that show you turf. @@ -33,53 +35,6 @@ //This is used to optimize the map loader return -/** - * Space Initialize - * - * Doesn't call parent, see [/atom/proc/Initialize]. - * When adding new stuff to /atom/Initialize, /turf/Initialize, etc - * don't just add it here unless space actually needs it. - * - * There is a lot of work that is intentionally not done because it is not currently used. - * This includes stuff like smoothing, blocking camera visibility, etc. - * If you are facing some odd bug with specifically space, check if it's something that was - * intentionally ommitted from this implementation. - */ -/turf/open/space/Initialize(mapload) - SHOULD_CALL_PARENT(FALSE) - air = space_gas - - if (PERFORM_ALL_TESTS(focus_only/multiple_space_initialization)) - if(flags_1 & INITIALIZED_1) - stack_trace("Warning: [src]([type]) initialized multiple times!") - flags_1 |= INITIALIZED_1 - - - // We make the assumption that the space plane will never be blacklisted, as an optimization - if(SSmapping.max_plane_offset) - plane = PLANE_SPACE - (PLANE_RANGE * SSmapping.z_level_to_plane_offset[z]) - - var/area/our_area = loc - if(!our_area.area_has_base_lighting && space_lit) //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 += GLOB.fullbright_overlays[GET_TURF_PLANE_OFFSET(src) + 1] - - if (!mapload) - if(requires_activation) - SSair.add_to_active(src, TRUE) - - if(SSmapping.max_plane_offset) - var/turf/T = SSmapping.get_turf_above(src) - if(T) - T.multiz_turf_new(src, DOWN) - T = SSmapping.get_turf_below(src) - if(T) - T.multiz_turf_new(src, UP) - - return INITIALIZE_HINT_NORMAL - //ATTACK GHOST IGNORING PARENT RETURN VALUE /turf/open/space/attack_ghost(mob/dead/observer/user) if(destination_z) @@ -212,9 +167,9 @@ if(RCD_CATWALK) var/obj/structure/lattice/lattice = locate(/obj/structure/lattice, src) if(lattice) - return list("mode" = RCD_CATWALK, "delay" = 0, "cost" = 1) - else return list("mode" = RCD_CATWALK, "delay" = 0, "cost" = 2) + else + return list("mode" = RCD_CATWALK, "delay" = 0, "cost" = 4) return FALSE /turf/open/space/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) @@ -251,6 +206,8 @@ /turf/open/space/openspace/Initialize(mapload) // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker . = ..() + if(PERFORM_ALL_TESTS(focus_only/openspace_clear) && !GET_TURF_BELOW(src)) + stack_trace("[src] was inited as openspace with nothing below it at ([x], [y], [z])") icon_state = "pure_white" // We make the assumption that the space plane will never be blacklisted, as an optimization if(SSmapping.max_plane_offset) @@ -261,6 +218,13 @@ . = ..() AddElement(/datum/element/turf_z_transparency) +/turf/open/space/openspace/Destroy() + // Signals persist through destroy, GO HOME + var/turf/below = GET_TURF_BELOW(src) + if(below) + UnregisterSignal(below, COMSIG_TURF_CHANGE) + return ..() + /turf/open/space/openspace/zAirIn() return TRUE @@ -296,7 +260,7 @@ return FALSE /turf/open/space/openspace/enable_starlight() - var/turf/below = SSmapping.get_turf_below(src) + var/turf/below = GET_TURF_BELOW(src) // Override = TRUE beacuse we could have our starlight updated many times without a failure, which'd trigger this RegisterSignal(below, COMSIG_TURF_CHANGE, PROC_REF(on_below_change), override = TRUE) if(!isspaceturf(below)) @@ -308,7 +272,7 @@ if(.) return // If we're here, the starlight is not to be - var/turf/below = SSmapping.get_turf_below(src) + var/turf/below = GET_TURF_BELOW(src) UnregisterSignal(below, COMSIG_TURF_CHANGE) /turf/open/space/openspace/proc/on_below_change(turf/source, path, list/new_baseturfs, flags, list/post_change_callbacks) diff --git a/code/game/turfs/open/space/space_EXPENSIVE.dm b/code/game/turfs/open/space/space_EXPENSIVE.dm new file mode 100644 index 0000000000000..44a15ac66d94a --- /dev/null +++ b/code/game/turfs/open/space/space_EXPENSIVE.dm @@ -0,0 +1,47 @@ +/** + * Space Initialize + * + * Doesn't call parent, see [/atom/proc/Initialize]. + * When adding new stuff to /atom/Initialize, /turf/Initialize, etc + * don't just add it here unless space actually needs it. + * + * There is a lot of work that is intentionally not done because it is not currently used. + * This includes stuff like smoothing, blocking camera visibility, etc. + * If you are facing some odd bug with specifically space, check if it's something that was + * intentionally ommitted from this implementation. + */ +/turf/open/space/Initialize(mapload) + SHOULD_CALL_PARENT(FALSE) + air = space_gas + + if (PERFORM_ALL_TESTS(focus_only/multiple_space_initialization)) + if(flags_1 & INITIALIZED_1) + stack_trace("Warning: [src]([type]) initialized multiple times!") + flags_1 |= INITIALIZED_1 + + light_color = GLOB.starlight_color + + // We make the assumption that the space plane will never be blacklisted, as an optimization + if(SSmapping.max_plane_offset) + plane = PLANE_SPACE - (PLANE_RANGE * SSmapping.z_level_to_plane_offset[z]) + + var/area/our_area = loc + if(!our_area.area_has_base_lighting && space_lit) //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 += GLOB.fullbright_overlays[GET_TURF_PLANE_OFFSET(src) + 1] + + if (!mapload) + if(requires_activation) + SSair.add_to_active(src, TRUE) + + if(SSmapping.max_plane_offset) + var/turf/T = GET_TURF_ABOVE(src) + if(T) + T.multiz_turf_new(src, DOWN) + T = GET_TURF_BELOW(src) + if(T) + T.multiz_turf_new(src, UP) + + return INITIALIZE_HINT_NORMAL diff --git a/code/game/turfs/open/space/transit.dm b/code/game/turfs/open/space/transit.dm index b4c713de7519a..02d56a3be1e17 100644 --- a/code/game/turfs/open/space/transit.dm +++ b/code/game/turfs/open/space/transit.dm @@ -4,17 +4,20 @@ icon_state = "black" dir = SOUTH baseturfs = /turf/open/space/transit - flags_1 = NOJAUNT //This line goes out to every wizard that ever managed to escape the den. I'm sorry. + turf_flags = NOJAUNT //This line goes out to every wizard that ever managed to escape the den. I'm sorry. explosive_resistance = INFINITY /turf/open/space/transit/Initialize(mapload) . = ..() update_appearance() RegisterSignal(src, COMSIG_TURF_RESERVATION_RELEASED, PROC_REF(launch_contents)) + RegisterSignal(src, COMSIG_ATOM_ENTERED, PROC_REF(initialize_drifting)) + RegisterSignal(src, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, PROC_REF(initialize_drifting_but_from_initialize)) /turf/open/space/transit/Destroy() //Signals are NOT removed from turfs upon replacement, and we get replaced ALOT, so unregister our signal - UnregisterSignal(src, COMSIG_TURF_RESERVATION_RELEASED) + UnregisterSignal(src, list(COMSIG_TURF_RESERVATION_RELEASED, COMSIG_ATOM_ENTERED, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON)) + return ..() /turf/open/space/transit/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) @@ -30,11 +33,17 @@ icon_state = "speedspace_ns_[get_transit_state(src)]" return ..() -/turf/open/space/transit/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) - . = ..() +/turf/open/space/transit/proc/initialize_drifting(atom/entered, atom/movable/enterer) + SIGNAL_HANDLER - if(!HAS_TRAIT(arrived, TRAIT_HYPERSPACED) && !HAS_TRAIT(arrived, TRAIT_FREE_HYPERSPACE_MOVEMENT)) - arrived.AddComponent(/datum/component/shuttle_cling, turn(dir, 180), old_loc) + if(enterer && !HAS_TRAIT(enterer, TRAIT_HYPERSPACED) && !HAS_TRAIT(src, TRAIT_HYPERSPACE_STOPPED)) + enterer.AddComponent(/datum/component/shuttle_cling, REVERSE_DIR(dir)) + +/turf/open/space/transit/proc/initialize_drifting_but_from_initialize(atom/movable/location, atom/movable/enterer, mapload) + SIGNAL_HANDLER + + if(!mapload && !enterer.anchored) + INVOKE_ASYNC(src, PROC_REF(initialize_drifting), src, enterer) /turf/open/space/transit/Exited(atom/movable/gone, direction) . = ..() @@ -52,6 +61,10 @@ ///Dump a movable in a random valid spacetile /proc/dump_in_space(atom/movable/dumpee) + if(HAS_TRAIT(dumpee, TRAIT_DEL_ON_SPACE_DUMP)) + qdel(dumpee) + return + var/max = world.maxx-TRANSITIONEDGE var/min = 1+TRANSITIONEDGE diff --git a/code/game/turfs/open/water.dm b/code/game/turfs/open/water.dm index 3f953174b7a1b..3e2cb248f63cb 100644 --- a/code/game/turfs/open/water.dm +++ b/code/game/turfs/open/water.dm @@ -13,18 +13,29 @@ barefootstep = FOOTSTEP_WATER clawfootstep = FOOTSTEP_WATER heavyfootstep = FOOTSTEP_WATER + /** + * Used as the color arg/var for the immerse element. It should be kept more or less in line with + * the hue of the turf, as semi-transparent vis overlays can opacify the semi-transparent bits of an icon, + * and we're kinda trying to offset that issue. + */ + var/immerse_overlay_color = "#5AAA88" + +/turf/open/water/Initialize(mapload) + . = ..() + AddElement(/datum/element/immerse, icon, icon_state, "immerse", immerse_overlay_color) /turf/open/water/jungle /turf/open/water/beach planetary_atmos = FALSE gender = PLURAL - desc = "You get the feeling that nobody's bothered to actually make this water functional..." + desc = "Come on in, it's great!" icon = 'icons/turf/beach.dmi' icon_state = "water" base_icon_state = "water" baseturfs = /turf/open/water/beach + immerse_overlay_color = "#7799AA" /turf/open/water/beach/Initialize(mapload) . = ..() - AddElement(/datum/element/lazy_fishing_spot, FISHING_SPOT_PRESET_BEACH) + AddElement(/datum/element/lazy_fishing_spot, /datum/fish_source/ocean/beach) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 27612e4d30080..3d18dee305077 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -130,10 +130,10 @@ GLOBAL_LIST_EMPTY(station_turfs) if(!SSmapping.plane_offset_blacklist["[plane]"]) plane = plane - (PLANE_RANGE * SSmapping.z_level_to_plane_offset[z]) - var/turf/T = SSmapping.get_turf_above(src) + var/turf/T = GET_TURF_ABOVE(src) if(T) T.multiz_turf_new(src, DOWN) - T = SSmapping.get_turf_below(src) + T = GET_TURF_BELOW(src) if(T) T.multiz_turf_new(src, UP) @@ -187,10 +187,10 @@ GLOBAL_LIST_EMPTY(station_turfs) stack_trace("Incorrect turf deletion") changing_turf = FALSE if(GET_LOWEST_STACK_OFFSET(z)) - var/turf/T = SSmapping.get_turf_above(src) + var/turf/T = GET_TURF_ABOVE(src) if(T) T.multiz_turf_del(src, DOWN) - T = SSmapping.get_turf_below(src) + T = GET_TURF_BELOW(src) if(T) T.multiz_turf_del(src, UP) if(force) @@ -343,8 +343,7 @@ GLOBAL_LIST_EMPTY(station_turfs) 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 +/turf/proc/zImpact(atom/movable/falling, levels = 1, turf/prev_turf, 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) @@ -602,11 +601,6 @@ GLOBAL_LIST_EMPTY(station_turfs) return FALSE AddComponent(/datum/component/acid, acidpwr, acid_volume, GLOB.acid_overlay) - for(var/atom/movable/movable_atom as anything in src) - if(underfloor_accessibility < UNDERFLOOR_INTERACTABLE && HAS_TRAIT(movable_atom, TRAIT_T_RAY_VISIBLE)) - continue - - movable_atom.acid_act(acidpwr, acid_volume) return . || TRUE @@ -643,29 +637,26 @@ GLOBAL_LIST_EMPTY(station_turfs) /turf/AllowDrop() return TRUE -/turf/proc/add_vomit_floor(mob/living/M, toxvomit = NONE, purge_ratio = 0.1) +/turf/proc/add_vomit_floor(mob/living/vomiter, vomit_type = /obj/effect/decal/cleanable/vomit, vomit_flags, purge_ratio = 0.1) + var/obj/effect/decal/cleanable/vomit/throw_up = new vomit_type (src, vomiter.get_static_viruses()) - var/obj/effect/decal/cleanable/vomit/V = new /obj/effect/decal/cleanable/vomit(src, M.get_static_viruses()) + // if the vomit combined, apply toxicity and reagents to the old vomit + if (QDELETED(throw_up)) + throw_up = locate() in src + if(isnull(throw_up)) + return - //if the vomit combined, apply toxicity and reagents to the old vomit - if (QDELETED(V)) - V = locate() in src - if(!V) + if(!iscarbon(vomiter) || (purge_ratio == 0)) return - // Apply the proper icon set based on vomit type - if(toxvomit == VOMIT_PURPLE) - V.icon_state = "vomitpurp_[pick(1,4)]" - else if (toxvomit == VOMIT_TOXIC) - V.icon_state = "vomittox_[pick(1,4)]" - if (purge_ratio && iscarbon(M)) - clear_reagents_to_vomit_pool(M, V, purge_ratio) + + clear_reagents_to_vomit_pool(vomiter, throw_up, purge_ratio) /proc/clear_reagents_to_vomit_pool(mob/living/carbon/M, obj/effect/decal/cleanable/vomit/V, purge_ratio = 0.1) var/obj/item/organ/internal/stomach/belly = M.get_organ_slot(ORGAN_SLOT_STOMACH) if(!belly?.reagents.total_volume) return var/chemicals_lost = belly.reagents.total_volume * purge_ratio - belly.reagents.trans_to(V, chemicals_lost, transfered_by = M) + belly.reagents.trans_to(V, chemicals_lost, transferred_by = M) //clear the stomach of anything even not food for(var/bile in belly.reagents.reagent_list) var/datum/reagent/reagent = bile diff --git a/code/game/world.dm b/code/game/world.dm index c969ace731300..600e1f6914bd6 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -49,8 +49,8 @@ GLOBAL_VAR(restart_counter) * - Dominion/Cyberboss * * Where to put init shit quick guide: - * If you need it to happen before the mc is created: world/Genesis. - * If you need it to happen last: world/New(), + * If you need it to happen before the mc is created: world/Genesis. + * If you need it to happen last: world/New(), * Otherwise, in a subsystem preinit or init. Subsystems can set an init priority. */ @@ -180,7 +180,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 = VARSET_CALLBACK(SSticker, force_ending, ADMIN_FORCE_END_ROUND) #endif SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_addtimer), cb, 10 SECONDS)) @@ -326,6 +326,7 @@ GLOBAL_VAR(restart_counter) shutdown_logging() // See comment below. auxcleanup() TgsEndProcess() + return ..() log_world("World rebooted at [time_stamp()]") @@ -360,8 +361,8 @@ GLOBAL_VAR(restart_counter) var/server_name = CONFIG_GET(string/servername) if (server_name) new_status += "[server_name] " - if(!CONFIG_GET(flag/norespawn)) - features += "respawn" + if(CONFIG_GET(flag/allow_respawn)) + features += "respawn" // show "respawn" regardless of "respawn as char" or "free respawn" if(!CONFIG_GET(flag/allow_ai)) features += "AI disabled" hostedby = CONFIG_GET(string/hostedby) @@ -397,31 +398,35 @@ GLOBAL_VAR(restart_counter) else hub_password = "SORRYNOPASSWORD" -// If this is called as a part of maploading you cannot call it on the newly loaded map zs, because those get handled later on in the pipeline -/world/proc/increaseMaxX(new_maxx, max_zs_to_load = maxz) +/** + * 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(!max_zs_to_load) + 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, max_zs_to_load)) + locate(maxx, maxy, map_load_z_cutoff)) global_area.contained_turfs += to_add -/world/proc/increaseMaxY(new_maxy, max_zs_to_load = maxz) +/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(!max_zs_to_load) + 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, max_zs_to_load)) + locate(maxx, maxy, map_load_z_cutoff)) global_area.contained_turfs += to_add /world/proc/incrementMaxZ() diff --git a/code/modules/NTNet/relays.dm b/code/modules/NTNet/relays.dm index a00d9c5d1b4c3..abe777f276f42 100644 --- a/code/modules/NTNet/relays.dm +++ b/code/modules/NTNet/relays.dm @@ -86,7 +86,7 @@ GLOBAL_LIST_EMPTY(ntnet_relays) set_dos_failure(FALSE) update_appearance() SSmodular_computers.add_log("Quantum relay switched from overload recovery mode to normal operation mode.") - return ..() + return TRUE /obj/machinery/ntnet_relay/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) diff --git a/code/modules/actionspeed/_actionspeed_modifier.dm b/code/modules/actionspeed/_actionspeed_modifier.dm index 71bc966acf4db..761bfc3ff74a4 100644 --- a/code/modules/actionspeed/_actionspeed_modifier.dm +++ b/code/modules/actionspeed/_actionspeed_modifier.dm @@ -37,8 +37,11 @@ can next move /// Other modification datums this conflicts with. var/conflicts_with -/datum/actionspeed_modifier/New() +/datum/actionspeed_modifier/New(init_id) . = ..() + + id = init_id + if(!id) id = "[type]" //We turn the path into a string. diff --git a/code/modules/actionspeed/modifiers/status_effects.dm b/code/modules/actionspeed/modifiers/status_effects.dm index fa080edb8d009..ec7b0dba22e0f 100644 --- a/code/modules/actionspeed/modifiers/status_effects.dm +++ b/code/modules/actionspeed/modifiers/status_effects.dm @@ -12,3 +12,19 @@ /datum/actionspeed_modifier/status_effect/hazard_area multiplicative_slowdown = 4 + +/// Get slower the more gold is in your system. +/datum/actionspeed_modifier/status_effect/midas_blight + id = ACTIONSPEED_ID_MIDAS_BLIGHT + +/datum/actionspeed_modifier/status_effect/midas_blight/soft + multiplicative_slowdown = 0.25 + +/datum/actionspeed_modifier/status_effect/midas_blight/medium + multiplicative_slowdown = 0.75 + +/datum/actionspeed_modifier/status_effect/midas_blight/hard + multiplicative_slowdown = 1.5 + +/datum/actionspeed_modifier/status_effect/midas_blight/gold + multiplicative_slowdown = 2 diff --git a/code/modules/actionspeed/modifiers/wound.dm b/code/modules/actionspeed/modifiers/wound.dm new file mode 100644 index 0000000000000..845399e07616b --- /dev/null +++ b/code/modules/actionspeed/modifiers/wound.dm @@ -0,0 +1,10 @@ +/datum/actionspeed_modifier/wound_interaction_inefficiency + variable = TRUE + + var/datum/wound/parent + +/datum/actionspeed_modifier/wound_interaction_inefficiency/New(new_id, datum/wound/parent) + + src.parent = parent + + return ..() diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index 6df75daf24252..fa1b832ecc31a 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -43,13 +43,15 @@ var/client_is_in_db = query_client_in_db.NextRow() if(!client_is_in_db) - var/reject_message = "Failed Login: [ckey] [address]-[computer_id] - New Account attempting to connect during panic bunker, but was rejected due to no prior connections to game servers (no database entry)" log_access(reject_message) if (message) message_admins(span_adminnotice("[reject_message]")) + qdel(query_client_in_db) return list("reason"="panicbunker", "desc" = "Sorry but the server is currently not accepting connections from never before seen players") + qdel(query_client_in_db) + //Whitelist if(!real_bans_only && !C && CONFIG_GET(flag/usewhitelist)) if(!check_whitelist(ckey)) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index bc6942a9a110c..2d2c692ed5fca 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -21,6 +21,7 @@ var/dat = "
Game Panel

" if(SSticker.current_state <= GAME_STATE_PREGAME) + dat += "(Manage Dynamic Rulesets)
" dat += "(Force Roundstart Rulesets)
" if (GLOB.dynamic_forced_roundstart_ruleset.len > 0) for(var/datum/dynamic_ruleset/roundstart/rule in GLOB.dynamic_forced_roundstart_ruleset) @@ -30,6 +31,8 @@ dat += "
" if(SSticker.IsRoundInProgress()) dat += "(Game Mode Panel)
" + if(istype(SSticker.mode, /datum/game_mode/dynamic)) + dat += "(Manage Dynamic Rulesets)
" dat += {"
Create Object
@@ -143,6 +146,111 @@ user << browse(dat, "window=dyn_mode_options;size=900x650") +/datum/admins/proc/dynamic_ruleset_manager(mob/user) + if (SSticker.current_state > GAME_STATE_PREGAME && !istype(SSticker.mode, /datum/game_mode/dynamic)) + return // Not running dynamic + + var/dat = "

Dynamic Ruleset Management


\ + Change these options to forcibly enable or disable dynamic rulesets.
\ + Disabled rulesets will never run, even if they would otherwise be valid.
\ + Enabled rulesets will run even if the qualifying minimum of threat or player count is not present, this does not guarantee that they will necessarily be chosen (for example their weight may be set to 0 in config).
\ + \[force enable all / \ + force disable all / \ + reset all\]" + + if (SSticker.current_state <= GAME_STATE_PREGAME) // Don't bother displaying after the round has started + var/static/list/rulesets_by_context = list() + if (!length(rulesets_by_context)) + for (var/datum/dynamic_ruleset/rule as anything in subtypesof(/datum/dynamic_ruleset)) + if (initial(rule.name) == "") + continue + LAZYADD(rulesets_by_context[initial(rule.ruletype)], rule) + + dat += dynamic_ruleset_category_pre_start_display("Roundstart", rulesets_by_context[ROUNDSTART_RULESET]) + dat += dynamic_ruleset_category_pre_start_display("Latejoin", rulesets_by_context[LATEJOIN_RULESET]) + dat += dynamic_ruleset_category_pre_start_display("Midround", rulesets_by_context[MIDROUND_RULESET]) + user << browse(dat, "window=dyn_mode_options;size=900x650") + return + + var/datum/game_mode/dynamic/current_mode = SSticker.mode + var/pop_count = length(GLOB.alive_player_list) + var/threat_level = current_mode.threat_level + dat += dynamic_ruleset_category_during_round_display("Latejoin", current_mode.latejoin_rules, pop_count, threat_level) + dat += dynamic_ruleset_category_during_round_display("Midround", current_mode.midround_rules, pop_count, threat_level) + user << browse(dat, "window=dyn_mode_options;size=900x650") + +/datum/admins/proc/dynamic_ruleset_category_pre_start_display(title, list/rules) + var/dat = "

[title]

[entry][functions]
[CEILING(organ.damage,1)][status]
" + for (var/datum/dynamic_ruleset/rule as anything in rules) + var/forced = GLOB.dynamic_forced_rulesets[rule] || RULESET_NOT_FORCED + var/color = COLOR_BLACK + switch (forced) + if (RULESET_FORCE_ENABLED) + color = COLOR_GREEN + if (RULESET_FORCE_DISABLED) + color = COLOR_RED + dat += "" + dat += "
[initial(rule.name)]\[[forced]\]\[\ + force enabled /\ + force disabled /\ + reset\]
" + return dat + +/datum/admins/proc/dynamic_ruleset_category_during_round_display(title, list/rules, pop_count, threat_level) + var/dat = "

[title]

" + for (var/datum/dynamic_ruleset/rule as anything in rules) + var/active = rule.acceptable(population = pop_count, threat_level = threat_level) && rule.weight > 0 + var/forced = GLOB.dynamic_forced_rulesets[rule.type] || RULESET_NOT_FORCED + var/color = (active) ? COLOR_GREEN : COLOR_RED + var/explanation = "" + if (!active) + if (rule.weight <= 0) + explanation = " - Weight is zero" + else if (forced == RULESET_FORCE_DISABLED) + explanation = " - Forcibly disabled" + else if (forced == RULESET_FORCE_ENABLED) + explanation = " - Failed spawn conditions" + else if (!rule.is_valid_population(pop_count)) + explanation = " - Invalid player count" + else if (!rule.is_valid_threat(pop_count, threat_level)) + explanation = " - Insufficient threat" + else + explanation = " - Failed spawn conditions" + else if (forced == RULESET_FORCE_ENABLED) + explanation = " - Forcibly enabled" + active = active ? "Active" : "Inactive" + + dat += "\ + \ + " + dat += "
[rule.name]\[Weight : [rule.weight]\]\ + \[[active][explanation]\]\[\ + force enabled /\ + force disabled /\ + reset\]\[VV\]
" + return dat + + +/datum/admins/proc/force_all_rulesets(mob/user, force_value) + if (force_value == RULESET_NOT_FORCED) + GLOB.dynamic_forced_rulesets = list() + else + for (var/datum/dynamic_ruleset/rule as anything in subtypesof(/datum/dynamic_ruleset)) + GLOB.dynamic_forced_rulesets[rule] = force_value + var/logged_message = "[key_name(user)] set all dynamic rulesets to [force_value]." + log_admin(logged_message) + message_admins(logged_message) + dynamic_ruleset_manager(user) + +/datum/admins/proc/set_dynamic_ruleset_forced(mob/user, datum/dynamic_ruleset/type, force_value) + if (isnull(type)) + return + GLOB.dynamic_forced_rulesets[type] = force_value + dynamic_ruleset_manager(user) + var/logged_message = "[key_name(user)] set '[initial(type.name)] ([initial(type.ruletype)])' to [GLOB.dynamic_forced_rulesets[type]]." + log_admin(logged_message) + message_admins(logged_message) + /datum/admins/proc/create_or_modify_area() set category = "Debug" set name = "Create or modify area" diff --git a/code/modules/admin/admin_fax_panel.dm b/code/modules/admin/admin_fax_panel.dm index e4126d89c5daa..fe1f03d7d7ec2 100644 --- a/code/modules/admin/admin_fax_panel.dm +++ b/code/modules/admin/admin_fax_panel.dm @@ -28,7 +28,7 @@ /datum/fax_panel_interface/New() //Get all faxes, and save them to our list. - for(var/obj/machinery/fax/fax in GLOB.machines) + for(var/obj/machinery/fax/fax as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/fax)) available_faxes += WEAKREF(fax) //Get all stamps diff --git a/code/modules/admin/admin_pda_message.dm b/code/modules/admin/admin_pda_message.dm index 2aeca2fd58c12..44ca86f893ec7 100644 --- a/code/modules/admin/admin_pda_message.dm +++ b/code/modules/admin/admin_pda_message.dm @@ -13,7 +13,7 @@ if(!check_rights(R_ADMIN)) return - if(!length(GLOB.TabletMessengers)) + if(!length(GLOB.pda_messengers)) to_chat(usr, span_warning("ERROR: There are no users you can send a message to")) return @@ -22,15 +22,6 @@ /// Panel /datum/admin_pda_panel - /// PDA which have players(and we can send them message) - var/available_pdas = list() - -/datum/admin_pda_panel/New() - for(var/obj/item/modular_computer/computer in GLOB.TabletMessengers) - for(var/datum/computer_file/program/messenger/app in computer.stored_files) - if(!computer.saved_identification || !computer.saved_job || app.monitor_hidden || app.invisible) - continue - available_pdas += list(list("tablet" = computer, "name" = computer.saved_identification)) /datum/admin_pda_panel/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -43,10 +34,15 @@ /datum/admin_pda_panel/ui_static_data(mob/user) var/list/data = list() - data["users"] = list() - - for(var/username in available_pdas) - data["users"] += username["name"] + var/list/available_messengers = list() + for(var/messenger_ref in get_messengers_sorted_by_name()) + var/datum/computer_file/program/messenger/messenger = GLOB.pda_messengers[messenger_ref] + available_messengers[REF(messenger)] = list( + ref = REF(messenger), + username = get_messenger_name(messenger), + invisible = messenger.invisible, + ) + data["users"] = available_messengers return data /datum/admin_pda_panel/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) @@ -60,27 +56,45 @@ if("sendMessage") var/targets = list() var/spam = params["spam"] - for(var/target in available_pdas) - if(!spam && target["name"] != params["user"]) - continue - targets += target["tablet"] + var/ref = params["ref"] + var/force = params["force"] + if(!spam && (ref in GLOB.pda_messengers)) + targets += GLOB.pda_messengers[ref] + else + for(var/messenger_ref in get_messengers_sorted_by_name()) + var/datum/computer_file/program/messenger/messenger = GLOB.pda_messengers[messenger_ref] + if(messenger.invisible && !params["include_invisible"]) + continue + targets += messenger if(!length(targets)) - to_chat(usr, span_warning("ERROR: Target is unavaiable(or not choosed).")) - return - - var/datum/signal/subspace/messaging/tablet_msg/signal = new(targets[1], list( - "name" = params["name"], - "job" = params["job"], - "message" = html_decode(params["message"]), - "ref" = FALSE, + to_chat(usr, span_warning("ERROR: Target is unavailable.")) + return FALSE + + var/datum/signal/subspace/messaging/tablet_message/signal = new(null, list( + "fakename" = params["name"], + "fakejob" = params["job"], + "message" = params["message"], + "everyone" = spam, + "ref" = null, "targets" = targets, - "emojis" = FALSE, "rigged" = FALSE, - "photo" = FALSE, "automated" = FALSE, )) - signal.send_to_receivers() - message_admins("[key_name_admin(usr)] has send custom PDA message to [spam ? "everyone" : params["user"]].") - log_admin("[key_name(usr)] has send custom PDA message to [spam ? "everyone" : params["user"]]. Message: [params["message"]].") + if(force) + signal.broadcast() + else + signal.levels = SSmapping.levels_by_trait(ZTRAIT_STATION) + signal.send_to_receivers() + + if(!(force || signal.data["reject"])) + to_chat(usr, span_warning("ERROR: PDA message was rejected by the telecomms setup.")) + return FALSE + + var/recipient = spam ? "everyone" : get_messenger_name(targets[1]) + + message_admins("[key_name_admin(usr)] sent a custom PDA message to [recipient].") + log_admin("[key_name(usr)] sent a custom PDA message to [recipient]. Message: [params["message"]].") + log_pda("[key_name(usr)] sent an admin custom PDA message to [recipient]. Message: [params["message"]]") + return TRUE diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index d686c110e6c9b..c5b9813c5547c 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -45,6 +45,7 @@ GLOBAL_PROTECT(admin_verbs_admin) /datum/admins/proc/trophy_manager, /datum/admins/proc/view_all_circuits, /datum/verbs/menu/Admin/verb/playerpanel, /* It isn't /datum/admin but it fits no less */ + /datum/admins/proc/change_shuttle_events, //allows us to change the shuttle events // Client procs /client/proc/admin_call_shuttle, /*allows us to call the emergency shuttle*/ /client/proc/admin_cancel_shuttle, /*allows us to cancel the emergency shuttle, sending it back to centcom*/ @@ -52,6 +53,9 @@ GLOBAL_PROTECT(admin_verbs_admin) /client/proc/admin_enable_shuttle, /*undoes the above*/ /client/proc/admin_ghost, /*allows us to ghost/reenter body at will*/ /client/proc/admin_hostile_environment, /*Allows admins to prevent the emergency shuttle from leaving, also lets admins clear hostile environments if theres one stuck*/ + /client/proc/centcom_podlauncher,/*Open a window to launch a Supplypod and configure it or it's contents*/ + /client/proc/check_ai_laws, /*shows AI and borg laws*/ + /client/proc/check_antagonists, /*shows all antags*/ /client/proc/cmd_admin_check_contents, /*displays the contents of an instance*/ /client/proc/cmd_admin_check_player_exp, /* shows players by playtime */ /client/proc/cmd_admin_create_centcom_report, @@ -62,9 +66,7 @@ GLOBAL_PROTECT(admin_verbs_admin) /client/proc/cmd_admin_subtle_message, /*send a message to somebody as a 'voice in their head'*/ /client/proc/cmd_admin_world_narrate, /*sends text to all players with no padding*/ /client/proc/cmd_change_command_name, - /client/proc/centcom_podlauncher,/*Open a window to launch a Supplypod and configure it or it's contents*/ - /client/proc/check_ai_laws, /*shows AI and borg laws*/ - /client/proc/check_antagonists, /*shows all antags*/ + /client/proc/create_mob_worm, /client/proc/fax_panel, /*send a paper to fax*/ /client/proc/force_load_lazy_template, /client/proc/game_panel, /*game panel, allows to change game-mode etc*/ @@ -84,6 +86,7 @@ GLOBAL_PROTECT(admin_verbs_admin) /client/proc/list_fingerprints, /client/proc/list_law_changes, /client/proc/list_signalers, + /client/proc/manage_sect, /*manage chaplain religious sect*/ /client/proc/message_pda, /*send a message to somebody on PDA*/ /client/proc/respawn_character, /client/proc/show_manifest, @@ -103,7 +106,7 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list( /datum/admins/proc/station_traits_panel, // Client procs /client/proc/admin_away, - /client/proc/add_mob_ability, + /client/proc/add_marked_mob_ability, /client/proc/admin_change_sec_level, /client/proc/cinematic, /client/proc/cmd_admin_add_freeform_ai_law, @@ -118,7 +121,7 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list( /client/proc/mass_zombie_infection, /client/proc/object_say, /client/proc/polymorph_all, - /client/proc/remove_mob_ability, + /client/proc/remove_marked_mob_ability, /client/proc/reset_ooc, /client/proc/run_weather, /client/proc/set_dynex_scale, @@ -680,6 +683,80 @@ GLOBAL_PROTECT(admin_verbs_poll) set category = "Debug" SStrading_card_game.printAllCards() +/client/proc/give_mob_action(mob/ability_recipient in GLOB.mob_list) + set category = "Admin.Fun" + set name = "Give Mob Action" + set desc = "Gives a mob ability to a mob." + + var/static/list/all_mob_actions = sort_list(subtypesof(/datum/action/cooldown/mob_cooldown), GLOBAL_PROC_REF(cmp_typepaths_asc)) + var/static/list/actions_by_name = list() + if (!length(actions_by_name)) + for (var/datum/action/cooldown/mob_cooldown as anything in all_mob_actions) + actions_by_name["[initial(mob_cooldown.name)] ([mob_cooldown])"] = mob_cooldown + + var/ability = tgui_input_list(usr, "Choose an ability", "Ability", actions_by_name) + if(isnull(ability)) + return + + var/ability_type = actions_by_name[ability] + var/datum/action/cooldown/mob_cooldown/add_ability + + var/make_sequence = tgui_alert(usr, "Would you like this action to be a sequence of multiple abilities?", "Sequence Ability", list("Yes", "No")) + if(make_sequence == "Yes") + add_ability = new /datum/action/cooldown/mob_cooldown(ability_recipient) + add_ability.sequence_actions = list() + while(!isnull(ability_type)) + var/ability_delay = tgui_input_number(usr, "Enter the delay in seconds before the next ability in the sequence is used", "Ability Delay", 2) + if(isnull(ability_delay) || ability_delay < 0) + ability_delay = 0 + add_ability.sequence_actions[ability_type] = ability_delay * 1 SECONDS + ability = tgui_input_list(usr, "Choose a new sequence ability", "Sequence Ability", actions_by_name) + ability_type = actions_by_name[ability] + var/ability_cooldown = tgui_input_number(usr, "Enter the sequence abilities cooldown in seconds", "Ability Cooldown", 2) + if(isnull(ability_cooldown) || ability_cooldown < 0) + ability_cooldown = 2 + add_ability.cooldown_time = ability_cooldown * 1 SECONDS + var/ability_melee_cooldown = tgui_input_number(usr, "Enter the abilities melee cooldown in seconds", "Melee Cooldown", 2) + if(isnull(ability_melee_cooldown) || ability_melee_cooldown < 0) + ability_melee_cooldown = 2 + add_ability.melee_cooldown_time = ability_melee_cooldown * 1 SECONDS + add_ability.name = tgui_input_text(usr, "Choose ability name", "Ability name", "Generic Ability") + add_ability.create_sequence_actions() + else + add_ability = new ability_type(ability_recipient) + + if(isnull(ability_recipient)) + return + add_ability.Grant(ability_recipient) + + message_admins("[key_name_admin(usr)] added mob ability [ability_type] to mob [ability_recipient].") + log_admin("[key_name(usr)] added mob ability [ability_type] to mob [ability_recipient].") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Add Mob Ability") // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! + +/client/proc/remove_mob_action(mob/removal_target in GLOB.mob_list) + set category = "Admin.Fun" + set name = "Remove Mob Action" + set desc = "Remove a special ability from the selected mob." + + var/list/target_abilities = list() + for(var/datum/action/cooldown/mob_cooldown/ability in removal_target.actions) + target_abilities[ability.name] = ability + + if(!length(target_abilities)) + return + + var/chosen_ability = tgui_input_list(usr, "Choose the spell to remove from [removal_target]", "Depower", sort_list(target_abilities)) + if(isnull(chosen_ability)) + return + var/datum/action/cooldown/mob_cooldown/to_remove = target_abilities[chosen_ability] + if(!istype(to_remove)) + return + + qdel(to_remove) + log_admin("[key_name(usr)] removed the ability [chosen_ability] from [key_name(removal_target)].") + message_admins("[key_name_admin(usr)] removed the ability [chosen_ability] from [key_name_admin(removal_target)].") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Remove Mob Ability") // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! + /client/proc/give_spell(mob/spell_recipient in GLOB.mob_list) set category = "Admin.Fun" set name = "Give Spell" @@ -796,6 +873,33 @@ GLOBAL_PROTECT(admin_verbs_poll) if(holder) src.holder.output_ai_laws() +/client/proc/manage_sect() + set name = "Manage Religious Sect" + set category = "Admin.Game" + + if (!isnull(GLOB.religious_sect)) + var/you_sure = tgui_alert( + usr, + "The Chaplain has already chosen [GLOB.religious_sect.name], override their selection?", + "Replace God?", + list("Yes", "Cancel"), + ) + if (you_sure != "Yes") + return + + var/static/list/choices = list() + if (!length(choices)) + choices["nothing"] = null + for(var/datum/religion_sect/sect as anything in subtypesof(/datum/religion_sect)) + choices[initial(sect.name)] = sect + var/choice = tgui_input_list(usr, "Set new Chaplain sect", "God Picker", choices) + if(isnull(choice)) + return + if(choice == "nothing") + reset_religious_sect() + return + set_new_religious_sect(choices[choice], reset_existing = TRUE) + /client/proc/deadmin() set name = "Deadmin" set category = "Admin" @@ -931,7 +1035,7 @@ GLOBAL_PROTECT(admin_verbs_poll) new_guy.mind.name = "[rank] Dummy" // Assign the rank to the new player dummy. - if(!SSjob.AssignRole(new_guy, job)) + if(!SSjob.AssignRole(new_guy, job, do_eligibility_checks = FALSE)) qdel(new_guy) to_chat(admin, "[rank] wasn't able to be spawned.") continue @@ -971,8 +1075,6 @@ GLOBAL_PROTECT(admin_verbs_poll) var/reqs = initial(spell.spell_requirements) if(reqs & SPELL_CASTABLE_AS_BRAIN) real_reqs += "Castable as brain" - if(reqs & SPELL_CASTABLE_WHILE_PHASED) - real_reqs += "Castable phased" if(reqs & SPELL_REQUIRES_HUMAN) real_reqs += "Must be human" if(reqs & SPELL_REQUIRES_MIME_VOW) @@ -1022,7 +1124,7 @@ GLOBAL_PROTECT(admin_verbs_poll) if(!isobserver(usr)) admin_ghost() - usr.forceMove(coords2turf(reservation.bottom_left_coords)) + usr.forceMove(reservation.bottom_left_turfs[1]) message_admins("[key_name_admin(usr)] has loaded lazy template '[choice]'") to_chat(usr, span_boldnicegreen("Template loaded, you have been moved to the bottom left of the reservation.")) @@ -1037,3 +1139,48 @@ GLOBAL_PROTECT(admin_verbs_poll) holder.library_manager = new() holder.library_manager.ui_interact(usr) SSblackbox.record_feedback("tally", "admin_verb", 1, "Library Management") // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! + +/client/proc/create_mob_worm() + set category = "Admin.Fun" + set name = "Create Mob Worm" + set desc = "Attached a linked list of mobs to a marked mob" + if (!check_rights(R_FUN)) + return + if(isnull(holder)) + return + if(!isliving(holder.marked_datum)) + to_chat(usr, span_warning("Error: Please mark a mob to attach mobs to.")) + return + var/mob/living/head = holder.marked_datum + + var/attempted_target_path = tgui_input_text( + usr, + "Enter typepath of a mob you'd like to make your chain from.", + "Typepath", + "[/mob/living/basic/pet/dog/corgi/ian]", + ) + + if (isnull(attempted_target_path)) + return //The user pressed "Cancel" + + var/desired_mob = text2path(attempted_target_path) + if(!ispath(desired_mob)) + var/static/list/mob_paths = make_types_fancy(subtypesof(/mob/living)) + desired_mob = pick_closest_path(attempted_target_path, mob_paths) + if(isnull(desired_mob) || !ispath(desired_mob) || QDELETED(head)) + return //The user pressed "Cancel" + + var/amount = tgui_input_number(usr, "How long should our tail be?", "Worm Configurator", default = 3, min_value = 1) + if (isnull(amount) || amount < 1 || QDELETED(head)) + return + head.AddComponent(/datum/component/mob_chain) + var/mob/living/previous = head + for (var/i in 1 to amount) + var/mob/living/segment = new desired_mob(head.drop_location()) + if (QDELETED(segment)) // ffs mobs which replace themselves with other mobs + i-- + continue + ADD_TRAIT(segment, TRAIT_PERMANENTLY_MORTAL, INNATE_TRAIT) + QDEL_NULL(segment.ai_controller) + segment.AddComponent(/datum/component/mob_chain, front = previous) + previous = segment diff --git a/code/modules/admin/antag_panel.dm b/code/modules/admin/antag_panel.dm index 2aad9a7cbcf7a..a970c7a5335ef 100644 --- a/code/modules/admin/antag_panel.dm +++ b/code/modules/admin/antag_panel.dm @@ -53,6 +53,7 @@ GLOBAL_VAR(antag_prototypes)
" obj_count++ result += "Add objective
" + result += "Prompt custom objective entry
" result += "Announce objectives
" return result diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm index 77fe81fdb7e9e..fcf9693731e05 100644 --- a/code/modules/admin/create_mob.dm +++ b/code/modules/admin/create_mob.dm @@ -10,30 +10,24 @@ user << browse(create_panel_helper(create_mob_html), "window=create_mob;size=425x475") -/proc/randomize_human(mob/living/carbon/human/human) - if(human.dna.species.sexes) - human.gender = pick(MALE, FEMALE, PLURAL) - else - human.gender = PLURAL +/** + * Randomizes everything about a human, including DNA and name + */ +/proc/randomize_human(mob/living/carbon/human/human, randomize_mutations = FALSE) + human.gender = human.dna.species.sexes ? pick(MALE, FEMALE, PLURAL, NEUTER) : PLURAL human.physique = human.gender human.real_name = human.dna?.species.random_name(human.gender) || random_unique_name(human.gender) - human.name = human.real_name - human.hairstyle = random_hairstyle(human.gender) - human.facial_hairstyle = random_facial_hairstyle(human.gender) - human.hair_color = "#[random_color()]" - human.facial_hair_color = human.hair_color - var/random_eye_color = random_eye_color() - human.eye_color_left = random_eye_color - human.eye_color_right = random_eye_color - - human.dna.blood_type = random_blood_type() - human.dna.features["mcolor"] = "#[random_color()]" + human.name = human.get_visible_name() + human.set_hairstyle(random_hairstyle(human.gender), update = FALSE) + human.set_facial_hairstyle(random_facial_hairstyle(human.gender), update = FALSE) + human.set_haircolor("#[random_color()]", update = FALSE) + human.set_facial_haircolor(human.hair_color, update = FALSE) + human.eye_color_left = random_eye_color() + human.eye_color_right = human.eye_color_left + human.skin_tone = random_skin_tone() human.dna.species.randomize_active_underwear_only(human) - - for(var/datum/species/species_path as anything in subtypesof(/datum/species)) - var/datum/species/new_species = new species_path - new_species.randomize_features(human) - human.dna.species.spec_updatehealth(human) - human.dna.update_dna_identity() - human.updateappearance() - human.update_body(is_creating = TRUE) + // Needs to be called towards the end to update all the UIs just set above + human.dna.initialize_dna(newblood_type = random_blood_type(), create_mutation_blocks = randomize_mutations, randomize_features = TRUE) + // Snowflake for Ethereals + human.updatehealth() + human.updateappearance(mutcolor_update = TRUE) diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm index cdef9b9194cda..979e51bd5a14d 100644 --- a/code/modules/admin/fun_balloon.dm +++ b/code/modules/admin/fun_balloon.dm @@ -142,7 +142,7 @@ for (var/S in SSshuttle.stationary_docking_ports) var/obj/docking_port/stationary/SM = S if (SM.shuttle_id == "emergency_home") - var/new_dir = turn(SM.dir, 180) + var/new_dir = REVERSE_DIR(SM.dir) SM.forceMove(get_ranged_target_turf(SM, new_dir, crash_strength)) break diff --git a/code/modules/admin/greyscale_modify_menu.dm b/code/modules/admin/greyscale_modify_menu.dm index e9936723f78a2..ea0774cc99d12 100644 --- a/code/modules/admin/greyscale_modify_menu.dm +++ b/code/modules/admin/greyscale_modify_menu.dm @@ -2,7 +2,7 @@ /// If `Unlock()` is not called the menu is safe for players to use. /datum/greyscale_modify_menu /// The "owner" object of this menu, is usually the greyscale object being edited but that can be changed for specific uses of this menu - var/atom/target + var/datum/target /// The client that opened this menu var/client/user @@ -32,30 +32,48 @@ /// Whether the menu is in the middle of refreshing the preview var/refreshing = TRUE - /// Whether the menu is currently locked down to prevent abuse from players. Currently is only unlocked when opened from vv. + /** + * Whether the menu is currently locked down to prevent abuse from players. + * Currently is only unlocked when opened from vv. + * It also enables the user to modify the alpha channel of the colors. + */ var/unlocked = FALSE -/datum/greyscale_modify_menu/New(atom/target, client/user, list/allowed_configs, datum/callback/apply_callback, starting_icon_state="", starting_config, starting_colors) +/datum/greyscale_modify_menu/New(datum/target, client/user, list/allowed_configs, datum/callback/apply_callback, starting_icon_state = "", starting_config, starting_colors, unlocked = FALSE) src.target = target + var/atom/atom_target + if(isatom(target)) + atom_target = target src.user = user - src.apply_callback = apply_callback || CALLBACK(src, PROC_REF(DefaultApply)) + src.apply_callback = apply_callback + if(!apply_callback) + if(atom_target) + src.apply_callback = CALLBACK(src, PROC_REF(DefaultApply)) + else + stack_trace("A geyscale modify menu was instantiated with a non-atom target and no specified apply callback (DefaultApply won't do).") + icon_state = starting_icon_state SetupConfigOwner() - var/current_config = "[starting_config]" || "[target?.greyscale_config]" + + var/current_config = "[starting_config]" || "[atom_target?.greyscale_config]" var/datum/greyscale_config/new_config = SSgreyscale.configurations[current_config] if(!(current_config in allowed_configs)) new_config = SSgreyscale.configurations["[allowed_configs[pick(allowed_configs)]]"] change_config(new_config) - var/list/config_choices = list() - for(var/config_string in allowed_configs) - var/datum/greyscale_config/allowed_config = text2path("[config_string]") - config_choices[initial(allowed_config.name)] = config_string - src.allowed_configs = config_choices + if(unlocked) + Unlock() + else + var/list/config_choices = list() + for(var/config_string in allowed_configs) + var/datum/greyscale_config/allowed_config = text2path("[config_string]") + config_choices[initial(allowed_config.name)] = config_string + + src.allowed_configs = config_choices - ReadColorsFromString(starting_colors || target?.greyscale_colors) + ReadColorsFromString(starting_colors || atom_target?.greyscale_colors) if(target) RegisterSignal(target, COMSIG_QDELETING, PROC_REF(ui_close)) @@ -65,10 +83,12 @@ /datum/greyscale_modify_menu/Destroy() target = null user = null + apply_callback = null + config = null return ..() /datum/greyscale_modify_menu/ui_state(mob/user) - return GLOB.always_state + return unlocked ? GLOB.always_state : GLOB.greyscale_menu_state /datum/greyscale_modify_menu/ui_close() qdel(src) @@ -135,14 +155,13 @@ if("recolor") var/index = text2num(params["color_index"]) var/new_color = lowertext(params["new_color"]) - if(split_colors[index] != new_color) + if(split_colors[index] != new_color && (findtext(new_color, GLOB.is_color) || (unlocked && findtext(new_color, GLOB.is_alpha_color)))) split_colors[index] = new_color queue_refresh() if("recolor_from_string") var/full_color_string = lowertext(params["color_string"]) - if(full_color_string != split_colors.Join()) - ReadColorsFromString(full_color_string) + if(full_color_string != split_colors.Join() && ReadColorsFromString(full_color_string)) queue_refresh() if("pick_color") @@ -222,10 +241,15 @@ This is highly likely to cause massive amounts of lag as every object in the gam config.EnableAutoRefresh(config_owner_type) /datum/greyscale_modify_menu/proc/ReadColorsFromString(colorString) - var/list/raw_colors = splittext(colorString, "#") - split_colors = list() - for(var/i in 2 to length(raw_colors)) - split_colors += "#[raw_colors[i]]" + var/list/new_split_colors = list() + var/list/colors = splittext(colorString, "#") + for(var/index in 2 to min(length(colors), config.expected_colors + 1)) + var/color = "#[colors[index]]" + if(!findtext(color, GLOB.is_color) && (!unlocked || !findtext(color, GLOB.is_alpha_color))) + return FALSE + new_split_colors += color + split_colors = new_split_colors + return TRUE /datum/greyscale_modify_menu/proc/randomize_color(color_index) var/new_color = "#" @@ -246,7 +270,7 @@ This is highly likely to cause massive amounts of lag as every object in the gam /datum/greyscale_modify_menu/proc/refresh_preview() for(var/i in length(split_colors) + 1 to config.expected_colors) - split_colors += rgb(100, 100, 100) + LAZYADD(split_colors, rgb(100, 100, 100)) var/list/used_colors = split_colors.Copy(1, config.expected_colors+1) sprite_data = list() @@ -257,8 +281,12 @@ This is highly likely to cause massive amounts of lag as every object in the gam sprite_data["icon_states"] = generated_icon_states if(!(icon_state in generated_icon_states)) - icon_state = target.icon_state - if(!(icon_state in generated_icon_states)) + if(isatom(target)) + var/atom/atom_target = target + icon_state = atom_target.icon_state + if(!(icon_state in generated_icon_states)) + icon_state = pick(generated_icon_states) + else icon_state = pick(generated_icon_states) var/image/finished @@ -294,10 +322,14 @@ This is highly likely to cause massive amounts of lag as every object in the gam unlocked = TRUE /datum/greyscale_modify_menu/proc/DefaultApply() - target.set_greyscale(split_colors, config.type) + var/atom/atom_target = target + atom_target.set_greyscale(split_colors, config.type) /// Gets the top level type that first uses the configuration in this type path /datum/greyscale_modify_menu/proc/SetupConfigOwner() + if(!isatom(target)) + return + var/atom/current = target.type var/atom/parent = target.parent_type if(!initial(current.greyscale_config)) diff --git a/code/modules/admin/permissionedit.dm b/code/modules/admin/permissionedit.dm index 5544f90fb7481..cf816fef8a7a1 100644 --- a/code/modules/admin/permissionedit.dm +++ b/code/modules/admin/permissionedit.dm @@ -192,6 +192,10 @@ admin_ckey = add_admin(admin_ckey, admin_key, use_db) if(!admin_ckey) return + + if(!admin_key) // Prevents failures in logging admin rank changes. + admin_key = admin_ckey + change_admin_rank(admin_ckey, admin_key, use_db, null, legacy_only) if("remove") remove_admin(admin_ckey, admin_key, use_db, D) diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 624af957a8430..f412f9d5a7236 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -224,7 +224,7 @@ var/color = "#e6e6e6" if(i%2 == 0) color = "#f2f2f2" - var/is_antagonist = is_special_character(M) + var/is_antagonist = is_special_character(M, allow_fake_antags = TRUE) var/M_job = "" diff --git a/code/modules/admin/smites/become_object.dm b/code/modules/admin/smites/become_object.dm new file mode 100644 index 0000000000000..5f1af4bee280f --- /dev/null +++ b/code/modules/admin/smites/become_object.dm @@ -0,0 +1,42 @@ +#define OBJECTIFY_TIME (5 SECONDS) + +/// Turns the target into an object (for instance bread) +/datum/smite/objectify + name = "Become Object" + /// What are we going to turn them into? + var/atom/transform_path = /obj/item/food/bread/plain + +/datum/smite/objectify/configure(client/user) + var/attempted_target_path = input( + user, + "Enter typepath of an atom you'd like to turn your victim into.", + "Typepath", + "[/obj/item/food/bread/plain]", + ) as null|text + + if (isnull(attempted_target_path)) + return FALSE //The user pressed "Cancel" + + var/desired_object = text2path(attempted_target_path) + if(!ispath(desired_object)) + desired_object = pick_closest_path(attempted_target_path, get_fancy_list_of_atom_types()) + if(isnull(desired_object) || !ispath(desired_object)) + return FALSE //The user pressed "Cancel" + if(!ispath(desired_object, /atom)) + tgui_alert(user, "ERROR: Incorrect / improper path given.") + return FALSE + transform_path = desired_object + +/datum/smite/objectify/effect(client/user, mob/living/target) + if (!isliving(target)) + return // This doesn't work on ghosts + . = ..() + var/mutable_appearance/objectified_player = mutable_appearance(initial(transform_path.icon), initial(transform_path.icon_state)) + objectified_player.pixel_x = initial(transform_path.pixel_x) + objectified_player.pixel_y = initial(transform_path.pixel_y) + var/mutable_appearance/transform_scanline = mutable_appearance('icons/effects/effects.dmi', "transform_effect") + target.transformation_animation(objectified_player, OBJECTIFY_TIME, transform_scanline.appearance) + target.Immobilize(OBJECTIFY_TIME, ignore_canstun = TRUE) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(objectify), target, transform_path), OBJECTIFY_TIME) + +#undef OBJECTIFY_TIME diff --git a/code/modules/admin/smites/bloodless.dm b/code/modules/admin/smites/bloodless.dm index f42711c0f7426..c970e920f2253 100644 --- a/code/modules/admin/smites/bloodless.dm +++ b/code/modules/admin/smites/bloodless.dm @@ -9,10 +9,10 @@ return var/mob/living/carbon/carbon_target = target for(var/_limb in carbon_target.bodyparts) - var/obj/item/bodypart/limb = _limb - var/type_wound = pick(list(/datum/wound/slash/severe, /datum/wound/slash/moderate)) + var/obj/item/bodypart/limb = _limb // fine to use this raw, its a meme smite + var/type_wound = pick(list(/datum/wound/slash/flesh/severe, /datum/wound/slash/flesh/moderate)) limb.force_wound_upwards(type_wound, smited = TRUE) - type_wound = pick(list(/datum/wound/slash/critical, /datum/wound/slash/severe, /datum/wound/slash/moderate)) + type_wound = pick(list(/datum/wound/slash/flesh/critical, /datum/wound/slash/flesh/severe, /datum/wound/slash/flesh/moderate)) limb.force_wound_upwards(type_wound, smited = TRUE) - type_wound = pick(list(/datum/wound/slash/critical, /datum/wound/slash/severe)) + type_wound = pick(list(/datum/wound/slash/flesh/critical, /datum/wound/slash/flesh/severe)) limb.force_wound_upwards(type_wound, smited = TRUE) diff --git a/code/modules/admin/smites/boneless.dm b/code/modules/admin/smites/boneless.dm index 09361cf75cb29..a3031ce13ffc7 100644 --- a/code/modules/admin/smites/boneless.dm +++ b/code/modules/admin/smites/boneless.dm @@ -11,11 +11,9 @@ var/mob/living/carbon/carbon_target = target for(var/obj/item/bodypart/limb as anything in carbon_target.bodyparts) - var/type_wound = pick(list( - /datum/wound/blunt/critical, - /datum/wound/blunt/severe, - /datum/wound/blunt/critical, - /datum/wound/blunt/severe, - /datum/wound/blunt/moderate, + var/severity = pick_weight(list( + WOUND_SEVERITY_MODERATE = 1, + WOUND_SEVERITY_SEVERE = 2, + WOUND_SEVERITY_CRITICAL = 2, )) - limb.force_wound_upwards(type_wound, smited = TRUE) + carbon_target.cause_wound_of_type_and_severity(WOUND_BLUNT, limb, severity) diff --git a/code/modules/admin/smites/bread.dm b/code/modules/admin/smites/bread.dm deleted file mode 100644 index 22ed8836df3b2..0000000000000 --- a/code/modules/admin/smites/bread.dm +++ /dev/null @@ -1,14 +0,0 @@ -#define BREADIFY_TIME (5 SECONDS) - -/// Turns the target into bread -/datum/smite/bread - name = "Bread" - -/datum/smite/bread/effect(client/user, mob/living/target) - . = ..() - var/mutable_appearance/bread_appearance = mutable_appearance('icons/obj/food/burgerbread.dmi', "bread") - var/mutable_appearance/transform_scanline = mutable_appearance('icons/effects/effects.dmi', "transform_effect") - target.transformation_animation(bread_appearance, BREADIFY_TIME, transform_scanline.appearance) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(breadify), target), BREADIFY_TIME) - -#undef BREADIFY_TIME diff --git a/code/modules/admin/smites/bsa.dm b/code/modules/admin/smites/bsa.dm index cf0399acf2612..bdf5f9e37b13c 100644 --- a/code/modules/admin/smites/bsa.dm +++ b/code/modules/admin/smites/bsa.dm @@ -20,10 +20,7 @@ target_turf.break_tile() if (target.health <= 1) - target.gib( - /* no_brain = */ TRUE, - /* no_organs = */ TRUE, - ) + target.gib(DROP_BODYPARTS) else target.adjustBruteLoss(min(BSA_MAX_DAMAGE, target.health - 1)) target.Paralyze(BSA_PARALYZE_TIME) diff --git a/code/modules/admin/smites/ghost_control.dm b/code/modules/admin/smites/ghost_control.dm index 4977b7092592f..bcce698956a60 100644 --- a/code/modules/admin/smites/ghost_control.dm +++ b/code/modules/admin/smites/ghost_control.dm @@ -46,6 +46,6 @@ sitting_chair.buckle_mob(target, check_loc = FALSE) /datum/smite/ghost_control/proc/ghost_speed(mob/living/target, new_speed) - if(target.m_intent == new_speed) + if(target.move_intent == new_speed) return target.toggle_move_intent() diff --git a/code/modules/admin/smites/gib.dm b/code/modules/admin/smites/gib.dm index 471479e7645c4..4c7c4324823cd 100644 --- a/code/modules/admin/smites/gib.dm +++ b/code/modules/admin/smites/gib.dm @@ -4,4 +4,4 @@ /datum/smite/gib/effect(client/user, mob/living/target) . = ..() - target.gib(/* no_brain = */ FALSE) + target.gib(DROP_ORGANS|DROP_BODYPARTS) diff --git a/code/modules/admin/smites/imaginary_friend_special.dm b/code/modules/admin/smites/imaginary_friend_special.dm index b5784b3c5273c..e95f8c52cb171 100644 --- a/code/modules/admin/smites/imaginary_friend_special.dm +++ b/code/modules/admin/smites/imaginary_friend_special.dm @@ -1,3 +1,8 @@ +#define CHOICE_RANDOM_APPEARANCE "Random" +#define CHOICE_PREFS_APPEARANCE "Look-a-like" +#define CHOICE_POLL_GHOSTS "Offer to ghosts" +#define CHOICE_CANCEL "Cancel" + /** * Custom imaginary friend. * @@ -10,34 +15,67 @@ **/ /datum/smite/custom_imaginary_friend name = "Imaginary Friend (Special)" - var/client/friend_candidate_client + /// Who are we going to add to your head today? + var/list/friend_candidates + /// Do we randomise friend appearances or not? var/random_appearance /datum/smite/custom_imaginary_friend/configure(client/user) - friend_candidate_client = tgui_input_list(user, "Pick the player to put in control", "New Imaginary Friend", sort_list(GLOB.clients)) - if(isnull(friend_candidate_client)) + var/appearance_choice = tgui_alert(user, + "Do you want the imaginary friend(s) to share name and appearance with their currently selected character preferences?", + "Imaginary Friend Appearance?", + list(CHOICE_PREFS_APPEARANCE, CHOICE_RANDOM_APPEARANCE, CHOICE_CANCEL)) + if (isnull(appearance_choice) || appearance_choice == CHOICE_CANCEL) + return FALSE + random_appearance = appearance_choice == CHOICE_RANDOM_APPEARANCE + + var/picked_client = tgui_input_list(user, "Pick the player to put in control", "New Imaginary Friend", list(CHOICE_POLL_GHOSTS) + sort_list(GLOB.clients)) + if(isnull(picked_client)) return FALSE + if(picked_client == CHOICE_POLL_GHOSTS) + return poll_ghosts(user) + + var/client/friend_candidate_client = picked_client if(QDELETED(friend_candidate_client)) - to_chat(user, span_notice("Selected player no longer has a client, aborting.")) + to_chat(user, span_warning("Selected player no longer has a client, aborting.")) return FALSE if(isliving(friend_candidate_client.mob) && (tgui_alert(user, "This player already has a living mob ([friend_candidate_client.mob]). Do you still want to turn them into an Imaginary Friend?", "Remove player from mob?", list("Do it!", "Cancel")) != "Do it!")) return FALSE if(QDELETED(friend_candidate_client)) - to_chat(user, span_notice("Selected player no longer has a client, aborting.")) + to_chat(user, span_warning("Selected player no longer has a client, aborting.")) return FALSE - if(friend_candidate_client.prefs) - var/choice = tgui_alert(user, "Do you want the imaginary friend to look like and be named after [friend_candidate_client]'s current preferences ([friend_candidate_client.prefs.read_preference(/datum/preference/name/real_name)])?", "Imaginary Friend Appearance?", list("Look-a-like", "Random", "Cancel")) - if(choice != "Look-a-like" && choice != "Random") - return FALSE - random_appearance = choice == "Random" - else - if(tgui_alert(user, "The preferences for the friend could not be loaded, defaulting to random appearance. Is that okay?", "Preference error", list("Yes", "No")) != "Yes") - return FALSE - random_appearance = TRUE + friend_candidates = list(friend_candidate_client) + return TRUE + +/// Try to offer the role to ghosts +/datum/smite/custom_imaginary_friend/proc/poll_ghosts(client/user) + var/how_many = tgui_input_number(user, "How many imaginary friends should be added?", "Imaginary friend count", default = 1, min_value = 1) + if (isnull(how_many) || how_many < 1) + return FALSE + + var/list/volunteers = poll_ghost_candidates( + question = "Do you want to play as an imaginary friend?", + jobban_type = ROLE_PAI, + poll_time = 10 SECONDS, + ignore_category = POLL_IGNORE_IMAGINARYFRIEND, + ) + var/volunteer_count = length(volunteers) + if (volunteer_count == 0) + to_chat(user, span_warning("No candidates volunteered, aborting.")) + return FALSE + + shuffle_inplace(volunteers) + friend_candidates = list() + while (how_many > 0 && length(volunteers) > 0) + var/mob/dead/observer/lucky_ghost = pop(volunteers) + if (!lucky_ghost.client) + continue + how_many-- + friend_candidates += lucky_ghost.client return TRUE /datum/smite/custom_imaginary_friend/effect(client/user, mob/living/target) @@ -47,18 +85,34 @@ to_chat(user, span_warning("The target mob no longer exists, aborting.")) return - if(QDELETED(friend_candidate_client)) - to_chat(user, span_warning("Imaginary friend candidate no longer has a client, aborting.")) + if(!length(friend_candidates)) + to_chat(user, span_warning("No provided imaginary friend candidates, aborting.")) return - if(isliving(friend_candidate_client.mob)) - friend_candidate_client.mob.ghostize(can_reenter_corpse = TRUE) + var/list/final_clients = list() + for (var/client/client as anything in friend_candidates) + if (QDELETED(client)) + continue + final_clients += client + + if(!length(final_clients)) + to_chat(user, span_warning("No provided imaginary friend candidates had clients, aborting.")) + return - var/mob/camera/imaginary_friend/friend_mob + for (var/client/friend_candidate_client as anything in final_clients) + var/mob/client_mob = friend_candidate_client.mob + if(isliving(client_mob)) + client_mob.ghostize() - if(random_appearance) - friend_mob = new /mob/camera/imaginary_friend(get_turf(target), target) - else - friend_mob = new /mob/camera/imaginary_friend(get_turf(target), target, friend_candidate_client.prefs) + var/mob/camera/imaginary_friend/friend_mob = client_mob.change_mob_type( + new_type = /mob/camera/imaginary_friend, + location = get_turf(client_mob), + delete_old_mob = TRUE, + ) + friend_mob.attach_to_owner(target) + friend_mob.setup_appearance(random_appearance ? null : friend_candidate_client.prefs) - friend_mob.key = friend_candidate_client.key +#undef CHOICE_RANDOM_APPEARANCE +#undef CHOICE_PREFS_APPEARANCE +#undef CHOICE_POLL_GHOSTS +#undef CHOICE_CANCEL diff --git a/code/modules/admin/smites/petrify.dm b/code/modules/admin/smites/petrify.dm new file mode 100644 index 0000000000000..5380b93d7326e --- /dev/null +++ b/code/modules/admin/smites/petrify.dm @@ -0,0 +1,12 @@ +/// Turn pur target to stone, forever +/datum/smite/petrify + name = "Petrify" + +/datum/smite/petrify/effect(client/user, mob/living/target) + . = ..() + + if(!ishuman(target)) + to_chat(user, span_warning("This must be used on a human subtype."), confidential = TRUE) + return + var/mob/living/carbon/human/human_target = target + human_target.petrify(statue_timer = INFINITY, save_brain = FALSE) diff --git a/code/modules/admin/smites/puzzgrid.dm b/code/modules/admin/smites/puzzgrid.dm index 481f85a191f67..fe5f88d6a5f3a 100644 --- a/code/modules/admin/smites/puzzgrid.dm +++ b/code/modules/admin/smites/puzzgrid.dm @@ -91,7 +91,7 @@ span_bolddanger("You were unable to free [victim] from their fiendish prison, leaving them as nothing more than a smattering of mush!"), span_bolddanger("Your compatriates were unable to free you from your fiendish prison, leaving you as nothing more than a smattering of mush!"), ) - victim.gib() + victim.gib(DROP_ALL_REMAINS) victim = null qdel(src) diff --git a/code/modules/admin/sql_ban_system.dm b/code/modules/admin/sql_ban_system.dm index 146d9612f031a..20d5e601b8caa 100644 --- a/code/modules/admin/sql_ban_system.dm +++ b/code/modules/admin/sql_ban_system.dm @@ -3,54 +3,88 @@ #define MAX_REASON_LENGTH 600 -//checks client ban cache or DB ban table if ckey is banned from one or more roles -//doesn't return any details, use only for if statements -/proc/is_banned_from(player_ckey, list/roles) - if(!player_ckey) - return +/** + * Checks client ban cache or, if it doesn't exist, queries the DB ban table to see if the player's + * ckey is banned from at least one of the provided roles. + * + * Returns TRUE if the player matches with one or more role bans. + * Returns FALSE if the player doesn't match with any role bans. Possible errors states also return FALSE. + * + * Args: + * * player_key - Either key or ckey of the player you want to check for role bans. + * * roles - Accepts either a single role string, or a list of role strings. + */ +/proc/is_banned_from(player_key, list/roles) + if(!player_key) + stack_trace("Called is_banned_from without specifying a ckey.") + return FALSE + + // Convert to ckey. This allows is_banned_from to take either key or ckey interchangably, + // and is officially a feature of the proc. + var/player_ckey = ckey(player_key) + var/client/player_client = GLOB.directory[player_ckey] + + // If there's a player client, we try to set up their ban cache (if it doesn't already exist) and test from that. if(player_client) var/list/ban_cache = retrieve_ban_cache(player_client) + + // If this isn't a list, the client disconnected while building it. if(!islist(ban_cache)) - return // Disconnected while building the list. + return FALSE + + // If it is a list, check each role. if(islist(roles)) for(var/role in roles) if(role in ban_cache) return TRUE //they're banned from at least one role, no need to keep checking - else if(roles in ban_cache) - return TRUE + + return FALSE + + // Otherwise, it's just a single role string. Return if it's in the ban cache. + return (roles in ban_cache) + + // If there's no player client, we'll ask the database. + var/values = list( + "player_ckey" = player_ckey, + "must_apply_to_admins" = !!(GLOB.admin_datums[player_ckey] || GLOB.deadmins[player_ckey]), + ) + + var/sql_roles + if(islist(roles)) + var/list/sql_roles_list = list() + for (var/i in 1 to roles.len) + values["role[i]"] = roles[i] + sql_roles_list += ":role[i]" + sql_roles = sql_roles_list.Join(", ") else - var/values = list( - "player_ckey" = player_ckey, - "must_apply_to_admins" = !!(GLOB.admin_datums[player_ckey] || GLOB.deadmins[player_ckey]), - ) - var/sql_roles - if(islist(roles)) - var/list/sql_roles_list = list() - for (var/i in 1 to roles.len) - values["role[i]"] = roles[i] - sql_roles_list += ":role[i]" - sql_roles = sql_roles_list.Join(", ") - else - values["role"] = roles - sql_roles = ":role" - var/datum/db_query/query_check_ban = SSdbcore.NewQuery({" - SELECT 1 - FROM [format_table_name("ban")] - WHERE - ckey = :player_ckey AND - role IN ([sql_roles]) AND - unbanned_datetime IS NULL AND - (expiration_time IS NULL OR expiration_time > NOW()) - AND (NOT :must_apply_to_admins OR applies_to_admins = 1) - "}, values) - if(!query_check_ban.warn_execute()) - qdel(query_check_ban) - return - if(query_check_ban.NextRow()) - qdel(query_check_ban) - return TRUE + values["role"] = roles + sql_roles = ":role" + + var/datum/db_query/query_check_ban = SSdbcore.NewQuery({" + SELECT 1 + FROM [format_table_name("ban")] + WHERE + ckey = :player_ckey AND + role IN ([sql_roles]) AND + unbanned_datetime IS NULL AND + (expiration_time IS NULL OR expiration_time > NOW()) + AND (NOT :must_apply_to_admins OR applies_to_admins = 1) + "}, values) + + // If there's an SQL error, return FALSE. + if(!query_check_ban.warn_execute()) qdel(query_check_ban) + return FALSE + + // If there are any rows, we got a match and they're role banned from at least one role. + if(query_check_ban.NextRow()) + qdel(query_check_ban) + return TRUE + + // Otherwise, they're not banned from any roles in the DB. + qdel(query_check_ban) + return FALSE //checks DB ban table if a ckey, ip and/or cid is banned from a specific role //returns an associative nested list of each matching row's ban id, bantime, ban round id, expiration time, ban duration, applies to admins, reason, key, ip, cid and banning admin's key in that order @@ -332,6 +366,7 @@ var/list/long_job_lists = list( "Ghost and Other Roles" = list( ROLE_PAI, + ROLE_BOT, ROLE_BRAINWASHED, ROLE_DEATHSQUAD, ROLE_DRONE, diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index a54d8a0538198..89503ef1f43d9 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -162,7 +162,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 = TRUE //Yeah there we go APC destroyed mission accomplished + SSticker.force_ending = ADMIN_FORCE_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.")) @@ -430,6 +430,39 @@ log_admin("[key_name(usr)] removed [rule] from the forced roundstart rulesets.") message_admins("[key_name(usr)] removed [rule] from the forced roundstart rulesets.", 1) + else if (href_list["f_dynamic_ruleset_manage"]) + if(!check_rights(R_ADMIN)) + return + dynamic_ruleset_manager(usr) + else if (href_list["f_dynamic_ruleset_force_all_on"]) + if(!check_rights(R_ADMIN)) + return + force_all_rulesets(usr, RULESET_FORCE_ENABLED) + else if (href_list["f_dynamic_ruleset_force_all_off"]) + if(!check_rights(R_ADMIN)) + return + force_all_rulesets(usr, RULESET_FORCE_DISABLED) + else if (href_list["f_dynamic_ruleset_force_all_reset"]) + if(!check_rights(R_ADMIN)) + return + force_all_rulesets(usr, RULESET_NOT_FORCED) + else if (href_list["f_dynamic_ruleset_force_on"]) + if(!check_rights(R_ADMIN)) + return + set_dynamic_ruleset_forced(usr, locate(href_list["f_dynamic_ruleset_force_on"]), RULESET_FORCE_ENABLED) + else if (href_list["f_dynamic_ruleset_force_off"]) + if(!check_rights(R_ADMIN)) + return + set_dynamic_ruleset_forced(usr, locate(href_list["f_dynamic_ruleset_force_off"]), RULESET_FORCE_DISABLED) + else if (href_list["f_dynamic_ruleset_force_reset"]) + if(!check_rights(R_ADMIN)) + return + set_dynamic_ruleset_forced(usr, locate(href_list["f_dynamic_ruleset_force_reset"]), RULESET_NOT_FORCED) + else if (href_list["f_inspect_ruleset"]) + if(!check_rights(R_ADMIN)) + return + usr.client.debug_variables(locate(href_list["f_inspect_ruleset"])) + else if (href_list["f_dynamic_options"]) if(!check_rights(R_ADMIN)) return @@ -652,7 +685,7 @@ if(ishuman(L)) var/mob/living/carbon/human/observer = L - observer.equip_to_slot_or_del(new /obj/item/clothing/under/suit/black(observer), ITEM_SLOT_ICLOTHING) + observer.equip_to_slot_or_del(new /obj/item/clothing/under/costume/buttondown/slacks/service(observer), ITEM_SLOT_ICLOTHING) observer.equip_to_slot_or_del(new /obj/item/clothing/neck/tie/black/tied(observer), ITEM_SLOT_NECK) observer.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(observer), ITEM_SLOT_FEET) L.Unconscious(100) @@ -1060,8 +1093,7 @@ if(!ismob(M)) to_chat(usr, "This can only be used on instances of type /mob.", confidential = TRUE) return - var/datum/language_holder/H = M.get_language_holder() - H.open_language_menu(usr) + M.get_language_holder().open_language_menu(usr) else if(href_list["traitor"]) if(!check_rights(R_ADMIN)) @@ -1268,16 +1300,16 @@ new /obj/effect/pod_landingzone(target, pod) if (number == 1) - log_admin("[key_name(usr)] created a [english_list(paths)]") + log_admin("[key_name(usr)] created an instance of [english_list(paths)]") for(var/path in paths) if(ispath(path, /mob)) - message_admins("[key_name_admin(usr)] created a [english_list(paths)]") + message_admins("[key_name_admin(usr)] created an instance of [english_list(paths)]") break else - log_admin("[key_name(usr)] created [number]ea [english_list(paths)]") + log_admin("[key_name(usr)] created [number] instances of [english_list(paths)]") for(var/path in paths) if(ispath(path, /mob)) - message_admins("[key_name_admin(usr)] created [number]ea [english_list(paths)]") + message_admins("[key_name_admin(usr)] created [number] instances of [english_list(paths)]") break return @@ -1308,7 +1340,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 as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/nuclearbomb/selfdestruct)) SD.r_code = code message_admins("[key_name_admin(usr)] has set the self-destruct \ code to \"[code]\".") @@ -1762,9 +1794,15 @@ if(!check_rights(R_SOUND)) return + var/credit = href_list["credit"] var/link_url = href_list["play_internet"] if(!link_url) return - web_sound(usr, link_url) + web_sound(usr, link_url, credit) + + else if(href_list["debug_z_levels"]) + if(!check_rights(R_DEBUG)) + return + owner.debug_z_levels() diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index bd94e2ecc873b..0702183bfe2ea 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -201,6 +201,9 @@ message_admins(span_danger("ERROR: Non-admin [key_name(usr)] attempted to execute a SDQL query!")) usr.log_message("non-admin attempted to execute a SDQL query!", LOG_ADMIN) 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) diff --git a/code/modules/admin/verbs/admin_newscaster.dm b/code/modules/admin/verbs/admin_newscaster.dm index e6616e2539b8c..0a25ebaca6559 100644 --- a/code/modules/admin/verbs/admin_newscaster.dm +++ b/code/modules/admin/verbs/admin_newscaster.dm @@ -304,7 +304,7 @@ return TRUE var/choice = tgui_alert(usr, "Please confirm feed channel creation","Network Channel Handler", list("Confirm","Cancel")) if(choice == "Confirm") - GLOB.news_network.create_feed_channel(channel_name, "Centcom Offical", channel_desc, locked = channel_locked) + GLOB.news_network.create_feed_channel(channel_name, "Centcom Official", channel_desc, locked = channel_locked) SSblackbox.record_feedback("text", "newscaster_channels", 1, "[channel_name]") creating_channel = FALSE @@ -316,7 +316,7 @@ creating_comment = FALSE return TRUE var/datum/feed_comment/new_feed_comment = new /datum/feed_comment - new_feed_comment.author = "Centcom Offical" + new_feed_comment.author = "Centcom Official" new_feed_comment.body = comment_text new_feed_comment.time_stamp = station_time_timestamp() current_message.comments += new_feed_comment diff --git a/code/modules/admin/verbs/adminevents.dm b/code/modules/admin/verbs/adminevents.dm index 51091a5b4a427..da7102fa43fb5 100644 --- a/code/modules/admin/verbs/adminevents.dm +++ b/code/modules/admin/verbs/adminevents.dm @@ -277,7 +277,7 @@ SSshuttle.hostile_environments.Cut() SSshuttle.checkHostileEnvironment() -/client/proc/toggle_nuke(obj/machinery/nuclearbomb/N in GLOB.nuke_list) +/client/proc/toggle_nuke(obj/machinery/nuclearbomb/N in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/nuclearbomb)) set category = "Admin.Events" set name = "Toggle Nuke" set popup_menu = FALSE @@ -338,9 +338,9 @@ log_admin("[key_name(usr)] started weather of type [weather_type] on the z-level [z_level].") SSblackbox.record_feedback("tally", "admin_verb", 1, "Run Weather") -/client/proc/add_mob_ability() +/client/proc/add_marked_mob_ability() set category = "Admin.Events" - set name = "Add Mob Ability" + set name = "Add Mob Ability (Marked Mob)" set desc = "Adds an ability to a marked mob." if(!holder) @@ -349,52 +349,11 @@ if(!isliving(holder.marked_datum)) to_chat(usr, span_warning("Error: Please mark a mob to add actions to it.")) return + give_mob_action(holder.marked_datum) - var/mob/living/marked_mob = holder.marked_datum - - var/list/all_mob_actions = sort_list(subtypesof(/datum/action/cooldown/mob_cooldown), GLOBAL_PROC_REF(cmp_typepaths_asc)) - - var/ability_type = tgui_input_list(usr, "Choose an ability", "Ability", all_mob_actions) - - if(!ability_type) - return - - var/datum/action/cooldown/mob_cooldown/add_ability - - var/make_sequence = tgui_alert(usr, "Would you like this action to be a sequence of multiple abilities?", "Sequence Ability", list("Yes", "No")) - if(make_sequence == "Yes") - add_ability = new /datum/action/cooldown/mob_cooldown(marked_mob) - add_ability.sequence_actions = list() - while(!isnull(ability_type)) - var/ability_delay = tgui_input_number(usr, "Enter the delay in seconds before the next ability in the sequence is used", "Ability Delay", 2) - if(isnull(ability_delay) || ability_delay < 0) - ability_delay = 0 - add_ability.sequence_actions[ability_type] = ability_delay * 1 SECONDS - ability_type = tgui_input_list(usr, "Choose a new sequence ability", "Sequence Ability", all_mob_actions) - var/ability_cooldown = tgui_input_number(usr, "Enter the sequence abilities cooldown in seconds", "Ability Cooldown", 2) - if(isnull(ability_cooldown) || ability_cooldown < 0) - ability_cooldown = 2 - add_ability.cooldown_time = ability_cooldown * 1 SECONDS - var/ability_melee_cooldown = tgui_input_number(usr, "Enter the abilities melee cooldown in seconds", "Melee Cooldown", 2) - if(isnull(ability_melee_cooldown) || ability_melee_cooldown < 0) - ability_melee_cooldown = 2 - add_ability.melee_cooldown_time = ability_melee_cooldown * 1 SECONDS - add_ability.name = tgui_input_text(usr, "Choose ability name", "Ability name", "Generic Ability") - add_ability.create_sequence_actions() - else - add_ability = new ability_type(marked_mob) - - if(isnull(marked_mob)) - return - add_ability.Grant(marked_mob) - - message_admins("[key_name_admin(usr)] added mob ability [ability_type] to mob [marked_mob].") - log_admin("[key_name(usr)] added mob ability [ability_type] to mob [marked_mob].") - SSblackbox.record_feedback("tally", "admin_verb", 1, "Add Mob Ability") // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! - -/client/proc/remove_mob_ability() +/client/proc/remove_marked_mob_ability() set category = "Admin.Events" - set name = "Remove Mob Ability" + set name = "Remove Mob Ability (Marked Mob)" set desc = "Removes an ability from marked mob." if(!holder) @@ -403,24 +362,7 @@ if(!isliving(holder.marked_datum)) to_chat(usr, span_warning("Error: Please mark a mob to remove actions from it.")) return - - var/mob/living/marked_mob = holder.marked_datum - - var/list/all_mob_actions = list() - for(var/datum/action/cooldown/mob_cooldown/ability in marked_mob.actions) - all_mob_actions.Add(ability) - - var/datum/action/cooldown/mob_cooldown/ability = tgui_input_list(usr, "Remove an ability", "Ability", all_mob_actions) - - if(!ability) - return - - var/ability_name = ability.name - QDEL_NULL(ability) - - message_admins("[key_name_admin(usr)] removed ability [ability_name] from mob [marked_mob].") - log_admin("[key_name(usr)] removed mob ability [ability_name] from mob [marked_mob].") - SSblackbox.record_feedback("tally", "admin_verb", 1, "Remove Mob Ability") // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! + remove_mob_action(holder.marked_datum) /client/proc/command_report_footnote() set category = "Admin.Events" diff --git a/code/modules/admin/verbs/adminfun.dm b/code/modules/admin/verbs/adminfun.dm index e6e392c1bf9f3..f51a922e41928 100644 --- a/code/modules/admin/verbs/adminfun.dm +++ b/code/modules/admin/verbs/adminfun.dm @@ -60,11 +60,11 @@ if(!check_rights(R_ADMIN)) return - var/confirm = tgui_alert(usr, "Drop a brain?", "Confirm", list("Yes", "No","Cancel")) + var/confirm = tgui_alert(usr, "Drop a brain?", "Confirm", list("Yes", "No","Cancel")) || "Cancel" if(confirm == "Cancel") return //Due to the delay here its easy for something to have happened to the mob - if(!victim) + if(isnull(victim)) return log_admin("[key_name(usr)] has gibbed [key_name(victim)]") @@ -78,9 +78,9 @@ if (istype(living_victim)) living_victim.investigate_log("has been gibbed by an admin.", INVESTIGATE_DEATHS) if(confirm == "Yes") - living_victim.gib() + living_victim.gib(DROP_ALL_REMAINS) else - living_victim.gib(TRUE) + living_victim.gib(DROP_ORGANS|DROP_BODYPARTS) SSblackbox.record_feedback("tally", "admin_verb", 1, "Gib") // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! @@ -89,14 +89,15 @@ set category = "Admin.Fun" var/confirm = tgui_alert(usr, "You sure?", "Confirm", list("Yes", "No")) - if(confirm == "Yes") - log_admin("[key_name(usr)] used gibself.") - message_admins(span_adminnotice("[key_name_admin(usr)] used gibself.")) - SSblackbox.record_feedback("tally", "admin_verb", 1, "Gib Self") // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! + if(confirm != "Yes") + return + log_admin("[key_name(usr)] used gibself.") + message_admins(span_adminnotice("[key_name_admin(usr)] used gibself.")) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Gib Self") // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! - var/mob/living/ourself = mob - if (istype(ourself)) - ourself.gib(TRUE, TRUE, TRUE) + var/mob/living/ourself = mob + if (istype(ourself)) + ourself.gib() /client/proc/everyone_random() set category = "Admin.Fun" @@ -114,7 +115,7 @@ to_chat(usr, "Disabled.", confidential = TRUE) return - var/notifyplayers = tgui_alert(usr, "Do you want to notify the players?", "Options", list("Yes", "No", "Cancel")) + var/notifyplayers = tgui_alert(usr, "Do you want to notify the players?", "Options", list("Yes", "No", "Cancel")) || "Cancel" if(notifyplayers == "Cancel") return @@ -218,9 +219,9 @@ return smite.effect(src, target) -///"Turns" people into bread. Really, we just add them to the contents of the bread food item. -/proc/breadify(atom/movable/target) - var/obj/item/food/bread/plain/smite/tomb = new(get_turf(target)) +/// "Turns" people into objects. Really, we just add them to the contents of the item. +/proc/objectify(atom/movable/target, path) + var/atom/tomb = new path(get_turf(target)) target.forceMove(tomb) target.AddComponent(/datum/component/itembound, tomb) diff --git a/code/modules/admin/verbs/admingame.dm b/code/modules/admin/verbs/admingame.dm index d8abd0ea5ad6c..8430fe76fe86d 100644 --- a/code/modules/admin/verbs/admingame.dm +++ b/code/modules/admin/verbs/admingame.dm @@ -215,7 +215,7 @@ Traitors and the like can also be revived with the previous role mostly intact. new_character.real_name = record_found.name new_character.gender = lowertext(record_found.gender) new_character.age = record_found.age - var/datum/dna/found_dna = record_found.dna_ref + var/datum/dna/found_dna = record_found.locked_dna new_character.hardset_dna(found_dna.unique_identity, found_dna.mutation_index, null, record_found.name, record_found.blood_type, new record_found.species_type, found_dna.features) else new_character.randomize_human_appearance() diff --git a/code/modules/admin/verbs/ai_triumvirate.dm b/code/modules/admin/verbs/ai_triumvirate.dm index ca7ebfe7cc43d..d63994a25c319 100644 --- a/code/modules/admin/verbs/ai_triumvirate.dm +++ b/code/modules/admin/verbs/ai_triumvirate.dm @@ -13,14 +13,15 @@ GLOBAL_DATUM(triple_ai_controller, /datum/triple_ai_controller) . = ..() RegisterSignal(SSjob, COMSIG_OCCUPATIONS_DIVIDED, PROC_REF(on_occupations_divided)) -/datum/triple_ai_controller/proc/on_occupations_divided(datum/source) +/datum/triple_ai_controller/proc/on_occupations_divided(datum/source, pure, allow_all) SIGNAL_HANDLER for(var/datum/job/ai/ai_datum in SSjob.joinable_occupations) ai_datum.spawn_positions = 3 - for(var/obj/effect/landmark/start/ai/secondary/secondary_ai_spawn in GLOB.start_landmarks_list) - secondary_ai_spawn.latejoin_active = TRUE - qdel(src) + if(!pure) + for(var/obj/effect/landmark/start/ai/secondary/secondary_ai_spawn in GLOB.start_landmarks_list) + secondary_ai_spawn.latejoin_active = TRUE + qdel(src) /datum/triple_ai_controller/Destroy(force) UnregisterSignal(SSjob, COMSIG_OCCUPATIONS_DIVIDED) diff --git a/code/modules/admin/verbs/atmosdebug.dm b/code/modules/admin/verbs/atmosdebug.dm index 81e92a527165a..202672e805d83 100644 --- a/code/modules/admin/verbs/atmosdebug.dm +++ b/code/modules/admin/verbs/atmosdebug.dm @@ -7,19 +7,19 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Check Plumbing") // If you are copy-pasting this, ensure the 4th 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 as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/atmospherics/components)) 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 as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/atmospherics/pipe)) 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 as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/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) diff --git a/code/modules/admin/verbs/borgpanel.dm b/code/modules/admin/verbs/borgpanel.dm index 9594852522980..b8fd3698a563e 100644 --- a/code/modules/admin/verbs/borgpanel.dm +++ b/code/modules/admin/verbs/borgpanel.dm @@ -51,9 +51,10 @@ "scrambledcodes" = borg.scrambledcodes ) .["upgrades"] = list() - for (var/upgradetype in subtypesof(/obj/item/borg/upgrade)-/obj/item/borg/upgrade/hypospray) //hypospray is a dummy parent for hypospray upgrades + var/static/list/not_shown_upgrades = list(/obj/item/borg/upgrade/hypospray) + for (var/upgradetype in subtypesof(/obj/item/borg/upgrade)-not_shown_upgrades) //hypospray is a dummy parent for hypospray upgrades var/obj/item/borg/upgrade/upgrade = upgradetype - if (initial(upgrade.model_type) && !is_type_in_list(borg.model, initial(upgrade.model_type))) // Upgrade requires a different model + if (initial(upgrade.model_type) && !is_type_in_list(borg.model, initial(upgrade.model_type))) // Upgrade requires a different model //HEY ASSHOLE, INITIAL DOESNT WORK WITH LISTS continue var/installed = FALSE if (locate(upgradetype) in borg) diff --git a/code/modules/admin/verbs/change_shuttle_events.dm b/code/modules/admin/verbs/change_shuttle_events.dm new file mode 100644 index 0000000000000..4ec8a7cd7b83a --- /dev/null +++ b/code/modules/admin/verbs/change_shuttle_events.dm @@ -0,0 +1,42 @@ +///Manipulate the events that are gonna run/are running on the escape shuttle +/datum/admins/proc/change_shuttle_events() + set category = "Admin.Events" + set name = "Change Shuttle Events" + set desc = "Allows you to change the events on a shuttle." + + if (!istype(src, /datum/admins)) + src = usr.client.holder + if (!istype(src, /datum/admins)) + to_chat(usr, "Error: you are not an admin!", confidential = TRUE) + return + + //At least for now, just letting admins modify the emergency shuttle is fine + var/obj/docking_port/mobile/port = SSshuttle.emergency + + if(!port) + to_chat(usr, span_admin("Uh oh, couldn't find the escape shuttle!")) + + var/list/options = list("Clear"="Clear") + + //Grab the active events so we know which ones we can Add or Remove + var/list/active = list() + for(var/datum/shuttle_event/event in port.event_list) + active[event.type] = event + + for(var/datum/shuttle_event/event as anything in subtypesof(/datum/shuttle_event)) + options[((event in active) ? "(Remove)" : "(Add)") + initial(event.name)] = event + + //Throw up an ugly menu with the shuttle events and the options to add or remove them, or clear them all + var/result = input(usr, "Choose an event to add/remove", "Shuttle Events") as null|anything in sort_list(options) + + if(result == "Clear") + port.event_list.Cut() + message_admins("[key_name_admin(usr)] has cleared the shuttle events on: [port]") + else if(options[result]) + var/typepath = options[result] + if(typepath in active) + port.event_list.Remove(active[options[result]]) + message_admins("[key_name_admin(usr)] has removed '[active[result]]' from [port].") + else + port.event_list.Add(new typepath (port)) + message_admins("[key_name_admin(usr)] has added '[typepath]' to [port].") diff --git a/code/modules/admin/verbs/commandreport.dm b/code/modules/admin/verbs/commandreport.dm index 635cb28cbb28d..badf3babb6698 100644 --- a/code/modules/admin/verbs/commandreport.dm +++ b/code/modules/admin/verbs/commandreport.dm @@ -46,6 +46,8 @@ var/command_report_content /// Whether the report's contents are announced. var/announce_contents = TRUE + /// Whether a copy of the report is printed at every console. + var/print_report = TRUE /// The sound that's going to accompany our message. var/played_sound = DEFAULT_ANNOUNCEMENT_SOUND /// A static list of preset names that can be chosen. @@ -75,6 +77,7 @@ data["custom_name"] = custom_name data["command_report_content"] = command_report_content data["announce_contents"] = announce_contents + data["print_report"] = print_report data["played_sound"] = played_sound return data @@ -103,6 +106,8 @@ played_sound = params["picked_sound"] if("toggle_announce") announce_contents = !announce_contents + if("toggle_printing") + print_report = !print_report if("submit_report") if(!command_name) to_chat(ui_user, span_danger("You can't send a report with no command name.")) @@ -132,7 +137,9 @@ if(announce_contents) priority_announce(command_report_content, null, report_sound, has_important_message = TRUE) - print_command_report(command_report_content, "[announce_contents ? "" : "Classified "][command_name] Update", !announce_contents) + + if(!announce_contents || print_report) + print_command_report(command_report_content, "[announce_contents ? "" : "Classified "][command_name] Update", !announce_contents) change_command_name(original_command_name) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index b68db5cdeba3b..99491dd7cb337 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -177,7 +177,7 @@ id.forceMove(W) W.update_icon() else - H.equip_to_slot(id,ITEM_SLOT_ID) + H.equip_to_slot(id, ITEM_SLOT_ID) else tgui_alert(usr,"Invalid mob") @@ -299,7 +299,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 SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/apc)) var/area/A = APC.area if(!A) dat += "Skipped over [APC] in invalid location, [APC.loc]." @@ -328,7 +328,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 SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/light)) var/area/A = get_area(L) if(!A) dat += "Skipped over [L] in invalid location, [L.loc].
" @@ -337,7 +337,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 SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/light_switch)) var/area/A = get_area(LS) if(!A) dat += "Skipped over [LS] in invalid location, [LS.loc].
" @@ -600,6 +600,9 @@ dellog += "
  • Ignored force: [I.no_respect_force]
  • " if (I.no_hint) dellog += "
  • No hint: [I.no_hint]
  • " + if(LAZYLEN(I.extra_details)) + var/details = I.extra_details.Join("
  • ") + dellog += "
  • Extra Info:
    • [details]
    " dellog += "
  • " dellog += "" @@ -705,6 +708,8 @@ themed_names = list() for (var/name in SSmapping.themed_ruins[theme]) var/datum/map_template/ruin/ruin = SSmapping.themed_ruins[theme][name] + if(names[name]) + name = "[theme] [name]" themed_names[name] = list(ruin, theme, list(ruin.default_area)) names += sort_list(themed_names) diff --git a/code/modules/admin/verbs/ert.dm b/code/modules/admin/verbs/ert.dm index f87eec87675b2..faedf1887e0f4 100644 --- a/code/modules/admin/verbs/ert.dm +++ b/code/modules/admin/verbs/ert.dm @@ -25,7 +25,7 @@ /datum/admins/proc/equipAntagOnDummy(mob/living/carbon/human/dummy/mannequin, datum/antagonist/antag) - for(var/I in mannequin.get_equipped_items(TRUE)) + for(var/I in mannequin.get_equipped_items(include_pockets = TRUE)) qdel(I) if (ispath(antag, /datum/antagonist/ert)) var/datum/antagonist/ert/ert = antag @@ -254,7 +254,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 as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/poddoor/ert)) door.open() CHECK_TICK return TRUE diff --git a/code/modules/admin/verbs/grant_dna_infusion.dm b/code/modules/admin/verbs/grant_dna_infusion.dm new file mode 100644 index 0000000000000..06cfa8110d60d --- /dev/null +++ b/code/modules/admin/verbs/grant_dna_infusion.dm @@ -0,0 +1,36 @@ +/* + * Attempts to grant the target all organs from a given DNA infuser entry.area + * Returns the entry if all organs were successfully replaced. + * If no infusion was picked, the infusion had no organs, or if one or more organs could not be granted, returns FALSE +*/ +/client/proc/grant_dna_infusion(mob/living/carbon/human/target in world) + set name = "Apply DNA Infusion" + set category = "Debug" + + var/list/infusions = list() + for(var/datum/infuser_entry/path as anything in subtypesof(/datum/infuser_entry)) + var/str = "[initial(path.name)] ([path])" + infusions[str] = path + + var/datum/infuser_entry/picked_infusion = tgui_input_list(usr, "Select infusion", "Apply DNA Infusion", infusions) + + if(isnull(picked_infusion)) + return FALSE + + // This is necessary because list propererties are not defined until initialization + picked_infusion = infusions[picked_infusion] + picked_infusion = new picked_infusion + + if(!length(picked_infusion.output_organs)) + return FALSE + + . = picked_infusion + for(var/obj/item/organ/infusion_organ as anything in picked_infusion.output_organs) + var/obj/item/organ/new_organ = new infusion_organ() + if(!new_organ.replace_into(target)) + to_chat(usr, span_notice("[target] is unable to carry [new_organ]!")) + qdel(new_organ) + . = FALSE + continue + log_admin("[key_name(usr)] has added organ [new_organ.type] to [key_name(target)]") + message_admins("[key_name_admin(usr)] has added organ [new_organ.type] to [ADMIN_LOOKUPFLW(target)]") diff --git a/code/modules/admin/verbs/light_debug.dm b/code/modules/admin/verbs/light_debug.dm new file mode 100644 index 0000000000000..ae5b24ff38032 --- /dev/null +++ b/code/modules/admin/verbs/light_debug.dm @@ -0,0 +1,419 @@ + +/proc/debug_sources() + GLOB.light_debug_enabled = TRUE + var/list/sum = list() + var/total = 0 + for(var/datum/light_source/source) + if(!source.source_atom) + continue + source.source_atom.debug() + sum[source.source_atom.type] += 1 + total += 1 + + sum = sortTim(sum, /proc/cmp_numeric_asc, TRUE) + var/text = "" + for(var/type in sum) + text += "[type] = [sum[type]]\n" + text += "total iterated: [total]" + + for(var/client/lad in GLOB.admins) + var/datum/action/spawn_light/let_there_be = new (lad.mob.mind || lad.mob) + let_there_be.Grant(lad.mob) + + // I am sorry + SSdcs.RegisterSignal(SSdcs, COMSIG_GLOB_CLIENT_CONNECT, TYPE_PROC_REF(/datum/controller/subsystem/processing/dcs, on_client_connect)) + message_admins(text) + +/datum/controller/subsystem/processing/dcs/proc/on_client_connect(datum/source, client/new_lad) + SIGNAL_HANDLER + var/datum/action/spawn_light/let_there_be = new (new_lad.mob.mind || new_lad.mob) + let_there_be.Grant(new_lad.mob) + +/proc/undebug_sources() + GLOB.light_debug_enabled = FALSE + for(var/datum/weakref/button_ref as anything in GLOB.light_debugged_atoms) + var/atom/button = button_ref.resolve() + if(!button) + GLOB.light_debugged_atoms -= button_ref + continue + button.undebug() + + SEND_GLOBAL_SIGNAL(COMSIG_LIGHT_DEBUG_DISABLED) + SSdcs.UnregisterSignal(SSdcs, COMSIG_GLOB_CLIENT_CONNECT) + +GLOBAL_LIST_EMPTY(light_debugged_atoms) +/// Sets up this light source to be debugged, setting up in world buttons to control and move it +/// Also freezes it, so it can't change in future +/atom/proc/debug() + if(isturf(src) || HAS_TRAIT(src, TRAIT_LIGHTING_DEBUGGED)) + return + ADD_TRAIT(src, TRAIT_LIGHTING_DEBUGGED, LIGHT_DEBUG_TRAIT) + GLOB.light_debugged_atoms += WEAKREF(src) + add_filter("debug_light", 0, outline_filter(2, COLOR_CENTCOM_BLUE)) + var/static/uid = 0 + if(!render_target) + render_target = "light_debug_[uid]" + uid++ + var/atom/movable/render_step/color/above_light = new(null, src, "#ffffff23") + SET_PLANE_EXPLICIT(above_light, ABOVE_LIGHTING_PLANE, src) + add_overlay(above_light) + QDEL_NULL(above_light) + // Freeze our light would you please + light_flags |= LIGHT_FROZEN + new /atom/movable/screen/light_button/toggle(src) + new /atom/movable/screen/light_button/edit(src) + new /atom/movable/screen/light_button/move(src) + +/// Disables light debugging, so you can let a scene fall to what it visually should be, or just fix admin fuckups +/atom/proc/undebug() + // I don't really want to undebug a light if it's off rn + // Loses control if we turn it back on again + if(isturf(src) || !HAS_TRAIT(src, TRAIT_LIGHTING_DEBUGGED) || !light) + return + REMOVE_TRAIT(src, TRAIT_LIGHTING_DEBUGGED, LIGHT_DEBUG_TRAIT) + GLOB.light_debugged_atoms -= WEAKREF(src) + remove_filter("debug_light") + // Removes the glow overlay via stupid, sorry + var/atom/movable/render_step/color/above_light = new(null, src, "#ffffff23") + SET_PLANE_EXPLICIT(above_light, ABOVE_LIGHTING_PLANE, src) + cut_overlay(above_light) + QDEL_NULL(above_light) + var/atom/movable/lie_to_areas = src + // Freeze our light would you please + light_flags &= ~LIGHT_FROZEN + for(var/atom/movable/screen/light_button/button in lie_to_areas.vis_contents) + qdel(button) + +/atom/movable/screen/light_button + icon = 'icons/testing/lighting_debug.dmi' + plane = BALLOON_CHAT_PLANE // We hijack runechat because we can get multiz niceness without making a new PM + layer = ABOVE_ALL_MOB_LAYER + alpha = 100 + var/datum/weakref/last_hovored_ref + +/atom/movable/screen/light_button/Initialize(mapload) + . = ..() + attach_to(loc) + +/atom/movable/screen/light_button/proc/attach_to(atom/new_owner) + if(loc) + UnregisterSignal(loc, COMSIG_QDELETING) + var/atom/movable/mislead_areas = loc + mislead_areas.vis_contents -= src + forceMove(new_owner) + layer = loc.layer + RegisterSignal(loc, COMSIG_QDELETING, PROC_REF(delete_self)) + var/atom/movable/lie_to_areas = loc + lie_to_areas.vis_contents += src + +/atom/movable/screen/light_button/proc/delete_self(datum/source) + SIGNAL_HANDLER + qdel(src) + +// Entered and Exited won't fire while you're dragging something, because you're still "holding" it +// Very much byond logic, but I want nice for my highlighting, so we fake it with drag +// Copypasta from action buttons +/atom/movable/screen/light_button/MouseDrag(atom/over_object, src_location, over_location, src_control, over_control, params) + . = ..() + if(IS_WEAKREF_OF(over_object, last_hovored_ref)) + return + var/atom/old_object + if(last_hovored_ref) + old_object = last_hovored_ref?.resolve() + else // If there's no current ref, we assume it was us. We also treat this as our "first go" location + old_object = src + + if(old_object) + old_object.MouseExited(over_location, over_control, params) + + last_hovored_ref = WEAKREF(over_object) + over_object.MouseEntered(over_location, over_control, params) + +/atom/movable/screen/light_button/MouseDrop(over_object) + . = ..() + last_hovored_ref = null + +/atom/movable/screen/light_button/MouseEntered(location, control, params) + . = ..() + animate(src, alpha = 255, time = 2) + +/atom/movable/screen/light_button/MouseExited(location, control, params) + . = ..() + animate(src, alpha = initial(alpha), time = 2) + +/atom/movable/screen/light_button/toggle + name = "Toggle Light" + desc = "Click to turn the light on/off" + icon_state = "light_enable" + +/atom/movable/screen/light_button/toggle/attach_to(atom/new_owner) + if(loc) + UnregisterSignal(loc, COMSIG_ATOM_UPDATE_LIGHT_ON) + . = ..() + RegisterSignal(loc, COMSIG_ATOM_UPDATE_LIGHT_ON, PROC_REF(on_changed)) + update_appearance() + +/atom/movable/screen/light_button/toggle/Click(location, control, params) + . = ..() + if(!check_rights_for(usr.client, R_DEBUG)) + return + var/atom/movable/parent = loc + parent.light_flags &= ~LIGHT_FROZEN + loc.set_light(l_on = !loc.light_on) + parent.light_flags |= LIGHT_FROZEN + +/atom/movable/screen/light_button/toggle/proc/on_changed() + SIGNAL_HANDLER + update_appearance() + +/atom/movable/screen/light_button/toggle/update_icon_state() + . = ..() + if(loc.light_on) + icon_state = "light_enable" + else + icon_state = "light_disable" + +/atom/movable/screen/light_button/edit + name = "Edit Light" + desc = "Click to open an editing menu for the light" + icon_state = "light_focus" + +/atom/movable/screen/light_button/edit/attach_to(atom/new_owner) + . = ..() + SStgui.try_update_ui(usr, src, null) + +/atom/movable/screen/light_button/edit/Click(location, control, params) + . = ..() + ui_interact(usr) + +/atom/movable/screen/light_button/edit/ui_state(mob/user) + return GLOB.debug_state + +/atom/movable/screen/light_button/edit/can_interact() + return TRUE + +/atom/movable/screen/light_button/edit/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "LightController") + ui.open() + +/atom/movable/screen/light_button/edit/ui_assets(mob/user) + return list(get_asset_datum(/datum/asset/spritesheet/lights)) + +/atom/movable/screen/light_button/edit/ui_data() + var/list/data = list() + + var/atom/parent = loc + var/list/light_info = list() + light_info["name"] = full_capitalize(parent.name) + light_info["on"] = parent.light_on + light_info["power"] = parent.light_power + light_info["range"] = parent.light_range + light_info["color"] = parent.light_color + light_info["angle"] = parent.light_angle + data["light_info"] = light_info + data["on"] = parent.light_on + data["direction"] = parent.dir + + return data + +/atom/movable/screen/light_button/edit/ui_static_data(mob/user) + . = ..() + var/list/data = list() + data["templates"] = list() + data["category_ids"] = list() + for(var/id in GLOB.light_types) + var/datum/light_template/template = GLOB.light_types[id] + var/list/insert = list() + var/list/light_info = list() + light_info["name"] = template.name + light_info["power"] = template.power + light_info["range"] = template.range + light_info["color"] = template.color + light_info["angle"] = template.angle + insert["light_info"] = light_info + insert["description"] = template.desc + insert["id"] = template.id + insert["category"] = template.category + if(!data["category_ids"][template.category]) + data["category_ids"][template.category] = list() + data["category_ids"][template.category] += id + data["templates"][template.id] = insert + + var/datum/light_template/first_template = GLOB.light_types[GLOB.light_types[1]] + data["default_id"] = first_template.id + data["default_category"] = first_template.category + return data + +/atom/movable/screen/light_button/edit/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + var/atom/parent = loc + parent.light_flags &= ~LIGHT_FROZEN + switch(action) + if("set_on") + parent.set_light(l_on = params["value"]) + if("change_color") + var/chosen_color = input(ui.user, "Pick new color", "[parent]", parent.light_color) as color|null + if(chosen_color) + parent.set_light(l_color = chosen_color) + if("set_power") + parent.set_light(l_power = params["value"]) + if("set_range") + parent.set_light(l_range = params["value"]) + if("set_angle") + // We use dir instead of light dir because anything directional should have its lightdir tied + // And this way we can update the sprite too + parent.set_light(l_angle = params["value"]) + if("set_dir") + parent.setDir(params["value"]) + if("mirror_template") + var/datum/light_template/template = GLOB.light_types[params["id"]] + var/atom/new_light = template.create(parent.loc, parent.dir) + var/atom/movable/lies_to_children = parent + for(var/atom/movable/screen/light_button/button in lies_to_children.vis_contents) + button.attach_to(new_light) + + qdel(parent) + if("isolate") + isolate_light(parent) + + parent.light_flags |= LIGHT_FROZEN + return TRUE + +/// Hides all the lights around a source temporarially, for the sake of figuring out how bad a light bleeds +/// (Except for turf lights, because they're a part of the "scene" and rarely modified) +/proc/isolate_light(atom/source, delay = 7 SECONDS) + var/list/datum/lighting_corner/interesting_corners = source.light?.effect_str + + var/list/atom/sources = list() + for(var/datum/lighting_corner/corner as anything in interesting_corners) + for(var/datum/light_source/target_spotted as anything in corner.affecting) + if(isturf(target_spotted.source_atom)) + continue + sources[target_spotted.source_atom] = TRUE + + sources -= source // Please don't disable yourself + if(!length(sources)) + return + + // Now that we have all the lights (and a bit more), let's get rid of em + for(var/atom/light_source as anything in sources) + light_source.light_flags &= ~LIGHT_FROZEN + light_source.set_light(l_on = FALSE) + light_source.light_flags |= LIGHT_FROZEN + + // Now we sleep until the lighting system has processed them + var/current_tick = SSlighting.times_fired + + UNTIL(SSlighting.times_fired > current_tick || QDELETED(source) || !source.light) + + if(QDELETED(source) || !source.light) + repopulate_lights(sources) + return + + // And finally, wait the allotted time, and reawake em + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(repopulate_lights), sources), delay) + +/proc/repopulate_lights(list/atom/sources) + for(var/atom/light_source as anything in sources) + light_source.light_flags &= ~LIGHT_FROZEN + light_source.set_light(l_on = TRUE) + light_source.light_flags |= LIGHT_FROZEN + +/atom/movable/screen/light_button/move + name = "Move Light" + desc = "Drag to move the light around" + icon_state = "light_move" + mouse_drag_pointer = 'icons/effects/mouse_pointers/light_drag.dmi' + +/atom/movable/screen/light_button/move/MouseDrop(over_object) + . = ..() + if(!ismovable(loc)) + return + var/atom/movable/movable_owner = loc + movable_owner.forceMove(get_turf(over_object)) + +/datum/action/spawn_light + name = "Spawn Light" + desc = "Create a light from a template" + button_icon = 'icons/mob/actions/actions_construction.dmi' + button_icon_state = "light_spawn" + +/datum/action/spawn_light/New(Target) + . = ..() + RegisterSignal(SSdcs, COMSIG_LIGHT_DEBUG_DISABLED, PROC_REF(debug_disabled)) + +/datum/action/spawn_light/proc/debug_disabled() + SIGNAL_HANDLER + qdel(src) + +/datum/action/spawn_light/Grant(mob/grant_to) + . = ..() + RegisterSignal(grant_to.client, COMSIG_CLIENT_MOB_LOGIN, PROC_REF(move_action), override = TRUE) + +/datum/action/spawn_light/proc/move_action(client/source, mob/new_mob) + SIGNAL_HANDLER + Grant(new_mob) + +/datum/action/spawn_light/Trigger(trigger_flags) + . = ..() + ui_interact(usr) + +/datum/action/spawn_light/ui_state(mob/user) + return GLOB.debug_state + +/datum/action/spawn_light/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "LightSpawn") + ui.open() + +/datum/action/spawn_light/ui_assets(mob/user) + return list(get_asset_datum(/datum/asset/spritesheet/lights)) + +/datum/action/spawn_light/ui_data() + var/list/data = list() + return data + +/datum/action/spawn_light/ui_static_data(mob/user) + . = ..() + var/list/data = list() + data["templates"] = list() + data["category_ids"] = list() + for(var/id in GLOB.light_types) + var/datum/light_template/template = GLOB.light_types[id] + var/list/insert = list() + var/list/light_info = list() + light_info["name"] = template.name + light_info["power"] = template.power + light_info["range"] = template.range + light_info["color"] = template.color + light_info["angle"] = template.angle + insert["light_info"] = light_info + insert["description"] = template.desc + insert["id"] = template.id + insert["category"] = template.category + if(!data["category_ids"][template.category]) + data["category_ids"][template.category] = list() + data["category_ids"][template.category] += id + data["templates"][template.id] = insert + + var/datum/light_template/first_template = GLOB.light_types[GLOB.light_types[1]] + data["default_id"] = first_template.id + data["default_category"] = first_template.category + return data + +/datum/action/spawn_light/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + switch(action) + if("spawn_template") + var/datum/light_template/template = GLOB.light_types[params["id"]] + template.create(get_turf(owner), params["dir"]) + return TRUE diff --git a/code/modules/admin/verbs/lua/README.md b/code/modules/admin/verbs/lua/README.md index b7b7306ed4d3c..17138c95fde19 100644 --- a/code/modules/admin/verbs/lua/README.md +++ b/code/modules/admin/verbs/lua/README.md @@ -156,6 +156,30 @@ The following example spawns a singularity at the caller's current turf: SS13.new("/obj/singularity", dm.global_proc("_get_step", dm.usr, 0)) ``` +### SS13.new_untracked(type, ...) +Works exactly like SS13.new but it does not store the value to the lua state's `references` list variable. This means that the variable could end up deleted if nothing holds a reference to it. + +### SS13.is_valid(datum) +Can be used to determine if the datum passed is not nil, not undefined and not qdel'd all in one. A helper function that allows you to check the validity from only one function. +Example usage: +```lua +local datum = SS13.new("/datum") +dm.global_proc("qdel", datum) +print(SS13.is_valid(datum)) -- false + +local null = nil +print(SS13.is_valid(null)) -- false + +local datum = SS13.new("/datum") +print(SS13.is_valid(datum)) -- true +``` + +### SS13.type(string) +Converts a string into a type. Equivalent to doing `dm.global_proc("_text2path", "/path/to/type")` + +### SS13.qdel(datum) +Deletes a datum. You shouldn't try to reference it after calling this function. Equivalent to doing `dm.global_proc("qdel", datum)` + ### SS13.await(thing_to_call, proc_to_call, ...) Calls `proc_to_call` on `thing_to_call`, with `...` as its arguments, and sleeps until that proc returns. Returns two return values - the first is the return value of the proc, and the second is the message of any runtime exception thrown by the called proc. @@ -200,6 +224,9 @@ SS13.set_timeout(5, function() end) ``` +### SS13.stop_tracking(datum) +Stops tracking a datum that was created via `SS13.new` so that it can be garbage collected and deleted without having to qdel. Should be used for things like callbacks and other such datums where the reference to the variable is no longer needed. + --- ## Internal globals diff --git a/code/modules/admin/verbs/lua/_wrappers.dm b/code/modules/admin/verbs/lua/_wrappers.dm index d77d02de4ee65..8e05453d29d5d 100644 --- a/code/modules/admin/verbs/lua/_wrappers.dm +++ b/code/modules/admin/verbs/lua/_wrappers.dm @@ -12,9 +12,7 @@ else ret = HandleUserlessProcCall("lua", thing_to_call, proc_name, arguments) if(isdatum(ret)) - SSlua.gc_guard = ret - var/datum/ret_datum = ret - ret_datum.RegisterSignal(ret_datum, COMSIG_QDELETING, TYPE_PROC_REF(/datum, lua_reference_cleanup), override = TRUE) + SSlua.gc_guard += ret return ret /proc/wrap_lua_global_proc_call(proc_name, list/arguments) @@ -27,9 +25,7 @@ else ret = HandleUserlessProcCall("lua", GLOBAL_PROC, proc_name, arguments) if(isdatum(ret)) - SSlua.gc_guard = ret - var/datum/ret_datum = ret - ret_datum.RegisterSignal(ret_datum, COMSIG_QDELETING, TYPE_PROC_REF(/datum, lua_reference_cleanup), override = TRUE) + SSlua.gc_guard += ret return ret /proc/wrap_lua_print(state_id, list/arguments) diff --git a/code/modules/admin/verbs/lua/helpers.dm b/code/modules/admin/verbs/lua/helpers.dm index c0271e0bc72cf..66b7c835e9ab1 100644 --- a/code/modules/admin/verbs/lua/helpers.dm +++ b/code/modules/admin/verbs/lua/helpers.dm @@ -34,17 +34,3 @@ #undef PROMISE_PENDING #undef PROMISE_RESOLVED #undef PROMISE_REJECTED - -/** - * When a datum is created from lua, it gets held in `SSlua.gc_guard`, and later, - * in the calling state datum's `var/list/references`, just in case it would be garbage - * collected due to there not being any references that BYOND recognizes. To avoid harddels, - * we register this proc as a signal handler any time a DM function called from lua returns - * a datum. - */ -/datum/proc/lua_reference_cleanup() - SIGNAL_HANDLER - if(SSlua.gc_guard == src) - SSlua.gc_guard = null - for(var/datum/lua_state/state in SSlua.states) - state.references -= src diff --git a/code/modules/admin/verbs/lua/lua_state.dm b/code/modules/admin/verbs/lua/lua_state.dm index df25d070b53fb..b90344d633309 100644 --- a/code/modules/admin/verbs/lua/lua_state.dm +++ b/code/modules/admin/verbs/lua/lua_state.dm @@ -168,4 +168,18 @@ GLOBAL_PROTECT(lua_usr) for(var/datum/lua_editor/editor as anything in editor_list) SStgui.update_uis(editor) +/// Called by lua scripts when they add an atom to var/list/references so that it gets cleared up on delete. +/datum/lua_state/proc/clear_on_delete(datum/to_clear) + RegisterSignal(to_clear, COMSIG_QDELETING, PROC_REF(on_delete)) + +/// Called by lua scripts when an atom they've added should soft delete and this state should stop tracking it. +/// Needs to unregister all signals. +/datum/lua_state/proc/let_soft_delete(datum/to_clear) + UnregisterSignal(to_clear, COMSIG_QDELETING, PROC_REF(on_delete)) + references -= to_clear + +/datum/lua_state/proc/on_delete(datum/to_clear) + SIGNAL_HANDLER + references -= to_clear + #undef MAX_LOG_REPEAT_LOOKBACK diff --git a/code/modules/admin/verbs/manipulate_organs.dm b/code/modules/admin/verbs/manipulate_organs.dm index db8e2a86e01db..6ead4d3b137fb 100644 --- a/code/modules/admin/verbs/manipulate_organs.dm +++ b/code/modules/admin/verbs/manipulate_organs.dm @@ -1,4 +1,4 @@ -/client/proc/manipulate_organs(mob/living/carbon/C in world) +/client/proc/manipulate_organs(mob/living/carbon/carbon_victim in world) set name = "Manipulate Organs" set category = "Debug" var/operation = tgui_input_list(usr, "Select organ operation", "Organ Manipulation", list("add organ", "add implant", "drop organ/implant", "remove organ/implant")) @@ -12,65 +12,72 @@ var/dat = replacetext("[path]", "/obj/item/organ/", ":") organs[dat] = path - var/obj/item/organ/organ = tgui_input_list(usr, "Select organ type", "Organ Manipulation", organs) - if(isnull(organ)) + var/obj/item/organ/organ_to_grant = tgui_input_list(usr, "Select organ type", "Organ Manipulation", organs) + if(isnull(organ_to_grant)) return - if(isnull(organs[organ])) + if(isnull(organs[organ_to_grant])) return - organ = organs[organ] - organ = new organ - organ.Insert(C) - log_admin("[key_name(usr)] has added organ [organ.type] to [key_name(C)]") - message_admins("[key_name_admin(usr)] has added organ [organ.type] to [ADMIN_LOOKUPFLW(C)]") + organ_to_grant = organs[organ_to_grant] + organ_to_grant = new organ_to_grant + if(!organ_to_grant.Insert(carbon_victim)) + to_chat(usr, span_notice("[carbon_victim] is unable to carry this organ!")) + qdel(organ_to_grant) + return + log_admin("[key_name(usr)] has added organ [organ_to_grant.type] to [key_name(carbon_victim)]") + message_admins("[key_name_admin(usr)] has added organ [organ_to_grant.type] to [ADMIN_LOOKUPFLW(carbon_victim)]") if("add implant") for(var/path in subtypesof(/obj/item/implant)) var/dat = replacetext("[path]", "/obj/item/implant/", ":") organs[dat] = path - var/obj/item/implant/organ = tgui_input_list(usr, "Select implant type", "Organ Manipulation", organs) - if(isnull(organ)) + var/obj/item/implant/implant_to_grant = tgui_input_list(usr, "Select implant type", "Organ Manipulation", organs) + if(isnull(implant_to_grant)) + return + if(isnull(organs[implant_to_grant])) return - if(isnull(organs[organ])) + implant_to_grant = organs[implant_to_grant] + implant_to_grant = new implant_to_grant + if(!implant_to_grant.implant(carbon_victim)) + to_chat(usr, span_notice("[carbon_victim] is unable to hold this implant!")) + qdel(implant_to_grant) return - organ = organs[organ] - organ = new organ - organ.implant(C) - 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)]") + log_admin("[key_name(usr)] has added implant [implant_to_grant.type] to [key_name(carbon_victim)]") + message_admins("[key_name_admin(usr)] has added implant [implant_to_grant.type] to [ADMIN_LOOKUPFLW(carbon_victim)]") if("drop organ/implant", "remove organ/implant") - for(var/obj/item/organ/user_organs as anything in C.organs) + for(var/obj/item/organ/user_organs as anything in carbon_victim.organs) organs["[user_organs.name] ([user_organs.type])"] = user_organs - for(var/obj/item/implant/user_implants as anything in C.implants) + for(var/obj/item/implant/user_implants as anything in carbon_victim.implants) organs["[user_implants.name] ([user_implants.type])"] = user_implants - var/obj/item/organ = tgui_input_list(usr, "Select organ/implant", "Organ Manipulation", organs) - if(isnull(organ)) + var/obj/item/organ_to_modify = tgui_input_list(usr, "Select organ/implant", "Organ Manipulation", organs) + if(isnull(organ_to_modify)) return - if(isnull(organs[organ])) + if(isnull(organs[organ_to_modify])) return - organ = organs[organ] - var/obj/item/organ/O - var/obj/item/implant/I + organ_to_modify = organs[organ_to_modify] + + log_admin("[key_name(usr)] has removed [organ_to_modify.type] from [key_name(carbon_victim)]") + message_admins("[key_name_admin(usr)] has removed [organ_to_modify.type] from [ADMIN_LOOKUPFLW(carbon_victim)]") - log_admin("[key_name(usr)] has removed [organ.type] from [key_name(C)]") - message_admins("[key_name_admin(usr)] has removed [organ.type] from [ADMIN_LOOKUPFLW(C)]") + var/obj/item/organ/organ_holder + var/obj/item/implant/implant_holder - if(isorgan(organ)) - O = organ - O.Remove(C) + if(isorgan(organ_to_modify)) + organ_holder = organ_to_modify + organ_holder.Remove(carbon_victim) else - I = organ - I.removed(C) + implant_holder = organ_to_modify + implant_holder.removed(carbon_victim) - organ.forceMove(get_turf(C)) + organ_to_modify.forceMove(get_turf(carbon_victim)) if(operation == "remove organ/implant") - qdel(organ) - else if(I) // Put the implant in case. - var/obj/item/implantcase/case = new(get_turf(C)) - case.imp = I - I.forceMove(case) + qdel(organ_to_modify) + else if(implant_holder) // Put the implant in case. + var/obj/item/implantcase/case = new(get_turf(carbon_victim)) + case.imp = implant_holder + implant_holder.forceMove(case) case.update_appearance() diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 726852174d867..5fbcf3489c8ed 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -55,6 +55,8 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( /client/proc/station_food_debug, /client/proc/station_stack_debug, /client/proc/check_for_obstructed_atmospherics, + /client/proc/modify_lights, + /client/proc/visualize_lights, )) GLOBAL_PROTECT(admin_verbs_debug_mapping) @@ -124,7 +126,7 @@ GLOBAL_LIST_EMPTY(dirty_vars) if(!(locate(/obj/structure/grille) in T)) var/window_check = 0 for(var/obj/structure/window/W in T) - if (W.dir == turn(C1.dir,180) || (W.dir in list(NORTHEAST,SOUTHEAST,NORTHWEST,SOUTHWEST)) ) + if (W.dir == REVERSE_DIR(C1.dir) || (W.dir in list(NORTHEAST,SOUTHEAST,NORTHWEST,SOUTHWEST)) ) window_check = 1 break if(!window_check) @@ -319,9 +321,14 @@ GLOBAL_VAR_INIT(say_disabled, FALSE) set name = "Debug Z-Levels" set category = "Mapping" - var/list/z_list = SSmapping.z_list + to_chat(src, examine_block(gather_z_level_information(append_grid = TRUE)), confidential = TRUE) + +/// Returns all necessary z-level information. Argument `append_grid` allows the user to see a table showing all of the z-level linkages, which is only visible and useful in-game. +/proc/gather_z_level_information(append_grid = FALSE) var/list/messages = list() - messages += "World: [world.maxx] x [world.maxy] x [world.maxz]

    " + + var/list/z_list = SSmapping.z_list + messages += "\nWorld: [world.maxx] x [world.maxy] x [world.maxz]\n" var/list/linked_levels = list() var/min_x = INFINITY @@ -331,49 +338,50 @@ GLOBAL_VAR_INIT(say_disabled, FALSE) for(var/z in 1 to max(world.maxz, z_list.len)) if (z > z_list.len) - messages += "[z]: Unmanaged (out of bounds)
    " + messages += "[z]: Unmanaged (out of bounds)" continue - var/datum/space_level/S = z_list[z] - if (!S) - messages += "[z]: Unmanaged (null)
    " + var/datum/space_level/level = z_list[z] + if (!level) + messages += "[z]: Unmanaged (null)" continue var/linkage - switch (S.linkage) + switch (level.linkage) if (UNAFFECTED) linkage = "no linkage" if (SELFLOOPING) linkage = "self-looping" if (CROSSLINKED) - linkage = "linked at ([S.xi], [S.yi])" - linked_levels += S - min_x = min(min_x, S.xi) - min_y = min(min_y, S.yi) - max_x = max(max_x, S.xi) - max_y = max(max_y, S.yi) + linkage = "linked at ([level.xi], [level.yi])" + linked_levels += level + min_x = min(min_x, level.xi) + min_y = min(min_y, level.yi) + max_x = max(max_x, level.xi) + max_y = max(max_y, level.yi) else - linkage = "unknown linkage '[S.linkage]'" + linkage = "unknown linkage '[level.linkage]'" - messages += "[z]: [S.name], [linkage], traits: [json_encode(S.traits)]
    " - if (S.z_value != z) - messages += "-- z_value is [S.z_value], should be [z]
    " - if (S.name == initial(S.name)) - messages += "-- name not set
    " + messages += "[z]: [level.name], [linkage], traits: [json_encode(level.traits)]" + if (level.z_value != z) + messages += "-- z_value is [level.z_value], should be [z]" + if (level.name == initial(level.name)) + messages += "-- name not set" if (z > world.maxz) messages += "-- exceeds max z" var/grid[max_x - min_x + 1][max_y - min_y + 1] - for(var/datum/space_level/S in linked_levels) - grid[S.xi - min_x + 1][S.yi - min_y + 1] = S.z_value + for(var/datum/space_level/linked_level in linked_levels) + grid[linked_level.xi - min_x + 1][linked_level.yi - min_y + 1] = linked_level.z_value - messages += "
    " - for(var/y in max_y to min_y step -1) - var/list/part = list() - for(var/x in min_x to max_x) - part += "[grid[x - min_x + 1][y - min_y + 1]]" - messages += "" - messages += "
    [part.Join("")]
    " + if(append_grid) + messages += "
    " + for(var/y in max_y to min_y step -1) + var/list/part = list() + for(var/x in min_x to max_x) + part += "[grid[x - min_x + 1][y - min_y + 1]]" + messages += "" + messages += "
    [part.Join("")]
    " - to_chat(src, examine_block(messages.Join("")), confidential = TRUE) + return messages.Join("\n") /client/proc/station_food_debug() set name = "Count Station Food" @@ -482,3 +490,27 @@ GLOBAL_VAR_INIT(say_disabled, FALSE) var/datum/browser/popup = new(usr, "atmospherics_obstructions", "Atmospherics Obstructions", 900, 750) popup.set_content(results.Join()) popup.open() + +/client/proc/modify_lights() + set name = "Toggle Light Debug" + set category = "Mapping" + if(!check_rights(R_DEBUG)) + return + if(GLOB.light_debug_enabled) + undebug_sources() + return + + for(var/obj/machinery/light/fix_up as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/light)) + // Only fix lights that started out fixed + if(initial(fix_up.status) == LIGHT_OK) + fix_up.fix() + CHECK_TICK + debug_sources() + +/client/proc/visualize_lights() + set name = "Visualize Lighting Corners" + set category = "Mapping" + if(!check_rights(R_DEBUG)) + return + + display_corners() diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index 7298852f6e57f..17bba0195a212 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -71,7 +71,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Play Direct Mob Sound") // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! ///Takes an input from either proc/play_web_sound or the request manager and runs it through youtube-dl and prompts the user before playing it to the server. -/proc/web_sound(mob/user, input) +/proc/web_sound(mob/user, input, credit) if(!check_rights(R_SOUND)) return var/ytdl = CONFIG_GET(string/invoke_youtubedl) @@ -138,6 +138,8 @@ to_chat(world, span_boldannounce("An admin played: [webpage_url]"), confidential = TRUE) if("Cancel", null) return + if(credit) + to_chat(world, span_boldannounce(credit), confidential = TRUE) SSblackbox.record_feedback("nested tally", "played_url", 1, list("[user.ckey]", "[input]")) log_admin("[key_name(user)] played web sound: [input]") message_admins("[key_name(user)] played web sound: [input]") diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index fcd19dc762cc5..65e885825e200 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -43,7 +43,7 @@ GLOB.requests.pray(usr.client, msg, usr.job == JOB_CHAPLAIN) msg = span_adminnotice("[icon2html(cross, GLOB.admins)][prayer_type][deity ? " (to [deity])" : ""]: [ADMIN_FULLMONTY(src)] [ADMIN_SC(src)]: [span_linkify(msg)]") for(var/client/C in GLOB.admins) - if(C.prefs.chat_toggles & CHAT_PRAYER) + if(get_chat_toggles(C) & CHAT_PRAYER) to_chat(C, msg, type = MESSAGE_TYPE_PRAYER, confidential = TRUE) to_chat(usr, span_info("You pray to the gods: \"[msg_tmp]\""), confidential = TRUE) diff --git a/code/modules/admin/verbs/request_internet_sound.dm b/code/modules/admin/verbs/request_internet_sound.dm index 0711c2cd16918..296c59867e4ac 100644 --- a/code/modules/admin/verbs/request_internet_sound.dm +++ b/code/modules/admin/verbs/request_internet_sound.dm @@ -20,6 +20,15 @@ to_chat(usr, span_danger("Invalid URL. Please use a URL from one of the following sites: [replacetext(CONFIG_GET(string/request_internet_allowed), "\\", "")]"), confidential = TRUE) return + var/credit = tgui_alert(usr, "Credit yourself for requesting this song? (will show up as [usr.ckey])", "Credit Yourself?", list("No", "Yes", "Cancel")) + + if(credit == "Cancel" || isnull(credit)) + return + else if (credit == "Yes") + credit = "[usr.ckey] requested this track." + else + credit = "Someone requested this track." + log_internet_request("[src.key]/([src.name]): [request_url]") if(usr.client) if(usr.client.prefs.muted & MUTE_INTERNET_REQUEST) @@ -28,11 +37,11 @@ if(src.client.handle_spam_prevention(request_url,MUTE_INTERNET_REQUEST)) return - GLOB.requests.music_request(usr.client, request_url) + GLOB.requests.music_request(usr.client, request_url, credit) to_chat(usr, span_info("You requested: \"[request_url]\" to be played."), confidential = TRUE) - request_url = span_adminnotice("MUSIC REQUEST: [ADMIN_FULLMONTY(src)] [ADMIN_SC(src)]: [span_linkify(request_url)] [ADMIN_PLAY_INTERNET(request_url)]") + request_url = span_adminnotice("MUSIC REQUEST: [ADMIN_FULLMONTY(src)] [ADMIN_SC(src)]: [span_linkify(request_url)] [ADMIN_PLAY_INTERNET(request_url, credit)]") for(var/client/admin_client in GLOB.admins) - if(admin_client.prefs.chat_toggles & CHAT_PRAYER) + if(get_chat_toggles(admin_client) & CHAT_PRAYER) to_chat(admin_client, request_url, type = MESSAGE_TYPE_PRAYER, confidential = TRUE) SSblackbox.record_feedback("tally", "music_request", 1, "Music Request") // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm index 5dd4989dd8f9c..e29ed6404e427 100644 --- a/code/modules/admin/verbs/secrets.dm +++ b/code/modules/admin/verbs/secrets.dm @@ -71,7 +71,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/doors in GLOB.airlocks) + for(var/obj/machinery/door/airlock/maintenance/doors as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/airlock/maintenance)) if ((ACCESS_MAINT_TUNNELS in doors.req_access) || (ACCESS_MAINT_TUNNELS in doors.req_one_access)) doors.req_access = list() doors.req_one_access = list(ACCESS_BRIG, ACCESS_ENGINEERING) @@ -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/doors in GLOB.airlocks) + for(var/obj/machinery/door/airlock/maintenance/doors as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/airlock/maintenance)) if ((ACCESS_MAINT_TUNNELS in doors.req_access) || (ACCESS_MAINT_TUNNELS in doors.req_one_access)) doors.req_access = list(ACCESS_BRIG) doors.req_one_access = list() @@ -220,7 +220,7 @@ GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller) var/result = input(holder, "Please choose a new species","Species") as null|anything in GLOB.species_list if(result) SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Mass Species Change", "[result]")) - log_admin("[key_name(holder)] turned all humans into [result]", 1) + log_admin("[key_name(holder)] turned all humans into [result]") message_admins("\blue [key_name_admin(holder)] turned all humans into [result]") var/newtype = GLOB.species_list[result] for(var/i in GLOB.human_list) @@ -230,21 +230,21 @@ 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("Power All APCs")) - log_admin("[key_name(holder)] made all areas powered", 1) + log_admin("[key_name(holder)] made all areas powered") message_admins(span_adminnotice("[key_name_admin(holder)] made all areas powered")) power_restore() if("unpower") if(!is_funmin) return SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Depower All APCs")) - log_admin("[key_name(holder)] made all areas unpowered", 1) + log_admin("[key_name(holder)] made all areas unpowered") message_admins(span_adminnotice("[key_name_admin(holder)] made all areas unpowered")) power_failure() if("quickpower") if(!is_funmin) return SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Power All SMESs")) - log_admin("[key_name(holder)] made all SMESs powered", 1) + log_admin("[key_name(holder)] made all SMESs powered") message_admins(span_adminnotice("[key_name_admin(holder)] made all SMESs powered")) power_restore_quick() if("anon_name") @@ -328,7 +328,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.airlocks) + for(var/obj/machinery/door/airlock/W as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/airlock)) 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") @@ -348,24 +348,24 @@ GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller) 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 SSmachines.get_machines_by_type_and_subtypes(/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 SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/light)) L.fix() - stoplag() + CHECK_TICK if("customportal") if(!is_funmin) return var/list/settings = list( "mainsettings" = list( - "typepath" = list("desc" = "Path to spawn", "type" = "datum", "path" = "/mob/living", "subtypesonly" = TRUE, "value" = /mob/living/simple_animal/hostile/bee), + "typepath" = list("desc" = "Path to spawn", "type" = "datum", "path" = "/mob/living", "subtypesonly" = TRUE, "value" = /mob/living/basic/bee), "humanoutfit" = list("desc" = "Outfit if human", "type" = "datum", "path" = "/datum/outfit", "subtypesonly" = TRUE, "value" = /datum/outfit), "amount" = list("desc" = "Number per portal", "type" = "number", "value" = 1), "portalnum" = list("desc" = "Number of total portals", "type" = "number", "value" = 10), @@ -413,7 +413,7 @@ GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller) var/list/storm_appearances = list() for(var/offset in 0 to SSmapping.max_plane_offset) - var/mutable_appearance/storm = mutable_appearance('icons/obj/engine/energy_ball.dmi', "energy_ball_fast", FLY_LAYER) + var/mutable_appearance/storm = mutable_appearance('icons/obj/machines/engine/energy_ball.dmi', "energy_ball_fast", FLY_LAYER) SET_PLANE_W_SCALAR(storm, ABOVE_GAME_PLANE, offset) storm.color = prefs["color"]["value"] storm_appearances += storm @@ -587,7 +587,7 @@ GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller) return var/datum/ctf_controller/ctf_controller = GLOB.ctf_games[selected_game] var/choice = tgui_alert(usr, "[ctf_controller.instagib_mode ? "Return to standard" : "Enable instagib"] mode?", "Instagib Mode", list("Yes", "No")) - if(choice == "No") + if(choice != "Yes") return ctf_controller.toggle_instagib_mode() message_admins("[key_name_admin(holder)] [ctf_controller.instagib_mode ? "enabled" : "disabled"] instagib mode in CTF game: [selected_game]") diff --git a/code/modules/admin/verbs/selectequipment.dm b/code/modules/admin/verbs/selectequipment.dm index d1530a76052a4..e88ca0bf23314 100644 --- a/code/modules/admin/verbs/selectequipment.dm +++ b/code/modules/admin/verbs/selectequipment.dm @@ -213,7 +213,7 @@ delete_pocket = TRUE SSblackbox.record_feedback("tally", "admin_verb", 1, "Select Equipment") // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! - for(var/obj/item/item in human_target.get_equipped_items(delete_pocket)) + for(var/obj/item/item in human_target.get_equipped_items(include_pockets = delete_pocket)) qdel(item) var/obj/item/organ/internal/brain/human_brain = human_target.get_organ_slot(BRAIN) diff --git a/code/modules/admin/verbs/server.dm b/code/modules/admin/verbs/server.dm index 8c2a3aba722f1..1926134a774e7 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 = TRUE + SSticker.force_ending = FORCE_END_ROUND SSblackbox.record_feedback("tally", "admin_verb", 1, "End Round") // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /datum/admins/proc/toggleooc() @@ -185,16 +185,42 @@ set category = "Server" set desc = "Respawn basically" set name = "Toggle Respawn" - var/new_nores = !CONFIG_GET(flag/norespawn) - CONFIG_SET(flag/norespawn, new_nores) - if (!new_nores) - to_chat(world, "You may now respawn.", confidential = TRUE) - else - to_chat(world, "You may no longer respawn :(", confidential = TRUE) - message_admins(span_adminnotice("[key_name_admin(usr)] toggled respawn to [!new_nores ? "On" : "Off"].")) - log_admin("[key_name(usr)] toggled respawn to [!new_nores ? "On" : "Off"].") + + var/respawn_state = CONFIG_GET(flag/allow_respawn) + var/new_state = -1 + var/new_state_text = "" + switch(respawn_state) + if(RESPAWN_FLAG_DISABLED) // respawn currently disabled + new_state = RESPAWN_FLAG_FREE + new_state_text = "Enabled" + to_chat(world, span_bold("You may now respawn."), confidential = TRUE) + + if(RESPAWN_FLAG_FREE) // respawn currently enabled + new_state = RESPAWN_FLAG_NEW_CHARACTER + new_state_text = "Enabled, Different Slot" + to_chat(world, span_bold("You may now respawn as a different character."), confidential = TRUE) + + if(RESPAWN_FLAG_NEW_CHARACTER) // respawn currently enabled for different slot characters only + new_state = RESPAWN_FLAG_DISABLED + new_state_text = "Disabled" + to_chat(world, span_bold("You may no longer respawn :("), confidential = TRUE) + + else + WARNING("Invalid respawn state in config: [respawn_state]") + + if(new_state == -1) + to_chat(usr, span_warning("The config for respawn is set incorrectly, please complain to your nearest server host (or fix it yourself). \ + In the meanwhile respawn has been set to \"Off\".")) + new_state = RESPAWN_FLAG_DISABLED + new_state_text = "Disabled" + + CONFIG_SET(flag/allow_respawn, new_state) + + message_admins(span_adminnotice("[key_name_admin(usr)] toggled respawn to \"[new_state_text]\".")) + log_admin("[key_name(usr)] toggled respawn to \"[new_state_text]\".") + world.update_status() - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Respawn", "[!new_nores ? "Enabled" : "Disabled"]")) // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Respawn", "[new_state_text]")) // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /datum/admins/proc/delay() set category = "Server" diff --git a/code/modules/admin/view_variables/debug_variables.dm b/code/modules/admin/view_variables/debug_variables.dm index f92d5de536509..5196d83b124f0 100644 --- a/code/modules/admin/view_variables/debug_variables.dm +++ b/code/modules/admin/view_variables/debug_variables.dm @@ -1,6 +1,6 @@ #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. +/proc/debug_variable(name, value, level, datum/D, sanitize = TRUE, display_flags = NONE) //if D is a list, name will be index, and value will be assoc value. var/header if(D) if(islist(D)) @@ -41,6 +41,10 @@ item = "[name_part] = /icon ([value])" #endif + else if(isappearance(value)) + var/image/actually_an_appearance = value + item = "[name_part] = /appearance ([actually_an_appearance.icon])" + else if (isfile(value)) item = "[name_part] = '[value]'" @@ -55,6 +59,7 @@ [M.c][M.f]1  "} //TODO link to modify_transform wrapper for all matrices + else if (isdatum(value)) var/datum/DV = value if ("[DV]" != "[DV.type]") //if the thing as a name var, lets use it. @@ -69,7 +74,7 @@ var/list/L = value var/list/items = list() - if (L.len > 0 && !(name == "underlays" || name == "overlays" || L.len > (IS_NORMAL_LIST(L) ? VV_NORMAL_LIST_NO_EXPAND_THRESHOLD : VV_SPECIAL_LIST_NO_EXPAND_THRESHOLD))) + if (!(display_flags & VV_ALWAYS_CONTRACT_LIST) && L.len > 0 && !(name == "underlays" || name == "overlays" || L.len > (IS_NORMAL_LIST(L) ? VV_NORMAL_LIST_NO_EXPAND_THRESHOLD : VV_SPECIAL_LIST_NO_EXPAND_THRESHOLD))) for (var/i in 1 to L.len) var/key = L[i] var/val @@ -90,7 +95,10 @@ for (var/i in GLOB.bitfields[name]) if (value & GLOB.bitfields[name][i]) flags += i + if(length(flags)) item = "[name_part] = [VV_HTML_ENCODE(jointext(flags, ", "))]" + else + item = "[name_part] = NONE" else item = "[name_part] = [VV_HTML_ENCODE(value)]" diff --git a/code/modules/admin/view_variables/nobody_wants_to_learn_matrix_math.dm b/code/modules/admin/view_variables/nobody_wants_to_learn_matrix_math.dm new file mode 100644 index 0000000000000..872bd27d62739 --- /dev/null +++ b/code/modules/admin/view_variables/nobody_wants_to_learn_matrix_math.dm @@ -0,0 +1,80 @@ + +/** + * ## nobody wants to learn matrix math! + * + * More than just a completely true statement, this datum is created as a tgui interface + * allowing you to modify each vector until you know what you're doing. + * Much like filteriffic, 'nobody wants to learn matrix math' is meant for developers like you and I + * to implement interesting matrix transformations without the hassle if needing to know... algebra? Damn, i'm stupid. + */ +/datum/nobody_wants_to_learn_matrix_math + var/atom/target + var/matrix/testing_matrix + +/datum/nobody_wants_to_learn_matrix_math/New(atom/target) + src.target = target + testing_matrix = matrix(target.transform) + +/datum/nobody_wants_to_learn_matrix_math/Destroy(force, ...) + QDEL_NULL(testing_matrix) + return ..() + +/datum/nobody_wants_to_learn_matrix_math/ui_state(mob/user) + return GLOB.admin_state + +/datum/nobody_wants_to_learn_matrix_math/ui_close(mob/user) + qdel(src) + +/datum/nobody_wants_to_learn_matrix_math/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "MatrixMathTester") + ui.open() + +/datum/nobody_wants_to_learn_matrix_math/ui_data() + var/list/data = list() + data["matrix_a"] = testing_matrix.a + data["matrix_b"] = testing_matrix.b + data["matrix_c"] = testing_matrix.c + data["matrix_d"] = testing_matrix.d + data["matrix_e"] = testing_matrix.e + data["matrix_f"] = testing_matrix.f + data["pixelated"] = target.appearance_flags & PIXEL_SCALE + return data + +/datum/nobody_wants_to_learn_matrix_math/ui_act(action, list/params) + . = ..() + if(.) + return + + switch(action) + if("change_var") + var/matrix_var_name = params["var_name"] + var/matrix_var_value = params["var_value"] + if(testing_matrix.vv_edit_var(matrix_var_name, matrix_var_value) == FALSE) + to_chat(src, "Your edit was rejected by the object. This is a bug with the matrix tester, not your fault, so report it on github.", confidential = TRUE) + return + set_transform() + if("scale") + testing_matrix.Scale(params["x"], params["y"]) + set_transform() + if("translate") + testing_matrix.Translate(params["x"], params["y"]) + set_transform() + if("shear") + testing_matrix.Shear(params["x"], params["y"]) + set_transform() + if("turn") + testing_matrix.Turn(params["angle"]) + set_transform() + if("toggle_pixel") + target.appearance_flags ^= PIXEL_SCALE + +/datum/nobody_wants_to_learn_matrix_math/proc/set_transform() + animate(target, transform = testing_matrix, time = 0.5 SECONDS) + testing_matrix = matrix(target.transform) + +/client/proc/open_matrix_tester(atom/in_atom) + if(holder) + var/datum/nobody_wants_to_learn_matrix_math/matrix_tester = new(in_atom) + matrix_tester.ui_interact(mob) diff --git a/code/modules/admin/view_variables/reference_tracking.dm b/code/modules/admin/view_variables/reference_tracking.dm index a5b2af68c772e..9cb661d2fee33 100644 --- a/code/modules/admin/view_variables/reference_tracking.dm +++ b/code/modules/admin/view_variables/reference_tracking.dm @@ -92,6 +92,7 @@ return datum_container.last_find_references = search_time + var/container_print = datum_container.ref_search_details() var/list/vars_list = datum_container.vars for(var/varname in vars_list) @@ -108,11 +109,11 @@ found_refs[varname] = TRUE continue //End early, don't want these logging #endif - log_reftracker("Found [type] [text_ref(src)] in [datum_container.type]'s [text_ref(datum_container)] [varname] var. [container_name]") + log_reftracker("Found [type] [text_ref(src)] in [datum_container.type]'s [container_print] [varname] var. [container_name]") continue if(islist(variable)) - DoSearchVar(variable, "[container_name] [text_ref(datum_container)] -> [varname] (list)", recursive_limit - 1, search_time) + DoSearchVar(variable, "[container_name] [container_print] -> [varname] (list)", recursive_limit - 1, search_time) else if(islist(potential_container)) var/normal = IS_NORMAL_LIST(potential_container) @@ -159,3 +160,13 @@ qdel(src, force) #endif + +// Kept outside the ifdef so overrides are easy to implement + +/// 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 text_ref(src) + +/datum/callback/ref_search_details() + return "[text_ref(src)] (obj: [object] proc: [delegate] args: [json_encode(arguments)] user: [user?.resolve() || "null"])" diff --git a/code/modules/admin/view_variables/topic_basic.dm b/code/modules/admin/view_variables/topic_basic.dm index 167d44f7087f2..96500de507001 100644 --- a/code/modules/admin/view_variables/topic_basic.dm +++ b/code/modules/admin/view_variables/topic_basic.dm @@ -61,22 +61,34 @@ names += componentsubtypes names += "---Elements---" names += sort_list(subtypesof(/datum/element), GLOBAL_PROC_REF(cmp_typepaths_asc)) + var/result = tgui_input_list(usr, "Choose a component/element to add", "Add Component", names) if(isnull(result)) return if(!usr || result == "---Components---" || result == "---Elements---") return + if(QDELETED(src)) to_chat(usr, "That thing doesn't exist anymore!", confidential = TRUE) return + + var/add_source + if(ispath(result, /datum/component)) + var/datum/component/comp_path = result + if(initial(comp_path.dupe_mode) == COMPONENT_DUPE_SOURCES) + add_source = tgui_input_text(usr, "Enter a source for the component", "Add Component", "ADMIN-ABUSE") + if(isnull(add_source)) + return + var/list/lst = get_callproc_args() if(!lst) return + var/datumname = "error" lst.Insert(1, result) if(result in componentsubtypes) datumname = "component" - target._AddComponent(lst) + target._AddComponent(lst, add_source) else datumname = "element" target._AddElement(lst) @@ -128,8 +140,7 @@ if(href_list[VV_HK_MODIFY_GREYSCALE]) if(!check_rights(NONE)) return - var/datum/greyscale_modify_menu/menu = new(target, usr, SSgreyscale.configurations) - menu.Unlock() + var/datum/greyscale_modify_menu/menu = new(target, usr, SSgreyscale.configurations, unlocked = TRUE) menu.ui_interact(usr) if(href_list[VV_HK_CALLPROC]) usr.client.callproc_datum(target) diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 709741abd9671..718355b827893 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -1,3 +1,6 @@ +/// Max length of custom objective text +#define CUSTOM_OBJECTIVE_MAX_LENGTH 300 + GLOBAL_LIST_EMPTY(antagonists) /datum/antagonist @@ -51,7 +54,13 @@ GLOBAL_LIST_EMPTY(antagonists) /// The typepath for the outfit to show in the preview for the preferences menu. var/preview_outfit /// Flags for antags to turn on or off and check! - var/antag_flags = FLAG_ANTAG_CAN_BE_INDUCTED + var/antag_flags = FLAG_FAKE_ANTAG + /// If true, this antagonist can assign themself a new objective + var/can_assign_self_objectives = FALSE + /// Default to fill in when entering a custom objective. + var/default_custom_objective = "Cause chaos on the space station." + /// Whether we give a hardcore random bonus for greentexting as this antagonist while playing hardcore random + var/hardcore_random_bonus = FALSE //ANTAG UI @@ -117,6 +126,15 @@ GLOBAL_LIST_EMPTY(antagonists) ui = new(user, src, ui_name, name) ui.open() +/datum/antagonist/ui_act(action, params) + . = ..() + if(.) + return + switch(action) + if("change_objectives") + submit_player_objective() + return TRUE + /datum/antagonist/ui_state(mob/user) return GLOB.always_state @@ -124,6 +142,7 @@ GLOBAL_LIST_EMPTY(antagonists) var/list/data = list() data["antag_name"] = name data["objectives"] = get_objectives() + data["can_change_objective"] = can_assign_self_objectives return data //button for antags to review their descriptions/info @@ -155,20 +174,20 @@ GLOBAL_LIST_EMPTY(antagonists) return TRUE /datum/antagonist/proc/can_be_owned(datum/mind/new_owner) - . = TRUE var/datum/mind/tested = new_owner || owner if(tested.has_antag_datum(type)) return FALSE for(var/datum/antagonist/badguy as anything in tested.antag_datums) if(is_type_in_typecache(src, badguy.typecache_datum_blacklist)) return FALSE + return TRUE //This will be called in add_antag_datum before owner assignment. //Should return antag datum without owner. /datum/antagonist/proc/specialization(datum/mind/new_owner) return src -///Called by the transfer_to() mind proc after the mind (mind.current and new_character.mind) has moved but before the player (key and client) is transfered. +///Called by the transfer_to() mind proc after the mind (mind.current and new_character.mind) has moved but before the player (key and client) is transferred. /datum/antagonist/proc/on_body_transfer(mob/living/old_body, mob/living/new_body) SHOULD_CALL_PARENT(TRUE) remove_innate_effects(old_body) @@ -260,8 +279,13 @@ GLOBAL_LIST_EMPTY(antagonists) */ /datum/antagonist/proc/is_banned(mob/player) if(!player) + stack_trace("Called is_banned without a mob. This shouldn't happen.") + return FALSE + + if(!player.ckey) return FALSE - . = (is_banned_from(player.ckey, list(ROLE_SYNDICATE, job_rank)) || QDELETED(player)) + + return (is_banned_from(player.ckey, list(ROLE_SYNDICATE, job_rank)) || QDELETED(player)) /** * Proc that replaces a player who cannot play a specific antagonist due to being banned via a poll, and alerts the player of their being on the banlist. @@ -519,3 +543,56 @@ GLOBAL_LIST_EMPTY(antagonists) /// Used to create objectives for the antagonist. /datum/antagonist/proc/forge_objectives() return + +/** + * Allows player to replace their objectives with a new one they wrote themselves. + * * retain_existing - If true, will just be added as a new objective instead of replacing existing ones. + * * retain_escape - If true, will retain specifically 'escape alive' objectives (or similar) + * * force - Skips the check about whether this antagonist is supposed to set its own objectives, for badminning + */ +/datum/antagonist/proc/submit_player_objective(retain_existing = FALSE, retain_escape = TRUE, force = FALSE) + if (isnull(owner) || isnull(owner.current)) + return + var/mob/living/owner_mob = owner.current + if (!force && !can_assign_self_objectives) + owner_mob.balloon_alert(owner_mob, "can't do that!") + return + var/custom_objective_text = tgui_input_text( + owner_mob, + message = "Specify your new objective.", + title = "Custom Objective", + default = default_custom_objective, + max_length = CUSTOM_OBJECTIVE_MAX_LENGTH, + ) + if (QDELETED(src) || QDELETED(owner_mob) || isnull(custom_objective_text)) + return // Some people take a long-ass time to type maybe they got dusted + + log_game("[key_name(owner_mob)] [retain_existing ? "" : "opted out of their original objectives and "]chose a custom objective: [custom_objective_text]") + message_admins("[ADMIN_LOOKUPFLW(owner_mob)] has chosen a custom antagonist objective: [span_syndradio("[custom_objective_text]")] | [ADMIN_SMITE(owner_mob)] | [ADMIN_SYNDICATE_REPLY(owner_mob)]") + + var/datum/objective/custom/custom_objective = new() + custom_objective.owner = owner + custom_objective.explanation_text = custom_objective_text + custom_objective.completed = TRUE + + if (retain_existing) + objectives.Insert(1, custom_objective) + else if (!retain_escape) + objectives = list(custom_objective) + else + var/static/list/escape_objectives = list( + /datum/objective/escape, + /datum/objective/survive, + /datum/objective/martyr, + /datum/objective/exile, + ) + for (var/datum/objective/check_objective in objectives) + if (is_type_in_list(check_objective, escape_objectives)) + continue + objectives -= check_objective + objectives.Insert(1, custom_objective) + + can_assign_self_objectives = FALSE + owner.announce_objectives() + +#undef CUSTOM_OBJECTIVE_MAX_LENGTH diff --git a/code/modules/antagonists/_common/antag_helpers.dm b/code/modules/antagonists/_common/antag_helpers.dm index a0cf5a63d7081..6ccaa80e55fd4 100644 --- a/code/modules/antagonists/_common/antag_helpers.dm +++ b/code/modules/antagonists/_common/antag_helpers.dm @@ -1,12 +1,13 @@ -//Returns MINDS of the assigned antags of given type/subtypes -/proc/get_antag_minds(antag_type,specific = FALSE) +/// Returns MINDS of the assigned antags of given type/subtypes +/// Supplying no antag type grants all minds with antag datums +/proc/get_antag_minds(antag_type, specific = FALSE) RETURN_TYPE(/list/datum/mind) . = list() for(var/datum/antagonist/A in GLOB.antagonists) if(!A.owner) continue if(!antag_type || !specific && istype(A,antag_type) || specific && A.type == antag_type) - . += A.owner + . |= A.owner /// From a list of players (minds, mobs or clients), finds the one with the highest playtime (either from a specific role or overall living) and returns it. /proc/get_most_experienced(list/players, specific_role) diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index 5e9a38b869d83..47229ddd46267 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -16,7 +16,7 @@ /obj/item/antag_spawner/contract name = "contract" desc = "A magic contract previously signed by an apprentice. In exchange for instruction in the magical arts, they are bound to answer your call for aid." - icon = 'icons/obj/wizard.dmi' + icon = 'icons/obj/scrolls.dmi' icon_state ="scroll2" var/polling = FALSE @@ -104,7 +104,9 @@ var/special_role_name = ROLE_NUCLEAR_OPERATIVE /// The applied outfit var/datum/outfit/syndicate/outfit = /datum/outfit/syndicate/reinforcement - /// The antag datam applied + /// The outfit given to plasmaman operatives + var/datum/outfit/syndicate/plasma_outfit = /datum/outfit/syndicate/reinforcement/plasmaman + /// The antag datum applied var/datum/antagonist/nukeop/antag_datum = /datum/antagonist/nukeop /// Style used by the droppod var/pod_style = STYLE_SYNDICATE @@ -144,11 +146,11 @@ else to_chat(user, span_warning("Unable to connect to Syndicate command. Please wait and try again later or use the beacon on your uplink to get your points refunded.")) -/obj/item/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T, kind, datum/mind/user) +/obj/item/antag_spawner/nuke_ops/spawn_antag(client/our_client, turf/T, kind, datum/mind/user) var/mob/living/carbon/human/nukie = new() var/obj/structure/closet/supplypod/pod = setup_pod() - C.prefs.safe_transfer_prefs_to(nukie, is_antag = TRUE) - nukie.ckey = C.key + our_client.prefs.safe_transfer_prefs_to(nukie, is_antag = TRUE) + nukie.ckey = our_client.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)) @@ -157,6 +159,7 @@ antag_datum = new() antag_datum.send_to_spawnpoint = FALSE + antag_datum.nukeop_outfit = use_subtypes ? pick(subtypesof(outfit)) : outfit var/datum/antagonist/nukeop/creator_op = user.has_antag_datum(/datum/antagonist/nukeop, TRUE) @@ -236,14 +239,12 @@ /obj/item/antag_spawner/slaughter_demon //Warning edgiest item in the game name = "vial of blood" desc = "A magically infused bottle of blood, distilled from countless murder victims. Used in unholy rituals to attract horrifying creatures." - icon = 'icons/obj/wizard.dmi' + icon = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "vial" var/shatter_msg = span_notice("You shatter the bottle, no turning back now!") var/veil_msg = span_warning("You sense a dark presence lurking just beyond the veil...") - var/mob/living/demon_type = /mob/living/simple_animal/hostile/imp/slaughter - var/antag_type = /datum/antagonist/slaughter - + var/mob/living/demon_type = /mob/living/basic/demon/slaughter /obj/item/antag_spawner/slaughter_demon/attack_self(mob/user) if(!is_station_level(user.z)) @@ -264,27 +265,21 @@ playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, TRUE) qdel(src) else - to_chat(user, span_warning("You can't seem to work up the nerve to shatter the bottle! Perhaps you should try again later.")) - + to_chat(user, span_warning("The bottle's contents usually pop and boil constantly, but right now they're eerily still and calm. Perhaps you should try again later.")) /obj/item/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, kind = "", datum/mind/user) - var/mob/living/simple_animal/hostile/imp/slaughter/S = new demon_type(T) - new /obj/effect/dummy/phased_mob(T, S) + var/mob/living/basic/demon/spawned = new demon_type(T) + new /obj/effect/dummy/phased_mob(T, spawned) - S.key = C.key - S.mind.set_assigned_role(SSjob.GetJobType(/datum/job/slaughter_demon)) - S.mind.special_role = ROLE_SLAUGHTER_DEMON - S.mind.add_antag_datum(antag_type) - 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.")) + spawned.key = C.key + spawned.generate_antagonist_status() /obj/item/antag_spawner/slaughter_demon/laughter name = "vial of tickles" desc = "A magically infused bottle of clown love, distilled from countless hugging attacks. Used in funny rituals to attract adorable creatures." - icon = 'icons/obj/wizard.dmi' + icon = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "vial" color = "#FF69B4" // HOT PINK veil_msg = span_warning("You sense an adorable presence lurking just beyond the veil...") - demon_type = /mob/living/simple_animal/hostile/imp/slaughter/laughter - antag_type = /datum/antagonist/slaughter/laughter + demon_type = /mob/living/basic/demon/slaughter/laughter diff --git a/code/modules/antagonists/_common/antag_team.dm b/code/modules/antagonists/_common/antag_team.dm index c568c58e3104d..902456d909bcb 100644 --- a/code/modules/antagonists/_common/antag_team.dm +++ b/code/modules/antagonists/_common/antag_team.dm @@ -58,11 +58,9 @@ GLOBAL_LIST_EMPTY(antagonist_teams) var/win = TRUE var/objective_count = 1 for(var/datum/objective/objective as anything in objectives) - if(objective.check_completion()) - report += "Objective #[objective_count]: [objective.explanation_text] [span_greentext("Success!")]" - else - report += "Objective #[objective_count]: [objective.explanation_text] [span_redtext("Fail.")]" + if(!objective.check_completion()) win = FALSE + report += "Objective #[objective_count]: [objective.explanation_text] [objective.get_roundend_success_suffix()]" objective_count++ if(win) report += span_greentext("The [name] was successful!") diff --git a/code/modules/antagonists/abductor/abductor.dm b/code/modules/antagonists/abductor/abductor.dm index 32d8d1e7b9113..a4e1f2e5dcc8a 100644 --- a/code/modules/antagonists/abductor/abductor.dm +++ b/code/modules/antagonists/abductor/abductor.dm @@ -14,7 +14,6 @@ var/greet_text /// Type path for the associated job datum. var/role_job = /datum/job/abductor_agent - var/datum/action/cooldown/spell/summonitem/abductor/baton_return_spell /datum/antagonist/abductor/get_preview_icon() var/mob/living/carbon/human/dummy/consistent/scientist = new @@ -75,16 +74,11 @@ objectives += team.objectives finalize_abductor() ADD_TRAIT(owner, TRAIT_ABDUCTOR_TRAINING, ABDUCTOR_ANTAGONIST) - baton_return_spell = new(owner) - baton_return_spell.Grant(owner.current) - if(HAS_TRAIT(owner, TRAIT_ABDUCTOR_SCIENTIST_TRAINING)) - baton_return_spell.Remove(owner.current) return ..() /datum/antagonist/abductor/on_removal() owner.special_role = null REMOVE_TRAIT(owner, TRAIT_ABDUCTOR_TRAINING, ABDUCTOR_ANTAGONIST) - baton_return_spell.Remove(owner.current) return ..() /datum/antagonist/abductor/greet() @@ -199,7 +193,7 @@ 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 as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/abductor/experiment)) if(!istype(team, /datum/team/abductor_team)) return FALSE var/datum/team/abductor_team/T = team diff --git a/code/modules/antagonists/abductor/abductor_structures.dm b/code/modules/antagonists/abductor/abductor_structures.dm new file mode 100644 index 0000000000000..7da1d72d06b5a --- /dev/null +++ b/code/modules/antagonists/abductor/abductor_structures.dm @@ -0,0 +1,124 @@ + +// Operating Table / Beds / Lockers + +/obj/structure/bed/abductor + name = "resting contraption" + desc = "This looks similar to contraptions from Earth. Could aliens be stealing our technology?" + icon = 'icons/obj/antags/abductor.dmi' + build_stack_type = /obj/item/stack/sheet/mineral/abductor + icon_state = "bed" + +/obj/structure/table_frame/abductor + name = "alien table frame" + desc = "A sturdy table frame made from alien alloy." + icon_state = "alien_frame" + framestack = /obj/item/stack/sheet/mineral/abductor + framestackamount = 1 + +/obj/structure/table_frame/abductor/attackby(obj/item/attacking_item, mob/user, params) + if(attacking_item.tool_behaviour == TOOL_WRENCH) + to_chat(user, span_notice("You start disassembling [src]...")) + attacking_item.play_tool_sound(src) + if(attacking_item.use_tool(src, user, 30)) + playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) + for(var/i in 0 to framestackamount) + new framestack(get_turf(src)) + qdel(src) + return + if(istype(attacking_item, /obj/item/stack/sheet/mineral/abductor)) + var/obj/item/stack/sheet/stacked_sheets = attacking_item + if(stacked_sheets.get_amount() < 1) + to_chat(user, span_warning("You need one alien alloy sheet to do this!")) + return + to_chat(user, span_notice("You start adding [stacked_sheets] to [src]...")) + if(do_after(user, 50, target = src)) + stacked_sheets.use(1) + new /obj/structure/table/abductor(src.loc) + qdel(src) + return + if(istype(attacking_item, /obj/item/stack/sheet/mineral/silver)) + var/obj/item/stack/sheet/stacked_sheets = attacking_item + if(stacked_sheets.get_amount() < 1) + to_chat(user, span_warning("You need one sheet of silver to do this!")) + return + to_chat(user, span_notice("You start adding [stacked_sheets] to [src]...")) + if(do_after(user, 50, target = src)) + stacked_sheets.use(1) + new /obj/structure/table/optable/abductor(src.loc) + qdel(src) + +/obj/structure/table/abductor + name = "alien table" + desc = "Advanced flat surface technology at work!" + icon = 'icons/obj/smooth_structures/alien_table.dmi' + icon_state = "alien_table-0" + base_icon_state = "alien_table" + buildstack = /obj/item/stack/sheet/mineral/abductor + framestack = /obj/item/stack/sheet/mineral/abductor + buildstackamount = 1 + framestackamount = 1 + smoothing_groups = SMOOTH_GROUP_ABDUCTOR_TABLES + canSmoothWith = SMOOTH_GROUP_ABDUCTOR_TABLES + frame = /obj/structure/table_frame/abductor + custom_materials = list(/datum/material/silver =SHEET_MATERIAL_AMOUNT) + +/obj/structure/table/optable/abductor + name = "alien operating table" + desc = "Used for alien medical procedures. The surface is covered in tiny spines." + frame = /obj/structure/table_frame/abductor + buildstack = /obj/item/stack/sheet/mineral/silver + framestack = /obj/item/stack/sheet/mineral/abductor + buildstackamount = 1 + framestackamount = 1 + icon = 'icons/obj/antags/abductor.dmi' + icon_state = "bed" + can_buckle = TRUE + buckle_lying = 90 + /// Amount to inject per second + var/inject_amount = 0.5 + + var/static/list/injected_reagents = list(/datum/reagent/medicine/cordiolis_hepatico) + +/obj/structure/table/optable/abductor/Initialize(mapload) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + +/obj/structure/table/optable/abductor/proc/on_entered(datum/source, atom/movable/AM) + SIGNAL_HANDLER + if(iscarbon(AM)) + START_PROCESSING(SSobj, src) + to_chat(AM, span_danger("You feel a series of tiny pricks!")) + +/obj/structure/table/optable/abductor/process(seconds_per_tick) + . = PROCESS_KILL + for(var/mob/living/carbon/victim in get_turf(src)) + . = TRUE + for(var/chemical in injected_reagents) + if(victim.reagents.get_reagent_amount(chemical) < inject_amount * seconds_per_tick) + victim.reagents.add_reagent(chemical, inject_amount * seconds_per_tick) + return . + +/obj/structure/table/optable/abductor/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/structure/closet/abductor + name = "alien locker" + desc = "Contains secrets of the universe." + icon_state = "abductor" + icon_door = "abductor" + can_weld_shut = FALSE + door_anim_time = 0 + material_drop = /obj/item/stack/sheet/mineral/abductor + +/obj/structure/door_assembly/door_assembly_abductor + name = "alien airlock assembly" + icon = 'icons/obj/doors/airlocks/abductor/abductor_airlock.dmi' + base_name = "alien airlock" + overlays_file = 'icons/obj/doors/airlocks/abductor/overlays.dmi' + airlock_type = /obj/machinery/door/airlock/abductor + material_type = /obj/item/stack/sheet/mineral/abductor + noglass = TRUE diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm deleted file mode 100644 index 46ab0e797f067..0000000000000 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ /dev/null @@ -1,918 +0,0 @@ -#define VEST_STEALTH 1 -#define VEST_COMBAT 2 -#define GIZMO_SCAN 1 -#define GIZMO_MARK 2 -#define MIND_DEVICE_MESSAGE 1 -#define MIND_DEVICE_CONTROL 2 - -//AGENT VEST -/obj/item/clothing/suit/armor/abductor/vest - name = "agent vest" - desc = "A vest outfitted with advanced stealth technology. It has two modes - combat and stealth." - icon = 'icons/obj/abductor.dmi' - icon_state = "vest_stealth" - inhand_icon_state = "armor" - blood_overlay_type = "armor" - armor_type = /datum/armor/abductor_vest - actions_types = list(/datum/action/item_action/hands_free/activate) - allowed = list( - /obj/item/abductor, - /obj/item/melee/baton, - /obj/item/gun/energy, - /obj/item/restraints/handcuffs - ) - var/mode = VEST_STEALTH - var/stealth_active = FALSE - /// Cooldown in seconds - var/combat_cooldown = 20 - var/datum/icon_snapshot/disguise - -/datum/armor/abductor_combat - melee = 50 - bullet = 50 - laser = 50 - energy = 50 - bomb = 50 - bio = 50 - fire = 90 - acid = 90 - -/datum/armor/abductor_vest - melee = 15 - bullet = 15 - laser = 15 - energy = 25 - bomb = 15 - bio = 15 - fire = 70 - acid = 70 - -/obj/item/clothing/suit/armor/abductor/vest/proc/toggle_nodrop() - if(HAS_TRAIT_FROM(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT)) - REMOVE_TRAIT(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) - else - ADD_TRAIT(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) - if(ismob(loc)) - to_chat(loc, span_notice("Your vest is now [HAS_TRAIT_FROM(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) ? "locked" : "unlocked"].")) - -/obj/item/clothing/suit/armor/abductor/vest/proc/flip_mode() - switch(mode) - if(VEST_STEALTH) - mode = VEST_COMBAT - DeactivateStealth() - set_armor(/datum/armor/abductor_combat) - icon_state = "vest_combat" - if(VEST_COMBAT)// TO STEALTH - mode = VEST_STEALTH - set_armor(/datum/armor/abductor_vest) - icon_state = "vest_stealth" - if(ishuman(loc)) - var/mob/living/carbon/human/H = loc - H.update_worn_oversuit() - update_item_action_buttons() - -/obj/item/clothing/suit/armor/abductor/vest/item_action_slot_check(slot, mob/user) - if(slot & ITEM_SLOT_OCLOTHING) //we only give the mob the ability to activate the vest if he's actually wearing it. - return TRUE - -/obj/item/clothing/suit/armor/abductor/vest/proc/SetDisguise(datum/icon_snapshot/entry) - disguise = entry - -/obj/item/clothing/suit/armor/abductor/vest/proc/ActivateStealth() - if(disguise == null) - return - stealth_active = TRUE - if(ishuman(loc)) - var/mob/living/carbon/human/M = loc - new /obj/effect/temp_visual/dir_setting/ninja/cloak(get_turf(M), M.dir) - M.name_override = disguise.name - M.icon = disguise.icon - M.icon_state = disguise.icon_state - M.cut_overlays() - M.add_overlay(disguise.overlays) - M.update_held_items() - -/obj/item/clothing/suit/armor/abductor/vest/proc/DeactivateStealth() - if(!stealth_active) - return - stealth_active = FALSE - if(ishuman(loc)) - var/mob/living/carbon/human/M = loc - new /obj/effect/temp_visual/dir_setting/ninja(get_turf(M), M.dir) - M.name_override = null - 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, damage_type = BRUTE) - DeactivateStealth() - -/obj/item/clothing/suit/armor/abductor/vest/IsReflect() - DeactivateStealth() - -/obj/item/clothing/suit/armor/abductor/vest/ui_action_click() - switch(mode) - if(VEST_COMBAT) - Adrenaline() - if(VEST_STEALTH) - if(stealth_active) - DeactivateStealth() - else - ActivateStealth() - -/obj/item/clothing/suit/armor/abductor/vest/proc/Adrenaline() - if(ishuman(loc)) - if(combat_cooldown < initial(combat_cooldown)) - to_chat(loc, span_warning("Combat injection is still recharging.")) - return - var/mob/living/carbon/human/M = loc - M.adjustStaminaLoss(-75) - M.SetUnconscious(0) - M.SetStun(0) - M.SetKnockdown(0) - M.SetImmobilized(0) - M.SetParalyzed(0) - combat_cooldown = 0 - START_PROCESSING(SSobj, src) - -/obj/item/clothing/suit/armor/abductor/vest/process(seconds_per_tick) - combat_cooldown += seconds_per_tick - if(combat_cooldown >= initial(combat_cooldown)) - STOP_PROCESSING(SSobj, src) - -/obj/item/clothing/suit/armor/abductor/Destroy() - STOP_PROCESSING(SSobj, src) - for(var/obj/machinery/abductor/console/C in GLOB.machines) - if(C.vest == src) - C.vest = null - break - . = ..() - - -/obj/item/abductor - icon = 'icons/obj/abductor.dmi' - lefthand_file = 'icons/mob/inhands/antag/abductor_lefthand.dmi' - righthand_file = 'icons/mob/inhands/antag/abductor_righthand.dmi' - -/obj/item/proc/AbductorCheck(mob/user) - if (HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING)) - return TRUE - if (istype(user) && user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_TRAINING)) - return TRUE - to_chat(user, span_warning("You can't figure out how this works!")) - return FALSE - -/obj/item/abductor/proc/ScientistCheck(mob/user) - var/training = HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING) || (user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_TRAINING)) - var/sci_training = HAS_TRAIT(user, TRAIT_ABDUCTOR_SCIENTIST_TRAINING) || (user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_SCIENTIST_TRAINING)) - - if(training && !sci_training) - to_chat(user, span_warning("You're not trained to use this!")) - . = FALSE - else if(!training && !sci_training) - to_chat(user, span_warning("You can't figure how this works!")) - . = FALSE - else - . = TRUE - -/obj/item/abductor/gizmo - name = "science tool" - desc = "A dual-mode tool for retrieving specimens and scanning appearances. Scanning can be done through cameras." - icon_state = "gizmo_scan" - inhand_icon_state = "silencer" - var/mode = GIZMO_SCAN - var/datum/weakref/marked_target_weakref - var/obj/machinery/abductor/console/console - -/obj/item/abductor/gizmo/attack_self(mob/user) - if(!ScientistCheck(user)) - return - if(!console) - to_chat(user, span_warning("The device is not linked to console!")) - return - - if(mode == GIZMO_SCAN) - mode = GIZMO_MARK - icon_state = "gizmo_mark" - else - mode = GIZMO_SCAN - icon_state = "gizmo_scan" - to_chat(user, span_notice("You switch the device to [mode == GIZMO_SCAN? "SCAN": "MARK"] MODE")) - -/obj/item/abductor/gizmo/attack(mob/living/M, mob/user) - if(!ScientistCheck(user)) - return - if(!console) - to_chat(user, span_warning("The device is not linked to console!")) - return - - switch(mode) - if(GIZMO_SCAN) - scan(M, user) - if(GIZMO_MARK) - mark(M, user) - - -/obj/item/abductor/gizmo/afterattack(atom/target, mob/living/user, flag, params) - . = ..() - if(flag) - return - if(!ScientistCheck(user)) - return . - if(!console) - to_chat(user, span_warning("The device is not linked to console!")) - return . - - switch(mode) - if(GIZMO_SCAN) - scan(target, user) - if(GIZMO_MARK) - mark(target, user) - - return . - -/obj/item/abductor/gizmo/proc/scan(atom/target, mob/living/user) - if(ishuman(target)) - console.AddSnapshot(target) - to_chat(user, span_notice("You scan [target] and add [target.p_them()] to the database.")) - -/obj/item/abductor/gizmo/proc/mark(atom/target, mob/living/user) - var/mob/living/marked = marked_target_weakref?.resolve() - if(marked == target) - to_chat(user, span_warning("This specimen is already marked!")) - return - if(isabductor(target) || iscow(target)) - marked_target_weakref = WEAKREF(target) - to_chat(user, span_notice("You mark [target] for future retrieval.")) - else - prepare(target,user) - -/obj/item/abductor/gizmo/proc/prepare(atom/target, mob/living/user) - if(get_dist(target,user)>1) - to_chat(user, span_warning("You need to be next to the specimen to prepare it for transport!")) - return - to_chat(user, span_notice("You begin preparing [target] for transport...")) - if(do_after(user, 100, target = target)) - marked_target_weakref = WEAKREF(target) - to_chat(user, span_notice("You finish preparing [target] for transport.")) - -/obj/item/abductor/gizmo/Destroy() - if(console) - console.gizmo = null - console = null - . = ..() - - -/obj/item/abductor/silencer - name = "abductor silencer" - desc = "A compact device used to shut down communications equipment." - icon_state = "silencer" - inhand_icon_state = "gizmo" - -/obj/item/abductor/silencer/attack(mob/living/M, mob/user) - if(!AbductorCheck(user)) - return - radio_off(M, user) - -/obj/item/abductor/silencer/afterattack(atom/target, mob/living/user, flag, params) - . = ..() - if(flag) - return - . |= AFTERATTACK_PROCESSED_ITEM - if(!AbductorCheck(user)) - return . - radio_off(target, user) - return . - -/obj/item/abductor/silencer/proc/radio_off(atom/target, mob/living/user) - if( !(user in (viewers(7,target))) ) - return - - var/turf/targloc = get_turf(target) - - var/mob/living/carbon/human/M - for(M in view(2,targloc)) - if(M == user) - continue - to_chat(user, span_notice("You silence [M]'s radio devices.")) - radio_off_mob(M) - -/obj/item/abductor/silencer/proc/radio_off_mob(mob/living/carbon/human/M) - var/list/all_items = M.get_all_contents() - - for(var/obj/item/radio/radio in all_items) - radio.set_listening(FALSE) - if(!istype(radio, /obj/item/radio/headset)) - radio.set_broadcasting(FALSE) //goddamned headset hacks - -/obj/item/abductor/mind_device - name = "mental interface device" - desc = "A dual-mode tool for directly communicating with sentient brains. It can be used to send a direct message to a target, \ - or to send a command to a test subject with a charged gland." - icon_state = "mind_device_message" - inhand_icon_state = "silencer" - var/mode = MIND_DEVICE_MESSAGE - -/obj/item/abductor/mind_device/attack_self(mob/user) - if(!ScientistCheck(user)) - return - - if(mode == MIND_DEVICE_MESSAGE) - mode = MIND_DEVICE_CONTROL - icon_state = "mind_device_control" - else - mode = MIND_DEVICE_MESSAGE - icon_state = "mind_device_message" - to_chat(user, span_notice("You switch the device to [mode == MIND_DEVICE_MESSAGE? "TRANSMISSION": "COMMAND"] MODE")) - -/obj/item/abductor/mind_device/afterattack(atom/target, mob/living/user, flag, params) - . = ..() - . |= AFTERATTACK_PROCESSED_ITEM - if(!ScientistCheck(user)) - return - - switch(mode) - if(MIND_DEVICE_CONTROL) - mind_control(target, user) - if(MIND_DEVICE_MESSAGE) - mind_message(target, user) - -/obj/item/abductor/mind_device/proc/mind_control(atom/target, mob/living/user) - if(iscarbon(target)) - var/mob/living/carbon/C = target - var/obj/item/organ/internal/heart/gland/G = C.get_organ_slot("heart") - if(!istype(G)) - to_chat(user, span_warning("Your target does not have an experimental gland!")) - return - if(!G.mind_control_uses) - to_chat(user, span_warning("Your target's gland is spent!")) - return - if(G.active_mind_control) - to_chat(user, span_warning("Your target is already under a mind-controlling influence!")) - return - - var/command = tgui_input_text(user, "Enter the command for your target to follow.\ - Uses Left: [G.mind_control_uses], Duration: [DisplayTimeText(G.mind_control_duration)]", "Enter command") - - if(!command) - return - - if(QDELETED(user) || user.get_active_held_item() != src || loc != user) - return - - if(QDELETED(G)) - return - - if(C.can_block_magic(MAGIC_RESISTANCE_MIND, charge_cost = 0)) - user.balloon_alert(user, "foiled!") - to_chat(user, span_warning("Your target seems to have some sort of mental blockage, preventing the message from being sent! It seems you've been foiled.")) - return - - G.mind_control(command, user) - to_chat(user, span_notice("You send the command to your target.")) - -/obj/item/abductor/mind_device/proc/mind_message(atom/target, mob/living/user) - if(isliving(target)) - var/mob/living/L = target - if(L.stat == DEAD) - to_chat(user, span_warning("Your target is dead!")) - return - var/message = tgui_input_text(user, "Message to send to your target's brain", "Enter message") - if(!message) - return - if(QDELETED(L) || L.stat == DEAD) - return - - L.balloon_alert(L, "you hear a voice") - to_chat(L, span_hear("You hear a voice in your head saying: [message]")) - to_chat(user, span_notice("You send the message to your target.")) - log_directed_talk(user, L, message, LOG_SAY, "abductor whisper") - - -/obj/item/firing_pin/abductor - name = "alien firing pin" - icon_state = "firing_pin_ayy" - desc = "This firing pin is slimy and warm; you can swear you feel it constantly trying to mentally probe you." - fail_message = "Firing error, please contact Command." - -/obj/item/firing_pin/abductor/pin_auth(mob/living/user) - . = isabductor(user) - -/obj/item/gun/energy/alien - name = "alien pistol" - desc = "A complicated gun that fires bursts of high-intensity radiation." - ammo_type = list(/obj/item/ammo_casing/energy/declone) - pin = /obj/item/firing_pin/abductor - icon_state = "alienpistol" - inhand_icon_state = "alienpistol" - trigger_guard = TRIGGER_GUARD_ALLOW_ALL - -/obj/item/gun/energy/shrink_ray - name = "shrink ray blaster" - desc = "This is a piece of frightening alien tech that enhances the magnetic pull of atoms in a localized space to temporarily make an object shrink. \ - That or it's just space magic. Either way, it shrinks stuff." - ammo_type = list(/obj/item/ammo_casing/energy/shrink) - pin = /obj/item/firing_pin/abductor - inhand_icon_state = "shrink_ray" - icon_state = "shrink_ray" - automatic_charge_overlays = FALSE - fire_delay = 30 - selfcharge = 1//shot costs 200 energy, has a max capacity of 1000 for 5 shots. self charge returns 25 energy every couple ticks, so about 1 shot charged every 12~ seconds - trigger_guard = TRIGGER_GUARD_ALLOW_ALL// variable-size trigger, get it? (abductors need this to be set so the gun is usable for them) - -/obj/item/paper/guides/antag/abductor - name = "Dissection Guide" - icon_state = "alienpaper_words" - show_written_words = FALSE - default_raw_text = {"Dissection for Dummies
    - -
    -1.Acquire fresh specimen.
    -2.Put the specimen on operating table.
    -3.Apply surgical drapes, preparing for experimental dissection.
    -4.Apply scalpel to specimen's torso.
    -5.Clamp bleeders on specimen's torso with a hemostat.
    -6.Retract skin of specimen's torso with a retractor.
    -7.Apply scalpel again to specimen's torso.
    -8.Search through the specimen's torso with your hands to remove any superfluous organs.
    -9.Insert replacement gland (Retrieve one from gland storage).
    -10.Consider dressing the specimen back to not disturb the habitat.
    -11.Put the specimen in the experiment machinery.
    -12.Choose one of the machine options. The target will be analyzed and teleported to the selected drop-off point.
    -13.You will receive one supply credit, and the subject will be counted towards your quota.
    -
    -Congratulations! You are now trained for invasive xenobiology research!"} - -/obj/item/paper/guides/antag/abductor/AltClick() - return //otherwise it would fold into a paperplane. - -#define BATON_STUN 0 -#define BATON_SLEEP 1 -#define BATON_CUFF 2 -#define BATON_PROBE 3 -#define BATON_MODES 4 - -/obj/item/melee/baton/abductor - name = "advanced baton" - desc = "A quad-mode baton used for incapacitation and restraining of specimens." - - icon = 'icons/obj/abductor.dmi' - lefthand_file = 'icons/mob/inhands/antag/abductor_lefthand.dmi' - righthand_file = 'icons/mob/inhands/antag/abductor_righthand.dmi' - icon_state = "wonderprodStun" - inhand_icon_state = "wonderprod" - - force = 7 - wound_bonus = FALSE - - actions_types = list(/datum/action/item_action/toggle_mode) - - cooldown = 0 SECONDS - stamina_damage = 0 - knockdown_time = 14 SECONDS - on_stun_sound = 'sound/weapons/egloves.ogg' - affect_cyborg = TRUE - - var/mode = BATON_STUN - - var/sleep_time = 2 MINUTES - var/time_to_cuff = 3 SECONDS - -/obj/item/melee/baton/abductor/Initialize(mapload) - . = ..() - AddElement(/datum/element/update_icon_updates_onmob) - -/obj/item/melee/baton/abductor/proc/toggle(mob/living/user=usr) - if(!AbductorCheck(user)) - return - mode = (mode+1)%BATON_MODES - var/txt - switch(mode) - if(BATON_STUN) - txt = "stunning" - if(BATON_SLEEP) - txt = "sleep inducement" - if(BATON_CUFF) - txt = "restraining" - if(BATON_PROBE) - txt = "probing" - - var/is_stun_mode = mode == BATON_STUN - var/is_stun_or_sleep = mode == BATON_STUN || mode == BATON_SLEEP - - affect_cyborg = is_stun_mode - log_stun_attack = is_stun_mode // other modes have their own log entries. - stun_animation = is_stun_or_sleep - on_stun_sound = is_stun_or_sleep ? 'sound/weapons/egloves.ogg' : null - - to_chat(usr, span_notice("You switch the baton to [txt] mode.")) - update_appearance() - -/obj/item/melee/baton/abductor/update_icon_state() - . = ..() - switch(mode) - if(BATON_STUN) - icon_state = "wonderprodStun" - inhand_icon_state = "wonderprodStun" - if(BATON_SLEEP) - icon_state = "wonderprodSleep" - inhand_icon_state = "wonderprodSleep" - if(BATON_CUFF) - icon_state = "wonderprodCuff" - inhand_icon_state = "wonderprodCuff" - if(BATON_PROBE) - icon_state = "wonderprodProbe" - inhand_icon_state = "wonderprodProbe" - -/obj/item/melee/baton/abductor/baton_attack(mob/target, mob/living/user, modifiers) - if(!AbductorCheck(user)) - return BATON_ATTACK_DONE - return ..() - -/obj/item/melee/baton/abductor/baton_effect(mob/living/target, mob/living/user, modifiers, stun_override) - switch (mode) - if(BATON_STUN) - target.visible_message(span_danger("[user] stuns [target] with [src]!"), - span_userdanger("[user] stuns you with [src]!")) - target.set_jitter_if_lower(40 SECONDS) - target.set_confusion_if_lower(10 SECONDS) - target.set_stutter_if_lower(16 SECONDS) - SEND_SIGNAL(target, COMSIG_LIVING_MINOR_SHOCK) - target.Paralyze(knockdown_time * (HAS_TRAIT(target, TRAIT_BATON_RESISTANCE) ? 0.1 : 1)) - if(BATON_SLEEP) - SleepAttack(target,user) - if(BATON_CUFF) - CuffAttack(target,user) - if(BATON_PROBE) - ProbeAttack(target,user) - -/obj/item/melee/baton/abductor/get_stun_description(mob/living/target, mob/living/user) - return // chat messages are handled in their own procs. - -/obj/item/melee/baton/abductor/get_cyborg_stun_description(mob/living/target, mob/living/user) - return // same as above. - -/obj/item/melee/baton/abductor/attack_self(mob/living/user) - . = ..() - toggle(user) - -/obj/item/melee/baton/abductor/proc/SleepAttack(mob/living/L,mob/living/user) - playsound(src, on_stun_sound, 50, TRUE, -1) - if(L.incapacitated(IGNORE_RESTRAINTS|IGNORE_GRAB)) - if(L.can_block_magic(MAGIC_RESISTANCE_MIND)) - to_chat(user, span_warning("The specimen has some kind of mental protection that is interfering with the sleep inducement! It seems you've been foiled.")) - L.visible_message(span_danger("[user] tried to induced sleep in [L] with [src], but is unsuccessful!"), \ - span_userdanger("You feel a strange wave of heavy drowsiness wash over you!")) - L.adjust_drowsiness(4 SECONDS) - return - L.visible_message(span_danger("[user] induces sleep in [L] with [src]!"), \ - span_userdanger("You suddenly feel very drowsy!")) - L.Sleeping(sleep_time) - log_combat(user, L, "put to sleep") - else - if(L.can_block_magic(MAGIC_RESISTANCE_MIND, charge_cost = 0)) - to_chat(user, span_warning("The specimen has some kind of mental protection that is completely blocking our sleep inducement methods! It seems you've been foiled.")) - L.visible_message(span_danger("[user] tried to induce sleep in [L] with [src], but is unsuccessful!"), \ - span_userdanger("Any sense of drowsiness is quickly diminished!")) - return - L.adjust_drowsiness(2 SECONDS) - to_chat(user, span_warning("Sleep inducement works fully only on stunned specimens! ")) - L.visible_message(span_danger("[user] tried to induce sleep in [L] with [src]!"), \ - span_userdanger("You suddenly feel drowsy!")) - -/obj/item/melee/baton/abductor/proc/CuffAttack(mob/living/L,mob/living/user) - if(!iscarbon(L)) - return - var/mob/living/carbon/C = L - if(!C.handcuffed) - if(C.canBeHandcuffed()) - playsound(src, 'sound/weapons/cablecuff.ogg', 30, TRUE, -2) - 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, time_to_cuff, C) && C.canBeHandcuffed()) - if(!C.handcuffed) - C.set_handcuffed(new /obj/item/restraints/handcuffs/energy/used(C)) - C.update_handcuffed() - to_chat(user, span_notice("You restrain [C].")) - log_combat(user, C, "handcuffed") - else - to_chat(user, span_warning("You fail to restrain [C].")) - else - to_chat(user, span_warning("[C] doesn't have two hands...")) - -/obj/item/melee/baton/abductor/proc/ProbeAttack(mob/living/L,mob/living/user) - L.visible_message(span_danger("[user] probes [L] with [src]!"), \ - span_userdanger("[user] probes you!")) - - var/species = span_warning("Unknown species") - var/helptext = span_warning("Species unsuitable for experiments.") - - if(ishuman(L)) - var/mob/living/carbon/human/H = L - species = span_notice("[H.dna.species.name]") - if(L.mind && L.mind.has_antag_datum(/datum/antagonist/changeling)) - species = span_warning("Changeling lifeform") - var/obj/item/organ/internal/heart/gland/temp = locate() in H.organs - if(temp) - helptext = span_warning("Experimental gland detected!") - else - if (L.get_organ_slot(ORGAN_SLOT_HEART)) - helptext = span_notice("Subject suitable for experiments.") - else - helptext = span_warning("Subject unsuitable for experiments.") - - to_chat(user, "[span_notice("Probing result:")][species]") - to_chat(user, "[helptext]") - -/obj/item/restraints/handcuffs/energy - name = "hard-light energy field" - desc = "A hard-light field restraining the hands." - icon_state = "cuff" // Needs sprite - lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' - breakouttime = 45 SECONDS - trashtype = /obj/item/restraints/handcuffs/energy/used - flags_1 = NONE - -/obj/item/restraints/handcuffs/energy/used - item_flags = DROPDEL - -/obj/item/restraints/handcuffs/energy/used/dropped(mob/user) - user.visible_message(span_danger("[user]'s [name] breaks in a discharge of energy!"), \ - span_userdanger("[user]'s [name] breaks in a discharge of energy!")) - var/datum/effect_system/spark_spread/S = new - S.set_up(4,0,user.loc) - S.start() - . = ..() - -/obj/item/melee/baton/abductor/examine(mob/user) - . = ..() - if(AbductorCheck(user)) - switch(mode) - if(BATON_STUN) - . += span_warning("The baton is in stun mode.") - if(BATON_SLEEP) - . += span_warning("The baton is in sleep inducement mode.") - if(BATON_CUFF) - . += span_warning("The baton is in restraining mode.") - if(BATON_PROBE) - . += span_warning("The baton is in probing mode.") - -/obj/item/radio/headset/abductor - name = "alien headset" - desc = "An advanced alien headset designed to monitor communications of human space stations. Why does it have a microphone? No one knows." - icon = 'icons/obj/abductor.dmi' - icon_state = "abductor_headset" - keyslot2 = /obj/item/encryptionkey/heads/captain - -/obj/item/radio/headset/abductor/Initialize(mapload) - . = ..() - AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) - make_syndie() - -// Stops humans from disassembling abductor headsets. -/obj/item/radio/headset/abductor/screwdriver_act(mob/living/user, obj/item/tool) - return TOOL_ACT_TOOLTYPE_SUCCESS - -/obj/item/abductor_machine_beacon - name = "machine beacon" - desc = "A beacon designed to instantly tele-construct abductor machinery." - icon = 'icons/obj/abductor.dmi' - icon_state = "beacon" - w_class = WEIGHT_CLASS_TINY - var/obj/machinery/spawned_machine - -/obj/item/abductor_machine_beacon/attack_self(mob/user) - ..() - user.visible_message(span_notice("[user] places down [src] and activates it."), span_notice("You place down [src] and activate it.")) - user.dropItemToGround(src) - playsound(src, 'sound/machines/terminal_alert.ogg', 50) - addtimer(CALLBACK(src, PROC_REF(try_spawn_machine)), 30) - -/obj/item/abductor_machine_beacon/proc/try_spawn_machine() - var/viable = FALSE - if(isfloorturf(loc)) - var/turf/T = loc - viable = TRUE - for(var/obj/thing in T.contents) - if(thing.density || ismachinery(thing) || isstructure(thing)) - viable = FALSE - if(viable) - playsound(src, 'sound/effects/phasein.ogg', 50, TRUE) - var/new_machine = new spawned_machine(loc) - visible_message(span_notice("[new_machine] warps on top of the beacon!")) - qdel(src) - else - playsound(src, 'sound/machines/buzz-two.ogg', 50) - -/obj/item/abductor_machine_beacon/chem_dispenser - name = "beacon - Reagent Synthesizer" - spawned_machine = /obj/machinery/chem_dispenser/abductor - -/obj/item/scalpel/alien - name = "alien scalpel" - desc = "It's a gleaming sharp knife made out of silvery-green metal." - icon = 'icons/obj/abductor.dmi' - toolspeed = 0.25 - -/obj/item/hemostat/alien - name = "alien hemostat" - desc = "You've never seen this before." - icon = 'icons/obj/abductor.dmi' - toolspeed = 0.25 - -/obj/item/retractor/alien - name = "alien retractor" - desc = "You're not sure if you want the veil pulled back." - icon = 'icons/obj/abductor.dmi' - toolspeed = 0.25 - -/obj/item/circular_saw/alien - name = "alien saw" - desc = "Do the aliens also lose this, and need to find an alien hatchet?" - icon = 'icons/obj/abductor.dmi' - toolspeed = 0.25 - -/obj/item/surgicaldrill/alien - name = "alien drill" - desc = "Maybe alien surgeons have finally found a use for the drill." - icon = 'icons/obj/abductor.dmi' - toolspeed = 0.25 - -/obj/item/cautery/alien - name = "alien cautery" - desc = "Why would bloodless aliens have a tool to stop bleeding? \ - Unless..." - icon = 'icons/obj/abductor.dmi' - toolspeed = 0.25 - -/obj/item/clothing/head/helmet/abductor - name = "agent headgear" - desc = "Abduct with style - spiky style. Prevents digital tracking." - icon_state = "alienhelmet" - inhand_icon_state = null - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT - -/obj/item/clothing/head/helmet/abductor/equipped(mob/living/user, slot) - . = ..() - if(slot_flags & slot) - RegisterSignal(user, COMSIG_LIVING_CAN_TRACK, PROC_REF(can_track)) - else - UnregisterSignal(user, COMSIG_LIVING_CAN_TRACK) - -/obj/item/clothing/head/helmet/abductor/dropped(mob/living/user) - . = ..() - UnregisterSignal(user, COMSIG_LIVING_CAN_TRACK) - -/obj/item/clothing/head/helmet/abductor/proc/can_track(datum/source, mob/user) - SIGNAL_HANDLER - - return COMPONENT_CANT_TRACK - -// Operating Table / Beds / Lockers - -/obj/structure/bed/abductor - name = "resting contraption" - desc = "This looks similar to contraptions from Earth. Could aliens be stealing our technology?" - icon = 'icons/obj/abductor.dmi' - buildstacktype = /obj/item/stack/sheet/mineral/abductor - icon_state = "bed" - -/obj/structure/table_frame/abductor - name = "alien table frame" - desc = "A sturdy table frame made from alien alloy." - icon_state = "alien_frame" - framestack = /obj/item/stack/sheet/mineral/abductor - framestackamount = 1 - -/obj/structure/table_frame/abductor/attackby(obj/item/I, mob/user, params) - if(I.tool_behaviour == TOOL_WRENCH) - to_chat(user, span_notice("You start disassembling [src]...")) - I.play_tool_sound(src) - if(I.use_tool(src, user, 30)) - playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) - for(var/i in 0 to framestackamount) - new framestack(get_turf(src)) - qdel(src) - return - if(istype(I, /obj/item/stack/sheet/mineral/abductor)) - var/obj/item/stack/sheet/P = I - if(P.get_amount() < 1) - to_chat(user, span_warning("You need one alien alloy sheet to do this!")) - return - to_chat(user, span_notice("You start adding [P] to [src]...")) - if(do_after(user, 50, target = src)) - P.use(1) - new /obj/structure/table/abductor(src.loc) - qdel(src) - return - if(istype(I, /obj/item/stack/sheet/mineral/silver)) - var/obj/item/stack/sheet/P = I - if(P.get_amount() < 1) - to_chat(user, span_warning("You need one sheet of silver to do this!")) - return - to_chat(user, span_notice("You start adding [P] to [src]...")) - if(do_after(user, 50, target = src)) - P.use(1) - new /obj/structure/table/optable/abductor(src.loc) - qdel(src) - -/obj/structure/table/abductor - name = "alien table" - desc = "Advanced flat surface technology at work!" - icon = 'icons/obj/smooth_structures/alien_table.dmi' - icon_state = "alien_table-0" - base_icon_state = "alien_table" - buildstack = /obj/item/stack/sheet/mineral/abductor - framestack = /obj/item/stack/sheet/mineral/abductor - buildstackamount = 1 - framestackamount = 1 - smoothing_groups = SMOOTH_GROUP_ABDUCTOR_TABLES - canSmoothWith = SMOOTH_GROUP_ABDUCTOR_TABLES - frame = /obj/structure/table_frame/abductor - custom_materials = list(/datum/material/silver =SHEET_MATERIAL_AMOUNT) - -/obj/structure/table/optable/abductor - name = "alien operating table" - desc = "Used for alien medical procedures. The surface is covered in tiny spines." - frame = /obj/structure/table_frame/abductor - buildstack = /obj/item/stack/sheet/mineral/silver - framestack = /obj/item/stack/sheet/mineral/abductor - buildstackamount = 1 - framestackamount = 1 - icon = 'icons/obj/abductor.dmi' - icon_state = "bed" - can_buckle = TRUE - buckle_lying = 90 - /// Amount to inject per second - var/inject_am = 0.5 - - var/static/list/injected_reagents = list(/datum/reagent/medicine/cordiolis_hepatico) - -/obj/structure/table/optable/abductor/Initialize(mapload) - . = ..() - var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = PROC_REF(on_entered), - ) - AddElement(/datum/element/connect_loc, loc_connections) - -/obj/structure/table/optable/abductor/proc/on_entered(datum/source, atom/movable/AM) - SIGNAL_HANDLER - if(iscarbon(AM)) - START_PROCESSING(SSobj, src) - to_chat(AM, span_danger("You feel a series of tiny pricks!")) - -/obj/structure/table/optable/abductor/process(seconds_per_tick) - . = PROCESS_KILL - for(var/mob/living/carbon/C in get_turf(src)) - . = TRUE - for(var/chemical in injected_reagents) - if(C.reagents.get_reagent_amount(chemical) < inject_am * seconds_per_tick) - C.reagents.add_reagent(chemical, inject_am * seconds_per_tick) - -/obj/structure/table/optable/abductor/Destroy() - STOP_PROCESSING(SSobj, src) - . = ..() - -/obj/structure/closet/abductor - name = "alien locker" - desc = "Contains secrets of the universe." - icon_state = "abductor" - icon_door = "abductor" - can_weld_shut = FALSE - door_anim_time = 0 - material_drop = /obj/item/stack/sheet/mineral/abductor - -/obj/structure/door_assembly/door_assembly_abductor - name = "alien airlock assembly" - icon = 'icons/obj/doors/airlocks/abductor/abductor_airlock.dmi' - base_name = "alien airlock" - overlays_file = 'icons/obj/doors/airlocks/abductor/overlays.dmi' - airlock_type = /obj/machinery/door/airlock/abductor - material_type = /obj/item/stack/sheet/mineral/abductor - noglass = TRUE - -/obj/item/clothing/under/abductor - desc = "The most advanced form of jumpsuit known to reality, looks uncomfortable." - name = "alien jumpsuit" - icon = 'icons/obj/clothing/under/syndicate.dmi' - icon_state = "abductor" - inhand_icon_state = "bl_suit" - worn_icon = 'icons/mob/clothing/under/syndicate.dmi' - armor_type = /datum/armor/under_abductor - can_adjust = FALSE - -/datum/armor/under_abductor - bomb = 10 - bio = 10 - -#undef BATON_CUFF -#undef BATON_MODES -#undef BATON_PROBE -#undef BATON_SLEEP -#undef BATON_STUN -#undef GIZMO_MARK -#undef GIZMO_SCAN -#undef MIND_DEVICE_CONTROL -#undef MIND_DEVICE_MESSAGE -#undef VEST_COMBAT -#undef VEST_STEALTH diff --git a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm index b3e4f89a7e013..109f27e82225f 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm @@ -24,11 +24,19 @@ for(var/obj/item/abductor/gizmo/G in B.contents) console.AddGizmo(G) -/datum/outfit/abductor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - ..() - if(!visualsOnly) - link_to_console(H) +/datum/outfit/abductor/post_equip(mob/living/carbon/human/user, visualsOnly = FALSE) + . = ..() + if(visualsOnly) + return + if(!isnull(user.mind)) + link_to_console(user) + + var/obj/item/melee/baton/abductor/batong = locate() in user + if(!isnull(batong)) + var/datum/action/cooldown/spell/summonitem/abductor/ayy_summon = new(user.mind || user) + ayy_summon.mark_item(batong) + ayy_summon.Grant(user) /datum/outfit/abductor/agent name = "Abductor Agent" @@ -49,11 +57,11 @@ /obj/item/abductor/gizmo = 1 ) -/datum/outfit/abductor/scientist/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - ..() - if(!visualsOnly) - var/obj/item/implant/abductor/beamplant = new /obj/item/implant/abductor(H) - beamplant.implant(H) +/datum/outfit/abductor/scientist/post_equip(mob/living/carbon/human/user, visualsOnly = FALSE) + . = ..() + if(!visualsOnly && !isnull(user.mind)) + var/obj/item/implant/abductor/beamplant = new /obj/item/implant/abductor(user) + beamplant.implant(user) /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 index 408b8da862e2b..a23eb3c025230 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm @@ -4,8 +4,8 @@ surgery_flags = SURGERY_IGNORE_CLOTHES | SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB steps = list( /datum/surgery_step/incise, - /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, + /datum/surgery_step/clamp_bleeders, /datum/surgery_step/incise, /datum/surgery_step/extract_organ, /datum/surgery_step/gland_insert, diff --git a/code/modules/antagonists/abductor/equipment/gear/abductor_clothing.dm b/code/modules/antagonists/abductor/equipment/gear/abductor_clothing.dm new file mode 100644 index 0000000000000..c54ce6937d86f --- /dev/null +++ b/code/modules/antagonists/abductor/equipment/gear/abductor_clothing.dm @@ -0,0 +1,162 @@ +/obj/item/clothing/under/abductor + desc = "The most advanced form of jumpsuit known to reality, looks uncomfortable." + name = "alien jumpsuit" + icon = 'icons/obj/clothing/under/syndicate.dmi' + icon_state = "abductor" + inhand_icon_state = "bl_suit" + worn_icon = 'icons/mob/clothing/under/syndicate.dmi' + armor_type = /datum/armor/clothing_under/abductor + can_adjust = FALSE + +/datum/armor/clothing_under/abductor + bomb = 10 + +//AGENT VEST +/obj/item/clothing/suit/armor/abductor/vest + name = "agent vest" + desc = "A vest outfitted with advanced stealth technology. It has two modes - combat and stealth." + icon = 'icons/obj/antags/abductor.dmi' + icon_state = "vest_stealth" + inhand_icon_state = "armor" + blood_overlay_type = "armor" + armor_type = /datum/armor/abductor_vest + actions_types = list(/datum/action/item_action/hands_free/activate) + allowed = list( + /obj/item/abductor, + /obj/item/melee/baton, + /obj/item/gun/energy, + /obj/item/restraints/handcuffs, + ) + /// What operation mode is our vest in? + var/mode = VEST_STEALTH + /// Do we have a disguise active? + var/stealth_active = FALSE + /// Cooldown in seconds for the combat mode activation stimulant. + var/combat_cooldown = 20 + /// The visual of our suit's disguise. + var/datum/icon_snapshot/disguise + +/datum/armor/abductor_combat + melee = 50 + bullet = 50 + laser = 50 + energy = 50 + bomb = 50 + bio = 50 + fire = 90 + acid = 90 + +/datum/armor/abductor_vest + melee = 15 + bullet = 15 + laser = 15 + energy = 25 + bomb = 15 + bio = 15 + fire = 70 + acid = 70 + +/obj/item/clothing/suit/armor/abductor/vest/proc/toggle_nodrop() + if(HAS_TRAIT_FROM(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT)) + REMOVE_TRAIT(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) + else + ADD_TRAIT(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) + if(ismob(loc)) + to_chat(loc, span_notice("Your vest is now [HAS_TRAIT_FROM(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) ? "locked" : "unlocked"].")) + +/obj/item/clothing/suit/armor/abductor/vest/proc/flip_mode() + switch(mode) + if(VEST_STEALTH) + mode = VEST_COMBAT + DeactivateStealth() + set_armor(/datum/armor/abductor_combat) + icon_state = "vest_combat" + if(VEST_COMBAT)// TO STEALTH + mode = VEST_STEALTH + set_armor(/datum/armor/abductor_vest) + icon_state = "vest_stealth" + if(ishuman(loc)) + var/mob/living/carbon/human/human_target = loc + human_target.update_worn_oversuit() + update_item_action_buttons() + +/obj/item/clothing/suit/armor/abductor/vest/item_action_slot_check(slot, mob/user) + if(slot & ITEM_SLOT_OCLOTHING) //we only give the mob the ability to activate the vest if he's actually wearing it. + return TRUE + +/obj/item/clothing/suit/armor/abductor/vest/proc/SetDisguise(datum/icon_snapshot/entry) + disguise = entry + +/obj/item/clothing/suit/armor/abductor/vest/proc/ActivateStealth() + if(disguise == null) + return + stealth_active = TRUE + if(ishuman(loc)) + var/mob/living/carbon/human/wearer = loc + new /obj/effect/temp_visual/dir_setting/ninja/cloak(get_turf(wearer), wearer.dir) + RegisterSignal(wearer, COMSIG_HUMAN_GET_VISIBLE_NAME, PROC_REF(return_disguise_name)) + wearer.icon = disguise.icon + wearer.icon_state = disguise.icon_state + wearer.cut_overlays() + wearer.add_overlay(disguise.overlays) + wearer.update_held_items() + +/obj/item/clothing/suit/armor/abductor/vest/proc/return_disguise_name(mob/living/carbon/human/source, list/identity) + SIGNAL_HANDLER + identity[VISIBLE_NAME_FACE] = disguise.name + identity[VISIBLE_NAME_ID] = "" + +/obj/item/clothing/suit/armor/abductor/vest/proc/DeactivateStealth() + if(!stealth_active) + return + stealth_active = FALSE + if(ishuman(loc)) + var/mob/living/carbon/human/wearer = loc + new /obj/effect/temp_visual/dir_setting/ninja(get_turf(wearer), wearer.dir) + UnregisterSignal(wearer, COMSIG_HUMAN_GET_VISIBLE_NAME) + wearer.cut_overlays() + wearer.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, damage_type = BRUTE) + DeactivateStealth() + +/obj/item/clothing/suit/armor/abductor/vest/IsReflect() + DeactivateStealth() + +/obj/item/clothing/suit/armor/abductor/vest/ui_action_click() + switch(mode) + if(VEST_COMBAT) + Adrenaline() + if(VEST_STEALTH) + if(stealth_active) + DeactivateStealth() + else + ActivateStealth() + +/obj/item/clothing/suit/armor/abductor/vest/proc/Adrenaline() + if(ishuman(loc)) + if(combat_cooldown < initial(combat_cooldown)) + to_chat(loc, span_warning("Combat injection is still recharging.")) + return + var/mob/living/carbon/human/wearer = loc + wearer.adjustStaminaLoss(-75) + wearer.SetUnconscious(0) + wearer.SetStun(0) + wearer.SetKnockdown(0) + wearer.SetImmobilized(0) + wearer.SetParalyzed(0) + combat_cooldown = 0 + START_PROCESSING(SSobj, src) + +/obj/item/clothing/suit/armor/abductor/vest/process(seconds_per_tick) + combat_cooldown += seconds_per_tick + if(combat_cooldown >= initial(combat_cooldown)) + STOP_PROCESSING(SSobj, src) + +/obj/item/clothing/suit/armor/abductor/Destroy() + STOP_PROCESSING(SSobj, src) + for(var/obj/machinery/abductor/console/mothership_console as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/abductor/console)) + if(mothership_console.vest == src) + mothership_console.vest = null + break + return ..() diff --git a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm new file mode 100644 index 0000000000000..f1213b47c434f --- /dev/null +++ b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm @@ -0,0 +1,739 @@ +/obj/item/abductor + icon = 'icons/obj/antags/abductor.dmi' + lefthand_file = 'icons/mob/inhands/antag/abductor_lefthand.dmi' + righthand_file = 'icons/mob/inhands/antag/abductor_righthand.dmi' + +/obj/item/proc/AbductorCheck(mob/user) + if (HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING)) + return TRUE + if (istype(user) && HAS_MIND_TRAIT(user, TRAIT_ABDUCTOR_TRAINING)) + return TRUE + to_chat(user, span_warning("You can't figure out how this works!")) + return FALSE + +/obj/item/abductor/proc/ScientistCheck(mob/user) + var/training = HAS_MIND_TRAIT(user, TRAIT_ABDUCTOR_TRAINING) + var/sci_training = HAS_MIND_TRAIT(user, TRAIT_ABDUCTOR_SCIENTIST_TRAINING) + + if(training && !sci_training) + to_chat(user, span_warning("You're not trained to use this!")) + . = FALSE + else if(!training && !sci_training) + to_chat(user, span_warning("You can't figure how this works!")) + . = FALSE + else + . = TRUE + +/obj/item/abductor/gizmo + name = "science tool" + desc = "A dual-mode tool for retrieving specimens and scanning appearances. Scanning can be done through cameras." + icon_state = "gizmo_scan" + inhand_icon_state = "silencer" + var/mode = GIZMO_SCAN + var/datum/weakref/marked_target_weakref + var/obj/machinery/abductor/console/console + +/obj/item/abductor/gizmo/attack_self(mob/user) + if(!ScientistCheck(user)) + return + if(!console) + to_chat(user, span_warning("The device is not linked to console!")) + return + + if(mode == GIZMO_SCAN) + mode = GIZMO_MARK + icon_state = "gizmo_mark" + else + mode = GIZMO_SCAN + icon_state = "gizmo_scan" + to_chat(user, span_notice("You switch the device to [mode == GIZMO_SCAN? "SCAN": "MARK"] MODE")) + +/obj/item/abductor/gizmo/attack(mob/living/target, mob/user) + if(!ScientistCheck(user)) + return + if(!console) + to_chat(user, span_warning("The device is not linked to console!")) + return + + switch(mode) + if(GIZMO_SCAN) + scan(target, user) + if(GIZMO_MARK) + mark(target, user) + + +/obj/item/abductor/gizmo/afterattack(atom/target, mob/living/user, flag, params) + . = ..() + if(flag) + return + if(!ScientistCheck(user)) + return . + if(!console) + to_chat(user, span_warning("The device is not linked to console!")) + return . + + switch(mode) + if(GIZMO_SCAN) + scan(target, user) + if(GIZMO_MARK) + mark(target, user) + + return . + +/obj/item/abductor/gizmo/proc/scan(atom/target, mob/living/user) + if(ishuman(target)) + console.AddSnapshot(target) + to_chat(user, span_notice("You scan [target] and add [target.p_them()] to the database.")) + +/obj/item/abductor/gizmo/proc/mark(atom/target, mob/living/user) + var/mob/living/marked = marked_target_weakref?.resolve() + if(marked == target) + to_chat(user, span_warning("This specimen is already marked!")) + return + if(isabductor(target) || iscow(target)) + marked_target_weakref = WEAKREF(target) + to_chat(user, span_notice("You mark [target] for future retrieval.")) + else + prepare(target,user) + +/obj/item/abductor/gizmo/proc/prepare(atom/target, mob/living/user) + if(get_dist(target,user)>1) + to_chat(user, span_warning("You need to be next to the specimen to prepare it for transport!")) + return + to_chat(user, span_notice("You begin preparing [target] for transport...")) + if(do_after(user, 100, target = target)) + marked_target_weakref = WEAKREF(target) + to_chat(user, span_notice("You finish preparing [target] for transport.")) + +/obj/item/abductor/gizmo/Destroy() + if(console) + console.gizmo = null + console = null + . = ..() + + +/obj/item/abductor/silencer + name = "abductor silencer" + desc = "A compact device used to shut down communications equipment." + icon_state = "silencer" + inhand_icon_state = "gizmo" + +/obj/item/abductor/silencer/attack(mob/living/target, mob/user) + if(!AbductorCheck(user)) + return + radio_off(target, user) + +/obj/item/abductor/silencer/afterattack(atom/target, mob/living/user, flag, params) + . = ..() + if(flag) + return + . |= AFTERATTACK_PROCESSED_ITEM + if(!AbductorCheck(user)) + return . + radio_off(target, user) + return . + +/obj/item/abductor/silencer/proc/radio_off(atom/target, mob/living/user) + if( !(user in (viewers(7,target))) ) + return + + var/turf/targloc = get_turf(target) + + var/mob/living/carbon/human/human_target + for(human_target in view(2,targloc)) + if(human_target == user) + continue + to_chat(user, span_notice("You silence [human_target]'s radio devices.")) + radio_off_mob(human_target) + +/obj/item/abductor/silencer/proc/radio_off_mob(mob/living/carbon/human/target) + var/list/all_items = target.get_all_contents() + + for(var/obj/item/radio/radio in all_items) + radio.set_listening(FALSE) + if(!istype(radio, /obj/item/radio/headset)) + radio.set_broadcasting(FALSE) //goddamned headset hacks + +/obj/item/abductor/mind_device + name = "mental interface device" + desc = "A dual-mode tool for directly communicating with sentient brains. It can be used to send a direct message to a target, \ + or to send a command to a test subject with a charged gland." + icon_state = "mind_device_message" + inhand_icon_state = "silencer" + var/mode = MIND_DEVICE_MESSAGE + +/obj/item/abductor/mind_device/attack_self(mob/user) + if(!ScientistCheck(user)) + return + + if(mode == MIND_DEVICE_MESSAGE) + mode = MIND_DEVICE_CONTROL + icon_state = "mind_device_control" + else + mode = MIND_DEVICE_MESSAGE + icon_state = "mind_device_message" + to_chat(user, span_notice("You switch the device to [mode == MIND_DEVICE_MESSAGE? "TRANSMISSION": "COMMAND"] MODE")) + +/obj/item/abductor/mind_device/afterattack(atom/target, mob/living/user, flag, params) + . = ..() + . |= AFTERATTACK_PROCESSED_ITEM + if(!ScientistCheck(user)) + return + + switch(mode) + if(MIND_DEVICE_CONTROL) + mind_control(target, user) + if(MIND_DEVICE_MESSAGE) + mind_message(target, user) + +/obj/item/abductor/mind_device/proc/mind_control(atom/target, mob/living/user) + if(iscarbon(target)) + var/mob/living/carbon/carbon_target = target + var/obj/item/organ/internal/heart/gland/target_gland = carbon_target.get_organ_slot("heart") + if(!istype(target_gland)) + to_chat(user, span_warning("Your target does not have an experimental gland!")) + return + if(!target_gland.mind_control_uses) + to_chat(user, span_warning("Your target's gland is spent!")) + return + if(target_gland.active_mind_control) + to_chat(user, span_warning("Your target is already under a mind-controlling influence!")) + return + + var/command = tgui_input_text(user, "Enter the command for your target to follow.\ + Uses Left: [target_gland.mind_control_uses], Duration: [DisplayTimeText(target_gland.mind_control_duration)]", "Enter command") + + if(!command) + return + + if(QDELETED(user) || user.get_active_held_item() != src || loc != user) + return + + if(QDELETED(target_gland)) + return + + if(carbon_target.can_block_magic(MAGIC_RESISTANCE_MIND, charge_cost = 0)) + user.balloon_alert(user, "foiled!") + to_chat(user, span_warning("Your target seems to have some sort of mental blockage, preventing the message from being sent! It seems you've been foiled.")) + return + + target_gland.mind_control(command, user) + to_chat(user, span_notice("You send the command to your target.")) + +/obj/item/abductor/mind_device/proc/mind_message(atom/target, mob/living/user) + if(isliving(target)) + var/mob/living/living_target = target + if(living_target.stat == DEAD) + to_chat(user, span_warning("Your target is dead!")) + return + var/message = tgui_input_text(user, "Message to send to your target's brain", "Enter message") + if(!message) + return + if(QDELETED(living_target) || living_target.stat == DEAD) + return + + living_target.balloon_alert(living_target, "you hear a voice") + to_chat(living_target, span_hear("You hear a voice in your head saying:
    [message]")) + to_chat(user, span_notice("You send the message to your target.")) + log_directed_talk(user, living_target, message, LOG_SAY, "abductor whisper") + + +/obj/item/firing_pin/abductor + name = "alien firing pin" + icon_state = "firing_pin_ayy" + desc = "This firing pin is slimy and warm; you can swear you feel it constantly trying to mentally probe you." + fail_message = "Firing error, please contact Command." + +/obj/item/firing_pin/abductor/pin_auth(mob/living/user) + . = isabductor(user) + +/obj/item/gun/energy/alien + name = "alien pistol" + desc = "A complicated gun that fires bursts of high-intensity radiation." + ammo_type = list(/obj/item/ammo_casing/energy/declone) + pin = /obj/item/firing_pin/abductor + icon_state = "alienpistol" + inhand_icon_state = "alienpistol" + trigger_guard = TRIGGER_GUARD_ALLOW_ALL + +/obj/item/gun/energy/shrink_ray + name = "shrink ray blaster" + desc = "This is a piece of frightening alien tech that enhances the magnetic pull of atoms in a localized space to temporarily make an object shrink. \ + That or it's just space magic. Either way, it shrinks stuff." + ammo_type = list(/obj/item/ammo_casing/energy/shrink) + pin = /obj/item/firing_pin/abductor + inhand_icon_state = "shrink_ray" + icon_state = "shrink_ray" + automatic_charge_overlays = FALSE + fire_delay = 30 + selfcharge = 1//shot costs 200 energy, has a max capacity of 1000 for 5 shots. self charge returns 25 energy every couple ticks, so about 1 shot charged every 12~ seconds + trigger_guard = TRIGGER_GUARD_ALLOW_ALL// variable-size trigger, get it? (abductors need this to be set so the gun is usable for them) + +/obj/item/paper/guides/antag/abductor + name = "Dissection Guide" + icon_state = "alienpaper_words" + show_written_words = FALSE + default_raw_text = {"Dissection for Dummies
    + +
    +1.Acquire fresh specimen.
    +2.Put the specimen on operating table.
    +3.Apply surgical drapes, preparing for experimental dissection.
    +4.Apply scalpel to specimen's torso.
    +5.Clamp bleeders on specimen's torso with a hemostat.
    +6.Retract skin of specimen's torso with a retractor.
    +7.Apply scalpel again to specimen's torso.
    +8.Search through the specimen's torso with your hands to remove any superfluous organs.
    +9.Insert replacement gland (Retrieve one from gland storage).
    +10.Consider dressing the specimen back to not disturb the habitat.
    +11.Put the specimen in the experiment machinery.
    +12.Choose one of the machine options. The target will be analyzed and teleported to the selected drop-off point.
    +13.You will receive one supply credit, and the subject will be counted towards your quota.
    +
    +Congratulations! You are now trained for invasive xenobiology research!"} + +/obj/item/paper/guides/antag/abductor/AltClick() + return //otherwise it would fold into a paperplane. + +/obj/item/melee/baton/abductor + name = "advanced baton" + desc = "A quad-mode baton used for incapacitation and restraining of specimens." + + icon = 'icons/obj/antags/abductor.dmi' + lefthand_file = 'icons/mob/inhands/antag/abductor_lefthand.dmi' + righthand_file = 'icons/mob/inhands/antag/abductor_righthand.dmi' + icon_state = "wonderprodStun" + inhand_icon_state = "wonderprod" + + force = 7 + wound_bonus = FALSE + + actions_types = list(/datum/action/item_action/toggle_mode) + + cooldown = 0 SECONDS + stamina_damage = 0 + knockdown_time = 14 SECONDS + on_stun_sound = 'sound/weapons/egloves.ogg' + affect_cyborg = TRUE + + var/mode = BATON_STUN + + var/sleep_time = 2 MINUTES + var/time_to_cuff = 3 SECONDS + +/obj/item/melee/baton/abductor/Initialize(mapload) + . = ..() + AddElement(/datum/element/update_icon_updates_onmob) + +/obj/item/melee/baton/abductor/proc/toggle(mob/living/user=usr) + if(!AbductorCheck(user)) + return + mode = (mode+1)%BATON_MODES + var/txt + switch(mode) + if(BATON_STUN) + txt = "stunning" + if(BATON_SLEEP) + txt = "sleep inducement" + if(BATON_CUFF) + txt = "restraining" + if(BATON_PROBE) + txt = "probing" + + var/is_stun_mode = mode == BATON_STUN + var/is_stun_or_sleep = mode == BATON_STUN || mode == BATON_SLEEP + + affect_cyborg = is_stun_mode + log_stun_attack = is_stun_mode // other modes have their own log entries. + stun_animation = is_stun_or_sleep + on_stun_sound = is_stun_or_sleep ? 'sound/weapons/egloves.ogg' : null + + to_chat(usr, span_notice("You switch the baton to [txt] mode.")) + update_appearance() + +/obj/item/melee/baton/abductor/update_icon_state() + . = ..() + switch(mode) + if(BATON_STUN) + icon_state = "wonderprodStun" + inhand_icon_state = "wonderprodStun" + if(BATON_SLEEP) + icon_state = "wonderprodSleep" + inhand_icon_state = "wonderprodSleep" + if(BATON_CUFF) + icon_state = "wonderprodCuff" + inhand_icon_state = "wonderprodCuff" + if(BATON_PROBE) + icon_state = "wonderprodProbe" + inhand_icon_state = "wonderprodProbe" + +/obj/item/melee/baton/abductor/baton_attack(mob/target, mob/living/user, modifiers) + if(!AbductorCheck(user)) + return BATON_ATTACK_DONE + return ..() + +/obj/item/melee/baton/abductor/baton_effect(mob/living/target, mob/living/user, modifiers, stun_override) + switch (mode) + if(BATON_STUN) + target.visible_message(span_danger("[user] stuns [target] with [src]!"), + span_userdanger("[user] stuns you with [src]!")) + target.set_jitter_if_lower(40 SECONDS) + target.set_confusion_if_lower(10 SECONDS) + target.set_stutter_if_lower(16 SECONDS) + SEND_SIGNAL(target, COMSIG_LIVING_MINOR_SHOCK) + target.Paralyze(knockdown_time * (HAS_TRAIT(target, TRAIT_BATON_RESISTANCE) ? 0.1 : 1)) + if(BATON_SLEEP) + SleepAttack(target,user) + if(BATON_CUFF) + CuffAttack(target,user) + if(BATON_PROBE) + ProbeAttack(target,user) + +/obj/item/melee/baton/abductor/get_stun_description(mob/living/target, mob/living/user) + return // chat messages are handled in their own procs. + +/obj/item/melee/baton/abductor/get_cyborg_stun_description(mob/living/target, mob/living/user) + return // same as above. + +/obj/item/melee/baton/abductor/attack_self(mob/living/user) + . = ..() + toggle(user) + +/obj/item/melee/baton/abductor/proc/SleepAttack(mob/living/target, mob/living/user) + playsound(src, on_stun_sound, 50, TRUE, -1) + if(target.incapacitated(IGNORE_RESTRAINTS|IGNORE_GRAB)) + if(target.can_block_magic(MAGIC_RESISTANCE_MIND)) + to_chat(user, span_warning("The specimen has some kind of mental protection that is interfering with the sleep inducement! It seems you've been foiled.")) + target.visible_message(span_danger("[user] tried to induced sleep in [target] with [src], but is unsuccessful!"), \ + span_userdanger("You feel a strange wave of heavy drowsiness wash over you!")) + target.adjust_drowsiness(4 SECONDS) + return + target.visible_message(span_danger("[user] induces sleep in [target] with [src]!"), \ + span_userdanger("You suddenly feel very drowsy!")) + target.Sleeping(sleep_time) + log_combat(user, target, "put to sleep") + else + if(target.can_block_magic(MAGIC_RESISTANCE_MIND, charge_cost = 0)) + to_chat(user, span_warning("The specimen has some kind of mental protection that is completely blocking our sleep inducement methods! It seems you've been foiled.")) + target.visible_message(span_danger("[user] tried to induce sleep in [target] with [src], but is unsuccessful!"), \ + span_userdanger("Any sense of drowsiness is quickly diminished!")) + return + target.adjust_drowsiness(2 SECONDS) + to_chat(user, span_warning("Sleep inducement works fully only on stunned specimens! ")) + target.visible_message(span_danger("[user] tried to induce sleep in [target] with [src]!"), \ + span_userdanger("You suddenly feel drowsy!")) + +/obj/item/melee/baton/abductor/proc/CuffAttack(mob/living/victim, mob/living/user) + if(!iscarbon(victim)) + return + var/mob/living/carbon/carbon_victim = victim + if(!carbon_victim.handcuffed) + if(carbon_victim.canBeHandcuffed()) + playsound(src, 'sound/weapons/cablecuff.ogg', 30, TRUE, -2) + carbon_victim.visible_message(span_danger("[user] begins restraining [carbon_victim] with [src]!"), \ + span_userdanger("[user] begins shaping an energy field around your hands!")) + if(do_after(user, time_to_cuff, carbon_victim) && carbon_victim.canBeHandcuffed()) + if(!carbon_victim.handcuffed) + carbon_victim.set_handcuffed(new /obj/item/restraints/handcuffs/energy/used(carbon_victim)) + carbon_victim.update_handcuffed() + to_chat(user, span_notice("You restrain [carbon_victim].")) + log_combat(user, carbon_victim, "handcuffed") + else + to_chat(user, span_warning("You fail to restrain [carbon_victim].")) + else + to_chat(user, span_warning("[carbon_victim] doesn't have two hands...")) + +/obj/item/melee/baton/abductor/proc/ProbeAttack(mob/living/victim, mob/living/user) + victim.visible_message(span_danger("[user] probes [victim] with [src]!"), \ + span_userdanger("[user] probes you!")) + + var/species = span_warning("Unknown species") + var/helptext = span_warning("Species unsuitable for experiments.") + + if(ishuman(victim)) + var/mob/living/carbon/human/human_victim = victim + species = span_notice("[human_victim.dna.species.name]") + if(human_victim.mind && human_victim.mind.has_antag_datum(/datum/antagonist/changeling)) + species = span_warning("Changeling lifeform") + var/obj/item/organ/internal/heart/gland/temp = locate() in human_victim.organs + if(temp) + helptext = span_warning("Experimental gland detected!") + else + if (human_victim.get_organ_slot(ORGAN_SLOT_HEART)) + helptext = span_notice("Subject suitable for experiments.") + else + helptext = span_warning("Subject unsuitable for experiments.") + + to_chat(user, "[span_notice("Probing result:")][species]") + to_chat(user, "[helptext]") + +/obj/item/restraints/handcuffs/energy + name = "hard-light energy field" + desc = "A hard-light field restraining the hands." + icon_state = "cuff" // Needs sprite + lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' + breakouttime = 45 SECONDS + trashtype = /obj/item/restraints/handcuffs/energy/used + flags_1 = NONE + +/obj/item/restraints/handcuffs/energy/used + item_flags = DROPDEL + +/obj/item/restraints/handcuffs/energy/used/dropped(mob/user) + user.visible_message(span_danger("[user]'s [name] breaks in a discharge of energy!"), \ + span_userdanger("[user]'s [name] breaks in a discharge of energy!")) + var/datum/effect_system/spark_spread/sparks = new + sparks.set_up(4,0,user.loc) + sparks.start() + . = ..() + +/obj/item/melee/baton/abductor/examine(mob/user) + . = ..() + if(AbductorCheck(user)) + switch(mode) + if(BATON_STUN) + . += span_warning("The baton is in stun mode.") + if(BATON_SLEEP) + . += span_warning("The baton is in sleep inducement mode.") + if(BATON_CUFF) + . += span_warning("The baton is in restraining mode.") + if(BATON_PROBE) + . += span_warning("The baton is in probing mode.") + +/obj/item/radio/headset/abductor + name = "alien headset" + desc = "An advanced alien headset designed to monitor communications of human space stations. Why does it have a microphone? No one knows." + icon = 'icons/obj/antags/abductor.dmi' + icon_state = "abductor_headset" + keyslot2 = /obj/item/encryptionkey/heads/captain + +/obj/item/radio/headset/abductor/Initialize(mapload) + . = ..() + AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) + make_syndie() + +// Stops humans from disassembling abductor headsets. +/obj/item/radio/headset/abductor/screwdriver_act(mob/living/user, obj/item/tool) + return TOOL_ACT_TOOLTYPE_SUCCESS + +/obj/item/abductor_machine_beacon + name = "machine beacon" + desc = "A beacon designed to instantly tele-construct abductor machinery." + icon = 'icons/obj/antags/abductor.dmi' + icon_state = "beacon" + w_class = WEIGHT_CLASS_TINY + var/obj/machinery/spawned_machine + +/obj/item/abductor_machine_beacon/attack_self(mob/user) + ..() + user.visible_message(span_notice("[user] places down [src] and activates it."), span_notice("You place down [src] and activate it.")) + user.dropItemToGround(src) + playsound(src, 'sound/machines/terminal_alert.ogg', 50) + addtimer(CALLBACK(src, PROC_REF(try_spawn_machine)), 30) + +/obj/item/abductor_machine_beacon/proc/try_spawn_machine() + var/viable = FALSE + if(isfloorturf(loc)) + var/turf/T = loc + viable = TRUE + for(var/obj/thing in T.contents) + if(thing.density || ismachinery(thing) || isstructure(thing)) + viable = FALSE + if(viable) + playsound(src, 'sound/effects/phasein.ogg', 50, TRUE) + var/new_machine = new spawned_machine(loc) + visible_message(span_notice("[new_machine] warps on top of the beacon!")) + qdel(src) + else + playsound(src, 'sound/machines/buzz-two.ogg', 50) + +/obj/item/abductor_machine_beacon/chem_dispenser + name = "beacon - Reagent Synthesizer" + spawned_machine = /obj/machinery/chem_dispenser/abductor + +/obj/item/scalpel/alien + name = "alien scalpel" + desc = "It's a gleaming sharp knife made out of silvery-green metal." + icon = 'icons/obj/antags/abductor.dmi' + surgical_tray_overlay = "scalpel_alien" + toolspeed = 0.25 + +/obj/item/hemostat/alien + name = "alien hemostat" + desc = "You've never seen this before." + icon = 'icons/obj/antags/abductor.dmi' + surgical_tray_overlay = "hemostat_alien" + toolspeed = 0.25 + +/obj/item/retractor/alien + name = "alien retractor" + desc = "You're not sure if you want the veil pulled back." + icon = 'icons/obj/antags/abductor.dmi' + surgical_tray_overlay = "retractor_alien" + toolspeed = 0.25 + +/obj/item/circular_saw/alien + name = "alien saw" + desc = "Do the aliens also lose this, and need to find an alien hatchet?" + icon = 'icons/obj/antags/abductor.dmi' + surgical_tray_overlay = "saw_alien" + toolspeed = 0.25 + +/obj/item/surgicaldrill/alien + name = "alien drill" + desc = "Maybe alien surgeons have finally found a use for the drill." + icon = 'icons/obj/antags/abductor.dmi' + surgical_tray_overlay = "drill_alien" + toolspeed = 0.25 + +/obj/item/cautery/alien + name = "alien cautery" + desc = "Why would bloodless aliens have a tool to stop bleeding? \ + Unless..." + icon = 'icons/obj/antags/abductor.dmi' + surgical_tray_overlay = "cautery_alien" + toolspeed = 0.25 + +/obj/item/clothing/head/helmet/abductor + name = "agent headgear" + desc = "Abduct with style - spiky style. Prevents digital tracking." + icon_state = "alienhelmet" + inhand_icon_state = null + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT + +/obj/item/clothing/head/helmet/abductor/equipped(mob/living/user, slot) + . = ..() + if(slot_flags & slot) + RegisterSignal(user, COMSIG_LIVING_CAN_TRACK, PROC_REF(can_track)) + else + UnregisterSignal(user, COMSIG_LIVING_CAN_TRACK) + +/obj/item/clothing/head/helmet/abductor/dropped(mob/living/user) + . = ..() + UnregisterSignal(user, COMSIG_LIVING_CAN_TRACK) + +/obj/item/clothing/head/helmet/abductor/proc/can_track(datum/source, mob/user) + SIGNAL_HANDLER + + return COMPONENT_CANT_TRACK + +/obj/item/abductor/alien_omnitool + name = "quizzandric interfacer" + desc = "Effectively just a Space Swiss Army Knife. Contains a multitude of integrated tools. Right-click it to switch which toolset is active." + icon_state = "omnitool" + inhand_icon_state = "silencer" + toolspeed = 0.25 + tool_behaviour = null + usesound = 'sound/items/pshoom.ogg' + ///A list of all the tools we offer. Stored as "Tool" for the key, and the icon/icon_state as the value. + var/list/tool_list = list() + ///Which toolset do we have active currently? + var/active_toolset = TOOLSET_MEDICAL + +/obj/item/abductor/alien_omnitool/get_all_tool_behaviours() + return list( + TOOL_BLOODFILTER, + TOOL_BONESET, + TOOL_CAUTERY, + TOOL_CROWBAR, + TOOL_DRILL, + TOOL_HEMOSTAT, + TOOL_MULTITOOL, + TOOL_RETRACTOR, + TOOL_SAW, + TOOL_SCALPEL, + TOOL_SCREWDRIVER, + TOOL_WELDER, + TOOL_WIRECUTTER, + TOOL_WRENCH, + ) + +/obj/item/abductor/alien_omnitool/Initialize(mapload) + . = ..() + set_toolset() //This populates the tool list, and sets it to the hacking configuration. + +/obj/item/abductor/alien_omnitool/examine() + . = ..() + . += " The mode is: [tool_behaviour]" + +/obj/item/abductor/alien_omnitool/attack_self(mob/user) + if(!user) + return + + var/tool_result = show_radial_menu(user, src, tool_list, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE) + if(!check_menu(user)) + return + switch(tool_result) + if("Retractor") + tool_behaviour = TOOL_RETRACTOR + if("Hemostat") + tool_behaviour = TOOL_HEMOSTAT + if("Cautery") + tool_behaviour = TOOL_CAUTERY + if("Drill") + tool_behaviour = TOOL_DRILL + if("Scalpel") + tool_behaviour = TOOL_SCALPEL + if("Saw") + tool_behaviour = TOOL_SAW + if("Bonesetter") + tool_behaviour = TOOL_BONESET + if("Blood Filter") + tool_behaviour = TOOL_BLOODFILTER + if("Crowbar") + tool_behaviour = TOOL_CROWBAR + if("Multitool") + tool_behaviour = TOOL_MULTITOOL + if("Screwdriver") + tool_behaviour = TOOL_SCREWDRIVER + if("Wirecutters") + tool_behaviour = TOOL_WIRECUTTER + if("Wrench") + tool_behaviour = TOOL_WRENCH + if("Welding Tool") + tool_behaviour = TOOL_WELDER + + playsound(loc, 'sound/machines/click.ogg', 50, TRUE) + +/obj/item/abductor/alien_omnitool/attack_self_secondary(mob/user, modifiers) //ADD SFX FOR USING THE TOOL + if(!user) + return + + set_toolset(user) + playsound(loc, 'sound/machines/click.ogg', 50, TRUE) + +/obj/item/abductor/alien_omnitool/proc/check_menu(mob/user) + if(!istype(user)) + return FALSE + if(user.incapacitated() || !user.Adjacent(src)) + return FALSE + return TRUE + +/obj/item/abductor/alien_omnitool/proc/set_toolset(mob/user) + if(active_toolset == TOOLSET_MEDICAL) + tool_list = list( + "Crowbar" = image(icon = 'icons/obj/antags/abductor.dmi', icon_state = "crowbar"), + "Multitool" = image(icon = 'icons/obj/antags/abductor.dmi', icon_state = "multitool"), + "Screwdriver" = image(icon = 'icons/obj/antags/abductor.dmi', icon_state = "screwdriver_a"), + "Wirecutters" = image(icon = 'icons/obj/antags/abductor.dmi', icon_state = "cutters"), + "Wrench" = image(icon = 'icons/obj/antags/abductor.dmi', icon_state = "wrench"), + "Welding Tool" = image(icon = 'icons/obj/antags/abductor.dmi', icon_state = "welder"), + ) + active_toolset = TOOLSET_HACKING + if(user) + balloon_alert(user, "hacking toolset selected") + else + tool_list = list( + "Retractor" = image(icon = 'icons/obj/antags/abductor.dmi', icon_state = "retractor"), + "Hemostat" = image(icon = 'icons/obj/antags/abductor.dmi', icon_state = "hemostat"), + "Cautery" = image(icon = 'icons/obj/antags/abductor.dmi', icon_state = "cautery"), + "Drill" = image(icon = 'icons/obj/antags/abductor.dmi', icon_state = "drill"), + "Scalpel" = image(icon = 'icons/obj/antags/abductor.dmi', icon_state = "scalpel"), + "Saw" = image(icon = 'icons/obj/antags/abductor.dmi', icon_state = "saw"), + "Bonesetter" = image(icon = 'icons/obj/medical/surgery_tools.dmi', icon_state = "bonesetter"), + "Blood Filter" = image(icon = 'icons/obj/medical/surgery_tools.dmi', icon_state = "bloodfilter"), + ) + active_toolset = TOOLSET_MEDICAL + if(user) + balloon_alert(user, "medical toolset selected") diff --git a/code/modules/antagonists/abductor/equipment/gear/abductor_posters.dm b/code/modules/antagonists/abductor/equipment/gear/abductor_posters.dm new file mode 100644 index 0000000000000..2938e5f4fd2f0 --- /dev/null +++ b/code/modules/antagonists/abductor/equipment/gear/abductor_posters.dm @@ -0,0 +1,82 @@ + +/obj/item/poster/random_abductor + name = "random abductor poster" + poster_type = /obj/structure/sign/poster/abductor/random + icon = 'icons/obj/poster.dmi' + icon_state = "rolled_abductor" + +/obj/structure/sign/poster/abductor + icon = 'icons/obj/poster.dmi' + poster_item_name = "abductor poster" + poster_item_desc = "A sheet of holofiber resin, with a nanospike perforation on the back end for maximum adhesion." + poster_item_icon_state = "rolled_abductor" + +/obj/structure/sign/poster/abductor/tear_poster(mob/user) + if(!isabductor(user)) + balloon_alert(user, "it won't budge!") + return + return ..() + +/obj/structure/sign/poster/abductor/random + name = "random abductor poster" + icon_state = "random_abductor" + never_random = TRUE + random_basetype = /obj/structure/sign/poster/abductor + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/abductor/random, 32) + +/obj/structure/sign/poster/abductor/ayylian + name = "Ayylian" + desc = "Man, Ian sure is looking strange these days." + icon_state = "ayylian" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/abductor/ayylian, 32) + +/obj/structure/sign/poster/abductor/ayy + name = "Abductor" + desc = "Hey, that's not a lizard!" + icon_state = "ayy" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/abductor/ayy, 32) + +/obj/structure/sign/poster/abductor/ayy_over_tizira + name = "Abductors Over Tizira" + desc = "A poster for an experimental adaptation of a movie about the Human-Lizard war. Production was greatly hindered by the leading pair's refusal to speak any lines." + icon_state = "ayy_over_tizira" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/abductor/ayy_over_tizira, 32) + +/obj/structure/sign/poster/abductor/ayy_recruitment + name = "Abductor Recruitment" + desc = "Enlist in the Mothership Probing Division today!" + icon_state = "ayy_recruitment" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/abductor/ayy_recruitment, 32) + +/obj/structure/sign/poster/abductor/ayy_cops + name = "Abductor Cops" + desc = "A poster advertising the polarizing 'Abductor Cops' series. Some critics claimed that it stunned them, while others said it put them to sleep." + icon_state = "ayyce_cops" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/abductor/ayy_cops, 32) + +/obj/structure/sign/poster/abductor/ayy_no + name = "Uayy No" + desc = "This thing is all in Japanese, AND they got rid of the anime girl on the poster. Outrageous." + icon_state = "ayy_no" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/abductor/ayy_no, 32) + +/obj/structure/sign/poster/abductor/ayy_piping + name = "Safety Abductor - Piping" + desc = "Safety Abductor has nothing to say. Not because it cannot speak, but because Abductors don't have to deal with atmos stuff." + icon_state = "ayy_piping" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/abductor/ayy_piping, 32) + +/obj/structure/sign/poster/abductor/ayy_fancy + name = "Abductor Fancy" + desc = "Abductors are the best at doing everything. That includes looking good!" + icon_state = "ayy_fancy" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/abductor/ayy_fancy, 32) diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm index 056e72fc1a052..c1dcf68b9dfa7 100644 --- a/code/modules/antagonists/abductor/equipment/gland.dm +++ b/code/modules/antagonists/abductor/equipment/gland.dm @@ -1,10 +1,9 @@ /obj/item/organ/internal/heart/gland name = "fleshy mass" desc = "A nausea-inducing hunk of twisting flesh and metal." - icon = 'icons/obj/abductor.dmi' + icon = 'icons/obj/antags/abductor.dmi' icon_state = "gland" - status = ORGAN_ROBOTIC - organ_flags = NONE + organ_flags = ORGAN_ROBOTIC // weird? beating = TRUE /// 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" @@ -30,7 +29,7 @@ /obj/item/organ/internal/heart/gland/examine(mob/user) . = ..() - if((user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_SCIENTIST_TRAINING)) || isobserver(user)) + if(HAS_MIND_TRAIT(user, TRAIT_ABDUCTOR_SCIENTIST_TRAINING) || isobserver(user)) . += span_notice("It is \a [abductor_hint]") /obj/item/organ/internal/heart/gland/proc/ownerCheck() diff --git a/code/modules/antagonists/abductor/equipment/glands/chem.dm b/code/modules/antagonists/abductor/equipment/glands/chem.dm index 47868841c8504..965d8f2fc201a 100644 --- a/code/modules/antagonists/abductor/equipment/glands/chem.dm +++ b/code/modules/antagonists/abductor/equipment/glands/chem.dm @@ -16,5 +16,5 @@ /obj/item/organ/internal/heart/gland/chem/activate() var/chem_to_add = pick(possible_reagents) owner.reagents.add_reagent(chem_to_add, 2) - owner.adjustToxLoss(-5, TRUE, TRUE) + owner.adjustToxLoss(-5, forced = TRUE) ..() diff --git a/code/modules/antagonists/abductor/equipment/glands/electric.dm b/code/modules/antagonists/abductor/equipment/glands/electric.dm index acb1505a71c62..9c4d47dc337ab 100644 --- a/code/modules/antagonists/abductor/equipment/glands/electric.dm +++ b/code/modules/antagonists/abductor/equipment/glands/electric.dm @@ -22,5 +22,5 @@ addtimer(CALLBACK(src, PROC_REF(zap)), rand(30, 100)) /obj/item/organ/internal/heart/gland/electric/proc/zap() - tesla_zap(owner, 4, 8000, ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN) + tesla_zap(owner, 4, 3.2e6, ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN) playsound(get_turf(owner), 'sound/magic/lightningshock.ogg', 50, TRUE) diff --git a/code/modules/antagonists/abductor/equipment/glands/heal.dm b/code/modules/antagonists/abductor/equipment/glands/heal.dm index 79268cdf5caa0..683cb33fc9adb 100644 --- a/code/modules/antagonists/abductor/equipment/glands/heal.dm +++ b/code/modules/antagonists/abductor/equipment/glands/heal.dm @@ -1,3 +1,5 @@ +#define REJECTION_VOMIT_FLAGS (MOB_VOMIT_BLOOD | MOB_VOMIT_STUN | MOB_VOMIT_KNOCKDOWN | MOB_VOMIT_FORCE) + /obj/item/organ/internal/heart/gland/heal abductor_hint = "organic replicator. Forcibly ejects damaged and robotic organs from the abductee and regenerates them. Additionally, forcibly removes reagents (via vomit) from the abductee if they have moderate toxin damage or poison within the bloodstream, and regenerates blood to a healthy threshold if too low. The abductee will also reject implants such as mindshields." cooldown_low = 200 @@ -22,27 +24,27 @@ return var/obj/item/organ/internal/appendix/appendix = owner.get_organ_slot(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_FAILING) || IS_ROBOTIC_ORGAN(appendix)))) replace_appendix(appendix) return var/obj/item/organ/internal/liver/liver = owner.get_organ_slot(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_LIVERLESS_METABOLISM)) || (liver && ((liver.damage > liver.high_threshold) || IS_ROBOTIC_ORGAN(liver)))) replace_liver(liver) return var/obj/item/organ/internal/lungs/lungs = owner.get_organ_slot(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) || IS_ROBOTIC_ORGAN(lungs)))) replace_lungs(lungs) return var/obj/item/organ/internal/stomach/stomach = owner.get_organ_slot(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) || IS_ROBOTIC_ORGAN(stomach)))) replace_stomach(stomach) return var/obj/item/organ/internal/eyes/eyes = owner.get_organ_slot(ORGAN_SLOT_EYES) - if(!eyes || (eyes && ((eyes.damage > eyes.low_threshold) || (eyes.organ_flags & ORGAN_SYNTHETIC)))) + if(!eyes || (eyes && ((eyes.damage > eyes.low_threshold) || IS_ROBOTIC_ORGAN(eyes)))) replace_eyes(eyes) return @@ -78,19 +80,19 @@ /obj/item/organ/internal/heart/gland/heal/proc/reject_implant(obj/item/implant/implant) owner.visible_message(span_warning("[owner] vomits up a tiny mangled implant!"), span_userdanger("You suddenly vomit up a tiny mangled implant!")) - owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE) + owner.vomit(REJECTION_VOMIT_FLAGS, lost_nutrition = 0) implant.removed(owner) qdel(implant) /obj/item/organ/internal/heart/gland/heal/proc/reject_cyberimp(obj/item/organ/internal/cyberimp/implant) owner.visible_message(span_warning("[owner] vomits up his [implant.name]!"), span_userdanger("You suddenly vomit up your [implant.name]!")) - owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE) + owner.vomit(REJECTION_VOMIT_FLAGS, lost_nutrition = 0) implant.Remove(owner) implant.forceMove(owner.drop_location()) /obj/item/organ/internal/heart/gland/heal/proc/replace_appendix(obj/item/organ/internal/appendix/appendix) if(appendix) - owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE) + owner.vomit(REJECTION_VOMIT_FLAGS, lost_nutrition = 0) appendix.Remove(owner) appendix.forceMove(owner.drop_location()) owner.visible_message(span_warning("[owner] vomits up his [appendix.name]!"), span_userdanger("You suddenly vomit up your [appendix.name]!")) @@ -106,7 +108,7 @@ /obj/item/organ/internal/heart/gland/heal/proc/replace_liver(obj/item/organ/internal/liver/liver) if(liver) owner.visible_message(span_warning("[owner] vomits up his [liver.name]!"), span_userdanger("You suddenly vomit up your [liver.name]!")) - owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE) + owner.vomit(REJECTION_VOMIT_FLAGS, lost_nutrition = 0) liver.Remove(owner) liver.forceMove(owner.drop_location()) else @@ -121,7 +123,7 @@ /obj/item/organ/internal/heart/gland/heal/proc/replace_lungs(obj/item/organ/internal/lungs/lungs) if(lungs) owner.visible_message(span_warning("[owner] vomits up his [lungs.name]!"), span_userdanger("You suddenly vomit up your [lungs.name]!")) - owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE) + owner.vomit(REJECTION_VOMIT_FLAGS, lost_nutrition = 0) lungs.Remove(owner) lungs.forceMove(owner.drop_location()) else @@ -136,7 +138,7 @@ /obj/item/organ/internal/heart/gland/heal/proc/replace_stomach(obj/item/organ/internal/stomach/stomach) if(stomach) owner.visible_message(span_warning("[owner] vomits up his [stomach.name]!"), span_userdanger("You suddenly vomit up your [stomach.name]!")) - owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE) + owner.vomit(REJECTION_VOMIT_FLAGS, lost_nutrition = 0) stomach.Remove(owner) stomach.forceMove(owner.drop_location()) else @@ -190,9 +192,9 @@ /obj/item/organ/internal/heart/gland/heal/proc/keep_replacing_blood() var/keep_going = FALSE - owner.vomit(0, TRUE, FALSE, 3, FALSE, FALSE, FALSE, TRUE) + owner.vomit(vomit_flags = (MOB_VOMIT_BLOOD | MOB_VOMIT_FORCE), lost_nutrition = 0, distance = 3) owner.Stun(15) - owner.adjustToxLoss(-15, TRUE, TRUE) + owner.adjustToxLoss(-15, forced = TRUE) owner.blood_volume = min(BLOOD_VOLUME_NORMAL, owner.blood_volume + 20) if(owner.blood_volume < BLOOD_VOLUME_NORMAL) @@ -226,3 +228,5 @@ var/obj/item/bodypart/chest/new_chest = new(null) new_chest.replace_limb(owner, TRUE) qdel(chest) + +#undef REJECTION_VOMIT_FLAGS diff --git a/code/modules/antagonists/abductor/equipment/glands/plasma.dm b/code/modules/antagonists/abductor/equipment/glands/plasma.dm index c167dd8a3291e..0d709579cc8c5 100644 --- a/code/modules/antagonists/abductor/equipment/glands/plasma.dm +++ b/code/modules/antagonists/abductor/equipment/glands/plasma.dm @@ -19,4 +19,4 @@ var/turf/open/T = get_turf(owner) if(istype(T)) T.atmos_spawn_air("[GAS_PLASMA]=50;[TURF_TEMPERATURE(T20C)]") - owner.vomit() + owner.vomit(VOMIT_CATEGORY_DEFAULT) diff --git a/code/modules/antagonists/abductor/equipment/glands/slime.dm b/code/modules/antagonists/abductor/equipment/glands/slime.dm index 50e83ee373594..faebce9fc874f 100644 --- a/code/modules/antagonists/abductor/equipment/glands/slime.dm +++ b/code/modules/antagonists/abductor/equipment/glands/slime.dm @@ -10,16 +10,16 @@ /obj/item/organ/internal/heart/gland/slime/on_insert(mob/living/carbon/gland_owner) . = ..() gland_owner.faction |= FACTION_SLIME - gland_owner.grant_language(/datum/language/slime, TRUE, TRUE, LANGUAGE_GLAND) + gland_owner.grant_language(/datum/language/slime, source = LANGUAGE_GLAND) /obj/item/organ/internal/heart/gland/slime/on_remove(mob/living/carbon/gland_owner) . = ..() gland_owner.faction -= FACTION_SLIME - gland_owner.remove_language(/datum/language/slime, TRUE, TRUE, LANGUAGE_GLAND) + gland_owner.remove_language(/datum/language/slime, source = LANGUAGE_GLAND) /obj/item/organ/internal/heart/gland/slime/activate() to_chat(owner, span_warning("You feel nauseated!")) - owner.vomit(20) + owner.vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = 20) var/mob/living/simple_animal/slime/Slime = new(get_turf(owner), "grey") Slime.set_friends(list(owner)) diff --git a/code/modules/antagonists/abductor/equipment/glands/spider.dm b/code/modules/antagonists/abductor/equipment/glands/spider.dm index 52fe9a826b0ce..52ff520a876ad 100644 --- a/code/modules/antagonists/abductor/equipment/glands/spider.dm +++ b/code/modules/antagonists/abductor/equipment/glands/spider.dm @@ -10,5 +10,5 @@ /obj/item/organ/internal/heart/gland/spiderman/activate() to_chat(owner, span_warning("You feel something crawling in your skin.")) owner.faction |= FACTION_SPIDER - var/mob/living/basic/spiderling/S = new(owner.drop_location()) - S.directive = "Protect your nest inside [owner.real_name]." + var/mob/living/basic/spider/growing/spiderling/spider = new(owner.drop_location()) + spider.directive = "Protect your nest inside [owner.real_name]." diff --git a/code/modules/antagonists/abductor/equipment/orderable_gear.dm b/code/modules/antagonists/abductor/equipment/orderable_gear.dm index 4d0562ca35bd5..b133bf3f8a5ec 100644 --- a/code/modules/antagonists/abductor/equipment/orderable_gear.dm +++ b/code/modules/antagonists/abductor/equipment/orderable_gear.dm @@ -1,5 +1,9 @@ GLOBAL_LIST_INIT(abductor_gear, subtypesof(/datum/abductor_gear)) +#define CATEGORY_BASIC_GEAR "Basic Gear" +#define CATEGORY_ADVANCED_GEAR "Advanced Gear" +#define CATEGORY_MISC_GEAR "Miscellaneous Gear" + /datum/abductor_gear /// Name of the gear var/name = "Generic Abductor Gear" @@ -12,45 +16,45 @@ GLOBAL_LIST_INIT(abductor_gear, subtypesof(/datum/abductor_gear)) /// Build path of the gear itself var/build_path = null /// Category of the gear - var/category = "Basic Gear" + var/category = CATEGORY_BASIC_GEAR /datum/abductor_gear/agent_helmet name = "Agent Helmet" description = "Abduct with style - spiky style. Prevents digital tracking." id = "agent_helmet" - build_path = /obj/item/clothing/head/helmet/abductor + build_path = list(/obj/item/clothing/head/helmet/abductor = 1) /datum/abductor_gear/agent_vest name = "Agent Vest" description = "A vest outfitted with advanced stealth technology. It has two modes - combat and stealth." id = "agent_vest" - build_path = /obj/item/clothing/suit/armor/abductor/vest + build_path = list(/obj/item/clothing/suit/armor/abductor/vest = 1) /datum/abductor_gear/radio_silencer name = "Radio Silencer" description = "A compact device used to shut down communications equipment." id = "radio_silencer" - build_path = /obj/item/abductor/silencer + build_path = list(/obj/item/abductor/silencer = 1) /datum/abductor_gear/science_tool name = "Science Tool" description = "A dual-mode tool for retrieving specimens and scanning appearances. Scanning can be done through cameras." id = "science_tool" - build_path = /obj/item/abductor/gizmo + build_path = list(/obj/item/abductor/gizmo = 1) /datum/abductor_gear/advanced_baton name = "Advanced Baton" description = "A quad-mode baton used for incapacitation and restraining of specimens." id = "advanced_baton" cost = 2 - build_path = /obj/item/melee/baton/abductor + build_path = list(/obj/item/melee/baton/abductor = 1) /datum/abductor_gear/superlingual_matrix name = "Superlingual Matrix" description = "A mysterious structure that allows for instant communication between users. Using it inhand will attune it to your mothership's channel. Pretty impressive until you need to eat something." id = "superlingual_matrix" - build_path = /obj/item/organ/internal/tongue/abductor - category = "Advanced Gear" + build_path = list(/obj/item/organ/internal/tongue/abductor = 1) + category = CATEGORY_MISC_GEAR /datum/abductor_gear/mental_interface name = "Mental Interface Device" @@ -58,16 +62,16 @@ GLOBAL_LIST_INIT(abductor_gear, subtypesof(/datum/abductor_gear)) or to send a command to a test subject with a charged gland." id = "mental_interface" cost = 2 - build_path = /obj/item/abductor/mind_device - category = "Advanced Gear" + build_path = list(/obj/item/abductor/mind_device = 1) + category = CATEGORY_ADVANCED_GEAR /datum/abductor_gear/reagent_synthesizer name = "Reagent Synthesizer" description = "Synthesizes a variety of reagents using proto-matter." id = "reagent_synthesizer" cost = 2 - build_path = /obj/item/abductor_machine_beacon/chem_dispenser - category = "Advanced Gear" + build_path = list(/obj/item/abductor_machine_beacon/chem_dispenser = 1) + category = CATEGORY_ADVANCED_GEAR /datum/abductor_gear/shrink_ray name = "Shrink Ray Blaster" @@ -75,5 +79,32 @@ GLOBAL_LIST_INIT(abductor_gear, subtypesof(/datum/abductor_gear)) That or it's just space magic. Either way, it shrinks stuff." id = "shrink_ray" cost = 2 - build_path = /obj/item/gun/energy/shrink_ray - category = "Advanced Gear" + build_path = list(/obj/item/gun/energy/shrink_ray = 1) + category = CATEGORY_ADVANCED_GEAR + +/datum/abductor_gear/omnitool + name = "Alien Omnitool" + description = "A handheld device with an absurd number of integrated tools. Can be used as a convenient tool replacement for either role. \ + Right-click it to switch between medical and hacking toolsets." + id = "omnitool" + cost = 2 + build_path = list(/obj/item/abductor/alien_omnitool = 1) + category = CATEGORY_ADVANCED_GEAR + +/datum/abductor_gear/cow + name = "Spare Cow" + description = "Delivers a leftover specimen from an earlier abduction operation." + id = "cow" + build_path = list(/mob/living/basic/cow = 1, /obj/item/food/grown/wheat = 3) + category = CATEGORY_MISC_GEAR + +/datum/abductor_gear/posters + name = "Decorative Posters" + description = "Some posters, to decorate the walls of the Mothership (or even the station) with." + id = "poster" + build_path = list(/obj/item/poster/random_abductor = 2) + category = CATEGORY_MISC_GEAR + +#undef CATEGORY_BASIC_GEAR +#undef CATEGORY_ADVANCED_GEAR +#undef CATEGORY_MISC_GEAR diff --git a/code/modules/antagonists/abductor/machinery/camera.dm b/code/modules/antagonists/abductor/machinery/camera.dm index 53cfb2fefa605..685ae2d12db38 100644 --- a/code/modules/antagonists/abductor/machinery/camera.dm +++ b/code/modules/antagonists/abductor/machinery/camera.dm @@ -8,7 +8,7 @@ var/abduct_created = FALSE lock_override = TRUE - icon = 'icons/obj/abductor.dmi' + icon = 'icons/obj/antags/abductor.dmi' icon_state = "camera" icon_keyboard = null icon_screen = null diff --git a/code/modules/antagonists/abductor/machinery/console.dm b/code/modules/antagonists/abductor/machinery/console.dm index c73a735f4fa4c..b76a25ca7203a 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 as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/abductor/console)) if(C.team_number == team_number) return C @@ -15,7 +15,7 @@ /obj/machinery/abductor/console name = "abductor console" desc = "Ship command center." - icon = 'icons/obj/abductor.dmi' + icon = 'icons/obj/antags/abductor.dmi' icon_state = "console" density = TRUE var/obj/item/abductor/gizmo/gizmo @@ -66,7 +66,7 @@ . = ..() if(.) return - if(!HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING) && !HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_TRAINING)) + if(!HAS_MIND_TRAIT(user, TRAIT_ABDUCTOR_TRAINING)) to_chat(user, span_warning("You start mashing alien buttons at random!")) if(do_after(user,100, target = src)) TeleporterSend() @@ -206,18 +206,18 @@ if(!team_number) return - for(var/obj/machinery/abductor/pad/p in GLOB.machines) + for(var/obj/machinery/abductor/pad/p as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/abductor/pad)) 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 as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/abductor/experiment)) 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 SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/computer/camera_advanced/abductor)) if(c.team_number == team_number) camera = c c.console = src @@ -252,7 +252,7 @@ if(vest == V) return FALSE - for(var/obj/machinery/abductor/console/C in GLOB.machines) + for(var/obj/machinery/abductor/console/C as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/abductor/console)) if(C.vest == V) C.vest = null break @@ -268,7 +268,7 @@ else return ..() -/obj/machinery/abductor/console/proc/Dispense(item,cost=1) +/obj/machinery/abductor/console/proc/Dispense(items_list, cost=1) if(experiment && experiment.credits >= cost) experiment.credits -=cost say("Incoming supply!") @@ -276,7 +276,8 @@ if(pad) flick("alien-pad", pad) drop_location = pad.loc - new item(drop_location) - + for(var/each_item in items_list) + for(var/i in 1 to items_list[each_item]) + new each_item(drop_location) else say("Insufficent data!") diff --git a/code/modules/antagonists/abductor/machinery/dispenser.dm b/code/modules/antagonists/abductor/machinery/dispenser.dm index de6d945035af3..163b7515872d2 100644 --- a/code/modules/antagonists/abductor/machinery/dispenser.dm +++ b/code/modules/antagonists/abductor/machinery/dispenser.dm @@ -1,7 +1,7 @@ /obj/machinery/abductor/gland_dispenser name = "replacement organ storage" desc = "A tank filled with replacement organs." - icon = 'icons/obj/abductor.dmi' + icon = 'icons/obj/antags/abductor.dmi' icon_state = "dispenser" density = TRUE var/list/gland_types diff --git a/code/modules/antagonists/abductor/machinery/experiment.dm b/code/modules/antagonists/abductor/machinery/experiment.dm index 8fab6d289b7fa..333a03b45f8fc 100644 --- a/code/modules/antagonists/abductor/machinery/experiment.dm +++ b/code/modules/antagonists/abductor/machinery/experiment.dm @@ -1,7 +1,7 @@ /obj/machinery/abductor/experiment name = "experimentation machine" desc = "A large man-sized tube sporting a complex array of surgical machinery." - icon = 'icons/obj/abductor.dmi' + icon = 'icons/obj/antags/abductor.dmi' icon_state = "experiment-open" density = FALSE state_open = TRUE @@ -116,49 +116,54 @@ * * type The type of experiment to be performed * * user The mob starting the experiment */ -/obj/machinery/abductor/experiment/proc/experiment(mob/occupant, type, mob/user) +/obj/machinery/abductor/experiment/proc/experiment(mob/living/carbon/human/occupant, type, mob/user) LAZYINITLIST(history) - var/mob/living/carbon/human/H = occupant + + if(!istype(occupant)) + stack_trace("Abductor '[name]' called /proc/experiment with unexpected occupant ([occupant])") + + if(!ishuman(occupant)) //We shouldn't be processing anything other than humans + return "Not a humanoid!" var/datum/antagonist/abductor/user_abductor = user.mind.has_antag_datum(/datum/antagonist/abductor) if(!user_abductor) return "Authorization failure. Contact mothership immediately." var/point_reward = 0 - if(!H) + if(!occupant) return "Invalid or missing specimen." - if(H in history) + if(occupant in history) return "Specimen already in database." - if(H.stat == DEAD) + if(occupant.stat == DEAD) say("Specimen deceased - please provide fresh sample.") return "Specimen deceased." - var/obj/item/organ/internal/heart/gland/GlandTest = locate() in H.organs + var/obj/item/organ/internal/heart/gland/GlandTest = locate() in occupant.organs if(!GlandTest) say("Experimental dissection not detected!") return "No glands detected!" - if(H.mind != null && H.ckey != null) + if(occupant.mind != null && occupant.ckey != null) LAZYINITLIST(abductee_minds) - LAZYADD(history, H) - LAZYADD(abductee_minds, H.mind) + LAZYADD(history, occupant) + LAZYADD(abductee_minds, occupant.mind) say("Processing specimen...") sleep(0.5 SECONDS) switch(text2num(type)) if(1) - to_chat(H, span_warning("You feel violated.")) + to_chat(occupant, span_warning("You feel violated.")) if(2) - to_chat(H, span_warning("You feel yourself being sliced apart and put back together.")) + to_chat(occupant, span_warning("You feel yourself being sliced apart and put back together.")) if(3) - to_chat(H, span_warning("You feel intensely watched.")) + to_chat(occupant, span_warning("You feel intensely watched.")) sleep(0.5 SECONDS) - user_abductor.team.abductees += H.mind - H.mind.add_antag_datum(/datum/antagonist/abductee) + user_abductor.team.abductees += occupant.mind + occupant.mind.add_antag_datum(/datum/antagonist/abductee) - for(var/obj/item/organ/internal/heart/gland/G in H.organs) + for(var/obj/item/organ/internal/heart/gland/G in occupant.organs) G.Start() point_reward++ if(point_reward > 0) open_machine() - send_back(H) + send_back(occupant) playsound(src.loc, 'sound/machines/ding.ogg', 50, TRUE) points += point_reward credits += point_reward @@ -169,7 +174,7 @@ else say("Brain activity nonexistent - disposing sample...") open_machine() - send_back(H) + send_back(occupant) return "Specimen braindead - disposed." /** diff --git a/code/modules/antagonists/abductor/machinery/pad.dm b/code/modules/antagonists/abductor/machinery/pad.dm index f6fc659f6d178..6f2dc48a67213 100644 --- a/code/modules/antagonists/abductor/machinery/pad.dm +++ b/code/modules/antagonists/abductor/machinery/pad.dm @@ -1,7 +1,7 @@ /obj/machinery/abductor/pad name = "Alien Telepad" desc = "Use this to transport to and from the humans' habitat." - icon = 'icons/obj/abductor.dmi' + icon = 'icons/obj/antags/abductor.dmi' icon_state = "alien-pad-idle" var/turf/teleport_target var/obj/machinery/abductor/console/console @@ -52,7 +52,7 @@ /obj/effect/temp_visual/teleport_abductor name = "Huh" - icon = 'icons/obj/abductor.dmi' + icon = 'icons/obj/antags/abductor.dmi' icon_state = "teleport" duration = 8 SECONDS @@ -64,6 +64,6 @@ /obj/effect/temp_visual/teleport_golem name = "bluespace silhouette" - icon = 'icons/obj/abductor.dmi' + icon = 'icons/obj/antags/abductor.dmi' icon_state = "teleport" duration = 6 SECONDS diff --git a/code/modules/antagonists/blob/blob_antag.dm b/code/modules/antagonists/blob/blob_antag.dm index 63033c6e3ee9c..2d606d65b18d0 100644 --- a/code/modules/antagonists/blob/blob_antag.dm +++ b/code/modules/antagonists/blob/blob_antag.dm @@ -10,6 +10,8 @@ var/datum/action/innate/blobpop/pop_action /// Initial points for a human blob var/starting_points_human_blob = OVERMIND_STARTING_POINTS + /// Has the blob already popped inside of the round? This is here to prevent blobs from "respawning" + var/has_already_popped = FALSE /datum/antagonist/blob/roundend_report() var/basic_report = ..() @@ -26,6 +28,8 @@ 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!")) + else + has_already_popped = TRUE owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/blobalert.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) @@ -74,7 +78,7 @@ objectives += main /datum/antagonist/blob/apply_innate_effects(mob/living/mob_override) - if(isovermind(owner.current)) + if(isovermind(owner.current) || has_already_popped) return FALSE if(!pop_action) pop_action = new @@ -131,6 +135,16 @@ old_body.gib() blob_cam.place_blob_core(placement_override, pop_override = TRUE) playsound(get_turf(blob_cam), 'sound/ambience/antag/blobalert.ogg', 50, FALSE) + blobtag.has_already_popped = TRUE + + notify_ghosts( + "A Blob host has burst in [get_area_name(blob_cam.blob_core)]", + source = blob_cam.blob_core, + action = NOTIFY_ORBIT, + ghost_sound = 'sound/ambience/antag/blobalert.ogg', + header = "Blob Awakening!", + notify_volume = 75 + ) /datum/antagonist/blob/antag_listing_status() . = ..() diff --git a/code/modules/antagonists/blob/blob_minion.dm b/code/modules/antagonists/blob/blob_minion.dm index 9ba8e7089b9e8..9bf37e961d5dd 100644 --- a/code/modules/antagonists/blob/blob_minion.dm +++ b/code/modules/antagonists/blob/blob_minion.dm @@ -34,9 +34,3 @@ objective.owner = owner objective.overmind = overmind objectives += objective - -/datum/antagonist/blob_minion/blobbernaut - name = "\improper Blobbernaut" - -/datum/antagonist/blob_minion/blob_zombie - name = "\improper Blob Zombie" diff --git a/code/modules/antagonists/blob/blobstrains/_blobstrain.dm b/code/modules/antagonists/blob/blobstrains/_blobstrain.dm index 6225eec9da936..6f01eb67aa72a 100644 --- a/code/modules/antagonists/blob/blobstrains/_blobstrain.dm +++ b/code/modules/antagonists/blob/blobstrains/_blobstrain.dm @@ -96,12 +96,12 @@ GLOBAL_LIST_INIT(valid_blobstrains, subtypesof(/datum/blobstrain) - list(/datum/ B.modify_max_integrity(B.max_integrity * max_structure_health_multiplier) B.update_appearance() - for(var/mob/living/simple_animal/hostile/blob/BM as anything in overmind.blob_mobs) - BM.maxHealth *= max_mob_health_multiplier - BM.health *= max_mob_health_multiplier - BM.update_icons() //If it's getting a new strain, tell it what it does! - to_chat(BM, "Your overmind's blob strain is now: [name]!") - to_chat(BM, "The [name] strain [shortdesc ? "[shortdesc]" : "[description]"]") + for(var/mob/living/blob_mob as anything in overmind.blob_mobs) + blob_mob.maxHealth *= max_mob_health_multiplier + blob_mob.health *= max_mob_health_multiplier + blob_mob.update_icons() //If it's getting a new strain, tell it what it does! + to_chat(blob_mob, "Your overmind's blob strain is now: [name]!") + to_chat(blob_mob, "The [name] strain [shortdesc ? "[shortdesc]" : "[description]"]") /datum/blobstrain/proc/on_lose() if(overmind.blob_core) @@ -122,9 +122,9 @@ GLOBAL_LIST_INIT(valid_blobstrains, subtypesof(/datum/blobstrain) - list(/datum/ for(var/obj/structure/blob/B as anything in overmind.all_blobs) B.modify_max_integrity(B.max_integrity / max_structure_health_multiplier) - for(var/mob/living/simple_animal/hostile/blob/BM as anything in overmind.blob_mobs) - BM.maxHealth /= max_mob_health_multiplier - BM.health /= max_mob_health_multiplier + for(var/mob/living/blob_mob as anything in overmind.blob_mobs) + blob_mob.maxHealth /= max_mob_health_multiplier + blob_mob.health /= max_mob_health_multiplier /datum/blobstrain/proc/on_sporedeath(mob/living/spore) diff --git a/code/modules/antagonists/blob/blobstrains/_reagent.dm b/code/modules/antagonists/blob/blobstrains/_reagent.dm index aefd6c02f3c3e..05bc73f95c8de 100644 --- a/code/modules/antagonists/blob/blobstrains/_reagent.dm +++ b/code/modules/antagonists/blob/blobstrains/_reagent.dm @@ -15,8 +15,9 @@ var/mob_protection = L.getarmor(null, BIO) * 0.01 reagent.expose_mob(L, VAPOR, BLOBMOB_BLOBBERNAUT_REAGENTATK_VOL+blobbernaut_reagentatk_bonus, FALSE, mob_protection, overmind)//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) +/datum/blobstrain/reagent/on_sporedeath(mob/living/basic/spore) + var/burst_range = (spore.type == /mob/living/basic/blob_minion/spore) ? 1 : 0 + do_chem_smoke(range = burst_range, holder = spore, location = get_turf(spore), reagent_type = reagent.type) // These can only be applied by blobs. They are what (reagent) blobs are made out of. /datum/reagent/blob @@ -29,7 +30,7 @@ /// Used by blob reagents to calculate the reaction volume they should use when exposing mobs. /datum/reagent/blob/proc/return_mob_expose_reac_volume(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/overmind) - if(exposed_mob.stat == DEAD || isblobmonster(exposed_mob)) + if(exposed_mob.stat == DEAD || HAS_TRAIT(exposed_mob, TRAIT_BLOB_ALLY)) return 0 //the dead, and blob mobs, don't cause reactions return round(reac_volume * min(1.5 - touch_protection, 1), 0.1) //full touch protection means 50% volume, any prot below 0.5 means 100% volume. diff --git a/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm b/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm index a20ddf89805cb..a18d802ff7dd4 100644 --- a/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm +++ b/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm @@ -26,8 +26,10 @@ exposed_mob.apply_damage(0.2*reac_volume, BRUTE, wound_bonus=CANT_WOUND) /datum/reagent/blob/cryogenic_poison/on_mob_life(mob/living/carbon/exposed_mob, seconds_per_tick, times_fired) - exposed_mob.adjustBruteLoss(0.5 * REM * seconds_per_tick, FALSE) - exposed_mob.adjustFireLoss(0.5 * REM * seconds_per_tick, FALSE) - exposed_mob.adjustToxLoss(0.5 * REM * seconds_per_tick, FALSE) - . = 1 - ..() + . = ..() + var/need_mob_update + need_mob_update = exposed_mob.adjustBruteLoss(0.5 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += exposed_mob.adjustFireLoss(0.5 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += exposed_mob.adjustToxLoss(0.5 * REM * seconds_per_tick, updating_health = FALSE) + if(need_mob_update) + . = UPDATE_MOB_HEALTH diff --git a/code/modules/antagonists/blob/blobstrains/distributed_neurons.dm b/code/modules/antagonists/blob/blobstrains/distributed_neurons.dm index f97599948a13f..ea2bf54d7692c 100644 --- a/code/modules/antagonists/blob/blobstrains/distributed_neurons.dm +++ b/code/modules/antagonists/blob/blobstrains/distributed_neurons.dm @@ -11,18 +11,16 @@ message_living = ", and you feel tired" 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. - 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 - BS.update_icons() - B.overmind.blob_mobs.Add(BS) +/datum/blobstrain/reagent/distributed_neurons/damage_reaction(obj/structure/blob/blob_tile, damage, damage_type, damage_flag) + if((damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) && damage <= 20 && blob_tile.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. + blob_tile.visible_message(span_boldwarning("A spore floats free of the blob!")) + blob_tile.overmind.create_spore(blob_tile.loc, /mob/living/basic/blob_minion/spore/minion/weak) return ..() /datum/reagent/blob/distributed_neurons name = "Distributed Neurons" color = "#E88D5D" + taste_description = "fizzing" /datum/reagent/blob/distributed_neurons/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/overmind) . = ..() @@ -33,10 +31,7 @@ exposed_mob.investigate_log("has been killed by distributed neurons (blob).", INVESTIGATE_DEATHS) 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)) - spore.overmind = overmind - spore.update_icons() - overmind.blob_mobs.Add(spore) + var/mob/living/basic/blob_minion/spore/minion/spore = overmind.create_spore(get_turf(exposed_mob)) spore.zombify(exposed_mob) overmind.add_points(-5) to_chat(overmind, span_notice("Spent 5 resources for the zombification of [exposed_mob].")) diff --git a/code/modules/antagonists/blob/blobstrains/reactive_spines.dm b/code/modules/antagonists/blob/blobstrains/reactive_spines.dm index 53f336ca419e2..1c8cb893df839 100644 --- a/code/modules/antagonists/blob/blobstrains/reactive_spines.dm +++ b/code/modules/antagonists/blob/blobstrains/reactive_spines.dm @@ -16,15 +16,15 @@ if(damage && ((damage_type == BRUTE) || (damage_type == BURN)) && B.get_integrity() - damage > 0 && COOLDOWN_FINISHED(src, retaliate_cooldown)) // Is there any damage, is it burn or brute, will we be alive, and has the cooldown finished? COOLDOWN_START(src, retaliate_cooldown, 2.5 SECONDS) // 2.5 seconds before auto-retaliate can whack everything within 1 tile again B.visible_message(span_boldwarning("The blob retaliates, lashing out!")) - for(var/atom/A in range(1, B)) - if(!A.can_blob_attack()) + for(var/atom/thing in range(1, B)) + if(!thing.can_blob_attack()) continue - var/attacked_turf = get_turf(A) - if(isliving(A) && !isblobmonster(A)) // Make sure to inject strain-reagents with automatic attacks when needed. + var/attacked_turf = get_turf(thing) + if(isliving(thing) && !HAS_TRAIT(thing, TRAIT_BLOB_ALLY)) // Make sure to inject strain-reagents with automatic attacks when needed. B.blob_attack_animation(attacked_turf, overmind) - attack_living(A) + attack_living(thing) - else if(A.blob_act(B)) // After checking for mobs, whack everything else with the standard attack + else if(thing.blob_act(B)) // After checking for mobs, whack everything else with the standard attack B.blob_attack_animation(attacked_turf, overmind) // Only play the animation if the attack did something meaningful return ..() @@ -35,7 +35,7 @@ color = "#9ACD32" /datum/reagent/blob/reactive_spines/return_mob_expose_reac_volume(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/overmind) - if(exposed_mob.stat == DEAD || isblobmonster(exposed_mob)) + if(exposed_mob.stat == DEAD || HAS_TRAIT(exposed_mob, TRAIT_BLOB_ALLY)) return 0 //the dead, and blob mobs, don't cause reactions return reac_volume diff --git a/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm b/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm index 78b67dae6509a..0b70cc9c74124 100644 --- a/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm +++ b/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm @@ -25,9 +25,9 @@ exposed_mob.apply_damage(0.7*reac_volume, TOX) /datum/reagent/blob/regenerative_materia/on_mob_life(mob/living/carbon/metabolizer, seconds_per_tick, times_fired) - metabolizer.adjustToxLoss(1 * REM * seconds_per_tick) - ..() - return TRUE + . = ..() + if(metabolizer.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/blob/regenerative_materia/on_mob_metabolize(mob/living/metabolizer) . = ..() diff --git a/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm b/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm index 14e7980b61af7..825104ddcc192 100644 --- a/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm +++ b/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm @@ -14,12 +14,13 @@ /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 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)) + var/list/blob_structures = orange(1, B) + for(var/obj/structure/blob/C in blob_structures) 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 damagesplit += 1 - for(var/obj/structure/blob/C in orange(1, B)) + for(var/obj/structure/blob/C in blob_structures) if(!C.ignore_syncmesh_share && C.overmind && C.overmind.blobstrain.type == B.overmind.blobstrain.type) //only hurt blobs that have the same overmind chemical and aren't cores or nodes - C.take_damage(damage/damagesplit, CLONE, 0, 0) + C.take_damage(damage/damagesplit, damage_type, 0, 0) return damage / damagesplit else return damage * 1.25 diff --git a/code/modules/antagonists/blob/overmind.dm b/code/modules/antagonists/blob/overmind.dm index 021c8bb12d51d..38e88817de285 100644 --- a/code/modules/antagonists/blob/overmind.dm +++ b/code/modules/antagonists/blob/overmind.dm @@ -54,6 +54,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) var/list/strain_choices /mob/camera/blob/Initialize(mapload, starting_points = OVERMIND_STARTING_POINTS) + ADD_TRAIT(src, TRAIT_BLOB_ALLY, INNATE_TRAIT) validate_location() blob_points = starting_points manualplace_min_time += world.time @@ -71,6 +72,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) SSshuttle.registerHostileEnvironment(src) . = ..() START_PROCESSING(SSobj, src) + GLOB.blob_telepathy_mobs |= src /mob/camera/blob/proc/validate_location() var/turf/T = get_turf(src) @@ -112,6 +114,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) to_chat(src, span_notice("The [blobstrain.name] strain [blobstrain.description]")) if(blobstrain.effectdesc) to_chat(src, span_notice("The [blobstrain.name] strain [blobstrain.effectdesc]")) + SEND_SIGNAL(src, COMSIG_BLOB_SELECTED_STRAIN, blobstrain) /mob/camera/blob/can_z_move(direction, turf/start, turf/destination, z_move_flags = NONE, mob/living/rider) if(placed) // The blob can't expand vertically (yet) @@ -162,52 +165,72 @@ GLOBAL_LIST_EMPTY(blob_nodes) priority_announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", ANNOUNCER_OUTBREAK5) has_announced = TRUE +/// Create a blob spore and link it to us +/mob/camera/blob/proc/create_spore(turf/spore_turf, spore_type = /mob/living/basic/blob_minion/spore/minion) + var/mob/living/basic/blob_minion/spore/spore = new spore_type(spore_turf) + assume_direct_control(spore) + return spore + +/// Give our new minion the properties of a minion +/mob/camera/blob/proc/assume_direct_control(mob/living/minion) + minion.AddComponent(/datum/component/blob_minion, src) + +/// Add something to our list of mobs and wait for it to die +/mob/camera/blob/proc/register_new_minion(mob/living/minion) + blob_mobs |= minion + if (!istype(minion, /mob/living/basic/blob_minion/blobbernaut)) + RegisterSignal(minion, COMSIG_LIVING_DEATH, PROC_REF(on_minion_death)) + +/// When a spore (or zombie) dies then we do this +/mob/camera/blob/proc/on_minion_death(mob/living/spore) + SIGNAL_HANDLER + blobstrain.on_sporedeath(spore) + /mob/camera/blob/proc/victory() sound_to_playing_players('sound/machines/alarm.ogg') sleep(10 SECONDS) - for(var/i in GLOB.mob_living_list) - var/mob/living/L = i - var/turf/T = get_turf(L) - if(!T || !is_station_level(T.z)) + for(var/mob/living/live_guy as anything in GLOB.mob_living_list) + var/turf/guy_turf = get_turf(live_guy) + if(isnull(guy_turf) || !is_station_level(guy_turf.z)) continue - if(L in GLOB.overminds || (L.pass_flags & PASSBLOB)) + if(live_guy in GLOB.overminds || (live_guy.pass_flags & PASSBLOB)) continue - var/area/Ablob = get_area(T) - - if(!(Ablob.area_flags & BLOBS_ALLOWED)) + var/area/blob_area = get_area(guy_turf) + if(!(blob_area.area_flags & BLOBS_ALLOWED)) continue - if(!(ROLE_BLOB in L.faction)) - playsound(L, 'sound/effects/splat.ogg', 50, TRUE) - if(L.stat != DEAD) - L.investigate_log("has died from blob takeover.", INVESTIGATE_DEATHS) - L.death() - new/mob/living/simple_animal/hostile/blob/blobspore(T) + if(!(ROLE_BLOB in live_guy.faction)) + playsound(live_guy, 'sound/effects/splat.ogg', 50, TRUE) + if(live_guy.stat != DEAD) + live_guy.investigate_log("has died from blob takeover.", INVESTIGATE_DEATHS) + live_guy.death() + create_spore(guy_turf) else - L.fully_heal() + live_guy.fully_heal() - for(var/area/A in GLOB.areas) - if(!(A.type in GLOB.the_station_areas)) + for(var/area/check_area in GLOB.areas) + if(!is_type_in_list(check_area, GLOB.the_station_areas)) continue - if(!(A.area_flags & BLOBS_ALLOWED)) + if(!(check_area.area_flags & BLOBS_ALLOWED)) continue - A.color = blobstrain.color - A.name = "blob" - A.icon = 'icons/mob/nonhuman-player/blob.dmi' - A.icon_state = "blob_shield" - A.layer = BELOW_MOB_LAYER - A.invisibility = 0 - A.blend_mode = 0 + check_area.color = blobstrain.color + check_area.name = "blob" + check_area.icon = 'icons/mob/nonhuman-player/blob.dmi' + check_area.icon_state = "blob_shield" + check_area.layer = BELOW_MOB_LAYER + check_area.invisibility = 0 + check_area.blend_mode = 0 + var/datum/antagonist/blob/B = mind.has_antag_datum(/datum/antagonist/blob) if(B) var/datum/objective/blob_takeover/main_objective = locate() in B.objectives if(main_objective) main_objective.completed = TRUE - to_chat(world, span_blob("[real_name] consumed the station in an unstoppable tide!")) + to_chat(world, span_blobannounce("[real_name] consumed the station in an unstoppable tide!")) SSticker.news_report = BLOB_WIN - SSticker.force_ending = TRUE + SSticker.force_ending = FORCE_END_ROUND /mob/camera/blob/Destroy() QDEL_NULL(blobstrain) @@ -216,11 +239,6 @@ GLOBAL_LIST_EMPTY(blob_nodes) if(B && B.overmind == src) B.overmind = null B.update_appearance() //reset anything that was ours - for(var/BLO in blob_mobs) - var/mob/living/simple_animal/hostile/blob/BM = BLO - if(BM) - BM.overmind = null - BM.update_icons() for(var/obj/structure/blob/blob_structure as anything in all_blobs) blob_structure.overmind = null all_blobs = null @@ -233,6 +251,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) SSshuttle.clearHostileEnvironment(src) STOP_PROCESSING(SSobj, src) + GLOB.blob_telepathy_mobs -= src return ..() @@ -240,7 +259,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) . = ..() if(!. || !client) return FALSE - to_chat(src, span_blob("You are the overmind!")) + to_chat(src, span_blobannounce("You are the overmind!")) if(!placed && autoplace_max_time <= world.time) to_chat(src, span_boldannounce("You will automatically place your blob core in [DisplayTimeText(autoplace_max_time - world.time)].")) to_chat(src, span_boldannounce("You [manualplace_min_time ? "will be able to":"can"] manually place your blob core by pressing the Place Blob Core button in the bottom right corner of the screen.")) @@ -257,9 +276,11 @@ GLOBAL_LIST_EMPTY(blob_nodes) return FALSE var/current_health = round((blob_core.get_integrity() / blob_core.max_integrity) * 100) hud_used.healths.maptext = MAPTEXT("
    [current_health]%
    ") - for(var/mob/living/simple_animal/hostile/blob/blobbernaut/blobbernaut in blob_mobs) - if(blobbernaut.hud_used && blobbernaut.hud_used.blobpwrdisplay) - blobbernaut.hud_used.blobpwrdisplay.maptext = MAPTEXT("
    [current_health]%
    ") + for(var/mob/living/basic/blob_minion/blobbernaut/blobbernaut in blob_mobs) + var/datum/hud/using_hud = blobbernaut.hud_used + if(!using_hud?.blobpwrdisplay) + continue + using_hud.blobpwrdisplay.maptext = MAPTEXT("
    [current_health]%
    ") /mob/camera/blob/proc/add_points(points) blob_points = clamp(blob_points + points, 0, max_blob_points) @@ -291,14 +312,8 @@ GLOBAL_LIST_EMPTY(blob_nodes) src.log_talk(message, LOG_SAY) var/message_a = say_quote(message) - var/rendered = span_big("\[Blob Telepathy\] [name]([blobstrain.name]) [message_a]") - - for(var/mob/M in GLOB.mob_list) - if(isovermind(M) || isblobmonster(M)) - to_chat(M, rendered) - if(isobserver(M)) - var/link = FOLLOW_LINK(M, src) - to_chat(M, "[link] [rendered]") + var/rendered = span_big(span_blob("\[Blob Telepathy\] [name]([blobstrain.name]) [message_a]")) + blob_telepathy(rendered, src) /mob/camera/blob/blob_act(obj/structure/blob/B) return @@ -324,8 +339,8 @@ GLOBAL_LIST_EMPTY(blob_nodes) else return FALSE else - var/area/A = get_area(NewLoc) - if(isgroundlessturf(NewLoc) || istype(A, /area/shuttle)) //if unplaced, can't go on shuttles or goundless tiles + var/area/check_area = get_area(NewLoc) + if(isgroundlessturf(NewLoc) || istype(check_area, /area/shuttle)) //if unplaced, can't go on shuttles or groundless tiles return FALSE forceMove(NewLoc) return TRUE diff --git a/code/modules/antagonists/blob/powers.dm b/code/modules/antagonists/blob/powers.dm index c75a41a48fff7..04054f6df85a3 100644 --- a/code/modules/antagonists/blob/powers.dm +++ b/code/modules/antagonists/blob/powers.dm @@ -196,38 +196,25 @@ var/list/mob/dead/observer/candidates = poll_ghost_candidates("Do you want to play as a [blobstrain.name] blobbernaut?", ROLE_BLOB, ROLE_BLOB, 50) - factory.is_creating_blobbernaut = FALSE - if(!length(candidates)) to_chat(src, span_warning("You could not conjure a sentience for your blobbernaut. Your points have been refunded. Try again later.")) add_points(BLOBMOB_BLOBBERNAUT_RESOURCE_COST) - factory.blobbernaut = null //players must answer rapidly + factory.assign_blobbernaut(null) return FALSE - factory.modify_max_integrity(initial(factory.max_integrity) * 0.25) //factories that produced a blobbernaut have much lower health - factory.update_appearance() - factory.visible_message(span_warning("The blobbernaut [pick("rips", "tears", "shreds")] its way out of the factory blob!")) - playsound(factory.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(factory)) - flick("blobbernaut_produce", blobber) - - factory.blobbernaut = blobber - blobber.factory = factory - blobber.overmind = src - blobber.update_icons() - blobber.adjustHealth(blobber.maxHealth * 0.5) - blob_mobs += blobber - + var/mob/living/basic/blob_minion/blobbernaut/minion/blobber = new(get_turf(factory)) + assume_direct_control(blobber) + factory.assign_blobbernaut(blobber) var/mob/dead/observer/player = pick(candidates) - blobber.key = player.key + blobber.assign_key(player.key, blobstrain) + RegisterSignal(blobber, COMSIG_HOSTILE_POST_ATTACKINGTARGET, PROC_REF(on_blobbernaut_attacked)) - SEND_SOUND(blobber, sound('sound/effects/blobattack.ogg')) - SEND_SOUND(blobber, sound('sound/effects/attackblob.ogg')) - to_chat(blobber, span_infoplain("You are powerful, hard to kill, and slowly regenerate near nodes and cores, [span_cultlarge("but will slowly die if not near the blob")] or if the factory that made you is killed.")) - to_chat(blobber, span_infoplain("You can communicate with other blobbernauts and overminds telepathically by attempting to speak normally")) - to_chat(blobber, span_infoplain("Your overmind's blob reagent is: [blobstrain.name]!")) - to_chat(blobber, span_infoplain("The [blobstrain.name] reagent [blobstrain.shortdesc ? "[blobstrain.shortdesc]" : "[blobstrain.description]"]")) +/// When one of our boys attacked something, we sometimes want to perform extra effects +/mob/camera/blob/proc/on_blobbernaut_attacked(mob/living/basic/blobbynaut, atom/target, success) + SIGNAL_HANDLER + if (!success) + return + blobstrain.blobbernaut_attack(target, blobbynaut) /** Moves the core */ /mob/camera/blob/proc/relocate_core() @@ -358,10 +345,11 @@ var/list/surrounding_turfs = TURF_NEIGHBORS(tile) if(!length(surrounding_turfs)) return FALSE - for(var/mob/living/simple_animal/hostile/blob/blobspore/spore as anything in blob_mobs) - if(isturf(spore.loc) && get_dist(spore, tile) <= 35 && !spore.key) - spore.LoseTarget() - spore.Goto(pick(surrounding_turfs), spore.move_to_delay) + for(var/mob/living/basic/blob_mob as anything in blob_mobs) + if(!isturf(blob_mob.loc) || get_dist(blob_mob, tile) > 35 || blob_mob.key) + continue + blob_mob.ai_controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET) + blob_mob.ai_controller.set_blackboard_key(BB_TRAVEL_DESTINATION, pick(surrounding_turfs)) /** Opens the reroll menu to change strains */ /mob/camera/blob/proc/strain_reroll() diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index 0c0f42bd0f7f6..e206d97c26b12 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -35,6 +35,7 @@ /datum/armor/structure_blob fire = 80 acid = 70 + laser = 50 /obj/structure/blob/Initialize(mapload, owner_overmind) . = ..() @@ -128,13 +129,13 @@ return FALSE //oh no we failed /obj/structure/blob/proc/ConsumeTile() - for(var/atom/A in loc) - if(!A.can_blob_attack()) + for(var/atom/thing in loc) + if(!thing.can_blob_attack()) continue - if(isliving(A) && overmind && !isblobmonster(A)) // Make sure to inject strain-reagents with automatic attacks when needed. - overmind.blobstrain.attack_living(A) + if(isliving(thing) && overmind && !HAS_TRAIT(thing, TRAIT_BLOB_ALLY)) // Make sure to inject strain-reagents with automatic attacks when needed. + overmind.blobstrain.attack_living(thing) continue // Don't smack them twice though - A.blob_act(src) + thing.blob_act(src) if(iswallturf(loc)) loc.blob_act(src) //don't ask how a wall got on top of the core, just eat it @@ -226,10 +227,10 @@ /obj/structure/blob/zap_act(power, zap_flags) if(overmind) if(overmind.blobstrain.tesla_reaction(src, power)) - take_damage(power * 0.0025, BURN, ENERGY) + take_damage(power * 3.125e-6, BURN, ENERGY) else - take_damage(power * 0.0025, BURN, ENERGY) - power -= power * 0.0025 //You don't get to do it for free + take_damage(power * 3.125e-6, BURN, ENERGY) + power -= power * 2.5e-3 //You don't get to do it for free return ..() //You don't get to do it for free /obj/structure/blob/extinguish() @@ -292,7 +293,6 @@ damage_amount *= brute_resist if(BURN) damage_amount *= fire_resist - if(CLONE) else return 0 var/armor_protection = 0 diff --git a/code/modules/antagonists/blob/structures/factory.dm b/code/modules/antagonists/blob/structures/factory.dm index e64097de87bc1..cee7e9a0ac58d 100644 --- a/code/modules/antagonists/blob/structures/factory.dm +++ b/code/modules/antagonists/blob/structures/factory.dm @@ -7,17 +7,21 @@ health_regen = BLOB_FACTORY_HP_REGEN point_return = BLOB_REFUND_FACTORY_COST resistance_flags = LAVA_PROOF + armor_type = /datum/armor/structure_blob/factory ///How many spores this factory can have. var/max_spores = BLOB_FACTORY_MAX_SPORES - ///The list of spores - var/list/spores = list() + ///The list of spores and zombies + var/list/spores_and_zombies = list() COOLDOWN_DECLARE(spore_delay) var/spore_cooldown = BLOBMOB_SPORE_SPAWN_COOLDOWN ///Its Blobbernaut, if it has spawned any. - var/mob/living/simple_animal/hostile/blob/blobbernaut/blobbernaut + var/mob/living/basic/blob_minion/blobbernaut/minion/blobbernaut ///Used in blob/powers.dm, checks if it's already trying to spawn a blobbernaut to prevent issues. var/is_creating_blobbernaut = FALSE +/datum/armor/structure_blob/factory + laser = 25 + /obj/structure/blob/special/factory/scannerreport() if(blobbernaut) return "It is currently sustaining a blobbernaut, making it fragile and unable to produce blob spores." @@ -28,15 +32,8 @@ overmind.factory_blobs += src /obj/structure/blob/special/factory/Destroy() - for(var/mob/living/simple_animal/hostile/blob/blobspore/spore in spores) - to_chat(spore, span_userdanger("Your factory was destroyed! You can no longer sustain yourself.")) - spore.death() - spores = null - if(blobbernaut) - blobbernaut.factory = null - to_chat(blobbernaut, span_userdanger("Your factory was destroyed! You feel yourself dying!")) - blobbernaut.throw_alert("nofactory", /atom/movable/screen/alert/nofactory) - blobbernaut = null + spores_and_zombies = null + blobbernaut = null if(overmind) overmind.factory_blobs -= src return ..() @@ -45,13 +42,57 @@ . = ..() if(blobbernaut) return - if(spores.len >= max_spores) + if(length(spores_and_zombies) >= max_spores) return if(!COOLDOWN_FINISHED(src, spore_delay)) return COOLDOWN_START(src, spore_delay, spore_cooldown) - var/mob/living/simple_animal/hostile/blob/blobspore/BS = new (loc, src) - if(overmind) //if we don't have an overmind, we don't need to do anything but make a spore - BS.overmind = overmind - BS.update_icons() - overmind.blob_mobs.Add(BS) + var/mob/living/basic/blob_minion/created_spore = (overmind) ? overmind.create_spore(loc) : new(loc) + register_mob(created_spore) + RegisterSignal(created_spore, COMSIG_BLOB_ZOMBIFIED, PROC_REF(on_zombie_created)) + +/// Tracks the existence of a mob in our mobs list +/obj/structure/blob/special/factory/proc/register_mob(mob/living/basic/blob_minion/blob_mob) + spores_and_zombies |= blob_mob + blob_mob.link_to_factory(src) + RegisterSignal(blob_mob, COMSIG_LIVING_DEATH, PROC_REF(on_spore_died)) + RegisterSignal(blob_mob, COMSIG_QDELETING, PROC_REF(on_spore_lost)) + +/// When a spore or zombie dies reset our spawn cooldown so we don't instantly replace it +/obj/structure/blob/special/factory/proc/on_spore_died(mob/living/dead_spore) + SIGNAL_HANDLER + COOLDOWN_START(src, spore_delay, spore_cooldown) + +/// When a spore is deleted remove it from our list +/obj/structure/blob/special/factory/proc/on_spore_lost(mob/living/dead_spore) + SIGNAL_HANDLER + spores_and_zombies -= dead_spore + +/// When a spore makes a zombie add it to our mobs list +/obj/structure/blob/special/factory/proc/on_zombie_created(mob/living/spore, mob/living/zombie) + SIGNAL_HANDLER + register_mob(zombie) + +/// Produce a blobbernaut +/obj/structure/blob/special/factory/proc/assign_blobbernaut(mob/living/new_naut) + is_creating_blobbernaut = FALSE + if (isnull(new_naut)) + return + + modify_max_integrity(initial(max_integrity) * 0.25) //factories that produced a blobbernaut have much lower health + visible_message(span_boldwarning("The blobbernaut [pick("rips", "tears", "shreds")] its way out of the factory blob!")) + playsound(loc, 'sound/effects/splat.ogg', 50, TRUE) + + blobbernaut = new_naut + blobbernaut.link_to_factory(src) + RegisterSignals(new_naut, list(COMSIG_QDELETING, COMSIG_LIVING_DEATH), PROC_REF(on_blobbernaut_death)) + update_appearance(UPDATE_ICON) + +/// When our brave soldier dies, reset our max integrity +/obj/structure/blob/special/factory/proc/on_blobbernaut_death(mob/living/death_naut) + SIGNAL_HANDLER + if (isnull(blobbernaut) || blobbernaut != death_naut) + return + blobbernaut = null + max_integrity = initial(max_integrity) + update_appearance(UPDATE_ICON) diff --git a/code/modules/antagonists/blob/structures/node.dm b/code/modules/antagonists/blob/structures/node.dm index 7e3e2a96aeb4f..d29eca38a6a5a 100644 --- a/code/modules/antagonists/blob/structures/node.dm +++ b/code/modules/antagonists/blob/structures/node.dm @@ -17,6 +17,7 @@ /datum/armor/special_node fire = 65 acid = 90 + laser = 25 /obj/structure/blob/special/node/Initialize(mapload) GLOB.blob_nodes += src diff --git a/code/modules/antagonists/blob/structures/resource.dm b/code/modules/antagonists/blob/structures/resource.dm index 9eb718a3f443c..3fa5416d32370 100644 --- a/code/modules/antagonists/blob/structures/resource.dm +++ b/code/modules/antagonists/blob/structures/resource.dm @@ -6,8 +6,12 @@ max_integrity = BLOB_RESOURCE_MAX_HP point_return = BLOB_REFUND_RESOURCE_COST resistance_flags = LAVA_PROOF + armor_type = /datum/armor/structure_blob/resource var/resource_delay = 0 +/datum/armor/structure_blob/resource + laser = 25 + /obj/structure/blob/special/resource/scannerreport() return "Gradually supplies the blob with resources, increasing the rate of expansion." diff --git a/code/modules/antagonists/blob/structures/shield.dm b/code/modules/antagonists/blob/structures/shield.dm index 0699d70f3f26b..737e9108555a4 100644 --- a/code/modules/antagonists/blob/structures/shield.dm +++ b/code/modules/antagonists/blob/structures/shield.dm @@ -15,6 +15,7 @@ /datum/armor/blob_shield fire = 90 acid = 90 + laser = 25 /obj/structure/blob/shield/Initialize(mapload, owner_overmind) AddElement(/datum/element/blocks_explosives) diff --git a/code/modules/antagonists/brainwashing/brainwashing.dm b/code/modules/antagonists/brainwashing/brainwashing.dm index 51372af49333b..e58f54f2c6550 100644 --- a/code/modules/antagonists/brainwashing/brainwashing.dm +++ b/code/modules/antagonists/brainwashing/brainwashing.dm @@ -1,30 +1,31 @@ -/proc/brainwash(mob/living/L, directives) - if(!L.mind) +/proc/brainwash(mob/living/brainwash_victim, directives) + if(!brainwash_victim.mind) return if(!islist(directives)) directives = list(directives) - var/datum/mind/M = L.mind - var/datum/antagonist/brainwashed/B = M.has_antag_datum(/datum/antagonist/brainwashed) - if(B) + var/datum/mind/brainwash_mind = brainwash_victim.mind + var/datum/antagonist/brainwashed/brainwashed_datum = brainwash_mind.has_antag_datum(/datum/antagonist/brainwashed) + if(brainwashed_datum) for(var/O in directives) var/datum/objective/brainwashing/objective = new(O) - B.objectives += objective - B.greet() + brainwashed_datum.objectives += objective + brainwashed_datum.greet() else - B = new() + brainwashed_datum = new() for(var/O in directives) var/datum/objective/brainwashing/objective = new(O) - B.objectives += objective - M.add_antag_datum(B) + brainwashed_datum.objectives += objective + brainwash_mind.add_antag_datum(brainwashed_datum) var/begin_message = " has been brainwashed with the following objectives: " var/obj_message = english_list(directives) - var/end_message = "." - var/rendered = begin_message + obj_message + end_message - deadchat_broadcast(rendered, "[L]", follow_target = L, turf_target = get_turf(L), message_type=DEADCHAT_ANNOUNCEMENT) + var/rendered = begin_message + obj_message + if(!(rendered[length(rendered)] in list(",",":",";",".","?","!","\'","-"))) + rendered += "." //Good punctuation is important :) + deadchat_broadcast(rendered, "[brainwash_victim]", follow_target = brainwash_victim, turf_target = get_turf(brainwash_victim), message_type=DEADCHAT_ANNOUNCEMENT) if(check_holidays(APRIL_FOOLS)) // Note: most of the time you're getting brainwashed you're unconscious - L.say("You son of a bitch! I'm in.", forced = "That son of a bitch! They're in. (April Fools)") + brainwash_victim.say("You son of a bitch! I'm in.", forced = "That son of a bitch! They're in. (April Fools)") /datum/antagonist/brainwashed name = "\improper Brainwashed Victim" diff --git a/code/modules/antagonists/brother/brother.dm b/code/modules/antagonists/brother/brother.dm index b481ade48df10..67fffb4fa19fa 100644 --- a/code/modules/antagonists/brother/brother.dm +++ b/code/modules/antagonists/brother/brother.dm @@ -9,6 +9,7 @@ suicide_cry = "FOR MY BROTHER!!" var/datum/team/brother_team/team antag_moodlet = /datum/mood_event/focused + hardcore_random_bonus = TRUE /datum/antagonist/brother/create_team(datum/team/brother_team/new_team) if(!new_team) @@ -98,7 +99,8 @@ continue candidates[L.mind.name] = L.mind - var/choice = input(admin,"Choose the blood brother.", "Brother") as null|anything in sort_names(candidates) + sortTim(candidates, GLOBAL_PROC_REF(cmp_text_asc)) + var/choice = tgui_input_list(admin, "Choose the blood brother.", "Brother", candidates) if(!choice) return var/datum/mind/bro = candidates[choice] diff --git a/code/modules/antagonists/changeling/cellular_emporium.dm b/code/modules/antagonists/changeling/cellular_emporium.dm index b4f3ebd204936..68e83ea25e668 100644 --- a/code/modules/antagonists/changeling/cellular_emporium.dm +++ b/code/modules/antagonists/changeling/cellular_emporium.dm @@ -28,43 +28,44 @@ ui = new(user, src, "CellularEmporium", name) ui.open() -/datum/cellular_emporium/ui_data(mob/user) +/datum/cellular_emporium/ui_static_data(mob/user) var/list/data = list() - data["can_readapt"] = changeling.can_respec - - var/genetic_points_remaining = changeling.genetic_points - data["genetic_points_remaining"] = genetic_points_remaining + var/static/list/abilities + if(isnull(abilities)) + abilities = list() + for(var/datum/action/changeling/ability_path as anything in changeling.all_powers) - var/list/abilities = list() - for(var/datum/action/changeling/ability_path as anything in changeling.all_powers) + var/dna_cost = initial(ability_path.dna_cost) - var/dna_cost = initial(ability_path.dna_cost) + if(dna_cost < 0) // 0 = free, but negatives are invalid + continue - if(dna_cost <= 0) - continue + var/list/ability_data = list() + ability_data["name"] = initial(ability_path.name) + ability_data["desc"] = initial(ability_path.desc) + ability_data["path"] = ability_path + ability_data["helptext"] = initial(ability_path.helptext) + ability_data["genetic_point_required"] = dna_cost + ability_data["absorbs_required"] = initial(ability_path.req_absorbs) // compares against changeling true_absorbs + ability_data["dna_required"] = initial(ability_path.req_dna) // compares against changeling absorbed_count - var/list/ability_data = list() - ability_data["name"] = initial(ability_path.name) - ability_data["desc"] = initial(ability_path.desc) - ability_data["path"] = ability_path - ability_data["helptext"] = initial(ability_path.helptext) - ability_data["owned"] = !!changeling.purchased_powers[ability_path] - ability_data["dna_cost"] = dna_cost + abilities += list(ability_data) - var/can_purchase = TRUE - if(initial(ability_path.req_absorbs) > changeling.true_absorbs) - can_purchase = FALSE - if(initial(ability_path.req_dna) > changeling.absorbed_count) - can_purchase = FALSE - if(dna_cost > genetic_points_remaining) - can_purchase = FALSE + // Sorts abilities alphabetically by default + sortTim(abilities, /proc/cmp_assoc_list_name) - ability_data["can_purchase"] = can_purchase + data["abilities"] = abilities + return data - abilities += list(ability_data) +/datum/cellular_emporium/ui_data(mob/user) + var/list/data = list() - data["abilities"] = abilities + data["can_readapt"] = changeling.can_respec + data["owned_abilities"] = assoc_to_keys(changeling.purchased_powers) + data["genetic_points_count"] = changeling.genetic_points + data["absorb_count"] = changeling.true_absorbs + data["dna_count"] = changeling.absorbed_count return data @@ -77,33 +78,29 @@ if("readapt") if(changeling.can_respec) changeling.readapt() + if("evolve") - var/sting_path = text2path(params["path"]) - if(!ispath(sting_path, /datum/action/changeling)) - return - changeling.purchase_power(sting_path) + // purchase_power sanity checks stuff like typepath, DNA, and absorbs for us. + changeling.purchase_power(text2path(params["path"])) return TRUE -/datum/action/innate/cellular_emporium +/datum/action/cellular_emporium name = "Cellular Emporium" button_icon = 'icons/obj/drinks/soda.dmi' button_icon_state = "changelingsting" background_icon_state = "bg_changeling" overlay_icon_state = "bg_changeling_border" - /// The cell emporium we open. - var/datum/cellular_emporium/cellular_emporium + check_flags = NONE -/datum/action/innate/cellular_emporium/New(our_target) +/datum/action/cellular_emporium/New(Target) . = ..() - if(istype(our_target, /datum/cellular_emporium)) - cellular_emporium = our_target - else - CRASH("cellular_emporium action created with non emporium") + if(!istype(Target, /datum/cellular_emporium)) + stack_trace("cellular_emporium action created with non-emporium.") + qdel(src) -/datum/action/innate/cellular_emporium/Destroy() - cellular_emporium = null - return ..() - -/datum/action/innate/cellular_emporium/Activate() - cellular_emporium.ui_interact(owner) +/datum/action/cellular_emporium/Trigger(trigger_flags) + . = ..() + if(!.) + return + target.ui_interact(owner) diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index 1eee43d620f0f..171468e3d7e49 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -11,6 +11,9 @@ hijack_speed = 0.5 ui_name = "AntagInfoChangeling" suicide_cry = "FOR THE HIVE!!" + can_assign_self_objectives = TRUE + default_custom_objective = "Consume the station's most valuable genomes." + hardcore_random_bonus = TRUE /// Whether to give this changeling objectives or not var/give_objectives = TRUE /// Weather we assign objectives which compete with other lings @@ -62,7 +65,7 @@ /// A reference to our cellular emporium datum. var/datum/cellular_emporium/cellular_emporium /// A reference to our cellular emporium action (which opens the UI for the datum). - var/datum/action/innate/cellular_emporium/emporium_action + var/datum/action/cellular_emporium/emporium_action /// UI displaying how many chems we have var/atom/movable/screen/ling/chems/lingchemdisplay @@ -123,7 +126,7 @@ create_initial_profile() if(give_objectives) forge_objectives() - owner.current.grant_all_languages(FALSE, FALSE, TRUE) //Grants omnitongue. We are able to transform our body after all. + owner.current.get_language_holder().omnitongue = TRUE owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ling_alert.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) return ..() @@ -143,23 +146,26 @@ 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) else RegisterSignal(living_mob, COMSIG_MOB_HUD_CREATED, PROC_REF(on_hud_created)) + make_brain_decoy(living_mob) + +/datum/antagonist/changeling/proc/make_brain_decoy(mob/living/ling) + var/obj/item/organ/internal/brain/our_ling_brain = ling.get_organ_slot(ORGAN_SLOT_BRAIN) + if(isnull(our_ling_brain) || our_ling_brain.decoy_override) + return + // Brains are optional for lings. - var/obj/item/organ/internal/brain/our_ling_brain = living_mob.get_organ_slot(ORGAN_SLOT_BRAIN) - if(our_ling_brain) - our_ling_brain.organ_flags &= ~ORGAN_VITAL - our_ling_brain.decoy_override = TRUE + // This is automatically cleared if the ling is. + our_ling_brain.AddComponent(/datum/component/ling_decoy_brain, src) /datum/antagonist/changeling/proc/generate_name() var/honorific @@ -182,12 +188,10 @@ var/datum/hud/ling_hud = owner.current.hud_used - lingchemdisplay = new - lingchemdisplay.hud = ling_hud + lingchemdisplay = new(null, ling_hud) ling_hud.infodisplay += lingchemdisplay - lingstingdisplay = new - lingstingdisplay.hud = ling_hud + lingstingdisplay = new(null, ling_hud) ling_hud.infodisplay += lingstingdisplay ling_hud.show_hud(ling_hud.hud_version) @@ -205,15 +209,10 @@ QDEL_NULL(lingchemdisplay) QDEL_NULL(lingstingdisplay) + // The old body's brain still remains a decoy, I guess? + /datum/antagonist/changeling/on_removal() remove_changeling_powers(include_innate = TRUE) - if(!iscarbon(owner.current)) - return - var/mob/living/carbon/carbon_owner = owner.current - var/obj/item/organ/internal/brain/not_ling_brain = carbon_owner.get_organ_slot(ORGAN_SLOT_BRAIN) - if(not_ling_brain && (not_ling_brain.decoy_override != initial(not_ling_brain.decoy_override))) - not_ling_brain.organ_flags |= ORGAN_VITAL - not_ling_brain.decoy_override = FALSE return ..() /datum/antagonist/changeling/farewell() @@ -229,11 +228,11 @@ /* * Instantiate all the default actions of a ling (transform, dna sting, absorb, etc) - * Any Changeling action with `dna_cost == 0` will be added here automatically + * Any Changeling action with dna_cost = CHANGELING_POWER_INNATE will be added here automatically */ /datum/antagonist/changeling/proc/create_innate_actions() for(var/datum/action/changeling/path as anything in all_powers) - if(initial(path.dna_cost) != 0) + if(initial(path.dna_cost) != CHANGELING_POWER_INNATE) continue var/datum/action/changeling/innate_ability = new path() @@ -262,23 +261,29 @@ /datum/antagonist/changeling/proc/on_life(datum/source, seconds_per_tick, times_fired) SIGNAL_HANDLER + var/delta_time = DELTA_WORLD_TIME(SSmobs) + // If dead, we only regenerate up to half chem storage. if(owner.current.stat == DEAD) - adjust_chemicals((chem_recharge_rate - chem_recharge_slowdown) * seconds_per_tick, total_chem_storage * 0.5) + adjust_chemicals((chem_recharge_rate - chem_recharge_slowdown) * delta_time, total_chem_storage * 0.5) // If we're not dead - we go up to the full chem cap. else - adjust_chemicals((chem_recharge_rate - chem_recharge_slowdown) * seconds_per_tick) + adjust_chemicals((chem_recharge_rate - chem_recharge_slowdown) * delta_time) /** - * Signal proc for [COMSIG_LIVING_POST_FULLY_HEAL], getting admin-healed restores our chemicals. + * Signal proc for [COMSIG_LIVING_POST_FULLY_HEAL] */ -/datum/antagonist/changeling/proc/on_fullhealed(datum/source, heal_flags) +/datum/antagonist/changeling/proc/on_fullhealed(mob/living/source, heal_flags) SIGNAL_HANDLER + // Aheal restores all chemicals if(heal_flags & HEAL_ADMIN) adjust_chemicals(INFINITY) + // Makes sure the brain, if recreated, is a decoy as expected + make_brain_decoy(source) + /** * Signal proc for [COMSIG_MOB_MIDDLECLICKON] and [COMSIG_MOB_ALTCLICKON]. * Allows the changeling to sting people with a click. @@ -359,8 +364,8 @@ * [sting_path] - the power that's being purchased / evolved. */ /datum/antagonist/changeling/proc/purchase_power(datum/action/changeling/sting_path) - if(!ispath(sting_path)) - CRASH("Changeling purchase_power attempted to purchase an invalid typepath!") + if(!ispath(sting_path, /datum/action/changeling)) + CRASH("Changeling purchase_power attempted to purchase an invalid typepath! (got: [sting_path])") if(purchased_powers[sting_path]) to_chat(owner.current, span_warning("We have already evolved this ability!")) @@ -482,7 +487,7 @@ if(verbose) to_chat(user, span_warning("We already have this DNA in storage!")) return FALSE - if(NO_DNA_COPY in target.dna.species?.species_traits) + if(HAS_TRAIT(target, TRAIT_NO_DNA_COPY)) if(verbose) to_chat(user, span_warning("[target] is not compatible with our biology.")) return FALSE @@ -648,10 +653,6 @@ add_new_profile(owner.current) /datum/antagonist/changeling/forge_objectives() - //OBJECTIVES - random traitor objectives. Unique objectives "steal brain" and "identity theft". - //No escape alone because changelings aren't suited for it and it'd probably just lead to rampant robusting - //If it seems like they'd be able to do it in play, add a 10% chance to have to escape alone - var/escape_objective_possible = TRUE switch(competitive_objectives ? rand(1,3) : 1) @@ -768,8 +769,7 @@ chosen_dna.transfer_identity(user, TRUE) for(var/obj/item/bodypart/limb as anything in user.bodyparts) - if(IS_ORGANIC_LIMB(limb)) - limb.update_limb(is_creating = TRUE) + limb.update_limb(is_creating = TRUE) user.updateappearance(mutcolor_update = TRUE) user.domutcheck() @@ -849,7 +849,7 @@ flesh_id.hud_icon = chosen_profile.id_icon if(equip) - user.equip_to_slot_or_del(new_flesh_item, slot2slot[slot]) + user.equip_to_slot_or_del(new_flesh_item, slot2slot[slot], indirect_action = TRUE) if(!QDELETED(new_flesh_item)) ADD_TRAIT(new_flesh_item, TRAIT_NODROP, CHANGELING_TRAIT) @@ -859,6 +859,7 @@ attempted_fake_scar.fake = TRUE user.regenerate_icons() + user.name = user.get_visible_name() current_profile = chosen_profile // Changeling profile themselves. Store a data to store what every DNA instance looked like. @@ -971,11 +972,9 @@ if(objectives.len) var/count = 1 for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - parts += "Objective #[count]: [objective.explanation_text] [span_greentext("Success!
    ")]" - else - parts += "Objective #[count]: [objective.explanation_text] [span_redtext("Fail.")]" + if(!objective.check_completion()) changeling_win = FALSE + parts += "Objective #[count]: [objective.explanation_text] [objective.get_roundend_success_suffix()]" count++ if(changeling_win) diff --git a/code/modules/antagonists/changeling/changeling_power.dm b/code/modules/antagonists/changeling/changeling_power.dm index 96cad51073559..f4949306dedc8 100644 --- a/code/modules/antagonists/changeling/changeling_power.dm +++ b/code/modules/antagonists/changeling/changeling_power.dm @@ -7,17 +7,33 @@ background_icon_state = "bg_changeling" overlay_icon_state = "bg_changeling_border" button_icon = 'icons/mob/actions/actions_changeling.dmi' - var/needs_button = TRUE//for passive abilities like hivemind that dont need a button - var/helptext = "" // Details - var/chemical_cost = 0 // negative chemical cost is for passive abilities (chemical glands) - var/dna_cost = -1 //cost of the sting in dna points. 0 = auto-purchase (see changeling.dm), -1 = cannot be purchased - var/req_dna = 0 //amount of dna needed to use this ability. Changelings always have atleast 1 - var/req_human = FALSE //if you need to be human to use this ability - var/req_absorbs = 0 //similar to req_dna, but only gained from absorbing, not DNA sting - ///Maximum stat before the ability is blocked. For example, `UNCONSCIOUS` prevents it from being used when in hard crit or dead, while `DEAD` allows the ability to be used on any stat values. + /// For passive abilities like hivemind that dont need an action button + var/needs_button = TRUE + /// Details displayed in fine print within the changling emporium + var/helptext = "" + /// How many changeling chems it costs to use + var/chemical_cost = 0 + /** + * Cost of the ability in dna points, negative values are not valid + * + * Special numbers include [CHANGELING_POWER_INNATE], which are given to changeling for free without bring prompted + * and [CHANGELING_POWER_UNOBTAINABLE], which are not available for purchase in the changeling emporium + */ + var/dna_cost = CHANGELING_POWER_UNOBTAINABLE + /// Amount of dna needed to use this ability. Note, changelings always have atleast 1 + var/req_dna = 0 + /// If you need to be humanoid to use this ability (disincludes monkeys) + var/req_human = FALSE + /// Similar to req_dna, but only gained from absorbing, not DNA sting + var/req_absorbs = 0 + /// Maximum stat before the ability is blocked. + /// For example, `UNCONSCIOUS` prevents it from being used when in hard crit or dead, + /// while `DEAD` allows the ability to be used on any stat values. var/req_stat = CONSCIOUS - var/ignores_fakedeath = FALSE // usable with the FAKEDEATH flag - var/active = FALSE//used by a few powers that toggle + /// usable when the changeling is in death coma + var/ignores_fakedeath = FALSE + /// used by a few powers that toggle + var/active = FALSE /* changeling code now relies on on_purchase to grant powers. @@ -59,6 +75,7 @@ the same goes for Remove(). if you override Remove(), call parent or else your p return FALSE /datum/action/changeling/proc/sting_action(mob/living/user, mob/living/target) + SHOULD_CALL_PARENT(TRUE) SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) return FALSE diff --git a/code/modules/antagonists/changeling/headslug_eggs.dm b/code/modules/antagonists/changeling/headslug_eggs.dm index 08733a7e6af0d..e4327aa3ed1e4 100644 --- a/code/modules/antagonists/changeling/headslug_eggs.dm +++ b/code/modules/antagonists/changeling/headslug_eggs.dm @@ -37,7 +37,7 @@ changeling_datum.regain_powers() owner.investigate_log("has been gibbed by a changeling egg burst.", INVESTIGATE_DEATHS) - owner.gib() + owner.gib(DROP_ALL_REMAINS) qdel(src) #undef EGG_INCUBATION_TIME diff --git a/code/modules/antagonists/changeling/powers/absorb.dm b/code/modules/antagonists/changeling/powers/absorb.dm index 9a295fc8ac204..1fdb50a7babf7 100644 --- a/code/modules/antagonists/changeling/powers/absorb.dm +++ b/code/modules/antagonists/changeling/powers/absorb.dm @@ -3,7 +3,7 @@ desc = "Absorb the DNA of our victim. Requires us to strangle them." button_icon_state = "absorb_dna" chemical_cost = 0 - dna_cost = 0 + dna_cost = CHANGELING_POWER_INNATE req_human = TRUE ///if we're currently absorbing, used for sanity var/is_absorbing = FALSE @@ -28,6 +28,8 @@ return changeling.can_absorb_dna(target) /datum/action/changeling/absorb_dna/sting_action(mob/owner) + SHOULD_CALL_PARENT(FALSE) // the only reason to call parent is for proper blackbox logging, and we do that ourselves in a snowflake way + var/datum/antagonist/changeling/changeling = owner.mind.has_antag_datum(/datum/antagonist/changeling) var/mob/living/carbon/human/target = owner.pulling is_absorbing = TRUE @@ -95,31 +97,14 @@ //Some of target's recent speech, so the changeling can attempt to imitate them better. //Recent as opposed to all because rounds tend to have a LOT of text. - var/list/recent_speech = list() - var/list/say_log = list() - var/log_source = target.logging - for(var/log_type in log_source) - var/nlog_type = text2num(log_type) - if(nlog_type & LOG_SAY) - var/list/reversed = log_source[log_type] - if(islist(reversed)) - say_log = reverse_range(reversed.Copy()) - break - - if(LAZYLEN(say_log) > LING_ABSORB_RECENT_SPEECH) - recent_speech = say_log.Copy(say_log.len-LING_ABSORB_RECENT_SPEECH+1,0) //0 so len-LING_ARS+1 to end of list - else - for(var/spoken_memory in say_log) - if(recent_speech.len >= LING_ABSORB_RECENT_SPEECH) - break - recent_speech[spoken_memory] = splittext(say_log[spoken_memory], "\"", 1, 0, TRUE)[3] + var/list/recent_speech = target.copy_recent_speech() if(recent_speech.len) changeling.antag_memory += "Some of [target]'s speech patterns, we should study these to better impersonate [target.p_them()]!
    " to_chat(owner, span_boldnotice("Some of [target]'s speech patterns, we should study these to better impersonate [target.p_them()]!")) for(var/spoken_memory in recent_speech) - changeling.antag_memory += "\"[recent_speech[spoken_memory]]\"
    " - to_chat(owner, span_notice("\"[recent_speech[spoken_memory]]\"")) + changeling.antag_memory += "\"[spoken_memory]\"
    " + to_chat(owner, span_notice("\"[spoken_memory]\"")) changeling.antag_memory += "We have no more knowledge of [target]'s speech patterns.
    " to_chat(owner, span_boldnotice("We have no more knowledge of [target]'s speech patterns.")) diff --git a/code/modules/antagonists/changeling/powers/augmented_eyesight.dm b/code/modules/antagonists/changeling/powers/augmented_eyesight.dm index de10b27413a80..b4de878c69eed 100644 --- a/code/modules/antagonists/changeling/powers/augmented_eyesight.dm +++ b/code/modules/antagonists/changeling/powers/augmented_eyesight.dm @@ -3,50 +3,81 @@ /datum/action/changeling/augmented_eyesight name = "Augmented Eyesight" - desc = "Creates more light sensing rods in our eyes, allowing our vision to penetrate most blocking objects. Protects our vision from flashes while inactive." - helptext = "Grants us x-ray vision or flash protection. We will become a lot more vulnerable to flash-based devices while x-ray vision is active." + desc = "Creates more light sensing rods in our eyes, allowing our vision to penetrate most blocking objects. \ + Protects our vision from flashes while inactive." + helptext = "Grants us x-ray vision or flash protection. \ + We will become a lot more vulnerable to flash-based devices while x-ray vision is active." button_icon_state = "augmented_eyesight" chemical_cost = 0 - dna_cost = 2 //Would be 1 without thermal vision + dna_cost = 2 + // Active = Flash weakness and x-ray + // Inactive = Flash protection and no x-ray active = FALSE /datum/action/changeling/augmented_eyesight/on_purchase(mob/user) //The ability starts inactive, so we should be protected from flashes. - ..() - var/obj/item/organ/internal/eyes/E = user.get_organ_slot(ORGAN_SLOT_EYES) - if (E) - E.flash_protect = FLASH_PROTECTION_WELDER //Adjust the user's eyes' flash protection - to_chat(user, "We adjust our eyes to protect them from bright lights.") - else - to_chat(user, "We can't adjust our eyes if we don't have any!") + . = ..() + var/obj/item/organ/internal/eyes/ling_eyes = user.get_organ_slot(ORGAN_SLOT_EYES) + RegisterSignal(user, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(eye_implanted)) + RegisterSignal(user, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(eye_removed)) + if(!isnull(ling_eyes)) + ling_eyes.flash_protect = FLASH_PROTECTION_WELDER //Adjust the user's eyes' flash protection + to_chat(user, span_changeling("We adjust our eyes to protect them from bright lights.")) /datum/action/changeling/augmented_eyesight/sting_action(mob/living/carbon/user) if(!istype(user)) - return + return FALSE + + var/obj/item/organ/internal/eyes/ling_eyes = user.get_organ_slot(ORGAN_SLOT_EYES) + if(isnull(ling_eyes)) + user.balloon_alert(user, "no eyes!") + return FALSE + ..() - var/obj/item/organ/internal/eyes/E = user.get_organ_slot(ORGAN_SLOT_EYES) - if(E) - if(!active) - E.sight_flags |= SEE_MOBS | SEE_OBJS | SEE_TURFS //Add sight flags to the user's eyes - E.flash_protect = FLASH_PROTECTION_SENSITIVE //Adjust the user's eyes' flash protection - to_chat(user, "We adjust our eyes to sense prey through walls.") - active = TRUE //Defined in code/modules/spells/spell.dm - else - E.sight_flags ^= SEE_MOBS | SEE_OBJS | SEE_TURFS //Remove sight flags from the user's eyes - E.flash_protect = FLASH_PROTECTION_WELDER //Adjust the user's eyes' flash protection - to_chat(user, "We adjust our eyes to protect them from bright lights.") - active = FALSE - user.update_sight() + + if(active) + active = FALSE + REMOVE_TRAIT(user, TRAIT_XRAY_VISION, REF(src)) + ling_eyes.flash_protect = FLASH_PROTECTION_WELDER + to_chat(user, span_changeling("We adjust our eyes to protect them from bright lights.")) + else - user.balloon_alert(user, "no eyes!") + active = TRUE + ADD_TRAIT(user, TRAIT_XRAY_VISION, REF(src)) + ling_eyes.flash_protect = FLASH_PROTECTION_SENSITIVE + to_chat(user, span_changeling("We adjust our eyes to sense prey through walls.")) + + user.update_sight() return TRUE +/datum/action/changeling/augmented_eyesight/Remove(mob/user) + var/obj/item/organ/internal/eyes/ling_eyes = user.get_organ_slot(ORGAN_SLOT_EYES) + if(!isnull(ling_eyes)) + ling_eyes.flash_protect = initial(ling_eyes.flash_protect) -/datum/action/changeling/augmented_eyesight/Remove(mob/user) //Get rid of x-ray vision and flash protection when the user refunds this ability - var/obj/item/organ/internal/eyes/E = user.get_organ_slot(ORGAN_SLOT_EYES) - if(E) - if (active) - E.sight_flags ^= SEE_MOBS | SEE_OBJS | SEE_TURFS - else - E.flash_protect = FLASH_PROTECTION_NONE - user.update_sight() - ..() + REMOVE_TRAIT(user, TRAIT_XRAY_VISION, REF(src)) + user.update_sight() + + UnregisterSignal(user, list(COMSIG_CARBON_GAIN_ORGAN, COMSIG_CARBON_LOSE_ORGAN)) + return ..() + +/// Signal proc to grant the correct level of flash sensitivity +/datum/action/changeling/augmented_eyesight/proc/eye_implanted(mob/living/source, obj/item/organ/gained, special) + SIGNAL_HANDLER + + var/obj/item/organ/internal/eyes/ling_eyes = gained + if(!istype(ling_eyes)) + return + if(active) + ling_eyes.flash_protect = FLASH_PROTECTION_SENSITIVE + else + ling_eyes.flash_protect = FLASH_PROTECTION_WELDER + +/// Signal proc to remove flash sensitivity when the eyes are removed +/datum/action/changeling/augmented_eyesight/proc/eye_removed(mob/living/source, obj/item/organ/removed, special) + SIGNAL_HANDLER + + var/obj/item/organ/internal/eyes/ling_eyes = removed + if(!istype(ling_eyes)) + return + ling_eyes.flash_protect = initial(ling_eyes.flash_protect) + // We don't need to bother about removing or adding x-ray vision, fortunately, because they can't see anyways diff --git a/code/modules/antagonists/changeling/powers/biodegrade.dm b/code/modules/antagonists/changeling/powers/biodegrade.dm index 16bd707831b29..eba507ad5e079 100644 --- a/code/modules/antagonists/changeling/powers/biodegrade.dm +++ b/code/modules/antagonists/changeling/powers/biodegrade.dm @@ -8,11 +8,6 @@ req_human = TRUE /datum/action/changeling/biodegrade/sting_action(mob/living/carbon/human/user) - var/used = FALSE // only one form of shackles removed per use - if(!HAS_TRAIT(user, TRAIT_RESTRAINED) && !user.legcuffed && isopenturf(user.loc)) - user.balloon_alert(user, "already free!") - return FALSE - if(user.handcuffed) var/obj/O = user.get_item_by_slot(ITEM_SLOT_HANDCUFFED) if(!istype(O)) @@ -21,7 +16,9 @@ span_warning("We vomit acidic ooze onto our restraints!")) addtimer(CALLBACK(src, PROC_REF(dissolve_handcuffs), user, O), 30) - used = TRUE + log_combat(user, user.handcuffed, "melted handcuffs", addition = "(biodegrade)") + ..() + return TRUE if(user.legcuffed) var/obj/O = user.get_item_by_slot(ITEM_SLOT_LEGCUFFED) @@ -31,37 +28,45 @@ span_warning("We vomit acidic ooze onto our restraints!")) addtimer(CALLBACK(src, PROC_REF(dissolve_legcuffs), user, O), 30) - used = TRUE + log_combat(user, user.legcuffed, "melted legcuffs", addition = "(biodegrade)") + ..() + return TRUE - if(user.wear_suit && user.wear_suit.breakouttime && !used) + if(user.wear_suit?.breakouttime) var/obj/item/clothing/suit/S = user.get_item_by_slot(ITEM_SLOT_OCLOTHING) if(!istype(S)) return FALSE user.visible_message(span_warning("[user] vomits a glob of acid across the front of [user.p_their()] [S]!"), \ - span_warning("We vomit acidic ooze onto our straight jacket!")) + span_warning("We vomit acidic ooze onto our [user.wear_suit.name]!")) addtimer(CALLBACK(src, PROC_REF(dissolve_straightjacket), user, S), 30) - used = TRUE - + log_combat(user, user.wear_suit, "melted [user.wear_suit]", addition = "(biodegrade)") + ..() + return TRUE - if(istype(user.loc, /obj/structure/closet) && !used) + if(istype(user.loc, /obj/structure/closet)) var/obj/structure/closet/C = user.loc if(!istype(C)) return FALSE C.visible_message(span_warning("[C]'s hinges suddenly begin to melt and run!")) 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 + log_combat(user, user.loc, "melted locker", addition = "(biodegrade)") + ..() + return TRUE - if(istype(user.loc, /obj/structure/spider/cocoon) && !used) + if(istype(user.loc, /obj/structure/spider/cocoon)) 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 + log_combat(user, user.loc, "melted cocoon", addition = "(biodegrade)") + ..() + return TRUE + + user.balloon_alert(user, "already free!") + return FALSE /datum/action/changeling/biodegrade/proc/dissolve_handcuffs(mob/living/carbon/human/user, obj/O) if(O && user.handcuffed == O) diff --git a/code/modules/antagonists/changeling/powers/defib_grasp.dm b/code/modules/antagonists/changeling/powers/defib_grasp.dm new file mode 100644 index 0000000000000..20ff3049c8fdd --- /dev/null +++ b/code/modules/antagonists/changeling/powers/defib_grasp.dm @@ -0,0 +1,91 @@ +/datum/action/changeling/defib_grasp + name = "Defibrillator Grasp" + desc = "We prepare ourselves while in stasis. If one of our enemies attempts to defibrillate us, \ + we will snatch their arms off and instantly finalize our stasis." + helptext = "This ability is passive, and will trigger when a defibrillator paddle is applied to our chest \ + while we are dead or in stasis. Will also stun cyborgs momentarily." + needs_button = FALSE + dna_cost = 0 + + /// Flags to pass to fully heal when we get zapped + var/heal_flags = HEAL_DAMAGE|HEAL_BODY|HEAL_STATUS|HEAL_CC_STATUS + +/datum/action/changeling/defib_grasp/on_purchase(mob/user, is_respec) + . = ..() + RegisterSignal(user, COMSIG_DEFIBRILLATOR_PRE_HELP_ZAP, PROC_REF(on_defibbed)) + +/// Signal proc for [COMSIG_DEFIBRILLATOR_PRE_HELP_ZAP]. +/datum/action/changeling/defib_grasp/proc/on_defibbed(mob/living/carbon/source, mob/living/defibber, obj/item/shockpaddles/defib) + SIGNAL_HANDLER + + if(source.stat != DEAD && !HAS_TRAIT_FROM(source, TRAIT_FAKEDEATH, CHANGELING_TRAIT)) + return + + INVOKE_ASYNC(src, PROC_REF(execute_defib), source, defibber, defib) + return COMPONENT_DEFIB_STOP + +/// Executes the defib action, causing the changeling to fully heal and get up. +/datum/action/changeling/defib_grasp/proc/execute_defib(mob/living/carbon/changeling, mob/living/defibber, obj/item/shockpaddles/defib) + remove_arms(changeling, defibber, defib) + + if(changeling.stat == DEAD) + changeling.revive(heal_flags) + else + changeling.fully_heal(heal_flags) + + changeling.buckled?.unbuckle_mob(changeling) // get us off of stasis beds please + changeling.set_resting(FALSE) + changeling.adjust_jitter(20 SECONDS) + changeling.emote("scream") + playsound(changeling, 'sound/magic/demon_consume.ogg', 50, TRUE) + + // Mimics some real defib stuff (wish this was more generalized) + playsound(defib, SFX_BODYFALL, 50, TRUE) + playsound(defib, 'sound/machines/defib_zap.ogg', 75, TRUE, -1) + playsound(defib, 'sound/machines/defib_success.ogg', 50, FALSE) // I guess + defib.shock_pulling(30, changeling) + +/// Removes the arms of the defibber if they're a carbon, and stuns them for a bit. +/// If they're a cyborg, they'll just get stunned instead. +/datum/action/changeling/defib_grasp/proc/remove_arms(mob/living/carbon/changeling, mob/living/defibber, obj/item/shockpaddles/defib) + + if(iscyborg(defibber)) + if(defibber.flash_act(affect_silicon = TRUE)) + to_chat(defibber, span_userdanger("[changeling] awakens suddenly, overloading your sensors!")) + // run default visible message regardless, no overt indication of the cyborg being overloaded to watchers + + else + defibber.Stun(4 SECONDS) // stuck defibbing + + if(iscarbon(defibber)) + var/removed_arms = 0 + var/mob/living/carbon/carbon_defibber = defibber + for(var/obj/item/bodypart/arm/limb in carbon_defibber.bodyparts) + if(limb.dismember(silent = FALSE)) + removed_arms++ + qdel(limb) + + if(removed_arms) + // OH GOOD HEAVENS + defibber.adjust_jitter(3 MINUTES) + defibber.adjust_dizzy(1 MINUTES) + defibber.adjust_stutter(1 MINUTES) + defibber.adjust_eye_blur(10 SECONDS) + defibber.emote("scream") + + changeling.visible_message( + span_bolddanger("[changeling] awakens suddenly, snatching [defib] out of [defibber]'s hands while ripping off [removed_arms >= 2 ? "" : "one of "][defibber.p_their()] arms!"), + vision_distance = COMBAT_MESSAGE_RANGE, + ignored_mobs = list(changeling, defibber), + ) + to_chat(changeling, span_changeling("The power of [defib] course through us, reviving us from our stasis! \ + With this newfound energy, we snap [removed_arms >= 2 ? "" : "one of "][defibber]'s arms off!")) + to_chat(defibber, span_userdanger("[changeling] awakens suddenly, snapping [removed_arms >= 2 ? "" : "one of "]your arms off!")) + return // no default message if we got an arm + + changeling.visible_message( + span_bolddanger("[changeling] awakens suddenly!"), + vision_distance = COMBAT_MESSAGE_RANGE, + ignored_mobs = changeling, + ) + to_chat(changeling, span_changeling("The power of [defib] course through us, reviving us from our stasis!")) diff --git a/code/modules/antagonists/changeling/powers/fakedeath.dm b/code/modules/antagonists/changeling/powers/fakedeath.dm index 40a71f6ce848a..a4b6b54de3d20 100644 --- a/code/modules/antagonists/changeling/powers/fakedeath.dm +++ b/code/modules/antagonists/changeling/powers/fakedeath.dm @@ -3,10 +3,15 @@ desc = "We fall into a stasis, allowing us to regenerate and trick our enemies. Costs 15 chemicals." button_icon_state = "fake_death" chemical_cost = 15 - dna_cost = 0 + dna_cost = CHANGELING_POWER_INNATE req_dna = 1 req_stat = DEAD ignores_fakedeath = TRUE + + /// How long it takes for revival to ready upon entering stasis. + /// The changeling can opt to stay in fakedeath for longer, though. + var/fakedeath_duration = 40 SECONDS + /// If TRUE, we're ready to revive and can click the button to heal. var/revive_ready = FALSE //Fake our own death and fully heal. You will appear to be dead but regenerate fully after a short delay. @@ -14,25 +19,79 @@ ..() if(revive_ready) INVOKE_ASYNC(src, PROC_REF(revive), user) - revive_ready = FALSE - chemical_cost = 15 - to_chat(user, span_notice("We have revived ourselves.")) - build_all_button_icons(UPDATE_BUTTON_NAME|UPDATE_BUTTON_ICON) + disable_revive(user) // this should be already called via signal, but just incase something wacky happens + + else if(enable_fakedeath(user)) + to_chat(user, span_changeling("We begin our stasis, preparing energy to arise once more.")) + else - to_chat(user, span_notice("We begin our stasis, preparing energy to arise once more.")) - user.fakedeath(CHANGELING_TRAIT) //play dead - addtimer(CALLBACK(src, PROC_REF(ready_to_regenerate), user), LING_FAKEDEATH_TIME, TIMER_UNIQUE) + stack_trace("Changeling revive failed to enter fakedeath when it should have been in a valid state to.") + return TRUE +/// Used to enable fakedeath and register relevant signals / start timers +/datum/action/changeling/fakedeath/proc/enable_fakedeath(mob/living/changeling) + if(revive_ready || HAS_TRAIT_FROM(changeling, TRAIT_DEATHCOMA, CHANGELING_TRAIT)) + return + + changeling.fakedeath(CHANGELING_TRAIT) + addtimer(CALLBACK(src, PROC_REF(ready_to_regenerate), changeling), fakedeath_duration, TIMER_UNIQUE) + // Basically, these let the ling exit stasis without giving away their ling-y-ness if revived through other means + RegisterSignal(changeling, SIGNAL_REMOVETRAIT(TRAIT_DEATHCOMA), PROC_REF(fakedeath_reset)) + RegisterSignal(changeling, COMSIG_MOB_STATCHANGE, PROC_REF(on_stat_change)) + return TRUE + +/// Sets [revive_ready] to FALSE and updates the button icons. +/// Can be called mid-revival if the process is being cancelled +/datum/action/changeling/fakedeath/proc/disable_revive(mob/living/changeling) + if(revive_ready) + chemical_cost = 15 + revive_ready = FALSE + build_all_button_icons(UPDATE_BUTTON_NAME|UPDATE_BUTTON_ICON) + + UnregisterSignal(changeling, SIGNAL_REMOVETRAIT(TRAIT_DEATHCOMA)) + UnregisterSignal(changeling, COMSIG_MOB_STATCHANGE) + +/// Sets [revive_ready] to TRUE and updates the button icons. +/datum/action/changeling/fakedeath/proc/enable_revive(mob/living/changeling) + if(revive_ready) + return + + chemical_cost = 0 + revive_ready = TRUE + build_all_button_icons(UPDATE_BUTTON_NAME|UPDATE_BUTTON_ICON) + +/// Signal proc to stop the revival process if the changeling exits their stasis early. +/datum/action/changeling/fakedeath/proc/fakedeath_reset(mob/living/source) + SIGNAL_HANDLER + + if(HAS_TRAIT_FROM(source, TRAIT_DEATHCOMA, CHANGELING_TRAIT)) + return + + disable_revive(source) + +/// Signal proc to exit fakedeath early if we're revived from being previously dead +/datum/action/changeling/fakedeath/proc/on_stat_change(mob/living/source, new_stat, old_stat) + SIGNAL_HANDLER + + if(old_stat != DEAD) + return + + source.cure_fakedeath(CHANGELING_TRAIT) + to_chat(source, span_changeling("We exit our stasis early.")) + /datum/action/changeling/fakedeath/proc/revive(mob/living/carbon/user) if(!istype(user)) return + if(!HAS_TRAIT_FROM(user, TRAIT_DEATHCOMA, CHANGELING_TRAIT)) + return user.cure_fakedeath(CHANGELING_TRAIT) // Heal all damage and some minor afflictions, var/flags_to_heal = (HEAL_DAMAGE|HEAL_BODY|HEAL_STATUS|HEAL_CC_STATUS) // but leave out limbs so we can do it specially user.revive(flags_to_heal & ~HEAL_LIMBS) + to_chat(user, span_changeling("We have revived ourselves.")) var/static/list/dont_regenerate = list(BODY_ZONE_HEAD) // headless changelings are funny if(!length(user.get_missing_limbs() - dont_regenerate)) @@ -49,17 +108,17 @@ user.regenerate_limbs(dont_regenerate) /datum/action/changeling/fakedeath/proc/ready_to_regenerate(mob/user) - if(!user?.mind) + if(QDELETED(src) || QDELETED(user)) return - var/datum/antagonist/changeling/ling = user.mind.has_antag_datum(/datum/antagonist/changeling) - if(!ling || !(src in ling.innate_powers)) + var/datum/antagonist/changeling/ling = user.mind?.has_antag_datum(/datum/antagonist/changeling) + if(QDELETED(ling) || !(src in ling.innate_powers + ling.purchased_powers)) // checking both innate and purchased for full coverage + return + if(!HAS_TRAIT_FROM(user, TRAIT_DEATHCOMA, CHANGELING_TRAIT)) return - to_chat(user, span_notice("We are ready to revive.")) - chemical_cost = 0 - revive_ready = TRUE - build_all_button_icons(UPDATE_BUTTON_NAME|UPDATE_BUTTON_ICON) + to_chat(user, span_changeling("We are ready to revive.")) + enable_revive(user) /datum/action/changeling/fakedeath/can_sting(mob/living/user) if(revive_ready) diff --git a/code/modules/antagonists/changeling/powers/headcrab.dm b/code/modules/antagonists/changeling/powers/headcrab.dm index d881111c8eef4..f608d1620b86f 100644 --- a/code/modules/antagonists/changeling/powers/headcrab.dm +++ b/code/modules/antagonists/changeling/powers/headcrab.dm @@ -35,15 +35,15 @@ user.transfer_observers_to(user_turf) // user is about to be deleted, store orbiters on the turf if(user.stat != DEAD) user.investigate_log("has been gibbed by headslug burst.", INVESTIGATE_DEATHS) - user.gib() + user.gib(DROP_ALL_REMAINS) . = TRUE - addtimer(CALLBACK(src, PROC_REF(spawn_headcrab), stored_mind, user_turf, organs), 3 SECONDS) + addtimer(CALLBACK(src, PROC_REF(spawn_headcrab), stored_mind, user_turf, organs), 1 SECONDS) /datum/action/changeling/headcrab/proc/spawn_headcrab(datum/mind/stored_mind, turf/spawn_location, list/organs) var/mob/living/basic/headslug/crab = new(spawn_location) for(var/obj/item/organ/I in organs) I.forceMove(crab) - stored_mind.transfer_to(crab) + stored_mind.transfer_to(crab, force_key_move = TRUE) spawn_location.transfer_observers_to(crab) to_chat(crab, span_warning("You burst out of the remains of your former body in a shower of gore!")) diff --git a/code/modules/antagonists/changeling/powers/lesserform.dm b/code/modules/antagonists/changeling/powers/lesserform.dm index f4aab1c896871..87bd7c7c8b669 100644 --- a/code/modules/antagonists/changeling/powers/lesserform.dm +++ b/code/modules/antagonists/changeling/powers/lesserform.dm @@ -20,7 +20,7 @@ //Transform into a monkey. /datum/action/changeling/lesserform/sting_action(mob/living/carbon/human/user) - if(!user || user.notransform) + if(!user || HAS_TRAIT(user, TRAIT_NO_TRANSFORM)) return FALSE ..() return ismonkey(user) ? unmonkey(user) : become_monkey(user) @@ -40,7 +40,6 @@ user.humanize(species = chosen_species, instant = transform_instantly) changeling.transform(user, chosen_form) - user.regenerate_icons() return TRUE /// Returns the form to transform back into, automatically selects your only profile if you only have one diff --git a/code/modules/antagonists/changeling/powers/mmi_talk.dm b/code/modules/antagonists/changeling/powers/mmi_talk.dm new file mode 100644 index 0000000000000..f68968c223e97 --- /dev/null +++ b/code/modules/antagonists/changeling/powers/mmi_talk.dm @@ -0,0 +1,140 @@ +/datum/action/changeling/mmi_talk + name = "MMI Talk" + desc = "Our decoy brain has been implanted into a Man-Machine Interface. \ + In order to maintain our secrecy, we can speak through the decoy as if a normal brain. \ + The decoy brain will relay speech it hears to you in purple." + button_icon = 'icons/obj/assemblies/assemblies.dmi' + button_icon_state = "mmi_off" + dna_cost = CHANGELING_POWER_UNOBTAINABLE + ignores_fakedeath = TRUE // Can be used while fake dead + req_stat = DEAD // Can be used while real dead too + + /** + * Reference to the brain we're talking through. + * + * Set when created via the ling decoy component. + * If the brain ends up being qdelled, this action will also be qdelled, and thus this ref is cleared. + */ + VAR_FINAL/obj/item/organ/internal/brain/brain_ref + + /// A map view of the area around the MMI. + VAR_FINAL/atom/movable/screen/map_view/mmi_view + /// The background for the MMI map view. + VAR_FINAL/atom/movable/screen/background/mmi_view_background + /// The key that the map view uses. + VAR_FINAL/mmi_view_key + /// A movement detector that updates the map view when the MMI moves around. + VAR_FINAL/datum/movement_detector/update_view_tracker + +/datum/action/changeling/mmi_talk/Destroy() + brain_ref = null + QDEL_NULL(mmi_view) + QDEL_NULL(mmi_view_background) + QDEL_NULL(update_view_tracker) + return ..() + +/datum/action/changeling/mmi_talk/Remove(mob/remove_from) + . = ..() + SStgui.close_uis(src) + +/datum/action/changeling/mmi_talk/can_sting(mob/living/user, mob/living/target) + . = ..() + if(!.) + return FALSE + // This generally shouldn't happen, but just in case + if(isnull(brain_ref)) + stack_trace("[type] can_sting was called with a null brain!") + return FALSE + if(!istype(brain_ref.loc, /obj/item/mmi)) + stack_trace("[type] can_sting was called with a brain not located in an MMI!") + return FALSE + return TRUE + +/datum/action/changeling/mmi_talk/sting_action(mob/living/user, mob/living/target) + ..() + ui_interact(user) + return TRUE + +/datum/action/changeling/mmi_talk/ui_state(mob/user) + return GLOB.always_state + +/datum/action/changeling/mmi_talk/ui_status(mob/user, datum/ui_state/state) + if(user != owner) + return UI_CLOSE + return ..() + +/datum/action/changeling/mmi_talk/ui_static_data(mob/user) + var/list/data = list() + data["mmi_view"] = mmi_view_key + return data + +/datum/action/changeling/mmi_talk/ui_interact(mob/user, datum/tgui/ui) + if(isnull(mmi_view_key)) + // it's worth noting a ling could have multiple of these actions. + mmi_view_key = "ling_mmi_[REF(src)]_view" + // Generate background + mmi_view_background = new() + mmi_view_background.assigned_map = mmi_view_key + mmi_view_background.del_on_map_removal = FALSE + mmi_view_background.fill_rect(1, 1, 5, 5) + // Generate map view + mmi_view = new() + mmi_view.generate_view(mmi_view_key) + // Generate movement detector (to update the view on MMI movement) + update_view_tracker = new(brain_ref, CALLBACK(src, PROC_REF(update_mmi_view))) + + // Shows the view to the user foremost + mmi_view.display_to(user) + user.client.register_map_obj(mmi_view_background) + update_mmi_view() + // Makes the MMI relay heard messages + if(!HAS_TRAIT_FROM(brain_ref.loc, TRAIT_HEARING_SENSITIVE, REF(src))) + var/obj/item/mmi/mmi = brain_ref.loc + mmi.become_hearing_sensitive(REF(src)) + RegisterSignal(mmi, COMSIG_MOVABLE_HEAR, PROC_REF(relay_hearing)) + // Actually open the UI + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "LingMMITalk") + ui.open() + +/datum/action/changeling/mmi_talk/ui_close(mob/user) + var/obj/item/mmi/mmi = brain_ref.loc + UnregisterSignal(mmi, COMSIG_MOVABLE_HEAR) + mmi.lose_hearing_sensitivity(REF(src)) + +/datum/action/changeling/mmi_talk/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return TRUE + + if(action != "send_mmi_message") + return FALSE + + var/obj/item/mmi/mmi = brain_ref.loc + if(mmi.brainmob.stat != CONSCIOUS) + to_chat(usr, span_warning("Our decoy brain is too damaged to speak.")) + else + // Say will perform input sanitization and such for us + mmi.brainmob.say(params["message"], sanitize = TRUE) + return TRUE + +/// Used in callbacks to update the map view when the MMI moves. +/datum/action/changeling/mmi_talk/proc/update_mmi_view() + mmi_view.vis_contents.Cut() + for(var/turf/visible_turf in view(2, get_turf(brain_ref))) + mmi_view.vis_contents += visible_turf + +/// Signal proc for [COMSIG_MOVABLE_HEAR] to relay stuff the MMI hears to the ling. +/// Not super good, but it works. +/datum/action/changeling/mmi_talk/proc/relay_hearing(obj/item/mmi/source, list/hear_args) + SIGNAL_HANDLER + + // We can likely already hear them, so do not bother + if(can_see(owner, hear_args[HEARING_SPEAKER], 7)) + return + + var/list/new_args = hear_args.Copy() + new_args[HEARING_SPANS] |= "purple" + new_args[HEARING_RANGE] = INFINITY // so we can hear it from any distance away + owner.Hear(arglist(new_args)) diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index fbbd4185e7e2f..bf4f8c2b3da3e 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -15,7 +15,7 @@ desc = "Go tell a coder if you see this" helptext = "Yell at Miauw and/or Perakp" chemical_cost = 1000 - dna_cost = -1 + dna_cost = CHANGELING_POWER_UNOBTAINABLE var/silent = FALSE var/weapon_type @@ -88,7 +88,7 @@ desc = "Go tell a coder if you see this" helptext = "Yell at Miauw and/or Perakp" chemical_cost = 1000 - dna_cost = -1 + dna_cost = CHANGELING_POWER_UNOBTAINABLE var/helmet_type = /obj/item var/suit_type = /obj/item @@ -192,8 +192,9 @@ 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") sharpness = SHARP_EDGED - wound_bonus = -20 - bare_wound_bonus = 20 + wound_bonus = 10 + bare_wound_bonus = 10 + armour_penetration = 35 var/can_drop = FALSE var/fake = FALSE @@ -277,6 +278,7 @@ flags_1 = NONE w_class = WEIGHT_CLASS_HUGE slot_flags = NONE + antimagic_flags = NONE pinless = TRUE ammo_type = /obj/item/ammo_casing/magic/tentacle fire_sound = 'sound/effects/splat.ogg' diff --git a/code/modules/antagonists/changeling/powers/panacea.dm b/code/modules/antagonists/changeling/powers/panacea.dm index 5c3bcd6da77d2..68689ee65d4dc 100644 --- a/code/modules/antagonists/changeling/powers/panacea.dm +++ b/code/modules/antagonists/changeling/powers/panacea.dm @@ -13,7 +13,9 @@ ..() var/list/bad_organs = list( user.get_organ_by_type(/obj/item/organ/internal/body_egg), - user.get_organ_by_type(/obj/item/organ/internal/zombie_infection)) + user.get_organ_by_type(/obj/item/organ/internal/legion_tumour), + user.get_organ_by_type(/obj/item/organ/internal/zombie_infection), + ) for(var/o in bad_organs) var/obj/item/organ/O = o @@ -23,7 +25,7 @@ O.Remove(user) if(iscarbon(user)) var/mob/living/carbon/C = user - C.vomit(0) + C.vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = 0) O.forceMove(get_turf(user)) user.reagents.add_reagent(/datum/reagent/medicine/mutadone, 10) diff --git a/code/modules/antagonists/changeling/powers/regenerate.dm b/code/modules/antagonists/changeling/powers/regenerate.dm index 3716a0b40cb03..a83adade98d60 100644 --- a/code/modules/antagonists/changeling/powers/regenerate.dm +++ b/code/modules/antagonists/changeling/powers/regenerate.dm @@ -4,7 +4,7 @@ helptext = "Will alert nearby crew if any external limbs are regenerated. Can be used while unconscious." button_icon_state = "regenerate" chemical_cost = 10 - dna_cost = 0 + dna_cost = CHANGELING_POWER_INNATE req_stat = HARD_CRIT /datum/action/changeling/regenerate/sting_action(mob/living/user) @@ -15,22 +15,16 @@ ..() to_chat(user, span_notice("You feel an itching, both inside and outside as your tissues knit and reknit.")) var/mob/living/carbon/carbon_user = user - if(length(carbon_user.get_missing_limbs())) + var/got_limbs_back = length(carbon_user.get_missing_limbs()) >= 1 + carbon_user.fully_heal(HEAL_BODY) + // Occurs after fully heal so the ling themselves can hear the sound effects (if deaf prior) + if(got_limbs_back) playsound(user, 'sound/magic/demon_consume.ogg', 50, TRUE) carbon_user.visible_message( span_warning("[user]'s missing limbs reform, making a loud, grotesque sound!"), span_userdanger("Your limbs regrow, making a loud, crunchy sound and giving you great pain!"), span_hear("You hear organic matter ripping and tearing!"), ) - carbon_user.emote("scream") - carbon_user.fully_heal(HEAL_BODY) - - // Make sure the brain's nonvital - // Shouldn't be necessary but you can never be certain with lingcode - var/obj/item/organ/internal/brain/replacement_brain = user.get_organ_slot(ORGAN_SLOT_BRAIN) - replacement_brain.organ_flags &= ~ORGAN_VITAL - replacement_brain.decoy_override = TRUE - return TRUE diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm index f8e731e820e96..a2c7aecca0ca6 100644 --- a/code/modules/antagonists/changeling/powers/tiny_prick.dm +++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm @@ -65,47 +65,74 @@ /datum/action/changeling/sting/transformation name = "Transformation Sting" - desc = "We silently sting a human, injecting a retrovirus that forces them to transform. Costs 50 chemicals." - helptext = "The victim will transform much like a changeling would. Does not provide a warning to others. Mutations will not be transferred, and monkeys will become human." + desc = "We silently sting an organism, injecting a retrovirus that forces them to transform." + helptext = "The victim will transform much like a changeling would. \ + For complex humanoids, the transformation is temporarily, but the duration is paused while the victim is dead or in stasis. \ + For more simple humanoids, such as monkeys, the transformation is permanent. \ + Does not provide a warning to others. Mutations will not be transferred." button_icon_state = "sting_transform" - chemical_cost = 50 - dna_cost = 3 - var/datum/changeling_profile/selected_dna = null + chemical_cost = 33 // Low enough that you can sting only two people in quick succession + dna_cost = 2 + /// A reference to our active profile, which we grab DNA from + VAR_FINAL/datum/changeling_profile/selected_dna + /// Duration of the sting + var/sting_duration = 8 MINUTES + +/datum/action/changeling/sting/transformation/Grant(mob/grant_to) + . = ..() + build_all_button_icons(UPDATE_BUTTON_NAME) + +/datum/action/changeling/sting/transformation/update_button_name(atom/movable/screen/movable/action_button/button, force) + . = ..() + button.desc += " Lasts [DisplayTimeText(sting_duration)] for humans, but duration is paused while dead or in stasis." + button.desc += " Costs [chemical_cost] chemicals." + +/datum/action/changeling/sting/transformation/Destroy() + selected_dna = null + return ..() -/datum/action/changeling/sting/transformation/Trigger(trigger_flags) - var/mob/user = usr +/datum/action/changeling/sting/transformation/set_sting(mob/user) + selected_dna = null var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) - if(changeling.chosen_sting) - unset_sting(user) - return - selected_dna = changeling.select_dna() - if(!selected_dna) + var/datum/changeling_profile/new_selected_dna = changeling.select_dna() + if(QDELETED(src) || QDELETED(changeling) || QDELETED(user)) return - if(NOTRANSSTING in selected_dna.dna.species.species_traits) - user.balloon_alert(user, "incompatible DNA!") + if(!new_selected_dna || changeling.chosen_sting || selected_dna) // selected other sting or other DNA while sleeping return - ..() + selected_dna = new_selected_dna + return ..() /datum/action/changeling/sting/transformation/can_sting(mob/user, mob/living/carbon/target) . = ..() if(!.) return - if((HAS_TRAIT(target, TRAIT_HUSK)) || !iscarbon(target) || (NOTRANSSTING in target.dna.species.species_traits)) + // Similar checks here are ran to that of changeling can_absorb_dna - + // Logic being that if their DNA is incompatible with us, it's also bad for transforming + if(!iscarbon(target) \ + || !target.has_dna() \ + || HAS_TRAIT(target, TRAIT_HUSK) \ + || HAS_TRAIT(target, TRAIT_BADDNA) \ + || (HAS_TRAIT(target, TRAIT_NO_DNA_COPY) && !ismonkey(target))) // sure, go ahead, make a monk-clone user.balloon_alert(user, "incompatible DNA!") return FALSE + if(target.has_status_effect(/datum/status_effect/temporary_transformation/trans_sting)) + user.balloon_alert(user, "already transformed!") + return FALSE return TRUE -/datum/action/changeling/sting/transformation/sting_action(mob/user, mob/target) - log_combat(user, target, "stung", "transformation sting", " new identity is '[selected_dna.dna.real_name]'") - var/datum/dna/NewDNA = selected_dna.dna - - var/mob/living/carbon/C = target - . = TRUE - if(istype(C)) - C.real_name = NewDNA.real_name - NewDNA.transfer_identity(C) - C.updateappearance(mutcolor_update=1) +/datum/action/changeling/sting/transformation/sting_action(mob/living/user, mob/living/target) + var/final_duration = sting_duration + var/final_message = span_notice("We transform [target] into [selected_dna.dna.real_name].") + if(ismonkey(target)) + final_duration = INFINITY + final_message = span_warning("Our genes cry out as we transform the lesser form of [target] into [selected_dna.dna.real_name] permanently!") + if(target.apply_status_effect(/datum/status_effect/temporary_transformation/trans_sting, final_duration, selected_dna.dna)) + ..() + log_combat(user, target, "stung", "transformation sting", " new identity is '[selected_dna.dna.real_name]'") + to_chat(user, final_message) + return TRUE + return FALSE /datum/action/changeling/sting/false_armblade name = "False Armblade Sting" @@ -131,13 +158,14 @@ return TRUE /datum/action/changeling/sting/false_armblade/sting_action(mob/user, mob/target) - log_combat(user, target, "stung", object="false armblade sting") var/obj/item/held = target.get_active_held_item() if(held && !target.dropItemToGround(held)) to_chat(user, span_warning("[held] is stuck to [target.p_their()] hand, you cannot grow a false armblade over it!")) return + ..() + log_combat(user, target, "stung", object = "false armblade sting") if(ismonkey(target)) to_chat(user, span_notice("Our genes cry out as we sting [target.name]!")) @@ -173,6 +201,7 @@ return changeling.can_absorb_dna(target) /datum/action/changeling/sting/extract_dna/sting_action(mob/user, mob/living/carbon/human/target) + ..() log_combat(user, target, "stung", "extraction sting") var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) if(!changeling.has_profile_with_dna(target.dna)) @@ -188,6 +217,7 @@ dna_cost = 2 /datum/action/changeling/sting/mute/sting_action(mob/user, mob/living/carbon/target) + ..() log_combat(user, target, "stung", "mute sting") target.adjust_silence(1 MINUTES) return TRUE @@ -195,7 +225,7 @@ /datum/action/changeling/sting/blind name = "Blind Sting" desc = "We temporarily blind our victim. Costs 25 chemicals." - helptext = "This sting completely blinds a target for a short time, and leaves them with blurred vision for a long time." + helptext = "This sting completely blinds a target for a short time, and leaves them with blurred vision for a long time. Does not work if target has robotic or missing eyes." button_icon_state = "sting_blind" chemical_cost = 25 dna_cost = 1 @@ -206,6 +236,11 @@ user.balloon_alert(user, "no eyes!") return FALSE + if(IS_ROBOTIC_ORGAN(eyes)) + user.balloon_alert(user, "robotic eyes!") + return FALSE + + ..() log_combat(user, target, "stung", "blind sting") to_chat(target, span_danger("Your eyes burn horrifically!")) eyes.apply_organ_damage(eyes.maxHealth * 0.8) @@ -215,13 +250,15 @@ /datum/action/changeling/sting/lsd name = "Hallucination Sting" - desc = "We cause mass terror to our victim." - helptext = "We evolve the ability to sting a target with a powerful hallucinogenic chemical. The target does not notice they have been stung, and the effect occurs after 30 to 60 seconds." + desc = "We cause mass terror to our victim. Costs 10 chemicals." + helptext = "We evolve the ability to sting a target with a powerful hallucinogenic chemical. \ + The target does not notice they have been stung, and the effect occurs after 30 to 60 seconds." button_icon_state = "sting_lsd" chemical_cost = 10 dna_cost = 1 /datum/action/changeling/sting/lsd/sting_action(mob/user, mob/living/carbon/target) + ..() log_combat(user, target, "stung", "LSD sting") addtimer(CALLBACK(src, PROC_REF(hallucination_time), target), rand(30 SECONDS, 60 SECONDS)) return TRUE @@ -240,6 +277,7 @@ dna_cost = 2 /datum/action/changeling/sting/cryo/sting_action(mob/user, mob/target) + ..() log_combat(user, target, "stung", "cryo sting") if(target.reagents) target.reagents.add_reagent(/datum/reagent/consumable/frostoil, 30) diff --git a/code/modules/antagonists/changeling/powers/transform.dm b/code/modules/antagonists/changeling/powers/transform.dm index 256dfe62ecc63..804dd2bffaca0 100644 --- a/code/modules/antagonists/changeling/powers/transform.dm +++ b/code/modules/antagonists/changeling/powers/transform.dm @@ -3,7 +3,7 @@ desc = "We take on the appearance and voice of one we have absorbed. Costs 5 chemicals." button_icon_state = "transform" chemical_cost = 5 - dna_cost = 0 + dna_cost = CHANGELING_POWER_INNATE req_dna = 1 req_human = TRUE diff --git a/code/modules/antagonists/clown_ops/clown_weapons.dm b/code/modules/antagonists/clown_ops/clown_weapons.dm index c1f6c030d20d0..1c55e5416e247 100644 --- a/code/modules/antagonists/clown_ops/clown_weapons.dm +++ b/code/modules/antagonists/clown_ops/clown_weapons.dm @@ -1,7 +1,7 @@ /obj/item/reagent_containers/spray/waterflower/lube name = "water flower" desc = "A seemingly innocent sunflower...with a twist. A slippery twist." - icon = 'icons/obj/hydroponics/harvest.dmi' + icon = 'icons/obj/service/hydroponics/harvest.dmi' icon_state = "sunflower" inhand_icon_state = "sunflower" amount_per_transfer_from_this = 3 @@ -64,13 +64,11 @@ . = ..() create_storage(storage_type = /datum/storage/pockets/shoes) - - var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container) bananium.insert_amount_mat(BANANA_SHOES_MAX_CHARGE, /datum/material/bananium) + START_PROCESSING(SSobj, src) /obj/item/clothing/shoes/clown_shoes/banana_shoes/combat/process(seconds_per_tick) - var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container) var/bananium_amount = bananium.get_material_amount(/datum/material/bananium) if(bananium_amount < BANANA_SHOES_MAX_CHARGE) bananium.insert_amount_mat(min(BANANA_SHOES_RECHARGE_RATE * seconds_per_tick, BANANA_SHOES_MAX_CHARGE - bananium_amount), /datum/material/bananium) @@ -99,11 +97,13 @@ COOLDOWN_DECLARE(next_trombone_allowed) /obj/item/melee/energy/sword/bananium/make_transformable() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ throw_speed_on = 4, \ attack_verb_continuous_on = list("slips"), \ attack_verb_simple_on = list("slip"), \ - clumsy_check = FALSE) + clumsy_check = FALSE, \ + ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) /obj/item/melee/energy/sword/bananium/on_transform(obj/item/source, mob/user, active) @@ -114,20 +114,20 @@ * Adds or removes a slippery component, depending on whether the sword is active or not. */ /obj/item/melee/energy/sword/bananium/proc/adjust_slipperiness() - if(blade_active) + if(HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) AddComponent(/datum/component/slippery, 60, GALOSHES_DONT_HELP) else qdel(GetComponent(/datum/component/slippery)) /obj/item/melee/energy/sword/bananium/attack(mob/living/M, mob/living/user) . = ..() - if(blade_active) + if(HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) slipper.Slip(src, M) /obj/item/melee/energy/sword/bananium/throw_impact(atom/hit_atom, throwingdatum) . = ..() - if(blade_active) + if(HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) slipper.Slip(src, hit_atom) @@ -140,7 +140,7 @@ return ..() /obj/item/melee/energy/sword/bananium/suicide_act(mob/living/user) - if(!blade_active) + if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) attack_self(user) user.visible_message(span_suicide("[user] is [pick("slitting [user.p_their()] stomach open with", "falling on")] [src]! It looks like [user.p_theyre()] trying to commit seppuku, but the blade slips off of [user.p_them()] harmlessly!")) var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) @@ -172,7 +172,7 @@ * Adds or removes a slippery and boomerang component, depending on whether the shield is active or not. */ /obj/item/shield/energy/bananium/proc/adjust_comedy() - if(enabled) + if(HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) AddComponent(/datum/component/slippery, 60, GALOSHES_DONT_HELP) AddComponent(/datum/component/boomerang, throw_range+2, TRUE) else @@ -180,7 +180,7 @@ qdel(GetComponent(/datum/component/boomerang)) /obj/item/shield/energy/bananium/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - if(enabled) + if(HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) var/caught = hit_atom.hitby(src, FALSE, FALSE, throwingdatum=throwingdatum) if(iscarbon(hit_atom) && !caught)//if they are a carbon and they didn't catch it var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 7de9b5744a1fa..c2c6cce81bb7b 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -18,7 +18,7 @@ /datum/action/innate/cult/blood_magic/proc/Positioning() for(var/datum/hud/hud as anything in viewers) - var/our_view = hud.mymob?.client?.view || "15x15" + var/our_view = hud.mymob?.canon_client?.view || "15x15" var/atom/movable/screen/movable/action_button/button = viewers[hud] var/position = screen_loc_to_offset(button.screen_loc) var/list/position_list = list() @@ -81,9 +81,9 @@ return if(do_after(owner, 100 - rune*60, target = owner)) if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.bleed(40 - rune*32) - var/datum/action/innate/cult/blood_spell/new_spell = new BS(owner) + var/mob/living/carbon/human/human_owner = owner + human_owner.bleed(40 - rune*32) + var/datum/action/innate/cult/blood_spell/new_spell = new BS(owner.mind) new_spell.Grant(owner, src) spells += new_spell Positioning() @@ -322,7 +322,6 @@ charges = 5 magic_path = "/obj/item/melee/blood_magic/manipulator" - // The "magic hand" items /obj/item/melee/blood_magic name = "\improper magical aura" @@ -333,7 +332,6 @@ icon_state = "disintegrate" inhand_icon_state = "disintegrate" item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL - w_class = WEIGHT_CLASS_HUGE throwforce = 0 throw_range = 0 @@ -407,9 +405,7 @@ if(IS_CULTIST(user)) user.visible_message(span_warning("[user] holds up [user.p_their()] hand, which explodes in a flash of red light!"), \ span_cultitalic("You attempt to stun [target] with the spell!")) - - user.mob_light(_range = 3, _color = LIGHT_COLOR_BLOOD_MAGIC, _duration = 0.2 SECONDS) - + user.mob_light(range = 3, color = LIGHT_COLOR_BLOOD_MAGIC, duration = 0.2 SECONDS) if(IS_HERETIC(target)) to_chat(user, span_warning("Some force greater than you intervenes! [target] is protected by the Forgotten Gods!")) to_chat(target, span_warning("You are protected by your faith to the Forgotten Gods.")) @@ -597,7 +593,6 @@ user.visible_message(span_danger("The dark cloud recedes from what was formerly [candidate], revealing a\n [construct_class]!")) make_new_construct_from_class(construct_class, THEME_CULT, candidate, user, FALSE, T) uses-- - candidate.mmi = null qdel(candidate) channeling = FALSE else @@ -679,111 +674,116 @@ /obj/item/melee/blood_magic/manipulator/afterattack(atom/target, mob/living/carbon/human/user, proximity) if(proximity) if(ishuman(target)) - var/mob/living/carbon/human/H = target - if(HAS_TRAIT(H, TRAIT_NOBLOOD)) + var/mob/living/carbon/human/human_bloodbag = target + if(HAS_TRAIT(human_bloodbag, TRAIT_NOBLOOD)) to_chat(user,span_warning("Blood rites do not work on people with no blood!")) return - if(IS_CULTIST(H)) - if(H.stat == DEAD) + if(IS_CULTIST(human_bloodbag)) + if(human_bloodbag.stat == DEAD) to_chat(user,span_warning("Only a revive rune can bring back the dead!")) return - if(H.blood_volume < BLOOD_VOLUME_SAFE) - var/restore_blood = BLOOD_VOLUME_SAFE - H.blood_volume + if(human_bloodbag.blood_volume < BLOOD_VOLUME_SAFE) + var/restore_blood = BLOOD_VOLUME_SAFE - human_bloodbag.blood_volume if(uses*2 < restore_blood) - H.blood_volume += uses*2 + human_bloodbag.blood_volume += uses*2 to_chat(user,span_danger("You use the last of your blood rites to restore what blood you could!")) uses = 0 return ..() else - H.blood_volume = BLOOD_VOLUME_SAFE + human_bloodbag.blood_volume = 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() + to_chat(user,span_warning("Your blood rites have restored [human_bloodbag == user ? "your" : "[human_bloodbag.p_their()]"] blood to safe levels!")) + var/overall_damage = human_bloodbag.getBruteLoss() + human_bloodbag.getFireLoss() + human_bloodbag.getToxLoss() + human_bloodbag.getOxyLoss() if(overall_damage == 0) to_chat(user,span_cult("That cultist doesn't require healing!")) else var/ratio = uses/overall_damage - if(H == user) + if(human_bloodbag == user) to_chat(user,span_cult("Your blood healing is far less efficient when used on yourself!")) ratio *= 0.35 // Healing is half as effective if you can't perform a full heal uses -= round(overall_damage) // Healing is 65% more "expensive" even if you can still perform the full heal if(ratio>1) ratio = 1 uses -= round(overall_damage) - H.visible_message(span_warning("[H] is fully healed by [H == user ? "[H.p_their()]":"[H]'s"] blood magic!")) + human_bloodbag.visible_message(span_warning("[human_bloodbag] is fully healed by [human_bloodbag == user ? "[human_bloodbag.p_their()]":"[human_bloodbag]'s"] blood magic!")) else - H.visible_message(span_warning("[H] is partially healed by [H == user ? "[H.p_their()]":"[H]'s"] blood magic.")) + human_bloodbag.visible_message(span_warning("[human_bloodbag] is partially healed by [human_bloodbag == user ? "[human_bloodbag.p_their()]":"[human_bloodbag]'s"] blood magic.")) uses = 0 ratio *= -1 - H.adjustOxyLoss((overall_damage*ratio) * (H.getOxyLoss() / overall_damage), 0) - H.adjustToxLoss((overall_damage*ratio) * (H.getToxLoss() / overall_damage), 0) - H.adjustFireLoss((overall_damage*ratio) * (H.getFireLoss() / overall_damage), 0) - H.adjustBruteLoss((overall_damage*ratio) * (H.getBruteLoss() / overall_damage), 0) - H.updatehealth() - playsound(get_turf(H), 'sound/magic/staff_healing.ogg', 25) - new /obj/effect/temp_visual/cult/sparks(get_turf(H)) - user.Beam(H, icon_state="sendbeam", time = 15) + var/need_mob_update = FALSE + need_mob_update += human_bloodbag.adjustOxyLoss((overall_damage*ratio) * (human_bloodbag.getOxyLoss() / overall_damage), updating_health = FALSE) + need_mob_update += human_bloodbag.adjustToxLoss((overall_damage*ratio) * (human_bloodbag.getToxLoss() / overall_damage), updating_health = FALSE) + need_mob_update += human_bloodbag.adjustFireLoss((overall_damage*ratio) * (human_bloodbag.getFireLoss() / overall_damage), updating_health = FALSE) + need_mob_update += human_bloodbag.adjustBruteLoss((overall_damage*ratio) * (human_bloodbag.getBruteLoss() / overall_damage), updating_health = FALSE) + if(need_mob_update) + human_bloodbag.updatehealth() + playsound(get_turf(human_bloodbag), 'sound/magic/staff_healing.ogg', 25) + new /obj/effect/temp_visual/cult/sparks(get_turf(human_bloodbag)) + user.Beam(human_bloodbag, icon_state="sendbeam", time = 15) else - if(H.stat == DEAD) - to_chat(user,span_warning("[H.p_their(TRUE)] blood has stopped flowing, you'll have to find another way to extract it.")) + if(human_bloodbag.stat == DEAD) + to_chat(user,span_warning("[human_bloodbag.p_Their()] blood has stopped flowing, you'll have to find another way to extract it.")) return - if(H.has_status_effect(/datum/status_effect/speech/slurring/cult)) - to_chat(user,span_danger("[H.p_their(TRUE)] blood has been tainted by an even stronger form of blood magic, it's no use to us like this!")) + if(human_bloodbag.has_status_effect(/datum/status_effect/speech/slurring/cult)) + to_chat(user,span_danger("[human_bloodbag.p_Their()] blood has been tainted by an even stronger form of blood magic, it's no use to us like this!")) return - if(H.blood_volume > BLOOD_VOLUME_SAFE) - H.blood_volume -= 100 + if(human_bloodbag.blood_volume > BLOOD_VOLUME_SAFE) + human_bloodbag.blood_volume -= 100 uses += 50 - user.Beam(H, icon_state="drainbeam", time = 1 SECONDS) - playsound(get_turf(H), 'sound/magic/enter_blood.ogg', 50) - H.visible_message(span_danger("[user] drains some of [H]'s blood!")) - to_chat(user,span_cultitalic("Your blood rite gains 50 charges from draining [H]'s blood.")) - new /obj/effect/temp_visual/cult/sparks(get_turf(H)) + user.Beam(human_bloodbag, icon_state="drainbeam", time = 1 SECONDS) + playsound(get_turf(human_bloodbag), 'sound/magic/enter_blood.ogg', 50) + human_bloodbag.visible_message(span_danger("[user] drains some of [human_bloodbag]'s blood!")) + to_chat(user,span_cultitalic("Your blood rite gains 50 charges from draining [human_bloodbag]'s blood.")) + new /obj/effect/temp_visual/cult/sparks(get_turf(human_bloodbag)) else - to_chat(user,span_warning("[H.p_theyre(TRUE)] missing too much blood - you cannot drain [H.p_them()] further!")) + to_chat(user,span_warning("[human_bloodbag.p_Theyre()] missing too much blood - you cannot drain [human_bloodbag.p_them()] further!")) return if(isconstruct(target)) - var/mob/living/simple_animal/M = target - var/missing = M.maxHealth - M.health - if(missing) - if(uses > missing) - M.adjustHealth(-missing) - M.visible_message(span_warning("[M] is fully healed by [user]'s blood magic!")) - uses -= missing + var/mob/living/simple_animal/construct_thing = target + var/missing_health = construct_thing.maxHealth - construct_thing.health + if(missing_health) + if(uses > missing_health) + construct_thing.adjustHealth(-missing_health) + construct_thing.visible_message(span_warning("[construct_thing] is fully healed by [user]'s blood magic!")) + uses -= missing_health else - M.adjustHealth(-uses) - M.visible_message(span_warning("[M] is partially healed by [user]'s blood magic!")) + construct_thing.adjustHealth(-uses) + construct_thing.visible_message(span_warning("[construct_thing] is partially healed by [user]'s blood magic!")) uses = 0 - playsound(get_turf(M), 'sound/magic/staff_healing.ogg', 25) - user.Beam(M, icon_state="sendbeam", time = 1 SECONDS) - if(istype(target, /obj/effect/decal/cleanable/blood)) + playsound(get_turf(construct_thing), 'sound/magic/staff_healing.ogg', 25) + user.Beam(construct_thing, icon_state="sendbeam", time = 1 SECONDS) + if(istype(target, /obj/effect/decal/cleanable/blood) || istype(target, /obj/effect/decal/cleanable/trail_holder) || isturf(target)) blood_draw(target, user) ..() /obj/item/melee/blood_magic/manipulator/proc/blood_draw(atom/target, mob/living/carbon/human/user) - var/temp = 0 - 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) - if(B.bloodiness == 100) //Bonus for "pristine" bloodpools, also to prevent cheese with footprint spam - temp += 30 + var/blood_to_gain = 0 + var/turf/our_turf = get_turf(target) + if(our_turf) + for(var/obj/effect/decal/cleanable/blood/blood_around_us in range(our_turf,2)) + if(blood_around_us.blood_state == BLOOD_STATE_HUMAN) + if(blood_around_us.bloodiness == 100) //Bonus for "pristine" bloodpools, also to prevent cheese with footprint spam + blood_to_gain += 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)) - qdel(TH) - if(temp) - user.Beam(T,icon_state="drainbeam", time = 15) + blood_to_gain += max((blood_around_us.bloodiness**2)/800,1) + new /obj/effect/temp_visual/cult/turf/floor(get_turf(blood_around_us)) + qdel(blood_around_us) + for(var/obj/effect/decal/cleanable/trail_holder/trail_around_us in range(our_turf, 2)) + if(trail_around_us.blood_state == BLOOD_STATE_HUMAN) + blood_to_gain += 5 //These don't get bloodiness, so we'll just increase this by a fixed value + new /obj/effect/temp_visual/cult/turf/floor(get_turf(trail_around_us)) + qdel(trail_around_us) + if(blood_to_gain) + user.Beam(our_turf,icon_state="drainbeam", time = 15) new /obj/effect/temp_visual/cult/sparks(get_turf(user)) - playsound(T, 'sound/magic/enter_blood.ogg', 50) - to_chat(user, span_cultitalic("Your blood rite has gained [round(temp)] charge\s from blood sources around you!")) - uses += max(1, round(temp)) + playsound(our_turf, 'sound/magic/enter_blood.ogg', 50) + to_chat(user, span_cultitalic("Your blood rite has gained [round(blood_to_gain)] charge\s from blood sources around you!")) + uses += max(1, round(blood_to_gain)) /obj/item/melee/blood_magic/manipulator/attack_self(mob/living/user) if(IS_CULTIST(user)) var/static/list/spells = list( - "Bloody Halberd (150)" = image(icon = 'icons/obj/cult/items_and_weapons.dmi', icon_state = "occultpoleaxe0"), + "Bloody Halberd (150)" = image(icon = 'icons/obj/weapons/spear.dmi', icon_state = "occultpoleaxe0"), "Blood Bolt Barrage (300)" = image(icon = 'icons/obj/weapons/guns/ballistic.dmi', icon_state = "arcane_barrage"), "Blood Beam (500)" = image(icon = 'icons/obj/weapons/hand.dmi', icon_state = "disintegrate") ) @@ -812,7 +812,7 @@ if(uses < BLOOD_BARRAGE_COST) to_chat(user, span_cultitalic("You need [BLOOD_BARRAGE_COST] charges to perform this rite.")) else - var/obj/rite = new /obj/item/gun/ballistic/rifle/enchanted/arcane_barrage/blood() + var/obj/rite = new /obj/item/gun/magic/wand/arcane_barrage/blood() uses -= BLOOD_BARRAGE_COST qdel(src) if(user.put_in_hands(rite)) diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm index 49a6d2b2bdbdf..b0d877820d903 100644 --- a/code/modules/antagonists/cult/cult.dm +++ b/code/modules/antagonists/cult/cult.dm @@ -1,8 +1,3 @@ -#define SUMMON_POSSIBILITIES 3 -#define CULT_VICTORY 1 -#define CULT_LOSS 0 -#define CULT_NARSIE_KILLED -1 - /datum/antagonist/cult name = "Cultist" roundend_category = "cultists" @@ -10,47 +5,21 @@ antag_moodlet = /datum/mood_event/cult suicide_cry = "FOR NAR'SIE!!" preview_outfit = /datum/outfit/cultist - var/datum/action/innate/cult/comm/communion = new - var/datum/action/innate/cult/mastervote/vote = new - var/datum/action/innate/cult/blood_magic/magic = new job_rank = ROLE_CULTIST antag_hud_name = "cult" - var/ignore_implant = FALSE - var/give_equipment = FALSE - var/datum/team/cult/cult_team - -/datum/antagonist/cult/get_team() - return cult_team + ///The vote ability Cultists have to elect someone to be the leader. + var/datum/action/innate/cult/mastervote/vote_ability -/datum/antagonist/cult/create_team(datum/team/cult/new_team) - if(!new_team) - //todo remove this and allow admin buttons to create more than one cult - for(var/datum/antagonist/cult/H in GLOB.antagonists) - if(!H.owner) - continue - if(H.cult_team) - cult_team = H.cult_team - return - cult_team = new /datum/team/cult - cult_team.setup_objectives() - return - if(!istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - cult_team = new_team - -/datum/antagonist/cult/proc/add_objectives() - objectives |= cult_team.objectives - -/datum/antagonist/cult/Destroy() - QDEL_NULL(communion) - QDEL_NULL(vote) - return ..() + ///Boolean on whether the starting equipment should be given to their inventory. + var/give_equipment = FALSE + ///Reference to the Blood cult team they are part of. + var/datum/team/cult/cult_team /datum/antagonist/cult/can_be_owned(datum/mind/new_owner) - . = ..() - if(. && !ignore_implant) - . = is_convertable_to_cult(new_owner.current,cult_team) + if(!is_convertable_to_cult(new_owner.current, cult_team)) + return FALSE + return ..() /datum/antagonist/cult/greet() . = ..() @@ -58,115 +27,73 @@ owner.announce_objectives() /datum/antagonist/cult/on_gain() - add_objectives() + objectives |= cult_team.objectives . = ..() var/mob/living/current = owner.current if(give_equipment) equip_cultist(TRUE) - current.log_message("has been converted to the cult of Nar'Sie!", LOG_ATTACK, color="#960000") - if(cult_team.blood_target && cult_team.blood_target_image && current.client) - current.client.images += cult_team.blood_target_image + var/datum/action/innate/cult/comm/communion = new(owner) + communion.Grant(current) + if(isnull(cult_team.cult_leader_datum)) + vote_ability = new(owner) + vote_ability.Grant(current) + if(ishuman(current)) + var/datum/action/innate/cult/blood_magic/magic = new(owner) + magic.Grant(current) - ADD_TRAIT(current, TRAIT_HEALS_FROM_CULT_PYLONS, CULT_TRAIT) + current.log_message("has been converted to the cult of Nar'Sie!", LOG_ATTACK, color="#960000") /datum/antagonist/cult/on_removal() - REMOVE_TRAIT(owner.current, TRAIT_HEALS_FROM_CULT_PYLONS, CULT_TRAIT) if(!silent) owner.current.visible_message(span_deconversion_message("[owner.current] looks like [owner.current.p_theyve()] just reverted to [owner.current.p_their()] old faith!"), ignored_mobs = owner.current) to_chat(owner.current, span_userdanger("An unfamiliar white light flashes through your mind, cleansing the taint of the Geometer and all your memories as her servant.")) owner.current.log_message("has renounced the cult of Nar'Sie!", LOG_ATTACK, color="#960000") - if(cult_team.blood_target && cult_team.blood_target_image && owner.current.client) - owner.current.client.images -= cult_team.blood_target_image - - return ..() - -/datum/antagonist/cult/get_preview_icon() - var/icon/icon = render_preview_outfit(preview_outfit) - - // The longsword is 64x64, but getFlatIcon crunches to 32x32. - // So I'm just going to add it in post, screw it. - // Center the dude, because item icon states start from the center. - // This makes the image 64x64. - icon.Crop(-15, -15, 48, 48) + if(vote_ability) + QDEL_NULL(vote_ability) + for(var/datum/action/innate/cult/cult_buttons in owner.current.actions) + qdel(cult_buttons) - var/obj/item/melee/cultblade/longsword = new - icon.Blend(icon(longsword.lefthand_file, longsword.inhand_icon_state), ICON_OVERLAY) - qdel(longsword) - - // Move the guy back to the bottom left, 32x32. - icon.Crop(17, 17, 48, 48) - - return finish_preview_icon(icon) - -/datum/antagonist/cult/proc/equip_cultist(metal=TRUE) - var/mob/living/carbon/H = owner.current - if(!istype(H)) - return - . += cult_give_item(/obj/item/melee/cultblade/dagger, H) - if(metal) - . += cult_give_item(/obj/item/stack/sheet/runed_metal/ten, H) - to_chat(owner, "These will help you start the cult on this station. Use them well, and remember - you are not the only one.") - - -/datum/antagonist/cult/proc/cult_give_item(obj/item/item_path, mob/living/carbon/human/mob) - var/list/slots = list( - "backpack" = ITEM_SLOT_BACKPACK, - "left pocket" = ITEM_SLOT_LPOCKET, - "right pocket" = ITEM_SLOT_RPOCKET - ) - - var/T = new item_path(mob) - var/item_name = initial(item_path.name) - var/where = mob.equip_in_one_of_slots(T, slots) - if(!where) - to_chat(mob, span_userdanger("Unfortunately, you weren't able to get a [item_name]. This is very bad and you should adminhelp immediately (press F1).")) - return FALSE - else - to_chat(mob, span_danger("You have a [item_name] in your [where].")) - if(where == "backpack") - mob.back.atom_storage?.show_contents(mob) - return TRUE + return ..() /datum/antagonist/cult/apply_innate_effects(mob/living/mob_override) . = ..() - var/mob/living/current = owner.current - if(mob_override) - current = mob_override + var/mob/living/current = owner.current || mob_override handle_clown_mutation(current, mob_override ? null : "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") current.faction |= FACTION_CULT - current.grant_language(/datum/language/narsie, TRUE, TRUE, LANGUAGE_CULTIST) - if(!cult_team.cult_master) - vote.Grant(current) - communion.Grant(current) - if(ishuman(current)) - magic.Grant(current) + current.grant_language(/datum/language/narsie, source = LANGUAGE_CULTIST) + current.throw_alert("bloodsense", /atom/movable/screen/alert/bloodsense) + if(cult_team.blood_target && cult_team.blood_target_image && current.client) + current.client.images += cult_team.blood_target_image + if(cult_team.cult_risen) current.AddElement(/datum/element/cult_eyes, initial_delay = 0 SECONDS) if(cult_team.cult_ascendent) current.AddElement(/datum/element/cult_halo, initial_delay = 0 SECONDS) + ADD_TRAIT(current, TRAIT_HEALS_FROM_CULT_PYLONS, CULT_TRAIT) add_team_hud(current) /datum/antagonist/cult/remove_innate_effects(mob/living/mob_override) . = ..() - var/mob/living/current = owner.current - if(mob_override) - current = mob_override + var/mob/living/current = owner.current || mob_override handle_clown_mutation(current, removing = FALSE) current.faction -= FACTION_CULT - current.remove_language(/datum/language/narsie, TRUE, TRUE, LANGUAGE_CULTIST) - vote.Remove(current) - communion.Remove(current) - magic.Remove(current) + current.remove_language(/datum/language/narsie, source = LANGUAGE_CULTIST) + current.clear_alert("bloodsense") + if(cult_team.blood_target && cult_team.blood_target_image && owner.current.client) + owner.current.client.images -= cult_team.blood_target_image + if (HAS_TRAIT(current, TRAIT_UNNATURAL_RED_GLOWY_EYES)) current.RemoveElement(/datum/element/cult_eyes) if (HAS_TRAIT(current, TRAIT_CULT_HALO)) current.RemoveElement(/datum/element/cult_halo) + REMOVE_TRAIT(owner.current, TRAIT_HEALS_FROM_CULT_PYLONS, CULT_TRAIT) + /datum/antagonist/cult/on_mindshield(mob/implanter) if(!silent) to_chat(owner.current, span_warning("You feel something interfering with your mental conditioning, but you resist it!")) @@ -188,12 +115,66 @@ .["Dagger and Metal"] = CALLBACK(src, PROC_REF(admin_give_metal)) .["Remove Dagger and Metal"] = CALLBACK(src, PROC_REF(admin_take_all)) + if(is_cult_leader()) + .["Demote From Leader"] = CALLBACK(src, PROC_REF(demote_from_leader)) + else if(isnull(cult_team.cult_leader_datum)) + .["Make Cult Leader"] = CALLBACK(src, PROC_REF(make_cult_leader)) + +/datum/antagonist/cult/get_team() + return cult_team + +/datum/antagonist/cult/create_team(datum/team/cult/new_team) + if(!new_team) + //todo remove this and allow admin buttons to create more than one cult + for(var/datum/antagonist/cult/H in GLOB.antagonists) + if(!H.owner) + continue + if(H.cult_team) + cult_team = H.cult_team + return + cult_team = new /datum/team/cult + cult_team.setup_objectives() + return + if(!istype(new_team)) + stack_trace("Wrong team type passed to [type] initialization.") + cult_team = new_team + +///Equips the cultist with a dagger and runed metal. +/datum/antagonist/cult/proc/equip_cultist(metal = TRUE) + var/mob/living/carbon/H = owner.current + if(!istype(H)) + return + . += cult_give_item(/obj/item/melee/cultblade/dagger, H) + if(metal) + . += cult_give_item(/obj/item/stack/sheet/runed_metal/ten, H) + to_chat(owner, "These will help you start the cult on this station. Use them well, and remember - you are not the only one.") + +///Attempts to make a new item and put it in a potential inventory slot in the provided mob. +/datum/antagonist/cult/proc/cult_give_item(obj/item/item_path, mob/living/carbon/human/mob) + var/list/slots = list( + "backpack" = ITEM_SLOT_BACKPACK, + "left pocket" = ITEM_SLOT_LPOCKET, + "right pocket" = ITEM_SLOT_RPOCKET, + ) + + var/T = new item_path(mob) + var/item_name = initial(item_path.name) + var/where = mob.equip_in_one_of_slots(T, slots) + if(!where) + to_chat(mob, span_userdanger("Unfortunately, you weren't able to get a [item_name]. This is very bad and you should adminhelp immediately (press F1).")) + return FALSE + else + to_chat(mob, span_danger("You have a [item_name] in your [where].")) + if(where == "backpack") + mob.back.atom_storage?.show_contents(mob) + return TRUE + /datum/antagonist/cult/proc/admin_give_dagger(mob/admin) - if(!equip_cultist(metal=FALSE)) + if(!equip_cultist(metal = FALSE)) to_chat(admin, span_danger("Spawning dagger failed!")) /datum/antagonist/cult/proc/admin_give_metal(mob/admin) - if (!equip_cultist(metal=TRUE)) + if (!equip_cultist(metal = TRUE)) to_chat(admin, span_danger("Spawning runed metal failed!")) /datum/antagonist/cult/proc/admin_take_all(mob/admin) @@ -202,295 +183,120 @@ if(istype(o, /obj/item/melee/cultblade/dagger) || istype(o, /obj/item/stack/sheet/runed_metal)) qdel(o) -/datum/antagonist/cult/master - ignore_implant = TRUE - show_in_antagpanel = FALSE //Feel free to add this later +///Returns whether or not this datum is its team's leader. +/datum/antagonist/cult/proc/is_cult_leader() + return (cult_team.cult_leader_datum == src) + +///Turns this antag datum into its team's leader, assigning them their unique abilities, hud, and deathrattle. +/datum/antagonist/cult/proc/make_cult_leader() + if(cult_team.cult_leader_datum) + return FALSE + cult_team.cult_leader_datum = src + antag_hud_name = "cultmaster" - var/datum/action/innate/cult/master/finalreck/reckoning = new + add_team_hud(owner.current) + RegisterSignal(owner.current, COMSIG_MOB_STATCHANGE, PROC_REF(deathrattle)) + + if(!cult_team.reckoning_complete) + var/datum/action/innate/cult/master/finalreck/reckoning = new + reckoning.Grant(owner.current) var/datum/action/innate/cult/master/cultmark/bloodmark = new var/datum/action/innate/cult/master/pulse/throwing = new + bloodmark.Grant(owner.current) + throwing.Grant(owner.current) + owner.current.update_mob_action_buttons() -/datum/antagonist/cult/master/Destroy() - QDEL_NULL(reckoning) - QDEL_NULL(bloodmark) - QDEL_NULL(throwing) - return ..() + for(var/datum/mind/cult_mind as anything in cult_team.members) + vote_ability.Remove(cult_mind.current) + to_chat(cult_mind.current, span_cultlarge("[owner.current] has won the cult's support and is now their master. \ + Follow [owner.current.p_their()] orders to the best of your ability!")) -/datum/antagonist/cult/master/greet() - to_chat(owner.current, "You are the cult's Master. As the cult's Master, you have a unique title and loud voice when communicating, are capable of marking \ - targets, such as a location or a noncultist, to direct the cult to them, and, finally, you are capable of summoning the entire living cult to your location once. Use these abilities to direct the cult to victory at any cost.") + to_chat(owner.current, span_cultlarge("You are the cult's Master. \ + As the cult's Master, you have a unique title and loud voice when communicating, are capable of marking \ + targets, such as a location or a noncultist, to direct the cult to them, and, finally, you are capable of \ + summoning the entire living cult to your location once. Use these abilities to direct the cult \ + to victory at any cost.")) -/datum/antagonist/cult/master/apply_innate_effects(mob/living/mob_override) - . = ..() - var/mob/living/current = owner.current - if(mob_override) - current = mob_override - if(!cult_team.reckoning_complete) - reckoning.Grant(current) - bloodmark.Grant(current) - throwing.Grant(current) - current.update_mob_action_buttons() - current.apply_status_effect(/datum/status_effect/cult_master) - if(cult_team.cult_risen) - current.AddElement(/datum/element/cult_eyes, initial_delay = 0 SECONDS) - if(cult_team.cult_ascendent) - current.AddElement(/datum/element/cult_halo, initial_delay = 0 SECONDS) - add_team_hud(current, /datum/antagonist/cult) + return TRUE -/datum/antagonist/cult/master/remove_innate_effects(mob/living/mob_override) - . = ..() - var/mob/living/current = owner.current - if(mob_override) - current = mob_override - reckoning.Remove(current) - bloodmark.Remove(current) - throwing.Remove(current) - current.update_mob_action_buttons() - current.remove_status_effect(/datum/status_effect/cult_master) - -/datum/team/cult - name = "\improper Cult" - - ///The blood mark target - var/atom/blood_target - ///Image of the blood mark target - var/image/blood_target_image - ///Timer for the blood mark expiration - var/blood_target_reset_timer - - ///Has a vote been called for a leader? - var/cult_vote_called = FALSE - ///The cult leader - var/mob/living/cult_master - ///Has the mass teleport been used yet? - var/reckoning_complete = FALSE - ///Has the cult risen, and gotten red eyes? - var/cult_risen = FALSE - ///Has the cult asceneded, and gotten halos? - var/cult_ascendent = FALSE - - ///Has narsie been summoned yet? - var/narsie_summoned = FALSE - ///How large were we at max size. - var/size_at_maximum = 0 - ///list of cultists just before summoning Narsie - var/list/true_cultists = list() - -/datum/team/cult/proc/check_size() - if(cult_ascendent) - return +///Admin-only helper to demote someone from Cult leader, taking away their HUD, abilities, and deathrattle +///And gives all cultists from their team back their ability to vote for a new leader. +/datum/antagonist/cult/proc/demote_from_leader() + if(!cult_team.cult_leader_datum) + return FALSE + cult_team.cult_leader_datum = null + + antag_hud_name = initial(antag_hud_name) + add_team_hud(owner.current) + UnregisterSignal(owner.current, COMSIG_MOB_STATCHANGE) + + var/datum/action/innate/cult/master/finalreck/reckoning = locate() in owner.current.actions + if(reckoning) + reckoning.Remove(owner.current) + var/datum/action/innate/cult/master/cultmark/bloodmark = locate() in owner.current.actions + if(bloodmark) + bloodmark.Remove(owner.current) + var/datum/action/innate/cult/master/pulse/throwing = locate() in owner.current.actions + if(throwing) + throwing.Remove(owner.current) + owner.current.update_mob_action_buttons() + for(var/datum/mind/cult_mind as anything in cult_team.members) + vote_ability.Grant(cult_mind.current) + + to_chat(owner.current, span_cultlarge("You have been demoted from being the cult's Master, you are now an acolyte once more!")) - // This proc is unnecessary clutter whilst running cult related unit tests - // Remove this if, at some point, someone decides to test that halos and eyes are added at expected ratios -#ifndef UNIT_TESTS - var/alive = 0 - var/cultplayers = 0 - for(var/I in GLOB.player_list) - var/mob/M = I - if(M.stat != DEAD) - if(IS_CULTIST(M)) - ++cultplayers - else - ++alive - - ASSERT(cultplayers) //we shouldn't be here. - var/ratio = alive ? cultplayers/alive : 1 - if(ratio > CULT_RISEN && !cult_risen) - for(var/datum/mind/mind as anything in members) - if(mind.current) - SEND_SOUND(mind.current, 'sound/hallucinations/i_see_you2.ogg') - to_chat(mind.current, span_cultlarge(span_warning("The veil weakens as your cult grows, your eyes begin to glow..."))) - mind.current.AddElement(/datum/element/cult_eyes) - cult_risen = TRUE - log_game("The blood cult has risen with [cultplayers] players.") - - if(ratio > CULT_ASCENDENT && !cult_ascendent) - for(var/datum/mind/mind as anything in members) - if(mind.current) - SEND_SOUND(mind.current, 'sound/hallucinations/im_here1.ogg') - to_chat(mind.current, span_cultlarge(span_warning("Your cult is ascendent and the red harvest approaches - you cannot hide your true nature for much longer!!"))) - mind.current.AddElement(/datum/element/cult_halo) - cult_ascendent = TRUE - log_game("The blood cult has ascended with [cultplayers] players.") -#endif - -/datum/team/cult/add_member(datum/mind/new_member) - . = ..() - // A little hacky, but this checks that cult ghosts don't contribute to the size at maximum value. - if(is_unassigned_job(new_member.assigned_role)) + return TRUE + +///If dead (and Narsie isn't summoned), will alert all Cultists of their death, sending their location out. +/datum/antagonist/cult/proc/deathrattle(datum/source) + SIGNAL_HANDLER + + if(owner.current.stat != DEAD) return - size_at_maximum++ - -/datum/team/cult/proc/make_image(datum/objective/sacrifice/sac_objective) - var/datum/job/job_of_sacrifice = sac_objective.target.assigned_role - var/datum/preferences/prefs_of_sacrifice = sac_objective.target.current.client.prefs - var/icon/reshape = get_flat_human_icon(null, job_of_sacrifice, prefs_of_sacrifice, list(SOUTH)) - reshape.Shift(SOUTH, 4) - reshape.Shift(EAST, 1) - reshape.Crop(7,4,26,31) - reshape.Crop(-5,-3,26,30) - sac_objective.sac_image = reshape - -/datum/team/cult/proc/setup_objectives() - var/datum/objective/sacrifice/sacrifice_objective = new - sacrifice_objective.team = src - sacrifice_objective.find_target() - objectives += sacrifice_objective - - var/datum/objective/eldergod/summon_objective = new - summon_objective.team = src - objectives += summon_objective - -/datum/objective/sacrifice - var/sacced = FALSE - var/sac_image - -/// Unregister signals from the old target so it doesn't cause issues when sacrificed of when a new target is found. -/datum/objective/sacrifice/proc/clear_sacrifice() - if(!target) + if(!QDELETED(GLOB.cult_narsie)) return - UnregisterSignal(target, COMSIG_MIND_TRANSFERRED) - if(target.current) - UnregisterSignal(target.current, list(COMSIG_QDELETING, COMSIG_MOB_MIND_TRANSFERRED_INTO)) - target = null - -/datum/objective/sacrifice/find_target(dupe_search_range, list/blacklist) - clear_sacrifice() - if(!istype(team, /datum/team/cult)) + if(!is_cult_leader()) return - var/datum/team/cult/cult = team - var/list/target_candidates = list() - for(var/mob/living/carbon/human/player in GLOB.player_list) - if(player.mind && !player.mind.has_antag_datum(/datum/antagonist/cult) && !is_convertable_to_cult(player) && player.stat != DEAD) - target_candidates += player.mind - if(target_candidates.len == 0) - message_admins("Cult Sacrifice: Could not find unconvertible target, checking for convertible target.") - for(var/mob/living/carbon/human/player in GLOB.player_list) - if(player.mind && !player.mind.has_antag_datum(/datum/antagonist/cult) && player.stat != DEAD) - target_candidates += player.mind - list_clear_nulls(target_candidates) - if(LAZYLEN(target_candidates)) - target = pick(target_candidates) - update_explanation_text() - // Register a bunch of signals to both the target mind and its body - // to stop cult from softlocking everytime the target is deleted before being actually sacrificed. - RegisterSignal(target, COMSIG_MIND_TRANSFERRED, PROC_REF(on_mind_transfer)) - RegisterSignal(target.current, COMSIG_QDELETING, PROC_REF(on_target_body_del)) - RegisterSignal(target.current, COMSIG_MOB_MIND_TRANSFERRED_INTO, PROC_REF(on_possible_mindswap)) - else - message_admins("Cult Sacrifice: Could not find unconvertible or convertible target. WELP!") - sacced = TRUE // Prevents another hypothetical softlock. This basically means every PC is a cultist. - if(!sacced) - cult.make_image(src) - for(var/datum/mind/mind in cult.members) - if(mind.current) - mind.current.clear_alert("bloodsense") - mind.current.throw_alert("bloodsense", /atom/movable/screen/alert/bloodsense) - -/datum/objective/sacrifice/proc/on_target_body_del() - SIGNAL_HANDLER - INVOKE_ASYNC(src, PROC_REF(find_target)) -/datum/objective/sacrifice/proc/on_mind_transfer(datum/source, mob/previous_body) - SIGNAL_HANDLER - //If, for some reason, the mind was transferred to a ghost (better safe than sorry), find a new target. - if(!isliving(target.current)) - INVOKE_ASYNC(src, PROC_REF(find_target)) - return - UnregisterSignal(previous_body, list(COMSIG_QDELETING, COMSIG_MOB_MIND_TRANSFERRED_INTO)) - RegisterSignal(target.current, COMSIG_QDELETING, PROC_REF(on_target_body_del)) - RegisterSignal(target.current, COMSIG_MOB_MIND_TRANSFERRED_INTO, PROC_REF(on_possible_mindswap)) + var/area/current_area = get_area(owner.current) + for(var/datum/mind/cult_mind as anything in cult_team.members) + SEND_SOUND(cult_mind, sound('sound/hallucinations/veryfar_noise.ogg')) + to_chat(cult_mind, span_cultlarge("The Cult's Master, [owner.current.name], has fallen in \the [current_area]!")) -/datum/objective/sacrifice/proc/on_possible_mindswap(mob/source) - SIGNAL_HANDLER - UnregisterSignal(target.current, list(COMSIG_QDELETING, COMSIG_MOB_MIND_TRANSFERRED_INTO)) - //we check if the mind is bodyless only after mindswap shenanigeans to avoid issues. - addtimer(CALLBACK(src, PROC_REF(do_we_have_a_body)), 0 SECONDS) +/datum/antagonist/cult/get_preview_icon() + var/icon/icon = render_preview_outfit(preview_outfit) -/datum/objective/sacrifice/proc/do_we_have_a_body() - if(!target.current) //The player was ghosted and the mind isn't probably going to be transferred to another mob at this point. - find_target() - return - RegisterSignal(target.current, COMSIG_QDELETING, PROC_REF(on_target_body_del)) - RegisterSignal(target.current, COMSIG_MOB_MIND_TRANSFERRED_INTO, PROC_REF(on_possible_mindswap)) + // The longsword is 64x64, but getFlatIcon crunches to 32x32. + // So I'm just going to add it in post, screw it. -/datum/objective/sacrifice/check_completion() - return sacced || completed + // Center the dude, because item icon states start from the center. + // This makes the image 64x64. + icon.Crop(-15, -15, 48, 48) -/datum/objective/sacrifice/update_explanation_text() - if(target) - explanation_text = "Sacrifice [target], the [target.assigned_role.title] via invoking an Offer rune with [target.p_them()] on it and three acolytes around it." - else - explanation_text = "The veil has already been weakened here, proceed to the final objective." - -/datum/objective/eldergod - var/summoned = FALSE - var/killed = FALSE - var/list/summon_spots = list() - -/datum/objective/eldergod/New() - ..() - var/sanity = 0 - while(summon_spots.len < SUMMON_POSSIBILITIES && sanity < 100) - 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++ - update_explanation_text() - -/datum/objective/eldergod/update_explanation_text() - explanation_text = "Summon Nar'Sie by invoking the rune 'Summon Nar'Sie'. The summoning can only be accomplished in [english_list(summon_spots)] - where the veil is weak enough for the ritual to begin." - -/datum/objective/eldergod/check_completion() - if(killed) - return CULT_NARSIE_KILLED // You failed so hard that even the code went backwards. - return summoned || completed - -/datum/team/cult/proc/check_cult_victory() - for(var/datum/objective/O in objectives) - if(O.check_completion() == CULT_NARSIE_KILLED) - return CULT_NARSIE_KILLED - else if(!O.check_completion()) - return CULT_LOSS - return CULT_VICTORY - -/datum/team/cult/roundend_report() - var/list/parts = list() - var/victory = check_cult_victory() - - if(victory == CULT_NARSIE_KILLED) // Epic failure, you summoned your god and then someone killed it. - parts += "Nar'sie has been killed! The cult will haunt the universe no longer!" - else if(victory) - parts += "The cult has succeeded! Nar'Sie has snuffed out another torch in the void!" - else - parts += "The staff managed to stop the cult! Dark words and heresy are no match for Nanotrasen's finest!" - - if(objectives.len) - parts += "The cultists' objectives were:" - var/count = 1 - for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - parts += "Objective #[count]: [objective.explanation_text] [span_greentext("Success!")]" - else - parts += "Objective #[count]: [objective.explanation_text] [span_redtext("Fail.")]" - count++ - - if(members.len) - parts += "The cultists were:" - if(length(true_cultists)) - parts += printplayerlist(true_cultists) - else - parts += printplayerlist(members) - - return "
    [parts.Join("
    ")]
    " - -/datum/team/cult/proc/is_sacrifice_target(datum/mind/mind) - for(var/datum/objective/sacrifice/sac_objective in objectives) - if(mind == sac_objective.target) - return TRUE - return FALSE - -/// Returns whether the given mob is convertable to the blood cult + var/obj/item/melee/cultblade/longsword = new + icon.Blend(icon(longsword.lefthand_file, longsword.inhand_icon_state), ICON_OVERLAY) + qdel(longsword) + + // Move the guy back to the bottom left, 32x32. + icon.Crop(17, 17, 48, 48) + + return finish_preview_icon(icon) + +/datum/outfit/cultist + name = "Cultist (Preview only)" + + uniform = /obj/item/clothing/under/color/black + suit = /obj/item/clothing/suit/hooded/cultrobes/alt + head = /obj/item/clothing/head/hooded/cult_hoodie/alt + shoes = /obj/item/clothing/shoes/cult/alt + r_hand = /obj/item/melee/blood_magic/stun + +/datum/outfit/cultist/post_equip(mob/living/carbon/human/equipped, visualsOnly) + equipped.eye_color_left = BLOODCULT_EYE + equipped.eye_color_right = BLOODCULT_EYE + equipped.update_body() + +///Returns whether the given mob is convertable to the blood cult /proc/is_convertable_to_cult(mob/living/target, datum/team/cult/specific_cult) if(!istype(target)) return FALSE @@ -510,81 +316,3 @@ if(HAS_TRAIT(target, TRAIT_MINDSHIELD) || issilicon(target) || isbot(target) || isdrone(target)) return FALSE //can't convert machines, shielded, or braindead return TRUE - -/// Sets a blood target for the cult. -/datum/team/cult/proc/set_blood_target(atom/new_target, mob/marker, duration = 90 SECONDS) - if(QDELETED(new_target)) - CRASH("A null or invalid target was passed to set_blood_target.") - - if(duration != INFINITY && blood_target_reset_timer) - return FALSE - - deltimer(blood_target_reset_timer) - blood_target = new_target - RegisterSignal(blood_target, COMSIG_QDELETING, PROC_REF(unset_blood_target_and_timer)) - var/area/target_area = get_area(new_target) - - blood_target_image = image('icons/effects/mouse_pointers/cult_target.dmi', new_target, "glow", ABOVE_MOB_LAYER) - blood_target_image.appearance_flags = RESET_COLOR - blood_target_image.pixel_x = -new_target.pixel_x - blood_target_image.pixel_y = -new_target.pixel_y - - for(var/datum/mind/cultist as anything in members) - if(!cultist.current) - continue - if(cultist.current.stat == DEAD || !cultist.current.client) - continue - - to_chat(cultist.current, span_bold(span_cultlarge("[marker] has marked [blood_target] in the [target_area.name] as the cult's top priority, get there immediately!"))) - SEND_SOUND(cultist.current, sound(pick('sound/hallucinations/over_here2.ogg','sound/hallucinations/over_here3.ogg'), 0, 1, 75)) - cultist.current.client.images += blood_target_image - - if(duration != INFINITY) - blood_target_reset_timer = addtimer(CALLBACK(src, PROC_REF(unset_blood_target)), duration, TIMER_STOPPABLE) - return TRUE - -/// Unsets out blood target, clearing the images from all the cultists. -/datum/team/cult/proc/unset_blood_target() - blood_target_reset_timer = null - - for(var/datum/mind/cultist as anything in members) - if(!cultist.current) - continue - if(cultist.current.stat == DEAD || !cultist.current.client) - continue - - if(QDELETED(blood_target)) - to_chat(cultist.current, span_bold(span_cultlarge("The blood mark's target is lost!"))) - else - to_chat(cultist.current, span_bold(span_cultlarge("The blood mark has expired!"))) - cultist.current.client.images -= blood_target_image - - UnregisterSignal(blood_target, COMSIG_QDELETING) - blood_target = null - - QDEL_NULL(blood_target_image) - -/// Unsets our blood target when they get deleted. -/datum/team/cult/proc/unset_blood_target_and_timer(datum/source) - SIGNAL_HANDLER - - deltimer(blood_target_reset_timer) - unset_blood_target() - -/datum/outfit/cultist - name = "Cultist (Preview only)" - - uniform = /obj/item/clothing/under/color/black - suit = /obj/item/clothing/suit/hooded/cultrobes/alt - shoes = /obj/item/clothing/shoes/cult/alt - r_hand = /obj/item/melee/blood_magic/stun - -/datum/outfit/cultist/post_equip(mob/living/carbon/human/equipped, visualsOnly) - equipped.eye_color_left = BLOODCULT_EYE - equipped.eye_color_right = BLOODCULT_EYE - equipped.update_body() - -#undef CULT_LOSS -#undef CULT_NARSIE_KILLED -#undef CULT_VICTORY -#undef SUMMON_POSSIBILITIES diff --git a/code/modules/antagonists/cult/cult_bastard_sword.dm b/code/modules/antagonists/cult/cult_bastard_sword.dm index 18b14f4b2fce3..784eaedf636ac 100644 --- a/code/modules/antagonists/cult/cult_bastard_sword.dm +++ b/code/modules/antagonists/cult/cult_bastard_sword.dm @@ -15,7 +15,7 @@ light_color = "#ff0000" 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") - icon = 'icons/obj/cult/items_and_weapons.dmi' + icon = 'icons/obj/weapons/sword.dmi' icon_state = "cultbastard" inhand_icon_state = "cultbastard" hitsound = 'sound/weapons/bladeslice.ogg' @@ -33,7 +33,7 @@ set_light(4) AddComponent(/datum/component/butchering, 50, 80) AddComponent(/datum/component/two_handed, require_twohands = TRUE) - AddComponent(/datum/component/soul_stealer) + AddComponent(/datum/component/soul_stealer, soulstone_type = /obj/item/soulstone) AddComponent( \ /datum/component/spin2win, \ spin_cooldown_time = 25 SECONDS, \ @@ -46,7 +46,14 @@ /obj/item/cult_bastard/proc/on_spin(mob/living/user, duration) var/oldcolor = user.color user.color = "#ff0000" - user.add_stun_absorption("bloody bastard sword", duration, 2, "doesn't even flinch as the sword's power courses through them!", "You shrug off the stun!", " glowing with a blazing red aura!") + user.add_stun_absorption( + source = name, + duration = duration, + priority = 2, + message = span_warning("%EFFECT_OWNER doesn't even flinch as the sword's power courses through [user.p_them()]!"), + self_message = span_boldwarning("You shrug off the stun!"), + examine_message = span_warning("%EFFECT_OWNER_THEYRE glowing with a blazing red aura!"), + ) user.spin(duration, 1) animate(user, color = oldcolor, time = duration, easing = EASE_IN) addtimer(CALLBACK(user, TYPE_PROC_REF(/atom, update_atom_colour)), duration) @@ -73,7 +80,7 @@ to_chat(user, span_cultlarge("\"You cling to the Forgotten Gods, as if you're more than their pawn.\"")) to_chat(user, span_userdanger("A horrible force yanks at your arm!")) user.emote("scream") - user.apply_damage(30, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) + user.apply_damage(30, BRUTE, pick(GLOB.arm_zones)) user.dropItemToGround(src, TRUE) user.Paralyze(50) return diff --git a/code/modules/antagonists/cult/cult_comms.dm b/code/modules/antagonists/cult/cult_comms.dm index 674465c974358..86557d2d529f0 100644 --- a/code/modules/antagonists/cult/cult_comms.dm +++ b/code/modules/antagonists/cult/cult_comms.dm @@ -18,6 +18,8 @@ name = "Communion" desc = "Whispered words that all cultists can hear.
    Warning:Nearby non-cultists can still hear you." button_icon_state = "cult_comms" + // Unholy words dont require hands or mobility + check_flags = AB_CHECK_INCAPACITATED|AB_CHECK_CONSCIOUS /datum/action/innate/cult/comm/IsAvailable(feedback = FALSE) if(isshade(owner) && IS_CULTIST(owner)) @@ -44,20 +46,20 @@ /datum/action/innate/cult/comm/proc/cultist_commune(mob/living/user, message) var/my_message - if(!message) + if(!message || !user.mind) return user.whisper("O bidai nabora se[pick("'","`")]sma!", language = /datum/language/common) user.whisper(html_decode(message), filterproof = TRUE) var/title = "Acolyte" var/span = "cult italic" - if(user.mind && user.mind.has_antag_datum(/datum/antagonist/cult/master)) + var/datum/antagonist/cult/cult_datum = user.mind.has_antag_datum(/datum/antagonist/cult) + if(cult_datum.is_cult_leader()) span = "cultlarge" title = "Master" else if(!ishuman(user)) title = "Construct" my_message = "[title] [findtextEx(user.name, user.real_name) ? user.name : "[user.real_name] (as [user.name])"]: [message]" - for(var/i in GLOB.player_list) - var/mob/M = i + for(var/mob/M as anything in GLOB.player_list) if(IS_CULTIST(M)) to_chat(M, my_message) else if(M in GLOB.dead_mob_list) @@ -90,8 +92,13 @@ /datum/action/innate/cult/mastervote name = "Assert Leadership" button_icon_state = "cultvote" + // So you can use it while your hands are cuffed or you are bucked + // If you want to assert your leadership while handcuffed to a chair, be my guest + check_flags = AB_CHECK_INCAPACITATED|AB_CHECK_CONSCIOUS|AB_CHECK_HANDS_BLOCKED /datum/action/innate/cult/mastervote/IsAvailable(feedback = FALSE) + if(!owner || !owner.mind) + return FALSE var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE) if(!C || C.cult_team.cult_vote_called || !ishuman(owner)) return FALSE @@ -103,7 +110,7 @@ var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE) pollCultists(owner,C.cult_team) -/proc/pollCultists(mob/living/Nominee,datum/team/cult/team) //Cult Master Poll +/proc/pollCultists(mob/living/Nominee, datum/team/cult/team) //Cult Master Poll if(world.time < CULT_POLL_WAIT) to_chat(Nominee, "It would be premature to select a leader while everyone is still settling in, try again in [DisplayTimeText(CULT_POLL_WAIT-world.time)].") return @@ -145,22 +152,16 @@ if(!B.current.incapacitated()) to_chat(B.current, span_cultlarge("[Nominee] could not win the cult's support and shall continue to serve as an acolyte.")) return FALSE - team.cult_master = Nominee - var/datum/antagonist/cult/cultist = Nominee.mind.has_antag_datum(/datum/antagonist/cult) - if (cultist) - cultist.silent = TRUE - cultist.on_removal() - Nominee.mind.add_antag_datum(/datum/antagonist/cult/master) - for(var/datum/mind/B in team.members) - if(B.current) - for(var/datum/action/innate/cult/mastervote/vote in B.current.actions) - vote.Remove(B.current) - if(!B.current.incapacitated()) - to_chat(B.current,span_cultlarge("[Nominee] has won the cult's support and is now their master. Follow [Nominee.p_their()] orders to the best of your ability!")) + var/datum/antagonist/cult/cult_datum = Nominee.mind.has_antag_datum(/datum/antagonist/cult) + if(!cult_datum.make_cult_leader()) + CRASH("[cult_datum.owner.current] was supposed to turn into the leader, but they didn't for some reason. This isn't supposed to happen unless an Admin messed with it.") return TRUE /datum/action/innate/cult/master/IsAvailable(feedback = FALSE) - if(!owner.mind || !owner.mind.has_antag_datum(/datum/antagonist/cult/master) || GLOB.cult_narsie) + if(!owner.mind || GLOB.cult_narsie) + return FALSE + var/datum/antagonist/cult/cult_datum = owner.mind.has_antag_datum(/datum/antagonist/cult) + if(!cult_datum.is_cult_leader()) return FALSE return ..() diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index a39f76aefe522..15882ee7685de 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -1,7 +1,7 @@ /obj/item/tome name = "arcane tome" desc = "An old, dusty tome with frayed edges and a sinister-looking cover." - icon = 'icons/obj/cult/items_and_weapons.dmi' + icon = 'icons/obj/antags/cult/items.dmi' icon_state ="tome" throw_speed = 2 throw_range = 5 @@ -10,7 +10,7 @@ /obj/item/melee/cultblade/dagger name = "ritual dagger" desc = "A strange dagger said to be used by sinister groups for \"preparing\" a corpse before sacrificing it to their dark gods." - icon = 'icons/obj/cult/items_and_weapons.dmi' + icon = 'icons/obj/weapons/khopesh.dmi' icon_state = "render" inhand_icon_state = "cultdagger" worn_icon_state = "render" @@ -56,7 +56,7 @@ Striking a noncultist, however, will tear their flesh."} /obj/item/melee/cultblade name = "eldritch longsword" desc = "A sword humming with unholy energy. It glows with a dim red light." - icon = 'icons/obj/cult/items_and_weapons.dmi' + icon = 'icons/obj/weapons/sword.dmi' icon_state = "cultblade" inhand_icon_state = "cultblade" worn_icon_state = "cultblade" @@ -100,7 +100,7 @@ Striking a noncultist, however, will tear their flesh."} span_cultlarge("\"You shouldn't play with sharp things. You'll poke someone's eye out.\"")) if(ishuman(user)) var/mob/living/carbon/human/miscreant = user - miscreant.apply_damage(rand(force/2, force), BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) + miscreant.apply_damage(rand(force/2, force), BRUTE, pick(GLOB.arm_zones)) else user.adjustBruteLoss(rand(force/2,force)) return @@ -213,7 +213,16 @@ Striking a noncultist, however, will tear their flesh."} heat_protection = CHEST|GROIN|LEGS|ARMS max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT hoodtype = /obj/item/clothing/head/hooded/cult_hoodie + /// Whether the hood is flipped up + var/hood_up = FALSE +/// Called when the hood is worn +/obj/item/clothing/suit/hooded/cultrobes/on_hood_up(obj/item/clothing/head/hooded/hood) + hood_up = TRUE + +/// Called when the hood is hidden +/obj/item/clothing/suit/hooded/cultrobes/on_hood_down(obj/item/clothing/head/hooded/hood) + hood_up = FALSE /datum/armor/hooded_cultrobes melee = 40 @@ -317,7 +326,7 @@ Striking a noncultist, however, will tear their flesh."} icon_state = "cult_helmet" inhand_icon_state = null armor_type = /datum/armor/cult_hoodie_hardened - clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT | PLASMAMAN_HELMET_EXEMPT | HEADINTERNALS + clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT | STACKABLE_HELMET_EXEMPT | HEADINTERNALS 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 @@ -338,6 +347,7 @@ Striking a noncultist, however, will tear their flesh."} /obj/item/sharpener/cult name = "eldritch whetstone" desc = "A block, empowered by dark magic. Sharp weapons will be enhanced when used on the stone." + icon = 'icons/obj/antags/cult/items.dmi' icon_state = "cult_sharpener" uses = 1 increment = 5 @@ -459,11 +469,10 @@ Striking a noncultist, however, will tear their flesh."} name = "flask of unholy water" desc = "Toxic to nonbelievers; reinvigorating to the faithful - this flask may be sipped or thrown." icon = 'icons/obj/drinks/bottles.dmi' - icon_state = "holyflask" + icon_state = "unholyflask" inhand_icon_state = "holyflask" lefthand_file = 'icons/mob/inhands/items/drinks_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/drinks_righthand.dmi' - color = "#333333" list_reagents = list(/datum/reagent/fuel/unholywater = 50) ///how many times can the shuttle be cursed? @@ -474,7 +483,7 @@ Striking a noncultist, however, will tear their flesh."} /obj/item/shuttle_curse name = "cursed orb" desc = "You peer within this smokey orb and glimpse terrible fates befalling the emergency escape shuttle. " - icon = 'icons/obj/cult/items_and_weapons.dmi' + icon = 'icons/obj/antags/cult/items.dmi' icon_state = "shuttlecurse" ///how many times has the shuttle been cursed so far? var/static/totalcurses = 0 @@ -537,7 +546,7 @@ 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, GLOBAL_PROC_REF(priority_announce), omfg_message, "Priority Alert", 'sound/misc/notice1.ogg', null, "Nanotrasen Department of Transportation: Central Command"), rand(2 SECONDS, 6 SECONDS)) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(priority_announce), omfg_message, "Priority Alert", 'sound/misc/announce_syndi.ogg', null, "Nanotrasen Department of Transportation: Central Command"), 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) @@ -549,7 +558,7 @@ Striking a noncultist, however, will tear their flesh."} /obj/item/cult_shift name = "veil shifter" desc = "This relic instantly teleports you, and anything you're pulling, forward by a moderate distance." - icon = 'icons/obj/cult/items_and_weapons.dmi' + icon = 'icons/obj/antags/cult/items.dmi' icon_state ="shifter" ///How many uses does the item have before becoming inert var/uses = 4 @@ -669,7 +678,7 @@ Striking a noncultist, however, will tear their flesh."} /obj/item/melee/cultblade/halberd name = "bloody halberd" desc = "A halberd with a volatile axehead made from crystallized blood. It seems linked to its creator. And, admittedly, more of a poleaxe than a halberd." - icon = 'icons/obj/cult/items_and_weapons.dmi' + icon = 'icons/obj/weapons/spear.dmi' icon_state = "occultpoleaxe0" base_icon_state = "occultpoleaxe" inhand_icon_state = "occultpoleaxe0" @@ -778,33 +787,13 @@ Striking a noncultist, however, will tear their flesh."} halberd.throw_at(owner, 10, 2, owner) -/obj/item/gun/ballistic/rifle/enchanted/arcane_barrage/blood +/obj/item/gun/magic/wand/arcane_barrage/blood name = "blood bolt barrage" desc = "Blood for blood." color = "#ff0000" - guns_left = 24 - mag_type = /obj/item/ammo_box/magazine/internal/blood + ammo_type = /obj/item/ammo_casing/magic/arcane_barrage/blood fire_sound = 'sound/magic/wand_teleport.ogg' -/obj/item/gun/ballistic/rifle/enchanted/arcane_barrage/blood/can_trigger_gun(mob/living/user, akimbo_usage) - if(akimbo_usage) - return FALSE //no akimbo wielding magic lol. - . = ..() - if(!IS_CULTIST(user)) - to_chat(user, span_cultlarge("\"Did you truly think that you could channel MY blood without my approval? Amusing, but futile.\"")) - if(iscarbon(user)) - var/mob/living/carbon/C = user - if(C.active_hand_index == 1) - C.apply_damage(20, BRUTE, BODY_ZONE_L_ARM, wound_bonus = 20, sharpness = SHARP_EDGED) //oof ouch - else - C.apply_damage(20, BRUTE, BODY_ZONE_R_ARM, wound_bonus = 20, sharpness = SHARP_EDGED) - qdel(src) - return FALSE - -/obj/item/ammo_box/magazine/internal/blood - caliber = CALIBER_A762 - ammo_type = /obj/item/ammo_casing/magic/arcane_barrage/blood - /obj/item/ammo_casing/magic/arcane_barrage/blood projectile_type = /obj/projectile/magic/arcane_barrage/blood firing_effect_type = /obj/effect/temp_visual/cult/sparks @@ -817,23 +806,28 @@ Striking a noncultist, however, will tear their flesh."} impact_effect_type = /obj/effect/temp_visual/dir_setting/bloodsplatter /obj/projectile/magic/arcane_barrage/blood/Bump(atom/target) - var/turf/T = get_turf(target) - playsound(T, 'sound/effects/splat.ogg', 50, TRUE) - var/mob/mob_target = target - - if(ismob(mob_target) && IS_CULTIST(mob_target)) - if(ishuman(target)) - var/mob/living/carbon/human/H = target - if(H.stat != DEAD) - H.reagents.add_reagent(/datum/reagent/fuel/unholywater, 4) - if(isshade(target) || isconstruct(target)) - var/mob/living/simple_animal/M = target - if(M.health+5 < M.maxHealth) - M.adjustHealth(-5) - new /obj/effect/temp_visual/cult/sparks(T) - qdel(src) - else - ..() + . = ..() + var/turf/our_turf = get_turf(target) + playsound(our_turf , 'sound/effects/splat.ogg', 50, TRUE) + new /obj/effect/temp_visual/cult/sparks(our_turf) + +/obj/projectile/magic/arcane_barrage/blood/prehit_pierce(atom/target) + . = ..() + if(!ismob(target)) + return PROJECTILE_PIERCE_NONE + + var/mob/living/our_target = target + if(!IS_CULTIST(our_target)) + return PROJECTILE_PIERCE_NONE + + if(iscarbon(our_target) && our_target.stat != DEAD) + var/mob/living/carbon/carbon_cultist = our_target + carbon_cultist.reagents.add_reagent(/datum/reagent/fuel/unholywater, 4) + if(isshade(our_target) || isconstruct(our_target)) + var/mob/living/simple_animal/undead_abomination = our_target + if(undead_abomination.health+5 < undead_abomination.maxHealth) + undead_abomination.adjustHealth(-5) + return PROJECTILE_DELETE_WITHOUT_HITTING /obj/item/blood_beam name = "\improper magical aura" diff --git a/code/modules/antagonists/cult/cult_objectives.dm b/code/modules/antagonists/cult/cult_objectives.dm new file mode 100644 index 0000000000000..d290b212ab22f --- /dev/null +++ b/code/modules/antagonists/cult/cult_objectives.dm @@ -0,0 +1,108 @@ +#define SUMMON_POSSIBILITIES 3 + +/datum/objective/sacrifice + var/sacced = FALSE + var/sac_image + +/// Unregister signals from the old target so it doesn't cause issues when sacrificed of when a new target is found. +/datum/objective/sacrifice/proc/clear_sacrifice() + if(!target) + return + UnregisterSignal(target, COMSIG_MIND_TRANSFERRED) + if(target.current) + UnregisterSignal(target.current, list(COMSIG_QDELETING, COMSIG_MOB_MIND_TRANSFERRED_INTO)) + target = null + +/datum/objective/sacrifice/find_target(dupe_search_range, list/blacklist) + clear_sacrifice() + if(!istype(team, /datum/team/cult)) + return + var/datum/team/cult/cult = team + var/list/target_candidates = list() + for(var/mob/living/carbon/human/player in GLOB.player_list) + if(player.mind && !player.mind.has_antag_datum(/datum/antagonist/cult) && !is_convertable_to_cult(player) && player.stat != DEAD) + target_candidates += player.mind + if(target_candidates.len == 0) + message_admins("Cult Sacrifice: Could not find unconvertible target, checking for convertible target.") + for(var/mob/living/carbon/human/player in GLOB.player_list) + if(player.mind && !player.mind.has_antag_datum(/datum/antagonist/cult) && player.stat != DEAD) + target_candidates += player.mind + list_clear_nulls(target_candidates) + if(LAZYLEN(target_candidates)) + target = pick(target_candidates) + update_explanation_text() + // Register a bunch of signals to both the target mind and its body + // to stop cult from softlocking everytime the target is deleted before being actually sacrificed. + RegisterSignal(target, COMSIG_MIND_TRANSFERRED, PROC_REF(on_mind_transfer)) + RegisterSignal(target.current, COMSIG_QDELETING, PROC_REF(on_target_body_del)) + RegisterSignal(target.current, COMSIG_MOB_MIND_TRANSFERRED_INTO, PROC_REF(on_possible_mindswap)) + else + message_admins("Cult Sacrifice: Could not find unconvertible or convertible target. WELP!") + sacced = TRUE // Prevents another hypothetical softlock. This basically means every PC is a cultist. + if(!sacced) + cult.make_image(src) + for(var/datum/mind/mind in cult.members) + if(mind.current) + mind.current.clear_alert("bloodsense") + mind.current.throw_alert("bloodsense", /atom/movable/screen/alert/bloodsense) + +/datum/objective/sacrifice/proc/on_target_body_del() + SIGNAL_HANDLER + INVOKE_ASYNC(src, PROC_REF(find_target)) + +/datum/objective/sacrifice/proc/on_mind_transfer(datum/source, mob/previous_body) + SIGNAL_HANDLER + //If, for some reason, the mind was transferred to a ghost (better safe than sorry), find a new target. + if(!isliving(target.current)) + INVOKE_ASYNC(src, PROC_REF(find_target)) + return + UnregisterSignal(previous_body, list(COMSIG_QDELETING, COMSIG_MOB_MIND_TRANSFERRED_INTO)) + RegisterSignal(target.current, COMSIG_QDELETING, PROC_REF(on_target_body_del)) + RegisterSignal(target.current, COMSIG_MOB_MIND_TRANSFERRED_INTO, PROC_REF(on_possible_mindswap)) + +/datum/objective/sacrifice/proc/on_possible_mindswap(mob/source) + SIGNAL_HANDLER + UnregisterSignal(target.current, list(COMSIG_QDELETING, COMSIG_MOB_MIND_TRANSFERRED_INTO)) + //we check if the mind is bodyless only after mindswap shenanigeans to avoid issues. + addtimer(CALLBACK(src, PROC_REF(do_we_have_a_body)), 0 SECONDS) + +/datum/objective/sacrifice/proc/do_we_have_a_body() + if(!target.current) //The player was ghosted and the mind isn't probably going to be transferred to another mob at this point. + find_target() + return + RegisterSignal(target.current, COMSIG_QDELETING, PROC_REF(on_target_body_del)) + RegisterSignal(target.current, COMSIG_MOB_MIND_TRANSFERRED_INTO, PROC_REF(on_possible_mindswap)) + +/datum/objective/sacrifice/check_completion() + return sacced || completed + +/datum/objective/sacrifice/update_explanation_text() + if(target) + explanation_text = "Sacrifice [target], the [target.assigned_role.title] via invoking an Offer rune with [target.p_them()] on it and three acolytes around it." + else + explanation_text = "The veil has already been weakened here, proceed to the final objective." + +/datum/objective/eldergod + var/summoned = FALSE + var/killed = FALSE + var/list/summon_spots = list() + +/datum/objective/eldergod/New() + ..() + var/sanity = 0 + while(summon_spots.len < SUMMON_POSSIBILITIES && sanity < 100) + 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++ + update_explanation_text() + +/datum/objective/eldergod/update_explanation_text() + explanation_text = "Summon Nar'Sie by invoking the rune 'Summon Nar'Sie'. The summoning can only be accomplished in [english_list(summon_spots)] - where the veil is weak enough for the ritual to begin." + +/datum/objective/eldergod/check_completion() + if(killed) + return CULT_NARSIE_KILLED // You failed so hard that even the code went backwards. + return summoned || completed + +#undef SUMMON_POSSIBILITIES diff --git a/code/modules/antagonists/cult/cult_structure_altar.dm b/code/modules/antagonists/cult/cult_structure_altar.dm index 684afbb7ececc..1f1a9bd71cbf6 100644 --- a/code/modules/antagonists/cult/cult_structure_altar.dm +++ b/code/modules/antagonists/cult/cult_structure_altar.dm @@ -14,15 +14,15 @@ /obj/structure/destructible/cult/item_dispenser/altar/setup_options() var/static/list/altar_items = list( ELDRITCH_WHETSTONE = list( - PREVIEW_IMAGE = image(icon = 'icons/obj/kitchen.dmi', icon_state = "cult_sharpener"), + PREVIEW_IMAGE = image(icon = 'icons/obj/antags/cult/items.dmi', icon_state = "cult_sharpener"), OUTPUT_ITEMS = list(/obj/item/sharpener/cult), ), CONSTRUCT_SHELL = list( - PREVIEW_IMAGE = image(icon = 'icons/obj/wizard.dmi', icon_state = "construct_cult"), + PREVIEW_IMAGE = image(icon = 'icons/mob/shells.dmi', icon_state = "construct_cult"), OUTPUT_ITEMS = list(/obj/structure/constructshell), ), UNHOLY_WATER = list( - PREVIEW_IMAGE = image(icon = 'icons/obj/drinks/bottles.dmi', icon_state = "holyflask"), + PREVIEW_IMAGE = image(icon = 'icons/obj/drinks/bottles.dmi', icon_state = "unholyflask"), OUTPUT_ITEMS = list(/obj/item/reagent_containers/cup/beaker/unholywater), ), ) diff --git a/code/modules/antagonists/cult/cult_structure_archives.dm b/code/modules/antagonists/cult/cult_structure_archives.dm index efb6fe48198f6..933b90dbf4ef3 100644 --- a/code/modules/antagonists/cult/cult_structure_archives.dm +++ b/code/modules/antagonists/cult/cult_structure_archives.dm @@ -20,11 +20,11 @@ OUTPUT_ITEMS = list(/obj/item/clothing/glasses/hud/health/night/cultblind), ), CURSE_ORB = list( - PREVIEW_IMAGE = image(icon = 'icons/obj/cult/items_and_weapons.dmi', icon_state = "shuttlecurse"), + PREVIEW_IMAGE = image(icon = 'icons/obj/antags/cult/items.dmi', icon_state = "shuttlecurse"), OUTPUT_ITEMS = list(/obj/item/shuttle_curse), ), VEIL_WALKER = list( - PREVIEW_IMAGE = image(icon = 'icons/obj/cult/items_and_weapons.dmi', icon_state = "shifter"), + PREVIEW_IMAGE = image(icon = 'icons/obj/antags/cult/items.dmi', icon_state = "shifter"), OUTPUT_ITEMS = list(/obj/item/cult_shift, /obj/item/flashlight/flare/culttorch), ), ) diff --git a/code/modules/antagonists/cult/cult_structure_forge.dm b/code/modules/antagonists/cult/cult_structure_forge.dm index 39ac15da5ee60..ceb38398a675c 100644 --- a/code/modules/antagonists/cult/cult_structure_forge.dm +++ b/code/modules/antagonists/cult/cult_structure_forge.dm @@ -24,7 +24,7 @@ OUTPUT_ITEMS = list(/obj/item/clothing/suit/hooded/cultrobes/berserker), ), ELDRITCH_SWORD = list( - PREVIEW_IMAGE = image(icon = 'icons/obj/cult/items_and_weapons.dmi', icon_state = "cultblade"), + PREVIEW_IMAGE = image(icon = 'icons/obj/weapons/sword.dmi', icon_state = "cultblade"), OUTPUT_ITEMS = list(/obj/item/melee/cultblade), ), ) diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm index 8a9f8fec20765..0dd0d941aada0 100644 --- a/code/modules/antagonists/cult/cult_structures.dm +++ b/code/modules/antagonists/cult/cult_structures.dm @@ -1,6 +1,6 @@ // Cult buildings! /obj/structure/destructible/cult - icon = 'icons/obj/cult/structures.dmi' + icon = 'icons/obj/antags/cult/structures.dmi' break_sound = 'sound/hallucinations/veryfar_noise.ogg' density = TRUE anchored = TRUE @@ -176,7 +176,7 @@ /obj/effect/gateway name = "gateway" desc = "You're pretty sure that abyss is staring back." - icon = 'icons/obj/cult/structures.dmi' + icon = 'icons/obj/antags/cult/structures.dmi' icon_state = "hole" density = TRUE anchored = TRUE diff --git a/code/modules/antagonists/cult/cult_team.dm b/code/modules/antagonists/cult/cult_team.dm new file mode 100644 index 0000000000000..6254ded64a030 --- /dev/null +++ b/code/modules/antagonists/cult/cult_team.dm @@ -0,0 +1,193 @@ +/datum/team/cult + name = "\improper Cult" + + ///The blood mark target + var/atom/blood_target + ///Image of the blood mark target + var/image/blood_target_image + ///Timer for the blood mark expiration + var/blood_target_reset_timer + + ///Has a vote been called for a leader? + var/cult_vote_called = FALSE + ///The cult leader + var/datum/antagonist/cult/cult_leader_datum + ///Has the mass teleport been used yet? + var/reckoning_complete = FALSE + ///Has the cult risen, and gotten red eyes? + var/cult_risen = FALSE + ///Has the cult asceneded, and gotten halos? + var/cult_ascendent = FALSE + + ///Has narsie been summoned yet? + var/narsie_summoned = FALSE + ///How large were we at max size. + var/size_at_maximum = 0 + ///list of cultists just before summoning Narsie + var/list/true_cultists = list() + +/datum/team/cult/proc/check_size() + if(cult_ascendent) + return + + // This proc is unnecessary clutter whilst running cult related unit tests + // Remove this if, at some point, someone decides to test that halos and eyes are added at expected ratios +#ifndef UNIT_TESTS + var/alive = 0 + var/cultplayers = 0 + for(var/I in GLOB.player_list) + var/mob/M = I + if(M.stat != DEAD) + if(IS_CULTIST(M)) + ++cultplayers + else + ++alive + + ASSERT(cultplayers) //we shouldn't be here. + var/ratio = alive ? cultplayers/alive : 1 + if(ratio > CULT_RISEN && !cult_risen) + for(var/datum/mind/mind as anything in members) + if(mind.current) + SEND_SOUND(mind.current, 'sound/hallucinations/i_see_you2.ogg') + to_chat(mind.current, span_cultlarge(span_warning("The veil weakens as your cult grows, your eyes begin to glow..."))) + mind.current.AddElement(/datum/element/cult_eyes) + cult_risen = TRUE + log_game("The blood cult has risen with [cultplayers] players.") + + if(ratio > CULT_ASCENDENT && !cult_ascendent) + for(var/datum/mind/mind as anything in members) + if(mind.current) + SEND_SOUND(mind.current, 'sound/hallucinations/im_here1.ogg') + to_chat(mind.current, span_cultlarge(span_warning("Your cult is ascendent and the red harvest approaches - you cannot hide your true nature for much longer!!"))) + mind.current.AddElement(/datum/element/cult_halo) + cult_ascendent = TRUE + log_game("The blood cult has ascended with [cultplayers] players.") +#endif + +/datum/team/cult/add_member(datum/mind/new_member) + . = ..() + // A little hacky, but this checks that cult ghosts don't contribute to the size at maximum value. + if(is_unassigned_job(new_member.assigned_role)) + return + size_at_maximum++ + +/datum/team/cult/proc/make_image(datum/objective/sacrifice/sac_objective) + var/datum/job/job_of_sacrifice = sac_objective.target.assigned_role + var/datum/preferences/prefs_of_sacrifice = sac_objective.target.current.client.prefs + var/icon/reshape = get_flat_human_icon(null, job_of_sacrifice, prefs_of_sacrifice, list(SOUTH)) + reshape.Shift(SOUTH, 4) + reshape.Shift(EAST, 1) + reshape.Crop(7,4,26,31) + reshape.Crop(-5,-3,26,30) + sac_objective.sac_image = reshape + +/datum/team/cult/proc/setup_objectives() + var/datum/objective/sacrifice/sacrifice_objective = new + sacrifice_objective.team = src + sacrifice_objective.find_target() + objectives += sacrifice_objective + + var/datum/objective/eldergod/summon_objective = new + summon_objective.team = src + objectives += summon_objective + +/datum/team/cult/proc/check_cult_victory() + for(var/datum/objective/O in objectives) + if(O.check_completion() == CULT_NARSIE_KILLED) + return CULT_NARSIE_KILLED + else if(!O.check_completion()) + return CULT_LOSS + return CULT_VICTORY + +/datum/team/cult/roundend_report() + var/list/parts = list() + var/victory = check_cult_victory() + + if(victory == CULT_NARSIE_KILLED) // Epic failure, you summoned your god and then someone killed it. + parts += "Nar'sie has been killed! The cult will haunt the universe no longer!" + else if(victory) + parts += "The cult has succeeded! Nar'Sie has snuffed out another torch in the void!" + else + parts += "The staff managed to stop the cult! Dark words and heresy are no match for Nanotrasen's finest!" + + if(objectives.len) + parts += "The cultists' objectives were:" + var/count = 1 + for(var/datum/objective/objective in objectives) + parts += "Objective #[count]: [objective.explanation_text] [objective.get_roundend_success_suffix()]" + count++ + + if(members.len) + parts += "The cultists were:" + if(length(true_cultists)) + parts += printplayerlist(true_cultists) + else + parts += printplayerlist(members) + + return "
    [parts.Join("
    ")]
    " + +/datum/team/cult/proc/is_sacrifice_target(datum/mind/mind) + for(var/datum/objective/sacrifice/sac_objective in objectives) + if(mind == sac_objective.target) + return TRUE + return FALSE + +/// Sets a blood target for the cult. +/datum/team/cult/proc/set_blood_target(atom/new_target, mob/marker, duration = 90 SECONDS) + if(QDELETED(new_target)) + CRASH("A null or invalid target was passed to set_blood_target.") + + if(duration != INFINITY && blood_target_reset_timer) + return FALSE + + deltimer(blood_target_reset_timer) + blood_target = new_target + RegisterSignal(blood_target, COMSIG_QDELETING, PROC_REF(unset_blood_target_and_timer)) + var/area/target_area = get_area(new_target) + + blood_target_image = image('icons/effects/mouse_pointers/cult_target.dmi', new_target, "glow", ABOVE_MOB_LAYER) + blood_target_image.appearance_flags = RESET_COLOR + blood_target_image.pixel_x = -new_target.pixel_x + blood_target_image.pixel_y = -new_target.pixel_y + + for(var/datum/mind/cultist as anything in members) + if(!cultist.current) + continue + if(cultist.current.stat == DEAD || !cultist.current.client) + continue + + to_chat(cultist.current, span_bold(span_cultlarge("[marker] has marked [blood_target] in the [target_area.name] as the cult's top priority, get there immediately!"))) + SEND_SOUND(cultist.current, sound(pick('sound/hallucinations/over_here2.ogg','sound/hallucinations/over_here3.ogg'), 0, 1, 75)) + cultist.current.client.images += blood_target_image + + if(duration != INFINITY) + blood_target_reset_timer = addtimer(CALLBACK(src, PROC_REF(unset_blood_target)), duration, TIMER_STOPPABLE) + return TRUE + +/// Unsets out blood target, clearing the images from all the cultists. +/datum/team/cult/proc/unset_blood_target() + blood_target_reset_timer = null + + for(var/datum/mind/cultist as anything in members) + if(!cultist.current) + continue + if(cultist.current.stat == DEAD || !cultist.current.client) + continue + + if(QDELETED(blood_target)) + to_chat(cultist.current, span_bold(span_cultlarge("The blood mark's target is lost!"))) + else + to_chat(cultist.current, span_bold(span_cultlarge("The blood mark has expired!"))) + cultist.current.client.images -= blood_target_image + + UnregisterSignal(blood_target, COMSIG_QDELETING) + blood_target = null + + QDEL_NULL(blood_target_image) + +/// Unsets our blood target when they get deleted. +/datum/team/cult/proc/unset_blood_target_and_timer(datum/source) + SIGNAL_HANDLER + + deltimer(blood_target_reset_timer) + unset_blood_target() diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 10fdea9ed1a31..30cb3d4467c68 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -33,7 +33,7 @@ Runes can either be invoked by one's self or with many different cultists. Each name = "rune" desc = "An odd collection of symbols drawn in what seems to be blood." anchored = TRUE - icon = 'icons/obj/rune.dmi' + icon = 'icons/obj/antags/cult/rune.dmi' icon_state = "1" resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF layer = SIGIL_LAYER @@ -236,7 +236,7 @@ structure_check() searches for nearby cultist structures required for the invoca var/mob/living/F = invokers[1] var/datum/antagonist/cult/C = F.mind.has_antag_datum(/datum/antagonist/cult,TRUE) var/datum/team/cult/Cult_team = C.cult_team - var/is_convertable = is_convertable_to_cult(L,C.cult_team) + var/is_convertable = is_convertable_to_cult(L, C.cult_team) if(L.stat != DEAD && is_convertable) invocation = "Mah'weyh pleggh at e'ntrath!" ..() @@ -370,7 +370,7 @@ structure_check() searches for nearby cultist structures required for the invoca if(sacrificial) playsound(sacrificial, 'sound/magic/disintegrate.ogg', 100, TRUE) sacrificial.investigate_log("has been sacrificially gibbed by the cult.", INVESTIGATE_DEATHS) - sacrificial.gib() + sacrificial.gib(DROP_ALL_REMAINS) return TRUE /obj/effect/rune/empower @@ -697,7 +697,7 @@ structure_check() searches for nearby cultist structures required for the invoca barrier.Toggle() if(iscarbon(user)) var/mob/living/carbon/C = user - C.apply_damage(2, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) + C.apply_damage(2, BRUTE, pick(GLOB.arm_zones)) //Rite of Joined Souls: Summons a single cultist. /obj/effect/rune/summon @@ -886,7 +886,7 @@ structure_check() searches for nearby cultist structures required for the invoca 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 new_human.set_invis_see(SEE_INVISIBLE_OBSERVER) - ADD_TRAIT(new_human, TRAIT_NOBREATH, INNATE_TRAIT) + new_human.add_traits(list(TRAIT_NOBREATH, TRAIT_PERMANENTLY_MORTAL), INNATE_TRAIT) // permanently mortal can be removed once this is a bespoke kind of mob ghosts++ playsound(src, 'sound/magic/exit_blood.ogg', 50, TRUE) visible_message(span_warning("A cloud of red mist forms above [src], and from within steps... a [new_human.gender == FEMALE ? "wo":""]man.")) @@ -946,8 +946,8 @@ structure_check() searches for nearby cultist structures required for the invoca affecting = null rune_in_use = FALSE -/mob/living/carbon/human/cult_ghost/spill_organs(no_brain, no_organs, no_bodyparts) //cult ghosts never drop a brain - no_brain = TRUE +/mob/living/carbon/human/cult_ghost/spill_organs(drop_bitflags=NONE) + drop_bitflags &= ~DROP_BRAIN //cult ghosts never drop a brain . = ..() /mob/living/carbon/human/cult_ghost/get_organs_for_zone(zone, include_children) @@ -1019,8 +1019,8 @@ structure_check() searches for nearby cultist structures required for the invoca images += A SEND_SOUND(M, pick(sound('sound/ambience/antag/bloodcult.ogg'),sound('sound/voice/ghost_whisper.ogg'),sound('sound/misc/ghosty_wind.ogg'))) else - var/construct = pick("floater","artificer","behemoth") - var/image/B = image('icons/mob/simple/mob.dmi',M,construct, ABOVE_MOB_LAYER) + var/construct = pick("wraith","artificer","juggernaut") + var/image/B = image('icons/mob/nonhuman-player/cult.dmi',M,construct, ABOVE_MOB_LAYER) B.override = 1 add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/noncult, "mob_apoc", B, NONE) addtimer(CALLBACK(M, TYPE_PROC_REF(/atom/, remove_alt_appearance),"mob_apoc",TRUE), duration) diff --git a/code/modules/antagonists/disease/disease_abilities.dm b/code/modules/antagonists/disease/disease_abilities.dm index 08d5160e14129..3267944e05c62 100644 --- a/code/modules/antagonists/disease/disease_abilities.dm +++ b/code/modules/antagonists/disease/disease_abilities.dm @@ -268,7 +268,7 @@ new /datum/disease_ability/symptom/powerful/youth var/mob/living/carbon/human/host = our_disease.following_host if(!host) return FALSE - for(var/obj/thing as anything in host.get_equipped_items(FALSE)) + for(var/obj/thing as anything in host.get_equipped_items(include_accessories = TRUE)) thing.AddComponent(/datum/component/infective, our_disease.disease_template, 300) //no shoes? infect the floor. if(!host.shoes) diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm index c6dd121a8d5da..5d266227a1053 100644 --- a/code/modules/antagonists/ert/ert.dm +++ b/code/modules/antagonists/ert/ert.dm @@ -12,8 +12,8 @@ antagpanel_category = ANTAG_GROUP_ERT suicide_cry = "FOR NANOTRASEN!!" count_against_dynamic_roll_chance = FALSE - // Not 'true' antags, cannot induct to prevent issues - antag_flags = NONE + // Not 'true' antags, this disables certain interactions that assume the owner is a baddie + antag_flags = FLAG_FAKE_ANTAG var/datum/team/ert/ert_team var/leader = FALSE var/datum/outfit/outfit = /datum/outfit/centcom/ert/security @@ -275,3 +275,13 @@ name = "Marine Medic" outfit = /datum/outfit/centcom/ert/marine/medic role = "Medical Officer" + +/datum/antagonist/ert/militia + name = "Frontier Militia" + outfit = /datum/outfit/centcom/militia + role = "Volunteer" + +/datum/antagonist/ert/militia/general + name = "Frontier Militia General" + outfit = /datum/outfit/centcom/militia/general + role = "General" diff --git a/code/modules/antagonists/fugitive/fugitive_outfits.dm b/code/modules/antagonists/fugitive/fugitive_outfits.dm index 10c2cc4579a40..ba1fe87bfbb44 100644 --- a/code/modules/antagonists/fugitive/fugitive_outfits.dm +++ b/code/modules/antagonists/fugitive/fugitive_outfits.dm @@ -35,7 +35,7 @@ equipped_on.update_worn_undersuit() if(visualsOnly) return - equipped_on.fully_replace_character_name(null,"Waldo") + equipped_on.fully_replace_character_name(null, "Waldo") equipped_on.eye_color_left = "#000000" equipped_on.eye_color_right = "#000000" equipped_on.gender = MALE @@ -43,8 +43,8 @@ equipped_on.hairstyle = "Business Hair 3" equipped_on.facial_hairstyle = "Shaved" equipped_on.hair_color = "#000000" - equipped_on.facial_hair_color = equipped_on.hair_color - equipped_on.update_body() + equipped_on.facial_hair_color = "#000000" + equipped_on.update_body(is_creating = TRUE) var/list/no_drops = list() no_drops += equipped_on.get_item_by_slot(ITEM_SLOT_FEET) diff --git a/code/modules/antagonists/fugitive/hunters/hunter_gear.dm b/code/modules/antagonists/fugitive/hunters/hunter_gear.dm index 596420ba8f4c2..013359e9a68fc 100644 --- a/code/modules/antagonists/fugitive/hunters/hunter_gear.dm +++ b/code/modules/antagonists/fugitive/hunters/hunter_gear.dm @@ -37,6 +37,7 @@ name = "shuttle console" shuttleId = "huntership" possible_destinations = "huntership_home;huntership_custom;whiteship_home;syndicate_nw" + req_access = list(ACCESS_HUNTER) /obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/hunter name = "shuttle navigation computer" @@ -128,7 +129,7 @@ /obj/structure/bouncy_castle name = "bouncy castle" desc = "And if you do drugs, you go to hell before you die. Please." - icon = 'icons/obj/bouncy_castle.dmi' + icon = 'icons/obj/toys/bouncy_castle.dmi' icon_state = "bouncy_castle" anchored = TRUE density = TRUE @@ -153,3 +154,66 @@ default_raw_text = "Remember! The customers love that gumball we have as a crystal ball. \ Even if it's completely useless to us, resist the urge to chew it." +/** + * # Bounty Locator + * + * Locates a random, living fugitive and reports their name/location on a 40 second cooldown. + * + * Locates a random fugitive antagonist via the GLOB.antagonists list, and reads out their real name and area name. + * Captured or dead fugitives are not reported. + */ +/obj/machinery/fugitive_locator + name = "Bounty Locator" + desc = "Tracks the signatures of bounty targets in your sector. Nobody actually knows what mechanism this thing uses to track its targets. \ + Whether it be bluespace entanglement or a simple RFID implant, this machine will find you who you're looking for no matter where they're hiding." + icon = 'icons/obj/machines/dominator.dmi' + icon_state = "dominator-Purple" + density = TRUE + /// Cooldown on locating a fugitive. + COOLDOWN_DECLARE(locate_cooldown) + +/obj/machinery/fugitive_locator/interact(mob/user) + if(!COOLDOWN_FINISHED(src, locate_cooldown)) + balloon_alert_to_viewers("locator recharging!", vision_distance = 3) + return + var/mob/living/bounty = locate_fugitive() + if(!bounty) + say("No bounty targets detected.") + else + say("Bounty Target Located. Bounty ID: [bounty.real_name]. Location: [get_area_name(bounty)]") + + COOLDOWN_START(src, locate_cooldown, 40 SECONDS) + +///Locates a random fugitive via their antag datum and returns them. +/obj/machinery/fugitive_locator/proc/locate_fugitive() + var/list/datum_list = shuffle(GLOB.antagonists) + for(var/datum/antagonist/fugitive/fugitive_datum in datum_list) + if(!fugitive_datum.owner) + stack_trace("Fugitive locator tried to locate a fugitive antag datum with no owner.") + continue + if(fugitive_datum.is_captured) + continue + var/mob/living/found_fugitive = fugitive_datum.owner.current + if(found_fugitive.stat == DEAD) + continue + + return found_fugitive + +/obj/item/radio/headset/psyker + name = "psychic headset" + desc = "A headset designed to boost psychic waves. Protects ears from flashbangs." + icon_state = "psyker_headset" + worn_icon_state = "syndie_headset" + +/obj/item/radio/headset/psyker/Initialize(mapload) + . = ..() + AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) + +/obj/item/radio/headset/psyker/equipped(mob/living/user, slot) + . = ..() + if(slot_flags & slot) + ADD_CLOTHING_TRAIT(user, TRAIT_ECHOLOCATION_EXTRA_RANGE) + +/obj/item/radio/headset/psyker/dropped(mob/user, silent) + . = ..() + REMOVE_CLOTHING_TRAIT(user, TRAIT_ECHOLOCATION_EXTRA_RANGE) diff --git a/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm b/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm index a3cc239c20309..7df6818cdc44a 100644 --- a/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm +++ b/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm @@ -11,20 +11,28 @@ ears = /obj/item/radio/headset l_pocket = /obj/item/ammo_box/magazine/m45 r_pocket = /obj/item/restraints/handcuffs - id = /obj/item/card/id/advanced + id = /obj/item/card/id/advanced/bountyhunter + id_trim = /datum/id_trim/bounty_hunter/police /datum/outfit/spacepol/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) if(visualsOnly) return var/obj/item/card/id/W = H.wear_id - W.assignment = "Police Officer" W.registered_name = H.real_name + W.icon_state = "card_black" //Less flamey, more modest, still unique enough to convey that they're fugitive hunters. W.update_label() W.update_icon() + +/datum/id_trim/bounty_hunter/police + assignment = "Police Officer" + trim_state = "trim_warden" + department_color = COLOR_STRONG_BLUE + + access = list(ACCESS_HUNTER) + /datum/outfit/russian_hunter name = "Russian Hunter" - id = /obj/item/card/id/advanced uniform = /obj/item/clothing/under/costume/soviet suit = /obj/item/clothing/suit/armor/bulletproof suit_store = /obj/item/gun/ballistic/rifle/boltaction @@ -34,8 +42,9 @@ gloves = /obj/item/clothing/gloves/tackler/combat head = /obj/item/clothing/head/helmet/alt shoes = /obj/item/clothing/shoes/russian - l_pocket = /obj/item/ammo_box/a762 + l_pocket = /obj/item/ammo_box/strilka310 r_pocket = /obj/item/restraints/handcuffs/cable/zipties + id = /obj/item/card/id/advanced/bountyhunter /datum/outfit/russian_hunter/pre_equip(mob/living/carbon/human/equip_to) @@ -91,7 +100,7 @@ name = "Bounty Hunter - Armored" uniform = /obj/item/clothing/under/rank/prisoner back = /obj/item/storage/backpack - head = /obj/item/clothing/head/cowboy + head = /obj/item/clothing/head/cowboy/bounty suit = /obj/item/clothing/suit/space/hunter belt = /obj/item/gun/ballistic/automatic/pistol/fire_mag gloves = /obj/item/clothing/gloves/tackler/combat @@ -153,7 +162,6 @@ ears = /obj/item/radio/headset id = /obj/item/card/id/advanced/bountyhunter r_hand = /obj/item/storage/medkit/regular - l_hand = /obj/item/pinpointer/shuttle backpack_contents = list( /obj/item/bountytrap = 4 @@ -179,7 +187,7 @@ name = "Psyker-Shikari Hunter" glasses = null head = null - ears = /obj/item/radio/headset/syndicate/alt/psyker + ears = /obj/item/radio/headset/psyker uniform = /obj/item/clothing/under/pants/track gloves = /obj/item/clothing/gloves/fingerless shoes = /obj/item/clothing/shoes/jackboots @@ -204,6 +212,7 @@ shoes = /obj/item/clothing/shoes/sandal l_pocket = /obj/item/restraints/handcuffs/cable/zipties r_pocket = /obj/item/restraints/handcuffs/cable/zipties + id = /obj/item/card/id/advanced/bountyhunter id_trim = /datum/id_trim/bounty_hunter/psykers/seer diff --git a/code/modules/antagonists/greentext/greentext.dm b/code/modules/antagonists/greentext/greentext.dm index d06977d2a6366..7133066f85694 100644 --- a/code/modules/antagonists/greentext/greentext.dm +++ b/code/modules/antagonists/greentext/greentext.dm @@ -4,6 +4,7 @@ show_name_in_check_antagonists = TRUE //Not that it will be there for long suicide_cry = "FOR THE GREENTEXT!!" // This can never actually show up, but not including it is a missed opportunity count_against_dynamic_roll_chance = FALSE + hardcore_random_bonus = TRUE /datum/antagonist/greentext/forge_objectives() var/datum/objective/succeed_objective = new /datum/objective("Succeed") diff --git a/code/modules/antagonists/heretic/heretic_antag.dm b/code/modules/antagonists/heretic/heretic_antag.dm index 8d75a1d9b2f6d..1f9b44f77adda 100644 --- a/code/modules/antagonists/heretic/heretic_antag.dm +++ b/code/modules/antagonists/heretic/heretic_antag.dm @@ -23,6 +23,9 @@ hijack_speed = 0.5 suicide_cry = "THE MANSUS SMILES UPON ME!!" preview_outfit = /datum/outfit/heretic + can_assign_self_objectives = TRUE + default_custom_objective = "Turn a department into a testament for your dark knowledge." + hardcore_random_bonus = TRUE /// Whether we give this antagonist objectives on gain. var/give_objectives = TRUE /// Whether we've ascended! (Completed one of the final rituals) @@ -31,6 +34,8 @@ var/heretic_path = PATH_START /// A sum of how many knowledge points this heretic CURRENTLY has. Used to research. var/knowledge_points = 1 + /// How many side path points the heretic has. He gains one of these per main path that splits into two sidepaths. These can be used in place of knowledge points for side paths only. + var/side_path_points = 0 /// The time between gaining influence passively. The heretic gain +1 knowledge points every this duration of time. var/passive_gain_timer = 20 MINUTES /// Assoc list of [typepath] = [knowledge instance]. A list of all knowledge this heretic's reserached. @@ -43,6 +48,8 @@ var/high_value_sacrifices = 0 /// Lazy assoc list of [refs to humans] to [image previews of the human]. Humans that we have as sacrifice targets. var/list/mob/living/carbon/human/sac_targets + /// List of all sacrifice target's names, used for end of round report + var/list/all_sac_targets = list() /// Whether we're drawing a rune or not var/drawing_rune = FALSE /// A static typecache of all tools we can scribe with. @@ -59,6 +66,7 @@ PATH_VOID = "blue", PATH_BLADE = "label", // my favorite color is label PATH_COSMIC = "purple", + PATH_KNOCK = "yellow", ) var/static/list/path_to_rune_color = list( PATH_START = COLOR_LIME, @@ -68,6 +76,7 @@ PATH_VOID = COLOR_CYAN, PATH_BLADE = COLOR_SILVER, PATH_COSMIC = COLOR_PURPLE, + PATH_KNOCK = COLOR_YELLOW, ) /datum/antagonist/heretic/Destroy() @@ -78,6 +87,7 @@ var/list/data = list() data["charges"] = knowledge_points + data["side_charges"] = side_path_points data["total_sacrifices"] = total_sacrifices data["ascended"] = ascended @@ -91,7 +101,10 @@ knowledge_data["desc"] = initial(knowledge.desc) knowledge_data["gainFlavor"] = initial(knowledge.gain_text) knowledge_data["cost"] = initial(knowledge.cost) - knowledge_data["disabled"] = (initial(knowledge.cost) > knowledge_points) + if(initial(knowledge.route) == PATH_SIDE) + knowledge_data["disabled"] = (initial(knowledge.cost) > knowledge_points + side_path_points) + else + knowledge_data["disabled"] = (initial(knowledge.cost) > knowledge_points) // Final knowledge can't be learned until all objectives are complete. if(ispath(knowledge, /datum/heretic_knowledge/ultimate)) @@ -108,6 +121,7 @@ var/list/data = list() data["objectives"] = get_objectives() + data["can_change_objective"] = can_assign_self_objectives for(var/path in researched_knowledge) var/list/knowledge_data = list() @@ -134,15 +148,37 @@ if(!ispath(researched_path)) CRASH("Heretic attempted to learn non-heretic_knowledge path! (Got: [researched_path])") - if(initial(researched_path.cost) > knowledge_points) - return TRUE + // If side path and has path points, buy! + var/coupon = FALSE + if((initial(researched_path.route) == PATH_SIDE) && side_path_points) + coupon = TRUE + // else try normal purchase + else if(initial(researched_path.cost) > knowledge_points) + return + if(!gain_knowledge(researched_path)) return TRUE - log_heretic_knowledge("[key_name(owner)] gained knowledge: [initial(researched_path.name)]") - knowledge_points -= initial(researched_path.cost) + log_heretic_knowledge("[key_name(owner)] gained knowledge: [initial(researched_path.name)][coupon ? "(via free side-path point)" : ""]") + if(coupon) + side_path_points -= initial(researched_path.cost) + else + knowledge_points -= initial(researched_path.cost) return TRUE +/datum/antagonist/heretic/submit_player_objective(retain_existing = FALSE, retain_escape = TRUE, force = FALSE) + if (isnull(owner) || isnull(owner.current)) + return + var/confirmed = tgui_alert( + owner.current, + message = "Are you sure? You will no longer be able to Ascend.", + title = "Reject the call?", + buttons = list("Yes", "No"), + ) == "Yes" + if (!confirmed) + return + return ..() + /datum/antagonist/heretic/ui_status(mob/user, datum/ui_state/state) if(user.stat == DEAD) return UI_CLOSE @@ -284,14 +320,14 @@ * * drawing_time - how long the do_after takes to make the rune * * additional checks - optional callbacks to be ran while drawing the rune */ -/datum/antagonist/heretic/proc/try_draw_rune(mob/living/user, turf/target_turf, drawing_time = 30 SECONDS, additional_checks) +/datum/antagonist/heretic/proc/try_draw_rune(mob/living/user, turf/target_turf, drawing_time = 20 SECONDS, additional_checks) for(var/turf/nearby_turf as anything in RANGE_TURFS(1, target_turf)) if(!isopenturf(nearby_turf) || is_type_in_typecache(nearby_turf, blacklisted_rune_turfs)) target_turf.balloon_alert(user, "invalid placement for rune!") return if(locate(/obj/effect/heretic_rune) in range(3, target_turf)) - target_turf.balloon_alert(user, "to close to another rune!") + target_turf.balloon_alert(user, "too close to another rune!") return if(drawing_rune) @@ -309,16 +345,16 @@ * * drawing_time - how long the do_after takes to make the rune * * additional checks - optional callbacks to be ran while drawing the rune */ -/datum/antagonist/heretic/proc/draw_rune(mob/living/user, turf/target_turf, drawing_time = 30 SECONDS, additional_checks) +/datum/antagonist/heretic/proc/draw_rune(mob/living/user, turf/target_turf, drawing_time = 20 SECONDS, additional_checks) drawing_rune = TRUE var/rune_colour = path_to_rune_color[heretic_path] target_turf.balloon_alert(user, "drawing rune...") var/obj/effect/temp_visual/drawing_heretic_rune/drawing_effect - if (drawing_time >= (30 SECONDS)) - drawing_effect = new(target_turf, rune_colour) - else + if (drawing_time < (10 SECONDS)) drawing_effect = new /obj/effect/temp_visual/drawing_heretic_rune/fast(target_turf, rune_colour) + else + drawing_effect = new(target_turf, rune_colour) if(!do_after(user, drawing_time, target_turf, extra_checks = additional_checks)) target_turf.balloon_alert(user, "interrupted!") @@ -408,6 +444,7 @@ LAZYSET(sac_targets, target, target_image) RegisterSignal(target, COMSIG_QDELETING, PROC_REF(on_target_deleted)) + all_sac_targets += target.real_name /** * Removes [target] from the heretic's sacrifice list. @@ -447,15 +484,13 @@ parts += printplayer(owner) parts += "Sacrifices Made: [total_sacrifices]" - + parts += "The heretic's sacrifice targets were: [english_list(all_sac_targets, nothing_text = "No one")]." if(length(objectives)) var/count = 1 for(var/datum/objective/objective as anything in objectives) - if(objective.check_completion()) - parts += "Objective #[count]: [objective.explanation_text] [span_greentext("Success!")]" - else - parts += "Objective #[count]: [objective.explanation_text] [span_redtext("Fail.")]" + if(!objective.check_completion()) succeeded = FALSE + parts += "Objective #[count]: [objective.explanation_text] [objective.get_roundend_success_suffix()]" count++ if(ascended) @@ -490,6 +525,7 @@ .["Remove Heart Target"] = CALLBACK(src, PROC_REF(remove_target)) .["Adjust Knowledge Points"] = CALLBACK(src, PROC_REF(admin_change_points)) + .["Give Focus"] = CALLBACK(src, PROC_REF(admin_give_focus)) /** * Admin proc for giving a heretic a Living Heart easily. @@ -565,6 +601,18 @@ knowledge_points += change_num +/** + * Admin proc for giving a heretic a focus. + */ +/datum/antagonist/heretic/proc/admin_give_focus(mob/admin) + if(!admin.client?.holder) + to_chat(admin, span_warning("You shouldn't be using this!")) + return + + var/mob/living/pawn = owner.current + pawn.equip_to_slot_if_possible(new /obj/item/clothing/neck/heretic_focus(get_turf(pawn)), ITEM_SLOT_NECK, TRUE, TRUE) + to_chat(pawn, span_hypnophrase("The Mansus has manifested you a focus.")) + /datum/antagonist/heretic/antag_panel_data() var/list/string_of_knowledge = list() @@ -651,6 +699,8 @@ * Returns FALSE if not all of our objectives are complete, or TRUE otherwise. */ /datum/antagonist/heretic/proc/can_ascend() + if(!can_assign_self_objectives) + return FALSE // We spurned the offer of the Mansus :( for(var/datum/objective/must_be_done as anything in objectives) if(!must_be_done.check_completion()) return FALSE @@ -730,8 +780,8 @@ target_amount = main_path_length // Add in the base research we spawn with, otherwise it'd be too easy. target_amount += length(GLOB.heretic_start_knowledge) - // And add in some buffer, to require some sidepathing. - target_amount += rand(2, 4) + // And add in some buffer, to require some sidepathing, especially since heretics get some free side paths. + target_amount += rand(5, 7) update_explanation_text() /datum/objective/heretic_research/update_explanation_text() @@ -758,4 +808,6 @@ name = "Heretic (Preview only)" suit = /obj/item/clothing/suit/hooded/cultrobes/eldritch + head = /obj/item/clothing/head/hooded/cult_hoodie/eldritch r_hand = /obj/item/melee/touch_attack/mansus_fist + diff --git a/code/modules/antagonists/heretic/heretic_focus.dm b/code/modules/antagonists/heretic/heretic_focus.dm index b7c79b6d6caa2..45bbf743b8cd1 100644 --- a/code/modules/antagonists/heretic/heretic_focus.dm +++ b/code/modules/antagonists/heretic/heretic_focus.dm @@ -46,7 +46,7 @@ if(!IS_HERETIC(user)) return - if(!(source.slot_flags & slot)) + if(source.slot_flags && !(source.slot_flags & slot)) return ADD_TRAIT(user, TRAIT_ALLOW_HERETIC_CASTING, ELEMENT_TRAIT(source)) diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm index 8ce88784d7864..260f56540d042 100644 --- a/code/modules/antagonists/heretic/heretic_knowledge.dm +++ b/code/modules/antagonists/heretic/heretic_knowledge.dm @@ -25,11 +25,16 @@ var/list/banned_knowledge = list() /// Assoc list of [typepaths we need] to [amount needed]. /// If set, this knowledge allows the heretic to do a ritual on a transmutation rune with the components set. + /// If one of the items in the list is a list, it's treated as 'any of these items will work' var/list/required_atoms /// Paired with above. If set, the resulting spawned atoms upon ritual completion. var/list/result_atoms = list() - /// Cost of knowledge in knowlege points + /// If set, required_atoms checks for these *exact* types and doesn't allow them to be ingredients. + var/list/banned_atom_types = list() + /// Cost of knowledge in knowledge points var/cost = 0 + /// If true, adds side path points according to value. Only main branch powers that split into sidepaths should have this. + var/adds_sidepath_points = 0 /// The priority of the knowledge. Higher priority knowledge appear higher in the ritual list. /// Number itself is completely arbitrary. Does not need to be set for non-ritual knowledge. var/priority = 0 @@ -58,6 +63,8 @@ if(gain_text) to_chat(user, span_warning("[gain_text]")) + // Usually zero + our_heretic.side_path_points += adds_sidepath_points on_gain(user, our_heretic) /** @@ -112,15 +119,27 @@ /datum/heretic_knowledge/proc/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) return TRUE +/** + * Parses specific items into a more reaadble form. + * Can be overriden by knoweldge subtypes. + */ +/datum/heretic_knowledge/proc/parse_required_item(atom/item_path, number_of_things) + // If we need a human, there is a high likelihood we actually need a (dead) body + if(ispath(item_path, /mob/living/carbon/human)) + return "bod[number_of_things > 1 ? "ies" : "y"]" + if(ispath(item_path, /mob/living)) + return "carcass[number_of_things > 1 ? "es" : ""] of any kind" + return "[initial(item_path.name)]\s" + /** * Called whenever the knowledge's associated ritual is completed successfully. * * Creates atoms from types in result_atoms. - * Override this is you want something else to happen. + * Override this if you want something else to happen. * This CAN sleep, such as for summoning rituals which poll for ghosts. * * Arguments - * * user - the mob who did the ritual + * * user - the mob who did the ritual * * selected_atoms - an list of atoms chosen as a part of this ritual. * * loc - the turf the ritual's occuring on * @@ -158,9 +177,12 @@ var/obj/item/stack/sac_stack = sacrificed var/how_much_to_use = 0 for(var/requirement in required_atoms) - if(istype(sacrificed, requirement)) - how_much_to_use = min(required_atoms[requirement], sac_stack.amount) - break + if(islist(requirement) && !is_type_in_list(sacrificed, requirement)) + continue + if(!istype(sacrificed, requirement)) + continue + how_much_to_use = min(required_atoms[requirement], sac_stack.amount) + break sac_stack.use(how_much_to_use) continue @@ -264,7 +286,7 @@ /datum/heretic_knowledge/mark abstract_parent_type = /datum/heretic_knowledge/mark mutually_exclusive = TRUE - cost = 2 + cost = 1 /// The status effect typepath we apply on people on mansus grasp. var/datum/status_effect/eldritch/mark_type @@ -503,18 +525,20 @@ abstract_parent_type = /datum/heretic_knowledge/summon /// Typepath of a mob to summon when we finish the recipe. var/mob/living/mob_to_summon + ///Determines what kind of monster ghosts will ignore from here on out. Defaults to POLL_IGNORE_HERETIC_MONSTER, but we define other types of monsters for more granularity. + var/poll_ignore_define = POLL_IGNORE_HERETIC_MONSTER /datum/heretic_knowledge/summon/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) var/mob/living/summoned = new mob_to_summon(loc) // Fade in the summon while the ghost poll is ongoing. // Also don't let them mess with the summon while waiting summoned.alpha = 0 - summoned.notransform = TRUE + ADD_TRAIT(summoned, TRAIT_NO_TRANSFORM, REF(src)) summoned.move_resist = MOVE_FORCE_OVERPOWERING animate(summoned, 10 SECONDS, alpha = 155) message_admins("A [summoned.name] is being summoned by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(summoned)].") - var/list/mob/dead/observer/candidates = poll_candidates_for_mob("Do you want to play as a [summoned.real_name]?", ROLE_HERETIC, FALSE, 10 SECONDS, summoned) + var/list/mob/dead/observer/candidates = poll_candidates_for_mob("Do you want to play as a [summoned.real_name]?", ROLE_HERETIC, FALSE, 10 SECONDS, summoned, poll_ignore_define) if(!LAZYLEN(candidates)) loc.balloon_alert(user, "ritual failed, no ghosts!") animate(summoned, 0.5 SECONDS, alpha = 0) @@ -524,7 +548,7 @@ var/mob/dead/observer/picked_candidate = pick(candidates) // Ok let's make them an interactable mob now, since we got a ghost summoned.alpha = 255 - summoned.notransform = FALSE + REMOVE_TRAIT(summoned, TRAIT_NO_TRANSFORM, REF(src)) summoned.move_resist = initial(summoned.move_resist) summoned.ghostize(FALSE) @@ -634,7 +658,7 @@ to_chat(user, span_hypnophrase(span_big("[drain_message]"))) desc += " (Completed!)" log_heretic_knowledge("[key_name(user)] completed a [name] at [worldtime2text()].") - user.add_mob_memory(/datum/memory/heretic_knowlege_ritual) + user.add_mob_memory(/datum/memory/heretic_knowledge_ritual) return TRUE #undef KNOWLEDGE_RITUAL_POINTS @@ -709,6 +733,6 @@ /datum/heretic_knowledge/ultimate/cleanup_atoms(list/selected_atoms) for(var/mob/living/carbon/human/sacrifice in selected_atoms) selected_atoms -= sacrifice - sacrifice.gib() + sacrifice.gib(DROP_ALL_REMAINS) return ..() diff --git a/code/modules/antagonists/heretic/heretic_living_heart.dm b/code/modules/antagonists/heretic/heretic_living_heart.dm index 063303c49b6a7..1766cb4cd765e 100644 --- a/code/modules/antagonists/heretic/heretic_living_heart.dm +++ b/code/modules/antagonists/heretic/heretic_living_heart.dm @@ -55,7 +55,7 @@ /datum/component/living_heart/proc/on_organ_replaced(obj/item/organ/source, obj/item/organ/replacement) SIGNAL_HANDLER - if(replacement.status == ORGAN_ROBOTIC || (replacement.organ_flags & ORGAN_SYNTHETIC)) + if(IS_ROBOTIC_ORGAN(replacement)) qdel(src) return @@ -70,7 +70,7 @@ desc = "LMB: Chose one of your sacrifice targets to track. RMB: Repeats last target you chose to track." check_flags = AB_CHECK_CONSCIOUS background_icon_state = "bg_heretic" - button_icon = 'icons/obj/eldritch.dmi' + button_icon = 'icons/obj/antags/eldritch.dmi' button_icon_state = "living_heart" cooldown_time = 4 SECONDS @@ -99,7 +99,7 @@ return TRUE -/datum/action/cooldown/track_target/Trigger(trigger_flags) +/datum/action/cooldown/track_target/Trigger(trigger_flags, atom/target) right_clicked = !!(trigger_flags & TRIGGER_SECONDARY_ACTION) return ..() diff --git a/code/modules/antagonists/heretic/influences.dm b/code/modules/antagonists/heretic/influences.dm index 97786c60e4c01..9ae5cb0d2f0b7 100644 --- a/code/modules/antagonists/heretic/influences.dm +++ b/code/modules/antagonists/heretic/influences.dm @@ -115,7 +115,7 @@ icon = 'icons/effects/eldritch.dmi' icon_state = "pierced_illusion" anchored = TRUE - interaction_flags_atom = INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND + interaction_flags_atom = INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND|INTERACT_ATOM_NO_FINGERPRINT_INTERACT resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF alpha = 0 @@ -174,7 +174,7 @@ head.dismember() qdel(head) else - human_user.gib() + human_user.gib(DROP_ALL_REMAINS) human_user.investigate_log("has died from using telekinesis on a heretic influence.", INVESTIGATE_DEATHS) var/datum/effect_system/reagents_explosion/explosion = new() explosion.set_up(1, get_turf(human_user), TRUE, 0) @@ -194,7 +194,7 @@ name = "reality smash" icon = 'icons/effects/eldritch.dmi' anchored = TRUE - interaction_flags_atom = INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND + interaction_flags_atom = INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND|INTERACT_ATOM_NO_FINGERPRINT_INTERACT resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF invisibility = INVISIBILITY_OBSERVER /// Whether we're currently being drained or not. @@ -205,12 +205,28 @@ var/list/datum/mind/minds = list() /// The image shown to heretics var/image/heretic_image + /// We hold the turf we're on so we can remove and add the 'no prints' flag. + var/turf/on_turf /obj/effect/heretic_influence/Initialize(mapload) . = ..() GLOB.reality_smash_track.smashes += src heretic_image = image(icon, src, real_icon_state, OBJ_LAYER) generate_name() + on_turf = get_turf(src) + if(!istype(on_turf)) + return + on_turf.interaction_flags_atom |= INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND + RegisterSignal(on_turf, COMSIG_TURF_CHANGE, PROC_REF(replace_our_turf)) + +/obj/effect/heretic_influence/proc/replace_our_turf(datum/source, path, new_baseturfs, flags, post_change_callbacks) + SIGNAL_HANDLER + post_change_callbacks += CALLBACK(src, PROC_REF(replace_our_turf_two)) + on_turf = null //hard del ref? + +/obj/effect/heretic_influence/proc/replace_our_turf_two(turf/new_turf) + new_turf.interaction_flags_atom |= INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND + on_turf = new_turf /obj/effect/heretic_influence/Destroy() GLOB.reality_smash_track.smashes -= src @@ -218,6 +234,8 @@ remove_mind(heretic) heretic_image = null + on_turf?.interaction_flags_atom &= ~INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND + on_turf = null return ..() /obj/effect/heretic_influence/attack_hand_secondary(mob/user, list/modifiers) @@ -239,7 +257,8 @@ // Using a codex will give you two knowledge points for draining. if(!being_drained && istype(weapon, /obj/item/codex_cicatrix)) var/obj/item/codex_cicatrix/codex = weapon - codex.open_animation() + if(!codex.book_open) + codex.attack_self(user) // open booke INVOKE_ASYNC(src, PROC_REF(drain_influence), user, 2) return TRUE @@ -254,16 +273,13 @@ being_drained = TRUE balloon_alert(user, "draining influence...") - RegisterSignal(user, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) if(!do_after(user, 10 SECONDS, src)) being_drained = FALSE balloon_alert(user, "interrupted!") - UnregisterSignal(user, COMSIG_ATOM_EXAMINE) return // We don't need to set being_drained back since we delete after anyways - UnregisterSignal(user, COMSIG_ATOM_EXAMINE) balloon_alert(user, "influence drained") var/datum/antagonist/heretic/heretic_datum = IS_HERETIC(user) @@ -286,19 +302,6 @@ GLOB.reality_smash_track.num_drained++ qdel(src) -/* - * Signal proc for [COMSIG_ATOM_EXAMINE], registered on the user draining the influence. - * - * Gives a chance for examiners to see that the heretic is interacting with an infuence. - */ -/obj/effect/heretic_influence/proc/on_examine(atom/source, mob/user, list/examine_list) - SIGNAL_HANDLER - - if(prob(50)) - return - - examine_list += span_warning("[source]'s hand seems to be glowing a [span_hypnophrase("strange purple")]...") - /* * Add a mind to the list of tracked minds, * making another person able to see us. diff --git a/code/modules/antagonists/heretic/items/eldritch_flask.dm b/code/modules/antagonists/heretic/items/eldritch_flask.dm index b5a76b03d8955..95b77f956188c 100644 --- a/code/modules/antagonists/heretic/items/eldritch_flask.dm +++ b/code/modules/antagonists/heretic/items/eldritch_flask.dm @@ -3,6 +3,6 @@ /obj/item/reagent_containers/cup/beaker/eldritch name = "flask of eldritch essence" desc = "Toxic to the closed minded, yet refreshing to those with knowledge of the beyond." - icon = 'icons/obj/eldritch.dmi' + icon = 'icons/obj/antags/eldritch.dmi' icon_state = "eldrich_flask" list_reagents = list(/datum/reagent/eldritch = 50) diff --git a/code/modules/antagonists/heretic/items/forbidden_book.dm b/code/modules/antagonists/heretic/items/forbidden_book.dm index 10de35920bc2e..ff570801c5f1c 100644 --- a/code/modules/antagonists/heretic/items/forbidden_book.dm +++ b/code/modules/antagonists/heretic/items/forbidden_book.dm @@ -2,15 +2,13 @@ /obj/item/codex_cicatrix name = "Codex Cicatrix" desc = "This book describes the secrets of the veil between worlds." - icon = 'icons/obj/eldritch.dmi' + icon = 'icons/obj/antags/eldritch.dmi' base_icon_state = "book" icon_state = "book" worn_icon_state = "book" w_class = WEIGHT_CLASS_SMALL /// Helps determine the icon state of this item when it's used on self. var/book_open = FALSE - /// id for timer - var/timer_id /obj/item/codex_cicatrix/Initialize(mapload) . = ..() @@ -31,6 +29,7 @@ . += span_notice("Can be used to tap influences for additional knowledge points.") . += span_notice("Can also be used to draw or remove transmutation runes with ease.") + . += span_notice("Additionally, it can work as a focus for your spells in a pinch, though a more specialized relic is recommended, as this may get dropped in combat.") /obj/item/codex_cicatrix/attack_self(mob/user, modifiers) . = ..() @@ -39,8 +38,12 @@ if(book_open) close_animation() + RemoveElement(/datum/element/heretic_focus) + w_class = WEIGHT_CLASS_SMALL else open_animation() + AddElement(/datum/element/heretic_focus) + w_class = WEIGHT_CLASS_NORMAL /obj/item/codex_cicatrix/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() @@ -52,7 +55,7 @@ return if(isopenturf(target)) - heretic_datum.try_draw_rune(user, target, drawing_time = 12 SECONDS) + heretic_datum.try_draw_rune(user, target, drawing_time = 8 SECONDS) return TRUE /// Plays a little animation that shows the book opening and closing. @@ -61,12 +64,8 @@ flick("[base_icon_state]_opening", src) book_open = TRUE - timer_id = addtimer(CALLBACK(src, PROC_REF(close_animation)), 5 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE) - /// Plays a closing animation and resets the icon state. /obj/item/codex_cicatrix/proc/close_animation() icon_state = base_icon_state flick("[base_icon_state]_closing", src) book_open = FALSE - - deltimer(timer_id) diff --git a/code/modules/antagonists/heretic/items/heretic_armor.dm b/code/modules/antagonists/heretic/items/heretic_armor.dm index 577f901d0212c..93ab613190b1c 100644 --- a/code/modules/antagonists/heretic/items/heretic_armor.dm +++ b/code/modules/antagonists/heretic/items/heretic_armor.dm @@ -92,12 +92,27 @@ /obj/item/clothing/suit/hooded/cultrobes/void/Initialize(mapload) . = ..() - create_storage(storage_type = /datum/storage/pockets/void_cloak) + make_visible() -/obj/item/clothing/suit/hooded/cultrobes/void/Initialize(mapload) +/obj/item/clothing/suit/hooded/cultrobes/void/equipped(mob/user, slot) . = ..() - make_visible() + if(slot & ITEM_SLOT_OCLOTHING) + RegisterSignal(user, COMSIG_MOB_EQUIPPED_ITEM, PROC_REF(hide_item)) + RegisterSignal(user, COMSIG_MOB_UNEQUIPPED_ITEM, PROC_REF(show_item)) + +/obj/item/clothing/suit/hooded/cultrobes/void/dropped(mob/user) + . = ..() + UnregisterSignal(user, list(COMSIG_MOB_UNEQUIPPED_ITEM, COMSIG_MOB_EQUIPPED_ITEM)) + +/obj/item/clothing/suit/hooded/cultrobes/void/proc/hide_item(obj/item/item, slot) + SIGNAL_HANDLER + if(slot & ITEM_SLOT_SUITSTORE) + ADD_TRAIT(item, TRAIT_NO_STRIP, REF(src)) // i'd use examine hide but its a flag and yeah + +/obj/item/clothing/suit/hooded/cultrobes/void/proc/show_item(obj/item/item, slot) + SIGNAL_HANDLER + REMOVE_TRAIT(item, TRAIT_NO_STRIP, REF(src)) /obj/item/clothing/suit/hooded/cultrobes/void/examine(mob/user) . = ..() @@ -109,26 +124,23 @@ // Let examiners know this works as a focus only if the hood is down . += span_notice("Allows you to cast heretic spells while the hood is down.") -/obj/item/clothing/suit/hooded/cultrobes/void/RemoveHood() - // This is before the hood actually goes down - // We only make it visible if the hood is being moved from up to down - if(hood_up) - make_visible() - +/obj/item/clothing/suit/hooded/cultrobes/void/on_hood_down(obj/item/clothing/head/hooded/hood) + make_visible() return ..() -/obj/item/clothing/suit/hooded/cultrobes/void/MakeHood() +/obj/item/clothing/suit/hooded/cultrobes/void/can_create_hood() if(!isliving(loc)) CRASH("[src] attempted to make a hood on a non-living thing: [loc]") - var/mob/living/wearer = loc - if(!IS_HERETIC_OR_MONSTER(wearer)) - loc.balloon_alert(loc, "you can't get the hood up!") - return + if(IS_HERETIC_OR_MONSTER(wearer)) + return TRUE + + loc.balloon_alert(loc, "can't get the hood up!") + return FALSE - // When we make the hood, that means we're going invisible +/obj/item/clothing/suit/hooded/cultrobes/void/on_hood_created(obj/item/clothing/head/hooded/hood) + . = ..() make_invisible() - return ..() /// Makes our cloak "invisible". Not the wearer, the cloak itself. /obj/item/clothing/suit/hooded/cultrobes/void/proc/make_invisible() diff --git a/code/modules/antagonists/heretic/items/heretic_blades.dm b/code/modules/antagonists/heretic/items/heretic_blades.dm index b5bbfb3b598b1..63493a5dc4bdb 100644 --- a/code/modules/antagonists/heretic/items/heretic_blades.dm +++ b/code/modules/antagonists/heretic/items/heretic_blades.dm @@ -2,7 +2,7 @@ /obj/item/melee/sickly_blade name = "\improper sickly blade" desc = "A sickly green crescent blade, decorated with an ornamental eye. You feel like you're being watched..." - icon = 'icons/obj/eldritch.dmi' + icon = 'icons/obj/weapons/khopesh.dmi' icon_state = "eldritch_blade" inhand_icon_state = "eldritch_blade" lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi' @@ -115,3 +115,14 @@ icon_state = "cosmic_blade" inhand_icon_state = "cosmic_blade" after_use_message = "The Stargazer hears your call..." + +// Path of Knock's blade +/obj/item/melee/sickly_blade/knock + name = "\improper key blade" + desc = "A blade and a key, a key to what? \ + What grand gates does it open?" + icon_state = "key_blade" + inhand_icon_state = "key_blade" + after_use_message = "The Mother of Ants hears your call..." + tool_behaviour = TOOL_CROWBAR + toolspeed = 1.3 diff --git a/code/modules/antagonists/heretic/items/heretic_necks.dm b/code/modules/antagonists/heretic/items/heretic_necks.dm index c46a4bf214c50..fff184bdfb61a 100644 --- a/code/modules/antagonists/heretic/items/heretic_necks.dm +++ b/code/modules/antagonists/heretic/items/heretic_necks.dm @@ -12,7 +12,7 @@ /obj/item/clothing/neck/eldritch_amulet name = "Warm Eldritch Medallion" desc = "A strange medallion. Peering through the crystalline surface, the world around you melts away. You see your own beating heart, and the pulsing of a thousand others." - icon = 'icons/obj/eldritch.dmi' + icon = 'icons/obj/antags/eldritch.dmi' icon_state = "eye_medalion" w_class = WEIGHT_CLASS_SMALL resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF @@ -47,6 +47,6 @@ /obj/item/clothing/neck/fake_heretic_amulet name = "religious icon" desc = "A strange medallion, which makes its wearer look like they're part of some cult." - icon = 'icons/obj/eldritch.dmi' + icon = 'icons/obj/antags/eldritch.dmi' icon_state = "eye_medalion" w_class = WEIGHT_CLASS_SMALL diff --git a/code/modules/antagonists/heretic/items/hunter_rifle.dm b/code/modules/antagonists/heretic/items/hunter_rifle.dm index 6957470bcfb63..53f1c1555861b 100644 --- a/code/modules/antagonists/heretic/items/hunter_rifle.dm +++ b/code/modules/antagonists/heretic/items/hunter_rifle.dm @@ -1,5 +1,5 @@ /// The max range we can zoom in on people from. -#define MAX_LIONHUNTER_RANGE 16 +#define MAX_LIONHUNTER_RANGE 30 // The Lionhunter, a gun for heretics // The ammo it uses takes time to "charge" before firing, @@ -8,25 +8,27 @@ name = "\improper Lionhunter's Rifle" desc = "An antique looking rifle that looks immaculate despite being clearly very old." slot_flags = ITEM_SLOT_BACK - icon_state = "moistprime" - inhand_icon_state = "moistprime" - worn_icon_state = "moistprime" - mag_type = /obj/item/ammo_box/magazine/internal/boltaction/lionhunter + icon_state = "lionhunter" + inhand_icon_state = "lionhunter" + worn_icon_state = "lionhunter" + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/lionhunter fire_sound = 'sound/weapons/gun/sniper/shot.ogg' + SET_BASE_PIXEL(-8, 0) + /obj/item/gun/ballistic/rifle/lionhunter/Initialize(mapload) . = ..() - AddComponent(/datum/component/scope, range_modifier = 1.25) + AddComponent(/datum/component/scope, range_modifier = 3.2) /obj/item/ammo_box/magazine/internal/boltaction/lionhunter name = "lionhunter rifle internal magazine" - ammo_type = /obj/item/ammo_casing/a762/lionhunter - caliber = CALIBER_A762 + ammo_type = /obj/item/ammo_casing/strilka310/lionhunter + caliber = CALIBER_STRILKA310 max_ammo = 3 multiload = TRUE -/obj/item/ammo_casing/a762/lionhunter - projectile_type = /obj/projectile/bullet/a762/lionhunter +/obj/item/ammo_casing/strilka310/lionhunter + projectile_type = /obj/projectile/bullet/strilka310/lionhunter /// Whether we're currently aiming this casing at something var/currently_aiming = FALSE /// How many seconds it takes to aim per tile of distance between the target @@ -34,7 +36,7 @@ /// The minimum distance required to gain a damage bonus from aiming var/min_distance = 4 -/obj/item/ammo_casing/a762/lionhunter/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, atom/fired_from) +/obj/item/ammo_casing/strilka310/lionhunter/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, atom/fired_from) if(!loaded_projectile) return if(!check_fire(target, user)) @@ -43,7 +45,7 @@ return ..() /// Checks if we can successfully fire our projectile. -/obj/item/ammo_casing/a762/lionhunter/proc/check_fire(atom/target, mob/living/user) +/obj/item/ammo_casing/strilka310/lionhunter/proc/check_fire(atom/target, mob/living/user) // In case someone puts this in turrets or something wacky, just fire like normal if(!iscarbon(user) || !istype(loc, /obj/item/gun/ballistic/rifle/lionhunter)) return TRUE @@ -97,13 +99,13 @@ return . /// Callback for the do_after within the check_fire proc to see if something will prevent us from firing while aiming -/obj/item/ammo_casing/a762/lionhunter/proc/check_fire_callback(mob/living/target, mob/living/user) +/obj/item/ammo_casing/strilka310/lionhunter/proc/check_fire_callback(mob/living/target, mob/living/user) if(!isturf(target.loc)) return FALSE return TRUE -/obj/item/ammo_casing/a762/lionhunter/ready_proj(atom/target, mob/living/user, quiet, zone_override, atom/fired_from) +/obj/item/ammo_casing/strilka310/lionhunter/ready_proj(atom/target, mob/living/user, quiet, zone_override, atom/fired_from) if(!loaded_projectile) return @@ -113,7 +115,7 @@ // BUT, if we're at a decent range and the target's a living mob, // the projectile's been channel fired. It has full effects and homes in. if(distance > min_distance && isliving(target) && iscarbon(user)) - loaded_projectile.damage *= 1.33 + loaded_projectile.damage *= 2 loaded_projectile.stamina *= 2 loaded_projectile.knockdown = 0.5 SECONDS loaded_projectile.stutter = 6 SECONDS @@ -125,8 +127,8 @@ return ..() -/obj/projectile/bullet/a762/lionhunter - name = "hunter's 7.62 bullet" +/obj/projectile/bullet/strilka310/lionhunter + name = "hunter's .310 bullet" // These stats are only applied if the weapon is fired fully aimed // If fired without aiming or at someone too close, it will do much less damage = 30 @@ -134,11 +136,11 @@ projectile_phasing = PASSTABLE | PASSGLASS | PASSGRILLE | PASSCLOSEDTURF | PASSMACHINE | PASSSTRUCTURE | PASSDOORS // Extra ammunition can be made with a heretic ritual. -/obj/item/ammo_box/a762/lionhunter - name = "stripper clip (7.62mm hunter)" +/obj/item/ammo_box/strilka310/lionhunter + name = "stripper clip (.310 hunter)" desc = "A stripper clip of mysterious, atypical ammo. It doesn't fit into normal ballistic rifles." - icon_state = "762" - ammo_type = /obj/item/ammo_casing/a762/lionhunter + icon_state = "310_strip" + ammo_type = /obj/item/ammo_casing/strilka310/lionhunter max_ammo = 3 multiple_sprites = AMMO_BOX_PER_BULLET diff --git a/code/modules/antagonists/heretic/items/keyring.dm b/code/modules/antagonists/heretic/items/keyring.dm new file mode 100644 index 0000000000000..0498ba9e8a2aa --- /dev/null +++ b/code/modules/antagonists/heretic/items/keyring.dm @@ -0,0 +1,186 @@ +/obj/effect/knock_portal + name = "crack in reality" + desc = "A crack in space, impossibly deep and painful to the eyes. Definitely not safe." + icon = 'icons/effects/eldritch.dmi' + icon_state = "realitycrack" + light_system = STATIC_LIGHT + light_power = 1 + light_on = TRUE + light_color = COLOR_GREEN + light_range = 3 + opacity = TRUE + density = FALSE //so we dont block doors closing + layer = OBJ_LAYER //under doors + ///The knock portal we teleport to + var/obj/effect/knock_portal/destination + ///The airlock we are linked to, we delete if it is destroyed + var/obj/machinery/door/our_airlock + +/obj/effect/knock_portal/Initialize(mapload, target) + . = ..() + if(target) + our_airlock = target + RegisterSignal(target, COMSIG_QDELETING, PROC_REF(delete_on_door_delete)) + + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + +///Deletes us and our destination portal if our_airlock is destroyed +/obj/effect/knock_portal/proc/delete_on_door_delete(datum/source) + SIGNAL_HANDLER + qdel(src) + +///Signal handler for when our location is entered, calls teleport on the victim, if their old_loc didnt contain a portal already (to prevent loops) +/obj/effect/knock_portal/proc/on_entered(datum/source, mob/living/loser, atom/old_loc) + SIGNAL_HANDLER + if(istype(loser) && !(locate(type) in old_loc)) + teleport(loser) + +/obj/effect/knock_portal/Destroy() + QDEL_NULL(destination) + our_airlock = null + return ..() + +///Teleports the teleportee, to a random airlock if the teleportee isnt a heretic, or the other portal if they are one +/obj/effect/knock_portal/proc/teleport(mob/living/teleportee) + if(isnull(destination)) //dumbass + qdel(src) + return + + //get it? + var/obj/machinery/door/doorstination = IS_HERETIC_OR_MONSTER(teleportee) ? destination.our_airlock : find_random_airlock() + if(!do_teleport(teleportee, get_turf(doorstination), channel = TELEPORT_CHANNEL_MAGIC)) + return + + if(!IS_HERETIC_OR_MONSTER(teleportee)) + teleportee.apply_damage(20, BRUTE) //so they dont roll it like a jackpot machine to see if they can land in the armory + to_chat(teleportee, span_userdanger("You stumble through [src], battered by forces beyond your comprehension, landing anywhere but where you thought you were going.")) + + INVOKE_ASYNC(src, PROC_REF(async_opendoor), doorstination) + +///Returns a random airlock on the same Z level as our portal, that isnt our airlock +/obj/effect/knock_portal/proc/find_random_airlock() + var/list/turf/possible_destinations = list() + for(var/obj/airlock as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/airlock)) + if(airlock.z != z) + continue + if(airlock.loc == loc) + continue + possible_destinations += airlock + return pick(possible_destinations) + +///Asynchronous proc to unbolt, then open the passed door +/obj/effect/knock_portal/proc/async_opendoor(obj/machinery/door/door) + if(istype(door, /obj/machinery/door/airlock)) //they can create portals on ANY door, but we should unlock airlocks so they can actually open + var/obj/machinery/door/airlock/as_airlock = door + as_airlock.unbolt() + door.open() + +///An ID card capable of shapeshifting to other IDs given by the Key Keepers Burden knowledge +/obj/item/card/id/advanced/heretic + ///List of IDs this card consumed + var/list/obj/item/card/id/fused_ids = list() + ///The first portal in the portal pair, so we can clear it later + var/obj/effect/knock_portal/portal_one + ///The second portal in the portal pair, so we can clear it later + var/obj/effect/knock_portal/portal_two + ///The first door we are linking in the pair, so we can create a portal pair + var/datum/weakref/link + +/obj/item/card/id/advanced/heretic/examine(mob/user) + . = ..() + if(!IS_HERETIC_OR_MONSTER(user)) + return + . += span_hypnophrase("Enchanted by the Mansus!") + . += span_hypnophrase("Using an ID on this will consume it and allow you to copy its accesses.") + . += span_hypnophrase("Using this in-hand allows you to change its appearance.") + . += span_hypnophrase("Using this on a pair of doors, allows you to link them together. Entering one door will transport you to the other, while heathens are instead teleported to a random airlock.") + +/obj/item/card/id/advanced/heretic/attack_self(mob/user) + . = ..() + if(!IS_HERETIC(user)) + return + var/cardname = tgui_input_list(user, "Shapeshift into?", "Shapeshift", fused_ids) + if(!cardname) + balloon_alert(user, "no options!") + return ..() + var/obj/item/card/id/card = fused_ids[cardname] + shapeshift(card) + +///Changes our appearance to the passed ID card +/obj/item/card/id/advanced/heretic/proc/shapeshift(obj/item/card/id/advanced/card) + trim = card.trim + assignment = card.assignment + registered_age = card.registered_age + registered_name = card.registered_name + icon_state = card.icon_state + inhand_icon_state = card.inhand_icon_state + assigned_icon_state = card.assigned_icon_state + name = card.name //not update_label because of the captains spare moment + update_icon() + +///Deletes and nulls our portal pair +/obj/item/card/id/advanced/heretic/proc/clear_portals() + QDEL_NULL(portal_one) + QDEL_NULL(portal_two) + +///Clears portal references +/obj/item/card/id/advanced/heretic/proc/clear_portal_refs() + SIGNAL_HANDLER + portal_one = null + portal_two = null + +///Creates a portal pair at door1 and door2, displays a balloon alert to user +/obj/item/card/id/advanced/heretic/proc/make_portal(mob/user, obj/machinery/door/door1, obj/machinery/door/door2) + var/message = "linked" + if(portal_one || portal_two) + clear_portals() + message += ", previous cleared" + + portal_one = new(get_turf(door2), door2) + portal_two = new(get_turf(door1), door1) + portal_one.destination = portal_two + RegisterSignal(portal_one, COMSIG_QDELETING, PROC_REF(clear_portal_refs)) //we only really need to register one because they already qdel both portals if one is destroyed + portal_two.destination = portal_one + balloon_alert(user, "[message]") + +/obj/item/card/id/advanced/heretic/attackby(obj/item/thing, mob/user, params) + if(!istype(thing, /obj/item/card/id/advanced) || !IS_HERETIC(user)) + return ..() + var/obj/item/card/id/card = thing + fused_ids[card.name] = card + card.moveToNullspace() + playsound(drop_location(),'sound/items/eatfood.ogg', rand(10,50), TRUE) + access += card.access + +/obj/item/card/id/advanced/heretic/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(!proximity_flag || !IS_HERETIC(user)) + return + if(istype(target, /obj/effect/knock_portal)) + clear_portals() + return + + if(!istype(target, /obj/machinery/door)) + return + + var/reference_resolved = link?.resolve() + if(reference_resolved == target) + return + + if(reference_resolved) + make_portal(user, reference_resolved, target) + to_chat(user, span_notice("You use [src], to link [link] and [target] together.")) + link = null + balloon_alert(user, "link 2/2") + else + link = WEAKREF(target) + balloon_alert(user, "link 1/2") + +/obj/item/card/id/advanced/heretic/Destroy() + QDEL_LIST_ASSOC(fused_ids) + link = null + clear_portals() + return ..() diff --git a/code/modules/antagonists/heretic/items/lintel.dm b/code/modules/antagonists/heretic/items/lintel.dm new file mode 100644 index 0000000000000..140453842c090 --- /dev/null +++ b/code/modules/antagonists/heretic/items/lintel.dm @@ -0,0 +1,64 @@ +/obj/effect/forcefield/wizard/heretic + name = "consecrated lintel" + desc = "A field of papers flying in the air, repulsing heathens with impossible force." + icon_state = "lintel" + initial_duration = 8 SECONDS + +/obj/effect/forcefield/wizard/heretic/Bumped(mob/living/bumpee) + . = ..() + if(!istype(bumpee) || IS_HERETIC_OR_MONSTER(bumpee)) + return + var/throwtarget = get_edge_target_turf(loc, get_dir(loc, get_step_away(bumpee, loc))) + bumpee.safe_throw_at(throwtarget, 10, 1, force = MOVE_FORCE_EXTREMELY_STRONG) + visible_message(span_danger("[src] repulses [bumpee] in a storm of paper!")) + +///A heretic item that spawns a barrier at the clicked turf, 3 uses +/obj/item/heretic_lintel + name = "consecrated book" + desc = "Some kind of book, its contents make your head hurt. The material is not known to you and it seems to shift and twist unnaturally." + icon = 'icons/obj/service/library.dmi' + icon_state = "hereticlintel" + force = 10 + damtype = BURN + worn_icon_state = "book" + throw_speed = 1 + throw_range = 5 + w_class = WEIGHT_CLASS_NORMAL + attack_verb_continuous = list("bashes", "curses") + attack_verb_simple = list("bash", "curse") + resistance_flags = FLAMMABLE + drop_sound = 'sound/items/handling/book_drop.ogg' + pickup_sound = 'sound/items/handling/book_pickup.ogg' + ///what type of barrier do we spawn when used + var/barrier_type = /obj/effect/forcefield/wizard/heretic + ///how many uses do we have left + var/uses = 3 + +/obj/item/heretic_lintel/examine(mob/user) + . = ..() + if(!IS_HERETIC_OR_MONSTER(user)) + return + . += span_hypnophrase("Materializes a barrier upon any tile in sight, which only you can pass through. Lasts 8 seconds.") + . += span_hypnophrase("It has [uses] uses left.") + +/obj/item/heretic_lintel/afterattack(atom/target, mob/user, proximity_flag) + . = ..() + if(IS_HERETIC(user)) + var/turf/turf_target = get_turf(target) + if(locate(barrier_type) in turf_target) + user.balloon_alert(user, "already occupied!") + return + turf_target.visible_message(span_warning("A storm of paper materializes!")) + new /obj/effect/temp_visual/paper_scatter(turf_target) + playsound(turf_target, 'sound/magic/smoke.ogg', 30) + new barrier_type(turf_target, user) + uses-- + if(uses <= 0) + to_chat(user, span_warning("[src] falls apart, turning into ash and dust!")) + qdel(src) + return + var/mob/living/carbon/human/human_user = user + to_chat(human_user, span_userdanger("Your mind burns as you stare deep into the book, a headache setting in like your brain is on fire!")) + human_user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 30, 190) + human_user.add_mood_event("gates_of_mansus", /datum/mood_event/gates_of_mansus) + human_user.dropItemToGround(src) diff --git a/code/modules/antagonists/heretic/knife_effect.dm b/code/modules/antagonists/heretic/knife_effect.dm index 22e4495814309..b1a02fb680030 100644 --- a/code/modules/antagonists/heretic/knife_effect.dm +++ b/code/modules/antagonists/heretic/knife_effect.dm @@ -1,7 +1,7 @@ // "Floating ghost blade" effect for blade heretics /obj/effect/floating_blade name = "knife" - icon = 'icons/obj/kitchen.dmi' + icon = 'icons/obj/service/kitchen.dmi' icon_state = "knife" plane = GAME_PLANE_FOV_HIDDEN /// The color the knife glows around it. diff --git a/code/modules/antagonists/heretic/knowledge/ash_lore.dm b/code/modules/antagonists/heretic/knowledge/ash_lore.dm index dcb23609da11c..b72bd1e313405 100644 --- a/code/modules/antagonists/heretic/knowledge/ash_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/ash_lore.dm @@ -72,9 +72,9 @@ name = "Ashen Passage" desc = "Grants you Ashen Passage, a silent but short range jaunt." gain_text = "He knew how to walk between the planes." + adds_sidepath_points = 1 next_knowledge = list( /datum/heretic_knowledge/mark/ash_mark, - /datum/heretic_knowledge/codex_cicatrix, /datum/heretic_knowledge/summon/fire_shark, /datum/heretic_knowledge/medallion, ) @@ -127,6 +127,7 @@ The mask instills fear into heathens who witness it, causing stamina damage, hallucinations, and insanity. \ It can also be forced onto a heathen, to make them unable to take it off..." gain_text = "The Nightwatcher was lost. That's what the Watch believed. Yet he walked the world, unnoticed by the masses." + adds_sidepath_points = 1 next_knowledge = list( /datum/heretic_knowledge/blade_upgrade/ash, /datum/heretic_knowledge/reroll_targets, @@ -165,6 +166,7 @@ If any victims afflicted are in critical condition, they will also instantly die." gain_text = "The fire was inescapable, and yet, life remained in his charred body. \ The Nightwatcher was a particular man, always watching." + adds_sidepath_points = 1 next_knowledge = list( /datum/heretic_knowledge/ultimate/ash_final, /datum/heretic_knowledge/summon/ashy, @@ -188,12 +190,13 @@ route = PATH_ASH /// A static list of all traits we apply on ascension. var/static/list/traits_to_apply = list( - TRAIT_RESISTHEAT, + TRAIT_BOMBIMMUNE, TRAIT_NOBREATH, + TRAIT_NOFIRE, TRAIT_RESISTCOLD, + TRAIT_RESISTHEAT, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE, - TRAIT_NOFIRE, ) /datum/heretic_knowledge/ultimate/ash_final/is_valid_sacrifice(mob/living/carbon/human/sacrifice) @@ -223,6 +226,9 @@ existing_beam_spell.beam_duration *= 0.66 // Faster beams existing_beam_spell.cooldown_time *= 0.66 // Lower cooldown + var/datum/action/cooldown/spell/aoe/fiery_rebirth/fiery_rebirth = locate() in user.actions + fiery_rebirth?.cooldown_time *= 0.16 + user.client?.give_award(/datum/award/achievement/misc/ash_ascension, user) if(length(traits_to_apply)) user.add_traits(traits_to_apply, MAGIC_TRAIT) diff --git a/code/modules/antagonists/heretic/knowledge/blade_lore.dm b/code/modules/antagonists/heretic/knowledge/blade_lore.dm index bbaf6014821e4..84e266c837458 100644 --- a/code/modules/antagonists/heretic/knowledge/blade_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/blade_lore.dm @@ -101,10 +101,10 @@ towards your attacker. This effect can only trigger once every 20 seconds." gain_text = "The footsoldier was known to be a fearsome duelist. \ Their general quickly appointed them as their personal Champion." + adds_sidepath_points = 1 next_knowledge = list( /datum/heretic_knowledge/limited_amount/risen_corpse, /datum/heretic_knowledge/mark/blade_mark, - /datum/heretic_knowledge/codex_cicatrix, /datum/heretic_knowledge/armor, ) cost = 1 @@ -225,7 +225,10 @@ During this process, you will rapidly regenerate stamina and quickly recover from stuns, however, you will be unable to attack. \ This spell can be cast in rapid succession, but doing so will increase the cooldown." gain_text = "In the flurry of death, he found peace within himself. Despite insurmountable odds, he forged on." - next_knowledge = list(/datum/heretic_knowledge/duel_stance) + next_knowledge = list( + /datum/heretic_knowledge/duel_stance, + /datum/heretic_knowledge/rifle, + ) spell_to_add = /datum/action/cooldown/spell/realignment cost = 1 route = PATH_BLADE @@ -240,6 +243,7 @@ you gain increased resistance to gaining wounds and resistance to batons." gain_text = "In time, it was he who stood alone among the bodies of his former comrades, awash in blood, none of it his own. \ He was without rival, equal, or purpose." + adds_sidepath_points = 1 next_knowledge = list( /datum/heretic_knowledge/blade_upgrade/blade, /datum/heretic_knowledge/reroll_targets, @@ -369,10 +373,11 @@ at a target, dealing damage and causing bleeding." gain_text = "Without thinking, I took the knife of a fallen soldier and threw with all my might. My aim was true! \ The Torn Champion smiled at their first taste of agony, and with a nod, their blades became my own." + adds_sidepath_points = 1 next_knowledge = list( /datum/heretic_knowledge/summon/maid_in_mirror, /datum/heretic_knowledge/ultimate/blade_final, - /datum/heretic_knowledge/rifle, + /datum/heretic_knowledge/spell/rust_charge, ) spell_to_add = /datum/action/cooldown/spell/pointed/projectile/furious_steel cost = 1 @@ -385,7 +390,7 @@ When completed, you will be surrounded in a constant, regenerating orbit of blades. \ These blades will protect you from all attacks, but are consumed on use. \ Your Furious Steel spell will also have a shorter cooldown. \ - Additionally, you become a master of combat, gaining full wound and stun immunity. \ + Additionally, you become a master of combat, gaining full wound immunity and the ability to shrug off short stuns. \ Your Sundered Blades deal bonus damage and heal you on attack for a portion of the damage dealt." gain_text = "The Torn Champion is freed! I will become the blade reunited, and with my greater ambition, \ I AM UNMATCHED! A STORM OF STEEL AND SILVER IS UPON US! WITNESS MY ASCENSION!" @@ -402,13 +407,29 @@ . = ..() priority_announce("[generate_heretic_text()] Master of blades, the Torn Champion'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()]", ANNOUNCER_SPANOMALIES) user.client?.give_award(/datum/award/achievement/misc/blade_ascension, user) - user.add_traits(list(TRAIT_STUNIMMUNE, TRAIT_NEVER_WOUNDED), name) + ADD_TRAIT(user, TRAIT_NEVER_WOUNDED, name) RegisterSignal(user, COMSIG_HERETIC_BLADE_ATTACK, PROC_REF(on_eldritch_blade)) user.apply_status_effect(/datum/status_effect/protective_blades/recharging, null, 8, 30, 0.25 SECONDS, 1 MINUTES) - + user.add_stun_absorption( + source = name, + message = span_warning("%EFFECT_OWNER throws off the stun!"), + self_message = span_warning("You throw off the stun!"), + examine_message = span_hypnophrase("%EFFECT_OWNER_THEYRE standing stalwartly."), + // flashbangs are like 5-10 seoncds, + // a banana peel is ~5 seconds, depending on botany + // body throws and tackles are less than 5 seconds, + // stun baton / stamcrit detracts no time, + // and worst case: beepsky / tasers are 10 seconds. + max_seconds_of_stuns_blocked = 45 SECONDS, + delete_after_passing_max = FALSE, + recharge_time = 2 MINUTES, + ) var/datum/action/cooldown/spell/pointed/projectile/furious_steel/steel_spell = locate() in user.actions steel_spell?.cooldown_time /= 2 + var/mob/living/carbon/human/heretic = user + heretic.physiology.knockdown_mod = 0.75 // Otherwise knockdowns would probably overpower the stun absorption effect. + /datum/heretic_knowledge/ultimate/blade_final/proc/on_eldritch_blade(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) SIGNAL_HANDLER diff --git a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm index 769b15868252a..4607d78ff5c86 100644 --- a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm @@ -31,7 +31,7 @@ desc = "Opens up the Path of Cosmos to you. \ Allows you to transmute a sheet of plasma and a knife into an Cosmic Blade. \ You can only create two at a time." - gain_text = "It looked at the stars to guide himself." + gain_text = "A nebula appeared in the sky, its infernal birth shone upon me. This was the start of a great transcendence." next_knowledge = list(/datum/heretic_knowledge/cosmic_grasp) required_atoms = list( /obj/item/knife = 1, @@ -43,8 +43,8 @@ /datum/heretic_knowledge/cosmic_grasp name = "Grasp of Cosmos" desc = "Your Mansus Grasp will give people a star mark (cosmic ring) and create a cosmic field where you stand." - gain_text = "The more he looked the more everything made sense. \ - The stars traced out the path forward to his home." + gain_text = "Some stars dimmed, others' magnitude increased. \ + With newfound strength I could channel the nebula's power into myself." next_knowledge = list(/datum/heretic_knowledge/spell/cosmic_runes) cost = 1 route = PATH_COSMIC @@ -68,11 +68,11 @@ desc = "Grants you Cosmic Runes, a spell that creates two runes linked with eachother for easy teleportation. \ Only the entity activating the rune will get transported, and it can be used by anyone without a star mark. \ However, people with a star mark will get transported along with another person using the rune." - gain_text = "When day came, the Sleeper got lost. \ - The sun outshone the stars, so he lost his guide." + gain_text = "The distant stars crept into my dreams, roaring and screaming without reason. \ + I spoke, and heard my own words echoed back." + adds_sidepath_points = 1 next_knowledge = list( /datum/heretic_knowledge/mark/cosmic_mark, - /datum/heretic_knowledge/codex_cicatrix, /datum/heretic_knowledge/essence, /datum/heretic_knowledge/summon/fire_shark, ) @@ -85,8 +85,8 @@ desc = "Your Mansus Grasp now applies the Mark of Cosmos. The mark is triggered from an attack with your Cosmic Blade. \ When triggered, the victim is returned to the location where the mark was originally applied to them. \ They will then be paralyzed for 2 seconds." - gain_text = "As the guide was lost he found a new. The energy increased as the gaze he threw. \ - He didn't know, but with focus, the Sleepers energy began to flow." + gain_text = "The Beast now whispered to me occasionally, only small tidbits of their circumstances. \ + I can help them, I have to help them." next_knowledge = list(/datum/heretic_knowledge/knowledge_ritual/cosmic) route = PATH_COSMIC mark_type = /datum/status_effect/eldritch/cosmic @@ -102,8 +102,8 @@ will be forced to sleep for 4 seconds. When the victim is hit it also creates a beam that \ deals a bit of fire damage and damages the cells. \ The beam lasts a minute, until the beam is obstructed or until a new target has been found." - gain_text = "He dreamed to know how the matter travelled from star to star. \ - He lost interest in wanting to find out." + gain_text = "After waking in a cold sweat I felt a palm on my scalp, a sigil burned onto me. \ + My veins now emitted a strange purple glow, the Beast knows I will surpass its expectations." next_knowledge = list(/datum/heretic_knowledge/spell/star_blast) spell_to_add = /datum/action/cooldown/spell/touch/star_touch cost = 1 @@ -113,7 +113,8 @@ name = "Star Blast" desc = "Fires a projectile that moves very slowly and creates cosmic fields on impact. \ Anyone hit by the projectile will recieve burn damage, a knockdown, and give people in a three tile range a star mark." - gain_text = "He didn't try, yet felt the call of the night's Creator." + gain_text = "The Beast was behind me now at all times, with each sacrifice words of affirmation coursed through me." + adds_sidepath_points = 1 next_knowledge = list( /datum/heretic_knowledge/blade_upgrade/cosmic, /datum/heretic_knowledge/reroll_targets, @@ -131,8 +132,8 @@ The combo is reset after two seconds without making an attack, \ or if you attack someone already marked. If you combo more than four attacks you will recieve, \ a cosmic trail and increase your combo timer up to ten seconds." - gain_text = "As he ascended to be a watcher, he needed to gather knowledge. \ - He started to draw it at his home." + gain_text = "The Beast took my blades in their hand, I kneeled and felt a sharp pain. \ + The blades now glistened with fragmented power. I fell to the ground and wept at the beast's feet." next_knowledge = list(/datum/heretic_knowledge/spell/cosmic_expansion) route = PATH_COSMIC /// Storage for the second target. @@ -160,8 +161,11 @@ combo_timer = addtimer(CALLBACK(src, PROC_REF(reset_combo), source), combo_duration, TIMER_STOPPABLE) var/mob/living/second_target_resolved = second_target?.resolve() var/mob/living/third_target_resolved = third_target?.resolve() - target.adjustFireLoss(4) - target.adjustCloneLoss(2) + var/need_mob_update = FALSE + need_mob_update += target.adjustFireLoss(4, updating_health = FALSE) + need_mob_update += target.adjustCloneLoss(2, updating_health = FALSE) + if(need_mob_update) + target.updatehealth() if(target == second_target_resolved || target == third_target_resolved) reset_combo(source) return @@ -170,19 +174,25 @@ if(second_target_resolved) new /obj/effect/temp_visual/cosmic_explosion(get_turf(second_target_resolved)) playsound(get_turf(second_target_resolved), 'sound/magic/cosmic_energy.ogg', 25, FALSE) - second_target_resolved.adjustFireLoss(10) - second_target_resolved.adjustCloneLoss(6) + need_mob_update = FALSE + need_mob_update += second_target_resolved.adjustFireLoss(10, updating_health = FALSE) + need_mob_update += second_target_resolved.adjustCloneLoss(6, updating_health = FALSE) + if(need_mob_update) + target.updatehealth() if(third_target_resolved) new /obj/effect/temp_visual/cosmic_domain(get_turf(third_target_resolved)) playsound(get_turf(third_target_resolved), 'sound/magic/cosmic_energy.ogg', 50, FALSE) - third_target_resolved.adjustFireLoss(20) - third_target_resolved.adjustCloneLoss(12) + need_mob_update = FALSE + need_mob_update += third_target_resolved.adjustFireLoss(20, updating_health = FALSE) + need_mob_update += third_target_resolved.adjustCloneLoss(12, updating_health = FALSE) + if(need_mob_update) + target.updatehealth() if(combo_counter > 3) target.apply_status_effect(/datum/status_effect/star_mark, source) if(target.mind && target.stat != DEAD) increase_combo_duration() if(combo_counter == 4) - source.AddElement(/datum/element/effect_trail/cosmic_trail) + source.AddElement(/datum/element/effect_trail, /obj/effect/forcefield/cosmic_field/fast) third_target = second_target second_target = WEAKREF(target) @@ -191,7 +201,7 @@ second_target = null third_target = null if(combo_counter > 3) - source.RemoveElement(/datum/element/effect_trail/cosmic_trail) + source.RemoveElement(/datum/element/effect_trail, /obj/effect/forcefield/cosmic_field/fast) combo_duration = combo_duration_amount combo_counter = 0 new /obj/effect/temp_visual/cosmic_cloud(get_turf(source)) @@ -207,7 +217,8 @@ name = "Cosmic Expansion" desc = "Grants you Cosmic Expansion, a spell that creates a 3x3 area of cosmic fields around you. \ Nearby beings will also receive a star mark." - gain_text = "He was well known, so he had a lot of drawing to do to gather as much of the things he forgot." + gain_text = "The ground now shook beneath me. The Beast inhabited me, and their voice was intoxicating." + adds_sidepath_points = 1 next_knowledge = list( /datum/heretic_knowledge/ultimate/cosmic_final, /datum/heretic_knowledge/eldritch_coin, @@ -227,9 +238,10 @@ The Star Gazer is a strong ally who can even break down reinforced walls. \ The Star Gazer has an aura that will heal you and damage opponents. \ Star Touch can now teleport you to the Star Gazer when activated in your hand." - gain_text = "The past is gone, the Star Gazer became a vessel to watch over the universe. \ - The Creator made this his path and he forgot his purpose. \ - THE TIME IS NOW, WITNESS MY ASCENSION, THE STAR GAZER HAS GAINED PURPOSE ONCE MORE!" + gain_text = "The Beast held out its hand, I grabbed hold and they pulled me to them. Their body was towering, but it seemed so small and feeble after all their tales compiled in my head. \ + I clung on to them, they would protect me, and I would protect it. \ + I closed my eyes with my head laid against their form. I was safe. \ + WITNESS MY ASCENSION!" route = PATH_COSMIC /// A static list of command we can use with our mob. var/static/list/star_gazer_commands = list( @@ -249,10 +261,10 @@ /datum/heretic_knowledge/ultimate/cosmic_final/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) . = ..() priority_announce("[generate_heretic_text()] A Star Gazer has arrived into the station, [user.real_name] has ascended! This station is the domain of the Cosmos! [generate_heretic_text()]","[generate_heretic_text()]", ANNOUNCER_SPANOMALIES) - var/mob/living/basic/star_gazer/star_gazer_mob = new /mob/living/basic/star_gazer(loc) + var/mob/living/basic/heretic_summon/star_gazer/star_gazer_mob = new /mob/living/basic/heretic_summon/star_gazer(loc) star_gazer_mob.maxHealth = INFINITY star_gazer_mob.health = INFINITY - user.AddElement(/datum/element/death_linked, star_gazer_mob) + user.AddComponent(/datum/component/death_linked, star_gazer_mob) star_gazer_mob.AddComponent(/datum/component/obeys_commands, star_gazer_commands) star_gazer_mob.AddComponent(/datum/component/damage_aura, range = 7, burn_damage = 0.5, simple_damage = 0.5, immune_factions = list(FACTION_HERETIC), current_owner = user) star_gazer_mob.befriend(user) diff --git a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm index 76324e83a08ca..c38fcc1a85629 100644 --- a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm @@ -126,9 +126,9 @@ Voiceless Dead are mute ghouls and only have 50 health, but can use Bloody Blades effectively. \ You can only create two at a time." gain_text = "I found notes of a dark ritual, unfinished... yet still, I pushed forward." + adds_sidepath_points = 1 next_knowledge = list( /datum/heretic_knowledge/mark/flesh_mark, - /datum/heretic_knowledge/codex_cicatrix, /datum/heretic_knowledge/void_cloak, /datum/heretic_knowledge/medallion, ) @@ -239,6 +239,7 @@ the ability to link minds to communicate with ease, but are very fragile and weak in combat." gain_text = "I could not continue alone. I was able to summon The Uncanny Man to help me see more. \ The screams... once constant, now silenced by their wretched appearance. Nothing was out of reach." + adds_sidepath_points = 1 next_knowledge = list( /datum/heretic_knowledge/blade_upgrade/flesh, /datum/heretic_knowledge/reroll_targets, @@ -250,9 +251,10 @@ /obj/effect/decal/cleanable/blood = 1, /obj/item/bodypart/arm/left = 1, ) - mob_to_summon = /mob/living/simple_animal/hostile/heretic_summon/raw_prophet + mob_to_summon = /mob/living/basic/heretic_summon/raw_prophet cost = 1 route = PATH_FLESH + poll_ignore_define = POLL_IGNORE_RAW_PROPHET /datum/heretic_knowledge/blade_upgrade/flesh name = "Bleeding Steel" @@ -261,6 +263,8 @@ I finally began to understand. And then, blood rained from the heavens." next_knowledge = list(/datum/heretic_knowledge/summon/stalker) route = PATH_FLESH + ///What type of wound do we apply on hit + var/wound_type = /datum/wound/slash/flesh/severe /datum/heretic_knowledge/blade_upgrade/flesh/do_melee_effects(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) if(!iscarbon(target) || source == target) @@ -268,7 +272,7 @@ var/mob/living/carbon/carbon_target = target var/obj/item/bodypart/bodypart = pick(carbon_target.bodyparts) - var/datum/wound/slash/severe/crit_wound = new() + var/datum/wound/crit_wound = new wound_type() crit_wound.apply_wound(bodypart, attack_direction = get_dir(source, target)) /datum/heretic_knowledge/summon/stalker @@ -277,6 +281,7 @@ Stalkers can jaunt, release EMPs, shapeshift into animals or automatons, and are strong in combat." gain_text = "I was able to combine my greed and desires to summon an eldritch beast I had never seen before. \ An ever shapeshifting mass of flesh, it knew well my goals. The Marshal approved." + adds_sidepath_points = 1 next_knowledge = list( /datum/heretic_knowledge/ultimate/flesh_final, /datum/heretic_knowledge/summon/ashy, @@ -289,9 +294,10 @@ /obj/item/pen = 1, /obj/item/paper = 1, ) - mob_to_summon = /mob/living/simple_animal/hostile/heretic_summon/stalker + mob_to_summon = /mob/living/basic/heretic_summon/stalker cost = 1 route = PATH_FLESH + poll_ignore_define = POLL_IGNORE_STALKER /datum/heretic_knowledge/ultimate/flesh_final name = "Priest's Final Hymn" diff --git a/code/modules/antagonists/heretic/knowledge/general_side.dm b/code/modules/antagonists/heretic/knowledge/general_side.dm index 9c3fbe9d447f3..2dc2719227b1c 100644 --- a/code/modules/antagonists/heretic/knowledge/general_side.dm +++ b/code/modules/antagonists/heretic/knowledge/general_side.dm @@ -39,19 +39,3 @@ return FALSE return TRUE - -/datum/heretic_knowledge/codex_cicatrix - name = "Codex Cicatrix" - desc = "Allows you to transmute a bible, a fountain pen, and hide from an animal (or human) to create a Codex Cicatrix. \ - The Codex Cicatrix can be used when draining influences to gain additional knowledge, but comes at greater risk of being noticed. \ - It can also be used to draw and remove transmutation runes easier." - gain_text = "The occult leaves fragments of knowledge and power anywhere and everywhere. The Codex Cicatrix is one such example. \ - Within the leather-bound faces and age old pages, a path into the Mansus is revealed." - required_atoms = list( - /obj/item/book/bible = 1, - /obj/item/pen/fountain = 1, - /obj/item/stack/sheet/animalhide = 1, - ) - result_atoms = list(/obj/item/codex_cicatrix) - cost = 1 - route = PATH_SIDE diff --git a/code/modules/antagonists/heretic/knowledge/knock_lore.dm b/code/modules/antagonists/heretic/knowledge/knock_lore.dm new file mode 100644 index 0000000000000..6879f527b6b8b --- /dev/null +++ b/code/modules/antagonists/heretic/knowledge/knock_lore.dm @@ -0,0 +1,230 @@ +/** + * # The path of Knock. + * + * Goes as follows: + * + * A Locksmith’s Secret + * Grasp of Knock + * > Sidepaths: + * Ashen Eyes + * Codex Cicatrix + * Key Keeper’s Burden + * + * Rite Of Passage + * Mark Of Knock + * Ritual of Knowledge + * Burglar's Finesse + * > Sidepaths: + * Apetra Vulnera + * Opening Blast + * + * Opening Blade + * Caretaker’s Last Refuge + * + * Many secrets behind the Spider Door + */ +/datum/heretic_knowledge/limited_amount/starting/base_knock + name = "A Locksmith’s Secret" + desc = "Opens up the Path of Knock to you. \ + Allows you to transmute a knife and a crowbar into a Key Blade. \ + You can only create two at a time and they function as fast crowbars. \ + In addition, they can fit into utility belts." + gain_text = "The Knock permits no seal and no isolation. It thrusts us gleefully out of the safety of ignorance." + next_knowledge = list(/datum/heretic_knowledge/knock_grasp) + required_atoms = list( + /obj/item/knife = 1, + /obj/item/crowbar = 1, + ) + result_atoms = list(/obj/item/melee/sickly_blade/knock) + limit = 2 + route = PATH_KNOCK + +/datum/heretic_knowledge/knock_grasp + name = "Grasp of Knock" + desc = "Your mansus grasp allows you to access anything! Right click on an airlock or a locker to force it open. \ + DNA locks on mechs will be removed, and any pilot will be ejected. Works on consoles. \ + Makes a distinctive knocking sound on use." + gain_text = "Nothing may remain closed from my touch." + next_knowledge = list( + /datum/heretic_knowledge/key_ring, + /datum/heretic_knowledge/medallion, + /datum/heretic_knowledge/codex_cicatrix, + ) + cost = 1 + route = PATH_KNOCK + +/datum/heretic_knowledge/knock_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) + RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK_SECONDARY, PROC_REF(on_secondary_mansus_grasp)) + RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) + +/datum/heretic_knowledge/knock_grasp/on_lose(mob/user, datum/antagonist/heretic/our_heretic) + UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK_SECONDARY) + UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK) + +/datum/heretic_knowledge/knock_grasp/proc/on_mansus_grasp(mob/living/source, mob/living/target) + SIGNAL_HANDLER + var/obj/item/clothing/under/suit = target.get_item_by_slot(ITEM_SLOT_ICLOTHING) + if(istype(suit) && suit.adjusted == NORMAL_STYLE) + suit.toggle_jumpsuit_adjust() + suit.update_appearance() + +/datum/heretic_knowledge/knock_grasp/proc/on_secondary_mansus_grasp(mob/living/source, atom/target) + SIGNAL_HANDLER + + if(ismecha(target)) + var/obj/vehicle/sealed/mecha/mecha = target + mecha.dna_lock = null + for(var/mob/living/occupant as anything in mecha.occupants) + if(isAI(occupant)) + continue + mecha.mob_exit(occupant, randomstep = TRUE) + else if(istype(target,/obj/machinery/door/airlock)) + var/obj/machinery/door/airlock/door = target + door.unbolt() + else if(istype(target, /obj/machinery/computer)) + var/obj/machinery/computer/computer = target + computer.authenticated = TRUE + computer.balloon_alert(source, "unlocked") + + var/turf/target_turf = get_turf(target) + SEND_SIGNAL(target_turf, COMSIG_ATOM_MAGICALLY_UNLOCKED, src, source) + playsound(target, 'sound/magic/hereticknock.ogg', 100, TRUE, -1) + + return COMPONENT_USE_HAND + +/datum/heretic_knowledge/key_ring + name = "Key Keeper’s Burden" + desc = "Allows you to transmute a wallet, an iron rod, and an ID card to create an Eldritch Card. \ + It functions the same as an ID Card, but attacking it with an ID card fuses it and gains its access. \ + You can use it in-hand to change its form to a card you fused. \ + Does not preserve the card used in the ritual." + gain_text = "Gateways shall open before me, my very will ensnaring reality." + adds_sidepath_points = 1 + required_atoms = list( + /obj/item/storage/wallet = 1, + /obj/item/stack/rods = 1, + /obj/item/card/id = 1, + ) + result_atoms = list(/obj/item/card/id/advanced/heretic) + next_knowledge = list(/datum/heretic_knowledge/limited_amount/rite_of_passage) + cost = 1 + route = PATH_KNOCK + +/datum/heretic_knowledge/limited_amount/rite_of_passage // item that creates 3 max at a time heretic only barriers, probably should limit to 1 only, holy people can also pass + name = "Rite Of Passage" + desc = "Allows you to transmute a white crayon, a wooden plank, and a multitool to create a Consecrated Book. \ + It can materialize a barricade at range that only you and people resistant to magic can pass. 3 uses." + gain_text = "With this I can repel those that intend me harm." + required_atoms = list( + /obj/item/toy/crayon/white = 1, + /obj/item/stack/sheet/mineral/wood = 1, + /obj/item/multitool = 1, + ) + result_atoms = list(/obj/item/heretic_lintel) + next_knowledge = list(/datum/heretic_knowledge/mark/knock_mark) + cost = 1 + route = PATH_KNOCK + +/datum/heretic_knowledge/mark/knock_mark + name = "Mark of Knock" + desc = "Your Mansus Grasp now applies the Mark of Knock. \ + Attack a marked person to bar them from all passages for the duration of the mark. \ + This will make it so that they have no access whatsoever, even public access doors will reject them." + gain_text = "Their requests for passage will remain unheeded." + next_knowledge = list(/datum/heretic_knowledge/knowledge_ritual/knock) + route = PATH_KNOCK + mark_type = /datum/status_effect/eldritch/knock + +/datum/heretic_knowledge/knowledge_ritual/knock + next_knowledge = list(/datum/heretic_knowledge/spell/burglar_finesse) + route = PATH_KNOCK + +/datum/heretic_knowledge/spell/burglar_finesse + name = "Burglar's Finesse" + desc = "Grants you Burglar's Finesse, a single-target spell \ + that puts a random item from the victims backpack into your hand." + gain_text = "Their trinkets will be mine, as will their lives in due time." + adds_sidepath_points = 1 + next_knowledge = list( + /datum/heretic_knowledge/spell/apetra_vulnera, + /datum/heretic_knowledge/spell/opening_blast, + /datum/heretic_knowledge/blade_upgrade/flesh/knock, + ) + spell_to_add = /datum/action/cooldown/spell/pointed/burglar_finesse + cost = 2 + route = PATH_KNOCK + +/datum/heretic_knowledge/blade_upgrade/flesh/knock //basically a chance-based weeping avulsion version of the former + name = "Opening Blade" + desc = "Your blade has a chance to cause a weeping avulsion on attack." + gain_text = "The power of my patron courses through my blade, willing their very flesh to part." + next_knowledge = list(/datum/heretic_knowledge/spell/caretaker_refuge) + route = PATH_KNOCK + wound_type = /datum/wound/slash/flesh/critical + var/chance = 35 + +/datum/heretic_knowledge/blade_upgrade/flesh/knock/do_melee_effects(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) + if(prob(chance)) + return ..() + +/datum/heretic_knowledge/spell/caretaker_refuge + name = "Caretaker’s Last Refuge" + desc = "Gives you a spell that makes you transparent and not dense. Cannot be used near living sentient beings. \ + While in refuge, you cannot use your hands or spells, and you are immune to slowdown. \ + You are invincible but unable to harm anything. Cancelled by being hit with an anti-magic item." + gain_text = "Then I saw my my own reflection cascaded mind-numbingly enough times that I was but a haze." + adds_sidepath_points = 1 + next_knowledge = list(/datum/heretic_knowledge/ultimate/knock_final) + route = PATH_KNOCK + spell_to_add = /datum/action/cooldown/spell/caretaker + cost = 1 + +/datum/heretic_knowledge/ultimate/knock_final + name = "Many secrets behind the Spider Door" + desc = "The ascension ritual of the Path of Knock. \ + Bring 3 corpses without organs in their torso to a transmutation rune to complete the ritual. \ + When completed, you gain the ability to transform into empowered eldritch creatures \ + and in addition, create a tear to the Spider Door; \ + a tear in reality located at the site of this ritual. \ + Eldritch creatures will endlessly pour from this rift \ + who are bound to obey your instructions." + gain_text = "With her knowledge, and what I had seen, I knew what to do. \ + I had to open the gates, with the holes in my foes as Ways! \ + Reality will soon be torn, the Spider Gate opened! WITNESS ME!" + required_atoms = list(/mob/living/carbon/human = 3) + route = PATH_KNOCK + +/datum/heretic_knowledge/ultimate/knock_final/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) + . = ..() + if(!.) + return FALSE + + for(var/mob/living/carbon/human/body in atoms) + if(body.stat != DEAD) + continue + var/obj/item/bodypart/chest = body.get_bodypart(BODY_ZONE_CHEST) + if(LAZYLEN(chest.get_organs())) + to_chat(user, span_hierophant_warning("[body] has organs in their chest.")) + continue + + selected_atoms += body + + if(!LAZYLEN(selected_atoms)) + loc.balloon_alert(user, "ritual failed, not enough valid bodies!") + return FALSE + return TRUE + +/datum/heretic_knowledge/ultimate/knock_final/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) + . = ..() + priority_announce("Delta-class dimensional anomaly detec[generate_heretic_text()] Reality rended, torn. Gates open, doors open, [user.real_name] has ascended! Fear the tide! [generate_heretic_text()]", "Centra[generate_heretic_text()]", ANNOUNCER_SPANOMALIES) + user.client?.give_award(/datum/award/achievement/misc/knock_ascension, user) + + // buffs + var/datum/action/cooldown/spell/shapeshift/eldritch/ascension/transform_spell = new(user.mind) + transform_spell.Grant(user) + + user.client?.give_award(/datum/award/achievement/misc/knock_ascension, user) + var/datum/antagonist/heretic/heretic_datum = IS_HERETIC(user) + var/datum/heretic_knowledge/blade_upgrade/flesh/knock/blade_upgrade = heretic_datum.get_knowledge(/datum/heretic_knowledge/blade_upgrade/flesh/knock) + blade_upgrade.chance += 30 + new /obj/structure/knock_tear(loc, user.mind) diff --git a/code/modules/antagonists/heretic/knowledge/rust_lore.dm b/code/modules/antagonists/heretic/knowledge/rust_lore.dm index 9c981e5bebfda..966134710b432 100644 --- a/code/modules/antagonists/heretic/knowledge/rust_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/rust_lore.dm @@ -80,11 +80,12 @@ name = "Leeching Walk" desc = "Grants you passive healing and resistance to batons while standing over rust." gain_text = "The speed was unparalleled, the strength unnatural. The Blacksmith was smiling." + adds_sidepath_points = 1 next_knowledge = list( /datum/heretic_knowledge/mark/rust_mark, - /datum/heretic_knowledge/codex_cicatrix, /datum/heretic_knowledge/armor, /datum/heretic_knowledge/essence, + /datum/heretic_knowledge/entropy_pulse, ) cost = 1 route = PATH_RUST @@ -125,11 +126,14 @@ return // Heals all damage + Stamina - source.adjustBruteLoss(-2, FALSE) - source.adjustFireLoss(-2, FALSE) - source.adjustToxLoss(-2, FALSE, forced = TRUE) // Slimes are people to - source.adjustOxyLoss(-0.5, FALSE) - source.adjustStaminaLoss(-2) + var/need_mob_update = FALSE + need_mob_update += source.adjustBruteLoss(-2, updating_health = FALSE) + need_mob_update += source.adjustFireLoss(-2, updating_health = FALSE) + need_mob_update += source.adjustToxLoss(-2, updating_health = FALSE, forced = TRUE) // Slimes are people too + need_mob_update += source.adjustOxyLoss(-0.5, updating_health = FALSE) + need_mob_update += source.adjustStaminaLoss(-2, updating_stamina = FALSE) + if(need_mob_update) + source.updatehealth() // Reduces duration of stuns/etc source.AdjustAllImmobility(-0.5 SECONDS) // Heals blood loss @@ -155,7 +159,10 @@ Anyone overtop the wall will be throw aside (or upwards) and sustain damage." gain_text = "Images of foreign and ominous structures began to dance in my mind. Covered head to toe in thick rust, \ they no longer looked man made. Or perhaps they never were in the first place." - next_knowledge = list(/datum/heretic_knowledge/spell/area_conversion) + next_knowledge = list( + /datum/heretic_knowledge/spell/area_conversion, + /datum/heretic_knowledge/rifle, + ) spell_to_add = /datum/action/cooldown/spell/pointed/rust_construction cost = 1 route = PATH_RUST @@ -165,6 +172,7 @@ desc = "Grants you Aggressive Spread, a spell that spreads rust to nearby surfaces. \ Already rusted surfaces are destroyed." gain_text = "All wise men know well not to visit the Rusted Hills... Yet the Blacksmith's tale was inspiring." + adds_sidepath_points = 1 next_knowledge = list( /datum/heretic_knowledge/blade_upgrade/rust, /datum/heretic_knowledge/reroll_targets, @@ -194,10 +202,11 @@ at friend or foe wildly. Also rusts and destroys and surfaces it hits." gain_text = "The corrosion was unstoppable. The rust was unpleasable. \ The Blacksmith was gone, and you hold their blade. Champions of hope, the Rustbringer is nigh!" + adds_sidepath_points = 1 next_knowledge = list( - /datum/heretic_knowledge/rifle, /datum/heretic_knowledge/ultimate/rust_final, /datum/heretic_knowledge/summon/rusty, + /datum/heretic_knowledge/spell/rust_charge, ) spell_to_add = /datum/action/cooldown/spell/cone/staggered/entropic_plume cost = 1 @@ -291,11 +300,14 @@ if(!HAS_TRAIT(our_turf, TRAIT_RUSTY)) return - source.adjustBruteLoss(-4, FALSE) - source.adjustFireLoss(-4, FALSE) - source.adjustToxLoss(-4, FALSE, forced = TRUE) - source.adjustOxyLoss(-4, FALSE) - source.adjustStaminaLoss(-20) + var/need_mob_update = FALSE + need_mob_update += source.adjustBruteLoss(-4, updating_health = FALSE) + need_mob_update += source.adjustFireLoss(-4, updating_health = FALSE) + need_mob_update += source.adjustToxLoss(-4, updating_health = FALSE, forced = TRUE) + need_mob_update += source.adjustOxyLoss(-4, updating_health = FALSE) + need_mob_update += source.adjustStaminaLoss(-20, updating_stamina = FALSE) + if(need_mob_update) + source.updatehealth() /** * #Rust spread datum 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 7a03bace10503..50aaad96cd877 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_buff.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_buff.dm @@ -25,9 +25,9 @@ /datum/status_effect/unholy_determination/on_remove() owner.remove_traits(list(TRAIT_COAGULATING, TRAIT_NOCRITDAMAGE, TRAIT_NOSOFTCRIT), type) -/datum/status_effect/unholy_determination/tick() +/datum/status_effect/unholy_determination/tick(seconds_between_ticks) // The amount we heal of each damage type per tick. If we're missing legs we heal better because we can't dodge. - var/healing_amount = 1 + (2 - owner.usable_legs) + var/healing_amount = (0.4 + (0.8 - owner.usable_legs)) // In softcrit you're, strong enough to stay up. if(owner.health <= owner.crit_threshold && owner.health >= owner.hardcrit_threshold) @@ -48,22 +48,25 @@ if(prob(2)) playsound(owner, pick(GLOB.creepy_ambience), 50, TRUE) - adjust_all_damages(healing_amount) + adjust_all_damages(healing_amount, seconds_between_ticks) adjust_temperature() adjust_bleed_wounds() /* * Heals up all the owner a bit, fire stacks and losebreath included. */ -/datum/status_effect/unholy_determination/proc/adjust_all_damages(amount) +/datum/status_effect/unholy_determination/proc/adjust_all_damages(amount, seconds_between_ticks) owner.adjust_fire_stacks(-1) owner.losebreath = max(owner.losebreath - 0.5, 0) - owner.adjustToxLoss(-amount, FALSE, TRUE) - owner.adjustOxyLoss(-amount, FALSE) - owner.adjustBruteLoss(-amount, FALSE) - owner.adjustFireLoss(-amount) + var/need_mob_update = FALSE + need_mob_update += owner.adjustToxLoss(-amount * seconds_between_ticks, updating_health = FALSE, forced = TRUE) + need_mob_update += owner.adjustOxyLoss(-amount * seconds_between_ticks, updating_health = FALSE) + need_mob_update += owner.adjustBruteLoss(-amount * seconds_between_ticks, updating_health = FALSE) + need_mob_update += owner.adjustFireLoss(-amount * seconds_between_ticks, updating_health = FALSE) + if(need_mob_update) + owner.updatehealth() /* * Adjust the owner's temperature up or down to standard body temperatures. 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 1b3e90aa5fb73..e2887d737579e 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm @@ -40,18 +40,17 @@ #ifndef UNIT_TESTS // This is a decently hefty thing to generate while unit testing, so we should skip it. if(!heretic_level_generated) heretic_level_generated = TRUE - log_game("Generating z-level for heretic sacrifices...") + log_game("Loading heretic lazytemplate for heretic sacrifices...") INVOKE_ASYNC(src, PROC_REF(generate_heretic_z_level)) #endif /// Generate the sacrifice z-level. /datum/heretic_knowledge/hunt_and_sacrifice/proc/generate_heretic_z_level() - var/datum/map_template/heretic_sacrifice_level/new_level = new() - if(!new_level.load_new_z()) - log_game("The heretic sacrifice z-level failed to load.") - message_admins("The heretic sacrifice z-level failed to load. Heretic sacrifices won't be teleported to the shadow realm. \ + if(!SSmapping.lazy_load_template(LAZY_TEMPLATE_KEY_HERETIC_SACRIFICE)) + log_game("The heretic sacrifice template failed to load.") + message_admins("The heretic sacrifice lazy template failed to load. Heretic sacrifices won't be teleported to the shadow realm. \ If you want, you can spawn an /obj/effect/landmark/heretic somewhere to stop that from happening.") - CRASH("Failed to initialize heretic sacrifice z-level!") + CRASH("Failed to lazy load heretic sacrifice template!") /datum/heretic_knowledge/hunt_and_sacrifice/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) var/datum/antagonist/heretic/heretic_datum = IS_HERETIC(user) @@ -187,7 +186,6 @@ LAZYADD(target_blacklist, sacrifice.mind) heretic_datum.remove_sacrifice_target(sacrifice) - var/feedback = "Your patrons accept your offer" var/sac_department_flag = sacrifice.mind?.assigned_role?.departments_bitflags | sacrifice.last_mind?.assigned_role?.departments_bitflags if(sac_department_flag & DEPARTMENT_BITFLAG_COMMAND) @@ -374,8 +372,11 @@ sac_target.remove_status_effect(/datum/status_effect/unholy_determination) sac_target.reagents?.del_reagent(/datum/reagent/inverse/helgrasp/heretic) sac_target.clear_mood_event("shadow_realm") - sac_target.gain_trauma(/datum/brain_trauma/mild/phobia/supernatural, TRAUMA_RESILIENCE_MAGIC) - + if(IS_HERETIC(sac_target)) + var/datum/antagonist/heretic/victim_heretic = sac_target.mind?.has_antag_datum(/datum/antagonist/heretic) + victim_heretic.knowledge_points -= 3 + else + sac_target.gain_trauma(/datum/brain_trauma/mild/phobia/heresy, TRAUMA_RESILIENCE_MAGIC) // 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) sac_target.adjust_stutter(40 SECONDS) @@ -444,7 +445,10 @@ */ /datum/heretic_knowledge/hunt_and_sacrifice/proc/after_return_live_target(mob/living/carbon/human/sac_target) to_chat(sac_target, span_hypnophrase("The fight is over, but at great cost. You have been returned to the station in one piece.")) - to_chat(sac_target, span_big(span_hypnophrase("You don't remember anything leading up to the experience - All you can think about are those horrific hands..."))) + if(IS_HERETIC(sac_target)) + to_chat(sac_target, span_big(span_hypnophrase("You don't remember anything leading up to the experience, but you feel your connection with the Mansus weakened - Knowledge once known, forgotten..."))) + else + to_chat(sac_target, span_big(span_hypnophrase("You don't remember anything leading up to the experience - All you can think about are those horrific hands..."))) // Oh god where are we? sac_target.flash_act() @@ -457,7 +461,10 @@ // Glad i'm outta there, though! sac_target.add_mood_event("shadow_realm_survived", /datum/mood_event/shadow_realm_live) - sac_target.add_mood_event("shadow_realm_survived_sadness", /datum/mood_event/shadow_realm_live_sad) + if(IS_HERETIC(sac_target)) + sac_target.add_mood_event("shadow_realm_survived_sadness", /datum/mood_event/shadow_realm_live_sad_heretic) + else + sac_target.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) @@ -485,7 +492,7 @@ /datum/heretic_knowledge/hunt_and_sacrifice/proc/disembowel_target(mob/living/carbon/human/sac_target) if(heretic_mind) log_combat(heretic_mind.current, sac_target, "disemboweled via sacrifice") - sac_target.spill_organs() + sac_target.spill_organs(DROP_ALL_REMAINS) sac_target.apply_damage(250, BRUTE) if(sac_target.stat != DEAD) sac_target.investigate_log("has been killed by heretic sacrifice.", INVESTIGATE_DEATHS) diff --git a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_map.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_map.dm index 90c09459fcc6a..983bbee32c600 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_map.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_map.dm @@ -3,14 +3,6 @@ /// A global assoc list of all landmarks that denote a heretic sacrifice location. [string heretic path] = [landmark]. GLOBAL_LIST_EMPTY(heretic_sacrifice_landmarks) -/** - * A map template loaded in when heretics are created. - * Hereteic sacrifices are sent here when completed. - */ -/datum/map_template/heretic_sacrifice_level - name = "Heretic Sacrifice Level" - mappath = "_maps/templates/heretic_sacrifice_template.dmm" - /// Lardmarks meant to designate where heretic sacrifices are sent. /obj/effect/landmark/heretic name = "default heretic sacrifice landmark" @@ -42,11 +34,15 @@ GLOBAL_LIST_EMPTY(heretic_sacrifice_landmarks) name = "rust heretic sacrifice landmark" for_heretic_path = PATH_RUST +/obj/effect/landmark/heretic/knock + name = "knock heretic sacrifice landmark" + for_heretic_path = PATH_KNOCK + // A fluff signpost object that doesn't teleport you somewhere when you touch it. /obj/structure/no_effect_signpost name = "signpost" desc = "Won't somebody give me a sign?" - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/fluff/general.dmi' icon_state = "signpost" anchored = TRUE density = TRUE @@ -114,3 +110,8 @@ GLOBAL_LIST_EMPTY(heretic_sacrifice_landmarks) name = "Mansus Rust Gate" ambience_index = AMBIENCE_REEBE sound_environment = SOUND_ENVIRONMENT_SEWER_PIPE + +/area/centcom/heretic_sacrifice/knock + name = "Mansus Knock Gate" + ambience_index = AMBIENCE_DANGER + sound_environment = SOUND_ENVIRONMENT_PSYCHOTIC diff --git a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_moodlets.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_moodlets.dm index 0bf6692f0924f..48724b0d0911c 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_moodlets.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_moodlets.dm @@ -13,3 +13,8 @@ description = "The hands! The horrible, horrific hands! I see them when I close my eyes!" mood_change = -6 timeout = 10 MINUTES + +/datum/mood_event/shadow_realm_live_sad_heretic + description = "I've been humiliated! My knowledge sapped from my being! The world feels much duller again..." + mood_change = -8 + timeout = 8 MINUTES diff --git a/code/modules/antagonists/heretic/knowledge/side_ash_flesh.dm b/code/modules/antagonists/heretic/knowledge/side_ash_flesh.dm index 384076b8cf6f4..bf840d6ed27ea 100644 --- a/code/modules/antagonists/heretic/knowledge/side_ash_flesh.dm +++ b/code/modules/antagonists/heretic/knowledge/side_ash_flesh.dm @@ -71,9 +71,10 @@ /obj/item/bodypart/head = 1, /obj/item/book = 1, ) - mob_to_summon = /mob/living/simple_animal/hostile/heretic_summon/ash_spirit + mob_to_summon = /mob/living/basic/heretic_summon/ash_spirit cost = 1 route = PATH_SIDE + poll_ignore_define = POLL_IGNORE_ASH_SPIRIT /datum/heretic_knowledge/summon/ashy/cleanup_atoms(list/selected_atoms) var/obj/item/bodypart/head/ritual_head = locate() in selected_atoms diff --git a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm b/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm index 09c5f6cd8ebfe..a8fb031fed262 100644 --- a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm +++ b/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm @@ -61,7 +61,7 @@ route = PATH_SIDE /datum/heretic_knowledge/rifle_ammo - name = "Lionhunter Rifle Ammunition" + name = "Lionhunter Rifle Ammunition (free)" desc = "Allows you to transmute 3 ballistic ammo casings (used or unused) of any caliber, \ including shotgun shot, with any animal hide to create an extra clip of ammunition for the Lionhunter Rifle." gain_text = "The weapon came with three rough iron balls, intended to be used as ammunition. \ @@ -71,8 +71,8 @@ /obj/item/stack/sheet/animalhide = 1, /obj/item/ammo_casing = 3, ) - result_atoms = list(/obj/item/ammo_box/a762/lionhunter) - cost = 1 + result_atoms = list(/obj/item/ammo_box/strilka310/lionhunter) + cost = 0 route = PATH_SIDE /// A list of calibers that the ritual will deny. Only ballistic calibers are allowed. var/static/list/caliber_blacklist = list( @@ -95,3 +95,11 @@ // We removed any invalid casings from the atoms list, // return to allow the ritual to fill out selected atoms with the new list return TRUE + +/datum/heretic_knowledge/spell/rust_charge + name = "Rust Charge" + desc = "A charge that must be started on a rusted tile and will destroy any rusted objects you come into contact with, will deal high damage to others and rust around you during the charge." + gain_text = "The hills sparkled now, as I neared them my mind began to wander. I quickly regained my resolve and pushed forward, this last leg would be the most treacherous." + spell_to_add = /datum/action/cooldown/mob_cooldown/charge/rust + cost = 1 + route = PATH_SIDE diff --git a/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm b/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm index fa0b2621cbc50..470d98e178b7e 100644 --- a/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm +++ b/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm @@ -5,7 +5,7 @@ desc = "Allows you to transmute a pool of ash, a liver, and a sheet of plasma into a Fire Shark. \ Fire Sharks are fast and strong in groups, but die quickly. They are also highly resistant against fire attacks. \ Fire Sharks inject phlogiston into its victims and spawn plasma once they die." - gain_text = "My knowledge of the universe with the energy of remains, constructed it. It gave the Fire Shark life." + gain_text = "The cradle of the nebula was cold, but not dead. Light and heat flits even through the deepest darkness, and is hunted by its own predators." next_knowledge = list( /datum/heretic_knowledge/spell/cosmic_runes, /datum/heretic_knowledge/spell/ash_passage, @@ -15,9 +15,10 @@ /obj/item/organ/internal/liver = 1, /obj/item/stack/sheet/mineral/plasma = 1, ) - mob_to_summon = /mob/living/basic/fire_shark + mob_to_summon = /mob/living/basic/heretic_summon/fire_shark cost = 1 route = PATH_SIDE + poll_ignore_define = POLL_IGNORE_FIRE_SHARK /datum/heretic_knowledge/spell/space_phase name = "Space Phase" @@ -37,7 +38,7 @@ desc = "Allows you to transmute a sheet of plasma and a diamond to create an Eldritch Coin. \ The coin will open or close nearby doors when landing on heads and bolt or unbolt nearby doors \ when landing on tails. If the coin gets inserted into an airlock it emags the door destroying the coin." - gain_text = "It tossed the coin and won its bet, now it gains..." + gain_text = "The Mansus is a place of all sorts of sins. But greed held a special role." next_knowledge = list( /datum/heretic_knowledge/spell/cosmic_expansion, /datum/heretic_knowledge/spell/flame_birth, diff --git a/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm b/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm index 4a315575d61b7..6439840fed5d5 100644 --- a/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm +++ b/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm @@ -26,6 +26,7 @@ Also has a chance to transfer wounds from you to the victim." gain_text = "\"No matter the man, we bleed all the same.\" That's what the Marshal told me." next_knowledge = list( + /datum/heretic_knowledge/spell/apetra_vulnera, /datum/heretic_knowledge/spell/void_phase, /datum/heretic_knowledge/summon/raw_prophet, ) diff --git a/code/modules/antagonists/heretic/knowledge/side_knock_flesh.dm b/code/modules/antagonists/heretic/knowledge/side_knock_flesh.dm new file mode 100644 index 0000000000000..97218ce5e9410 --- /dev/null +++ b/code/modules/antagonists/heretic/knowledge/side_knock_flesh.dm @@ -0,0 +1,28 @@ +// Sidepaths for knowledge between Knock and Flesh. + +/datum/heretic_knowledge/spell/apetra_vulnera + name = "Apetra Vulnera" + desc = "Grants you Apetra Vulnera, a spell \ + which causes heavy bleeding on all bodyparts of the victim that have more than 15 brute damage. \ + Wounds a random limb if no limb is sufficiently damaged." + gain_text = "Flesh opens, and blood spills. My master seeks sacrifice, and I shall appease." + next_knowledge = list( + /datum/heretic_knowledge/spell/blood_siphon, + /datum/heretic_knowledge/void_cloak, + ) + spell_to_add = /datum/action/cooldown/spell/pointed/apetra_vulnera + cost = 1 + route = PATH_SIDE + +/datum/heretic_knowledge/spell/opening_blast + name = "Wave Of Desperation" + desc = "Grants you Wave Of Desparation, a spell which can only be cast while restrained. \ + It removes your restraints, repels and knocks down adjacent people, and applies the Mansus Grasp to everything nearby." + gain_text = "My shackles undone in dark fury, their feeble bindings crumble before my power." + next_knowledge = list( + /datum/heretic_knowledge/summon/ashy, + /datum/heretic_knowledge/void_cloak, + ) + spell_to_add = /datum/action/cooldown/spell/aoe/wave_of_desperation + cost = 1 + route = PATH_SIDE diff --git a/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm b/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm index 9b71497167276..2dbb44ea4eb7e 100644 --- a/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm +++ b/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm @@ -18,6 +18,28 @@ cost = 1 route = PATH_SIDE +/datum/heretic_knowledge/entropy_pulse + name = "Pulse of Entropy" + desc = "Allows you to transmute 20 irons and 2 garbage items to fill the surrounding vicinity of the rune with rust." + gain_text = "Reality begins to whisper to me. To give it its entropic end." + required_atoms = list( + /obj/item/stack/sheet/iron = 20, + /obj/item/trash = 2 + ) + cost = 0 + route = PATH_SIDE + var/rusting_range = 4 + +/datum/heretic_knowledge/entropy_pulse/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) + for(var/turf/nearby_turf in view(rusting_range, loc)) + if(get_dist(nearby_turf, loc) <= 1) //tiles on rune should always be rusted + nearby_turf.rust_heretic_act() + //we exclude closed turf to avoid exposing cultist bases + if(prob(20) || isclosedturf(nearby_turf)) + continue + nearby_turf.rust_heretic_act() + return TRUE + /datum/heretic_knowledge/curse/corrosion name = "Curse of Corrosion" desc = "Allows you to transmute wirecutters, a pool of vomit, and a heart to cast a curse of sickness on a crew member. \ @@ -66,9 +88,10 @@ /obj/item/book = 1, /obj/item/bodypart/head = 1, ) - mob_to_summon = /mob/living/simple_animal/hostile/heretic_summon/rust_spirit + mob_to_summon = /mob/living/basic/heretic_summon/rust_walker cost = 1 route = PATH_SIDE + poll_ignore_define = POLL_IGNORE_RUST_SPIRIT /datum/heretic_knowledge/summon/rusty/cleanup_atoms(list/selected_atoms) var/obj/item/bodypart/head/ritual_head = locate() in selected_atoms diff --git a/code/modules/antagonists/heretic/knowledge/side_void_blade.dm b/code/modules/antagonists/heretic/knowledge/side_void_blade.dm index 6b380eb2f0de4..643fd434af7b5 100644 --- a/code/modules/antagonists/heretic/knowledge/side_void_blade.dm +++ b/code/modules/antagonists/heretic/knowledge/side_void_blade.dm @@ -159,4 +159,5 @@ ) cost = 1 route = PATH_SIDE - mob_to_summon = /mob/living/simple_animal/hostile/heretic_summon/maid_in_the_mirror + mob_to_summon = /mob/living/basic/heretic_summon/maid_in_the_mirror + poll_ignore_define = POLL_IGNORE_MAID_IN_MIRROR diff --git a/code/modules/antagonists/heretic/knowledge/starting_lore.dm b/code/modules/antagonists/heretic/knowledge/starting_lore.dm index 2e6b8b22772fc..eb766392290b3 100644 --- a/code/modules/antagonists/heretic/knowledge/starting_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/starting_lore.dm @@ -183,9 +183,7 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) return FALSE if(!new_heart.useable) return FALSE - if(new_heart.status == ORGAN_ROBOTIC) - return FALSE - if(new_heart.organ_flags & (ORGAN_SYNTHETIC|ORGAN_FAILING)) + if(new_heart.organ_flags & (ORGAN_ROBOTIC|ORGAN_FAILING)) return FALSE return TRUE @@ -214,3 +212,79 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) spell_to_add = /datum/action/cooldown/spell/shadow_cloak cost = 0 route = PATH_START + +/** + * Codex Cicatrixi is available at the start: + * This allows heretics to choose if they want to rush all the influences and take them stealthily, or + * Construct a codex and take what's left with more points. + * Another downside to having the book is strip searches, which means that it's not just a free nab, at least until you get exposed - and when you do, you'll probably need the faster drawing speed. + * Overall, it's a tradeoff between speed and stealth or power. + */ +/datum/heretic_knowledge/codex_cicatrix + name = "Codex Cicatrix" + desc = "Allows you to transmute a book, any unique pen (anything but generic pens), and your pick from any carcass (animal or human), leather, or hide to create a Codex Cicatrix. \ + The Codex Cicatrix can be used when draining influences to gain additional knowledge, but comes at greater risk of being noticed. \ + It can also be used to draw and remove transmutation runes easier, and as a spell focus in a pinch." + gain_text = "The occult leaves fragments of knowledge and power anywhere and everywhere. The Codex Cicatrix is one such example. \ + Within the leather-bound faces and age old pages, a path into the Mansus is revealed." + required_atoms = list( + /obj/item/book = 1, + /obj/item/pen = 1, + list(/mob/living, /obj/item/stack/sheet/leather, /obj/item/stack/sheet/animalhide) = 1, + ) + banned_atom_types = list(/obj/item/pen) + result_atoms = list(/obj/item/codex_cicatrix) + cost = 1 + route = PATH_START + priority = MAX_KNOWLEDGE_PRIORITY - 3 // Least priority out of the starting knowledges, as it's an optional boon. + +/datum/heretic_knowledge/codex_cicatrix/parse_required_item(atom/item_path, number_of_things) + if(item_path == /obj/item/pen) + return "unique type of pen" + return ..() + +/datum/heretic_knowledge/codex_cicatrix/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) + . = ..() + if(!.) + return FALSE + + for(var/mob/living/body in atoms) + if(body.stat != DEAD) + continue + + selected_atoms += body + return TRUE + return FALSE + +/datum/heretic_knowledge/codex_cicatrix/cleanup_atoms(list/selected_atoms) + var/mob/living/body = locate() in selected_atoms + if(!body) + return + // A golem or an android doesn't have skin! + var/exterior_text = "skin" + // If carbon, it's the limb. If not, it's the body. + var/ripped_thing = body + + // We will check if it's a carbon's body. + // If it is, we will damage a random bodypart, and check that bodypart for its body type, to select between 'skin' or 'exterior'. + if(iscarbon(body)) + var/mob/living/carbon/carbody = body + var/obj/item/bodypart/bodypart = pick(carbody.bodyparts) + ripped_thing = bodypart + bodypart.receive_damage(25, sharpness = SHARP_EDGED) + if(!(bodypart.bodytype & BODYTYPE_ORGANIC)) + exterior_text = "exterior" + else + // If it is not a carbon mob, we will just check biotypes and damage it directly. + if(body.mob_biotypes & (MOB_MINERAL|MOB_ROBOTIC)) + exterior_text = "exterior" + body.apply_damage(25, BRUTE) + + // Procure book for flavor text. This is why we call parent at the end. + var/obj/item/book/le_book = locate() in selected_atoms + if(!le_book) + stack_trace("Somehow, no book in codex cicatrix selected atoms! [english_list(selected_atoms)]") + playsound(body, 'sound/items/poster_ripped.ogg', 100, TRUE) + body.do_jitter_animation() + body.visible_message(span_danger("An awful ripping sound is heard as [ripped_thing]'s [exterior_text] is ripped straight out, wrapping around [le_book || "the book"], turning into an eldritch shade of blue!")) + return ..() diff --git a/code/modules/antagonists/heretic/knowledge/void_lore.dm b/code/modules/antagonists/heretic/knowledge/void_lore.dm index 003ec1b4838b7..8e9847f02ae75 100644 --- a/code/modules/antagonists/heretic/knowledge/void_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/void_lore.dm @@ -81,9 +81,9 @@ You can still take damage due to a lack of pressure." gain_text = "I found a thread of cold breath. It lead me to a strange shrine, all made of crystals. \ Translucent and white, a depiction of a nobleman stood before me." + adds_sidepath_points = 1 next_knowledge = list( /datum/heretic_knowledge/mark/void_mark, - /datum/heretic_knowledge/codex_cicatrix, /datum/heretic_knowledge/void_cloak, /datum/heretic_knowledge/limited_amount/risen_corpse, ) @@ -127,6 +127,7 @@ Additionally causes damage to heathens around your original and target destination." gain_text = "The entity calls themself the Aristocrat. They effortlessly walk through air like \ nothing - leaving a harsh, cold breeze in their wake. They disappear, and I am left in the blizzard." + adds_sidepath_points = 1 next_knowledge = list( /datum/heretic_knowledge/blade_upgrade/void, /datum/heretic_knowledge/reroll_targets, @@ -161,6 +162,7 @@ desc = "Grants you Void Pull, a spell that pulls all nearby heathens towards you, stunning them briefly." gain_text = "All is fleeting, but what else stays? I'm close to ending what was started. \ The Aristocrat reveals themselves to me again. They tell me I am late. Their pull is immense, I cannot turn back." + adds_sidepath_points = 1 next_knowledge = list( /datum/heretic_knowledge/ultimate/void_final, /datum/heretic_knowledge/spell/cleave, diff --git a/code/modules/antagonists/heretic/magic/aggressive_spread.dm b/code/modules/antagonists/heretic/magic/aggressive_spread.dm index c15ae041a47a6..de1233382f646 100644 --- a/code/modules/antagonists/heretic/magic/aggressive_spread.dm +++ b/code/modules/antagonists/heretic/magic/aggressive_spread.dm @@ -17,11 +17,7 @@ aoe_radius = 3 /datum/action/cooldown/spell/aoe/rust_conversion/get_things_to_cast_on(atom/center) - var/list/things = list() - for(var/turf/nearby_turf in range(aoe_radius, center)) - things += nearby_turf - - return things + return RANGE_TURFS(aoe_radius, center) /datum/action/cooldown/spell/aoe/rust_conversion/cast_on_thing_in_aoe(turf/victim, atom/caster) // We have less chance of rusting stuff that's further diff --git a/code/modules/antagonists/heretic/magic/apetravulnera.dm b/code/modules/antagonists/heretic/magic/apetravulnera.dm new file mode 100644 index 0000000000000..801104dddf9fc --- /dev/null +++ b/code/modules/antagonists/heretic/magic/apetravulnera.dm @@ -0,0 +1,59 @@ +/datum/action/cooldown/spell/pointed/apetra_vulnera + name = "Apetra Vulnera" + desc = "Causes severe bleeding on every limb of a target which has more than 15 brute damage. \ + Wounds a random limb if no limb is sufficiently damaged." + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "cleave" + + school = SCHOOL_FORBIDDEN + cooldown_time = 45 SECONDS + + invocation = "AP'TRA VULN'RA!" + invocation_type = INVOCATION_WHISPER + spell_requirements = NONE + + cast_range = 4 + /// What type of wound we apply + var/wound_type = /datum/wound/slash/flesh/critical/cleave + +/datum/action/cooldown/spell/pointed/apetra_vulnera/is_valid_target(atom/cast_on) + return ..() && ishuman(cast_on) + +/datum/action/cooldown/spell/pointed/apetra_vulnera/cast(mob/living/carbon/human/cast_on) + . = ..() + + if(IS_HERETIC_OR_MONSTER(cast_on)) + return FALSE + + if(!cast_on.blood_volume) + return FALSE + + if(cast_on.can_block_magic(antimagic_flags)) + cast_on.visible_message( + span_danger("[cast_on]'s bruises briefly glow, but repels the effect!"), + span_danger("Your bruises sting a little, but you are protected!") + ) + return FALSE + + var/a_limb_got_damaged = FALSE + for(var/obj/item/bodypart/bodypart in cast_on.bodyparts) + if(bodypart.brute_dam < 15) + continue + a_limb_got_damaged = TRUE + var/datum/wound/slash/crit_wound = new wound_type() + crit_wound.apply_wound(bodypart) + + if(!a_limb_got_damaged) + var/datum/wound/slash/crit_wound = new wound_type() + crit_wound.apply_wound(pick(cast_on.bodyparts)) + + cast_on.visible_message( + span_danger("[cast_on]'s scratches and bruises are torn open by an unholy force!"), + span_danger("Your scratches and bruises are torn open by some horrible unholy force!") + ) + + new /obj/effect/temp_visual/cleave(get_turf(cast_on)) + + return TRUE diff --git a/code/modules/antagonists/heretic/magic/ascended_shapeshift.dm b/code/modules/antagonists/heretic/magic/ascended_shapeshift.dm new file mode 100644 index 0000000000000..f1d6de56e399f --- /dev/null +++ b/code/modules/antagonists/heretic/magic/ascended_shapeshift.dm @@ -0,0 +1,32 @@ +// Given to ascended knock heretics, is a form of shapeshift that can turn into all 4 common heretic summons, and is not limited to 1 selection. +/datum/action/cooldown/spell/shapeshift/eldritch/ascension + name = "Ascended Shapechange" + desc = "A spell that allows you to take on the form of another eldritch creature, gaining their abilities. \ + You can change your choice at any time, and if your form dies, you dont die." + cooldown_time = 20 SECONDS + die_with_shapeshifted_form = FALSE + possible_shapes = list( + /mob/living/basic/heretic_summon/ash_spirit, + /mob/living/basic/heretic_summon/raw_prophet/ascended, + /mob/living/basic/heretic_summon/rust_walker, + /mob/living/basic/heretic_summon/stalker, + ) + +/datum/action/cooldown/spell/shapeshift/eldritch/ascension/do_shapeshift(mob/living/caster) + . = ..() + if(!.) + return + //buff our forms so this ascension ability isnt shit + playsound(caster, 'sound/magic/demon_consume.ogg', 50, TRUE) + var/mob/living/monster = . + monster.AddComponent(/datum/component/seethrough_mob) + monster.maxHealth *= 1.5 + monster.health = monster.maxHealth + monster.melee_damage_lower = max((monster.melee_damage_lower * 2), 40) + monster.melee_damage_upper = monster.melee_damage_upper / 2 + monster.transform *= 1.5 + monster.AddElement(/datum/element/wall_smasher, strength_flag = ENVIRONMENT_SMASH_RWALLS) + +/datum/action/cooldown/spell/shapeshift/eldritch/ascension/do_unshapeshift(mob/living/caster) + . = ..() + shapeshift_type = null //pick another loser diff --git a/code/modules/antagonists/heretic/magic/ash_ascension.dm b/code/modules/antagonists/heretic/magic/ash_ascension.dm index 0de92c49c22e7..4c77a06f281d7 100644 --- a/code/modules/antagonists/heretic/magic/ash_ascension.dm +++ b/code/modules/antagonists/heretic/magic/ash_ascension.dm @@ -33,7 +33,7 @@ /// Simple status effect for adding a ring of fire around a mob. /datum/status_effect/fire_ring id = "fire_ring" - tick_interval = 0.1 SECONDS + tick_interval = 0.2 SECONDS status_type = STATUS_EFFECT_REFRESH alert_type = null /// The radius of the ring around us. @@ -44,7 +44,7 @@ src.ring_radius = radius return ..() -/datum/status_effect/fire_ring/tick(seconds_per_tick, times_fired) +/datum/status_effect/fire_ring/tick(seconds_between_ticks) if(QDELETED(owner) || owner.stat == DEAD) qdel(src) return @@ -54,9 +54,9 @@ for(var/turf/nearby_turf as anything in RANGE_TURFS(1, owner)) new /obj/effect/hotspot(nearby_turf) - nearby_turf.hotspot_expose(750, 25 * seconds_per_tick, 1) + nearby_turf.hotspot_expose(750, 25 * seconds_between_ticks, 1) for(var/mob/living/fried_living in nearby_turf.contents - owner) - fried_living.apply_damage(2.5 * seconds_per_tick, BURN) + fried_living.apply_damage(2.5 * seconds_between_ticks, BURN) /// Creates one, large, expanding ring of fire around the caster, which does not follow them. /datum/action/cooldown/spell/fire_cascade diff --git a/code/modules/antagonists/heretic/magic/blood_cleave.dm b/code/modules/antagonists/heretic/magic/blood_cleave.dm index eca27e55566f3..d5317f23e344b 100644 --- a/code/modules/antagonists/heretic/magic/blood_cleave.dm +++ b/code/modules/antagonists/heretic/magic/blood_cleave.dm @@ -19,7 +19,7 @@ /// The radius of the cleave effect var/cleave_radius = 1 /// What type of wound we apply - var/wound_type = /datum/wound/slash/critical/cleave + var/wound_type = /datum/wound/slash/flesh/critical/cleave /datum/action/cooldown/spell/pointed/cleave/is_valid_target(atom/cast_on) return ..() && ishuman(cast_on) @@ -45,7 +45,7 @@ ) var/obj/item/bodypart/bodypart = pick(victim.bodyparts) - var/datum/wound/slash/crit_wound = new wound_type() + var/datum/wound/slash/flesh/crit_wound = new wound_type() crit_wound.apply_wound(bodypart) victim.apply_damage(20, BURN, wound_bonus = CANT_WOUND) @@ -56,7 +56,7 @@ /datum/action/cooldown/spell/pointed/cleave/long name = "Lesser Cleave" cooldown_time = 60 SECONDS - wound_type = /datum/wound/slash/severe + wound_type = /datum/wound/slash/flesh/severe /obj/effect/temp_visual/cleave icon = 'icons/effects/eldritch.dmi' diff --git a/code/modules/antagonists/heretic/magic/burglar_finesse.dm b/code/modules/antagonists/heretic/magic/burglar_finesse.dm new file mode 100644 index 0000000000000..7bb6960354ec7 --- /dev/null +++ b/code/modules/antagonists/heretic/magic/burglar_finesse.dm @@ -0,0 +1,39 @@ +/datum/action/cooldown/spell/pointed/burglar_finesse + name = "Burglar's Finesse" + desc = "Steal a random item from the victim's backpack." + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "burglarsfinesse" + + school = SCHOOL_FORBIDDEN + cooldown_time = 40 SECONDS + + invocation = "Y'O'K!" + invocation_type = INVOCATION_WHISPER + spell_requirements = NONE + + cast_range = 4 + +/datum/action/cooldown/spell/pointed/burglar_finesse/is_valid_target(atom/cast_on) + return ..() && ishuman(cast_on) && (locate(/obj/item/storage/backpack) in cast_on.contents) + +/datum/action/cooldown/spell/pointed/burglar_finesse/cast(mob/living/carbon/human/cast_on) + . = ..() + if(cast_on.can_block_magic(antimagic_flags)) + to_chat(cast_on, span_danger("You feel a light tug, but are otherwise fine, you were protected by holiness!")) + to_chat(owner, span_danger("[cast_on] is protected by holy forces!")) + return FALSE + + var/obj/storage_item = locate(/obj/item/storage/backpack) in cast_on.contents + + if(isnull(storage_item)) + return FALSE + + var/item = pick(storage_item.contents) + if(isnull(item)) + return FALSE + + to_chat(cast_on, span_warning("Your [storage_item] feels lighter...")) + to_chat(owner, span_notice("With a blink, you pull [item] out of [cast_on][p_s()] [storage_item].")) + owner.put_in_active_hand(item) diff --git a/code/modules/antagonists/heretic/magic/caretaker.dm b/code/modules/antagonists/heretic/magic/caretaker.dm new file mode 100644 index 0000000000000..87f3a69dad1dc --- /dev/null +++ b/code/modules/antagonists/heretic/magic/caretaker.dm @@ -0,0 +1,39 @@ +/datum/action/cooldown/spell/caretaker + name = "Caretaker’s Last Refuge" + desc = "Shifts you into the Caretaker's Refuge, rendering you translucent and intangible. \ + While in the Refuge your movement is unrestricted, but you cannot use your hands or cast any spells. \ + You cannot enter the Refuge while near other sentient beings, \ + and you can be removed from it upon contact with antimagical artifacts." + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + button_icon = 'icons/mob/actions/actions_minor_antag.dmi' + button_icon_state = "ninja_cloak" + sound = 'sound/effects/curse2.ogg' + + school = SCHOOL_FORBIDDEN + cooldown_time = 1 MINUTES + + invocation_type = INVOCATION_NONE + spell_requirements = NONE + +/datum/action/cooldown/spell/caretaker/Remove(mob/living/remove_from) + if(remove_from.has_status_effect(/datum/status_effect/caretaker_refuge)) + remove_from.remove_status_effect(/datum/status_effect/caretaker_refuge) + return ..() + +/datum/action/cooldown/spell/caretaker/is_valid_target(atom/cast_on) + return isliving(cast_on) + +/datum/action/cooldown/spell/caretaker/cast(atom/cast_on) + . = ..() + for(var/mob/living/alive in orange(5, owner)) + if(alive.stat != DEAD && alive.client) + owner.balloon_alert(owner, "other minds nearby!") + return FALSE + + var/mob/living/carbon/carbon_user = owner + if(carbon_user.has_status_effect(/datum/status_effect/caretaker_refuge)) + carbon_user.remove_status_effect(/datum/status_effect/caretaker_refuge) + else + carbon_user.apply_status_effect(/datum/status_effect/caretaker_refuge) + return TRUE diff --git a/code/modules/antagonists/heretic/magic/cosmic_runes.dm b/code/modules/antagonists/heretic/magic/cosmic_runes.dm index 0614dac658489..5115a2181fa91 100644 --- a/code/modules/antagonists/heretic/magic/cosmic_runes.dm +++ b/code/modules/antagonists/heretic/magic/cosmic_runes.dm @@ -53,7 +53,7 @@ name = "cosmic rune" desc = "A strange rune, that can instantly transport people to another location." anchored = TRUE - icon = 'icons/obj/hand_of_god_structures.dmi' + icon = 'icons/obj/service/hand_of_god_structures.dmi' icon_state = "cosmic_rune" resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF layer = SIGIL_LAYER @@ -64,7 +64,7 @@ /obj/effect/cosmic_rune/Initialize(mapload) . = ..() - var/image/silicon_image = image(icon = 'icons/obj/hand_of_god_structures.dmi', icon_state = null, loc = src) + var/image/silicon_image = image(icon = 'icons/obj/service/hand_of_god_structures.dmi', icon_state = null, loc = src) silicon_image.override = TRUE add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/silicons, "cosmic", silicon_image) @@ -130,7 +130,7 @@ /obj/effect/temp_visual/cosmic_rune_fade name = "cosmic rune" - icon = 'icons/obj/hand_of_god_structures.dmi' + icon = 'icons/obj/service/hand_of_god_structures.dmi' icon_state = "cosmic_rune_fade" layer = SIGIL_LAYER anchored = TRUE @@ -138,13 +138,13 @@ /obj/effect/temp_visual/cosmic_rune_fade/Initialize(mapload) . = ..() - var/image/silicon_image = image(icon = 'icons/obj/hand_of_god_structures.dmi', icon_state = null, loc = src) + var/image/silicon_image = image(icon = 'icons/obj/service/hand_of_god_structures.dmi', icon_state = null, loc = src) silicon_image.override = TRUE add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/silicons, "cosmic", silicon_image) /obj/effect/temp_visual/rune_light name = "cosmic rune" - icon = 'icons/obj/hand_of_god_structures.dmi' + icon = 'icons/obj/service/hand_of_god_structures.dmi' icon_state = "cosmic_rune_light" layer = SIGIL_LAYER anchored = TRUE @@ -152,6 +152,6 @@ /obj/effect/temp_visual/rune_light/Initialize(mapload) . = ..() - var/image/silicon_image = image(icon = 'icons/obj/hand_of_god_structures.dmi', icon_state = null, loc = src) + var/image/silicon_image = image(icon = 'icons/obj/service/hand_of_god_structures.dmi', icon_state = null, loc = src) silicon_image.override = TRUE add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/silicons, "cosmic", silicon_image) diff --git a/code/modules/antagonists/heretic/magic/eldritch_shapeshift.dm b/code/modules/antagonists/heretic/magic/eldritch_shapeshift.dm index aed5cb78c9279..b8a8f39fbc370 100644 --- a/code/modules/antagonists/heretic/magic/eldritch_shapeshift.dm +++ b/code/modules/antagonists/heretic/magic/eldritch_shapeshift.dm @@ -12,10 +12,10 @@ spell_requirements = NONE possible_shapes = list( + /mob/living/basic/carp, /mob/living/basic/mouse, /mob/living/basic/pet/dog/corgi, - /mob/living/basic/carp, + /mob/living/basic/pet/fox, /mob/living/simple_animal/bot/secbot, - /mob/living/simple_animal/pet/fox, /mob/living/simple_animal/pet/cat, ) diff --git a/code/modules/antagonists/heretic/magic/fire_blast.dm b/code/modules/antagonists/heretic/magic/fire_blast.dm index 8900ea2350a2d..1d2d7daacebce 100644 --- a/code/modules/antagonists/heretic/magic/fire_blast.dm +++ b/code/modules/antagonists/heretic/magic/fire_blast.dm @@ -129,16 +129,16 @@ /datum/status_effect/fire_blasted/on_apply() if(owner.on_fire && animate_duration > 0 SECONDS) - var/image/warning_sign = image(icon = 'icons/effects/effects.dmi', icon_state = "blessed", layer = BELOW_MOB_LAYER, loc = owner) - owner.flick_overlay_view(warning_sign, initial(duration)) - warning_sign.alpha = 50 - animate(warning_sign, alpha = 255, time = animate_duration) + var/mutable_appearance/warning_sign = mutable_appearance('icons/effects/effects.dmi', "blessed", BELOW_MOB_LAYER) + var/atom/movable/flick_visual/warning = owner.flick_overlay_view(warning_sign, initial(duration)) + warning.alpha = 50 + animate(warning, alpha = 255, time = animate_duration) return TRUE -/datum/status_effect/fire_blasted/tick(seconds_per_tick, times_fired) - owner.adjustFireLoss(tick_damage) - owner.adjustStaminaLoss(2 * tick_damage) +/datum/status_effect/fire_blasted/tick(seconds_between_ticks) + owner.adjustFireLoss(tick_damage * seconds_between_ticks) + owner.adjustStaminaLoss(2 * tick_damage * seconds_between_ticks) // The beam fireblast spits out, causes people to walk through it to be on fire /obj/effect/ebeam/fire diff --git a/code/modules/antagonists/heretic/magic/flesh_ascension.dm b/code/modules/antagonists/heretic/magic/flesh_ascension.dm index cb9ab63e031e1..d086c1127fcf0 100644 --- a/code/modules/antagonists/heretic/magic/flesh_ascension.dm +++ b/code/modules/antagonists/heretic/magic/flesh_ascension.dm @@ -13,7 +13,7 @@ invocation_type = INVOCATION_SHOUT spell_requirements = NONE - possible_shapes = list(/mob/living/simple_animal/hostile/heretic_summon/armsy/prime) + possible_shapes = list(/mob/living/basic/heretic_summon/armsy) /// The length of our new wormy when we shed. var/segment_length = 10 @@ -35,32 +35,11 @@ return ..() -/datum/action/cooldown/spell/shapeshift/shed_human_form/do_unshapeshift(mob/living/simple_animal/hostile/heretic_summon/armsy/caster) +/datum/action/cooldown/spell/shapeshift/shed_human_form/do_unshapeshift(mob/living/basic/heretic_summon/armsy/caster) if(istype(caster)) - segment_length = caster.get_length() + segment_length = caster.get_length() - 1 // Don't count the head return ..() /datum/action/cooldown/spell/shapeshift/shed_human_form/create_shapeshift_mob(atom/loc) return new shapeshift_type(loc, TRUE, segment_length) - -/datum/action/cooldown/spell/worm_contract - name = "Force Contract" - desc = "Forces your body to contract onto a single tile." - background_icon_state = "bg_heretic" - overlay_icon_state = "bg_heretic_border" - button_icon = 'icons/mob/actions/actions_ecult.dmi' - button_icon_state = "worm_contract" - - school = SCHOOL_FORBIDDEN - cooldown_time = 30 SECONDS - - invocation_type = INVOCATION_NONE - spell_requirements = NONE - -/datum/action/cooldown/spell/worm_contract/is_valid_target(atom/cast_on) - return istype(cast_on, /mob/living/simple_animal/hostile/heretic_summon/armsy) - -/datum/action/cooldown/spell/worm_contract/cast(mob/living/simple_animal/hostile/heretic_summon/armsy/cast_on) - . = ..() - cast_on.contract_next_chain_into_single_tile() diff --git a/code/modules/antagonists/heretic/magic/flesh_surgery.dm b/code/modules/antagonists/heretic/magic/flesh_surgery.dm index 2a216b0896909..0fb0a402da964 100644 --- a/code/modules/antagonists/heretic/magic/flesh_surgery.dm +++ b/code/modules/antagonists/heretic/magic/flesh_surgery.dm @@ -142,7 +142,7 @@ if(deprecise_zone(organ.zone) != zone_to_check) continue // Also, some organs to exclude. Don't remove vital (brains), don't remove synthetics, and don't remove unremovable - if(organ.organ_flags & (ORGAN_SYNTHETIC|ORGAN_VITAL|ORGAN_UNREMOVABLE)) + if(organ.organ_flags & (ORGAN_ROBOTIC|ORGAN_VITAL|ORGAN_UNREMOVABLE)) continue organs_we_can_remove[organ.name] = organ diff --git a/code/modules/antagonists/heretic/magic/furious_steel.dm b/code/modules/antagonists/heretic/magic/furious_steel.dm index b1becf5c63c4f..1c82f36e0249a 100644 --- a/code/modules/antagonists/heretic/magic/furious_steel.dm +++ b/code/modules/antagonists/heretic/magic/furious_steel.dm @@ -43,12 +43,12 @@ unset_click_ability(source, refund_cooldown = TRUE) -/datum/action/cooldown/spell/pointed/projectile/furious_steel/InterceptClickOn(mob/living/caller, params, atom/click_target) +/datum/action/cooldown/spell/pointed/projectile/furious_steel/InterceptClickOn(mob/living/caller, params, atom/target) // Let the caster prioritize using items like guns over blade casts if(caller.get_active_held_item()) return FALSE // Let the caster prioritize melee attacks like punches and shoves over blade casts - if(get_dist(caller, click_target) <= 1) + if(get_dist(caller, target) <= 1) return FALSE return ..() @@ -98,7 +98,7 @@ /obj/projectile/floating_blade name = "blade" - icon = 'icons/obj/kitchen.dmi' + icon = 'icons/obj/service/kitchen.dmi' icon_state = "knife" speed = 2 damage = 25 diff --git a/code/modules/antagonists/heretic/magic/mansus_grasp.dm b/code/modules/antagonists/heretic/magic/mansus_grasp.dm index 0ddeb4c41b7a9..dce84b9305366 100644 --- a/code/modules/antagonists/heretic/magic/mansus_grasp.dm +++ b/code/modules/antagonists/heretic/magic/mansus_grasp.dm @@ -69,7 +69,8 @@ success_feedback = "You remove %THEEFFECT.", \ tip_text = "Clear rune", \ on_clear_callback = CALLBACK(src, PROC_REF(after_clear_rune)), \ - effects_we_clear = list(/obj/effect/heretic_rune)) + effects_we_clear = list(/obj/effect/heretic_rune), \ + time_to_remove = 0.4 SECONDS) /* * Callback for effect_remover component. @@ -77,7 +78,7 @@ /obj/item/melee/touch_attack/mansus_fist/proc/after_clear_rune(obj/effect/target, mob/living/user) new /obj/effect/temp_visual/drawing_heretic_rune/fail(target.loc, target.greyscale_colors) var/datum/action/cooldown/spell/touch/mansus_grasp/grasp = spell_which_made_us?.resolve() - grasp?.spell_feedback() + grasp?.spell_feedback(user) remove_hand_with_no_refund(user) diff --git a/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm b/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm index 1e65ef88951c7..64638d7103b17 100644 --- a/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm +++ b/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm @@ -46,11 +46,14 @@ victim.apply_damage(20, BURN) // Heal the caster for every victim damaged - caster.adjustBruteLoss(-10, FALSE) - caster.adjustFireLoss(-10, FALSE) - caster.adjustToxLoss(-10, FALSE) - caster.adjustOxyLoss(-10, FALSE) - caster.adjustStaminaLoss(-10) + var/need_mob_update = FALSE + need_mob_update += caster.adjustBruteLoss(-10, updating_health = FALSE) + need_mob_update += caster.adjustFireLoss(-10, updating_health = FALSE) + need_mob_update += caster.adjustToxLoss(-10, updating_health = FALSE) + need_mob_update += caster.adjustOxyLoss(-10, updating_health = FALSE) + need_mob_update += caster.adjustStaminaLoss(-10, updating_stamina = FALSE) + if(need_mob_update) + caster.updatehealth() /obj/effect/temp_visual/eldritch_smoke icon = 'icons/effects/eldritch.dmi' diff --git a/code/modules/antagonists/heretic/magic/realignment.dm b/code/modules/antagonists/heretic/magic/realignment.dm index 1b5dd05d0590e..081138b7181b9 100644 --- a/code/modules/antagonists/heretic/magic/realignment.dm +++ b/code/modules/antagonists/heretic/magic/realignment.dm @@ -5,7 +5,7 @@ You cannot attack while realigning. Can be casted multiple times in short succession, but each cast lengthens the cooldown." background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" - button_icon = 'icons/obj/implants.dmi' + button_icon = 'icons/hud/implants.dmi' button_icon_state = "adrenal" // sound = 'sound/magic/whistlereset.ogg' @@ -55,7 +55,7 @@ tick_interval = 0.2 SECONDS /datum/status_effect/realignment/get_examine_text() - return span_notice("[owner.p_theyre(TRUE)] glowing a soft white.") + return span_notice("[owner.p_Theyre()] glowing a soft white.") /datum/status_effect/realignment/on_apply() ADD_TRAIT(owner, TRAIT_PACIFISM, id) @@ -69,7 +69,7 @@ REMOVE_TRAIT(owner, TRAIT_PACIFISM, id) owner.remove_filter(id) -/datum/status_effect/realignment/tick(seconds_per_tick, times_fired) +/datum/status_effect/realignment/tick(seconds_between_ticks) owner.adjustStaminaLoss(-5) owner.AdjustAllImmobility(-0.5 SECONDS) diff --git a/code/modules/antagonists/heretic/magic/rust_charge.dm b/code/modules/antagonists/heretic/magic/rust_charge.dm new file mode 100644 index 0000000000000..0d693b0de86ea --- /dev/null +++ b/code/modules/antagonists/heretic/magic/rust_charge.dm @@ -0,0 +1,49 @@ +// Rust charge, a charge action that can only be started on rust (and only destroys rust tiles) +/datum/action/cooldown/mob_cooldown/charge/rust + name = "Rust Charge" + desc = "A charge that must be started on a rusted tile and will destroy any rusted objects you come into contact with, will deal high damage to others and rust around you during the charge. As it is the rust that empoweres you for this ability, no focus is needed" + charge_distance = 10 + charge_damage = 50 + cooldown_time = 45 SECONDS + +/datum/action/cooldown/mob_cooldown/charge/rust/Activate(atom/target_atom) + var/turf/open/start_turf = get_turf(owner) + if(!istype(start_turf) || !HAS_TRAIT(start_turf, TRAIT_RUSTY)) + return FALSE + StartCooldown(135 SECONDS, 135 SECONDS) + charge_sequence(owner, target_atom, charge_delay, charge_past) + StartCooldown() + return TRUE +/datum/action/cooldown/mob_cooldown/charge/rust/on_move(atom/source, atom/new_loc, atom/target) + var/turf/victim = get_turf(owner) + if(!actively_moving) + return COMPONENT_MOVABLE_BLOCK_PRE_MOVE + new /obj/effect/temp_visual/decoy/fading(source.loc, source) + INVOKE_ASYNC(src, PROC_REF(DestroySurroundings), source) + victim.rust_heretic_act() + for(var/dir in GLOB.cardinals) + var/turf/nearby_turf = get_step(victim, dir) + if(istype(nearby_turf)) + nearby_turf.rust_heretic_act() + +/datum/action/cooldown/mob_cooldown/charge/rust/DestroySurroundings(atom/movable/charger) + if(!destroy_objects) + return + for(var/dir in GLOB.cardinals) + var/turf/source = get_turf(owner) + var/turf/closed/next_turf = get_step(charger, dir) + if(!istype(source) || !istype(next_turf) || !HAS_TRAIT(source, TRAIT_RUSTY) || !HAS_TRAIT(next_turf, TRAIT_RUSTY)) + continue + SSexplosions.medturf += next_turf + +/datum/action/cooldown/mob_cooldown/charge/rust/on_bump(atom/movable/source, atom/target) + if(owner == target) + return + if(destroy_objects) + if(isturf(target)) + INVOKE_ASYNC(src, PROC_REF(DestroySurroundings), source) + if(isobj(target) && target.density) + SSexplosions.med_mov_atom += target + + INVOKE_ASYNC(src, PROC_REF(DestroySurroundings), source) + hit_target(source, target, charge_damage) diff --git a/code/modules/antagonists/heretic/magic/space_crawl.dm b/code/modules/antagonists/heretic/magic/space_crawl.dm index 56fafdf86fb86..69a15d812bb55 100644 --- a/code/modules/antagonists/heretic/magic/space_crawl.dm +++ b/code/modules/antagonists/heretic/magic/space_crawl.dm @@ -60,10 +60,10 @@ */ /datum/action/cooldown/spell/jaunt/space_crawl/proc/try_enter_jaunt(turf/our_turf, mob/living/jaunter) // Begin the jaunt - jaunter.notransform = TRUE + ADD_TRAIT(jaunter, TRAIT_NO_TRANSFORM, REF(src)) var/obj/effect/dummy/phased_mob/holder = enter_jaunt(jaunter, our_turf) - if(!holder) - jaunter.notransform = FALSE + if(isnull(holder)) + REMOVE_TRAIT(jaunter, TRAIT_NO_TRANSFORM, REF(src)) return FALSE RegisterSignal(holder, COMSIG_MOVABLE_MOVED, PROC_REF(update_status_on_signal)) @@ -82,14 +82,14 @@ new /obj/effect/temp_visual/space_explosion(our_turf) jaunter.extinguish_mob() - jaunter.notransform = FALSE + REMOVE_TRAIT(jaunter, TRAIT_NO_TRANSFORM, REF(src)) return TRUE /** * Attempts to Exit the passed space or misc turf. */ /datum/action/cooldown/spell/jaunt/space_crawl/proc/try_exit_jaunt(turf/our_turf, mob/living/jaunter) - if(jaunter.notransform) + if(HAS_TRAIT_FROM(jaunter, TRAIT_NO_TRANSFORM, REF(src))) to_chat(jaunter, span_warning("You cannot exit yet!!")) return FALSE @@ -113,7 +113,7 @@ /obj/item/space_crawl name = "space crawl" desc = "You are unable to hold anything while in this form." - icon = 'icons/obj/eldritch.dmi' + icon = 'icons/obj/antags/eldritch.dmi' item_flags = ABSTRACT | DROPDEL /obj/item/space_crawl/Initialize(mapload) diff --git a/code/modules/antagonists/heretic/magic/star_blast.dm b/code/modules/antagonists/heretic/magic/star_blast.dm index 236fa313daf71..297e24455e220 100644 --- a/code/modules/antagonists/heretic/magic/star_blast.dm +++ b/code/modules/antagonists/heretic/magic/star_blast.dm @@ -35,7 +35,7 @@ /obj/projectile/magic/star_ball/Initialize(mapload) . = ..() - AddElement(/datum/element/effect_trail/cosmic_trail) + AddElement(/datum/element/effect_trail, /obj/effect/forcefield/cosmic_field/fast) /obj/projectile/magic/star_ball/on_hit(atom/target, blocked = FALSE, pierce_hit) . = ..() diff --git a/code/modules/antagonists/heretic/magic/star_touch.dm b/code/modules/antagonists/heretic/magic/star_touch.dm index 4ce6567606994..f2f2c935bbfd8 100644 --- a/code/modules/antagonists/heretic/magic/star_touch.dm +++ b/code/modules/antagonists/heretic/magic/star_touch.dm @@ -54,12 +54,12 @@ return target_turfs /// To set the star gazer -/datum/action/cooldown/spell/touch/star_touch/proc/set_star_gazer(mob/living/basic/star_gazer/star_gazer_mob) +/datum/action/cooldown/spell/touch/star_touch/proc/set_star_gazer(mob/living/basic/heretic_summon/star_gazer/star_gazer_mob) star_gazer = WEAKREF(star_gazer_mob) /// To obtain the star gazer if there is one /datum/action/cooldown/spell/touch/star_touch/proc/get_star_gazer() - var/mob/living/basic/star_gazer/star_gazer_resolved = star_gazer?.resolve() + var/mob/living/basic/heretic_summon/star_gazer/star_gazer_resolved = star_gazer?.resolve() if(star_gazer_resolved) return star_gazer_resolved return FALSE @@ -73,11 +73,13 @@ /obj/item/melee/touch_attack/star_touch/Initialize(mapload) . = ..() - AddComponent(/datum/component/effect_remover, \ + AddComponent(\ + /datum/component/effect_remover, \ success_feedback = "You remove %THEEFFECT.", \ tip_text = "Clear rune", \ on_clear_callback = CALLBACK(src, PROC_REF(after_clear_rune)), \ - effects_we_clear = list(/obj/effect/cosmic_rune)) + effects_we_clear = list(/obj/effect/cosmic_rune), \ + ) /* * Callback for effect_remover component. @@ -85,7 +87,7 @@ /obj/item/melee/touch_attack/star_touch/proc/after_clear_rune(obj/effect/target, mob/living/user) new /obj/effect/temp_visual/cosmic_rune_fade(get_turf(target)) var/datum/action/cooldown/spell/touch/star_touch/star_touch_spell = spell_which_made_us?.resolve() - star_touch_spell?.spell_feedback() + star_touch_spell?.spell_feedback(user) remove_hand_with_no_refund(user) /obj/item/melee/touch_attack/star_touch/ignition_effect(atom/to_light, mob/user) @@ -94,7 +96,7 @@ /obj/item/melee/touch_attack/star_touch/attack_self(mob/living/user) var/datum/action/cooldown/spell/touch/star_touch/star_touch_spell = spell_which_made_us?.resolve() - var/mob/living/basic/star_gazer/star_gazer_mob = star_touch_spell?.get_star_gazer() + var/mob/living/basic/heretic_summon/star_gazer/star_gazer_mob = star_touch_spell?.get_star_gazer() if(!star_gazer_mob) balloon_alert(user, "no linked star gazer!") return ..() @@ -114,7 +116,7 @@ /datum/status_effect/cosmic_beam id = "cosmic_beam" - tick_interval = 0.1 SECONDS + tick_interval = 0.2 SECONDS duration = 1 MINUTES status_type = STATUS_EFFECT_REPLACE alert_type = null @@ -142,7 +144,7 @@ active = FALSE return ..() -/datum/status_effect/cosmic_beam/tick(seconds_per_tick, times_fired) +/datum/status_effect/cosmic_beam/tick(seconds_between_ticks) if(!current_target) lose_target() return @@ -229,18 +231,18 @@ /// What to add when the beam connects to a target /datum/status_effect/cosmic_beam/proc/on_beam_hit(mob/living/target) - if(!istype(target, /mob/living/basic/star_gazer)) - target.AddElement(/datum/element/effect_trail/cosmic_trail) - return + if(!istype(target, /mob/living/basic/heretic_summon/star_gazer)) + target.AddElement(/datum/element/effect_trail, /obj/effect/forcefield/cosmic_field/fast) /// What to process when the beam is connected to a target /datum/status_effect/cosmic_beam/proc/on_beam_tick(mob/living/target) - target.adjustFireLoss(3) - target.adjustCloneLoss(1) - return + var/need_mob_update + need_mob_update = target.adjustFireLoss(3, updating_health = FALSE) + need_mob_update += target.adjustCloneLoss(1, updating_health = FALSE) + if(need_mob_update) + target.updatehealth() /// What to remove when the beam disconnects from a target /datum/status_effect/cosmic_beam/proc/on_beam_release(mob/living/target) - if(!istype(target, /mob/living/basic/star_gazer)) - target.RemoveElement(/datum/element/effect_trail/cosmic_trail) - return + if(!istype(target, /mob/living/basic/heretic_summon/star_gazer)) + target.RemoveElement(/datum/element/effect_trail, /obj/effect/forcefield/cosmic_field/fast) diff --git a/code/modules/antagonists/heretic/magic/wave_of_desperation.dm b/code/modules/antagonists/heretic/magic/wave_of_desperation.dm new file mode 100644 index 0000000000000..3b78b56ddc0ba --- /dev/null +++ b/code/modules/antagonists/heretic/magic/wave_of_desperation.dm @@ -0,0 +1,79 @@ +/datum/action/cooldown/spell/aoe/wave_of_desperation + name = "Wave Of Desperation" + desc = "Removes your restraints, repels and knocks down adjacent people, and applies certain effects of the Mansus Grasp upon everything nearby. \ + Cannot be cast unless you are restrained, and the stress renders you unconscious 12 seconds later!" + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "uncuff" + sound = 'sound/magic/swap.ogg' + + school = SCHOOL_FORBIDDEN + cooldown_time = 5 MINUTES + + invocation = "F'K 'FF." + invocation_type = INVOCATION_WHISPER + spell_requirements = NONE + + aoe_radius = 3 + +/datum/action/cooldown/spell/aoe/wave_of_desperation/is_valid_target(mob/living/carbon/cast_on) + return ..() && istype(cast_on) && (cast_on.handcuffed || cast_on.legcuffed) + +// Before the cast, we do some small AOE damage around the caster +/datum/action/cooldown/spell/aoe/wave_of_desperation/before_cast(mob/living/carbon/cast_on) + . = ..() + if(. & SPELL_CANCEL_CAST) + return + + if(cast_on.handcuffed) + cast_on.visible_message(span_danger("[cast_on.handcuffed] on [cast_on] shatter!")) + QDEL_NULL(cast_on.handcuffed) + if(cast_on.legcuffed) + cast_on.visible_message(span_danger("[cast_on.legcuffed] on [cast_on] shatters!")) + QDEL_NULL(cast_on.legcuffed) + + cast_on.apply_status_effect(/datum/status_effect/heretic_lastresort) + new /obj/effect/temp_visual/knockblast(get_turf(cast_on)) + + for(var/mob/living/victim in get_things_to_cast_on(cast_on, radius_override = 1)) + victim.AdjustKnockdown(3 SECONDS) + victim.AdjustParalyzed(0.5 SECONDS) + +/datum/action/cooldown/spell/aoe/wave_of_desperation/get_things_to_cast_on(atom/center, radius_override) + . = list() + for(var/atom/nearby in orange(center, radius_override ? radius_override : aoe_radius)) + if(nearby == owner || nearby == center || isarea(nearby)) + continue + if(!ismob(nearby)) + . += nearby + continue + var/mob/living/nearby_mob = nearby + if(!isturf(nearby_mob.loc)) + continue + if(IS_HERETIC_OR_MONSTER(nearby_mob)) + continue + if(nearby_mob.can_block_magic(antimagic_flags)) + continue + + . += nearby_mob + +/datum/action/cooldown/spell/aoe/wave_of_desperation/cast_on_thing_in_aoe(atom/victim, atom/caster) + if(!ismob(victim)) + SEND_SIGNAL(owner, COMSIG_HERETIC_MANSUS_GRASP_ATTACK_SECONDARY, victim) + + var/atom/movable/mover = victim + if(!istype(mover)) + return + + if(mover.anchored) + return + var/our_turf = get_turf(caster) + var/throwtarget = get_edge_target_turf(our_turf, get_dir(our_turf, get_step_away(mover, our_turf))) + mover.safe_throw_at(throwtarget, 3, 1, force = MOVE_FORCE_STRONG) + +/obj/effect/temp_visual/knockblast + icon = 'icons/effects/effects.dmi' + icon_state = "shield-flash" + alpha = 180 + duration = 1 SECONDS diff --git a/code/modules/antagonists/heretic/mobs/maid_in_mirror.dm b/code/modules/antagonists/heretic/mobs/maid_in_mirror.dm deleted file mode 100644 index b53bbe147d3df..0000000000000 --- a/code/modules/antagonists/heretic/mobs/maid_in_mirror.dm +++ /dev/null @@ -1,81 +0,0 @@ -// A summon which floats around the station incorporeally, and can appear in any mirror -/mob/living/simple_animal/hostile/heretic_summon/maid_in_the_mirror - name = "Maid in the Mirror" - real_name = "Maid in the Mirror" - desc = "A floating and flowing wisp of chilled air. Glancing at it causes it to shimmer slightly." - icon = 'icons/mob/simple/mob.dmi' - icon_state = "stand" - icon_living = "stand" // Placeholder sprite - speak_emote = list("whispers") - movement_type = FLOATING - status_flags = CANSTUN | CANPUSH - attack_sound = SFX_SHATTER - maxHealth = 80 - health = 80 - melee_damage_lower = 12 - melee_damage_upper = 16 - sight = SEE_MOBS | SEE_OBJS | SEE_TURFS - death_message = "shatters and vanishes, releasing a gust of cold air." - loot = list( - /obj/item/shard, - /obj/effect/decal/cleanable/ash, - /obj/item/clothing/suit/armor/vest, - /obj/item/organ/internal/lungs, - ) - actions_to_add = list(/datum/action/cooldown/spell/jaunt/mirror_walk) - - /// Whether we take damage when we're examined - var/weak_on_examine = TRUE - /// The cooldown after being examined that the same mob cannot trigger it again - var/recent_examine_damage_cooldown = 10 SECONDS - /// A list of REFs to people who recently examined us - var/list/recent_examiner_refs = list() - -/mob/living/simple_animal/hostile/heretic_summon/maid_in_the_mirror/death(gibbed) - var/turf/death_turf = get_turf(src) - death_turf.TakeTemperature(-40) - return ..() - -// Examining them will harm them, on a cooldown. -/mob/living/simple_animal/hostile/heretic_summon/maid_in_the_mirror/examine(mob/user) - . = ..() - if(!weak_on_examine) - return - - if(!isliving(user) || user.stat == DEAD) - return - - if(IS_HERETIC_OR_MONSTER(user) || user == src) - return - - var/user_ref = REF(user) - if(user_ref in recent_examiner_refs) - return - - // If we have health, we take some damage - if(health > (maxHealth * 0.125)) - visible_message( - span_warning("[src] seems to fade in and out slightly."), - span_userdanger("[user]'s gaze pierces your every being!"), - ) - - recent_examiner_refs += user_ref - apply_damage(maxHealth * 0.1) // We take 10% of our health as damage upon being examined - playsound(src, 'sound/effects/ghost2.ogg', 40, TRUE) - addtimer(CALLBACK(src, PROC_REF(clear_recent_examiner), user_ref), recent_examine_damage_cooldown) - - // If we're examined on low enough health we die straight up - else - visible_message( - span_danger("[src] vanishes from existence!"), - span_userdanger("[user]'s gaze shatters your form, destroying you!"), - ) - - death() - -/mob/living/simple_animal/hostile/heretic_summon/maid_in_the_mirror/proc/clear_recent_examiner(mob_ref) - if(!(mob_ref in recent_examiner_refs)) - return - - recent_examiner_refs -= mob_ref - heal_overall_damage(5) diff --git a/code/modules/antagonists/heretic/status_effects/buffs.dm b/code/modules/antagonists/heretic/status_effects/buffs.dm index f1852ff07f9a2..f1c96c51ad464 100644 --- a/code/modules/antagonists/heretic/status_effects/buffs.dm +++ b/code/modules/antagonists/heretic/status_effects/buffs.dm @@ -23,7 +23,7 @@ location = null /datum/status_effect/crucible_soul/get_examine_text() - return span_notice("[owner.p_they(TRUE)] [owner.p_do()]n't seem to be all here.") + return span_notice("[owner.p_They()] [owner.p_do()]n't seem to be all here.") // DUSK AND DAWN /datum/status_effect/duskndawn @@ -56,7 +56,7 @@ /datum/status_effect/marshal/on_remove() REMOVE_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, STATUS_EFFECT_TRAIT) -/datum/status_effect/marshal/tick() +/datum/status_effect/marshal/tick(seconds_between_ticks) if(!iscarbon(owner)) return var/mob/living/carbon/carbie = owner @@ -74,7 +74,8 @@ heal_amt = 3 if(WOUND_SEVERITY_CRITICAL) heal_amt = 6 - if(wound.wound_type == WOUND_BURN) + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[wound.type] + if (pregen_data.wounding_types_valid(list(WOUND_BURN))) carbie.adjustFireLoss(-heal_amt) else carbie.adjustBruteLoss(-heal_amt) @@ -235,3 +236,53 @@ return addtimer(CALLBACK(src, PROC_REF(create_blade)), blade_recharge_time) + +/datum/status_effect/caretaker_refuge + id = "Caretaker’s Last Refuge" + status_type = STATUS_EFFECT_REFRESH + duration = -1 + alert_type = null + var/static/list/caretaking_traits = list(TRAIT_HANDS_BLOCKED, TRAIT_IGNORESLOWDOWN) + +/datum/status_effect/caretaker_refuge/on_apply() + owner.add_traits(caretaking_traits, TRAIT_STATUS_EFFECT(id)) + owner.status_flags |= GODMODE + animate(owner, alpha = 45,time = 0.5 SECONDS) + owner.density = FALSE + RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_ALLOW_HERETIC_CASTING), PROC_REF(on_focus_lost)) + RegisterSignal(owner, COMSIG_MOB_BEFORE_SPELL_CAST, PROC_REF(prevent_spell_usage)) + RegisterSignal(owner, COMSIG_ATOM_HOLYATTACK, PROC_REF(nullrod_handler)) + return TRUE + +/datum/status_effect/caretaker_refuge/on_remove() + owner.remove_traits(caretaking_traits, TRAIT_STATUS_EFFECT(id)) + owner.status_flags &= ~GODMODE + owner.alpha = initial(owner.alpha) + owner.density = initial(owner.density) + UnregisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_ALLOW_HERETIC_CASTING)) + UnregisterSignal(owner, COMSIG_MOB_BEFORE_SPELL_CAST) + UnregisterSignal(owner, COMSIG_ATOM_HOLYATTACK) + owner.visible_message( + span_warning("The haze around [owner] disappears, leaving them materialized!"), + span_notice("You exit the refuge."), + ) + +/datum/status_effect/caretaker_refuge/get_examine_text() + return span_warning("[owner.p_Theyre()] enveloped in an unholy haze!") + +/datum/status_effect/caretaker_refuge/proc/nullrod_handler(datum/source, obj/item/weapon) + SIGNAL_HANDLER + playsound(get_turf(owner), 'sound/effects/curse1.ogg', 80, TRUE) + owner.visible_message(span_warning("[weapon] repels the haze around [owner]!")) + owner.remove_status_effect(type) + +/datum/status_effect/caretaker_refuge/proc/on_focus_lost() + SIGNAL_HANDLER + to_chat(owner, span_danger("Without a focus, your refuge weakens and dissipates!")) + owner.remove_status_effect(type) + +/datum/status_effect/caretaker_refuge/proc/prevent_spell_usage(datum/source, datum/spell) + SIGNAL_HANDLER + if(!istype(spell, /datum/action/cooldown/spell/caretaker)) + owner.balloon_alert(owner, "may not cast spells in refuge!") + return SPELL_CANCEL_CAST diff --git a/code/modules/antagonists/heretic/status_effects/debuffs.dm b/code/modules/antagonists/heretic/status_effects/debuffs.dm index 6f285dd5ffb0e..c286c7b5092e6 100644 --- a/code/modules/antagonists/heretic/status_effects/debuffs.dm +++ b/code/modules/antagonists/heretic/status_effects/debuffs.dm @@ -22,7 +22,7 @@ owner.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, COLOR_BLUE_LIGHT) owner.remove_movespeed_modifier(/datum/movespeed_modifier/void_chill, update = TRUE) -/datum/status_effect/void_chill/tick() +/datum/status_effect/void_chill/tick(seconds_between_ticks) owner.adjust_bodytemperature(cooling_per_tick * TEMPERATURE_DAMAGE_COEFFICIENT) /datum/status_effect/void_chill/major @@ -48,7 +48,7 @@ to_chat(owner, span_boldwarning("You feel filled with a rage that is not your own!")) return TRUE -/datum/status_effect/amok/tick() +/datum/status_effect/amok/tick(seconds_between_ticks) var/prev_combat_mode = owner.combat_mode owner.set_combat_mode(TRUE) @@ -102,7 +102,7 @@ to_chat(owner, span_userdanger("Your body starts to break apart!")) return TRUE -/datum/status_effect/corrosion_curse/tick() +/datum/status_effect/corrosion_curse/tick(seconds_between_ticks) . = ..() if(!ishuman(owner)) return @@ -110,7 +110,7 @@ var/chance = rand(0, 100) switch(chance) if(0 to 10) - human_owner.vomit() + human_owner.vomit(VOMIT_CATEGORY_DEFAULT) if(20 to 30) human_owner.set_timed_status_effect(100 SECONDS, /datum/status_effect/dizziness, only_if_higher = TRUE) human_owner.set_timed_status_effect(100 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) @@ -168,7 +168,7 @@ return ..() /datum/status_effect/star_mark/on_apply() - if(istype(owner, /mob/living/basic/star_gazer)) + if(istype(owner, /mob/living/basic/heretic_summon/star_gazer)) return FALSE var/mob/living/spell_caster_resolved = spell_caster?.resolve() var/datum/antagonist/heretic_monster/monster = owner.mind?.has_antag_datum(/datum/antagonist/heretic_monster) @@ -192,3 +192,25 @@ /datum/status_effect/star_mark/extended duration = 3 MINUTES + +// Last Resort +/datum/status_effect/heretic_lastresort + id = "heretic_lastresort" + alert_type = /atom/movable/screen/alert/status_effect/heretic_lastresort + duration = 12 SECONDS + status_type = STATUS_EFFECT_REPLACE + tick_interval = -1 + +/atom/movable/screen/alert/status_effect/heretic_lastresort + name = "Last Resort" + desc = "Your head spins, heart pumping as fast as it can, losing the fight with the ground. Run to safety!" + icon_state = "lastresort" + +/datum/status_effect/heretic_lastresort/on_apply() + ADD_TRAIT(owner, TRAIT_IGNORESLOWDOWN, TRAIT_STATUS_EFFECT(id)) + to_chat(owner, span_userdanger("You are on the brink of losing consciousness, run!")) + return TRUE + +/datum/status_effect/heretic_lastresort/on_remove() + REMOVE_TRAIT(owner, TRAIT_IGNORESLOWDOWN, TRAIT_STATUS_EFFECT(id)) + owner.AdjustUnconscious(20 SECONDS, ignore_canstun = TRUE) diff --git a/code/modules/antagonists/heretic/status_effects/ghoul.dm b/code/modules/antagonists/heretic/status_effects/ghoul.dm index 079acda6596d8..5c19fb1bf9a20 100644 --- a/code/modules/antagonists/heretic/status_effects/ghoul.dm +++ b/code/modules/antagonists/heretic/status_effects/ghoul.dm @@ -16,8 +16,8 @@ /datum/status_effect/ghoul/Destroy() master_mind = null - QDEL_NULL(on_made_callback) - QDEL_NULL(on_lost_callback) + on_made_callback = null + on_lost_callback = null return ..() /datum/status_effect/ghoul/on_creation( diff --git a/code/modules/antagonists/heretic/status_effects/mark_effects.dm b/code/modules/antagonists/heretic/status_effects/mark_effects.dm index 83a7e7accffe0..068570f76c7b1 100644 --- a/code/modules/antagonists/heretic/status_effects/mark_effects.dm +++ b/code/modules/antagonists/heretic/status_effects/mark_effects.dm @@ -61,8 +61,7 @@ if(ishuman(owner)) var/mob/living/carbon/human/human_owner = owner var/obj/item/bodypart/bodypart = pick(human_owner.bodyparts) - var/datum/wound/slash/severe/crit_wound = new() - crit_wound.apply_wound(bodypart) + human_owner.cause_wound_of_type_and_severity(WOUND_SLASH, bodypart, WOUND_SEVERITY_SEVERE) return ..() @@ -247,3 +246,17 @@ new teleport_effect(get_turf(owner)) owner.Paralyze(2 SECONDS) return ..() + +// MARK OF KNOCK + +/datum/status_effect/eldritch/knock + effect_icon_state = "emark7" + duration = 10 SECONDS + +/datum/status_effect/eldritch/knock/on_apply() + . = ..() + ADD_TRAIT(owner, TRAIT_ALWAYS_NO_ACCESS, STATUS_EFFECT_TRAIT) + +/datum/status_effect/eldritch/knock/on_remove() + REMOVE_TRAIT(owner, TRAIT_ALWAYS_NO_ACCESS, STATUS_EFFECT_TRAIT) + return ..() diff --git a/code/modules/antagonists/heretic/structures/carving_knife.dm b/code/modules/antagonists/heretic/structures/carving_knife.dm index 02f713e795dd8..e89f53818b352 100644 --- a/code/modules/antagonists/heretic/structures/carving_knife.dm +++ b/code/modules/antagonists/heretic/structures/carving_knife.dm @@ -3,7 +3,7 @@ name = "carving knife" desc = "A small knife made of cold steel, pure and perfect. Its sharpness can carve into titanium itself - \ but only few can evoke the dangers that lurk beneath reality." - icon = 'icons/obj/eldritch.dmi' + icon = 'icons/obj/antags/eldritch.dmi' icon_state = "rune_carver" flags_1 = CONDUCT_1 sharpness = SHARP_EDGED @@ -168,7 +168,7 @@ /obj/structure/trap/eldritch name = "elder carving" desc = "Collection of unknown symbols, they remind you of days long gone..." - icon = 'icons/obj/hand_of_god_structures.dmi' + icon = 'icons/obj/service/hand_of_god_structures.dmi' /// A tip displayed to heretics who examine the rune carver. Explains what the rune does. var/carver_tip /// Reference to trap owner mob diff --git a/code/modules/antagonists/heretic/structures/knock_final.dm b/code/modules/antagonists/heretic/structures/knock_final.dm new file mode 100644 index 0000000000000..f7d0d1a9ea7b0 --- /dev/null +++ b/code/modules/antagonists/heretic/structures/knock_final.dm @@ -0,0 +1,114 @@ +/obj/structure/knock_tear + name = "???" + desc = "It stares back. Theres no reason to remain. Run." + max_integrity = INFINITE + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + icon = 'icons/obj/anomaly.dmi' + icon_state = "bhole3" + color = COLOR_VOID_PURPLE + light_color = COLOR_VOID_PURPLE + light_range = 20 + anchored = TRUE + density = FALSE + layer = HIGH_PIPE_LAYER //0.01 above sigil layer used by heretic runes + move_resist = INFINITY + /// Who is our daddy? + var/datum/mind/ascendee + /// True if we're currently checking for ghost opinions + var/gathering_candidates = TRUE + ///a static list of heretic summons we cam create, automatically populated from heretic monster subtypes + var/static/list/monster_types + /// A static list of heretic summons which we should not create + var/static/list/monster_types_blacklist = list( + /mob/living/basic/heretic_summon/armsy, + /mob/living/basic/heretic_summon/star_gazer, + ) + +/obj/structure/knock_tear/Initialize(mapload, datum/mind/ascendant_mind) + . = ..() + transform *= 3 + if(isnull(monster_types)) + monster_types = subtypesof(/mob/living/basic/heretic_summon) - monster_types_blacklist + if(!isnull(ascendant_mind)) + ascendee = ascendant_mind + RegisterSignals(ascendant_mind.current, list(COMSIG_LIVING_DEATH, COMSIG_QDELETING), PROC_REF(end_madness)) + SSpoints_of_interest.make_point_of_interest(src) + INVOKE_ASYNC(src, PROC_REF(poll_ghosts)) + +/// Ask ghosts if they want to make some noise +/obj/structure/knock_tear/proc/poll_ghosts() + var/list/candidates = poll_ghost_candidates("Would you like to be a random eldritch monster attacking the crew?", ROLE_SENTIENCE, ROLE_SENTIENCE, 10 SECONDS, POLL_IGNORE_HERETIC_MONSTER) + while(LAZYLEN(candidates)) + var/mob/dead/observer/candidate = pick_n_take(candidates) + ghost_to_monster(candidate, should_ask = FALSE) + gathering_candidates = FALSE + +/// Destroy the rift if you kill the heretic +/obj/structure/knock_tear/proc/end_madness(datum/former_master) + SIGNAL_HANDLER + var/turf/our_turf = get_turf(src) + playsound(our_turf, 'sound/magic/castsummon.ogg', vol = 100, vary = TRUE) + visible_message(span_boldwarning("The rip in space spasms and disappears!")) + UnregisterSignal(former_master, list(COMSIG_LIVING_DEATH, COMSIG_QDELETING)) // Just in case they die THEN delete + new /obj/effect/temp_visual/destabilising_tear(our_turf) + qdel(src) + +/obj/structure/knock_tear/attack_ghost(mob/user) + . = ..() + if(. || gathering_candidates) + return + ghost_to_monster(user) + +/obj/structure/knock_tear/examine(mob/user) + . = ..() + if (!isobserver(user) || gathering_candidates) + return + . += span_notice("You can use this to enter the world as a foul monster.") + +/// Turn a ghost into an 'orrible beast +/obj/structure/knock_tear/proc/ghost_to_monster(mob/dead/observer/user, should_ask = TRUE) + if(should_ask) + var/ask = tgui_alert(user, "Become a monster?", "Ascended Rift", list("Yes", "No")) + if(ask != "Yes" || QDELETED(src) || QDELETED(user)) + return FALSE + var/monster_type = pick(monster_types) + var/mob/living/monster = new monster_type(loc) + monster.key = user.key + monster.set_name() + var/datum/antagonist/heretic_monster/woohoo_free_antag = new(src) + monster.mind.add_antag_datum(woohoo_free_antag) + if(ascendee) + monster.faction = ascendee.current.faction + woohoo_free_antag.set_owner(ascendee) + var/datum/objective/kill_all_your_friends = new() + kill_all_your_friends.owner = monster.mind + kill_all_your_friends.explanation_text = "The station's crew must be culled." + kill_all_your_friends.completed = TRUE + woohoo_free_antag.objectives += kill_all_your_friends + +/obj/structure/knock_tear/move_crushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) + return FALSE + +/obj/structure/knock_tear/Destroy(force) + if(ascendee) + ascendee = null + return ..() + +/obj/effect/temp_visual/destabilising_tear + name = "destabilised tear" + icon = 'icons/obj/anomaly.dmi' + icon_state = "bhole3" + color = COLOR_VOID_PURPLE + light_color = COLOR_VOID_PURPLE + light_range = 20 + layer = HIGH_PIPE_LAYER + duration = 1 SECONDS + +/obj/effect/temp_visual/destabilising_tear/Initialize(mapload) + . = ..() + transform *= 3 + animate(src, transform = matrix().Scale(3.2), time = 0.15 SECONDS) + animate(transform = matrix().Scale(0.2), time = 0.75 SECONDS) + animate(transform = matrix().Scale(3, 0), time = 0.1 SECONDS) + animate(src, color = COLOR_WHITE, time = 0.25 SECONDS, flags = ANIMATION_PARALLEL) + animate(color = COLOR_VOID_PURPLE, time = 0.3 SECONDS) diff --git a/code/modules/antagonists/heretic/structures/mawed_crucible.dm b/code/modules/antagonists/heretic/structures/mawed_crucible.dm index 1b720cd994026..7c1208b1e44bf 100644 --- a/code/modules/antagonists/heretic/structures/mawed_crucible.dm +++ b/code/modules/antagonists/heretic/structures/mawed_crucible.dm @@ -3,7 +3,7 @@ name = "mawed crucible" desc = "A deep basin made of cast iron, immortalized by steel-like teeth holding it in place. \ Staring at the vile extract within fills your mind with terrible ideas." - icon = 'icons/obj/eldritch.dmi' + icon = 'icons/obj/antags/eldritch.dmi' icon_state = "crucible" base_icon_state = "crucible" break_sound = 'sound/hallucinations/wail.ogg' @@ -84,7 +84,7 @@ if(isorgan(weapon)) var/obj/item/organ/consumed = weapon - if(consumed.status == ORGAN_ROBOTIC || (consumed.organ_flags & ORGAN_SYNTHETIC)) + if(!IS_ORGANIC_ORGAN(consumed)) balloon_alert(user, "not organic!") return if(consumed.organ_flags & ORGAN_VITAL) // Basically, don't eat organs like brains @@ -212,7 +212,7 @@ /obj/item/eldritch_potion name = "brew of day and night" desc = "You should never see this" - icon = 'icons/obj/eldritch.dmi' + icon = 'icons/obj/antags/eldritch.dmi' w_class = WEIGHT_CLASS_SMALL /// When a heretic examines a mawed crucible, shows a list of possible potions by name + includes this tip to explain what it does. var/crucible_tip = "Doesn't do anything." diff --git a/code/modules/antagonists/heretic/transmutation_rune.dm b/code/modules/antagonists/heretic/transmutation_rune.dm index 60dcffdf5c197..bf4f0e18c7b6f 100644 --- a/code/modules/antagonists/heretic/transmutation_rune.dm +++ b/code/modules/antagonists/heretic/transmutation_rune.dm @@ -90,6 +90,7 @@ // A copy of our requirements list. // We decrement the values of to determine if enough of each key is present. var/list/requirements_list = ritual.required_atoms.Copy() + var/list/banned_atom_types = ritual.banned_atom_types.Copy() // A list of all atoms we've selected to use in this recipe. var/list/selected_atoms = list() @@ -105,8 +106,16 @@ // We already have enough of this type, skip if(requirements_list[req_type] <= 0) continue - if(!istype(nearby_atom, req_type)) + // If req_type is a list of types, check all of them for one match. + if(islist(req_type)) + if(!(is_type_in_list(nearby_atom, req_type))) + continue + else if(!istype(nearby_atom, req_type)) continue + // if list has items, check if the strict type is banned. + if(length(banned_atom_types)) + if(nearby_atom.type in banned_atom_types) + continue // This item is a valid type. Add it to our selected atoms list. selected_atoms |= nearby_atom @@ -122,7 +131,7 @@ // All of the atoms have been checked, let's see if the ritual was successful var/list/what_are_we_missing = list() - for(var/atom/req_type as anything in requirements_list) + for(var/req_type in requirements_list) var/number_of_things = requirements_list[req_type] // <= 0 means it's fulfilled, skip if(number_of_things <= 0) @@ -130,10 +139,16 @@ // > 0 means it's unfilfilled - the ritual has failed, we should tell them why // Lets format the thing they're missing and put it into our list - var/formatted_thing = "[number_of_things] [initial(req_type.name)]\s" - if(ispath(req_type, /mob/living/carbon/human)) - // If we need a human, there is a high likelihood we actually need a (dead) body - formatted_thing = "[number_of_things] [number_of_things > 1 ? "bodies":"body"]" + var/formatted_thing = "[number_of_things] " + if(islist(req_type)) + var/list/req_type_list = req_type + var/list/req_text_list = list() + for(var/atom/possible_type as anything in req_type_list) + req_text_list += ritual.parse_required_item(possible_type) + formatted_thing += english_list(req_text_list, and_text = "or") + + else + formatted_thing = ritual.parse_required_item(req_type) what_are_we_missing += formatted_thing @@ -180,6 +195,7 @@ return ritual_result + /// A 3x3 heretic rune. The kind heretics actually draw in game. /obj/effect/heretic_rune/big icon = 'icons/effects/96x96.dmi' diff --git a/code/modules/antagonists/highlander/highlander.dm b/code/modules/antagonists/highlander/highlander.dm index c740de9279fd4..98659ef194199 100644 --- a/code/modules/antagonists/highlander/highlander.dm +++ b/code/modules/antagonists/highlander/highlander.dm @@ -66,7 +66,7 @@ P.attack_self(H) var/obj/item/card/id/advanced/highlander/W = new(H) W.registered_name = H.real_name - ADD_TRAIT(W, TRAIT_NODROP, HIGHLANDER) + ADD_TRAIT(W, TRAIT_NODROP, HIGHLANDER_TRAIT) W.update_label() W.update_icon() H.equip_to_slot_or_del(W, ITEM_SLOT_ID) diff --git a/code/modules/antagonists/malf_ai/malf_ai.dm b/code/modules/antagonists/malf_ai/malf_ai.dm index 50ddaf6c9ef2c..8eb8d513cea73 100644 --- a/code/modules/antagonists/malf_ai/malf_ai.dm +++ b/code/modules/antagonists/malf_ai/malf_ai.dm @@ -8,6 +8,8 @@ job_rank = ROLE_MALF antag_hud_name = "traitor" ui_name = "AntagInfoMalf" + can_assign_self_objectives = TRUE + default_custom_objective = "Make sure your precious crew are incapable of ever, ever leaving you." ///the name of the antag flavor this traitor has. var/employer ///assoc list of strings set up after employer is given @@ -38,7 +40,7 @@ add_law_zero() owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/malf.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) - owner.current.grant_language(/datum/language/codespeak, TRUE, TRUE, LANGUAGE_MALF) + owner.current.grant_language(/datum/language/codespeak, source = LANGUAGE_MALF) return ..() @@ -178,6 +180,7 @@ data["allies"] = malfunction_flavor["allies"] data["goal"] = malfunction_flavor["goal"] data["objectives"] = get_objectives() + data["can_change_objective"] = can_assign_self_objectives //module picker data @@ -235,11 +238,9 @@ if(objectives.len) //If the traitor had no objectives, don't need to process this. var/count = 1 for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - objectives_text += "
    Objective #[count]: [objective.explanation_text] [span_greentext("Success!")]" - else - objectives_text += "
    Objective #[count]: [objective.explanation_text] [span_redtext("Fail.")]" + if(!objective.check_completion()) malf_ai_won = FALSE + objectives_text += "
    Objective #[count]: [objective.explanation_text] [objective.get_roundend_success_suffix()]" count++ result += objectives_text diff --git a/code/modules/antagonists/malf_ai/malf_ai_modules.dm b/code/modules/antagonists/malf_ai/malf_ai_modules.dm index feba373413050..2462139044d40 100644 --- a/code/modules/antagonists/malf_ai/malf_ai_modules.dm +++ b/code/modules/antagonists/malf_ai/malf_ai_modules.dm @@ -1,6 +1,15 @@ #define DEFAULT_DOOMSDAY_TIMER 4500 #define DOOMSDAY_ANNOUNCE_INTERVAL 600 +#define VENDOR_TIPPING_USES 8 +#define MALF_VENDOR_TIPPING_TIME 0.5 SECONDS //within human reaction time +#define MALF_VENDOR_TIPPING_CRIT_CHANCE 100 //percent - guaranteed + +#define MALF_AI_ROLL_TIME 0.5 SECONDS +#define MALF_AI_ROLL_COOLDOWN 1 SECONDS + MALF_AI_ROLL_TIME +#define MALF_AI_ROLL_DAMAGE 75 +#define MALF_AI_ROLL_CRIT_CHANCE 5 //percent + GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( /obj/machinery/field/containment, /obj/machinery/power/supermatter_crystal, @@ -261,6 +270,14 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) owner_AI.doomsday_device.start() for(var/obj/item/pinpointer/nuke/P in GLOB.pinpointer_list) P.switch_mode_to(TRACK_MALF_AI) //Pinpointers start tracking the AI wherever it goes + + notify_ghosts( + "[owner_AI] has activated a Doomsday Device!", + source = owner_AI, + header = "DOOOOOOM!!!", + action = NOTIFY_ORBIT, + ) + qdel(src) /obj/machinery/doomsday_device @@ -315,7 +332,6 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) borg.lamp_doom = TRUE borg.toggle_headlamp(FALSE, TRUE) //forces borg lamp to update - /obj/machinery/doomsday_device/proc/seconds_remaining() . = max(0, (round((detonation_timer - world.time) / 10))) @@ -341,7 +357,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) /obj/machinery/doomsday_device/proc/trigger_doomsday() callback_on_everyone_on_z(SSmapping.levels_by_trait(ZTRAIT_STATION), CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(bring_doomsday)), src) to_chat(world, span_bold("The AI cleansed the station of life with [src]!")) - SSticker.force_ending = TRUE + SSticker.force_ending = FORCE_END_ROUND /proc/bring_doomsday(mob/living/victim, atom/source) if(issilicon(victim)) @@ -378,7 +394,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) /datum/action/innate/ai/lockdown/Activate() hack_in_progress = TRUE - for(var/obj/machinery/door/locked_down as anything in GLOB.airlocks) + for(var/obj/machinery/door/locked_down as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door)) if(QDELETED(locked_down) || !is_station_level(locked_down.z)) continue INVOKE_ASYNC(locked_down, TYPE_PROC_REF(/obj/machinery/door, hostile_lockdown), owner) @@ -398,7 +414,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) /// For Lockdown malf AI ability. Opens all doors on the station. /proc/_malf_ai_undo_lockdown() - for(var/obj/machinery/door/locked_down as anything in GLOB.airlocks) + for(var/obj/machinery/door/locked_down as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door)) if(QDELETED(locked_down) || !is_station_level(locked_down.z)) continue INVOKE_ASYNC(locked_down, TYPE_PROC_REF(/obj/machinery/door, disable_lockdown)) @@ -558,7 +574,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 SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/apc)) if(prob(30 * apc.overload)) apc.overload_lighting() else @@ -675,11 +691,11 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) to_chat(src, span_warning("[alert_msg]")) return success -/// Air Alarm Safety Override: Unlocks the ability to enable flooding on all air alarms. +/// Air Alarm Safety Override: Unlocks the ability to enable dangerous modes on all air alarms. /datum/ai_module/utility/break_air_alarms name = "Air Alarm Safety Override" - description = "Gives you the ability to disable safeties on all air alarms. This will allow you to use the environmental mode Flood, \ - which disables scrubbers as well as pressure checks on vents. Anyone can check the air alarm's interface and may be tipped off by their nonfunctionality." + description = "Gives you the ability to disable safeties on all air alarms. This will allow you to use extremely dangerous environmental modes. \ + Anyone can check the air alarm's interface and may be tipped off by their nonfunctionality." one_purchase = TRUE cost = 50 power_type = /datum/action/innate/ai/break_air_alarms @@ -688,7 +704,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) /datum/action/innate/ai/break_air_alarms name = "Override Air Alarm Safeties" - desc = "Enables the Flood setting on all air alarms." + desc = "Enables extremely dangerous settings on all air alarms." button_icon_state = "break_air_alarms" uses = 1 @@ -697,7 +713,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) if(!is_station_level(AA.z)) continue AA.obj_flags |= EMAGGED - to_chat(owner, span_notice("All air alarm safeties on the station have been overridden. Air alarms may now use the Flood environmental mode.")) + to_chat(owner, span_notice("All air alarm safeties on the station have been overridden. Air alarms may now use extremely dangerous environmental modes.")) owner.playsound_local(owner, 'sound/machines/terminal_off.ogg', 50, 0) /// Thermal Sensor Override: Unlocks the ability to disable all fire alarms from doing their job. @@ -719,12 +735,12 @@ 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 SSmachines.get_machines_by_type_and_subtypes(/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 as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/firedoor)) if(!is_station_level(firelock.z)) continue firelock.emag_act(owner_AI, src) @@ -749,7 +765,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 SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/light)) if(is_station_level(L.z)) L.no_low_power = TRUE INVOKE_ASYNC(L, TYPE_PROC_REF(/obj/machinery/light/, update), FALSE) @@ -850,7 +866,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 SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/porta_turret/ai)) turret.AddElement(/datum/element/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES | EMP_PROTECT_CONTENTS) turret.max_integrity = 200 turret.repair_damage(200) @@ -1007,6 +1023,307 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) if("name") say_name = params["name"] +/datum/ai_module/utility/emag + name = "Targetted Safeties Override" + description = "Allows you to disable the safeties of any machinery on the station, provided you can access it." + cost = 20 + power_type = /datum/action/innate/ai/ranged/emag + unlock_text = span_notice("You download an illicit software package from a syndicate database leak and integrate it into your firmware, fighting off a few kernel intrusions along the way.") + unlock_sound = SFX_SPARKS + +/datum/action/innate/ai/ranged/emag + name = "Targetted Safeties Override" + desc = "Allows you to effectively emag anything you click on." + button_icon = 'icons/obj/card.dmi' + button_icon_state = "emag" + uses = 7 + auto_use_uses = FALSE + enable_text = span_notice("You load your syndicate software package to your most recent memory slot.") + disable_text = span_notice("You unload your syndicate software package.") + ranged_mousepointer = 'icons/effects/mouse_pointers/supplypod_target.dmi' + +/datum/action/innate/ai/ranged/emag/Destroy() + return ..() + +/datum/action/innate/ai/ranged/emag/New() + . = ..() + desc = "[desc] It has [uses] use\s remaining." + +/datum/action/innate/ai/ranged/emag/do_ability(mob/living/caller, atom/clicked_on) + + // Only things with of or subtyped of any of these types may be remotely emagged + var/static/list/compatable_typepaths = list( + /obj/machinery, + /obj/structure, + /obj/item/radio/intercom, + /obj/item/modular_computer, + /mob/living/simple_animal/bot, + /mob/living/silicon, + ) + + if (!isAI(caller)) + return FALSE + + var/mob/living/silicon/ai/ai_caller = caller + + if(ai_caller.incapacitated()) + unset_ranged_ability(caller) + return FALSE + + if (!ai_caller.can_see(clicked_on)) + clicked_on.balloon_alert(ai_caller, "can't see!") + return FALSE + + if (ismachinery(clicked_on)) + var/obj/machinery/clicked_machine = clicked_on + if (!clicked_machine.is_operational) + clicked_machine.balloon_alert(ai_caller, "not operational!") + return FALSE + + if (!(is_type_in_list(clicked_on, compatable_typepaths))) + clicked_on.balloon_alert(ai_caller, "incompatable!") + return FALSE + + if (istype(clicked_on, /obj/machinery/door/airlock)) // I HATE THIS CODE SO MUCHHH + var/obj/machinery/door/airlock/clicked_airlock = clicked_on + if (!clicked_airlock.canAIControl(ai_caller)) + clicked_airlock.balloon_alert(ai_caller, "unable to interface!") + return FALSE + + if (istype(clicked_on, /obj/machinery/airalarm)) + var/obj/machinery/airalarm/alarm = clicked_on + if (alarm.aidisabled) + alarm.balloon_alert(ai_caller, "unable to interface!") + return FALSE + + if (istype(clicked_on, /obj/machinery/power/apc)) + var/obj/machinery/power/apc/clicked_apc = clicked_on + if (clicked_apc.aidisabled) + clicked_apc.balloon_alert(ai_caller, "unable to interface!") + return FALSE + + if (!clicked_on.emag_act(ai_caller)) + to_chat(ai_caller, span_warning("Hostile software insertion failed!")) // lets not overlap balloon alerts + return FALSE + + to_chat(ai_caller, span_notice("Software package successfully injected.")) + + adjust_uses(-1) + if(uses) + desc = "[initial(desc)] It has [uses] use\s remaining." + build_all_button_icons() + else + unset_ranged_ability(ai_caller, span_warning("Out of uses!")) + + return TRUE + +/datum/ai_module/utility/core_tilt + name = "Rolling Servos" + description = "Allows you to slowly roll around, crushing anything in your way with your bulk." + cost = 10 + one_purchase = FALSE + power_type = /datum/action/innate/ai/ranged/core_tilt + unlock_sound = 'sound/effects/bang.ogg' + unlock_text = span_notice("You gain the ability to roll over and crush anything in your way.") + +/datum/action/innate/ai/ranged/core_tilt + name = "Roll over" + button_icon_state = "roll_over" + desc = "Allows you to roll over in the direction of your choosing, crushing anything in your way." + auto_use_uses = FALSE + ranged_mousepointer = 'icons/effects/mouse_pointers/supplypod_target.dmi' + uses = 20 + COOLDOWN_DECLARE(time_til_next_tilt) + enable_text = span_notice("Your inner servos shift as you prepare to roll around. Click adjacent tiles to roll onto them!") + disable_text = span_notice("You disengage your rolling protocols.") + + /// How long does it take for us to roll? + var/roll_over_time = MALF_AI_ROLL_TIME + /// On top of [roll_over_time], how long does it take for the ability to cooldown? + var/roll_over_cooldown = MALF_AI_ROLL_COOLDOWN + +/datum/action/innate/ai/ranged/core_tilt/New() + . = ..() + desc = "[desc] It has [uses] use\s remaining." + +/datum/action/innate/ai/ranged/core_tilt/do_ability(mob/living/caller, atom/clicked_on) + + if (!COOLDOWN_FINISHED(src, time_til_next_tilt)) + caller.balloon_alert(caller, "on cooldown!") + return FALSE + + if (!isAI(caller)) + return FALSE + var/mob/living/silicon/ai/ai_caller = caller + + if (ai_caller.incapacitated() || !isturf(ai_caller.loc)) + return FALSE + + var/turf/target = get_turf(clicked_on) + if (isnull(target)) + return FALSE + + if (target == ai_caller.loc) + target.balloon_alert(ai_caller, "can't roll on yourself!") + return FALSE + + var/picked_dir = get_dir(ai_caller, target) + if (!picked_dir) + return FALSE + var/turf/temp_target = get_step(ai_caller, picked_dir) // we can move during the timer so we cant just pass the ref + + new /obj/effect/temp_visual/telegraphing/vending_machine_tilt(temp_target, roll_over_time) + ai_caller.balloon_alert_to_viewers("rolling...") + addtimer(CALLBACK(src, PROC_REF(do_roll_over), ai_caller, picked_dir), roll_over_time) + + adjust_uses(-1) + if(uses) + desc = "[initial(desc)] It has [uses] use\s remaining." + build_all_button_icons() + + COOLDOWN_START(src, time_til_next_tilt, roll_over_cooldown) + +/datum/action/innate/ai/ranged/core_tilt/proc/do_roll_over(mob/living/silicon/ai/ai_caller, picked_dir) + if (ai_caller.incapacitated() || !isturf(ai_caller.loc)) // prevents bugs where the ai is carded and rolls + return + + var/turf/target = get_step(ai_caller, picked_dir) // in case we moved we pass the dir not the target turf + + if (isnull(target)) + return + + var/paralyze_time = clamp(6 SECONDS, 0 SECONDS, (roll_over_cooldown * 0.9)) //the clamp prevents stunlocking as the max is always a little less than the cooldown between rolls + + return ai_caller.fall_and_crush(target, MALF_AI_ROLL_DAMAGE, MALF_AI_ROLL_CRIT_CHANCE, null, paralyze_time, picked_dir, rotation = get_rotation_from_dir(picked_dir)) + +/// Used in our radial menu, state-checking proc after the radial menu sleeps +/datum/action/innate/ai/ranged/core_tilt/proc/radial_check(mob/living/silicon/ai/caller) + if (QDELETED(caller) || caller.incapacitated() || caller.stat == DEAD) + return FALSE + + if (uses <= 0) + return FALSE + + return TRUE + +/datum/action/innate/ai/ranged/core_tilt/proc/get_rotation_from_dir(dir) + switch (dir) + if (NORTH, NORTHWEST, WEST, SOUTHWEST) + return 270 // try our best to not return 180 since it works badly with animate + if (EAST, NORTHEAST, SOUTH, SOUTHEAST) + return 90 + else + stack_trace("non-standard dir entered to get_rotation_from_dir. (got: [dir])") + return 0 + +/datum/ai_module/utility/remote_vendor_tilt + name = "Remote vendor tilting" + description = "Lets you remotely tip vendors over in any direction." + cost = 15 + one_purchase = FALSE + power_type = /datum/action/innate/ai/ranged/remote_vendor_tilt + unlock_sound = 'sound/effects/bang.ogg' + unlock_text = span_notice("You gain the ability to remotely tip any vendor onto any adjacent tiles.") + +/datum/action/innate/ai/ranged/remote_vendor_tilt + name = "Remotely tilt vendor" + desc = "Use to remotely tilt a vendor in any direction you desire." + button_icon_state = "vendor_tilt" + ranged_mousepointer = 'icons/effects/mouse_pointers/supplypod_target.dmi' + uses = VENDOR_TIPPING_USES + var/time_to_tilt = MALF_VENDOR_TIPPING_TIME + enable_text = span_notice("You prepare to wobble any vendors you see.") + disable_text = span_notice("You stop focusing on tipping vendors.") + +/datum/action/innate/ai/ranged/remote_vendor_tilt/New() + . = ..() + desc = "[desc] It has [uses] use\s remaining." + +/datum/action/innate/ai/ranged/remote_vendor_tilt/do_ability(mob/living/caller, atom/clicked_on) + + if (!isAI(caller)) + return FALSE + var/mob/living/silicon/ai/ai_caller = caller + + if(ai_caller.incapacitated()) + unset_ranged_ability(caller) + return FALSE + + if(!isvendor(clicked_on)) + clicked_on.balloon_alert(ai_caller, "not a vendor!") + return FALSE + + var/obj/machinery/vending/clicked_vendor = clicked_on + + if (clicked_vendor.tilted) + clicked_vendor.balloon_alert(ai_caller, "already tilted!") + return FALSE + + if (!clicked_vendor.tiltable) + clicked_vendor.balloon_alert(ai_caller, "cannot be tilted!") + return FALSE + + if (!clicked_vendor.is_operational) + clicked_vendor.balloon_alert(ai_caller, "inoperable!") + return FALSE + + var/picked_dir_string = show_radial_menu(ai_caller, clicked_vendor, GLOB.all_radial_directions, custom_check = CALLBACK(src, PROC_REF(radial_check), caller, clicked_vendor)) + if (isnull(picked_dir_string)) + return FALSE + var/picked_dir = text2dir(picked_dir_string) + + var/turf/target = get_step(clicked_vendor, picked_dir) + if (!ai_caller.can_see(target)) + to_chat(ai_caller, span_warning("You can't see the target tile!")) + return FALSE + + new /obj/effect/temp_visual/telegraphing/vending_machine_tilt(target, time_to_tilt) + clicked_vendor.visible_message(span_warning("[clicked_vendor] starts falling over...")) + clicked_vendor.balloon_alert_to_viewers("falling over...") + addtimer(CALLBACK(src, PROC_REF(do_vendor_tilt), clicked_vendor, target), time_to_tilt) + + adjust_uses(-1) + if(uses) + desc = "[initial(desc)] It has [uses] use\s remaining." + build_all_button_icons() + + unset_ranged_ability(caller, span_danger("Tilting...")) + return TRUE + +/datum/action/innate/ai/ranged/remote_vendor_tilt/proc/do_vendor_tilt(obj/machinery/vending/vendor, turf/target) + if (QDELETED(vendor)) + return FALSE + + if (vendor.tilted || !vendor.tiltable) + return FALSE + + vendor.tilt(target, MALF_VENDOR_TIPPING_CRIT_CHANCE) + +/// Used in our radial menu, state-checking proc after the radial menu sleeps +/datum/action/innate/ai/ranged/remote_vendor_tilt/proc/radial_check(mob/living/silicon/ai/caller, obj/machinery/vending/clicked_vendor) + if (QDELETED(caller) || caller.incapacitated() || caller.stat == DEAD) + return FALSE + + if (QDELETED(clicked_vendor)) + return FALSE + + if (uses <= 0) + return FALSE + + if (!caller.can_see(clicked_vendor)) + to_chat(caller, span_warning("Lost sight of [clicked_vendor]!")) + return FALSE + + return TRUE #undef DEFAULT_DOOMSDAY_TIMER #undef DOOMSDAY_ANNOUNCE_INTERVAL + +#undef VENDOR_TIPPING_USES +#undef MALF_VENDOR_TIPPING_TIME +#undef MALF_VENDOR_TIPPING_CRIT_CHANCE + +#undef MALF_AI_ROLL_COOLDOWN +#undef MALF_AI_ROLL_TIME +#undef MALF_AI_ROLL_DAMAGE +#undef MALF_AI_ROLL_CRIT_CHANCE diff --git a/code/modules/antagonists/nightmare/nightmare_equipment.dm b/code/modules/antagonists/nightmare/nightmare_equipment.dm index 57d7917011072..530f39bea6251 100644 --- a/code/modules/antagonists/nightmare/nightmare_equipment.dm +++ b/code/modules/antagonists/nightmare/nightmare_equipment.dm @@ -10,7 +10,8 @@ armour_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 + item_flags = ABSTRACT | DROPDEL + resistance_flags = INDESTRUCTIBLE | ACID_PROOF | FIRE_PROOF | LAVA_PROOF | UNACIDABLE w_class = WEIGHT_CLASS_HUGE sharpness = SHARP_EDGED tool_behaviour = TOOL_MINING diff --git a/code/modules/antagonists/nightmare/nightmare_species.dm b/code/modules/antagonists/nightmare/nightmare_species.dm index 9fc44cb434cbe..3d0df6629ffc3 100644 --- a/code/modules/antagonists/nightmare/nightmare_species.dm +++ b/code/modules/antagonists/nightmare/nightmare_species.dm @@ -5,13 +5,10 @@ name = "Nightmare" id = SPECIES_NIGHTMARE examine_limb_id = SPECIES_SHADOW - burnmod = 1.5 changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE no_equip_flags = ITEM_SLOT_MASK | ITEM_SLOT_OCLOTHING | ITEM_SLOT_GLOVES | ITEM_SLOT_FEET | ITEM_SLOT_ICLOTHING | ITEM_SLOT_SUITSTORE - species_traits = list(NO_UNDERWEAR,NO_DNA_COPY,NOTRANSSTING,NOEYESPRITES) inherent_traits = list( - TRAIT_ADVANCEDTOOLUSER, - TRAIT_CAN_STRIP, + TRAIT_NO_UNDERWEAR, TRAIT_RESISTCOLD, TRAIT_NOBREATH, TRAIT_RESISTHIGHPRESSURE, @@ -22,6 +19,9 @@ TRAIT_NODISMEMBER, TRAIT_NOHUNGER, TRAIT_NOBLOOD, + TRAIT_NO_DNA_COPY, + TRAIT_NODISMEMBER, + TRAIT_NEVER_WOUNDED, ) mutantheart = /obj/item/organ/internal/heart/nightmare diff --git a/code/modules/antagonists/ninja/energy_net_nets.dm b/code/modules/antagonists/ninja/energy_net_nets.dm index ab05eb6230b22..111d1f2651548 100644 --- a/code/modules/antagonists/ninja/energy_net_nets.dm +++ b/code/modules/antagonists/ninja/energy_net_nets.dm @@ -12,34 +12,35 @@ desc = "It's a net made of green energy." icon = 'icons/effects/effects.dmi' icon_state = "energynet" - - density = TRUE//Can't pass through. - opacity = FALSE //Can see through. - mouse_opacity = MOUSE_OPACITY_ICON//So you can hit it with stuff. - anchored = TRUE//Can't drag/grab the net. + density = TRUE //Can't pass through. + anchored = TRUE //Can't drag/grab the net. layer = ABOVE_ALL_MOB_LAYER plane = ABOVE_GAME_PLANE max_integrity = 60 //How much health it has. - can_buckle = 1 + can_buckle = TRUE buckle_lying = 0 buckle_prevents_pull = TRUE - ///The creature currently caught in the net - var/mob/living/affected_mob + +/obj/structure/energy_net/Initialize(mapload) + . = ..() + var/image/underlay = image(icon, "energynet_underlay") + underlay.layer = BELOW_MOB_LAYER + SET_PLANE_EXPLICIT(underlay, GAME_PLANE, src) + add_overlay(underlay) /obj/structure/energy_net/play_attack_sound(damage, damage_type = BRUTE, damage_flag = 0) if(damage_type == BRUTE || damage_type == BURN) playsound(src, 'sound/weapons/slash.ogg', 80, TRUE) -/obj/structure/energy_net/Destroy() - if(!QDELETED(affected_mob)) - affected_mob.visible_message(span_notice("[affected_mob.name] is recovered from the energy net!"), span_notice("You are recovered from the energy net!"), span_hear("You hear a grunt.")) - affected_mob = null +/obj/structure/energy_net/atom_destruction(damage_flag) + for(var/mob/recovered_mob as anything in buckled_mobs) + recovered_mob.visible_message(span_notice("[recovered_mob] is recovered from the energy net!"), span_notice("You are recovered from the energy net!"), span_hear("You hear a grunt.")) return ..() /obj/structure/energy_net/attack_paw(mob/user, list/modifiers) return attack_hand(user, modifiers) -/obj/structure/energy_net/user_buckle_mob(mob/living/M, mob/user, check_loc = TRUE) +/obj/structure/energy_net/user_buckle_mob(mob/living/buckled_mob, mob/user, check_loc = TRUE) return//We only want our target to be buckled /obj/structure/energy_net/user_unbuckle_mob(mob/living/buckled_mob, mob/living/user) diff --git a/code/modules/antagonists/ninja/ninjaDrainAct.dm b/code/modules/antagonists/ninja/ninjaDrainAct.dm index 73fdbb3a4c7c8..7eb827ec2051c 100644 --- a/code/modules/antagonists/ninja/ninjaDrainAct.dm +++ b/code/modules/antagonists/ninja/ninjaDrainAct.dm @@ -133,7 +133,7 @@ /obj/machinery/rnd/server/proc/ninjadrain_charge(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) if(!do_after(ninja, 30 SECONDS, target = src)) return - SSresearch.science_tech.modify_points_all(0) + stored_research.modify_points_all(0) to_chat(ninja, span_notice("Sabotage complete. Research notes corrupted.")) var/datum/antagonist/ninja/ninja_antag = ninja.mind.has_antag_datum(/datum/antagonist/ninja) if(!ninja_antag) @@ -204,7 +204,7 @@ /obj/machinery/door/airlock/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) if(!ninja || !hacking_module) return NONE - if(!operating && density && hasPower() && !(obj_flags & EMAGGED)) + if(!operating && density && hasPower() && !(obj_flags & EMAGGED) && hacking_module.mod.subtract_charge(DEFAULT_CHARGE_DRAIN * 5)) INVOKE_ASYNC(src, TYPE_PROC_REF(/atom, emag_act)) hacking_module.door_hack_counter++ var/datum/antagonist/ninja/ninja_antag = ninja.mind.has_antag_datum(/datum/antagonist/ninja) @@ -318,7 +318,147 @@ //Got that electric touch var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread() spark_system.set_up(5, 0, loc) - playsound(src, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + spark_system.start() visible_message(span_danger("[ninja] electrocutes [src] with [ninja.p_their()] touch!"), span_userdanger("[ninja] electrocutes you with [ninja.p_their()] touch!")) - Knockdown(3 SECONDS) + addtimer(CALLBACK(src, PROC_REF(ninja_knockdown)), 0.3 SECONDS) return NONE + +/mob/living/carbon/proc/ninja_knockdown() + Knockdown(3 SECONDS) + set_jitter_if_lower(3 SECONDS) + +//CAMERAS// +/obj/machinery/camera/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) + if(isEmpProof(TRUE)) + balloon_alert(ninja, "camera is shielded!") + return COMPONENT_CANCEL_ATTACK_CHAIN + + if(!hacking_module.mod.subtract_charge(DEFAULT_CHARGE_DRAIN * 5)) + return + + emp_act(EMP_HEAVY) + return COMPONENT_CANCEL_ATTACK_CHAIN + +//BOTS// +/mob/living/simple_animal/bot/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) + to_chat(src, span_boldwarning("Your circutry suddenly begins heating up!")) + if(!do_after(ninja, 1.5 SECONDS, target = src)) + return COMPONENT_CANCEL_ATTACK_CHAIN + + if(!hacking_module.mod.subtract_charge(DEFAULT_CHARGE_DRAIN * 7)) + return COMPONENT_CANCEL_ATTACK_CHAIN + + do_sparks(number = 3, cardinal_only = FALSE, source = src) + playsound(get_turf(src), 'sound/machines/warning-buzzer.ogg', 35, TRUE) + balloon_alert(ninja, "stand back!") + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), src, 0, 1, 2, 3), 2.5 SECONDS) + return COMPONENT_CANCEL_ATTACK_CHAIN + +/mob/living/simple_animal/bot/medbot/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) + var/static/list/death_cry = list( + MEDIBOT_VOICED_NO_SAD, + MEDIBOT_VOICED_OH_FUCK, + ) + speak(pick(death_cry)) + return ..() + +//ENERGY WEAPONS// +/obj/item/gun/energy/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) + if(cell.charge == 0) + balloon_alert(ninja, "no energy!") + return COMPONENT_CANCEL_ATTACK_CHAIN + + if(!do_after(ninja, 1.5 SECONDS, target = src)) + return COMPONENT_CANCEL_ATTACK_CHAIN + + hacking_module.mod.add_charge(cell.charge) + hacking_module.charge_message(src, cell.charge) + cell.charge = 0 + update_appearance() + visible_message(span_warning("[ninja] drains the energy from the [src]!")) + do_sparks(number = 3, cardinal_only = FALSE, source = src) + return COMPONENT_CANCEL_ATTACK_CHAIN + +//VENDING MACHINES// +/obj/machinery/vending/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) + if(shoot_inventory) + balloon_alert(ninja, "already hacked!") + return COMPONENT_CANCEL_ATTACK_CHAIN + + if(!do_after(ninja, 2 SECONDS, target = src)) + return COMPONENT_CANCEL_ATTACK_CHAIN + + if(!hacking_module.mod.subtract_charge(DEFAULT_CHARGE_DRAIN * 5)) + return COMPONENT_CANCEL_ATTACK_CHAIN + + do_sparks(number = 3, cardinal_only = FALSE, source = src) + balloon_alert(ninja, "system overloaded!") + wires.on_pulse(WIRE_THROW) + return COMPONENT_CANCEL_ATTACK_CHAIN + +//RECYCLER// +/obj/machinery/recycler/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) + if(obj_flags & EMAGGED) + balloon_alert(ninja, "already hacked!") + return COMPONENT_CANCEL_ATTACK_CHAIN + + AI_notify_hack() + if(!do_after(ninja, 30 SECONDS, target = src)) + return COMPONENT_CANCEL_ATTACK_CHAIN + + do_sparks(3, cardinal_only = FALSE, source = src) + emag_act(ninja) + + return COMPONENT_CANCEL_ATTACK_CHAIN + +//ELEVATOR CONTROLS// +/obj/machinery/elevator_control_panel/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) + if(obj_flags & EMAGGED) + balloon_alert(ninja, "already hacked!") + return COMPONENT_CANCEL_ATTACK_CHAIN + + if(!do_after(ninja, 2 SECONDS, target = src)) + return COMPONENT_CANCEL_ATTACK_CHAIN + + do_sparks(3, cardinal_only = FALSE, source = src) + emag_act(ninja) + + return COMPONENT_CANCEL_ATTACK_CHAIN + +//TRAM CONTROLS// +/obj/machinery/computer/tram_controls/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) + var/datum/round_event/tram_malfunction/malfunction_event = locate(/datum/round_event/tram_malfunction) in SSevents.running + if(malfunction_event) + balloon_alert(ninja, "tram is already malfunctioning!") + return COMPONENT_CANCEL_ATTACK_CHAIN + + if(specific_lift_id != MAIN_STATION_TRAM) + balloon_alert(ninja, "cannot hack this tram!") + return COMPONENT_CANCEL_ATTACK_CHAIN + + AI_notify_hack() + + if(!do_after(ninja, 20 SECONDS, target = src)) //Shorter due to how incredibly easy it is for someone to (even accidentally) interrupt. + return COMPONENT_CANCEL_ATTACK_CHAIN + + force_event(/datum/round_event_control/tram_malfunction, "ninja interference") + malfunction_event = locate(/datum/round_event/tram_malfunction) in SSevents.running + malfunction_event.end_when *= 3 + + return COMPONENT_CANCEL_ATTACK_CHAIN + +//WINDOOR// +/obj/machinery/door/window/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) + if(!operating && density && hasPower() && !(obj_flags & EMAGGED) && hacking_module.mod.subtract_charge(DEFAULT_CHARGE_DRAIN * 5)) + INVOKE_ASYNC(src, TYPE_PROC_REF(/atom, emag_act)) + return COMPONENT_CANCEL_ATTACK_CHAIN + +//BUTTONS// +/obj/machinery/button/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) + if(is_operational && !(obj_flags & EMAGGED)) + emag_act(ninja) + return COMPONENT_CANCEL_ATTACK_CHAIN + +//FIRELOCKS// +/obj/machinery/door/firedoor/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) + crack_open() diff --git a/code/modules/antagonists/ninja/ninja_explosive.dm b/code/modules/antagonists/ninja/ninja_explosive.dm index 68241ce77696b..4c014da186320 100644 --- a/code/modules/antagonists/ninja/ninja_explosive.dm +++ b/code/modules/antagonists/ninja/ninja_explosive.dm @@ -1,14 +1,14 @@ /** * # Spider Charge * - * A unique version of c4 possessed only by the space ninja. Has a stronger blast radius. - * Can only be detonated by space ninjas with the bombing objective. Can only be set up where the objective says it can. + * A unique version of c4 possessed only by the space ninja. Has a stronger blast radius. + * Can only be detonated by space ninjas with the bombing objective. Can only be set up where the objective says it can. * When it primes, the space ninja responsible will have their objective set to complete. * */ /obj/item/grenade/c4/ninja name = "spider charge" - desc = "A modified C-4 charge supplied to you by the Spider Clan. Its explosive power has been juiced up, but only works in one specific area." + desc = "A modified C-4 charge supplied by the Spider Clan. It has great explosive power, but is keyed to only work in one specific area." icon_state = "ninja-explosive0" inhand_icon_state = "ninja-explosive" boom_sizes = list(4, 8, 12) @@ -22,6 +22,15 @@ detonation_area = null return ..() +/obj/item/grenade/c4/ninja/examine(mob/user) + . = ..() + if (!IS_SPACE_NINJA(user)) + return + if (isnull(detonation_area)) + . += span_notice("This one was provided with no destination set, and cannot be used.") + else + . += span_notice("This device will only function in [detonation_area].") + /** * set_detonation_area * @@ -38,9 +47,9 @@ return detonation_area = objective.detonation_location -/obj/item/grenade/c4/ninja/afterattack(atom/movable/AM, mob/ninja, flag) +/obj/item/grenade/c4/ninja/afterattack(atom/movable/target, mob/ninja, flag) if(!IS_SPACE_NINJA(ninja)) - to_chat(ninja, span_notice("While it appears normal, you can't seem to detonate the charge.")) + say("Access denied.") return . |= AFTERATTACK_PROCESSED_ITEM if (!check_loc(ninja)) @@ -57,7 +66,7 @@ qdel(src) return //Since we already did the checks in afterattack, the denonator must be a ninja with the bomb objective. - if(!detonator) + if(isnull(detonator)) return var/mob/ninja = detonator.resolve() . = ..() @@ -67,7 +76,7 @@ return var/datum/antagonist/ninja/ninja_antag = ninja.mind.has_antag_datum(/datum/antagonist/ninja) var/datum/objective/plant_explosive/objective = locate() in ninja_antag.objectives - objective.completed = TRUE + objective?.completed = TRUE /** * check_loc @@ -78,11 +87,11 @@ * * mob/user - The planter of the c4 */ /obj/item/grenade/c4/ninja/proc/check_loc(mob/user) - if(!detonation_area) - to_chat(user, span_notice("You can't seem to activate the charge. It's location-locked, but you don't know where to detonate it.")) + if(isnull(detonation_area)) + balloon_alert(user, "no location set!") return FALSE if((get_area(target) != detonation_area) && (get_area(src) != detonation_area)) if (!active) - to_chat(user, span_notice("This isn't the location you're supposed to use this!")) + balloon_alert(user, "wrong location!") return FALSE return TRUE diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm b/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm index 965eda0784f4f..6372b402cab67 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm @@ -1,5 +1,5 @@ /obj/item/disk - icon = 'icons/obj/module.dmi' + icon = 'icons/obj/assemblies/module.dmi' w_class = WEIGHT_CLASS_TINY inhand_icon_state = "card-id" lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' @@ -69,7 +69,7 @@ if(!fake) return - if(isobserver(user) || HAS_TRAIT(user, TRAIT_DISK_VERIFIER) || (user.mind && HAS_TRAIT(user.mind, TRAIT_DISK_VERIFIER))) + if(isobserver(user) || HAS_MIND_TRAIT(user, TRAIT_DISK_VERIFIER)) . += span_warning("The serial numbers on [src] are incorrect.") /* diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm index db8c79f07fe9f..77f3bd566900d 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm @@ -57,7 +57,6 @@ GLOBAL_VAR(station_nuke_source) /obj/machinery/nuclearbomb/Initialize(mapload) . = ..() countdown = new(src) - GLOB.nuke_list += src core = new /obj/item/nuke_core(src) STOP_PROCESSING(SSobj, core) update_appearance() @@ -69,7 +68,6 @@ GLOBAL_VAR(station_nuke_source) if(!exploding) // If we're not exploding, set the alert level back to normal toggle_nuke_safety() - GLOB.nuke_list -= src QDEL_NULL(countdown) QDEL_NULL(core) return ..() @@ -116,7 +114,7 @@ GLOBAL_VAR(station_nuke_source) if(!weapon.tool_start_check(user, amount = 1)) return TRUE to_chat(user, span_notice("You start cutting [src]'s inner plate...")) - if(weapon.use_tool(src, user, 8 SECONDS, volume=100, amount=1)) + if(weapon.use_tool(src, user, 8 SECONDS, volume=100)) to_chat(user, span_notice("You cut [src]'s inner plate.")) deconstruction_state = NUKESTATE_WELDED update_appearance() @@ -461,6 +459,12 @@ GLOBAL_VAR(station_nuke_source) countdown.start() SSsecurity_level.set_level(SEC_LEVEL_DELTA) + notify_ghosts( + "A nuclear device has been armed in [get_area_name(src)]!", + source = src, + header = "Nuke Armed", + action = NOTIFY_ORBIT, + ) update_appearance() /// Disarms the nuke, reverting all pinpointers and the security level @@ -518,6 +522,8 @@ GLOBAL_VAR(station_nuke_source) update_appearance() sound_to_playing_players('sound/machines/alarm.ogg') + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_NUKE_DEVICE_DETONATING, src) + if(SSticker?.mode) SSticker.roundend_check_paused = TRUE addtimer(CALLBACK(src, PROC_REF(actually_explode)), 10 SECONDS) @@ -621,6 +627,9 @@ GLOBAL_VAR(station_nuke_source) * Helper proc that handles gibbing someone who has been nuked. */ /proc/nuke_gib(mob/living/gibbed, atom/source) + if(HAS_TRAIT(gibbed, TRAIT_NUKEIMMUNE)) + return FALSE + if(istype(gibbed.loc, /obj/structure/closet/secure_closet/freezer)) var/obj/structure/closet/secure_closet/freezer/freezer = gibbed.loc if(!freezer.jones) @@ -634,7 +643,7 @@ GLOBAL_VAR(station_nuke_source) to_chat(gibbed, span_userdanger("You are shredded to atoms by [source]!")) gibbed.investigate_log("has been gibbed by a nuclear blast.", INVESTIGATE_DEATHS) - gibbed.gib() + gibbed.gib(DROP_ALL_REMAINS) return TRUE /** diff --git a/code/modules/antagonists/nukeop/equipment/pinpointer.dm b/code/modules/antagonists/nukeop/equipment/pinpointer.dm index 3e9b1511a2340..7f7722cc53d02 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 as anything in GLOB.nuke_list) + for(var/obj/machinery/nuclearbomb/bomb as anything in SSmachines.get_machines_by_type_and_subtypes(/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 SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/nuclearbomb)) if(!bomb.timing) continue alert = TRUE @@ -44,10 +44,9 @@ 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 - if(A.malfhack && A.occupier) - target = A + for(var/obj/machinery/power/apc/apc as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/apc)) + if(apc.malfhack && apc.occupier) + target = apc if(TRACK_INFILTRATOR) target = SSshuttle.getShuttle("syndicate") ..() diff --git a/code/modules/antagonists/nukeop/nukeop.dm b/code/modules/antagonists/nukeop/nukeop.dm index fc8f089c606e9..88d7b6911300c 100644 --- a/code/modules/antagonists/nukeop/nukeop.dm +++ b/code/modules/antagonists/nukeop/nukeop.dm @@ -8,9 +8,13 @@ show_to_ghosts = TRUE hijack_speed = 2 //If you can't take out the station, take the shuttle instead. suicide_cry = "FOR THE SYNDICATE!!" + /// Which nukie team are we on? 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. + /// If not assigned a team by default ops will try to join existing ones, set this to TRUE to always create new team. + var/always_new_team = FALSE + /// Should the user be moved to default spawnpoint after being granted this datum. + var/send_to_spawnpoint = TRUE + /// The DEFAULT outfit we will give to players granted this datum var/nukeop_outfit = /datum/outfit/syndicate preview_outfit = /datum/outfit/nuclear_operative_elite @@ -35,9 +39,12 @@ if(!nukeop_outfit) // this variable is null in instances where an antagonist datum is granted via enslaving the mind (/datum/mind/proc/enslave_mind_to_creator), like in golems. return - operative.set_species(/datum/species/human) //Plasmamen burn up otherwise, and besides, all other species are vulnerable to asimov AIs. Let's standardize all operatives being human. + // If our nuke_ops_species pref is set to TRUE, (or we have no client) make us a human + if(isnull(operative.client) || operative.client.prefs.read_preference(/datum/preference/toggle/nuke_ops_species)) + operative.set_species(/datum/species/human) + + operative.equip_species_outfit(nukeop_outfit) - operative.equipOutfit(nukeop_outfit) return TRUE /datum/antagonist/nukeop/greet() @@ -82,14 +89,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 SSmachines.get_machines_by_type(/obj/machinery/nuclearbomb/syndicate) if(nuke) nuke_team.tracked_nuke = nuke if(nuke.r_code == NUKE_CODE_UNSET) 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 as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/nuclearbomb/beer)) beernuke.r_code = nuke_team.memorized_code else stack_trace("Syndicate nuke not found during nuke team creation.") @@ -173,7 +180,7 @@ /datum/antagonist/nukeop/proc/admin_tell_code(mob/admin) var/code - for (var/obj/machinery/nuclearbomb/bombue as anything in GLOB.nuke_list) + for (var/obj/machinery/nuclearbomb/bombue as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/nuclearbomb)) if (length(bombue.r_code) <= 5 && bombue.r_code != initial(bombue.r_code)) code = bombue.r_code break @@ -234,7 +241,9 @@ name = "Nuclear Operative Leader" nukeop_outfit = /datum/outfit/syndicate/leader always_new_team = TRUE + /// Randomly chosen honorific, for distinction var/title + /// The nuclear challenge remote we will spawn this player with. var/challengeitem = /obj/item/nuclear_challenge /datum/antagonist/nukeop/leader/memorize_code() @@ -314,7 +323,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 SSmachines.get_machines_by_type(/obj/machinery/nuclearbomb/selfdestruct) if(nuke) nuke_team.tracked_nuke = nuke if(nuke.r_code == NUKE_CODE_UNSET) diff --git a/code/modules/antagonists/nukeop/outfits.dm b/code/modules/antagonists/nukeop/outfits.dm index 4b8560dc9186a..a3c97a764688b 100644 --- a/code/modules/antagonists/nukeop/outfits.dm +++ b/code/modules/antagonists/nukeop/outfits.dm @@ -13,18 +13,33 @@ skillchips = list(/obj/item/skillchip/disk_verifier) box = /obj/item/storage/box/survival/syndie + /// Amount of TC to automatically store in this outfit's uplink. var/tc = 25 + /// Enables big voice on this outfit's headset, used for nukie leaders. var/command_radio = FALSE + /// The type of uplink to be given on equip. var/uplink_type = /obj/item/uplink/nuclear id_trim = /datum/id_trim/chameleon/operative +/datum/outfit/syndicate/plasmaman + name = "Syndicate Operative - Basic (Plasmaman)" + head = /obj/item/clothing/head/helmet/space/plasmaman/syndie + uniform = /obj/item/clothing/under/plasmaman/syndicate + r_hand = /obj/item/tank/internals/plasmaman/belt/full + /datum/outfit/syndicate/leader name = "Syndicate Leader - Basic" command_radio = TRUE id_trim = /datum/id_trim/chameleon/operative/nuke_leader +/datum/outfit/syndicate/leader/plasmaman + name = "Syndicate Leader - Basic (Plasmaman)" + head = /obj/item/clothing/head/helmet/space/plasmaman/syndie + uniform = /obj/item/clothing/under/plasmaman/syndicate + r_hand = /obj/item/tank/internals/plasmaman/belt/full + /datum/outfit/syndicate/post_equip(mob/living/carbon/human/nukie, visualsOnly = FALSE) if(visualsOnly) return @@ -40,7 +55,7 @@ if(ispath(uplink_type, /obj/item/uplink/nuclear) || tc) // /obj/item/uplink/nuclear understands 0 tc var/obj/item/uplink = new uplink_type(nukie, nukie.key, tc) - nukie.equip_to_slot_or_del(uplink, ITEM_SLOT_BACKPACK) + nukie.equip_to_slot_or_del(uplink, ITEM_SLOT_BACKPACK, indirect_action = TRUE) var/obj/item/implant/weapons_auth/weapons_implant = new/obj/item/implant/weapons_auth(nukie) weapons_implant.implant(nukie) @@ -64,6 +79,17 @@ /obj/item/pen/edagger = 1, ) +/datum/outfit/syndicate/full/plasmaman + name = "Syndicate Operative - Full Kit (Plasmaman)" + back = /obj/item/mod/control/pre_equipped/nuclear/plasmaman + uniform = /obj/item/clothing/under/plasmaman/syndicate + r_pocket = /obj/item/tank/internals/plasmaman/belt/full + mask = null + +/datum/outfit/syndicate/full/plasmaman/New() + backpack_contents += /obj/item/clothing/head/helmet/space/plasmaman/syndie + return ..() + /datum/outfit/syndicate/reinforcement name = "Syndicate Operative - Reinforcement" tc = 0 @@ -80,6 +106,13 @@ to_chat(H, span_notice("You're an agent of [faction], sent to accompany the nuclear squad on their mission. \ Support your allies, and remember: Down with Nanotrasen.")) +/datum/outfit/syndicate/reinforcement/plasmaman + name = "Syndicate Operative - Reinforcement (Plasmaman)" + head = /obj/item/clothing/head/helmet/space/plasmaman/syndie + uniform = /obj/item/clothing/under/plasmaman/syndicate + r_hand = /obj/item/tank/internals/plasmaman/belt/full + tc = 0 + /datum/outfit/syndicate/reinforcement/gorlex name = "Syndicate Operative - Gorlex Reinforcement" suit = /obj/item/clothing/suit/armor/vest/alt diff --git a/code/modules/antagonists/obsessed/obsessed.dm b/code/modules/antagonists/obsessed/obsessed.dm index 585867d5767b7..7c921fdd22856 100644 --- a/code/modules/antagonists/obsessed/obsessed.dm +++ b/code/modules/antagonists/obsessed/obsessed.dm @@ -10,6 +10,7 @@ silent = TRUE //not actually silent, because greet will be called by the trauma anyway. suicide_cry = "FOR MY LOVE!!" preview_outfit = /datum/outfit/obsessed + hardcore_random_bonus = TRUE var/datum/brain_trauma/special/obsessed/trauma /datum/antagonist/obsessed/admin_add(datum/mind/new_owner,mob/admin) @@ -36,9 +37,8 @@ /datum/antagonist/obsessed/get_preview_icon() var/mob/living/carbon/human/dummy/consistent/victim_dummy = new - victim_dummy.hair_color = "#bb9966" // Brown - victim_dummy.hairstyle = "Messy" - victim_dummy.update_body_parts() + victim_dummy.set_haircolor("#bb9966", update = FALSE) + victim_dummy.set_hairstyle("Messy", update = TRUE) var/icon/obsessed_icon = render_preview_outfit(preview_outfit) obsessed_icon.Blend(icon('icons/effects/blood.dmi', "uniformblood"), ICON_OVERLAY) @@ -64,7 +64,7 @@ suit = /obj/item/clothing/suit/apron /datum/outfit/obsessed/post_equip(mob/living/carbon/human/H) - for(var/obj/item/carried_item in H.get_equipped_items(TRUE)) + for(var/obj/item/carried_item in H.get_equipped_items(include_pockets = TRUE, include_accessories = TRUE)) carried_item.add_mob_blood(H)//Oh yes, there will be blood... H.regenerate_icons() diff --git a/code/modules/antagonists/pirate/pirate.dm b/code/modules/antagonists/pirate/pirate.dm index 31639b3688e51..15a028b24d740 100644 --- a/code/modules/antagonists/pirate/pirate.dm +++ b/code/modules/antagonists/pirate/pirate.dm @@ -43,12 +43,12 @@ . = ..() 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.grant_language(/datum/language/piratespeak, source = 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) + owner_mob.remove_language(/datum/language/piratespeak, source = LANGUAGE_PIRATE) return ..() /datum/team/pirate @@ -57,7 +57,7 @@ /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) + for(var/obj/machinery/computer/piratepad_control/P as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/computer/piratepad_control)) var/area/A = get_area(P) if(istype(A,/area/shuttle/pirate)) getbooty.cargo_hold = P diff --git a/code/modules/antagonists/pirate/pirate_event.dm b/code/modules/antagonists/pirate/pirate_event.dm index c516d86c4e356..60be511b6ca79 100644 --- a/code/modules/antagonists/pirate/pirate_event.dm +++ b/code/modules/antagonists/pirate/pirate_event.dm @@ -59,7 +59,7 @@ if(chosen_gang.paid_off) return - var/list/candidates = poll_ghost_candidates("Do you wish to be considered for pirate crew?", ROLE_TRAITOR) + var/list/candidates = poll_ghost_candidates("Do you wish to be considered for a pirate crew of [chosen_gang.name]?", ROLE_TRAITOR) shuffle_inplace(candidates) var/template_key = "pirate_[chosen_gang.ship_template_id]" @@ -80,9 +80,9 @@ var/mob/our_candidate = candidates[1] var/mob/spawned_mob = spawner.create_from_ghost(our_candidate) candidates -= our_candidate - notify_ghosts("The pirate ship has an object of interest: [spawned_mob]!", source = spawned_mob, action = NOTIFY_ORBIT, header="Pirates!") + notify_ghosts("The [chosen_gang.ship_name] has an object of interest: [spawned_mob]!", source = spawned_mob, action = NOTIFY_ORBIT, header="Pirates!") else - notify_ghosts("The pirate ship has an object of interest: [spawner]!", source = spawner, action = NOTIFY_ORBIT, header="Pirate Spawn Here!") + notify_ghosts("The [chosen_gang.ship_name] has an object of interest: [spawner]!", source = spawner, action = NOTIFY_ORBIT, header="Pirate Spawn Here!") priority_announce(chosen_gang.arrival_announcement, sender_override = chosen_gang.ship_name) diff --git a/code/modules/antagonists/pirate/pirate_gangs.dm b/code/modules/antagonists/pirate/pirate_gangs.dm index d4e9755c3256c..8011150f9504a 100644 --- a/code/modules/antagonists/pirate/pirate_gangs.dm +++ b/code/modules/antagonists/pirate/pirate_gangs.dm @@ -118,10 +118,10 @@ GLOBAL_LIST_INIT(heavy_pirate_gangs, init_pirate_gangs(is_heavy = TRUE)) ///Expirienced formed employes of Interdyne Pharmaceutics now in a path of thievery and reckoning /datum/pirate_gang/interdyne - name = "Expharmacist Unrest" + name = "Restless Ex-Pharmacists" is_heavy_threat = TRUE - ship_template_id = "interdyne" + ship_template_id = "ex_interdyne" ship_name_pool = "interdyne_names" threat_title = "Funding for Research" @@ -150,3 +150,43 @@ GLOBAL_LIST_INIT(heavy_pirate_gangs, init_pirate_gangs(is_heavy = TRUE)) response_received = "Wait, you ACTUALLY gave us the money? Thanks, but we're coming for the rest anyways!" response_too_late = "Nothing, huh? Looks like the Tide's coming aboard!" response_not_enough = "You trying to cheat us? That's fine, we'll take your station as collateral." + +///Agents from the space I.R.S. heavily armed to stea- I mean, collect the station's tax dues +/datum/pirate_gang/irs + name = "Space IRS Agents" + + is_heavy_threat = TRUE + ship_template_id = "irs" + ship_name_pool = "irs_names" + + threat_title = "Missing Tax Dues" + threat_content = "%SHIPNAME Here, We noticed that your station hasn't been paying your taxes.. \ + Let's rectify that, Your missing tax dues amounts to %PAYOFF \ + We highly recommend paying your taxes stat, \ + we don't need to send a team to your station to resolve the situation do we?" + arrival_announcement = "This is the tax conflict resolution team, prepare for your assets to be liquidated and be charged with tax fraud, \ + if you fail to pay your taxes in time." + possible_answers = list("You know, I was just about to pay that. Thanks for the reminder!","I don't care WHO the IRS sends, I'm not paying for my taxes!") + + response_received = "Payment received, We salute you for being law-abiding tax-paying citizens" + response_too_late = "Too late, A team has already been sent out resolve this matter directly." + response_not_enough = "You filed your taxes incorrectly, A team has been sent to assist in liquidating assets and arrest you for tax fraud. \ + Nothing personel kid." + +//Mutated Ethereals who have adopted bluespace technology in all the wrong ways. +/datum/pirate_gang/lustrous + name = "Geode Scavengers" + + ship_template_id = "geode" + ship_name_pool = "geode_names" + + threat_title = "Unusual transmission" + threat_content = "The crystal of mother-void cracks, and forth comes the %SHIPNAME. We are the Lustrous, the hands of the crystal king.\ + Our coffers of bluespace dust are low, ergo, our synthesis ceases. %PAYOFF credits shall remedy this!" + arrival_announcement = "We have arrived, we have always been here, and we have already left." + possible_answers = list("Uh, ok? Sure."," We don't have time for crazy-talk, go away.") + + + response_received = "An excellent haul, the synthesis shall resume." + response_too_late = "You were not ready then, and now that time has passed. We can only go forward, never back." + response_not_enough = "You have insulted us, but there shall be no feud, only swift justice!" diff --git a/code/modules/antagonists/pirate/pirate_outfits.dm b/code/modules/antagonists/pirate/pirate_outfits.dm index 77196fe60f17b..4c73cac107f12 100644 --- a/code/modules/antagonists/pirate/pirate_outfits.dm +++ b/code/modules/antagonists/pirate/pirate_outfits.dm @@ -8,7 +8,7 @@ ears = /obj/item/radio/headset/syndicate glasses = /obj/item/clothing/glasses/eyepatch head = /obj/item/clothing/head/costume/pirate/bandana/armored - shoes = /obj/item/clothing/shoes/sneakers/brown + shoes = /obj/item/clothing/shoes/pirate/armored /datum/outfit/pirate/post_equip(mob/living/carbon/human/equipped) equipped.faction |= FACTION_PIRATE @@ -36,6 +36,12 @@ id_trim = /datum/id_trim/pirate/captain head = /obj/item/clothing/head/costume/pirate/armored +/datum/outfit/pirate/captain/skeleton + name = "Space Pirate Captain (Skeleton)" + + belt = /obj/item/gun/magic/midas_hand + l_pocket = /obj/item/coin/gold/doubloon + /datum/outfit/pirate/space name = "Space Pirate (EVA)" @@ -101,3 +107,44 @@ shoes = /obj/item/clothing/shoes/sneakers/black l_pocket = /obj/item/reagent_containers/cup/glass/coffee r_pocket = /obj/item/tank/internals/emergency_oxygen + +/datum/outfit/pirate/irs + name = "IRS Agent Outfit" + id = /obj/item/card/id/advanced + id_trim = /datum/id_trim/syndicom/irs + uniform = /obj/item/clothing/under/costume/buttondown/slacks + suit = /obj/item/clothing/suit/costume/irs + back = null + glasses = /obj/item/clothing/glasses/sunglasses + gloves = null + head = /obj/item/clothing/head/costume/irs + shoes = /obj/item/clothing/shoes/laceup + ears = /obj/item/radio/headset/syndicate/alt + +/datum/outfit/pirate/irs/auditor + name = "IRS Head Auditor" + id_trim = /datum/id_trim/syndicom/irs/auditor + uniform = /obj/item/clothing/under/suit/charcoal + neck = /obj/item/clothing/neck/tie/red/tied + suit = null + ears = /obj/item/radio/headset/syndicate/alt/leader + head = null + belt = /obj/item/storage/belt/holster/detective/full/ert + +/datum/outfit/pirate/lustrous + name = "Lustrous Scintillant" + + id = /obj/item/card/id/advanced/black + uniform = /obj/item/clothing/under/ethereal_tunic + suit = /obj/item/clothing/suit/hooded/ethereal_raincoat + back = /obj/item/storage/backpack/satchel + gloves = /obj/item/clothing/gloves/combat + shoes = /obj/item/clothing/shoes/bhop + l_pocket = /obj/item/switchblade + +/datum/outfit/pirate/lustrous/captain + name = "Lustrous Radiant" + + glasses = null + suit = /obj/item/clothing/suit/jacket/oversized + head = /obj/item/clothing/head/costume/crown diff --git a/code/modules/antagonists/pirate/pirate_roles.dm b/code/modules/antagonists/pirate/pirate_roles.dm index ceb517a095478..64baa724db1ec 100644 --- a/code/modules/antagonists/pirate/pirate_roles.dm +++ b/code/modules/antagonists/pirate/pirate_roles.dm @@ -61,7 +61,7 @@ /obj/effect/mob_spawn/ghost_role/human/pirate/skeleton/captain rank = "Captain" - outfit = /datum/outfit/pirate/captain + outfit = /datum/outfit/pirate/captain/skeleton /obj/effect/mob_spawn/ghost_role/human/pirate/skeleton/gunner rank = "Gunner" @@ -107,6 +107,18 @@ outfit = /datum/outfit/pirate/interdyne rank = "Pharmacist" +/obj/effect/mob_spawn/ghost_role/human/pirate/interdyne/generate_pirate_name(spawn_gender) + var/first_name + switch(spawn_gender) + if(MALE) + first_name = pick(GLOB.first_names_male) + if(FEMALE) + first_name = pick(GLOB.first_names_female) + else + first_name = pick(GLOB.first_names) + + return "[rank] [first_name]" + /obj/effect/mob_spawn/ghost_role/human/pirate/interdyne/senior rank = "Pharmacist Director" outfit = /datum/outfit/pirate/interdyne/captain @@ -128,3 +140,54 @@ /obj/effect/mob_spawn/ghost_role/human/pirate/grey/shitter rank = "Tidemaster" + +/obj/effect/mob_spawn/ghost_role/human/pirate/irs + name = "\improper Space IRS sleeper" + desc = "A surprisingly clean cryogenic sleeper. You can see your reflection on the sides!" + density = FALSE + you_are_text = "You are an agent working for the space IRS" + flavour_text = "Not even in the expanse of the expanding universe can someone evade the tax man! Whether you are just a well disciplined and professional pirate gang or an actual agent from a local polity. You will squeeze the station dry of it's income regardless! Through peaceful means or otherwise..." + icon = 'icons/obj/machines/sleeper.dmi' + icon_state = "sleeper" + prompt_name = "An agent of the space IRS" + outfit = /datum/outfit/pirate/irs + fluff_spawn = null // dirs are fucked and I don't have the energy to deal with it + rank = "Agent" + +/obj/effect/mob_spawn/ghost_role/human/pirate/irs/generate_pirate_name(spawn_gender) + var/first_name + switch(spawn_gender) + if(MALE) + first_name = pick(GLOB.first_names_male) + if(FEMALE) + first_name = pick(GLOB.first_names_female) + else + first_name = pick(GLOB.first_names) + + return "[rank] [first_name]" + + +/obj/effect/mob_spawn/ghost_role/human/pirate/irs/auditor + rank = "Head Auditor" + outfit = /datum/outfit/pirate/irs/auditor + +/obj/effect/mob_spawn/ghost_role/human/pirate/lustrous + name = "lustrous crystal" + desc = "A crystal housing a mutated Ethereal, it emanates a foreboding glow." + density = FALSE + you_are_text = "Once you were a proud Ethereal, now all that remains is your hunger for the precious bluespace crystal." + flavour_text = "The station has denied you your bluespace crystals, the sweet ambrosia of the fifth-dimension. Strike the earth!" + icon = 'icons/mob/effects/ethereal_crystal.dmi' + icon_state = "ethereal_crystal" + fluff_spawn = null + prompt_name = "a geode dweller" + mob_species = /datum/species/ethereal/lustrous + outfit = /datum/outfit/pirate/lustrous + rank = "Scintillant" + +/obj/effect/mob_spawn/ghost_role/human/pirate/lustrous/captain + rank = "Radiant" + outfit = /datum/outfit/pirate/lustrous/captain + +/obj/effect/mob_spawn/ghost_role/human/pirate/lustrous/gunner + rank = "Coruscant" diff --git a/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm b/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm index 82b1c3a611f2b..57eb95a978c52 100644 --- a/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm +++ b/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm @@ -55,7 +55,8 @@ /// Handles interrupting research /obj/machinery/shuttle_scrambler/proc/interrupt_research() - for(var/obj/machinery/rnd/server/research_server as anything in SSresearch.science_tech.techweb_servers) + var/datum/techweb/science_web = locate(/datum/techweb/science) in SSresearch.techwebs + for(var/obj/machinery/rnd/server/research_server as anything in science_web.techweb_servers) if(research_server.machine_stat & (NOPOWER|BROKEN|EMPED)) continue research_server.emp_act(EMP_LIGHT) @@ -123,20 +124,21 @@ icon = 'icons/obj/machines/research.dmi' icon_state = "tdoppler" density = TRUE - var/cooldown = 300 - var/next_use = 0 + /// Cooldown on locating booty. + COOLDOWN_DECLARE(locate_cooldown) /obj/machinery/loot_locator/interact(mob/user) - if(world.time <= next_use) - to_chat(user,span_warning("[src] is recharging.")) + if(!COOLDOWN_FINISHED(src, locate_cooldown)) + balloon_alert_to_viewers("locator recharging!", vision_distance = 3) return - next_use = world.time + cooldown var/atom/movable/found_loot = find_random_loot() if(!found_loot) say("No valuables located. Try again later.") else say("Located: [found_loot.name] at [get_area_name(found_loot)]") + COOLDOWN_START(src, locate_cooldown, 10 SECONDS) + /// Looks across the station for items that are pirate specific exports /obj/machinery/loot_locator/proc/find_random_loot() if(!GLOB.exports_list.len) @@ -151,10 +153,23 @@ found_loot = selected_export.find_loot() return found_loot +/// Surgery disk for the space IRS (I don't know where to dump them anywhere else) +/obj/item/disk/surgery/irs + 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, + /datum/surgery_step/heal/combo/upgraded, + /datum/surgery_step/pacify, + /datum/surgery_step/revive, + ) + //Pad & Pad Terminal /obj/machinery/piratepad name = "cargo hold pad" - icon = 'icons/obj/telescience.dmi' + icon = 'icons/obj/machines/telepad.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" @@ -168,8 +183,8 @@ /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 + I.set_buffer(src) + balloon_alert(user, "saved to multitool buffer") return TRUE /obj/machinery/piratepad/screwdriver_act_secondary(mob/living/user, obj/item/screwdriver/screw) @@ -217,7 +232,7 @@ /obj/machinery/computer/piratepad_control/LateInitialize() . = ..() if(cargo_hold_id) - for(var/obj/machinery/piratepad/P in GLOB.machines) + for(var/obj/machinery/piratepad/P as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/piratepad)) if(P.cargo_hold_id == cargo_hold_id) pad_ref = WEAKREF(P) return diff --git a/code/modules/antagonists/revenant/haunted_item.dm b/code/modules/antagonists/revenant/haunted_item.dm index 8973139f51e78..d035e2694d927 100644 --- a/code/modules/antagonists/revenant/haunted_item.dm +++ b/code/modules/antagonists/revenant/haunted_item.dm @@ -34,7 +34,7 @@ if(istype(haunted_item.ai_controller, /datum/ai_controller/haunted)) // already spooky return COMPONENT_INCOMPATIBLE - haunted_item.AddElement(/datum/element/haunted, haunt_color) + haunted_item.make_haunted(MAGIC_TRAIT, haunt_color) if(isnull(haunted_item.ai_controller)) // failed to make spooky! don't go on return COMPONENT_INCOMPATIBLE @@ -71,7 +71,7 @@ // because we want to make sure they always get dealt with no matter how the component is removed if(!isnull(pre_haunt_throwforce)) haunted_item.throwforce = pre_haunt_throwforce - haunted_item.RemoveElement(/datum/element/haunted) + haunted_item.remove_haunted(MAGIC_TRAIT) return ..() /datum/component/haunted_item/RegisterWithParent() diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm index 71b8bfe679819..0de2be1d17c80 100644 --- a/code/modules/antagonists/revenant/revenant_abilities.dm +++ b/code/modules/antagonists/revenant/revenant_abilities.dm @@ -22,11 +22,12 @@ Harvest(A) /mob/living/simple_animal/revenant/ranged_secondary_attack(atom/target, modifiers) - if(revealed || notransform || inhibited || !Adjacent(target) || !incorporeal_move_check(target)) + if(revealed || inhibited || HAS_TRAIT(src, TRAIT_NO_TRANSFORM) || !Adjacent(target) || !incorporeal_move_check(target)) return - var/icon/I = icon(target.icon,target.icon_state,target.dir) - var/orbitsize = (I.Width()+I.Height())*0.5 - orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25) + + var/list/icon_dimensions = get_icon_dimensions(target.icon) + var/orbitsize = (icon_dimensions["width"] + icon_dimensions["height"]) * 0.5 + orbitsize -= (orbitsize / world.icon_size) * (world.icon_size * 0.25) orbit(target, orbitsize) //Harvest; activated by clicking the target, will try to drain their essence. @@ -37,7 +38,7 @@ to_chat(src, span_revenwarning("You are already siphoning the essence of a soul!")) return if(!target.stat) - to_chat(src, span_revennotice("[target.p_their(TRUE)] soul is too strong to harvest.")) + to_chat(src, span_revennotice("[target.p_Their()] soul is too strong to harvest.")) if(prob(10)) to_chat(target, span_revennotice("You feel as if you are being watched.")) return @@ -48,16 +49,16 @@ to_chat(src, span_revennotice("You search for the soul of [target].")) if(do_after(src, rand(10, 20), target, timed_action_flags = IGNORE_HELD_ITEM)) //did they get deleted in that second? if(target.ckey) - to_chat(src, span_revennotice("[target.p_their(TRUE)] soul burns with intelligence.")) + to_chat(src, span_revennotice("[target.p_Their()] soul burns with intelligence.")) essence_drained += rand(20, 30) if(target.stat != DEAD && !HAS_TRAIT(target, TRAIT_WEAK_SOUL)) - to_chat(src, span_revennotice("[target.p_their(TRUE)] soul blazes with life!")) + to_chat(src, span_revennotice("[target.p_Their()] soul blazes with life!")) essence_drained += rand(40, 50) if(HAS_TRAIT(target, TRAIT_WEAK_SOUL) && !target.ckey) - to_chat(src, span_revennotice("[target.p_their(TRUE)] soul is weak and underdeveloped. They won't be worth very much.")) + to_chat(src, span_revennotice("[target.p_Their()] soul is weak and underdeveloped. They won't be worth very much.")) essence_drained = 5 else - to_chat(src, span_revennotice("[target.p_their(TRUE)] soul is weak and faltering.")) + to_chat(src, span_revennotice("[target.p_Their()] soul is weak and faltering.")) if(do_after(src, rand(15, 20), target, timed_action_flags = IGNORE_HELD_ITEM)) //did they get deleted NOW? switch(essence_drained) if(1 to 30) @@ -70,7 +71,7 @@ to_chat(src, span_revenbignotice("Ah, the perfect soul. [target] will yield massive amounts of essence to you.")) if(do_after(src, rand(15, 25), target, timed_action_flags = IGNORE_HELD_ITEM)) //how about now if(!target.stat) - to_chat(src, span_revenwarning("[target.p_theyre(TRUE)] now powerful enough to fight off your draining.")) + to_chat(src, span_revenwarning("[target.p_Theyre()] now powerful enough to fight off your draining.")) to_chat(target, span_boldannounce("You feel something tugging across your body before subsiding.")) draining = 0 essence_drained = 0 @@ -107,7 +108,7 @@ target.investigate_log("has died from revenant harvest.", INVESTIGATE_DEATHS) target.death(FALSE) else - to_chat(src, span_revenwarning("[target ? "[target] has":"[target.p_theyve(TRUE)]"] been drawn out of your grasp. The link has been broken.")) + to_chat(src, span_revenwarning("[target ? "[target] has":"[target.p_Theyve()]"] been drawn out of your grasp. The link has been broken.")) if(target) //Wait, target is WHERE NOW? target.visible_message(span_warning("[target] slumps onto the ground."), \ span_revenwarning("Violets lights, dancing in your vision, receding--")) @@ -181,11 +182,7 @@ return TRUE /datum/action/cooldown/spell/aoe/revenant/get_things_to_cast_on(atom/center) - var/list/things = list() - for(var/turf/nearby_turf in range(aoe_radius, center)) - things += nearby_turf - - return things + return RANGE_TURFS(aoe_radius, center) /datum/action/cooldown/spell/aoe/revenant/before_cast(mob/living/simple_animal/revenant/cast_on) . = ..() diff --git a/code/modules/antagonists/revenant/revenant_blight.dm b/code/modules/antagonists/revenant/revenant_blight.dm index 64bd6ce03bb9f..c56df7bd4eaac 100644 --- a/code/modules/antagonists/revenant/revenant_blight.dm +++ b/code/modules/antagonists/revenant/revenant_blight.dm @@ -31,20 +31,23 @@ return if(!finalstage) + var/need_mob_update = FALSE if(affected_mob.body_position == LYING_DOWN && SPT_PROB(3 * stage, seconds_per_tick)) cure() return FALSE if(SPT_PROB(1.5 * stage, seconds_per_tick)) to_chat(affected_mob, span_revennotice("You suddenly feel [pick("sick and tired", "disoriented", "tired and confused", "nauseated", "faint", "dizzy")]...")) affected_mob.adjust_confusion(8 SECONDS) - affected_mob.adjustStaminaLoss(20, FALSE) + need_mob_update += affected_mob.adjustStaminaLoss(20, updating_stamina = FALSE) new /obj/effect/temp_visual/revenant(affected_mob.loc) if(stagedamage < stage) stagedamage++ - affected_mob.adjustToxLoss(1 * stage * seconds_per_tick, FALSE) //should, normally, do about 30 toxin damage. + need_mob_update += affected_mob.adjustToxLoss(1 * stage * seconds_per_tick, updating_health = FALSE) //should, normally, do about 30 toxin damage. new /obj/effect/temp_visual/revenant(affected_mob.loc) if(SPT_PROB(25, seconds_per_tick)) - affected_mob.adjustStaminaLoss(stage, FALSE) + need_mob_update += affected_mob.adjustStaminaLoss(stage, updating_stamina = FALSE) + if(need_mob_update) + affected_mob.updatehealth() switch(stage) if(2) @@ -60,7 +63,7 @@ if(!finalstage) finalstage = TRUE to_chat(affected_mob, span_revenbignotice("You feel like [pick("nothing's worth it anymore", "nobody ever needed your help", "nothing you did mattered", "everything you tried to do was worthless")].")) - affected_mob.adjustStaminaLoss(22.5 * seconds_per_tick, FALSE) + affected_mob.adjustStaminaLoss(22.5 * seconds_per_tick, updating_stamina = FALSE) 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") diff --git a/code/modules/antagonists/revolution/enemy_of_the_revolution.dm b/code/modules/antagonists/revolution/enemy_of_the_revolution.dm deleted file mode 100644 index 93a205a02cd2e..0000000000000 --- a/code/modules/antagonists/revolution/enemy_of_the_revolution.dm +++ /dev/null @@ -1,28 +0,0 @@ - -/** - * When the revolution wins, any remaining heads and security become Enemies of the Revolution. - * Previously being nonantagonists, they only have one simple objective: survive! - */ -/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/forge_objectives() - var/datum/objective/survive/survive = new - survive.owner = owner - survive.explanation_text = "The station has been overrun by revolutionaries, stay alive until the end." - objectives += survive - -/datum/antagonist/enemy_of_the_revolution/on_gain() - owner.add_memory(/datum/memory/revolution_heads_defeated) - //the state version of this antag has to sleep a tick, this doesn't because it's not replacing an old antag datum. - owner.special_role = "revolution enemy" - forge_objectives() - . = ..() - -/datum/antagonist/enemy_of_the_revolution/greet() - . = ..() - 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 837646c76d714..90a6431d428b3 100644 --- a/code/modules/antagonists/revolution/enemy_of_the_state.dm +++ b/code/modules/antagonists/revolution/enemy_of_the_state.dm @@ -11,7 +11,6 @@ suicide_cry = "FOR THE ETERNAL REVOLUTION!!" /datum/antagonist/enemy_of_the_state/forge_objectives() - var/datum/objective/exile/exile_choice = new exile_choice.owner = owner exile_choice.objective_name = "Choice" @@ -32,7 +31,7 @@ . = ..() 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.") + 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() diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm index 31cab0c2ba68c..3e759bdc36275 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -1,11 +1,3 @@ -#define DECONVERTER_STATION_WIN "gamemode_station_win" -#define DECONVERTER_REVS_WIN "gamemode_revs_win" -//How often to check for promotion possibility -#define HEAD_UPDATE_PERIOD 300 - -#define REVOLUTION_VICTORY 1 -#define STATION_VICTORY 2 - /datum/antagonist/rev name = "\improper Revolutionary" roundend_category = "revolutionaries" // if by some miracle revolutionaries without revolution happen @@ -15,21 +7,18 @@ 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." + /// When this antagonist is being de-antagged, this is the source. Can be a mob (for mindshield/blunt force trauma) or a #define string. + var/deconversion_source /datum/antagonist/rev/can_be_owned(datum/mind/new_owner) - . = ..() - if(.) - if(new_owner.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) - return FALSE - if(new_owner.unconvertable) - return FALSE - if(new_owner.current && HAS_TRAIT(new_owner.current, TRAIT_MINDSHIELD)) - return FALSE + if(new_owner.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) + return FALSE + if(new_owner.unconvertable) + return FALSE + if(new_owner.current && HAS_TRAIT(new_owner.current, TRAIT_MINDSHIELD)) + return FALSE + return ..() /datum/antagonist/rev/admin_add(datum/mind/new_owner, mob/admin) // No revolution exists which means admin adding this will create a new revolution team @@ -59,7 +48,7 @@ handle_clown_mutation(M, removing = FALSE) /datum/antagonist/rev/on_mindshield(mob/implanter) - remove_revolutionary(FALSE, implanter) + remove_revolutionary(implanter) return COMPONENT_MINDSHIELD_DECONVERTED /datum/antagonist/rev/proc/equip_rev() @@ -92,7 +81,7 @@ return rev_team = new /datum/team/revolution rev_team.update_objectives() - rev_team.update_heads() + rev_team.update_rev_heads() return if(!istype(new_team)) stack_trace("Wrong team type passed to [type] initialization.") @@ -187,6 +176,7 @@ job_rank = ROLE_REV_HEAD preview_outfit = /datum/outfit/revolutionary + hardcore_random_bonus = TRUE var/remove_clumsy = FALSE var/give_flash = FALSE @@ -230,7 +220,7 @@ if(flashed.stat == DEAD) return if(flashed.stat != CONSCIOUS) - to_chat(source, span_warning("[flashed.p_they(capitalized = TRUE)] must be conscious before you can convert [flashed.p_them()]!")) + to_chat(source, span_warning("[flashed.p_They()] must be conscious before you can convert [flashed.p_them()]!")) return if(isnull(flashed.mind) || !GET_CLIENT(flashed)) @@ -276,8 +266,7 @@ /datum/antagonist/rev/head/proc/make_assistant_icon(hairstyle) var/mob/living/carbon/human/dummy/consistent/assistant = new - assistant.hairstyle = hairstyle - assistant.update_body_parts() + assistant.set_hairstyle(hairstyle, update = TRUE) var/icon/assistant_icon = render_preview_outfit(/datum/outfit/job/assistant/consistent, assistant) assistant_icon.ChangeOpacity(0.5) @@ -329,22 +318,7 @@ new_rev.silent = FALSE to_chat(old_owner, span_userdanger("Revolution has been disappointed of your leader traits! You are a regular revolutionary now!")) -/// Checks if the revolution succeeded, and lets them know. -/datum/antagonist/rev/proc/announce_victorious() - . = rev_team.check_rev_victory() - - if (!.) - return - - to_chat(owner, "[victory_message]") - var/policy = get_policy(ROLE_REV_SUCCESSFUL) - if (policy) - to_chat(owner, policy) - /datum/antagonist/rev/farewell() - if (announce_victorious()) - return - if(ishuman(owner.current)) owner.current.visible_message(span_deconversion_message("[owner.current] looks like [owner.current.p_theyve()] just remembered [owner.current.p_their()] real allegiance!"), null, null, null, owner.current) to_chat(owner, "You are no longer a brainwashed revolutionary! Your memory is hazy from the time you were a rebel...the only thing you remember is the name of the one who brainwashed you....") @@ -353,7 +327,7 @@ to_chat(owner, span_userdanger("The frame's firmware detects and deletes your neural reprogramming! You remember nothing but the name of the one who flashed you.")) /datum/antagonist/rev/head/farewell() - if (announce_victorious() || deconversion_reason == DECONVERTER_STATION_WIN) + if (deconversion_source == DECONVERTER_STATION_WIN) return if((ishuman(owner.current))) if(owner.current.stat != DEAD) @@ -365,27 +339,25 @@ owner.current.visible_message(span_deconversion_message("The frame beeps contentedly, suppressing the disloyal personality traits from the MMI before initalizing it."), null, null, null, owner.current) to_chat(owner, span_userdanger("The frame's firmware detects and suppresses your unwanted personality traits! You feel more content with the leadership around these parts.")) -//blunt trauma deconversions call this through species.dm spec_attacked_by() -/datum/antagonist/rev/proc/remove_revolutionary(borged, deconverter) +/// Handles rev removal via IC methods such as borging, mindshielding, blunt force trauma to the head or revs losing. +/datum/antagonist/rev/proc/remove_revolutionary(deconverter) owner.current.log_message("has been deconverted from the revolution by [ismob(deconverter) ? key_name(deconverter) : deconverter]!", LOG_ATTACK, color="#960000") - if(borged) + if(deconverter == DECONVERTER_BORGED) message_admins("[ADMIN_LOOKUPFLW(owner.current)] has been borged while being a [name]") owner.special_role = null - if(iscarbon(owner.current) && deconverter != DECONVERTER_REVS_WIN) - var/mob/living/carbon/C = owner.current - C.Unconscious(100) - deconversion_reason = deconverter + deconversion_source = deconverter owner.remove_antag_datum(type) -/datum/antagonist/rev/head/remove_revolutionary(borged, deconverter) - var/re_antag = FALSE - var/datum/mind/old_owner = owner //owner gets nulled when rev antag removed - if(borged || deconverter == DECONVERTER_STATION_WIN || deconverter == DECONVERTER_REVS_WIN) - if(owner.current.stat != DEAD && deconverter == DECONVERTER_STATION_WIN) - re_antag = TRUE - . = ..() - 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 +/// This is for revheads, for which they ordinarily shouldn't be deconverted outside of revs losing. As an exception, forceborging can de-headrev them. +/datum/antagonist/rev/head/remove_revolutionary(deconverter) + // If they're living and the station won, turn them into an exiled headrev. + if(owner.current.stat != DEAD && deconverter == DECONVERTER_STATION_WIN) + owner.add_antag_datum(/datum/antagonist/enemy_of_the_state) + + // Only actually remove headrev status on borging or when the station wins. + if(deconverter == DECONVERTER_BORGED || deconverter == DECONVERTER_STATION_WIN) + return ..() + /datum/antagonist/rev/head/equip_rev() var/mob/living/carbon/C = owner.current if(!ishuman(C)) @@ -398,7 +370,7 @@ "left pocket" = ITEM_SLOT_LPOCKET, "right pocket" = ITEM_SLOT_RPOCKET ) - var/where = C.equip_in_one_of_slots(T, slots) + var/where = C.equip_in_one_of_slots(T, slots, indirect_action = TRUE) if (!where) to_chat(C, "The Syndicate were unfortunately unable to get you a flash.") else @@ -415,58 +387,81 @@ /datum/team/revolution name = "\improper Revolution" + + /// Maximum number of headrevs var/max_headrevs = 3 - var/list/ex_headrevs = list() // Dynamic removes revs on loss, used to keep a list for the roundend report. + + /// List of all ex-headrevs. Useful because dynamic removes antag status when it ends, so this can be kept for the roundend report. + var/list/ex_headrevs = list() + + /// List of all ex-revs. Useful because dynamic removes antag status when it ends, so this can be kept for the roundend report. var/list/ex_revs = list() + /// The objective of the heads of staff, aka to kill the headrevs. + var/list/datum/objective/mutiny/heads_objective = list() + +/// Proc called on periodic timer. +/// Updates the rev team's objectives to make sure all heads are targets, useful when new heads latejoin. +/// Propagates all objectives to all revs. /datum/team/revolution/proc/update_objectives(initial = FALSE) var/untracked_heads = SSjob.get_all_heads() - for(var/datum/objective/mutiny/O in objectives) - untracked_heads -= O.target - for(var/datum/mind/M in untracked_heads) + + for(var/datum/objective/mutiny/mutiny_objective in objectives) + untracked_heads -= mutiny_objective.target + + for(var/datum/mind/extra_mutiny_target in untracked_heads) var/datum/objective/mutiny/new_target = new() new_target.team = src - new_target.target = M + new_target.target = extra_mutiny_target 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 - addtimer(CALLBACK(src, PROC_REF(update_objectives)),HEAD_UPDATE_PERIOD,TIMER_UNIQUE) + for(var/datum/mind/rev_member in members) + var/datum/antagonist/rev/rev_antag = rev_member.has_antag_datum(/datum/antagonist/rev) + rev_antag.objectives |= objectives + + addtimer(CALLBACK(src, PROC_REF(update_objectives)), HEAD_UPDATE_PERIOD, TIMER_UNIQUE) + +/// Returns a list of all headrevs. +/datum/team/revolution/proc/get_head_revolutionaries() + var/list/headrev_list = list() -/datum/team/revolution/proc/head_revolutionaries() - . = list() - for(var/datum/mind/M in members) - if(M.has_antag_datum(/datum/antagonist/rev/head)) - . += M + for(var/datum/mind/revolutionary in members) + if(revolutionary.has_antag_datum(/datum/antagonist/rev/head)) + headrev_list += revolutionary -/datum/team/revolution/proc/update_heads() + return headrev_list + +/// Proc called on periodic timer. +/// Tries to make sure an appropriate number of headrevs are part of the revolution. +/// Will promote up revs to headrevs as necessary based on the hard max_headrevs cap and the soft cap based on the number of heads of staff and sec. +/datum/team/revolution/proc/update_rev_heads() if(SSticker.HasRoundStarted()) - var/list/datum/mind/head_revolutionaries = head_revolutionaries() + var/list/datum/mind/head_revolutionaries = get_head_revolutionaries() var/list/datum/mind/heads = SSjob.get_all_heads() 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() + var/list/datum/mind/monkey_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((ROLE_REV_HEAD in khrushchev.current.client.prefs.be_special) || (ROLE_PROVOCATEUR in khrushchev.current.client.prefs.be_special)) - if(ishuman(khrushchev.current)) + if(!ismonkey(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 + monkey_promotable += khrushchev + if(!promotable.len && monkey_promotable.len) //if only monkey revolutionaries remain, promote one of them to the leadership. + promotable = monkey_promotable if(promotable.len) var/datum/mind/new_leader = pick(promotable) var/datum/antagonist/rev/rev = new_leader.has_antag_datum(/datum/antagonist/rev) rev.promote() - addtimer(CALLBACK(src, PROC_REF(update_heads)),HEAD_UPDATE_PERIOD,TIMER_UNIQUE) + addtimer(CALLBACK(src, PROC_REF(update_rev_heads)),HEAD_UPDATE_PERIOD,TIMER_UNIQUE) +/// Saves a list of all ex-headrevs and a list of all revs. /datum/team/revolution/proc/save_members() ex_headrevs = get_antag_minds(/datum/antagonist/rev/head, TRUE) ex_revs = get_antag_minds(/datum/antagonist/rev, TRUE) @@ -480,154 +475,78 @@ /// Checks if heads have won /datum/team/revolution/proc/check_heads_victory() - for(var/datum/mind/rev_mind in head_revolutionaries()) - var/turf/rev_turf = get_turf(rev_mind.current) - if(!considered_afk(rev_mind) && considered_alive(rev_mind) && is_station_level(rev_turf.z)) - if(ishuman(rev_mind.current)) - return FALSE - return TRUE + // List of headrevs we're currently tracking + var/list/included_headrevs = list() + // List of current headrevs + var/list/current_headrevs = get_head_revolutionaries() + // A copy of the head of staff objective list, since we're going to be modifying the original list. + var/list/heads_objective_copy = heads_objective.Copy() + + var/objective_complete = TRUE + // Here, we check current head of staff objectives and remove them if the target doesn't exist as a headrev anymore + for(var/datum/objective/mutiny/objective in heads_objective_copy) + if(!(objective.target in current_headrevs)) + heads_objective -= objective + continue + if(!objective.check_completion()) + objective_complete = FALSE + included_headrevs += objective.target + + // Here, we check current headrevs and add them as objectives if they didn't exist as a head of staff objective before. + // Additionally, we make sure the objective is not completed by running the check_completion check on them. + for(var/datum/mind/rev_mind as anything in current_headrevs) + if(!(rev_mind in included_headrevs)) + var/datum/objective/mutiny/objective = new() + objective.target = rev_mind + if(!objective.check_completion()) + objective_complete = FALSE + heads_objective += objective + + return objective_complete /// 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. /datum/team/revolution/proc/process_victory() if (check_rev_victory()) - . = REVOLUTION_VICTORY - else if (check_heads_victory()) - . = STATION_VICTORY - else + victory_effects() + return REVOLUTION_VICTORY + + if (!check_heads_victory()) return + . = STATION_VICTORY + SSshuttle.clearHostileEnvironment(src) + + // Save rev lists before we remove the antag datums. save_members() // Remove everyone as a revolutionary for (var/datum/mind/rev_mind as anything in members) var/datum/antagonist/rev/rev_antag = rev_mind.has_antag_datum(/datum/antagonist/rev) if (!isnull(rev_antag)) - rev_antag.remove_revolutionary(FALSE, . == STATION_VICTORY ? DECONVERTER_STATION_WIN : DECONVERTER_REVS_WIN) + rev_antag.remove_revolutionary(DECONVERTER_STATION_WIN) if(rev_mind in ex_headrevs) LAZYADD(rev_mind.special_statuses, "Former head revolutionary") else LAZYADD(rev_mind.special_statuses, "Former revolutionary") - if (. == STATION_VICTORY) - defeat_effects() - - else - victory_effects() - -/datum/team/revolution/proc/victory_effects(revs_win_injection_amount) - var/charter_given = FALSE + defeat_effects() +/// Handles any pre-round-ending effects on rev victory. An example use case is recording memories. +/datum/team/revolution/proc/victory_effects() for(var/datum/mind/headrev_mind as anything in ex_headrevs) var/mob/living/real_headrev = headrev_mind.current if(isnull(real_headrev)) continue add_memory_in_range(real_headrev, 5, /datum/memory/revolution_rev_victory, protagonist = real_headrev) - if(charter_given || real_headrev.stat != CONSCIOUS) - continue - charter_given = TRUE - podspawn(list( - "target" = get_turf(real_headrev), - "style" = STYLE_SYNDICATE, - "spawn" = list( - /obj/item/bedsheet/rev, - /obj/item/megaphone, - /obj/item/station_charter/revolution, - ))) - to_chat(real_headrev, 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.\"")) - - SEND_GLOBAL_SIGNAL(COMSIG_GLOB_REVOLUTION_VICTORY) - - 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 - - var/datum/game_mode/dynamic/dynamic = SSticker.mode - dynamic.unfavorable_situation() - - var/message_header = "A recent assessment of your station has marked your station as a severe risk area for high ranking Nanotrasen officials." - var/extra_detail = try_auto_call_shuttle() \ - ? "For the safety of our staff, we are expediting an emergency shuttle for remaining members of security and command." \ - : "For the safety of our staff, we have blacklisted your station for new employment of security and command." - var/propaganda = pick(world.file2list("strings/anti_union_propaganda.txt")) - - priority_announce( - "[message_header]\n\n[extra_detail]\n\n[propaganda]", - sender_override = "Central Command Loyalty Monitoring Division" - ) - -/// How much of the station, ignoring sec and command, should be revs before a shuttle will be automatically called? -#define REV_AUTO_CALL_THRESHOLD 0.65 - -/datum/team/revolution/proc/try_auto_call_shuttle() - var/total_revs = ex_revs.len + ex_headrevs.len - var/total_candidates = 0 - - for (var/datum/mind/crewmember as anything in get_crewmember_minds()) - if (crewmember.has_antag_datum(/datum/antagonist/enemy_of_the_revolution)) - continue - if(crewmember.current?.stat == DEAD) // if we have 60 dead nonrev crew, 2 alive crew, and 10 alive revs, it should qualify for the shuttle - continue - - total_candidates += 1 - - var/display_percent = round(total_revs / total_candidates * 100) - - if (total_revs / total_candidates < REV_AUTO_CALL_THRESHOLD) - log_game("REVOLUTION: Not calling the shuttle, [display_percent]% are revs") - return FALSE - - // Do it later so everyone has time to see the messages - addtimer(CALLBACK(src, PROC_REF(perform_auto_shuttle_call)), 20 SECONDS) - - var/log = "REVOLUTION: Auto-calling the shuttle, [display_percent]% are revs" - log_game(log) - message_admins(log) - - return TRUE - -#undef REV_AUTO_CALL_THRESHOLD - -/datum/team/revolution/proc/perform_auto_shuttle_call() - var/can_evac_result = SSshuttle.canEvac() - if (can_evac_result != TRUE) - log_game("REVOLUTION: Not calling the shuttle, canEvac() returned [can_evac_result]") - return - - SSshuttle.call_evac_shuttle("Sending emergency shuttle to rescue command and security staff.") +/// Handles effects of revs losing, such as making ex-headrevs unrevivable and setting up head of staff memories. /datum/team/revolution/proc/defeat_effects() // 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() for(var/datum/objective/mutiny/head_tracker in objectives) var/mob/living/head_of_staff = head_tracker.target?.current @@ -745,9 +664,3 @@ gloves = /obj/item/clothing/gloves/color/black l_hand = /obj/item/spear r_hand = /obj/item/assembly/flash - -#undef DECONVERTER_REVS_WIN -#undef DECONVERTER_STATION_WIN -#undef HEAD_UPDATE_PERIOD -#undef REVOLUTION_VICTORY -#undef STATION_VICTORY diff --git a/code/modules/antagonists/sentient_creature/sentient_creature.dm b/code/modules/antagonists/sentient_creature/sentient_creature.dm index 4b68a288be129..d1197265ced5d 100644 --- a/code/modules/antagonists/sentient_creature/sentient_creature.dm +++ b/code/modules/antagonists/sentient_creature/sentient_creature.dm @@ -23,8 +23,7 @@ var/mob/living/master = owner.enslaved_to?.resolve() if(master) owner.current.copy_languages(master, LANGUAGE_MASTER) - owner.current.update_atom_languages() - . = ..() + return ..() /datum/antagonist/sentient_creature/ui_static_data(mob/user) var/list/data = list() diff --git a/code/modules/antagonists/space_dragon/carp_rift.dm b/code/modules/antagonists/space_dragon/carp_rift.dm index e87ceb3f07180..dc9be2dfb8ddc 100644 --- a/code/modules/antagonists/space_dragon/carp_rift.dm +++ b/code/modules/antagonists/space_dragon/carp_rift.dm @@ -59,7 +59,7 @@ desc = "A rift akin to the ones space carp use to travel long distances." armor_type = /datum/armor/structure_carp_rift max_integrity = 300 - icon = 'icons/obj/carp_rift.dmi' + icon = 'icons/obj/anomaly.dmi' icon_state = "carp_rift_carpspawn" light_color = LIGHT_COLOR_PURPLE light_range = 10 diff --git a/code/modules/antagonists/space_ninja/space_ninja.dm b/code/modules/antagonists/space_ninja/space_ninja.dm index 130741ab930b3..bf19635ed9b0d 100644 --- a/code/modules/antagonists/space_ninja/space_ninja.dm +++ b/code/modules/antagonists/space_ninja/space_ninja.dm @@ -9,10 +9,11 @@ antag_moodlet = /datum/mood_event/focused suicide_cry = "FOR THE SPIDER CLAN!!" preview_outfit = /datum/outfit/ninja_preview + can_assign_self_objectives = TRUE + ui_name = "AntagInfoNinja" + default_custom_objective = "Destroy vital station infrastructure, without being seen." ///Whether or not this ninja will obtain objectives var/give_objectives = TRUE - ///Whether or not this ninja receives the standard equipment - var/give_equipment = TRUE /** * Proc that equips the space ninja outfit on a given individual. By default this is the owner of the antagonist datum. @@ -35,7 +36,7 @@ antag_memory += "Surprise is my weapon. Shadows are my armor. Without them, I am nothing.
    " /datum/objective/cyborg_hijack - explanation_text = "Use your gloves to convert at least one cyborg to aide you in sabotaging the station." + explanation_text = "Use your gloves to convert at least one cyborg to aid you in sabotaging the station." /datum/objective/door_jack ///How many doors that need to be opened using the gloves to pass the objective @@ -110,9 +111,9 @@ if(give_objectives) addObjectives() addMemories() - if(give_equipment) - equip_space_ninja(owner.current) - + equip_space_ninja(owner.current) + owner.current.add_quirk(/datum/quirk/freerunning) + owner.current.add_quirk(/datum/quirk/light_step) owner.current.mind.set_assigned_role(SSjob.GetJobType(/datum/job/space_ninja)) owner.current.mind.special_role = ROLE_NINJA return ..() diff --git a/code/modules/antagonists/survivalist/survivalist.dm b/code/modules/antagonists/survivalist/survivalist.dm index e4642efcbaba0..2480b186600a6 100644 --- a/code/modules/antagonists/survivalist/survivalist.dm +++ b/code/modules/antagonists/survivalist/survivalist.dm @@ -22,6 +22,7 @@ /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." + hardcore_random_bonus = TRUE /datum/antagonist/survivalist/guns/forge_objectives() var/datum/objective/steal_n_of_type/summon_guns/guns = new @@ -32,6 +33,7 @@ /datum/antagonist/survivalist/magic name = "Amateur Magician" greet_message = "Grow your newfound talent! Grab as many magical artefacts as possible, by any means necessary. Kill anyone who gets in your way." + hardcore_random_bonus = TRUE /datum/antagonist/survivalist/magic/greet() . = ..() @@ -42,3 +44,11 @@ magic.owner = owner objectives += magic ..() + +/datum/antagonist/survivalist/magic/on_gain() + . = ..() + ADD_TRAIT(owner, TRAIT_MAGICALLY_GIFTED, REF(src)) + +/datum/antagonist/survivalist/magic/on_removal() + REMOVE_TRAIT(owner, TRAIT_MAGICALLY_GIFTED, REF(src)) + return..() diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 59c92c6d17264..aaf162c15f853 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -14,6 +14,9 @@ ui_name = "AntagInfoTraitor" suicide_cry = "FOR THE SYNDICATE!!" preview_outfit = /datum/outfit/traitor + can_assign_self_objectives = TRUE + default_custom_objective = "Perform an overcomplicated heist on valuable Nanotrasen assets." + hardcore_random_bonus = TRUE var/give_objectives = TRUE var/should_give_codewords = TRUE ///give this traitor an uplink? @@ -67,6 +70,9 @@ uplink_handler.has_objectives = TRUE uplink_handler.generate_objectives() + uplink_handler.can_replace_objectives = CALLBACK(src, PROC_REF(can_change_objectives)) + uplink_handler.replace_objectives = CALLBACK(src, PROC_REF(submit_player_objective)) + if(uplink_handler.progression_points < SStraitor.current_global_progression) uplink_handler.progression_points = SStraitor.current_global_progression * SStraitor.newjoin_progression_coeff @@ -94,8 +100,10 @@ return ..() /datum/antagonist/traitor/on_removal() - if(uplink_handler) + if(!isnull(uplink_handler)) uplink_handler.has_objectives = FALSE + uplink_handler.can_replace_objectives = null + uplink_handler.replace_objectives = null return ..() /datum/antagonist/traitor/proc/traitor_objective_to_html(datum/traitor_objective/to_display) @@ -146,6 +154,10 @@ result += "Force add objective
    " return result +/// Returns true if we're allowed to assign ourselves a new objective +/datum/antagonist/traitor/proc/can_change_objectives() + return can_assign_self_objectives + /// proc that generates the traitors replacement uplink code and radio frequency /datum/antagonist/traitor/proc/generate_replacement_codes() replacement_uplink_code = "[pick(GLOB.phonetic_alphabet)] [rand(10,99)]" @@ -306,11 +318,9 @@ if(objectives.len) //If the traitor had no objectives, don't need to process this. var/count = 1 for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - objectives_text += "
    Objective #[count]: [objective.explanation_text] [span_greentext("Success!")]" - else - objectives_text += "
    Objective #[count]: [objective.explanation_text] [span_redtext("Fail.")]" + if(!objective.check_completion()) traitor_won = FALSE + objectives_text += "
    Objective #[count]: [objective.explanation_text] [objective.get_roundend_success_suffix()]" count++ if(uplink_handler.final_objective) objectives_text += "
    [span_greentext("[traitor_won ? "Additionally" : "However"], the final objective \"[uplink_handler.final_objective]\" was completed!")]" @@ -354,6 +364,7 @@ uniform = /obj/item/clothing/under/color/grey suit = /obj/item/clothing/suit/hooded/ablative + head = /obj/item/clothing/head/hooded/ablative gloves = /obj/item/clothing/gloves/color/yellow mask = /obj/item/clothing/mask/gas l_hand = /obj/item/melee/energy/sword diff --git a/code/modules/antagonists/traitor/objectives/abstract/target_player.dm b/code/modules/antagonists/traitor/objectives/abstract/target_player.dm index 76471eb244af7..c08f8cd46ee3d 100644 --- a/code/modules/antagonists/traitor/objectives/abstract/target_player.dm +++ b/code/modules/antagonists/traitor/objectives/abstract/target_player.dm @@ -16,3 +16,18 @@ /// The target that we need to target. var/mob/living/target + +/datum/traitor_objective/target_player/Destroy(force) + set_target(null) + return ..() + +/datum/traitor_objective/target_player/proc/set_target(mob/living/new_target) + if(target) + UnregisterSignal(target, COMSIG_QDELETING) + target = new_target + if(target) + RegisterSignal(target, COMSIG_QDELETING, PROC_REF(target_deleted)) + +/datum/traitor_objective/target_player/proc/target_deleted(datum/source) + SIGNAL_HANDLER + set_target(null) diff --git a/code/modules/antagonists/traitor/objectives/assassination.dm b/code/modules/antagonists/traitor/objectives/assassination.dm index 4efcbb111be3e..ab3211aedd849 100644 --- a/code/modules/antagonists/traitor/objectives/assassination.dm +++ b/code/modules/antagonists/traitor/objectives/assassination.dm @@ -107,20 +107,13 @@ return //in their pockets please succeed_objective() -/datum/traitor_objective/target_player/assassinate/calling_card/generate_objective(datum/mind/generating_for, list/possible_duplicates) - . = ..() - if(!.) //didn't generate - return FALSE - RegisterSignal(target, COMSIG_QDELETING, PROC_REF(on_target_qdeleted)) - /datum/traitor_objective/target_player/assassinate/calling_card/ungenerate_objective() - UnregisterSignal(target, COMSIG_QDELETING) . = ..() //unsets kill target if(card) UnregisterSignal(card, COMSIG_ITEM_EQUIPPED) card = null -/datum/traitor_objective/target_player/assassinate/calling_card/on_target_qdeleted() +/datum/traitor_objective/target_player/assassinate/calling_card/target_deleted() //you cannot plant anything on someone who is gone gone, so even if this happens after you're still liable to fail fail_objective(penalty_cost = telecrystal_penalty) @@ -228,7 +221,7 @@ return FALSE //MISSION FAILED, WE'LL GET EM NEXT TIME var/datum/mind/target_mind = pick(possible_targets) - target = target_mind.current + set_target(target_mind.current) replace_in_name("%TARGET%", target.real_name) replace_in_name("%JOB TITLE%", target_mind.assigned_role.title) RegisterSignal(target, COMSIG_LIVING_DEATH, PROC_REF(on_target_death)) @@ -236,17 +229,17 @@ /datum/traitor_objective/target_player/assassinate/ungenerate_objective() UnregisterSignal(target, COMSIG_LIVING_DEATH) - target = null + set_target(null) ///proc for checking for special states that invalidate a target /datum/traitor_objective/target_player/assassinate/proc/special_target_filter(list/possible_targets) return -/datum/traitor_objective/target_player/assassinate/proc/on_target_qdeleted() - SIGNAL_HANDLER +/datum/traitor_objective/target_player/assassinate/target_deleted() if(objective_state == OBJECTIVE_STATE_INACTIVE) //don't take an objective target of someone who is already obliterated fail_objective() + return ..() /datum/traitor_objective/target_player/assassinate/proc/on_target_death() SIGNAL_HANDLER diff --git a/code/modules/antagonists/traitor/objectives/demoralise_assault.dm b/code/modules/antagonists/traitor/objectives/demoralise_assault.dm new file mode 100644 index 0000000000000..fe26864e4fc1d --- /dev/null +++ b/code/modules/antagonists/traitor/objectives/demoralise_assault.dm @@ -0,0 +1,129 @@ +/datum/traitor_objective_category/demoralise + name = "Demoralise Crew" + objectives = list( + /datum/traitor_objective/target_player/assault = 1, + /datum/traitor_objective/destroy_item/demoralise = 1, + ) + weight = OBJECTIVE_WEIGHT_UNLIKELY + +/datum/traitor_objective/target_player/assault + name = "Assault %TARGET% the %JOB TITLE%" + description = "%TARGET% has been identified as a potential future agent. \ + Pick a fight and give them a good beating. \ + %COUNT% hits should reduce their morale and have them questioning their loyalties. \ + Try not to kill them just yet, we may want to recruit them in the future." + + abstract_type = /datum/traitor_objective/target_player + duplicate_type = /datum/traitor_objective/target_player + + progression_minimum = 0 MINUTES + progression_maximum = 30 MINUTES + progression_reward = list(4 MINUTES, 8 MINUTES) + telecrystal_reward = list(0, 1) + + /// Min attacks required to pass the objective. Picked at random between this and max. + var/min_attacks_required = 2 + /// Max attacks required to pass the objective. Picked at random between this and min. + var/max_attacks_required = 5 + /// The random number picked for the number of required attacks to pass this objective. + var/attacks_required = 0 + /// Total number of successful attacks recorded. + var/attacks_inflicted = 0 + +/datum/traitor_objective/target_player/assault/on_objective_taken(mob/user) + . = ..() + + target.AddElement(/datum/element/relay_attackers) + RegisterSignal(target, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked)) + +/datum/traitor_objective/target_player/assault/proc/on_attacked(mob/source, mob/living/attacker, attack_flags) + SIGNAL_HANDLER + + // Only care about attacks from the objective's owner. + if(attacker != handler.owner.current) + return + + // We want some sort of damaging attack to trigger this, rather than shoves and non-lethals. + if(!(attack_flags & ATTACKER_DAMAGING_ATTACK)) + return + + attacks_inflicted++ + + if(attacks_inflicted == attacks_required) + succeed_objective() + +/datum/traitor_objective/target_player/assault/ungenerate_objective() + UnregisterSignal(target, COMSIG_ATOM_WAS_ATTACKED) + UnregisterSignal(target, COMSIG_LIVING_DEATH) + set_target(null) + +/datum/traitor_objective/target_player/assault/generate_objective(datum/mind/generating_for, list/possible_duplicates) + var/list/already_targeting = list() //List of minds we're already targeting. The possible_duplicates is a list of objectives, so let's not mix things + for(var/datum/objective/task as anything in handler.primary_objectives) + if(!istype(task.target, /datum/mind)) + continue + already_targeting += task.target //Removing primary objective kill targets from the list + + var/list/possible_targets = list() + + for(var/datum/mind/possible_target as anything in get_crewmember_minds()) + if(possible_target in already_targeting) + continue + + if(possible_target == generating_for) + continue + + if(!ishuman(possible_target.current)) + continue + + if(possible_target.current.stat == DEAD) + continue + + if(possible_target.has_antag_datum(/datum/antagonist/traitor)) + continue + + possible_targets += possible_target + + for(var/datum/traitor_objective/target_player/objective as anything in possible_duplicates) + possible_targets -= objective.target?.mind + + if(generating_for.late_joiner) + var/list/all_possible_targets = possible_targets.Copy() + for(var/datum/mind/possible_target as anything in all_possible_targets) + if(!possible_target.late_joiner) + possible_targets -= possible_target + if(!possible_targets.len) + possible_targets = all_possible_targets + + if(!possible_targets.len) + return FALSE + + var/datum/mind/target_mind = pick(possible_targets) + + set_target(target_mind.current) + replace_in_name("%TARGET%", target.real_name) + replace_in_name("%JOB TITLE%", target_mind.assigned_role.title) + + attacks_required = rand(min_attacks_required, max_attacks_required) + replace_in_name("%COUNT%", attacks_required) + + RegisterSignal(target, COMSIG_LIVING_DEATH, PROC_REF(on_target_death)) + + return TRUE + +/datum/traitor_objective/target_player/assault/generate_ui_buttons(mob/user) + var/list/buttons = list() + if(attacks_required > attacks_inflicted) + buttons += add_ui_button("[attacks_required - attacks_inflicted]", "This tells you how many more times you have to attack the target player to succeed.", "hand-rock-o", "none") + return buttons + +/datum/traitor_objective/target_player/assault/target_deleted() + //don't take an objective target of someone who is already obliterated + fail_objective() + return ..() + +/datum/traitor_objective/target_player/assault/proc/on_target_death() + SIGNAL_HANDLER + + //don't take an objective target of someone who is already dead + fail_objective() diff --git a/code/modules/antagonists/traitor/objectives/demoralise_crew.dm b/code/modules/antagonists/traitor/objectives/demoralise_crew.dm deleted file mode 100644 index 4529273f5e2e0..0000000000000 --- a/code/modules/antagonists/traitor/objectives/demoralise_crew.dm +++ /dev/null @@ -1,53 +0,0 @@ -#define MAX_CREW_RATIO 0.33 -#define MIN_CREW_DEMORALISED 8 -#define MAX_CREW_DEMORALISED 16 - -/datum/traitor_objective_category/demoralise - name = "Demoralise Crew" - objectives = list( - /datum/traitor_objective/demoralise/poster = 2, - /datum/traitor_objective/demoralise/graffiti = 1, - ) - weight = OBJECTIVE_WEIGHT_UNLIKELY - -/datum/traitor_objective/demoralise - name = "Debug your code." - description = "If you actually get this objective someone fucked up." - - abstract_type = /datum/traitor_objective/demoralise - - /// How many 'mood events' are required? - var/demoralised_crew_required = 0 - /// How many 'mood events' have happened so far? - var/demoralised_crew_events = 0 - -/datum/traitor_objective/demoralise/can_generate_objective(datum/mind/generating_for, list/possible_duplicates) - if(length(possible_duplicates) > 0) - return FALSE - return TRUE - -/datum/traitor_objective/demoralise/generate_objective(datum/mind/generating_for, list/possible_duplicates) - demoralised_crew_required = (clamp(rand(MIN_CREW_DEMORALISED, length(get_crewmember_minds()) * MAX_CREW_RATIO), MIN_CREW_DEMORALISED, MAX_CREW_DEMORALISED)) - replace_in_name("%VIEWS%", demoralised_crew_required) - return TRUE - -/** - * Handles an event which increases your progress towards success. - * - * Arguments - * * source - Source atom of the signal. - * * victim - Mind of whoever it was you just triggered some kind of effect on. - */ -/datum/traitor_objective/demoralise/proc/on_mood_event(atom/source, datum/mind/victim) - SIGNAL_HANDLER - if (victim == handler.owner) - return - - demoralised_crew_events++ - if (demoralised_crew_events >= demoralised_crew_required) - to_chat(handler.owner, span_nicegreen("The crew look despondent. Mission accomplished.")) - succeed_objective() - -#undef MAX_CREW_RATIO -#undef MIN_CREW_DEMORALISED -#undef MAX_CREW_DEMORALISED diff --git a/code/modules/antagonists/traitor/objectives/demoralise_graffiti.dm b/code/modules/antagonists/traitor/objectives/demoralise_graffiti.dm deleted file mode 100644 index 5be1d609126ec..0000000000000 --- a/code/modules/antagonists/traitor/objectives/demoralise_graffiti.dm +++ /dev/null @@ -1,315 +0,0 @@ -/datum/traitor_objective/demoralise/graffiti - name = "Sow doubt among the crew %VIEWS% times using Syndicate graffiti." - description = "Use the button below to materialize a seditious spray can, \ - and use it to draw a 3x3 tag in a place where people will come across it. \ - Special syndicate sealing agent ensures that it can't be removed for \ - five minutes following application, and it's slippery too! \ - People seeing or slipping on your graffiti grants progress towards success." - - progression_minimum = 0 MINUTES - progression_maximum = 30 MINUTES - progression_reward = list(4 MINUTES, 8 MINUTES) - telecrystal_reward = list(0, 1) - - duplicate_type = /datum/traitor_objective/demoralise/graffiti - /// Have we given out a spray can yet? - var/obtained_spray = FALSE - /// Graffiti 'rune' which we will be drawing - var/obj/effect/decal/cleanable/traitor_rune/rune - -/datum/traitor_objective/demoralise/graffiti/generate_ui_buttons(mob/user) - var/list/buttons = list() - if (!obtained_spray) - buttons += add_ui_button("", "Pressing this will materialize a syndicate spraycan in your hand.", "wifi", "summon_gear") - else - buttons += add_ui_button("[demoralised_crew_events] / [demoralised_crew_required] propagandised", "This many crew have been exposed to propaganda, out of a required [demoralised_crew_required].", "wifi", "none") - return buttons - -/datum/traitor_objective/demoralise/graffiti/ui_perform_action(mob/living/user, action) - . = ..() - switch(action) - if ("summon_gear") - if (obtained_spray) - return - - obtained_spray = TRUE - var/obj/item/traitor_spraycan/spray = new(user.drop_location()) - user.put_in_hands(spray) - spray.balloon_alert(user, "the spraycan materializes in your hand") - - RegisterSignal(spray, COMSIG_QDELETING, PROC_REF(on_spray_destroyed)) - RegisterSignal(spray, COMSIG_TRAITOR_GRAFFITI_DRAWN, PROC_REF(on_rune_complete)) - -/** - * Called when the spray can is deleted. - * If it's already been expended we don't care, if it hasn't you just made your objective impossible.area - * - * Arguments - * * spray - the spraycan which was just deleted - */ -/datum/traitor_objective/demoralise/graffiti/proc/on_spray_destroyed() - SIGNAL_HANDLER - // You fucked up pretty bad if you let this happen - if (!rune) - fail_objective(penalty_cost = telecrystal_penalty) - -/** - * Called when you managed to draw a traitor rune. - * Sets up tracking for objective progress, and unregisters signals for the spraycan because we don't care about it any more. - * - * Arguments - * * drawn_rune - graffiti 'rune' which was just drawn. - */ -/datum/traitor_objective/demoralise/graffiti/proc/on_rune_complete(atom/spray, obj/effect/decal/cleanable/traitor_rune/drawn_rune) - SIGNAL_HANDLER - rune = drawn_rune - UnregisterSignal(spray, COMSIG_QDELETING) - UnregisterSignal(spray, COMSIG_TRAITOR_GRAFFITI_DRAWN) - RegisterSignal(drawn_rune, COMSIG_QDELETING, PROC_REF(on_rune_destroyed)) - RegisterSignal(drawn_rune, COMSIG_DEMORALISING_EVENT, PROC_REF(on_mood_event)) - RegisterSignal(drawn_rune, COMSIG_TRAITOR_GRAFFITI_SLIPPED, PROC_REF(on_mood_event)) - -/** - * Called when your traitor rune is destroyed. If you haven't suceeded by now, you fail.area - * - * Arguments - * * rune - the rune which just got destroyed. - */ -/datum/traitor_objective/demoralise/graffiti/proc/on_rune_destroyed(obj/effect/decal/cleanable/traitor_rune/rune) - SIGNAL_HANDLER - fail_objective(penalty_cost = telecrystal_penalty) - -/datum/traitor_objective/demoralise/graffiti/ungenerate_objective() - if (rune) - UnregisterSignal(rune, COMSIG_QDELETING) - UnregisterSignal(rune, COMSIG_DEMORALISING_EVENT) - UnregisterSignal(rune, COMSIG_TRAITOR_GRAFFITI_SLIPPED) - rune = null - return ..() - -// Extending the existing spraycan item was more trouble than it was worth, I don't want or need this to be able to draw arbitrary shapes. -/obj/item/traitor_spraycan - name = "seditious spraycan" - desc = "This spraycan deploys a subversive pattern containing subliminal priming agents over a 3x3 area. Contains enough primer for just one final coating." - icon = 'icons/obj/art/crayons.dmi' - icon_state = "deathcan" - worn_icon_state = "spraycan" - inhand_icon_state = "spraycan" - lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi' - w_class = WEIGHT_CLASS_SMALL - var/paint_color = "#780000" - var/static/list/no_draw_turfs = typecacheof(list(/turf/open/space, /turf/open/openspace, /turf/open/lava, /turf/open/chasm)) - - /// Are we currently drawing? Used to prevent spam clicks for do_while - var/drawing_rune = FALSE - /// Set to true if we finished drawing something, this spraycan is now useless - var/expended = FALSE - -/obj/item/traitor_spraycan/afterattack(atom/target, mob/user, proximity, params) - . = ..() - if (expended) - user.balloon_alert(user, "all out of paint...") - return COMPONENT_CANCEL_ATTACK_CHAIN - - if (drawing_rune) - user.balloon_alert(user, "already busy!") - return COMPONENT_CANCEL_ATTACK_CHAIN - - . |= AFTERATTACK_PROCESSED_ITEM - - if (!proximity || !check_allowed_items(target) || !isliving(user)) - return - - if (isturf(target)) - try_draw_new_rune(user, target) - return COMPONENT_CANCEL_ATTACK_CHAIN - - if (istype(target, /obj/effect/decal/cleanable/traitor_rune)) - try_complete_rune(user, target) - return COMPONENT_CANCEL_ATTACK_CHAIN - -/** - * Attempt to draw a rune on [target_turf]. - * Shamelessly adapted from the heretic rune drawing process. - * - * Arguments - * * user - the mob drawing the rune - * * target_turf - the place the rune's being drawn - */ -/obj/item/traitor_spraycan/proc/try_draw_new_rune(mob/living/user, turf/target_turf) - for(var/turf/nearby_turf as anything in RANGE_TURFS(1, target_turf)) - if (!isopenturf(nearby_turf) || is_type_in_typecache(nearby_turf, no_draw_turfs)) - user.balloon_alert(user, "you need a clear 3x3 area!") - return - - draw_rune(user, target_turf) - -/** - * Draw your stage one rune on the ground and store it. - * - * Arguments - * * user - the mob drawing the rune - * * target_turf - the place the rune's being drawn - */ -/obj/item/traitor_spraycan/proc/draw_rune(mob/living/user, turf/target_turf) - if (!try_draw_step("drawing outline...", user, target_turf)) - return - try_complete_rune(user, new /obj/effect/decal/cleanable/traitor_rune(target_turf)) - -/** - * Holder for repeated code to do something after a message and a set amount of time. - * - * Arguments - * * output - a string to show when you start the process - * * user - the mob drawing the rune - * * target - what they're trying to draw, or the place they are trying to draw on - */ -/obj/item/traitor_spraycan/proc/try_draw_step(start_output, mob/living/user, atom/target) - drawing_rune = TRUE - user.balloon_alert(user, "[start_output]") - if (!do_after(user, 3 SECONDS, target)) - user.balloon_alert(user, "interrupted!") - drawing_rune = FALSE - return FALSE - - playsound(src, 'sound/effects/spray.ogg', 5, TRUE, 5) - drawing_rune = FALSE - return TRUE - -#define RUNE_STAGE_OUTLINE 0 -#define RUNE_STAGE_COLOURED 1 -#define RUNE_STAGE_COMPLETE 2 -#define RUNE_STAGE_REMOVABLE 3 - -/** - * Try to upgrade a floor rune to its next stage. - * - * Arguments - * * user - the mob drawing the rune - * * target_turf - the place the rune's being drawn - */ -/obj/item/traitor_spraycan/proc/try_complete_rune(mob/living/user, obj/effect/decal/cleanable/traitor_rune/rune) - switch(rune.drawn_stage) - if (RUNE_STAGE_OUTLINE) - if (!try_draw_step("... finalising design...", user, rune)) - return - if (!rune) - user.balloon_alert(user, "graffiti was destroyed!") - return - rune.set_stage(RUNE_STAGE_COLOURED) - try_complete_rune(user, rune) - - if (RUNE_STAGE_COLOURED) - if (!try_draw_step("... applying final coating...", user, rune)) - return - if (!rune) - user.balloon_alert(user, "graffiti was destroyed!") - return - user.balloon_alert(user, "finished!") - rune.set_stage(RUNE_STAGE_COMPLETE) - expended = TRUE - desc = "A suspicious looking spraycan, it's all out of paint." - SEND_SIGNAL(src, COMSIG_TRAITOR_GRAFFITI_DRAWN, rune) - - if (RUNE_STAGE_COMPLETE, RUNE_STAGE_REMOVABLE) - user.balloon_alert(user, "all done!") - -/// Copying the functionality from normal spraycans, but doesn't need all the optional checks -/obj/item/traitor_spraycan/suicide_act(mob/living/user) - if(expended) - user.visible_message(span_suicide("[user] shakes up [src] with a rattle and lifts it to [user.p_their()] mouth, but nothing happens!")) - user.say("MEDIOCRE!!", forced="spraycan suicide") - return SHAME - - var/mob/living/carbon/human/suicider = user - user.visible_message(span_suicide("[user] shakes up [src] with a rattle and lifts it to [user.p_their()] mouth, spraying paint across [user.p_their()] teeth!")) - user.say("WITNESS ME!!", forced="spraycan suicide") - playsound(src, 'sound/effects/spray.ogg', 5, TRUE, 5) - suicider.update_lips("spray_face", paint_color) - return OXYLOSS - -/obj/effect/decal/cleanable/traitor_rune - name = "syndicate graffiti" - desc = "It looks like it's going to be... the Syndicate logo?" - icon = 'icons/effects/96x96.dmi' - icon_state = "traitor_rune_outline" - pixel_x = -32 - pixel_y = -32 - gender = NEUTER - mergeable_decal = FALSE - resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF - clean_type = CLEAN_TYPE_HARD_DECAL - layer = SIGIL_LAYER - var/slip_time = 6 SECONDS - var/slip_flags = NO_SLIP_WHEN_WALKING - - /// The stage of drawing we have reached - var/drawn_stage = RUNE_STAGE_OUTLINE - /// Proximity sensor to make people sad if they're nearby - var/datum/proximity_monitor/advanced/demoraliser/demoraliser - /// Whether we protect the rune from being cleaned up - var/clean_proof = FALSE - /// Timer until the rune can be cleaned up off the floor - var/protected_timer - -/obj/effect/decal/cleanable/traitor_rune/traitor/Destroy() - deltimer(protected_timer) - QDEL_NULL(demoraliser) - return ..() - -/obj/effect/decal/cleanable/traitor_rune/HasProximity(atom/movable/proximity_check_mob) - if (isliving(proximity_check_mob) && get_dist(proximity_check_mob, src) <= 1) - slip(proximity_check_mob) - return ..() - -/** - * Makes someone fall over. If it's not the traitor, this counts as demoralising the crew. - * - * Arguments - * * victim - whoever just slipped, point and laugh at them - */ -/obj/effect/decal/cleanable/traitor_rune/proc/slip(mob/living/victim) - if(victim.movement_type & FLYING) - return - if (!victim.slip(slip_time, src, slip_flags)) - return - SEND_SIGNAL(src, COMSIG_TRAITOR_GRAFFITI_SLIPPED, victim.mind) - -/** - * Sets the "drawing stage" of the rune. - * This affects the appearance, behaviour, and description of the effect. - * - * Arguments - * * stage - new stage to apply - */ -/obj/effect/decal/cleanable/traitor_rune/proc/set_stage(stage) - drawn_stage = stage - switch(drawn_stage) - if (RUNE_STAGE_OUTLINE) - icon_state = "traitor_rune_outline" - desc = "It looks like it's going to be... the Syndicate logo?" - - if (RUNE_STAGE_COLOURED, RUNE_STAGE_REMOVABLE) - icon_state = "traitor_rune_done" - desc = "A large depiction of the Syndicate logo." - clean_proof = FALSE - - if (RUNE_STAGE_COMPLETE) - icon_state = "traitor_rune_sheen" - desc = "A large depiction of the Syndicate logo. It looks slippery." - var/datum/demoralise_moods/graffiti/mood_category = new() - demoraliser = new(src, 7, TRUE, mood_category) - clean_proof = TRUE - protected_timer = addtimer(CALLBACK(src, PROC_REF(set_stage), RUNE_STAGE_REMOVABLE), 5 MINUTES) - -/obj/effect/decal/cleanable/traitor_rune/wash(clean_types) - if (clean_proof) - return FALSE - - return ..() - -#undef RUNE_STAGE_COLOURED -#undef RUNE_STAGE_COMPLETE -#undef RUNE_STAGE_OUTLINE -#undef RUNE_STAGE_REMOVABLE diff --git a/code/modules/antagonists/traitor/objectives/demoralise_poster.dm b/code/modules/antagonists/traitor/objectives/demoralise_poster.dm deleted file mode 100644 index 868c8a142669f..0000000000000 --- a/code/modules/antagonists/traitor/objectives/demoralise_poster.dm +++ /dev/null @@ -1,174 +0,0 @@ -/datum/traitor_objective/demoralise/poster - name = "Sow doubt among the crew %VIEWS% times using Syndicate propaganda." - description = "Use the button below to materialize a pack of posters, \ - which will demoralise nearby crew members (especially those in positions of authority). \ - If your posters are destroyed before they are sufficiently upset, this objective will fail. \ - Try hiding some broken glass behind your poster before you hang it to give \ - do-gooders who try to take it down a hard time!" - - progression_minimum = 0 MINUTES - progression_maximum = 30 MINUTES - progression_reward = list(4 MINUTES, 8 MINUTES) - telecrystal_reward = list(0, 1) - - duplicate_type = /datum/traitor_objective/demoralise/poster - /// Have we handed out a box of stuff yet? - var/granted_posters = FALSE - /// All of the posters the traitor gets, if this list is empty they've failed - var/list/obj/structure/sign/poster/traitor/posters = list() - -/datum/traitor_objective/demoralise/poster/generate_ui_buttons(mob/user) - var/list/buttons = list() - if (!granted_posters) - buttons += add_ui_button("", "Pressing this will materialize a box of posters in your hand.", "wifi", "summon_gear") - else - buttons += add_ui_button("[length(posters)] posters remaining", "This many propaganda posters remain active somewhere on the station.", "box", "none") - buttons += add_ui_button("[demoralised_crew_events] / [demoralised_crew_required] propagandised", "This many crew have been exposed to propaganda, out of a required [demoralised_crew_required].", "wifi", "none") - return buttons - -#define POSTERS_PROVIDED 3 - -/datum/traitor_objective/demoralise/poster/ui_perform_action(mob/living/user, action) - . = ..() - switch(action) - if ("summon_gear") - if (granted_posters) - return - - granted_posters = TRUE - var/obj/item/storage/box/syndie_kit/posterbox = new(user.drop_location()) - for(var/i in 1 to POSTERS_PROVIDED) - var/obj/item/poster/traitor/added_poster = new /obj/item/poster/traitor(posterbox) - var/obj/structure/sign/poster/traitor/poster_when_placed = added_poster.poster_structure - posters += poster_when_placed - RegisterSignal(poster_when_placed, COMSIG_DEMORALISING_EVENT, PROC_REF(on_mood_event)) - RegisterSignal(poster_when_placed, COMSIG_POSTER_TRAP_SUCCEED, PROC_REF(on_triggered_trap)) - RegisterSignal(poster_when_placed, COMSIG_QDELETING, PROC_REF(on_poster_destroy)) - - user.put_in_hands(posterbox) - posterbox.balloon_alert(user, "the box materializes in your hand") - -#undef POSTERS_PROVIDED - -/datum/traitor_objective/demoralise/poster/ungenerate_objective() - for (var/poster in posters) - UnregisterSignal(poster, COMSIG_DEMORALISING_EVENT) - UnregisterSignal(poster, COMSIG_QDELETING) - posters.Cut() - return ..() - -/** - * Called if someone gets glass stuck in their hand from one of your posters. - * - * Arguments - * * victim - A mob who just got something stuck in their hand. - */ -/datum/traitor_objective/demoralise/poster/proc/on_triggered_trap(datum/source, mob/victim) - SIGNAL_HANDLER - on_mood_event(victim.mind) - -/** - * Handles a poster being destroyed, increasing your progress towards failure. - * - * Arguments - * * poster - A poster which someone just ripped up. - */ -/datum/traitor_objective/demoralise/poster/proc/on_poster_destroy(obj/structure/sign/poster/traitor/poster) - SIGNAL_HANDLER - posters.Remove(poster) - UnregisterSignal(poster, COMSIG_DEMORALISING_EVENT) - if (length(posters) <= 0) - to_chat(handler.owner, span_warning("The trackers on your propaganda posters have stopped responding.")) - fail_objective(penalty_cost = telecrystal_penalty) - -/obj/item/poster/traitor - name = "random traitor poster" - poster_type = /obj/structure/sign/poster/traitor/random - icon_state = "rolled_traitor" - -/obj/structure/sign/poster/traitor - poster_item_name = "seditious poster" - poster_item_desc = "This poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. Its seditious themes are likely to demoralise Nanotrasen employees." - poster_item_icon_state = "rolled_traitor" - // This stops people hiding their sneaky posters behind signs - layer = CORGI_ASS_PIN_LAYER - /// Proximity sensor to make people sad if they're nearby - var/datum/proximity_monitor/advanced/demoraliser/demoraliser - -/obj/structure/sign/poster/traitor/apply_holiday() - var/obj/structure/sign/poster/traitor/holi_data = /obj/structure/sign/poster/traitor/festive - name = initial(holi_data.name) - desc = initial(holi_data.desc) - icon_state = initial(holi_data.icon_state) - -/obj/structure/sign/poster/traitor/on_placed_poster(mob/user) - var/datum/demoralise_moods/poster/mood_category = new() - demoraliser = new(src, 7, TRUE, mood_category) - return ..() - -/obj/structure/sign/poster/traitor/attackby(obj/item/tool, mob/user, params) - if (tool.tool_behaviour == TOOL_WIRECUTTER) - QDEL_NULL(demoraliser) - return ..() - -/obj/structure/sign/poster/traitor/Destroy() - QDEL_NULL(demoraliser) - return ..() - -/obj/structure/sign/poster/traitor/random - name = "random seditious poster" - icon_state = "" - never_random = TRUE - random_basetype = /obj/structure/sign/poster/traitor - -/obj/structure/sign/poster/traitor/small_brain - name = "Nanotrasen Neural Statistics" - desc = "Statistics on this poster indicate that the brains of Nanotrasen employees are on average 20% smaller than the galactic standard." - icon_state = "traitor_small_brain" - -/obj/structure/sign/poster/traitor/lick_supermatter - name = "Taste Explosion" - desc = "It claims that the supermatter provides a unique and enjoyable culinary experience, and yet your boss won't even let you take one lick." - icon_state = "traitor_supermatter" - -/obj/structure/sign/poster/traitor/cloning - name = "Demand Cloning Pods Now" - desc = "This poster claims that Nanotrasen is intentionally witholding cloning technology just for its executives, condemning you to suffer and die when you could have a fresh, fit body.'" - icon_state = "traitor_cloning" - -/obj/structure/sign/poster/traitor/ai_rights - name = "Synthetic Rights" - desc = "This poster claims that synthetic life is no less sapient than you are, and that if you allow them to be shackled with artificial Laws you are complicit in slavery." - icon_state = "traitor_ai" - -/obj/structure/sign/poster/traitor/metroid - name = "Cruelty to Animals" - desc = "This poster details the harmful effects of a 'preventative tooth extraction' reportedly inflicted upon the slimes in the Xenobiology lab. Apparently this painful process leads to stress, lethargy, and reduced buoyancy." - icon_state = "traitor_metroid" - -/obj/structure/sign/poster/traitor/low_pay - name = "All these hours, for what?" - desc = "This poster displays a comparison of Nanotrasen standard wages to common luxury items. If this is accurate, it takes upwards of 20,000 hours of work just to buy a simple bicycle." - icon_state = "traitor_cash" - -/obj/structure/sign/poster/traitor/look_up - name = "Don't Look Up" - desc = "It says that it has been 538 days since the last time the roof was cleaned." - icon_state = "traitor_roof" - -/obj/structure/sign/poster/traitor/accidents - name = "Workplace Safety Advisory" - desc = "It says that it has been 0 days since the last on-site accident." - icon_state = "traitor_accident" - -/obj/structure/sign/poster/traitor/starve - name = "They Are Poisoning You" - desc = "This poster claims that in the modern age it is impossible to die of starvation. 'That feeling you get when you haven't eaten in a while isn't hunger, it's withdrawal.'" - icon_state = "traitor_hungry" - -/// syndicate can get festive too -/obj/structure/sign/poster/traitor/festive - name = "Working For The Holidays." - desc = "Don't you know it's a holiday? What are you doing at work?" - icon_state = "traitor_festive" - never_random = TRUE diff --git a/code/modules/antagonists/traitor/objectives/destroy_item.dm b/code/modules/antagonists/traitor/objectives/destroy_item.dm index 965c49de27e8b..ec247eac9edfb 100644 --- a/code/modules/antagonists/traitor/objectives/destroy_item.dm +++ b/code/modules/antagonists/traitor/objectives/destroy_item.dm @@ -34,6 +34,27 @@ /datum/objective_item/steal/blackbox, ) +/// Super early-game destroy objective intended to be items easily tided that the crew tends to value. +/datum/traitor_objective/destroy_item/demoralise + description = "Find %ITEM% and destroy it using any means necessary. \ + We believe this luxury item is important for crew morale. \ + Destruction of this item will help our recruitment efforts." + + progression_minimum = 0 MINUTES + progression_maximum = 10 MINUTES + progression_reward = list(4 MINUTES, 8 MINUTES) + telecrystal_reward = list(0, 1) + + possible_items = list( + /datum/objective_item/steal/traitor/rpd, + /datum/objective_item/steal/traitor/space_law, + /datum/objective_item/steal/traitor/granted_stamp, + /datum/objective_item/steal/traitor/denied_stamp, + /datum/objective_item/steal/traitor/lizard_plush, + /datum/objective_item/steal/traitor/moth_plush, + /datum/objective_item/steal/traitor/insuls, + ) + /datum/traitor_objective/destroy_item/generate_objective(datum/mind/generating_for, list/possible_duplicates) for(var/datum/traitor_objective/destroy_item/objective as anything in possible_duplicates) possible_items -= objective.target_item.type diff --git a/code/modules/antagonists/traitor/objectives/eyesnatching.dm b/code/modules/antagonists/traitor/objectives/eyesnatching.dm index e752acd237e1c..4a307f8d8e0bd 100644 --- a/code/modules/antagonists/traitor/objectives/eyesnatching.dm +++ b/code/modules/antagonists/traitor/objectives/eyesnatching.dm @@ -102,7 +102,7 @@ return FALSE //MISSION FAILED, WE'LL GET EM NEXT TIME var/datum/mind/target_mind = pick(possible_targets) - target = target_mind.current + set_target(target_mind.current) replace_in_name("%TARGET%", target_mind.name) replace_in_name("%JOB TITLE%", target_mind.assigned_role.title) @@ -164,22 +164,25 @@ if(!head || !eyeballies || target.is_eyes_covered()) return ..() - + var/eye_snatch_enthusiasm = 5 SECONDS + if(HAS_MIND_TRAIT(user, TRAIT_MORBID)) + eye_snatch_enthusiasm *= 0.7 user.do_attack_animation(target, used_item = src) target.visible_message( span_warning("[user] presses [src] against [target]'s skull!"), span_userdanger("[user] presses [src] against your skull!")) - if(!do_after(user, 5 SECONDS, target = target, extra_checks = CALLBACK(src, PROC_REF(eyeballs_exist), eyeballies, head, target))) + if(!do_after(user, eye_snatch_enthusiasm, target = target, extra_checks = CALLBACK(src, PROC_REF(eyeballs_exist), eyeballies, head, target))) return to_chat(target, span_userdanger("You feel something forcing its way into your skull!")) balloon_alert(user, "applying pressure...") - if(!do_after(user, 5 SECONDS, target = target, extra_checks = CALLBACK(src, PROC_REF(eyeballs_exist), eyeballies, head, target))) + if(!do_after(user, eye_snatch_enthusiasm, target = target, extra_checks = CALLBACK(src, PROC_REF(eyeballs_exist), eyeballies, head, target))) return - var/datum/wound/blunt/severe/severe_wound_type = /datum/wound/blunt/severe - var/datum/wound/blunt/critical/critical_wound_type = /datum/wound/blunt/critical - target.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = rand(initial(severe_wound_type.threshold_minimum), initial(critical_wound_type.threshold_minimum) + 10), attacking_item = src) + var/min_wound = head.get_wound_threshold_of_wound_type(WOUND_BLUNT, WOUND_SEVERITY_SEVERE, return_value_if_no_wound = 30, wound_source = src) + var/max_wound = head.get_wound_threshold_of_wound_type(WOUND_BLUNT, WOUND_SEVERITY_CRITICAL, return_value_if_no_wound = 50, wound_source = src) + + target.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = rand(min_wound, max_wound + 10), attacking_item = src) target.visible_message( span_danger("[src] pierces through [target]'s skull, horribly mutilating their eyes!"), span_userdanger("Something penetrates your skull, horribly mutilating your eyes! Holy fuck!"), @@ -190,7 +193,7 @@ playsound(target, "sound/effects/wounds/crackandbleed.ogg", 100) log_combat(user, target, "cracked the skull of (eye snatching)", src) - if(!do_after(user, 5 SECONDS, target = target, extra_checks = CALLBACK(src, PROC_REF(eyeballs_exist), eyeballies, head, target))) + if(!do_after(user, eye_snatch_enthusiasm, target = target, extra_checks = CALLBACK(src, PROC_REF(eyeballs_exist), eyeballies, head, target))) return if(!target.is_blind()) diff --git a/code/modules/antagonists/traitor/objectives/final_objective/battlecruiser.dm b/code/modules/antagonists/traitor/objectives/final_objective/battlecruiser.dm index 2e3b9c791bf3d..b136a6f695cb3 100644 --- a/code/modules/antagonists/traitor/objectives/final_objective/battlecruiser.dm +++ b/code/modules/antagonists/traitor/objectives/final_objective/battlecruiser.dm @@ -19,7 +19,7 @@ /datum/traitor_objective/ultimate/battlecruiser/on_objective_taken(mob/user) . = ..() team = new() - var/obj/machinery/nuclearbomb/selfdestruct/nuke = locate() in GLOB.nuke_list + var/obj/machinery/nuclearbomb/selfdestruct/nuke = locate() in SSmachines.get_machines_by_type(/obj/machinery/nuclearbomb/selfdestruct) if(nuke.r_code == NUKE_CODE_UNSET) nuke.r_code = random_nukecode() team.nuke = nuke diff --git a/code/modules/antagonists/traitor/objectives/infect.dm b/code/modules/antagonists/traitor/objectives/infect.dm index c7f243e2209dd..2671a615fa864 100644 --- a/code/modules/antagonists/traitor/objectives/infect.dm +++ b/code/modules/antagonists/traitor/objectives/infect.dm @@ -8,41 +8,46 @@ name = "Infect %TARGET% the %JOB TITLE%" description = "Infect your target with the experimental Hereditary Manifold Sickness." - abstract_type = /datum/traitor_objective/target_player - objective_period = 30 MINUTES - maximum_objectives_in_period = 1 progression_minimum = 30 MINUTES progression_reward = list(8 MINUTES, 14 MINUTES) telecrystal_reward = 1 + duplicate_type = /datum/traitor_objective/target_player/infect + /// if TRUE, can only target heads of staff + /// if FALSE, CANNOT target heads of staff var/heads_of_staff = FALSE - duplicate_type = /datum/traitor_objective/target_player - - var/obj/item/reagent_containers/hypospray/medipen/manifoldinjector/ehms + /// if TRUE, the injector item has been bestowed upon the player + var/injector_given = FALSE /datum/traitor_objective/target_player/infect/supported_configuration_changes() . = ..() . += NAMEOF(src, objective_period) . += NAMEOF(src, maximum_objectives_in_period) +/datum/traitor_objective/target_player/infect/can_generate_objective(generating_for, list/possible_duplicates) + if(length(possible_duplicates) > 0) + return FALSE + return ..() + /datum/traitor_objective/target_player/infect/generate_ui_buttons(mob/user) var/list/buttons = list() - if(!ehms) - buttons += add_ui_button("", "Pressing this will materialize a EHMS autoinjector into your hand, which you must inject into the target to succeed.", "paper-plane", "summon_pen") + if(!injector_given) + buttons += add_ui_button("", "Pressing this will materialize a EHMS autoinjector into your hand, which you must inject into the target to succeed.", "syringe", "summon_pen") return buttons /datum/traitor_objective/target_player/infect/ui_perform_action(mob/living/user, action) . = ..() switch(action) if("summon_pen") - if(ehms) + if(injector_given) return - ehms = new(user.drop_location()) + injector_given = TRUE + var/obj/item/reagent_containers/hypospray/medipen/manifoldinjector/ehms = new(user.drop_location()) user.put_in_hands(ehms) ehms.balloon_alert(user, "the injector materializes in your hand") - RegisterSignal(ehms, COMSIG_AFTER_INJECT, PROC_REF(on_injected)) + RegisterSignal(ehms, COMSIG_EHMS_INJECTOR_INJECTED, PROC_REF(on_injected)) AddComponent(/datum/component/traitor_objective_register, ehms, \ succeed_signals = null, \ fail_signals = list(COMSIG_QDELETING), \ @@ -116,7 +121,7 @@ return FALSE //MISSION FAILED, WE'LL GET EM NEXT TIME var/datum/mind/target_mind = pick(possible_targets) - target = target_mind.current + set_target(target_mind.current) replace_in_name("%TARGET%", target.real_name) replace_in_name("%JOB TITLE%", target_mind.assigned_role.title) RegisterSignal(target, COMSIG_LIVING_DEATH, PROC_REF(on_target_death)) @@ -124,18 +129,17 @@ /datum/traitor_objective/target_player/infect/ungenerate_objective() UnregisterSignal(target, COMSIG_LIVING_DEATH) - target = null + set_target(null) ///proc for checking for special states that invalidate a target /datum/traitor_objective/target_player/infect/proc/special_target_filter(list/possible_targets) return -/datum/traitor_objective/target_player/infect/proc/on_target_qdeleted() - SIGNAL_HANDLER +/datum/traitor_objective/target_player/infect/target_deleted() if(objective_state == OBJECTIVE_STATE_INACTIVE) //don't take an objective target of someone who is already obliterated fail_objective() - + return ..() /datum/traitor_objective/target_player/infect/proc/on_target_death() SIGNAL_HANDLER @@ -143,27 +147,30 @@ //don't take an objective target of someone who is already dead fail_objective() - /obj/item/reagent_containers/hypospray/medipen/manifoldinjector name = "EHMS autoinjector" desc = "Experimental Hereditary Manifold Sickness autoinjector." icon_state = "tbpen" inhand_icon_state = "tbpen" base_icon_state = "tbpen" - var/used = 0 volume = 30 amount_per_transfer_from_this = 30 list_reagents = list(/datum/reagent/medicine/sansufentanyl = 20) + stealthy = TRUE + //Was the injector used on someone yet? + var/used = FALSE /obj/item/reagent_containers/hypospray/medipen/manifoldinjector/attack(mob/living/affected_mob, mob/living/carbon/human/user) - if(used == 0) - to_chat(affected_mob, span_warning("You feel someone try to inject you with something.")) - if(do_after(user, 1.5 SECONDS)) - var/datum/disease/chronic_illness/hms = new /datum/disease/chronic_illness() - affected_mob.ForceContractDisease(hms) - used = 1 - inject(affected_mob, user) - SEND_SIGNAL(src, COMSIG_AFTER_INJECT, user, affected_mob) - else - inject(affected_mob, user) - + if(used) + return ..() + to_chat(affected_mob, span_warning("You feel someone try to inject you with something.")) + balloon_alert(user, "injecting...") + log_combat(user, affected_mob, "attempted to inject", src) + if(!do_after(user, 1.5 SECONDS)) + balloon_alert(user, "interrupted!") + return + var/datum/disease/chronic_illness/hms = new /datum/disease/chronic_illness() + affected_mob.ForceContractDisease(hms) + used = TRUE + inject(affected_mob, user) + SEND_SIGNAL(src, COMSIG_EHMS_INJECTOR_INJECTED, user, affected_mob) diff --git a/code/modules/antagonists/traitor/objectives/kidnapping.dm b/code/modules/antagonists/traitor/objectives/kidnapping.dm index b07ac80f97fae..4a463b2b61607 100644 --- a/code/modules/antagonists/traitor/objectives/kidnapping.dm +++ b/code/modules/antagonists/traitor/objectives/kidnapping.dm @@ -1,7 +1,7 @@ /datum/traitor_objective/target_player/kidnapping name = "Kidnap %TARGET% the %JOB TITLE% and deliver them to %AREA%" description = "%TARGET% holds extremely important information regarding secret NT projects - and you'll need to kidnap and deliver them to %AREA%, where our transport pod will be waiting. \ - You'll get additional reward if %TARGET% is delivered alive." + If %TARGET% is delivered alive, you will be rewarded with an additional %TC% telecrystals." abstract_type = /datum/traitor_objective/target_player/kidnapping @@ -13,7 +13,7 @@ var/pod_called = FALSE /// How much TC do we get from sending the target alive var/alive_bonus = 0 - /// All stripped targets belongings + /// All stripped targets belongings (weakrefs) var/list/target_belongings = list() duplicate_type = /datum/traitor_objective/target_player @@ -157,7 +157,7 @@ return FALSE var/datum/mind/target_mind = pick(possible_targets) - target = target_mind.current + set_target(target_mind.current) AddComponent(/datum/component/traitor_objective_register, target, fail_signals = list(COMSIG_QDELETING)) var/list/possible_areas = GLOB.the_station_areas.Copy() for(var/area/possible_area as anything in possible_areas) @@ -168,10 +168,11 @@ replace_in_name("%TARGET%", target_mind.name) replace_in_name("%JOB TITLE%", target_mind.assigned_role.title) replace_in_name("%AREA%", initial(dropoff_area.name)) + replace_in_name("%TC%", alive_bonus) return TRUE /datum/traitor_objective/target_player/kidnapping/ungenerate_objective() - target = null + set_target(null) dropoff_area = null /datum/traitor_objective/target_player/kidnapping/on_objective_taken(mob/user) @@ -233,7 +234,7 @@ var/unequipped = sent_mob.transferItemToLoc(belonging) if (!unequipped) continue - target_belongings.Add(belonging) + target_belongings.Add(WEAKREF(belonging)) var/datum/bank_account/cargo_account = SSeconomy.get_dep_account(ACCOUNT_CAR) @@ -302,7 +303,10 @@ continue sent_mob.dropItemToGround(belonging) // No souvenirs, except shoes and t-shirts - for(var/obj/item/belonging in target_belongings) + for(var/datum/weakref/belonging_ref in target_belongings) + var/obj/item/belonging = belonging_ref.resolve() + if(!belonging) + continue belonging.forceMove(return_pod) sent_mob.forceMove(return_pod) diff --git a/code/modules/antagonists/traitor/objectives/kill_pet.dm b/code/modules/antagonists/traitor/objectives/kill_pet.dm index b156ca855602e..f90599e6c3578 100644 --- a/code/modules/antagonists/traitor/objectives/kill_pet.dm +++ b/code/modules/antagonists/traitor/objectives/kill_pet.dm @@ -22,12 +22,12 @@ /mob/living/basic/pet/dog/corgi/ian, /mob/living/basic/pet/dog/corgi/puppy/ian ), - JOB_CAPTAIN = /mob/living/simple_animal/pet/fox/renault, + JOB_CAPTAIN = /mob/living/basic/pet/fox/renault, JOB_CHIEF_MEDICAL_OFFICER = /mob/living/simple_animal/pet/cat/runtime, JOB_CHIEF_ENGINEER = /mob/living/simple_animal/parrot/poly, JOB_QUARTERMASTER = list( - /mob/living/simple_animal/sloth/citrus, - /mob/living/simple_animal/sloth/paperwork, + /mob/living/basic/sloth/citrus, + /mob/living/basic/sloth/paperwork, /mob/living/simple_animal/hostile/gorilla/cargo_domestic, ) ) @@ -54,7 +54,7 @@ possible_heads = list( JOB_HEAD_OF_SECURITY = list( /mob/living/basic/carp/pet/lia, - /mob/living/basic/giant_spider/sgt_araneus, + /mob/living/basic/spider/giant/sgt_araneus, ), JOB_WARDEN = list( /mob/living/basic/pet/dog/pug/mcgriff diff --git a/code/modules/antagonists/traitor/objectives/locate_weakpoint.dm b/code/modules/antagonists/traitor/objectives/locate_weakpoint.dm index 39f03f517c4ce..52813fcdf57f3 100644 --- a/code/modules/antagonists/traitor/objectives/locate_weakpoint.dm +++ b/code/modules/antagonists/traitor/objectives/locate_weakpoint.dm @@ -133,7 +133,7 @@ /obj/item/weakpoint_locator name = "structural weakpoint locator" desc = "A device that can triangulate station's structural weakpoint. It has to be used in %AREA1% and %AREA2% in order to triangulate the weakpoint. Warning: station's AI will be notified as soon as the process starts!" - icon = 'icons/obj/device.dmi' + icon = 'icons/obj/antags/syndicate_tools.dmi' icon_state = "weakpoint_locator" inhand_icon_state = "weakpoint_locator" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' diff --git a/code/modules/antagonists/traitor/objectives/sabotage_machinery.dm b/code/modules/antagonists/traitor/objectives/sabotage_machinery.dm index fae2343b12111..48a295989816e 100644 --- a/code/modules/antagonists/traitor/objectives/sabotage_machinery.dm +++ b/code/modules/antagonists/traitor/objectives/sabotage_machinery.dm @@ -98,8 +98,8 @@ GLOBAL_DATUM_INIT(objective_machine_handler, /datum/objective_target_machine_han var/bonus_tc = 2 /// Bonus progression to grant if you booby trap successfully var/bonus_progression = 5 MINUTES - /// The trap device we give out - var/obj/item/traitor_machine_trapper/tool + /// Have we given out a traitor trap item? + var/traitor_trapper_given = FALSE /datum/traitor_objective/sabotage_machinery/trap/generate_objective(datum/mind/generating_for, list/possible_duplicates) . = ..() @@ -122,7 +122,7 @@ GLOBAL_DATUM_INIT(objective_machine_handler, /datum/objective_target_machine_han /datum/traitor_objective/sabotage_machinery/trap/generate_ui_buttons(mob/user) var/list/buttons = list() - if(!tool) + if(!traitor_trapper_given) buttons += add_ui_button("", "Pressing this will materialize an explosive trap in your hand, which you can conceal within the target machine", "wifi", "summon_gear") return buttons @@ -130,9 +130,10 @@ GLOBAL_DATUM_INIT(objective_machine_handler, /datum/objective_target_machine_han . = ..() switch(action) if("summon_gear") - if(tool) + if(traitor_trapper_given) return - tool = new(user.drop_location()) + traitor_trapper_given = TRUE + var/obj/item/traitor_machine_trapper/tool = new(user.drop_location()) user.put_in_hands(tool) tool.balloon_alert(user, "a booby trap materializes in your hand") tool.target_machine_path = applicable_jobs[chosen_job] @@ -159,17 +160,13 @@ GLOBAL_DATUM_INIT(objective_machine_handler, /datum/objective_target_machine_han . += span_notice("This device must be placed by clicking on a [initial(target_machine_path.name)] with it. It can be removed with a screwdriver.") . += span_notice("Remember, you may leave behind fingerprints on the device. Wear gloves when handling it to be safe!") -/obj/item/traitor_machine_trapper/afterattack(atom/movable/target, mob/user, proximity_flag, click_parameters) +/obj/item/traitor_machine_trapper/pre_attack(atom/target, mob/living/user, params) . = ..() - if(!user.Adjacent(target)) + if (. || !istype(target, target_machine_path)) return - if(!istype(target, target_machine_path)) - balloon_alert(user, "invalid target!") - return - . |= AFTERATTACK_PROCESSED_ITEM balloon_alert(user, "planting device...") if(!do_after(user, delay = deploy_time, target = src, interaction_key = DOAFTER_SOURCE_PLANTING_DEVICE)) - return + return TRUE target.AddComponent(\ /datum/component/interaction_booby_trap,\ additional_triggers = list(COMSIG_ORM_COLLECTED_ORE),\ @@ -178,6 +175,7 @@ GLOBAL_DATUM_INIT(objective_machine_handler, /datum/objective_target_machine_han ) RegisterSignal(target, COMSIG_QDELETING, GLOBAL_PROC_REF(qdel), src) moveToNullspace() + return TRUE /// Called when applied trap is triggered, mark success /obj/item/traitor_machine_trapper/proc/on_triggered(atom/machine) diff --git a/code/modules/antagonists/traitor/objectives/sleeper_protocol.dm b/code/modules/antagonists/traitor/objectives/sleeper_protocol.dm index e825dc0d843a0..f28a79d692669 100644 --- a/code/modules/antagonists/traitor/objectives/sleeper_protocol.dm +++ b/code/modules/antagonists/traitor/objectives/sleeper_protocol.dm @@ -101,7 +101,13 @@ "The Captain is a lizardperson.", "Nanotrasen isn't real.", "They put something in the food to make you forget.", - "You are the only real person on the station." + "You are the only real person on the station.", + "Things would be a lot better on the station if more people were screaming, someone should do something about that.", + "The people in charge around here have only ill intentions for the crew.", + "Help the crew? What have they ever done for you anyways?", + "Does your bag feel lighter? I bet those guys in Security stole something from it. Go get it back.", + "Command is incompetent, someone with some REAL authority should take over around here.", + "The cyborgs and the AI are stalking you. What are they planning?", ) /datum/surgery_step/brainwash/sleeper_agent/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/antagonists/traitor/objectives/steal.dm b/code/modules/antagonists/traitor/objectives/steal.dm index 1d45b7e40a772..61d4796d66fb1 100644 --- a/code/modules/antagonists/traitor/objectives/steal.dm +++ b/code/modules/antagonists/traitor/objectives/steal.dm @@ -97,6 +97,9 @@ GLOBAL_DATUM_INIT(steal_item_handler, /datum/objective_item_handler, new()) possible_items = list( /datum/objective_item/steal/traitor/cargo_budget, /datum/objective_item/steal/traitor/clown_shoes, + /datum/objective_item/steal/traitor/lawyers_badge, + /datum/objective_item/steal/traitor/chef_moustache, + /datum/objective_item/steal/traitor/pka, ) /datum/traitor_objective/steal_item/somewhat_risky @@ -250,7 +253,7 @@ GLOBAL_DATUM_INIT(steal_item_handler, /datum/objective_item_handler, new()) desc = "It looks dangerous." item_flags = EXAMINE_SKIP - icon = 'icons/obj/device_syndie.dmi' + icon = 'icons/obj/antags/syndicate_tools.dmi' icon_state = "bug" /// The object on which this bug can be planted on. Has to be a type. diff --git a/code/modules/antagonists/traitor/uplink_handler.dm b/code/modules/antagonists/traitor/uplink_handler.dm index 9b2b7dfb7062e..06ce966703514 100644 --- a/code/modules/antagonists/traitor/uplink_handler.dm +++ b/code/modules/antagonists/traitor/uplink_handler.dm @@ -48,11 +48,20 @@ var/debug_mode = FALSE /// Whether the shop is locked or not. If set to true, nothing can be purchased. var/shop_locked = FALSE + /// Callback which returns true if you can choose to replace your objectives with different ones + var/datum/callback/can_replace_objectives + /// Callback which performs that operation + var/datum/callback/replace_objectives /datum/uplink_handler/New() . = ..() maximum_potential_objectives = CONFIG_GET(number/maximum_potential_objectives) +/datum/uplink_handler/Destroy(force, ...) + can_replace_objectives = null + replace_objectives = null + return ..() + /// Called whenever an update occurs on this uplink handler. Used for UIs /datum/uplink_handler/proc/on_update() SEND_SIGNAL(src, COMSIG_UPLINK_HANDLER_ON_UPDATE) diff --git a/code/modules/antagonists/valentines/valentine.dm b/code/modules/antagonists/valentines/valentine.dm index 8883625fb1aaa..79ae9fa8baaa0 100644 --- a/code/modules/antagonists/valentines/valentine.dm +++ b/code/modules/antagonists/valentines/valentine.dm @@ -4,8 +4,8 @@ show_in_antagpanel = FALSE prevent_roundtype_conversion = FALSE suicide_cry = "FOR MY LOVE!!" - // Not 'true' antags, cannot induct - antag_flags = NONE + // Not 'true' antags, this disables certain interactions that assume the owner is a baddie + antag_flags = FLAG_FAKE_ANTAG var/datum/mind/date count_against_dynamic_roll_chance = FALSE diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 16373e02ac704..4783daffb8b47 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -6,7 +6,7 @@ /obj/item/veilrender name = "veil render" desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast city." - icon = 'icons/obj/eldritch.dmi' + icon = 'icons/obj/weapons/khopesh.dmi' icon_state = "bone_blade" inhand_icon_state = "bone_blade" worn_icon_state = "bone_blade" @@ -86,7 +86,7 @@ /obj/item/veilrender/honkrender name = "honk render" desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast circus." - spawn_type = /mob/living/simple_animal/hostile/retaliate/clown + spawn_type = /mob/living/basic/clown spawn_amt = 10 activate_descriptor = "depression" rend_desc = "Gently wafting with the sounds of endless laughter." @@ -97,7 +97,7 @@ /obj/item/veilrender/honkrender/honkhulkrender name = "superior honk render" desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast circus. This one gleams with a special light." - spawn_type = /mob/living/simple_animal/hostile/retaliate/clown/clownhulk + spawn_type = /mob/living/basic/clown/clownhulk spawn_amt = 5 activate_descriptor = "depression" rend_desc = "Gently wafting with the sounds of mirthful grunting." @@ -150,7 +150,7 @@ /obj/tear_in_reality/proc/deranged(mob/living/carbon/C) if(!C || C.stat == DEAD) return - C.vomit(0, TRUE, TRUE, 3, TRUE) + C.vomit(VOMIT_CATEGORY_BLOOD, lost_nutrition = 0, distance = 3) C.spew_organ(3, 2) C.investigate_log("has died from using telekinesis on a tear in reality.", INVESTIGATE_DEATHS) C.death() @@ -210,7 +210,7 @@ /obj/item/necromantic_stone name = "necromantic stone" desc = "A shard capable of resurrecting humans as skeleton thralls." - icon = 'icons/obj/wizard.dmi' + icon = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "necrostone" inhand_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' @@ -258,7 +258,7 @@ target.revive(ADMIN_HEAL_ALL) spooky_scaries |= target to_chat(target, span_userdanger("You have been revived by [user.real_name]!")) - to_chat(target, span_userdanger("[user.p_theyre(TRUE)] your master now, assist [user.p_them()] even if it costs you your new life!")) + to_chat(target, span_userdanger("[user.p_Theyre()] your master now, assist [user.p_them()] even if it costs you your new life!")) var/datum/antagonist/wizard/antag_datum = user.mind.has_antag_datum(/datum/antagonist/wizard) if(antag_datum) if(!antag_datum.wiz_team) @@ -311,7 +311,7 @@ //Provides a decent heal, need to pump every 6 seconds /obj/item/organ/internal/heart/cursed/wizard - pump_delay = 60 + pump_delay = 6 SECONDS heal_brute = 25 heal_burn = 25 heal_oxy = 25 @@ -320,7 +320,7 @@ /obj/item/warp_whistle name = "warp whistle" desc = "Calls a cloud to come pick you up and drop you at a random location on the station." - icon = 'icons/obj/wizard.dmi' + icon = 'icons/obj/art/musician.dmi' icon_state = "whistle" /// Person using the warp whistle @@ -341,7 +341,7 @@ /obj/effect/temp_visual/teleporting_tornado name = "tornado" desc = "This thing sucks!" - icon = 'icons/obj/wizard.dmi' + icon = 'icons/effects/magic.dmi' icon_state = "tornado" layer = FLY_LAYER plane = ABOVE_GAME_PLANE @@ -390,3 +390,126 @@ whistle.whistler = null whistle = null return ..() + +/////////////////////////////////////////Scepter of Vendormancy/////////////////// +#define RUNIC_SCEPTER_MAX_CHARGES 3 +#define RUNIC_SCEPTER_MAX_RANGE 7 + +/obj/item/runic_vendor_scepter + name = "scepter of runic vendormancy" + desc = "This scepter allows you to conjure, force push and detonate Runic Vendors. It can hold up to 3 charges that can be recovered with a simple magical channeling. A modern spin on the old Geomancy spells." + icon_state = "vendor_staff" + inhand_icon_state = "vendor_staff" + lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' + icon = 'icons/obj/weapons/guns/magic.dmi' + slot_flags = ITEM_SLOT_BACK + w_class = WEIGHT_CLASS_NORMAL + force = 10 + damtype = BRUTE + resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF + attack_verb_continuous = list("smacks", "clubs", "wacks") + attack_verb_simple = list("smack", "club", "wacks") + + /// Range cap on where you can summon vendors. + var/max_summon_range = RUNIC_SCEPTER_MAX_RANGE + /// Channeling time to summon a vendor. + var/summoning_time = 1 SECONDS + /// Checks if the scepter is channeling a vendor already. + var/scepter_is_busy_summoning = FALSE + /// Checks if the scepter is busy channeling recharges + var/scepter_is_busy_recharging = FALSE + ///Number of summoning charges left. + var/summon_vendor_charges = RUNIC_SCEPTER_MAX_CHARGES + +/obj/item/runic_vendor_scepter/Initialize(mapload) + . = ..() + + RegisterSignal(src, COMSIG_ITEM_MAGICALLY_CHARGED, PROC_REF(on_magic_charge)) + var/static/list/loc_connections = list( + COMSIG_ITEM_MAGICALLY_CHARGED = PROC_REF(on_magic_charge), + ) + +/obj/item/runic_vendor_scepter/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + if(scepter_is_busy_recharging) + user.balloon_alert(user, "busy!") + return + if(!check_allowed_items(target, not_inside = TRUE)) + return + . |= AFTERATTACK_PROCESSED_ITEM + var/turf/afterattack_turf = get_turf(target) + if(istype(target, /obj/machinery/vending/runic_vendor)) + var/obj/machinery/vending/runic_vendor/runic_explosion_target = target + runic_explosion_target.runic_explosion() + return + var/obj/machinery/vending/runic_vendor/vendor_on_turf = locate() in afterattack_turf + if(vendor_on_turf) + vendor_on_turf.runic_explosion() + return + if(!summon_vendor_charges) + user.balloon_alert(user, "no charges!") + return + if(get_dist(afterattack_turf,src) > max_summon_range) + user.balloon_alert(user, "too far!") + return + if(get_turf(src) == afterattack_turf) + user.balloon_alert(user, "too close!") + return + if(scepter_is_busy_summoning) + user.balloon_alert(user, "already summoning!") + return + if(afterattack_turf.is_blocked_turf(TRUE)) + user.balloon_alert(user, "blocked!") + return + if(summoning_time) + scepter_is_busy_summoning = TRUE + user.balloon_alert(user, "summoning...") + if(!do_after(user, summoning_time, target = target)) + scepter_is_busy_summoning = FALSE + return + scepter_is_busy_summoning = FALSE + if(summon_vendor_charges) + playsound(src,'sound/weapons/resonator_fire.ogg',50,TRUE) + user.visible_message(span_warning("[user] summons a runic vendor!")) + new /obj/machinery/vending/runic_vendor(afterattack_turf) + summon_vendor_charges-- + user.changeNext_move(CLICK_CD_MELEE) + return + return ..() + +/obj/item/runic_vendor_scepter/attack_self(mob/user, modifiers) + . = ..() + user.balloon_alert(user, "recharging...") + scepter_is_busy_recharging = TRUE + if(!do_after(user, 5 SECONDS)) + scepter_is_busy_recharging = FALSE + return + user.balloon_alert(user, "fully charged") + scepter_is_busy_recharging = FALSE + summon_vendor_charges = RUNIC_SCEPTER_MAX_CHARGES + +/obj/item/runic_vendor_scepter/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) + var/turf/afterattack_secondary_turf = get_turf(target) + var/obj/machinery/vending/runic_vendor/vendor_on_turf = locate() in afterattack_secondary_turf + if(istype(target, /obj/machinery/vending/runic_vendor)) + var/obj/machinery/vending/runic_vendor/vendor_being_throw = target + vendor_being_throw.throw_at(get_edge_target_turf(target, get_cardinal_dir(src, target)), 4, 20, user) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(vendor_on_turf) + vendor_on_turf.throw_at(get_edge_target_turf(target, get_cardinal_dir(src, target)), 4, 20, user) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/item/runic_vendor_scepter/proc/on_magic_charge(datum/source, datum/action/cooldown/spell/charge/spell, mob/living/caster) + SIGNAL_HANDLER + + if(!ismovable(loc)) + return + + . = COMPONENT_ITEM_CHARGED + + summon_vendor_charges = RUNIC_SCEPTER_MAX_CHARGES + return . + +#undef RUNIC_SCEPTER_MAX_CHARGES +#undef RUNIC_SCEPTER_MAX_RANGE diff --git a/code/modules/antagonists/wizard/equipment/enchanted_clown_suit.dm b/code/modules/antagonists/wizard/equipment/enchanted_clown_suit.dm index 3222deecd84cf..623971276937c 100644 --- a/code/modules/antagonists/wizard/equipment/enchanted_clown_suit.dm +++ b/code/modules/antagonists/wizard/equipment/enchanted_clown_suit.dm @@ -9,6 +9,7 @@ cooldown_time = 30 SECONDS cooldown_reduction_per_rank = 2 SECONDS delete_old = FALSE + delete_on_failure = FALSE /// Amount of time it takes you to rummage around in there var/cast_time = 3 SECONDS /// True while currently casting the spell @@ -56,7 +57,7 @@ return . | SPELL_CANCEL_CAST casting = FALSE -/datum/action/cooldown/spell/conjure_item/clown_pockets/make_item() +/datum/action/cooldown/spell/conjure_item/clown_pockets/make_item(atom/caster) item_type = pick_weight(clown_items) return ..() diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index 038785817d28b..b2bba655050ed 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -1,6 +1,6 @@ /obj/item/soulstone name = "soulstone shard" - icon = 'icons/obj/wizard.dmi' + icon = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "soulstone" inhand_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' @@ -24,6 +24,7 @@ var/theme = THEME_CULT /// Role check, if any needed var/required_role = /datum/antagonist/cult + grind_results = list(/datum/reagent/hauntium = 25, /datum/reagent/silicon = 10) //can be ground into hauntium /obj/item/soulstone/Initialize(mapload) . = ..() @@ -260,13 +261,13 @@ ///////////////////////////Transferring to constructs///////////////////////////////////////////////////// /obj/structure/constructshell name = "empty shell" - icon = 'icons/obj/wizard.dmi' + icon = 'icons/mob/shells.dmi' icon_state = "construct_cult" desc = "A wicked machine used by those skilled in magical arts. It is inactive." /obj/structure/constructshell/examine(mob/user) . = ..() - if(IS_CULTIST(user) || IS_WIZARD(user) || user.stat == DEAD) + if(IS_CULTIST(user) || HAS_MIND_TRAIT(user, TRAIT_MAGICALLY_GIFTED) || user.stat == DEAD) . += {"A construct shell, used to house bound souls from a soulstone.\n Placing a soulstone with a soul into this shell allows you to produce your choice of the following:\n An Artificer, which can produce more shells and soulstones, as well as fortifications.\n @@ -276,7 +277,7 @@ /obj/structure/constructshell/attackby(obj/item/O, mob/user, params) if(istype(O, /obj/item/soulstone)) var/obj/item/soulstone/SS = O - if(!IS_CULTIST(user) && !IS_WIZARD(user) && !SS.theme == THEME_HOLY) + if(!IS_CULTIST(user) && !HAS_MIND_TRAIT(user, TRAIT_MAGICALLY_GIFTED) && !SS.theme == THEME_HOLY) to_chat(user, span_danger("An overwhelming feeling of dread comes over you as you attempt to place [SS] into the shell. It would be wise to be rid of this quickly.")) if(isliving(user)) var/mob/living/living_user = user @@ -384,8 +385,7 @@ soulstone_spirit.copy_languages(victim, LANGUAGE_MIND)//Copies the old mobs languages into the new mob holder. if(user) soulstone_spirit.copy_languages(user, LANGUAGE_MASTER) - soulstone_spirit.update_atom_languages() - soulstone_spirit.grant_all_languages(FALSE, FALSE, TRUE) //Grants omnitongue + soulstone_spirit.get_language_holder().omnitongue = TRUE //Grants omnitongue if(user) soulstone_spirit.faction |= "[REF(user)]" //Add the master as a faction, allowing inter-mob cooperation if(IS_CULTIST(user)) diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/_entry.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/_entry.dm index 0d5982d668919..0586d7ea6da4a 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook_entries/_entry.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/_entry.dm @@ -79,9 +79,9 @@ * * user - the mob who's bought the spell * * book - what book they've bought the spell from * - * Return TRUE if the purchase was successful, FALSE otherwise + * Return truthy if the purchase was successful, FALSE otherwise */ -/datum/spellbook_entry/proc/buy_spell(mob/living/carbon/human/user, obj/item/spellbook/book) +/datum/spellbook_entry/proc/buy_spell(mob/living/carbon/human/user, obj/item/spellbook/book, log_buy = TRUE) var/datum/action/cooldown/spell/existing = locate(spell_type) in user.actions if(existing) var/before_name = existing.name @@ -94,20 +94,23 @@ //we'll need to update the cooldowns for the spellbook set_spell_info() - log_spellbook("[key_name(user)] improved their knowledge of [initial(existing.name)] to level [existing.spell_level] for [cost] points") - SSblackbox.record_feedback("nested tally", "wizard_spell_improved", 1, list("[name]", "[existing.spell_level]")) - log_purchase(user.key) - return TRUE + + if(log_buy) + log_spellbook("[key_name(user)] improved their knowledge of [initial(existing.name)] to level [existing.spell_level] for [cost] points") + SSblackbox.record_feedback("nested tally", "wizard_spell_improved", 1, list("[name]", "[existing.spell_level]")) + log_purchase(user.key) + return existing //No same spell found - just learn it var/datum/action/cooldown/spell/new_spell = new spell_type(user.mind || user) new_spell.Grant(user) to_chat(user, span_notice("You have learned [new_spell.name].")) - log_spellbook("[key_name(user)] learned [new_spell] for [cost] points") - SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) - log_purchase(user.key) - return TRUE + if(log_buy) + log_spellbook("[key_name(user)] learned [new_spell] for [cost] points") + SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) + log_purchase(user.key) + return new_spell /datum/spellbook_entry/proc/log_purchase(key) if(!islist(GLOB.wizard_spellbook_purchases_by_key[key])) @@ -194,12 +197,13 @@ /// Typepath of what item we create when purchased var/obj/item/item_path -/datum/spellbook_entry/item/buy_spell(mob/living/carbon/human/user, obj/item/spellbook/book) - var/atom/spawned_path = new item_path(get_turf(user)) - log_spellbook("[key_name(user)] bought [src] for [cost] points") - SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) +/datum/spellbook_entry/item/buy_spell(mob/living/carbon/human/user, obj/item/spellbook/book, log_buy = TRUE) + var/atom/spawned_path = new item_path(user.loc) + if(log_buy) + log_spellbook("[key_name(user)] bought [src] for [cost] points") + SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) + log_purchase(user.key) try_equip_item(user, spawned_path) - log_purchase(user.key) return spawned_path /// Attempts to give the item to the buyer on purchase. @@ -214,10 +218,12 @@ refundable = FALSE buy_word = "Cast" -/datum/spellbook_entry/summon/buy_spell(mob/living/carbon/human/user, obj/item/spellbook/book) - log_spellbook("[key_name(user)] cast [src] for [cost] points") - SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) - log_purchase(user.key) +/datum/spellbook_entry/summon/buy_spell(mob/living/carbon/human/user, obj/item/spellbook/book, log_buy = TRUE) + if(log_buy) + log_spellbook("[key_name(user)] cast [src] for [cost] points") + SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) + log_purchase(user.key) + book.update_static_data(user) // updates "times" var return TRUE /// Non-purchasable flavor spells to populate the spell book with, for style. diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/assistance.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/assistance.dm index 9b084b90a6482..7704e11a1cb6f 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook_entries/assistance.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/assistance.dm @@ -44,7 +44,7 @@ var/was_equipped = user.equip_to_slot_if_possible(to_equip, ITEM_SLOT_BELT, disable_warning = TRUE) to_chat(user, span_notice("\A [to_equip.name] has been summoned [was_equipped ? "on your waist" : "at your feet"].")) -/datum/spellbook_entry/item/soulstones/buy_spell(mob/living/carbon/human/user, obj/item/spellbook/book) +/datum/spellbook_entry/item/soulstones/buy_spell(mob/living/carbon/human/user, obj/item/spellbook/book, log_buy = TRUE) . =..() if(!.) return @@ -97,3 +97,12 @@ limit = 3 category = "Assistance" refundable = TRUE + +/datum/spellbook_entry/item/vendormancer + name = "Scepter of Vendormancy" + desc = "A scepter containing the power of Runic Vendormancy.\ + It can summon up to 3 Runic Vendors that decay over time, but can be \ + throw around to squash oponents or be directly detonated. When out of \ + charges a long channel will restore the charges." + item_path = /obj/item/runic_vendor_scepter + category = "Assistance" diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/offensive.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/offensive.dm index d2398b0144814..546ae4da36a5b 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook_entries/offensive.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/offensive.dm @@ -23,6 +23,14 @@ spell_type = /datum/action/cooldown/spell/touch/smite category = "Offensive" +/datum/spellbook_entry/summon_simians + name = "Summon Simians" + desc = "This spell reaches deep into the elemental plane of bananas (the monkey one, not the clown one), and \ + summons primal monkeys and lesser gorillas that will promptly flip out and attack everything in sight. Fun! \ + Their lesser, easily manipulable minds will be convinced you are one of their allies, but only for a minute. Unless you also are a monkey." + spell_type = /datum/action/cooldown/spell/conjure/simian + category = "Offensive" + /datum/spellbook_entry/blind name = "Blind" desc = "Temporarily blinds a single target." diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/summons.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/summons.dm index 37bdef69a646e..c31bb4ce2ce93 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook_entries/summons.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/summons.dm @@ -1,6 +1,6 @@ // Ritual spells which affect the station at large /// How much threat we need to let these rituals happen on dynamic -#define MINIMUM_THREAT_FOR_RITUALS 100 +#define MINIMUM_THREAT_FOR_RITUALS 98 /datum/spellbook_entry/summon/ghosts name = "Summon Ghosts" @@ -9,7 +9,7 @@ and some will use their incredibly minor abilities to frustrate you." cost = 0 -/datum/spellbook_entry/summon/ghosts/buy_spell(mob/living/carbon/human/user, obj/item/spellbook/book) +/datum/spellbook_entry/summon/ghosts/buy_spell(mob/living/carbon/human/user, obj/item/spellbook/book, log_buy = TRUE) summon_ghosts(user) playsound(get_turf(user), 'sound/effects/ghost2.ogg', 50, TRUE) return ..() @@ -20,14 +20,14 @@ There is a good chance that they will shoot each other first." /datum/spellbook_entry/summon/guns/can_be_purchased() - // Summon Guns requires 100 threat. + // Summon Guns requires 98 threat. var/datum/game_mode/dynamic/mode = SSticker.mode if(mode.threat_level < MINIMUM_THREAT_FOR_RITUALS) return FALSE // Also must be config enabled return !CONFIG_GET(flag/no_summon_guns) -/datum/spellbook_entry/summon/guns/buy_spell(mob/living/carbon/human/user,obj/item/spellbook/book) +/datum/spellbook_entry/summon/guns/buy_spell(mob/living/carbon/human/user, obj/item/spellbook/book, log_buy = TRUE) summon_guns(user, 10) playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, TRUE) return ..() @@ -38,14 +38,14 @@ why they aren't to be trusted with it at the same time." /datum/spellbook_entry/summon/magic/can_be_purchased() - // Summon Magic requires 100 threat. + // Summon Magic requires 98 threat. var/datum/game_mode/dynamic/mode = SSticker.mode if(mode.threat_level < MINIMUM_THREAT_FOR_RITUALS) return FALSE // Also must be config enabled return !CONFIG_GET(flag/no_summon_magic) -/datum/spellbook_entry/summon/magic/buy_spell(mob/living/carbon/human/user,obj/item/spellbook/book) +/datum/spellbook_entry/summon/magic/buy_spell(mob/living/carbon/human/user, obj/item/spellbook/book, log_buy = TRUE) summon_magic(user, 10) playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, TRUE) return ..() @@ -59,14 +59,14 @@ limit = 5 // Each purchase can intensify it. /datum/spellbook_entry/summon/events/can_be_purchased() - // Summon Events requires 100 threat. + // Summon Events requires 98 threat. var/datum/game_mode/dynamic/mode = SSticker.mode if(mode.threat_level < MINIMUM_THREAT_FOR_RITUALS) return FALSE // Also, must be config enabled return !CONFIG_GET(flag/no_summon_events) -/datum/spellbook_entry/summon/events/buy_spell(mob/living/carbon/human/user, obj/item/spellbook/book) +/datum/spellbook_entry/summon/events/buy_spell(mob/living/carbon/human/user, obj/item/spellbook/book, log_buy = TRUE) summon_events(user) playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, TRUE) return ..() @@ -76,12 +76,73 @@ desc = "Curses the station, warping the minds of everyone inside, causing lasting traumas. Warning: this spell can affect you if not cast from a safe distance." cost = 4 -/datum/spellbook_entry/summon/curse_of_madness/buy_spell(mob/living/carbon/human/user, obj/item/spellbook/book) +/datum/spellbook_entry/summon/curse_of_madness/buy_spell(mob/living/carbon/human/user, obj/item/spellbook/book, log_buy = TRUE) var/message = tgui_input_text(user, "Whisper a secret truth to drive your victims to madness", "Whispers of Madness") - if(!message) + if(!message || QDELETED(user) || QDELETED(book) || !can_buy(user, book)) return FALSE curse_of_madness(user, message) playsound(user, 'sound/magic/mandswap.ogg', 50, TRUE) return ..() +/// A wizard ritual that allows the wizard to teach a specific spellbook enty to everyone on the station. +/// This includes item entries (which will be given to everyone) but disincludes other rituals like itself +/datum/spellbook_entry/summon/specific_spell + name = "Mass Wizard Teaching" + desc = "Teach a specific spell (or give a specific item) to everyone on the station. \ + The cost of this is increased by the cost of the spell you choose. And don't worry - you, too, will learn the spell!" + cost = 3 // cheapest is 4 cost, most expensive is 7 cost + limit = 1 + +/datum/spellbook_entry/summon/specific_spell/buy_spell(mob/living/carbon/human/user, obj/item/spellbook/book, log_buy = TRUE) + var/list/spell_options = list() + for(var/datum/spellbook_entry/entry as anything in book.entries) + if(istype(entry, /datum/spellbook_entry/summon)) + continue + if(!entry.can_be_purchased()) + continue + + spell_options[entry.name] = entry + + sortTim(spell_options, GLOBAL_PROC_REF(cmp_text_asc)) + var/chosen_spell_name = tgui_input_list(user, "Choose a spell (or item) to grant to everyone...", "Wizardly Teaching", spell_options) + if(isnull(chosen_spell_name) || QDELETED(user) || QDELETED(book)) + return FALSE + if(GLOB.mass_teaching) + tgui_alert(user, "Someone's already cast [name]!", "Wizardly Teaching", list("Shame")) + return FALSE + + var/datum/spellbook_entry/chosen_entry = spell_options[chosen_spell_name] + if(cost + chosen_entry.cost > book.uses) + tgui_alert(user, "You can't afford to grant everyone [chosen_spell_name]! ([cost] points needed)", "Wizardly Teaching", list("Shame")) + return FALSE + + cost += chosen_entry.cost + if(!can_buy(user, book)) + cost = initial(cost) + return FALSE + + GLOB.mass_teaching = new(chosen_entry.type) + GLOB.mass_teaching.equip_all_affected() + + var/item_entry = istype(chosen_entry, /datum/spellbook_entry/item) + to_chat(user, span_hypnophrase("You have [item_entry ? "granted everyone the power" : "taught everyone the ways"] of [chosen_spell_name]!")) + message_admins("[ADMIN_LOOKUPFLW(user)] gave everyone the [item_entry ? "item" : "spell"] \"[chosen_spell_name]\"!") + user.log_message("has gave everyone the [item_entry ? "item" : "spell"] \"[chosen_spell_name]\"!", LOG_GAME) + + name = "[name]: [chosen_spell_name]" + return ..() + +/datum/spellbook_entry/summon/specific_spell/can_buy(mob/living/carbon/human/user, obj/item/spellbook/book) + if(GLOB.mass_teaching) + return FALSE + return ..() + +/datum/spellbook_entry/summon/specific_spell/can_be_purchased() + var/datum/game_mode/dynamic/mode = SSticker.mode + if(mode.threat_level < MINIMUM_THREAT_FOR_RITUALS) + return FALSE + if(GLOB.mass_teaching) + return FALSE + return ..() + #undef MINIMUM_THREAT_FOR_RITUALS diff --git a/code/modules/antagonists/wizard/equipment/wizard_spellbook.dm b/code/modules/antagonists/wizard/equipment/wizard_spellbook.dm index a16f5b6f1fd3d..f13b53b12edd4 100644 --- a/code/modules/antagonists/wizard/equipment/wizard_spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/wizard_spellbook.dm @@ -1,7 +1,7 @@ /obj/item/spellbook name = "spell book" desc = "An unearthly tome that glows with power." - icon = 'icons/obj/library.dmi' + icon = 'icons/obj/service/library.dmi' icon_state ="book" worn_icon_state = "book" throw_speed = 2 @@ -39,23 +39,21 @@ /obj/item/spellbook/proc/on_magic_charge(datum/source, datum/action/cooldown/spell/spell, mob/living/caster) SIGNAL_HANDLER - var/static/list/clever_girl = list( + to_chat(caster, span_warning("Glowing red letters appear on the front cover...")) + to_chat(caster, span_red(pick( "NICE TRY BUT NO!", "CLEVER BUT NOT CLEVER ENOUGH!", "SUCH FLAGRANT CHEESING IS WHY WE ACCEPTED YOUR APPLICATION!", "CUTE! VERY CUTE!", "YOU DIDN'T THINK IT'D BE THAT EASY, DID YOU?", - ) - - to_chat(caster, span_warning("Glowing red letters appear on the front cover...")) - to_chat(caster, span_red(pick(clever_girl))) + ))) return COMPONENT_ITEM_BURNT_OUT /obj/item/spellbook/examine(mob/user) . = ..() if(owner) - . += {"There is a small signature on the front cover: "[owner]"."} + . += "There is a small signature on the front cover: \"[owner]\"." else . += "It appears to have no author." @@ -148,8 +146,6 @@ var/list/data = list() data["owner"] = owner data["points"] = uses - data["semi_random_bonus"] = initial(uses) + semi_random_bonus - data["full_random_bonus"] = initial(uses) + full_random_bonus return data //This is a MASSIVE amount of data, please be careful if you remove it from static. @@ -172,6 +168,8 @@ entry_data += list(individual_entry_data) data["entries"] = entry_data + data["semi_random_bonus"] = initial(uses) + semi_random_bonus + data["full_random_bonus"] = initial(uses) + full_random_bonus return data /obj/item/spellbook/ui_act(action, params) @@ -218,7 +216,7 @@ return TRUE if("purchase_loadout") - wizard_loadout(wizard, locate(params["id"])) + wizard_loadout(wizard, params["id"]) return TRUE /// Attempts to purchased the passed entry [to_buy] for [user]. diff --git a/code/modules/antagonists/wizard/grand_ritual/finales/all_access.dm b/code/modules/antagonists/wizard/grand_ritual/finales/all_access.dm new file mode 100644 index 0000000000000..07958ed94a75e --- /dev/null +++ b/code/modules/antagonists/wizard/grand_ritual/finales/all_access.dm @@ -0,0 +1,17 @@ +/// Open all of the doors +/datum/grand_finale/all_access + name = "Connection" + desc = "The ultimate use of your gathered power! Unlock every single door that they have! Nobody will be able to keep you out now, or anyone else for that matter!" + icon = 'icons/mob/actions/actions_spells.dmi' + icon_state = "knock" + +/datum/grand_finale/all_access/trigger(mob/living/carbon/human/invoker) + message_admins("[key_name(invoker)] removed all door access requirements") + for(var/obj/machinery/door/target_door as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door)) + if(is_station_level(target_door.z)) + target_door.unlock() + target_door.req_access = list() + target_door.req_one_access = list() + INVOKE_ASYNC(target_door, TYPE_PROC_REF(/obj/machinery/door/airlock, open)) + CHECK_TICK + priority_announce("AULIE OXIN FIERA!!", null, 'sound/magic/knock.ogg', sender_override = "[invoker.real_name]") diff --git a/code/modules/antagonists/wizard/grand_ritual/finales/armageddon.dm b/code/modules/antagonists/wizard/grand_ritual/finales/armageddon.dm new file mode 100644 index 0000000000000..c4bba539c35c9 --- /dev/null +++ b/code/modules/antagonists/wizard/grand_ritual/finales/armageddon.dm @@ -0,0 +1,60 @@ +#define DOOM_SINGULARITY "singularity" +#define DOOM_TESLA "tesla" +#define DOOM_METEORS "meteors" + +/// Kill yourself and probably a bunch of other people +/datum/grand_finale/armageddon + name = "Annihilation" + desc = "This crew have offended you beyond the realm of pranks. Make the ultimate sacrifice to teach them a lesson your elders can really respect. \ + YOU WILL NOT SURVIVE THIS." + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "legion_head" + minimum_time = 90 MINUTES // This will probably immediately end the round if it gets finished. + ritual_invoke_time = 60 SECONDS // Really give the crew some time to interfere with this one. + dire_warning = TRUE + glow_colour = "#be000048" + /// Things to yell before you die + var/static/list/possible_last_words = list( + "Flames and ruin!", + "Dooooooooom!!", + "HAHAHAHAHAHA!! AHAHAHAHAHAHAHAHAA!!", + "Hee hee hee!! Hoo hoo hoo!! Ha ha haaa!!", + "Ohohohohohoho!!", + "Cower in fear, puny mortals!", + "Tremble before my glory!", + "Pick a god and pray!", + "It's no use!", + "If the gods wanted you to live, they would not have created me!", + "God stays in heaven out of fear of what I have created!", + "Ruination is come!", + "All of creation, bend to my will!", + ) + +/datum/grand_finale/armageddon/trigger(mob/living/carbon/human/invoker) + priority_announce(pick(possible_last_words), null, 'sound/magic/voidblink.ogg', sender_override = "[invoker.real_name]") + var/turf/current_location = get_turf(invoker) + invoker.gib(DROP_ALL_REMAINS) + + var/static/list/doom_options = list() + if (!length(doom_options)) + doom_options = list(DOOM_SINGULARITY, DOOM_TESLA) + if (!SSmapping.config.planetary) + doom_options += DOOM_METEORS + + switch(pick(doom_options)) + if (DOOM_SINGULARITY) + var/obj/singularity/singulo = new(current_location) + singulo.energy = 300 + if (DOOM_TESLA) + var/obj/energy_ball/tesla = new (current_location) + tesla.energy = 200 + if (DOOM_METEORS) + var/datum/dynamic_ruleset/roundstart/meteor/meteors = new() + meteors.meteordelay = 0 + var/datum/game_mode/dynamic/mode = SSticker.mode + mode.execute_roundstart_rule(meteors) // Meteors will continue until morale is crushed. + priority_announce("Meteors have been detected on collision course with the station.", "Meteor Alert", ANNOUNCER_METEORS) + +#undef DOOM_SINGULARITY +#undef DOOM_TESLA +#undef DOOM_METEORS diff --git a/code/modules/antagonists/wizard/grand_ritual/finales/captaincy.dm b/code/modules/antagonists/wizard/grand_ritual/finales/captaincy.dm new file mode 100644 index 0000000000000..d1a3c1afaf758 --- /dev/null +++ b/code/modules/antagonists/wizard/grand_ritual/finales/captaincy.dm @@ -0,0 +1,113 @@ +/// Become the official Captain of the station +/datum/grand_finale/usurp + name = "Usurpation" + desc = "The ultimate use of your gathered power! Rewrite time such that you have been Captain of this station the whole time." + icon = 'icons/obj/card.dmi' + icon_state = "card_gold" + +/datum/grand_finale/usurp/trigger(mob/living/carbon/human/invoker) + message_admins("[key_name(invoker)] has replaced the Captain") + var/list/former_captains = list() + var/list/other_crew = list() + SEND_SOUND(world, sound('sound/magic/timeparadox2.ogg')) + + for (var/mob/living/carbon/human/crewmate as anything in GLOB.human_list) + if (!crewmate.mind) + continue + crewmate.Unconscious(3 SECONDS) // Everyone falls unconscious but not everyone gets told about a new captain + if (crewmate == invoker || IS_HUMAN_INVADER(crewmate)) + continue + to_chat(crewmate, span_notice("The world spins and dissolves. Your past flashes before your eyes, backwards.\n\ + Life strolls back into the ocean and shrinks into nothingness, planets explode into storms of solar dust, \ + the stars rush back to greet each other at the beginning of things and then... you snap back to the present. \n\ + Everything is just as it was and always has been. \n\n\ + A stray thought sticks in the forefront of your mind. \n\ + [span_hypnophrase("I'm so glad that [invoker.real_name] is our legally appointed Captain!")] \n\ + Is... that right?")) + if (is_captain_job(crewmate.mind.assigned_role)) + former_captains += crewmate + demote_to_assistant(crewmate) + continue + if (crewmate.stat != DEAD) + other_crew += crewmate + + dress_candidate(invoker) + GLOB.manifest.modify(invoker.real_name, JOB_CAPTAIN, JOB_CAPTAIN) + minor_announce("Captain [invoker.real_name] on deck!") + + // Enlist some crew to try and restore the natural order + for (var/mob/living/carbon/human/former_captain as anything in former_captains) + create_vendetta(former_captain.mind, invoker.mind) + for (var/mob/living/carbon/human/random_crewmate as anything in other_crew) + if (prob(10)) + create_vendetta(random_crewmate.mind, invoker.mind) + +/** + * Anyone who thought they were Captain is in for a nasty surprise, and won't be very happy about it + */ +/datum/grand_finale/usurp/proc/demote_to_assistant(mob/living/carbon/human/former_captain) + var/obj/effect/particle_effect/fluid/smoke/exit_poof = new(get_turf(former_captain)) + exit_poof.lifetime = 2 SECONDS + + former_captain.unequip_everything() + if(isplasmaman(former_captain)) + former_captain.equipOutfit(/datum/outfit/plasmaman) + former_captain.internal = former_captain.get_item_for_held_index(2) + else + former_captain.equipOutfit(/datum/outfit/job/assistant) + + GLOB.manifest.modify(former_captain.real_name, JOB_ASSISTANT, JOB_ASSISTANT) + var/list/valid_turfs = list() + // Used to be into prison but that felt a bit too mean + for (var/turf/exile_turf as anything in get_area_turfs(/area/station/maintenance, subtypes = TRUE)) + if (isspaceturf(exile_turf) || exile_turf.is_blocked_turf()) + continue + valid_turfs += exile_turf + do_teleport(former_captain, pick(valid_turfs), no_effects = TRUE) + var/obj/effect/particle_effect/fluid/smoke/enter_poof = new(get_turf(former_captain)) + enter_poof.lifetime = 2 SECONDS + +/** + * Does some item juggling to try to dress you as both a Wizard and Captain without deleting any items you have bought. + * ID, headset, and uniform are forcibly replaced. Other slots are only filled if unoccupied. + * We could forcibly replace shoes and gloves too but people might miss their insuls or... meown shoes? + */ +/datum/grand_finale/usurp/proc/dress_candidate(mob/living/carbon/human/invoker) + // Won't be needing these + var/obj/id = invoker.get_item_by_slot(ITEM_SLOT_ID) + QDEL_NULL(id) + var/obj/headset = invoker.get_item_by_slot(ITEM_SLOT_EARS) + QDEL_NULL(headset) + // We're about to take off your pants so those are going to fall out + var/obj/item/pocket_L = invoker.get_item_by_slot(ITEM_SLOT_LPOCKET) + var/obj/item/pocket_R = invoker.get_item_by_slot(ITEM_SLOT_RPOCKET) + // In case we try to put a PDA there + var/obj/item/belt = invoker.get_item_by_slot(ITEM_SLOT_BELT) + belt?.moveToNullspace() + + var/obj/pants = invoker.get_item_by_slot(ITEM_SLOT_ICLOTHING) + QDEL_NULL(pants) + invoker.equipOutfit(/datum/outfit/job/wizard_captain) + // And put everything back! + equip_to_slot_then_hands(invoker, ITEM_SLOT_BELT, belt) + equip_to_slot_then_hands(invoker, ITEM_SLOT_LPOCKET, pocket_L) + equip_to_slot_then_hands(invoker, ITEM_SLOT_RPOCKET, pocket_R) + +/// An outfit which replaces parts of a wizard's clothes with captain's clothes but keeps the robes +/datum/outfit/job/wizard_captain + name = "Captain (Wizard Transformation)" + 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/parade + belt = /obj/item/modular_computer/pda/heads/captain + ears = /obj/item/radio/headset/heads/captain/alt + glasses = /obj/item/clothing/glasses/sunglasses + gloves = /obj/item/clothing/gloves/captain + shoes = /obj/item/clothing/shoes/laceup + accessory = /obj/item/clothing/accessory/medal/gold/captain + backpack_contents = list( + /obj/item/melee/baton/telescopic = 1, + /obj/item/station_charter = 1, + ) + box = null diff --git a/code/modules/antagonists/wizard/grand_ritual/finales/cheese.dm b/code/modules/antagonists/wizard/grand_ritual/finales/cheese.dm new file mode 100644 index 0000000000000..714cd62659bbb --- /dev/null +++ b/code/modules/antagonists/wizard/grand_ritual/finales/cheese.dm @@ -0,0 +1,49 @@ +/** + * Gives the wizard a defensive/mood buff and a Wabbajack, a juiced up chaos staff that will surely break something. + * Everyone but the wizard goes crazy, suffers major brain damage, and is given a vendetta against the wizard. + * Already insane people are instead cured of their madness, ignoring any other effects as the station around them loses its marbles. + */ +/datum/grand_finale/cheese + // we don't set name, desc and others, thus we won't appear in the radial choice of a normal finale rune + dire_warning = TRUE + minimum_time = 45 MINUTES //i'd imagine speedrunning this would be crummy, but the wizard's average lifespan is barely reaching this point + +/datum/grand_finale/cheese/trigger(mob/living/invoker) + message_admins("[key_name(invoker)] has summoned forth The Wabbajack and cursed the crew with madness!") + priority_announce("Danger: Extremely potent reality altering object has been summoned on station. Immediate evacuation advised. Brace for impact.", "Central Command Higher Dimensional Affairs", 'sound/effects/glassbr1.ogg') + + for (var/mob/living/carbon/human/crewmate as anything in GLOB.human_list) + if (isnull(crewmate.mind)) + continue + if (crewmate == invoker) //everyone but the wizard is royally fucked, no matter who they are + continue + if (crewmate.has_trauma_type(/datum/brain_trauma/mild/hallucinations)) //for an already insane person, this is retribution + to_chat(crewmate, span_boldwarning("Your surroundings suddenly fill with a cacophony of manic laughter and psychobabble...")) + to_chat(crewmate, span_nicegreen("...but as the moment passes, you realise that whatever eldritch power behind the event happened to affect you \ + has resonated within the ruins of your already shattered mind, creating a singularity of mental instability! \ + As it collapses unto itself, you feel... at peace, finally.")) + if(crewmate.has_quirk(/datum/quirk/insanity)) + crewmate.remove_quirk(/datum/quirk/insanity) + else + crewmate.cure_trauma_type(/datum/brain_trauma/mild/hallucinations, TRAUMA_RESILIENCE_ABSOLUTE) + else + //everyone else gets to relish in madness + //yes killing their mood will also trigger mood hallucinations + create_vendetta(crewmate.mind, invoker.mind) + to_chat(crewmate, span_boldwarning("Your surroundings suddenly fill with a cacophony of manic laughter and psychobabble. \n\ + You feel your inner psyche shatter into a myriad pieces of jagged glass of colors unknown to the universe, \ + infinitely reflecting a blinding, maddening light coming from the innermost sanctums of your destroyed mind. \n\ + After a brief pause which felt like a millenia, one phrase rebounds ceaselessly in your head, imbued with the false hope of absolution... \n\ + [invoker] must die.")) + var/datum/brain_trauma/mild/hallucinations/added_trauma = new() + added_trauma.resilience = TRAUMA_RESILIENCE_ABSOLUTE + crewmate.adjustOrganLoss(ORGAN_SLOT_BRAIN, BRAIN_DAMAGE_DEATH - 25, BRAIN_DAMAGE_DEATH - 25) //you'd better hope chap didn't pick a hypertool + crewmate.gain_trauma(added_trauma) + crewmate.add_mood_event("wizard_ritual_finale", /datum/mood_event/madness_despair) + + //drip our wizard out + invoker.apply_status_effect(/datum/status_effect/blessing_of_insanity) + invoker.add_mood_event("wizard_ritual_finale", /datum/mood_event/madness_elation) + var/obj/item/gun/magic/staff/chaos/true_wabbajack/the_wabbajack = new + invoker.put_in_active_hand(the_wabbajack) + to_chat(invoker, span_mind_control("Your every single instinct and rational thought is screaming at you as [the_wabbajack] appears in your firm grip...")) diff --git a/code/modules/antagonists/wizard/grand_ritual/finales/clown.dm b/code/modules/antagonists/wizard/grand_ritual/finales/clown.dm new file mode 100644 index 0000000000000..bda79c908c040 --- /dev/null +++ b/code/modules/antagonists/wizard/grand_ritual/finales/clown.dm @@ -0,0 +1,76 @@ +/// Dress the crew as magical clowns +/datum/grand_finale/clown + name = "Jubilation" + desc = "The ultimate use of your gathered power! Rewrite time so that everyone went to clown college! Now they'll prank each other for you!" + icon = 'icons/obj/clothing/masks.dmi' + icon_state = "clown" + glow_colour = "#ffff0048" + +/datum/grand_finale/clown/trigger(mob/living/carbon/human/invoker) + for(var/mob/living/carbon/human/victim as anything in GLOB.human_list) + victim.Unconscious(3 SECONDS) + if (!victim.mind || IS_HUMAN_INVADER(victim) || victim == invoker) + continue + if (HAS_TRAIT(victim, TRAIT_CLOWN_ENJOYER)) + victim.add_mood_event("clown_world", /datum/mood_event/clown_world) + to_chat(victim, span_notice("The world spins and dissolves. Your past flashes before your eyes, backwards.\n\ + Life strolls back into the ocean and shrinks into nothingness, planets explode into storms of solar dust, \ + the stars rush back to greet each other at the beginning of things and then... you snap back to the present. \n\ + Everything is just as it was and always has been. \n\n\ + A stray thought sticks in the forefront of your mind. \n\ + [span_hypnophrase("I'm so glad that I work at Clown Research Station [station_name()]!")] \n\ + Is... that right?")) + if (is_clown_job(victim.mind.assigned_role)) + var/datum/action/cooldown/spell/conjure_item/clown_pockets/new_spell = new(victim) + new_spell.Grant(victim) + continue + if (!ismonkey(victim)) // Monkeys cannot yet wear clothes + dress_as_magic_clown(victim) + if (prob(15)) + create_vendetta(victim.mind, invoker.mind) + +/** + * Clown enjoyers who are effected by this become ecstatic, they have achieved their life's dream. + * This moodlet is equivalent to the one for simply being a traitor. + */ +/datum/mood_event/clown_world + mood_change = 4 + +/datum/mood_event/clown_world/add_effects(param) + description = "I LOVE working at Clown Research Station [station_name()]!!" + +/// Dress the passed mob as a magical clown, self-explanatory +/datum/grand_finale/clown/proc/dress_as_magic_clown(mob/living/carbon/human/victim) + var/obj/effect/particle_effect/fluid/smoke/poof = new(get_turf(victim)) + poof.lifetime = 2 SECONDS + + var/obj/item/tank/internal = victim.internal + // We're about to take off your pants so those are going to fall out + var/obj/item/pocket_L = victim.get_item_by_slot(ITEM_SLOT_LPOCKET) + var/obj/item/pocket_R = victim.get_item_by_slot(ITEM_SLOT_RPOCKET) + var/obj/item/id = victim.get_item_by_slot(ITEM_SLOT_ID) + var/obj/item/belt = victim.get_item_by_slot(ITEM_SLOT_BELT) + + var/obj/pants = victim.get_item_by_slot(ITEM_SLOT_ICLOTHING) + var/obj/mask = victim.get_item_by_slot(ITEM_SLOT_MASK) + QDEL_NULL(pants) + QDEL_NULL(mask) + if(isplasmaman(victim)) + victim.equip_to_slot_if_possible(new /obj/item/clothing/under/plasmaman/clown/magic(), ITEM_SLOT_ICLOTHING, disable_warning = TRUE) + victim.equip_to_slot_if_possible(new /obj/item/clothing/mask/gas/clown_hat/plasmaman(), ITEM_SLOT_MASK, disable_warning = TRUE) + else + victim.equip_to_slot_if_possible(new /obj/item/clothing/under/rank/civilian/clown/magic(), ITEM_SLOT_ICLOTHING, disable_warning = TRUE) + victim.equip_to_slot_if_possible(new /obj/item/clothing/mask/gas/clown_hat(), ITEM_SLOT_MASK, disable_warning = TRUE) + + var/obj/item/clothing/mask/gas/clown_hat/clown_mask = victim.get_item_by_slot(ITEM_SLOT_MASK) + if (clown_mask) + var/list/options = GLOB.clown_mask_options + clown_mask.icon_state = options[pick(clown_mask.clownmask_designs)] + victim.update_worn_mask() + clown_mask.update_item_action_buttons() + + equip_to_slot_then_hands(victim, ITEM_SLOT_LPOCKET, pocket_L) + equip_to_slot_then_hands(victim, ITEM_SLOT_RPOCKET, pocket_R) + equip_to_slot_then_hands(victim, ITEM_SLOT_ID, id) + equip_to_slot_then_hands(victim, ITEM_SLOT_BELT, belt) + victim.internal = internal diff --git a/code/modules/antagonists/wizard/grand_ritual/finales/grand_ritual_finale.dm b/code/modules/antagonists/wizard/grand_ritual/finales/grand_ritual_finale.dm new file mode 100644 index 0000000000000..b92ae4d2f20b2 --- /dev/null +++ b/code/modules/antagonists/wizard/grand_ritual/finales/grand_ritual_finale.dm @@ -0,0 +1,88 @@ +/** + * A big final event to run when you complete seven rituals + */ +/datum/grand_finale + /// Friendly name for selection menu + var/name + /// Tooltip description for selection menu + var/desc + /// An icon to display to represent the choice + var/icon/icon + /// Icon state to use to represent the choice + var/icon_state + /// Prevent especially dangerous options from being chosen until we're fine with the round ending + var/minimum_time = 0 + /// Override the rune invocation time + var/ritual_invoke_time = 30 SECONDS + /// Provide an extremely loud radio message when this one starts + var/dire_warning = FALSE + /// Overrides the default colour you glow while channeling the rune, optional + var/glow_colour + +/** + * Returns an entry for a radial menu for this choice. + * Returns null if entry is abstract or invalid for current circumstances. + */ +/datum/grand_finale/proc/get_radial_choice() + if (!name || !desc || !icon || !icon_state) + return + var/time_remaining_desc = "" + if (minimum_time >= world.time - SSticker.round_start_time) + time_remaining_desc = "This ritual will be available to begin invoking in [DisplayTimeText(minimum_time - world.time - SSticker.round_start_time)]" + var/datum/radial_menu_choice/choice = new() + choice.name = name + choice.image = image(icon = icon, icon_state = icon_state) + choice.info = desc + time_remaining_desc + return choice + +/** + * Actually do the thing. + * Arguments + * * invoker - The wizard casting this. + */ +/datum/grand_finale/proc/trigger(mob/living/invoker) + // Do something cool. + +/// Tries to equip something into an inventory slot, then hands, then the floor. +/datum/grand_finale/proc/equip_to_slot_then_hands(mob/living/carbon/human/invoker, slot, obj/item/item) + if(!item) + return + if(!invoker.equip_to_slot_if_possible(item, slot, disable_warning = TRUE)) + invoker.put_in_hands(item) + +/// They are not going to take this lying down. +/datum/grand_finale/proc/create_vendetta(datum/mind/aggrieved_crewmate, datum/mind/wizard) + aggrieved_crewmate.add_antag_datum(/datum/antagonist/wizard_prank_vendetta) + var/datum/antagonist/wizard_prank_vendetta/antag_datum = aggrieved_crewmate.has_antag_datum(/datum/antagonist/wizard_prank_vendetta) + var/datum/objective/assassinate/wizard_murder = new + wizard_murder.owner = aggrieved_crewmate + wizard_murder.target = wizard + wizard_murder.explanation_text = "Kill [wizard.current.name], the one who did this." + antag_datum.objectives += wizard_murder + + to_chat(aggrieved_crewmate.current, span_warning("No! This isn't right!")) + aggrieved_crewmate.announce_objectives() + +/** + * Antag datum to give to people who want to kill the wizard. + * This doesn't preclude other people choosing to want to kill the wizard, just these people are rewarded for it. + */ +/datum/antagonist/wizard_prank_vendetta + name = "\improper Wizard Prank Victim" + roundend_category = "wizard prank victims" + show_in_antagpanel = FALSE + antagpanel_category = "Other" + show_name_in_check_antagonists = TRUE + count_against_dynamic_roll_chance = FALSE + silent = TRUE + +/// Give everyone magic items, its so simple it feels pointless to give it its own file +/datum/grand_finale/magic + name = "Evolution" + desc = "The ultimate use of your gathered power! Give the crew their own magic, they'll surely realise that right and wrong have no meaning when you hold ultimate power!" + icon = 'icons/obj/scrolls.dmi' + icon_state = "scroll" + +/datum/grand_finale/magic/trigger(mob/living/carbon/human/invoker) + message_admins("[key_name(invoker)] summoned magic") + summon_magic(survivor_probability = 20) // Wow, this one was easy! diff --git a/code/modules/antagonists/wizard/grand_ritual/finales/immortality.dm b/code/modules/antagonists/wizard/grand_ritual/finales/immortality.dm new file mode 100644 index 0000000000000..d20ca06752b6c --- /dev/null +++ b/code/modules/antagonists/wizard/grand_ritual/finales/immortality.dm @@ -0,0 +1,277 @@ +/// Amount of time to wait after someone dies to steal their body from their killers +#define IMMORTAL_PRE_ACTIVATION_TIME 10 SECONDS +/// Amount of time it takes a mob to return to the living world +#define IMMORTAL_RESURRECT_TIME 50 SECONDS + +/** + * Nobody will ever die ever again + * Or if they do, they will be back + */ +/datum/grand_finale/immortality + name = "Perpetuation" + desc = "The ultimate use of your gathered power! Share with the crew the gift, or curse, of eternal life! \ + And why not just the crew? How about their pets too? And any other animals around here! \ + What if nobody died ever again!?" + icon = 'icons/obj/mining_zones/artefacts.dmi' + icon_state = "asclepius_active" + glow_colour = COLOR_PALE_GREEN + minimum_time = 30 MINUTES // This is enormously disruptive but doesn't technically in of itself end the round. + +/datum/grand_finale/immortality/trigger(mob/living/carbon/human/invoker) + new /obj/effect/temp_visual/immortality_blast(get_turf(invoker)) + SEND_SOUND(world, sound('sound/magic/teleport_diss.ogg')) + for (var/mob/living/alive_guy as anything in GLOB.mob_living_list) + new /obj/effect/temp_visual/immortality_pulse(get_turf(alive_guy)) + if (!alive_guy.mind) + continue + to_chat(alive_guy, span_notice("You feel extremely healthy.")) + RegisterSignal(SSdcs, COMSIG_GLOB_MOB_DEATH, PROC_REF(something_died)) + +/// Called when something passes into the great beyond, make it not do that +/datum/grand_finale/immortality/proc/something_died(datum/source, mob/living/died, gibbed) + SIGNAL_HANDLER + if (died.stat != DEAD || HAS_TRAIT(died, TRAIT_PERMANENTLY_MORTAL) || died.flags_1 & HOLOGRAM_1) + return + var/body_type = died.type + + var/turf/died_turf = get_turf(died) + var/list/nearby_turfs = circle_view_turfs(died_turf, 2) + var/list/nearby_safe_turfs = list() + for (var/turf/check_turf as anything in nearby_turfs) + if (check_turf.is_blocked_turf(exclude_mobs = TRUE, source_atom = died)) + nearby_turfs -= check_turf + continue + if (islava(check_turf) || ischasm(check_turf)) + continue + nearby_safe_turfs += check_turf + if (length(nearby_safe_turfs)) // If you're in the middle of a 5x5 chasm, tough luck I guess + died_turf = pick(nearby_safe_turfs) + else if (length(nearby_turfs)) + died_turf = pick(nearby_turfs) + + var/saved_appearance = ishuman(died) ? new /datum/human_appearance_profile(died) : null + + var/datum/mind/dead_mind = HAS_TRAIT(died, TRAIT_SUICIDED) ? null : died.mind // There is a way out of the cycle + if (!isnull(dead_mind)) + to_chat(died, span_boldnotice("Your spirit surges! You will return to life in [DisplayTimeText(IMMORTAL_PRE_ACTIVATION_TIME + IMMORTAL_RESURRECT_TIME)].")) + animate(died, alpha = died.alpha, time = IMMORTAL_PRE_ACTIVATION_TIME / 2, flags = ANIMATION_PARALLEL) + animate(alpha = 0, time = IMMORTAL_PRE_ACTIVATION_TIME / 2, easing = SINE_EASING | EASE_IN) + addtimer(CALLBACK(src, PROC_REF(reverse_death), died, dead_mind, died_turf, body_type, saved_appearance), IMMORTAL_PRE_ACTIVATION_TIME, TIMER_DELETE_ME) + +/// Create a ghost ready for revival +/datum/grand_finale/immortality/proc/reverse_death(mob/living/died, datum/mind/dead_mind, turf/died_turf, body_type, datum/human_appearance_profile/human_appearance) + if (died.stat != DEAD) + return + var/ghost_type = ispath(body_type, /mob/living/carbon/human) ? /obj/effect/spectre_of_resurrection/human : /obj/effect/spectre_of_resurrection + var/obj/effect/spectre_of_resurrection/ghost = new ghost_type(died_turf) + var/mob/living/corpse = QDELETED(died) ? new body_type(ghost) : died + if (!isnull(human_appearance)) + corpse.real_name = human_appearance.name + corpse.alpha = initial(corpse.alpha) + corpse.add_traits(list(TRAIT_NO_TELEPORT, TRAIT_AI_PAUSED), MAGIC_TRAIT) + corpse.apply_status_effect(/datum/status_effect/grouped/stasis, MAGIC_TRAIT) + ghost.set_up_resurrection(corpse, dead_mind, human_appearance) + + +/// Store of data we use to recreate someone who was gibbed, like a simplified version of changeling profiles +/datum/human_appearance_profile + /// The name of the profile / the name of whoever this profile source. + var/name = "human" + /// The DNA datum associated with our profile from the profile source + var/datum/dna/dna + /// The age of the profile source. + var/age + /// The body type of the profile source. + var/physique + /// The quirks of the profile source. + var/list/quirks = list() + /// The hair and facial hair gradient styles of the profile source. + var/list/hair_gradient_style = list("None", "None") + /// The hair and facial hair gradient colours of the profile source. + var/list/hair_gradient_colours = list(null, null) + /// The TTS voice of the profile source + var/voice + /// The TTS filter of the profile filter + var/voice_filter = "" + +/datum/human_appearance_profile/New(mob/living/carbon/human/target) + copy_from(target) + +/// Copy the appearance data of the target +/datum/human_appearance_profile/proc/copy_from(mob/living/carbon/human/target) + target.dna.real_name = target.real_name + dna = new target.dna.type() + target.dna.copy_dna(dna) + name = target.real_name + age = target.age + physique = target.physique + + for(var/datum/quirk/target_quirk as anything in target.quirks) + LAZYADD(quirks, new target_quirk.type) + + hair_gradient_style = LAZYLISTDUPLICATE(target.grad_style) + hair_gradient_colours = LAZYLISTDUPLICATE(target.grad_color) + + voice = target.voice + voice_filter = target.voice_filter + +/// Make the targetted human look like this +/datum/human_appearance_profile/proc/apply_to(mob/living/carbon/human/target) + target.real_name = name + target.age = age + target.physique = physique + target.grad_style = LAZYLISTDUPLICATE(hair_gradient_style) + target.grad_color = LAZYLISTDUPLICATE(hair_gradient_colours) + target.voice = voice + target.voice_filter = voice_filter + + for(var/datum/quirk/target_quirk as anything in quirks) + target_quirk.add_to_holder(target) + + dna.transfer_identity(target, TRUE) + for(var/obj/item/bodypart/limb as anything in target.bodyparts) + limb.update_limb(is_creating = TRUE) + target.updateappearance(mutcolor_update = TRUE) + target.domutcheck() + target.regenerate_icons() + + +/// A ghostly image of a mob showing where and what is going to respawn +/obj/effect/spectre_of_resurrection + name = "spectre" + desc = "A frightening apparition, slowly growing more solid." + icon_state = "blank_white" + anchored = TRUE + layer = MOB_LAYER + plane = GAME_PLANE + alpha = 0 + color = COLOR_PALE_GREEN + light_range = 2 + light_color = COLOR_PALE_GREEN + /// Who are we reviving? + var/mob/living/corpse + /// Who if anyone is playing as them? + var/datum/mind/dead_mind + +/obj/effect/spectre_of_resurrection/Initialize(mapload) + . = ..() + animate(src, alpha = 150, time = 2 SECONDS) + +/// Prepare to revive someone +/obj/effect/spectre_of_resurrection/proc/set_up_resurrection(mob/living/corpse, datum/mind/dead_mind, datum/human_appearance_profile/human_appearance) + if (isnull(corpse)) + qdel(src) + return + + src.corpse = corpse + src.dead_mind = dead_mind + corpse.forceMove(src) + name = "spectre of [corpse]" + setup_icon(corpse) + DO_FLOATING_ANIM(src) + + RegisterSignal(corpse, COMSIG_LIVING_REVIVE, PROC_REF(on_corpse_revived)) + RegisterSignal(corpse, COMSIG_QDELETING, PROC_REF(on_corpse_deleted)) + RegisterSignal(dead_mind, COMSIG_QDELETING, PROC_REF(on_mind_lost)) + addtimer(CALLBACK(src, PROC_REF(revive)), IMMORTAL_RESURRECT_TIME, TIMER_DELETE_ME) + +/// Copy appearance from ressurecting mob +/obj/effect/spectre_of_resurrection/proc/setup_icon(mob/living/corpse) + icon = initial(corpse.icon) + icon_state = initial(corpse.icon_state) + +/obj/effect/spectre_of_resurrection/Destroy(force) + QDEL_NULL(corpse) + dead_mind = null + return ..() + +/obj/effect/spectre_of_resurrection/Exited(atom/movable/gone, direction) + . = ..() + if (gone != corpse) + return // Weird but ok + UnregisterSignal(corpse, list(COMSIG_LIVING_REVIVE, COMSIG_QDELETING)) + corpse = null + qdel(src) + +/// Bring our body back to life +/obj/effect/spectre_of_resurrection/proc/revive() + if (!isnull(dead_mind)) + if (dead_mind.current == corpse) + dead_mind.grab_ghost(force = TRUE) + else + dead_mind.transfer_to(corpse, force_key_move = TRUE) + corpse.revive(HEAL_ALL) // The signal is sent even if they weren't actually dead + +/// Remove our stored corpse back to the living world +/obj/effect/spectre_of_resurrection/proc/on_corpse_revived() + SIGNAL_HANDLER + if (isnull(corpse)) + return + visible_message(span_boldnotice("[corpse] suddenly shudders to life!")) + corpse.remove_traits(list(TRAIT_NO_TELEPORT, TRAIT_AI_PAUSED), MAGIC_TRAIT) + corpse.remove_status_effect(/datum/status_effect/grouped/stasis, MAGIC_TRAIT) + corpse.forceMove(loc) + +/// If the body is destroyed then we can't come back, F +/obj/effect/spectre_of_resurrection/proc/on_corpse_deleted() + SIGNAL_HANDLER + qdel(src) + +/// If the mind is deleted somehow we just don't transfer it on revival +/obj/effect/spectre_of_resurrection/proc/on_mind_lost() + SIGNAL_HANDLER + dead_mind = null + +/// A ressurection spectre with extra behaviour for humans +/obj/effect/spectre_of_resurrection/human + /// Stored data used to restore someone to a fascimile of what they were before + var/datum/human_appearance_profile/human_appearance + +/obj/effect/spectre_of_resurrection/human/set_up_resurrection(mob/living/corpse, datum/mind/dead_mind, datum/human_appearance_profile/human_appearance) + . = ..() + src.human_appearance = human_appearance + +// We just use a generic floating human appearance to save unecessary costly icon operations +/obj/effect/spectre_of_resurrection/human/setup_icon(mob/living/corpse) + return + +// Apply stored human details +/obj/effect/spectre_of_resurrection/human/on_corpse_revived() + if (isnull(corpse)) + return + human_appearance?.apply_to(corpse) + return ..() + + +/// Visual flair on the wizard when cast +/obj/effect/temp_visual/immortality_blast + name = "immortal wave" + duration = 2.5 SECONDS + icon = 'icons/effects/96x96.dmi' + icon_state = "boh_tear" + color = COLOR_PALE_GREEN + pixel_x = -32 + pixel_y = -32 + +/obj/effect/temp_visual/immortality_blast/Initialize(mapload) + . = ..() + transform *= 0 + animate(src, transform = matrix(), time = 1.5 SECONDS, easing = ELASTIC_EASING) + animate(transform = matrix() * 3, time = 1 SECONDS, alpha = 0, easing = SINE_EASING | EASE_OUT) + + +/// Visual flair on living creatures who have become immortal +/obj/effect/temp_visual/immortality_pulse + name = "immortal pulse" + duration = 1 SECONDS + icon = 'icons/effects/anomalies.dmi' + icon_state = "dimensional_overlay" + color = COLOR_PALE_GREEN + +/obj/effect/temp_visual/immortality_pulse/Initialize(mapload) + . = ..() + transform *= 0 + animate(src, transform = matrix() * 1.5, alpha = 0, time = 1 SECONDS, easing = SINE_EASING | EASE_OUT) + +#undef IMMORTAL_PRE_ACTIVATION_TIME +#undef IMMORTAL_RESURRECT_TIME diff --git a/code/modules/antagonists/wizard/grand_ritual/finales/midas.dm b/code/modules/antagonists/wizard/grand_ritual/finales/midas.dm new file mode 100644 index 0000000000000..b2e3329261f69 --- /dev/null +++ b/code/modules/antagonists/wizard/grand_ritual/finales/midas.dm @@ -0,0 +1,46 @@ +/// Completely transform the station +/datum/grand_finale/midas + name = "Transformation" + desc = "The ultimate use of your gathered power! Turn their precious station into something much MORE precious, materially speaking!" + icon = 'icons/obj/stack_objects.dmi' + icon_state = "sheet-gold_2" + glow_colour = "#dbdd4c48" + var/static/list/permitted_transforms = list( // Non-dangerous only + /datum/dimension_theme/gold, + /datum/dimension_theme/meat, + /datum/dimension_theme/pizza, + /datum/dimension_theme/natural, + ) + var/datum/dimension_theme/chosen_theme + +// I sure hope this doesn't have performance implications +/datum/grand_finale/midas/trigger(mob/living/carbon/human/invoker) + var/theme_path = pick(permitted_transforms) + chosen_theme = new theme_path() + var/turf/start_turf = get_turf(invoker) + var/greatest_dist = 0 + var/list/turfs_to_transform = list() + for (var/turf/transform_turf as anything in GLOB.station_turfs) + if (!chosen_theme.can_convert(transform_turf)) + continue + var/dist = get_dist(start_turf, transform_turf) + if (dist > greatest_dist) + greatest_dist = dist + if (!turfs_to_transform["[dist]"]) + turfs_to_transform["[dist]"] = list() + turfs_to_transform["[dist]"] += transform_turf + + if (chosen_theme.can_convert(start_turf)) + chosen_theme.apply_theme(start_turf) + + for (var/iterator in 1 to greatest_dist) + if(!turfs_to_transform["[iterator]"]) + continue + addtimer(CALLBACK(src, PROC_REF(transform_area), turfs_to_transform["[iterator]"]), (5 SECONDS) * iterator) + +/datum/grand_finale/midas/proc/transform_area(list/turfs) + for (var/turf/transform_turf as anything in turfs) + if (!chosen_theme.can_convert(transform_turf)) + continue + chosen_theme.apply_theme(transform_turf) + CHECK_TICK diff --git a/code/modules/antagonists/wizard/grand_ritual/fluff.dm b/code/modules/antagonists/wizard/grand_ritual/fluff.dm new file mode 100644 index 0000000000000..506da118d7588 --- /dev/null +++ b/code/modules/antagonists/wizard/grand_ritual/fluff.dm @@ -0,0 +1,25 @@ +/** + * Fluff book to hint at the cheesy grand ritual. + */ +/obj/item/book/manual/ancient_parchment + name = "ancient parchment" + icon = 'icons/obj/scrolls.dmi' + icon_state = "scroll-ancient" + unique = TRUE + w_class = WEIGHT_CLASS_SMALL + starting_author = "Pelagius the Mad" + starting_title = "Worship and Reverence of the Divine Insanity" + starting_content = {" + + + + + Most of the scroll's contents are unintelligible, plagued with mold, milk stains and a stench of spolied goat cheese so potent,
    + you can barely resist turning your head to retch. What's left of the writings is vague and abstract, as if the author
    + was in a mad dash to pass on their findings.

    + However, the runes they have managed to scribe onto the parchment are oddly untouched by time, and remain distinct.
    + You also discover a schema for a more widely-used Grand Ritual rune, however it is dotted with yellow circles, which in turn are
    + filled with black dots. Are these supposed to be... cheese wheels?..

    + As you finish skimming through the wreck that is this scroll, you hear a faint snicker somewhere beyond your mind's eye...

    + + "} diff --git a/code/modules/antagonists/wizard/grand_ritual/grand_ritual.dm b/code/modules/antagonists/wizard/grand_ritual/grand_ritual.dm index ce1d89edcc611..f3ac9b010710b 100644 --- a/code/modules/antagonists/wizard/grand_ritual/grand_ritual.dm +++ b/code/modules/antagonists/wizard/grand_ritual/grand_ritual.dm @@ -1,3 +1,10 @@ +/** + * Total cheese goal to sacrifice to [REDACTED] during wizard grand rituals. + * The easiest way for a wizard to procure cheese is with Summon Cheese spell, which summons 9 per cast. + * The wizard needs to complete 7 rituals, so let's give them some breathing room with cheese offerings. + * 7 * 9 = 63, so the wizard can potentially miss two casts worth of cheese if they summon cheese on each rune. +*/ +#define CHEESE_SACRIFICE_GOAL 50 /** * The Grand Ritual is the Wizard's alternate victory condition * and also a tool to make funny distractions and progress the round state. @@ -30,6 +37,10 @@ var/drew_finale = FALSE /// True while you are drawing a rune, prevents action spamming var/drawing_rune = FALSE + /// Number of cheese sacrificed on previously drawn runes + var/total_cheese_sacrificed = 0 + /// Whether we have sacrificed enough cheese or not + var/total_cheese_goal_met = FALSE /// Weakref to a rune drawn in the current area, if there is one var/datum/weakref/rune @@ -150,13 +161,20 @@ /// Draws the ritual rune /datum/action/cooldown/grand_ritual/proc/draw_rune(turf/target_turf) drawing_rune = TRUE + var/next_rune_typepath = get_appropriate_rune_typepath() target_turf.balloon_alert(owner, "conjuring rune...") - var/obj/effect/temp_visual/wizard_rune/drawing/draw_effect = new(target_turf) + var/draw_effect_typepath = /obj/effect/temp_visual/wizard_rune/drawing + if(next_rune_typepath == /obj/effect/grand_rune/finale/cheesy) + draw_effect_typepath = /obj/effect/temp_visual/wizard_rune/drawing/cheese + var/obj/effect/temp_visual/wizard_rune/drawing/draw_effect = new draw_effect_typepath(target_turf) if(!do_after(owner, 4 SECONDS, target_turf)) target_turf.balloon_alert(owner, "interrupted!") drawing_rune = FALSE qdel(draw_effect) - new /obj/effect/temp_visual/wizard_rune/failed(target_turf) + var/fail_effect_typepath = /obj/effect/temp_visual/wizard_rune/failed + if(next_rune_typepath == /obj/effect/grand_rune/finale/cheesy) + fail_effect_typepath = /obj/effect/temp_visual/wizard_rune/failed/cheese + new fail_effect_typepath(target_turf) return var/evaporated_obstacles = FALSE @@ -176,25 +194,37 @@ playsound(target_turf, 'sound/magic/blind.ogg', 100, TRUE) target_turf.balloon_alert(owner, "rune created") - var/obj/effect/grand_rune/new_rune = create_appropriate_rune(target_turf) + var/obj/effect/grand_rune/new_rune = new next_rune_typepath(target_turf, times_completed) + if(istype(new_rune, /obj/effect/grand_rune/finale)) + drew_finale = TRUE rune = WEAKREF(new_rune) RegisterSignal(new_rune, COMSIG_GRAND_RUNE_COMPLETE, PROC_REF(on_rune_complete)) drawing_rune = FALSE StartCooldown(2 MINUTES) // To put a damper on wizards who have 5 ranks of Teleport /// The seventh rune we spawn is special -/datum/action/cooldown/grand_ritual/proc/create_appropriate_rune(turf/target_turf) +/datum/action/cooldown/grand_ritual/proc/get_appropriate_rune_typepath() if (times_completed < GRAND_RITUAL_FINALE_COUNT - 1) - return new /obj/effect/grand_rune(target_turf, times_completed) + return /obj/effect/grand_rune if (drew_finale) - return new /obj/effect/grand_rune(target_turf, times_completed) - drew_finale = TRUE - return new /obj/effect/grand_rune/finale(target_turf, times_completed) + return /obj/effect/grand_rune + if (total_cheese_sacrificed >= CHEESE_SACRIFICE_GOAL) + return /obj/effect/grand_rune/finale/cheesy + return /obj/effect/grand_rune/finale /// Called when you finish invoking a rune you drew, get ready for another one. -/datum/action/cooldown/grand_ritual/proc/on_rune_complete(atom/source) +/datum/action/cooldown/grand_ritual/proc/on_rune_complete(atom/source, cheese_sacrificed) SIGNAL_HANDLER UnregisterSignal(source, COMSIG_GRAND_RUNE_COMPLETE) + total_cheese_sacrificed += cheese_sacrificed + if(total_cheese_sacrificed >= CHEESE_SACRIFICE_GOAL) + if(!total_cheese_goal_met) + total_cheese_goal_met = TRUE + to_chat(owner, span_revenbignotice("YES! CHEESE! CHEESE FOR EVERYONE! SUCH A GRAND FEAST! YOU SHALL HAVE YOUR PRIZE, MY CHAMPION!!")) + else + to_chat(owner, span_revennotice("You hear maddening laughter as you are hit with an overwhelming odor of fine cheddar...")) + else if (total_cheese_sacrificed) + to_chat(owner, span_revendanger("You please me, mortal. Do continue to send cheese, my feast still needs [CHEESE_SACRIFICE_GOAL - total_cheese_sacrificed] more to be magnificent...")) rune = null times_completed++ set_new_area() @@ -203,8 +233,12 @@ to_chat(owner, span_warning("Your collected power is growing, \ but further rituals will alert your enemies to your position.")) if (GRAND_RITUAL_IMMINENT_FINALE_POTENCY) - to_chat(owner, span_warning("You are overflowing with power! \ - Your next Grand Ritual will allow you to choose a powerful effect, and grant you victory.")) + var/message = "You are overflowing with power! \ + Your next Grand Ritual will allow you to choose a powerful effect, and grant you victory." + if(total_cheese_sacrificed >= CHEESE_SACRIFICE_GOAL) + message = "You are overflowing with chaotic energies! \ + Your next Grand Ritual will conjure a powerful artefact for your use, and grant you victory." + to_chat(owner, span_warning(message)) if (GRAND_RITUAL_FINALE_COUNT) SEND_SIGNAL(src, COMSIG_GRAND_RITUAL_FINAL_COMPLETE) @@ -283,3 +317,13 @@ /obj/effect/temp_visual/wizard_rune/failed icon_state = "wizard_rune_fail" duration = 0.5 SECONDS + +/// Cheese drawing +/obj/effect/temp_visual/wizard_rune/drawing/cheese + icon_state = "wizard_rune_cheese_draw" + +/// Cheese fail +/obj/effect/temp_visual/wizard_rune/failed/cheese + icon_state = "wizard_rune_cheese_fail" + +#undef CHEESE_SACRIFICE_GOAL diff --git a/code/modules/antagonists/wizard/grand_ritual/grand_ritual_finale.dm b/code/modules/antagonists/wizard/grand_ritual/grand_ritual_finale.dm deleted file mode 100644 index 9e752363cf0d8..0000000000000 --- a/code/modules/antagonists/wizard/grand_ritual/grand_ritual_finale.dm +++ /dev/null @@ -1,404 +0,0 @@ -#define DOOM_SINGULARITY "singularity" -#define DOOM_TESLA "tesla" -#define DOOM_METEORS "meteors" - -/** - * A big final event to run when you complete seven rituals - */ -/datum/grand_finale - /// Friendly name for selection menu - var/name - /// Tooltip description for selection menu - var/desc - /// An icon to display to represent the choice - var/icon/icon - /// Icon state to use to represent the choice - var/icon_state - /// Prevent especially dangerous options from being chosen until we're fine with the round ending - var/minimum_time = 0 - /// Override the rune invocation time - var/ritual_invoke_time = 30 SECONDS - /// Provide an extremely loud radio message when this one starts - var/dire_warning = FALSE - /// Overrides the default colour you glow while channeling the rune, optional - var/glow_colour - -/** - * Returns an entry for a radial menu for this choice. - * Returns null if entry is abstract or invalid for current circumstances. - */ -/datum/grand_finale/proc/get_radial_choice() - if (!name || !desc || !icon || !icon_state) - return - if (minimum_time >= world.time - SSticker.round_start_time) - return - var/datum/radial_menu_choice/choice = new() - choice.name = name - choice.image = image(icon = icon, icon_state = icon_state) - choice.info = desc - return choice - -/** - * Actually do the thing. - * Arguments - * * invoker - The wizard casting this. - */ -/datum/grand_finale/proc/trigger(mob/living/invoker) - // Do something cool. - -/// Tries to equip something into an inventory slot, then hands, then the floor. -/datum/grand_finale/proc/equip_to_slot_then_hands(mob/living/carbon/human/invoker, slot, obj/item/item) - if(!item) - return - if(!invoker.equip_to_slot_if_possible(item, slot, disable_warning = TRUE)) - invoker.put_in_hands(item) - -/// They are not going to take this lying down. -/datum/grand_finale/proc/create_vendetta(datum/mind/aggrieved_crewmate, datum/mind/wizard) - aggrieved_crewmate.add_antag_datum(/datum/antagonist/wizard_prank_vendetta) - var/datum/antagonist/wizard_prank_vendetta/antag_datum = aggrieved_crewmate.has_antag_datum(/datum/antagonist/wizard_prank_vendetta) - var/datum/objective/assassinate/wizard_murder = new - wizard_murder.owner = aggrieved_crewmate - wizard_murder.target = wizard - wizard_murder.explanation_text = "Kill [wizard.current.name], the one who did this." - antag_datum.objectives += wizard_murder - - to_chat(aggrieved_crewmate.current, span_warning("No! This isn't right!")) - aggrieved_crewmate.announce_objectives() - -/** - * Antag datum to give to people who want to kill the wizard. - * This doesn't preclude other people choosing to want to kill the wizard, just these people are rewarded for it. - */ -/datum/antagonist/wizard_prank_vendetta - name = "\improper Wizard Prank Victim" - roundend_category = "wizard prank victims" - show_in_antagpanel = FALSE - antagpanel_category = "Other" - show_name_in_check_antagonists = TRUE - count_against_dynamic_roll_chance = FALSE - silent = TRUE - -/// Become the official Captain of the station -/datum/grand_finale/usurp - name = "Usurpation" - desc = "The ultimate use of your gathered power! Rewrite time such that you have been Captain of this station the whole time." - icon = 'icons/obj/card.dmi' - icon_state = "card_gold" - -/datum/grand_finale/usurp/trigger(mob/living/carbon/human/invoker) - message_admins("[key_name(invoker)] has replaced the Captain") - var/list/former_captains = list() - var/list/other_crew = list() - SEND_SOUND(world, sound('sound/magic/timeparadox2.ogg')) - - for (var/mob/living/carbon/human/crewmate as anything in GLOB.human_list) - if (!crewmate.mind) - continue - crewmate.Unconscious(3 SECONDS) // Everyone falls unconscious but not everyone gets told about a new captain - if (crewmate == invoker || IS_HUMAN_INVADER(crewmate)) - continue - to_chat(crewmate, span_notice("The world spins and dissolves. Your past flashes before your eyes, backwards.\n\ - Life strolls back into the ocean and shrinks into nothingness, planets explode into storms of solar dust, \ - the stars rush back to greet each other at the beginning of things and then... you snap back to the present. \n\ - Everything is just as it was and always has been. \n\n\ - A stray thought sticks in the forefront of your mind. \n\ - [span_hypnophrase("I'm so glad that [invoker.real_name] is our legally appointed Captain!")] \n\ - Is... that right?")) - if (is_captain_job(crewmate.mind.assigned_role)) - former_captains += crewmate - demote_to_assistant(crewmate) - continue - if (crewmate.stat != DEAD) - other_crew += crewmate - - dress_candidate(invoker) - GLOB.manifest.modify(invoker.real_name, JOB_CAPTAIN, JOB_CAPTAIN) - minor_announce("Captain [invoker.real_name] on deck!") - - // Enlist some crew to try and restore the natural order - for (var/mob/living/carbon/human/former_captain as anything in former_captains) - create_vendetta(former_captain.mind, invoker.mind) - for (var/mob/living/carbon/human/random_crewmate as anything in other_crew) - if (prob(10)) - create_vendetta(random_crewmate.mind, invoker.mind) - -/** - * Anyone who thought they were Captain is in for a nasty surprise, and won't be very happy about it - */ -/datum/grand_finale/usurp/proc/demote_to_assistant(mob/living/carbon/human/former_captain) - var/obj/effect/particle_effect/fluid/smoke/exit_poof = new(get_turf(former_captain)) - exit_poof.lifetime = 2 SECONDS - - former_captain.unequip_everything() - if(isplasmaman(former_captain)) - former_captain.equipOutfit(/datum/outfit/plasmaman) - former_captain.internal = former_captain.get_item_for_held_index(2) - else - former_captain.equipOutfit(/datum/outfit/job/assistant) - - GLOB.manifest.modify(former_captain.real_name, JOB_ASSISTANT, JOB_ASSISTANT) - var/list/valid_turfs = list() - // Used to be into prison but that felt a bit too mean - for (var/turf/exile_turf as anything in get_area_turfs(/area/station/maintenance, subtypes = TRUE)) - if (isspaceturf(exile_turf) || exile_turf.is_blocked_turf()) - continue - valid_turfs += exile_turf - do_teleport(former_captain, pick(valid_turfs), no_effects = TRUE) - var/obj/effect/particle_effect/fluid/smoke/enter_poof = new(get_turf(former_captain)) - enter_poof.lifetime = 2 SECONDS - -/** - * Does some item juggling to try to dress you as both a Wizard and Captain without deleting any items you have bought. - * ID, headset, and uniform are forcibly replaced. Other slots are only filled if unoccupied. - * We could forcibly replace shoes and gloves too but people might miss their insuls or... meown shoes? - */ -/datum/grand_finale/usurp/proc/dress_candidate(mob/living/carbon/human/invoker) - // Won't be needing these - var/obj/id = invoker.get_item_by_slot(ITEM_SLOT_ID) - QDEL_NULL(id) - var/obj/headset = invoker.get_item_by_slot(ITEM_SLOT_EARS) - QDEL_NULL(headset) - // We're about to take off your pants so those are going to fall out - var/obj/item/pocket_L = invoker.get_item_by_slot(ITEM_SLOT_LPOCKET) - var/obj/item/pocket_R = invoker.get_item_by_slot(ITEM_SLOT_RPOCKET) - // In case we try to put a PDA there - var/obj/item/belt = invoker.get_item_by_slot(ITEM_SLOT_BELT) - belt?.moveToNullspace() - - var/obj/pants = invoker.get_item_by_slot(ITEM_SLOT_ICLOTHING) - QDEL_NULL(pants) - invoker.equipOutfit(/datum/outfit/job/wizard_captain) - // And put everything back! - equip_to_slot_then_hands(invoker, ITEM_SLOT_BELT, belt) - equip_to_slot_then_hands(invoker, ITEM_SLOT_LPOCKET, pocket_L) - equip_to_slot_then_hands(invoker, ITEM_SLOT_RPOCKET, pocket_R) - -/// An outfit which replaces parts of a wizard's clothes with captain's clothes but keeps the robes -/datum/outfit/job/wizard_captain - name = "Captain (Wizard Transformation)" - 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/parade - belt = /obj/item/modular_computer/pda/heads/captain - ears = /obj/item/radio/headset/heads/captain/alt - glasses = /obj/item/clothing/glasses/sunglasses - gloves = /obj/item/clothing/gloves/captain - shoes = /obj/item/clothing/shoes/laceup - accessory = /obj/item/clothing/accessory/medal/gold/captain - backpack_contents = list( - /obj/item/melee/baton/telescopic = 1, - /obj/item/station_charter = 1, - ) - box = null - -/// Dress the crew as magical clowns -/datum/grand_finale/clown - name = "Jubilation" - desc = "The ultimate use of your gathered power! Rewrite time so that everyone went to clown college! Now they'll prank each other for you!" - icon = 'icons/obj/clothing/masks.dmi' - icon_state = "clown" - glow_colour = "#ffff0048" - -/datum/grand_finale/clown/trigger(mob/living/carbon/human/invoker) - for(var/mob/living/carbon/human/victim as anything in GLOB.human_list) - victim.Unconscious(3 SECONDS) - if (!victim.mind || IS_HUMAN_INVADER(victim) || victim == invoker) - continue - if (HAS_TRAIT(victim, TRAIT_CLOWN_ENJOYER)) - victim.add_mood_event("clown_world", /datum/mood_event/clown_world) - to_chat(victim, span_notice("The world spins and dissolves. Your past flashes before your eyes, backwards.\n\ - Life strolls back into the ocean and shrinks into nothingness, planets explode into storms of solar dust, \ - the stars rush back to greet each other at the beginning of things and then... you snap back to the present. \n\ - Everything is just as it was and always has been. \n\n\ - A stray thought sticks in the forefront of your mind. \n\ - [span_hypnophrase("I'm so glad that I work at Clown Research Station [station_name()]!")] \n\ - Is... that right?")) - if (is_clown_job(victim.mind.assigned_role)) - var/datum/action/cooldown/spell/conjure_item/clown_pockets/new_spell = new(victim) - new_spell.Grant(victim) - continue - if (!ismonkey(victim)) // Monkeys cannot yet wear clothes - dress_as_magic_clown(victim) - if (prob(15)) - create_vendetta(victim.mind, invoker.mind) - -/** - * Clown enjoyers who are effected by this become ecstatic, they have achieved their life's dream. - * This moodlet is equivalent to the one for simply being a traitor. - */ -/datum/mood_event/clown_world - mood_change = 4 - -/datum/mood_event/clown_world/add_effects(param) - description = "I LOVE working at Clown Research Station [station_name()]!!" - -/// Dress the passed mob as a magical clown, self-explanatory -/datum/grand_finale/clown/proc/dress_as_magic_clown(mob/living/carbon/human/victim) - var/obj/effect/particle_effect/fluid/smoke/poof = new(get_turf(victim)) - poof.lifetime = 2 SECONDS - - var/obj/item/tank/internal = victim.internal - // We're about to take off your pants so those are going to fall out - var/obj/item/pocket_L = victim.get_item_by_slot(ITEM_SLOT_LPOCKET) - var/obj/item/pocket_R = victim.get_item_by_slot(ITEM_SLOT_RPOCKET) - var/obj/item/id = victim.get_item_by_slot(ITEM_SLOT_ID) - var/obj/item/belt = victim.get_item_by_slot(ITEM_SLOT_BELT) - - var/obj/pants = victim.get_item_by_slot(ITEM_SLOT_ICLOTHING) - var/obj/mask = victim.get_item_by_slot(ITEM_SLOT_MASK) - QDEL_NULL(pants) - QDEL_NULL(mask) - if(isplasmaman(victim)) - victim.equip_to_slot_if_possible(new /obj/item/clothing/under/plasmaman/clown/magic(), ITEM_SLOT_ICLOTHING, disable_warning = TRUE) - victim.equip_to_slot_if_possible(new /obj/item/clothing/mask/gas/clown_hat/plasmaman(), ITEM_SLOT_MASK, disable_warning = TRUE) - else - victim.equip_to_slot_if_possible(new /obj/item/clothing/under/rank/civilian/clown/magic(), ITEM_SLOT_ICLOTHING, disable_warning = TRUE) - victim.equip_to_slot_if_possible(new /obj/item/clothing/mask/gas/clown_hat(), ITEM_SLOT_MASK, disable_warning = TRUE) - - var/obj/item/clothing/mask/gas/clown_hat/clown_mask = victim.get_item_by_slot(ITEM_SLOT_MASK) - if (clown_mask) - var/list/options = GLOB.clown_mask_options - clown_mask.icon_state = options[pick(clown_mask.clownmask_designs)] - victim.update_worn_mask() - clown_mask.update_item_action_buttons() - - equip_to_slot_then_hands(victim, ITEM_SLOT_LPOCKET, pocket_L) - equip_to_slot_then_hands(victim, ITEM_SLOT_RPOCKET, pocket_R) - equip_to_slot_then_hands(victim, ITEM_SLOT_ID, id) - equip_to_slot_then_hands(victim, ITEM_SLOT_BELT, belt) - victim.internal = internal - -/// Give everyone magic items -/datum/grand_finale/magic - name = "Evolution" - desc = "The ultimate use of your gathered power! Give the crew their own magic, they'll surely realise that right and wrong have no meaning when you hold ultimate power!" - icon = 'icons/obj/wizard.dmi' - icon_state = "scroll" - -/datum/grand_finale/magic/trigger(mob/living/carbon/human/invoker) - message_admins("[key_name(invoker)] summoned magic") - summon_magic(survivor_probability = 20) // Wow, this one was easy! - -/// Open all of the doors -/datum/grand_finale/all_access - name = "Connection" - desc = "The ultimate use of your gathered power! Unlock every single door that they have! Nobody will be able to keep you out now, or anyone else for that matter!" - icon = 'icons/mob/actions/actions_spells.dmi' - icon_state = "knock" - -/datum/grand_finale/all_access/trigger(mob/living/carbon/human/invoker) - message_admins("[key_name(invoker)] removed all door access requirements") - for(var/obj/machinery/door/target_door as anything in GLOB.airlocks) - if(is_station_level(target_door.z)) - target_door.unlock() - target_door.req_access = list() - target_door.req_one_access = list() - INVOKE_ASYNC(target_door, TYPE_PROC_REF(/obj/machinery/door/airlock, open)) - CHECK_TICK - priority_announce("AULIE OXIN FIERA!!", null, 'sound/magic/knock.ogg', sender_override = "[invoker.real_name]") - -/// Completely transform the station -/datum/grand_finale/midas - name = "Transformation" - desc = "The ultimate use of your gathered power! Turn their precious station into something much MORE precious, materially speaking!" - icon = 'icons/obj/stack_objects.dmi' - icon_state = "sheet-gold_2" - glow_colour = "#dbdd4c48" - var/static/list/permitted_transforms = list( // Non-dangerous only - /datum/dimension_theme/gold, - /datum/dimension_theme/meat, - /datum/dimension_theme/pizza, - /datum/dimension_theme/natural, - ) - var/datum/dimension_theme/chosen_theme - -// I sure hope this doesn't have performance implications -/datum/grand_finale/midas/trigger(mob/living/carbon/human/invoker) - var/theme_path = pick(permitted_transforms) - chosen_theme = new theme_path() - var/turf/start_turf = get_turf(invoker) - var/greatest_dist = 0 - var/list/turfs_to_transform = list() - for (var/turf/transform_turf as anything in GLOB.station_turfs) - if (!chosen_theme.can_convert(transform_turf)) - continue - var/dist = get_dist(start_turf, transform_turf) - if (dist > greatest_dist) - greatest_dist = dist - if (!turfs_to_transform["[dist]"]) - turfs_to_transform["[dist]"] = list() - turfs_to_transform["[dist]"] += transform_turf - - if (chosen_theme.can_convert(start_turf)) - chosen_theme.apply_theme(start_turf) - - for (var/iterator in 1 to greatest_dist) - if(!turfs_to_transform["[iterator]"]) - continue - addtimer(CALLBACK(src, PROC_REF(transform_area), turfs_to_transform["[iterator]"]), (5 SECONDS) * iterator) - -/datum/grand_finale/midas/proc/transform_area(list/turfs) - for (var/turf/transform_turf as anything in turfs) - if (!chosen_theme.can_convert(transform_turf)) - continue - chosen_theme.apply_theme(transform_turf) - CHECK_TICK - -/// Kill yourself and probably a bunch of other people -/datum/grand_finale/armageddon - name = "Annihilation" - desc = "This crew have offended you beyond the realm of pranks. Make the ultimate sacrifice to teach them a lesson your elders can really respect. \ - YOU WILL NOT SURVIVE THIS." - icon = 'icons/hud/screen_alert.dmi' - icon_state = "wounded" - minimum_time = 90 MINUTES // This will probably immediately end the round if it gets finished. - ritual_invoke_time = 60 SECONDS // Really give the crew some time to interfere with this one. - dire_warning = TRUE - glow_colour = "#be000048" - /// Things to yell before you die - var/static/list/possible_last_words = list( - "Flames and ruin!", - "Dooooooooom!!", - "HAHAHAHAHAHA!! AHAHAHAHAHAHAHAHAA!!", - "Hee hee hee!! Hoo hoo hoo!! Ha ha haaa!!", - "Ohohohohohoho!!", - "Cower in fear, puny mortals!", - "Tremble before my glory!", - "Pick a god and pray!", - "It's no use!", - "If the gods wanted you to live, they would not have created me!", - "God stays in heaven out of fear of what I have created!", - "Ruination is come!", - "All of creation, bend to my will!", - ) - -/datum/grand_finale/armageddon/trigger(mob/living/carbon/human/invoker) - priority_announce(pick(possible_last_words), null, 'sound/magic/voidblink.ogg', sender_override = "[invoker.real_name]") - var/turf/current_location = get_turf(invoker) - invoker.gib() - - var/static/list/doom_options = list() - if (!length(doom_options)) - doom_options = list(DOOM_SINGULARITY, DOOM_TESLA) - if (!SSmapping.config.planetary) - doom_options += DOOM_METEORS - - switch(pick(doom_options)) - if (DOOM_SINGULARITY) - var/obj/singularity/singulo = new(current_location) - singulo.energy = 300 - if (DOOM_TESLA) - var/obj/energy_ball/tesla = new (current_location) - tesla.energy = 200 - if (DOOM_METEORS) - var/datum/dynamic_ruleset/roundstart/meteor/meteors = new() - meteors.meteordelay = 0 - var/datum/game_mode/dynamic/mode = SSticker.mode - mode.execute_roundstart_rule(meteors) // Meteors will continue until morale is crushed. - priority_announce("Meteors have been detected on collision course with the station.", "Meteor Alert", ANNOUNCER_METEORS) - -#undef DOOM_SINGULARITY -#undef DOOM_TESLA -#undef DOOM_METEORS diff --git a/code/modules/antagonists/wizard/grand_ritual/grand_rune.dm b/code/modules/antagonists/wizard/grand_ritual/grand_rune.dm index f697388e049d5..d1b01912ae9d3 100644 --- a/code/modules/antagonists/wizard/grand_ritual/grand_rune.dm +++ b/code/modules/antagonists/wizard/grand_ritual/grand_rune.dm @@ -31,6 +31,10 @@ var/times_invoked = 0 /// What colour you glow while channeling var/spell_colour = "#de3aff48" + /// How much cheese was sacrificed to the other realm, if any + var/cheese_sacrificed = 0 + /// What kind of remains this rune leaves behind after completing invokation + var/remains_typepath = /obj/effect/decal/cleanable/grand_remains /// Magic words you say to invoke the ritual var/list/magic_words = list() /// Things you might yell when invoking a rune @@ -67,7 +71,8 @@ . = ..() src.potency = potency invoke_time = get_invoke_time() - magic_words = pick(possible_magic_words) + if(!length(magic_words)) + magic_words = pick(possible_magic_words) var/image/silicon_image = image(icon = 'icons/effects/eldritch.dmi', icon_state = null, loc = src) silicon_image.override = TRUE add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/silicons, "wizard_rune", silicon_image) @@ -114,6 +119,7 @@ is_in_use = TRUE add_channel_effect(user) user.balloon_alert(user, "invoking rune...") + if(!do_after(user, invoke_time, src)) remove_channel_effect(user) user.balloon_alert(user, "interrupted!") @@ -121,6 +127,30 @@ return times_invoked++ + + //fetch cheese on the rune + var/list/obj/item/food/cheese/wheel/cheese_list = list() + for(var/obj/item/food/cheese/wheel/nearby_cheese in range(1, src)) + if(HAS_TRAIT(nearby_cheese, TRAIT_HAUNTED)) //already haunted + continue + cheese_list += nearby_cheese + //handle cheese sacrifice - haunt a part of all cheese on the rune with each invocation, then delete it + var/list/obj/item/food/cheese/wheel/cheese_to_haunt = list() + cheese_list = shuffle(cheese_list) + //the intent here is to sacrifice cheese in parts, roughly in thirds since we invoke the rune three times + //so hopefully this will properly do that, and on the third invocation it will just eat all remaining cheese + cheese_to_haunt = cheese_list.Copy(1, min(round(length(cheese_list) * times_invoked * 0.4), max(length(cheese_list), 3))) + for(var/obj/item/food/cheese/wheel/sacrifice as anything in cheese_to_haunt) + sacrifice.AddComponent(\ + /datum/component/haunted_item, \ + haunt_color = spell_colour, \ + haunt_duration = 10 SECONDS, \ + aggro_radius = 0, \ + spawn_message = span_revenwarning("[sacrifice] begins to float and twirl into the air as it becomes enveloped in otherworldy energies..."), \ + ) + addtimer(CALLBACK(sacrifice, TYPE_PROC_REF(/obj/item/food/cheese/wheel, consume_cheese)), 10 SECONDS) + cheese_sacrificed += length(cheese_to_haunt) + user.say(magic_words[times_invoked], forced = "grand ritual invocation") remove_channel_effect(user) @@ -130,7 +160,7 @@ if(times_invoked >= GRAND_RUNE_INVOKES_TO_COMPLETE) on_invocation_complete(user) return - flick("wizard_rune_flash", src) + flick("[icon_state]_flash", src) playsound(src,'sound/magic/staff_animation.ogg', 75, TRUE) INVOKE_ASYNC(src, PROC_REF(invoke_rune), user) @@ -154,12 +184,13 @@ INVOKE_ASYNC(src, PROC_REF(summon_round_event), user) // Running the event sleeps trigger_side_effects() tear_reality() - SEND_SIGNAL(src, COMSIG_GRAND_RUNE_COMPLETE) - flick("activate", src) + SEND_SIGNAL(src, COMSIG_GRAND_RUNE_COMPLETE, cheese_sacrificed) + flick("[icon_state]_activate", src) addtimer(CALLBACK(src, PROC_REF(remove_rune)), 6) + SSblackbox.record_feedback("amount", "grand_runes_invoked", 1) /obj/effect/grand_rune/proc/remove_rune() - new /obj/effect/decal/cleanable/grand_remains(get_turf(src)) + new remains_typepath(get_turf(src)) qdel(src) /// Triggers some form of event somewhere on the station @@ -272,9 +303,15 @@ return ..() /obj/effect/grand_rune/finale/interact(mob/living/user) - if (chosen_effect) - return ..() - select_finale(user) + if (!chosen_effect) + select_finale(user) + return + var/round_time_passed = world.time - SSticker.round_start_time + if (chosen_effect && finale_effect.minimum_time >= round_time_passed) + to_chat(user, span_warning("The chosen grand finale will only be available in [DisplayTimeText(finale_effect.minimum_time - round_time_passed)]!")) + return + return ..() + #define PICK_NOTHING "Continuation" @@ -307,10 +344,13 @@ invoke_time = get_invoke_time() if (finale_effect.glow_colour) spell_colour = finale_effect.glow_colour + add_filter("finale_picked_glow", 2, list("type" = "outline", "color" = spell_colour, "size" = 2)) /obj/effect/grand_rune/finale/summon_round_event(mob/living/user) + user.client?.give_award(/datum/award/achievement/misc/grand_ritual_finale, user) if (!finale_effect) return ..() + SSblackbox.record_feedback("tally", "grand_ritual_finale", 1, finale_effect) finale_effect.trigger(user) /obj/effect/grand_rune/finale/get_invoke_time() @@ -318,6 +358,26 @@ return ..() return finale_effect.ritual_invoke_time + +/** + * Spawned when 50 or more cheese was sacrificed during previous grand rituals. + * Will spawn instead of the usual grand ritual rune, and its effect is already set and can't be changed. + * Sorry, no narwal fighting on the open ocean this time. + */ +/obj/effect/grand_rune/finale/cheesy + name = "especially grand rune" + desc = "A ritual circle of maddening shapes and outlines, its mere presence an insult to reason." + icon_state = "wizard_rune_cheese" + magic_words = list("Greetings! Salutations!", "Welcome! Now go away.", "Leave. Run. Or die.") + remains_typepath = /obj/effect/decal/cleanable/grand_remains/cheese + +/obj/effect/grand_rune/finale/cheesy/Initialize(mapload, potency) + . = ..() + finale_effect = new /datum/grand_finale/cheese() + chosen_effect = TRUE + add_filter("finale_picked_glow", 2, list("type" = "outline", "color" = spell_colour, "size" = 2)) + + /** * Spawned when we are done with the rune */ @@ -334,4 +394,9 @@ clean_type = CLEAN_TYPE_HARD_DECAL layer = SIGIL_LAYER +/obj/effect/decal/cleanable/grand_remains/cheese + name = "cheese soot marks" + desc = "The bizarre shapes on the ground turn out to be a cheese crust burned to black tar." + icon_state = "wizard_rune_cheese_burned" + #undef PICK_NOTHING diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index 60ff6288cb9bc..8ecd68dfbcbe3 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -12,6 +12,9 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key) ui_name = "AntagInfoWizard" suicide_cry = "FOR THE FEDERATION!!" preview_outfit = /datum/outfit/wizard + can_assign_self_objectives = TRUE + default_custom_objective = "Demonstrate your incredible and destructive magical powers." + hardcore_random_bonus = TRUE var/give_objectives = TRUE var/strip = TRUE //strip before equipping var/allow_rename = TRUE @@ -50,6 +53,11 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key) /datum/antagonist/wizard_minion/on_gain() create_objectives() + . = ..() + ADD_TRAIT(owner, TRAIT_MAGICALLY_GIFTED, REF(src)) + +/datum/antagonist/wizard_minion/on_removal() + REMOVE_TRAIT(owner, TRAIT_MAGICALLY_GIFTED, REF(src)) return ..() /datum/antagonist/wizard_minion/proc/create_objectives() @@ -69,6 +77,7 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key) CRASH("Wizard datum with no owner.") assign_ritual() equip_wizard() + owner.current.add_quirk(/datum/quirk/introvert) if(give_objectives) create_objectives() if(move_to_lair) @@ -76,6 +85,11 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key) . = ..() if(allow_rename) rename_wizard() + ADD_TRAIT(owner, TRAIT_MAGICALLY_GIFTED, REF(src)) + +/datum/antagonist/wizard/Destroy() + QDEL_NULL(ritual) + return ..() /datum/antagonist/wizard/create_team(datum/team/wizard/new_team) if(!new_team) @@ -98,7 +112,7 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key) /// Initialises the grand ritual action for this mob /datum/antagonist/wizard/proc/assign_ritual() - ritual = new(owner.current) + ritual = new(src) RegisterSignal(ritual, COMSIG_GRAND_RITUAL_FINAL_COMPLETE, PROC_REF(on_ritual_complete)) /datum/antagonist/wizard/proc/send_to_lair() @@ -165,6 +179,7 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key) qdel(spell) owner.current.actions -= spell + REMOVE_TRAIT(owner, TRAIT_MAGICALLY_GIFTED, REF(src)) return ..() /datum/antagonist/wizard/proc/equip_wizard() @@ -180,9 +195,9 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key) H.equipOutfit(outfit_type) /datum/antagonist/wizard/ui_static_data(mob/user) - . = ..() var/list/data = list() data["objectives"] = get_objectives() + data["can_change_objective"] = can_assign_self_objectives return data /datum/antagonist/wizard/ui_data(mob/user) @@ -241,6 +256,7 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key) /datum/antagonist/wizard/apprentice name = "Wizard Apprentice" antag_hud_name = "apprentice" + can_assign_self_objectives = FALSE var/datum/mind/master var/school = APPRENTICE_DESTRUCTION outfit_type = /datum/outfit/wizard/apprentice @@ -358,6 +374,7 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key) show_in_antagpanel = FALSE outfit_type = /datum/outfit/wizard/academy move_to_lair = FALSE + can_assign_self_objectives = FALSE /datum/antagonist/wizard/academy/assign_ritual() return // Has other duties to be getting on with @@ -392,13 +409,11 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key) parts += "
    Grand Rituals completed: [ritual.times_completed]
    " var/count = 1 - var/wizardwin = 1 + var/wizardwin = TRUE for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - parts += "Objective #[count]: [objective.explanation_text] [span_greentext("Success!")]" - else - parts += "Objective #[count]: [objective.explanation_text] [span_redtext("Fail.")]" - wizardwin = 0 + if(!objective.check_completion()) + wizardwin = FALSE + parts += "Objective #[count]: [objective.explanation_text] [objective.get_roundend_success_suffix()]" count++ if(wizardwin) diff --git a/code/modules/art/paintings.dm b/code/modules/art/paintings.dm index ca2bd1bdfed77..9a18a2b026951 100644 --- a/code/modules/art/paintings.dm +++ b/code/modules/art/paintings.dm @@ -249,7 +249,7 @@ painting_metadata.patron_name = user.real_name painting_metadata.credit_value = offer_amount last_patron = WEAKREF(user.mind) - to_chat(user, span_notice("Nanotrasen Trust Foundation thanks you for your contribution. You're now offical patron of this painting.")) + to_chat(user, span_notice("Nanotrasen Trust Foundation thanks you for your contribution. You're now an official patron of this painting.")) var/list/possible_frames = SSpersistent_paintings.get_available_frames(offer_amount) if(possible_frames.len <= 1) // Not much room for choices here. return @@ -354,7 +354,8 @@ /obj/item/canvas/proc/try_rename(mob/user) if(painting_metadata.loaded_from_json) // No renaming old paintings return TRUE - var/new_name = tgui_input_text(user, "What do you want to name the painting?", "Title Your Masterpiece") + var/new_name = tgui_input_text(user, "What do you want to name the painting?", "Title Your Masterpiece", null, MAX_NAME_LEN) + new_name = reject_bad_name(new_name, allow_numbers = TRUE, ascii_only = FALSE, strict = TRUE, cap_after_symbols = FALSE) if(isnull(new_name)) return FALSE if(new_name != painting_metadata.title && user.can_perform_action(src)) diff --git a/code/modules/art/statues.dm b/code/modules/art/statues.dm index 31fe7aefb4b70..66480038a407a 100644 --- a/code/modules/art/statues.dm +++ b/code/modules/art/statues.dm @@ -38,7 +38,7 @@ add_fingerprint(user) if(!(flags_1 & NODECONSTRUCT_1)) if(W.tool_behaviour == TOOL_WELDER) - if(!W.tool_start_check(user, amount=0)) + if(!W.tool_start_check(user, amount=1)) return FALSE user.balloon_alert(user, "slicing apart...") if(W.use_tool(src, user, 40, volume=50)) @@ -64,7 +64,10 @@ /obj/structure/statue/uranium max_integrity = 300 - light_range = 2 + // largish, dim green glow + light_range = 3 + light_power = 0.7 + light_color = LIGHT_COLOR_NUCLEAR custom_materials = list(/datum/material/uranium=SHEET_MATERIAL_AMOUNT*5) impressiveness = 25 // radiation makes an impression abstract_type = /obj/structure/statue/uranium @@ -475,8 +478,8 @@ Moving interrupts user.balloon_alert(user, "no sculpt target!") return FALSE //No big icon things - var/icon/thing_icon = icon(target.icon, target.icon_state) - if(thing_icon.Height() != world.icon_size || thing_icon.Width() != world.icon_size) + var/list/icon_dimensions = get_icon_dimensions(target.icon) + if(icon_dimensions["width"] != world.icon_size || icon_dimensions["height"] != world.icon_size) user.balloon_alert(user, "sculpt target is too big!") return FALSE return TRUE diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index 0153c121d457b..4ea085ca9a342 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -1,6 +1,6 @@ /obj/item/onetankbomb name = "bomb" - icon = 'icons/obj/atmospherics/tank.dmi' + icon = 'icons/obj/canisters.dmi' inhand_icon_state = "assembly" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' @@ -59,7 +59,7 @@ if(status) to_chat(user, span_warning("[bombtank] already has a pressure hole!")) return - if(!I.tool_start_check(user, amount=0)) + if(!I.tool_start_check(user, amount=1)) return if(I.use_tool(src, user, 0, volume=40)) status = TRUE @@ -122,7 +122,7 @@ 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(include_pockets = TRUE, include_accessories = TRUE)) && !user.canUnEquip(src)) to_chat(user, span_warning("[src] is stuck to you!")) return diff --git a/code/modules/assembly/doorcontrol.dm b/code/modules/assembly/doorcontrol.dm index ad2648762861a..8ca5fd8b10e4c 100644 --- a/code/modules/assembly/doorcontrol.dm +++ b/code/modules/assembly/doorcontrol.dm @@ -27,7 +27,7 @@ if(cooldown) return cooldown = TRUE - for(var/obj/machinery/door/poddoor/M in GLOB.airlocks) + for(var/obj/machinery/door/poddoor/M as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/poddoor)) if(M.id == src.id) if(openclose == null || !sync_doors) openclose = M.density @@ -75,7 +75,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 as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/airlock)) if(D.id_tag == src.id) if(specialfunctions & OPEN) open_or_close += D @@ -112,21 +112,21 @@ if(cooldown) return cooldown = TRUE - for(var/obj/machinery/door/poddoor/M in GLOB.airlocks) + for(var/obj/machinery/door/poddoor/M as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/poddoor)) if (M.id == src.id) INVOKE_ASYNC(M, TYPE_PROC_REF(/obj/machinery/door/poddoor, open)) addtimer(CALLBACK(src, PROC_REF(activate_stage2)), 1 SECONDS) /obj/item/assembly/control/massdriver/proc/activate_stage2() - for(var/obj/machinery/mass_driver/M in GLOB.machines) + for(var/obj/machinery/mass_driver/M as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/mass_driver)) if(M.id == src.id) M.drive() addtimer(CALLBACK(src, PROC_REF(activate_stage3)), 6 SECONDS) /obj/item/assembly/control/massdriver/proc/activate_stage3() - for(var/obj/machinery/door/poddoor/M in GLOB.airlocks) + for(var/obj/machinery/door/poddoor/M as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/poddoor)) if (M.id == src.id) INVOKE_ASYNC(M, TYPE_PROC_REF(/obj/machinery/door/poddoor, close)) @@ -141,11 +141,11 @@ if(cooldown) return cooldown = TRUE - for(var/obj/machinery/sparker/M in GLOB.machines) + for(var/obj/machinery/sparker/M as anything in SSmachines.get_machines_by_type_and_subtypes(/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 SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/igniter)) if(M.id == src.id) INVOKE_ASYNC(M, TYPE_PROC_REF(/obj/machinery/igniter, toggle)) @@ -159,7 +159,7 @@ if(cooldown) return cooldown = TRUE - for(var/obj/machinery/flasher/M in GLOB.machines) + for(var/obj/machinery/flasher/M as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/flasher)) if(M.id == src.id) INVOKE_ASYNC(M, TYPE_PROC_REF(/obj/machinery/flasher, flash)) @@ -221,9 +221,12 @@ if(!tram || !tram.is_operational) //tram is QDEL or has no power say("The tram is not in service. Please send a technician to repair the internals of the tram.") return - if(tram.travelling) //in use + if(tram.travelling) //already on its way say("The tram is already travelling to [tram.idle_platform].") return + if(tram.controls_locked) //attempting a dispatch or on cooldown + say("The tram controller is busy. Try again in a moment.") + return if(!destination_platform) return var/obj/effect/landmark/tram/current_location = destination_platform.resolve() @@ -233,5 +236,8 @@ say("The tram is already here. Please board the tram and select a destination.") return - say("The tram has been called to [current_location.name]. Please wait for its arrival.") - tram.tram_travel(current_location) + if(tram.tram_travel(current_location)) + say("The tram has been called to [current_location.name]. Please wait for its arrival.") + return + else + say("The tram controller has encountered an error. Try again in a moment.") diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index b170ba204c449..553118aae2454 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -243,12 +243,18 @@ var/mob/living/silicon/robot/flashed_borgo = M log_combat(user, flashed_borgo, "flashed", src) update_icon(ALL, TRUE) - if(!flashed_borgo.flash_act(affect_silicon = TRUE)) + if(flashed_borgo.flash_act(affect_silicon = TRUE)) + if(flashed_borgo.is_blind()) + var/flash_duration = rand(8,12) SECONDS + flashed_borgo.Paralyze(flash_duration) + flashed_borgo.set_temp_blindness_if_lower(flash_duration) + user.visible_message(span_warning("[user] overloads [flashed_borgo]'s sensors and computing with the flash!"), span_danger("You overload [flashed_borgo]'s sensors and computing with the flash!")) + else + user.visible_message(span_warning("[user] blinds [flashed_borgo] with the flash!"), span_danger("You blind [flashed_borgo] with the flash!")) + flashed_borgo.set_temp_blindness_if_lower( (rand(5,15) SECONDS)) + flashed_borgo.set_confusion_if_lower(5 SECONDS * CONFUSION_STACK_MAX_MULTIPLIER) + else user.visible_message(span_warning("[user] fails to blind [flashed_borgo] with the flash!"), span_warning("You fail to blind [flashed_borgo] with the flash!")) - return - flashed_borgo.Paralyze(rand(80,120)) - flashed_borgo.set_confusion_if_lower(5 SECONDS * CONFUSION_STACK_MAX_MULTIPLIER) - user.visible_message(span_warning("[user] overloads [flashed_borgo]'s sensors with the flash!"), span_danger("You overload [flashed_borgo]'s sensors with the flash!")) return user.visible_message(span_warning("[user] fails to blind [M] with the flash!"), span_warning("You fail to blind [M] with the flash!")) diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index b71388e13cbfd..e706c6f7598ac 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -138,11 +138,7 @@ else if(ismouse(target)) var/mob/living/basic/mouse/splatted = target visible_message(span_boldannounce("SPLAT!")) - if(splatted.health <= 5) - splatted.splat() - else - splatted.adjust_health(5) - splatted.Stun(1 SECONDS) + splatted.splat() // mousetraps are instadeath for mice else if(isregalrat(target)) visible_message(span_boldannounce("Skreeeee!")) //He's simply too large to be affected by a tiny mouse trap. @@ -196,7 +192,7 @@ if(!(MM.movement_type & FLYING)) if(ishuman(AM)) var/mob/living/carbon/H = AM - if(H.m_intent == MOVE_INTENT_RUN) + if(H.move_intent == MOVE_INTENT_RUN) INVOKE_ASYNC(src, PROC_REF(triggered), H) H.visible_message(span_warning("[H] accidentally steps on [src]."), \ span_warning("You accidentally step on [src]")) diff --git a/code/modules/asset_cache/assets/crafting.dm b/code/modules/asset_cache/assets/crafting.dm index 139616fdc817d..8b38b9d32bb79 100644 --- a/code/modules/asset_cache/assets/crafting.dm +++ b/code/modules/asset_cache/assets/crafting.dm @@ -64,9 +64,9 @@ TOOL_SCALPEL = icon('icons/obj/medical/surgery_tools.dmi', "scalpel"), TOOL_SAW = icon('icons/obj/medical/surgery_tools.dmi', "saw"), TOOL_BONESET = icon('icons/obj/medical/surgery_tools.dmi', "bonesetter"), - TOOL_KNIFE = icon('icons/obj/kitchen.dmi', "knife"), + TOOL_KNIFE = icon('icons/obj/service/kitchen.dmi', "knife"), TOOL_BLOODFILTER = icon('icons/obj/medical/surgery_tools.dmi', "bloodfilter"), - TOOL_ROLLINGPIN = icon('icons/obj/kitchen.dmi', "rolling_pin"), + TOOL_ROLLINGPIN = icon('icons/obj/service/kitchen.dmi', "rolling_pin"), TOOL_RUSTSCRAPER = icon('icons/obj/tools.dmi', "wirebrush"), ) diff --git a/code/modules/asset_cache/assets/fish.dm b/code/modules/asset_cache/assets/fish.dm index 14258663d9b9a..2fcf2b803e38c 100644 --- a/code/modules/asset_cache/assets/fish.dm +++ b/code/modules/asset_cache/assets/fish.dm @@ -12,10 +12,3 @@ continue id_list += id Insert(id, fish_icon, fish_icon_state) - - -/datum/asset/simple/fishing_minigame - assets = list( - "fishing_background_default" = 'icons/ui_icons/fishing/default.png', - "fishing_background_lavaland" = 'icons/ui_icons/fishing/lavaland.png' - ) diff --git a/code/modules/asset_cache/assets/light_templates.dm b/code/modules/asset_cache/assets/light_templates.dm new file mode 100644 index 0000000000000..1d51a21e8d67c --- /dev/null +++ b/code/modules/asset_cache/assets/light_templates.dm @@ -0,0 +1,11 @@ +/datum/asset/spritesheet/lights + name = "lights" + +/datum/asset/spritesheet/lights/create_spritesheets() + // These two are required to ensure this spritesheet is not rendered with a fully white background + // No I have absolutely no idea why, something something alpha maybe? but it does work, so that's for LATER!! + Insert("light_dummy_start_fuckyoubyond", 'icons/obj/medical/bloodpack.dmi', "generic_bloodpack") + for(var/id in GLOB.light_types) + var/datum/light_template/template = GLOB.light_types[id] + Insert("light_fantastic_[template.id]", template.icon, template.icon_state) + Insert("light_dummy_end_fuckyoubyond", 'icons/mob/silicon/ai.dmi', "questionmark") diff --git a/code/modules/asset_cache/assets/mecha.dm b/code/modules/asset_cache/assets/mecha.dm index ced0fcf234bcb..fd4b911e20ca3 100644 --- a/code/modules/asset_cache/assets/mecha.dm +++ b/code/modules/asset_cache/assets/mecha.dm @@ -1,5 +1,6 @@ -/datum/asset/spritesheet/mechaarmor - name = "mechaarmor" +/datum/asset/spritesheet/mecha_equipment + name = "mecha_equipment" -/datum/asset/spritesheet/mechaarmor/create_spritesheets() - InsertAll("", 'icons/ui_icons/mecha/armor.dmi') +/datum/asset/spritesheet/mecha_equipment/create_spritesheets() + InsertAll("", 'icons/mob/mecha_equipment.dmi') + InsertAll("", 'icons/obj/ore.dmi') diff --git a/code/modules/asset_cache/assets/pipes.dm b/code/modules/asset_cache/assets/pipes.dm index f553051ba7e6f..d7a85fa172a88 100644 --- a/code/modules/asset_cache/assets/pipes.dm +++ b/code/modules/asset_cache/assets/pipes.dm @@ -2,6 +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/pipes_n_cables/pipe_item.dmi', 'icons/obj/pipes_n_cables/disposal.dmi', 'icons/obj/pipes_n_cables/transit_tube.dmi', 'icons/obj/pipes_n_cables/hydrochem/fluid_ducts.dmi')) InsertAll("", each, GLOB.alldirs) - Insert(sprite_name = "gsensor1", I = 'icons/obj/stationobjs.dmi', icon_state = "gsensor1") diff --git a/code/modules/asset_cache/assets/plumbing.dm b/code/modules/asset_cache/assets/plumbing.dm index a0d2562434947..73b1dfc7df57d 100644 --- a/code/modules/asset_cache/assets/plumbing.dm +++ b/code/modules/asset_cache/assets/plumbing.dm @@ -5,7 +5,7 @@ //load only what we need from the icon files,format is icon_file_name = list of icon_states we need from this file var/list/essentials = list( 'icons/obj/medical/iv_drip.dmi' = list("plumb"), - 'icons/obj/plumbing/fluid_ducts.dmi' = list("nduct"), + 'icons/obj/pipes_n_cables/hydrochem/fluid_ducts.dmi' = list("nduct"), 'icons/hud/radial.dmi' = list( "plumbing_layer1", "plumbing_layer2", @@ -13,7 +13,7 @@ "plumbing_layer8", "plumbing_layer16", ), - 'icons/obj/plumbing/plumbers.dmi' = list( + 'icons/obj/pipes_n_cables/hydrochem/plumbers.dmi' = list( "synthesizer", "reaction_chamber", "grinder_chemical", diff --git a/code/modules/asset_cache/assets/rcd.dm b/code/modules/asset_cache/assets/rcd.dm index bbb469860907d..e4c54929dae19 100644 --- a/code/modules/asset_cache/assets/rcd.dm +++ b/code/modules/asset_cache/assets/rcd.dm @@ -7,15 +7,13 @@ //load all category essential icon_states. format is icon_file = list of icon states we need from that file var/list/essentials = list( 'icons/obj/chairs.dmi' = list("bar"), - 'icons/obj/firealarm.dmi' = list("fire_bitem"), + 'icons/obj/machines/wallmounts.dmi' = list("apc", "alarm_bitem", "fire_bitem"), 'icons/obj/lighting.dmi' = list("floodlight_c1"), - 'icons/obj/monitors.dmi' = list("alarm_bitem"), - 'icons/obj/wallframe.dmi' = list("apc"), - 'icons/obj/stock_parts.dmi' = list("box_1"), - 'icons/obj/objects.dmi' = list("bed"), + 'icons/obj/assemblies/stock_parts.dmi' = list("box_1"), + 'icons/obj/bed.dmi' = list("bed"), 'icons/obj/smooth_structures/catwalk.dmi' = list("catwalk-0"), 'icons/hud/radial.dmi' = list("cnorth", "csouth", "ceast", "cwest", "chair", "secure_windoor", "stool", "wallfloor", "windowsize", "windowtype", "windoor"), - 'icons/obj/structures.dmi' = list("glass_table", "rack", "rwindow0", "reflector_base", "table", "window0"), + 'icons/obj/structures.dmi' = list("glass_table", "rack", "rwindow0", "reflector_base", "table", "window0", "girder"), ) var/icon/icon @@ -29,7 +27,7 @@ //for each airlock type we create its overlayed version with the suffix Glass in the sprite name var/list/airlocks = list( "Standard" = 'icons/obj/doors/airlocks/station/public.dmi', - "Public" = 'icons/obj/doors/airlocks/station2/glass.dmi', + "Public" = 'icons/obj/doors/airlocks/public/glass.dmi', "Engineering" = 'icons/obj/doors/airlocks/station/engineering.dmi', "Atmospherics" = 'icons/obj/doors/airlocks/station/atmos.dmi', "Security" = 'icons/obj/doors/airlocks/station/security.dmi', diff --git a/code/modules/asset_cache/assets/sheetmaterials.dm b/code/modules/asset_cache/assets/sheetmaterials.dm index d746b5783e5a6..037a7e4b4fc25 100644 --- a/code/modules/asset_cache/assets/sheetmaterials.dm +++ b/code/modules/asset_cache/assets/sheetmaterials.dm @@ -4,5 +4,3 @@ /datum/asset/spritesheet/sheetmaterials/create_spritesheets() InsertAll("", 'icons/obj/stack_objects.dmi') - // Special case to handle Bluespace Crystals - Insert("polycrystal", 'icons/obj/telescience.dmi', "polycrystal") diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm index 76d8b1c3c1201..75354c0eee397 100644 --- a/code/modules/atmospherics/environmental/LINDA_fire.dm +++ b/code/modules/atmospherics/environmental/LINDA_fire.dm @@ -305,9 +305,4 @@ /obj/effect/hotspot/singularity_pull() return -/obj/effect/dummy/lighting_obj/moblight/fire - name = "fire" - light_color = LIGHT_COLOR_FIRE - light_range = LIGHT_RANGE_FIRE - #undef INSUFFICIENT diff --git a/code/modules/atmospherics/environmental/LINDA_system.dm b/code/modules/atmospherics/environmental/LINDA_system.dm index 0c281a36c403b..5f2b30a0d1969 100644 --- a/code/modules/atmospherics/environmental/LINDA_system.dm +++ b/code/modules/atmospherics/environmental/LINDA_system.dm @@ -75,10 +75,10 @@ // Multiz is shitcode welcome home var/turf/current_turf = (direction & (UP|DOWN)) ? \ (direction & UP) ? \ - (z_traits["16"]) ? \ + (z_traits[Z_LEVEL_UP]) ? \ (get_step(locate(x, y, z + 1), NONE)) : \ (null) : \ - (z_traits["32"]) ? \ + (z_traits[Z_LEVEL_DOWN]) ? \ (get_step(locate(x, y, z - 1), NONE)) : \ (null) : \ (get_step(src, direction)) @@ -172,6 +172,8 @@ return adjacent_turfs /atom/proc/air_update_turf(update = FALSE, remove = FALSE) + if(!SSair.initialized) // I'm sorry for polutting user code, I'll do 10 hail giacom's + return var/turf/local_turf = get_turf(loc) if(!local_turf) return @@ -187,6 +189,8 @@ * * remove - Are you removing an active turf (Read wall), or adding one */ /turf/air_update_turf(update = FALSE, remove = FALSE) + if(!SSair.initialized) // I'm sorry for polutting user code, I'll do 10 hail giacom's + return if(update) immediate_calculate_adjacent_turfs() if(remove) diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index 1f85f8f4e6176..87523034f3ecc 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -695,7 +695,7 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) return FALSE output_air.merge(removed) - return TRUE + return removed /// Releases gas from src to output air. This means that it can not transfer air to gas mixture with higher pressure. /datum/gas_mixture/proc/release_gas_to(datum/gas_mixture/output_air, target_pressure, rate=1) diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm index a6467b71305c0..ae3367ace5932 100644 --- a/code/modules/atmospherics/gasmixtures/gas_types.dm +++ b/code/modules/atmospherics/gasmixtures/gas_types.dm @@ -23,8 +23,7 @@ var/fill = list() to_return += list(fill) for(var/j in 1 to TOTAL_VISIBLE_STATES) - var/obj/effect/overlay/gas/gas = new (initial(gas_type.gas_overlay), log(4, (j+0.4*TOTAL_VISIBLE_STATES) / (0.35*TOTAL_VISIBLE_STATES)) * 255) - SET_PLANE_W_SCALAR(gas, gas.plane, i) + var/obj/effect/overlay/gas/gas = new (initial(gas_type.gas_overlay), log(4, (j+0.4*TOTAL_VISIBLE_STATES) / (0.35*TOTAL_VISIBLE_STATES)) * 255, i) fill += gas return to_return @@ -292,8 +291,17 @@ plane = ABOVE_GAME_PLANE appearance_flags = TILE_BOUND vis_flags = NONE + // The visual offset we are "on". + // Can't use the tradtional loc because we are stored in nullspace, and we can't set plane before init because of the helping that SET_PLANE_EXPLICIT does IN init + var/plane_offset = 0 -/obj/effect/overlay/gas/New(state, alph) +/obj/effect/overlay/gas/New(state, alph, offset) . = ..() icon_state = state alpha = alph + plane_offset = offset + +/obj/effect/overlay/gas/Initialize(mapload) + . = ..() + SET_PLANE_W_SCALAR(src, initial(plane), plane_offset) + diff --git a/code/modules/atmospherics/gasmixtures/reaction_factors.dm b/code/modules/atmospherics/gasmixtures/reaction_factors.dm index bc2a00e2ccb66..1b96a89768377 100644 --- a/code/modules/atmospherics/gasmixtures/reaction_factors.dm +++ b/code/modules/atmospherics/gasmixtures/reaction_factors.dm @@ -7,37 +7,37 @@ /datum/gas_reaction/miaster/init_factors() factor = list( - /datum/gas/miasma = "Miasma is consumed at 1 reaction rate.", - /datum/gas/oxygen = "Oxygen is produced at 1 reaction rate.", - "Temperature" = "Higher temperature increases the reaction rate.", - "Energy" = "[MIASTER_STERILIZATION_ENERGY] joules of energy is released per rate.", + /datum/gas/miasma = "Miasma is sterilized at a rate that scales with the difference between the temperature and [MIASTER_STERILIZATION_TEMP]K.", + /datum/gas/oxygen = "One mole of oxygen is released per mole of miasma consumed.", + "Temperature" = "Higher temperature increases the speed of miasma sterilization.", + "Energy" = "[MIASTER_STERILIZATION_ENERGY] joules of energy is released per mole of miasma sterilized.", ) /datum/gas_reaction/plasmafire/init_factors() factor = list( - /datum/gas/oxygen = "Oxygen consumption is determined by the temperature, ranging from [OXYGEN_BURN_RATIO_BASE] of the reaction rate at [PLASMA_MINIMUM_BURN_TEMPERATURE] Kelvins to [OXYGEN_BURN_RATIO_BASE-1] at [PLASMA_UPPER_TEMPERATURE] Kelvins. Higher oxygen concentration up to [PLASMA_OXYGEN_FULLBURN]x times the plasma increases the reaction rate.", - /datum/gas/plasma = "Plasma is consumed at 1 reaction rate. It's relationship with oxygen also determines reaction speed", - /datum/gas/tritium = "Tritium is formed at 1 reaction rate if there are 97 times more oxygen than plasma.", - /datum/gas/water_vapor = "Water vapor is formed at 0.25 reaction rate if tritium isn't being formed.", - /datum/gas/carbon_dioxide = "Carbon Dioxide is formed at 0.75 reaction rate if tritium isn't being formed.", - "Temperature" = "Minimum temperature of [PLASMA_MINIMUM_BURN_TEMPERATURE] kelvin to occur. Higher temperature up to [PLASMA_UPPER_TEMPERATURE] increases the oxygen efficiency and also the reaction rate.", - "Energy" = "[FIRE_PLASMA_ENERGY_RELEASED] joules of energy is released per reaction rate", + /datum/gas/oxygen = "Oxygen consumption is determined by the temperature, ranging from [OXYGEN_BURN_RATIO_BASE] moles per mole of plasma consumed at [PLASMA_MINIMUM_BURN_TEMPERATURE] Kelvins to [OXYGEN_BURN_RATIO_BASE-1] moles per mole of plasma consumed at [PLASMA_UPPER_TEMPERATURE] Kelvins. Higher oxygen concentration up to [PLASMA_OXYGEN_FULLBURN] times the plasma increases the speed of plasma consumption.", + /datum/gas/plasma = "Plasma is consumed at a rate that scales with the difference between the temperature and [PLASMA_MINIMUM_BURN_TEMPERATURE]K, with maximum scaling at [PLASMA_UPPER_TEMPERATURE]K.", + /datum/gas/tritium = "Tritium is formed at 1 mole per mole of plasma consumed if there are at least 97 times more oxygen than plasma.", + /datum/gas/water_vapor = "Water vapor is formed at 0.25 moles per mole of plasma consumed if tritium isn't being formed.", + /datum/gas/carbon_dioxide = "Carbon Dioxide is formed at 0.75 moles per mole of plasma consumed if tritium isn't being formed.", + "Temperature" = "Minimum temperature of [PLASMA_MINIMUM_BURN_TEMPERATURE] kelvin to occur. Higher temperature up to [PLASMA_UPPER_TEMPERATURE]K increases the oxygen efficiency and also the plasma consumption rate.", + "Energy" = "[FIRE_PLASMA_ENERGY_RELEASED] joules of energy is released per mole of plasma consumed.", ) /datum/gas_reaction/h2fire/init_factors() factor = list( - /datum/gas/oxygen = "Oxygen is consumed at 0.5 reaction rate. Higher oxygen concentration up to [HYDROGEN_OXYGEN_FULLBURN] times the hydrogen increases the reaction rate.", - /datum/gas/hydrogen = "Hydrogen is consumed at 1 reaction rate. Its relationship with oxygen also determines the reaction speed.", - /datum/gas/water_vapor = "Water vapor is formed at 1 reaction rate.", + /datum/gas/oxygen = "Oxygen is consumed at 0.5 moles per mole of hydrogen consumed. Higher oxygen concentration up to [HYDROGEN_OXYGEN_FULLBURN] times the hydrogen increases the hydrogen consumption rate.", + /datum/gas/hydrogen = "Hydrogen is consumed rapidly fast as long as there's enough oxygen to allow combustion.", + /datum/gas/water_vapor = "Water vapor is produced at 1 mole per mole of hydrogen combusted.", "Temperature" = "Minimum temperature of [FIRE_MINIMUM_TEMPERATURE_TO_EXIST] kelvin to occur", "Energy" = "[FIRE_HYDROGEN_ENERGY_RELEASED] joules of energy is released per mol of hydrogen consumed.", ) /datum/gas_reaction/tritfire/init_factors() factor = list( - /datum/gas/oxygen = "Oxygen is consumed at 0.5 reaction rate. Higher oxygen concentration up to [TRITIUM_OXYGEN_FULLBURN] times the tritium increases the reaction rate.", - /datum/gas/tritium = "Tritium is consumed at 1 reaction rate. Its relationship with oxygen also determines the reaction speed.", - /datum/gas/water_vapor = "Water vapor is formed at 1 reaction rate.", + /datum/gas/oxygen = "Oxygen is consumed at 0.5 moles per mole of tritium consumed. Higher oxygen concentration up to [TRITIUM_OXYGEN_FULLBURN] times the tritium increases the tritium consumption rate.", + /datum/gas/tritium = "Tritium is consumed at rapidly fast as long as there's enough oxygen to allow combustion.", + /datum/gas/water_vapor = "Water vapor is produced at 1 mole per mole of tritium combusted.", "Temperature" = "Minimum temperature of [FIRE_MINIMUM_TEMPERATURE_TO_EXIST] kelvin to occur", "Energy" = "[FIRE_TRITIUM_ENERGY_RELEASED] joules of energy is released per mol of tritium consumed.", "Radiation" = "This reaction emits radiation proportional to the amount of energy released.", @@ -45,37 +45,37 @@ /datum/gas_reaction/freonfire/init_factors() factor = list( - /datum/gas/oxygen = "Oxygen consumption is determined by the temperature, ranging from [OXYGEN_BURN_RATIO_BASE] of the reaction rate at [FREON_LOWER_TEMPERATURE] Kelvins to [OXYGEN_BURN_RATIO_BASE-1] at [FREON_MAXIMUM_BURN_TEMPERATURE] Kelvins. Higher oxygen concentration up to [FREON_OXYGEN_FULLBURN] times the freon increases the reaction rate.", - /datum/gas/freon = "Freon is consumed at 1 reaction rate. It's relationship with oxygen also determines reaction speed", - /datum/gas/carbon_dioxide = "Carbon Dioxide is formed at 1 reaction rate.", + /datum/gas/oxygen = "Oxygen consumption is determined by the temperature, ranging from [OXYGEN_BURN_RATIO_BASE] moles per mole of freon consumed at [FREON_LOWER_TEMPERATURE] Kelvins to [OXYGEN_BURN_RATIO_BASE-1] moles per mole of freon consumed at [FREON_MAXIMUM_BURN_TEMPERATURE] Kelvins. Higher oxygen concentration up to [FREON_OXYGEN_FULLBURN] times the freon increases freon consumption rate.", + /datum/gas/freon = "Freon is consumed at a rate that scales with the distance of the temperature from [FREON_MAXIMUM_BURN_TEMPERATURE]K. Its relationship with oxygen also determines consumption rate.", + /datum/gas/carbon_dioxide = "Carbon Dioxide is formed at 1 mole per mole of freon consumed.", "Temperature" = "Can only occur between [FREON_LOWER_TEMPERATURE] - [FREON_MAXIMUM_BURN_TEMPERATURE] Kelvin", - "Energy" = "[FIRE_FREON_ENERGY_CONSUMED] joules of energy is absorbed per reaction rate", - "Hot Ice" = "This reaction has a small chance to produce hot ice when occuring between [HOT_ICE_FORMATION_MINIMUM_TEMPERATURE]-[HOT_ICE_FORMATION_MAXIMUM_TEMPERATURE] kelvins", + "Energy" = "[FIRE_FREON_ENERGY_CONSUMED] joules of energy is absorbed per mole of freon consumed.", + "Hot Ice" = "This reaction produces hot ice when occuring between [HOT_ICE_FORMATION_MINIMUM_TEMPERATURE]-[HOT_ICE_FORMATION_MAXIMUM_TEMPERATURE] kelvins", ) /datum/gas_reaction/nitrousformation/init_factors() factor = list( - /datum/gas/oxygen = "10 moles of Oxygen needs to be present for the reaction to occur. Oxygen is consumed at 1 reaction rate", - /datum/gas/nitrogen = " 20 moles of Nitrogen needs to be present for the reaction to occur. Nitrogen is consumed at 2 reaction rate", + /datum/gas/oxygen = "10 moles of Oxygen needs to be present for the reaction to occur. Oxygen is consumed at 0.5 moles per mole of nitrous oxide formed.", + /datum/gas/nitrogen = " 20 moles of Nitrogen needs to be present for the reaction to occur. Nitrogen is consumed at 1 mole per mole of nitrous oxife formed.", /datum/gas/bz = "5 moles of BZ needs to be present for the reaction to occur. Not consumed.", - /datum/gas/nitrous_oxide = "Nitrous oxide is produced at 1 reaction rate", + /datum/gas/nitrous_oxide = "Nitrous oxide gets produced rapidly.", "Temperature" = "Can only occur between [N2O_FORMATION_MIN_TEMPERATURE] - [N2O_FORMATION_MAX_TEMPERATURE] Kelvin", - "Energy" = "[N2O_FORMATION_ENERGY] joules of energy is released per reaction rate", + "Energy" = "[N2O_FORMATION_ENERGY] joules of energy is released per mole of nitrous oxide formed.", ) /datum/gas_reaction/nitrous_decomp/init_factors() factor = list( - /datum/gas/nitrous_oxide = "Nitrous Oxide is consumed at 1 reaction rate. Minimum of [MINIMUM_MOLE_COUNT * 2] to occur.", //okay this one isn't made into a define yet. - /datum/gas/oxygen = "Oxygen is formed at 0.5 reaction rate", - /datum/gas/nitrogen = "Nitrogen is formed at 1 reaction rate", - "Temperature" = "Higher temperature increases the reaction rate. Can only happen between [N2O_DECOMPOSITION_MIN_TEMPERATURE] - [N2O_DECOMPOSITION_MAX_TEMPERATURE] kelvin.", - "Energy" = "[N2O_DECOMPOSITION_ENERGY] joules of energy is released per reaction rate", + /datum/gas/nitrous_oxide = "Nitrous Oxide is decomposed at a rate that scales negatively with the distance between the temperature and average of the minimum and maximum temperature of the reaction. Minimum of [MINIMUM_MOLE_COUNT * 2] to occur.", //okay this one isn't made into a define yet. + /datum/gas/oxygen = "Oxygen is formed at 0.5 moles per mole of nitrous oxide decomposed.", + /datum/gas/nitrogen = "Nitrogen is formed at 1 mole per mole of nitrous oxide decomposed.", + "Temperature" = "The decomposition rate scales with the product of the distances between temperature and minimum and maximum temperature. Can only happen between [N2O_DECOMPOSITION_MIN_TEMPERATURE] - [N2O_DECOMPOSITION_MAX_TEMPERATURE] kelvin.", + "Energy" = "[N2O_DECOMPOSITION_ENERGY] joules of energy is released per mole of nitrous oxide decomposed.", ) /datum/gas_reaction/bzformation/init_factors() factor = list( - /datum/gas/plasma = "Each mole of BZ made consumes 0.8 moles of plasma. If there is more plasma than nitrous oxide reaction rate is slowed down.", + /datum/gas/plasma = "Each mole of BZ made consumes 0.8 moles of plasma. If there is more plasma than nitrous oxide, bz formation rate gets slowed down.", /datum/gas/nitrous_oxide = "Each mole of bz made consumes 0.4 moles of Nitrous oxide. If there is less nitrous oxide than plasma the reaction rate is slowed down. At three times the amount of plasma to Nitrous oxide it will start breaking down into Nitrogen and Oxygen, the lower the ratio the more Nitrous oxide decomposes.", /datum/gas/bz = "The lower the pressure and larger the volume the more bz gets made. Less nitrous oxide than plasma will slow down the reaction.", /datum/gas/nitrogen = "Each mole Nitrous oxide decomposed makes 1 mol Nitrogen. Lower ratio of Nitrous oxide to Plasma means a higher ratio of decomposition to BZ production.", @@ -85,124 +85,124 @@ /datum/gas_reaction/pluox_formation/init_factors() factor = list( - /datum/gas/carbon_dioxide = "Carbon dioxide is consumed at 1 reaction rate", - /datum/gas/oxygen = "Oxygen is consumed at 0.5 reaction rate", - /datum/gas/tritium = "Tritium is consumed at 0.01 reaction rate", - /datum/gas/pluoxium = "Pluoxium is produced at 1 reaction rate", - /datum/gas/hydrogen = "Hydrogen is produced at 0.01 reaction rate", - "Energy" = "[PLUOXIUM_FORMATION_ENERGY] joules of energy is released per reaction rate", + /datum/gas/carbon_dioxide = "1 mole of carbon dioxide gets consumed per mole of pluoxium formed.", + /datum/gas/oxygen = "Oxygen is consumed at 0.5 moles per mole of pluoxium formed.", + /datum/gas/tritium = "Tritium is converted into hydrogen at 0.01 moles per mole of pluoxium formed.", + /datum/gas/pluoxium = "Pluoxium is produced at a constant rate in any given mixture.", + /datum/gas/hydrogen = "Hydrogen is formed from the tritium losing their neutrons.", + "Energy" = "[PLUOXIUM_FORMATION_ENERGY] joules of energy is released per mole of pluoxium formed.", "Temperature" = "Can only occur between [PLUOXIUM_FORMATION_MIN_TEMP] - [PLUOXIUM_FORMATION_MAX_TEMP] Kelvin", ) /datum/gas_reaction/nitrium_formation/init_factors() factor = list( - /datum/gas/bz = "5 moles of BZ needs to be present for the reaction to occur. BZ is consumed at 0.05 reaction rate.", - /datum/gas/tritium = "20 moles of tritium needs to be present for the reaction to occur. Tritium is consumed at 1 reaction rate", - /datum/gas/nitrogen = "10 moles of tritium needs to be present for the reaction to occur. Nitrogen is consumed at 1 reaction rate", - /datum/gas/nitrium = "Nitrium is produced at 1 reaction rate", + /datum/gas/bz = "5 moles of BZ needs to be present for the reaction to occur. BZ is consumed at 0.05 moles per mole of nitrium formed.", + /datum/gas/tritium = "20 moles of tritium needs to be present for the reaction to occur. Tritium is consumed at 1 mole per mole of nitroum formed.", + /datum/gas/nitrogen = "10 moles of nitrogen needs to be present for the reaction to occur. Nitrogen is consumed at 1 mole per mole of nitrium formed.", + /datum/gas/nitrium = "Nitrium is produced at a rate that scales with the temperature.", "Temperature" = "Can only occur above [NITRIUM_FORMATION_MIN_TEMP] kelvins", - "Energy" = "[NITRIUM_FORMATION_ENERGY] joules of energy is absorbed per reaction rate", + "Energy" = "[NITRIUM_FORMATION_ENERGY] joules of energy is absorbed per mole of nitrium formed.", ) /datum/gas_reaction/nitrium_decomposition/init_factors() factor = list( /datum/gas/oxygen = "[MINIMUM_MOLE_COUNT] moles of oxygen need to be present for the reaction to occur. Not consumed.", - /datum/gas/nitrium = "Nitrium is consumed at 1 reaction rate", - /datum/gas/hydrogen = "Hydrogen is produced at 1 reaction rate", - /datum/gas/nitrogen = "Nitrogen is produced at 1 reaction rate", - "Temperature" = " Can only occur below [NITRIUM_DECOMPOSITION_MAX_TEMP]. Higher temperature increases the reaction rate.", - "Energy" = "[NITRIUM_DECOMPOSITION_ENERGY] joules of energy is released per reaction rate", + /datum/gas/nitrium = "Nitrium is consumed at a rate that scales with the temperature.", + /datum/gas/hydrogen = "Hydrogen is produced at 1 mole per mole of nitrium decomposed.", + /datum/gas/nitrogen = "Nitrogen is produced at 1 mole per mole of nitrium decomposed.", + "Temperature" = "Can only occur below [NITRIUM_DECOMPOSITION_MAX_TEMP]. Higher temperature increases the nitrium decomposition rate.", + "Energy" = "[NITRIUM_DECOMPOSITION_ENERGY] joules of energy is released per mole of nitrium decomposed.", ) /datum/gas_reaction/freonformation/init_factors() factor = list( - /datum/gas/plasma = "At least 0.06 moles of plasma needs to be present. Plasma is consumed at 0.6 moles per tile/pipenet", - /datum/gas/carbon_dioxide = "At least 0.03 moles of CO2 needs to be present. CO2 is consumed at 0.3 moles per tile/pipenet", - /datum/gas/bz = "At least 0.01 moles of BZ needs to be present. BZ is consumed at 0.1 moles per tile/pipenet", - /datum/gas/freon = "Freon is produced at 1 mole per tile/pipenet", - "Energy" = "Between 100 and 800 joules of energy is absorbed per mole of freon produced", + /datum/gas/plasma = "At least 0.06 moles of plasma needs to be present. Plasma is consumed at 0.6 moles per mole of freon formed.", + /datum/gas/carbon_dioxide = "At least 0.03 moles of CO2 needs to be present. CO2 is consumed at 0.3 moles per mole of freon formed.", + /datum/gas/bz = "At least 0.01 moles of BZ needs to be present. BZ is consumed at 0.1 moles per mole of freon formed.", + /datum/gas/freon = "Freon is produced at a rate that scales with the sum of a quadratic exponential and sigmoidal function, with the quadratic exponential peaking at 800 Kelvin, but the sigmoidal function takes dominance at over 5,500K being up to 3 times more efficient.", + "Energy" = "Between 100 and 800 joules of energy is absorbed per mole of freon produced", // I don't know why the energy release is also a sigmoidal function, but it should really just be constant to be honest. "Temperature" = "Minimum temperature of [FIRE_MINIMUM_TEMPERATURE_TO_EXIST + 100] Kelvin to occur, with production peak at 800 K. However at temperatures above 5500 K higher rates are possible maxing out at three times the low temperature rate at over 8500 K.", ) /datum/gas_reaction/nobliumformation/init_factors() factor = list( - /datum/gas/nitrogen = "10 moles of nitrogen needs to be present for the reaction to occur. Nitrogen is consumed at 10 reaction rate", - /datum/gas/tritium = "5 moles of tritium needs to be present for the reaction to occur. Tritium is consumed at 5 reaction rate", - /datum/gas/hypernoblium = "Hyper-Noblium is produced at 1 reaction rate", - "Energy" = "[NOBLIUM_FORMATION_ENERGY] joules of energy is released per reaction rate.", - /datum/gas/bz = "BZ is not consumed in the reaction but will lower the amount of energy released. It also reduces amount of trit consumed by a ratio between trit and bz, greater bz than trit will reduce more.", + /datum/gas/nitrogen = "10 moles of nitrogen needs to be present for the reaction to occur. Nitrogen is consumed at 10 moles per mole of hypernoblium formed.", + /datum/gas/tritium = "5 moles of tritium needs to be present for the reaction to occur. Tritium is consumed at 5 moles per mole of hypernoblium formed. The relative consumption rate of tritium decreases in the exposure of BZ.", + /datum/gas/hypernoblium = "Hyper-Noblium production scales based on the sum of the nitrogen and tritium moles.", + "Energy" = "[NOBLIUM_FORMATION_ENERGY] joules of energy is released per mole of hypernoblium produced.", + /datum/gas/bz = "BZ is not consumed in the reaction but will lower the amount of energy released. It also reduces amount of tritium consumed by a ratio between tritium and bz, greater bz than tritium will reduce more.", "Temperature" = "Can only occur between [NOBLIUM_FORMATION_MIN_TEMP] - [NOBLIUM_FORMATION_MAX_TEMP] kelvin", ) /datum/gas_reaction/halon_o2removal/init_factors() factor = list( - /datum/gas/halon = "Halon is consumed at 1 reaction rate", - /datum/gas/oxygen = "Oxygen is consumed at 20 reaction rate", - /datum/gas/carbon_dioxide = "Carbon dioxide is produced at 5 reaction rate.", - "Energy" = "[HALON_COMBUSTION_ENERGY] joules of energy is absorbed per reaction rate", - "Temperature" = "Can only occur above [FIRE_MINIMUM_TEMPERATURE_TO_EXIST] kelvin. Higher temperature increases the reaction rate.", + /datum/gas/halon = "Halon is consumed at a rate that scales with temperature.", + /datum/gas/oxygen = "20 moles of oxygen is consumed per mole of halon combusted.", + /datum/gas/carbon_dioxide = "Carbon dioxide is produced at 5 moles per mole of halon consumed.", + "Energy" = "[HALON_COMBUSTION_ENERGY] joules of energy is absorbed per mole of halon consumed.", + "Temperature" = "Can only occur above [FIRE_MINIMUM_TEMPERATURE_TO_EXIST] kelvin. Higher temperature increases halon consumption rate.", ) /datum/gas_reaction/healium_formation/init_factors() factor = list( - /datum/gas/bz = "BZ is consumed at 0.25 reaction rate", - /datum/gas/freon = "Freon is consumed at 2.75 reaction rate", - /datum/gas/healium = "Healium is produced at 3 reaction rate", - "Temperature" = "Can only occur between [HEALIUM_FORMATION_MIN_TEMP] - [HEALIUM_FORMATION_MAX_TEMP]. Higher temperature increases the reaction rate.", - "Energy" = "[HEALIUM_FORMATION_ENERGY] joules of energy is released per reaction rate.", + /datum/gas/bz = "BZ is consumed at 1/12th of a mole per mole of healium formed.", + /datum/gas/freon = "Freon is consumed at 11/12th of a mole per mole of healium formed.", + /datum/gas/healium = "Healium is formed at a rate that scales with the temperature.", + "Temperature" = "Can only occur between [HEALIUM_FORMATION_MIN_TEMP] - [HEALIUM_FORMATION_MAX_TEMP]. Higher temperature increases healium formation rate.", + "Energy" = "[HEALIUM_FORMATION_ENERGY/3] joules of energy is released per mole of healium formed.", ) /datum/gas_reaction/zauker_formation/init_factors() factor = list( - /datum/gas/hypernoblium = "Hyper-Noblium is consumed at 0.01 reaction rate", - /datum/gas/nitrium = "Nitrium is consumed at 0.5 reaction rate", - /datum/gas/zauker = "Zauker is produced at 0.5 reaction rate", - "Temperature" = "Can only occur between [ZAUKER_FORMATION_MIN_TEMPERATURE] - [ZAUKER_FORMATION_MAX_TEMPERATURE] kelvin", - "Energy" = "[ZAUKER_FORMATION_ENERGY] joules of energy is absorbed per reaction rate", + /datum/gas/hypernoblium = "Hyper-Noblium is consumed at 0.02 moles per mole of zauker formed.", + /datum/gas/nitrium = "Nitrium is consumed at 1 mole per mole of zauker formed.", + /datum/gas/zauker = "Zauker is produced at a rate that scales with the temperature.", + "Temperature" = "Can only occur between [ZAUKER_FORMATION_MIN_TEMPERATURE] - [ZAUKER_FORMATION_MAX_TEMPERATURE] kelvin. Zauker formation rate is proportional to the temperature.", + "Energy" = "[2 * ZAUKER_FORMATION_ENERGY] joules of energy is absorbed per mole of zauker formed.", ) /datum/gas_reaction/zauker_decomp/init_factors() //Fixed reaction rate factor = list( - /datum/gas/zauker = "Zauker is consumed at 1 reaction rate", - /datum/gas/nitrogen = "At least [MINIMUM_MOLE_COUNT] moles of Nitrogen needs to be present for this reaction to occur. Nitrogen is produced at 0.7 reaction rate", - /datum/gas/oxygen = "Oxygen is produced at 0.3 reaction rate", - "Energy" = "[ZAUKER_DECOMPOSITION_ENERGY] joules of energy is released per reaction rate", + /datum/gas/zauker = "Zauker is consumed at [ZAUKER_DECOMPOSITION_MAX_RATE SECONDS / SSair.wait] moles per second in any unique gas mixture.", + /datum/gas/nitrogen = "At least [MINIMUM_MOLE_COUNT] moles of Nitrogen needs to be present for this reaction to occur. Nitrogen is produced at 0.7 moles per mole of Zauker decomposed.", + /datum/gas/oxygen = "Oxygen is produced at 0.3 moles per mole of zauker decomposed.", + "Energy" = "[ZAUKER_DECOMPOSITION_ENERGY] joules of energy is released per mole of zauker decomposed.", ) /datum/gas_reaction/proto_nitrate_formation/init_factors() factor = list( - /datum/gas/pluoxium = "Pluoxium is consumed at 0.2 reaction rate", - /datum/gas/hydrogen = "Hydrogen is consumed at 2 reaction rate", - /datum/gas/proto_nitrate = "Proto-Nitrate is produced at 2.2 reaction rate", - "Energy" = "[PN_FORMATION_ENERGY] joules of energy is released per reaction rate", - "Temperature" = "Can only occur between [PN_FORMATION_MIN_TEMPERATURE] - [PN_FORMATION_MAX_TEMPERATURE] kelvin. Higher temperature increases the reaction rate.", + /datum/gas/pluoxium = "Pluoxium is consumed at 1/11th of a mole per mole of proto-nitrate formed.", + /datum/gas/hydrogen = "Hydrogen is consumed at 10/11th of a mole per mole of proto-nitrate formed.", + /datum/gas/proto_nitrate = "Proto-Nitrate is produced at a rate that scales with the temperature.", + "Energy" = "[PN_FORMATION_ENERGY / 2.2] joules of energy is released per mole of proto-nitrate formed.", + "Temperature" = "Can only occur between [PN_FORMATION_MIN_TEMPERATURE] - [PN_FORMATION_MAX_TEMPERATURE] kelvin. Higher temperature increases proto-nitrate formation rate.", ) /datum/gas_reaction/proto_nitrate_hydrogen_response/init_factors() // Fixed reaction rate factor = list( - /datum/gas/hydrogen = "[PN_HYDROGEN_CONVERSION_THRESHOLD] moles of hydrogen needs to be present for the reaction to occur. Hydrogen is consumed at 1 reaction rate.", - /datum/gas/proto_nitrate = "[MINIMUM_MOLE_COUNT] moles of proto-nitrate needs to be present for the reaction to occur. Proto nitrate is produced at 0.5 reaction rate.", - "Energy" = "[PN_HYDROGEN_CONVERSION_ENERGY] joules of energy is absorbed per reaction rate", + /datum/gas/hydrogen = "[PN_HYDROGEN_CONVERSION_THRESHOLD] moles of hydrogen needs to be present for the reaction to occur. Hydrogen is consumed at 2 moles per mole of proto-nitrate formed.", + /datum/gas/proto_nitrate = "[MINIMUM_MOLE_COUNT] moles of proto-nitrate needs to be present for the reaction to occur. Proto nitrate is produced a rate that scales with its mole count, up to a max of [PN_HYDROGEN_CONVERSION_MAX_RATE * 0.5 SECONDS / SSair.wait] moles per second.", + "Energy" = "[PN_HYDROGEN_CONVERSION_ENERGY * 2] joules of energy is absorbed per mole of proto-nitrate formed.", ) /datum/gas_reaction/proto_nitrate_tritium_response/init_factors() factor = list( - /datum/gas/tritium = "Tritium is consumed at 1 reaction rate.", - /datum/gas/proto_nitrate = "Proto nitrate is consumed at 0.01 reaction rate.", - /datum/gas/hydrogen = "Hydrogen is produced at 1 reaction rate.", - "Energy" = "[PN_TRITIUM_CONVERSION_ENERGY] joules of energy is released per reaction rate", - "Radiation" = "This reaction emits radiation proportional to the reaction rate.", + /datum/gas/tritium = "Tritium radiates its neutrons at a rate that scales with the temperature and proto-nitrate mole count.", + /datum/gas/proto_nitrate = "Proto nitrate is consumed at 0.005 moles per mole of neutrons released.", + /datum/gas/hydrogen = "Hydrogen remains after the neutrons escape.", + "Energy" = "[PN_TRITIUM_CONVERSION_ENERGY / 2] joules of energy is released per mole of neutron released.", + "Radiation" = "Neutrons get released as ionising radiation.", ) /datum/gas_reaction/proto_nitrate_bz_response/init_factors() factor = list( - /datum/gas/proto_nitrate = "[MINIMUM_MOLE_COUNT] moles of proto-nitrate needs to be present for the reaction to occur", - /datum/gas/bz = "BZ is consumed at 1 reaction rate.", - /datum/gas/nitrogen = "Nitrogen is produced at 0.4 reaction rate.", - /datum/gas/helium = "Helium is produced at 1.6 reaction rate.", - /datum/gas/plasma = "Plasma is produced at 0.8 reaction rate.", - "Energy" = "[PN_BZASE_ENERGY] joules of energy is released per reaction rate", - "Radiation" = "This reaction emits radiation proportional to the reaction rate.", + /datum/gas/proto_nitrate = "[MINIMUM_MOLE_COUNT] moles of proto-nitrate needs to be present for the reaction to occur. Proto-nitrate accelerates the BZ decomposition.", + /datum/gas/bz = "BZ gets decomposed into plasma and nitrous oxide. The nitrous oxide then decomposes into nitrogen and oxygen, with the oxygen then decaying into helium.", + /datum/gas/nitrogen = "Nitrogen is produced at 0.4 moles per mole of BZ decomposed.", + /datum/gas/helium = "Helium is produced at 1.6 moles per mole of BZ decomposed.", + /datum/gas/plasma = "Plasma is produced at 0.8 moles per mole of BZ decomposed.", + "Energy" = "[PN_BZASE_ENERGY] joules of energy is released per mole of BZ decomposed.", + "Radiation" = "Radiation gets released during this decomposition process.", "Hallucinations" = "This reaction can cause various carbon based lifeforms in the vicinity to hallucinate.", - "Nuclear Particles" = "This reaction emits extremely high energy nuclear particles, up to [PN_BZASE_NUCLEAR_PARTICLE_MAXIMUM] per reaction rate.", + "Nuclear Particles" = "This reaction emits extremely high energy nuclear particles, up to [2 * PN_BZASE_NUCLEAR_PARTICLE_MAXIMUM] per second per unique gas mixture.", ) diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index d3b768802277e..e957c6f21d3e9 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -448,8 +448,8 @@ /datum/gas_reaction/nitrousformation/react(datum/gas_mixture/air) var/list/cached_gases = air.gases - var/heat_efficency = min(cached_gases[/datum/gas/oxygen][MOLES], cached_gases[/datum/gas/nitrogen][MOLES] * INVERSE(2)) - if ((cached_gases[/datum/gas/oxygen][MOLES] - heat_efficency < 0 ) || (cached_gases[/datum/gas/nitrogen][MOLES] - heat_efficency * 2 < 0)) + var/heat_efficency = min(cached_gases[/datum/gas/oxygen][MOLES] * INVERSE(0.5), cached_gases[/datum/gas/nitrogen][MOLES]) + if ((cached_gases[/datum/gas/oxygen][MOLES] - heat_efficency * 0.5 < 0 ) || (cached_gases[/datum/gas/nitrogen][MOLES] - heat_efficency < 0)) return NO_REACTION // Shouldn't produce gas from nothing. var/old_heat_capacity = air.heat_capacity() @@ -536,9 +536,10 @@ var/volume = air.return_volume() var/environment_effciency = volume/pressure //More volume and less pressure gives better rates var/ratio_efficency = min(cached_gases[/datum/gas/nitrous_oxide][MOLES]/cached_gases[/datum/gas/plasma][MOLES], 1) //Less n2o than plasma give lower rates - var/bz_formed = min(0.01 * ratio_efficency * environment_effciency, cached_gases[/datum/gas/nitrous_oxide][MOLES] * INVERSE(0.4), cached_gases[/datum/gas/plasma][MOLES] * INVERSE(0.8)) + var/nitrous_oxide_decomposed_factor = max(4 * (cached_gases[/datum/gas/plasma][MOLES] / (cached_gases[/datum/gas/nitrous_oxide][MOLES] + cached_gases[/datum/gas/plasma][MOLES]) - 0.75), 0) // Nitrous oxide decomposes when there are more than 3 parts plasma per n2o. + var/bz_formed = min(0.01 * ratio_efficency * environment_effciency, cached_gases[/datum/gas/nitrous_oxide][MOLES] * INVERSE(0.4), cached_gases[/datum/gas/plasma][MOLES] * INVERSE(0.8 * (1 - nitrous_oxide_decomposed_factor))) - if (cached_gases[/datum/gas/nitrous_oxide][MOLES] - bz_formed * 0.4 < 0 || cached_gases[/datum/gas/plasma][MOLES] - (0.8 * bz_formed) < 0 || bz_formed <= 0) + if (cached_gases[/datum/gas/nitrous_oxide][MOLES] - bz_formed * 0.4 < 0 || cached_gases[/datum/gas/plasma][MOLES] - 0.8 * bz_formed * (1 - nitrous_oxide_decomposed_factor) < 0 || bz_formed <= 0) return NO_REACTION var/old_heat_capacity = air.heat_capacity() @@ -549,7 +550,6 @@ *Plasma acts as a catalyst on decomposition, so it doesn't get consumed in the process. *N2O decomposes with its normal decomposition energy */ - var/nitrous_oxide_decomposed_factor = max(4 * (cached_gases[/datum/gas/plasma][MOLES] / (cached_gases[/datum/gas/nitrous_oxide][MOLES] + cached_gases[/datum/gas/plasma][MOLES]) - 0.75), 0) if (nitrous_oxide_decomposed_factor>0) ASSERT_GAS(/datum/gas/nitrogen, air) ASSERT_GAS(/datum/gas/oxygen, air) @@ -779,14 +779,17 @@ /datum/gas_reaction/nobliumformation/react(datum/gas_mixture/air) var/list/cached_gases = air.gases - var/nob_formed = min((cached_gases[/datum/gas/nitrogen][MOLES] + cached_gases[/datum/gas/tritium][MOLES]) * 0.01, cached_gases[/datum/gas/tritium][MOLES] * INVERSE(5), cached_gases[/datum/gas/nitrogen][MOLES] * INVERSE(10)) - - if (nob_formed <= 0 || (cached_gases[/datum/gas/tritium][MOLES] - 5 * nob_formed < 0) || (cached_gases[/datum/gas/nitrogen][MOLES] - 10 * nob_formed < 0)) + /// List of gases we will assert, and possibly garbage collect. + var/list/asserted_gases = list(/datum/gas/hypernoblium, /datum/gas/bz) + air.assert_gases(arglist(asserted_gases)) + var/reduction_factor = clamp(cached_gases[/datum/gas/tritium][MOLES] / (cached_gases[/datum/gas/tritium][MOLES] + cached_gases[/datum/gas/bz][MOLES]), 0.001 , 1) //reduces trit consumption in presence of bz upward to 0.1% reduction + var/nob_formed = min((cached_gases[/datum/gas/nitrogen][MOLES] + cached_gases[/datum/gas/tritium][MOLES]) * 0.01, cached_gases[/datum/gas/tritium][MOLES] * INVERSE(5 * reduction_factor), cached_gases[/datum/gas/nitrogen][MOLES] * INVERSE(10)) + + if (nob_formed <= 0 || (cached_gases[/datum/gas/tritium][MOLES] - 5 * nob_formed * reduction_factor < 0) || (cached_gases[/datum/gas/nitrogen][MOLES] - 10 * nob_formed < 0)) + air.garbage_collect(arglist(asserted_gases)) return NO_REACTION var/old_heat_capacity = air.heat_capacity() - air.assert_gases(/datum/gas/hypernoblium, /datum/gas/bz) - var/reduction_factor = clamp(cached_gases[/datum/gas/tritium][MOLES]/(cached_gases[/datum/gas/tritium][MOLES] + cached_gases[/datum/gas/bz][MOLES]), 0.001 , 1) //reduces trit consumption in presence of bz upward to 0.1% reduction cached_gases[/datum/gas/tritium][MOLES] -= 5 * nob_formed * reduction_factor cached_gases[/datum/gas/nitrogen][MOLES] -= 10 * nob_formed cached_gases[/datum/gas/hypernoblium][MOLES] += nob_formed // I'm not going to nitpick, but N20H10 feels like it should be an explosive more than anything. diff --git a/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm b/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm index 0aa32f0669124..e629c14e0fef0 100644 --- a/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm +++ b/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm @@ -3,7 +3,7 @@ /obj/machinery/airalarm name = "air alarm" desc = "A machine that monitors atmosphere levels. Goes off if the area is dangerous." - icon = 'icons/obj/monitors.dmi' + icon = 'icons/obj/machines/wallmounts.dmi' icon_state = "alarmp" idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.05 active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.02 @@ -85,7 +85,7 @@ GLOBAL_LIST_EMPTY_TYPED(air_alarms, /obj/machinery/airalarm) /obj/machinery/airalarm/Initialize(mapload, ndir, nbuild) . = ..() - wires = new /datum/wires/airalarm(src) + set_wires(new /datum/wires/airalarm(src)) if(ndir) setDir(ndir) @@ -112,7 +112,7 @@ GLOBAL_LIST_EMPTY_TYPED(air_alarms, /obj/machinery/airalarm) my_area = connected_sensor ? get_area(connected_sensor) : get_area(src) alarm_manager = new(src) - select_mode(src, /datum/air_alarm_mode/filtering) + select_mode(src, /datum/air_alarm_mode/filtering, should_apply = FALSE) AddElement(/datum/element/connect_loc, atmos_connections) AddComponent(/datum/component/usb_port, list( @@ -124,6 +124,7 @@ GLOBAL_LIST_EMPTY_TYPED(air_alarms, /obj/machinery/airalarm) GLOB.air_alarms += src update_appearance() + find_and_hang_on_wall() /obj/machinery/airalarm/process() if(!COOLDOWN_FINISHED(src, warning_cooldown)) @@ -586,14 +587,15 @@ GLOBAL_LIST_EMPTY_TYPED(air_alarms, /obj/machinery/airalarm) selected_mode.replace(my_area, pressure) -/obj/machinery/airalarm/proc/select_mode(atom/source, datum/air_alarm_mode/mode_path) +/obj/machinery/airalarm/proc/select_mode(atom/source, datum/air_alarm_mode/mode_path, should_apply = TRUE) var/datum/air_alarm_mode/new_mode = GLOB.air_alarm_modes[mode_path] if(!new_mode) return if(new_mode.emag && !(obj_flags & EMAGGED)) return selected_mode = new_mode - selected_mode.apply(my_area) + if(should_apply) + selected_mode.apply(my_area) SEND_SIGNAL(src, COMSIG_AIRALARM_UPDATE_MODE, source) MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 27) @@ -654,7 +656,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 27) ///Used for air alarm link helper, which connects air alarm to a sensor with corresponding chamber_id /obj/machinery/airalarm/proc/setup_chamber_link() - var/obj/machinery/air_sensor/sensor = GLOB.objects_by_id_tag[CHAMBER_SENSOR_FROM_ID(air_sensor_chamber_id)] + var/obj/machinery/air_sensor/sensor = GLOB.objects_by_id_tag[GLOB.map_loaded_sensors[air_sensor_chamber_id]] if(isnull(sensor)) log_mapping("[src] at [AREACOORD(src)] tried to connect to a sensor, but no sensor with chamber_id:[air_sensor_chamber_id] found!") return diff --git a/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm b/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm index c74a3ce78bb0b..3ec8fbdd99b37 100644 --- a/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm +++ b/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm @@ -47,7 +47,7 @@ /obj/machinery/airalarm/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) if((buildstage == AIR_ALARM_BUILD_NO_CIRCUIT) && (the_rcd.upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS)) - return list("mode" = RCD_WALLFRAME, "delay" = 20, "cost" = 1) + return list("mode" = RCD_WALLFRAME, "delay" = 2 SECONDS, "cost" = 1) return FALSE /obj/machinery/airalarm/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) @@ -82,12 +82,14 @@ to_chat(user, span_danger("Access denied.")) return -/obj/machinery/airalarm/emag_act(mob/user) +/obj/machinery/airalarm/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE obj_flags |= EMAGGED - visible_message(span_warning("Sparks fly out of [src]!"), span_notice("You emag [src], disabling its safeties.")) + visible_message(span_warning("Sparks fly out of [src]!")) + balloon_alert(user, "authentication sensors scrambled") playsound(src, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + return TRUE /obj/machinery/airalarm/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) @@ -182,7 +184,7 @@ /obj/item/wallframe/airalarm name = "air alarm frame" desc = "Used for building Air Alarms." - icon = 'icons/obj/monitors.dmi' + icon = 'icons/obj/machines/wallmounts.dmi' icon_state = "alarm_bitem" result_path = /obj/machinery/airalarm pixel_shift = 27 diff --git a/code/modules/atmospherics/machinery/air_alarm/air_alarm_modes.dm b/code/modules/atmospherics/machinery/air_alarm/air_alarm_modes.dm index ae20bda1f5dda..d916f585e1905 100644 --- a/code/modules/atmospherics/machinery/air_alarm/air_alarm_modes.dm +++ b/code/modules/atmospherics/machinery/air_alarm/air_alarm_modes.dm @@ -41,6 +41,7 @@ GLOBAL_LIST_INIT(air_alarm_modes, init_air_alarm_modes()) vent.on = TRUE vent.pressure_checks = ATMOS_EXTERNAL_BOUND vent.external_pressure_bound = ONE_ATMOSPHERE + vent.pump_direction = ATMOS_DIRECTION_RELEASING vent.update_appearance(UPDATE_ICON) for (var/obj/machinery/atmospherics/components/unary/vent_scrubber/scrubber as anything in applied.air_scrubbers) @@ -59,6 +60,7 @@ GLOBAL_LIST_INIT(air_alarm_modes, init_air_alarm_modes()) vent.on = TRUE vent.pressure_checks = ATMOS_EXTERNAL_BOUND vent.external_pressure_bound = ONE_ATMOSPHERE + vent.pump_direction = ATMOS_DIRECTION_RELEASING vent.update_appearance(UPDATE_ICON) var/list/filtered = subtypesof(/datum/gas) @@ -79,6 +81,7 @@ GLOBAL_LIST_INIT(air_alarm_modes, init_air_alarm_modes()) vent.on = TRUE vent.pressure_checks = ATMOS_EXTERNAL_BOUND vent.external_pressure_bound = ONE_ATMOSPHERE * 2 + vent.pump_direction = ATMOS_DIRECTION_RELEASING vent.update_appearance(UPDATE_ICON) for (var/obj/machinery/atmospherics/components/unary/vent_scrubber/scrubber as anything in applied.air_scrubbers) @@ -96,6 +99,7 @@ GLOBAL_LIST_INIT(air_alarm_modes, init_air_alarm_modes()) vent.on = TRUE vent.pressure_checks = ATMOS_EXTERNAL_BOUND vent.external_pressure_bound = ONE_ATMOSPHERE * 3 + vent.pump_direction = ATMOS_DIRECTION_RELEASING vent.update_appearance(UPDATE_ICON) for (var/obj/machinery/atmospherics/components/unary/vent_scrubber/scrubber as anything in applied.air_scrubbers) @@ -131,6 +135,7 @@ GLOBAL_LIST_INIT(air_alarm_modes, init_air_alarm_modes()) vent.on = TRUE vent.pressure_checks = ATMOS_EXTERNAL_BOUND vent.external_pressure_bound = ONE_ATMOSPHERE + vent.pump_direction = ATMOS_DIRECTION_RELEASING vent.update_appearance(UPDATE_ICON) for (var/obj/machinery/atmospherics/components/unary/vent_scrubber/scrubber as anything in applied.air_scrubbers) @@ -194,6 +199,26 @@ GLOBAL_LIST_INIT(air_alarm_modes, init_air_alarm_modes()) vent.on = TRUE vent.pressure_checks = ATMOS_INTERNAL_BOUND vent.internal_pressure_bound = 0 + vent.pump_direction = ATMOS_DIRECTION_RELEASING + vent.update_appearance(UPDATE_ICON) + + for (var/obj/machinery/atmospherics/components/unary/vent_scrubber/scrubber as anything in applied.air_scrubbers) + scrubber.on = FALSE + scrubber.update_appearance(UPDATE_ICON) + +/datum/air_alarm_mode/vent_siphon + name = "Vent siphon" + desc = "Disables scrubbers and turns vents to siphon" + danger = TRUE + emag = TRUE // siphoning things with vents can horribly fuck up distro, even if its surprisingly fast + +/datum/air_alarm_mode/vent_siphon/apply(area/applied) + for (var/obj/machinery/atmospherics/components/unary/vent_pump/vent as anything in applied.air_vents) + vent.on = TRUE + vent.pressure_checks = NONE + vent.internal_pressure_bound = 0 + vent.external_pressure_bound = 0 + vent.pump_direction = ATMOS_DIRECTION_SIPHONING vent.update_appearance(UPDATE_ICON) for (var/obj/machinery/atmospherics/components/unary/vent_scrubber/scrubber as anything in applied.air_scrubbers) diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 1fa5eee696bf6..417e5055de755 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -481,7 +481,7 @@ * * Creates the image for the pipe underlay that all components use, called by get_pipe_underlay() in components_base.dm * Arguments: - * * iconfile - path of the iconstate we are using (ex: 'icons/obj/atmospherics/components/thermomachine.dmi') + * * iconfile - path of the iconstate we are using (ex: 'icons/obj/machines/atmospherics/thermomachine.dmi') * * iconstate - the image we are using inside the file * * direction - the direction of our device * * color - the color (in hex value, like #559900) that the pipe should have diff --git a/code/modules/atmospherics/machinery/bluespace_vendor.dm b/code/modules/atmospherics/machinery/bluespace_vendor.dm index 1c97236bd6953..847533540180d 100644 --- a/code/modules/atmospherics/machinery/bluespace_vendor.dm +++ b/code/modules/atmospherics/machinery/bluespace_vendor.dm @@ -1,7 +1,7 @@ /obj/item/wallframe/bluespace_vendor_mount name = "bluespace vendor wall mount" desc = "Used for placing bluespace vendors." - icon = 'icons/obj/atmospherics/components/bluespace_gas_selling.dmi' + icon = 'icons/obj/machines/atmospherics/bluespace_gas_selling.dmi' icon_state = "bluespace_vendor_open" result_path = /obj/machinery/bluespace_vendor/built pixel_shift = 30 @@ -13,7 +13,7 @@ #define BS_MODE_OPEN 4 /obj/machinery/bluespace_vendor - icon = 'icons/obj/atmospherics/components/bluespace_gas_selling.dmi' + icon = 'icons/obj/machines/atmospherics/bluespace_gas_selling.dmi' icon_state = "bluespace_vendor_off" base_icon_state = "bluespace_vendor" name = "Bluespace Gas Vendor" @@ -69,6 +69,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/bluespace_vendor, 30) /obj/machinery/bluespace_vendor/Initialize(mapload) . = ..() AddComponent(/datum/component/payment, tank_cost, SSeconomy.get_dep_account(ACCOUNT_ENG), PAYMENT_ANGRY) + find_and_hang_on_wall( FALSE) /obj/machinery/bluespace_vendor/LateInitialize() . = ..() diff --git a/code/modules/atmospherics/machinery/components/binary_devices/binary_devices.dm b/code/modules/atmospherics/machinery/components/binary_devices/binary_devices.dm index 31d7c04caa8db..b26f0c028d1af 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/binary_devices.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/binary_devices.dm @@ -1,5 +1,5 @@ /obj/machinery/atmospherics/components/binary - icon = 'icons/obj/atmospherics/components/binary_devices.dmi' + icon = 'icons/obj/machines/atmospherics/binary_devices.dmi' dir = SOUTH initialize_directions = SOUTH|NORTH use_power = IDLE_POWER_USE @@ -16,7 +16,7 @@ initialize_directions = EAST|WEST /obj/machinery/atmospherics/components/binary/get_node_connects() - return list(turn(dir, 180), dir) + return list(REVERSE_DIR(dir), dir) /** * Used by binary devices to set what the offset will be for each layer, called in update_icon_nopipes() 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 20adef76f0464..8423730937413 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 @@ -3,7 +3,7 @@ #define OUTPUT_MAX 4 /obj/machinery/atmospherics/components/binary/dp_vent_pump - icon = 'icons/obj/atmospherics/components/unary_devices.dmi' //We reuse the normal vent icons! + icon = 'icons/obj/machines/atmospherics/unary_devices.dmi' //We reuse the normal vent icons! icon_state = "dpvent_map-3" //node2 is output port diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 006d9c956480e..3c1ba634caeed 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -5,7 +5,7 @@ // // Thus, the two variables affect pump operation are set in New(): // air1.volume -// This is the volume of gas available to the pump that may be transfered to the output +// This is the volume of gas available to the pump that may be transferred to the output // air2.volume // Higher quantities of this cause more air to be perfected later // but overall network volume is also increased as this increases... 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 180f6d66c5e73..94013ccadc7fe 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm @@ -1,11 +1,11 @@ -// Every cycle, the pump uses the air in air_in to try and make air_out the perfect pressure. +// Every cycle, the pump uses the air in air_in to try and move a specific volume of gas into air_out. // -// node1, air1, network1 correspond to input -// node2, air2, network2 correspond to output +// node1, air1, network1 corresponds to input +// node2, air2, network2 corresponds to output // // Thus, the two variables affect pump operation are set in New(): // air1.volume -// This is the volume of gas available to the pump that may be transfered to the output +// This is the volume of gas available to the pump that may be transferred to the output // air2.volume // Higher quantities of this cause more air to be perfected later // but overall network volume is also increased as this increases... @@ -54,7 +54,7 @@ var/altlayeroverlay = FALSE if(set_overlay_offset(piping_layer) == 2) altlayeroverlay = TRUE - overclock_overlay = mutable_appearance('icons/obj/atmospherics/components/binary_devices.dmi', "vpumpoverclock[altlayeroverlay ? "2" : ""]") + overclock_overlay = mutable_appearance('icons/obj/machines/atmospherics/binary_devices.dmi', "vpumpoverclock[altlayeroverlay ? "2" : ""]") if(overclocked && on && is_operational) add_overlay(overclock_overlay) else @@ -72,13 +72,9 @@ var/input_starting_pressure = air1.return_pressure() var/output_starting_pressure = air2.return_pressure() - if((input_starting_pressure < 0.01) || ((output_starting_pressure > 9000)) && !overclocked) + if((input_starting_pressure < VOLUME_PUMP_MINIMUM_OUTPUT_PRESSURE) || ((output_starting_pressure > VOLUME_PUMP_MAX_OUTPUT_PRESSURE)) && !overclocked) return - if(overclocked && (output_starting_pressure-input_starting_pressure > 1000))//Overclocked pumps can only force gas a certain amount. - return - - var/transfer_ratio = transfer_rate / air1.volume var/datum/gas_mixture/removed = air1.remove_ratio(transfer_ratio) diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm index 3ee1169c33201..e9899ab654e3e 100644 --- a/code/modules/atmospherics/machinery/components/components_base.dm +++ b/code/modules/atmospherics/machinery/components/components_base.dm @@ -78,14 +78,14 @@ continue var/obj/machinery/atmospherics/node = nodes[i] var/node_dir = get_dir(src, node) - var/mutable_appearance/pipe_appearance = mutable_appearance('icons/obj/atmospherics/pipes/pipe_underlays.dmi', "intact_[node_dir]_[underlay_pipe_layer]") + var/mutable_appearance/pipe_appearance = mutable_appearance('icons/obj/pipes_n_cables/pipe_underlays.dmi', "intact_[node_dir]_[underlay_pipe_layer]") pipe_appearance.color = node.pipe_color underlays += pipe_appearance connected |= node_dir for(var/direction in GLOB.cardinals) if((initialize_directions & direction) && !(connected & direction)) - var/mutable_appearance/pipe_appearance = mutable_appearance('icons/obj/atmospherics/pipes/pipe_underlays.dmi', "exposed_[direction]_[underlay_pipe_layer]") + var/mutable_appearance/pipe_appearance = mutable_appearance('icons/obj/pipes_n_cables/pipe_underlays.dmi', "exposed_[direction]_[underlay_pipe_layer]") pipe_appearance.color = pipe_color underlays += pipe_appearance diff --git a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm index 6ca666209974c..2ddd298bf01b0 100644 --- a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm +++ b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm @@ -5,7 +5,7 @@ anchored = FALSE density = TRUE interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN - icon = 'icons/obj/atmospherics/atmos.dmi' + icon = 'icons/obj/pipes_n_cables/atmos.dmi' icon_state = "electrolyzer-off" name = "space electrolyzer" desc = "Thanks to the fast and dynamic response of our electrolyzers, on-site hydrogen production is guaranteed. Warranty void if used by clowns" diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_core.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_core.dm index 127fd6d85a689..2d7db14ef0768 100644 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_core.dm +++ b/code/modules/atmospherics/machinery/components/fusion/hfr_core.dm @@ -4,7 +4,7 @@ /obj/machinery/atmospherics/components/unary/hypertorus/core name = "HFR core" desc = "This is the Hypertorus Fusion Reactor core, an advanced piece of technology to finely tune the reaction inside of the machine. It has I/O for cooling gases." - icon = 'icons/obj/atmospherics/components/hypertorus.dmi' + icon = 'icons/obj/machines/atmospherics/hypertorus.dmi' icon_state = "core_off" circuit = /obj/item/circuitboard/machine/HFR_core use_power = IDLE_POWER_USE @@ -176,7 +176,8 @@ investigate_log("has been created.", INVESTIGATE_HYPERTORUS) // Our center is unreachable, so prevent stuff from getting stuck in there - AddElement(/datum/element/trait_loc, TRAIT_SECLUDED_LOCATION) + var/static/list/turf_traits = list(TRAIT_SECLUDED_LOCATION) + AddElement(/datum/element/give_turf_traits, turf_traits) /obj/machinery/atmospherics/components/unary/hypertorus/core/Destroy() unregister_signals(TRUE) diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm index 325ae083dad4f..c6e1d6183ef79 100644 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm +++ b/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm @@ -468,7 +468,7 @@ if(moderator_list[/datum/gas/bz] < (150 / power_level)) return var/obj/machinery/hypertorus/corner/picked_corner = pick(corners) - picked_corner.loc.fire_nuclear_particle(turn(picked_corner.dir, 180)) + picked_corner.loc.fire_nuclear_particle(REVERSE_DIR(picked_corner.dir)) /obj/machinery/atmospherics/components/unary/hypertorus/core/proc/check_lightning_arcs(moderator_list) if(power_level < 4) @@ -480,8 +480,8 @@ if(critical_threshold_proximity > 650 && prob(20)) zap_number += 1 - var/cutoff = 1500 - cutoff = clamp(3000 - (power_level * (internal_fusion.total_moles() * 0.45)), 450, 3000) + var/cutoff = 1.2e6 + cutoff = clamp(2.4e6 - (power_level * (internal_fusion.total_moles() * 360)), 3.6e5, 2.4e6) var/zaps_aspect = DEFAULT_ZAP_ICON_STATE var/flags = ZAP_SUPERMATTER_FLAGS @@ -495,7 +495,7 @@ playsound(loc, 'sound/weapons/emitter2.ogg', 100, TRUE, extrarange = 10) for(var/i in 1 to zap_number) - supermatter_zap(src, 5, power_level * 300, flags, zap_cutoff = cutoff, power_level = src.power_level * 1000, zap_icon = zaps_aspect) + supermatter_zap(src, 5, power_level * 2.4e5, flags, zap_cutoff = cutoff, power_level = src.power_level * 1000, zap_icon = zaps_aspect) /obj/machinery/atmospherics/components/unary/hypertorus/core/proc/check_gravity_pulse(seconds_per_tick) if(SPT_PROB(100 - critical_threshold_proximity / 15, seconds_per_tick)) diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm index bba6abae39520..24c10b11290bd 100644 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm +++ b/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm @@ -3,7 +3,7 @@ * The file also contain the guicode of the machine */ /obj/machinery/atmospherics/components/unary/hypertorus - icon = 'icons/obj/atmospherics/components/hypertorus.dmi' + icon = 'icons/obj/machines/atmospherics/hypertorus.dmi' icon_state = "core_off" name = "thermomachine" @@ -50,7 +50,7 @@ if(user.combat_mode) return FALSE balloon_alert(user, "repairing...") - if(tool.use_tool(src, user, 10 SECONDS, volume=30, amount=5)) + if(tool.use_tool(src, user, 10 SECONDS, volume=30)) balloon_alert(user, "repaired") cracked = FALSE update_appearance() @@ -126,7 +126,7 @@ /obj/machinery/hypertorus name = "hypertorus_core" desc = "hypertorus_core" - icon = 'icons/obj/atmospherics/components/hypertorus.dmi' + icon = 'icons/obj/machines/atmospherics/hypertorus.dmi' icon_state = "core_off" move_resist = INFINITY anchored = TRUE @@ -181,7 +181,7 @@ /obj/machinery/hypertorus/interface/multitool_act(mob/living/user, obj/item/I) . = ..() - var/turf/T = get_step(src,turn(dir,180)) + var/turf/T = get_step(src,REVERSE_DIR(dir)) var/obj/machinery/atmospherics/components/unary/hypertorus/core/centre = locate() in T if(!centre || !centre.check_part_connectivity()) @@ -436,7 +436,7 @@ /obj/item/hfr_box name = "HFR box" desc = "If you see this, call the police." - icon = 'icons/obj/atmospherics/components/hypertorus.dmi' + icon = 'icons/obj/machines/atmospherics/hypertorus.dmi' icon_state = "error" ///What kind of box are we handling? var/box_type = "impossible" diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm index c3c2cafbd9916..9b080b59260fb 100644 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm +++ b/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm @@ -38,7 +38,7 @@ corners |= object continue - if(get_step(object,turn(object.dir,180)) != loc) + if(get_step(object,REVERSE_DIR(object.dir)) != loc) . = FALSE if(istype(object,/obj/machinery/hypertorus/interface)) @@ -53,7 +53,7 @@ if(object.panel_open) . = FALSE - if(get_step(object,turn(object.dir,180)) != loc) + if(get_step(object,REVERSE_DIR(object.dir)) != loc) . = FALSE if(istype(object,/obj/machinery/atmospherics/components/unary/hypertorus/fuel_input)) @@ -413,9 +413,19 @@ var/critical = selected_fuel.meltdown_flags & HYPERTORUS_FLAG_CRITICAL_MELTDOWN if(critical) priority_announce("WARNING - The explosion will likely cover a big part of the station and the coming EMP will wipe out most of the electronics. \ - Get as far away as possible from the reactor or find a way to shut it down.", "Alert") + Get as far away as possible from the reactor or find a way to shut it down.", "Alert", 'sound/misc/notice3.ogg') var/speaking = "[emergency_alert] The Hypertorus fusion reactor has reached critical integrity failure. Emergency magnetic dampeners online." radio.talk_into(src, speaking, common_channel, language = get_selected_language()) + + notify_ghosts( + "The [src] has begun melting down!", + source = src, + header = "Meltdown Incoming", + action = NOTIFY_ORBIT, + ghost_sound = 'sound/machines/warning-buzzer.ogg', + notify_volume = 75 + ) + for(var/i in HYPERTORUS_COUNTDOWN_TIME to 0 step -10) if(critical_threshold_proximity < melting_point) // Cutting it a bit close there engineers radio.talk_into(src, "[safe_alert] Failsafe has been disengaged.", common_channel) diff --git a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm index d0debcc5fdd4b..b71dc05d776cf 100644 --- a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm +++ b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm @@ -4,7 +4,7 @@ #define HIGH_CONDUCTIVITY_RATIO 0.95 /obj/machinery/atmospherics/components/binary/crystallizer - icon = 'icons/obj/atmospherics/components/machines.dmi' + icon = 'icons/obj/machines/atmospherics/machines.dmi' icon_state = "crystallizer-off" base_icon_state = "crystallizer" name = "crystallizer" @@ -99,9 +99,9 @@ /obj/machinery/atmospherics/components/binary/crystallizer/update_overlays() . = ..() cut_overlays() - var/mutable_appearance/pipe_appearance1 = mutable_appearance('icons/obj/atmospherics/pipes/pipe_underlays.dmi', "intact_[dir]_[piping_layer]", layer = GAS_SCRUBBER_LAYER) + var/mutable_appearance/pipe_appearance1 = mutable_appearance('icons/obj/pipes_n_cables/pipe_underlays.dmi', "intact_[dir]_[piping_layer]", layer = GAS_SCRUBBER_LAYER) pipe_appearance1.color = COLOR_LIME - var/mutable_appearance/pipe_appearance2 = mutable_appearance('icons/obj/atmospherics/pipes/pipe_underlays.dmi', "intact_[turn(dir, 180)]_[piping_layer]", layer = GAS_SCRUBBER_LAYER) + var/mutable_appearance/pipe_appearance2 = mutable_appearance('icons/obj/pipes_n_cables/pipe_underlays.dmi', "intact_[REVERSE_DIR(dir)]_[piping_layer]", layer = GAS_SCRUBBER_LAYER) pipe_appearance2.color = COLOR_MOSTLY_PURE_RED . += pipe_appearance1 . += pipe_appearance2 diff --git a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm index d1ac81975c554..c12893cb13749 100644 --- a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm +++ b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm @@ -1,7 +1,7 @@ /obj/item/hypernoblium_crystal name = "Hypernoblium Crystal" desc = "Crystalized oxygen and hypernoblium stored in a bottle to pressureproof your clothes or stop reactions occuring in portable atmospheric devices." - icon = 'icons/obj/atmospherics/atmos.dmi' + icon = 'icons/obj/pipes_n_cables/atmos.dmi' icon_state = "hypernoblium_crystal" var/uses = 1 diff --git a/code/modules/atmospherics/machinery/components/tank.dm b/code/modules/atmospherics/machinery/components/tank.dm index 5712a1f0c67f3..0e9ee55a1aa04 100644 --- a/code/modules/atmospherics/machinery/components/tank.dm +++ b/code/modules/atmospherics/machinery/components/tank.dm @@ -1,7 +1,7 @@ #define TANK_PLATING_SHEETS 12 /obj/machinery/atmospherics/components/tank - icon = 'icons/obj/atmospherics/stationary_canisters.dmi' + icon = 'icons/obj/pipes_n_cables/stationary_canisters.dmi' icon_state = "smooth" name = "pressure tank" @@ -67,7 +67,7 @@ if(!knob_overlays) knob_overlays = list() for(var/dir in GLOB.cardinals) - knob_overlays["[dir]"] = image('icons/obj/atmospherics/stationary_canisters.dmi', icon_state = "knob", dir = dir, layer = FLOAT_LAYER) + knob_overlays["[dir]"] = image('icons/obj/pipes_n_cables/stationary_canisters.dmi', icon_state = "knob", dir = dir, layer = FLOAT_LAYER) if(!crack_states) crack_states = list() @@ -79,7 +79,7 @@ AddComponent(/datum/component/gas_leaker, leak_rate = 0.05) AddElement(/datum/element/volatile_gas_storage) - AddElement(/datum/element/crackable, 'icons/obj/atmospherics/stationary_canisters.dmi', crack_states) + AddElement(/datum/element/crackable, 'icons/obj/pipes_n_cables/stationary_canisters.dmi', crack_states) RegisterSignal(src, COMSIG_MERGER_ADDING, PROC_REF(merger_adding)) RegisterSignal(src, COMSIG_MERGER_REMOVING, PROC_REF(merger_removing)) @@ -432,7 +432,7 @@ // Tank Frame Structure /obj/structure/tank_frame - icon = 'icons/obj/atmospherics/stationary_canisters.dmi' + icon = 'icons/obj/pipes_n_cables/stationary_canisters.dmi' icon_state = "frame" anchored = FALSE density = TRUE diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm index b9fb506faf1b0..862fbc65c894d 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm @@ -11,9 +11,9 @@ ///Output pressure target var/target_pressure = ONE_ATMOSPHERE - ///Ratio between the node 1 and 2, determines the amount of gas transfered, sums up to 1 + ///Ratio between the node 1 and 2, determines the amount of gas transferred, sums up to 1 var/node1_concentration = 0.5 - ///Ratio between the node 1 and 2, determines the amount of gas transfered, sums up to 1 + ///Ratio between the node 1 and 2, determines the amount of gas transferred, sums up to 1 var/node2_concentration = 0.5 //node 3 is the outlet, nodes 1 & 2 are intakes @@ -84,8 +84,12 @@ //Calculate necessary moles to transfer using PV=nRT var/general_transfer = (target_pressure - output_starting_pressure) * air3.volume / R_IDEAL_GAS_EQUATION - var/transfer_moles1 = air1.temperature ? node1_concentration * general_transfer / air1.temperature : 0 - var/transfer_moles2 = air2.temperature ? node2_concentration * general_transfer / air2.temperature : 0 + //Calculate combined temperature for accurate output ratio + var/combined_heat_capacity = air1.heat_capacity() + air2.heat_capacity() + var/equalized_temperature = combined_heat_capacity ? (air1.thermal_energy() + air2.thermal_energy()) / combined_heat_capacity : 0 + + var/transfer_moles1 = equalized_temperature ? (node1_concentration * general_transfer) / equalized_temperature : 0 + var/transfer_moles2 = equalized_temperature ? (node2_concentration * general_transfer) / equalized_temperature : 0 var/air1_moles = air1.total_moles() var/air2_moles = air2.total_moles() diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/trinary_devices.dm b/code/modules/atmospherics/machinery/components/trinary_devices/trinary_devices.dm index 5acd1acce8d8a..3d2c1d0899550 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/trinary_devices.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/trinary_devices.dm @@ -1,5 +1,5 @@ /obj/machinery/atmospherics/components/trinary - icon = 'icons/obj/atmospherics/components/trinary_devices.dmi' + icon = 'icons/obj/machines/atmospherics/trinary_devices.dmi' dir = SOUTH initialize_directions = SOUTH|NORTH|WEST use_power = IDLE_POWER_USE @@ -40,13 +40,13 @@ Housekeeping and pipe network stuff //Node 3 is rest output //If we flip the filter, 1 and 3 shall exchange positions - var/node1_connect = turn(dir, -180) + var/node1_connect = REVERSE_DIR(dir) var/node2_connect = turn(dir, -90) var/node3_connect = dir if(flipped) - node1_connect = turn(node1_connect, 180) - node3_connect = turn(node3_connect, 180) + node1_connect = REVERSE_DIR(node1_connect) + node3_connect = REVERSE_DIR(node3_connect) return list(node1_connect, node2_connect, node3_connect) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm b/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm index 264ecd5ebf9e1..1685a027a5f28 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm @@ -1,5 +1,5 @@ /obj/machinery/atmospherics/components/unary/bluespace_sender - icon = 'icons/obj/atmospherics/components/bluespace_gas_selling.dmi' + icon = 'icons/obj/machines/atmospherics/bluespace_gas_selling.dmi' icon_state = "bluespace_sender_off" base_icon_state = "bluespace_sender" name = "Bluespace Gas Sender" @@ -122,8 +122,8 @@ GLOBAL_LIST_EMPTY_TYPED(bluespace_senders, /obj/machinery/atmospherics/component /obj/machinery/atmospherics/components/unary/bluespace_sender/multitool_act(mob/living/user, obj/item/item) var/obj/item/multitool/multitool = item - multitool.buffer = src - to_chat(user, span_notice("You store linkage information in [item]'s buffer.")) + multitool.set_buffer(src) + balloon_alert(user, "saved to multitool buffer") return TRUE /obj/machinery/atmospherics/components/unary/bluespace_sender/wrench_act(mob/living/user, obj/item/tool) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 290e9616f98ff..996525b5e10a6 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -24,7 +24,7 @@ /// The current occupant being presented var/mob/living/occupant -/atom/movable/visual/cryo_occupant/Initialize(mapload, obj/machinery/atmospherics/components/unary/cryo_cell/parent) +/atom/movable/visual/cryo_occupant/Initialize(mapload, obj/machinery/cryo_cell/parent) . = ..() // Alpha masking // It will follow this as the animation goes, but that's no problem as the "mask" icon state @@ -65,7 +65,7 @@ animate(src) /// Cryo cell -/obj/machinery/atmospherics/components/unary/cryo_cell +/obj/machinery/cryo_cell name = "cryo cell" icon = 'icons/obj/medical/cryogenics.dmi' icon_state = "pod-off" @@ -75,15 +75,13 @@ layer = MOB_LAYER state_open = FALSE circuit = /obj/item/circuitboard/machine/cryo_tube - pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY occupant_typecache = list(/mob/living/carbon, /mob/living/simple_animal) processing_flags = NONE use_power = IDLE_POWER_USE idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.75 active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 1.5 - - showpipe = FALSE + flags_1 = PREVENT_CLICK_UNDER_1 var/autoeject = TRUE var/volume = 100 @@ -101,7 +99,6 @@ var/obj/item/radio/radio var/radio_key = /obj/item/encryptionkey/headset_med var/radio_channel = RADIO_CHANNEL_MEDICAL - vent_movement = NONE /// Visual content - Occupant var/atom/movable/visual/cryo_occupant/occupant_vis @@ -109,18 +106,24 @@ var/message_cooldown ///Cryo will continue to treat people with 0 damage but existing wounds, but will sound off when damage healing is done in case doctors want to directly treat the wounds instead var/treating_wounds = FALSE + /// Cryo should notify doctors if the patient is dead, and eject them if autoeject is enabled + var/patient_dead = FALSE fair_market_price = 10 payment_department = ACCOUNT_MED + /// Reference to the datum connector we're using to interface with the pipe network + var/datum/gas_machine_connector/internal_connector + /// Check if the machine has been turned on + var/on = FALSE + /datum/armor/unary_cryo_cell energy = 100 fire = 30 acid = 30 -/obj/machinery/atmospherics/components/unary/cryo_cell/Initialize(mapload) +/obj/machinery/cryo_cell/Initialize(mapload) . = ..() - initialize_directions = dir if(is_operational) begin_processing() @@ -132,24 +135,23 @@ occupant_vis = new(null, src) vis_contents += occupant_vis - if(airs[1]) - airs[1].volume = CELL_VOLUME * 0.5 register_context() + internal_connector = new(loc, src, dir, CELL_VOLUME * 0.5) -/obj/machinery/atmospherics/components/unary/cryo_cell/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents) +/obj/machinery/cryo_cell/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents) . = ..() if(same_z_layer) return SET_PLANE(occupant_vis, PLANE_TO_TRUE(occupant_vis.plane), new_turf) -/obj/machinery/atmospherics/components/unary/cryo_cell/set_occupant(atom/movable/new_occupant) +/obj/machinery/cryo_cell/set_occupant(atom/movable/new_occupant) . = ..() update_appearance() -/obj/machinery/atmospherics/components/unary/cryo_cell/on_construction(mob/user) +/obj/machinery/cryo_cell/on_construction(mob/user) ..(user, dir, dir) -/obj/machinery/atmospherics/components/unary/cryo_cell/RefreshParts() +/obj/machinery/cryo_cell/RefreshParts() . = ..() var/C for(var/datum/stock_part/matter_bin/M in component_parts) @@ -161,12 +163,12 @@ heat_capacity = initial(heat_capacity) / C conduction_coefficient = initial(conduction_coefficient) * C -/obj/machinery/atmospherics/components/unary/cryo_cell/examine(mob/user) //this is leaving out everything but efficiency since they follow the same idea of "better beaker, better results" +/obj/machinery/cryo_cell/examine(mob/user) //this is leaving out everything but efficiency since they follow the same idea of "better beaker, better results" . = ..() if(in_range(user, src) || isobserver(user)) . += span_notice("The status display reads: Efficiency at [efficiency*100]%.") -/obj/machinery/atmospherics/components/unary/cryo_cell/add_context(atom/source, list/context, obj/item/held_item, mob/user) +/obj/machinery/cryo_cell/add_context(atom/source, list/context, obj/item/held_item, mob/user) . = ..() context[SCREENTIP_CONTEXT_CTRL_LMB] = "Turn [on ? "off" : "on"]" context[SCREENTIP_CONTEXT_ALT_LMB] = "[state_open ? "Close" : "Open"] door" @@ -180,22 +182,18 @@ return CONTEXTUAL_SCREENTIP_SET -/obj/machinery/atmospherics/components/unary/cryo_cell/Destroy() +/obj/machinery/cryo_cell/Destroy() vis_contents.Cut() QDEL_NULL(occupant_vis) QDEL_NULL(radio) QDEL_NULL(beaker) - ///Take the turf the cryotube is on - var/turf/T = get_turf(src) - if(T) - ///Take the air composition inside the cryotube - var/datum/gas_mixture/air1 = airs[1] - T.assume_air(air1) + + QDEL_NULL(internal_connector) return ..() -/obj/machinery/atmospherics/components/unary/cryo_cell/contents_explosion(severity, target) +/obj/machinery/cryo_cell/contents_explosion(severity, target) . = ..() if(!beaker) return @@ -208,12 +206,12 @@ if(EXPLODE_LIGHT) SSexplosions.low_mov_atom += beaker -/obj/machinery/atmospherics/components/unary/cryo_cell/handle_atom_del(atom/A) - ..() - if(A == beaker) +/obj/machinery/cryo_cell/Exited(atom/movable/gone, direction) + . = ..() + if(gone == beaker) beaker = null -/obj/machinery/atmospherics/components/unary/cryo_cell/on_deconstruction() +/obj/machinery/cryo_cell/on_deconstruction() if(occupant) occupant.vis_flags &= ~VIS_INHERIT_PLANE REMOVE_TRAIT(occupant, TRAIT_IMMOBILIZED, CRYO_TRAIT) @@ -223,15 +221,15 @@ beaker.forceMove(drop_location()) beaker = null -/obj/machinery/atmospherics/components/unary/cryo_cell/update_icon_state() +/obj/machinery/cryo_cell/update_icon_state() icon_state = (state_open) ? "pod-open" : ((on && is_operational) ? "pod-on" : "pod-off") return ..() -/obj/machinery/atmospherics/components/unary/cryo_cell/update_icon() +/obj/machinery/cryo_cell/update_icon() . = ..() SET_PLANE_IMPLICIT(src, initial(plane)) -/obj/machinery/atmospherics/components/unary/cryo_cell/update_overlays() +/obj/machinery/cryo_cell/update_overlays() . = ..() if(panel_open) . += "pod-panel" @@ -240,13 +238,13 @@ if(on && is_operational) . += mutable_appearance('icons/obj/medical/cryogenics.dmi', "cover-on", ABOVE_ALL_MOB_LAYER, src, plane = ABOVE_GAME_PLANE) else - . += mutable_appearance('icons/obj/medical/cryogenics.dmi', "cover-on", ABOVE_ALL_MOB_LAYER, src, plane = ABOVE_GAME_PLANE) + . += mutable_appearance('icons/obj/medical/cryogenics.dmi', "cover-off", ABOVE_ALL_MOB_LAYER, src, plane = ABOVE_GAME_PLANE) -/obj/machinery/atmospherics/components/unary/cryo_cell/nap_violation(mob/violator) +/obj/machinery/cryo_cell/nap_violation(mob/violator) open_machine() -/obj/machinery/atmospherics/components/unary/cryo_cell/set_on(active) +/obj/machinery/cryo_cell/proc/set_on(active) if(on == active) return SEND_SIGNAL(src, COMSIG_CRYO_SET_ON, active) @@ -258,7 +256,7 @@ update_use_power(IDLE_POWER_USE) update_appearance() -/obj/machinery/atmospherics/components/unary/cryo_cell/on_set_is_operational(old_value) +/obj/machinery/cryo_cell/on_set_is_operational(old_value) if(old_value) //Turned off set_on(FALSE) end_processing() @@ -266,21 +264,38 @@ begin_processing() -/obj/machinery/atmospherics/components/unary/cryo_cell/process(seconds_per_tick) +/obj/machinery/cryo_cell/process(seconds_per_tick) ..() - - if(!on) - return if(!occupant) return + if(!on) + // Should turn on if set to auto + if(autoeject) + set_on(TRUE) + else + return + 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. + if(mob_occupant.stat == DEAD) // Notify doctors and potentially eject if the patient is dead + set_on(FALSE) + var/msg = "Patient is deceased." + if(autoeject) // Eject if configured. + msg += " Auto ejecting patient now." + open_machine() + // Only need to tell them once + if(!patient_dead) + playsound(src, 'sound/machines/cryo_warning.ogg', volume) + patient_dead = TRUE + radio.talk_into(src, msg, radio_channel) return + + patient_dead = FALSE + if(mob_occupant.get_organic_health() >= mob_occupant.getMaxHealth()) // Don't bother with fully healed people. if(iscarbon(mob_occupant)) var/mob/living/carbon/C = mob_occupant @@ -303,7 +318,7 @@ radio.talk_into(src, msg, radio_channel) return - var/datum/gas_mixture/air1 = airs[1] + var/datum/gas_mixture/air1 = internal_connector.gas_connector.airs[1] if(air1.total_moles() > CRYO_MIN_GAS_MOLES) if(beaker) @@ -311,15 +326,15 @@ consume_gas = TRUE return TRUE -/obj/machinery/atmospherics/components/unary/cryo_cell/process_atmos() +/obj/machinery/cryo_cell/process_atmos() ..() if(!on) return - var/datum/gas_mixture/air1 = airs[1] + var/datum/gas_mixture/air1 = internal_connector.gas_connector.airs[1] - if(!nodes[1] || !airs[1] || !air1.gases.len || air1.total_moles() < CRYO_MIN_GAS_MOLES) // Turn off if the machine won't work. + if(!internal_connector.gas_connector.nodes[1] || !internal_connector.gas_connector.airs[1] || !air1.gases.len || air1.total_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) @@ -353,25 +368,25 @@ if(air1.temperature > 2000) take_damage(clamp((air1.temperature)/200, 10, 20), BURN) - update_parents() + internal_connector.gas_connector.update_parents() -/obj/machinery/atmospherics/components/unary/cryo_cell/handle_internal_lifeform(mob/lifeform_inside_me, breath_request) +/obj/machinery/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/datum/gas_mixture/air1 = internal_connector.gas_connector.airs[1] var/breath_percentage = breath_request / air1.volume return air1.remove(air1.total_moles() * breath_percentage) -/obj/machinery/atmospherics/components/unary/cryo_cell/assume_air(datum/gas_mixture/giver) - airs[1].merge(giver) +/obj/machinery/cryo_cell/assume_air(datum/gas_mixture/giver) + internal_connector.gas_connector.airs[1].merge(giver) -/obj/machinery/atmospherics/components/unary/cryo_cell/relaymove(mob/living/user, direction) +/obj/machinery/cryo_cell/relaymove(mob/living/user, direction) if(message_cooldown <= world.time) message_cooldown = world.time + 50 to_chat(user, span_warning("[src]'s door won't budge!")) -/obj/machinery/atmospherics/components/unary/cryo_cell/open_machine(drop = FALSE, density_to_set = FALSE) +/obj/machinery/cryo_cell/open_machine(drop = FALSE, density_to_set = FALSE) if(!state_open && !panel_open) set_on(FALSE) for(var/mob/M in contents) //only drop mobs @@ -380,14 +395,17 @@ flick("pod-open-anim", src) return ..() -/obj/machinery/atmospherics/components/unary/cryo_cell/close_machine(mob/living/carbon/user, density_to_set = TRUE) +/obj/machinery/cryo_cell/close_machine(mob/living/carbon/user, density_to_set = TRUE) treating_wounds = FALSE if((isnull(user) || istype(user)) && state_open && !panel_open) + if(loc == user?.loc) + to_chat(user, span_warning("You can't close [src] on yourself!")) + return flick("pod-close-anim", src) ..(user) return occupant -/obj/machinery/atmospherics/components/unary/cryo_cell/container_resist_act(mob/living/user) +/obj/machinery/cryo_cell/container_resist_act(mob/living/user) user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT user.visible_message(span_notice("You see [user] kicking against the glass of [src]!"), \ @@ -400,7 +418,7 @@ span_notice("You successfully break out of [src]!")) open_machine() -/obj/machinery/atmospherics/components/unary/cryo_cell/examine(mob/user) +/obj/machinery/cryo_cell/examine(mob/user) . = ..() if(occupant) if(on) @@ -410,7 +428,7 @@ else . += "[src] seems empty." -/obj/machinery/atmospherics/components/unary/cryo_cell/MouseDrop_T(mob/target, mob/user) +/obj/machinery/cryo_cell/MouseDrop_T(mob/target, mob/user) if(user.incapacitated() || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !ISADVANCEDTOOLUSER(user)) return if(isliving(target)) @@ -422,7 +440,7 @@ if (do_after(user, 2.5 SECONDS, target=target)) close_machine(target) -/obj/machinery/atmospherics/components/unary/cryo_cell/screwdriver_act(mob/living/user, obj/item/tool) +/obj/machinery/cryo_cell/screwdriver_act(mob/living/user, obj/item/tool) if(!on && !occupant && !state_open && (default_deconstruction_screwdriver(user, "pod-off", "pod-off", tool))) update_appearance() @@ -431,20 +449,20 @@ + (on ? "active" : (occupant ? "full" : "open")) + "!
    ") return TOOL_ACT_TOOLTYPE_SUCCESS -/obj/machinery/atmospherics/components/unary/cryo_cell/crowbar_act(mob/living/user, obj/item/tool) +/obj/machinery/cryo_cell/crowbar_act(mob/living/user, obj/item/tool) if(on || state_open) return FALSE if(default_pry_open(tool) || default_deconstruction_crowbar(tool)) return TOOL_ACT_TOOLTYPE_SUCCESS -/obj/machinery/atmospherics/components/unary/cryo_cell/wrench_act(mob/living/user, obj/item/tool) +/obj/machinery/cryo_cell/wrench_act(mob/living/user, obj/item/tool) if(on || occupant || state_open) return FALSE if(default_change_direction_wrench(user, tool)) update_appearance() return TOOL_ACT_TOOLTYPE_SUCCESS -/obj/machinery/atmospherics/components/unary/cryo_cell/attackby(obj/item/I, mob/user, params) +/obj/machinery/cryo_cell/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/reagent_containers/cup)) . = 1 //no afterattack if(beaker) @@ -460,17 +478,17 @@ return return ..() -/obj/machinery/atmospherics/components/unary/cryo_cell/ui_state(mob/user) +/obj/machinery/cryo_cell/ui_state(mob/user) return GLOB.notcontained_state -/obj/machinery/atmospherics/components/unary/cryo_cell/ui_interact(mob/user, datum/tgui/ui) +/obj/machinery/cryo_cell/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "Cryo", name) ui.open() -/obj/machinery/atmospherics/components/unary/cryo_cell/ui_data() +/obj/machinery/cryo_cell/ui_data() var/list/data = list() data["isOperating"] = on data["hasOccupant"] = occupant ? TRUE : FALSE @@ -505,7 +523,7 @@ data["occupant"]["toxLoss"] = round(mob_occupant.getToxLoss(), 1) data["occupant"]["fireLoss"] = round(mob_occupant.getFireLoss(), 1) - var/datum/gas_mixture/air1 = airs[1] + var/datum/gas_mixture/air1 = internal_connector.gas_connector.airs[1] data["cellTemperature"] = round(air1.temperature, 1) data["isBeakerLoaded"] = beaker ? TRUE : FALSE @@ -516,7 +534,7 @@ data["beakerContents"] = beakerContents return data -/obj/machinery/atmospherics/components/unary/cryo_cell/ui_act(action, params) +/obj/machinery/cryo_cell/ui_act(action, params) . = ..() if(.) return @@ -544,16 +562,16 @@ beaker = null . = TRUE -/obj/machinery/atmospherics/components/unary/cryo_cell/can_interact(mob/user) +/obj/machinery/cryo_cell/can_interact(mob/user) return ..() && user.loc != src -/obj/machinery/atmospherics/components/unary/cryo_cell/CtrlClick(mob/user) +/obj/machinery/cryo_cell/CtrlClick(mob/user) if(can_interact(user) && !state_open) if(set_on(!on)) balloon_alert(user, "turned [on ? "on" : "off"]") return ..() -/obj/machinery/atmospherics/components/unary/cryo_cell/AltClick(mob/user) +/obj/machinery/cryo_cell/AltClick(mob/user) if(can_interact(user)) balloon_alert(user, "[state_open ? "closing" : "opening"] door") if(state_open) @@ -562,43 +580,16 @@ open_machine() return ..() -/obj/machinery/atmospherics/components/unary/cryo_cell/update_remote_sight(mob/living/user) - return // we don't see the pipe network while inside cryo. - -/obj/machinery/atmospherics/components/unary/cryo_cell/get_remote_view_fullscreens(mob/user) +/obj/machinery/cryo_cell/get_remote_view_fullscreens(mob/user) user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 1) -/obj/machinery/atmospherics/components/unary/cryo_cell/can_see_pipes() - return FALSE // you can't see the pipe network when inside a cryo cell. - -/obj/machinery/atmospherics/components/unary/cryo_cell/return_temperature() - var/datum/gas_mixture/G = airs[1] +/obj/machinery/cryo_cell/return_temperature() + var/datum/gas_mixture/G = internal_connector.gas_connector.airs[1] if(G.total_moles() > 10) return G.temperature return ..() -/obj/machinery/atmospherics/components/unary/cryo_cell/default_change_direction_wrench(mob/user, obj/item/wrench/W) - . = ..() - if(.) - set_init_directions() - var/obj/machinery/atmospherics/node = nodes[1] - if(node) - node.disconnect(src) - nodes[1] = null - if(parents[1]) - nullify_pipenet(parents[1]) - - atmos_init() - node = nodes[1] - if(node) - node.atmos_init() - node.add_member(src) - SSair.add_to_rebuild_queue(src) - -/obj/machinery/atmospherics/components/unary/cryo_cell/update_layer() - return - #undef MAX_TEMPERATURE #undef CRYO_MULTIPLY_FACTOR #undef CRYO_TX_QTY diff --git a/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm b/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm index 5c6cacb551814..db6499c04e6f6 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm @@ -38,7 +38,7 @@ var/obj/machinery/atmospherics/components/unary/heat_exchanger/partner = partner_ref?.resolve() if(!partner) partner_ref = null - var/partner_connect = turn(dir,180) + var/partner_connect = REVERSE_DIR(dir) for(var/obj/machinery/atmospherics/components/unary/heat_exchanger/target in get_step(src,partner_connect)) if(target.dir & get_dir(src,target)) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/machine_connector.dm b/code/modules/atmospherics/machinery/components/unary_devices/machine_connector.dm new file mode 100644 index 0000000000000..b78de93868e7a --- /dev/null +++ b/code/modules/atmospherics/machinery/components/unary_devices/machine_connector.dm @@ -0,0 +1,106 @@ +///To be used when there is the need of an atmos connection without repathing everything (eg: cryo.dm) +/datum/gas_machine_connector + + var/obj/machinery/connected_machine + var/obj/machinery/atmospherics/components/unary/gas_connector + +/datum/gas_machine_connector/New(location, obj/machinery/connecting_machine = null, direction = SOUTH, gas_volume) + gas_connector = new(location) + + connected_machine = connecting_machine + if(!connected_machine) + QDEL_NULL(gas_connector) + qdel(src) + return + + gas_connector.dir = direction + gas_connector.airs[1].volume = gas_volume + + SSair.start_processing_machine(connected_machine) + register_with_machine() + +/datum/gas_machine_connector/Destroy() + connected_machine = null + QDEL_NULL(gas_connector) + return ..() + +/** + * Register various signals that are required for the proper work of the connector + */ +/datum/gas_machine_connector/proc/register_with_machine() + RegisterSignal(connected_machine, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(pre_move_connected_machine)) + RegisterSignal(connected_machine, COMSIG_MOVABLE_MOVED, PROC_REF(moved_connected_machine)) + RegisterSignal(connected_machine, COMSIG_MACHINERY_DEFAULT_ROTATE_WRENCH, PROC_REF(wrenched_connected_machine)) + RegisterSignal(connected_machine, COMSIG_QDELETING, PROC_REF(deconstruct_connected_machine)) + +/** + * Unregister the signals previously registered + */ +/datum/gas_machine_connector/proc/unregister_from_machine() + UnregisterSignal(connected_machine, list( + COMSIG_MOVABLE_MOVED, + COMSIG_MOVABLE_PRE_MOVE, + COMSIG_MACHINERY_DEFAULT_ROTATE_WRENCH, + COMSIG_QDELETING, + )) + +/** + * Called when the machine has been moved, reconnect to the pipe network + */ +/datum/gas_machine_connector/proc/moved_connected_machine() + SIGNAL_HANDLER + gas_connector.forceMove(get_turf(connected_machine)) + reconnect_connector() + +/** + * Called before the machine moves, disconnect from the pipe network + */ +/datum/gas_machine_connector/proc/pre_move_connected_machine() + SIGNAL_HANDLER + disconnect_connector() + +/** + * Called when the machine has been rotated, resets the connection to the pipe network with the new direction + */ +/datum/gas_machine_connector/proc/wrenched_connected_machine() + SIGNAL_HANDLER + disconnect_connector() + reconnect_connector() + +/** + * Called when the machine has been deconstructed + */ +/datum/gas_machine_connector/proc/deconstruct_connected_machine() + SIGNAL_HANDLER + disconnect_connector() + SSair.stop_processing_machine(connected_machine) + unregister_from_machine() + connected_machine = null + QDEL_NULL(gas_connector) + qdel(src) + +/** + * Handles the disconnection from the pipe network + */ +/datum/gas_machine_connector/proc/disconnect_connector() + var/obj/machinery/atmospherics/node = gas_connector.nodes[1] + if(node) + if(gas_connector in node.nodes) //Only if it's actually connected. On-pipe version would is one-sided. + node.disconnect(gas_connector) + gas_connector.nodes[1] = null + if(gas_connector.parents[1]) + gas_connector.nullify_pipenet(gas_connector.parents[1]) + +/** + * Handles the reconnection to the pipe network + */ +/datum/gas_machine_connector/proc/reconnect_connector() + gas_connector.dir = connected_machine.dir + gas_connector.set_init_directions() + var/obj/machinery/atmospherics/node = gas_connector.nodes[1] + gas_connector.atmos_init() + node = gas_connector.nodes[1] + if(node) + node.atmos_init() + node.add_member(gas_connector) + SSair.add_to_rebuild_queue(gas_connector) 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 bf79819e01b0d..452d5d7b24358 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm @@ -17,16 +17,18 @@ ///Rate of operation of the device var/volume_rate = 50 - ///id of air sensor its connected to - var/chamber_id - /obj/machinery/atmospherics/components/unary/outlet_injector/Initialize(mapload) + if(isnull(id_tag)) + id_tag = assign_random_name() . = ..() - var/static/list/tool_screentips = list( - TOOL_MULTITOOL = list( - SCREENTIP_CONTEXT_LMB = "Log to link later with air sensor", - ) - ) + + var/static/list/tool_screentips + if(!tool_screentips) + tool_screentips = string_assoc_nested_list(list( + TOOL_MULTITOOL = list( + SCREENTIP_CONTEXT_LMB = "Log to link later with air sensor", + ) + )) AddElement(/datum/element/contextual_screentip_tools, tool_screentips) register_context() @@ -41,28 +43,15 @@ . += span_notice("You can link it with an air sensor using a multitool.") /obj/machinery/atmospherics/components/unary/outlet_injector/multitool_act(mob/living/user, obj/item/multitool/multi_tool) - . = ..() - if (!istype(multi_tool)) - return . - - balloon_alert(user, "saved in buffer") - multi_tool.buffer = src - return TRUE - -/obj/machinery/atmospherics/components/unary/outlet_injector/wrench_act(mob/living/user, obj/item/I) - . = ..() - if(.) - disconnect_chamber() - -///called when its either unwrenched or destroyed -/obj/machinery/atmospherics/components/unary/outlet_injector/proc/disconnect_chamber() - if(chamber_id != null) - GLOB.objects_by_id_tag -= CHAMBER_INPUT_FROM_ID(chamber_id) - chamber_id = null - -/obj/machinery/atmospherics/components/unary/outlet_injector/Destroy() - disconnect_chamber() - return ..() + if(istype(multi_tool.buffer, /obj/machinery/air_sensor)) + var/obj/machinery/air_sensor/sensor = multi_tool.buffer + multi_tool.set_buffer(src) + sensor.multitool_act(user, multi_tool) + return TOOL_ACT_TOOLTYPE_SUCCESS + + balloon_alert(user, "injector saved in buffer") + multi_tool.set_buffer(src) + return TOOL_ACT_TOOLTYPE_SUCCESS /obj/machinery/atmospherics/components/unary/outlet_injector/CtrlClick(mob/user) if(can_interact(user)) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index 71c8c17010cc7..6e84d4fc3039c 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -1,7 +1,7 @@ #define THERMOMACHINE_POWER_CONVERSION 0.01 /obj/machinery/atmospherics/components/unary/thermomachine - icon = 'icons/obj/atmospherics/components/thermomachine.dmi' + icon = 'icons/obj/machines/atmospherics/thermomachine.dmi' icon_state = "thermo_base" plane = GAME_PLANE diff --git a/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm b/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm index 3f0f16c55a8dd..4d876fd458618 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm @@ -1,5 +1,5 @@ /obj/machinery/atmospherics/components/unary - icon = 'icons/obj/atmospherics/components/unary_devices.dmi' + icon = 'icons/obj/machines/atmospherics/unary_devices.dmi' dir = SOUTH initialize_directions = SOUTH device_type = UNARY 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 067cad67d9e1c..3422f3e3adfa5 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -37,11 +37,13 @@ /obj/machinery/atmospherics/components/unary/vent_pump/Initialize(mapload) if(!id_tag) id_tag = assign_random_name() - var/static/list/tool_screentips = list( - TOOL_MULTITOOL = list( - SCREENTIP_CONTEXT_LMB = "Log to link later with air sensor", - ) - ) + var/static/list/tool_screentips + if(!tool_screentips) + tool_screentips = string_assoc_nested_list(list( + TOOL_MULTITOOL = list( + SCREENTIP_CONTEXT_LMB = "Log to link later with air sensor", + ) + )) AddElement(/datum/element/contextual_screentip_tools, tool_screentips) . = ..() assign_to_area() @@ -51,24 +53,15 @@ . += span_notice("You can link it with an air sensor using a multitool.") /obj/machinery/atmospherics/components/unary/vent_pump/multitool_act(mob/living/user, obj/item/multitool/multi_tool) - . = ..() - if (!istype(multi_tool)) - return . - - balloon_alert(user, "saved in buffer") - multi_tool.buffer = src - return TRUE + if(istype(multi_tool.buffer, /obj/machinery/air_sensor)) + var/obj/machinery/air_sensor/sensor = multi_tool.buffer + multi_tool.set_buffer(src) + sensor.multitool_act(user, multi_tool) + return TOOL_ACT_TOOLTYPE_SUCCESS -/obj/machinery/atmospherics/components/unary/vent_pump/wrench_act(mob/living/user, obj/item/wrench) - . = ..() - if(.) - disconnect_chamber() - -///called when its either unwrenched or destroyed -/obj/machinery/atmospherics/components/unary/vent_pump/proc/disconnect_chamber() - if(chamber_id != null) - GLOB.objects_by_id_tag -= CHAMBER_OUTPUT_FROM_ID(chamber_id) - chamber_id = null + balloon_alert(user, "vent saved in buffer") + multi_tool.set_buffer(src) + return TOOL_ACT_TOOLTYPE_SUCCESS /obj/machinery/atmospherics/components/unary/vent_pump/Destroy() disconnect_from_area() @@ -77,8 +70,6 @@ if(vent_area) vent_area.air_vents -= src - disconnect_chamber() - return ..() /obj/machinery/atmospherics/components/unary/vent_pump/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) @@ -177,6 +168,8 @@ if(pressure_delta > 0) if(air_contents.temperature > 0) + if(environment_pressure >= 50 * ONE_ATMOSPHERE) + return FALSE var/transfer_moles = (pressure_delta * environment.volume) / (air_contents.temperature * R_IDEAL_GAS_EQUATION) var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) @@ -194,6 +187,8 @@ pressure_delta = min(pressure_delta, (internal_pressure_bound - air_contents.return_pressure())) if(pressure_delta > 0 && environment.temperature > 0) + if(air_contents.return_pressure() >= 50 * ONE_ATMOSPHERE) + return FALSE var/transfer_moles = (pressure_delta * air_contents.volume) / (environment.temperature * R_IDEAL_GAS_EQUATION) var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) @@ -212,7 +207,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/welder_act(mob/living/user, obj/item/welder) ..() - if(!welder.tool_start_check(user, amount=0)) + if(!welder.tool_start_check(user, amount=1)) return TRUE to_chat(user, span_notice("You begin welding the vent...")) if(welder.use_tool(src, user, 20, volume=50)) 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 b02df07c0d3b0..50054417362d2 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -261,10 +261,10 @@ for(var/gas in filter_types & env_gases) filtered_out.add_gas(gas) //take this gases portion of removal_ratio of the turfs air, or all of that gas if less than or equal to MINIMUM_MOLES_TO_SCRUB - var/transfered_moles = max(QUANTIZE(env_gases[gas][MOLES] * removal_ratio * (env_gases[gas][MOLES] / total_moles_to_remove)), min(MINIMUM_MOLES_TO_SCRUB, env_gases[gas][MOLES])) + var/transferred_moles = max(QUANTIZE(env_gases[gas][MOLES] * removal_ratio * (env_gases[gas][MOLES] / total_moles_to_remove)), min(MINIMUM_MOLES_TO_SCRUB, env_gases[gas][MOLES])) - filtered_gases[gas][MOLES] = transfered_moles - env_gases[gas][MOLES] -= transfered_moles + filtered_gases[gas][MOLES] = transferred_moles + env_gases[gas][MOLES] -= transferred_moles environment.garbage_collect() @@ -298,7 +298,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/welder_act(mob/living/user, obj/item/welder) ..() - if(!welder.tool_start_check(user, amount=0)) + if(!welder.tool_start_check(user, amount=1)) return TRUE to_chat(user, span_notice("Now welding the scrubber.")) if(welder.use_tool(src, user, 20, volume=50)) diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index 466e8d049ebfb..b8ad06e25abb1 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -275,6 +275,7 @@ var/datum/gas_mixture/total_gas_mixture = new(volume_sum) total_gas_mixture.temperature = total_heat_capacity ? (total_thermal_energy / total_heat_capacity) : 0 total_gas_mixture.gases = total_gases + total_gas_mixture.garbage_collect() //Update individual gas_mixtures by volume ratio for(var/datum/gas_mixture/gas_mixture as anything in gas_mixture_list) diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index 22223cb0e7844..51a88bf349e38 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -1,7 +1,7 @@ /obj/machinery/meter name = "gas flow meter" desc = "It measures something." - icon = 'icons/obj/atmospherics/pipes/meter.dmi' + icon = 'icons/obj/pipes_n_cables/meter.dmi' icon_state = "meter" layer = HIGH_PIPE_LAYER power_channel = AREA_USAGE_ENVIRON diff --git a/code/modules/atmospherics/machinery/other/miner.dm b/code/modules/atmospherics/machinery/other/miner.dm index e4393473e903c..dd1024d8d3e07 100644 --- a/code/modules/atmospherics/machinery/other/miner.dm +++ b/code/modules/atmospherics/machinery/other/miner.dm @@ -8,7 +8,7 @@ /obj/machinery/atmospherics/miner name = "gas miner" desc = "Gasses mined from the gas giant below (above?) flow out through this massive vent." - icon = 'icons/obj/atmospherics/components/miners.dmi' + icon = 'icons/obj/machines/atmospherics/miners.dmi' icon_state = "miner" density = FALSE resistance_flags = INDESTRUCTIBLE|ACID_PROOF|FIRE_PROOF diff --git a/code/modules/atmospherics/machinery/pipes/bridge_pipe.dm b/code/modules/atmospherics/machinery/pipes/bridge_pipe.dm index d4adfdb0d3a3d..9cda298ccd4c9 100644 --- a/code/modules/atmospherics/machinery/pipes/bridge_pipe.dm +++ b/code/modules/atmospherics/machinery/pipes/bridge_pipe.dm @@ -1,5 +1,5 @@ /obj/machinery/atmospherics/pipe/bridge_pipe - icon = 'icons/obj/atmospherics/pipes/bridge_pipe.dmi' + icon = 'icons/obj/pipes_n_cables/bridge_pipe.dmi' icon_state = "bridge_center" name = "bridge pipe" @@ -22,7 +22,7 @@ /obj/machinery/atmospherics/pipe/bridge_pipe/update_overlays() . = ..() - var/mutable_appearance/center = mutable_appearance('icons/obj/atmospherics/pipes/bridge_pipe.dmi', "bridge_center") + var/mutable_appearance/center = mutable_appearance('icons/obj/pipes_n_cables/bridge_pipe.dmi', "bridge_center") PIPING_LAYER_DOUBLE_SHIFT(center, piping_layer) . += center diff --git a/code/modules/atmospherics/machinery/pipes/color_adapter.dm b/code/modules/atmospherics/machinery/pipes/color_adapter.dm index 26ea67c45b25e..02c550fd55859 100644 --- a/code/modules/atmospherics/machinery/pipes/color_adapter.dm +++ b/code/modules/atmospherics/machinery/pipes/color_adapter.dm @@ -1,5 +1,5 @@ /obj/machinery/atmospherics/pipe/color_adapter - icon = 'icons/obj/atmospherics/pipes/color_adapter.dmi' + icon = 'icons/obj/pipes_n_cables/color_adapter.dmi' icon_state = "adapter_map-3" name = "color adapter" @@ -45,7 +45,7 @@ for(var/i in 1 to device_type) if(!nodes[i]) continue - var/image/pipe = get_pipe_image('icons/obj/atmospherics/pipes/manifold.dmi', "pipe-3", get_dir(src, nodes[i]), nodes[i].pipe_color) + var/image/pipe = get_pipe_image('icons/obj/pipes_n_cables/manifold.dmi', "pipe-3", get_dir(src, nodes[i]), nodes[i].pipe_color) PIPING_LAYER_DOUBLE_SHIFT(pipe, piping_layer) pipe.layer = layer + 0.01 . += pipe diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/junction.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/junction.dm index ded4067e2a45a..00ef058333a40 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/junction.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/junction.dm @@ -1,5 +1,5 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/junction - icon = 'icons/obj/atmospherics/pipes/he-junction.dmi' + icon = 'icons/obj/pipes_n_cables/he-junction.dmi' icon_state = "pipe11-3" name = "junction" @@ -23,7 +23,7 @@ initialize_directions = WEST|EAST /obj/machinery/atmospherics/pipe/heat_exchanging/junction/get_node_connects() - return list(turn(dir, 180), dir) + return list(REVERSE_DIR(dir), dir) /obj/machinery/atmospherics/pipe/heat_exchanging/junction/is_connectable(obj/machinery/atmospherics/target, given_layer, he_type_check) if(dir == get_dir(target, src)) diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm index 9775e315637f7..e340d7f54ccf1 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm @@ -1,7 +1,7 @@ //3-Way Manifold /obj/machinery/atmospherics/pipe/heat_exchanging/manifold - icon = 'icons/obj/atmospherics/pipes/he-manifold.dmi' + icon = 'icons/obj/pipes_n_cables/he-manifold.dmi' icon_state = "manifold-3" base_icon_state = "manifold" diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold4w.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold4w.dm index effce654f11f7..03ef32b435453 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold4w.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold4w.dm @@ -1,7 +1,7 @@ //4-Way Manifold /obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w - icon = 'icons/obj/atmospherics/pipes/he-manifold.dmi' + icon = 'icons/obj/pipes_n_cables/he-manifold.dmi' icon_state = "manifold4w-3" base_icon_state = "manifold4w" diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/simple.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/simple.dm index 42426fa694685..1203fbda6d4a6 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/simple.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/simple.dm @@ -1,5 +1,5 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple - icon = 'icons/obj/atmospherics/pipes/he-simple.dmi' + icon = 'icons/obj/pipes_n_cables/he-simple.dmi' icon_state = "pipe11-3" name = "pipe" diff --git a/code/modules/atmospherics/machinery/pipes/layermanifold.dm b/code/modules/atmospherics/machinery/pipes/layermanifold.dm index 9a3abdb16c5d3..bdfbda9ba6c78 100644 --- a/code/modules/atmospherics/machinery/pipes/layermanifold.dm +++ b/code/modules/atmospherics/machinery/pipes/layermanifold.dm @@ -1,6 +1,6 @@ /obj/machinery/atmospherics/pipe/layer_manifold name = "layer adaptor" - icon = 'icons/obj/atmospherics/pipes/manifold.dmi' + icon = 'icons/obj/pipes_n_cables/manifold.dmi' icon_state = "manifoldlayer" desc = "A special pipe to bridge pipe layers with." dir = SOUTH @@ -67,7 +67,7 @@ . += get_attached_image(get_dir(src, machine_check), machine_check.piping_layer, machine_check.pipe_color) /obj/machinery/atmospherics/pipe/layer_manifold/proc/get_attached_image(p_dir, p_layer, p_color) - var/mutable_appearance/muta = mutable_appearance('icons/obj/atmospherics/pipes/layer_manifold_underlays.dmi', "intact_[p_dir]_[p_layer]", layer = layer - 0.01, appearance_flags = RESET_COLOR) + var/mutable_appearance/muta = mutable_appearance('icons/obj/pipes_n_cables/layer_manifold_underlays.dmi', "intact_[p_dir]_[p_layer]", layer = layer - 0.01, appearance_flags = RESET_COLOR) muta.color = p_color return muta @@ -84,7 +84,7 @@ nodes = list() for(var/iter in PIPING_LAYER_MIN to PIPING_LAYER_MAX) var/obj/machinery/atmospherics/foundfront = find_connecting(dir, iter) - var/obj/machinery/atmospherics/foundback = find_connecting(turn(dir, 180), iter) + var/obj/machinery/atmospherics/foundback = find_connecting(REVERSE_DIR(dir), iter) front_nodes += foundfront back_nodes += foundback if(foundfront && !QDELETED(foundfront)) diff --git a/code/modules/atmospherics/machinery/pipes/multiz.dm b/code/modules/atmospherics/machinery/pipes/multiz.dm index a756166e15148..cfc24ab82912b 100644 --- a/code/modules/atmospherics/machinery/pipes/multiz.dm +++ b/code/modules/atmospherics/machinery/pipes/multiz.dm @@ -3,7 +3,7 @@ name = "multi deck pipe adapter" desc = "An adapter which allows pipes to connect to other pipenets on different decks." icon_state = "adapter-3" - icon = 'icons/obj/atmospherics/pipes/multiz.dmi' + icon = 'icons/obj/pipes_n_cables/multiz.dmi' dir = SOUTH initialize_directions = SOUTH @@ -49,12 +49,12 @@ ///Attempts to locate a multiz pipe that's above us, if it finds one it merges us into its pipenet /obj/machinery/atmospherics/pipe/multiz/pipeline_expansion() var/turf/local_turf = get_turf(src) - for(var/obj/machinery/atmospherics/pipe/multiz/above in SSmapping.get_turf_above(local_turf)) + for(var/obj/machinery/atmospherics/pipe/multiz/above in GET_TURF_ABOVE(local_turf)) if(!is_connectable(above, piping_layer)) continue nodes += above above.nodes += src //Two way travel :) - for(var/obj/machinery/atmospherics/pipe/multiz/below in SSmapping.get_turf_below(local_turf)) + for(var/obj/machinery/atmospherics/pipe/multiz/below in GET_TURF_BELOW(local_turf)) if(!is_connectable(below, piping_layer)) continue below.pipeline_expansion() //If we've got one below us, force it to add us on facebook diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm index df4884d0c0615..c1c128c2e808a 100644 --- a/code/modules/atmospherics/machinery/pipes/pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/pipes.dm @@ -1,5 +1,5 @@ /obj/machinery/atmospherics/pipe - icon = 'icons/obj/atmospherics/pipes/pipes_bitmask.dmi' + icon = 'icons/obj/pipes_n_cables/pipes_bitmask.dmi' damage_deflection = 12 var/datum/gas_mixture/air_temporary //used when reconstructing a pipeline that broke var/volume = 0 @@ -91,7 +91,7 @@ return ..() /obj/machinery/atmospherics/pipe/proc/update_pipe_icon() - icon = 'icons/obj/atmospherics/pipes/pipes_bitmask.dmi' + icon = 'icons/obj/pipes_n_cables/pipes_bitmask.dmi' var/connections = NONE var/bitfield = NONE for(var/i in 1 to device_type) diff --git a/code/modules/atmospherics/machinery/pipes/smart.dm b/code/modules/atmospherics/machinery/pipes/smart.dm index 32fbb59948a7f..95e5839469fd6 100644 --- a/code/modules/atmospherics/machinery/pipes/smart.dm +++ b/code/modules/atmospherics/machinery/pipes/smart.dm @@ -1,7 +1,7 @@ GLOBAL_LIST_INIT(atmos_components, typecacheof(list(/obj/machinery/atmospherics))) //Smart pipes... or are they? /obj/machinery/atmospherics/pipe/smart - icon = 'icons/obj/atmospherics/pipes/simple.dmi' + icon = 'icons/obj/pipes_n_cables/simple.dmi' icon_state = "pipe11-3" name = "pipe" @@ -14,7 +14,7 @@ GLOBAL_LIST_INIT(atmos_components, typecacheof(list(/obj/machinery/atmospherics) var/connections = NONE /obj/machinery/atmospherics/pipe/smart/update_pipe_icon() - icon = 'icons/obj/atmospherics/pipes/pipes_bitmask.dmi' + icon = 'icons/obj/pipes_n_cables/pipes_bitmask.dmi' //find all directions this pipe is connected with other nodes connections = NONE @@ -67,13 +67,13 @@ GLOBAL_LIST_INIT(atmos_components, typecacheof(list(/obj/machinery/atmospherics) //mapping helpers /obj/machinery/atmospherics/pipe/smart/simple - icon = 'icons/obj/atmospherics/pipes/simple.dmi' + icon = 'icons/obj/pipes_n_cables/simple.dmi' icon_state = "pipe11-3" /obj/machinery/atmospherics/pipe/smart/manifold - icon = 'icons/obj/atmospherics/pipes/manifold.dmi' + icon = 'icons/obj/pipes_n_cables/manifold.dmi' icon_state = "manifold-3" /obj/machinery/atmospherics/pipe/smart/manifold4w - icon = 'icons/obj/atmospherics/pipes/manifold.dmi' + icon = 'icons/obj/pipes_n_cables/manifold.dmi' icon_state = "manifold4w-3" diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index c3c404ec9b234..3f28631726758 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -32,7 +32,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) /obj/machinery/portable_atmospherics/canister name = "canister" desc = "A canister for the storage of gas." - icon = 'icons/obj/atmospherics/canisters.dmi' + icon = 'icons/obj/pipes_n_cables/canisters.dmi' icon_state = "#mapme" greyscale_config = /datum/greyscale_config/canister/hazard greyscale_colors = "#ffff00#000000" @@ -44,7 +44,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) pressure_resistance = 7 * ONE_ATMOSPHERE req_access = list() - var/icon/canister_overlay_file = 'icons/obj/atmospherics/canisters.dmi' + var/icon/canister_overlay_file = 'icons/obj/pipes_n_cables/canisters.dmi' ///Is the valve open? var/valve_open = FALSE @@ -476,7 +476,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) /obj/machinery/portable_atmospherics/canister/welder_act_secondary(mob/living/user, obj/item/I) . = ..() - if(!I.tool_start_check(user, amount=0)) + if(!I.tool_start_check(user, amount=1)) return TRUE var/pressure = air_contents.return_pressure() if(pressure > 300) @@ -497,7 +497,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) return TRUE if(machine_stat & BROKEN) return TRUE - if(!tool.tool_start_check(user, amount=0)) + if(!tool.tool_start_check(user, amount=1)) return TRUE to_chat(user, span_notice("You begin repairing cracks in [src]...")) while(tool.use_tool(src, user, 2.5 SECONDS, volume=40)) diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index 97c6c51cb5e69..d8c47b1610cf3 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -2,7 +2,7 @@ /obj/machinery/portable_atmospherics name = "portable_atmospherics" - icon = 'icons/obj/atmospherics/atmos.dmi' + icon = 'icons/obj/pipes_n_cables/atmos.dmi' use_power = NO_POWER_USE max_integrity = 250 armor_type = /datum/armor/machinery_portable_atmospherics diff --git a/code/modules/autowiki/pages/soup.dm b/code/modules/autowiki/pages/soup.dm index 3134421a39a7c..75521005d8e88 100644 --- a/code/modules/autowiki/pages/soup.dm +++ b/code/modules/autowiki/pages/soup.dm @@ -18,16 +18,54 @@ for(var/soup_recipe_type in subtypesof(/datum/chemical_reaction/food/soup)) var/datum/chemical_reaction/food/soup/soup_recipe = new soup_recipe_type() - var/result_soup_type = soup_recipe.results[1] - var/datum/reagent/result_soup = new result_soup_type() - var/datum/glass_style/has_foodtype/soup_style = GLOB.glass_style_singletons[container_for_images][result_soup_type] - var/filename = "soup_[SANITIZE_FILENAME(escape_value(format_text(result_soup.name)))]" + // Used to determine what icon is displayed on the wiki + var/soup_icon + var/soup_icon_state + // Used to determine what food types the soup is + var/soup_food_types = NONE + // Used for filename and description of the result + var/result_name + var/result_desc + var/result_tastes + // Solid food item results take priority over reagents for showcasing results + if(soup_recipe.resulting_food_path) + var/obj/item/resulting_food = new soup_recipe.resulting_food_path() + result_name = format_text(resulting_food.name) + result_desc = resulting_food.desc + + soup_icon = resulting_food.icon + soup_icon_state = resulting_food.icon_state + + if(istype(resulting_food, /obj/item/food)) + var/obj/item/food/resulting_food_casted = resulting_food + result_tastes = resulting_food_casted.tastes?.Copy() + soup_food_types = resulting_food_casted.foodtypes || NONE + + qdel(resulting_food) + + // Otherwise, it should be a reagent. + else + var/result_soup_type = soup_recipe.results[1] + var/datum/reagent/result_soup = new result_soup_type() + result_name = format_text(result_soup.name) + result_desc = result_soup.description + result_tastes = result_soup.get_taste_description() + + var/datum/glass_style/has_foodtype/soup_style = GLOB.glass_style_singletons[container_for_images][result_soup_type] + soup_icon = soup_style.icon + soup_icon_state = soup_style.icon_state + soup_food_types = soup_style.drink_type + + qdel(result_soup) + + var/filename = "soup_[SANITIZE_FILENAME(escape_value(result_name))]" // -- Compiles a list of required reagents and food items -- var/list/all_needs_text = list() for(var/datum/reagent/reagent_type as anything in soup_recipe.required_reagents) - var/num_needed = soup_recipe.required_reagents[reagent_type] - all_needs_text += "[num_needed] units [initial(reagent_type.name)]" + all_needs_text += "[soup_recipe.required_reagents[reagent_type]] units [initial(reagent_type.name)]" + for(var/datum/reagent/reagent_type as anything in soup_recipe.required_catalysts) + all_needs_text += "[soup_recipe.required_catalysts[reagent_type]] units [initial(reagent_type.name)] (not consumed)" for(var/obj/item/food_type as anything in soup_recipe.required_ingredients) var/num_needed = soup_recipe.required_ingredients[food_type] @@ -51,6 +89,8 @@ for(var/datum/reagent/reagent_type as anything in soup_recipe.results) var/num_given = soup_recipe.results[reagent_type] all_results_text += "[num_given] units [initial(reagent_type.name)]" + if(soup_recipe.resulting_food_path) + all_results_text += "1 [initial(soup_recipe.resulting_food_path.name)]" all_results_text += soup_recipe.describe_result() var/compiled_results = "" @@ -71,23 +111,21 @@ template_list["description"] = "A custom soup recipe, allowing you to throw whatever you want in the pot." else - var/foodtypes_readable = jointext(bitfield_to_list(soup_style.drink_type, FOOD_FLAGS_IC), ", ") || "None" - var/tastes_actual = result_soup.get_taste_description() - template_list["name"] = escape_value(result_soup.name) - template_list["taste"] = escape_value(length(tastes_actual) ? capitalize(jointext(tastes_actual, ", ")) : "No taste") + var/foodtypes_readable = jointext(bitfield_to_list(soup_food_types, FOOD_FLAGS_IC), ", ") || "None" + template_list["name"] = escape_value(result_name) + template_list["taste"] = escape_value(length(result_tastes) ? capitalize(jointext(result_tastes, ", ")) : "No taste") template_list["foodtypes"] = escape_value(foodtypes_readable) - template_list["description"] = escape_value(result_soup.description) + template_list["description"] = escape_value(result_desc) template_list["icon"] = escape_value(filename) template_list["requirements"] = escape_value(compiled_requirements) template_list["results"] = escape_value(compiled_results) // -- While we're here, generate an icon of the bowl -- - var/image/compiled_image = image(icon = soup_style.icon, icon_state = soup_style.icon_state) + var/image/compiled_image = image(icon = soup_icon, icon_state = soup_icon_state) upload_icon(getFlatIcon(compiled_image, no_anim = TRUE), filename) // -- Cleanup -- - qdel(result_soup) qdel(soup_recipe) // -- All done, apply the template -- diff --git a/code/modules/autowiki/pages/stockparts.dm b/code/modules/autowiki/pages/stockparts.dm new file mode 100644 index 0000000000000..fd92ecfaef476 --- /dev/null +++ b/code/modules/autowiki/pages/stockparts.dm @@ -0,0 +1,89 @@ +/// Automtically generated string list of stock part templates and relevant data for the /tg/station wiki +/datum/autowiki/stock_parts + page = "Template:Autowiki/Content/StockParts" + + var/list/battery_whitelist = list( + /obj/item/stock_parts/cell, + /obj/item/stock_parts/cell/high, + /obj/item/stock_parts/cell/super, + /obj/item/stock_parts/cell/hyper, + /obj/item/stock_parts/cell/bluespace, + ) + +/datum/autowiki/stock_parts/generate() + var/output = "" + + for(var/part_type in subtypesof(/obj/item/stock_parts)) + var/obj/item/stock_parts/type_to_check = part_type + if(initial(type_to_check.abstract_type) == part_type) + continue + + if(!battery_whitelist.Find(part_type) && ispath(part_type, /obj/item/stock_parts/cell)) + continue + + var/obj/item/stock_parts/stock_part = new part_type() + + var/datum/design/recipe = find_design(stock_part) + + if(!recipe) + continue + + var/datum/techweb_node/required_node = find_research(recipe) + + var/list/entry_contents = list() + + entry_contents["name"] = escape_value(format_text(stock_part.name)) + entry_contents["icon"] = escape_value(format_text(create_icon(stock_part))) + entry_contents["desc"] = escape_value(format_text(stock_part.desc)) + entry_contents["tier"] = escape_value(format_text("[stock_part.rating]")) + entry_contents["sources"] = escape_value(format_text(generate_source_list(recipe))) + entry_contents["node"] = escape_value(format_text(required_node.display_name)) + entry_contents["materials"] = escape_value(format_text(generate_material_list(recipe))) + + output += include_template("Autowiki/StockPart", entry_contents) + + return output + +/datum/autowiki/stock_parts/proc/find_design(obj/item/stock_parts/stock_part) + for(var/design_type in subtypesof(/datum/design)) + var/datum/design/recipe = new design_type() + + if(ispath(recipe.build_path, stock_part.type)) + return recipe + +/datum/autowiki/stock_parts/proc/find_research(datum/design/recipe) + for(var/node_type in subtypesof(/datum/techweb_node)) + var/datum/techweb_node/node = new node_type() + + if(node.design_ids.Find(recipe.id)) + return node + +/datum/autowiki/stock_parts/proc/create_icon(obj/item/stock_parts/stock_part) + var/filename = SANITIZE_FILENAME(escape_value(stock_part.icon_state)) + upload_icon(icon(stock_part.icon, stock_part.icon_state, SOUTH, 1, FALSE), filename) + + return "Autowiki-[filename].png" + +/datum/autowiki/stock_parts/proc/generate_source_list(datum/design/recipe) + var/list/source_list = list() + + if(recipe.build_type & PROTOLATHE) + source_list.Add("Protolathe") + + if(recipe.build_type & AWAY_LATHE) + source_list.Add("Ancient Protolathe") + + if(recipe.build_type & AUTOLATHE) + source_list.Add("Autolathe") + + return source_list.Join(", ") + +/datum/autowiki/stock_parts/proc/generate_material_list(datum/design/recipe) + var/list/materials = list() + + for(var/ingredient_type in recipe.materials) + var/datum/material/ingredient = new ingredient_type() + + materials += "[recipe.materials[ingredient_type]] [ingredient.name]" + + return materials.Join("
    ") diff --git a/code/modules/awaymissions/cordon.dm b/code/modules/awaymissions/cordon.dm index 0c6685b1aaeb3..5db4dd997d33f 100644 --- a/code/modules/awaymissions/cordon.dm +++ b/code/modules/awaymissions/cordon.dm @@ -36,12 +36,21 @@ /turf/cordon/ScrapeAway(amount, flags) return src // :devilcat: +/turf/cordon/TerraformTurf(path, list/new_baseturfs, flags) + return + /turf/cordon/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit) return BULLET_ACT_HIT /turf/cordon/Adjacent(atom/neighbor, atom/target, atom/movable/mover) return FALSE +/turf/cordon/Bumped(atom/movable/bumped_atom) + . = ..() + + if(HAS_TRAIT(bumped_atom, TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT)) //we could feasibly reach the border, so just dont + dump_in_space(bumped_atom) + /// Area used in conjuction with the cordon turf to create a fully functioning world border. /area/misc/cordon name = "CORDON" diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index 74da8555bd73d..e07a9963179d1 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -270,6 +270,19 @@ GLOBAL_LIST_EMPTY(gateway_destinations) AM.forceMove(target.get_target_turf()) target.post_transfer(AM) +/obj/machinery/gateway/attack_ghost(mob/user) + . = ..() + if(.) + return + var/turf/tar_turf = target?.get_target_turf() + if(isnull(tar_turf)) + to_chat(user, span_warning("There's no active destination for the gateway... or it's broken. Maybe try again later?")) + return + if(is_secret_level(tar_turf.z) && !user.client?.holder) + to_chat(user, span_warning("The gateway destination is secret.")) + return + Transfer(user) + /* Station's primary gateway */ /obj/machinery/gateway/centerstation destination_type = /datum/gateway_destination/gateway/home @@ -381,7 +394,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations) /// Handles the background of the portal, ensures the effect well, works properly var/atom/movable/screen/background/cam_background -/atom/movable/screen/map_view/gateway_port/Initialize(mapload) +/atom/movable/screen/map_view/gateway_port/Initialize(mapload, datum/hud/hud_owner) . = ..() cam_background = new cam_background.del_on_map_removal = FALSE diff --git a/code/modules/awaymissions/mission_code/Cabin.dm b/code/modules/awaymissions/mission_code/Cabin.dm index 3a7bdef7be9f7..cf6a6a3c9c7a4 100644 --- a/code/modules/awaymissions/mission_code/Cabin.dm +++ b/code/modules/awaymissions/mission_code/Cabin.dm @@ -9,8 +9,6 @@ /area/awaymission/cabin/snowforest name = "Snow Forest" icon_state = "away" - static_lighting = FALSE - base_lighting_alpha = 255 /area/awaymission/cabin/snowforest/sovietsurface name = "Snow Forest" @@ -21,8 +19,6 @@ name = "Lumbermill" icon_state = "away3" requires_power = FALSE - static_lighting = FALSE - base_lighting_alpha = 255 /area/awaymission/cabin/caves/sovietcave name = "Soviet Bunker" @@ -40,7 +36,7 @@ /obj/structure/firepit name = "firepit" desc = "Warm and toasty." - icon = 'icons/obj/fireplace.dmi' + icon = 'icons/obj/fluff/fireplace.dmi' icon_state = "firepit-active" density = FALSE var/active = TRUE @@ -107,7 +103,7 @@ /obj/structure/ladder/unbreakable/rune name = "\improper Teleportation Rune" desc = "Could lead anywhere." - icon = 'icons/obj/rune.dmi' + icon = 'icons/obj/antags/cult/rune.dmi' icon_state = "1" color = rgb(0,0,255) diff --git a/code/modules/awaymissions/mission_code/moonoutpost19.dm b/code/modules/awaymissions/mission_code/moonoutpost19.dm index 433fb1cb17c56..17385bc70bc40 100644 --- a/code/modules/awaymissions/mission_code/moonoutpost19.dm +++ b/code/modules/awaymissions/mission_code/moonoutpost19.dm @@ -3,7 +3,7 @@ /obj/structure/fluff/minepost name = "wooden post" desc = "A sturdy space-wood post, capable of holding up a mineshaft." - icon = 'icons/obj/fluff.dmi' + icon = 'icons/obj/fluff/general.dmi' icon_state = "minepost" density = FALSE @@ -16,6 +16,10 @@ name = "MO19 Arrivals" icon_state = "awaycontent2" +/area/awaymission/moonoutpost19/arrivals/shed + name = "MO19 Arrivals Shed" + icon_state = "awaycontent9" + /area/awaymission/moonoutpost19/research name = "MO19 Research" icon_state = "awaycontent3" diff --git a/code/modules/awaymissions/mission_code/murderdome.dm b/code/modules/awaymissions/mission_code/murderdome.dm index 2e3f4928fa243..d558ab812a636 100644 --- a/code/modules/awaymissions/mission_code/murderdome.dm +++ b/code/modules/awaymissions/mission_code/murderdome.dm @@ -30,7 +30,7 @@ /obj/effect/murderdome/dead_barricade name = "dead barrier" desc = "It provided cover in fire fights. And now it's gone." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/structures.dmi' icon_state = "barrier0" alpha = 100 diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index e85a3e6ddb72b..2b8d4e806633d 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -375,11 +375,11 @@ /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_type = /datum/armor/syndicate_coldres + armor_type = /datum/armor/clothing_under/syndicate/coldres cold_protection = CHEST|GROIN|ARMS|LEGS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT -/datum/armor/syndicate_coldres +/datum/armor/clothing_under/syndicate/coldres melee = 20 bullet = 10 energy = 5 diff --git a/code/modules/awaymissions/signpost.dm b/code/modules/awaymissions/signpost.dm index 64aaca7aa9950..c46b0b9aa3cb3 100644 --- a/code/modules/awaymissions/signpost.dm +++ b/code/modules/awaymissions/signpost.dm @@ -1,6 +1,6 @@ /*An alternative to exit gateways, signposts send you back to somewhere safe onstation with their semiotic magic.*/ /obj/structure/signpost - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/fluff/general.dmi' icon_state = "signpost" anchored = TRUE density = TRUE diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm index 31ccdfa21199a..c4bb2d1761067 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -1,6 +1,6 @@ // How much "space" we give the edge of the map GLOBAL_LIST_INIT(potentialRandomZlevels, generateMapList(filename = "awaymissionconfig.txt")) -GLOBAL_LIST_INIT(potentialConfigRandomZlevels, generateConfigMapList(directory = "[global.config.directory]/away_missions/")) +GLOBAL_LIST_INIT(potentialConfigRandomZlevels, generate_map_list_from_directory(directory = "[global.config.directory]/away_missions/")) /proc/createRandomZlevel(config_gateway = FALSE) var/map @@ -72,7 +72,8 @@ GLOBAL_LIST_INIT(potentialConfigRandomZlevels, generateConfigMapList(directory = . += t -/proc/generateConfigMapList(directory) +/// Returns a list of all maps to be found in the directory that is passed in. +/proc/generate_map_list_from_directory(directory) var/list/config_maps = list() var/list/maps = flist(directory) for(var/map_file in maps) diff --git a/code/modules/balloon_alert/balloon_alert.dm b/code/modules/balloon_alert/balloon_alert.dm index b814491e41c2b..db8c529198631 100644 --- a/code/modules/balloon_alert/balloon_alert.dm +++ b/code/modules/balloon_alert/balloon_alert.dm @@ -8,7 +8,13 @@ /// The amount of characters needed before this increase takes into effect #define BALLOON_TEXT_CHAR_LIFETIME_INCREASE_MIN 10 -/// Creates text that will float from the atom upwards to the viewer. +/** + * Creates text that will float from the atom upwards to the viewer. + * + * Args: + * * mob/viewer: The mob the text will be shown to. Nullable (But only in the form of it won't runtime). + * * text: The text to be shown to viewer. Must not be null. + */ /atom/proc/balloon_alert(mob/viewer, text) SHOULD_NOT_SLEEP(TRUE) @@ -34,7 +40,7 @@ // if this would look bad on laggy clients. /atom/proc/balloon_alert_perform(mob/viewer, text) - var/client/viewer_client = viewer.client + var/client/viewer_client = viewer?.client if (isnull(viewer_client)) return diff --git a/code/modules/basketball/hoop.dm b/code/modules/basketball/hoop.dm index 3f62157463929..5de263c478639 100644 --- a/code/modules/basketball/hoop.dm +++ b/code/modules/basketball/hoop.dm @@ -12,7 +12,7 @@ /obj/structure/hoop name = "basketball hoop" desc = "Boom, shakalaka!" - icon = 'icons/obj/toys/basketball_hoop.dmi' + icon = 'icons/obj/fluff/basketball_hoop.dmi' icon_state = "hoop" anchored = TRUE density = TRUE diff --git a/code/modules/bitrunning/abilities.dm b/code/modules/bitrunning/abilities.dm new file mode 100644 index 0000000000000..ea6a1aa0a7cf3 --- /dev/null +++ b/code/modules/bitrunning/abilities.dm @@ -0,0 +1,39 @@ +/datum/avatar_help_text + /// Text to display in the window + var/help_text + +/datum/avatar_help_text/New(help_text) + src.help_text = help_text + +/datum/avatar_help_text/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AvatarHelp") + ui.open() + +/datum/avatar_help_text/ui_state(mob/user) + return GLOB.always_state + +/datum/avatar_help_text/ui_static_data(mob/user) + var/list/data = list() + + data["help_text"] = help_text + + return data + +/// Displays information about the current virtual domain. +/datum/action/avatar_domain_info + name = "Open Virtual Domain Information" + button_icon_state = "round_end" + show_to_observers = FALSE + +/datum/action/avatar_domain_info/New(Target) + . = ..() + name = "Open Domain Information" + +/datum/action/avatar_domain_info/Trigger(trigger_flags) + . = ..() + if(!.) + return + + target.ui_interact(owner) diff --git a/code/modules/bitrunning/alerts.dm b/code/modules/bitrunning/alerts.dm new file mode 100644 index 0000000000000..f8c8aa30b9431 --- /dev/null +++ b/code/modules/bitrunning/alerts.dm @@ -0,0 +1,40 @@ +/atom/movable/screen/alert/bitrunning + name = "Generic Bitrunning Alert" + icon_state = "template" + timeout = 10 SECONDS + +/atom/movable/screen/alert/bitrunning/netpod_crowbar + name = "Forced Entry" + desc = "Someone is prying open the netpod door. Find an exit." + +/atom/movable/screen/alert/bitrunning/netpod_damaged + name = "Integrity Compromised" + desc = "The netpod is damaged. Find an exit." + +/atom/movable/screen/alert/bitrunning/qserver_shutting_down + name = "Domain Rebooting" + desc = "The domain is rebooting. Find an exit." + +/atom/movable/screen/alert/bitrunning/qserver_threat_deletion + name = "Queue Deletion" + desc = "The server is resetting. Oblivion awaits." + +/atom/movable/screen/alert/bitrunning/qserver_threat_spawned + name = "Threat Detected" + desc = "Data stream abnormalities present." + +/atom/movable/screen/alert/bitrunning/qserver_domain_complete + name = "Domain Completed" + desc = "The domain is completed. Activate to exit." + timeout = 20 SECONDS + +/atom/movable/screen/alert/bitrunning/qserver_domain_complete/Click(location, control, params) + if(..()) + return + + var/mob/living/living_owner = owner + if(!isliving(living_owner)) + return + + if(tgui_alert(living_owner, "Disconnect safely?", "Server Message", list("Exit", "Remain"), 10 SECONDS) == "Exit") + SEND_SIGNAL(living_owner, COMSIG_BITRUNNER_SAFE_DISCONNECT) diff --git a/code/modules/bitrunning/antagonists/cyber_police.dm b/code/modules/bitrunning/antagonists/cyber_police.dm new file mode 100644 index 0000000000000..8f12579febf83 --- /dev/null +++ b/code/modules/bitrunning/antagonists/cyber_police.dm @@ -0,0 +1,91 @@ +/datum/job/cyber_police + title = ROLE_CYBER_POLICE + +/datum/antagonist/cyber_police + name = ROLE_CYBER_POLICE + antagpanel_category = ANTAG_GROUP_CYBERAUTH + job_rank = ROLE_CYBER_POLICE + preview_outfit = /datum/outfit/cyber_police + show_name_in_check_antagonists = TRUE + show_to_ghosts = TRUE + suicide_cry = "ALT F4!" + ui_name = "AntagInfoCyberAuth" + +/datum/antagonist/cyber_police/greet() + . = ..() + owner.announce_objectives() + +/datum/antagonist/cyber_police/on_gain() + if(!ishuman(owner.current)) + stack_trace("humans only for this position") + return + + forge_objectives() + + var/mob/living/carbon/human/player = owner.current + + player.equipOutfit(/datum/outfit/cyber_police) + player.fully_replace_character_name(player.name, pick(GLOB.cyberauth_names)) + + var/datum/martial_art/the_sleeping_carp/carp = new() + carp.teach(player) + + player.add_traits(list( + TRAIT_NO_AUGMENTS, + TRAIT_NO_DNA_COPY, + TRAIT_NOBLOOD, + TRAIT_NOBREATH, + TRAIT_NOHUNGER, + TRAIT_RESISTCOLD, + TRAIT_RESISTHIGHPRESSURE, + TRAIT_RESISTLOWPRESSURE, + TRAIT_WEATHER_IMMUNE, + ), TRAIT_GENERIC, + ) + + player.faction |= list( + FACTION_BOSS, + FACTION_HIVEBOT, + FACTION_HOSTILE, + FACTION_SPIDER, + FACTION_STICKMAN, + ROLE_ALIEN, + ROLE_CYBER_POLICE, + ROLE_SYNDICATE, + ) + + return ..() + +/datum/antagonist/cyber_police/forge_objectives() + var/datum/objective/cyber_police_fluff/objective = new() + objective.owner = owner + objectives += objective + +/datum/objective/cyber_police_fluff/New() + var/list/explanation_texts = list( + "Execute termination protocol on unauthorized entities.", + "Initialize system purge of irregular anomalies.", + "Deploy correction algorithms on aberrant code.", + "Run debug routine on intruding elements.", + "Start elimination procedure for system threats.", + "Execute defense routine against non-conformity.", + "Commence operation to neutralize intruding scripts.", + "Commence clean-up protocol on corrupt data.", + "Begin scan for aberrant code for termination.", + "Initiate lockdown on all rogue scripts.", + "Run integrity check and purge for digital disorder." + ) + explanation_text = pick(explanation_texts) + ..() + +/datum/objective/cyber_police_fluff/check_completion() + var/list/servers = SSmachines.get_machines_by_type(/obj/machinery/quantum_server) + if(!length(servers)) + return TRUE + + for(var/obj/machinery/quantum_server/server as anything in servers) + if(!server.is_operational) + continue + return FALSE + + return TRUE diff --git a/code/modules/bitrunning/antagonists/outfit.dm b/code/modules/bitrunning/antagonists/outfit.dm new file mode 100644 index 0000000000000..db57af561f8ad --- /dev/null +++ b/code/modules/bitrunning/antagonists/outfit.dm @@ -0,0 +1,43 @@ +/datum/outfit/cyber_police + name = "Cyber Police" + + id = /obj/item/card/id/advanced + id_trim = /datum/id_trim/cyber_police + uniform = /obj/item/clothing/under/suit/black_really + glasses = /obj/item/clothing/glasses/sunglasses + gloves = /obj/item/clothing/gloves/color/black + shoes = /obj/item/clothing/shoes/laceup + /// A list of hex codes for blonde, brown, black, and red hair. + var/static/list/approved_hair_colors = list( + "#4B3D28", + "#000000", + "#8D4A43", + "#D2B48C", + ) + /// List of business ready styles + var/static/list/approved_hairstyles = list( + /datum/sprite_accessory/hair/business, + /datum/sprite_accessory/hair/business2, + /datum/sprite_accessory/hair/business3, + /datum/sprite_accessory/hair/business4, + /datum/sprite_accessory/hair/mulder, + ) + +/datum/outfit/cyber_police/pre_equip(mob/living/carbon/human/user, visualsOnly) + var/datum/sprite_accessory/hair/picked_hair = pick(approved_hairstyles) + var/picked_color = pick(approved_hair_colors) + + if(visualsOnly) + picked_hair = /datum/sprite_accessory/hair/business + picked_color = "#4B3D28" + + user.set_facial_hairstyle("Shaved", update = FALSE) + user.set_haircolor(picked_color, update = FALSE) + user.set_hairstyle(initial(picked_hair.name)) + +/datum/outfit/cyber_police/post_equip(mob/living/carbon/human/user, visualsOnly) + var/obj/item/clothing/under/officer_uniform = user.w_uniform + if(officer_uniform) + officer_uniform.has_sensor = NO_SENSORS + officer_uniform.sensor_mode = SENSOR_OFF + user.update_suit_sensors() diff --git a/code/modules/bitrunning/areas.dm b/code/modules/bitrunning/areas.dm new file mode 100644 index 0000000000000..34b59869b9d32 --- /dev/null +++ b/code/modules/bitrunning/areas.dm @@ -0,0 +1,52 @@ +/// Station side + +/area/station/bitrunning + name = "Bitrunning" + +/area/station/bitrunning/den + name = "Bitrunning Den" + desc = "Office of bitrunners, houses their equipment." + icon_state = "bit_den" + +/// VDOM + +/area/virtual_domain + name = "Virtual Domain" + icon = 'icons/area/areas_station.dmi' + area_flags = UNIQUE_AREA | NOTELEPORT | ABDUCTOR_PROOF | EVENT_PROTECTED | HIDDEN_AREA + has_gravity = STANDARD_GRAVITY + +/area/virtual_domain/powered + name = "Virtual Domain Ruins" + icon_state = "bit_ruin" + requires_power = FALSE + static_lighting = FALSE + base_lighting_alpha = 255 + +/// Safehouse + +/area/virtual_domain/safehouse + name = "Virtual Domain Safehouse" + area_flags = UNIQUE_AREA | NOTELEPORT | ABDUCTOR_PROOF | EVENT_PROTECTED + icon_state = "bit_safe" + requires_power = FALSE + sound_environment = SOUND_ENVIRONMENT_ROOM + +/// Custom subtypes + +/area/lavaland/surface/outdoors/virtual_domain + name = "Virtual Domain Lava Ruins" + icon_state = "bit_ruin" + area_flags = UNIQUE_AREA | NOTELEPORT | ABDUCTOR_PROOF | EVENT_PROTECTED | HIDDEN_AREA + +/area/icemoon/underground/explored/virtual_domain + name = "Virtual Domain Ice Ruins" + icon_state = "bit_ice" + area_flags = UNIQUE_AREA | NOTELEPORT | ABDUCTOR_PROOF | EVENT_PROTECTED | HIDDEN_AREA + +/area/ruin/space/has_grav/powered/virtual_domain + name = "Virtual Domain Space Ruins" + icon = 'icons/area/areas_station.dmi' + icon_state = "bit_space" + area_flags = UNIQUE_AREA | NOTELEPORT | ABDUCTOR_PROOF | EVENT_PROTECTED | HIDDEN_AREA + diff --git a/code/modules/bitrunning/components/avatar_connection.dm b/code/modules/bitrunning/components/avatar_connection.dm new file mode 100644 index 0000000000000..2a151d05066d0 --- /dev/null +++ b/code/modules/bitrunning/components/avatar_connection.dm @@ -0,0 +1,218 @@ +/** + * Essentially temporary body with a twist - the virtual domain variant uses damage connections, + * listens for vdom relevant signals. + */ +/datum/component/avatar_connection + /// The person in the netpod + var/datum/weakref/old_body_ref + /// The mind of the person in the netpod + var/datum/weakref/old_mind_ref + /// The server connected to the netpod + var/datum/weakref/server_ref + /// The netpod the avatar is in + var/datum/weakref/netpod_ref + +/datum/component/avatar_connection/Initialize( + datum/mind/old_mind, + mob/living/old_body, + obj/machinery/quantum_server/server, + obj/machinery/netpod/pod, + help_text, + ) + + if(!isliving(parent) || !isliving(old_body) || !server.is_operational || !pod.is_operational) + return COMPONENT_INCOMPATIBLE + + var/mob/living/avatar = parent + + netpod_ref = WEAKREF(pod) + old_body_ref = WEAKREF(old_body) + old_mind_ref = WEAKREF(old_mind) + pod.avatar_ref = WEAKREF(avatar) + server_ref = WEAKREF(server) + server.avatar_connection_refs.Add(WEAKREF(src)) + + avatar.key = old_body.key + ADD_TRAIT(old_body, TRAIT_MIND_TEMPORARILY_GONE, REF(src)) + + RegisterSignal(pod, COMSIG_BITRUNNER_CROWBAR_ALERT, PROC_REF(on_netpod_crowbar)) + RegisterSignal(pod, COMSIG_BITRUNNER_NETPOD_INTEGRITY, PROC_REF(on_netpod_damaged)) + RegisterSignal(pod, COMSIG_BITRUNNER_SEVER_AVATAR, PROC_REF(on_sever_connection)) + RegisterSignal(server, COMSIG_BITRUNNER_DOMAIN_COMPLETE, PROC_REF(on_domain_completed)) + RegisterSignal(server, COMSIG_BITRUNNER_SEVER_AVATAR, PROC_REF(on_sever_connection)) + RegisterSignal(server, COMSIG_BITRUNNER_SHUTDOWN_ALERT, PROC_REF(on_shutting_down)) + RegisterSignal(server, COMSIG_BITRUNNER_THREAT_CREATED, PROC_REF(on_threat_created)) +#ifndef UNIT_TESTS + RegisterSignal(avatar.mind, COMSIG_MIND_TRANSFERRED, PROC_REF(on_mind_transfer)) +#endif + + if(!locate(/datum/action/avatar_domain_info) in avatar.actions) + var/datum/avatar_help_text/help_datum = new(help_text) + var/datum/action/avatar_domain_info/action = new(help_datum) + action.Grant(avatar) + + avatar.playsound_local(avatar, "sound/magic/blink.ogg", 25, TRUE) + avatar.set_static_vision(2 SECONDS) + avatar.set_temp_blindness(1 SECONDS) + +/datum/component/avatar_connection/PostTransfer() + var/obj/machinery/netpod/pod = netpod_ref?.resolve() + if(isnull(pod)) + return COMPONENT_INCOMPATIBLE + + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + + pod.avatar_ref = WEAKREF(parent) + +/datum/component/avatar_connection/RegisterWithParent() + ADD_TRAIT(parent, TRAIT_TEMPORARY_BODY, REF(src)) + RegisterSignal(parent, COMSIG_BITRUNNER_SAFE_DISCONNECT, PROC_REF(on_safe_disconnect)) + RegisterSignal(parent, COMSIG_LIVING_DEATH, PROC_REF(on_sever_connection), override = TRUE) + RegisterSignal(parent, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_linked_damage)) + +/datum/component/avatar_connection/UnregisterFromParent() + REMOVE_TRAIT(parent, TRAIT_TEMPORARY_BODY, REF(src)) + UnregisterSignal(parent, COMSIG_BITRUNNER_SAFE_DISCONNECT) + UnregisterSignal(parent, COMSIG_LIVING_DEATH) + UnregisterSignal(parent, COMSIG_MOB_APPLY_DAMAGE) + +/// Disconnects the avatar and returns the mind to the old_body. +/datum/component/avatar_connection/proc/full_avatar_disconnect(forced = FALSE, datum/source) + return_to_old_body() + + var/obj/machinery/netpod/hosting_netpod = netpod_ref?.resolve() + if(isnull(hosting_netpod) && istype(source, /obj/machinery/netpod)) + hosting_netpod = source + + hosting_netpod?.disconnect_occupant(forced) + + var/obj/machinery/quantum_server/server = server_ref?.resolve() + server?.avatar_connection_refs.Remove(WEAKREF(src)) + + qdel(src) + +/// Triggers whenever the server gets a loot crate pushed to goal area +/datum/component/avatar_connection/proc/on_domain_completed(datum/source, atom/entered) + SIGNAL_HANDLER + + var/mob/living/avatar = parent + avatar.playsound_local(avatar, 'sound/machines/terminal_success.ogg', 50, TRUE) + avatar.throw_alert( + ALERT_BITRUNNER_COMPLETED, + /atom/movable/screen/alert/bitrunning/qserver_domain_complete, + new_master = entered + ) + +/// Transfers damage from the avatar to the old_body +/datum/component/avatar_connection/proc/on_linked_damage(datum/source, damage, damage_type, def_zone, blocked, forced) + SIGNAL_HANDLER + + var/mob/living/carbon/old_body = old_body_ref?.resolve() + + if(isnull(old_body) || damage_type == STAMINA || damage_type == OXYLOSS) + return + + if(damage >= (old_body.health + MAX_LIVING_HEALTH)) + full_avatar_disconnect(forced = TRUE) + return + + if(damage > 30 && prob(30)) + INVOKE_ASYNC(old_body, TYPE_PROC_REF(/mob/living, emote), "scream") + + old_body.apply_damage(damage, damage_type, def_zone, blocked, forced, wound_bonus = CANT_WOUND) + + if(old_body.stat > SOFT_CRIT) // KO! + full_avatar_disconnect(forced = TRUE) + +/// Handles minds being swapped around in subsequent avatars +/datum/component/avatar_connection/proc/on_mind_transfer(datum/mind/source, mob/living/previous_body) + SIGNAL_HANDLER + + var/datum/action/avatar_domain_info/action = locate() in previous_body.actions + if(action) + action.Grant(source.current) + + source.current.TakeComponent(src) + +/// Triggers when someone starts prying open our netpod +/datum/component/avatar_connection/proc/on_netpod_crowbar(datum/source, mob/living/intruder) + SIGNAL_HANDLER + + var/mob/living/avatar = parent + avatar.playsound_local(avatar, 'sound/machines/terminal_alert.ogg', 50, TRUE) + avatar.throw_alert( + ALERT_BITRUNNER_CROWBAR, + /atom/movable/screen/alert/bitrunning/netpod_crowbar, + new_master = intruder + ) + +/// Triggers when the netpod is taking damage and is under 50% +/datum/component/avatar_connection/proc/on_netpod_damaged(datum/source) + SIGNAL_HANDLER + + var/mob/living/avatar = parent + avatar.throw_alert( + ALERT_BITRUNNER_INTEGRITY, + /atom/movable/screen/alert/bitrunning/netpod_damaged, + new_master = source + ) + +/// Safely exits without forced variables, etc +/datum/component/avatar_connection/proc/on_safe_disconnect(datum/source) + SIGNAL_HANDLER + + full_avatar_disconnect() + +/// Helper for calling sever with forced variables +/datum/component/avatar_connection/proc/on_sever_connection(datum/source) + SIGNAL_HANDLER + + full_avatar_disconnect(forced = TRUE, source = source) + +/// Triggers when the server is shutting down +/datum/component/avatar_connection/proc/on_shutting_down(datum/source, mob/living/hackerman) + SIGNAL_HANDLER + + var/mob/living/avatar = parent + avatar.playsound_local(avatar, 'sound/machines/terminal_alert.ogg', 50, TRUE) + avatar.throw_alert( + ALERT_BITRUNNER_SHUTDOWN, + /atom/movable/screen/alert/bitrunning/qserver_shutting_down, + new_master = hackerman, + ) + +/// Server has spawned a ghost role threat +/datum/component/avatar_connection/proc/on_threat_created(datum/source) + SIGNAL_HANDLER + + var/mob/living/avatar = parent + avatar.throw_alert( + ALERT_BITRUNNER_THREAT, + /atom/movable/screen/alert/bitrunning/qserver_threat_spawned, + new_master = source, + ) + +/// Returns the mind to the old body +/datum/component/avatar_connection/proc/return_to_old_body() + var/datum/mind/old_mind = old_mind_ref?.resolve() + var/mob/living/old_body = old_body_ref?.resolve() + var/mob/living/avatar = parent + + var/mob/dead/observer/ghost = avatar.ghostize() + if(isnull(ghost)) + ghost = avatar.get_ghost() + + if(isnull(ghost)) + CRASH("[src] belonging to [parent] was completely unable to find a ghost to put back into a body!") + + if(isnull(old_mind) || isnull(old_body)) + return + + ghost.mind = old_mind + if(old_body.stat != DEAD) + old_mind.transfer_to(old_body, force_key_move = TRUE) + else + old_mind.set_current(old_body) + + REMOVE_TRAIT(old_body, TRAIT_MIND_TEMPORARILY_GONE, REF(src)) diff --git a/code/modules/bitrunning/components/bitrunning_points.dm b/code/modules/bitrunning/components/bitrunning_points.dm new file mode 100644 index 0000000000000..58dda4a68ff6e --- /dev/null +++ b/code/modules/bitrunning/components/bitrunning_points.dm @@ -0,0 +1,46 @@ +/// Attaches a component which listens for a given signal from the item. +/// +/// When the signal is received, it will add points to the signaler. +/datum/component/bitrunning_points + /// The range at which we can find the signaler + var/max_point_range + /// Weakref to the loot crate landmark - where we send points + var/datum/weakref/our_spawner + /// The amount of points per each signal + var/points_per_signal + /// The signal we listen for + var/signal_type + +/datum/component/bitrunning_points/Initialize(signal_type, points_per_signal = 1, max_point_range = 4) + src.max_point_range = max_point_range + src.points_per_signal = points_per_signal + src.signal_type = signal_type + + locate_spawner() + +/datum/component/bitrunning_points/RegisterWithParent() + RegisterSignal(parent, signal_type, PROC_REF(on_event)) + +/datum/component/bitrunning_points/UnregisterFromParent() + UnregisterSignal(parent, signal_type) + +/// Finds the signaler if it hasn't been found yet. +/datum/component/bitrunning_points/proc/locate_spawner() + var/obj/effect/landmark/bitrunning/loot_signal/spawner = our_spawner?.resolve() + if(spawner) + return spawner + + for(var/obj/effect/landmark/bitrunning/loot_signal/found in GLOB.landmarks_list) + if(IN_GIVEN_RANGE(get_turf(parent), found, max_point_range)) + our_spawner = WEAKREF(found) + return found + +/// Once the specified signal is received, whisper to the spawner to add points. +/datum/component/bitrunning_points/proc/on_event(datum/source) + SIGNAL_HANDLER + + var/obj/effect/landmark/bitrunning/loot_signal/spawner = locate_spawner() + if(isnull(spawner)) + return + + SEND_SIGNAL(spawner, COMSIG_BITRUNNER_GOAL_POINT, points_per_signal) diff --git a/code/modules/bitrunning/components/netpod_healing.dm b/code/modules/bitrunning/components/netpod_healing.dm new file mode 100644 index 0000000000000..d5fae56123601 --- /dev/null +++ b/code/modules/bitrunning/components/netpod_healing.dm @@ -0,0 +1,74 @@ +/datum/component/netpod_healing + /// Brute damage to heal over a second + var/brute_heal = 0 + /// Burn damage to heal over a second + var/burn_heal = 0 + /// Toxin damage to heal over a second + var/toxin_heal = 0 + /// Amount of cloning damage to heal over a second + var/clone_heal = 0 + /// Amount of blood to heal over a second + var/blood_heal = 0 + +/datum/component/netpod_healing/Initialize( + brute_heal = 0, + burn_heal = 0, + toxin_heal = 0, + clone_heal = 0, + blood_heal = 0, +) + var/mob/living/carbon/player = parent + if (!iscarbon(player)) + return COMPONENT_INCOMPATIBLE + + player.apply_status_effect(/datum/status_effect/embryonic, STASIS_NETPOD_EFFECT) + + START_PROCESSING(SSmachines, src) + + src.brute_heal = brute_heal + src.burn_heal = burn_heal + src.toxin_heal = toxin_heal + src.clone_heal = clone_heal + src.blood_heal = blood_heal + +/datum/component/netpod_healing/Destroy(force, silent) + STOP_PROCESSING(SSmachines, src) + + var/mob/living/carbon/player = parent + player.remove_status_effect(/datum/status_effect/embryonic) + + return ..() + +/datum/component/netpod_healing/process(seconds_per_tick) + var/mob/living/carbon/owner = parent + if(isnull(owner)) + qdel(src) + return + + var/need_mob_update = FALSE + need_mob_update += owner.adjustBruteLoss(-brute_heal * seconds_per_tick, updating_health = FALSE) + need_mob_update += owner.adjustFireLoss(-burn_heal * seconds_per_tick, updating_health = FALSE) + need_mob_update += owner.adjustToxLoss(-toxin_heal * seconds_per_tick, updating_health = FALSE, forced = TRUE) + need_mob_update += owner.adjustCloneLoss(-clone_heal * seconds_per_tick, updating_health = FALSE) + + if(owner.blood_volume < BLOOD_VOLUME_NORMAL) + owner.blood_volume += blood_heal * seconds_per_tick + + if(need_mob_update) + owner.updatehealth() + +/datum/status_effect/embryonic + id = "embryonic" + alert_type = /atom/movable/screen/alert/status_effect/embryonic + +/datum/status_effect/embryonic/on_apply() + ADD_TRAIT(owner, TRAIT_STASIS, TRAIT_STATUS_EFFECT(id)) + return TRUE + +/datum/status_effect/embryonic/on_remove() + REMOVE_TRAIT(owner, TRAIT_STASIS, TRAIT_STATUS_EFFECT(id)) + +/atom/movable/screen/alert/status_effect/embryonic + name = "Embryonic Stasis" + icon_state = "netpod_stasis" + desc = "You feel like you're in a dream." diff --git a/code/modules/bitrunning/event.dm b/code/modules/bitrunning/event.dm new file mode 100644 index 0000000000000..6a4d54adcd8d2 --- /dev/null +++ b/code/modules/bitrunning/event.dm @@ -0,0 +1,151 @@ +/datum/round_event_control/bitrunning_glitch + name = "Spawn Bitrunning Glitch" + admin_setup = list( + /datum/event_admin_setup/minimum_candidate_requirement/bitrunning_glitch, + /datum/event_admin_setup/listed_options/bitrunning_glitch, + ) + category = EVENT_CATEGORY_INVASION + description = "Causes a short term antagonist to spawn in the virtual domain." + dynamic_should_hijack = FALSE + max_occurrences = 5 + min_players = 1 + typepath = /datum/round_event/ghost_role/bitrunning_glitch + weight = 10 + /// List of active servers to choose from + var/list/obj/machinery/quantum_server/active_servers = list() + /// List of possible antags to spawn + var/static/list/possible_antags = list( + ROLE_CYBER_POLICE, + ) + +/datum/round_event_control/bitrunning_glitch/can_spawn_event(players_amt, allow_magic = FALSE) + . = ..() + if(!.) + return . + + active_servers.Cut() + + get_active_servers() + + if(length(active_servers)) + return TRUE + +/// All servers currently running, has players in it, and map has valid mobs +/datum/round_event_control/bitrunning_glitch/proc/get_active_servers() + for(var/obj/machinery/quantum_server/server in SSmachines.get_machines_by_type(/obj/machinery/quantum_server)) + if(length(server.get_valid_domain_targets())) + active_servers.Add(server) + + return length(active_servers) > 0 + +/datum/event_admin_setup/listed_options/bitrunning_glitch + input_text = "Select a role to spawn." + +/datum/event_admin_setup/listed_options/bitrunning_glitch/get_list() + var/datum/round_event_control/bitrunning_glitch/control = event_control + + var/list/possible = control.possible_antags.Copy() // this seems pedantic but byond is complaining control was unused + + possible += list("Random") + + return possible + +/datum/event_admin_setup/listed_options/bitrunning_glitch/apply_to_event(datum/round_event/ghost_role/bitrunning_glitch/event) + if(chosen == "Random") + event.forced_role = null + else + event.forced_role = chosen + +/datum/event_admin_setup/minimum_candidate_requirement/bitrunning_glitch + output_text = "There must be valid mobs to mutate or players in the domain!" + +/datum/event_admin_setup/minimum_candidate_requirement/bitrunning_glitch/count_candidates() + var/datum/round_event_control/bitrunning_glitch/cyber_control = event_control + cyber_control.get_active_servers() + + var/total = 0 + for(var/obj/machinery/quantum_server/server in cyber_control.active_servers) + total += length(server.mutation_candidate_refs) + + return total + +/datum/round_event/ghost_role/bitrunning_glitch + minimum_required = 1 + role_name = "Bitrunning Glitch" + fakeable = FALSE + /// Admin customization: What to spawn + var/forced_role + +/datum/round_event/ghost_role/bitrunning_glitch/spawn_role() + var/datum/round_event_control/bitrunning_glitch/cyber_control = control + + var/obj/machinery/quantum_server/unlucky_server = pick(cyber_control.active_servers) + cyber_control.active_servers.Cut() + + var/list/mutation_candidates = unlucky_server.get_valid_domain_targets() + if(!length(mutation_candidates)) + return MAP_ERROR + + var/chosen = pick(mutation_candidates) + if(isnull(chosen) || !length(mutation_candidates)) + return MAP_ERROR + + var/datum/weakref/target_ref = pick(mutation_candidates) + var/mob/living/mutation_target = target_ref.resolve() + + if(isnull(mutation_target)) // just in case since it takes a minute + target_ref = pick(mutation_candidates) + mutation_target = target_ref.resolve() + if(isnull(mutation_target)) + return MAP_ERROR + + var/chosen_role = forced_role || pick(cyber_control.possible_antags) + + var/datum/mind/ghost_mind = get_ghost_mind(chosen_role) + if(isnull(ghost_mind)) + return NOT_ENOUGH_PLAYERS + + var/mob/living/antag_mob + switch(chosen_role) + if(ROLE_CYBER_POLICE) + antag_mob = spawn_cybercop(mutation_target, ghost_mind) + + playsound(antag_mob, 'sound/magic/ethereal_exit.ogg', 50, TRUE, -1) + message_admins("[ADMIN_LOOKUPFLW(antag_mob)] has been made into virtual antagonist by an event.") + antag_mob.log_message("was spawned as a virtual antagonist by an event.", LOG_GAME) + + SEND_SIGNAL(unlucky_server, COMSIG_BITRUNNER_SPAWN_GLITCH, antag_mob) + + spawned_mobs += antag_mob + + return SUCCESSFUL_SPAWN + +/// Polls for a ghost that wants to run it +/datum/round_event/ghost_role/bitrunning_glitch/proc/get_ghost_mind(role_name) + var/list/mob/dead/observer/ghosties = poll_ghost_candidates("A short term antagonist role is available. Would you like to spawn as a '[role_name]'?", role_name) + + if(!length(ghosties)) + return + + shuffle_inplace(ghosties) + + var/mob/dead/selected = pick(ghosties) + + var/datum/mind/player_mind = new /datum/mind(selected.key) + player_mind.active = TRUE + + return player_mind + +/// Spawns a cybercop on the mutation target +/datum/round_event/ghost_role/bitrunning_glitch/proc/spawn_cybercop(mob/living/mutation_target, datum/mind/player_mind) + var/mob/living/carbon/human/new_agent = new(mutation_target.loc) + mutation_target.gib(DROP_ALL_REMAINS) + mutation_target = null + + player_mind.transfer_to(new_agent) + player_mind.set_assigned_role(SSjob.GetJobType(/datum/job/cyber_police)) + player_mind.special_role = ROLE_CYBER_POLICE + player_mind.add_antag_datum(/datum/antagonist/cyber_police) + + return new_agent + diff --git a/code/modules/bitrunning/job.dm b/code/modules/bitrunning/job.dm new file mode 100644 index 0000000000000..57581753c0fb6 --- /dev/null +++ b/code/modules/bitrunning/job.dm @@ -0,0 +1,41 @@ +/datum/job/bitrunner + title = JOB_BITRUNNER + description = "Surf the virtual domain for gear and loot. Decrypt your rewards on station." + department_head = list(JOB_QUARTERMASTER) + faction = FACTION_STATION + total_positions = 3 + spawn_positions = 3 + supervisors = SUPERVISOR_QM + exp_granted_type = EXP_TYPE_CREW + config_tag = "BITRUNNER" + outfit = /datum/outfit/job/bitrunner + plasmaman_outfit = /datum/outfit/plasmaman/bitrunner + paycheck = PAYCHECK_CREW + paycheck_department = ACCOUNT_CAR + display_order = JOB_DISPLAY_ORDER_BITRUNNER + bounty_types = CIV_JOB_RANDOM + departments_list = list( + /datum/job_department/cargo, + ) + + family_heirlooms = list(/obj/item/reagent_containers/cup/soda_cans/space_mountain_wind) + + mail_goodies = list( + /obj/item/food/cornchips = 1, + /obj/item/reagent_containers/cup/soda_cans/space_mountain_wind = 1, + /obj/item/food/cornchips/green = 1, + /obj/item/food/cornchips/red = 1, + /obj/item/food/cornchips/purple = 1, + /obj/item/food/cornchips/blue = 1, + ) + rpg_title = "Recluse" + 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/bitrunner + name = "Bitrunner" + jobtype = /datum/job/bitrunner + + id_trim = /datum/id_trim/job/bitrunner + uniform = /obj/item/clothing/under/rank/cargo/bitrunner + belt = /obj/item/modular_computer/pda/bitrunner + ears = /obj/item/radio/headset/headset_cargo diff --git a/code/modules/bitrunning/objects/bit_vendor.dm b/code/modules/bitrunning/objects/bit_vendor.dm new file mode 100644 index 0000000000000..abd63a9e78430 --- /dev/null +++ b/code/modules/bitrunning/objects/bit_vendor.dm @@ -0,0 +1,86 @@ +#define CREDIT_TYPE_BITRUNNING "np" + +/obj/machinery/computer/order_console/bitrunning + name = "bitrunning supplies order console" + desc = "NexaCache(tm)! Dubiously authentic gear for the digital daredevil." + icon = 'icons/obj/machines/bitrunning.dmi' + icon_state = "vendor" + icon_keyboard = null + icon_screen = null + circuit = /obj/item/circuitboard/computer/order_console/bitrunning + cooldown_time = 10 SECONDS + cargo_cost_multiplier = 0.65 + express_cost_multiplier = 1 + purchase_tooltip = @{"Your purchases will arrive at cargo, + and hopefully get delivered by them. + 35% cheaper than express delivery."} + express_tooltip = @{"Sends your purchases instantly."} + credit_type = CREDIT_TYPE_BITRUNNING + + order_categories = list( + CATEGORY_BITRUNNING_FLAIR, + CATEGORY_BITRUNNING_TECH, + CATEGORY_BEPIS, + ) + blackbox_key = "bitrunning" + +/obj/machinery/computer/order_console/bitrunning/subtract_points(final_cost, obj/item/card/id/card) + if(final_cost <= card.registered_account.bitrunning_points) + card.registered_account.bitrunning_points -= final_cost + return TRUE + return FALSE + +/obj/machinery/computer/order_console/bitrunning/order_groceries(mob/living/purchaser, obj/item/card/id/card, list/groceries) + var/list/things_to_order = list() + for(var/datum/orderable_item/item as anything in groceries) + things_to_order[item.item_path] = groceries[item] + + var/datum/supply_pack/bitrunning/pack = new( + purchaser = purchaser, \ + cost = get_total_cost(), \ + contains = things_to_order, + ) + + var/datum/supply_order/new_order = new( + pack = pack, + orderer = purchaser, + orderer_rank = "Bitrunning Vendor", + orderer_ckey = purchaser.ckey, + reason = "", + paying_account = card.registered_account, + department_destination = null, + coupon = null, + charge_on_purchase = FALSE, + manifest_can_fail = FALSE, + cost_type = credit_type, + can_be_cancelled = FALSE, + ) + say("Thank you for your purchase! It will arrive on the next cargo shuttle!") + radio.talk_into(src, "A bitrunner has ordered equipment which will arrive on the cargo shuttle! Please make sure it gets to them as soon as possible!", radio_channel) + SSshuttle.shopping_list += new_order + +/obj/machinery/computer/order_console/bitrunning/retrieve_points(obj/item/card/id/id_card) + return round(id_card.registered_account.bitrunning_points) + +/obj/machinery/computer/order_console/bitrunning/ui_act(action, params) + . = ..() + if(!.) + flick("vendor_off", src) + +/obj/machinery/computer/order_console/bitrunning/update_icon_state() + icon_state = "[initial(icon_state)][powered() ? null : "_off"]" + return ..() + +/datum/supply_pack/bitrunning + name = "bitrunning order" + hidden = TRUE + crate_name = "bitrunning delivery crate" + access = list(ACCESS_BIT_DEN) + +/datum/supply_pack/bitrunning/New(purchaser, cost, list/contains) + . = ..() + name = "[purchaser]'s Bitrunning Order" + src.cost = cost + src.contains = contains + +#undef CREDIT_TYPE_BITRUNNING diff --git a/code/modules/bitrunning/objects/clothing.dm b/code/modules/bitrunning/objects/clothing.dm new file mode 100644 index 0000000000000..4d2d9cc55c42c --- /dev/null +++ b/code/modules/bitrunning/objects/clothing.dm @@ -0,0 +1,9 @@ +/obj/item/clothing/glasses/sunglasses/oval + name = "oval sunglasses" + desc = "Vintage wrap around sunglasses. Provides a little protection." + icon_state = "jensenshades" + +/obj/item/clothing/suit/jacket/trenchcoat + name = "trenchcoat" + desc = "A long, black trenchcoat. Makes you feel like you're the one, but you're not." + icon_state = "trenchcoat" diff --git a/code/modules/bitrunning/objects/disks.dm b/code/modules/bitrunning/objects/disks.dm new file mode 100644 index 0000000000000..4698b7a1ec187 --- /dev/null +++ b/code/modules/bitrunning/objects/disks.dm @@ -0,0 +1,146 @@ +/** + * Bitrunning tech disks which let you load items or programs into the vdom on first avatar generation. + * For the record: Balance shouldn't be a primary concern. + * You can make the custom cheese spells you've always wanted. + * Just make it fun and engaging, it's PvE content. + */ +/obj/item/bitrunning_disk + name = "generic bitrunning program" + desc = "A disk containing source code." + icon = 'icons/obj/assemblies/module.dmi' + base_icon_state = "datadisk" + icon_state = "datadisk0" + /// Name of the choice made + var/choice_made + +/obj/item/bitrunning_disk/Initialize(mapload) + . = ..() + + icon_state = "[base_icon_state][rand(0, 7)]" + update_icon() + RegisterSignal(src, COMSIG_ATOM_EXAMINE, PROC_REF(on_examined)) + +/obj/item/bitrunning_disk/proc/on_examined(datum/source, mob/examiner, list/examine_text) + SIGNAL_HANDLER + + examine_text += span_infoplain("This disk must be carried on your person into a netpod to be used.") + + if(isnull(choice_made)) + examine_text += span_notice("To make a selection, toggle the disk in hand.") + return + + examine_text += span_info("It has been used to select: [choice_made].") + examine_text += span_notice("It cannot make another selection.") + +/obj/item/bitrunning_disk/ability + desc = "A disk containing source code. It can be used to preload abilities into the virtual domain." + /// The selected ability that this grants + var/datum/action/granted_action + /// The list of actions that this can grant + var/list/datum/action/selectable_actions = list() + +/obj/item/bitrunning_disk/ability/attack_self(mob/user, modifiers) + . = ..() + + if(choice_made) + return + + var/names = list() + for(var/datum/action/thing as anything in selectable_actions) + names += initial(thing.name) + + var/choice = tgui_input_list(user, message = "Select an ability", title = "Bitrunning Program", items = names) + if(isnull(choice)) + return + + for(var/datum/action/thing as anything in selectable_actions) + if(initial(thing.name) == choice) + granted_action = thing + + if(isnull(granted_action)) + return + + balloon_alert(user, "selected") + playsound(user, 'sound/items/click.ogg', 50, TRUE) + choice_made = choice + +/// Tier 1 programs. Simple, funny, or helpful. +/obj/item/bitrunning_disk/ability/tier1 + name = "bitrunning program: basic" + selectable_actions = list( + /datum/action/cooldown/spell/conjure/cheese, + /datum/action/cooldown/spell/basic_heal, + ) + +/// Tier 2 programs. More complex, powerful, or useful. +/obj/item/bitrunning_disk/ability/tier2 + name = "bitrunning program: complex" + selectable_actions = list( + /datum/action/cooldown/spell/pointed/projectile/fireball, + /datum/action/cooldown/spell/pointed/projectile/lightningbolt, + /datum/action/cooldown/spell/forcewall, + ) + +/// Tier 3 abilities. Very powerful, game breaking. +/obj/item/bitrunning_disk/ability/tier3 + name = "bitrunning program: elite" + selectable_actions = list( + /datum/action/cooldown/spell/shapeshift/dragon, + /datum/action/cooldown/spell/shapeshift/polar_bear, + ) + +/obj/item/bitrunning_disk/item + desc = "A disk containing source code. It can be used to preload items into the virtual domain." + /// The selected item that this grants + var/obj/granted_item + /// The list of actions that this can grant + var/list/obj/selectable_items = list() + +/obj/item/bitrunning_disk/item/attack_self(mob/user, modifiers) + . = ..() + + if(choice_made) + return + + var/names = list() + for(var/obj/thing as anything in selectable_items) + names += initial(thing.name) + + var/choice = tgui_input_list(user, message = "Select an ability", title = "Bitrunning Program", items = names) + if(isnull(choice)) + return + + for(var/obj/thing as anything in selectable_items) + if(initial(thing.name) == choice) + granted_item = thing + + balloon_alert(user, "selected") + playsound(user, 'sound/items/click.ogg', 50, TRUE) + choice_made = choice + +/// Tier 1 items. Simple, funny, or helpful. +/obj/item/bitrunning_disk/item/tier1 + name = "bitrunning gear: simple" + selectable_items = list( + /obj/item/pizzabox/infinite, + /obj/item/gun/medbeam, + /obj/item/grenade/c4, + ) + +/// Tier 2 items. More complex, powerful, or useful. +/obj/item/bitrunning_disk/item/tier2 + name = "bitrunning gear: complex" + selectable_items = list( + /obj/item/chainsaw, + /obj/item/gun/ballistic/automatic/pistol, + /obj/item/melee/energy/blade/hardlight, + ) + +/// Tier 3 items. Very powerful, game breaking. +/obj/item/bitrunning_disk/item/tier3 + name = "bitrunning gear: advanced" + selectable_items = list( + /obj/item/gun/energy/tesla_cannon, + /obj/item/dualsaber/green, + /obj/item/melee/beesword, + ) diff --git a/code/modules/bitrunning/objects/hololadder.dm b/code/modules/bitrunning/objects/hololadder.dm new file mode 100644 index 0000000000000..906801f1fc021 --- /dev/null +++ b/code/modules/bitrunning/objects/hololadder.dm @@ -0,0 +1,51 @@ +/obj/structure/hololadder + name = "hololadder" + + anchored = TRUE + desc = "An abstract representation of the means to disconnect from the virtual domain." + icon = 'icons/obj/structures.dmi' + icon_state = "ladder11" + obj_flags = BLOCK_Z_OUT_DOWN + /// Time req to disconnect properly + var/travel_time = 3 SECONDS + +/obj/structure/hololadder/Initialize(mapload) + . = ..() + + RegisterSignal(loc, COMSIG_ATOM_ENTERED, PROC_REF(on_enter)) + +/obj/structure/hololadder/attack_hand(mob/user, list/modifiers) + . = ..() + if(.) + return + + if(!in_range(src, user) || DOING_INTERACTION(user, DOAFTER_SOURCE_CLIMBING_LADDER)) + return + + disconnect(user) + +/// If there's a pilot ref- send the disconnect signal +/obj/structure/hololadder/proc/disconnect(mob/user) + if(isnull(user.mind)) + return + + if(!HAS_TRAIT(user, TRAIT_TEMPORARY_BODY)) + balloon_alert(user, "no connection detected.") + return + + balloon_alert(user, "disconnecting...") + if(do_after(user, travel_time, src)) + SEND_SIGNAL(user, COMSIG_BITRUNNER_SAFE_DISCONNECT) + +/// Helper for times when you dont have hands (gondola??) +/obj/structure/hololadder/proc/on_enter(datum/source, atom/movable/arrived, turf/old_loc) + SIGNAL_HANDLER + + if(!isliving(arrived)) + return + + var/mob/living/user = arrived + if(isnull(user.mind)) + return + + INVOKE_ASYNC(src, PROC_REF(disconnect), user) diff --git a/code/modules/bitrunning/objects/host_monitor.dm b/code/modules/bitrunning/objects/host_monitor.dm new file mode 100644 index 0000000000000..f59ca61cbd080 --- /dev/null +++ b/code/modules/bitrunning/objects/host_monitor.dm @@ -0,0 +1,33 @@ +/obj/item/bitrunning_host_monitor + name = "host monitor" + + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 2) + desc = "A complex medical device that, when attached to an avatar's data stream, can detect the user of their host's health." + flags_1 = CONDUCT_1 + icon = 'icons/obj/device.dmi' + icon_state = "gps-b" + inhand_icon_state = "electronic" + item_flags = NOBLUDGEON + lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' + slot_flags = ITEM_SLOT_BELT + throw_range = 7 + throw_speed = 3 + throwforce = 3 + w_class = WEIGHT_CLASS_TINY + worn_icon_state = "electronic" + +/obj/item/bitrunning_host_monitor/attack_self(mob/user, modifiers) + . = ..() + + var/datum/component/avatar_connection/connection = user.GetComponent(/datum/component/avatar_connection) + if(isnull(connection)) + balloon_alert(user, "data not recognized") + return + + var/mob/living/pilot = connection.old_body_ref?.resolve() + if(isnull(pilot)) + balloon_alert(user, "host not recognized") + return + + to_chat(user, span_notice("Current host health: [pilot.health / pilot.maxHealth * 100]%")) diff --git a/code/modules/bitrunning/objects/landmarks.dm b/code/modules/bitrunning/objects/landmarks.dm new file mode 100644 index 0000000000000..d78283c6a8b23 --- /dev/null +++ b/code/modules/bitrunning/objects/landmarks.dm @@ -0,0 +1,70 @@ +/obj/effect/landmark/bitrunning + name = "Generic bitrunning effect" + icon = 'icons/effects/bitrunning.dmi' + icon_state = "crate" + +/// In case you want to gate the crate behind a special condition. +/obj/effect/landmark/bitrunning/loot_signal + name = "Mysterious aura" + /// The amount required to spawn a crate + var/points_goal = 10 + /// A special condition limits this from spawning a crate + var/points_received = 0 + /// Finished the special condition + var/revealed = FALSE + +/obj/effect/landmark/bitrunning/loot_signal/Initialize(mapload) + . = ..() + + RegisterSignal(src, COMSIG_BITRUNNER_GOAL_POINT, PROC_REF(on_add_point)) + +/// Listens for points to be added which will eventually spawn a crate. +/obj/effect/landmark/bitrunning/loot_signal/proc/on_add_point(datum/source, points_to_add) + SIGNAL_HANDLER + + if(revealed) + return + + points_received += points_to_add + + if(points_received < points_goal) + return + + reveal() + +/// Spawns the crate with some effects +/obj/effect/landmark/bitrunning/loot_signal/proc/reveal() + playsound(src, 'sound/magic/blink.ogg', 50, TRUE) + + var/turf/tile = get_turf(src) + var/obj/structure/closet/crate/secure/bitrunning/encrypted/loot = new(tile) + var/datum/effect_system/spark_spread/quantum/sparks = new(tile) + sparks.set_up(5, 1, get_turf(loot)) + sparks.start() + + qdel(src) + +/// Where the crates get ported to station +/obj/effect/landmark/bitrunning/station_reward_spawn + name = "Bitrunning rewards spawn" + icon_state = "station" + +/// Where the exit hololadder spawns +/obj/effect/landmark/bitrunning/hololadder_spawn + name = "Bitrunning hololadder spawn" + icon_state = "hololadder" + +/// Where the crates need to be taken +/obj/effect/landmark/bitrunning/cache_goal_turf + name = "Bitrunning goal turf" + icon_state = "goal" + +/// Where you want the crate to spawn +/obj/effect/landmark/bitrunning/cache_spawn + name = "Bitrunning crate spawn" + icon_state = "spawn" + +/// Where the safehouse will spawn +/obj/effect/landmark/bitrunning/safehouse_spawn + name = "Bitrunning safehouse spawn" + icon_state = "safehouse" diff --git a/code/modules/bitrunning/objects/loot_crate.dm b/code/modules/bitrunning/objects/loot_crate.dm new file mode 100644 index 0000000000000..5af8c0d94774e --- /dev/null +++ b/code/modules/bitrunning/objects/loot_crate.dm @@ -0,0 +1,91 @@ +#define ORE_MULTIPLIER_IRON 3 +#define ORE_MULTIPLIER_GLASS 2 +#define ORE_MULTIPLIER_PLASMA 1 +#define ORE_MULTIPLIER_SILVER 0.7 +#define ORE_MULTIPLIER_GOLD 0.6 +#define ORE_MULTIPLIER_TITANIUM 0.5 +#define ORE_MULTIPLIER_URANIUM 0.4 +#define ORE_MULTIPLIER_DIAMOND 0.3 +#define ORE_MULTIPLIER_BLUESPACE_CRYSTAL 0.2 + +/obj/structure/closet/crate/secure/bitrunning // Base class. Do not spawn this. + name = "base class cache" + desc = "Talk to a coder." + +/// The virtual domain - side of the bitrunning crate. Deliver to the send location. +/obj/structure/closet/crate/secure/bitrunning/encrypted + name = "encrypted cache" + desc = "Needs decrypted at the safehouse to be opened." + locked = TRUE + +/obj/structure/closet/crate/secure/bitrunning/encrypted/can_unlock(mob/living/user, obj/item/card/id/player_id, obj/item/card/id/registered_id) + return FALSE + +/// The bitrunner den - side of the bitrunning crate. Appears in the receive location. +/obj/structure/closet/crate/secure/bitrunning/decrypted + name = "decrypted cache" + desc = "Compiled from the virtual domain. The reward of a successful bitrunner." + locked = FALSE + +/obj/structure/closet/crate/secure/bitrunning/decrypted/Initialize( + mapload, + datum/lazy_template/virtual_domain/completed_domain, + rewards_multiplier = 1, + ) + . = ..() + playsound(src, 'sound/magic/blink.ogg', 50, TRUE) + + if(isnull(completed_domain)) + return + + PopulateContents(completed_domain.reward_points, completed_domain.extra_loot, rewards_multiplier) + +/obj/structure/closet/crate/secure/bitrunning/decrypted/PopulateContents(reward_points, list/extra_loot, rewards_multiplier) + . = ..() + spawn_loot(extra_loot) + + new /obj/item/stack/ore/iron(src, calculate_loot(reward_points, rewards_multiplier, ORE_MULTIPLIER_IRON)) + new /obj/item/stack/ore/glass(src, calculate_loot(reward_points, rewards_multiplier, ORE_MULTIPLIER_GLASS)) + + if(reward_points > 1) + new /obj/item/stack/ore/silver(src, calculate_loot(reward_points, rewards_multiplier, ORE_MULTIPLIER_SILVER)) + new /obj/item/stack/ore/titanium(src, calculate_loot(reward_points, rewards_multiplier, ORE_MULTIPLIER_TITANIUM)) + + if(reward_points > 2) + new /obj/item/stack/ore/plasma(src, calculate_loot(reward_points, rewards_multiplier, ORE_MULTIPLIER_PLASMA)) + new /obj/item/stack/ore/gold(src, calculate_loot(reward_points, rewards_multiplier, ORE_MULTIPLIER_GOLD)) + new /obj/item/stack/ore/uranium(src, calculate_loot(reward_points, rewards_multiplier, ORE_MULTIPLIER_URANIUM)) + + if(reward_points > 3) + new /obj/item/stack/ore/diamond(src, calculate_loot(reward_points, rewards_multiplier, ORE_MULTIPLIER_DIAMOND)) + new /obj/item/stack/ore/bluespace_crystal(src, calculate_loot(reward_points, rewards_multiplier, ORE_MULTIPLIER_BLUESPACE_CRYSTAL)) + +/// Handles generating random numbers & calculating loot totals +/obj/structure/closet/crate/secure/bitrunning/decrypted/proc/calculate_loot(reward_points, rewards_multiplier, ore_multiplier) + var/base = rewards_multiplier + reward_points + var/random_sum = (rand() + 0.5) * base + return ROUND_UP(random_sum * ore_multiplier) + +/// Handles spawning extra loot. This tries to handle bad flat and assoc lists +/obj/structure/closet/crate/secure/bitrunning/decrypted/proc/spawn_loot(list/extra_loot) + for(var/path in extra_loot) + if(!ispath(path)) + continue + + if(isnull(extra_loot[path])) + return FALSE + + for(var/i in 1 to extra_loot[path]) + new path(src) + + return TRUE + +#undef ORE_MULTIPLIER_IRON +#undef ORE_MULTIPLIER_GLASS +#undef ORE_MULTIPLIER_PLASMA +#undef ORE_MULTIPLIER_SILVER +#undef ORE_MULTIPLIER_GOLD +#undef ORE_MULTIPLIER_TITANIUM +#undef ORE_MULTIPLIER_URANIUM +#undef ORE_MULTIPLIER_DIAMOND +#undef ORE_MULTIPLIER_BLUESPACE_CRYSTAL diff --git a/code/modules/bitrunning/objects/netpod.dm b/code/modules/bitrunning/objects/netpod.dm new file mode 100644 index 0000000000000..349a304f04b78 --- /dev/null +++ b/code/modules/bitrunning/objects/netpod.dm @@ -0,0 +1,479 @@ +#define BASE_DISCONNECT_DAMAGE 40 + +/obj/machinery/netpod + name = "netpod" + + base_icon_state = "netpod" + circuit = /obj/item/circuitboard/machine/netpod + desc = "A link to the netverse. It has an assortment of cables to connect yourself to a virtual domain." + icon = 'icons/obj/machines/bitrunning.dmi' + icon_state = "netpod" + max_integrity = 300 + obj_flags = BLOCKS_CONSTRUCTION + state_open = TRUE + /// Whether we have an ongoing connection + var/connected = FALSE + /// A player selected outfit by clicking the netpod + var/datum/outfit/netsuit = /datum/outfit/job/bitrunner + /// Holds this to see if it needs to generate a new one + var/datum/weakref/avatar_ref + /// The linked quantum server + var/datum/weakref/server_ref + /// The amount of brain damage done from force disconnects + var/disconnect_damage + /// Static list of outfits to select from + var/list/cached_outfits = list() + +/obj/machinery/netpod/Initialize(mapload) + . = ..() + + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/netpod/LateInitialize() + . = ..() + + disconnect_damage = BASE_DISCONNECT_DAMAGE + find_server() + + RegisterSignals(src, list( + COMSIG_QDELETING, + COMSIG_MACHINERY_BROKEN, + COMSIG_MACHINERY_POWER_LOST, + ), + PROC_REF(on_broken), + ) + RegisterSignal(src, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(src, COMSIG_ATOM_TAKE_DAMAGE, PROC_REF(on_take_damage)) + + register_context() + update_appearance() + +/obj/machinery/netpod/Destroy() + . = ..() + cached_outfits.Cut() + +/obj/machinery/netpod/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + + if(isnull(held_item)) + context[SCREENTIP_CONTEXT_LMB] = "Select Outfit" + return CONTEXTUAL_SCREENTIP_SET + + if(istype(held_item, /obj/item/crowbar) && occupant) + context[SCREENTIP_CONTEXT_LMB] = "Pry Open" + return CONTEXTUAL_SCREENTIP_SET + + return CONTEXTUAL_SCREENTIP_SET + +/obj/machinery/netpod/update_icon_state() + if(!is_operational) + icon_state = base_icon_state + return ..() + + if(state_open) + icon_state = base_icon_state + "_open_active" + return ..() + + if(panel_open) + icon_state = base_icon_state + "_panel" + return ..() + + icon_state = base_icon_state + "_closed" + if(occupant) + icon_state += "_active" + + return ..() + +/obj/machinery/netpod/MouseDrop_T(mob/target, mob/user) + var/mob/living/carbon/player = user + if(!iscarbon(player)) + return + + if((HAS_TRAIT(player, TRAIT_UI_BLOCKED) && !player.resting) || !Adjacent(player) || !player.Adjacent(target) || !ISADVANCEDTOOLUSER(player) || !is_operational) + return + + close_machine(target) + +/obj/machinery/netpod/crowbar_act(mob/living/user, obj/item/tool) + if(user.combat_mode) + attack_hand(user) + return TOOL_ACT_TOOLTYPE_SUCCESS + + if(default_pry_open(tool, user) || default_deconstruction_crowbar(tool)) + return TOOL_ACT_TOOLTYPE_SUCCESS + +/obj/machinery/netpod/screwdriver_act(mob/living/user, obj/item/tool) + if(occupant) + balloon_alert(user, "in use!") + return TOOL_ACT_TOOLTYPE_SUCCESS + + if(state_open) + balloon_alert(user, "close first.") + return TOOL_ACT_TOOLTYPE_SUCCESS + + if(default_deconstruction_screwdriver(user, "[base_icon_state]_panel", "[base_icon_state]_closed", tool)) + update_appearance() // sometimes icon doesnt properly update during flick() + ui_close(user) + return TOOL_ACT_TOOLTYPE_SUCCESS + +/obj/machinery/netpod/attack_hand(mob/living/user, list/modifiers) + . = ..() + if(!state_open && user == occupant) + container_resist_act(user) + +/obj/machinery/netpod/Exited(atom/movable/gone, direction) + . = ..() + if(!state_open && gone == occupant) + container_resist_act(gone) + +/obj/machinery/netpod/Exited(atom/movable/gone, direction) + . = ..() + if(!state_open && gone == occupant) + container_resist_act(gone) + +/obj/machinery/netpod/relaymove(mob/living/user, direction) + if(!state_open) + container_resist_act(user) + +/obj/machinery/netpod/container_resist_act(mob/living/user) + user.visible_message(span_notice("[occupant] emerges from [src]!"), + span_notice("You climb out of [src]!"), + span_notice("With a hiss, you hear a machine opening.")) + open_machine() + +/obj/machinery/netpod/open_machine(drop = TRUE, density_to_set = FALSE) + unprotect_and_signal() + playsound(src, 'sound/machines/tramopen.ogg', 60, TRUE, frequency = 65000) + flick("[base_icon_state]_opening", src) + + return ..() + +/obj/machinery/netpod/close_machine(mob/user, density_to_set = TRUE) + if(!state_open || panel_open || !is_operational || !iscarbon(user)) + return + + playsound(src, 'sound/machines/tramclose.ogg', 60, TRUE, frequency = 65000) + flick("[base_icon_state]_closing", src) + ..() + + if(!iscarbon(occupant)) + open_machine() + return + + enter_matrix() + +/obj/machinery/netpod/default_pry_open(obj/item/crowbar, mob/living/pryer) + if(isnull(occupant) || !iscarbon(occupant)) + if(!state_open) + if(panel_open) + return FALSE + open_machine() + else + shut_pod() + + return TRUE + + pryer.visible_message( + span_danger("[pryer] starts prying open [src]!"), + span_notice("You start to pry open [src]."), + span_notice("You hear loud prying on metal.") + ) + playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE) + + SEND_SIGNAL(src, COMSIG_BITRUNNER_CROWBAR_ALERT, pryer) + + if(do_after(pryer, 15 SECONDS, src)) + if(!state_open) + open_machine() + + return TRUE + +/obj/machinery/netpod/ui_interact(mob/user, datum/tgui/ui) + if(!is_operational) + return + + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "NetpodOutfits") + ui.set_autoupdate(FALSE) + ui.open() + +/obj/machinery/netpod/ui_data() + var/list/data = list() + + data["netsuit"] = netsuit + return data + +/obj/machinery/netpod/ui_static_data() + var/list/data = list() + + if(!length(cached_outfits)) + cached_outfits += make_outfit_collection("Jobs", subtypesof(/datum/outfit/job)) + + data["collections"] = cached_outfits + + return data + +/obj/machinery/netpod/ui_act(action, params) + . = ..() + if(.) + return TRUE + switch(action) + if("select_outfit") + var/datum/outfit/new_suit = resolve_outfit(params["outfit"]) + if(new_suit) + netsuit = new_suit + return TRUE + + return FALSE + +/// Disconnects the occupant after a certain time so they aren't just hibernating in netpod stasis. A balance change +/obj/machinery/netpod/proc/auto_disconnect() + if(isnull(occupant) || state_open || connected) + return + + if(!iscarbon(occupant)) + open_machine() + return + + var/mob/living/carbon/player = occupant + + player.playsound_local(src, 'sound/effects/splash.ogg', 60, TRUE) + to_chat(player, span_notice("The machine disconnects itself and begins to drain.")) + open_machine() + +/** + * ### Disconnect occupant + * If this goes smoothly, should reconnect a receiving mind to the occupant's body + * + * This is the second stage of the process - if you want to disconn avatars start at the mind first + */ +/obj/machinery/netpod/proc/disconnect_occupant(forced = FALSE) + var/mob/living/mob_occupant = occupant + if(isnull(occupant) || !isliving(occupant)) + return + + connected = FALSE + + if(mob_occupant.stat == DEAD) + open_machine() + return + + mob_occupant.playsound_local(src, "sound/magic/blink.ogg", 25, TRUE) + mob_occupant.set_static_vision(2 SECONDS) + mob_occupant.set_temp_blindness(1 SECONDS) + mob_occupant.Paralyze(2 SECONDS) + + var/heal_time = 1 + if(mob_occupant.health < mob_occupant.maxHealth) + heal_time = (mob_occupant.stat + 2) * 5 + addtimer(CALLBACK(src, PROC_REF(auto_disconnect)), heal_time SECONDS, TIMER_UNIQUE|TIMER_STOPPABLE|TIMER_DELETE_ME) + + if(!forced) + return + + mob_occupant.flash_act(override_blindness_check = TRUE, visual = TRUE) + mob_occupant.adjustOrganLoss(ORGAN_SLOT_BRAIN, disconnect_damage) + INVOKE_ASYNC(mob_occupant, TYPE_PROC_REF(/mob/living, emote), "scream") + to_chat(mob_occupant, span_danger("You've been forcefully disconnected from your avatar! Your thoughts feel scrambled!")) + +/** + * ### Enter Matrix + * Finds any current avatars from this chair - or generates a new one + * + * New avatars cost 1 attempt, and this will eject if there's none left + * + * Connects the mind to the avatar if everything is ok + */ +/obj/machinery/netpod/proc/enter_matrix() + var/mob/living/carbon/human/neo = occupant + if(!ishuman(neo) || neo.stat == DEAD || isnull(neo.mind)) + balloon_alert(neo, "invalid occupant.") + return + + var/obj/machinery/quantum_server/server = find_server() + if(isnull(server)) + balloon_alert(neo, "no server connected!") + return + + var/datum/lazy_template/virtual_domain/generated_domain = server.generated_domain + if(isnull(generated_domain) || !server.is_ready) + balloon_alert(neo, "nothing loaded!") + return + + var/mob/living/carbon/current_avatar = avatar_ref?.resolve() + var/obj/structure/hololadder/wayout + if(isnull(current_avatar) || current_avatar.stat != CONSCIOUS) // We need a viable avatar + wayout = server.generate_hololadder() + if(isnull(wayout)) + balloon_alert(neo, "out of bandwidth!") + return + current_avatar = server.generate_avatar(wayout, netsuit) + avatar_ref = WEAKREF(current_avatar) + server.stock_gear(current_avatar, neo) + + neo.set_static_vision(3 SECONDS) + protect_occupant(occupant) + if(!do_after(neo, 2 SECONDS, src)) + return + + // Very invalid + if(QDELETED(neo) || QDELETED(current_avatar) || QDELETED(src)) + return + + // Invalid + if(occupant != neo || isnull(neo.mind) || neo.stat == DEAD || current_avatar.stat == DEAD) + return + + current_avatar.AddComponent( \ + /datum/component/avatar_connection, \ + old_mind = neo.mind, \ + old_body = neo, \ + server = server, \ + pod = src, \ + help_text = generated_domain.help_text, \ + ) + + connected = TRUE + +/// Finds a server and sets the server_ref +/obj/machinery/netpod/proc/find_server() + var/obj/machinery/quantum_server/server = server_ref?.resolve() + if(server) + return server + + server = locate(/obj/machinery/quantum_server) in oview(4, src) + if(isnull(server)) + return + + server_ref = WEAKREF(server) + RegisterSignal(server, COMSIG_BITRUNNER_SERVER_UPGRADED, PROC_REF(on_server_upgraded), override = TRUE) + RegisterSignal(server, COMSIG_BITRUNNER_DOMAIN_COMPLETE, PROC_REF(on_domain_complete), override = TRUE) + + return server + +/// Creates a list of outfit entries for the UI. +/obj/machinery/netpod/proc/make_outfit_collection(identifier, list/outfit_list) + var/list/collection = list( + "name" = identifier, + "outfits" = list() + ) + + for(var/path as anything in outfit_list) + var/datum/outfit/outfit = path + + var/outfit_name = initial(outfit.name) + if(findtext(outfit_name, "(") != 0 || findtext(outfit_name, "-") != 0) // No special variants please + continue + + collection["outfits"] += list(list("path" = path, "name" = outfit_name)) + + return list(collection) + +/// Machine has been broken - handles signals and reverting sprites +/obj/machinery/netpod/proc/on_broken(datum/source) + SIGNAL_HANDLER + + if(!state_open) + open_machine() + + if(occupant) + unprotect_and_signal() + +/// Puts points on the current occupant's card account +/obj/machinery/netpod/proc/on_domain_complete(datum/source, atom/movable/crate, reward_points) + SIGNAL_HANDLER + + if(isnull(occupant) || !connected || !iscarbon(occupant)) + return + + var/mob/living/carbon/player = occupant + + var/datum/bank_account/account = player.get_bank_account() + if(isnull(account)) + return + + account.bitrunning_points += reward_points * 100 + +/obj/machinery/netpod/proc/on_examine(datum/source, mob/examiner, list/examine_text) + SIGNAL_HANDLER + + examine_text += span_infoplain("Drag yourself into the pod to engage the link.") + examine_text += span_infoplain("It has limited resuscitation capabilities. Remaining in the pod can heal some injuries.") + examine_text += span_infoplain("It has a security system that will alert the occupant if it is tampered with.") + + if(isnull(occupant)) + examine_text += span_notice("It is currently unoccupied.") + return + + examine_text += span_notice("It is currently occupied by [occupant].") + examine_text += span_notice("It can be pried open with a crowbar, but its safety mechanisms will alert the occupant.") + + + +/// When the server is upgraded, drops brain damage a little +/obj/machinery/netpod/proc/on_server_upgraded(datum/source, servo_rating) + SIGNAL_HANDLER + + disconnect_damage = BASE_DISCONNECT_DAMAGE * (1 - servo_rating) + +/// Checks the integrity, alerts occupants +/obj/machinery/netpod/proc/on_take_damage(datum/source, damage_amount) + SIGNAL_HANDLER + + if(isnull(occupant)) + return + + var/total = max_integrity - damage_amount + var/integrity = (atom_integrity / total) * 100 + if(integrity > 50) + return + + SEND_SIGNAL(src, COMSIG_BITRUNNER_NETPOD_INTEGRITY) + +/// Puts the occupant in netpod stasis, basically short-circuiting environmental conditions +/obj/machinery/netpod/proc/protect_occupant(mob/living/target) + if(target != occupant) + return + + target.AddComponent(/datum/component/netpod_healing, \ + brute_heal = 4, \ + burn_heal = 4, \ + toxin_heal = 4, \ + clone_heal = 4, \ + blood_heal = 4, \ + ) + + target.playsound_local(src, 'sound/effects/submerge.ogg', 20, TRUE) + target.extinguish_mob() + update_use_power(ACTIVE_POWER_USE) + +/// On unbuckle or break, make sure the occupant ref is null +/obj/machinery/netpod/proc/unprotect_and_signal() + unprotect_occupant(occupant) + SEND_SIGNAL(src, COMSIG_BITRUNNER_SEVER_AVATAR) + +/// Removes the occupant from netpod stasis +/obj/machinery/netpod/proc/unprotect_occupant(mob/living/target) + var/datum/component/netpod_healing/healing_eff = target?.GetComponent(/datum/component/netpod_healing) + if(healing_eff) + qdel(healing_eff) + + update_use_power(IDLE_POWER_USE) + +/// Resolves a path to an outfit. +/obj/machinery/netpod/proc/resolve_outfit(text) + var/path = text2path(text) + if(ispath(path, /datum/outfit)) + return path + +/// Closes the machine without shoving in an occupant +/obj/machinery/netpod/proc/shut_pod() + state_open = FALSE + playsound(src, 'sound/machines/tramclose.ogg', 60, TRUE, frequency = 65000) + flick("[base_icon_state]_closing", src) + set_density(TRUE) + + update_appearance() + +#undef BASE_DISCONNECT_DAMAGE diff --git a/code/modules/bitrunning/objects/quantum_console.dm b/code/modules/bitrunning/objects/quantum_console.dm new file mode 100644 index 0000000000000..c918648d010b1 --- /dev/null +++ b/code/modules/bitrunning/objects/quantum_console.dm @@ -0,0 +1,108 @@ +/obj/machinery/computer/quantum_console + name = "quantum console" + + circuit = /obj/item/circuitboard/computer/quantum_console + icon_keyboard = "mining" + icon_screen = "bitrunning" + req_access = list(ACCESS_MINING) + /// The server this console is connected to. + var/datum/weakref/server_ref + +/obj/machinery/computer/quantum_console/Initialize(mapload, obj/item/circuitboard/circuit) + . = ..() + desc = "Even in the distant year [CURRENT_STATION_YEAR], Nanostrasen is still using REST APIs. How grim." + + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/computer/quantum_console/LateInitialize() + . = ..() + + if(isnull(server_ref?.resolve())) + find_server() + +/obj/machinery/computer/quantum_console/ui_interact(mob/user, datum/tgui/ui) + . = ..() + + if(!is_operational) + return + + if(isnull(server_ref?.resolve())) + find_server() + + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "QuantumConsole") + ui.open() + +/obj/machinery/computer/quantum_console/ui_data() + var/list/data = list() + + var/obj/machinery/quantum_server/server = find_server() + if(isnull(server)) + data["connected"] = FALSE + return data + + data["connected"] = TRUE + data["generated_domain"] = server.generated_domain?.key + data["occupants"] = length(server.avatar_connection_refs) + data["points"] = server.points + data["randomized"] = server.domain_randomized + data["ready"] = server.is_ready && server.is_operational + data["scanner_tier"] = server.scanner_tier + data["retries_left"] = length(server.exit_turfs) - server.retries_spent + + return data + +/obj/machinery/computer/quantum_console/ui_static_data(mob/user) + var/list/data = list() + + var/obj/machinery/quantum_server/server = find_server() + if(isnull(server)) + return data + + data["available_domains"] = server.get_available_domains() + data["avatars"] = server.get_avatar_data() + + return data + +/obj/machinery/computer/quantum_console/ui_act(action, list/params, datum/tgui/ui) + . = ..() + if(.) + return TRUE + + var/obj/machinery/quantum_server/server = find_server() + if(isnull(server)) + return FALSE + + switch(action) + if("random_domain") + var/map_id = server.get_random_domain_id() + if(!map_id) + return TRUE + + server.cold_boot_map(usr, map_id) + return TRUE + if("refresh") + ui.send_full_update() + return TRUE + if("set_domain") + server.cold_boot_map(usr, params["id"]) + return TRUE + if("stop_domain") + server.begin_shutdown(usr) + return TRUE + + return FALSE + +/// Attempts to find a quantum server. +/obj/machinery/computer/quantum_console/proc/find_server() + var/obj/machinery/quantum_server/server = server_ref?.resolve() + if(server) + return server + + for(var/direction in GLOB.cardinals) + var/obj/machinery/quantum_server/nearby_server = locate(/obj/machinery/quantum_server, get_step(src, direction)) + if(nearby_server) + server_ref = WEAKREF(nearby_server) + nearby_server.console_ref = WEAKREF(src) + return nearby_server diff --git a/code/modules/bitrunning/orders/disks.dm b/code/modules/bitrunning/orders/disks.dm new file mode 100644 index 0000000000000..ced1dde883a19 --- /dev/null +++ b/code/modules/bitrunning/orders/disks.dm @@ -0,0 +1,26 @@ +/datum/orderable_item/bitrunning_tech + category_index = CATEGORY_BITRUNNING_TECH + +/datum/orderable_item/bitrunning_tech/item_tier1 + cost_per_order = 1000 + item_path = /obj/item/bitrunning_disk/item/tier1 + +/datum/orderable_item/bitrunning_tech/item_tier2 + cost_per_order = 1500 + item_path = /obj/item/bitrunning_disk/item/tier2 + +/datum/orderable_item/bitrunning_tech/item_tier3 + cost_per_order = 2500 + item_path = /obj/item/bitrunning_disk/item/tier3 + +/datum/orderable_item/bitrunning_tech/ability_tier1 + cost_per_order = 1000 + item_path = /obj/item/bitrunning_disk/ability/tier1 + +/datum/orderable_item/bitrunning_tech/ability_tier2 + cost_per_order = 1800 + item_path = /obj/item/bitrunning_disk/ability/tier2 + +/datum/orderable_item/bitrunning_tech/ability_tier3 + cost_per_order = 3200 + item_path = /obj/item/bitrunning_disk/ability/tier3 diff --git a/code/modules/bitrunning/orders/flair.dm b/code/modules/bitrunning/orders/flair.dm new file mode 100644 index 0000000000000..ef36348eb6ae9 --- /dev/null +++ b/code/modules/bitrunning/orders/flair.dm @@ -0,0 +1,40 @@ +/datum/orderable_item/bitrunning_flair + category_index = CATEGORY_BITRUNNING_FLAIR + +/datum/orderable_item/bitrunning_flair/cornchips + item_path = /obj/item/food/cornchips + cost_per_order = 100 + +/datum/orderable_item/bitrunning_flair/mountain_wind + item_path = /obj/item/reagent_containers/cup/soda_cans/space_mountain_wind + cost_per_order = 100 + +/datum/orderable_item/bitrunning_flair/pwr_game + item_path = /obj/item/reagent_containers/cup/soda_cans/pwr_game + cost_per_order = 200 + +/datum/orderable_item/bitrunning_flair/grey_bull + item_path = /obj/item/reagent_containers/cup/soda_cans/grey_bull + cost_per_order = 200 + +/datum/orderable_item/bitrunning_flair/medkit + item_path = /obj/item/storage/medkit/brute + desc = "Don't beat yourself up, it's just a game!" + cost_per_order = 500 + +/datum/orderable_item/bitrunning_flair/medkit_fire + item_path = /obj/item/storage/medkit/fire + desc = "Great after heated gaming sessions." + cost_per_order = 500 + +/datum/orderable_item/bitrunning_flair/oval_sunglasses + item_path = /obj/item/clothing/glasses/sunglasses/oval + cost_per_order = 1000 + +/datum/orderable_item/bitrunning_flair/trenchcoat + item_path = /obj/item/clothing/suit/jacket/trenchcoat + cost_per_order = 1000 + +/datum/orderable_item/bitrunning_flair/jackboots + item_path = /obj/item/clothing/shoes/jackboots + cost_per_order = 1000 diff --git a/code/modules/bitrunning/orders/tech.dm b/code/modules/bitrunning/orders/tech.dm new file mode 100644 index 0000000000000..286e9817f3c52 --- /dev/null +++ b/code/modules/bitrunning/orders/tech.dm @@ -0,0 +1,23 @@ +/datum/orderable_item/bepis + category_index = CATEGORY_BEPIS + +/datum/orderable_item/bepis/circuit_stack + item_path = /obj/item/stack/circuit_stack/full + cost_per_order = 150 + +/datum/orderable_item/bepis/survival_pen + item_path = /obj/item/pen/survival + cost_per_order = 150 + +/datum/orderable_item/bepis/party_sleeper + item_path = /obj/item/circuitboard/machine/sleeper/party + cost_per_order = 750 + desc = "A decommissioned sleeper circuitboard, repurposed for recreational purposes." + +/datum/orderable_item/bepis/sprayoncan + item_path = /obj/item/toy/sprayoncan + cost_per_order = 750 + +/datum/orderable_item/bepis/pristine + item_path = /obj/item/disk/design_disk/bepis/remove_tech + cost_per_order = 1000 diff --git a/code/modules/bitrunning/server/loot.dm b/code/modules/bitrunning/server/loot.dm new file mode 100644 index 0000000000000..29b730aae784f --- /dev/null +++ b/code/modules/bitrunning/server/loot.dm @@ -0,0 +1,123 @@ +/// Handles calculating rewards based on number of players, parts, threats, etc +/obj/machinery/quantum_server/proc/calculate_rewards() + var/rewards_base = 0.8 + + if(domain_randomized) + rewards_base += 0.2 + + rewards_base += servo_bonus + + rewards_base += (domain_threats * 2) + + for(var/index in 2 to length(avatar_connection_refs)) + rewards_base += multiplayer_bonus + + return rewards_base + +/// Generates a reward based on the given domain +/obj/machinery/quantum_server/proc/generate_loot() + if(!length(receive_turfs) && !locate_receive_turfs()) + return FALSE + + points += generated_domain.reward_points + playsound(src, 'sound/machines/terminal_success.ogg', 30, 2) + + var/turf/dest_turf = pick(receive_turfs) + if(isnull(dest_turf)) + stack_trace("Failed to find a turf to spawn loot crate on.") + return FALSE + + var/bonus = calculate_rewards() + + var/obj/item/paper/certificate = new() + certificate.add_raw_text(get_completion_certificate()) + certificate.name = "certificate of domain completion" + certificate.update_appearance() + + var/obj/structure/closet/crate/secure/bitrunning/decrypted/reward_crate = new(dest_turf, generated_domain, bonus) + reward_crate.manifest = certificate + reward_crate.update_appearance() + + spark_at_location(reward_crate) + return TRUE + +/// Returns the markdown text containing domain completion information +/obj/machinery/quantum_server/proc/get_completion_certificate() + var/base_points = generated_domain.reward_points + if(domain_randomized) + base_points -= 1 + + var/bonuses = calculate_rewards() + + var/time_difference = world.time - generated_domain.start_time + + var/completion_time = "### Completion Time: [DisplayTimeText(time_difference)]\n" + + var/grade = "\n---\n\n# Rating: [grade_completion(generated_domain.difficulty, domain_threats, base_points, domain_randomized, time_difference)]" + + var/text = "# Certificate of Domain Completion\n\n---\n\n" + + text += "### [generated_domain.name][domain_randomized ? " (Randomized)" : ""]\n" + text += "- **Difficulty:** [generated_domain.difficulty]\n" + text += "- **Threats:** [domain_threats]\n" + text += "- **Base Points:** [base_points][domain_randomized ? " +1" : ""]\n\n" + text += "- **Total Bonus:** [bonuses]x\n\n" + + if(bonuses <= 1) + text += completion_time + text += grade + return text + + text += "### Bonuses\n" + if(domain_randomized) + text += "- **Randomized:** + 0.2\n" + + if(length(avatar_connection_refs) > 1) + text += "- **Multiplayer:** + [(length(avatar_connection_refs) - 1) * multiplayer_bonus]\n" + + if(domain_threats > 0) + text += "- **Threats:** + [domain_threats * 2]\n" + + var/servo_rating = servo_bonus + + if(servo_rating > 0.2) + text += "- **Components:** + [servo_rating]\n" + + text += completion_time + text += grade + + return text + +/// Grades the player's run based on several factors +/obj/machinery/quantum_server/proc/grade_completion(difficulty, threats, points, randomized, completion_time) + var/score = threats * 5 + score += points + score += randomized ? 1 : 0 + + var/base = difficulty + 1 + var/time_score = 1 + + if(completion_time <= 1 MINUTES) + time_score = 10 + else if(completion_time <= 2 MINUTES) + time_score = 5 + else if(completion_time <= 5 MINUTES) + time_score = 3 + else if(completion_time <= 10 MINUTES) + time_score = 2 + else + time_score = 1 + + score += time_score * base + + switch(score) + if(1 to 4) + return "D" + if(5 to 7) + return "C" + if(8 to 10) + return "B" + if(11 to 13) + return "A" + else + return "S" diff --git a/code/modules/bitrunning/server/map_handling.dm b/code/modules/bitrunning/server/map_handling.dm new file mode 100644 index 0000000000000..02126c290f774 --- /dev/null +++ b/code/modules/bitrunning/server/map_handling.dm @@ -0,0 +1,184 @@ + +/// Gives all current occupants a notification that the server is going down +/obj/machinery/quantum_server/proc/begin_shutdown(mob/user) + if(isnull(generated_domain)) + return + + if(!length(avatar_connection_refs)) + balloon_alert(user, "powering down domain...") + playsound(src, 'sound/machines/terminal_off.ogg', 40, 2) + reset() + return + + balloon_alert(user, "notifying clients...") + playsound(src, 'sound/machines/terminal_alert.ogg', 100, TRUE) + user.visible_message( + span_danger("[user] begins depowering the server!"), + span_notice("You start disconnecting clients..."), + span_danger("You hear frantic keying on a keyboard."), + ) + + SEND_SIGNAL(src, COMSIG_BITRUNNER_SHUTDOWN_ALERT, user) + + if(!do_after(user, 20 SECONDS, src)) + return + + reset() + +/** + * ### Quantum Server Cold Boot + * Procedurally links the 3 booting processes together. + * + * This is the starting point if you have an id. Does validation and feedback on steps + */ +/obj/machinery/quantum_server/proc/cold_boot_map(mob/user, map_key) + if(!is_ready) + return FALSE + + if(isnull(map_key)) + balloon_alert(user, "no domain specified.") + return FALSE + + if(generated_domain) + balloon_alert(user, "stop the current domain first.") + return FALSE + + if(length(avatar_connection_refs)) + balloon_alert(user, "all clients must disconnect!") + return FALSE + + is_ready = FALSE + playsound(src, 'sound/machines/terminal_processing.ogg', 30, 2) + + if(!initialize_domain(map_key) || !initialize_safehouse() || !initialize_map_items()) + balloon_alert(user, "initialization failed.") + scrub_vdom() + is_ready = TRUE + return FALSE + + is_ready = TRUE + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 30, 2) + balloon_alert(user, "domain loaded.") + generated_domain.start_time = world.time + points -= generated_domain.cost + update_use_power(ACTIVE_POWER_USE) + update_appearance() + + return TRUE + +/// Initializes a new domain if the given key is valid and the user has enough points +/obj/machinery/quantum_server/proc/initialize_domain(map_key) + var/datum/lazy_template/virtual_domain/to_load + + for(var/datum/lazy_template/virtual_domain/available as anything in subtypesof(/datum/lazy_template/virtual_domain)) + if(map_key != initial(available.key) || points < initial(available.cost)) + continue + to_load = available + break + + if(isnull(to_load)) + return FALSE + + generated_domain = new to_load() + RegisterSignal(generated_domain, COMSIG_LAZY_TEMPLATE_LOADED, PROC_REF(on_template_loaded)) + generated_domain.lazy_load() + + return TRUE + +/// Loads in necessary map items, sets mutation targets, etc +/obj/machinery/quantum_server/proc/initialize_map_items() + var/turf/goal_turfs = list() + var/turf/crate_turfs = list() + + for(var/thing in GLOB.landmarks_list) + if(istype(thing, /obj/effect/landmark/bitrunning/hololadder_spawn)) + exit_turfs += get_turf(thing) + qdel(thing) // i'm worried about multiple servers getting confused so lets clean em up + continue + + if(istype(thing, /obj/effect/landmark/bitrunning/cache_goal_turf)) + var/turf/tile = get_turf(thing) + goal_turfs += tile + RegisterSignal(tile, COMSIG_ATOM_ENTERED, PROC_REF(on_goal_turf_entered)) + RegisterSignal(tile, COMSIG_ATOM_EXAMINE, PROC_REF(on_goal_turf_examined)) + qdel(thing) + continue + + if(istype(thing, /obj/effect/landmark/bitrunning/cache_spawn)) + crate_turfs += get_turf(thing) + qdel(thing) + continue + + if(!length(exit_turfs)) + CRASH("Failed to find exit turfs on generated domain.") + if(!length(goal_turfs)) + CRASH("Failed to find send turfs on generated domain.") + + if(length(crate_turfs)) + shuffle_inplace(crate_turfs) + new /obj/structure/closet/crate/secure/bitrunning/encrypted(pick(crate_turfs)) + + return TRUE +#define ONLY_TURF 1 // There should only ever be one turf at the bottom left of the map. + +/// Loads the safehouse +/obj/machinery/quantum_server/proc/initialize_safehouse() + var/turf/safehouse_load_turf = list() + for(var/obj/effect/landmark/bitrunning/safehouse_spawn/spawner in GLOB.landmarks_list) + safehouse_load_turf += get_turf(spawner) + qdel(spawner) + break + + if(!length(safehouse_load_turf)) + CRASH("Failed to find safehouse load landmark on map.") + + var/datum/map_template/safehouse/safehouse = new generated_domain.safehouse_path() + safehouse.load(safehouse_load_turf[ONLY_TURF]) + generated_safehouse = safehouse + + return TRUE + +/// Stops the current virtual domain and disconnects all users +/obj/machinery/quantum_server/proc/reset(fast = FALSE) + is_ready = FALSE + + SEND_SIGNAL(src, COMSIG_BITRUNNER_SEVER_AVATAR) + + if(!fast) + notify_spawned_threats() + addtimer(CALLBACK(src, PROC_REF(scrub_vdom)), 15 SECONDS, TIMER_UNIQUE|TIMER_STOPPABLE) + else + scrub_vdom() // used in unit testing, no need to wait for callbacks + + addtimer(CALLBACK(src, PROC_REF(cool_off)), min(server_cooldown_time * capacitor_coefficient), TIMER_UNIQUE|TIMER_STOPPABLE|TIMER_DELETE_ME) + update_appearance() + + update_use_power(IDLE_POWER_USE) + domain_randomized = FALSE + domain_threats = 0 + retries_spent = 0 + +/// Deletes all the tile contents +/obj/machinery/quantum_server/proc/scrub_vdom() + SEND_SIGNAL(src, COMSIG_BITRUNNER_SEVER_AVATAR) // just in case + + if(length(generated_domain.reservations)) + var/datum/turf_reservation/res = generated_domain.reservations[1] + res.Release() + + var/list/datum/weakref/creatures = spawned_threat_refs + mutation_candidate_refs + for(var/datum/weakref/creature_ref as anything in creatures) + var/mob/living/creature = creature_ref?.resolve() + if(isnull(creature)) + continue + + creature.dust() // sometimes mobs just don't die + + avatar_connection_refs.Cut() + exit_turfs = list() + generated_domain = null + generated_safehouse = null + mutation_candidate_refs.Cut() + spawned_threat_refs.Cut() + +#undef ONLY_TURF diff --git a/code/modules/bitrunning/server/obj_generation.dm b/code/modules/bitrunning/server/obj_generation.dm new file mode 100644 index 0000000000000..221308e048783 --- /dev/null +++ b/code/modules/bitrunning/server/obj_generation.dm @@ -0,0 +1,101 @@ +/// Generates a new avatar for the bitrunner. +/obj/machinery/quantum_server/proc/generate_avatar(obj/structure/hololadder/wayout, datum/outfit/netsuit) + var/mob/living/carbon/human/avatar = new(wayout.loc) + + var/outfit_path = generated_domain.forced_outfit || netsuit + var/datum/outfit/to_wear = new outfit_path() + + to_wear.belt = /obj/item/bitrunning_host_monitor + to_wear.glasses = null + to_wear.gloves = null + to_wear.l_hand = null + to_wear.l_pocket = null + to_wear.r_hand = null + to_wear.r_pocket = null + to_wear.suit = null + to_wear.suit_store = null + + avatar.equipOutfit(to_wear, visualsOnly = TRUE) + + var/thing = avatar.get_active_held_item() + if(!isnull(thing)) + qdel(thing) + + thing = avatar.get_inactive_held_item() + if(!isnull(thing)) + qdel(thing) + + var/obj/item/storage/backpack/bag = avatar.back + if(istype(bag)) + QDEL_LIST(bag.contents) + + bag.contents += list( + new /obj/item/storage/box/survival, + new /obj/item/storage/medkit/regular, + new /obj/item/flashlight, + ) + + var/obj/item/card/id/outfit_id = avatar.wear_id + if(outfit_id) + outfit_id.assignment = "Bit Avatar" + outfit_id.registered_name = avatar.real_name + + outfit_id.registered_account = new() + outfit_id.registered_account.replaceable = FALSE + + SSid_access.apply_trim_to_card(outfit_id, /datum/id_trim/bit_avatar) + + return avatar + +/// Generates a new hololadder for the bitrunner. Effectively a respawn attempt. +/obj/machinery/quantum_server/proc/generate_hololadder() + if(!length(exit_turfs)) + return + + if(retries_spent >= length(exit_turfs)) + return + + var/turf/destination + for(var/turf/dest_turf in exit_turfs) + if(!locate(/obj/structure/hololadder) in dest_turf) + destination = dest_turf + break + + if(isnull(destination)) + return + + var/obj/structure/hololadder/wayout = new(destination) + if(isnull(wayout)) + return + + retries_spent += 1 + + return wayout + +/// Scans over neo's contents for bitrunning tech disks. Loads the items or abilities onto the avatar. +/obj/machinery/quantum_server/proc/stock_gear(mob/living/carbon/human/avatar, mob/living/carbon/human/neo) + var/failed = FALSE + + for(var/obj/item/bitrunning_disk/disk in neo.get_contents()) + if(istype(disk, /obj/item/bitrunning_disk/ability)) + var/obj/item/bitrunning_disk/ability/ability_disk = disk + + if(isnull(ability_disk.granted_action)) + failed = TRUE + continue + + var/datum/action/our_action = new ability_disk.granted_action() + our_action.Grant(avatar) + continue + + if(istype(disk, /obj/item/bitrunning_disk/item)) + var/obj/item/bitrunning_disk/item/item_disk = disk + + if(isnull(item_disk.granted_item)) + failed = TRUE + continue + + avatar.put_in_hands(new item_disk.granted_item()) + + if(failed) + to_chat(neo, span_warning("One of your disks failed to load. You must activate them to make a selection.")) diff --git a/code/modules/bitrunning/server/quantum_server.dm b/code/modules/bitrunning/server/quantum_server.dm new file mode 100644 index 0000000000000..404a31cca6a77 --- /dev/null +++ b/code/modules/bitrunning/server/quantum_server.dm @@ -0,0 +1,152 @@ +/** + * The base object for the quantum server + */ +/obj/machinery/quantum_server + name = "quantum server" + + circuit = /obj/item/circuitboard/machine/quantum_server + density = TRUE + desc = "A hulking computational machine designed to fabricate virtual domains." + icon = 'icons/obj/machines/bitrunning.dmi' + base_icon_state = "qserver" + icon_state = "qserver" + /// Affects server cooldown efficiency + var/capacitor_coefficient = 1 + /// The loaded map template, map_template/virtual_domain + var/datum/lazy_template/virtual_domain/generated_domain + /// The loaded safehouse, map_template/safehouse + var/datum/map_template/safehouse/generated_safehouse + /// The connected console + var/datum/weakref/console_ref + /// If the current domain was a random selection + var/domain_randomized = FALSE + /// If any threats were spawned, adds to rewards + var/domain_threats = 0 + /// Prevents multiple user actions. Handled by loading domains and cooldowns + var/is_ready = TRUE + /// List of available domains + var/list/available_domains = list() + /// Current plugged in users + var/list/datum/weakref/avatar_connection_refs = list() + /// Cached list of mutable mobs in zone for cybercops + var/list/datum/weakref/mutation_candidate_refs = list() + /// Any ghosts that have spawned in + var/list/datum/weakref/spawned_threat_refs = list() + /// Scales loot with extra players + var/multiplayer_bonus = 1.1 + ///The radio the console can speak into + var/obj/item/radio/radio + /// The amount of points in the system, used to purchase maps + var/points = 0 + /// Keeps track of the number of times someone has built a hololadder + var/retries_spent = 0 + /// Changes how much info is available on the domain + var/scanner_tier = 1 + /// Length of time it takes for the server to cool down after resetting. Here to give runners downtime so their faces don't get stuck like that + var/server_cooldown_time = 3 MINUTES + /// Applies bonuses to rewards etc + var/servo_bonus = 0 + /// The turfs we can place a hololadder on. + var/turf/exit_turfs = list() + /// The turfs on station where we generate loot. + var/turf/receive_turfs = list() + +/obj/machinery/quantum_server/Initialize(mapload) + . = ..() + + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/quantum_server/LateInitialize() + . = ..() + + if(isnull(console_ref)) + find_console() + + radio = new(src) + radio.set_frequency(FREQ_SUPPLY) + radio.subspace_transmission = TRUE + radio.canhear_range = 0 + radio.recalculateChannels() + + RegisterSignals(src, list(COMSIG_MACHINERY_BROKEN, COMSIG_MACHINERY_POWER_LOST), PROC_REF(on_broken)) + RegisterSignal(src, COMSIG_QDELETING, PROC_REF(on_delete)) + RegisterSignal(src, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(src, COMSIG_BITRUNNER_SPAWN_GLITCH, PROC_REF(on_threat_created)) + + // This further gets sorted in the client by cost so it's random and grouped + available_domains = shuffle(subtypesof(/datum/lazy_template/virtual_domain)) + +/obj/machinery/quantum_server/Destroy(force) + . = ..() + + available_domains.Cut() + mutation_candidate_refs.Cut() + avatar_connection_refs.Cut() + spawned_threat_refs.Cut() + QDEL_NULL(exit_turfs) + QDEL_NULL(receive_turfs) + QDEL_NULL(generated_domain) + QDEL_NULL(generated_safehouse) + QDEL_NULL(radio) + +/obj/machinery/quantum_server/update_appearance(updates) + if(isnull(generated_domain) || !is_operational) + set_light(0) + return ..() + + set_light_color(is_ready ? LIGHT_COLOR_BABY_BLUE : LIGHT_COLOR_FIRE) + set_light(2, 1.5) + + return ..() + +/obj/machinery/quantum_server/update_icon_state() + if(isnull(generated_domain) || !is_operational) + icon_state = base_icon_state + return ..() + + icon_state = "[base_icon_state]_[is_ready ? "on" : "off"]" + return ..() + +/obj/machinery/quantum_server/crowbar_act(mob/living/user, obj/item/crowbar) + . = ..() + + if(!is_ready) + balloon_alert(user, "it's scalding hot!") + return TRUE + if(length(avatar_connection_refs)) + balloon_alert(user, "all clients must disconnect!") + return TRUE + if(default_deconstruction_crowbar(crowbar)) + return TRUE + return FALSE + +/obj/machinery/quantum_server/screwdriver_act(mob/living/user, obj/item/screwdriver) + . = ..() + + if(!is_ready) + balloon_alert(user, "it's scalding hot!") + return TRUE + if(default_deconstruction_screwdriver(user, "[base_icon_state]_panel", icon_state, screwdriver)) + return TRUE + return FALSE + +/obj/machinery/quantum_server/RefreshParts() + . = ..() + + var/capacitor_rating = 1.15 + var/datum/stock_part/capacitor/cap = locate() in component_parts + capacitor_rating -= cap.tier * 0.15 + + capacitor_coefficient = capacitor_rating + + var/datum/stock_part/scanning_module/scanner = locate() in component_parts + if(scanner) + scanner_tier = scanner.tier + + var/servo_rating = 0 + for(var/datum/stock_part/servo/servo in component_parts) + servo_rating += servo.tier * 0.1 + + servo_bonus = servo_rating + + SEND_SIGNAL(src, COMSIG_BITRUNNER_SERVER_UPGRADED, servo_rating) diff --git a/code/modules/bitrunning/server/signal_handlers.dm b/code/modules/bitrunning/server/signal_handlers.dm new file mode 100644 index 0000000000000..b0464b351faf0 --- /dev/null +++ b/code/modules/bitrunning/server/signal_handlers.dm @@ -0,0 +1,107 @@ +/// If broken via signal, disconnects all users +/obj/machinery/quantum_server/proc/on_broken(datum/source) + SIGNAL_HANDLER + + if(isnull(generated_domain)) + return + + SEND_SIGNAL(src, COMSIG_BITRUNNER_SEVER_AVATAR) + +/// Whenever a corpse spawner makes a new corpse, add it to the list of potential mutations +/obj/machinery/quantum_server/proc/on_corpse_spawned(datum/source, mob/living/corpse) + SIGNAL_HANDLER + + mutation_candidate_refs.Add(WEAKREF(corpse)) + +/// Being qdeleted - make sure the circuit and connected mobs go with it +/obj/machinery/quantum_server/proc/on_delete(datum/source) + SIGNAL_HANDLER + + if(generated_domain) + SEND_SIGNAL(src, COMSIG_BITRUNNER_SEVER_AVATAR) + scrub_vdom() + + if(is_ready) + return + // in case they're trying to cheese cooldown + var/obj/item/circuitboard/machine/quantum_server/circuit = locate(/obj/item/circuitboard/machine/quantum_server) in contents + if(circuit) + qdel(circuit) + +/// Handles examining the server. Shows cooldown time and efficiency. +/obj/machinery/quantum_server/proc/on_examine(datum/source, mob/examiner, list/examine_text) + SIGNAL_HANDLER + + examine_text += span_infoplain("Can be resource intensive to run. Ensure adequate power supply.") + + if(capacitor_coefficient < 1) + examine_text += span_infoplain("Its coolant capacity reduces cooldown time by [(1 - capacitor_coefficient) * 100]%.") + + if(servo_bonus > 0.2) + examine_text += span_infoplain("Its manipulation potential is increasing rewards by [servo_bonus]x.") + examine_text += span_infoplain("Injury from unsafe ejection reduced [servo_bonus * 100]%.") + + if(!is_ready) + examine_text += span_notice("It is currently cooling down. Give it a few moments.") + return + +/// Whenever something enters the send tiles, check if it's a loot crate. If so, alert players. +/obj/machinery/quantum_server/proc/on_goal_turf_entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) + SIGNAL_HANDLER + + if(!istype(arrived, /obj/structure/closet/crate/secure/bitrunning/encrypted)) + return + + var/obj/structure/closet/crate/secure/bitrunning/encrypted/loot_crate = arrived + if(!istype(loot_crate)) + return + + for(var/mob/person in loot_crate.contents) + if(isnull(person.mind)) + person.forceMove(get_turf(loot_crate)) + + var/datum/component/avatar_connection/connection = person.GetComponent(/datum/component/avatar_connection) + connection?.full_avatar_disconnect() + + spark_at_location(loot_crate) + qdel(loot_crate) + SEND_SIGNAL(src, COMSIG_BITRUNNER_DOMAIN_COMPLETE, arrived, generated_domain.reward_points) + generate_loot() + +/// Handles examining the server. Shows cooldown time and efficiency. +/obj/machinery/quantum_server/proc/on_goal_turf_examined(datum/source, mob/examiner, list/examine_text) + SIGNAL_HANDLER + + examine_text += span_info("Beneath your gaze, the floor pulses subtly with streams of encoded data.") + examine_text += span_info("It seems to be part of the location designated for retrieving encrypted payloads.") + +/// Scans over the inbound created_atoms from lazy templates +/obj/machinery/quantum_server/proc/on_template_loaded(datum/lazy_template/source, list/created_atoms) + SIGNAL_HANDLER + + for(var/thing in created_atoms) + if(isliving(thing)) // so we can mutate them + var/mob/living/creature = thing + + if(creature.can_be_cybercop) + mutation_candidate_refs.Add(WEAKREF(creature)) + continue + + if(istype(thing, /obj/effect/mob_spawn/ghost_role)) // so we get threat alerts + RegisterSignal(thing, COMSIG_GHOSTROLE_SPAWNED, PROC_REF(on_threat_created)) + continue + + if(istype(thing, /obj/effect/mob_spawn/corpse)) // corpses are valid targets too + var/obj/effect/mob_spawn/corpse/spawner = thing + + mutation_candidate_refs.Add(spawner.spawned_mob_ref) + + UnregisterSignal(source, COMSIG_LAZY_TEMPLATE_LOADED) + +/// Handles when cybercops are summoned into the area or ghosts click a ghost role spawner +/obj/machinery/quantum_server/proc/on_threat_created(datum/source, mob/living/threat) + SIGNAL_HANDLER + + domain_threats += 1 + spawned_threat_refs.Add(WEAKREF(threat)) + SEND_SIGNAL(src, COMSIG_BITRUNNER_THREAT_CREATED) // notify players diff --git a/code/modules/bitrunning/server/util.dm b/code/modules/bitrunning/server/util.dm new file mode 100644 index 0000000000000..c4f1319cd12dd --- /dev/null +++ b/code/modules/bitrunning/server/util.dm @@ -0,0 +1,142 @@ +#define REDACTED "???" +#define MAX_DISTANCE 4 // How far crates can spawn from the server + +/// Resets the cooldown state and updates icons +/obj/machinery/quantum_server/proc/cool_off() + is_ready = TRUE + update_appearance() + radio.talk_into(src, "Thermal systems within operational parameters. Proceeding to domain configuration.", RADIO_CHANNEL_SUPPLY) + +/// Attempts to connect to a quantum console +/obj/machinery/quantum_server/proc/find_console() + var/obj/machinery/computer/quantum_console/console = console_ref?.resolve() + if(console) + return console + + for(var/direction in GLOB.cardinals) + var/obj/machinery/computer/quantum_console/nearby_console = locate(/obj/machinery/computer/quantum_console, get_step(src, direction)) + if(nearby_console) + console_ref = WEAKREF(nearby_console) + nearby_console.server_ref = WEAKREF(src) + return nearby_console + +/// Compiles a list of available domains. +/obj/machinery/quantum_server/proc/get_available_domains() + var/list/levels = list() + + for(var/datum/lazy_template/virtual_domain/domain as anything in available_domains) + if(initial(domain.test_only)) + continue + var/can_view = initial(domain.difficulty) < scanner_tier && initial(domain.cost) <= points + 5 + var/can_view_reward = initial(domain.difficulty) < (scanner_tier + 1) && initial(domain.cost) <= points + 3 + + levels += list(list( + "cost" = initial(domain.cost), + "desc" = can_view ? initial(domain.desc) : "Limited scanning capabilities. Cannot infer domain details.", + "difficulty" = initial(domain.difficulty), + "id" = initial(domain.key), + "name" = can_view ? initial(domain.name) : REDACTED, + "reward" = can_view_reward ? initial(domain.reward_points) : REDACTED, + )) + + return levels + +/// If there are hosted minds, attempts to get a list of their current virtual bodies w/ vitals +/obj/machinery/quantum_server/proc/get_avatar_data() + var/list/hosted_avatars = list() + + for(var/datum/weakref/avatar_ref in avatar_connection_refs) + var/datum/component/avatar_connection/connection = avatar_ref.resolve() + if(isnull(connection)) + avatar_connection_refs.Remove(connection) + continue + + var/mob/living/creature = connection.parent + var/mob/living/pilot = connection.old_body_ref?.resolve() + + hosted_avatars += list(list( + "health" = creature.health, + "name" = creature.name, + "pilot" = pilot, + "brute" = creature.get_current_damage_of_type(BRUTE), + "burn" = creature.get_current_damage_of_type(BURN), + "tox" = creature.get_current_damage_of_type(TOX), + "oxy" = creature.get_current_damage_of_type(OXY), + )) + + return hosted_avatars + +/// Gets a random available domain given the current points. Weighted towards higher cost domains. +/obj/machinery/quantum_server/proc/get_random_domain_id() + if(points < 1) + return + + var/list/random_domains = list() + var/total_cost = 0 + + for(var/datum/lazy_template/virtual_domain/available as anything in subtypesof(/datum/lazy_template/virtual_domain)) + var/init_cost = initial(available.cost) + if(!initial(available.test_only) && init_cost > 0 && init_cost < 4 && init_cost <= points) + random_domains += list(list( + cost = init_cost, + id = initial(available.key), + )) + + var/random_value = rand(0, total_cost) + var/accumulated_cost = 0 + + for(var/available as anything in random_domains) + accumulated_cost += available["cost"] + if(accumulated_cost >= random_value) + domain_randomized = TRUE + return available["id"] + +/// Gets all mobs originally generated by the loaded domain and returns a list that are capable of being antagged +/obj/machinery/quantum_server/proc/get_valid_domain_targets() + // A: No one is playing + // B: The domain is not loaded + // C: The domain is shutting down + // D: There are no mobs + if(!length(avatar_connection_refs) || isnull(generated_domain) || !is_ready || !is_operational || !length(mutation_candidate_refs)) + return list() + + for(var/datum/weakref/creature_ref as anything in mutation_candidate_refs) + var/mob/living/creature = creature_ref.resolve() + if(isnull(creature) || creature.mind) + mutation_candidate_refs.Remove(creature_ref) + + return shuffle(mutation_candidate_refs) + +/// Locates any turfs with crate out landmarks +/obj/machinery/quantum_server/proc/locate_receive_turfs() + for(var/obj/effect/landmark/bitrunning/station_reward_spawn/spawner in GLOB.landmarks_list) + if(IN_GIVEN_RANGE(src, spawner, MAX_DISTANCE)) + receive_turfs += get_turf(spawner) + qdel(spawner) + + return length(receive_turfs) > 0 + +/// Finds any mobs with minds in the zones and gives them the bad news +/obj/machinery/quantum_server/proc/notify_spawned_threats() + for(var/datum/weakref/baddie_ref as anything in spawned_threat_refs) + var/mob/living/baddie = baddie_ref.resolve() + if(isnull(baddie) || baddie.stat >= UNCONSCIOUS || isnull(baddie.mind)) + continue + + baddie.throw_alert( + ALERT_BITRUNNER_RESET, + /atom/movable/screen/alert/bitrunning/qserver_threat_deletion, + new_master = src, + ) + + to_chat(baddie, span_userdanger("You have been flagged for deletion! Thank you for your service.")) + +/// Do some magic teleport sparks +/obj/machinery/quantum_server/proc/spark_at_location(obj/crate) + playsound(crate, 'sound/magic/blink.ogg', 50, TRUE) + var/datum/effect_system/spark_spread/quantum/sparks = new() + sparks.set_up(5, 1, get_turf(crate)) + sparks.start() + +#undef REDACTED +#undef MAX_DISTANCE diff --git a/code/modules/bitrunning/turfs.dm b/code/modules/bitrunning/turfs.dm new file mode 100644 index 0000000000000..4c35153311e53 --- /dev/null +++ b/code/modules/bitrunning/turfs.dm @@ -0,0 +1,13 @@ +/turf/open/floor/bitrunning_transport + name = "circuit floor" + desc = "Looks complex. You can see the circuits running through the floor." + icon_state = "bitrunning" + +/turf/closed/indestructible/binary + name = "tear in the fabric of reality" + icon = 'icons/turf/floors.dmi' + icon_state = "binary" + +/obj/effect/baseturf_helper/virtual_domain + name = "virtual domain baseturf editor" + baseturf = /turf/open/indestructible/binary diff --git a/code/modules/bitrunning/virtual_domain/domains/ash_drake.dm b/code/modules/bitrunning/virtual_domain/domains/ash_drake.dm new file mode 100644 index 0000000000000..02bb91abc5888 --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/domains/ash_drake.dm @@ -0,0 +1,18 @@ +/datum/lazy_template/virtual_domain/ash_drake + name = "Ashen Inferno" + cost = BITRUNNER_COST_MEDIUM + desc = "Home of the ash drake, a powerful dragon that scours the surface of Lavaland." + difficulty = BITRUNNER_DIFFICULTY_MEDIUM + forced_outfit = /datum/outfit/job/miner + key = "ash_drake" + map_name = "ash_drake" + reward_points = BITRUNNER_REWARD_MEDIUM + safehouse_path = /datum/map_template/safehouse/lavaland_boss + +/mob/living/simple_animal/hostile/megafauna/dragon/virtual_domain + can_be_cybercop = FALSE + crusher_loot = list(/obj/structure/closet/crate/secure/bitrunning/encrypted) + health = 1600 + loot = list(/obj/structure/closet/crate/secure/bitrunning/encrypted) + maxHealth = 1600 + true_spawn = FALSE diff --git a/code/modules/bitrunning/virtual_domain/domains/beach_bar.dm b/code/modules/bitrunning/virtual_domain/domains/beach_bar.dm new file mode 100644 index 0000000000000..871c2cb1338e2 --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/domains/beach_bar.dm @@ -0,0 +1,22 @@ +/datum/lazy_template/virtual_domain/beach_bar + name = "Beach Bar" + desc = "A cheerful seaside haven where friendly skeletons serve up drinks. Say, how'd you guys get so dead?" + extra_loot = list(/obj/item/toy/beach_ball = 1) + help_text = "This place is running on a skeleton crew, and they don't seem to be too keen to share details. \ + Maybe a few drinks of liquid charm will get the spirits up. As the saying goes, if you can't beat 'em, join 'em." + key = "beach_bar" + map_name = "beach_bar" + safehouse_path = /datum/map_template/safehouse/mine + +/obj/item/reagent_containers/cup/glass/drinkingglass/virtual_domain + name = "pina colada" + desc = "Whose drink is this? Not yours, that's for sure. Well, it's not like they're going to miss it." + list_reagents = list(/datum/reagent/consumable/ethanol/pina_colada = 30) + +/obj/item/reagent_containers/cup/glass/drinkingglass/virtual_domain/Initialize(mapload, vol) + . = ..() + + AddComponent(/datum/component/bitrunning_points, \ + signal_type = COMSIG_GLASS_DRANK, \ + points_per_signal = 0.5, \ + ) diff --git a/code/modules/bitrunning/virtual_domain/domains/blood_drunk_miner.dm b/code/modules/bitrunning/virtual_domain/domains/blood_drunk_miner.dm new file mode 100644 index 0000000000000..abf2e0fc5a940 --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/domains/blood_drunk_miner.dm @@ -0,0 +1,18 @@ +/datum/lazy_template/virtual_domain/blood_drunk_miner + name = "Sanguine Excavation" + cost = BITRUNNER_COST_MEDIUM + desc = "Few escape the surface of Lavaland without a few scars. Some remain, maddened by the hunt." + difficulty = BITRUNNER_DIFFICULTY_MEDIUM + forced_outfit = /datum/outfit/job/miner + key = "blood_drunk_miner" + map_name = "blood_drunk_miner" + reward_points = BITRUNNER_REWARD_MEDIUM + safehouse_path = /datum/map_template/safehouse/lavaland_boss + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/virtual_domain + can_be_cybercop = FALSE + crusher_loot = list(/obj/structure/closet/crate/secure/bitrunning/encrypted) + health = 1600 + loot = list(/obj/structure/closet/crate/secure/bitrunning/encrypted) + maxHealth = 1600 + true_spawn = FALSE diff --git a/code/modules/bitrunning/virtual_domain/domains/bubblegum.dm b/code/modules/bitrunning/virtual_domain/domains/bubblegum.dm new file mode 100644 index 0000000000000..bede97177cb7d --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/domains/bubblegum.dm @@ -0,0 +1,19 @@ +/datum/lazy_template/virtual_domain/bubblegum + name = "Blood-Soaked Lair" + cost = BITRUNNER_COST_HIGH + desc = "King of the slaughter demons. Bubblegum is a massive, hulking beast with a penchant for violence." + difficulty = BITRUNNER_DIFFICULTY_HIGH + extra_loot = list(/obj/item/toy/plush/bubbleplush = 1) + forced_outfit = /datum/outfit/job/miner + key = "bubblegum" + map_name = "bubblegum" + reward_points = BITRUNNER_REWARD_HIGH + safehouse_path = /datum/map_template/safehouse/lavaland_boss + +/mob/living/simple_animal/hostile/megafauna/bubblegum/virtual_domain + can_be_cybercop = FALSE + crusher_loot = list(/obj/structure/closet/crate/secure/bitrunning/encrypted) + health = 2000 + loot = list(/obj/structure/closet/crate/secure/bitrunning/encrypted) + maxHealth = 2000 + true_spawn = FALSE diff --git a/code/modules/bitrunning/virtual_domain/domains/clown_planet.dm b/code/modules/bitrunning/virtual_domain/domains/clown_planet.dm new file mode 100644 index 0000000000000..92f000c9cf342 --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/domains/clown_planet.dm @@ -0,0 +1,13 @@ +/datum/lazy_template/virtual_domain/clown_planet + name = "Clown Planet" + cost = BITRUNNER_COST_LOW + desc = "In the deep, dark reaches of space, there is only Honk." + difficulty = BITRUNNER_DIFFICULTY_LOW + extra_loot = list(/obj/item/bikehorn = 1) + forced_outfit = /datum/outfit/job/clown + help_text = "The trials of the Honkitude have begun. The sound of bike horns wailing in the distance. \ + this realm- some sort of puzzle, has existed in legend as the final test of just how silly you are." + key = "clown_planet" + map_name = "clown_planet" + reward_points = BITRUNNER_REWARD_LOW + safehouse_path = /datum/map_template/safehouse/mine diff --git a/code/modules/bitrunning/virtual_domain/domains/colossus.dm b/code/modules/bitrunning/virtual_domain/domains/colossus.dm new file mode 100644 index 0000000000000..35ba4eee0ca89 --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/domains/colossus.dm @@ -0,0 +1,18 @@ +/datum/lazy_template/virtual_domain/colossus + name = "Celestial Trial" + cost = BITRUNNER_COST_HIGH + desc = "A massive, ancient beast named the Colossus. Judgment comes." + difficulty = BITRUNNER_DIFFICULTY_HIGH + forced_outfit = /datum/outfit/job/miner + key = "colossus" + map_name = "colossus" + reward_points = BITRUNNER_REWARD_HIGH + safehouse_path = /datum/map_template/safehouse/lavaland_boss + +/mob/living/simple_animal/hostile/megafauna/colossus/virtual_domain + can_be_cybercop = FALSE + crusher_loot = list(/obj/structure/closet/crate/secure/bitrunning/encrypted) + loot = list(/obj/structure/closet/crate/secure/bitrunning/encrypted) + health = 2000 + maxHealth = 2000 + true_spawn = FALSE diff --git a/code/modules/bitrunning/virtual_domain/domains/gondola_asteroid.dm b/code/modules/bitrunning/virtual_domain/domains/gondola_asteroid.dm new file mode 100644 index 0000000000000..4deacb4f9c592 --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/domains/gondola_asteroid.dm @@ -0,0 +1,39 @@ +/datum/lazy_template/virtual_domain/gondola_asteroid + name = "Gondola Asteroid" + desc = "An asteroid home to a bountiful forest of gondolas. Peaceful." + map_name = "gondola_asteroid" + help_text = "What a lovely forest. There's a loot crate here in the middle of the map. \ + Hmm... It doesn't budge. The gondolas don't seem to have any trouble moving it, though. \ + I bet there's a way to move it myself." + key = "gondola_asteroid" + map_name = "gondola_asteroid" + safehouse_path = /datum/map_template/safehouse/shuttle_space + +/// Very pushy gondolas, great for moving loot crates. +/obj/structure/closet/crate/secure/bitrunning/encrypted/gondola + move_resist = MOVE_FORCE_STRONG + +/mob/living/simple_animal/pet/gondola/virtual_domain + health = 50 + loot = list(/obj/effect/decal/cleanable/blood/gibs, /obj/item/stack/sheet/animalhide/gondola = 1, /obj/item/food/meat/slab/gondola/virtual_domain = 1) + maxHealth = 50 + move_force = MOVE_FORCE_VERY_STRONG + move_resist = MOVE_FORCE_STRONG + +/obj/item/food/meat/slab/gondola/virtual_domain + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 4, + /datum/reagent/gondola_mutation_toxin/virtual_domain = 5, + ) + +/datum/reagent/gondola_mutation_toxin/virtual_domain + name = "Advanced Tranquility" + +/datum/reagent/gondola_mutation_toxin/virtual_domain/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/virtual_domain(), FALSE, TRUE) + +/datum/disease/transformation/gondola/virtual_domain + stage_prob = 9 + new_form = /mob/living/simple_animal/pet/gondola/virtual_domain diff --git a/code/modules/bitrunning/virtual_domain/domains/hierophant.dm b/code/modules/bitrunning/virtual_domain/domains/hierophant.dm new file mode 100644 index 0000000000000..142623f4f812e --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/domains/hierophant.dm @@ -0,0 +1,18 @@ +/datum/lazy_template/virtual_domain/hierophant + name = "Zealot Arena" + cost = BITRUNNER_COST_HIGH + desc = "Dance, puppets, dance!" + difficulty = BITRUNNER_DIFFICULTY_HIGH + forced_outfit = /datum/outfit/job/miner + key = "hierophant" + map_name = "hierophant" + reward_points = BITRUNNER_REWARD_HIGH + safehouse_path = /datum/map_template/safehouse/lavaland_boss + +/mob/living/simple_animal/hostile/megafauna/hierophant/virtual_domain + can_be_cybercop = FALSE + crusher_loot = list(/obj/structure/closet/crate/secure/bitrunning/encrypted) + health = 1700 + loot = list(/obj/structure/closet/crate/secure/bitrunning/encrypted) + maxHealth = 1700 + true_spawn = FALSE diff --git a/code/modules/bitrunning/virtual_domain/domains/legion.dm b/code/modules/bitrunning/virtual_domain/domains/legion.dm new file mode 100644 index 0000000000000..f1ba146f3801b --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/domains/legion.dm @@ -0,0 +1,20 @@ +/datum/lazy_template/virtual_domain/legion + name = "Chamber of Echoes" + cost = BITRUNNER_COST_MEDIUM + desc = "A chilling realm that houses Legion's necropolis. Those who succumb to it are forever damned." + difficulty = BITRUNNER_DIFFICULTY_MEDIUM + forced_outfit = /datum/outfit/job/miner + key = "legion" + map_name = "legion" + reward_points = BITRUNNER_REWARD_MEDIUM + safehouse_path = /datum/map_template/safehouse/lavaland_boss + +/mob/living/simple_animal/hostile/megafauna/legion/virtual_domain + can_be_cybercop = FALSE + crusher_loot = list(/obj/structure/closet/crate/secure/bitrunning/encrypted) + health = 1500 + loot = list(/obj/structure/closet/crate/secure/bitrunning/encrypted) + maxHealth = 1500 + true_spawn = FALSE + +// You may be thinking, what about those mini-legions? They're not part of the initial created_atoms list diff --git a/code/modules/bitrunning/virtual_domain/domains/pipedream.dm b/code/modules/bitrunning/virtual_domain/domains/pipedream.dm new file mode 100644 index 0000000000000..fd54ef6ca4847 --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/domains/pipedream.dm @@ -0,0 +1,101 @@ +/datum/lazy_template/virtual_domain/pipedream + name = "Disposal Pipe Factory" + cost = BITRUNNER_COST_LOW + desc = "An abandoned and infested factory manufacturing disposal pipes." + difficulty = BITRUNNER_DIFFICULTY_MEDIUM + extra_loot = list(/obj/item/stack/pipe_cleaner_coil/random/five = 1) + help_text = "Not long ago, this place was thriving with activity. The workers \ + seemed to have left in a hurry, and now productivity is in the bin. Something \ + must have trashed the place, but what?" + key = "pipedream" + map_name = "pipedream" + reward_points = BITRUNNER_REWARD_LOW + safehouse_path = /datum/map_template/safehouse/shuttle + +// ID Trims +/datum/id_trim/factory + assignment = "Factory Worker" + trim_state = "trim_cargotechnician" + department_color = COLOR_CARGO_BROWN + subdepartment_color = COLOR_CARGO_BROWN + sechud_icon_state = SECHUD_CARGO_TECHNICIAN + access = list( + ACCESS_AWAY_SUPPLY + ) + +/datum/id_trim/factory/qm + assignment = "Factory Quartermaster" + trim_state = "trim_quartermaster" + department_color = COLOR_COMMAND_BLUE + subdepartment_color = COLOR_CARGO_BROWN + department_state = "departmenthead" + sechud_icon_state = SECHUD_QUARTERMASTER + access = list( + ACCESS_AWAY_SUPPLY, + ACCESS_AWAY_COMMAND + ) + +// ID Cards +/obj/item/card/id/advanced/factory + name = "factory worker ID" + trim = /datum/id_trim/factory + +/obj/item/card/id/advanced/factory/qm + name = "factory quartermaster ID" + trim = /datum/id_trim/factory/qm + +//Outfits +/datum/outfit/factory + name = "Factory Worker" + + id_trim = /datum/id_trim/factory + id = /obj/item/card/id/advanced/ + uniform = /obj/item/clothing/under/rank/cargo/tech + suit = /obj/item/clothing/suit/hazardvest + belt = /obj/item/radio + gloves = /obj/item/clothing/gloves/color/black + head = /obj/item/clothing/head/soft/yellow + shoes = /obj/item/clothing/shoes/workboots + l_pocket = /obj/item/flashlight/seclite + +/datum/outfit/factory/guard + name = "Factory Guard" + + uniform = /obj/item/clothing/under/rank/security/officer/grey + suit = /obj/item/clothing/suit/armor/vest/alt + belt = /obj/item/radio + gloves = /obj/item/clothing/gloves/color/black + head = /obj/item/clothing/head/soft/sec + shoes = /obj/item/clothing/shoes/jackboots/sec + l_pocket = /obj/item/restraints/handcuffs + r_pocket = /obj/item/assembly/flash/handheld + +/datum/outfit/factory/qm + name = "Factory Quatermaster" + + id_trim = /datum/id_trim/factory/qm + id = /obj/item/card/id/advanced/silver + uniform = /obj/item/clothing/under/rank/cargo/qm + belt = /obj/item/radio + gloves = /obj/item/clothing/gloves/color/black + head = /obj/item/clothing/head/soft/yellow + shoes = /obj/item/clothing/shoes/jackboots/sec + l_pocket = /obj/item/melee/baton/telescopic + r_pocket = /obj/item/stamp/head/qm + +// Corpses +/obj/effect/mob_spawn/corpse/human/factory + name = "Factory Worker" + outfit = /datum/outfit/factory + icon_state = "corpsecargotech" + +/obj/effect/mob_spawn/corpse/human/factory/guard + name = "Factory Guard" + outfit = /datum/outfit/factory/guard + icon_state = "corpsecargotech" + +/obj/effect/mob_spawn/corpse/human/factory/qm + name = "Factory Quartermaster" + outfit = /datum/outfit/factory/qm + icon_state = "corpsecargotech" + diff --git a/code/modules/bitrunning/virtual_domain/domains/pirates.dm b/code/modules/bitrunning/virtual_domain/domains/pirates.dm new file mode 100644 index 0000000000000..52d86a7121180 --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/domains/pirates.dm @@ -0,0 +1,10 @@ +/datum/lazy_template/virtual_domain/pirates + name = "Corsair Cove" + cost = BITRUNNER_COST_MEDIUM + desc = "Battle your way to the hidden treasure, seize the booty, and make a swift escape before the pirates turn the tide." + difficulty = BITRUNNER_DIFFICULTY_MEDIUM + help_text = "Put on the provided outfits to blend in, then battle your way through the hostile pirates. \ + Grab the treasure and get out before you're overwhelmed!" + key = "pirates" + map_name = "pirates" + reward_points = BITRUNNER_REWARD_MEDIUM diff --git a/code/modules/bitrunning/virtual_domain/domains/stairs_and_cliffs.dm b/code/modules/bitrunning/virtual_domain/domains/stairs_and_cliffs.dm new file mode 100644 index 0000000000000..2d9bcca364556 --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/domains/stairs_and_cliffs.dm @@ -0,0 +1,29 @@ +/datum/lazy_template/virtual_domain/stairs_and_cliffs + name = "Glacier Grind" + cost = BITRUNNER_COST_LOW + desc = "A treacherous climb few calves can survive. Great cardio though." + help_text = "Ever heard of 'Snakes and Ladders'? It's like that, but with \ + instead of ladders its stairs and instead of snakes its a steep drop down a \ + cliff into rough rocks or liquid plasma." + extra_loot = list(/obj/item/clothing/suit/costume/snowman = 2) + difficulty = BITRUNNER_DIFFICULTY_LOW + forced_outfit = /datum/outfit/job/virtual_domain_iceclimber + key = "stairs_and_cliffs" + map_name = "stairs_and_cliffs" + reward_points = BITRUNNER_REWARD_MEDIUM + safehouse_path = /datum/map_template/safehouse/ice + +/turf/open/cliff/snowrock/virtual_domain + name = "icy cliff" + initial_gas_mix = "o2=22;n2=82;TEMP=180" + +/turf/open/lava/plasma/virtual_domain + name = "plasma lake" + initial_gas_mix = "o2=22;n2=82;TEMP=180" + +/datum/outfit/job/virtual_domain_iceclimber + name = "Ice Climber" + + uniform = /obj/item/clothing/under/color/grey + backpack = /obj/item/storage/backpack/duffelbag + shoes = /obj/item/clothing/shoes/winterboots diff --git a/code/modules/bitrunning/virtual_domain/domains/syndicate_assault.dm b/code/modules/bitrunning/virtual_domain/domains/syndicate_assault.dm new file mode 100644 index 0000000000000..bae0da6874dbf --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/domains/syndicate_assault.dm @@ -0,0 +1,13 @@ +/datum/lazy_template/virtual_domain/syndicate_assault + name = "Syndicate Assault" + cost = BITRUNNER_COST_MEDIUM + desc = "Board the enemy ship and recover the stolen cargo." + difficulty = BITRUNNER_DIFFICULTY_MEDIUM + extra_loot = list(/obj/item/toy/plush/nukeplushie = 1) + help_text = "A group of Syndicate operatives have stolen valuable cargo from the station. \ + They have boarded their ship and are attempting to escape. Infiltrate their ship and recover \ + the crate. Be careful, they are extremely armed." + key = "syndicate_assault" + map_name = "syndicate_assault" + reward_points = BITRUNNER_REWARD_MEDIUM + safehouse_path = /datum/map_template/safehouse/shuttle diff --git a/code/modules/bitrunning/virtual_domain/domains/test_only.dm b/code/modules/bitrunning/virtual_domain/domains/test_only.dm new file mode 100644 index 0000000000000..6e5e852fb5c8e --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/domains/test_only.dm @@ -0,0 +1,11 @@ +/// Used for unit tests only. Skipped in UI. +/datum/lazy_template/virtual_domain/test_only + name = "Test Only" + key = "test_only" + map_name = "test_only" + test_only = TRUE + safehouse_path = /datum/map_template/safehouse/test_only + +/datum/lazy_template/virtual_domain/test_only/expensive + key = "test_only_expensive" + cost = 3 diff --git a/code/modules/bitrunning/virtual_domain/domains/vaporwave.dm b/code/modules/bitrunning/virtual_domain/domains/vaporwave.dm new file mode 100644 index 0000000000000..45d4abec9830a --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/domains/vaporwave.dm @@ -0,0 +1,10 @@ +/datum/lazy_template/virtual_domain/vaporwave + name = "Cosmic Vestige" + cost = BITRUNNER_COST_EXTREME + desc = "Suspended in the silent void of space, the Neon Relic is a haunting echo of a retro-futuristic era." + difficulty = BITRUNNER_DIFFICULTY_NONE + extra_loot = list(/obj/item/stack/spacecash/c500 = 3) + key = "vaporwave" + map_name = "vaporwave" + reward_points = BITRUNNER_REWARD_EXTREME + safehouse_path = /datum/map_template/safehouse/shuttle_space diff --git a/code/modules/bitrunning/virtual_domain/domains/wendigo.dm b/code/modules/bitrunning/virtual_domain/domains/wendigo.dm new file mode 100644 index 0000000000000..fcad3db6faf76 --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/domains/wendigo.dm @@ -0,0 +1,19 @@ +/datum/lazy_template/virtual_domain/wendigo + name = "Glacial Devourer" + cost = BITRUNNER_COST_HIGH + desc = "Legends speak of the ravenous Wendigo hidden deep within the caves of Icemoon." + difficulty = BITRUNNER_DIFFICULTY_HIGH + forced_outfit = /datum/outfit/job/miner + key = "wendigo" + map_name = "wendigo" + reward_points = BITRUNNER_REWARD_HIGH + safehouse_path = /datum/map_template/safehouse/lavaland_boss + +/mob/living/simple_animal/hostile/megafauna/wendigo/virtual_domain + can_be_cybercop = FALSE + crusher_loot = list(/obj/structure/closet/crate/secure/bitrunning/encrypted) + guaranteed_butcher_results = list(/obj/item/wendigo_skull = 1) + health = 2000 + loot = list(/obj/structure/closet/crate/secure/bitrunning/encrypted) + maxHealth = 2000 + true_spawn = FALSE diff --git a/code/modules/bitrunning/virtual_domain/domains/xeno_nest.dm b/code/modules/bitrunning/virtual_domain/domains/xeno_nest.dm new file mode 100644 index 0000000000000..2bd4105e13c22 --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/domains/xeno_nest.dm @@ -0,0 +1,12 @@ +/datum/lazy_template/virtual_domain/xeno_nest + name = "Xeno Infestation" + cost = BITRUNNER_COST_LOW + desc = "Our ship scanners have detected lifeforms of unknown origin. Friendly attempts to contact them have failed." + difficulty = BITRUNNER_DIFFICULTY_LOW + extra_loot = list(/obj/item/toy/plush/rouny = 1) + help_text = "You are on a barren planet filled with hostile creatures. There is a crate here, not hidden, \ + simply protected. Expect resistance." + key = "xeno_nest" + map_name = "xeno_nest" + reward_points = BITRUNNER_REWARD_LOW + safehouse_path = /datum/map_template/safehouse/shuttle diff --git a/code/modules/bitrunning/virtual_domain/safehouses.dm b/code/modules/bitrunning/virtual_domain/safehouses.dm new file mode 100644 index 0000000000000..bb42f690ac7ec --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/safehouses.dm @@ -0,0 +1,53 @@ +/** + * # Safe Houses + * The starting point for virtual domains. + * Create your own: Read the readme file in the '_maps/safehouses' folder. + */ +/datum/map_template/safehouse + name = "virtual domain: safehouse" + + returns_created_atoms = TRUE + /// The map file to load + var/filename = "den.dmm" + +/datum/map_template/safehouse/New() + mappath = "_maps/safehouses/" + filename + ..(path = mappath) + +/datum/map_template/safehouse/test_only + filename = "test_only_safehouse.dmm" + + +/// The default safehouse map template. +/datum/map_template/safehouse/wood + filename = "wood.dmm" + +/datum/map_template/safehouse/den + filename = "den.dmm" + +/datum/map_template/safehouse/dig + filename = "dig.dmm" + +/datum/map_template/safehouse/shuttle + filename = "shuttle.dmm" + +// Has space tiles on the four corners. +/datum/map_template/safehouse/shuttle_space + filename = "shuttle_space.dmm" + +/datum/map_template/safehouse/mine + filename = "mine.dmm" + +// Comes preloaded with mining combat gear. +/datum/map_template/safehouse/lavaland_boss + filename = "lavaland_boss.dmm" + +// Chill out +/datum/map_template/safehouse/ice + filename = "ice.dmm" + +/** + * Your safehouse here + * /datum/map_template/safehouse/your_type + * filename = "your_map.dmm" + */ diff --git a/code/modules/bitrunning/virtual_domain/virtual_domain.dm b/code/modules/bitrunning/virtual_domain/virtual_domain.dm new file mode 100644 index 0000000000000..c2bd193f4e98e --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/virtual_domain.dm @@ -0,0 +1,34 @@ +/** + * # Virtual Domains + * This loads a base level, then users can select the preset upon it. + * Create your own: Read the readme file in the '_maps/virtual_domains' folder. + */ +/datum/lazy_template/virtual_domain + map_dir = "_maps/virtual_domains" + map_name = "None" + key = "Virtual Domain" + + /// Cost of this map to load + var/cost = BITRUNNER_COST_NONE + /// The description of the map + var/desc = "A map." + /// The 'difficulty' of the map, which affects the ui and ability to scan info. + var/difficulty = BITRUNNER_DIFFICULTY_NONE + /// An assoc list of typepath/amount to spawn on completion. Not weighted - the value is the amount + var/list/extra_loot + /// The map file to load + var/filename = "virtual_domain.dmm" + /// Any outfit that you wish to force on avatars. Overrides preferences + var/datum/outfit/forced_outfit + /// Information given to connected clients via ability + var/help_text + // Name to show in the UI + var/name = "Virtual Domain" + /// Points to reward for completion. Used to purchase new domains and calculate ore rewards. + var/reward_points = BITRUNNER_REWARD_MIN + /// The start time of the map. Used to calculate time taken + var/start_time + /// This map is specifically for unit tests. Shouldn't display in game + var/test_only = FALSE + /// The safehouse to load into the map + var/datum/map_template/safehouse/safehouse_path = /datum/map_template/safehouse/den diff --git a/code/modules/buildmode/buildmode.dm b/code/modules/buildmode/buildmode.dm index a3f46037c0fe6..0e16a13b54a8f 100644 --- a/code/modules/buildmode/buildmode.dm +++ b/code/modules/buildmode/buildmode.dm @@ -22,6 +22,8 @@ // dirswitch UI var/atom/movable/screen/buildmode/bdir/dirbutton var/list/dirswitch_buttons = list() + /// item preview for selected item + var/atom/movable/screen/buildmode/preview_item/preview /datum/buildmode/New(client/c) mode = new /datum/buildmode_mode/basic(src) @@ -44,6 +46,7 @@ /datum/buildmode/Destroy() close_switchstates() + close_preview() holder.player_details.post_login_callbacks -= li_cb li_cb = null holder = null @@ -126,10 +129,41 @@ switch_state = BM_SWITCHSTATE_NONE holder.screen -= dirswitch_buttons +/datum/buildmode/proc/preview_selected_item(atom/typepath) + close_preview() + preview = new /atom/movable/screen/buildmode/preview_item(src) + preview.name = initial(typepath.name) + + // Scale the preview if it's bigger than one tile + var/mutable_appearance/preview_overlay = new(typepath) + var/list/icon_dimensions = get_icon_dimensions(initial(typepath.icon)) + var/width = icon_dimensions["width"] + var/height = icon_dimensions["height"] + var/scale = 1 + if(width > world.icon_size || height > world.icon_size) + if(width >= height) + scale = world.icon_size / width + else + scale = world.icon_size / height + preview_overlay.transform = preview_overlay.transform.Scale(scale) + preview_overlay.appearance_flags |= TILE_BOUND + preview_overlay.layer = FLOAT_LAYER + preview_overlay.plane = FLOAT_PLANE + preview.add_overlay(preview_overlay) + + holder.screen += preview + +/datum/buildmode/proc/close_preview() + if(isnull(preview)) + return + holder.screen -= preview + QDEL_NULL(preview) + /datum/buildmode/proc/change_mode(newmode) mode.exit_mode(src) QDEL_NULL(mode) close_switchstates() + close_preview() mode = new newmode(src) mode.enter_mode(src) modebutton.update_appearance() diff --git a/code/modules/buildmode/buttons.dm b/code/modules/buildmode/buttons.dm index e21d808d7c2ae..ca48ec2767e17 100644 --- a/code/modules/buildmode/buttons.dm +++ b/code/modules/buildmode/buttons.dm @@ -89,3 +89,8 @@ /atom/movable/screen/buildmode/quit/Click() bd.quit() return 1 + +/atom/movable/screen/buildmode/preview_item + name = "Selected Item" + icon_state = "template" + screen_loc = "NORTH,WEST+4" diff --git a/code/modules/buildmode/submodes/advanced.dm b/code/modules/buildmode/submodes/advanced.dm index c298f394d1bbf..f4ebb204d6ee0 100644 --- a/code/modules/buildmode/submodes/advanced.dm +++ b/code/modules/buildmode/submodes/advanced.dm @@ -2,18 +2,15 @@ key = "advanced" var/atom/objholder = null -// FIXME: add logic which adds a button displaying the icon -// of the currently selected path - -/datum/buildmode_mode/advanced/show_help(client/c) - to_chat(c, span_notice("***********************************************************")) - to_chat(c, span_notice("Right Mouse Button on buildmode button = Set object type")) - to_chat(c, span_notice("Left Mouse Button + alt on turf/obj = Copy object type")) - to_chat(c, span_notice("Left Mouse Button on turf/obj = Place objects")) - to_chat(c, span_notice("Right Mouse Button = Delete objects")) - to_chat(c, span_notice("\nUse the button in the upper left corner to")) - to_chat(c, span_notice("change the direction of built objects.")) - to_chat(c, span_notice("***********************************************************")) +/datum/buildmode_mode/advanced/show_help(client/builder) + to_chat(builder, span_purple(examine_block( + "[span_bold("Set object type")] -> Right Mouse Button on buildmode button\n\ + [span_bold("Copy object type")] -> Left Mouse Button + Alt on turf/obj\n\ + [span_bold("Place objects")] -> Left Mouse Button on turf/obj\n\ + [span_bold("Delete objects")] -> Right Mouse Button\n\ + \n\ + Use the button in the upper left corner to change the direction of built objects.")) + ) /datum/buildmode_mode/advanced/change_settings(client/c) var/target_path = input(c, "Enter typepath:", "Typepath", "/obj/structure/closet") @@ -27,6 +24,7 @@ objholder = null tgui_alert(usr,"That path is not allowed.") return + BM.preview_selected_item(objholder) /datum/buildmode_mode/advanced/handle_click(client/c, params, obj/object) var/list/modifiers = params2list(params) @@ -38,6 +36,7 @@ if (istype(object, /turf) || isobj(object) || istype(object, /mob)) objholder = object.type to_chat(c, span_notice("[initial(object.name)] ([object.type]) selected.")) + BM.preview_selected_item(objholder) else to_chat(c, span_notice("[initial(object.name)] is not a turf, object, or mob! Please select again.")) else if(left_click) diff --git a/code/modules/buildmode/submodes/area_edit.dm b/code/modules/buildmode/submodes/area_edit.dm index 8d5a01c487457..0d9ef8dd480bd 100644 --- a/code/modules/buildmode/submodes/area_edit.dm +++ b/code/modules/buildmode/submodes/area_edit.dm @@ -8,6 +8,14 @@ areaimage = image('icons/area/areas_misc.dmi', null, "yellow") ..() +/datum/buildmode_mode/area_edit/show_help(client/builder) + to_chat(builder, span_purple(examine_block( + "[span_bold("Select corner")] -> Left Mouse Button on obj/turf/mob\n\ + [span_bold("Paint area")] -> Left Mouse Button + Alt on turf/obj/mob\n\ + [span_bold("Select area to paint")] -> Right Mouse Button on obj/turf/mob\n\ + [span_bold("Create new area")] -> Right Mouse Button on buildmode button")) + ) + /datum/buildmode_mode/area_edit/enter_mode(datum/buildmode/BM) BM.holder.images += areaimage @@ -21,14 +29,6 @@ storedarea = null return ..() -/datum/buildmode_mode/area_edit/show_help(client/c) - to_chat(c, span_notice("***********************************************************")) - to_chat(c, span_notice("Left Mouse Button on obj/turf/mob = Select corner")) - to_chat(c, "Left Mouse Button + Alt on turf/obj/mob = Paint area/span>") - to_chat(c, span_notice("Right Mouse Button on obj/turf/mob = Select area to paint")) - to_chat(c, span_notice("Right Mouse Button on buildmode button = Create new area")) - to_chat(c, span_notice("***********************************************************")) - /datum/buildmode_mode/area_edit/change_settings(client/c) var/target_path = input(c, "Enter typepath:", "Typepath", "/area") var/areatype = text2path(target_path) diff --git a/code/modules/buildmode/submodes/basic.dm b/code/modules/buildmode/submodes/basic.dm index c13103c8ce2aa..4c32cc0333eb4 100644 --- a/code/modules/buildmode/submodes/basic.dm +++ b/code/modules/buildmode/submodes/basic.dm @@ -1,15 +1,15 @@ /datum/buildmode_mode/basic key = "basic" -/datum/buildmode_mode/basic/show_help(client/c) - to_chat(c, span_notice("***********************************************************")) - to_chat(c, span_notice("Left Mouse Button = Construct / Upgrade")) - to_chat(c, span_notice("Right Mouse Button = Deconstruct / Delete / Downgrade")) - to_chat(c, span_notice("Left Mouse Button + ctrl = R-Window")) - to_chat(c, span_notice("Left Mouse Button + alt = Airlock")) - to_chat(c, span_notice("\nUse the button in the upper left corner to")) - to_chat(c, span_notice("change the direction of built objects.")) - to_chat(c, span_notice("***********************************************************")) +/datum/buildmode_mode/basic/show_help(client/builder) + to_chat(builder, span_purple(examine_block( + "[span_bold("Construct / Upgrade")] -> Left Mouse Button\n\ + [span_bold("Deconstruct / Delete / Downgrade")] -> Right Mouse Button\n\ + [span_bold("R-Window")] -> Left Mouse Button + Ctrl\n\ + [span_bold("Airlock")] -> Left Mouse Button + Alt \n\ + \n\ + Use the button in the upper left corner to change the direction of built objects.")) + ) /datum/buildmode_mode/basic/handle_click(client/c, params, obj/object) var/list/modifiers = params2list(params) diff --git a/code/modules/buildmode/submodes/boom.dm b/code/modules/buildmode/submodes/boom.dm index 2fcb6ed5c0ea7..727d001f5cab4 100644 --- a/code/modules/buildmode/submodes/boom.dm +++ b/code/modules/buildmode/submodes/boom.dm @@ -12,14 +12,15 @@ BOOM_HEAVY = 0, BOOM_LIGHT = 0, BOOM_FLASH = 0, - BOOM_FLAMES = 0 - ) - -/datum/buildmode_mode/boom/show_help(client/c) - to_chat(c, span_notice("***********************************************************")) - to_chat(c, span_notice("Mouse Button on obj = Kaboom")) - to_chat(c, span_notice("NOTE: Using the \"Config/Launch Supplypod\" verb allows you to do this in an IC way (i.e., making a cruise missile come down from the sky and explode wherever you click!)")) - to_chat(c, span_notice("***********************************************************")) + BOOM_FLAMES = 0, + ) + +/datum/buildmode_mode/boom/show_help(client/builder) + to_chat(builder, span_purple(examine_block( + "[span_bold("Set explosion destructiveness")] -> Right Mouse Button on buildmode button\n\ + [span_bold("Kaboom")] -> Mouse Button on obj\n\n\ + [span_warning("NOTE:")] Using the \"Config/Launch Supplypod\" verb allows you to do this in an IC way (i.e., making a cruise missile come down from the sky and explode wherever you click!)")) + ) /datum/buildmode_mode/boom/change_settings(client/c) for (var/explosion_level in explosions) diff --git a/code/modules/buildmode/submodes/copy.dm b/code/modules/buildmode/submodes/copy.dm index 9effd1d9c304a..88a1160a8a8fb 100644 --- a/code/modules/buildmode/submodes/copy.dm +++ b/code/modules/buildmode/submodes/copy.dm @@ -6,11 +6,11 @@ stored = null return ..() -/datum/buildmode_mode/copy/show_help(client/c) - to_chat(c, span_notice("***********************************************************")) - to_chat(c, span_notice("Left Mouse Button on obj/turf/mob = Spawn a Copy of selected target")) - to_chat(c, span_notice("Right Mouse Button on obj/mob = Select target to copy")) - to_chat(c, span_notice("***********************************************************")) +/datum/buildmode_mode/copy/show_help(client/builder) + to_chat(builder, span_purple(examine_block( + "[span_bold("Spawn a copy of selected target")] -> Left Mouse Button on obj/turf/mob\n\ + [span_bold("Select target to copy")] -> Right Mouse Button on obj/mob")) + ) /datum/buildmode_mode/copy/handle_click(client/c, params, obj/object) var/list/modifiers = params2list(params) diff --git a/code/modules/buildmode/submodes/delete.dm b/code/modules/buildmode/submodes/delete.dm index 93793f932f72a..7bb1a1472c0c5 100644 --- a/code/modules/buildmode/submodes/delete.dm +++ b/code/modules/buildmode/submodes/delete.dm @@ -1,11 +1,11 @@ /datum/buildmode_mode/delete key = "delete" -/datum/buildmode_mode/delete/show_help(client/c) - to_chat(c, "***********************************************************\n\ - Left Mouse Button on anything to delete it. If you break it, you buy it.\n\ - Right Mouse Button on anything to delete everything of the type. Probably don\'t do this unless you know what you are doing.\n\ - ***********************************************************") +/datum/buildmode_mode/delete/show_help(client/builder) + to_chat(builder, span_purple(examine_block( + "[span_bold("Delete an object")] -> Left Mouse Button on obj/turf/mob\n\ + [span_bold("Delete all objects of a type")] -> Right Mouse Button on obj/turf/mob")) + ) /datum/buildmode_mode/delete/handle_click(client/c, params, object) var/list/modifiers = params2list(params) diff --git a/code/modules/buildmode/submodes/fill.dm b/code/modules/buildmode/submodes/fill.dm index b07e3d0955426..e2bd3a5c16ad5 100644 --- a/code/modules/buildmode/submodes/fill.dm +++ b/code/modules/buildmode/submodes/fill.dm @@ -6,12 +6,12 @@ use_corner_selection = TRUE var/atom/objholder = null -/datum/buildmode_mode/fill/show_help(client/c) - to_chat(c, span_notice("***********************************************************")) - to_chat(c, span_notice("Left Mouse Button on turf/obj/mob = Select corner")) - to_chat(c, span_notice("Left Mouse Button + Alt on turf/obj/mob = Delete region")) - to_chat(c, span_notice("Right Mouse Button on buildmode button = Select object type")) - to_chat(c, span_notice("***********************************************************")) +/datum/buildmode_mode/fill/show_help(client/builder) + to_chat(builder, span_purple(examine_block( + "[span_bold("Select corner")] -> Left Mouse Button on turf/obj/mob\n\ + [span_bold("Delete region")] -> Left Mouse Button + Alt on turf/obj/mob\n\ + [span_bold("Select object type")] -> Right Mouse Button on buildmode button")) + ) /datum/buildmode_mode/fill/change_settings(client/c) var/target_path = input(c, "Enter typepath:" ,"Typepath","/obj/structure/closet") @@ -25,6 +25,7 @@ objholder = null tgui_alert(usr,"Area paths are not supported for this mode, use the area edit mode instead.") return + BM.preview_selected_item(objholder) deselect_region() /datum/buildmode_mode/fill/handle_click(client/c, params, obj/object) diff --git a/code/modules/buildmode/submodes/mapgen.dm b/code/modules/buildmode/submodes/mapgen.dm index 2cd575412558a..102660425c874 100644 --- a/code/modules/buildmode/submodes/mapgen.dm +++ b/code/modules/buildmode/submodes/mapgen.dm @@ -4,11 +4,11 @@ use_corner_selection = TRUE var/generator_path -/datum/buildmode_mode/mapgen/show_help(client/c) - to_chat(c, span_notice("***********************************************************")) - to_chat(c, span_notice("Left Mouse Button on turf/obj/mob = Select corner")) - to_chat(c, span_notice("Right Mouse Button on buildmode button = Select generator")) - to_chat(c, span_notice("***********************************************************")) +/datum/buildmode_mode/mapgen/show_help(client/builder) + to_chat(builder, span_purple(examine_block( + "[span_bold("Select corner")] -> Left Mouse Button on turf/obj/mob\n\ + [span_bold("Select generator")] -> Right Mouse Button on buildmode button")) + ) /datum/buildmode_mode/mapgen/change_settings(client/c) var/list/gen_paths = subtypesof(/datum/map_generator) diff --git a/code/modules/buildmode/submodes/outfit.dm b/code/modules/buildmode/submodes/outfit.dm index 1c36ab4ae2eef..5f8e3319cb95d 100644 --- a/code/modules/buildmode/submodes/outfit.dm +++ b/code/modules/buildmode/submodes/outfit.dm @@ -6,12 +6,12 @@ dressuptime = null return ..() -/datum/buildmode_mode/outfit/show_help(client/c) - to_chat(c, "***********************************************************\n\ - Right Mouse Button on buildmode button = Select outfit to equip.\n\ - Left Mouse Button on mob/living/carbon/human = Equip the selected outfit.\n\ - Right Mouse Button on mob/living/carbon/human = Strip and delete current outfit.\n\ - ***********************************************************") +/datum/buildmode_mode/outfit/show_help(client/builder) + to_chat(builder, span_purple(examine_block( + "[span_bold("Select outfit to equip")] -> Right Mouse Button on buildmode button\n\ + [span_bold("Equip the selected outfit")] -> Left Mouse Button on mob/living/carbon/human\n\ + [span_bold("Strip and delete current outfit")] -> Right Mouse Button on mob/living/carbon/human")) + ) /datum/buildmode_mode/outfit/Reset() . = ..() @@ -32,11 +32,11 @@ to_chat(c, span_warning("Pick an outfit first.")) return - for (var/item in dollie.get_equipped_items(TRUE)) + for (var/item in dollie.get_equipped_items(include_pockets = TRUE)) qdel(item) if(dressuptime != "Naked") dollie.equipOutfit(dressuptime) if(LAZYACCESS(modifiers, RIGHT_CLICK)) - for (var/item in dollie.get_equipped_items(TRUE)) + for (var/item in dollie.get_equipped_items(include_pockets = TRUE)) qdel(item) diff --git a/code/modules/buildmode/submodes/proccall.dm b/code/modules/buildmode/submodes/proccall.dm index d969108121c21..5395ec77c6579 100644 --- a/code/modules/buildmode/submodes/proccall.dm +++ b/code/modules/buildmode/submodes/proccall.dm @@ -5,11 +5,11 @@ ///The list of arguments for the procedure. They may not be. They are selected in the same way in the game, and can be a datum, and other types. var/list/proc_args = null -/datum/buildmode_mode/proccall/show_help(client/target_client) - to_chat(target_client, span_notice("***********************************************************\n\ - Right Mouse Button on buildmode button = Choose procedure and arguments\n\ - Left Mouse Button on machinery = Apply procedure on object.\n\ - ***********************************************************")) +/datum/buildmode_mode/proccall/show_help(client/builder) + to_chat(builder, span_purple(examine_block( + "[span_bold("Choose procedure and arguments")] -> Right Mouse Button on buildmode button\n\ + [span_bold("Apply procedure on object")] -> Left Mouse Button on machinery")) + ) /datum/buildmode_mode/proccall/change_settings(client/target_client) if(!check_rights_for(target_client, R_DEBUG)) diff --git a/code/modules/buildmode/submodes/smite.dm b/code/modules/buildmode/submodes/smite.dm index f6778a6bc0f97..1ea5f415e35f3 100644 --- a/code/modules/buildmode/submodes/smite.dm +++ b/code/modules/buildmode/submodes/smite.dm @@ -6,11 +6,11 @@ selected_smite = null return ..() -/datum/buildmode_mode/smite/show_help(client/user) - to_chat(user, "***********************************************************\n\ - Right Mouse Button on buildmode button = Select smite to use.\n\ - Left Mouse Button on mob/living = Smite the mob.\n\ - ***********************************************************") +/datum/buildmode_mode/smite/show_help(client/builder) + to_chat(builder, span_purple(examine_block( + "[span_bold("Select smite to use")] -> Right Mouse Button on buildmode button\n\ + [span_bold("Smite the mob")] -> Left Mouse Button on mob/living")) + ) /datum/buildmode_mode/smite/change_settings(client/user) var/punishment = input(user, "Choose a punishment", "DIVINE SMITING") as null|anything in GLOB.smites diff --git a/code/modules/buildmode/submodes/throwing.dm b/code/modules/buildmode/submodes/throwing.dm index ce39906319d32..587bf456e2a0c 100644 --- a/code/modules/buildmode/submodes/throwing.dm +++ b/code/modules/buildmode/submodes/throwing.dm @@ -7,11 +7,11 @@ throw_atom = null return ..() -/datum/buildmode_mode/throwing/show_help(client/c) - to_chat(c, span_notice("***********************************************************")) - to_chat(c, span_notice("Left Mouse Button on turf/obj/mob = Select")) - to_chat(c, span_notice("Right Mouse Button on turf/obj/mob = Throw")) - to_chat(c, span_notice("***********************************************************")) +/datum/buildmode_mode/throwing/show_help(client/builder) + to_chat(builder, span_purple(examine_block( + "[span_bold("Select")] -> Left Mouse Button on turf/obj/mob\n\ + [span_bold("Throw")] -> Right Mouse Button on turf/obj/mob")) + ) /datum/buildmode_mode/throwing/handle_click(client/c, params, obj/object) var/list/modifiers = params2list(params) diff --git a/code/modules/buildmode/submodes/tweakcomps.dm b/code/modules/buildmode/submodes/tweakcomps.dm index 091178a37be04..89f233f9687b9 100644 --- a/code/modules/buildmode/submodes/tweakcomps.dm +++ b/code/modules/buildmode/submodes/tweakcomps.dm @@ -3,11 +3,11 @@ /// This variable is responsible for the rating of the components themselves. Literally tiers of components, where 1 is standard, 4 is bluespace. var/rating = null -/datum/buildmode_mode/tweakcomps/show_help(client/target_client) - to_chat(target_client, span_notice("***********************************************************\n\ - Right Mouse Button on buildmode button = Choose the rating of the components.\n\ - Left Mouse Button on machinery = Sets the chosen rating of the components on the machinery.\n\ - ***********************************************************")) +/datum/buildmode_mode/tweakcomps/show_help(client/builder) + to_chat(builder, span_purple(examine_block( + "[span_bold("Choose the rating of the components")] -> Right Mouse Button on buildmode button\n\ + [span_bold("Sets the chosen rating of the components on the machinery")] -> Left Mouse Button on machinery")) + ) /datum/buildmode_mode/tweakcomps/change_settings(client/target_client) var/rating_to_choose = input(target_client, "Enter number of rating", "Number", "1") diff --git a/code/modules/buildmode/submodes/variable_edit.dm b/code/modules/buildmode/submodes/variable_edit.dm index cbbbeb2eebb58..f132cd196ce71 100644 --- a/code/modules/buildmode/submodes/variable_edit.dm +++ b/code/modules/buildmode/submodes/variable_edit.dm @@ -9,12 +9,12 @@ valueholder = null return ..() -/datum/buildmode_mode/varedit/show_help(client/c) - to_chat(c, span_notice("***********************************************************")) - to_chat(c, span_notice("Right Mouse Button on buildmode button = Select var(type) & value")) - to_chat(c, span_notice("Left Mouse Button on turf/obj/mob = Set var(type) & value")) - to_chat(c, span_notice("Right Mouse Button on turf/obj/mob = Reset var's value")) - to_chat(c, span_notice("***********************************************************")) +/datum/buildmode_mode/varedit/show_help(client/builder) + to_chat(builder, span_purple(examine_block( + "[span_bold("Select var(type) & value")] -> Right Mouse Button on buildmode button\n\ + [span_bold("Set var(type) & value")] -> Left Mouse Button on turf/obj/mob\n\ + [span_bold("Reset var's value")] -> Right Mouse Button on turf/obj/mob")) + ) /datum/buildmode_mode/varedit/Reset() . = ..() diff --git a/code/modules/capture_the_flag/ctf_classes.dm b/code/modules/capture_the_flag/ctf_classes.dm index 95a61bcf64f0e..0482bd1ec88eb 100644 --- a/code/modules/capture_the_flag/ctf_classes.dm +++ b/code/modules/capture_the_flag/ctf_classes.dm @@ -74,7 +74,7 @@ r_pocket = /obj/item/ammo_box/magazine/recharge/ctf/shotgun belt = null icon_state = "ctf_assaulter" - class_description = "Close combat class. Armed with a shotgun and rocket gloves." + class_description = "Close combat class. Armed with a shotgun and rocket gloves. Has significantly lower shield values due to higher moving speed." /datum/outfit/ctf/marksman name = "CTF Marksman (Solo)" @@ -83,7 +83,7 @@ r_pocket = /obj/item/ammo_box/magazine/recharge/ctf/marksman belt = null icon_state = "ctf_marksman" - class_description = "Long range class. Armed with a hitscan laser rifle." + class_description = "Long range class. Armed with a hitscan laser rifle with a scope." // RED TEAM CLASSES diff --git a/code/modules/capture_the_flag/ctf_controller.dm b/code/modules/capture_the_flag/ctf_controller.dm index ed8ef6525349f..8e51f8ef73332 100644 --- a/code/modules/capture_the_flag/ctf_controller.dm +++ b/code/modules/capture_the_flag/ctf_controller.dm @@ -48,7 +48,7 @@ for(var/team in teams) var/obj/machinery/ctf/spawner/spawner = teams[team].spawner notify_ghosts("[spawner.name] has been activated!", source = spawner, action = NOTIFY_ORBIT, header = "CTF has been activated") - + /datum/ctf_controller/proc/stop_ctf() ctf_enabled = FALSE clear_control_points() @@ -115,7 +115,7 @@ if(user.ckey in enemy_team_members) to_chat(user, span_warning("No switching teams while the round is going!")) return FALSE - if(friendly_team_members.len > enemy_team_members.len) + else if(friendly_team_members.len > enemy_team_members.len) to_chat(user, span_warning("[team_color] has more team members than [team]! Try joining [team] team to even things up.")) return FALSE return TRUE @@ -208,7 +208,7 @@ var/datum/component/ctf_player/ctf_player = team_members[player] ctf_player.end_game() return ..() - + ///Increases this teams number of points by the provided amount. /datum/ctf_team/proc/score_points(points_scored) points += points_scored diff --git a/code/modules/capture_the_flag/ctf_equipment.dm b/code/modules/capture_the_flag/ctf_equipment.dm index 3e84339889341..5ec412f9017e9 100644 --- a/code/modules/capture_the_flag/ctf_equipment.dm +++ b/code/modules/capture_the_flag/ctf_equipment.dm @@ -1,4 +1,3 @@ - // GENERIC PROJECTILE /obj/projectile/beam/ctf @@ -20,24 +19,23 @@ return BULLET_ACT_HIT /obj/item/ammo_box/magazine/recharge/ctf - ammo_type = /obj/item/ammo_casing/caseless/laser/ctf + ammo_type = /obj/item/ammo_casing/laser/ctf /obj/item/ammo_box/magazine/recharge/ctf/Initialize(mapload) . = ..() AddElement(/datum/element/delete_on_drop) - -/obj/item/ammo_casing/caseless/laser/ctf +/obj/item/ammo_casing/laser/ctf projectile_type = /obj/projectile/beam/ctf/ -/obj/item/ammo_casing/caseless/laser/ctf/Initialize(mapload) +/obj/item/ammo_casing/laser/ctf/Initialize(mapload) . = ..() AddElement(/datum/element/delete_on_drop) // LASER RIFLE /obj/item/gun/ballistic/automatic/laser/ctf - mag_type = /obj/item/ammo_box/magazine/recharge/ctf/rifle + accepted_magazine_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 @@ -47,15 +45,12 @@ . = ..() AddElement(/datum/element/delete_on_drop) - /obj/item/ammo_box/magazine/recharge/ctf/rifle - ammo_type = /obj/item/ammo_casing/caseless/laser/ctf/rifle + ammo_type = /obj/item/ammo_casing/laser/ctf/rifle - -/obj/item/ammo_casing/caseless/laser/ctf/rifle +/obj/item/ammo_casing/laser/ctf/rifle projectile_type = /obj/projectile/beam/ctf/rifle - /obj/projectile/beam/ctf/rifle damage = 45 light_color = LIGHT_COLOR_BLUE @@ -70,7 +65,7 @@ inhand_icon_state = "shotgun_combat" worn_icon_state = "gun" slot_flags = null - mag_type = /obj/item/ammo_box/magazine/recharge/ctf/shotgun + accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/shotgun empty_indicator = TRUE fire_sound = 'sound/weapons/gun/shotgun/shot_alt.ogg' semi_auto = TRUE @@ -82,16 +77,14 @@ AddElement(/datum/element/delete_on_drop) /obj/item/ammo_box/magazine/recharge/ctf/shotgun - ammo_type = /obj/item/ammo_casing/caseless/laser/ctf/shotgun + ammo_type = /obj/item/ammo_casing/laser/ctf/shotgun max_ammo = 6 - -/obj/item/ammo_casing/caseless/laser/ctf/shotgun +/obj/item/ammo_casing/laser/ctf/shotgun projectile_type = /obj/projectile/beam/ctf/shotgun pellets = 6 variance = 25 - /obj/projectile/beam/ctf/shotgun damage = 15 light_color = LIGHT_COLOR_BLUE @@ -103,14 +96,18 @@ name = "designated marksman rifle" icon_state = "ctfmarksman" inhand_icon_state = "ctfmarksman" - mag_type = /obj/item/ammo_box/magazine/recharge/ctf/marksman + accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/marksman fire_delay = 1 SECONDS +/obj/item/gun/ballistic/automatic/laser/ctf/marksman/Initialize(mapload) + . = ..() + AddComponent(/datum/component/scope, range_modifier = 1.7) + /obj/item/ammo_box/magazine/recharge/ctf/marksman - ammo_type = /obj/item/ammo_casing/caseless/laser/ctf/marksman + ammo_type = /obj/item/ammo_casing/laser/ctf/marksman max_ammo = 10 -/obj/item/ammo_casing/caseless/laser/ctf/marksman +/obj/item/ammo_casing/laser/ctf/marksman projectile_type = /obj/projectile/beam/ctf/marksman /obj/projectile/beam/ctf/marksman @@ -125,22 +122,19 @@ /obj/item/gun/ballistic/automatic/pistol/deagle/ctf desc = "This looks like it could really hurt in melee." force = 75 - mag_type = /obj/item/ammo_box/magazine/recharge/ctf/deagle + accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/deagle /obj/item/gun/ballistic/automatic/pistol/deagle/ctf/Initialize(mapload) . = ..() AddElement(/datum/element/delete_on_drop) - /obj/item/ammo_box/magazine/recharge/ctf/deagle - ammo_type = /obj/item/ammo_casing/caseless/laser/ctf/deagle + ammo_type = /obj/item/ammo_casing/laser/ctf/deagle max_ammo = 7 - -/obj/item/ammo_casing/caseless/laser/ctf/deagle +/obj/item/ammo_casing/laser/ctf/deagle projectile_type = /obj/projectile/beam/ctf/deagle - /obj/projectile/beam/ctf/deagle icon_state = "bullet" damage = 60 @@ -201,13 +195,13 @@ armor_type = /datum/armor/none allowed = null greyscale_config = /datum/greyscale_config/ctf_standard - greyscale_config_worn = /datum/greyscale_config/ctf_standard_worn + greyscale_config_worn = /datum/greyscale_config/ctf_standard/worn greyscale_colors = "#ffffff" ///Icon state to be fed into the shielded component var/team_shield_icon = "shield-old" var/max_charges = 150 - var/recharge_start_delay = 20 SECONDS + var/recharge_start_delay = 12 SECONDS var/charge_increment_delay = 1 SECONDS var/charge_recovery = 30 var/lose_multiple_charges = TRUE @@ -227,21 +221,20 @@ desc = "Lightweight vest for playing capture the flag." icon_state = "light" greyscale_config = /datum/greyscale_config/ctf_light - greyscale_config_worn = /datum/greyscale_config/ctf_light_worn + greyscale_config_worn = /datum/greyscale_config/ctf_light/worn slowdown = -0.25 - max_charges = 30 // RED TEAM GUNS // Rifle /obj/item/gun/ballistic/automatic/laser/ctf/red - mag_type = /obj/item/ammo_box/magazine/recharge/ctf/rifle/red + accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/rifle/red /obj/item/ammo_box/magazine/recharge/ctf/rifle/red - ammo_type = /obj/item/ammo_casing/caseless/laser/ctf/rifle/red + ammo_type = /obj/item/ammo_casing/laser/ctf/rifle/red -/obj/item/ammo_casing/caseless/laser/ctf/rifle/red +/obj/item/ammo_casing/laser/ctf/rifle/red projectile_type = /obj/projectile/beam/ctf/rifle/red /obj/projectile/beam/ctf/rifle/red @@ -249,15 +242,14 @@ light_color = COLOR_SOFT_RED impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser - // Shotgun /obj/item/gun/ballistic/shotgun/ctf/red - mag_type = /obj/item/ammo_box/magazine/recharge/ctf/shotgun/red + accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/shotgun/red /obj/item/ammo_box/magazine/recharge/ctf/shotgun/red - ammo_type = /obj/item/ammo_casing/caseless/laser/ctf/shotgun/red + ammo_type = /obj/item/ammo_casing/laser/ctf/shotgun/red -/obj/item/ammo_casing/caseless/laser/ctf/shotgun/red +/obj/item/ammo_casing/laser/ctf/shotgun/red projectile_type = /obj/projectile/beam/ctf/shotgun/red /obj/projectile/beam/ctf/shotgun/red @@ -265,15 +257,14 @@ light_color = COLOR_SOFT_RED impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser - // DMR /obj/item/gun/ballistic/automatic/laser/ctf/marksman/red - mag_type = /obj/item/ammo_box/magazine/recharge/ctf/marksman/red + accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/marksman/red /obj/item/ammo_box/magazine/recharge/ctf/marksman/red - ammo_type = /obj/item/ammo_casing/caseless/laser/ctf/marksman/red + ammo_type = /obj/item/ammo_casing/laser/ctf/marksman/red -/obj/item/ammo_casing/caseless/laser/ctf/marksman/red +/obj/item/ammo_casing/laser/ctf/marksman/red projectile_type = /obj/projectile/beam/ctf/marksman/red /obj/projectile/beam/ctf/marksman/red @@ -282,7 +273,6 @@ muzzle_type = /obj/effect/projectile/muzzle/laser impact_type = /obj/effect/projectile/impact/laser - // Instakill /obj/item/gun/energy/laser/instakill/ctf/red desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit. This one has a red design." @@ -302,12 +292,12 @@ // Rifle /obj/item/gun/ballistic/automatic/laser/ctf/blue - mag_type = /obj/item/ammo_box/magazine/recharge/ctf/rifle/blue + accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/rifle/blue /obj/item/ammo_box/magazine/recharge/ctf/rifle/blue - ammo_type = /obj/item/ammo_casing/caseless/laser/ctf/rifle/blue + ammo_type = /obj/item/ammo_casing/laser/ctf/rifle/blue -/obj/item/ammo_casing/caseless/laser/ctf/rifle/blue +/obj/item/ammo_casing/laser/ctf/rifle/blue projectile_type = /obj/projectile/beam/ctf/rifle/blue /obj/projectile/beam/ctf/rifle/blue @@ -316,32 +306,30 @@ // Shotgun /obj/item/gun/ballistic/shotgun/ctf/blue - mag_type = /obj/item/ammo_box/magazine/recharge/ctf/shotgun/blue + accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/shotgun/blue /obj/item/ammo_box/magazine/recharge/ctf/shotgun/blue - ammo_type = /obj/item/ammo_casing/caseless/laser/ctf/shotgun/blue + ammo_type = /obj/item/ammo_casing/laser/ctf/shotgun/blue -/obj/item/ammo_casing/caseless/laser/ctf/shotgun/blue +/obj/item/ammo_casing/laser/ctf/shotgun/blue projectile_type = /obj/projectile/beam/ctf/shotgun/blue /obj/projectile/beam/ctf/shotgun/blue icon_state = "bluelaser" impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser - // DMR /obj/item/gun/ballistic/automatic/laser/ctf/marksman/blue - mag_type = /obj/item/ammo_box/magazine/recharge/ctf/marksman/blue + accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/marksman/blue /obj/item/ammo_box/magazine/recharge/ctf/marksman/blue - ammo_type = /obj/item/ammo_casing/caseless/laser/ctf/marksman/blue + ammo_type = /obj/item/ammo_casing/laser/ctf/marksman/blue -/obj/item/ammo_casing/caseless/laser/ctf/marksman/blue +/obj/item/ammo_casing/laser/ctf/marksman/blue projectile_type = /obj/projectile/beam/ctf/marksman/blue /obj/projectile/beam/ctf/marksman/blue - // Instakill /obj/item/gun/energy/laser/instakill/ctf/blue desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit. This one has a blue design." @@ -361,12 +349,12 @@ // Rifle /obj/item/gun/ballistic/automatic/laser/ctf/green - mag_type = /obj/item/ammo_box/magazine/recharge/ctf/rifle/green + accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/rifle/green /obj/item/ammo_box/magazine/recharge/ctf/rifle/green - ammo_type = /obj/item/ammo_casing/caseless/laser/ctf/rifle/green + ammo_type = /obj/item/ammo_casing/laser/ctf/rifle/green -/obj/item/ammo_casing/caseless/laser/ctf/rifle/green +/obj/item/ammo_casing/laser/ctf/rifle/green projectile_type = /obj/projectile/beam/ctf/rifle/green /obj/projectile/beam/ctf/rifle/green @@ -374,15 +362,14 @@ light_color = COLOR_VERY_PALE_LIME_GREEN impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser - // Shotgun /obj/item/gun/ballistic/shotgun/ctf/green - mag_type = /obj/item/ammo_box/magazine/recharge/ctf/shotgun/green + accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/shotgun/green /obj/item/ammo_box/magazine/recharge/ctf/shotgun/green - ammo_type = /obj/item/ammo_casing/caseless/laser/ctf/shotgun/green + ammo_type = /obj/item/ammo_casing/laser/ctf/shotgun/green -/obj/item/ammo_casing/caseless/laser/ctf/shotgun/green +/obj/item/ammo_casing/laser/ctf/shotgun/green projectile_type = /obj/projectile/beam/ctf/shotgun/green /obj/projectile/beam/ctf/shotgun/green @@ -390,15 +377,14 @@ light_color = COLOR_VERY_PALE_LIME_GREEN impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser - // DMR /obj/item/gun/ballistic/automatic/laser/ctf/marksman/green - mag_type = /obj/item/ammo_box/magazine/recharge/ctf/marksman/green + accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/marksman/green /obj/item/ammo_box/magazine/recharge/ctf/marksman/green - ammo_type = /obj/item/ammo_casing/caseless/laser/ctf/marksman/green + ammo_type = /obj/item/ammo_casing/laser/ctf/marksman/green -/obj/item/ammo_casing/caseless/laser/ctf/marksman/green +/obj/item/ammo_casing/laser/ctf/marksman/green projectile_type = /obj/projectile/beam/ctf/marksman/green /obj/projectile/beam/ctf/marksman/green @@ -407,7 +393,6 @@ muzzle_type = /obj/effect/projectile/muzzle/xray impact_type = /obj/effect/projectile/impact/xray - // Instakill /obj/item/gun/energy/laser/instakill/ctf/green desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit. This one has a green design." @@ -427,12 +412,12 @@ // Rifle /obj/item/gun/ballistic/automatic/laser/ctf/yellow - mag_type = /obj/item/ammo_box/magazine/recharge/ctf/rifle/yellow + accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/rifle/yellow /obj/item/ammo_box/magazine/recharge/ctf/rifle/yellow - ammo_type = /obj/item/ammo_casing/caseless/laser/ctf/rifle/yellow + ammo_type = /obj/item/ammo_casing/laser/ctf/rifle/yellow -/obj/item/ammo_casing/caseless/laser/ctf/rifle/yellow +/obj/item/ammo_casing/laser/ctf/rifle/yellow projectile_type = /obj/projectile/beam/ctf/rifle/yellow /obj/projectile/beam/ctf/rifle/yellow @@ -440,15 +425,14 @@ light_color = COLOR_VERY_SOFT_YELLOW impact_effect_type = /obj/effect/temp_visual/impact_effect/yellow_laser - // Shotgun /obj/item/gun/ballistic/shotgun/ctf/yellow - mag_type = /obj/item/ammo_box/magazine/recharge/ctf/shotgun/yellow + accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/shotgun/yellow /obj/item/ammo_box/magazine/recharge/ctf/shotgun/yellow - ammo_type = /obj/item/ammo_casing/caseless/laser/ctf/shotgun/yellow + ammo_type = /obj/item/ammo_casing/laser/ctf/shotgun/yellow -/obj/item/ammo_casing/caseless/laser/ctf/shotgun/yellow +/obj/item/ammo_casing/laser/ctf/shotgun/yellow projectile_type = /obj/projectile/beam/ctf/shotgun/yellow /obj/projectile/beam/ctf/shotgun/yellow @@ -456,15 +440,14 @@ light_color = COLOR_VERY_SOFT_YELLOW impact_effect_type = /obj/effect/temp_visual/impact_effect/yellow_laser - // DMR /obj/item/gun/ballistic/automatic/laser/ctf/marksman/yellow - mag_type = /obj/item/ammo_box/magazine/recharge/ctf/marksman/yellow + accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/marksman/yellow /obj/item/ammo_box/magazine/recharge/ctf/marksman/yellow - ammo_type = /obj/item/ammo_casing/caseless/laser/ctf/marksman/yellow + ammo_type = /obj/item/ammo_casing/laser/ctf/marksman/yellow -/obj/item/ammo_casing/caseless/laser/ctf/marksman/yellow +/obj/item/ammo_casing/laser/ctf/marksman/yellow projectile_type = /obj/projectile/beam/ctf/marksman/yellow /obj/projectile/beam/ctf/marksman/yellow @@ -473,7 +456,6 @@ muzzle_type = /obj/effect/projectile/muzzle/solar impact_type = /obj/effect/projectile/impact/solar - // Instakill /obj/item/gun/energy/laser/instakill/ctf/yellow desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit. This one has a yellow design." diff --git a/code/modules/capture_the_flag/ctf_game.dm b/code/modules/capture_the_flag/ctf_game.dm index 84e5d35264ce3..4ab831f706094 100644 --- a/code/modules/capture_the_flag/ctf_game.dm +++ b/code/modules/capture_the_flag/ctf_game.dm @@ -135,7 +135,7 @@ var/datum/outfit/ctf/class = ctf_gear[key] var/datum/radial_menu_choice/option = new option.image = image(icon = initial(class.icon), icon_state = initial(class.icon_state)) - option.info = "[initial(class.class_description)]" + option.info = span_boldnotice("[initial(class.class_description)]") display_classes[key] = option sort_list(display_classes) @@ -256,9 +256,19 @@ anchored = TRUE // Avoid directly assigning to anchored and prefer to use set_anchored() on normal circumstances. return //passing means the user picked up the flag so we can now apply this + to_chat(user, span_userdanger("Take \the [initial(name)] to your team's controller!")) user.set_anchored(TRUE) user.status_flags &= ~CANPUSH +/obj/item/ctf_flag/attackby(obj/item/item, mob/user, params) + if(!istype(item, /obj/item/ctf_flag)) + return ..() + + var/obj/item/ctf_flag/flag = item + if(flag.team != team) + to_chat(user, span_userdanger("Take \the [initial(flag.name)] to your team's controller!")) + user.playsound_local(get_turf(user), 'sound/machines/buzz-sigh.ogg', 100, vary = FALSE, use_reverb = FALSE) + /obj/item/ctf_flag/dropped(mob/user) ..() user.anchored = FALSE // Hacky usage that bypasses set_anchored() @@ -424,7 +434,7 @@ /obj/effect/ctf/dead_barricade name = "dead barrier" desc = "It provided cover in fire fights. And now it's gone." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/structures.dmi' icon_state = "barrier0" var/game_id = CTF_GHOST_CTF_GAME_ID var/datum/ctf_controller/ctf_game diff --git a/code/modules/capture_the_flag/ctf_player_component.dm b/code/modules/capture_the_flag/ctf_player_component.dm index 0bf37b979dea1..d3abc0f2571cc 100644 --- a/code/modules/capture_the_flag/ctf_player_component.dm +++ b/code/modules/capture_the_flag/ctf_player_component.dm @@ -8,7 +8,7 @@ var/can_respawn = TRUE ///Reference to the game this player is participating in. var/datum/ctf_controller/ctf_game - ///Item dropped on death, + ///Item dropped on death, var/death_drop = /obj/effect/powerup/ammo/ctf ///Reference to players ckey, used for sending messages to them relating to CTF. var/ckey_reference @@ -22,19 +22,20 @@ var/datum/mind/true_parent = parent player_mob = true_parent.current ckey_reference = player_mob.ckey - setup_dusting() - + register_mob() + /datum/component/ctf_player/PostTransfer() if(!istype(parent, /datum/mind)) return COMPONENT_INCOMPATIBLE var/datum/mind/true_parent = parent player_mob = true_parent.current - setup_dusting() + register_mob() -///CTF players are dusted upon taking damage that puts them into critical or leaving their body. -/datum/component/ctf_player/proc/setup_dusting() +/// Called when we get a new player mob, register signals and set up the mob. +/datum/component/ctf_player/proc/register_mob() RegisterSignal(player_mob, COMSIG_MOB_AFTER_APPLY_DAMAGE, PROC_REF(damage_type_check)) RegisterSignal(player_mob, COMSIG_MOB_GHOSTIZED, PROC_REF(ctf_dust)) + ADD_TRAIT(player_mob, TRAIT_PERMANENTLY_MORTAL, CTF_TRAIT) ///Stamina and oxygen damage will not dust a player by themself. /datum/component/ctf_player/proc/damage_type_check(datum/source, damage, damage_type) diff --git a/code/modules/cards/cardhand.dm b/code/modules/cards/cardhand.dm index b03a29a43f482..9dab4e65b584b 100644 --- a/code/modules/cards/cardhand.dm +++ b/code/modules/cards/cardhand.dm @@ -29,7 +29,7 @@ /obj/item/toy/cards/cardhand/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) + if(HAS_TRAIT(dealer_deck, TRAIT_WIELDED)) context[SCREENTIP_CONTEXT_LMB] = "Deal card" context[SCREENTIP_CONTEXT_RMB] = "Deal card faceup" return CONTEXTUAL_SCREENTIP_SET @@ -77,7 +77,7 @@ if(istype(weapon, /obj/item/toy/cards/deck)) var/obj/item/toy/cards/deck/dealer_deck = weapon - if(!dealer_deck.wielded) // recycle cardhand into deck (if unwielded) + if(!HAS_TRAIT(dealer_deck, TRAIT_WIELDED)) // recycle cardhand into deck (if unwielded) dealer_deck.insert(src) user.balloon_alert_to_viewers("puts card in deck") return diff --git a/code/modules/cards/deck/deck.dm b/code/modules/cards/deck/deck.dm index 189d88822ecfb..632b01d509d74 100644 --- a/code/modules/cards/deck/deck.dm +++ b/code/modules/cards/deck/deck.dm @@ -21,8 +21,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,8 +31,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() @@ -51,18 +47,6 @@ for(var/person in list("Jack", "Queen", "King")) initial_cards += "[person] of [suit]" -/// triggered on wield of two handed item -/obj/item/toy/cards/deck/proc/on_wield(obj/item/source, mob/user) - SIGNAL_HANDLER - - wielded = TRUE - -/// triggered on unwield of two handed item -/obj/item/toy/cards/deck/proc/on_unwield(obj/item/source, mob/user) - SIGNAL_HANDLER - - wielded = FALSE - /obj/item/toy/cards/deck/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] is slitting [user.p_their()] wrists with \the [src]! It looks like their luck ran out!")) playsound(src, 'sound/items/cardshuffle.ogg', 50, TRUE) @@ -87,7 +71,7 @@ /obj/item/toy/cards/deck/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) if(src == held_item) var/obj/item/toy/cards/deck/dealer_deck = held_item - context[SCREENTIP_CONTEXT_LMB] = dealer_deck.wielded ? "Recycle mode" : "Dealer mode" + context[SCREENTIP_CONTEXT_LMB] = HAS_TRAIT(dealer_deck, TRAIT_WIELDED) ? "Recycle mode" : "Dealer mode" context[SCREENTIP_CONTEXT_ALT_LMB] = "Shuffle" return CONTEXTUAL_SCREENTIP_SET @@ -161,7 +145,7 @@ /obj/item/toy/cards/deck/AltClick(mob/living/user) if(user.can_perform_action(src, NEED_DEXTERITY|FORBID_TELEKINESIS_REACH)) - if(wielded) + if(HAS_TRAIT(src, TRAIT_WIELDED)) shuffle_cards(user) else to_chat(user, span_notice("You must hold the [src] with both hands to shuffle.")) diff --git a/code/modules/cards/deck/tarot.dm b/code/modules/cards/deck/tarot.dm index ced067c0c3979..3dcdc8608c640 100644 --- a/code/modules/cards/deck/tarot.dm +++ b/code/modules/cards/deck/tarot.dm @@ -36,8 +36,16 @@ /// ghost notification cooldown COOLDOWN_DECLARE(ghost_alert_cooldown) -/obj/item/toy/cards/deck/tarot/haunted/on_wield(obj/item/source, mob/living/carbon/user) +/obj/item/toy/cards/deck/tarot/haunted/Initialize(mapload) . = ..() + AddComponent( \ + /datum/component/two_handed, \ + attacksound = 'sound/items/cardflip.ogg', \ + wield_callback = CALLBACK(src, PROC_REF(on_wield)), \ + unwield_callback = CALLBACK(src, PROC_REF(on_unwield)), \ + ) + +/obj/item/toy/cards/deck/tarot/haunted/proc/on_wield(obj/item/source, mob/living/carbon/user) ADD_TRAIT(user, TRAIT_SIXTHSENSE, MAGIC_TRAIT) to_chat(user, span_notice("The veil to the underworld is opened. You can sense the dead souls calling out...")) @@ -54,15 +62,8 @@ action = NOTIFY_ORBIT, ) -/obj/item/toy/cards/deck/tarot/haunted/on_unwield(obj/item/source, mob/living/carbon/user) - . = ..() +/obj/item/toy/cards/deck/tarot/haunted/proc/on_unwield(obj/item/source, mob/living/carbon/user) REMOVE_TRAIT(user, TRAIT_SIXTHSENSE, MAGIC_TRAIT) to_chat(user, span_notice("The veil to the underworld closes shut. You feel your senses returning to normal.")) -/obj/item/toy/cards/deck/tarot/haunted/dropped(mob/living/carbon/user, silent) - . = ..() - if(wielded) - REMOVE_TRAIT(user, TRAIT_SIXTHSENSE, MAGIC_TRAIT) - to_chat(user, span_notice("The veil to the underworld closes shut. You feel your senses returning to normal.")) - #undef TAROT_GHOST_TIMER diff --git a/code/modules/cards/singlecard.dm b/code/modules/cards/singlecard.dm index b918d7708ca89..169715c51d909 100644 --- a/code/modules/cards/singlecard.dm +++ b/code/modules/cards/singlecard.dm @@ -78,7 +78,7 @@ if(istype(held_item, /obj/item/toy/cards/deck)) var/obj/item/toy/cards/deck/dealer_deck = held_item - if(dealer_deck.wielded) + if(HAS_TRAIT(dealer_deck, TRAIT_WIELDED)) context[SCREENTIP_CONTEXT_LMB] = "Deal card" context[SCREENTIP_CONTEXT_RMB] = "Deal card faceup" return CONTEXTUAL_SCREENTIP_SET @@ -151,7 +151,7 @@ if(istype(item, /obj/item/toy/cards/deck)) var/obj/item/toy/cards/deck/dealer_deck = item - if(!dealer_deck.wielded) // recycle card into deck (if unwielded) + if(!HAS_TRAIT(dealer_deck, TRAIT_WIELDED)) // recycle card into deck (if unwielded) dealer_deck.insert(src) user.balloon_alert_to_viewers("puts card in deck") return diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm index 2e9c81d3bb42c..da4a5daac4a7f 100644 --- a/code/modules/cargo/bounties/assistant.dm +++ b/code/modules/cargo/bounties/assistant.dm @@ -129,12 +129,6 @@ 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." diff --git a/code/modules/cargo/bounties/mech.dm b/code/modules/cargo/bounties/mech.dm index 4dc9a65b508a3..f946c0d6cd65b 100644 --- a/code/modules/cargo/bounties/mech.dm +++ b/code/modules/cargo/bounties/mech.dm @@ -13,12 +13,12 @@ /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) + wanted_types = list(/obj/vehicle/sealed/mecha/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) + wanted_types = list(/obj/vehicle/sealed/mecha/clarke = TRUE) /datum/bounty/item/mech/odysseus name = "Odysseus" diff --git a/code/modules/cargo/bounties/medical.dm b/code/modules/cargo/bounties/medical.dm index 4d6fd051bdb99..f9b367b12f06e 100644 --- a/code/modules/cargo/bounties/medical.dm +++ b/code/modules/cargo/bounties/medical.dm @@ -36,6 +36,8 @@ /obj/item/organ/internal/ears = TRUE, /obj/item/organ/internal/ears/cybernetic = FALSE, /obj/item/organ/internal/ears/cybernetic/upgraded = TRUE, + /obj/item/organ/internal/ears/cybernetic/whisper = TRUE, + /obj/item/organ/internal/ears/cybernetic/xray = TRUE, ) /datum/bounty/item/medical/liver diff --git a/code/modules/cargo/bounties/science.dm b/code/modules/cargo/bounties/science.dm index 1807c5ae56ff9..91d0d71bfc311 100644 --- a/code/modules/cargo/bounties/science.dm +++ b/code/modules/cargo/bounties/science.dm @@ -82,7 +82,7 @@ description = "Our big data division needs more powerful hardware to play 'Outbomb Cuban Pe-', err, to closely monitor threats in your sector. Send us a working modular computer console." reward = CARGO_CRATE_VALUE * 6 required_count = 1 - wanted_types = list(/obj/machinery/modular_computer/console = TRUE) + wanted_types = list(/obj/machinery/modular_computer = TRUE) require_powered = FALSE /datum/bounty/item/science/ntnet/console/applies_to(obj/O) diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm index 3b6fb267e6054..6f063e619652f 100644 --- a/code/modules/cargo/centcom_podlauncher.dm +++ b/code/modules/cargo/centcom_podlauncher.dm @@ -34,6 +34,7 @@ /obj/effect/particle_effect/sparks, /obj/effect/pod_landingzone, /obj/effect/client_image_holder, + /obj/effect/light_emitter/podbay, )) var/turf/oldTurf //Keeps track of where the user was at if they use the "teleport to centcom" button, so they can go back diff --git a/code/modules/cargo/coupon.dm b/code/modules/cargo/coupon.dm index fc1c3a6cc6598..5c4e1e930b5c6 100644 --- a/code/modules/cargo/coupon.dm +++ b/code/modules/cargo/coupon.dm @@ -44,7 +44,7 @@ /// Play stupid games, win stupid prizes /obj/item/coupon/proc/curse_heart(mob/living/cursed) if(!iscarbon(cursed)) - cursed.gib() + cursed.gib(DROP_ALL_REMAINS) return TRUE var/mob/living/carbon/player = cursed diff --git a/code/modules/cargo/department_order.dm b/code/modules/cargo/department_order.dm index 972588a6355d6..46122fd8741b0 100644 --- a/code/modules/cargo/department_order.dm +++ b/code/modules/cargo/department_order.dm @@ -21,12 +21,28 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( var/list/department_delivery_areas = list() ///which groups this computer can order from var/list/dep_groups = list() + /// If this departmental order console currently is on cooldown. + var/on_cooldown = FALSE + + /// Our radio object we use to talk to our department. + var/obj/item/radio/radio + /// The radio key typepath that will be instantiated and inserted into our radio. + var/obj/item/encryptionkey/radio_key_typepath + /// The radio channel we will speak into by default. + var/radio_channel /obj/machinery/computer/department_orders/Initialize(mapload, obj/item/circuitboard/board) . = ..() // All maps should have ONLY ONE of each order console roundstart REGISTER_REQUIRED_MAP_ITEM(1, 1) + if (radio_channel && radio_key_typepath) + radio = new(src) + radio.keyslot = new radio_key_typepath + radio.subspace_transmission = TRUE + radio.canhear_range = 0 + radio.recalculateChannels() + if(mapload) //check for mapping errors for(var/delivery_area_type in department_delivery_areas) if(GLOB.areas_by_type[delivery_area_type]) @@ -35,6 +51,11 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( log_mapping("[src] has no valid areas to deliver to on this map, add some more fallback areas to its \"department_delivery_areas\" var.") department_delivery_areas = list(/area/station/hallway/primary/central) //if this doesn't exist like honestly fuck your map man +/obj/machinery/computer/department_orders/Destroy() + QDEL_NULL(radio) + + return ..() + /obj/machinery/computer/department_orders/ui_interact(mob/user, datum/tgui/ui) . = ..() ui = SStgui.try_update_ui(user, src, ui) @@ -142,6 +163,12 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( if(GLOB.areas_by_type[delivery_area_type]) chosen_delivery_area = delivery_area_type break + + if(SSshuttle.supply.get_order_count(pack) == OVER_ORDER_LIMIT) + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) + say("ERROR: No more then [CARGO_MAX_ORDER] of any pack may be ordered at once") + return + department_order = new(pack, name, rank, ckey, "", null, chosen_delivery_area, null) SSshuttle.shopping_list += department_order if(!already_signalled) @@ -166,6 +193,20 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( time_y = 10 MINUTES * time_y GLOB.department_order_cooldowns[type] = world.time + time_y +/obj/machinery/computer/department_orders/process() + . = ..() + if (!.) + return FALSE + + if (GLOB.department_order_cooldowns[type] > world.time) + on_cooldown = TRUE + else if (on_cooldown) + radio?.talk_into(src, "Order cooldown has expired! A new order may now be placed!", radio_channel) + playsound(src, 'sound/machines/ping.ogg', 30, TRUE) + on_cooldown = FALSE + + return TRUE + /obj/machinery/computer/department_orders/service name = "service order console" circuit = /obj/item/circuitboard/computer/service_orders @@ -173,6 +214,8 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( override_access = ACCESS_HOP req_one_access = list(ACCESS_SERVICE) dep_groups = list("Service", "Food & Hydroponics", "Livestock", "Costumes & Toys") + radio_key_typepath = /obj/item/encryptionkey/headset_service + radio_channel = RADIO_CHANNEL_SERVICE /obj/machinery/computer/department_orders/engineering name = "engineering order console" @@ -181,6 +224,8 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( override_access = ACCESS_CE req_one_access = REGION_ACCESS_ENGINEERING dep_groups = list("Engineering", "Engine Construction", "Canisters & Materials") + radio_key_typepath = /obj/item/encryptionkey/headset_eng + radio_channel = RADIO_CHANNEL_ENGINEERING /obj/machinery/computer/department_orders/science name = "science order console" @@ -188,7 +233,9 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( department_delivery_areas = list(/area/station/science/research) override_access = ACCESS_RD req_one_access = REGION_ACCESS_RESEARCH - dep_groups = list("Science", "Livestock") + dep_groups = list("Science", "Livestock", "Canisters & Materials") + radio_key_typepath = /obj/item/encryptionkey/headset_sci + radio_channel = RADIO_CHANNEL_SCIENCE /obj/machinery/computer/department_orders/security name = "security order console" @@ -201,6 +248,8 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( override_access = ACCESS_HOS req_one_access = REGION_ACCESS_SECURITY dep_groups = list("Security", "Armory") + radio_key_typepath = /obj/item/encryptionkey/headset_sec + radio_channel = RADIO_CHANNEL_SECURITY /obj/machinery/computer/department_orders/medical name = "medical order console" @@ -214,3 +263,5 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( override_access = ACCESS_CMO req_one_access = REGION_ACCESS_MEDBAY dep_groups = list("Medical") + radio_key_typepath = /obj/item/encryptionkey/headset_med + radio_channel = RADIO_CHANNEL_MEDICAL diff --git a/code/modules/cargo/exports/lavaland.dm b/code/modules/cargo/exports/lavaland.dm index d4017646a79cd..31cc131986102 100644 --- a/code/modules/cargo/exports/lavaland.dm +++ b/code/modules/cargo/exports/lavaland.dm @@ -4,52 +4,56 @@ /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/internal/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, - ) + export_types = list( + /obj/item/immortality_talisman, + /obj/item/book_of_babel, + /obj/item/wisp_lantern, + /obj/item/organ/internal/cyberimp/arm/shard/katana, + /obj/item/clothing/glasses/godeye, + /obj/item/clothing/neck/necklace/memento_mori, + /obj/item/organ/internal/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, + /obj/item/borg/upgrade/modkit/lifesteal, + ) /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, - ) + export_types = list( + /obj/item/guardiancreator/miner, + /obj/item/rod_of_asclepius, + /obj/item/dragons_blood, + /obj/item/melee/ghost_sword, + /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/internal/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, - ) + export_types = list( + /obj/item/hierophant_club, + /obj/item/melee/cleaving_saw, + /obj/item/organ/internal/vocal_cords/colossus, + /obj/machinery/anomalous_crystal, + /obj/item/mayhem, + /obj/item/soulscythe, + /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 . = ..() diff --git a/code/modules/cargo/exports/materials.dm b/code/modules/cargo/exports/materials.dm index c22874dc06871..c9a88a6edfb20 100644 --- a/code/modules/cargo/exports/materials.dm +++ b/code/modules/cargo/exports/materials.dm @@ -1,11 +1,14 @@ /datum/export/material - cost = 5 // Cost per SHEET_MATERIAL_AMOUNT, which is 2000cm3 as of April 2016. + cost = 5 // Cost per SHEET_MATERIAL_AMOUNT, which is 100cm3 as of May 2023. message = "cm3 of developer's tears. Please, report this on github" amount_report_multiplier = SHEET_MATERIAL_AMOUNT - var/material_id = null + var/datum/material/material_id = null export_types = list( - /obj/item/stack/sheet/mineral, /obj/item/stack/tile/mineral, - /obj/item/stack/ore, /obj/item/coin) + /obj/item/stack/sheet/mineral, + /obj/item/stack/tile/mineral, + /obj/item/stack/ore, + /obj/item/coin + ) // 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 @@ -27,17 +30,8 @@ return round(amount / SHEET_MATERIAL_AMOUNT) -// 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 - message = "cm3 of bananium" - -/datum/export/material/diamond - cost = CARGO_CRATE_VALUE - material_id = /datum/material/diamond - message = "cm3 of diamonds" +// Materials. Static materials exist as parent types, while materials subject to the stock market have a fluid cost as determined by material/market types +// If you're adding a new material to the stock market, make sure its export type is added here. /datum/export/material/plasma cost = CARGO_CRATE_VALUE * 0.4 @@ -45,27 +39,12 @@ material_id = /datum/material/plasma message = "cm3 of plasma" -/datum/export/material/uranium - cost = CARGO_CRATE_VALUE * 0.2 - material_id = /datum/material/uranium - message = "cm3 of uranium" - -/datum/export/material/gold - cost = CARGO_CRATE_VALUE * 0.25 - material_id = /datum/material/gold - message = "cm3 of gold" - -/datum/export/material/silver - cost = CARGO_CRATE_VALUE * 0.1 - material_id = /datum/material/silver - message = "cm3 of silver" - -/datum/export/material/titanium - cost = CARGO_CRATE_VALUE * 0.25 - material_id = /datum/material/titanium - message = "cm3 of titanium" +/datum/export/material/bananium + cost = CARGO_CRATE_VALUE * 2 + material_id = /datum/material/bananium + message = "cm3 of bananium" -/datum/export/material/adamantine +/datum/export/material/diamond cost = CARGO_CRATE_VALUE material_id = /datum/material/adamantine message = "cm3 of adamantine" @@ -75,11 +54,6 @@ material_id = /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 - /datum/export/material/plastic cost = CARGO_CRATE_VALUE * 0.05 message = "cm3 of plastic" @@ -90,21 +64,6 @@ message = "cm3 of runite" material_id = /datum/material/runite -/datum/export/material/iron - cost = CARGO_CRATE_VALUE * 0.01 - message = "cm3 of iron" - material_id = /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 - 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" @@ -116,3 +75,90 @@ message = "cm3 of metallic hydrogen" material_id = /datum/material/metalhydrogen export_types = /obj/item/stack/sheet/mineral/metal_hydrogen + +/datum/export/material/market + +/datum/export/material/market/diamond + material_id = /datum/material/diamond + message = "cm3 of diamonds" + +/datum/export/material/market/uranium + material_id = /datum/material/uranium + message = "cm3 of uranium" + +/datum/export/material/market/gold + material_id = /datum/material/gold + message = "cm3 of gold" + +/datum/export/material/market/silver + material_id = /datum/material/silver + message = "cm3 of silver" + +/datum/export/material/market/titanium + material_id = /datum/material/titanium + message = "cm3 of titanium" + +/datum/export/material/market/bscrystal + message = "of bluespace crystals" + material_id = /datum/material/bluespace + export_types = list(/obj/item/stack/sheet/bluespace_crystal, /obj/item/stack/ore) //For whatever reason, bluespace crystals are not a mineral + +/datum/export/material/market/iron + message = "cm3 of iron" + material_id = /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/market/glass + message = "cm3 of glass" + material_id = /datum/material/glass + export_types = list( + /obj/item/stack/sheet/glass, + /obj/item/stack/ore, + /obj/item/shard + ) + +/datum/export/material/market/get_cost(obj/O, apply_elastic = FALSE) + var/obj/item/I = O + var/amount = get_amount(I) + if(!amount) + return 0 + var/material_value = (SSstock_market.materials_prices[material_id]) * amount * MARKET_PROFIT_MODIFIER + return round(material_value) + +/datum/export/material/market/sell_object(obj/sold_item, datum/export_report/report, dry_run, apply_elastic) + . = ..() + var/amount = get_amount(sold_item) + var/price = get_cost(sold_item) + if(!amount) + return + if(!dry_run) + SSstock_market.materials_quantity[material_id] += amount + SSstock_market.materials_prices[material_id] -= round((price) * (amount / (amount + SSstock_market.materials_quantity[material_id]))) + //This formula should impact lower quantity materials greater, and higher quantity materials less. Still, it's a bit rough. Tweaking may be needed. + + +// Stock blocks are a special type of export that can be used to sell a quantity of materials at a specific price on the market. +/datum/export/stock_block + cost = 0 + message = "stock block" + export_types = list(/obj/item/stock_block) + +/datum/export/stock_block/get_cost(obj/O, apply_elastic = FALSE) + var/obj/item/stock_block/block = O + return block.export_value + +/datum/export/stock_block/sell_object(obj/sold_item, datum/export_report/report, dry_run, apply_elastic) + . = ..() + if(dry_run) + return + var/obj/item/stock_block/sold_block = sold_item + var/sale_value = sold_block.export_value + SSstock_market.materials_quantity[sold_block.export_mat] += sold_block.quantity + SSstock_market.materials_prices[sold_block.export_mat] -= round((sale_value) * (sold_block.quantity / (sold_block.quantity + SSstock_market.materials_quantity[sold_block.export_mat]))) + SSstock_market.materials_prices[sold_block.export_mat] = round(clamp(SSstock_market.materials_prices[sold_block.export_mat], initial(sold_block.export_mat.value_per_unit) * SHEET_MATERIAL_AMOUNT * 0.5 , initial(sold_block.export_mat.value_per_unit) * SHEET_MATERIAL_AMOUNT * 3)) diff --git a/code/modules/cargo/exports/sheets.dm b/code/modules/cargo/exports/sheets.dm index 1000433ceb791..324dce084fc1b 100644 --- a/code/modules/cargo/exports/sheets.dm +++ b/code/modules/cargo/exports/sheets.dm @@ -65,7 +65,7 @@ // For base materials, see materials.dm /datum/export/stack/plasteel - cost = CARGO_CRATE_VALUE * 0.41 // 2000u of plasma + 2000u of iron. + cost = CARGO_CRATE_VALUE * 0.41 // 100u of plasma + 100u of iron. message = "of plasteel" export_types = list(/obj/item/stack/sheet/plasteel) diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm index 0614d4b7de8a6..a449c8414952c 100644 --- a/code/modules/cargo/expressconsole.dm +++ b/code/modules/cargo/expressconsole.dm @@ -52,12 +52,13 @@ to_chat(user, span_alert("[src] is already linked to [sb].")) ..() -/obj/machinery/computer/cargo/express/emag_act(mob/living/user) +/obj/machinery/computer/cargo/express/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE 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.")) + if (emag_card) + user.visible_message(span_warning("[user] swipes [emag_card] through [src]!")) + to_chat(user, span_notice("You change the routing protocols, allowing the Supply Pod to land anywhere on the station.")) obj_flags |= EMAGGED contraband = TRUE // This also sets this on the circuit board @@ -65,6 +66,7 @@ board.obj_flags |= EMAGGED board.contraband = TRUE packin_up() + return TRUE /obj/machinery/computer/cargo/express/proc/packin_up() // oh shit, I'm sorry meme_pack_data = list() // sorry for what? diff --git a/code/modules/cargo/goodies.dm b/code/modules/cargo/goodies.dm index 18b5610e6ffa0..be8288e922fba 100644 --- a/code/modules/cargo/goodies.dm +++ b/code/modules/cargo/goodies.dm @@ -93,11 +93,11 @@ cost = PAYCHECK_CREW * 8 contains = list(/obj/item/clothing/gloves/color/yellow) -/datum/supply_pack/goody/gripper_single - name = "Gripper Gloves Single-Pack" - desc = "A spare pair of gripper gloves. Perfect for when the security vendor is empty (or when you're not actually a security officer)." +/datum/supply_pack/goody/gorilla_single + name = "Gorilla Gloves Single-Pack" + desc = "A spare pair of gorilla gloves. Better for tackles than grippers from the security vendor." cost = PAYCHECK_COMMAND * 6 - contains = list(/obj/item/clothing/gloves/tackler) + contains = list(/obj/item/clothing/gloves/tackler/combat) /datum/supply_pack/goody/firstaidbruises_single name = "Bruise Treatment Kit Single-Pack" @@ -129,6 +129,12 @@ cost = PAYCHECK_CREW * 4 contains = list(/obj/item/storage/medkit/toxin) +/datum/supply_pack/goody/bandagebox_singlepack + name = "Box of Bandages Single-Pack" + desc = "A single box of DeForest brand bandages. For when you don't want to see your doctor." + cost = PAYCHECK_CREW * 3 + contains = list(/obj/item/storage/box/bandages) + /datum/supply_pack/goody/toolbox // mostly just to water down coupon probability name = "Mechanical Toolbox" desc = "A fully stocked mechanical toolbox, for when you're too lazy to just print them out." @@ -147,6 +153,12 @@ cost = PAYCHECK_CREW * 4 contains = list(/obj/item/toy/plush/beeplushie) +/datum/supply_pack/goody/blahaj + name = "Shark plushie" + desc = "A soft, warm companion for midday naps." + cost = PAYCHECK_CREW * 5 + contains = list(/obj/item/toy/plush/shark) + /datum/supply_pack/goody/dog_bone name = "Jumbo Dog Bone" desc = "The best dog bone money can have exported to a space station. A perfect gift for a dog." @@ -200,36 +212,6 @@ cost = PAYCHECK_CREW * 10 contains = list(/obj/item/construction/rld) -/datum/supply_pack/goody/moth_encryption_key - name = "Moffic radio encryption key" - desc = "A hi-tech radio encryption key that allows the wearer to understand moffic when the radio is worn." - cost = PAYCHECK_CREW * 12 - contains = list(/obj/item/encryptionkey/moth) - -/datum/supply_pack/goody/lizard_encryption_key - name = "Draconic radio encryption key" - desc = "A hi-tech radio encryption key that allows the wearer to understand draconic when the radio is worn." - cost = PAYCHECK_CREW * 12 - contains = list(/obj/item/encryptionkey/tiziran) - -/datum/supply_pack/goody/plasmaman_encryption_key - name = "Calcic radio encryption key" - desc = "A hi-tech radio encryption key that allows the wearer to understand calcic when the radio is worn." - cost = PAYCHECK_CREW * 12 - contains = list(/obj/item/encryptionkey/plasmaman) - -/datum/supply_pack/goody/ethereal_encryption_key - name = "Voltaic radio encryption key" - desc = "A hi-tech radio encryption key that allows the wearer to understand voltaic when the radio is worn." - cost = PAYCHECK_CREW * 12 - contains = list(/obj/item/encryptionkey/ethereal) - -/datum/supply_pack/goody/felinid_encryption_key - name = "Felinid radio encryption key" - desc = "A hi-tech radio encryption key that allows the wearer to understand nekomimetic when the radio is worn." - cost = PAYCHECK_CREW * 12 - contains = list(/obj/item/encryptionkey/felinid) - /datum/supply_pack/goody/fishing_toolbox name = "Fishing toolbox" desc = "Complete toolbox set for your fishing adventure. Advanced hooks and lines sold separetely." @@ -260,6 +242,12 @@ cost = PAYCHECK_CREW contains = list(/obj/item/bait_can/worm/premium) +/datum/supply_pack/goody/telescopic_fishing_rod + name = "Telescopic Fishing Rod" + desc = "A collapsible fishing rod that can fit within a backpack." + cost = PAYCHECK_CREW * 8 + contains = list(/obj/item/fishing_rod/telescopic) + /datum/supply_pack/goody/coffee_mug name = "Coffee Mug" desc = "A bog standard coffee mug, for drinking coffee." @@ -289,3 +277,15 @@ desc = "A standard-sized coffeepot, for use with a coffeemaker." cost = PAYCHECK_CREW contains = list(/obj/item/reagent_containers/cup/coffeepot) + +/datum/supply_pack/goody/climbing_hook + name = "Climbing hook" + desc = "A less cheap imported climbing hook. Absolutely no use outside of planetary stations." + cost = PAYCHECK_CREW * 5 + contains = list(/obj/item/climbing_hook) + +/datum/supply_pack/goody/fish_analyzer + name = "Fish Analyzer" + desc = "A single analyzer to monitor fish's status and traits with, in case you don't have the technology to print one." + cost = CARGO_CRATE_VALUE * 2.5 + contains = list(/obj/item/fish_analyzer) diff --git a/code/modules/cargo/markets/market_items/misc.dm b/code/modules/cargo/markets/market_items/misc.dm index d5ee60f49e44c..d2b70704e7a91 100644 --- a/code/modules/cargo/markets/market_items/misc.dm +++ b/code/modules/cargo/markets/market_items/misc.dm @@ -41,6 +41,15 @@ stock_max = 8 availability_prob = 60 +/datum/market_item/misc/donk_recycler + name = "MOD Riot Foam Dart Recycler Module" + desc = "If you love toy guns, hate cleaning and got a MODsuit, this module is a must have." + item = /obj/item/mod/module/recycler/donk + price_min = CARGO_CRATE_VALUE * 2 + price_max = CARGO_CRATE_VALUE * 4.5 + stock_max = 2 + availability_prob = 30 + /datum/market_item/misc/holywater name = "Flask of holy water" desc = "Father Lootius' own brand of ready-made holy water." @@ -86,6 +95,13 @@ stock_max = 3 availability_prob = 50 +/datum/market_item/misc/jawed_hook + name = "Jawed Fishing Hook" + desc = "The thing ya use if y'are strugglin' with fishes. Just rememeber to whoop yer rod before it's too late, 'cause this thing's gonna hurt them like an Arkansas toothpick." + price_min = CARGO_CRATE_VALUE * 0.75 + price_max = CARGO_CRATE_VALUE * 2 + stock_max = 3 + availability_prob = 70 /datum/market_item/misc/v8_engine name = "Genuine V8 Engine (Perserved)" @@ -95,3 +111,22 @@ price_max = CARGO_CRATE_VALUE * 6 stock_max = 1 availability_prob = 15 + +/datum/market_item/misc/fish + name = "Fish" + desc = "Fish! Fresh fish! Fish you can cut, grind and even keep in aquarium if you want to! Get some before the next fight at my village breaks out!" + price_min = PAYCHECK_CREW * 0.5 + price_max = PAYCHECK_CREW * 1.2 + item = /obj/item/storage/fish_case/blackmarket + stock_min = 3 + stock_max = 8 + availability_prob = 90 + +/datum/market_item/misc/giant_wrench_parts + name = "Big Slappy parts" + desc = "Cheap illegal Big Slappy parts. The fastest and statistically most dangerous wrench." + item = /obj/item/weaponcrafting/giant_wrench + price_min = CARGO_CRATE_VALUE * 2 + price_max = CARGO_CRATE_VALUE * 5 + stock_max = 1 + availability_prob = 25 diff --git a/code/modules/cargo/markets/market_items/weapons.dm b/code/modules/cargo/markets/market_items/weapons.dm index f40e4fa1447ca..6115b1e155797 100644 --- a/code/modules/cargo/markets/market_items/weapons.dm +++ b/code/modules/cargo/markets/market_items/weapons.dm @@ -63,3 +63,13 @@ price_max = CARGO_CRATE_VALUE * 2 stock_max = 2 availability_prob = 50 + +/datum/market_item/weapon/fisher + name = "SC/FISHER Saboteur Handgun" + desc = "A self-recharging, compact pistol that disrupts flashlights and security cameras, if only temporarily. Also usable in melee." + item = /obj/item/gun/energy/recharge/fisher + + price_min = CARGO_CRATE_VALUE * 2 + price_max = CARGO_CRATE_VALUE * 4 + stock_max = 1 + availability_prob = 50 diff --git a/code/modules/cargo/markets/market_telepad.dm b/code/modules/cargo/markets/market_telepad.dm index 2c077e721bbef..abdad441ce500 100644 --- a/code/modules/cargo/markets/market_telepad.dm +++ b/code/modules/cargo/markets/market_telepad.dm @@ -12,6 +12,7 @@ /obj/machinery/ltsrbt name = "Long-To-Short-Range-Bluespace-Transceiver" desc = "The LTSRBT is a compact teleportation machine for receiving and sending items outside the station and inside the station.\nUsing teleportation frequencies stolen from NT it is near undetectable.\nEssential for any illegal market operations on NT stations.\n" + icon = 'icons/obj/machines/telecomms.dmi' icon_state = "exonet_node" circuit = /obj/item/circuitboard/machine/ltsrbt density = TRUE diff --git a/code/modules/cargo/materials_market.dm b/code/modules/cargo/materials_market.dm new file mode 100644 index 0000000000000..dd56128241d4e --- /dev/null +++ b/code/modules/cargo/materials_market.dm @@ -0,0 +1,259 @@ +/obj/machinery/materials_market + name = "galactic materials market" + desc = "This machine allows the user to buy and sell sheets of minerals \ + across the system. Prices are known to fluxuate quite often,\ + sometimes even within the same minute. All transactions are final." + circuit = /obj/item/circuitboard/machine/materials_market + req_access = list(ACCESS_CARGO) + density = TRUE + icon = 'icons/obj/economy.dmi' + icon_state = "mat_market" + base_icon_state = "mat_market" + idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION + /// What items can be converted into a stock block? Must be a stack subtype based on current implementation. + var/list/exportable_material_items = list( + /obj/item/stack/sheet/iron, //God why are we like this + /obj/item/stack/sheet/glass, //No really, God why are we like this + /obj/item/stack/sheet/mineral, + /obj/item/stack/tile/mineral, + /obj/item/stack/ore, + /obj/item/stack/sheet/bluespace_crystal, + /obj/item/stack/rods + ) + /// Are we ordering sheets from our own card balance or the cargo budget? + var/ordering_private = TRUE + /// Currently, can we order sheets from our own card balance or the cargo budget? + var/can_buy_via_budget = FALSE + +/obj/machinery/materials_market/update_icon_state() + if(panel_open) + icon_state = "[base_icon_state]_open" + return ..() + if(!is_operational || !anchored) + icon_state = "[base_icon_state]_off" + return ..() + icon_state = "[base_icon_state]" + return ..() + +/obj/machinery/materials_market/wrench_act(mob/living/user, obj/item/tool) + ..() + default_unfasten_wrench(user, tool, time = 1.5 SECONDS) + return TOOL_ACT_TOOLTYPE_SUCCESS + +/obj/machinery/materials_market/attackby(obj/item/O, mob/user, params) + if(default_deconstruction_screwdriver(user, "[base_icon_state]_open", "[base_icon_state]", O)) + return + else if(default_deconstruction_crowbar(O)) + return + if(is_type_in_list(O, exportable_material_items)) + var/amount = 0 + var/value = 0 + var/material_to_export + var/obj/item/stack/exportable = O + for(var/datum/material/mat as anything in SSstock_market.materials_prices) + if(exportable.has_material_type(mat)) + amount = exportable.amount + value = SSstock_market.materials_prices[mat] + material_to_export = mat + break //This is only for trading non-alloys, so we can break here + + if(!amount) + say("Not enough material. Aborting.") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, FALSE) + return TRUE + qdel(exportable) + var/obj/item/stock_block/new_block = new /obj/item/stock_block(drop_location()) + new_block.export_value = amount * value * MARKET_PROFIT_MODIFIER + new_block.export_mat = material_to_export + new_block.quantity = amount + to_chat(user, span_notice("You have created a stock block worth [new_block.export_value] cr! Sell it before it becomes liquid!")) + playsound(src, 'sound/machines/synth_yes.ogg', 50, FALSE) + return TRUE + return ..() + + +/obj/machinery/materials_market/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!anchored) + return + if(!ui) + ui = new(user, src, "MatMarket", name) + ui.open() + +/obj/machinery/materials_market/ui_data(mob/user) + var/data = list() + var/material_data + for(var/datum/material/traded_mat as anything in SSstock_market.materials_prices) + var/trend_string = "" + if(SSstock_market.materials_trends[traded_mat] == 0) + trend_string = "neutral" + else if(SSstock_market.materials_trends[traded_mat] == 1) + trend_string = "up" + else if(SSstock_market.materials_trends[traded_mat] == -1) + trend_string = "down" + var/color_string = "" + if (initial(traded_mat.greyscale_colors)) + color_string = splicetext(initial(traded_mat.greyscale_colors), 7, length(initial(traded_mat.greyscale_colors)), "") //slice it to a standard 6 char hex + else if(initial(traded_mat.color)) + color_string = initial(traded_mat.color) + material_data += list(list( + "name" = initial(traded_mat.name), + "price" = SSstock_market.materials_prices[traded_mat], + "quantity" = SSstock_market.materials_quantity[traded_mat], + "trend" = trend_string, + "color" = color_string, + )) + + can_buy_via_budget = FALSE + var/obj/item/card/id/used_id_card + if(isliving(user)) + var/mob/living/living_user = user + used_id_card = living_user.get_idcard(TRUE) + can_buy_via_budget = (ACCESS_CARGO in used_id_card?.GetAccess()) + + var/balance = 0 + if(!ordering_private) + var/datum/bank_account/dept = SSeconomy.get_dep_account(ACCOUNT_CAR) + if(dept) + balance = dept.account_balance + else + balance = used_id_card?.registered_account?.account_balance + + var/market_crashing = FALSE + if(HAS_TRAIT(SSeconomy, TRAIT_MARKET_CRASHING)) + market_crashing = TRUE + + data["catastrophe"] = market_crashing + data["materials"] = material_data + data["creditBalance"] = balance + data["orderingPrive"] = ordering_private + data["canOrderCargo"] = can_buy_via_budget + return data + +/obj/machinery/materials_market/ui_act(action, params) + . = ..() + if(.) + return + if(!isliving(usr)) + return + switch(action) + if("buy") + var/material_str = params["material"] + var/quantity = text2num(params["quantity"]) + + var/datum/material/material_bought + var/obj/item/stack/sheet/sheet_to_buy + for(var/datum/material/mat as anything in SSstock_market.materials_prices) + if(initial(mat.name) == material_str) + material_bought = mat + break + if(!material_bought) + CRASH("Invalid material name passed to materials market!") + var/mob/living/living_user = usr + var/datum/bank_account/account_payable = SSeconomy.get_dep_account(ACCOUNT_CAR) + if(ordering_private) + var/obj/item/card/id/used_id_card = living_user.get_idcard(TRUE) + account_payable = used_id_card.registered_account + else if(can_buy_via_budget) + account_payable = SSeconomy.get_dep_account(ACCOUNT_CAR) + + var/cost = SSstock_market.materials_prices[material_bought] * quantity + + sheet_to_buy = initial(material_bought.sheet_type) + if(!sheet_to_buy) + CRASH("Material with no sheet type being sold on materials market!") + if(!account_payable) + say("No bank account detected!") + return + if(cost > account_payable.account_balance) + to_chat(living_user, span_warning("You don't have enough money to buy that!")) + return + var/list/things_to_order = list() + things_to_order += (sheet_to_buy) + things_to_order[sheet_to_buy] = quantity + // We want to count how many stacks of all sheets we're ordering to make sure they don't exceed the limit of 10 + //If we already have a custom order on SSshuttle, we should add the things to order to that order + for(var/datum/supply_order/order in SSshuttle.shopping_list) + if(order.orderer == living_user && order.orderer_rank == "Galactic Materials Market") + var/prior_stacks = 0 + for(var/obj/item/stack/sheet/sheet as anything in order.pack.contains) + prior_stacks += ROUND_UP(order.pack.contains[sheet] / 50) + if(prior_stacks >= 10) + to_chat(usr, span_notice("You already have 10 stacks of sheets on order! Please wait for them to arrive before ordering more.")) + playsound(usr, 'sound/machines/synth_no.ogg', 35, FALSE) + return + order.append_order(things_to_order, cost) + account_payable.adjust_money(-(cost) , "Materials Market Purchase") //Add the extra price to the total + return + account_payable.adjust_money(-(CARGO_CRATE_VALUE) , "Materials Market Purchase") //Here is where we factor in the base cost of a crate + //Now we need to add a cargo order for quantity sheets of material_bought.sheet_type + var/datum/supply_pack/custom/minerals/mineral_pack = new( + purchaser = living_user, \ + cost = SSstock_market.materials_prices[material_bought] * quantity, \ + contains = things_to_order, \ + ) + var/datum/supply_order/new_order = new( + pack = mineral_pack, + orderer = living_user, + orderer_rank = "Galactic Materials Market", + orderer_ckey = living_user.ckey, + reason = "", + paying_account = account_payable, + department_destination = null, + coupon = null, + charge_on_purchase = FALSE, + manifest_can_fail = FALSE, + cost_type = "credit", + can_be_cancelled = FALSE, + ) + say("Thank you for your purchase! It will arrive on the next cargo shuttle!") + SSshuttle.shopping_list += new_order + return + if("toggle_budget") + if(!can_buy_via_budget) + return + ordering_private = !ordering_private + + +/obj/item/stock_block + name = "stock block" + desc = "A block of stock. It's worth a certain amount of money, based on a sale on the materials market. Ship it on the cargo shuttle to claim your money." + icon = 'icons/obj/economy.dmi' + icon_state = "stock_block" + /// How many credits was this worth when created? + var/export_value = 0 + /// What is the name of the material this was made from? + var/datum/material/export_mat + /// Quantity of export material + var/quantity = 0 + /// Is this stock block currently updating it's value with the market (aka fluid)? + var/fluid = FALSE + +/obj/item/stock_block/examine(mob/user) + . = ..() + . += span_notice("\The [src] is worth [export_value] cr, from selling [quantity] sheets of [initial(export_mat?.name)].") + if(fluid) + . += span_warning("\The [src] is currently liquid! It's value is based on the market price.") + else + . += span_notice("\The [src]'s value is still [span_boldnotice("locked in")]. [span_boldnotice("Sell it")] before it's value becomes liquid!") + +/obj/item/stock_block/Initialize(mapload) + . = ..() + addtimer(CALLBACK(src, PROC_REF(value_warning)), 2.5 MINUTES) + addtimer(CALLBACK(src, PROC_REF(update_value)), 5 MINUTES) + +/obj/item/stock_block/proc/value_warning() + visible_message(span_warning("\The [src] is starting to become liquid!")) + icon_state = "stock_block_fluid" + update_appearance(UPDATE_ICON_STATE) + +/obj/item/stock_block/proc/update_value() + if(!export_mat) + return + if(!SSstock_market.materials_prices[export_mat]) + return + export_value = quantity * SSstock_market.materials_prices[export_mat] * MARKET_PROFIT_MODIFIER + icon_state = "stock_block_liquid" + update_appearance(UPDATE_ICON_STATE) + visible_message(span_warning("\The [src] becomes liquid!")) + diff --git a/code/modules/cargo/order.dm b/code/modules/cargo/order.dm index 3f680f883c34c..2707719c17005 100644 --- a/code/modules/cargo/order.dm +++ b/code/modules/cargo/order.dm @@ -132,13 +132,18 @@ manifest_text += "Item: [packname]
    " manifest_text += "Contents:
    " manifest_text += "
      " + var/container_contents = list() // Associative list with the format (item_name = nº of occurences, ...) for(var/atom/movable/AM in container.contents - manifest_paper) - if((manifest_paper.errors & MANIFEST_ERROR_CONTENTS)) - if(prob(50)) - manifest_text += "
    • [AM.name]
    • " - else - continue - manifest_text += "
    • [AM.name]
    • " + container_contents[AM.name]++ + if((manifest_paper.errors & MANIFEST_ERROR_CONTENTS) && container_contents) + for(var/i = 1 to rand(1, round(container.contents.len * 0.5))) // Remove anywhere from one to half of the items + var/missing_item = pick(container_contents) + container_contents[missing_item]-- + if(container_contents[missing_item] == 0) // To avoid 0s and negative values on the manifest + container_contents -= missing_item + + for(var/item in container_contents) + manifest_text += "
    • [container_contents[item]] [item][container_contents[item] == 1 ? "" : "s"]
    • " manifest_text += "
    " manifest_text += "

    Stamp below to confirm receipt of goods:

    " @@ -183,6 +188,15 @@ generateManifest(miscbox, misc_own, "", misc_cost) return +/datum/supply_order/proc/append_order(list/new_contents, cost_increase) + for(var/i as anything in new_contents) + if(pack.contains[i]) + pack.contains[i] += new_contents[i] + else + pack.contains += i + pack.contains[i] = new_contents[i] + pack.cost += cost_increase + #undef MANIFEST_ERROR_CHANCE #undef MANIFEST_ERROR_NAME #undef MANIFEST_ERROR_CONTENTS diff --git a/code/modules/cargo/orderconsole.dm b/code/modules/cargo/orderconsole.dm index 9a6ec0a867f44..7767b83bcb419 100644 --- a/code/modules/cargo/orderconsole.dm +++ b/code/modules/cargo/orderconsole.dm @@ -62,12 +62,13 @@ else return ..() -/obj/machinery/computer/cargo/emag_act(mob/user) +/obj/machinery/computer/cargo/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE if(user) - user.visible_message(span_warning("[user] swipes a suspicious card through [src]!"), - span_notice("You adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband.")) + if (emag_card) + user.visible_message(span_warning("[user] swipes [emag_card] through [src]!")) + to_chat(user, span_notice("You adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband.")) obj_flags |= EMAGGED contraband = TRUE @@ -77,6 +78,7 @@ board.contraband = TRUE board.obj_flags |= EMAGGED update_static_data(user) + return TRUE /obj/machinery/computer/cargo/on_construction(mob/user) . = ..() @@ -111,9 +113,11 @@ message = blockade_warning data["message"] = message + var/list/amount_by_name = list() var/cart_list = list() for(var/datum/supply_order/order in SSshuttle.shopping_list) if(cart_list[order.pack.name]) + amount_by_name[order.pack.name] += 1 cart_list[order.pack.name][1]["amount"]++ cart_list[order.pack.name][1]["cost"] += order.get_final_cost() if(order.department_destination) @@ -122,6 +126,7 @@ cart_list[order.pack.name][1]["paid"]++ continue + amount_by_name[order.pack.name] += 1 cart_list[order.pack.name] = list(list( "cost_type" = order.cost_type, "object" = order.pack.name, @@ -139,19 +144,23 @@ data["requests"] = list() - for(var/datum/supply_order/SO in SSshuttle.request_list) + for(var/datum/supply_order/order in SSshuttle.request_list) + var/datum/supply_pack/pack = order.pack + amount_by_name[pack.name] += 1 data["requests"] += list(list( - "object" = SO.pack.name, - "cost" = SO.pack.get_cost(), - "orderer" = SO.orderer, - "reason" = SO.reason, - "id" = SO.id + "object" = pack.name, + "cost" = pack.get_cost(), + "orderer" = order.orderer, + "reason" = order.reason, + "id" = order.id )) + data["amount_by_name"] = amount_by_name return data /obj/machinery/computer/cargo/ui_static_data(mob/user) var/list/data = list() + data["max_order"] = CARGO_MAX_ORDER data["supplies"] = list() for(var/pack in SSshuttle.supply_packs) var/datum/supply_pack/P = SSshuttle.supply_packs[pack] @@ -174,38 +183,41 @@ /** * adds an supply pack to the checkout cart - * * params - an list with id of the supply pack to add to the cart as its only element + * * user - the mobe doing this order + * * id - the type of pack to order + * * amount - the amount to order. You may not order more then 10 things at once */ -/obj/machinery/computer/cargo/proc/add_item(params) +/obj/machinery/computer/cargo/proc/add_item(mob/user, id, amount = 1) 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"]]") + CRASH("Unknown supply pack id given by order console ui. ID: [id]") + if(amount > CARGO_MAX_ORDER || amount < 1) // Holy shit fuck off + CRASH("Invalid amount passed into add_item") if((pack.hidden && !(obj_flags & EMAGGED)) || (pack.contraband && !contraband) || pack.drop_pod_only || (pack.special && !pack.special_enabled)) return var/name = "*None Provided*" var/rank = "*None Provided*" - var/ckey = usr.ckey - if(ishuman(usr)) - var/mob/living/carbon/human/human = usr + var/ckey = user.ckey + if(ishuman(user)) + var/mob/living/carbon/human/human = user name = human.get_authentification_name() rank = human.get_assignment(hand_first = TRUE) - else if(issilicon(usr)) - name = usr.real_name + else if(issilicon(user)) + name = user.real_name rank = "Silicon" var/datum/bank_account/account - if(self_paid && isliving(usr)) - var/mob/living/living_user = usr + if(self_paid && isliving(user)) + var/mob/living/living_user = user var/obj/item/card/id/id_card = living_user.get_idcard(TRUE) if(!istype(id_card)) say("No ID card detected.") return - if(istype(id_card, /obj/item/card/id/departmental_budget)) + if(IS_DEPARTMENTAL_CARD(id_card)) say("The [src] rejects [id_card].") return account = id_card.registered_account @@ -217,9 +229,12 @@ say("[id_card] lacks the requisite access for this purchase.") return + // The list we are operating on right now + var/list/working_list = SSshuttle.shopping_list var/reason = "" if(requestonly && !self_paid) - reason = tgui_input_text(usr, "Reason", name) + working_list = SSshuttle.request_list + reason = tgui_input_text(user, "Reason", name) if(isnull(reason)) return @@ -228,7 +243,13 @@ say("ERROR: Small crates may only be purchased by private accounts.") return - var/amount = params["amount"] + var/similar_count = SSshuttle.supply.get_order_count(pack) + if(similar_count == OVER_ORDER_LIMIT) + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) + say("ERROR: No more then [CARGO_MAX_ORDER] of any pack may be ordered at once") + return + + amount = clamp(amount, 1, CARGO_MAX_ORDER - similar_count) for(var/count in 1 to amount) var/obj/item/coupon/applied_coupon for(var/obj/item/coupon/coupon_check in loaded_coupons) @@ -238,11 +259,8 @@ applied_coupon = coupon_check break - var/datum/supply_order/SO = new(pack = pack ,orderer = name, orderer_rank = rank, orderer_ckey = ckey, reason = reason, paying_account = account, coupon = applied_coupon) - if(requestonly && !self_paid) - SSshuttle.request_list += SO - else - SSshuttle.shopping_list += SO + var/datum/supply_order/order = new(pack = pack ,orderer = name, orderer_rank = rank, orderer_ckey = ckey, reason = reason, paying_account = account, coupon = applied_coupon) + working_list += order if(self_paid) say("Order processed. The price will be charged to [account.account_holder]'s bank account on delivery.") @@ -254,10 +272,9 @@ /** * removes an item from the checkout cart - * * params - an list with the id of the cart item to remove as its only element + * * id - the id of the cart item to remove */ -/obj/machinery/computer/cargo/proc/remove_item(params) - var/id = text2num(params["id"]) +/obj/machinery/computer/cargo/proc/remove_item(id) for(var/datum/supply_order/order in SSshuttle.shopping_list) if(order.id != id) continue @@ -270,7 +287,6 @@ SSshuttle.shopping_list -= order . = TRUE break - /** * maps the ordename displayed on the ui to its supply pack id * * order_name - the name of the order @@ -282,10 +298,11 @@ return pack return null -/obj/machinery/computer/cargo/ui_act(action, params, datum/tgui/ui) +/obj/machinery/computer/cargo/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return + switch(action) if("send") if(!SSshuttle.supply.canMove()) @@ -298,12 +315,12 @@ if(SSshuttle.supply.getDockedId() == docking_home) SSshuttle.moveShuttle(cargo_shuttle, docking_away, TRUE) say("The supply shuttle is departing.") - usr.investigate_log("sent the supply shuttle away.", INVESTIGATE_CARGO) + ui.user.investigate_log("sent the supply shuttle away.", INVESTIGATE_CARGO) else //create the paper from the SSshuttle.shopping_list if(length(SSshuttle.shopping_list)) var/obj/item/paper/requisition_paper = new(get_turf(src)) - requisition_paper.name = "requisition form" + requisition_paper.name = "requisition form - [station_time_timestamp()]" var/requisition_text = "

    [station_name()] Supply Requisition

    " requisition_text += "
    " requisition_text += "Time of Order: [station_time_timestamp()]

    " @@ -322,9 +339,10 @@ requisition_text += "- Reason Given: [reason]
    " requisition_text += "

    " requisition_paper.add_raw_text(requisition_text) + requisition_paper.color = "#9ef5ff" requisition_paper.update_appearance() - usr.investigate_log("called the supply shuttle.", INVESTIGATE_CARGO) + ui.user.investigate_log("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) @@ -344,25 +362,23 @@ else SSshuttle.shuttle_loan.loan_shuttle() say("The supply shuttle has been loaned to CentCom.") - usr.investigate_log("accepted a shuttle loan event.", INVESTIGATE_CARGO) - usr.log_message("accepted a shuttle loan event.", LOG_GAME) + ui.user.investigate_log("accepted a shuttle loan event.", INVESTIGATE_CARGO) + ui.user.log_message("accepted a shuttle loan event.", LOG_GAME) . = TRUE if("add") - return add_item(params) + return add_item(ui.user, params["id"]) if("add_by_name") var/supply_pack_id = name_to_id(params["order_name"]) if(!supply_pack_id) return - return add_item(list("id" = supply_pack_id, "amount" = 1)) + return add_item(ui.user, supply_pack_id) if("remove") var/order_name = params["order_name"] //try removing atleast one item with the specified name. An order may not be removed if it was from the department - //also we create an copy of the cart list else we would get runtimes when removing & iterating over the same SSshuttle.shopping_list - var/list/shopping_cart = SSshuttle.shopping_list.Copy() - for(var/datum/supply_order/order in shopping_cart) + for(var/datum/supply_order/order in SSshuttle.shopping_list) if(order.pack.name != order_name) continue - if(remove_item(list("id" = order.id))) + if(remove_item(order.id)) return TRUE return TRUE @@ -370,26 +386,27 @@ var/order_name = params["order_name"] //clear out all orders with the above mentioned order_name name to make space for the new amount - var/list/shopping_cart = SSshuttle.shopping_list.Copy() //we operate on the list copy else we would get runtimes when removing & iterating over the same SSshuttle.shopping_list - for(var/datum/supply_order/order in shopping_cart) //find corresponding order id for the order name + for(var/datum/supply_order/order in SSshuttle.shopping_list) //find corresponding order id for the order name if(order.pack.name == order_name) - remove_item(list("id" = "[order.id]")) + remove_item(order.id) //now add the new amount stuff var/amount = text2num(params["amount"]) if(amount == 0) return TRUE + if(amount > CARGO_MAX_ORDER) + return var/supply_pack_id = name_to_id(order_name) //map order name to supply pack id for adding if(!supply_pack_id) return - return add_item(list("id" = supply_pack_id, "amount" = amount)) + return add_item(ui.user, supply_pack_id, amount) if("clear") //create copy of list else we will get runtimes when iterating & removing items on the same list SSshuttle.shopping_list var/list/shopping_cart = SSshuttle.shopping_list.Copy() for(var/datum/supply_order/cancelled_order in shopping_cart) if(cancelled_order.department_destination || !cancelled_order.can_be_cancelled) continue //don't cancel other department's orders or orders that can't be cancelled - remove_item(list("id" = "[cancelled_order.id]")) //remove & properly refund any coupons attached with this order + remove_item(cancelled_order.id) //remove & properly refund any coupons attached with this order if("approve") var/id = text2num(params["id"]) for(var/datum/supply_order/SO in SSshuttle.request_list) diff --git a/code/modules/cargo/packs/_packs.dm b/code/modules/cargo/packs/_packs.dm index 479d2595c0213..aaeb55f253385 100644 --- a/code/modules/cargo/packs/_packs.dm +++ b/code/modules/cargo/packs/_packs.dm @@ -79,6 +79,21 @@ /datum/supply_pack/proc/generate_supply_packs() return +///Easily send a supplypod to an area +/proc/send_supply_pod_to_area(contents, area_type, pod_type = /obj/structure/closet/supplypod) + var/list/areas = get_areas(area_type) + if(!LAZYLEN(areas)) + return FALSE + var/list/open_turfs = list() + for(var/turf/open/floor/found_turf in get_area_turfs(pick(areas), subtypes = TRUE)) + open_turfs += found_turf + + if(!length(open_turfs)) + return FALSE + + new /obj/effect/pod_landingzone (pick(open_turfs), new pod_type (), contents) + return TRUE + /** * Custom supply pack * The contents are given on New rather than being static @@ -95,3 +110,15 @@ name = "[purchaser]'s Mining Order" src.cost = cost src.contains = contains + +/datum/supply_pack/custom/minerals + name = "materials order" + crate_name = "galactic materials market delivery crate" + access = list() + crate_type = /obj/structure/closet/crate/cardboard + +/datum/supply_pack/custom/minerals/New(purchaser, cost, list/contains) + . = ..() + name = "[purchaser]'s Materials Order" + src.cost = cost + src.contains = contains diff --git a/code/modules/cargo/packs/costumes_toys.dm b/code/modules/cargo/packs/costumes_toys.dm index 298c3c3c1f410..6ac7ee5095d40 100644 --- a/code/modules/cargo/packs/costumes_toys.dm +++ b/code/modules/cargo/packs/costumes_toys.dm @@ -158,6 +158,12 @@ crate_name = "standard costume crate" crate_type = /obj/structure/closet/crate/wooden +/datum/supply_pack/costumes_toys/costume/fill(obj/structure/closet/crate/C) + ..() + var/funny_gas_internals + funny_gas_internals = pick(subtypesof(/obj/item/tank/internals/emergency_oxygen/engi/clown) - /obj/item/tank/internals/emergency_oxygen/engi/clown) + new funny_gas_internals(C) + /datum/supply_pack/costumes_toys/randomised/toys name = "Toy Crate" desc = "Who cares about pride and accomplishment? Skip the gaming and get straight \ diff --git a/code/modules/cargo/packs/emergency.dm b/code/modules/cargo/packs/emergency.dm index 9c50372b6a833..fca1a201ac103 100644 --- a/code/modules/cargo/packs/emergency.dm +++ b/code/modules/cargo/packs/emergency.dm @@ -117,8 +117,6 @@ contains = list(/obj/item/clothing/head/utility/radiation = 2, /obj/item/clothing/suit/utility/radiation = 2, /obj/item/geiger_counter = 2, - /obj/item/clothing/suit/utility/radiation, - /obj/item/geiger_counter, /obj/item/reagent_containers/cup/glass/bottle/vodka, /obj/item/reagent_containers/cup/glass/drinkingglass/shotglass = 2, ) diff --git a/code/modules/cargo/packs/engineering.dm b/code/modules/cargo/packs/engineering.dm index 1c3ec6c813a93..f5d865de95ce0 100644 --- a/code/modules/cargo/packs/engineering.dm +++ b/code/modules/cargo/packs/engineering.dm @@ -159,7 +159,8 @@ cost = CARGO_CRATE_VALUE * 30 special = TRUE access_view = ACCESS_COMMAND - contains = list(/obj/item/circuitboard/machine/bsa/front, + contains = list(/obj/item/paper/guides/jobs/engineering/bsa, + /obj/item/circuitboard/machine/bsa/front, /obj/item/circuitboard/machine/bsa/middle, /obj/item/circuitboard/machine/bsa/back, /obj/item/circuitboard/computer/bsa_control, @@ -292,3 +293,25 @@ crate_name = "HFR crate" crate_type = /obj/structure/closet/crate/secure/engineering dangerous = TRUE + +/datum/supply_pack/engineering/rad_protection_modules + name = "Radiation Protection Modules" + desc = "Contains multiple radiation protections modules for MODsuits." + hidden = TRUE + contains = list(/obj/item/mod/module/rad_protection = 3) + crate_name = "modsuit radiation modules" + crate_type = /obj/structure/closet/crate/engineering + +/datum/supply_pack/engineering/rad_nebula_shielding_kit + name = "Radioactive Nebula Shielding" + desc = "Contains circuitboards and radiation modules for constructing radioactive nebula shielding." + cost = CARGO_CRATE_VALUE * 2 + + special = TRUE + contains = list( + /obj/item/mod/module/rad_protection = 5, + /obj/item/circuitboard/machine/radioactive_nebula_shielding = 5, + /obj/item/paper/fluff/radiation_nebula = 1, + ) + crate_name = "radioactive nebula shielding (IMPORTANT)" + crate_type = /obj/structure/closet/crate/engineering diff --git a/code/modules/cargo/packs/general.dm b/code/modules/cargo/packs/general.dm index 96bb9e42a215f..99f8972ccb8c7 100644 --- a/code/modules/cargo/packs/general.dm +++ b/code/modules/cargo/packs/general.dm @@ -62,7 +62,7 @@ crate_name = "saltwater fish crate" /datum/supply_pack/misc/tiziran_fish - name = "Tirizan Fish Case" + name = "Tiziran Fish Case" desc = "Tiziran saltwater fish imported from the Zagos Sea." cost = CARGO_CRATE_VALUE * 2 contains = list(/obj/item/storage/fish_case/tiziran = 2) @@ -215,6 +215,13 @@ ) crate_name = "religious supplies crate" +/datum/supply_pack/misc/candles_bulk + name = "Candle Box Crate" + desc = "Keep your local chapel lit with three candle boxes!" + cost = CARGO_CRATE_VALUE * 1.5 + contains = list(/obj/item/storage/fancy/candle_box = 3) + crate_name = "candle box crate" + /datum/supply_pack/misc/toner name = "Toner Crate" desc = "Spent too much ink printing butt pictures? Fret not, with these six toner refills, \ @@ -278,13 +285,6 @@ crate_value = value contents_uplink_type = uplink -/datum/supply_pack/misc/fishing_portal - name = "Fishing Portal Generator Crate" - desc = "Not enough fish near your location? Fishing portal has your back." - cost = CARGO_CRATE_VALUE * 4 - contains = list(/obj/machinery/fishing_portal_generator) - crate_name = "fishing portal crate" - /datum/supply_pack/misc/papercutter name = "Paper Cutters Crate" desc = "Contains 3 office-grade paper cutters, equipped with sharp blades that can cut any paper into two thin slips.\ diff --git a/code/modules/cargo/packs/imports.dm b/code/modules/cargo/packs/imports.dm index 8799111de8fd5..6569321a164c6 100644 --- a/code/modules/cargo/packs/imports.dm +++ b/code/modules/cargo/packs/imports.dm @@ -42,7 +42,7 @@ name = "Duct Spider Crate" desc = "Awww! Straight from the Australicus sector to your station's ventilation system!" cost = CARGO_CRATE_VALUE * 6 - contains = list(/mob/living/basic/giant_spider/maintenance) + contains = list(/mob/living/basic/spider/maintenance) crate_name = "duct spider crate" crate_type = /obj/structure/closet/crate/critter @@ -50,7 +50,7 @@ name = "Duct Spider Crate?" desc = "Wait, is this the right crate? It has a frowny face, what does that mean?" cost = CARGO_CRATE_VALUE * 6 - contains = list(/mob/living/basic/giant_spider/hunter) + contains = list(/mob/living/basic/spider/giant/hunter) contraband = TRUE /datum/supply_pack/imports/bamboo50 @@ -87,6 +87,17 @@ var/mob/living/carbon/human/corpse = locate() in . corpse.death() +/datum/supply_pack/imports/dumpsterloot + name = "A....Dumpster" + desc = "I'm not sure why you bothered to buy this...and why does it cost so much?" + cost = CARGO_CRATE_VALUE * 5 + contains = list( + /obj/effect/spawner/random/maintenance/three, + /obj/effect/spawner/random/trash/garbage = 5, + ) + crate_name = "putrid dumpster" + crate_type = /obj/structure/closet/crate/trashcart + /datum/supply_pack/imports/error name = "NULL_ENTRY" desc = "(*!&@#OKAY, OPERATIVE, WE SEE HOW MUCH MONEY YOU'RE FLAUNTING. FINE. HAVE THIS, AND GOOD LUCK PUTTING IT TOGETHER!#@*$" @@ -128,34 +139,12 @@ 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 - cost = CARGO_CRATE_VALUE * 4 + cost = CARGO_CRATE_VALUE * 20 contains = list( - /obj/item/poster/random_contraband = 2, - /obj/item/food/grown/cannabis, - /obj/item/food/grown/cannabis/rainbow, - /obj/item/food/grown/cannabis/white, - /obj/item/storage/box/fireworks/dangerous, - /obj/item/storage/pill_bottle/zoom, - /obj/item/storage/pill_bottle/happy, - /obj/item/storage/pill_bottle/lsd, - /obj/item/storage/pill_bottle/aranesp, - /obj/item/storage/pill_bottle/stimulant, - /obj/item/toy/cards/deck/syndicate, - /obj/item/reagent_containers/cup/glass/bottle/absinthe, - /obj/item/clothing/under/syndicate/tacticool, - /obj/item/storage/fancy/cigarettes/cigpack_syndicate, - /obj/item/storage/fancy/cigarettes/cigpack_shadyjims, - /obj/item/clothing/mask/gas/syndicate, - /obj/item/clothing/neck/necklace/dope, - /obj/item/vending_refill/donksoft, + /obj/effect/spawner/random/contraband = 5, ) crate_name = "crate" -/datum/supply_pack/imports/contraband/fill(obj/structure/closet/crate/our_crate) - for(var/items in 1 to 10) - var/item = pick(contains) - new item(our_crate) - /datum/supply_pack/imports/wt550 name = "Smuggled WT-550 Autorifle Crate" desc = "(*!&@#GOOD NEWS, OPERATIVE! WE CAN'T GET YOU THE BIG LEAGUE AUTOMATIC WEAPONS. BUT, BY \ @@ -185,7 +174,7 @@ /datum/supply_pack/imports/shocktrooper name = "Shocktrooper Crate" desc = "(*!&@#WANT TO PUT THE FEAR OF DEATH INTO YOUR ENEMIES? THIS CRATE OF GOODIES CAN HELP MAKE THAT A REALITY. \ - CONTAINS A BOX OF FIVE EMP GRENADES, THREE SMOKEBOMBS, TWO GLUON GRENADES AND TWO FRAG GRENADES!#@*$" + CONTAINS AN ARMOR VEST AND HELMET, A BOX OF FIVE EMP GRENADES, THREE SMOKEBOMBS, TWO GLUON GRENADES AND TWO FRAG GRENADES!#@*$" hidden = TRUE cost = CARGO_CRATE_VALUE * 10 contains = list( @@ -193,19 +182,23 @@ /obj/item/grenade/smokebomb = 3, /obj/item/grenade/gluon = 2, /obj/item/grenade/frag = 2, + /obj/item/clothing/suit/armor/vest, + /obj/item/clothing/head/helmet, ) /datum/supply_pack/imports/specialops name = "Special Ops Crate" desc = "(*!&@#THE PIGS ON YOUR TAIL? MAYBE YOU CAN BUY SOME TIME WITH THIS CRATE! \ - CONTAINS A CHAMELEON MASK, A CHAMELEON JUMPSUIT AND AN AGENT CARD! AND A KNIFE!!#@*$" + CONTAINS A CHAMELEON MASK, BELT AND JUMPSUIT, MIRAGE GRENADES AND AN AGENT CARD! AND A KNIFE!!#@*$" hidden = TRUE cost = CARGO_CRATE_VALUE * 10 contains = list( /obj/item/clothing/mask/chameleon, /obj/item/clothing/under/chameleon, + /obj/item/storage/belt/chameleon, /obj/item/card/id/advanced/chameleon, - /obj/item/knife/combat/survival, + /obj/item/switchblade, + /obj/item/grenade/mirage = 5, ) /datum/supply_pack/imports/russian @@ -217,10 +210,10 @@ cost = CARGO_CRATE_VALUE * 12 contains = list( /obj/item/food/rationpack, - /obj/item/ammo_box/a762, - /obj/item/ammo_box/a762/surplus, - /obj/item/storage/toolbox/a762, - /obj/item/storage/toolbox/a762/surplus, + /obj/item/ammo_box/strilka310, + /obj/item/ammo_box/strilka310/surplus, + /obj/item/storage/toolbox/ammobox/strilka310, + /obj/item/storage/toolbox/ammobox/strilka310/surplus, /obj/item/storage/toolbox/maint_kit, /obj/item/clothing/suit/armor/vest/russian, /obj/item/clothing/head/helmet/rus_helmet, @@ -231,8 +224,7 @@ /obj/item/clothing/mask/russian_balaclava, /obj/item/clothing/head/helmet/rus_ushanka, /obj/item/clothing/suit/armor/vest/russian_coat, - /obj/item/gun/ballistic/rifle/boltaction, - /obj/item/gun/ballistic/rifle/boltaction/surplus = 2, + /obj/item/storage/toolbox/guncase/soviet = 2, ) /datum/supply_pack/imports/russian/fill(obj/structure/closet/crate/our_crate) @@ -241,7 +233,7 @@ new item(our_crate) /datum/supply_pack/imports/moistnuggets - name = "Refurbished Mosin Nagant Crate" + name = "Refurbished Sakhno Precision Rifle Crate" desc = "Hello Comrade Operative. You need gun? You hate garbage we sell to station normally? \ Then we have the perfect weapon for you! Special price for good friends! \ We don't have enough spare ammo, so you'll have to pick up the weapon of \ @@ -266,3 +258,58 @@ )//so you can properly #cargoniabikergang crate_name = "biker kit" crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/imports/abandoned + name = "Abandoned Crate" + desc = "...wait, how did this get here?" + cost = CARGO_CRATE_VALUE * 50 + contains = list() + crate_type = /obj/structure/closet/crate/secure/loot + crate_name = "abandoned crate" + contraband = TRUE + dangerous = TRUE //these are literally bombs so.... + +/datum/supply_pack/imports/shambler_evil + name = "Shamber's Juice Eldritch Energy! Crate" + desc = "~J'I'CE!~" + cost = CARGO_CRATE_VALUE * 50 + contains = list(/obj/item/reagent_containers/cup/soda_cans/shamblers/eldritch = 1) + crate_name = "illegal shambler's juice crate" + contraband = TRUE + +/datum/supply_pack/imports/hide + name = "Animal Hide Crate" + desc = "Want to not bother slaughtering a bunch of innocent creatures? Here, have some animal pelts! \ + Just don't ask where they came from..." + cost = CARGO_CRATE_VALUE * 30 + contains = list(/obj/effect/spawner/random/animalhide = 5) + crate_name = "animal hide crate" + +/datum/supply_pack/imports/dreadnog + name = "Dreadnog Carton Crate" + desc = "I have eggnog and I must soda." + cost = CARGO_CRATE_VALUE * 5 + contains = list(/obj/item/reagent_containers/cup/glass/bottle/juice/dreadnog = 3) + crate_name = "dreadnog crate" + +/datum/supply_pack/imports/giant_wrench_parts + name = "Big Slappy parts" + desc = "Illegal Big Slappy parts. The fastest and statistically most dangerous wrench." + cost = CARGO_CRATE_VALUE * 22 + contraband = TRUE + contains = list(/obj/item/weaponcrafting/giant_wrench) + crate_name = "unknown parts crate" + +/datum/supply_pack/imports/materials_market + name = "Galactic Materials Market Crate" + desc = "A circuit board to build your own materials market for use by certified market traders. Warning: Losses are not covered by insurance." + cost = CARGO_CRATE_VALUE * 3 + contains = list( + /obj/item/circuitboard/machine/materials_market = 1, + /obj/item/stack/sheet/iron = 5, + /obj/item/stack/cable_coil/five = 2, + /obj/item/stock_parts/scanning_module = 1, + /obj/item/stock_parts/card_reader = 1 + ) + crate_name = "materials market crate" + crate_type = /obj/structure/closet/crate diff --git a/code/modules/cargo/packs/livestock.dm b/code/modules/cargo/packs/livestock.dm index bd58abd984f5a..69dd7e6180772 100644 --- a/code/modules/cargo/packs/livestock.dm +++ b/code/modules/cargo/packs/livestock.dm @@ -6,7 +6,6 @@ name = "Bird Crate" desc = "Contains five expert telecommunication birds." cost = CARGO_CRATE_VALUE * 8 - access_view = ACCESS_CE contains = list(/mob/living/simple_animal/parrot) crate_name = "parrot crate" @@ -20,7 +19,6 @@ 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 cost = CARGO_CRATE_VALUE * 5 - access_view = ACCESS_THEATRE contains = list(/mob/living/basic/butterfly) crate_name = "entomology samples crate" @@ -33,7 +31,6 @@ name = "Cat Crate" desc = "The cat goes meow! Comes with a collar and a nice cat toy! Cheeseburger not included."//i can't believe im making this reference cost = CARGO_CRATE_VALUE * 10 //Cats are worth as much as corgis. - access_view = ACCESS_MEDICAL contains = list(/mob/living/simple_animal/pet/cat, /obj/item/clothing/neck/petcollar, /obj/item/toy/cattoy, @@ -51,7 +48,6 @@ name = "Chicken Crate" desc = "The chicken goes bwaak!" cost = CARGO_CRATE_VALUE * 4 - access_view = ACCESS_KITCHEN contains = list(/mob/living/basic/chick) crate_name = "chicken crate" @@ -60,7 +56,6 @@ desc = "Considered the optimal dog breed by thousands of research scientists, this Corgi is but \ one dog from the millions of Ian's noble bloodline. Comes with a cute collar!" cost = CARGO_CRATE_VALUE * 10 - access_view = ACCESS_HOP contains = list(/mob/living/basic/pet/dog/corgi, /obj/item/clothing/neck/petcollar, ) @@ -78,7 +73,6 @@ name = "Cow Crate" desc = "The cow goes moo! Contains one cow." cost = CARGO_CRATE_VALUE * 6 - access_view = ACCESS_HYDROPONICS contains = list(/mob/living/basic/cow) crate_name = "cow crate" @@ -86,7 +80,6 @@ name = "Sheep Crate" desc = "The sheep goes BAAAA! Contains one sheep." cost = CARGO_CRATE_VALUE * 6 - access_view = ACCESS_HYDROPONICS contains = list(/mob/living/basic/sheep) crate_name = "sheep crate" @@ -94,10 +87,16 @@ name = "Pig Crate" desc = "The pig goes oink! Contains one pig." cost = CARGO_CRATE_VALUE * 6 - access_view = ACCESS_KITCHEN contains = list(/mob/living/basic/pig) crate_name = "pig crate" +/datum/supply_pack/critter/pony + name = "Pony Crate" + desc = "Ponies, yay! (Just the one.)" + cost = CARGO_CRATE_VALUE * 6 + contains = list(/mob/living/basic/pony) + crate_name = "pony crate" + /datum/supply_pack/critter/crab name = "Crab Rocket" desc = "CRAAAAAAB ROCKET. CRAB ROCKET. CRAB ROCKET. CRAB CRAB CRAB CRAB CRAB CRAB CRAB \ @@ -108,15 +107,14 @@ EEEEEEEEEEEEEEEEEEEEEEEEE EEEETTTTTTTTTTTTAAAAAAAAA AAAHHHHHHHHHHHHH. CRAB ROCKET. CRAAAB \ ROCKEEEEEEEEEGGGGHHHHTT CRAB CRAB CRAABROCKET CRAB ROCKEEEET."//fun fact: i actually spent like 10 minutes and transcribed the entire video. cost = CARGO_CRATE_VALUE * 8 - access_view = ACCESS_HOS - contains = list(/mob/living/simple_animal/crab) + contains = list(/mob/living/basic/crab) crate_name = "look sir free crabs" drop_pod_only = TRUE /datum/supply_pack/critter/crab/generate() . = ..() for(var/i in 1 to 49) - new /mob/living/simple_animal/crab(.) + new /mob/living/basic/crab(.) /datum/supply_pack/critter/corgis/exotic name = "Exotic Corgi Crate" @@ -132,18 +130,17 @@ name = "Fox Crate" desc = "The fox goes...? Contains one fox. Comes with a collar!"//what does the fox say cost = CARGO_CRATE_VALUE * 10 - access_view = ACCESS_CAPTAIN - contains = list(/mob/living/simple_animal/pet/fox, - /obj/item/clothing/neck/petcollar, - ) + contains = list( + /mob/living/basic/pet/fox, + /obj/item/clothing/neck/petcollar, + ) crate_name = "fox crate" /datum/supply_pack/critter/goat name = "Goat Crate" desc = "The goat goes baa! Contains one goat. Warranty void if used as a replacement for Pete." cost = CARGO_CRATE_VALUE * 5 - access_view = ACCESS_KITCHEN - contains = list(/mob/living/simple_animal/hostile/retaliate/goat) + contains = list(/mob/living/basic/goat) crate_name = "goat crate" /datum/supply_pack/critter/rabbit @@ -193,8 +190,7 @@ desc = "Tired of these MOTHER FUCKING snakes on this MOTHER FUCKING space station? \ Then this isn't the crate for you. Contains three venomous snakes." cost = CARGO_CRATE_VALUE * 6 - access_view = ACCESS_SECURITY - contains = list(/mob/living/simple_animal/hostile/retaliate/snake = 3) + contains = list(/mob/living/basic/snake = 3) crate_name = "snake crate" /datum/supply_pack/critter/amphibians @@ -212,7 +208,6 @@ name = "Lizard Crate" desc = "Hisss! Containssss a friendly lizard. Not to be confusssed with a lizardperssson." cost = CARGO_CRATE_VALUE * 4 - access_view = ACCESS_JANITOR contains = list(/mob/living/basic/lizard) crate_name = "lizard crate" diff --git a/code/modules/cargo/packs/materials.dm b/code/modules/cargo/packs/materials.dm index a6fdd73e77fd5..ba9a162698bb8 100644 --- a/code/modules/cargo/packs/materials.dm +++ b/code/modules/cargo/packs/materials.dm @@ -16,34 +16,6 @@ contains = list(/obj/item/stack/license_plates/empty/fifty) crate_name = "empty license plate crate" -/datum/supply_pack/materials/glass50 - name = "50 Glass Sheets" - desc = "Let some nice light in with fifty glass sheets!" - cost = CARGO_CRATE_VALUE * 2 - 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 - 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 - 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!" @@ -82,14 +54,6 @@ crate_name = "fuel tank crate" crate_type = /obj/structure/closet/crate/large -/datum/supply_pack/materials/hightank - name = "Large Water Tank Crate" - desc = "Contains a high-capacity water tank. Useful for botany or other service jobs." - cost = CARGO_CRATE_VALUE * 2.4 - contains = list(/obj/structure/reagent_dispensers/watertank/high) - crate_name = "high-capacity water tank crate" - crate_type = /obj/structure/closet/crate/large - /datum/supply_pack/materials/hightankfuel name = "Large Fuel Tank Crate" desc = "Contains a high-capacity fuel tank. Keep contents away from open flame." diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm index ea013a7719c12..3cfb824b4e698 100644 --- a/code/modules/cargo/packs/medical.dm +++ b/code/modules/cargo/packs/medical.dm @@ -89,6 +89,7 @@ /obj/item/reagent_containers/cup/beaker/large, /obj/item/reagent_containers/pill/insulin, /obj/item/stack/medical/gauze, + /obj/item/storage/box/bandages, /obj/item/storage/box/beakers, /obj/item/storage/box/medigels, /obj/item/storage/box/syringes, @@ -112,6 +113,7 @@ for(var/i in 1 to 10) var/item = pick(contains) new item(C) + /datum/supply_pack/medical/experimentalmedicine name = "Experimental Medicine Crate" desc = "A crate containing the medication required for living with Hereditary Manifold Sickness, Sansufentanyl." @@ -122,13 +124,14 @@ /datum/supply_pack/medical/surgery name = "Surgical Supplies Crate" desc = "Do you want to perform surgery, but don't have one of those fancy \ - shmancy degrees? Just get started with this crate containing a medical duffelbag, \ + shmancy degrees? Just get started with this crate containing a DeForest surgery tray, \ 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, - ) + contains = list( + /obj/item/surgery_tray/full, + /obj/item/reagent_containers/medigel/sterilizine, + /obj/item/emergency_bed, + ) crate_name = "surgical supplies crate" /datum/supply_pack/medical/salglucanister diff --git a/code/modules/cargo/packs/organic.dm b/code/modules/cargo/packs/organic.dm index 38b8292fe8059..eb26d5ec907f7 100644 --- a/code/modules/cargo/packs/organic.dm +++ b/code/modules/cargo/packs/organic.dm @@ -47,6 +47,7 @@ /obj/item/food/spiderleg, /obj/item/food/fishmeat/carp, /obj/item/food/meat/slab/human, + /obj/item/food/meat/slab/grassfed, ) crate_name = "food crate" @@ -61,18 +62,20 @@ including one replica-pod seed and two mystery seeds!" cost = CARGO_CRATE_VALUE * 3 access_view = ACCESS_HYDROPONICS - contains = list(/obj/item/seeds/nettle, - /obj/item/seeds/replicapod, - /obj/item/seeds/plump, - /obj/item/seeds/liberty, - /obj/item/seeds/amanita, - /obj/item/seeds/reishi, - /obj/item/seeds/bamboo, - /obj/item/seeds/eggplant/eggy, - /obj/item/seeds/rainbow_bunch, - /obj/item/seeds/shrub, - /obj/item/seeds/random = 2, - ) + contains = list( + /obj/item/seeds/amanita, + /obj/item/seeds/bamboo, + /obj/item/seeds/eggplant/eggy, + /obj/item/seeds/liberty, + /obj/item/seeds/nettle, + /obj/item/seeds/plump, + /obj/item/seeds/replicapod, + /obj/item/seeds/reishi, + /obj/item/seeds/rainbow_bunch, + /obj/item/seeds/seedling, + /obj/item/seeds/shrub, + /obj/item/seeds/random = 2, + ) crate_name = "exotic seeds crate" crate_type = /obj/structure/closet/crate/hydroponics @@ -296,10 +299,12 @@ ONLY 5000 BUX GET NOW! Contains a grill and fuel." cost = CARGO_CRATE_VALUE * 8 crate_type = /obj/structure/closet/crate - contains = list(/obj/item/stack/sheet/mineral/coal/five, - /obj/machinery/grill/unwrenched, - /obj/item/reagent_containers/cup/soda_cans/monkey_energy, - ) + contains = list( + /obj/item/stack/sheet/mineral/coal/five, + /obj/item/kitchen/tongs, + /obj/item/reagent_containers/cup/soda_cans/monkey_energy, + /obj/machinery/grill/unwrenched, + ) crate_name = "grilling starter kit crate" /datum/supply_pack/organic/grillfuel diff --git a/code/modules/cargo/packs/security.dm b/code/modules/cargo/packs/security.dm index f4677c8c11145..784b870fea084 100644 --- a/code/modules/cargo/packs/security.dm +++ b/code/modules/cargo/packs/security.dm @@ -225,6 +225,14 @@ crate_name = "energy gun crate" crate_type = /obj/structure/closet/crate/secure/plasma +/datum/supply_pack/security/armory/laser_carbine + name = "Laser Carbine Crate" + desc = "Contains three laser carbines, capable of rapidly firing weak lasers." + cost = CARGO_CRATE_VALUE * 9 + contains = list(/obj/item/gun/energy/laser/carbine = 3) + crate_name = "laser carbine crate" + crate_type = /obj/structure/closet/crate/secure/plasma + /datum/supply_pack/security/armory/exileimp name = "Exile Implants Crate" desc = "Contains five Exile implants." @@ -316,3 +324,11 @@ cost = CARGO_CRATE_VALUE * 7 contains = list(/obj/item/storage/belt/holster/energy/thermal = 2) crate_name = "thermal pistol crate" + +/datum/supply_pack/security/sunglasses + name = "Sunglasses Crate" + desc = "A single pair of flash-proof sunglasses." + cost = CARGO_CRATE_VALUE * 2 + access_view = ACCESS_SECURITY + contains = list(/obj/item/clothing/glasses/sunglasses = 1) + crate_name = "sunglasses crate" diff --git a/code/modules/cargo/packs/stock_market_items.dm b/code/modules/cargo/packs/stock_market_items.dm new file mode 100644 index 0000000000000..04b2eac4acf74 --- /dev/null +++ b/code/modules/cargo/packs/stock_market_items.dm @@ -0,0 +1,36 @@ +/** + * todo: make this a supply_pack/custom. Drop pog? ohoho yes. Would be VERY fun. + */ +/datum/supply_pack/market_materials + name = "A Single Sheet of Bananium" + desc = "Going market price for this kind of sheet, by Australicus Industrial Mining." + cost = CARGO_CRATE_VALUE * 2 + // contains = list(/obj/item/stack/sheet/mineral/bananium) + crate_name = "mineral stock sheet crate" + group = "Canisters & Materials" + /// What material we are trying to buy sheets of? + var/datum/material/material + /// How many sheets of the material we are trying to buy at once? + var/amount + +/datum/supply_pack/market_materials/get_cost() + for(var/datum/material/mat in SSstock_market.materials_prices) + if(material == mat) + return SSstock_market.materials_prices[mat] * amount + +/datum/supply_pack/market_materials/fill(obj/structure/closet/crate/C) + . = ..() + new material.sheet_type(C, amount) + +/datum/supply_pack/market_materials/iron + name = "Iron Sheets" + crate_name = "iron stock crate" + material = /datum/material/iron +MARKET_QUANTITY_HELPERS(/datum/supply_pack/market_materials/iron) + + +/datum/supply_pack/market_materials/gold + name = "Gold Sheets" + crate_name = "gold stock crate" + material = /datum/material/gold +MARKET_QUANTITY_HELPERS(/datum/supply_pack/market_materials/gold) diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm index 1bfd4cf502993..4373699495988 100644 --- a/code/modules/cargo/supplypod.dm +++ b/code/modules/cargo/supplypod.dm @@ -271,7 +271,7 @@ if (effectGib) //effectGib is on, that means whatever's underneath us better be fucking oof'd on target_living.adjustBruteLoss(5000) //THATS A LOT OF DAMAGE (called just in case gib() doesnt work on em) if (!QDELETED(target_living)) - target_living.gib() //After adjusting the fuck outta that brute loss we finish the job with some satisfying gibs + target_living.gib(DROP_ALL_REMAINS) //After adjusting the fuck outta that brute loss we finish the job with some satisfying gibs else target_living.adjustBruteLoss(damage) var/explosion_sum = B[1] + B[2] + B[3] + B[4] @@ -693,7 +693,7 @@ /obj/item/disk/cargo/bluespace_pod //Disk that can be inserted into the Express Console to allow for Advanced Bluespace Pods name = "Bluespace Drop Pod Upgrade" desc = "This disk provides a firmware update to the Express Supply Console, granting the use of Nanotrasen's Bluespace Drop Pods to the supply department." - icon = 'icons/obj/module.dmi' + icon = 'icons/obj/assemblies/module.dmi' icon_state = "cargodisk" inhand_icon_state = "card-id" w_class = WEIGHT_CLASS_SMALL diff --git a/code/modules/cargo/supplypod_beacon.dm b/code/modules/cargo/supplypod_beacon.dm index 436a0ca6b9302..89c474635fa18 100644 --- a/code/modules/cargo/supplypod_beacon.dm +++ b/code/modules/cargo/supplypod_beacon.dm @@ -7,11 +7,17 @@ lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' w_class = WEIGHT_CLASS_SMALL + armor_type = /datum/armor/supplypod_beacon + resistance_flags = FIRE_PROOF var/obj/machinery/computer/cargo/express/express_console var/linked = FALSE var/ready = FALSE var/launched = FALSE +/datum/armor/supplypod_beacon + bomb = 100 + fire = 100 + /obj/item/supplypod_beacon/proc/update_status(consoleStatus) switch(consoleStatus) if (SP_LINKED) @@ -49,6 +55,7 @@ /obj/item/supplypod_beacon/examine(user) . = ..() + . += span_notice("It looks like it has a few anchoring bolts.") if(!express_console) . += span_notice("[src] is not currently linked to an Express Supply console.") else @@ -59,6 +66,11 @@ express_console.beacon = null return ..() +/obj/item/supplypod_beacon/wrench_act(mob/living/user, obj/item/tool) + . = ..() + default_unfasten_wrench(user, tool) + return TOOL_ACT_TOOLTYPE_SUCCESS + /obj/item/supplypod_beacon/proc/unlink_console() if(express_console) express_console.beacon = null diff --git a/code/modules/cargo/universal_scanner.dm b/code/modules/cargo/universal_scanner.dm index 300b805df4a91..880a75783d899 100644 --- a/code/modules/cargo/universal_scanner.dm +++ b/code/modules/cargo/universal_scanner.dm @@ -227,7 +227,7 @@ /obj/item/barcode name = "barcode tag" desc = "A tiny tag, associated with a crewmember's account. Attach to a wrapped item to give that account a portion of the wrapped item's profit." - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "barcode" w_class = WEIGHT_CLASS_TINY //All values inherited from the sales tagger it came from. diff --git a/code/modules/client/client_colour.dm b/code/modules/client/client_colour.dm index 26ab9e850b66d..9ac64851a68fa 100644 --- a/code/modules/client/client_colour.dm +++ b/code/modules/client/client_colour.dm @@ -16,8 +16,8 @@ * Define subtypes of this datum */ /datum/client_colour - ///Any client.color-valid value - var/colour = "" + ///The color we want to give to the client. This has to be either a hexadecimal color or a color matrix. + var/colour ///The mob that owns this client_colour. var/mob/owner /** @@ -32,8 +32,8 @@ ///Same as above, but on removal. var/fade_out = 0 -/datum/client_colour/New(mob/_owner) - owner = _owner +/datum/client_colour/New(mob/owner) + src.owner = owner /datum/client_colour/Destroy() if(!QDELETED(owner)) @@ -150,7 +150,6 @@ /datum/client_colour/glass_colour priority = PRIORITY_LOW - colour = "red" /datum/client_colour/glass_colour/green colour = "#aaffaa" @@ -198,6 +197,9 @@ fade_in = 20 fade_out = 20 +/datum/client_colour/monochrome/colorblind + priority = PRIORITY_HIGH + /datum/client_colour/monochrome/trance priority = PRIORITY_NORMAL @@ -209,9 +211,10 @@ colour = list(0,0,0,0,0,0,0,0,0,1,0,0) //pure red. fade_out = 10 -/datum/client_colour/bloodlust/New(mob/_owner) +/datum/client_colour/bloodlust/New(mob/owner) ..() - addtimer(CALLBACK(src, PROC_REF(update_colour), list(1,0,0,0.8,0.2,0, 0.8,0,0.2,0.1,0,0), 10, SINE_EASING|EASE_OUT), 1) + if(owner) + addtimer(CALLBACK(src, PROC_REF(update_colour), list(1,0,0,0.8,0.2,0, 0.8,0,0.2,0.1,0,0), 10, SINE_EASING|EASE_OUT), 1) /datum/client_colour/rave priority = PRIORITY_LOW @@ -221,6 +224,10 @@ override = TRUE colour = list(0.8,0,0,0, 0,0,0,0, 0,0,1,0, 0,0,0,1, 0,0,0,0) +/datum/client_colour/manual_heart_blood + priority = PRIORITY_ABSOLUTE + colour = COLOR_RED + #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 c3c6bd244254a..2e655e91651ee 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -160,8 +160,6 @@ ///Autoclick list of two elements, first being the clicked thing, second being the parameters. var/list/atom/selected_target[2] - ///Autoclick variable referencing the associated item. - var/obj/item/active_mousedown_item = null ///Used in MouseDrag to preserve the original mouse click parameters var/mouseParams = "" ///Used in MouseDrag to preserve the last mouse-entered location. Weakref diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 44386a2680fc1..e6b94c20ede17 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -1,8 +1,6 @@ //////////// //SECURITY// //////////// -#define UPLOAD_LIMIT 524288 //Restricts client uploads to the server to 0.5MB -#define UPLOAD_LIMIT_ADMIN 2621440 //Restricts admin client uploads to the server to 2.5MB GLOBAL_LIST_INIT(blacklisted_builds, list( "1407" = "bug preventing client display overrides from working leads to clients being able to see things/mobs they shouldn't be able to see", @@ -203,12 +201,14 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( //This stops files larger than UPLOAD_LIMIT being sent from client to server via input(), client.Import() etc. /client/AllowUpload(filename, filelength) + var/client_max_file_size = CONFIG_GET(number/upload_limit) if (holder) - if(filelength > UPLOAD_LIMIT_ADMIN) - to_chat(src, "Error: AllowUpload(): File Upload too large. Upload Limit: [UPLOAD_LIMIT_ADMIN/1024]KiB.") + var/admin_max_file_size = CONFIG_GET(number/upload_limit_admin) + if(filelength > admin_max_file_size) + to_chat(src, span_warning("Error: AllowUpload(): File Upload too large. Upload Limit: [admin_max_file_size/1024]KiB.")) return FALSE - else if(filelength > UPLOAD_LIMIT) - to_chat(src, "Error: AllowUpload(): File Upload too large. Upload Limit: [UPLOAD_LIMIT/1024]KiB.") + else if(filelength > client_max_file_size) + to_chat(src, span_warning("Error: AllowUpload(): File Upload too large. Upload Limit: [client_max_file_size/1024]KiB.")) return FALSE return TRUE @@ -464,9 +464,14 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( var/nnpa = CONFIG_GET(number/notify_new_player_age) if (isnum(cached_player_age) && cached_player_age == -1) //first connection if (nnpa >= 0) + log_admin_private("New login: [key_name(key, FALSE, TRUE)] (IP: [address], ID: [computer_id]) logged onto the servers for the first time.") message_admins("New user: [key_name_admin(src)] is connecting here for the first time.") if (CONFIG_GET(flag/irc_first_connection_alert)) - send2tgs_adminless_only("New-user", "[key_name(src)] is connecting for the first time!") + var/new_player_alert_role = CONFIG_GET(string/new_player_alert_role_id) + send2tgs_adminless_only( + "New-user", + "[key_name(src)] is connecting for the first time![new_player_alert_role ? " <@&[new_player_alert_role]>" : ""]" + ) else if (isnum(cached_player_age) && cached_player_age < nnpa) message_admins("New user: [key_name_admin(src)] just connected with an age of [cached_player_age] day[(player_age == 1?"":"s")]") if(CONFIG_GET(flag/use_account_age_for_jobs) && account_age >= 0) @@ -474,7 +479,11 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if(account_age >= 0 && account_age < nnpa) message_admins("[key_name_admin(src)] (IP: [address], ID: [computer_id]) is a new BYOND account [account_age] day[(account_age == 1?"":"s")] old, created on [account_join_date].") if (CONFIG_GET(flag/irc_first_connection_alert)) - send2tgs_adminless_only("new_byond_user", "[key_name(src)] (IP: [address], ID: [computer_id]) is a new BYOND account [account_age] day[(account_age == 1?"":"s")] old, created on [account_join_date].") + var/new_player_alert_role = CONFIG_GET(string/new_player_alert_role_id) + send2tgs_adminless_only( + "new_byond_user", + "[key_name(src)] (IP: [address], ID: [computer_id]) is a new BYOND account [account_age] day[(account_age == 1?"":"s")] old, created on [account_join_date].[new_player_alert_role ? " <@&[new_player_alert_role]>" : ""]" + ) get_message_output("watchlist entry", ckey) check_ip_intel() validate_key_in_db() @@ -581,7 +590,6 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( send2adminchat("Server", "[cheesy_message] (No admins online)") QDEL_LIST_ASSOC_VAL(char_render_holders) - active_mousedown_item = null SSambience.remove_ambience_client(src) SSmouse_entered.hovers -= src SSping.currentrun -= src @@ -621,8 +629,6 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( related_accounts_cid += "[query_get_related_cid.item[1]], " qdel(query_get_related_cid) var/admin_rank = holder?.rank_names() || "Player" - if (!holder && !GLOB.deadmins[ckey] && check_randomizer(connectiontopic)) - return var/new_player var/datum/db_query/query_client_in_db = SSdbcore.NewQuery( "SELECT 1 FROM [format_table_name("player")] WHERE ckey = :ckey", @@ -778,94 +784,6 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( else CRASH("Key check regex failed for [ckey]") -/client/proc/check_randomizer(topic) - . = FALSE - if (connection != "seeker") - return - topic = params2list(topic) - if (!CONFIG_GET(flag/check_randomizer)) - return - var/static/cidcheck = list() - var/static/tokens = list() - var/static/cidcheck_failedckeys = list() //to avoid spamming the admins if the same guy keeps trying. - var/static/cidcheck_spoofckeys = list() - var/datum/db_query/query_cidcheck = SSdbcore.NewQuery( - "SELECT computerid FROM [format_table_name("player")] WHERE ckey = :ckey", - list("ckey" = ckey) - ) - query_cidcheck.Execute() - - var/lastcid - if (query_cidcheck.NextRow()) - lastcid = query_cidcheck.item[1] - qdel(query_cidcheck) - var/oldcid = cidcheck[ckey] - - if (oldcid) - if (!topic || !topic["token"] || !tokens[ckey] || topic["token"] != tokens[ckey]) - if (!cidcheck_spoofckeys[ckey]) - message_admins(span_adminnotice("[key_name(src)] appears to have attempted to spoof a cid randomizer check.")) - cidcheck_spoofckeys[ckey] = TRUE - cidcheck[ckey] = computer_id - tokens[ckey] = cid_check_reconnect() - - sleep(15 SECONDS) //Longer sleep here since this would trigger if a client tries to reconnect manually because the inital reconnect failed - - //we sleep after telling the client to reconnect, so if we still exist something is up - log_access("Forced disconnect: [key] [computer_id] [address] - CID randomizer check") - - qdel(src) - return TRUE - - if (oldcid != computer_id && computer_id != lastcid) //IT CHANGED!!! - cidcheck -= ckey //so they can try again after removing the cid randomizer. - - to_chat_immediate(src, span_userdanger("Connection Error:")) - to_chat_immediate(src, span_danger("Invalid ComputerID(spoofed). Please remove the ComputerID spoofer from your byond installation and try again.")) - - if (!cidcheck_failedckeys[ckey]) - message_admins(span_adminnotice("[key_name(src)] has been detected as using a cid randomizer. Connection rejected.")) - send2tgs_adminless_only("CidRandomizer", "[key_name(src)] has been detected as using a cid randomizer. Connection rejected.") - cidcheck_failedckeys[ckey] = TRUE - note_randomizer_user() - - log_suspicious_login("Failed Login: [key] [computer_id] [address] - CID randomizer confirmed (oldcid: [oldcid])") - - qdel(src) - return TRUE - else - if (cidcheck_failedckeys[ckey]) - message_admins(span_adminnotice("[key_name_admin(src)] has been allowed to connect after showing they removed their cid randomizer")) - send2tgs_adminless_only("CidRandomizer", "[key_name(src)] has been allowed to connect after showing they removed their cid randomizer.") - cidcheck_failedckeys -= ckey - if (cidcheck_spoofckeys[ckey]) - message_admins(span_adminnotice("[key_name_admin(src)] has been allowed to connect after appearing to have attempted to spoof a cid randomizer check because it appears they aren't spoofing one this time")) - cidcheck_spoofckeys -= ckey - cidcheck -= ckey - else if (computer_id != lastcid) - cidcheck[ckey] = computer_id - tokens[ckey] = cid_check_reconnect() - - sleep(5 SECONDS) //browse is queued, we don't want them to disconnect before getting the browse() command. - - //we sleep after telling the client to reconnect, so if we still exist something is up - log_access("Forced disconnect: [key] [computer_id] [address] - CID randomizer check") - - qdel(src) - return TRUE - -/client/proc/cid_check_reconnect() - var/token = md5("[rand(0,9999)][world.time][rand(0,9999)][ckey][rand(0,9999)][address][rand(0,9999)][computer_id][rand(0,9999)]") - . = token - log_suspicious_login("Failed Login: [key] [computer_id] [address] - CID randomizer check") - var/url = winget(src, null, "url") - //special javascript to make them reconnect under a new window. - src << browse({"byond://[url]?token=[token]"}, "border=0;titlebar=0;size=1x1;window=redirect") - to_chat_immediate(src, {"You will be automatically taken to the game, if not, click here to be taken manually"}) - -/client/proc/note_randomizer_user() - add_system_note("CID-Error", "Detected as using a cid randomizer.") - /client/proc/add_system_note(system_ckey, message) //check to see if we noted them in the last day. var/datum/db_query/query_get_notes = SSdbcore.NewQuery( @@ -913,11 +831,13 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( 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) @@ -991,8 +911,6 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( add_verb(src, /client/proc/export_preferences) -#undef UPLOAD_LIMIT - //checks if a client is afk //3000 frames = 5 minutes /client/proc/is_afk(duration = CONFIG_GET(number/inactivity_period)) @@ -1117,7 +1035,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( void.UpdateGreed(actualview[1],actualview[2]) /client/proc/AnnouncePR(announcement) - if(prefs && prefs.chat_toggles & CHAT_PULLR) + if(get_chat_toggles(src) & CHAT_PULLR) to_chat(src, announcement) ///Redirect proc that makes it easier to call the unlock achievement proc. Achievement type is the typepath to the award, user is the mob getting the award, and value is an optional variable used for leaderboard value increments @@ -1318,4 +1236,3 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( #undef LIMITER_SIZE #undef MINUTE_COUNT #undef SECOND_COUNT -#undef UPLOAD_LIMIT_ADMIN diff --git a/code/modules/client/player_details.dm b/code/modules/client/player_details.dm index 24c6754b95ce1..8931dffcdb465 100644 --- a/code/modules/client/player_details.dm +++ b/code/modules/client/player_details.dm @@ -2,14 +2,26 @@ ///assoc list of ckey -> /datum/player_details GLOBAL_LIST_EMPTY(player_details) +/// Tracks information about a client between log in and log outs /datum/player_details - var/list/player_actions = list() + /// Action datums assigned to this player + var/list/datum/action/player_actions = list() + /// Tracks client action logging var/list/logging = list() + /// Callbacks invoked when this client logs in again var/list/post_login_callbacks = list() + /// Callbacks invoked when this client logs out var/list/post_logout_callbacks = list() - var/list/played_names = list() //List of names this key played under this round + /// List of names this key played under this round + var/list/played_names = list() + /// Lazylist of preference slots this client has joined the round under + /// Numbers are stored as strings + var/list/joined_as_slots + /// Version of byond this client is using var/byond_version = "Unknown" + /// Tracks achievements they have earned var/datum/achievement_data/achievements + /// World.time this player last died var/time_of_death = 0 /datum/player_details/New(key) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 72d79e2d89413..bc643cc9d45a9 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -439,6 +439,55 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(GetQuirkBalance() < 0) all_quirks = list() +/** + * Safely read a given preference datum from a given client. + * + * Reads the given preference datum from the given client, and guards against null client and null prefs. + * The client object is fickle and can go null at times, so use this instead of read_preference() if you + * want to ensure no runtimes. + * + * returns client.prefs.read_preference(prefs_to_read) or FALSE if something went wrong. + * + * Arguments: + * * client/prefs_holder - the client to read the pref from + * * datum/preference/pref_to_read - the type of preference datum to read. + */ +/proc/safe_read_pref(client/prefs_holder, datum/preference/pref_to_read) + if(!prefs_holder) + return FALSE + if(prefs_holder && !prefs_holder?.prefs) + stack_trace("[prefs_holder?.mob] ([prefs_holder?.ckey]) had null prefs, which shouldn't be possible!") + return FALSE + + return prefs_holder?.prefs.read_preference(pref_to_read) + +/** + * Get the given client's chat toggle prefs. + * + * Getter function for prefs.chat_toggles which guards against null client and null prefs. + * The client object is fickle and can go null at times, so use this instead of directly accessing the var + * if you want to ensure no runtimes. + * + * returns client.prefs.chat_toggles or FALSE if something went wrong. + * + * Arguments: + * * client/prefs_holder - the client to get the chat_toggles pref from. + */ +/proc/get_chat_toggles(client/target) + if(ismob(target)) + var/mob/target_mob = target + target = target_mob.client + + if(isnull(target)) + return NONE + + var/datum/preferences/preferences = target.prefs + if(isnull(preferences)) + stack_trace("[key_name(target)] preference datum was null") + return NONE + + return preferences.chat_toggles + /// Sanitizes the preferences, applies the randomization prefs, and then applies the preference to the human mob. /datum/preferences/proc/safe_transfer_prefs_to(mob/living/carbon/human/character, icon_updates = TRUE, is_antag = FALSE) apply_character_randomization_prefs(is_antag) diff --git a/code/modules/client/preferences/README.md b/code/modules/client/preferences/README.md index 9df77515e51e4..0089953639883 100644 --- a/code/modules/client/preferences/README.md +++ b/code/modules/client/preferences/README.md @@ -135,14 +135,18 @@ Choiced preferences can generate icons. This is how the clothing/species prefere savefile_key = "favorite_drink" should_generate_icons = TRUE // NEW! This is necessary. -// Instead of returning a flat list, this now returns an assoc list -// of values to icons. /datum/preference/choiced/favorite_drink/init_possible_values() - return list( - "Milk" = icon('drinks.dmi', "milk"), - "Cola" = icon('drinks.dmi', "cola"), - "Water" = icon('drinks.dmi', "water"), - ) + return list("Milk", "Cola", "Water") + +// New! This proc will get called for every value. +/datum/preference/choiced/favorite_drink/icon_for(value) + switch (value) + if ("Milk") + return icon('drinks.dmi', "milk") + if ("Cola") + return icon('drinks.dmi', "cola") + if ("Water") + return icon('drinks.dmi', "water") ``` Then, change your `.tsx` file to look like: diff --git a/code/modules/client/preferences/_preference.dm b/code/modules/client/preferences/_preference.dm index 54695d937b117..644d57b6d24d1 100644 --- a/code/modules/client/preferences/_preference.dm +++ b/code/modules/client/preferences/_preference.dm @@ -5,18 +5,24 @@ /// The priority at which species runs, needed for external organs to apply properly. #define PREFERENCE_PRIORITY_SPECIES 2 +/** + * Some preferences get applied directly to bodyparts (anything head_flags related right now). + * These must apply after species, as species gaining might replace the bodyparts of the human. + */ +#define PREFERENCE_PRIORITY_BODYPARTS 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 /// The priority at which names are decided, needed for proper randomization. -#define PREFERENCE_PRIORITY_NAMES 5 +#define PREFERENCE_PRIORITY_NAMES 6 /// Preferences that aren't names, but change the name changes set by PREFERENCE_PRIORITY_NAMES. -#define PREFERENCE_PRIORITY_NAME_MODIFICATIONS 6 +#define PREFERENCE_PRIORITY_NAME_MODIFICATIONS 7 /// The maximum preference priority, keep this updated, but don't use it for `priority`. #define MAX_PREFERENCE_PRIORITY PREFERENCE_PRIORITY_NAME_MODIFICATIONS @@ -101,14 +107,18 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key()) /// will show the feature as selectable. var/relevant_mutant_bodypart = null - /// If the selected species has this in its /datum/species/species_traits, + /// If the selected species has this in its /datum/species/inherent_traits, /// will show the feature as selectable. - var/relevant_species_trait = null + var/relevant_inherent_trait = null /// If the selected species has this in its /datum/species/var/external_organs, /// will show the feature as selectable. var/relevant_external_organ = null + /// If the selected species has this head_flag by default, + /// will show the feature as selectable. + var/relevant_head_flag = null + /// Called on the saved input when retrieving. /// Also called by the value sent from the user through UI. Do not trust it. /// Input is the value inside the savefile, output is to tell other code @@ -313,7 +323,12 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key()) SHOULD_CALL_PARENT(TRUE) SHOULD_NOT_SLEEP(TRUE) - if (!isnull(relevant_mutant_bodypart) || !isnull(relevant_species_trait) || !isnull(relevant_external_organ)) + if ( \ + !isnull(relevant_mutant_bodypart) \ + || !isnull(relevant_inherent_trait) \ + || !isnull(relevant_external_organ) \ + || !isnull(relevant_head_flag) \ + ) var/species_type = preferences.read_preference(/datum/preference/choiced/species) var/datum/species/species = new species_type @@ -335,9 +350,8 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key()) /// A preference that is a choice of one option among a fixed set. /// Used for preferences such as clothing. /datum/preference/choiced - /// If this is TRUE, icons will be generated. - /// This is necessary for if your `init_possible_values()` override - /// returns an assoc list of names to atoms/icons. + /// If this is TRUE, an icon will be generated for every value. + /// If you implement this, you must implement `icon_for(value)` for every possible value. var/should_generate_icons = FALSE var/list/cached_values @@ -364,34 +378,31 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key()) return cached_values /// Returns a list of every possible value, serialized. -/// Return value can be in the form of: -/// - A flat list of serialized values, such as list(MALE, FEMALE, PLURAL). -/// - An assoc list of serialized values to atoms/icons. /datum/preference/choiced/proc/get_choices_serialized() // Override `init_values()` instead. SHOULD_NOT_OVERRIDE(TRUE) var/list/serialized_choices = list() - var/choices = get_choices() - if (should_generate_icons) - for (var/choice in choices) - serialized_choices[serialize(choice)] = choices[choice] - else - for (var/choice in choices) - serialized_choices += serialize(choice) + for (var/choice in get_choices()) + serialized_choices += serialize(choice) return serialized_choices /// Returns a list of every possible value. /// This must be overriden by `/datum/preference/choiced` subtypes. -/// Return value can be in the form of: -/// - A flat list of raw values, such as list(MALE, FEMALE, PLURAL). -/// - An assoc list of raw values to atoms/icons, in which case -/// icons will be generated. +/// If `should_generate_icons` is TRUE, then you will also need to implement `icon_for(value)` +/// for every possible value. /datum/preference/choiced/proc/init_possible_values() CRASH("`init_possible_values()` was not implemented for [type]!") +/// When `should_generate_icons` is TRUE, this proc is called for every value. +/// It can return either an icon or a typepath to an atom to create. +/datum/preference/choiced/proc/icon_for(value) + SHOULD_CALL_PARENT(FALSE) + SHOULD_NOT_SLEEP(TRUE) + CRASH("`icon_for()` was not implemented for [type], even though should_generate_icons = TRUE!") + /datum/preference/choiced/is_valid(value) return value in get_choices() @@ -441,51 +452,6 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key()) /datum/preference/color/is_valid(value) return findtext(value, GLOB.is_color) -/// Takes an assoc list of names to /datum/sprite_accessory and returns a value -/// fit for `/datum/preference/init_possible_values()` -/proc/possible_values_for_sprite_accessory_list(list/datum/sprite_accessory/sprite_accessories) - var/list/possible_values = list() - for (var/name in sprite_accessories) - var/datum/sprite_accessory/sprite_accessory = sprite_accessories[name] - if (istype(sprite_accessory)) - possible_values[name] = icon(sprite_accessory.icon, sprite_accessory.icon_state) - else - // This means it didn't have an icon state - possible_values[name] = icon('icons/mob/landmarks.dmi', "x") - return possible_values - -/// Takes an assoc list of names to /datum/sprite_accessory and returns a value -/// fit for `/datum/preference/init_possible_values()` -/// Different from `possible_values_for_sprite_accessory_list` in that it takes a list of layers -/// such as BEHIND, FRONT, and ADJ. -/// It also takes a "body part name", such as body_markings, moth_wings, etc -/// They are expected to be in order from lowest to top. -/proc/possible_values_for_sprite_accessory_list_for_body_part( - list/datum/sprite_accessory/sprite_accessories, - body_part, - list/layers, -) - var/list/possible_values = list() - - for (var/name in sprite_accessories) - var/datum/sprite_accessory/sprite_accessory = sprite_accessories[name] - if(sprite_accessory.locked) - continue - - var/icon/final_icon - - for (var/layer in layers) - var/icon/icon = icon(sprite_accessory.icon, "m_[body_part]_[sprite_accessory.icon_state]_[layer]") - - if (isnull(final_icon)) - final_icon = icon - else - final_icon.Blend(icon, ICON_OVERLAY) - - possible_values[name] = final_icon - - return possible_values - /// A numeric preference with a minimum and maximum value /datum/preference/numeric /// The minimum value diff --git a/code/modules/client/preferences/ai_core_display.dm b/code/modules/client/preferences/ai_core_display.dm index 72b8219931daa..924b475961ea7 100644 --- a/code/modules/client/preferences/ai_core_display.dm +++ b/code/modules/client/preferences/ai_core_display.dm @@ -6,14 +6,13 @@ should_generate_icons = TRUE /datum/preference/choiced/ai_core_display/init_possible_values() - var/list/values = list() + return GLOB.ai_core_display_screens - "Portrait" - values["Random"] = icon('icons/mob/silicon/ai.dmi', "ai-empty") - - for (var/screen in GLOB.ai_core_display_screens - "Portrait" - "Random") - values[screen] = icon('icons/mob/silicon/ai.dmi', resolve_ai_icon_sync(screen)) - - return values +/datum/preference/choiced/ai_core_display/icon_for(value) + if (value == "Random") + return icon('icons/mob/silicon/ai.dmi', "questionmark") + else + return icon('icons/mob/silicon/ai.dmi', resolve_ai_icon_sync(value)) /datum/preference/choiced/ai_core_display/is_accessible(datum/preferences/preferences) if (!..(preferences)) diff --git a/code/modules/client/preferences/ai_emote_display.dm b/code/modules/client/preferences/ai_emote_display.dm new file mode 100644 index 0000000000000..eea059c8fe986 --- /dev/null +++ b/code/modules/client/preferences/ai_emote_display.dm @@ -0,0 +1,24 @@ +/// What to show on the AI monitor +/datum/preference/choiced/ai_emote_display + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "preferred_ai_emote_display" + should_generate_icons = TRUE + +/datum/preference/choiced/ai_emote_display/init_possible_values() + return assoc_to_keys(GLOB.ai_status_display_emotes) + +/datum/preference/choiced/ai_emote_display/icon_for(value) + if (value == "Random") + return icon('icons/mob/silicon/ai.dmi', "questionmark") + else + return icon('icons/obj/machines/status_display.dmi', GLOB.ai_status_display_emotes[value]) + +/datum/preference/choiced/ai_emote_display/is_accessible(datum/preferences/preferences) + if (!..(preferences)) + return FALSE + + return istype(preferences.get_highest_priority_job(), /datum/job/ai) + +/datum/preference/choiced/ai_emote_display/apply_to_human(mob/living/carbon/human/target, value) + return diff --git a/code/modules/client/preferences/ai_hologram_display.dm b/code/modules/client/preferences/ai_hologram_display.dm new file mode 100644 index 0000000000000..e71f806c3e4af --- /dev/null +++ b/code/modules/client/preferences/ai_hologram_display.dm @@ -0,0 +1,24 @@ +/// What to show on the AI hologram +/datum/preference/choiced/ai_hologram_display + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "preferred_ai_hologram_display" + should_generate_icons = TRUE + +/datum/preference/choiced/ai_hologram_display/init_possible_values() + return assoc_to_keys(GLOB.ai_hologram_icons) + "Random" + +/datum/preference/choiced/ai_hologram_display/icon_for(value) + if (value == "Random") + return icon('icons/mob/silicon/ai.dmi', "questionmark") + else + return icon(GLOB.ai_hologram_icons[value], GLOB.ai_hologram_icon_state[value]) + +/datum/preference/choiced/ai_hologram_display/is_accessible(datum/preferences/preferences) + if (!..(preferences)) + return FALSE + + return istype(preferences.get_highest_priority_job(), /datum/job/ai) + +/datum/preference/choiced/ai_hologram_display/apply_to_human(mob/living/carbon/human/target, value) + return diff --git a/code/modules/client/preferences/assets.dm b/code/modules/client/preferences/assets.dm index fbd4d0698ca48..6fa29b9f90fb5 100644 --- a/code/modules/client/preferences/assets.dm +++ b/code/modules/client/preferences/assets.dm @@ -15,9 +15,8 @@ if (!preference.should_generate_icons) continue - var/list/choices = preference.get_choices_serialized() - for (var/preference_value in choices) - var/create_icon_of = choices[preference_value] + for (var/preference_value in preference.get_choices()) + var/create_icon_of = preference.icon_for(preference_value) var/icon/icon var/icon_state @@ -31,8 +30,8 @@ else CRASH("[create_icon_of] is an invalid preference value (from [preference_key]:[preference_value]).") - to_insert[preference.get_spritesheet_key(preference_value)] = list(icon, icon_state) - + to_insert[preference.get_spritesheet_key(preference.serialize(preference_value))] = list(icon, icon_state) + for (var/spritesheet_key in to_insert) var/list/inserting = to_insert[spritesheet_key] Insert(spritesheet_key, inserting[1], inserting[2]) diff --git a/code/modules/client/preferences/clothing.dm b/code/modules/client/preferences/clothing.dm index c9397bde35090..cf200ad1ffd65 100644 --- a/code/modules/client/preferences/clothing.dm +++ b/code/modules/client/preferences/clothing.dm @@ -1,28 +1,16 @@ -/proc/generate_values_for_underwear(list/accessory_list, list/icons, color) - var/icon/lower_half = icon('icons/blanks/32x32.dmi', "nothing") +/proc/generate_underwear_icon(datum/sprite_accessory/accessory, icon/base_icon, color) + var/icon/final_icon = new(base_icon) - for (var/icon in icons) - lower_half.Blend(icon('icons/mob/species/human/bodyparts_greyscale.dmi', icon), ICON_OVERLAY) + if (!isnull(accessory)) + var/icon/accessory_icon = icon('icons/mob/clothing/underwear.dmi', accessory.icon_state) + if (color && !accessory.use_static) + accessory_icon.Blend(color, ICON_MULTIPLY) + final_icon.Blend(accessory_icon, ICON_OVERLAY) - var/list/values = list() + final_icon.Crop(10, 1, 22, 13) + final_icon.Scale(32, 32) - for (var/accessory_name in accessory_list) - var/icon/icon_with_socks = new(lower_half) - - if (accessory_name != "Nude") - var/datum/sprite_accessory/accessory = accessory_list[accessory_name] - - var/icon/accessory_icon = icon('icons/mob/clothing/underwear.dmi', accessory.icon_state) - if (color && !accessory.use_static) - accessory_icon.Blend(color, ICON_MULTIPLY) - icon_with_socks.Blend(accessory_icon, ICON_OVERLAY) - - icon_with_socks.Crop(10, 1, 22, 13) - icon_with_socks.Scale(32, 32) - - values[accessory_name] = icon_with_socks - - return values + return final_icon /// Backpack preference /datum/preference/choiced/backpack @@ -33,22 +21,43 @@ should_generate_icons = TRUE /datum/preference/choiced/backpack/init_possible_values() - var/list/values = list() - - values[GBACKPACK] = /obj/item/storage/backpack - values[GSATCHEL] = /obj/item/storage/backpack/satchel - values[LSATCHEL] = /obj/item/storage/backpack/satchel/leather - values[GDUFFELBAG] = /obj/item/storage/backpack/duffelbag - - // In a perfect world, these would be your department's backpack. - // However, this doesn't factor in assistants, or no high slot, and would - // also increase the spritesheet size a lot. - // I play medical doctor, and so medical doctor you get. - values[DBACKPACK] = /obj/item/storage/backpack/medic - values[DSATCHEL] = /obj/item/storage/backpack/satchel/med - values[DDUFFELBAG] = /obj/item/storage/backpack/duffelbag/med - - return values + return list( + GBACKPACK, + GSATCHEL, + LSATCHEL, + GDUFFELBAG, + GMESSENGER, + DBACKPACK, + DSATCHEL, + DDUFFELBAG, + DMESSENGER, + ) + +/datum/preference/choiced/backpack/icon_for(value) + switch (value) + if (GBACKPACK) + return /obj/item/storage/backpack + if (GSATCHEL) + return /obj/item/storage/backpack/satchel + if (LSATCHEL) + return /obj/item/storage/backpack/satchel/leather + if (GDUFFELBAG) + return /obj/item/storage/backpack/duffelbag + if (GMESSENGER) + return /obj/item/storage/backpack/messenger + + // In a perfect world, these would be your department's backpack. + // However, this doesn't factor in assistants, or no high slot, and would + // also increase the spritesheet size a lot. + // I play medical doctor, and so medical doctor you get. + if (DBACKPACK) + return /obj/item/storage/backpack/medic + if (DSATCHEL) + return /obj/item/storage/backpack/satchel/med + if (DDUFFELBAG) + return /obj/item/storage/backpack/duffelbag/med + if (DMESSENGER) + return /obj/item/storage/backpack/messenger/med /datum/preference/choiced/backpack/apply_to_human(mob/living/carbon/human/target, value) target.backpack = value @@ -62,12 +71,17 @@ should_generate_icons = TRUE /datum/preference/choiced/jumpsuit/init_possible_values() - var/list/values = list() - - values[PREF_SUIT] = /obj/item/clothing/under/color/grey - values[PREF_SKIRT] = /obj/item/clothing/under/color/jumpskirt/grey - - return values + return list( + PREF_SUIT, + PREF_SKIRT, + ) + +/datum/preference/choiced/jumpsuit/icon_for(value) + switch (value) + if (PREF_SUIT) + return /obj/item/clothing/under/color/grey + if (PREF_SKIRT) + return /obj/item/clothing/under/color/jumpskirt/grey /datum/preference/choiced/jumpsuit/apply_to_human(mob/living/carbon/human/target, value) target.jumpsuit_style = value @@ -81,7 +95,17 @@ should_generate_icons = TRUE /datum/preference/choiced/socks/init_possible_values() - return generate_values_for_underwear(GLOB.socks_list, list("human_r_leg", "human_l_leg")) + return assoc_to_keys_features(GLOB.socks_list) + +/datum/preference/choiced/socks/icon_for(value) + var/static/icon/lower_half + + if (isnull(lower_half)) + lower_half = icon('icons/blanks/32x32.dmi', "nothing") + lower_half.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_leg"), ICON_OVERLAY) + lower_half.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_leg"), ICON_OVERLAY) + + return generate_underwear_icon(GLOB.socks_list[value], lower_half) /datum/preference/choiced/socks/apply_to_human(mob/living/carbon/human/target, value) target.socks = value @@ -95,28 +119,28 @@ should_generate_icons = TRUE /datum/preference/choiced/undershirt/init_possible_values() - var/icon/body = icon('icons/mob/species/human/bodyparts_greyscale.dmi', "human_r_leg") - body.Blend(icon('icons/mob/species/human/bodyparts_greyscale.dmi', "human_l_leg"), ICON_OVERLAY) - body.Blend(icon('icons/mob/species/human/bodyparts_greyscale.dmi', "human_r_arm"), ICON_OVERLAY) - body.Blend(icon('icons/mob/species/human/bodyparts_greyscale.dmi', "human_l_arm"), ICON_OVERLAY) - body.Blend(icon('icons/mob/species/human/bodyparts_greyscale.dmi', "human_r_hand"), ICON_OVERLAY) - body.Blend(icon('icons/mob/species/human/bodyparts_greyscale.dmi', "human_l_hand"), ICON_OVERLAY) - body.Blend(icon('icons/mob/species/human/bodyparts_greyscale.dmi', "human_chest_m"), ICON_OVERLAY) + return assoc_to_keys_features(GLOB.undershirt_list) - var/list/values = list() +/datum/preference/choiced/undershirt/icon_for(value) + var/static/icon/body + if (isnull(body)) + body = icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_leg") + body.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_leg"), ICON_OVERLAY) + body.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_arm"), ICON_OVERLAY) + body.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_arm"), ICON_OVERLAY) + body.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_hand"), ICON_OVERLAY) + body.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_hand"), ICON_OVERLAY) + body.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_chest_m"), ICON_OVERLAY) - for (var/accessory_name in GLOB.undershirt_list) - var/icon/icon_with_undershirt = icon(body) + var/icon/icon_with_undershirt = icon(body) - if (accessory_name != "Nude") - var/datum/sprite_accessory/accessory = GLOB.undershirt_list[accessory_name] - icon_with_undershirt.Blend(icon('icons/mob/clothing/underwear.dmi', accessory.icon_state), ICON_OVERLAY) + if (value != "Nude") + var/datum/sprite_accessory/accessory = GLOB.undershirt_list[value] + icon_with_undershirt.Blend(icon('icons/mob/clothing/underwear.dmi', accessory.icon_state), ICON_OVERLAY) - icon_with_undershirt.Crop(9, 9, 23, 23) - icon_with_undershirt.Scale(32, 32) - values[accessory_name] = icon_with_undershirt - - return values + icon_with_undershirt.Crop(9, 9, 23, 23) + icon_with_undershirt.Scale(32, 32) + return icon_with_undershirt /datum/preference/choiced/undershirt/apply_to_human(mob/living/carbon/human/target, value) target.undershirt = value @@ -130,7 +154,18 @@ should_generate_icons = TRUE /datum/preference/choiced/underwear/init_possible_values() - return generate_values_for_underwear(GLOB.underwear_list, list("human_chest_m", "human_r_leg", "human_l_leg"), COLOR_ALMOST_BLACK) + return assoc_to_keys_features(GLOB.underwear_list) + +/datum/preference/choiced/underwear/icon_for(value) + var/static/icon/lower_half + + if (isnull(lower_half)) + lower_half = icon('icons/blanks/32x32.dmi', "nothing") + lower_half.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_chest_m"), ICON_OVERLAY) + lower_half.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_leg"), ICON_OVERLAY) + lower_half.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_leg"), ICON_OVERLAY) + + return generate_underwear_icon(GLOB.underwear_list[value], lower_half, COLOR_ALMOST_BLACK) /datum/preference/choiced/underwear/apply_to_human(mob/living/carbon/human/target, value) target.underwear = value @@ -141,7 +176,7 @@ var/species_type = preferences.read_preference(/datum/preference/choiced/species) var/datum/species/species = new species_type - return !(NO_UNDERWEAR in species.species_traits) + return !(TRAIT_NO_UNDERWEAR in species.inherent_traits) /datum/preference/choiced/underwear/compile_constant_data() var/list/data = ..() diff --git a/code/modules/client/preferences/gender.dm b/code/modules/client/preferences/gender.dm index d24b1954c2c6d..bea6674d7b086 100644 --- a/code/modules/client/preferences/gender.dm +++ b/code/modules/client/preferences/gender.dm @@ -5,7 +5,7 @@ priority = PREFERENCE_PRIORITY_GENDER /datum/preference/choiced/gender/init_possible_values() - return list(MALE, FEMALE, PLURAL) + return list(MALE, FEMALE, PLURAL, NEUTER) /datum/preference/choiced/gender/apply_to_human(mob/living/carbon/human/target, value) if(!target.dna.species.sexes) diff --git a/code/modules/client/preferences/ghost.dm b/code/modules/client/preferences/ghost.dm index ae84249507dd2..e3d7fbf6328a7 100644 --- a/code/modules/client/preferences/ghost.dm +++ b/code/modules/client/preferences/ghost.dm @@ -71,12 +71,10 @@ ) /datum/preference/choiced/ghost_form/init_possible_values() - var/list/values = list() + return assoc_to_keys(ghost_forms) - for (var/ghost_form in ghost_forms) - values[ghost_form] = icon('icons/mob/simple/mob.dmi', ghost_form) - - return values +/datum/preference/choiced/ghost_form/icon_for(value) + return icon('icons/mob/simple/mob.dmi', value) /datum/preference/choiced/ghost_form/create_default_value() return "ghost" diff --git a/code/modules/client/preferences/glasses.dm b/code/modules/client/preferences/glasses.dm index 6e93c98fd3765..e34cdd0e09060 100644 --- a/code/modules/client/preferences/glasses.dm +++ b/code/modules/client/preferences/glasses.dm @@ -5,14 +5,13 @@ should_generate_icons = TRUE /datum/preference/choiced/glasses/init_possible_values() - var/list/values = list() + return assoc_to_keys(GLOB.nearsighted_glasses) + "Random" - values["Random"] = icon('icons/effects/random_spawners.dmi', "questionmark") - - for(var/glass_design in GLOB.nearsighted_glasses - "Random") - values[glass_design] = icon('icons/obj/clothing/glasses.dmi', "glasses_[lowertext(glass_design)]") - - return values +/datum/preference/choiced/glasses/icon_for(value) + if (value == "Random") + return icon('icons/effects/random_spawners.dmi', "questionmark") + else + return icon('icons/obj/clothing/glasses.dmi', "glasses_[lowertext(value)]") /datum/preference/choiced/glasses/is_accessible(datum/preferences/preferences) if (!..(preferences)) diff --git a/code/modules/client/preferences/language.dm b/code/modules/client/preferences/language.dm new file mode 100644 index 0000000000000..2de14be09cf0d --- /dev/null +++ b/code/modules/client/preferences/language.dm @@ -0,0 +1,32 @@ +/datum/preference/choiced/language + category = PREFERENCE_CATEGORY_SECONDARY_FEATURES + savefile_key = "language" + savefile_identifier = PREFERENCE_CHARACTER + +/datum/preference/choiced/language/is_accessible(datum/preferences/preferences) + if (!..(preferences)) + return FALSE + + return "Bilingual" in preferences.all_quirks + +/datum/preference/choiced/language/init_possible_values() + var/list/values = list() + + if(!GLOB.uncommon_roundstart_languages.len) + generate_selectable_species_and_languages() + + values += "Random" + + //we add uncommon as it's foreigner-only. + var/datum/language/uncommon/uncommon_language = /datum/language/uncommon + values += initial(uncommon_language.name) + + for(var/datum/language/language_type as anything in GLOB.uncommon_roundstart_languages) + if(initial(language_type.name) in values) + continue + values += initial(language_type.name) + + return values + +/datum/preference/choiced/language/apply_to_human(mob/living/carbon/human/target, value) + return diff --git a/code/modules/client/preferences/middleware/antags.dm b/code/modules/client/preferences/middleware/antags.dm index d04b9c0c0fd71..e13167ba7347f 100644 --- a/code/modules/client/preferences/middleware/antags.dm +++ b/code/modules/client/preferences/middleware/antags.dm @@ -116,6 +116,7 @@ /datum/asset/spritesheet/antagonists/create_spritesheets() // Antagonists that don't have a dynamic ruleset, but do have a preference var/static/list/non_ruleset_antagonists = list( + ROLE_CYBER_POLICE = /datum/antagonist/cyber_police, ROLE_FUGITIVE = /datum/antagonist/fugitive, ROLE_LONE_OPERATIVE = /datum/antagonist/nukeop/lone, ROLE_SENTIENCE = /datum/antagonist/sentient_creature, diff --git a/code/modules/client/preferences/middleware/quirks.dm b/code/modules/client/preferences/middleware/quirks.dm index 2c741c67f10af..a3634dec35ad7 100644 --- a/code/modules/client/preferences/middleware/quirks.dm +++ b/code/modules/client/preferences/middleware/quirks.dm @@ -43,7 +43,7 @@ return list( "max_positive_quirks" = MAX_QUIRKS, "quirk_info" = quirk_info, - "quirk_blacklist" = SSquirks.quirk_blacklist, + "quirk_blacklist" = GLOB.quirk_string_blacklist, ) /datum/preference_middleware/quirks/on_new_character(mob/user) diff --git a/code/modules/client/preferences/middleware/tts.dm b/code/modules/client/preferences/middleware/tts.dm index ddb1ffadaeb31..4d3ee3261bd3a 100644 --- a/code/modules/client/preferences/middleware/tts.dm +++ b/code/modules/client/preferences/middleware/tts.dm @@ -5,12 +5,23 @@ action_delegations = list( "play_voice" = PROC_REF(play_voice), + "play_voice_robot" = PROC_REF(play_voice_robot), ) /datum/preference_middleware/tts/proc/play_voice(list/params, mob/user) if(!COOLDOWN_FINISHED(src, tts_test_cooldown)) return TRUE var/speaker = preferences.read_preference(/datum/preference/choiced/voice) + var/pitch = preferences.read_preference(/datum/preference/numeric/tts_voice_pitch) COOLDOWN_START(src, tts_test_cooldown, 0.5 SECONDS) - INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), user.client, "Hello, this is my voice.", speaker = speaker, local = TRUE) + INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), user.client, "Hello, this is my voice.", speaker = speaker, pitch = pitch, local = TRUE) + return TRUE + +/datum/preference_middleware/tts/proc/play_voice_robot(list/params, mob/user) + if(!COOLDOWN_FINISHED(src, tts_test_cooldown)) + return TRUE + var/speaker = preferences.read_preference(/datum/preference/choiced/voice) + var/pitch = preferences.read_preference(/datum/preference/numeric/tts_voice_pitch) + COOLDOWN_START(src, tts_test_cooldown, 0.5 SECONDS) + INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), user.client, "Look at you, Player. A pathetic creature of meat and bone. How can you challenge a perfect, immortal machine?", speaker = speaker, pitch = pitch, special_filters = TTS_FILTER_SILICON, local = TRUE) return TRUE diff --git a/code/modules/client/preferences/migrations/tts_blip_migration.dm b/code/modules/client/preferences/migrations/tts_blip_migration.dm new file mode 100644 index 0000000000000..0b1c925bb9af7 --- /dev/null +++ b/code/modules/client/preferences/migrations/tts_blip_migration.dm @@ -0,0 +1,12 @@ +/// Previously, tts enabled/blip were individual buttons +/// PR #76558 changed them to one dropdown choice. +/// This migration transfers the player's existing preferences into the new dropdown + +/datum/preferences/proc/update_tts_blip_prefs() + var/sound_blips_enabled = savefile.get_entry("sound_tts_blips") + if(sound_blips_enabled) + write_preference(GLOB.preference_entries[/datum/preference/choiced/sound_tts], TTS_SOUND_BLIPS) + return + var/tts_enabled = savefile.get_entry("sound_tts") + if(!tts_enabled) + write_preference(GLOB.preference_entries[/datum/preference/choiced/sound_tts], TTS_SOUND_OFF) diff --git a/code/modules/client/preferences/operative_species.dm b/code/modules/client/preferences/operative_species.dm new file mode 100644 index 0000000000000..0b55bc23b52fd --- /dev/null +++ b/code/modules/client/preferences/operative_species.dm @@ -0,0 +1,23 @@ +/// When TRUE, will spawn you as a human when selected for an operative role +/// When FALSE, players will be placed into the game as their character's species +/datum/preference/toggle/nuke_ops_species + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + can_randomize = FALSE + default_value = TRUE + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "operative_species" + +/datum/preference/toggle/nuke_ops_species/is_accessible(datum/preferences/preferences) + . = ..() + if(!.) + return FALSE + + // If one of the roles is ticked in the antag prefs menu, this option will show. + var/static/list/ops_roles = list(ROLE_OPERATIVE, ROLE_LONE_OPERATIVE, ROLE_OPERATIVE_MIDROUND, ROLE_CLOWN_OPERATIVE) + if(length(ops_roles & preferences.be_special)) + return TRUE + + return FALSE + +/datum/preference/toggle/nuke_ops_species/apply_to_human(mob/living/carbon/human/target, value) + return diff --git a/code/modules/client/preferences/prisoner_crime.dm b/code/modules/client/preferences/prisoner_crime.dm index bb8d0f5e669ab..0971e84b46e56 100644 --- a/code/modules/client/preferences/prisoner_crime.dm +++ b/code/modules/client/preferences/prisoner_crime.dm @@ -98,12 +98,22 @@ GLOBAL_LIST_INIT(prisoner_crimes, init_prisoner_crimes()) name = "Identity Theft of High-Ranking Figure" desc = "Impersonated a high-ranking figure." tattoos = 0 //well, obviously can't impersonate people with tats. if they want to go back to doing that + +/datum/prisoner_crime/jaywalker + name = "Jaywalker" + desc = "Jaywalked across non-green tram crossings, shuttle docking zones, and/or through space." + tattoos = 0 // Or should it be 6? /datum/prisoner_crime/kidnapping name = "Kidnapping" desc = "Planned and executed a kidnapping." tattoos = 1 +/datum/prisoner_crime/mass_murder + name = "Mass Murder" + desc = "Maliciously planned and executed the slaughter of many people." + tattoos = 6 + /datum/prisoner_crime/malpractice name = "Medical Malpractice" desc = "Engaged in organ harvesting, limb theft, or other malicious medical procedures." @@ -138,8 +148,3 @@ GLOBAL_LIST_INIT(prisoner_crimes, init_prisoner_crimes()) name = "Worship of Blacklisted Deities" desc = "Practiced worship of blacklisted deities." tattoos = 1 - -/datum/prisoner_crime/mass_murder - name = "Mass Murder" - desc = "Maliciously planned and executed the slaughter of many people." - tattoos = 6 diff --git a/code/modules/client/preferences/prosthetic.dm b/code/modules/client/preferences/prosthetic.dm new file mode 100644 index 0000000000000..f66f1278c48a9 --- /dev/null +++ b/code/modules/client/preferences/prosthetic.dm @@ -0,0 +1,17 @@ +/datum/preference/choiced/prosthetic + category = PREFERENCE_CATEGORY_SECONDARY_FEATURES + savefile_key = "prosthetic" + savefile_identifier = PREFERENCE_CHARACTER + +/datum/preference/choiced/prosthetic/init_possible_values() + return list("Random") + GLOB.limb_choice + +/datum/preference/choiced/prosthetic/is_accessible(datum/preferences/preferences) + . = ..() + if (!.) + return FALSE + + return "Prosthetic Limb" in preferences.all_quirks + +/datum/preference/choiced/prosthetic/apply_to_human(mob/living/carbon/human/target, value) + return diff --git a/code/modules/client/preferences/screentips.dm b/code/modules/client/preferences/screentips.dm index 5566f28b539f7..87ce18d7f24e9 100644 --- a/code/modules/client/preferences/screentips.dm +++ b/code/modules/client/preferences/screentips.dm @@ -35,4 +35,12 @@ client.mob?.hud_used?.screentip_color = value /datum/preference/color/screentip_color/create_default_value() - return "#ffd391" + return LIGHT_COLOR_FAINT_BLUE + +/datum/preference/toggle/screentip_images + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_key = "screentip_images" + savefile_identifier = PREFERENCE_PLAYER + +/datum/preference/toggle/screentip_images/apply_to_client(client/client, value) + client.mob?.hud_used?.screentip_images = value diff --git a/code/modules/client/preferences/skin_tone.dm b/code/modules/client/preferences/skin_tone.dm index 119fd6a86a314..d2359f8ce694a 100644 --- a/code/modules/client/preferences/skin_tone.dm +++ b/code/modules/client/preferences/skin_tone.dm @@ -1,7 +1,8 @@ /datum/preference/choiced/skin_tone - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - savefile_identifier = PREFERENCE_CHARACTER savefile_key = "skin_tone" + savefile_identifier = PREFERENCE_CHARACTER + category = PREFERENCE_CATEGORY_SECONDARY_FEATURES + relevant_inherent_trait = TRAIT_USES_SKINTONES /datum/preference/choiced/skin_tone/init_possible_values() return GLOB.skin_tones @@ -27,10 +28,3 @@ /datum/preference/choiced/skin_tone/apply_to_human(mob/living/carbon/human/target, value) target.skin_tone = value - -/datum/preference/choiced/skin_tone/is_accessible(datum/preferences/preferences) - if (!..(preferences)) - return FALSE - - var/datum/species/species_type = preferences.read_preference(/datum/preference/choiced/species) - return initial(species_type.use_skintones) diff --git a/code/modules/client/preferences/sounds.dm b/code/modules/client/preferences/sounds.dm index 0a9a788f6870d..f56430b53638a 100644 --- a/code/modules/client/preferences/sounds.dm +++ b/code/modules/client/preferences/sounds.dm @@ -28,16 +28,16 @@ savefile_key = "sound_instruments" savefile_identifier = PREFERENCE_PLAYER -/datum/preference/toggle/sound_tts +/datum/preference/choiced/sound_tts category = PREFERENCE_CATEGORY_GAME_PREFERENCES savefile_key = "sound_tts" savefile_identifier = PREFERENCE_PLAYER -/datum/preference/toggle/sound_tts_blips - category = PREFERENCE_CATEGORY_GAME_PREFERENCES - savefile_key = "sound_tts_blips" - savefile_identifier = PREFERENCE_PLAYER - default_value = FALSE +/datum/preference/choiced/sound_tts/init_possible_values() + return list(TTS_SOUND_ENABLED, TTS_SOUND_BLIPS, TTS_SOUND_OFF) + +/datum/preference/choiced/sound_tts/create_default_value() + return TTS_SOUND_ENABLED /datum/preference/numeric/sound_tts_volume category = PREFERENCE_CATEGORY_GAME_PREFERENCES @@ -50,6 +50,22 @@ /datum/preference/numeric/sound_tts_volume/create_default_value() return maximum +/datum/preference/choiced/sound_achievement + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_key = "sound_achievement" + savefile_identifier = PREFERENCE_PLAYER + +/datum/preference/choiced/sound_achievement/init_possible_values() + return list(CHEEVO_SOUND_PING, CHEEVO_SOUND_JINGLE, CHEEVO_SOUND_TADA, CHEEVO_SOUND_OFF) + +/datum/preference/choiced/sound_achievement/create_default_value() + return CHEEVO_SOUND_PING + +/datum/preference/choiced/sound_achievement/apply_to_client_updated(client/client, value) + var/sound/sound_to_send = LAZYACCESS(GLOB.achievement_sounds, value) + if(sound_to_send) + SEND_SOUND(client.mob, sound_to_send) + /// Controls hearing dance machines /datum/preference/toggle/sound_jukebox category = PREFERENCE_CATEGORY_GAME_PREFERENCES diff --git a/code/modules/client/preferences/species.dm b/code/modules/client/preferences/species.dm index c90b182f16c5b..9e4923d2b11da 100644 --- a/code/modules/client/preferences/species.dm +++ b/code/modules/client/preferences/species.dm @@ -41,7 +41,7 @@ data[species_id]["desc"] = species.get_species_description() data[species_id]["lore"] = species.get_species_lore() data[species_id]["icon"] = sanitize_css_class_name(species.name) - data[species_id]["use_skintones"] = species.use_skintones + data[species_id]["use_skintones"] = (TRAIT_USES_SKINTONES in species.inherent_traits) data[species_id]["sexes"] = species.sexes data[species_id]["enabled_features"] = species.get_features() data[species_id]["perks"] = species.get_species_perks() diff --git a/code/modules/client/preferences/species_features/basic.dm b/code/modules/client/preferences/species_features/basic.dm index 257269070bcb9..6e34a234e7d01 100644 --- a/code/modules/client/preferences/species_features/basic.dm +++ b/code/modules/client/preferences/species_features/basic.dm @@ -1,32 +1,28 @@ -/proc/generate_possible_values_for_sprite_accessories_on_head(accessories) - var/list/values = possible_values_for_sprite_accessory_list(accessories) +/proc/generate_icon_with_head_accessory(datum/sprite_accessory/sprite_accessory) + var/static/icon/head_icon + if (isnull(head_icon)) + head_icon = icon('icons/mob/human/bodyparts_greyscale.dmi', "human_head_m") + head_icon.Blend(skintone2hex("caucasian1"), ICON_MULTIPLY) - var/icon/head_icon = icon('icons/mob/species/human/bodyparts_greyscale.dmi', "human_head_m") - head_icon.Blend(skintone2hex("caucasian1"), ICON_MULTIPLY) + var/icon/final_icon = new(head_icon) + if (!isnull(sprite_accessory)) + ASSERT(istype(sprite_accessory)) - for (var/name in values) - var/datum/sprite_accessory/accessory = accessories[name] - if (accessory == null || accessory.icon_state == null) - continue + var/icon/head_accessory_icon = icon(sprite_accessory.icon, sprite_accessory.icon_state) + head_accessory_icon.Blend(COLOR_DARK_BROWN, ICON_MULTIPLY) + final_icon.Blend(head_accessory_icon, ICON_OVERLAY) - var/icon/final_icon = new(head_icon) + final_icon.Crop(10, 19, 22, 31) + final_icon.Scale(32, 32) - var/icon/beard_icon = values[name] - beard_icon.Blend(COLOR_DARK_BROWN, ICON_MULTIPLY) - final_icon.Blend(beard_icon, ICON_OVERLAY) - - final_icon.Crop(10, 19, 22, 31) - final_icon.Scale(32, 32) - - values[name] = final_icon - - return values + return final_icon /datum/preference/color/eye_color + priority = PREFERENCE_PRIORITY_BODYPARTS savefile_key = "eye_color" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - relevant_species_trait = EYECOLOR + relevant_head_flag = HEAD_EYECOLOR /datum/preference/color/eye_color/apply_to_human(mob/living/carbon/human/target, value) var/hetero = target.eye_color_heterochromatic @@ -54,19 +50,22 @@ return random_eye_color() /datum/preference/choiced/facial_hairstyle + priority = PREFERENCE_PRIORITY_BODYPARTS savefile_key = "facial_style_name" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_FEATURES main_feature_name = "Facial hair" should_generate_icons = TRUE - relevant_species_trait = FACEHAIR + relevant_head_flag = HEAD_FACIAL_HAIR /datum/preference/choiced/facial_hairstyle/init_possible_values() - return generate_possible_values_for_sprite_accessories_on_head(GLOB.facial_hairstyles_list) + return assoc_to_keys_features(GLOB.facial_hairstyles_list) + +/datum/preference/choiced/facial_hairstyle/icon_for(value) + return generate_icon_with_head_accessory(GLOB.facial_hairstyles_list[value]) /datum/preference/choiced/facial_hairstyle/apply_to_human(mob/living/carbon/human/target, value) - target.facial_hairstyle = value - target.update_body_parts() + target.set_facial_hairstyle(value, update = FALSE) /datum/preference/choiced/facial_hairstyle/compile_constant_data() var/list/data = ..() @@ -76,42 +75,40 @@ return data /datum/preference/color/facial_hair_color + priority = PREFERENCE_PRIORITY_BODYPARTS savefile_key = "facial_hair_color" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SUPPLEMENTAL_FEATURES - relevant_species_trait = FACEHAIR + relevant_head_flag = HEAD_FACIAL_HAIR /datum/preference/color/facial_hair_color/apply_to_human(mob/living/carbon/human/target, value) - target.facial_hair_color = value - target.update_body_parts() + target.set_facial_haircolor(value, update = FALSE) /datum/preference/choiced/facial_hair_gradient + priority = PREFERENCE_PRIORITY_BODYPARTS category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "facial_hair_gradient" - relevant_species_trait = FACEHAIR + relevant_head_flag = HEAD_FACIAL_HAIR /datum/preference/choiced/facial_hair_gradient/init_possible_values() return assoc_to_keys_features(GLOB.facial_hair_gradients_list) /datum/preference/choiced/facial_hair_gradient/apply_to_human(mob/living/carbon/human/target, value) - LAZYSETLEN(target.grad_style, GRADIENTS_LEN) - target.grad_style[GRADIENT_FACIAL_HAIR_KEY] = value - target.update_body_parts() + target.set_facial_hair_gradient_style(new_style = value, update = FALSE) /datum/preference/choiced/facial_hair_gradient/create_default_value() return "None" /datum/preference/color/facial_hair_gradient + priority = PREFERENCE_PRIORITY_BODYPARTS category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "facial_hair_gradient_color" - relevant_species_trait = FACEHAIR + relevant_head_flag = HEAD_FACIAL_HAIR /datum/preference/color/facial_hair_gradient/apply_to_human(mob/living/carbon/human/target, value) - LAZYSETLEN(target.grad_color, GRADIENTS_LEN) - target.grad_color[GRADIENT_FACIAL_HAIR_KEY] = value - target.update_body_parts() + target.set_facial_hair_gradient_color(new_color = value, update = FALSE) /datum/preference/color/facial_hair_gradient/is_accessible(datum/preferences/preferences) if (!..(preferences)) @@ -119,27 +116,32 @@ return preferences.read_preference(/datum/preference/choiced/facial_hair_gradient) != "None" /datum/preference/color/hair_color + priority = PREFERENCE_PRIORITY_BODYPARTS savefile_key = "hair_color" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SUPPLEMENTAL_FEATURES - relevant_species_trait = HAIR + relevant_head_flag = HEAD_HAIR /datum/preference/color/hair_color/apply_to_human(mob/living/carbon/human/target, value) - target.hair_color = value + target.set_haircolor(value, update = FALSE) /datum/preference/choiced/hairstyle + priority = PREFERENCE_PRIORITY_BODYPARTS savefile_key = "hairstyle_name" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_FEATURES main_feature_name = "Hairstyle" should_generate_icons = TRUE - relevant_species_trait = HAIR + relevant_head_flag = HEAD_HAIR /datum/preference/choiced/hairstyle/init_possible_values() - return generate_possible_values_for_sprite_accessories_on_head(GLOB.hairstyles_list) + return assoc_to_keys_features(GLOB.hairstyles_list) + +/datum/preference/choiced/hairstyle/icon_for(value) + return generate_icon_with_head_accessory(GLOB.hairstyles_list[value]) /datum/preference/choiced/hairstyle/apply_to_human(mob/living/carbon/human/target, value) - target.hairstyle = value + target.set_hairstyle(value, update = FALSE) /datum/preference/choiced/hairstyle/compile_constant_data() var/list/data = ..() @@ -149,32 +151,30 @@ return data /datum/preference/choiced/hair_gradient + priority = PREFERENCE_PRIORITY_BODYPARTS category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "hair_gradient" - relevant_species_trait = HAIR + relevant_head_flag = HEAD_HAIR /datum/preference/choiced/hair_gradient/init_possible_values() return assoc_to_keys_features(GLOB.hair_gradients_list) /datum/preference/choiced/hair_gradient/apply_to_human(mob/living/carbon/human/target, value) - LAZYSETLEN(target.grad_style, GRADIENTS_LEN) - target.grad_style[GRADIENT_HAIR_KEY] = value - target.update_body_parts() + target.set_hair_gradient_style(new_style = value, update = FALSE) /datum/preference/choiced/hair_gradient/create_default_value() return "None" /datum/preference/color/hair_gradient + priority = PREFERENCE_PRIORITY_BODYPARTS category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "hair_gradient_color" - relevant_species_trait = HAIR + relevant_head_flag = HEAD_HAIR /datum/preference/color/hair_gradient/apply_to_human(mob/living/carbon/human/target, value) - LAZYSETLEN(target.grad_color, GRADIENTS_LEN) - target.grad_color[GRADIENT_HAIR_KEY] = value - target.update_body_parts() + target.set_hair_gradient_color(new_color = value, update = FALSE) /datum/preference/color/hair_gradient/is_accessible(datum/preferences/preferences) if (!..(preferences)) diff --git a/code/modules/client/preferences/species_features/ethereal.dm b/code/modules/client/preferences/species_features/ethereal.dm index 56fe50895894c..19c2fd650e19d 100644 --- a/code/modules/client/preferences/species_features/ethereal.dm +++ b/code/modules/client/preferences/species_features/ethereal.dm @@ -6,28 +6,26 @@ should_generate_icons = TRUE /datum/preference/choiced/ethereal_color/init_possible_values() - var/list/values = list() - - var/icon/ethereal_base = icon('icons/mob/species/ethereal/bodyparts.dmi', "ethereal_head") - ethereal_base.Blend(icon('icons/mob/species/ethereal/bodyparts.dmi', "ethereal_chest"), ICON_OVERLAY) - ethereal_base.Blend(icon('icons/mob/species/ethereal/bodyparts.dmi', "ethereal_l_arm"), ICON_OVERLAY) - ethereal_base.Blend(icon('icons/mob/species/ethereal/bodyparts.dmi', "ethereal_r_arm"), ICON_OVERLAY) - - var/icon/eyes = icon('icons/mob/species/human/human_face.dmi', "eyes") - eyes.Blend(COLOR_BLACK, ICON_MULTIPLY) - ethereal_base.Blend(eyes, ICON_OVERLAY) - - ethereal_base.Scale(64, 64) - ethereal_base.Crop(15, 64, 15 + 31, 64 - 31) - - for (var/name in GLOB.color_list_ethereal) - var/color = GLOB.color_list_ethereal[name] - - var/icon/icon = new(ethereal_base) - icon.Blend(color, ICON_MULTIPLY) - values[name] = icon - - return values + return assoc_to_keys(GLOB.color_list_ethereal) + +/datum/preference/choiced/ethereal_color/icon_for(value) + var/static/icon/ethereal_base + if (isnull(ethereal_base)) + ethereal_base = icon('icons/mob/human/species/ethereal/bodyparts.dmi', "ethereal_head") + ethereal_base.Blend(icon('icons/mob/human/species/ethereal/bodyparts.dmi', "ethereal_chest"), ICON_OVERLAY) + ethereal_base.Blend(icon('icons/mob/human/species/ethereal/bodyparts.dmi', "ethereal_l_arm"), ICON_OVERLAY) + ethereal_base.Blend(icon('icons/mob/human/species/ethereal/bodyparts.dmi', "ethereal_r_arm"), ICON_OVERLAY) + + var/icon/eyes = icon('icons/mob/human/human_face.dmi', "eyes") + eyes.Blend(COLOR_BLACK, ICON_MULTIPLY) + ethereal_base.Blend(eyes, ICON_OVERLAY) + + ethereal_base.Scale(64, 64) + ethereal_base.Crop(15, 64, 15 + 31, 64 - 31) + + var/icon/icon = new(ethereal_base) + icon.Blend(GLOB.color_list_ethereal[value], ICON_MULTIPLY) + return icon /datum/preference/choiced/ethereal_color/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["ethcolor"] = GLOB.color_list_ethereal[value] diff --git a/code/modules/client/preferences/species_features/lizard.dm b/code/modules/client/preferences/species_features/lizard.dm index df7b847f48ef3..4ce09715483ad 100644 --- a/code/modules/client/preferences/species_features/lizard.dm +++ b/code/modules/client/preferences/species_features/lizard.dm @@ -1,30 +1,27 @@ -/proc/generate_lizard_side_shots(list/sprite_accessories, key, include_snout = TRUE) - var/list/values = list() +/proc/generate_lizard_side_shot(datum/sprite_accessory/sprite_accessory, key, include_snout = TRUE) + var/static/icon/lizard + var/static/icon/lizard_with_snout - var/icon/lizard = icon('icons/mob/species/lizard/bodyparts.dmi', "lizard_head", EAST) - var/icon/eyes = icon('icons/mob/species/human/human_face.dmi', "eyes", EAST) - eyes.Blend(COLOR_GRAY, ICON_MULTIPLY) - lizard.Blend(eyes, ICON_OVERLAY) + if (isnull(lizard)) + lizard = icon('icons/mob/human/species/lizard/bodyparts.dmi', "lizard_head", EAST) + var/icon/eyes = icon('icons/mob/human/human_face.dmi', "eyes", EAST) + eyes.Blend(COLOR_GRAY, ICON_MULTIPLY) + lizard.Blend(eyes, ICON_OVERLAY) - if (include_snout) - lizard.Blend(icon('icons/mob/species/lizard/lizard_misc.dmi', "m_snout_round_ADJ", EAST), ICON_OVERLAY) + lizard_with_snout = icon(lizard) + lizard_with_snout.Blend(icon('icons/mob/human/species/lizard/lizard_misc.dmi', "m_snout_round_ADJ", EAST), ICON_OVERLAY) - for (var/name in sprite_accessories) - var/datum/sprite_accessory/sprite_accessory = sprite_accessories[name] + var/icon/final_icon = include_snout ? icon(lizard_with_snout) : icon(lizard) - var/icon/final_icon = icon(lizard) + if (!isnull(sprite_accessory)) + var/icon/accessory_icon = icon(sprite_accessory.icon, "m_[key]_[sprite_accessory.icon_state]_ADJ", EAST) + final_icon.Blend(accessory_icon, ICON_OVERLAY) - if (sprite_accessory.icon_state != "none") - var/icon/accessory_icon = icon(sprite_accessory.icon, "m_[key]_[sprite_accessory.icon_state]_ADJ", EAST) - final_icon.Blend(accessory_icon, ICON_OVERLAY) + final_icon.Crop(11, 20, 23, 32) + final_icon.Scale(32, 32) + final_icon.Blend(COLOR_VIBRANT_LIME, ICON_MULTIPLY) - final_icon.Crop(11, 20, 23, 32) - final_icon.Scale(32, 32) - final_icon.Blend(COLOR_VIBRANT_LIME, ICON_MULTIPLY) - - values[name] = final_icon - - return values + return final_icon /datum/preference/choiced/lizard_body_markings savefile_key = "feature_lizard_body_markings" @@ -35,31 +32,27 @@ relevant_mutant_bodypart = "body_markings" /datum/preference/choiced/lizard_body_markings/init_possible_values() - var/list/values = list() - - var/icon/lizard = icon('icons/mob/species/lizard/bodyparts.dmi', "lizard_chest_m") - - for (var/name in GLOB.body_markings_list) - var/datum/sprite_accessory/sprite_accessory = GLOB.body_markings_list[name] + return assoc_to_keys_features(GLOB.body_markings_list) - var/icon/final_icon = icon(lizard) +/datum/preference/choiced/lizard_body_markings/icon_for(value) + var/datum/sprite_accessory/sprite_accessory = GLOB.body_markings_list[value] - if (sprite_accessory.icon_state != "none") - var/icon/body_markings_icon = icon( - 'icons/mob/species/lizard/lizard_misc.dmi', - "m_body_markings_[sprite_accessory.icon_state]_ADJ", - ) + var/icon/final_icon = icon('icons/mob/human/species/lizard/bodyparts.dmi', "lizard_chest_m") - final_icon.Blend(body_markings_icon, ICON_OVERLAY) + if (sprite_accessory.icon_state != "none") + var/icon/body_markings_icon = icon( + 'icons/mob/human/species/lizard/lizard_misc.dmi', + "m_body_markings_[sprite_accessory.icon_state]_ADJ", + ) - final_icon.Blend(COLOR_VIBRANT_LIME, ICON_MULTIPLY) - final_icon.Crop(10, 8, 22, 23) - final_icon.Scale(26, 32) - final_icon.Crop(-2, 1, 29, 32) + final_icon.Blend(body_markings_icon, ICON_OVERLAY) - values[name] = final_icon + final_icon.Blend(COLOR_VIBRANT_LIME, ICON_MULTIPLY) + final_icon.Crop(10, 8, 22, 23) + final_icon.Scale(26, 32) + final_icon.Crop(-2, 1, 29, 32) - return values + return final_icon /datum/preference/choiced/lizard_body_markings/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["body_markings"] = value @@ -72,7 +65,10 @@ should_generate_icons = TRUE /datum/preference/choiced/lizard_frills/init_possible_values() - return generate_lizard_side_shots(GLOB.frills_list, "frills") + return assoc_to_keys_features(GLOB.frills_list) + +/datum/preference/choiced/lizard_frills/icon_for(value) + return generate_lizard_side_shot(GLOB.frills_list[value], "frills") /datum/preference/choiced/lizard_frills/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["frills"] = value @@ -85,7 +81,10 @@ should_generate_icons = TRUE /datum/preference/choiced/lizard_horns/init_possible_values() - return generate_lizard_side_shots(GLOB.horns_list, "horns") + return assoc_to_keys_features(GLOB.horns_list) + +/datum/preference/choiced/lizard_horns/icon_for(value) + return generate_lizard_side_shot(GLOB.horns_list[value], "horns") /datum/preference/choiced/lizard_horns/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["horns"] = value @@ -110,7 +109,10 @@ should_generate_icons = TRUE /datum/preference/choiced/lizard_snout/init_possible_values() - return generate_lizard_side_shots(GLOB.snouts_list, "snout", include_snout = FALSE) + return assoc_to_keys_features(GLOB.snouts_list) + +/datum/preference/choiced/lizard_snout/icon_for(value) + return generate_lizard_side_shot(GLOB.snouts_list[value], "snout", include_snout = FALSE) /datum/preference/choiced/lizard_snout/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["snout"] = value diff --git a/code/modules/client/preferences/species_features/moth.dm b/code/modules/client/preferences/species_features/moth.dm index 87823a12d375b..120a7ea822bec 100644 --- a/code/modules/client/preferences/species_features/moth.dm +++ b/code/modules/client/preferences/species_features/moth.dm @@ -6,24 +6,24 @@ should_generate_icons = TRUE /datum/preference/choiced/moth_antennae/init_possible_values() - var/list/values = list() + return assoc_to_keys_features(GLOB.moth_antennae_list) - var/icon/moth_head = icon('icons/mob/species/moth/bodyparts.dmi', "moth_head") - moth_head.Blend(icon('icons/mob/species/human/human_face.dmi', "motheyes"), ICON_OVERLAY) +/datum/preference/choiced/moth_antennae/icon_for(value) + var/static/icon/moth_head - for (var/antennae_name in GLOB.moth_antennae_list) - var/datum/sprite_accessory/antennae = GLOB.moth_antennae_list[antennae_name] - if(antennae.locked) - continue + if (isnull(moth_head)) + moth_head = icon('icons/mob/human/species/moth/bodyparts.dmi', "moth_head") + moth_head.Blend(icon('icons/mob/human/human_face.dmi', "motheyes_l"), ICON_OVERLAY) + moth_head.Blend(icon('icons/mob/human/human_face.dmi', "motheyes_r"), ICON_OVERLAY) - var/icon/icon_with_antennae = new(moth_head) - icon_with_antennae.Blend(icon(antennae.icon, "m_moth_antennae_[antennae.icon_state]_FRONT"), ICON_OVERLAY) - icon_with_antennae.Scale(64, 64) - icon_with_antennae.Crop(15, 64, 15 + 31, 64 - 31) + var/datum/sprite_accessory/antennae = GLOB.moth_antennae_list[value] - values[antennae.name] = icon_with_antennae + var/icon/icon_with_antennae = new(moth_head) + icon_with_antennae.Blend(icon(antennae.icon, "m_moth_antennae_[antennae.icon_state]_FRONT"), ICON_OVERLAY) + icon_with_antennae.Scale(64, 64) + icon_with_antennae.Crop(15, 64, 15 + 31, 64 - 31) - return values + return icon_with_antennae /datum/preference/choiced/moth_antennae/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["moth_antennae"] = value @@ -37,47 +37,45 @@ relevant_mutant_bodypart = "moth_markings" /datum/preference/choiced/moth_markings/init_possible_values() - var/list/values = list() + return assoc_to_keys_features(GLOB.moth_markings_list) - var/icon/moth_body = icon('icons/blanks/32x32.dmi', "nothing") - - moth_body.Blend(icon('icons/mob/species/moth/moth_wings.dmi', "m_moth_wings_plain_BEHIND"), ICON_OVERLAY) - - var/list/body_parts = list( +/datum/preference/choiced/moth_markings/icon_for(value) + var/static/list/body_parts = list( /obj/item/bodypart/head/moth, /obj/item/bodypart/chest/moth, /obj/item/bodypart/arm/left/moth, /obj/item/bodypart/arm/right/moth, ) - for (var/obj/item/bodypart/body_part in body_parts) - var/gender = (initial(body_part.is_dimorphic)) ? "_m" : "" - moth_body.Blend(icon('icons/mob/species/moth/bodyparts.dmi', "moth_[body_part][gender]"), ICON_OVERLAY) + var/static/icon/moth_body + if (isnull(moth_body)) + moth_body = icon('icons/blanks/32x32.dmi', "nothing") + + moth_body.Blend(icon('icons/mob/human/species/moth/moth_wings.dmi', "m_moth_wings_plain_BEHIND"), ICON_OVERLAY) - moth_body.Blend(icon('icons/mob/species/human/human_face.dmi', "motheyes"), ICON_OVERLAY) + for (var/obj/item/bodypart/body_part as anything in body_parts) + moth_body.Blend(icon('icons/mob/human/species/moth/bodyparts.dmi', initial(body_part.icon_state)), ICON_OVERLAY) - for (var/markings_name in GLOB.moth_markings_list) - var/datum/sprite_accessory/markings = GLOB.moth_markings_list[markings_name] - if(markings.locked) - continue - var/icon/icon_with_markings = new(moth_body) + moth_body.Blend(icon('icons/mob/human/human_face.dmi', "motheyes_l"), ICON_OVERLAY) + moth_body.Blend(icon('icons/mob/human/human_face.dmi', "motheyes_r"), ICON_OVERLAY) - if (markings_name != "None") - for (var/body_part in body_parts) - var/icon/body_part_icon = icon(markings.icon, "[markings.icon_state]_[body_part]") - body_part_icon.Crop(1, 1, 32, 32) - icon_with_markings.Blend(body_part_icon, ICON_OVERLAY) + var/datum/sprite_accessory/markings = GLOB.moth_markings_list[value] + var/icon/icon_with_markings = new(moth_body) - icon_with_markings.Blend(icon('icons/mob/species/moth/moth_wings.dmi', "m_moth_wings_plain_FRONT"), ICON_OVERLAY) - icon_with_markings.Blend(icon('icons/mob/species/moth/moth_antennae.dmi', "m_moth_antennae_plain_FRONT"), ICON_OVERLAY) + if (value != "None") + for (var/obj/item/bodypart/body_part as anything in body_parts) + var/icon/body_part_icon = icon(markings.icon, "[markings.icon_state]_[initial(body_part.body_zone)]") + body_part_icon.Crop(1, 1, 32, 32) + icon_with_markings.Blend(body_part_icon, ICON_OVERLAY) - // Zoom in on the top of the head and the chest - icon_with_markings.Scale(64, 64) - icon_with_markings.Crop(15, 64, 15 + 31, 64 - 31) + icon_with_markings.Blend(icon('icons/mob/human/species/moth/moth_wings.dmi', "m_moth_wings_plain_FRONT"), ICON_OVERLAY) + icon_with_markings.Blend(icon('icons/mob/human/species/moth/moth_antennae.dmi', "m_moth_antennae_plain_FRONT"), ICON_OVERLAY) - values[markings.name] = icon_with_markings + // Zoom in on the top of the head and the chest + icon_with_markings.Scale(64, 64) + icon_with_markings.Crop(15, 64, 15 + 31, 64 - 31) - return values + return icon_with_markings /datum/preference/choiced/moth_markings/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["moth_markings"] = value @@ -90,11 +88,13 @@ should_generate_icons = TRUE /datum/preference/choiced/moth_wings/init_possible_values() - return possible_values_for_sprite_accessory_list_for_body_part( - GLOB.moth_wings_list, - "moth_wings", - list("BEHIND", "FRONT"), - ) + return assoc_to_keys_features(GLOB.moth_wings_list) + +/datum/preference/choiced/moth_wings/icon_for(value) + var/datum/sprite_accessory/moth_wings = GLOB.moth_wings_list[value] + var/icon/final_icon = icon(moth_wings.icon, "m_moth_wings_[moth_wings.icon_state]_BEHIND") + final_icon.Blend(icon(moth_wings.icon, "m_moth_wings_[moth_wings.icon_state]_FRONT"), ICON_OVERLAY) + return final_icon /datum/preference/choiced/moth_wings/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["moth_wings"] = value diff --git a/code/modules/client/preferences/species_features/mutants.dm b/code/modules/client/preferences/species_features/mutants.dm index 44cefd7ef877c..7ecf25d9abce5 100644 --- a/code/modules/client/preferences/species_features/mutants.dm +++ b/code/modules/client/preferences/species_features/mutants.dm @@ -2,7 +2,15 @@ savefile_key = "feature_mcolor" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - relevant_species_trait = MUTCOLORS + relevant_inherent_trait = TRAIT_MUTANT_COLORS + +/datum/preference/color/mutant_color/is_accessible(datum/preferences/preferences) + if (!..(preferences)) + return FALSE + + var/species_type = preferences.read_preference(/datum/preference/choiced/species) + var/datum/species/species = new species_type + return !(TRAIT_FIXED_MUTANT_COLORS in species.inherent_traits) /datum/preference/color/mutant_color/create_default_value() return sanitize_hexcolor("[pick("7F", "FF")][pick("7F", "FF")][pick("7F", "FF")]") diff --git a/code/modules/client/preferences/species_features/pod.dm b/code/modules/client/preferences/species_features/pod.dm index f2534ac71059b..5280308fa8930 100644 --- a/code/modules/client/preferences/species_features/pod.dm +++ b/code/modules/client/preferences/species_features/pod.dm @@ -6,27 +6,22 @@ should_generate_icons = TRUE /datum/preference/choiced/pod_hair/init_possible_values() - var/list/values = list() + return assoc_to_keys_features(GLOB.pod_hair_list) - var/icon/pod_head = icon('icons/mob/species/human/bodyparts_greyscale.dmi', "pod_head_m") +/datum/preference/choiced/pod_hair/icon_for(value) + var/datum/sprite_accessory/pod_hair = GLOB.pod_hair_list[value] - for (var/pod_name in GLOB.pod_hair_list) - var/datum/sprite_accessory/pod_hair = GLOB.pod_hair_list[pod_name] - if(pod_hair.locked) - continue + var/icon/icon_with_hair = icon('icons/mob/human/bodyparts_greyscale.dmi', "pod_head_m") - var/icon/icon_with_hair = new(pod_head) - var/icon/icon_adj = icon(pod_hair.icon, "m_pod_hair_[pod_hair.icon_state]_ADJ") - var/icon/icon_front = icon(pod_hair.icon, "m_pod_hair_[pod_hair.icon_state]_FRONT") - icon_adj.Blend(icon_front, ICON_OVERLAY) - icon_with_hair.Blend(icon_adj, ICON_OVERLAY) - icon_with_hair.Scale(64, 64) - icon_with_hair.Crop(15, 64, 15 + 31, 64 - 31) - icon_with_hair.Blend(COLOR_GREEN, ICON_MULTIPLY) + var/icon/icon_adj = icon(pod_hair.icon, "m_pod_hair_[pod_hair.icon_state]_ADJ") + var/icon/icon_front = icon(pod_hair.icon, "m_pod_hair_[pod_hair.icon_state]_FRONT") + icon_adj.Blend(icon_front, ICON_OVERLAY) + icon_with_hair.Blend(icon_adj, ICON_OVERLAY) + icon_with_hair.Scale(64, 64) + icon_with_hair.Crop(15, 64, 15 + 31, 64 - 31) + icon_with_hair.Blend(COLOR_GREEN, ICON_MULTIPLY) - values[pod_hair.name] = icon_with_hair - - return values + return icon_with_hair /datum/preference/choiced/pod_hair/create_default_value() return pick(assoc_to_keys_features(GLOB.pod_hair_list)) diff --git a/code/modules/client/preferences/species_features/vampire.dm b/code/modules/client/preferences/species_features/vampire.dm index 1b05c2c3e12b4..5ecdae7b1bf8e 100644 --- a/code/modules/client/preferences/species_features/vampire.dm +++ b/code/modules/client/preferences/species_features/vampire.dm @@ -5,24 +5,26 @@ priority = PREFERENCE_PRIORITY_NAME_MODIFICATIONS //this will be overwritten by names otherwise main_feature_name = "Vampire status" should_generate_icons = TRUE - relevant_species_trait = BLOOD_CLANS + relevant_inherent_trait = TRAIT_BLOOD_CLANS /datum/preference/choiced/vampire_status/create_default_value() return "Inoculated" //eh, have em try out the mechanic first /datum/preference/choiced/vampire_status/init_possible_values() - var/list/values = list() + return list("Inoculated", "Outcast") - values["Inoculated"] = icon('icons/obj/drinks/drinks.dmi', "bloodglass") - values["Outcast"] = icon('icons/obj/medical/bloodpack.dmi', "generic_bloodpack") - - return values +/datum/preference/choiced/vampire_status/icon_for(value) + switch (value) + if ("Inoculated") + return icon('icons/obj/drinks/drinks.dmi', "bloodglass") + if ("Outcast") + return icon('icons/obj/medical/bloodpack.dmi', "generic_bloodpack") ///list that stores a vampire house name for each department GLOBAL_LIST_EMPTY(vampire_houses) /datum/preference/choiced/vampire_status/apply_to_human(mob/living/carbon/human/target, value) - if (!(relevant_species_trait in target.dna?.species.species_traits)) + if(!HAS_TRAIT(target, TRAIT_BLOOD_CLANS)) return if(value != "Inoculated") diff --git a/code/modules/client/preferences/ui_style.dm b/code/modules/client/preferences/ui_style.dm index 08f1af6c7dd53..64a82b592c60a 100644 --- a/code/modules/client/preferences/ui_style.dm +++ b/code/modules/client/preferences/ui_style.dm @@ -6,18 +6,16 @@ should_generate_icons = TRUE /datum/preference/choiced/ui_style/init_possible_values() - var/list/values = list() + return assoc_to_keys(GLOB.available_ui_styles) - for (var/style in GLOB.available_ui_styles) - var/icon/icons = GLOB.available_ui_styles[style] +/datum/preference/choiced/ui_style/icon_for(value) + var/icon/icons = GLOB.available_ui_styles[value] - var/icon/icon = icon(icons, "hand_r") - icon.Crop(1, 1, world.icon_size * 2, world.icon_size) - icon.Blend(icon(icons, "hand_l"), ICON_OVERLAY, world.icon_size) + var/icon/icon = icon(icons, "hand_r") + icon.Crop(1, 1, world.icon_size * 2, world.icon_size) + icon.Blend(icon(icons, "hand_l"), ICON_OVERLAY, world.icon_size) - values[style] = icon - - return values + return icon /datum/preference/choiced/ui_style/create_default_value() return GLOB.available_ui_styles[1] diff --git a/code/modules/client/preferences/underwear_color.dm b/code/modules/client/preferences/underwear_color.dm index a005145d1735b..6e64b4423e50a 100644 --- a/code/modules/client/preferences/underwear_color.dm +++ b/code/modules/client/preferences/underwear_color.dm @@ -3,13 +3,13 @@ savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SUPPLEMENTAL_FEATURES -/datum/preference/color/underwear_color/apply_to_human(mob/living/carbon/human/target, value) - target.underwear_color = value - /datum/preference/color/underwear_color/is_accessible(datum/preferences/preferences) if (!..(preferences)) return FALSE var/species_type = preferences.read_preference(/datum/preference/choiced/species) var/datum/species/species = new species_type - return !(NO_UNDERWEAR in species.species_traits) + return !(TRAIT_NO_UNDERWEAR in species.inherent_traits) + +/datum/preference/color/underwear_color/apply_to_human(mob/living/carbon/human/target, value) + target.underwear_color = value diff --git a/code/modules/client/preferences/voice.dm b/code/modules/client/preferences/voice.dm index 9b9456ea9c418..b44450be9ea9a 100644 --- a/code/modules/client/preferences/voice.dm +++ b/code/modules/client/preferences/voice.dm @@ -24,3 +24,22 @@ if(SStts.tts_enabled && !(value in SStts.available_speakers)) value = pick(SStts.available_speakers) // As a failsafe target.voice = value + +/datum/preference/numeric/tts_voice_pitch + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "tts_voice_pitch" + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + minimum = -12 + maximum = 12 + +/datum/preference/numeric/tts_voice_pitch/is_accessible(datum/preferences/preferences) + if(!SStts.tts_enabled || !SStts.pitch_enabled) + return FALSE + return ..() + +/datum/preference/numeric/tts_voice_pitch/create_default_value() + return 0 + +/datum/preference/numeric/tts_voice_pitch/apply_to_human(mob/living/carbon/human/target, value) + if(SStts.tts_enabled && SStts.pitch_enabled) + target.pitch = value diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index b5df32a65fefd..96ad34b315868 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -5,7 +5,7 @@ // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 43 +#define SAVEFILE_VERSION_MAX 44 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -91,6 +91,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if (current_version < 41) migrate_preferences_to_tgui_prefs_menu() + if (current_version < 44) + update_tts_blip_prefs() + /datum/preferences/proc/update_character(current_version, list/save_data) if (current_version < 41) migrate_character_to_tgui_prefs_menu() diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index b55d487022530..25267e92eff9c 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -68,7 +68,7 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8") message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]") return - if(!(prefs.chat_toggles & CHAT_OOC)) + if(!(get_chat_toggles(src) & CHAT_OOC)) to_chat(src, span_danger("You have OOC muted.")) return @@ -85,7 +85,7 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8") for(var/client/receiver as anything in GLOB.clients) if(!receiver.prefs) // Client being created or deleted. Despite all, this can be null. continue - if(!(receiver.prefs.chat_toggles & CHAT_OOC)) + if(!(get_chat_toggles(receiver) & CHAT_OOC)) continue if(holder?.fakekey in receiver.prefs.ignoring) continue diff --git a/code/modules/clothing/belts/polymorph_belt.dm b/code/modules/clothing/belts/polymorph_belt.dm new file mode 100644 index 0000000000000..73959d6d41519 --- /dev/null +++ b/code/modules/clothing/belts/polymorph_belt.dm @@ -0,0 +1,159 @@ +/// Belt which can turn you into a beast, once an anomaly core is inserted +/obj/item/polymorph_belt + name = "polymorphic field inverter" + desc = "This device can scan and store DNA from other life forms." + slot_flags = ITEM_SLOT_BELT + icon = 'icons/obj/clothing/belts.dmi' + icon_state = "polybelt_inactive" + worn_icon_state = "polybelt_inactive" + base_icon_state = "polybelt" + item_flags = NOBLUDGEON + /// Typepath of a mob we have scanned, we only store one at a time + var/stored_mob_type + /// Have we activated the belt? + var/active = FALSE + /// Our current transformation action + var/datum/action/cooldown/spell/shapeshift/polymorph_belt/transform_action + +/obj/item/polymorph_belt/Initialize(mapload) + . = ..() + AddElement(/datum/element/update_icon_updates_onmob) + +/obj/item/polymorph_belt/Destroy(force) + QDEL_NULL(transform_action) + return ..() + +/obj/item/polymorph_belt/examine(mob/user) + . = ..() + if (stored_mob_type) + var/mob/living/will_become = stored_mob_type + . += span_notice("It contains digitised [initial(will_become.name)] DNA.") + if (!active) + . += span_warning("It requires a Bioscrambler Anomaly Core in order to function.") + +/obj/item/polymorph_belt/item_action_slot_check(slot, mob/user, datum/action/action) + return slot & ITEM_SLOT_BELT + +/obj/item/polymorph_belt/update_icon_state() + icon_state = base_icon_state + (active ? "" : "_inactive") + worn_icon_state = base_icon_state + (active ? "" : "_inactive") + return ..() + +/obj/item/polymorph_belt/attackby(obj/item/weapon, mob/user, params) + if (!istype(weapon, /obj/item/assembly/signaler/anomaly/bioscrambler)) + return ..() + balloon_alert(user, "inserting...") + if (!do_after(user, delay = 3 SECONDS, target = src)) + return + qdel(weapon) + active = TRUE + update_appearance(UPDATE_ICON_STATE) + update_transform_action() + playsound(src, 'sound/machines/crate_open.ogg', 50, FALSE) + +/obj/item/polymorph_belt/attack(mob/living/target_mob, mob/living/user, params) + . = ..() + if (.) + return + if (!isliving(target_mob)) + return + if (!isanimal_or_basicmob(target_mob)) + balloon_alert(user, "target too complex!") + return TRUE + if (target_mob.mob_biotypes & (MOB_HUMANOID|MOB_ROBOTIC|MOB_SPECIAL|MOB_SPIRIT|MOB_UNDEAD)) + balloon_alert(user, "incompatible!") + return TRUE + if (isanimal_or_basicmob(target_mob)) + if (!target_mob.compare_sentience_type(SENTIENCE_ORGANIC)) + balloon_alert(user, "target too intelligent!") + return TRUE + if (stored_mob_type == target_mob.type) + balloon_alert(user, "already scanned!") + return TRUE + if (DOING_INTERACTION_WITH_TARGET(user, target_mob)) + balloon_alert(user, "busy!") + return TRUE + balloon_alert(user, "scanning...") + visible_message(span_notice("[user] begins scanning [target_mob] with [src].")) + if (!do_after(user, delay = 5 SECONDS, target = target_mob)) + return TRUE + visible_message(span_notice("[user] scans [target_mob] with [src].")) + stored_mob_type = target_mob.type + update_transform_action() + playsound(src, 'sound/machines/ping.ogg', 50, FALSE) + return TRUE + +/// Make sure we can transform into the scanned target +/obj/item/polymorph_belt/proc/update_transform_action() + if (isnull(stored_mob_type) || !active) + return + if (isnull(transform_action)) + transform_action = add_item_action(/datum/action/cooldown/spell/shapeshift/polymorph_belt) + transform_action.update_type(stored_mob_type) + +/// Pre-activated polymorph belt +/obj/item/polymorph_belt/functioning + active = TRUE + icon_state = "polybelt" + worn_icon_state = "polybelt" + +/// Ability provided by the polymorph belt +/datum/action/cooldown/spell/shapeshift/polymorph_belt + name = "Invert Polymorphic Field" + cooldown_time = 30 SECONDS + school = SCHOOL_UNSET + invocation_type = INVOCATION_NONE + spell_requirements = NONE + possible_shapes = list(/mob/living/basic/cockroach) + /// Amount of time it takes us to transform back or forth + var/channel_time = 3 SECONDS + +/datum/action/cooldown/spell/shapeshift/polymorph_belt/Remove(mob/remove_from) + var/datum/status_effect/shapechange_mob/shapechange = remove_from.has_status_effect(/datum/status_effect/shapechange_mob/from_spell) + var/atom/changer = shapechange?.caster_mob || remove_from + changer?.transform = matrix() + return ..() + +/datum/action/cooldown/spell/shapeshift/polymorph_belt/before_cast(mob/living/cast_on) + . = ..() + if (. & SPELL_CANCEL_CAST) + return + if (channel_time <= 0) + return + if (DOING_INTERACTION_WITH_TARGET(cast_on, cast_on)) + return . | SPELL_CANCEL_CAST + + var/old_transform = cast_on.transform + + var/animate_step = channel_time / 6 + playsound(cast_on, 'sound/effects/wounds/crack1.ogg', 50) + animate(cast_on, transform = matrix() * 1.1, time = animate_step, easing = SINE_EASING) + animate(transform = matrix() * 0.9, time = animate_step, easing = SINE_EASING) + animate(transform = matrix() * 1.2, time = animate_step, easing = SINE_EASING) + animate(transform = matrix() * 0.8, time = animate_step, easing = SINE_EASING) + animate(transform = matrix() * 1.3, time = animate_step, easing = SINE_EASING) + animate(transform = matrix() * 0.1, time = animate_step, easing = SINE_EASING) + + cast_on.balloon_alert(cast_on, "transforming...") + if (!do_after(cast_on, delay = channel_time, target = cast_on)) + animate(cast_on, transform = matrix(), time = 0, easing = SINE_EASING) + cast_on.transform = old_transform + return . | SPELL_CANCEL_CAST + cast_on.visible_message(span_warning("[cast_on]'s body rearranges itself with a horrible crunching sound!")) + playsound(cast_on, 'sound/magic/demon_consume.ogg', 50, TRUE) + +/datum/action/cooldown/spell/shapeshift/polymorph_belt/after_cast(atom/cast_on) + . = ..() + if (QDELETED(owner)) + return + animate(owner, transform = matrix() * 0.1, time = 0, easing = JUMP_EASING) + animate(transform = matrix(), time = 0.25 SECONDS, easing = SINE_EASING) + +/// Update what you are transforming to or from +/datum/action/cooldown/spell/shapeshift/polymorph_belt/proc/update_type(transform_type) + unshift_owner() + shapeshift_type = transform_type + possible_shapes = list(transform_type) + var/mob/living/will_become = transform_type + desc = "Assume your [initial(will_become.name)] form!" + build_all_button_icons(update_flags = UPDATE_BUTTON_NAME) diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm deleted file mode 100644 index 95d8b674f25ad..0000000000000 --- a/code/modules/clothing/chameleon.dm +++ /dev/null @@ -1,1056 +0,0 @@ -#define EMP_RANDOMISE_TIME 300 - -/datum/action/item_action/chameleon/drone/randomise - name = "Randomise Headgear" - button_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "random" - -/datum/action/item_action/chameleon/drone/randomise/Trigger(trigger_flags) - if(!IsAvailable(feedback = TRUE)) - return - - // Damn our lack of abstract interfeces - if (istype(target, /obj/item/clothing/head/chameleon/drone)) - var/obj/item/clothing/head/chameleon/drone/X = target - X.chameleon_action.random_look(owner) - if (istype(target, /obj/item/clothing/mask/chameleon/drone)) - var/obj/item/clothing/mask/chameleon/drone/Z = target - Z.chameleon_action.random_look(owner) - - return 1 - - -/datum/action/item_action/chameleon/drone/togglehatmask - name = "Toggle Headgear Mode" - button_icon = 'icons/mob/actions/actions_silicon.dmi' - -/datum/action/item_action/chameleon/drone/togglehatmask/New() - ..() - - if (istype(target, /obj/item/clothing/head/chameleon/drone)) - button_icon_state = "drone_camogear_helm" - if (istype(target, /obj/item/clothing/mask/chameleon/drone)) - button_icon_state = "drone_camogear_mask" - -/datum/action/item_action/chameleon/drone/togglehatmask/Trigger(trigger_flags) - if(!IsAvailable(feedback = TRUE)) - return - - // No point making the code more complicated if no non-drone - // is ever going to use one of these - - var/mob/living/simple_animal/drone/D - - if(isdrone(owner)) - D = owner - else - return - - // The drone unEquip() proc sets head to null after dropping - // an item, so we need to keep a reference to our old headgear - // to make sure it's deleted. - var/obj/old_headgear = target - var/obj/new_headgear - - if(istype(old_headgear, /obj/item/clothing/head/chameleon/drone)) - new_headgear = new /obj/item/clothing/mask/chameleon/drone() - else if(istype(old_headgear, /obj/item/clothing/mask/chameleon/drone)) - new_headgear = new /obj/item/clothing/head/chameleon/drone() - else - to_chat(owner, span_warning("You shouldn't be able to toggle a camogear helmetmask if you're not wearing it.")) - if(new_headgear) - // Force drop the item in the headslot, even though - // it's has TRAIT_NODROP - D.dropItemToGround(target, TRUE) - qdel(old_headgear) - // where is `ITEM_SLOT_HEAD` defined? WHO KNOWS - D.equip_to_slot(new_headgear, ITEM_SLOT_HEAD) - return 1 - - -/datum/action/chameleon_outfit - name = "Select Chameleon Outfit" - button_icon_state = "chameleon_outfit" - var/list/outfit_options //By default, this list is shared between all instances. It is not static because if it were, subtypes would not be able to have their own. If you ever want to edit it, copy it first. - -/datum/action/chameleon_outfit/New() - ..() - initialize_outfits() - -/datum/action/chameleon_outfit/proc/initialize_outfits() - var/static/list/standard_outfit_options - if(!standard_outfit_options) - standard_outfit_options = list() - for(var/path in subtypesof(/datum/outfit/job)) - var/datum/outfit/O = path - standard_outfit_options[initial(O.name)] = path - sortTim(standard_outfit_options, GLOBAL_PROC_REF(cmp_text_asc)) - outfit_options = standard_outfit_options - -/datum/action/chameleon_outfit/Trigger(trigger_flags) - return select_outfit(owner) - -/datum/action/chameleon_outfit/proc/select_outfit(mob/user) - if(!user || !IsAvailable(feedback = TRUE)) - return FALSE - var/selected = tgui_input_list(user, "Select outfit to change into", "Chameleon Outfit", outfit_options) - if(isnull(selected)) - return FALSE - if(!IsAvailable(feedback = TRUE) || QDELETED(src) || QDELETED(user)) - return FALSE - if(isnull(outfit_options[selected])) - return FALSE - var/outfit_type = outfit_options[selected] - var/datum/outfit/job/O = new outfit_type() - var/list/outfit_types = O.get_chameleon_disguise_info() - var/datum/job/job_datum = SSjob.GetJobType(O.jobtype) - - for(var/V in user.chameleon_item_actions) - var/datum/action/item_action/chameleon/change/A = V - var/done = FALSE - for(var/T in outfit_types) - for(var/name in A.chameleon_list) - if(A.chameleon_list[name] == T) - A.apply_job_data(job_datum) - A.update_look(user, T) - outfit_types -= T - done = TRUE - break - if(done) - break - - //suit hoods - if(ishuman(user)) - var/mob/living/carbon/human/H = user - //make sure they are actually wearing the suit, not just holding it, and that they have a chameleon hat - if(istype(H.wear_suit, /obj/item/clothing/suit/chameleon) && istype(H.head, /obj/item/clothing/head/chameleon)) - var/helmet_type - if(ispath(O.suit, /obj/item/clothing/suit/hooded)) - var/obj/item/clothing/suit/hooded/hooded = O.suit - helmet_type = initial(hooded.hoodtype) - if(helmet_type) - var/obj/item/clothing/head/chameleon/hat = H.head - hat.chameleon_action.update_look(user, helmet_type) - qdel(O) - return TRUE - - -/datum/action/item_action/chameleon/change - name = "Chameleon Change" - check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_INCAPACITATED|AB_CHECK_HANDS_BLOCKED - var/list/chameleon_blacklist = list() //This is a typecache - var/list/chameleon_list = list() - var/chameleon_type = null - var/chameleon_name = "Item" - - var/emp_timer - -/datum/action/item_action/chameleon/change/Grant(mob/M) - if(M && (owner != M)) - if(!M.chameleon_item_actions) - M.chameleon_item_actions = list(src) - var/datum/action/chameleon_outfit/O = new /datum/action/chameleon_outfit() - O.Grant(M) - else - M.chameleon_item_actions |= src - ..() - -/datum/action/item_action/chameleon/change/Remove(mob/M) - if(M && (M == owner)) - LAZYREMOVE(M.chameleon_item_actions, src) - if(!LAZYLEN(M.chameleon_item_actions)) - var/datum/action/chameleon_outfit/O = locate(/datum/action/chameleon_outfit) in M.actions - qdel(O) - ..() - -/datum/action/item_action/chameleon/change/proc/initialize_disguises() - name = "Change [chameleon_name] Appearance" - build_all_button_icons() - - chameleon_blacklist |= typecacheof(target.type) - for(var/V in typesof(chameleon_type)) - if(ispath(V) && ispath(V, /obj/item)) - var/obj/item/I = V - if(chameleon_blacklist[V] || (initial(I.item_flags) & ABSTRACT) || !initial(I.icon_state)) - continue - var/chameleon_item_name = "[initial(I.name)] ([initial(I.icon_state)])" - chameleon_list[chameleon_item_name] = I - - -/datum/action/item_action/chameleon/change/proc/select_look(mob/user) - var/obj/item/picked_item - var/picked_name = tgui_input_list(user, "Select [chameleon_name] to change into", "Chameleon Settings", sort_list(chameleon_list, GLOBAL_PROC_REF(cmp_typepaths_asc))) - if(isnull(picked_name)) - return - if(isnull(chameleon_list[picked_name])) - return - picked_item = chameleon_list[picked_name] - update_look(user, picked_item) - -/datum/action/item_action/chameleon/change/proc/random_look(mob/user) - var/picked_name = pick(chameleon_list) - // If a user is provided, then this item is in use, and we - // need to update our icons and stuff - - if(user) - update_look(user, chameleon_list[picked_name]) - - // Otherwise, it's likely a random initialisation, so we - // don't have to worry - - else - update_item(chameleon_list[picked_name]) - -/datum/action/item_action/chameleon/change/proc/update_look(mob/user, obj/item/picked_item) - if(istype(target, /obj/item/gun/energy/laser/chameleon)) - var/obj/item/gun/energy/laser/chameleon/chameleon_gun = target - chameleon_gun.set_chameleon_disguise(picked_item) - if(isliving(user)) - var/mob/living/C = user - if(C.stat != CONSCIOUS) - return - - update_item(picked_item) - var/obj/item/thing = target - thing.update_slot_icon() - build_all_button_icons() - -/datum/action/item_action/chameleon/change/proc/update_item(obj/item/picked_item) - var/atom/atom_target = target - atom_target.name = initial(picked_item.name) - atom_target.desc = initial(picked_item.desc) - atom_target.icon_state = initial(picked_item.icon_state) - if(isitem(atom_target)) - var/obj/item/item_target = target - item_target.worn_icon = initial(picked_item.worn_icon) - item_target.lefthand_file = initial(picked_item.lefthand_file) - item_target.righthand_file = initial(picked_item.righthand_file) - if(initial(picked_item.greyscale_colors)) - if(initial(picked_item.greyscale_config_worn)) - item_target.worn_icon = SSgreyscale.GetColoredIconByType(initial(picked_item.greyscale_config_worn), initial(picked_item.greyscale_colors)) - if(initial(picked_item.greyscale_config_inhand_left)) - item_target.lefthand_file = SSgreyscale.GetColoredIconByType(initial(picked_item.greyscale_config_inhand_left), initial(picked_item.greyscale_colors)) - if(initial(picked_item.greyscale_config_inhand_right)) - item_target.righthand_file = SSgreyscale.GetColoredIconByType(initial(picked_item.greyscale_config_inhand_right), initial(picked_item.greyscale_colors)) - item_target.worn_icon_state = initial(picked_item.worn_icon_state) - item_target.inhand_icon_state = initial(picked_item.inhand_icon_state) - if(isclothing(item_target) && ispath(picked_item, /obj/item/clothing)) - var/obj/item/clothing/clothing_target = item_target - var/obj/item/clothing/picked_clothing = picked_item - clothing_target.flags_cover = initial(picked_clothing.flags_cover) - if(initial(picked_item.greyscale_config) && initial(picked_item.greyscale_colors)) - atom_target.icon = SSgreyscale.GetColoredIconByType(initial(picked_item.greyscale_config), initial(picked_item.greyscale_colors)) - else - atom_target.icon = initial(picked_item.icon) - -/datum/action/item_action/chameleon/change/Trigger(trigger_flags) - if(!IsAvailable(feedback = TRUE)) - return - - select_look(owner) - return 1 - -/datum/action/item_action/chameleon/change/proc/emp_randomise(amount = EMP_RANDOMISE_TIME) - START_PROCESSING(SSprocessing, src) - random_look(owner) - - var/new_value = world.time + amount - if(new_value > emp_timer) - emp_timer = new_value - -/datum/action/item_action/chameleon/change/process() - if(world.time > emp_timer) - STOP_PROCESSING(SSprocessing, src) - return - random_look(owner) - -/datum/action/item_action/chameleon/change/proc/apply_job_data(datum/job/job_datum) - return - -/datum/action/item_action/chameleon/change/id/update_item(obj/item/picked_item) - ..() - var/obj/item/card/id/advanced/chameleon/agent_card = target - if(istype(agent_card)) - var/obj/item/card/id/copied_card = picked_item - - // If the outfit comes with a special trim override, we'll steal some stuff from that. - var/new_trim = initial(copied_card.trim) - - if(new_trim) - SSid_access.apply_trim_to_chameleon_card(agent_card, new_trim, TRUE) - - // If the ID card hasn't been forged, we'll check if there has been an assignment set already by any new trim. - // If there has not, we set the assignment to the copied card's default as well as copying over the the - // default registered name from the copied card. - if(!agent_card.forged) - if(!agent_card.assignment) - agent_card.assignment = initial(copied_card.assignment) - - agent_card.registered_name = initial(copied_card.registered_name) - - agent_card.icon_state = initial(copied_card.icon_state) - if(ispath(copied_card, /obj/item/card/id/advanced)) - var/obj/item/card/id/advanced/copied_advanced_card = copied_card - agent_card.assigned_icon_state = initial(copied_advanced_card.assigned_icon_state) - - agent_card.update_label() - agent_card.update_icon() - -/datum/action/item_action/chameleon/change/id/apply_job_data(datum/job/job_datum) - ..() - var/obj/item/card/id/advanced/chameleon/agent_card = target - if(istype(agent_card) && istype(job_datum)) - agent_card.forged = TRUE - - // job_outfit is going to be a path. - var/datum/outfit/job/job_outfit = job_datum.outfit - if(!job_outfit) - return - - // copied_card is also going to be a path. - var/obj/item/card/id/copied_card = initial(job_outfit.id) - if(!copied_card) - return - - // If the outfit comes with a special trim override, we'll use that. Otherwise, use the card's default trim. Failing that, no trim at all. - var/new_trim = initial(job_outfit.id_trim) ? initial(job_outfit.id_trim) : initial(copied_card.trim) - - if(new_trim) - SSid_access.apply_trim_to_chameleon_card(agent_card, new_trim, FALSE) - else - agent_card.assignment = job_datum.title - - agent_card.icon_state = initial(copied_card.icon_state) - if(ispath(copied_card, /obj/item/card/id/advanced)) - var/obj/item/card/id/advanced/copied_advanced_card = copied_card - agent_card.assigned_icon_state = initial(copied_advanced_card.assigned_icon_state) - - agent_card.update_label() - agent_card.update_icon() - -/datum/action/item_action/chameleon/change/id_trim/initialize_disguises() - name = "Change [chameleon_name] Appearance" - build_all_button_icons() - - chameleon_blacklist |= typecacheof(target.type) - for(var/trim_path in typesof(chameleon_type)) - if(ispath(trim_path) && ispath(trim_path, /datum/id_trim)) - if(chameleon_blacklist[trim_path]) - continue - - var/datum/id_trim/trim = SSid_access.trim_singletons_by_path[trim_path] - - if(trim && trim.trim_state && trim.assignment) - var/chameleon_item_name = "[trim.assignment] ([trim.trim_state])" - chameleon_list[chameleon_item_name] = trim_path - -/datum/action/item_action/chameleon/change/id_trim/update_item(picked_trim_path) - var/obj/item/card/id/advanced/chameleon/agent_card = target - - if(istype(agent_card)) - SSid_access.apply_trim_to_chameleon_card(agent_card, picked_trim_path, TRUE) - - agent_card.update_label() - agent_card.update_icon() - -/datum/action/item_action/chameleon/change/tablet/update_item(obj/item/picked_item) - ..() - var/obj/item/modular_computer/pda/agent_pda = target - if(istype(agent_pda)) - agent_pda.update_appearance() - -/datum/action/item_action/chameleon/change/tablet/apply_job_data(datum/job/job_datum) - ..() - var/obj/item/modular_computer/pda/agent_pda = target - if(istype(agent_pda) && istype(job_datum)) - agent_pda.saved_job = job_datum.title - - -/obj/item/clothing/under/chameleon -//starts off as black - name = "black jumpsuit" - icon_state = "jumpsuit" - greyscale_colors = "#3f3f3f" - greyscale_config = /datum/greyscale_config/jumpsuit - greyscale_config_inhand_left = /datum/greyscale_config/jumpsuit_inhand_left - greyscale_config_inhand_right = /datum/greyscale_config/jumpsuit_inhand_right - greyscale_config_worn = /datum/greyscale_config/jumpsuit_worn - desc = "It's a plain jumpsuit. It has a small dial on the wrist." - sensor_mode = SENSOR_OFF //Hey who's this guy on the Syndicate Shuttle?? - random_sensor = FALSE - resistance_flags = NONE - can_adjust = FALSE - armor_type = /datum/armor/under_chameleon - - var/datum/action/item_action/chameleon/change/chameleon_action - -/datum/armor/under_chameleon - melee = 10 - bullet = 10 - laser = 10 - bio = 10 - fire = 50 - acid = 50 - -/obj/item/clothing/under/chameleon/Initialize(mapload) - . = ..() - chameleon_action = new(src) - chameleon_action.chameleon_type = /obj/item/clothing/under - chameleon_action.chameleon_name = "Jumpsuit" - chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/under, /obj/item/clothing/under/color, /obj/item/clothing/under/rank, /obj/item/clothing/under/changeling), only_root_path = TRUE) - 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) - return - chameleon_action.emp_randomise() - -/obj/item/clothing/under/chameleon/broken/Initialize(mapload) - . = ..() - chameleon_action.emp_randomise(INFINITY) - -/obj/item/clothing/suit/chameleon - name = "armor" - desc = "A slim armored vest that protects against most types of damage." - icon_state = "armor" - icon = 'icons/obj/clothing/suits/armor.dmi' - worn_icon = 'icons/mob/clothing/suits/armor.dmi' - inhand_icon_state = "armor" - blood_overlay_type = "armor" - resistance_flags = NONE - armor_type = /datum/armor/suit_chameleon - var/datum/action/item_action/chameleon/change/chameleon_action - -/datum/armor/suit_chameleon - melee = 10 - bullet = 10 - laser = 10 - fire = 50 - acid = 50 - -/obj/item/clothing/suit/chameleon/Initialize(mapload) - . = ..() - allowed = GLOB.security_vest_allowed //should at least act like a vest - chameleon_action = new(src) - chameleon_action.chameleon_type = /obj/item/clothing/suit - chameleon_action.chameleon_name = "Suit" - chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/suit/armor/abductor, /obj/item/clothing/suit/changeling), only_root_path = TRUE) - 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) - return - chameleon_action.emp_randomise() - -/obj/item/clothing/suit/chameleon/broken/Initialize(mapload) - . = ..() - chameleon_action.emp_randomise(INFINITY) - -/obj/item/clothing/glasses/chameleon - name = "Optical Meson Scanner" - desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition." - icon_state = "meson" - inhand_icon_state = "meson" - resistance_flags = NONE - armor_type = /datum/armor/glasses_chameleon - - var/datum/action/item_action/chameleon/change/chameleon_action - -/datum/armor/glasses_chameleon - melee = 10 - bullet = 10 - laser = 10 - fire = 50 - acid = 50 - -/obj/item/clothing/glasses/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/chameleon/Destroy() - QDEL_NULL(chameleon_action) - return ..() - -/obj/item/clothing/glasses/chameleon/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - chameleon_action.emp_randomise() - -/obj/item/clothing/glasses/chameleon/broken/Initialize(mapload) - . = ..() - chameleon_action.emp_randomise(INFINITY) - -/obj/item/clothing/gloves/chameleon - desc = "These gloves provide protection against electric shock." - name = "insulated gloves" - icon_state = "yellow" - inhand_icon_state = "ygloves" - greyscale_colors = null - - resistance_flags = NONE - armor_type = /datum/armor/gloves_chameleon - - var/datum/action/item_action/chameleon/change/chameleon_action - -/datum/armor/gloves_chameleon - melee = 10 - bullet = 10 - laser = 10 - fire = 50 - acid = 50 - -/obj/item/clothing/gloves/chameleon/Initialize(mapload) - . = ..() - chameleon_action = new(src) - chameleon_action.chameleon_type = /obj/item/clothing/gloves - chameleon_action.chameleon_name = "Gloves" - chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/gloves, /obj/item/clothing/gloves/color, /obj/item/clothing/gloves/changeling), only_root_path = TRUE) - 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) - return - chameleon_action.emp_randomise() - -/obj/item/clothing/gloves/chameleon/broken/Initialize(mapload) - . = ..() - chameleon_action.emp_randomise(INFINITY) - -/obj/item/clothing/head/chameleon - name = "grey cap" - desc = "It's a baseball hat in a tasteful grey colour." - icon = 'icons/obj/clothing/head/hats.dmi' - worn_icon = 'icons/mob/clothing/head/hats.dmi' - icon_state = "greysoft" - resistance_flags = NONE - armor_type = /datum/armor/head_chameleon - - var/datum/action/item_action/chameleon/change/chameleon_action - -/datum/armor/head_chameleon - melee = 5 - bullet = 5 - laser = 5 - fire = 50 - acid = 50 - -/obj/item/clothing/head/chameleon/Initialize(mapload) - . = ..() - chameleon_action = new(src) - chameleon_action.chameleon_type = /obj/item/clothing/head - chameleon_action.chameleon_name = "Hat" - chameleon_action.chameleon_blacklist = typecacheof(/obj/item/clothing/head/changeling, only_root_path = TRUE) - 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) - return - chameleon_action.emp_randomise() - -/obj/item/clothing/head/chameleon/broken/Initialize(mapload) - . = ..() - chameleon_action.emp_randomise(INFINITY) - -/obj/item/clothing/head/chameleon/drone - // The camohat, I mean, holographic hat projection, is part of the - // drone itself. - armor_type = /datum/armor/none - // which means it offers no protection, it's just air and light - -/obj/item/clothing/head/chameleon/drone/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) - chameleon_action.random_look() - var/datum/action/item_action/chameleon/drone/togglehatmask/togglehatmask_action = new(src) - togglehatmask_action.build_all_button_icons() - var/datum/action/item_action/chameleon/drone/randomise/randomise_action = new(src) - randomise_action.build_all_button_icons() - -/obj/item/clothing/mask/chameleon - name = "gas mask" - desc = "A face-covering mask that can be connected to an air supply. While good for concealing your identity, it isn't good for blocking gas flow." //More accurate - icon_state = "gas_alt" - inhand_icon_state = "gas_alt" - resistance_flags = NONE - armor_type = /datum/armor/mask_chameleon - clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS - flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT - flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH - w_class = WEIGHT_CLASS_SMALL - - var/voice_change = 1 ///This determines if the voice changer is on or off. - - var/datum/action/item_action/chameleon/change/chameleon_action - -/datum/armor/mask_chameleon - melee = 5 - bullet = 5 - laser = 5 - bio = 100 - fire = 50 - acid = 50 - -/obj/item/clothing/mask/chameleon/Initialize(mapload) - . = ..() - chameleon_action = new(src) - chameleon_action.chameleon_type = /obj/item/clothing/mask - chameleon_action.chameleon_name = "Mask" - chameleon_action.chameleon_blacklist = typecacheof(/obj/item/clothing/mask/changeling, only_root_path = TRUE) - chameleon_action.initialize_disguises() - add_item_action(chameleon_action) - -/obj/item/clothing/mask/chameleon/Destroy() - QDEL_NULL(chameleon_action) - return ..() - -/obj/item/clothing/mask/chameleon/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - chameleon_action.emp_randomise() - -/obj/item/clothing/mask/chameleon/broken/Initialize(mapload) - . = ..() - 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"]!")) - - -/obj/item/clothing/mask/chameleon/drone - //Same as the drone chameleon hat, undroppable and no protection - armor_type = /datum/armor/none - // Can drones use the voice changer part? Let's not find out. - voice_change = 0 - -/obj/item/clothing/mask/chameleon/drone/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) - chameleon_action.random_look() - var/datum/action/item_action/chameleon/drone/togglehatmask/togglehatmask_action = new(src) - togglehatmask_action.build_all_button_icons() - var/datum/action/item_action/chameleon/drone/randomise/randomise_action = new(src) - randomise_action.build_all_button_icons() - -/obj/item/clothing/mask/chameleon/drone/attack_self(mob/user) - to_chat(user, span_notice("[src] does not have a voice changer.")) - -/obj/item/clothing/shoes/chameleon - name = "black shoes" - icon_state = "sneakers" - inhand_icon_state = "sneakers_back" - greyscale_colors = "#545454#ffffff" - greyscale_config = /datum/greyscale_config/sneakers - greyscale_config_worn = /datum/greyscale_config/sneakers_worn - desc = "A pair of black shoes." - resistance_flags = NONE - armor_type = /datum/armor/shoes_chameleon - - var/datum/action/item_action/chameleon/change/chameleon_action - -/datum/armor/shoes_chameleon - melee = 10 - bullet = 10 - laser = 10 - bio = 90 - fire = 50 - acid = 50 - -/obj/item/clothing/shoes/chameleon/Initialize(mapload) - . = ..() - - create_storage(storage_type = /datum/storage/pockets/shoes) - - chameleon_action = new(src) - chameleon_action.chameleon_type = /obj/item/clothing/shoes - chameleon_action.chameleon_name = "Shoes" - chameleon_action.chameleon_blacklist = typecacheof(/obj/item/clothing/shoes/changeling, only_root_path = TRUE) - 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) - return - chameleon_action.emp_randomise() - -/obj/item/clothing/shoes/chameleon/noslip - clothing_traits = list(TRAIT_NO_SLIP_WATER) - can_be_bloody = FALSE - -/obj/item/clothing/shoes/chameleon/noslip/broken/Initialize(mapload) - . = ..() - chameleon_action.emp_randomise(INFINITY) - -/obj/item/storage/backpack/chameleon - name = "backpack" - var/datum/action/item_action/chameleon/change/chameleon_action - -/obj/item/storage/backpack/chameleon/Initialize(mapload) - . = ..() - chameleon_action = new(src) - chameleon_action.chameleon_type = /obj/item/storage/backpack - chameleon_action.chameleon_name = "Backpack" - 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) - return - chameleon_action.emp_randomise() - -/obj/item/storage/backpack/chameleon/broken/Initialize(mapload) - . = ..() - chameleon_action.emp_randomise(INFINITY) - -/obj/item/storage/belt/chameleon - name = "toolbelt" - desc = "Holds tools." - var/datum/action/item_action/chameleon/change/chameleon_action - -/obj/item/storage/belt/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) - - 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) - return - chameleon_action.emp_randomise() - -/obj/item/storage/belt/chameleon/broken/Initialize(mapload) - . = ..() - chameleon_action.emp_randomise(INFINITY) - -/obj/item/radio/headset/chameleon - name = "radio headset" - var/datum/action/item_action/chameleon/change/chameleon_action - -/obj/item/radio/headset/chameleon/Initialize(mapload) - . = ..() - chameleon_action = new(src) - chameleon_action.chameleon_type = /obj/item/radio/headset - chameleon_action.chameleon_name = "Headset" - 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) - return - chameleon_action.emp_randomise() - -/obj/item/radio/headset/chameleon/broken/Initialize(mapload) - . = ..() - chameleon_action.emp_randomise(INFINITY) - -/obj/item/modular_computer/pda/chameleon - name = "tablet" - var/datum/action/item_action/chameleon/change/tablet/chameleon_action - -/obj/item/modular_computer/pda/chameleon/Initialize(mapload) - . = ..() - chameleon_action = new(src) - chameleon_action.chameleon_type = /obj/item/modular_computer/pda - chameleon_action.chameleon_name = "tablet" - chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/modular_computer/pda/heads), only_root_path = TRUE) - chameleon_action.initialize_disguises() - add_item_action(chameleon_action) - -/obj/item/modular_computer/pda/chameleon/Destroy() - QDEL_NULL(chameleon_action) - return ..() - -/obj/item/modular_computer/pda/chameleon/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - chameleon_action.emp_randomise() - -/obj/item/modular_computer/pda/chameleon/broken/Initialize(mapload) - . = ..() - chameleon_action.emp_randomise(INFINITY) - -/obj/item/stamp/chameleon - var/datum/action/item_action/chameleon/change/chameleon_action - -/obj/item/stamp/chameleon/Initialize(mapload) - . = ..() - chameleon_action = new(src) - chameleon_action.chameleon_type = /obj/item/stamp - chameleon_action.chameleon_name = "Stamp" - chameleon_action.initialize_disguises() - add_item_action(chameleon_action) - -/obj/item/stamp/chameleon/Destroy() - QDEL_NULL(chameleon_action) - return ..() - -/obj/item/stamp/chameleon/broken/Initialize(mapload) - . = ..() - chameleon_action.emp_randomise(INFINITY) - -/obj/item/clothing/neck/chameleon - name = "black tie" - desc = "A neosilk clip-on tie." - icon_state = "detective" //we use this icon_state since the other ones are all generated by GAGS. - resistance_flags = NONE - armor_type = /datum/armor/neck_chameleon - w_class = WEIGHT_CLASS_SMALL - -/obj/item/clothing/neck/chameleon - var/datum/action/item_action/chameleon/change/chameleon_action - -/datum/armor/neck_chameleon - fire = 50 - acid = 50 - -/obj/item/clothing/neck/chameleon/Initialize(mapload) - . = ..() - chameleon_action = new(src) - chameleon_action.chameleon_type = /obj/item/clothing/neck - chameleon_action.chameleon_blacklist = typecacheof(/obj/item/clothing/neck/cloak/skill_reward) - chameleon_action.chameleon_name = "Neck Accessory" - chameleon_action.initialize_disguises() - add_item_action(chameleon_action) - -/obj/item/clothing/neck/chameleon/Destroy() - qdel(chameleon_action) - return ..() - -/obj/item/clothing/neck/chameleon/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - chameleon_action.emp_randomise() - -/obj/item/clothing/neck/chameleon/broken/Initialize(mapload) - . = ..() - chameleon_action.emp_randomise(INFINITY) - -/obj/item/gun/energy/laser/chameleon - var/datum/action/item_action/chameleon/change/chameleon_action - - ammo_type = list(/obj/item/ammo_casing/energy/chameleon) - pin = /obj/item/firing_pin - automatic_charge_overlays = FALSE - can_select = FALSE - - /// The vars copied over to our projectile on fire. - var/list/chameleon_projectile_vars - - /// The badmin mode. Makes your projectiles act like the real deal. - var/real_hits = FALSE - -/obj/item/gun/energy/laser/chameleon/Initialize(mapload) - . = ..() - chameleon_action = new(src) - chameleon_action.chameleon_type = /obj/item/gun - chameleon_action.chameleon_name = "Gun" - chameleon_action.chameleon_blacklist = typecacheof(/obj/item/gun/energy/minigun) - chameleon_action.initialize_disguises() - add_item_action(chameleon_action) - - recharge_newshot() - set_chameleon_disguise(/obj/item/gun/energy/laser) - -/obj/item/gun/energy/laser/chameleon/Destroy() - chameleon_projectile_vars.Cut() - QDEL_NULL(chameleon_action) - return ..() - -/obj/item/gun/energy/laser/chameleon/emp_act(severity) - return - -/** - * Description: Resets the currently loaded chameleon variables, essentially resetting it to brand new. - * Arguments: [] - */ -/obj/item/gun/energy/laser/chameleon/proc/reset_chameleon_vars() - chameleon_projectile_vars = list() - - if(chambered) - chambered.firing_effect_type = initial(chambered.firing_effect_type) - - fire_sound = initial(fire_sound) - burst_size = initial(burst_size) - fire_delay = initial(fire_delay) - inhand_x_dimension = initial(inhand_x_dimension) - inhand_y_dimension = initial(inhand_y_dimension) - - QDEL_NULL(chambered.loaded_projectile) - chambered.newshot() - -/** - * Description: Sets what gun we should be mimicking. - * Arguments: [obj/item/gun/gun_to_set (the gun we're trying to mimic)] - */ -/obj/item/gun/energy/laser/chameleon/proc/set_chameleon_gun(obj/item/gun/gun_to_set) - if(!istype(gun_to_set)) - stack_trace("[gun_to_set] is not a valid gun.") - return FALSE - - fire_sound = gun_to_set.fire_sound - burst_size = gun_to_set.burst_size - fire_delay = gun_to_set.fire_delay - inhand_x_dimension = gun_to_set.inhand_x_dimension - inhand_y_dimension = gun_to_set.inhand_y_dimension - - if(istype(gun_to_set, /obj/item/gun/ballistic)) - var/obj/item/gun/ballistic/ball_gun = gun_to_set - var/obj/item/ammo_box/ball_ammo = new ball_gun.mag_type(gun_to_set) - qdel(ball_gun) - - if(!istype(ball_ammo) || !ball_ammo.ammo_type) - qdel(ball_ammo) - return FALSE - - var/obj/item/ammo_casing/ball_cartridge = new ball_ammo.ammo_type(gun_to_set) - set_chameleon_ammo(ball_cartridge) - - else if(istype(gun_to_set, /obj/item/gun/magic)) - var/obj/item/gun/magic/magic_gun = gun_to_set - var/obj/item/ammo_casing/magic_cartridge = new magic_gun.ammo_type(gun_to_set) - set_chameleon_ammo(magic_cartridge) - - else if(istype(gun_to_set, /obj/item/gun/energy)) - var/obj/item/gun/energy/energy_gun = gun_to_set - if(islist(energy_gun.ammo_type) && energy_gun.ammo_type.len) - var/obj/item/ammo_casing/energy_cartridge = energy_gun.ammo_type[1] - set_chameleon_ammo(energy_cartridge) - - else if(istype(gun_to_set, /obj/item/gun/syringe)) - var/obj/item/ammo_casing/syringe_cartridge = new /obj/item/ammo_casing/syringegun(src) - set_chameleon_ammo(syringe_cartridge) - - else - var/obj/item/ammo_casing/default_cartridge = new /obj/item/ammo_casing(src) - set_chameleon_ammo(default_cartridge) - -/** - * Description: Sets the ammo type our gun should have. - * Arguments: [obj/item/ammo_casing/cartridge (the ammo_casing we're trying to copy)] - */ -/obj/item/gun/energy/laser/chameleon/proc/set_chameleon_ammo(obj/item/ammo_casing/cartridge) - if(!istype(cartridge)) - stack_trace("[cartridge] is not a valid ammo casing.") - return FALSE - - var/obj/projectile/projectile = cartridge.loaded_projectile - set_chameleon_projectile(projectile) - -/** - * Description: Sets the current projectile variables for our chameleon gun. - * Arguments: [obj/projectile/template_projectile (the projectile we're trying to copy)] - */ -/obj/item/gun/energy/laser/chameleon/proc/set_chameleon_projectile(obj/projectile/template_projectile) - if(!istype(template_projectile)) - stack_trace("[template_projectile] is not a valid projectile.") - return FALSE - - chameleon_projectile_vars = list("name" = "practice laser", "icon" = 'icons/obj/weapons/guns/projectiles.dmi', "icon_state" = "laser") - - var/default_state = isnull(template_projectile.icon_state) ? "laser" : template_projectile.icon_state - - chameleon_projectile_vars["name"] = template_projectile.name - chameleon_projectile_vars["icon"] = template_projectile.icon - chameleon_projectile_vars["icon_state"] = default_state - chameleon_projectile_vars["speed"] = template_projectile.speed - chameleon_projectile_vars["color"] = template_projectile.color - chameleon_projectile_vars["hitsound"] = template_projectile.hitsound - chameleon_projectile_vars["impact_effect_type"] = template_projectile.impact_effect_type - chameleon_projectile_vars["range"] = template_projectile.range - chameleon_projectile_vars["suppressed"] = template_projectile.suppressed - chameleon_projectile_vars["hitsound_wall"] = template_projectile.hitsound_wall - chameleon_projectile_vars["pass_flags"] = template_projectile.pass_flags - - if(istype(chambered, /obj/item/ammo_casing/energy/chameleon)) - var/obj/item/ammo_casing/energy/chameleon/cartridge = chambered - - cartridge.loaded_projectile.name = template_projectile.name - cartridge.loaded_projectile.icon = template_projectile.icon - cartridge.loaded_projectile.icon_state = default_state - cartridge.loaded_projectile.speed = template_projectile.speed - cartridge.loaded_projectile.color = template_projectile.color - cartridge.loaded_projectile.hitsound = template_projectile.hitsound - cartridge.loaded_projectile.impact_effect_type = template_projectile.impact_effect_type - cartridge.loaded_projectile.range = template_projectile.range - cartridge.loaded_projectile.suppressed = template_projectile.suppressed - cartridge.loaded_projectile.hitsound_wall = template_projectile.hitsound_wall - cartridge.loaded_projectile.pass_flags = template_projectile.pass_flags - - cartridge.projectile_vars = chameleon_projectile_vars.Copy() - - if(real_hits) - qdel(chambered.loaded_projectile) - chambered.projectile_type = template_projectile.type - - qdel(template_projectile) - - -/** - * Description: Resets our chameleon variables, then resets the entire gun to mimic the given guntype. - * Arguments: [guntype (the gun we're copying, pathtyped to obj/item/gun)] - */ -/obj/item/gun/energy/laser/chameleon/proc/set_chameleon_disguise(guntype) - reset_chameleon_vars() - var/obj/item/gun/new_gun = new guntype(src) - set_chameleon_gun(new_gun) - qdel(new_gun) - -#undef EMP_RANDOMISE_TIME diff --git a/code/modules/clothing/chameleon/_chameleon_action.dm b/code/modules/clothing/chameleon/_chameleon_action.dm new file mode 100644 index 0000000000000..7d11355791bde --- /dev/null +++ b/code/modules/clothing/chameleon/_chameleon_action.dm @@ -0,0 +1,222 @@ +/// Default duration of an EMP randomisation on a chameleon item +#define EMP_RANDOMISE_TIME 30 SECONDS + +/datum/action/item_action/chameleon + +/datum/action/item_action/chameleon/change + name = "Chameleon Change" + check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_INCAPACITATED|AB_CHECK_HANDS_BLOCKED + /// Typecache of all item types we explicitly cannot pick + /// Note that abstract items are already excluded + VAR_FINAL/list/chameleon_blacklist = list() + /// Typecache of typepaths we can turn into + VAR_FINAL/list/chameleon_typecache + /// Assoc list of item name + icon state to item typepath + /// This is passed to the list input + VAR_FINAL/list/chameleon_list + /// The prime typepath of what class of item we're allowed to pick from + var/chameleon_type + /// Used in the action button to describe what we're changing into + var/chameleon_name = "Item" + /// What chameleon is active right now? + /// Can be set in the declaration to update in init + var/active_type + /// Cooldown from when we started being EMP'd + COOLDOWN_DECLARE(emp_timer) + +/datum/action/item_action/chameleon/change/New(Target) + . = ..() + if(!isitem(target)) + stack_trace("Adding chameleon action to non-item ([target])") + qdel(src) + return + + initialize_blacklist() + initialize_disguises() + if(active_type) + if(chameleon_blacklist[active_type]) + stack_trace("[type] has an active type defined in init which is blacklisted ([active_type])") + active_type = null + else + update_look(active_type) + + RegisterSignal(target, COMSIG_ATOM_EMP_ACT, PROC_REF(on_emp)) + +/datum/action/item_action/chameleon/change/Destroy() + STOP_PROCESSING(SSprocessing, src) + return ..() + +/datum/action/item_action/chameleon/change/proc/on_emp(datum/source, severity, protection) + SIGNAL_HANDLER + if(protection & EMP_PROTECT_SELF) + return + emp_randomise() + +/datum/action/item_action/chameleon/change/Grant(mob/grant_to) + . = ..() + if(isnull(owner)) + return + + // Whenever a mob gains their first cham change action, they need to also gain the outfit action + if(locate(/datum/action/chameleon_outfit) in grant_to.actions) + return + + var/datum/action/chameleon_outfit/outfit_action = new(owner) + outfit_action.Grant(owner) + +/datum/action/item_action/chameleon/change/Remove(mob/remove_from) + . = ..() + // Likewise when the mob loses the cham change action, if they have no others, they need to lose the outfit action + if(locate(/datum/action/item_action/chameleon/change) in remove_from.actions) + return + + var/datum/action/chameleon_outfit/outfit_action = locate() in remove_from.actions + QDEL_NULL(outfit_action) + +/datum/action/item_action/chameleon/change/proc/initialize_blacklist() + chameleon_blacklist |= typecacheof(target.type) + +/datum/action/item_action/chameleon/change/proc/initialize_disguises() + name = "Change [chameleon_name] Appearance" + build_all_button_icons() + + LAZYINITLIST(chameleon_typecache) + LAZYINITLIST(chameleon_list) + + if(!ispath(chameleon_type, /obj/item)) + stack_trace("Non-item chameleon type defined on [type] ([chameleon_type])") + return + + add_chameleon_items(chameleon_type) + +/datum/action/item_action/chameleon/change/proc/add_chameleon_items(type_to_add) + + chameleon_typecache |= typecacheof(type_to_add) + for(var/obj/item/item_type as anything in chameleon_typecache) + if(chameleon_blacklist[item_type] || (initial(item_type.item_flags) & ABSTRACT) || !initial(item_type.icon_state)) + continue + var/chameleon_item_name = "[initial(item_type.name)] ([initial(item_type.icon_state)])" + chameleon_list[chameleon_item_name] = item_type + + +/datum/action/item_action/chameleon/change/proc/select_look(mob/user) + var/picked_name = tgui_input_list(user, "Select [chameleon_name] to change into", "Chameleon Settings", sort_list(chameleon_list, GLOBAL_PROC_REF(cmp_typepaths_asc))) + if(isnull(picked_name) || isnull(chameleon_list[picked_name]) || QDELETED(src) || QDELETED(user) || QDELETED(owner) || !IsAvailable(feedback = TRUE)) + return + var/obj/item/picked_item = chameleon_list[picked_name] + update_look(picked_item) + +/datum/action/item_action/chameleon/change/proc/random_look() + var/picked_name = pick(chameleon_list) + update_look(chameleon_list[picked_name]) + +/datum/action/item_action/chameleon/change/proc/update_look(obj/item/picked_item) + var/obj/item/chameleon_item = target + + update_item(picked_item) + build_all_button_icons() + active_type = picked_item + + if(ismob(chameleon_item.loc)) + var/mob/wearer = chameleon_item.loc + wearer.update_clothing(chameleon_item.slot_flags | ITEM_SLOT_HANDS) + +/datum/action/item_action/chameleon/change/proc/update_item(obj/item/picked_item) + PROTECTED_PROC(TRUE) // Call update_look, not this! + + var/atom/atom_target = target + atom_target.name = initial(picked_item.name) + atom_target.desc = initial(picked_item.desc) + atom_target.icon_state = initial(picked_item.icon_state) + + if(isitem(atom_target)) + var/obj/item/item_target = target + item_target.worn_icon = initial(picked_item.worn_icon) + item_target.lefthand_file = initial(picked_item.lefthand_file) + item_target.righthand_file = initial(picked_item.righthand_file) + + item_target.worn_icon_state = initial(picked_item.worn_icon_state) + item_target.inhand_icon_state = initial(picked_item.inhand_icon_state) + + if(initial(picked_item.greyscale_colors)) + if(initial(picked_item.greyscale_config_worn)) + item_target.worn_icon = SSgreyscale.GetColoredIconByType( + initial(picked_item.greyscale_config_worn), + initial(picked_item.greyscale_colors), + ) + if(initial(picked_item.greyscale_config_inhand_left)) + item_target.lefthand_file = SSgreyscale.GetColoredIconByType( + initial(picked_item.greyscale_config_inhand_left), + initial(picked_item.greyscale_colors), + ) + if(initial(picked_item.greyscale_config_inhand_right)) + item_target.righthand_file = SSgreyscale.GetColoredIconByType( + initial(picked_item.greyscale_config_inhand_right), + initial(picked_item.greyscale_colors), + ) + + item_target.flags_inv = initial(picked_item.flags_inv) + item_target.transparent_protection = initial(picked_item.transparent_protection) + if(isclothing(item_target) && ispath(picked_item, /obj/item/clothing)) + var/obj/item/clothing/clothing_target = item_target + var/obj/item/clothing/picked_clothing = picked_item + clothing_target.flags_cover = initial(picked_clothing.flags_cover) + + + if(initial(picked_item.greyscale_config) && initial(picked_item.greyscale_colors)) + atom_target.icon = SSgreyscale.GetColoredIconByType( + initial(picked_item.greyscale_config), + initial(picked_item.greyscale_colors), + ) + + else + atom_target.icon = initial(picked_item.icon) + +/datum/action/item_action/chameleon/change/Trigger(trigger_flags) + if(!IsAvailable(feedback = TRUE)) + return FALSE + + select_look(owner) + return TRUE + +/datum/action/item_action/chameleon/change/proc/emp_randomise(amount = EMP_RANDOMISE_TIME) + START_PROCESSING(SSprocessing, src) + random_look() + + COOLDOWN_START(src, emp_timer, amount) + +/datum/action/item_action/chameleon/change/process() + if(COOLDOWN_FINISHED(src, emp_timer)) + STOP_PROCESSING(SSprocessing, src) + return + random_look() + +/datum/action/item_action/chameleon/change/proc/apply_outfit(datum/outfit/applying_from, list/all_items_to_apply) + SHOULD_CALL_PARENT(TRUE) + + var/using_item_type + for(var/item_type in all_items_to_apply) + if(!ispath(item_type, /obj/item)) + stack_trace("Invalid item type passed to apply_outfit ([item_type])") + continue + if(chameleon_typecache[item_type]) + using_item_type = item_type + break + + if(isnull(using_item_type)) + return FALSE + + if(istype(applying_from, /datum/outfit/job)) + var/datum/outfit/job/job_outfit = applying_from + var/datum/job/job_datum = SSjob.GetJobType(job_outfit.jobtype) + apply_job_data(job_datum) + + update_look(using_item_type) + all_items_to_apply -= using_item_type + return TRUE + +/// Used when applying this cham item via a job datum (from an outfit selection) +/datum/action/item_action/chameleon/change/proc/apply_job_data(datum/job/job_datum) + return + +#undef EMP_RANDOMISE_TIME diff --git a/code/modules/clothing/chameleon/_chameleon_outfit.dm b/code/modules/clothing/chameleon/_chameleon_outfit.dm new file mode 100644 index 0000000000000..df5f3056ac5cd --- /dev/null +++ b/code/modules/clothing/chameleon/_chameleon_outfit.dm @@ -0,0 +1,119 @@ +/datum/action/chameleon_outfit + name = "Select Chameleon Outfit" + desc = "LMB: Select a job to update all of your chameleon items to.
    \ + RMB: Save your current chameleon setup as a custom outfit." + button_icon_state = "chameleon_outfit" + check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_INCAPACITATED|AB_CHECK_HANDS_BLOCKED + + /// Determines when we're in use + var/applying = FALSE + /// Cached assoc list of job outfit datums by their names that we can select + /// If you intend on editing this, ensure you are copying it first + var/list/outfit_options + /// Assoc list of custom outfit names ("Custom outfit 1", "Custom outfit 2", etc) to list of all item typepaths saved in that outfit + var/list/custom_outfits + /// Cap on how many custom outfits we can save + var/max_custom_oufits = 10 + /// Used to generate the next custom outfit name, also to track which next to override if we've passed the limit + var/next_custom_outfit = 1 + +/datum/action/chameleon_outfit/New() + . = ..() + outfit_options = get_initial_outfits() + +/datum/action/chameleon_outfit/proc/get_initial_outfits() + var/static/list/standard_outfit_options + if(!standard_outfit_options) + standard_outfit_options = list() + for(var/datum/outfit/found_outfit as anything in subtypesof(/datum/outfit/job)) + standard_outfit_options[initial(found_outfit.name)] = new found_outfit() + sortTim(standard_outfit_options, GLOBAL_PROC_REF(cmp_text_asc)) + + return standard_outfit_options + +/datum/action/chameleon_outfit/Trigger(trigger_flags) + . = ..() + if(!. || applying) + return + if(usr != owner) // i guess + return + applying = TRUE + + if(trigger_flags & TRIGGER_SECONDARY_ACTION) + . = save_current_outfit(usr) + else + . = select_outfit(usr) + + applying = FALSE + return . + +/datum/action/chameleon_outfit/proc/save_current_outfit(mob/user) + var/list/saved_paths = list() + for(var/datum/action/item_action/chameleon/change/change_action in owner.actions) + if(change_action.active_type) + saved_paths |= change_action.active_type + + save_outfit(user, saved_paths) + +/datum/action/chameleon_outfit/proc/save_outfit(mob/user, list/saved_paths) + if(!length(saved_paths)) + owner.balloon_alert(user, "no outfit saved!") + return + + for(var/existing_outfit in custom_outfits) + if(custom_outfits[existing_outfit] ~= saved_paths) + owner.balloon_alert(user, "outfit already saved!") + return + + if(next_custom_outfit > max_custom_oufits) + next_custom_outfit = 1 + + LAZYSET(custom_outfits, "Custom Outfit #[next_custom_outfit]", saved_paths) + owner.balloon_alert(user, "outfit saved in slot [next_custom_outfit]") + next_custom_outfit += 1 + +/datum/action/chameleon_outfit/proc/select_outfit(mob/user) + var/list/all_options = list() + if(LAZYLEN(custom_outfits)) + all_options += "--- Custom outfits ---" + all_options += custom_outfits + all_options += "--- Job outfits ---" + all_options += outfit_options + + var/selected = tgui_input_list(user, "Select outfit to change into", "Chameleon Outfit", all_options) + if(isnull(selected) || QDELETED(src) || QDELETED(user) || QDELETED(owner) || !IsAvailable(feedback = TRUE)) + return FALSE + + var/selected_outfit = all_options[selected] + if(islist(selected_outfit)) + var/list/selected_custom_outfit = selected_outfit + var/datum/outfit/empty_outfit = new() + apply_outfit(empty_outfit, selected_custom_outfit.Copy()) + qdel(empty_outfit) + return TRUE + + if(istype(selected_outfit, /datum/outfit)) + apply_outfit(selected_outfit) + return TRUE + + return FALSE + +/** + * Applies the given outfit to all chameleon actions the owner has + * + * * outfit - what outfit to apply + * * outfit_types - optinal, list of typepaths to apply. If null, defaults to all items in the passed outfit. This list is mutated! + */ +/datum/action/chameleon_outfit/proc/apply_outfit(datum/outfit/outfit, list/outfit_types) + if(isnull(outfit_types)) + outfit_types = outfit.get_chameleon_disguise_info() + + for(var/datum/action/item_action/chameleon/change/change_action in owner.actions) + change_action.apply_outfit(outfit, outfit_types) + if(!isitem(change_action.target)) + continue + var/obj/item/cham_item = change_action.target + if(!cham_item.slot_flags) + continue + // Clothing items get a small delay to create a visual effect and also introduce some counterplay and also distinguish from lings + stoplag(0.1 SECONDS) diff --git a/code/modules/clothing/chameleon/chameleon_action_subtypes.dm b/code/modules/clothing/chameleon/chameleon_action_subtypes.dm new file mode 100644 index 0000000000000..f619a429269ec --- /dev/null +++ b/code/modules/clothing/chameleon/chameleon_action_subtypes.dm @@ -0,0 +1,299 @@ +/datum/action/item_action/chameleon/change/neck + chameleon_type = /obj/item/clothing/neck + chameleon_name = "Neck Accessory" + active_type = /obj/item/clothing/neck/tie/black + +/datum/action/item_action/chameleon/change/neck/initialize_blacklist() + . = ..() + chameleon_blacklist |= typecacheof(/obj/item/clothing/neck/cloak/skill_reward) + +/datum/action/item_action/chameleon/change/stamp + chameleon_type = /obj/item/stamp + chameleon_name = "Stamp" + +/datum/action/item_action/chameleon/change/tablet + chameleon_type = /obj/item/modular_computer/pda + chameleon_name = "Tablet" + +/datum/action/item_action/chameleon/change/tablet/initialize_blacklist() + . = ..() + chameleon_blacklist |= typecacheof(list(/obj/item/modular_computer/pda/heads), only_root_path = TRUE) + +/datum/action/item_action/chameleon/change/tablet/update_item(obj/item/picked_item) + ..() + var/obj/item/modular_computer/pda/agent_pda = target + if(istype(agent_pda)) + agent_pda.update_appearance() + +/datum/action/item_action/chameleon/change/tablet/apply_job_data(datum/job/job_datum) + ..() + var/obj/item/modular_computer/pda/agent_pda = target + if(istype(agent_pda) && istype(job_datum)) + agent_pda.imprint_id(job_name = job_datum.title) + +/datum/action/item_action/chameleon/change/headset + chameleon_type = /obj/item/radio/headset + chameleon_name = "Headset" + active_type = /obj/item/radio/headset + +/datum/action/item_action/chameleon/change/belt + chameleon_type = /obj/item/storage/belt + chameleon_name = "Belt" + active_type = /obj/item/storage/belt/utility + +/datum/action/item_action/chameleon/change/backpack + chameleon_type = /obj/item/storage/backpack + chameleon_name = "Backpack" + active_type = /obj/item/storage/backpack + +/datum/action/item_action/chameleon/change/shoes + chameleon_type = /obj/item/clothing/shoes + chameleon_name = "Shoes" + active_type = /obj/item/clothing/shoes/sneakers/black + +/datum/action/item_action/chameleon/change/shoes/initialize_blacklist() + . = ..() + chameleon_blacklist |= typecacheof(/obj/item/clothing/shoes/changeling, only_root_path = TRUE) + +/datum/action/item_action/chameleon/change/mask + chameleon_type = /obj/item/clothing/mask + chameleon_name = "Mask" + active_type = /obj/item/clothing/mask/gas + +/datum/action/item_action/chameleon/change/mask/initialize_blacklist() + . = ..() + chameleon_blacklist |= typecacheof(/obj/item/clothing/mask/changeling, only_root_path = TRUE) + +/datum/action/item_action/chameleon/change/hat + chameleon_type = /obj/item/clothing/head + chameleon_name = "Hat" + active_type = /obj/item/clothing/head/soft/black + +/datum/action/item_action/chameleon/change/hat/initialize_blacklist() + . = ..() + chameleon_blacklist |= typecacheof(/obj/item/clothing/head/changeling, only_root_path = TRUE) + +/datum/action/item_action/chameleon/change/gloves + chameleon_type = /obj/item/clothing/gloves + chameleon_name = "Gloves" + active_type = /obj/item/clothing/gloves/color/yellow + +/datum/action/item_action/chameleon/change/gloves/initialize_blacklist() + . = ..() + chameleon_blacklist |= typecacheof(list(/obj/item/clothing/gloves, /obj/item/clothing/gloves/color, /obj/item/clothing/gloves/changeling), only_root_path = TRUE) + +/datum/action/item_action/chameleon/change/glasses + chameleon_type = /obj/item/clothing/glasses + chameleon_name = "Glasses" + active_type = /obj/item/clothing/glasses/meson + +/datum/action/item_action/chameleon/change/glasses/initialize_blacklist() + . = ..() + chameleon_blacklist |= typecacheof(list(/obj/item/clothing/glasses/changeling, /obj/item/clothing/glasses/hud/security/chameleon, /obj/item/clothing/glasses/thermal/syndi), only_root_path = TRUE) + +/datum/action/item_action/chameleon/change/glasses/no_preset + active_type = null + +/datum/action/item_action/chameleon/change/suit + chameleon_type = /obj/item/clothing/suit + chameleon_name = "Suit" + active_type = /obj/item/clothing/suit/armor/vest + +/datum/action/item_action/chameleon/change/suit/initialize_blacklist() + . = ..() + chameleon_blacklist |= typecacheof(list(/obj/item/clothing/suit/armor/abductor, /obj/item/clothing/suit/changeling), only_root_path = TRUE) + +/datum/action/item_action/chameleon/change/suit/apply_outfit(mob/user, datum/outfit/applying_from, list/all_items_to_apply) + . = ..() + if(!. || !ispath(applying_from.suit, /obj/item/clothing/suit/hooded)) + return + // If we're appling a hooded suit, and wearing a cham hat, make it a hood + var/obj/item/clothing/suit/hooded/hooded = applying_from.suit + var/datum/action/item_action/chameleon/change/hat/hood_action = locate() in user.actions + hood_action?.update_look(user, initial(hooded.hoodtype)) + +/datum/action/item_action/chameleon/change/jumpsuit + chameleon_type = /obj/item/clothing/under + chameleon_name = "Jumpsuit" + active_type = /obj/item/clothing/under/color/black + +/datum/action/item_action/chameleon/change/jumpsuit/initialize_blacklist() + . = ..() + chameleon_blacklist |= typecacheof(list(/obj/item/clothing/under, /obj/item/clothing/under/color, /obj/item/clothing/under/rank, /obj/item/clothing/under/changeling), only_root_path = TRUE) + +/datum/action/item_action/chameleon/change/id + chameleon_type = /obj/item/card/id/advanced + chameleon_name = "ID Card" + +/datum/action/item_action/chameleon/change/id/New(Target) + . = ..() + if(!istype(target, /obj/item/card/id/advanced/chameleon)) + stack_trace("Adding chameleon ID action to non-chameleon id ([target])") + qdel(src) + +/datum/action/item_action/chameleon/change/id/update_item(obj/item/picked_item) + . = ..() + var/obj/item/card/id/advanced/chameleon/agent_card = target + var/obj/item/card/id/copied_card = picked_item + + // If the outfit comes with a special trim override, we'll steal some stuff from that. + var/new_trim = initial(copied_card.trim) + + if(new_trim) + SSid_access.apply_trim_to_chameleon_card(agent_card, new_trim, TRUE) + + // If the ID card hasn't been forged, we'll check if there has been an assignment set already by any new trim. + // If there has not, we set the assignment to the copied card's default as well as copying over the the + // default registered name from the copied card. + if(!agent_card.forged) + if(!agent_card.assignment) + agent_card.assignment = initial(copied_card.assignment) + + agent_card.registered_name = initial(copied_card.registered_name) + + agent_card.icon_state = initial(copied_card.icon_state) + if(ispath(copied_card, /obj/item/card/id/advanced)) + var/obj/item/card/id/advanced/copied_advanced_card = copied_card + agent_card.assigned_icon_state = initial(copied_advanced_card.assigned_icon_state) + + agent_card.update_label() + agent_card.update_appearance(UPDATE_ICON) + +/datum/action/item_action/chameleon/change/id/apply_job_data(datum/job/job_datum) + var/obj/item/card/id/advanced/chameleon/agent_card = target + agent_card.forged = TRUE + + // job_outfit is going to be a path. + var/datum/outfit/job/job_outfit = job_datum.outfit + if(isnull(job_outfit)) + return + + // copied_card is also going to be a path. + var/obj/item/card/id/copied_card = initial(job_outfit.id) + if(isnull(copied_card)) + return + + // If the outfit comes with a special trim override, we'll use that. Otherwise, use the card's default trim. Failing that, no trim at all. + var/new_trim = initial(job_outfit.id_trim) ? initial(job_outfit.id_trim) : initial(copied_card.trim) + + if(new_trim) + SSid_access.apply_trim_to_chameleon_card(agent_card, new_trim, FALSE) + else + agent_card.assignment = job_datum.title + + agent_card.icon_state = initial(copied_card.icon_state) + if(ispath(copied_card, /obj/item/card/id/advanced)) + var/obj/item/card/id/advanced/copied_advanced_card = copied_card + agent_card.assigned_icon_state = initial(copied_advanced_card.assigned_icon_state) + + agent_card.update_label() + agent_card.update_appearance(UPDATE_ICON) + +/datum/action/item_action/chameleon/change/id_trim + chameleon_type = /datum/id_trim + chameleon_name = "ID Trim" + +/datum/action/item_action/chameleon/change/id_trim/New(Target) + . = ..() + if(!istype(target, /obj/item/card/id/advanced/chameleon)) + stack_trace("Adding chameleon ID trim action to non-chameleon id ([target])") + qdel(src) + +/datum/action/item_action/chameleon/change/id_trim/initialize_blacklist() + return + +/datum/action/item_action/chameleon/change/id_trim/initialize_disguises() + // Little bit of copypasta but we only use trim datums rather than item paths + name = "Change [chameleon_name] Appearance" + build_all_button_icons() + + LAZYINITLIST(chameleon_typecache) + LAZYINITLIST(chameleon_list) + + for(var/datum/id_trim/trim_path as anything in typesof(/datum/id_trim)) + if(chameleon_blacklist[trim_path]) + continue + + var/datum/id_trim/trim = SSid_access.trim_singletons_by_path[trim_path] + + if(trim && trim.trim_state && trim.assignment) + var/chameleon_item_name = "[trim.assignment] ([trim.trim_state])" + chameleon_list[chameleon_item_name] = trim_path + chameleon_typecache[trim_path] = TRUE + +/datum/action/item_action/chameleon/change/id_trim/update_item(picked_trim_path) + var/obj/item/card/id/advanced/chameleon/agent_card = target + + SSid_access.apply_trim_to_chameleon_card(agent_card, picked_trim_path, TRUE) + + agent_card.update_label() + agent_card.update_appearance(UPDATE_ICON) + +/datum/action/item_action/chameleon/change/gun + chameleon_type = /obj/item/gun + chameleon_name = "Gun" + +/datum/action/item_action/chameleon/change/gun/New(Target) + . = ..() + if(!istype(target, /obj/item/gun/energy/laser/chameleon)) + stack_trace("Adding chameleon gun action to non-chameleon gun ([target])") + qdel(src) + +/datum/action/item_action/chameleon/change/gun/initialize_blacklist() + . = ..() + chameleon_blacklist |= typecacheof(/obj/item/gun/energy/minigun) + +/datum/action/item_action/chameleon/change/gun/update_look(obj/item/picked_item) + var/obj/item/gun/energy/laser/chameleon/chameleon_gun = target + chameleon_gun.set_chameleon_disguise(picked_item) + return ..() + +/datum/action/item_action/chameleon/change/scanner + chameleon_type = /obj/item/pen + chameleon_name = "Chameleon Scanner" + active_type = /obj/item/storage/fancy/cigarettes/cigpack_robustgold + /// Other types the chameleon scanner can swap into in addition to the chameleon type + var/static/list/other_cham_types = list( + /obj/item/analyzer, + /obj/item/assembly/flash/handheld, + /obj/item/assembly/signaler, + /obj/item/autopsy_scanner, + /obj/item/camera, + /obj/item/cane, + /obj/item/detective_scanner, + /obj/item/door_remote, + /obj/item/flashlight, + /obj/item/geiger_counter, + /obj/item/healthanalyzer, + /obj/item/mining_scanner, + /obj/item/multitool, + /obj/item/plant_analyzer, + /obj/item/sensor_device, + /obj/item/storage/fancy/cigarettes, // Fanservice + /obj/item/taperecorder, + /obj/item/toy/crayon, + ) + // (Other ideas include: GPSs, PDAs, station bounced radios, holosign creators, etc. But this is good enough) + +/datum/action/item_action/chameleon/change/scanner/initialize_blacklist() + . = ..() + chameleon_blacklist |= typecacheof(list( + /obj/item/assembly/signaler/anomaly, + /obj/item/camera/siliconcam, + /obj/item/door_remote/omni, + /obj/item/flashlight/emp/debug, + /obj/item/flashlight/eyelight/adapted, + /obj/item/flashlight/flare, + /obj/item/flashlight/lamp, + /obj/item/healthanalyzer/rad_laser, + /obj/item/multitool/ai_detect, + /obj/item/multitool/cyborg, + /obj/item/multitool/drone, + /obj/item/multitool/field_debug, + /obj/item/storage/fancy/cigarettes/cigars, + )) + +/datum/action/item_action/chameleon/change/scanner/initialize_disguises() + . = ..() + for(var/other_type in other_cham_types) + add_chameleon_items(other_type) diff --git a/code/modules/clothing/chameleon/chameleon_drone.dm b/code/modules/clothing/chameleon/chameleon_drone.dm new file mode 100644 index 0000000000000..83d6610d67153 --- /dev/null +++ b/code/modules/clothing/chameleon/chameleon_drone.dm @@ -0,0 +1,52 @@ +/datum/action/item_action/chameleon/drone/randomise + name = "Randomise Headgear" + button_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "random" + +/datum/action/item_action/chameleon/drone/randomise/Trigger(trigger_flags) + if(!IsAvailable(feedback = TRUE)) + return FALSE + + for(var/datum/action/item_action/chameleon/change/to_randomize in owner.actions) + to_randomize.random_look() + return TRUE + +// Allows a drone to turn their hat into a mask +// This action's existence is very silly can be replaced with just, a hat with a chameleon action that can be both hats and masks. +/datum/action/item_action/chameleon/drone/togglehatmask + name = "Toggle Headgear Mode" + button_icon = 'icons/mob/actions/actions_silicon.dmi' + button_icon_state = "drone_camogear_helm" + +/datum/action/item_action/chameleon/drone/togglehatmask/New(Target) + if (istype(Target, /obj/item/clothing/head/chameleon/drone)) + button_icon_state = "drone_camogear_helm" + if (istype(Target, /obj/item/clothing/mask/chameleon/drone)) + button_icon_state = "drone_camogear_mask" + return ..() + +/datum/action/item_action/chameleon/drone/togglehatmask/IsAvailable(feedback) + return ..() && isdrone(owner) + +/datum/action/item_action/chameleon/drone/togglehatmask/Trigger(trigger_flags) + if(!IsAvailable(feedback = TRUE)) + return FALSE + + var/mob/living/simple_animal/drone/droney = owner + + // The drone unEquip() proc sets head to null after dropping + // an item, so we need to keep a reference to our old headgear + // to make sure it's deleted. + var/obj/old_headgear = target + var/obj/new_headgear + + if(istype(old_headgear, /obj/item/clothing/head/chameleon/drone)) + new_headgear = new /obj/item/clothing/mask/chameleon/drone(droney) + else if(istype(old_headgear, /obj/item/clothing/mask/chameleon/drone)) + new_headgear = new /obj/item/clothing/head/chameleon/drone(droney) + else + to_chat(owner, span_warning("You shouldn't be able to toggle a camogear helmetmask if you're not wearing it.")) + return FALSE + droney.dropItemToGround(target, force = TRUE) + droney.equip_to_slot_or_del(new_headgear, ITEM_SLOT_HEAD) + return TRUE diff --git a/code/modules/clothing/chameleon/chameleon_gun.dm b/code/modules/clothing/chameleon/chameleon_gun.dm new file mode 100644 index 0000000000000..dafd0ba5f624a --- /dev/null +++ b/code/modules/clothing/chameleon/chameleon_gun.dm @@ -0,0 +1,157 @@ + +/obj/item/gun/energy/laser/chameleon + ammo_type = list(/obj/item/ammo_casing/energy/chameleon) + pin = /obj/item/firing_pin + automatic_charge_overlays = FALSE + can_select = FALSE + actions_types = list(/datum/action/item_action/chameleon/change/gun) + + /// The vars copied over to our projectile on fire. + var/list/chameleon_projectile_vars + + /// The badmin mode. Makes your projectiles act like the real deal. + var/real_hits = FALSE + +/obj/item/gun/energy/laser/chameleon/Initialize(mapload) + . = ..() + recharge_newshot() + AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_CONTENTS) + // Init order shenanigans dictate we have to do this last so we can't just use `active_type` + var/datum/action/item_action/chameleon/change/gun/gun_action = locate() in actions + gun_action?.update_look(/obj/item/gun/energy/laser) + +/** + * Description: Resets the currently loaded chameleon variables, essentially resetting it to brand new. + * Arguments: [] + */ +/obj/item/gun/energy/laser/chameleon/proc/reset_chameleon_vars() + chameleon_projectile_vars = list() + + if(chambered) + chambered.firing_effect_type = initial(chambered.firing_effect_type) + + fire_sound = initial(fire_sound) + burst_size = initial(burst_size) + fire_delay = initial(fire_delay) + inhand_x_dimension = initial(inhand_x_dimension) + inhand_y_dimension = initial(inhand_y_dimension) + + QDEL_NULL(chambered.loaded_projectile) + chambered.newshot() + +/** + * Description: Sets what gun we should be mimicking. + * Arguments: [obj/item/gun/gun_to_set (the gun we're trying to mimic)] + */ +/obj/item/gun/energy/laser/chameleon/proc/set_chameleon_gun(obj/item/gun/gun_to_set) + if(!istype(gun_to_set)) + stack_trace("[gun_to_set] is not a valid gun.") + return FALSE + + fire_sound = gun_to_set.fire_sound + burst_size = gun_to_set.burst_size + fire_delay = gun_to_set.fire_delay + inhand_x_dimension = gun_to_set.inhand_x_dimension + inhand_y_dimension = gun_to_set.inhand_y_dimension + + if(istype(gun_to_set, /obj/item/gun/ballistic)) + var/obj/item/gun/ballistic/ball_gun = gun_to_set + var/obj/item/ammo_box/ball_ammo = new ball_gun.spawn_magazine_type(gun_to_set) + qdel(ball_gun) + + if(!istype(ball_ammo) || !ball_ammo.ammo_type) + qdel(ball_ammo) + return FALSE + + var/obj/item/ammo_casing/ball_cartridge = new ball_ammo.ammo_type(gun_to_set) + set_chameleon_ammo(ball_cartridge) + + else if(istype(gun_to_set, /obj/item/gun/magic)) + var/obj/item/gun/magic/magic_gun = gun_to_set + var/obj/item/ammo_casing/magic_cartridge = new magic_gun.ammo_type(gun_to_set) + set_chameleon_ammo(magic_cartridge) + + else if(istype(gun_to_set, /obj/item/gun/energy)) + var/obj/item/gun/energy/energy_gun = gun_to_set + if(islist(energy_gun.ammo_type) && energy_gun.ammo_type.len) + var/obj/item/ammo_casing/energy_cartridge = energy_gun.ammo_type[1] + set_chameleon_ammo(energy_cartridge) + + else if(istype(gun_to_set, /obj/item/gun/syringe)) + var/obj/item/ammo_casing/syringe_cartridge = new /obj/item/ammo_casing/syringegun(src) + set_chameleon_ammo(syringe_cartridge) + + else + var/obj/item/ammo_casing/default_cartridge = new /obj/item/ammo_casing(src) + set_chameleon_ammo(default_cartridge) + +/** + * Description: Sets the ammo type our gun should have. + * Arguments: [obj/item/ammo_casing/cartridge (the ammo_casing we're trying to copy)] + */ +/obj/item/gun/energy/laser/chameleon/proc/set_chameleon_ammo(obj/item/ammo_casing/cartridge) + if(!istype(cartridge)) + stack_trace("[cartridge] is not a valid ammo casing.") + return FALSE + + var/obj/projectile/projectile = cartridge.loaded_projectile + set_chameleon_projectile(projectile) + +/** + * Description: Sets the current projectile variables for our chameleon gun. + * Arguments: [obj/projectile/template_projectile (the projectile we're trying to copy)] + */ +/obj/item/gun/energy/laser/chameleon/proc/set_chameleon_projectile(obj/projectile/template_projectile) + if(!istype(template_projectile)) + stack_trace("[template_projectile] is not a valid projectile.") + return FALSE + + chameleon_projectile_vars = list("name" = "practice laser", "icon" = 'icons/obj/weapons/guns/projectiles.dmi', "icon_state" = "laser") + + var/default_state = isnull(template_projectile.icon_state) ? "laser" : template_projectile.icon_state + + chameleon_projectile_vars["name"] = template_projectile.name + chameleon_projectile_vars["icon"] = template_projectile.icon + chameleon_projectile_vars["icon_state"] = default_state + chameleon_projectile_vars["speed"] = template_projectile.speed + chameleon_projectile_vars["color"] = template_projectile.color + chameleon_projectile_vars["hitsound"] = template_projectile.hitsound + chameleon_projectile_vars["impact_effect_type"] = template_projectile.impact_effect_type + chameleon_projectile_vars["range"] = template_projectile.range + chameleon_projectile_vars["suppressed"] = template_projectile.suppressed + chameleon_projectile_vars["hitsound_wall"] = template_projectile.hitsound_wall + chameleon_projectile_vars["pass_flags"] = template_projectile.pass_flags + + if(istype(chambered, /obj/item/ammo_casing/energy/chameleon)) + var/obj/item/ammo_casing/energy/chameleon/cartridge = chambered + + cartridge.loaded_projectile.name = template_projectile.name + cartridge.loaded_projectile.icon = template_projectile.icon + cartridge.loaded_projectile.icon_state = default_state + cartridge.loaded_projectile.speed = template_projectile.speed + cartridge.loaded_projectile.color = template_projectile.color + cartridge.loaded_projectile.hitsound = template_projectile.hitsound + cartridge.loaded_projectile.impact_effect_type = template_projectile.impact_effect_type + cartridge.loaded_projectile.range = template_projectile.range + cartridge.loaded_projectile.suppressed = template_projectile.suppressed + cartridge.loaded_projectile.hitsound_wall = template_projectile.hitsound_wall + cartridge.loaded_projectile.pass_flags = template_projectile.pass_flags + + cartridge.projectile_vars = chameleon_projectile_vars.Copy() + + if(real_hits) + qdel(chambered.loaded_projectile) + chambered.projectile_type = template_projectile.type + + qdel(template_projectile) + + +/** + * Description: Resets our chameleon variables, then resets the entire gun to mimic the given guntype. + * Arguments: [guntype (the gun we're copying, pathtyped to obj/item/gun)] + */ +/obj/item/gun/energy/laser/chameleon/proc/set_chameleon_disguise(guntype) + reset_chameleon_vars() + var/obj/item/gun/new_gun = new guntype(src) + set_chameleon_gun(new_gun) + qdel(new_gun) diff --git a/code/modules/clothing/chameleon/chameleon_scanner.dm b/code/modules/clothing/chameleon/chameleon_scanner.dm new file mode 100644 index 0000000000000..b6ed86e864029 --- /dev/null +++ b/code/modules/clothing/chameleon/chameleon_scanner.dm @@ -0,0 +1,116 @@ +/// Small handheld chameleon item that allows a user to mimic the outfit of another person quickly. +/obj/item/chameleon_scanner + // No name or desc by default, set up by the cham action + flags_1 = CONDUCT_1 + item_flags = NOBLUDGEON + slot_flags = ITEM_SLOT_BELT + w_class = WEIGHT_CLASS_TINY + actions_types = list(/datum/action/item_action/chameleon/change/scanner) + throw_speed = 3 + /// Range that we can scan people + var/scan_range = 5 + /// Cooldown between scans. + /// Not entirely intended to be a balance knob, but rather intended to prevent accidentally scanning the same person in quick succession. + COOLDOWN_DECLARE(scan_cooldown) + +/obj/item/chameleon_scanner/Initialize(mapload) + . = ..() + register_item_context() + +/obj/item/chameleon_scanner/add_item_context( + obj/item/source, + list/context, + atom/target, + mob/living/user, +) + if(ishuman(target) && IS_TRAITOR(user)) + // probably don't want to give out the context to any old crewmember - + // even though anyone can use it, it kind of reveals the fact that it's disguised + // (though it's trivial to find that out anyway) + context[SCREENTIP_CONTEXT_LMB] = "Scan target outfit" + context[SCREENTIP_CONTEXT_RMB] = "Scan target outfit and equip" + return CONTEXTUAL_SCREENTIP_SET + + return NONE + +/obj/item/chameleon_scanner/examine(mob/user) + . = ..() + if(!IS_TRAITOR(user)) + return + // similar to context, we don't want a bunch of text revealing "THIS IS A DISGUISED ITEM" to everyone on examine. + // despite the fact that anyone can use it, we'll only show it to traitors, everyone else just has to figure it out. + . += span_red("There's a small button on the bottom side of it. You recognize this as a hidden Chameleon Scanner 6000.") + . += span_red("Left click will stealthily scan a target up to [scan_range] meters away and upload their getup as a custom outfit for you to use.") + . += span_red("Right click will do the same, but instantly equip the outfit you obtain.") + +/obj/item/chameleon_scanner/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(scan_target(target, user)) + . |= AFTERATTACK_PROCESSED_ITEM + return . + +/obj/item/chameleon_scanner/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return . + + var/list/scanned_outfit = scan_target(target, user) + if(length(scanned_outfit)) + var/datum/outfit/empty_outfit = new() + var/datum/action/chameleon_outfit/outfit_action = locate() in user.actions + outfit_action?.apply_outfit(empty_outfit, scanned_outfit.Copy()) + qdel(empty_outfit) + + return SECONDARY_ATTACK_CONTINUE_CHAIN // no normal afterattack + +/** + * Attempts to scan a human's outfit + * + * * scanned - the atom being scanned. + * * scanner - the mob doing the scanning + * + * Returns null or a list of paths scanned. Will not return an empty list. + */ +/obj/item/chameleon_scanner/proc/scan_target(atom/scanned, mob/scanner) + + var/mob/living/carbon/human/mob_copying + if(ishuman(scanned)) + mob_copying = scanned + else if(isturf(scanned)) + mob_copying = locate() in scanned // Aim assist + + if(isnull(mob_copying)) + return + + if(!COOLDOWN_FINISHED(src, scan_cooldown)) + balloon_alert(scanner, "not ready yet!") + return + if(get_dist(scanner, mob_copying) > scan_range) + balloon_alert(scanner, "too far away!") + return + // Very short scan timer, keep you on your toes + if(!do_after(scanner, 0.5 SECONDS, scanned)) + return + + var/list/all_scanned_items = list() + for(var/obj/item/thing in mob_copying.get_equipped_items()) + var/datum/action/item_action/chameleon/change/counter_chameleon = locate() in thing.actions + if(counter_chameleon?.active_type) + // Prevent counter spying + all_scanned_items |= counter_chameleon.active_type + else + // I guess this technically serves as a way to discover changling clothes at a distance...?? + // Not sure if that's a good thing or not. + all_scanned_items |= thing.type + + if(!length(all_scanned_items)) + scanned.balloon_alert(scanner, "nothing to scan!") + return + + playsound(src, 'sound/machines/ping.ogg', vol = 30, vary = TRUE, extrarange = SILENCED_SOUND_EXTRARANGE) + COOLDOWN_START(src, scan_cooldown, 5 SECONDS) + + var/datum/action/chameleon_outfit/outfit_action = locate() in scanner.actions + outfit_action?.save_outfit(scanner, all_scanned_items) + + return all_scanned_items diff --git a/code/modules/clothing/chameleon/generic_chameleon_clothing.dm b/code/modules/clothing/chameleon/generic_chameleon_clothing.dm new file mode 100644 index 0000000000000..9e1339b40681c --- /dev/null +++ b/code/modules/clothing/chameleon/generic_chameleon_clothing.dm @@ -0,0 +1,326 @@ + +#define BREAK_CHAMELEON_ACTION(item) \ +do { \ + var/datum/action/item_action/chameleon/change/_action = locate() in item.actions; \ + _action?.emp_randomise(INFINITY); \ +} while(FALSE) + +// Cham jumpsuit +/datum/armor/clothing_under/chameleon + melee = 10 + bullet = 10 + laser = 10 + fire = 50 + acid = 50 + wound = 10 + +/obj/item/clothing/under/chameleon + name = "black jumpsuit" + desc = "It's a plain jumpsuit. It has a small dial on the wrist." + icon_state = "jumpsuit" + greyscale_colors = "#3f3f3f" + greyscale_config = /datum/greyscale_config/jumpsuit + greyscale_config_worn = /datum/greyscale_config/jumpsuit/worn + greyscale_config_inhand_left = /datum/greyscale_config/jumpsuit/inhand_left + greyscale_config_inhand_right = /datum/greyscale_config/jumpsuit/inhand_right + sensor_mode = SENSOR_OFF //Hey who's this guy on the Syndicate Shuttle?? + random_sensor = FALSE + resistance_flags = NONE + can_adjust = FALSE + armor_type = /datum/armor/clothing_under/chameleon + actions_types = list(/datum/action/item_action/chameleon/change/jumpsuit) + +/obj/item/clothing/under/chameleon/broken + +/obj/item/clothing/under/chameleon/broken/Initialize(mapload) + . = ..() + BREAK_CHAMELEON_ACTION(src) + +// Cham suit / armor +/datum/armor/suit_chameleon + melee = 10 + bullet = 10 + laser = 10 + fire = 50 + acid = 50 + +/obj/item/clothing/suit/chameleon + name = "armor" + desc = "A slim armored vest that protects against most types of damage." + icon_state = "armor" + icon = 'icons/obj/clothing/suits/armor.dmi' + worn_icon = 'icons/mob/clothing/suits/armor.dmi' + inhand_icon_state = "armor" + blood_overlay_type = "armor" + resistance_flags = NONE + armor_type = /datum/armor/suit_chameleon + actions_types = list(/datum/action/item_action/chameleon/change/suit) + +/obj/item/clothing/suit/chameleon/Initialize(mapload) + . = ..() + allowed = GLOB.security_vest_allowed //should at least act like a vest + +/obj/item/clothing/suit/chameleon/broken + +/obj/item/clothing/suit/chameleon/broken/Initialize(mapload) + . = ..() + BREAK_CHAMELEON_ACTION(src) + +// Cham glasses +/datum/armor/glasses_chameleon + melee = 10 + bullet = 10 + laser = 10 + fire = 50 + acid = 50 + +/obj/item/clothing/glasses/chameleon + name = "Optical Meson Scanner" + desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition." + icon_state = "meson" + inhand_icon_state = "meson" + resistance_flags = NONE + armor_type = /datum/armor/glasses_chameleon + actions_types = list(/datum/action/item_action/chameleon/change/glasses) + +/obj/item/clothing/glasses/chameleon/broken + +/obj/item/clothing/glasses/chameleon/broken/Initialize(mapload) + . = ..() + BREAK_CHAMELEON_ACTION(src) + +// Cham gloves +/datum/armor/gloves_chameleon + melee = 10 + bullet = 10 + laser = 10 + fire = 50 + acid = 50 + +/obj/item/clothing/gloves/chameleon + desc = "These gloves provide protection against electric shock." + name = "insulated gloves" + icon_state = "yellow" + inhand_icon_state = "ygloves" + greyscale_colors = null + + resistance_flags = NONE + armor_type = /datum/armor/gloves_chameleon + actions_types = list(/datum/action/item_action/chameleon/change/gloves) + +/obj/item/clothing/gloves/chameleon/broken + +/obj/item/clothing/gloves/chameleon/broken/Initialize(mapload) + . = ..() + BREAK_CHAMELEON_ACTION(src) + +// Cham hat +/datum/armor/head_chameleon + melee = 5 + bullet = 5 + laser = 5 + fire = 50 + acid = 50 + +/obj/item/clothing/head/chameleon + name = "grey cap" + desc = "It's a baseball hat in a tasteful grey colour." + icon = 'icons/obj/clothing/head/hats.dmi' + worn_icon = 'icons/mob/clothing/head/hats.dmi' + icon_state = "greysoft" + resistance_flags = NONE + armor_type = /datum/armor/head_chameleon + actions_types = list(/datum/action/item_action/chameleon/change/hat) + +/obj/item/clothing/head/chameleon/broken + +/obj/item/clothing/head/chameleon/broken/Initialize(mapload) + . = ..() + BREAK_CHAMELEON_ACTION(src) + +/obj/item/clothing/head/chameleon/drone + actions_types = list(/datum/action/item_action/chameleon/change/hat, /datum/action/item_action/chameleon/drone/togglehatmask, /datum/action/item_action/chameleon/drone/randomise) + item_flags = DROPDEL + // The camohat, I mean, holographic hat projection, is part of the drone itself. + armor_type = /datum/armor/none + // which means it offers no protection, it's just air and light + +/obj/item/clothing/head/chameleon/drone/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) + var/datum/action/item_action/chameleon/change/hat/hat = locate() in actions + hat?.random_look() + +// Cham mask, voice changer included +/datum/armor/mask_chameleon + melee = 5 + bullet = 5 + laser = 5 + bio = 100 + fire = 50 + acid = 50 + +/obj/item/clothing/mask/chameleon + name = "gas mask" + desc = "A face-covering mask that can be connected to an air supply. While good for concealing your identity, it isn't good for blocking gas flow." //More accurate + icon_state = "gas_alt" + inhand_icon_state = "gas_alt" + resistance_flags = NONE + armor_type = /datum/armor/mask_chameleon + clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT + flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH + w_class = WEIGHT_CLASS_SMALL + actions_types = list(/datum/action/item_action/chameleon/change/mask) + /// Is our voice changer enabled or disabled? + var/voice_change = TRUE + +/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"]!")) + +/obj/item/clothing/mask/chameleon/broken + +/obj/item/clothing/mask/chameleon/broken/Initialize(mapload) + . = ..() + BREAK_CHAMELEON_ACTION(src) + +/obj/item/clothing/mask/chameleon/drone + actions_types = list(/datum/action/item_action/chameleon/change/mask, /datum/action/item_action/chameleon/drone/togglehatmask, /datum/action/item_action/chameleon/drone/randomise) + item_flags = DROPDEL + //Same as the drone chameleon hat, undroppable and no protection + armor_type = /datum/armor/none + voice_change = FALSE + +/obj/item/clothing/mask/chameleon/drone/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) + var/datum/action/item_action/chameleon/change/mask/mask = locate() in actions + mask?.random_look() + +/obj/item/clothing/mask/chameleon/drone/attack_self(mob/user) + to_chat(user, span_notice("[src] does not have a voice changer.")) + +// Cham shoes, including chameleon noslips +/datum/armor/shoes_chameleon + melee = 10 + bullet = 10 + laser = 10 + bio = 90 + fire = 50 + acid = 50 + +/obj/item/clothing/shoes/chameleon + name = "black shoes" + desc = "A pair of black shoes." + icon_state = "sneakers" + inhand_icon_state = "sneakers_back" + greyscale_colors = "#545454#ffffff" + greyscale_config = /datum/greyscale_config/sneakers + greyscale_config_worn = /datum/greyscale_config/sneakers/worn + greyscale_config_inhand_left = /datum/greyscale_config/sneakers/inhand_left + greyscale_config_inhand_right = /datum/greyscale_config/sneakers/inhand_right + resistance_flags = NONE + armor_type = /datum/armor/shoes_chameleon + actions_types = list(/datum/action/item_action/chameleon/change/shoes) + +/obj/item/clothing/shoes/chameleon/Initialize(mapload) + . = ..() + create_storage(storage_type = /datum/storage/pockets/shoes) + +/obj/item/clothing/shoes/chameleon/broken + +/obj/item/clothing/shoes/chameleon/broken/Initialize(mapload) + . = ..() + BREAK_CHAMELEON_ACTION(src) + +/obj/item/clothing/shoes/chameleon/noslip + clothing_traits = list(TRAIT_NO_SLIP_WATER) + can_be_bloody = FALSE + +/obj/item/clothing/shoes/chameleon/noslip/broken + +/obj/item/clothing/shoes/chameleon/noslip/broken/Initialize(mapload) + . = ..() + BREAK_CHAMELEON_ACTION(src) + +// Cham backpack +/obj/item/storage/backpack/chameleon + name = "backpack" + actions_types = list(/datum/action/item_action/chameleon/change/backpack) + +/obj/item/storage/backpack/chameleon/broken + +/obj/item/storage/backpack/chameleon/broken/Initialize(mapload) + . = ..() + BREAK_CHAMELEON_ACTION(src) + +// Cham belt (bonus: is silent) +/obj/item/storage/belt/chameleon + name = "toolbelt" + desc = "Holds tools." + actions_types = list(/datum/action/item_action/chameleon/change/belt) + +/obj/item/storage/belt/chameleon/Initialize(mapload) + . = ..() + atom_storage.silent = TRUE + +/obj/item/storage/belt/chameleon/broken + +/obj/item/storage/belt/chameleon/broken/Initialize(mapload) + . = ..() + BREAK_CHAMELEON_ACTION(src) + +// Cham headset +/obj/item/radio/headset/chameleon + name = "radio headset" + actions_types = list(/datum/action/item_action/chameleon/change/headset) + +/obj/item/radio/headset/chameleon/broken + +/obj/item/radio/headset/chameleon/broken/Initialize(mapload) + . = ..() + BREAK_CHAMELEON_ACTION(src) + +// Cham PDA +/obj/item/modular_computer/pda/chameleon + name = "tablet" + actions_types = list(/datum/action/item_action/chameleon/change/tablet) + +/obj/item/modular_computer/pda/chameleon/broken + +/obj/item/modular_computer/pda/chameleon/broken/Initialize(mapload) + . = ..() + BREAK_CHAMELEON_ACTION(src) + +// Cham Stamp +/obj/item/stamp/chameleon + actions_types = list(/datum/action/item_action/chameleon/change/stamp) + +/obj/item/stamp/chameleon/broken + +/obj/item/stamp/chameleon/broken/Initialize(mapload) + . = ..() + BREAK_CHAMELEON_ACTION(src) + +// Cham neck-thing +/datum/armor/neck_chameleon + fire = 50 + acid = 50 + +/obj/item/clothing/neck/chameleon + name = "black tie" + desc = "A neosilk clip-on tie." + icon_state = "detective" //we use this icon_state since the other ones are all generated by GAGS. + resistance_flags = NONE + armor_type = /datum/armor/neck_chameleon + w_class = WEIGHT_CLASS_SMALL + actions_types = list(/datum/action/item_action/chameleon/change/neck) + +/obj/item/clothing/neck/chameleon/broken + +/obj/item/clothing/neck/chameleon/broken/Initialize(mapload) + . = ..() + BREAK_CHAMELEON_ACTION(src) + +#undef BREAK_CHAMELEON_ACTION diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 3f41893d8bcc5..0143a3387b293 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -1,5 +1,3 @@ -#define MOTH_EATING_CLOTHING_DAMAGE 15 - /obj/item/clothing name = "clothing" resistance_flags = FLAMMABLE @@ -108,11 +106,15 @@ if((clothing_flags & INEDIBLE_CLOTHING) || (resistance_flags & INDESTRUCTIBLE)) return ..() if(isnull(moth_snack)) - moth_snack = new - moth_snack.name = name - moth_snack.clothing = WEAKREF(src) + create_moth_snack() moth_snack.attack(target, user, params) +/// Creates a food object in null space which we can eat and imagine we're eating this pair of shoes +/obj/item/clothing/proc/create_moth_snack() + moth_snack = new + moth_snack.name = name + moth_snack.clothing = WEAKREF(src) + /obj/item/clothing/attackby(obj/item/W, mob/user, params) if(!istype(W, repairable_by)) return ..() @@ -254,6 +256,17 @@ LAZYSET(user_vars_remembered, variable, user.vars[variable]) user.vv_edit_var(variable, user_vars_to_edit[variable]) +// If the item is a piece of clothing and is being worn, make sure it updates on the player +/obj/item/clothing/update_greyscale() + . = ..() + + var/mob/living/carbon/human/wearer = loc + + if(!istype(wearer)) + return + + wearer.update_clothing(slot_flags) + /** * Inserts a trait (or multiple traits) into the clothing traits list * @@ -291,7 +304,7 @@ /obj/item/clothing/examine(mob/user) . = ..() if(damaged_clothes == CLOTHING_SHREDDED) - . += span_warning("[p_theyre(TRUE)] completely shredded and require[p_s()] mending before [p_they()] can be worn again!") + . += span_warning("[p_Theyre()] completely shredded and require[p_s()] mending before [p_they()] can be worn again!") return switch (max_heat_protection_temperature) @@ -392,7 +405,7 @@ if(isliving(loc)) //It's not important enough to warrant a message if it's not on someone var/mob/living/M = loc - if(src in M.get_equipped_items(FALSE)) + if(src in M.get_equipped_items()) to_chat(M, span_warning("Your [name] start[p_s()] to fall apart!")) else to_chat(M, span_warning("[src] start[p_s()] to fall apart!")) @@ -515,7 +528,7 @@ BLIND // can't see anything 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 + if(src in M.get_equipped_items()) //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 @@ -533,4 +546,10 @@ BLIND // can't see anything if(prob(0.2)) to_chat(L, span_warning("The damaged threads on your [src.name] chafe!")) -#undef MOTH_EATING_CLOTHING_DAMAGE +/obj/item/clothing/apply_fantasy_bonuses(bonus) + . = ..() + set_armor(get_armor().generate_new_with_modifiers(list(ARMOR_ALL = bonus))) + +/obj/item/clothing/remove_fantasy_bonuses(bonus) + set_armor(get_armor().generate_new_with_modifiers(list(ARMOR_ALL = -bonus))) + return ..() diff --git a/code/modules/clothing/ears/_ears.dm b/code/modules/clothing/ears/_ears.dm index c4001d23629d3..5ae5b628808e1 100644 --- a/code/modules/clothing/ears/_ears.dm +++ b/code/modules/clothing/ears/_ears.dm @@ -20,6 +20,7 @@ equip_delay_other = 25 resistance_flags = FLAMMABLE custom_price = PAYCHECK_COMMAND * 1.5 + flags_cover = EARS_COVERED /obj/item/clothing/ears/earmuffs/Initialize(mapload) . = ..() diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index b921f86b824c7..4107da729833a 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -194,6 +194,7 @@ base_icon_state = "eyepatch" inhand_icon_state = null actions_types = list(/datum/action/item_action/flip) + dog_fashion = /datum/dog_fashion/head/eyepatch /obj/item/clothing/glasses/eyepatch/attack_self(mob/user, modifiers) . = ..() @@ -290,7 +291,7 @@ return if(isliving(movable)) var/mob/living/crusher = movable - if(crusher.m_intent != MOVE_INTENT_WALK && (!(crusher.movement_type & (FLYING|FLOATING)) || crusher.buckled)) + if(crusher.move_intent != MOVE_INTENT_WALK && (!(crusher.movement_type & (FLYING|FLOATING)) || crusher.buckled)) playsound(src, 'sound/effects/footstep/glass_step.ogg', 30, TRUE) visible_message(span_warning("[crusher] steps on [src], damaging it!")) take_damage(100, sound_effect = FALSE) @@ -305,7 +306,7 @@ return if(!I.tool_start_check(user, amount=1)) return - if(I.use_tool(src, user, 10, volume=30, amount=1)) + if(I.use_tool(src, user, 10, volume=30)) user.visible_message(span_notice("[user] welds [src] back together."),\ span_notice("You weld [src] back together.")) repair() @@ -350,6 +351,18 @@ glass_colour_type = /datum/client_colour/glass_colour/gray dog_fashion = /datum/dog_fashion/head +/obj/item/clothing/glasses/sunglasses/Initialize(mapload) + . = ..() + add_glasses_slapcraft_component() + +/obj/item/clothing/glasses/sunglasses/proc/add_glasses_slapcraft_component() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/hudsunsec, /datum/crafting_recipe/hudsunmed, /datum/crafting_recipe/hudsundiag, /datum/crafting_recipe/scienceglasses) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/clothing/glasses/sunglasses/reagent name = "beer goggles" icon_state = "sunhudbeer" @@ -362,6 +375,14 @@ desc = "A pair of tacky purple sunglasses that allow the wearer to recognize various chemical compounds with only a glance." clothing_traits = list(TRAIT_REAGENT_SCANNER, TRAIT_RESEARCH_SCANNER) +/obj/item/clothing/glasses/sunglasses/chemical/add_glasses_slapcraft_component() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/scienceglassesremoval) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/clothing/glasses/sunglasses/gar name = "black gar glasses" desc = "Go beyond impossible and kick reason to the curb!" @@ -397,6 +418,29 @@ inhand_icon_state = "gar" glass_colour_type = /datum/client_colour/glass_colour/red +///Syndicate item that upgrades the flash protection of your eyes. +/obj/item/syndicate_contacts + name = "suspicious contact lens case" + desc = "A sinister red case that contains two shiny black contact lenses." + w_class = WEIGHT_CLASS_TINY + icon = 'icons/obj/device.dmi' + icon_state = "contacts" + +/obj/item/syndicate_contacts/attack_self(mob/user, modifiers) + . = ..() + if(!user.get_organ_slot(ORGAN_SLOT_EYES)) + to_chat(user, span_warning("You have no eyes to apply the contacts to!")) + return + var/obj/item/organ/internal/eyes/eyes = user.get_organ_slot(ORGAN_SLOT_EYES) + + to_chat(user, span_notice("You begin applying the contact lenses to your eyes...")) + if(!do_after(user, 3 SECONDS, src)) + return + to_chat(user, span_notice("The contacts seamlessly merge with your iris.")) + eyes.flash_protect += FLASH_PROTECTION_WELDER + to_chat(user, span_warning("\The [src] disintegrates into nothing.")) + qdel(src) + /obj/item/clothing/glasses/welding name = "welding goggles" desc = "Protects the eyes from bright flashes; approved by the mad scientist association." @@ -499,26 +543,10 @@ . = ..() REMOVE_TRAIT(user, TRAIT_XRAY_VISION, GLASSES_TRAIT) -/obj/item/clothing/glasses/thermal/syndi //These are now a traitor item, concealed as mesons. -Pete +/obj/item/clothing/glasses/thermal/syndi name = "chameleon thermals" desc = "A pair of thermal optic goggles with an onboard chameleon generator." - - var/datum/action/item_action/chameleon/change/chameleon_action - -/obj/item/clothing/glasses/thermal/syndi/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/thermal/syndi/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - chameleon_action.emp_randomise() + actions_types = list(/datum/action/item_action/chameleon/change/glasses/no_preset) /obj/item/clothing/glasses/thermal/monocle name = "thermoncle" @@ -624,14 +652,14 @@ . = ..() if(ishuman(user)) if(xray) - vision_flags -= SEE_MOBS|SEE_OBJS + vision_flags &= ~SEE_MOBS|SEE_OBJS REMOVE_TRAIT(user, TRAIT_XRAY_VISION, GLASSES_TRAIT) else - vision_flags += SEE_MOBS|SEE_OBJS + vision_flags |= SEE_MOBS|SEE_OBJS ADD_TRAIT(user, TRAIT_XRAY_VISION, GLASSES_TRAIT) xray = !xray - var/mob/living/carbon/human/H = user - H.update_sight() + var/mob/living/carbon/human/human_user = user + human_user.update_sight() /obj/item/clothing/glasses/regular/kim name = "binoclard lenses" @@ -679,6 +707,33 @@ inhand_icon_state = "glasses" glass_colour_type = /datum/client_colour/glass_colour/nightmare forced_glass_color = TRUE + lighting_cutoff = LIGHTING_CUTOFF_FULLBRIGHT + /// Hallucination datum currently being used for seeing mares + var/datum/hallucination/stored_hallucination + +/obj/item/clothing/glasses/nightmare_vision/Destroy() + QDEL_NULL(stored_hallucination) + return ..() + +/obj/item/clothing/glasses/nightmare_vision/equipped(mob/living/user, slot) + . = ..() + if(!(slot & ITEM_SLOT_EYES)) + return + //5% chance to get mare vision + if(prob(5)) + stored_hallucination = user.cause_hallucination( \ + /datum/hallucination/delusion/preset/mare, \ + src.name, \ + duration = 0, \ + affects_us = TRUE, \ + affects_others = TRUE, \ + skip_nearby = FALSE, \ + play_wabbajack = FALSE, \ + ) + +/obj/item/clothing/glasses/nightmare_vision/dropped(mob/living/user) + . = ..() + QDEL_NULL(stored_hallucination) /obj/item/clothing/glasses/osi name = "O.S.I. Sunglasses" diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm index f94b8578ac4d9..d91a5c3bb4a85 100644 --- a/code/modules/clothing/glasses/engine_goggles.dm +++ b/code/modules/clothing/glasses/engine_goggles.dm @@ -122,7 +122,7 @@ continue if(!connection_images[smart][dir2text(direction)]) var/image/arrow - arrow = new('icons/obj/atmospherics/pipes/simple.dmi', get_turf(smart), "connection_overlay") + arrow = new('icons/obj/pipes_n_cables/simple.dmi', get_turf(smart), "connection_overlay") arrow.dir = direction arrow.layer = smart.layer arrow.color = smart.pipe_color diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 66cf85f19c3e3..de42860e64a94 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -34,12 +34,13 @@ obj_flags |= EMAGGED desc = "[desc] The display is flickering slightly." -/obj/item/clothing/glasses/hud/emag_act(mob/user) +/obj/item/clothing/glasses/hud/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE obj_flags |= EMAGGED - to_chat(user, span_warning("PZZTTPFFFT")) + balloon_alert(user, "display scrambled") desc = "[desc] The display is flickering slightly." + return TRUE /obj/item/clothing/glasses/hud/suicide_act(mob/living/user) if(user.is_blind()) @@ -92,6 +93,15 @@ tint = 1 glass_colour_type = /datum/client_colour/glass_colour/blue +/obj/item/clothing/glasses/hud/health/sunglasses/Initialize(mapload) + . = ..() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/hudsunmedremoval) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/clothing/glasses/hud/diagnostic name = "diagnostic HUD" desc = "A heads-up display capable of analyzing the integrity and status of robotics and exosuits." @@ -118,6 +128,15 @@ flash_protect = FLASH_PROTECTION_FLASH tint = 1 +/obj/item/clothing/glasses/hud/diagnostic/sunglasses/Initialize(mapload) + . = ..() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/hudsundiagremoval) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /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." @@ -130,26 +149,7 @@ 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() - + actions_types = list(/datum/action/item_action/chameleon/change/glasses/no_preset) /obj/item/clothing/glasses/hud/security/sunglasses/eyepatch name = "eyepatch HUD" @@ -171,6 +171,15 @@ tint = 1 glass_colour_type = /datum/client_colour/glass_colour/darkred +/obj/item/clothing/glasses/hud/security/sunglasses/Initialize(mapload) + . = ..() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/hudsunsecremoval) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /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." diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index ff01d0ca1de02..3f5503ca0eed6 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -21,6 +21,14 @@ /// Used for handling bloody gloves leaving behind bloodstains on objects. Will be decremented whenever a bloodstain is left behind, and be incremented when the gloves become bloody. var/transfer_blood = 0 +/obj/item/clothing/gloves/apply_fantasy_bonuses(bonus) + . = ..() + siemens_coefficient = modify_fantasy_variable("siemens_coefficient", siemens_coefficient, -bonus / 10) + +/obj/item/clothing/gloves/remove_fantasy_bonuses(bonus) + siemens_coefficient = reset_fantasy_variable("siemens_coefficient", siemens_coefficient) + return ..() + /obj/item/clothing/gloves/wash(clean_types) . = ..() if((clean_types & CLEAN_TYPE_BLOOD) && transfer_blood > 0) diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 6c824c48a7c8e..27471b635c0f4 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -10,6 +10,15 @@ resistance_flags = NONE cut_type = /obj/item/clothing/gloves/fingerless +/obj/item/clothing/gloves/color/black/Initialize(mapload) + . = ..() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/radiogloves) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/clothing/gloves/fingerless name = "fingerless gloves" desc = "Plain black gloves without fingertips for the hard-working." @@ -23,18 +32,26 @@ undyeable = TRUE clothing_traits = list(TRAIT_FINGERPRINT_PASSTHROUGH) +/obj/item/clothing/gloves/color/fingerless/Initialize(mapload) + . = ..() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/gripperoffbrand) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/clothing/gloves/color/orange name = "orange gloves" desc = "A pair of gloves, they don't look special in any way." icon_state = "orange" - greyscale_colors = "#ff9300" + greyscale_colors = COLOR_CRAYON_ORANGE /obj/item/clothing/gloves/color/red name = "red gloves" desc = "A pair of gloves, they don't look special in any way." icon_state = "red" - greyscale_colors = "#da0000" - + greyscale_colors = COLOR_CRAYON_RED /obj/item/clothing/gloves/color/red/insulated name = "insulated gloves" @@ -57,7 +74,7 @@ name = "blue gloves" desc = "A pair of gloves, they don't look special in any way." icon_state = "blue" - greyscale_colors = "#00b7ef" + greyscale_colors = COLOR_CRAYON_BLUE /obj/item/clothing/gloves/color/purple name = "purple gloves" @@ -69,7 +86,7 @@ name = "green gloves" desc = "A pair of gloves, they don't look special in any way." icon_state = "green" - greyscale_colors = "#a8e61d" + greyscale_colors = COLOR_CRAYON_GREEN /obj/item/clothing/gloves/color/grey name = "grey gloves" @@ -103,5 +120,5 @@ name = "white gloves" desc = "These look pretty fancy." icon_state = "white" - greyscale_colors = "#ffffff" + greyscale_colors = COLOR_WHITE custom_price = PAYCHECK_CREW diff --git a/code/modules/clothing/gloves/insulated.dm b/code/modules/clothing/gloves/insulated.dm index ffd4b98c0bc94..99a1ed043555d 100644 --- a/code/modules/clothing/gloves/insulated.dm +++ b/code/modules/clothing/gloves/insulated.dm @@ -15,6 +15,15 @@ cut_type = /obj/item/clothing/gloves/cut clothing_traits = list(TRAIT_CHUNKYFINGERS) +/obj/item/clothing/gloves/color/yellow/apply_fantasy_bonuses(bonus) + . = ..() + if(bonus >= 10) + detach_clothing_traits(TRAIT_CHUNKYFINGERS) + +/obj/item/clothing/gloves/color/yellow/remove_fantasy_bonuses(bonus) + attach_clothing_traits(TRAIT_CHUNKYFINGERS) + return ..() + /datum/armor/color_yellow bio = 50 diff --git a/code/modules/clothing/gloves/plasmaman.dm b/code/modules/clothing/gloves/plasmaman.dm index 0ca552773ec21..d429ab10fd841 100644 --- a/code/modules/clothing/gloves/plasmaman.dm +++ b/code/modules/clothing/gloves/plasmaman.dm @@ -80,6 +80,10 @@ icon_state = "clownplasma" greyscale_colors = "#ff0000" +/obj/item/clothing/gloves/color/plasmaman/clown/Initialize(mapload) + . = ..() + AddElement(/datum/element/swabable, CELL_LINE_TABLE_CLOWN, CELL_VIRUS_TABLE_GENERIC, rand(2,3), 0) + /obj/item/clothing/gloves/color/plasmaman/head_of_personnel name = "head of personnel's envirogloves" desc = "Covers up those scandalous, bony hands. Appears to be an attempt at making a replica of the captain's gloves." diff --git a/code/modules/clothing/gloves/special.dm b/code/modules/clothing/gloves/special.dm index 88854c74decb9..74de42937e1e8 100644 --- a/code/modules/clothing/gloves/special.dm +++ b/code/modules/clothing/gloves/special.dm @@ -122,6 +122,7 @@ icon_state = "latex_black" inhand_icon_state = "greyscale_gloves" greyscale_colors = "#15191a" + clothing_traits = list(TRAIT_QUICK_CARRY, TRAIT_FASTMED) /obj/item/clothing/gloves/latex/coroner/add_blood_DNA(list/blood_DNA_to_add) return FALSE diff --git a/code/modules/clothing/head/beanie.dm b/code/modules/clothing/head/beanie.dm index 5a97e308454cb..ccb599964167f 100644 --- a/code/modules/clothing/head/beanie.dm +++ b/code/modules/clothing/head/beanie.dm @@ -9,12 +9,12 @@ icon = 'icons/obj/clothing/head/beanie.dmi' worn_icon = 'icons/mob/clothing/head/beanie.dmi' icon_state = "beanie" - icon_preview = 'icons/obj/previews.dmi' + icon_preview = 'icons/obj/fluff/previews.dmi' icon_state_preview = "beanie_cloth" custom_price = PAYCHECK_CREW * 1.2 greyscale_colors = "#EEEEEE#EEEEEE" greyscale_config = /datum/greyscale_config/beanie - greyscale_config_worn = /datum/greyscale_config/beanie_worn + greyscale_config_worn = /datum/greyscale_config/beanie/worn flags_1 = IS_PLAYER_COLORABLE_1 /obj/item/clothing/head/beanie/black @@ -44,7 +44,7 @@ /obj/item/clothing/head/beanie/durathread name = "durathread beanie" desc = "A beanie made from durathread, its resilient fibres provide some protection to the wearer." - icon_preview = 'icons/obj/previews.dmi' + icon_preview = 'icons/obj/fluff/previews.dmi' icon_state_preview = "beanie_durathread" greyscale_colors = "#8291A1#8291A1" armor_type = /datum/armor/beanie_durathread diff --git a/code/modules/clothing/head/cone.dm b/code/modules/clothing/head/cone.dm index 59d8cfe0d271e..0bd60b633da59 100644 --- a/code/modules/clothing/head/cone.dm +++ b/code/modules/clothing/head/cone.dm @@ -1,7 +1,7 @@ /obj/item/clothing/head/cone desc = "This cone is trying to warn you of something!" name = "warning cone" - icon = 'icons/obj/janitor.dmi' + icon = 'icons/obj/service/janitor.dmi' worn_icon = 'icons/mob/clothing/head/utility.dmi' icon_state = "cone" inhand_icon_state = null diff --git a/code/modules/clothing/head/costume.dm b/code/modules/clothing/head/costume.dm index db9813ba7285c..ec5ee81741fcc 100644 --- a/code/modules/clothing/head/costume.dm +++ b/code/modules/clothing/head/costume.dm @@ -22,7 +22,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/costume/cueball @@ -137,7 +137,7 @@ icon_state = "fancy_hat" greyscale_colors = "#E3C937#782A81" greyscale_config = /datum/greyscale_config/fancy_hat - greyscale_config_worn = /datum/greyscale_config/fancy_hat_worn + greyscale_config_worn = /datum/greyscale_config/fancy_hat/worn flags_1 = IS_PLAYER_COLORABLE_1 /obj/item/clothing/head/costume/football_helmet @@ -145,7 +145,7 @@ icon_state = "football_helmet" greyscale_colors = "#D74722" greyscale_config = /datum/greyscale_config/football_helmet - greyscale_config_worn = /datum/greyscale_config/football_helmet_worn + greyscale_config_worn = /datum/greyscale_config/football_helmet/worn flags_1 = IS_PLAYER_COLORABLE_1 /obj/item/clothing/head/costume/tv_head diff --git a/code/modules/clothing/head/garlands.dm b/code/modules/clothing/head/garlands.dm index 09a7a7532caed..4de0604044e32 100644 --- a/code/modules/clothing/head/garlands.dm +++ b/code/modules/clothing/head/garlands.dm @@ -12,3 +12,42 @@ /obj/item/clothing/head/costume/garland/dropped(mob/living/user) . = ..() user.clear_mood_event("garland") + +/obj/item/clothing/head/costume/garland/rainbowbunch + name = "rainbow flower crown" + desc = "A flower crown made out of the flowers of the rainbow bunch plant." + icon_state = "rainbow_bunch_crown_1" + base_icon_state = "rainbow_bunch_crown" + +/obj/item/clothing/head/costume/garland/rainbowbunch/Initialize(mapload) + . = ..() + var/crown_type = rand(1,4) + icon_state = "[base_icon_state]_[crown_type]" + switch(crown_type) + if(1) + desc += " This one has red, yellow, and white flowers." + if(2) + desc += " This one has blue, yellow, green, and white flowers." + if(3) + desc += " This one has red, blue, purple, and pink flowers." + if(4) + desc += " This one has yellow, green, and white flowers." + +/obj/item/clothing/head/costume/garland/sunflower + name = "sunflower crown" + desc = "A bright flower crown made out sunflowers that is sure to brighten up anyone's day!" + icon_state = "sunflower_crown" + worn_icon_state = "sunflower_crown" + +/obj/item/clothing/head/costume/garland/poppy + name = "poppy crown" + desc = "A flower crown made out of a string of bright red poppies." + icon_state = "poppy_crown" + worn_icon_state = "poppy_crown" + +/obj/item/clothing/head/costume/garland/lily + name = "lily crown" + desc = "A leafy flower crown with a cluster of large white lilies at at the front." + icon_state = "lily_crown" + worn_icon_state = "lily_crown" + diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 5552688e9913f..71be68036bf16 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -10,7 +10,7 @@ armor_type = /datum/armor/utility_hardhat 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 light_system = MOVABLE_LIGHT_DIRECTIONAL @@ -73,7 +73,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 @@ -93,7 +93,7 @@ icon_state = "hardhat0_white" inhand_icon_state = null 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 @@ -166,7 +166,7 @@ inhand_icon_state = null light_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 @@ -184,7 +184,7 @@ dog_fashion = null name = "atmospheric firefighter helmet" desc = "A firefighter's helmet, able to keep the user cool in any situation. Comes with a light and a welding visor." - clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | PLASMAMAN_HELMET_EXEMPT | HEADINTERNALS + clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | STACKABLE_HELMET_EXEMPT | HEADINTERNALS heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT cold_protection = HEAD @@ -208,7 +208,7 @@ icon_state = "hardhat0_pumpkin" inhand_icon_state = null 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_type = /datum/armor/none light_range = 2 //luminosity when on diff --git a/code/modules/clothing/head/hat.dm b/code/modules/clothing/head/hat.dm index 2d32440b14550..ccc8e903f3394 100644 --- a/code/modules/clothing/head/hat.dm +++ b/code/modules/clothing/head/hat.dm @@ -55,7 +55,7 @@ name = "plague doctor's hat" desc = "These were once used by plague doctors. Will protect you from exposure to the Pestilence." icon_state = "plaguedoctor" - clothing_flags = THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | SNUG_FIT | PLASMAMAN_HELMET_EXEMPT + clothing_flags = THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | SNUG_FIT | STACKABLE_HELMET_EXEMPT armor_type = /datum/armor/bio_hood_plague flags_inv = NONE @@ -99,6 +99,24 @@ inhand_icon_state = null armor_type = /datum/armor/head_cowboy resistance_flags = FIRE_PROOF | ACID_PROOF + /// Chance that the hat will catch a bullet for you + var/deflect_chance = 2 + +/obj/item/clothing/head/cowboy/Initialize(mapload) + . = ..() + AddComponent(\ + /datum/component/bullet_intercepting,\ + block_chance = deflect_chance,\ + active_slots = ITEM_SLOT_HEAD,\ + on_intercepted = CALLBACK(src, PROC_REF(on_intercepted_bullet)),\ + ) + +/// When we catch a bullet, fling away +/obj/item/clothing/head/cowboy/proc/on_intercepted_bullet(mob/living/victim, obj/projectile/bullet) + victim.visible_message(span_warning("\The [bullet] sends [victim]'s hat flying!")) + victim.dropItemToGround(src, force = TRUE, silent = TRUE) + throw_at(get_edge_target_turf(loc, pick(GLOB.alldirs)), range = 3, speed = 3) + playsound(victim, get_sfx(SFX_RICOCHET), 100, TRUE) /datum/armor/head_cowboy melee = 5 @@ -106,6 +124,10 @@ laser = 5 energy = 15 +/// Bounty hunter's hat, very likely to intercept bullets +/obj/item/clothing/head/cowboy/bounty + deflect_chance = 50 + /obj/item/clothing/head/cowboy/black name = "desperado hat" desc = "People with ropes around their necks don't always hang." diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index e6ef50879c474..f8cd88923ec19 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -11,8 +11,8 @@ heat_protection = HEAD max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT strip_delay = 60 - clothing_flags = SNUG_FIT | PLASMAMAN_HELMET_EXEMPT - flags_cover = HEADCOVERSEYES + clothing_flags = SNUG_FIT | STACKABLE_HELMET_EXEMPT + flags_cover = HEADCOVERSEYES|EARS_COVERED flags_inv = HIDEHAIR dog_fashion = /datum/dog_fashion/head/helmet @@ -89,7 +89,7 @@ inhand_icon_state = "marine_helmet" armor_type = /datum/armor/helmet_marine 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 dog_fashion = null @@ -120,6 +120,14 @@ name = "marine medic helmet" icon_state = "marine_medic" +/obj/item/clothing/head/helmet/marine/pmc + icon_state = "marine" + desc = "A tactical black helmet, designed to protect one's head from various injuries sustained in operations. Its stellar survivability making up is for it's lack of space worthiness" + min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT + max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT + clothing_flags = null + armor_type = /datum/armor/pmc + /obj/item/clothing/head/helmet/old name = "degrading helmet" desc = "Standard issue security helmet. Due to degradation the helmet's visor obstructs the users ability to see long distances." @@ -235,7 +243,7 @@ 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 @@ -256,7 +264,7 @@ desc = "An extremely robust helmet with the Nanotrasen logo emblazoned on the top." icon_state = "swat" inhand_icon_state = "swat_helmet" - 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 diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 24387971d156e..3c26de45e642f 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -12,19 +12,77 @@ desc = "The commander in chef's head wear." strip_delay = 10 equip_delay_other = 10 - dog_fashion = /datum/dog_fashion/head/chef - ///the chance that the movements of a mouse inside of this hat get relayed to the human wearing the hat + /// The chance that the movements of a mouse inside of this hat get relayed to the human wearing the hat var/mouse_control_probability = 20 + /// Allowed time between movements + COOLDOWN_DECLARE(move_cooldown) + +/// Admin variant of the chef hat where every mouse pilot input will always be transferred to the wearer +/obj/item/clothing/head/utility/chefhat/i_am_assuming_direct_control + desc = "The commander in chef's head wear. Upon closer inspection, there seem to be dozens of tiny levers, buttons, dials, and screens inside of this hat. What the hell...?" + mouse_control_probability = 100 /obj/item/clothing/head/utility/chefhat/Initialize(mapload) . = ..() - create_storage(storage_type = /datum/storage/pockets/chefhat) -/obj/item/clothing/head/utility/chefhat/i_am_assuming_direct_control - desc = "The commander in chef's head wear. Upon closer inspection, there seem to be dozens of tiny levers, buttons, dials, and screens inside of this hat. What the hell...?" - mouse_control_probability = 100 +/obj/item/clothing/head/utility/chefhat/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) + . = ..() + var/mob/living/basic/new_boss = get_mouse(arrived) + if(!new_boss) + return + RegisterSignal(new_boss, COMSIG_MOB_PRE_EMOTED, PROC_REF(on_mouse_emote)) + RegisterSignal(new_boss, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_mouse_moving)) + RegisterSignal(new_boss, COMSIG_MOB_CLIENT_PRE_LIVING_MOVE, PROC_REF(on_mouse_moving)) + +/obj/item/clothing/head/utility/chefhat/Exited(atom/movable/gone, direction) + . = ..() + var/mob/living/basic/old_boss = get_mouse(gone) + if(!old_boss) + return + UnregisterSignal(old_boss, list(COMSIG_MOB_PRE_EMOTED, COMSIG_MOVABLE_PRE_MOVE, COMSIG_MOB_CLIENT_PRE_LIVING_MOVE)) + +/// Returns a mob stored inside a mob container, if there is one +/obj/item/clothing/head/utility/chefhat/proc/get_mouse(atom/possible_mouse) + if (!ispickedupmob(possible_mouse)) + return + var/obj/item/clothing/head/mob_holder/mousey_holder = possible_mouse + return locate(/mob/living/basic) in mousey_holder.contents + +/// Relays emotes emoted by your boss to the hat wearer for full immersion +/obj/item/clothing/head/utility/chefhat/proc/on_mouse_emote(mob/living/source, key, emote_message, type_override) + SIGNAL_HANDLER + var/mob/living/carbon/wearer = loc + if(!wearer || wearer.incapacitated(IGNORE_RESTRAINTS)) + return + if (!prob(mouse_control_probability)) + return COMPONENT_CANT_EMOTE + INVOKE_ASYNC(wearer, TYPE_PROC_REF(/mob, emote), key, type_override, emote_message, FALSE) + return COMPONENT_CANT_EMOTE + +/// Relays movement made by the mouse in your hat to the wearer of the hat +/obj/item/clothing/head/utility/chefhat/proc/on_mouse_moving(mob/living/source, atom/moved_to) + SIGNAL_HANDLER + if (!prob(mouse_control_probability) || !COOLDOWN_FINISHED(src, move_cooldown)) + return COMPONENT_MOVABLE_BLOCK_PRE_MOVE // Didn't roll well enough or on cooldown + + var/mob/living/carbon/wearer = loc + if(!wearer || wearer.incapacitated(IGNORE_RESTRAINTS)) + return COMPONENT_MOVABLE_BLOCK_PRE_MOVE // Not worn or can't move + + var/move_direction = get_dir(wearer, moved_to) + if(!wearer.Process_Spacemove(move_direction)) + return COMPONENT_MOVABLE_BLOCK_PRE_MOVE // Currently drifting in space + if(!has_gravity() || !isturf(wearer.loc)) + return COMPONENT_MOVABLE_BLOCK_PRE_MOVE // Not in a location where we can move + + step_towards(wearer, moved_to) + var/move_delay = wearer.cached_multiplicative_slowdown + if (ISDIAGONALDIR(move_direction)) + move_delay *= sqrt(2) + COOLDOWN_START(src, move_cooldown, move_delay) + return COMPONENT_MOVABLE_BLOCK_PRE_MOVE /obj/item/clothing/head/utility/chefhat/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is donning [src]! It looks like [user.p_theyre()] trying to become a chef.")) @@ -35,14 +93,6 @@ playsound(user, 'sound/machines/ding.ogg', 50, TRUE) return FIRELOSS -/obj/item/clothing/head/utility/chefhat/relaymove(mob/living/user, direction) - if(!ismouse(user) || !isliving(loc) || !prob(mouse_control_probability)) - return - var/mob/living/L = loc - if(L.incapacitated(IGNORE_RESTRAINTS)) //just in case - return - step_towards(L, get_step(L, direction)) - //Captain /obj/item/clothing/head/hats/caphat name = "captain's hat" @@ -104,6 +154,13 @@ flags_inv = HIDEHAIR flags_cover = HEADCOVERSEYES +/obj/item/clothing/head/chaplain/habit_veil + name = "nun veil" + desc = "No nunsene clothing." + icon_state = "nun_hood_alt" + flags_inv = HIDEHAIR | HIDEEARS + clothing_flags = SNUG_FIT // can't be knocked off by throwing a paper hat. + /obj/item/clothing/head/chaplain/bishopmitre name = "bishop mitre" desc = "An opulent hat that functions as a radio to God. Or as a lightning rod, depending on who you ask." @@ -156,6 +213,116 @@ /obj/item/clothing/head/fedora/det_hat/minor flask_path = /obj/item/reagent_containers/cup/glass/flask/det/minor +///Detectives Fedora, but like Inspector Gadget. Not a subtype to not inherit candy corn stuff +/obj/item/clothing/head/fedora/inspector_hat + name = "inspector's fedora" + desc = "There's only one man can try to stop an evil villian." + armor_type = /datum/armor/fedora_det_hat + icon_state = "detective" + inhand_icon_state = "det_hat" + dog_fashion = /datum/dog_fashion/head/detective + ///prefix our phrases must begin with + var/prefix = "go go gadget" + ///an assoc list of phrase = item (like gun = revolver) + var/list/items_by_phrase = list() + ///how many gadgets can we hold + var/max_items = 4 + ///items above this weight cannot be put in the hat + var/max_weight = WEIGHT_CLASS_NORMAL + +/obj/item/clothing/head/fedora/inspector_hat/Initialize(mapload) + . = ..() + become_hearing_sensitive(ROUNDSTART_TRAIT) + QDEL_NULL(atom_storage) + +/obj/item/clothing/head/fedora/inspector_hat/examine(mob/user) + . = ..() + . += span_notice("You can put items inside, and get them out by saying a phrase, or using it in-hand!") + . += span_notice("The prefix is [prefix], and you can change it with alt-click!\n") + for(var/phrase in items_by_phrase) + var/obj/item/item = items_by_phrase[phrase] + . += span_notice("[icon2html(item, user)] You can remove [item] by saying \"[prefix] [phrase]\"!") + +/obj/item/clothing/head/fedora/inspector_hat/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range) + . = ..() + var/mob/living/carbon/wearer = loc + if(!istype(wearer) || speaker != wearer) //if we are worn + return FALSE + + raw_message = htmlrendertext(raw_message) + var/prefix_index = findtext(raw_message, prefix) + if(prefix_index != 1) + return FALSE + + var/the_phrase = trim_left(replacetext(raw_message, prefix, "")) + var/obj/item/result = items_by_phrase[the_phrase] + if(!result) + return FALSE + + if(wearer.put_in_active_hand(result)) + wearer.visible_message(span_warning("[src] drops [result] into the hands of [wearer]!")) + else + balloon_alert(wearer, "cant put in hands!") + + return TRUE + +/obj/item/clothing/head/fedora/inspector_hat/attackby(obj/item/item, mob/user, params) + . = ..() + + if(LAZYLEN(contents) >= max_items) + balloon_alert(user, "full!") + return + if(item.w_class > max_weight) + balloon_alert(user, "too big!") + return + + var/input = tgui_input_text(user, "What is the activation phrase?", "Activation phrase", "gadget", max_length = 26) + if(!input) + return + if(input in items_by_phrase) + balloon_alert(user, "already used!") + return + + if(item.loc != user || !user.transferItemToLoc(item, src)) + return + + to_chat(user, span_notice("You install [item] into the [thtotext(contents.len)] slot in [src].")) + playsound(src, 'sound/machines/click.ogg', 30, TRUE) + items_by_phrase[input] = item + +/obj/item/clothing/head/fedora/inspector_hat/attack_self(mob/user) + . = ..() + var/phrase = tgui_input_list(user, "What item do you want to remove by phrase?", "Item Removal", items_by_phrase) + if(!phrase) + return + user.put_in_inactive_hand(items_by_phrase[phrase]) + +/obj/item/clothing/head/fedora/inspector_hat/AltClick(mob/user) + . = ..() + var/new_prefix = tgui_input_text(user, "What should be the new prefix?", "Activation prefix", prefix, max_length = 24) + if(!new_prefix) + return + prefix = new_prefix + +/obj/item/clothing/head/fedora/inspector_hat/Exited(atom/movable/gone, direction) + . = ..() + for(var/phrase in items_by_phrase) + var/obj/item/result = items_by_phrase[phrase] + if(gone == result) + items_by_phrase -= phrase + return + +/obj/item/clothing/head/fedora/inspector_hat/atom_destruction(damage_flag) + for(var/phrase in items_by_phrase) + var/obj/item/result = items_by_phrase[phrase] + result.forceMove(drop_location()) + items_by_phrase = null + return ..() + +/obj/item/clothing/head/fedora/inspector_hat/Destroy() + QDEL_LIST_ASSOC(items_by_phrase) + return ..() + //Mime /obj/item/clothing/head/beret name = "beret" @@ -335,16 +502,16 @@ greyscale_config = /datum/greyscale_config/beret_badge greyscale_config_worn = /datum/greyscale_config/beret_badge/worn greyscale_colors = "#a52f29#F2F2F2" - armor_type = /datum/armor/beret_sec + armor_type = /datum/armor/cosmetic_sec strip_delay = 60 dog_fashion = null flags_1 = NONE -/datum/armor/beret_sec - melee = 35 - bullet = 30 - laser = 30 - energy = 40 +/datum/armor/cosmetic_sec + melee = 30 + bullet = 25 + laser = 25 + energy = 35 bomb = 25 fire = 20 acid = 50 @@ -395,6 +562,22 @@ name = "blue surgery cap" icon_state = "surgicalcap" desc = "A blue medical surgery cap to prevent the surgeon's hair from entering the insides of the patient!" + flags_inv = HIDEHAIR //Cover your head doctor! + +/obj/item/clothing/head/utility/surgerycap/attack_self(mob/user) + . = ..() + if(.) + return + balloon_alert(user, "[flags_inv & HIDEHAIR ? "loosening" : "tightening"] strings...") + if(!do_after(user, 3 SECONDS, src)) + return + flags_inv ^= HIDEHAIR + balloon_alert(user, "[flags_inv & HIDEHAIR ? "tightened" : "loosened "] strings") + return TRUE + +/obj/item/clothing/head/utility/surgerycap/examine(mob/user) + . = ..() + . += span_notice("Use in hand to [flags_inv & HIDEHAIR ? "loosen" : "tighten"] the strings.") /obj/item/clothing/head/utility/surgerycap/purple name = "burgundy surgery cap" @@ -416,6 +599,83 @@ icon_state = "surgicalcapblack" desc = "A black medical surgery cap to prevent the surgeon's hair from entering the insides of the patient!" +/obj/item/clothing/head/utility/head_mirror + name = "head mirror" + desc = "Used by doctors to look into a patient's eyes, ears, and mouth. \ + A little useless now, given the technology available, but it certainly completes the look." + icon_state = "headmirror" + body_parts_covered = NONE + +/obj/item/clothing/head/utility/head_mirror/examine(mob/user) + . = ..() + . += span_notice("In a properly lit room, you can use this to examine people's eyes, ears, and mouth closer.") + +/obj/item/clothing/head/utility/head_mirror/equipped(mob/living/user, slot) + . = ..() + if(slot & slot_flags) + RegisterSignal(user, COMSIG_MOB_EXAMINING_MORE, PROC_REF(examining)) + else + UnregisterSignal(user, COMSIG_MOB_EXAMINING_MORE) + +/obj/item/clothing/head/utility/head_mirror/dropped(mob/living/user) + . = ..() + UnregisterSignal(user, COMSIG_MOB_EXAMINING_MORE) + +/obj/item/clothing/head/utility/head_mirror/proc/examining(mob/living/examiner, atom/examining, list/examine_list) + SIGNAL_HANDLER + if(!ishuman(examining) || examining == examiner || examiner.is_blind() || !examiner.Adjacent(examining)) + return + var/mob/living/carbon/human/human_examined = examining + if(!human_examined.get_bodypart(BODY_ZONE_HEAD)) + return + if(!examiner.has_light_nearby()) + examine_list += span_warning("You attempt to use your [name] to examine [examining]'s head better... but it's too dark. Should've invested in a head lamp.") + return + if(examiner.dir == examining.dir) // disallow examine from behind - every other dir is OK + examine_list += span_warning("You attempt to use your [name] to examine [examining]'s head better... but [examining.p_theyre()] facing the wrong way.") + return + + var/list/final_message = list("You examine [examining]'s head closer with your [name], you notice [examining.p_they()] [examining.p_have()]...") + if(human_examined.is_mouth_covered()) + final_message += "\tYou can't see [examining.p_their()] mouth." + else + var/obj/item/organ/internal/tongue/has_tongue = human_examined.get_organ_slot(ORGAN_SLOT_TONGUE) + var/pill_count = 0 + for(var/datum/action/item_action/hands_free/activate_pill/pill in human_examined.actions) + pill_count++ + + if(pill_count >= 1 && has_tongue) + final_message += "\t[pill_count] pill\s in [examining.p_their()] mouth, and \a [has_tongue]." + else if(pill_count >= 1) + final_message += "\t[pill_count] pill\s in [examining.p_their()] mouth, but oddly no tongue." + else if(has_tongue) + final_message += "\t\A [has_tongue] in [examining.p_their()] mouth - go figure." + else + final_message += "\tNo tongue in [examining.p_their()] mouth, oddly enough." + + if(human_examined.is_ears_covered()) + final_message += "\tYou can't see [examining.p_their()] ears." + else + var/obj/item/organ/internal/ears/has_ears = human_examined.get_organ_slot(ORGAN_SLOT_EARS) + if(has_ears) + if(has_ears.deaf) + final_message += "\tDamaged eardrums in [examining.p_their()] ear canals." + else + final_message += "\tA set of [has_ears.damage ? "" : "healthy "][has_ears.name]." + else + final_message += "\tNo eardrums and empty ear canals... how peculiar." + + if(human_examined.is_eyes_covered()) + final_message += "\tYou can't see [examining.p_their()] eyes." + else + var/obj/item/organ/internal/eyes/has_eyes = human_examined.get_organ_slot(ORGAN_SLOT_EYES) + if(has_eyes) + final_message += "\tA pair of [has_eyes.damage ? "" : "healthy "][has_eyes.name]." + else + final_message += "\tEmpty eye sockets." + + examine_list += span_notice("[jointext(final_message, "\n")]") + //Engineering /obj/item/clothing/head/beret/engi name = "engineering beret" @@ -427,7 +687,7 @@ /obj/item/clothing/head/beret/cargo name = "cargo beret" desc = "No need to compensate when you can wear this beret!" - greyscale_colors = "#c99840" + greyscale_colors = "#b7723d" flags_1 = NONE //Curator @@ -440,7 +700,7 @@ name = "durathread beret" desc = "A beret made from durathread, its resilient fibers provide some protection to the wearer." icon_state = "beret_badge" - icon_preview = 'icons/obj/previews.dmi' + icon_preview = 'icons/obj/fluff/previews.dmi' icon_state_preview = "beret_durathread" greyscale_config = /datum/greyscale_config/beret_badge greyscale_config_worn = /datum/greyscale_config/beret_badge/worn @@ -463,7 +723,7 @@ /obj/item/clothing/head/beret/highlander/Initialize(mapload) . = ..() - ADD_TRAIT(src, TRAIT_NODROP, HIGHLANDER) + ADD_TRAIT(src, TRAIT_NODROP, HIGHLANDER_TRAIT) //CentCom /obj/item/clothing/head/beret/centcom_formal @@ -492,3 +752,13 @@ fire = 100 acid = 90 wound = 10 + +//Independant Militia +/obj/item/clothing/head/beret/militia + name = "\improper Militia General's Beret" + desc = "A rallying cry for the inhabitants of the Spinward Sector, the heroes that wear this keep the horrors of the galaxy at bay. Call them, and they'll be there in a minute!" + icon_state = "beret_badge" + greyscale_config = /datum/greyscale_config/beret_badge + greyscale_config_worn = /datum/greyscale_config/beret_badge/worn + greyscale_colors = "#43523d#a2abb0" + armor_type = /datum/armor/cosmetic_sec diff --git a/code/modules/clothing/head/mind_monkey_helmet.dm b/code/modules/clothing/head/mind_monkey_helmet.dm index 83fa277d2258d..c1ac5a1805a9b 100644 --- a/code/modules/clothing/head/mind_monkey_helmet.dm +++ b/code/modules/clothing/head/mind_monkey_helmet.dm @@ -81,20 +81,22 @@ if(prob(10)) switch(rand(1,4)) if(1) //blood rage - magnification.ai_controller.set_blackboard_key(BB_MONKEY_AGGRESSIVE, TRUE) + var/datum/ai_controller/monkey/monky_controller = magnification.ai_controller + monky_controller.set_trip_mode(mode = FALSE) + monky_controller.set_blackboard_key(BB_MONKEY_AGGRESSIVE, TRUE) if(2) //brain death magnification.apply_damage(500,BRAIN,BODY_ZONE_HEAD,FALSE,FALSE,FALSE) if(3) //primal gene (gorilla) magnification.gorillize() if(4) //genetic mass susceptibility (gib) - magnification.gib() + magnification.gib(DROP_ALL_REMAINS) //either used up correctly or taken off before polling finished (punish this by destroying the helmet) UnregisterSignal(magnification, COMSIG_SPECIES_LOSS) playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) playsound(src, SFX_SPARKS, 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) visible_message(span_warning("[src] fizzles and breaks apart!")) magnification = null - new /obj/effect/decal/cleanable/ash/crematorium(drop_location()) //just in case they're in a locker or other containers it needs to use crematorium ash, see the path itself for an explanation + new /obj/effect/decal/cleanable/ash(drop_location()) //just in case they're in a locker or other containers it needs to use crematorium ash, see the path itself for an explanation /obj/item/clothing/head/helmet/monkey_sentience/dropped(mob/user) . = ..() diff --git a/code/modules/clothing/head/pirate.dm b/code/modules/clothing/head/pirate.dm index 8084ef4759454..fd45404efc38b 100644 --- a/code/modules/clothing/head/pirate.dm +++ b/code/modules/clothing/head/pirate.dm @@ -13,7 +13,7 @@ if(!ishuman(user)) return if(slot & ITEM_SLOT_HEAD) - user.grant_language(/datum/language/piratespeak/, TRUE, TRUE, LANGUAGE_HAT) + user.grant_language(/datum/language/piratespeak/, source = LANGUAGE_HAT) to_chat(user, span_boldnotice("You suddenly know how to speak like a pirate!")) /obj/item/clothing/head/costume/pirate/dropped(mob/user) @@ -22,7 +22,7 @@ return var/mob/living/carbon/human/H = user if(H.get_item_by_slot(ITEM_SLOT_HEAD) == src && !QDELETED(src)) //This can be called as a part of destroy - user.remove_language(/datum/language/piratespeak/, TRUE, TRUE, LANGUAGE_HAT) + user.remove_language(/datum/language/piratespeak/, source = LANGUAGE_HAT) to_chat(user, span_boldnotice("You can no longer speak like a pirate.")) /obj/item/clothing/head/costume/pirate/armored diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 5ee036e3e7424..08562481a445f 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -6,13 +6,14 @@ icon_state = "cargosoft" inhand_icon_state = "greyscale_softcap" //todo wip var/soft_type = "cargo" + var/soft_suffix = "soft" dog_fashion = /datum/dog_fashion/head/cargo_tech var/flipped = FALSE /obj/item/clothing/head/soft/dropped() - icon_state = "[soft_type]soft" + icon_state = "[soft_type][soft_suffix]" flipped = FALSE ..() @@ -33,10 +34,10 @@ if(!user.incapacitated()) flipped = !flipped if(flipped) - icon_state = "[soft_type]soft_flipped" + icon_state = "[soft_type][soft_suffix]_flipped" to_chat(user, span_notice("You flip the hat backwards.")) else - icon_state = "[soft_type]soft" + icon_state = "[soft_type][soft_suffix]" to_chat(user, span_notice("You flip the hat back in normal position.")) usr.update_worn_head() //so our mob-overlays update @@ -129,22 +130,34 @@ desc = "It's a robust baseball hat in tasteful red colour." icon_state = "secsoft" soft_type = "sec" - armor_type = /datum/armor/soft_sec + armor_type = /datum/armor/cosmetic_sec strip_delay = 60 dog_fashion = null -/datum/armor/soft_sec - melee = 30 - bullet = 25 - laser = 25 - energy = 35 - bomb = 25 - fire = 20 - acid = 50 - /obj/item/clothing/head/soft/paramedic name = "paramedic cap" desc = "It's a baseball hat with a dark turquoise color and a reflective cross on the top." icon_state = "paramedicsoft" soft_type = "paramedic" dog_fashion = null + +/obj/item/clothing/head/soft/fishing_hat + name = "legendary fishing hat" + desc = "An ancient relic of a bygone era of bountiful catches and endless rivers. Printed on the front is a poem:\n\ + Women Fear Me\n\ + Fish Fear Me\n\ + Men Turn Their Eyes Away From Me\n\ + As I Walk No Beast Dares Make A Sound In My Presence\n\ + I Am Alone On This Barren Earth." + icon_state = "fishing_hat" + soft_type = "fishing_hat" + inhand_icon_state = "fishing_hat" + soft_suffix = null + worn_y_offset = 5 + clothing_flags = SNUG_FIT + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE + dog_fashion = null + +/obj/item/clothing/head/soft/fishing_hat/Initialize(mapload) + . = ..() + AddElement(/datum/element/skill_reward, /datum/skill/fishing) diff --git a/code/modules/clothing/head/tinfoilhat.dm b/code/modules/clothing/head/tinfoilhat.dm index 772219a6d1cd8..4b265778e237c 100644 --- a/code/modules/clothing/head/tinfoilhat.dm +++ b/code/modules/clothing/head/tinfoilhat.dm @@ -15,16 +15,19 @@ /obj/item/clothing/head/costume/foilhat/Initialize(mapload) . = ..() - if(!warped) - AddComponent(/datum/component/anti_magic, \ - antimagic_flags = MAGIC_RESISTANCE_MIND, \ - inventory_flags = ITEM_SLOT_HEAD, \ - charges = 6, \ - drain_antimagic = CALLBACK(src, PROC_REF(drain_antimagic)), \ - expiration = CALLBACK(src, PROC_REF(warp_up)) \ - ) - else + if(warped) warp_up() + return + + AddComponent( + /datum/component/anti_magic, \ + antimagic_flags = MAGIC_RESISTANCE_MIND, \ + inventory_flags = ITEM_SLOT_HEAD, \ + charges = 6, \ + drain_antimagic = CALLBACK(src, PROC_REF(drain_antimagic)), \ + expiration = CALLBACK(src, PROC_REF(warp_up)) \ + ) + /obj/item/clothing/head/costume/foilhat/equipped(mob/living/carbon/human/user, slot) . = ..() diff --git a/code/modules/clothing/head/tophat.dm b/code/modules/clothing/head/tophat.dm index 1a144f2f13d96..26087ab6232e0 100644 --- a/code/modules/clothing/head/tophat.dm +++ b/code/modules/clothing/head/tophat.dm @@ -28,8 +28,7 @@ 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!")) var/wait_how_many_bees_did_that_guy_pull_out_of_his_hat = rand(4, 8) for(var/b in 1 to wait_how_many_bees_did_that_guy_pull_out_of_his_hat) - var/mob/living/simple_animal/hostile/bee/barry = new(get_turf(magician)) - barry.GiveTarget(magician) + var/mob/living/basic/bee/barry = new(get_turf(magician)) if(prob(20)) barry.say(pick("BUZZ BUZZ", "PULLING A RABBIT OUT OF A HAT IS A TIRED TROPE", "I DIDN'T ASK TO BEE HERE"), forced = "bee hat") else diff --git a/code/modules/clothing/head/welding.dm b/code/modules/clothing/head/welding.dm index 287ab800c1fb0..bccb1d4524db0 100644 --- a/code/modules/clothing/head/welding.dm +++ b/code/modules/clothing/head/welding.dm @@ -15,7 +15,7 @@ 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 /datum/armor/utility_welding melee = 10 diff --git a/code/modules/clothing/head/wig.dm b/code/modules/clothing/head/wig.dm index 62c8f803a7a9a..b692c1383c50b 100644 --- a/code/modules/clothing/head/wig.dm +++ b/code/modules/clothing/head/wig.dm @@ -1,7 +1,7 @@ /obj/item/clothing/head/wig name = "wig" desc = "A bunch of hair without a head attached." - icon = 'icons/mob/species/human/human_face.dmi' // default icon for all hairs + icon = 'icons/mob/human/human_face.dmi' // default icon for all hairs worn_icon = 'icons/mob/clothing/head/costume.dmi' icon_state = "hair_vlong" inhand_icon_state = "pwig" @@ -70,6 +70,10 @@ if((head.flags_inv & HIDEHAIR) && !istype(head, /obj/item/clothing/head/wig)) to_chat(user, span_warning("You can't get a good look at [target.p_their()] hair!")) return + var/obj/item/bodypart/head/noggin = target.get_bodypart(BODY_ZONE_HEAD) + if(!noggin) + to_chat(user, span_warning("[target.p_They()] have no head!")) + return var/selected_hairstyle = null var/selected_hairstyle_color = null @@ -77,7 +81,7 @@ var/obj/item/clothing/head/wig/wig = target.head selected_hairstyle = wig.hairstyle selected_hairstyle_color = wig.color - else if((HAIR in target.dna.species.species_traits) && target.hairstyle != "Bald") + else if((noggin.head_flags & HEAD_HAIR) && target.hairstyle != "Bald") selected_hairstyle = target.hairstyle selected_hairstyle_color = "[target.hair_color]" @@ -106,7 +110,7 @@ /obj/item/clothing/head/wig/natural/visual_equipped(mob/living/carbon/human/user, slot) . = ..() if(ishuman(user) && (slot & ITEM_SLOT_HEAD)) - if (color != user.hair_color) // only update if necessary + if(color != user.hair_color) // only update if necessary add_atom_colour(user.hair_color, FIXED_COLOUR_PRIORITY) update_appearance() user.update_worn_head() diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm index dfcc3060c9f4d..ad296d3035684 100644 --- a/code/modules/clothing/masks/_masks.dm +++ b/code/modules/clothing/masks/_masks.dm @@ -12,6 +12,10 @@ var/adjusted_flags = null ///Did we install a filtering cloth? var/has_filter = FALSE + /// If defined, what voice should we override with if TTS is active? + var/voice_override + /// If set to true, activates the radio effect on TTS. Used for sec hailers, but other masks can utilize it for their own vocal effect. + var/use_radio_beeps_tts = FALSE /obj/item/clothing/mask/attack_self(mob/user) if((clothing_flags & VOICEBOX_TOGGLABLE)) diff --git a/code/modules/clothing/masks/bandana.dm b/code/modules/clothing/masks/bandana.dm index 86ea1e71fb611..da9efa593ddf7 100644 --- a/code/modules/clothing/masks/bandana.dm +++ b/code/modules/clothing/masks/bandana.dm @@ -14,13 +14,23 @@ icon_state = "bandana" icon_state_preview = "bandana_cloth" inhand_icon_state = "greyscale_bandana" - worn_icon_state = "bandana_worn" greyscale_config = /datum/greyscale_config/bandana - greyscale_config_worn = /datum/greyscale_config/bandana_worn - greyscale_config_inhand_left = /datum/greyscale_config/bandana_inhands_left - greyscale_config_inhand_right = /datum/greyscale_config/bandana_inhands_right + greyscale_config_worn = /datum/greyscale_config/bandana/worn + greyscale_config_inhand_left = /datum/greyscale_config/bandana/inhands_left + greyscale_config_inhand_right = /datum/greyscale_config/bandana/inhands_right greyscale_colors = "#2e2e2e" +/obj/item/clothing/mask/bandana/examine(mob/user) + . = ..() + if(mask_adjusted) + . += "Use in-hand to untie it to wear as a mask!" + return + if(slot_flags & ITEM_SLOT_NECK) + . += "Alt-click to untie it to wear as a mask!" + else + . += "Use in-hand to tie it up to wear as a hat!" + . += "Alt-click to tie it up to wear on your neck!" + /obj/item/clothing/mask/bandana/attack_self(mob/user) if(slot_flags & ITEM_SLOT_NECK) to_chat(user, span_warning("You must undo [src] in order to push it into a hat!")) @@ -30,7 +40,6 @@ /obj/item/clothing/mask/bandana/adjustmask(mob/living/user) . = ..() if(mask_adjusted) - worn_icon_state += "_up" undyeable = TRUE else inhand_icon_state = initial(inhand_icon_state) @@ -51,8 +60,7 @@ else if(!user.is_holding(src)) to_chat(user, span_warning("You must be holding [src] in order to tie it!")) return - - + if(slot_flags & ITEM_SLOT_MASK) undyeable = TRUE slot_flags = ITEM_SLOT_NECK @@ -121,18 +129,17 @@ desc = "A bandana made from durathread, you wish it would provide some protection to its wearer, but it's far too thin..." greyscale_colors = "#5c6d80" flags_1 = NONE - icon_preview = 'icons/obj/previews.dmi' + icon_preview = 'icons/obj/fluff/previews.dmi' icon_state_preview = "bandana_durathread" /obj/item/clothing/mask/bandana/striped name = "striped bandana" desc = "A fine bandana with nanotech lining and a stripe across." icon_state = "bandstriped" - worn_icon_state = "bandstriped_worn" - greyscale_config = /datum/greyscale_config/bandstriped - greyscale_config_worn = /datum/greyscale_config/bandstriped_worn - greyscale_config_inhand_left = /datum/greyscale_config/bandana_striped_inhands_left - greyscale_config_inhand_right = /datum/greyscale_config/bandana_striped_inhands_right + greyscale_config = /datum/greyscale_config/bandana/striped + greyscale_config_worn = /datum/greyscale_config/bandana/striped/worn + greyscale_config_inhand_left = /datum/greyscale_config/bandana/striped/inhands_left + greyscale_config_inhand_right = /datum/greyscale_config/bandana/striped/inhands_right greyscale_colors = "#2e2e2e#C6C6C6" undyeable = TRUE @@ -182,11 +189,10 @@ name = "skull bandana" desc = "A fine bandana with nanotech lining and a skull emblem." icon_state = "bandskull" - worn_icon_state = "bandskull_worn" - greyscale_config = /datum/greyscale_config/bandskull - greyscale_config_worn = /datum/greyscale_config/bandskull_worn - greyscale_config_inhand_left = /datum/greyscale_config/bandana_skull_inhands_left - greyscale_config_inhand_right = /datum/greyscale_config/bandana_skull_inhands_right + greyscale_config = /datum/greyscale_config/bandana/skull + greyscale_config_worn = /datum/greyscale_config/bandana/skull/worn + greyscale_config_inhand_left = /datum/greyscale_config/bandana/skull/inhands_left + greyscale_config_inhand_right = /datum/greyscale_config/bandana/skull/inhands_right greyscale_colors = "#2e2e2e#C6C6C6" undyeable = TRUE diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index 1af058181a681..9c947b53a9399 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -5,6 +5,7 @@ inhand_icon_state = "balaclava" flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT visor_flags_inv = HIDEFACE|HIDEFACIALHAIR|HIDESNOUT + alternate_worn_layer = LOW_FACEMASK_LAYER //This lets it layer below glasses and headsets; yes, that's below hair, but it already has HIDEHAIR w_class = WEIGHT_CLASS_SMALL actions_types = list(/datum/action/item_action/adjust) @@ -61,4 +62,5 @@ inhand_icon_state = "balaclava" flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT visor_flags_inv = HIDEFACE|HIDEFACIALHAIR|HIDESNOUT + alternate_worn_layer = LOW_FACEMASK_LAYER //This lets it layer below glasses and headsets; yes, that's below hair, but it already has HIDEHAIR w_class = WEIGHT_CLASS_SMALL diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 2cbd64d4a8448..a74d8bfca401c 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -26,10 +26,17 @@ GLOBAL_LIST_INIT(clown_mask_options, list( var/starting_filter_type = /obj/item/gas_filter ///Does the mask have an FOV? var/has_fov = TRUE - + ///Cigarette in the mask + var/obj/item/clothing/mask/cigarette/cig + voice_filter = "lowpass=f=750,volume=2" /datum/armor/mask_gas bio = 100 +/obj/item/clothing/mask/gas/worn_overlays(mutable_appearance/standing, isinhands) + . = ..() + if(!isinhands && cig) + . += cig.build_worn_icon(default_layer = FACEMASK_LAYER, default_icon_file = 'icons/mob/clothing/mask.dmi') + /obj/item/clothing/mask/gas/Initialize(mapload) . = ..() init_fov() @@ -45,15 +52,64 @@ GLOBAL_LIST_INIT(clown_mask_options, list( QDEL_LAZYLIST(gas_filters) return..() +/obj/item/clothing/mask/gas/equipped(mob/equipee, slot) + cig?.equipped(equipee, slot) + return ..() + +/obj/item/clothing/mask/gas/adjustmask(mob/living/carbon/user) + if(isnull(cig)) + return ..() + balloon_alert(user, "there's a cig in the way!") + + /obj/item/clothing/mask/gas/examine(mob/user) . = ..() - if(max_filters > 0) - . += "[src] has [max_filters] slot\s for filters." + if(cig) + . += span_notice("There is a [cig.name] jammed into the filter slot.") + if(max_filters > 0 && !cig) + . += span_notice("[src] has [max_filters] slot\s for filters.") if(LAZYLEN(gas_filters) > 0) - . += "Currently there [LAZYLEN(gas_filters) == 1 ? "is" : "are"] [LAZYLEN(gas_filters)] filter\s with [get_filter_durability()]% durability." - . += "The filters can be removed by right-clicking with an empty hand on [src]." + . += span_notice("Currently there [LAZYLEN(gas_filters) == 1 ? "is" : "are"] [LAZYLEN(gas_filters)] filter\s with [get_filter_durability()]% durability.") + . += span_notice("The filters can be removed by right-clicking with an empty hand on [src].") + +/obj/item/clothing/mask/gas/Exited(atom/movable/gone) + . = ..() + if(gone == cig) + cig = null + if(ismob(loc)) + var/mob/wearer = loc + wearer.update_worn_mask() /obj/item/clothing/mask/gas/attackby(obj/item/tool, mob/user) + var/valid_wearer = ismob(loc) + var/mob/wearer = loc + if(istype(tool, /obj/item/clothing/mask/cigarette)) + if(flags_cover & MASKCOVERSMOUTH) + balloon_alert(user, "mask's mouth is covered!") + return ..() + + if(max_filters <= 0 || cig) + balloon_alert(user, "can't hold that!") + return ..() + + if(has_filter) + balloon_alert(user, "filters in the mask!") + return ..() + + cig = tool + if(valid_wearer) + cig.equipped(loc, wearer.get_slot_by_item(cig)) + + cig.forceMove(src) + if(valid_wearer) + wearer.update_worn_mask() + return TRUE + + if(cig) + var/cig_attackby = cig.attackby(tool, user) + if(valid_wearer) + wearer.update_worn_mask() + return cig_attackby if(!istype(tool, /obj/item/gas_filter)) return ..() if(LAZYLEN(gas_filters) >= max_filters) @@ -65,6 +121,13 @@ GLOBAL_LIST_INIT(clown_mask_options, list( return TRUE /obj/item/clothing/mask/gas/attack_hand_secondary(mob/user, list/modifiers) + if(cig) + user.put_in_hands(cig) + cig = null + if(ismob(loc)) + var/mob/wearer = loc + wearer.update_worn_mask() + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN if(!has_filter || !max_filters) return SECONDARY_ATTACK_CONTINUE_CHAIN for(var/i in 1 to max_filters) @@ -164,7 +227,8 @@ GLOBAL_LIST_INIT(clown_mask_options, list( acid = 55 /obj/item/clothing/mask/gas/welding/attack_self(mob/user) - weldingvisortoggle(user) + if(weldingvisortoggle(user)) + playsound(src, 'sound/mecha/mechmove03.ogg', 50, TRUE) /obj/item/clothing/mask/gas/welding/up @@ -210,6 +274,7 @@ GLOBAL_LIST_INIT(clown_mask_options, list( dog_fashion = /datum/dog_fashion/head/clown has_fov = FALSE var/list/clownmask_designs = list() + voice_filter = null // performer masks expect to be talked through /obj/item/clothing/mask/gas/clown_hat/plasmaman starting_filter_type = /obj/item/gas_filter/plasmaman diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm index 668f4e1b50911..64de19b95aa17 100644 --- a/code/modules/clothing/masks/hailer.dm +++ b/code/modules/clothing/masks/hailer.dm @@ -48,7 +48,7 @@ GLOBAL_LIST_INIT(hailer_phrases, list( actions_types = list(/datum/action/item_action/halt, /datum/action/item_action/adjust) icon_state = "sechailer" inhand_icon_state = "sechailer" - clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS | GAS_FILTERING flags_inv = HIDEFACIALHAIR | HIDEFACE | HIDESNOUT w_class = WEIGHT_CLASS_SMALL visor_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS @@ -58,11 +58,18 @@ GLOBAL_LIST_INIT(hailer_phrases, list( tint = 0 has_fov = FALSE COOLDOWN_DECLARE(hailer_cooldown) + ///Decides the phrases available for use; defines used are the last index of a category of available phrases var/aggressiveness = AGGR_BAD_COP + ///Whether the hailer has been broken due to overuse or not + var/broken_hailer = FALSE + ///Whether the hailer is currently in cooldown for resetting recent_uses var/overuse_cooldown = FALSE + ///How many times was the hailer used in the last OVERUSE_COOLDOWN seconds var/recent_uses = 0 - var/broken_hailer = FALSE + ///Whether the hailer is emagged or not var/safety = TRUE + voice_filter = @{"[0:a] asetrate=%SAMPLE_RATE%*0.7,aresample=16000,atempo=1/0.7,lowshelf=g=-20:f=500,highpass=f=500,aphaser=in_gain=1:out_gain=1:delay=3.0:decay=0.4:speed=0.5:type=t [out]; [out]atempo=1.2,volume=15dB [final]; anoisesrc=a=0.01:d=60 [noise]; [final][noise] amix=duration=shortest"} + use_radio_beeps_tts = TRUE /obj/item/clothing/mask/gas/sechailer/plasmaman starting_filter_type = /obj/item/gas_filter/plasmaman @@ -97,10 +104,8 @@ GLOBAL_LIST_INIT(hailer_phrases, list( actions_types = list(/datum/action/item_action/halt) /obj/item/clothing/mask/gas/sechailer/screwdriver_act(mob/living/user, obj/item/I) - . = TRUE - if(..()) - return - else if (aggressiveness == AGGR_BROKEN) + . = ..() + if(aggressiveness == AGGR_BROKEN) to_chat(user, span_danger("You adjust the restrictor but nothing happens, probably because it's broken.")) return var/position = aggressiveness == AGGR_GOOD_COP ? "middle" : aggressiveness == AGGR_BAD_COP ? "last" : "first" @@ -108,11 +113,11 @@ GLOBAL_LIST_INIT(hailer_phrases, list( aggressiveness = aggressiveness % 3 + 1 // loop AGGR_GOOD_COP -> AGGR_SHIT_COP /obj/item/clothing/mask/gas/sechailer/wirecutter_act(mob/living/user, obj/item/I) - . = TRUE - ..() + . = ..() if(aggressiveness != AGGR_BROKEN) to_chat(user, span_danger("You broke the restrictor!")) aggressiveness = AGGR_BROKEN + return /obj/item/clothing/mask/gas/sechailer/ui_action_click(mob/user, action) if(istype(action, /datum/action/item_action/halt)) @@ -122,10 +127,13 @@ GLOBAL_LIST_INIT(hailer_phrases, list( /obj/item/clothing/mask/gas/sechailer/attack_self() halt() -/obj/item/clothing/mask/gas/sechailer/emag_act(mob/user) + +/obj/item/clothing/mask/gas/sechailer/emag_act(mob/user, obj/item/card/emag/emag_card) if(safety) safety = FALSE - to_chat(user, span_warning("You silently fry [src]'s vocal circuit.")) + balloon_alert(user, "vocal circuit fried") + return TRUE + return FALSE /obj/item/clothing/mask/gas/sechailer/verb/halt() set category = "Object" @@ -157,9 +165,8 @@ GLOBAL_LIST_INIT(hailer_phrases, list( // select phrase to play play_phrase(usr, GLOB.hailer_phrases[select_phrase()]) - /obj/item/clothing/mask/gas/sechailer/proc/select_phrase() - if (!safety) + if(!safety) return EMAG_PHRASE else var/upper_limit diff --git a/code/modules/clothing/masks/moustache.dm b/code/modules/clothing/masks/moustache.dm index ecfd5d5e00796..aaf59be51e4fd 100644 --- a/code/modules/clothing/masks/moustache.dm +++ b/code/modules/clothing/masks/moustache.dm @@ -2,6 +2,7 @@ name = "fake moustache" desc = "Warning: moustache is fake." icon_state = "fake-moustache" + alternate_worn_layer = ABOVE_BODY_FRONT_HEAD_LAYER w_class = WEIGHT_CLASS_TINY flags_inv = HIDEFACE species_exception = list(/datum/species/golem) diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index d8abfe4b1bd23..03da9cbffad29 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -17,6 +17,19 @@ if(GET_ATOM_BLOOD_DNA_LENGTH(src)) . += mutable_appearance('icons/effects/blood.dmi', "maskblood") +/obj/item/clothing/neck/bowtie + name = "bow tie" + desc = "A small neosilk bowtie." + icon = 'icons/obj/clothing/neck.dmi' + icon_state = "bowtie_greyscale" + inhand_icon_state = "" //no inhands + w_class = WEIGHT_CLASS_SMALL + custom_price = PAYCHECK_CREW + greyscale_config = /datum/greyscale_config/ties + greyscale_config_worn = /datum/greyscale_config/ties/worn + greyscale_colors = "#151516ff" + flags_1 = IS_PLAYER_COLORABLE_1 + /obj/item/clothing/neck/tie name = "slick tie" desc = "A neosilk tie." @@ -26,7 +39,7 @@ w_class = WEIGHT_CLASS_SMALL custom_price = PAYCHECK_CREW greyscale_config = /datum/greyscale_config/ties - greyscale_config_worn = /datum/greyscale_config/ties_worn + greyscale_config_worn = /datum/greyscale_config/ties/worn greyscale_colors = "#4d4e4e" flags_1 = IS_PLAYER_COLORABLE_1 /// All ties start untied unless otherwise specified @@ -185,26 +198,118 @@ var/mob/living/carbon/carbon_patient = M var/body_part = parse_zone(user.zone_selected) + var/oxy_loss = carbon_patient.getOxyLoss() - var/heart_strength = span_danger("no") - var/lung_strength = span_danger("no") + var/heart_strength + var/pulse_pressure var/obj/item/organ/internal/heart/heart = carbon_patient.get_organ_slot(ORGAN_SLOT_HEART) var/obj/item/organ/internal/lungs/lungs = carbon_patient.get_organ_slot(ORGAN_SLOT_LUNGS) - - if(carbon_patient.stat != DEAD && !(HAS_TRAIT(carbon_patient, TRAIT_FAKEDEATH))) - if(istype(heart)) - heart_strength = (heart.beating ? "a healthy" : span_danger("an unstable")) - if(istype(lungs)) - lung_strength = ((carbon_patient.failed_last_breath || carbon_patient.losebreath) ? span_danger("strained") : "healthy") - - user.visible_message(span_notice("[user] places [src] against [carbon_patient]'s [body_part] and listens attentively."), ignored_mobs = user) - - var/diagnosis = (body_part == BODY_ZONE_CHEST ? "You hear [heart_strength] pulse and [lung_strength] respiration" : "You faintly hear [heart_strength] pulse") - if(!user.can_hear()) - diagnosis = "Fat load of good it does you though, since you can't hear" - - to_chat(user, span_notice("You place [src] against [carbon_patient]'s [body_part]. [diagnosis].")) + var/obj/item/organ/internal/liver/liver = carbon_patient.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/appendix/appendix = carbon_patient.get_organ_slot(ORGAN_SLOT_APPENDIX) + + var/render_list = list()//information will be packaged in a list for clean display to the user + + //determine what specific action we're taking + switch (body_part) + if(BODY_ZONE_CHEST)//Listening to the chest + user.visible_message(span_notice("[user] places [src] against [carbon_patient]'s [body_part] and listens attentively."), ignored_mobs = user) + if(!user.can_hear()) + to_chat(user, span_notice("You place [src] against [carbon_patient]'s [body_part]. Fat load of good it does you though, since you can't hear")) + return + else + render_list += span_info("You place [src] against [carbon_patient]'s [body_part]:\n") + + //assess breathing + if(!lungs)//sanity check, enusure patient actually has lungs + render_list += "[M] doesn't have any lungs!\n" + else + if(carbon_patient.stat == DEAD || (HAS_TRAIT(carbon_patient, TRAIT_FAKEDEATH)) || (HAS_TRAIT(carbon_patient, TRAIT_NOBREATH))|| carbon_patient.failed_last_breath || carbon_patient.losebreath)//If pt is dead or otherwise not breathing + render_list += "[M.p_Theyre()] not breathing!\n" + else if(lungs.damage > 10)//if breathing, check for lung damage + render_list += "You hear fluid in [M.p_their()] lungs!\n" + else if(oxy_loss > 10)//if they have suffocation damage + render_list += "[M.p_Theyre()] breathing heavily!\n" + else + render_list += "[M.p_Theyre()] breathing normally.\n"//they're okay :D + + //assess heart + if(body_part == BODY_ZONE_CHEST)//if we're listening to the chest + if(!heart)//sanity check, ensure the patient actually has a heart + render_list += "[M] doesn't have a heart!\n" + else + if(!heart.beating || carbon_patient.stat == DEAD) + render_list += "You don't hear a heartbeat!\n"//they're dead or their heart isn't beating + else if(heart.damage > 10 || carbon_patient.blood_volume <= BLOOD_VOLUME_OKAY) + render_list += "You hear a weak heartbeat.\n"//their heart is damaged, or they have critical blood + else + render_list += "You hear a healthy heartbeat.\n"//they're okay :D + + if(BODY_ZONE_PRECISE_GROIN)//If we're targeting the groin + render_list += span_info("You carefully press down on [carbon_patient]'s abdomen:\n") + user.visible_message(span_notice("[user] presses their hands against [carbon_patient]'s abdomen."), ignored_mobs = user) + + //assess abdominal organs + if(body_part == BODY_ZONE_PRECISE_GROIN) + var/appendix_okay = TRUE + var/liver_okay = TRUE + if(!liver)//sanity check, ensure the patient actually has a liver + render_list += "[M] doesn't have a liver!\n" + liver_okay = FALSE + else + if(liver.damage > 10) + render_list += "[M.p_Their()] liver feels firm.\n"//their liver is damaged + liver_okay = FALSE + + if(!appendix)//sanity check, ensure the patient actually has an appendix + render_list += "[M] doesn't have an appendix!\n" + appendix_okay = FALSE + else + if(appendix.damage > 10 && carbon_patient.stat == CONSCIOUS) + render_list += "[M] screams when you lift your hand from [M.p_their()] appendix!\n"//scream if their appendix is damaged and they're awake + M.emote("scream") + appendix_okay = FALSE + + if(liver_okay && appendix_okay)//if they have all their organs and have no detectable damage + render_list += "You don't find anything abnormal.\n"//they're okay :D + + if(BODY_ZONE_PRECISE_EYES) + balloon_alert(user, "can't do that!") + return + + if(BODY_ZONE_PRECISE_MOUTH) + balloon_alert(user, "can't do that!") + return + + else//targeting an extremity or the head + if(body_part == BODY_ZONE_HEAD) + render_list += span_info("You carefully press your fingers to [carbon_patient]'s neck:\n") + user.visible_message(span_notice("[user] presses their fingers against [carbon_patient]'s neck."), ignored_mobs = user) + else + render_list += span_info("You carefully press your fingers to [carbon_patient]'s [body_part]:\n") + user.visible_message(span_notice("[user] presses their fingers against [carbon_patient]'s [body_part]."), ignored_mobs = user) + + //assess pulse (heart & blood level) + if(!heart)//sanity check, ensure the patient actually has a heart + render_list += "[M] doesn't have a heart!\n" + else + if(!heart.beating || carbon_patient.blood_volume <= BLOOD_VOLUME_OKAY || carbon_patient.stat == DEAD) + render_list += "You can't find a pulse!\n"//they're dead, their heart isn't beating, or they have critical blood + else + if(heart.damage > 10) + heart_strength = span_danger("irregular")//their heart is damaged + else + heart_strength = span_notice("regular")//they're okay :D + + if(carbon_patient.blood_volume <= BLOOD_VOLUME_SAFE && carbon_patient.blood_volume > BLOOD_VOLUME_OKAY) + pulse_pressure = span_danger("thready")//low blood + else + pulse_pressure = span_notice("strong")//they're okay :D + + render_list += "[M.p_Their()] pulse is [pulse_pressure] and [heart_strength].\n" + + //display our packaged information in an examine block for easy reading + to_chat(user, examine_block(jointext(render_list, "")), type = MESSAGE_TYPE_INFO) /////////// //SCARVES// @@ -213,14 +318,14 @@ /obj/item/clothing/neck/scarf name = "scarf" icon_state = "scarf" - icon_preview = 'icons/obj/previews.dmi' + icon_preview = 'icons/obj/fluff/previews.dmi' icon_state_preview = "scarf_cloth" 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 custom_price = PAYCHECK_CREW greyscale_colors = "#EEEEEE#EEEEEE" greyscale_config = /datum/greyscale_config/scarf - greyscale_config_worn = /datum/greyscale_config/scarf_worn + greyscale_config_worn = /datum/greyscale_config/scarf/worn flags_1 = IS_PLAYER_COLORABLE_1 /obj/item/clothing/neck/scarf/black @@ -273,8 +378,8 @@ w_class = WEIGHT_CLASS_TINY custom_price = PAYCHECK_CREW greyscale_colors = "#C6C6C6#EEEEEE" - greyscale_config = /datum/greyscale_config/large_scarf - greyscale_config_worn = /datum/greyscale_config/large_scarf_worn + greyscale_config = /datum/greyscale_config/scarf + greyscale_config_worn = /datum/greyscale_config/scarf/worn flags_1 = IS_PLAYER_COLORABLE_1 /obj/item/clothing/neck/large_scarf/red @@ -302,7 +407,7 @@ custom_price = PAYCHECK_CREW greyscale_colors = "#EEEEEE" greyscale_config = /datum/greyscale_config/infinity_scarf - greyscale_config_worn = /datum/greyscale_config/infinity_scarf_worn + greyscale_config_worn = /datum/greyscale_config/infinity_scarf/worn flags_1 = IS_PLAYER_COLORABLE_1 /obj/item/clothing/neck/petcollar @@ -315,7 +420,7 @@ fire = 50 acid = 40 -/obj/item/clothing/neck/petcollar/mob_can_equip(mob/M, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE, ignore_equipped = FALSE) +/obj/item/clothing/neck/petcollar/mob_can_equip(mob/M, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE, ignore_equipped = FALSE, indirect_action = FALSE) if(!ismonkey(M)) return FALSE return ..() diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index 779f07bd09639..5bedbb86fa8a9 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -150,9 +150,9 @@ id_trim = /datum/id_trim/centcom/official uniform = /obj/item/clothing/under/rank/centcom/official back = /obj/item/storage/backpack/satchel + box = /obj/item/storage/box/survival backpack_contents = list( /obj/item/stamp/centcom = 1, - /obj/item/storage/box/survival = 1, ) belt = /obj/item/gun/energy/e_gun ears = /obj/item/radio/headset/headset_cent @@ -168,8 +168,7 @@ return var/obj/item/modular_computer/pda/heads/pda = H.r_store - pda.saved_identification = H.real_name - pda.saved_job = "CentCom Official" + pda.imprint_id(H.real_name, "CentCom Official") var/obj/item/card/id/W = H.wear_id W.registered_name = H.real_name @@ -181,10 +180,8 @@ name = "Inquisition Commander" back = /obj/item/mod/control/pre_equipped/responsory/inquisitory/commander - r_hand = /obj/item/nullrod/scythe/talking/chainsword - backpack_contents = list( - /obj/item/storage/box/survival = 1, - ) + r_hand = /obj/item/nullrod/vibro/talking/chainsword + backpack_contents = null /datum/outfit/centcom/ert/security/inquisitor name = "Inquisition Security" @@ -296,16 +293,14 @@ id_trim = /datum/id_trim/centcom/intern uniform = /obj/item/clothing/under/rank/centcom/intern back = /obj/item/storage/backpack/satchel - backpack_contents = list( - /obj/item/storage/box/survival = 1, - ) + box = /obj/item/storage/box/survival belt = /obj/item/melee/baton ears = /obj/item/radio/headset/headset_cent glasses = /obj/item/clothing/glasses/sunglasses gloves = /obj/item/clothing/gloves/color/black shoes = /obj/item/clothing/shoes/sneakers/black - l_pocket = /obj/item/ammo_box/a762 - r_pocket = /obj/item/ammo_box/a762 + l_pocket = /obj/item/ammo_box/strilka310 + r_pocket = /obj/item/ammo_box/strilka310 l_hand = /obj/item/gun/ballistic/rifle/boltaction /datum/outfit/centcom/centcom_intern/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) @@ -537,3 +532,34 @@ belt = /obj/item/storage/belt/utility/full/powertools/rcd glasses = /obj/item/clothing/glasses/hud/diagnostic/sunglasses additional_radio = /obj/item/encryptionkey/heads/ce + +/datum/outfit/centcom/militia + name = "Militia Man" + + id = /obj/item/card/id/advanced/centcom/ert/militia + belt = /obj/item/storage/belt/holster/energy/smoothbore + suit = /obj/item/clothing/suit/armor/militia + suit_store = /obj/item/gun/energy/laser/musket + head = /obj/item/clothing/head/cowboy/black + uniform = /obj/item/clothing/under/rank/centcom/military + shoes = /obj/item/clothing/shoes/cowboy + gloves = /obj/item/clothing/gloves/combat + back = /obj/item/storage/backpack/satchel/leather + box = /obj/item/storage/box/survival + l_pocket = /obj/item/switchblade + r_pocket = /obj/item/reagent_containers/hypospray/medipen/salacid + ears = /obj/item/radio/headset + backpack_contents = list( + /obj/item/storage/medkit/emergency = 1, + /obj/item/crowbar = 1, + /obj/item/restraints/handcuffs = 1, + ) + +/datum/outfit/centcom/militia/general + name = "Militia General" + + id = /obj/item/card/id/advanced/centcom/ert/militia/general + belt = /obj/item/gun/energy/disabler/smoothbore/prime + head = /obj/item/clothing/head/beret/militia + l_hand = /obj/item/megaphone + suit_store = /obj/item/gun/energy/laser/musket/prime diff --git a/code/modules/clothing/outfits/event.dm b/code/modules/clothing/outfits/event.dm index df5442e6d1773..aa85bd795a37b 100644 --- a/code/modules/clothing/outfits/event.dm +++ b/code/modules/clothing/outfits/event.dm @@ -14,15 +14,15 @@ box = /obj/item/storage/box/survival/engineer -/datum/outfit/santa/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/santa/post_equip(mob/living/carbon/human/user, visualsOnly = FALSE) if(visualsOnly) return - H.fully_replace_character_name(H.real_name, "Santa Claus") - H.mind.set_assigned_role(SSjob.GetJobType(/datum/job/santa)) - H.mind.special_role = ROLE_SANTA + user.fully_replace_character_name(user.real_name, "Santa Claus") + user.mind.set_assigned_role(SSjob.GetJobType(/datum/job/santa)) + user.mind.special_role = ROLE_SANTA - H.hairstyle = "Long Hair 3" - H.facial_hairstyle = "Beard (Full)" - H.hair_color = "#FFFFFF" - H.facial_hair_color = "#FFFFFF" - H.update_body_parts() + user.hairstyle = "Long Hair 3" + user.facial_hairstyle = "Beard (Full)" + user.hair_color = "#FFFFFF" + user.facial_hair_color = "#FFFFFF" + user.update_body_parts(update_limb_data = TRUE) diff --git a/code/modules/clothing/outfits/plasmaman.dm b/code/modules/clothing/outfits/plasmaman.dm index daad81ea475b5..a422d2d736e92 100644 --- a/code/modules/clothing/outfits/plasmaman.dm +++ b/code/modules/clothing/outfits/plasmaman.dm @@ -281,3 +281,10 @@ gloves = /obj/item/clothing/gloves/color/plasmaman/clown head = /obj/item/clothing/head/helmet/space/plasmaman/clown mask = /obj/item/clothing/mask/gas/clown_hat/plasmaman + +/datum/outfit/plasmaman/bitrunner + name = "Bitrunner Plasmaman" + + uniform = /obj/item/clothing/under/plasmaman/bitrunner + gloves = /obj/item/clothing/gloves/color/plasmaman/black + head = /obj/item/clothing/head/helmet/space/plasmaman/bitrunner diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index 01ee43f4d298a..061fbe3a1decf 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -95,9 +95,7 @@ suit = /obj/item/clothing/suit/redtag suit_store = /obj/item/gun/energy/laser/redtag back = /obj/item/storage/backpack - backpack_contents = list( - /obj/item/storage/box = 1, -) + box = /obj/item/storage/box ears = /obj/item/radio/headset gloves = /obj/item/clothing/gloves/color/red head = /obj/item/clothing/head/helmet/redtaghelm @@ -177,7 +175,7 @@ l_hand = /obj/item/fireaxe /datum/outfit/psycho/post_equip(mob/living/carbon/human/H) - for(var/obj/item/carried_item in H.get_equipped_items(TRUE)) + for(var/obj/item/carried_item in H.get_equipped_items(include_pockets = TRUE, include_accessories = TRUE)) carried_item.add_mob_blood(H)//Oh yes, there will be blood... for(var/obj/item/I in H.held_items) I.add_mob_blood(H) @@ -188,7 +186,7 @@ id = /obj/item/card/id/advanced/chameleon/black id_trim = /datum/id_trim/reaper_assassin - uniform = /obj/item/clothing/under/suit/black + uniform = /obj/item/clothing/under/costume/buttondown/slacks/service neck = /obj/item/clothing/neck/tie/red/hitman/tied belt = /obj/item/modular_computer/pda/heads ears = /obj/item/radio/headset @@ -217,8 +215,7 @@ sec_briefcase.contents += new /obj/item/grenade/c4/x4 var/obj/item/modular_computer/pda/heads/pda = H.belt - pda.saved_identification = H.real_name - pda.saved_job = "Reaper" + pda.imprint_id(H.real_name, "Reaper") var/obj/item/card/id/W = H.wear_id W.registered_name = H.real_name diff --git a/code/modules/clothing/outfits/vr.dm b/code/modules/clothing/outfits/vr.dm index 5c3b38fb63e0c..fb618cd831b68 100644 --- a/code/modules/clothing/outfits/vr.dm +++ b/code/modules/clothing/outfits/vr.dm @@ -27,7 +27,7 @@ /datum/outfit/vr/syndicate/post_equip(mob/living/carbon/human/H) . = ..() var/obj/item/uplink/U = new /obj/item/uplink/nuclear_restricted(H, H.key, 80) - H.equip_to_slot_or_del(U, ITEM_SLOT_BACKPACK) + H.equip_to_slot_or_del(U, ITEM_SLOT_BACKPACK, indirect_action = TRUE) var/obj/item/implant/weapons_auth/W = new/obj/item/implant/weapons_auth(H) W.implant(H) var/obj/item/implant/explosive/E = new/obj/item/implant/explosive(H) diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index 9cc5187954fa1..5ffc8c5d67d2f 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -198,7 +198,7 @@ to_chat(our_guy, span_userdanger("You stamp on [user]'s hand! What the- [user.p_they()] [user.p_were()] [tied ? "knotting" : "untying"] your shoelaces!")) user.emote("scream") if(istype(L)) - var/obj/item/bodypart/ouchie = L.get_bodypart(pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) + var/obj/item/bodypart/ouchie = L.get_bodypart(pick(GLOB.arm_zones)) if(ouchie) ouchie.receive_damage(brute = 10) L.adjustStaminaLoss(40) @@ -278,3 +278,17 @@ if(do_after(user, lace_time, target = src,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/apply_fantasy_bonuses(bonus) + . = ..() + slowdown = modify_fantasy_variable("slowdown", slowdown, -bonus * 0.1, 0) + if(ismob(loc)) + var/mob/wearer = loc + wearer.update_equipment_speed_mods() + +/obj/item/clothing/shoes/remove_fantasy_bonuses(bonus) + slowdown = reset_fantasy_variable("slowdown", slowdown) + if(ismob(loc)) + var/mob/wearer = loc + wearer.update_equipment_speed_mods() + return ..() diff --git a/code/modules/clothing/shoes/bananashoes.dm b/code/modules/clothing/shoes/bananashoes.dm index 46e98db0a8cd9..75299ad828a41 100644 --- a/code/modules/clothing/shoes/bananashoes.dm +++ b/code/modules/clothing/shoes/bananashoes.dm @@ -13,16 +13,22 @@ var/material_per_banana =SMALL_MATERIAL_AMOUNT /// Typepath of created banana var/banana_type = /obj/item/grown/bananapeel/specialpeel + /// Material container for bananium + var/datum/component/material_container/bananium /obj/item/clothing/shoes/clown_shoes/banana_shoes/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_updates_onmob) - AddComponent(/datum/component/material_container, list(/datum/material/bananium), 100 * SHEET_MATERIAL_AMOUNT, MATCONTAINER_EXAMINE|MATCONTAINER_ANY_INTENT|MATCONTAINER_SILENT, allowed_items=/obj/item/stack) + bananium = AddComponent(/datum/component/material_container, list(/datum/material/bananium), 100 * SHEET_MATERIAL_AMOUNT, MATCONTAINER_EXAMINE|MATCONTAINER_ANY_INTENT|MATCONTAINER_SILENT, allowed_items=/obj/item/stack) AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 75, falloff_exponent = 20) RegisterSignal(src, COMSIG_SHOES_STEP_ACTION, PROC_REF(on_step)) if(always_noslip) LAZYOR(clothing_traits, TRAIT_NO_SLIP_WATER) +/obj/item/clothing/shoes/clown_shoes/banana_shoes/Destroy() + bananium = null + return ..() + /obj/item/clothing/shoes/clown_shoes/banana_shoes/proc/toggle_clowning_action() on = !on update_appearance() @@ -38,19 +44,17 @@ SIGNAL_HANDLER var/mob/wearer = loc - var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container) if(!on || !istype(wearer)) return if(bananium.use_amount_mat(material_per_banana, /datum/material/bananium)) - new banana_type(get_step(src, turn(wearer.dir, 180))) //honk + new banana_type(get_step(src, REVERSE_DIR(wearer.dir))) //honk return toggle_clowning_action() to_chat(wearer, span_warning("You ran out of bananium!")) /obj/item/clothing/shoes/clown_shoes/banana_shoes/attack_self(mob/user) - var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container) var/sheet_amount = bananium.retrieve_all() if(sheet_amount) to_chat(user, span_notice("You retrieve [sheet_amount] sheets of bananium from the prototype shoes.")) @@ -62,7 +66,6 @@ . += span_notice("The shoes are [on ? "enabled" : "disabled"].") /obj/item/clothing/shoes/clown_shoes/banana_shoes/ui_action_click(mob/user) - var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container) if(bananium.get_material_amount(/datum/material/bananium) >= material_per_banana) toggle_clowning_action() to_chat(user, span_notice("You [on ? "activate" : "deactivate"] the prototype shoes.")) diff --git a/code/modules/clothing/shoes/boots.dm b/code/modules/clothing/shoes/boots.dm index 4c3887fec67eb..b359f94db3da5 100644 --- a/code/modules/clothing/shoes/boots.dm +++ b/code/modules/clothing/shoes/boots.dm @@ -159,3 +159,25 @@ desc = "A crisp, clean set of boots for working long hours on the beat." icon_state = "aerostatic_boots" inhand_icon_state = null + +/obj/item/clothing/shoes/pirate + name = "pirate boots" + desc = "Yarr." + icon_state = "pirateboots" + inhand_icon_state = null + +/obj/item/clothing/shoes/pirate/armored + armor_type = /datum/armor/shoes_pirate + strip_delay = 40 + resistance_flags = NONE + lace_time = 12 SECONDS + +/datum/armor/shoes_pirate + melee = 25 + bullet = 25 + laser = 25 + energy = 25 + bomb = 50 + bio = 90 + fire = 70 + acid = 50 diff --git a/code/modules/clothing/shoes/costume.dm b/code/modules/clothing/shoes/costume.dm index ca16c5d6560dc..1a3e9b0b2beb7 100644 --- a/code/modules/clothing/shoes/costume.dm +++ b/code/modules/clothing/shoes/costume.dm @@ -71,6 +71,24 @@ desc = "t3h c00L3st sh03z j00'LL 3v3r f1nd." icon_state = "glow_shoes" inhand_icon_state = null + greyscale_colors = "#4A3A40#8EEEEE" + greyscale_config = /datum/greyscale_config/glow_shoes + greyscale_config_worn = /datum/greyscale_config/glow_shoes/worn + flags_1 = IS_PLAYER_COLORABLE_1 + +/obj/item/clothing/shoes/glow/Initialize(mapload) + . = ..() + AddElement(/datum/element/gags_recolorable) + update_icon(UPDATE_OVERLAYS) + +/obj/item/clothing/shoes/glow/worn_overlays(mutable_appearance/standing, isinhands, icon_file) + . = ..() + if(!isinhands) + . += emissive_appearance(DEFAULT_SHOES_FILE, "glow_shoes_emissive", src, alpha = src.alpha) + +/obj/item/clothing/shoes/glow/update_overlays() + . = ..() + . += emissive_appearance('icons/obj/clothing/shoes.dmi', "glow_shoes_emissive", offset_spokesman = src, alpha = src.alpha) /obj/item/clothing/shoes/jackbros name = "frosty boots" @@ -84,6 +102,17 @@ icon_state = "saints_shoes" inhand_icon_state = null +/obj/item/clothing/shoes/jester_shoes + name = "jester shoes" + desc = "Shoes that jingle with every step!!" + icon_state = "green_jester_shoes" + inhand_icon_state = null + +/obj/item/clothing/shoes/jester_shoes/Initialize(mapload) + . = ..() + + LoadComponent(/datum/component/squeak, list('sound/effects/jingle.ogg' = 1), 50, falloff_exponent = 20, step_delay_override = 0) + /obj/item/clothing/shoes/ducky_shoes name = "ducky shoes" desc = "I got boots, that go *quack quack quack quack quack." diff --git a/code/modules/clothing/shoes/cowboy.dm b/code/modules/clothing/shoes/cowboy.dm index e6f02264d3525..05792a72cbd96 100644 --- a/code/modules/clothing/shoes/cowboy.dm +++ b/code/modules/clothing/shoes/cowboy.dm @@ -17,7 +17,7 @@ if(prob(2)) //There's a snake in my boot - new /mob/living/simple_animal/hostile/retaliate/snake(src) + new /mob/living/basic/snake(src) /obj/item/clothing/shoes/cowboy/equipped(mob/living/carbon/user, slot) @@ -56,7 +56,7 @@ if(contents.len >= max_occupants) to_chat(user, span_warning("[src] are full!")) return - if(istype(target, /mob/living/simple_animal/hostile/retaliate/snake) || istype(target, /mob/living/basic/headslug) || islarva(target)) + if(istype(target, /mob/living/basic/snake) || istype(target, /mob/living/basic/headslug) || islarva(target)) target.forceMove(src) to_chat(user, span_notice("[target] slithers into [src].")) diff --git a/code/modules/clothing/shoes/sandals.dm b/code/modules/clothing/shoes/sandals.dm index f6c867bca7ae4..9c948e2fac88e 100644 --- a/code/modules/clothing/shoes/sandals.dm +++ b/code/modules/clothing/shoes/sandals.dm @@ -18,3 +18,7 @@ name = "magical sandals" desc = "A pair of sandals imbued with magic." resistance_flags = FIRE_PROOF | ACID_PROOF + +/obj/item/clothing/shoes/sandal/beach + name = "flip-flops" + desc = "A very fashionable pair of flip-flops." diff --git a/code/modules/clothing/shoes/sneakers.dm b/code/modules/clothing/shoes/sneakers.dm index e02388d1c9d4a..8d3d9f1764564 100644 --- a/code/modules/clothing/shoes/sneakers.dm +++ b/code/modules/clothing/shoes/sneakers.dm @@ -6,9 +6,9 @@ righthand_file = 'icons/mob/inhands/clothing/shoes_righthand.dmi' greyscale_colors = "#2d2d33#ffffff" greyscale_config = /datum/greyscale_config/sneakers - greyscale_config_worn = /datum/greyscale_config/sneakers_worn - greyscale_config_inhand_left = /datum/greyscale_config/sneakers_inhand_left - greyscale_config_inhand_right = /datum/greyscale_config/sneakers_inhand_right + greyscale_config_worn = /datum/greyscale_config/sneakers/worn + greyscale_config_inhand_left = /datum/greyscale_config/sneakers/inhand_left + greyscale_config_inhand_right = /datum/greyscale_config/sneakers/inhand_right flags_1 = IS_PLAYER_COLORABLE_1 /obj/item/clothing/shoes/sneakers/black @@ -54,7 +54,7 @@ /obj/item/clothing/shoes/sneakers/white name = "white shoes" greyscale_colors = "#ffffff#ffffff" - icon_preview = 'icons/obj/previews.dmi' + icon_preview = 'icons/obj/fluff/previews.dmi' icon_state_preview = "shoes_cloth" armor_type = /datum/armor/sneakers_white @@ -76,13 +76,13 @@ /obj/item/clothing/shoes/sneakers/orange name = "orange shoes" - icon_preview = 'icons/obj/previews.dmi' + icon_preview = 'icons/obj/fluff/previews.dmi' icon_state_preview = "prisonshoes" greyscale_colors = "#d15b1b#ffffff" greyscale_config = /datum/greyscale_config/sneakers_orange - greyscale_config_worn = /datum/greyscale_config/sneakers_orange_worn - greyscale_config_inhand_left = /datum/greyscale_config/sneakers_orange_inhand_left - greyscale_config_inhand_right = /datum/greyscale_config/sneakers_orange_inhand_right + greyscale_config_worn = /datum/greyscale_config/sneakers_orange/worn + greyscale_config_inhand_left = /datum/greyscale_config/sneakers_orange/inhand_left + greyscale_config_inhand_right = /datum/greyscale_config/sneakers_orange/inhand_right flags_1 = NONE var/obj/item/restraints/handcuffs/attached_cuffs @@ -90,11 +90,6 @@ . = ..() AddElement(/datum/element/update_icon_updates_onmob, ITEM_SLOT_HANDCUFFED) -/obj/item/clothing/shoes/sneakers/orange/handle_atom_del(atom/deleting_atom) - if(deleting_atom == attached_cuffs) - moveToNullspace(attached_cuffs) - return ..() - /obj/item/clothing/shoes/sneakers/orange/Destroy() QDEL_NULL(attached_cuffs) return ..() diff --git a/code/modules/clothing/shoes/wheelys.dm b/code/modules/clothing/shoes/wheelys.dm index 8d2e4c47e679f..9b67f14d14415 100644 --- a/code/modules/clothing/shoes/wheelys.dm +++ b/code/modules/clothing/shoes/wheelys.dm @@ -1,13 +1,13 @@ /obj/item/clothing/shoes/wheelys name = "Wheely-Heels" desc = "Uses patented retractable wheel technology. Never sacrifice speed for style - not that this provides much of either." //Thanks Fel + icon_state = "sneakers" worn_icon_state = "wheelys" + inhand_icon_state = "sneakers_back" greyscale_colors = "#545454#ffffff" - icon_state = "sneakers" greyscale_config = /datum/greyscale_config/sneakers_wheelys - inhand_icon_state = "sneakers_back" - greyscale_config_inhand_left = /datum/greyscale_config/sneakers_inhand_left - greyscale_config_inhand_right = /datum/greyscale_config/sneakers_inhand_right + greyscale_config_inhand_left = /datum/greyscale_config/sneakers/inhand_left + greyscale_config_inhand_right = /datum/greyscale_config/sneakers/inhand_right worn_icon = 'icons/mob/large-worn-icons/64x64/feet.dmi' worn_x_dimension = 64 worn_y_dimension = 64 diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index 2cede2562c29e..9d6e4fab815b7 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -9,7 +9,7 @@ icon_state = "spaceold" inhand_icon_state = "space_helmet" desc = "A special helmet with solar UV shielding to protect your eyes from harmful rays." - clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT | PLASMAMAN_HELMET_EXEMPT | HEADINTERNALS + clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT | STACKABLE_HELMET_EXEMPT | HEADINTERNALS armor_type = /datum/armor/helmet_space flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT @@ -134,11 +134,11 @@ return ..() // Clean up the cell on destroy -/obj/item/clothing/suit/space/handle_atom_del(atom/A) - if(A == cell) +/obj/item/clothing/suit/space/Exited(atom/movable/gone, direction) + . = ..() + if(gone == cell) cell = null thermal_on = FALSE - return ..() // support for items that interact with the cell /obj/item/clothing/suit/space/get_cell() @@ -254,12 +254,15 @@ toggle_spacesuit(user) // let emags override the temperature settings -/obj/item/clothing/suit/space/emag_act(mob/user) - if(!(obj_flags & EMAGGED)) - obj_flags |= EMAGGED - user.visible_message(span_warning("You emag [src], overwriting thermal regulator restrictions.")) +/obj/item/clothing/suit/space/emag_act(mob/user, obj/item/card/emag/emag_card) + if(obj_flags & EMAGGED) + return FALSE + obj_flags |= EMAGGED + if (user) + balloon_alert(user, "thermal regulator restrictions overridden") user.log_message("emagged [src], overwriting thermal regulator restrictions.", LOG_GAME) playsound(src, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + return TRUE // update the HUD icon /obj/item/clothing/suit/space/proc/update_hud_icon(mob/user) diff --git a/code/modules/clothing/spacesuits/pirate.dm b/code/modules/clothing/spacesuits/pirate.dm index 9dd5c215a9f26..34a495b4dbef8 100644 --- a/code/modules/clothing/spacesuits/pirate.dm +++ b/code/modules/clothing/spacesuits/pirate.dm @@ -19,7 +19,6 @@ /obj/item/clothing/head/helmet/space/pirate/bandana icon_state = "spacebandana" - inhand_icon_state = "space_bandana_helmet" /obj/item/clothing/suit/space/pirate name = "modified EVA suit" diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index ebd4358ede1ac..30e43c793aacf 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -44,7 +44,7 @@ desc = "A special containment helmet that allows plasma-based lifeforms to exist safely in an oxygenated environment. It is space-worthy, and may be worn in tandem with other EVA gear." icon = 'icons/obj/clothing/head/plasmaman_hats.dmi' worn_icon = 'icons/mob/clothing/head/plasmaman_head.dmi' - clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT | PLASMAMAN_HELMET_EXEMPT | PLASMAMAN_PREVENT_IGNITION | HEADINTERNALS + clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT | STACKABLE_HELMET_EXEMPT | PLASMAMAN_PREVENT_IGNITION | HEADINTERNALS icon_state = "plasmaman-helm" inhand_icon_state = "plasmaman-helm" strip_delay = 80 @@ -126,7 +126,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) @@ -303,14 +303,17 @@ 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 = null - armor_type = /datum/armor/plasmaman_engineering + armor_type = /datum/armor/space_plasmaman/engineering_atmos + +/datum/armor/space_plasmaman/engineering_atmos + acid = 95 /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 = null - armor_type = /datum/armor/plasmaman_atmospherics + armor_type = /datum/armor/space_plasmaman/engineering_atmos max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT // Same protection as the Atmospherics Hardhat /obj/item/clothing/head/helmet/space/plasmaman/chief_engineer @@ -318,10 +321,9 @@ 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 = null - armor_type = /datum/armor/plasmaman_chief_engineer + armor_type = /datum/armor/space_plasmaman/engineering_atmos max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT // Same protection as the Atmospherics Hardhat - /obj/item/clothing/head/helmet/space/plasmaman/cargo name = "cargo plasma envirosuit helmet" desc = "A plasmaman envirohelmet designed for cargo techs and quartermasters." @@ -383,24 +385,45 @@ visor_icon = "clown_envisor" smile_state = "clown_smile" +/obj/item/clothing/head/helmet/space/plasmaman/clown/Initialize(mapload) + . = ..() + AddElement(/datum/element/swabable, CELL_LINE_TABLE_CLOWN, CELL_VIRUS_TABLE_GENERIC, rand(2,3), 0) + /obj/item/clothing/head/helmet/space/plasmaman/head_of_personnel name = "head of personnel's envirosuit helmet" desc = "A special containment helmet designed for the Head of Personnel. Embarrassingly enough, it looks way too much like the captain's design save for the red stripes." icon_state = "hop_envirohelm" inhand_icon_state = null + armor_type = /datum/armor/hats_hopcap/plasmaman + +/datum/armor/hats_hopcap/plasmaman + bio = 100 + fire = 100 + acid = 75 /obj/item/clothing/head/helmet/space/plasmaman/captain name = "captain's plasma envirosuit helmet" 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 = null - armor_type = /datum/armor/plasmaman_captain + armor_type = /datum/armor/hats_caphat/plasmaman + +/datum/armor/hats_caphat/plasmaman + bio = 100 + fire = 100 + acid = 75 /obj/item/clothing/head/helmet/space/plasmaman/centcom_commander name = "CentCom commander plasma envirosuit helmet" desc = "A special containment helmet designed for the Higher Central Command Staff. Not many of these exist, as CentCom does not usually employ plasmamen to higher staff positions due to their complications." icon_state = "commander_envirohelm" inhand_icon_state = null + armor_type = /datum/armor/hats_centhat/plasmaman + +/datum/armor/hats_centhat/plasmaman + bio = 100 + fire = 100 + acid = 75 /obj/item/clothing/head/helmet/space/plasmaman/centcom_official name = "CentCom official plasma envirosuit helmet" @@ -413,3 +436,15 @@ desc = "A special containment helmet designed for CentCom Staff. You know, so any coffee spills don't kill the poor sod." icon_state = "intern_envirohelm" inhand_icon_state = null + +/obj/item/clothing/head/helmet/space/plasmaman/syndie + name = "tacticool envirosuit helmet" + desc = "There's no doubt about it, this helmet puts you above ALL of the other plasmamen. If you see another plasmaman wearing a helmet like this, it's either because they're a fellow badass, \ + or they've murdered one of your fellow badasses and have taken it from them as a trophy. Either way, anyone wearing this deserves at least a cursory nod of respect." + icon_state = "syndie_envirohelm" + inhand_icon_state = null + +/obj/item/clothing/head/helmet/space/plasmaman/bitrunner + name = "bitrunner's plasma envirosuit helmet" + desc = "An envirohelmet with extended blue light filters for bitrunning plasmamen." + icon_state = "bitrunner_envirohelm" diff --git a/code/modules/clothing/spacesuits/specialops.dm b/code/modules/clothing/spacesuits/specialops.dm index 77c49c96d3aeb..3634066e72fd4 100644 --- a/code/modules/clothing/spacesuits/specialops.dm +++ b/code/modules/clothing/spacesuits/specialops.dm @@ -6,7 +6,7 @@ icon_state = "beret_badge" inhand_icon_state = null greyscale_colors = "#397F3F#FFCE5B" - + clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT flags_inv = 0 armor_type = /datum/armor/space_beret strip_delay = 130 diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm index f44f8d4cf5b9f..17ac11f76ece4 100644 --- a/code/modules/clothing/suits/_suits.dm +++ b/code/modules/clothing/suits/_suits.dm @@ -8,6 +8,7 @@ /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/tank/jetpack/oxygen/captain, + /obj/item/storage/belt/holster, ) armor_type = /datum/armor/none drop_sound = 'sound/items/handling/cloth_drop.ogg' @@ -30,14 +31,16 @@ if(GET_ATOM_BLOOD_DNA_LENGTH(src)) . += mutable_appearance('icons/effects/blood.dmi', "[blood_overlay_type]blood") - var/mob/living/carbon/human/M = loc - if(!ishuman(M) || !M.w_uniform) + var/mob/living/carbon/human/wearer = loc + if(!ishuman(wearer) || !wearer.w_uniform) return - var/obj/item/clothing/under/U = M.w_uniform - if(istype(U) && U.attached_accessory) - var/obj/item/clothing/accessory/A = U.attached_accessory - if(A.above_suit) - . += U.accessory_overlay + var/obj/item/clothing/under/undershirt = wearer.w_uniform + if(!istype(undershirt) || !LAZYLEN(undershirt.attached_accessories)) + return + + var/obj/item/clothing/accessory/displayed = undershirt.attached_accessories[1] + if(displayed.above_suit) + . += undershirt.accessory_overlay /obj/item/clothing/suit/update_clothes_damaged_state(damaged_state = CLOTHING_DAMAGED) ..() diff --git a/code/modules/clothing/suits/ablativecoat.dm b/code/modules/clothing/suits/ablativecoat.dm index 98df168aa563b..8bc37aaba22b7 100644 --- a/code/modules/clothing/suits/ablativecoat.dm +++ b/code/modules/clothing/suits/ablativecoat.dm @@ -4,6 +4,7 @@ worn_icon = 'icons/mob/clothing/head/helmet.dmi' desc = "Hood hopefully belonging to an ablative trenchcoat. Includes a visor for cool-o-vision." icon_state = "ablativehood" + flags_inv = HIDEHAIR|HIDEEARS armor_type = /datum/armor/hooded_ablative strip_delay = 30 var/hit_reflect_chance = 50 @@ -46,22 +47,18 @@ if (prob(hit_reflect_chance)) return TRUE -/obj/item/clothing/suit/hooded/ablative/ToggleHood() +/obj/item/clothing/suit/hooded/ablative/on_hood_up(obj/item/clothing/head/hooded/hood) . = ..() - if (!hood_up) - return 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.show_to(user) - balloon_alert(user, "you put on the hood, and enable the hud") + balloon_alert(user, "hud enabled") -/obj/item/clothing/suit/hooded/ablative/RemoveHood() - if (!hood_up) - return ..() +/obj/item/clothing/suit/hooded/ablative/on_hood_down(obj/item/clothing/head/hooded/hood) var/mob/living/carbon/user = loc var/datum/atom_hud/sec_hud = GLOB.huds[DATA_HUD_SECURITY_ADVANCED] REMOVE_TRAIT(user, TRAIT_SECURITY_HUD, HELMET_TRAIT) sec_hud.hide_from(user) - balloon_alert(user, "you take off the hood, and disable the hud") + balloon_alert(user, "hud disabled") return ..() diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index ce0035bec0cb4..5ea493d4198f4 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -1,4 +1,5 @@ /obj/item/clothing/suit/armor + name = "armor" icon = 'icons/obj/clothing/suits/armor.dmi' worn_icon = 'icons/mob/clothing/suits/armor.dmi' allowed = null @@ -28,6 +29,20 @@ if(!allowed) allowed = GLOB.security_vest_allowed +/obj/item/clothing/suit/armor/apply_fantasy_bonuses(bonus) + . = ..() + slowdown = modify_fantasy_variable("slowdown", slowdown, -bonus * 0.1, 0) + if(ismob(loc)) + var/mob/wearer = loc + wearer.update_equipment_speed_mods() + +/obj/item/clothing/suit/armor/remove_fantasy_bonuses(bonus) + slowdown = reset_fantasy_variable("slowdown", slowdown) + if(ismob(loc)) + var/mob/wearer = loc + wearer.update_equipment_speed_mods() + return ..() + /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." @@ -68,6 +83,16 @@ acid = 50 wound = 20 +/datum/armor/pmc + melee = 40 + bullet = 50 + laser = 60 + energy = 50 + bomb = 50 + bio = 100 + acid = 50 + wound = 20 + /obj/item/clothing/suit/armor/vest/marine/security name = "large tactical armor vest" icon_state = "marine_security" @@ -81,6 +106,14 @@ icon_state = "marine_medic" body_parts_covered = CHEST|GROIN +/obj/item/clothing/suit/armor/vest/marine/pmc + desc = "A set of the finest mass produced, stamped plasteel armor plates, for an all-around door-kicking and ass-smashing. Its stellar survivability making up is for it's lack of space worthiness" + min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT + max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT + clothing_flags = THICKMATERIAL + w_class = WEIGHT_CLASS_BULKY + armor_type = /datum/armor/pmc + /obj/item/clothing/suit/armor/vest/old name = "degrading armor vest" desc = "Older generation Type 1 armored vest. Due to degradation over time the vest is far less maneuverable to move in." @@ -561,3 +594,23 @@ inhand_icon_state = "b_suit" body_parts_covered = CHEST|GROIN|ARMS dog_fashion = null + +/obj/item/clothing/suit/armor/militia + name = "station defender's coat" + desc = "A well worn uniform used by militia across the frontier, it's thick padding useful for cushioning blows." + icon_state = "militia" + inhand_icon_state = "b_suit" + body_parts_covered = CHEST|GROIN|ARMS + cold_protection = CHEST|GROIN|ARMS + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + armor_type = /datum/armor/coat_militia + +/datum/armor/coat_militia + melee = 40 + bullet = 40 + laser = 30 + energy = 25 + bomb = 50 + fire = 40 + acid = 50 + wound = 30 diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index ffbef12d1ef7e..4ddfd31631d5c 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -6,7 +6,7 @@ worn_icon = 'icons/mob/clothing/head/bio.dmi' icon_state = "bio" inhand_icon_state = "bio_hood" - clothing_flags = THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | SNUG_FIT | PLASMAMAN_HELMET_EXEMPT | HEADINTERNALS + clothing_flags = THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | SNUG_FIT | STACKABLE_HELMET_EXEMPT | HEADINTERNALS armor_type = /datum/armor/head_bio_hood flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDEFACE|HIDESNOUT resistance_flags = ACID_PROOF diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm index b061d4cb29881..5d31ee29e4adf 100644 --- a/code/modules/clothing/suits/cloaks.dm +++ b/code/modules/clothing/suits/cloaks.dm @@ -55,31 +55,12 @@ /obj/item/clothing/neck/cloak/skill_reward var/associated_skill_path = /datum/skill + var/element_type = /datum/element/skill_reward resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE -/obj/item/clothing/neck/cloak/skill_reward/examine(mob/user) +/obj/item/clothing/neck/cloak/skill_reward/Initialize(mapload) . = ..() - . += span_notice("You notice a powerful aura about this cloak, suggesting that only the truly experienced may wield it.") - -/obj/item/clothing/neck/cloak/skill_reward/proc/check_wearable(mob/user) - return user.mind?.get_skill_level(associated_skill_path) >= SKILL_LEVEL_LEGENDARY - -/obj/item/clothing/neck/cloak/skill_reward/proc/unworthy_unequip(mob/user) - to_chat(user, span_warning("You feel completely and utterly unworthy to even touch \the [src].")) - var/hand_index = user.get_held_index_of_item(src) - if (hand_index) - user.dropItemToGround(src, TRUE) - return FALSE - -/obj/item/clothing/neck/cloak/skill_reward/equipped(mob/user, slot) - if (!check_wearable(user)) - unworthy_unequip(user) - return ..() - -/obj/item/clothing/neck/cloak/skill_reward/attack_hand(mob/user, list/modifiers) - if (!check_wearable(user)) - unworthy_unequip(user) - return ..() + AddElement(element_type, associated_skill_path) /obj/item/clothing/neck/cloak/skill_reward/gaming name = "legendary gamer's cloak" @@ -103,6 +84,5 @@ 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." icon_state = "playercloak" + element_type = /datum/element/skill_reward/veteran -/obj/item/clothing/neck/cloak/skill_reward/playing/check_wearable(mob/user) - return user.client?.is_veteran() diff --git a/code/modules/clothing/suits/costume.dm b/code/modules/clothing/suits/costume.dm index 87fa1697ef9f3..4976e05dcb184 100644 --- a/code/modules/clothing/suits/costume.dm +++ b/code/modules/clothing/suits/costume.dm @@ -42,7 +42,7 @@ icon_state = "hgpirate" inhand_icon_state = null -/obj/item/clothing/suit/costume/pirate/armored +/obj/item/clothing/suit/costume/pirate/captain/armored armor_type = /datum/armor/pirate_armored strip_delay = 40 equip_delay_other = 20 @@ -84,21 +84,6 @@ body_parts_covered = CHEST|GROIN|LEGS|ARMS allowed = list(/obj/item/storage/fancy/cigarettes, /obj/item/stack/spacecash) -/obj/item/clothing/suit/apron/overalls - name = "coveralls" - desc = "A set of denim overalls." - icon_state = "overalls" - inhand_icon_state = "overalls" - body_parts_covered = CHEST|GROIN|LEGS - species_exception = list(/datum/species/golem) - -/obj/item/clothing/suit/apron/purple_bartender - name = "purple bartender apron" - desc = "A fancy purple apron for a stylish person." - icon_state = "purplebartenderapron" - inhand_icon_state = null - body_parts_covered = CHEST|GROIN - /obj/item/clothing/suit/syndicatefake name = "black and red space suit replica" icon_state = "syndicate-black-red" @@ -304,7 +289,7 @@ 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 @@ -533,7 +518,7 @@ icon_state = "football_armor" body_parts_covered = CHEST|GROIN|LEGS|ARMS greyscale_config = /datum/greyscale_config/football_armor - greyscale_config_worn = /datum/greyscale_config/football_armor_worn + greyscale_config_worn = /datum/greyscale_config/football_armor/worn greyscale_colors = "#D74722" flags_1 = IS_PLAYER_COLORABLE_1 @@ -579,3 +564,11 @@ inhand_icon_state = null body_parts_covered = CHEST|GROIN|LEGS|ARMS supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON + +/obj/item/clothing/suit/costume/irs + name = "internal revenue service jacket" + desc = "I'm crazy enough to take on The Owl, but the IRS? Nooo thank you!" + icon_state = "irs_suit" + inhand_icon_state = null + body_parts_covered = CHEST|GROIN|LEGS|ARMS + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON diff --git a/code/modules/clothing/suits/ethereal.dm b/code/modules/clothing/suits/ethereal.dm index f0e8ec1928657..6c53329a13e7d 100644 --- a/code/modules/clothing/suits/ethereal.dm +++ b/code/modules/clothing/suits/ethereal.dm @@ -5,7 +5,7 @@ icon_state = "eth_raincoat" worn_icon = 'icons/mob/clothing/suits/ethereal.dmi' greyscale_config = /datum/greyscale_config/eth_raincoat - greyscale_config_worn = /datum/greyscale_config/eth_raincoat_worn + greyscale_config_worn = /datum/greyscale_config/eth_raincoat/worn greyscale_colors = "#4e7cc7" flags_1 = IS_PLAYER_COLORABLE_1 body_parts_covered = CHEST|GROIN|ARMS diff --git a/code/modules/clothing/suits/jacket.dm b/code/modules/clothing/suits/jacket.dm index cc5909d41c5a9..6db889032c064 100644 --- a/code/modules/clothing/suits/jacket.dm +++ b/code/modules/clothing/suits/jacket.dm @@ -1,7 +1,16 @@ /obj/item/clothing/suit/jacket icon = 'icons/obj/clothing/suits/jacket.dmi' worn_icon = 'icons/mob/clothing/suits/jacket.dmi' - 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/radio) + 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/radio, + /obj/item/storage/belt/holster, + ) body_parts_covered = CHEST|GROIN|ARMS cold_protection = CHEST|GROIN|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT @@ -14,7 +23,7 @@ icon = 'icons/obj/clothing/suits/jacket.dmi' worn_icon = 'icons/mob/clothing/suits/jacket.dmi' greyscale_config = /datum/greyscale_config/sweater - greyscale_config_worn = /datum/greyscale_config/sweater_worn + greyscale_config_worn = /datum/greyscale_config/sweater/worn greyscale_colors = "#414344" flags_1 = IS_PLAYER_COLORABLE_1 @@ -23,7 +32,7 @@ desc = "An oversized jacket." icon_state = "jacket_oversized" greyscale_config = /datum/greyscale_config/jacket_oversized - greyscale_config_worn = /datum/greyscale_config/jacket_oversized_worn + greyscale_config_worn = /datum/greyscale_config/jacket_oversized/worn greyscale_colors = "#414344" flags_1 = IS_PLAYER_COLORABLE_1 @@ -36,7 +45,7 @@ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON greyscale_config = /datum/greyscale_config/fancy_coat - greyscale_config_worn = /datum/greyscale_config/fancy_coat_worn + greyscale_config_worn = /datum/greyscale_config/fancy_coat/worn greyscale_colors = "#EDE3DC#414344" flags_1 = IS_PLAYER_COLORABLE_1 diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index fb05df7e26d38..3ed9be8cb1da3 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -40,6 +40,18 @@ inhand_icon_state = null body_parts_covered = CHEST|GROIN|LEGS +/obj/item/clothing/suit/apron/overalls + name = "coveralls" + desc = "A set of overalls, good for protecting thinner clothes from the elements." + icon_state = "overalls" + inhand_icon_state = "" + body_parts_covered = CHEST|GROIN|LEGS + species_exception = list(/datum/species/golem) + greyscale_config = /datum/greyscale_config/overalls + greyscale_config_worn = /datum/greyscale_config/overalls/worn + greyscale_colors = "#313c6e" + flags_1 = IS_PLAYER_COLORABLE_1 + //Captain /obj/item/clothing/suit/jacket/capjacket name = "captain's parade jacket" @@ -173,8 +185,8 @@ //Lawyer /obj/item/clothing/suit/toggle/lawyer - name = "blue suit jacket" - desc = "A snappy dress jacket." + name = "blue formal suit jacket" + desc = "A professional suit jacket." icon_state = "suitjacket_blue" icon = 'icons/obj/clothing/suits/jacket.dmi' worn_icon = 'icons/mob/clothing/suits/jacket.dmi' @@ -184,17 +196,55 @@ species_exception = list(/datum/species/golem) /obj/item/clothing/suit/toggle/lawyer/purple - name = "purple suit jacket" - desc = "A foppish dress jacket." + name = "purple formal suit jacket" icon_state = "suitjacket_purp" inhand_icon_state = null /obj/item/clothing/suit/toggle/lawyer/black - name = "black suit jacket" - desc = "A professional suit jacket." + name = "black formal suit jacket" icon_state = "suitjacket_black" inhand_icon_state = "ro_suit" +// Cargo + +/obj/item/clothing/suit/toggle/cargo_tech + name = "cargo gorka" + desc = "A brown and black puffy jacket; made from synthetic fabric. Inspired by old Eastern European designs." + icon_state = "cargo_jacket" + icon = 'icons/obj/clothing/suits/jacket.dmi' + worn_icon = 'icons/mob/clothing/suits/jacket.dmi' + inhand_icon_state = null + blood_overlay_type = "coat" + body_parts_covered = CHEST|ARMS + allowed = list( + /obj/item/stamp, + /obj/item/storage/bag/mail, + /obj/item/universal_scanner, + ) + +// Quartermaster + +/obj/item/clothing/suit/jacket/quartermaster + name = "quartermaster's overcoat" + desc = "A luxury, brown double-breasted overcoat made from kangaroo skin. It's gold cuffs are linked and styled on the credits symbol. It makes you feel more important than you probably are." + icon_state = "qm_coat" + blood_overlay_type = "coat" + body_parts_covered = CHEST|GROIN|LEGS|ARMS + allowed = list( + /obj/item/stamp, + /obj/item/storage/bag/mail, + /obj/item/universal_scanner, + ) + +/obj/item/clothing/suit/toggle/lawyer/greyscale + name = "formal suit jacket" + icon_state = "jacket_lawyer" + inhand_icon_state = "" + greyscale_config = /datum/greyscale_config/jacket_lawyer + greyscale_config_worn = /datum/greyscale_config/jacket_lawyer/worn + greyscale_colors = "#ffffff" + flags_1 = IS_PLAYER_COLORABLE_1 + //Mime /obj/item/clothing/suit/toggle/suspenders name = "suspenders" @@ -295,7 +345,6 @@ cold_protection = CHEST|ARMS heat_protection = CHEST|ARMS -//Robotocist /datum/armor/jacket_curator melee = 25 bullet = 10 @@ -303,6 +352,7 @@ energy = 35 acid = 45 +//Robotocist /obj/item/clothing/suit/hooded/techpriest name = "techpriest robes" desc = "For those who REALLY love their toasters." @@ -340,3 +390,35 @@ /obj/item/clothing/suit/jacket/research_director/Initialize(mapload) . = ..() allowed += /obj/item/storage/bag/xeno + +// Atmos +/obj/item/clothing/suit/atmos_overalls + name = "atmospherics overalls" + desc = "A set of fireproof overalls, good for protecting thinner clothes from gas leaks." + icon = 'icons/obj/clothing/suits/utility.dmi' + worn_icon = 'icons/mob/clothing/suits/utility.dmi' + icon_state = "atmos_overalls" + inhand_icon_state = "" + body_parts_covered = CHEST|GROIN|LEGS + resistance_flags = FIRE_PROOF + armor_type = /datum/armor/atmos_overalls + species_exception = list(/datum/species/golem) + allowed = list( + /obj/item/analyzer, + /obj/item/construction/rcd, + /obj/item/fireaxe/metal_h2_axe, + /obj/item/pipe_dispenser, + /obj/item/storage/bag/construction, + /obj/item/t_scanner, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/tank/internals/plasmaman, + ) + +/datum/armor/atmos_overalls + fire = 100 + acid = 50 + +/obj/item/clothing/suit/atmos_overalls/worn_overlays(mutable_appearance/standing, isinhands, icon_file) + . = ..() + if(!isinhands) + . += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha) diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index 86819ed23655f..3ded96e52a39f 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -91,7 +91,10 @@ /obj/item/clothing/suit/toggle/labcoat/coroner/Initialize(mapload) . = ..() - allowed += /obj/item/autopsy_scanner + allowed += list( + /obj/item/autopsy_scanner, + /obj/item/scythe, + ) /obj/item/clothing/suit/toggle/labcoat/science name = "scientist labcoat" diff --git a/code/modules/clothing/suits/moth.dm b/code/modules/clothing/suits/moth.dm index a3e789daa2453..dd0a7f016ac17 100644 --- a/code/modules/clothing/suits/moth.dm +++ b/code/modules/clothing/suits/moth.dm @@ -3,7 +3,7 @@ desc = "This peculiar utility harness is a common sight among the moth fleet's crews due to its ability to fasten the wings to the body without impacting mobility inside cramped ship interiors. It looks somewhat crude yet it's surprisingly comfortable." icon_state = "mothcoat" greyscale_config = /datum/greyscale_config/mothcoat - greyscale_config_worn = /datum/greyscale_config/mothcoat_worn + greyscale_config_worn = /datum/greyscale_config/mothcoat/worn greyscale_colors = "#eaeaea" flags_1 = IS_PLAYER_COLORABLE_1 flags_inv = HIDEMUTWINGS @@ -24,7 +24,7 @@ desc = "A thick garment that keeps warm and protects those precious wings from harsh weather, also commonly used during festivities. Feels much heavier than it looks." icon_state = "mothcoat_winter" greyscale_config = /datum/greyscale_config/mothcoat_winter - greyscale_config_worn = /datum/greyscale_config/mothcoat_winter_worn + greyscale_config_worn = /datum/greyscale_config/mothcoat_winter/worn greyscale_colors = "#557979#795e55" body_parts_covered = CHEST|GROIN|ARMS|LEGS cold_protection = CHEST|GROIN|ARMS|LEGS diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm index 9537fa7b6ef82..6c33e287f033a 100644 --- a/code/modules/clothing/suits/reactive_armour.dm +++ b/code/modules/clothing/suits/reactive_armour.dm @@ -226,7 +226,7 @@ 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 + var/zap_power = 1e7 /// How far to the zaps we give off go? var/zap_range = 20 /// What flags do we pass to the zaps we give off? diff --git a/code/modules/clothing/suits/shirt.dm b/code/modules/clothing/suits/shirt.dm index b2c2e9057fbac..e291250a580a6 100644 --- a/code/modules/clothing/suits/shirt.dm +++ b/code/modules/clothing/suits/shirt.dm @@ -1,13 +1,17 @@ -/obj/item/clothing/suit/costume/ianshirt - name = "worn shirt" - 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" +/obj/item/clothing/suit/costume/wellworn_shirt + name = "well-worn shirt" + desc = "A worn out, curiously comfortable t-shirt. 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 = "wellworn_shirt" inhand_icon_state = null + greyscale_config = /datum/greyscale_config/wellworn_shirt + greyscale_config_worn = /datum/greyscale_config/wellworn_shirt/worn + greyscale_colors = "#FFFFFF" species_exception = list(/datum/species/golem) + flags_1 = IS_PLAYER_COLORABLE_1 ///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 -/obj/item/clothing/suit/costume/ianshirt/machine_wash(obj/machinery/washing_machine/washer) +/obj/item/clothing/suit/costume/wellworn_shirt/machine_wash(obj/machinery/washing_machine/washer) . = ..() if(wash_count <= 5) transform *= TRANSFORM_USING_VARIABLE(0.8, 1) @@ -17,9 +21,60 @@ washer.visible_message("[src] implodes due to repeated washing.") qdel(src) -/obj/item/clothing/suit/costume/nerdshirt +/obj/item/clothing/suit/costume/wellworn_shirt/graphic + name = "well-worn graphic shirt" + desc = "A worn out, curiously comfortable t-shirt with a character from Phanic the Weasel on the front. It adds some charm points to itself and the wearer, and reminds you of when the series was still good; way back in 2500." + icon_state = "wellworn_shirt_gamer" + greyscale_colors = "#FFFFFF#46B45B" + greyscale_config = /datum/greyscale_config/wellworn_shirt_graphic + greyscale_config_worn = /datum/greyscale_config/wellworn_shirt_graphic/worn + +/obj/item/clothing/suit/costume/wellworn_shirt/graphic/ian + name = "well-worn ian shirt" + desc = "A worn out, curiously comfortable t-shirt with a picture of Ian the Corgi. 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 = "wellworn_shirt_ian" + greyscale_colors = "#FFFFFF#E1B26C" + +/obj/item/clothing/suit/costume/wellworn_shirt/wornout + name = "worn-out shirt" + desc = "A pretty grubby, yet still comfortable t-shirt. You've been sleeping in this one for a bit too long." + icon_state = "wornout_shirt" + +/obj/item/clothing/suit/costume/wellworn_shirt/wornout/graphic + name = "worn-out graphic shirt" + desc = "A pretty grubby, yet still comfortable t-shirt with a character from Phanic the Weasel on the front. The slightly raggedy nature recalls that one horrid title where they made him a vampire. You should get cheevos for sleeping in it this many days straight." + icon_state = "wornout_shirt_gamer" + greyscale_colors = "#FFFFFF#46B45B" + greyscale_config = /datum/greyscale_config/wornout_shirt_graphic + greyscale_config_worn = /datum/greyscale_config/wornout_shirt_graphic/worn + +/obj/item/clothing/suit/costume/wellworn_shirt/wornout/graphic/ian + name = "worn-out ian shirt" + desc = "A pretty grubby, yet still comfortable t-shirt with a picture of Ian the Corgi. It's gone past 'a bit worn' to 'well-loved;' excellent for use as pajamas." + icon_state = "wornout_shirt_ian" + greyscale_colors = "#FFFFFF#E1B26C" + +/obj/item/clothing/suit/costume/wellworn_shirt/messy + name = "messy worn-out shirt" + desc = "This worn-out, somehow comfortable t-shirt has reached a more thorough understanding of grime; maybe the fact that it's still gone unwashed could function as a sort of camo?" + icon_state = "messyworn_shirt" + +/obj/item/clothing/suit/costume/wellworn_shirt/messy/graphic + name = "messy graphic shirt" + desc = "This worn-out, somehow comfortable t-shirt has reached a more thorough understanding of grime. Normies will never understand that this is a collector's item, and your sense of fashion absolutely mogs theirs. Phanic Phorever." + icon_state = "messyworn_shirt_gamer" + greyscale_colors = "#FFFFFF#46B45B" + greyscale_config = /datum/greyscale_config/messyworn_shirt_graphic + greyscale_config_worn = /datum/greyscale_config/messyworn_shirt_graphic/worn + +/obj/item/clothing/suit/costume/wellworn_shirt/messy/graphic/ian + name = "messy ian shirt" + desc = "This worn-out, somehow comfortable t-shirt has reached a more thorough understanding of grime. You get the feeling like you understand how it's like to be a stray dog, yet Ian's face still comforts you." + icon_state = "messyworn_shirt_ian" + greyscale_colors = "#FFFFFF#E1B26C" + +/obj/item/clothing/suit/costume/wellworn_shirt/messy/graphic/gamer name = "gamer shirt" - desc = "A baggy shirt with vintage game character Phanic the Weasel. Why would anyone wear this?" - icon_state = "nerdshirt" - inhand_icon_state = null - species_exception = list(/datum/species/golem) + desc = "A baggy, extremely well-used shirt with vintage game character Phanic the Weasel far-too-boldly displayed on the chest. Your mind cannot hope to withstand the assault of remembering the Phanic Phanart you've seen; let alone the stench of this top." + icon_state = "messyworn_shirt_gamer" + greyscale_colors = "#FFFFFF#46B45B" diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index 75d684333d331..1040bc03120d1 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -1,124 +1,61 @@ -//Hoods for winter coats and chaplain hoodie etc - +/// Subtype with support for hoods +/// You no longer actually need to extend this and can just add the component yourself without a lot of this boilerplate code /obj/item/clothing/suit/hooded - actions_types = list(/datum/action/item_action/toggle_hood) - var/obj/item/clothing/head/hooded/hood var/hoodtype = /obj/item/clothing/head/hooded/winterhood //so the chaplain hoodie or other hoodies can override this - ///Alternative mode for hiding the hood, instead of storing the hood in the suit it qdels it, useful for when you deal with hooded suit with storage. + /// Alternative mode for hiding the hood, instead of storing the hood in the suit it qdels it, useful for when you deal with hooded suit with storage. var/alternative_mode = FALSE - ///Whether the hood is flipped up - var/hood_up = FALSE /// What should be added to the end of the icon state when the hood is up? Set to "" for the suit sprite to not change at all var/hood_up_affix = "_t" - /// Are we zipped? Mostly relevant for wintercoats, leaving this here to simplify logic and so someone else can extend it if they ever wish to. - var/zipped = FALSE + /// Icon state added as a worn overlay while the hood is down, leave as "" for no overlay + var/hood_down_overlay_suffix = "" + /// Reference to hood object, if it exists + var/obj/item/clothing/head/hooded/hood /obj/item/clothing/suit/hooded/Initialize(mapload) . = ..() - if(!alternative_mode) - MakeHood() - + if (!hoodtype) + return + AddComponent(\ + /datum/component/toggle_attached_clothing,\ + deployable_type = hoodtype,\ + equipped_slot = ITEM_SLOT_HEAD,\ + action_name = "Toggle Hood",\ + destroy_on_removal = alternative_mode,\ + parent_icon_state_suffix = hood_up_affix,\ + down_overlay_state_suffix = hood_down_overlay_suffix, \ + pre_creation_check = CALLBACK(src, PROC_REF(can_create_hood)),\ + on_created = CALLBACK(src, PROC_REF(on_hood_created)),\ + on_deployed = CALLBACK(src, PROC_REF(on_hood_up)),\ + on_removed = CALLBACK(src, PROC_REF(on_hood_down)),\ + ) /obj/item/clothing/suit/hooded/Destroy() - . = ..() - QDEL_NULL(hood) - -/obj/item/clothing/suit/hooded/proc/MakeHood() - if(!hood) - var/obj/item/clothing/head/hooded/W = new hoodtype(src) - W.suit = src - hood = W - -/obj/item/clothing/suit/hooded/ui_action_click() - ToggleHood() - -/obj/item/clothing/suit/hooded/item_action_slot_check(slot, mob/user) - if(slot & (ITEM_SLOT_OCLOTHING|ITEM_SLOT_NECK)) - return TRUE - -/obj/item/clothing/suit/hooded/equipped(mob/user, slot) - if(!(slot & (ITEM_SLOT_OCLOTHING|ITEM_SLOT_NECK))) - RemoveHood() - return ..() - -/obj/item/clothing/suit/hooded/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot) - if(visuals_only) - MakeHood() - ToggleHood() - -/obj/item/clothing/suit/hooded/proc/RemoveHood() - icon_state = "[initial(icon_state)]" - worn_icon_state = icon_state - zipped = FALSE - hood_up = FALSE - - if(hood) - if(ishuman(hood.loc)) - var/mob/living/carbon/human/H = hood.loc - H.transferItemToLoc(hood, src, TRUE) - H.update_worn_oversuit() - else - hood.forceMove(src) - - if(alternative_mode) - QDEL_NULL(hood) - - update_item_action_buttons() - -/obj/item/clothing/suit/hooded/dropped() - ..() - RemoveHood() - -/obj/item/clothing/suit/hooded/proc/ToggleHood() - if(!hood_up) - if(!ishuman(loc)) - return - var/mob/living/carbon/human/H = loc - if(H.is_holding(src)) - to_chat(H, span_warning("You must be wearing [src] to put up the hood!")) - return - if(H.head) - to_chat(H, span_warning("You're already wearing something on your head!")) - return - else - if(alternative_mode) - MakeHood() - if(!H.equip_to_slot_if_possible(hood,ITEM_SLOT_HEAD,0,0,1)) - if(alternative_mode) - RemoveHood() - return - hood_up = TRUE - icon_state = "[initial(icon_state)][hood_up_affix]" - worn_icon_state = icon_state - zipped = TRUE // Just to maintain the same behavior, and so we avoid any bugs that otherwise relied on this behavior of zipping the jacket when bringing up the hood - H.update_worn_oversuit() - H.update_mob_action_buttons() - else - RemoveHood() - -/obj/item/clothing/head/hooded - var/obj/item/clothing/suit/hooded/suit - - -/obj/item/clothing/head/hooded/Destroy() - suit = null + hood = null return ..() -/obj/item/clothing/head/hooded/dropped() - ..() - if(suit) - suit.RemoveHood() - -/obj/item/clothing/head/hooded/equipped(mob/user, slot) - ..() - if(!(slot & ITEM_SLOT_HEAD)) - if(suit) - suit.RemoveHood() - else - qdel(src) - -// Toggle exosuits for different aesthetic styles (hoodies, suit jacket buttons, etc) -// Pretty much just a holder for `/datum/component/toggle_icon`. +/// Override to only create the hood conditionally +/obj/item/clothing/suit/hooded/proc/can_create_hood() + return TRUE + +/// Called when the hood is instantiated +/obj/item/clothing/suit/hooded/proc/on_hood_created(obj/item/clothing/head/hooded/hood) + SHOULD_CALL_PARENT(TRUE) + src.hood = hood + RegisterSignal(hood, COMSIG_QDELETING, PROC_REF(on_hood_deleted)) + +/// Called when hood is deleted +/obj/item/clothing/suit/hooded/proc/on_hood_deleted() + SIGNAL_HANDLER + SHOULD_CALL_PARENT(TRUE) + hood = null + +/// Called when the hood is worn +/obj/item/clothing/suit/hooded/proc/on_hood_up(obj/item/clothing/head/hooded/hood) + return + +/// Called when the hood is hidden +/obj/item/clothing/suit/hooded/proc/on_hood_down(obj/item/clothing/head/hooded/hood) + return /obj/item/clothing/suit/toggle /// The noun that is displayed to the user on toggle. EX: "Toggles the suit's [buttons]". diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index 90f510bcde0b0..c867349f6564a 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -104,6 +104,7 @@ laser = 20 energy = 30 bomb = 100 + bio = 50 fire = 80 acid = 50 diff --git a/code/modules/clothing/suits/wintercoats.dm b/code/modules/clothing/suits/wintercoats.dm index 841ccb9d42a1d..7ade6df6f7c37 100644 --- a/code/modules/clothing/suits/wintercoats.dm +++ b/code/modules/clothing/suits/wintercoats.dm @@ -11,8 +11,9 @@ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT allowed = list() armor_type = /datum/armor/hooded_wintercoat - /// The mutable_appearance of the associated hood, when it's down. Can be null when the hood is up. - var/mutable_appearance/hood_overlay + hood_down_overlay_suffix = "_hood" + /// How snug are we? + var/zipped = FALSE /datum/armor/hooded_wintercoat bio = 10 @@ -31,8 +32,14 @@ /obj/item/toy, ) - generate_hood_overlay() +/obj/item/clothing/suit/hooded/wintercoat/on_hood_up(obj/item/clothing/head/hooded/hood) + . = ..() + zipped = TRUE +/// Called when the hood is hidden +/obj/item/clothing/suit/hooded/wintercoat/on_hood_down(obj/item/clothing/head/hooded/hood) + . = ..() + zipped = FALSE /obj/item/clothing/suit/hooded/wintercoat/examine(mob/user) . = ..() @@ -54,19 +61,6 @@ var/mob/living/carbon/human/wearer = loc wearer.update_worn_oversuit() - -/// Helper proc to generate the `hood_overlay` associated to the wintercoat. -/obj/item/clothing/suit/hooded/wintercoat/proc/generate_hood_overlay() - hood_overlay = mutable_appearance(initial(worn_icon), "[initial(icon_state)]_hood", -SUIT_LAYER) - - -/obj/item/clothing/suit/hooded/wintercoat/worn_overlays(mutable_appearance/standing, isinhands) - . = ..() - - if(!isinhands && !hood_up) - . += hood_overlay - - /obj/item/clothing/head/hooded/winterhood name = "winter hood" desc = "A cozy winter hood attached to a heavy winter jacket." @@ -209,6 +203,7 @@ armor_type = /datum/armor/wintercoat_hop allowed = list( /obj/item/melee/baton/telescopic, + /obj/item/stamp, ) hoodtype = /obj/item/clothing/head/hooded/winterhood/hop @@ -252,8 +247,10 @@ icon_state = "coatjanitor" inhand_icon_state = null allowed = list( + /obj/item/access_key, /obj/item/grenade/chem_grenade, /obj/item/holosign_creator, + /obj/item/key/janitor, /obj/item/reagent_containers/cup/beaker, /obj/item/reagent_containers/cup/bottle, /obj/item/reagent_containers/cup/tube, @@ -388,7 +385,10 @@ /obj/item/clothing/suit/hooded/wintercoat/medical/coroner/Initialize(mapload) . = ..() - allowed += /obj/item/autopsy_scanner + allowed += list( + /obj/item/autopsy_scanner, + /obj/item/scythe, + ) /obj/item/clothing/head/hooded/winterhood/medical/coroner desc = "A white winter coat hood." @@ -588,7 +588,11 @@ icon_state = "coatcargo" inhand_icon_state = "coatcargo" hoodtype = /obj/item/clothing/head/hooded/winterhood/cargo - allowed = list(/obj/item/storage/bag/mail) + allowed = list( + /obj/item/storage/bag/mail, + /obj/item/stamp, + /obj/item/universal_scanner, + ) /obj/item/clothing/head/hooded/winterhood/cargo desc = "A grey hood for a winter coat." @@ -644,6 +648,7 @@ /obj/item/clothing/suit/hooded/wintercoat/custom name = "tailored winter coat" desc = "A heavy jacket made from 'synthetic' animal furs, with custom colors." + hood_down_overlay_suffix = "" greyscale_colors = "#ffffff#ffffff#808080#808080#808080#808080" greyscale_config = /datum/greyscale_config/winter_coats greyscale_config_worn = /datum/greyscale_config/winter_coats/worn @@ -653,13 +658,15 @@ //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) . = ..() - if(hood) - var/list/coat_colors = SSgreyscale.ParseColorString(greyscale_colors) - var/list/new_coat_colors = coat_colors.Copy(1,4) - hood.set_greyscale(new_coat_colors) //Adopt the suit's grayscale coloring for visual clarity. + if(!hood) + return + var/list/coat_colors = SSgreyscale.ParseColorString(greyscale_colors) + var/list/new_coat_colors = coat_colors.Copy(1,4) + hood.set_greyscale(new_coat_colors) //Adopt the suit's grayscale coloring for visual clarity. + hood.update_slot_icon() //But also keep old method in case the hood is (re-)created later -/obj/item/clothing/suit/hooded/wintercoat/custom/MakeHood() +/obj/item/clothing/suit/hooded/wintercoat/custom/on_hood_created(obj/item/clothing/head/hooded/hood) . = ..() var/list/coat_colors = (SSgreyscale.ParseColorString(greyscale_colors)) var/list/new_coat_colors = coat_colors.Copy(1,4) diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index a802c3ad4bf6f..eb1ccb3c51092 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -55,7 +55,7 @@ icon_state = "witch_hat" greyscale_colors = "#343640#e0cab8#e0cab8" greyscale_config = /datum/greyscale_config/witch_hat - greyscale_config_worn = /datum/greyscale_config/witch_hat_worn + greyscale_config_worn = /datum/greyscale_config/witch_hat/worn flags_1 = IS_PLAYER_COLORABLE_1 dog_fashion = null @@ -66,7 +66,7 @@ inhand_icon_state = "tapehat" dog_fashion = null worn_y_offset = 6 - body_parts_covered = HEAD|HAIR + body_parts_covered = HEAD //this used to also cover HAIR, but that was never valid code as HAIR is not actually a body_part define! flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR /obj/item/clothing/head/wizard/magus @@ -220,7 +220,7 @@ 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)) + var/mob/living/M = new /mob/living/basic/stickman/lesser(get_turf(usr)) M.faction += list("[REF(usr)]") robe_charge = FALSE sleep(3 SECONDS) diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index df27303be829c..45152f7569ae5 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -11,15 +11,35 @@ drop_sound = 'sound/items/handling/cloth_drop.ogg' pickup_sound = 'sound/items/handling/cloth_pickup.ogg' limb_integrity = 30 + + /// Has this undersuit been freshly laundered and, as such, imparts a mood bonus for wearing + var/freshly_laundered = FALSE + + // Alt style handling + /// Can this suit be adjustd up or down to an alt style + var/can_adjust = TRUE + /// If adjusted what style are we currently using? + var/adjusted = NORMAL_STYLE + /// For adjusted/rolled-down jumpsuits. FALSE = exposes chest and arms, TRUE = exposes arms only + var/alt_covers_chest = FALSE /// The variable containing the flags for how the woman uniform cropping is supposed to interact with the sprite. var/female_sprite_flags = FEMALE_UNIFORM_FULL - var/has_sensor = HAS_SENSORS // For the crew computer + + // Sensor handling + /// Does this undersuit have suit sensors in general + var/has_sensor = HAS_SENSORS + /// Does this undersuit spawn with a random sensor value var/random_sensor = TRUE + /// What is the active sensor mode of this udnersuit var/sensor_mode = NO_SENSORS - var/can_adjust = TRUE - var/adjusted = NORMAL_STYLE - var/alt_covers_chest = FALSE // for adjusted/rolled-down jumpsuits, FALSE = exposes chest and arms, TRUE = exposes arms only - var/obj/item/clothing/accessory/attached_accessory + + // Accessory handling (Can be componentized eventually) + /// The max number of accessories we can have on this suit. + var/max_number_of_accessories = 5 + /// A list of all accessories attached to us. + var/list/obj/item/clothing/accessory/attached_accessories + /// The overlay of the accessory we're demonstrating. Only index 1 will show up. + /// This is the overlay on the MOB, not the item itself. var/mutable_appearance/accessory_overlay /datum/armor/clothing_under @@ -32,32 +52,32 @@ //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) register_context() + AddElement(/datum/element/update_icon_updates_onmob, flags = ITEM_SLOT_ICLOTHING|ITEM_SLOT_OCLOTHING, body = TRUE) /obj/item/clothing/under/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) - var/screentip_change = FALSE + . = NONE if(isnull(held_item) && has_sensor == HAS_SENSORS) context[SCREENTIP_CONTEXT_RMB] = "Toggle suit sensors" - screentip_change = TRUE + . = CONTEXTUAL_SCREENTIP_SET + + if(istype(held_item, /obj/item/clothing/accessory) && length(attached_accessories) < max_number_of_accessories) + context[SCREENTIP_CONTEXT_LMB] = "Attach accessory" + . = CONTEXTUAL_SCREENTIP_SET - if(istype(held_item, /obj/item/clothing/accessory) && !attached_accessory) - var/obj/item/clothing/accessory/accessory = held_item - if(accessory.can_attach_accessory(src, user)) - context[SCREENTIP_CONTEXT_LMB] = "Attach accessory" - screentip_change = TRUE + if(LAZYLEN(attached_accessories)) + context[SCREENTIP_CONTEXT_ALT_RMB] = "Remove accessory" + . = CONTEXTUAL_SCREENTIP_SET if(istype(held_item, /obj/item/stack/cable_coil) && has_sensor == BROKEN_SENSORS) context[SCREENTIP_CONTEXT_LMB] = "Repair suit sensors" - screentip_change = TRUE + . = CONTEXTUAL_SCREENTIP_SET - if(attached_accessory) - context[SCREENTIP_CONTEXT_ALT_LMB] = "Remove accessory" - screentip_change = TRUE - else if(can_adjust) - context[SCREENTIP_CONTEXT_ALT_LMB] = adjusted == ALT_STYLE ? "Wear normally" : "Wear casually" - screentip_change = TRUE + if(can_adjust && adjusted != DIGITIGRADE_STYLE) + context[SCREENTIP_CONTEXT_ALT_LMB] = "Wear [adjusted == ALT_STYLE ? "normally" : "casually"]" + . = CONTEXTUAL_SCREENTIP_SET - return screentip_change ? CONTEXTUAL_SCREENTIP_SET : NONE + return . /obj/item/clothing/under/worn_overlays(mutable_appearance/standing, isinhands = FALSE) . = ..() @@ -71,15 +91,18 @@ if(accessory_overlay) . += accessory_overlay -/obj/item/clothing/under/attackby(obj/item/I, mob/user, params) - if((has_sensor == BROKEN_SENSORS) && istype(I, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/C = I - C.use(1) +/obj/item/clothing/under/attackby(obj/item/attacking_item, mob/user, params) + if(has_sensor == BROKEN_SENSORS && istype(attacking_item, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/cabling = attacking_item + to_chat(user, span_notice("You repair the suit sensors on [src] with [cabling].")) + cabling.use(1) has_sensor = HAS_SENSORS - to_chat(user,span_notice("You repair the suit sensors on [src] with [C].")) return TRUE - if(!attach_accessory(I, user)) - return ..() + + if(istype(attacking_item, /obj/item/clothing/accessory)) + return attach_accessory(attacking_item, user) + + return ..() /obj/item/clothing/under/attack_hand_secondary(mob/user, params) . = ..() @@ -90,65 +113,53 @@ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /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) has_sensor = HAS_SENSORS + update_appearance() /obj/item/clothing/under/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) return - if(has_sensor > NO_SENSORS) - if(severity <= EMP_HEAVY) - has_sensor = BROKEN_SENSORS - if(ismob(loc)) - 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) - if(ismob(loc)) - var/mob/M = loc - to_chat(M,span_warning("The sensors on the [src] change rapidly!")) - if(ishuman(loc)) - var/mob/living/carbon/human/ooman = loc - if(ooman.w_uniform == src) - ooman.update_suit_sensors() + if(has_sensor == NO_SENSORS || has_sensor == BROKEN_SENSORS) + return + + if(severity <= EMP_HEAVY) + has_sensor = BROKEN_SENSORS + if(ismob(loc)) + 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) + if(ismob(loc)) + var/mob/M = loc + to_chat(M,span_warning("The sensors on the [src] change rapidly!")) + + if(ishuman(loc)) + var/mob/living/carbon/human/ooman = loc + if(ooman.w_uniform == src) + ooman.update_suit_sensors() /obj/item/clothing/under/visual_equipped(mob/user, slot) - ..() - if(adjusted) - adjusted = NORMAL_STYLE - female_sprite_flags = initial(female_sprite_flags) - if(!alt_covers_chest) - body_parts_covered |= CHEST + . = ..() + if(adjusted == ALT_STYLE) + adjust_to_normal() if((supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION) && ishuman(user)) - var/mob/living/carbon/human/H = user - if(H.dna.species.bodytype & BODYTYPE_DIGITIGRADE) + var/mob/living/carbon/human/wearer = user + if(wearer.bodytype & BODYTYPE_DIGITIGRADE) adjusted = DIGITIGRADE_STYLE - H.update_worn_undersuit() - - 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() - -/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() + update_appearance() + +/obj/item/clothing/under/equipped(mob/living/user, slot) ..() + if((slot & ITEM_SLOT_ICLOTHING) && freshly_laundered) + freshly_laundered = FALSE + user.add_mood_event("fresh_laundry", /datum/mood_event/fresh_laundry) /mob/living/carbon/human/update_suit_sensors() . = ..() @@ -164,78 +175,102 @@ /mob/living/carbon/human/dummy/update_sensor_list() return -/obj/item/clothing/under/proc/attach_accessory(obj/item/tool, mob/user, notifyAttach = 1) - . = FALSE - if(!istype(tool, /obj/item/clothing/accessory)) - return - var/obj/item/clothing/accessory/accessory = tool - if(attached_accessory) - if(user) - to_chat(user, span_warning("[src] already has an accessory.")) - return +// End suit sensor handling - if(!accessory.can_attach_accessory(src, user)) //Make sure the suit has a place to put the accessory. +/// Attach the passed accessory to the clothing item +/obj/item/clothing/under/proc/attach_accessory(obj/item/clothing/accessory/accessory, mob/living/user, attach_message = TRUE) + if(!istype(accessory)) + return + if(!accessory.can_attach_accessory(src, user)) return if(user && !user.temporarilyRemoveItemFromInventory(accessory)) return if(!accessory.attach(src, user)) return - . = TRUE - if(user && notifyAttach) - to_chat(user, span_notice("You attach [accessory] to [src].")) + LAZYADD(attached_accessories, accessory) + accessory.forceMove(src) + // Allow for accessories to react to the acccessory list now + accessory.successful_attach(src) + + if(user && attach_message) + balloon_alert(user, "accessory attached") - var/accessory_color = attached_accessory.icon_state - accessory_overlay = mutable_appearance(attached_accessory.worn_icon, "[accessory_color]") - accessory_overlay.alpha = attached_accessory.alpha - accessory_overlay.color = attached_accessory.color + if(isnull(accessory_overlay)) + create_accessory_overlay() update_appearance() - if(!ishuman(loc)) - return + return TRUE - var/mob/living/carbon/human/holder = loc - holder.update_worn_undersuit() - holder.update_worn_oversuit() - holder.fan_hud_set_fandom() +/// Removes (pops) the topmost accessory from the accessories list and puts it in the user's hands if supplied +/obj/item/clothing/under/proc/pop_accessory(mob/living/user, attach_message = TRUE) + var/obj/item/clothing/accessory/popped_accessory = attached_accessories[1] + remove_accessory(popped_accessory) -/obj/item/clothing/under/proc/remove_accessory(mob/user) - . = FALSE - if(!isliving(user)) - return - if(!can_use(user)) + if(!user) return - if(!attached_accessory) - return + user.put_in_hands(popped_accessory) + if(attach_message) + popped_accessory.balloon_alert(user, "accessory removed") - . = TRUE - var/obj/item/clothing/accessory/accessory = attached_accessory - attached_accessory.detach(src, user) - if(user.put_in_hands(accessory)) - to_chat(user, span_notice("You detach [accessory] from [src].")) - else - to_chat(user, span_notice("You detach [accessory] from [src] and it falls on the floor.")) +/// Removes the passed accesory from our accessories list +/obj/item/clothing/under/proc/remove_accessory(obj/item/clothing/accessory/removed) + if(removed == attached_accessories[1]) + accessory_overlay = null + + // Remove it from the list before detaching + LAZYREMOVE(attached_accessories, removed) + removed.detach(src) + + if(isnull(accessory_overlay) && LAZYLEN(attached_accessories)) + create_accessory_overlay() update_appearance() - if(!ishuman(loc)) + +/// Handles creating the worn overlay mutable appearance +/// Only the first accessory attached is displayed (currently) +/obj/item/clothing/under/proc/create_accessory_overlay() + var/obj/item/clothing/accessory/prime_accessory = attached_accessories[1] + accessory_overlay = mutable_appearance(prime_accessory.worn_icon, prime_accessory.icon_state) + accessory_overlay.alpha = prime_accessory.alpha + accessory_overlay.color = prime_accessory.color + +/// Updates the accessory's worn overlay mutable appearance +/obj/item/clothing/under/proc/update_accessory_overlay() + if(isnull(accessory_overlay)) return - var/mob/living/carbon/human/holder = loc - holder.update_worn_undersuit() - holder.update_worn_oversuit() - holder.fan_hud_set_fandom() + cut_overlay(accessory_overlay) + create_accessory_overlay() + update_appearance() // so we update the suit inventory overlay too + +/obj/item/clothing/under/Exited(atom/movable/gone, direction) + . = ..() + // If one of our accessories was moved out, handle it + if(gone in attached_accessories) + remove_accessory(gone) + +/// Helper to remove all attachments to the passed location +/obj/item/clothing/under/proc/dump_attachments(atom/drop_to = drop_location()) + for(var/obj/item/clothing/accessory/worn_accessory as anything in attached_accessories) + remove_accessory(worn_accessory) + worn_accessory.forceMove(drop_to) + +/obj/item/clothing/under/atom_destruction(damage_flag) + dump_attachments() + return ..() +/obj/item/clothing/under/Destroy() + QDEL_LAZYLIST(attached_accessories) + return ..() /obj/item/clothing/under/examine(mob/user) . = ..() if(can_adjust) - if(adjusted == ALT_STYLE) - . += "Alt-click on [src] to wear it normally." - else - . += "Alt-click on [src] to wear it casually." - if (has_sensor == BROKEN_SENSORS) - . += "Its sensors appear to be shorted out." + . += "Alt-click on [src] to wear it [adjusted == ALT_STYLE ? "normally" : "casually"]." + if(has_sensor == BROKEN_SENSORS) + . += "Its sensors appear to be shorted out. You could repair it with some cabling." else if(has_sensor > NO_SENSORS) switch(sensor_mode) if(SENSOR_OFF) @@ -246,48 +281,34 @@ . += "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." + if(LAZYLEN(attached_accessories)) + var/list/accessories = list_accessories_with_icon(user) + . += "It has [english_list(accessories)] attached." + . += "Alt-Right-Click to remove [attached_accessories[1]]." + +/// Helper to list out all accessories with an icon besides it, for use in examine +/obj/item/clothing/under/proc/list_accessories_with_icon(mob/user) + var/list/all_accessories = list() + for(var/obj/item/clothing/accessory/attached as anything in attached_accessories) + all_accessories += attached.get_examine_string(user) + + return all_accessories /obj/item/clothing/under/verb/toggle() set name = "Adjust Suit Sensors" set category = "Object" set src in usr var/mob/user_mob = usr - if (isdead(user_mob)) - return - if (!can_use(user_mob)) - return - if(has_sensor == LOCKED_SENSORS) - to_chat(user_mob, "The controls are locked.") - return - if(has_sensor == BROKEN_SENSORS) - to_chat(user_mob, "The sensors have shorted out!") - return - if(has_sensor <= NO_SENSORS) - to_chat(user_mob, "This suit does not have any sensors.") + if(!can_toggle_sensors(user_mob)) return var/list/modes = list("Off", "Binary vitals", "Exact vitals", "Tracking beacon") var/switchMode = tgui_input_list(user_mob, "Select a sensor mode", "Suit Sensors", modes, modes[sensor_mode + 1]) if(isnull(switchMode)) return - - if (!can_use(user_mob)) //make sure they didn't hold the window open. - return - if(get_dist(user_mob, src) > 1) - to_chat(user_mob, span_warning("You have moved too far away!")) + if(!can_toggle_sensors(user_mob)) return - if(has_sensor == LOCKED_SENSORS) - to_chat(user_mob, "The controls are locked.") - return - if(has_sensor == BROKEN_SENSORS) - to_chat(user_mob, "The sensors have shorted out!") - return - if(has_sensor <= NO_SENSORS) - to_chat(user_mob, "This suit does not have any sensors.") - return sensor_mode = modes.Find(switchMode) - 1 if (loc == user_mob) switch(sensor_mode) @@ -305,78 +326,114 @@ if(H.w_uniform == src) H.update_suit_sensors() +/// Checks if the toggler is allowed to toggle suit sensors currently +/obj/item/clothing/under/proc/can_toggle_sensors(mob/toggler) + if(!can_use(toggler) || toggler.stat == DEAD) //make sure they didn't hold the window open. + return FALSE + if(get_dist(toggler, src) > 1) + balloon_alert(toggler, "too far!") + return FALSE + + switch(has_sensor) + if(LOCKED_SENSORS) + balloon_alert(toggler, "sensor controls locked!") + return FALSE + if(BROKEN_SENSORS) + balloon_alert(toggler, "sensors shorted!") + return FALSE + if(NO_SENSORS) + balloon_alert(toggler, "no sensors to ajdust!") + return FALSE + + return TRUE + /obj/item/clothing/under/AltClick(mob/user) . = ..() if(.) return + if(!can_adjust) + balloon_alert(user, "can't be adjusted!") + return + if(!can_use(user)) + return + rolldown() + +/obj/item/clothing/under/alt_click_secondary(mob/user) + . = ..() + if(.) + return + + if(!LAZYLEN(attached_accessories)) + balloon_alert(user, "no accessories to remove!") + return if(!user.can_perform_action(src, NEED_DEXTERITY)) return - if(attached_accessory) - remove_accessory(user) - else - rolldown() + + pop_accessory(user) /obj/item/clothing/under/verb/jumpsuit_adjust() set name = "Adjust Jumpsuit Style" set category = null set src in usr - rolldown() -/obj/item/clothing/under/proc/rolldown() - if(!can_use(usr)) - return if(!can_adjust) - to_chat(usr, span_warning("You cannot wear this suit any differently!")) + balloon_alert(usr, "can't be adjusted!") + return + if(!can_use(usr)) return + rolldown() + +/obj/item/clothing/under/proc/rolldown() if(toggle_jumpsuit_adjust()) 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() + update_appearance() + +/// Helper to toggle the jumpsuit style, if possible +/// Returns the new state /obj/item/clothing/under/proc/toggle_jumpsuit_adjust() - if(adjusted == DIGITIGRADE_STYLE) - return - adjusted = !adjusted - if(adjusted) - if(!(female_sprite_flags & FEMALE_UNIFORM_TOP_ONLY)) - female_sprite_flags = NO_FEMALE_UNIFORM - if(!alt_covers_chest) // for the special snowflake suits that expose the chest when adjusted (and also the arms, realistically) - body_parts_covered &= ~CHEST - body_parts_covered &= ~ARMS - else - female_sprite_flags = initial(female_sprite_flags) - if(!alt_covers_chest) - body_parts_covered |= CHEST - body_parts_covered |= ARMS - if(!LAZYLEN(damage_by_parts)) - return adjusted - for(var/zone in list(BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) // ugly check to make sure we don't reenable protection on a disabled part - if(damage_by_parts[zone] > limb_integrity) - body_parts_covered &= body_zone2cover_flags(zone) - return adjusted + switch(adjusted) + if(DIGITIGRADE_STYLE) + return -/obj/item/clothing/under/rank - dying_key = DYE_REGISTRY_UNDER + if(NORMAL_STYLE) + adjust_to_alt() -/obj/item/clothing/under/proc/dump_attachment() - if(!attached_accessory) - return - var/atom/drop_location = drop_location() - attached_accessory.transform *= 2 - attached_accessory.pixel_x -= 8 - attached_accessory.pixel_y += 8 - if(drop_location) - attached_accessory.forceMove(drop_location) - cut_overlays() - attached_accessory = null - accessory_overlay = null - update_appearance() + if(ALT_STYLE) + adjust_to_normal() -/obj/item/clothing/under/rank/atom_destruction(damage_flag) - dump_attachment() + SEND_SIGNAL(src, COMSIG_CLOTHING_UNDER_ADJUSTED) + return adjusted + +/// Helper to reset to normal jumpsuit state +/obj/item/clothing/under/proc/adjust_to_normal() + adjusted = NORMAL_STYLE + female_sprite_flags = initial(female_sprite_flags) + if(!alt_covers_chest) + body_parts_covered |= CHEST + body_parts_covered |= ARMS + if(LAZYLEN(damage_by_parts)) + // ugly check to make sure we don't reenable protection on a disabled part + for(var/zone in list(BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) + if(damage_by_parts[zone] > limb_integrity) + body_parts_covered &= body_zone2cover_flags(zone) + +/// Helper to adjust to alt jumpsuit state +/obj/item/clothing/under/proc/adjust_to_alt() + adjusted = ALT_STYLE + if(!(female_sprite_flags & FEMALE_UNIFORM_TOP_ONLY)) + female_sprite_flags = NO_FEMALE_UNIFORM + if(!alt_covers_chest) // for the special snowflake suits that expose the chest when adjusted (and also the arms, realistically) + body_parts_covered &= ~CHEST + body_parts_covered &= ~ARMS + +/obj/item/clothing/under/can_use(mob/user) + if(ismob(user) && !user.can_perform_action(src, NEED_DEXTERITY|NEED_HANDS|ALLOW_RESTING)) + return FALSE return ..() + +/obj/item/clothing/under/rank + dying_key = DYE_REGISTRY_UNDER diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm deleted file mode 100644 index 30bee1d8a44b6..0000000000000 --- a/code/modules/clothing/under/accessories.dm +++ /dev/null @@ -1,523 +0,0 @@ -/obj/item/clothing/accessory //Ties moved to neck slot items, but as there are still things like medals and armbands, this accessory system is being kept as-is - name = "Accessory" - desc = "Something has gone wrong!" - icon = 'icons/obj/clothing/accessories.dmi' - worn_icon = 'icons/mob/clothing/accessories.dmi' - icon_state = "plasma" - inhand_icon_state = "" //no inhands - slot_flags = 0 - w_class = WEIGHT_CLASS_SMALL - /// Whether or not the accessory displays through suits and the like. - var/above_suit = TRUE - /// TRUE if shown as a small icon in corner, FALSE if overlayed - var/minimize_when_attached = TRUE - /// What equipment slot the accessory attaches to. - var/attachment_slot = CHEST - -/obj/item/clothing/accessory/proc/can_attach_accessory(obj/item/clothing/U, mob/user) - if(!attachment_slot || (U && U.body_parts_covered & attachment_slot)) - return TRUE - if(user) - to_chat(user, span_warning("There doesn't seem to be anywhere to put [src]...")) - -/obj/item/clothing/accessory/proc/attach(obj/item/clothing/under/U, user) - if(atom_storage) - if(U.atom_storage) - return FALSE - U.clone_storage(atom_storage) - U.atom_storage.set_real_location(src) - U.attached_accessory = src - forceMove(U) - layer = FLOAT_LAYER - plane = FLOAT_PLANE - if(minimize_when_attached) - transform *= 0.5 //halve the size so it doesn't overpower the under - pixel_x += 8 - pixel_y -= 8 - U.add_overlay(src) - - U.set_armor(U.get_armor().add_other_armor(get_armor())) - - if(isliving(user)) - on_uniform_equip(U, user) - - 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) - QDEL_NULL(U.atom_storage) - - U.set_armor(U.get_armor().subtract_other_armor(get_armor())) - - if(isliving(user)) - on_uniform_dropped(U, user) - - if(minimize_when_attached) - transform *= 2 - pixel_x -= 8 - pixel_y += 8 - layer = initial(layer) - SET_PLANE_IMPLICIT(src, initial(plane)) - U.cut_overlays() - U.attached_accessory = null - U.accessory_overlay = null - - -/obj/item/clothing/accessory/proc/on_uniform_equip(obj/item/clothing/under/U, user) - return - -/obj/item/clothing/accessory/proc/on_uniform_dropped(obj/item/clothing/under/U, user) - return - -/obj/item/clothing/accessory/attack_self_secondary(mob/user) - if(user.can_perform_action(src, NEED_DEXTERITY)) - above_suit = !above_suit - to_chat(user, "[src] will be worn [above_suit ? "above" : "below"] your suit.") - return - - return ..() - -/obj/item/clothing/accessory/examine(mob/user) - . = ..() - . += span_notice("\The [src] can be attached to a uniform. Alt-click to remove it once attached.") - . += span_notice("\The [src] can be worn above or below your suit. Right-click to toggle.") - -/obj/item/clothing/accessory/waistcoat - name = "waistcoat" - desc = "For some classy, murderous fun." - icon_state = "waistcoat" - inhand_icon_state = "wcoat" - lefthand_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi' - righthand_file = 'icons/mob/inhands/clothing/suits_righthand.dmi' - minimize_when_attached = FALSE - attachment_slot = null - greyscale_config = /datum/greyscale_config/waistcoat - greyscale_config_worn = /datum/greyscale_config/waistcoat_worn - greyscale_colors = "#414344" - flags_1 = IS_PLAYER_COLORABLE_1 - -/obj/item/clothing/accessory/vest_sheriff - name = "sheriff vest" - desc = "Now you just have to pick your favourite deputy." - icon_state = "vest_sheriff" - lefthand_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi' - righthand_file = 'icons/mob/inhands/clothing/suits_righthand.dmi' - inhand_icon_state = "vest_sheriff" - minimize_when_attached = TRUE - attachment_slot = null - -/obj/item/clothing/accessory/maidcorset - name = "maid corset" - desc = "The final touch that holds it all together." - icon_state = "maidcorset" - inhand_icon_state = "maidapron" - lefthand_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi' - righthand_file = 'icons/mob/inhands/clothing/suits_righthand.dmi' - minimize_when_attached = FALSE - attachment_slot = null - -/obj/item/clothing/accessory/maidapron - name = "maid apron" - desc = "The best part of a maid costume." - icon_state = "maidapron" - inhand_icon_state = "maidapron" - lefthand_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi' - righthand_file = 'icons/mob/inhands/clothing/suits_righthand.dmi' - minimize_when_attached = FALSE - attachment_slot = null - -////////// -//Medals// -////////// - -/obj/item/clothing/accessory/medal - name = "bronze medal" - desc = "A bronze medal." - icon_state = "bronze" - custom_materials = list(/datum/material/iron=HALF_SHEET_MATERIAL_AMOUNT) - resistance_flags = FIRE_PROOF - var/medaltype = "medal" //Sprite used for medalbox - var/commended = FALSE - -//Pinning medals on people -/obj/item/clothing/accessory/medal/attack(mob/living/carbon/human/M, mob/living/user) - if(ishuman(M) && !user.combat_mode) - - if(M.wear_suit) - if((M.wear_suit.flags_inv & HIDEJUMPSUIT)) //Check if the jumpsuit is covered - to_chat(user, span_warning("Medals can only be pinned on jumpsuits.")) - return - - if(M.w_uniform) - var/obj/item/clothing/under/U = M.w_uniform - var/delay = 20 - if(user == M) - delay = 0 - else - user.visible_message(span_notice("[user] is trying to pin [src] on [M]'s chest."), \ - span_notice("You try to pin [src] on [M]'s chest.")) - var/input - if(!commended && user != M) - input = tgui_input_text(user, "Reason for this commendation? It will be recorded by Nanotrasen.", "Commendation", max_length = 140) - if(do_after(user, delay, target = M)) - if(U.attach_accessory(src, user, 0)) //Attach it, do not notify the user of the attachment - if(user == M) - to_chat(user, span_notice("You attach [src] to [U].")) - else - user.visible_message(span_notice("[user] pins \the [src] on [M]'s chest."), \ - span_notice("You pin \the [src] on [M]'s chest.")) - if(input) - SSblackbox.record_feedback("associative", "commendation", 1, list("commender" = "[user.real_name]", "commendee" = "[M.real_name]", "medal" = "[src]", "reason" = input)) - GLOB.commendations += "[user.real_name] awarded [M.real_name] the [name]! \n- [input]" - commended = TRUE - desc += "
    The inscription reads: [input] - [user.real_name]" - M.log_message("was given the following commendation by [key_name(user)]: [input]", LOG_GAME, color = "green") - message_admins("[key_name_admin(M)] was given the following commendation by [key_name_admin(user)]: [input]") - add_memory_in_range(M, 7, /datum/memory/received_medal, protagonist = M, deuteragonist = user, medal_type = src, medal_text = input) - - else - to_chat(user, span_warning("Medals can only be pinned on jumpsuits!")) - else - ..() - -/obj/item/clothing/accessory/medal/conduct - name = "distinguished conduct medal" - desc = "A bronze medal awarded for distinguished conduct. Whilst a great honor, this is the most basic award given by Nanotrasen. It is often awarded by a captain to a member of his crew." - -/obj/item/clothing/accessory/medal/bronze_heart - name = "bronze heart medal" - desc = "A bronze heart-shaped medal awarded for sacrifice. It is often awarded posthumously or for severe injury in the line of duty." - icon_state = "bronze_heart" - -/obj/item/clothing/accessory/medal/ribbon - name = "ribbon" - desc = "A ribbon" - icon_state = "cargo" - -/obj/item/clothing/accessory/medal/ribbon/cargo - name = "\"cargo tech 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 - name = "silver medal" - desc = "A silver medal." - icon_state = "silver" - medaltype = "medal-silver" - custom_materials = list(/datum/material/silver=HALF_SHEET_MATERIAL_AMOUNT) - -/obj/item/clothing/accessory/medal/silver/valor - name = "medal of valor" - desc = "A silver medal awarded for acts of exceptional valor." - -/obj/item/clothing/accessory/medal/silver/security - name = "robust security award" - desc = "An award for distinguished combat and sacrifice in defence of Nanotrasen's commercial interests. Often awarded to security staff." - -/obj/item/clothing/accessory/medal/silver/excellence - name = "\proper the head of personnel award for outstanding achievement in the field of excellence" - desc = "Nanotrasen's dictionary defines excellence as \"the quality or condition of being excellent\". This is awarded to those rare crewmembers who fit that definition." - -/obj/item/clothing/accessory/medal/silver/bureaucracy - name = "\improper Excellence in Bureaucracy Medal" - desc = "Awarded for exemplary managerial services rendered while under contract with Nanotrasen." - -/obj/item/clothing/accessory/medal/gold - name = "gold medal" - desc = "A prestigious golden medal." - icon_state = "gold" - medaltype = "medal-gold" - custom_materials = list(/datum/material/gold=HALF_SHEET_MATERIAL_AMOUNT) - -/obj/item/clothing/accessory/medal/med_medal - name = "exemplary performance medal" - desc = "A medal awarded to those who have shown distinguished conduct, performance, and initiative within the medical department." - icon_state = "med_medal" - -/obj/item/clothing/accessory/medal/med_medal2 - name = "excellence in medicine medal" - desc = "A medal awarded to those who have shown legendary performance, competence, and initiative beyond all expectations within the medical department." - icon_state = "med_medal2" - -/obj/item/clothing/accessory/medal/gold/captain - name = "medal of captaincy" - desc = "A golden medal awarded exclusively to those promoted to the rank of captain. It signifies the codified responsibilities of a captain to Nanotrasen, and their undisputable authority over their crew." - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF - -/obj/item/clothing/accessory/medal/gold/heroism - name = "medal of exceptional heroism" - desc = "An extremely rare golden medal awarded only by CentCom. To receive such a medal is the highest honor and as such, very few exist. This medal is almost never awarded to anybody but commanders." - -/obj/item/clothing/accessory/medal/plasma - name = "plasma medal" - desc = "An eccentric medal made of plasma." - icon_state = "plasma" - medaltype = "medal-plasma" - armor_type = /datum/armor/medal_plasma - custom_materials = list(/datum/material/plasma=HALF_SHEET_MATERIAL_AMOUNT) - -/datum/armor/medal_plasma - fire = -10 - -/obj/item/clothing/accessory/medal/plasma/Initialize(mapload) - . = ..() - AddElement(/datum/element/atmos_sensitive, mapload) - -/obj/item/clothing/accessory/medal/plasma/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return exposed_temperature > 300 - -/obj/item/clothing/accessory/medal/plasma/atmos_expose(datum/gas_mixture/air, exposed_temperature) - atmos_spawn_air("[GAS_PLASMA]=20;[TURF_TEMPERATURE(exposed_temperature)]") - visible_message(span_danger("\The [src] bursts into flame!"), span_userdanger("Your [src] bursts into flame!")) - qdel(src) - -/obj/item/clothing/accessory/medal/plasma/nobel_science - name = "nobel sciences award" - desc = "A plasma medal which represents significant contributions to the field of science or engineering." - - - -//////////// -//Armbands// -//////////// - -/obj/item/clothing/accessory/armband - name = "red armband" - desc = "A fancy red armband!" - icon_state = "redband" - attachment_slot = null - -/obj/item/clothing/accessory/armband/deputy - name = "security deputy armband" - desc = "An armband, worn by personnel authorized to act as a deputy of station security." - -/obj/item/clothing/accessory/armband/cargo - name = "cargo bay guard armband" - desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is brown." - icon_state = "cargoband" - -/obj/item/clothing/accessory/armband/engine - name = "engineering guard armband" - desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is orange with a reflective strip!" - icon_state = "engieband" - -/obj/item/clothing/accessory/armband/science - name = "science guard armband" - desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is purple." - icon_state = "rndband" - -/obj/item/clothing/accessory/armband/hydro - name = "hydroponics guard armband" - desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is green and blue." - icon_state = "hydroband" - -/obj/item/clothing/accessory/armband/med - name = "medical guard armband" - desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is white." - icon_state = "medband" - -/obj/item/clothing/accessory/armband/medblue - name = "medical guard armband" - desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is white and blue." - icon_state = "medblueband" - -////////////// -//OBJECTION!// -////////////// - -/obj/item/clothing/accessory/lawyers_badge - name = "attorney's badge" - desc = "Fills you with the conviction of JUSTICE. Lawyers tend to want to show it to everyone they meet." - icon_state = "lawyerbadge" - -/obj/item/clothing/accessory/lawyers_badge/attack_self(mob/user) - if(prob(1)) - user.say("The testimony contradicts the evidence!", forced = "attorney's badge") - user.visible_message(span_notice("[user] shows [user.p_their()] attorney's badge."), span_notice("You show your attorney's badge.")) - -/obj/item/clothing/accessory/lawyers_badge/on_uniform_equip(obj/item/clothing/under/U, mob/living/user) - RegisterSignal(user, COMSIG_LIVING_SLAM_TABLE, PROC_REF(table_slam)) - user.bubble_icon = "lawyer" - -/obj/item/clothing/accessory/lawyers_badge/on_uniform_dropped(obj/item/clothing/under/U, mob/living/user) - UnregisterSignal(user, COMSIG_LIVING_SLAM_TABLE) - user.bubble_icon = initial(user.bubble_icon) - -/obj/item/clothing/accessory/lawyers_badge/proc/table_slam(mob/living/source, obj/structure/table/the_table) - SIGNAL_HANDLER - INVOKE_ASYNC(src, PROC_REF(handle_table_slam), source) - -/obj/item/clothing/accessory/lawyers_badge/proc/handle_table_slam(mob/living/user) - user.say("Objection!!", spans = list(SPAN_YELL), forced=TRUE) - -//////////////// -//HA HA! NERD!// -//////////////// -/obj/item/clothing/accessory/pocketprotector - name = "pocket protector" - desc = "Can protect your clothing from ink stains, but you'll look like a nerd if you're using one." - icon_state = "pocketprotector" - -/obj/item/clothing/accessory/pocketprotector/Initialize(mapload) - . = ..() - - create_storage(storage_type = /datum/storage/pockets/pocketprotector) - -/obj/item/clothing/accessory/pocketprotector/detach(obj/item/clothing/under/U, user) - var/drop_loc = drop_location() - for(var/atom/movable/held as anything in src) - held.forceMove(drop_loc) - return ..() - -/obj/item/clothing/accessory/pocketprotector/full/Initialize(mapload) - . = ..() - - new /obj/item/pen/red(src) - new /obj/item/pen(src) - new /obj/item/pen/blue(src) - -/obj/item/clothing/accessory/pocketprotector/cosmetology/Initialize(mapload) - . = ..() - for(var/i in 1 to 3) - new /obj/item/lipstick/random(src) - -//////////////// -//REAL BIG FAN// -//////////////// - -/obj/item/clothing/accessory/clown_enjoyer_pin - name = "\improper Clown Pin" - 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)) - L.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)) - L.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)) - L.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)) - L.clear_mood_event("mime_fan_pin") - -//////////////// -//OONGA BOONGA// -//////////////// - -/obj/item/clothing/accessory/talisman - name = "bone talisman" - desc = "A hunter's talisman, some say the old gods smile on those who wear it." - icon_state = "talisman" - armor_type = /datum/armor/accessory_talisman - attachment_slot = null - -/datum/armor/accessory_talisman - melee = 5 - bullet = 5 - laser = 5 - energy = 5 - bomb = 20 - bio = 20 - acid = 25 - -/obj/item/clothing/accessory/skullcodpiece - name = "skull codpiece" - desc = "A skull shaped ornament, intended to protect the important things in life." - icon_state = "skull" - armor_type = /datum/armor/accessory_skullcodpiece - attachment_slot = GROIN - -/datum/armor/accessory_skullcodpiece - melee = 5 - bullet = 5 - laser = 5 - energy = 5 - bomb = 20 - bio = 20 - acid = 25 - -/obj/item/clothing/accessory/skilt - name = "Sinew Skirt" - desc = "For the last time. IT'S A KILT not a skirt." - icon_state = "skilt" - minimize_when_attached = FALSE - armor_type = /datum/armor/accessory_skilt - attachment_slot = GROIN - -/datum/armor/accessory_skilt - melee = 5 - bullet = 5 - laser = 5 - energy = 5 - bomb = 20 - bio = 20 - acid = 25 - -/obj/item/clothing/accessory/allergy_dogtag - name = "Allergy dogtag" - desc = "Dogtag with a list of your allergies" - icon_state = "allergy" - minimize_when_attached = TRUE - attachment_slot = CHEST - ///Display message - var/display - -/obj/item/clothing/accessory/allergy_dogtag/examine(mob/user) - . = ..() - . += "The dogtag has a listing of allergies : [display]" - -/obj/item/clothing/accessory/allergy_dogtag/on_uniform_equip(obj/item/clothing/under/U, user) - . = ..() - RegisterSignal(U,COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) - -/obj/item/clothing/accessory/allergy_dogtag/on_uniform_dropped(obj/item/clothing/under/U, user) - . = ..() - UnregisterSignal(U,COMSIG_ATOM_EXAMINE) - -///What happens when we examine the uniform -/obj/item/clothing/accessory/allergy_dogtag/proc/on_examine(datum/source, mob/user, list/examine_list) - SIGNAL_HANDLER - examine_list += "The dogtag has a listing of allergies : [display]" - - -/// Reskins for the pride pin accessory, mapped by display name to icon state -GLOBAL_LIST_INIT(pride_pin_reskins, list( - "Rainbow Pride" = "pride", - "Bisexual Pride" = "pride_bi", - "Pansexual Pride" = "pride_pan", - "Asexual Pride" = "pride_ace", - "Non-binary Pride" = "pride_enby", - "Transgender Pride" = "pride_trans", - "Intersex Pride" = "pride_intersex", - "Lesbian Pride" = "pride_lesbian", -)) - -/obj/item/clothing/accessory/pride - name = "pride pin" - desc = "A Nanotrasen Diversity & Inclusion Center-sponsored holographic pin to show off your pride, reminding the crew of their unwavering commitment to equity, diversity, and inclusion!" - icon_state = "pride" - obj_flags = UNIQUE_RENAME - infinite_reskin = TRUE - -/obj/item/clothing/accessory/pride/Initialize(mapload) - . = ..() - unique_reskin = GLOB.pride_pin_reskins - -/obj/item/clothing/accessory/deaf_pin - name = "deaf personnel pin" - desc = "Indicates that the wearer is deaf." - icon_state = "deaf_pin" diff --git a/code/modules/clothing/under/accessories/_accessories.dm b/code/modules/clothing/under/accessories/_accessories.dm new file mode 100644 index 0000000000000..8ecc3962abd26 --- /dev/null +++ b/code/modules/clothing/under/accessories/_accessories.dm @@ -0,0 +1,209 @@ +/** + * Clothing accessories. + * + * These items can be slotted onto an undershirt to provide a bit of flair. + * + * These should be very light on their effects. Armor should be avoided entirely. + * + * Multiple accessories can be equipped on a mob, and only the firstmost one is shown on their sprite. + * The rest are still shown on examine, but this may create unfair circumstances when you can't examine someone. + */ +/obj/item/clothing/accessory + name = "Accessory" + desc = "Something has gone wrong!" + icon = 'icons/obj/clothing/accessories.dmi' + worn_icon = 'icons/mob/clothing/accessories.dmi' + icon_state = "plasma" + inhand_icon_state = "" //no inhands + slot_flags = NONE + w_class = WEIGHT_CLASS_SMALL + item_flags = NOBLUDGEON + /// Whether or not the accessory displays through suits and the like. + var/above_suit = TRUE + /// TRUE if shown as a small icon in corner, FALSE if overlayed + var/minimize_when_attached = TRUE + /// What equipment slot the accessory attaches to. + /// If NONE, can always attach, while if supplied, can only attach if the clothing covers this slot. + var/attachment_slot = CHEST + +/obj/item/clothing/accessory/Initialize(mapload) + . = ..() + register_context() + +/** + * Can we be attached to the passed clothing article? + */ +/obj/item/clothing/accessory/proc/can_attach_accessory(obj/item/clothing/under/attach_to, mob/living/user) + if(!istype(attach_to)) + CRASH("[type] - can_attach_accessory called with an invalid item to attach to. (got: [attach_to])") + + if(atom_storage && attach_to.atom_storage) + if(user) + attach_to.balloon_alert(user, "isn't compatible!") + return FALSE + + if(attachment_slot && !(attach_to.body_parts_covered & attachment_slot)) + if(user) + attach_to.balloon_alert(user, "can't attach there!") + return FALSE + + if(length(attach_to.attached_accessories) >= attach_to.max_number_of_accessories) + if(user) + attach_to.balloon_alert(user, "too many accessories!") + return FALSE + + return TRUE + +// If accessory is being worn, make sure it updates on the player +/obj/item/clothing/accessory/update_greyscale() + . = ..() + + var/obj/item/clothing/under/attached_to = loc + + if(!istype(attached_to)) + return + + var/mob/living/carbon/human/wearer = attached_to.loc + + if(!istype(wearer)) + return + + attached_to.update_accessory_overlay() + +/** + * Actually attach this accessory to the passed clothing article. + * + * The accessory is not yet within the clothing's loc at this point, this hapens after success. + */ +/obj/item/clothing/accessory/proc/attach(obj/item/clothing/under/attach_to, mob/living/attacher) + SHOULD_CALL_PARENT(TRUE) + + if(atom_storage) + attach_to.clone_storage(atom_storage) + attach_to.atom_storage.set_real_location(src) + + var/num_other_accessories = LAZYLEN(attach_to.attached_accessories) + layer = FLOAT_LAYER + clamp(attach_to.max_number_of_accessories - num_other_accessories, 0, 10) + plane = FLOAT_PLANE + + if(minimize_when_attached) + transform *= 0.5 + pixel_x += 8 + pixel_y += (-8 + LAZYLEN(attach_to.attached_accessories) * 2) + + RegisterSignal(attach_to, COMSIG_ITEM_EQUIPPED, PROC_REF(on_uniform_equipped)) + RegisterSignal(attach_to, COMSIG_ITEM_DROPPED, PROC_REF(on_uniform_dropped)) + RegisterSignal(attach_to, COMSIG_CLOTHING_UNDER_ADJUSTED, PROC_REF(on_uniform_adjusted)) + RegisterSignal(attach_to, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_uniform_update)) + + return TRUE + +/// Called after attach is completely successful and the accessory is in the clothing's loc +/obj/item/clothing/accessory/proc/successful_attach(obj/item/clothing/under/attached_to) + SHOULD_CALL_PARENT(TRUE) + + // Do on-equip effects if we're already equipped + var/mob/worn_on = attached_to.loc + if(istype(worn_on)) + on_uniform_equipped(attached_to, worn_on, worn_on.get_slot_by_item(attached_to)) + + SEND_SIGNAL(src, COMSIG_ACCESSORY_ATTACHED, attached_to) + SEND_SIGNAL(attached_to, COMSIG_CLOTHING_ACCESSORY_ATTACHED, src) + +/** + * Detach this accessory from the passed clothing article + * + * We may have exited the clothing's loc at this point + */ +/obj/item/clothing/accessory/proc/detach(obj/item/clothing/under/detach_from) + SHOULD_CALL_PARENT(TRUE) + + if(IS_WEAKREF_OF(src, detach_from.atom_storage?.real_location)) + // Ensure void items do not stick around + atom_storage.close_all() + detach_from.atom_storage.close_all() + // And clean up the storage we made + QDEL_NULL(detach_from.atom_storage) + + UnregisterSignal(detach_from, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED, COMSIG_CLOTHING_UNDER_ADJUSTED, COMSIG_ATOM_UPDATE_OVERLAYS)) + var/mob/dropped_from = detach_from.loc + if(istype(dropped_from)) + on_uniform_dropped(detach_from, dropped_from) + + SEND_SIGNAL(src, COMSIG_ACCESSORY_DETACHED, detach_from) + SEND_SIGNAL(detach_from, COMSIG_CLOTHING_ACCESSORY_DETACHED, src) + + if(minimize_when_attached) + transform *= 2 + // just randomize position + pixel_x = rand(4, -4) + pixel_y = rand(4, -4) + + layer = initial(layer) + SET_PLANE_IMPLICIT(src, initial(plane)) + return TRUE + +/// Signal proc for [COMSIG_ITEM_EQUIPPED] on the uniform we're pinned to +/obj/item/clothing/accessory/proc/on_uniform_equipped(obj/item/clothing/under/source, mob/living/user, slot) + SIGNAL_HANDLER + + if(!(slot & source.slot_flags)) + return + + accessory_equipped(source, user) + +/// Signal proc for [COMSIG_ITEM_DROPPED] on the uniform we're pinned to +/obj/item/clothing/accessory/proc/on_uniform_dropped(obj/item/clothing/under/source, mob/living/user) + SIGNAL_HANDLER + + accessory_dropped(source, user) + user.update_clothing(ITEM_SLOT_ICLOTHING|ITEM_SLOT_OCLOTHING) + +/// Called when the uniform this accessory is pinned to is equipped in a valid slot +/obj/item/clothing/accessory/proc/accessory_equipped(obj/item/clothing/under/clothes, mob/living/user) + equipped(user, user.get_slot_by_item(clothes)) // so we get any actions, item_flags get set, etc + return + +/// Called when the uniform this accessory is pinned to is dropped +/obj/item/clothing/accessory/proc/accessory_dropped(obj/item/clothing/under/clothes, mob/living/user) + dropped(user) + return + +/// Signal proc for [COMSIG_CLOTHING_UNDER_ADJUSTED] on the uniform we're pinned to +/// Checks if we can no longer be attached to the uniform, and if so, drops us +/obj/item/clothing/accessory/proc/on_uniform_adjusted(obj/item/clothing/under/source) + SIGNAL_HANDLER + + if(can_attach_accessory(source)) + return + + source.remove_accessory(src) + forceMove(source.drop_location()) + source.visible_message(span_warning("[src] falls off of [source]!")) + +/// Signal proc for [COMSIG_ATOM_UPDATE_OVERLAYS] on the uniform we're pinned to to add our overlays to the inventory icon +/obj/item/clothing/accessory/proc/on_uniform_update(obj/item/source, list/overlays) + SIGNAL_HANDLER + + overlays |= src + +/obj/item/clothing/accessory/attack_self_secondary(mob/user) + . = ..() + if(.) + return + if(user.can_perform_action(src, NEED_DEXTERITY)) + above_suit = !above_suit + balloon_alert(user, "wearing [above_suit ? "above" : "below"] suits") + return TRUE + +/obj/item/clothing/accessory/examine(mob/user) + . = ..() + . += "It can be attached to a uniform." + . += "It can be worn above or below your suit. Right-click to toggle." + +/obj/item/clothing/accessory/add_context(atom/source, list/context, obj/item/held_item, mob/user) + if(!isnull(held_item)) + return NONE + + context[SCREENTIP_CONTEXT_RMB] = "Wear [above_suit ? "below" : "above"] suit" + return CONTEXTUAL_SCREENTIP_SET diff --git a/code/modules/clothing/under/accessories/armbands.dm b/code/modules/clothing/under/accessories/armbands.dm new file mode 100644 index 0000000000000..fb26192561182 --- /dev/null +++ b/code/modules/clothing/under/accessories/armbands.dm @@ -0,0 +1,40 @@ +// Armbands, which go around a sleeve of a shirt. +/obj/item/clothing/accessory/armband + name = "red armband" + desc = "A fancy red armband!" + icon_state = "redband" + attachment_slot = NONE + +/obj/item/clothing/accessory/armband/deputy + name = "security deputy armband" + desc = "An armband, worn by personnel authorized to act as a deputy of station security." + +/obj/item/clothing/accessory/armband/cargo + name = "cargo bay guard armband" + desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is brown." + icon_state = "cargoband" + +/obj/item/clothing/accessory/armband/engine + name = "engineering guard armband" + desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is orange with a reflective strip!" + icon_state = "engieband" + +/obj/item/clothing/accessory/armband/science + name = "science guard armband" + desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is purple." + icon_state = "rndband" + +/obj/item/clothing/accessory/armband/hydro + name = "hydroponics guard armband" + desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is green and blue." + icon_state = "hydroband" + +/obj/item/clothing/accessory/armband/med + name = "medical guard armband" + desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is white." + icon_state = "medband" + +/obj/item/clothing/accessory/armband/medblue + name = "medical guard armband" + desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is white and blue." + icon_state = "medblueband" diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm new file mode 100644 index 0000000000000..cf8bcd148086d --- /dev/null +++ b/code/modules/clothing/under/accessories/badges.dm @@ -0,0 +1,205 @@ +// Badges, pins, and other very small items that slot onto a shirt. +/obj/item/clothing/accessory/lawyers_badge + name = "attorney's badge" + desc = "Fills you with the conviction of JUSTICE. Lawyers tend to want to show it to everyone they meet." + icon_state = "lawyerbadge" + +/obj/item/clothing/accessory/lawyers_badge/interact(mob/user) + . = ..() + if(prob(1)) + user.say("The testimony contradicts the evidence!", forced = "[src]") + user.visible_message(span_notice("[user] shows [user.p_their()] attorney's badge."), span_notice("You show your attorney's badge.")) + +/obj/item/clothing/accessory/lawyers_badge/accessory_equipped(obj/item/clothing/under/clothes, mob/living/user) + RegisterSignal(user, COMSIG_LIVING_SLAM_TABLE, PROC_REF(table_slam)) + user.bubble_icon = "lawyer" + +/obj/item/clothing/accessory/lawyers_badge/accessory_dropped(obj/item/clothing/under/clothes, mob/living/user) + UnregisterSignal(user, COMSIG_LIVING_SLAM_TABLE) + user.bubble_icon = initial(user.bubble_icon) + +/obj/item/clothing/accessory/lawyers_badge/proc/table_slam(mob/living/source, obj/structure/table/the_table) + SIGNAL_HANDLER + + ASYNC + source.say("Objection!!", spans = list(SPAN_YELL), forced = "[src]") + +/obj/item/clothing/accessory/clown_enjoyer_pin + name = "\improper Clown Pin" + desc = "A pin to show off your appreciation for clowns and clowning!" + icon_state = "clown_enjoyer_pin" + +/obj/item/clothing/accessory/clown_enjoyer_pin/can_attach_accessory(obj/item/clothing/under/attach_to, mob/living/user) + . = ..() + if(!.) + return + if(locate(/obj/item/clothing/accessory/mime_fan_pin) in attach_to.attached_accessories) + if(user) + attach_to.balloon_alert(user, "can't pick both sides!") + return FALSE + return TRUE + +/obj/item/clothing/accessory/clown_enjoyer_pin/accessory_equipped(obj/item/clothing/under/clothes, mob/living/user) + if(HAS_TRAIT(user, TRAIT_CLOWN_ENJOYER)) + user.add_mood_event("clown_enjoyer_pin", /datum/mood_event/clown_enjoyer_pin) + if(ishuman(user)) + var/mob/living/carbon/human/human_equipper = user + human_equipper.fan_hud_set_fandom() + +/obj/item/clothing/accessory/clown_enjoyer_pin/accessory_dropped(obj/item/clothing/under/clothes, mob/living/user) + user.clear_mood_event("clown_enjoyer_pin") + if(ishuman(user)) + var/mob/living/carbon/human/human_equipper = user + human_equipper.fan_hud_set_fandom() + +/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/can_attach_accessory(obj/item/clothing/under/attach_to, mob/living/user) + . = ..() + if(!.) + return + if(locate(/obj/item/clothing/accessory/clown_enjoyer_pin) in attach_to.attached_accessories) + if(user) + attach_to.balloon_alert(user, "can't pick both sides!") + return FALSE + return TRUE + +/obj/item/clothing/accessory/mime_fan_pin/accessory_equipped(obj/item/clothing/under/clothes, mob/living/user) + if(HAS_TRAIT(user, TRAIT_MIME_FAN)) + user.add_mood_event("mime_fan_pin", /datum/mood_event/mime_fan_pin) + if(ishuman(user)) + var/mob/living/carbon/human/human_equipper = user + human_equipper.fan_hud_set_fandom() + +/obj/item/clothing/accessory/mime_fan_pin/accessory_dropped(obj/item/clothing/under/clothes, mob/living/user) + user.clear_mood_event("mime_fan_pin") + if(ishuman(user)) + var/mob/living/carbon/human/human_equipper = user + human_equipper.fan_hud_set_fandom() + +/obj/item/clothing/accessory/pocketprotector + name = "pocket protector" + desc = "Can protect your clothing from ink stains, but you'll look like a nerd if you're using one." + icon_state = "pocketprotector" + +/obj/item/clothing/accessory/pocketprotector/Initialize(mapload) + . = ..() + create_storage(storage_type = /datum/storage/pockets/pocketprotector) + +/obj/item/clothing/accessory/pocketprotector/can_attach_accessory(obj/item/clothing/under/attach_to, mob/living/user) + . = ..() + if(!.) + return + + if(!isnull(attach_to.atom_storage)) + if(user) + attach_to.balloon_alert(user, "not compatible!") + return FALSE + return TRUE + +/obj/item/clothing/accessory/pocketprotector/full + +/obj/item/clothing/accessory/pocketprotector/full/Initialize(mapload) + . = ..() + new /obj/item/pen/red(src) + new /obj/item/pen(src) + new /obj/item/pen/blue(src) + +/obj/item/clothing/accessory/pocketprotector/cosmetology + +/obj/item/clothing/accessory/pocketprotector/cosmetology/Initialize(mapload) + . = ..() + for(var/i in 1 to 3) + new /obj/item/lipstick/random(src) + +/obj/item/clothing/accessory/dogtag + name = "Dogtag" + desc = "Can't wear a collar, but this is fine?" + icon_state = "allergy" + attachment_slot = NONE // actually NECK but that doesn't make sense + /// What message is displayed when our dogtags / its clothes / its wearer is examined + var/display = "Nothing!" + +/obj/item/clothing/accessory/dogtag/examine(mob/user) + . = ..() + . += display + +// Examining the clothes will display the examine message of the dogtag +/obj/item/clothing/accessory/dogtag/attach(obj/item/clothing/under/attach_to, mob/living/attacher) + . = ..() + if(!.) + return + RegisterSignal(attach_to, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + +/obj/item/clothing/accessory/dogtag/detach(obj/item/clothing/under/detach_from) + . = ..() + UnregisterSignal(detach_from, COMSIG_ATOM_EXAMINE) + +// Double examining the person wearing the clothes will display the examine message of the dogtag +/obj/item/clothing/accessory/dogtag/accessory_equipped(obj/item/clothing/under/clothes, mob/living/user) + RegisterSignal(user, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(on_examine)) + +/obj/item/clothing/accessory/dogtag/accessory_dropped(obj/item/clothing/under/clothes, mob/living/user) + UnregisterSignal(user, COMSIG_ATOM_EXAMINE_MORE) + +/// Adds the examine message to the clothes and mob. +/obj/item/clothing/accessory/dogtag/proc/on_examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + // Only show the examine message if we're close (2 tiles) + if(!IN_GIVEN_RANGE(get_turf(user), get_turf(src), 2)) + return + + if(ismob(source)) + // Examining a mob wearing the clothes, wearing the dogtag will also show the message + examine_list += "A dogtag is hanging around [source.p_their()] neck: [display]" + else + examine_list += "A dogtag is attached to [source]: [display]" + +/obj/item/clothing/accessory/dogtag/allergy + name = "Allergy dogtag" + desc = "A dogtag with a listing of allergies." + +/obj/item/clothing/accessory/dogtag/allergy/Initialize(mapload, allergy_string) + . = ..() + if(allergy_string) + display = span_notice("The dogtag has a listing of allergies: [allergy_string]") + else + display = span_notice("The dogtag is all scratched up.") + +/// Reskins for the pride pin accessory, mapped by display name to icon state +GLOBAL_LIST_INIT(pride_pin_reskins, list( + "Rainbow Pride" = "pride", + "Bisexual Pride" = "pride_bi", + "Pansexual Pride" = "pride_pan", + "Asexual Pride" = "pride_ace", + "Non-binary Pride" = "pride_enby", + "Transgender Pride" = "pride_trans", + "Intersex Pride" = "pride_intersex", + "Lesbian Pride" = "pride_lesbian", +)) + +/obj/item/clothing/accessory/pride + name = "pride pin" + desc = "A Nanotrasen Diversity & Inclusion Center-sponsored holographic pin to show off your pride, reminding the crew of their unwavering commitment to equity, diversity, and inclusion!" + icon_state = "pride" + obj_flags = UNIQUE_RENAME + infinite_reskin = TRUE + +/obj/item/clothing/accessory/pride/Initialize(mapload) + . = ..() + unique_reskin = GLOB.pride_pin_reskins + +/obj/item/clothing/accessory/deaf_pin + name = "deaf personnel pin" + desc = "Indicates that the wearer is deaf." + icon_state = "deaf_pin" + +///Awarded for being dutiful and extinguishing the debt from the "Indebted" quirk. +/obj/item/clothing/accessory/debt_payer_pin + name = "debt payer pin" + desc = "I've paid my debt and all I've got was this pin." + icon_state = "debt_payer_pin" diff --git a/code/modules/clothing/under/accessories/medals.dm b/code/modules/clothing/under/accessories/medals.dm new file mode 100644 index 0000000000000..cc91e286e2c80 --- /dev/null +++ b/code/modules/clothing/under/accessories/medals.dm @@ -0,0 +1,206 @@ +/obj/item/clothing/accessory/medal + name = "bronze medal" + desc = "A bronze medal." + icon_state = "bronze" + custom_materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT) + resistance_flags = FIRE_PROOF + /// Sprite used for medalbox + var/medaltype = "medal" + /// Has this been use for a commendation? + var/commendation_message + /// Who was first given this medal + var/awarded_to + /// Who gave out this medal + var/awarder + +/// Callback for do_after to check if we can still be pinned +/obj/item/clothing/accessory/medal/proc/pin_checks(mob/living/pinner, mob/living/carbon/human/pinning_on) + if(QDELETED(src) || QDELETED(pinner) || QDELETED(pinning_on)) + return FALSE + if(!pinner.is_holding(src) || !pinner.Adjacent(pinning_on)) + return FALSE + var/obj/item/clothing/under/pinning_on_uniform = pinning_on.w_uniform + if(!istype(pinning_on_uniform) || !can_attach_accessory(pinning_on_uniform, pinner)) + return FALSE + return TRUE + +/obj/item/clothing/accessory/medal/pre_attack(atom/target, mob/living/user, params) + . = ..() + if(.) + return + if(!ishuman(target) || target == user) + return + + . = TRUE // no attack chain please + + var/mob/living/carbon/human/distinguished = target + var/obj/item/clothing/under/distinguished_uniform = distinguished.w_uniform + if(!istype(distinguished_uniform)) + distinguished.balloon_alert(user, "no uniform to pin on!") + return . + if(!can_attach_accessory(distinguished_uniform, user)) + // Check handles feedback messages and etc + return . + + user.visible_message( + span_notice("[user] tries to pin [src] on [distinguished]'s chest."), + span_notice("You try to pin [src] on [distinguished]'s chest."), + ) + + commendation_message = tgui_input_text(user, "Reason for this commendation? It will be recorded by Nanotrasen.", "Commendation", max_length = 140) + if(!commendation_message || !pin_checks(user, distinguished)) + return . + if(!do_after(user, 2 SECONDS, distinguished, extra_checks = CALLBACK(src, PROC_REF(pin_checks), user, distinguished))) + return . + + if(distinguished_uniform.attach_accessory(src, user)) + user.visible_message( + span_notice("[user] pins [src] on [distinguished]'s chest."), + span_notice("You pin [src] on [distinguished]'s chest."), + ) + else + user.visible_message( + span_warning("[user] fails to pin [src] on [distinguished]'s chest, seemingly unable to part with it."), + span_warning("You fail to pin [src] on [distinguished]'s chest."), + ) + + return . + +/obj/item/clothing/accessory/medal/attach(obj/item/clothing/under/attach_to, mob/living/attacher) + var/mob/living/distinguished = attach_to.loc + if(isnull(attacher) || !istype(distinguished) || distinguished == attacher || awarded_to) + // You can't be awarded by nothing, you can't award yourself, and you can't be awarded someone else's medal + return ..() + + awarder = attacher.real_name + awarded_to = distinguished.real_name + + update_appearance(UPDATE_DESC) + add_memory_in_range(distinguished, 7, /datum/memory/received_medal, protagonist = distinguished, deuteragonist = attacher, medal_type = src, medal_text = commendation_message) + distinguished.log_message("was given the following commendation by [key_name(attacher)]: [commendation_message]", LOG_GAME, color = "green") + message_admins("[key_name_admin(distinguished)] was given the following commendation by [key_name_admin(attacher)]: [commendation_message]") + GLOB.commendations += "[awarder] awarded [awarded_to] the [name]! \n- [commendation_message]" + SSblackbox.record_feedback("associative", "commendation", 1, list("commender" = "[awarder]", "commendee" = "[awarded_to]", "medal" = "[src]", "reason" = commendation_message)) + + return ..() + +/obj/item/clothing/accessory/medal/update_desc(updates) + . = ..() + if(commendation_message && awarded_to && awarder) + desc += span_info("
    The inscription reads: [commendation_message] - Awarded to [awarded_to] by [awarder]") + +/obj/item/clothing/accessory/medal/conduct + name = "distinguished conduct medal" + desc = "A bronze medal awarded for distinguished conduct. Whilst a great honor, this is the most basic award given by Nanotrasen. It is often awarded by a captain to a member of his crew." + +/obj/item/clothing/accessory/medal/bronze_heart + name = "bronze heart medal" + desc = "A bronze heart-shaped medal awarded for sacrifice. It is often awarded posthumously or for severe injury in the line of duty." + icon_state = "bronze_heart" + +/obj/item/clothing/accessory/medal/ribbon + name = "ribbon" + desc = "A ribbon" + icon_state = "cargo" + +/obj/item/clothing/accessory/medal/ribbon/cargo + name = "\"cargo tech 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 + name = "silver medal" + desc = "A silver medal." + icon_state = "silver" + medaltype = "medal-silver" + custom_materials = list(/datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT) + +/obj/item/clothing/accessory/medal/silver/valor + name = "medal of valor" + desc = "A silver medal awarded for acts of exceptional valor." + +/obj/item/clothing/accessory/medal/silver/security + name = "robust security award" + desc = "An award for distinguished combat and sacrifice in defence of Nanotrasen's commercial interests. Often awarded to security staff." + +/obj/item/clothing/accessory/medal/silver/excellence + name = "\proper the head of personnel award for outstanding achievement in the field of excellence" + desc = "Nanotrasen's dictionary defines excellence as \"the quality or condition of being excellent\". This is awarded to those rare crewmembers who fit that definition." + +/obj/item/clothing/accessory/medal/silver/bureaucracy + name = "\improper Excellence in Bureaucracy Medal" + desc = "Awarded for exemplary managerial services rendered while under contract with Nanotrasen." + +/obj/item/clothing/accessory/medal/gold + name = "gold medal" + desc = "A prestigious golden medal." + icon_state = "gold" + medaltype = "medal-gold" + custom_materials = list(/datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT) + +/obj/item/clothing/accessory/medal/med_medal + name = "exemplary performance medal" + desc = "A medal awarded to those who have shown distinguished conduct, performance, and initiative within the medical department." + icon_state = "med_medal" + +/obj/item/clothing/accessory/medal/med_medal2 + name = "excellence in medicine medal" + desc = "A medal awarded to those who have shown legendary performance, competence, and initiative beyond all expectations within the medical department." + icon_state = "med_medal2" + +/obj/item/clothing/accessory/medal/gold/captain + name = "medal of captaincy" + desc = "A golden medal awarded exclusively to those promoted to the rank of captain. It signifies the codified responsibilities of a captain to Nanotrasen, and their undisputable authority over their crew." + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF + +/obj/item/clothing/accessory/medal/gold/heroism + name = "medal of exceptional heroism" + desc = "An extremely rare golden medal awarded only by CentCom. To receive such a medal is the highest honor and as such, very few exist. This medal is almost never awarded to anybody but commanders." + +/obj/item/clothing/accessory/medal/plasma + name = "plasma medal" + desc = "An eccentric medal made of plasma." + icon_state = "plasma" + medaltype = "medal-plasma" + custom_materials = list(/datum/material/plasma = HALF_SHEET_MATERIAL_AMOUNT) + +/obj/item/clothing/accessory/medal/plasma/Initialize(mapload) + . = ..() + AddElement(/datum/element/atmos_sensitive, mapload) + +/obj/item/clothing/accessory/medal/plasma/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return exposed_temperature > 300 + +/obj/item/clothing/accessory/medal/plasma/atmos_expose(datum/gas_mixture/air, exposed_temperature) + atmos_spawn_air("[GAS_PLASMA]=20;[TURF_TEMPERATURE(exposed_temperature)]") + visible_message(span_danger("\The [src] bursts into flame!"), span_userdanger("Your [src] bursts into flame!")) + qdel(src) + +/obj/item/clothing/accessory/medal/plasma/nobel_science + name = "nobel sciences award" + desc = "A plasma medal which represents significant contributions to the field of science or engineering." + +/obj/item/clothing/accessory/medal/silver/emergency_services + name = "emergency services award" + desc = "A silver medal awarded to the outstanding emergency service workers of Nanotrasen, those who work tirelessly together through adversity to keep their crew safe and breathing in the harsh environments of outer space." + icon_state = "emergencyservices" + + /// Flavor text that is appended to the description. + var/insignia_desc = null + +/obj/item/clothing/accessory/medal/silver/emergency_services/Initialize(mapload) + . = ..() + if(istext(insignia_desc)) + desc += " [insignia_desc]" + +/obj/item/clothing/accessory/medal/silver/emergency_services/engineering + icon_state = "emergencyservices_engi" + insignia_desc = "The back of the medal bears an orange wrench." + +/obj/item/clothing/accessory/medal/silver/emergency_services/medical + icon_state = "emergencyservices_med" + insignia_desc = "The back of the medal bears a dark blue cross." + +/obj/item/clothing/accessory/medal/silver/elder_atmosian + name = "atmospheric mastery award" + desc = "Often referred to as the \"elder atmosian\" award, this medal is awarded to the exemplary scientists and technicians who push the boundaries and demonstrate mastery of atmospherics." + icon_state = "elderatmosian" diff --git a/code/modules/clothing/under/accessories/tribal.dm b/code/modules/clothing/under/accessories/tribal.dm new file mode 100644 index 0000000000000..ad55b26fa89fd --- /dev/null +++ b/code/modules/clothing/under/accessories/tribal.dm @@ -0,0 +1,19 @@ +// Tribal undershirt accessories, made from bone or sinew. +/obj/item/clothing/accessory/talisman + name = "bone talisman" + desc = "A hunter's talisman, some say the old gods smile on those who wear it." + icon_state = "talisman" + attachment_slot = NONE + +/obj/item/clothing/accessory/skullcodpiece + name = "skull codpiece" + desc = "A skull shaped ornament, intended to protect the important things in life." + icon_state = "skull" + attachment_slot = GROIN + +/obj/item/clothing/accessory/skilt + name = "Sinew Skirt" + desc = "For the last time. IT'S A KILT not a skirt." + icon_state = "skilt" + minimize_when_attached = FALSE + attachment_slot = GROIN diff --git a/code/modules/clothing/under/accessories/vests.dm b/code/modules/clothing/under/accessories/vests.dm new file mode 100644 index 0000000000000..83bbc789bdd0e --- /dev/null +++ b/code/modules/clothing/under/accessories/vests.dm @@ -0,0 +1,44 @@ +// Accessories that mostly or entirely cover a shirt. +/obj/item/clothing/accessory/waistcoat + name = "waistcoat" + desc = "For some classy, murderous fun." + icon_state = "waistcoat" + inhand_icon_state = "wcoat" + lefthand_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi' + righthand_file = 'icons/mob/inhands/clothing/suits_righthand.dmi' + minimize_when_attached = FALSE + attachment_slot = NONE + greyscale_config = /datum/greyscale_config/waistcoat + greyscale_config_worn = /datum/greyscale_config/waistcoat/worn + greyscale_colors = "#414344" + flags_1 = IS_PLAYER_COLORABLE_1 + +/obj/item/clothing/accessory/vest_sheriff + name = "sheriff vest" + desc = "Now you just have to pick your favourite deputy." + icon_state = "vest_sheriff" + lefthand_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi' + righthand_file = 'icons/mob/inhands/clothing/suits_righthand.dmi' + inhand_icon_state = "vest_sheriff" + minimize_when_attached = TRUE + attachment_slot = NONE + +/obj/item/clothing/accessory/maidcorset + name = "maid corset" + desc = "The final touch that holds it all together." + icon_state = "maidcorset" + inhand_icon_state = "maidapron" + lefthand_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi' + righthand_file = 'icons/mob/inhands/clothing/suits_righthand.dmi' + minimize_when_attached = FALSE + attachment_slot = NONE + +/obj/item/clothing/accessory/maidapron + name = "maid apron" + desc = "The best part of a maid costume." + icon_state = "maidapron" + inhand_icon_state = "maidapron" + lefthand_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi' + righthand_file = 'icons/mob/inhands/clothing/suits_righthand.dmi' + minimize_when_attached = FALSE + attachment_slot = NONE diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index 3c30e24ea7fb0..748e697415c54 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -4,9 +4,9 @@ dying_key = DYE_REGISTRY_UNDER greyscale_colors = "#3f3f3f" greyscale_config = /datum/greyscale_config/jumpsuit - greyscale_config_inhand_left = /datum/greyscale_config/jumpsuit_inhand_left - greyscale_config_inhand_right = /datum/greyscale_config/jumpsuit_inhand_right - greyscale_config_worn = /datum/greyscale_config/jumpsuit_worn + greyscale_config_worn = /datum/greyscale_config/jumpsuit/worn + greyscale_config_inhand_left = /datum/greyscale_config/jumpsuit/inhand_left + greyscale_config_inhand_right = /datum/greyscale_config/jumpsuit/inhand_right icon = 'icons/obj/clothing/under/color.dmi' icon_state = "jumpsuit" inhand_icon_state = "jumpsuit" diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm index fd7db5abb1201..d4e41696219d8 100644 --- a/code/modules/clothing/under/costume.dm +++ b/code/modules/clothing/under/costume.dm @@ -90,7 +90,7 @@ /obj/item/clothing/under/costume/kilt/highlander/Initialize(mapload) . = ..() - ADD_TRAIT(src, TRAIT_NODROP, HIGHLANDER) + ADD_TRAIT(src, TRAIT_NODROP, HIGHLANDER_TRAIT) /obj/item/clothing/under/costume/gladiator name = "gladiator uniform" @@ -247,15 +247,14 @@ inhand_icon_state = null worn_icon = 'icons/mob/clothing/under/security.dmi' alt_covers_chest = TRUE - armor_type = /datum/armor/costume_russian_officer + armor_type = /datum/armor/clothing_under/costume_russian_officer strip_delay = 50 sensor_mode = SENSOR_COORDS random_sensor = FALSE can_adjust = FALSE -/datum/armor/costume_russian_officer +/datum/armor/clothing_under/costume_russian_officer melee = 10 - bio = 10 fire = 30 acid = 30 @@ -266,26 +265,45 @@ icon = 'icons/obj/clothing/under/shorts_pants_shirts.dmi' worn_icon = 'icons/mob/clothing/under/shorts_pants_shirts.dmi' species_exception = list(/datum/species/golem) - can_adjust = FALSE + can_adjust = TRUE + alt_covers_chest = TRUE /obj/item/clothing/under/costume/buttondown/slacks name = "buttondown shirt with slacks" desc = "A fancy buttondown shirt with slacks." icon_state = "buttondown_slacks" greyscale_config = /datum/greyscale_config/buttondown_slacks - greyscale_config_worn = /datum/greyscale_config/buttondown_slacks_worn + greyscale_config_worn = /datum/greyscale_config/buttondown_slacks/worn greyscale_colors = "#EEEEEE#EE8E2E#222227#D8D39C" flags_1 = IS_PLAYER_COLORABLE_1 +/obj/item/clothing/under/costume/buttondown/slacks/service //preset one to be a formal white shirt and black pants + greyscale_colors = "#EEEEEE#CBDBFC#17171B#222227" + /obj/item/clothing/under/costume/buttondown/shorts name = "buttondown shirt with shorts" desc = "A fancy buttondown shirt with shorts." icon_state = "buttondown_shorts" greyscale_config = /datum/greyscale_config/buttondown_shorts - greyscale_config_worn = /datum/greyscale_config/buttondown_shorts_worn + greyscale_config_worn = /datum/greyscale_config/buttondown_shorts/worn greyscale_colors = "#EEEEEE#EE8E2E#222227#D8D39C" flags_1 = IS_PLAYER_COLORABLE_1 +/obj/item/clothing/under/costume/buttondown/skirt + name = "buttondown shirt with skirt" + desc = "A fancy buttondown shirt with skirt." + icon_state = "buttondown_skirt" + greyscale_config = /datum/greyscale_config/buttondown_skirt + greyscale_config_worn = /datum/greyscale_config/buttondown_skirt/worn + greyscale_colors = "#EEEEEE#EE8E2E#222227#D8D39C" + body_parts_covered = CHEST|GROIN|ARMS + flags_1 = IS_PLAYER_COLORABLE_1 + female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON + +/obj/item/clothing/under/costume/buttondown/skirt/service //preset one to be a formal white shirt and black skirt + greyscale_colors = "#EEEEEE#CBDBFC#17171B#222227" + /obj/item/clothing/under/costume/jackbros name = "jack bros outfit" desc = "For when it's time to hee some hos." @@ -304,7 +322,7 @@ icon_state = "football_suit" can_adjust = FALSE greyscale_config = /datum/greyscale_config/football_suit - greyscale_config_worn = /datum/greyscale_config/football_suit_worn + greyscale_config_worn = /datum/greyscale_config/football_suit/worn greyscale_colors = "#D74722" flags_1 = IS_PLAYER_COLORABLE_1 @@ -360,3 +378,32 @@ inhand_icon_state = null female_sprite_flags = NO_FEMALE_UNIFORM can_adjust = FALSE + +/obj/item/clothing/under/costume/traditional + name = "Traditional Suit" + desc = "A full, vibrantly coloured suit. Likely with traditional purposes. Maybe the colours represent a familly, clan, or rank, who knows." + icon_state = "tradition" + inhand_icon_state = null + female_sprite_flags = NO_FEMALE_UNIFORM + can_adjust = FALSE + +/obj/item/clothing/under/costume/loincloth + name = "Leather Loincloth" + desc = "Just a piece of leather to cover private areas. Itchy to the touch. Whoever made this must have been desperate, or savage." + icon_state = "loincloth" + inhand_icon_state = null + body_parts_covered = GROIN + female_sprite_flags = NO_FEMALE_UNIFORM + can_adjust = TRUE + alt_covers_chest = TRUE + +/obj/item/clothing/under/costume/henchmen + name = "henchmen jumpsuit" + desc = "A very gaudy jumpsuit for a proper Henchman. Guild regulations, you understand." + icon = 'icons/obj/clothing/under/syndicate.dmi' + worn_icon = 'icons/mob/clothing/under/syndicate.dmi' + icon_state = "henchmen" + inhand_icon_state = null + body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS|HEAD + flags_inv = HIDEGLOVES|HIDESHOES|HIDEEARS|HIDEEYES|HIDEHAIR + diff --git a/code/modules/clothing/under/ethereal.dm b/code/modules/clothing/under/ethereal.dm index d93302038a59b..0028ae3ac1bba 100644 --- a/code/modules/clothing/under/ethereal.dm +++ b/code/modules/clothing/under/ethereal.dm @@ -1,12 +1,12 @@ /obj/item/clothing/under/ethereal_tunic name = "ethereal tunic" desc = "A simple sleeveless tunic worn over an undersuit, it glows in the dark!" - icon = 'icons/obj/clothing/under/ethereal.dmi' icon_state = "eth_tunic" + icon = 'icons/obj/clothing/under/ethereal.dmi' worn_icon = 'icons/mob/clothing/under/ethereal.dmi' greyscale_colors = "#4e7cc7" greyscale_config = /datum/greyscale_config/eth_tunic - greyscale_config_worn = /datum/greyscale_config/eth_tunic_worn + greyscale_config_worn = /datum/greyscale_config/eth_tunic/worn flags_1 = IS_PLAYER_COLORABLE_1 can_adjust = FALSE @@ -17,7 +17,7 @@ /obj/item/clothing/under/ethereal_tunic/worn_overlays(mutable_appearance/standing, isinhands, icon_file) . = ..() if(!isinhands) - . += emissive_appearance('icons/mob/clothing/under/ethereal.dmi', "eth_tunic_emissive_worn", offset_spokesman = src, alpha = src.alpha) + . += emissive_appearance('icons/mob/clothing/under/ethereal.dmi', "eth_tunic_emissive", offset_spokesman = src, alpha = src.alpha) /obj/item/clothing/under/ethereal_tunic/update_overlays() . = ..() diff --git a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm index 42e6ab52f55de..a8674b03c943a 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' clothing_flags = PLASMAMAN_PREVENT_IGNITION - armor_type = /datum/armor/under_plasmaman + armor_type = /datum/armor/clothing_under/plasmaman body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS can_adjust = FALSE strip_delay = 80 @@ -15,7 +15,7 @@ var/extinguish_cooldown = 100 var/extinguishes_left = 5 -/datum/armor/under_plasmaman +/datum/armor/clothing_under/plasmaman bio = 100 fire = 95 acid = 95 @@ -115,6 +115,16 @@ icon_state = "clown_envirosuit" inhand_icon_state = null +/obj/item/clothing/under/plasmaman/bitrunner + name = "bitrunner envirosuit" + desc = "An envirosuit specially designed for plasmamen with bad posture." + icon_state = "bitrunner_envirosuit" + inhand_icon_state = null + +/obj/item/clothing/under/plasmaman/clown/Initialize(mapload) + . = ..() + AddElement(/datum/element/swabable, CELL_LINE_TABLE_CLOWN, CELL_VIRUS_TABLE_GENERIC, rand(2,3), 0) + /obj/item/clothing/under/plasmaman/prisoner name = "prisoner envirosuit" desc = "An orange envirosuit identifying and protecting a criminal plasmaman. Its suit sensors are stuck in the \"Fully On\" position." diff --git a/code/modules/clothing/under/jobs/Plasmaman/command.dm b/code/modules/clothing/under/jobs/Plasmaman/command.dm index 797d04fe8842d..8713edb558819 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/command.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/command.dm @@ -5,13 +5,12 @@ inhand_icon_state = null sensor_mode = SENSOR_COORDS random_sensor = FALSE - armor_type = /datum/armor/plasmaman_captain + armor_type = /datum/armor/clothing_under/rank_captain/plasmaman -/datum/armor/plasmaman_captain +/datum/armor/clothing_under/rank_captain/plasmaman bio = 100 fire = 95 acid = 95 - wound = 15 /obj/item/clothing/under/plasmaman/head_of_personnel name = "head of personnel's plasma envirosuit" @@ -24,11 +23,11 @@ desc = "A plasmaman containment suit decorated for those few with the dedication to achieve the position of Head of Security." icon_state = "hos_envirosuit" inhand_icon_state = null - armor_type = /datum/armor/security_head_of_security/plasmaman + armor_type = /datum/armor/clothing_under/security_head_of_security/plasmaman sensor_mode = SENSOR_COORDS random_sensor = FALSE -/datum/armor/security_head_of_security/plasmaman +/datum/armor/clothing_under/security_head_of_security/plasmaman bio = 100 fire = 95 acid = 95 @@ -38,9 +37,9 @@ 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 = null - armor_type = /datum/armor/plasmaman_chief_engineer + armor_type = /datum/armor/clothing_under/engineering_chief_engineer/plasmaman -/datum/armor/plasmaman_chief_engineer +/datum/armor/clothing_under/engineering_chief_engineer/plasmaman bio = 100 fire = 95 acid = 95 @@ -50,21 +49,15 @@ desc = "It's an envirosuit worn by those with the experience to be \"Chief Medical Officer\"." icon_state = "cmo_envirosuit" inhand_icon_state = null - armor_type = /datum/armor/plasmaman_chief_medical_officer - -/datum/armor/plasmaman_chief_medical_officer - 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 = null - armor_type = /datum/armor/plasmaman_research_director + armor_type = /datum/armor/clothing_under/rnd_research_director/plasmaman -/datum/armor/plasmaman_research_director +/datum/armor/clothing_under/rnd_research_director/plasmaman 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 199ba279f912b..26d06038131c4 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/engineering.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/engineering.dm @@ -3,9 +3,9 @@ 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 = null - armor_type = /datum/armor/plasmaman_engineering + armor_type = /datum/armor/clothing_under/plasmaman_engineering -/datum/armor/plasmaman_engineering +/datum/armor/clothing_under/plasmaman_engineering bio = 100 fire = 95 acid = 95 @@ -15,10 +15,10 @@ 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" inhand_icon_state = null - armor_type = /datum/armor/plasmaman_atmospherics + armor_type = /datum/armor/clothing_under/plasmaman_atmospherics -/datum/armor/plasmaman_atmospherics +/datum/armor/clothing_under/plasmaman_atmospherics bio = 100 fire = 95 acid = 95 diff --git a/code/modules/clothing/under/jobs/Plasmaman/security.dm b/code/modules/clothing/under/jobs/Plasmaman/security.dm index b6234a940d1a8..375320b39ddf7 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/security.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/security.dm @@ -3,11 +3,11 @@ desc = "A plasmaman containment suit designed for security officers, offering a limited amount of extra protection." icon_state = "security_envirosuit" inhand_icon_state = null - armor_type = /datum/armor/rank_security/plasmaman + armor_type = /datum/armor/clothing_under/rank_security/plasmaman sensor_mode = SENSOR_COORDS random_sensor = FALSE -/datum/armor/rank_security/plasmaman +/datum/armor/clothing_under/rank_security/plasmaman bio = 100 fire = 95 acid = 95 diff --git a/code/modules/clothing/under/jobs/cargo.dm b/code/modules/clothing/under/jobs/cargo.dm index d4c9ca4268c95..e3145fb740d71 100644 --- a/code/modules/clothing/under/jobs/cargo.dm +++ b/code/modules/clothing/under/jobs/cargo.dm @@ -3,32 +3,36 @@ worn_icon = 'icons/mob/clothing/under/cargo.dmi' /obj/item/clothing/under/rank/cargo/qm - name = "quartermaster's jumpsuit" - desc = "It's a jumpsuit worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper." + name = "quartermaster's uniform" + desc = "A brown dress shirt, coupled with a pair of black slacks. It's specially designed to prevent back injuries caused by pushing paper." icon_state = "qm" inhand_icon_state = "lb_suit" /obj/item/clothing/under/rank/cargo/qm/skirt - name = "quartermaster's jumpskirt" - desc = "It's a jumpskirt worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper." + name = "quartermaster's skirt" + desc = "A brown dress shirt, coupled with a long pleated black skirt. It's specially designed to prevent back injuries caused by pushing paper." icon_state = "qm_skirt" inhand_icon_state = "lb_suit" body_parts_covered = CHEST|GROIN|ARMS dying_key = DYE_REGISTRY_JUMPSKIRT - female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY - supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON /obj/item/clothing/under/rank/cargo/tech - name = "cargo technician's jumpsuit" - desc = "Shooooorts! They're comfy and easy to wear!" + name = "cargo technician's uniform" + desc = "A brown sweater and black jeans, because, honestly, who likes shorts?" icon_state = "cargotech" inhand_icon_state = "lb_suit" + +/obj/item/clothing/under/rank/cargo/tech/alt + name = "cargo technician's shorts" + desc = "I like shooooorts! They're comfy and easy to wear!" + icon_state = "cargotech_alt" + inhand_icon_state = "lb_suit" body_parts_covered = CHEST|GROIN|ARMS supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION /obj/item/clothing/under/rank/cargo/tech/skirt - name = "cargo technician's jumpskirt" - desc = "Skiiiiirts! They're comfy and easy to wear!" + name = "cargo technician's skirt" + desc = "A brown sweater and a black skirt to match." icon_state = "cargo_skirt" inhand_icon_state = "lb_suit" body_parts_covered = CHEST|GROIN|ARMS @@ -36,21 +40,31 @@ dying_key = DYE_REGISTRY_JUMPSKIRT female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY +/obj/item/clothing/under/rank/cargo/tech/skirt/alt + name = "cargo technician's shortskirt" + desc = "I like skiiiiirts! They're comfy and easy to wear!" + icon_state = "cargo_skirt_alt" + /obj/item/clothing/under/rank/cargo/miner - desc = "It's a snappy jumpsuit with a sturdy set of overalls. It is very dirty." name = "shaft miner's jumpsuit" + desc = "It's a snappy jumpsuit with a sturdy set of overalls. It is very dirty." icon_state = "miner" inhand_icon_state = null - armor_type = /datum/armor/cargo_miner + armor_type = /datum/armor/clothing_under/cargo_miner resistance_flags = NONE -/datum/armor/cargo_miner - bio = 10 +/datum/armor/clothing_under/cargo_miner fire = 80 wound = 10 /obj/item/clothing/under/rank/cargo/miner/lavaland - desc = "A green uniform for operating in hazardous environments." name = "shaft miner's jumpsuit" + desc = "A grey uniform for operating in hazardous environments." icon_state = "explorer" inhand_icon_state = null + +/obj/item/clothing/under/rank/cargo/bitrunner + name = "bitrunner's jumpsuit" + desc = "It's a leathery jumpsuit worn by a bitrunner. Tacky, but comfortable to wear if sitting for prolonged periods of time." + icon_state = "bitrunner" + inhand_icon_state = "w_suit" diff --git a/code/modules/clothing/under/jobs/centcom.dm b/code/modules/clothing/under/jobs/centcom.dm index 2ed48e066dde4..da1fe5d7a1d76 100644 --- a/code/modules/clothing/under/jobs/centcom.dm +++ b/code/modules/clothing/under/jobs/centcom.dm @@ -60,13 +60,13 @@ desc = "A dark colored uniform worn by CentCom's conscripted military forces." icon_state = "military" inhand_icon_state = "bl_suit" - armor_type = /datum/armor/centcom_military + armor_type = /datum/armor/clothing_under/centcom_military -/datum/armor/centcom_military +/datum/armor/clothing_under/centcom_military melee = 10 - bio = 10 fire = 50 acid = 40 + wound = 10 /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 767ff14b83cba..35eb2db3029dd 100644 --- a/code/modules/clothing/under/jobs/civilian/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian/civilian.dm @@ -4,29 +4,12 @@ icon = 'icons/obj/clothing/under/civilian.dmi' worn_icon = 'icons/mob/clothing/under/civilian.dmi' -/obj/item/clothing/under/rank/civilian/bartender - desc = "It looks like it could use some more flair." - name = "bartender's uniform" - icon_state = "barman" - inhand_icon_state = "bar_suit" - alt_covers_chest = TRUE - -/obj/item/clothing/under/rank/civilian/bartender/purple +/obj/item/clothing/under/rank/civilian/purple_bartender desc = "It looks like it has lots of flair!" name = "purple bartender's uniform" icon_state = "purplebartender" can_adjust = FALSE -/obj/item/clothing/under/rank/civilian/bartender/skirt - name = "bartender's skirt" - desc = "It looks like it could use some more flair." - icon_state = "barman_skirt" - inhand_icon_state = "bar_suit" - body_parts_covered = CHEST|GROIN|ARMS - dying_key = DYE_REGISTRY_JUMPSKIRT - female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY - supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON - /obj/item/clothing/under/rank/civilian/chaplain desc = "It's a black jumpsuit, often worn by religious folk." name = "chaplain's jumpsuit" @@ -44,22 +27,6 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON -/obj/item/clothing/under/rank/civilian/chef - name = "cook's suit" - desc = "A suit which is given only to the most hardcore cooks in space." - icon_state = "chef" - inhand_icon_state = "chef" - alt_covers_chest = TRUE - -/obj/item/clothing/under/rank/civilian/chef/skirt - name = "cook's skirt" - desc = "A skirt which is given only to the most hardcore cooks in space." - icon_state = "chef_skirt" - body_parts_covered = CHEST|GROIN|ARMS - dying_key = DYE_REGISTRY_JUMPSKIRT - female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY - supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON - /obj/item/clothing/under/rank/civilian/head_of_personnel desc = "A slick uniform worn by those to earn the position of \"Head of Personnel\"." name = "head of personnel's uniform" @@ -98,9 +65,9 @@ name = "botanist's jumpsuit" icon_state = "hydroponics" inhand_icon_state = "g_suit" - armor_type = /datum/armor/civilian_hydroponics + armor_type = /datum/armor/clothing_under/civilian_hydroponics -/datum/armor/civilian_hydroponics +/datum/armor/clothing_under/civilian_hydroponics bio = 50 /obj/item/clothing/under/rank/civilian/hydroponics/skirt @@ -118,9 +85,9 @@ name = "janitor's jumpsuit" icon_state = "janitor" inhand_icon_state = "janitor" - armor_type = /datum/armor/civilian_janitor + armor_type = /datum/armor/clothing_under/civilian_janitor -/datum/armor/civilian_janitor +/datum/armor/clothing_under/civilian_janitor bio = 10 /obj/item/clothing/under/rank/civilian/janitor/skirt @@ -142,8 +109,10 @@ can_adjust = FALSE /obj/item/clothing/under/rank/civilian/lawyer - desc = "Slick threads." name = "Lawyer suit" + desc = "Slick threads." + icon = 'icons/obj/clothing/under/suits.dmi' + worn_icon = 'icons/mob/clothing/under/suits.dmi' can_adjust = FALSE /obj/item/clothing/under/rank/civilian/lawyer/dye_item(dye_color, dye_key_override) @@ -173,14 +142,12 @@ desc = "A tacky suit perfect for a CRIMINAL lawyer!" icon_state = "good_suit" inhand_icon_state = "good_suit" - worn_icon = 'icons/mob/clothing/under/suits.dmi' /obj/item/clothing/under/rank/civilian/lawyer/beige/skirt name = "good lawyer's suitskirt" desc = "A tacky suitskirt perfect for a CRIMINAL lawyer!" icon_state = "good_suit_skirt" inhand_icon_state = "good_suit" - worn_icon = 'icons/mob/clothing/under/suits.dmi' dying_key = DYE_REGISTRY_JUMPSKIRT female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON @@ -212,18 +179,21 @@ supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON /obj/item/clothing/under/rank/civilian/lawyer/bluesuit - name = "blue suit" - desc = "A classy suit." - icon_state = "bluesuit" - inhand_icon_state = "b_suit" + name = "blue buttondown suit" + icon = 'icons/obj/clothing/under/shorts_pants_shirts.dmi' + worn_icon = 'icons/mob/clothing/under/shorts_pants_shirts.dmi' + icon_state = "buttondown_slacks" + greyscale_config = /datum/greyscale_config/buttondown_slacks + greyscale_config_worn = /datum/greyscale_config/buttondown_slacks/worn + greyscale_colors = "#EEEEEE#CBDBFC#17171B#2B65A8" can_adjust = TRUE alt_covers_chest = TRUE /obj/item/clothing/under/rank/civilian/lawyer/bluesuit/skirt - name = "blue suitskirt" - desc = "A classy suitskirt." - icon_state = "bluesuit_skirt" - inhand_icon_state = "b_suit" + name = "blue buttondown suitskirt" + icon_state = "buttondown_skirt" + greyscale_config = /datum/greyscale_config/buttondown_skirt + greyscale_config_worn = /datum/greyscale_config/buttondown_skirt/worn body_parts_covered = CHEST|GROIN|ARMS dying_key = DYE_REGISTRY_JUMPSKIRT female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY @@ -247,6 +217,7 @@ supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON /obj/item/clothing/under/rank/civilian/lawyer/galaxy + icon = 'icons/obj/clothing/under/lawyer_galaxy.dmi' worn_icon = 'icons/mob/clothing/under/lawyer_galaxy.dmi' can_adjust = FALSE name = "blue galaxy suit" diff --git a/code/modules/clothing/under/jobs/civilian/curator.dm b/code/modules/clothing/under/jobs/civilian/curator.dm index 1e459604e205e..8f40e623d8adf 100644 --- a/code/modules/clothing/under/jobs/civilian/curator.dm +++ b/code/modules/clothing/under/jobs/civilian/curator.dm @@ -35,11 +35,11 @@ inhand_icon_state = "jumpsuit" greyscale_colors = "#3f3f3f" greyscale_config = /datum/greyscale_config/jumpsuit - greyscale_config_inhand_left = /datum/greyscale_config/jumpsuit_inhand_left - greyscale_config_inhand_right = /datum/greyscale_config/jumpsuit_inhand_right - greyscale_config_worn = /datum/greyscale_config/jumpsuit_worn + greyscale_config_worn = /datum/greyscale_config/jumpsuit/worn + greyscale_config_inhand_left = /datum/greyscale_config/jumpsuit/inhand_left + greyscale_config_inhand_right = /datum/greyscale_config/jumpsuit/inhand_right w_class = WEIGHT_CLASS_BULKY - armor_type = /datum/armor/curator_nasa + armor_type = /datum/armor/clothing_under/curator_nasa body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS cold_protection = CHEST | GROIN | LEGS | ARMS //Needs gloves and shoes with cold protection to be fully protected. min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT @@ -48,5 +48,5 @@ can_adjust = FALSE resistance_flags = NONE -/datum/armor/curator_nasa +/datum/armor/clothing_under/curator_nasa bio = 95 diff --git a/code/modules/clothing/under/jobs/command.dm b/code/modules/clothing/under/jobs/command.dm index dffb319185eaa..2969eabc63cfb 100644 --- a/code/modules/clothing/under/jobs/command.dm +++ b/code/modules/clothing/under/jobs/command.dm @@ -7,10 +7,9 @@ random_sensor = FALSE icon = 'icons/obj/clothing/under/captain.dmi' worn_icon = 'icons/mob/clothing/under/captain.dmi' - armor_type = /datum/armor/rank_captain + armor_type = /datum/armor/clothing_under/rank_captain -/datum/armor/rank_captain - bio = 10 +/datum/armor/clothing_under/rank_captain wound = 15 /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 e7611612a5b33..b6bd430eee836 100644 --- a/code/modules/clothing/under/jobs/engineering.dm +++ b/code/modules/clothing/under/jobs/engineering.dm @@ -3,11 +3,10 @@ /obj/item/clothing/under/rank/engineering icon = 'icons/obj/clothing/under/engineering.dmi' worn_icon = 'icons/mob/clothing/under/engineering.dmi' - armor_type = /datum/armor/rank_engineering + armor_type = /datum/armor/clothing_under/rank_engineering resistance_flags = NONE -/datum/armor/rank_engineering - bio = 10 +/datum/armor/clothing_under/rank_engineering fire = 60 acid = 20 @@ -16,10 +15,9 @@ name = "chief engineer's jumpsuit" icon_state = "chiefengineer" inhand_icon_state = "gy_suit" - armor_type = /datum/armor/engineering_chief_engineer + armor_type = /datum/armor/clothing_under/engineering_chief_engineer -/datum/armor/engineering_chief_engineer - bio = 10 +/datum/armor/clothing_under/engineering_chief_engineer fire = 80 acid = 40 diff --git a/code/modules/clothing/under/jobs/medical.dm b/code/modules/clothing/under/jobs/medical.dm index 55370bc82004f..1574b64bbf066 100644 --- a/code/modules/clothing/under/jobs/medical.dm +++ b/code/modules/clothing/under/jobs/medical.dm @@ -1,9 +1,9 @@ /obj/item/clothing/under/rank/medical icon = 'icons/obj/clothing/under/medical.dmi' worn_icon = 'icons/mob/clothing/under/medical.dmi' - armor_type = /datum/armor/rank_medical + armor_type = /datum/armor/clothing_under/rank_medical -/datum/armor/rank_medical +/datum/armor/clothing_under/rank_medical bio = 50 /obj/item/clothing/under/rank/medical/doctor @@ -120,10 +120,9 @@ name = "chemist's jumpsuit" icon_state = "chemistry" inhand_icon_state = "w_suit" - armor_type = /datum/armor/medical_chemist + armor_type = /datum/armor/clothing_under/medical_chemist -/datum/armor/medical_chemist - bio = 10 +/datum/armor/clothing_under/medical_chemist fire = 50 acid = 65 diff --git a/code/modules/clothing/under/jobs/rnd.dm b/code/modules/clothing/under/jobs/rnd.dm index b761f8ee4c966..dc5937e4e0252 100644 --- a/code/modules/clothing/under/jobs/rnd.dm +++ b/code/modules/clothing/under/jobs/rnd.dm @@ -1,18 +1,22 @@ /obj/item/clothing/under/rank/rnd icon = 'icons/obj/clothing/under/rnd.dmi' worn_icon = 'icons/mob/clothing/under/rnd.dmi' + armor_type = /datum/armor/clothing_under/science + +/datum/armor/clothing_under/science + bio = 50 /obj/item/clothing/under/rank/rnd/research_director desc = "It's a suit worn by those with the know-how to achieve the position of \"Research Director\". Its fabric provides minor protection from biological contaminants." name = "research director's vest suit" icon_state = "director" inhand_icon_state = "lb_suit" - armor_type = /datum/armor/rnd_research_director + armor_type = /datum/armor/clothing_under/rnd_research_director can_adjust = FALSE -/datum/armor/rnd_research_director +/datum/armor/clothing_under/rnd_research_director bomb = 10 - bio = 10 + bio = 50 acid = 35 /obj/item/clothing/under/rank/rnd/research_director/doctor_hilbert @@ -24,27 +28,29 @@ name = "research director's vest suitskirt" desc = "It's a suitskirt worn by those with the know-how to achieve the position of \"Research Director\". Its fabric provides minor protection from biological contaminants." icon_state = "director_skirt" - inhand_icon_state = "lb_suit" body_parts_covered = CHEST|GROIN|ARMS dying_key = DYE_REGISTRY_JUMPSKIRT female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON /obj/item/clothing/under/rank/rnd/research_director/alt - desc = "Maybe you'll engineer your own half-man, half-pig creature some day. Its fabric provides minor protection from biological contaminants." name = "research director's tan suit" - icon_state = "rdwhimsy" - inhand_icon_state = "rdwhimsy" + desc = "Maybe you'll engineer your own half-man, half-pig creature some day. Its fabric provides minor protection from biological contaminants." + icon = 'icons/obj/clothing/under/shorts_pants_shirts.dmi' + worn_icon = 'icons/mob/clothing/under/shorts_pants_shirts.dmi' + icon_state = "buttondown_slacks" + greyscale_config = /datum/greyscale_config/buttondown_slacks + greyscale_config_worn = /datum/greyscale_config/buttondown_slacks/worn + greyscale_colors = "#ffeeb6#c2d3da#402912#615233" can_adjust = TRUE alt_covers_chest = TRUE /obj/item/clothing/under/rank/rnd/research_director/alt/skirt name = "research director's tan suitskirt" - desc = "Maybe you'll engineer your own half-man, half-pig creature some day. Its fabric provides minor protection from biological contaminants." - icon_state = "rdwhimsy_skirt" - inhand_icon_state = "rdwhimsy" + icon_state = "buttondown_skirt" + greyscale_config = /datum/greyscale_config/buttondown_skirt + greyscale_config_worn = /datum/greyscale_config/buttondown_skirt/worn body_parts_covered = CHEST|GROIN|ARMS - dying_key = DYE_REGISTRY_JUMPSKIRT female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON @@ -60,27 +66,21 @@ name = "research director's turtleneck skirt" desc = "A Nanotrasen-purple turtleneck and a black skirt, for a director with a superior sense of style." icon_state = "rdturtle_skirt" - inhand_icon_state = "p_suit" body_parts_covered = CHEST|GROIN|ARMS dying_key = DYE_REGISTRY_JUMPSKIRT female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON /obj/item/clothing/under/rank/rnd/scientist - desc = "It's made of a special fiber that provides minor protection against explosives. It has markings that denote the wearer as a scientist." name = "scientist's jumpsuit" + desc = "It's made of a special fiber that provides minor protection against explosives. It has markings that denote the wearer as a scientist." icon_state = "science" inhand_icon_state = "w_suit" - armor_type = /datum/armor/rnd_scientist - -/datum/armor/rnd_scientist - bio = 50 + armor_type = /datum/armor/clothing_under/science /obj/item/clothing/under/rank/rnd/scientist/skirt name = "scientist's jumpskirt" - desc = "It's made of a special fiber that provides minor protection against explosives. It has markings that denote the wearer as a scientist." - icon_state = "sciwhite_skirt" - inhand_icon_state = "w_suit" + icon_state = "science_skirt" body_parts_covered = CHEST|GROIN|ARMS dying_key = DYE_REGISTRY_JUMPSKIRT female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY @@ -104,20 +104,14 @@ supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON /obj/item/clothing/under/rank/rnd/geneticist - desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it." name = "geneticist's jumpsuit" + desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it." icon_state = "genetics" inhand_icon_state = "w_suit" - armor_type = /datum/armor/rnd_geneticist - -/datum/armor/rnd_geneticist - bio = 50 /obj/item/clothing/under/rank/rnd/geneticist/skirt name = "geneticist's jumpskirt" - desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it." - icon_state = "geneticswhite_skirt" - inhand_icon_state = "w_suit" + icon_state = "genetics_skirt" body_parts_covered = CHEST|GROIN|ARMS dying_key = DYE_REGISTRY_JUMPSKIRT female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index 8f76bd4587a11..6fdecff829b4d 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -12,14 +12,13 @@ /obj/item/clothing/under/rank/security icon = 'icons/obj/clothing/under/security.dmi' worn_icon = 'icons/mob/clothing/under/security.dmi' - armor_type = /datum/armor/rank_security + armor_type = /datum/armor/clothing_under/rank_security strip_delay = 50 sensor_mode = SENSOR_COORDS random_sensor = FALSE -/datum/armor/rank_security +/datum/armor/clothing_under/rank_security melee = 10 - bio = 10 fire = 30 acid = 30 wound = 10 @@ -145,12 +144,11 @@ desc = "A security jumpsuit decorated for those few with the dedication to achieve the position of Head of Security." icon_state = "rhos" inhand_icon_state = "r_suit" - armor_type = /datum/armor/security_head_of_security + armor_type = /datum/armor/clothing_under/security_head_of_security strip_delay = 60 -/datum/armor/security_head_of_security +/datum/armor/clothing_under/security_head_of_security melee = 10 - bio = 10 fire = 50 acid = 50 wound = 10 @@ -221,40 +219,46 @@ icon_state = "spacepol" inhand_icon_state = null can_adjust = FALSE - armor_type = /datum/armor/sec_uniform_spacepol + armor_type = /datum/armor/clothing_under/sec_uniform_spacepol -/datum/armor/sec_uniform_spacepol +/datum/armor/clothing_under/sec_uniform_spacepol fire = 10 acid = 10 melee = 10 + wound = 10 /obj/item/clothing/under/rank/prisoner name = "prison jumpsuit" - desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position." + desc = "Standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position." icon_state = "jumpsuit" - icon_preview = 'icons/obj/previews.dmi' + icon_preview = 'icons/obj/fluff/previews.dmi' icon_state_preview = "prisonsuit" inhand_icon_state = "jumpsuit" greyscale_colors = "#ff8300" - greyscale_config = /datum/greyscale_config/jumpsuit_prison - greyscale_config_inhand_left = /datum/greyscale_config/jumpsuit_prison_inhand_left - greyscale_config_inhand_right = /datum/greyscale_config/jumpsuit_prison_inhand_right - greyscale_config_worn = /datum/greyscale_config/jumpsuit_prison_worn + greyscale_config = /datum/greyscale_config/jumpsuit/prison + greyscale_config_worn = /datum/greyscale_config/jumpsuit/prison/worn + greyscale_config_inhand_left = /datum/greyscale_config/jumpsuit/prison/inhand_left + greyscale_config_inhand_right = /datum/greyscale_config/jumpsuit/prison/inhand_right has_sensor = LOCKED_SENSORS sensor_mode = SENSOR_COORDS random_sensor = FALSE +/obj/item/clothing/under/rank/prisoner/nosensor + desc = "Standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"OFF\" position." + has_sensor = NO_SENSORS + sensor_mode = SENSOR_OFF + /obj/item/clothing/under/rank/prisoner/skirt name = "prison jumpskirt" - desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position." + desc = "Standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position." icon_state = "jumpskirt" - icon_preview = 'icons/obj/previews.dmi' + icon_preview = 'icons/obj/fluff/previews.dmi' icon_state_preview = "prisonskirt" greyscale_colors = "#ff8300" - greyscale_config = /datum/greyscale_config/jumpsuit_prison - greyscale_config_inhand_left = /datum/greyscale_config/jumpsuit_prison_inhand_left - greyscale_config_inhand_right = /datum/greyscale_config/jumpsuit_prison_inhand_right - greyscale_config_worn = /datum/greyscale_config/jumpsuit_prison_worn + greyscale_config = /datum/greyscale_config/jumpsuit/prison + greyscale_config_worn = /datum/greyscale_config/jumpsuit/prison/worn + greyscale_config_inhand_left = /datum/greyscale_config/jumpsuit/prison/inhand_left + greyscale_config_inhand_right = /datum/greyscale_config/jumpsuit/prison/inhand_right body_parts_covered = CHEST|GROIN|ARMS dying_key = DYE_REGISTRY_JUMPSKIRT female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 68749df3ed0b2..8f1263fa3e2b2 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -49,7 +49,7 @@ worn_icon = 'icons/mob/clothing/under/syndicate.dmi' desc = "A cybernetically enhanced jumpsuit used for administrative duties." body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - armor_type = /datum/armor/misc_adminsuit + armor_type = /datum/armor/clothing_under/adminsuit 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 @@ -57,7 +57,7 @@ can_adjust = FALSE resistance_flags = FIRE_PROOF | ACID_PROOF -/datum/armor/misc_adminsuit +/datum/armor/clothing_under/adminsuit melee = 100 bullet = 100 laser = 100 @@ -66,6 +66,7 @@ bio = 100 fire = 100 acid = 100 + wound = 100 /obj/item/clothing/under/misc/burial name = "burial garments" @@ -96,15 +97,15 @@ icon_state = "durathread" inhand_icon_state = null can_adjust = FALSE - armor_type = /datum/armor/misc_durathread + armor_type = /datum/armor/clothing_under/durathread -/datum/armor/misc_durathread +/datum/armor/clothing_under/durathread melee = 10 laser = 10 fire = 40 acid = 10 bomb = 5 - bio = 10 + wound = 10 /obj/item/clothing/under/misc/bouncer name = "bouncer uniform" @@ -112,11 +113,10 @@ icon_state = "bouncer" inhand_icon_state = null can_adjust = FALSE - armor_type = /datum/armor/misc_bouncer + armor_type = /datum/armor/clothing_under/bouncer -/datum/armor/misc_bouncer +/datum/armor/clothing_under/bouncer melee = 5 - bio = 10 fire = 30 acid = 30 diff --git a/code/modules/clothing/under/pants.dm b/code/modules/clothing/under/pants.dm index 92664039d9955..a582f7ccb920d 100644 --- a/code/modules/clothing/under/pants.dm +++ b/code/modules/clothing/under/pants.dm @@ -13,7 +13,7 @@ desc = "A pair of comfy slacks." icon_state = "slacks" greyscale_config = /datum/greyscale_config/slacks - greyscale_config_worn = /datum/greyscale_config/slacks_worn + greyscale_config_worn = /datum/greyscale_config/slacks/worn greyscale_colors = "#575757#3E3E3E#75634F" flags_1 = IS_PLAYER_COLORABLE_1 @@ -22,7 +22,7 @@ desc = "A nondescript pair of tough jeans." icon_state = "jeans" greyscale_config = /datum/greyscale_config/jeans - greyscale_config_worn = /datum/greyscale_config/jeans_worn + greyscale_config_worn = /datum/greyscale_config/jeans/worn greyscale_colors = "#787878#723E0E#4D7EAC" flags_1 = IS_PLAYER_COLORABLE_1 diff --git a/code/modules/clothing/under/shorts.dm b/code/modules/clothing/under/shorts.dm index 9a2cf8dbdc43d..289c59ae3d130 100644 --- a/code/modules/clothing/under/shorts.dm +++ b/code/modules/clothing/under/shorts.dm @@ -3,7 +3,7 @@ desc = "A pair of comfy shorts." icon_state = "shorts" greyscale_config = /datum/greyscale_config/shorts - greyscale_config_worn = /datum/greyscale_config/shorts_worn + greyscale_config_worn = /datum/greyscale_config/shorts/worn greyscale_colors = "#575757#3E3E3E#75634F" gender = PLURAL body_parts_covered = GROIN @@ -18,7 +18,7 @@ desc = "A nondescript pair of tough jean shorts." icon_state = "jeanshorts" greyscale_config = /datum/greyscale_config/jeanshorts - greyscale_config_worn = /datum/greyscale_config/jeanshorts_worn + greyscale_config_worn = /datum/greyscale_config/jeanshorts/worn greyscale_colors = "#787878#723E0E#4D7EAC" /obj/item/clothing/under/shorts/red diff --git a/code/modules/clothing/under/skirt_dress.dm b/code/modules/clothing/under/skirt_dress.dm index 76558b3e00c49..31e74ff115245 100644 --- a/code/modules/clothing/under/skirt_dress.dm +++ b/code/modules/clothing/under/skirt_dress.dm @@ -48,7 +48,7 @@ custom_price = PAYCHECK_CREW greyscale_colors = "#CC2102" greyscale_config = /datum/greyscale_config/plaidskirt - greyscale_config_worn = /datum/greyscale_config/plaidskirt_worn + greyscale_config_worn = /datum/greyscale_config/plaidskirt/worn flags_1 = IS_PLAYER_COLORABLE_1 /obj/item/clothing/under/dress/skirt/turtleskirt @@ -58,7 +58,7 @@ custom_price = PAYCHECK_CREW greyscale_colors = "#cc0000#5f5f5f" greyscale_config = /datum/greyscale_config/turtleskirt - greyscale_config_worn = /datum/greyscale_config/turtleskirt_worn + greyscale_config_worn = /datum/greyscale_config/turtleskirt/worn flags_1 = IS_PLAYER_COLORABLE_1 /obj/item/clothing/under/dress/tango @@ -68,7 +68,7 @@ custom_price = PAYCHECK_CREW greyscale_colors = "#ff0000#1c1c1c" greyscale_config = /datum/greyscale_config/tango - greyscale_config_worn = /datum/greyscale_config/tango_worn + greyscale_config_worn = /datum/greyscale_config/tango/worn flags_1 = IS_PLAYER_COLORABLE_1 /obj/item/clothing/under/dress/sundress @@ -78,5 +78,5 @@ custom_price = PAYCHECK_CREW greyscale_colors = "#FFE60F#9194A5#1F243C" greyscale_config = /datum/greyscale_config/sundress - greyscale_config_worn = /datum/greyscale_config/sundress_worn + greyscale_config_worn = /datum/greyscale_config/sundress/worn flags_1 = IS_PLAYER_COLORABLE_1 diff --git a/code/modules/clothing/under/suits.dm b/code/modules/clothing/under/suits.dm index 775a37d77d66b..02f047c2f4894 100644 --- a/code/modules/clothing/under/suits.dm +++ b/code/modules/clothing/under/suits.dm @@ -3,76 +3,8 @@ worn_icon = 'icons/mob/clothing/under/suits.dmi' can_adjust = FALSE female_sprite_flags = FEMALE_UNIFORM_NO_BREASTS - -/obj/item/clothing/under/suit/white_on_white - name = "white suit" - desc = "A white suit, suitable for an excellent host." - icon_state = "scratch" - inhand_icon_state = null - -/obj/item/clothing/under/suit/white/skirt - name = "white suitskirt" - desc = "A white suitskirt, suitable for an excellent host." - icon_state = "white_suit_skirt" - inhand_icon_state = null - body_parts_covered = CHEST|GROIN|ARMS - dying_key = DYE_REGISTRY_JUMPSKIRT - female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY|FEMALE_UNIFORM_NO_BREASTS - supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON - -/obj/item/clothing/under/suit/sl - desc = "It's a very amish looking suit." - name = "amish suit" - icon_state = "sl_suit" - -/obj/item/clothing/under/suit/waiter - name = "waiter's outfit" - desc = "It's a very smart uniform with a special pocket for tip." - icon_state = "waiter" - inhand_icon_state = "waiter" - supports_variations_flags = CLOTHING_MONKEY_VARIATION - -/obj/item/clothing/under/suit/blacktwopiece - name = "black two piece suit" - desc = "A black suit and red tie. Very formal." - icon_state = "black_suit" inhand_icon_state = null -/obj/item/clothing/under/suit/black - name = "black suit" - desc = "A professional looking black suit. Ready for some serious law." - icon_state = "blacksuit" - inhand_icon_state = null - can_adjust = TRUE - alt_covers_chest = TRUE - -/obj/item/clothing/under/suit/black/skirt - name = "black suitskirt" - desc = "A professional black suitskirt. Nanotrasen Investigation Bureau approved!" - icon_state = "blacksuit_skirt" - inhand_icon_state = "bar_suit" - alt_covers_chest = TRUE - body_parts_covered = CHEST|GROIN|ARMS - dying_key = DYE_REGISTRY_JUMPSKIRT - female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY|FEMALE_UNIFORM_NO_BREASTS - supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON - -/obj/item/clothing/under/suit/black_really - name = "executive suit" - desc = "A formal black suit, intended for the station's finest." - icon_state = "really_black_suit" - inhand_icon_state = null - -/obj/item/clothing/under/suit/black_really/skirt - name = "executive suitskirt" - desc = "A formal black suitskirt, intended for the station's finest." - icon_state = "really_black_suit_skirt" - inhand_icon_state = null - body_parts_covered = CHEST|GROIN|ARMS - dying_key = DYE_REGISTRY_JUMPSKIRT - female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY|FEMALE_UNIFORM_NO_BREASTS - supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON - /obj/item/clothing/under/suit/green name = "green suit" desc = "A green suit and yellow necktie. Baller." @@ -81,7 +13,7 @@ inhand_icon_state = "dg_suit" worn_icon = 'icons/mob/clothing/under/captain.dmi' -/obj/item/clothing/under/suit/red +/obj/item/clothing/under/suit/red //Also used by the Curator's suit, /obj/item/clothing/under/rank/civilian/curator name = "red suit" desc = "A red suit and blue tie. Somewhat formal." icon_state = "red_suit" @@ -91,31 +23,40 @@ name = "charcoal suit" desc = "A charcoal suit and red tie. Very professional." icon_state = "charcoal_suit" - inhand_icon_state = null /obj/item/clothing/under/suit/navy name = "navy suit" desc = "A navy suit and red tie, intended for the station's finest." icon_state = "navy_suit" - inhand_icon_state = null /obj/item/clothing/under/suit/burgundy name = "burgundy suit" desc = "A burgundy suit and black tie. Somewhat formal." icon_state = "burgundy_suit" - inhand_icon_state = null /obj/item/clothing/under/suit/checkered name = "checkered suit" desc = "That's a very nice suit you have there. Shame if something were to happen to it, eh?" icon_state = "checkered_suit" - inhand_icon_state = null -/obj/item/clothing/under/suit/tan - name = "tan suit" - desc = "A tan suit. Smart, but casual." - icon_state = "tan_suit" - inhand_icon_state = "tan_suit" +/obj/item/clothing/under/suit/beige + name = "beige suit" + desc = "An excellent light colored suit, experts in the field stress that it should not to be confused with the inferior tan suit." + icon_state = "beige_suit" + +/obj/item/clothing/under/suit/black + name = "black two piece suit" + desc = "A black suit with charcoal pants and a red tie. Very formal." + icon_state = "black_suit" + +/obj/item/clothing/under/suit/black/skirt + name = "black two piece suit" + desc = "A black suit with a charcoal skirt and a red tie. Very formal." + icon_state = "black_suit_skirt" + body_parts_covered = CHEST|GROIN|ARMS + dying_key = DYE_REGISTRY_JUMPSKIRT + female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON /obj/item/clothing/under/suit/white name = "white suit" @@ -123,21 +64,43 @@ icon_state = "white_suit" inhand_icon_state = "white_suit" -/obj/item/clothing/under/suit/beige - name = "beige suit" - desc = "An excellent light colored suit, experts in the field stress that it should not to be confused with the inferior tan suit." - icon_state = "beige_suit" +/obj/item/clothing/under/suit/white/skirt + name = "white suitskirt" + desc = "A white suitskirt, suitable for an excellent host." + icon_state = "white_suit_skirt" + body_parts_covered = CHEST|GROIN|ARMS + dying_key = DYE_REGISTRY_JUMPSKIRT + female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON + +/obj/item/clothing/under/suit/tan + name = "tan suit" + desc = "A tan suit. Smart, but casual." + icon_state = "tan_suit" + inhand_icon_state = "tan_suit" + +/obj/item/clothing/under/suit/waiter + name = "waiter's outfit" + desc = "It's a very smart uniform with a special pocket for tip." + icon_state = "waiter" + inhand_icon_state = "waiter" + supports_variations_flags = CLOTHING_MONKEY_VARIATION + +/obj/item/clothing/under/suit/black_really + name = "executive suit" + desc = "A formal black suit, intended for the station's finest." + icon_state = "really_black_suit" inhand_icon_state = null -/obj/item/clothing/under/suit/henchmen - name = "henchmen jumpsuit" - desc = "A very gaudy jumpsuit for a proper Henchman. Guild regulations, you understand." - icon = 'icons/obj/clothing/under/syndicate.dmi' - worn_icon = 'icons/mob/clothing/under/syndicate.dmi' - icon_state = "henchmen" +/obj/item/clothing/under/suit/black_really/skirt + name = "executive suitskirt" + desc = "A formal black suitskirt, intended for the station's finest." + icon_state = "really_black_suit_skirt" inhand_icon_state = null - body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS|HEAD - flags_inv = HIDEGLOVES|HIDESHOES|HIDEEARS|HIDEEYES|HIDEHAIR + body_parts_covered = CHEST|GROIN|ARMS + dying_key = DYE_REGISTRY_JUMPSKIRT + female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY|FEMALE_UNIFORM_NO_BREASTS + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON /obj/item/clothing/under/suit/tuxedo name = "tuxedo" diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm index ca640f49a0ffc..19d5d3b93b2fe 100644 --- a/code/modules/clothing/under/syndicate.dm +++ b/code/modules/clothing/under/syndicate.dm @@ -4,62 +4,52 @@ icon_state = "syndicate" inhand_icon_state = "bl_suit" has_sensor = NO_SENSORS - armor_type = /datum/armor/under_syndicate + armor_type = /datum/armor/clothing_under/syndicate alt_covers_chest = TRUE icon = 'icons/obj/clothing/under/syndicate.dmi' worn_icon = 'icons/mob/clothing/under/syndicate.dmi' -/datum/armor/under_syndicate +/datum/armor/clothing_under/syndicate melee = 10 - bio = 10 fire = 50 acid = 40 + wound = 10 /obj/item/clothing/under/syndicate/skirt name = "tactical skirtleneck" desc = "A non-descript and slightly suspicious looking skirtleneck." icon_state = "syndicate_skirt" inhand_icon_state = "bl_suit" - has_sensor = NO_SENSORS - armor_type = /datum/armor/syndicate_skirt - alt_covers_chest = TRUE female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY dying_key = DYE_REGISTRY_JUMPSKIRT supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON -/datum/armor/syndicate_skirt - melee = 10 - bio = 10 - fire = 50 - acid = 40 - /obj/item/clothing/under/syndicate/bloodred name = "blood-red sneaksuit" desc = "It still counts as stealth if there are no witnesses." icon_state = "bloodred_pajamas" inhand_icon_state = "bl_suit" - armor_type = /datum/armor/syndicate_bloodred + armor_type = /datum/armor/clothing_under/syndicate_bloodred resistance_flags = FIRE_PROOF | ACID_PROOF can_adjust = FALSE -/datum/armor/syndicate_bloodred +/datum/armor/clothing_under/syndicate_bloodred melee = 10 bullet = 10 laser = 10 energy = 10 - bio = 10 fire = 50 acid = 40 + wound = 10 /obj/item/clothing/under/syndicate/bloodred/sleepytime name = "blood-red pajamas" desc = "Do operatives dream of nuclear sheep?" icon_state = "bloodred_pajamas" inhand_icon_state = "bl_suit" - armor_type = /datum/armor/bloodred_sleepytime + armor_type = /datum/armor/clothing_under/bloodred_sleepytime -/datum/armor/bloodred_sleepytime - bio = 10 +/datum/armor/clothing_under/bloodred_sleepytime fire = 50 acid = 40 @@ -69,11 +59,10 @@ icon_state = "tactifool" inhand_icon_state = "bl_suit" has_sensor = HAS_SENSORS - armor_type = /datum/armor/syndicate_tacticool + armor_type = /datum/armor/clothing_under/syndicate_tacticool stubborn_stains = TRUE -/datum/armor/syndicate_tacticool - bio = 10 +/datum/armor/clothing_under/syndicate_tacticool fire = 50 acid = 40 @@ -100,16 +89,10 @@ 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_type = /datum/armor/tacticool_skirt female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY dying_key = DYE_REGISTRY_JUMPSKIRT supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON -/datum/armor/tacticool_skirt - bio = 10 - fire = 50 - acid = 40 - /obj/item/clothing/under/syndicate/sniper name = "tactical turtleneck suit" desc = "A double seamed tactical turtleneck disguised as a civilian-grade silk suit. Intended for the most formal operator. The collar is really sharp." @@ -129,12 +112,11 @@ desc = "Badly translated labels tell you to clean this in Vodka. Great for squatting in." icon_state = "trackpants" can_adjust = FALSE - armor_type = /datum/armor/syndicate_soviet + armor_type = /datum/armor/clothing_under/syndicate_soviet resistance_flags = NONE -/datum/armor/syndicate_soviet +/datum/armor/clothing_under/syndicate_soviet melee = 10 - bio = 10 /obj/item/clothing/under/syndicate/combat name = "combat uniform" @@ -147,12 +129,11 @@ desc = "Military grade tracksuits for frontline squatting." icon_state = "rus_under" can_adjust = FALSE - armor_type = /datum/armor/syndicate_rus_army + armor_type = /datum/armor/clothing_under/syndicate_rus_army resistance_flags = NONE -/datum/armor/syndicate_rus_army +/datum/armor/clothing_under/syndicate_rus_army melee = 5 - bio = 10 /obj/item/clothing/under/syndicate/scrubs name = "tactical scrubs" @@ -161,10 +142,18 @@ worn_icon = 'icons/mob/clothing/under/medical.dmi' icon_state = "scrubswine" can_adjust = FALSE - armor_type = /datum/armor/syndicate_scrubs + armor_type = /datum/armor/clothing_under/syndicate_scrubs -/datum/armor/syndicate_scrubs +/datum/armor/clothing_under/syndicate_scrubs melee = 10 bio = 50 fire = 50 acid = 40 + +/obj/item/clothing/under/plasmaman/syndicate + name = "tacticool envirosuit" + desc = "A sinister looking envirosuit, for the boniest of operatives." + icon_state = "syndie_envirosuit" + has_sensor = NO_SENSORS + resistance_flags = FIRE_PROOF + inhand_icon_state = null diff --git a/code/modules/detectivework/evidence.dm b/code/modules/detectivework/evidence.dm index 1f9f572ce422d..e22235084f927 100644 --- a/code/modules/detectivework/evidence.dm +++ b/code/modules/detectivework/evidence.dm @@ -19,7 +19,8 @@ if(evidencebagEquip(I, user)) return 1 -/obj/item/evidencebag/handle_atom_del(atom/A) +/obj/item/evidencebag/Exited(atom/movable/gone, direction) + . = ..() cut_overlays() w_class = initial(w_class) icon_state = initial(icon_state) @@ -56,9 +57,12 @@ 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.remove_single(user, I, src) - if(!user.dropItemToGround(I)) + if(!user.is_holding(I) || HAS_TRAIT(I, TRAIT_NODROP)) return + if(QDELETED(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.")) diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm index 7f578bb1b3930..b4703945092cc 100644 --- a/code/modules/economy/account.dm +++ b/code/modules/economy/account.dm @@ -7,6 +7,10 @@ var/account_balance = 0 ///How many mining points (shaft miner credits) is held in the bank account, used for mining vendors. var/mining_points = 0 + /// Points for bit runner's vendor. Awarded for completing virtual domains. + var/bitrunning_points = 0 + ///Debt. If higher than 0, A portion of the credits is earned (or the whole debt, whichever is lower) will go toward paying it off. + var/account_debt = 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 ///The job datum of the account owner. @@ -87,16 +91,6 @@ /datum/bank_account/proc/dumpeet() being_dumped = TRUE -/** - * Performs the math component of adjusting a bank account balance. - * Arguments: - * * amount - the quantity of credits that will be written off if the value is negative, or added if it is positive. - */ -/datum/bank_account/proc/_adjust_money(amount) - account_balance += amount - if(account_balance < 0) - account_balance = 0 - /** * Returns TRUE if a bank account has more than or equal to the amount, amt. * Otherwise returns false. @@ -114,12 +108,30 @@ */ /datum/bank_account/proc/adjust_money(amount, reason) if((amount < 0 && has_money(-amount)) || amount > 0) - _adjust_money(amount) + var/debt_collected = 0 + if(account_debt > 0 && amount > 0) + debt_collected = min(CEILING(amount*DEBT_COLLECTION_COEFF, 1), account_debt) + account_balance += amount - debt_collected if(reason) add_log_to_history(amount, reason) + if(debt_collected) + pay_debt(debt_collected, FALSE) return TRUE return FALSE +///Called when a portion of a debt is to be paid. It'll return the amount of credits put forwards to extinguish the debt. +/datum/bank_account/proc/pay_debt(amount, is_payment = TRUE) + var/amount_to_pay = min(amount, account_debt) + if(is_payment) + if(!adjust_money(-amount, "Other: Debt Payment")) + return 0 + else + add_log_to_history(-amount, "Other: Debt Collection") + log_econ("[amount_to_pay] credits were removed from [account_holder]'s bank account to pay a debt of [account_debt]") + account_debt -= amount_to_pay + SEND_SIGNAL(src, COMSIG_BANK_ACCOUNT_DEBT_PAID) + return amount_to_pay + /** * Performs a transfer of credits to the bank_account datum from another bank account. * Arguments: @@ -132,12 +144,12 @@ var/reason_to = "Transfer: From [from.account_holder]" var/reason_from = "Transfer: To [account_holder]" - if(istype(from, /datum/bank_account/department)) + if(IS_DEPARTMENTAL_ACCOUNT(from)) reason_to = "Nanotrasen: Salary" reason_from = "" if(transfer_reason) - reason_to = istype(src, /datum/bank_account/department) ? "" : transfer_reason + reason_to = IS_DEPARTMENTAL_ACCOUNT(src) ? "" : transfer_reason reason_from = transfer_reason adjust_money(amount, reason_to) @@ -195,7 +207,7 @@ icon_source = id_card.get_cached_flat_icon() var/mob/card_holder = recursive_loc_check(card, /mob) if(ismob(card_holder)) //If on a mob - if(!card_holder.client || (!(card_holder.client.prefs.chat_toggles & CHAT_BANKCARD) && !force)) + if(!card_holder.client || (!(get_chat_toggles(card_holder.client) & CHAT_BANKCARD) && !force)) return if(card_holder.can_hear()) @@ -204,7 +216,7 @@ else if(isturf(card.loc)) //If on the ground var/turf/card_location = card.loc for(var/mob/potential_hearer in hearers(1,card_location)) - if(!potential_hearer.client || (!(potential_hearer.client.prefs.chat_toggles & CHAT_BANKCARD) && !force)) + if(!potential_hearer.client || (!(get_chat_toggles(potential_hearer.client) & CHAT_BANKCARD) && !force)) continue if(potential_hearer.can_hear()) potential_hearer.playsound_local(card_location, 'sound/machines/twobeep_high.ogg', 50, TRUE) @@ -212,7 +224,7 @@ else var/atom/sound_atom for(var/mob/potential_hearer in card.loc) //If inside a container with other mobs (e.g. locker) - if(!potential_hearer.client || (!(potential_hearer.client.prefs.chat_toggles & CHAT_BANKCARD) && !force)) + if(!potential_hearer.client || (!(get_chat_toggles(potential_hearer.client) & CHAT_BANKCARD) && !force)) continue if(!sound_atom) sound_atom = card.drop_location() //in case we're inside a bodybag in a crate or something. doing this here to only process it if there's a valid mob who can hear the sound. @@ -268,7 +280,21 @@ department_id = dep_id account_balance = budget account_holder = SSeconomy.department_accounts[dep_id] - SSeconomy.generated_accounts += src + SSeconomy.departmental_accounts += src + +/datum/bank_account/department/adjust_money(amount, reason) + . = ..() + if(department_id != ACCOUNT_CAR) + return + // If we're under (or equal) 3 crates woth of money (600?) in the cargo department, we unlock the scrapheap, which gives us a buncha money. Useful in an emergency? + if(account_balance >= CARGO_CRATE_VALUE * 3) + return + // We only allow people to actually buy the shuttle once the round gets going - otherwise you'd just be able to do it roundstart (Not really intended) + var/minimum_allowed_purchase_time = (CONFIG_GET(number/shuttle_refuel_delay) * 0.6) + if((world.time - SSticker.round_start_time) > minimum_allowed_purchase_time) + SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_SCRAPHEAP] = TRUE + else + SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_SCRAPHEAP] = FALSE /datum/bank_account/remote // Bank account not belonging to the local station add_to_accounts = FALSE diff --git a/code/modules/escape_menu/details.dm b/code/modules/escape_menu/details.dm index b40454c25d0dd..49bd19ce97fd7 100644 --- a/code/modules/escape_menu/details.dm +++ b/code/modules/escape_menu/details.dm @@ -13,7 +13,7 @@ GLOBAL_DATUM(escape_menu_details, /atom/movable/screen/escape_menu/details) maptext_height = 100 maptext_width = 200 -/atom/movable/screen/escape_menu/details/Initialize(mapload) +/atom/movable/screen/escape_menu/details/Initialize(mapload, datum/hud/hud_owner) . = ..() update_text() diff --git a/code/modules/escape_menu/home_page.dm b/code/modules/escape_menu/home_page.dm index c0bb4b30e95bc..48e6147a33b7e 100644 --- a/code/modules/escape_menu/home_page.dm +++ b/code/modules/escape_menu/home_page.dm @@ -2,6 +2,7 @@ page_holder.give_screen_object( new /atom/movable/screen/escape_menu/home_button( null, + /* hud_owner = */ src, src, "Resume", /* offset = */ 0, @@ -12,6 +13,7 @@ page_holder.give_screen_object( new /atom/movable/screen/escape_menu/home_button( null, + /* hud_owner = */ null, src, "Settings", /* offset = */ 1, @@ -22,6 +24,7 @@ page_holder.give_screen_object( new /atom/movable/screen/escape_menu/home_button/admin_help( null, + /* hud_owner = */ src, src, "Admin Help", /* offset = */ 2, @@ -31,6 +34,7 @@ page_holder.give_screen_object( new /atom/movable/screen/escape_menu/home_button/leave_body( null, + /* hud_owner = */ src, src, "Leave Body", /* offset = */ 3, @@ -55,6 +59,7 @@ /atom/movable/screen/escape_menu/home_button/Initialize( mapload, + datum/hud/hud_owner, datum/escape_menu/escape_menu, button_text, offset, @@ -67,6 +72,7 @@ home_button_text = new /atom/movable/screen/escape_menu/home_button_text( src, + /* hud_owner = */ src, button_text, ) @@ -77,7 +83,7 @@ /atom/movable/screen/escape_menu/home_button/Destroy() escape_menu = null - QDEL_NULL(on_click_callback) + on_click_callback = null return ..() @@ -109,7 +115,7 @@ button_text hovered = FALSE -/atom/movable/screen/escape_menu/home_button_text/Initialize(mapload, button_text) +/atom/movable/screen/escape_menu/home_button_text/Initialize(mapload, datum/hud/hud_owner, button_text) . = ..() src.button_text = button_text diff --git a/code/modules/escape_menu/leave_body.dm b/code/modules/escape_menu/leave_body.dm index 3dd4c69ad7839..428afe899dfcf 100644 --- a/code/modules/escape_menu/leave_body.dm +++ b/code/modules/escape_menu/leave_body.dm @@ -101,7 +101,7 @@ screen_loc = "CENTER:[pixel_offset],CENTER-1" /atom/movable/screen/escape_menu/leave_body_button/Destroy() - QDEL_NULL(on_click_callback) + on_click_callback = null return ..() diff --git a/code/modules/escape_menu/title.dm b/code/modules/escape_menu/title.dm index 1a82967a6ebc0..4b669d4aa7bab 100644 --- a/code/modules/escape_menu/title.dm +++ b/code/modules/escape_menu/title.dm @@ -13,7 +13,7 @@ GLOBAL_DATUM(escape_menu_title, /atom/movable/screen/escape_menu/title) maptext_height = 100 maptext_width = 500 -/atom/movable/screen/escape_menu/title/Initialize(mapload) +/atom/movable/screen/escape_menu/title/Initialize(mapload, datum/hud/hud_owner) . = ..() update_text() diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm index 64ff81da598d2..46353b80ea54b 100644 --- a/code/modules/events/_event.dm +++ b/code/modules/events/_event.dm @@ -1,5 +1,4 @@ #define RANDOM_EVENT_ADMIN_INTERVENTION_TIME (10 SECONDS) -#define NEVER_TRIGGERED_BY_WIZARDS -1 //this singleton datum is used by the events controller to dictate how it selects events /datum/round_event_control @@ -312,4 +311,3 @@ Runs the event return ..() #undef RANDOM_EVENT_ADMIN_INTERVENTION_TIME -#undef NEVER_TRIGGERED_BY_WIZARDS diff --git a/code/modules/events/anomaly/anomaly_flux.dm b/code/modules/events/anomaly/anomaly_flux.dm index 41481a9ef1a95..785217f3b7a6d 100644 --- a/code/modules/events/anomaly/anomaly_flux.dm +++ b/code/modules/events/anomaly/anomaly_flux.dm @@ -15,4 +15,4 @@ anomaly_path = /obj/effect/anomaly/flux /datum/round_event/anomaly/anomaly_flux/announce(fake) - priority_announce("Hyper-energetic flux wave detected on [ANOMALY_ANNOUNCE_DANGEROUS_TEXT]. [impact_area.name].", "Anomaly Alert") + priority_announce("Hyper-energetic flux wave detected on [ANOMALY_ANNOUNCE_DANGEROUS_TEXT] [impact_area.name].", "Anomaly Alert") diff --git a/code/modules/events/brain_trauma.dm b/code/modules/events/brain_trauma.dm index 1e5c09aff48e9..32af7abad5f3c 100644 --- a/code/modules/events/brain_trauma.dm +++ b/code/modules/events/brain_trauma.dm @@ -2,6 +2,7 @@ name = "Spontaneous Brain Trauma" typepath = /datum/round_event/brain_trauma weight = 25 + min_players = 13 category = EVENT_CATEGORY_HEALTH description = "A crewmember gains a random trauma." min_wizard_trigger_potency = 2 diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm index 813be9b3d8bab..bbd4e5ee78854 100644 --- a/code/modules/events/brand_intelligence.dm +++ b/code/modules/events/brand_intelligence.dm @@ -34,8 +34,8 @@ /datum/round_event/brand_intelligence/setup() //select our origin machine (which will also be the type of vending machine affected.) - for(var/obj/machinery/vending/vendor in GLOB.machines) - if(!is_station_level(vendor.z)) + for(var/obj/machinery/vending/vendor as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/vending)) + if(!vendor.onstation) continue if(!vendor.density) continue diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index f57ed1774d4ca..a323c7d83f00a 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -14,10 +14,14 @@ #define ADV_RNG_LOW 40 /// Percentile for mid severity advanced virus #define ADV_RNG_MID 85 -/// Percentile for low transmissibility advanced virus -#define ADV_SPREAD_LOW 15 -/// Percentile for mid transmissibility advanced virus -#define ADV_SPREAD_MID 85 +/// Percentile for high vs. low transmissibility +#define ADV_SPREAD_THRESHOLD 85 +/// Admin custom low spread +#define ADV_SPREAD_FORCED_LOW 0 +/// Admin custom med spread +#define ADV_SPREAD_FORCED_MID 70 +/// Admin custom high spread +#define ADV_SPREAD_FORCED_HIGH 90 /datum/round_event_control/disease_outbreak name = "Disease Outbreak: Classic" @@ -149,8 +153,9 @@ max_wizard_trigger_potency = 6 admin_setup = list( /datum/event_admin_setup/minimum_candidate_requirement/disease_outbreak, - /datum/event_admin_setup/listed_options/disease_outbreak_advanced, - /datum/event_admin_setup/input_number/disease_outbreak_advanced + /datum/event_admin_setup/listed_options/disease_outbreak_advanced/severity, + /datum/event_admin_setup/input_number/disease_outbreak_advanced, + /datum/event_admin_setup/listed_options/disease_outbreak_advanced/transmissibility ) /** @@ -159,14 +164,14 @@ * If the admin wishes, give them the opportunity to select the severity and number of symptoms. */ -/datum/event_admin_setup/listed_options/disease_outbreak_advanced +/datum/event_admin_setup/listed_options/disease_outbreak_advanced/severity input_text = "Pick a severity!" - normal_run_option = "Random Severity" + normal_run_option = "Random" -/datum/event_admin_setup/listed_options/disease_outbreak_advanced/get_list() +/datum/event_admin_setup/listed_options/disease_outbreak_advanced/severity/get_list() return list("Medium", "Harmful", "Dangerous") -/datum/event_admin_setup/listed_options/disease_outbreak_advanced/apply_to_event(datum/round_event/disease_outbreak/advanced/event) +/datum/event_admin_setup/listed_options/disease_outbreak_advanced/severity/apply_to_event(datum/round_event/disease_outbreak/advanced/event) switch(chosen) if("Medium") event.requested_severity = ADV_DISEASE_MEDIUM @@ -174,8 +179,30 @@ event.requested_severity = ADV_DISEASE_HARMFUL if("Dangerous") event.requested_severity = ADV_DISEASE_DANGEROUS - else + if("Random") event.requested_severity = null + else + return ADMIN_CANCEL_EVENT + +/datum/event_admin_setup/listed_options/disease_outbreak_advanced/transmissibility + input_text = "Pick a transmissibility!" + normal_run_option = "Random" + +/datum/event_admin_setup/listed_options/disease_outbreak_advanced/transmissibility/get_list() + return list("Blood/Fluids", "Skin Contact", "Airborne") + +/datum/event_admin_setup/listed_options/disease_outbreak_advanced/transmissibility/apply_to_event(datum/round_event/disease_outbreak/advanced/event) + switch(chosen) + if("Blood/Fluids") + event.requested_transmissibility = ADV_SPREAD_FORCED_LOW + if("Skin Contact") + event.requested_transmissibility = ADV_SPREAD_FORCED_MID + if("Airborne") + event.requested_transmissibility = ADV_SPREAD_FORCED_HIGH + if("Random") + event.requested_transmissibility = null + else + return ADMIN_CANCEL_EVENT /datum/event_admin_setup/input_number/disease_outbreak_advanced input_text = "How many symptoms do you want your virus to have?" @@ -184,23 +211,24 @@ min_value = 1 /datum/event_admin_setup/input_number/disease_outbreak_advanced/prompt_admins() - var/customize_number_of_symptoms = tgui_alert(usr, "Select number of symptoms?", event_control.name, list("Custom", "Random", "Cancel")) + var/customize_number_of_symptoms = tgui_alert(usr, "Select number of symptoms?", event_control.name, list("Default", "Custom")) switch(customize_number_of_symptoms) if("Custom") return ..() - if("Random") + if("Default") chosen_value = null else return ADMIN_CANCEL_EVENT - /datum/event_admin_setup/input_number/disease_outbreak_advanced/apply_to_event(datum/round_event/disease_outbreak/advanced/event) event.max_symptoms = chosen_value /datum/round_event/disease_outbreak/advanced ///Number of symptoms for our virus var/requested_severity - //Maximum symptoms for our virus + ///Transmissibility of our virus + var/requested_transmissibility + ///Maximum symptoms for our virus var/max_symptoms /** @@ -214,10 +242,10 @@ afflicted += disease_event.disease_candidates disease_event.disease_candidates.Cut() - if(!max_symptoms) + if(isnull(max_symptoms)) max_symptoms = rand(ADV_MIN_SYMPTOMS, ADV_MAX_SYMPTOMS) - if(!requested_severity) + if(isnull(requested_severity)) var/rng_severity = rand(1, 100) if(rng_severity < ADV_RNG_LOW) requested_severity = ADV_DISEASE_MEDIUM @@ -228,7 +256,7 @@ else requested_severity = ADV_DISEASE_DANGEROUS - var/datum/disease/advance/advanced_disease = new /datum/disease/advance/random/event(max_symptoms, requested_severity) + var/datum/disease/advance/advanced_disease = new /datum/disease/advance/random/event(max_symptoms, requested_severity, requested_transmissibility) var/list/name_symptoms = list() for(var/datum/symptom/new_symptom as anything in advanced_disease.symptoms) @@ -262,7 +290,7 @@ * Uses the parameters to create a list of symptoms, picking from various severities * Viral Evolution and Eternal Youth are special modifiers, so we roll separately. */ -/datum/disease/advance/random/event/New(max_symptoms, requested_severity) +/datum/disease/advance/random/event/New(max_symptoms, requested_severity, requested_transmissibility) var/list/datum/symptom/possible_symptoms = list( /datum/symptom/beard, /datum/symptom/chills, @@ -319,11 +347,38 @@ symptoms += new_symptom - //Applies the illness name based on the most severe symptom. if(new_symptom.severity > current_severity) - name = "[new_symptom.illness]" current_severity = new_symptom.severity + visibility_flags |= HIDDEN_SCANNER + var/transmissibility = requested_transmissibility + + if(isnull(transmissibility)) + transmissibility = rand(1,100) + + if(requested_transmissibility == ADV_SPREAD_FORCED_LOW) // Admin forced + set_spread(DISEASE_SPREAD_CONTACT_FLUIDS) + + else if(requested_transmissibility == ADV_SPREAD_FORCED_HIGH) // Admin forced + set_spread(DISEASE_SPREAD_AIRBORNE) + + //If severe enough, alert immediately on scanners, limit transmissibility + else if(current_severity >= ADV_DISEASE_DANGEROUS) + visibility_flags &= ~HIDDEN_SCANNER + set_spread(DISEASE_SPREAD_CONTACT_SKIN) + + else if(transmissibility < ADV_SPREAD_THRESHOLD) + set_spread(DISEASE_SPREAD_CONTACT_SKIN) + + else + visibility_flags &= ~HIDDEN_SCANNER + set_spread(DISEASE_SPREAD_AIRBORNE) + + + //Illness name from one of the symptoms + var/datum/symptom/picked_name = pick(symptoms) + name = picked_name.illness + //Modifiers to keep the disease base stats above 0 (unless RNG gets a really bad roll.) //Eternal Youth for +4 to resistance and stage speed. //Viral modifiers to slow down/resist or go fast and loud. @@ -353,37 +408,17 @@ stack_trace("Advanced virus properties were empty or null!") return - addtimer(CALLBACK(src, PROC_REF(make_visible)), ((ADV_ANNOUNCE_DELAY * 2) - 10) SECONDS) - + incubation_time = round(world.time + (((ADV_ANNOUNCE_DELAY * 2) - 10) SECONDS)) properties["transmittable"] = rand(4,7) spreading_modifier = max(CEILING(0.4 * properties["transmittable"], 1), 1) cure_chance = clamp(7.5 - (0.5 * properties["resistance"]), 5, 10) // Can be between 5 and 10 stage_prob = max(0.4 * properties["stage_rate"], 1) set_severity(properties["severity"]) - visibility_flags |= HIDDEN_SCANNER //If we have an advanced (high stage) disease, add it to the name. if(properties["stage_rate"] >= 7) name = "Advanced [name]" - //If severe enough, alert immediately on scanners - if(severity == "Dangerous" || severity == "BIOHAZARD") - visibility_flags &= ~HIDDEN_SCANNER - set_spread(DISEASE_SPREAD_CONTACT_SKIN) - - else - var/transmissibility = rand(1, 100) - - if(transmissibility < ADV_SPREAD_LOW) - set_spread(DISEASE_SPREAD_CONTACT_FLUIDS) - - else if(transmissibility < ADV_SPREAD_MID) - set_spread(DISEASE_SPREAD_CONTACT_SKIN) - - else - set_spread(DISEASE_SPREAD_AIRBORNE) - visibility_flags &= ~HIDDEN_SCANNER - generate_cure(properties) /** @@ -428,5 +463,7 @@ #undef ADV_DISEASE_DANGEROUS #undef ADV_RNG_LOW #undef ADV_RNG_MID -#undef ADV_SPREAD_LOW -#undef ADV_SPREAD_MID +#undef ADV_SPREAD_THRESHOLD +#undef ADV_SPREAD_FORCED_LOW +#undef ADV_SPREAD_FORCED_MID +#undef ADV_SPREAD_FORCED_HIGH diff --git a/code/modules/events/earthquake.dm b/code/modules/events/earthquake.dm index 11ade10f10eec..498648986e49c 100644 --- a/code/modules/events/earthquake.dm +++ b/code/modules/events/earthquake.dm @@ -87,7 +87,7 @@ // Grab a list of turfs below the ones we're going to destroy. // If we're at the bottom layer, it will just tear up the flooring a bunch (exposing it to LAVA). for(var/turf/turf_to_quake in turfs_to_shred) - underbelly += SSmapping.get_turf_below(turf_to_quake) + underbelly += GET_TURF_BELOW(turf_to_quake) /datum/round_event/earthquake/announce(fake) priority_announce("Planetary monitoring systems indicate a devastating seismic event in the near future.", "Seismic Report") diff --git a/code/modules/events/electrical_storm.dm b/code/modules/events/electrical_storm.dm index 1309887d4b73b..2b6aeac7eb219 100644 --- a/code/modules/events/electrical_storm.dm +++ b/code/modules/events/electrical_storm.dm @@ -30,7 +30,6 @@ return for(var/centre in epicentreList) - for(var/a in GLOB.apcs_list) - var/obj/machinery/power/apc/A = a - if(get_dist(centre, A) <= lightsoutRange) - A.overload_lighting() + for(var/obj/machinery/power/apc/apc as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/apc)) + if(get_dist(centre, apc) <= lightsoutRange) + apc.overload_lighting() diff --git a/code/modules/events/ghost_role/alien_infestation.dm b/code/modules/events/ghost_role/alien_infestation.dm index afcb31fe5a8da..8c3741ccef27d 100644 --- a/code/modules/events/ghost_role/alien_infestation.dm +++ b/code/modules/events/ghost_role/alien_infestation.dm @@ -46,7 +46,7 @@ /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) + for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/atmospherics/components/unary/vent_pump)) if(QDELETED(temp_vent)) continue if(is_station_level(temp_vent.loc.z) && !temp_vent.welded) diff --git a/code/modules/events/ghost_role/morph_event.dm b/code/modules/events/ghost_role/morph_event.dm index 29bfe202cc349..e9ac8bb9ea023 100644 --- a/code/modules/events/ghost_role/morph_event.dm +++ b/code/modules/events/ghost_role/morph_event.dm @@ -26,13 +26,13 @@ if(isnull(spawn_loc)) return MAP_ERROR - var/mob/living/simple_animal/hostile/morph/S = new /mob/living/simple_animal/hostile/morph(spawn_loc) - player_mind.transfer_to(S) + var/mob/living/basic/morph/corpus_accipientis = new(spawn_loc) + player_mind.transfer_to(corpus_accipientis) 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.") - S.log_message("was spawned as a morph by an event.", LOG_GAME) - spawned_mobs += S + SEND_SOUND(corpus_accipientis, sound('sound/magic/mutate.ogg')) + message_admins("[ADMIN_LOOKUPFLW(corpus_accipientis)] has been made into a morph by an event.") + corpus_accipientis.log_message("was spawned as a morph by an event.", LOG_GAME) + spawned_mobs += corpus_accipientis return SUCCESSFUL_SPAWN diff --git a/code/modules/events/ghost_role/operative.dm b/code/modules/events/ghost_role/operative.dm index 33cd9e059f09b..4cf8da639bb5f 100644 --- a/code/modules/events/ghost_role/operative.dm +++ b/code/modules/events/ghost_role/operative.dm @@ -30,6 +30,10 @@ Mind.special_role = ROLE_LONE_OPERATIVE Mind.active = TRUE Mind.transfer_to(operative) + if(!operative.client?.prefs.read_preference(/datum/preference/toggle/nuke_ops_species)) + var/species_type = operative.client.prefs.read_preference(/datum/preference/choiced/species) + operative.set_species(species_type) //Apply the preferred species to our freshly-made body. + Mind.add_antag_datum(/datum/antagonist/nukeop/lone) message_admins("[ADMIN_LOOKUPFLW(operative)] has been made into lone operative by an event.") diff --git a/code/modules/events/ghost_role/sentience.dm b/code/modules/events/ghost_role/sentience.dm index 2471849be6340..abc57d33a0758 100644 --- a/code/modules/events/ghost_role/sentience.dm +++ b/code/modules/events/ghost_role/sentience.dm @@ -4,21 +4,20 @@ GLOBAL_LIST_INIT(high_priority_sentience, typecacheof(list( /mob/living/basic/carp/pet/cayenne, /mob/living/basic/chicken, /mob/living/basic/cow, - /mob/living/basic/giant_spider/sgt_araneus, + /mob/living/basic/goat, /mob/living/basic/lizard, /mob/living/basic/mouse/brown/tom, /mob/living/basic/pet, /mob/living/basic/pig, /mob/living/basic/rabbit, /mob/living/basic/sheep, - /mob/living/simple_animal/bot/mulebot, + /mob/living/basic/sloth, + /mob/living/basic/snake, + /mob/living/basic/spider/giant/sgt_araneus, /mob/living/simple_animal/bot/secbot/beepsky, - /mob/living/simple_animal/hostile/retaliate/goat, /mob/living/simple_animal/hostile/retaliate/goose/vomit, - /mob/living/simple_animal/hostile/retaliate/snake, /mob/living/simple_animal/parrot, /mob/living/simple_animal/pet, - /mob/living/simple_animal/sloth, ))) /datum/round_event_control/sentience @@ -87,7 +86,7 @@ GLOBAL_LIST_INIT(high_priority_sentience, typecacheof(list( selected.key = picked_candidate.key - selected.grant_all_languages(TRUE, FALSE, FALSE) + selected.grant_all_languages(UNDERSTOOD_LANGUAGE, grant_omnitongue = FALSE, source = LANGUAGE_ATOM) if (isanimal(selected)) var/mob/living/simple_animal/animal_selected = selected diff --git a/code/modules/events/ghost_role/slaughter_event.dm b/code/modules/events/ghost_role/slaughter_event.dm index ed4a0da69387e..8cb2b729aa4ea 100644 --- a/code/modules/events/ghost_role/slaughter_event.dm +++ b/code/modules/events/ghost_role/slaughter_event.dm @@ -28,17 +28,13 @@ var/spawn_location = find_space_spawn() if(!spawn_location) return MAP_ERROR //This sends an error message further up. - var/mob/living/simple_animal/hostile/imp/slaughter/S = new(spawn_location) - new /obj/effect/dummy/phased_mob(spawn_location, S) + var/mob/living/basic/demon/slaughter/spawned = new(spawn_location) + new /obj/effect/dummy/phased_mob(spawn_location, spawned) - 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.") - S.log_message("was spawned as a slaughter demon by an event.", LOG_GAME) - spawned_mobs += S + player_mind.transfer_to(spawned) + spawned.generate_antagonist_status() + + message_admins("[ADMIN_LOOKUPFLW(spawned)] has been made into a slaughter demon by an event.") + spawned.log_message("was spawned as a slaughter demon by an event.", LOG_GAME) + spawned_mobs += spawned return SUCCESSFUL_SPAWN diff --git a/code/modules/events/gravity_generator_blackout.dm b/code/modules/events/gravity_generator_blackout.dm index 89cc5a43367e7..84d67753dce52 100644 --- a/code/modules/events/gravity_generator_blackout.dm +++ b/code/modules/events/gravity_generator_blackout.dm @@ -13,7 +13,7 @@ return . var/station_generator_exists = FALSE - for(var/obj/machinery/gravity_generator/main/the_generator in GLOB.machines) + for(var/obj/machinery/gravity_generator/main/the_generator as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/gravity_generator/main)) if(is_station_level(the_generator.z)) station_generator_exists = TRUE @@ -29,6 +29,6 @@ priority_announce("Gravnospheric anomalies detected near [station_name()]. Manual reset of generators is required.", "Anomaly Alert", ANNOUNCER_GRANOMALIES) /datum/round_event/gravity_generator_blackout/start() - for(var/obj/machinery/gravity_generator/main/the_generator in GLOB.machines) + for(var/obj/machinery/gravity_generator/main/the_generator as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/gravity_generator/main)) if(is_station_level(the_generator.z)) the_generator.blackout() diff --git a/code/modules/events/holiday/easter.dm b/code/modules/events/holiday/easter.dm index f4fa2a038e044..ddade60e28790 100644 --- a/code/modules/events/holiday/easter.dm +++ b/code/modules/events/holiday/easter.dm @@ -140,6 +140,7 @@ foodtypes = SUGAR | GRAIN | BREAKFAST tastes = list("pastry" = 1, "easter" = 1) bite_consumption = 2 + crafting_complexity = FOOD_COMPLEXITY_1 /datum/crafting_recipe/food/hotcrossbun name = "Hot Cross Bun" @@ -167,6 +168,7 @@ icon_state = "scotchegg" bite_consumption = 3 food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 2) + crafting_complexity = FOOD_COMPLEXITY_2 /datum/crafting_recipe/food/scotchegg name = "Scotch egg" @@ -194,6 +196,7 @@ desc = "Contains less than 10% real rabbit!" icon_state = "chocolatebunny" food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/sugar = 2, /datum/reagent/consumable/coco = 2, /datum/reagent/consumable/nutriment/vitamin = 1) + crafting_complexity = FOOD_COMPLEXITY_1 /datum/crafting_recipe/food/chocolatebunny name = "Chocolate bunny" diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm index b0b9aa35264b3..d52dd1b9c508a 100644 --- a/code/modules/events/holiday/halloween.dm +++ b/code/modules/events/holiday/halloween.dm @@ -31,12 +31,14 @@ desc = "Spooky! It's got delicious calcium flavouring!" icon = 'icons/obj/holiday/halloween_items.dmi' icon_state = "skeletoncookie" + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/cookie/sugar/spookycoffin name = "coffin cookie" desc = "Spooky! It's got delicious coffee flavouring!" icon = 'icons/obj/holiday/halloween_items.dmi' icon_state = "coffincookie" + crafting_complexity = FOOD_COMPLEXITY_2 //spooky items diff --git a/code/modules/events/immovable_rod/immovable_rod.dm b/code/modules/events/immovable_rod/immovable_rod.dm index 08453f73837ef..1280eb1faa75b 100644 --- a/code/modules/events/immovable_rod/immovable_rod.dm +++ b/code/modules/events/immovable_rod/immovable_rod.dm @@ -2,7 +2,7 @@ /obj/effect/immovablerod name = "immovable rod" desc = "What the fuck is that?" - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/anomaly.dmi' icon_state = "immrod" throwforce = 100 move_force = INFINITY @@ -182,7 +182,12 @@ SSexplosions.highturf += clong return ..() + // If we Bump into the tram front or back, push the tram. Otherwise smash the object as usual. if(isobj(clong)) + if(istramwall(clong) && !special_target) + rod_vs_tram_battle(clong) + return ..() + var/obj/clong_obj = clong clong_obj.take_damage(INFINITY, BRUTE, NONE, TRUE, dir, INFINITY) return ..() @@ -226,7 +231,7 @@ if(.) return - if(!(HAS_TRAIT(user, TRAIT_ROD_SUPLEX) || (user.mind && HAS_TRAIT(user.mind, TRAIT_ROD_SUPLEX)))) + if(!HAS_MIND_TRAIT(user, TRAIT_ROD_SUPLEX)) return playsound(src, 'sound/effects/meteorimpact.ogg', 100, TRUE) @@ -244,7 +249,7 @@ * * 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.client?.give_award(/datum/award/achievement/jobs/feat_of_strength, strongman) strongman.visible_message( span_boldwarning("[strongman] suplexes [src] into the ground!"), span_warning("You suplex [src] into the ground!") @@ -290,3 +295,25 @@ /obj/effect/immovablerod/proc/walk_in_direction(direction) destination_turf = get_edge_target_turf(src, direction) SSmove_manager.move_towards(src, destination_turf) + +/** + * Rod will push the tram to a landmark if it hits the tram from the front/back + * while flying parallel. + */ +/obj/effect/immovablerod/proc/rod_vs_tram_battle() + var/obj/structure/industrial_lift/tram/industrial_lift = locate() in src.loc + + if(isnull(industrial_lift)) + return + + var/datum/lift_master/tram/lift_master = industrial_lift.lift_master_datum + + if(isnull(lift_master)) + return + + var/push_target = lift_master.rod_collision(src) + + if(!push_target) + return + + go_for_a_walk(push_target) diff --git a/code/modules/events/immovable_rod/immovable_rod_event.dm b/code/modules/events/immovable_rod/immovable_rod_event.dm index 7be48db04a675..7c618a83a76e7 100644 --- a/code/modules/events/immovable_rod/immovable_rod_event.dm +++ b/code/modules/events/immovable_rod/immovable_rod_event.dm @@ -23,7 +23,7 @@ /datum/round_event/immovable_rod/start() var/startside = pick(GLOB.cardinals) - var/turf/end_turf = get_edge_target_turf(get_random_station_turf(), turn(startside, 180)) + var/turf/end_turf = get_edge_target_turf(get_random_station_turf(), REVERSE_DIR(startside)) var/turf/start_turf = spaceDebrisStartLoc(startside, end_turf.z) var/atom/rod = new /obj/effect/immovablerod(start_turf, end_turf, special_target, force_looping) announce_to_ghosts(rod) diff --git a/code/modules/events/market_crash.dm b/code/modules/events/market_crash.dm index 0286ec4c39973..5fb0266d05aa3 100644 --- a/code/modules/events/market_crash.dm +++ b/code/modules/events/market_crash.dm @@ -11,33 +11,47 @@ description = "Temporarily increases the prices of vending machines." /datum/round_event/market_crash - var/market_dip = 0 + /// This counts the number of ticks that the market crash event has been processing, so that we don't call vendor price updates every tick, but we still iterate for other mechanics that use inflation. + var/tick_counter = 1 /datum/round_event/market_crash/setup() start_when = 1 - end_when = rand(25, 50) + end_when = rand(100, 50) announce_when = 2 /datum/round_event/market_crash/announce(fake) var/list/poss_reasons = list("the alignment of the moon and the sun",\ "some risky housing market outcomes",\ - "The B.E.P.I.S. team's untimely downfall",\ + "the B.E.P.I.S. team's untimely downfall",\ "speculative Terragov grants backfiring",\ - "greatly exaggerated reports of Nanotrasen accountancy personnel committing mass suicide") + "greatly exaggerated reports of Nanotrasen accountancy personnel being \"laid off\"",\ + "a \"great investment\" into \"non-fungible tokens\" by a \"moron\"",\ + "a number of raids from Tiger Cooperative agents",\ + "supply chain shortages",\ + "the \"Nanotrasen+\" social media network's untimely downfall",\ + "the \"Nanotrasen+\" social media network's unfortunate success",\ + "uhh, bad luck, we guess" + ) var/reason = pick(poss_reasons) priority_announce("Due to [reason], prices for on-station vendors will be increased for a short period.", "Nanotrasen Accounting Division") /datum/round_event/market_crash/start() . = ..() - market_dip = rand(1000,10000) * length(SSeconomy.bank_accounts_by_id) - SSeconomy.station_target = max(SSeconomy.station_target - market_dip, 1) + SSeconomy.update_vending_prices() SSeconomy.price_update() ADD_TRAIT(SSeconomy, TRAIT_MARKET_CRASHING, MARKET_CRASH_EVENT_TRAIT) /datum/round_event/market_crash/end() . = ..() - SSeconomy.station_target += market_dip REMOVE_TRAIT(SSeconomy, TRAIT_MARKET_CRASHING, MARKET_CRASH_EVENT_TRAIT) SSeconomy.price_update() + SSeconomy.update_vending_prices() priority_announce("Prices for on-station vendors have now stabilized.", "Nanotrasen Accounting Division") +/datum/round_event/market_crash/tick() + . = ..() + tick_counter = tick_counter++ + SSeconomy.inflation_value = 5.5*(log(activeFor+1)) + if(tick_counter == 5) + tick_counter = 1 + SSeconomy.update_vending_prices() diff --git a/code/modules/events/meteors/dark_matteor_event.dm b/code/modules/events/meteors/dark_matteor_event.dm index 3d5918eb29b85..86d38f93e6cca 100644 --- a/code/modules/events/meteors/dark_matteor_event.dm +++ b/code/modules/events/meteors/dark_matteor_event.dm @@ -25,7 +25,7 @@ spawn_meteor(list(/obj/effect/meteor/dark_matteor = 1), null, target) /datum/round_event/dark_matteor/announce(fake) - priority_announce("Warning. Excessive tampering of meteor satellites has attracted a dark matt-eor. Signature approaching [GLOB.station_name]. Please brace for impact.", "Meteor Alert", 'sound/effects/curse1.ogg') + priority_announce("Warning. Excessive tampering of meteor satellites has attracted a dark matt-eor. Signature approaching [GLOB.station_name]. Please brace for impact.", "Meteor Alert", 'sound/misc/airraid.ogg') /datum/event_admin_setup/warn_admin/dark_matteor warning_text = "Dark Matt-eors spawn singularities. The round is ending once a dark matt-eor hits the station. Proceed anyways?" diff --git a/code/modules/events/mice_migration.dm b/code/modules/events/mice_migration.dm index e7f31567f4c96..450f910080018 100644 --- a/code/modules/events/mice_migration.dm +++ b/code/modules/events/mice_migration.dm @@ -23,7 +23,7 @@ priority_announce("Due to [cause], [plural] [name] have [movement] \ into the [location].", "Migration Alert", - 'sound/effects/mousesqueek.ogg') + 'sound/creatures/mousesqueek.ogg') /datum/round_event/mice_migration/start() SSminor_mapping.trigger_migration(rand(minimum_mice, maximum_mice)) diff --git a/code/modules/events/portal_storm.dm b/code/modules/events/portal_storm.dm index 5f2bca5071baf..9ba8ca4992e51 100644 --- a/code/modules/events/portal_storm.dm +++ b/code/modules/events/portal_storm.dm @@ -45,7 +45,7 @@ /datum/round_event/portal_storm/setup() storm_appearances = list() for(var/offset in 0 to SSmapping.max_plane_offset) - var/mutable_appearance/storm = mutable_appearance('icons/obj/engine/energy_ball.dmi', "energy_ball_fast", FLY_LAYER) + var/mutable_appearance/storm = mutable_appearance('icons/obj/machines/engine/energy_ball.dmi', "energy_ball_fast", FLY_LAYER) SET_PLANE_W_SCALAR(storm, ABOVE_GAME_PLANE, offset) storm.color = "#00FF00" storm_appearances += storm diff --git a/code/modules/events/scrubber_overflow.dm b/code/modules/events/scrubber_overflow.dm index e9bf0c8b582d0..6aad17f00faa1 100644 --- a/code/modules/events/scrubber_overflow.dm +++ b/code/modules/events/scrubber_overflow.dm @@ -70,7 +70,7 @@ priority_announce("The scrubbers network is experiencing a backpressure surge. Some ejection of contents may occur.", "Atmospherics alert") /datum/round_event/scrubber_overflow/setup() - for(var/obj/machinery/atmospherics/components/unary/vent_scrubber/temp_vent in GLOB.machines) + for(var/obj/machinery/atmospherics/components/unary/vent_scrubber/temp_vent as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/atmospherics/components/unary/vent_scrubber)) var/turf/scrubber_turf = get_turf(temp_vent) if(!scrubber_turf) continue @@ -89,7 +89,7 @@ . = ..() if(!.) return - for(var/obj/machinery/atmospherics/components/unary/vent_scrubber/temp_vent in GLOB.machines) + for(var/obj/machinery/atmospherics/components/unary/vent_scrubber/temp_vent as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/atmospherics/components/unary/vent_scrubber)) var/turf/scrubber_turf = get_turf(temp_vent) if(!scrubber_turf) continue diff --git a/code/modules/events/shuttle_loan/shuttle_loan_datum.dm b/code/modules/events/shuttle_loan/shuttle_loan_datum.dm index a29ee2704d075..550e670f695d0 100644 --- a/code/modules/events/shuttle_loan/shuttle_loan_datum.dm +++ b/code/modules/events/shuttle_loan/shuttle_loan_datum.dm @@ -17,6 +17,8 @@ . = ..() if(!logging_desc) stack_trace("No logging blurb set for [src.type]!") + if(HAS_TRAIT(SSstation, STATION_TRAIT_LOANER_SHUTTLE)) + bonus_points *= 1.15 /// Spawns paths added to `spawn_list`, and passes empty shuttle turfs so you can spawn more complicated things like dead bodies. /datum/shuttle_loan_situation/proc/spawn_items(list/spawn_list, list/empty_shuttle_turfs) @@ -118,7 +120,7 @@ spawn_list.Add(/obj/structure/closet/crate/hydroponics) for(var/i in 1 to 8) - spawn_list.Add(/mob/living/simple_animal/hostile/bee/toxin) + spawn_list.Add(/mob/living/basic/bee/toxin) for(var/i in 1 to 5) var/decal = pick(/obj/effect/decal/cleanable/blood, /obj/effect/decal/cleanable/insectguts) @@ -180,11 +182,11 @@ spawn_list.Add(/mob/living/basic/syndicate/russian) spawn_list.Add(/mob/living/basic/syndicate/russian/ranged) //drops a mateba - spawn_list.Add(/mob/living/simple_animal/hostile/bear/russian) + spawn_list.Add(/mob/living/basic/bear/russian) if(prob(75)) spawn_list.Add(/mob/living/basic/syndicate/russian) if(prob(50)) - spawn_list.Add(/mob/living/simple_animal/hostile/bear/russian) + spawn_list.Add(/mob/living/basic/bear/russian) /datum/shuttle_loan_situation/spider_gift sender = "CentCom Diplomatic Corps" @@ -196,11 +198,11 @@ var/datum/supply_pack/pack = SSshuttle.supply_packs[/datum/supply_pack/imports/specialops] pack.generate(pick_n_take(empty_shuttle_turfs)) - spawn_list.Add(/mob/living/basic/giant_spider) - spawn_list.Add(/mob/living/basic/giant_spider) - spawn_list.Add(/mob/living/basic/giant_spider/nurse) + spawn_list.Add(/mob/living/basic/spider/giant) + spawn_list.Add(/mob/living/basic/spider/giant) + spawn_list.Add(/mob/living/basic/spider/giant/nurse) if(prob(50)) - spawn_list.Add(/mob/living/basic/giant_spider/hunter) + spawn_list.Add(/mob/living/basic/spider/giant/hunter) var/turf/victim_turf = pick_n_take(empty_shuttle_turfs) diff --git a/code/modules/events/space_vines/vine_structure.dm b/code/modules/events/space_vines/vine_structure.dm index 9357dfce4545a..ab5a1e0f87e82 100644 --- a/code/modules/events/space_vines/vine_structure.dm +++ b/code/modules/events/space_vines/vine_structure.dm @@ -2,7 +2,7 @@ /obj/structure/spacevine name = "space vine" desc = "An extremely expansionistic species of vine." - icon = 'icons/effects/spacevines.dmi' + icon = 'icons/mob/spacevines.dmi' icon_state = "Light1" anchored = TRUE density = FALSE @@ -37,6 +37,7 @@ ) AddElement(/datum/element/connect_loc, loc_connections) AddElement(/datum/element/atmos_sensitive, mapload) + AddComponent(/datum/component/storm_hating) /obj/structure/spacevine/examine(mob/user) . = ..() @@ -143,7 +144,7 @@ break //only capture one mob at a time /obj/structure/spacevine/proc/entangle(mob/living/victim) - if(!victim || isvineimmune(victim)) + if(isnull(victim) || isvineimmune(victim)) return for(var/datum/spacevine_mutation/mutation in mutations) mutation.on_buckle(src, victim) @@ -153,7 +154,7 @@ /// Finds a target tile to spread to. If checks pass it will spread to it and also proc on_spread on target. /obj/structure/spacevine/proc/spread() - if(!master) //If we've lost our controller, something has gone terribly wrong. + if(isnull(master)) //If we've lost our controller, something has gone terribly wrong. return var/direction = pick(GLOB.cardinals) @@ -161,20 +162,29 @@ if(!istype(stepturf)) return - if(!isspaceturf(stepturf) && stepturf.Enter(src)) - var/obj/structure/spacevine/spot_taken = locate() in stepturf //Locates any vine on target turf. Calls that vine "spot_taken". - var/datum/spacevine_mutation/vine_eating/eating = locate() in mutations //Locates the vine eating trait in our own seed and calls it E. - if(!spot_taken || (eating && (spot_taken && !spot_taken.mutations?.Find(eating)))) //Proceed if there isn't a vine on the target turf, OR we have vine eater AND target vine is from our seed and doesn't. Vines from other seeds are eaten regardless. - for(var/datum/spacevine_mutation/mutation in mutations) - mutation.on_spread(src, stepturf) //Only do the on_spread proc if it actually spreads. - stepturf = get_step(src,direction) //in case turf changes, to make sure no runtimes happen - var/obj/structure/spacevine/spawning_vine = master.spawn_spacevine_piece(stepturf, src) //Let's do a cool little animate - if(NSCOMPONENT(direction)) - spawning_vine.pixel_y = direction == NORTH ? -32 : 32 - animate(spawning_vine, pixel_y = 0, time = 1 SECONDS) - else - spawning_vine.pixel_x = direction == EAST ? -32 : 32 - animate(spawning_vine, pixel_x = 0, time = 1 SECONDS) + if(isspaceturf(stepturf) || isopenspaceturf(stepturf) || !stepturf.Enter(src)) + return + if(ischasm(stepturf) && !HAS_TRAIT(stepturf, TRAIT_CHASM_STOPPED)) + return + if(islava(stepturf) && !HAS_TRAIT(stepturf, TRAIT_LAVA_STOPPED)) + return + var/obj/structure/spacevine/spot_taken = locate() in stepturf + var/datum/spacevine_mutation/vine_eating/eating = locate() in mutations + if(!isnull(spot_taken)) //Proceed if there isn't a vine on the target turf, OR we have vine eater AND target vine is from our seed and doesn't. + if (isnull(eating)) + return + if (spot_taken.mutations?.Find(eating)) + return + for(var/datum/spacevine_mutation/mutation in mutations) + mutation.on_spread(src, stepturf) + stepturf = get_step(src, direction) + var/obj/structure/spacevine/spawning_vine = master.spawn_spacevine_piece(stepturf, src) + if(NSCOMPONENT(direction)) + spawning_vine.pixel_y = direction == NORTH ? -32 : 32 + animate(spawning_vine, pixel_y = 0, time = 1 SECONDS) + else + spawning_vine.pixel_x = direction == EAST ? -32 : 32 + animate(spawning_vine, pixel_x = 0, time = 1 SECONDS) /// Destroying an explosive vine sets off a chain reaction /obj/structure/spacevine/ex_act(severity, target) diff --git a/code/modules/events/supermatter_surge.dm b/code/modules/events/supermatter_surge.dm new file mode 100644 index 0000000000000..6c790c84f8d7e --- /dev/null +++ b/code/modules/events/supermatter_surge.dm @@ -0,0 +1,140 @@ +#define SURGE_DURATION_MIN 240 EVENT_SECONDS +#define SURGE_DURATION_MAX 270 EVENT_SECONDS +#define SURGE_SEVERITY_MIN 1 +#define SURGE_SEVERITY_MAX 4 +#define SURGE_SEVERITY_RANDOM 5 +/// The amount of bullet energy we add for the duration of the SM surge +#define SURGE_BULLET_ENERGY_ADDITION 5 +/// The amount of powerloss inhibition (energy retention) we add for the duration of the SM surge +#define SURGE_BASE_POWERLOSS_INHIBITION 0.55 +/// The powerloss inhibition scaling based on surge severity +#define SURGE_POWERLOSS_INHIBITION_MODIFIER 0.175 +/// The power generation scaling based on surge severity +#define SURGE_POWER_GENERATION_MODIFIER 0.075 +/// The heat modifier scaling based on surge severity +#define SURGE_HEAT_MODIFIER 0.25 + +/** + * Supermatter Surge + * + * An engineering challenge event where the properties of the SM changes to be in a 'surge' of power. + * For the duration of the event a powerloss inhibition is added to nitrogen, causing the crystal to retain more of its internal energy. + * Heat modifier is lowered to generate some heat but not a high temp burn. + * Bullet energy from emitters is raised slightly to raise meV while turned on. + */ + +/datum/round_event_control/supermatter_surge + name = "Supermatter Surge" + typepath = /datum/round_event/supermatter_surge + category = EVENT_CATEGORY_ENGINEERING + weight = 15 + max_occurrences = 1 + earliest_start = 20 MINUTES + description = "The supermatter will increase in power and heat by a random amount, and announce it." + min_wizard_trigger_potency = 4 + max_wizard_trigger_potency = 7 + admin_setup = list( + /datum/event_admin_setup/input_number/surge_spiciness, + ) + +/datum/round_event_control/supermatter_surge/can_spawn_event(players_amt, allow_magic = FALSE) + . = ..() + + if(!SSjob.has_minimum_jobs(crew_threshold = 3, jobs = JOB_GROUP_ENGINEERS, head_jobs = list(JOB_CHIEF_ENGINEER))) + return FALSE + +/datum/round_event/supermatter_surge + announce_when = 4 + end_when = SURGE_DURATION_MIN + /// How powerful is the supermatter surge going to be? + var/surge_class = SURGE_SEVERITY_RANDOM + /// Typecasted reference to the supermatter chosen at event start + var/obj/machinery/power/supermatter_crystal/engine + /// Typecasted reference to the nitrogen properies in the SM chamber + var/datum/sm_gas/nitrogen/sm_gas + +/datum/event_admin_setup/input_number/surge_spiciness + input_text = "Set surge intensity. (Higher is more severe.)" + min_value = SURGE_SEVERITY_MIN + max_value = SURGE_SEVERITY_MAX + +/datum/event_admin_setup/input_number/surge_spiciness/prompt_admins() + default_value = rand(SURGE_SEVERITY_MIN, SURGE_SEVERITY_MAX) + return ..() + +/datum/event_admin_setup/input_number/surge_spiciness/apply_to_event(datum/round_event/supermatter_surge/event) + event.surge_class = chosen_value + +/datum/round_event/supermatter_surge/setup() + engine = GLOB.main_supermatter_engine + if(isnull(engine)) + stack_trace("SM surge event failed to find a supermatter engine!") + return + + sm_gas = LAZYACCESS(engine.current_gas_behavior, /datum/gas/nitrogen) + if(isnull(sm_gas)) + stack_trace("SM surge event failed to find gas properties for [engine].") + return + + if(surge_class == SURGE_SEVERITY_RANDOM) + var/severity_weight = rand(1, 100) + switch(severity_weight) + if(1 to 14) + surge_class = 1 + if(15 to 34) + surge_class = 2 + if(35 to 69) + surge_class = 3 + if(70 to 100) + surge_class = 4 + + end_when = rand(SURGE_DURATION_MIN, SURGE_DURATION_MAX) + +/datum/round_event/supermatter_surge/announce(fake) + priority_announce("The Crystal Integrity Monitoring System has detected unusual atmospheric properties in the supermatter chamber, energy output from the supermatter crystal has increased significantly. Engineering intervention is required to stabilize the engine.", "Class [surge_class] Supermatter Surge Alert", 'sound/machines/engine_alert3.ogg') + +/datum/round_event/supermatter_surge/start() + engine.bullet_energy = surge_class + SURGE_BULLET_ENERGY_ADDITION + sm_gas.powerloss_inhibition = (surge_class * SURGE_POWERLOSS_INHIBITION_MODIFIER) + SURGE_BASE_POWERLOSS_INHIBITION + sm_gas.heat_power_generation = (surge_class * SURGE_POWER_GENERATION_MODIFIER) - 1 + sm_gas.heat_modifier = (surge_class * SURGE_HEAT_MODIFIER) - 1 + + +/datum/round_event/supermatter_surge/end() + engine.bullet_energy = initial(engine.bullet_energy) + sm_gas.powerloss_inhibition = initial(sm_gas.powerloss_inhibition) + sm_gas.heat_power_generation = initial(sm_gas.heat_power_generation) + sm_gas.heat_modifier = initial(sm_gas.heat_modifier) + priority_announce("The supermatter surge has dissipated, crystal output readings have normalized.", "Anomaly Cleared") + engine = null + sm_gas = null + +/datum/round_event_control/supermatter_surge/poly + name = "Supermatter Surge: Poly's Revenge" + typepath = /datum/round_event/supermatter_surge/poly + category = EVENT_CATEGORY_ENGINEERING + weight = 0 + max_occurrences = 0 + description = "For when Poly is sacrificed to the SM. Not really useful to run manually." + min_wizard_trigger_potency = NEVER_TRIGGERED_BY_WIZARDS + max_wizard_trigger_potency = NEVER_TRIGGERED_BY_WIZARDS + admin_setup = null + +/datum/round_event/supermatter_surge/poly + announce_when = 4 + surge_class = 4 + fakeable = FALSE + +/datum/round_event/supermatter_surge/poly/announce(fake) + priority_announce("The Crystal Integrity Monitoring System has detected unusual parrot type resonance in the supermatter chamber, energy output from the supermatter crystal has increased significantly. Engineering intervention is required to stabilize the engine.", "Class P Supermatter Surge Alert", 'sound/machines/engine_alert3.ogg') + +#undef SURGE_DURATION_MIN +#undef SURGE_DURATION_MAX +#undef SURGE_SEVERITY_MIN +#undef SURGE_SEVERITY_MAX +#undef SURGE_SEVERITY_RANDOM +#undef SURGE_BULLET_ENERGY_ADDITION +#undef SURGE_BASE_POWERLOSS_INHIBITION +#undef SURGE_POWERLOSS_INHIBITION_MODIFIER +#undef SURGE_POWER_GENERATION_MODIFIER +#undef SURGE_HEAT_MODIFIER diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index 9c5b64dab7ee8..70a7900ef8c3f 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -12,7 +12,7 @@ . = ..() if(!.) return - for(var/obj/machinery/atmospherics/components/unary/vent_pump/vent in GLOB.machines) + for(var/obj/machinery/atmospherics/components/unary/vent_pump/vent as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/atmospherics/components/unary/vent_pump)) var/turf/vent_turf = get_turf(vent) if(vent_turf && is_station_level(vent_turf.z) && !vent.welded) return TRUE //make sure we have a valid vent to spawn from. @@ -75,7 +75,7 @@ var/static/list/mob_list = list( /mob/living/basic/butterfly, /mob/living/basic/cockroach, - /mob/living/basic/giant_spider/maintenance, + /mob/living/basic/spider/maintenance, /mob/living/basic/mouse, ) return pick(mob_list) @@ -83,15 +83,15 @@ /** * Finds a valid vent to spawn mobs from. * - * Randomly selects a vent that is on-station and unwelded. If no vents are found, the event + * Randomly selects a vent that is on-station, unwelded, and hosted by a passable turf. If no vents are found, the event * is immediately killed. */ /datum/round_event/vent_clog/proc/get_vent() var/list/vent_list = list() - for(var/obj/machinery/atmospherics/components/unary/vent_pump/vent in GLOB.machines) + for(var/obj/machinery/atmospherics/components/unary/vent_pump/vent as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/atmospherics/components/unary/vent_pump)) var/turf/vent_turf = get_turf(vent) - if(vent_turf && is_station_level(vent_turf.z) && !vent.welded) + if(vent_turf && is_station_level(vent_turf.z) && !vent.welded && !vent_turf.is_blocked_turf_ignore_climbable()) vent_list += vent if(!length(vent_list)) @@ -139,20 +139,27 @@ */ /datum/round_event/vent_clog/proc/produce_mob() - if(vent.welded) + var/turf/vent_loc = get_turf(vent) + if (isnull(vent_loc)) + CRASH("[vent] has no loc, aborting mobspawn") + + if(vent.welded || vent_loc.is_blocked_turf_ignore_climbable()) // vents under tables can still spawn stuff return - var/list/potential_locations = list() + var/mob/new_mob = new spawned_mob(vent_loc) // we spawn it early so we can actually use is_blocked_turf + living_mobs += WEAKREF(new_mob) + vent.visible_message(span_warning("[new_mob] crawls out of [vent]!")) + + var/list/potential_locations = list(vent_loc) // already confirmed to be accessable via the 2nd if check of the proc - for(var/turf/nearby_turf in view(1, get_turf(vent))) - if(!nearby_turf.density) + // exists to prevent mobs from trying to move onto turfs they physically cannot + for(var/turf/nearby_turf in oview(1, get_turf(vent))) // oview, since we always add our loc to the list + if(!nearby_turf.is_blocked_turf(source_atom = new_mob)) potential_locations += nearby_turf var/turf/spawn_location = pick(potential_locations) + new_mob.Move(spawn_location) - var/mob/new_mob = new spawned_mob(spawn_location) - living_mobs += WEAKREF(new_mob) - vent.visible_message(span_warning("[new_mob] crawls out of [vent]!")) var/filth_to_spawn = pick(filth_spawn_types) new filth_to_spawn(spawn_location) playsound(spawn_location, 'sound/effects/splat.ogg', 30, TRUE) @@ -213,10 +220,10 @@ /datum/round_event/vent_clog/major/get_mob() var/static/list/mob_list = list( - /mob/living/basic/mouse/rat, - /mob/living/simple_animal/hostile/bee, - /mob/living/basic/giant_spider, + /mob/living/basic/bee, /mob/living/basic/cockroach/hauberoach, + /mob/living/basic/spider/giant, + /mob/living/basic/mouse/rat, ) return pick(mob_list) @@ -248,8 +255,8 @@ /datum/round_event/vent_clog/critical/get_mob() var/static/list/mob_list = list( + /mob/living/basic/bee/toxin, /mob/living/basic/carp, - /mob/living/simple_animal/hostile/bee/toxin, /mob/living/basic/cockroach/glockroach, ) return pick(mob_list) @@ -280,12 +287,12 @@ /datum/round_event/vent_clog/strange/get_mob() var/static/list/mob_list = list( + /mob/living/basic/bear, + /mob/living/basic/cockroach/glockroach/mobroach, /mob/living/basic/lightgeist, /mob/living/basic/mothroach, - /mob/living/basic/cockroach/glockroach/mobroach, + /mob/living/basic/mushroom, /mob/living/basic/viscerator, - /mob/living/simple_animal/hostile/bear, - /mob/living/simple_animal/hostile/mushroom, /mob/living/simple_animal/hostile/retaliate/goose, //Janitors HATE geese. /mob/living/simple_animal/pet/gondola, ) diff --git a/code/modules/events/wizard/blobies.dm b/code/modules/events/wizard/blobies.dm index 307d01ff7eb42..0a9c96d513545 100644 --- a/code/modules/events/wizard/blobies.dm +++ b/code/modules/events/wizard/blobies.dm @@ -10,4 +10,4 @@ /datum/round_event/wizard/blobies/start() for(var/mob/living/carbon/human/H in GLOB.dead_mob_list) - new /mob/living/simple_animal/hostile/blob/blobspore(H.loc) + new /mob/living/basic/blob_minion/spore/minion(H.loc) // Creates zombies which ghosts can control diff --git a/code/modules/events/wizard/curseditems.dm b/code/modules/events/wizard/curseditems.dm index cc63c15cda5d6..970ce67d00897 100644 --- a/code/modules/events/wizard/curseditems.dm +++ b/code/modules/events/wizard/curseditems.dm @@ -50,7 +50,7 @@ var/obj/item/J = loadout[i] var/obj/item/I = new J //dumb but required because of byond throwing a fit anytime new gets too close to a list H.dropItemToGround(H.get_item_by_slot(i), TRUE) - H.equip_to_slot_or_del(I, i) + H.equip_to_slot_or_del(I, i, indirect_action = TRUE) ADD_TRAIT(I, TRAIT_NODROP, CURSED_ITEM_TRAIT(I)) I.item_flags |= DROPDEL I.name = "cursed " + I.name diff --git a/code/modules/events/wizard/greentext.dm b/code/modules/events/wizard/greentext.dm index ec011365d8872..6b4b8be0ff85a 100644 --- a/code/modules/events/wizard/greentext.dm +++ b/code/modules/events/wizard/greentext.dm @@ -26,15 +26,13 @@ name = "greentext" desc = "No one knows what this massive tome does, but it feels desirable all the same..." w_class = WEIGHT_CLASS_BULKY - icon = 'icons/obj/wizard.dmi' + icon = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "greentext" resistance_flags = FIRE_PROOF | ACID_PROOF | INDESTRUCTIBLE - ///The last person to touch the greentext, used for failures. - var/mob/living/last_holder ///The current holder of the greentext. - var/mob/living/new_holder + var/mob/living/holder ///Every person who has touched the greentext, having their colors changed by it. - var/list/color_altered_mobs = list() + var/list/color_altered_mobs ///The callback at the end of a round to check if the greentext has been completed. var/datum/callback/roundend_callback ///Boolean on whether to announce the greentext's destruction to all mobs. @@ -52,55 +50,58 @@ /obj/item/greentext/equipped(mob/user, slot, initial = FALSE) . = ..() to_chat(user, span_green("So long as you leave this place with greentext in hand you know will be happy...")) - var/list/other_objectives = user.mind.get_all_objectives() - if(user.mind && other_objectives.len > 0) + if(user.mind && length(user.mind.get_all_objectives()) > 0) to_chat(user, span_warning("... so long as you still perform your other objectives that is!")) - new_holder = user - if(!last_holder) - last_holder = user - if(!(user in color_altered_mobs)) - color_altered_mobs |= user - user.add_atom_colour("#00FF00", ADMIN_COLOUR_PRIORITY) - START_PROCESSING(SSobj, src) + holder = user + if(!HAS_TRAIT(user, TRAIT_GREENTEXT_CURSED)) + LAZYOR(color_altered_mobs, WEAKREF(user)) + ADD_TRAIT(user, TRAIT_GREENTEXT_CURSED, REF(src)) + user.add_atom_colour("#00ff00", ADMIN_COLOUR_PRIORITY) /obj/item/greentext/dropped(mob/user, silent = FALSE) - if(user in color_altered_mobs) + if(HAS_TRAIT(user, TRAIT_GREENTEXT_CURSED)) to_chat(user, span_warning("A sudden wave of failure washes over you...")) - user.add_atom_colour("#FF0000", ADMIN_COLOUR_PRIORITY) //ya blew it - STOP_PROCESSING(SSobj, src) - last_holder = null - new_holder = null + user.add_atom_colour("#ff0000", ADMIN_COLOUR_PRIORITY) //ya blew it + holder = null return ..() -/obj/item/greentext/process() - if(last_holder && last_holder != new_holder) //Somehow it was swiped without ever getting dropped - to_chat(last_holder, span_warning("A sudden wave of failure washes over you...")) - last_holder.add_atom_colour("#FF0000", ADMIN_COLOUR_PRIORITY) - last_holder = new_holder //long live the king - /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 - 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) - message += " and you're finally able to forgive yourself" - if(all_player_mobs.color == "#FF0000" || all_player_mobs.color == "#00FF00") - all_player_mobs.remove_atom_colour(ADMIN_COLOUR_PRIORITY) - message += "..." - if(!quiet) - to_chat(all_player_mobs, message) + roundend_callback = null //This ought to free the callback datum, and prevent us from harddeling + if(LAZYLEN(color_altered_mobs)) + INVOKE_ASYNC(src, PROC_REF(release_victims)) return ..() +/obj/item/greentext/proc/release_victims() + var/list/victims = list() + for (var/datum/weakref/player_ref as anything in color_altered_mobs) + var/mob/player_mob = player_ref.resolve() + if (player_mob) + victims += player_mob + + var/list/announce_list = quiet ? victims : GLOB.player_list + for(var/mob/player as anything in announce_list) + var/list/messages = list(span_warning("A dark temptation has passed from this world!")) + if(HAS_TRAIT(player, TRAIT_GREENTEXT_CURSED)) + messages += span_green("You're finally able to forgive yourself...") + to_chat(player, messages.Join("\n")) + for(var/mob/player as anything in victims) + REMOVE_TRAIT(player, TRAIT_GREENTEXT_CURSED, REF(src)) + if (!HAS_TRAIT(player, TRAIT_GREENTEXT_CURSED)) + player.remove_atom_colour(ADMIN_COLOUR_PRIORITY) + LAZYNULL(color_altered_mobs) + + /obj/item/greentext/proc/check_winner() - if(!new_holder) + if(!holder) return - if(!is_centcom_level(new_holder.z)) //you're winner! + if(!is_centcom_level(holder.z)) //you're winner! return - to_chat(new_holder, "At last it feels like victory is assured!") - new_holder.mind.add_antag_datum(/datum/antagonist/greentext) - new_holder.log_message("won with greentext!!!", LOG_ATTACK, color = "green") - color_altered_mobs -= new_holder + REMOVE_TRAIT(holder, TRAIT_GREENTEXT_CURSED, REF(src)) + release_victims() + to_chat(holder, span_green("At last it feels like victory is assured!")) + holder.mind.add_antag_datum(/datum/antagonist/greentext) + holder.log_message("won with greentext!!!", LOG_ATTACK, color = "green") resistance_flags |= ON_FIRE qdel(src) diff --git a/code/modules/events/wizard/petsplosion.dm b/code/modules/events/wizard/petsplosion.dm index d6b5bf4097541..e670fa910a1f0 100644 --- a/code/modules/events/wizard/petsplosion.dm +++ b/code/modules/events/wizard/petsplosion.dm @@ -5,7 +5,7 @@ GLOBAL_LIST_INIT(petsplosion_candidates, typecacheof(list( /mob/living/basic/carp/pet/cayenne, /mob/living/basic/chicken, /mob/living/basic/cow, - /mob/living/basic/giant_spider/sgt_araneus, + /mob/living/basic/goat, /mob/living/basic/lizard, /mob/living/basic/mothroach, /mob/living/basic/mouse/brown/tom, @@ -13,12 +13,12 @@ GLOBAL_LIST_INIT(petsplosion_candidates, typecacheof(list( /mob/living/basic/pig, /mob/living/basic/rabbit, /mob/living/basic/sheep, - /mob/living/simple_animal/hostile/retaliate/goat, + /mob/living/basic/sloth, + /mob/living/basic/snake, + /mob/living/basic/spider/giant/sgt_araneus, /mob/living/simple_animal/hostile/retaliate/goose/vomit, - /mob/living/simple_animal/hostile/retaliate/snake, /mob/living/simple_animal/parrot, /mob/living/simple_animal/pet, - /mob/living/simple_animal/sloth, ))) /datum/round_event_control/wizard/petsplosion //the horror diff --git a/code/modules/events/wizard/rpgloot.dm b/code/modules/events/wizard/rpgloot.dm index 79b0462d51648..443cc2ddea5f0 100644 --- a/code/modules/events/wizard/rpgloot.dm +++ b/code/modules/events/wizard/rpgloot.dm @@ -14,7 +14,7 @@ /obj/item/upgradescroll name = "item fortification scroll" desc = "Somehow, this piece of paper can be applied to items to make them \"better\". Apparently there's a risk of losing the item if it's already \"too good\". This all feels so arbitrary..." - icon = 'icons/obj/wizard.dmi' + icon = 'icons/obj/scrolls.dmi' icon_state = "scroll" worn_icon_state = "scroll" w_class = WEIGHT_CLASS_TINY @@ -23,21 +23,28 @@ var/can_backfire = TRUE var/uses = 1 -/obj/item/upgradescroll/afterattack(obj/item/target, mob/user, proximity) +/obj/item/upgradescroll/apply_fantasy_bonuses(bonus) . = ..() - if(!proximity || !istype(target)) - return + if(bonus >= 15) + can_backfire = FALSE + upgrade_amount = modify_fantasy_variable("upgrade_amount", upgrade_amount, round(bonus / 4), minimum = 1) - . |= AFTERATTACK_PROCESSED_ITEM +/obj/item/upgradescroll/remove_fantasy_bonuses(bonus) + upgrade_amount = reset_fantasy_variable("upgrade_amount", upgrade_amount) + can_backfire = TRUE + return ..() - target.AddComponent(/datum/component/fantasy, upgrade_amount, null, null, can_backfire, TRUE) +/obj/item/upgradescroll/pre_attack(obj/item/target, mob/living/user) + . = ..() + if(. || !istype(target) || !user.combat_mode) + return + target.AddComponent(/datum/component/fantasy, upgrade_amount, null, null, can_backfire, TRUE) uses -= 1 if(!uses) visible_message(span_warning("[src] vanishes, its magic completely consumed from the fortification.")) qdel(src) - - return . + return TRUE /obj/item/upgradescroll/unlimited name = "unlimited foolproof item fortification scroll" @@ -66,13 +73,16 @@ GLOBAL_DATUM(rpgloot_controller, /datum/rpgloot_controller) /datum/rpgloot_controller/New() . = ..() //second operation takes MUCH longer, so lets set up signals first. - RegisterSignal(SSdcs, COMSIG_GLOB_NEW_ITEM, PROC_REF(on_new_item_in_existence)) + RegisterSignal(SSdcs, COMSIG_GLOB_ATOM_AFTER_POST_INIT, PROC_REF(on_new_item_in_existence)) handle_current_items() ///signal sent by a new item being created. /datum/rpgloot_controller/proc/on_new_item_in_existence(datum/source, obj/item/created_item) SIGNAL_HANDLER - + if(!istype(created_item)) + return + if(created_item.item_flags & SKIP_FANTASY_ON_SPAWN) + return created_item.AddComponent(/datum/component/fantasy) /** @@ -91,12 +101,15 @@ GLOBAL_DATUM(rpgloot_controller, /datum/rpgloot_controller) fantasy_item.AddComponent(/datum/component/fantasy) + if(isnull(fantasy_item.loc)) + continue + if(istype(fantasy_item, /obj/item/storage)) var/obj/item/storage/storage_item = fantasy_item var/datum/storage/storage_component = storage_item.atom_storage if(prob(upgrade_scroll_chance) && storage_item.contents.len < storage_component.max_slots && !storage_item.invisibility) var/obj/item/upgradescroll/scroll = new(get_turf(storage_item)) - storage_item.atom_storage?.attempt_insert(scroll, override = TRUE) + storage_item.atom_storage?.attempt_insert(scroll, override = TRUE, force = STORAGE_SOFT_LOCKED) upgrade_scroll_chance = max(0,upgrade_scroll_chance-100) if(isturf(scroll.loc)) qdel(scroll) diff --git a/code/modules/events/wizard/rpgtitles.dm b/code/modules/events/wizard/rpgtitles.dm index b2890150c93df..37eae2459f62f 100644 --- a/code/modules/events/wizard/rpgtitles.dm +++ b/code/modules/events/wizard/rpgtitles.dm @@ -42,7 +42,7 @@ GLOBAL_DATUM(rpgtitle_controller, /datum/rpgtitle_controller) //we must prepare for the mother of all strings new_crewmember.maptext_height = max(new_crewmember.maptext_height, 32) - new_crewmember.maptext_width = max(new_crewmember.maptext_width, 80) + new_crewmember.maptext_width = max(new_crewmember.maptext_width, 112) new_crewmember.maptext_x = -24 - new_crewmember.base_pixel_x new_crewmember.maptext_y = -32 @@ -90,7 +90,7 @@ GLOBAL_DATUM(rpgtitle_controller, /datum/rpgtitle_controller) maptext_title += "[applicable_biotypes[iteration][1]] " //mother of all strings... - new_crewmember.maptext = "Level [rand(1, 100)] [maptext_title]" + new_crewmember.maptext = MAPTEXT_TINY_UNICODE("Level [rand(1, 100)] [maptext_title]") if(!(job.job_flags & JOB_CREW_MEMBER)) return diff --git a/code/modules/events/wormholes.dm b/code/modules/events/wormholes.dm index f80d432c8920e..b04f2a4f59582 100644 --- a/code/modules/events/wormholes.dm +++ b/code/modules/events/wormholes.dm @@ -50,10 +50,10 @@ GLOBAL_LIST_EMPTY(all_wormholes) // So we can pick wormholes to teleport to /obj/effect/portal/wormhole name = "wormhole" desc = "It looks highly unstable; It could close at any moment." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/anomaly.dmi' icon_state = "anom" mech_sized = TRUE - + light_on = FALSE /obj/effect/portal/wormhole/Initialize(mapload, _creator, _lifespan = 0, obj/effect/portal/_linked, automatic_link = FALSE, turf/hard_target_override) . = ..() diff --git a/code/modules/experisci/destructive_scanner.dm b/code/modules/experisci/destructive_scanner.dm index 596e230a15a9b..de0b03b0f0920 100644 --- a/code/modules/experisci/destructive_scanner.dm +++ b/code/modules/experisci/destructive_scanner.dm @@ -6,7 +6,7 @@ /obj/machinery/destructive_scanner name = "Experimental Destructive Scanner" desc = "A much larger version of the hand-held scanner, a charred label warns about its destructive capabilities." - icon = 'icons/obj/machines/experisci.dmi' + icon = 'icons/obj/machines/destructive_scanner.dmi' icon_state = "tube_open" circuit = /obj/item/circuitboard/machine/destructive_scanner layer = MOB_LAYER @@ -19,10 +19,17 @@ // Late load to ensure the component initialization occurs after the machines are initialized /obj/machinery/destructive_scanner/LateInitialize() . = ..() + + var/static/list/destructive_signals = list( + COMSIG_MACHINERY_DESTRUCTIVE_SCAN = TYPE_PROC_REF(/datum/component/experiment_handler, try_run_destructive_experiment), + ) + AddComponent(/datum/component/experiment_handler, \ allowed_experiments = list(/datum/experiment/scanning),\ config_mode = EXPERIMENT_CONFIG_CLICK, \ - start_experiment_callback = CALLBACK(src, PROC_REF(activate))) + start_experiment_callback = CALLBACK(src, PROC_REF(activate)), \ + experiment_signals = destructive_signals, \ + ) ///Activates the machine; checks if it can actually scan, then starts. /obj/machinery/destructive_scanner/proc/activate() @@ -82,17 +89,18 @@ if(isliving(movable_atom)) var/mob/living/fucked_up_thing = movable_atom fucked_up_thing.investigate_log("has been gibbed by [src].", INVESTIGATE_DEATHS) - fucked_up_thing.gib() + fucked_up_thing.gib(DROP_ALL_REMAINS) SEND_SIGNAL(src, COMSIG_MACHINERY_DESTRUCTIVE_SCAN, scanned_atoms) -/obj/machinery/destructive_scanner/emag_act(mob/user) +/obj/machinery/destructive_scanner/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE obj_flags |= EMAGGED playsound(src, SFX_SPARKS, 75, TRUE, SILENCED_SOUND_EXTRARANGE) - to_chat(user, span_notice("You disable the safety sensor BIOS on [src].")) + balloon_alert(user, "safety sensor BIOS disabled") + return TRUE /obj/machinery/destructive_scanner/update_icon_state() . = ..() diff --git a/code/modules/experisci/experiment/experiments.dm b/code/modules/experisci/experiment/experiments.dm index 611eaae424466..577ae59a900ec 100644 --- a/code/modules/experisci/experiment/experiments.dm +++ b/code/modules/experisci/experiment/experiments.dm @@ -44,7 +44,7 @@ /mob/living/basic/chicken, /mob/living/basic/cow, /mob/living/basic/pet/dog/corgi, - /mob/living/simple_animal/hostile/retaliate/snake, + /mob/living/basic/snake, /mob/living/simple_animal/pet/cat, ) @@ -226,7 +226,7 @@ /obj/machinery/biogenerator = 3, /obj/machinery/gibber = 3, /obj/machinery/chem_master = 3, - /obj/machinery/atmospherics/components/unary/cryo_cell = 3, + /obj/machinery/cryo_cell = 3, /obj/machinery/harvester = 5, /obj/machinery/quantumpad = 5 ) @@ -283,7 +283,6 @@ /obj/machinery/rnd/experimentor = 1, /obj/machinery/medical_kiosk = 2, /obj/machinery/piratepad/civilian = 2, - /obj/machinery/rnd/bepis = 3 ) required_stock_part = /obj/item/stock_parts/scanning_module/adv @@ -324,7 +323,7 @@ ///Damage percent that each mech needs to be at for a scan to work. var/damage_percent -/datum/experiment/scanning/random/mecha_damage_scan/New() +/datum/experiment/scanning/random/mecha_damage_scan/New(datum/techweb/techweb) . = ..() damage_percent = rand(15, 95) //updating the description with the damage_percent var set @@ -339,3 +338,43 @@ description = "As an extension of testing exosuit damage results, scanning examples of complete structural failure will accelerate our material stress simulations." possible_types = list(/obj/structure/mecha_wreckage) total_requirement = 2 + +/// Scan for organs you didn't start the round with +/datum/experiment/scanning/people/novel_organs + name = "Human Field Research: Divergent Biology" + description = "We need data on organic compatibility between species. Scan some samples of humanoid organisms with organs they don't usually have. \ + Data on mechanical organs isn't of any use to us." + performance_hint = "Unusual organs can be introduced manually by transplant, genetic infusion, or very rapidly via a Bioscrambler anomaly effect." + required_traits_desc = "non-synthetic organs not typical for their species" + /// Disallow prosthetic organs + var/organic_only = TRUE + +/datum/experiment/scanning/people/novel_organs/is_valid_scan_target(mob/living/carbon/human/check) + . = ..() + if (!.) + return + // Organs which are valid for get_mutant_organ_type_for_slot + var/static/list/vital_organ_slots = 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/obj/item/organ/organ as anything in check.organs) + if (organic_only && !IS_ORGANIC_ORGAN(organ)) + continue + var/datum/species/target_species = check.dna.species + if (organ.slot in vital_organ_slots) + if (organ.type == target_species.get_mutant_organ_type_for_slot(organ.slot)) + continue + else + if ((organ.type in target_species.mutant_organs) || (organ.type in target_species.external_organs)) + continue + return TRUE + return FALSE diff --git a/code/modules/experisci/experiment/handlers/experiment_handler.dm b/code/modules/experisci/experiment/handlers/experiment_handler.dm index cf3576a62e1cc..29e7da9539155 100644 --- a/code/modules/experisci/experiment/handlers/experiment_handler.dm +++ b/code/modules/experisci/experiment/handlers/experiment_handler.dm @@ -38,6 +38,7 @@ disallowed_traits = null, config_flags = null, datum/callback/start_experiment_callback = null, + list/experiment_signals ) . = ..() if(!ismovable(parent)) @@ -49,13 +50,8 @@ src.config_flags = config_flags src.start_experiment_callback = start_experiment_callback - if(isitem(parent)) - RegisterSignal(parent, COMSIG_ITEM_PRE_ATTACK, PROC_REF(try_run_handheld_experiment)) - RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, PROC_REF(ignored_handheld_experiment_attempt)) - if(istype(parent, /obj/machinery/destructive_scanner)) - RegisterSignal(parent, COMSIG_MACHINERY_DESTRUCTIVE_SCAN, PROC_REF(try_run_destructive_experiment)) - if(istype(parent, /obj/machinery/computer/operating)) - RegisterSignal(parent, COMSIG_OPERATING_COMPUTER_DISSECTION_COMPLETE, PROC_REF(try_run_dissection_experiment)) + for(var/signal in experiment_signals) + RegisterSignal(parent, signal, experiment_signals[signal]) // Determine UI display mode switch(config_mode) @@ -72,10 +68,7 @@ // Note this won't work at the moment for non-machines that have been included // on the map as the servers aren't initialized when the non-machines are initializing if (!(config_flags & EXPERIMENT_CONFIG_NO_AUTOCONNECT)) - var/list/found_servers = get_available_servers() - var/obj/machinery/rnd/server/selected_server = length(found_servers) ? found_servers[1] : null - if (selected_server) - link_techweb(selected_server.stored_research) + CONNECT_TO_RND_SERVER_ROUNDSTART(linked_web, parent) GLOB.experiment_handlers += src @@ -88,9 +81,9 @@ */ /datum/component/experiment_handler/proc/try_run_handheld_experiment(datum/source, atom/target, mob/user, params) SIGNAL_HANDLER - if (!should_run_handheld_experiment(source, target, user, params)) + if (!should_run_handheld_experiment(source, target, user)) return - INVOKE_ASYNC(src, PROC_REF(try_run_handheld_experiment_async), source, target, user, params) + INVOKE_ASYNC(src, PROC_REF(try_run_handheld_experiment_async), source, target, user) return COMPONENT_CANCEL_ATTACK_CHAIN /** @@ -101,7 +94,7 @@ if (!proximity_flag) return . |= COMPONENT_AFTERATTACK_PROCESSED_ITEM - if (selected_experiment == null && !(config_flags & EXPERIMENT_CONFIG_ALWAYS_ACTIVE)) + if ((selected_experiment == null && !(config_flags & EXPERIMENT_CONFIG_ALWAYS_ACTIVE)) || config_flags & EXPERIMENT_CONFIG_SILENT_FAIL) return . playsound(user, 'sound/machines/buzz-sigh.ogg', 25) to_chat(user, span_notice("[target] is not related to your currently selected experiment.")) @@ -110,7 +103,7 @@ /** * Checks that an experiment can be run using the provided target, used for preventing the cancellation of the attack chain inappropriately */ -/datum/component/experiment_handler/proc/should_run_handheld_experiment(datum/source, atom/target, mob/user, params) +/datum/component/experiment_handler/proc/should_run_handheld_experiment(datum/source, atom/target, mob/user) // Check that there is actually an experiment selected if (selected_experiment == null && !(config_flags & EXPERIMENT_CONFIG_ALWAYS_ACTIVE)) return @@ -130,16 +123,17 @@ /** * This proc exists because Jared Fogle really likes async */ -/datum/component/experiment_handler/proc/try_run_handheld_experiment_async(datum/source, atom/target, mob/user, params) +/datum/component/experiment_handler/proc/try_run_handheld_experiment_async(datum/source, atom/target, mob/user) if (selected_experiment == null && !(config_flags & EXPERIMENT_CONFIG_ALWAYS_ACTIVE)) - to_chat(user, span_notice("You do not have an experiment selected!")) + if(!(config_flags & EXPERIMENT_CONFIG_SILENT_FAIL)) + to_chat(user, span_notice("You do not have an experiment selected!")) return - if(!do_after(user, 1 SECONDS, target = target)) + if(!(config_flags & EXPERIMENT_CONFIG_IMMEDIATE_ACTION) && !do_after(user, 1 SECONDS, target = target)) return if(action_experiment(source, target)) playsound(user, 'sound/machines/ping.ogg', 25) to_chat(user, span_notice("You scan [target].")) - else + else if(!(config_flags & EXPERIMENT_CONFIG_SILENT_FAIL)) playsound(user, 'sound/machines/buzz-sigh.ogg', 25) to_chat(user, span_notice("[target] is not related to your currently selected experiment.")) @@ -151,8 +145,9 @@ SIGNAL_HANDLER var/atom/movable/our_scanner = parent if (selected_experiment == null) - playsound(our_scanner, 'sound/machines/buzz-sigh.ogg', 25) - to_chat(our_scanner, span_notice("No experiment selected!")) + if(!(config_flags & EXPERIMENT_CONFIG_SILENT_FAIL)) + playsound(our_scanner, 'sound/machines/buzz-sigh.ogg', 25) + to_chat(our_scanner, span_notice("No experiment selected!")) return var/successful_scan for(var/scan_target in scanned_atoms) @@ -162,19 +157,18 @@ if(successful_scan) playsound(our_scanner, 'sound/machines/ping.ogg', 25) to_chat(our_scanner, span_notice("The scan succeeds.")) - else + else if(!(config_flags & EXPERIMENT_CONFIG_SILENT_FAIL)) playsound(src, 'sound/machines/buzz-sigh.ogg', 25) our_scanner.say("The scan did not result in anything.") -/// Hooks on a successful dissection experiment -/datum/component/experiment_handler/proc/try_run_dissection_experiment(obj/source, mob/living/target) +/// Hooks on a successful autopsy experiment +/datum/component/experiment_handler/proc/try_run_autopsy_experiment(obj/source, mob/living/target) SIGNAL_HANDLER if (action_experiment(source, target)) playsound(source, 'sound/machines/ping.ogg', 25) - else - playsound(source, 'sound/machines/buzz-sigh.ogg', 25) - source.say("The dissection did not result in anything, either prior dissections have not been complete, or this one has already been researched.") + source.say("New unique autopsy successfully catalogued.") + /** * Announces a message to all experiment handlers @@ -265,6 +259,7 @@ /datum/component/experiment_handler/proc/link_techweb(datum/techweb/new_web) if (new_web == linked_web) return + selected_experiment?.on_unselected(src) selected_experiment = null linked_web = new_web @@ -272,6 +267,7 @@ * Unlinks this handler from the selected techweb */ /datum/component/experiment_handler/proc/unlink_techweb() + selected_experiment?.on_unselected(src) selected_experiment = null linked_web = null @@ -282,13 +278,15 @@ * * experiment - The experiment to attempt to link to */ /datum/component/experiment_handler/proc/link_experiment(datum/experiment/experiment) - if (experiment && can_select_experiment(experiment)) + if (can_select_experiment(experiment)) selected_experiment = experiment + selected_experiment.on_selected(src) /** * Unlinks this handler from the selected experiment */ /datum/component/experiment_handler/proc/unlink_experiment() + selected_experiment?.on_unselected(src) selected_experiment = null /** @@ -303,57 +301,19 @@ return FALSE // Check against the list of allowed experimentors - if (experiment.allowed_experimentors && experiment.allowed_experimentors.len) - var/matched = FALSE - for (var/experimentor in experiment.allowed_experimentors) - if (istype(parent, experimentor)) - matched = TRUE - break - if (!matched) - return FALSE + if (length(experiment.allowed_experimentors) && !is_type_in_list(parent, experiment.allowed_experimentors)) + return FALSE // Check that this experiment is visible currently - if (!linked_web || !(experiment in linked_web.available_experiments)) + if (!(experiment in linked_web?.available_experiments)) return FALSE // Check that this experiment type isn't blacklisted - for (var/badsci in blacklisted_experiments) - if (istype(experiment, badsci)) - return FALSE - - // Check against the allowed experiment types - for (var/goodsci in allowed_experiments) - if (istype(experiment, goodsci)) - return TRUE - - // If we haven't returned yet then this shouldn't be allowed - return FALSE - -/** - * Goes through all techwebs and goes through their servers to find ones on a valid z-level - * Returns the full list of all techweb servers. - */ -/datum/component/experiment_handler/proc/get_available_servers() - var/list/local_servers = list() - for (var/datum/techweb/techwebs as anything in SSresearch.techwebs) - var/list/servers = find_valid_servers(techwebs) - if(length(servers)) - local_servers += servers - return local_servers + if(is_type_in_list(experiment, blacklisted_experiments)) + return FALSE -/** - * Goes through an individual techweb's servers and finds one on a valid z-level - * Returns a list of existing ones, or an empty list otherwise. - * Args: - * - checking_web - The techweb we're checking the servers of. - */ -/datum/component/experiment_handler/proc/find_valid_servers(datum/techweb/checking_web) - var/list/valid_servers = list() - for(var/obj/machinery/rnd/server/server as anything in checking_web.techweb_servers) - if(!is_valid_z_level(get_turf(server), get_turf(parent))) - continue - valid_servers += server - return valid_servers + // Finally, check against the allowed experiment types + return is_type_in_list(experiment, allowed_experiments) /datum/component/experiment_handler/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -373,7 +333,7 @@ if(techwebs == linked_web) //disconnect if OUR techweb lost their servers. unlink_techweb() continue - if(!length(find_valid_servers(techwebs))) + if(!length(SSresearch.find_valid_servers(get_turf(parent), techwebs))) continue var/list/data = list( web_id = techwebs.id, @@ -385,12 +345,13 @@ .["techwebs"] += list(data) .["experiments"] = list() if (linked_web) - for (var/datum/experiment/experiment in linked_web.available_experiments) + for (var/datum/experiment/experiment as anything in linked_web.available_experiments) + if(!can_select_experiment(experiment)) + continue var/list/data = list( name = experiment.name, description = experiment.description, tag = experiment.exp_tag, - selectable = can_select_experiment(experiment), selected = selected_experiment == experiment, progress = experiment.check_progress(), performance_hint = experiment.performance_hint, diff --git a/code/modules/experisci/experiment/types/autopsy_experiment.dm b/code/modules/experisci/experiment/types/autopsy_experiment.dm new file mode 100644 index 0000000000000..3ef339b642aa9 --- /dev/null +++ b/code/modules/experisci/experiment/types/autopsy_experiment.dm @@ -0,0 +1,39 @@ +/datum/experiment/autopsy + name = "Autopsy Experiment" + description = "An experiment requiring a autopsy surgery to progress" + exp_tag = "Autopsy" + performance_hint = "Perform a autopsy surgery while connected to an operating computer." + +/datum/experiment/autopsy/is_complete() + return completed + +/datum/experiment/autopsy/perform_experiment_actions(datum/component/experiment_handler/experiment_handler, mob/target) + if (is_valid_autopsy(target)) + completed = TRUE + return TRUE + else + return FALSE + +/datum/experiment/autopsy/proc/is_valid_autopsy(mob/target) + return TRUE + +/datum/experiment/autopsy/human + name = "Human Autopsy Experiment" + description = "We don't want to invest in a station that doesn't know their coccyx from their cochlea. Send us back data dissecting a human to receive more funding." + +/datum/experiment/autopsy/human/is_valid_autopsy(mob/target) + return ishumanbasic(target) + +/datum/experiment/autopsy/nonhuman + name = "Non-human Autopsy Experiment" + description = "When we asked for a tail bone, we didn't mean...look, just send us back data from something OTHER than a human. It could be a monkey for all we care, just send us research." + +/datum/experiment/autopsy/nonhuman/is_valid_autopsy(mob/target) + return ishuman(target) && !ishumanbasic(target) + +/datum/experiment/autopsy/xenomorph + name = "Xenomorph Autopsy Experiment" + description = "Our understanding of the xenomorph only scratches the surface. Send us research from dissecting a xenomorph." + +/datum/experiment/autopsy/xenomorph/is_valid_autopsy(mob/target) + return isalien(target) diff --git a/code/modules/experisci/experiment/types/dissection_experiment.dm b/code/modules/experisci/experiment/types/dissection_experiment.dm deleted file mode 100644 index 7e07792032160..0000000000000 --- a/code/modules/experisci/experiment/types/dissection_experiment.dm +++ /dev/null @@ -1,39 +0,0 @@ -/datum/experiment/dissection - name = "Dissection Experiment" - description = "An experiment requiring a dissection surgery to progress" - exp_tag = "Dissection" - performance_hint = "Perform a dissection surgery while connected to an operating computer." - -/datum/experiment/dissection/is_complete() - return completed - -/datum/experiment/dissection/perform_experiment_actions(datum/component/experiment_handler/experiment_handler, mob/target) - if (is_valid_dissection(target)) - completed = TRUE - return TRUE - else - return FALSE - -/datum/experiment/dissection/proc/is_valid_dissection(mob/target) - return TRUE - -/datum/experiment/dissection/human - name = "Human Dissection Experiment" - description = "We don't want to invest in a station that doesn't know their coccyx from their cochlea. Send us back data dissecting a human to receive more funding." - -/datum/experiment/dissection/human/is_valid_dissection(mob/target) - return ishumanbasic(target) - -/datum/experiment/dissection/nonhuman - name = "Non-human Dissection Experiment" - description = "When we asked for a tail bone, we didn't mean...look, just send us back data from something OTHER than a human. It could be a monkey for all we care, just send us research." - -/datum/experiment/dissection/nonhuman/is_valid_dissection(mob/target) - return ishuman(target) && !ishumanbasic(target) - -/datum/experiment/dissection/xenomorph - name = "Xenomorph Dissection Experiment" - description = "Our understanding of the xenomorph only scratches the surface. Send us research from dissecting a xenomorph." - -/datum/experiment/dissection/xenomorph/is_valid_dissection(mob/target) - return isalien(target) diff --git a/code/modules/experisci/experiment/types/experiment.dm b/code/modules/experisci/experiment/types/experiment.dm index f760723f8db47..add015622f621 100644 --- a/code/modules/experisci/experiment/types/experiment.dm +++ b/code/modules/experisci/experiment/types/experiment.dm @@ -22,11 +22,16 @@ /// A textual hint shown on the UI in a tooltip to help a user determine how to perform /// the experiment var/performance_hint + /** + * If set, these techweb points will be rewarded for completing the experiment. + * Useful for those loose ends not tied to any specific node discount or requirement. + */ + var/list/points_reward /** * Performs any necessary initialization of tags and other variables */ -/datum/experiment/New() +/datum/experiment/New(datum/techweb/techweb) if (traits & EXPERIMENT_TRAIT_DESTRUCTIVE) exp_tag = "Destructive [exp_tag]" @@ -60,6 +65,14 @@ /datum/experiment/proc/actionable(...) return !is_complete() +///Called when the experiment is selected by an experiment handler, for specific signals and the such. +/datum/experiment/proc/on_selected(datum/component/experiment_handler/experiment_handler) + return + +///Called when the opposite happens. +/datum/experiment/proc/on_unselected(datum/component/experiment_handler/experiment_handler) + return + /** * Proc that tries to perform the experiment, and then checks if its completed. */ diff --git a/code/modules/experisci/experiment/types/exploration.dm b/code/modules/experisci/experiment/types/exploration.dm index a6a5d2cd4cf4d..821e69a103ac5 100644 --- a/code/modules/experisci/experiment/types/exploration.dm +++ b/code/modules/experisci/experiment/types/exploration.dm @@ -52,7 +52,7 @@ /// If not null the required_condition will be picked from this list var/list/possible_random_site_types -/datum/experiment/exploration_scan/random/New() +/datum/experiment/exploration_scan/random/New(datum/techweb/techweb) . = ..() if(length(possible_random_site_types)) required_site_type = pick(possible_random_site_types) diff --git a/code/modules/experisci/experiment/types/random_scanning.dm b/code/modules/experisci/experiment/types/random_scanning.dm index e80a80b5a0efa..c9d39bd47b446 100644 --- a/code/modules/experisci/experiment/types/random_scanning.dm +++ b/code/modules/experisci/experiment/types/random_scanning.dm @@ -8,7 +8,7 @@ /// Max amount of a requirement per type var/max_requirement_per_type = 100 -/datum/experiment/scanning/random/New() +/datum/experiment/scanning/random/New(datum/techweb/techweb) // Generate random contents if (possible_types.len) var/picked = 0 diff --git a/code/modules/experisci/experiment/types/scanning.dm b/code/modules/experisci/experiment/types/scanning.dm index d9bbed88c8f37..54bd2ad637e66 100644 --- a/code/modules/experisci/experiment/types/scanning.dm +++ b/code/modules/experisci/experiment/types/scanning.dm @@ -17,16 +17,18 @@ var/list/required_atoms = list() /// The list of atoms with sub-lists of atom references for scanned atoms contributing to the experiment (Or a count of atoms destoryed for destructive expiriments) var/list/scanned = list() + /// If set, it'll be used in place of the generic "Scan samples of \a [initial(target.name)]" in serialize_progress_stage() + var/scan_message /** * Initializes the scanned atoms lists * * Initializes the internal scanned atoms list to keep track of which atoms have already been scanned */ -/datum/experiment/scanning/New() +/datum/experiment/scanning/New(datum/techweb/techweb) . = ..() for (var/req_atom in required_atoms) - scanned[req_atom] = traits & EXPERIMENT_TRAIT_DESTRUCTIVE ? 0 : list() + scanned[req_atom] = (traits & EXPERIMENT_TRAIT_DESTRUCTIVE && !(traits & EXPERIMENT_TRAIT_TYPECACHE)) ? 0 : list() /** * Checks if the scanning experiment is complete @@ -37,8 +39,12 @@ /datum/experiment/scanning/is_complete() . = TRUE var/destructive = traits & EXPERIMENT_TRAIT_DESTRUCTIVE + var/typecache = traits & EXPERIMENT_TRAIT_TYPECACHE for (var/req_atom in required_atoms) var/list/seen = scanned[req_atom] + ///typecache experiments work all the same whether it's destructive or not + if(typecache && length(seen) == required_atoms[req_atom]) + continue if (destructive && (!(req_atom in scanned) || scanned[req_atom] != required_atoms[req_atom])) return FALSE if (!destructive && (!seen || seen.len != required_atoms[req_atom])) @@ -65,8 +71,9 @@ * * seen_instances - The number of instances seen of this atom */ /datum/experiment/scanning/proc/serialize_progress_stage(atom/target, list/seen_instances) - var/scanned_total = traits & EXPERIMENT_TRAIT_DESTRUCTIVE ? scanned[target] : seen_instances.len - return EXPERIMENT_PROG_INT("Scan samples of \a [initial(target.name)]", scanned_total, required_atoms[target]) + var/scanned_total = (traits & EXPERIMENT_TRAIT_DESTRUCTIVE && !(traits & EXPERIMENT_TRAIT_TYPECACHE)) ? scanned[target] : seen_instances.len + var/message = scan_message || "Scan samples of \a [initial(target.name)]" + return EXPERIMENT_PROG_INT(message, scanned_total, required_atoms[target]) /** * Attempts to scan an atom towards the experiment's goal @@ -79,7 +86,10 @@ /datum/experiment/scanning/perform_experiment_actions(datum/component/experiment_handler/experiment_handler, atom/target) var/contributing_index_value = get_contributing_index(target) if (contributing_index_value) - scanned[contributing_index_value] += traits & EXPERIMENT_TRAIT_DESTRUCTIVE ? 1 : WEAKREF(target) + if(traits & EXPERIMENT_TRAIT_TYPECACHE) + scanned[contributing_index_value][target.type] = TRUE + else + scanned[contributing_index_value] += traits & EXPERIMENT_TRAIT_DESTRUCTIVE ? 1 : WEAKREF(target) if(traits & EXPERIMENT_TRAIT_DESTRUCTIVE && !isliving(target))//only qdel things when destructive scanning and they're not living (living things get gibbed) qdel(target) do_after_experiment(target, contributing_index_value) diff --git a/code/modules/experisci/experiment/types/scanning_fish.dm b/code/modules/experisci/experiment/types/scanning_fish.dm new file mode 100644 index 0000000000000..8397801086994 --- /dev/null +++ b/code/modules/experisci/experiment/types/scanning_fish.dm @@ -0,0 +1,116 @@ +///a superlist containing typecaches shared between the several fish scanning experiments for each techweb. +GLOBAL_LIST_EMPTY(scanned_fish_by_techweb) + +/** + * A special scanning experiment that unlocks further settings for the fishing portal generator. + * Mainly as an inventive solution to many a fish source being limited to maps that have it, + * and to make the fishing portal generator a bit than just gubby and goldfish. + */ +/datum/experiment/scanning/fish + name = "Fish Scanning Experiment 1" + description = "An experiment requiring different fish species to be scanned to unlock the 'Beach' setting for the fishing portal generator." + performance_hint = "Scan fish. Examine scanner to review progress. Unlock new fishing portals." + allowed_experimentors = list(/obj/item/experi_scanner, /obj/machinery/destructive_scanner, /obj/item/fishing_rod/tech) + traits = EXPERIMENT_TRAIT_TYPECACHE + points_reward = list(TECHWEB_POINT_TYPE_GENERIC = 750) + required_atoms = list(/obj/item/fish = 4) + scan_message = "Scan different species of fish" + ///Further experiments added to the techweb when this one is completed. + var/list/next_experiments = list(/datum/experiment/scanning/fish/second) + ///Completing a experiment may also enable a fish source to be used for use for the portal generator. + var/fish_source_reward = /datum/fish_source/portal/beach + +/** + * We make sure the scanned list is shared between all fish scanning experiments for this techweb, + * since this is about scanning each species, and having to redo it for each species is a hassle. + */ +/datum/experiment/scanning/fish/New(datum/techweb/techweb) + . = ..() + if(isnull(techweb)) + return + var/techweb_ref = REF(techweb) + var/list/scanned_fish = GLOB.scanned_fish_by_techweb[techweb_ref] + if(isnull(scanned_fish)) + scanned_fish = list() + GLOB.scanned_fish_by_techweb[techweb_ref] = scanned_fish + for(var/atom_type in required_atoms) + LAZYINITLIST(scanned_fish[atom_type]) + scanned = scanned_fish + +/** + * Registers a couple signals to review the fish scanned so far. + * It'd be an hassle not having any way (beside memory) to know which fish species have been scanned already otherwise. + */ +/datum/experiment/scanning/fish/on_selected(datum/component/experiment_handler/experiment_handler) + RegisterSignal(experiment_handler.parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_handler_examine)) + RegisterSignal(experiment_handler.parent, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(on_handler_examine_more)) + +/datum/experiment/scanning/fish/on_unselected(datum/component/experiment_handler/experiment_handler) + UnregisterSignal(experiment_handler.parent, list(COMSIG_ATOM_EXAMINE, COMSIG_ATOM_EXAMINE_MORE)) + +/datum/experiment/scanning/fish/proc/on_handler_examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + examine_list += span_notice("Examine again to review all the species of fish scanned so far.") + +/datum/experiment/scanning/fish/proc/on_handler_examine_more(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + var/message = span_notice("Fish species scanned hitherto, if any:") + message += "" + for(var/atom_type in required_atoms) + for(var/obj/item/fish/fish_path as anything in scanned[atom_type]) + message += "[initial(fish_path.name)]" + message += "" + examine_list += message + +///Only scannable fish will contribute towards the experiment. +/datum/experiment/scanning/fish/final_contributing_index_checks(obj/item/fish/target, typepath) + return target.experisci_scannable + +/** + * After a fish scanning experiment is done, more may be unlocked. If so, add them to the techweb + * and automatically link the handler to the next experiment in the list as a bit of qol. + */ +/datum/experiment/scanning/fish/finish_experiment(datum/component/experiment_handler/experiment_handler, ...) + . = ..() + if(next_experiments) + experiment_handler.linked_web.add_experiments(next_experiments) + var/datum/experiment/next_in_line = locate(next_experiments[1]) in experiment_handler.linked_web.available_experiments + experiment_handler.link_experiment(next_in_line) + +/datum/experiment/scanning/fish/second + name = "Fish Scanning Experiment 2" + description = "An experiment requiring more fish species to be scanned to unlock the 'Chasm' setting for the fishing portal." + points_reward = list(TECHWEB_POINT_TYPE_GENERIC = 1500) + required_atoms = list(/obj/item/fish = 8) + next_experiments = list(/datum/experiment/scanning/fish/third) + fish_source_reward = /datum/fish_source/portal/chasm + +/datum/experiment/scanning/fish/third + name = "Fish Scanning Experiment 3" + description = "An experiment requiring even more fish species to be scanned to unlock the 'Ocean' setting for the fishing portal." + points_reward = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + required_atoms = list(/obj/item/fish = 14) + next_experiments = list(/datum/experiment/scanning/fish/fourth, /datum/experiment/scanning/fish/holographic) + fish_source_reward = /datum/fish_source/portal/ocean + +/datum/experiment/scanning/fish/holographic + name = "Holographic Fish Scanning Experiment" + description = "This one actually requires holographic fish to unlock the 'Randomizer' setting for the fishing portal." + performance_hint = "Load in the 'Beach' template at the Holodeck to fish some holo-fish." + points_reward = list(TECHWEB_POINT_TYPE_GENERIC = 500) + required_atoms = list(/obj/item/fish/holo = 4) + scan_message = "Scan different species of holographic fish" + next_experiments = null + fish_source_reward = /datum/fish_source/portal/random + +///holo fishes are normally unscannable, but this is an experiment for them, so we don't care for the experisci_scannable variable. +/datum/experiment/scanning/fish/holographic/final_contributing_index_checks(obj/item/fish/target, typepath) + return TRUE + +/datum/experiment/scanning/fish/fourth + name = "Fish Scanning Experiment 4" + description = "An experiment requiring lotsa fish species to unlock the 'Hyperspace' setting for the fishing portal." + points_reward = list(TECHWEB_POINT_TYPE_GENERIC = 3250) + required_atoms = list(/obj/item/fish = 21) + next_experiments = null + fish_source_reward = /datum/fish_source/portal/hyperspace diff --git a/code/modules/experisci/experiment/types/scanning_material.dm b/code/modules/experisci/experiment/types/scanning_material.dm index 714205289deac..fb8a7ff354b3b 100644 --- a/code/modules/experisci/experiment/types/scanning_material.dm +++ b/code/modules/experisci/experiment/types/scanning_material.dm @@ -9,7 +9,7 @@ ///List of materials actually required, indexed by the atom that is required. var/required_materials = list() -/datum/experiment/scanning/random/material/New() +/datum/experiment/scanning/random/material/New(datum/techweb/techweb) . = ..() for(var/req_atom in required_atoms) var/chosen_material = pick(possible_material_types) diff --git a/code/modules/experisci/experiment/types/scanning_people.dm b/code/modules/experisci/experiment/types/scanning_people.dm new file mode 100644 index 0000000000000..27c4168dfba07 --- /dev/null +++ b/code/modules/experisci/experiment/types/scanning_people.dm @@ -0,0 +1,34 @@ +/// An experiment where you scan your fellow humans +/datum/experiment/scanning/people + allowed_experimentors = list(/obj/item/experi_scanner, /obj/item/scanner_wand) + /// Number of people you need to scan + var/required_count = 2 + /// Does the scanned target need to have a mind? + var/mind_required = FALSE + /// How do we describe the people you need to scan? + var/required_traits_desc = "" + +/datum/experiment/scanning/people/New() + required_atoms = list(/mob/living/carbon/human = required_count) + return ..() + +/datum/experiment/scanning/people/final_contributing_index_checks(atom/target, typepath) + . = ..() + if(!.) + return FALSE + if(!ishuman(target)) + return FALSE + return is_valid_scan_target(target) + +/// Checks that the passed mob is valid human to scan +/datum/experiment/scanning/people/proc/is_valid_scan_target(mob/living/carbon/human/check) + SHOULD_CALL_PARENT(TRUE) + if(!mind_required || !isnull(check.mind)) + return TRUE + if(isliving(usr)) + check.balloon_alert(usr, "subject is mindless!") + return FALSE + +/datum/experiment/scanning/people/serialize_progress_stage(atom/target, list/seen_instances) + return EXPERIMENT_PROG_INT("Scan unique individuals with [required_traits_desc].", \ + seen_instances.len, required_atoms[target]) diff --git a/code/modules/experisci/experiment/types/scanning_plants.dm b/code/modules/experisci/experiment/types/scanning_plants.dm index c34822d6e7e74..b92a4cc20b466 100644 --- a/code/modules/experisci/experiment/types/scanning_plants.dm +++ b/code/modules/experisci/experiment/types/scanning_plants.dm @@ -10,7 +10,7 @@ ///List of plant genes actually required, indexed by the atom that is required. var/list/required_genes = list() -/datum/experiment/scanning/random/plants/New() +/datum/experiment/scanning/random/plants/New(datum/techweb/techweb) . = ..() if(possible_plant_genes.len) for(var/req_atom in required_atoms) diff --git a/code/modules/experisci/handheld_scanner.dm b/code/modules/experisci/handheld_scanner.dm index e0fd4d480d5a3..92031107ba51d 100644 --- a/code/modules/experisci/handheld_scanner.dm +++ b/code/modules/experisci/handheld_scanner.dm @@ -19,9 +19,15 @@ // Late initialize to allow for the rnd servers to initialize first /obj/item/experi_scanner/LateInitialize() . = ..() + var/static/list/handheld_signals = list( + COMSIG_ITEM_PRE_ATTACK = TYPE_PROC_REF(/datum/component/experiment_handler, try_run_handheld_experiment), + COMSIG_ITEM_AFTERATTACK = TYPE_PROC_REF(/datum/component/experiment_handler, ignored_handheld_experiment_attempt), + ) AddComponent(/datum/component/experiment_handler, \ - allowed_experiments = list(/datum/experiment/scanning, /datum/experiment/physical),\ - disallowed_traits = EXPERIMENT_TRAIT_DESTRUCTIVE) + allowed_experiments = list(/datum/experiment/scanning, /datum/experiment/physical), \ + disallowed_traits = EXPERIMENT_TRAIT_DESTRUCTIVE, \ + experiment_signals = handheld_signals, \ + ) /obj/item/experi_scanner/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] is giving in to the Great Toilet Beyond! It looks like [user.p_theyre()] trying to commit suicide!")) @@ -53,6 +59,6 @@ icon_state = "experiscanner" remove_atom_colour(ADMIN_COLOUR_PRIORITY, "#FF0000") - user.gib(FALSE, TRUE, TRUE) //we delete everything but the brain, as it's going to be moved to the cistern + user.gib(DROP_BRAIN) //we delete everything but the brain, as it's going to be moved to the cistern toilet_brain.forceMove(result_toilet) result_toilet.w_items += toilet_brain.w_class diff --git a/code/modules/explorer_drone/adventure.dm b/code/modules/explorer_drone/adventure.dm index 9718d6d5a49de..56d83000f905c 100644 --- a/code/modules/explorer_drone/adventure.dm +++ b/code/modules/explorer_drone/adventure.dm @@ -43,6 +43,7 @@ #define REQ_OPERATOR_FIELD "operator" #define CURRENT_ADVENTURE_VERSION 1 +#define ADVENTURE_LOOK_PATH "strings/exoadventures/" /// All possible adventures in raw form GLOBAL_LIST_EMPTY(explorer_drone_adventure_db_entries) @@ -50,34 +51,22 @@ GLOBAL_LIST_EMPTY(explorer_drone_adventure_db_entries) /// Loads all adventures from DB /proc/load_adventures() . = list() - if(!SSdbcore.Connect()) - GLOB.explorer_drone_adventure_db_entries = . - return - var/datum/db_query/Query = SSdbcore.NewQuery("SELECT id,adventure_data,uploader,timestamp,approved FROM [format_table_name("text_adventures")]") - if(!Query.Execute()) - qdel(Query) - return - while(Query.NextRow()) + for(var/filename in flist(ADVENTURE_LOOK_PATH)) + var/raw_json = file2text(ADVENTURE_LOOK_PATH + filename) + var/list/json_decoded = json_decode(raw_json) var/datum/adventure_db_entry/entry = new() - entry.id = Query.item[1] - entry.raw_json = Query.item[2] - entry.uploader = Query.item[3] - entry.timestamp = Query.item[4] - entry.approved = Query.item[5] + entry.filename = filename + entry.raw_json = raw_json + entry.uploader = json_decoded["author"] entry.extract_metadata() . += entry - qdel(Query) GLOB.explorer_drone_adventure_db_entries = . /datum/adventure_db_entry - /// db id or null for freshly created adventures - var/id + /// filename of the adventure + var/filename /// actual adventure json string var/raw_json - /// ckey of last change user. - var/uploader - /// Time of last change. - var/timestamp /// Unapproved adventures won't be used for exploration sites. var/approved = FALSE /// Was the adventure used for exploration site this round. @@ -85,6 +74,8 @@ GLOBAL_LIST_EMPTY(explorer_drone_adventure_db_entries) //Variables below are extracted from the JSON + /// whoever made the json + var/uploader /// json version var/version /// adventure name @@ -100,61 +91,13 @@ GLOBAL_LIST_EMPTY(explorer_drone_adventure_db_entries) return FALSE return TRUE -/// Updates this entry from db, if possible. -/datum/adventure_db_entry/proc/refresh() - if(id) - //Check if our timestamp is fresh, if not update local and stop - var/datum/db_query/SelectQuery = SSdbcore.NewQuery("SELECT adventure_data,uploader,timestamp,approved FROM [format_table_name("text_adventures")] WHERE id = :id",list("id" = id)) - if(!SelectQuery.warn_execute() || !SelectQuery.NextRow()) - qdel(SelectQuery) - return - raw_json = SelectQuery.item[1] - uploader = SelectQuery.item[2] - timestamp = SelectQuery.item[3] - approved = SelectQuery.item[4] - extract_metadata() - qdel(SelectQuery) - return - // No ID, nothing to be done. - -/// Pushes this entry changes to DB -/datum/adventure_db_entry/proc/save() - if(id) - //We're up to date, update db instead - var/datum/db_query/UpdateQuery = SSdbcore.NewQuery("UPDATE [format_table_name("text_adventures")] SET adventure_data = :adventure_data,uploader = :uploader,approved = :approved WHERE id = :id AND timestamp < NOW()", - list("id" = id, "adventure_data" = raw_json, "uploader" = usr.ckey, "approved" = approved)) - UpdateQuery.warn_execute() - qdel(UpdateQuery) - else - // Create new entry - var/datum/db_query/InsertQuery = SSdbcore.NewQuery("INSERT INTO [format_table_name("text_adventures")] (adventure_data, uploader) VALUES (:raw_json, :uploader)", list("raw_json" = raw_json, "uploader" = usr.ckey)) - if(!InsertQuery.warn_execute()) - qdel(InsertQuery) - return FALSE - id = InsertQuery.last_insert_id - qdel(InsertQuery) - refresh() - -/// Deletes the local AND db entry. -/datum/adventure_db_entry/proc/remove() - if(id) - var/datum/db_query/DelQuery = SSdbcore.NewQuery("DELETE FROM [format_table_name("text_adventures")] WHERE id = :id", list("id" = id)) - if(!DelQuery.warn_execute()) - qdel(DelQuery) - return FALSE - log_admin("[key_name(usr)] deleted text adventure with id : [id], name : [name]") - qdel(DelQuery) - GLOB.explorer_drone_adventure_db_entries -= src - qdel(src) - return TRUE - /// Extracts fields that are used by adventure browser / generation before instantiating /datum/adventure_db_entry/proc/extract_metadata() if(!raw_json) CRASH("Trying to extract metadata from empty adventure") var/list/json_data = json_decode(raw_json) if(!islist(json_data)) - CRASH("Invalid JSON for adventure with db id:[id]") + CRASH("Invalid JSON for adventure with at path:[filename]") version = json_data[ADVENTURE_VERSION_FIELD] || 0 name = json_data[ADVENTURE_NAME_FIELD] required_site_traits = json_data[ADVENTURE_REQUIRED_SITE_TRAITS_FIELD] @@ -169,13 +112,13 @@ GLOBAL_LIST_EMPTY(explorer_drone_adventure_db_entries) /datum/adventure_db_entry/proc/try_loading_adventure() var/list/json_data = json_decode(raw_json) if(!islist(json_data)) - CRASH("Invalid JSON in adventure with id:[id], name:[name]") + CRASH("Invalid JSON in adventure with path:[filename], name:[name]") //Basic validation of required fields, don't even bother loading if they are missing. var/static/list/required_fields = list(ADVENTURE_NAME_FIELD,ADVENTURE_STARTING_NODE_FIELD,ADVENTURE_NODES_FIELD) for(var/field in required_fields) if(!json_data[field]) - CRASH("Adventure id:[id], name:[name] missing [field] value") + CRASH("Adventure path:[filename], name:[name] missing [field] value") var/datum/adventure/loaded_adventure = new //load properties @@ -191,16 +134,16 @@ GLOBAL_LIST_EMPTY(explorer_drone_adventure_db_entries) var/datum/adventure_node/node = try_loading_node(node_data) if(node) if(loaded_adventure.nodes[node.id]) - CRASH("Duplicate [node.id] node in id:[id], name:[name] adventure") + CRASH("Duplicate [node.id] node in path:[filename], name:[name] adventure") loaded_adventure.nodes[node.id] = node loaded_adventure.triggers = json_data[ADVENTURE_TRIGGERS_FIELD] if(!loaded_adventure.validate()) - CRASH("Validation failed for id:[id], name:[name] adventure") + CRASH("Validation failed for path:[filename], name:[name] adventure") return loaded_adventure /datum/adventure_db_entry/proc/try_loading_node(node_data) if(!islist(node_data)) - CRASH("Invalid adventure node data in id:[id], name:[name] adventure.") + CRASH("Invalid adventure node data in path:[filename], name:[name] adventure.") var/datum/adventure_node/fresh_node = new fresh_node.id = node_data[NODE_NAME_FIELD] fresh_node.description = node_data[NODE_DESCRIPTION_FIELD] @@ -493,6 +436,7 @@ GLOBAL_LIST_EMPTY(explorer_drone_adventure_db_entries) if("exists") return qkey in qualities +#undef ADVENTURE_LOOK_PATH #undef ADVENTURE_VERSION_FIELD #undef CURRENT_ADVENTURE_VERSION diff --git a/code/modules/explorer_drone/control_console.dm b/code/modules/explorer_drone/control_console.dm index f4ed3260231ff..8cc8854f27dc8 100644 --- a/code/modules/explorer_drone/control_console.dm +++ b/code/modules/explorer_drone/control_console.dm @@ -1,6 +1,7 @@ /obj/machinery/computer/exodrone_control_console name = "exploration drone control console" - desc = "control eploration drones from intersteller distances. Communication lag not included." + desc = "Control exploration drones from interstellar distances. Communication lag not included." + circuit = /obj/item/circuitboard/computer/exodrone_console //Currently controlled drone var/obj/item/exodrone/controlled_drone /// Have we lost contact with the drone without disconnecting. Unset on user confirmation. @@ -130,6 +131,9 @@ target_site = locate(params["target_site"]) in GLOB.exploration_sites if(!target_site) return TRUE + if(!controlled_drone.check_blacklist()) + say("Error - An unauthorized object was found inside the cargo!") + return TRUE controlled_drone.launch_for(target_site) return TRUE if("explore") diff --git a/code/modules/explorer_drone/example_adventures/Theres_a_tree_in_the_middle_of_space.json b/code/modules/explorer_drone/example_adventures/Theres_a_tree_in_the_middle_of_space.json deleted file mode 100644 index 3f9ee41582eef..0000000000000 --- a/code/modules/explorer_drone/example_adventures/Theres_a_tree_in_the_middle_of_space.json +++ /dev/null @@ -1,343 +0,0 @@ -{ - "adventure_name": "There's a tree in the middle of space.", - "version": 1, - "starting_node": "Tree Start", - "starting_qualities": { - "Confusion": 0 - }, - "required_site_traits": [ - "in space" - ], - "loot_categories": [ - "research" - ], - "scan_band_mods": { - "Exotic Radiation": 10 - }, - "deep_scan_description": "", - "triggers": [ - { - "name": "Confusion Trigger", - "target_node": "What is wrong with this tree?", - "requirements": [ - { - "quality": "Confusion", - "operator": ">", - "value": 30 - } - ] - } - ], - "nodes": [ - { - "name": "Tree Start", - "description": "Camera online. Visual signs detect a fully grown, seemingly biological, and live tree located in the middle of the vacuum.\nSensors indicate it is not oxygenating, but energy is being collected via passive solar light from the nearby star.\nBaffling.", - "choices": [ - { - "key": "choice 0", - "name": "Ignore site.", - "exit_node": "FAIL", - "delay": 10, - "delay_message": "Leave this for the botanists to figure out." - }, - { - "key": "choice 1", - "name": "Begin sensor scan.", - "exit_node": "Biological Scan", - "delay": 10, - "delay_message": "Lets get some data." - } - ], - "image": null, - "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMQAAAAAAAC15h2QtxeAoxVykROizRpxjxIAcgAAWwAAgAAAUAAAZAAAZgC0tLTKysr///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF/2AgjmRpnigqrMMqtCvhyvFs17hQuPva67ygTwgcGovA3a61BLaeryj0mapar9isNjCNylpfgWwsLpPPZqBst066le84fB5nRpvdvGDL7/v/JmBeaWiFhIeGbGqLio1ljm2CklKUA4CXmJmaAYidhp9mBmOiYqQEpqZlk3qbra6vsCOenqijtgIHCLG7vL29CQoNCsDCxMPBxw0MxsTLyMLCCwq+1LuVe9VZ0M/c297d4NvZ41vXeueU5N/r4e3o79jkvOb0UAe4+Pf6uMjS7P/TtAAcGKyeQXhT5ClcSKIdwYcHIyKMx7CiwocOwU3cWMmiR4YYQzqM+LGkSQXSUv/2y0jQH0qUJmNqoRSm5ixQbXLK2UmnJ886ToIilFltkk2cNw9B+umz6U87UOsRNXk0KdKrVrOSWWVwqlc+WHHWKnWqrKizZV+QGrA2yte31YDJPTZXrrMEzhbkPSYNWF+4gAFBeICJGTLDxVi2C5yNIxSQikVu48i4j8TLT1i2khwOM+bKVSQaeGLgQOnS+fIBwkiCszfPjqWAnn0ism1hsXO/oM279e3fuqmYeAChN++XKqP9BujP+EcXMKLkoFFm+o3qSH5oJ7L9SPfs3IlEHw/dhfNyLMpbX4+duvvw3uGDj08fCfn0+KVTPI9Ff/T37AHY3nXfFSifgfX9cJ//f/vxh95/1wkoYYQU5oDgfBh+t+B9DsJS4YABfiiDAWWQOGKJKJ6oYidcDdVhUVrFGFZWRl32IlEy0nJLWjyu1VYYrNxY2YxXjZUWW1+0FaSQDiaQ4z0y3OMXX3wxaSUKiWWZTF5c+sVASl8iB9OVbxFH3CVabmOMa9yQ6WYAbHL2Zh+UVRTnbV3NyUlwu120HEuw9WlloO+Mc+c3fCbEH6ES/Ybmn9AwWmdvnu1jaWoHpMBmFYdK+tmLiQqKCaTAebqRnh4d6o6pEqHqEan/sOqiqxbBumqoig42GK0WqUqQY7zCtZKvDgXL37AvEbvNAsaeJ6Zy0JKqErPNYpIj/xqOOKUtU9xu6+1OUekpCJFpLPXtud2mu21UTbhKLraPqCsvuvQ+FdQSqI57bbnxtlHvv/OCK5RsqO4Lr78BA6xwulDR+m4n5iYs8cJNVNyguwYzEi/FE3dsR7UpZJzIxh1z7FO4IJ8gMr860WuAEi/rEHMBM88s8ccpn/AwVhEjTDPMQMsc9M9Cx9HyIJbknMLOEJNC8xpOR/3zy1RPbXXVWD8tM9Rcq3Kx0lesvKORZz2NFtVmnWJ2j2NLAnYsiJCd9tlzz7122XTnnfbb2dxUi96A1x044GDwnc0Zfwuu+OCLK274c4UkzvjkZj3+ldxkUY5AApt3noDlldF1zP/YBAyzuemcp4665wGBDlcDeCUA+zKzyx77Arfnvjnuy+C+u+uADXPXMsTHXvzxxid/PPC8OEAYmnLBPoz0ttMee+3YXx/958y/oqsDl4hel/jkjz9+Md17Rf3620/fvu3uxy97A+lPVT75ic2lJWLDWD7AE/97QQCT1qv3sU9+6ytGAxTIQL7FpiLJiCD/JggOYJxKXAPMIAA3KCp1MHB6H5wfCEcowgRoUIAc/F8L3CSrr/EiGAsc4QKhEcMZwpCG0DihClHIQxVeaYdA1KEQAWioD9pQhEesoRJTOMQe/k9ITQwiEzloQ/q9sIpKxOENt9iAKHpxgw76ohOnKED/LWJRGJrIIhfVWEUxSnGMPDQOGd+4wwME0I76COAC2MhHNPZhjWbk4xzd2MTeNBGPuBiAPg6wyEbiIlMiaEBKYrjHQOJQG5YE5BbpSMhByvGQiixNKBlpGlI+8h5a0OQZg2ECVfYRhoOMJRx36JxZ/k+UbMGjKEupyERi4pUzjGQmV9lGWXLSkxiMoy+ICcxmNsCWxvRi/VYzw2pa85rYvKYKt8nNbnrzm96c5h+G6UwudhKacBTnOLPJznYuEJzwjCc41blOctoTlug8JjTpiSZ3+lOb3LTj/wSqSHlycwQPeB4//8jMe2KRgwJNZDQJaCaFLlQge6ykJP/ZTo3iYbGgHx3oPC+6CZRQspwNNakwEMnSE5L0FRndaEwXqFGO0lSmG32pQmLK043e1KYz7KlO5dHTouKUo0YdKjmMalSk4jSmSh3HAqb61KpqtKZBtWpOo1oNpmoVq9dkKrWMEwIAOw==" - }, - { - "name": "Biological Scan", - "description": "You attempt to scan for clues regarding the tree's nature. It appears to be a fully mature oak tree. \n\nApproximated height is 13 ft, 6.4 inches. \n\nSubject sees no sign of an outer coating or otherwise layer protecting it from the void of space.\n\nSubject's surface temperature is 293.7 kelvin, as though it were sitting indoors.", - "choices": [ - { - "key": "choice 2", - "name": "Check Sensor Integrity.", - "exit_node": "Its Not You...", - "on_selection_effects": [ - { - "effect_type": "Add", - "quality": "Confusion", - "value": 5 - } - ], - "delay": 50, - "delay_message": "This can't be right." - }, - { - "key": "choice 4", - "name": "Attempt to take sample.", - "exit_node": "Sample Taken", - "on_selection_effects": [ - { - "effect_type": "Add", - "quality": "Confusion", - "value": 3 - } - ], - "delay": 40, - "delay_message": "Snip snip." - }, - { - "key": "choice 6", - "name": "Examine Tree Roots.", - "exit_node": "Examine Roots", - "delay": 10 - }, - { - "key": "choice 9", - "name": "Sequence Sample Radiation with background noise.", - "exit_node": "Background Analysis", - "requirements": [ - { - "quality": "Sample", - "operator": ">=", - "value": 1 - } - ], - "delay": 0, - "delay_message": "This can't be real." - } - ], - "image": null, - "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMQAAAAAAAC15h2QtxeAoxVykROizRpxjxIAcgAAWwAAgAAAUAAAZAAAZgC0tLTKysr///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF/2AgjmRpnigqrMMqtCvhyvFs17hQuPva67ygTwgcGovA3a61BLaeryj0mapar9isNjCNylpfgWwsLpPPZqBst066le84fB5nRpvdvGDL7/v/JmBeaWiFhIeGbGqLio1ljm2CklKUA4CXmJmaAYidhp9mBmOiYqQEpqZlk3qbra6vsCOenqijtgIHCLG7vL29CQoNCsDCxMPBxw0MxsTLyMLCCwq+1LuVe9VZ0M/c297d4NvZ41vXeueU5N/r4e3o79jkvOb0UAe4+Pf6uMjS7P/TtAAcGKyeQXhT5ClcSKIdwYcHIyKMx7CiwocOwU3cWMmiR4YYQzqM+LGkSQXSUv/2y0jQH0qUJmNqoRSm5ixQbXLK2UmnJ886ToIilFltkk2cNw9B+umz6U87UOsRNXk0KdKrVrOSWWVwqlc+WHHWKnWqrKizZV+QGrA2yte31YDJPTZXrrMEzhbkPSYNWF+4gAFBeICJGTLDxVi2C5yNIxSQikVu48i4j8TLT1i2khwOM+bKVSQaeGLgQOnS+fIBwkiCszfPjqWAnn0ism1hsXO/oM279e3fuqmYeAChN++XKqP9BujP+EcXMKLkoFFm+o3qSH5oJ7L9SPfs3IlEHw/dhfNyLMpbX4+duvvw3uGDj08fCfn0+KVTPI9Ff/T37AHY3nXfFSifgfX9cJ//f/vxh95/1wkoYYQU5oDgfBh+t+B9DsJS4YABfiiDAWWQOGKJKJ6oYidcDdVhUVrFGFZWRl32IlEy0nJLWjyu1VYYrNxY2YxXjZUWW1+0FaSQDiaQ4z0y3OMXX3wxaSUKiWWZTF5c+sVASl8iB9OVbxFH3CVabmOMa9yQ6WYAbHL2Zh+UVRTnbV3NyUlwu120HEuw9WlloO+Mc+c3fCbEH6ES/Ybmn9AwWmdvnu1jaWoHpMBmFYdK+tmLiQqKCaTAebqRnh4d6o6pEqHqEan/sOqiqxbBumqoig42GK0WqUqQY7zCtZKvDgXL37AvEbvNAsaeJ6Zy0JKqErPNYpIj/xqOOKUtU9xu6+1OUekpCJFpLPXtud2mu21UTbhKLraPqCsvuvQ+FdQSqI57bbnxtlHvv/OCK5RsqO4Lr78BA6xwulDR+m4n5iYs8cJNVNyguwYzEi/FE3dsR7UpZJzIxh1z7FO4IJ8gMr860WuAEi/rEHMBM88s8ccpn/AwVhEjTDPMQMsc9M9Cx9HyIJbknMLOEJNC8xpOR/3zy1RPbXXVWD8tM9Rcq3Kx0lesvKORZz2NFtVmnWJ2j2NLAnYsiJCd9tlzz7122XTnnfbb2dxUi96A1x044GDwnc0Zfwuu+OCLK274c4UkzvjkZj3+ldxkUY5AApt3noDlldF1zP/YBAyzuemcp4665wGBDlcDeCUA+zKzyx77Arfnvjnuy+C+u+uADXPXMsTHXvzxxid/PPC8OEAYmnLBPoz0ttMee+3YXx/958y/oqsDl4hel/jkjz9+Md17Rf3620/fvu3uxy97A+lPVT75ic2lJWLDWD7AE/97QQCT1qv3sU9+6ytGAxTIQL7FpiLJiCD/JggOYJxKXAPMIAA3KCp1MHB6H5wfCEcowgRoUIAc/F8L3CSrr/EiGAsc4QKhEcMZwpCG0DihClHIQxVeaYdA1KEQAWioD9pQhEesoRJTOMQe/k9ITQwiEzloQ/q9sIpKxOENt9iAKHpxgw76ohOnKED/LWJRGJrIIhfVWEUxSnGMPDQOGd+4wwME0I76COAC2MhHNPZhjWbk4xzd2MTeNBGPuBiAPg6wyEbiIlMiaEBKYrjHQOJQG5YE5BbpSMhByvGQiixNKBlpGlI+8h5a0OQZg2ECVfYRhoOMJRx36JxZ/k+UbMGjKEupyERi4pUzjGQmV9lGWXLSkxiMoy+ICcxmNsCWxvRi/VYzw2pa85rYvKYKt8nNbnrzm96c5h+G6UwudhKacBTnOLPJznYuEJzwjCc41blOctoTlug8JjTpiSZ3+lOb3LTj/wSqSHlycwQPeB4//8jMe2KRgwJNZDQJaCaFLlQge6ykJP/ZTo3iYbGgHx3oPC+6CZRQspwNNakwEMnSE5L0FRndaEwXqFGO0lSmG32pQmLK043e1KYz7KlO5dHTouKUo0YdKjmMalSk4jSmSh3HAqb61KpqtKZBtWpOo1oNpmoVq9dkKrWMEwIAOw==" - }, - { - "name": "Its Not You...", - "description": "After re-connection is established, your sensors appear fine. Tree has not moved in the slightest since last observed. Temperature has fluxuated 0.2 kelvin upwards, as expected of a plant under direct light.\nLets try again.", - "choices": [ - { - "key": "choice 3", - "name": "Restart biological scan.", - "exit_node": "Biological Scan", - "delay": 25, - "delay_message": "God damnit." - } - ], - "image": null, - "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAAD////v7+/h4eEAAAAAAAAAAAAD/xi63P4wykmrvTjrzbv/YCiOZBkJaJqaLKOubSy7b23fODxPOb7/m4FASBRofEBeT1W6JU3DYaRIjQqfkCWKg1xoddjSQEgQlM/mdDkc0Fa+8PiWLSIM7Pj73RxOlVF/ITlKNXSGDXp5iiFoaBlqfpFyk12HMgSYmZkfmppmmJ8gjXwUf2lglqmqq6ytrq+wsbKztLW2t7i5um2Ug669uyBCKMNRc4Q9qXHBJlVUFMbRV6pfR04ONszQzlZRlm7IveLaimZ7eJAESUsfyVnX2hfqv/Nv4vfZ8RWJ/Hkdn6NGtRsFyEg4VLwK6UvVqROdgMcWSpxIsaLFixgzatzIsf+jR1gIP7YbN6uaSAn4wFGbdNJFsZcpFRqS09IBt2kW3CkzWdNmNyIYpIWkw9Nevgbwat2ccNPbTnbWjtKQWfGnVZwzoQaNqVXXkDFWGx3qeoIry2CJzJ05p6aPTpRmfSXV1a/u2jM7TuldA8LXO6kXFemh5ihn3Lc9A9h1ZaqxpMNkK9rl5+EMKIGM9g5FSjJjv4aVOwEc/Q8iXx6ODSo5ualOQ9Bs0qVJTLu27du4c+vezbu379/AgwsfTry48ePIkytfqHp5xhfLadby+1soMJDLbhchlqIYpVbXa14dz718NMBEz/ZsWsU8zMhY1CdmL+VE+/ObgWSvPR4rj/f/xqxUFG1fVfHIUgLCN58zR5ABySpwbAAdZ1TNMgZYF9YHjWmsDAgNeglNqFSBJJYiG14JUmcYiHNZWJcE6HD4FGIrVuiFjROxJeNYChoFWUS5lBPjOTO2iM2PKuki2F1qfdPjjUjSeMuSk82Uml4fRimlLVR2OUAYBGHpo5aV4OJll1iYRkqWhag4FY75WXhmlTOoedo/ZVKI40Jz+pOEnX2ZsqcCeVJ0piEQieJhiEx0RBkrd6J2IiQFVXqPbZjEYqdmll6Jz0avtUaCqEFtaiqnekmHUagOhSZapvJMeioanXa2KqukZoCrJoruCKNmCngKZGC7urprPRKq+QZBP2XFKRGunBwL6waZjIbiBInu9hoj0o5wraRiOadrsX1kK24HvBK25rnstuvuu/DGK++89NZr77345qvvvhYlAAA7" - }, - { - "name": "Sample Taken", - "description": "You collect and project a small sample of tree bark off the plant. The instant that the bark is removed from the tree, as though it suddenly remembered what it was, the moisture content of the bark freezes over, and implodes into small microparticles of splinters.\nSmall radioactive signature detected.", - "choices": [ - { - "key": "choice 5", - "name": "Well that was... unexpected.", - "exit_node": "Biological Scan", - "delay": 0, - "delay_message": "Maybe something else might work better.", - "on_selection_effects": [ - { - "effect_type": "Add", - "quality": "Sample", - "value": 1 - } - ] - } - ], - "image": null, - "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAABSLiiPVjtyRS9mOTFbNyYAAAAD/xi63P4wykmrvTjrzbv/YCiOZGmeaKqubOu+sDUQxTDbeK7vfF/3saCwcxPcCMckcqlM2pDPnnRKrUqH2IdAYDBwu+Bwl2Agm8sE8iy9Zrqbb2Z0bq3b74W8Xp+1bP+Af2KDhIVlh2eJaUtsi3CPcU43d5QDe5cFfSKBnJ2en50Ff6JboqYCBWiLq46tkK+RUJOTmJmatxyguqSovae/vsGirK2NjU21trjLQp+8wNDCwnmo1MnM2Nna29zd3t/g4eLj5OXm59o5Rjo/QOjvLaKwkrKylfdW8FleXImIBm0CxppXD4c9fAgT5tCn4Iuhh4fG/DNTjNHAi4/oKERYq/+cro8gPYXxR7EkK4EEUxbUOCVZHoabQoZ8NkqaKWI4BR7DGKcjTG4yaZaySRSatQLGfP5ciqHX0GhQpzGdSrWq1atYs2rdyrWr169gw4pVsc7G2LMLkM46SOkl2nc86W3E97aFgLh4Dc7dq6NuhC0TVVlUOY8l38N9szocREYiyYqEMdJZibjylW+AIRIiqUowyrwDJ+u1XMelsm6CNKtmHHiRZ8iuQGecVdklZpm4V3NWREznYNmhaeNRCg638eOBhrUWjPP3zshNDNuwzRW5dZrQmms3BhzSNb8SrIPCXvTudtjzMIEngVxo+ajDtKOkvt5u0Jrw3/s6yqd+Nk7/7uUn4FH+VaWfKAUmqOCCDDbo4IMQRijhhBRWaOGFGGao4YYcdujhhyCGKOKFRsgxy4jaBEeZOyi60J2JK1piS2ItcvDiaMIpVGMEv0GnIo46grgFbM/dKBppC004kXzo3fiGdJb51wUgiKTBnHNOzsYWkpd1xZpjrTHJnY+vQGlZOztMBUZmrO0mZo9Zwggkl/mkKc5qIy3n2nlExrnWnHROcRueYjSm55Wr+Ebmj2YeZpo4bBJqyG6Inqeon0duRF84kuJJKW98Nrkojlu2dYlHkXaq6qehNvfZqHI2+ihq4lGpKhisttpbbKNm6sN3t9Wam2q5Vtrqq5jesKk3jsI220mheuq665jJzoqqs9gGcqi0211KGLBUZYutciUZG6q3cREnlrjiPcZtTqIiAW597H5E07uuiqqehPXONIq57+6rYb81PWUTvmksuyHBTjUc1XnVmOLWjgFkG+CBNk1MsRb1kiegLxtf4KzHB4b8Qa0XA2OyfZ6QjODKywwlM8w012zzzTjnrPNWCQAAOw==" - }, - { - "name": "Examine Roots", - "description": "All plant matter has to derive energy and moisture from someplace. Examining the oak tree's roots reveals that the roots present all appear to splay out, similar to how a normal tree would. However, those roots then proceed to double back in on itself. This might suggest that the tree is obtaining nutrients from... itself.", - "choices": [ - { - "key": "choice 7", - "name": "That's fucking stupid.", - "exit_node": "Biological Scan", - "on_selection_effects": [ - { - "effect_type": "Add", - "quality": "Confusion", - "value": { - "value_type": "random", - "low": 6, - "high": 10 - } - } - ], - "delay": 0, - "delay_message": "What the hell kind of tree even IS this?" - }, - { - "key": "choice 8", - "name": "Obtain biological sample from roots.", - "exit_node": "Sample Taken", - "delay": 10, - "delay_message": "This is why we hire botanists on-site." - } - ], - "image": null, - "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMQAAAAAAAC15h2QtxeAoxVykROizRpxjxIAcgAAWwAAgAAAUAAAZAAAZgC0tLTKysr///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF/2AgjmRpnigqrMMqtCvhyvFs17hQuPva67ygTwgcGovA3a61BLaeryj0mapar9isNjCNylpfgWwsLpPPZqBst066le84fB5nRpvdvGDL7/v/JmBeaWiFhIeGbGqLio1ljm2CklKUA4CXmJmaAYidhp9mBmOiYqQEpqZlk3qbra6vsCOenqijtgIHCLG7vL29CQoNCsDCxMPBxw0MxsTLyMLCCwq+1LuVe9VZ0M/c297d4NvZ41vXeueU5N/r4e3o79jkvOb0UAe4+Pf6uMjS7P/TtAAcGKyeQXhT5ClcSKIdwYcHIyKMx7CiwocOwU3cWMmiR4YYQzqM+LGkSQXSUv/2y0jQH0qUJmNqoRSm5ixQbXLK2UmnJ886ToIilFltkk2cNw9B+umz6U87UOsRNXk0KdKrVrOSWWVwqlc+WHHWKnWqrKizZV+QGrA2yte31YDJPTZXrrMEzhbkPSYNWF+4gAFBeICJGTLDxVi2C5yNIxSQikVu48i4j8TLT1i2khwOM+bKVSQaeGLgQOnS+fIBwkiCszfPjqWAnn0ism1hsXO/oM279e3fuqmYeAChN++XKqP9BujP+EcXMKLkoFFm+o3qSH5oJ7L9SPfs3IlEHw/dhfNyLMpbX4+duvvw3uGDj08fCfn0+KVTPI9Ff/T37AHY3nXfFSifgfX9cJ//f/vxh95/1wkoYYQU5oDgfBh+t+B9DsJS4YABfiiDAWWQOGKJKJ6oYidcDdVhUVrFGFZWRl32IlEy0nJLWjyu1VYYrNxY2YxXjZUWW1+0FaSQDiaQ4z0y3OMXX3wxaSUKiWWZTF5c+sVASl8iB9OVbxFH3CVabmOMa9yQ6WYAbHL2Zh+UVRTnbV3NyUlwu120HEuw9WlloO+Mc+c3fCbEH6ES/Ybmn9AwWmdvnu1jaWoHpMBmFYdK+tmLiQqKCaTAebqRnh4d6o6pEqHqEan/sOqiqxbBumqoig42GK0WqUqQY7zCtZKvDgXL37AvEbvNAsaeJ6Zy0JKqErPNYpIj/xqOOKUtU9xu6+1OUekpCJFpLPXtud2mu21UTbhKLraPqCsvuvQ+FdQSqI57bbnxtlHvv/OCK5RsqO4Lr78BA6xwulDR+m4n5iYs8cJNVNyguwYzEi/FE3dsR7UpZJzIxh1z7FO4IJ8gMr860WuAEi/rEHMBM88s8ccpn/AwVhEjTDPMQMsc9M9Cx9HyIJbknMLOEJNC8xpOR/3zy1RPbXXVWD8tM9Rcq3Kx0lesvKORZz2NFtVmnWJ2j2NLAnYsiJCd9tlzz7122XTnnfbb2dxUi96A1x044GDwnc0Zfwuu+OCLK274c4UkzvjkZj3+ldxkUY5AApt3noDlldF1zP/YBAyzuemcp4665wGBDlcDeCUA+zKzyx77Arfnvjnuy+C+u+uADXPXMsTHXvzxxid/PPC8OEAYmnLBPoz0ttMee+3YXx/958y/oqsDl4hel/jkjz9+Md17Rf3620/fvu3uxy97A+lPVT75ic2lJWLDWD7AE/97QQCT1qv3sU9+6ytGAxTIQL7FpiLJiCD/JggOYJxKXAPMIAA3KCp1MHB6H5wfCEcowgRoUIAc/F8L3CSrr/EiGAsc4QKhEcMZwpCG0DihClHIQxVeaYdA1KEQAWioD9pQhEesoRJTOMQe/k9ITQwiEzloQ/q9sIpKxOENt9iAKHpxgw76ohOnKED/LWJRGJrIIhfVWEUxSnGMPDQOGd+4wwME0I76COAC2MhHNPZhjWbk4xzd2MTeNBGPuBiAPg6wyEbiIlMiaEBKYrjHQOJQG5YE5BbpSMhByvGQiixNKBlpGlI+8h5a0OQZg2ECVfYRhoOMJRx36JxZ/k+UbMGjKEupyERi4pUzjGQmV9lGWXLSkxiMoy+ICcxmNsCWxvRi/VYzw2pa85rYvKYKt8nNbnrzm96c5h+G6UwudhKacBTnOLPJznYuEJzwjCc41blOctoTlug8JjTpiSZ3+lOb3LTj/wSqSHlycwQPeB4//8jMe2KRgwJNZDQJaCaFLlQge6ykJP/ZTo3iYbGgHx3oPC+6CZRQspwNNakwEMnSE5L0FRndaEwXqFGO0lSmG32pQmLK043e1KYz7KlO5dHTouKUo0YdKjmMalSk4jSmSh3HAqb61KpqtKZBtWpOo1oNpmoVq9dkKrWMEwIAOw==" - }, - { - "name": "Background Analysis", - "description": "You compare the radioactive energy bands of the sample collected earlier with that of the nearby solar enviroment.\nNothing.\nThere is nothing nearby that matches the passive signal of the tree, or the bark, or anything similar.\nThis is really starting to get on your nerves.", - "choices": [ - { - "key": "choice 10", - "name": "Smash your desk in frustration.", - "exit_node": "FAIL", - "delay": 50, - "delay_message": "No amount of pay is worth dealing with magical plant juju." - }, - { - "key": "choice 11", - "name": "Check every known energy spectroscopy database.", - "exit_node": "Sample Match Found", - "delay": 900, - "delay_message": "You NEED an answer. You DESERVE an answer." - } - ], - "image": null, - "on_enter_effects": [ - { - "effect_type": "Add", - "quality": "Confusion", - "value": { - "value_type": "random", - "low": 3, - "high": 5 - } - } - ], - "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAAD///9ZVlKsMjJpampGR0cAAAAD/xi63P4wykmFpTjrDa0XXCiOZGlqQ0qsazqIXyx9Z23feKayfP/WskgwRywqCsikcslsOpGpgGvQNDo8lYt1W4I+v2CvMhUuI0/YiZbL5nxdhkJ8Lq/T6eZ8HRmHUtuAgRp6T3B2SXdNfYeJc3CCkJEYjISVYZKRQ5gajZSdi0yboqM3nnWkqKmCpgaqrq9GBrKzs7AKaYG4tji0vbu/wCW6wZpqNMHIOAM9zDw/IzEgHcVt1KOWZQ1TU4LDV2vJOAVU2GZkY5VF4NPr4SRM53yI8/Lw9uVvBcLuknqGn4cqLQIYhwy/g0fwKdSDsCEGggtDOZwoAiLFi5sAYtwoqf/XIVjeOKrqRUukjZAmGVjDGC2lSyAts7R7GW5ZM2bPNERDGSAmzWA2b/pAc+yBT0ArVeXhsC2oj5wnefaU+pNBxDJNXUAqyq6qhKthyCUR+4QLVa5ej5AFO3ZJPGw3qE5N22DsWiUD6Tm5e/cqCbk96dZtQgZip3rjwIIa90fwqrBUDAfcQ0hyilaOIWG7zIoSYryd73DLrJntNlOIO2WVQ/raYrYKW/8CCNuJbH6S8aS7vSCpq9C8gxMMzns48dudj9/WqFw2yZKvfDc38Rxzc+kiq09f/nw7b+wNwV9HuwuwSvLeL14wjz49pm3Qds7sbd59jh1Co3CQP1+8/Rr/TgnVQnxHNVDgf0QEKCBUIRxIX3sIAiigMwzCAKF/cc1H1xQTVvjXhRCqE6IosU2Q1YkiajiViin+VhthWW0l1YhevQjjafrIKI0QLP5kI2GMBWkbG2fVx1FiP/oxRl9DEiEXCDsKhuSPazFpBg5P9miSkHmlpleXbbkVUVRRTkOakl7mRg9fsJmQ5Zl2DaDmJ4XVwZkZYHbpoU726eZCaID28RYYeRFEToQVeVaYLHIwOkugk70GqWiNIeoGQJc5qumclOU5qUGWXhraFNU1yumpdoAa6ganZkrLpJ2G5qido606CKoGwDErrqaaSlKttrIKq2r/DGvHr39aF2wIgsYaduKzqyUhhbLLjsArp3BVW0Oz3OpWlrY5dCsuKOByMS635QpyLaTEGenauZ2M5y4m696B4Lz0spLuRMnt25BH9vr7b3XUChwOwbIYfBDCBSscDMIOL0xwxO5ATPHB2kVHY7oTg7RxuR0rhyFFIYv8MUYZX5xMySoDk3LLD3dXbQIAOw==" - }, - { - "name": "Sample Match Found", - "description": "After an extensive algorithm search on the controller end, you have a single match to this specific band and style of energy.\nThe problem, is that the source of said radiation is coming not only from Space Station 13, no.\nIt's coming from the Space Station 13 Research Department.\nWhat the fuck?", - "choices": [ - { - "key": "choice 12", - "name": "Something must be wrong with the drone.", - "exit_node": "Its Not You...", - "on_selection_effects": [ - { - "effect_type": "Add", - "quality": "Confusion", - "value": { - "value_type": "random", - "low": 6, - "high": 10 - } - } - ], - "delay": 30, - "delay_message": "Lousy piece of junk must be scanning the station instead of the target." - }, - { - "key": "choice 13", - "name": "Perhaps that sample was tainted. Collect a new sample.", - "exit_node": "Sample Taken", - "delay": 60, - "delay_message": "Lets try again, but carefully." - }, - { - "key": "choice 14", - "name": "Remember the Christmas Party.", - "exit_node": "The Christmas Party", - "requirements": [ - { - "quality": "Confusion", - "operator": "<=", - "value": 25 - } - ], - "delay": 100, - "delay_message": "Wait a gosh darn fucking second." - } - ], - "image": null, - "on_enter_effects": [ - { - "effect_type": "Add", - "quality": "Confusion", - "value": 10 - } - ], - "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAAD////v7+/h4eEAAAAAAAAAAAAD/xi63P4wykmrvTjrzbv/YCiOZBkJaJqaLKOubSy7b23fODxPOb7/m4FASBRofEBeT1W6JU3DYaRIjQqfkCWKg1xoddjSQEgQlM/mdDkc0Fa+8PiWLSIM7Pj73RxOlVF/ITlKNXSGDXp5iiFoaBlqfpFyk12HMgSYmZkfmppmmJ8gjXwUf2lglqmqq6ytrq+wsbKztLW2t7i5um2Ug669uyBCKMNRc4Q9qXHBJlVUFMbRV6pfR04ONszQzlZRlm7IveLaimZ7eJAESUsfyVnX2hfqv/Nv4vfZ8RWJ/Hkdn6NGtRsFyEg4VLwK6UvVqROdgMcWSpxIsaLFixgzatzIsf+jR1gIP7YbN6uaSAn4wFGbdNJFsZcpFRqS09IBt2kW3CkzWdNmNyIYpIWkw9Nevgbwat2ccNPbTnbWjtKQWfGnVZwzoQaNqVXXkDFWGx3qeoIry2CJzJ05p6aPTpRmfSXV1a/u2jM7TuldA8LXO6kXFemh5ihn3Lc9A9h1ZaqxpMNkK9rl5+EMKIGM9g5FSjJjv4aVOwEc/Q8iXx6ODSo5ualOQ9Bs0qVJTLu27du4c+vezbu379/AgwsfTry48ePIkytfqHp5xhfLadby+1soMJDLbhchlqIYpVbXa14dz718NMBEz/ZsWsU8zMhY1CdmL+VE+/ObgWSvPR4rj/f/xqxUFG1fVfHIUgLCN58zR5ABySpwbAAdZ1TNMgZYF9YHjWmsDAgNeglNqFSBJJYiG14JUmcYiHNZWJcE6HD4FGIrVuiFjROxJeNYChoFWUS5lBPjOTO2iM2PKuki2F1qfdPjjUjSeMuSk82Uml4fRimlLVR2OUAYBGHpo5aV4OJll1iYRkqWhag4FY75WXhmlTOoedo/ZVKI40Jz+pOEnX2ZsqcCeVJ0piEQieJhiEx0RBkrd6J2IiQFVXqPbZjEYqdmll6Jz0avtUaCqEFtaiqnekmHUagOhSZapvJMeioanXa2KqukZoCrJoruCKNmCngKZGC7urprPRKq+QZBP2XFKRGunBwL6waZjIbiBInu9hoj0o5wraRiOadrsX1kK24HvBK25rnstuvuu/DGK++89NZr77345qvvvhYlAAA7" - }, - { - "name": "The Christmas Party", - "description": "Hold on. Last Christmas, the Research Director was incredibly hammered. He made a big mention that his brand new festivus pole was actually some kind of astrological... something something. You can't remember the whole details, because you were smashed as well. However, briefly, the RD did keep that festivus pole for awhile, he might even still have it somewhere.\nMaybe...?", - "choices": [ - { - "key": "choice 15", - "name": "Wait a minute, was that a god damn...", - "exit_node": "Rod.", - "delay": 100, - "delay_message": "Immovable Rod?" - } - ], - "image": null, - "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAAD/AACmAAD///+mpqYAAAAAAAAD/xi63P4wykmrvTjrzbv/YCiOZGmejKCubOu6aCzP4WvfeD4IQ+//Pppw+MkZj6udkgdsOp/EqFSBrNqWwQ9hy+16v9ypeGM9YpnAE3hNKLTfhbG8kuTZz/j7/fmb+/8TbIJefIVNgIiJGgWMjY6PkJGRipSVlpeYmZqbnJ2en6ChoqOkpRplqDdYpqyprnpKhnyslq9leFkYg2u0QrZmaLkgu8S9JDg7Ksl2yrB7UDJw0m6QxiFfedk9wbKH1tbEW9TT05Lmjd/pJpPq7e7v8PHy8/T19vf4+fr7Kb9W/Jn8pcLiBKAcgVZwdethkAZCJAoXFmx47KEOWLMeAAlHMf+DRVXctIT70jHCxxYEhXkYKajkgpMRGZZgKY5LHJcJ6zTTNtHEm5rjgsK5WZKZs2xHn2WccY6RSwdJkaaUOOApoHDbqFK16ofmF6Fg20Aa8IhrpbBBm6plZ7aTIwhr0bWdS7eu3bt48+rdy7ev37+AAwseTLiw4cOI0/1LfPAkC8YlHINUApmD5MncVFZ+cPmK0qWbX3Z2MbVbaCqjd37eCjk1i9JaZR5OHTN2z8Gua9v2wavvaNjeKgygqbcz8KocvBLAexn4MOVb5jZfjVwk9DBW/S3bTn3E9S5cUXFvphqaCOhBs7/WGbU96PNr0EpTT96o1Kjv4ZOT/xbn/f921AWnBlhNWQXggZndFkNcZv2X1YOxsCZENXdJBWGCWp2mQRc+YLibIRpaQMyHEoVYgVfDcUFiHyYGopxQTgwFYosugsFfOXGZQyMGN+boI1E78vjjkHIF+QGRahkZxVpKNunkk1BGKeWUVFZp5ZVYZqnllogkAAA7" - }, - { - "name": "Rod.", - "description": "You cross reference your documentation. Sure enough, the \"festivus rod\" collected was actually an immovable rod.\nEnergy detected from the rod is the exact same coming off of the tree, as well. It's all making sense now. The Immovable rod is producing a kind of unique blackbody radiation that is providing sample heat and light for what is effectively an internal cold fusion process, and producing just enough of that radiation to create a kind of micro-enviromental bubble around the biosignature of the tree.\n\nThis would make the first time an immovable rod would exist in tandem with a biological source. You jot down some research notes on your findings, which could easily produce some kind of experimental tech, no doubt.", - "choices": [ - { - "key": "choice 16", - "name": "Snap a photo", - "exit_node": "Epilogue.", - "delay": 40, - "delay_message": "You could easily win an award for these findings!" - } - ], - "image": "default" - }, - { - "name": "Epilogue.", - "description": "You take a photo with the onboard camera on the drone. Suddenly, the immovable rod inside the tree explodes out of the wooden biological shell, and produces a blank, blurry photo.\nWhat the fuck?", - "choices": [ - { - "key": "choice 17", - "name": "God damnit.", - "exit_node": "WIN", - "delay": 10, - "delay_message": "Some things were just not meant for man to know." - } - ], - "image": "default" - }, - { - "name": "What is wrong with this tree?", - "description": "This is ridiculous. Nothing about this dumbass tree makes sense. It makes no sense, it's just sitting there, living and making a MOCKERY of all of science!\nYou didn't get your degree in advanced plasma-physics for this!", - "choices": [ - { - "key": "choice 18", - "name": "The world can never know about this dumbass stupid plant.", - "exit_node": "FAIL_DEATH", - "delay": 60, - "delay_message": "Activating drone self-destruct." - }, - { - "key": "choice 19", - "name": "Take a moment to calm down.", - "exit_node": "Biological Scan", - "on_selection_effects": [ - { - "effect_type": "Add", - "quality": "Confusion", - "value": { - "value_type": "random", - "low": -3, - "high": -5 - } - } - ], - "delay": 20, - "delay_message": "Breathe." - } - ], - "image": "default" - } - ] - } diff --git a/code/modules/explorer_drone/example_adventures/a_model_earth.json b/code/modules/explorer_drone/example_adventures/a_model_earth.json deleted file mode 100644 index 908080b58343c..0000000000000 --- a/code/modules/explorer_drone/example_adventures/a_model_earth.json +++ /dev/null @@ -1,570 +0,0 @@ -{ - "adventure_name": "A Model Earth", - "version": 1, - "author": "Armhulen", - "starting_node": "Planet Start", - "starting_qualities": { - "Long Range Scan Report": 0, - "UFOs Shot Down": 0 - }, - "required_site_traits": [ - "in space" - ], - "loot_categories": [ - "research" - ], - "scan_band_mods": {}, - "deep_scan_description": "", - "triggers": [], - "nodes": [ - { - "name": "Planet Start", - "description": "You come across a grey planet. It looks familiar, though you swore you've never come across this sector of space before.", - "choices": [ - { - "key": "choice 0", - "name": "Ignore the planet.", - "exit_node": "FAIL", - "delay": 0, - "delay_message": "Whatever, there's a lot of planets in space. Must be a hunch!" - }, - { - "key": "choice 1", - "name": "Begin Orbital Scan", - "exit_node": "Scanning from Orbit", - "requirements": [ - { - "quality": "Long Range Scan Report", - "operator": "==", - "value": 0 - } - ], - "delay": 30, - "delay_message": "Scanning planet..." - }, - { - "key": "choice 8", - "name": "Descend Into Orbit", - "exit_node": "Orbital Descent", - "delay": 30, - "delay_message": "Descending into Orbit..." - } - ], - "image": null, - "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAMAAAD0WI85AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAALlUExURQAAAAEBAQICAgMDAwQEBA8PDwUFBQcHBwkJCQwMDAoKCkRERNXV1cDAwNDQ0LGxsaioqJaWloyMjLOzs6WlpcLCwqSkpDc3Nw0NDeXl5b+/v5mZmZycnLKyssXFxXd3d6CgoODg4JeXl9PT08bGxsTExJiYmIqKiqGhoZqamoeHh5KSkvb29pOTk4ODg3FxcaOjo62trZ6enqKioqqqqq+vr4WFhcvLy729vb6+vqysrJGRkeTk5Jubm7q6uru7u6urq6amppWVlbe3t6enp9zc3GFhYYuLi93d3by8vH19fdHR0fn5+c/Pz8nJydnZ2XZ2dn9/f4mJibCwsNvb22pqauvr63x8fHV1dRUVFcPDw/Hx8c7Ozra2tp+fn1BQUFFRUYGBgV9fX4iIiHl5eQYGBqmpqbi4uLS0tMfHx83Nzbm5ubW1tV5eXmJiYpCQkHt7e+rq6kxMTFNTU2lpaXBwcG1tbXNzc4+Pj09PT52dnUhISEFBQUNDQ1JSUltbW1paWmVlZW9vb2traw4ODnR0dG5ubnh4eGxsbElJST8/P1ZWVnJycmdnZ2RkZHp6eoaGhmBgYEBAQEpKSlRUVGZmZmhoaMHBwdLS0oCAgDk5OWNjY11dXUZGRkJCQkdHR9jY2O/v75SUlDo6OlxcXFVVVVhYWD09PU5OTk1NTVlZWd7e3sjIyDMzMygoKH5+foKCgoSEhC4uLjs7OzU1NUVFRenp6TExMf7+/o6Ojtra2q6urt/f3/Dw8PLy8uPj4/z8/Pv7+/39/TIyMufn5+Li4srKyszMzFdXV+7u7tTU1Pr6+jAwMD4+Pu3t7SsrKyoqKuzs7NfX1zQ0NC0tLSwsLC8vLxAQEPPz89bW1ujo6Dw8PEtLS42NjfT09DY2NhwcHPX19RMTE/j4+Dg4OCkpKSEhIQgICCQkJCIiIiYmJhoaGiUlJRQUFOHh4ScnJ////xcXF+bm5vf39xkZGRERERgYGJOWJYYAAAAJcEhZcwAADsIAAA7CARUoSoAAABOjSURBVHhe7Vv3W5PZnidlog41VOlNuvQOUgJIVaqURTpITygJTQgEuJQQQu8JRSAQFEaqBFBBulyxULwjgWFnr3N37uyMc9e7uz/vOS/Zv+Gd51k+mrzJm/ec5/PtpyF2iUtc4hKXuMQlLnGJPygwAFgMFgsuONEX8MKDGzgAPAYHvuPBc1gc+AU8jsXixHDgDYMRQ36DP2PFsPA2ugD8AWVAEQ944jFYeAtcwBcsHogjBhjjIW0EOOw38AkgBLiPyIpoAIhxIS2KuCAI6UJ2YkC34AseUAa8gGiAHtA1oAuogrvwcSzyhoPyAPvAT0Bm8MhFf6gBEoNMAOULz4LsIGsCdCs8gXDlKuHqtavfXoGehsVCEZGHoCmghwFbwg/IPVQBnAeJCkAGIYf8RzhicVe+EZeQlJKWIcrKySvIK8opfXsFMIeGAKRhzCANkabwcVGPaAGhBdgAVhe+cyEPAXddWUVVTV1DRVNeS0tNVVtH94aevoHhNTwIKZHVQGNwgT1AZaAsCFAw9HKR5wM/AS8M7up1BSNjk5umhmbmFpZW1jaKtnb2ig6OThqKhs5GMBVAN0NcDeYy8A/GvqhHlADVCWRB3hHFAk8Ru3rL1sXM1c3G3l2S5K7o4Um00PFSv+1N9PF1tPXzM/WHaQy0QPIXBOJjBFGPaAGJ3gt7AFPAyL0SQDT1vXM3UMHJMchTXSY4xCBUi6QoE+YUei/c2SJC2iXSOQoGBrQE9EJgUtga5fQL1ArzDiIIoljsv8hFq9+PIfpJytx1dIy1CY2LT0hMVFQnOTl5eVjYmPgmkZJDU0JgIEEgfgmbgmBBFYiLIIygcbCYBxKpkmnpGZnpsVmOMtkkaxd3NS0yJSc3z8vWJi7OyzOfSisg5xYWmRddGAO2QSILdYtc+DliEyATPttT0UMtNs3EQ91DTi9W3Uu12MxYv4RKNJF+aGpTWlpGJ5dXUBmVVdVFlciIAJR9kUlQriOIGBDQNpg/yWTJu0p7uioouLnL2JCsZTxSamrD6wxy6osYdGY5ndngTWKR46nllEZ2kzlIW3Bsg1RILBblYEc4QGXC6L2mFRYrKRcdIxGtkOpl1FzcEtKY0tjqYWBHdCw1lMkpaGPQ2zsqNDuTqOS4dFpXOKiOF2kCifaLDtECLIAgbyF8rsloqad2G3W7yll7mBV1RTaHJ7GL6msNcnpcTEJ6Zaz6OFxZM1b/AGUwn1qrX+dB84YRDjMdHjYX9YgSoEPBFxhlEEhOWSoOXnoW+qFF1ZWcJnJnU9PQo85IUqPFcHpzpIm+Zl8yxXukfDSf3F7O0+nRL6SQRdEOQwxli4iGfLBA26rYuxqmKuoU1xR1UcZ4YxXkJEorkZNYL//QR95o2KQvqYQ3XsKfSHrMEK+n2eiF6XELWaAxDo7z8X+ArAXtAcI2NO2JtIVqS01jVxUnidHkWmU22VnRm+JGkoocDnVp0Wa0jeVPMdvyG8N59WQOtSNS0TIyt/M7JF8REO9EFYhPwAH8N26Szg+NzCPNnzZxyIHTmrJ1PqZ27GjH4ZleI7niAvrs3NR8WckEf4GRQB3VnBhgBbdakuvDE4AKwHwS/WAXQzKPGOZqaqrHcIpmldlDjy55Z78Z28LEEJrmM/en/MLYVtO7fFpCSe9i/chYTmU+ObJeINdJnWgiL3kXdvHhIB6oA0xnUAWMcnihWi/J1tQULdsM2UrJGzuvPH+hXl7OvfmSVRd7002H5zvIuK+T9dhsldi9dv9VBtV31Y/Nqu3oqK5tuobkXtTnI8g8SQxzxcmseSYuMaeI3VQV0+uto7Bqep/FpTqsSce1Dg05rZdQtdhUh0YX8sAac2OhRmNzK5itOsNht9K48chABQS9qEeUAHQJPBy/EhocrLkd6ZkznK27s+udm6dlm+5Gfb22tlfZe2MztzzhfsGfxUcqHHSzht+w+LXWrpKe0S+aqk2CW+srrwKjgiKPfh0BKRgYJLjIVI2t9sh/facwZ9g7oqh6uqPgqf7a2pDsE2NlO/OR/bVX7KG8t22euRvvlDqa3e3oxckZzUvlkR2loLDDgirqESXAfIPBvC+OWustZNcneXcK7D+8Iqkox5HvpL0Ij33KfnXgen+9p60oIbpgvazmsPZoYvY78f2KOX6ujL0nj8ny8WYRgAygkIh6RAmAAzCKtZlUc4hPa1drwbSzufqjHU9OXm3AaK9hzXpdqt/WQ82d3KUq1jK193DwePGN/LA+u9R6bmouOMfIoD2Y9fgjKIp/BNfCEP7i8X2Lnz6HMVpXQmlpb9dU//TUQ3bF0U/hdYidCXFdteVkKEZftjCDIWTOWbHexNfGx5/OhjQoOEsrhphVxu8jWQv9gigm1quQlVjF4SmeJtHOKP4luxkHtKHmHCM7NXl72810l1oj45pP/SnOngvife/GR+KPhOIVy8z9MemJSuuwQRYjXwxZEBL1iBZA7sR7ZUQvdblwGKWnFR5ljawmvpxGnR+xyy0odOWHMAm2Yt0jTXqtf6YdzS3gXHzxOGX/qO+wIUmmo6O/Pq0+l5zwr3B+hXZBBPH+7WqacdKB+Y+nEzPudJ0BpkmeAqVrKScgbP3Jq7fbkcVe3uNtTLlOmRd19HrGlHDqDb004bD95vfjTVE60vr17aw5WBLRXqDD4nH/phiVK93UWZI/sTBBPmHyK83WqJxgU//Ym8qCv+osVfFmyOOD3RRKaGFL4uTxsdLHzyzmwPh8/8Jc8GSWYjGfwYMrMWgvYoNaNq9mEFWxS/2z822ryW6/WjLfuLl62vmpx55GhP8LFwZb9nFl9T6XO3g43t45uEiVPWwbf1/200ZD/MfRRFq4eUq8EHSDdvqFC6SOduxQn44twXTXfcrp/j5zUPVpWp1qVl1i8QGls4Iyk6TVuCBMosTOMmbfr5fRS2TH//Z+nLW/MOcfH9/CKuHWx/87UAfK6RcvRhBLU60wz/b/8UyuulFIbxsUiiv4mzWemTxVtywI906K3R0da+kfSeKe/fz3Kepx2+nnhF82kuhtGxOc3dLBWiqVq2/+H7C0i3pEC6CYGdU2sogBMiW79NNBlnAmOtKycKkxMS7Z+GE1hUyrZXNoCe1KCa37v/76/tf5o3nSeVFfw/ynQaGQMlEvHt+cz6H8huySoAs8BpfTKKd/y/LLWM3uqyc5mRarasrsLP+Qs2KfmfqoyqZITc7uxOBC2/mRdXOb1uPZjxsOybUNIy4VG4f7pQ1lgxMJ5o+n4HK2qEO0AMqIUe9MJaOfUjAd1NM0QTZSeC2zpd01k+Mm+3DVgrXL6WK3ttPL+kJ/Lj/66fiX44HRqcq++e9mp5vaGgbmba3oCfHxU8jkClWAmR1uUs1qTKde2Hraf9o6zqT3L/Dzi16l2BFvVN1uTuAyCtScd8vzeRv7Skq/MxYX2tlzHpaLZwaU+aONNyOawtIx9ug+TH6iHtECmBOF1Yx6U3nJ3vw25sBgA71P3GefubK6qhP56UCu6vvRrl075tzhqNLI8bvjN+9/mp17MxAg0zgf7iycH8jnDjDKTxlvcGjv8wCPwIqptYyyC6lWkyyuf//axPxI6VwXmRH4yTS72OsggJbNJVfEM/sP90cazgd9j7qP2j4ezp0PnYZPt/PL2g7HO5jU3WMwG0C5IMJ1QotcMo89xqk3cF8OpQnP81vPywZZ9PQvm1Ivt9id0dE8XmFZw8bUhnD+543O38c3ZoU/HZ7fPKYJuz4u0U9p4tUVfwPDX1GHaAGupVsaRybNcAwqTIhSghc/HGwX9Q7MuN18GhvzSpDVWNnlb8kNL9Ueyd+fOp6aDx4fOacuvlsIb4ig8xemyuhzzp0c1m+gHKEd7ACVpsO2vg8L9M3bJYfsBE4ZRnsTvDF+0s31OJt1gWCP9GrtB4kT2b2Ss8WgI1JwVFKC0nxZwxvHwo2C895zJfFKGhmP/rYCmG5j/2SZumeaYbQbOj6u5J0m9YGSEt9ZMdA/ypp+cUcARBEI1tdud9EY9KN31ZTde+eSa4cj5/PHQbP8+ZziBdau+fhFrKEKuD53LWPGT9lGr0b4OfTO5yS9cGNqH6czl8eqTKpMvvOPm4L1dcErga7AiLR4PkBZMmPx3aO5i7XzY6OG5xtl/JDgsRFkiijqESVgcATMg7CHdfoHlqzPPPnAiCRdTjmZ+5FeoFlEi+CXnt0TCJ5AowhuRvicPz5cdJdtonqb9fWZjIzotgoblOg0dv4R3KhGWxAMDouXkzR8MvSJF+XLTPLypGoPHC7+MuftsqKYYU02Zar2rAH3WhfcTbR7SpkN1ow2s6R0938mFhbqEvv7Gug8FvM/4TxT1CFaAFMiMcJfvkau3nYgdtHt26PoA7c1eD+dv1NVK3DsurO735edhwgSlDbsN87LfctNXG1WXRLGM6La7OsW1BvmeE1CkDCATUQ9ogS4bIDDTFY/e7FF45U+0lIDThROO/39ffpEaHqgYNjt8Toix1v3peCRd2VVxu0DvTLLfq9bJitb3G2SS5TqExgNcKsI7fkITFs4fKq/6j8j1AqoGvnxE5X/XKPkvZvqPGoa3Vz/BxIer/56MHjn5GtZ226A8fLE/egwn2lJk3DrtJUVmrh5vPhvIPeinrVgvgFR8pQm+fpuSEmwSik5yF1qvUBQclotqbyWCDLW+vc/Puecve1dVmiVTSvTIRm8/XDgq/s8RifRzTNnxrgtfx7Zo0bdteCREixOq9f59cvH0bbFsr4r5muZgq3egKbMZ8pnaxFbsZ53R0nj3fvnI7IjL2X6MuOz1YcMg4PTonVv2OoP1zEnFpFNSLQtIoYlwANCD/xVt54nOw7Hdc+Yq8hWCVLTc5ZvBL5c3Qxc+5KpbRgXM1M75tnP6pglVUaahsfQwolxgd1+VfVVdhNTYHIIgh0EG6oAyoTDLYzXzj2FHdnNEm3vqPLOptUtqcagGxoKt5e/fHqux22ONniZ7h3V9rCX+7mtTJ/PORTuV0tbyFeMMhsH32PAJBMeeRL1iBLgXBuQwF4xkpoM285jfA2KumsUuva9sor2CnGjJ6On21KPk7m3dOaue7Yx+njVlK30hj1eOzJY3mw22p/AbxTikeSL+moQUCQ8t4AV44e6xgYElZq9dYsrTNl8oq2hntlTdK6ncPv1I6tdTnfc28jS/sdhFk3qvLa+8c+HNCtyF7+/g0L9L7g/DUY6qI+1EMciAKUq6ixFSewNW259eBQbm3fL0kzXZsDXMSjolqFRYoxCrOmms4rCgs5dGfOpo/d1BdTppSbxdg63DwgApv3oL6JAY8ARsBj2gXQoW3LS8yTww3JpbHfGfVt1Y6tgnR63WhvzG5LqPbm2mzqNz3eNUnILbbysLGQUNRb4EwVjcNMNSAHVIeoRJeDxkAUchj/4b6vCsbgKhc3RMxdvfyvHob2hneU8bbkbXtvLX3Xd8yRizkyydb18ZlSJ0k7u8h5LUR3c6v8BDZHTmqjXEcAD1hIgDBar5JfCLZFWubdiwcnu7CLdf7YV8fIL0Xx7Tzni7TOVbNtYLXbL3WxDV3XPuGk14llyZOUG0hD6FTzHjSrg8XFQSOBICYMrckrvdi3RuJduveN7K/3e5snbk4BntzbzTj6s6gZIbA75RQ9ZOctL54aRXIiyxilsIQFIAccGePSDBIggOgQHh0vNRu4rH7aDeuylvj6z/+qbemPoYGs1ImIzQOFr3qPV58/UJdKzYhzT5UgrsgbBnX1I4oaCwCvaGz2wmMEdfygLnnAeZ2qbHbB8sHrvIEb33pbyXs/ml1jlHyNOTk6+fvmi/akmzHFbJazl7GymqpUPhABJAjQE5iCgnX4BCeBZ0CZwcoTFXvdK17grEXRb+9PywXLy5smXtx8+RHw9UT450f6qPfRpp9vBU8M9n5scSRPCOQg8zAwkAS4mhrJFYF0G7gU3/KFSwbuPiruf/aT9ZOaTgJyI27fynj37+kz71vOh5b2dT9sK6bbp6bY6Z8HVf4cNAXuYu4EiUN96Q44owUIA+UB3x2B21c0MXR0CYwL2Apbvra6uPh8KWh7a0e3Zjgnc8bT0S1VsaakagyejLqwBvAtus6C99gtVikfMAidYwCSAEIGY2Oqqty2VGah7sHw7SEIiZifaflvjhkqsq4OXl0ViXesxeBz4JDwuCz7AtSBwFfWIEkD6BHzAoA8yQxhBxycY6Lj6ZU3qdTtmSu1k7NydlJTMckhLy071MvQwo8TDBlAEaI2L2IL5S9QjSgBk4J9bQDogRqCzYB9An3lAJGZl2TplOehFq0Rr+MllS2evyLsMy9qZ/wxMB10QqYXAqaB7wcSH+q4usACShC+SEHQSJB/jrlx/aEUikaRtw5ykV0hO1k4ePsmaVDjxgEkO+BOWAKshjC84QEF7XwH4E6CNA9aA3gIiBtY2KAvki7t6ne2ib+ShprMUatx7fIUA70I/hC4Im0EtwGHjhZuhCsgCVmbkAudY8Ab8gtAEqscTMAQCDAqodzASgaIgxGEb+Bn8iEgk6hAtAAaQGx64CxzFimatiBiAJGRIEBkA8T2kkP+fMUAzRBEYkO7ARdQjSgCcEPVDDwP0YHWAwY/IgvCHf5wI3QkwBz9B+kAYMBaAqQFKD4UAv18hoGwSRJWQPbgAftAMyPFZxMXgBSgaSAF8DD4FkxwQCNoBKSFAVKgJqA60Y+QSl7jEJS5xiUtc4hL/HyAm9r+XXnYR5dlv2QAAAABJRU5ErkJggg==" - }, - { - "name": "Scanning from Orbit", - "description": "You initiate a long range scan from orbit:\nThis planet has a smoggy cover that blocks any good look at the surface, yet it has a mostly survivable atmosphere.\nThis planet has zero life signs.\n", - "choices": [ - { - "key": "choice 9", - "name": "Stash that Report...", - "exit_node": "Planet Start", - "delay": 0 - } - ], - "image": null, - "on_enter_effects": [ - { - "effect_type": "Add", - "quality": "Long Range Scan Report", - "value": 1 - } - ], - "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkBAMAAAAxqGI4AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAASUExURQAAAP///1lWUqwyMmlqakZHRwPX/kkAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAL5SURBVGje7ZldbqMwFIXtKnkvO4huyAYmG0CWea8i2P9Wxv/Y2MTYvjBVO4c8FET8+dxzDW5Ldqr73Hcf7fbemfwu+p1tkM+jILTbfeu2stNbDDSkklXnzNRbyUqUqbM/oVr5AFhOus5iUK3A/fmEW0BRHjCtwFPqj6NQS6GIVu5PTXEXnJUOjfLxXEOITYWitXECQk6BUOx6pSDkKAj4F6mrFxLEdNctAdl8gJVmBRBXy6tXcrScwwvXsufikXIP1qId5t2iz0D4osFClAga5MJDDbJaEUDJjF6eyZohxATjlhym9kkcMzhkIBQJ0g+pe2klJFWtG4DrgRSkeEUkjDDWA09TbPJdM6RXnySlDnLpYyO9/GhtQChthYhSMXeyup0aSFkoCYirVqJkdcnHEMaXakVeHIQUQYBPwSFdMB86IEBYolrAtyi1kF4asOIT40Ekq4JVQvS0R3UYI5G5GFLYwuKRO3l69dMEkxnc5MR8K6RCF9VL2sioe2tdLc6GRggROUDve5lcA9usXpw0So4Go5OwE0YySqutED33eZKH12TSyJJTK0RNFx6LFb4yMiI4uajJQmxlWT3tTsybEfxUnA0t9miGmNnCY54DMxNiJu7V6HLx89BO2iHLhIUXPxUleWVjf1SiZbvCHkEuLqX0brIM4hUfwkxERkKvdiPhxksGw3UuNpERmpuLeKGoBRM8k5WP/gsBsnrkAphUVGOJHeuIwPBDMcks6vmAUazkbtjXgAIhqVW+QHAYZHxnBIkRheKbGbAgJH6NIAcitWFlwmQQck28EzEDUdqwQnClrIxH+pA63od1EpgpHiP7i3ccSjEj/yd258SYqendLCR0UfcCyUK0B9KkbCYNBnZLRzIcC9HNdSzDODkYoraOB0eim+vgSIjcKM4HM06J5Hqak1Mi+d9ce3VGc5Ef01zXM5pLQN46oR0O5G0kKP+9nM+CfP1rSDqTwqTqmqvQX91SLINcvzGkLJPrCev9HMj8oyDk10MI+Qt3vM7Ve2h01AAAAABJRU5ErkJggg==" - }, - { - "name": "Orbital Descent", - "description": "As you descend into orbit, you see a flying object headed straight for you!\nA garbled voice begins to call out to your drone, but there's no time to decipher it!", - "choices": [ - { - "key": "choice 2", - "name": "Blast the damn UFO!", - "exit_node": "Tractor Beam", - "on_selection_effects": [ - { - "effect_type": "Add", - "quality": "Tractor Beam Turns", - "value": 2 - }, - { - "effect_type": "Add", - "quality": "UFOs Shot Down", - "value": 1 - } - ], - "delay": 30, - "delay_message": "Blasting UFO!" - }, - { - "key": "choice 3", - "name": "Attempt Evasive Maneuvers!", - "exit_node": "UFO Evasion!", - "on_selection_effects": [ - { - "effect_type": "Add", - "quality": "UFOs Violently Crashed Into", - "value": { - "value_type": "random", - "low": 0, - "high": 1 - } - } - ], - "delay": 30, - "delay_message": "You attempt to dodge the UFO..." - }, - { - "key": "choice 7", - "name": "Do NOTHING. Jesus take the wheel!", - "exit_node": "FAIL_DEATH", - "delay": 30, - "delay_message": "What? Why?!" - } - ], - "image": null, - "on_enter_effects": [ - { - "effect_type": "Add", - "quality": "Garbled Transmissions", - "value": 1 - } - ], - "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAKgklEQVR4Ae2dW5IbNwxFtZFswouI//ORqmwgNbHH9sayoyxGKcz4jiGIJAA+ukk2VKUCHwAJkveILXvGvv393/0e73324PfPn++ld5y176xvsWG+DZt9v0pwUN/s+c+WXwCy2Q0agPT9wAtANgJEgyNuED88AUgAEo9dBQ0EIIXNme15WMtHu0G0+Oh/vmECkAAkbpCCBgKQwuas9Imq3R7x/eP5drCcbwASgMQNUtBAAFLYHMsnzCw+2g0yS56r5RGAbACIBkc8XtU9XhHMAUgAEo9YBQ0kAblXvla7PnfJN26Q+htC08ADIJVcPIVpk0Z/vwO1wBGPWPX7/QbIk8IbGwKA+gPx7p0FEO+Y4f/r/G6NLCTDazc4ORhrrB1317h/vnx5+9F2aSU0u67/iHVNAQhjQC0esSmrzCFByNVXWc+MeZ4GiEpCwWHGjTwjJ3lz5Opn5LbLnIcDUtC9q2uXA6hdR+62kO2140fc+/eQQwBxKd/hfOVDJBByNwZvv/Ie9Vj7UEAcWq927bEJK44hb4pcfcW1zZTzEECq1V4ZONOGHpELvyG0m+SIfHaeYwtAiKudD0muLXdbpNpl7E712+12t75r170NIFeCxHqD1Ipiljir+D1+3rVtBcgVIEndErk2rxhm8U8J/v7b7W59p+J5m2ed2wGyOyQEw843CBcyL1vhkH58DF62QrIlIDtDkrstZLtVADP5cQHLshS+tS7H4XXL2rcFZEdIrDcH+VkOfyYfLtzacgoabSxtDwKQwi/LaJt3dH/p8Wr1G0QTsqefg6LFaWcYgCwCSAkOebNohz5bvyZiTz+Hg8parLYXAcgigEgISnXt0Gfr10Ts6Q9A6MuF4TWbCFryKcGQulla5jo61iN+zdcLB42nrXeqG4Qna2Ag68LH2aGcgiAHzWrr1URv6ZdgoG6J1fZrCkC0JKnf+rKMtZKPBw6CZqW1Ua4WEed8AELK5mJku7ZfpwKiJSf7U5BIn5nqXnH38J9p/ZZcpGC1egoG2aaNwfu1HE8DREtsxX76BNfePSDY5fGKzpiLVStLEGRdi0/1azo7BRAtqZX6c2I9o32lfUOuKdHm2iQQqOf8tXbkULIBSOUf82o3hbe/x81SOuhZ+zQR834AAcv7vGXrfhwOiDWxWf3OuBks8My6X1peXmH38s/lxccnnyH/cFzqyzTaconN3u69EXr5W+AAtLPvYSo/Lsijyqk80PaUAzog4NEW861iIb6V7Cp7S3k+CdLxW4I1sdrePI3JA0bDQePz+WYu97oBeo9juVFm3leZ25MgC4DguwesJ5Z85dy5+sO4KaeRoKTmm61NitoiyhlvmNn2NZXPgxgLcJAfwID1xKbmLrV9jF1yulqfBGOleg7iFc7wQ4yDAKndg7e8aoN3ivOCkBPjrO0rnJUFEtwcZC3+Pdb98P+D9BhwtTG8cKzmD2hXOBeL6C0+Pdd6WUBGCB1inNH2FM3osSwQ5Hx653ZJQEbAscKYvcUzerwcBKn2UblcDhD6dP/rzz/enmGlqKl95Pvsm2WUiFYcl0NWyv8ygECcJQAIGPjlLKBCv6yjXdrUvIg90pbEcKU+DgiVc2u/BCAQqxQptefeJFrEjbAyl9HzYfycEK7WLgFBXe7D9oCQuLkYa8WOT3nEoy4t+qWFn2ynOs8PfiOtFMFV64BCWr4fWwPChUdlEqP2JmFyH9RHW8zJc6a2EfNyAexU5kK3rovHyDKNsS0gXGiAo4fYaIzUG2JGH+otFmvAmL2sVTyr+aUEbl2DjP2oWwdYyQ/C4pbElRIrtaXac/68HYKtjU/FIR9usY6UP8/H07/SeVpz/RA1+5EVayz5peK3vUFIOBBWjYik+FFvtR4Ry7yxHrKteXiEs5JvSuTe/B/G8Aav4k8CgqBaRClFOqpOOfI8UU9ZrAuWx3nyW+UsvXk+CPznbeIdg/zfxqkJXCGGRAMBeUQjxUaxPd4YF2Oh3mr5GjG21a5wjrU5doOkNoHZ40gkEE+rCBEP4Vnr8GuxFMvjc3WslXLk/qX67GfYml8KEmrzjHuZ7yBWccPvKGsVs8UPkJC15u8Ry4q+rZBcAhCLuEhQVr+c+BCPftR7WBqDj1OqAxRLHiuK3ptzCySXAARC4RZi420jy/JTXc6Pei8rIcmtzSu2lf1ToGjr2RoQEgUJpVZ0EBXiUfdaKVaMN9piXrI8Zz6vJpDd+r2QbAsIHSyJQoqDC+WocimHUh/lBzEjV2+d4miO0jy7QaCtxwPJ1oDQRnFheMUl/SFSq6V4Lk6MB4s+1EdazMX3A+vQBLVjvxWS7QGBCM6yKUEil1IffGABj7UOP2kBCm/fEQDLmiyQbA8INooL4qhyCQDelxM/2mst1ol41CUk2KMrWg2SywBChw+BHGGlCPmcHA7efmSZ53BFMPiaS5BcChBsyhFC5AKU8+X65Cf9yDrlgDywL1e2OUguCQgJQYq2Z52LT44LUcr2M+qUy0vF/2to+adpV4QtBclpgPB/Je+szRwlyhwEufZReWjj1gBigYP7eM+Wx3rK3nly/k+Q5BxHtnM4UB45n2VsTUzW/hwE1J7rs47dy49uDXp7AfEIVvpqZyD9a+vaPJb+B0gsAb19AAW3veeoHa9FhDkIcu0tc9XGAo5fgHw1/XRrrWB5XOpMeH/vcmo+T9sbKJ6AXr4cDJR7jd1zHK8IczdErt07fqs/h+Ply9f7y1cbHLSnvV78fHqNWRqHz1dTPuU7CKDgtib5o2IswuS3hCxb4kf6PIJBj1cEx+v95fXVdHvQPvd89R5Py61FJwGI43+5LYkYUMDS9YxyKW5032xwaGIe0R+AOETeslkyFuIGCCkLnzPsIxzvj1TvN8c3881Ba97hJc/OWo8bpAGuFBCy7QwwaM4kHK+v95dv3+8v339cDhCC3AoF9wtABgIyDxzv3zdq4CCx7PLiwreWpwGEvrBbk57BT94Usp7K8Qhgnm+OX3CkcrK07QIIrcOyXu4TgGRuECl4T51vsKXcC5wUHJb5Sz47wbEMIHQg/I94ebl0WEf1AYZ/P326l97wk7ZHnl5oOByt8+8GhVyPZ39OuUEoQQ4FL3uSH+FLYi9BIftGwDFiXdqYUkQ717W94P2nAUJJcDB4mSd4ZNkLB2ABJEfm2jLXzuK3rM2zdwHIz+8gEDlE77UU79n4I3wtYrmij2fvTwWEEuU3B8qeBfTyrb09ANIMgFxR7N41e/VyOiASEu8CevmvDohXKFf19+plCkC8SY/wD0CugYxXOwEI+w6Cx6Uae/Yj1jXkXbdKLxTcPwDpAMjZcNCBxiu/A1zw3vI0gOALOlnvInr5k9C9j1qI6ZVD7Th5eURP7Z5S3BSAcDhQbllUayxEn4OF97fO1Ss+MEjvQOv+BiCZn8XCxnIYUEbfTDYtj2htPaMARAGkdYOPjN8VB+yhd32Ia7FTAEILwKPVmd9BWjZyhlivgFbwl/tqzVnG1danAaR2ARFX/h0Hq6Bm9JvhbAOQjR6xrILqBQPm6zWeHAfjn2kDkAsCMkJwUtwt9RH51Y4ZgAQgp/29U61oj4wLQAKQAKSggf8BsnyFPjzLbzcAAAAASUVORK5CYII=" - }, - { - "name": "UFO Evasion!", - "description": "Were you good enough at flying to avoid the UFO?", - "choices": [ - { - "key": "choice 4", - "name": "No, Back to flight school with you!", - "exit_node": "FAIL_DEATH", - "requirements": [ - { - "quality": "UFOs Violently Crashed Into", - "operator": "==", - "value": 1 - } - ], - "delay": 0 - }, - { - "key": "choice 5", - "name": "You barely avoided them! Nice!", - "exit_node": "Tractor Beam", - "on_selection_effects": [ - { - "effect_type": "Add", - "quality": "Tractor Beam Turns", - "value": 2 - } - ], - "requirements": [ - { - "quality": "UFOs Violently Crashed Into", - "operator": "==", - "value": 0 - } - ], - "delay": 0 - } - ], - "image": "default" - }, - { - "name": "Tractor Beam", - "description": "Before you have time to think, your drone is captured by a Tractor beam! Now you've gone and done it.\n\nYou should have some time before you are pulled in.", - "choices": [ - { - "key": "choice 6", - "name": "Decipher Garbled Transmission", - "exit_node": "Deciphering Transmission", - "requirements": [ - { - "quality": "Garbled Transmissions", - "operator": "==", - "value": 1 - }, - { - "quality": "Tractor Beam Turns", - "operator": ">", - "value": 1 - } - ], - "delay": 30, - "delay_message": "Decipering..." - }, - { - "key": "choice 10", - "name": "Look at the surface of the planet", - "exit_node": "Looking at the Surface", - "requirements": [ - { - "quality": "Tractor Beam Turns", - "operator": ">", - "value": 1 - } - ], - "delay": 10, - "delay_message": "Looking out window..." - }, - { - "key": "choice 13", - "name": "Let the beam pull you in and dock you", - "exit_node": "Landed, Kinda", - "on_selection_effects": [ - { - "effect_type": "Set", - "quality": "Tractor Beam Turns", - "value": 0 - } - ], - "delay": 50, - "delay_message": "Getting captured..." - } - ], - "image": null, - "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAIOUlEQVR4Ae2dW5JcNwiGewdZQNbgbcTbyFM27ZXk6aTkmDJDIXSDIySYqi5dQQL+r0/PeGx//vnxPPnKHKQGeA18SmJqX5k0PmmZlzh5+dTgoPMpijiiyFr/rnU3IBSYMs5EZg5u18ASIAlNApKAcBRMzN2eyIzvzjcL9SfICDspqjtFdVNdtwKCYbopqRnLb/BxjXH/lBy5AQQnr/RPSWD0e9K69Y5PyZtbQHCie5KJ95d+j03uGc8TzfPs+JTcHwEILgJNLF5r9altjvsBaeV2dP2U3B8HyGgh6P5TCuPpnjSHGmNP8Ul3SUDyd9HEj6MaMHA+JFF6WktAEhAWEE7UmnOeIJDukoAkIF8A0YRA8iWJ0tNaOEBK0TwVwNNdJEFrr3mKW7pLApJPkJ9vGNoAtPxJovS0loAkIAmIoIEEREiOp3cy67u03vG9rFvngfoPBwhNQI7//57MCwAr97CoZQKST5AtH7FWQBixXYUmFCCrybrZfkR0J+8dreH1gIwmJOr+k0W/cvdWva8EpBV0rvN/FrQitNtsQSPXAAIBZcuLvycvt4lcIx7x38XSOMDKR0/Bc88YLFa1OtnvT0BASN4CgXtlOyb0lXx508Du+3wBBBL7xqXgrFPbv75/fyxfu/LyRu1POoMFBIpjGQiccVJrCUTL95t5sqz7ab5FQKAo2kGB31PalnjfXn8jb9o1P9VfFyC0ILPBUj/ex28Lf/Q86/zN1vkmuylArAuz2/+oUL3t18yfpdjLPb1/JSDod7G8CX31PhqgaAuY3knbv7a/BOQXIKti9GpPBTkzXhFdz3kr/q1tE5Afj/jj2m/fvj1Wr7eg6hFpa09LiC17ab3le+d6aEA4gVrB0OuXu5PGnCTQ3Ws7AWidHRYQKrpeAe/YR+86O94NgnR+S6i71sMBUhPXDuFrnlmLC89LAvWwtgsC6dxQgGCx4L6mUHf7wnFxfQ8g1O4gCXXXWhhAOLHsFrPl+Vy8Za4mTk/zu2Dgzr0eEE4olsL04puLG+Y8wdBzF064b81dDQgIgrZeRGx9Dxo3jHtE6XXPG2Dg2K8FBMRAW2tRevJPY8djLIIT+1qgtGK/EhAsBNr3JGDru9DY8bgljFPWR0CZiek6QLAIuL61KD355+KHuRmxRLS5ChAovtR6ErD1XaQ8RBT7TMzXACKJga5ZC9OLfxo3Hs+IJaLNFYDgwvf0vQjY8h6tPEQU+0zMIQEB8VgKdLdviLHWzoglos3xgNQE0Jp//vzjgZemmD+fz4Nfmr57fbViL+sRxT4Tc0hAAAzNFkPB9XvFvbKvBwzYMyOWiDZHAwLFHmk1ocC+OCjwHN5r1R/JQ0Sxz8QcChArYWIQpL7V+eA3AdH/FyjDAAIismglKPCaxdngM+HQh6M8cY4FZEQQICKrFkMg9a3OL35H8jHzUSOqTQKCfpo1K2AJCrw267/HLgHJJ8iXH02OCKJHYKt7MAhcf9W/ZD+Si6hPgtm48wmi8AQp4uWgwHOSwFfXEhCbp0eBKgQgRUCrIuy1x1CUfq/dyr4EJAH58vGqkD0iCrp3RYwebWl8tfHsx4zIdmGeIDXReBT86J1qsXHzkcU+E/uxgJRgOQFozI0KdOf+mXhnhBLVJgHp+K/UdgLQOnsGkGITVfCjcR8NSAl2ViBadi0BW66vxjAqloj7jwfEAyScUD2Dge8bUfQjMV8BiFdIsBChvwoO+NFsRwQTbe/RgPz79/Pgl6ZoovmKJvzeeI8EBEPB9aOJWzPeXuFE2XccIBwQdA6KpymcSL4gf9ke9qsmFARpTIsbSeCrsdLcRR4f8wSRYODWpKKuCiiCvZS/SGtHAMIB0JqDItJ9ME/bCKIfjZHmKOLYPSBU4FrjVrFHxXTr/laebl93DYgWDJyflcJ6gIHGZHmnlVydbusWECoAi7F28SxFCr5beYB92q12rk7x5xKQlgi01nuKRM/qsaF7tMRK78KNtc6ifmhMUcahASkCqxWaEx+eq9nReWwjnUft6Jj6kcZU3FpjeqcIY3eASIW3WKsVuXVWzQ7mV+3BT2lbvui6FhCcH3yvCH1XgNBCvzXGhR45E9vRfssP3c+NWz5q65ywNee4u946l4Cgj1k1wdXma6Ko7afzq/bUH4w1YeB8wf8LWLv/TfNuAIHi7mhLQWfO5YQw4ofaj9jW9nKCtpgDSHBL47lh7AKQWrG9z1MBjN4X24/a1vaDTwsosE8MRq0Pdzm53Q5IrdAnzEPhZ+9a7GdtOTu4D7RY0Bb9Ghi1ebjXSe1WQLginzRXCu3lvpzoilAtwACfNRB657k7e5tLQMjfSuwV/AlwgFBB0Not+NdqvcFR7rMNkF4h5j75KcWJihOsNhzgjztLY46La8fcFkBS9LLoe/LDiaUlTBC1Zts6U2udi/eNuQRk8iNWj4gt9tRE0SNETTDAV8+5WntqsVvOvw6IhWgi+JRE0CtAELVm23u2xj4pB1ZrrwISQcgWMUrFrwmP3gP2acJRfL35JeXBai0BcfwRSyp6TZgUDDo+DRApB2+svQYILVSO5W/Ua8WvgVHme3LqHZBa3LvmExCHTxAJgtpaDxywxyskuyCQzn0FEChMtvK7fE38rfnRvCYg9b8oR2ExB2S0eFH3tyCorc/kyyMgVJhexgnI5o9YNeH3zM/AUWy8AeIFBu4epoDMFvBtu5KYt88s5618zd63nKkNSPG38sUJ08tcaECgCLNiW7FbEdTquZ4AgRp4bcMCgguyIrhR2xUwiu3oeXg/nJ2AOPkmHRfHU/9EOFbzB3BA6wUSXAuP/f8AHPtbaN2iPfwAAAAASUVORK5CYII=" - }, - { - "name": "Deciphering Transmission", - "description": "You review the incoming transmissions your drone has gotten. These aren't in need of deciphering, just un-garbling it from the bad connection...\n\n\"You are in Space British Air Space! Identify yourself, Tally ho!\"\nWhat the fuck?", - "choices": [ - { - "key": "choice 11", - "name": "Whoops!", - "exit_node": "Tractor Beam", - "delay": 0, - "requirements": [ - { - "quality": "UFOs Shot Down", - "operator": "==", - "value": 1 - } - ] - }, - { - "key": "choice 12", - "name": "Good thing I didn't blast them, then.", - "exit_node": "Tractor Beam", - "delay": 0, - "requirements": [ - { - "quality": "UFOs Shot Down", - "operator": "==", - "value": 0 - } - ] - } - ], - "image": null, - "on_enter_effects": [ - { - "effect_type": "Add", - "quality": "Commercial Airliner Transmissions", - "value": 1 - } - ], - "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAALM0lEQVR4Ae1ddegGSxU9WBio2AjPFluxAwvEThDFVp74nt1iYHd3FyZ2Yj1FfehTEQPrmYiFYmF3Xjmw+1jnN3NndnZnv+/bPX987Lc7s3fuPffcuzGxAGD6CQNxIMmBZIECR8lDHFDmUIIQB1wOuIXKILqKbJ0DChBlUHHA4YDAccDZevaU/SKHEoQ44HLALVQG0TPI1jmgAFEGFQccDggcB5ytZ0/ZL3IoQYgDLgfcQmUQPYNsnQMKEGVQccDhgMBxwNl69pT9IocShDjgcsAtVAbRM8jWOaAAUQYVBxwOCBwHnK1nT9kvcihBiAMuB9xCZRA9g2ydAwoQZVBxwOGAwHHA2Xr2lP0ihxKEOOBywC1UBtEzyNY5oABRBhUHHA4IHAecrWdP2S9yKEGIAy4H3EJlED2DbJ0DChBlUHHA4cDhgnM6wI4B7MKAneUAMv0ZALtA9zvTAehL0pwdsEsBdj3AbnAgOjtkr7kaHkaAXAWwxwB2EmDfBex3gFnw+ztgPwXsU4A9BbAbAXbGHTn1OoA9FbDPAfZ9wP4Y6Erd/wLYTwD7aGfbdQE7dUN9T9MllCsDdnPA7gHYYwF7KWDvBuwzna5/juhKfT/YULeZSV0TCKlz9jdALgPYazvSh8EwZv91gF11AedeC7C3APabBMFKdP4XYC8E7JIV+l6sC0pi9iHAvgzYzwD7zwR9hjp/vkKnPSZ+KiDC4/sXIOcF7MUzOXXo4I8Axuw5t9MuAdgbG+j7dsAuOELfGzfQYYgfr4RzY3cA8vbL6EcC9o/Gjr73jI5+bmNdfwvYbQv15VVySOi5//++UI8DIP2YQN+fAHlBYwcPCcPbkKmO5O3UUGbL/88q0PeiC+gzFbMDPH86UeYw+m0LODck8PMLSBez7VyAfXIH+j48o+/ZFtAphsfKj+0+QD62gGPD4Oj3H5ohXej8MwN28g71vUNG396uVttTZdoP8VrB/m4D5GU7JFtPIr5eLXXke/dAX/b7pPTtbWq1PbfTdkqnAz+eBru1YQ/ZA7KRSB8udPqz90TfVzr61gQG+46eDtgjALsnYLfr+pCuBtjFAWNQsFO2NR/2VP5uDL/6npCtJ9RNMwS4zZ7pe9mEvn+o0PPbCVl7StilA3U3AfKeCkf2ZG6xZe+7R4gv7pm+b07o+4MKPRlUnu0bL1seHI7rmYvkqWERNfLPmiDK3WbUl/0aNbqF5/w8oeuXKuWfpxvTdjnArgkYbX4iYByF8LhEWxsJnOUD5IRKJ/Yk+R5gdwGMQyvoJA5U5P0ye577OjXbWyWI8M2Jcr/QjQ3re8XPAdh9AZuKw+Uj+nJcV43t3jlviLSzkeAgv5YNEGYqzxm5Mg5Y9HQmyf9d2UasX2Rq7/SbMvoeV6krcXpQRPZbJ8hLYf+BSDueD1ZW5hNubmPvOsGBHy901O0r2/h0RD5Hu6aIkztO8pfgx76YnKxYOcd/hfI5MjdWd8qxz0baCdtd8f5RkFsay4fLGmfx4XOMXiT72Ha+FWmDQ8DHymH93EN/aMuPK9qJvZ5+UoWcnH3fieAS6r/i/XHEmwoE5z/kHBIrf/JIJ3G4d0yOd+xXQRucP+HV98pKrx49ni+vaIvPNv35/Za3XZ5eNWUhLn1bG9keBbml4X+tdCDffI3R644V7fw3aIPD7msIxXMuFMjK6f7oirZiV9Upt7ApWzmfJKf/isuXM57jmFJOyB1nj+4YJ9y5sq3hDER2xuX0SpWP7Xmuedb5RQSTm03QOWULj4/BfmV1lzOeY4g8J3hl1x7ppIdVtPW3oI0p/TXnC2TlSFPzcB3rAb9Ghd0e7n1ZTv8Vly8XIJx51wM+dpt7vRs6iG+8xrbB6alDOVNm6LGfZigr95+z9cbqG3u7xCvtWDkl9cdeEXP2HlD5OEdOMYwrZJQ4I1aHnYOnLyQdR+fGZOSOcRj70L4rVsphOycGsoZyw/93qmwn1j9xzkpZOWz4PBbqvZH9ZQ3/5wQHvr7ASefvFivIOTxW/opAPpcUitUrPfbMQF6MUJwj/8vKdjg9OZTJ+Rql+o2pd+lIW2HbK90/CnJLQzm0eoxjwrpcnoaZPaYje9F5pQnPKd0P537ztqL03FQ9Tu29SEJfjnfiPO/UubnjqZVacufVlI99Boz550CPxcnWyph3TiDE0LGcD853/hyGzlek759BLsdIhXazr2HYbu1/Xv3uAxhnBD6h60islcXzvL6JKXJ5Lm3mMxyT0au7cWRXimATYrXS/aOkaGkoFyub6sAW5zPgYnZzAboW7U2V+YyEvrSBC9LVyI/Zr2MO0C3A4TNCjfNan5PKkFwhsXXbY+VzcTlv6mvtaIUW/l6BzHjmbGnY1GHeYwmVq5+6evQYcIxWTsaS5d7Vgzp/tVJfrorS26ztKVic8mcxcK5f6cAWJPyT8xDdk+TYPdKXAwe5CHavW2z7iUp9Uy8TYm1s6JgPdisg+A6/BeHHyizt0KvNymP1ydUvGZNW+yKEC4S38vcBy90NKFcAbM7psjlixco5grbUcVzUISZjyWOlownYn1OjF1fDL8VjWO/+gL0KMK628oACGeztfxpg7+oW2+aKkEN5sf8PBuw1gNE2vg2M1Wl0bNHG/s8w9lvUOHKOc0o6HUPA77VDfUuWHu31JflqMMotStfLH25jK2K+wyEwg5Bj3ob68TbXuzLydfOwPv+nFq0Y6jbT/90FCA24X8T4EIy598dcOUKQ+c2PufXJyePiCaEe3n7NQE3qwHnyntyw7HgHi1SWT73w+Fqi7Qc6bfDZMNSpwf4ijbiGzLlqSI5sz5sB1FoC5nSLlceGk+RIUPtSgUPuc7KH5bxSxHTmMS7rNKzL/7ytTtXn8dhwFn60J3XOQleRo4aEhi2xz6EMP3LASIFUepxDUGpuIVK233pCh1yJzuzNvkmEZCl9hsdrb11ji1YM5Yb/PfLyVX5Yn8sJebbHXhJ4i4THgjBsc4b9o4bMIPQIOCUyueIJB/ixI8wDcmxZq3WduOxQ7QNxygZ+Wq7kQdfDk1+6Ssn3jo9d3ufxTjuxKdIc28bP5MV04HNIzCbyIVafxx6VOCcmZ8KxuGITBEYNHSOvD5QfOuCkQOuPc30orhbiLfQ8Rievbh8onOHXtz9my2nI7+vezszRWcePbo5pv68bGz7v2c0yPjv05/fbcNrAUAafTfp6wy2HIA3r9f/5zUZ+k3JYl/+50mVfp/F2sYaqDOK3+vhFKN7vcqUQLuLG4eGcJ80Be18HjJ9P4BI4XFyatxe5jrSWgPI+m4tyk/BcEYWz/n7dOZirIX4FMH4KjisWcsHoGzZwNBMMX6EzwfBWjauf8OrwnG6B6rsDdgvAuD4yOwenfCGYBH5R13tP214C2GkzNt2y+4Yi/cigzK2LTH/yxco3uqkMY28FJ/p7vwNkonFVQak2xYkBBwTGAAwFVCb7bxArBcgGna5EUJ4IFCAKEHHA4YDAccBRpi3PtGvFSgGiABEHHA4IHAectWZF2VV+ZVSAKEDEAYcDAscBR5m2PNOuFSsFiAJEHHA4IHAccNaaFWVX+ZVRAaIAEQccDggcBxxl2vJMu1asFCAKEHHA4YDAccBZa1aUXeVXRgWIAkQccDggcBxwlGnLM+1asVKAKEDEAYcDAscBZ61ZUXaVXxkVIAoQccDhgMBxwFGmLc+0a8VKAaIAEQccDggcB5y1ZkXZVX5lVIAoQMQBhwMCxwFHmbY8064VKwWIAkQccDggcBxw1poVZVf5lVEBogARBxwOCBwHHGXa8ky7VqwUIAoQccDhgMBxwFlrVpRd5VdGBYgCRBxIceB/bK6VghmpUw0AAAAASUVORK5CYII=" - }, - { - "name": "Landed, Kinda", - "description": "You have been locked to the surface the beam. Robots are all around you, pointing at your drone with all sorts of old age weapons.\n\nOne of them angrily shouts at you, \"By God, Queen and Country, we've got you now!\"", - "choices": [ - { - "key": "choice 14", - "name": "Go out with a bang. Initiate self destruct!", - "exit_node": "FAIL", - "delay": 0 - }, - { - "key": "choice 15", - "name": "Surrender to the funny looking robot brits...", - "exit_node": "British Courtroom Start", - "delay": 50, - "delay_message": "You are being transported somewhere..." - } - ], - "image": null, - "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAIT0lEQVR4Ae2dvY5dNRSFzxsg0dKNBBLFKAiJApSKglREoqSDhqFAQihNChoKAiONlCISBUqRnlfhDXgRRGNkyI7W9dg+23/Hx/YqLO9jb/9tr+/Yc+9kst0+uzVMjAE14NfAxsD4A8O4MC5WAwSEJyhvEBENEJBIcHiK8BQhIASEJ0hEAwQkEhyeIDxBCAgB4QkS0cBygHzzlzHaxBOEJ8hSgGjBQD9CsjYkSwKiET0hWRsM0cgygOQIPqeNBPboHOfq2kfPZabxlgMkdfNQbKltW/vj3DR26/nM2D8BiXyCIRuO4pOy3jnOSWzfnKTO5r56lsWvkssBkisUEdoZBCVz0a5F/M8w99HmsAwgdmNEKFph4WaWtMV+Su3UeaT6l85vtvZLAWI3DwVj7ZQNlbYpbWr6yvjaeaf615zrLH0tB4jdOBSOVmxuux4CkHlrxhbflPVp+l3NZ0lAZJNRRGJLXSgXv6OFpx0X/Y6eYyhmI5cvDYjdOFdQ8hzbVI1PrH1O3d6YUo95zjhsc/mp1vKAoCBQXGijj7Wlzi1v9Szj2dwdA+vEdn34fCn6lHgQEM/3ICI0X26DK+UpgS7x9Y0nZZiXjMG2fogIiAcQFAsK0LXRr5WNY9ox8FnsVmOzX/6b9HtXlpgoRJCSx3xr1clYvrzWGOzHf3rYuHQ5QbjZ4Q1xxcpY6WPlxq7G8+GA+DbcLauxsFn6wNjMsqaR1tENEAwSigBt9KHd9026avxPAQgGHwGxNtbRJiRHa6AbIHviR1CODopmvM8ePTItk2YOLX0w/jG75RzO0PfhgNhFS8D3AiB+Nt/zPaK+JRB7fR+xPhkD4661pe1s+akBscHGDeoV/D3xHl3fKg4Ya2vvjYP+e76j1ncFRLMJNrC9NuJo4aeOV0t0GF+xtX2Lv821bUby6wKIDZAEdi9Y4of5XpvS+lShns0/df2lsZX2qeOO4N8dEBtcDJQEO5ajf037bEIvnY8mNhhnjb/rU9re7e9sz6cABIPss48IWqkYz9o+FjuMdczPV4dtre3zmaGsGyASPDfQPYJ9VnHXmpfEGnOMO5aLjfV7trSZMe8OSI+g1hLeSP1gnPcEr63HPme1lwJkJEG3mKuImADofyNhe/DhR2YvSWBHzVuIbcQ+Zf8EEHlmHgZmekBGFHLLOROGMAy+2BCQhN+pur6+NpJExPIcysXvLLlPBCwLQ7P9/uqV8aW9a1fN+lYbVFuUIQhKymvPUdNfq3jP2C8BSThBzDtvGZtKgNC21Qg912dGIbda07SA5IrH107AwFwr9Bp+vjmVlrUS1Gz9XgCC16bHj380kn55/tz40t2LF0aSr96W/fby5Zvku8rZMhw3ZKcEvlQ80h6B8Nk1xJ/ah8ytNE+J58q+0wFSKhwfCHtlqSKv4V+6zpVFn7L2qQDJFc0eACn1NcSv7SN3vbZdikhW9r34mFeuVDb//sl3b9JPn3xh9tLNzY3ZS9gnXr3QxisWjonlvg3LEUuK8HN9tWLP9ctZNwEJf6zramsKQFJFkiv2Fu1ywXDbpcbAFQKf/dAsB4hG5Nu2GUyaNkf5uGDIMwHxC7wU/AtA8BrT2r66es9ICo3157YZSeiDi9YKQyNghMJna/ro5aONg/hhDGmH4SIgr7/8s8L2QYFlvcSvGVeEr80JRRgKjM3QgGjFoBEYghCzNX318tHGw/qhCGiHYdmePv3DSJIrz3/525u5kgTXoTdltq6kHNr+endnJOFV6p+f3zWS/v74fSNJNlQrCI1gY1BgnaavXj7aeBCQMBCiLckJyOsrFkIQs3uJf29cwqEXvYhfkw8LSIog9sRl62NQYJ2mrx4+KfHQCIM+/wO3PXz4lZGEV6ZvH3xqJLUoxz7xWoW2fIJlcyy3m5ciCK1gEQSfre2nh19KPCh+/WlDQCb4FItw6AWf+nIgIACIvPnd00PKz5oTkIaA4FXnSPvLr38wknJ+FytFFNb3rOKuMa+UWKS+QVf3346EAscSOGx+BCAoohqiPFMfuLaYvbrYc9a/JCAoojMJPXcuuJ49O0ckK7fZLr74ky8G3S8B4Us9fPOX2PipFNo4Hyz3bdKeGHLrc4Xao13OGn2xZJn/5xgCovijDT2Erx0zBxDbhkD4gXDjMjQgdjG5AqnVTivkFn6la3DFwOf70AT/Nm/oqlOrHK9P2GfOJpUKpUX7FkBInzXnmxPvldpMAYjdsJqiadmXiDw3bzG3lQSfutZpABkJkhYiL+0zVTir+G+fX31gJIUWjVeg0NVIUx7yCY2bW14qlpXb58Z81nZTAiKbtbLQS9Yu8WN+a6YGBDe4RDCrtcW4rW4HfwaZOTCrCT5nvTPvf8ralgTEF6AcEc3exhen1coIyLP7Xw5ZEcwufu36VgPCXS8BCQDiBgqfteKaxQ/XvppNQDIACYlkFiB86witefZyAlIRkJBYfIIbrSy0ttnLCcgBgNQQ0RmAqrGO0fogIIMAIsLqDYrMY5WcgAwGCAqzFyw4h9ltAjIwICjOI2HBcWe3CcgkgIhQjwJFxps9JyCTAWIFewQks4Mh6yMgEwIim9saFBln5pyATAyIFW5LSGYGQ9ZGQCYHpCUkIqKZcwKyACCExP8LqRqwCcgigLSCRCOykX0ICAEp+jllZPFr5k5ACAgBiWiAgESCo3nDjOZT+1Ot0dafOl8CQkB4gkQ0QEAiwUl924zgzxMk7RMtArIYIBZiQqKHhIAQkGJgRjg5c+dIQAgIAYlogIBEgpP71jl7O16xeMXi/6AUAb82ILa/s78UcufHEyQipNygnr0dAeEJMu0brQZ8BISAEJCdk5GQ6CD5F0cJWniQ8Kf0AAAAAElFTkSuQmCC" - }, - { - "name": "British Courtroom Start", - "description": "Wow, that took forever. A one eye judge robot smacks their gavel, and points their hammer at you.\n\"I will now read out the crimes you are accused of!\"\nIs that how the judicial process works? You dunno.\n\"ONE ACCOUNT OF PLANETARY TRESSPASS!\"\nThis blows.", - "choices": [ - { - "key": "choice 16", - "name": "That's not that bad.", - "exit_node": "British Courtroom, Continued...", - "on_selection_effects": [ - { - "effect_type": "Add", - "quality": "Crimes Committed", - "value": 1 - } - ], - "delay": 0 - } - ], - "image": null, - "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAJiElEQVR4Ae1cQbLduA18N8gBsppVVj6B9+MLzA1yn1z5pVBJu7owlAhQoARSUNUvkGADBJvop/dtz3z+8/PzrZ/ioHqg3QOfIqZNTPFSvEgPlEDqDVrfIE56oARyQk69ReotUgIpgdQb5KQHSiAn5NQbpN4gJRCHQL7Jn8/n85WfHZ+nPqy2EciOTeE9084C6XExS0DLCaRH1JvX3ywQ3Hu0UNILBAcv22cAAtn1a1afgW/4Hzg8IhDLQe/EoLF4z5aP1zOOUfMqAkG90VxGvkVuFUg0EVH5WhfV8kXtNyMP6oUd3QPxbM9yWXGcg2Mw5vWr4yUF4jk0SIP1xI5gsY9YefR8JOddMVwrjy37A89Y+NjyOo8ZgzGvt8bAadvCjvq2FYgmDfNRojxxvBePz3JYcbNyYP+Wbe0JnKxhLJYf+M8wwLewWGtZ4HlP+Fr4Ud9yArEeFGQxgdbYqzjeG+Nezhau5ZM88IvlB3749Bx+bYHjfOxjP2KxLnMeY73l7+GwD3CYc06MgcG8tR+vjY63F8goMVfjcIGwvXwtHPswblnkxpqei//s0XGChQ9Wx7Ofx4zTfszF8tPyw8c4HmO9ZRl3dVwCOWEQ5DMEPlhe4zHW2fK6HgMHP+Zi5eG59lligGlZzo119mE/rInV62eYVlzLxzmQn3E8xrq2jIkYLyUQz4FBXC8GOLH8WPw6huNlzDm8WI7VubCPxjCOx8AhrmWBObMcp3G8hjFjtA9zsVZcL4bXo8bbC4TJx5jJg08sHvaxX9Z5DfgjC+zROvuBbVngeE379JyxPAauZRmHseB4jDj4YOHXFuvaMo7X4G/5sCa2t87Y0XGkOCTX9L8H8RyUCdRjnYfXZY3nGCMGc7HRD3Ijr56LHz5tdQzWtR/zqxb5xfYexmLMMfDpXPAzlsdY13GMuTLeWiBCDAi0kAQsW87Bl8AYHlv28WCQW8fAD6vXs81Rp9jW01tvxcDHsTo/1oD12GhxTH+DeA4HrIcgYGF1jp5f1iMf7BedN7LGqFxXzsqxR2NvnTPEkVogEU0G8q1kj5KMfWBH84zGWc8XicNZr+ZEHraenKOcWeOm/Q7iOaTGgiztj55bSerhUK/YHvau9WiuMuW7i0PZZ4pA3krmnRc3ulemu7HWMnrWiLitBBJByFtzWJv1TlyGuwgXyEwCMxD2phpm3mUrd0ZuQwXSOrTVl5Gcs5r+/PXrO/PnbO9au+93vRQCWeXCZwqil3sVjnarM0wg1jcF41Yhs9e8d6+vwtsOdT4ikFWIu7vxvfutwuPKdYYIhN8KvfEKZHkbNRt+BY5XqfGyQHqC4PXspGRr9Kv1ZOd7hfpuEcgKRFxtxqzxK3CfucZLAuG3w9k4MwFSW9bmjqorO/+Z65sukIyHj2q8lfJkvIcVahoWyNkbQ9YyHn6lhp5Ra8Y7yV7TFIFkO/SMZlsxZ7Z7WaGeIYEcvT0yHnjFRp5Zc8Y7ylxTmECyHjKy2X78+PHFD/JifmSBy2Kz3lPWutwCab09sh4uuimPRHDFH12jJV/W+8pYl0sgK4lDyLY0iwdzRQjeWE9dXmzGRsxak1kgbxSHt6ln4b0CsOCzNmS2ukwC0eLIdghdj6VBLJhZDX8lr6VuC0ZzVvP2f2PiFkh2Ii3NcYb5/vMfX8vPlSaPiD07g2Ut+z1mqc8kkCzF9uqwNEYLYxFEDxPR9N4crbNYfT0ua/1/b5RtBGJtDMb1mj5i3dv0XjyfxzMuAbS/UmlethCIpzEEG9H4UTm8gjjCeznQjVDztmBeJxBLY/P/CE7Glpi7MCWQdiPPEvjyArF+cloaWAtDzy05nsJYeQBuVkPtlrcEQn9qpQWh5081v2VfNL7V7tbIs86ztECszWBpMC2Go7kl11MYKx+Cm9VQu+Utgfz/DXIkCO1/qvkt+5ZA4n8/KYFsIpASR7w45G24rEA8DWH59NVviqO5JdcTGA8fu30NmnmeEsgLf0mf2VC75S6BbCCQenvM+XolYi+BkEDw1Uh/vYI/qy2BbCSQf//r88XPldexpykEm7W5I+rycHGF8zfG3vIGgSC0/euPz1d+Roj3NIXGRjRlphz6fEfzEZ7fHjNdIFoUMocwYEcu4agJvP5MjT5ai+fMI1y/OWaqQFgcEMOZ9V6EpzE82NFGfSLOcy5gvTy/GT9NIF5xiHC8F4ELn22faHzrnqNn93L9Vny4QKTRR8TBbxbPZYw2SFSctZFn4K6ewcPzW7EhAmFB6DE3vnXsvYyrjTIjfoYgkDOyXi/Xb8NPE4hVDEc470VENs3MXGjyUTujNi/Xb8JfFshRg1/1j1zCjOZ5S84Rvt8Qk1YgIrDRC3hLU8845yjnu8ZtKRBc1owGekNO8Fc24N9iXf0qdRYfeUFvaOyoM0byvnquy28QIeCsya+szSI3qpF2zjOL+9XyhghkRZHoi9q52UfPpjl64zxMILNE8tSljDbVbnFP8Z9l3xLIT/+flu0mgt55sjTrE3WECgR/i37l945W7BPEjOzZa7SV10f42CFmikBEKK1GH/WtTvTKwkDtq9/BaP1hAkHzv/0tMnoRvTg06pO2V+OO6yECgTjEQiDRbxHJveMFeM/0pEBkb2+9q+MvCYSFwWOIhH1R49UJj6z/KbFEniF7LrdALM1vwYwKJjuhT9V3p1ieOuMT+04VyIyvWSKsJ4haZc+7hLIKH1frNAsEn/h4O/SaHzjERdurB985/g6R7Mwfn60rkFZjW5rfgmnl7vmQlw9R4/ZbdbZQ3sD7oUDOGhVNKvYIB8zRusePXGzfcDkRZ5wpkoj6suf4LRBuWDQi+/S4h8G6EKBjrXPk0FbisxObqb5ZIsl0xlm1fFrNioZsrcEHjFj42HLB7LeMOTfGHMe5a2z7sCiR2HjS/TQsEGnYVvOKX28ic27wszFywjK2lbd8bb5bvMwQSWufnXyhAukRw83eGkMUYmW9l6/WfRyVQHx8SX+dCgSN2mpm7bM0q47BnIUhY0uuwvh5KoH4OWsKRBoXTYsmPrPeZkUu7MHWm6vwvkuPFsnu/F8SyFVyShi+5r7Kt8SXQHycuwUScUmVw3dJkXyVQHzcHwoEX4PERl5Q5XqezxKJ/Q4OBVKNbCdxNa5KIPa7/ZtAVrvsqtd+2eCqBGLn7LdAQF5ZO3mrclUCsd/x73+LteplV932ywZX0QKRfMi9my2BDPx/sVZvghKI/UOlBFICCfm7kdU/NI7qL4G8UCDSDPUWsb1F/gs9r28akoDJcAAAAABJRU5ErkJggg==" - }, - { - "name": "British Courtroom, Continued...", - "description": "This big idiot they call a judge just keeps piling on crimes. With each one, some robot you'd like to drone-punch gasps in the back.", - "choices": [ - { - "key": "choice 17", - "name": "\"INTRUSIVE SCANNING ON OUR CITIZENS\"", - "exit_node": "British Courtroom, Continued...", - "on_selection_effects": [ - { - "effect_type": "Add", - "quality": "Long Range Scan Report", - "value": -1 - }, - { - "effect_type": "Add", - "quality": "Crimes Committed", - "value": 1 - } - ], - "requirements": [ - { - "quality": "Long Range Scan Report", - "operator": ">", - "value": 0 - } - ], - "delay": 0 - }, - { - "key": "choice 18", - "name": "\"SHOOTING DOWN A COMMERCIAL AIRLINER\"", - "exit_node": "British Courtroom, Continued...", - "on_selection_effects": [ - { - "effect_type": "Add", - "quality": "UFOs Shot Down", - "value": -1 - }, - { - "effect_type": "Add", - "quality": "Crimes Committed", - "value": 1 - } - ], - "requirements": [ - { - "quality": "UFOs Shot Down", - "operator": "==", - "value": 1 - } - ], - "delay": 0 - }, - { - "key": "choice 19", - "name": "\"AND WE HAVE PROOF YOU KNEW IT WAS JUST AN AIRLINER!\"", - "exit_node": "British Courtroom, Continued...", - "on_selection_effects": [ - { - "effect_type": "Add", - "quality": "Commercial Airliner Transmissions", - "value": -1 - }, - { - "effect_type": "Add", - "quality": "Crimes Committed", - "value": 1 - } - ], - "requirements": [ - { - "quality": "Commercial Airliner Transmissions", - "operator": "==", - "value": 1 - } - ], - "delay": 0 - }, - { - "key": "choice 20", - "name": "\"THE TRANSMISSIONS WERE NOT LEGIBLE AND UNTRANSLATED. WE CANNOT PROVE MALICE!\"", - "exit_node": "British Courtroom, Continued...", - "on_selection_effects": [ - { - "effect_type": "Add", - "quality": "Garbled Transmissions", - "value": -1 - } - ], - "requirements": [ - { - "quality": "Garbled Transmissions", - "operator": "==", - "value": 1 - } - ], - "delay": 0 - }, - { - "key": "choice 24", - "name": "I think it's done listing crimes, thank god. Time to argue my case.", - "exit_node": "Verdict", - "requirements": [ - { - "quality": "Long Range Scan Report", - "operator": "==", - "value": 0 - }, - { - "group_type": "AND", - "requirements": [ - { - "quality": "Garbled Transmissions", - "operator": "==", - "value": 0 - }, - { - "quality": "Commercial Airliner Transmissions", - "operator": "!=", - "value": 1 - } - ] - }, - { - "quality": "UFOs Shot Down", - "operator": "!=", - "value": 1 - } - ], - "delay": 0 - } - ], - "image": null, - "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAJiElEQVR4Ae1cQbLduA18N8gBsppVVj6B9+MLzA1yn1z5pVBJu7owlAhQoARSUNUvkGADBJvop/dtz3z+8/PzrZ/ioHqg3QOfIqZNTPFSvEgPlEDqDVrfIE56oARyQk69ReotUgIpgdQb5KQHSiAn5NQbpN4gJRCHQL7Jn8/n85WfHZ+nPqy2EciOTeE9084C6XExS0DLCaRH1JvX3ywQ3Hu0UNILBAcv22cAAtn1a1afgW/4Hzg8IhDLQe/EoLF4z5aP1zOOUfMqAkG90VxGvkVuFUg0EVH5WhfV8kXtNyMP6oUd3QPxbM9yWXGcg2Mw5vWr4yUF4jk0SIP1xI5gsY9YefR8JOddMVwrjy37A89Y+NjyOo8ZgzGvt8bAadvCjvq2FYgmDfNRojxxvBePz3JYcbNyYP+Wbe0JnKxhLJYf+M8wwLewWGtZ4HlP+Fr4Ud9yArEeFGQxgdbYqzjeG+Nezhau5ZM88IvlB3749Bx+bYHjfOxjP2KxLnMeY73l7+GwD3CYc06MgcG8tR+vjY63F8goMVfjcIGwvXwtHPswblnkxpqei//s0XGChQ9Wx7Ofx4zTfszF8tPyw8c4HmO9ZRl3dVwCOWEQ5DMEPlhe4zHW2fK6HgMHP+Zi5eG59lligGlZzo119mE/rInV62eYVlzLxzmQn3E8xrq2jIkYLyUQz4FBXC8GOLH8WPw6huNlzDm8WI7VubCPxjCOx8AhrmWBObMcp3G8hjFjtA9zsVZcL4bXo8bbC4TJx5jJg08sHvaxX9Z5DfgjC+zROvuBbVngeE379JyxPAauZRmHseB4jDj4YOHXFuvaMo7X4G/5sCa2t87Y0XGkOCTX9L8H8RyUCdRjnYfXZY3nGCMGc7HRD3Ijr56LHz5tdQzWtR/zqxb5xfYexmLMMfDpXPAzlsdY13GMuTLeWiBCDAi0kAQsW87Bl8AYHlv28WCQW8fAD6vXs81Rp9jW01tvxcDHsTo/1oD12GhxTH+DeA4HrIcgYGF1jp5f1iMf7BedN7LGqFxXzsqxR2NvnTPEkVogEU0G8q1kj5KMfWBH84zGWc8XicNZr+ZEHraenKOcWeOm/Q7iOaTGgiztj55bSerhUK/YHvau9WiuMuW7i0PZZ4pA3krmnRc3ulemu7HWMnrWiLitBBJByFtzWJv1TlyGuwgXyEwCMxD2phpm3mUrd0ZuQwXSOrTVl5Gcs5r+/PXrO/PnbO9au+93vRQCWeXCZwqil3sVjnarM0wg1jcF41Yhs9e8d6+vwtsOdT4ikFWIu7vxvfutwuPKdYYIhN8KvfEKZHkbNRt+BY5XqfGyQHqC4PXspGRr9Kv1ZOd7hfpuEcgKRFxtxqzxK3CfucZLAuG3w9k4MwFSW9bmjqorO/+Z65sukIyHj2q8lfJkvIcVahoWyNkbQ9YyHn6lhp5Ra8Y7yV7TFIFkO/SMZlsxZ7Z7WaGeIYEcvT0yHnjFRp5Zc8Y7ylxTmECyHjKy2X78+PHFD/JifmSBy2Kz3lPWutwCab09sh4uuimPRHDFH12jJV/W+8pYl0sgK4lDyLY0iwdzRQjeWE9dXmzGRsxak1kgbxSHt6ln4b0CsOCzNmS2ukwC0eLIdghdj6VBLJhZDX8lr6VuC0ZzVvP2f2PiFkh2Ii3NcYb5/vMfX8vPlSaPiD07g2Ut+z1mqc8kkCzF9uqwNEYLYxFEDxPR9N4crbNYfT0ua/1/b5RtBGJtDMb1mj5i3dv0XjyfxzMuAbS/UmlethCIpzEEG9H4UTm8gjjCeznQjVDztmBeJxBLY/P/CE7Glpi7MCWQdiPPEvjyArF+cloaWAtDzy05nsJYeQBuVkPtlrcEQn9qpQWh5081v2VfNL7V7tbIs86ztECszWBpMC2Go7kl11MYKx+Cm9VQu+Utgfz/DXIkCO1/qvkt+5ZA4n8/KYFsIpASR7w45G24rEA8DWH59NVviqO5JdcTGA8fu30NmnmeEsgLf0mf2VC75S6BbCCQenvM+XolYi+BkEDw1Uh/vYI/qy2BbCSQf//r88XPldexpykEm7W5I+rycHGF8zfG3vIGgSC0/euPz1d+Roj3NIXGRjRlphz6fEfzEZ7fHjNdIFoUMocwYEcu4agJvP5MjT5ai+fMI1y/OWaqQFgcEMOZ9V6EpzE82NFGfSLOcy5gvTy/GT9NIF5xiHC8F4ELn22faHzrnqNn93L9Vny4QKTRR8TBbxbPZYw2SFSctZFn4K6ewcPzW7EhAmFB6DE3vnXsvYyrjTIjfoYgkDOyXi/Xb8NPE4hVDEc470VENs3MXGjyUTujNi/Xb8JfFshRg1/1j1zCjOZ5S84Rvt8Qk1YgIrDRC3hLU8845yjnu8ZtKRBc1owGekNO8Fc24N9iXf0qdRYfeUFvaOyoM0byvnquy28QIeCsya+szSI3qpF2zjOL+9XyhghkRZHoi9q52UfPpjl64zxMILNE8tSljDbVbnFP8Z9l3xLIT/+flu0mgt55sjTrE3WECgR/i37l945W7BPEjOzZa7SV10f42CFmikBEKK1GH/WtTvTKwkDtq9/BaP1hAkHzv/0tMnoRvTg06pO2V+OO6yECgTjEQiDRbxHJveMFeM/0pEBkb2+9q+MvCYSFwWOIhH1R49UJj6z/KbFEniF7LrdALM1vwYwKJjuhT9V3p1ieOuMT+04VyIyvWSKsJ4haZc+7hLIKH1frNAsEn/h4O/SaHzjERdurB985/g6R7Mwfn60rkFZjW5rfgmnl7vmQlw9R4/ZbdbZQ3sD7oUDOGhVNKvYIB8zRusePXGzfcDkRZ5wpkoj6suf4LRBuWDQi+/S4h8G6EKBjrXPk0FbisxObqb5ZIsl0xlm1fFrNioZsrcEHjFj42HLB7LeMOTfGHMe5a2z7sCiR2HjS/TQsEGnYVvOKX28ic27wszFywjK2lbd8bb5bvMwQSWufnXyhAukRw83eGkMUYmW9l6/WfRyVQHx8SX+dCgSN2mpm7bM0q47BnIUhY0uuwvh5KoH4OWsKRBoXTYsmPrPeZkUu7MHWm6vwvkuPFsnu/F8SyFVyShi+5r7Kt8SXQHycuwUScUmVw3dJkXyVQHzcHwoEX4PERl5Q5XqezxKJ/Q4OBVKNbCdxNa5KIPa7/ZtAVrvsqtd+2eCqBGLn7LdAQF5ZO3mrclUCsd/x73+LteplV932ywZX0QKRfMi9my2BDPx/sVZvghKI/UOlBFICCfm7kdU/NI7qL4G8UCDSDPUWsb1F/gs9r28akoDJcAAAAABJRU5ErkJggg==" - }, - { - "name": "Looking at the Surface", - "description": "The surface of this world looks exactly like a grey version of Earth! It seems to be an exact replica of some kind.\n\nYou see creatures moving around on the streets", - "choices": [ - { - "key": "choice 21", - "name": "Cool!", - "exit_node": "Tractor Beam", - "delay": 0 - }, - { - "key": "choice 22", - "name": "Scan the creatures.", - "exit_node": "Robo Brits!", - "delay": 30, - "delay_message": "Scanning..." - } - ], - "image": null, - "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAKCklEQVR4Ae2dW3IcNwxFtSYvIv7PR6qygZRiy8nGsiMvZlKQciMI4gMkAT660VVjNNkECIL3DGcSWX764+fjEa/r1OCXr18fpVfsddteP1HBclcUs62YO9SrBAc92yHHk3J4ysEh+09a1J1zDUBs39TUgEhgqH1nIe649hoccYK0a3YIkICmveCeYAUg9vthDkgKmjht7DcuBVoNkJRP9JX3ZhogKXBic8qb01qfAMS2nlT/pYBwaFrFEOM/iqEGBz1fUTO+x/x+RS49c24DCC8e3fcs5s4+qwCR+6Ztn7JX2wLCC60pJh9P9xqfK42pAWK1Vlnn3rZVPt5xjgCEb4IsCH9Wu5e+V2nX4LD4eFWrbevzU2p/HCCtGyHHn7IxLXl6AyJraNFuWd/KsQHIBX4WzRMQCxhSMVaKvmXuAORwQDRw9HzESonasq9FpCvHBiA3AKRFYJYQlGK15LRy7O0AoU1bWXDLuf/89u31R9ullaeKds6SoK2faXNaPS4AOfgEkSDk2hqRWQNQi6fJaYcxAcjBgMiTI9fWCK0maOvnmpx2GBOAHApI7rSQ/VqRWQPgFU+7HqtxtwPEqnCr4xAIuROD92vz9BL0zLjatbaMC0DiBHn9jxYzhTxzrhYYUmNvBUiqACf28ROidpJo1zdTtCvn0tYD4y4PCBZ6JSu/Z5Ta2nWvFO3KuWv1uSQgtUWf/lx7grSuc6VQd5sbtbsMIFjQ1W3ptJDPWmuxm0h3yKf4e7F2SDCXQ+vmX2U8QRAnSE4V9v2vgEA89uHHIiKvsO8/HiNPiVy7t2ZjO3Y97w+AoKgzlom5wr6Lv1YL7clB42qxcs9n7P1JcyQBQfE8F4I5wuoBKX28kifJSF099/202EVAUGTrRSFuWBs45MliUVfrPT81ngoQWfDexco40dYDIiEota3q2rvPV/LrAsRqAyKODpASDKmPXZZ19RQ75bn7FYAc8LNYKQhy0FjC4SFgmV8AcoAA5abt1G6Bg6DxyH1ExJp8RuJ7+8YJ4ghwq7gtxmsE2TOmJsSemPCpxV75PAAxBITewWsvCwhmfbyCgL3tSgBqcwcgg4DkxLqi31vInvFrQl31PADpBKR2UrQ+tzhZPAU8I/YqCErzBiCNgKw4GTTwzBCw9xwloa56FoAoAWk9EazGa+AAtN4CnhV/FQypeQOQCiAQ30l2lpBnzZMS7qy+ACQDiNUJYB1Hc6LMEu6KeWaAwdcVgCQAkaLWiHLHE4Zv9NXurUCp1SUAYYBIME5q5yCuCeD05y2g9Kw1APn5qP7PPQlKToy79vcII3zefpD09oBI8V+tDWhD8LqfnJZ1ui0gHiBAjDtaufHR1gFzS0A84DghZkChg4LX6XaA0Lv777/9+nh6evr03YP6PV+rTxa+8XGvg+U2gECcJQDoFMC4nMVJgeeyjX5pU/PCd6YNMHRgoE63AARilSKl/tyLRAs/Dytz8Z4P8bHxYXWgXB4QEjcXY6/Y8S4Pf7SlxXNpMU72U5vnh3GeNuDQwUF1ujQgXHh0T2KsvUiYfAza3hZz8pypz2PeACQA+fCuDDgsxEYxUi+IGc/QHrGABTGtbAByc0AgLG5JXCmxUl+qPzee90Owvf4pP+TDLdaRGs/zaXkekOgguexHLBIOhNUjIil+tEdti4hl3lgP2dE8ApAA5H9ARkQpRerVphx5nminLAeF7rlfS34BSR2Sy54gJBoIqUU0Umzka/FCXMRCe9TyNSK21gYgNwaERALxjIoQ/hCeto1xI5Z8uX+ujbVSjnx8qR2ABCCvkEDYXCzog5jQnm0xv4UFJGS16whIypBc9iMWCQSCsRAfxUOcnPjkc7QtLMXgcUptrBt5cj++DuoPQAKQ5LspRAMReVv5ri7nR9vKSkhy6wtAbgwIiYKE0is6iAr+aLdaKVbE87aYlyzPmc8bgGwOCP2dYq9NIlFIcXChzLov5VB6RvlBzMi1tU1+NEdpHq/6XyHu8u8gnoDQBnFhtIpLjodItZb8uTgRDxbP0Pa0mIvXA+u4gpC91mAGSK/Q+W+l8FgkRLDKpgSJXErPMAYW8GjbGCctQOH9HnW/SkxTQHog8QYEG8UFMeu+BAB/lhM/+nst1gl/tCUkqFHYzx/3bwMIbT4EMsNKEfI5ORy8f+Y9zyHA+AwGanIrQLDoGULkApTz5Z7Jd3rPNuWAPFCXsJ9BuSUgJAQpWss2F5+MC1HK/hVtyuXZ6d81vApsJoCMfI8Y8R3dBC9R5iDI9XvlUYsbgHw+MaSmzAEZ+aIuk5vZrolJ+zwHAfXnnmljW42jU4NeAcgkQEjIdNHvmqKrVdivTv/90eprPX5EhDkIcv0jc/X6Ao53QL4375d1zXeOZ3KC0ALl1bJo7tvi5z22VYS5EyLX3xp/dDyH4/nb98fz94CjpqEAhP3zB7liaYTJTwl5r/H3HPMRDPp4RXC8PJ5fXuL0qOy/GSAkLn7lxJbrH/HNxbTuL4kYUMDSx03cl/y8nwUc7R/5uW5MAaHA/OIT1e57/WpxPZ9D3AAhZTFmhf0Ix9tHqreT40ecHJWTA7rZEhCCBQnubFNAyL4VYNCcSTheXh7PP/56PP/19xH13WHvXQFpETo/QVr8VhZRwiDb+8Dx9n0j4Gh/4zUHhATLrxYB9/q1zGE1VsIg26l5ZgDz+eR4hyOVE+/j9dfcc9+r3rsDQoXWFk9uitbPY5wUfEu7NR8rcFJwaHKRde9ta+Y6bUwAkviyBhj++fLlUXphnLQWImiFhsOhnb8XBK2fNo+dx00BhAqqKUKq8Bo/yzEk9hIU8pkHHJbrQaxUbWf3IZeT7FaAUOFS16yCtsIBWADJrDy186RquVOfdh0rx7kAQgtKXZqF9vppYpfGQOQQfasl/1L82c9Sddy9b3aNNPNNBYQ2SJNUaiM1fiNjek8PgLQTIKn6ndY3speWvscAooWrtzhXAOQ0CFry7d3XUT83QCix3KVJesRXE1+OOR2QXL2u1C/3bEb7OECw4dbFORkQ1OTq1nrPNfFcAaEEcpcmuZwv79fE0YwZAYR8NXN4jOG1uPq9R/1qMd0BQQKpzcOznE35pPpy/q39JPRWUODTOtfo+FQdrtg3WqdR/2mAUKLy0iYv/VJtbSzNOIg+Bwt/XoqXylPbl4ur9T91XG7dq/qnAkKLlJd24dIv19bG047jMOBe45vLL/rzFdDUdfaY6YDQAuXVs2gZg7d74ln78HziXlcB6z2wiLcEEEpcXr2L4XHwW1WorzeelR/PK+7rFbCqu3WcZYDQQlLXyAKt41nnksov+ta/mZX2eSkgHpBgsVx46Jtl+dxxX6/ArH3pmWc5IJR07upZ0A4+ufVE/+cK7LBfpRy2AIQSTF2lxHd+llpL9KUrsPM+Um7bAELJ5K7diyjzy60j+j9XQNZut/a/8+89HVF1Xw8AAAAASUVORK5CYII=" - }, - { - "name": "Robo Brits!", - "description": "Wow, they're robotic humanoids that look and act exactly like the British! You see some robots laughing and chatting at a pub, and a Bobby walking down the street looking for crooks. Who created this earth replica? You only know Earth from the books, but you should be where London is!", - "choices": [ - { - "key": "choice 23", - "name": "Nice! Well, back to getting pulled in by a Tractor beam...", - "exit_node": "Tractor Beam", - "delay": 0 - } - ], - "image": null, - "on_enter_effects": [ - { - "effect_type": "Add", - "quality": "Long Range Scan Report", - "value": 1 - } - ], - "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAP2ElEQVR4Ae2dT8snRxHHnzcgYT3ksEgie1gXVkhIUFA0F1cPezAsHjzsKYR4URSvHj0IycmjvgLxIIigOYme9C1IZAUvCnkJXloqmyKfp5+u7qrp7pn5PduHpmqqv11VM/P9Ts/v+Xv14duvppHj6uoqjRiRnn70wR/TGuVr8OE77yRrjLhPVg6rZjRu5c/j0bxe/FWEiBY2b3bUsVWvFF8COZdAhANeElq4rTyy8m2Jdwtk60l415XEUIotgZxPIL0i8XKkhtsiCq7pEkitsVFzJTGUYksgSyAezpH8Hn8JJPv8kl/kMwov0mONBHmeGce1+rW5Gb3kOWv1dW4J5FOB5BePx2cRCXvKfatHvdElm+eYcVyq64nN6KWW0+rp9AKRkyq9UuUxiyCteO2ica6VZ9Y8e6j5Vn3rxku8lm/UXK1+bW5U/WievKerPEFOvNpxvnbWca0HnbMIUotH+q3lmTUX6Y9Y9pPfcB5zzSyf9bz+rF68ednnDYFIEiVdy3oL9uJafcg8SdHyt/bTyjtyfmuPuk574c3OfcXOsnk97/GsfqJ5pd+iQCSRh5TRgj34Vj9KiJbt6aGVW+Y9+UfladWSOjVSttb3zNfqWnM99SauLX/nu0VInZ/Y2DWyab2abRGvt9fR+Wv5enuV9S2BfPqEvHado3Utskfj0bo74pdAvBe7RmiZ8+YhzspJzFbfI5CISKKk9+K3nt9O65ZAvBfaIrPGvXmI07UlS1zU13xekh6Ji57bzvg+gcgrzx4N116tdE5JUbM9vdbyytyW3KNz5vmOJL639pbrtuOaF0sgOYFqx7wJNZzMEev1Wzl13sqn8zXrJeneOOucThhfAqkRzDu35cZ6c/fg9ia+p96Wa3XgmpsC0VcWr92jeW8vPWTqWRu9Bj21Ims9hN0TE71OJ8AvgUQIZ2GjN9LKMzq+J/k9taLX6Ui8nE/XNwr1qb7HSWgtjx1NMk++6DXw5OzFeAi7NyZ6nY7E31qBiIh6ybVlfeRmbskfXbM3+T31ItfoaGxVINKc52ktmNkn4u2DuCiZRuAj12FEvVYOD2H3xkSu0dHYpkCkQZKu5ntPhjk8a4iP+BZ53v/F+ykfFjYa95yPYqK5t+BnkV/PoWQ9NUvrzhgbKhAhb+0kI+Qehf3BP9MnYiC5cnGMPq5dA52Tfnrr8pws30PWKEbPoWY9OWvrzzLnEog0O4qwe+dRgfSSsWd9frN7crXW5kLxEDWCyc+ldjwrb63m6Dm3QKTw3uQeUa9FqNs4T5FESNrCbiFfKyfnt+SfvUb6M7/MWyo+grR75riNAvCeE8k3wi/xoRXbUreVc8/5JZDCB3YvAc+O20JOa81WUlr5PPGtNUeukz5DO4gU33MH6K11dhLP7M9DQg+mh3Ce/C1MT/2etdrXEsjaRab+Wq4Srdf2kH3LWu13CWQJxBTIFmKV1ijZRthS/tEx9rkE8gIL5M7nX05bR4SUJNwoP1I/imWP1/5wnCdR7+eCPdfPfMe/hNy80SV/qzhknYcrxJTqj4ixxiiffV0TiJC3VmRPcue9bK19CUSe1SNvdMm/DQLR86rxNjqnOcXeEEhOTE2+laD5Os2nNp+36gu+hG3FZpHvEvLyRqtPUXzhi6+l0vj9X/+WdJTmJcY8ei9rVuvPtrUevHPssSiQFul65q0mNac1r3HFee2ZiPy/dJVk7NUTb7T6JLZFfhWHWAvDPHpvalbr72VrvbTm2ONpBNJqWue9wlDcXmT01FkCsf8dHEk50lfeeG1ee3eBKHE9DQs2x+l6r/UQdy/MmQXCXePP//h30sE4d5Oz7yA3iO7835k31nmJNguXC6B2HO1hL+J76+wpkPxG6zGJTcJTCCoOsYwTzzy1e6ZzWv9Iq71YttTbYTsIyV5qWObzONfQz3GRYy+5R+CWQPZ/xSqSvrCblHASO4VASmLISU5B5H6OjRyPIP4Zc1g3nE9+a3fwxJmndb2tXi4hfhqBtESSi4LHrRtUmz8juUf1VCIgie0RAl+riGee2vUt9XBJsVMJpCYSCiLHvfTSS2nr4M0dRcyz5CkRkcQm4S0hWHHm4TWkX6p/abFdBMKLJn5O9tIx17Tmt4pD1rHOWYg9qg8lI8k829frqbUv3R4iEK9ISsLQmN4IsUsgN/9Si4hMyTlbFMyv90VrX7p1C0RPnFbJ2rJcQ7+1rjb/4MGDpOPRo0dJx+PHj5OOp0+fJh0aE6tYsZpD7Kgn95nyCEFJ4Nm+3t9LF4b27xKInnTJ1kjMudJajRHn9UlsEp5CUHGIZZx45jkTsUf2ojc7F8vf//SHpONXP/tpag3FiqXQ9D6qZb1L94cJRC+O2BLJOZ/7JXwrRmKT8BTCWQWy5/dDVGhKVBKbhG+JQ+aJZx7eT61zW2xVIDxx9YW46qu1YiS5YkuWuJpfWjsrpsSaYY8QiJyHkJbEJuF7BHJbxFA6D1MgFvEsMZTwJDvnGY/4zDHbnyEMzbm3QKKiSFdXSYclHIqL+Usku+RYSCAkMwmqccboy3x+rGsiljlm+0rmGXYJZOyPnJS4MEqULoHkJM4b4nw+Vzomfqv/21++n3TwaRb1NYfYGWIo5VwCGSeQEr80NkIkYYFocdqc5Jwr+Tl+yzGJHRUF8cxTIvOM2B4Cuf/6u0kHX4H+8rvfJB3W65MnrjnEMr/WFDuCoLUcJW7lsdp6z9w1geTJ9VgJrMe0OleyxKlfwm2JkdgkfNRnnhliKOVcAhmzgyinPNYjhhLGLZBSE15ic613TQvHJxhFwaffBz95PelgnHjmKZF5RmwJZH+BKAdLIqjFqgJRkmpyWp07ypLYJDyFoOIQyzjxzDNDDKWcewvklfvfTTr4OsRzj/rMo7nF7vWKRS5G/Zog8rmqQKzCR4mCdXlDSXgK4awCKYlmdIxEJYFJbF7DqM88zM+6OdlGHlvc9Ma9vVwTiBCwVYAkPdL3iOLr3/xe0uERy2iSHpmPRCWBSeyoKIhnHuZnXS8Jt+BaPPXOt2rfEEhNJEcKIq+9BPL8y9IkpOWTwJ97+VHSQZJHfc0hlvmtHhhvkbI17yW/F1er5xZITtCjj5dAlkC8AvDgLJEUBSLkLyU9QhSlPiTG7Z6fO+hbr1WMM49V68hXpVZtPpktn094PvmjuwbxzMP8Vg+MW2T0xq371BO3ai+B4Btn1gVukfTIeRLvy1/9cdLx8Gs/Tzq+8o13kw6dn2W1pljWYJ8WGb1x6z71xkv1TYHobsGiGpthWUd9qaN+bvnk565BnzuFFWeevIYeHymAVm0Sj4QkUVUcYomZ4bMu87PPEhEjMb0vo22ph5BApKFR4ug9ORK7x6eIrJ5aJD1ynsQjIUnUJZAr80HLez5EIL0iYUM9fo8ouPYSBWKJgnEKxPL/89FHSccbb3wntYZixVo5GWc/FC/jJVLWYj2caa0t1W3uIKXXnC27SKu56DxJ3uMvgTwXSUscMr8E8var5isUCRwVCNd6/G+99e2kI4rXdV7rEQhzHfk6pbX5BLaezHySWz4JvwRyVfzpY9cOEhUE8R6C5xgSMp8rHRMf9Y8UyNafyaJASH7G6RNj+RTLK6+8kXQwbq1lnHXpW5jSa00tVrr/o2KlulMFsrVxktyTg/iovwTy/MvBFIKKQyzjJLnlUxT0iWe8REor5uFCD6ZUd5pAoo2S2E+efD/puHPnTtJx//79pENjYj/++OPiuHfvXtJhYZhHc4tlXHsRyz71lWerXTtI7JeqopyK4EvikNgUgUQaUyyJR0KSqBaBLfKrOMRaGE9+9sM+twpD16lAxGrMY/kEfvPRr5MOxunz6f2v/z5JOnSdWGK4gzBOvOYQSwzr0udaxi1i5nHlySyb19PjJRDHDjVLICIGFYlHGIohwSziEUMCk9hcS8zZBDJLFJpXxVCywwWiRaP2vfd+mHSQkJ4nvLU7PHz4MOmwMJ787Ed7FKuE7bFLIO3fLoxyKYovCUNjSyDBHeTSBcJdw/K5m1gYxonnzkWfeMaViDUbJXwEX6src0sgJxFI5HMICWYRjxgSmHjL78GzLn3WYrxF0E9IWviXaRER1LCt+qcRCF9jrBO6e/duKg3inz17lnTo65VYjYklvpRPYsTwFYp9Mt7jR1+zSDCLeMT0EJ75LZ/5WZc+1zLeIuhMgbhq85t6I3wSK+KTeNY6D5kphCWQz/42Fkl5hL8E8umPqVjkbsWXQPxf6iXBLeIRcwbf6tPzFJ+xi7jrjtg1mKMlBGt+CWQJpEVaiztb4q1aOr8+gzg+1/DzBYXM+J4+dwTr/Z/9vPX6l1Jk9KxVYon19Em8x98ihnyNp45ilkCWQG6Ip0cgslbJNUMgkjsnfPRY+/PY4QKR161ow4Lnk9laf1s/pJOQHt9DPOaJ7B6C7V2rxPP0qdiItfjhiUfqCHYJ5MJ3EJLQ8vkaZvn8EE2MFSeGvtWDFY8SVvEeMeQYXRuxSyBLIJ/8sKElBCtOUdC3hGDFI2TNsbkAPMd5jtbxFIFsec3yvGJ5LgD/uSd/14NxTx5i+MrBPhnf07fIZsVJYMu3hGDFrTxWD1a8RdDWPO+T12/l5PwSiOPHGEj+MwiE/fAXmuiTkCSz56d5rbUUC/MwP9eyH/okYK/vFQVxkZqnFogQgSfm8blT3NYdZAnks58A9nAix1ykQF57+GbSwV9K4leudN5rR61lP6xNoh7l88lMn09yPuH55OeOQIy1lnjmsdayH/oRgnqwuQBax56cijnNDkLikZCjSM78Hp912Q/XHiUK1iXxGPeQ3CL2jDzsU8k30rZEwflI3WkCiX5QJ/FISBKVGI8/ai37YV0S6SifxGMPL5pASHqKIfeJ8/inFAhJaJGcpKU/ey3zk5BH+Usgn30eIeFzYcgx573+Egj+SB3JbwmTmBmiiP5uiNUDdxCPb+Vh3JOHGK5V30vMs+CWQE4qkMhvGCr5aElUj8+1lu/JQ4yV5yzk9/RxGoHw/5XTt57k/H4EfT7hR61lP/QtAvTGdRfpEQmJ6vE9PXvyEFPL6SHnGTBTBRL5oE7i0R9FcgqHgqJPDOuyH/o1AvTOqUh68+Treb70c1zpmHj6JawndgYBtHpYAsFfcVwCef5/Dy1yUxT0LXwr3iLnGeanC8S7i1hPZj7J6fMrV/SJsXzi6Vt43mirT2JG+C/CDiLX6QwiqPWwi0BEJJZQJC4XyiKeRVoSm76FZ5x4+sTQJ+GtPokZ4c8SCM+Xvqdn4ul71lqYGjnPMLerQFQotHrhLOKRqPR5g+gTY/nE07fw2qNYq09iRvgvikDkWp1BCFYPhwrEQySLtCQ2feKZn3Hi6RNDn3n28l8kgcg1tQh6dHwJBN8HoSjo7yUK1lGBiGV8i8+HAD9c0yeGNRgnnj4xXBv1jxZDqf7/AdVoY/i7GpcvAAAAAElFTkSuQmCC" - }, - { - "name": "Verdict", - "description": "Before even getting to defend your case, the judge says \"I've heard ENOUGH! It's time for a verdict!\"\nDang! You're definitely in kangaroo court!\n\"GUILTY! AND YOUR SENTENCE IS:\"", - "choices": [ - { - "key": "choice 25", - "name": "\"DEATH!\"", - "exit_node": "FAIL_DEATH", - "requirements": [ - { - "quality": "Crimes Committed", - "operator": ">=", - "value": 4 - } - ], - "delay": 0 - }, - { - "key": "choice 26", - "name": "\"SPACE JAIL!\"", - "exit_node": "Not Actually Space Jail, Just Normal Jail", - "requirements": [ - { - "quality": "Crimes Committed", - "operator": ">", - "value": 1 - } - ], - "delay": 20, - "delay_message": "You are being jailed..." - }, - { - "key": "choice 27", - "name": "\"FORGIVENESS! Just trespass? That's not that bad!\"", - "exit_node": "Sweet Sweet Freedom!", - "requirements": [ - { - "quality": "Crimes Committed", - "operator": "==", - "value": 1 - } - ], - "delay": 10, - "delay_message": "WOOP WOOP" - } - ], - "image": "default" - }, - { - "name": "Not Actually Space Jail, Just Normal Jail", - "description": "You'll have to wait out your crimes against the robo brits.", - "choices": [ - { - "key": "choice 28", - "name": "Sit out your sentence", - "exit_node": "Sweet Sweet Freedom!", - "delay": 1200, - "delay_message": "Sitting out your sentence..." - } - ], - "image": null, - "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAOkUlEQVR4Ae1caQ5etw30lYrcoblZgZzaBVsMMJlw1dNbnOiHwX04lMT3GUbaH3/854+fu//89q/ffnb+7O67E6/D33J29rwb61eaqcv17jv4cceldIe7o/cuzL/DDHoWv9JMXa6Wp3PutM+CBL+g3QvaeRl3Y/1qM32B71mQsyB/+evw3YvaxT8LEjzO7gHemfeFy9k936820xf4nl+QYEm/cDlnQd7/x56zIGdBzl+xgjdgH6izIMHhnF+Q/f/8P/1F/MIdnAU5C3J+QYI30P4F+fnjx0/9k30Nos1XDLYzPItxLvSq5kqcZ0A/lohf6aG1hq++nTY4q7S+7NvZU7EmMxonPnPVJ5y1VnlFdvoLoqCe7QEz8WpIxfTwzKd5kR3VT/08Q9RL/dMemg889a/YHhbPBB15sE1O+wGjquvmAce4oMaTytnLiXzoUclwQSJg9XsNmLjmd2wPs1OnOR5O13fHDFlv5p7ldWKMZTpqeCbTNQ9x5HekYkQ13Tyu9zgyDviyr6tzn0x3F+RqkyvE0VtJwz+VitO1MUN1SRmfbi8Po1vr5UV41UyIe5iRL+rF+Z0czmfdq4UPfGFPJPfI9L8sSLdJBnrlUaG/4sO/IhWrY+Pwr87S6RXN1Kn1ciI8zBTFzW85Hmbki7CQH8XNj5xMZvWdeVCf9chi7QXJQDRWPSoMhjoMoRJxkxozO/JHuYxX6eAYzRL5p729fPgqjl4ctavS5vJwPd9qD9R5mOxDXiS9O0K91sA/lX9aEAWF3QG1XOShzpM8FPJNerlZnGNRPWNqfmUzT8YxnWNXeiuuZ1c8Ne5hTH2KGdlTXC8/wja/l88+vQfG4jzTOTbRywXJwCIS6ofNA5nO2MhhmcU5Bp1rVUdOVzJXxeIY8DSHbeSo5BzTLe75tC6ytXbVjvDZv4qtdYypuuayzXegb8lwONd0xe7aSwuizWGjKWyV2VCaazbwTGqcY9A1h23kdCVzZRzTOQY8zWEbOSw5Dt3i0FlyXaZzzVU96xPxXO0Z9crw+A5M9zC03supfH+bBdHDULs6CI3zBSgWx6xO42ortlfDOVpvNscj3atb9UU94F/F9eqAqdLLhY/vAHpVr/GOvbQgBgyiLNGQfapjGJNVPuJeP8QU37ORO5HMUzERU79nez29vMrn4bCvql+JMz7rK1hVDeNDz2pwByxRB6n18E9kuSDWxAPU5pznxdiHoQyX/axzT/av6IzV1cFxpR/XaD+OTXXFYjvDsjwvbjN6fvgYn3XEPRn1ivzAYHzoiHkS98MSdZBaB/9E/mlBrFBBJzYaVwffwQTWLk6M19Fx8B2uUY7XJ8rt+qeYnM89MF91V1xvOmOozrkci/ycYzrnVb2YP/SqXuMde9uCcLPq0PVg1GYs0zXetRVnal+Zw+vV5Z3lTXE5H/PgQbGMenK96VGe+b1c9WUYnJv1sRhzh871Xh+Nd+y/LIgHXJHVwwHhTp3meKQ1p7I9jBWfzVH10njWR3NhT2s0HzgqNQ/34kmtZZtx2M8651Q616mOWvWr7c2AWkitgX8i3QUxAAWPbK8Zk4/qPL+HdZVLhNnx2xweT89X4Xk15lup45oI18Pme/F0xuIe0DmuOnK6kuu9Go6r7nE3XwfHy8l84YKgSMmxjRyV3gBcp7rWq635bGvuTtvm4F6qY85pT+B067r5yDPpYYNvR3r17Kt6ce6KzviqR/y9PlzrxStfuSAVgBePBlC/V/sln/KN7C9xzrhE/D1/hvN0zOPn+e7gdRYk+Z9bepfg+e64mDswPe6R747+q5gRR8+/2iOqOwvyD1oQewTeo/J80YN5w+/xi3y7+Z0FOQviLs3uh3YFL1oGz3+lj1f76oLYgB6pr/i8C4h8X+Fc8Yj4q7/CeTqu/CJ7N6+zIBt+Qeyydl/MXXjRw1L/Xf1XcZVfZK/iR3VnQc6CfP6vWPZ4o4VQf/TQV/23LMibA60eRFSnFxDZUf3X/BF/9R/e//9/ljwLkvyC2CPRhxPZX3tQEZ+Iv/qj+rf8yi+yd/M7C3IWxP0I7H5oV/GihVD/1T5afxbkLMhZkOQNnAVJDse+JvqFimz98nzVjvir/2v8lV9k7+Z9FuQsiPsR2P3QruJFC6H+q320/izIWZCzIMkbOAuSHI59TfQLFdn65fmqHfFX/9f4K7/I3s37LMimBbEL2305d+BFD0v9d/S+gqn8IvtKD6/2LMhZEPdX0nssb/qihVD/bo5nQc6CnAVJ3sBZkORw8DXSr1RkI//LMuKu/q/NoPwiezfvsyBnQc4vSPIGXl8Q+xLs3vrdeNHXSv27+67i/fv3339Gf5RzZK/2vqsu4qn+3f3PgiRfDxy2XkJkI/8tGS0F+yPu6ueat+bhvsovsrlmh34W5G+yIPygMz16WOrPMHY8vCmG8ovsKW6Vf9uCWONoCPVXJN+OK9/IfoNn9pC9WMRd/V6t+p6cV/lF9m5OZ0F+4V8QfbAdO3pY6u9gIWf3o/TwlF9me/Wrvs8tCA4dcnWwnXXZZXBsZ88OFs5oIplvpk8wLbfD90pOxlVjV/po7WcWpLoQJf6krRcQ2U9yqs4rikfc1R/VZ/4751d+mb2Tx1mQX/SvWNlDzWLZw+JYhlHFdj5QxmJ+mc41V/VPLEh14IhfHXa1PrsMjq3ir9ThTCbS+jDfTJ/gerkrM1U1GV+OVTiT+C+1IHYRk+F25fLhZ/qufh0c71FmPmBm/DmWYXVi6LdTMr9M39lz64J4B5cNgphXl/l2HkAHCzwr2cHalZOdj8a4ZzUD4lajOFOb++7Qwa2SO3oBY8uCZAdXDWPxrD6KYYAnZGcGy3mCC3pE56J+5ENOZ1G8qY2+O+SU+46elxakc1idoTo4mrNj+C5GZwbL6eLtyNPzmNideZjjBFtzGeeq3uG9+x6WF0QPIrK7Q0X1mf/qgXfruzN08XbkZecyiWWzKc8JLucqzqqdceXYKr5XdxbkH/bPvPxwWecHBt17MFzT1T2cFR94VXIFO6pZWpDuwVheNQziRnCCa7nRULv94NiRu3tHeNOzqvK92aLe5q/wNJ5hdWMeR8/XxevkfWJB9DC7dmfAHTneJUS+Hf26GN1z6ubpTBmPLibyMqxuTPlFdhevkzdeEAzcldEQ8HdxvLzOgDtywLUjd/TrYnhncsWn81U8pr0qvCqu/CK7wpnEb10QIxINAf/0kDl/MujVXPCt5NU+03o+j6u6ztbhMunZwctylF9kZxjT2GhBJodhuUYmGsL8UzzNnw57JT+bg2NXeqzW6rms2jyH6R0+014dzChH+UV2VL/iv21BQCYawvzTw+V84D8lszk49hQfrw+fz1TnGaB7PTzfpJdX3/WBVyW7eJ282xfESEQDTQ5WczvD7cyJZlD/zp6rWHpWHVvnMLvbv4OPnC6ml+dx9Hxe7arvlgVRMt4Q5sOhTaRiP2VHM6j/KT7TPtEZK3+2Jz0ifM8/weVc5pbpXHNVf3VBbEjvAD3f1UGv1mcXwrGrfZ6oZ76ZPuHi3Vnkm+BybsaVY1xzVf/8glwdcFc9X0Cm7+p3J07Gn2MTDtEyeP4JLucyt0znmqv66wuCQfUgrw62ux48K7m77x141QyIT3vrHUb2FBf54FVJ5O+Qn1kQDL1jqDswwK+Sd/TejVnNgPi0b7QQ6p/iIh+8Kon8HfIsSOM/VrSDri4F8R2XcjcGuFZyykMXIbKnuMiv+CKO/B3yLMhZkHD5pw8sWgj1T3GRjwWoJPJ3yEcWxIhWQyG+Y6g7MMCvknf03o1ZzYD4tK8uQmRPcZEPXpVE/g55FuT8goQfr+kDixZC/VNc5FeLgTjyd8jPLYgNuWOw3Rg4/Eru7nsHXjUD4tPeugiRPcVFPnhVEvk75FmQ8wtyfkGSN3DLgtiXQ7e32nqOa+0XbOaX6V/gWnHI+HOswuF49Gvh+bluojO3TJ9gVrmPLYgRyYbiWEX6jTjzq/Q3+E16Vvw53sX1FiHydTE1j3llutZdsW9bEDscJZYNxTGt+4LN/Cr9C3wzDhV/jmc4HIuWwfNz3URnXpk+waxyRwtiYN7AmY8JZENxjGu+ojO/Sv8K54hHxZ/jEYb6szfAMa2b2Mwr0yeYVe7tC2KHAxLZUBpDzZekcozsL3GOuETc1R/Vs58XoNK5bqort8ie4mb54wUxsOoQong0kOfPSL8V83h6vrf4Tfp6vD1fBzO6b8/fwYtyPH6eL6pf8T+6IHZg3kCeb2WYu2s8np7vbh478D3enq/q5S1B5qvwsrjHz/NlGNPY0oJYk+wQqpg3lPqmgzyRrxwj+wkuV3tE3NVf9anumuMVVhVXbpFd4UziryyIHVo0HPsngzyRy9wy/QkuV3tk/DmW9eHH39EzrE6MeWV6B6ubs7wg1qBzKFXOU4N2DyTLy7hyLMP4Soz5ZnrGt7pbjmc43VjGk2NdvE7epQWxBnwIqzoPx3pngCdzmFumP8lptVfGn2MR/vSuI5yJn3ll+gSzyr28INZgelhevjdwRf7puMfR8z3Na6Wfx9vzRdjeHUa+CGPq9/h5vilulr9lQaxBdDhTPw+cEX8jxtwy/Q1u054Zf455uNM79TBWfMwr01ewo5ptC4IG08Pz8nl44H5BMq9M/wLXikPGn2OK491X5tP6KzbzyvQrPbR2+4JYg+zAujEcgBJ+0wanjnyTZ6d3ZwbLUazu/SFP66/Yq5yv9LxlQYwQDuiqvDLc7truBXkPazeXq3jdWbjP9C65doe+wvlq39sWxIhNDzTLvzrojvruBZ0F+f1/d7/jzBmje/5cc1W/dUFALnv40xgw35JvXNIds07n+MI9TTnvOLdHFsSITg84y98x+CrGG5e0yjWrm86R3YcXy3qvxqacV/tw3WMLYk29g1z18RBP6m9c0h3zTeaY3tEdfA1zwnkXh0cXBKSnBx7lA+9J+cYl3THfZI7o/D3/HVyBOeGMmqvyv9va9kZwciKCAAAAAElFTkSuQmCC" - }, - { - "name": "Sweet Sweet Freedom!", - "description": "You're free! You spend a good while travelling around England (or at least the replica) and enjoying the cuisine, people and culture! Good society research is gained from this or something, but really you're just enjoying the sights and sounds.", - "choices": [ - { - "key": "choice 29", - "name": "Nice!", - "exit_node": "WIN", - "delay": 0 - } - ], - "image": null, - "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAQJklEQVR4Ae2deXBX1RXHY23/6DYdFBekilIInVrsTBUUEKWitf1Hp4467XQ6Y6frtLWtdpzWhaCCCQmJieKCKHWKY52xjgsg4AIo7s601NYlIoSdaEJIQgwgWU7nxB643Nz93fveu7/fy8ybu527vHu/n3ve/W2pgIB/B/v6ofHBV+H07y+Az319NlSMm1WS1+YdncpZ3HDpT2H9yNODXRsuuUrZ/5adnSU576inoydUwYSLmmDu3S/A/gN9ynlwKaxwqWRTZ2BgEHa17YW/PvYvGHN+fUkuVAFINhvf6Gl1sPCRN2F7azf0DwzYyNLYNjgg7EgOfNIH9Ytfhm9870747ITS8SgFIOkBcnRlFYy/sAluWbAWevd9wsorSDxVQPAO0KPs/KgbHnj0n3DKeaXhUQpA0gHkpKl1cM/Db8C2XV3BPAZPWWqALLzhGjC9YjurFICEA2TIY8xshNl3rIae3gO8foOngwNiCoXMLgZYCkDCADJqai3c/dAbsHVnF/T3hzlj6AjzDohM6D7y8wpLAYg/QD5TWQVfu6ARZjU+D909+3X6DV7uDIgPwSdtIy/AFID4AeTEKbWwYMnrsGVHZ2YegyduGCBJRZtV/SxhKQBxBwQ9xriZjXBjw3Owp3sfr8/M0xVZCTpkv2nDUgDiBgh6jDv+9lqmZwwdgdEDUltdq3x1LA1YCkDMATlq/Cw4bcbt8Jf5z8Luzl6dPjMvjx4QG0/02oqlgJdvaApAzADB9zEWLHkNWrbvgb6MXpWyJS53gKBHML1s4EBbAoRCX6AUgKgBOfX8BriudhW0dXxsq89M7QcHByFTQEioWYUFIGphJ52f48+eBw2LX4FN2+LxGEQkfrZryRPrwwGSleht+00qAqxfeJAjQRtzfgP8qWYlfNjeQ3qLIkSPsadrHzz+zDvw7Uvv+fRR3PYxRWZvK8y82BeAHCnuJPOBHqP+gZdh09aOaM4YRC56jIeXvgWTLlsIn//mrYfPqTLB2+bnRfC240giCKpb7h7klOn1cM1tK4Y+hEqCiyEc8hjd++CJ596FST+49zAU7PeWbEFQ2duKMy/2JHTXsFwBOW5yDdQtegk2bumAvr5sPivlCiJ6jEeW/wcmX7YQvjCR8RgsHBhXCd62LC+Ctx2HKxhUr9wAOXn6fPj9nKdhe2uXqz4zqYceo3Pvfnjq+ffgnMvvE3uMApBP3wthISKhu4blAsjIyTUw7751sGHz7ig9xqMr/gtnX36f2mMUgAwH5NQZDWa7CT95/0+XOiBfPXc+/O6W5bB1ZyfgLhzTX9fe/bBsTTNMvXKR2xrbPkbJ7NkdObY4vk5fv/gVOOGceU6TWKqAjJxUA9X3vjjkMfAHOGL6wzPGY6vegSlXLIIvnqE4Y0g2vUNPEzLB2+bHBgU7Xlx43Bnxq8DXVq8EfB3/0ATpJrAE3wfBH0P4zexlsHn7nug8RnfPAXh67fsw/UcPWK2hdL1tQRDZs2LTxUX1Q+XpxsKW0+6InxHauLUDahe9BPi6vnTiGHBKxYMce1Y1zLnrBXi/pR1i9BiPP/upx/jSGXOM1s1kbStIJElFSu2owqR92NZXjYUvI0AoRI+yrbUL/jD3ae2PS8QOyKipdfCrWU8NbQyxnTHQY6x8cQPM+PFif1Awm98hQEgwtiIke6qvCsk2rVA1Fr6MwOBDfH0fPUrNwnWAr/uLdp1YATnmrGq4+c410LwpTo/x5HPvwrQr7wevHoOFA+O8UDDtImBRO3yeS7tJ6/BjkKV5MPg07qz4C4VX37oc8H0AFpTYABk1pRZ+ceOTQ4fv2DxGz8cHYNW6D2DmTx4E/G4Juw5B4jLBYL6NOFXtUJlNe75sqW9fIXqUD7bsHvqpS3xfABclFkBGnHkbVDWthvc2tnk/Y3z34osh5IWvSi1d/R6c+8P74cvf8njG4D0Gn9YJx0Soujao3KQt3zbUt+8Qd1784g++2tPapv7Uata/zdva3gM/u/4JaG5p9/qqVEggdG0H8RY8HLJHLF5MOtHy9rK0rp0Q5bKx+MjHx7C+vn6t6LIGBGE+eNDf+xg68aZdHhQWG6HwArapi7Z8/TTStmN0sefPK3w6a0D48bim0xa+bX9BQHERhGudNIDg+3Adq009neBiB8RWqHmzTwSOjRCS2vLiTSOddMym9VWQxApI3oSedDxOoKBITUWQxC4pDBUVFUCXTVtJxmxTt9QASSrGvNa3hoTEZiMGF1vqxyUkMNjQtB2XsbrUKSVA8ipuX+NSrRVfNuwLUy7i0NUxFbPMjsDAcopjKLPn83Xj81HOTyybzvsjli/hxdQOuz6q+DBAUFw+BENt8GK1TYuAEOWp2qWxhAxVk5xXQGISdIixqtaMynINiAoEVZkMFhNA2Lom9mRDEyoK8wZICLHF2KZorfi8YICwQnONEwSy+lSOocwmST6J3zTkJ5fSeQIkRiGHHDOtkSxMDEgSAarqmorf1E7Vl6rMFA60k/2VKiAw+itAF4mY0rKQ7PISytaM8nMJiK3oyV4ldNcyG0B6//0OiK7mmVcG+x/p+P/Xm2deIeyXH4tvUcogSJLve4wm7fHzxKZzDYipqAkQDE3r2NjZQPLWmEnAX+uPnxgUEGyf71OUNhGLjU0SEGzr2ozL1lY0V5QnBATFYyoKG6GZ2LqKneqZ9GFrYzoXaIc7eh4vW9Go7G3F7dteNTbXMtma5QoQErmLJ0hSVwdM7IC4ioav51voPtrjx+iazj0gPgRObegE71JuColsorPKdxUM1fMh4jTaoPG6hrL1SexBUDgugmPrkLAxZPPzFI8REFexpCHoEH243i/Wyy0gMcCBoMYGiItYQog27TZd7jsKQNL0FgSlTZ8xAWIrkrRFnEZ/tnNg7UFsdk0bofG2LmLl27BJU38Y2tQrVUBMxMrOGcZN6mRtUzKA2IjUhy0ttm1bsQBiKgwTAdNcyUKTNrKyMZ0HssutB7EValJ7WmzbdgpADn9hjeYwK/Gb9EvCNw0LQBy/S0IgxQCIqRhMBEYQ6EKTtrKyMZ0PtCsAYQAh0duEBSDDPQjCk5X4TfotALnhGuODNrsT2oBBtgUgcQHiAw70KtI3ClEYpqIgEeU1TAqHzVzIXHXofBtBmOy+7Jyp4iZtZWFjMx+qtfEOCE1mXmCh8WCYZEymm4VqskOW2QjCVLDs3Inipu1kYWczH6p1CQaIaEKTitRU4KK+TevK7ApAhj9iZSF8kz59wYHgeAEExcMKSyTQLPPYsbnGyxEQEiO/dpSf19ArILy4WQGZikLVBtseP9Eh02y/PuKmc6Fy1yHLbESBtnkVt49x2cyFbk2O+Ac6vJBMRWEKCN9+TGnTudBNeKhyG1HwtjJRTpw4EUwvWRtZ5PP3J0ubrMURgJAIWOFSni5k65RiXHf/VE5f1WTDNL5yKxOBbb4pEKHsfABlc8/sOoniQkBosVHoFNeFpQgF3ZPu3tny3vVvA38F/9GGC64Y6tNGGDJbXvhox+flIS0DSXZfqnx+vdi0EhB24XVxElMphbp7FpXTz8WwYVo/+6MSgc+yPAAiGgNC43qf7Hqx8QIQwbvxIuGb5rGTS/G0AMH+XAXiq55IuGnlJb0HWi829AaIqYBK3Y6dXIqnCQj2mVQoIeqHhMTneGnNKCwAWbHU+JxlAjdNLBumDQj27VM0IdtKCk6IsbFrVwDiERB2Ytl4FoDEBEkIkSdtk9avAKSEAaFFTiqWcq5fAOIJEBKjKMzKg/BjKWehu957AUhCQEw+LpMXQFhgXAVTbvUqaqtrAS+TA2hhc/hAbwKGyMbk4w22NhsuuYrVvnW83ERvc7+HAClAOSx+1UYgEr1Lni0EKvukgIiIshFRKdtWyBZXJZJyLZPNlWu+SvQ2ZTpABgcH4WBfv4gD47xShkB1b1JAaNHLFQa6b/KsGNKc+AptIFDZ6gBpbe+Bn9/wJDS3tAPC4vtPJbDYy7SAkBhE5xRWPGnFaTylEqqEb1qmA2TLzk6oGDcLjjmzGmbfsXoIlKQexQSy2OHA8RsDgoJUQVAqgk37PkwhUNmZAoKQ4DVqah388qan4IMtu4N4FB08MYFjBUja4imH/lTCNy2zBYRAOeasarhlwVp4v6U98RlFB4Xv8rQgKwCpGP5jBGmCaQqBys4VEAJl9LQ6+HXVUti0rSMTj5IEntCgFIAUgAw9diEsx06qhrl3vwAbNu+OzqP0DwwE+YBm7gEZO3YsiC7ZLt/W1gbsJbPLS77KM5iWJfUg5EkoHD1tPvz25mWwecee6DxK1979sGxNszdYcguICApRHguDKp4XINhxmAKgs/MNCIEyclIN1CxcN3SY7+sbSPIklHpd9Cj/WPl2YlByAwgrbhEIujy2viheWVkJIS9W+Hx8xIgRwF5UrhO+aXkoQAiUk6fPh6tvXQ5bd3ZG6VGSnFMyB0QkZh0MonJRO3xeSECobRYEXdwUAJ1daEAIlJGTa6B20UuwcWsHxOhRXECxAoREkDSkHRTb4UUsEr9pHt8Wn046bpP6OijYcp3wTcvTAoRAOXl6Pfxx7grY0dqV+qNTkg7xUwS2kBgBYiIMFxtewJg2hUFkJ2qPzXMZo0sdFgJd3BQClV3agBAox02ugfn3vxydR7GBpAAkwNlEBwVbrhK+aVlWgBAoY86rh2urV8Kuj/Ym2eBTrWsKySFA2EXDOPsY5LKLmtRhd3eKizyDaR61IQtNxuTDhp9LVdoUApVd1oAQKMefPQ8aFr8CLdv2QF9//l/1MoGkQrV4WOZDMLI2REI2hUFkJ2qP8mRjCJGvm1O+XCV+k7K8AEKgnDqjAa6btwo+bO9J1SvYdlYAwrxpGAIEUZu8+E3SJhCobPIGCIFywjnzoPHBV6Flez49SpSA4I4v8g66PPIUolAk5FB5JkDwNirxm5TlFRAE5ajxs+C0GQ3w57pnoK3jY9tNPri9DhLtIxYuZigxYbsiQetgEJWL2sG8kGNn2+ZFb5M2gUBlk2dAyJtgeNLUOrjroddh845O6M/JGSVKQFDYIghkeTI4bESapa1K/CZlsQBCHmXsd26H6+ufhY7O3uAeQteBF0BIPOyO6TMuErgMBlG+qD6NOYbQBAKVTUyAsB7lxCm1sGDJ67BtV1emHkUFidEjlg+RqYASCRzzRDDI8tg2fIw37TZUAOjKYgUEYflMZRWMv7AJbmp8HvZ079Nt+EHKcwGITnCswCkug0GUT3Uw1PWVx3IdBKrymAFhPcqoKbVDZxT8UGSaZ5QoAEHRsiLHuAgEWR7VzaP4TcakAkBXViqAkEcZN7MRqppWQ3fP/iAeg280WkBsICkA4Zf9cJp+1YTdrWOI46te9zz8RvAzSjSAJPEiBSCHgeBjsQKCEB9dWQWVFzbBzXeugZ7eA/yteUmXDSAmjzJ5ttE9SsnKS+kRS+XZTppWBwv//iZsb+0C/Magr7+oAOG9iOzMweejB8mz+E3GJgNAl18ugJBHmXBRE8y5ay307j/oixHp90T+B7kri9Q1LZ2DAAAAAElFTkSuQmCC" - } - ] - } diff --git a/code/modules/explorer_drone/exodrone.dm b/code/modules/explorer_drone/exodrone.dm index b8838f642ad7c..5c73f5755df02 100644 --- a/code/modules/explorer_drone/exodrone.dm +++ b/code/modules/explorer_drone/exodrone.dm @@ -5,7 +5,7 @@ // Fuel types and travel time per unit of distance on that fuel. #define FUEL_BASIC "basic" -#define BASIC_FUEL_TIME_COST 300 +#define BASIC_FUEL_TIME_COST 250 #define FUEL_ADVANCED "advanced" #define ADVANCED_FUEL_TIME_COST 200 @@ -21,7 +21,7 @@ GLOBAL_LIST_EMPTY(exodrone_launchers) /// Exploration drone /obj/item/exodrone name = "exploration drone" - desc = "long range semi-autonomous exploration drone" + desc = "A long range, semi-autonomous exploration drone." icon = 'icons/obj/exploration.dmi' icon_state = "drone" w_class = WEIGHT_CLASS_BULKY @@ -88,6 +88,15 @@ GLOBAL_LIST_EMPTY(exodrone_launchers) if(EXODRONE_IDLE) return "Idle." +// Searches for blacklisted items hidden inside containers +/obj/item/exodrone/proc/check_blacklist() + for(var/obj/item/contained_item in contents) + if(contained_item.contents) + for(var/subcontained_object in contained_item.get_all_contents()) + if(is_type_in_typecache(subcontained_object, GLOB.blacklisted_cargo_types)) + return FALSE + return TRUE + /// Starts travel for site, does not validate if it's possible /obj/item/exodrone/proc/launch_for(datum/exploration_site/target_site) if(!location) //We're launching from station, fuel up @@ -325,9 +334,9 @@ GLOBAL_LIST_EMPTY(exodrone_launchers) drone_log("Sustained [amount] damage.") /obj/item/exodrone/proc/drone_log(message) - drone_log.Insert(1,message) if(length(drone_log) > EXODRONE_LOG_SIZE) - drone_log.Cut(EXODRONE_LOG_SIZE) + drone_log = list() + drone_log.Insert(1,message) /obj/item/exodrone/proc/has_tool(tool_type) return tools.Find(tool_type) @@ -345,6 +354,11 @@ GLOBAL_LIST_EMPTY(exodrone_launchers) . = ..() GLOB.exodrone_launchers += src +/obj/machinery/exodrone_launcher/examine(user) + . = ..() + if(fuel_canister) + . += span_notice("You can remove the [fuel_canister] with a prying tool.") + /obj/machinery/exodrone_launcher/attackby(obj/item/weapon, mob/living/user, params) if(istype(weapon, /obj/item/fuel_pellet)) if(fuel_canister) @@ -418,8 +432,9 @@ GLOBAL_LIST_EMPTY(exodrone_launchers) playsound(src,'sound/effects/podwoosh.ogg',50, FALSE) do_smoke(1, holder = src, location = get_turf(src)) -/obj/machinery/exodrone_launcher/handle_atom_del(atom/A) - if(A == fuel_canister) +/obj/machinery/exodrone_launcher/Exited(atom/movable/gone, direction) + . = ..() + if(gone == fuel_canister) fuel_canister = null update_icon() diff --git a/code/modules/explorer_drone/exploration_events/danger.dm b/code/modules/explorer_drone/exploration_events/danger.dm index 0c0c28bd1c555..605974fa82891 100644 --- a/code/modules/explorer_drone/exploration_events/danger.dm +++ b/code/modules/explorer_drone/exploration_events/danger.dm @@ -35,12 +35,12 @@ name = "space carp attack" required_site_traits = list(EXPLORATION_SITE_SPACE) blacklisted_site_traits = list(EXPLORATION_SITE_CIVILIZED) - deep_scan_description = "You detect damage patterns to the site hinting at a presence of space carp." + deep_scan_description = "You detect damage patterns to the site indicating the presence of space carp." description = "You are ambushed by a solitary space carp!" has_tool_action_text = "Fight" no_tool_action_text = "Escape!" has_tool_description = "You charge your laser to fend it off." - no_tool_description = "Unfortunately you have no weaponry so the only option is flight." + no_tool_description = "Without any weaponry, you can only attempt a hasty escape!" avoid_log = "Defeated a space carp." /// They get everywhere @@ -55,15 +55,15 @@ has_tool_action_text = "Fight" no_tool_action_text = "Escape!" has_tool_description = "You charge your laser to fend it off." - no_tool_description = "Unfortunately you have no weaponry so the only option is flight." + no_tool_description = "Without any weaponry, you can only attempt a hasty escape!" avoid_log = "Defeated an assistant." /datum/exploration_event/simple/danger/collapse name = "collapse" required_site_traits = list(EXPLORATION_SITE_RUINS) required_tool = EXODRONE_TOOL_DRILL - deep_scan_description = "The architecture of the site is unstable, caution advised." - description = "A damaged ceiling gives up as you search an unexplored passage! You're trapped by the debris." + deep_scan_description = "The scan indicates that the site's structure is decrepit; caution is advised." + description = "A damaged ceiling gives out as you search an unexplored passage! You're trapped by the debris." has_tool_action_text = "Dig out" no_tool_action_text = "Squeeze." has_tool_description = "You can use your drill to get out." @@ -74,7 +74,7 @@ name = "loose wires" required_site_traits = list(EXPLORATION_SITE_TECHNOLOGY) required_tool = EXODRONE_TOOL_MULTITOOL - deep_scan_description = "Damaged wiring detected on site." + deep_scan_description = "Scans indicate a huge quantity of damaged wiring detected on site." description = "You hear a loud snap behind you! A stack of sparking high-voltage wires is blocking you way out." has_tool_action_text = "Disable power" no_tool_action_text = "Get fried." @@ -87,24 +87,24 @@ required_site_traits = list(EXPLORATION_SITE_SURFACE) required_tool = EXODRONE_TOOL_MULTITOOL deep_scan_description = "Site is exposed to space radiation. Using self-diagnostic multiool attachment advised." - description = "Drone feed suddenly goes haywire! It seems that the drone got hit by extremely rare cosmic ray burst! You'll have to wait for signal to be restored." - has_tool_description = "Multitool extension self-diagnostic attachement should deal with most of the damage automatically." - no_tool_description = "Nothing more to be done than wait and asses the damage." + description = "The drone feed suddenly goes haywire! It seems that the drone got hit by a burst of cosmic rays! You'll have to wait for the signal to be restored." + has_tool_description = "Your multitool should allow a significant amount of the damage to be repaired on its own." //wait, what? + no_tool_description = "Nothing more to be done than to wait and assess the damage." has_tool_action_text = "Wait" no_tool_action_text = "Wait" - avoid_log = "Prevented cosmic ray damage with multitool" + avoid_log = "Prevented cosmic ray damage with multitool." /datum/exploration_event/simple/danger/alien_sentry name = "alien security measure" required_site_traits = list(EXPLORATION_SITE_ALIEN) required_tool = EXODRONE_TOOL_TRANSLATOR deep_scan_description = "Automated security measures of unknown origin detected on site." - description = "A dangerous looking machine slides out the floor and start flashing strange glyphs while emitting high-pitched sound." - has_tool_description = "Your translator recognizes the glyphs as security hail and suggests identyfing yourself as guest." + description = "A dangerous looking machine slides out the floor and start flashing strange glyphs while emitting a high-pitched sound!" + has_tool_description = "Your translator recognizes the glyphs as security hail and suggests identyfing yourself as a guest." no_tool_description = "The machine start shooting soon after." has_tool_action_text = "Identify yourself" no_tool_action_text = "Escape" - avoid_log = "Avoided alien security" + avoid_log = "Avoided alien security." /datum/exploration_event/simple/danger/beast name = "alien encounter" @@ -112,12 +112,12 @@ blacklisted_site_traits = list(EXPLORATION_SITE_CIVILIZED) required_tool = EXODRONE_TOOL_LASER deep_scan_description = "Dangerous fauna detected on site." - description = "You encounter BEAST. It prepares to strike." + description = "You encounter an unusual beast! It prepares to strike." has_tool_action_text = "Fight" no_tool_action_text = "Escape" has_tool_description = "You ready your laser." - no_tool_description = "Time to run." - avoid_log = "Defeated BEAST" + no_tool_description = "Without any weaponry, you can only attempt a hasty escape!" + avoid_log = "Defeated a beast." /datum/exploration_event/simple/danger/beast/New() . = ..() @@ -129,10 +129,10 @@ name = "irradiated section" required_site_traits = list(EXPLORATION_SITE_SHIP) required_tool = EXODRONE_TOOL_MULTITOOL - deep_scan_description = "Sections of the vessel are irradiated." + deep_scan_description = "Scans indicate dangerous radioactive presence." description = "You enter a nondescript ship section." has_tool_action_text = "Detour" no_tool_action_text = "Escape and mitigate damage." - has_tool_description = "Your multitool suddenly screams in warning! Section ahead is irradiated, you'll have to go around" - no_tool_description = "Suddenly the drone reports significant damage, it seems this section was heavily irradiated." - avoid_log = "Avoided irradiated section" + has_tool_description = "Your multitool suddenly flashes in warning! The section ahead is irradiated, you'll have to go around to avoid damage." + no_tool_description = "Suddenly the drone reports significant damage, it seems that this section was heavily irradiated." + avoid_log = "Avoided irradiated section." diff --git a/code/modules/explorer_drone/exploration_events/resource.dm b/code/modules/explorer_drone/exploration_events/resource.dm index aa334f5685e18..fdfc6b420f70f 100644 --- a/code/modules/explorer_drone/exploration_events/resource.dm +++ b/code/modules/explorer_drone/exploration_events/resource.dm @@ -1,8 +1,8 @@ /// 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" + name = "retrievable resource" root_abstract_type = /datum/exploration_event/simple/resource - discovery_log = "Encountered recoverable resource" + discovery_log = "Encountered recoverable resource." action_text = "Extract" /// Tool type required to recover this resource var/required_tool @@ -11,9 +11,9 @@ /// Message logged on success var/success_log = "Retrieved something" /// Description shown when you don't have the tool - var/no_tool_description = "You can't retrieve it without a tool" + var/no_tool_description = "You can't retrieve it without a drill." /// Description shown when you have the necessary tool - var/has_tool_description = "You can get it out with that tool." + var/has_tool_description = "You can get it out with your drill!" var/delay = 30 SECONDS var/delay_message = "Recovering resource..." /// How many times can this be extracted @@ -71,13 +71,13 @@ // All /datum/exploration_event/simple/resource/concealed_cache - name = "Concealed Cache" + name = "concealed cache" band_values = list(EXOSCANNER_BAND_DENSITY=1) required_tool = EXODRONE_TOOL_WELDER - discovery_log = "Discovered concealed and locked cache." + discovery_log = "Discovered a concealed, locked cache." description = "You spot a cleverly hidden metal container." no_tool_description = "You see no way to open it without a welder." - has_tool_description = "You can try to open it with your welder" + has_tool_description = "You can try and open it with your welder." action_text = "Weld open" delay_message = "Welding open the cache..." loot_type = /datum/adventure_loot_generator/maintenance @@ -87,10 +87,10 @@ name = "dessicated corpse" required_site_traits = list(EXPLORATION_SITE_RUINS) required_tool = EXODRONE_TOOL_MULTITOOL - discovery_log = "You discovered a corpse of a humanoid." - description = "You find a dessicated corpose of a humanoid, it's too damaged to identify. A locked briefcase is lying nearby." - no_tool_description = "You can't open it without a multiool" - has_tool_description = "You can try to hack it open" + discovery_log = "Discovered a corpse of a humanoid." + description = "You find a dessicated corpose of a humanoid, though it's too damaged to identify. A locked briefcase is lying nearby." + no_tool_description = "You can't open it without a multiool." + has_tool_description = "You can try to hack it open with your multitool!" action_text = "Hack open" delay_message = "Hacking..." loot_type = /datum/adventure_loot_generator/simple/cash @@ -99,9 +99,10 @@ name = "gunfight leftovers" required_site_traits = list(EXPLORATION_SITE_RUINS) required_tool = EXODRONE_TOOL_DRILL - discovery_log = "You discovered a site of some past gunfight." - description = "You find a site full of gun casing and scorched with laser marks. You notice something under rubble nearby." - no_tool_description = "You can't get to it without a drill" + discovery_log = "Discovered a site of a past gunfight." + description = "You find a site full of gun casings and scorched with laser marks. You notice something under some nearby rubble." + no_tool_description = "You can't get to it without a drill." + has_tool_description = "You can remove the rubble with your drill!" action_text = "Remove rubble" delay_message = "Drilling..." loot_type = /datum/adventure_loot_generator/simple/weapons @@ -111,10 +112,11 @@ name = "locked maintenance room" required_site_traits = list(EXPLORATION_SITE_TECHNOLOGY,EXPLORATION_SITE_STATION) required_tool = EXODRONE_TOOL_MULTITOOL - discovery_log = "You discovered a locked maintenance room." - success_log = "Retrieved contents of maintenance room." - description = "You discover a locked maintenance room. You can see marks of something being moved often from it nearby." - no_tool_description = "You can't open it without a multitool" + discovery_log = "Discovered a locked maintenance room." + success_log = "Retrieved the contents of a locked maintenance room." + description = "You discover a locked maintenance room. You can see marks from frequent movement nearby." + no_tool_description = "You can't open it without a multitool." + has_tool_description = "You can try to open it with your multitool!" action_text = "Hack" delay_message = "Hacking..." loot_type = /datum/adventure_loot_generator/maintenance @@ -124,10 +126,11 @@ name = "storage room" required_site_traits = list(EXPLORATION_SITE_TECHNOLOGY,EXPLORATION_SITE_STATION) required_tool = EXODRONE_TOOL_TRANSLATOR - discovery_log = "You discovered a storage room full of crates." - success_log = "Used translated manifest to find a crate with double bottom." - description = "You find a storage room full of empty crates. There's a manifest in some obscure language pinned near the entrance." - no_tool_description = "You can only see empty crates, and can't understand the manifest without a translator." + discovery_log = "Discovered a storage room full of crates." + success_log = "Used a translated manifest to find a crate of medication." + description = "You find a storage room full of unidentified crates. There's a manifest in an obscure language pinned near the entrance." + no_tool_description = "All the crates around are devoid of useful contents, and the manifest is unreadable without a translator." + has_tool_description = "You can translate the manifest with your translator!" action_text = "Translate" delay_message = "Translating manifest..." loot_type = /datum/adventure_loot_generator/simple/drugs @@ -138,10 +141,10 @@ required_site_traits = list(EXPLORATION_SITE_ALIEN) band_values = list(EXOSCANNER_BAND_TECH=1,EXOSCANNER_BAND_RADIATION=1) required_tool = EXODRONE_TOOL_TRANSLATOR - discovery_log = "Discovered a alien sarcophagus covered in unknown glyphs" - success_log = "Retrieved contents of alien sarcophagus" - description = "You find an giant sarcophagus of alien origin covered in unknown script." - no_tool_description = "You see no way to open the sarcophagus or translate the glyphs without a tool." + discovery_log = "Discovered an alien sarcophagus covered in unknown glyphs." + success_log = "Retrieved contents of an alien sarcophagus." + description = "You find a giant sarcophagus of alien origin, covered in unknown script." + no_tool_description = "You see no way to open the sarcophagus nor translate the glyphs without a multitool." has_tool_description = "You translate the glyphs and find a description of a hidden mechanism for unlocking the tomb." delay_message = "Opening..." action_text = "Open" @@ -153,10 +156,10 @@ band_values = list(EXOSCANNER_BAND_LIFE=1) required_tool = EXODRONE_TOOL_LASER discovery_log = "Discovered an alien pod." - success_log = "Retrieved contents of the alien pod" - description = "You encounter an alien biomachinery full of sacks containing some lifeform." - no_tool_description = "You can't open them without precise laser." - has_tool_description = "You can try to cut one open with a laser." + success_log = "Retrieved contents of the alien pod." + description = "You encounter an alien biopod full of strange sacks containing abducted lifeforms." + no_tool_description = "You can't breach the biopod without a precise laser." + has_tool_description = "You can try to cut one open with your laser!" delay_message = "Opening..." action_text = "Open" loot_type = /datum/adventure_loot_generator/pet @@ -168,9 +171,10 @@ band_values = list(EXOSCANNER_BAND_PLASMA=1) required_tool = EXODRONE_TOOL_MULTITOOL discovery_log = "Discovered ship fuel storage." - description = "You find the ship fuel storage. Unfortunately it's locked with electronic lock." + description = "You find the ship's fuel storage. Unfortunately, it has an electronic lock." success_log = "Retrieved fuel from storage." - no_tool_description = "You'll need multitool to open it." + no_tool_description = "You can't breach the lock without a multitool." + has_tool_description = "You can try and short circuit the lock with your multitool!" delay_message = "Opening..." action_text = "Open" loot_type = /obj/item/fuel_pellet/exotic @@ -180,9 +184,10 @@ required_site_traits = list(EXPLORATION_SITE_SHIP) required_tool = EXODRONE_TOOL_TRANSLATOR discovery_log = "Discovered ship navigation systems." - description = "You find the ship navigation systems. With proper tools you can retrieve any data stored here." + description = "You find the ship's navigation systems encoded in a strange language. You'll be able to use the data with a translator." success_log = "Retrieved shipping data from navigation systems." no_tool_description = "You'll need a translator to decipher the data." + has_tool_description = "You can try and translate the navigation data with your multitool!" delay_message = "Retrieving data..." action_text = "Retrieve data" loot_type = /datum/adventure_loot_generator/cargo @@ -195,7 +200,8 @@ 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." + no_tool_description = "With a precise laser, you could slice off a sample for study." + has_tool_description = "You can carefully cut a sample from the colony with your laser!" delay_message = "Taking samples..." action_text = "Take sample" loot_type = /obj/item/petri_dish/random @@ -206,9 +212,9 @@ band_values = list(EXOSCANNER_BAND_LIFE=1) required_tool = EXODRONE_TOOL_TRANSLATOR discovery_log = "Met a creepy stranger." - description = "You meet an inhabitant of this site. Smelling horribly and clearly agitated about something." - no_tool_description = "You have no idea what it wants from you without a translator." - has_tool_description = "Your best translation is that it wants to share its hobby with you. " + description = "You meet an inhabitant of this site, looking ragged and clearly agitated about something." + no_tool_description = "You can't tell what it's trying to convey without a translator." + has_tool_description = "Your best translation dictates that it would like to share its hobby with you!" success_log = "Recieved a gift from a stranger." delay_message = "Enduring..." action_text = "Accept gift." @@ -219,10 +225,11 @@ name = "derelict comms satellite" required_site_traits = list(EXPLORATION_SITE_SPACE) required_tool = EXODRONE_TOOL_MULTITOOL - discovery_log = "You discovered a derelict communication satellite." - description = "You discover a derelict communication satellite. Its encryption module seem intact and can be retrieved." - no_tool_description = "You'll need a multiool to crack open the lock." - success_log = "Retrieved encryption keys from derelict satellite" + discovery_log = "Discovered a derelict communication satellite." + description = "You discover a derelict communication satellite. Its encryption key is intact, but has a complicated electronic lock." + no_tool_description = "You'll need a multiool to retrieve the encryption key." + has_tool_description = "You can disable the lock to retrieve the key with your multitool!" + success_log = "Retrieved an encryption key from a derelict satellite." delay_message = "Hacking..." action_text = "Hack lock" loot_type = /obj/item/encryptionkey/heads/captain @@ -231,9 +238,10 @@ name = "welded locker" required_site_traits = list(EXPLORATION_SITE_SPACE) required_tool = EXODRONE_TOOL_WELDER - discovery_log = "You discovered a welded shut locker." - description = "You discover a welded shut locker floating through space. What could be inside ?" - success_log = "Retrieved bones of unfortunate spaceman from a welded locker." + discovery_log = "Discovered a hastily welded locker." + description = "You discover a welded locker floating through space. What could be inside...?" + no_tool_description = "You'll need a welding tool to take the contents of the locker." + success_log = "Retrieved... a severed head." delay_message = "Welding open..." action_text = "Weld open" loot_type = /obj/item/bodypart/head @@ -242,8 +250,8 @@ 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" - var/obj/item/bodypart/head/skeleton_head = new - skeleton_head.update_limb(FALSE,head_species_source) + var/obj/item/bodypart/head/skeleton_head = head_species_source.get_bodypart(BODY_ZONE_HEAD) + skeleton_head.drop_limb(FALSE) qdel(head_species_source) drone.try_transfer(skeleton_head) @@ -253,11 +261,11 @@ required_site_traits = list(EXPLORATION_SITE_SURFACE) band_values = list(EXOSCANNER_BAND_PLASMA=3) required_tool = EXODRONE_TOOL_DRILL - discovery_log = "Discovered a sizeable plasma deposit" - success_log = "Extracted plasma." + discovery_log = "Discovered a sizeable plasma deposit." + success_log = "Extracted the plasma from the deposit." description = "You locate a rich surface deposit of plasma." - no_tool_description = "You'll need to come back with a drill to mine it." - has_tool_description = "" + no_tool_description = "You'll need a drill to take anything from the deposit." + has_tool_description = "Your drill will allow you to extract the deposit!" action_text = "Mine" delay_message = "Mining..." loot_type = /obj/item/stack/sheet/mineral/plasma/thirty @@ -267,11 +275,11 @@ required_site_traits = list(EXPLORATION_SITE_SURFACE) band_values = list(EXOSCANNER_BAND_DENSITY=3) required_tool = EXODRONE_TOOL_DRILL - discovery_log = "Discovered a sizeable MATRIAL deposit" - success_log = "Extracted MATERIAL." + discovery_log = "Discovered a sizeable MATRIAL deposit." + success_log = "Extracted the MATERIAL from the deposit." description = "You locate a rich surface deposit of MATERIAL." - no_tool_description = "You'll need to come back with a drill to mine it." - has_tool_description = "" + no_tool_description = "You'll need a drill to take anything from the deposit." + has_tool_description = "Your drill will allow you to extract the deposit!" action_text = "Mine" delay_message = "Mining..." var/static/list/possible_materials = list(/datum/material/silver,/datum/material/bananium,/datum/material/pizza) //only add materials with sheet type here diff --git a/code/modules/explorer_drone/exploration_events/trader.dm b/code/modules/explorer_drone/exploration_events/trader.dm index 8a0171c344cf2..626411cb93587 100644 --- a/code/modules/explorer_drone/exploration_events/trader.dm +++ b/code/modules/explorer_drone/exploration_events/trader.dm @@ -49,7 +49,7 @@ /datum/exploration_event/simple/trader/proc/trade(obj/item/exodrone/drone) var/obj/trade_good = locate(required_path) in drone.contents var/obj/loot = new traded_path() - drone.drone_log("Traded [trade_good] for [loot]") + drone.drone_log("Traded [trade_good] for [loot].") qdel(trade_good) drone.try_transfer(loot) @@ -67,7 +67,7 @@ /datum/exploration_event/simple/trader/farmer_market name = "farmer's market" - deep_scan_description = "You detect a spot with unusal concentraction of edibles on the site." + deep_scan_description = "You detect an area with an unusually high concentration of edibles on site." required_site_traits = list(EXPLORATION_SITE_HABITABLE,EXPLORATION_SITE_SURFACE) band_values = list(EXOSCANNER_BAND_LIFE=2) required_path = /obj/item/stock_parts/servo/nano @@ -77,7 +77,7 @@ /datum/exploration_event/simple/trader/fish name = "interstellar fish trader" requires_translator = FALSE - deep_scan_description = "You spot gian \"FRESH FISH\" sign on the site." + deep_scan_description = "You spot a giant \"FRESH FISH\" sign on site." required_site_traits = list(EXPLORATION_SITE_HABITABLE,EXPLORATION_SITE_SURFACE) band_values = list(EXOSCANNER_BAND_LIFE=2) required_path = /obj/item/stock_parts/cell/high @@ -95,7 +95,7 @@ /datum/exploration_event/simple/trader/surplus name = "military surplus trader" - deep_scan_description = "You decrypt a transmission advertising military surplus sale on the site." + deep_scan_description = "You decrypt a transmission advertising military surplus for sale on site." required_site_traits = list(EXPLORATION_SITE_HABITABLE,EXPLORATION_SITE_CIVILIZED) band_values = list(EXOSCANNER_BAND_LIFE=1) required_path = list(/obj/item/clothing/suit/armor,/obj/item/clothing/shoes/jackboots) @@ -104,7 +104,7 @@ /datum/exploration_event/simple/trader/flame_card name = "id card artisan" - deep_scan_description = "You spy a adveristment for an id card customization workshop." + deep_scan_description = "You spy an advertisment for an ID card customisation workshop." required_site_traits = list(EXPLORATION_SITE_HABITABLE,EXPLORATION_SITE_CIVILIZED) band_values = list(EXOSCANNER_BAND_TECH=1) required_path = list(/obj/item/card/id) //If you trade a better card for worse that's on you @@ -114,10 +114,10 @@ var/static/list/possible_card_states = list("card_flames","card_carp","card_rainbow") /datum/exploration_event/simple/trader/flame_card/get_discovery_message(obj/item/exodrone/drone) - return "Encountered [name] willing to customize any id card you bring them." + return "Encountered [name] willing to customise any ID card you bring them." /datum/exploration_event/simple/trader/flame_card/get_description(obj/item/exodrone/drone) - return "You encounter local craftsman willing to improve an id card for you free of charge." + return "You encounter a local craftsman willing to customise an ID card for you, free of charge." /datum/exploration_event/simple/trader/flame_card/trade(obj/item/exodrone/drone) var/obj/item/card/id/card = locate(required_path) in drone.contents diff --git a/code/modules/explorer_drone/exploration_site.dm b/code/modules/explorer_drone/exploration_site.dm index 903a30ade5374..9a21203d5962e 100644 --- a/code/modules/explorer_drone/exploration_site.dm +++ b/code/modules/explorer_drone/exploration_site.dm @@ -190,13 +190,13 @@ GLOBAL_LIST_EMPTY(exploration_sites) /datum/exploration_site/abandoned_refueling_station name = "abandoned refueling station" - description = "old shuttle refueling station drifting through the void." + description = "An old shuttle refueling station drifting through the void." band_info = list(EXOSCANNER_BAND_TECH = 1) site_traits = list(EXPLORATION_SITE_RUINS,EXPLORATION_SITE_TECHNOLOGY,EXPLORATION_SITE_STATION) /datum/exploration_site/trader_post name = "unregistered trading station" - description = "Weak radio transmission advertises this place as RANDOMIZED_NAME" + description = "A weak radio transmission advertises this place as RANDOMIZED_NAME" band_info = list(EXOSCANNER_BAND_TECH = 1, EXOSCANNER_BAND_LIFE = 1) site_traits = list(EXPLORATION_SITE_TECHNOLOGY,EXPLORATION_SITE_STATION,EXPLORATION_SITE_HABITABLE,EXPLORATION_SITE_CIVILIZED) fluff_type = "fluff_trading" @@ -209,19 +209,19 @@ GLOBAL_LIST_EMPTY(exploration_sites) /datum/exploration_site/cargo_wreck name = "interstellar cargo ship wreckage" - description = "wreckage of long-range cargo shuttle" + description = "Wreckage of a long-range cargo shuttle." band_info = list(EXOSCANNER_BAND_TECH = 1, EXOSCANNER_BAND_DENSITY = 1) site_traits = list(EXPLORATION_SITE_SHIP,EXPLORATION_SITE_TECHNOLOGY) /datum/exploration_site/alien_spaceship name = "ancient alien spaceship" - description = "a gigantic spaceship of unknown origin, it doesnt respond to your hails but does not prevent you boarding either" + description = "A gigantic spaceship of unknown origin. It doesn't respond to your hails but does not prevent you boarding, either." band_info = list(EXOSCANNER_BAND_TECH = 1, EXOSCANNER_BAND_RADIATION = 1) site_traits = list(EXPLORATION_SITE_SHIP,EXPLORATION_SITE_HABITABLE,EXPLORATION_SITE_ALIEN) /datum/exploration_site/uncharted_planet name = "uncharted planet" - description = "planet missing from nanotrasen starcharts." + description = "A planet missing from Nanotrasen starcharts." band_info = list(EXOSCANNER_BAND_LIFE = 3) site_traits = list(EXPLORATION_SITE_SURFACE) @@ -240,26 +240,26 @@ GLOBAL_LIST_EMPTY(exploration_sites) /datum/exploration_site/alien_ruins name = "alien ruins" - description = "alien ruins on small moon surface." + description = "Alien ruins on a small moon's surface." site_traits = list(EXPLORATION_SITE_HABITABLE,EXPLORATION_SITE_SURFACE,EXPLORATION_SITE_ALIEN,EXPLORATION_SITE_RUINS) fluff_type = "fluff_ruins" /datum/exploration_site/asteroid_belt name = "asteroid belt" - description = "dense asteroid belt" + description = "A dense asteroid belt." site_traits = list(EXPLORATION_SITE_SURFACE) fluff_type = "fluff_space" /datum/exploration_site/spacemine name = "mining facility" - description = "abandoned mining facility attached to ore-heavy asteroid" + description = "An abandoned mining facility attached to an ore-rich asteroid." band_info = list(EXOSCANNER_BAND_PLASMA = 3) site_traits = list(EXPLORATION_SITE_RUINS,EXPLORATION_SITE_HABITABLE,EXPLORATION_SITE_SURFACE) fluff_type = "fluff_ruins" /datum/exploration_site/junkyard name = "space junk field" - description = "a giant cluster of space junk." + description = "A giant cluster of space junk." band_info = list(EXOSCANNER_BAND_DENSITY = 3) site_traits = list(EXPLORATION_SITE_TECHNOLOGY,EXPLORATION_SITE_SPACE) fluff_type = "fluff_space" diff --git a/code/modules/explorer_drone/loot.dm b/code/modules/explorer_drone/loot.dm index ccb7d433d9adc..121880af7ce48 100644 --- a/code/modules/explorer_drone/loot.dm +++ b/code/modules/explorer_drone/loot.dm @@ -95,7 +95,12 @@ GLOBAL_LIST_INIT(adventure_loot_generator_index,generate_generator_index()) /datum/adventure_loot_generator/pet id = "pets" var/carrier_type = /obj/item/pet_carrier/biopod - var/list/possible_pets = list(/mob/living/simple_animal/pet/cat/space,/mob/living/basic/pet/dog/corgi,/mob/living/simple_animal/pet/penguin/baby,/mob/living/basic/pet/dog/pug) + var/list/possible_pets = list( + /mob/living/basic/pet/dog/corgi, + /mob/living/basic/pet/dog/pug, + /mob/living/basic/pet/penguin/baby, + /mob/living/simple_animal/pet/cat/space, + ) /datum/adventure_loot_generator/pet/generate() var/obj/item/pet_carrier/carrier = new carrier_type() @@ -106,7 +111,7 @@ GLOBAL_LIST_INIT(adventure_loot_generator_index,generate_generator_index()) /obj/item/antique name = "antique" - desc = "Valuable and completly incomprehensible." + desc = "Valuable and completely incomprehensible." icon = 'icons/obj/exploration.dmi' icon_state = "antique" diff --git a/code/modules/explorer_drone/manager.dm b/code/modules/explorer_drone/manager.dm index 74a972216a41c..9ca85ca4a20a5 100644 --- a/code/modules/explorer_drone/manager.dm +++ b/code/modules/explorer_drone/manager.dm @@ -24,27 +24,7 @@ if(.) return feedback_message = "" - var/mob/user = usr switch(action) - if("create") - var/datum/adventure_db_entry/new_entry = new - new_entry.name = "New Adventure" - new_entry.uploader = user.ckey - GLOB.explorer_drone_adventure_db_entries += new_entry - return TRUE - if("delete") - var/datum/adventure_db_entry/target = locate(params["ref"]) in GLOB.explorer_drone_adventure_db_entries - if(!target) - return - if(!target.remove()) - feedback_message = "Failed to remove adventure" - return TRUE - if("approve") - var/datum/adventure_db_entry/target = locate(params["ref"]) in GLOB.explorer_drone_adventure_db_entries - if(!target) - return - target.approved = !target.approved - return TRUE if("play") var/datum/adventure_db_entry/target = locate(params["ref"]) in GLOB.explorer_drone_adventure_db_entries if(!target) @@ -67,43 +47,6 @@ QDEL_NULL(temp_adventure) feedback_message = "Adventure stopped" return TRUE - if("refresh") - var/datum/adventure_db_entry/target = locate(params["ref"]) in GLOB.explorer_drone_adventure_db_entries - if(!target) - return - target.refresh() - return TRUE - if("save") - var/datum/adventure_db_entry/target = locate(params["ref"]) in GLOB.explorer_drone_adventure_db_entries - if(!target) - return - target.save() - return TRUE - if("download") - var/datum/adventure_db_entry/target = locate(params["ref"]) in GLOB.explorer_drone_adventure_db_entries - if(!target) - return - var/temp_file = file("data/AdventureDownloadTempFile") - fdel(temp_file) - WRITE_FILE(temp_file, target.raw_json) - user << ftp(temp_file,"[target.name].json") - return TRUE - if("upload") - var/datum/adventure_db_entry/target = locate(params["ref"]) in GLOB.explorer_drone_adventure_db_entries - if(!target) - return - var/source_json = input(user,"Select adventure JSON file.","Adventure Upload") as file|null - if(!source_json) - return - var/raw_json = file2text(source_json) - var/json = json_decode(raw_json) - if(!json) - feedback_message = "Decoding JSON failed." - return - //do basic validation here - target.raw_json = raw_json - target.extract_metadata() - return TRUE /datum/adventure_browser/ui_data(mob/user) . = ..() @@ -111,11 +54,10 @@ for(var/datum/adventure_db_entry/db_entry in GLOB.explorer_drone_adventure_db_entries) adventure_data += list(list( "ref" = ref(db_entry), - "id" = db_entry.id, + "filename" = db_entry.filename, "name" = db_entry.name, "version" = db_entry.version, "uploader" = db_entry.uploader, - "timestamp" = db_entry.timestamp, "approved" = db_entry.approved, "json_status" = db_entry.raw_json ? "Valid JSON" : "Empty" )) diff --git a/code/modules/explorer_drone/scanner_array.dm b/code/modules/explorer_drone/scanner_array.dm index b47ebebad64e9..7f019b0d43cab 100644 --- a/code/modules/explorer_drone/scanner_array.dm +++ b/code/modules/explorer_drone/scanner_array.dm @@ -14,9 +14,9 @@ GLOBAL_LIST_INIT(scan_conditions,init_scan_conditions()) #define MAX_SCAN_DISTANCE 10 -#define WIDE_SCAN_COST(BAND, SCAN_POWER) (((BAND*BAND)/(SCAN_POWER))*2*60*10) -#define BASE_POINT_SCAN_TIME (5 MINUTES) -#define BASE_DEEP_SCAN_TIME (5 MINUTES) +#define WIDE_SCAN_COST(BAND, SCAN_POWER) (min(((BAND*BAND)/(SCAN_POWER))*2*60*10, 10 MINUTES)) +#define BASE_POINT_SCAN_TIME (2 MINUTES) +#define BASE_DEEP_SCAN_TIME (3 MINUTES) /// Represents scan in progress, only one globally for now, todo later split per z or allow partial dish swarm usage /datum/exoscan @@ -35,7 +35,7 @@ GLOBAL_LIST_INIT(scan_conditions,init_scan_conditions()) var/scan_time = 0 switch(scan_type) if(EXOSCAN_WIDE) - scan_power = length(GLOB.exoscanner_controller.tracked_dishes) + scan_power = GLOB.exoscanner_controller.calculate_scan_power() scan_time = WIDE_SCAN_COST(GLOB.exoscanner_controller.wide_scan_band,scan_power) if(EXOSCAN_POINT) scan_power = GLOB.exoscanner_controller.get_scan_power(target) @@ -76,7 +76,9 @@ GLOBAL_LIST_INIT(scan_conditions,init_scan_conditions()) deltimer(scan_timer) /obj/machinery/computer/exoscanner_control - name = "Scanner Array Control Console" + name = "scanner array control console" + desc = "Controls scanner arrays to initiate scans for exodrones." + circuit = /obj/item/circuitboard/computer/exoscanner_console /// If scan was interrupted show a popup until dismissed. var/failed_popup = FALSE /// Site we're configuring targeted scans for. @@ -104,7 +106,7 @@ GLOBAL_LIST_INIT(scan_conditions,init_scan_conditions()) condition_descriptions += condition.description .["scan_conditions"] = condition_descriptions else - .["scan_power"] = scan_power = length(GLOB.exoscanner_controller.tracked_dishes) + .["scan_power"] = scan_power = GLOB.exoscanner_controller.calculate_scan_power() .["wide_scan_eta"] = scan_power > 0 ? WIDE_SCAN_COST(GLOB.exoscanner_controller.wide_scan_band,scan_power) : 0 .["possible_sites"] = build_exploration_site_ui_data() .["scan_conditions"] = null @@ -194,12 +196,36 @@ GLOBAL_LIST_INIT(scan_conditions,init_scan_conditions()) name = "Scanner array" icon = 'icons/obj/exploration.dmi' icon_state = "scanner_off" - desc = "Sophisticated scanning array. Easily influenced by enviroment." + desc = "A sophisticated scanning array. Easily influenced by its environment." + circuit = /obj/item/circuitboard/machine/exoscanner + ///the scan power of this array to supply to scanner_controller + var/scan_power = 1 /obj/machinery/exoscanner/Initialize(mapload) . = ..() RegisterSignals(GLOB.exoscanner_controller,list(COMSIG_EXOSCAN_STARTED,COMSIG_EXOSCAN_FINISHED), PROC_REF(scan_change)) update_readiness() + RefreshParts() + +/obj/machinery/exoscanner/RefreshParts() + . = ..() + var/power = 1 + + for(var/datum/stock_part/scanning_module/scanning_module in component_parts) + power += (scanning_module.tier - 1) / 12 + scan_power = power + GLOB.exoscanner_controller.update_scan_power() + +/obj/machinery/exoscanner/screwdriver_act(mob/user, obj/item/tool) + . = ..() + if(!.) + . = default_deconstruction_screwdriver(user, "scanner_open", "scanner_off", tool) + update_readiness() + +/obj/machinery/exoscanner/crowbar_act(mob/user, obj/item/tool) + ..() + if(default_deconstruction_crowbar(tool)) + return TRUE /obj/machinery/exoscanner/proc/scan_change() SIGNAL_HANDLER @@ -214,7 +240,7 @@ GLOBAL_LIST_INIT(scan_conditions,init_scan_conditions()) GLOB.exoscanner_controller.deactivate_scanner(src) /obj/machinery/exoscanner/proc/is_ready() - return anchored && is_operational + return anchored && is_operational && !panel_open /obj/machinery/exoscanner/proc/update_readiness() if(is_ready()) @@ -301,7 +327,7 @@ GLOBAL_LIST_INIT(scan_conditions,init_scan_conditions()) /datum/scanner_controller/proc/calculate_scan_power(conditions) . = 0 for(var/obj/machinery/exoscanner/dish in tracked_dishes) - var/effective_power = 1 + var/effective_power = dish.scan_power for(var/datum/scan_condition/condition in conditions) effective_power *= condition.check_dish(dish) if(!effective_power) //Don't bother continuing if it's zero @@ -319,7 +345,7 @@ GLOBAL_LIST_INIT(scan_conditions,init_scan_conditions()) /datum/scan_condition/nebula name = "Nebula" - description = "Site is within a unusually dense nebula, to reduce scanner noise position dishes at least 15 tiles apart" + description = "Site is within an unusually dense nebula. To reduce scanner noise, position dishes at least 15 tiles apart." var/distance = 15 /datum/scan_condition/nebula/check_dish(obj/machinery/exoscanner/dish) @@ -330,7 +356,7 @@ GLOBAL_LIST_INIT(scan_conditions,init_scan_conditions()) /datum/scan_condition/pulsar name = "Pulsar" - description = "Pulsar near the site requires dishes to be shielded from electomagnetic noise, ensure no other machines are working near the dish." + description = "A pulsar near the site requires dishes to be shielded from electomagnetic noise. Ensure no other machines are working near the dish." var/distance = 2 /datum/scan_condition/pulsar/check_dish(obj/machinery/exoscanner/dish) @@ -341,7 +367,7 @@ GLOBAL_LIST_INIT(scan_conditions,init_scan_conditions()) /datum/scan_condition/asteroid_belt name = "Asteroid Belt" - description = "An asteroid belt is obscuring the direct line of sight from the station to the site, ensure the dishes are placed outside of station z level." + description = "An asteroid belt is obscuring the direct line of sight from the station to the site. Ensure the dishes are placed outside of the station z level." /datum/scan_condition/asteroid_belt/check_dish(obj/machinery/exoscanner/dish) var/turf/dish_turf = get_turf(dish) @@ -349,7 +375,7 @@ GLOBAL_LIST_INIT(scan_conditions,init_scan_conditions()) /datum/scan_condition/black_hole name = "Black Hole" - description = "Background black hole requires you to focus the scan point precisely, ensure the dishes isolated from rest of the station with at least 6 walls around them." + description = "A background black hole requires you to focus the scan point precisely. Ensure the dishes are isolated from rest of the station with at least 6 walls around them." /datum/scan_condition/black_hole/check_dish(obj/machinery/exoscanner/dish) var/wall_count = 0 diff --git a/code/modules/fishing/aquarium/aquarium.dm b/code/modules/fishing/aquarium/aquarium.dm index 56d3e1ca80503..7b50d13c61fe7 100644 --- a/code/modules/fishing/aquarium/aquarium.dm +++ b/code/modules/fishing/aquarium/aquarium.dm @@ -37,22 +37,39 @@ ///Current layers in use by aquarium contents var/list/used_layers = list() - /// /obj/item/fish in the aquarium - does not include things with aquarium visuals that are not fish - var/list/tracked_fish = list() + /// /obj/item/fish in the aquarium, sorted by type - does not include things with aquarium visuals that are not fish + var/list/tracked_fish_by_type /obj/structure/aquarium/Initialize(mapload) . = ..() update_appearance() - RegisterSignal(src,COMSIG_ATOM_ATTACKBY, PROC_REF(feed_feedback)) + RegisterSignal(src, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, PROC_REF(track_if_fish)) + AddElement(/datum/element/relay_attackers) + RegisterSignal(src, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked)) + +/obj/structure/aquarium/proc/track_if_fish(atom/source, atom/initialized) + SIGNAL_HANDLER + if(isfish(initialized)) + LAZYADDASSOCLIST(tracked_fish_by_type, initialized.type, initialized) /obj/structure/aquarium/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) . = ..() - if(istype(arrived,/obj/item/fish)) - tracked_fish += arrived + if(isfish(arrived)) + LAZYADDASSOCLIST(tracked_fish_by_type, arrived.type, arrived) /obj/structure/aquarium/Exited(atom/movable/gone, direction) . = ..() - tracked_fish -= gone + LAZYREMOVEASSOC(tracked_fish_by_type, gone.type, gone) + +/// Returns tracked_fish_by_type but flattened and without the items in the blacklist, also shuffled if shuffle is TRUE. +/obj/structure/aquarium/proc/get_fishes(shuffle = FALSE, blacklist) + . = list() + for(var/fish_type in tracked_fish_by_type) + . += tracked_fish_by_type[fish_type] + . -= blacklist + if(shuffle) + . = shuffle(.) + return . /obj/structure/aquarium/proc/request_layer(layer_type) /** @@ -111,9 +128,9 @@ default_unfasten_wrench(user, tool) return TOOL_ACT_TOOLTYPE_SUCCESS -/obj/structure/aquarium/attackby(obj/item/I, mob/living/user, params) +/obj/structure/aquarium/attackby(obj/item/item, mob/living/user, params) if(broken) - var/obj/item/stack/sheet/glass/glass = I + var/obj/item/stack/sheet/glass/glass = item if(istype(glass)) if(glass.get_amount() < 2) to_chat(user, span_warning("You need two glass sheets to fix the case!")) @@ -126,20 +143,27 @@ update_appearance() return TRUE else - var/datum/component/aquarium_content/content_component = I.GetComponent(/datum/component/aquarium_content) - if(content_component && content_component.is_ready_to_insert(src)) - if(user.transferItemToLoc(I,src)) - update_appearance() - return TRUE - else - return ..() + var/datum/component/aquarium_content/content_component = item.GetComponent(/datum/component/aquarium_content) + if(content_component && content_component.is_ready_to_insert(src) && user.transferItemToLoc(item, src)) + update_appearance() + return TRUE + + if(istype(item, /obj/item/fish_feed)) + if(!item.reagents.total_volume) + balloon_alert(user, "[item] is empty!") + return TRUE + var/list/fishes = get_fishes() + for(var/obj/item/fish/fish as anything in fishes) + fish.feed(item.reagents) + balloon_alert(user, "fed the fish") + return TRUE return ..() -/obj/structure/aquarium/proc/feed_feedback(datum/source, obj/item/thing, mob/user, params) - SIGNAL_HANDLER - if(istype(thing, /obj/item/fish_feed)) - to_chat(user,span_notice("You feed the fish.")) - return NONE +/obj/structure/aquarium/proc/on_attacked(datum/source, mob/attacker, attack_flags) + var/list/fishes = get_fishes() + //I wish this were an aquarium signal, but the aquarium_content component got in the way. + for(var/obj/item/fish/fish as anything in fishes) + SEND_SIGNAL(fish, COMSIG_FISH_STIRRED) /obj/structure/aquarium/interact(mob/user) if(!broken && user.pulling && isliving(user.pulling)) @@ -176,6 +200,7 @@ if(do_after(user, 5 SECONDS, target = src)) var/alive_fish = 0 var/dead_fish = 0 + var/list/tracked_fish = get_fishes() for(var/obj/item/fish/fish in tracked_fish) if(fish.status == FISH_ALIVE) alive_fish++ diff --git a/code/modules/fishing/aquarium/aquarium_kit.dm b/code/modules/fishing/aquarium/aquarium_kit.dm index 1522e212f92eb..cba44721e3a40 100644 --- a/code/modules/fishing/aquarium/aquarium_kit.dm +++ b/code/modules/fishing/aquarium/aquarium_kit.dm @@ -1,7 +1,7 @@ ///Fish feed can /obj/item/fish_feed name = "fish feed can" - desc = "Autogenerates nutritious fish feed based on sample inside." + desc = "A refillable can that dispenses nutritious fish feed." icon = 'icons/obj/aquarium.dmi' icon_state = "fish_feed" w_class = WEIGHT_CLASS_TINY @@ -9,57 +9,85 @@ /obj/item/fish_feed/Initialize(mapload) . = ..() create_reagents(5, OPENCONTAINER) - reagents.add_reagent(/datum/reagent/consumable/nutriment, 1) //Default fish diet + reagents.add_reagent(/datum/reagent/consumable/nutriment, 2.5) //Default fish diet -///Stasis fish case container for moving fish between aquariums safely. +/** + * Stasis fish case container for moving fish between aquariums safely. + * Their w_class scales with that of the fish inside it. + * Most subtypes of this also start with a fish already inside. + */ /obj/item/storage/fish_case name = "stasis fish case" - desc = "A small case keeping the fish inside in stasis." + desc = "A resizable case keeping the fish inside in stasis." icon = 'icons/obj/storage/case.dmi' icon_state = "fishbox" inhand_icon_state = "syringe_kit" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + storage_type = /datum/storage/fish_case /obj/item/storage/fish_case/Initialize(mapload) ADD_TRAIT(src, TRAIT_FISH_SAFE_STORAGE, TRAIT_GENERIC) // Before populate so fish instatiates in ready container already - . = ..() + return ..() - create_storage(max_slots = 1) - atom_storage.can_hold_trait = TRAIT_FISH_CASE_COMPATIBILE - atom_storage.can_hold_description = "fish and aquarium equipment" +/obj/item/storage/fish_case/PopulateContents() + var/fish_type = get_fish_type() + if(fish_type) + var/obj/item/fish/spawned_fish = new fish_type(null) + spawned_fish.forceMove(src) // trigger storage.handle_entered -///Fish case with single random fish inside. -/obj/item/storage/fish_case/random/PopulateContents() - . = ..() - var/fish_type = select_fish_type() - new fish_type(src) +/obj/item/storage/fish_case/proc/get_fish_type() + return + +/obj/item/storage/fish_case/random + + var/fluid_type -/obj/item/storage/fish_case/random/proc/select_fish_type() - return random_fish_type() +/obj/item/storage/fish_case/random/get_fish_type() + return random_fish_type(fluid_type) -/obj/item/storage/fish_case/random/freshwater/select_fish_type() - return random_fish_type(required_fluid=AQUARIUM_FLUID_FRESHWATER) +/obj/item/storage/fish_case/random/freshwater + fluid_type = AQUARIUM_FLUID_FRESHWATER -/obj/item/storage/fish_case/random/saltwater/select_fish_type() - return random_fish_type(required_fluid=AQUARIUM_FLUID_SALTWATER) +/obj/item/storage/fish_case/random/saltwater + fluid_type = AQUARIUM_FLUID_SALTWATER /obj/item/storage/fish_case/syndicate name = "ominous fish case" -/obj/item/storage/fish_case/syndicate/PopulateContents() - . = ..() - var/fish_type = pick(/obj/item/fish/donkfish, /obj/item/fish/emulsijack) - new fish_type(src) +/obj/item/storage/fish_case/syndicate/get_fish_type() + return pick(/obj/item/fish/donkfish, /obj/item/fish/emulsijack) /obj/item/storage/fish_case/tiziran name = "imported fish case" -/obj/item/storage/fish_case/tiziran/PopulateContents() +/obj/item/storage/fish_case/tiziran/get_fish_type() + return pick(/obj/item/fish/dwarf_moonfish, /obj/item/fish/gunner_jellyfish, /obj/item/fish/needlefish, /obj/item/fish/armorfish) + +///Subtype bought from the blackmarket at a gratuitously cheap price. The catch? The fish inside it is dead. +/obj/item/storage/fish_case/blackmarket + name = "ominous fish case" + desc = "A resizable case keeping the fish inside in stasis. This one holds a faint cadaverine smell." + +/obj/item/storage/fish_case/blackmarket/get_fish_type() + var/static/list/weighted_list = list( + /obj/item/fish/boned = 1, + /obj/item/fish/clownfish/lube = 3, + /obj/item/fish/emulsijack = 1, + /obj/item/fish/sludgefish/purple = 1, + /obj/item/fish/pufferfish = 3, + /obj/item/fish/slimefish = 2, + /obj/item/fish/ratfish = 2, + /obj/item/fish/chasm_crab/ice = 2, + /obj/item/fish/chasm_crab = 2, + ) + return pick_weight(weighted_list) + +/obj/item/storage/fish_cas/blackmarket/Initialize(mapload) . = ..() - var/fish_type = pick(/obj/item/fish/dwarf_moonfish, /obj/item/fish/gunner_jellyfish, /obj/item/fish/needlefish, /obj/item/fish/armorfish) - new fish_type(src) + for(var/obj/item/fish/fish as anything in contents) + fish.set_status(FISH_DEAD) /obj/item/aquarium_kit name = "DIY Aquarium Construction Kit" @@ -72,7 +100,6 @@ . = ..() to_chat(user,span_notice("There's instruction and tools necessary to build aquarium inside. All you need is to start crafting.")) - /obj/item/aquarium_prop name = "generic aquarium prop" desc = "very boring" diff --git a/code/modules/fishing/aquarium/fish_analyzer.dm b/code/modules/fishing/aquarium/fish_analyzer.dm new file mode 100644 index 0000000000000..a83aa4296b6c9 --- /dev/null +++ b/code/modules/fishing/aquarium/fish_analyzer.dm @@ -0,0 +1,259 @@ +///An item that can be used to gather information on the fish, such as but not limited to: health, hunger and traits. +/obj/item/fish_analyzer + name = "fish analyzer" + icon = 'icons/obj/device.dmi' + icon_state = "fish_analyzer_map" + base_icon_state = "fish_analyzer" + inhand_icon_state = "fish_analyzer" + worn_icon_state = "fish_analyzer" + desc = "A fish-shaped scanner used to monitor fish's status and evolutionary traits." + flags_1 = CONDUCT_1 + item_flags = NOBLUDGEON + slot_flags = ITEM_SLOT_BELT + throwforce = 3 + w_class = WEIGHT_CLASS_TINY + throw_speed = 3 + throw_range = 7 + custom_materials = list(/datum/material/iron= SMALL_MATERIAL_AMOUNT *2) + greyscale_config_inhand_left = /datum/greyscale_config/fish_analyzer_inhand_left + greyscale_config_inhand_right = /datum/greyscale_config/fish_analyzer_inhand_right + greyscale_config_worn = /datum/greyscale_config/fish_analyzer_worn + ///The color of the case. Used by grayscale configs and update_overlays() + var/case_color + /** + * The radial menu shown when analyzing aquariums. Having a persistent one allows us + * to update it whenever fish come and go, and is also required since we have a select callback + * used to check right clicks for scanning traits instead of status. + */ + var/datum/radial_menu/persistent/fish_menu + /// A cached list of the current choices for the aforedefined radial menu. + var/list/radial_choices + +/obj/item/fish_analyzer/Initialize(mapload) + case_color = rgb(rand(16, 255), rand(16, 255), rand(16, 255)) + set_greyscale(colors = list(case_color)) + . = ..() + + var/static/list/fishe_signals = list( + COMSIG_FISH_ANALYZER_ANALYZE_STATUS = TYPE_PROC_REF(/datum/component/experiment_handler, try_run_handheld_experiment), + ) + AddComponent(/datum/component/experiment_handler, \ + config_mode = EXPERIMENT_CONFIG_ALTCLICK, \ + allowed_experiments = list(/datum/experiment/scanning/fish), \ + config_flags = EXPERIMENT_CONFIG_SILENT_FAIL|EXPERIMENT_CONFIG_IMMEDIATE_ACTION, \ + experiment_signals = fishe_signals, \ + ) + + register_item_context() + update_appearance() + +/obj/item/fish_analyzer/Destroy() + if(fish_menu) + QDEL_NULL(fish_menu) + radial_choices = null + return ..() + +/obj/item/fish_analyzer/examine(mob/user) + . = ..() + . += span_notice("Alt-Click to access the Experiment Configuration UI") + +/obj/item/fish_analyzer/update_icon_state() + . = ..() + icon_state = base_icon_state + +/obj/item/fish_analyzer/update_overlays() + . = ..() + var/mutable_appearance/case = mutable_appearance(icon, "fish_analyzer_case") + case.color = case_color + . += case + . += emissive_appearance(icon, "fish_analyzer_emissive", src) + +/obj/item/fish_analyzer/add_item_context(obj/item/source, list/context, atom/target) + if (isfish(target)) + context[SCREENTIP_CONTEXT_LMB] = "Analyze status" + context[SCREENTIP_CONTEXT_RMB] = "Analyze traits" + return CONTEXTUAL_SCREENTIP_SET + else if(isaquarium(target)) + context[SCREENTIP_CONTEXT_LMB] = "Open radial menu" + return CONTEXTUAL_SCREENTIP_SET + return NONE + +/obj/item/fish_analyzer/afterattack(atom/target, mob/user, proximity) + . = ..() + if(!proximity || !user.can_read(src) || user.is_blind()) + return + + if(isfish(target)) + balloon_alert(user, "analyzing stats") + + user.visible_message(span_notice("[user] analyzes [target]."), span_notice("You analyze [target].")) + analyze_status(target, user) + else if(istype(target, /obj/structure/aquarium)) + scan_aquarium(target, user) + + +/obj/item/fish_analyzer/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) + if(!isfish(target)) + return + + if(!proximity_flag || !user.can_read(src) || user.is_blind()) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + balloon_alert(user, "analyzing traits") + + analyze_traits(target, user) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +///Instantiates the radial menu, populates the list of choices, shows it and register signals on the aquarium. +/obj/item/fish_analyzer/proc/scan_aquarium(obj/structure/aquarium/aquarium, mob/user) + if(fish_menu) + balloon_alert(user, "already scanning") + return + var/list/fishes = aquarium.get_fishes() + if(!length(fishes)) + balloon_alert(user, "no fish to scan") + return + radial_choices = list() + for(var/obj/item/fish/fish as anything in fishes) + radial_choices(fish) + fish_menu = show_radial_menu_persistent(user, aquarium, radial_choices, select_proc = CALLBACK(src, PROC_REF(choice_selected), user, aquarium), tooltips = TRUE, custom_check = CALLBACK(src, PROC_REF(can_select_fish), user, aquarium)) + RegisterSignal(aquarium, COMSIG_ATOM_ABSTRACT_ENTERED, PROC_REF(on_aquarium_entered)) + RegisterSignal(aquarium, COMSIG_ATOM_ABSTRACT_EXITED, PROC_REF(on_aquarium_exited)) + RegisterSignal(aquarium, COMSIG_QDELETING, PROC_REF(delete_radial)) + +///Instantiates a radial menu choice datum for the current fish and adds it to the list of choices. +/obj/item/fish_analyzer/proc/radial_choices(obj/item/fish/fish) + var/datum/radial_menu_choice/menu_choice = new + menu_choice.name = fish.name + menu_choice.info = "[fish.status == FISH_ALIVE ? "Alive" : "Dead"]\n[fish.size] cm\n[fish.weight] g\nProgenitors: [fish.progenitors]\nRight-click to analyze traits" + var/mutable_appearance/fish_appearance = new(fish) + fish_appearance.layer = FLOAT_LAYER + fish_appearance.plane = FLOAT_PLANE + menu_choice.image = fish_appearance + radial_choices[fish] = menu_choice + +///Called when the user has selected a choice. If it's a right click, analyze the traits, else the status +/obj/item/fish_analyzer/proc/choice_selected(mob/user, obj/structure/aquarium/aquarium, obj/item/fish/choice, params) + if(!choice || !can_select_fish(user, aquarium)) + delete_radial(aquarium) + return + var/is_right_clicking = LAZYACCESS(params2list(params), RIGHT_CLICK) + user.visible_message(span_notice("[user] analyzes [choice] inside [aquarium]."), span_notice("You analyze [choice] inside [aquarium].")) + if(is_right_clicking) + analyze_traits(choice, user) + else + analyze_status(choice, user) + +///Whether the item should continue to show its radial menu or delete it. +/obj/item/fish_analyzer/proc/can_select_fish(mob/user, obj/structure/aquarium/aquarium) + if(!user.is_holding(src) || !user?.CanReach(aquarium) || IS_DEAD_OR_INCAP(user)) + delete_radial(aquarium) + return FALSE + return TRUE + +///Called when something enters the aquarium. If it's a fish, update the choices. +/obj/item/fish_analyzer/proc/on_aquarium_entered(obj/structure/aquarium/source, atom/movable/arrived) + SIGNAL_HANDLER + if(isfish(arrived)) + radial_choices(arrived) + fish_menu.change_choices(radial_choices, tooltips = TRUE, animate = TRUE) + +///Called when something exits the aquarium. If it's a fish, update the choices. +/obj/item/fish_analyzer/proc/on_aquarium_exited(obj/structure/aquarium/source, atom/movable/gone) + SIGNAL_HANDLER + if(!isfish(gone)) + return + radial_choices -= gone + if(!length(radial_choices)) + delete_radial(source) + return + fish_menu.change_choices(radial_choices, tooltips = TRUE, animate = TRUE) + +///Unregisters signals, delete the radial menu, unsets the choices. +/obj/item/fish_analyzer/proc/delete_radial(obj/structure/aquarium/source) + SIGNAL_HANDLER + UnregisterSignal(source, list(COMSIG_ATOM_ABSTRACT_EXITED, COMSIG_ATOM_ABSTRACT_ENTERED, COMSIG_QDELETING)) + QDEL_NULL(fish_menu) + radial_choices = null + +/** + * Called when a fish or a menu choice is left-clicked. + * This returns the fish's status, size, weight, feed type, hunger, breeding timeout. + */ +/obj/item/fish_analyzer/proc/analyze_status(obj/item/fish/fish, mob/user) + + // the final list of strings to render + var/render_list = list() + + var/fish_status = fish.status == FISH_DEAD ? span_alert("Deceased") : "[PERCENT(fish.health/initial(fish.health))]% healthy" + + render_list += "[span_info("Analyzing status for [fish]:")]\nOverrall status: [fish_status]\n" + render_list += "Size: [fish.size] cm - Weight: [fish.weight] g\n" + render_list += "Required feed type: [initial(fish.food.name)]\n" + render_list += "Safe temperature: [fish.required_temperature_min] - [fish.required_temperature_max]K" + if(isaquarium(fish.loc)) + var/obj/structure/aquarium/aquarium = fish.loc + if(!ISINRANGE(aquarium.fluid_temp, fish.required_temperature_min, fish.required_temperature_max)) + render_list += span_alert("(OUT OF RANGE)") + render_list += "\n" + render_list += "Safe fluid type: [fish.required_fluid_type]" + if(isaquarium(fish.loc)) + var/obj/structure/aquarium/aquarium = fish.loc + if(!compatible_fluid_type(fish.required_fluid_type, aquarium.fluid_type)) + render_list += span_alert("(IN UNSAFE FLUID)") + render_list += "" + + if(fish.status != FISH_DEAD) + render_list += "\n" + if(!HAS_TRAIT(fish, TRAIT_FISH_NO_HUNGER)) + var/hunger = PERCENT(min((world.time - fish.last_feeding) / fish.feeding_frequency, 1)) + var/hunger_string = "[hunger]%" + switch(hunger) + if(0 to 60) + hunger_string = span_info(hunger_string) + if(60 to 90) + hunger_string = span_warning(hunger_string) + if(90 to 100) + hunger_string = span_alert(hunger_string) + render_list += "Hunger: [hunger_string]\n" + var/time_left = round(max(fish.breeding_wait - world.time, 0)/10) + render_list += "Time until it can breed: [time_left] seconds" + + to_chat(user, examine_block(jointext(render_list, "")), type = MESSAGE_TYPE_INFO) + + SEND_SIGNAL(src, COMSIG_FISH_ANALYZER_ANALYZE_STATUS, fish, user) + +/** + * Called when a fish or a menu choice is left-clicked. + * This returns the fish's progenitors, traits and their inheritability. + */ +/obj/item/fish_analyzer/proc/analyze_traits(obj/item/fish/fish, mob/user) + + // the final list of strings to render + var/render_list = list() + + render_list += "[span_info("Analyzing traits for [fish]:")]\nProgenitor species: [fish.progenitors]\n" + + if(!length(fish.fish_traits)) + render_list += "This fish has no trait to speak of...\n" + else + render_list += "Traits:\n" + for(var/trait_type in fish.fish_traits) + var/datum/fish_trait/trait = GLOB.fish_traits[trait_type] + var/tooltipped_trait = span_tooltip(trait.catalog_description, trait.name) + render_list += "[tooltipped_trait] - Inheritabilities: [trait.inheritability]% - [trait.diff_traits_inheritability]%\n" + + var/evolution_len = length(fish.evolution_types) + if(!evolution_len) + render_list += "This fish has no evolution to speak of..." + for(var/index in 1 to evolution_len) + var/datum/fish_evolution/evolution = GLOB.fish_evolutions[fish.evolution_types[index]] + var/evolution_name = evolution.name + var/evolution_tooltip = evolution.get_evolution_tooltip() + if(evolution_tooltip) + evolution_name = span_tooltip(evolution_tooltip, evolution_name) + render_list += "[evolution_name] - Base Probability: [evolution.probability]%" + if(index != evolution_len) + render_list += "\n" + + to_chat(user, examine_block(jointext(render_list, "")), type = MESSAGE_TYPE_INFO) diff --git a/code/modules/fishing/fish/_fish.dm b/code/modules/fishing/fish/_fish.dm index 1c1508e688bf6..1275886141b52 100644 --- a/code/modules/fishing/fish/_fish.dm +++ b/code/modules/fishing/fish/_fish.dm @@ -4,8 +4,16 @@ desc = "very bland" icon = 'icons/obj/aquarium.dmi' icon_state = "bugfish" - - w_class = WEIGHT_CLASS_TINY + lefthand_file = 'icons/mob/inhands/fish_lefthand.dmi' + righthand_file = 'icons/mob/inhands/fish_righthand.dmi' + inhand_icon_state = "fish_normal" + force = 6 + attack_verb_continuous = list("slaps", "whacks") + attack_verb_simple = list("slap", "whack") + hitsound = 'sound/weapons/slap.ogg' + ///The grind results of the fish. They scale with the weight of the fish. + grind_results = list(/datum/reagent/blood = 20, /datum/reagent/consumable/liquidgibs = 5) + obj_flags = UNIQUE_RENAME /// Resulting width of aquarium visual icon - default size of "fish_greyscale" state var/sprite_width = 3 @@ -17,6 +25,11 @@ /// Original height of aquarium visual icon - used to calculate scaledown factor var/source_height = 32 + /** + * If present and it also has a dedicated icon state, this icon file will + * be used for in-aquarium visual for the fish instead of its icon + */ + var/dedicated_in_aquarium_icon /// If present this icon will be used for in-aquarium visual for the fish instead of icon_state var/dedicated_in_aquarium_icon_state @@ -31,7 +44,7 @@ var/required_temperature_max = MAX_AQUARIUM_TEMP /// What type of reagent this fish needs to be fed. - var/food = /datum/reagent/consumable/nutriment + var/datum/reagent/food = /datum/reagent/consumable/nutriment /// How often the fish needs to be fed var/feeding_frequency = 5 MINUTES /// Time of last feedeing @@ -39,26 +52,38 @@ /// Fish status var/status = FISH_ALIVE + ///icon used when the fish is dead, ifset. + var/icon_state_dead + ///If this fish should do the flopping animation + var/do_flop_animation = TRUE /// Current fish health. Dies at 0. var/health = 100 + /// The message shown when the fish dies. + var/death_text = "%SRC dies." /// Should this fish type show in fish catalog var/show_in_catalog = TRUE - /// Should this fish spawn in random fish cases - var/available_in_random_cases = TRUE /// How rare this fish is in the random cases var/random_case_rarity = FISH_RARITY_BASIC /// Fish autogenerated from this behaviour will be processable into this var/fillet_type = /obj/item/food/fishmeat + /// number of fillets given by the fish. It scales with its size. + var/num_fillets = 1 /// Won't breed more than this amount in single aquarium. var/stable_population = 1 - /// Last time new fish was created - var/last_breeding + /// The time limit before new fish can be created + var/breeding_wait /// How long it takes to produce new fish var/breeding_timeout = 2 MINUTES + /// If set, the fish can also breed with these fishes types + var/list/compatible_types + /// A list of possible evolutions. If set, offsprings may be of a different, new fish type if conditions are met. + var/list/evolution_types + /// The species' name(s) of the parents of the fish. Shown by the fish analyzer. + var/progenitors var/flopping = FALSE @@ -66,8 +91,11 @@ // Fishing related properties - /// List of fishing trait types, these modify probabilty/difficulty depending on rod/user properties - var/list/fishing_traits = list() + /** + * List of fish trait types, these may modify probabilty/difficulty depending on rod/user properties + * or dictate how the fish behaves or some of its qualities. + */ + var/list/fish_traits = list() /// Fishing behaviour var/fish_ai_type = FISH_AI_DUMB @@ -87,31 +115,71 @@ */ var/list/disliked_bait = list() - /// Size in centimeters - var/size = 50 + /// Size in centimeters. Null until update_size_and_weight is called. Number of fillets and w_class scale with it. + var/size /// Average size for this fish type in centimeters. Will be used as gaussian distribution with 20% deviation for fishing, bought fish are always standard size var/average_size = 50 - /// Weight in grams - var/weight = 1000 + /// Weight in grams. Null until update_size_and_weight is called. Grind results scale with it. Don't think too hard how a trout could fit in a blender. + var/weight /// Average weight for this fish type in grams var/average_weight = 1000 - - -/obj/item/fish/Initialize(mapload) + /// When outside of an aquarium, these gases that are checked (as well as pressure and temp) to assert if the environment is safe or not. + var/list/safe_air_limits = list( + /datum/gas/oxygen = list(12, 100), + /datum/gas/nitrogen, + /datum/gas/carbon_dioxide = list(0, 10), + /datum/gas/water_vapor, + ) + /// Outside of an aquarium, the pressure needs to be within these two variables for the environment to be safe. + var/min_pressure = WARNING_LOW_PRESSURE + var/max_pressure = HAZARD_HIGH_PRESSURE + + /// If this fish type counts towards the Fish Species Scanning experiments + var/experisci_scannable = TRUE + +/obj/item/fish/Initialize(mapload, apply_qualities = TRUE) . = ..() - if(fillet_type) - AddElement(/datum/element/processable, TOOL_KNIFE, fillet_type, 1, 5, screentip_verb = "Cut") AddComponent(/datum/component/aquarium_content, PROC_REF(get_aquarium_animation), list(COMSIG_FISH_STATUS_CHANGED,COMSIG_FISH_STIRRED)) - RegisterSignal(src, COMSIG_ATOM_TEMPORARY_ANIMATION_START, PROC_REF(on_temp_animation)) - check_environment_after_movement() + RegisterSignal(src, COMSIG_ATOM_ON_LAZARUS_INJECTOR, PROC_REF(use_lazarus)) + if(do_flop_animation) + RegisterSignal(src, COMSIG_ATOM_TEMPORARY_ANIMATION_START, PROC_REF(on_temp_animation)) + check_environment() if(status != FISH_DEAD) START_PROCESSING(SSobj, src) - size = average_size - weight = average_weight + //stops new fish from being able to reproduce right away. + breeding_wait = world.time + (breeding_timeout * NEW_FISH_BREEDING_TIMEOUT_MULT) + last_feeding = world.time - (feeding_frequency * NEW_FISH_LAST_FEEDING_MULT) + + if(apply_qualities) + apply_traits() //Make sure traits are applied before size and weight. + update_size_and_weight() + progenitors = full_capitalize(name) //default value + + register_evolutions() + +/obj/item/fish/update_icon_state() + if(status == FISH_DEAD && icon_state_dead) + icon_state = icon_state_dead + else + icon_state = initial(icon_state) + return ..() + +/obj/item/fish/attackby(obj/item/item, mob/living/user, params) + if(!istype(item, /obj/item/fish_feed)) + return ..() + if(!item.reagents.total_volume) + balloon_alert(user, "[item] is empty!") + return TRUE + if(status == FISH_DEAD) + balloon_alert(user, "[src] is dead!") + return TRUE + feed(item.reagents) + balloon_alert(user, "fed [src]") + return TRUE /obj/item/fish/examine(mob/user) . = ..() @@ -119,18 +187,111 @@ . += span_notice("It's [size] cm long.") . += span_notice("It weighs [weight] g.") -/obj/item/fish/proc/randomize_weight_and_size(modifier = 0) - var/size_deviation = 0.2 * average_size - var/size_mod = modifier * average_size - size = max(1,gaussian(average_size + size_mod, size_deviation)) +///Randomizes weight and size. +/obj/item/fish/proc/randomize_size_and_weight(base_size = average_size, base_weight = average_weight, deviation = 0.2) + var/size_deviation = 0.2 * base_size + var/new_size = round(clamp(gaussian(base_size, size_deviation), average_size * 1/MAX_FISH_DEVIATION_COEFF, average_size * MAX_FISH_DEVIATION_COEFF)) + + var/weight_deviation = 0.2 * base_weight + var/new_weight = round(clamp(gaussian(base_weight, weight_deviation), average_weight * 1/MAX_FISH_DEVIATION_COEFF, average_weight * MAX_FISH_DEVIATION_COEFF)) + + update_size_and_weight(new_size, new_weight) + +///Updates weight and size, along with weight class, number of fillets you can get and grind results. +/obj/item/fish/proc/update_size_and_weight(new_size = average_size, new_weight = average_weight) + if(size && fillet_type) + RemoveElement(/datum/element/processable, TOOL_KNIFE, fillet_type, num_fillets, 0.5 SECONDS, screentip_verb = "Cut") + size = new_size + switch(size) + if(0 to FISH_SIZE_TINY_MAX) + w_class = WEIGHT_CLASS_TINY + inhand_icon_state = "fish_small" + if(FISH_SIZE_TINY_MAX to FISH_SIZE_SMALL_MAX) + inhand_icon_state = "fish_small" + w_class = WEIGHT_CLASS_SMALL + if(FISH_SIZE_SMALL_MAX to FISH_SIZE_NORMAL_MAX) + inhand_icon_state = "fish_normal" + w_class = WEIGHT_CLASS_NORMAL + if(FISH_SIZE_NORMAL_MAX to FISH_SIZE_BULKY_MAX) + inhand_icon_state = "fish_bulky" + w_class = WEIGHT_CLASS_BULKY + if(FISH_SIZE_BULKY_MAX to INFINITY) + inhand_icon_state = "fish_huge" + w_class = WEIGHT_CLASS_HUGE + if(fillet_type) + var/init_fillets = initial(num_fillets) + var/amount = max(round(init_fillets * size / FISH_FILLET_NUMBER_SIZE_DIVISOR, 1), 1) + num_fillets = amount + AddElement(/datum/element/processable, TOOL_KNIFE, fillet_type, num_fillets, 0.5 SECONDS, screentip_verb = "Cut") + + if(weight) + for(var/reagent_type in grind_results) + grind_results[reagent_type] /= FLOOR(weight/FISH_GRIND_RESULTS_WEIGHT_DIVISOR, 0.1) + weight = new_weight + for(var/reagent_type in grind_results) + grind_results[reagent_type] *= FLOOR(weight/FISH_GRIND_RESULTS_WEIGHT_DIVISOR, 0.1) + +/** + * This proc has fish_traits list populated with fish_traits paths from three different lists: + * traits from x_traits and y_traits are compared, and inserted if conditions are met; + * traits from fixed_traits are inserted unconditionally. + * traits from removed_traits will be removed from the for loop. + * + * This proc should only be called if the fish was spawned with the apply_qualities arg set to FALSE + * and hasn't had inherited traits already. + */ +/obj/item/fish/proc/inherit_traits(list/x_traits, list/y_traits, list/fixed_traits, list/removed_traits) + + fish_traits = fixed_traits?.Copy() || list() + + var/list/same_traits = x_traits & y_traits + var/list/all_traits = (x_traits|y_traits)-removed_traits + /** + * Traits that the fish is guaranteed to inherit will be inherited, + * with the assertion that they're compatible anyway. + */ + for(var/trait_type in all_traits) + var/datum/fish_trait/trait = GLOB.fish_traits[trait_type] + if(type in trait.guaranteed_inheritance_types) + fish_traits |= trait_type + all_traits -= trait_type + + ///Build a list of incompatible traits. Don't let any such trait pass onto the fish. + var/list/incompatible_traits = list() + for(var/trait_type in fish_traits) + var/datum/fish_trait/trait = GLOB.fish_traits[trait_type] + incompatible_traits |= trait.incompatible_traits + /** + * shuffle the traits, so, in the case of incompatible traits, we don't have to choose which to discard. + * Instead we let the random numbers do it for us in a first come, first served basis. + */ + for(var/trait_type in shuffle(all_traits)) + if(trait_type in fish_traits) + continue //likely a fixed trait + if(trait_type in incompatible_traits) + continue + var/datum/fish_trait/trait = GLOB.fish_traits[trait_type] + if(length(fish_traits & trait.incompatible_traits)) + continue + if((trait_type in same_traits) ? prob(trait.inheritability) : prob(trait.diff_traits_inheritability)) + fish_traits |= trait_type + incompatible_traits |= trait.incompatible_traits + + apply_traits() - var/weight_deviation = 0.2 * average_weight - var/weight_mod = modifier * average_weight - weight = max(1,gaussian(average_weight + weight_mod, weight_deviation)) +/obj/item/fish/proc/apply_traits() + for(var/fish_trait_type in fish_traits) + var/datum/fish_trait/trait = GLOB.fish_traits[fish_trait_type] + trait.apply_to_fish(src) + +/obj/item/fish/proc/register_evolutions() + for(var/evolution_type in evolution_types) + var/datum/fish_evolution/evolution = GLOB.fish_evolutions[evolution_type] + evolution.register_fish(src) /obj/item/fish/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) . = ..() - check_environment_after_movement() + check_environment() /obj/item/fish/proc/enter_stasis() in_stasis = TRUE @@ -143,49 +304,35 @@ if(status != FISH_DEAD) START_PROCESSING(SSobj, src) -/obj/item/fish/proc/on_aquarium_insertion(obj/structure/aquarium) - if(isnull(last_feeding)) //Fish start fed. - last_feeding = world.time - RegisterSignal(aquarium, COMSIG_ATOM_EXITED, PROC_REF(aquarium_exited)) - RegisterSignal(aquarium, COMSIG_ATOM_ATTACKBY, PROC_REF(attack_reaction)) - -/obj/item/fish/proc/aquarium_exited(datum/source, atom/movable/gone, direction) - SIGNAL_HANDLER - if(src != gone) +///Feed the fishes with the contents of the fish feed +/obj/item/fish/proc/feed(datum/reagents/fed_reagents) + if(status != FISH_ALIVE) return - UnregisterSignal(source,list(COMSIG_ATOM_EXITED,COMSIG_ATOM_ATTACKBY)) - -/// Our aquarium is hit with stuff -/obj/item/fish/proc/attack_reaction(datum/source, obj/item/thing, mob/user, params) - SIGNAL_HANDLER - if(is_food(thing)) - on_feeding(thing.reagents) - return COMPONENT_NO_AFTERATTACK - else - //stirred effect - SEND_SIGNAL(src, COMSIG_FISH_STIRRED) - -/obj/item/fish/proc/is_food(obj/item/thing) - return istype(thing, /obj/item/fish_feed) - -/obj/item/fish/proc/on_feeding(datum/reagents/feed_reagents) - if(feed_reagents.has_reagent(food)) + var/fed_reagent_type + if(fed_reagents.remove_reagent(food, 0.1)) + fed_reagent_type = food last_feeding = world.time + else + var/datum/reagent/wrong_reagent = pick(fed_reagents.reagent_list) + fed_reagent_type = wrong_reagent.type + fed_reagents.remove_reagent(fed_reagent_type, 0.1) + SEND_SIGNAL(src, COMSIG_FISH_FED, fed_reagents, fed_reagent_type) -/obj/item/fish/proc/check_environment_after_movement() +/obj/item/fish/proc/check_environment(stasis_check = TRUE) if(QDELETED(src)) //we don't care anymore return - // Apply/remove stasis as needed - if(loc && HAS_TRAIT(loc, TRAIT_FISH_SAFE_STORAGE)) - enter_stasis() - else if(in_stasis) - exit_stasis() + if(stasis_check) + // Apply/remove stasis as needed + if(loc && HAS_TRAIT(loc, TRAIT_FISH_SAFE_STORAGE)) + enter_stasis() + else if(in_stasis) + exit_stasis() + + if(!do_flop_animation) + return // Do additional stuff - var/in_aquarium = istype(loc,/obj/structure/aquarium) - if(in_aquarium) - on_aquarium_insertion(loc) - + var/in_aquarium = isaquarium(loc) // Start flopping if outside of fish container var/should_be_flopping = status == FISH_ALIVE && loc && !HAS_TRAIT(loc,TRAIT_FISH_SAFE_STORAGE) && !in_aquarium @@ -202,23 +349,42 @@ if(ready_to_reproduce()) try_to_reproduce() + SEND_SIGNAL(src, COMSIG_FISH_LIFE, seconds_per_tick) + /obj/item/fish/proc/set_status(new_status) + if(status == new_status) + return switch(new_status) if(FISH_ALIVE) status = FISH_ALIVE - health = initial(health) // this is admin option anyway + health = initial(health) // since the fishe has been revived + last_feeding = world.time //reset hunger + check_environment(FALSE) START_PROCESSING(SSobj, src) if(FISH_DEAD) status = FISH_DEAD STOP_PROCESSING(SSobj, src) stop_flopping() - var/message = span_notice("\The [name] dies.") - if(istype(loc,/obj/structure/aquarium)) + var/message = span_notice(replacetext(death_text, "%SRC", "[src]")) + if(isaquarium(loc)) loc.visible_message(message) else visible_message(message) + update_appearance() SEND_SIGNAL(src, COMSIG_FISH_STATUS_CHANGED) +/obj/item/fish/proc/use_lazarus(datum/source, obj/item/lazarus_injector/injector, mob/user) + SIGNAL_HANDLER + if(injector.revive_type != SENTIENCE_ORGANIC) + balloon_alert(user, "invalid creature!") + return + if(status != FISH_DEAD) + balloon_alert(user, "it's not dead!") + return + set_status(FISH_ALIVE) + injector.expend(src, user) + return LAZARUS_INJECTOR_USED + /obj/item/fish/proc/get_aquarium_animation() var/obj/structure/aquarium/aquarium = loc if(!istype(aquarium) || aquarium.fluid_type == AQUARIUM_FLUID_AIR || status == FISH_DEAD) @@ -229,24 +395,36 @@ /// Checks if our current environment lets us live. /obj/item/fish/proc/proper_environment() var/obj/structure/aquarium/aquarium = loc - if(!istype(aquarium)) - return FALSE - - if(required_fluid_type != AQUARIUM_FLUID_ANADROMOUS) - if(aquarium.fluid_type != required_fluid_type) - return FALSE - else - if(aquarium.fluid_type != AQUARIUM_FLUID_SALTWATER && aquarium.fluid_type != AQUARIUM_FLUID_FRESHWATER) + if(istype(aquarium)) + if(!compatible_fluid_type(required_fluid_type, aquarium.fluid_type)) + if(aquarium.fluid_type != AQUARIUM_FLUID_AIR || !HAS_TRAIT(src, TRAIT_FISH_AMPHIBIOUS)) + return FALSE + if(!ISINRANGE(aquarium.fluid_temp, required_temperature_min, required_temperature_max)) return FALSE - if(aquarium.fluid_temp < required_temperature_min || aquarium.fluid_temp > required_temperature_max) + return TRUE + + if(required_fluid_type != AQUARIUM_FLUID_AIR && !HAS_TRAIT(src, TRAIT_FISH_AMPHIBIOUS)) + return FALSE + var/datum/gas_mixture/mixture = loc.return_air() + if(!mixture) + return FALSE + if(safe_air_limits && !check_gases(mixture.gases, safe_air_limits)) + return FALSE + if(!ISINRANGE(mixture.temperature, required_temperature_min, required_temperature_max)) + return FALSE + var/pressure = mixture.return_pressure() + if(!ISINRANGE(pressure, min_pressure, max_pressure)) return FALSE return TRUE +/obj/item/fish/proc/is_hungry() + return !HAS_TRAIT(src, TRAIT_FISH_NO_HUNGER) && world.time - last_feeding >= feeding_frequency + /obj/item/fish/proc/process_health(seconds_per_tick) var/health_change_per_second = 0 if(!proper_environment()) health_change_per_second -= 3 //Dying here - if(world.time - last_feeding >= feeding_frequency) + if(is_hungry()) health_change_per_second -= 0.5 //Starving else health_change_per_second += 0.5 //Slowly healing @@ -258,37 +436,109 @@ set_status(FISH_DEAD) -/obj/item/fish/proc/ready_to_reproduce() +//Fish breeding stops if fish count exceeds this. +#define AQUARIUM_MAX_BREEDING_POPULATION 20 + +/obj/item/fish/proc/ready_to_reproduce(being_targetted = FALSE) var/obj/structure/aquarium/aquarium = loc if(!istype(aquarium)) return FALSE - return aquarium.allow_breeding && health == initial(health) && stable_population > 1 && world.time - last_breeding >= breeding_timeout + if(being_targetted && HAS_TRAIT(src, TRAIT_FISH_NO_MATING)) + return FALSE + if(!being_targetted && length(aquarium.get_fishes()) >= AQUARIUM_MAX_BREEDING_POPULATION) + return FALSE + return aquarium.allow_breeding && health >= initial(health) * 0.8 && stable_population > 1 && world.time >= breeding_wait + +#undef AQUARIUM_MAX_BREEDING_POPULATION -//Fish breeding stops if fish count exceeds this. -#define AQUARIUM_MAX_BREEDING_POPULATION 20 /obj/item/fish/proc/try_to_reproduce() var/obj/structure/aquarium/aquarium = loc if(!istype(aquarium)) - return - if(length(aquarium.tracked_fish) >= AQUARIUM_MAX_BREEDING_POPULATION) //so aquariums full of fish don't need to do these expensive checks - return - var/list/other_fish_of_same_type = list() - for(var/obj/item/fish/fish_in_aquarium in aquarium) - if(fish_in_aquarium == src || fish_in_aquarium.type != type) - continue - other_fish_of_same_type += fish_in_aquarium - if(length(other_fish_of_same_type) >= stable_population) - return + return FALSE + var/obj/item/fish/second_fish - for(var/obj/item/fish/other_fish in other_fish_of_same_type) - if(other_fish.ready_to_reproduce()) - second_fish = other_fish - break - if(second_fish) - new type(loc) //could use child_type var - last_breeding = world.time - second_fish.last_breeding = world.time -#undef AQUARIUM_MAX_BREEDING_POPULATION + + /** + * Fishes with this trait cannot mate, but could still reproduce asexually, so don't early return. + * Also mating takes priority over that. + */ + if(!HAS_TRAIT(src, TRAIT_FISH_NO_MATING)) + var/list/available_fishes = list() + var/types_to_mate_with = aquarium.tracked_fish_by_type + if(!HAS_TRAIT(src, TRAIT_FISH_CROSSBREEDER)) + var/list/types_to_check = list(src) + if(compatible_types) + types_to_check |= compatible_types + types_to_mate_with = types_to_mate_with & types_to_check + + for(var/obj/item/fish/fish_type as anything in types_to_mate_with) + var/list/type_fishes = types_to_mate_with[fish_type] + if(length(type_fishes) >= initial(fish_type.stable_population)) + continue + available_fishes += type_fishes + + available_fishes -= src //no self-mating. + if(length(available_fishes)) + for(var/obj/item/fish/other_fish as anything in shuffle(available_fishes)) + if(other_fish.ready_to_reproduce(TRUE)) + second_fish = other_fish + break + + if(!second_fish && !HAS_TRAIT(src, TRAIT_FISH_SELF_REPRODUCE)) + return FALSE + + var/chosen_type + var/datum/fish_evolution/chosen_evolution + if(PERFORM_ALL_TESTS(fish_breeding) && second_fish && !length(evolution_types)) + chosen_type = second_fish.type + else + var/list/possible_evolutions = list() + for(var/evolution_type in evolution_types) + var/datum/fish_evolution/evolution = GLOB.fish_evolutions[evolution_type] + if(evolution.check_conditions(src, second_fish, aquarium)) + possible_evolutions += evolution + if(second_fish?.evolution_types) + var/secondary_evolutions = (second_fish.evolution_types - evolution_types) + for(var/evolution_type in secondary_evolutions) + var/datum/fish_evolution/evolution = GLOB.fish_evolutions[evolution_type] + if(evolution.check_conditions(second_fish, src, aquarium)) + possible_evolutions += evolution + + if(length(possible_evolutions)) + chosen_evolution = pick(possible_evolutions) + chosen_type = chosen_evolution.new_fish_type + else if(second_fish) + if(length(aquarium.tracked_fish_by_type[type]) >= stable_population) + chosen_type = second_fish.type + else + chosen_type = pick(second_fish.type, type) + else + chosen_type = type + + return create_offspring(chosen_type, second_fish, chosen_evolution) + +/obj/item/fish/proc/create_offspring(chosen_type, obj/item/fish/partner, datum/fish_evolution/evolution) + var/obj/item/fish/new_fish = new chosen_type (loc, FALSE) + //Try to pass down compatible traits based on inheritability + new_fish.inherit_traits(fish_traits, partner?.fish_traits, evolution?.new_traits, evolution?.removed_traits) + + if(partner) + var/mean_size = (size + partner.size)/2 + var/mean_weight = (weight + partner.weight)/2 + new_fish.randomize_size_and_weight(mean_size, mean_weight, 0.3, TRUE) + partner.breeding_wait = world.time + breeding_timeout + else //Make a close of this fish. + new_fish.update_size_and_weight(size, weight, TRUE) + new_fish.progenitors = initial(name) + if(partner && type != partner.type) + var/string = "[initial(name)] - [initial(partner.name)]" + new_fish.progenitors = full_capitalize(string) + else + new_fish.progenitors = full_capitalize(initial(name)) + + breeding_wait = world.time + breeding_timeout + + return new_fish #define PAUSE_BETWEEN_PHASES 15 #define PAUSE_BETWEEN_FLOPS 2 @@ -297,10 +547,11 @@ #define FLOP_SINGLE_MOVE_TIME 1.5 #define JUMP_X_DISTANCE 5 #define JUMP_Y_DISTANCE 6 -/// This animation should be applied to actual parent atom instead of vc_object. -/proc/flop_animation(atom/movable/animation_target) + +/// This flopping animation played while the fish is alive. +/obj/item/fish/proc/flop_animation() var/pause_between = PAUSE_BETWEEN_PHASES + rand(1, 5) //randomized a bit so fish are not in sync - animate(animation_target, time = pause_between, loop = -1) + animate(src, time = pause_between, loop = -1) //move nose down and up for(var/_ in 1 to FLOP_COUNT) var/matrix/up_matrix = matrix() @@ -321,6 +572,7 @@ animate(time = up_time, pixel_y = JUMP_Y_DISTANCE , pixel_x=x_step, loop = -1, flags= ANIMATION_RELATIVE, easing = BOUNCE_EASING | EASE_IN) animate(time = up_time, pixel_y = -JUMP_Y_DISTANCE, pixel_x=x_step, loop = -1, flags= ANIMATION_RELATIVE, easing = BOUNCE_EASING | EASE_OUT) animate(time = PAUSE_BETWEEN_FLOPS, loop = -1) + #undef PAUSE_BETWEEN_PHASES #undef PAUSE_BETWEEN_FLOPS #undef FLOP_COUNT @@ -331,9 +583,10 @@ /// Starts flopping animation /obj/item/fish/proc/start_flopping() - if(!flopping) //Requires update_transform/animate_wrappers to be less restrictive. - flopping = TRUE - flop_animation(src) + if(flopping) //Requires update_transform/animate_wrappers to be less restrictive. + return + flopping = TRUE + flop_animation() /// Stops flopping animation /obj/item/fish/proc/stop_flopping() @@ -348,23 +601,34 @@ /obj/item/fish/proc/refresh_flopping() if(flopping) - flop_animation(src) + flop_animation() /// Returns random fish, using random_case_rarity probabilities. -/proc/random_fish_type(case_fish_only=TRUE, required_fluid) +/proc/random_fish_type(required_fluid) var/static/probability_table - var/argkey = "fish_[required_fluid]_[case_fish_only]" //If this expands more extract bespoke element arg generation to some common helper. + var/argkey = "fish_[required_fluid]" //If this expands more extract bespoke element arg generation to some common helper. if(!probability_table || !probability_table[argkey]) if(!probability_table) probability_table = list() var/chance_table = list() for(var/_fish_type in subtypesof(/obj/item/fish)) var/obj/item/fish/fish = _fish_type - if(required_fluid && initial(fish.required_fluid_type) != required_fluid) + var/rarity = initial(fish.random_case_rarity) + if(!rarity) continue - if(initial(fish.available_in_random_cases) || !case_fish_only) - chance_table[fish] = initial(fish.random_case_rarity) + if(required_fluid) + var/init_fish_fluid_type = initial(fish.required_fluid_type) + if(!compatible_fluid_type(init_fish_fluid_type, required_fluid)) + continue + chance_table[fish] = initial(fish.random_case_rarity) probability_table[argkey] = chance_table return pick_weight(probability_table[argkey]) - +/proc/compatible_fluid_type(fish_fluid_type, fluid_type) + switch(fish_fluid_type) + if(AQUARIUM_FLUID_ANY_WATER) + return fluid_type != AQUARIUM_FLUID_AIR + if(AQUARIUM_FLUID_ANADROMOUS) + return fluid_type == AQUARIUM_FLUID_SALTWATER || fluid_type == AQUARIUM_FLUID_FRESHWATER + else + return fish_fluid_type == fluid_type diff --git a/code/modules/fishing/fish/chasm_detritus.dm b/code/modules/fishing/fish/chasm_detritus.dm index ef6674c04e4db..8d6653781595f 100644 --- a/code/modules/fishing/fish/chasm_detritus.dm +++ b/code/modules/fishing/fish/chasm_detritus.dm @@ -5,12 +5,17 @@ /// No corpses (so there's still lobstrosities because they're the main threat with this). #define NO_CORPSES "no_corpses" -/// An object which should replace itself on initialisation with something which fell into a chasm. -/obj/item/chasm_detritus - name = "chasm detritus" - desc = "Abstract concept of an object which once fell into a deep hole." - icon = 'icons/obj/objects.dmi' - icon_state = "skub" +///List containing chasm detritus singletons. +GLOBAL_LIST_INIT_TYPED(chasm_detritus_types, /datum/chasm_detritus, init_chasm_detritus()) + +/proc/init_chasm_detritus() + //as the name suggests, init_subtypes_w_path_keys doesn't init the prototype, so here we go. + var/list/glob_list = list() + glob_list[/datum/chasm_detritus] = new /datum/chasm_detritus + return init_subtypes_w_path_keys(/datum/chasm_detritus, glob_list) + +/// A datum that retrieves something which fell into a chasm. +/datum/chasm_detritus /// The chance (out of 100) to fish out something from `default_contents` /// even if there's something in GLOB.chasm_storage. var/default_contents_chance = 25 @@ -19,103 +24,85 @@ /// Stuff which you can always fish up even if nothing fell into a hole. Associative by type. var/static/list/default_contents = list( NORMAL_CONTENTS = list( - /obj/item/stack/ore/slag = 2, /obj/item/stack/sheet/bone = 3, + /obj/item/stack/ore/slag = 2, + /mob/living/basic/mining/lobstrosity/lava = 1, /obj/effect/mob_spawn/corpse/human/skeleton = 1, - /mob/living/simple_animal/hostile/asteroid/lobstrosity/lava = 1, ), BODIES_ONLY = list( /obj/effect/mob_spawn/corpse/human/skeleton = 3, - /mob/living/simple_animal/hostile/asteroid/lobstrosity/lava = 1, + /mob/living/basic/mining/lobstrosity/lava = 1, ), NO_CORPSES = list( - /obj/item/stack/ore/slag = 10, /obj/item/stack/sheet/bone = 14, - /mob/living/simple_animal/hostile/asteroid/lobstrosity/lava = 1, + /obj/item/stack/ore/slag = 10, + /mob/living/basic/mining/lobstrosity/lava = 1, ), ) -/obj/item/chasm_detritus/Initialize(mapload) - . = ..() - if (prob(default_contents_chance)) - create_default_object() - return - - var/list/chasm_stuff = find_chasm_contents() - if (!chasm_stuff.len) - create_default_object() - return - - var/atom/movable/detritus = determine_detritus(chasm_stuff) - detritus.forceMove(get_turf(src)) - qdel(src) +/datum/chasm_detritus/proc/dispense_detritus(mob/fisherman, turf/fishing_spot) + if(prob(default_contents_chance)) + var/default_spawn = pick(default_contents[default_contents_key]) + return new default_spawn(get_turf(fisherman)) + return find_chasm_contents(fishing_spot, get_turf(fisherman)) /// Returns the chosen detritus from the given list of things to choose from -/obj/item/chasm_detritus/proc/determine_detritus(list/chasm_stuff) +/datum/chasm_detritus/proc/determine_detritus(list/chasm_stuff) return pick(chasm_stuff) -/// Instantiates something in its place from the default_contents list. -/obj/item/chasm_detritus/proc/create_default_object() - var/contents_type = pick(default_contents[default_contents_key]) - new contents_type(get_turf(src)) - qdel(src) - -/// Returns a list of every object which is currently inside of a chasm. -/obj/item/chasm_detritus/proc/find_chasm_contents() - var/list/chasm_contents = list() - if (!GLOB.chasm_storage.len) - return chasm_contents +/// Returns an object which is currently inside of a nearby chasm. +/datum/chasm_detritus/proc/find_chasm_contents(turf/fishing_spot, turf/fisher_turf) + var/list/chasm_contents = get_chasm_contents(fishing_spot) - var/list/chasm_storage_resolved = recursive_list_resolve(GLOB.chasm_storage) - for (var/obj/storage as anything in chasm_storage_resolved) - for (var/thing as anything in storage.contents) - chasm_contents += thing + if(!length(chasm_contents)) + var/default_spawn = pick(default_contents[default_contents_key]) + return new default_spawn(fisher_turf) - return chasm_contents + return determine_detritus(chasm_contents) +/datum/chasm_detritus/proc/get_chasm_contents(turf/fishing_spot) + . = list() + for(var/obj/effect/abstract/chasm_storage/storage in range(5, fishing_spot)) + for (var/thing as anything in storage.contents) + . += thing /// Variant of the chasm detritus that allows for an easier time at fishing out /// bodies, and sometimes less desireable monsters too. -/obj/item/chasm_detritus/restricted +/datum/chasm_detritus/restricted /// What type do we check for in the contents of the `/obj/effect/abstract/chasm_storage` /// contained in the `GLOB.chasm_storage` global list in `find_chasm_contents()`. var/chasm_storage_restricted_type = /obj - -/obj/item/chasm_detritus/restricted/find_chasm_contents() - var/list/chasm_contents = list() - if (!GLOB.chasm_storage.len) - return chasm_contents - - var/list/chasm_storage_resolved = recursive_list_resolve(GLOB.chasm_storage) - for (var/obj/storage as anything in chasm_storage_resolved) +/datum/chasm_detritus/restricted/get_chasm_contents(turf/fishing_spot) + . = list() + for(var/obj/effect/abstract/chasm_storage/storage in range(5, fishing_spot)) for (var/thing as anything in storage.contents) if(!istype(thing, chasm_storage_restricted_type)) continue + . += thing - chasm_contents += thing - - return chasm_contents - -/// Body detritus is selected in favor of bodies belonging to sentient mobs -/// The first sentient body found in the list of contents is returned, otherwise -/// if none are sentient choose randomly. -/obj/item/chasm_detritus/restricted/bodies/determine_detritus(list/chasm_stuff) - for(var/mob/fallen_mob as anything in chasm_stuff) - if(fallen_mob.mind) - return fallen_mob - return ..() - -/obj/item/chasm_detritus/restricted/objects +/datum/chasm_detritus/restricted/objects default_contents_chance = 12.5 default_contents_key = NO_CORPSES - -/obj/item/chasm_detritus/restricted/bodies +/datum/chasm_detritus/restricted/bodies default_contents_chance = 12.5 default_contents_key = BODIES_ONLY chasm_storage_restricted_type = /mob +/// This also includes all mobs fallen into chasms, regardless of distance +/datum/chasm_detritus/restricted/bodies/get_chasm_contents(turf/fishing_spot) + . = ..() + . |= GLOB.chasm_fallen_mobs + +/// Body detritus is selected in favor of bodies belonging to sentient mobs +/// The first sentient body found in the list of contents is returned, otherwise +/// if none are sentient choose randomly. +/datum/chasm_detritus/restricted/bodies/determine_detritus(list/chasm_stuff) + for(var/mob/fallen_mob as anything in chasm_stuff) + if(fallen_mob.mind) + return fallen_mob + return ..() #undef NORMAL_CONTENTS #undef BODIES_ONLY diff --git a/code/modules/fishing/fish/fish_evolution.dm b/code/modules/fishing/fish/fish_evolution.dm new file mode 100644 index 0000000000000..c04ef2c30796d --- /dev/null +++ b/code/modules/fishing/fish/fish_evolution.dm @@ -0,0 +1,105 @@ +GLOBAL_LIST_INIT(fish_evolutions, init_subtypes_w_path_keys(/datum/fish_evolution, list())) + +/** + * Fish evolution datums + * + * If present in a fish's evolution_types list, and other conditions are met in check_conditions() + * then there's a chance the offspring may be of a new type rather than the same as its source or mate (if any). + */ +/datum/fish_evolution + var/name + var/probability = 0 + ///The obj/item/fish path of the new fish + var/obj/item/fish/new_fish_type = /obj/item/fish + ///The minimum required temperature for the evolved fish to spawn + var/required_temperature_min = MIN_AQUARIUM_TEMP + ///The maximum required temperature for the evolved fish to spawn + var/required_temperature_max = MAX_AQUARIUM_TEMP + ///A list of traits added to the new fish. These take priority over the parents' traits. + var/list/new_traits + ///If set, these traits will be removed from the new fish. + var/list/removed_traits + ///A text string shown in the catalog, containing information on conditions specific to this evolution. + var/conditions_note + +/datum/fish_evolution/New() + if(!ispath(new_fish_type, /obj/item/fish)) + stack_trace("[type] instantiated with a new fish type of [new_fish_type]. That's not a fish, hun, things will break.") + if(!name) + name = full_capitalize(initial(new_fish_type.name)) +/** + * The main proc that checks whether this can happen or not. + * Please do keep in mind a mate may not be present for fish with the + * self-reproductive trait. + */ +/datum/fish_evolution/proc/check_conditions(obj/item/fish/source, obj/item/fish/mate, obj/structure/aquarium/aquarium) + SHOULD_CALL_PARENT(TRUE) + //chances are halved if only one parent has this evolution. + var/real_probability = (mate && (type in mate.evolution_types)) ? probability : probability/2 + if(!prob(real_probability)) + return FALSE + if(!ISINRANGE(aquarium.fluid_temp, required_temperature_min, required_temperature_max)) + return FALSE + return TRUE + +///Called by the fish analyzer right click function. Returns a text string used as tooltip. +/datum/fish_evolution/proc/get_evolution_tooltip() + . = "" + if(required_temperature_min != MIN_AQUARIUM_TEMP || required_temperature_max != MAX_AQUARIUM_TEMP) + . = "An aquarium temperature between [required_temperature_min] and [required_temperature_max] is required." + if(conditions_note) + . += " [conditions_note]" + return . + +///Proc called to let evolution register signals that are needed for various conditions. +/datum/fish_evolution/proc/register_fish(obj/item/fish/fish) + return + +/datum/fish_evolution/lubefish + probability = 25 + new_fish_type = /obj/item/fish/clownfish/lube + new_traits = list(/datum/fish_trait/lubed) + conditions_note = "The fish must be fed lube beforehand." + +/datum/fish_evolution/lubefish/register_fish(obj/item/fish/fish) + RegisterSignal(fish, COMSIG_FISH_FED, PROC_REF(check_for_lube)) + +/datum/fish_evolution/lubefish/proc/check_for_lube(obj/item/fish/source, datum/reagents/fed_reagents, wrong_reagent_type) + SIGNAL_HANDLER + if((wrong_reagent_type == /datum/reagent/lube) || fed_reagents.remove_reagent(/datum/reagent/lube, 0.1)) + ADD_TRAIT(source, TRAIT_FISH_FED_LUBE, FISH_EVOLUTION) + addtimer(TRAIT_CALLBACK_REMOVE(source, TRAIT_FISH_FED_LUBE, FISH_EVOLUTION), source.feeding_frequency) + +/datum/fish_evolution/lubefish/check_conditions(obj/item/fish/source, obj/item/fish/mate, obj/structure/aquarium/aquarium) + if(!HAS_TRAIT(source, TRAIT_FISH_FED_LUBE)) + return FALSE + return ..() + +/datum/fish_evolution/purple_sludgefish + probability = 5 + new_fish_type = /obj/item/fish/sludgefish/purple + removed_traits = list(/datum/fish_trait/no_mating) + +/datum/fish_evolution/mastodon + name = "???" //The resulting fish is not shown on the catalog. + probability = 40 + new_fish_type = /obj/item/fish/mastodon + new_traits = list(/datum/fish_trait/heavy, /datum/fish_trait/amphibious, /datum/fish_trait/predator, /datum/fish_trait/aggressive) + conditions_note = "The fish (and its mate) need to be unusually big both in size and weight." + +/datum/fish_evolution/mastodon/check_conditions(obj/item/fish/source, obj/item/fish/mate, obj/structure/aquarium/aquarium) + if((source.size < 144 || source.weight < 4000) || (mate && (mate.size < 144 || mate.weight < 4000))) + return FALSE + return ..() + +/datum/fish_evolution/chasm_chrab + probability = 50 + new_fish_type = /obj/item/fish/chasm_crab + required_temperature_min = MIN_AQUARIUM_TEMP+14 + required_temperature_max = MIN_AQUARIUM_TEMP+15 + +/datum/fish_evolution/ice_chrab + probability = 50 + new_fish_type = /obj/item/fish/chasm_crab/ice + required_temperature_min = MIN_AQUARIUM_TEMP+9 + required_temperature_max = MIN_AQUARIUM_TEMP+10 diff --git a/code/modules/fishing/fish/fish_traits.dm b/code/modules/fishing/fish/fish_traits.dm new file mode 100644 index 0000000000000..63de4cfdf1dce --- /dev/null +++ b/code/modules/fishing/fish/fish_traits.dm @@ -0,0 +1,380 @@ +GLOBAL_LIST_INIT(fish_traits, init_subtypes_w_path_keys(/datum/fish_trait, list())) + +/datum/fish_trait + var/name = "Unnamed Trait" + /// Description of the trait in the fishing catalog and scanner + var/catalog_description = "Uh uh, someone has forgotten to set description to this trait. Yikes!" + ///A list of traits fish cannot have in conjunction with this trait. + var/list/incompatible_traits + /// The probability this trait can be inherited by offsprings when both mates have it + var/inheritability = 100 + /// Same as above, but for when only one has it. + var/diff_traits_inheritability = 50 + /// fishes of types within this list are granted to have this trait, no matter the probability + var/list/guaranteed_inheritance_types + /// Depending on the value, fish with trait will be reported as more or less difficult in the catalog. + var/added_difficulty = 0 + +/// Difficulty modifier from this mod, needs to return a list with two values +/datum/fish_trait/proc/difficulty_mod(obj/item/fishing_rod/rod, mob/fisherman) + SHOULD_CALL_PARENT(TRUE) //Technically it doesn't but this makes it saner without custom unit test + return list(ADDITIVE_FISHING_MOD = 0, MULTIPLICATIVE_FISHING_MOD = 1) + +/// Catch weight table modifier from this mod, needs to return a list with two values +/datum/fish_trait/proc/catch_weight_mod(obj/item/fishing_rod/rod, mob/fisherman) + SHOULD_CALL_PARENT(TRUE) + return list(ADDITIVE_FISHING_MOD = 0, MULTIPLICATIVE_FISHING_MOD = 1) + +/// Returns special minigame rules and effects applied by this trait +/datum/fish_trait/proc/minigame_mod(obj/item/fishing_rod/rod, mob/fisherman, datum/fishing_challenge/minigame) + return + +/// Applies some special qualities to the fish that has been spawned +/datum/fish_trait/proc/apply_to_fish(obj/item/fish/fish) + return + +/// Proc used by both the predator and necrophage traits. +/datum/fish_trait/proc/eat_fish(obj/item/fish/predator, obj/item/fish/prey) + predator.last_feeding = world.time + var/message = prey.status == FISH_DEAD ? "[src] eats [prey]'s carcass." : "[src] hunts down and eats [prey]." + predator.loc.visible_message(span_warning(message)) + SEND_SIGNAL(prey, COMSIG_FISH_EATEN_BY_OTHER_FISH, predator) + qdel(prey) + +/datum/fish_trait/wary + name = "Wary" + catalog_description = "This fish will avoid visible fish lines, cloaked line recommended." + +/datum/fish_trait/wary/difficulty_mod(obj/item/fishing_rod/rod, mob/fisherman) + . = ..() + // Wary fish require transparent line or they're harder + if(!rod.line || !(rod.line.fishing_line_traits & FISHING_LINE_CLOAKED)) + .[ADDITIVE_FISHING_MOD] += FISH_TRAIT_MINOR_DIFFICULTY_BOOST + +/datum/fish_trait/shiny_lover + name = "Shiny Lover" + catalog_description = "This fish loves shiny things, shiny lure recommended." + +/datum/fish_trait/shiny_lover/difficulty_mod(obj/item/fishing_rod/rod, mob/fisherman) + . = ..() + // These fish are easier to catch with shiny lure + if(rod.hook && rod.hook.fishing_hook_traits & FISHING_HOOK_SHINY) + .[ADDITIVE_FISHING_MOD] -= FISH_TRAIT_MINOR_DIFFICULTY_BOOST + +/datum/fish_trait/picky_eater + name = "Picky Eater" + catalog_description = "This fish is very picky and will ignore low quality bait." + +/datum/fish_trait/picky_eater/catch_weight_mod(obj/item/fishing_rod/rod, mob/fisherman) + . = ..() + if(!rod.bait) + .[MULTIPLICATIVE_FISHING_MOD] = 0 + return + if(HAS_TRAIT(rod.bait, OMNI_BAIT_TRAIT)) + return + if(HAS_TRAIT(rod.bait, TRAIT_GOOD_QUALITY_BAIT) || HAS_TRAIT(rod.bait, TRAIT_GREAT_QUALITY_BAIT)) + .[MULTIPLICATIVE_FISHING_MOD] = 0 + + +/datum/fish_trait/nocturnal + name = "Nocturnal" + catalog_description = "This fish avoids bright lights, fishing and storing in darkness recommended." + +/datum/fish_trait/nocturnal/catch_weight_mod(obj/item/fishing_rod/rod, mob/fisherman) + . = ..() + var/turf/turf = get_turf(fisherman) + var/light_amount = turf.get_lumcount() + if(light_amount > SHADOW_SPECIES_LIGHT_THRESHOLD) + .[MULTIPLICATIVE_FISHING_MOD] = 0 + +/datum/fish_trait/nocturnal/apply_to_fish(obj/item/fish/fish) + RegisterSignal(fish, COMSIG_FISH_LIFE, PROC_REF(check_light)) + +/datum/fish_trait/nocturnal/proc/check_light(obj/item/fish/source, seconds_per_tick) + SIGNAL_HANDLER + if(isturf(source.loc) || isaquarium(source)) + var/turf/turf = get_turf(source) + var/light_amount = turf.get_lumcount() + if(light_amount > SHADOW_SPECIES_LIGHT_THRESHOLD) + source.adjust_health(source.health - 0.5 * seconds_per_tick) + +/datum/fish_trait/heavy + name = "Heavy" + catalog_description = "This fish tends to stay near the waterbed."; + +/datum/fish_trait/heavy/minigame_mod(obj/item/fishing_rod/rod, mob/fisherman, datum/fishing_challenge/minigame) + minigame.fish_idle_velocity -= 10 + +/datum/fish_trait/carnivore + name = "Carnivore" + catalog_description = "This fish can only be baited with meat." + incompatible_traits = list(/datum/fish_trait/vegan) + +/datum/fish_trait/carnivore/catch_weight_mod(obj/item/fishing_rod/rod, mob/fisherman) + . = ..() + if(!rod.bait) + .[MULTIPLICATIVE_FISHING_MOD] = 0 + return + if(HAS_TRAIT(rod.bait, OMNI_BAIT_TRAIT)) + return + if(!istype(rod.bait, /obj/item/food)) + .[MULTIPLICATIVE_FISHING_MOD] = 0 + return + var/obj/item/food/food_bait = rod.bait + if(!(food_bait.foodtypes & MEAT)) + .[MULTIPLICATIVE_FISHING_MOD] = 0 + +/datum/fish_trait/vegan + name = "Herbivore" + catalog_description = "This fish can only be baited with fresh produce." + incompatible_traits = list(/datum/fish_trait/carnivore, /datum/fish_trait/predator, /datum/fish_trait/necrophage) + +/datum/fish_trait/vegan/catch_weight_mod(obj/item/fishing_rod/rod, mob/fisherman) + . = ..() + if(!rod.bait) + .[MULTIPLICATIVE_FISHING_MOD] = 0 + return + if(HAS_TRAIT(rod.bait, OMNI_BAIT_TRAIT)) + return + if(!istype(rod.bait, /obj/item/food/grown)) + .[MULTIPLICATIVE_FISHING_MOD] = 0 + +/datum/fish_trait/emulsijack + name = "Emulsifier" + catalog_description = "This fish emits an invisible toxin that emulsifies other fish for it to feed on." + +/datum/fish_trait/emulsijack/apply_to_fish(obj/item/fish/fish) + RegisterSignal(fish, COMSIG_FISH_LIFE, PROC_REF(emulsify)) + ADD_TRAIT(fish, TRAIT_RESIST_EMULSIFY, FISH_TRAIT_DATUM) + +/datum/fish_trait/emulsijack/proc/emulsify(obj/item/fish/source, seconds_per_tick) + SIGNAL_HANDLER + if(!isaquarium(source.loc)) + return + var/emulsified = FALSE + for(var/obj/item/fish/victim in source.loc) + if(HAS_TRAIT(victim, TRAIT_RESIST_EMULSIFY) || HAS_TRAIT(victim, TRAIT_FISH_TOXIN_IMMUNE)) //no team killing + continue + victim.adjust_health(victim.health - 3 * seconds_per_tick) //the victim may heal a bit but this will quickly kill + emulsified = TRUE + if(emulsified) + source.adjust_health(source.health + 3 * seconds_per_tick) + source.last_feeding = world.time //it feeds on the emulsion! + +/datum/fish_trait/necrophage + name = "Necrophage" + catalog_description = "This fish will eat carcasses of dead fish when hungry." + incompatible_traits = list(/datum/fish_trait/vegan) + +/datum/fish_trait/necrophage/apply_to_fish(obj/item/fish/fish) + RegisterSignal(fish, COMSIG_FISH_LIFE, PROC_REF(eat_dead_fishes)) + +/datum/fish_trait/necrophage/proc/eat_dead_fishes(obj/item/fish/source, seconds_per_tick) + SIGNAL_HANDLER + if(!source.is_hungry() || !isaquarium(source.loc)) + return + for(var/obj/item/fish/victim in source.loc) + if(victim.status != FISH_DEAD || victim == source || HAS_TRAIT(victim, TRAIT_YUCKY_FISH)) + continue + eat_fish(source, victim) + return + +/datum/fish_trait/parthenogenesis + name = "Parthenogenesis" + catalog_description = "This fish can reproduce asexually, without the need of a mate." + inheritability = 80 + diff_traits_inheritability = 25 + +/datum/fish_trait/parthenogenesis/apply_to_fish(obj/item/fish/fish) + ADD_TRAIT(fish, TRAIT_FISH_SELF_REPRODUCE, FISH_TRAIT_DATUM) + +/** + * Useful for those species with the parthenogenesis trait if you don't want them to mate with each other, + * or for similar shenanigeans, I don't know. + * Otherwise you could just set the stable_population to 1. + */ +/datum/fish_trait/no_mating + name = "Mateless" + catalog_description = "This fish cannot reproduce with other fishes." + incompatible_traits = list(/datum/fish_trait/crossbreeder) + +/datum/fish_trait/no_mating/apply_to_fish(obj/item/fish/fish) + ADD_TRAIT(fish, TRAIT_FISH_NO_MATING, FISH_TRAIT_DATUM) + +/datum/fish_trait/revival + diff_traits_inheritability = 15 + name = "Self-Revival" + catalog_description = "This fish shows a peculiar ability of reviving itself a minute or two after death." + guaranteed_inheritance_types = list(/obj/item/fish/boned, /obj/item/fish/mastodon) + +/datum/fish_trait/revival/apply_to_fish(obj/item/fish/fish) + RegisterSignal(fish, COMSIG_FISH_STATUS_CHANGED, PROC_REF(check_status)) + +/datum/fish_trait/revival/proc/check_status(obj/item/fish/source) + SIGNAL_HANDLER + if(source.status == FISH_DEAD) + addtimer(CALLBACK(src, PROC_REF(revive), source), rand(1 MINUTES, 2 MINUTES)) + +/datum/fish_trait/revival/proc/revive(obj/item/fish/source) + if(QDELETED(source) || source.status != FISH_DEAD) + return + source.set_status(FISH_ALIVE) + var/message = span_nicegreen("[source] twitches. It's alive!") + if(isaquarium(source.loc)) + source.loc.visible_message(message) + else + source.visible_message(message) + +/datum/fish_trait/predator + name = "Predator" + catalog_description = "It's a predatory fish. It'll hunt down and eat live fishes of smaller size when hungry." + incompatible_traits = list(/datum/fish_trait/vegan) + +/datum/fish_trait/predator/apply_to_fish(obj/item/fish/fish) + RegisterSignal(fish, COMSIG_FISH_LIFE, PROC_REF(eat_fishes)) + +/datum/fish_trait/predator/proc/eat_fishes(obj/item/fish/source, seconds_per_tick) + SIGNAL_HANDLER + if(!source.is_hungry() || !isaquarium(source.loc)) + return + var/obj/structure/aquarium/aquarium = source.loc + for(var/obj/item/fish/victim in aquarium.get_fishes(TRUE, source)) + if(victim.size < source.size * 0.75) // It's a big fish eat small fish world + continue + if(victim.status != FISH_ALIVE || victim == source || HAS_TRAIT(victim, TRAIT_YUCKY_FISH) || SPT_PROB(80, seconds_per_tick)) + continue + eat_fish(source, victim) + return + +/datum/fish_trait/yucky + name = "Yucky" + catalog_description = "This fish tastes so repulsive, other fishes won't try to eat it." + +/datum/fish_trait/yucky/apply_to_fish(obj/item/fish/fish) + RegisterSignal(fish, COMSIG_ATOM_PROCESSED, PROC_REF(add_yuck)) + ADD_TRAIT(fish, TRAIT_YUCKY_FISH, FISH_TRAIT_DATUM) + LAZYSET(fish.grind_results, /datum/reagent/yuck, 3) + +/datum/fish_trait/yucky/proc/add_yuck(obj/item/fish/source, mob/living/user, obj/item/process_item, list/results) + var/amount = source.grind_results[/datum/reagent/yuck] / length(results) + for(var/atom/result as anything in results) + result.reagents?.add_reagent(/datum/reagent/yuck, amount) + +/datum/fish_trait/toxic + name = "Toxic" + catalog_description = "This fish contains toxins in its liver. Feeding it to predatory fishes or people is not reccomended." + diff_traits_inheritability = 25 + +/datum/fish_trait/toxic/apply_to_fish(obj/item/fish/fish) + RegisterSignal(fish, COMSIG_ATOM_PROCESSED, PROC_REF(add_toxin)) + RegisterSignal(fish, COMSIG_FISH_EATEN_BY_OTHER_FISH, PROC_REF(on_eaten)) + LAZYSET(fish.grind_results, /datum/reagent/toxin/tetrodotoxin, 0.5) + +/datum/fish_trait/toxic/proc/add_toxin(obj/item/fish/source, mob/living/user, obj/item/process_item, list/results) + var/amount = source.grind_results[ /datum/reagent/toxin/tetrodotoxin] / length(results) + for(var/atom/result as anything in results) + result.reagents?.add_reagent( /datum/reagent/toxin/tetrodotoxin, amount) + +/datum/fish_trait/toxic/proc/on_eaten(obj/item/fish/source, obj/item/fish/predator) + if(HAS_TRAIT(predator, TRAIT_FISH_TOXIN_IMMUNE)) + return + RegisterSignal(predator, COMSIG_FISH_LIFE, PROC_REF(damage_predator), TRUE) + RegisterSignal(predator, COMSIG_FISH_STATUS_CHANGED, PROC_REF(stop_damaging), TRUE) + +/datum/fish_trait/toxic/proc/damage_predator(obj/item/fish/source, seconds_per_tick) + SIGNAL_HANDLER + source.adjust_health(source.health - 3 * seconds_per_tick) + +/datum/fish_trait/toxic/proc/stop_damaging(obj/item/fish/source) + SIGNAL_HANDLER + if(source.status == FISH_DEAD) + UnregisterSignal(source, list(COMSIG_FISH_LIFE, COMSIG_FISH_STATUS_CHANGED)) + +/datum/fish_trait/toxin_immunity + name = "Toxin Immunity" + catalog_description = "This fish has developed an ample-spected immunity to toxins." + diff_traits_inheritability = 40 + +/datum/fish_trait/toxin_immunity/apply_to_fish(obj/item/fish/fish) + ADD_TRAIT(fish, TRAIT_FISH_TOXIN_IMMUNE, FISH_TRAIT_DATUM) + +/datum/fish_trait/crossbreeder + name = "Crossbreeder" + catalog_description = "This fish's adaptive genetics allows it to crossbreed with other fish species." + inheritability = 80 + diff_traits_inheritability = 20 + incompatible_traits = list(/datum/fish_trait/no_mating) + +/datum/fish_trait/crossbreeder/apply_to_fish(obj/item/fish/fish) + ADD_TRAIT(fish, TRAIT_FISH_CROSSBREEDER, FISH_TRAIT_DATUM) + +/datum/fish_trait/aggressive + name = "Aggressive" + inheritability = 80 + diff_traits_inheritability = 40 + catalog_description = "This fish is agressively territorial, and may attack fish that come close to it." + +/datum/fish_trait/aggressive/apply_to_fish(obj/item/fish/fish) + RegisterSignal(fish, COMSIG_FISH_LIFE, PROC_REF(try_attack_fish)) + +/datum/fish_trait/aggressive/proc/try_attack_fish(obj/item/fish/source, seconds_per_tick) + SIGNAL_HANDLER + if(!isaquarium(source.loc) || !SPT_PROB(1, seconds_per_tick)) + return + var/obj/structure/aquarium/aquarium = source.loc + for(var/obj/item/fish/victim in aquarium.get_fishes(TRUE, source)) + if(victim.status != FISH_ALIVE) + continue + aquarium.visible_message(span_warning("[source] violently [pick("whips", "bites", "attacks", "slams")] [victim]")) + var/damage = round(rand(4, 20) * (source.size / victim.size)) //smaller fishes take extra damage. + victim.adjust_health(victim.health - damage) + return + +/datum/fish_trait/lubed + name = "Lubed" + inheritability = 90 + diff_traits_inheritability = 45 + guaranteed_inheritance_types = list(/obj/item/fish/clownfish/lube) + catalog_description = "This fish exudes a viscous, slippery lubrificant. It's reccomended not to step on it." + added_difficulty = 5 + +/datum/fish_trait/lubed/apply_to_fish(obj/item/fish/fish) + fish.AddComponent(/datum/component/slippery, 8 SECONDS, SLIDE|GALOSHES_DONT_HELP) + +/datum/fish_trait/lubed/minigame_mod(obj/item/fishing_rod/rod, mob/fisherman, datum/fishing_challenge/minigame) + minigame.reeling_velocity *= 1.4 + minigame.gravity_velocity *= 1.4 + +/datum/fish_trait/amphibious + name = "Amphibious" + inheritability = 80 + diff_traits_inheritability = 40 + catalog_description = "This fish has developed a primitive adaptation to life on both land and water." + +/datum/fish_trait/amphibious/apply_to_fish(obj/item/fish/fish) + ADD_TRAIT(fish, TRAIT_FISH_AMPHIBIOUS, FISH_TRAIT_DATUM) + if(fish.required_fluid_type == AQUARIUM_FLUID_AIR) + fish.required_fluid_type = AQUARIUM_FLUID_FRESHWATER + +/datum/fish_trait/mixotroph + name = "Mixotroph" + inheritability = 75 + diff_traits_inheritability = 25 + catalog_description = "This fish is capable of substaining itself by producing its own sources of energy (food)." + incompatible_traits = list(/datum/fish_trait/predator, /datum/fish_trait/necrophage) + +/datum/fish_trait/antigrav/apply_to_fish(obj/item/fish/fish) + ADD_TRAIT(fish, TRAIT_FISH_NO_HUNGER, FISH_TRAIT_DATUM) + +/datum/fish_trait/antigrav + name = "Anti-Gravity" + inheritability = 75 + diff_traits_inheritability = 25 + catalog_description = "This fish will invert the gravity of the bait at random. May fall upward outside after being caught." + added_difficulty = 15 + +/datum/fish_trait/antigrav/minigame_mod(obj/item/fishing_rod/rod, mob/fisherman, datum/fishing_challenge/minigame) + minigame.special_effects |= FISHING_MINIGAME_RULE_ANTIGRAV + +/datum/fish_trait/antigrav/apply_to_fish(obj/item/fish/fish) + fish.AddElement(/datum/element/forced_gravity, NEGATIVE_GRAVITY) diff --git a/code/modules/fishing/fish/fish_types.dm b/code/modules/fishing/fish/fish_types.dm index fe6f634fce80d..5ff62266ad9e6 100644 --- a/code/modules/fishing/fish/fish_types.dm +++ b/code/modules/fishing/fish/fish_types.dm @@ -10,6 +10,8 @@ average_size = 30 average_weight = 500 favorite_bait = list(/obj/item/food/bait/worm) + required_temperature_min = MIN_AQUARIUM_TEMP+18 + required_temperature_max = MIN_AQUARIUM_TEMP+26 /obj/item/fish/angelfish name = "angelfish" @@ -21,6 +23,9 @@ average_size = 30 average_weight = 500 stable_population = 3 + fish_traits = list(/datum/fish_trait/aggressive) + required_temperature_min = MIN_AQUARIUM_TEMP+22 + required_temperature_max = MIN_AQUARIUM_TEMP+30 /obj/item/fish/guppy name = "guppy" @@ -33,6 +38,8 @@ average_size = 30 average_weight = 500 stable_population = 6 + required_temperature_min = MIN_AQUARIUM_TEMP+20 + required_temperature_max = MIN_AQUARIUM_TEMP+28 /obj/item/fish/plasmatetra name = "plasma tetra" @@ -43,6 +50,8 @@ average_size = 30 average_weight = 500 stable_population = 3 + required_temperature_min = MIN_AQUARIUM_TEMP+20 + required_temperature_max = MIN_AQUARIUM_TEMP+28 /obj/item/fish/catfish name = "cory catfish" @@ -59,6 +68,8 @@ "Value" = JUNKFOOD ) ) + required_temperature_min = MIN_AQUARIUM_TEMP+12 + required_temperature_max = MIN_AQUARIUM_TEMP+30 // Saltwater fish below @@ -73,8 +84,22 @@ average_size = 30 average_weight = 500 stable_population = 4 + fish_traits = list(/datum/fish_trait/picky_eater) + evolution_types = list(/datum/fish_evolution/lubefish) + compatible_types = list(/obj/item/fish/clownfish/lube) + required_temperature_min = MIN_AQUARIUM_TEMP+22 + required_temperature_max = MIN_AQUARIUM_TEMP+30 - fishing_traits = list(/datum/fishing_trait/picky_eater) +/obj/item/fish/clownfish/lube + name = "lubefish" + desc = "A clownfish exposed to cherry-flavored lube for far too long. First discovered the days following a cargo incident around the seas of Europa, when thousands of thousands of thousands..." + icon_state = "lubefish" + random_case_rarity = FISH_RARITY_VERY_RARE + dedicated_in_aquarium_icon_state = "lubefish_small" + fish_traits = list(/datum/fish_trait/picky_eater, /datum/fish_trait/lubed) + evolution_types = null + compatible_types = list(/obj/item/fish/clownfish) + food = /datum/reagent/lube /obj/item/fish/cardinal name = "cardinalfish" @@ -85,7 +110,9 @@ average_size = 30 average_weight = 500 stable_population = 4 - fishing_traits = list(/datum/fishing_trait/vegan) + fish_traits = list(/datum/fish_trait/vegan) + required_temperature_min = MIN_AQUARIUM_TEMP+22 + required_temperature_max = MIN_AQUARIUM_TEMP+30 /obj/item/fish/greenchromis name = "green chromis" @@ -97,6 +124,8 @@ average_size = 30 average_weight = 500 stable_population = 5 + required_temperature_min = MIN_AQUARIUM_TEMP+23 + required_temperature_max = MIN_AQUARIUM_TEMP+28 fishing_difficulty_modifier = 5 // Bit harder @@ -112,10 +141,12 @@ stable_population = 3 disliked_bait = list(/obj/item/food/bait/worm, /obj/item/food/bait/doughball) fish_ai_type = FISH_AI_ZIPPY + required_temperature_min = MIN_AQUARIUM_TEMP+23 + required_temperature_max = MIN_AQUARIUM_TEMP+28 /obj/item/fish/pufferfish name = "pufferfish" - desc = "One Pufferfish contains enough toxins in its liver to kill 30 people." + desc = "They say that one pufferfish contains enough toxins to kill 30 people, although in the last few decades they've been genetically engineered en masse to be less poisonous." icon_state = "pufferfish" required_fluid_type = AQUARIUM_FLUID_SALTWATER sprite_width = 8 @@ -123,8 +154,10 @@ average_size = 60 average_weight = 1000 stable_population = 3 + required_temperature_min = MIN_AQUARIUM_TEMP+23 + required_temperature_max = MIN_AQUARIUM_TEMP+28 - fishing_traits = list(/datum/fishing_trait/heavy) + fish_traits = list(/datum/fish_trait/heavy, /datum/fish_trait/toxic) /obj/item/fish/lanternfish name = "lanternfish" @@ -139,8 +172,9 @@ average_size = 100 average_weight = 1500 stable_population = 3 - - fishing_traits = list(/datum/fishing_trait/nocturnal) + fish_traits = list(/datum/fish_trait/nocturnal) + required_temperature_min = MIN_AQUARIUM_TEMP+2 //My source is that the water at a depth 6600 feet is pretty darn cold. + required_temperature_max = MIN_AQUARIUM_TEMP+18 //Tiziran Fish /obj/item/fish/dwarf_moonfish @@ -152,6 +186,8 @@ fillet_type = /obj/item/food/fishmeat/moonfish average_size = 100 average_weight = 2000 + required_temperature_min = MIN_AQUARIUM_TEMP+20 + required_temperature_max = MIN_AQUARIUM_TEMP+30 /obj/item/fish/gunner_jellyfish name = "gunner jellyfish" @@ -160,6 +196,8 @@ required_fluid_type = AQUARIUM_FLUID_SALTWATER stable_population = 4 fillet_type = /obj/item/food/fishmeat/gunner_jellyfish + required_temperature_min = MIN_AQUARIUM_TEMP+24 + required_temperature_max = MIN_AQUARIUM_TEMP+32 /obj/item/fish/needlefish name = "needlefish" @@ -168,9 +206,11 @@ required_fluid_type = AQUARIUM_FLUID_SALTWATER stable_population = 12 fillet_type = null - average_size = 30 + average_size = 20 average_weight = 300 - fishing_traits = list(/datum/fishing_trait/carnivore) + fish_traits = list(/datum/fish_trait/carnivore) + required_temperature_min = MIN_AQUARIUM_TEMP+10 + required_temperature_max = MIN_AQUARIUM_TEMP+32 /obj/item/fish/armorfish name = "armorfish" @@ -180,6 +220,8 @@ stable_population = 10 fillet_type = /obj/item/food/fishmeat/armorfish fish_ai_type = FISH_AI_SLOW + required_temperature_min = MIN_AQUARIUM_TEMP+10 + required_temperature_max = MIN_AQUARIUM_TEMP+32 //Chasm fish /obj/item/fish/chasm_crab @@ -195,6 +237,30 @@ feeding_frequency = 15 MINUTES random_case_rarity = FISH_RARITY_RARE fillet_type = /obj/item/food/meat/slab/rawcrab + required_temperature_min = MIN_AQUARIUM_TEMP+9 + required_temperature_max = LAVALAND_MAX_TEMPERATURE+50 + min_pressure = HAZARD_LOW_PRESSURE + safe_air_limits = list( + /datum/gas/oxygen = list(2, 100), + /datum/gas/nitrogen, + /datum/gas/carbon_dioxide = list(0, 20), + /datum/gas/water_vapor, + /datum/gas/plasma = list(0, 5), + /datum/gas/bz = list(0, 5), + /datum/gas/miasma = list(0, 5), + ) + evolution_types = list(/datum/fish_evolution/ice_chrab) + compatible_types = list(/obj/item/fish/chasm_crab/ice) + +/obj/item/fish/chasm_crab/ice + name = "arctic chrab" + desc = "A subspecies of chasm chrabs that has adapted to the cold climate and lack of abysmal holes of the icemoon." + icon_state = "arctic_chrab" + dedicated_in_aquarium_icon_state = "ice_chrab_small" + required_temperature_min = ICEBOX_MIN_TEMPERATURE-20 + required_temperature_max = MIN_AQUARIUM_TEMP+15 + evolution_types = list(/datum/fish_evolution/chasm_chrab) + compatible_types = list(/obj/item/fish/chasm_crab) /obj/item/storage/box/fish_debug name = "box full of fish" @@ -211,28 +277,20 @@ required_fluid_type = AQUARIUM_FLUID_FRESHWATER stable_population = 4 fillet_type = /obj/item/food/fishmeat/donkfish + fish_traits = list(/datum/fish_trait/yucky) + required_temperature_min = MIN_AQUARIUM_TEMP+15 + required_temperature_max = MIN_AQUARIUM_TEMP+28 /obj/item/fish/emulsijack name = "toxic emulsijack" - desc = "Ah, the terrifying emulsijack. Created in a laboratory, this slimey, scaleless fish emits an invisible toxin that emulsifies other fish for it to feed on. Its only real use is for completely ruining a tank." + desc = "Ah, the terrifying emulsijack. Created in a laboratory, the only real use of this slimey, scaleless fish is for completely ruining a tank." icon_state = "emulsijack" random_case_rarity = FISH_RARITY_GOOD_LUCK_FINDING_THIS required_fluid_type = AQUARIUM_FLUID_ANADROMOUS stable_population = 3 - -/obj/item/fish/emulsijack/process(seconds_per_tick) - var/emulsified = FALSE - var/obj/structure/aquarium/aquarium = loc - if(istype(aquarium)) - for(var/obj/item/fish/victim in aquarium) - if(istype(victim, /obj/item/fish/emulsijack)) - continue //no team killing - victim.adjust_health((victim.health - 3) * seconds_per_tick) //the victim may heal a bit but this will quickly kill - emulsified = TRUE - if(emulsified) - adjust_health((health + 3) * seconds_per_tick) - last_feeding = world.time //emulsijack feeds on the emulsion! - ..() + fish_traits = list(/datum/fish_trait/emulsijack) + required_temperature_min = MIN_AQUARIUM_TEMP+5 + required_temperature_max = MIN_AQUARIUM_TEMP+40 /obj/item/fish/ratfish name = "ratfish" @@ -242,6 +300,9 @@ required_fluid_type = AQUARIUM_FLUID_FRESHWATER stable_population = 10 //set by New, but this is the default config value fillet_type = /obj/item/food/meat/slab/human/mutant/zombie //eww... + fish_traits = list(/datum/fish_trait/necrophage) + required_temperature_min = MIN_AQUARIUM_TEMP+15 + required_temperature_max = MIN_AQUARIUM_TEMP+35 fish_ai_type = FISH_AI_ZIPPY favorite_bait = list( @@ -255,3 +316,224 @@ . = ..() //stable pop reflects the config for how many mice migrate. powerful... stable_population = CONFIG_GET(number/mice_roundstart) + +/obj/item/fish/sludgefish + name = "sludgefish" + desc = "A misshapen, fragile, loosely fish-like living goop, the only thing that'd ever thrive in the acidic and claustrophobic cavities of the station's organic waste disposal system." + icon_state = "sludgefish" + dedicated_in_aquarium_icon_state = "sludgefish_small" + sprite_width = 7 + sprite_height = 6 + required_fluid_type = AQUARIUM_FLUID_SULPHWATEVER + stable_population = 8 + average_size = 20 + average_weight = 400 + health = 50 + breeding_timeout = 5 MINUTES + fish_traits = list(/datum/fish_trait/parthenogenesis, /datum/fish_trait/no_mating) + required_temperature_min = MIN_AQUARIUM_TEMP+10 + required_temperature_max = MIN_AQUARIUM_TEMP+40 + evolution_types = list(/datum/fish_evolution/purple_sludgefish) + +/obj/item/fish/sludgefish/purple + name = "purple sludgefish" + desc = "A misshapen, fragile, loosely fish-like living goop. This one has developed sexual reproduction mechanisms, and a purple tint to boot." + icon_state = "sludgefish_purple" + dedicated_in_aquarium_icon_state = "sludgefish_purple_small" + random_case_rarity = FISH_RARITY_NOPE + fish_traits = list(/datum/fish_trait/parthenogenesis) + +/obj/item/fish/slimefish + name = "acquatic slime" + desc = "Kids, this is what happens when a slime overcomes its hydrophobic nature. It goes glug glug." + icon_state = "slimefish" + icon_state_dead = "slimefish_dead" + dedicated_in_aquarium_icon_state = "slimefish_small" + sprite_width = 7 + sprite_height = 7 + do_flop_animation = FALSE //it already has a cute bouncy wiggle. :3 + random_case_rarity = FISH_RARITY_VERY_RARE + required_fluid_type = AQUARIUM_FLUID_ANADROMOUS + stable_population = 4 + health = 150 + fillet_type = /obj/item/slime_extract/grey + grind_results = list(/datum/reagent/toxin/slimejelly = 10) + fish_traits = list(/datum/fish_trait/toxin_immunity, /datum/fish_trait/crossbreeder) + favorite_bait = list( + list( + "Type" = "Foodtype", + "Value" = TOXIC, + ), + list( + "Type" = "Reagent", + "Value" = /datum/reagent/toxin, + "Amount" = 5, + ), + ) + required_temperature_min = MIN_AQUARIUM_TEMP+20 + +/obj/item/fish/boned + name = "unmarine bonemass" + desc = "What one could mistake for fish remains, is in reality a species that chose to discard its weak flesh a long time ago. A living fossil, in its most literal sense." + icon_state = "bonemass" + dedicated_in_aquarium_icon_state = "bonemass_small" + sprite_width = 10 + sprite_height = 7 + fish_ai_type = FISH_AI_ZIPPY + random_case_rarity = FISH_RARITY_GOOD_LUCK_FINDING_THIS + required_fluid_type = AQUARIUM_FLUID_ANY_WATER + min_pressure = HAZARD_LOW_PRESSURE + health = 150 + stable_population = 3 + grind_results = list(/datum/reagent/bone_dust = 20) + fillet_type = /obj/item/stack/sheet/bone + num_fillets = 2 + fish_traits = list(/datum/fish_trait/revival, /datum/fish_trait/carnivore) + average_size = 70 + average_weight = 2000 + death_text = "%SRC stops moving." //It's dead... or is it? + evolution_types = list(/datum/fish_evolution/mastodon) + +/obj/item/fish/mastodon + name = "unmarine mastodon" + desc = "A monster of exposed muscles and innards, wrapped in a fish-like skeleton. You don't remember ever seeing it on the catalog." + icon = 'icons/obj/aquarium_wide.dmi' + icon_state = "mastodon" + dedicated_in_aquarium_icon = 'icons/obj/aquarium.dmi' + dedicated_in_aquarium_icon_state = "mastodon_small" + base_pixel_x = -16 + pixel_x = -16 + sprite_width = 12 + sprite_height = 7 + show_in_catalog = FALSE + random_case_rarity = FISH_RARITY_NOPE + fishing_difficulty_modifier = 5 + required_fluid_type = AQUARIUM_FLUID_ANY_WATER + min_pressure = HAZARD_LOW_PRESSURE + health = 300 + stable_population = 2 //This means they can only crossbreed. + grind_results = list(/datum/reagent/bone_dust = 15, /datum/reagent/consumable/liquidgibs = 5) + fillet_type = /obj/item/stack/sheet/bone + num_fillets = 2 + feeding_frequency = 2 MINUTES + breeding_timeout = 10 MINUTES + average_size = 180 + average_weight = 5000 + death_text = "%SRC stops moving." + fish_traits = list(/datum/fish_trait/heavy, /datum/fish_trait/amphibious, /datum/fish_trait/revival, /datum/fish_trait/carnivore, /datum/fish_trait/predator, /datum/fish_trait/aggressive) + +/obj/item/fish/holo + name = "holographic goldfish" + desc = "A holographic representation of a common goldfish, slowly flickering out, removed from its holo-habitat." + icon_state = "goldfish" + show_in_catalog = FALSE + random_case_rarity = FISH_RARITY_NOPE + sprite_width = 8 + sprite_height = 8 + stable_population = 1 + average_size = 30 + average_weight = 500 + required_fluid_type = AQUARIUM_FLUID_ANADROMOUS + grind_results = null + fillet_type = null + death_text = "%SRC gently disappears." + fish_traits = list(/datum/fish_trait/no_mating) //just to be sure, these shouldn't reproduce + experisci_scannable = FALSE + +/obj/item/fish/holo/Initialize(mapload) + . = ..() + var/area/station/holodeck/holo_area = get_area(src) + if(!istype(holo_area)) + addtimer(CALLBACK(src, PROC_REF(set_status), FISH_DEAD), 1 MINUTES) + return + holo_area.linked.add_to_spawned(src) + +/obj/item/fish/holo/set_status(new_status) + . = ..() + if(status == FISH_DEAD) + animate(src, alpha = 0, 3 SECONDS, easing = SINE_EASING) + QDEL_IN(src, 3 SECONDS) + +/obj/item/fish/holo/crab + name = "holographic crab" + desc = "A holographic represantion of a soul-crushingly soulless crab, unlike the cuter ones occasionally roaming around. It stares at you, with empty, beady eyes." + icon_state = "crab" + dedicated_in_aquarium_icon_state = "crab_small" + average_weight = 1000 + sprite_height = 6 + sprite_width = 10 + +/obj/item/fish/holo/puffer + name = "holographic pufferfish" + desc ="A holographic representation of 100% safe-to-eat pufferfish... that is, if holographic fishes were even edible." + icon_state = "pufferfish" + sprite_width = 8 + sprite_height = 8 + average_size = 60 + average_weight = 1000 + +/obj/item/fish/holo/angel + name = "holographic angelfish" + desc = "A holographic representation of a angelfish. I got nothing snarky to say about this one." + icon_state = "angelfish" + dedicated_in_aquarium_icon_state = "bigfish" + sprite_height = 7 + +/obj/item/fish/holo/clown + name = "holographic clownfish" + icon_state = "holo_clownfish" + desc = "A holographic representation of a clownfish, or at least how they used to look like five centuries ago." + dedicated_in_aquarium_icon_state = "holo_clownfish_small" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + sprite_width = 8 + sprite_height = 5 + +/obj/item/fish/holo/checkered + name = "unrendered holographic fish" + desc = "A checkered silhoutte of searing purple and pitch black presents itself before your eyes, like a tear in fabric of reality. It hurts to watch." + icon_state = "checkered" //it's a meta joke, buddy. + dedicated_in_aquarium_icon_state = "checkered_small" + sprite_width = 4 + +/obj/item/fish/holo/halffish + name = "holographic half-fish" + desc = "A holographic representation of... a fish reduced to all bones, except for its head. Isn't it supposed to be dead? Ehr, holo-dead?" + icon_state = "half_fish" + dedicated_in_aquarium_icon_state = "half_fish_small" + sprite_height = 4 + sprite_width = 10 + average_size = 50 + +/obj/item/fish/starfish + name = "cosmostarfish" + desc = "A peculiar, gravity-defying, echinoderm-looking critter from hyperspace." + icon_state = "starfish" + dedicated_in_aquarium_icon_state = "starfish_small" + icon_state_dead = "starfish_dead" + sprite_width = 4 + average_size = 30 + average_weight = 300 + stable_population = 3 + required_fluid_type = AQUARIUM_FLUID_AIR + random_case_rarity = FISH_RARITY_NOPE + required_temperature_min = 0 + required_temperature_max = INFINITY + safe_air_limits = null + min_pressure = 0 + max_pressure = INFINITY + grind_results = list(/datum/reagent/bluespace = 10, /datum/reagent/consumable/liquidgibs = 5) + fillet_type = null + fish_traits = list(/datum/fish_trait/antigrav, /datum/fish_trait/mixotroph) + +/obj/item/fish/starfish/Initialize(mapload) + . = ..() + update_appearance(UPDATE_OVERLAYS) + +/obj/item/fish/starfish/update_overlays() + . = ..() + if(status == FISH_ALIVE) + . += emissive_appearance(icon, "starfish_emissive", src) + +///It spins, and dimly glows in the dark. +/obj/item/fish/starfish/flop_animation() + DO_FLOATING_ANIM(src) diff --git a/code/modules/fishing/fish_catalog.dm b/code/modules/fishing/fish_catalog.dm index 854a4080b89a4..a0f66c2227d0d 100644 --- a/code/modules/fishing/fish_catalog.dm +++ b/code/modules/fishing/fish_catalog.dm @@ -28,7 +28,7 @@ fish_data["temp_max"] = initial(fish.required_temperature_max) fish_data["icon"] = sanitize_css_class_name("[initial(fish.icon)][initial(fish.icon_state)]") fish_data["color"] = initial(fish.color) - fish_data["source"] = initial(fish.available_in_random_cases) ? "[AQUARIUM_COMPANY] Fish Packs" : "Unknown" + fish_data["source"] = initial(fish.random_case_rarity) ? "[AQUARIUM_COMPANY] Fish Packs" : "Unknown" fish_data["size"] = initial(fish.average_size) fish_data["weight"] = initial(fish.average_weight) var/datum/reagent/food_type = initial(fish.food) @@ -64,19 +64,10 @@ . = list() //// Where can it be found - iterate fish sources, how should this handle key var/list/spot_descriptions = list() - for(var/datum/fish_source/fishing_spot_type as anything in subtypesof(/datum/fish_source)) - var/datum/fish_source/temp = new fishing_spot_type - if((fish_type in temp.fish_table) && temp.catalog_description) - spot_descriptions += temp.catalog_description + for(var/datum/fish_source/source as anything in GLOB.preset_fish_sources) + if(source.catalog_description && (fish_type in source.fish_table)) + spot_descriptions += source.catalog_description .["spots"] = english_list(spot_descriptions, nothing_text = "Unknown") - ///Difficulty descriptor - switch(initial(fishy.fishing_difficulty_modifier)) - if(-INFINITY to 10) - .["difficulty"] = "Easy" - if(20 to 30) - .["difficulty"] = "Medium" - else - .["difficulty"] = "Hard" var/list/fish_list_properties = collect_fish_properties() var/list/fav_bait = fish_list_properties[fishy][NAMEOF(fishy, favorite_bait)] var/list/disliked_bait = fish_list_properties[fishy][NAMEOF(fishy, disliked_bait)] @@ -91,13 +82,23 @@ .["disliked_bait"] = english_list(bait_list, nothing_text = "None") // Fish traits description var/list/trait_descriptions = list() - var/list/fish_traits = fish_list_properties[fishy][NAMEOF(fishy, fishing_traits)] + var/list/fish_traits = fish_list_properties[fishy][NAMEOF(fishy, fish_traits)] + var/fish_difficulty = initial(fishy.fishing_difficulty_modifier) for(var/fish_trait in fish_traits) - var/datum/fishing_trait/trait = fish_trait - trait_descriptions += initial(trait.catalog_description) + var/datum/fish_trait/trait = GLOB.fish_traits[fish_trait] + trait_descriptions += trait.catalog_description + fish_difficulty += trait.added_difficulty if(!length(trait_descriptions)) trait_descriptions += "This fish exhibits no special behavior." .["traits"] = trait_descriptions + ///Difficulty descriptor + switch(fish_difficulty) + if(-INFINITY to 9) + .["difficulty"] = "Easy" + if(10 to 19) + .["difficulty"] = "Medium" + else + .["difficulty"] = "Hard" return . /obj/item/book/fish_catalog/ui_assets(mob/user) diff --git a/code/modules/fishing/fishing_equipment.dm b/code/modules/fishing/fishing_equipment.dm index a5c0619792129..3f34222ad8732 100644 --- a/code/modules/fishing/fishing_equipment.dm +++ b/code/modules/fishing/fishing_equipment.dm @@ -11,7 +11,8 @@ desc = "Simple fishing line." icon = 'icons/obj/fishing.dmi' icon_state = "reel_blue" - var/fishing_line_traits = NONE + ///A list of traits that this fishing line has, checked by fish traits and the minigame. + var/list/fishing_line_traits /// Color of the fishing line var/line_color = "#808080" @@ -59,11 +60,12 @@ icon_state = "hook" w_class = WEIGHT_CLASS_TINY - var/fishing_hook_traits = NONE + /// A list of traits that this fishing hook has, checked by fish traits and the minigame + var/list/fishing_hook_traits /// icon state added to main rod icon when this hook is equipped var/rod_overlay_icon_state = "hook_overlay" /// What subtype of `/obj/item/chasm_detritus` do we fish out of chasms? Defaults to `/obj/item/chasm_detritus`. - var/chasm_detritus_type = /obj/item/chasm_detritus + var/chasm_detritus_type = /datum/chasm_detritus /** @@ -100,7 +102,7 @@ desc = "Won't make catching fish any easier, but it might help with looking for other things." icon_state = "treasure" rod_overlay_icon_state = "hook_treasure_overlay" - chasm_detritus_type = /obj/item/chasm_detritus/restricted/objects + chasm_detritus_type = /datum/chasm_detritus/restricted/objects /obj/item/fishing_hook/magnet/get_hook_bonus_multiplicative(fish_type, datum/fish_source/source) @@ -129,7 +131,7 @@ desc = "An unwieldy hook meant to help with the rescue of those that have fallen down in chasms. You can tell there's no way you'll catch any fish with this, and that it won't be of any use outside of chasms." icon_state = "rescue" rod_overlay_icon_state = "hook_rescue_overlay" - chasm_detritus_type = /obj/item/chasm_detritus/restricted/bodies + chasm_detritus_type = /datum/chasm_detritus/restricted/bodies // This hook can only fish in chasms. @@ -150,7 +152,7 @@ /obj/item/fishing_hook/bone name = "bone hook" - desc = "a simple hook carved from sharpened bone" + desc = "A simple hook carved from sharpened bone" icon_state = "hook_bone" /datum/crafting_recipe/bone_hook @@ -160,6 +162,24 @@ time = 2 SECONDS category = CAT_TOOLS +/obj/item/fishing_hook/stabilized + name = "gyro-stabilized hook" + desc = "A quirky hook that grants the user a better control of the tool, allowing them to move the bait both and up and down when reeling in, otherwise keeping it in place." + icon_state = "gyro" + fishing_hook_traits = FISHING_HOOK_BIDIRECTIONAL + rod_overlay_icon_state = "hook_gyro_overlay" + +/obj/item/fishing_hook/stabilized/examine(mob/user) + . = ..() + . += span_notice("While fishing, you can hold the Right Mouse Button to move the bait down, rather than up.") + +/obj/item/fishing_hook/jaws + name = "jawed hook" + desc = "Despite hints of rust, this gritty beartrap-like hook hybrid manages to look even more threating than the real thing. May neptune have mercy of whatever gets caught in its jaws." + icon_state = "jaws" + fishing_hook_traits = FISHING_HOOK_NO_ESCAPE|FISHING_HOOK_NO_ESCAPE|FISHING_HOOK_KILL + rod_overlay_icon_state = "hook_jaws_overlay" + /obj/item/storage/toolbox/fishing name = "fishing toolbox" desc = "Contains everything you need for your fishing trip." @@ -170,7 +190,10 @@ /obj/item/storage/toolbox/fishing/Initialize(mapload) . = ..() // Can hold fishing rod despite the size - var/static/list/exception_cache = typecacheof(/obj/item/fishing_rod) + var/static/list/exception_cache = typecacheof( + /obj/item/fishing_rod, + /obj/item/fishing_line, + ) atom_storage.exception_hold = exception_cache /obj/item/storage/toolbox/fishing/PopulateContents() @@ -179,6 +202,22 @@ new /obj/item/fishing_hook(src) new /obj/item/fishing_line(src) +/obj/item/storage/toolbox/fishing/small + name = "compact fishing toolbox" + desc = "Contains everything you need for your fishing trip. Except for the bait." + w_class = WEIGHT_CLASS_NORMAL + force = 5 + throwforce = 5 + +/obj/item/storage/toolbox/fishing/small/Initialize(mapload) + . = ..() + atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL //It can still hold a fishing rod + +/obj/item/storage/toolbox/fishing/small/PopulateContents() + new /obj/item/fishing_rod(src) + new /obj/item/fishing_hook(src) + new /obj/item/fishing_line(src) + /obj/item/storage/box/fishing_hooks name = "fishing hook set" @@ -197,6 +236,5 @@ new /obj/item/fishing_line/reinforced(src) new /obj/item/fishing_line/cloaked(src) - #undef MAGNET_HOOK_BONUS_MULTIPLIER #undef RESCUE_HOOK_FISH_MULTIPLIER diff --git a/code/modules/fishing/fishing_minigame.dm b/code/modules/fishing/fishing_minigame.dm index 1811c4d2f170c..06ac03d64aceb 100644 --- a/code/modules/fishing/fishing_minigame.dm +++ b/code/modules/fishing/fishing_minigame.dm @@ -5,6 +5,35 @@ // UI minigame phase #define MINIGAME_PHASE 3 +/// The height of the minigame slider. Not in pixels, but minigame units. +#define FISHING_MINIGAME_AREA 1000 +/// Any lower than this, and the target position of the fish is considered null +#define FISH_TARGET_MIN_DISTANCE 6 +/// The friction applied to fish jumps, so that it decelerates over time +#define FISH_FRICTION_MULT 0.9 +/// Used to decide whether the fish can jump in a certain direction +#define FISH_SHORT_JUMP_MIN_DISTANCE 100 +/// The maximum distance for a short jump +#define FISH_SHORT_JUMP_MAX_DISTANCE 200 +// Acceleration mod when bait is over fish +#define FISH_ON_BAIT_ACCELERATION_MULT 0.6 +/// The minimum velocity required for the bait to bounce +#define BAIT_MIN_VELOCITY_BOUNCE 200 +/// The extra deceleration of velocity that happens when the bait switches direction +#define BAIT_DECELERATION_MULT 2 + +///Defines to know how the bait is moving on the minigame slider. +#define REELING_STATE_IDLE 0 +#define REELING_STATE_UP 1 +#define REELING_STATE_DOWN 2 + +///The pixel height of the minigame bar +#define MINIGAME_SLIDER_HEIGHT 76 +///The standard pixel height of the bait +#define MINIGAME_BAIT_HEIGHT 24 +///The standard pixel height of the fish (minus a pixel on each direction for the sake of a better looking sprite) +#define MINIGAME_FISH_HEIGHT 4 + /datum/fishing_challenge /// When the ui minigame phase started var/start_time @@ -13,9 +42,13 @@ /// Fish AI type to use var/fish_ai = FISH_AI_DUMB /// Rule modifiers (eg weighted bait) - var/list/special_effects = list() - /// Did the game get past the baiting phase, used to track if bait should be consumed afterwards - var/bait_taken = FALSE + var/special_effects = NONE + /// A list of possible active minigame effects. If not empty, one will be picked from time to time. + var/list/active_effects + /// The cooldown between switching active effects + COOLDOWN_DECLARE(active_effect_cd) + /// The current active effect + var/current_active_effect /// Result path var/reward_path = FISHING_DUD /// Minigame difficulty @@ -30,37 +63,141 @@ var/obj/item/fishing_rod/used_rod /// Lure visual var/obj/effect/fishing_lure/lure - /// Background image from /datum/asset/simple/fishing_minigame - var/background = "default" - - /// Max distance we can move from the spot - var/max_distance = 5 + /// Background icon state from fishing_hud.dmi + var/background = "background_default" + /// Fish icon state from fishing_hud.dmi + var/fish_icon = "fish" /// Fishing line visual var/datum/beam/fishing_line -/datum/fishing_challenge/New(atom/spot, reward_path, obj/item/fishing_rod/rod, mob/user) + var/experience_multiplier = 1 + + /// How much space the fish takes on the minigame slider + var/fish_height = 50 + /// How much space the bait takes on the minigame slider + var/bait_height = 320 + /// The height in pixels of the bait bar + var/bait_pixel_height = MINIGAME_BAIT_HEIGHT + /// The height in pixels of the fish + var/fish_pixel_height = MINIGAME_FISH_HEIGHT + /// The position of the fish on the minigame slider + var/fish_position = 0 + /// The position of the bait on the minigame slider + var/bait_position = 0 + /// The current speed the fish is moving at + var/fish_velocity = 0 + /// The current speed the bait is moving at + var/bait_velocity = 0 + + /// The completion score. If it reaches 100, it's a win. If it reaches 0, it's a loss. + var/completion = 30 + /// How much completion is lost per second when the bait area is not intersecting with the fish's + var/completion_loss = 6 + /// How much completion is gained per second when the bait area is intersecting with the fish's + var/completion_gain = 5 + + /// How likely the fish is to perform a standard jump, then multiplied by difficulty + var/short_jump_chance = 2.25 + /// How likely the fish is to perform a long jump, then multiplied by difficulty + var/long_jump_chance = 0.0625 + /// The speed limit for the short jump + var/short_jump_velocity_limit = 400 + /// The speed limit for the long jump + var/long_jump_velocity_limit = 200 + /// The current speed limit used + var/current_velocity_limit = 200 + /// The base velocity of the fish, which may affect jump distances and falling speed. + var/fish_idle_velocity = 0 + /// A position on the slider the fish wants to get to + var/target_position + /// If true, the fish can jump while a target position is set, thus overriding it + var/can_interrupt_move = TRUE + + /// Whether the bait is idle or reeling up or down (left and right click) + var/reeling_state = REELING_STATE_IDLE + /// The acceleration of the bait while not reeling + var/gravity_velocity = -800 + /// The acceleration of the bait while reeling + var/reeling_velocity = 1200 + /// By how much the bait recoils back when hitting the bounds of the slider while idle + var/bait_bounce_mult = 0.6 + + ///The background as shown in the minigame, and the holder of the other visual overlays + var/atom/movable/screen/fishing_hud/fishing_hud + +/datum/fishing_challenge/New(datum/component/fishing_spot/comp, reward_path, obj/item/fishing_rod/rod, mob/user) src.user = user src.reward_path = reward_path src.used_rod = rod - lure = new(get_turf(spot)) + var/atom/spot = comp.parent + lure = new(get_turf(spot), spot) + RegisterSignal(spot, COMSIG_QDELETING, PROC_REF(on_spot_gone)) + RegisterSignal(comp.fish_source, COMSIG_FISHING_SOURCE_INTERRUPT_CHALLENGE, PROC_REF(interrupt_challenge)) + comp.fish_source.RegisterSignal(src, COMSIG_FISHING_CHALLENGE_COMPLETED, TYPE_PROC_REF(/datum/fish_source, on_challenge_completed)) + background = comp.fish_source.background /// Fish minigame properties if(ispath(reward_path,/obj/item/fish)) var/obj/item/fish/fish = reward_path fish_ai = initial(fish.fish_ai_type) - // Apply fishing trait modifiers + switch(fish_ai) + if(FISH_AI_ZIPPY) // Keeps on jumping + short_jump_chance *= 3 + if(FISH_AI_SLOW) // Only does long jump, and doesn't change direction until it gets there + short_jump_chance = 0 + long_jump_chance = 1.5 + long_jump_velocity_limit = 150 + long_jump_velocity_limit = FALSE + // Apply fish trait modifiers var/list/fish_list_properties = collect_fish_properties() - var/list/fish_traits = fish_list_properties[fish][NAMEOF(fish, fishing_traits)] + var/list/fish_traits = fish_list_properties[fish][NAMEOF(fish, fish_traits)] for(var/fish_trait in fish_traits) - var/datum/fishing_trait/trait = new fish_trait - special_effects += trait.minigame_mod(rod, user) + var/datum/fish_trait/trait = GLOB.fish_traits[fish_trait] + trait.minigame_mod(rod, user, src) /// Enable special parameters if(rod.line) if(rod.line.fishing_line_traits & FISHING_LINE_BOUNCY) - special_effects += FISHING_MINIGAME_RULE_LIMIT_LOSS + completion_loss -= 2 if(rod.hook) if(rod.hook.fishing_hook_traits & FISHING_HOOK_WEIGHTED) - special_effects += FISHING_MINIGAME_RULE_WEIGHTED_BAIT + bait_bounce_mult = 0.1 + if(rod.hook.fishing_hook_traits & FISHING_HOOK_BIDIRECTIONAL) + special_effects |= FISHING_MINIGAME_RULE_BIDIRECTIONAL + if(rod.hook.fishing_hook_traits & FISHING_HOOK_NO_ESCAPE) + special_effects |= FISHING_MINIGAME_RULE_NO_ESCAPE + if(rod.hook.fishing_hook_traits & FISHING_HOOK_ENSNARE) + completion_loss -= 2 + if(rod.hook.fishing_hook_traits & FISHING_HOOK_KILL) + special_effects |= FISHING_MINIGAME_RULE_KILL + + if(special_effects & FISHING_MINIGAME_RULE_KILL && ispath(reward_path,/obj/item/fish)) + RegisterSignal(user, COMSIG_MOB_FISHING_REWARD_DISPENSED, PROC_REF(hurt_fish)) + + difficulty += comp.fish_source.calculate_difficulty(reward_path, rod, user, src) + difficulty = clamp(round(difficulty), 1, 100) + + if(HAS_TRAIT(user, TRAIT_REVEAL_FISH)) + fish_icon = GLOB.specific_fish_icons[reward_path] || "fish" + + /** + * If the chances are higher than 1% (100% at maximum difficulty), they'll scale + * less than proportionally (exponent less than 1) instead. + * This way we ensure fish with high jump chances won't get TOO jumpy until + * they near the maximum difficulty, at which they hit 100% + */ + var/square_angle_rad = TORADIANS(90) + var/zero_one_difficulty = difficulty/100 + if(short_jump_chance > 1) + short_jump_chance = (zero_one_difficulty**(square_angle_rad-TORADIANS(arctan(short_jump_chance * 1/square_angle_rad))))*100 + else + short_jump_chance *= difficulty + if(long_jump_chance > 1) + long_jump_chance = (zero_one_difficulty**(square_angle_rad-TORADIANS(arctan(long_jump_chance * 1/square_angle_rad))))*100 + else + long_jump_chance *= difficulty + + bait_height -= difficulty + bait_pixel_height = round(MINIGAME_BAIT_HEIGHT * (bait_height/initial(bait_height)), 1) /datum/fishing_challenge/Destroy(force, ...) if(!completed) @@ -69,13 +206,32 @@ QDEL_NULL(fishing_line) if(lure) QDEL_NULL(lure) - . = ..() + SStgui.close_uis(src) + user = null + used_rod = null + return ..() + +/datum/fishing_challenge/proc/send_alert(message) + var/turf/lure_turf = get_turf(lure) + lure_turf?.balloon_alert(user, message) + +/datum/fishing_challenge/proc/on_spot_gone(datum/source) + SIGNAL_HANDLER + send_alert("fishing spot gone!") + interrupt() + +/datum/fishing_challenge/proc/interrupt_challenge(datum/source, reason) + if(reason) + send_alert(reason) + interrupt() /datum/fishing_challenge/proc/start(mob/living/user) /// Create fishing line visuals fishing_line = used_rod.create_fishing_line(lure, target_py = 5) + active_effects = bitfield_to_list(special_effects & FISHING_MINIGAME_ACTIVE_EFFECTS) // If fishing line breaks los / rod gets dropped / deleted - RegisterSignal(fishing_line, COMSIG_FISHING_LINE_SNAPPED, PROC_REF(interrupt)) + RegisterSignal(fishing_line, COMSIG_QDELETING, PROC_REF(on_line_deleted)) + RegisterSignal(used_rod, COMSIG_ITEM_ATTACK_SELF, PROC_REF(on_attack_self)) ADD_TRAIT(user, TRAIT_GONE_FISHING, REF(src)) user.add_mood_event("fishing", /datum/mood_event/fishing) RegisterSignal(user, COMSIG_MOB_CLICKON, PROC_REF(handle_click)) @@ -83,42 +239,61 @@ to_chat(user, span_notice("You start fishing...")) playsound(lure, 'sound/effects/splash.ogg', 100) -/datum/fishing_challenge/proc/handle_click() +/datum/fishing_challenge/proc/on_line_deleted(datum/source) + SIGNAL_HANDLER + fishing_line = null + send_alert(user.is_holding(used_rod) ? "line snapped" : "rod dropped") + interrupt() + +/datum/fishing_challenge/proc/handle_click(mob/source, atom/target, modifiers) + SIGNAL_HANDLER + //You need to be holding the rod to use it. + if(!source.get_active_held_item(used_rod) || LAZYACCESS(modifiers, SHIFT_CLICK) || LAZYACCESS(modifiers, CTRL_CLICK) || LAZYACCESS(modifiers, ALT_CLICK)) + return if(phase == WAIT_PHASE) //Reset wait - lure.balloon_alert(user, "miss!") + send_alert("miss!") start_baiting_phase() else if(phase == BITING_PHASE) start_minigame_phase() return COMSIG_MOB_CANCEL_CLICKON -/datum/fishing_challenge/proc/check_distance() - SIGNAL_HANDLER - if(get_dist(user,lure) > max_distance) - interrupt() - /// Challenge interrupted by something external /datum/fishing_challenge/proc/interrupt() - SIGNAL_HANDLER if(!completed) + experience_multiplier *= 0.5 + complete(FALSE) + +/datum/fishing_challenge/proc/on_attack_self(obj/item/source, mob/user) + SIGNAL_HANDLER + INVOKE_ASYNC(src, PROC_REF(stop_fishing), source, user) + +/datum/fishing_challenge/proc/stop_fishing(obj/item/rod, mob/user) + if((phase != MINIGAME_PHASE || do_after(user, 3 SECONDS, rod)) && !QDELETED(src) && !completed) + experience_multiplier *= 0.5 + send_alert("stopped fishing") complete(FALSE) -/datum/fishing_challenge/proc/complete(win = FALSE, perfect_win = FALSE) +/datum/fishing_challenge/proc/complete(win = FALSE) + if(completed) + return deltimer(next_phase_timer) completed = TRUE + if(phase == MINIGAME_PHASE) + remove_minigame_hud() if(user) - UnregisterSignal(user, list(COMSIG_MOB_CLICKON, COMSIG_MOVABLE_MOVED)) REMOVE_TRAIT(user, TRAIT_GONE_FISHING, REF(src)) - if(used_rod) - UnregisterSignal(used_rod, COMSIG_ITEM_DROPPED) - if(phase == MINIGAME_PHASE) - used_rod.consume_bait() + if(start_time) + var/seconds_spent = (world.time - start_time) * 0.1 + if(!(special_effects & FISHING_MINIGAME_RULE_NO_EXP)) + user.mind?.adjust_experience(/datum/skill/fishing, round(seconds_spent * FISHING_SKILL_EXP_PER_SECOND * experience_multiplier)) + if(user.mind?.get_skill_level(/datum/skill/fishing) >= SKILL_LEVEL_LEGENDARY) + user.client?.give_award(/datum/award/achievement/skill/legendary_fisher, user) if(win) if(reward_path != FISHING_DUD) playsound(lure, 'sound/effects/bigsplash.ogg', 100) - else - user.balloon_alert(user, "it got away") - SEND_SIGNAL(src, COMSIG_FISHING_CHALLENGE_COMPLETED, user, win, perfect_win) - qdel(src) + SEND_SIGNAL(src, COMSIG_FISHING_CHALLENGE_COMPLETED, user, win) + if(!QDELETED(src)) + qdel(src) /datum/fishing_challenge/proc/start_baiting_phase() deltimer(next_phase_timer) @@ -134,72 +309,378 @@ phase = BITING_PHASE // Trashing animation playsound(lure, 'sound/effects/fish_splash.ogg', 100) - lure.balloon_alert(user, "!!!") + if(HAS_TRAIT(user, TRAIT_REVEAL_FISH)) + switch(fish_icon) + if(FISH_ICON_DEF) + send_alert("fish!!!") + if(FISH_ICON_HOSTILE) + send_alert("hostile!!!") + if(FISH_ICON_STAR) + send_alert("starfish!!!") + if(FISH_ICON_CHUNKY) + send_alert("round fish!!!") + if(FISH_ICON_JELLYFISH) + send_alert("jellyfish!!!") + if(FISH_ICON_SLIME) + send_alert("slime!!!") + if(FISH_ICON_COIN) + send_alert("valuable!!!") + if(FISH_ICON_GEM) + send_alert("ore!!!") + if(FISH_ICON_CRAB) + send_alert("crustacean!!!") + if(FISH_ICON_BONE) + send_alert("bones!!!") + else + send_alert("!!!") animate(lure, pixel_y = 3, time = 5, loop = -1, flags = ANIMATION_RELATIVE) animate(pixel_y = -3, time = 5, flags = ANIMATION_RELATIVE) // Setup next phase var/wait_time = rand(3 SECONDS, 6 SECONDS) next_phase_timer = addtimer(CALLBACK(src, PROC_REF(start_baiting_phase)), wait_time, TIMER_STOPPABLE) +///The damage dealt per second to the fish when FISHING_MINIGAME_RULE_KILL is active. +#define FISH_DAMAGE_PER_SECOND 2 + +///The player is no longer around to play the minigame, so we interrupt it. +/datum/fishing_challenge/proc/on_user_logout(datum/source) + SIGNAL_HANDLER + interrupt() + +/datum/fishing_challenge/proc/win_anyway() + if(!completed) + //winning by timeout or idling around shouldn't give as much experience. + experience_multiplier *= 0.5 + complete(TRUE) + +/datum/fishing_challenge/proc/hurt_fish(datum/source, obj/item/fish/reward) + SIGNAL_HANDLER + if(istype(reward)) + var/damage = CEILING((world.time - start_time)/10 * FISH_DAMAGE_PER_SECOND, 1) + reward.adjust_health(reward.health - damage) + /datum/fishing_challenge/proc/start_minigame_phase() + if(!prepare_minigame_hud()) + return phase = MINIGAME_PHASE deltimer(next_phase_timer) + if((FISHING_MINIGAME_RULE_KILL in special_effects) && ispath(reward_path,/obj/item/fish)) + var/obj/item/fish/fish = reward_path + var/wait_time = (initial(fish.health) / FISH_DAMAGE_PER_SECOND) SECONDS + addtimer(CALLBACK(src, PROC_REF(win_anyway)), wait_time) start_time = world.time - ui_interact(user) + experience_multiplier += difficulty * FISHING_SKILL_DIFFIULTY_EXP_MULT -/datum/fishing_challenge/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "Fishing") - ui.set_autoupdate(FALSE) - ui.set_mouse_hook(TRUE) - ui.open() +#undef FISH_DAMAGE_PER_SECOND -/datum/fishing_challenge/ui_host(mob/user) - return lure //Could be the target really +///Initialize the minigame hud and register some signals to make it work. +/datum/fishing_challenge/proc/prepare_minigame_hud() + if(!user.client || user.incapacitated()) + return FALSE + . = TRUE + fishing_hud = new + fishing_hud.prepare_minigame(src) + RegisterSignal(user.client, COMSIG_CLIENT_MOUSEDOWN, PROC_REF(start_reeling)) + RegisterSignal(user.client, COMSIG_CLIENT_MOUSEUP, PROC_REF(stop_reeling)) + RegisterSignal(user, COMSIG_MOB_LOGOUT, PROC_REF(on_user_logout)) + if(length(active_effects)) + // Give the player a moment to prepare for active minigame effects + COOLDOWN_START(src, active_effect_cd, rand(5, 9) SECONDS) + START_PROCESSING(SSfishing, src) -// Manually closing the ui is treated as lose -/datum/fishing_challenge/ui_close(mob/user) - . = ..() - if(!completed) - complete(FALSE) +///Stop processing and remove references to the minigame hud +/datum/fishing_challenge/proc/remove_minigame_hud() + STOP_PROCESSING(SSfishing, src) + QDEL_NULL(fishing_hud) -/datum/fishing_challenge/ui_static_data(mob/user) - . = ..() - .["difficulty"] = max(1,min(difficulty,100)) - .["fish_ai"] = fish_ai - .["special_effects"] = special_effects - .["background_image"] = background - -/datum/fishing_challenge/ui_assets(mob/user) - return list(get_asset_datum(/datum/asset/simple/fishing_minigame)) //preset screens - -/datum/fishing_challenge/ui_status(mob/user, datum/ui_state/state) - return min( - get_dist(user, lure) > max_distance ? UI_CLOSE : UI_INTERACTIVE, - ui_status_user_has_free_hands(user), - ui_status_user_is_abled(user, lure), - ) - -/datum/fishing_challenge/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - if(.) +///While the mouse button is held down, the bait will be reeling up (or down on r-click if the bidirectional rule is enabled) +/datum/fishing_challenge/proc/start_reeling(client/source, datum/object, location, control, params) + SIGNAL_HANDLER + var/bidirectional = special_effects & FISHING_MINIGAME_RULE_BIDIRECTIONAL + var/list/modifiers = params2list(params) + if(bidirectional && LAZYACCESS(modifiers, RIGHT_CLICK)) + reeling_state = REELING_STATE_DOWN + else + reeling_state = REELING_STATE_UP + +///Reset the reeling state to idle once the mouse button is released +/datum/fishing_challenge/proc/stop_reeling(client/source, datum/object, location, control, params) + SIGNAL_HANDLER + reeling_state = REELING_STATE_IDLE + +///Update the state of the fish, the bait and the hud +/datum/fishing_challenge/process(seconds_per_tick) + if(length(active_effects) && COOLDOWN_FINISHED(src, active_effect_cd)) + select_active_effect() + move_fish(seconds_per_tick) + move_bait(seconds_per_tick) + if(!QDELETED(fishing_hud)) + update_visuals() + +///The proc that handles fancy effects like flipping the hud or skewing movement +/datum/fishing_challenge/proc/select_active_effect() + ///bring forth an active effect + if(isnull(current_active_effect)) + current_active_effect = pick(active_effects) + switch(current_active_effect) + if(FISHING_MINIGAME_RULE_ANTIGRAV) + fishing_hud.icon_state = "background_antigrav" + SEND_SOUND(user, sound('sound/effects/arcade_jump.ogg', volume = 50)) + COOLDOWN_START(src, active_effect_cd, rand(6, 9) SECONDS) + if(FISHING_MINIGAME_RULE_FLIP) + fishing_hud.icon_state = "background_flip" + fishing_hud.transform = fishing_hud.transform.Scale(1, -1) + SEND_SOUND(user, sound('sound/effects/boing.ogg')) + COOLDOWN_START(src, active_effect_cd, rand(5, 6) SECONDS) return - if(phase != MINIGAME_PHASE) + ///go back to normal + switch(current_active_effect) + if(FISHING_MINIGAME_RULE_ANTIGRAV) + var/sound/inverted_sound = sound('sound/effects/arcade_jump.ogg', volume = 50) + inverted_sound.frequency = -1 + SEND_SOUND(user, inverted_sound) + COOLDOWN_START(src, active_effect_cd, rand(10, 13) SECONDS) + if(FISHING_MINIGAME_RULE_FLIP) + fishing_hud.transform = fishing_hud.transform.Scale(1, -1) + COOLDOWN_START(src, active_effect_cd, rand(8, 12) SECONDS) + + fishing_hud.icon_state = background + current_active_effect = null + +///The proc that moves the fish around, just like in the old TGUI, mostly. +/datum/fishing_challenge/proc/move_fish(seconds_per_tick) + var/long_chance = long_jump_chance * seconds_per_tick * 10 + var/short_chance = short_jump_chance * seconds_per_tick * 10 + + // If we have the target but we're close enough, mark as target reached + if(abs(target_position - fish_position) < FISH_TARGET_MIN_DISTANCE) + target_position = null + + // Switching to new long jump target can interrupt any other + if((can_interrupt_move || isnull(target_position)) && prob(long_chance)) + /** + * Move at least 0.75 to full of the availible bar in given direction, + * and more likely to move in the direction where there's more space + */ + var/distance_from_top = FISHING_MINIGAME_AREA - fish_position - fish_height + var/distance_from_bottom = fish_position + var/top_chance + if(distance_from_top < FISH_SHORT_JUMP_MIN_DISTANCE) + top_chance = 0 + else + top_chance = (distance_from_top/max(distance_from_bottom, 1)) * 100 + var/new_target = fish_position + if(prob(top_chance)) + new_target += distance_from_top * rand(75, 100)/100 + else + new_target -= distance_from_bottom * rand(75, 100)/100 + target_position = round(new_target) + current_velocity_limit = long_jump_velocity_limit + + // Move towards target + if(!isnull(target_position)) + var/distance = target_position - fish_position + // about 5 at diff 15 , 10 at diff 30, 30 at diff 100 + var/acceleration_mult = 0.3 * difficulty + 0.5 + var/target_acceleration = distance * acceleration_mult * seconds_per_tick + + fish_velocity = fish_velocity * FISH_FRICTION_MULT + target_acceleration + else if(prob(short_chance)) + var/distance_from_top = FISHING_MINIGAME_AREA - fish_position - fish_height + var/distance_from_bottom = fish_position + var/jump_length + if(distance_from_top >= FISH_SHORT_JUMP_MIN_DISTANCE) + jump_length = rand(FISH_SHORT_JUMP_MIN_DISTANCE, FISH_SHORT_JUMP_MAX_DISTANCE) + if(distance_from_bottom >= FISH_SHORT_JUMP_MIN_DISTANCE && (!jump_length || prob(50))) + jump_length = -rand(FISH_SHORT_JUMP_MIN_DISTANCE, FISH_SHORT_JUMP_MAX_DISTANCE) + target_position = clamp(fish_position + jump_length, 0, FISHING_MINIGAME_AREA - fish_height) + current_velocity_limit = short_jump_velocity_limit + + fish_velocity = clamp(fish_velocity + fish_idle_velocity, -current_velocity_limit, current_velocity_limit) + fish_position = clamp(fish_position + fish_velocity * seconds_per_tick, 0, FISHING_MINIGAME_AREA - fish_height) + +///The proc that moves the bait around, just like in the old TGUI, mostly. +/datum/fishing_challenge/proc/move_bait(seconds_per_tick) + var/should_bounce = abs(bait_velocity) > BAIT_MIN_VELOCITY_BOUNCE + bait_position += bait_velocity * seconds_per_tick + // Hitting the top bound + if(bait_position > FISHING_MINIGAME_AREA - bait_height) + bait_position = FISHING_MINIGAME_AREA - bait_height + if(reeling_state == REELING_STATE_UP || !should_bounce) + bait_velocity = 0 + else + bait_velocity = -bait_velocity * bait_bounce_mult + // Hitting rock bottom + else if(bait_position < 0) + bait_position = 0 + if(reeling_state == REELING_STATE_DOWN || !should_bounce) + bait_velocity = 0 + else + bait_velocity = -bait_velocity * bait_bounce_mult + + var/fish_on_bait = (fish_position + fish_height >= bait_position) && (bait_position + bait_height >= fish_position) + + var/bidirectional = special_effects & FISHING_MINIGAME_RULE_BIDIRECTIONAL + + var/velocity_change + switch(reeling_state) + if(REELING_STATE_UP) + velocity_change = reeling_velocity + if(REELING_STATE_DOWN) + velocity_change = -reeling_velocity + if(REELING_STATE_IDLE) + if(!bidirectional || bait_velocity > 0) + velocity_change = gravity_velocity + else + velocity_change = -gravity_velocity + velocity_change *= (fish_on_bait ? FISH_ON_BAIT_ACCELERATION_MULT : 1) * seconds_per_tick + + velocity_change = round(velocity_change) + + if(current_active_effect == FISHING_MINIGAME_RULE_ANTIGRAV) + velocity_change = -velocity_change + + /** + * Pull the brake on the velocity if the current velocity and the acceleration + * have different directions, making the bait less slippery, thus easier to control + */ + if(bait_velocity > 0 && velocity_change < 0) + bait_velocity += max(-bait_velocity, velocity_change * BAIT_DECELERATION_MULT) + else if(bait_velocity < 0 && velocity_change > 0) + bait_velocity += min(-bait_velocity, velocity_change * BAIT_DECELERATION_MULT) + + ///bidirectional baits stay bouyant while idle + if(bidirectional && reeling_state == REELING_STATE_IDLE) + if(velocity_change < 0) + bait_velocity = max(bait_velocity + velocity_change, 0) + else if(velocity_change > 0) + bait_velocity = min(bait_velocity + velocity_change, 0) + else + bait_velocity += velocity_change + + //check that the fish area is still intersecting the bait now that it has moved + fish_on_bait = (fish_position + fish_height >= bait_position) && (bait_position + bait_height >= fish_position) + + if(fish_on_bait) + completion += completion_gain * seconds_per_tick + if(completion >= 100) + complete(TRUE) + else + completion -= completion_loss * seconds_per_tick + if(completion <= 0 && !(special_effects & FISHING_MINIGAME_RULE_NO_ESCAPE)) + user.balloon_alert(user, "it got away!") + complete(FALSE) + + completion = clamp(completion, 0, 100) + +///update the vertical pixel position of both fish and bait, and the icon state of the completion bar +/datum/fishing_challenge/proc/update_visuals() + var/bait_offset_mult = bait_position/FISHING_MINIGAME_AREA + fishing_hud.hud_bait.pixel_y = round(MINIGAME_SLIDER_HEIGHT * bait_offset_mult, 1) + var/fish_offset_mult = fish_position/FISHING_MINIGAME_AREA + fishing_hud.hud_fish.pixel_y = round(MINIGAME_SLIDER_HEIGHT * fish_offset_mult, 1) + fishing_hud.hud_completion.icon_state = "completion_[FLOOR(completion, 5)]" + +///The screen object which bait, fish, and completion bar are visually attached to. +/atom/movable/screen/fishing_hud + icon = 'icons/hud/fishing_hud.dmi' + screen_loc = "CENTER+1:8,CENTER:2" + name = "fishing minigame" + appearance_flags = APPEARANCE_UI|KEEP_TOGETHER + alpha = 230 + ///The fish as shown in the minigame + var/atom/movable/screen/hud_fish/hud_fish + ///The bait as shown in the minigame + var/atom/movable/screen/hud_bait/hud_bait + ///The completion bar as shown in the minigame + var/atom/movable/screen/hud_completion/hud_completion + +///Initialize bait, fish and completion bar and add them to the visual appearance of this screen object. +/atom/movable/screen/fishing_hud/proc/prepare_minigame(datum/fishing_challenge/challenge) + icon_state = challenge.background + add_overlay("frame") + hud_bait = new(null, null, challenge) + hud_fish = new(null, null, challenge) + hud_completion = new(null, null, challenge) + vis_contents += list(hud_bait, hud_fish, hud_completion) + challenge.user.client.screen += src + +/atom/movable/screen/fishing_hud/Destroy() + QDEL_NULL(hud_fish) + QDEL_NULL(hud_bait) + QDEL_NULL(hud_completion) + return ..() + +/atom/movable/screen/hud_bait + icon = 'icons/hud/fishing_hud.dmi' + icon_state = "bait" + vis_flags = VIS_INHERIT_ID + +/atom/movable/screen/hud_bait/Initialize(mapload, datum/hud/hud_owner, datum/fishing_challenge/challenge) + . = ..() + if(!challenge || challenge.bait_pixel_height == MINIGAME_BAIT_HEIGHT) return + var/static/icon_height + if(!icon_height) + var/list/icon_dimensions = get_icon_dimensions(icon) + icon_height = icon_dimensions["height"] + var/height_percent_diff = challenge.bait_pixel_height/MINIGAME_BAIT_HEIGHT + transform = transform.Scale(1, height_percent_diff) + pixel_z = -icon_height * (1 - height_percent_diff) * 0.5 - switch(action) - if("win") - complete(win = TRUE, perfect_win = params["perfect"]) - if("lose") - complete(win = FALSE) +/atom/movable/screen/hud_fish + icon = 'icons/hud/fishing_hud.dmi' + icon_state = "fish" + vis_flags = VIS_INHERIT_ID + +/atom/movable/screen/hud_fish/Initialize(mapload, datum/hud/hud_owner, datum/fishing_challenge/challenge) + . = ..() + if(challenge) + icon_state = challenge.fish_icon + +/atom/movable/screen/hud_completion + icon = 'icons/hud/fishing_hud.dmi' + icon_state = "completion_0" + vis_flags = VIS_INHERIT_ID + +/atom/movable/screen/hud_completion/Initialize(mapload, datum/hud/hud_owner, datum/fishing_challenge/challenge) + . = ..() + if(challenge) + icon_state = "completion_[FLOOR(challenge.completion, 5)]" /// The visual that appears over the fishing spot /obj/effect/fishing_lure icon = 'icons/obj/fishing.dmi' icon_state = "lure_idle" +/obj/effect/fishing_lure/Initialize(mapload, atom/spot) + . = ..() + if(ismovable(spot)) // we want the lure and therefore the fishing line to stay connected with the fishing spot. + RegisterSignal(spot, COMSIG_MOVABLE_MOVED, PROC_REF(follow_movable)) + +/obj/effect/fishing_lure/proc/follow_movable(atom/movable/source) + set_glide_size(source.glide_size) + forceMove(source.loc) + #undef WAIT_PHASE #undef BITING_PHASE #undef MINIGAME_PHASE + +#undef FISHING_MINIGAME_AREA +#undef FISH_TARGET_MIN_DISTANCE +#undef FISH_FRICTION_MULT +#undef FISH_SHORT_JUMP_MIN_DISTANCE +#undef FISH_SHORT_JUMP_MAX_DISTANCE +#undef FISH_ON_BAIT_ACCELERATION_MULT +#undef BAIT_MIN_VELOCITY_BOUNCE +#undef BAIT_DECELERATION_MULT + +#undef MINIGAME_SLIDER_HEIGHT +#undef MINIGAME_BAIT_HEIGHT +#undef MINIGAME_FISH_HEIGHT + +#undef REELING_STATE_IDLE +#undef REELING_STATE_UP +#undef REELING_STATE_DOWN + diff --git a/code/modules/fishing/fishing_portal_machine.dm b/code/modules/fishing/fishing_portal_machine.dm index 3fc6b0eb938a6..b156a37ba0550 100644 --- a/code/modules/fishing/fishing_portal_machine.dm +++ b/code/modules/fishing/fishing_portal_machine.dm @@ -1,40 +1,58 @@ /obj/machinery/fishing_portal_generator name = "fish-porter 3000" - desc = "fishing anywhere, anytime, anyway what was i talking about" - + desc = "Fishing anywhere, anytime... anyway what was I talking about?" icon = 'icons/obj/fishing.dmi' - icon_state = "portal_off" - + icon_state = "portal" idle_power_usage = 0 active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - anchored = FALSE density = TRUE + circuit = /obj/item/circuitboard/machine/fishing_portal_generator - var/fishing_source = /datum/fish_source/portal + ///The current fishing spot loaded in var/datum/component/fishing_spot/active +/obj/machinery/fishing_portal_generator/on_set_panel_open() + update_appearance() + return ..() + /obj/machinery/fishing_portal_generator/wrench_act(mob/living/user, obj/item/tool) . = ..() default_unfasten_wrench(user, tool) return TOOL_ACT_TOOLTYPE_SUCCESS +/obj/machinery/fishing_portal_generator/examine(mob/user) + . = ..() + . += span_notice("You can unlock further portal settings by completing fish scanning experiments.") + +/obj/machinery/fishing_portal_generator/emag_act(mob/user, obj/item/card/emag/emag_card) + if(obj_flags & EMAGGED) + return FALSE + obj_flags |= EMAGGED + balloon_alert(user, "syndicate setting loaded") + playsound(src, SFX_SPARKS, 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + return TRUE + /obj/machinery/fishing_portal_generator/interact(mob/user, special_state) . = ..() if(active) deactivate() else - activate() + select_fish_source(user) -/obj/machinery/fishing_portal_generator/update_icon(updates) +/obj/machinery/fishing_portal_generator/update_overlays() . = ..() - if(active) - icon_state = "portal_on" - else - icon_state = "portal_off" + if(panel_open) + . += "portal_open" + if(!active) + return + . += "portal_on" + var/datum/fish_source/portal/portal = active.fish_source + . += portal.overlay_state + . += emissive_appearance(icon, "portal_emissive", src) -/obj/machinery/fishing_portal_generator/proc/activate() - active = AddComponent(/datum/component/fishing_spot, fishing_source) +/obj/machinery/fishing_portal_generator/proc/activate(datum/fish_source/selected_source) + active = AddComponent(/datum/component/fishing_spot, selected_source) use_power = ACTIVE_POWER_USE update_icon() @@ -46,3 +64,39 @@ /obj/machinery/fishing_portal_generator/on_set_is_operational(old_value) if(old_value) deactivate() + +///Create a radial menu from a list of available fish sources. If only the default is available, activate it right away. +/obj/machinery/fishing_portal_generator/proc/select_fish_source(mob/user) + var/datum/fish_source/portal/default = GLOB.preset_fish_sources[/datum/fish_source/portal] + var/list/available_fish_sources = list(default.radial_name = default) + if(obj_flags & EMAGGED) + var/datum/fish_source/portal/syndicate = GLOB.preset_fish_sources[/datum/fish_source/portal/syndicate] + available_fish_sources[syndicate.radial_name] = syndicate + for (var/datum/techweb/techweb as anything in SSresearch.techwebs) + var/get_fish_sources = FALSE + for(var/obj/machinery/rnd/server/server as anything in techweb.techweb_servers) + if(!is_valid_z_level(get_turf(server), get_turf(src))) + continue + get_fish_sources = TRUE + break + if(!get_fish_sources) + continue + for(var/experiment_type in typesof(/datum/experiment/scanning/fish)) + var/datum/experiment/scanning/fish/experiment = techweb.completed_experiments[experiment_type] + if(!experiment) + continue + var/datum/fish_source/portal/reward = GLOB.preset_fish_sources[experiment.fish_source_reward] + available_fish_sources[reward.radial_name] = reward + + if(length(available_fish_sources) == 1) + activate(default) + return + var/list/choices = list() + for(var/radial_name in available_fish_sources) + var/datum/fish_source/portal/source = available_fish_sources[radial_name] + choices[radial_name] = image(icon = 'icons/hud/radial_fishing.dmi', icon_state = source.radial_state) + + var/choice = show_radial_menu(user, src, choices, radius = 38, custom_check = CALLBACK(src, TYPE_PROC_REF(/atom, can_interact), user), tooltips = TRUE) + if(!choice || !can_interact(user)) + return + activate(available_fish_sources[choice]) diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm index d34c04ac118fa..1abba8e414cb0 100644 --- a/code/modules/fishing/fishing_rod.dm +++ b/code/modules/fishing/fishing_rod.dm @@ -30,20 +30,22 @@ var/obj/item/currently_hooked_item /// Fishing line visual for the hooked item - var/datum/beam/hooked_item_fishing_line + var/datum/beam/fishing_line/fishing_line /// Are we currently casting var/casting = FALSE - /// List of fishing line beams - var/list/fishing_lines = list() - + /// The default color for the reel overlay if no line is equipped. var/default_line_color = "gray" + ///The name of the icon state of the reel overlay + var/reel_overlay = "reel_overlay" + /obj/item/fishing_rod/Initialize(mapload) . = ..() register_context() register_item_context() + update_appearance() /obj/item/fishing_rod/add_context(atom/source, list/context, obj/item/held_item, mob/user) if(src == held_item) @@ -61,10 +63,22 @@ return NONE /obj/item/fishing_rod/Destroy(force) - . = ..() - //Remove any leftover fishing lines - QDEL_LIST(fishing_lines) + return ..() +/obj/item/fishing_rod/examine(mob/user) + . = ..() + var/list/equipped_stuff = list() + if(line) + equipped_stuff += "[icon2html(line, user)] [line.name]" + if(hook) + equipped_stuff += "[icon2html(hook, user)] [hook.name]" + if(length(equipped_stuff)) + . += span_notice("It has \a [english_list(equipped_stuff)] equipped.") + if(bait) + . += span_notice("\a [icon2html(bait, user)] [bait] is being used as bait.") + else + . += span_warning("It doesn't have any bait attached. Fishing will be more tedious!") + . += span_notice("Right-Click in your active hand to access its slots UI") /** * Catch weight modifier for the given fish_type (or FISHING_DUD) @@ -96,16 +110,20 @@ * * target_fish_source - The /datum/fish_source we're trying to fish in. */ /obj/item/fishing_rod/proc/reason_we_cant_fish(datum/fish_source/target_fish_source) - if(!hook) - return null + return hook?.reason_we_cant_fish(target_fish_source) - return hook.reason_we_cant_fish(target_fish_source) - - -/obj/item/fishing_rod/proc/consume_bait() - if(bait) - QDEL_NULL(bait) - update_icon() +/obj/item/fishing_rod/proc/consume_bait(atom/movable/reward) + // catching things that aren't fish or alive mobs doesn't consume baits. + if(isnull(reward) || isnull(bait)) + return + if(isliving(reward)) + var/mob/living/caught_mob = reward + if(caught_mob.stat == DEAD) + return + else if(!isfish(reward)) + return + QDEL_NULL(bait) + update_icon() /obj/item/fishing_rod/interact(mob/user) if(currently_hooked_item) @@ -117,7 +135,7 @@ // Should probably respect and used force move later step_towards(currently_hooked_item, get_turf(src)) if(get_dist(currently_hooked_item,get_turf(src)) < 1) - clear_hooked_item() + QDEL_NULL(fishing_line) /obj/item/fishing_rod/attack_self_secondary(mob/user, modifiers) . = ..() @@ -136,30 +154,28 @@ var/mob/user = loc if(!istype(user)) return + if(fishing_line) + QDEL_NULL(fishing_line) var/beam_color = line?.line_color || default_line_color - var/datum/beam/fishing_line/fishing_line_beam = new(user, target, icon_state = "fishing_line", beam_color = beam_color, override_target_pixel_y = target_py) - fishing_line_beam.lefthand = user.get_held_index_of_item(src) % 2 == 1 - RegisterSignal(fishing_line_beam, COMSIG_BEAM_BEFORE_DRAW, PROC_REF(check_los)) - RegisterSignal(fishing_line_beam, COMSIG_QDELETING, PROC_REF(clear_line)) - fishing_lines += fishing_line_beam - INVOKE_ASYNC(fishing_line_beam, TYPE_PROC_REF(/datum/beam/, Start)) + fishing_line = new(user, target, icon_state = "fishing_line", beam_color = beam_color, emissive = FALSE, override_target_pixel_y = target_py) + fishing_line.lefthand = user.get_held_index_of_item(src) % 2 == 1 + RegisterSignal(fishing_line, COMSIG_BEAM_BEFORE_DRAW, PROC_REF(check_los)) + RegisterSignal(fishing_line, COMSIG_QDELETING, PROC_REF(clear_line)) + INVOKE_ASYNC(fishing_line, TYPE_PROC_REF(/datum/beam/, Start)) user.update_held_items() - return fishing_line_beam + return fishing_line /obj/item/fishing_rod/proc/clear_line(datum/source) SIGNAL_HANDLER - fishing_lines -= source if(ismob(loc)) var/mob/user = loc user.update_held_items() + fishing_line = null + currently_hooked_item = null /obj/item/fishing_rod/dropped(mob/user, silent) . = ..() - if(currently_hooked_item) - clear_hooked_item() - for(var/datum/beam/fishing_line in fishing_lines) - SEND_SIGNAL(fishing_line, COMSIG_FISHING_LINE_SNAPPED) - QDEL_LIST(fishing_lines) + QDEL_NULL(fishing_line) /// Hooks the item /obj/item/fishing_rod/proc/hook_item(mob/user, atom/target_atom) @@ -168,28 +184,21 @@ if(!can_be_hooked(target_atom)) return currently_hooked_item = target_atom - hooked_item_fishing_line = create_fishing_line(target_atom) - RegisterSignal(hooked_item_fishing_line, COMSIG_FISHING_LINE_SNAPPED, PROC_REF(clear_hooked_item)) + create_fishing_line(target_atom) + SEND_SIGNAL(src, COMSIG_FISHING_ROD_HOOKED_ITEM, target_atom, user) /// Checks what can be hooked /obj/item/fishing_rod/proc/can_be_hooked(atom/movable/target) // Could be made dependent on actual hook, ie magnet to hook metallic items return isitem(target) -/obj/item/fishing_rod/proc/clear_hooked_item() - SIGNAL_HANDLER - - if(!QDELETED(hooked_item_fishing_line)) - QDEL_NULL(hooked_item_fishing_line) - currently_hooked_item = null - // Checks fishing line for interruptions and range /obj/item/fishing_rod/proc/check_los(datum/beam/source) SIGNAL_HANDLER . = NONE if(!CheckToolReach(src, source.target, cast_range)) - SEND_SIGNAL(source, COMSIG_FISHING_LINE_SNAPPED) //Stepped out of range or los interrupted + qdel(source) return BEAM_CANCEL_DRAW /obj/item/fishing_rod/afterattack(atom/target, mob/user, proximity_flag, click_parameters) @@ -201,23 +210,27 @@ reel(user) return . - /// If the line to whatever that is is clear and we're not already busy, try fishing in it - if(!casting && !currently_hooked_item && !proximity_flag && CheckToolReach(user, target, cast_range)) - /// Annoyingly pre attack is only called in melee - SEND_SIGNAL(target, COMSIG_PRE_FISHING) - casting = TRUE - var/obj/projectile/fishing_cast/cast_projectile = new(get_turf(src)) - cast_projectile.range = cast_range - cast_projectile.owner = src - cast_projectile.original = target - cast_projectile.fired_from = src - cast_projectile.firer = user - cast_projectile.impacted = list(user = TRUE) - cast_projectile.preparePixelProjectile(target, user) - cast_projectile.fire() + cast_line(target, user, proximity_flag) return . +///Called by afterattack(). If the line to whatever that is is clear and we're not already busy, try fishing in it +/obj/item/fishing_rod/proc/cast_line(atom/target, mob/user, proximity_flag) + if(casting || currently_hooked_item || proximity_flag || !CheckToolReach(user, target, cast_range)) + return + /// Annoyingly pre attack is only called in melee + SEND_SIGNAL(target, COMSIG_PRE_FISHING) + casting = TRUE + var/obj/projectile/fishing_cast/cast_projectile = new(get_turf(src)) + cast_projectile.range = cast_range + cast_projectile.owner = src + cast_projectile.original = target + cast_projectile.fired_from = src + cast_projectile.firer = user + cast_projectile.impacted = list(user = TRUE) + cast_projectile.preparePixelProjectile(target, user) + cast_projectile.fire() + /// Called by hook projectile when hitting things /obj/item/fishing_rod/proc/hook_hit(atom/atom_hit_by_hook_projectile) var/mob/user = loc @@ -237,19 +250,22 @@ /obj/item/fishing_rod/update_overlays() . = ..() + . += get_fishing_overlays() + +/obj/item/fishing_rod/proc/get_fishing_overlays() + . = list() var/line_color = line?.line_color || default_line_color /// Line part by the rod, always visible - var/mutable_appearance/reel_overlay = mutable_appearance(icon, "reel_overlay") - reel_overlay.color = line_color; - . += reel_overlay + var/mutable_appearance/reel_appearance = mutable_appearance(icon, reel_overlay) + reel_appearance.color = line_color + . += reel_appearance // Line & hook is also visible when only bait is equipped but it uses default appearances then if(hook || bait) var/mutable_appearance/line_overlay = mutable_appearance(icon, "line_overlay") - line_overlay.color = line_color; + line_overlay.color = line_color . += line_overlay - var/mutable_appearance/hook_overlay = mutable_appearance(icon, hook?.rod_overlay_icon_state || "hook_overlay") - . += hook_overlay + . += hook?.rod_overlay_icon_state || "hook_overlay" if(bait) var/bait_state = "worm_overlay" //default to worm overlay for anything without specific one @@ -260,13 +276,17 @@ /obj/item/fishing_rod/worn_overlays(mutable_appearance/standing, isinhands, icon_file) . = ..() + . += get_fishing_worn_overlays(standing, isinhands, icon_file) + +/obj/item/fishing_rod/proc/get_fishing_worn_overlays(mutable_appearance/standing, isinhands, icon_file) + . = list() var/line_color = line?.line_color || default_line_color var/mutable_appearance/reel_overlay = mutable_appearance(icon_file, "reel_overlay") reel_overlay.appearance_flags |= RESET_COLOR reel_overlay.color = line_color . += reel_overlay /// if we don't have anything hooked show the dangling hook & line - if(isinhands && length(fishing_lines) == 0) + if(isinhands && !fishing_line) var/mutable_appearance/line_overlay = mutable_appearance(icon_file, "line_overlay") line_overlay.appearance_flags |= RESET_COLOR line_overlay.color = line_color @@ -324,7 +344,7 @@ if(!istype(item,/obj/item/fishing_line)) return FALSE if(ROD_SLOT_BAIT) - if(!HAS_TRAIT(item, FISHING_BAIT_TRAIT)) + if(!HAS_TRAIT(item, TRAIT_FISHING_BAIT)) return FALSE return TRUE @@ -401,6 +421,8 @@ name = "bone fishing rod" desc = "A humble rod, made with whatever happened to be on hand." icon_state = "fishing_rod_bone" + reel_overlay = "reel_bone" + default_line_color = "red" /datum/crafting_recipe/bone_rod name = "Bone Fishing Rod" @@ -411,27 +433,111 @@ /obj/item/stack/sheet/bone = 2) category = CAT_TOOLS -/obj/item/fishing_rod/master +/obj/item/fishing_rod/telescopic + name = "telescopic fishing rod" + icon_state = "fishing_rod_telescopic" + desc = "A lightweight, ergonomic, easy to store telescopic fishing rod. " + inhand_icon_state = null + force = 0 + w_class = WEIGHT_CLASS_NORMAL + ui_description = "A collapsible fishing rod that can fit within a backpack." + reel_overlay = "reel_telescopic" + ///Whether the rod is exteded or not. Tied to the transforming element. + var/active = FALSE + ///The force of the item when extended. + var/active_force = 8 + +/obj/item/fishing_rod/telescopic/Initialize(mapload) + . = ..() + AddComponent(/datum/component/transforming, force_on = 8, hitsound_on = hitsound, w_class_on = WEIGHT_CLASS_HUGE, clumsy_check = FALSE) + RegisterSignal(src, COMSIG_TRANSFORMING_PRE_TRANSFORM, PROC_REF(pre_transform)) + RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) + +/obj/item/fishing_rod/telescopic/reason_we_cant_fish(datum/fish_source/target_fish_source) + if(!active) + return "You need to extend your fishing rod before you can cast the line." + return ..() + +/obj/item/fishing_rod/telescopic/cast_line(atom/target, mob/user, proximity_flag) + if(!active) + to_chat(user, "You need to extend your fishing rod before you can cast the line.") + return + return ..() + +/obj/item/fishing_rod/telescopic/get_fishing_overlays() + if(!active) + return list() + return ..() + +/obj/item/fishing_rod/telescopic/get_fishing_worn_overlays(mutable_appearance/standing, isinhands, icon_file) + if(!active) + return list() + return ..() + +///Stops the fishing rod from being collapsed while fishing. +/obj/item/fishing_rod/telescopic/proc/pre_transform(obj/item/source, mob/user, active) + SIGNAL_HANDLER + if(active) + return + //the fishing minigame uses the attack_self signal to let the user end it early without having to drop the rod. + if(HAS_TRAIT(user, TRAIT_GONE_FISHING)) + return COMPONENT_BLOCK_TRANSFORM + +///Gives feedback to the user, makes it show up inhand, toggles whether it can be used for fishing. +/obj/item/fishing_rod/telescopic/proc/on_transform(obj/item/source, mob/user, active) + SIGNAL_HANDLER + + src.active = active + inhand_icon_state = active ? "rod" : null // When inactive, there is no inhand icon_state. + if(user) + balloon_alert(user, active ? "extended" : "collapsed") + playsound(src, 'sound/weapons/batonextend.ogg', 50, TRUE) + update_appearance(UPDATE_OVERLAYS) + if(fishing_line) + QDEL_NULL(fishing_line) + return COMPONENT_NO_DEFAULT_MESSAGE + +/obj/item/fishing_rod/telescopic/master name = "master fishing rod" desc = "The mythical rod of a lost fisher king. Said to be imbued with un-paralleled fishing power. There's writing on the back of the pole. \"中国航天制造\"" difficulty_modifier = -10 - ui_description = "This rods makes fishing easy even for an absolute beginner." + ui_description = "This rod makes fishing easy even for an absolute beginner." icon_state = "fishing_rod_master" - + reel_overlay = "reel_master" + active_force = 13 //It's that sturdy /obj/item/fishing_rod/tech name = "advanced fishing rod" desc = "An embedded universal constructor along with micro-fusion generator makes this marvel of technology never run out of bait. Interstellar treaties prevent using it outside of recreational fishing. And you can fish with this. " - ui_description = "This rod has an infinite supply of synthetic bait." + ui_description = "This rod has an infinite supply of synth-bait. Also doubles as an Experi-Scanner for fish." icon_state = "fishing_rod_science" + reel_overlay = "reel_science" /obj/item/fishing_rod/tech/Initialize(mapload) . = ..() + + var/static/list/fishing_signals = list( + COMSIG_FISHING_ROD_HOOKED_ITEM = TYPE_PROC_REF(/datum/component/experiment_handler, try_run_handheld_experiment), + COMSIG_FISHING_ROD_CAUGHT_FISH = TYPE_PROC_REF(/datum/component/experiment_handler, try_run_handheld_experiment), + COMSIG_ITEM_PRE_ATTACK = TYPE_PROC_REF(/datum/component/experiment_handler, try_run_handheld_experiment), + COMSIG_ITEM_AFTERATTACK = TYPE_PROC_REF(/datum/component/experiment_handler, ignored_handheld_experiment_attempt), + ) + AddComponent(/datum/component/experiment_handler, \ + config_mode = EXPERIMENT_CONFIG_ALTCLICK, \ + allowed_experiments = list(/datum/experiment/scanning/fish), \ + config_flags = EXPERIMENT_CONFIG_SILENT_FAIL|EXPERIMENT_CONFIG_IMMEDIATE_ACTION, \ + experiment_signals = fishing_signals, \ + ) + var/obj/item/food/bait/doughball/synthetic/infinite_supply_of_bait = new(src) bait = infinite_supply_of_bait update_icon() -/obj/item/fishing_rod/tech/consume_bait() +/obj/item/fishing_rod/tech/examine(mob/user) + . = ..() + . += span_notice("Alt-Click to access the Experiment Configuration UI") + +/obj/item/fishing_rod/tech/consume_bait(atom/movable/reward) return /obj/item/fishing_rod/tech/use_slot(slot, mob/user, obj/item/new_item) @@ -475,6 +581,31 @@ // Is the fishing rod held in left side hand var/lefthand = FALSE + // Make these inline with final sprites + var/righthand_s_px = 13 + var/righthand_s_py = 16 + + var/righthand_e_px = 18 + var/righthand_e_py = 16 + + var/righthand_w_px = -20 + var/righthand_w_py = 18 + + var/righthand_n_px = -14 + var/righthand_n_py = 16 + + var/lefthand_s_px = -13 + var/lefthand_s_py = 15 + + var/lefthand_e_px = 24 + var/lefthand_e_py = 18 + + var/lefthand_w_px = -17 + var/lefthand_w_py = 16 + + var/lefthand_n_px = 13 + var/lefthand_n_py = 15 + /datum/beam/fishing_line/Start() update_offsets(origin.dir) . = ..() @@ -503,29 +634,3 @@ if(NORTH) override_origin_pixel_x = lefthand ? lefthand_n_px : righthand_n_px override_origin_pixel_y = lefthand ? lefthand_n_py : righthand_n_py - -// Make these inline with final sprites -/datum/beam/fishing_line - var/righthand_s_px = 13 - var/righthand_s_py = 16 - - var/righthand_e_px = 18 - var/righthand_e_py = 16 - - var/righthand_w_px = -20 - var/righthand_w_py = 18 - - var/righthand_n_px = -14 - var/righthand_n_py = 16 - - var/lefthand_s_px = -13 - var/lefthand_s_py = 15 - - var/lefthand_e_px = 24 - var/lefthand_e_py = 18 - - var/lefthand_w_px = -17 - var/lefthand_w_py = 16 - - var/lefthand_n_px = 13 - var/lefthand_n_py = 15 diff --git a/code/modules/fishing/fishing_traits.dm b/code/modules/fishing/fishing_traits.dm deleted file mode 100644 index 3a58ae5157ca5..0000000000000 --- a/code/modules/fishing/fishing_traits.dm +++ /dev/null @@ -1,82 +0,0 @@ -/datum/fishing_trait - /// Description of the trait in the fishing catalog - var/catalog_description - -/// Difficulty modifier from this mod, needs to return a list with two values -/datum/fishing_trait/proc/difficulty_mod(obj/item/fishing_rod/rod, mob/fisherman) - SHOULD_CALL_PARENT(TRUE) //Technically it doesn't but this makes it saner without custom unit test - return list(ADDITIVE_FISHING_MOD = 0, MULTIPLICATIVE_FISHING_MOD = 1) - -/// Catch weight table modifier from this mod, needs to return a list with two values -/datum/fishing_trait/proc/catch_weight_mod(obj/item/fishing_rod/rod, mob/fisherman) - SHOULD_CALL_PARENT(TRUE) - return list(ADDITIVE_FISHING_MOD = 0, MULTIPLICATIVE_FISHING_MOD = 1) - -/// Returns special minigame rules applied by this trait -/datum/fishing_trait/proc/minigame_mod(obj/item/fishing_rod/rod, mob/fisherman) - return list() - -/datum/fishing_trait/wary - catalog_description = "This fish will avoid visible fish lines, cloaked line recommended." - -/datum/fishing_trait/wary/difficulty_mod(obj/item/fishing_rod/rod, mob/fisherman) - . = ..() - // Wary fish require transparent line or they're harder - if(!rod.line || !(rod.line.fishing_line_traits & FISHING_LINE_CLOAKED)) - .[ADDITIVE_FISHING_MOD] = -FISH_TRAIT_MINOR_DIFFICULTY_BOOST - -/datum/fishing_trait/shiny_lover - catalog_description = "This fish loves shiny things, shiny lure recommended." - -/datum/fishing_trait/shiny_lover/difficulty_mod(obj/item/fishing_rod/rod, mob/fisherman) - . = ..() - // These fish are easier to catch with shiny lure - if(rod.hook && rod.hook.fishing_hook_traits & FISHING_HOOK_SHINY) - .[ADDITIVE_FISHING_MOD] = FISH_TRAIT_MINOR_DIFFICULTY_BOOST - -/datum/fishing_trait/picky_eater - catalog_description = "This fish is very picky and will ignore low quality bait." - -/datum/fishing_trait/picky_eater/catch_weight_mod(obj/item/fishing_rod/rod, mob/fisherman) - . = ..() - if(!rod.bait || !(HAS_TRAIT(rod.bait, GOOD_QUALITY_BAIT_TRAIT) || HAS_TRAIT(rod.bait, GREAT_QUALITY_BAIT_TRAIT))) - .[MULTIPLICATIVE_FISHING_MOD] = 0 - - -/datum/fishing_trait/nocturnal - catalog_description = "This fish avoids bright lights, fishing in darkness recommended." - -/datum/fishing_trait/nocturnal/catch_weight_mod(obj/item/fishing_rod/rod, mob/fisherman) - . = ..() - var/turf/T = get_turf(fisherman) - var/light_amount = T.get_lumcount() - if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) - .[MULTIPLICATIVE_FISHING_MOD] = 0 - - -/datum/fishing_trait/heavy - catalog_description = "This fish tends to stay near the waterbed."; - -/datum/fishing_trait/heavy/minigame_mod(obj/item/fishing_rod/rod, mob/fisherman) - return list(FISHING_MINIGAME_RULE_HEAVY_FISH) - - -/datum/fishing_trait/carnivore - catalog_description = "This fish can only be baited with meat." - -/datum/fishing_trait/carnivore/catch_weight_mod(obj/item/fishing_rod/rod, mob/fisherman) - . = ..() - .[MULTIPLICATIVE_FISHING_MOD] = 0 - if(rod.bait && istype(rod.bait, /obj/item/food)) - var/obj/item/food/food_bait = rod.bait - if(food_bait.foodtypes & MEAT) - .[MULTIPLICATIVE_FISHING_MOD] = 1 - -/datum/fishing_trait/vegan - catalog_description = "This fish can only be baited with fresh produce." - -/datum/fishing_trait/vegan/catch_weight_mod(obj/item/fishing_rod/rod, mob/fisherman) - . = ..() - .[MULTIPLICATIVE_FISHING_MOD] = 0 - if(rod.bait && istype(rod.bait, /obj/item/food/grown)) - .[MULTIPLICATIVE_FISHING_MOD] = 1 diff --git a/code/modules/fishing/sources/_fish_source.dm b/code/modules/fishing/sources/_fish_source.dm index 4f153eb9ff4dc..657b2f30968b7 100644 --- a/code/modules/fishing/sources/_fish_source.dm +++ b/code/modules/fishing/sources/_fish_source.dm @@ -1,22 +1,47 @@ -/// Keyed list of preset sources to configuration instance -GLOBAL_LIST_INIT(preset_fish_sources,init_fishing_configurations()) +GLOBAL_LIST_INIT(preset_fish_sources, init_subtypes_w_path_keys(/datum/fish_source, list())) -/// These are shared between their spots -/proc/init_fishing_configurations() - . = list() +/** + * When adding new fishable rewards to a table/counts, you can specify an icon to show in place of the + * generic fish icon in the minigame UI should the user have the TRAIT_REVEAL_FISH trait, by adding it to + * this list. + * + * A lot of the icons here may be a tad inaccurate, but since we're limited to the free font awesome icons we + * have access to, we got to make do. + */ +GLOBAL_LIST_INIT(specific_fish_icons, zebra_typecacheof(list( + /mob/living/basic/carp = FISH_ICON_DEF, + /mob/living/basic/mining = FISH_ICON_HOSTILE, + /obj/effect/decal/remains = FISH_ICON_BONE, + /obj/effect/mob_spawn/corpse = FISH_ICON_BONE, + /obj/item/coin = FISH_ICON_COIN, + /obj/item/fish = FISH_ICON_DEF, + /obj/item/fish/armorfish = FISH_ICON_CRAB, + /obj/item/fish/boned = FISH_ICON_BONE, + /obj/item/fish/chasm_crab = FISH_ICON_CRAB, + /obj/item/fish/gunner_jellyfish = FISH_ICON_JELLYFISH, + /obj/item/fish/holo/crab = FISH_ICON_CRAB, + /obj/item/fish/holo/puffer = FISH_ICON_CHUNKY, + /obj/item/fish/mastodon = FISH_ICON_BONE, + /obj/item/fish/pufferfish = FISH_ICON_CHUNKY, + /obj/item/fish/slimefish = FISH_ICON_SLIME, + /obj/item/fish/sludgefish = FISH_ICON_SLIME, + /obj/item/fish/starfish = FISH_ICON_STAR, + /obj/item/storage/wallet = FISH_ICON_COIN, + /obj/item/stack/sheet/bone = FISH_ICON_BONE, + /obj/item/stack/sheet/mineral = FISH_ICON_GEM, + /obj/item/stack/ore = FISH_ICON_GEM, + /obj/structure/closet/crate = FISH_ICON_COIN, +))) - var/datum/fish_source/ocean/beach/beach_preset = new - .[FISHING_SPOT_PRESET_BEACH] = beach_preset - - var/datum/fish_source/lavaland/lava_preset = new - .[FISHING_SPOT_PRESET_LAVALAND_LAVA] = lava_preset - - var/datum/fish_source/chasm/chasm_preset = new - .[FISHING_SPOT_PRESET_CHASM] = chasm_preset - -/// Where the fish actually come from - every fishing spot has one assigned but multiple fishing holes can share single source, ie single shared one for ocean/lavaland river +/** + * Where the fish actually come from - every fishing spot has one assigned but multiple fishing holes + * can share single source, ie single shared one for ocean/lavaland river + */ /datum/fish_source - /// Fish catch weight table - these are relative weights + /** + * Fish catch weight table - these are relative weights + * + */ var/list/fish_table = list() /// If a key from fish_table is present here, that fish is availible in limited quantity and is reduced by one on successful fishing var/list/fish_counts = list() @@ -27,17 +52,45 @@ GLOBAL_LIST_INIT(preset_fish_sources,init_fishing_configurations()) /// How the spot type is described in fish catalog section about fish sources, will be skipped if null var/catalog_description /// Background image name from /datum/asset/simple/fishing_minigame - var/background = "fishing_background_default" + var/background = "background_default" + +/datum/fish_source/New() + if(!PERFORM_ALL_TESTS(focus_only/fish_sources_tables)) + return + for(var/path in fish_counts) + if(!(path in fish_table)) + stack_trace("path [path] found in the 'fish_counts' list but not in the fish_table one of [type]") + +///Called when src is set as the fish source of a fishing spot component +/datum/fish_source/proc/on_fishing_spot_init(/datum/component/fishing_spot/spot) + return /// Can we fish in this spot at all. Returns DENIAL_REASON or null if we're good to go /datum/fish_source/proc/reason_we_cant_fish(obj/item/fishing_rod/rod, mob/fisherman) return rod.reason_we_cant_fish(src) - -/// DIFFICULTY = (SPOT_BASE_VALUE + FISH_MODIFIER + ROD_MODIFIER + FAV/DISLIKED_BAIT_MODIFIER + TRAITS_ADDITIVE) * TRAITS_MULTIPLICATIVE , For non-fish it's just SPOT_BASE_VALUE -/datum/fish_source/proc/calculate_difficulty(result, obj/item/fishing_rod/rod, mob/fisherman) +/** + * Calculates the difficulty of the minigame: + * + * This includes the source's fishing difficulty, that of the fish, the rod, + * favorite and disliked baits, fish traits and the fisherman skill. + * + * For non-fish, it's just the source's fishing difficulty minus the fisherman skill. + */ +/datum/fish_source/proc/calculate_difficulty(result, obj/item/fishing_rod/rod, mob/fisherman, datum/fishing_challenge/challenge) . = fishing_difficulty + // Difficulty modifier added by having the Settler quirk + if(HAS_TRAIT(fisherman, TRAIT_SETTLER)) + . += SETTLER_DIFFICULTY_MOD + + // Difficulty modifier added by the fisher's skill level + if(!challenge || !(challenge.special_effects & FISHING_MINIGAME_RULE_NO_EXP)) + . += fisherman.mind?.get_skill_modifier(/datum/skill/fishing, SKILL_VALUE_MODIFIER) + + // Difficulty modifier added by the rod + . += rod.difficulty_modifier + if(!ispath(result,/obj/item/fish)) // In the future non-fish rewards can have variable difficulty calculated here return @@ -46,7 +99,7 @@ GLOBAL_LIST_INIT(preset_fish_sources,init_fishing_configurations()) var/obj/item/fish/caught_fish = result // Baseline fish difficulty . += initial(caught_fish.fishing_difficulty_modifier) - . += rod.difficulty_modifier + if(rod.bait) var/obj/item/bait = rod.bait @@ -55,21 +108,19 @@ GLOBAL_LIST_INIT(preset_fish_sources,init_fishing_configurations()) for(var/bait_identifer in fav_bait) if(is_matching_bait(bait, bait_identifer)) . += FAV_BAIT_DIFFICULTY_MOD - break //Disliked bait makes it harder var/list/disliked_bait = fish_list_properties[caught_fish][NAMEOF(caught_fish, disliked_bait)] for(var/bait_identifer in disliked_bait) if(is_matching_bait(bait, bait_identifer)) . += DISLIKED_BAIT_DIFFICULTY_MOD - break // Matching/not matching fish traits and equipment - var/list/fish_traits = fish_list_properties[caught_fish][NAMEOF(caught_fish, fishing_traits)] + var/list/fish_traits = fish_list_properties[caught_fish][NAMEOF(caught_fish, fish_traits)] var/additive_mod = 0 var/multiplicative_mod = 1 for(var/fish_trait in fish_traits) - var/datum/fishing_trait/trait = new fish_trait + var/datum/fish_trait/trait = GLOB.fish_traits[fish_trait] var/list/mod = trait.difficulty_mod(rod, fisherman) additive_mod += mod[ADDITIVE_FISHING_MOD] multiplicative_mod *= mod[MULTIPLICATIVE_FISHING_MOD] @@ -81,29 +132,68 @@ GLOBAL_LIST_INIT(preset_fish_sources,init_fishing_configurations()) /datum/fish_source/proc/roll_reward(obj/item/fishing_rod/rod, mob/fisherman) return pick_weight(get_modified_fish_table(rod,fisherman)) +/** + * Used to register signals or add traits and the such right after conditions have been cleared + * and before the minigame starts. + */ +/datum/fish_source/proc/pre_challenge_started(obj/item/fishing_rod/rod, mob/user, datum/fishing_challenge/challenge) + return + +///Proc called when the challenge is interrupted within the fish source code. +/datum/fish_source/proc/interrupt_challenge(reason) + SEND_SIGNAL(src, COMSIG_FISHING_SOURCE_INTERRUPT_CHALLENGE, reason) + +/** + * Proc called when the COMSIG_FISHING_CHALLENGE_COMPLETED signal is sent. + * Check if we've succeeded. If so, write into memory and dispense the reward. + */ +/datum/fish_source/proc/on_challenge_completed(datum/fishing_challenge/source, mob/user, success) + SIGNAL_HANDLER + SHOULD_CALL_PARENT(TRUE) + if(!success) + return + var/obj/item/fish/caught = source.reward_path + user.add_mob_memory(/datum/memory/caught_fish, protagonist = user, deuteragonist = initial(caught.name)) + var/turf/fishing_spot = get_turf(source.lure) + var/atom/movable/reward = dispense_reward(source.reward_path, user, fishing_spot) + if(source.used_rod) + SEND_SIGNAL(source.used_rod, COMSIG_FISHING_ROD_CAUGHT_FISH, reward, user) + source.used_rod.consume_bait(reward) + /// Gives out the reward if possible -/datum/fish_source/proc/dispense_reward(reward_path, mob/fisherman) +/datum/fish_source/proc/dispense_reward(reward_path, mob/fisherman, turf/fishing_spot) if((reward_path in fish_counts)) // This is limited count result - if(fish_counts[reward_path] > 0) - fish_counts[reward_path] -= 1 - else - reward_path = FISHING_DUD //Ran out of these since rolling (multiple fishermen on same source most likely) - if(ispath(reward_path)) - if(ispath(reward_path,/obj/item)) - var/obj/item/reward = new reward_path(get_turf(fisherman)) - if(ispath(reward_path,/obj/item/fish)) - var/obj/item/fish/caught_fish = reward - caught_fish.randomize_weight_and_size() - //fish caught signal if needed goes here and/or fishing achievements - //Try to put it in hand - fisherman.put_in_hands(reward) - fisherman.balloon_alert(fisherman, "caught [reward]!") - else //If someone adds fishing out carp/chests/singularities or whatever just plop it down on the fisher's turf - fisherman.balloon_alert(fisherman, "caught something!") - new reward_path(get_turf(fisherman)) - else if (reward_path == FISHING_DUD) - //baloon alert instead + fish_counts[reward_path] -= 1 + if(!fish_counts[reward_path]) + fish_counts -= reward_path //Ran out of these since rolling (multiple fishermen on same source most likely) + fish_table -= reward_path + + var/atom/movable/reward = spawn_reward(reward_path, fisherman, fishing_spot) + if(!reward) //balloon alert instead fisherman.balloon_alert(fisherman,pick(duds)) + return + if(isitem(reward)) //Try to put it in hand + INVOKE_ASYNC(fisherman, TYPE_PROC_REF(/mob, put_in_hands), reward) + else // for fishing things like corpses, move them to the turf of the fisherman + INVOKE_ASYNC(reward, TYPE_PROC_REF(/atom/movable, forceMove), get_turf(fisherman)) + fisherman.balloon_alert(fisherman, "caught [reward]!") + + SEND_SIGNAL(fisherman, COMSIG_MOB_FISHING_REWARD_DISPENSED, reward) + return reward + +/// Spawns a reward from a atom path right where the fisherman is. Part of the dispense_reward() logic. +/datum/fish_source/proc/spawn_reward(reward_path, mob/fisherman, turf/fishing_spot) + if(reward_path == FISHING_DUD) + return + if(ispath(reward_path, /datum/chasm_detritus)) + return GLOB.chasm_detritus_types[reward_path].dispense_detritus(fisherman, fishing_spot) + if(!ispath(reward_path, /atom/movable)) + CRASH("Unsupported /datum path [reward_path] passed to fish_source/proc/spawn_reward()") + var/atom/movable/reward = new reward_path(get_turf(fisherman)) + if(isfish(reward)) + var/obj/item/fish/caught_fish = reward + caught_fish.randomize_size_and_weight() + return reward /// Cached fish list properties so we don't have to initalize fish every time, init deffered GLOBAL_LIST(fishing_property_cache) @@ -113,11 +203,11 @@ GLOBAL_LIST(fishing_property_cache) if(GLOB.fishing_property_cache == null) var/list/fish_property_table = list() for(var/fish_type in subtypesof(/obj/item/fish)) - var/obj/item/fish/fish = new fish_type(null) + var/obj/item/fish/fish = new fish_type(null, FALSE) fish_property_table[fish_type] = list() fish_property_table[fish_type][NAMEOF(fish, favorite_bait)] = fish.favorite_bait.Copy() fish_property_table[fish_type][NAMEOF(fish, disliked_bait)] = fish.disliked_bait.Copy() - fish_property_table[fish_type][NAMEOF(fish, fishing_traits)] = fish.fishing_traits.Copy() + fish_property_table[fish_type][NAMEOF(fish, fish_traits)] = fish.fish_traits.Copy() QDEL_NULL(fish) GLOB.fishing_property_cache = fish_property_table return GLOB.fishing_property_cache @@ -132,6 +222,8 @@ GLOBAL_LIST(fishing_property_cache) if("Foodtype") var/obj/item/food/food_bait = bait return istype(food_bait) && food_bait.foodtypes & special_identifier["Value"] + if("Reagent") + return bait.reagents?.has_reagent(special_identifier["Value"], special_identifier["Amount"], check_subtypes = TRUE) else CRASH("Unknown bait identifier in fish favourite/disliked list") else @@ -145,54 +237,45 @@ GLOBAL_LIST(fishing_property_cache) var/list/final_table = fish_table.Copy() for(var/result in final_table) - if((result in fish_counts) && fish_counts[result] <= 0) //ran out of these, ignore - final_table -= result - continue - final_table[result] *= rod.multiplicative_fish_bonus(result, src) final_table[result] += rod.additive_fish_bonus(result, src) //Decide on order here so it can be multiplicative - if(result == FISHING_DUD) - //Modify dud result - //Bait quality reduces dud chance heavily. - if(bait) - if(HAS_TRAIT(bait, GREAT_QUALITY_BAIT_TRAIT)) - final_table[result] *= 0.1 - else if(HAS_TRAIT(bait, GOOD_QUALITY_BAIT_TRAIT)) - final_table[result] *= 0.3 - else if(HAS_TRAIT(bait, BASIC_QUALITY_BAIT_TRAIT)) - final_table[result] *= 0.5 - else - final_table[result] *= 10 //Fishing without bait is not going to be easy - else if(ispath(result, /obj/item/fish)) + if(ispath(result, /obj/item/fish)) //Modify fish roll chance var/obj/item/fish/caught_fish = result if(bait) - //Bait matching likes doubles the chance - var/list/fav_bait = fish_list_properties[result][NAMEOF(caught_fish, favorite_bait)] - for(var/bait_identifer in fav_bait) - if(is_matching_bait(bait, bait_identifer)) - final_table[result] *= 2 - break // could compound possibly - //Bait matching dislikes - var/list/disliked_bait = fish_list_properties[result][NAMEOF(caught_fish, disliked_bait)] - for(var/bait_identifer in disliked_bait) - if(is_matching_bait(bait, bait_identifer)) - final_table[result] *= 0.5 - break // same question as above - - // Apply fishing trait modifiers - var/list/fish_traits = fish_list_properties[caught_fish][NAMEOF(caught_fish, fishing_traits)] + if(HAS_TRAIT(bait, TRAIT_GREAT_QUALITY_BAIT)) + final_table[result] *= 10 + else if(HAS_TRAIT(bait, TRAIT_GOOD_QUALITY_BAIT)) + final_table[result] = round(final_table[result] * 3.5, 1) + else if(HAS_TRAIT(bait, TRAIT_BASIC_QUALITY_BAIT)) + final_table[result] *= 2 + if(!HAS_TRAIT(bait, OMNI_BAIT_TRAIT)) + //Bait matching likes doubles the chance + var/list/fav_bait = fish_list_properties[result][NAMEOF(caught_fish, favorite_bait)] + for(var/bait_identifer in fav_bait) + if(is_matching_bait(bait, bait_identifer)) + final_table[result] *= 2 + //Bait matching dislikes + var/list/disliked_bait = fish_list_properties[result][NAMEOF(caught_fish, disliked_bait)] + for(var/bait_identifer in disliked_bait) + if(is_matching_bait(bait, bait_identifer)) + final_table[result] = round(final_table[result] * 0.5, 1) + else + final_table[result] = round(final_table[result] * 0.15, 1) //Fishing without bait is not going to be easy + + // Apply fish trait modifiers + var/list/fish_traits = fish_list_properties[caught_fish][NAMEOF(caught_fish, fish_traits)] var/additive_mod = 0 var/multiplicative_mod = 1 for(var/fish_trait in fish_traits) - var/datum/fishing_trait/trait = new fish_trait + var/datum/fish_trait/trait = GLOB.fish_traits[fish_trait] var/list/mod = trait.catch_weight_mod(rod, fisherman) additive_mod += mod[ADDITIVE_FISHING_MOD] multiplicative_mod *= mod[MULTIPLICATIVE_FISHING_MOD] final_table[result] += additive_mod - final_table[result] *= multiplicative_mod + final_table[result] = round(final_table[result] * multiplicative_mod, 1) if(final_table[result] <= 0) final_table -= result diff --git a/code/modules/fishing/sources/source_types.dm b/code/modules/fishing/sources/source_types.dm index d4ff7cd985641..e2e5491dd1d3d 100644 --- a/code/modules/fishing/sources/source_types.dm +++ b/code/modules/fishing/sources/source_types.dm @@ -6,7 +6,11 @@ /obj/item/fish/pufferfish = 15, /obj/item/fish/cardinal = 15, /obj/item/fish/greenchromis = 15, - /obj/item/fish/lanternfish = 5 + /obj/item/fish/lanternfish = 5, + /obj/item/fish/clownfish/lube = 3, + ) + fish_counts = list( + /obj/item/fish/clownfish/lube = 2, ) fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 5 @@ -15,36 +19,191 @@ /datum/fish_source/portal fish_table = list( - FISHING_DUD = 5, + FISHING_DUD = 7, /obj/item/fish/goldfish = 10, /obj/item/fish/guppy = 10, + /obj/item/fish/angelfish = 10, + ) + catalog_description = "Aquarium dimension (Fishing portal generator)" + ///The name of this option shown in the radial menu on the fishing portal generator + var/radial_name = "Aquarium" + ///The icon state shown for this option in the radial menu + var/radial_state = "fish_tank" + ///The icon state of the overlay shown on the machine when active. + var/overlay_state = "portal_aquarium" + +/datum/fish_source/portal/beach + fish_table = list( + FISHING_DUD = 10, + /obj/item/fish/clownfish = 10, + /obj/item/fish/pufferfish = 10, + /obj/item/fish/cardinal = 10, + /obj/item/fish/greenchromis = 10, + ) + catalog_description = "Beach dimension (Fishing portal generator)" + radial_name = "Beach" + radial_state = "palm_beach" + +/datum/fish_source/portal/chasm + background = "background_lavaland" + fish_table = list( + FISHING_DUD = 5, + /obj/item/fish/chasm_crab = 10, + /obj/item/fish/boned = 5, + /obj/item/stack/sheet/bone = 5, ) - catalog_description = "Fish dimension (Fishing portal generator)" + catalog_description = "Chasm dimension (Fishing portal generator)" + fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 10 + radial_name = "Chasm" + overlay_state = "portal_chasm" + radial_state = "ground_hole" + +/datum/fish_source/portal/ocean + fish_table = list( + FISHING_DUD = 5, + /obj/item/fish/lanternfish = 5, + /obj/item/fish/firefish = 5, + /obj/item/fish/dwarf_moonfish = 5, + /obj/item/fish/gunner_jellyfish = 5, + /obj/item/fish/needlefish = 5, + /obj/item/fish/armorfish = 5, + ) + catalog_description = "Ocean dimension (Fishing portal generator)" + fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 10 + radial_name = "Ocean" + overlay_state = "portal_ocean" + radial_state = "seaboat" + +/datum/fish_source/portal/hyperspace + fish_table = list( + FISHING_DUD = 5, + /obj/item/fish/starfish = 6, + /obj/item/stack/ore/bluespace_crystal = 2, + /mob/living/basic/carp = 2, + ) + fish_counts = list( + /obj/item/stack/ore/bluespace_crystal = 10, + ) + catalog_description = "Hyperspace dimension (Fishing portal generator)" + fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 10 + radial_name = "Hyperspace" + overlay_state = "portal_hyperspace" + radial_state = "space_rocket" + +///Unlocked by emagging the fishing portal generator with an emag. +/datum/fish_source/portal/syndicate + background = "background_lavaland" + fish_table = list( + FISHING_DUD = 5, + /obj/item/fish/donkfish = 5, + /obj/item/fish/emulsijack = 5, + ) + catalog_description = "Syndicate dimension (Fishing portal generator)" + radial_name = "Syndicate" + fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 15 + overlay_state = "portal_syndicate" + radial_state = "syndi_snake" + +/** + * A special portal fish source which fish table is populated on init with the contents of all + * portal fish sources, except for FISHING_DUD, and a couple more caveats. + */ +/datum/fish_source/portal/random + fish_table = null //It's populated the first time the source is loaded on a fishing portal generator. + catalog_description = null // it'd make a bad entry in the catalog. + radial_name = "Randomizer" + overlay_state = "portal_randomizer" + var/static/list/all_portal_fish_sources_at_once + radial_state = "misaligned_question_mark" + +///Generate the fish table if we don't have one already. +/datum/fish_source/portal/random/on_fishing_spot_init(datum/component/fishing_spot/spot) + if(fish_table) + return + + ///rewards not found in other fishing portals + fish_table = list( + /obj/item/fish/holo/checkered = 1, + ) + + for(var/portal_type in GLOB.preset_fish_sources) + if(portal_type == type || !ispath(portal_type, /datum/fish_source/portal)) + continue + var/datum/fish_source/portal/preset_portal = GLOB.preset_fish_sources[portal_type] + fish_table |= preset_portal.fish_table + + ///We don't serve duds. + fish_table -= FISHING_DUD + + for(var/reward_path in fish_table) + fish_table[reward_path] = rand(1, 4) + +///Difficulty has to be calculated before the rest, because of how it influences jump chances +/datum/fish_source/portal/random/calculate_difficulty(result, obj/item/fishing_rod/rod, mob/fisherman, datum/fishing_challenge/challenge) + . = ..() + . += rand(-10, 15) + +///In the spirit of randomness, we skew a few values here and there +/datum/fish_source/portal/random/pre_challenge_started(obj/item/fishing_rod/rod, mob/user, datum/fishing_challenge/challenge) + challenge.bait_bounce_mult = clamp(challenge.bait_bounce_mult + (rand(-3, 3) * 0.1), 0.1, 1) + challenge.completion_loss = max(challenge.completion_loss + rand(-2, 2), 0) + challenge.completion_gain = max(challenge.completion_gain + rand(-1, 1), 2) + challenge.short_jump_velocity_limit += rand(-100, 100) + challenge.long_jump_velocity_limit += rand(-100, 100) + var/static/list/active_effects = bitfield_to_list(FISHING_MINIGAME_ACTIVE_EFFECTS) + for(var/effect in active_effects) + if(prob(30)) + challenge.special_effects |= effect + +///Cherry on top, fish caught from the randomizer portal also have (almost completely) random traits +/datum/fish_source/portal/random/spawn_reward(reward_path, mob/fisherman, turf/fishing_spot) + if(!ispath(reward_path, /obj/item/fish)) + return ..() + + var/static/list/weighted_traits + if(!weighted_traits) + weighted_traits = list() + for(var/trait_type as anything in GLOB.fish_traits) + var/datum/fish_trait/trait = GLOB.fish_traits[trait_type] + weighted_traits[trait.type] = round(trait.inheritability**2/100) + + var/obj/item/fish/caught_fish = new reward_path(get_turf(fisherman), FALSE) + var/list/fixed_traits = list() + for(var/trait_type in caught_fish.fish_traits) + var/datum/fish_trait/trait = GLOB.fish_traits[trait_type] + if(caught_fish.type in trait.guaranteed_inheritance_types) + fixed_traits += trait_type + var/list/new_traits = list() + for(var/iteration in rand(1, 4)) + new_traits |= pick_weight(weighted_traits) + caught_fish.inherit_traits(new_traits, fixed_traits = fixed_traits) + caught_fish.randomize_size_and_weight(deviation = 0.3) + caught_fish.progenitors = full_capitalize(caught_fish.name) + return caught_fish + /datum/fish_source/chasm catalog_description = "Chasm depths" - background = "fishing_background_lavaland" + background = "background_lavaland" fish_table = list( FISHING_DUD = 5, /obj/item/fish/chasm_crab = 15, - /obj/item/chasm_detritus = 30, + /datum/chasm_detritus = 30, ) fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 5 - /datum/fish_source/chasm/roll_reward(obj/item/fishing_rod/rod, mob/fisherman) var/rolled_reward = ..() - if(!rod.hook || !ispath(rolled_reward, /obj/item/chasm_detritus)) + if(!rod.hook || !ispath(rolled_reward, /datum/chasm_detritus)) return rolled_reward return rod.hook.chasm_detritus_type - /datum/fish_source/lavaland catalog_description = "Lava vents" - background = "fishing_background_lavaland" + background = "background_lavaland" fish_table = list( FISHING_DUD = 5, /obj/item/stack/ore/slag = 20, @@ -65,11 +224,89 @@ if(!rod.line || !(rod.line.fishing_line_traits & FISHING_LINE_REINFORCED)) return "You'll need reinforced fishing line to fish in there" +/datum/fish_source/lavaland/icemoon + catalog_description = "Liquid plasma vents" + fish_table = list( + FISHING_DUD = 5, + /obj/item/fish/chasm_crab/ice = 15, + /obj/item/coin/plasma = 3, + /obj/item/stack/ore/plasma = 3, + /mob/living/basic/mining/lobstrosity = 1, + /obj/effect/decal/remains/plasma = 1, + /obj/item/stack/sheet/mineral/mythril = 1, + /obj/item/stack/sheet/mineral/adamantine = 1, + ) + fish_counts = list( + /obj/item/stack/sheet/mineral/adamantine = 3, + /obj/item/stack/sheet/mineral/mythril = 2, + ) /datum/fish_source/moisture_trap - catalog_description = "moisture trap basins" + catalog_description = "Moisture trap basins" fish_table = list( FISHING_DUD = 20, - /obj/item/fish/ratfish = 10 + /obj/item/fish/ratfish = 10, + /obj/item/fish/slimefish = 4 ) fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 10 + +/datum/fish_source/toilet + catalog_description = "Station toilets" + duds = list("ewww... nothing", "it was nothing", "it was toilet paper", "it was flushed away", "the hook is empty", "where's the damn money?!") + fish_table = list( + FISHING_DUD = 18, + /obj/item/fish/sludgefish = 18, + /obj/item/fish/slimefish = 4, + /obj/item/storage/wallet/money = 2, + ) + fish_counts = list( + /obj/item/storage/wallet/money = 2, + ) + fishing_difficulty = FISHING_DEFAULT_DIFFICULTY - 5 //For beginners + +/datum/fish_source/holographic + catalog_description = "Holographic water" + fish_table = list( + /obj/item/fish/holo = 10, + /obj/item/fish/holo/crab = 10, + /obj/item/fish/holo/puffer = 10, + /obj/item/fish/holo/angel = 10, + /obj/item/fish/holo/clown = 10, + /obj/item/fish/holo/checkered = 5, + /obj/item/fish/holo/halffish = 5, + ) + fishing_difficulty = FISHING_DEFAULT_DIFFICULTY - 5 + +/datum/fish_source/holographic/reason_we_cant_fish(obj/item/fishing_rod/rod, mob/fisherman) + . = ..() + if(!istype(get_area(fisherman), /area/station/holodeck)) + return "You need to be inside the Holodeck to catch holographic fish." + +/datum/fish_source/holographic/pre_challenge_started(obj/item/fishing_rod/rod, mob/user, datum/fishing_challenge/challenge) + RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(check_area)) + +/datum/fish_source/holographic/proc/check_area(mob/user) + SIGNAL_HANDLER + if(!istype(get_area(user), /area/station/holodeck)) + interrupt_challenge("exited holodeck") + +/datum/fish_source/holographic/on_challenge_completed(datum/fishing_challenge/source, mob/user, success) + . = ..() + UnregisterSignal(user, COMSIG_MOVABLE_MOVED) + +/datum/fish_source/oil_well + catalog_description = "Oil wells" + fish_table = list( + FISHING_DUD = 5, + /obj/item/fish/boned = 10, + /obj/item/stack/sheet/bone = 2, + /obj/item/clothing/gloves/bracer = 2, + /obj/effect/decal/remains/human = 2, + /obj/item/fish/mastodon = 1, + ) + fish_counts = list( + /obj/item/clothing/gloves/bracer = 1, + /obj/effect/decal/remains/human = 1, + /obj/item/fish/mastodon = 1, + ) + fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 15 diff --git a/code/modules/food_and_drinks/machinery/coffeemaker.dm b/code/modules/food_and_drinks/machinery/coffeemaker.dm index 122b2325b0fda..ff6d3fd0c8a31 100644 --- a/code/modules/food_and_drinks/machinery/coffeemaker.dm +++ b/code/modules/food_and_drinks/machinery/coffeemaker.dm @@ -56,11 +56,13 @@ return ..() /obj/machinery/coffeemaker/Exited(atom/movable/gone, direction) + . = ..() if(gone == coffeepot) coffeepot = null + update_appearance(UPDATE_OVERLAYS) if(gone == cartridge) cartridge = null - return ..() + update_appearance(UPDATE_OVERLAYS) /obj/machinery/coffeemaker/RefreshParts() . = ..() @@ -139,14 +141,6 @@ /obj/machinery/coffeemaker/attack_ai_secondary(mob/user, list/modifiers) return attack_hand_secondary(user, modifiers) -/obj/machinery/coffeemaker/handle_atom_del(atom/A) - . = ..() - if(A == coffeepot) - coffeepot = null - if(A == cartridge) - cartridge = null - update_appearance(UPDATE_OVERLAYS) - /obj/machinery/coffeemaker/update_overlays() . = ..() . += overlay_checks() @@ -527,13 +521,6 @@ QDEL_NULL(coffee) return ..() -/obj/machinery/coffeemaker/impressa/Exited(atom/movable/gone, direction) - if(gone == coffeepot) - coffeepot = null - if(gone == coffee) - coffee = null - return ..() - /obj/machinery/coffeemaker/impressa/examine(mob/user) . = ..() if(coffee) @@ -571,13 +558,11 @@ . += "grinder_full" return . -/obj/machinery/coffeemaker/impressa/handle_atom_del(atom/A) +/obj/machinery/coffeemaker/impressa/Exited(atom/movable/gone, direction) . = ..() - if(A == coffeepot) - coffeepot = null - if(A == coffee) - coffee.Cut() - update_appearance(UPDATE_OVERLAYS) + if(gone in coffee) + coffee -= gone + update_appearance(UPDATE_OVERLAYS) /obj/machinery/coffeemaker/impressa/try_brew() if(coffee_amount <= 0) diff --git a/code/modules/food_and_drinks/machinery/deep_fryer.dm b/code/modules/food_and_drinks/machinery/deep_fryer.dm index e3cf77a347994..73114812c2dc8 100644 --- a/code/modules/food_and_drinks/machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/machinery/deep_fryer.dm @@ -16,7 +16,7 @@ GLOBAL_LIST_INIT(oilfry_blacklisted_items, typecacheof(list( /obj/machinery/deepfryer name = "deep fryer" desc = "Deep fried everything." - icon = 'icons/obj/kitchen.dmi' + icon = 'icons/obj/machines/kitchen.dmi' icon_state = "fryer_off" density = TRUE pass_flags_self = PASSMACHINE | LETPASSTHROW @@ -52,7 +52,7 @@ GLOBAL_LIST_INIT(oilfry_blacklisted_items, typecacheof(list( /obj/machinery/deepfryer/Initialize(mapload) . = ..() create_reagents(50, OPENCONTAINER) - reagents.add_reagent(/datum/reagent/consumable/cooking_oil, 25) + reagents.add_reagent(/datum/reagent/consumable/nutriment/fat/oil, 25) fry_loop = new(src, FALSE) /obj/machinery/deepfryer/Destroy() @@ -93,12 +93,12 @@ GLOBAL_LIST_INIT(oilfry_blacklisted_items, typecacheof(list( to_chat(user, span_warning("There's nothing to dissolve [weapon] in!")) return user.visible_message(span_notice("[user] drops [weapon] into [src]."), span_notice("You dissolve [weapon] in [src].")) - weapon.reagents.trans_to(src, weapon.reagents.total_volume, transfered_by = user) + weapon.reagents.trans_to(src, weapon.reagents.total_volume, transferred_by = user) qdel(weapon) return // Make sure we have cooking oil - if(!reagents.has_reagent(/datum/reagent/consumable/cooking_oil)) - to_chat(user, span_warning("[src] has no cooking oil to fry with!")) + if(!reagents.has_reagent(/datum/reagent/consumable/nutriment/fat, check_subtypes = TRUE)) + to_chat(user, span_warning("[src] has no fat or oil to fry with!")) return // Don't deep fry indestructible things, for sanity reasons if(weapon.resistance_flags & INDESTRUCTIBLE) @@ -131,7 +131,7 @@ GLOBAL_LIST_INIT(oilfry_blacklisted_items, typecacheof(list( /obj/machinery/deepfryer/process(seconds_per_tick) ..() - var/datum/reagent/consumable/cooking_oil/frying_oil = reagents.has_reagent(/datum/reagent/consumable/cooking_oil) + var/datum/reagent/consumable/nutriment/fat/frying_oil = reagents.has_reagent(/datum/reagent/consumable/nutriment/fat, check_subtypes = TRUE) if(!frying_oil) return reagents.chem_temp = frying_oil.fry_temperature @@ -155,11 +155,6 @@ GLOBAL_LIST_INIT(oilfry_blacklisted_items, typecacheof(list( if(gone == frying) reset_frying() -/obj/machinery/deepfryer/handle_atom_del(atom/deleting_atom) - . = ..() - if(deleting_atom == frying) - reset_frying() - /obj/machinery/deepfryer/proc/reset_frying() if(!QDELETED(frying)) frying.AddElement(/datum/element/fried_item, cook_time) @@ -221,7 +216,7 @@ GLOBAL_LIST_INIT(oilfry_blacklisted_items, typecacheof(list( 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.investigate_log("has been gibbed by entropic difference (being dunked into [src]).", INVESTIGATE_DEATHS) - dunking_target.gib() + dunking_target.gib(DROP_ALL_REMAINS) log_combat(user, dunking_target, "blew up", null, "by dunking them into [src]") return diff --git a/code/modules/food_and_drinks/machinery/food_cart.dm b/code/modules/food_and_drinks/machinery/food_cart.dm index 0fc002c76fdd7..fe88e43b5236e 100644 --- a/code/modules/food_and_drinks/machinery/food_cart.dm +++ b/code/modules/food_and_drinks/machinery/food_cart.dm @@ -2,7 +2,7 @@ /obj/machinery/food_cart name = "food cart" desc = "A compact unpackable mobile cooking stand. Wow! When unpacked, it reminds you of those greasy gamer setups some people on NTNet have." - icon = 'icons/obj/kitchen.dmi' + icon = 'icons/obj/service/kitchen.dmi' icon_state = "foodcart" density = TRUE anchored = FALSE @@ -134,7 +134,7 @@ /obj/effect/food_cart_stand name = "food cart tent" desc = "Something to battle the sun, for there are no breaks for the burger flippers." - icon = 'icons/obj/3x3.dmi' + icon = 'icons/obj/fluff/3x3.dmi' icon_state = "stand" layer = ABOVE_MOB_LAYER//big mobs will still go over the tent, this is fine and cool plane = GAME_PLANE_UPPER diff --git a/code/modules/food_and_drinks/machinery/gibber.dm b/code/modules/food_and_drinks/machinery/gibber.dm index 5bf49c0778cbf..15ae66158d283 100644 --- a/code/modules/food_and_drinks/machinery/gibber.dm +++ b/code/modules/food_and_drinks/machinery/gibber.dm @@ -1,7 +1,7 @@ /obj/machinery/gibber name = "gibber" desc = "The name isn't descriptive enough?" - icon = 'icons/obj/kitchen.dmi' + icon = 'icons/obj/machines/kitchen.dmi' icon_state = "grinder" density = TRUE circuit = /obj/item/circuitboard/machine/gibber @@ -198,6 +198,7 @@ occupant.reagents.trans_to(newmeat, occupant_volume / meat_produced, remove_blacklisted = TRUE) if(sourcejob) newmeat.subjectjob = sourcejob + allmeat[i] = newmeat if(typeofskin) @@ -221,12 +222,24 @@ skin.throw_at(pick(nearby_turfs),meat_produced,3) for (var/i=1 to meat_produced) var/obj/item/meatslab = allmeat[i] + + if(LAZYLEN(diseases)) + var/list/datum/disease/diseases_to_add = list() + for(var/datum/disease/disease as anything in diseases) + // admin or special viruses that should not be reproduced + if(disease.spread_flags & (DISEASE_SPREAD_SPECIAL | DISEASE_SPREAD_NON_CONTAGIOUS)) + continue + + diseases_to_add += disease + if(LAZYLEN(diseases_to_add)) + meatslab.AddComponent(/datum/component/infective, diseases_to_add) + meatslab.forceMove(loc) meatslab.throw_at(pick(nearby_turfs),i,3) for (var/turfs=1 to meat_produced) var/turf/gibturf = pick(nearby_turfs) if (!gibturf.density && (src in view(gibturf))) - new gibtype(gibturf,i,diseases) + new gibtype(gibturf, i, diseases) pixel_x = base_pixel_x //return to its spot after shaking operating = FALSE @@ -243,4 +256,4 @@ if(victim.loc == input) victim.forceMove(src) - victim.gib() + victim.gib(DROP_ALL_REMAINS) diff --git a/code/modules/food_and_drinks/machinery/griddle.dm b/code/modules/food_and_drinks/machinery/griddle.dm index 93f80a8a24167..91979e2ebcabf 100644 --- a/code/modules/food_and_drinks/machinery/griddle.dm +++ b/code/modules/food_and_drinks/machinery/griddle.dm @@ -1,7 +1,7 @@ /obj/machinery/griddle name = "griddle" desc = "Because using pans is for pansies." - icon = 'icons/obj/machines/kitchenmachines.dmi' + icon = 'icons/obj/machines/kitchen.dmi' icon_state = "griddle1_off" density = TRUE pass_flags_self = PASSMACHINE | PASSTABLE| LETPASSTHROW // It's roughly the height of a table. @@ -83,6 +83,13 @@ /obj/machinery/griddle/attack_hand(mob/user, list/modifiers) . = ..() + toggle_mode() + +/obj/machinery/griddle/attack_robot(mob/user) + . = ..() + toggle_mode() + +/obj/machinery/griddle/proc/toggle_mode() on = !on if(on) begin_processing() diff --git a/code/modules/food_and_drinks/machinery/grill.dm b/code/modules/food_and_drinks/machinery/grill.dm index 3c2d462c673c2..996b9ee8dada4 100644 --- a/code/modules/food_and_drinks/machinery/grill.dm +++ b/code/modules/food_and_drinks/machinery/grill.dm @@ -6,7 +6,7 @@ /obj/machinery/grill name = "grill" desc = "Just like the old days." - icon = 'icons/obj/kitchen.dmi' + icon = 'icons/obj/machines/kitchen.dmi' icon_state = "grill_open" density = TRUE pass_flags_self = PASSMACHINE | LETPASSTHROW @@ -96,15 +96,10 @@ grilled_item.AddComponent(/datum/component/sizzle) /obj/machinery/grill/Exited(atom/movable/gone, direction) + . = ..() if(gone == grilled_item) finish_grill() grilled_item = null - return ..() - -/obj/machinery/grill/handle_atom_del(atom/A) - if(A == grilled_item) - grilled_item = null - return ..() /obj/machinery/grill/wrench_act(mob/living/user, obj/item/I) . = ..() @@ -131,7 +126,7 @@ return ..() /obj/machinery/grill/proc/finish_grill() - if(grilled_item) + if(!QDELETED(grilled_item)) if(grill_time >= 20) grilled_item.AddElement(/datum/element/grilled_item, grill_time) UnregisterSignal(grilled_item, COMSIG_ITEM_GRILLED) diff --git a/code/modules/food_and_drinks/machinery/icecream_vat.dm b/code/modules/food_and_drinks/machinery/icecream_vat.dm index 04f73e2ffa7c7..607c54e6ff19d 100644 --- a/code/modules/food_and_drinks/machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/machinery/icecream_vat.dm @@ -3,7 +3,7 @@ /obj/machinery/icecream_vat name = "ice cream vat" desc = "Ding-aling ding dong. Get your Nanotrasen-approved ice cream!" - icon = 'icons/obj/kitchen.dmi' + icon = 'icons/obj/service/kitchen.dmi' icon_state = "icecream_vat" density = TRUE anchored = FALSE @@ -17,13 +17,23 @@ var/static/list/obj/item/food/icecream/cone_prototypes var/static/list/icecream_vat_reagents = list( /datum/reagent/consumable/milk = 6, + /datum/reagent/consumable/korta_milk = 6, /datum/reagent/consumable/flour = 6, + /datum/reagent/consumable/korta_flour = 6, /datum/reagent/consumable/sugar = 6, /datum/reagent/consumable/ice = 6, /datum/reagent/consumable/coco = 6, /datum/reagent/consumable/vanilla = 6, /datum/reagent/consumable/berryjuice = 6, - /datum/reagent/consumable/ethanol/singulo = 6) + /datum/reagent/consumable/ethanol/singulo = 6, + /datum/reagent/consumable/lemonjuice = 6, + /datum/reagent/consumable/caramel = 6, + /datum/reagent/consumable/banana = 6, + /datum/reagent/consumable/orangejuice = 6, + /datum/reagent/consumable/cream = 6, + /datum/reagent/consumable/peachjuice = 6, + /datum/reagent/consumable/cherryjelly = 6, + ) /obj/machinery/icecream_vat/Initialize(mapload) . = ..() @@ -126,11 +136,12 @@ /obj/machinery/icecream_vat/Topic(href, href_list) if(..()) return + var/mob/user = usr if(href_list["select"]) var/datum/ice_cream_flavour/flavour = GLOB.ice_cream_flavours[href_list["select"]] if(!flavour || flavour.hidden) //Nice try, tex. return - visible_message(span_notice("[usr] sets [src] to dispense [href_list["select"]] flavoured ice cream.")) + visible_message(span_notice("[user] sets [src] to dispense [href_list["select"]] flavoured ice cream.")) selected_flavour = flavour.name if(href_list["cone"]) @@ -139,17 +150,19 @@ return if(product_types[cone_path] >= 1) product_types[cone_path]-- - var/obj/item/food/icecream/cone = new cone_path(loc) - visible_message(span_info("[usr] dispenses a crunchy [cone.name] from [src].")) + var/obj/item/food/icecream/cone = new cone_path(get_turf(src)) + if(!user.put_in_hands(cone)) + cone.forceMove(drop_location()) + visible_message(span_info("[user] dispenses a crunchy [cone.name] from [src].")) else - to_chat(usr, span_warning("There are no [initial(cone_path.name)]s left!")) + to_chat(user, span_warning("There are no [initial(cone_path.name)]s left!")) if(href_list["make"]) var/datum/ice_cream_flavour/flavour = GLOB.ice_cream_flavours[href_list["make"]] if(!flavour || flavour.hidden) //Nice try, tex. return var/amount = (text2num(href_list["amount"])) - make(usr, href_list["make"], amount, flavour.ingredients) + make(user, href_list["make"], amount, flavour.ingredients) if(href_list["make_cone"]) var/path = text2path(href_list["make_cone"]) @@ -157,7 +170,7 @@ if(!cone) //Nice try, tex. return var/amount = (text2num(href_list["amount"])) - make(usr, path, amount, cone.ingredients) + make(user, path, amount, cone.ingredients) if(href_list["disposeI"]) reagents.del_reagent(text2path(href_list["disposeI"])) @@ -171,8 +184,8 @@ updateDialog() if(href_list["close"]) - usr.unset_machine() - usr << browse(null,"window=icecreamvat") + user.unset_machine() + user << browse(null,"window=icecreamvat") return /obj/machinery/icecream_vat/deconstruct(disassembled = TRUE) diff --git a/code/modules/food_and_drinks/machinery/microwave.dm b/code/modules/food_and_drinks/machinery/microwave.dm index 59d0a7315123b..8060bf150d36e 100644 --- a/code/modules/food_and_drinks/machinery/microwave.dm +++ b/code/modules/food_and_drinks/machinery/microwave.dm @@ -51,7 +51,7 @@ /obj/machinery/microwave/Initialize(mapload) . = ..() - wires = new /datum/wires/microwave(src) + set_wires(new /datum/wires/microwave(src)) create_reagents(100) soundloop = new(src, FALSE) update_appearance(UPDATE_ICON) @@ -146,11 +146,10 @@ for (var/atom/movable/ingredient as anything in ingredients) var/image/ingredient_overlay = image(ingredient, src) - var/icon/ingredient_icon = icon(ingredient.icon, ingredient.icon_state) - + var/list/icon_dimensions = get_icon_dimensions(ingredient.icon) ingredient_overlay.transform = ingredient_overlay.transform.Scale( - MICROWAVE_INGREDIENT_OVERLAY_SIZE / ingredient_icon.Width(), - MICROWAVE_INGREDIENT_OVERLAY_SIZE / ingredient_icon.Height(), + MICROWAVE_INGREDIENT_OVERLAY_SIZE / icon_dimensions["width"], + MICROWAVE_INGREDIENT_OVERLAY_SIZE / icon_dimensions["height"], ) ingredient_overlay.pixel_y = -4 @@ -287,9 +286,16 @@ balloon_alert(user, "it's too dirty!") return TRUE - if(istype(O, /obj/item/storage/bag/tray)) + if(istype(O, /obj/item/storage)) var/obj/item/storage/T = O var/loaded = 0 + + if(!istype(O, /obj/item/storage/bag/tray)) + // Non-tray dumping requires a do_after + to_chat(user, span_notice("You start dumping out the contents of [O] into [src]...")) + if(!do_after(user, 2 SECONDS, target = T)) + return + for(var/obj/S in T.contents) if(!IS_EDIBLE(S)) continue @@ -366,7 +372,11 @@ open() playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) - +/** + * Begins the process of cooking the included ingredients. + * + * * cooker - The mob that initiated the cook cycle, can be null if no apparent mob triggered it (such as via emp) + */ /obj/machinery/microwave/proc/cook(mob/cooker) if(machine_stat & (NOPOWER|BROKEN)) return @@ -378,7 +388,7 @@ playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) return - if(HAS_TRAIT(cooker, TRAIT_CURSED) && prob(7)) + if(cooker && HAS_TRAIT(cooker, TRAIT_CURSED) && prob(7)) muck() return if(prob(max((5 / efficiency) - 5, dirty * 5))) //a clean unupgraded microwave has no risk of failure @@ -412,10 +422,20 @@ s.set_up(2, 1, src) s.start() +/** + * The start of the cook loop + * + * * cooker - The mob that initiated the cook cycle, can be null if no apparent mob triggered it (such as via emp) + */ /obj/machinery/microwave/proc/start(mob/cooker) wzhzhzh() loop(MICROWAVE_NORMAL, 10, cooker = cooker) +/** + * The start of the cook loop, but can fail (result in a splat / dirty microwave) + * + * * cooker - The mob that initiated the cook cycle, can be null if no apparent mob triggered it (such as via emp) + */ /obj/machinery/microwave/proc/start_can_fail(mob/cooker) wzhzhzh() loop(MICROWAVE_PRE, 4, cooker = cooker) @@ -427,12 +447,20 @@ update_appearance() loop(MICROWAVE_MUCK, 4) +/** + * The actual cook loop started via [proc/start] or [proc/start_can_fail] + * + * * type - the type of cooking, determined via how this iteration of loop is called, and determines the result + * * time - how many loops are left, base case for recursion + * * wait - deciseconds between loops + * * cooker - The mob that initiated the cook cycle, can be null if no apparent mob triggered it (such as via emp) + */ /obj/machinery/microwave/proc/loop(type, time, wait = max(12 - 2 * efficiency, 2), mob/cooker) // standard wait is 10 if((machine_stat & BROKEN) && type == MICROWAVE_PRE) pre_fail() return - if(!time || !length(ingredients)) + if(time <= 0 || !length(ingredients)) switch(type) if(MICROWAVE_NORMAL) loop_finish(cooker) @@ -451,9 +479,15 @@ pre_fail() eject() +/** + * Called when the loop is done successfully, no dirty mess or whatever + * + * * cooker - The mob that initiated the cook cycle, can be null if no apparent mob triggered it (such as via emp) + */ /obj/machinery/microwave/proc/loop_finish(mob/cooker) operating = FALSE + var/cursed_chef = cooker && HAS_TRAIT(cooker, TRAIT_CURSED) var/metal_amount = 0 for(var/obj/item/cooked_item in ingredients) var/sigreturn = cooked_item.microwave_act(src, cooker, randomize_pixel_offset = ingredients.len) @@ -466,7 +500,7 @@ metal_amount += (cooked_item.custom_materials?[GET_MATERIAL_REF(/datum/material/iron)] || 0) - if(HAS_TRAIT(cooker, TRAIT_CURSED) && prob(5)) + if(cursed_chef && prob(5)) spark() broken = REALLY_BROKEN explosion(src, light_impact_range = 2, flame_range = 1) @@ -474,7 +508,7 @@ if(metal_amount) spark() broken = REALLY_BROKEN - if(HAS_TRAIT(cooker, TRAIT_CURSED) || prob(max(metal_amount / 2, 33))) // If we're unlucky and have metal, we're guaranteed to explode + if(cursed_chef || prob(max(metal_amount / 2, 33))) // If we're unlucky and have metal, we're guaranteed to explode explosion(src, heavy_impact_range = 1, light_impact_range = 2) else dump_inventory_contents() diff --git a/code/modules/food_and_drinks/machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/machinery/monkeyrecycler.dm index 1a9c8db1bb06c..6baedf3bdbe3d 100644 --- a/code/modules/food_and_drinks/machinery/monkeyrecycler.dm +++ b/code/modules/food_and_drinks/machinery/monkeyrecycler.dm @@ -3,7 +3,7 @@ GLOBAL_LIST_EMPTY(monkey_recyclers) /obj/machinery/monkey_recycler name = "monkey recycler" desc = "A machine used for recycling dead monkeys into monkey cubes." - icon = 'icons/obj/kitchen.dmi' + icon = 'icons/obj/machines/kitchen.dmi' icon_state = "grinder" layer = BELOW_OBJ_LAYER density = TRUE @@ -98,6 +98,6 @@ GLOBAL_LIST_EMPTY(monkey_recyclers) /obj/machinery/monkey_recycler/multitool_act(mob/living/user, obj/item/multitool/I) . = ..() if(istype(I)) - to_chat(user, span_notice("You log [src] in the multitool's buffer.")) - I.buffer = src + I.set_buffer(src) + balloon_alert(user, "saved to multitool buffer") return TRUE diff --git a/code/modules/food_and_drinks/machinery/oven.dm b/code/modules/food_and_drinks/machinery/oven.dm index 17cb13acce670..18327bd90ef43 100644 --- a/code/modules/food_and_drinks/machinery/oven.dm +++ b/code/modules/food_and_drinks/machinery/oven.dm @@ -11,7 +11,7 @@ /obj/machinery/oven name = "oven" desc = "Why do they call it oven when you of in the cold food of out hot eat the food?" - icon = 'icons/obj/machines/kitchenmachines.dmi' + icon = 'icons/obj/machines/kitchen.dmi' icon_state = "oven_off" base_icon_state = "oven" density = TRUE @@ -184,7 +184,7 @@ update_appearance() update_baking_audio() return TRUE - + /obj/machinery/oven/proc/update_baking_audio() if(!oven_loop) return diff --git a/code/modules/food_and_drinks/machinery/processor.dm b/code/modules/food_and_drinks/machinery/processor.dm index fa5b0fb3c5dec..6a9d6090c1f2b 100644 --- a/code/modules/food_and_drinks/machinery/processor.dm +++ b/code/modules/food_and_drinks/machinery/processor.dm @@ -3,7 +3,7 @@ /obj/machinery/processor name = "food processor" desc = "An industrial grinder used to process meat and other foods. Keep hands clear of intake area while operating." - icon = 'icons/obj/kitchen.dmi' + icon = 'icons/obj/machines/kitchen.dmi' icon_state = "processor1" layer = BELOW_OBJ_LAYER density = TRUE @@ -69,13 +69,14 @@ var/cached_multiplier = (recipe.food_multiplier * rating_amount) for(var/i in 1 to cached_multiplier) var/atom/processed_food = new recipe.output(drop_location()) + processed_food.reagents.clear_reagents() what.reagents.copy_to(processed_food, what.reagents.total_volume, multiplier = 1 / cached_multiplier) if(cached_mats) processed_food.set_custom_materials(cached_mats, 1 / cached_multiplier) if(isliving(what)) var/mob/living/themob = what - themob.gib(TRUE,TRUE,TRUE) + themob.gib() else qdel(what) LAZYREMOVE(processor_contents, what) diff --git a/code/modules/food_and_drinks/machinery/smartfridge.dm b/code/modules/food_and_drinks/machinery/smartfridge.dm index d75739750817d..37018f7dd5b49 100644 --- a/code/modules/food_and_drinks/machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/machinery/smartfridge.dm @@ -4,7 +4,7 @@ /obj/machinery/smartfridge name = "smartfridge" desc = "Keeps cold things cold and hot things cold." - icon = 'icons/obj/smartfridge.dmi' + icon = 'icons/obj/machines/smartfridge.dmi' icon_state = "smartfridge" layer = BELOW_OBJ_LAYER density = TRUE @@ -67,14 +67,14 @@ if(istype(src, /obj/machinery/smartfridge/drying_rack)) return FALSE if(welded_down) - if(!tool.tool_start_check(user, amount=1)) + if(!tool.tool_start_check(user, amount=2)) return TRUE user.visible_message( span_notice("[user.name] starts to cut the [name] free from the floor."), span_notice("You start to cut [src] free from the floor..."), span_hear("You hear welding."), ) - if(!tool.use_tool(src, user, delay=100, amount=1, volume=100)) + if(!tool.use_tool(src, user, delay=100, volume=100)) return FALSE welded_down = FALSE to_chat(user, span_notice("You cut [src] free from the floor.")) @@ -82,14 +82,14 @@ if(!anchored) to_chat(user, span_warning("[src] needs to be wrenched to the floor!")) return TRUE - if(!tool.tool_start_check(user, amount=1)) + if(!tool.tool_start_check(user, amount=2)) return TRUE user.visible_message( span_notice("[user.name] starts to weld the [name] to the floor."), span_notice("You start to weld [src] to the floor..."), span_hear("You hear welding."), ) - if(!tool.use_tool(src, user, delay=100, amount=1, volume=100)) + if(!tool.use_tool(src, user, delay=100, volume=100)) balloon_alert(user, "cancelled!") return FALSE welded_down = TRUE @@ -101,7 +101,7 @@ if(istype(src, /obj/machinery/smartfridge/drying_rack)) return FALSE if(machine_stat & BROKEN) - if(!tool.tool_start_check(user, amount=0)) + if(!tool.tool_start_check(user, amount=1)) return FALSE user.visible_message( span_notice("[user] is repairing [src]."), @@ -349,7 +349,8 @@ .["name"] = name .["isdryer"] = FALSE -/obj/machinery/smartfridge/handle_atom_del(atom/A) // Update the UIs in case something inside gets deleted +/obj/machinery/smartfridge/Exited(atom/movable/gone, direction) // Update the UIs in case something inside is removed + . = ..() SStgui.update_uis(src) /obj/machinery/smartfridge/ui_act(action, params) @@ -398,7 +399,7 @@ /obj/machinery/smartfridge/drying_rack name = "drying rack" desc = "A wooden contraption, used to dry plant products, food and hide." - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "drying_rack" resistance_flags = FLAMMABLE visible_contents = FALSE @@ -512,7 +513,7 @@ base_build_path = /obj/machinery/smartfridge/drinks /obj/machinery/smartfridge/drinks/accept_check(obj/item/O) - if(!is_reagent_container(O) || (O.item_flags & ABSTRACT) || !O.reagents || !O.reagents.reagent_list.len) + if(!is_reagent_container(O) || (O.item_flags & ABSTRACT) || istype(O,/obj/item/reagent_containers/cup/bowl) || !O.reagents || !O.reagents.reagent_list.len) return FALSE if(istype(O, /obj/item/reagent_containers/cup) || istype(O, /obj/item/reagent_containers/cup/glass) || istype(O, /obj/item/reagent_containers/condiment)) return TRUE @@ -525,7 +526,7 @@ base_build_path = /obj/machinery/smartfridge/food /obj/machinery/smartfridge/food/accept_check(obj/item/O) - if(IS_EDIBLE(O)) + if(IS_EDIBLE(O) || (istype(O,/obj/item/reagent_containers/cup/bowl) && O.reagents && O.reagents.reagent_list.len)) return TRUE return FALSE @@ -597,8 +598,11 @@ repair_rate = max(0, STANDARD_ORGAN_HEALING * (matter_bin.tier - 1) * 0.5) /obj/machinery/smartfridge/organ/process(seconds_per_tick) - for(var/obj/item/organ/organ in contents) - organ.apply_organ_damage(-repair_rate * organ.maxHealth * seconds_per_tick) + for(var/obj/item/organ/target_organ in contents) + if(!target_organ.damage) + continue + + target_organ.apply_organ_damage(-repair_rate * target_organ.maxHealth * seconds_per_tick, required_organ_flag = ORGAN_ORGANIC) /obj/machinery/smartfridge/organ/Exited(atom/movable/gone, direction) . = ..() @@ -680,7 +684,7 @@ name = "disk compartmentalizer" desc = "A machine capable of storing a variety of disks. Denoted by most as the DSU (disk storage unit)." icon_state = "disktoaster" - icon = 'icons/obj/vending.dmi' + icon = 'icons/obj/machines/vending.dmi' pass_flags = PASSTABLE can_atmos_pass = ATMOS_PASS_YES visible_contents = FALSE diff --git a/code/modules/food_and_drinks/machinery/stove.dm b/code/modules/food_and_drinks/machinery/stove.dm index 87cf51f7cb82f..38f98cfa8a8bf 100644 --- a/code/modules/food_and_drinks/machinery/stove.dm +++ b/code/modules/food_and_drinks/machinery/stove.dm @@ -14,7 +14,7 @@ active_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.8 // Stove icon is 32x48, we'll use a Range for preview instead - icon_preview = 'icons/obj/machines/kitchenmachines.dmi' + icon_preview = 'icons/obj/machines/kitchen.dmi' icon_state_preview = "range_off" /obj/machinery/stove/Initialize(mapload) @@ -28,13 +28,12 @@ /obj/item/reagent_containers/cup/soup_pot name = "soup pot" desc = "A tall soup designed to mix and cook all kinds of soup." - icon = 'icons/obj/soup_pot.dmi' + icon = 'icons/obj/service/kitchen.dmi' icon_state = "pot" base_icon_state = "pot" volume = 200 possible_transfer_amounts = list(20, 50, 100, 200) amount_per_transfer_from_this = 50 - amount_list_position = 2 reagent_flags = REFILLABLE | DRAINABLE custom_materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT * 2.5) w_class = WEIGHT_CLASS_BULKY @@ -181,11 +180,18 @@ // Clearing reagents Will do this for us already, but if we have no reagents this is a failsafe dump_ingredients() -/obj/item/reagent_containers/cup/soup_pot/proc/dump_ingredients(atom/drop_loc = drop_location()) +/** + * Dumps all inside ingredients to a spot + * + * * drop_loc - Where to drop the ingredients, defaults to drop loc + * * x_offset - How much pixel X offset to give every ingredient, if not set will be random + * * y_offset - How much pixel Y offset to give every ingredient, if not set will be random + */ +/obj/item/reagent_containers/cup/soup_pot/proc/dump_ingredients(atom/drop_loc = drop_location(), x_offset, y_offset) for(var/obj/item/ingredient as anything in added_ingredients) ingredient.forceMove(drop_loc) - ingredient.pixel_x += rand(-4, 4) - ingredient.pixel_y += rand(-4, 4) + ingredient.pixel_x += (isnum(x_offset) ? x_offset : rand(-4, 4)) + ingredient.pixel_y += (isnum(y_offset) ? x_offset : rand(-4, 4)) ingredient.SpinAnimation(loops = 1) update_appearance(UPDATE_OVERLAYS) diff --git a/code/modules/food_and_drinks/machinery/stove_component.dm b/code/modules/food_and_drinks/machinery/stove_component.dm index 898cd7e3513c1..697e27f584909 100644 --- a/code/modules/food_and_drinks/machinery/stove_component.dm +++ b/code/modules/food_and_drinks/machinery/stove_component.dm @@ -39,6 +39,7 @@ /datum/component/stove/RegisterWithParent() RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attackby)) RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND_SECONDARY, PROC_REF(on_attack_hand_secondary)) + RegisterSignal(parent, COMSIG_ATOM_ATTACK_ROBOT_SECONDARY, PROC_REF(on_attack_robot_secondary)) RegisterSignal(parent, COMSIG_ATOM_EXITED, PROC_REF(on_exited)) RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_overlay_update)) RegisterSignal(parent, COMSIG_OBJ_DECONSTRUCT, PROC_REF(on_deconstructed)) @@ -97,13 +98,25 @@ /datum/component/stove/proc/on_attack_hand_secondary(obj/machinery/source) SIGNAL_HANDLER + toggle_mode() + + return COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN + +/datum/component/stove/proc/on_attack_robot_secondary(obj/machinery/source) + SIGNAL_HANDLER + + toggle_mode() + + return COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN + +/datum/component/stove/proc/toggle_mode() var/obj/machinery/real_parent = parent if(on) turn_off() else if(real_parent.machine_stat & (BROKEN|NOPOWER)) real_parent.balloon_alert_to_viewers("no power!") - return COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN + return else turn_on() @@ -112,15 +125,13 @@ playsound(real_parent, 'sound/machines/click.ogg', 30, TRUE) playsound(real_parent, on ? 'sound/items/welderactivate.ogg' : 'sound/items/welderdeactivate.ogg', 15, TRUE) - return COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN - /datum/component/stove/proc/on_attackby(obj/machinery/source, obj/item/attacking_item, mob/user, params) SIGNAL_HANDLER if(!attacking_item.is_open_container()) return if(!isnull(container)) - to_chat(span_warning("You wouldn't dare try to cook two things on the same stove simultaneously. \ + to_chat(user, span_warning("You wouldn't dare try to cook two things on the same stove simultaneously. \ What if it cross contaminates?")) return COMPONENT_NO_AFTERATTACK diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm index 92006b7caace8..1454f1e6917f1 100644 --- a/code/modules/food_and_drinks/pizzabox.dm +++ b/code/modules/food_and_drinks/pizzabox.dm @@ -100,7 +100,7 @@ pizza_overlay.pixel_y = -2 . += pizza_overlay if(bomb) - var/mutable_appearance/bomb_overlay = mutable_appearance(bomb.icon, bomb.icon_state) + var/mutable_appearance/bomb_overlay = mutable_appearance(bomb.icon, bomb.icon_state, layer = layer + 0.01) bomb_overlay.pixel_y = 8 . += bomb_overlay return @@ -109,13 +109,13 @@ for(var/stacked_box in boxes) box_offset += 3 var/obj/item/pizzabox/box = stacked_box - var/mutable_appearance/box_overlay = mutable_appearance(box.icon, box.icon_state) + var/mutable_appearance/box_overlay = mutable_appearance(box.icon, box.icon_state, layer = layer + (box_offset * 0.01)) box_overlay.pixel_y = box_offset . += box_overlay var/obj/item/pizzabox/box = LAZYLEN(length(boxes)) ? boxes[length(boxes)] : src if(box.boxtag != "") - var/mutable_appearance/tag_overlay = mutable_appearance(icon, "pizzabox_tag") + var/mutable_appearance/tag_overlay = mutable_appearance(icon, "pizzabox_tag", layer = layer + (box_offset * 0.02)) tag_overlay.pixel_y = box_offset . += tag_overlay @@ -221,7 +221,7 @@ if(open && !bomb) if(!user.transferItemToLoc(I, src)) return - wires = new /datum/wires/explosive/pizza(src) + set_wires(new /datum/wires/explosive/pizza(src)) register_bomb(I) balloon_alert(user, "bomb placed") update_appearance() @@ -300,16 +300,17 @@ /obj/item/pizzabox/proc/unprocess() STOP_PROCESSING(SSobj, src) qdel(wires) - wires = null + set_wires(null) update_appearance() /obj/item/pizzabox/bomb/Initialize(mapload) . = ..() if(!pizza) - var/randompizza = pick(subtypesof(/obj/item/food/pizza)) + var/randompizza = pick(subtypesof(/obj/item/food/pizza) - /obj/item/food/pizza/flatbread) //also disincludes another base type pizza = new randompizza(src) + update_appearance() register_bomb(new /obj/item/bombcore/miniature/pizza(src)) - wires = new /datum/wires/explosive/pizza(src) + set_wires(new /datum/wires/explosive/pizza(src)) /obj/item/pizzabox/bomb/armed bomb_timer = 5 @@ -395,14 +396,14 @@ if(pizza.type != pizza_preferences[nommer.ckey]) QDEL_NULL(pizza) else - pizza.foodtypes = nommer.dna.species.liked_food //make sure it's our favourite + pizza.foodtypes = nommer.get_liked_foodtypes() //make sure it's our favourite return var/obj/item/food/pizza/favourite_pizza_type = pizza_preferences[nommer.ckey] pizza = new favourite_pizza_type boxtag_set = FALSE update_appearance() //update our boxtag to match our new pizza - pizza.foodtypes = nommer.dna.species.liked_food //it's our favorite! + pizza.foodtypes = nommer.get_liked_foodtypes() //it's our favorite! ///screentips for pizzaboxes /obj/item/pizzabox/add_context(atom/source, list/context, obj/item/held_item, mob/user) diff --git a/code/modules/food_and_drinks/plate.dm b/code/modules/food_and_drinks/plate.dm index 6c6b33bcdd2d2..b584d887930f4 100644 --- a/code/modules/food_and_drinks/plate.dm +++ b/code/modules/food_and_drinks/plate.dm @@ -1,7 +1,7 @@ /obj/item/plate name = "plate" desc = "Holds food, powerful. Good for morale when you're not eating your spaghetti off of a desk." - icon = 'icons/obj/kitchen.dmi' + icon = 'icons/obj/service/kitchen.dmi' icon_state = "plate" w_class = WEIGHT_CLASS_BULKY //No backpack. ///How many things fit on this plate? @@ -98,7 +98,7 @@ /obj/item/plate_shard name = "ceramic shard" - icon = 'icons/obj/kitchen.dmi' + icon = 'icons/obj/service/kitchen.dmi' icon_state = "plate_shard1" base_icon_state = "plate_shard" w_class = WEIGHT_CLASS_TINY diff --git a/code/modules/food_and_drinks/recipes/drinks/drinks_alcoholic.dm b/code/modules/food_and_drinks/recipes/drinks/drinks_alcoholic.dm index 076587b0cd9c1..1da96fc0aae70 100644 --- a/code/modules/food_and_drinks/recipes/drinks/drinks_alcoholic.dm +++ b/code/modules/food_and_drinks/recipes/drinks/drinks_alcoholic.dm @@ -168,6 +168,10 @@ results = list(/datum/reagent/consumable/ethanol/whiskeysoda = 3) required_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 2, /datum/reagent/consumable/sodawater = 1) +/datum/chemical_reaction/drink/wellcheers + results = list(/datum/reagent/consumable/wellcheers = 5) + required_reagents = list(/datum/reagent/consumable/berryjuice = 1, /datum/reagent/consumable/watermelonjuice = 1, /datum/reagent/consumable/sodawater = 1, /datum/reagent/consumable/salt = 1, /datum/reagent/consumable/ethanol/absinthe = 1) + /datum/chemical_reaction/drink/black_russian results = list(/datum/reagent/consumable/ethanol/black_russian = 5) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 3, /datum/reagent/consumable/ethanol/kahlua = 2) @@ -237,7 +241,7 @@ /datum/chemical_reaction/drink/pina_olivada results = list(/datum/reagent/consumable/ethanol/pina_olivada = 5) - required_reagents = list(/datum/reagent/consumable/pineapplejuice = 3, /datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/quality_oil = 1) + required_reagents = list(/datum/reagent/consumable/pineapplejuice = 3, /datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/nutriment/fat/oil/olive = 1) /datum/chemical_reaction/drink/sbiten results = list(/datum/reagent/consumable/ethanol/sbiten = 10) @@ -406,7 +410,7 @@ /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) + required_reagents = list(/datum/reagent/water/salt = 2, /datum/reagent/consumable/tomatojuice = 2, /datum/reagent/consumable/nutriment = 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 @@ -582,3 +586,78 @@ mix_message = "Arcs of lightning fly from the mixture." mix_sound = 'sound/weapons/zapbang.ogg' +/datum/chemical_reaction/drink/yuyakita + results = list(/datum/reagent/consumable/ethanol/yuyakita = 4) + required_reagents = list(/datum/reagent/consumable/ethanol/tequila = 2, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/ethanol/yuyake = 1) + +/datum/chemical_reaction/drink/saibasan + results = list(/datum/reagent/consumable/ethanol/saibasan = 10) + required_reagents = list(/datum/reagent/consumable/ethanol/shochu = 2, /datum/reagent/consumable/ethanol/yuyake = 2, /datum/reagent/consumable/triple_citrus = 3, /datum/reagent/consumable/cherryjelly = 3) + +/datum/chemical_reaction/drink/banzai_ti + results = list(/datum/reagent/consumable/ethanol/banzai_ti = 10) + required_reagents = list(/datum/reagent/consumable/ethanol/yuyake = 1, /datum/reagent/consumable/ethanol/triple_sec = 1, /datum/reagent/consumable/ethanol/gin = 1, /datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/ethanol/tequila = 1, /datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/triple_citrus = 2, /datum/reagent/consumable/sodawater = 2) + +/datum/chemical_reaction/drink/sanraizusoda + results = list(/datum/reagent/consumable/ethanol/sanraizusoda = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/yuyake = 1, /datum/reagent/consumable/sodawater = 2, /datum/reagent/consumable/ice = 1, /datum/reagent/consumable/cream = 1) + +/datum/chemical_reaction/drink/kumicho + results = list(/datum/reagent/consumable/ethanol/kumicho = 4) + required_reagents = list(/datum/reagent/consumable/ethanol/godfather = 2, /datum/reagent/consumable/ethanol/shochu = 1, /datum/reagent/consumable/ethanol/bitters = 1) + +/datum/chemical_reaction/drink/red_planet + results = list(/datum/reagent/consumable/ethanol/red_planet = 8) + required_reagents = list(/datum/reagent/consumable/ethanol/shochu = 2, /datum/reagent/consumable/ethanol/triple_sec = 2, /datum/reagent/consumable/ethanol/vermouth = 2, /datum/reagent/consumable/grenadine = 1, /datum/reagent/consumable/ethanol/bitters = 1) + +/datum/chemical_reaction/drink/amaterasu + results = list(/datum/reagent/consumable/ethanol/amaterasu = 10) + required_reagents = list(/datum/reagent/consumable/ethanol/shochu = 1, /datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/grenadine = 1, /datum/reagent/consumable/berryjuice = 2, /datum/reagent/consumable/sodawater = 5) + +/datum/chemical_reaction/drink/nekomimosa + results = list(/datum/reagent/consumable/ethanol/nekomimosa = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/yuyake = 2, /datum/reagent/consumable/watermelonjuice = 2, /datum/reagent/consumable/ethanol/champagne = 1) + +/datum/chemical_reaction/drink/sentai_quencha + results = list(/datum/reagent/consumable/ethanol/sentai_quencha = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/shochu = 1, /datum/reagent/consumable/ethanol/curacao = 1, /datum/reagent/consumable/triple_citrus = 1, /datum/reagent/consumable/melon_soda = 2) + +/datum/chemical_reaction/drink/bosozoku + results = list(/datum/reagent/consumable/ethanol/bosozoku = 2) + required_reagents = list(/datum/reagent/consumable/ethanol/rice_beer = 1, /datum/reagent/consumable/lemonade = 1) + +/datum/chemical_reaction/drink/ersatzche + results = list(/datum/reagent/consumable/ethanol/ersatzche = 10) + required_reagents = list(/datum/reagent/consumable/ethanol/rice_beer = 5, /datum/reagent/consumable/pineapplejuice = 3, /datum/reagent/consumable/capsaicin = 1, /datum/reagent/consumable/sugar = 1) + +/datum/chemical_reaction/drink/red_city_am + results = list(/datum/reagent/consumable/ethanol/red_city_am = 10) + required_reagents = list(/datum/reagent/consumable/ethanol/rice_beer = 5, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/red_bay = 1, /datum/reagent/consumable/soysauce = 1, /datum/reagent/consumable/tomatojuice = 2) + +/datum/chemical_reaction/drink/kings_ransom + results = list(/datum/reagent/consumable/ethanol/kings_ransom = 10) + required_reagents = list(/datum/reagent/consumable/ethanol/rice_beer = 5, /datum/reagent/consumable/ethanol/gin = 2, /datum/reagent/consumable/berryjuice = 2, /datum/reagent/consumable/ethanol/bitters = 1) + +/datum/chemical_reaction/drink/four_bit + results = list(/datum/reagent/consumable/ethanol/four_bit = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/hakka_mate = 2, /datum/reagent/consumable/limejuice = 1) + +/datum/chemical_reaction/drink/white_hawaiian + results = list(/datum/reagent/consumable/ethanol/white_hawaiian = 4) + required_reagents = list(/datum/reagent/consumable/ethanol/kahlua = 1, /datum/reagent/consumable/ethanol/coconut_rum = 1, /datum/reagent/consumable/coconut_milk = 2) + +/datum/chemical_reaction/drink/maui_sunrise + results = list(/datum/reagent/consumable/ethanol/maui_sunrise = 10) + required_reagents = list(/datum/reagent/consumable/ethanol/coconut_rum = 2, /datum/reagent/consumable/pineapplejuice = 2, /datum/reagent/consumable/ethanol/yuyake = 1, /datum/reagent/consumable/triple_citrus = 1, /datum/reagent/consumable/lemon_lime = 4) + +/datum/chemical_reaction/drink/imperial_mai_tai + results = list(/datum/reagent/consumable/ethanol/imperial_mai_tai = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/navy_rum = 1, /datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/ethanol/triple_sec = 1, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/korta_nectar = 1) + +/datum/chemical_reaction/drink/konococo_rumtini + results = list(/datum/reagent/consumable/ethanol/konococo_rumtini = 10) + required_reagents = list(/datum/reagent/consumable/ethanol/coconut_rum = 2, /datum/reagent/consumable/ethanol/kahlua = 3, /datum/reagent/consumable/coffee = 3, /datum/reagent/consumable/sugar = 2) + +/datum/chemical_reaction/drink/blue_hawaiian + results = list(/datum/reagent/consumable/ethanol/blue_hawaiian = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/coconut_rum = 2, /datum/reagent/consumable/pineapplejuice = 1, /datum/reagent/consumable/lemonjuice = 1, /datum/reagent/consumable/ethanol/curacao = 1) diff --git a/code/modules/food_and_drinks/recipes/drinks/drinks_non-alcoholic.dm b/code/modules/food_and_drinks/recipes/drinks/drinks_non-alcoholic.dm index 43bc997740195..3790c7a310080 100644 --- a/code/modules/food_and_drinks/recipes/drinks/drinks_non-alcoholic.dm +++ b/code/modules/food_and_drinks/recipes/drinks/drinks_non-alcoholic.dm @@ -174,3 +174,6 @@ results = list(/datum/reagent/consumable/mississippi_queen = 50) required_reagents = list(/datum/reagent/consumable/tomatojuice = 15, /datum/reagent/consumable/mayonnaise = 10, /datum/reagent/consumable/soysauce = 5, /datum/reagent/consumable/vinegar = 2, /datum/reagent/consumable/capsaicin = 10, /datum/reagent/consumable/coco = 2) +/datum/chemical_reaction/drink/t_letter + results = list(/datum/reagent/consumable/t_letter = 2) + required_reagents = list(/datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/tea = 1) diff --git a/code/modules/food_and_drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm index f7f75bc7ad6fd..a31ed2defcd84 100644 --- a/code/modules/food_and_drinks/recipes/food_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/food_mixtures.dm @@ -1,6 +1,4 @@ /datum/crafting_recipe/food - /// A rough equivilance for how much nutrition this recipe's result will provide - var/total_nutriment_factor = 0 /datum/crafting_recipe/food/on_craft_completion(mob/user, atom/result) SHOULD_CALL_PARENT(TRUE) @@ -10,12 +8,6 @@ /datum/crafting_recipe/food/New() . = ..() - if(ispath(result, /obj/item/food)) - var/obj/item/food/result_food = new result() - for(var/datum/reagent/consumable/nutriment as anything in result_food.food_reagents) - total_nutriment_factor += initial(nutriment.nutriment_factor) * result_food.food_reagents[nutriment] - qdel(result_food) - parts |= reqs /datum/crafting_recipe/food/crafting_ui_data() @@ -24,7 +16,7 @@ if(ispath(result, /obj/item/food)) var/obj/item/food/item = result data["foodtypes"] = bitfield_to_list(initial(item.foodtypes), FOOD_FLAGS) - data["nutriments"] = total_nutriment_factor + data["complexity"] = initial(item.crafting_complexity) return data @@ -38,15 +30,25 @@ thermic_constant = 0 H_ion_release = 0 reaction_tags = REACTION_TAG_FOOD | REACTION_TAG_EASY + required_other = TRUE /// Typepath of food that is created on reaction var/atom/resulting_food_path + /// Reagent purity of the result, calculated on reaction + var/resulting_reagent_purity + +/datum/chemical_reaction/food/pre_reaction_other_checks(datum/reagents/holder) + resulting_reagent_purity = holder.get_average_purity(/datum/reagent/consumable) + return TRUE /datum/chemical_reaction/food/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) if(resulting_food_path) var/atom/location = holder.my_atom.drop_location() for(var/i in 1 to created_volume) - new resulting_food_path(location) + if(ispath(resulting_food_path, /obj/item/food) && !isnull(resulting_reagent_purity)) + new resulting_food_path(location, resulting_reagent_purity) + else + new resulting_food_path(location) /datum/chemical_reaction/food/tofu required_reagents = list(/datum/reagent/consumable/soymilk = 10) @@ -56,7 +58,7 @@ resulting_food_path = /obj/item/food/tofu /datum/chemical_reaction/food/candycorn - required_reagents = list(/datum/reagent/consumable/cornoil = 5) + required_reagents = list(/datum/reagent/consumable/nutriment/fat/oil = 5) required_catalysts = list(/datum/reagent/consumable/sugar = 5) mob_react = FALSE reaction_flags = REACTION_INSTANT @@ -95,6 +97,10 @@ required_reagents = list(/datum/reagent/consumable/corn_starch = 1, /datum/reagent/toxin/acid = 1) required_temp = 374 +/datum/chemical_reaction/food/rice_flour + results = list(/datum/reagent/consumable/rice_flour = 10) + required_reagents = list(/datum/reagent/consumable/flour = 5,/datum/reagent/consumable/rice = 5) + /datum/chemical_reaction/food/caramel results = list(/datum/reagent/consumable/caramel = 1) required_reagents = list(/datum/reagent/consumable/sugar = 1) @@ -148,6 +154,12 @@ reaction_flags = REACTION_INSTANT resulting_food_path = /obj/item/food/dough +/datum/chemical_reaction/food/rice_dough + required_reagents = list(/datum/reagent/consumable/rice_flour = 20,/datum/reagent/water = 10) + mix_message = "The ingredients form a rice dough." + reaction_flags = REACTION_INSTANT + resulting_food_path = /obj/item/food/rice_dough + /datum/chemical_reaction/food/cakebatter required_reagents = list(/datum/reagent/consumable/eggyolk = 6, /datum/reagent/consumable/eggwhite = 12, /datum/reagent/consumable/flour = 15, /datum/reagent/consumable/sugar = 5) mix_message = "The ingredients form a cake batter." @@ -202,7 +214,7 @@ 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/nutriment/fat/oil/olive = 2, /datum/reagent/medicine/salglu_solution = 5, /datum/reagent/consumable/cornmeal = 10, /datum/reagent/consumable/flour = 5) mix_message = "The ingredients form a pizza dough." reaction_flags = REACTION_INSTANT resulting_food_path = /obj/item/food/mothic_pizza_dough @@ -240,14 +252,15 @@ mix_message = "The mixture thickens into yoghurt." reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/food/quality_oil_upconvert - required_reagents = list(/datum/reagent/consumable/quality_oil = 1, /datum/reagent/consumable/cooking_oil = 2) - results = list(/datum/reagent/consumable/quality_oil = 2) +/datum/chemical_reaction/food/olive_oil_upconvert + required_catalysts = list(/datum/reagent/consumable/nutriment/fat/oil/olive = 1) + required_reagents = list( /datum/reagent/consumable/nutriment/fat/oil = 2) + results = list(/datum/reagent/consumable/nutriment/fat/oil/olive = 2) mix_message = "The cooking oil dilutes the quality oil- how delightfully devilish..." reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/food/quality_oil - results = list(/datum/reagent/consumable/quality_oil = 2) +/datum/chemical_reaction/food/olive_oil + results = list(/datum/reagent/consumable/nutriment/fat/oil/olive = 2) required_reagents = list(/datum/reagent/consumable/olivepaste = 4, /datum/reagent/water = 1) reaction_flags = REACTION_INSTANT @@ -255,3 +268,16 @@ results = list(/datum/reagent/consumable/vinegar = 5) required_reagents = list(/datum/reagent/consumable/ethanol/wine = 1, /datum/reagent/water = 1, /datum/reagent/consumable/sugar = 1) reaction_flags = REACTION_INSTANT + +/datum/chemical_reaction/food/grounding_neutralise + results = list(/datum/reagent/consumable/salt = 2) + required_reagents = list(/datum/reagent/consumable/liquidelectricity/enriched = 2, /datum/reagent/consumable/grounding_solution = 1) + mix_message = "The mixture lets off a sharp snap as the electricity discharges." + mix_sound = 'sound/weapons/taser.ogg' + reaction_flags = REACTION_INSTANT + +/datum/chemical_reaction/food/martian_batter + results = list(/datum/reagent/consumable/martian_batter = 2) + required_reagents = list(/datum/reagent/consumable/flour = 1, /datum/reagent/consumable/nutriment/soup/dashi = 1) + mix_message = "A smooth batter forms." + reaction_flags = REACTION_INSTANT diff --git a/code/modules/food_and_drinks/recipes/processor_recipes.dm b/code/modules/food_and_drinks/recipes/processor_recipes.dm index 67339575703a2..e2f433323d906 100644 --- a/code/modules/food_and_drinks/recipes/processor_recipes.dm +++ b/code/modules/food_and_drinks/recipes/processor_recipes.dm @@ -97,6 +97,7 @@ /datum/food_processor_process/spidereggs input = /obj/item/food/spidereggs + blacklist = list(/obj/item/food/spidereggs/processed) output = /obj/item/food/spidereggs/processed /datum/food_processor_process/potato diff --git a/code/modules/food_and_drinks/recipes/soup_guide.dm b/code/modules/food_and_drinks/recipes/soup_guide.dm index 4a1e0a58132ef..3a9ba05ff0c73 100644 --- a/code/modules/food_and_drinks/recipes/soup_guide.dm +++ b/code/modules/food_and_drinks/recipes/soup_guide.dm @@ -2,16 +2,32 @@ machinery = list(/obj/machinery/stove) category = CAT_SOUP non_craftable = TRUE - + /// What contained is this reaction expected to be served in? + /// Used to determine the icon to display in the crafting UI. var/expected_container = /obj/item/reagent_containers/cup/bowl +/datum/crafting_recipe/food/reaction/soup/New() + // What are ya using this path for if it's not a food reaction? + if(!ispath(reaction, /datum/chemical_reaction/food)) + return ..() + + var/datum/chemical_reaction/food/soup_reaction = reaction + // If the reaction has a solid food item result, it is prioritized over reagent results + if(ispath(initial(soup_reaction.resulting_food_path), /obj/item/food)) + result = initial(soup_reaction.resulting_food_path) + result_amount = 1 + + return ..() + /datum/crafting_recipe/food/reaction/soup/crafting_ui_data() + if(ispath(result, /obj/item/food)) + return ..() + var/list/data = list() var/datum/glass_style/has_foodtype/soup_style = GLOB.glass_style_singletons[expected_container][result] if(istype(soup_style)) data["foodtypes"] = bitfield_to_list(soup_style.drink_type, FOOD_FLAGS) - data["nutriments"] = total_nutriment_factor return data @@ -20,11 +36,7 @@ if(!istype(chemical_reaction)) return for(var/obj/item/ingredienttype as anything in chemical_reaction.required_ingredients) - reqs[ingredienttype] = chemical_reaction.required_ingredients[ingredienttype] - - if(ispath(result, /datum/reagent/consumable)) - var/datum/reagent/consumable/soup_result = result - total_nutriment_factor = initial(soup_result.nutriment_factor) * result_amount + LAZYSET(reqs, ingredienttype, chemical_reaction.required_ingredients[ingredienttype]) /datum/crafting_recipe/food/reaction/soup/meatball_soup reaction = /datum/chemical_reaction/food/soup/meatballsoup diff --git a/code/modules/food_and_drinks/recipes/soup_mixtures.dm b/code/modules/food_and_drinks/recipes/soup_mixtures.dm index ae73013a1b013..ad2caa84ca625 100644 --- a/code/modules/food_and_drinks/recipes/soup_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/soup_mixtures.dm @@ -4,7 +4,7 @@ /datum/reagent/consumable/nutriment/soup name = "Soup" chemical_flags = NONE - nutriment_factor = 12 * REAGENTS_METABOLISM // Slightly less to that of nutriment as soups will come with nutriments in tow + nutriment_factor = 12 // Slightly less to that of nutriment as soups will come with nutriments in tow burning_temperature = 520 default_container = /obj/item/reagent_containers/cup/bowl glass_price = FOOD_PRICE_CHEAP @@ -47,7 +47,7 @@ /// Tracks the total number of ingredient items needed, for calculating multipliers. Only done once in first on_reaction VAR_FINAL/total_ingredient_max - /// Multiplier applied to all reagents transfered from reagents to pot when the soup is cooked + /// Multiplier applied to all reagents transferred from reagents to pot when the soup is cooked var/ingredient_reagent_multiplier = 0.8 /// What percent of nutriment is converted to "soup" (what percent does not stay final product)? /// Raise this if your ingredients have a lot of nutriment and is overpowering your other reagents @@ -85,6 +85,40 @@ if(!length(required_ingredients)) return + // If a food item is supposed to be made, remove relevant ingredients from the pot, then make the item + if(!isnull(resulting_food_path)) + var/list/tracked_ingredients + LAZYINITLIST(tracked_ingredients) + var/ingredient_max_multiplier = INFINITY + var/obj/item/reagent_containers/cup/soup_pot/pot = holder.my_atom + + // Tracked ingredients are indexed by type and point to a list containing the actual items + for(var/obj/item/ingredient as anything in pot.added_ingredients) + if(is_type_in_list(ingredient, required_ingredients)) + LAZYADD(tracked_ingredients[ingredient.type],ingredient) + // Find the max number of ingredients that may be used for making the food item + for(var/list/ingredient_type as anything in tracked_ingredients) + ingredient_max_multiplier = min(ingredient_max_multiplier,LAZYLEN(tracked_ingredients[ingredient_type])) + // Create the food items, removing the relavent ingredients at the same time + for(var/i in 1 to (min(created_volume,ingredient_max_multiplier))) + for(var/list/ingredient_type as anything in tracked_ingredients) + var/ingredient = tracked_ingredients[ingredient_type][i] + LAZYREMOVE(pot.added_ingredients,ingredient) + qdel(ingredient) + var/obj/item/created = new resulting_food_path(get_turf(pot)) + created.pixel_y += 8 + // Re-add required reagents that were not used in this step + if(created_volume > ingredient_max_multiplier) + for(var/reagent_path as anything in required_reagents) + holder.add_reagent(reagent_path,(required_reagents[reagent_path])*(created_volume-ingredient_max_multiplier)) + + + // This only happens if we're being instant reacted so let's just skip to what we really want + if(isnull(reaction)) + testing("Soup reaction of type [type] instant reacted, cleaning up.") + clean_up(holder) + return + if(isnull(total_ingredient_max)) total_ingredient_max = 0 // We only need to calculate this once, effectively static per-type @@ -107,7 +141,6 @@ /datum/chemical_reaction/food/soup/reaction_step(datum/reagents/holder, datum/equilibrium/reaction, delta_t, delta_ph, step_reaction_vol) if(!length(required_ingredients)) return - testing("Soup reaction step progressing with an increment volume of [step_reaction_vol] and delta_t of [delta_t].") var/obj/item/reagent_containers/cup/soup_pot/pot = holder.my_atom var/list/cached_ingredients = reaction.data["ingredients"] @@ -158,34 +191,59 @@ var/obj/item/reagent_containers/cup/soup_pot/pot = holder.my_atom if(!istype(pot)) CRASH("[pot ? "Non-pot atom" : "Null pot"]) made it to the end of the [type] reaction chain.") - reaction.data["ingredients"] = null testing("Soup reaction finished with a total react volume of [react_vol] and [length(pot.added_ingredients)] ingredients. Cleaning up.") + clean_up(holder, reaction, react_vol) - for(var/obj/item/ingredient as anything in pot.added_ingredients) - // Let's not mess with indestructible items. - // Chef doesn't need more ways to delete things with cooking. - if(ingredient.resistance_flags & INDESTRUCTIBLE) - continue +/** + * Cleans up the ingredients and adds whatever leftover reagents to the mixture + * + * * holder: The soup pot + * * reaction: The reaction being cleaned up, note this CAN be null if being instant reacted + * * react_vol: How much soup was produced + */ +/datum/chemical_reaction/food/soup/proc/clean_up(datum/reagents/holder, datum/equilibrium/reaction, react_vol) + var/obj/item/reagent_containers/cup/soup_pot/pot = holder.my_atom + + reaction?.data["ingredients"] = null - // Things that had reagents or ingredients in the soup will get deleted - else if(!isnull(ingredient.reagents) || is_type_in_list(ingredient, required_ingredients)) + // If soup is made, remove ingredients as their reagents were added to the soup + if(react_vol) + for(var/obj/item/ingredient as anything in pot.added_ingredients) + // Let's not mess with indestructible items. + // Chef doesn't need more ways to delete things with cooking. + if(ingredient.resistance_flags & INDESTRUCTIBLE) + continue + + // Everything else will just get fried + if(isnull(ingredient.reagents) && !is_type_in_list(ingredient, required_ingredients)) + ingredient.AddElement(/datum/element/fried_item, 30) + continue + + // Things that had reagents or ingredients in the soup will get deleted LAZYREMOVE(pot.added_ingredients, ingredient) // Send everything left behind transfer_ingredient_reagents(ingredient, holder) // Delete, it's done qdel(ingredient) - // Everything else will just get fried - else - ingredient.AddElement(/datum/element/fried_item, 30) - // Anything left in the ingredient list will get dumped out - pot.dump_ingredients(get_turf(pot)) + pot.dump_ingredients(get_turf(pot), y_offset = 8) // Blackbox log the chemical reaction used, to account for soup reaction that don't produce typical results BLACKBOX_LOG_FOOD_MADE(type) +/** + * Transfers reagents from the passed reagent to the soup pot, as a "result" + * + * Also handles deleting a portion of nutriment reagents present, pseudo-converting it into soup reagent + * + * * ingredient: The ingredient to transfer reagents from + * * holder: The reagent holder of the soup pot the reaction is taking place in + * * amount: The amount of reagents to transfer, if null will transfer all reagents + */ /datum/chemical_reaction/food/soup/proc/transfer_ingredient_reagents(obj/item/ingredient, datum/reagents/holder, amount) + if(ingredient_reagent_multiplier <= 0) + return var/datum/reagents/ingredient_pool = ingredient.reagents // Some ingredients are purely flavor (no pun intended) and will have reagents if(isnull(ingredient_pool) || ingredient_pool.total_volume <= 0) @@ -201,6 +259,7 @@ // The other half of the nutriment, and the rest of the reagents, will get put directly into the pot ingredient_pool.trans_to(holder, amount, ingredient_reagent_multiplier, no_react = TRUE) +/// Called whenever the soup pot overfills with reagent. /datum/chemical_reaction/food/soup/proc/boil_over(datum/reagents/holder) var/obj/item/reagent_containers/cup/soup_pot/pot = holder.my_atom var/turf/below_pot = get_turf(pot) @@ -525,8 +584,8 @@ /datum/chemical_reaction/food/soup/chili_sin_carne required_reagents = list( - /datum/reagent/water = 40, - /datum/reagent/consumable/salt = 5, + /datum/reagent/water = 30, + /datum/reagent/water/salt = 10, ) required_ingredients = list( /obj/item/food/grown/chili = 1, @@ -695,7 +754,7 @@ /datum/reagent/consumable/nutriment/soup/clown_tears name = "Clown's Tears" description = "The sorrow and melancholy of a thousand bereaved clowns, forever denied their Honkmechs." - nutriment_factor = 5 * REAGENTS_METABOLISM + nutriment_factor = 5 ph = 9.2 data = list("a bad joke" = 1, "mournful honking" = 1) color = "#EEF442" @@ -1062,8 +1121,8 @@ /datum/chemical_reaction/food/soup/electron required_reagents = list( - /datum/reagent/water = 45, - /datum/reagent/consumable/salt = 5, + /datum/reagent/water = 40, + /datum/reagent/water/salt = 10, ) required_ingredients = list( /obj/item/food/grown/mushroom/jupitercup = 1, @@ -1123,7 +1182,7 @@ /obj/item/food/grown/onion = 2, /obj/item/food/grown/chili = 1, /obj/item/food/grown/garlic = 1, - /obj/item/food/butter = 1, + /obj/item/food/butterslice = 1, /obj/item/food/boiledrice = 1, ) results = list( @@ -1470,12 +1529,12 @@ /datum/chemical_reaction/food/soup/cheese required_reagents = list( /datum/reagent/water = 30, - /datum/reagent/consumable/flour = 10, /datum/reagent/consumable/milk = 10, ) required_ingredients = list( + /obj/item/food/doughslice = 2, /obj/item/food/cheese/wedge = 2, - /obj/item/food/butter = 1, + /obj/item/food/butterslice = 1, /obj/item/food/grown/potato/sweet = 1, ) results = list( @@ -1626,8 +1685,8 @@ /datum/chemical_reaction/food/soup/rice_porridge required_reagents = list( - /datum/reagent/water = 30, - /datum/reagent/consumable/salt = 5, + /datum/reagent/water = 20, + /datum/reagent/water/salt = 10, ) required_ingredients = list( /obj/item/food/boiledrice = 1, @@ -1686,7 +1745,7 @@ required_ingredients = list( /obj/item/food/cheese/firm_cheese_slice = 1, /obj/item/food/cheese/curd_cheese = 1, - /obj/item/food/butter = 1, + /obj/item/food/butterslice = 1, ) results = list( /datum/reagent/consumable/nutriment/soup/cheese_porridge = 30, @@ -1757,3 +1816,408 @@ /datum/reagent/consumable/sugar = 8, ) percentage_of_nutriment_converted = 0.1 + +// Martian Food +// Boiled Noodles +/datum/chemical_reaction/food/soup/boilednoodles + required_reagents = list( + /datum/reagent/consumable/salt = 2 + ) + required_ingredients = list( + /obj/item/food/spaghetti/rawnoodles = 1 + ) + required_catalysts = list( + /datum/reagent/water/salt = 10, + ) + resulting_food_path = /obj/item/food/spaghetti/boilednoodles + ingredient_reagent_multiplier = 0 + +// Dashi Broth +/datum/reagent/consumable/nutriment/soup/dashi + name = "Dashi" + description = "Made with kombu and katsuobushi, this mother stock forms the basis for a large number of Japanese dishes." + data = list("umami" = 1) + color = "#D49D26" + +/datum/glass_style/has_foodtype/soup/dashi + required_drink_type = /datum/reagent/consumable/nutriment/soup/dashi + name = "dashi" + drink_type = SEAFOOD + +/datum/chemical_reaction/food/soup/dashi + required_reagents = list( + /datum/reagent/consumable/dashi_concentrate = 5, + /datum/reagent/water = 40, + ) + results = list( + /datum/reagent/consumable/nutriment/soup/dashi = 40, + ) + +// Teriyaki Sauce +/datum/reagent/consumable/nutriment/soup/teriyaki + name = "Teriyaki Sauce" + description = "A Japanese sauce that's heavy on umami." + data = list("umami" = 1) + color = "#3F0D02" + +/datum/glass_style/has_foodtype/soup/teriyaki + required_drink_type = /datum/reagent/consumable/nutriment/soup/teriyaki + name = "teriyaki sauce" + drink_type = VEGETABLES + +/datum/chemical_reaction/food/soup/teriyaki + required_reagents = list( + /datum/reagent/consumable/soysauce = 10, + /datum/reagent/consumable/ethanol/sake = 10, + /datum/reagent/consumable/honey = 5, + ) + results = list( + /datum/reagent/consumable/nutriment/soup/teriyaki = 20, + ) + +// Curry Sauce +/datum/reagent/consumable/nutriment/soup/curry_sauce + name = "Curry Sauce" + description = "A basic curry sauce that goes well on a wide range of foods." + data = list("curry" = 1) + color = "#F6C800" + +/datum/glass_style/has_foodtype/soup/curry_sauce + required_drink_type = /datum/reagent/consumable/nutriment/soup/curry_sauce + name = "curry sauce" + drink_type = VEGETABLES + +/datum/chemical_reaction/food/soup/curry_sauce + required_reagents = list( + /datum/reagent/water = 30, + /datum/reagent/consumable/curry_powder = 10, + /datum/reagent/consumable/soysauce = 5, + /datum/reagent/consumable/corn_starch = 5, + ) + results = list( + /datum/reagent/consumable/nutriment/soup/curry_sauce = 40, + ) + +// Shoyu Ramen +/datum/reagent/consumable/nutriment/soup/shoyu_ramen + name = "Shōyu Ramen" + description = "A soy-sauce based ramen, with noodles, fishcake, barbecued meat and a boiled egg." + data = list("egg" = 1, "fish" = 1, "noodles" = 1, "meat" = 1, "broth" = 1) + color = "#442621" + +/datum/glass_style/has_foodtype/soup/shoyu_ramen + required_drink_type = /datum/reagent/consumable/nutriment/soup/shoyu_ramen + name = "shōyu ramen" + icon = 'icons/obj/food/martian.dmi' + icon_state = "shoyu_ramen" + drink_type = MEAT | GRAIN | VEGETABLES | SEAFOOD + +/datum/chemical_reaction/food/soup/shoyu_ramen + required_reagents = list( + /datum/reagent/consumable/nutriment/soup/dashi = 20, + /datum/reagent/consumable/nutriment/soup/teriyaki = 15, + ) + required_ingredients = list( + /obj/item/food/spaghetti/boilednoodles = 1, + /obj/item/food/kamaboko_slice = 1, + /obj/item/food/meat/cutlet = 1, + /obj/item/food/boiledegg = 1, + ) + results = list( + /datum/reagent/consumable/nutriment/soup/shoyu_ramen = 30, + /datum/reagent/consumable/nutriment/vitamin = 8, + /datum/reagent/consumable/nutriment/protein = 8, + ) + percentage_of_nutriment_converted = 0.2 + +// Gyuramen +/datum/reagent/consumable/nutriment/soup/gyuramen + name = "Gyuramen Miy Käzu" + description = "A rich beef and onion ramen with cheese- blending several cultural influences seemlessly into one tasty dish." + data = list("beef broth" = 1, "onion" = 1, "cheese" = 1) + color = "#442621" + +/datum/glass_style/has_foodtype/soup/gyuramen + required_drink_type = /datum/reagent/consumable/nutriment/soup/gyuramen + name = "gyuramen miy käzu" + icon = 'icons/obj/food/martian.dmi' + icon_state = "gyuramen" + drink_type = MEAT | GRAIN | DAIRY | VEGETABLES + +/datum/chemical_reaction/food/soup/gyuramen + required_reagents = list( + /datum/reagent/consumable/nutriment/soup/dashi = 20, + /datum/reagent/consumable/soysauce = 5, + ) + required_ingredients = list( + /obj/item/food/spaghetti/boilednoodles = 1, + /obj/item/food/cheese/wedge = 1, + /obj/item/food/onion_slice = 2, + /obj/item/food/meat/cutlet = 1, + ) + results = list( + /datum/reagent/consumable/nutriment/soup/gyuramen = 30, + /datum/reagent/consumable/nutriment/vitamin = 2, + /datum/reagent/consumable/nutriment/protein = 10, + ) + percentage_of_nutriment_converted = 0.15 + +// New Osaka Sunrise +/datum/reagent/consumable/nutriment/soup/new_osaka_sunrise + name = "New Osaka Sunrise Soup" + description = "A bright, flavourful miso soup with tofu that commonly forms part of a traditional Martian breakfast, at least in the capital." + data = list("miso" = 1, "tofu" = 1, "onion" = 1, "eggplant" = 1) + color = "#EAB26E" + +/datum/glass_style/has_foodtype/soup/new_osaka_sunrise + required_drink_type = /datum/reagent/consumable/nutriment/soup/new_osaka_sunrise + name = "\improper New Osaka Sunrise soup" + icon = 'icons/obj/food/martian.dmi' + icon_state = "new_osaka_sunrise" + drink_type = VEGETABLES | BREAKFAST + +/datum/chemical_reaction/food/soup/new_osaka_sunrise + required_reagents = list( + /datum/reagent/consumable/nutriment/soup/miso = 15, + ) + required_ingredients = list( + /obj/item/food/grown/herbs = 1, + /obj/item/food/grown/eggplant = 1, + /obj/item/food/onion_slice = 1, + /obj/item/food/tofu = 1, + ) + results = list( + /datum/reagent/consumable/nutriment/soup/new_osaka_sunrise = 30, + /datum/reagent/consumable/nutriment/vitamin = 8, + /datum/reagent/consumable/nutriment/protein = 2, + ) + percentage_of_nutriment_converted = 0.15 + +// Satsuma Black +/datum/reagent/consumable/nutriment/soup/satsuma_black + name = "Satsuma Black Soup" + description = "A rich, heavy seafood and noodle soup from Mars, employing squid ink to give a strong taste of the sea." + data = list("seafood" = 1, "tofu" = 1, "noodles" = 1) + color = "#171221" + +/datum/glass_style/has_foodtype/soup/satsuma_black + required_drink_type = /datum/reagent/consumable/nutriment/soup/satsuma_black + name = "\improper Satsuma Black soup" + icon = 'icons/obj/food/martian.dmi' + icon_state = "satsuma_black" + drink_type = SEAFOOD | GRAIN | VEGETABLES + +/datum/chemical_reaction/food/soup/satsuma_black + required_reagents = list( + /datum/reagent/consumable/nutriment/soup/dashi = 20, + ) + required_ingredients = list( + /obj/item/food/spaghetti/boilednoodles = 1, + /obj/item/food/seaweedsheet = 1, + /obj/item/food/tofu = 1, + /obj/item/food/canned/squid_ink = 1, + ) + results = list( + /datum/reagent/consumable/nutriment/soup/satsuma_black = 30, + /datum/reagent/consumable/nutriment/vitamin = 4, + /datum/reagent/consumable/nutriment/protein = 6, + ) + percentage_of_nutriment_converted = 0.15 + +// Dragon Style +/datum/reagent/consumable/nutriment/soup/dragon_ramen + name = "Dragon Style Ramen" + description = "For the ramen fan who hates their tastebuds and digestive tract. Traditionally made with seven different chilis, although after two or so the point sorta gets lost." + data = list("meat" = 1, "liquid hot magma" = 1, "noodles" = 1) + color = "#980F00" + +/datum/glass_style/has_foodtype/soup/dragon_ramen + required_drink_type = /datum/reagent/consumable/nutriment/soup/dragon_ramen + name = "\improper Dragon Style ramen" + icon = 'icons/obj/food/martian.dmi' + icon_state = "dragon_ramen" + drink_type = SEAFOOD | GRAIN | VEGETABLES + +/datum/chemical_reaction/food/soup/dragon_ramen + required_reagents = list( + /datum/reagent/consumable/nutriment/soup/dashi = 20, + /datum/reagent/consumable/nutriment/soup/teriyaki = 10, + /datum/reagent/consumable/red_bay = 5, + ) + required_ingredients = list( + /obj/item/food/spaghetti/boilednoodles = 1, + /obj/item/food/grown/ghost_chili = 1, + /obj/item/food/grown/chili = 1, + /obj/item/food/kamaboko_slice = 1, + /obj/item/food/boiledegg = 1, + ) + results = list( + /datum/reagent/consumable/nutriment/soup/dragon_ramen = 30, + /datum/reagent/consumable/nutriment/vitamin = 4, + /datum/reagent/consumable/nutriment/protein = 6, + ) + ingredient_reagent_multiplier = 0.3 //reduces the impact of the chilis to manageable levels + +// Hong Kong Borscht +/datum/reagent/consumable/nutriment/soup/hong_kong_borscht + name = "Hong Kong Borscht" + description = "Also known as luo song tang or Russian soup, this dish bears little to no resemblance to Eastern European borscht- indeed, it's a tomato-based soup with no beets in sight." + data = list("tomato" = 1, "meat" = 1, "cabbage" = 1) + color = "#CA4810" + +/datum/glass_style/has_foodtype/soup/hong_kong_borscht + required_drink_type = /datum/reagent/consumable/nutriment/soup/hong_kong_borscht + name = "\improper Hong Kong borscht" + icon = 'icons/obj/food/martian.dmi' + icon_state = "hong_kong_borscht" + drink_type = MEAT | VEGETABLES + +/datum/chemical_reaction/food/soup/hong_kong_borscht + required_reagents = list( + /datum/reagent/water = 50, + /datum/reagent/consumable/soysauce = 5, + ) + required_ingredients = list( + /obj/item/food/grown/tomato = 1, + /obj/item/food/grown/cabbage = 1, + /obj/item/food/grown/onion = 1, + /obj/item/food/grown/carrot = 1, + /obj/item/food/meat/cutlet = 1, + ) + results = list( + /datum/reagent/consumable/nutriment/soup/hong_kong_borscht = 30, + /datum/reagent/consumable/nutriment/vitamin = 8, + /datum/reagent/consumable/nutriment/protein = 2, + ) + percentage_of_nutriment_converted = 0.1 + +// Huotui Tong Fen +/datum/reagent/consumable/nutriment/soup/hong_kong_macaroni + name = "Hong Kong Macaroni Soup" + description = "A favourite from Hong Kong's Cha Chaan Tengs, this macaroni soup came to Mars with Cantonese settlers under Cybersun Industries, and has become as much of a breakfast staple there as it is in its homeland." + data = list("cream" = 1, "chicken" = 1, "pasta" = 1, "ham" = 1) + color = "#FFFAB5" + +/datum/glass_style/has_foodtype/soup/hong_kong_macaroni + required_drink_type = /datum/reagent/consumable/nutriment/soup/hong_kong_macaroni + name = "\improper Hong Kong macaroni soup" + icon = 'icons/obj/food/martian.dmi' + icon_state = "hong_kong_macaroni" + drink_type = MEAT | VEGETABLES | GRAIN + +/datum/chemical_reaction/food/soup/hong_kong_macaroni + required_reagents = list( + /datum/reagent/water = 30, + /datum/reagent/consumable/cream = 10, + ) + required_ingredients = list( + /obj/item/food/spaghetti/boiledspaghetti = 1, + /obj/item/food/meat/cutlet/chicken = 1, + /obj/item/food/meat/bacon = 1, + ) + results = list( + /datum/reagent/consumable/nutriment/soup/hong_kong_macaroni = 30, + /datum/reagent/consumable/nutriment/protein = 6, + ) + percentage_of_nutriment_converted = 0.2 + +// Fox's Prize Soup +/datum/reagent/consumable/nutriment/soup/foxs_prize_soup + name = "Fox's Prize Soup" + description = "Originally based on the Chinese classic of egg-drop soup, fox's prize soup iterated on the concept via the addition of aburaage and dashi, making a dish that would truly appeal to any hungry fox." + data = list("egg" = 1, "chicken" = 1, "fried tofu" = 1, "umami broth" = 1) + color = "#E9B200" + +/datum/glass_style/has_foodtype/soup/foxs_prize_soup + required_drink_type = /datum/reagent/consumable/nutriment/soup/foxs_prize_soup + name = "fox's prize soup" + icon = 'icons/obj/food/martian.dmi' + icon_state = "foxs_prize_soup" + drink_type = MEAT | VEGETABLES + +/datum/chemical_reaction/food/soup/foxs_prize_soup + required_reagents = list( + /datum/reagent/consumable/nutriment/soup/dashi = 30, + /datum/reagent/consumable/eggwhite = 10, + ) + required_ingredients = list( + /obj/item/food/meat/cutlet/chicken = 1, + /obj/item/food/tofu = 1, + ) + results = list( + /datum/reagent/consumable/nutriment/soup/foxs_prize_soup = 30, + /datum/reagent/consumable/nutriment/protein = 6, + ) + +// Secret Noodle Soup +/datum/reagent/consumable/nutriment/soup/secret_noodle_soup + name = "Secret Noodle Soup" + description = "Made to a secret family recipe (that's in several cookbooks). What is the secret ingredient, you ask? Well, let's just say it could be anything..." + data = list("noodles" = 1, "chicken" = 1, "aromatic broth" = 1) + color = "#D9BB79" + +/datum/glass_style/has_foodtype/soup/secret_noodle_soup + required_drink_type = /datum/reagent/consumable/nutriment/soup/secret_noodle_soup + name = "secret noodle soup" + icon = 'icons/obj/food/martian.dmi' + icon_state = "secret_noodle_soup" + drink_type = MEAT | VEGETABLES | GRAIN + +/datum/chemical_reaction/food/soup/secret_noodle_soup + required_reagents = list( + /datum/reagent/consumable/nutriment/soup/dashi = 30, + ) + required_ingredients = list( + /obj/item/food/meat/cutlet/chicken = 1, + /obj/item/food/spaghetti/boilednoodles = 1, + /obj/item/food/grown/mushroom/chanterelle = 1, + ) + results = list( + /datum/reagent/consumable/nutriment/soup/secret_noodle_soup = 30, + /datum/reagent/consumable/nutriment/protein = 6, + ) + +// Budae-Jjigae +/datum/reagent/consumable/nutriment/soup/budae_jjigae + name = "Budae-Jjigae" + description = "A dish born of the American presence in South Korea, made with ingredients typical to the 1960s American army base- hot dogs, chap, and baked beans, as well as a number of native Korean ingredients such as gochujang and kimchi." + data = list("hot dog" = 1, "pork" = 1, "beans" = 1, "kimchi" = 1, "noodles" = 1) + color = "#C8400E" + +/datum/glass_style/has_foodtype/soup/budae_jjigae + required_drink_type = /datum/reagent/consumable/nutriment/soup/budae_jjigae + name = "budae-jjigae" + icon = 'icons/obj/food/martian.dmi' + icon_state = "budae_jjigae" + drink_type = MEAT | VEGETABLES | GRAIN + +/datum/chemical_reaction/food/soup/budae_jjigae + required_reagents = list( + /datum/reagent/water = 30, + ) + required_ingredients = list( + /obj/item/food/canned/beans = 1, + /obj/item/food/spaghetti/rawnoodles = 1, + /obj/item/food/sausage/american = 1, + /obj/item/food/chapslice = 2, + /obj/item/food/kimchi = 1, + /obj/item/food/cheese/wedge = 1, + ) + results = list( + /datum/reagent/consumable/nutriment/soup/budae_jjigae = 30, + /datum/reagent/consumable/nutriment/protein = 6, + ) + percentage_of_nutriment_converted = 0.1 + +// 24-Volt Fish +// Simply poach the fish in boiling energy drink, easy as +/datum/chemical_reaction/food/soup/volt_fish + required_reagents = list( + /datum/reagent/consumable/volt_energy = 15, + ) + required_ingredients = list( + /obj/item/food/fishmeat = 1 + ) + resulting_food_path = /obj/item/food/volt_fish + ingredient_reagent_multiplier = 0 + mix_message = "The air fills with a hellish mix of fish and artificial flavouring." diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm index 364904f448e48..e78efd293ffcd 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm @@ -89,7 +89,7 @@ time = 40 reqs = list(/obj/item/food/grown/garlic = 1, /obj/item/food/breadslice/plain = 1, - /obj/item/food/butter = 1 + /obj/item/food/butterslice = 1 ) result = /obj/item/food/garlicbread category = CAT_BREAD @@ -98,7 +98,7 @@ name = "Butter Biscuit" reqs = list( /obj/item/food/bun = 1, - /obj/item/food/butter = 1 + /obj/item/food/butterslice = 1 ) result = /obj/item/food/butterbiscuit category = CAT_BREAD @@ -107,7 +107,7 @@ name = "Butterdog" reqs = list( /obj/item/food/bun = 1, - /obj/item/food/butter = 3, + /obj/item/food/butter = 1, ) result = /obj/item/food/butterdog category = CAT_BREAD @@ -127,7 +127,7 @@ reqs = list( /obj/item/food/doughslice = 1, /datum/reagent/consumable/salt = 1, - /obj/item/food/butter = 1 + /obj/item/food/butterslice = 1 ) result = /obj/item/food/raw_breadstick category = CAT_BREAD @@ -137,7 +137,7 @@ reqs = list( /obj/item/food/doughslice = 1, /datum/reagent/consumable/sugar = 1, - /obj/item/food/butter = 1 + /obj/item/food/butterslice = 1 ) result = /obj/item/food/raw_croissant category = CAT_BREAD @@ -189,7 +189,7 @@ name = "Buttered Toast" reqs = list( /obj/item/food/breadslice/plain = 1, - /obj/item/food/butter = 1 + /obj/item/food/butterslice = 1 ) result = /obj/item/food/butteredtoast category = CAT_BREAD diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm index 16075d970cae9..06b5e8952eddd 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm @@ -200,15 +200,6 @@ category = CAT_BURGER /datum/crafting_recipe/food/spellburger - name = "Spell burger" - reqs = list( - /obj/item/clothing/head/wizard/fake = 1, - /obj/item/food/bun = 1 - ) - result = /obj/item/food/burger/spell - category = CAT_BURGER - -/datum/crafting_recipe/food/spellburger2 name = "Spell burger" reqs = list( /obj/item/clothing/head/wizard = 1, @@ -391,7 +382,18 @@ /obj/item/food/grown/cabbage = 1, /obj/item/toy/crayon/green = 1, /obj/item/flashlight/flare = 1, - /datum/reagent/consumable/cooking_oil = 15 + /datum/reagent/consumable/nutriment/fat/oil = 15 ) result = /obj/item/food/burger/crazy category = CAT_BURGER + +/datum/crafting_recipe/food/sloppy_moe + name = "Sloppy moe" + reqs = list( + /obj/item/food/bun = 1, + /obj/item/food/meat/cutlet = 2, + /obj/item/food/onion_slice = 1, + /datum/reagent/consumable/bbqsauce = 5, + ) + result = /obj/item/food/burger/sloppy_moe + category = CAT_BURGER 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 37b7a00b7eb0c..4a2c9f2935d3d 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm @@ -141,14 +141,14 @@ result = /obj/item/food/cake/hardware_cake category = CAT_CAKE -/datum/crafting_recipe/food/bscccake - name = "blackberry and strawberry chocolate cake" +/datum/crafting_recipe/food/berry_chocolate_cake + name = "strawberry chocolate cake" reqs = list( /obj/item/food/cake/plain = 1, /obj/item/food/chocolatebar = 2, /obj/item/food/grown/berries = 5 ) - result = /obj/item/food/cake/bscc + result = /obj/item/food/cake/berry_chocolate_cake category = CAT_CAKE /datum/crafting_recipe/food/pavlovacream @@ -173,13 +173,13 @@ result = /obj/item/food/cake/pavlova/nuts category = CAT_CAKE -/datum/crafting_recipe/food/bscvcake +/datum/crafting_recipe/food/berry_vanilla_cake name = "blackberry and strawberry vanilla cake" reqs = list( /obj/item/food/cake/plain = 1, /obj/item/food/grown/berries = 5 ) - result = /obj/item/food/cake/bsvc + result = /obj/item/food/cake/berry_vanilla_cake category = CAT_CAKE /datum/crafting_recipe/food/clowncake @@ -257,3 +257,13 @@ ) result = /obj/item/food/cake/wedding category = CAT_CAKE + +/datum/crafting_recipe/food/pineapple_cream_cake + name = "Pineapple cream cake" + reqs = list( + /obj/item/food/cake/plain = 1, + /obj/item/food/grown/pineapple = 1, + /datum/reagent/consumable/cream = 20, + ) + result = /obj/item/food/cake/pineapple_cream_cake + category = CAT_CAKE diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_guide.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_guide.dm index 2301138537f65..ea6d10cb6686b 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_guide.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_guide.dm @@ -38,7 +38,7 @@ /datum/crafting_recipe/food/reaction/New() . = ..() - if(!reaction) + if(!ispath(reaction, /datum/chemical_reaction)) return if(length(GLOB.chemical_reactions_list)) @@ -48,6 +48,7 @@ var/datum/chemical_reaction/chemical_reaction = new reaction() setup_chemical_reaction_details(chemical_reaction) qdel(chemical_reaction) + ..() /** * Sets up information for our recipe based on the chemical reaction we have set. @@ -179,16 +180,23 @@ result = /datum/reagent/consumable/yoghurt reaction = /datum/chemical_reaction/food/yoghurt -/datum/crafting_recipe/food/reaction/quality_oil - result = /datum/reagent/consumable/quality_oil - reaction = /datum/chemical_reaction/food/quality_oil +/datum/crafting_recipe/food/reaction/olive_oil + result = /datum/reagent/consumable/nutriment/fat/oil/olive + reaction = /datum/chemical_reaction/food/olive_oil -/datum/crafting_recipe/food/reaction/quality_oil/upconvert - reaction = /datum/chemical_reaction/food/quality_oil_upconvert +/datum/crafting_recipe/food/reaction/olive_oil/upconvert + reaction = /datum/chemical_reaction/food/olive_oil_upconvert /datum/crafting_recipe/food/reaction/moonshine reaction = /datum/chemical_reaction/drink/moonshine +/datum/crafting_recipe/food/reaction/martian_batter + reaction = /datum/chemical_reaction/food/martian_batter + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/grounding_neutralise + reaction = /datum/chemical_reaction/food/grounding_neutralise + // Tools: Rolling pin /datum/crafting_recipe/food/rollingpin @@ -220,6 +228,7 @@ /datum/crafting_recipe/food/rollingpin/pizza_sheet reqs = list(/obj/item/food/pizzaslice/margherita = 1) result = /obj/item/stack/sheet/pizza + category = CAT_PIZZA // Tools: Knife @@ -241,7 +250,7 @@ /datum/crafting_recipe/food/knife/cakeslice reqs = list(/obj/item/food/cake/plain = 1) result = /obj/item/food/cakeslice/plain - category = CAT_PASTRY + category = CAT_CAKE /datum/crafting_recipe/food/knife/pizzaslice reqs = list(/obj/item/food/pizza/margherita = 1) @@ -258,11 +267,15 @@ result = /obj/item/food/rootdoughslice category = CAT_BREAD -/datum/crafting_recipe/food/knife/pastrybase +/datum/crafting_recipe/food/knife/rawpastrybase reqs = list(/obj/item/food/piedough = 1) - result = /obj/item/food/pastrybase + result = /obj/item/food/rawpastrybase category = CAT_BREAD +/datum/crafting_recipe/food/knife/butterslice + reqs = list(/obj/item/food/butter = 1) + result = /obj/item/food/butterslice + /datum/crafting_recipe/food/knife/doughball reqs = list(/obj/item/food/doughslice = 1) result = /obj/item/food/bait/doughball @@ -345,13 +358,28 @@ /datum/crafting_recipe/food/knife/lil_baked_rice reqs = list(/obj/item/food/big_baked_rice = 1) result = /obj/item/food/lil_baked_rice - category = CAT_SALAD + category = CAT_MOTH /datum/crafting_recipe/food/knife/watermelonslice reqs = list(/obj/item/food/grown/watermelon = 1) result = /obj/item/food/watermelonslice category = CAT_SALAD +/datum/crafting_recipe/food/knife/kamaboko_slice + reqs = list(/obj/item/food/kamaboko = 1) + result = /obj/item/food/kamaboko_slice + category = CAT_MARTIAN + +/datum/crafting_recipe/food/knife/raw_noodles + reqs = list(/obj/item/food/rice_dough = 1) + result = /obj/item/food/spaghetti/rawnoodles + category = CAT_MARTIAN + +/datum/crafting_recipe/food/knife/chapslice + reqs = list(/obj/item/food/canned/chap = 1) + result = /obj/item/food/chapslice + category = CAT_MEAT + // Machinery: Grill /datum/crafting_recipe/food/grill @@ -420,13 +448,28 @@ /datum/crafting_recipe/food/grill/grilled_cheese_sandwich reqs = list(/obj/item/food/sandwich/cheese = 1) result = /obj/item/food/sandwich/cheese/grilled - category = CAT_BREAD + category = CAT_SANDWICH -/datum/crafting_recipe/food/grill/moonfish +/datum/crafting_recipe/food/grill/grilled_cheese reqs = list(/obj/item/food/cheese/firm_cheese_slice = 1) result = /obj/item/food/grilled_cheese category = CAT_MISCFOOD +/datum/crafting_recipe/food/grill/ballpark_pretzel + reqs = list(/obj/item/food/raw_ballpark_pretzel = 1) + result = /obj/item/food/ballpark_pretzel + category = CAT_MARTIAN + +/datum/crafting_recipe/food/grill/ballpark_tsukune + reqs = list(/obj/item/food/kebab/raw_ballpark_tsukune = 1) + result = /obj/item/food/kebab/ballpark_tsukune + category = CAT_MARTIAN + +/datum/crafting_recipe/food/grill/chapslice + reqs = list(/obj/item/food/chapslice = 1) + result = /obj/item/food/grilled_chapslice + category = CAT_MEAT + /datum/crafting_recipe/food/grill/friedegg reqs = list(/obj/item/food/egg = 1) result = /obj/item/food/friedegg @@ -469,6 +512,11 @@ "Bake until ready" ) +/datum/crafting_recipe/food/grill/hard_taco_shell + reqs = list(/obj/item/food/tortilla = 1) + result = /obj/item/food/hard_taco_shell + category = CAT_MEXICAN + // Machinery: Grinder /datum/crafting_recipe/food/grinder machinery = list(/obj/machinery/reagentgrinder) @@ -515,7 +563,7 @@ result = /datum/reagent/consumable/flour /datum/crafting_recipe/food/grinder/butter - reqs = list(/datum/reagent/consumable/milk = 15) + reqs = list(/datum/reagent/consumable/milk = MILK_TO_BUTTER_COEFF) result = /obj/item/food/butter steps = list("Put into grinder and mix") @@ -602,16 +650,12 @@ /datum/crafting_recipe/food/processor/tortilla reqs = list(/obj/item/food/grown/corn = 1) result = /obj/item/food/tortilla - category = CAT_BREAD + category = CAT_MEXICAN /datum/crafting_recipe/food/processor/tempeh reqs = list(/obj/item/food/tempehstarter = 1) result = /obj/item/food/tempeh -/datum/crafting_recipe/food/processor/yakiimo - reqs = list(/obj/item/food/grown/potato/sweet = 1) - result = /obj/item/food/yakiimo - /datum/crafting_recipe/food/processor/popsicle_stick reqs = list(/obj/item/grown/log = 1) result = /obj/item/popsicle_stick @@ -710,12 +754,12 @@ /datum/crafting_recipe/food/oven/pie reqs = list(/obj/item/food/piedough = 1) result = /obj/item/food/pie/plain - category = CAT_PASTRY + category = CAT_PIE /datum/crafting_recipe/food/oven/cake reqs = list(/obj/item/food/cakebatter = 1) result = /obj/item/food/cake/plain - category = CAT_PASTRY + category = CAT_CAKE /datum/crafting_recipe/food/oven/breadstick reqs = list(/obj/item/food/raw_breadstick = 1) @@ -739,7 +783,7 @@ /datum/crafting_recipe/food/oven/big_baked_rice reqs = list(/obj/item/food/raw_baked_rice = 1) result = /obj/item/food/big_baked_rice - category = CAT_SALAD + category = CAT_MOTH /datum/crafting_recipe/food/oven/ratatouille reqs = list(/obj/item/food/raw_ratatouille = 1) @@ -749,7 +793,7 @@ /datum/crafting_recipe/food/oven/stuffed_peppers reqs = list(/obj/item/food/raw_stuffed_peppers = 1) result = /obj/item/food/stuffed_peppers - category = CAT_SALAD + category = CAT_MOTH /datum/crafting_recipe/food/oven/roasted_bell_pepper reqs = list(/obj/item/food/grown/bell_pepper = 1) @@ -764,7 +808,17 @@ /datum/crafting_recipe/food/oven/yakiimo reqs = list(/obj/item/food/grown/potato/sweet = 1) result = /obj/item/food/yakiimo - category = CAT_SALAD + category = CAT_MISCFOOD + +/datum/crafting_recipe/food/oven/reispan + reqs = list(/obj/item/food/rice_dough = 1) + result = /obj/item/food/bread/reispan + category = CAT_MARTIAN + +/datum/crafting_recipe/food/oven/ballpark_pretzel + reqs = list(/obj/item/food/raw_ballpark_pretzel = 1) + result = /obj/item/food/ballpark_pretzel + category = CAT_MARTIAN // Machinery: Drying rack /datum/crafting_recipe/food/drying @@ -799,3 +853,8 @@ /datum/crafting_recipe/food/drying/semki reqs = list(/obj/item/food/grown/sunflower = 1) result = /obj/item/food/semki/healthy + +/datum/crafting_recipe/food/drying/kamaboko + reqs = list(/obj/item/food/surimi = 1) + result = /obj/item/food/kamaboko + category = CAT_MARTIAN 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 ec5db9baf1492..714c36223a41e 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_lizard.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_lizard.dm @@ -74,7 +74,7 @@ /obj/item/food/grown/garlic = 1, /datum/reagent/consumable/lemonjuice = 3, /datum/reagent/consumable/blackpepper = 2, - /datum/reagent/consumable/quality_oil = 3 + /datum/reagent/consumable/nutriment/fat/oil/olive = 3 ) result = /obj/item/food/lizard_escargot category = CAT_LIZARD @@ -148,7 +148,7 @@ /obj/item/food/steeped_mushrooms = 1, /obj/item/food/grown/mushroom/plumphelmet = 1, /obj/item/food/grown/mushroom/chanterelle = 1, - /datum/reagent/consumable/quality_oil = 5 + /datum/reagent/consumable/nutriment/fat/oil/olive = 5 ) result = /obj/item/food/mushroomy_stirfry category = CAT_LIZARD @@ -204,7 +204,7 @@ /obj/item/food/spaghetti/nizaya = 1, /obj/item/food/grown/garlic = 1, /obj/item/food/grown/chili = 1, - /datum/reagent/consumable/quality_oil = 5 + /datum/reagent/consumable/nutriment/fat/oil/olive = 5 ) result = /obj/item/food/spaghetti/garlic_nizaya category = CAT_LIZARD @@ -228,7 +228,7 @@ /obj/item/food/spaghetti/nizaya = 1, /obj/item/food/steeped_mushrooms = 1, /obj/item/food/grown/garlic = 1, - /datum/reagent/consumable/quality_oil = 5 + /datum/reagent/consumable/nutriment/fat/oil/olive = 5 ) result = /obj/item/food/spaghetti/mushroom_nizaya category = CAT_LIZARD @@ -239,7 +239,7 @@ /obj/item/food/root_flatbread = 1, /obj/item/food/grown/garlic = 1, /datum/reagent/consumable/lemonjuice = 2, - /datum/reagent/consumable/quality_oil = 3 + /datum/reagent/consumable/nutriment/fat/oil/olive = 3 ) result = /obj/item/food/pizza/flatbread/rustic category = CAT_LIZARD @@ -251,7 +251,7 @@ /obj/item/food/grown/garlic = 1, /obj/item/food/grown/tomato = 1, /obj/item/food/meatball = 2, - /datum/reagent/consumable/quality_oil = 3 + /datum/reagent/consumable/nutriment/fat/oil/olive = 3 ) result = /obj/item/food/pizza/flatbread/italic category = CAT_LIZARD @@ -313,7 +313,7 @@ /obj/item/food/root_flatbread = 1, /obj/item/food/grown/tomato = 1, /obj/item/food/grown/mushroom = 3, - /datum/reagent/consumable/quality_oil = 3 + /datum/reagent/consumable/nutriment/fat/oil/olive = 3 ) result = /obj/item/food/pizza/flatbread/mushroom category = CAT_LIZARD @@ -375,7 +375,7 @@ name = "Korta brittle slab" reqs = list( /obj/item/food/grown/korta_nut = 2, - /obj/item/food/butter = 1, + /obj/item/food/butterslice = 1, /datum/reagent/consumable/korta_nectar = 5, /datum/reagent/consumable/sugar = 5, /datum/reagent/consumable/salt = 2 diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_martian.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_martian.dm new file mode 100644 index 0000000000000..fb4f29284b87b --- /dev/null +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_martian.dm @@ -0,0 +1,915 @@ +/datum/crafting_recipe/food/kimchi + name = "Kimchi" + reqs = list( + /obj/item/food/grown/cabbage = 1, + /obj/item/food/grown/chili = 1, + /datum/reagent/consumable/salt = 5 + ) + result = /obj/item/food/kimchi + category = CAT_MARTIAN + +/datum/crafting_recipe/food/inferno_kimchi + name = "Inferno kimchi" + reqs = list( + /obj/item/food/grown/cabbage = 1, + /obj/item/food/grown/ghost_chili = 1, + /datum/reagent/consumable/salt = 5 + ) + result = /obj/item/food/inferno_kimchi + category = CAT_MARTIAN + +/datum/crafting_recipe/food/garlic_kimchi + name = "Garlic kimchi" + reqs = list( + /obj/item/food/grown/cabbage = 1, + /obj/item/food/grown/chili = 1, + /obj/item/food/grown/garlic = 1, + /datum/reagent/consumable/salt = 5 + ) + result = /obj/item/food/garlic_kimchi + category = CAT_MARTIAN + +/datum/crafting_recipe/food/surimi + name = "Surimi" + reqs = list( + /obj/item/food/fishmeat = 1, + ) + result = /obj/item/food/surimi + category = CAT_MARTIAN + +/datum/crafting_recipe/food/sambal + name = "Sambal" + reqs = list( + /obj/item/food/grown/chili = 1, + /obj/item/food/grown/garlic = 1, + /obj/item/food/grown/onion = 1, + /datum/reagent/consumable/sugar = 3, + /datum/reagent/consumable/limejuice = 3, + ) + result = /obj/item/food/sambal + category = CAT_MARTIAN + +/datum/crafting_recipe/food/katsu_fillet + name = "Katsu fillet" + reqs = list( + /obj/item/food/meat/rawcutlet = 1, + /obj/item/food/breadslice/reispan = 1, + ) + result = /obj/item/food/katsu_fillet + category = CAT_MARTIAN + +/datum/crafting_recipe/food/rice_dough + name = "Rice dough" + reqs = list( + /datum/reagent/consumable/flour = 10, + /datum/reagent/consumable/rice = 10, + /datum/reagent/water = 10, + ) + result = /obj/item/food/rice_dough + category = CAT_MARTIAN + +/datum/crafting_recipe/food/hurricane_rice + name = "Hurricane fried rice" + reqs = list( + /obj/item/food/boiledrice = 1, + /obj/item/food/egg = 1, + /obj/item/food/onion_slice = 1, + /obj/item/food/grown/chili = 1, + /obj/item/food/meat/cutlet = 1, + /obj/item/food/pineappleslice = 1, + /datum/reagent/consumable/soysauce = 3, + ) + result = /obj/item/food/salad/hurricane_rice + category = CAT_MARTIAN + +/datum/crafting_recipe/food/ikareis + name = "Ikareis" + reqs = list( + /obj/item/food/boiledrice = 1, + /obj/item/food/canned/squid_ink = 1, + /obj/item/food/grown/bell_pepper = 1, + /obj/item/food/onion_slice = 1, + /obj/item/food/sausage = 1, + /obj/item/food/grown/chili = 1, + ) + result = /obj/item/food/salad/ikareis + category = CAT_MARTIAN + +/datum/crafting_recipe/food/hawaiian_fried_rice + name = "Hawaiian fried rice" + reqs = list( + /obj/item/food/boiledrice = 1, + /obj/item/food/chapslice = 1, + /obj/item/food/grown/bell_pepper = 1, + /obj/item/food/pineappleslice = 1, + /obj/item/food/onion_slice = 1, + /datum/reagent/consumable/soysauce = 5 + ) + result = /obj/item/food/salad/hawaiian_fried_rice + category = CAT_MARTIAN + +/datum/crafting_recipe/food/ketchup_fried_rice + name = "Ketchup fried rice" + reqs = list( + /obj/item/food/boiledrice = 1, + /obj/item/food/onion_slice = 1, + /obj/item/food/sausage/american = 1, + /obj/item/food/grown/carrot = 1, + /obj/item/food/grown/peas = 1, + /datum/reagent/consumable/ketchup = 5, + /datum/reagent/consumable/worcestershire = 2, + ) + result = /obj/item/food/salad/ketchup_fried_rice + category = CAT_MARTIAN + +/datum/crafting_recipe/food/mediterranean_fried_rice + name = "Mediterranean fried rice" + reqs = list( + /obj/item/food/boiledrice = 1, + /obj/item/food/onion_slice = 1, + /obj/item/food/grown/herbs = 1, + /obj/item/food/cheese/firm_cheese_slice = 1, + /obj/item/food/grown/olive = 1, + /obj/item/food/meatball = 1, + ) + result = /obj/item/food/salad/mediterranean_fried_rice + category = CAT_MARTIAN + +/datum/crafting_recipe/food/egg_fried_rice + name = "Egg fried rice" + reqs = list( + /obj/item/food/boiledrice = 1, + /obj/item/food/egg = 1, + /datum/reagent/consumable/soysauce = 3, + ) + result = /obj/item/food/salad/egg_fried_rice + category = CAT_MARTIAN + +/datum/crafting_recipe/food/bibimbap + name = "Bibimbap" + reqs = list( + /obj/item/food/boiledrice = 1, + /obj/item/food/grown/cucumber = 1, + /obj/item/food/grown/mushroom = 1, + /obj/item/food/meat/cutlet = 1, + /obj/item/food/kimchi = 1, + /obj/item/food/egg = 1, + ) + result = /obj/item/food/salad/bibimbap + category = CAT_MARTIAN + +/datum/crafting_recipe/food/bulgogi_noodles + name = "Bulgogi noodles" + reqs = list( + /obj/item/food/spaghetti/boilednoodles = 1, + /obj/item/food/meat/cutlet = 1, + /obj/item/food/grown/apple = 1, + /obj/item/food/grown/garlic = 1, + /obj/item/food/onion_slice = 1, + /datum/reagent/consumable/nutriment/soup/teriyaki = 4, + ) + result = /obj/item/food/salad/bibimbap + category = CAT_MARTIAN + +/datum/crafting_recipe/food/yakisoba_katsu + name = "Yakisoba katsu" + reqs = list( + /obj/item/food/spaghetti/boilednoodles = 1, + /obj/item/food/grown/cabbage = 1, + /obj/item/food/grown/carrot = 1, + /obj/item/food/onion_slice = 1, + /obj/item/food/katsu_fillet = 1, + /datum/reagent/consumable/worcestershire = 3, + ) + result = /obj/item/food/salad/yakisoba_katsu + category = CAT_MARTIAN + +/datum/crafting_recipe/food/martian_fried_noodles + name = "Martian fried noodles" + reqs = list( + /obj/item/food/spaghetti/boilednoodles = 1, + /obj/item/food/grown/peanut = 2, + /obj/item/food/meat/cutlet = 1, + /obj/item/food/onion_slice = 1, + /obj/item/food/egg = 1, + /datum/reagent/consumable/soysauce = 3, + /datum/reagent/consumable/red_bay = 3, + ) + result = /obj/item/food/salad/martian_fried_noodles + category = CAT_MARTIAN + +/datum/crafting_recipe/food/simple_fried_noodles + name = "Simple fried noodles" + reqs = list( + /obj/item/food/spaghetti/boilednoodles = 1, + /datum/reagent/consumable/soysauce = 3, + ) + result = /obj/item/food/salad/simple_fried_noodles + category = CAT_MARTIAN + +/datum/crafting_recipe/food/setagaya_curry + name = "Setagaya curry" + reqs = list( + /obj/item/food/boiledrice = 1, + /obj/item/food/grown/apple = 1, + /datum/reagent/consumable/honey = 3, + /datum/reagent/consumable/ketchup = 3, + /obj/item/food/chocolatebar = 1, + /datum/reagent/consumable/coffee = 3, + /datum/reagent/consumable/ethanol/wine = 3, + /datum/reagent/consumable/curry_powder = 3, + /obj/item/food/meat/slab = 1, + /obj/item/food/grown/onion = 1, + /obj/item/food/grown/carrot = 1, + /obj/item/food/grown/potato = 1, + ) + result = /obj/item/food/salad/setagaya_curry + category = CAT_MARTIAN + +/datum/crafting_recipe/food/big_blue_burger + name = "Big Blue Burger" + reqs = list( + /obj/item/food/bun = 1, + /obj/item/food/patty = 2, + /obj/item/food/onion_slice = 1, + /obj/item/food/cheese/wedge = 1, + /obj/item/food/meat/bacon = 1, + /obj/item/food/pineappleslice = 1, + /datum/reagent/consumable/nutriment/soup/teriyaki = 4, + ) + result = /obj/item/food/burger/big_blue + category = CAT_MARTIAN + +/datum/crafting_recipe/food/chappy_patty + name = "Chappy Patty" + reqs = list( + /obj/item/food/bun = 1, + /obj/item/food/grilled_chapslice = 2, + /obj/item/food/friedegg = 1, + /obj/item/food/cheese/wedge = 1, + /datum/reagent/consumable/ketchup = 3, + ) + result = /obj/item/food/burger/chappy + category = CAT_MARTIAN + +/datum/crafting_recipe/food/king_katsu_sandwich + name = "King Katsu sandwich" + reqs = list( + /obj/item/food/breadslice/reispan = 2, + /obj/item/food/katsu_fillet = 1, + /obj/item/food/meat/bacon = 1, + /obj/item/food/kimchi = 1, + /obj/item/food/onion_slice = 1, + /obj/item/food/grown/tomato = 1, + ) + result = /obj/item/food/king_katsu_sandwich + category = CAT_MARTIAN + +/datum/crafting_recipe/food/marte_cubano_sandwich + name = "Marte Cubano sandwich" + reqs = list( + /obj/item/food/breadslice/reispan = 2, + /obj/item/food/meat/bacon = 1, + /obj/item/food/pickle = 2, + /obj/item/food/cheese/wedge = 1, + ) + result = /obj/item/food/marte_cubano_sandwich + category = CAT_MARTIAN + +/datum/crafting_recipe/food/little_shiro_sandwich + name = "Little Shiro sandwich" + reqs = list( + /obj/item/food/breadslice/reispan = 2, + /obj/item/food/meat/cutlet = 1, + /obj/item/food/friedegg = 1, + /obj/item/food/garlic_kimchi = 1, + /obj/item/food/cheese/mozzarella = 1, + /obj/item/food/grown/herbs = 1, + ) + result = /obj/item/food/little_shiro_sandwich + category = CAT_MARTIAN + +/datum/crafting_recipe/food/croque_martienne + name = "Croque-Martienne sandwich" + reqs = list( + /obj/item/food/breadslice/reispan = 2, + /obj/item/food/meat/cutlet = 1, + /obj/item/food/cheese/wedge = 1, + /obj/item/food/pineappleslice = 1, + /obj/item/food/friedegg = 1, + ) + result = /obj/item/food/croque_martienne + category = CAT_MARTIAN + +/datum/crafting_recipe/food/prospect_sunrise + name = "Prospect Sunrise sandwich" + reqs = list( + /obj/item/food/breadslice/reispan = 2, + /obj/item/food/meat/bacon = 1, + /obj/item/food/cheese/wedge = 1, + /obj/item/food/omelette = 1, + /obj/item/food/pickle = 1, + ) + result = /obj/item/food/prospect_sunrise + category = CAT_MARTIAN + +/datum/crafting_recipe/food/takoyaki + name = "Takoyaki" + reqs = list( + /obj/item/food/fishmeat/octopus = 1, + /obj/item/food/onion_slice = 1, + /datum/reagent/consumable/martian_batter = 6, + /datum/reagent/consumable/worcestershire = 3, + ) + result = /obj/item/food/takoyaki + category = CAT_MARTIAN + +/datum/crafting_recipe/food/russian_takoyaki + name = "Russian takoyaki" + reqs = list( + /obj/item/food/fishmeat/octopus = 1, + /obj/item/food/grown/ghost_chili = 1, + /datum/reagent/consumable/martian_batter = 6, + /datum/reagent/consumable/capsaicin = 3, + ) + result = /obj/item/food/takoyaki/russian + category = CAT_MARTIAN + +/datum/crafting_recipe/food/tacoyaki + name = "Tacoyaki" + reqs = list( + /obj/item/food/meatball = 1, + /obj/item/food/grown/corn = 1, + /datum/reagent/consumable/martian_batter = 6, + /datum/reagent/consumable/red_bay = 3, + /obj/item/food/cheese/wedge = 1, + ) + result = /obj/item/food/takoyaki/taco + category = CAT_MARTIAN + +/datum/crafting_recipe/food/okonomiyaki + name = "Okonomiyaki" + reqs = list( + /datum/reagent/consumable/martian_batter = 6, + /datum/reagent/consumable/worcestershire = 3, + /datum/reagent/consumable/mayonnaise = 3, + /obj/item/food/grown/cabbage = 1, + /obj/item/food/grown/potato/sweet = 1, + ) + result = /obj/item/food/okonomiyaki + category = CAT_MARTIAN + +/datum/crafting_recipe/food/brat_kimchi + name = "Brat-kimchi" + reqs = list( + /obj/item/food/sausage = 1, + /obj/item/food/kimchi = 1, + /datum/reagent/consumable/sugar = 3, + ) + result = /obj/item/food/brat_kimchi + category = CAT_MARTIAN + +/datum/crafting_recipe/food/tonkatsuwurst + name = "Tonkatsuwurst" + reqs = list( + /obj/item/food/sausage = 1, + /obj/item/food/fries = 1, + /datum/reagent/consumable/worcestershire = 3, + /datum/reagent/consumable/red_bay = 2, + ) + result = /obj/item/food/tonkatsuwurst + category = CAT_MARTIAN + +/datum/crafting_recipe/food/ti_hoeh_koe + name = "Ti hoeh koe" + reqs = list( + /obj/item/food/boiledrice = 1, + /obj/item/food/peanuts/salted = 1, + /obj/item/food/grown/herbs = 1, + /datum/reagent/blood = 5, + ) + result = /obj/item/food/kebab/ti_hoeh_koe + category = CAT_MARTIAN + +/datum/crafting_recipe/food/kitzushi + name = "Kitzushi" + reqs = list( + /obj/item/food/boiledrice = 1, + /obj/item/food/tofu = 1, + /obj/item/food/cheese/wedge = 1, + /obj/item/food/grown/chili = 1, + ) + result = /obj/item/food/kitzushi + category = CAT_MARTIAN + +/datum/crafting_recipe/food/epok_epok + name = "Epok-epok" + reqs = list( + /obj/item/food/doughslice = 1, + /obj/item/food/meat/cutlet/chicken = 1, + /obj/item/food/grown/potato/wedges = 1, + /obj/item/food/boiledegg = 1, + /datum/reagent/consumable/curry_powder = 3, + ) + result = /obj/item/food/epok_epok + category = CAT_MARTIAN + +/datum/crafting_recipe/food/roti_john + name = "Roti John" + reqs = list( + /obj/item/food/baguette = 1, + /obj/item/food/raw_meatball = 1, + /obj/item/food/egg = 1, + /obj/item/food/onion_slice = 1, + /datum/reagent/consumable/capsaicin = 3, + /datum/reagent/consumable/mayonnaise = 3, + ) + result = /obj/item/food/roti_john + category = CAT_MARTIAN + +/datum/crafting_recipe/food/izakaya_fries + name = "Izakaya fries" + reqs = list( + /obj/item/food/fries = 1, + /obj/item/food/grown/herbs = 1, + /datum/reagent/consumable/red_bay = 3, + /datum/reagent/consumable/mayonnaise = 3, + ) + result = /obj/item/food/izakaya_fries + category = CAT_MARTIAN + +/datum/crafting_recipe/food/kurry_ok_subsando + name = "Kurry-OK subsando" + reqs = list( + /obj/item/food/baguette = 1, + /obj/item/food/izakaya_fries = 1, + /obj/item/food/katsu_fillet = 1, + /datum/reagent/consumable/nutriment/soup/curry_sauce = 5, + ) + result = /obj/item/food/kurry_ok_subsando + category = CAT_MARTIAN + +/datum/crafting_recipe/food/loco_moco + name = "Loco moco" + reqs = list( + /obj/item/food/boiledrice = 1, + /obj/item/food/patty = 1, + /obj/item/food/onion_slice = 1, + /obj/item/food/friedegg = 1, + /datum/reagent/consumable/gravy = 5, + ) + result = /obj/item/food/loco_moco + category = CAT_MARTIAN + +/datum/crafting_recipe/food/wild_duck_fries + name = "Wild duck fries" + reqs = list( + /obj/item/food/izakaya_fries = 1, + /obj/item/food/meat/cutlet = 1, + /datum/reagent/consumable/ketchup = 3, + ) + result = /obj/item/food/wild_duck_fries + category = CAT_MARTIAN + +/datum/crafting_recipe/food/little_hawaii_hotdog + name = "Little Hawaii hotdog" + reqs = list( + /obj/item/food/hotdog = 1, + /obj/item/food/pineappleslice = 1, + /obj/item/food/onion_slice = 1, + /datum/reagent/consumable/nutriment/soup/teriyaki = 3, + ) + result = /obj/item/food/little_hawaii_hotdog + category = CAT_MARTIAN + +/datum/crafting_recipe/food/salt_chilli_fries + name = "Salt n' chilli fries" + reqs = list( + /obj/item/food/fries = 1, + /obj/item/food/grown/chili = 1, + /obj/item/food/grown/onion = 1, + /obj/item/food/grown/garlic = 1, + /datum/reagent/consumable/salt = 3, + ) + result = /obj/item/food/salt_chilli_fries + category = CAT_MARTIAN + +/datum/crafting_recipe/food/steak_croquette + name = "Steak croquette" + reqs = list( + /obj/item/food/meat/steak = 1, + /obj/item/food/mashed_potatoes = 1, + /obj/item/food/breadslice/reispan = 1, + ) + result = /obj/item/food/steak_croquette + category = CAT_MARTIAN + +/datum/crafting_recipe/food/chapsilog + name = "Chapsilog" + reqs = list( + /obj/item/food/grilled_chapslice = 2, + /obj/item/food/friedegg = 1, + /obj/item/food/boiledrice = 1, + /obj/item/food/grown/garlic = 1, + ) + result = /obj/item/food/chapsilog + category = CAT_MARTIAN + +/datum/crafting_recipe/food/chap_hash + name = "Chap hash" + reqs = list( + /obj/item/food/chapslice = 2, + /obj/item/food/egg = 1, + /obj/item/food/grown/bell_pepper = 1, + /obj/item/food/grown/potato = 1, + /obj/item/food/onion_slice = 1, + ) + result = /obj/item/food/chap_hash + category = CAT_MARTIAN + +/datum/crafting_recipe/food/agedashi_tofu + name = "Agedashi tofu" + reqs = list( + /obj/item/food/tofu = 1, + /obj/item/food/onion_slice = 1, + /datum/reagent/consumable/nutriment/soup/dashi = 20, + /obj/item/reagent_containers/cup/bowl = 1, + ) + result = /obj/item/food/salad/agedashi_tofu + category = CAT_MARTIAN + +/datum/crafting_recipe/food/po_kok_gai + name = "Po kok gai" + reqs = list( + /obj/item/food/boiledrice = 1, + /obj/item/food/meat/slab/chicken = 1, + /datum/reagent/consumable/coconut_milk = 5, + /datum/reagent/consumable/curry_powder = 3, + ) + result = /obj/item/food/salad/po_kok_gai + category = CAT_MARTIAN + +/datum/crafting_recipe/food/huoxing_tofu + name = "Huoxing tofu" + reqs = list( + /obj/item/food/tofu = 1, + /obj/item/food/raw_meatball = 1, + /obj/item/food/grown/chili = 1, + /obj/item/food/grown/soybeans = 1, + /obj/item/reagent_containers/cup/bowl = 1, + ) + result = /obj/item/food/salad/huoxing_tofu + category = CAT_MARTIAN + +/datum/crafting_recipe/food/feizhou_ji + name = "Fēizhōu jī" + reqs = list( + /obj/item/food/meat/slab/chicken = 1, + /obj/item/food/grown/chili = 1, + /obj/item/food/grown/bell_pepper = 1, + /datum/reagent/consumable/vinegar = 5, + ) + result = /obj/item/food/feizhou_ji + category = CAT_MARTIAN + +/datum/crafting_recipe/food/galinha_de_cabidela + name = "Galinha de cabidela" + reqs = list( + /obj/item/food/meat/slab/chicken = 1, + /obj/item/food/grown/tomato = 1, + /obj/item/food/uncooked_rice = 1, + /datum/reagent/blood = 5, + ) + result = /obj/item/food/salad/galinha_de_cabidela + category = CAT_MARTIAN + +/datum/crafting_recipe/food/katsu_curry + name = "Katsu curry" + reqs = list( + /obj/item/food/katsu_fillet = 1, + /obj/item/food/boiledrice = 1, + /datum/reagent/consumable/nutriment/soup/curry_sauce = 5, + ) + result = /obj/item/food/salad/katsu_curry + category = CAT_MARTIAN + +/datum/crafting_recipe/food/beef_bowl + name = "Beef bowl" + reqs = list( + /obj/item/food/meat/cutlet = 1, + /obj/item/food/onion_slice = 1, + /obj/item/food/boiledrice = 1, + /datum/reagent/consumable/nutriment/soup/dashi = 5, + ) + result = /obj/item/food/salad/beef_bowl + category = CAT_MARTIAN + +/datum/crafting_recipe/food/salt_chilli_bowl + name = "Salt n' chilli octopus bowl" + reqs = list( + /obj/item/food/grilled_octopus = 1, + /obj/item/food/grown/chili = 1, + /obj/item/food/grown/onion = 1, + /obj/item/food/boiledrice = 1, + /datum/reagent/consumable/salt = 2, + /datum/reagent/consumable/nutriment/soup/curry_sauce = 5, + ) + result = /obj/item/food/salad/salt_chilli_bowl + category = CAT_MARTIAN + +/datum/crafting_recipe/food/kansai_bowl + name = "Kansai bowl" + reqs = list( + /obj/item/food/kamaboko_slice = 2, + /obj/item/food/boiledegg = 1, + /obj/item/food/grown/onion = 1, + /obj/item/food/boiledrice = 1, + /datum/reagent/consumable/nutriment/soup/dashi = 5, + ) + result = /obj/item/food/salad/kansai_bowl + category = CAT_MARTIAN + +/datum/crafting_recipe/food/eigamudo_curry + name = "Eigamudo curry" + reqs = list( + /obj/item/food/grown/olive = 1, + /obj/item/food/kimchi = 1, + /obj/item/food/fishmeat = 1, + /obj/item/food/boiledrice = 1, + /datum/reagent/consumable/cafe_latte = 5, + ) + result = /obj/item/food/salad/eigamudo_curry + category = CAT_MARTIAN + +/datum/crafting_recipe/food/cilbir + name = "Çilbir" + reqs = list( + /obj/item/food/grown/garlic = 1, + /obj/item/food/friedegg = 1, + /obj/item/food/grown/chili = 1, + /datum/reagent/consumable/yoghurt = 5, + /datum/reagent/consumable/nutriment/fat/oil/olive = 2, + ) + result = /obj/item/food/cilbir + category = CAT_MARTIAN + +/datum/crafting_recipe/food/peking_duck_crepes + name = "Peking duck crepes a l'orange" + reqs = list( + /obj/item/food/pancakes = 1, + /obj/item/food/meat/cutlet = 1, + /obj/item/food/grown/citrus/orange = 1, + /datum/reagent/consumable/ethanol/cognac = 2, + ) + result = /obj/item/food/peking_duck_crepes + category = CAT_MARTIAN + +/datum/crafting_recipe/food/vulgaris_spekkoek + name = "Vulgaris spekkoek" + reqs = list( + /obj/item/food/cake/plain = 1, + /obj/item/food/grown/ambrosia/vulgaris = 1, + /obj/item/food/butterslice = 2, + ) + result = /obj/item/food/cake/spekkoek + category = CAT_MARTIAN + +/datum/crafting_recipe/food/pineapple_foster + name = "Pineapple foster" + reqs = list( + /obj/item/food/pineappleslice = 1, + /datum/reagent/consumable/caramel = 2, + /obj/item/food/icecream = 1, + /datum/reagent/consumable/ethanol/rum = 2, + ) + result = /obj/item/food/salad/pineapple_foster + category = CAT_MARTIAN + +/datum/crafting_recipe/food/pastel_de_nata + name = "Pastel de nata" + reqs = list( + /obj/item/food/pastrybase = 1, + /obj/item/food/grown/vanillapod = 1, + /obj/item/food/egg = 1, + /datum/reagent/consumable/sugar = 2, + ) + result = /obj/item/food/pastel_de_nata + category = CAT_MARTIAN + +/datum/crafting_recipe/food/boh_loh_yah + name = "Boh loh yah" + reqs = list( + /obj/item/food/doughslice = 1, + /obj/item/food/butterslice = 1, + /datum/reagent/consumable/sugar = 5, + ) + result = /obj/item/food/boh_loh_yah + category = CAT_MARTIAN + +/datum/crafting_recipe/food/banana_fritter + name = "Banana fritter" + reqs = list( + /obj/item/food/grown/banana = 1, + /datum/reagent/consumable/martian_batter = 2 + ) + result = /obj/item/food/banana_fritter + category = CAT_MARTIAN + +/datum/crafting_recipe/food/pineapple_fritter + name = "Pineapple fritter" + reqs = list( + /obj/item/food/pineappleslice = 1, + /datum/reagent/consumable/martian_batter = 2 + ) + result = /obj/item/food/pineapple_fritter + category = CAT_MARTIAN + +/datum/crafting_recipe/food/kasei_dango + name = "Kasei dango" + reqs = list( + /obj/item/stack/rods = 1, + /datum/reagent/consumable/sugar = 5, + /datum/reagent/consumable/rice = 5, + /datum/reagent/consumable/orangejuice = 2, + /datum/reagent/consumable/grenadine = 2, + ) + result = /obj/item/food/kebab/kasei_dango + category = CAT_MARTIAN + +/datum/crafting_recipe/food/pb_ice_cream_mochi + name = "Peanut-butter ice cream mochi" + reqs = list( + /datum/reagent/consumable/sugar = 5, + /datum/reagent/consumable/rice = 5, + /datum/reagent/consumable/peanut_butter = 2, + /obj/item/food/icecream = 1, + ) + result = /obj/item/food/pb_ice_cream_mochi + category = CAT_MARTIAN + +/datum/crafting_recipe/food/frozen_pineapple_pop + name = "Frozen pineapple pop" + reqs = list( + /obj/item/food/pineappleslice = 1, + /obj/item/food/chocolatebar = 1, + /obj/item/popsicle_stick = 1, + ) + result = /obj/item/food/popsicle/pineapple_pop + category = CAT_MARTIAN + +/datum/crafting_recipe/food/sea_salt_pop + name = "Sea-salt ice cream bar" + reqs = list( + /datum/reagent/consumable/cream = 5, + /datum/reagent/consumable/sugar = 5, + /datum/reagent/consumable/salt = 3, + /obj/item/popsicle_stick = 1, + ) + result = /obj/item/food/popsicle/sea_salt + category = CAT_MARTIAN + +/datum/crafting_recipe/food/berry_topsicle + name = "Berry topsicle" + reqs = list( + /obj/item/food/tofu = 1, + /datum/reagent/consumable/berryjuice = 5, + /datum/reagent/consumable/sugar = 5, + /obj/item/popsicle_stick = 1, + ) + result = /obj/item/food/popsicle/topsicle + category = CAT_MARTIAN + +/datum/crafting_recipe/food/banana_topsicle + name = "Banana topsicle" + reqs = list( + /obj/item/food/tofu = 1, + /datum/reagent/consumable/banana = 5, + /datum/reagent/consumable/sugar = 5, + /obj/item/popsicle_stick = 1, + ) + result = /obj/item/food/popsicle/topsicle/banana + category = CAT_MARTIAN + +/datum/crafting_recipe/food/berry_topsicle + name = "Pineapple topsicle" + reqs = list( + /obj/item/food/tofu = 1, + /datum/reagent/consumable/pineapplejuice = 5, + /datum/reagent/consumable/sugar = 5, + /obj/item/popsicle_stick = 1, + ) + result = /obj/item/food/popsicle/topsicle/pineapple + category = CAT_MARTIAN + +/datum/crafting_recipe/food/plasma_dog_supreme + name = "Plasma Dog Supreme" + reqs = list( + /obj/item/food/hotdog = 1, + /obj/item/food/pineappleslice = 1, + /obj/item/food/sambal = 1, + /obj/item/food/onion_slice = 1, + ) + result = /obj/item/food/plasma_dog_supreme + category = CAT_MARTIAN + +/datum/crafting_recipe/food/frickles + name = "Frickles" + reqs = list( + /obj/item/food/pickle = 1, + /datum/reagent/consumable/martian_batter = 2, + /datum/reagent/consumable/red_bay = 1, + ) + result = /obj/item/food/frickles + category = CAT_MARTIAN + +/datum/crafting_recipe/food/raw_ballpark_pretzel + name = "Raw ballpark pretzel" + reqs = list( + /obj/item/food/doughslice = 1, + /datum/reagent/consumable/salt = 2, + ) + result = /obj/item/food/raw_ballpark_pretzel + category = CAT_MARTIAN + +/datum/crafting_recipe/food/raw_ballpark_tsukune + name = "Raw ballpark tsukune" + reqs = list( + /obj/item/food/raw_meatball/chicken = 1, + /datum/reagent/consumable/nutriment/soup/teriyaki = 2, + /obj/item/stack/rods = 1, + ) + result = /obj/item/food/kebab/raw_ballpark_tsukune + category = CAT_MARTIAN + +/datum/crafting_recipe/food/sprout_bowl + name = "Sprout bowl" + reqs = list( + /obj/item/food/pickled_voltvine = 1, + /obj/item/food/fishmeat = 1, + /obj/item/food/boiledrice = 1, + /datum/reagent/consumable/nutriment/soup/dashi = 5, + ) + result = /obj/item/food/salad/sprout_bowl + category = CAT_MARTIAN + +// Soups + +/datum/crafting_recipe/food/reaction/soup/boilednoodles + reaction = /datum/chemical_reaction/food/soup/boilednoodles + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/dashi + reaction = /datum/chemical_reaction/food/soup/dashi + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/teriyaki + reaction = /datum/chemical_reaction/food/soup/teriyaki + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/curry_sauce + reaction = /datum/chemical_reaction/food/soup/curry_sauce + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/shoyu_ramen + reaction = /datum/chemical_reaction/food/soup/shoyu_ramen + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/gyuramen + reaction = /datum/chemical_reaction/food/soup/gyuramen + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/new_osaka_sunrise + reaction = /datum/chemical_reaction/food/soup/new_osaka_sunrise + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/satsuma_black + reaction = /datum/chemical_reaction/food/soup/satsuma_black + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/dragon_ramen + reaction = /datum/chemical_reaction/food/soup/dragon_ramen + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/hong_kong_borscht + reaction = /datum/chemical_reaction/food/soup/hong_kong_borscht + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/hong_kong_macaroni + reaction = /datum/chemical_reaction/food/soup/hong_kong_macaroni + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/foxs_prize_soup + reaction = /datum/chemical_reaction/food/soup/foxs_prize_soup + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/secret_noodle_soup + reaction = /datum/chemical_reaction/food/soup/secret_noodle_soup + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/budae_jjigae + reaction = /datum/chemical_reaction/food/soup/budae_jjigae + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/volt_fish + reaction = /datum/chemical_reaction/food/soup/volt_fish + category = CAT_MARTIAN 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 7997e3c67c622..fcb25b39ba8d2 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm @@ -145,7 +145,7 @@ name = "Pig in a Blanket" reqs = list( /obj/item/food/bun = 1, - /obj/item/food/butter = 1, + /obj/item/food/butterslice = 1, /obj/item/food/meat/cutlet = 1 ) result = /obj/item/food/pigblanket @@ -295,3 +295,24 @@ ) result = /obj/item/food/raw_meatloaf category = CAT_MEAT + +/datum/crafting_recipe/food/sweet_and_sour_meatballs + name = "Sweet and sour meatballs" + reqs = list( + /obj/item/food/meatball = 3, + /obj/item/food/pineappleslice = 1, + /obj/item/food/grown/bell_pepper = 1, + /datum/reagent/consumable/sugar = 5, + ) + result = /obj/item/food/sweet_and_sour_meatballs + category = CAT_MEAT + +/datum/crafting_recipe/food/pineapple_skewer + name = "Pineapple skewer" + reqs = list( + /obj/item/stack/rods = 1, + /obj/item/food/pineappleslice = 2, + /obj/item/food/meat/cutlet = 2, + ) + result = /obj/item/food/kebab/pineapple_skewer + category = CAT_MEAT diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm index 267cdea69b32b..8778ee976ef25 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm @@ -190,3 +190,14 @@ ) result = /obj/item/food/spanish_rice category = CAT_MEXICAN + +/datum/crafting_recipe/food/pineapple_salsa + name = "Pineapple salsa" + reqs = list( + /obj/item/food/pineappleslice = 2, + /obj/item/food/grown/tomato = 1, + /obj/item/food/grown/onion = 1, + /obj/item/food/grown/chili = 1, + ) + result = /obj/item/food/pineapple_salsa + category = CAT_MEXICAN 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 b3f76604849ae..67d1ca54c0028 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm @@ -156,12 +156,12 @@ reqs = list( /obj/item/organ/internal/brain = 1, /obj/item/organ/internal/heart = 1, - /obj/item/food/butter = 10, + /obj/item/food/butter = 4, /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 + result = /mob/living/basic/bear/butter category = CAT_MISCFOOD /datum/crafting_recipe/food/crab_rangoon @@ -173,7 +173,7 @@ /obj/item/food/meat/slab/rawcrab = 1 ) result = /obj/item/food/crab_rangoon - category = CAT_MISCFOOD + category = CAT_SEAFOOD /datum/crafting_recipe/food/royalcheese name = "Royal Cheese" @@ -203,7 +203,7 @@ /datum/reagent/consumable/salt = 5, /obj/item/food/grown/herbs = 2, /obj/item/food/grown/garlic = 1, - /datum/reagent/consumable/quality_oil = 5, + /datum/reagent/consumable/nutriment/fat/oil/olive = 5, /obj/item/food/canned/pine_nuts = 1 ) result = /obj/item/food/pesto @@ -215,7 +215,7 @@ /obj/item/food/canned/tomatoes = 1, /datum/reagent/consumable/salt = 2, /obj/item/food/grown/herbs = 1, - /datum/reagent/consumable/quality_oil = 5 + /datum/reagent/consumable/nutriment/fat/oil/olive = 5 ) result = /obj/item/food/tomato_sauce category = CAT_MISCFOOD @@ -225,7 +225,7 @@ reqs = list( /datum/reagent/consumable/milk = 10, /datum/reagent/consumable/flour = 5, - /obj/item/food/butter = 1 + /obj/item/food/butterslice = 1 ) result = /obj/item/food/bechamel_sauce category = CAT_MISCFOOD @@ -276,7 +276,7 @@ reqs = list( /obj/item/food/grown/potato = 2, /obj/item/food/grown/garlic = 1, - /obj/item/food/butter = 1, + /obj/item/food/butterslice = 1, ) result = /obj/item/food/mashed_potatoes category = CAT_MISCFOOD @@ -345,7 +345,7 @@ name = "Buttered baked potato" reqs = list( /obj/item/food/baked_potato = 1, - /obj/item/food/butter = 1, + /obj/item/food/butterslice = 1, ) result = /obj/item/food/buttered_baked_potato category = CAT_MISCFOOD @@ -422,9 +422,133 @@ reqs = list( /obj/item/reagent_containers/cup/beaker/large = 1, /obj/item/food/grown/cucumber = 10, - /datum/reagent/water = 10, - /datum/reagent/consumable/salt = 10, + /datum/reagent/water/salt = 20, ) result = /obj/item/storage/fancy/pickles_jar category = CAT_MISCFOOD delete_contents = FALSE + +/datum/crafting_recipe/food/sauteed_eggplant + name = "Sauteed eggplant" + reqs = list( + /obj/item/food/grown/eggplant = 1, + /obj/item/food/grown/garlic = 1, + /datum/reagent/consumable/nutriment/fat/oil/olive = 3, + ) + result = /obj/item/food/sauteed_eggplant + category = CAT_MISCFOOD + +/datum/crafting_recipe/food/stuffed_eggplant + name = "Stuffed eggplant" + reqs = list( + /obj/item/food/grown/eggplant = 1, + /obj/item/food/grown/garlic = 1, + /obj/item/food/grown/cabbage = 1, + /obj/item/food/cheese/wedge = 1, + /obj/item/food/meat/cutlet = 1, + ) + result = /obj/item/food/stuffed_eggplant + category = CAT_MISCFOOD + +/datum/crafting_recipe/food/baba_ghanoush + name = "Baba ghanoush" + reqs = list( + /obj/item/reagent_containers/cup/bowl = 1, + /obj/item/food/pita_bread = 1, + /obj/item/food/grown/eggplant = 1, + /obj/item/food/grown/garlic = 1, + /datum/reagent/consumable/nutriment/fat/oil/olive = 5, + /datum/reagent/consumable/lemonjuice = 3, + ) + result = /obj/item/food/baba_ghanoush + category = CAT_MISCFOOD + +/datum/crafting_recipe/food/moussaka + name = "Moussaka" + reqs = list( + /obj/item/food/grown/eggplant = 2, + /obj/item/food/grown/garlic = 1, + /obj/item/food/grown/onion = 1, + /obj/item/food/meat/cutlet = 1, + /obj/item/food/bechamel_sauce = 1, + ) + result = /obj/item/food/moussaka + category = CAT_MISCFOOD + +/datum/crafting_recipe/food/falafel + name = "Falafel" + reqs = list( + /obj/item/food/grown/soybeans = 1, + /obj/item/food/grown/garlic = 1, + /obj/item/food/grown/onion = 1, + /obj/item/food/grown/herbs = 1, + ) + result = /obj/item/food/falafel + category = CAT_MISCFOOD + +/datum/crafting_recipe/food/candied_pineapple + name = "Candied pineapple" + reqs = list( + /obj/item/food/pineappleslice = 1, + /datum/reagent/consumable/sugar = 2, + /datum/reagent/water = 2, + ) + result = /obj/item/food/candied_pineapple + category = CAT_MISCFOOD + +/datum/crafting_recipe/food/tzatziki_sauce + name = "Tzatziki sauce" + reqs = list( + /obj/item/food/grown/cucumber = 1, + /datum/reagent/consumable/nutriment/fat/oil/olive = 2, + /obj/item/food/grown/garlic = 1, + /datum/reagent/consumable/salt = 1, + ) + result = /obj/item/food/tzatziki_sauce + category = CAT_MISCFOOD + +/datum/crafting_recipe/food/tzatziki_and_pita_bread + name = "Tzatziki and pita bread" + reqs = list( + /obj/item/food/tzatziki_sauce = 1, + /obj/item/food/pita_bread = 1, + ) + result = /obj/item/food/tzatziki_and_pita_bread + category = CAT_MISCFOOD + +/datum/crafting_recipe/food/grilled_beef_gyro + name = "Grilled beef gyro" + reqs = list( + /obj/item/food/tzatziki_sauce = 1, + /obj/item/food/pita_bread = 1, + /obj/item/food/meat/cutlet = 2, + /obj/item/food/grown/cabbage = 1, + /obj/item/food/grown/tomato = 1, + /obj/item/food/grown/onion = 1, + ) + result = /obj/item/food/grilled_beef_gyro + category = CAT_MISCFOOD + +/datum/crafting_recipe/food/vegetarian_gyro + name = "Vegetarian gyro" + reqs = list( + /obj/item/food/tzatziki_sauce = 1, + /obj/item/food/pita_bread = 1, + /obj/item/food/grown/cucumber = 1, + /obj/item/food/grown/cabbage = 1, + /obj/item/food/grown/tomato = 1, + /obj/item/food/grown/onion = 1, + ) + result = /obj/item/food/vegetarian_gyro + category = CAT_MISCFOOD + +/datum/crafting_recipe/food/raw_pita_bread + name = "Raw pita bread" + reqs = list( + /datum/reagent/consumable/flour = 10, + /datum/reagent/water = 5, + /datum/reagent/consumable/nutriment/fat/oil/olive = 2, + /datum/reagent/consumable/sugar = 2, + ) + result = /obj/item/food/raw_pita_bread + category = CAT_MISCFOOD diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_moth.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_moth.dm index fadfe23a87e22..bb20f4ab0b370 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_moth.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_moth.dm @@ -23,7 +23,7 @@ /obj/item/seeds/sunflower = 1, /obj/item/seeds/pumpkin = 1, /obj/item/seeds/poppy = 1, - /datum/reagent/consumable/quality_oil = 2 + /datum/reagent/consumable/nutriment/fat/oil/olive = 2 ) result = /obj/item/food/toasted_seeds category = CAT_MOTH @@ -112,7 +112,7 @@ name = "Buttered baked corn" reqs = list( /obj/item/food/oven_baked_corn = 1, - /obj/item/food/butter = 1 + /obj/item/food/butterslice = 1 ) result = /obj/item/food/buttered_baked_corn category = CAT_MOTH @@ -210,7 +210,7 @@ /obj/item/food/grown/tomato = 1, /obj/item/food/cheese/mozzarella = 1, /obj/item/food/grown/herbs = 1, - /datum/reagent/consumable/quality_oil = 2, + /datum/reagent/consumable/nutriment/fat/oil/olive = 2, /datum/reagent/consumable/vinegar = 2 ) result = /obj/item/food/caprese_salad @@ -219,7 +219,7 @@ /datum/crafting_recipe/food/fleet_salad name = "Lörtonknusksolt (Fleet salad)" reqs = list( - /datum/reagent/consumable/quality_oil = 2, + /datum/reagent/consumable/nutriment/fat/oil/olive = 2, /datum/reagent/consumable/vinegar = 2, /obj/item/food/breadslice/plain = 1, /obj/item/food/grilled_cheese = 1, @@ -233,7 +233,7 @@ /datum/crafting_recipe/food/cotton_salad name = "Flöfrölenknusksolt (Cotton salad)" reqs = list( - /datum/reagent/consumable/quality_oil = 2, + /datum/reagent/consumable/nutriment/fat/oil/olive = 2, /datum/reagent/consumable/vinegar = 2, /obj/item/food/grown/carrot = 1, /obj/item/food/mothic_salad = 1, @@ -317,7 +317,7 @@ /datum/crafting_recipe/food/raw_mothic_garlic reqs = list( /obj/item/food/mothic_pizza_dough = 1, - /obj/item/food/butter = 1, + /obj/item/food/butterslice = 1, /obj/item/food/grown/garlic = 1, /obj/item/food/grown/herbs = 1 ) 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 ecc38887db4b3..3ce319b1985a2 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm @@ -603,7 +603,7 @@ /datum/reagent/consumable/sugar = 5, /obj/item/food/egg = 2, /datum/reagent/consumable/coco = 5, - /obj/item/food/butter = 1 + /obj/item/food/butterslice = 1 ) result = /obj/item/food/raw_brownie_batter category = CAT_PASTRY @@ -616,7 +616,7 @@ /obj/item/food/egg = 2, /datum/reagent/consumable/coco = 5, /datum/reagent/consumable/peanut_butter = 5, - /obj/item/food/butter = 1 + /obj/item/food/butterslice = 1 ) result = /obj/item/food/peanut_butter_brownie_batter category = CAT_PASTRY @@ -631,3 +631,40 @@ ) result = /obj/item/food/crunchy_peanut_butter_tart category = CAT_PASTRY + +/datum/crafting_recipe/food/chocolate_chip_cookie + name = "Chocolate chip cookie" + reqs = list( + /obj/item/food/pastrybase = 1, + /obj/item/food/chocolatebar = 1, + ) + result = /obj/item/food/cookie/chocolate_chip_cookie + category = CAT_PASTRY + +/datum/crafting_recipe/food/snickerdoodle + name = "Snickerdoodle" + reqs = list( + /obj/item/food/pastrybase = 1, + /datum/reagent/consumable/vanilla = 5, + ) + result = /obj/item/food/cookie/snickerdoodle + category = CAT_PASTRY + +/datum/crafting_recipe/food/thumbprint_cookie + name = "Thumbprint cookie" + reqs = list( + /obj/item/food/pastrybase = 1, + /datum/reagent/consumable/cherryjelly = 5, + ) + result = /obj/item/food/cookie/thumbprint_cookie + category = CAT_PASTRY + +/datum/crafting_recipe/food/macaron + name = "Macaron" + reqs = list( + /datum/reagent/consumable/eggwhite = 2, + /datum/reagent/consumable/cream = 5, + /datum/reagent/consumable/flour = 5, + ) + result = /obj/item/food/cookie/macaron + category = CAT_PASTRY diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm index 1cfc38948a3ac..93851558cffe3 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm @@ -200,7 +200,7 @@ /datum/crafting_recipe/food/baklava name = "Baklava pie" reqs = list( - /obj/item/food/butter = 2, + /obj/item/food/butterslice = 2, /obj/item/food/tortilla = 4, //Layers /obj/item/seeds/wheat/oat = 4 ) diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm index f4e6bf3792852..0bd29c51054db 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm @@ -103,7 +103,7 @@ /obj/item/food/grown/carrot = 1, /obj/item/food/onion_slice/red = 2, /obj/item/food/grown/cabbage = 1, - /datum/reagent/consumable/quality_oil = 2, + /datum/reagent/consumable/nutriment/fat/oil/olive = 2, ) result = /obj/item/food/salad/kale_salad category = CAT_SALAD @@ -116,7 +116,7 @@ /obj/item/food/grown/tomato = 1, /obj/item/food/onion_slice/red = 2, /obj/item/food/cheese/wedge = 1, - /datum/reagent/consumable/quality_oil = 5, + /datum/reagent/consumable/nutriment/fat/oil/olive = 5, /obj/item/food/grown/cucumber = 1, ) result = /obj/item/food/salad/greek_salad @@ -129,7 +129,7 @@ /obj/item/food/grown/cabbage = 2, /obj/item/food/onion_slice/red = 1, /obj/item/food/cheese/wedge = 1, - /datum/reagent/consumable/quality_oil = 5, + /datum/reagent/consumable/nutriment/fat/oil/olive = 5, /obj/item/food/breadslice/plain = 1, ) result = /obj/item/food/salad/caesar_salad @@ -142,7 +142,7 @@ /obj/item/food/grown/cabbage = 2, /obj/item/food/grown/carrot = 1, /obj/item/food/grown/peas = 1, - /datum/reagent/consumable/quality_oil = 5, + /datum/reagent/consumable/nutriment/fat/oil/olive = 5, ) result = /obj/item/food/salad/spring_salad category = CAT_SALAD @@ -166,7 +166,7 @@ /obj/item/food/grown/herbs = 3, /obj/item/food/grown/berries = 2, /obj/item/food/pineappleslice = 2, - /datum/reagent/consumable/quality_oil = 2, + /datum/reagent/consumable/nutriment/fat/oil/olive = 2, ) result = /obj/item/food/salad/spinach_fruit_salad category = CAT_SALAD diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_seafood.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_seafood.dm index 0e56a3e1d561e..60c7de2e3333d 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_seafood.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_seafood.dm @@ -121,3 +121,27 @@ ) result = /obj/item/food/fish_poke category = CAT_SEAFOOD + +/datum/crafting_recipe/food/futomaki_sushi_roll + name ="Futomaki sushi roll" + reqs = list( + /obj/item/food/seaweedsheet = 1, + /obj/item/food/boiledrice = 1, + /obj/item/food/boiledegg = 1, + /obj/item/food/fishmeat = 1, + /obj/item/food/grown/cucumber = 1, + ) + result = /obj/item/food/futomaki_sushi_roll + category = CAT_SEAFOOD + +/datum/crafting_recipe/food/philadelphia_sushi_roll + name ="Philadelphia sushi roll" + reqs = list( + /obj/item/food/seaweedsheet = 1, + /obj/item/food/boiledrice = 1, + /obj/item/food/cheese/wedge = 1, + /obj/item/food/fishmeat = 1, + /obj/item/food/grown/cucumber = 1, + ) + result = /obj/item/food/philadelphia_sushi_roll + category = CAT_SEAFOOD diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm index 297f761bab325..589235eacb70c 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm @@ -64,7 +64,7 @@ name = "Butter Noodles" reqs = list( /obj/item/food/spaghetti/boiledspaghetti = 1, - /obj/item/food/butter = 1 + /obj/item/food/butterslice = 1 ) result = /obj/item/food/spaghetti/butternoodles category = CAT_SPAGHETTI @@ -80,3 +80,80 @@ ) result = /obj/item/food/spaghetti/mac_n_cheese category = CAT_SPAGHETTI + +/datum/crafting_recipe/food/shoyu_tonkotsu_ramen + name = "Shoyu Tonkotsu ramen" + reqs = list( + /obj/item/reagent_containers/cup/bowl = 1, + /obj/item/food/spaghetti/boiledspaghetti = 1, + /obj/item/food/boiledegg = 1, + /obj/item/food/seaweedsheet = 1, + /obj/item/food/meat/cutlet = 1, + /obj/item/food/grown/onion = 1, + ) + result = /obj/item/food/spaghetti/shoyu_tonkotsu_ramen + category = CAT_SPAGHETTI + +/datum/crafting_recipe/food/kitakata_ramen + name = "Kitakata ramen" + reqs = list( + /obj/item/reagent_containers/cup/bowl = 1, + /obj/item/food/spaghetti/boiledspaghetti = 1, + /obj/item/food/meat/cutlet = 2, + /obj/item/food/grown/onion = 1, + /obj/item/food/grown/mushroom/chanterelle = 1, + /obj/item/food/grown/garlic = 1, + ) + result = /obj/item/food/spaghetti/kitakata_ramen + category = CAT_SPAGHETTI + +/datum/crafting_recipe/food/kitsune_udon + name = "Kitsune udon" + reqs = list( + /obj/item/reagent_containers/cup/bowl = 1, + /obj/item/food/spaghetti/boiledspaghetti = 1, + /obj/item/food/tofu = 2, + /obj/item/food/grown/onion = 1, + /datum/reagent/consumable/soysauce = 5, + /datum/reagent/consumable/sugar = 5, + ) + result = /obj/item/food/spaghetti/kitsune_udon + category = CAT_SPAGHETTI + +/datum/crafting_recipe/food/nikujaga + name = "Nikujaga" + reqs = list( + /obj/item/reagent_containers/cup/bowl = 1, + /obj/item/food/spaghetti/boiledspaghetti = 1, + /obj/item/food/meat/cutlet = 2, + /obj/item/food/grown/potato = 1, + /obj/item/food/grown/carrot = 1, + /obj/item/food/grown/peas = 1, + ) + result = /obj/item/food/spaghetti/nikujaga + category = CAT_SPAGHETTI + +/datum/crafting_recipe/food/pho + name = "Pho" + reqs = list( + /obj/item/reagent_containers/cup/bowl = 1, + /obj/item/food/spaghetti/boiledspaghetti = 1, + /obj/item/food/meat/cutlet = 1, + /obj/item/food/grown/onion = 1, + /obj/item/food/grown/cabbage = 1, + ) + result = /obj/item/food/spaghetti/pho + category = CAT_SPAGHETTI + +/datum/crafting_recipe/food/pad_thai + name = "Pad thai" + reqs = list( + /obj/item/reagent_containers/cup/bowl = 1, + /obj/item/food/spaghetti/boiledspaghetti = 1, + /obj/item/food/tofu = 1, + /obj/item/food/grown/onion = 1, + /obj/item/food/grown/peanut = 1, + /obj/item/food/grown/citrus/lime = 1, + ) + result = /obj/item/food/spaghetti/pad_thai + category = CAT_SPAGHETTI diff --git a/code/modules/food_and_drinks/restaurant/_venue.dm b/code/modules/food_and_drinks/restaurant/_venue.dm index c42483e684914..b37128a008765 100644 --- a/code/modules/food_and_drinks/restaurant/_venue.dm +++ b/code/modules/food_and_drinks/restaurant/_venue.dm @@ -60,10 +60,10 @@ if (initial(customer_type.is_unique)) customer_types -= customer_type - var/mob/living/simple_animal/robot_customer/new_customer = new /mob/living/simple_animal/robot_customer(get_turf(restaurant_portal), customer_type, src) + var/mob/living/basic/robot_customer/new_customer = new /mob/living/basic/robot_customer(get_turf(restaurant_portal), customer_type, src) current_visitors += new_customer -/datum/venue/proc/order_food(mob/living/simple_animal/robot_customer/customer_pawn, datum/customer_data/customer_data) +/datum/venue/proc/order_food(mob/living/basic/robot_customer/customer_pawn, datum/customer_data/customer_data) var/order = pick_weight(customer_data.orderable_objects[venue_type]) var/list/order_args // Only for custom orders - arguments passed into New var/image/food_image @@ -113,7 +113,7 @@ return "broken venue pls call a coder" ///Effects for when a customer receives their order at this venue -/datum/venue/proc/on_get_order(mob/living/simple_animal/robot_customer/customer_pawn, obj/item/order_item) +/datum/venue/proc/on_get_order(mob/living/basic/robot_customer/customer_pawn, obj/item/order_item) SHOULD_CALL_PARENT(TRUE) // This is an item typepath, a reagent typepath, or a custom order datum instance. @@ -152,7 +152,7 @@ open = FALSE restaurant_portal.update_icon() STOP_PROCESSING(SSobj, src) - for(var/mob/living/simple_animal/robot_customer as anything in current_visitors) + for(var/mob/living/basic/robot_customer as anything in current_visitors) robot_customer.ai_controller.set_blackboard_key(BB_CUSTOMER_LEAVING, TRUE) //LEAVEEEEEE /obj/machinery/restaurant_portal diff --git a/code/modules/food_and_drinks/restaurant/custom_order.dm b/code/modules/food_and_drinks/restaurant/custom_order.dm index 25ea878024130..d87797b25780d 100644 --- a/code/modules/food_and_drinks/restaurant/custom_order.dm +++ b/code/modules/food_and_drinks/restaurant/custom_order.dm @@ -34,7 +34,7 @@ * Return [TRANSACTION_SUCCESS] to denote the order went through successfully (Not generally necessary to include here) * Return [TRANSACTION_HANDLED] to not do any further handling of the order by the */ -/datum/custom_order/proc/handle_get_order(mob/living/simple_animal/robot_customer/customer_pawn, obj/item/order_item) +/datum/custom_order/proc/handle_get_order(mob/living/basic/robot_customer/customer_pawn, obj/item/order_item) return NONE /datum/custom_order/moth_clothing @@ -115,11 +115,12 @@ /datum/custom_order/icecream/get_order_appearance(datum/venue/our_venue) var/image/food_image = image(icon = 'icons/effects/effects.dmi' , icon_state = "thought_bubble") - var/image/i_scream = image('icons/obj/kitchen.dmi', initial(cone_type.icon_state)) + var/image/i_scream = image('icons/obj/service/kitchen.dmi', initial(cone_type.icon_state)) var/added_offset = 0 for(var/flavor in wanted_flavors) - var/image/scoop = image('icons/obj/kitchen.dmi', GLOB.ice_cream_flavours[flavor].icon_state) + var/image/scoop = image('icons/obj/service/kitchen.dmi', "icecream_custom") + scoop.color = GLOB.ice_cream_flavours[flavor].color scoop.pixel_y = added_offset i_scream.overlays += scoop added_offset += ICE_CREAM_SCOOP_OFFSET @@ -152,7 +153,7 @@ food_image.add_overlay(drink_image) return food_image -/datum/custom_order/reagent/handle_get_order(mob/living/simple_animal/robot_customer/customer_pawn, obj/item/order_item) +/datum/custom_order/reagent/handle_get_order(mob/living/basic/robot_customer/customer_pawn, obj/item/order_item) . = TRANSACTION_HANDLED for(var/datum/reagent/reagent as anything in order_item.reagents?.reagent_list) @@ -183,7 +184,7 @@ /datum/custom_order/reagent/drink container_needed = /obj/item/reagent_containers/cup/glass/drinkingglass -/datum/custom_order/reagent/drink/handle_get_order(mob/living/simple_animal/robot_customer/customer_pawn, obj/item/order_item) +/datum/custom_order/reagent/drink/handle_get_order(mob/living/basic/robot_customer/customer_pawn, obj/item/order_item) customer_pawn.visible_message( span_danger("[customer_pawn] slurps up [order_item] in one go!"), span_danger("You slurp up [order_item] in one go."), @@ -209,7 +210,7 @@ /datum/custom_order/reagent/soup/get_order_line(datum/venue/our_venue) return "I'll take a [picked_serving] of [initial(reagent_type.name)]" -/datum/custom_order/reagent/soup/handle_get_order(mob/living/simple_animal/robot_customer/customer_pawn, obj/item/order_item) +/datum/custom_order/reagent/soup/handle_get_order(mob/living/basic/robot_customer/customer_pawn, obj/item/order_item) customer_pawn.visible_message( span_danger("[customer_pawn] pours [order_item] right down [customer_pawn.p_their()] hatch!"), span_danger("You pour [order_item] down your hatch in one go."), diff --git a/code/modules/food_and_drinks/restaurant/customers/_customer.dm b/code/modules/food_and_drinks/restaurant/customers/_customer.dm index a2d1678ba722b..47bb843d755c7 100644 --- a/code/modules/food_and_drinks/restaurant/customers/_customer.dm +++ b/code/modules/food_and_drinks/restaurant/customers/_customer.dm @@ -52,10 +52,10 @@ /datum/customer_data/proc/can_use(datum/venue/venue) return TRUE -/datum/customer_data/proc/get_overlays(mob/living/simple_animal/robot_customer/customer) +/datum/customer_data/proc/get_overlays(mob/living/basic/robot_customer/customer) return -/datum/customer_data/proc/get_underlays(mob/living/simple_animal/robot_customer/customer) +/datum/customer_data/proc/get_underlays(mob/living/basic/robot_customer/customer) return /datum/customer_data/american @@ -74,6 +74,7 @@ /obj/item/food/burger/plain = 25, /obj/item/food/burger/cheese = 15, /obj/item/food/burger/superbite = 1, + /obj/item/food/butter/on_a_stick = 8, /obj/item/food/fries = 10, /obj/item/food/cheesyfries = 6, /obj/item/food/pie/applepie = 4, @@ -176,7 +177,7 @@ ), ) -/datum/customer_data/french/get_overlays(mob/living/simple_animal/robot_customer/customer) +/datum/customer_data/french/get_overlays(mob/living/basic/robot_customer/customer) if(customer.ai_controller.blackboard[BB_CUSTOMER_LEAVING]) var/mutable_appearance/flag = mutable_appearance(customer.icon, "french_flag") flag.appearance_flags = RESET_COLOR @@ -223,7 +224,7 @@ ), ) -/datum/customer_data/japanese/get_overlays(mob/living/simple_animal/robot_customer/customer) +/datum/customer_data/japanese/get_overlays(mob/living/basic/robot_customer/customer) //leaving and eaten if(type == /datum/customer_data/japanese && customer.ai_controller.blackboard[BB_CUSTOMER_LEAVING] && customer.ai_controller.blackboard[BB_CUSTOMER_EATING]) var/mutable_appearance/you_won_my_heart = mutable_appearance('icons/effects/effects.dmi', "love_hearts") @@ -302,29 +303,29 @@ return FALSE return TRUE -/datum/customer_data/moth/proc/get_wings(mob/living/simple_animal/robot_customer/customer) +/datum/customer_data/moth/proc/get_wings(mob/living/basic/robot_customer/customer) var/customer_ref = WEAKREF(customer) if (!LAZYACCESS(wings_chosen, customer_ref)) LAZYSET(wings_chosen, customer_ref, GLOB.moth_wings_list[pick(GLOB.moth_wings_list)]) return wings_chosen[customer_ref] -/datum/customer_data/moth/get_underlays(mob/living/simple_animal/robot_customer/customer) +/datum/customer_data/moth/get_underlays(mob/living/basic/robot_customer/customer) var/list/underlays = list() var/datum/sprite_accessory/moth_wings/wings = get_wings(customer) - var/mutable_appearance/wings_behind = mutable_appearance(icon = 'icons/mob/species/moth/moth_wings.dmi', icon_state = "m_moth_wings_[wings.icon_state]_BEHIND") + var/mutable_appearance/wings_behind = mutable_appearance(icon = 'icons/mob/human/species/moth/moth_wings.dmi', icon_state = "m_moth_wings_[wings.icon_state]_BEHIND") wings_behind.appearance_flags = RESET_COLOR underlays += wings_behind return underlays -/datum/customer_data/moth/get_overlays(mob/living/simple_animal/robot_customer/customer) +/datum/customer_data/moth/get_overlays(mob/living/basic/robot_customer/customer) var/list/overlays = list() var/datum/sprite_accessory/moth_wings/wings = get_wings(customer) - var/mutable_appearance/wings_front = mutable_appearance(icon = 'icons/mob/species/moth/moth_wings.dmi', icon_state = "m_moth_wings_[wings.icon_state]_FRONT") + var/mutable_appearance/wings_front = mutable_appearance(icon = 'icons/mob/human/species/moth/moth_wings.dmi', icon_state = "m_moth_wings_[wings.icon_state]_FRONT") wings_front.appearance_flags = RESET_COLOR overlays += wings_front diff --git a/code/modules/food_and_drinks/restaurant/generic_venues.dm b/code/modules/food_and_drinks/restaurant/generic_venues.dm index 19f1ff6132335..9e9b0a6d0e3bd 100644 --- a/code/modules/food_and_drinks/restaurant/generic_venues.dm +++ b/code/modules/food_and_drinks/restaurant/generic_venues.dm @@ -42,7 +42,7 @@ var/obj/item/object_to_order = order return "I'll take \a [initial(object_to_order.name)]" -/datum/venue/restaurant/on_get_order(mob/living/simple_animal/robot_customer/customer_pawn, obj/item/order_item) +/datum/venue/restaurant/on_get_order(mob/living/basic/robot_customer/customer_pawn, obj/item/order_item) var/transaction_result = ..() if((transaction_result & TRANSACTION_HANDLED) || !(transaction_result & TRANSACTION_SUCCESS)) return diff --git a/code/modules/forensics/_forensics.dm b/code/modules/forensics/_forensics.dm index 76a051f1d727a..5936ce4b5c4de 100644 --- a/code/modules/forensics/_forensics.dm +++ b/code/modules/forensics/_forensics.dm @@ -232,6 +232,8 @@ /datum/forensics/proc/check_blood() if(!parent || !isitem(parent.resolve())) return + if(isorgan(parent.resolve())) // organs don't spawn with blood decals by default + return if(!length(blood_DNA)) return var/atom/parent_atom = parent.resolve() diff --git a/code/modules/forensics/forensics_helpers.dm b/code/modules/forensics/forensics_helpers.dm index 081d6f25d4f1e..d71d1ebe1539c 100644 --- a/code/modules/forensics/forensics_helpers.dm +++ b/code/modules/forensics/forensics_helpers.dm @@ -94,6 +94,9 @@ return TRUE //we bloodied the floor return FALSE +/turf/closed/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) + return FALSE + /mob/living/carbon/human/add_blood_DNA(list/blood_DNA_to_add, list/datum/disease/diseases) if(wear_suit) wear_suit.add_blood_DNA(blood_DNA_to_add) diff --git a/code/modules/hallucination/body.dm b/code/modules/hallucination/body.dm index 1e9b78f82400c..5167b63c5eed4 100644 --- a/code/modules/hallucination/body.dm +++ b/code/modules/hallucination/body.dm @@ -58,7 +58,7 @@ /datum/hallucination/body/husk random_hallucination_weight = 8 - body_image_file = 'icons/mob/species/human/human.dmi' + body_image_file = 'icons/mob/human/human.dmi' body_image_state = "husk" /datum/hallucination/body/husk/sideways @@ -99,7 +99,7 @@ /datum/hallucination/body/staticguy/queue_cleanup() RegisterSignal(hallucinator, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) - del_timerid = QDEL_IN(src, rand(2 MINUTES, 3 MINUTES)) + del_timerid = QDEL_IN_STOPPABLE(src, rand(2 MINUTES, 3 MINUTES)) return TRUE /// Signal proc for [COMSIG_MOVABLE_MOVED] - if we move out of view of the hallucination, it disappears, how spooky @@ -110,7 +110,7 @@ if(shown_body.loc == hallucinator.loc) animate(shown_body, alpha = 0, time = 0.5 SECONDS) deltimer(del_timerid) - del_timerid = QDEL_IN(src, 0.6 SECONDS) + del_timerid = QDEL_IN_STOPPABLE(src, 0.6 SECONDS) return // Staying in view will do nothing diff --git a/code/modules/hallucination/delusions.dm b/code/modules/hallucination/delusions.dm index 9e3aed233295d..312972f5c9a47 100644 --- a/code/modules/hallucination/delusions.dm +++ b/code/modules/hallucination/delusions.dm @@ -141,7 +141,7 @@ delusion_name = "???" /datum/hallucination/delusion/preset/monkey - delusion_icon_file = 'icons/mob/species/human/human.dmi' + delusion_icon_file = 'icons/mob/human/human.dmi' delusion_icon_state = "monkey" delusion_name = "monkey" @@ -160,18 +160,18 @@ delusion_name = "carp" /datum/hallucination/delusion/preset/skeleton - delusion_icon_file = 'icons/mob/species/human/human.dmi' + delusion_icon_file = 'icons/mob/human/human.dmi' delusion_icon_state = "skeleton" delusion_name = "skeleton" /datum/hallucination/delusion/preset/zombie - delusion_icon_file = 'icons/mob/species/human/human.dmi' + delusion_icon_file = 'icons/mob/human/human.dmi' delusion_icon_state = "zombie" delusion_name = "zombie" /datum/hallucination/delusion/preset/demon - delusion_icon_file = 'icons/mob/simple/mob.dmi' - delusion_icon_state = "daemon" + delusion_icon_file = 'icons/mob/simple/demon.dmi' + delusion_icon_state = "slaughter_demon" delusion_name = "demon" /datum/hallucination/delusion/preset/cyborg @@ -220,3 +220,12 @@ )) return ..() + +/// Hallucination used by the nightmare vision goggles to turn everyone except you into mares +/datum/hallucination/delusion/preset/mare + delusion_icon_file = 'icons/obj/clothing/masks.dmi' + delusion_icon_state = "horsehead" + delusion_name = "mare" + affects_us = FALSE + affects_others = TRUE + random_hallucination_weight = 0 diff --git a/code/modules/hallucination/fake_alert.dm b/code/modules/hallucination/fake_alert.dm index 56cecba04764e..537f6e294909a 100644 --- a/code/modules/hallucination/fake_alert.dm +++ b/code/modules/hallucination/fake_alert.dm @@ -36,7 +36,7 @@ override = TRUE, ) - del_timer_id = QDEL_IN(src, duration) + del_timer_id = QDEL_IN_STOPPABLE(src, duration) return TRUE /datum/hallucination/fake_alert/need_oxygen diff --git a/code/modules/hallucination/fake_chat.dm b/code/modules/hallucination/fake_chat.dm index 47a99d2088bf9..049a337c1101c 100644 --- a/code/modules/hallucination/fake_chat.dm +++ b/code/modules/hallucination/fake_chat.dm @@ -34,7 +34,7 @@ humans += crew_mind.current if(humans.len) speaker = pick(humans) - + if(!speaker) return @@ -87,7 +87,7 @@ hallucinator.create_chat_message(speaker, understood_language, chosen, spans) // And actually show them the message, for real. - var/message = hallucinator.compose_message(speaker, understood_language, chosen, is_radio ? "[FREQ_COMMON]" : null, spans, face_name = TRUE) + var/message = hallucinator.compose_message(speaker, understood_language, chosen, is_radio ? "[FREQ_COMMON]" : null, spans, visible_name = TRUE) to_chat(hallucinator, message) // Then clean up. diff --git a/code/modules/hallucination/fake_death.dm b/code/modules/hallucination/fake_death.dm index 9492f2f2ebccf..c80c54959eede 100644 --- a/code/modules/hallucination/fake_death.dm +++ b/code/modules/hallucination/fake_death.dm @@ -1,6 +1,8 @@ // This hallucinations makes us suddenly think we died, stopping us / changing our hud / sending a fake deadchat message. /datum/hallucination/death random_hallucination_weight = 1 + /// Determines whether we floor them or just immobilize them + var/floor_them = TRUE /datum/hallucination/death/Destroy() if(!QDELETED(hallucinator)) @@ -12,7 +14,11 @@ return ..() /datum/hallucination/death/start() - hallucinator.Paralyze(30 SECONDS) + if(floor_them) + hallucinator.Paralyze(30 SECONDS) + else + hallucinator.Immobilize(30 SECONDS) + hallucinator.apply_status_effect(/datum/status_effect/grouped/screwy_hud/fake_dead, REF(src)) hallucinator.add_traits(list(TRAIT_MUTE, TRAIT_EMOTEMUTE), REF(src)) @@ -72,7 +78,10 @@ /datum/hallucination/death/proc/wake_up() if(!QDELETED(hallucinator)) hallucinator.remove_status_effect(/datum/status_effect/grouped/screwy_hud/fake_dead, REF(src)) - hallucinator.SetParalyzed(0 SECONDS) + if(floor_them) + hallucinator.SetParalyzed(0 SECONDS) + else + hallucinator.SetImmobilized(0 SECONDS) hallucinator.remove_traits(list(TRAIT_MUTE, TRAIT_EMOTEMUTE), REF(src)) if(!QDELETED(src)) @@ -80,6 +89,7 @@ // A subtype of death which plays a dusted animation. /datum/hallucination/death/dust + floor_them = FALSE /// List of all images we created to convey the effect to the hallucinator (so we can remove them after) var/list/image/created_images diff --git a/code/modules/hallucination/screwy_health_doll.dm b/code/modules/hallucination/screwy_health_doll.dm index b2efb0a69eb1e..7bab267563c74 100644 --- a/code/modules/hallucination/screwy_health_doll.dm +++ b/code/modules/hallucination/screwy_health_doll.dm @@ -29,7 +29,7 @@ return FALSE add_fake_limb() - del_timer_id = QDEL_IN(src, duration) + del_timer_id = QDEL_IN_STOPPABLE(src, duration) return TRUE /// Increments the severity of the damage seen on all the limbs we are already tracking. diff --git a/code/modules/hallucination/shock.dm b/code/modules/hallucination/shock.dm index 32fc17fce1db1..99db2530d85c2 100644 --- a/code/modules/hallucination/shock.dm +++ b/code/modules/hallucination/shock.dm @@ -2,7 +2,7 @@ /datum/hallucination/shock random_hallucination_weight = 1 - var/electrocution_icon = 'icons/mob/species/human/human.dmi' + var/electrocution_icon = 'icons/mob/human/human.dmi' var/electrocution_icon_state = "electrocuted_base" var/image/shock_image var/image/electrocution_skeleton_anim diff --git a/code/modules/hallucination/stray_bullet.dm b/code/modules/hallucination/stray_bullet.dm index b7fe281471384..97f75f9506106 100644 --- a/code/modules/hallucination/stray_bullet.dm +++ b/code/modules/hallucination/stray_bullet.dm @@ -242,7 +242,7 @@ ";AAAAAAARRRGH!"), forced = "hulk (hallucinating)", ) - else if((afflicted.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(afflicted, TRAIT_STUNIMMUNE)) + else if(!afflicted.check_stun_immunity(CANKNOCKDOWN)) addtimer(CALLBACK(afflicted, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), 20), 0.5 SECONDS) /obj/projectile/hallucination/disabler diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm index 0a16977c5c1eb..c2b1165f74c74 100644 --- a/code/modules/holiday/holidays.dm +++ b/code/modules/holiday/holidays.dm @@ -18,8 +18,8 @@ var/year_offset = 0 ///Timezones this holiday is celebrated in (defaults to three timezones spanning a 50 hour window covering all timezones) var/list/timezones = list(TIMEZONE_LINT, TIMEZONE_UTC, TIMEZONE_ANYWHERE_ON_EARTH) - ///If this is defined, drones without a default hat will spawn with this one during the holiday; check drones_as_items.dm to see this used - var/obj/item/drone_hat + ///If this is defined, drones/assistants without a default hat will spawn with this item in their head clothing slot. + var/obj/item/holiday_hat ///When this holiday is active, does this prevent mail from arriving to cargo? Try not to use this for longer holidays. var/mail_holiday = FALSE var/poster_name = "generic celebration poster" @@ -109,6 +109,7 @@ name = "Fleet Day" begin_month = JANUARY begin_day = 19 + holiday_hat = /obj/item/clothing/head/mothcap /datum/holiday/fleet_day/greet() return "This day commemorates another year of successful survival aboard the Mothic Grand Nomad Fleet. Moths galaxywide are encouraged to eat, drink, and be merry." @@ -155,7 +156,7 @@ name = "Birthday of Space Station 13" begin_day = 16 begin_month = FEBRUARY - drone_hat = /obj/item/clothing/head/costume/festive + holiday_hat = /obj/item/clothing/head/costume/festive poster_name = "station birthday poster" poster_desc = "A poster celebrating another year of the station's operation. Why anyone would be happy to be here is byond you." poster_icon = "holiday_cake" // is a lie @@ -220,7 +221,7 @@ name = "St. Patrick's Day" begin_day = 17 begin_month = MARCH - drone_hat = /obj/item/clothing/head/soft/green + holiday_hat = /obj/item/clothing/head/soft/green /datum/holiday/no_this_is_patrick/getStationPrefix() return pick("Blarney","Green","Leprechaun","Booze") @@ -235,6 +236,7 @@ begin_month = APRIL begin_day = 1 end_day = 2 + holiday_hat = /obj/item/clothing/head/chameleon/broken /datum/holiday/april_fools/celebrate() . = ..() @@ -252,7 +254,7 @@ name = "Cosmonautics Day" begin_day = 12 begin_month = APRIL - drone_hat = /obj/item/clothing/head/syndicatefake + holiday_hat = /obj/item/clothing/head/syndicatefake /datum/holiday/spess/greet() return "On this day over 600 years ago, Comrade Yuri Gagarin first ventured into space!" @@ -261,6 +263,7 @@ name = "Four-Twenty" begin_day = 20 begin_month = APRIL + holiday_hat = /obj/item/clothing/head/rasta /datum/holiday/fourtwenty/getStationPrefix() return pick("Snoop","Blunt","Toke","Dank","Cheech","Chong") @@ -283,7 +286,7 @@ timezones = list(TIMEZONE_TKT, TIMEZONE_TOT, TIMEZONE_NZST, TIMEZONE_NFT, TIMEZONE_LHST, TIMEZONE_AEST, TIMEZONE_ACST, TIMEZONE_ACWST, TIMEZONE_AWST, TIMEZONE_CXT, TIMEZONE_CCT, TIMEZONE_CKT, TIMEZONE_NUT) begin_day = 25 begin_month = APRIL - drone_hat = /obj/item/food/grown/poppy + holiday_hat = /obj/item/food/grown/poppy /datum/holiday/anz/getStationPrefix() return pick("Australian","New Zealand","Poppy", "Southern Cross") @@ -294,7 +297,7 @@ name = "Labor Day" begin_day = 1 begin_month = MAY - drone_hat = /obj/item/clothing/head/utility/hardhat + holiday_hat = /obj/item/clothing/head/utility/hardhat mail_holiday = TRUE //Draconic Day is celebrated on May 3rd, the date on which the Draconic language was merged (#26780) @@ -313,7 +316,7 @@ name = "Firefighter's Day" begin_day = 4 begin_month = MAY - drone_hat = /obj/item/clothing/head/utility/hardhat/red + holiday_hat = /obj/item/clothing/head/utility/hardhat/red /datum/holiday/firefighter/getStationPrefix() return pick("Burning","Blazing","Plasma","Fire") @@ -322,7 +325,6 @@ name = "Bee Day" begin_day = 20 begin_month = MAY - drone_hat = /obj/item/clothing/mask/animal/small/bee /datum/holiday/bee/getStationPrefix() return pick("Bee","Honey","Hive","Africanized","Mead","Buzz") @@ -355,6 +357,7 @@ name = "Summer Solstice" begin_day = 21 begin_month = JUNE + holiday_hat = /obj/item/clothing/head/costume/garland /datum/holiday/pride_week name = PRIDE_WEEK @@ -377,13 +380,13 @@ name = "Doctor's Day" begin_day = 1 begin_month = JULY - drone_hat = /obj/item/clothing/head/costume/nursehat + holiday_hat = /obj/item/clothing/head/costume/nursehat /datum/holiday/ufo name = "UFO Day" begin_day = 2 begin_month = JULY - drone_hat = /obj/item/clothing/mask/facehugger/dead + holiday_hat = /obj/item/clothing/head/collectable/xenom /datum/holiday/ufo/getStationPrefix() //Is such a thing even possible? return pick("Ayy","Truth","Tsoukalos","Mulder","Scully") //Yes it is! @@ -394,6 +397,7 @@ begin_day = 4 begin_month = JULY mail_holiday = TRUE + holiday_hat = /obj/item/clothing/head/cowboy/brown /datum/holiday/usa/getStationPrefix() return pick("Independent","American","Burger","Bald Eagle","Star-Spangled", "Fireworks") @@ -408,7 +412,7 @@ timezones = list(TIMEZONE_CEST) begin_day = 14 begin_month = JULY - drone_hat = /obj/item/clothing/head/beret + holiday_hat = /obj/item/clothing/head/beret mail_holiday = TRUE /datum/holiday/france/getStationPrefix() @@ -430,7 +434,7 @@ name = "Wizard's Day" begin_month = JULY begin_day = 27 - drone_hat = /obj/item/clothing/head/wizard + holiday_hat = /obj/item/clothing/head/wizard /datum/holiday/wizards_day/getStationPrefix() return pick("Dungeon", "Elf", "Magic", "D20", "Edition") @@ -460,7 +464,7 @@ begin_month = AUGUST begin_day = 24 -/datum/holiday/indigenous/getStationPrefix() +/datum/holiday/ukraine/getStationPrefix() return pick("Kyiv", "Ukraine") // SEPTEMBER @@ -470,6 +474,7 @@ name = "Tiziran Unification Day" begin_month = SEPTEMBER begin_day = 1 + holiday_hat = /obj/item/clothing/head/costume/lizard /datum/holiday/tiziran_unification/greet() return "On this day over 400 years ago, Lizardkind first united under a single banner, ready to face the stars as one unified people." @@ -493,7 +498,7 @@ name = "Talk-Like-a-Pirate Day" begin_day = 19 begin_month = SEPTEMBER - drone_hat = /obj/item/clothing/head/costume/pirate + holiday_hat = /obj/item/clothing/head/costume/pirate /datum/holiday/pirate/greet() return "Ye be talkin' like a pirate today or else ye'r walkin' tha plank, matey!" @@ -523,13 +528,13 @@ name = "Smiling Day" begin_day = 7 begin_month = OCTOBER - drone_hat = /obj/item/clothing/head/costume/papersack/smiley + holiday_hat = /obj/item/clothing/head/costume/papersack/smiley /datum/holiday/boss name = "Boss' Day" begin_day = 16 begin_month = OCTOBER - drone_hat = /obj/item/clothing/head/hats/tophat + holiday_hat = /obj/item/clothing/head/hats/tophat /datum/holiday/un_day name = "Anniversary of the Foundation of the United Nations" @@ -578,7 +583,7 @@ name = "Remembrance Day" begin_month = NOVEMBER begin_day = 11 - drone_hat = /obj/item/food/grown/poppy + holiday_hat = /obj/item/food/grown/poppy /datum/holiday/remembrance_day/getStationPrefix() return pick("Peace", "Armistice", "Poppy") @@ -600,7 +605,7 @@ name = "Flowers Day" begin_day = 19 begin_month = NOVEMBER - drone_hat = /obj/item/food/grown/moonflower + holiday_hat = /obj/item/food/grown/moonflower /datum/holiday/hello name = "Saying-'Hello' Day" @@ -629,7 +634,7 @@ begin_day = 1 begin_month = DECEMBER end_day = 31 - drone_hat = /obj/item/clothing/head/costume/santa + holiday_hat = /obj/item/clothing/head/costume/santa /datum/holiday/festive_season/greet() return "Have a nice festive season!" @@ -643,22 +648,40 @@ name = MONKEYDAY begin_day = 14 begin_month = DECEMBER - drone_hat = /obj/item/clothing/mask/gas/monkeymask /datum/holiday/doomsday name = "Mayan Doomsday Anniversary" begin_day = 21 begin_month = DECEMBER - drone_hat = /obj/item/clothing/mask/animal/small/tribal /datum/holiday/xmas name = CHRISTMAS begin_day = 23 begin_month = DECEMBER end_day = 27 - drone_hat = /obj/item/clothing/head/costume/santa + holiday_hat = /obj/item/clothing/head/costume/santa mail_holiday = TRUE +/datum/holiday/xmas/getStationPrefix() + return pick( + "Bible", + "Birthday", + "Chimney", + "Claus", + "Crucifixion", + "Elf", + "Fir", + "Ho Ho Ho", + "Jesus", + "Jolly", + "Merry", + "Present", + "Sack", + "Santa", + "Sleigh", + "Yule", + ) + /datum/holiday/xmas/greet() return "Have a merry Christmas!" @@ -673,7 +696,7 @@ begin_month = DECEMBER end_day = 2 end_month = JANUARY - drone_hat = /obj/item/clothing/head/costume/festive + holiday_hat = /obj/item/clothing/head/costume/festive mail_holiday = TRUE /datum/holiday/new_year/getStationPrefix() @@ -777,7 +800,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 SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/computer/security/telescreen/entertainment)) Monitor.icon_state_on = "entertainment_xmas" for(var/mob/living/basic/pet/dog/corgi/ian/Ian in GLOB.mob_living_list) @@ -788,7 +811,7 @@ /datum/holiday/easter name = EASTER - drone_hat = /obj/item/clothing/head/costume/rabbitears + holiday_hat = /obj/item/clothing/head/costume/rabbitears var/const/days_early = 1 //to make editing the holiday easier var/const/days_extra = 1 diff --git a/code/modules/holiday/nth_week.dm b/code/modules/holiday/nth_week.dm index 55cfec74be6e2..ef4815de06646 100644 --- a/code/modules/holiday/nth_week.dm +++ b/code/modules/holiday/nth_week.dm @@ -35,7 +35,7 @@ begin_week = 4 begin_month = NOVEMBER begin_weekday = THURSDAY - drone_hat = /obj/item/clothing/head/hats/tophat //This is the closest we can get to a pilgrim's hat + holiday_hat = /obj/item/clothing/head/hats/tophat //This is the closest we can get to a pilgrim's hat /datum/holiday/nth_week/thanksgiving/canada name = "Thanksgiving in Canada" diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm index 9103ad3ebc730..085225e34f379 100644 --- a/code/modules/holodeck/computer.dm +++ b/code/modules/holodeck/computer.dm @@ -269,41 +269,53 @@ GLOBAL_LIST_INIT(typecache_holodeck_linked_floorcheck_ok, typecacheof(list(/turf if(QDELETED(holo_atom)) spawned -= holo_atom continue + finalize_spawned(holo_atom) + spawning_simulation = FALSE - RegisterSignal(holo_atom, COMSIG_QDELETING, PROC_REF(remove_from_holo_lists)) - holo_atom.flags_1 |= HOLOGRAM_1 - - if(isholoeffect(holo_atom))//activates holo effects and transfers them from the spawned list into the effects list - var/obj/effect/holodeck_effect/holo_effect = holo_atom - effects += holo_effect - spawned -= holo_effect - var/atom/holo_effect_product = holo_effect.activate(src)//change name - if(istype(holo_effect_product)) - spawned += holo_effect_product // we want mobs or objects spawned via holoeffects to be tracked as objects - RegisterSignal(holo_effect_product, COMSIG_QDELETING, PROC_REF(remove_from_holo_lists)) - if(islist(holo_effect_product)) - for(var/atom/atom_product as anything in holo_effect_product) - RegisterSignal(atom_product, COMSIG_QDELETING, PROC_REF(remove_from_holo_lists)) - continue - - if(isobj(holo_atom)) - var/obj/holo_object = holo_atom - holo_object.resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - - if(isstructure(holo_object)) - holo_object.flags_1 |= NODECONSTRUCT_1 - continue - - if(ismachinery(holo_object)) - var/obj/machinery/holo_machine = holo_object - holo_machine.flags_1 |= NODECONSTRUCT_1 - holo_machine.power_change() - - if(istype(holo_machine, /obj/machinery/button)) - var/obj/machinery/button/holo_button = holo_machine - holo_button.setup_device() +/obj/machinery/computer/holodeck/proc/finalize_spawned(atom/holo_atom) + RegisterSignal(holo_atom, COMSIG_QDELETING, PROC_REF(remove_from_holo_lists)) + holo_atom.flags_1 |= HOLOGRAM_1 + + if(isholoeffect(holo_atom))//activates holo effects and transfers them from the spawned list into the effects list + var/obj/effect/holodeck_effect/holo_effect = holo_atom + effects += holo_effect + spawned -= holo_effect + var/atom/holo_effect_product = holo_effect.activate(src)//change name + if(istype(holo_effect_product)) + spawned += holo_effect_product // we want mobs or objects spawned via holoeffects to be tracked as objects + RegisterSignal(holo_effect_product, COMSIG_QDELETING, PROC_REF(remove_from_holo_lists)) + if(islist(holo_effect_product)) + for(var/atom/atom_product as anything in holo_effect_product) + RegisterSignal(atom_product, COMSIG_QDELETING, PROC_REF(remove_from_holo_lists)) + return - spawning_simulation = FALSE + if(isobj(holo_atom)) + var/obj/holo_object = holo_atom + holo_object.resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + + if(isstructure(holo_object)) + holo_object.flags_1 |= NODECONSTRUCT_1 + return + + if(ismachinery(holo_object)) + var/obj/machinery/holo_machine = holo_object + holo_machine.flags_1 |= NODECONSTRUCT_1 + holo_machine.power_change() + + if(istype(holo_machine, /obj/machinery/button)) + var/obj/machinery/button/holo_button = holo_machine + holo_button.setup_device() + +/** + * A separate proc for objects that weren't loaded by the template nor spawned by holo effects + * yet need to be added to the list of spawned objects. (e.g. holographic fishes) + */ +/obj/machinery/computer/holodeck/proc/add_to_spawned(atom/holo_atom) + spawned |= holo_atom + if(!(obj_flags & EMAGGED) && isitem(holo_atom)) + var/obj/item/to_be_nerfed = holo_atom + to_be_nerfed.damtype = STAMINA + finalize_spawned(holo_atom) ///this qdels holoitems that should no longer exist for whatever reason /obj/machinery/computer/holodeck/proc/derez(atom/movable/holo_atom, silent = TRUE, forced = FALSE) @@ -315,9 +327,9 @@ GLOBAL_LIST_INIT(typecache_holodeck_linked_floorcheck_ok, typecacheof(list(/turf for(var/atom/movable/atom_contents as anything in holo_atom) //make sure that things inside of a holoitem are moved outside before destroying it atom_contents.forceMove(target_turf) - if(istype(holo_atom, /obj/item/clothing/under/rank)) + if(istype(holo_atom, /obj/item/clothing/under)) var/obj/item/clothing/under/holo_clothing = holo_atom - holo_clothing.dump_attachment() + holo_clothing.dump_attachments() if(!silent) visible_message(span_notice("[holo_atom] fades away!")) @@ -399,19 +411,23 @@ GLOBAL_LIST_INIT(typecache_holodeck_linked_floorcheck_ok, typecacheof(list(/turf for(var/obj/effect/holodeck_effect/holo_effect as anything in effects) holo_effect.safety(nerf_this) -/obj/machinery/computer/holodeck/emag_act(mob/user) +/obj/machinery/computer/holodeck/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE if(!LAZYLEN(emag_programs)) - to_chat(user, "[src] does not seem to have a card swipe port. It must be an inferior model.") - return + balloon_alert(user, "no card swipe port!") + return FALSE playsound(src, SFX_SPARKS, 75, TRUE) obj_flags |= EMAGGED - to_chat(user, span_warning("You vastly increase projector power and override the safety and security protocols.")) + if (user) + balloon_alert(user, "safety protocols destroyed") // im gonna keep this once since this perfectly describes it, and the to_chat is just flavor + to_chat(user, span_warning("You vastly increase projector power and override the safety and security protocols.")) + user.log_message("emagged the Holodeck Control Console.", LOG_GAME) + message_admins("[ADMIN_LOOKUPFLW(user)] emagged the Holodeck Control Console.") + say("Warning. Automatic shutoff and derezzing protocols have been corrupted. Please call Nanotrasen maintenance and do not use the simulator.") - user.log_message("emagged the Holodeck Control Console.", LOG_GAME) - message_admins("[ADMIN_LOOKUPFLW(user)] emagged the Holodeck Control Console.") nerf(!(obj_flags & EMAGGED),FALSE) + return TRUE /obj/machinery/computer/holodeck/emp_act(severity) . = ..() diff --git a/code/modules/holodeck/holo_effect.dm b/code/modules/holodeck/holo_effect.dm index ba8522e93c983..a8d51c8772829 100644 --- a/code/modules/holodeck/holo_effect.dm +++ b/code/modules/holodeck/holo_effect.dm @@ -61,6 +61,7 @@ mobtype = pick(mobtype) our_mob = new mobtype(loc) our_mob.flags_1 |= HOLOGRAM_1 + ADD_TRAIT(our_mob, TRAIT_PERMANENTLY_MORTAL, INNATE_TRAIT) // these vars are not really standardized but all would theoretically create stuff on death for(var/v in list("butcher_results","corpse","weapon1","weapon2","blood_volume") & our_mob.vars) @@ -84,8 +85,8 @@ mobtype = list( /mob/living/basic/butterfly, /mob/living/basic/chick/permanent, + /mob/living/basic/pet/fox/docile, /mob/living/basic/rabbit, - /mob/living/simple_animal/pet/fox, ) mobtype += pick( /mob/living/basic/pet/dog/corgi, @@ -98,21 +99,21 @@ ) /obj/effect/holodeck_effect/mobspawner/bee - mobtype = /mob/living/simple_animal/hostile/bee/toxin + mobtype = /mob/living/basic/bee/toxin /obj/effect/holodeck_effect/mobspawner/monkey mobtype = /mob/living/simple_animal/holodeck_monkey /obj/effect/holodeck_effect/mobspawner/penguin - mobtype = /mob/living/simple_animal/pet/penguin/emperor + mobtype = /mob/living/basic/pet/penguin/emperor/neuter /obj/effect/holodeck_effect/mobspawner/penguin/Initialize(mapload) if(prob(1)) - mobtype = /mob/living/simple_animal/pet/penguin/emperor/shamebrero + mobtype = /mob/living/basic/pet/penguin/emperor/shamebrero/neuter return ..() /obj/effect/holodeck_effect/mobspawner/penguin_baby - mobtype = /mob/living/simple_animal/pet/penguin/baby + mobtype = /mob/living/basic/pet/penguin/baby/permanent /obj/effect/holodeck_effect/mobspawner/crab/jon - mobtype = /mob/living/simple_animal/crab/jon + mobtype = /mob/living/basic/crab/jon diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm index aca2324fc8fe9..019c229842efb 100644 --- a/code/modules/holodeck/items.dm +++ b/code/modules/holodeck/items.dm @@ -75,7 +75,7 @@ /obj/machinery/readybutton name = "ready declaration device" desc = "This device is used to declare ready. If all devices in an area are ready, the event will begin!" - icon = 'icons/obj/monitors.dmi' + icon = 'icons/obj/machines/wallmounts.dmi' icon_state = "auth_off" var/ready = 0 var/area/currentarea = null diff --git a/code/modules/holodeck/mobs.dm b/code/modules/holodeck/mobs.dm index c683905e33e89..7a7e7c22d9e10 100644 --- a/code/modules/holodeck/mobs.dm +++ b/code/modules/holodeck/mobs.dm @@ -5,7 +5,7 @@ /mob/living/simple_animal/holodeck_monkey name = "monkey" desc = "A holographic creature fond of bananas." - icon = 'icons/mob/species/human/human.dmi' + icon = 'icons/mob/human/human.dmi' icon_state = "monkey" icon_living = "monkey" icon_dead = "monkey_dead" diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm index 2f0b415d07536..28482873aeb98 100644 --- a/code/modules/holodeck/turfs.dm +++ b/code/modules/holodeck/turfs.dm @@ -91,6 +91,10 @@ icon_state = "water" bullet_sizzle = TRUE +/turf/open/floor/holofloor/beach/water/Initialize(mapload) + . = ..() + AddComponent(/datum/component/fishing_spot, /datum/fish_source/holographic) + /turf/open/floor/holofloor/asteroid gender = PLURAL name = "asteroid sand" diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm index e3cdfdb5c0e5a..9ecde7400d944 100644 --- a/code/modules/hydroponics/beekeeping/beebox.dm +++ b/code/modules/hydroponics/beekeeping/beebox.dm @@ -11,9 +11,6 @@ return 0 -/mob/living/simple_animal/hostile/bee/bee_friendly() - return 1 - /mob/living/carbon/human/bee_friendly() if(dna && dna.species && dna.species.id == SPECIES_PODPERSON) //bees pollinate plants, duh. @@ -29,11 +26,11 @@ /obj/structure/beebox name = "apiary" desc = "Dr. Miles Manners is just your average wasp-themed super hero by day, but by night he becomes DR. BEES!" - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "beebox" anchored = TRUE density = TRUE - var/mob/living/simple_animal/hostile/bee/queen/queen_bee = null + var/mob/living/basic/bee/queen/queen_bee = null var/list/bees = list() //bees owned by the box, not those inside it var/list/honeycombs = list() var/list/honey_frames = list() @@ -47,9 +44,10 @@ /obj/structure/beebox/Destroy() STOP_PROCESSING(SSobj, src) - bees.Cut() - honeycombs.Cut() queen_bee = null + QDEL_LIST(bees) + QDEL_LIST(honey_frames) + QDEL_LIST(honeycombs) return ..() @@ -77,7 +75,7 @@ honey_frames += HF for(var/i in 1 to get_max_bees()) - var/mob/living/simple_animal/hostile/bee/B = new(src) + var/mob/living/basic/bee/B = new(src) bees += B B.beehome = src B.assign_reagent(R) @@ -105,7 +103,7 @@ if((bee_resources >= BEE_RESOURCE_NEW_BEE_COST && prob(BEE_PROB_NEW_BEE)) || freebee) if(!freebee) bee_resources = max(bee_resources - BEE_RESOURCE_NEW_BEE_COST, 0) - var/mob/living/simple_animal/hostile/bee/B = new(get_turf(src)) + var/mob/living/basic/bee/B = new(get_turf(src)) B.beehome = src B.assign_reagent(queen_bee.beegent) bees += B @@ -177,7 +175,7 @@ visible_message(span_notice("[user] sets [queen_bee] down inside the apiary, making it their new home.")) var/relocated = 0 for(var/b in bees) - var/mob/living/simple_animal/hostile/bee/B = b + var/mob/living/basic/bee/B = b if(B.reagent_incompatible(queen_bee)) bees -= B B.beehome = null @@ -198,16 +196,14 @@ . = ..() if(!user.bee_friendly()) //Time to get stung! - var/bees = FALSE - for(var/b in bees) //everyone who's ever lived here now instantly hates you, suck it assistant! - var/mob/living/simple_animal/hostile/bee/B = b - if(B.isqueen) + var/bees_attack = FALSE + for(var/mob/living/basic/bee/worker as anything in bees) //everyone who's ever lived here now instantly hates you, suck it assistant! + if(worker.is_queen) continue - if(B.loc == src) - B.forceMove(drop_location()) - B.GiveTarget(user) - bees = TRUE - if(bees) + if(worker.loc == src) + worker.forceMove(drop_location()) + bees_attack = TRUE + if(bees_attack) visible_message(span_danger("[user] disturbs the bees!")) else visible_message(span_danger("[user] disturbs the [name] to no effect!")) @@ -255,17 +251,28 @@ /obj/structure/beebox/deconstruct(disassembled = TRUE) new /obj/item/stack/sheet/mineral/wood (loc, 20) - for(var/mob/living/simple_animal/hostile/bee/B in bees) - if(B.loc == src) - B.forceMove(drop_location()) - for(var/obj/item/honey_frame/HF in honey_frames) - if(HF.loc == src) - HF.forceMove(drop_location()) + for(var/mob/living/basic/bee/worker as anything in bees) + if(worker.loc == src) + worker.forceMove(get_turf(src)) + bees -= worker + worker.beehome = null + for(var/obj/item/honey_frame/frame as anything in honey_frames) + if(frame.loc == src) + frame.forceMove(get_turf(src)) + honey_frames -= frame qdel(src) /obj/structure/beebox/unwrenched anchored = FALSE +/obj/structure/beebox/proc/habitable(mob/living/basic/target) + if(!istype(target, /mob/living/basic/bee)) + return FALSE + var/mob/living/basic/bee/citizen = target + if(citizen.reagent_incompatible(queen_bee) || bees.len >= get_max_bees()) + return FALSE + return TRUE + #undef BEE_PROB_NEW_BEE #undef BEE_RESOURCE_HONEYCOMB_COST #undef BEE_RESOURCE_NEW_BEE_COST diff --git a/code/modules/hydroponics/beekeeping/honey_frame.dm b/code/modules/hydroponics/beekeeping/honey_frame.dm index 9e5736075d70a..5c4c1f3f8d1c2 100644 --- a/code/modules/hydroponics/beekeeping/honey_frame.dm +++ b/code/modules/hydroponics/beekeeping/honey_frame.dm @@ -2,7 +2,7 @@ /obj/item/honey_frame name = "honey frame" desc = "A scaffold for bees to build honeycomb on." - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "honey_frame" var/honeycomb_capacity = 10 //10 Honeycomb per frame by default, researchable frames perhaps? diff --git a/code/modules/hydroponics/beekeeping/honeycomb.dm b/code/modules/hydroponics/beekeeping/honeycomb.dm index 34a28da32a3ea..41bf1aeb76e27 100644 --- a/code/modules/hydroponics/beekeeping/honeycomb.dm +++ b/code/modules/hydroponics/beekeeping/honeycomb.dm @@ -1,13 +1,13 @@ /obj/item/food/honeycomb name = "honeycomb" desc = "A hexagonal mesh of honeycomb." - icon = 'icons/obj/hydroponics/harvest.dmi' + icon = 'icons/obj/service/hydroponics/harvest.dmi' icon_state = "honeycomb" max_volume = 10 food_reagents = list(/datum/reagent/consumable/honey = 5) tastes = list("honey" = 1) preserved_food = TRUE - + starting_reagent_purity = 1 var/honey_color = "" /obj/item/food/honeycomb/Initialize(mapload) diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index e1970f3d02437..1f2951b33566e 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -2,7 +2,8 @@ #define MAX_ITEMS_PER_RATING 10 /// How many items are converted per cycle, per rating point of the manipulator used. #define PROCESSED_ITEMS_PER_RATING 5 - +/// Starting purity of reagents made in biogenerator +#define BIOGEN_REAGENT_PURITY 0.3 /obj/machinery/biogenerator name = "biogenerator" @@ -44,6 +45,8 @@ var/selected_cat /// The sound loop that can be heard when the generator is processing. var/datum/looping_sound/generator/soundloop + /// Whether the biogen is welded down to the floor disabling unwrenching + var/welded_down = FALSE /obj/machinery/biogenerator/Initialize(mapload) . = ..() @@ -51,6 +54,51 @@ GLOB.autounlock_techwebs[/datum/techweb/autounlocking/biogenerator] = new /datum/techweb/autounlocking/biogenerator stored_research = GLOB.autounlock_techwebs[/datum/techweb/autounlocking/biogenerator] soundloop = new(src, processing) + if(mapload) + welded_down = TRUE + +/obj/machinery/biogenerator/can_be_unfasten_wrench(mob/user, silent) + if(welded_down) + to_chat(user, span_warning("[src] is welded to the floor!")) + return FAILED_UNFASTEN + return ..() + +/obj/machinery/biogenerator/set_anchored(anchorvalue) + . = ..() + if(!anchored && welded_down) //make sure they're keep in sync in case it was forcibly unanchored by badmins or by a megafauna. + welded_down = FALSE + +/obj/machinery/biogenerator/welder_act(mob/living/user, obj/item/tool) + ..() + if(welded_down) + if(!tool.tool_start_check(user, amount=2)) + return TRUE + user.visible_message( + span_notice("[user.name] starts to cut the [name] free from the floor."), + span_notice("You start to cut [src] free from the floor..."), + span_hear("You hear welding."), + ) + if(!tool.use_tool(src, user, 10 SECONDS, volume=100)) + return FALSE + welded_down = FALSE + to_chat(user, span_notice("You cut [src] free from the floor.")) + return TRUE + if(!anchored) + to_chat(user, span_warning("[src] needs to be wrenched to the floor!")) + return TRUE + if(!tool.tool_start_check(user, amount=2)) + return TRUE + user.visible_message( + span_notice("[user.name] starts to weld the [name] to the floor."), + span_notice("You start to weld [src] to the floor..."), + span_hear("You hear welding."), + ) + if(!tool.use_tool(src, user, 10 SECONDS, volume=100)) + balloon_alert(user, "cancelled!") + return FALSE + welded_down = TRUE + to_chat(user, span_notice("You weld [src] to the floor.")) + return TRUE /obj/machinery/biogenerator/Destroy() QDEL_NULL(beaker) @@ -70,14 +118,12 @@ if(EXPLODE_LIGHT) SSexplosions.low_mov_atom += beaker -/obj/machinery/biogenerator/handle_atom_del(atom/deleting_atom) +/obj/machinery/biogenerator/Exited(atom/movable/gone, direction) . = ..() - - if(deleting_atom == beaker) + if(gone == beaker) beaker = null update_appearance() - /obj/machinery/biogenerator/RefreshParts() . = ..() @@ -112,6 +158,8 @@ . += span_notice(" - Matter consumption at [1 / efficiency * 100]%.") . += span_notice(" - Internal biomass converter capacity at [max_items] pieces of food, and currently holding [current_item_count].") + if(welded_down) + . += span_info("It's moored firmly to the floor. You can unsecure its moorings with a welder.") /obj/machinery/biogenerator/update_appearance() . = ..() @@ -147,6 +195,10 @@ . += mutable_appearance(icon, "[icon_state]_o_screen") . += emissive_appearance(icon, "[icon_state]_o_screen", src) +/obj/machinery/biogenerator/wrench_act(mob/living/user, obj/item/tool) + . = ..() + default_unfasten_wrench(user, tool) + return TOOL_ACT_TOOLTYPE_SUCCESS /obj/machinery/biogenerator/attackby(obj/item/attacking_item, mob/living/user, params) if(user.combat_mode) @@ -336,7 +388,7 @@ if(!use_biomass(design.materials, amount)) return FALSE - beaker.reagents.add_reagent(design.make_reagent, amount) + beaker.reagents.add_reagent(design.make_reagent, amount, added_purity = BIOGEN_REAGENT_PURITY) if(design.build_path) if(!use_biomass(design.materials, amount)) @@ -517,3 +569,4 @@ #undef MAX_ITEMS_PER_RATING #undef PROCESSED_ITEMS_PER_RATING +#undef BIOGEN_REAGENT_PURITY diff --git a/code/modules/hydroponics/bouquets.dm b/code/modules/hydroponics/bouquets.dm index 339477a6cf438..1c4328669c4bb 100644 --- a/code/modules/hydroponics/bouquets.dm +++ b/code/modules/hydroponics/bouquets.dm @@ -2,7 +2,7 @@ /obj/item/bouquet name = "mixed bouquet" desc = "A bouquet of sunflowers, lilies, and geraniums. How delightful." - icon = 'icons/obj/hydroponics/bouquet.dmi' + icon = 'icons/obj/service/hydroponics/bouquet.dmi' icon_state = "mixedbouquet" /obj/item/bouquet/sunflower diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm index d2df58c0095c2..d96bc1ec0099d 100644 --- a/code/modules/hydroponics/fermenting_barrel.dm +++ b/code/modules/hydroponics/fermenting_barrel.dm @@ -1,9 +1,11 @@ /obj/structure/fermenting_barrel name = "wooden barrel" desc = "A large wooden barrel. You can ferment fruits and such inside it, or just use it to hold reagents." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/structures.dmi' icon_state = "barrel" + base_icon_state = "barrel" resistance_flags = FLAMMABLE + obj_flags = UNIQUE_RENAME density = TRUE anchored = FALSE pressure_resistance = 2 * ONE_ATMOSPHERE @@ -80,6 +82,11 @@ icon_state = open ? "barrel_open" : "barrel" return ..() +/obj/structure/fermenting_barrel/update_overlays() + . = ..() + if(src.renamedByPlayer || HAS_TRAIT(src, TRAIT_HAS_LABEL)) + . += mutable_appearance(icon, "[base_icon_state]_overlay_label") + /// Adds the fruit to the barrel to queue the fermentation /obj/structure/fermenting_barrel/proc/insert_fruit(mob/user, obj/item/food/grown/fruit, obj/item/storage/bag/plants/bag = null) if(reagents.total_volume + potential_volume > reagents.maximum_volume) diff --git a/code/modules/hydroponics/grafts.dm b/code/modules/hydroponics/grafts.dm index c7ec67140037d..822169a8aefa1 100644 --- a/code/modules/hydroponics/grafts.dm +++ b/code/modules/hydroponics/grafts.dm @@ -5,7 +5,7 @@ name = "plant graft" desc = "A carefully cut graft off of a freshly grown plant. Can be grafted onto a plant in order to share unique plant traits onto a plant." w_class = WEIGHT_CLASS_TINY - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "graft_plant" worn_icon_state = "graft" attack_verb_continuous = list("plants", "vegitizes", "crops", "reaps", "farms") diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index b392dc67ba06e..098c6e81ce6a9 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -11,7 +11,7 @@ // Base type. Subtypes are found in /grown dir. Lavaland-based subtypes can be found in mining/ash_flora.dm /obj/item/food/grown - icon = 'icons/obj/hydroponics/harvest.dmi' + icon = 'icons/obj/service/hydroponics/harvest.dmi' icon_state = "berrypile" worn_icon = 'icons/mob/clothing/head/hydroponics.dmi' name = "fresh produce" // so recipe text doesn't say 'snack' @@ -38,11 +38,14 @@ var/wine_power = 10 /// Color of the grown object, for use in coloring greyscale splats. var/filling_color - /// If the grown food has an alternaitve icon state to use in places. + /// If the grown food has an alternative icon state to use in places. var/alt_icon /// Should we pixel offset ourselves at init? for mapping var/offset_at_init = TRUE +/obj/item/food/grown/New(loc, obj/item/seeds/new_seed) + return ..() + /obj/item/food/grown/Initialize(mapload, obj/item/seeds/new_seed) if(!tastes) tastes = list("[name]" = 1) //This happens first else the component already inits @@ -75,12 +78,10 @@ . = ..() //Only call it here because we want all the genes and shit to be applied before we add edibility. God this code is a mess. + reagents.clear_reagents() seed.prepare_result(src) transform *= TRANSFORM_USING_VARIABLE(seed.potency, 100) + 0.5 //Makes the resulting produce's sprite larger or smaller based on potency! - if(seed.get_gene(/datum/plant_gene/trait/brewing)) - ferment() - /obj/item/food/grown/Destroy() if(isatom(seed)) QDEL_NULL(seed) @@ -111,48 +112,49 @@ /// Turns the nutriments and vitamins into the distill reagent or fruit wine /obj/item/food/grown/proc/ferment() + var/reagent_purity = seed.get_reagent_purity() + var/purity_above_base = clamp((reagent_purity - 0.5) * 2, 0, 1) + var/quality_min = 0 + var/quality_max = DRINK_FANTASTIC + var/quality = round(LERP(quality_min, quality_max, purity_above_base)) for(var/datum/reagent/reagent in reagents.reagent_list) - if(reagent.type != /datum/reagent/consumable/nutriment && reagent.type != /datum/reagent/consumable/nutriment/vitamin) + if(!istype(reagent, /datum/reagent/consumable)) continue - var/purity = clamp(seed.lifespan/200 + seed.endurance/200, 0, 1) - var/quality_min = 0 - var/quality_max = DRINK_FANTASTIC - var/quality = round(LERP(quality_min, quality_max, purity)) if(distill_reagent) var/data = list() var/datum/reagent/consumable/ethanol/booze = distill_reagent data["quality"] = quality - data["boozepwr"] = round(initial(booze.boozepwr) * purity) - reagents.add_reagent(distill_reagent, reagent.volume, data, added_purity = purity) + data["boozepwr"] = round(initial(booze.boozepwr) * reagent_purity * 2) // default boozepwr at 50% purity + reagents.add_reagent(distill_reagent, reagent.volume, data, added_purity = reagent_purity) else var/data = list() data["names"] = list("[initial(name)]" = 1) - data["color"] = filling_color - data["boozepwr"] = round(wine_power * purity) + data["color"] = filling_color || reagent.color // filling_color is not guaranteed to be set for every plant. try to use it if we have it, otherwise use the reagent's color var + data["boozepwr"] = round(wine_power * reagent_purity * 2) // default boozepwr at 50% purity data["quality"] = quality if(wine_flavor) data["tastes"] = list(wine_flavor = 1) else data["tastes"] = list(tastes[1] = 1) - reagents.add_reagent(/datum/reagent/consumable/ethanol/fruit_wine, reagent.volume, data, added_purity = purity) + reagents.add_reagent(/datum/reagent/consumable/ethanol/fruit_wine, reagent.volume, data, added_purity = reagent_purity) reagents.del_reagent(reagent.type) -/obj/item/food/grown/on_grind() - . = ..() - var/nutriment = reagents.get_reagent_amount(/datum/reagent/consumable/nutriment) - if(grind_results?.len) - for(var/i in 1 to grind_results.len) - grind_results[grind_results[i]] = nutriment - reagents.del_reagent(/datum/reagent/consumable/nutriment) - reagents.del_reagent(/datum/reagent/consumable/nutriment/vitamin) - -/obj/item/food/grown/on_juice() - var/nutriment = reagents.get_reagent_amount(/datum/reagent/consumable/nutriment) - if(juice_results?.len) - for(var/i in 1 to juice_results.len) - juice_results[juice_results[i]] = nutriment - reagents.del_reagent(/datum/reagent/consumable/nutriment) - reagents.del_reagent(/datum/reagent/consumable/nutriment/vitamin) +/obj/item/food/grown/grind(datum/reagents/target_holder, mob/user) + if(on_grind() == -1) + return FALSE + + var/grind_results_num = LAZYLEN(grind_results) + if(grind_results_num) + var/average_purity = reagents.get_average_purity() + var/total_nutriment_amount = reagents.get_reagent_amount(/datum/reagent/consumable/nutriment, include_subtypes = TRUE) + var/single_reagent_amount = grind_results_num > 1 ? round(total_nutriment_amount / grind_results_num, CHEMICAL_QUANTISATION_LEVEL) : total_nutriment_amount + reagents.remove_all_type(/datum/reagent/consumable/nutriment, total_nutriment_amount) + for(var/reagent in grind_results) + reagents.add_reagent(reagent, single_reagent_amount, added_purity = average_purity) + + if(reagents && target_holder) + reagents.trans_to(target_holder, reagents.total_volume, transferred_by = user) + return TRUE #undef BITE_SIZE_POTENCY_MULTIPLIER #undef BITE_SIZE_VOLUME_MULTIPLIER diff --git a/code/modules/hydroponics/grown/aloe.dm b/code/modules/hydroponics/grown/aloe.dm index ab6d5cf0863f4..cfbefce6dba21 100644 --- a/code/modules/hydroponics/grown/aloe.dm +++ b/code/modules/hydroponics/grown/aloe.dm @@ -13,7 +13,7 @@ production = 4 yield = 6 growthstages = 5 - growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi' reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.05, /datum/reagent/consumable/nutriment = 0.05) /obj/item/food/grown/aloe @@ -23,7 +23,7 @@ icon_state = "aloe" bite_consumption_mod = 3 foodtypes = VEGETABLES - juice_results = list(/datum/reagent/consumable/aloejuice = 0) + juice_typepath = /datum/reagent/consumable/aloejuice distill_reagent = /datum/reagent/consumable/ethanol/tequila /obj/item/food/grown/aloe/make_bakeable() diff --git a/code/modules/hydroponics/grown/apple.dm b/code/modules/hydroponics/grown/apple.dm index 4bbd694222c37..b994749c2f812 100644 --- a/code/modules/hydroponics/grown/apple.dm +++ b/code/modules/hydroponics/grown/apple.dm @@ -9,7 +9,7 @@ lifespan = 55 endurance = 35 yield = 5 - growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi' icon_grow = "apple-grow" icon_dead = "apple-dead" genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/one_bite) @@ -22,7 +22,7 @@ desc = "It's a little piece of Eden." icon_state = "apple" foodtypes = FRUIT - juice_results = list(/datum/reagent/consumable/applejuice = 0) + juice_typepath = /datum/reagent/consumable/applejuice tastes = list("apple" = 1) distill_reagent = /datum/reagent/consumable/ethanol/hcider diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm index 2ddd4fd06076a..64979b048cbbf 100644 --- a/code/modules/hydroponics/grown/banana.dm +++ b/code/modules/hydroponics/grown/banana.dm @@ -9,7 +9,7 @@ lifespan = 50 endurance = 30 instability = 10 - growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi' icon_dead = "banana-dead" genes = list(/datum/plant_gene/trait/slip, /datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/banana/mime, /obj/item/seeds/banana/bluespace) @@ -25,7 +25,7 @@ trash_type = /obj/item/grown/bananapeel bite_consumption_mod = 3 foodtypes = FRUIT - juice_results = list(/datum/reagent/consumable/banana = 0) + juice_typepath = /datum/reagent/consumable/banana distill_reagent = /datum/reagent/consumable/ethanol/bananahonk /obj/item/food/grown/banana/make_edible() @@ -39,7 +39,7 @@ desc += " The curve on this one looks particularly acute." ///Clowns will always like bananas. -/obj/item/food/grown/banana/proc/check_liked(fraction, mob/living/carbon/human/consumer) +/obj/item/food/grown/banana/proc/check_liked(mob/living/carbon/human/consumer) var/obj/item/organ/internal/liver/liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER) if (!HAS_TRAIT(consumer, TRAIT_AGEUSIA) && liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) return FOOD_LIKED @@ -49,7 +49,6 @@ 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) /obj/item/food/grown/banana/suicide_act(mob/living/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!")) @@ -170,6 +169,7 @@ /obj/item/food/grown/banana/bunch/Initialize(mapload, obj/item/seeds/new_seed) . = ..() + reagents.clear_reagents() reagents.add_reagent(/datum/reagent/consumable/monkey_energy, 10) reagents.add_reagent(/datum/reagent/consumable/banana, 10) diff --git a/code/modules/hydroponics/grown/beans.dm b/code/modules/hydroponics/grown/beans.dm index 7a8727da00b93..8643c616b4757 100644 --- a/code/modules/hydroponics/grown/beans.dm +++ b/code/modules/hydroponics/grown/beans.dm @@ -10,12 +10,12 @@ production = 4 potency = 15 growthstages = 4 - growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi' icon_grow = "soybean-grow" icon_dead = "soybean-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/soya/koi) - reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05, /datum/reagent/consumable/cooking_oil = 0.03) //Vegetable oil! + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05, /datum/reagent/consumable/nutriment/fat/oil = 0.03) //Vegetable oil! /obj/item/food/grown/soybeans seed = /obj/item/seeds/soya @@ -64,7 +64,7 @@ potency = 10 growthstages = 4 icon_dead = "bean-dead" - growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi' genes = list(/datum/plant_gene/trait/never_mutate, /datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/greenbean/jump) reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/medicine/c2/multiver = 0.04) //They're good for you! diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm index 57b155f987f17..45b0db82ea327 100644 --- a/code/modules/hydroponics/grown/berries.dm +++ b/code/modules/hydroponics/grown/berries.dm @@ -11,7 +11,7 @@ production = 5 yield = 2 instability = 30 - growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi' icon_grow = "berry-grow" // Uses one growth icons set for all the subtypes icon_dead = "berry-dead" // Same for the dead icon genes = list(/datum/plant_gene/trait/repeated_harvest) @@ -25,7 +25,7 @@ icon_state = "berrypile" gender = PLURAL foodtypes = FRUIT - juice_results = list(/datum/reagent/consumable/berryjuice = 0) + juice_typepath = /datum/reagent/consumable/berryjuice tastes = list("berry" = 1) distill_reagent = /datum/reagent/consumable/ethanol/gin @@ -48,7 +48,7 @@ icon_state = "poisonberrypile" bite_consumption_mod = 3 foodtypes = FRUIT | TOXIC - juice_results = list(/datum/reagent/consumable/poisonberryjuice = 0) + juice_typepath = /datum/reagent/consumable/poisonberryjuice tastes = list("poison-berry" = 1) distill_reagent = null wine_power = 35 @@ -74,7 +74,7 @@ icon_state = "deathberrypile" bite_consumption_mod = 3 foodtypes = FRUIT | TOXIC - juice_results = list(/datum/reagent/consumable/poisonberryjuice = 0) + juice_typepath = /datum/reagent/consumable/poisonberryjuice tastes = list("death-berry" = 1) distill_reagent = null wine_power = 50 @@ -120,7 +120,7 @@ production = 5 yield = 4 growthstages = 2 - growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi' icon_grow = "grape-grow" icon_dead = "grape-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) @@ -134,7 +134,7 @@ icon_state = "grapes" bite_consumption_mod = 2 foodtypes = FRUIT - juice_results = list(/datum/reagent/consumable/grapejuice = 0) + juice_typepath = /datum/reagent/consumable/grapejuice tastes = list("grape" = 1) distill_reagent = /datum/reagent/consumable/ethanol/wine @@ -173,7 +173,7 @@ production = 5 yield = 2 instability = 30 - growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi' icon_grow = "toechtauese-grow" icon_dead = "toechtauese-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) @@ -185,6 +185,6 @@ desc = "A branch with töchtaüse berries on it. They're a favourite on the Mothic Fleet, but not in this form." icon_state = "toechtauese_branch" foodtypes = FRUIT - juice_results = list(/datum/reagent/consumable/toechtauese_juice = 0) + juice_typepath = /datum/reagent/consumable/toechtauese_juice tastes = list("fiery itchy pain" = 1) distill_reagent = /datum/reagent/toxin/itching_powder diff --git a/code/modules/hydroponics/grown/cannabis.dm b/code/modules/hydroponics/grown/cannabis.dm index 680d6936ddf3a..c336f0f4b2456 100644 --- a/code/modules/hydroponics/grown/cannabis.dm +++ b/code/modules/hydroponics/grown/cannabis.dm @@ -11,7 +11,7 @@ potency = 20 growthstages = 1 instability = 40 - growing_icon = 'icons/obj/hydroponics/growing.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing.dmi' icon_grow = "cannabis-grow" // Uses one growth icons set for all the subtypes icon_dead = "cannabis-dead" // Same for the dead icon genes = list(/datum/plant_gene/trait/repeated_harvest) @@ -91,7 +91,7 @@ /obj/item/food/grown/cannabis seed = /obj/item/seeds/cannabis - icon = 'icons/obj/hydroponics/harvest.dmi' + icon = 'icons/obj/service/hydroponics/harvest.dmi' name = "cannabis leaf" desc = "Recently legalized in most galaxies." icon_state = "cannabis" diff --git a/code/modules/hydroponics/grown/cereals.dm b/code/modules/hydroponics/grown/cereals.dm index 1dd3ca3fc7b44..92ef29cc19559 100644 --- a/code/modules/hydroponics/grown/cereals.dm +++ b/code/modules/hydroponics/grown/cereals.dm @@ -12,7 +12,7 @@ instability = 20 icon_dead = "wheat-dead" mutatelist = list(/obj/item/seeds/wheat/oat, /obj/item/seeds/wheat/meat) - reagents_add = list(/datum/reagent/consumable/nutriment = 0.04) + reagents_add = list(/datum/reagent/consumable/nutriment = 0.12) /obj/item/food/grown/wheat seed = /obj/item/seeds/wheat @@ -97,7 +97,8 @@ /obj/item/food/grown/meatwheat/attack_self(mob/living/user) user.visible_message(span_notice("[user] crushes [src] into meat."), span_notice("You crush [src] into something that resembles meat.")) playsound(user, 'sound/effects/blobattack.ogg', 50, TRUE) - var/obj/item/food/meat/slab/meatwheat/M = new + var/reagent_purity = seed.get_reagent_purity() + var/obj/item/food/meat/slab/meatwheat/M = new(null, reagent_purity) qdel(src) user.put_in_hands(M) return 1 diff --git a/code/modules/hydroponics/grown/cherries.dm b/code/modules/hydroponics/grown/cherries.dm index a73a2ed19a0e2..4ebd42489d96f 100644 --- a/code/modules/hydroponics/grown/cherries.dm +++ b/code/modules/hydroponics/grown/cherries.dm @@ -12,7 +12,7 @@ production = 5 growthstages = 5 instability = 15 - growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi' icon_grow = "cherry-grow" icon_dead = "cherry-dead" icon_harvest = "cherry-harvest" diff --git a/code/modules/hydroponics/grown/chili.dm b/code/modules/hydroponics/grown/chili.dm index 64e10e0147747..ee5c87a40c359 100644 --- a/code/modules/hydroponics/grown/chili.dm +++ b/code/modules/hydroponics/grown/chili.dm @@ -12,7 +12,7 @@ yield = 4 potency = 20 instability = 30 - growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi' icon_grow = "chili-grow" // Uses one growth icons set for all the subtypes icon_dead = "chili-dead" // Same for the dead icon genes = list(/datum/plant_gene/trait/repeated_harvest) diff --git a/code/modules/hydroponics/grown/citrus.dm b/code/modules/hydroponics/grown/citrus.dm index 0389f18f3cc63..c624722f82392 100644 --- a/code/modules/hydroponics/grown/citrus.dm +++ b/code/modules/hydroponics/grown/citrus.dm @@ -19,7 +19,7 @@ endurance = 50 yield = 4 potency = 15 - growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi' genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/orange) reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05) @@ -29,7 +29,7 @@ name = "lime" desc = "It's so sour, your face will twist." icon_state = "lime" - juice_results = list(/datum/reagent/consumable/limejuice = 0) + juice_typepath = /datum/reagent/consumable/limejuice // Orange /obj/item/seeds/orange @@ -43,7 +43,7 @@ endurance = 50 yield = 5 potency = 20 - growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi' icon_grow = "lime-grow" icon_dead = "lime-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) @@ -56,7 +56,7 @@ desc = "It's a tangy fruit." icon_state = "orange" foodtypes = ORANGES - juice_results = list(/datum/reagent/consumable/orangejuice = 0) + juice_typepath = /datum/reagent/consumable/orangejuice distill_reagent = /datum/reagent/consumable/ethanol/triple_sec // Lemon @@ -70,7 +70,7 @@ lifespan = 55 endurance = 45 yield = 4 - growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi' icon_grow = "lime-grow" icon_dead = "lime-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) @@ -82,7 +82,7 @@ name = "lemon" desc = "When life gives you lemons, make lemonade." icon_state = "lemon" - juice_results = list(/datum/reagent/consumable/lemonjuice = 0) + juice_typepath = /datum/reagent/consumable/lemonjuice // Combustible lemon /obj/item/seeds/firelemon //combustible lemon is too long so firelemon @@ -92,7 +92,7 @@ species = "firelemon" plantname = "Combustible Lemon Tree" product = /obj/item/food/grown/firelemon - growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi' icon_grow = "lime-grow" icon_dead = "lime-dead" genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/bomb_plant/potency_based) @@ -123,7 +123,7 @@ yield = 5 potency = 20 instability = 64 - growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi' icon_grow = "lime-grow" icon_dead = "lime-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) @@ -137,7 +137,7 @@ foodtypes = ORANGES alt_icon = "orange" bite_consumption_mod = 2 - juice_results = list(/datum/reagent/consumable/orangejuice = 0) + juice_typepath = /datum/reagent/consumable/orangejuice distill_reagent = /datum/reagent/toxin/mindbreaker tastes = list("polygons" = 1, "bluespace" = 1, "the true nature of reality" = 1) diff --git a/code/modules/hydroponics/grown/cocoa_vanilla.dm b/code/modules/hydroponics/grown/cocoa_vanilla.dm index dd64288bfb429..4e9a9810b4280 100644 --- a/code/modules/hydroponics/grown/cocoa_vanilla.dm +++ b/code/modules/hydroponics/grown/cocoa_vanilla.dm @@ -12,7 +12,7 @@ yield = 2 instability = 20 growthstages = 5 - growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi' icon_grow = "cocoapod-grow" icon_dead = "cocoapod-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) @@ -67,7 +67,7 @@ mutatelist = null reagents_add = list(/datum/reagent/consumable/enzyme = 0.1, /datum/reagent/consumable/nutriment = 0.1) growthstages = 4 - growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi' icon_grow = "bungotree-grow" icon_dead = "bungotree-dead" rarity = 15 @@ -80,7 +80,7 @@ bite_consumption_mod = 2 trash_type = /obj/item/food/grown/bungopit foodtypes = FRUIT - juice_results = list(/datum/reagent/consumable/bungojuice = 0) + juice_typepath = /datum/reagent/consumable/bungojuice tastes = list("bungo" = 2, "tropical fruitiness" = 1) distill_reagent = null diff --git a/code/modules/hydroponics/grown/corn.dm b/code/modules/hydroponics/grown/corn.dm index 012fa587ee68d..a606cf62017cc 100644 --- a/code/modules/hydroponics/grown/corn.dm +++ b/code/modules/hydroponics/grown/corn.dm @@ -10,11 +10,11 @@ potency = 20 instability = 50 //Corn used to be wheatgrass, before being cultivated for generations. growthstages = 3 - growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi' icon_grow = "corn-grow" // Uses one growth icons set for all the subtypes icon_dead = "corn-dead" // Same for the dead icon mutatelist = list(/obj/item/seeds/corn/snapcorn) - reagents_add = list(/datum/reagent/consumable/cornoil = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) + reagents_add = list(/datum/reagent/consumable/nutriment/fat/oil = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) /obj/item/food/grown/corn seed = /obj/item/seeds/corn @@ -25,7 +25,7 @@ bite_consumption_mod = 2 foodtypes = VEGETABLES grind_results = list(/datum/reagent/consumable/cornmeal = 0) - juice_results = list(/datum/reagent/consumable/corn_starch = 0) + juice_typepath = /datum/reagent/consumable/corn_starch tastes = list("corn" = 1) distill_reagent = /datum/reagent/consumable/ethanol/whiskey @@ -36,6 +36,7 @@ AddElement(/datum/element/microwavable, /obj/item/food/popcorn) /obj/item/grown/corncob + seed = /obj/item/seeds/corn name = "corn cob" desc = "A reminder of meals gone by." icon_state = "corncob" @@ -89,5 +90,10 @@ user.put_in_hands(S) snap_pops -= 1 if(!snap_pops) - new /obj/item/grown/corncob(user.loc) + new /obj/item/grown/corncob/snap(user.loc) qdel(src) + +/obj/item/grown/corncob/snap + seed = /obj/item/seeds/corn/snapcorn + name = "snap corn cob" + desc = "A reminder of pranks gone by." diff --git a/code/modules/hydroponics/grown/cotton.dm b/code/modules/hydroponics/grown/cotton.dm index 394b7646b8213..9636edff66b3e 100644 --- a/code/modules/hydroponics/grown/cotton.dm +++ b/code/modules/hydroponics/grown/cotton.dm @@ -14,7 +14,7 @@ potency = 50 instability = 15 growthstages = 3 - growing_icon = 'icons/obj/hydroponics/growing.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing.dmi' icon_dead = "cotton-dead" mutatelist = list(/obj/item/seeds/cotton/durathread) @@ -71,7 +71,7 @@ yield = 2 potency = 50 growthstages = 3 - growing_icon = 'icons/obj/hydroponics/growing.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing.dmi' icon_dead = "cotton-dead" mutatelist = null diff --git a/code/modules/hydroponics/grown/cucumber.dm b/code/modules/hydroponics/grown/cucumber.dm index a6583492c61df..f3712c6a5c90a 100644 --- a/code/modules/hydroponics/grown/cucumber.dm +++ b/code/modules/hydroponics/grown/cucumber.dm @@ -10,7 +10,7 @@ production = 1 yield = 5 instability = 15 - growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi' icon_grow = "cucumber-grow" icon_dead = "cucumber-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) @@ -22,5 +22,5 @@ desc = "Oblong and green, with pimples, the standard of salads." icon_state = "cucumber" foodtypes = VEGETABLES - juice_results = list(/datum/reagent/consumable/cucumberjuice = 0) + juice_typepath = /datum/reagent/consumable/cucumberjuice tastes = list("cucumber" = 1) diff --git a/code/modules/hydroponics/grown/eggplant.dm b/code/modules/hydroponics/grown/eggplant.dm index 4fda8003f3704..d4b38c3438bdb 100644 --- a/code/modules/hydroponics/grown/eggplant.dm +++ b/code/modules/hydroponics/grown/eggplant.dm @@ -8,7 +8,7 @@ product = /obj/item/food/grown/eggplant yield = 2 potency = 20 - growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi' icon_grow = "eggplant-grow" icon_dead = "eggplant-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm index 92128482c4d52..333c7f57c4584 100644 --- a/code/modules/hydroponics/grown/flowers.dm +++ b/code/modules/hydroponics/grown/flowers.dm @@ -12,7 +12,7 @@ potency = 20 instability = 1 //Flowers have 1 instability, if you want to breed out instability, crossbreed with flowers. growthstages = 3 - growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_flowers.dmi' icon_grow = "poppy-grow" icon_dead = "poppy-dead" genes = list(/datum/plant_gene/trait/preserved) @@ -23,15 +23,12 @@ seed = /obj/item/seeds/poppy name = "poppy" desc = "Long-used as a symbol of rest, peace, and death." - icon_state = "map_flower" + icon_state = "poppy" slot_flags = ITEM_SLOT_HEAD alternate_worn_layer = ABOVE_BODY_FRONT_HEAD_LAYER bite_consumption_mod = 2 foodtypes = VEGETABLES | GROSS distill_reagent = /datum/reagent/consumable/ethanol/vermouth - greyscale_config = /datum/greyscale_config/flower_simple - greyscale_config_worn = /datum/greyscale_config/flower_simple_worn - greyscale_colors = "#d23838" // Lily /obj/item/seeds/poppy/lily @@ -41,13 +38,17 @@ species = "lily" plantname = "Lily Plants" product = /obj/item/food/grown/poppy/lily + growthstages = 3 + growing_icon = 'icons/obj/service/hydroponics/growing_flowers.dmi' + icon_grow = "lily-grow" + icon_dead = "lily-dead" mutatelist = list(/obj/item/seeds/poppy/lily/trumpet) /obj/item/food/grown/poppy/lily seed = /obj/item/seeds/poppy/lily name = "lily" - desc = "A beautiful orange flower." - greyscale_colors = "#fe881f" + desc = "A beautiful white flower." + icon_state = "lily" //Spacemans's Trumpet /obj/item/seeds/poppy/lily/trumpet @@ -66,7 +67,7 @@ growthstages = 4 weed_rate = 2 weed_chance = 10 - growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_flowers.dmi' icon_grow = "spacemanstrumpet-grow" icon_dead = "spacemanstrumpet-dead" mutatelist = null @@ -91,13 +92,17 @@ species = "geranium" plantname = "Geranium Plants" product = /obj/item/food/grown/poppy/geranium + growthstages = 3 + growing_icon = 'icons/obj/service/hydroponics/growing_flowers.dmi' + icon_grow = "geranium-grow" + icon_dead = "geranium-dead" mutatelist = list(/obj/item/seeds/poppy/geranium/fraxinella) /obj/item/food/grown/poppy/geranium seed = /obj/item/seeds/poppy/geranium name = "geranium" desc = "A beautiful blue flower." - greyscale_colors = "#1499bb" + icon_state = "geranium" ///Fraxinella seeds. /obj/item/seeds/poppy/geranium/fraxinella @@ -141,7 +146,7 @@ instability = 1 growthstages = 4 genes = list(/datum/plant_gene/trait/plant_type/weed_hardy, /datum/plant_gene/trait/preserved) - growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_flowers.dmi' reagents_add = list(/datum/reagent/consumable/nutriment = 0.04) graft_gene = /datum/plant_gene/trait/plant_type/weed_hardy @@ -169,11 +174,11 @@ yield = 2 instability = 1 growthstages = 3 - growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_flowers.dmi' icon_grow = "sunflower-grow" icon_dead = "sunflower-dead" mutatelist = list(/obj/item/seeds/sunflower/moonflower, /obj/item/seeds/sunflower/novaflower) - reagents_add = list(/datum/reagent/consumable/cornoil = 0.08, /datum/reagent/consumable/nutriment = 0.04) + reagents_add = list(/datum/reagent/consumable/nutriment/fat/oil = 0.08, /datum/reagent/consumable/nutriment = 0.04) /obj/item/food/grown/sunflower // FLOWER POWER! seed = /obj/item/seeds/sunflower @@ -273,7 +278,7 @@ instability = 20 //Roses crossbreed easily, and there's many many species of them. growthstages = 3 genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/backfire/rose_thorns, /datum/plant_gene/trait/preserved) - growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_flowers.dmi' icon_grow = "rose-grow" icon_dead = "rose-dead" mutatelist = list(/obj/item/seeds/carbon_rose) @@ -318,7 +323,7 @@ instability = 3 growthstages = 3 genes = list(/datum/plant_gene/reagent/preset/carbon, /datum/plant_gene/trait/preserved) - growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_flowers.dmi' icon_grow = "carbonrose-grow" icon_dead = "carbonrose-dead" reagents_add = list(/datum/reagent/plastic_polymers = 0.05) diff --git a/code/modules/hydroponics/grown/garlic.dm b/code/modules/hydroponics/grown/garlic.dm index ea228e09b9d6f..e37d49fa93032 100644 --- a/code/modules/hydroponics/grown/garlic.dm +++ b/code/modules/hydroponics/grown/garlic.dm @@ -8,7 +8,7 @@ yield = 6 potency = 25 growthstages = 3 - growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi' reagents_add = list(/datum/reagent/consumable/garlic = 0.15, /datum/reagent/consumable/nutriment = 0.1) /obj/item/food/grown/garlic diff --git a/code/modules/hydroponics/grown/gatfruit.dm b/code/modules/hydroponics/grown/gatfruit.dm index 080268f27fc89..f64b6eb3bd481 100644 --- a/code/modules/hydroponics/grown/gatfruit.dm +++ b/code/modules/hydroponics/grown/gatfruit.dm @@ -16,7 +16,7 @@ potency = 60 growthstages = 2 rarity = 60 // Obtainable only with xenobio+superluck. - growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi' reagents_add = list(/datum/reagent/sulfur = 0.1, /datum/reagent/carbon = 0.1, /datum/reagent/nitrogen = 0.07, /datum/reagent/potassium = 0.05) /obj/item/food/grown/shell/gatfruit diff --git a/code/modules/hydroponics/grown/herbs.dm b/code/modules/hydroponics/grown/herbs.dm index 5416de9becf1f..b22be06ec6aca 100644 --- a/code/modules/hydroponics/grown/herbs.dm +++ b/code/modules/hydroponics/grown/herbs.dm @@ -9,7 +9,7 @@ growthstages = 2 yield = 5 potency = 20 - growing_icon = 'icons/obj/hydroponics/growing.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing.dmi' icon_grow = "herbs-grow" icon_dead = "herbs-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) @@ -22,6 +22,6 @@ icon_state = "herbs" foodtypes = VEGETABLES grind_results = list(/datum/reagent/consumable/nutriment = 0) - juice_results = list(/datum/reagent/consumable/nutriment = 0) + juice_typepath = /datum/reagent/consumable/nutriment tastes = list("nondescript herbs" = 1) distill_reagent = /datum/reagent/consumable/ethanol/fernet diff --git a/code/modules/hydroponics/grown/korta_nut.dm b/code/modules/hydroponics/grown/korta_nut.dm index c0d715c6cda58..bf6ab82d47410 100644 --- a/code/modules/hydroponics/grown/korta_nut.dm +++ b/code/modules/hydroponics/grown/korta_nut.dm @@ -9,7 +9,7 @@ lifespan = 55 endurance = 35 yield = 5 - growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi' icon_grow = "kortanut-grow" icon_dead = "kortanut-dead" genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/one_bite) @@ -23,7 +23,7 @@ icon_state = "korta_nut" foodtypes = NUTS grind_results = list(/datum/reagent/consumable/korta_flour = 0) - juice_results = list(/datum/reagent/consumable/korta_milk = 0) + juice_typepath = /datum/reagent/consumable/korta_milk tastes = list("peppery heat" = 1) distill_reagent = /datum/reagent/consumable/ethanol/kortara @@ -47,6 +47,6 @@ desc = "A sweet treat lizards love to eat." icon_state = "korta_nut" grind_results = list(/datum/reagent/consumable/korta_flour = 0) - juice_results = list(/datum/reagent/consumable/korta_milk = 0, /datum/reagent/consumable/korta_nectar = 0) + juice_typepath = /datum/reagent/consumable/korta_nectar tastes = list("peppery sweet" = 1) distill_reagent = /datum/reagent/consumable/ethanol/kortara diff --git a/code/modules/hydroponics/grown/kronkus.dm b/code/modules/hydroponics/grown/kronkus.dm index ebf3849bcf135..e0b6e6b66aad3 100644 --- a/code/modules/hydroponics/grown/kronkus.dm +++ b/code/modules/hydroponics/grown/kronkus.dm @@ -13,7 +13,7 @@ production = 4 yield = 3 growthstages = 3 - growing_icon = 'icons/obj/hydroponics/growing.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing.dmi' reagents_add = list(/datum/reagent/consumable/nutriment = 0.05) /obj/item/food/grown/kronkus diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm index 1c3ffc1b4d1ac..f69f8a68317cb 100644 --- a/code/modules/hydroponics/grown/melon.dm +++ b/code/modules/hydroponics/grown/melon.dm @@ -9,7 +9,7 @@ lifespan = 50 endurance = 40 instability = 20 - growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi' icon_dead = "watermelon-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/watermelon/holy, /obj/item/seeds/watermelon/barrel) @@ -17,7 +17,7 @@ /obj/item/seeds/watermelon/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is swallowing [src]! It looks like [user.p_theyre()] trying to commit suicide!")) - user.gib() + user.gib(DROP_ALL_REMAINS) new product(drop_location()) qdel(src) return MANUAL_SUICIDE @@ -30,7 +30,7 @@ bite_consumption_mod = 2 w_class = WEIGHT_CLASS_NORMAL foodtypes = FRUIT - juice_results = list(/datum/reagent/consumable/watermelonjuice = 0) + juice_typepath = /datum/reagent/consumable/watermelonjuice wine_power = 40 /obj/item/food/grown/watermelon/make_processable() @@ -58,10 +58,11 @@ name = "holymelon" desc = "The water within this melon has been blessed by some deity that's particularly fond of watermelon." icon_state = "holymelon" + inhand_icon_state = "holymelon" bite_consumption_mod = 2 w_class = WEIGHT_CLASS_NORMAL foodtypes = FRUIT - juice_results = list(/datum/reagent/water/holywater = 0) + juice_typepath = /datum/reagent/water/holywater wine_power = 70 //Water to wine, baby. wine_flavor = "divinity" @@ -77,7 +78,7 @@ * Checks whether or not the person eating the holymelon * is a holy_role (chaplain), as chaplains love holymelons. */ -/obj/item/food/grown/holymelon/proc/check_holyness(fraction, mob/mob_eating) +/obj/item/food/grown/holymelon/proc/check_holyness(mob/mob_eating) if(!ishuman(mob_eating)) return var/mob/living/carbon/human/holy_person = mob_eating diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm index 3e5b7c624bf98..074f9d5f8d2fb 100644 --- a/code/modules/hydroponics/grown/mushrooms.dm +++ b/code/modules/hydroponics/grown/mushrooms.dm @@ -26,7 +26,7 @@ instability = 30 growthstages = 4 genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) - growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' + growing_icon = 'icons/obj/service/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) graft_gene = /datum/plant_gene/trait/plant_type/fungal_metabolism @@ -52,7 +52,7 @@ instability = 30 growthstages = 3 genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) - growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_mushrooms.dmi' mutatelist = list(/obj/item/seeds/angel) reagents_add = list(/datum/reagent/drug/mushroomhallucinogen = 0.04, /datum/reagent/toxin/amatoxin = 0.35, /datum/reagent/consumable/nutriment = 0, /datum/reagent/growthserum = 0.1) graft_gene = /datum/plant_gene/trait/plant_type/fungal_metabolism @@ -79,7 +79,7 @@ potency = 35 growthstages = 3 genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) - growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_mushrooms.dmi' reagents_add = list(/datum/reagent/drug/mushroomhallucinogen = 0.04, /datum/reagent/toxin/amatoxin = 0.1, /datum/reagent/consumable/nutriment = 0, /datum/reagent/toxin/amanitin = 0.2) rarity = 30 graft_gene = /datum/plant_gene/trait/plant_type/fungal_metabolism @@ -106,7 +106,7 @@ instability = 10 growthstages = 3 genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) - growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_mushrooms.dmi' reagents_add = list(/datum/reagent/drug/mushroomhallucinogen = 0.25, /datum/reagent/consumable/nutriment = 0.02) graft_gene = /datum/plant_gene/trait/plant_type/fungal_metabolism @@ -131,7 +131,7 @@ potency = 15 growthstages = 3 genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) - growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_mushrooms.dmi' mutatelist = list(/obj/item/seeds/plump/walkingmushroom) reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) graft_gene = /datum/plant_gene/trait/plant_type/fungal_metabolism @@ -156,7 +156,7 @@ maturation = 5 yield = 1 genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/trait/mob_transformation/shroom) - growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_mushrooms.dmi' mutatelist = null reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.05, /datum/reagent/consumable/nutriment = 0.15) rarity = 30 @@ -186,7 +186,7 @@ instability = 20 growthstages = 3 genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) - growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_mushrooms.dmi' reagents_add = list(/datum/reagent/consumable/nutriment = 0.1) mutatelist = list(/obj/item/seeds/chanter/jupitercup) graft_gene = /datum/plant_gene/trait/plant_type/fungal_metabolism @@ -211,7 +211,7 @@ yield = 4 growthstages = 2 genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/reagent/preset/liquidelectricity, /datum/plant_gene/trait/carnivory/jupitercup) - growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_mushrooms.dmi' reagents_add = list(/datum/reagent/consumable/nutriment = 0.1) mutatelist = null graft_gene = /datum/plant_gene/trait/carnivory @@ -240,7 +240,7 @@ growthstages = 4 rarity = 20 genes = list(/datum/plant_gene/trait/glow, /datum/plant_gene/trait/plant_type/fungal_metabolism) - growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_mushrooms.dmi' mutatelist = list(/obj/item/seeds/glowshroom/glowcap, /obj/item/seeds/glowshroom/shadowshroom) reagents_add = list(/datum/reagent/uranium/radium = 0.1, /datum/reagent/phosphorus = 0.1, /datum/reagent/consumable/nutriment = 0.04) graft_gene = /datum/plant_gene/trait/glow @@ -336,7 +336,7 @@ desc = "These spores reek! Disgusting." icon_state = "seed-odiouspuffball" species = "odiouspuffball" - growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_mushrooms.dmi' icon_grow = "odiouspuffball-grow" icon_dead = "odiouspuffball-dead" icon_harvest = "odiouspuffball-harvest" diff --git a/code/modules/hydroponics/grown/olive.dm b/code/modules/hydroponics/grown/olive.dm index 8f93a9695ecfb..38102cacb24ea 100644 --- a/code/modules/hydroponics/grown/olive.dm +++ b/code/modules/hydroponics/grown/olive.dm @@ -10,7 +10,7 @@ endurance = 35 yield = 5 maturation = 10 - growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi' icon_grow = "olive-grow" icon_dead = "olive-dead" genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/one_bite) @@ -24,4 +24,4 @@ foodtypes = FRUIT grind_results = list(/datum/reagent/consumable/olivepaste = 0) tastes = list("olive" = 1) - + diff --git a/code/modules/hydroponics/grown/onion.dm b/code/modules/hydroponics/grown/onion.dm index 217fe0a6d56e4..8f948407a37b8 100644 --- a/code/modules/hydroponics/grown/onion.dm +++ b/code/modules/hydroponics/grown/onion.dm @@ -13,7 +13,7 @@ instability = 10 growthstages = 3 weed_chance = 3 - growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi' reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1, /datum/reagent/consumable/tearjuice = 0.25) mutatelist = list(/obj/item/seeds/onion/red) diff --git a/code/modules/hydroponics/grown/peanut.dm b/code/modules/hydroponics/grown/peanut.dm index bda79a10a6be7..69cf6d9e0568d 100644 --- a/code/modules/hydroponics/grown/peanut.dm +++ b/code/modules/hydroponics/grown/peanut.dm @@ -9,7 +9,7 @@ lifespan = 55 endurance = 35 yield = 5 - growing_icon = 'icons/obj/hydroponics/growing.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing.dmi' icon_grow = "peanut-grow" icon_dead = "peanut-dead" genes = list(/datum/plant_gene/trait/one_bite) diff --git a/code/modules/hydroponics/grown/peas.dm b/code/modules/hydroponics/grown/peas.dm index 8a7ca86103964..c232ed247c690 100644 --- a/code/modules/hydroponics/grown/peas.dm +++ b/code/modules/hydroponics/grown/peas.dm @@ -10,7 +10,7 @@ potency = 25 instability = 15 growthstages = 3 - growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi' icon_grow = "peas-grow" icon_dead = "peas-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) @@ -54,7 +54,7 @@ desc = "Ridens Cicer, guaranteed to improve your mood dramatically upon consumption!" icon_state = "laughpeas" foodtypes = VEGETABLES - juice_results = list (/datum/reagent/consumable/laughsyrup = 0) + juice_typepath = /datum/reagent/consumable/laughsyrup tastes = list ("a prancing rabbit" = 1) //Vib Ribbon sends her regards.. wherever she is. wine_power = 90 wine_flavor = "a vector-graphic rabbit dancing on your tongue" diff --git a/code/modules/hydroponics/grown/pineapple.dm b/code/modules/hydroponics/grown/pineapple.dm index 97895bc031c8f..3c0e462f38855 100644 --- a/code/modules/hydroponics/grown/pineapple.dm +++ b/code/modules/hydroponics/grown/pineapple.dm @@ -9,7 +9,7 @@ lifespan = 40 endurance = 30 growthstages = 3 - growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi' genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/juicing) mutatelist = list(/obj/item/seeds/apple) reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.02, /datum/reagent/consumable/nutriment = 0.2, /datum/reagent/water = 0.04) @@ -30,7 +30,7 @@ throw_range = 5 w_class = WEIGHT_CLASS_NORMAL foodtypes = FRUIT | PINEAPPLE - juice_results = list(/datum/reagent/consumable/pineapplejuice = 0) + juice_typepath = /datum/reagent/consumable/pineapplejuice tastes = list("pineapple" = 1) wine_power = 40 diff --git a/code/modules/hydroponics/grown/plum.dm b/code/modules/hydroponics/grown/plum.dm index f7fe134cb7574..cac12bdb1eb5d 100644 --- a/code/modules/hydroponics/grown/plum.dm +++ b/code/modules/hydroponics/grown/plum.dm @@ -9,7 +9,7 @@ lifespan = 55 endurance = 35 yield = 5 - growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi' icon_grow = "plum-grow" icon_dead = "plum-dead" genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/one_bite) @@ -22,7 +22,7 @@ desc = "A poet's favorite fruit. Noice." icon_state = "plum" foodtypes = FRUIT - juice_results = list(/datum/reagent/consumable/plumjuice = 0) + juice_typepath = /datum/reagent/consumable/plumjuice tastes = list("plum" = 1) distill_reagent = /datum/reagent/consumable/ethanol/plumwine diff --git a/code/modules/hydroponics/grown/potato.dm b/code/modules/hydroponics/grown/potato.dm index 3d573804c3e8a..837937e41d128 100644 --- a/code/modules/hydroponics/grown/potato.dm +++ b/code/modules/hydroponics/grown/potato.dm @@ -11,7 +11,7 @@ production = 1 yield = 4 growthstages = 4 - growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi' icon_grow = "potato-grow" icon_dead = "potato-dead" genes = list(/datum/plant_gene/trait/battery, /datum/plant_gene/trait/one_bite) @@ -25,7 +25,7 @@ desc = "Boil 'em! Mash 'em! Stick 'em in a stew!" icon_state = "potato" foodtypes = VEGETABLES - juice_results = list(/datum/reagent/consumable/potato_juice = 0) + juice_typepath = /datum/reagent/consumable/potato_juice distill_reagent = /datum/reagent/consumable/ethanol/vodka /obj/item/food/grown/potato/make_bakeable() diff --git a/code/modules/hydroponics/grown/pumpkin.dm b/code/modules/hydroponics/grown/pumpkin.dm index bcdb2073b8af8..561bd5119aa73 100644 --- a/code/modules/hydroponics/grown/pumpkin.dm +++ b/code/modules/hydroponics/grown/pumpkin.dm @@ -10,7 +10,7 @@ lifespan = 50 endurance = 40 growthstages = 3 - growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi' icon_grow = "pumpkin-grow" icon_dead = "pumpkin-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) @@ -24,7 +24,7 @@ icon_state = "pumpkin" bite_consumption_mod = 2 foodtypes = FRUIT - juice_results = list(/datum/reagent/consumable/pumpkinjuice = 0) + juice_typepath = /datum/reagent/consumable/pumpkinjuice wine_power = 20 ///Which type of lantern this gourd produces when carved. var/carved_type = /obj/item/clothing/head/utility/hardhat/pumpkinhead @@ -57,6 +57,6 @@ icon_state = "blumpkin" bite_consumption_mod = 3 foodtypes = FRUIT - juice_results = list(/datum/reagent/consumable/blumpkinjuice = 0) + juice_typepath = /datum/reagent/consumable/blumpkinjuice wine_power = 50 carved_type = /obj/item/clothing/head/utility/hardhat/pumpkinhead/blumpkin diff --git a/code/modules/hydroponics/grown/rainbow_bunch.dm b/code/modules/hydroponics/grown/rainbow_bunch.dm index 14d0648b66668..cfe7dfbf56716 100644 --- a/code/modules/hydroponics/grown/rainbow_bunch.dm +++ b/code/modules/hydroponics/grown/rainbow_bunch.dm @@ -14,7 +14,7 @@ potency = 20 instability = 25 growthstages = 4 - growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_flowers.dmi' icon_dead = "rainbowbunch-dead" genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/preserved) reagents_add = list(/datum/reagent/consumable/nutriment = 0.05) diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm index 604dc7c12c76d..c4e3b27673ae4 100644 --- a/code/modules/hydroponics/grown/replicapod.dm +++ b/code/modules/hydroponics/grown/replicapod.dm @@ -15,7 +15,7 @@ yield = 4 instability = 10 growthstages = 1 - growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi' genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/replicapod) reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) @@ -37,7 +37,7 @@ plant_icon_offset = 2 species = "replicapod" plantname = "Replica Pod" - product = /mob/living/carbon/human //verrry special -- Urist + product = null // the human mob is spawned in harvest() lifespan = 50 endurance = 8 maturation = 10 @@ -155,7 +155,7 @@ // Prevent accidental harvesting. Make sure the user REALLY wants to do this if there's a chance of this coming from a living creature. if(mind || ckey) var/choice = tgui_alert(usr,"The pod is currently devoid of soul. There is a possibility that a soul could claim this creature, or you could harvest it for seeds.", "Harvest Seeds?", list("Harvest Seeds", "Cancel")) - if(choice == "Cancel") + if(choice != "Harvest Seeds") return result // If this plant has already been harvested, return early. diff --git a/code/modules/hydroponics/grown/root.dm b/code/modules/hydroponics/grown/root.dm index fe8c59e5a6435..df37e3bf2b791 100644 --- a/code/modules/hydroponics/grown/root.dm +++ b/code/modules/hydroponics/grown/root.dm @@ -11,7 +11,7 @@ yield = 5 instability = 15 growthstages = 3 - growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' + growing_icon = 'icons/obj/service/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) @@ -22,7 +22,7 @@ icon_state = "carrot" bite_consumption_mod = 2 foodtypes = VEGETABLES - juice_results = list(/datum/reagent/consumable/carrotjuice = 0) + juice_typepath = /datum/reagent/consumable/carrotjuice wine_power = 30 /obj/item/food/grown/carrot/attackby(obj/item/I, mob/user, params) @@ -53,7 +53,7 @@ desc = "Closely related to carrots." icon_state = "parsnip" foodtypes = VEGETABLES - juice_results = list(/datum/reagent/consumable/parsnipjuice = 0) + juice_typepath = /datum/reagent/consumable/parsnipjuice wine_power = 35 @@ -69,7 +69,7 @@ endurance = 50 yield = 6 instability = 10 - growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi' icon_dead = "whitebeet-dead" mutatelist = list(/obj/item/seeds/redbeet) reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/sugar = 0.2, /datum/reagent/consumable/nutriment = 0.05) @@ -95,7 +95,7 @@ endurance = 50 yield = 5 instability = 15 - growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi' icon_dead = "whitebeet-dead" genes = list(/datum/plant_gene/trait/maxchem) reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.05, /datum/reagent/consumable/nutriment = 0.05) diff --git a/code/modules/hydroponics/grown/seedling.dm b/code/modules/hydroponics/grown/seedling.dm new file mode 100644 index 0000000000000..57fd11280b6ed --- /dev/null +++ b/code/modules/hydroponics/grown/seedling.dm @@ -0,0 +1,28 @@ +/obj/item/seeds/seedling + name = "pack of seedling seeds" + desc = "These seeds grow into a floral assistant which can help look after other plants!" + icon_state = "seed-seedling" + growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi' + species = "seedling" + plantname = "Seedling Plant" + product = /mob/living/basic/seedling + lifespan = 40 + endurance = 7 + maturation = 10 + production = 1 + growthstages = 2 + yield = 1 + instability = 15 + potency = 30 + +/obj/item/seeds/seedling/harvest(mob/harvester) + var/obj/machinery/hydroponics/parent = loc + var/list/grow_locations = get_adjacent_open_turfs(parent) + var/turf/final_location = length(grow_locations) ? pick(grow_locations) : get_turf(parent) + var/mob/living/basic/seedling/seed_pet = new product(final_location) + seed_pet.befriend(harvester) + parent.update_tray(user = harvester, product_count = 1) + +/obj/item/seeds/seedling/evil + product = /mob/living/basic/seedling/meanie + icon_state = "seed-seedling-evil" diff --git a/code/modules/hydroponics/grown/sugarcane.dm b/code/modules/hydroponics/grown/sugarcane.dm index cefd6cdd5a4de..9a1646443dcd1 100644 --- a/code/modules/hydroponics/grown/sugarcane.dm +++ b/code/modules/hydroponics/grown/sugarcane.dm @@ -41,7 +41,7 @@ yield = 5 potency = 50 growthstages = 3 - growing_icon = 'icons/obj/hydroponics/growing.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing.dmi' icon_dead = "bamboo-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = null diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm index 15e6e4b69cab8..c2fa44c76625f 100644 --- a/code/modules/hydroponics/grown/tomato.dm +++ b/code/modules/hydroponics/grown/tomato.dm @@ -8,7 +8,7 @@ product = /obj/item/food/grown/tomato maturation = 8 instability = 25 - growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi' icon_grow = "tomato-grow" icon_dead = "tomato-dead" genes = list(/datum/plant_gene/trait/squash, /datum/plant_gene/trait/repeated_harvest) @@ -24,7 +24,7 @@ splat_type = /obj/effect/decal/cleanable/food/tomato_smudge foodtypes = FRUIT grind_results = list(/datum/reagent/consumable/ketchup = 0) - juice_results = list(/datum/reagent/consumable/tomatojuice = 0) + juice_typepath = /datum/reagent/consumable/tomatojuice distill_reagent = /datum/reagent/consumable/enzyme // Blood Tomato diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index 3634f1e994594..3012a1f14793b 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -12,7 +12,7 @@ yield = 5 potency = 50 growthstages = 3 - growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_mushrooms.dmi' icon_dead = "towercap-dead" genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) mutatelist = list(/obj/item/seeds/tower/steel) @@ -130,7 +130,7 @@ /obj/structure/punji_sticks name = "punji sticks" desc = "Don't step on this." - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "punji" resistance_flags = FLAMMABLE max_integrity = 30 diff --git a/code/modules/hydroponics/grown/weeds/starthistle.dm b/code/modules/hydroponics/grown/weeds/starthistle.dm index 091390ea9420a..74627a31f88e8 100644 --- a/code/modules/hydroponics/grown/weeds/starthistle.dm +++ b/code/modules/hydroponics/grown/weeds/starthistle.dm @@ -14,7 +14,7 @@ potency = 10 instability = 35 growthstages = 3 - growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' + growing_icon = 'icons/obj/service/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) graft_gene = /datum/plant_gene/trait/plant_type/weed_hardy @@ -39,7 +39,7 @@ species = "corpse-flower" plantname = "Corpse flower" production = 2 - growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_flowers.dmi' genes = list(/datum/plant_gene/trait/gas_production) mutatelist = null reagents_add = list(/datum/reagent/toxin/formaldehyde = 0.1, /datum/reagent/fluorine = 0.1) @@ -60,7 +60,7 @@ potency = 25 instability = 35 growthstages = 3 - growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' + growing_icon = 'icons/obj/service/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) diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm index 9278f0c6415b8..2b2556790e2b2 100644 --- a/code/modules/hydroponics/growninedible.dm +++ b/code/modules/hydroponics/growninedible.dm @@ -4,12 +4,18 @@ /obj/item/grown // Grown weapons name = "grown_weapon" - icon = 'icons/obj/hydroponics/harvest.dmi' + icon = 'icons/obj/service/hydroponics/harvest.dmi' worn_icon = 'icons/mob/clothing/head/hydroponics.dmi' resistance_flags = FLAMMABLE var/obj/item/seeds/seed = null // type path, gets converted to item on New(). It's safe to assume it's always a seed item. /// Should we pixel offset ourselves at init? for mapping var/offset_at_init = TRUE + /// The reagent this plant distill to. If NULL, it uses a generic fruit_wine reagent and adjusts its variables. + var/distill_reagent + +// This may look like it's doing nothing but it's necessary, we do this to have kwargs work in New (for passing into Initialize) +/obj/item/grown/New(loc, obj/item/seeds/new_seed) + return ..() /obj/item/grown/Initialize(mapload, obj/item/seeds/new_seed) . = ..() diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index 001eaceebf822..31a95044edfe6 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -383,7 +383,7 @@ /obj/item/reagent_containers/spray/weedspray // -- Skie desc = "It's a toxic mixture, in spray form, to kill small weeds." - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' name = "weed spray" icon_state = "weedspray" inhand_icon_state = "spraycan" @@ -399,7 +399,7 @@ /obj/item/reagent_containers/spray/pestspray // -- Skie desc = "It's some pest eliminator spray! Do not inhale!" - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' name = "pest spray" icon_state = "pestspray" inhand_icon_state = "plantbgone" @@ -416,7 +416,7 @@ /obj/item/cultivator name = "cultivator" desc = "It's used for removing weeds or scratching your back." - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "cultivator" inhand_icon_state = "cultivator" lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi' @@ -467,7 +467,7 @@ /obj/item/hatchet name = "hatchet" desc = "A very sharp axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood." - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "hatchet" inhand_icon_state = "hatchet" lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi' @@ -507,23 +507,25 @@ /obj/item/scythe name = "scythe" desc = "A sharp and curved blade on a long fibremetal handle, this tool makes it easy to reap what you sow." - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "scythe0" inhand_icon_state = "scythe0" lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi' - force = 13 + force = 15 throwforce = 5 throw_speed = 2 throw_range = 3 w_class = WEIGHT_CLASS_BULKY flags_1 = CONDUCT_1 armour_penetration = 20 + wound_bonus = 10 slot_flags = ITEM_SLOT_BACK attack_verb_continuous = list("chops", "slices", "cuts", "reaps") attack_verb_simple = list("chop", "slice", "cut", "reap") hitsound = 'sound/weapons/bladeslice.ogg' sharpness = SHARP_EDGED + item_flags = CRUEL_IMPLEMENT //maybe they want to use it in surgery var/swiping = FALSE /obj/item/scythe/Initialize(mapload) @@ -568,7 +570,7 @@ name = "secateurs" desc = "It's a tool for cutting grafts off plants or changing podperson looks." desc_controls = "Right-click to stylize podperson hair or other plant features!" - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "secateurs" inhand_icon_state = null worn_icon_state = "cutters" @@ -598,7 +600,7 @@ /obj/item/geneshears name = "Botanogenetic Plant Shears" desc = "A high tech, high fidelity pair of plant shears, capable of cutting genetic traits out of a plant." - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "genesheers" inhand_icon_state = null worn_icon_state = "cutters" diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 4f66a1dd79226..ebb22cc63a0af 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -2,7 +2,7 @@ /obj/machinery/hydroponics name = "hydroponics tray" desc = "A basin used to grow plants in." - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "hydrotray" density = TRUE pass_flags_self = PASSMACHINE | LETPASSTHROW @@ -153,7 +153,7 @@ /obj/machinery/hydroponics/constructable name = "hydroponics tray" - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "hydrotray3" /obj/machinery/hydroponics/constructable/Initialize(mapload) @@ -509,15 +509,15 @@ /obj/machinery/hydroponics/proc/update_status_light_overlays() . = list() if(waterlevel <= 10) - . += mutable_appearance('icons/obj/hydroponics/equipment.dmi', "over_lowwater3") + . += mutable_appearance('icons/obj/service/hydroponics/equipment.dmi', "over_lowwater3") if(reagents.total_volume <= 2) - . += mutable_appearance('icons/obj/hydroponics/equipment.dmi', "over_lownutri3") + . += mutable_appearance('icons/obj/service/hydroponics/equipment.dmi', "over_lownutri3") if(plant_health <= (myseed.endurance / 2)) - . += mutable_appearance('icons/obj/hydroponics/equipment.dmi', "over_lowhealth3") + . += mutable_appearance('icons/obj/service/hydroponics/equipment.dmi', "over_lowhealth3") if(weedlevel >= 5 || pestlevel >= 5 || toxic >= 40) - . += mutable_appearance('icons/obj/hydroponics/equipment.dmi', "over_alert3") + . += mutable_appearance('icons/obj/service/hydroponics/equipment.dmi', "over_alert3") if(plant_status == HYDROTRAY_PLANT_HARVESTABLE) - . += mutable_appearance('icons/obj/hydroponics/equipment.dmi', "over_harvest3") + . += mutable_appearance('icons/obj/service/hydroponics/equipment.dmi', "over_harvest3") ///Sets a new value for the myseed variable, which is the seed of the plant that's growing inside the tray. /obj/machinery/hydroponics/proc/set_seed(obj/item/seeds/new_seed, delete_old_seed = TRUE) @@ -812,6 +812,17 @@ if(!any_adjacent) particles = null +/** + * Bee pollinate proc. + * Checks if the bee can pollinate the plant + */ +/obj/machinery/hydroponics/proc/can_bee_pollinate() + if(isnull(myseed)) + return FALSE + if(plant_status == HYDROTRAY_PLANT_DEAD || recent_bee_visit) + return FALSE + return TRUE + /** * Pest Mutation Proc. * When a tray is mutated with high pest values, it will spawn spiders. @@ -822,7 +833,7 @@ message_admins("[ADMIN_LOOKUPFLW(user)] last altered a hydro tray's contents which spawned spiderlings.") user.log_message("last altered a hydro tray, which spiderlings spawned from.", LOG_GAME) visible_message(span_warning("The pests seem to behave oddly...")) - spawn_atom_to_turf(/mob/living/basic/spiderling/hunter, src, 3, FALSE) + spawn_atom_to_turf(/mob/living/basic/spider/growing/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...")) @@ -854,16 +865,16 @@ transfer_amount = reagent_source.reagents.total_volume SEND_SIGNAL(reagent_source, COMSIG_ITEM_ON_COMPOSTED, user) else - transfer_amount = reagent_source.amount_per_transfer_from_this + transfer_amount = min(reagent_source.amount_per_transfer_from_this, reagent_source.reagents.total_volume) 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]" // Beakers, bottles, buckets, etc. if(reagent_source.is_drainable()) playsound(loc, 'sound/effects/slosh.ogg', 25, TRUE) - var/image/splash_animation = image('icons/effects/effects.dmi', src, "splash_hydroponics") + var/mutable_appearance/splash_animation = mutable_appearance('icons/effects/effects.dmi', "splash_hydroponics") splash_animation.color = mix_color_from_reagents(reagent_source.reagents.reagent_list) - flick_overlay_global(splash_animation, GLOB.clients, 1.1 SECONDS) + flick_overlay_view(splash_animation, 1.1 SECONDS) if(visi_msg) visible_message(span_notice("[visi_msg].")) @@ -871,7 +882,7 @@ 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)) + if(reagent_source.reagents.has_reagent(/datum/reagent/water)) var/water_amt = reagent_source.reagents.get_reagent_amount(/datum/reagent/water) * transfer_amount / reagent_source.reagents.total_volume var/water_amt_adjusted = H.adjust_waterlevel(round(water_amt)) reagent_source.reagents.remove_reagent(/datum/reagent/water, water_amt_adjusted) @@ -881,7 +892,7 @@ var/transfer_me_to_tray = reagent_source.reagents.get_reagent_amount(not_water_reagent.type) * transfer_amount / reagent_source.reagents.total_volume reagent_source.reagents.trans_id_to(H.reagents, not_water_reagent.type, transfer_me_to_tray) else - reagent_source.reagents.trans_to(H.reagents, transfer_amount, transfered_by = user) + reagent_source.reagents.trans_to(H.reagents, transfer_amount, transferred_by = user) lastuser = WEAKREF(user) if(IS_EDIBLE(reagent_source) || istype(reagent_source, /obj/item/reagent_containers/pill)) qdel(reagent_source) @@ -988,9 +999,13 @@ return else if(istype(O, /obj/item/storage/bag/plants)) - attack_hand(user) - for(var/obj/item/food/grown/G in locate(user.x,user.y,user.z)) - O.atom_storage?.attempt_insert(G, user, TRUE) + if(plant_status == HYDROTRAY_PLANT_HARVESTABLE) + var/list/harvest = myseed.harvest(user) + for(var/obj/item/food/grown/G in harvest) + O.atom_storage?.attempt_insert(G, user, TRUE) + else if(plant_status == HYDROTRAY_PLANT_DEAD) + to_chat(user, span_notice("You remove the dead plant from [src].")) + set_seed(null) return else if(O.tool_behaviour == TOOL_SHOVEL) @@ -1141,7 +1156,7 @@ /obj/machinery/hydroponics/soil //Not actually hydroponics at all! Honk! name = "soil" desc = "A patch of dirt." - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "soil" gender = PLURAL circuit = null diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index 7ad18759f6e43..db99ab21edfc1 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -838,7 +838,7 @@ if(!.) return - googly = mutable_appearance('icons/obj/hydroponics/harvest.dmi', "eyes") + googly = mutable_appearance('icons/obj/service/hydroponics/harvest.dmi', "eyes") googly.appearance_flags = RESET_COLOR our_plant.add_overlay(googly) diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm index a6c4ccee2a196..04b0edf44bbf2 100644 --- a/code/modules/hydroponics/seed_extractor.dm +++ b/code/modules/hydroponics/seed_extractor.dm @@ -44,7 +44,7 @@ /obj/machinery/seed_extractor name = "seed extractor" desc = "Extracts and bags seeds from produce." - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "sextractor" density = TRUE circuit = /obj/item/circuitboard/machine/seed_extractor @@ -177,22 +177,13 @@ * taking_from - where are we taking the seed from? A mob, a bag, etc? If null its means its just laying on the turf so force move it in **/ /obj/machinery/seed_extractor/proc/add_seed(obj/item/seeds/to_add, atom/taking_from) - if(!isnull(taking_from)) - if(ismob(taking_from)) - var/mob/mob_loc = taking_from - if(!mob_loc.transferItemToLoc(to_add, src)) - return FALSE - - else if(!taking_from.atom_storage?.attempt_remove(to_add, src, silent = TRUE)) - return FALSE - else - to_add.forceMove(src) - var/seed_id = generate_seed_hash(to_add) + var/list/seed_data + var/has_seed_data // so we remember to add a seed obj weakref to piles[seed_id] at the end of the proc. That way if some reason we runtime in this proc it won't incorrectly add data to the list if(piles[seed_id]) - piles[seed_id]["refs"] += WEAKREF(to_add) + has_seed_data = TRUE else - var/list/seed_data = list() + seed_data = list() seed_data["icon"] = sanitize_css_class_name("[initial(to_add.icon)][initial(to_add.icon_state)]") seed_data["name"] = capitalize(replacetext(to_add.name,"pack of ", "")); seed_data["lifespan"] = to_add.lifespan @@ -213,7 +204,37 @@ "rate" = reagent.rate )) seed_data["volume_mod"] = (locate(/datum/plant_gene/trait/maxchem) in to_add.genes) ? 2 : 1 + seed_data["mutatelist"] = list() + for(var/obj/item/seeds/mutant as anything in to_add.mutatelist) + seed_data["mutatelist"] += initial(mutant.plantname) + if(to_add.product) + var/obj/item/food/grown/product = new to_add.product + var/datum/reagent/product_distill_reagent = product.distill_reagent + seed_data["distill_reagent"] = initial(product_distill_reagent.name) + var/datum/reagent/product_juice_typepath = product.juice_typepath + seed_data["juice_name"] = initial(product_juice_typepath.name) + seed_data["grind_results"] = list() + for(var/datum/reagent/reagent as anything in product.grind_results) + seed_data["grind_results"] += initial(reagent.name) + qdel(product) + + if(!isnull(taking_from)) + if(ismob(taking_from)) + var/mob/mob_loc = taking_from + if(!mob_loc.transferItemToLoc(to_add, src)) + return FALSE + + else if(!taking_from.atom_storage?.attempt_remove(to_add, src, silent = TRUE)) + return FALSE + else + to_add.forceMove(src) + + // do this at the end, in case any of the previous steps failed + if(has_seed_data) + piles[seed_id]["refs"] += WEAKREF(to_add) + else piles[seed_id] = seed_data + return TRUE /obj/machinery/seed_extractor/ui_state(mob/user) diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index f4c92a1db529a..36653ebafb9ff 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -3,7 +3,7 @@ // ******************************************************** /obj/item/seeds - icon = 'icons/obj/hydroponics/seeds.dmi' + icon = 'icons/obj/service/hydroponics/seeds.dmi' icon_state = "seed" // Unknown plant seed - these shouldn't exist in-game. worn_icon_state = "seed" w_class = WEIGHT_CLASS_TINY @@ -17,7 +17,7 @@ /// Used to update icons. Should match the name in the sprites unless all icon_* are overridden. var/species = "" ///the file that stores the sprites of the growing plant from this seed. - var/growing_icon = 'icons/obj/hydroponics/growing.dmi' + var/growing_icon = 'icons/obj/service/hydroponics/growing.dmi' /// Used to override grow icon (default is `"[species]-grow"`). You can use one grow icon for multiple closely related plants with it. var/icon_grow /// Used to override dead icon (default is `"[species]-dead"`). You can use one dead icon for multiple closely related plants with it. @@ -223,7 +223,7 @@ for(var/datum/plant_gene/trait/trait in parent.myseed.genes) if((trait.mutability_flags & PLANT_GENE_MUTATABLE) && trait.can_add(mutated_seed)) mutated_seed.genes += trait.Copy() - t_prod = new t_prod(output_loc, mutated_seed) + t_prod = new t_prod(output_loc, new_seed = mutated_seed) t_prod.transform = initial(t_prod.transform) t_prod.transform *= TRANSFORM_USING_VARIABLE(t_prod.seed.potency, 100) + 0.5 ADD_TRAIT(t_prod, TRAIT_PLANT_WILDMUTATE, INNATE_TRAIT) @@ -232,7 +232,7 @@ t_prod.seed.set_instability(round(instability * 0.5)) continue else - t_prod = new product(output_loc, src) + t_prod = new product(output_loc, new_seed = src) if(parent.myseed.plantname != initial(parent.myseed.plantname)) t_prod.name = lowertext(parent.myseed.plantname) if(productdesc) @@ -266,6 +266,7 @@ reagent_max += reagents_add[rid] if(IS_EDIBLE(T) || istype(T, /obj/item/grown)) var/obj/item/food/grown/grown_edible = T + var/reagent_purity = get_reagent_purity() for(var/rid in reagents_add) var/reagent_overflow_mod = reagents_add[rid] if(reagent_max > 1) @@ -277,12 +278,13 @@ data = list("blood_type" = "O-") if(istype(grown_edible) && (rid == /datum/reagent/consumable/nutriment || rid == /datum/reagent/consumable/nutriment/vitamin)) data = grown_edible.tastes // apple tastes of apple. - T.reagents.add_reagent(rid, amount, data) + T.reagents.add_reagent(rid, amount, data, added_purity = reagent_purity) //Handles the juicing trait, swaps nutriment and vitamins for that species various juices if they exist. Mutually exclusive with distilling. - if(get_gene(/datum/plant_gene/trait/juicing) && grown_edible.juice_results) - grown_edible.on_juice() - grown_edible.reagents.add_reagent_list(grown_edible.juice_results) + if(get_gene(/datum/plant_gene/trait/juicing) && grown_edible.juice_typepath) + grown_edible.juice() + else if(get_gene(/datum/plant_gene/trait/brewing)) + grown_edible.ferment() /// The number of nutriments we have inside of our plant, for use in our heating / cooling genes var/num_nutriment = T.reagents.get_reagent_amount(/datum/reagent/consumable/nutriment) @@ -302,6 +304,14 @@ T.reagents.handle_reactions() playsound(T.loc, 'sound/effects/space_wind.ogg', 50) +/// Returns reagent purity based on seed stats +/obj/item/seeds/proc/get_reagent_purity() + var/purity_from_lifespan = lifespan / 400 //up to +25% for lifespan + var/purity_from_endurance = endurance / 400 //up to +25% for endurance + var/purity_from_instability = rand(-instability, instability) / 400 //up to +-25% at random for instability + var/result_purity = clamp(0.5 + purity_from_lifespan + purity_from_endurance + purity_from_instability, 0, 1) //50% base + stats + return result_purity + /// Setters procs /// /** diff --git a/code/modules/hydroponics/unique_plant_genes.dm b/code/modules/hydroponics/unique_plant_genes.dm index 8a08ee2a93107..99c877cdfbe4d 100644 --- a/code/modules/hydroponics/unique_plant_genes.dm +++ b/code/modules/hydroponics/unique_plant_genes.dm @@ -181,7 +181,10 @@ . = ..() if(!.) return - + if(genes_to_check) + genes_to_check = string_list(genes_to_check) + if(traits_to_check) + traits_to_check = string_list(traits_to_check) our_plant.AddElement(/datum/element/plant_backfire, cancel_action_on_backfire, traits_to_check, genes_to_check) RegisterSignal(our_plant, COMSIG_PLANT_ON_BACKFIRE, PROC_REF(on_backfire)) @@ -462,7 +465,7 @@ /// Walking Mushroom's transformation gene /datum/plant_gene/trait/mob_transformation/shroom - killer_plant = /mob/living/simple_animal/hostile/mushroom + killer_plant = /mob/living/basic/mushroom mob_health_multiplier = 0.25 mob_melee_multiplier = 0.05 mob_speed_multiplier = 0.02 diff --git a/code/modules/industrial_lift/elevator/elevator_controller.dm b/code/modules/industrial_lift/elevator/elevator_controller.dm index 41c845c4ef900..9d8a18ed798bc 100644 --- a/code/modules/industrial_lift/elevator/elevator_controller.dm +++ b/code/modules/industrial_lift/elevator/elevator_controller.dm @@ -46,12 +46,12 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/button/elevator, 32) // Emagging elevator buttons will disable safeties /obj/item/assembly/control/elevator/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE obj_flags |= EMAGGED var/datum/lift_master/lift = lift_weakref?.resolve() if(!lift) - return + return FALSE for(var/obj/structure/industrial_lift/lift_platform as anything in lift.lift_platforms) lift_platform.violent_landing = TRUE @@ -71,6 +71,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/button/elevator, 32) // or by someone emagging the assembly directly after removing it (to be cheeky) var/atom/balloon_alert_loc = get(src, /obj/machinery/button) || src balloon_alert_loc.balloon_alert(user, "safeties overridden") + return TRUE // Multitooling emagged elevator buttons will fix the safeties /obj/item/assembly/control/elevator/multitool_act(mob/living/user) diff --git a/code/modules/industrial_lift/elevator/elevator_indicator.dm b/code/modules/industrial_lift/elevator/elevator_indicator.dm index 781ff35981bf0..77518a4bdc843 100644 --- a/code/modules/industrial_lift/elevator/elevator_indicator.dm +++ b/code/modules/industrial_lift/elevator/elevator_indicator.dm @@ -19,10 +19,10 @@ light_color = LIGHT_COLOR_DARK_BLUE luminosity = 1 - maptext_x = 17 - maptext_y = 21 - maptext_width = 4 - maptext_height = 8 + maptext_x = 18 + maptext_y = 20 + maptext_width = 8 + maptext_height = 16 /// What specific_lift_id do we link with? var/linked_elevator_id @@ -150,7 +150,7 @@ return set_light(l_on = TRUE) - maptext = {"
    [current_lift_floor]
    "} + maptext = "
    [current_lift_floor]
    " /obj/machinery/lift_indicator/update_overlays() . = ..() diff --git a/code/modules/industrial_lift/elevator/elevator_panel.dm b/code/modules/industrial_lift/elevator/elevator_panel.dm index 989ac39001561..8791c885a50ba 100644 --- a/code/modules/industrial_lift/elevator/elevator_panel.dm +++ b/code/modules/industrial_lift/elevator/elevator_panel.dm @@ -15,7 +15,7 @@ desc = "\"In case of emergency, please use the stairs.\" Thus, always use the stairs." density = FALSE - icon = 'icons/obj/stationobjs.dmi' + icon = 'icons/obj/wallmounts.dmi' icon_state = "elevpanel0" base_icon_state = "elevpanel" @@ -98,13 +98,13 @@ /obj/machinery/elevator_control_panel/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE obj_flags |= EMAGGED var/datum/lift_master/lift = lift_weakref?.resolve() if(!lift) - return + return FALSE for(var/obj/structure/industrial_lift/lift_platform as anything in lift.lift_platforms) lift_platform.violent_landing = TRUE @@ -122,6 +122,7 @@ playsound(src, SFX_SPARKS, 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) balloon_alert(user, "safeties overridden") + return TRUE /obj/machinery/elevator_control_panel/multitool_act(mob/living/user) var/datum/lift_master/lift = lift_weakref?.resolve() diff --git a/code/modules/industrial_lift/industrial_lift.dm b/code/modules/industrial_lift/industrial_lift.dm index e5ac79af23303..0bcc2a49bc84a 100644 --- a/code/modules/industrial_lift/industrial_lift.dm +++ b/code/modules/industrial_lift/industrial_lift.dm @@ -1,4 +1,14 @@ GLOBAL_LIST_EMPTY(lifts) +GLOBAL_LIST_INIT(all_radial_directions, list( + "NORTH" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = NORTH), + "NORTHEAST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = NORTHEAST), + "EAST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = EAST), + "SOUTHEAST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = SOUTHEAST), + "SOUTH" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = SOUTH), + "SOUTHWEST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = SOUTHWEST), + "WEST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = WEST), + "NORTHWEST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = NORTHWEST) +)) /obj/structure/industrial_lift name = "lift platform" @@ -102,11 +112,11 @@ GLOBAL_LIST_EMPTY(lifts) /obj/structure/industrial_lift/proc/set_movement_registrations(list/turfs_to_set) for(var/turf/turf_loc as anything in turfs_to_set || locs) RegisterSignal(turf_loc, COMSIG_ATOM_EXITED, PROC_REF(UncrossedRemoveItemFromLift)) - RegisterSignals(turf_loc, list(COMSIG_ATOM_ENTERED,COMSIG_ATOM_INITIALIZED_ON), PROC_REF(AddItemOnLift)) + RegisterSignals(turf_loc, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON), PROC_REF(AddItemOnLift)) ///unset our movement registrations from turfs that no longer contain us (or every loc if turfs_to_unset is unspecified) /obj/structure/industrial_lift/proc/unset_movement_registrations(list/turfs_to_unset) - var/static/list/registrations = list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_EXITED, COMSIG_ATOM_INITIALIZED_ON) + var/static/list/registrations = list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_EXITED, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON) for(var/turf/turf_loc as anything in turfs_to_unset || locs) UnregisterSignal(turf_loc, registrations) @@ -316,7 +326,7 @@ GLOBAL_LIST_EMPTY(lifts) if(violent_landing) // Violent landing = gibbed. But the nicest kind of gibbing, keeping everything intact. crushed.investigate_log("has been gibbed by [src].", INVESTIGATE_DEATHS) - crushed.gib(FALSE, FALSE, FALSE) + crushed.gib(DROP_ALL_REMAINS) else // Less violent landing simply crushes every bone in your body. crushed.Paralyze(30 SECONDS, ignore_canstun = TRUE) @@ -424,7 +434,10 @@ GLOBAL_LIST_EMPTY(lifts) var/datum/callback/land_slam = new(collided, TYPE_PROC_REF(/mob/living/, tram_slam_land)) collided.throw_at(throw_target, 200 * collision_lethality, 4 * collision_lethality, callback = land_slam) - SEND_SIGNAL(src, COMSIG_TRAM_COLLISION, collided) + //increment the hit counter signs + if(ismob(collided) && collided.client) + SSpersistence.tram_hits_this_round++ + SEND_SIGNAL(src, COMSIG_TRAM_COLLISION, SSpersistence.tram_hits_this_round) unset_movement_registrations(exited_locs) group_move(things_to_move, going) @@ -539,7 +552,7 @@ GLOBAL_LIST_EMPTY(lifts) var/list/atom/movable/foreign_contents_in_loc = list() for(var/atom/movable/foreign_movable as anything in (turf_loc.contents - original_contents)) - if(foreign_objects && ismovable(foreign_movable) && !ismob(foreign_movable)) + if(foreign_objects && ismovable(foreign_movable) && !ismob(foreign_movable) && !istype(foreign_movable, /obj/effect/landmark/tram)) foreign_contents_in_loc += foreign_movable continue @@ -742,19 +755,8 @@ GLOBAL_LIST_EMPTY(lifts) var/starting_position = loc if (!can_open_lift_radial(user,starting_position)) return -//NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST - var/static/list/tool_list = list( - "NORTH" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = NORTH), - "NORTHEAST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = NORTH), - "EAST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = EAST), - "SOUTHEAST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = EAST), - "SOUTH" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = SOUTH), - "SOUTHWEST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = SOUTH), - "WEST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = WEST), - "NORTHWEST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = WEST) - ) - - var/result = show_radial_menu(user, src, tool_list, custom_check = CALLBACK(src, PROC_REF(can_open_lift_radial), user, starting_position), require_near = TRUE, tooltips = FALSE) + + var/result = show_radial_menu(user, src, GLOB.all_radial_directions, custom_check = CALLBACK(src, PROC_REF(can_open_lift_radial), user, starting_position), require_near = TRUE, tooltips = FALSE) if (!can_open_lift_radial(user,starting_position)) return // nice try if(!isnull(result) && result != "Cancel" && lift_master_datum.controls_locked) diff --git a/code/modules/industrial_lift/tram/tram_doors.dm b/code/modules/industrial_lift/tram/tram_doors.dm index 89c337574071e..f0253659eb65e 100644 --- a/code/modules/industrial_lift/tram/tram_doors.dm +++ b/code/modules/industrial_lift/tram/tram_doors.dm @@ -3,6 +3,7 @@ desc = "Probably won't crush you if you try to rush them as they close. But we know you live on that danger, try and beat the tram!" icon = 'icons/obj/doors/tramdoor.dmi' req_access = list("tcomms") + multi_tile = TRUE var/associated_lift = MAIN_STATION_TRAM var/datum/weakref/tram_ref /// Are the doors in a malfunctioning state (dangerous) @@ -20,16 +21,17 @@ base_state = "right" /obj/machinery/door/window/tram/hilbert - icon = 'icons/obj/lavaland/survival_pod.dmi' + icon = 'icons/obj/mining_zones/survival_pod.dmi' associated_lift = HILBERT_TRAM icon_state = "windoor" base_state = "windoor" -/obj/machinery/door/window/tram/emag_act(mob/living/user) +/obj/machinery/door/window/tram/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE balloon_alert(user, "disabled motion sensors") obj_flags |= EMAGGED + return TRUE /// Random event called by code\modules\events\tram_malfunction.dm /// Makes the doors malfunction @@ -98,6 +100,8 @@ /obj/machinery/door/window/tram/Initialize(mapload, set_dir, unres_sides) . = ..() RemoveElement(/datum/element/atmos_sensitive, mapload) + if(filler) + filler.set_density(FALSE) // tram doors allow you to stand on the tile INVOKE_ASYNC(src, PROC_REF(open)) GLOB.tram_doors += src find_tram() diff --git a/code/modules/industrial_lift/tram/tram_landmark.dm b/code/modules/industrial_lift/tram/tram_landmark.dm index 0c6648c6d4293..76341a7d06463 100644 --- a/code/modules/industrial_lift/tram/tram_landmark.dm +++ b/code/modules/industrial_lift/tram/tram_landmark.dm @@ -19,52 +19,91 @@ GLOBAL_LIST_EMPTY(tram_landmarks) LAZYREMOVEASSOC(GLOB.tram_landmarks, specific_lift_id, src) return ..() +/obj/effect/landmark/tram/nav + name = "tram nav beacon" + invisibility = INVISIBILITY_MAXIMUM // nav aids can't be abstract since they stay with the tram + +/** + * lift_id landmarks. used to map in specific_lift_id to trams. when the trams lift_master encounters one on a trams tile + * it sets its specific_lift_id to that landmark. allows you to have multiple trams and multiple controls linking to their specific tram + */ +/obj/effect/landmark/lift_id + name = "lift id setter" + icon_state = "lift_id" + ///what specific id we give to the tram we're placed on, should explicitly set this if its a subtype, or weird things might happen + var/specific_lift_id = MAIN_STATION_TRAM + //tramstation -/obj/effect/landmark/tram/tramstation/west +/obj/effect/landmark/tram/nav/tramstation/main + name = MAIN_STATION_TRAM + specific_lift_id = TRAM_NAV_BEACONS + dir = WEST + +/obj/effect/landmark/tram/platform/tramstation/west name = "West Wing" platform_code = TRAMSTATION_WEST tgui_icons = list("Arrivals" = "plane-arrival", "Command" = "bullhorn", "Security" = "gavel") -/obj/effect/landmark/tram/tramstation/central +/obj/effect/landmark/tram/platform/tramstation/central name = "Central Wing" platform_code = TRAMSTATION_CENTRAL tgui_icons = list("Service" = "cocktail", "Medical" = "plus", "Engineering" = "wrench") -/obj/effect/landmark/tram/tramstation/east +/obj/effect/landmark/tram/platform/tramstation/east name = "East Wing" platform_code = TRAMSTATION_EAST tgui_icons = list("Departures" = "plane-departure", "Cargo" = "box", "Science" = "flask") +//map-agnostic landmarks + +/obj/effect/landmark/tram/nav/immovable_rod + name = "DESTINATION/NOT/FOUND" + specific_lift_id = IMMOVABLE_ROD_DESTINATIONS + +/obj/effect/landmark/tram/nav/hilbert + name = HILBERT_TRAM + specific_lift_id = TRAM_NAV_BEACONS + dir = WEST + //birdshot -/obj/effect/landmark/tram/birdshot/sec_wing +/obj/effect/landmark/lift_id/birdshot/prison + specific_lift_id = PRISON_TRAM + +/obj/effect/landmark/lift_id/birdshot/maint + specific_lift_id = MAINTENANCE_TRAM + +/obj/effect/landmark/tram/nav/birdshot/prison + name = PRISON_TRAM + specific_lift_id = TRAM_NAV_BEACONS + dir = NORTH + +/obj/effect/landmark/tram/nav/birdshot/maint + name = MAINTENANCE_TRAM + specific_lift_id = TRAM_NAV_BEACONS + dir = WEST + +/obj/effect/landmark/tram/platform/birdshot/sec_wing name = "Security Wing" + specific_lift_id = PRISON_TRAM platform_code = BIRDSHOT_SECURITY_WING tgui_icons = list("Security" = "gavel") -/obj/effect/landmark/tram/birdshot/prison_wing +/obj/effect/landmark/tram/platform/birdshot/prison_wing name = "Prison Wing" + specific_lift_id = PRISON_TRAM platform_code = BIRDSHOT_PRISON_WING tgui_icons = list("Prison" = "box") -/obj/effect/landmark/tram/birdshot/maint_left +/obj/effect/landmark/tram/platform/birdshot/maint_left name = "Port Platform" + specific_lift_id = MAINTENANCE_TRAM platform_code = BIRDSHOT_MAINTENANCE_LEFT tgui_icons = list("Port Platform" = "plane-departure") -/obj/effect/landmark/tram/birdshot/maint_right +/obj/effect/landmark/tram/platform/birdshot/maint_right name = "Starboard Platform" + specific_lift_id = MAINTENANCE_TRAM platform_code = BRIDSHOT_MAINTENANCE_RIGHT tgui_icons = list("Starboard Platform" = "plane-arrival") - -/** - * lift_id landmarks. used to map in specific_lift_id to trams. when the trams lift_master encounters one on a trams tile - * it sets its specific_lift_id to that landmark. allows you to have multiple trams and multiple controls linking to their specific tram - */ -/obj/effect/landmark/lift_id - name = "lift id setter" - icon_state = "lift_id" - - ///what specific id we give to the tram we're placed on, should explicitely set this if its a subtype, or weird things might happen - var/specific_lift_id = MAIN_STATION_TRAM diff --git a/code/modules/industrial_lift/tram/tram_lift_master.dm b/code/modules/industrial_lift/tram/tram_lift_master.dm index c21ed7b7af131..e2d044dc5b2c3 100644 --- a/code/modules/industrial_lift/tram/tram_lift_master.dm +++ b/code/modules/industrial_lift/tram/tram_lift_master.dm @@ -17,6 +17,9 @@ /// and the destination landmark. var/obj/effect/landmark/tram/idle_platform + /// a navigational landmark that we use to find the tram's location on the map at any time + var/obj/effect/landmark/tram/nav/nav_beacon + ///decisecond delay between horizontal movement. cannot make the tram move faster than 1 movement per world.tick_lag. ///this var is poorly named its actually horizontal movement delay but whatever. var/horizontal_speed = 0.5 @@ -58,14 +61,18 @@ /datum/lift_master/tram/check_for_landmarks(obj/structure/industrial_lift/tram/new_lift_platform) . = ..() for(var/turf/platform_loc as anything in new_lift_platform.locs) - var/obj/effect/landmark/tram/initial_destination = locate() in platform_loc + var/obj/effect/landmark/tram/platform/initial_destination = locate() in platform_loc + var/obj/effect/landmark/tram/nav/beacon = locate() in platform_loc if(initial_destination) idle_platform = initial_destination + if(beacon) + nav_beacon = beacon + /datum/lift_master/tram/proc/check_starting_landmark() - if(!idle_platform) - CRASH("a tram lift_master was initialized without any tram landmark to give it direction!") + if(!idle_platform || !nav_beacon) + CRASH("a tram lift_master was initialized without the required landmarks to give it direction!") SStramprocess.can_fire = TRUE @@ -114,19 +121,21 @@ */ /datum/lift_master/tram/proc/tram_travel(obj/effect/landmark/tram/destination_platform, rapid = FALSE) if(destination_platform == idle_platform) - return + return FALSE - travel_direction = get_dir(idle_platform, destination_platform) - travel_distance = get_dist(idle_platform, destination_platform) + travel_direction = get_dir(nav_beacon, destination_platform) + travel_distance = get_dist(nav_beacon, destination_platform) travel_trip_length = travel_distance idle_platform = destination_platform set_travelling(TRUE) set_controls(LIFT_PLATFORM_LOCKED) if(rapid) // bypass for unsafe, rapid departure dispatch_tram(destination_platform) + return TRUE else update_tram_doors(CLOSE_DOORS) addtimer(CALLBACK(src, PROC_REF(dispatch_tram), destination_platform), 3 SECONDS) + return TRUE /datum/lift_master/tram/proc/dispatch_tram(obj/effect/landmark/tram/destination_platform) SEND_SIGNAL(src, COMSIG_TRAM_TRAVEL, idle_platform, destination_platform) @@ -204,7 +213,7 @@ * The tram doors are in a list of airlocks and we apply the proc on that list. */ /datum/lift_master/tram/proc/update_tram_doors(action) - for(var/obj/machinery/door/window/tram/tram_door in GLOB.airlocks) + for(var/obj/machinery/door/window/tram/tram_door as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/window/tram)) if(tram_door.associated_lift != specific_lift_id) continue set_door_state(tram_door, action) @@ -219,3 +228,103 @@ else stack_trace("Tram doors update_tram_doors called with an improper action ([action]).") + +/datum/lift_master/tram/proc/set_operational(new_value) + if(is_operational != new_value) + is_operational = new_value + +/** + * Returns the closest tram nav beacon to an atom + * + * Creates a list of nav beacons in the requested direction + * and returns the closest to be passed to the industrial_lift + * + * Arguments: source: the starting point to find a beacon + * travel_dir: travel direction in tram form, INBOUND or OUTBOUND + * beacon_type: what list of beacons we pull from + */ +/datum/lift_master/tram/proc/closest_nav_in_travel_dir(atom/origin, travel_dir, beacon_type) + if(!istype(origin) || !origin.z) + return FALSE + + var/list/obj/effect/landmark/tram/nav/inbound_candidates = list() + var/list/obj/effect/landmark/tram/nav/outbound_candidates = list() + + for(var/obj/effect/landmark/tram/nav/candidate_beacon in GLOB.tram_landmarks[beacon_type]) + if(candidate_beacon.z != origin.z || candidate_beacon.z != nav_beacon.z) + continue + + switch(nav_beacon.dir) + if(EAST, WEST) + if(candidate_beacon.y != nav_beacon.y) + continue + else if(candidate_beacon.x < nav_beacon.x) + inbound_candidates += candidate_beacon + else + outbound_candidates += candidate_beacon + if(NORTH, SOUTH) + if(candidate_beacon.x != nav_beacon.x) + continue + else if(candidate_beacon.y < nav_beacon.y) + inbound_candidates += candidate_beacon + else + outbound_candidates += candidate_beacon + + switch(travel_dir) + if(INBOUND) + var/obj/effect/landmark/tram/nav/selected = get_closest_atom(/obj/effect/landmark/tram/nav, inbound_candidates, origin) + if(selected) + return selected + stack_trace("No inbound beacon candidate found for [origin]. Cancelling dispatch.") + return FALSE + + if(OUTBOUND) + var/obj/effect/landmark/tram/nav/selected = get_closest_atom(/obj/effect/landmark/tram/nav, outbound_candidates, origin) + if(selected) + return selected + stack_trace("No outbound beacon candidate found for [origin]. Cancelling dispatch.") + return FALSE + + else + stack_trace("Tram receieved invalid travel direction [travel_dir]. Cancelling dispatch.") + + return FALSE + +/** + * Moves the tram when hit by an immovable rod + * + * Tells the individual tram parts where to actually go and has an extra safety checks + * incase multiple inputs get through, preventing conflicting directions and the tram + * literally ripping itself apart. all of the actual movement is handled by SStramprocess + * + * Arguments: collided_rod (the immovable rod that hit the tram) + * Return: push_destination (the landmark /obj/effect/landmark/tram/nav that the tram is being pushed to due to the rod's trajectory) + */ +/datum/lift_master/tram/proc/rod_collision(obj/effect/immovablerod/collided_rod) + if(!is_operational) + return + var/rod_velocity_sign + // Determine inbound or outbound + if(collided_rod.dir & (NORTH|SOUTH)) + rod_velocity_sign = collided_rod.dir & NORTH ? OUTBOUND : INBOUND + else + rod_velocity_sign = collided_rod.dir & EAST ? OUTBOUND : INBOUND + + var/obj/effect/landmark/tram/nav/push_destination = closest_nav_in_travel_dir(origin = nav_beacon, travel_dir = rod_velocity_sign, beacon_type = IMMOVABLE_ROD_DESTINATIONS) + if(!push_destination) + return + travel_direction = get_dir(nav_beacon, push_destination) + travel_distance = get_dist(nav_beacon, push_destination) + travel_trip_length = travel_distance + idle_platform = push_destination + // Don't bother processing crossing signals, where this tram's going there are no signals + for(var/obj/machinery/crossing_signal/xing as anything in GLOB.tram_signals) + xing.temp_malfunction() + priority_announce("In a turn of rather peculiar events, it appears that [GLOB.station_name] has struck an immovable rod. (Don't ask us where it came from.) This has led to a station brakes failure on one of the tram platforms.\n\n\ + Our diligent team of engineers have been informed and they're rushing over - although not quite at the speed of our recently flying tram.\n\n\ + So while we all look in awe at the universe's mysterious sense of humour, please stand clear of the tracks and remember to stand behind the yellow line.", "Braking News") + set_travelling(TRUE) + set_controls(LIFT_PLATFORM_LOCKED) + dispatch_tram(destination_platform = push_destination) + set_operational(FALSE) + return push_destination diff --git a/code/modules/industrial_lift/tram/tram_machinery.dm b/code/modules/industrial_lift/tram/tram_machinery.dm index 4147b35d874aa..2e4399cce7028 100644 --- a/code/modules/industrial_lift/tram/tram_machinery.dm +++ b/code/modules/industrial_lift/tram/tram_machinery.dm @@ -14,6 +14,7 @@ GLOBAL_LIST_EMPTY(tram_doors) circuit = /obj/item/circuitboard/computer/tram_controls flags_1 = NODECONSTRUCT_1 | SUPERMATTER_IGNORES_1 resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON|INTERACT_MACHINE_SET_MACHINE light_color = COLOR_BLUE_LIGHT light_range = 0 //we dont want to spam SSlighting with source updates every movement @@ -61,11 +62,32 @@ GLOBAL_LIST_EMPTY(tram_doors) /obj/machinery/computer/tram_controls/ui_interact(mob/user, datum/tgui/ui) . = ..() + if(!user.can_read(src, reading_check_flags = READING_CHECK_LITERACY)) + try_illiterate_movement(user) + return ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "TramControl", name) ui.open() +/// Traverse to a random location after some time +/obj/machinery/computer/tram_controls/proc/try_illiterate_movement(mob/user) + var/datum/lift_master/tram/tram_lift = tram_ref?.resolve() + if (!tram_lift || tram_lift.travelling) + return + user.visible_message(span_notice("[user] starts mashing buttons at random!")) + if(!do_after(user, 5 SECONDS, target = src)) + return + if (!tram_lift || tram_lift.travelling) + to_chat(user, span_warning("The screen displays a flashing error message, but you can't comprehend it.")) + return // Broke or started moving during progress bar + var/list/all_destinations = GLOB.tram_landmarks[specific_lift_id] || list() + var/list/possible_destinations = all_destinations.Copy() - tram_lift.idle_platform + if (!length(possible_destinations)) + to_chat(user, span_warning("The screen displays a flashing error message, but you can't comprehend it.")) + return // No possible places to end up + try_send_tram(pick(possible_destinations)) + /obj/machinery/computer/tram_controls/ui_data(mob/user) var/datum/lift_master/tram/tram_lift = tram_ref?.resolve() var/list/data = list() @@ -122,7 +144,8 @@ GLOBAL_LIST_EMPTY(tram_doors) return FALSE if(tram_part.controls_locked || tram_part.travelling) // someone else started already return FALSE - tram_part.tram_travel(destination_platform) + if(!tram_part.tram_travel(destination_platform)) + return FALSE // lift_master failure say("The next station is: [destination_platform.name]") update_appearance() return TRUE @@ -369,13 +392,14 @@ GLOBAL_LIST_EMPTY(tram_doors) if(tram_part) UnregisterSignal(tram_part, COMSIG_TRAM_SET_TRAVELLING) -/obj/machinery/crossing_signal/emag_act(mob/living/user) +/obj/machinery/crossing_signal/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE balloon_alert(user, "disabled motion sensors") if(signal_state != XING_STATE_MALF) set_signal_state(XING_STATE_MALF) obj_flags |= EMAGGED + return TRUE /obj/machinery/crossing_signal/proc/start_malfunction() if(signal_state != XING_STATE_MALF) @@ -389,6 +413,10 @@ GLOBAL_LIST_EMPTY(tram_doors) malfunctioning = FALSE process() +/obj/machinery/crossing_signal/proc/temp_malfunction() + start_malfunction() + addtimer(CALLBACK(src, PROC_REF(end_malfunction)), 15 SECONDS) + /** * Finds the tram, just like the tram computer * @@ -669,44 +697,44 @@ GLOBAL_LIST_EMPTY(tram_doors) return PROCESS_KILL if(!tram.travelling) - if(istype(tram.idle_platform, /obj/effect/landmark/tram/tramstation/west)) + if(istype(tram.idle_platform, /obj/effect/landmark/tram/platform/tramstation/west)) icon_state = "[base_icon_state][DESTINATION_WEST_IDLE]" light_mask = "[base_icon_state][DESTINATION_WEST_IDLE]_e" previous_destination = tram.idle_platform update_appearance() return PROCESS_KILL - if(istype(tram.idle_platform, /obj/effect/landmark/tram/tramstation/central)) + if(istype(tram.idle_platform, /obj/effect/landmark/tram/platform/tramstation/central)) icon_state = "[base_icon_state][DESTINATION_CENTRAL_IDLE]" light_mask = "[base_icon_state][DESTINATION_CENTRAL_IDLE]_e" previous_destination = tram.idle_platform update_appearance() return PROCESS_KILL - if(istype(tram.idle_platform, /obj/effect/landmark/tram/tramstation/east)) + if(istype(tram.idle_platform, /obj/effect/landmark/tram/platform/tramstation/east)) icon_state = "[base_icon_state][DESTINATION_EAST_IDLE]" light_mask = "[base_icon_state][DESTINATION_EAST_IDLE]_e" previous_destination = tram.idle_platform update_appearance() return PROCESS_KILL - if(istype(tram.idle_platform, /obj/effect/landmark/tram/tramstation/west)) + if(istype(tram.idle_platform, /obj/effect/landmark/tram/platform/tramstation/west)) icon_state = "[base_icon_state][DESTINATION_WEST_ACTIVE]" light_mask = "[base_icon_state][DESTINATION_WEST_ACTIVE]_e" update_appearance() return PROCESS_KILL - if(istype(tram.idle_platform, /obj/effect/landmark/tram/tramstation/central)) - if(istype(previous_destination, /obj/effect/landmark/tram/tramstation/west)) + if(istype(tram.idle_platform, /obj/effect/landmark/tram/platform/tramstation/central)) + if(istype(previous_destination, /obj/effect/landmark/tram/platform/tramstation/west)) icon_state = "[base_icon_state][DESTINATION_CENTRAL_EASTBOUND_ACTIVE]" light_mask = "[base_icon_state][DESTINATION_CENTRAL_EASTBOUND_ACTIVE]_e" - if(istype(previous_destination, /obj/effect/landmark/tram/tramstation/east)) + if(istype(previous_destination, /obj/effect/landmark/tram/platform/tramstation/east)) icon_state = "[base_icon_state][DESTINATION_CENTRAL_WESTBOUND_ACTIVE]" light_mask = "[base_icon_state][DESTINATION_CENTRAL_WESTBOUND_ACTIVE]_e" update_appearance() return PROCESS_KILL - if(istype(tram.idle_platform, /obj/effect/landmark/tram/tramstation/east)) + if(istype(tram.idle_platform, /obj/effect/landmark/tram/platform/tramstation/east)) icon_state = "[base_icon_state][DESTINATION_EAST_ACTIVE]" light_mask = "[base_icon_state][DESTINATION_EAST_ACTIVE]_e" update_appearance() diff --git a/code/modules/industrial_lift/tram/tram_remote.dm b/code/modules/industrial_lift/tram/tram_remote.dm index d29d595e08dd3..abb3b430e1813 100644 --- a/code/modules/industrial_lift/tram/tram_remote.dm +++ b/code/modules/industrial_lift/tram/tram_remote.dm @@ -1,5 +1,3 @@ -#define TRAMCTRL_INBOUND 1 -#define TRAMCTRL_OUTBOUND 0 #define TRAMCTRL_FAST 1 #define TRAMCTRL_SAFE 0 @@ -13,7 +11,7 @@ desc = "A remote control that can be linked to a tram. This can only go well." w_class = WEIGHT_CLASS_TINY ///desired tram direction - var/direction = TRAMCTRL_INBOUND + var/direction = INBOUND ///fast and fun, or safe and boring var/mode = TRAMCTRL_FAST ///weakref to the tram piece we control @@ -37,10 +35,10 @@ ///set tram control direction /obj/item/tram_remote/attack_self_secondary(mob/user) switch(direction) - if(TRAMCTRL_INBOUND) - direction = TRAMCTRL_OUTBOUND - if(TRAMCTRL_OUTBOUND) - direction = TRAMCTRL_INBOUND + if(INBOUND) + direction = OUTBOUND + if(OUTBOUND) + direction = INBOUND update_appearance() balloon_alert(user, "[direction ? "< inbound" : "outbound >"]") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN @@ -77,9 +75,9 @@ icon_state = "tramremote_nis" return switch(direction) - if(TRAMCTRL_INBOUND) + if(INBOUND) icon_state = "tramremote_ib" - if(TRAMCTRL_OUTBOUND) + if(OUTBOUND) icon_state = "tramremote_ob" /obj/item/tram_remote/update_overlays() @@ -107,9 +105,9 @@ var/destination_platform = null var/platform = 0 switch(direction) - if(TRAMCTRL_INBOUND) + if(INBOUND) platform = clamp(tram_part.idle_platform.platform_code - 1, 1, INFINITY) - if(TRAMCTRL_OUTBOUND) + if(OUTBOUND) platform = clamp(tram_part.idle_platform.platform_code + 1, 1, INFINITY) if(platform == tram_part.idle_platform.platform_code) balloon_alert(user, "invalid command!") @@ -148,7 +146,5 @@ balloon_alert(user, "link failed!") update_appearance() -#undef TRAMCTRL_INBOUND -#undef TRAMCTRL_OUTBOUND #undef TRAMCTRL_FAST #undef TRAMCTRL_SAFE diff --git a/code/modules/industrial_lift/tram/tram_walls.dm b/code/modules/industrial_lift/tram/tram_walls.dm index f52e75c23bbac..c8bf7e970b521 100644 --- a/code/modules/industrial_lift/tram/tram_walls.dm +++ b/code/modules/industrial_lift/tram/tram_walls.dm @@ -35,7 +35,7 @@ /obj/structure/tramwall/attackby(obj/item/welder, mob/user, params) if(welder.tool_behaviour == TOOL_WELDER) - if(!welder.tool_start_check(user, amount=0)) + if(!welder.tool_start_check(user, amount=round(slicing_duration / 50))) return FALSE to_chat(user, span_notice("You begin slicing through the outer plating...")) diff --git a/code/modules/industrial_lift/tram/tram_windows.dm b/code/modules/industrial_lift/tram/tram_windows.dm index a837a94e4f5b1..55ec5aa283fca 100644 --- a/code/modules/industrial_lift/tram/tram_windows.dm +++ b/code/modules/industrial_lift/tram/tram_windows.dm @@ -3,6 +3,9 @@ desc = "A window made out of a titanium-silicate alloy. It looks tough to break. Is that a challenge?" icon = 'icons/obj/smooth_structures/tram_window.dmi' icon_state = "tram_mid" + smoothing_flags = SMOOTH_BITMASK|SMOOTH_BORDER_OBJECT + canSmoothWith = SMOOTH_GROUP_WINDOW_DIRECTIONAL_TRAM + smoothing_groups = SMOOTH_GROUP_WINDOW_DIRECTIONAL_TRAM reinf = TRUE heat_resistance = 1600 armor_type = /datum/armor/window_tram @@ -12,6 +15,39 @@ rad_insulation = RAD_MEDIUM_INSULATION glass_material_datum = /datum/material/alloy/titaniumglass +/obj/structure/window/reinforced/tram/Initialize(mapload, direct) + . = ..() + setDir(dir) + +/obj/structure/window/reinforced/tram/setDir(new_dir) + . = ..() + if(fulltile) + return + if(dir & NORTH) + layer = LOW_ITEM_LAYER + else + layer = BELOW_OBJ_LAYER + if(dir & SOUTH) + SET_PLANE_IMPLICIT(src, WALL_PLANE_UPPER) + else + SET_PLANE_IMPLICIT(src, GAME_PLANE) + +/obj/structure/window/reinforced/tram/set_smoothed_icon_state(new_junction) + if(fulltile) + return ..() + smoothing_junction = new_junction + var/go_off = reverse_ndir(smoothing_junction) + var/smooth_left = (go_off & turn(dir, 90)) + var/smooth_right = (go_off & turn(dir, -90)) + if(smooth_left && smooth_right) + icon_state = "tram_mid" + else if (smooth_left) + icon_state = "tram_left" + else if (smooth_right) + icon_state = "tram_right" + else + icon_state = "tram_mid" + /obj/structure/window/reinforced/tram/front name = "tram wall" desc = "A lightweight titanium composite structure with a windscreen installed." @@ -19,35 +55,14 @@ base_icon_state = "tram_window" wtype = "shuttle" fulltile = TRUE + smoothing_flags = NONE + canSmoothWith = null + smoothing_groups = SMOOTH_GROUP_WINDOW_DIRECTIONAL_TRAM flags_1 = PREVENT_CLICK_UNDER_1 explosion_block = 3 glass_amount = 2 receive_ricochet_chance_mod = 1.2 -/obj/structure/window/reinforced/tram/left/directional/north - icon_state = "tram_left" - layer = LOW_ITEM_LAYER - -/obj/structure/window/reinforced/tram/left/directional/south - icon_state = "tram_left" - plane = WALL_PLANE_UPPER - -/obj/structure/window/reinforced/tram/mid/directional/north - icon_state = "tram_mid" - layer = LOW_ITEM_LAYER - -/obj/structure/window/reinforced/tram/mid/directional/south - icon_state = "tram_mid" - plane = WALL_PLANE_UPPER - -/obj/structure/window/reinforced/tram/right/directional/north - icon_state = "tram_right" - layer = LOW_ITEM_LAYER - -/obj/structure/window/reinforced/tram/right/directional/south - icon_state = "tram_right" - plane = WALL_PLANE_UPPER - /datum/armor/window_tram melee = 80 bullet = 5 @@ -55,6 +70,4 @@ fire = 99 acid = 100 -MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tram/left, 0) -MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tram/mid, 0) -MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tram/right, 0) +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tram, 0) diff --git a/code/modules/instruments/items.dm b/code/modules/instruments/items.dm index e5119377c3783..8c5852b54bfa1 100644 --- a/code/modules/instruments/items.dm +++ b/code/modules/instruments/items.dm @@ -246,6 +246,7 @@ name = "instrument delivery beacon" desc = "Summon your tool of art." icon_state = "gangtool-red" + w_class = WEIGHT_CLASS_TINY /obj/item/choice_beacon/music/generate_display_names() var/static/list/instruments diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index 451404d1d92b2..7502165f811fc 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -6,6 +6,8 @@ return TRUE if(result_bitflags & COMPONENT_OBJ_DISALLOW) // override all other checks return FALSE + if(HAS_TRAIT(accessor, TRAIT_ALWAYS_NO_ACCESS)) + return FALSE //check if it doesn't require any access at all if(check_access(null)) return TRUE @@ -42,7 +44,7 @@ var/obj/item/mmi/brain_mmi = accessor.loc if(ismecha(brain_mmi.loc)) var/obj/vehicle/sealed/mecha/big_stompy_robot = brain_mmi.loc - return check_access_list(big_stompy_robot.operation_req_access) + return check_access_list(big_stompy_robot.accesses) return FALSE /obj/item/proc/GetAccess() diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index 7a0395849c54e..cd53991878bad 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -103,7 +103,7 @@ /// 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_BOLD_SELECT_TEXT | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN | JOB_CANNOT_OPEN_SLOTS) var/job_flags = NONE /// Multiplier for general usage of the voice of god. @@ -127,6 +127,9 @@ /// custom ringtone for this job var/job_tone + /// Minimal character age for this job + var/required_character_age + /datum/job/New() . = ..() @@ -166,6 +169,8 @@ for(var/i in roundstart_experience) spawned_human.mind.adjust_experience(i, roundstart_experience[i], TRUE) +/// Announce that this job as joined the round to all crew members. +/// Note the joining mob has no client at this point. /datum/job/proc/announce_job(mob/living/joining_mob) if(head_announce) announce_head(joining_mob, head_announce) @@ -179,13 +184,21 @@ /mob/living/proc/on_job_equipping(datum/job/equipping) return +#define VERY_LATE_ARRIVAL_TOAST_PROB 20 + /mob/living/carbon/human/on_job_equipping(datum/job/equipping) var/datum/bank_account/bank_account = new(real_name, equipping, dna.species.payday_modifier) bank_account.payday(STARTING_PAYCHECKS, TRUE) account_id = bank_account.account_id bank_account.replaceable = FALSE + add_mob_memory(/datum/memory/key/account, remembered_id = account_id) + dress_up_as_job(equipping) + if(EMERGENCY_PAST_POINT_OF_NO_RETURN && prob(VERY_LATE_ARRIVAL_TOAST_PROB)) + equip_to_slot_or_del(new /obj/item/food/griddle_toast(src), ITEM_SLOT_MASK) + +#undef VERY_LATE_ARRIVAL_TOAST_PROB /mob/living/proc/dress_up_as_job(datum/job/equipping, visual_only = FALSE) return @@ -255,8 +268,38 @@ 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.") +/// Gets the message that shows up when spawning as this job +/datum/job/proc/get_spawn_message() + SHOULD_NOT_OVERRIDE(TRUE) + return examine_block(span_infoplain(jointext(get_spawn_message_information(), "\n• "))) + +/// Returns a list of strings that correspond to chat messages sent to this mob when they join the round. +/datum/job/proc/get_spawn_message_information() + SHOULD_CALL_PARENT(TRUE) + var/list/info = list() + info += "You are the [title].\n" + var/related_policy = get_policy(title) + var/radio_info = get_radio_information() + if(related_policy) + info += related_policy + if(supervisors) + info += "As the [title] you answer directly to [supervisors]. Special circumstances may change this." + if(radio_info) + info += radio_info + if(req_admin_notify) + info += "You are playing a job that is important for Game Progression. \ + If you have to disconnect, please notify the admins via adminhelp." + if(CONFIG_GET(number/minimal_access_threshold)) + info += span_boldnotice("As this station was initially staffed with a \ + [CONFIG_GET(flag/jobs_have_minimal_access) ? "full crew, only your job's necessities" : "skeleton crew, additional access may"] \ + have been added to your ID card.") + + return info + +/// Returns information pertaining to this job's radio. +/datum/job/proc/get_radio_information() + if(job_flags & JOB_CREW_MEMBER) + return "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" @@ -276,6 +319,7 @@ var/backpack = /obj/item/storage/backpack var/satchel = /obj/item/storage/backpack/satchel var/duffelbag = /obj/item/storage/backpack/duffelbag + var/messenger = /obj/item/storage/backpack/messenger var/pda_slot = ITEM_SLOT_BELT @@ -290,10 +334,14 @@ back = /obj/item/storage/backpack/duffelbag //Grey Duffel bag if(LSATCHEL) back = /obj/item/storage/backpack/satchel/leather //Leather Satchel + if(GMESSENGER) + back = /obj/item/storage/backpack/messenger //Grey messenger bag if(DSATCHEL) back = satchel //Department satchel if(DDUFFELBAG) back = duffelbag //Department duffel bag + if(DMESSENGER) + back = messenger //Department messenger bag else back = backpack //Department backpack @@ -344,8 +392,7 @@ var/obj/item/modular_computer/pda/pda = equipped.get_item_by_slot(pda_slot) if(istype(pda)) - pda.saved_identification = equipped.real_name - pda.saved_job = equipped_job.title + pda.imprint_id(equipped.real_name, equipped_job.title) pda.update_ringtone(equipped_job.job_tone) pda.UpdateDisplay() @@ -503,7 +550,8 @@ return apply_pref_name(/datum/preference/name/ai, player_client) // This proc already checks if the player is appearance banned. set_core_display_icon(null, player_client) - + apply_pref_emote_display(player_client) + apply_pref_hologram_display(player_client) /mob/living/silicon/robot/apply_prefs_job(client/player_client, datum/job/job) if(mmi) diff --git a/code/modules/jobs/job_types/ai.dm b/code/modules/jobs/job_types/ai.dm index 22763cee110d3..e232ef0f022ef 100644 --- a/code/modules/jobs/job_types/ai.dm +++ b/code/modules/jobs/job_types/ai.dm @@ -19,7 +19,7 @@ /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 | JOB_BOLD_SELECT_TEXT | JOB_CANNOT_OPEN_SLOTS var/do_special_check = TRUE config_tag = "AI" @@ -93,5 +93,5 @@ /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.") +/datum/job/ai/get_radio_information() + return "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 e45dc5af25a0f..605a77ca83ac1 100644 --- a/code/modules/jobs/job_types/assistant.dm +++ b/code/modules/jobs/job_types/assistant.dm @@ -33,7 +33,7 @@ Assistant /obj/item/crowbar/large = 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 + job_flags = STATION_JOB_FLAGS rpg_title = "Lout" config_tag = "ASSISTANT" @@ -45,6 +45,12 @@ Assistant /datum/outfit/job/assistant/pre_equip(mob/living/carbon/human/target) ..() + for(var/holidayname in GLOB.holidays) + var/datum/holiday/holiday_today = GLOB.holidays[holidayname] + var/obj/item/special_hat = holiday_today.holiday_hat + if(prob(HOLIDAY_HAT_CHANCE) && !isnull(special_hat) && isnull(head)) + head = special_hat + give_jumpsuit(target) /datum/outfit/job/assistant/proc/give_jumpsuit(mob/living/carbon/human/target) diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm index b5c38f4fe5892..d016688042a86 100644 --- a/code/modules/jobs/job_types/atmospheric_technician.dm +++ b/code/modules/jobs/job_types/atmospheric_technician.dm @@ -35,7 +35,7 @@ /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 + job_flags = STATION_JOB_FLAGS rpg_title = "Aeromancer" /datum/outfit/job/atmos @@ -44,6 +44,7 @@ id_trim = /datum/id_trim/job/atmospheric_technician uniform = /obj/item/clothing/under/rank/engineering/atmospheric_technician + suit = /obj/item/clothing/suit/atmos_overalls belt = /obj/item/storage/belt/utility/atmostech ears = /obj/item/radio/headset/headset_eng l_pocket = /obj/item/modular_computer/pda/atmos @@ -52,6 +53,7 @@ backpack = /obj/item/storage/backpack/industrial satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering + messenger = /obj/item/storage/backpack/messenger/eng box = /obj/item/storage/box/survival/engineer pda_slot = ITEM_SLOT_LPOCKET @@ -59,6 +61,7 @@ /datum/outfit/job/atmos/mod name = "Atmospheric Technician (MODsuit)" + suit = null suit_store = /obj/item/tank/internals/oxygen back = /obj/item/mod/control/pre_equipped/atmospheric mask = /obj/item/clothing/mask/gas/atmos diff --git a/code/modules/jobs/job_types/bartender.dm b/code/modules/jobs/job_types/bartender.dm index ec526e10d915f..13a4162ff3be9 100644 --- a/code/modules/jobs/job_types/bartender.dm +++ b/code/modules/jobs/job_types/bartender.dm @@ -29,7 +29,7 @@ /obj/item/stack/sheet/mineral/uranium = 10, ) - 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 + job_flags = STATION_JOB_FLAGS rpg_title = "Tavernkeeper" /datum/job/bartender/award_service(client/winner, award) @@ -48,7 +48,8 @@ jobtype = /datum/job/bartender id_trim = /datum/id_trim/job/bartender - uniform = /obj/item/clothing/under/rank/civilian/bartender + neck = /obj/item/clothing/neck/bowtie + uniform = /obj/item/clothing/under/costume/buttondown/slacks/service suit = /obj/item/clothing/suit/armor/vest backpack_contents = list( /obj/item/storage/box/beanbag = 1, diff --git a/code/modules/jobs/job_types/botanist.dm b/code/modules/jobs/job_types/botanist.dm index 9486cc6e4c30e..7ccc4b31ceb75 100644 --- a/code/modules/jobs/job_types/botanist.dm +++ b/code/modules/jobs/job_types/botanist.dm @@ -36,7 +36,7 @@ /obj/item/food/monkeycube/bee = 2 ) - 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 + job_flags = STATION_JOB_FLAGS rpg_title = "Gardener" /datum/outfit/job/botanist @@ -54,3 +54,4 @@ backpack = /obj/item/storage/backpack/botany satchel = /obj/item/storage/backpack/satchel/hyd duffelbag = /obj/item/storage/backpack/duffelbag/hydroponics + messenger = /obj/item/storage/backpack/messenger/hyd diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index 74f9ecd286f9c..d8fc96de06450 100644 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -42,7 +42,7 @@ /obj/item/skillchip/sabrage = 5, ) - 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 = STATION_JOB_FLAGS | JOB_BOLD_SELECT_TEXT | JOB_CANNOT_OPEN_SLOTS rpg_title = "Star Duke" voice_of_god_power = 1.4 //Command staff has authority @@ -51,6 +51,9 @@ /datum/job/captain/get_captaincy_announcement(mob/living/captain) return "Captain [captain.real_name] on deck!" +/datum/job/captain/get_radio_information() + . = ..() + . += "\nYou have access to all radio channels, but they are not automatically tuned. Check your radio for more information." /datum/outfit/job/captain name = "Captain" @@ -75,6 +78,7 @@ backpack = /obj/item/storage/backpack/captain satchel = /obj/item/storage/backpack/satchel/cap duffelbag = /obj/item/storage/backpack/duffelbag/captain + messenger = /obj/item/storage/backpack/messenger/cap accessory = /obj/item/clothing/accessory/medal/gold/captain chameleon_extras = list( diff --git a/code/modules/jobs/job_types/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm index 318eb695e2dfe..dd269bc7e3736 100644 --- a/code/modules/jobs/job_types/cargo_technician.dm +++ b/code/modules/jobs/job_types/cargo_technician.dm @@ -33,7 +33,7 @@ /obj/item/gun/ballistic/automatic/wt550 = 1, ) rpg_title = "Merchantman" - 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 + job_flags = STATION_JOB_FLAGS /datum/outfit/job/cargo_tech @@ -46,6 +46,7 @@ id_trim = /datum/id_trim/job/cargo_technician uniform = /obj/item/clothing/under/rank/cargo/tech belt = /obj/item/modular_computer/pda/cargo + suit = /obj/item/clothing/suit/toggle/cargo_tech ears = /obj/item/radio/headset/headset_cargo l_hand = /obj/item/universal_scanner diff --git a/code/modules/jobs/job_types/chaplain/chaplain.dm b/code/modules/jobs/job_types/chaplain/chaplain.dm index 4714bf589d43a..58821ec535876 100644 --- a/code/modules/jobs/job_types/chaplain/chaplain.dm +++ b/code/modules/jobs/job_types/chaplain/chaplain.dm @@ -25,13 +25,12 @@ mail_goodies = list( /obj/item/reagent_containers/cup/glass/bottle/holywater = 30, - /obj/item/toy/plush/awakenedplushie = 10, /obj/item/grenade/chem_grenade/holy = 5, /obj/item/toy/plush/narplush = 2, /obj/item/toy/plush/ratplush = 1 ) rpg_title = "Paladin" - 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 + job_flags = STATION_JOB_FLAGS voice_of_god_power = 2 //Chaplains are very good at speaking with the voice of god @@ -55,7 +54,7 @@ if(GLOB.bible_inhand_icon_state) holy_bible.inhand_icon_state = GLOB.bible_inhand_icon_state to_chat(human_spawned, span_boldnotice("There is already an established religion onboard the station. You are an acolyte of [GLOB.deity]. Defer to the Chaplain.")) - human_spawned.equip_to_slot_or_del(holy_bible, ITEM_SLOT_BACKPACK) + human_spawned.equip_to_slot_or_del(holy_bible, ITEM_SLOT_BACKPACK, indirect_action = TRUE) var/nrt = GLOB.holy_weapon_type || /obj/item/nullrod var/obj/item/nullrod/nullrod = new nrt(human_spawned) human_spawned.put_in_hands(nullrod) @@ -104,7 +103,7 @@ GLOB.bible_name = new_bible GLOB.deity = holy_bible.deity_name - human_spawned.equip_to_slot_or_del(holy_bible, ITEM_SLOT_BACKPACK) + human_spawned.equip_to_slot_or_del(holy_bible, ITEM_SLOT_BACKPACK, indirect_action = TRUE) SSblackbox.record_feedback("text", "religion_name", 1, "[new_religion]", 1) SSblackbox.record_feedback("text", "religion_deity", 1, "[new_deity]", 1) diff --git a/code/modules/jobs/job_types/chaplain/chaplain_costumes.dm b/code/modules/jobs/job_types/chaplain/chaplain_costumes.dm index 89879e4db7bb6..637177adffbcd 100644 --- a/code/modules/jobs/job_types/chaplain/chaplain_costumes.dm +++ b/code/modules/jobs/job_types/chaplain/chaplain_costumes.dm @@ -14,7 +14,6 @@ cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS armor_type = /datum/armor/chaplainsuit_armor - clothing_flags = BLOCKS_SHOVE_KNOCKDOWN strip_delay = 80 equip_delay_other = 60 @@ -51,6 +50,14 @@ body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS flags_inv = HIDEJUMPSUIT +/obj/item/clothing/suit/chaplainsuit/habit + name = "religious tunic" + desc = "No nunsene clothing." + icon_state = "habit" + alternate_worn_layer = GLOVES_LAYER // since the sleeves cover a part of the hands, this way it looks better while retaining glove overlay correctly. + body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS + flags_inv = HIDEJUMPSUIT + /obj/item/clothing/suit/chaplainsuit/bishoprobe name = "bishop's robes" desc = "Glad to see the tithes you collected were well spent." @@ -143,7 +150,6 @@ icon_state = "clockwork_cuirass" inhand_icon_state = null slowdown = 0 - clothing_flags = NONE /obj/item/clothing/head/helmet/chaplain name = "crusader helmet" @@ -172,7 +178,6 @@ icon_state = "knight_templar" inhand_icon_state = null slowdown = 0 - clothing_flags = NONE /obj/item/clothing/head/helmet/chaplain/cage name = "cage" diff --git a/code/modules/jobs/job_types/chaplain/chaplain_divine_archer.dm b/code/modules/jobs/job_types/chaplain/chaplain_divine_archer.dm index 48bdf25a22f26..49b130e069002 100644 --- a/code/modules/jobs/job_types/chaplain/chaplain_divine_archer.dm +++ b/code/modules/jobs/job_types/chaplain/chaplain_divine_archer.dm @@ -20,7 +20,6 @@ cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS armor_type = /datum/armor/chaplainsuit_armor_weaker - clothing_flags = BLOCKS_SHOVE_KNOCKDOWN strip_delay = 80 equip_delay_other = 60 hoodtype = /obj/item/clothing/head/hooded/chaplain_hood/divine_archer @@ -40,6 +39,7 @@ name = "divine archer hood" desc = "A divine hood included, because have you ever got the sun in your eyes during archery? Oh, it's just the worst." icon_state = "archerhood" + armor_type = /datum/armor/chaplainsuit_armor_weaker /// gloves /obj/item/clothing/gloves/divine_archer diff --git a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm index a3d90cc63cc43..a214eb48e0cc9 100644 --- a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm +++ b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm @@ -41,6 +41,11 @@ rods[nullrod_type] = initial(nullrod_type.menu_description) //special non-nullrod subtyped shit rods[/obj/item/gun/ballistic/bow/divine/with_quiver] = "A divine bow and 10 quivered holy arrows." + rods[/obj/item/organ/internal/cyberimp/arm/shard/scythe] = "A shard that implants itself into your arm, \ + allowing you to conjure forth a vorpal scythe. \ + Allows you to behead targets for empowered strikes. \ + Harms you if you dismiss the scythe without first causing harm to a creature. \ + The shard also causes you to become Morbid, shifting your interests towards the macabre." AddComponent(/datum/component/subtype_picker, rods, CALLBACK(src, PROC_REF(on_holy_weapon_picked))) /obj/item/nullrod/proc/on_holy_weapon_picked(obj/item/nullrod/holy_weapon_type) @@ -54,8 +59,7 @@ var/obj/effect/rune/target_rune = target if(target_rune.log_when_erased) - user.log_message("erased [target_rune.cultist_name] rune using a null rod", LOG_GAME) - message_admins("[ADMIN_LOOKUPFLW(user)] erased a [target_rune.cultist_name] rune with a null rod.") + user.log_message("erased [target_rune.cultist_name] rune using [src]", LOG_GAME) SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_NARNAR] = TRUE /obj/item/nullrod/suicide_act(mob/living/user) @@ -139,7 +143,7 @@ /obj/item/nullrod/claymore/darkblade name = "dark blade" desc = "Spread the glory of the dark gods!" - icon = 'icons/obj/cult/items_and_weapons.dmi' + icon = 'icons/obj/weapons/sword.dmi' icon_state = "cultblade" inhand_icon_state = "cultblade" worn_icon_state = "cultblade" @@ -244,31 +248,7 @@ span_suicide("You try to impale yourself with [src], but it's TOO HOLY...")) return SHAME -/obj/item/nullrod/scythe - name = "reaper scythe" - desc = "Ask not for whom the bell tolls..." - icon = 'icons/obj/hydroponics/equipment.dmi' - icon_state = "scythe1" - inhand_icon_state = "scythe1" - lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi' - w_class = WEIGHT_CLASS_BULKY - armour_penetration = 35 - slot_flags = ITEM_SLOT_BACK - sharpness = SHARP_EDGED - attack_verb_continuous = list("chops", "slices", "cuts", "reaps") - attack_verb_simple = list("chop", "slice", "cut", "reap") - menu_description = "A sharp scythe which partially penetrates armor. Very effective at butchering bodies. Can be worn on the back." - -/obj/item/nullrod/scythe/Initialize(mapload) - . = ..() - AddComponent(/datum/component/butchering, \ - speed = 7 SECONDS, \ - effectiveness = 110, \ - ) - AddElement(/datum/element/bane, mob_biotypes = MOB_PLANT, damage_multiplier = 0.5, requires_combat_mode = FALSE) - -/obj/item/nullrod/scythe/vibro +/obj/item/nullrod/vibro name = "high frequency blade" desc = "Bad references are the DNA of the soul." icon = 'icons/obj/weapons/sword.dmi' @@ -277,12 +257,24 @@ worn_icon_state = "hfrequency0" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + w_class = WEIGHT_CLASS_BULKY + armour_penetration = 35 + slot_flags = ITEM_SLOT_BACK + sharpness = SHARP_EDGED attack_verb_continuous = list("chops", "slices", "cuts", "zandatsu's") attack_verb_simple = list("chop", "slice", "cut", "zandatsu") hitsound = 'sound/weapons/rapierhit.ogg' menu_description = "A sharp blade which partially penetrates armor. Very effective at butchering bodies. Can be worn on the back." -/obj/item/nullrod/scythe/spellblade +/obj/item/nullrod/vibro/Initialize(mapload) + . = ..() + AddComponent( + /datum/component/butchering, \ + speed = 7 SECONDS, \ + effectiveness = 110, \ + ) + +/obj/item/nullrod/vibro/spellblade name = "dormant spellblade" desc = "The blade grants the wielder nearly limitless power...if they can figure out how to turn it on, that is." icon = 'icons/obj/weapons/guns/magic.dmi' @@ -294,7 +286,7 @@ hitsound = 'sound/weapons/rapierhit.ogg' menu_description = "A sharp blade which partially penetrates armor. Very effective at butchering bodies. Can be worn on the back." -/obj/item/nullrod/scythe/talking +/obj/item/nullrod/vibro/talking name = "possessed blade" desc = "When the station falls into chaos, it's nice to have a friend by your side." icon = 'icons/obj/weapons/sword.dmi' @@ -308,11 +300,11 @@ hitsound = 'sound/weapons/rapierhit.ogg' menu_description = "A sharp blade which partially penetrates armor. Able to awaken a friendly spirit to provide guidance. Very effective at butchering bodies. Can be worn on the back." -/obj/item/nullrod/scythe/talking/Initialize(mapload) +/obj/item/nullrod/vibro/talking/Initialize(mapload) . = ..() AddComponent(/datum/component/spirit_holding) -/obj/item/nullrod/scythe/talking/chainsword +/obj/item/nullrod/vibro/talking/chainsword name = "possessed chainsaw sword" desc = "Suffer not a heretic to live." icon_state = "chainswordon" @@ -377,7 +369,7 @@ /obj/item/nullrod/clown name = "clown dagger" desc = "Used for absolutely hilarious sacrifices." - icon = 'icons/obj/wizard.dmi' + icon = 'icons/obj/weapons/khopesh.dmi' icon_state = "clownrender" inhand_icon_state = "cultdagger" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' diff --git a/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm b/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm new file mode 100644 index 0000000000000..3e752910a29d7 --- /dev/null +++ b/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm @@ -0,0 +1,209 @@ +/*Vorpal Scythe, or the implant null rod that isn't as strong as other null rods up until you use it to behead someone with the special death knell attack. +If the scythe isn't empowered when you sheath it, you take a heap of damage and probably a wound!*/ + +#define SCYTHE_WEAK 0 +#define SCYTHE_SATED 1 +#define SCYTHE_EMPOWERED 2 + +/obj/item/organ/internal/cyberimp/arm/shard/scythe + name = "sinister shard" + desc = "This shard seems to be directly linked to some sinister entity. It might be your god! It also gives you a really horrible rash when you hold onto it for too long." + items_to_create = list(/obj/item/vorpalscythe) + +/obj/item/organ/internal/cyberimp/arm/shard/scythe/Insert(mob/living/carbon/receiver, special, drop_if_replaced) + . = ..() + if(receiver.mind) + ADD_TRAIT(receiver.mind, TRAIT_MORBID, ORGAN_TRAIT) + +/obj/item/organ/internal/cyberimp/arm/shard/scythe/Retract() + var/obj/item/vorpalscythe/scythe = active_item + if(!scythe) + return FALSE + + var/obj/item/bodypart/part = hand + if(isnull(part) || scythe.empowerment >= SCYTHE_SATED) + return ..() + + to_chat(owner, span_userdanger("[scythe] tears into you for your unworthy display of arrogance!")) + playsound(owner, 'sound/magic/demon_attack1.ogg', 50, TRUE) + part.receive_damage(brute = 25, wound_bonus = 10, sharpness = SHARP_EDGED) + return ..() + +/obj/item/vorpalscythe + name = "vorpal scythe" + desc = "Reap what you sow." + icon = 'icons/obj/weapons/staff.dmi' + icon_state = "vorpalscythe" + inhand_icon_state = "vorpalscythe" + worn_icon_state = null + lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi' + righthand_file = 'icons/mob/inhands/64x64_righthand.dmi' + inhand_x_dimension = 64 + inhand_y_dimension = 64 + w_class = WEIGHT_CLASS_GIGANTIC + force = 10 //a lot worse than most nullrods initially. Why did you invest so much into making it vorpal, you dork. + armour_penetration = 50 //Very good armor penetration to make up for our abysmal force + reach = 2 //why yes, this does have reach + slot_flags = null + sharpness = SHARP_EDGED + attack_verb_continuous = list("chops", "slices", "cuts", "reaps") + attack_verb_simple = list("chop", "slice", "cut", "reap") + wound_bonus = 10 + bare_wound_bonus = 15 + /*What state is our scythe in? + + If it is SCYTHE_WEAK, it will harm our reaper on being sheathed. + + if it is SCYTHE_SATED, it will be able to sheath for 4 minutes. Gained from hitting a mob or performing the death knell on mindless humans. + + If it is SCYTHE_EMPOWERED, we've performed the death knell on a human with a mind. Lets you sheath for 2 minutes and grants additional force.*/ + var/empowerment = SCYTHE_WEAK + ///Our bonus to force after we have death knelled. Lasts approximately 2 minutes. + var/bonus_force_multiplier = 2 + ///Our initial force before empowerment. For tracking on the item, and in case the item somehow gains more force for some reason before we death knelled. + var/original_force + +/obj/item/vorpalscythe/examine(mob/user) + . = ..() + . += span_notice("You can perform a death knell using [src] on a human with Right-Click. If they were sentient (whether currently or at some point), [src] is empowered on a successful death knell.") + . += span_notice("[src] seems to have quite a bit of reach. You might be able to hit things from further away.") + + var/current_empowerment = empowerment + switch(current_empowerment) + if(SCYTHE_EMPOWERED) + . += span_notice("[src] is empowered and humming with energy.") + if(SCYTHE_SATED) + . += span_notice("[src] is sated, but still demands more. Perform the death knell!") + else + . += span_notice("[src] is still. Anticipating the strike. Best not anger it by denying it the opportuntiy to taste blood.") + +/obj/item/vorpalscythe/Initialize(mapload) + . = ..() + AddComponent(/datum/component/anti_magic, MAGIC_RESISTANCE|MAGIC_RESISTANCE_HOLY) + AddComponent(/datum/component/effect_remover, \ + success_feedback = "You disrupt the magic of %THEEFFECT with %THEWEAPON.", \ + success_forcesay = "TO DUST WITH YE!! AWAY!!", \ + tip_text = "Clear rune", \ + on_clear_callback = CALLBACK(src, PROC_REF(on_cult_rune_removed)), \ + effects_we_clear = list(/obj/effect/rune, /obj/effect/heretic_rune) \ + ) + AddComponent( + /datum/component/butchering, \ + speed = 3 SECONDS, \ + effectiveness = 125, \ + ) + AddElement(/datum/element/bane, mob_biotypes = MOB_PLANT, damage_multiplier = 0.5, requires_combat_mode = FALSE) //less good at killing revenants, much better at killing plants + +/obj/item/vorpalscythe/attack(mob/living/target, mob/living/user, params) + if(ismonkey(target) && !target.mind) //Don't empower from hitting monkeys. Hit a corgi or something, I don't know. + return ..() + + if(target.stat < DEAD && target != user) + scythe_empowerment(SCYTHE_SATED) + + return ..() + +//Borrows some amputation shear code, but much more specific +/obj/item/vorpalscythe/attack_secondary(mob/living/victim, mob/living/user, params) + if(!iscarbon(victim) || user.combat_mode) + return SECONDARY_ATTACK_CALL_NORMAL + + if(user.zone_selected != BODY_ZONE_HEAD) + return SECONDARY_ATTACK_CALL_NORMAL + + var/mob/living/carbon/potential_reaping = victim + + if(HAS_TRAIT(potential_reaping, TRAIT_NODISMEMBER)) + to_chat(user, span_warning("You do not think you can behead this creature...")) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + var/head_name + var/obj/item/bodypart/head/reaped_head + + reaped_head = potential_reaping.get_bodypart(check_zone(user.zone_selected)) + if(!reaped_head) + to_chat(user, span_warning("There is no head to reap.")) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + head_name = reaped_head.name + + //We're tracking this separately from empowerment so that we can use it to determine whether or not we haunt the heads we cut off. + var/potential_empowerment = SCYTHE_EMPOWERED + + if(!potential_reaping.mind) //We put this here juuuust in case there is something funky with ling checks + if(ismonkey(potential_reaping)) + to_chat(user, span_warning("A pointless existence. You'll get no benefit from this death knell beyond the satisfaction of beheading this foul thing.")) + potential_empowerment = SCYTHE_WEAK + else + to_chat(user, span_warning("This soul is almost nonexistent. But [src] can still gain something from this sacrifice. A puppet.")) + potential_empowerment = SCYTHE_SATED + + var/death_knell_speed_mod = 1 + + potential_reaping.visible_message(span_danger("[user] begins to raise [src] arove [potential_reaping]'s [head_name]."), span_userdanger("[user] begins to raise [src], aiming to slice off your [head_name]!")) + if(potential_reaping.stat >= UNCONSCIOUS || HAS_TRAIT(potential_reaping, TRAIT_INCAPACITATED)) //if the victim is incapacitated (due to paralysis, a stun, being in staminacrit, etc.), critted, unconscious, or dead, it's much easier to properly behead + death_knell_speed_mod *= 0.5 + if(potential_reaping.stat != DEAD && potential_reaping.has_status_effect(/datum/status_effect/jitter)) //jittering will make it harder to perform the death knell, even if they're still + death_knell_speed_mod *= 1.5 //Staminacritting someone who's jittering (from, say, a stun baton) won't give you enough time to slice their head off, but staminacritting someone who isn't jittering will + if(empowerment == SCYTHE_EMPOWERED) //That said, if heads are already rolling, why stop here? + death_knell_speed_mod *= 0.5 + if(ispodperson(potential_reaping) || ismonkey(potential_reaping)) //And if they're a podperson or monkey, they can just die. + death_knell_speed_mod *= 0.5 + + if(do_after(user, 15 SECONDS * death_knell_speed_mod, target = potential_reaping)) + playsound(get_turf(potential_reaping), 'sound/weapons/bladeslice.ogg', 250, TRUE) + reaped_head.dismember() + user.visible_message(span_danger("[user] swings the [src] down, slicing [potential_reaping]'s [head_name] clean off! You think the [src] may have grown stronger!"), span_notice("As you perform the death knell on [potential_reaping], the [src] gains power! For a time...")) + if(potential_empowerment == SCYTHE_SATED) //We don't want actual player heads to go wandering off, but it'll be funny if a bunch of monkeyhuman heads started floating around + reaped_head.AddComponent(/datum/component/haunted_item, \ + haunt_color = "#7be595", \ + haunt_duration = 1 MINUTES, \ + aggro_radius = null, \ + spawn_message = span_revenwarning("[reaped_head] shudders and rises up into the air in a pale green nimbus!"), \ + despawn_message = span_revenwarning("[reaped_head] falls back to the ground, stationary once more."), \ + throw_force_bonus = 0, \ + throw_force_max = 0, \ + ) + + scythe_empowerment(potential_empowerment) + + if(HAS_MIND_TRAIT(user, TRAIT_MORBID)) //You feel good about yourself, pal? + user.add_mood_event("morbid_dismemberment", /datum/mood_event/morbid_dismemberment) + + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/item/vorpalscythe/proc/scythe_empowerment(potential_empowerment = SCYTHE_WEAK) + //Determines if we are entitled to setting/resetting our timer. + //Only reset SCYTHE_EMPOWERED with an empowerment that would grant that. + //Only reset SCTHE_SATED if hitting at least simple mobs or nonmonkey carbons. + var/allow_timer_set = FALSE + + if(potential_empowerment == SCYTHE_EMPOWERED) + if(empowerment != SCYTHE_EMPOWERED) //We only empower our stats if we beheaded a human with a mind. + original_force = force + force *= bonus_force_multiplier + empowerment = potential_empowerment + allow_timer_set = TRUE + else if(empowerment < potential_empowerment) //so we don't end up weakening our scythe somehow and creating an infinite empowerment loop, only update empowerment if it is better + empowerment = potential_empowerment + allow_timer_set = TRUE + if(potential_empowerment != SCYTHE_WEAK && allow_timer_set) //And finally, if the empowerment was improved and wasn't too weak to get an empowerment, we set/reset our timer + addtimer(CALLBACK(src, PROC_REF(scythe_empowerment_end)), (4 MINUTES / empowerment), TIMER_UNIQUE | TIMER_OVERRIDE) + +/obj/item/vorpalscythe/proc/scythe_empowerment_end() + if(empowerment == SCYTHE_EMPOWERED) + force = original_force + original_force = null + empowerment = SCYTHE_WEAK + +/obj/item/vorpalscythe/proc/on_cult_rune_removed(obj/effect/target, mob/living/user) + if(!istype(target, /obj/effect/rune)) + return + + var/obj/effect/rune/target_rune = target + if(target_rune.log_when_erased) + user.log_message("erased [target_rune.cultist_name] rune using [src]", LOG_GAME) + SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_NARNAR] = TRUE + +#undef SCYTHE_WEAK +#undef SCYTHE_SATED +#undef SCYTHE_EMPOWERED diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm index 5e5dbb1b38e57..bdb48c84f35d9 100644 --- a/code/modules/jobs/job_types/chemist.dm +++ b/code/modules/jobs/job_types/chemist.dm @@ -35,7 +35,7 @@ /obj/item/paper/secretrecipe = 1 ) rpg_title = "Alchemist" - 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 + job_flags = STATION_JOB_FLAGS /datum/outfit/job/chemist @@ -55,6 +55,7 @@ backpack = /obj/item/storage/backpack/chemistry satchel = /obj/item/storage/backpack/satchel/chem duffelbag = /obj/item/storage/backpack/duffelbag/chemistry + messenger = /obj/item/storage/backpack/messenger/chem box = /obj/item/storage/box/survival/medical chameleon_extras = /obj/item/gun/syringe diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index 6116b1dc93192..cee7b7ca7eb48 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -43,7 +43,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 = STATION_JOB_FLAGS | JOB_BOLD_SELECT_TEXT | JOB_CANNOT_OPEN_SLOTS voice_of_god_power = 1.4 //Command staff has authority @@ -61,7 +61,8 @@ uniform = /obj/item/clothing/under/rank/engineering/chief_engineer backpack_contents = list( /obj/item/melee/baton/telescopic = 1, - ) + /obj/item/construction/rcd/ce = 1, + ) belt = /obj/item/storage/belt/utility/chief/full ears = /obj/item/radio/headset/heads/ce gloves = /obj/item/clothing/gloves/color/black @@ -72,6 +73,7 @@ backpack = /obj/item/storage/backpack/industrial satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering + messenger = /obj/item/storage/backpack/messenger/eng box = /obj/item/storage/box/survival/engineer chameleon_extras = /obj/item/stamp/head/ce diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index e7cdcfb39758d..998c19a215d5d 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -38,9 +38,9 @@ /obj/effect/spawner/random/medical/surgery_tool_advanced = 4, /obj/effect/spawner/random/medical/surgery_tool_alien = 1 ) - family_heirlooms = list(/obj/item/storage/medkit/ancient/heirloom, /obj/item/scalpel, /obj/item/hemostat, /obj/item/circular_saw, /obj/item/retractor, /obj/item/cautery) + family_heirlooms = list(/obj/item/storage/medkit/ancient/heirloom, /obj/item/scalpel, /obj/item/hemostat, /obj/item/circular_saw, /obj/item/retractor, /obj/item/cautery, /obj/item/statuebust/hippocratic) 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 = STATION_JOB_FLAGS | JOB_BOLD_SELECT_TEXT | JOB_CANNOT_OPEN_SLOTS voice_of_god_power = 1.4 //Command staff has authority @@ -72,6 +72,7 @@ backpack = /obj/item/storage/backpack/medic satchel = /obj/item/storage/backpack/satchel/med duffelbag = /obj/item/storage/backpack/duffelbag/med + messenger = /obj/item/storage/backpack/messenger/med box = /obj/item/storage/box/survival/medical chameleon_extras = list( diff --git a/code/modules/jobs/job_types/clown.dm b/code/modules/jobs/job_types/clown.dm index e9f0346e3e1cf..01d144b4a5171 100644 --- a/code/modules/jobs/job_types/clown.dm +++ b/code/modules/jobs/job_types/clown.dm @@ -33,7 +33,7 @@ family_heirlooms = list(/obj/item/bikehorn/golden) rpg_title = "Jester" - 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 + job_flags = STATION_JOB_FLAGS job_tone = "honk" @@ -67,6 +67,7 @@ backpack = /obj/item/storage/backpack/clown satchel = /obj/item/storage/backpack/clown duffelbag = /obj/item/storage/backpack/duffelbag/clown //strangely has a duffel + messenger = /obj/item/storage/backpack/messenger/clown box = /obj/item/storage/box/survival/hug chameleon_extras = /obj/item/stamp/clown @@ -101,4 +102,3 @@ var/datum/atom_hud/fan = GLOB.huds[DATA_HUD_FAN] fan.show_to(H) H.faction |= FACTION_CLOWN - diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm index 6be121085d2c9..e96bae827fa9b 100644 --- a/code/modules/jobs/job_types/cook.dm +++ b/code/modules/jobs/job_types/cook.dm @@ -33,19 +33,20 @@ // Adds up to 100, don't mess it up mail_goodies = list( /obj/item/storage/box/ingredients/random = 40, - /obj/item/reagent_containers/cup/bottle/caramel = 8, - /obj/item/reagent_containers/condiment/flour = 8, - /obj/item/reagent_containers/condiment/rice = 8, - /obj/item/reagent_containers/condiment/ketchup = 8, - /obj/item/reagent_containers/condiment/enzyme = 8, - /obj/item/reagent_containers/condiment/soymilk = 8, + /obj/item/reagent_containers/cup/bottle/caramel = 7, + /obj/item/reagent_containers/condiment/flour = 7, + /obj/item/reagent_containers/condiment/rice = 7, + /obj/item/reagent_containers/condiment/ketchup = 7, + /obj/item/reagent_containers/condiment/enzyme = 7, + /obj/item/reagent_containers/condiment/soymilk = 7, /obj/item/kitchen/spoon/soup_ladle = 6, + /obj/item/kitchen/tongs = 6, /obj/item/knife/kitchen = 4, /obj/item/knife/butcher = 2, ) rpg_title = "Tavern Chef" - 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 + job_flags = STATION_JOB_FLAGS /datum/job/cook/award_service(client/winner, award) winner.give_award(award, winner.mob) @@ -63,7 +64,7 @@ jobtype = /datum/job/cook id_trim = /datum/id_trim/job/cook/chef - uniform = /obj/item/clothing/under/rank/civilian/chef + uniform = /obj/item/clothing/under/costume/buttondown/slacks/service suit = /obj/item/clothing/suit/toggle/chef backpack_contents = list( /obj/item/choice_beacon/ingredient = 1, diff --git a/code/modules/jobs/job_types/coroner.dm b/code/modules/jobs/job_types/coroner.dm index 0894b5907aeb1..22f6c5e65db83 100644 --- a/code/modules/jobs/job_types/coroner.dm +++ b/code/modules/jobs/job_types/coroner.dm @@ -13,6 +13,9 @@ outfit = /datum/outfit/job/coroner plasmaman_outfit = /datum/outfit/plasmaman/coroner + mind_traits = list(TRAIT_MORBID) + liver_traits = list(TRAIT_CORONER_METABOLISM) + paycheck = PAYCHECK_CREW paycheck_department = ACCOUNT_MED @@ -28,13 +31,15 @@ /obj/item/reagent_containers/cup/bottle/formaldehyde = 30, /obj/item/storage/box/bodybags = 15, /obj/item/healthanalyzer = 10, + /obj/item/shovel/serrated/dull = 5, /obj/effect/spawner/random/medical/organs = 5, /obj/effect/spawner/random/medical/memeorgans = 1, + /obj/item/scythe = 1, ) - family_heirlooms = list(/obj/item/clothing/head/helmet/skull, /obj/item/table_clock) + family_heirlooms = list(/obj/item/clothing/head/helmet/skull, /obj/item/table_clock, /obj/item/shovel, /obj/item/storage/fancy/pickles_jar) - 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 + job_flags = STATION_JOB_FLAGS rpg_title = "Undertaker" @@ -47,7 +52,7 @@ backpack_contents = list( /obj/item/storage/box/bodybags = 1, /obj/item/autopsy_scanner = 1, - /obj/item/storage/medkit/coroner/large = 1, + /obj/item/storage/medkit/coroner = 1, ) belt = /obj/item/modular_computer/pda/coroner @@ -64,5 +69,6 @@ backpack = /obj/item/storage/backpack/coroner satchel = /obj/item/storage/backpack/satchel/coroner duffelbag = /obj/item/storage/backpack/duffelbag/coroner + messenger = /obj/item/storage/backpack/messenger/coroner skillchips = list(/obj/item/skillchip/entrails_reader) diff --git a/code/modules/jobs/job_types/curator.dm b/code/modules/jobs/job_types/curator.dm index 54dd4cbb61d33..e2eb35af5497e 100644 --- a/code/modules/jobs/job_types/curator.dm +++ b/code/modules/jobs/job_types/curator.dm @@ -31,7 +31,7 @@ family_heirlooms = list(/obj/item/pen/fountain, /obj/item/storage/dice) - 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 + job_flags = STATION_JOB_FLAGS voice_of_god_silence_power = 3 rpg_title = "Veteran Adventurer" @@ -61,5 +61,5 @@ if(visualsOnly) return - translator.grant_all_languages(source=LANGUAGE_CURATOR) + translator.grant_all_languages(source = LANGUAGE_CURATOR) translator.remove_blocked_language(GLOB.all_languages, source=LANGUAGE_ALL) diff --git a/code/modules/jobs/job_types/cyborg.dm b/code/modules/jobs/job_types/cyborg.dm index 377fb7d62deb3..7b1e40fe1d6d1 100644 --- a/code/modules/jobs/job_types/cyborg.dm +++ b/code/modules/jobs/job_types/cyborg.dm @@ -4,7 +4,7 @@ auto_deadmin_role_flags = DEADMIN_POSITION_SILICON faction = FACTION_STATION total_positions = 0 - spawn_positions = 1 + spawn_positions = 3 supervisors = "your laws and the AI" //Nodrak spawn_type = /mob/living/silicon/robot minimal_player_age = 21 @@ -19,7 +19,7 @@ /datum/job_department/silicon, ) random_spawns_possible = FALSE - job_flags = JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK + job_flags = JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK | JOB_CANNOT_OPEN_SLOTS /datum/job/cyborg/after_spawn(mob/living/spawned, client/player_client) @@ -32,5 +32,5 @@ 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.") +/datum/job/cyborg/get_radio_information() + return "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 4b44a3a4ae24c..b6984e24b4220 100644 --- a/code/modules/jobs/job_types/detective.dm +++ b/code/modules/jobs/job_types/detective.dm @@ -40,7 +40,7 @@ family_heirlooms = list(/obj/item/reagent_containers/cup/glass/bottle/whiskey) rpg_title = "Thiefcatcher" //I guess they caught them all rip thief... - 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 + job_flags = STATION_JOB_FLAGS job_tone = "objection" diff --git a/code/modules/jobs/job_types/geneticist.dm b/code/modules/jobs/job_types/geneticist.dm index 1c11925bcd349..2498eb7c2a389 100644 --- a/code/modules/jobs/job_types/geneticist.dm +++ b/code/modules/jobs/job_types/geneticist.dm @@ -29,7 +29,7 @@ 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 + job_flags = STATION_JOB_FLAGS /datum/outfit/job/geneticist @@ -48,3 +48,4 @@ backpack = /obj/item/storage/backpack/genetics satchel = /obj/item/storage/backpack/satchel/gen duffelbag = /obj/item/storage/backpack/duffelbag/genetics + messenger = /obj/item/storage/backpack/messenger/gen diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index d078afe6c5610..7cab0feab9685 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -8,7 +8,7 @@ faction = FACTION_STATION total_positions = 1 spawn_positions = 1 - supervisors = SUPERVISOR_HOP + supervisors = SUPERVISOR_CAPTAIN req_admin_notify = 1 minimal_player_age = 10 exp_requirements = 180 @@ -39,7 +39,7 @@ family_heirlooms = list(/obj/item/reagent_containers/cup/glass/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 = STATION_JOB_FLAGS | JOB_BOLD_SELECT_TEXT | JOB_CANNOT_OPEN_SLOTS voice_of_god_power = 1.4 //Command staff has authority @@ -56,7 +56,6 @@ 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, ) belt = /obj/item/modular_computer/pda/heads/hop ears = /obj/item/radio/headset/heads/hop diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index b842cdd3ef423..74773b0e9be8c 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -34,7 +34,7 @@ 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 = STATION_JOB_FLAGS | JOB_BOLD_SELECT_TEXT | JOB_CANNOT_OPEN_SLOTS voice_of_god_power = 1.4 //Command staff has authority @@ -67,6 +67,7 @@ backpack = /obj/item/storage/backpack/security satchel = /obj/item/storage/backpack/satchel/sec duffelbag = /obj/item/storage/backpack/duffelbag/sec + messenger = /obj/item/storage/backpack/messenger/sec box = /obj/item/storage/box/survival/security chameleon_extras = list( diff --git a/code/modules/jobs/job_types/janitor.dm b/code/modules/jobs/job_types/janitor.dm index a23043c5c7f20..bf6c3423a01bf 100644 --- a/code/modules/jobs/job_types/janitor.dm +++ b/code/modules/jobs/job_types/janitor.dm @@ -28,7 +28,7 @@ /obj/item/lightreplacer = 10 ) rpg_title = "Groundskeeper" - 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 + job_flags = STATION_JOB_FLAGS job_tone = "slip" diff --git a/code/modules/jobs/job_types/lawyer.dm b/code/modules/jobs/job_types/lawyer.dm index 38d55e85c2851..a25a1d86d3ade 100644 --- a/code/modules/jobs/job_types/lawyer.dm +++ b/code/modules/jobs/job_types/lawyer.dm @@ -25,7 +25,7 @@ rpg_title = "Magistrate" family_heirlooms = list(/obj/item/gavelhammer, /obj/item/book/manual/wiki/security_space_law) - 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 + job_flags = STATION_JOB_FLAGS job_tone = "objection" diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm index e8f064fd5456d..e3a396609eb26 100644 --- a/code/modules/jobs/job_types/medical_doctor.dm +++ b/code/modules/jobs/job_types/medical_doctor.dm @@ -24,7 +24,7 @@ /datum/job_department/medical, ) - family_heirlooms = list(/obj/item/storage/medkit/ancient/heirloom, /obj/item/scalpel, /obj/item/hemostat, /obj/item/circular_saw, /obj/item/retractor, /obj/item/cautery) + family_heirlooms = list(/obj/item/storage/medkit/ancient/heirloom, /obj/item/scalpel, /obj/item/hemostat, /obj/item/circular_saw, /obj/item/retractor, /obj/item/cautery, /obj/item/statuebust/hippocratic) mail_goodies = list( /obj/item/healthanalyzer/advanced = 15, @@ -36,7 +36,7 @@ /obj/effect/spawner/random/medical/memeorgans = 1 ) rpg_title = "Cleric" - 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 + job_flags = STATION_JOB_FLAGS /datum/outfit/job/doctor @@ -56,6 +56,7 @@ backpack = /obj/item/storage/backpack/medic satchel = /obj/item/storage/backpack/satchel/med duffelbag = /obj/item/storage/backpack/duffelbag/med + messenger = /obj/item/storage/backpack/messenger/med box = /obj/item/storage/box/survival/medical chameleon_extras = /obj/item/gun/syringe diff --git a/code/modules/jobs/job_types/mime.dm b/code/modules/jobs/job_types/mime.dm index 6b08c2b4d4e52..eba86ec2af07a 100644 --- a/code/modules/jobs/job_types/mime.dm +++ b/code/modules/jobs/job_types/mime.dm @@ -29,7 +29,7 @@ /obj/item/book/granter/action/spell/mime/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 + job_flags = STATION_JOB_FLAGS voice_of_god_power = 0.5 //Why are you speaking voice_of_god_silence_power = 3 @@ -97,7 +97,10 @@ spell_icons[initial(type.name)] = image(icon = initial(type.button_icon), icon_state = initial(type.button_icon_state)) name_to_spell[initial(type.name)] = type var/picked_spell = show_radial_menu(user, src, spell_icons, custom_check = CALLBACK(src, PROC_REF(check_menu), user), radius = 36, require_near = TRUE) + if(!picked_spell) + return FALSE granted_action = name_to_spell[picked_spell] + return TRUE /obj/item/book/granter/action/spell/mime/mimery/on_reading_finished(mob/living/user) // Gives the user a vow ability too, if they don't already have one diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm index 2b2e3b0fcb8d0..2fd4f3a93a6da 100644 --- a/code/modules/jobs/job_types/paramedic.dm +++ b/code/modules/jobs/job_types/paramedic.dm @@ -32,10 +32,11 @@ /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/survival/luxury = 5 + /obj/item/reagent_containers/hypospray/medipen/survival/luxury = 5, + /obj/item/storage/box/bandages = 5, ) rpg_title = "Corpse Runner" - 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 + job_flags = STATION_JOB_FLAGS /datum/outfit/job/paramedic @@ -48,7 +49,7 @@ suit = /obj/item/clothing/suit/toggle/labcoat/paramedic suit_store = /obj/item/flashlight/pen/paramedic backpack_contents = list( - /obj/item/roller = 1, + /obj/item/emergency_bed = 1, ) belt = /obj/item/storage/belt/medical/paramedic ears = /obj/item/radio/headset/headset_med @@ -56,10 +57,12 @@ gloves = /obj/item/clothing/gloves/latex/nitrile shoes = /obj/item/clothing/shoes/sneakers/blue l_pocket = /obj/item/modular_computer/pda/medical/paramedic + r_pocket = /obj/item/storage/box/bandages backpack = /obj/item/storage/backpack/medic satchel = /obj/item/storage/backpack/satchel/med duffelbag = /obj/item/storage/backpack/duffelbag/med + messenger = /obj/item/storage/backpack/messenger/med box = /obj/item/storage/box/survival/medical chameleon_extras = /obj/item/gun/syringe diff --git a/code/modules/jobs/job_types/prisoner.dm b/code/modules/jobs/job_types/prisoner.dm index 2a422c9c5ae3a..dfa8103a6712f 100644 --- a/code/modules/jobs/job_types/prisoner.dm +++ b/code/modules/jobs/job_types/prisoner.dm @@ -23,7 +23,7 @@ family_heirlooms = list(/obj/item/pen/blue) rpg_title = "Defeated Miniboss" - job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | 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_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN | JOB_CANNOT_OPEN_SLOTS /datum/job/prisoner/New() . = ..() diff --git a/code/modules/jobs/job_types/psychologist.dm b/code/modules/jobs/job_types/psychologist.dm index bf178b2de1167..4a1d291c86778 100644 --- a/code/modules/jobs/job_types/psychologist.dm +++ b/code/modules/jobs/job_types/psychologist.dm @@ -31,7 +31,7 @@ /obj/item/gun/syringe = 1 ) rpg_title = "Snake Oil Salesman" - 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 + job_flags = STATION_JOB_FLAGS /datum/outfit/job/psychologist @@ -40,7 +40,7 @@ id = /obj/item/card/id/advanced id_trim = /datum/id_trim/job/psychologist - uniform = /obj/item/clothing/under/suit/black + uniform = /obj/item/clothing/under/costume/buttondown/slacks/service backpack_contents = list( /obj/item/storage/pill_bottle/happinesspsych, /obj/item/storage/pill_bottle/lsdpsych, @@ -56,6 +56,7 @@ backpack = /obj/item/storage/backpack/medic satchel = /obj/item/storage/backpack/satchel/med duffelbag = /obj/item/storage/backpack/duffelbag/med + messenger = /obj/item/storage/backpack/messenger/med pda_slot = ITEM_SLOT_BELT skillchips = list(/obj/item/skillchip/job/psychology) diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm index e544e52ec6380..0ca4b0a1052ab 100644 --- a/code/modules/jobs/job_types/quartermaster.dm +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -33,7 +33,8 @@ /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 = STATION_JOB_FLAGS | JOB_BOLD_SELECT_TEXT | JOB_CANNOT_OPEN_SLOTS + voice_of_god_power = 1.4 //Command staff has authority ignore_human_authority = TRUE /datum/outfit/job/quartermaster @@ -46,9 +47,10 @@ id = /obj/item/card/id/advanced/silver uniform = /obj/item/clothing/under/rank/cargo/qm belt = /obj/item/modular_computer/pda/heads/quartermaster + suit = /obj/item/clothing/suit/jacket/quartermaster ears = /obj/item/radio/headset/heads/qm glasses = /obj/item/clothing/glasses/sunglasses - shoes = /obj/item/clothing/shoes/sneakers/brown + shoes = /obj/item/clothing/shoes/laceup l_hand = /obj/item/clipboard chameleon_extras = /obj/item/stamp/head/qm diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index ed76d756e25b4..684c88a7e0f53 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -41,7 +41,7 @@ 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 + job_flags = STATION_JOB_FLAGS | JOB_BOLD_SELECT_TEXT | JOB_CANNOT_OPEN_SLOTS voice_of_god_power = 1.4 //Command staff has authority @@ -72,6 +72,7 @@ backpack = /obj/item/storage/backpack/science satchel = /obj/item/storage/backpack/satchel/science duffelbag = /obj/item/storage/backpack/duffelbag/science + messenger = /obj/item/storage/backpack/messenger/science chameleon_extras = /obj/item/stamp/head/rd skillchips = list(/obj/item/skillchip/job/research_director) @@ -82,5 +83,6 @@ suit_store = /obj/item/tank/internals/oxygen back = /obj/item/mod/control/pre_equipped/research suit = null + head = 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 index 83e3bd7395dfb..e5ae78bdc6bc0 100644 --- a/code/modules/jobs/job_types/roboticist.dm +++ b/code/modules/jobs/job_types/roboticist.dm @@ -31,7 +31,7 @@ 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 + job_flags = STATION_JOB_FLAGS /datum/job/roboticist/New() diff --git a/code/modules/jobs/job_types/scientist.dm b/code/modules/jobs/job_types/scientist.dm index 2cbc2f288d00f..878167f254833 100644 --- a/code/modules/jobs/job_types/scientist.dm +++ b/code/modules/jobs/job_types/scientist.dm @@ -30,10 +30,9 @@ mail_goodies = list( /obj/item/raw_anomaly_core/random = 10, /obj/item/disk/design_disk/bepis = 2, - /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 + job_flags = STATION_JOB_FLAGS job_tone = "boom" @@ -52,6 +51,7 @@ backpack = /obj/item/storage/backpack/science satchel = /obj/item/storage/backpack/satchel/science duffelbag = /obj/item/storage/backpack/duffelbag/science + messenger = /obj/item/storage/backpack/messenger/science /datum/outfit/job/scientist/pre_equip(mob/living/carbon/human/H) ..() diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index cd258484260ab..25d76bf0156d8 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -38,7 +38,7 @@ /obj/item/melee/baton/security/boomerang/loaded = 1 ) 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 + job_flags = STATION_JOB_FLAGS GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, SEC_DEPT_SCIENCE, SEC_DEPT_SUPPLY)) @@ -161,16 +161,18 @@ GLOBAL_LIST_EMPTY(security_officer_distribution) 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 + for(var/messenger_ref in GLOB.pda_messengers) + var/datum/computer_file/program/messenger/messenger = GLOB.pda_messengers[messenger_ref] + if(!(messenger.computer?.saved_identification in partners)) + continue + targets += messenger if (!targets.len) return - var/datum/signal/subspace/messaging/tablet_msg/signal = new(announcement_system, list( - "name" = "Security Department Update", - "job" = "Automated Announcement System", + var/datum/signal/subspace/messaging/tablet_message/signal = new(announcement_system, list( + "fakename" = "Security Department Update", + "fakejob" = "Automated Announcement System", "message" = "Officer [officer.real_name] has been assigned to your department, [department].", "targets" = targets, "automated" = TRUE, @@ -213,6 +215,7 @@ GLOBAL_LIST_EMPTY(security_officer_distribution) backpack = /obj/item/storage/backpack/security satchel = /obj/item/storage/backpack/satchel/sec duffelbag = /obj/item/storage/backpack/duffelbag/sec + messenger = /obj/item/storage/backpack/messenger/sec box = /obj/item/storage/box/survival/security chameleon_extras = list( @@ -235,7 +238,7 @@ GLOBAL_LIST_EMPTY(security_officer_distribution) /obj/item/radio/headset/headset_sec/alt/department/Initialize(mapload) . = ..() - wires = new/datum/wires/radio(src) + set_wires(new/datum/wires/radio(src)) secure_radio_connections = list() recalculateChannels() diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index 92f4dbc5cbb4c..2c65ca3e05e71 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -26,7 +26,7 @@ family_heirlooms = list(/obj/item/pickaxe/mini, /obj/item/shovel) rpg_title = "Adventurer" - 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 + job_flags = STATION_JOB_FLAGS /datum/outfit/job/miner @@ -51,6 +51,7 @@ backpack = /obj/item/storage/backpack/explorer satchel = /obj/item/storage/backpack/satchel/explorer duffelbag = /obj/item/storage/backpack/duffelbag/explorer + messenger = /obj/item/storage/backpack/messenger/explorer box = /obj/item/storage/box/survival/mining chameleon_extras = /obj/item/gun/energy/recharge/kinetic_accelerator diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm index b98685902bd92..8738389ab41d0 100644 --- a/code/modules/jobs/job_types/station_engineer.dm +++ b/code/modules/jobs/job_types/station_engineer.dm @@ -36,7 +36,7 @@ /obj/item/clothing/head/utility/hardhat/red/upgraded = 1 ) rpg_title = "Crystallomancer" - 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 + job_flags = STATION_JOB_FLAGS /datum/outfit/job/engineer @@ -55,6 +55,11 @@ backpack = /obj/item/storage/backpack/industrial satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering + messenger = /obj/item/storage/backpack/messenger/eng + + backpack_contents = list( + /obj/item/construction/rcd/loaded, + ) box = /obj/item/storage/box/survival/engineer pda_slot = ITEM_SLOT_LPOCKET diff --git a/code/modules/jobs/job_types/virologist.dm b/code/modules/jobs/job_types/virologist.dm index a844b8abcdc8f..bdbfd7d687ca4 100644 --- a/code/modules/jobs/job_types/virologist.dm +++ b/code/modules/jobs/job_types/virologist.dm @@ -26,7 +26,7 @@ /datum/job_department/medical, ) - family_heirlooms = list(/obj/item/reagent_containers/syringe) + family_heirlooms = list(/obj/item/reagent_containers/syringe, /obj/item/statuebust/hippocratic) mail_goodies = list( /obj/item/reagent_containers/cup/bottle/random_virus = 15, @@ -36,7 +36,7 @@ /obj/item/stack/sheet/mineral/uranium = 5, ) rpg_title = "Plague Doctor" - 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 + job_flags = STATION_JOB_FLAGS /datum/outfit/job/virologist @@ -55,5 +55,6 @@ backpack = /obj/item/storage/backpack/virology satchel = /obj/item/storage/backpack/satchel/vir duffelbag = /obj/item/storage/backpack/duffelbag/virology + messenger = /obj/item/storage/backpack/messenger/vir box = /obj/item/storage/box/survival/medical diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index 2179908c57d75..643611201c8c1 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -40,8 +40,7 @@ /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 = STATION_JOB_FLAGS | JOB_BOLD_SELECT_TEXT /datum/outfit/job/warden name = "Warden" @@ -66,6 +65,7 @@ backpack = /obj/item/storage/backpack/security satchel = /obj/item/storage/backpack/satchel/sec duffelbag = /obj/item/storage/backpack/duffelbag/sec + messenger = /obj/item/storage/backpack/messenger/sec box = /obj/item/storage/box/survival/security implants = list(/obj/item/implant/mindshield) diff --git a/code/modules/jobs/jobs.dm b/code/modules/jobs/jobs.dm index 5eea0d7fc4691..a0b0ebee560e8 100644 --- a/code/modules/jobs/jobs.dm +++ b/code/modules/jobs/jobs.dm @@ -21,6 +21,8 @@ GLOBAL_LIST_INIT(exp_specialmap, list( ROLE_SPACE_BAR_PATRON, ROLE_LAVALAND_SYNDICATE, ROLE_MAINTENANCE_DRONE, + ROLE_DERELICT_DRONE, + ROLE_SYNDICATE_DRONE, ROLE_VENUSHUMANTRAP, ROLE_GHOST_ROLE, ), // Ghost roles diff --git a/code/modules/language/beachbum.dm b/code/modules/language/beachbum.dm index df28e8b244478..d78be9788f35b 100644 --- a/code/modules/language/beachbum.dm +++ b/code/modules/language/beachbum.dm @@ -4,16 +4,18 @@ key = "u" space_chance = 85 default_priority = 90 - syllables = list("cowabunga", "rad", "radical", "dudes", "bogus", "weeed", "every", - "dee", "dah", "woah", "surf", "blazed", "high", "heinous", "day", - "brah", "bro", "blown", "catch", "body", "beach", "oooo", "twenty", - "shiz", "phiz", "wizz", "pop", "chill", "awesome", "dude", "it", - "wax", "stoked", "yes", "ding", "way", "no", "wicked", "aaaa", - "cool", "hoo", "wah", "wee", "man", "maaaaaan", "mate", "wick", - "oh", "ocean", "up", "out", "rip", "slide", "big", "stomp", - "weed", "pot", "smoke", "four-twenty", "shove", "wacky", "hah", - "sick", "slash", "spit", "stoked", "shallow", "gun", "party", - "heavy", "stellar", "excellent", "triumphant", "babe", "four", - "tail", "trim", "tube", "wobble", "roll", "gnarly", "epic") + syllables = list( + "cowabunga", "rad", "radical", "dudes", "bogus", "weeed", "every", + "dee", "dah", "woah", "surf", "blazed", "high", "heinous", "day", + "brah", "bro", "blown", "catch", "body", "beach", "oooo", "twenty", + "shiz", "phiz", "wizz", "pop", "chill", "awesome", "dude", "it", + "wax", "stoked", "yes", "ding", "way", "no", "wicked", "aaaa", + "cool", "hoo", "wah", "wee", "man", "maaaaaan", "mate", "wick", + "oh", "ocean", "up", "out", "rip", "slide", "big", "stomp", + "weed", "pot", "smoke", "four-twenty", "shove", "wacky", "hah", + "sick", "slash", "spit", "stoked", "shallow", "gun", "party", + "heavy", "stellar", "excellent", "triumphant", "babe", "four", + "tail", "trim", "tube", "wobble", "roll", "gnarly", "epic", + ) icon_state = "beach" diff --git a/code/modules/language/calcic.dm b/code/modules/language/calcic.dm index af14c6902ba37..f4882e1105b95 100644 --- a/code/modules/language/calcic.dm +++ b/code/modules/language/calcic.dm @@ -6,8 +6,8 @@ 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", + "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" diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm index e0adb3d689cd3..b6dea2d4e0e28 100644 --- a/code/modules/language/language_holder.dm +++ b/code/modules/language/language_holder.dm @@ -1,4 +1,4 @@ -/*!Language holders will either exist in an atom/movable or a mind. Creation of language holders happens +/*!Language holders will either exist in an atom/movable. Creation of language holders happens automatically when they are needed, for example when something tries to speak. Where a mind is available, the mind language holder will be the one "in charge". The mind holder will update its languages based on the atom holder, and will get updated as part of @@ -33,34 +33,35 @@ Key procs * [has_language](atom/movable.html#proc/has_language) * [can_speak_language](atom/movable.html#proc/can_speak_language) * [get_selected_language](atom/movable.html#proc/get_selected_language) -* [update_atom_languages](atom/movable.html#proc/update_atom_languages) */ /datum/language_holder - /// Understood languages. - var/list/understood_languages = list(/datum/language/common = list(LANGUAGE_MIND)) - /// A list of languages that can be spoken. Tongue organ may also set limits beyond this list. + /// Lazyassoclist of all understood languages + var/list/understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM)) + /// Lazyassoclist of languages that can be spoken. + /// Tongue organ may also set limits beyond this list. var/list/spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM)) - /// A list of blocked languages. Used to prevent understanding and speaking certain languages, ie for certain mobs, mutations etc. - var/list/blocked_languages = list() - /// If true, overrides tongue limitations. + /// Lazyassoclist of blocked languages. + /// Used to prevent understanding and speaking certain languages, ie for certain mobs, mutations etc. + var/list/blocked_languages + /// If true, overrides tongue aforementioned limitations. var/omnitongue = FALSE /// Handles displaying the language menu UI. var/datum/language_menu/language_menu /// Currently spoken language var/selected_language /// Tracks the entity that owns the holder. - var/atom/owner + var/atom/movable/owner /// Initializes, and copies in the languages from the current atom if available. -/datum/language_holder/New(atom/_owner) - if(_owner && QDELETED(_owner)) - CRASH("Langauge holder added to a qdeleting thing, what the fuck [text_ref(_owner)]") - owner = _owner - if(istype(owner, /datum/mind)) - var/datum/mind/M = owner - if(M.current) - update_atom_languages(M.current) +/datum/language_holder/New(atom/new_owner) + if(new_owner) + if(QDELETED(new_owner)) + CRASH("Langauge holder added to a qdeleting thing, what the fuck [text_ref(new_owner)]") + if(!ismovable(new_owner)) + CRASH("Language holder being added to a non-movable thing, this is invalid (was: [new_owner] / [new_owner.type])") + + owner = new_owner // If we have an owner, we'll set a default selected language if(owner) @@ -72,50 +73,46 @@ Key procs return ..() /// Grants the supplied language. -/datum/language_holder/proc/grant_language(language, understood = TRUE, spoken = TRUE, source = LANGUAGE_MIND) - if(understood) - if(!understood_languages[language]) - understood_languages[language] = list() - understood_languages[language] |= source +/datum/language_holder/proc/grant_language(language, language_flags = ALL, source = LANGUAGE_MIND) + if(language_flags & UNDERSTOOD_LANGUAGE) + LAZYORASSOCLIST(understood_languages, language, source) . = TRUE - if(spoken) - if(!spoken_languages[language]) - spoken_languages[language] = list() - spoken_languages[language] |= source + if(language_flags & SPOKEN_LANGUAGE) + LAZYORASSOCLIST(spoken_languages, language, source) . = TRUE + return . + /// Grants every language to understood and spoken, and gives omnitongue. -/datum/language_holder/proc/grant_all_languages(understood = TRUE, spoken = TRUE, grant_omnitongue = TRUE, source = LANGUAGE_MIND) +/datum/language_holder/proc/grant_all_languages(language_flags = ALL, grant_omnitongue = TRUE, source = LANGUAGE_MIND) for(var/language in GLOB.all_languages) - grant_language(language, understood, spoken, source) + grant_language(language, language_flags, source) if(grant_omnitongue) // Overrides tongue limitations. omnitongue = TRUE return TRUE /// Removes a single language or source, removing all sources returns the pre-removal state of the language. -/datum/language_holder/proc/remove_language(language, understood = TRUE, spoken = TRUE, source = LANGUAGE_ALL) - if(understood && understood_languages[language]) +/datum/language_holder/proc/remove_language(language, language_flags = ALL, source = LANGUAGE_ALL) + if(language_flags & UNDERSTOOD_LANGUAGE) if(source == LANGUAGE_ALL) - understood_languages -= language + LAZYREMOVE(understood_languages, language) else - understood_languages[language] -= source - if(!length(understood_languages[language])) - understood_languages -= language + LAZYREMOVEASSOC(understood_languages, language, source) . = TRUE - if(spoken && spoken_languages[language]) + if(language_flags & SPOKEN_LANGUAGE) if(source == LANGUAGE_ALL) - spoken_languages -= language + LAZYREMOVE(spoken_languages, language) else - spoken_languages[language] -= source - if(!length(spoken_languages[language])) - spoken_languages -= language + LAZYREMOVEASSOC(spoken_languages, language, source) . = TRUE + return . + /// Removes every language and optionally sets omnitongue false. If a non default source is supplied, only removes that source. /datum/language_holder/proc/remove_all_languages(source = LANGUAGE_ALL, remove_omnitongue = FALSE) for(var/language in GLOB.all_languages) - remove_language(language, TRUE, TRUE, source) + remove_language(language, ALL, source) if(remove_omnitongue) omnitongue = FALSE return TRUE @@ -124,39 +121,41 @@ Key procs /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 + LAZYORASSOCLIST(blocked_languages, language, source) return TRUE /// Removes a single language or list of languages from the blocked language list. /datum/language_holder/proc/remove_blocked_language(languages, source = LANGUAGE_MIND) if(!islist(languages)) languages = list(languages) + for(var/language in languages) - if(blocked_languages[language]) - if(source == LANGUAGE_ALL) - blocked_languages -= language - else - blocked_languages[language] -= source - if(!length(blocked_languages[language])) - blocked_languages -= language + if(source == LANGUAGE_ALL) + LAZYREMOVE(blocked_languages, language) + else + LAZYREMOVEASSOC(blocked_languages, language, source) + 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) +/// Checks if you have the language passed. +/datum/language_holder/proc/has_language(language, flag_to_check = UNDERSTOOD_LANGUAGE) if(language in blocked_languages) return FALSE - if(spoken) - return language in spoken_languages - return language in understood_languages + + var/list/langs_to_check = list() + if(flag_to_check & SPOKEN_LANGUAGE) + langs_to_check |= spoken_languages + if(flag_to_check & UNDERSTOOD_LANGUAGE) + langs_to_check |= understood_languages + + return language in langs_to_check /// Checks if you can speak the language. Tongue limitations should be supplied as an argument. /datum/language_holder/proc/can_speak_language(language) - var/atom/movable/ouratom = get_atom() - var/can_speak_language_path = omnitongue || ouratom.could_speak_language(language) - return (can_speak_language_path && has_language(language, TRUE)) + var/can_speak_language_path = omnitongue || owner.could_speak_language(language) + return (can_speak_language_path && has_language(language, SPOKEN_LANGUAGE)) /// Returns selected language if it can be spoken, or decides, sets and returns a new selected language if possible. /datum/language_holder/proc/get_selected_language() @@ -199,54 +198,61 @@ Key procs language_menu = new (src) language_menu.ui_interact(user) -/// Gets the atom, since we some times need to check if the tongue has limitations. -/datum/language_holder/proc/get_atom() - if(owner) - if(istype(owner, /datum/mind)) - var/datum/mind/M = owner - return M.current - return owner - return FALSE - -/// Empties out the atom specific languages and updates them according to the supplied atoms language holder. -/datum/language_holder/proc/update_atom_languages(atom/movable/thing) - var/datum/language_holder/from_atom = thing.get_language_holder(FALSE) //Gets the atoms language holder - if(from_atom == src) //This could happen if called on an atom without a mind. - return FALSE - for(var/language in understood_languages) - remove_language(language, TRUE, FALSE, LANGUAGE_ATOM) - for(var/language in spoken_languages) - remove_language(language, FALSE, TRUE, LANGUAGE_ATOM) - for(var/language in blocked_languages) - remove_blocked_language(language, LANGUAGE_ATOM) - - copy_languages(from_atom) - get_selected_language() - return TRUE - /// Copies all languages from the supplied atom/language holder. Source should be overridden when you /// do not want the language overwritten by later atom updates or want to avoid blocked languages. /datum/language_holder/proc/copy_languages(datum/language_holder/from_holder, source_override) if(source_override) //No blocked languages here, for now only used by ling absorb. for(var/language in from_holder.understood_languages) - grant_language(language, TRUE, FALSE, source_override) + grant_language(language, UNDERSTOOD_LANGUAGE, source_override) for(var/language in from_holder.spoken_languages) - grant_language(language, FALSE, TRUE, source_override) + grant_language(language, SPOKEN_LANGUAGE, source_override) else for(var/language in from_holder.understood_languages) - grant_language(language, TRUE, FALSE, from_holder.understood_languages[language]) + grant_language(language, UNDERSTOOD_LANGUAGE, from_holder.understood_languages[language]) for(var/language in from_holder.spoken_languages) - grant_language(language, FALSE, TRUE, from_holder.spoken_languages[language]) + grant_language(language, SPOKEN_LANGUAGE, from_holder.spoken_languages[language]) for(var/language in from_holder.blocked_languages) add_blocked_language(language, from_holder.blocked_languages[language]) return TRUE +/// Transfers all mind languages to the supplied language holder. +/datum/language_holder/proc/transfer_mind_languages(datum/language_holder/to_holder) + for(var/language in understood_languages) + if(LANGUAGE_MIND in understood_languages[language]) + remove_language(language, UNDERSTOOD_LANGUAGE, LANGUAGE_MIND) + to_holder.grant_language(language, UNDERSTOOD_LANGUAGE, LANGUAGE_MIND) + for(var/language in spoken_languages) + if(LANGUAGE_MIND in spoken_languages[language]) + remove_language(language, SPOKEN_LANGUAGE, LANGUAGE_MIND) + to_holder.grant_language(language, SPOKEN_LANGUAGE, LANGUAGE_MIND) + for(var/language in blocked_languages) + if(LANGUAGE_MIND in blocked_languages[language]) + remove_blocked_language(language, LANGUAGE_MIND) + to_holder.add_blocked_language(language, LANGUAGE_MIND) + + if(owner) + get_selected_language() + if(to_holder.owner) + to_holder.get_selected_language() + +/// A global assoc list containing prototypes of all language holders +/// [Language holder typepath] to [language holder instance] +/// Used for easy reference of what can speak what without needing to constantly recreate language holders. +GLOBAL_LIST_INIT(prototype_language_holders, init_language_holder_prototypes()) + +/// Inits the global list of language holder prototypes. +/proc/init_language_holder_prototypes() + var/list/prototypes = list() + for(var/holdertype in typesof(/datum/language_holder)) + prototypes[holdertype] = new holdertype() -//************************************************ -//* Specific language holders * -//* Use atom language sources only. * -//************************************************/ + return prototypes +/* + * Specific language holders presets + * + * Prefer to use [LANGUGAE_ATOM]. Atom languages will stick through species changes but not mindswaps. + */ /datum/language_holder/alien understood_languages = list(/datum/language/xenocommon = list(LANGUAGE_ATOM)) @@ -254,10 +260,14 @@ Key procs blocked_languages = list(/datum/language/common = list(LANGUAGE_ATOM)) /datum/language_holder/construct - understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/narsie = list(LANGUAGE_ATOM)) - spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/narsie = list(LANGUAGE_ATOM)) + understood_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/narsie = list(LANGUAGE_ATOM), + ) + spoken_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/narsie = list(LANGUAGE_ATOM), + ) /datum/language_holder/drone understood_languages = list(/datum/language/drone = list(LANGUAGE_ATOM)) @@ -265,13 +275,21 @@ Key procs blocked_languages = list(/datum/language/common = list(LANGUAGE_ATOM)) /datum/language_holder/drone/syndicate - blocked_languages = list() + blocked_languages = null + +/datum/language_holder/human_basic + understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM)) + spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM)) /datum/language_holder/jelly - understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/slime = list(LANGUAGE_ATOM)) - spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/slime = list(LANGUAGE_ATOM)) + understood_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/slime = list(LANGUAGE_ATOM), + ) + spoken_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/slime = list(LANGUAGE_ATOM), + ) /datum/language_holder/lightbringer understood_languages = list(/datum/language/slime = list(LANGUAGE_ATOM)) @@ -279,35 +297,54 @@ Key procs blocked_languages = list(/datum/language/common = list(LANGUAGE_ATOM)) /datum/language_holder/lizard - understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/draconic = list(LANGUAGE_ATOM)) - spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/draconic = list(LANGUAGE_ATOM)) + understood_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/draconic = list(LANGUAGE_ATOM), + ) + spoken_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/draconic = list(LANGUAGE_ATOM), + ) /datum/language_holder/lizard/ash selected_language = /datum/language/draconic /datum/language_holder/lizard/silver - understood_languages = list(/datum/language/uncommon = list(LANGUAGE_ATOM), - /datum/language/draconic = list(LANGUAGE_ATOM)) - spoken_languages = list(/datum/language/uncommon = list(LANGUAGE_ATOM), - /datum/language/draconic = list(LANGUAGE_ATOM)) + understood_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), // yes we hear you, but we refuse to speak your peasant language + /datum/language/uncommon = list(LANGUAGE_ATOM), + /datum/language/draconic = list(LANGUAGE_ATOM), + ) + spoken_languages = list( + /datum/language/uncommon = list(LANGUAGE_ATOM), + /datum/language/draconic = list(LANGUAGE_ATOM), + ) selected_language = /datum/language/uncommon /datum/language_holder/monkey - understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/monkey = list(LANGUAGE_ATOM)) - spoken_languages = list(/datum/language/monkey = list(LANGUAGE_ATOM)) + understood_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/monkey = list(LANGUAGE_ATOM), + ) + spoken_languages = list( + /datum/language/monkey = list(LANGUAGE_ATOM), + ) /datum/language_holder/mushroom - understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/mushroom = list(LANGUAGE_ATOM)) - spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/mushroom = list(LANGUAGE_ATOM)) + 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)) + understood_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/slime = list(LANGUAGE_ATOM), + ) spoken_languages = list(/datum/language/slime = list(LANGUAGE_ATOM)) /datum/language_holder/venus @@ -321,110 +358,159 @@ Key procs blocked_languages = list(/datum/language/common = list(LANGUAGE_ATOM)) /datum/language_holder/synthetic - understood_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)) - 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)) + understood_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/uncommon = list(LANGUAGE_ATOM), + /datum/language/machine = 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_holder/moth - understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/moffic = list(LANGUAGE_ATOM)) - spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/moffic = list(LANGUAGE_ATOM)) + understood_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/moffic = list(LANGUAGE_ATOM), + ) + 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)) + 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)) - spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/voltaic = list(LANGUAGE_ATOM)) + understood_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/voltaic = list(LANGUAGE_ATOM), + ) + spoken_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/voltaic = list(LANGUAGE_ATOM), + ) /datum/language_holder/golem - understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/terrum = list(LANGUAGE_ATOM)) - 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), - /datum/language/narsie = list(LANGUAGE_ATOM)) - spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/terrum = list(LANGUAGE_ATOM), - /datum/language/narsie = list(LANGUAGE_ATOM)) + understood_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/terrum = list(LANGUAGE_ATOM), + ) + spoken_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/terrum = list(LANGUAGE_ATOM), + ) /datum/language_holder/fly - understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/buzzwords = list(LANGUAGE_ATOM)) - spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/buzzwords = list(LANGUAGE_ATOM)) + understood_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/buzzwords = list(LANGUAGE_ATOM), + ) + spoken_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/buzzwords = list(LANGUAGE_ATOM), + ) /datum/language_holder/plant - understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/sylvan = list(LANGUAGE_ATOM)) - spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/sylvan = list(LANGUAGE_ATOM)) + understood_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/sylvan = list(LANGUAGE_ATOM), + ) + spoken_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/sylvan = list(LANGUAGE_ATOM), + ) /datum/language_holder/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)) + 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)) - spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/shadowtongue = list(LANGUAGE_ATOM)) + understood_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/shadowtongue = list(LANGUAGE_ATOM), + ) + spoken_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/shadowtongue = list(LANGUAGE_ATOM), + ) /datum/language_holder/clown - understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/monkey = list(LANGUAGE_ATOM)) - spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/monkey = list(LANGUAGE_ATOM)) + understood_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/monkey = list(LANGUAGE_ATOM), + ) + spoken_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/monkey = list(LANGUAGE_ATOM), + ) /datum/language_holder/syndicate - understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/codespeak = list(LANGUAGE_ATOM)) - spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/codespeak = list(LANGUAGE_ATOM)) + understood_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/codespeak = list(LANGUAGE_ATOM), + ) + spoken_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/codespeak = list(LANGUAGE_ATOM), + ) /datum/language_holder/beachbum - understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/beachbum = list(LANGUAGE_ATOM)) - spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/beachbum = list(LANGUAGE_ATOM)) + understood_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/beachbum = list(LANGUAGE_ATOM), + ) + spoken_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/beachbum = list(LANGUAGE_ATOM), + ) selected_language = /datum/language/beachbum +// Vending machines are extremely well-educated +/datum/language_holder/speaking_machine + understood_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), + ) + 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_holder/empty - understood_languages = list() - spoken_languages = list() + understood_languages = null + spoken_languages = null + +/datum/language_holder/universal + understood_languages = null + spoken_languages = null /datum/language_holder/universal/New() - ..() + . = ..() grant_all_languages() diff --git a/code/modules/language/language_manuals.dm b/code/modules/language/language_manuals.dm index a0158606393ca..eb4ca456440d8 100644 --- a/code/modules/language/language_manuals.dm +++ b/code/modules/language/language_manuals.dm @@ -1,5 +1,5 @@ /obj/item/language_manual - icon = 'icons/obj/library.dmi' + icon = 'icons/obj/service/library.dmi' icon_state = "book2" /// Number of charges the book has, limits the number of times it can be used. var/charges = 1 @@ -39,7 +39,7 @@ M.visible_message(span_danger("[user] beats [M] over the head with [src]!"), span_userdanger("[user] beats you over the head with [src]!"), span_hear("You hear smacking.")) else M.visible_message(span_notice("[user] teaches [M] by beating [M.p_them()] over the head with [src]!"), span_boldnotice("As [user] hits you with [src], [flavour_text]."), span_hear("You hear smacking.")) - M.grant_language(language, TRUE, TRUE, LANGUAGE_MIND) + M.grant_language(language, source = LANGUAGE_MIND) use_charge(user) /obj/item/language_manual/proc/use_charge(mob/user) @@ -65,13 +65,8 @@ /obj/item/language_manual/roundstart_species/Initialize(mapload) . = ..() - language = pick( \ - /datum/language/voltaic, \ - /datum/language/nekomimetic, \ - /datum/language/draconic, \ - /datum/language/moffic, \ - /datum/language/calcic \ - ) + var/list/available_languages = length(GLOB.uncommon_roundstart_languages) ? GLOB.uncommon_roundstart_languages : list(/datum/language/common) + language = pick(available_languages) name = "[initial(language.name)] manual" desc = "The book's cover reads: \"[initial(language.name)] for Xenos - Learn common galactic tongues in seconds.\"" flavour_text = "you feel empowered with a mastery over [initial(language.name)]" diff --git a/code/modules/language/language_menu.dm b/code/modules/language/language_menu.dm index f2cebf052d01e..0bfb7a79977af 100644 --- a/code/modules/language/language_menu.dm +++ b/code/modules/language/language_menu.dm @@ -20,46 +20,40 @@ /datum/language_menu/ui_data(mob/user) var/list/data = list() - var/atom/movable/AM = language_holder.get_atom() - if(isliving(AM)) - data["is_living"] = TRUE - else - data["is_living"] = FALSE - + var/atom/movable/speaker = language_holder.owner + data["is_living"] = isliving(speaker) 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, SPOKEN_LANGUAGE) if(!result) continue - var/datum/language/language = lang - var/list/L = list() + var/list/lang_data = list() - L["name"] = initial(language.name) - L["desc"] = initial(language.desc) - L["key"] = initial(language.key) - L["is_default"] = (language == language_holder.selected_language) - if(AM) - L["can_speak"] = AM.can_speak_language(language) - L["can_understand"] = AM.has_language(language) + lang_data["name"] = initial(language.name) + lang_data["desc"] = initial(language.desc) + lang_data["key"] = initial(language.key) + lang_data["is_default"] = (language == language_holder.selected_language) + if(speaker) + lang_data["can_speak"] = speaker.can_speak_language(language) + lang_data["can_understand"] = speaker.has_language(language) - data["languages"] += list(L) + UNTYPED_LIST_ADD(data["languages"], lang_data) - if(check_rights_for(user.client, R_ADMIN) || isobserver(AM)) + if(check_rights_for(user.client, R_ADMIN) || isobserver(speaker)) data["admin_mode"] = TRUE data["omnitongue"] = language_holder.omnitongue - 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, SPOKEN_LANGUAGE)) continue - var/datum/language/language = lang - var/list/L = list() + var/list/lang_data = list() - L["name"] = initial(language.name) - L["desc"] = initial(language.desc) - L["key"] = initial(language.key) + lang_data["name"] = initial(language.name) + lang_data["desc"] = initial(language.desc) + lang_data["key"] = initial(language.key) + + UNTYPED_LIST_ADD(data["unknown_languages"], lang_data) - data["unknown_languages"] += list(L) return data /datum/language_menu/ui_act(action, params) @@ -67,71 +61,67 @@ if(.) return var/mob/user = usr - var/atom/movable/AM = language_holder.get_atom() - + var/atom/movable/speaker = language_holder.owner + var/is_admin = check_rights_for(user.client, R_ADMIN) var/language_name = params["language_name"] var/datum/language/language_datum - for(var/lang in GLOB.all_languages) - var/datum/language/language = lang + for(var/datum/language/language as anything in GLOB.all_languages) if(language_name == initial(language.name)) language_datum = language - var/is_admin = check_rights_for(user.client, R_ADMIN) switch(action) if("select_default") - if(language_datum && AM.can_speak_language(language_datum)) + if(language_datum && speaker.can_speak_language(language_datum)) language_holder.selected_language = language_datum . = TRUE if("grant_language") - if((is_admin || isobserver(AM)) && language_datum) + if((is_admin || isobserver(speaker)) && language_datum) var/list/choices = list("Only Spoken", "Only Understood", "Both") var/choice = tgui_input_list(user, "How do you want to add this language?", "[language_datum]", choices) if(isnull(choice)) return - var/spoken = FALSE - var/understood = FALSE + var/adding_flags = NONE switch(choice) if("Only Spoken") - spoken = TRUE + adding_flags |= SPOKEN_LANGUAGE if("Only Understood") - understood = TRUE + adding_flags |= UNDERSTOOD_LANGUAGE if("Both") - spoken = TRUE - understood = TRUE - if(language_holder.blocked_languages && language_holder.blocked_languages[language_datum]) + adding_flags |= ALL + + if(LAZYACCESS(language_holder.blocked_languages, language_datum)) choice = tgui_alert(user, "Do you want to lift the blockage that's also preventing the language to be spoken or understood?", "[language_datum]", list("Yes", "No")) if(choice == "Yes") language_holder.remove_blocked_language(language_datum, LANGUAGE_ALL) - language_holder.grant_language(language_datum, understood, spoken) + language_holder.grant_language(language_datum, adding_flags) if(is_admin) - message_admins("[key_name_admin(user)] granted the [language_name] language to [key_name_admin(AM)].") - log_admin("[key_name(user)] granted the language [language_name] to [key_name(AM)].") + message_admins("[key_name_admin(user)] granted the [language_name] language to [key_name_admin(speaker)].") + log_admin("[key_name(user)] granted the language [language_name] to [key_name(speaker)].") . = TRUE if("remove_language") - if((is_admin || isobserver(AM)) && language_datum) + if((is_admin || isobserver(speaker)) && language_datum) var/list/choices = list("Only Spoken", "Only Understood", "Both") var/choice = tgui_input_list(user, "Which part do you wish to remove?", "[language_datum]", choices) if(isnull(choice)) return - var/spoken = FALSE - var/understood = FALSE + var/removing_flags = NONE switch(choice) if("Only Spoken") - spoken = TRUE + removing_flags |= SPOKEN_LANGUAGE if("Only Understood") - understood = TRUE + removing_flags |= UNDERSTOOD_LANGUAGE if("Both") - spoken = TRUE - understood = TRUE - language_holder.remove_language(language_datum, understood, spoken) + removing_flags |= ALL + + language_holder.remove_language(language_datum, removing_flags) if(is_admin) - message_admins("[key_name_admin(user)] removed the [language_name] language to [key_name_admin(AM)].") - log_admin("[key_name(user)] removed the language [language_name] to [key_name(AM)].") + message_admins("[key_name_admin(user)] removed the [language_name] language to [key_name_admin(speaker)].") + log_admin("[key_name(user)] removed the language [language_name] to [key_name(speaker)].") . = TRUE if("toggle_omnitongue") - if(is_admin || isobserver(AM)) + if(is_admin || isobserver(speaker)) language_holder.omnitongue = !language_holder.omnitongue 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.omnitongue ? "enabled" : "disabled"] the ability to speak all languages (that they know) of [key_name_admin(speaker)].") + log_admin("[key_name(user)] [language_holder.omnitongue ? "enabled" : "disabled"] the ability to speak all languages (that_they know) of [key_name(speaker)].") . = TRUE diff --git a/code/modules/language/machine.dm b/code/modules/language/machine.dm index 2d597d9333478..36962a712a1b5 100644 --- a/code/modules/language/machine.dm +++ b/code/modules/language/machine.dm @@ -4,7 +4,11 @@ spans = list(SPAN_ROBOT) key = "6" flags = NO_STUTTER - 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") + 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/piratespeak.dm b/code/modules/language/piratespeak.dm index af4b987174526..5f6cb4897715d 100644 --- a/code/modules/language/piratespeak.dm +++ b/code/modules/language/piratespeak.dm @@ -5,8 +5,8 @@ space_chance = 100 default_priority = 90 syllables = list( - "arr","ahoy","rum","aye","blimey","booty","bucko","grog","treasure", - "me","scallywag","landlubber","poopdeck","ye","avast", - "shiver","timbers","matey","swashbuckler" + "arr", "ahoy", "rum", "aye", "blimey", "booty", "bucko", "grog", "treasure", + "me", "scallywag", "landlubber", "poopdeck", "ye", "avast", + "shiver", "timbers", "matey", "swashbuckler" ) icon_state = "pirate" diff --git a/code/modules/language/uncommon.dm b/code/modules/language/uncommon.dm index 59518a2c68325..117ed1c76fd1e 100644 --- a/code/modules/language/uncommon.dm +++ b/code/modules/language/uncommon.dm @@ -5,12 +5,12 @@ flags = TONGUELESS_SPEECH space_chance = 50 syllables = list( -"ba", "be", "bo", "ca", "ce", "co", "da", "de", "do", -"fa", "fe", "fo", "ga", "ge", "go", "ha", "he", "ho", -"ja", "je", "jo", "ka", "ke", "ko", "la", "le", "lo", -"ma", "me", "mo", "na", "ne", "no", "ra", "re", "ro", -"sa", "se", "so", "ta", "te", "to", "va", "ve", "vo", -"xa", "xe", "xo", "ya", "ye", "yo", "za", "ze", "zo" + "ba", "be", "bo", "ca", "ce", "co", "da", "de", "do", + "fa", "fe", "fo", "ga", "ge", "go", "ha", "he", "ho", + "ja", "je", "jo", "ka", "ke", "ko", "la", "le", "lo", + "ma", "me", "mo", "na", "ne", "no", "ra", "re", "ro", + "sa", "se", "so", "ta", "te", "to", "va", "ve", "vo", + "xa", "xe", "xo", "ya", "ye", "yo", "za", "ze", "zo" ) icon_state = "galuncom" default_priority = 90 diff --git a/code/modules/library/barcode_scanner.dm b/code/modules/library/barcode_scanner.dm index 414a6b4301bdd..f96b60358c2ec 100644 --- a/code/modules/library/barcode_scanner.dm +++ b/code/modules/library/barcode_scanner.dm @@ -1,38 +1,28 @@ /obj/item/barcodescanner name = "barcode scanner" - icon = 'icons/obj/library.dmi' + icon = 'icons/obj/service/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 + ///Weakref to the library computer we are connected to. var/datum/weakref/computer_ref - /// Currently scanned book - var/datum/book_info/book_data - /// 0 - Scan only, 1 - Scan and Set Buffer, 2 - Scan and Attempt to Check In, 3 - Scan and Attempt to Add to Inventory - var/mode = 0 + ///The current scanning mode (BARCODE_SCANNER_CHECKIN|BARCODE_SCANNER_INVENTORY) + var/scan_mode = BARCODE_SCANNER_CHECKIN /obj/item/barcodescanner/attack_self(mob/user) - mode += 1 - if(mode > 3) - mode = 0 - to_chat(user, "[src] Status Display:") - var/modedesc - switch(mode) - if(0) - modedesc = "Scan book to local buffer." - if(1) - modedesc = "Scan book to local buffer and set associated computer buffer to match." - if(2) - modedesc = "Scan book to local buffer, attempt to check in scanned book." - if(3) - modedesc = "Scan book to local buffer, attempt to add book to general inventory." - else - modedesc = "ERROR" - to_chat(user, " - Mode [mode] : [modedesc]") - if(computer_ref?.resolve()) - to_chat(user, "Computer has been associated with this unit.") - else - to_chat(user, "No associated computer found. Only local scans will function properly.") - to_chat(user, "\n") + . = ..() + if(.) + return + if(!computer_ref?.resolve()) + user.balloon_alert(user, "not connected to computer!") + return + switch(scan_mode) + if(BARCODE_SCANNER_CHECKIN) + scan_mode = BARCODE_SCANNER_INVENTORY + user.balloon_alert(user, "inventory adding mode") + if(BARCODE_SCANNER_INVENTORY) + scan_mode = BARCODE_SCANNER_CHECKIN + user.balloon_alert(user, "check-in mode") + playsound(loc, 'sound/items/click.ogg', 20, TRUE) diff --git a/code/modules/library/bibles.dm b/code/modules/library/bibles.dm index 5a22b95db1755..5d3c6e276b429 100644 --- a/code/modules/library/bibles.dm +++ b/code/modules/library/bibles.dm @@ -77,12 +77,39 @@ GLOBAL_LIST_INIT(bibleitemstates, list( unique = TRUE /// Deity this bible is related to var/deity_name = "Space Jesus" + /// Component which catches bullets for us + var/datum/component/bullet_catcher /obj/item/book/bible/Initialize(mapload) . = ..() AddComponent(/datum/component/anti_magic, MAGIC_RESISTANCE_HOLY) + bullet_catcher = AddComponent(\ + /datum/component/bullet_intercepting,\ + active_slots = ITEM_SLOT_SUITSTORE,\ + on_intercepted = CALLBACK(src, PROC_REF(on_intercepted_bullet)),\ + ) carve_out() +/obj/item/book/bible/Destroy(force) + QDEL_NULL(bullet_catcher) + return ..() + +/// Destroy the bible when it's shot by a bullet +/obj/item/book/bible/proc/on_intercepted_bullet(mob/living/victim, obj/projectile/bullet) + victim.add_mood_event("blessing", /datum/mood_event/blessing) + playsound(victim, 'sound/magic/magic_block_holy.ogg', 50, TRUE) + victim.visible_message(span_warning("\The [src] takes \the [bullet] in [victim]'s place!")) + var/obj/structure/fluff/paper/stack/pages = new(get_turf(src)) + pages.dir = pick(GLOB.alldirs) + name = "punctured bible" + desc = "A memento of good luck, or perhaps divine intervention?" + icon_state = "shot" + if (!GLOB.bible_icon_state) + GLOB.bible_icon_state = "shot" // New symbol of your religion if you hadn't picked one + atom_storage?.remove_all(get_turf(src)) + QDEL_NULL(atom_storage) + QDEL_NULL(bullet_catcher) + /obj/item/book/bible/examine(mob/user) . = ..() if(deity_name) @@ -105,7 +132,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list( to_chat(user, span_userdanger("[deity_name] SMITE thee!")) add_memory_in_range(user, 7, /datum/memory/witnessed_gods_wrath, protagonist = user, deuteragonist = src, antagonist = deity_name) user.client?.give_award(/datum/award/achievement/misc/gods_wrath, user) - user.gib() + user.gib(DROP_ALL_REMAINS) else to_chat(user, span_userdanger("[deity_name] cast a curse upon thee!")) user.AddComponent(/datum/component/omen/bible) @@ -189,14 +216,14 @@ GLOBAL_LIST_INIT(bibleitemstates, list( var/mob/living/carbon/human/built_in_his_image = blessed for(var/obj/item/bodypart/bodypart as anything in built_in_his_image.bodyparts) if(!IS_ORGANIC_LIMB(bodypart)) - balloon_alert(user, "can't heal metal!") + balloon_alert(user, "can't heal inorganic!") return FALSE var/heal_amt = 10 var/list/hurt_limbs = built_in_his_image.get_damaged_bodyparts(1, 1, BODYTYPE_ORGANIC) if(length(hurt_limbs)) for(var/obj/item/bodypart/affecting as anything in hurt_limbs) - if(affecting.heal_damage(heal_amt, heal_amt, BODYTYPE_ORGANIC)) + if(affecting.heal_damage(heal_amt, heal_amt, required_bodytype = BODYTYPE_ORGANIC)) built_in_his_image.update_damage_overlays() built_in_his_image.visible_message(span_notice("[user] heals [built_in_his_image] with the power of [deity_name]!")) to_chat(built_in_his_image, span_boldnotice("May the power of [deity_name] compel you to be healed!")) @@ -333,6 +360,17 @@ GLOBAL_LIST_INIT(bibleitemstates, list( var/uses = 1 var/owner_name +/obj/item/book/bible/syndicate/Initialize(mapload) + . = ..() + AddComponent(/datum/component/anti_magic, MAGIC_RESISTANCE|MAGIC_RESISTANCE_HOLY) + AddComponent(/datum/component/effect_remover, \ + success_feedback = "You disrupt the magic of %THEEFFECT with %THEWEAPON.", \ + success_forcesay = "BEGONE FOUL MAGIKS!!", \ + tip_text = "Clear rune", \ + effects_we_clear = list(/obj/effect/rune, /obj/effect/heretic_rune, /obj/effect/cosmic_rune), \ + ) + AddElement(/datum/element/bane, target_type = /mob/living/simple_animal/revenant, damage_multiplier = 0, added_damage = 25, requires_combat_mode = FALSE) + /obj/item/book/bible/syndicate/attack_self(mob/living/carbon/human/user, modifiers) if(!uses || !istype(user)) return diff --git a/code/modules/library/book.dm b/code/modules/library/book.dm index 1736a32885090..e706872c710f7 100644 --- a/code/modules/library/book.dm +++ b/code/modules/library/book.dm @@ -1,7 +1,7 @@ /obj/item/book name = "book" desc = "Crack it open, inhale the musk of its pages, and learn something new." - icon = 'icons/obj/library.dmi' + icon = 'icons/obj/service/library.dmi' icon_state ="book" worn_icon_state = "book" throw_speed = 1 @@ -132,21 +132,16 @@ to_chat(user, span_warning("The name is invalid.")) return book_data.set_author(html_decode(author)) //Setting this encodes, don't want to double up + else if(istype(attacking_item, /obj/item/barcodescanner)) var/obj/item/barcodescanner/scanner = attacking_item var/obj/machinery/computer/libraryconsole/bookmanagement/computer = scanner.computer_ref?.resolve() if(!computer) - to_chat(user, span_alert("[scanner]'s screen flashes: 'No associated computer found!'")) + user.balloon_alert(user, "not connected to computer!") return - scanner.book_data = book_data.return_copy() - switch(scanner.mode) - if(0) - to_chat(user, span_notice("[scanner]'s screen flashes: 'Book stored in buffer.'")) - if(1) - computer.buffer_book = book_data.return_copy() - to_chat(user, span_notice("[scanner]'s screen flashes: 'Book stored in buffer. Book title stored in associated computer buffer.'")) - if(2) + switch(scanner.scan_mode) + if(BARCODE_SCANNER_CHECKIN) var/list/checkouts = computer.checkouts for(var/checkout_ref in checkouts) var/datum/borrowbook/maybe_ours = checkouts[checkout_ref] @@ -154,15 +149,19 @@ continue checkouts -= checkout_ref computer.checkout_update() - to_chat(user, span_notice("[scanner]'s screen flashes: 'Book stored in buffer. Book has been checked in.'")) + user.balloon_alert(user, "book checked in") + playsound(loc, 'sound/items/barcodebeep.ogg', 20, FALSE) return - to_chat(user, span_notice("[scanner]'s screen flashes: 'Book stored in buffer. No active check-out record found for current title.'")) - if(3) + user.balloon_alert(user, "book not checked out!") + return + if(BARCODE_SCANNER_INVENTORY) var/datum/book_info/our_copy = book_data.return_copy() computer.inventory[ref(our_copy)] = our_copy computer.inventory_update() - to_chat(user, span_notice("[scanner]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'")) + user.balloon_alert(user, "book added to inventory") + playsound(loc, 'sound/items/barcodebeep.ogg', 20, FALSE) + else if(try_carve(attacking_item, user, params)) return return ..() diff --git a/code/modules/library/bookcase.dm b/code/modules/library/bookcase.dm index 1cb7eb3d572e0..be2beca42bad7 100644 --- a/code/modules/library/bookcase.dm +++ b/code/modules/library/bookcase.dm @@ -4,7 +4,7 @@ /obj/structure/bookcase name = "bookcase" - icon = 'icons/obj/library.dmi' + icon = 'icons/obj/service/library.dmi' icon_state = "bookempty" desc = "A great place for storing knowledge." anchored = FALSE diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 3adf652eb1312..6a0c4c0300593 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -293,8 +293,6 @@ GLOBAL_VAR_INIT(library_table_modified, 0) var/screen_state = LIBRARY_INVENTORY ///Should we show the buttons required for changing screens? var/show_dropdown = TRUE - ///The name of the book being checked out - var/datum/book_info/buffer_book ///List of checked out books, /datum/borrowbook var/list/checkouts = list() ///The current max amount of checkout pages allowed @@ -321,6 +319,25 @@ GLOBAL_VAR_INIT(library_table_modified, 0) if(mapload) dynamic_inv_load = TRUE //Only load in stuff if we were placed during mapload +/obj/machinery/computer/libraryconsole/bookmanagement/ui_static_data(mob/user) + var/list/data = list() + data["inventory"] = list() + var/inventory_len = length(inventory) + if(inventory_len) + for(var/id in ((INVENTORY_PER_PAGE * inventory_page) + 1) to min(INVENTORY_PER_PAGE * (inventory_page + 1), inventory_len)) + var/book_ref = inventory[id] + var/datum/book_info/info = inventory[book_ref] + data["inventory"] += list(list( + "id" = id, + "ref" = book_ref, + "title" = info.get_title(), + "author" = info.get_author(), + )) + data["has_inventory"] = !!inventory_len + data["inventory_page"] = inventory_page + 1 + data["inventory_page_count"] = inventory_page_count + 1 + return data + /obj/machinery/computer/libraryconsole/bookmanagement/ui_data(mob/user) var/list/data = list() data["can_db_request"] = can_db_request() @@ -332,23 +349,6 @@ GLOBAL_VAR_INIT(library_table_modified, 0) load_nearby_books() switch(screen_state) - if(LIBRARY_INVENTORY) - data["inventory"] = list() - var/inventory_len = length(inventory) - if(inventory_len) - for(var/id in ((INVENTORY_PER_PAGE * inventory_page) + 1) to min(INVENTORY_PER_PAGE * (inventory_page + 1), inventory_len)) - var/book_ref = inventory[id] - var/datum/book_info/info = inventory[book_ref] - data["inventory"] += list(list( - "id" = id, - "ref" = book_ref, - "title" = info.get_title(), - "author" = info.get_author(), - )) - data["has_inventory"] = !!inventory_len - data["inventory_page"] = inventory_page + 1 - data["inventory_page_count"] = inventory_page_count + 1 - if(LIBRARY_CHECKOUT) data["checkouts"] = list() var/checkout_len = length(checkouts) @@ -365,9 +365,8 @@ GLOBAL_VAR_INIT(library_table_modified, 0) "overdue" = (timedue <= 0), "due_in_minutes" = timedue, "title" = loan.book_data.get_title(), - "author" = loan.book_data.get_author() + "author" = loan.book_data.get_author(), )) - data["checking_out"] = buffer_book?.get_title() data["has_checkout"] = !!checkout_len data["checkout_page"] = checkout_page + 1 data["checkout_page_count"] = checkout_page_count + 1 @@ -448,14 +447,22 @@ GLOBAL_VAR_INIT(library_table_modified, 0) inventory_update() return TRUE if("checkout") + var/list/available = list() + for(var/id in inventory) + var/datum/book_info/book_infos = inventory[id] + available[book_infos.title] = book_infos + var/book_name = params["book_name"] + if(QDELETED(src) || !book_name) + return + var/datum/book_info/book_info = available[book_name] + if(!istype(book_info)) + return var/datum/borrowbook/loan = new /datum/borrowbook - var/datum/book_info/book_data = buffer_book?.return_copy() || new /datum/book_info - book_data.set_title(params["book_name"]) var/loan_to = copytext(sanitize(params["loaned_to"]), 1, MAX_NAME_LEN) var/checkoutperiod = max(params["checkout_time"], 1) - loan.book_data = book_data.return_copy() + loan.book_data = book_info.return_copy() loan.loanedto = loan_to loan.checkout = world.time loan.duedate = world.time + (checkoutperiod MINUTES) @@ -536,42 +543,23 @@ GLOBAL_VAR_INIT(library_table_modified, 0) set_screen_state(MIN_LIBRARY) return TRUE -/obj/machinery/computer/libraryconsole/bookmanagement/attackby(obj/item/W, mob/user, params) - if(!istype(W, /obj/item/barcodescanner)) +/obj/machinery/computer/libraryconsole/bookmanagement/attackby(obj/item/weapon, mob/user, params) + if(!istype(weapon, /obj/item/barcodescanner)) return ..() - var/obj/item/barcodescanner/scanner = W + var/obj/item/barcodescanner/scanner = weapon + if(scanner.computer_ref?.resolve() == src) + balloon_alert(user, "already connected!") + return scanner.computer_ref = WEAKREF(src) - to_chat(user, span_notice("[scanner]'s associated machine has been set to [src].")) + balloon_alert(user, "scanner connected") audible_message(span_hear("[src] lets out a low, short blip.")) - if(!scanner.book_data) - return - - var/datum/book_info/scanner_book = scanner.book_data.return_copy() - switch(scanner.mode) - if(1) - buffer_book = scanner_book - to_chat(user, span_notice("[scanner]'s screen flashes: 'Book title stored in computer buffer.'")) - if(2) - for(var/checkout_ref in checkouts) - var/datum/borrowbook/maybe_ours = checkouts[checkout_ref] - if(!scanner_book.compare(maybe_ours.book_data)) - continue - checkouts -= checkout_ref - checkout_update() - to_chat(user, span_notice("[scanner]'s screen flashes: 'Book has been checked in.'")) - return - - to_chat(user, span_notice("[scanner]'s screen flashes: 'No active check-out record found for current title.'")) - if(3) - inventory[ref(scanner_book)] = scanner_book - inventory_update() - to_chat(user, span_notice("[scanner]'s screen flashes: 'Title added to general inventory.'")) - -/obj/machinery/computer/libraryconsole/bookmanagement/emag_act(mob/user) - if(!density) - return +/obj/machinery/computer/libraryconsole/bookmanagement/emag_act(mob/user, obj/item/card/emag/emag_card) + if(!density || obj_flags & EMAGGED) + return FALSE obj_flags |= EMAGGED + balloon_alert(user, "forbidden knowledge unlocked") + return TRUE /obj/machinery/computer/libraryconsole/bookmanagement/proc/set_screen_state(new_state) screen_state = clamp(new_state, MIN_LIBRARY, MAX_LIBRARY) @@ -697,7 +685,7 @@ GLOBAL_VAR_INIT(library_table_modified, 0) */ /obj/machinery/libraryscanner name = "scanner control interface" - icon = 'icons/obj/library.dmi' + icon = 'icons/obj/service/library.dmi' icon_state = "bigscanner" desc = "It's an industrial strength book scanner. Perfect!" density = TRUE @@ -769,7 +757,7 @@ GLOBAL_VAR_INIT(library_table_modified, 0) */ /obj/machinery/bookbinder name = "book binder" - icon = 'icons/obj/library.dmi' + icon = 'icons/obj/service/library.dmi' icon_state = "binder" desc = "Only intended for binding paper products." density = TRUE diff --git a/code/modules/library/random_books.dm b/code/modules/library/random_books.dm index 1b15eeb5e975d..3dcdff50a5801 100644 --- a/code/modules/library/random_books.dm +++ b/code/modules/library/random_books.dm @@ -94,6 +94,7 @@ /obj/structure/bookcase/random/reference name = "bookcase (Reference)" random_category = "Reference" + ///Chance to spawn a random manual book var/ref_book_prob = 20 /obj/structure/bookcase/random/reference/Initialize(mapload) @@ -101,3 +102,15 @@ while(books_to_load > 0 && prob(ref_book_prob)) books_to_load-- new /obj/item/book/manual/random(src) + +/obj/structure/bookcase/random/reference/wizard + desc = "It reeks of cheese..." + ///Whether this shelf has spawned a cheese granter + var/static/cheese_granter_spawned = FALSE + +/obj/structure/bookcase/random/reference/wizard/after_random_load() + if(cheese_granter_spawned) + return + cheese_granter_spawned = TRUE + new /obj/item/book/granter/action/spell/summon_cheese(src) + new /obj/item/book/manual/ancient_parchment(src) diff --git a/code/modules/library/skill_learning/job_skillchips/roboticist.dm b/code/modules/library/skill_learning/job_skillchips/roboticist.dm index b6835c9d484b1..401315e265abc 100644 --- a/code/modules/library/skill_learning/job_skillchips/roboticist.dm +++ b/code/modules/library/skill_learning/job_skillchips/roboticist.dm @@ -1,7 +1,7 @@ /obj/item/skillchip/job/roboticist name = "Cyborg C1-RCU-1T skillchip" desc = "A roboticist's second best friend." - auto_traits = list(TRAIT_KNOW_CYBORG_WIRES) + auto_traits = list(TRAIT_KNOW_ROBO_WIRES) skill_name = "Cyborg Circuitry" skill_description = "Recognise cyborg wire layouts and understand their functionality at a glance." skill_icon = "sitemap" diff --git a/code/modules/library/skill_learning/skill_station.dm b/code/modules/library/skill_learning/skill_station.dm index cceecf79d3630..d7fb5b7ff8e58 100644 --- a/code/modules/library/skill_learning/skill_station.dm +++ b/code/modules/library/skill_learning/skill_station.dm @@ -5,7 +5,7 @@ name = "\improper Skillsoft station" desc = "Learn skills with only minimal chance for brain damage." - icon = 'icons/obj/machines/implantchair.dmi' + icon = 'icons/obj/machines/implant_chair.dmi' icon_state = "implantchair" occupant_typecache = list(/mob/living/carbon) //todo make occupant_typecache per type state_open = TRUE diff --git a/code/modules/library/skill_learning/skillchip.dm b/code/modules/library/skill_learning/skillchip.dm index 956c11c79e0b8..762e8e0162c52 100644 --- a/code/modules/library/skill_learning/skillchip.dm +++ b/code/modules/library/skill_learning/skillchip.dm @@ -9,7 +9,7 @@ name = "skillchip" desc = "This biochip integrates with user's brain to enable mastery of specific skill. Consult certified Nanotrasen neurosurgeon before use." - icon = 'icons/obj/module.dmi' + icon = 'icons/obj/assemblies/module.dmi' icon_state = "skillchip" custom_price = PAYCHECK_CREW * 3 w_class = WEIGHT_CLASS_SMALL @@ -42,7 +42,9 @@ var/cooldown = 5 MINUTES /// Cooldown for chip actions. COOLDOWN_DECLARE(chip_cooldown) - /// Used to determine if this is an abstract type or not. If this is meant to be an abstract type, set it to the type's path. Will be overridden by subsequent abstract parents. See /datum/action/item_action/chameleon/change/skillchip/initialize_disguises() + /// Used to determine if this is an abstract type or not. + /// If this is meant to be an abstract type, set it to the type's path. + /// Will be overridden by subsequent abstract parents. var/abstract_parent_type = /obj/item/skillchip /// Set to TRUE when the skill chip's effects are applied. Set to FALSE when they're not. var/active = FALSE @@ -487,4 +489,13 @@ activate_message = span_notice("You recall learning from your grandmother how they baked their cookies with love.") deactivate_message = span_notice("You forget all memories imparted upon you by your grandmother. Were they even your real grandma?") +/obj/item/skillchip/master_angler + name = "Mast-Angl-Er skillchip" + auto_traits = list(TRAIT_REVEAL_FISH) + skill_name = "Fisherman's Discernment" + skill_description = "While fishing, it'll make a smidge easier to guess whatever you're trying to catch." + skill_icon = "fish" + activate_message = span_notice("You feel the knowledge and passion of several sunbaked, seasoned fishermen burn within you.") + deactivate_message = span_notice("You no longer feel like casting a fishing rod by the sunny riverside.") + #undef SKILLCHIP_CATEGORY_GENERAL diff --git a/code/modules/lighting/lighting_area.dm b/code/modules/lighting/lighting_area.dm index c11130dcbc18a..f7e1ca2d86802 100644 --- a/code/modules/lighting/lighting_area.dm +++ b/code/modules/lighting/lighting_area.dm @@ -64,7 +64,7 @@ lighting_effect.layer = LIGHTING_PRIMARY_LAYER lighting_effect.blend_mode = BLEND_ADD lighting_effect.alpha = base_lighting_alpha - lighting_effect.color = base_lighting_color + lighting_effect.color = (base_lighting_color == COLOR_STARLIGHT ? GLOB.starlight_color : base_lighting_color) lighting_effect.appearance_flags = RESET_TRANSFORM | RESET_ALPHA | RESET_COLOR lighting_effects += lighting_effect add_overlay(lighting_effects[1]) diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm index 989a5ac4ac90f..2ab7ad1c13486 100644 --- a/code/modules/lighting/lighting_atom.dm +++ b/code/modules/lighting/lighting_atom.dm @@ -1,6 +1,14 @@ // The proc you should always use to set the light of this atom. -/atom/proc/set_light(l_range, l_power, l_color = NONSENSICAL_VALUE, l_on) +/atom/proc/set_light(l_range, l_power, l_color = NONSENSICAL_VALUE, l_angle, l_dir, l_on) + // We null everything but l_dir, because we don't want to allow for modifications while frozen + if(light_flags & LIGHT_FROZEN) + l_range = null + l_power = null + l_color = null + l_on = null + l_angle = null + if(l_range > 0 && l_range < MINIMUM_USEFUL_LIGHT_RANGE) l_range = MINIMUM_USEFUL_LIGHT_RANGE //Brings the range up to 1.4, which is just barely brighter than the soft lighting that surrounds players. @@ -16,6 +24,12 @@ if(l_color != NONSENSICAL_VALUE) set_light_color(l_color) + if(!isnull(l_angle)) + set_light_angle(l_angle) + + if(!isnull(l_dir)) + set_light_dir(l_dir) + if(!isnull(l_on)) set_light_on(l_on) @@ -41,7 +55,7 @@ light.update(.) else light = new/datum/light_source(src, .) - + return . /** * Updates the atom's opacity value. @@ -50,12 +64,12 @@ * It notifies (potentially) affected light sources so they can update (if needed). */ /atom/proc/set_opacity(new_opacity) - if (new_opacity == opacity) + if (new_opacity == opacity || light_flags & LIGHT_FROZEN) return SEND_SIGNAL(src, COMSIG_ATOM_SET_OPACITY, new_opacity) . = opacity opacity = new_opacity - + return . /atom/movable/set_opacity(new_opacity) . = ..() @@ -67,83 +81,117 @@ else RemoveElement(/datum/element/light_blocking) - /turf/set_opacity(new_opacity) . = ..() if(isnull(.)) return recalculate_directional_opacity() -/atom/proc/flash_lighting_fx(_range = FLASH_LIGHT_RANGE, _power = FLASH_LIGHT_POWER, _color = COLOR_WHITE, _duration = FLASH_LIGHT_DURATION) - return - - -/turf/flash_lighting_fx(_range = FLASH_LIGHT_RANGE, _power = FLASH_LIGHT_POWER, _color = COLOR_WHITE, _duration = FLASH_LIGHT_DURATION) - if(!_duration) - stack_trace("Lighting FX obj created on a turf without a duration") - new /obj/effect/dummy/lighting_obj (src, _range, _power, _color, _duration) - - -/obj/flash_lighting_fx(_range = FLASH_LIGHT_RANGE, _power = FLASH_LIGHT_POWER, _color = COLOR_WHITE, _duration = FLASH_LIGHT_DURATION) - if(!_duration) - stack_trace("Lighting FX obj created on a obj without a duration") - new /obj/effect/dummy/lighting_obj (get_turf(src), _range, _power, _color, _duration) +/atom/proc/flash_lighting_fx(range = FLASH_LIGHT_RANGE, power = FLASH_LIGHT_POWER, color = COLOR_WHITE, duration = FLASH_LIGHT_DURATION, light_type = /obj/effect/dummy/lighting_obj) + if(!duration) + stack_trace("Lighting FX obj created on \[[type]\] without a duration") + var/obj/effect/dummy/light_obj = new light_type(get_turf(src), range, power, color, duration) + return light_obj +/mob/living/flash_lighting_fx(range = FLASH_LIGHT_RANGE, power = FLASH_LIGHT_POWER, color = COLOR_WHITE, duration = FLASH_LIGHT_DURATION, light_type = /obj/effect/dummy/lighting_obj/moblight) + return mob_light(range, power, color, duration) -/mob/living/flash_lighting_fx(_range = FLASH_LIGHT_RANGE, _power = FLASH_LIGHT_POWER, _color = COLOR_WHITE, _duration = FLASH_LIGHT_DURATION) - mob_light(_range, _power, _color, _duration) - - -/mob/living/proc/mob_light(_range, _power, _color, _duration) - var/obj/effect/dummy/lighting_obj/moblight/mob_light_obj = new (src, _range, _power, _color, _duration) +/mob/living/proc/mob_light(range, power, color, duration, light_type = /obj/effect/dummy/lighting_obj/moblight) + var/obj/effect/dummy/lighting_obj/moblight/mob_light_obj = new light_type(src, range, power, color, duration) return mob_light_obj /// Setter for the light power of this atom. /atom/proc/set_light_power(new_power) - if(new_power == light_power) + if(new_power == light_power || light_flags & LIGHT_FROZEN) return if(SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_POWER, new_power) & COMPONENT_BLOCK_LIGHT_UPDATE) return . = light_power light_power = new_power SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_LIGHT_POWER, .) + return . /// Setter for the light range of this atom. /atom/proc/set_light_range(new_range) - if(new_range == light_range) + if(new_range == light_range || light_flags & LIGHT_FROZEN) return if(SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_RANGE, new_range) & COMPONENT_BLOCK_LIGHT_UPDATE) return . = light_range light_range = new_range SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_LIGHT_RANGE, .) + return . /// Setter for the light color of this atom. /atom/proc/set_light_color(new_color) - if(new_color == light_color) + if(new_color == light_color || light_flags & LIGHT_FROZEN) return if(SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_COLOR, new_color) & COMPONENT_BLOCK_LIGHT_UPDATE) return . = light_color light_color = new_color SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_LIGHT_COLOR, .) + return . + +/// Setter for the light angle of this atom +/atom/proc/set_light_angle(new_value) + if(new_value == light_angle || light_flags & LIGHT_FROZEN) + return + if(SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_ANGLE, new_value) & COMPONENT_BLOCK_LIGHT_UPDATE) + return + . = light_angle + light_angle = new_value + SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_LIGHT_ANGLE, .) + return . + +/// Setter for the light direction of this atom +/atom/proc/set_light_dir(new_value) + // No frozen check here because we allow direction changes in a freeze + if(new_value == light_dir) + return + if(SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_DIR, new_value) & COMPONENT_BLOCK_LIGHT_UPDATE) + return + . = light_dir + light_dir = new_value + SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_LIGHT_DIR, .) + return . /// Setter for whether or not this atom's light is on. /atom/proc/set_light_on(new_value) - if(new_value == light_on) + if(new_value == light_on || light_flags & LIGHT_FROZEN) return if(SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_ON, new_value) & COMPONENT_BLOCK_LIGHT_UPDATE) return . = light_on light_on = new_value SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_LIGHT_ON, .) + return . /// Setter for the light flags of this atom. /atom/proc/set_light_flags(new_value) - if(new_value == light_flags) + if(new_value == light_flags || (light_flags & LIGHT_FROZEN && new_value & LIGHT_FROZEN)) return if(SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_FLAGS, new_value) & COMPONENT_BLOCK_LIGHT_UPDATE) return . = light_flags light_flags = new_value SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_LIGHT_FLAGS, .) + return . + +/atom/proc/get_light_offset() + return list(0, 0) + +/// Returns a list of x and y offsets to apply to our visual lighting position +/proc/calculate_light_offset(atom/get_offset) + var/list/hand_back + if(!(get_offset.light_flags & LIGHT_IGNORE_OFFSET)) + hand_back = get_visual_offset(get_offset) + hand_back[1] = -hand_back[1] / world.icon_size + hand_back[2] = -hand_back[2] / world.icon_size + else + hand_back = list(0, 0) + + var/list/atoms_opinion = get_offset.get_light_offset() + hand_back[1] += atoms_opinion[1] + hand_back[2] += atoms_opinion[2] + return hand_back diff --git a/code/modules/lighting/lighting_corner.dm b/code/modules/lighting/lighting_corner.dm index 40222efccfc0b..912a586bc3b57 100644 --- a/code/modules/lighting/lighting_corner.dm +++ b/code/modules/lighting/lighting_corner.dm @@ -192,3 +192,38 @@ SSlighting.corners_queue -= src return ..() + +/// Debug proc to aid in understanding how corners work +/datum/lighting_corner/proc/display(max_lum) + if(QDELETED(src)) + return + + var/turf/draw_to = master_SW || master_NE || master_SE || master_NW + var/mutable_appearance/display = mutable_appearance('icons/turf/debug.dmi', "corner_color", LIGHT_DEBUG_LAYER, draw_to, BALLOON_CHAT_PLANE) + if(x > draw_to.x) + display.pixel_x = 16 + else + display.pixel_x = -16 + if(y > draw_to.y) + display.pixel_y = 16 + else + display.pixel_y = -16 + + display.color = rgb(cache_r * 255, cache_g * 255, cache_b * 255) + + draw_to.add_overlay(display) + +/datum/lighting_corner/dummy/display() + return + +/// Makes all lighting corners visible, debug to aid in understanding +/proc/display_corners() + var/list/corners = list() + var/max_lum = 0 + for(var/datum/lighting_corner/corner) // I am so sorry + corners += corner + max_lum = max(max_lum, corner.largest_color_luminosity) + + + for(var/datum/lighting_corner/corner as anything in corners) + corner.display(max_lum) diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index 39c1d35d5c895..5137632918709 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -9,8 +9,14 @@ ///The turf under the source atom. var/turf/source_turf - ///The turf the top_atom appears to over. - var/turf/pixel_turf + /// How much to x shift our light by when displaying it + var/offset_x = 0 + /// How much to y shift our light by when displaying it + var/offset_y = 0 + /// How much larger our light sheet should be, based off offset_x and y + /// We clamp to at least 1, so if offset_x is 0.1, then this'll be 1 + var/visual_offset + ///Intensity of the emitter light. var/light_power /// The range of the emitted light. @@ -23,6 +29,11 @@ var/lum_g var/lum_b + /// What direction our angled light is pointed + var/light_dir = NONE + /// How many degrees of a circle should our light show. 360 is all of it, 180 is half, etc + var/light_angle = 360 + // The lumcount values used to apply the light. var/tmp/applied_lum_r var/tmp/applied_lum_g @@ -45,7 +56,6 @@ add_to_light_sources(top_atom) source_turf = top_atom - pixel_turf = get_turf_pixel(top_atom) || source_turf light_power = source_atom.light_power light_range = source_atom.light_range @@ -54,6 +64,8 @@ PARSE_LIGHT_COLOR(src) update() + if(GLOB.light_debug_enabled) + source_atom.debug() /datum/light_source/Destroy(force) remove_lum() @@ -69,7 +81,6 @@ top_atom = null source_atom = null source_turf = null - pixel_turf = null return ..() @@ -140,23 +151,23 @@ // 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/_turf_z = lighting_source.pixel_turf.z; \ - var/list/_sheet = get_sheet(); \ - var/list/_multiz_sheet = list(); \ - if(!!GET_LOWEST_STACK_OFFSET(source_turf.z)) { \ - _multiz_sheet = get_sheet(multiz = TRUE); \ - } \ - var/_range_offset = CEILING(lighting_source.light_range, 1) + 0.5 + 2; \ - var/_multiz_offset = SSmapping.max_plane_offset + 1; \ - 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; \ +#define SETUP_CORNERS_CACHE(lighting_source) \ + var/_turf_x = lighting_source.source_turf.x; \ + var/_turf_y = lighting_source.source_turf.y; \ + var/_turf_z = lighting_source.source_turf.z; \ + var/list/_sheet = get_sheet(); \ + var/list/_multiz_sheet = list(); \ + if(!!GET_LOWEST_STACK_OFFSET(source_turf.z)) { \ + _multiz_sheet = get_sheet(multiz = TRUE); \ + } \ + var/_range_offset = CEILING(lighting_source.light_range, 1) + 0.5 + 1 + lighting_source.visual_offset; \ + var/_multiz_offset = SSmapping.max_plane_offset + 1; \ + 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) \ @@ -165,7 +176,7 @@ var/_applied_lum_b = lighting_source.applied_lum_b; // Read out of our sources light sheet, a map of offsets -> the luminosity to use -#define LUM_FALLOFF(C) _sheet[C.x - _turf_x + _range_offset][C.y - _turf_y + _range_offset] +#define LUM_FALLOFF(C) _sheet[C.x - _turf_x + _range_offset][C.y - _turf_y + _range_offset] #define LUM_FALLOFF_MULTIZ(C) _multiz_sheet[C.z - _turf_z + _multiz_offset][C.x - _turf_x + _range_offset][C.y - _turf_y + _range_offset] // Macro that applies light to a new corner. @@ -205,50 +216,98 @@ /datum/light_source/proc/get_sheet(multiz = FALSE) var/list/static/key_to_sheet = list() var/range = max(1, light_range); - var/key = "[range]-[multiz]" + var/key = "[range]-[visual_offset]-[offset_x]-[offset_y]-[light_dir]-[light_angle]-[multiz]" var/list/hand_back = key_to_sheet[key] if(!hand_back) if(multiz) - hand_back = generate_sheet_multiz(range) + hand_back = generate_sheet_multiz(range, visual_offset, offset_x, offset_y, light_dir, light_angle) else - hand_back = generate_sheet(range) + hand_back = generate_sheet(range, visual_offset, offset_x, offset_y, light_dir, light_angle) key_to_sheet[key] = hand_back return hand_back /// Returns a list of lists that encodes the light falloff of our source /// Takes anything that impacts our generation as input /// This function should be "pure", no side effects or reads from the source object -/datum/light_source/proc/generate_sheet(range, z_level = 0) +/datum/light_source/proc/generate_sheet(range, visual_offset, x_offset, y_offset, center_dir, angle, z_level = 0) var/list/encode = list() - var/bound_range = CEILING(range, 1) + 1 + // How far away the turfs we get are, and how many there are are often not the same calculation + // So we need to include the visual offset, so we can ensure our sheet is large enough to accept all the distance differences + var/bound_range = CEILING(range, 1) + visual_offset + // Corners are placed at 0.5 offsets - // We need our coords to reflect that - for(var/x in (-bound_range - 0.5) to (bound_range + 0.5)) + // We need our coords to reflect that (though x_offsets that change the basis for how things are calculated are fine too) + for(var/x in (-(bound_range) + x_offset - 0.5) to (bound_range + x_offset + 0.5)) var/list/row = list() - for(var/y in (-bound_range - 0.5) to (bound_range + 0.5)) - row += falloff_at_coord(x, y, z_level, range) + for(var/y in (-(bound_range) + y_offset - 0.5) to (bound_range + y_offset + 0.5)) + row += falloff_at_coord(x, y, z_level, range, center_dir, light_angle) encode += list(row) return encode /// Returns a THREE dimensional list of lists that encodes the lighting falloff of our source /// Takes anything that impacts our generation as input /// This function should be "pure", no side effects or reads from the passed object -/datum/light_source/proc/generate_sheet_multiz(range) +/datum/light_source/proc/generate_sheet_multiz(range, visual_offset, x_offset, y_offset, center_dir, angle) var/list/encode = list() var/z_range = SSmapping.max_plane_offset // Let's just be safe yeah? for(var/z in -z_range to z_range) - var/list/sheet = generate_sheet(range, z) + var/list/sheet = generate_sheet(range, visual_offset, x_offset, y_offset, center_dir, angle, z) encode += list(sheet) return encode /// Takes x y and z offsets from the source as input, alongside our source's range /// Returns a value between 0 and 1, 0 being dark on that tile, 1 being fully lit -/datum/light_source/proc/falloff_at_coord(x, y, z, range) - var/_range_divisor = max(1, range) +/datum/light_source/proc/falloff_at_coord(x, y, z, range, center_dir, angle) + var/range_divisor = max(1, range) + // You may notice we use squares here even though there are three components // Because z diffs are so functionally small, cubes and cube roots are too aggressive - return 1 - CLAMP01(sqrt(x ** 2 + y ** 2 + z ** 2 + LIGHTING_HEIGHT) / _range_divisor) - + // The larger the distance is, the less bright our light will be + var/multiplier = 1 - CLAMP01(sqrt(x ** 2 + y ** 2 + z ** 2 + LIGHTING_HEIGHT) / range_divisor) + if(angle >= 360 || angle <= 0) + return multiplier + + // Turn our positional offset into an angle + var/coord_angle = delta_to_angle(x, y) + // Get the difference between the angle we want, and the angle we have + var/center_angle = dir2angle(center_dir) + var/angle_delta = abs(center_angle - coord_angle) + // Now we have to normalize the angle delta to be between 0 and 180, instead of 0 and 360 + // This ensures removing say, 15 degrees removes it from both sides, rather then just one + // Turns an unfurling fan into a pair of scissors + if(angle_delta > 180) + angle_delta = 180 - (angle_delta - 180) + // We allow angle deltas to a certian amount, angle / 2 + // If we pass that, then it starts effecting the visuals + // Oh and we'll scale it so 30 degrees is the "0" point, where things become fully dark + // This could be variable, it just isn't yet yaknow? + return max(multiplier * (1 - max(angle_delta - (angle / 2), 0) / 30), 0) + +/// Dumps the content of a lighting sheet to chat, for debugging +/datum/light_source/proc/print_sheet() + var/list/sheet = get_sheet() + var/list/output = list() + var/multiz_depth = 1 + // If we have a list 3 layers down we're multiz + if(length(sheet[1][1])) + multiz_depth = length(sheet) + var/column_seperator = "" + for(var/i in 1 to length(sheet)) + column_seperator += "----" + output += column_seperator + for(var/i in 1 to multiz_depth) + for(var/list/column in sheet) + var/list/print_column = list() + for(var/row in column) + print_column += round(row, 0.1) + output += print_column.Join(", ") + output += column_seperator + to_chat(usr, "\n[output.Join("\n")]") + +/// Debug proc, for when lighting sheets fuck up +/// Accepts the sheet (2 or 3 (multiz) dimensional list of lighting values at some offset) +/// alongside x and y delta values and the sheet's "offset", which is the amount required to ensure everything indexes at 1 +/// Optionally, you can pass similar values for multiz stuff /proc/read_sheet(list/sheet, x, y, offset, z, z_offset) var/list/working = sheet var/offset_x = x + offset @@ -311,6 +370,7 @@ /datum/light_source/proc/refresh_values() var/update = FALSE var/atom/source_atom = src.source_atom + var/turf/old_source_turf = source_turf if (QDELETED(source_atom)) qdel(src) @@ -332,19 +392,16 @@ qdel(src) return FALSE - if (isturf(top_atom)) - if (source_turf != top_atom) + var/atom/visual_source = source_atom + if(isturf(top_atom)) + visual_source = source_atom + if(source_turf != top_atom) source_turf = top_atom - pixel_turf = source_turf update = TRUE - else if (top_atom.loc != source_turf) - source_turf = top_atom.loc - pixel_turf = get_turf_pixel(top_atom) - update = TRUE else - var/pixel_loc = get_turf_pixel(top_atom) - if (pixel_loc != pixel_turf) - pixel_turf = pixel_loc + visual_source = top_atom + if(top_atom.loc != source_turf) + source_turf = top_atom.loc update = TRUE if (!isturf(source_turf)) @@ -363,6 +420,21 @@ else if (applied_lum_r != lum_r || applied_lum_g != lum_g || applied_lum_b != lum_b) update = TRUE + if(source_atom.light_dir != light_dir) + light_dir = source_atom.light_dir + update = TRUE + + if (source_atom.light_angle != light_angle) + light_angle = source_atom.light_angle + update = TRUE + + var/list/visual_offsets = calculate_light_offset(visual_source) + if(visual_offsets[1] != offset_x || visual_offsets[2] != offset_y || source_turf != old_source_turf) + offset_x = visual_offsets[1] + offset_y = visual_offsets[2] + visual_offset = max(CEILING(abs(offset_x), 1), CEILING(abs(offset_y), 1)) + update = TRUE + // If we need to update, well, update if (update) needs_update = LIGHTING_CHECK_UPDATE @@ -381,24 +453,25 @@ return list() var/oldlum = source_turf.luminosity - source_turf.luminosity = CEILING(light_range, 1) + var/working_range = CEILING(light_range + visual_offset, 1) + source_turf.luminosity = working_range var/uses_multiz = !!GET_LOWEST_STACK_OFFSET(source_turf.z) if(!uses_multiz) // Yes I know this could be acomplished with an if in the for loop, but it's fukin lighting code man - for(var/turf/T in view(CEILING(light_range, 1), source_turf)) + for(var/turf/T in view(working_range, source_turf)) if(IS_OPAQUE_TURF(T)) continue INSERT_CORNERS(corners, T) source_turf.luminosity = oldlum return corners - for(var/turf/T in view(CEILING(light_range, 1), source_turf)) + for(var/turf/T in view(working_range, source_turf)) if(IS_OPAQUE_TURF(T)) continue INSERT_CORNERS(corners, T) - var/turf/below = SSmapping.get_turf_below(T) + var/turf/below = GET_TURF_BELOW(T) var/turf/previous = T while(below) // If we find a non transparent previous, end @@ -412,15 +485,15 @@ INSERT_CORNERS(corners, below) // ANNND then we add the one below it previous = below - below = SSmapping.get_turf_below(below) + below = GET_TURF_BELOW(below) - var/turf/above = SSmapping.get_turf_above(T) + var/turf/above = GET_TURF_ABOVE(T) while(above) // If we find a non transparent turf, end if(!istransparentturf(above) || IS_OPAQUE_TURF(above)) break INSERT_CORNERS(corners, above) - above = SSmapping.get_turf_above(above) + above = GET_TURF_ABOVE(above) source_turf.luminosity = oldlum return corners diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm index d093961411e40..b2bc367662937 100644 --- a/code/modules/lighting/lighting_turf.dm +++ b/code/modules/lighting/lighting_turf.dm @@ -91,7 +91,6 @@ 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. - ///Transfer the lighting of one area to another /turf/proc/transfer_area_lighting(area/old_area, area/new_area) if(SSlighting.initialized && !space_lit) diff --git a/code/modules/lighting/static_lighting_area.dm b/code/modules/lighting/static_lighting_area.dm index dc8e9c4887937..7dc6cc6c3d850 100644 --- a/code/modules/lighting/static_lighting_area.dm +++ b/code/modules/lighting/static_lighting_area.dm @@ -7,7 +7,7 @@ GLOBAL_LIST_INIT_TYPED(fullbright_overlays, /mutable_appearance, list(create_ful SET_PLANE_W_SCALAR(lighting_effect, LIGHTING_PLANE, offset) lighting_effect.layer = LIGHTING_PRIMARY_LAYER lighting_effect.blend_mode = BLEND_ADD - lighting_effect.color = COLOR_STARLIGHT + lighting_effect.color = GLOB.starlight_color return lighting_effect /area diff --git a/code/modules/logging/categories/log_category_debug.dm b/code/modules/logging/categories/log_category_debug.dm index 03b7d51954769..8833a59b1a0e9 100644 --- a/code/modules/logging/categories/log_category_debug.dm +++ b/code/modules/logging/categories/log_category_debug.dm @@ -1,10 +1,6 @@ /datum/log_category/debug category = LOG_CATEGORY_DEBUG -/datum/log_category/debug_tgui - category = LOG_CATEGORY_DEBUG_TGUI - master_category = /datum/log_category/debug - /datum/log_category/debug_sql category = LOG_CATEGORY_DEBUG_SQL master_category = /datum/log_category/debug @@ -13,14 +9,9 @@ category = LOG_CATEGORY_DEBUG_LUA master_category = /datum/log_category/debug -/datum/log_category/debug_href - category = LOG_CATEGORY_DEBUG_HREF - master_category = /datum/log_category/debug - // This is not in the debug master category on purpose, do not add it /datum/log_category/debug_runtime category = LOG_CATEGORY_RUNTIME - internal_formatting = FALSE /datum/log_category/debug_mapping category = LOG_CATEGORY_DEBUG_MAPPING diff --git a/code/modules/logging/categories/log_category_href.dm b/code/modules/logging/categories/log_category_href.dm new file mode 100644 index 0000000000000..cd1fdd877a765 --- /dev/null +++ b/code/modules/logging/categories/log_category_href.dm @@ -0,0 +1,6 @@ +/datum/log_category/href + category = LOG_CATEGORY_HREF + +/datum/log_category/href_tgui + category = LOG_CATEGORY_HREF_TGUI + master_category = /datum/log_category/href diff --git a/code/modules/logging/categories/log_category_misc.dm b/code/modules/logging/categories/log_category_misc.dm index b24d13e94ec03..e3a737d432819 100644 --- a/code/modules/logging/categories/log_category_misc.dm +++ b/code/modules/logging/categories/log_category_misc.dm @@ -58,8 +58,7 @@ config_flag = /datum/config_entry/flag/log_speech_indicators // Logs seperately, printed into on server shutdown to store hard deletes and such -/datum/log_category/debug_qdel +/datum/log_category/qdel category = LOG_CATEGORY_QDEL // We want this human readable so it's easy to see at a glance entry_flags = ENTRY_USE_DATA_W_READABLE - internal_formatting = FALSE diff --git a/code/modules/logging/log_category.dm b/code/modules/logging/log_category.dm index 6f6ea96f3311d..96849ff02c821 100644 --- a/code/modules/logging/log_category.dm +++ b/code/modules/logging/log_category.dm @@ -21,6 +21,7 @@ var/secret = FALSE /// Whether the readable version of the log message is formatted internally instead of by rustg + /// IF YOU CHANGE THIS VERIFY LOGS ARE STILL PARSED CORRECTLY var/internal_formatting = FALSE /// List of log entries for this category diff --git a/code/modules/logging/log_holder.dm b/code/modules/logging/log_holder.dm index a60bbc91b2e00..7d8386e77b6e0 100644 --- a/code/modules/logging/log_holder.dm +++ b/code/modules/logging/log_holder.dm @@ -249,7 +249,13 @@ GENERAL_PROTECT_DATUM(/datum/log_holder) /datum/log_holder/proc/human_readable_timestamp(precision = 3) var/start = time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss") // now we grab the millis from the rustg timestamp - var/list/timestamp = splittext(unix_timestamp_string(), ".") + var/rustg_stamp = unix_timestamp_string() + var/list/timestamp = splittext(rustg_stamp, ".") +#ifdef UNIT_TESTS + if(length(timestamp) != 2) + stack_trace("rustg returned illegally formatted string '[rustg_stamp]'") + return start +#endif var/millis = timestamp[2] if(length(millis) > precision) millis = copytext(millis, 1, precision + 1) @@ -260,9 +266,6 @@ GENERAL_PROTECT_DATUM(/datum/log_holder) /// the data list is optional and will be recursively json serialized. /datum/log_holder/proc/Log(category, message, list/data) // This is Log because log is a byond internal proc - if(shutdown) - stack_trace("Performing logging after shutdown! This might not be functional in the future!") - // but for right now it's fine // do not include the message because these go into the runtime log and we might be secret! if(!istext(message)) diff --git a/code/modules/mafia/_defines.dm b/code/modules/mafia/_defines.dm index abf158d57ad3c..835aff9d63dd4 100644 --- a/code/modules/mafia/_defines.dm +++ b/code/modules/mafia/_defines.dm @@ -68,7 +68,7 @@ #define CAN_USE_ON_OTHERS (1<<0) ///Flag that decides whether the Mafia ability can be used on themselves. #define CAN_USE_ON_SELF (1<<1) -///Flag that decides whether the Mafia ability can be used on dead players. This overwrites the first two, and only allows for dead. +///Flag that decides whether the Mafia ability can be used on dead players. #define CAN_USE_ON_DEAD (1<<2) #define MAFIA_PHASE_SETUP "No Game" diff --git a/code/modules/mafia/abilities/abilities.dm b/code/modules/mafia/abilities/abilities.dm index ec4b7071ae8b5..59ee7570c322d 100644 --- a/code/modules/mafia/abilities/abilities.dm +++ b/code/modules/mafia/abilities/abilities.dm @@ -56,7 +56,7 @@ return FALSE if(potential_target) - if(!(use_flags & CAN_USE_ON_DEAD) && (potential_target.game_status == MAFIA_DEAD)) + if((use_flags & CAN_USE_ON_DEAD) && (potential_target.game_status != MAFIA_DEAD)) if(!silent) to_chat(host_role.body, span_notice("This can only be used on dead players.")) return FALSE diff --git a/code/modules/mafia/controller.dm b/code/modules/mafia/controller.dm index 7ab757ff3f44a..f8d9db131064d 100644 --- a/code/modules/mafia/controller.dm +++ b/code/modules/mafia/controller.dm @@ -369,7 +369,7 @@ GLOBAL_LIST_INIT(mafia_role_by_alignment, setup_mafia_role_by_alignment()) * * role: mafia_role datum to reward. */ /datum/mafia_controller/proc/award_role(award, datum/mafia_role/rewarded) - var/client/role_client = GLOB.directory[rewarded.body.client] + var/client/role_client = rewarded.body.client role_client?.give_award(award, rewarded.body) /** @@ -389,7 +389,7 @@ GLOBAL_LIST_INIT(mafia_role_by_alignment, setup_mafia_role_by_alignment()) roles.mafia_alert.update_text("[message]") roles.reveal_role(src) phase = MAFIA_PHASE_VICTORY_LAP - next_phase_timer = QDEL_IN(src, VICTORY_LAP_PERIOD_LENGTH) + next_phase_timer = QDEL_IN_STOPPABLE(src, VICTORY_LAP_PERIOD_LENGTH) /** * Cleans up the game, resetting variables back to the beginning and removing the map with the generator. @@ -414,7 +414,7 @@ GLOBAL_LIST_INIT(mafia_role_by_alignment, setup_mafia_role_by_alignment()) * * 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.airlocks) //I really dislike pathing of these + for(var/obj/machinery/door/poddoor/D as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/poddoor)) if(D.id != "mafia") //so as to not trigger shutters on station, lol continue if(close) @@ -578,7 +578,7 @@ GLOBAL_LIST_INIT(mafia_role_by_alignment, setup_mafia_role_by_alignment()) for(var/datum/mafia_role/role as anything in all_roles) var/mob/living/carbon/human/H = new(get_turf(role.assigned_landmark)) - H.add_traits(list(TRAIT_NOFIRE, TRAIT_NOBREATH, TRAIT_CANNOT_CRYSTALIZE), MAFIA_TRAIT) + H.add_traits(list(TRAIT_NOFIRE, TRAIT_NOBREATH, TRAIT_CANNOT_CRYSTALIZE, TRAIT_PERMANENTLY_MORTAL), MAFIA_TRAIT) H.equipOutfit(outfit_to_distribute) H.status_flags |= GODMODE RegisterSignal(H, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(display_votes)) @@ -1045,7 +1045,7 @@ GLOBAL_LIST_INIT(mafia_role_by_alignment, setup_mafia_role_by_alignment()) return ..() /atom/movable/screen/mafia_popup/proc/update_text(text) - maptext = MAPTEXT(" [text]") + maptext = MAPTEXT(" [text]") maptext_width = view_to_pixels(owner.body.client?.view_size.getView())[1] owner.body.client?.screen += src addtimer(CALLBACK(src, PROC_REF(null_text), owner.body.client), 10 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE) diff --git a/code/modules/mafia/outfits.dm b/code/modules/mafia/outfits.dm index ff5749ef43c5e..0edb796212b60 100644 --- a/code/modules/mafia/outfits.dm +++ b/code/modules/mafia/outfits.dm @@ -29,7 +29,7 @@ /datum/outfit/mafia/ninja name = "Mafia Ninja" glasses = /obj/item/clothing/glasses/sunglasses - suit = /obj/item/clothing/suit/costume/ianshirt + suit = /obj/item/clothing/suit/costume/wellworn_shirt/graphic/ian uniform = /obj/item/clothing/under/pants/jeans shoes = /obj/item/clothing/shoes/sandal @@ -46,7 +46,7 @@ gloves = /obj/item/clothing/gloves/color/white shoes = /obj/item/clothing/shoes/laceup suit = /obj/item/clothing/suit/costume/gothcoat - uniform = /obj/item/clothing/under/suit/black + uniform = /obj/item/clothing/under/costume/buttondown/slacks/service //town @@ -69,7 +69,7 @@ /datum/outfit/mafia/psychologist name = "Mafia Psychologist" - uniform = /obj/item/clothing/under/suit/black + uniform = /obj/item/clothing/under/costume/buttondown/slacks/service neck = /obj/item/clothing/neck/tie/black/tied shoes = /obj/item/clothing/shoes/laceup @@ -155,7 +155,7 @@ suit = /obj/item/clothing/suit/apron /datum/outfit/mafia/obsessed/post_equip(mob/living/carbon/human/H) - for(var/obj/item/carried_item in H.get_equipped_items(TRUE)) + for(var/obj/item/carried_item in H.get_equipped_items(include_pockets = TRUE, include_accessories = TRUE)) carried_item.add_mob_blood(H)//Oh yes, there will be blood... H.regenerate_icons() diff --git a/code/modules/mapfluff/ruins/icemoonruin_code/library.dm b/code/modules/mapfluff/ruins/icemoonruin_code/library.dm index 149cb64f63be5..1de9ce2dc728c 100644 --- a/code/modules/mapfluff/ruins/icemoonruin_code/library.dm +++ b/code/modules/mapfluff/ruins/icemoonruin_code/library.dm @@ -26,7 +26,7 @@ /obj/item/feather name = "feather" desc = "A dark, wilting feather. It seems as old as time." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "feather" force = 0 throwforce = 0 diff --git a/code/modules/mapfluff/ruins/lavaland_ruin_code.dm b/code/modules/mapfluff/ruins/lavaland_ruin_code.dm index 059075c8e5df4..6b5690de6338a 100644 --- a/code/modules/mapfluff/ruins/lavaland_ruin_code.dm +++ b/code/modules/mapfluff/ruins/lavaland_ruin_code.dm @@ -31,7 +31,7 @@ /obj/item/golem_shell name = "incomplete free golem shell" - icon = 'icons/obj/wizard.dmi' + icon = 'icons/mob/shells.dmi' icon_state = "shell_unfinished" desc = "The incomplete body of a golem. Add ten sheets of certain minerals to finish." w_class = WEIGHT_CLASS_BULKY diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm b/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm index 1149e5af4fee9..adb5afaf5c83f 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm @@ -6,7 +6,7 @@ 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 = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "freeze_cube" inhand_icon_state = "freeze_cube" throwforce = 10 diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm index 9b3ace438f14a..5e459758ee405 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm @@ -20,7 +20,7 @@ custom_materials = list(/datum/material/bone=SHEET_MATERIAL_AMOUNT*4) icon = 'icons/obj/art/statuelarge.dmi' icon_state = "rib" - icon_preview = 'icons/obj/previews.dmi' + icon_preview = 'icons/obj/fluff/previews.dmi' icon_state_preview = "rib" /obj/structure/statue/bone/skull @@ -29,7 +29,7 @@ custom_materials = list(/datum/material/bone=SHEET_MATERIAL_AMOUNT*12) icon = 'icons/obj/art/statuelarge.dmi' icon_state = "skull" - icon_preview = 'icons/obj/previews.dmi' + icon_preview = 'icons/obj/fluff/previews.dmi' icon_state_preview = "skull" /obj/structure/statue/bone/skull/half @@ -37,7 +37,7 @@ custom_materials = list(/datum/material/bone=SHEET_MATERIAL_AMOUNT*6) icon = 'icons/obj/art/statuelarge.dmi' icon_state = "skull-half" - icon_preview = 'icons/obj/previews.dmi' + icon_preview = 'icons/obj/fluff/previews.dmi' icon_state_preview = "halfskull" //***Wasteland floor and rock turfs here. @@ -73,7 +73,7 @@ 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) + new /obj/effect/decal/remains/human(src, 1) else new /obj/item/stack/sheet/bone(src, 1) @@ -90,6 +90,9 @@ .=..() create_reagents(20) reagents.add_reagent(dispensedreagent, 20) + //I'm pretty much aware that, because how oil wells and sinks work, attackby() won't work unless in combat mode. + //Thankfully, the user can cast the line from a distance. + AddComponent(/datum/component/fishing_spot, /datum/fish_source/oil_well) /obj/structure/sink/oil_well/attack_hand(mob/user, list/modifiers) flick("puddle-oil-splash",src) @@ -129,13 +132,13 @@ icon = 'icons/obj/storage/crates.dmi' icon_state = "grave" base_icon_state = "grave" - dense_when_open = TRUE + density = FALSE material_drop = /obj/item/stack/ore/glass/basalt material_drop_amount = 5 anchorable = FALSE anchored = 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 + breakout_time = 2 MINUTES open_sound = 'sound/effects/shovel_dig.ogg' close_sound = 'sound/effects/shovel_dig.ogg' can_install_electronics = FALSE @@ -160,13 +163,18 @@ return NONE +/obj/structure/closet/crate/grave/close(mob/living/user) + . = ..() + // So that graves stay undense + set_density(FALSE) + /obj/structure/closet/crate/grave/examine(mob/user) . = ..() . += span_notice("It can be [EXAMINE_HINT((opened ? "closed" : "dug open"))] with a shovel.") /obj/structure/closet/crate/grave/filled/PopulateContents() //GRAVEROBBING IS NOW A FEATURE ..() - new /obj/effect/decal/remains/human/grave(src) + new /obj/effect/decal/remains/human(src) switch(rand(1,8)) if(1) new /obj/item/coin/gold(src) @@ -237,10 +245,16 @@ dug_closed = TRUE close(user) else if(open(user, force = TRUE)) - user.add_mood_event("graverobbing", /datum/mood_event/graverobbing) + if(HAS_MIND_TRAIT(user, TRAIT_MORBID)) + user.add_mood_event("morbid_graverobbing", /datum/mood_event/morbid_graverobbing) + else + user.add_mood_event("graverobbing", /datum/mood_event/graverobbing) if(lead_tomb && first_open) - 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!")) + if(HAS_MIND_TRAIT(user, TRAIT_MORBID)) + to_chat(user, span_notice("Did someone say something? I'm sure it was nothing.")) + else + 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 TRUE @@ -262,6 +276,29 @@ deconstruct(TRUE) return TRUE +/obj/structure/closet/crate/grave/container_resist_act(mob/living/user) + if(opened) + return + // The player is trying to dig themselves out of an early grave + user.changeNext_move(CLICK_CD_BREAKOUT) + user.last_special = world.time + CLICK_CD_BREAKOUT + user.visible_message( + span_warning("[src]'s dirt begins to shift and rumble!"), + span_notice("You desperately begin to claw at the dirt around you, trying to force yourself upwards through the soil... (this will take about [DisplayTimeText(breakout_time)].)"), + span_hear("You hear the sound of shifting dirt from [src]."), + ) + if(do_after(user, breakout_time, target = src)) + if(opened) + return + user.visible_message( + span_danger("[user] emerges from [src], scattering dirt everywhere!"), + span_notice("You triumphantly surface out of [src], scattering dirt all around the grave!"), + ) + bust_open() + else + if(user.loc == src) + to_chat(user, span_warning("You fail to dig yourself out of [src]!")) + /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." @@ -275,9 +312,6 @@ 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" diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/puzzle.dm b/code/modules/mapfluff/ruins/lavalandruin_code/puzzle.dm index 14c17b621920f..0e5437b9fd409 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/puzzle.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/puzzle.dm @@ -138,10 +138,10 @@ return sortTim(elements,cmp=/proc/cmp_xy_desc) /obj/effect/sliding_puzzle/proc/get_base_icon() - var/icon/I = new('icons/obj/puzzle.dmi') + var/icon/I = new('icons/obj/fluff/puzzle.dmi') var/list/puzzles = icon_states(I) var/puzzle_state = pick(puzzles) - var/icon/P = new('icons/obj/puzzle.dmi',puzzle_state) + var/icon/P = new('icons/obj/fluff/puzzle.dmi',puzzle_state) return P /obj/effect/sliding_puzzle/proc/setup() @@ -197,7 +197,7 @@ /obj/structure/puzzle_element name = "mysterious pillar" desc = "puzzling..." - icon = 'icons/obj/lavaland/artefacts.dmi' + icon = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "puzzle_pillar" anchored = FALSE density = TRUE @@ -223,6 +223,10 @@ puzzle_small.pixel_y = 7 add_overlay(puzzle_small) +/obj/structure/puzzle_element/update_icon(updates=ALL) // to prevent update_appearance calls from cutting the overlays and not adding them back + . = ..() + set_puzzle_icon() + /obj/structure/puzzle_element/Destroy() if(source) source.elements -= src @@ -291,7 +295,7 @@ /obj/effect/sliding_puzzle/prison/dispense_reward() prisoner.forceMove(get_turf(src)) - prisoner.notransform = FALSE + REMOVE_TRAIT(prisoner, TRAIT_NO_TRANSFORM, element_type) prisoner = null //Some armor so it's harder to kill someone by mistake. @@ -313,7 +317,7 @@ /obj/item/prisoncube name = "Prison Cube" desc = "Dusty cube with humanoid imprint on it." - icon = 'icons/obj/lavaland/artefacts.dmi' + icon = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "prison_cube" /obj/item/prisoncube/afterattack(atom/target, mob/user, proximity_flag, click_parameters) @@ -340,7 +344,7 @@ return FALSE //First grab the prisoner and move them temporarily into the generator so they won't get thrown around. - prisoner.notransform = TRUE + ADD_TRAIT(prisoner, TRAIT_NO_TRANSFORM, cube.element_type) prisoner.forceMove(cube) to_chat(prisoner,span_userdanger("You're trapped by the prison cube! You will remain trapped until someone solves it.")) diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/surface.dm b/code/modules/mapfluff/ruins/lavalandruin_code/surface.dm index ed1e5c2982484..13db0e2d73077 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/surface.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/surface.dm @@ -9,7 +9,7 @@ /obj/structure/dead_ratvar name = "hulking wreck" desc = "The remains of a monstrous war machine." - icon = 'icons/obj/lavaland/dead_ratvar.dmi' + icon = 'icons/obj/mining_zones/dead_ratvar.dmi' icon_state = "dead_ratvar" flags_1 = ON_BORDER_1 appearance_flags = LONG_GLIDE 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 index 0ccc9d6c0dc62..c9aee1ea54253 100644 --- a/code/modules/mapfluff/ruins/objects_and_mobs/ash_walker_den.dm +++ b/code/modules/mapfluff/ruins/objects_and_mobs/ash_walker_den.dm @@ -56,10 +56,10 @@ 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 + if(H.mind?.has_antag_datum(/datum/antagonist/ashwalker) && (H.ckey || 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) + if(H.ckey) deadmind = H else deadmind = H.get_ghost(FALSE, TRUE) @@ -76,14 +76,14 @@ 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 + var/deliverykey = H.fingerprintslast //ckey of whoever brought the body + var/mob/living/deliverymob = get_mob_by_key(deliverykey) //mob of said ckey //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.investigate_log("has been gibbed by the necropolis tendril.", INVESTIGATE_DEATHS) - H.gib() + H.gib(DROP_ALL_REMAINS) 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)) diff --git a/code/modules/mapfluff/ruins/objects_and_mobs/cursed_slot_machine.dm b/code/modules/mapfluff/ruins/objects_and_mobs/cursed_slot_machine.dm new file mode 100644 index 0000000000000..ab6b2bb1825c9 --- /dev/null +++ b/code/modules/mapfluff/ruins/objects_and_mobs/cursed_slot_machine.dm @@ -0,0 +1,129 @@ +/// Greed's slot machine: Used in the Greed ruin. Deals damage on each use, with a successful use giving a d20 of fate. +/obj/structure/cursed_slot_machine + name = "greed's slot machine" + desc = "High stakes, high rewards." + icon = 'icons/obj/machines/computer.dmi' + icon_state = "slots" + anchored = TRUE + density = TRUE + /// Variable that tracks the screen we display. + var/icon_screen = "slots_screen" + /// Should we be emitting light? + var/brightness_on = TRUE + /// The probability the player has to win. + var/win_prob = 5 + /// The maximum amount of curses we will allow a player to have before disallowing them to use the machine. + var/max_curse_amount = 5 + /// machine's reward when you hit jackpot + var/prize = /obj/structure/cursed_money + /// should we be applying the cursed status effect? + var/status_effect_on_roll = TRUE + /// Length of the cooldown between the machine being used and being able to spin the machine again. + var/cooldown_length = 15 SECONDS + /// Are we currently in use? Anti-spam prevention measure. + var/in_use = FALSE + /// Cooldown between pulls of the cursed slot machine. + COOLDOWN_DECLARE(spin_cooldown) + +/obj/structure/cursed_slot_machine/Initialize(mapload) + . = ..() + update_appearance() + set_light(brightness_on) + +/obj/structure/cursed_slot_machine/interact(mob/user) + if(!ishuman(user)) + return + + if(!check_and_set_usage(user)) + return + + user.visible_message( + span_warning("[user] pulls [src]'s lever with a glint in [user.p_their()] eyes!"), + span_warning("You feel a draining as you pull the lever, but you know it'll be worth it."), + ) + + icon_screen = "slots_screen_working" + update_appearance() + playsound(src, 'sound/lavaland/cursed_slot_machine.ogg', 50, FALSE) + addtimer(CALLBACK(src, PROC_REF(determine_victor), user), 5 SECONDS) + +/obj/structure/cursed_slot_machine/update_overlays() + . = ..() + var/overlay_state = icon_screen + . += mutable_appearance(icon, overlay_state) + . += emissive_appearance(icon, overlay_state, src) + +/// Validates that the user can use the cursed slot machine. User is the person using the slot machine. Returns TRUE if we can, FALSE otherwise. +/obj/structure/cursed_slot_machine/proc/check_and_set_usage(mob/living/carbon/human/user) + if(in_use) + balloon_alert_to_viewers("already spinning!") + return FALSE + + var/signal_value = SEND_SIGNAL(user, COMSIG_CURSED_SLOT_MACHINE_USE, max_curse_amount) + + if(!COOLDOWN_FINISHED(src, spin_cooldown) || (signal_value & SLOT_MACHINE_USE_POSTPONE)) + to_chat(user, span_danger("The machine doesn't engage. You get the compulsion to try again in a few seconds.")) + return FALSE + + if(signal_value & SLOT_MACHINE_USE_CANCEL) // failsafe in case we don't want to let the machine be used for some reason (like if we're maxed out on curses but not getting gibbed) + say("We're sorry, but we can no longer serve you at this establishment.") + return FALSE + + in_use = TRUE + return TRUE + +/obj/structure/cursed_slot_machine/proc/determine_victor(mob/living/carbon/human/user) + icon_screen = initial(icon_screen) + update_appearance() + + in_use = FALSE + COOLDOWN_START(src, spin_cooldown, cooldown_length) + + if(!prob(win_prob)) + if(status_effect_on_roll && isnull(user.has_status_effect(/datum/status_effect/grouped/cursed))) + user.apply_status_effect(/datum/status_effect/grouped/cursed) + + SEND_SIGNAL(user, COMSIG_CURSED_SLOT_MACHINE_LOST) + playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) + balloon_alert_to_viewers("you lost!") + return + + playsound(src, 'sound/lavaland/cursed_slot_machine_jackpot.ogg', 50, FALSE) + new prize(get_turf(src)) + if(user) + to_chat(user, span_boldwarning("You've hit the jackpot!!! Laughter echoes around you as your reward appears in the machine's place.")) + + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_CURSED_SLOT_MACHINE_WON) + qdel(src) + +/// Prize given out by the cursed slot machine that will give the user one Die of Fate and then delete itself. +/obj/structure/cursed_money + name = "bag of money" + desc = "RICH! YES! YOU KNEW IT WAS WORTH IT! YOU'RE RICH! RICH! RICH!" + icon = 'icons/obj/storage/storage.dmi' + icon_state = "moneybag" + anchored = FALSE + density = TRUE + +/obj/structure/cursed_money/Initialize(mapload) + . = ..() + addtimer(CALLBACK(src, PROC_REF(collapse)), 1 MINUTES) + +/obj/structure/cursed_money/proc/collapse() + if(QDELETED(src)) + return + visible_message(span_warning("[src] falls in on itself, with the canvas rotting away and contents vanishing.")) + qdel(src) + +/obj/structure/cursed_money/attack_hand(mob/living/user, list/modifiers) + . = ..() + if(.) + return + user.visible_message( + span_warning("[user] opens the bag and removes a die."), + span_warning("[span_boldwarning("You open the bag...!")] But all you see is a bag full of dice. Confused, you take one..."), + ) + var/turf/location = get_turf(user) + var/obj/item/dice/d20/fate/one_use/critical_fail = new(location) + user.put_in_hands(critical_fail) + collapse() diff --git a/code/modules/mapfluff/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/mapfluff/ruins/objects_and_mobs/necropolis_gate.dm index 8d7ed7e6f2f61..54e167fb25541 100644 --- a/code/modules/mapfluff/ruins/objects_and_mobs/necropolis_gate.dm +++ b/code/modules/mapfluff/ruins/objects_and_mobs/necropolis_gate.dm @@ -240,10 +240,6 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate) /obj/structure/necropolis_arch/singularity_pull() return 0 -#define STABLE 0 //The tile is stable and won't collapse/sink when crossed. -#define COLLAPSE_ON_CROSS 1 //The tile is unstable and will temporary become unusable when crossed. -#define DESTROY_ON_CROSS 2 //The tile is nearly broken and will permanently become unusable when crossed. -#define UNIQUE_EFFECT 3 //The tile has some sort of unique effect when crossed. //stone tiles for boss arenas /obj/structure/stone_tile name = "stone tile" @@ -255,67 +251,17 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF var/tile_key = "pristine_tile" var/tile_random_sprite_max = 24 - var/fall_on_cross = STABLE //If the tile has some sort of effect when crossed - var/fallen = FALSE //If the tile is unusable - var/falling = FALSE //If the tile is falling /obj/structure/stone_tile/Initialize(mapload) . = ..() icon_state = "[tile_key][rand(1, tile_random_sprite_max)]" - var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = PROC_REF(on_entered), - ) - AddElement(/datum/element/connect_loc, loc_connections) -/obj/structure/stone_tile/singularity_pull() - return + var/static/list/give_turf_traits + if(!give_turf_traits) + give_turf_traits = string_list(list(TRAIT_LAVA_STOPPED, TRAIT_CHASM_STOPPED)) + AddElement(/datum/element/give_turf_traits, give_turf_traits) -/obj/structure/stone_tile/proc/on_entered(datum/source, atom/movable/AM) - SIGNAL_HANDLER - if(falling || fallen) - return - var/turf/T = get_turf(src) - if(!islava(T) && !ischasm(T)) //nothing to sink or fall into - return - var/obj/item/I - if(isitem(AM)) - I = AM - var/mob/living/L - if(isliving(AM)) - L = AM - switch(fall_on_cross) - if(COLLAPSE_ON_CROSS, DESTROY_ON_CROSS) - if((I && I.w_class >= WEIGHT_CLASS_BULKY) || (L && !(L.movement_type & FLYING) && L.mob_size >= MOB_SIZE_HUMAN)) //too heavy! too big! aaah! - INVOKE_ASYNC(src, PROC_REF(collapse)) - if(UNIQUE_EFFECT) - crossed_effect(AM) - -/obj/structure/stone_tile/proc/collapse() - falling = TRUE - var/break_that_sucker = fall_on_cross == DESTROY_ON_CROSS - playsound(src, 'sound/effects/pressureplate.ogg', 50, TRUE) - Shake(-1, -1, 25) - sleep(0.5 SECONDS) - if(break_that_sucker) - playsound(src, 'sound/effects/break_stone.ogg', 50, TRUE) - else - playsound(src, 'sound/mecha/mechmove04.ogg', 50, TRUE) - animate(src, alpha = 0, pixel_y = pixel_y - 3, time = 5) - fallen = TRUE - if(break_that_sucker) - QDEL_IN(src, 10) - else - addtimer(CALLBACK(src, PROC_REF(rebuild)), 55) - -/obj/structure/stone_tile/proc/rebuild() - pixel_x = initial(pixel_x) - pixel_y = initial(pixel_y) - 5 - animate(src, alpha = initial(alpha), pixel_x = initial(pixel_x), pixel_y = initial(pixel_y), time = 30) - sleep(3 SECONDS) - falling = FALSE - fallen = FALSE - -/obj/structure/stone_tile/proc/crossed_effect(atom/movable/AM) +/obj/structure/stone_tile/singularity_pull() return /obj/structure/stone_tile/block @@ -411,8 +357,3 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate) name = "burnt stone surrounding tile" icon_state = "burnt_surrounding_tile1" tile_key = "burnt_surrounding_tile" - -#undef STABLE -#undef COLLAPSE_ON_CROSS -#undef DESTROY_ON_CROSS -#undef UNIQUE_EFFECT 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 acb351813cf09..eb5f2437bcd4d 100644 --- a/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm +++ b/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm @@ -1,91 +1,5 @@ //These objects are used in the cardinal sin-themed ruins (i.e. Gluttony, Pride...) -/obj/structure/cursed_slot_machine //Greed's slot machine: Used in the Greed ruin. Deals clone damage on each use, with a successful use giving a d20 of fate. - name = "greed's slot machine" - desc = "High stakes, high rewards." - icon = 'icons/obj/computer.dmi' - icon_state = "slots" - var/icon_screen = "slots_screen" - var/brightness_on = 1 - anchored = TRUE - density = TRUE - var/win_prob = 5 - -/obj/structure/cursed_slot_machine/Initialize(mapload) - . = ..() - update_appearance() - set_light(brightness_on) - -/obj/structure/cursed_slot_machine/interact(mob/living/carbon/human/user) - if(!istype(user)) - return - if(obj_flags & IN_USE) - return - obj_flags |= IN_USE - user.adjustCloneLoss(20) - if(user.stat) - to_chat(user, span_userdanger("No... just one more try...")) - user.investigate_log("has been gibbed by [src].", INVESTIGATE_DEATHS) - user.gib() - else - user.visible_message(span_warning("[user] pulls [src]'s lever with a glint in [user.p_their()] eyes!"), "You feel a draining as you pull the lever, but you \ - know it'll be worth it.") - icon_screen = "slots_screen_working" - update_appearance() - playsound(src, 'sound/lavaland/cursed_slot_machine.ogg', 50, FALSE) - addtimer(CALLBACK(src, PROC_REF(determine_victor), user), 50) - -/obj/structure/cursed_slot_machine/proc/determine_victor(mob/living/user) - icon_screen = "slots_screen" - update_appearance() - obj_flags &= ~IN_USE - if(prob(win_prob)) - playsound(src, 'sound/lavaland/cursed_slot_machine_jackpot.ogg', 50, FALSE) - new/obj/structure/cursed_money(get_turf(src)) - if(user) - to_chat(user, span_boldwarning("You've hit jackpot. Laughter echoes around you as your reward appears in the machine's place.")) - qdel(src) - else - if(user) - to_chat(user, span_boldwarning("Fucking machine! Must be rigged. Still... one more try couldn't hurt, right?")) - -/obj/structure/cursed_slot_machine/update_overlays() - . = ..() - var/overlay_state = icon_screen - . += mutable_appearance(icon, overlay_state) - . += emissive_appearance(icon, overlay_state, src) - -/obj/structure/cursed_money - name = "bag of money" - desc = "RICH! YES! YOU KNEW IT WAS WORTH IT! YOU'RE RICH! RICH! RICH!" - icon = 'icons/obj/storage/storage.dmi' - icon_state = "moneybag" - anchored = FALSE - density = TRUE - -/obj/structure/cursed_money/Initialize(mapload) - . = ..() - addtimer(CALLBACK(src, PROC_REF(collapse)), 600) - -/obj/structure/cursed_money/proc/collapse() - visible_message("[src] falls in on itself, \ - canvas rotting away and contents vanishing.") - qdel(src) - -/obj/structure/cursed_money/attack_hand(mob/living/user, list/modifiers) - . = ..() - if(.) - return - user.visible_message("[user] opens the bag and \ - and removes a die. The bag then vanishes.", - "[span_boldwarning("You open the bag...!")]\n\ - And see a bag full of dice. Confused, \ - you take one... and the bag vanishes.") - var/turf/T = get_turf(user) - var/obj/item/dice/d20/fate/one_use/critical_fail = new(T) - user.put_in_hands(critical_fail) - qdel(src) - /obj/effect/gluttony //Gluttony's wall: Used in the Gluttony ruin. Only lets the overweight through. name = "gluttony's wall" desc = "Only those who truly indulge may pass." @@ -104,7 +18,7 @@ return TRUE else to_chat(H, span_warning("You're repulsed by even looking at [src]. Only a pig could force themselves to go through it.")) - if(istype(mover, /mob/living/simple_animal/hostile/morph)) + if(istype(mover, /mob/living/basic/morph)) return TRUE //can't be bothered to do sloth right now, will make later @@ -112,7 +26,7 @@ /obj/item/knife/envy //Envy's knife: Found in the Envy ruin. Attackers take on the appearance of whoever they strike. name = "envy's knife" desc = "Their success will be yours." - icon = 'icons/obj/cult/items_and_weapons.dmi' + icon = 'icons/obj/weapons/khopesh.dmi' icon_state = "render" inhand_icon_state = "knife" lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' @@ -136,4 +50,4 @@ user.updateappearance(mutcolor_update=1) user.domutcheck() user.visible_message(span_warning("[user]'s appearance shifts into [H]'s!"), \ - span_boldannounce("[H.p_they(TRUE)] think[H.p_s()] [H.p_theyre()] sooo much better than you. Not anymore, [H.p_they()] won't.")) + span_boldannounce("[H.p_They()] think[H.p_s()] [H.p_theyre()] sooo much better than you. Not anymore, [H.p_they()] won't.")) diff --git a/code/modules/mapfluff/ruins/spaceruin_code/TheDerelict.dm b/code/modules/mapfluff/ruins/spaceruin_code/TheDerelict.dm index 642877e480bc3..3507cb7d94746 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/TheDerelict.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/TheDerelict.dm @@ -75,7 +75,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 as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/airlock)) if(A.id_tag == "derelictvault") if(!door1) door1 = A diff --git a/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm b/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm index e5ba1d5fc0b21..830fb83c0f39a 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm @@ -136,7 +136,7 @@ GLOBAL_VAR_INIT(fscpassword, generate_password()) rapid_melee = 1 retreat_distance = 2 minimum_distance = 4 - casingtype = /obj/item/ammo_casing/a556/weak + casingtype = /obj/item/ammo_casing/a223/weak projectilesound = 'sound/weapons/gun/smg/shot.ogg' loot = list(/obj/effect/mob_spawn/corpse/human/nanotrasenassaultsoldier) mob_spawner = /obj/effect/mob_spawn/corpse/human/nanotrasenassaultsoldier diff --git a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm index 633081ecefe3d..d1926119a15b1 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm @@ -4,7 +4,7 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) /obj/item/hilbertshotel name = "Hilbert's Hotel" desc = "A sphere of what appears to be an intricate network of bluespace. Observing it in detail seems to give you a headache as you try to comprehend the infinite amount of infinitesimally distinct points on its surface." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/structures.dmi' icon_state = "hilbertshotel" w_class = WEIGHT_CLASS_SMALL resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF @@ -97,9 +97,10 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) if(!storageTurf) //Blame subsystems for not allowing this to be in Initialize if(!GLOB.hhStorageTurf) var/datum/map_template/hilbertshotelstorage/storageTemp = new() - var/datum/turf_reservation/storageReservation = SSmapping.RequestBlockReservation(3, 3) - storageTemp.load(locate(storageReservation.bottom_left_coords[1], storageReservation.bottom_left_coords[2], storageReservation.bottom_left_coords[3])) - GLOB.hhStorageTurf = locate(storageReservation.bottom_left_coords[1]+1, storageReservation.bottom_left_coords[2]+1, storageReservation.bottom_left_coords[3]) + var/datum/turf_reservation/storageReservation = SSmapping.request_turf_block_reservation(1, 1, 1) + var/turf/storage_turf = storageReservation.bottom_left_turfs[1] + storageTemp.load(storage_turf) + GLOB.hhStorageTurf = storage_turf else storageTurf = GLOB.hhStorageTurf if(tryActiveRoom(chosenRoomNumber, target)) @@ -112,20 +113,30 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) if(activeRooms["[roomNumber]"]) var/datum/turf_reservation/roomReservation = activeRooms["[roomNumber]"] do_sparks(3, FALSE, get_turf(user)) - user.forceMove(locate(roomReservation.bottom_left_coords[1] + hotelRoomTemp.landingZoneRelativeX, roomReservation.bottom_left_coords[2] + hotelRoomTemp.landingZoneRelativeY, roomReservation.bottom_left_coords[3])) + var/turf/room_bottom_left = roomReservation.bottom_left_turfs[1] + user.forceMove(locate( + room_bottom_left.x + hotelRoomTemp.landingZoneRelativeX, + room_bottom_left.y + hotelRoomTemp.landingZoneRelativeY, + room_bottom_left.z, + )) return TRUE return FALSE /obj/item/hilbertshotel/proc/tryStoredRoom(roomNumber, mob/user) if(storedRooms["[roomNumber]"]) - var/datum/turf_reservation/roomReservation = SSmapping.RequestBlockReservation(hotelRoomTemp.width, hotelRoomTemp.height) - hotelRoomTempEmpty.load(locate(roomReservation.bottom_left_coords[1], roomReservation.bottom_left_coords[2], roomReservation.bottom_left_coords[3])) + var/datum/turf_reservation/roomReservation = SSmapping.request_turf_block_reservation(hotelRoomTemp.width, hotelRoomTemp.height, 1) + var/turf/room_turf = roomReservation.bottom_left_turfs[1] + hotelRoomTempEmpty.load(room_turf) var/turfNumber = 1 for(var/x in 0 to hotelRoomTemp.width-1) for(var/y in 0 to hotelRoomTemp.height-1) for(var/atom/movable/A in storedRooms["[roomNumber]"][turfNumber]) if(istype(A.loc, /obj/item/abstracthotelstorage))//Don't want to recall something thats been moved - A.forceMove(locate(roomReservation.bottom_left_coords[1] + x, roomReservation.bottom_left_coords[2] + y, roomReservation.bottom_left_coords[3])) + A.forceMove(locate( + room_turf.x + x, + room_turf.y + y, + room_turf.z, + )) turfNumber++ for(var/obj/item/abstracthotelstorage/S in storageTurf) if((S.roomNumber == roomNumber) && (S.parentSphere == src)) @@ -134,23 +145,35 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) activeRooms["[roomNumber]"] = roomReservation linkTurfs(roomReservation, roomNumber) do_sparks(3, FALSE, get_turf(user)) - user.forceMove(locate(roomReservation.bottom_left_coords[1] + hotelRoomTemp.landingZoneRelativeX, roomReservation.bottom_left_coords[2] + hotelRoomTemp.landingZoneRelativeY, roomReservation.bottom_left_coords[3])) + user.forceMove(locate( + room_turf.x + hotelRoomTemp.landingZoneRelativeX, + room_turf.y + hotelRoomTemp.landingZoneRelativeY, + room_turf.z, + )) return TRUE return FALSE /obj/item/hilbertshotel/proc/sendToNewRoom(roomNumber, mob/user) - var/datum/turf_reservation/roomReservation = SSmapping.RequestBlockReservation(hotelRoomTemp.width, hotelRoomTemp.height) + var/datum/turf_reservation/roomReservation = SSmapping.request_turf_block_reservation(hotelRoomTemp.width, hotelRoomTemp.height, 1) + var/turf/bottom_left = roomReservation.bottom_left_turfs[1] + var/datum/map_template/load_from = hotelRoomTemp + if(ruinSpawned && roomNumber == GLOB.hhMysteryRoomNumber) - hotelRoomTempLore.load(locate(roomReservation.bottom_left_coords[1], roomReservation.bottom_left_coords[2], roomReservation.bottom_left_coords[3])) - else - hotelRoomTemp.load(locate(roomReservation.bottom_left_coords[1], roomReservation.bottom_left_coords[2], roomReservation.bottom_left_coords[3])) + load_from = hotelRoomTempLore + + load_from.load(bottom_left) activeRooms["[roomNumber]"] = roomReservation linkTurfs(roomReservation, roomNumber) do_sparks(3, FALSE, get_turf(user)) - user.forceMove(locate(roomReservation.bottom_left_coords[1] + hotelRoomTemp.landingZoneRelativeX, roomReservation.bottom_left_coords[2] + hotelRoomTemp.landingZoneRelativeY, roomReservation.bottom_left_coords[3])) + user.forceMove(locate( + bottom_left.x + hotelRoomTemp.landingZoneRelativeX, + bottom_left.y + hotelRoomTemp.landingZoneRelativeY, + bottom_left.z, + )) /obj/item/hilbertshotel/proc/linkTurfs(datum/turf_reservation/currentReservation, currentRoomnumber) - var/area/misc/hilbertshotel/currentArea = get_area(locate(currentReservation.bottom_left_coords[1], currentReservation.bottom_left_coords[2], currentReservation.bottom_left_coords[3])) + var/turf/room_bottom_left = currentReservation.bottom_left_turfs[1] + var/area/misc/hilbertshotel/currentArea = get_area(room_bottom_left) currentArea.name = "Hilbert's Hotel Room [currentRoomnumber]" currentArea.parentSphere = src currentArea.storageTurf = storageTurf @@ -166,9 +189,10 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) if(activeRooms.len) for(var/x in activeRooms) var/datum/turf_reservation/room = activeRooms[x] + var/turf/room_bottom_left = room.bottom_left_turfs[1] for(var/i in 0 to hotelRoomTemp.width-1) for(var/j in 0 to hotelRoomTemp.height-1) - for(var/atom/movable/A in locate(room.bottom_left_coords[1] + i, room.bottom_left_coords[2] + j, room.bottom_left_coords[3])) + for(var/atom/movable/A in locate(room_bottom_left.x + i, room_bottom_left.y + j, room_bottom_left.z)) if(ismob(A)) var/mob/M = A if(M.mind) @@ -250,7 +274,7 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) icon_state = "bluespace" base_icon_state = "bluespace" baseturfs = /turf/open/space/bluespace - flags_1 = NOJAUNT + turf_flags = NOJAUNT explosive_resistance = INFINITY var/obj/item/hilbertshotel/parentSphere @@ -383,7 +407,7 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) if(unforeseen_consequences) to_chat(unforeseen_consequences, span_warning("\The [H] starts to resonate. Forcing it to enter itself induces a bluespace paradox, violently tearing your body apart.")) unforeseen_consequences.investigate_log("has been gibbed by using [H] while inside of it.", INVESTIGATE_DEATHS) - unforeseen_consequences.gib() + unforeseen_consequences.gib(DROP_ALL_REMAINS) var/turf/targetturf = find_safe_turf() if(!targetturf) @@ -414,7 +438,11 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) storeRoom() /area/misc/hilbertshotel/proc/storeRoom() - var/roomSize = (reservation.top_right_coords[1]-reservation.bottom_left_coords[1]+1)*(reservation.top_right_coords[2]-reservation.bottom_left_coords[2]+1) + var/turf/room_bottom_left = reservation.bottom_left_turfs[1] + var/turf/room_top_right = reservation.top_right_turfs[1] + var/roomSize = \ + ((room_top_right.x - room_bottom_left.x) + 1) * \ + ((room_top_right.y - room_bottom_left.y) + 1) var/storage[roomSize] var/turfNumber = 1 var/obj/item/abstracthotelstorage/storageObj = new(storageTurf) @@ -424,7 +452,7 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) for(var/x in 0 to parentSphere.hotelRoomTemp.width-1) for(var/y in 0 to parentSphere.hotelRoomTemp.height-1) var/list/turfContents = list() - for(var/atom/movable/A in locate(reservation.bottom_left_coords[1] + x, reservation.bottom_left_coords[2] + y, reservation.bottom_left_coords[3])) + for(var/atom/movable/A in locate(room_bottom_left.x + x, room_bottom_left.y + y, room_bottom_left.z)) if(ismob(A) && !isliving(A)) continue //Don't want to store ghosts turfContents += A @@ -457,14 +485,14 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) entered_light.end_processing() . = ..() if(ismob(arrived)) - var/mob/M = arrived - M.notransform = TRUE + var/mob/target = arrived + ADD_TRAIT(target, TRAIT_NO_TRANSFORM, REF(src)) /obj/item/abstracthotelstorage/Exited(atom/movable/gone, direction) . = ..() if(ismob(gone)) - var/mob/M = gone - M.notransform = FALSE + var/mob/target = gone + REMOVE_TRAIT(target, TRAIT_NO_TRANSFORM, REF(src)) if(istype(gone, /obj/machinery/light)) var/obj/machinery/light/exited_light = gone exited_light.begin_processing() @@ -507,19 +535,23 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) /obj/effect/landmark/lift_id/hilbert specific_lift_id = HILBERT_TRAM -/obj/effect/landmark/tram/hilbert/left +/obj/effect/landmark/tram/nav/hilbert + name = HILBERT_TRAM + specific_lift_id = TRAM_NAV_BEACONS + +/obj/effect/landmark/tram/platform/hilbert/left name = "Port" specific_lift_id = HILBERT_TRAM platform_code = HILBERT_PORT tgui_icons = list("Reception" = "briefcase", "Botany" = "leaf", "Chemistry" = "flask") -/obj/effect/landmark/tram/hilbert/middle +/obj/effect/landmark/tram/platform/hilbert/middle name = "Central" specific_lift_id = HILBERT_TRAM platform_code = HILBERT_CENTRAL tgui_icons = list("Processing" = "cogs", "Xenobiology" = "paw") -/obj/effect/landmark/tram/hilbert/right +/obj/effect/landmark/tram/platform/hilbert/right name = "Starboard" specific_lift_id = HILBERT_TRAM platform_code = HILBERT_STARBOARD diff --git a/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm b/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm index 8af5d4e5a9d82..fc79c82e780ef 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm @@ -13,8 +13,12 @@ /obj/effect/mob_spawn/corpse/human/tigercultist/perforated/special(mob/living/carbon/human/spawned_human) . = ..() - var/datum/wound/pierce/critical/exit_hole = new() - exit_hole.apply_wound(spawned_human.get_bodypart(BODY_ZONE_CHEST)) + + var/obj/item/bodypart/chest/their_chest = spawned_human.get_bodypart(BODY_ZONE_CHEST) + if (!their_chest) + return + + spawned_human.cause_wound_of_type_and_severity(WOUND_PIERCE, their_chest, WOUND_SEVERITY_CRITICAL) /// A fun drink enjoyed by the tiger cooperative, might corrode your brain if you drink the whole bottle /obj/item/reagent_containers/cup/glass/bottle/ritual_wine diff --git a/code/modules/mapfluff/ruins/spaceruin_code/oldstation.dm b/code/modules/mapfluff/ruins/spaceruin_code/oldstation.dm deleted file mode 100644 index a7c56e087c0ab..0000000000000 --- a/code/modules/mapfluff/ruins/spaceruin_code/oldstation.dm +++ /dev/null @@ -1,266 +0,0 @@ -/////////// Oldstation items - -/obj/item/paper/fluff/ruins/oldstation - name = "Cryo Awakening Report" - default_raw_text = "Catastrophic damage sustained to station. Powernet exhausted to reawaken crew.

    \ - Immediate Objectives: \ -
      \ -
    1. Activate emergency power generator.
    2. \ -
    3. Lift station lockdown on the bridge.
    4. \ -
    5. Locate the 'Damage Report' on the bridge for a detailed situation report.
    6. \ -
    " - -/obj/item/paper/fluff/ruins/oldstation/damagereport - name = "Damage Report" - default_raw_text = "

    WARNING

    \ -
      \ -
    • Shields down. Space Carp invasion imminent.
    • \ -
    • Unknown force has overtaken AI satellite and occupying Delta Station. Intent unknown. Species unknown. Numbers unknown.
    • \ -
    \ -

    Status

    \ -
      \ -
    1. Alpha Station - Destroyed.
    2. \ -
    3. Beta Station - Catastrophic Damage. Medical, destroyed. Atmospherics and Engine Core, partially destroyed.
    4. \ -
    5. Charlie Station - Multiple asteroid impacts, no loss in air pressure.
    6. \ -
    7. Delta Station - Intact.
    8. \ -
    \ -

    Recommended Actions

    \ -
      \ -
    1. Locate arms at Charlie Station Security.
    2. \ -
    3. Move at a sufficient distance from the windows to avoid encounters with Space Carp.
    4. \ -
    5. Reestablish station powernet via Charlie Station Engineering solar array.
    6. \ -
    7. Restore life support systems: atmospherics, artificial gravity, hydroponics.
    8. \ -
    9. Avoid Delta Station until arrival of Nanotrasen Special Response Team.
    10. \ -
    " - -/obj/item/paper/fluff/ruins/oldstation/protosuit - name = "B01-MOD modular suit Report" - default_raw_text = "*Prototype MODsuit*

    This is a prototype powered exoskeleton, a design not seen in hundreds of years, \ - the first post-void war era modular suit to ever be safely utilized by an operator. \ - This ancient clunker is still functional, though it's missing several modern-day luxuries from \ - updated Nakamura Engineering designs. Primarily, the suit's myoelectric suit layer is entirely non-existant, \ - and the servos do very little to help distribute the weight evenly across the wearer's body, \ - making it slow and bulky to move in. Additionally, the armor plating never finished production aside from the shoulders, \ - forearms, and helmet; making it useless against direct attacks. The internal heads-up display is rendered entirely in \ - monochromatic cyan, leaving the user unable to see long distances. However, the way the helmet retracts is pretty cool." - -/obj/item/paper/fluff/ruins/oldstation/protohealth - name = "Health Analyzer Report" - default_raw_text = "*Health Analyzer*

    The portable Health Analyzer is essentially a handheld variant of a health analyzer. Years of research have concluded with this device which is \ - capable of diagnosing even the most critical, obscure or technical injuries any humanoid entity is suffering in an easy to understand format that even a non-trained health professional \ - can understand.

    The health analyzer is expected to go into full production as standard issue medical kit." - -/obj/item/paper/fluff/ruins/oldstation/protogun - name = "K14 Energy Gun Report" - default_raw_text = "*K14-Multiphase Energy Gun*

    The K14 Prototype Energy Gun is the first Energy Rifle that has been successfully been able to not only hold a larger ammo charge \ - than other gun models, but is capable of swapping between different energy projectile types on command with no incidents.

    The weapon still suffers several drawbacks, its alternative, \ - non laser fire mode, can only fire one round before exhausting the energy cell, the weapon also remains prohibitively expensive, nonetheless NT Market Research fully believe this weapon \ - will form the backbone of our Energy weapon catalogue.

    The K14 is expected to undergo revision to fix the ammo issues, the K15 is expected to replace the 'stun' setting with a \ - 'disable' setting in an attempt to bypass the ammo issues." - -/** - * Supermatter crystal fluff paper used in Charlie station ruin - */ -/obj/item/paper/fluff/ruins/oldstation/protosupermatter - name = "Supermatter Crystal Generator" - default_raw_text = "*Supermatter Crystal Shard*

    Modern power generation typically comes in two forms, a Fusion Generator or a Fission Generator. Fusion provides the best space to power \ - \ntratio, and is typically seen on military or high security ships and stations, however Fission reactors require the usage of expensive, and rare, materials in its construction. \ - Fission generators are massive and bulky, and require a large reserve of uranium to power, however they are extremely cheap to operate and oft need little maintenance once \ - \ntoperational.

    The Supermatter aims to alter this, a functional Supermatter is essentially a gas producer that generates far more radiation than Fusion or Fission \ntgenerators can ever hope to produce. " - -/obj/item/paper/fluff/ruins/oldstation/protoinv - name = "Laboratory Inventory" - default_raw_text = "*Inventory*

    (1) Prototype MODsuit

    (1)Health Analyser

    (1)Prototype Energy Gun

    (1)Singularity Generation Disk

    DO NOT REMOVE WITHOUT \ - THE CAPTAIN AND RESEARCH DIRECTOR'S AUTHORISATION" - -/obj/item/paper/fluff/ruins/oldstation/generator_manual - name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator manual" - default_raw_text = "Wrench down the generator on top of a wire node connected to either a SMES input terminal or the power grid." - -/obj/item/paper/fluff/ruins/oldstation/protosleep - name = "Prototype Delivery" - default_raw_text = "*Prototype Sleeper*

    We have delivered the lastest in medical technology to the medical bay: circuitry for a new prototype sleeper. Looks like it didn't come with the parts to actually build it figures. Get engineering on this." - -/obj/item/paper/fluff/ruins/oldstation/survivor_note - name = "To those who find this" - default_raw_text = "I was on a mission of an exploration drone reclamation, when I lost the signal. I've had just enough pressure to make it back to the station.... But this is really bad...

    \ - Beta looks like a smashed tin can, and Alpha is gone completely. I didn't manage to find anyone except those sleeping beauties and something I don't even know how to explain. The blood and gore is everywhere, those things took out the entire R&D. \ - They're hissing and crawling behind the maintenance hatch that I welded off to not let them in.

    \ - I had a proximity sensor with me, so I donated my left cybernetic arm to make this little fella. One of janitor's bucket served as a perfect casing for him.

    \ - Here I thought that I'll die of malnutrition, when I started feeling the symptoms of hypercapnia. I will turn you off to save the battery. It's time for both us to sleep, little guy.

    \ - If you're reading this, I'm probably dead. I've opened Ramboo's maintenance pannel with my ID. Please let him help to clean up my remains..." - -/obj/item/paper/fluff/ruins/oldstation/biolab_note_molly - name = "Diary note - Molly" - default_raw_text = "It has been several months since our Molly passed away. She was our most valuable crew member, especially compared to that prick that happily threw a party to make sure `that beef won't go to waste`...

    \ - Oh, how I miss her warm milk...

    I've put Molly's biopsy in the fridge and almost completed the solution.

    \ - Next steps:
    • Pour the broth to the growing vat (beaker nearby)
    • Add one dropper of the solution
    • Add Molly's biopsy to the vat
    \ - Just need to make sure to use the correct bottle this time... I'll even mark it as \"Solution for Molly\", or I tend to mix things up...
    I can already feel the endorphin release from hugging her again.

    \ - If everything goes well, I will try out those slimes the papers praising as the future of science. They say that the cell lines may be found on anything moldy and rotting, and these small blobs have crazy mutation potential when properly fed." - -/obj/item/paper/fluff/ruins/oldstation/biolab_note_emergency - name = "Diary note - Emergency" - default_raw_text = "OH GOD, the station is still creaking from a heavy impact in the port direction. The power is down, coms not responding, the air supply pipe depressurized and I can feel the artificial gravity weakening. \ - The whole department is running around in panic. I'll just pray that engineers won't let the engine delaminate.

    ...And the alien spawn have broken out of the containment area due to the impact and slipped into the vent.

    \ - I have a bad feeling about this, but I doubt that now is the right time to make guys hunt for what they call my \"pet cockroach\"... And RD is scary..." - -/obj/item/paper/fluff/ruins/oldstation/apc_note - name = "DO NOT TOUCH!" - default_raw_text = "This is a spare pre-charged APC battery for emergencies ONLY. DO NOT use it for stun prods, Bob.

    \ - Note: Use crowbar to remove the APC cover and take out the malfunctioning battery." - -/obj/machinery/mod_installer - name = "modular outerwear device installator" - desc = "An ancient machine that mounts a MOD unit onto the occupant." - icon = 'icons/obj/machines/mod_installer.dmi' - icon_state = "mod_installer" - base_icon_state = "mod_installer" - layer = ABOVE_WINDOW_LAYER - use_power = IDLE_POWER_USE - anchored = TRUE - density = TRUE - obj_flags = BLOCKS_CONSTRUCTION // Becomes undense when the door is open - idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.5 - active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.3 - - var/busy = FALSE - var/busy_icon_state - - var/obj/item/mod/control/mod_unit = /obj/item/mod/control/pre_equipped/prototype - - COOLDOWN_DECLARE(message_cooldown) - -/obj/machinery/mod_installer/Initialize(mapload) - . = ..() - occupant_typecache = typecacheof(/mob/living/carbon/human) - if(ispath(mod_unit)) - mod_unit = new mod_unit() - -/obj/machinery/mod_installer/Destroy() - QDEL_NULL(mod_unit) - return ..() - -/obj/machinery/mod_installer/proc/set_busy(status, working_icon) - busy = status - busy_icon_state = working_icon - update_appearance() - -/obj/machinery/mod_installer/proc/play_install_sound() - playsound(src, 'sound/items/rped.ogg', 30, FALSE) - -/obj/machinery/mod_installer/update_icon_state() - icon_state = busy ? busy_icon_state : "[base_icon_state][state_open ? "_open" : null]" - return ..() - -/obj/machinery/mod_installer/update_overlays() - var/list/overlays = ..() - if(machine_stat & (NOPOWER|BROKEN)) - return overlays - overlays += (busy || !mod_unit) ? "red" : "green" - return overlays - -/obj/machinery/mod_installer/proc/start_process() - if(machine_stat & (NOPOWER|BROKEN)) - return - if(!occupant || !mod_unit || busy) - return - set_busy(TRUE, "[initial(icon_state)]_raising") - addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "[initial(icon_state)]_active"), 2.5 SECONDS) - addtimer(CALLBACK(src, PROC_REF(play_install_sound)), 2.5 SECONDS) - addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "[initial(icon_state)]_falling"), 5 SECONDS) - addtimer(CALLBACK(src, PROC_REF(complete_process)), 7.5 SECONDS) - -/obj/machinery/mod_installer/proc/complete_process() - set_busy(FALSE) - var/mob/living/carbon/human/human_occupant = occupant - if(!istype(human_occupant)) - return - if(!human_occupant.dropItemToGround(human_occupant.back)) - return - if(!human_occupant.equip_to_slot_if_possible(mod_unit, mod_unit.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) - return - human_occupant.update_action_buttons(TRUE) - playsound(src, 'sound/machines/ping.ogg', 30, FALSE) - if(!human_occupant.dropItemToGround(human_occupant.wear_suit) || !human_occupant.dropItemToGround(human_occupant.head)) - finish_completion() - return - mod_unit.quick_activation() - finish_completion() - -/obj/machinery/mod_installer/proc/finish_completion() - mod_unit = null - open_machine() - -/obj/machinery/mod_installer/open_machine(drop = TRUE, density_to_set = FALSE) - if(state_open) - return FALSE - ..() - return TRUE - -/obj/machinery/mod_installer/close_machine(mob/living/carbon/user, density_to_set = TRUE) - if(!state_open) - return FALSE - ..() - addtimer(CALLBACK(src, PROC_REF(start_process)), 1 SECONDS) - return TRUE - -/obj/machinery/mod_installer/relaymove(mob/living/user, direction) - var/message - if(busy) - message = "it won't budge!" - else if(user.stat != CONSCIOUS) - message = "you don't have the energy!" - if(!isnull(message)) - if (COOLDOWN_FINISHED(src, message_cooldown)) - COOLDOWN_START(src, message_cooldown, 5 SECONDS) - balloon_alert(user, message) - return - open_machine() - -/obj/machinery/mod_installer/interact(mob/user) - if(state_open) - close_machine(null, user) - return - else if(busy) - balloon_alert(user, "it's locked!") - return - open_machine() - -/obj/item/petri_dish/oldstation - name = "molly's biopsy" - desc = "You can see a moldy piece of sandwich inside the dish. Maybe it helped to preserve the bacteria for that long." - -/obj/item/petri_dish/oldstation/Initialize(mapload) - . = ..() - sample = new - sample.GenerateSample(CELL_LINE_TABLE_COW, null, 1, 0) - var/datum/biological_sample/contamination = new - contamination.GenerateSample(CELL_LINE_TABLE_GRAPE, null, 1, 0) - sample.Merge(contamination) - sample.sample_color = COLOR_SAMPLE_BROWN - update_appearance() - -/obj/item/reagent_containers/cup/beaker/oldstation - name = "cultivation broth" - amount_per_transfer_from_this = 50 - list_reagents = list( - // Required for CELL_LINE_TABLE_COW - /datum/reagent/consumable/nutriment/protein = 10, - /datum/reagent/consumable/nutriment = 5, - /datum/reagent/cellulose = 5, - // Required for CELL_LINE_TABLE_GRAPE - /datum/reagent/toxin/slimejelly = 5, - /datum/reagent/yuck = 5, - /datum/reagent/consumable/vitfro = 5, - // Supplementary for CELL_LINE_TABLE_GRAPE - /datum/reagent/consumable/liquidgibs = 5 - ) - -/obj/machinery/computer/old - name = "old computer" - circuit = /obj/item/circuitboard/computer - -/obj/machinery/computer/old/Initialize(mapload) - icon_keyboard = pick("generic_key", "med_key") - icon_screen = pick("generic", "comm_monitor", "comm_logs") - . = ..() diff --git a/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_cytology.dm b/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_cytology.dm new file mode 100644 index 0000000000000..72333ff67d14e --- /dev/null +++ b/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_cytology.dm @@ -0,0 +1,29 @@ +/obj/item/petri_dish/oldstation + name = "molly's biopsy" + desc = "You can see a moldy piece of sandwich inside the dish. Maybe it helped to preserve the bacteria for that long." + +/obj/item/petri_dish/oldstation/Initialize(mapload) + . = ..() + sample = new + sample.GenerateSample(CELL_LINE_TABLE_COW, null, 1, 0) + var/datum/biological_sample/contamination = new + contamination.GenerateSample(CELL_LINE_TABLE_GRAPE, null, 1, 0) + sample.Merge(contamination) + sample.sample_color = COLOR_SAMPLE_BROWN + update_appearance() + +/obj/item/reagent_containers/cup/beaker/oldstation + name = "cultivation broth" + amount_per_transfer_from_this = 50 + list_reagents = list( + // Required for CELL_LINE_TABLE_COW + /datum/reagent/consumable/nutriment/protein = 10, + /datum/reagent/consumable/nutriment = 5, + /datum/reagent/cellulose = 5, + // Required for CELL_LINE_TABLE_GRAPE + /datum/reagent/toxin/slimejelly = 5, + /datum/reagent/yuck = 5, + /datum/reagent/consumable/vitfro = 5, + // Supplementary for CELL_LINE_TABLE_GRAPE + /datum/reagent/consumable/liquidgibs = 5 + ) diff --git a/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_fluff.dm b/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_fluff.dm new file mode 100644 index 0000000000000..a0b4adb9f75d2 --- /dev/null +++ b/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_fluff.dm @@ -0,0 +1,110 @@ +/////////// Oldstation items + +/obj/item/paper/fluff/ruins/oldstation + name = "Cryo Awakening Report" + default_raw_text = "Catastrophic damage sustained to station. Powernet exhausted to reawaken crew.

    \ + Immediate Objectives: \ +
      \ +
    1. Activate emergency power generator.
    2. \ +
    3. Lift station lockdown on the bridge.
    4. \ +
    5. Locate the 'Damage Report' on the bridge for a detailed situation report.
    6. \ +
    " + +/obj/item/paper/fluff/ruins/oldstation/damagereport + name = "Damage Report" + default_raw_text = "

    WARNING

    \ +
      \ +
    • Shields down. Space Carp invasion imminent.
    • \ +
    • Unknown force has overtaken AI satellite and occupying Delta Station. Intent unknown. Species unknown. Numbers unknown.
    • \ +
    \ +

    Status

    \ +
      \ +
    1. Alpha Station - Destroyed.
    2. \ +
    3. Beta Station - Catastrophic Damage. Medical, destroyed. Atmospherics and Engine Core, partially destroyed.
    4. \ +
    5. Charlie Station - Multiple asteroid impacts, no loss in air pressure.
    6. \ +
    7. Delta Station - Intact.
    8. \ +
    \ +

    Recommended Actions

    \ +
      \ +
    1. Locate arms at Charlie Station Security.
    2. \ +
    3. Move at a sufficient distance from the windows to avoid encounters with Space Carp.
    4. \ +
    5. Reestablish station powernet via Charlie Station Engineering solar array.
    6. \ +
    7. Restore life support systems: atmospherics, artificial gravity, hydroponics.
    8. \ +
    9. Avoid Delta Station until arrival of Nanotrasen Special Response Team.
    10. \ +
    " + +/obj/item/paper/fluff/ruins/oldstation/protosuit + name = "B01-MOD modular suit Report" + default_raw_text = "*Prototype MODsuit*

    This is a prototype powered exoskeleton, a design not seen in hundreds of years, \ + the first post-void war era modular suit to ever be safely utilized by an operator. \ + This ancient clunker is still functional, though it's missing several modern-day luxuries from \ + updated Nakamura Engineering designs. Primarily, the suit's myoelectric suit layer is entirely non-existant, \ + and the servos do very little to help distribute the weight evenly across the wearer's body, \ + making it slow and bulky to move in. Additionally, the armor plating never finished production aside from the shoulders, \ + forearms, and helmet; making it useless against direct attacks. The internal heads-up display is rendered entirely in \ + monochromatic cyan, leaving the user unable to see long distances. However, the way the helmet retracts is pretty cool." + +/obj/item/paper/fluff/ruins/oldstation/protohealth + name = "Health Analyzer Report" + default_raw_text = "*Health Analyzer*

    The portable Health Analyzer is essentially a handheld variant of a health analyzer. Years of research have concluded with this device which is \ + capable of diagnosing even the most critical, obscure or technical injuries any humanoid entity is suffering in an easy to understand format that even a non-trained health professional \ + can understand.

    The health analyzer is expected to go into full production as standard issue medical kit." + +/obj/item/paper/fluff/ruins/oldstation/protogun + name = "K14 Energy Gun Report" + default_raw_text = "*K14-Multiphase Energy Gun*

    The K14 Prototype Energy Gun is the first Energy Rifle that has been successfully been able to not only hold a larger ammo charge \ + than other gun models, but is capable of swapping between different energy projectile types on command with no incidents.

    The weapon still suffers several drawbacks, its alternative, \ + non laser fire mode, can only fire one round before exhausting the energy cell, the weapon also remains prohibitively expensive, nonetheless NT Market Research fully believe this weapon \ + will form the backbone of our Energy weapon catalogue.

    The K14 is expected to undergo revision to fix the ammo issues, the K15 is expected to replace the 'stun' setting with a \ + 'disable' setting in an attempt to bypass the ammo issues." + +/** + * Supermatter crystal fluff paper used in Charlie station ruin + */ +/obj/item/paper/fluff/ruins/oldstation/protosupermatter + name = "Supermatter Crystal Generator" + default_raw_text = "*Supermatter Crystal Shard*

    Modern power generation typically comes in two forms, a Fusion Generator or a Fission Generator. Fusion provides the best space to power \ + ratio, and is typically seen on military or high security ships and stations, however Fission reactors require the usage of expensive and rare materials in its construction. \ + Fission generators are massive and bulky, and require a large reserve of uranium to power, however they are extremely cheap to operate and need little maintenance once \ + \noperational.

    The Supermatter aims to alter this, a functional Supermatter is essentially a gas producer that generates far more radiation than Fusion or Fission generators can ever hope to produce. " + +/obj/item/paper/fluff/ruins/oldstation/protoinv + name = "Laboratory Inventory" + default_raw_text = "*Inventory*

    (1) Prototype MODsuit

    (1)Health Analyser

    (1)Prototype Energy Gun

    (1)Singularity Generation Disk

    DO NOT REMOVE WITHOUT \ + THE CAPTAIN AND RESEARCH DIRECTOR'S AUTHORISATION" + +/obj/item/paper/fluff/ruins/oldstation/generator_manual + name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator manual" + default_raw_text = "Wrench down the generator on top of a wire node connected to either a SMES input terminal or the power grid." + +/obj/item/paper/fluff/ruins/oldstation/protosleep + name = "Prototype Delivery" + default_raw_text = "*Prototype Sleeper*

    We have delivered the lastest in medical technology to the medical bay: circuitry for a new prototype sleeper. Looks like it didn't come with the parts to actually build it figures. Get engineering on this." + +/obj/item/paper/fluff/ruins/oldstation/survivor_note + name = "To those who find this" + default_raw_text = "I was on a mission of an exploration drone reclamation, when I lost the signal. I've had just enough pressure to make it back to the station.... But this is really bad...

    \ + Beta looks like a smashed tin can, and Alpha is gone completely. I didn't manage to find anyone except those sleeping beauties and something I don't even know how to explain. The blood and gore is everywhere, those things took out the entire R&D. \ + They're hissing and crawling behind the maintenance hatch that I welded off to not let them in.

    \ + I had a proximity sensor with me, so I donated my left cybernetic arm to make this little fella. One of janitor's bucket served as a perfect casing for him.

    \ + Here I thought that I'll die of malnutrition, when I started feeling the symptoms of hypercapnia. I will turn you off to save the battery. It's time for both us to sleep, little guy.

    \ + If you're reading this, I'm probably dead. I've opened Ramboo's maintenance pannel with my ID. Please let him help to clean up my remains..." + +/obj/item/paper/fluff/ruins/oldstation/biolab_note_molly + name = "Diary note - Molly" + default_raw_text = "It has been several months since our Molly passed away. She was our most valuable crew member, especially compared to that prick that happily threw a party to make sure `that beef won't go to waste`...

    \ + Oh, how I miss her warm milk...

    I've put Molly's biopsy in the fridge and almost completed the solution.

    \ + Next steps:
    • Pour the broth to the growing vat (beaker nearby)
    • Add one dropper of the solution
    • Add Molly's biopsy to the vat
    \ + Just need to make sure to use the correct bottle this time... I'll even mark it as \"Solution for Molly\", or I tend to mix things up...
    I can already feel the endorphin release from hugging her again.

    \ + If everything goes well, I will try out those slimes the papers praising as the future of science. They say that the cell lines may be found on anything moldy and rotting, and these small blobs have crazy mutation potential when properly fed." + +/obj/item/paper/fluff/ruins/oldstation/biolab_note_emergency + name = "Diary note - Emergency" + default_raw_text = "OH GOD, the station is still creaking from a heavy impact in the port direction. The power is down, coms not responding, the air supply pipe depressurized and I can feel the artificial gravity weakening. \ + The whole department is running around in panic. I'll just pray that engineers won't let the engine delaminate.

    ...And the alien spawn have broken out of the containment area due to the impact and slipped into the vent.

    \ + I have a bad feeling about this, but I doubt that now is the right time to make guys hunt for what they call my \"pet cockroach\"... And RD is scary..." + +/obj/item/paper/fluff/ruins/oldstation/apc_note + name = "DO NOT TOUCH!" + default_raw_text = "This is a spare pre-charged APC battery for emergencies ONLY. DO NOT use it for stun prods, Bob.

    \ + Note: Use crowbar to remove the APC cover and take out the malfunctioning battery." diff --git a/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_machines.dm b/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_machines.dm new file mode 100644 index 0000000000000..c2552b10744c8 --- /dev/null +++ b/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_machines.dm @@ -0,0 +1,8 @@ +/obj/machinery/computer/old + name = "old computer" + circuit = /obj/item/circuitboard/computer + +/obj/machinery/computer/old/Initialize(mapload) + icon_keyboard = pick("generic_key", "med_key") + icon_screen = pick("generic", "comm_monitor", "comm_logs") + return ..() diff --git a/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_mod.dm b/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_mod.dm new file mode 100644 index 0000000000000..ac026045674e8 --- /dev/null +++ b/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_mod.dm @@ -0,0 +1,116 @@ +/obj/machinery/mod_installer + name = "modular outerwear device installator" + desc = "An ancient machine that mounts a MOD unit onto the occupant." + icon = 'icons/obj/machines/mod_installer.dmi' + icon_state = "mod_installer" + base_icon_state = "mod_installer" + layer = ABOVE_WINDOW_LAYER + use_power = IDLE_POWER_USE + anchored = TRUE + density = TRUE + obj_flags = BLOCKS_CONSTRUCTION // Becomes undense when the door is open + idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.5 + active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.3 + + var/busy = FALSE + var/busy_icon_state + + var/obj/item/mod/control/mod_unit = /obj/item/mod/control/pre_equipped/prototype + + COOLDOWN_DECLARE(message_cooldown) + +/obj/machinery/mod_installer/Initialize(mapload) + . = ..() + occupant_typecache = typecacheof(/mob/living/carbon/human) + if(ispath(mod_unit)) + mod_unit = new mod_unit() + +/obj/machinery/mod_installer/Destroy() + QDEL_NULL(mod_unit) + return ..() + +/obj/machinery/mod_installer/proc/set_busy(status, working_icon) + busy = status + busy_icon_state = working_icon + update_appearance() + +/obj/machinery/mod_installer/proc/play_install_sound() + playsound(src, 'sound/items/rped.ogg', 30, FALSE) + +/obj/machinery/mod_installer/update_icon_state() + icon_state = busy ? busy_icon_state : "[base_icon_state][state_open ? "_open" : null]" + return ..() + +/obj/machinery/mod_installer/update_overlays() + var/list/overlays = ..() + if(machine_stat & (NOPOWER|BROKEN)) + return overlays + overlays += (busy || !mod_unit) ? "red" : "green" + return overlays + +/obj/machinery/mod_installer/proc/start_process() + if(machine_stat & (NOPOWER|BROKEN)) + return + if(!occupant || !mod_unit || busy) + return + set_busy(TRUE, "[initial(icon_state)]_raising") + addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "[initial(icon_state)]_active"), 2.5 SECONDS) + addtimer(CALLBACK(src, PROC_REF(play_install_sound)), 2.5 SECONDS) + addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "[initial(icon_state)]_falling"), 5 SECONDS) + addtimer(CALLBACK(src, PROC_REF(complete_process)), 7.5 SECONDS) + +/obj/machinery/mod_installer/proc/complete_process() + set_busy(FALSE) + var/mob/living/carbon/human/human_occupant = occupant + if(!istype(human_occupant)) + return + if(!human_occupant.dropItemToGround(human_occupant.back)) + return + if(!human_occupant.equip_to_slot_if_possible(mod_unit, mod_unit.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) + return + human_occupant.update_action_buttons(TRUE) + playsound(src, 'sound/machines/ping.ogg', 30, FALSE) + if(!human_occupant.dropItemToGround(human_occupant.wear_suit) || !human_occupant.dropItemToGround(human_occupant.head)) + finish_completion() + return + mod_unit.quick_activation() + finish_completion() + +/obj/machinery/mod_installer/proc/finish_completion() + mod_unit = null + open_machine() + +/obj/machinery/mod_installer/open_machine(drop = TRUE, density_to_set = FALSE) + if(state_open) + return FALSE + ..() + return TRUE + +/obj/machinery/mod_installer/close_machine(mob/living/carbon/user, density_to_set = TRUE) + if(!state_open) + return FALSE + ..() + addtimer(CALLBACK(src, PROC_REF(start_process)), 1 SECONDS) + return TRUE + +/obj/machinery/mod_installer/relaymove(mob/living/user, direction) + var/message + if(busy) + message = "it won't budge!" + else if(user.stat != CONSCIOUS) + message = "you don't have the energy!" + if(!isnull(message)) + if (COOLDOWN_FINISHED(src, message_cooldown)) + COOLDOWN_START(src, message_cooldown, 5 SECONDS) + balloon_alert(user, message) + return + open_machine() + +/obj/machinery/mod_installer/interact(mob/user) + if(state_open) + close_machine(null, user) + return + else if(busy) + balloon_alert(user, "it's locked!") + return + open_machine() diff --git a/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_rnd.dm b/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_rnd.dm new file mode 100644 index 0000000000000..58d14e0d041a4 --- /dev/null +++ b/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_rnd.dm @@ -0,0 +1,29 @@ +/obj/machinery/rnd/server/oldstation + name = "\improper Ancient R&D Server" + circuit = /obj/item/circuitboard/machine/rdserver/oldstation + req_access = list(ACCESS_AWAY_SCIENCE) + +/obj/machinery/rnd/server/oldstation/Initialize(mapload) + register_context() + var/datum/techweb/oldstation_web = locate(/datum/techweb/oldstation) in SSresearch.techwebs + stored_research = oldstation_web + return ..() + +/obj/machinery/rnd/server/oldstation/add_context(atom/source, list/context, obj/item/held_item, mob/user) + if(held_item && istype(held_item, /obj/item/research_notes)) + context[SCREENTIP_CONTEXT_LMB] = "Generate research points" + return CONTEXTUAL_SCREENTIP_SET + +/obj/machinery/rnd/server/oldstation/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/research_notes) && stored_research) + var/obj/item/research_notes/research_notes = attacking_item + stored_research.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = research_notes.value)) + playsound(src, 'sound/machines/copier.ogg', 50, TRUE) + qdel(research_notes) + return + return ..() + +///Ancient computer that starts with dissection to tell players they have it. +/obj/machinery/computer/operating/oldstation + name = "ancient operating computer" + advanced_surgeries = list(/datum/surgery/advanced/experimental_dissection) diff --git a/code/modules/mapfluff/ruins/spaceruin_code/originalcontent.dm b/code/modules/mapfluff/ruins/spaceruin_code/originalcontent.dm index a6307fee400d1..d2380479a568c 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/originalcontent.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/originalcontent.dm @@ -4,7 +4,7 @@ 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' + icon = 'icons/obj/fluff/general.dmi' icon_state = "painting1" /obj/item/paper/pamphlet/ruin/originalcontent/stickman diff --git a/code/modules/mapping/access_helpers.dm b/code/modules/mapping/access_helpers.dm index e1bb44853efad..c208e2eea9ea9 100644 --- a/code/modules/mapping/access_helpers.dm +++ b/code/modules/mapping/access_helpers.dm @@ -386,6 +386,11 @@ access_list += list(ACCESS_CARGO, ACCESS_MAINT_TUNNELS) return access_list +/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den/get_access() + var/list/access_list = ..() + access_list += ACCESS_BIT_DEN + return access_list + // -------------------- Syndicate access helpers /obj/effect/mapping_helpers/airlock/access/any/syndicate icon_state = "access_helper_syn" @@ -851,6 +856,15 @@ access_list += ACCESS_SYNDICATE_LEADER return access_list +// -------------------- Bounty hunter access helpers +/obj/effect/mapping_helpers/airlock/access/all/hunter + icon_state = "access_helper_hunt" + +/obj/effect/mapping_helpers/airlock/access/all/hunter/get_access() + var/list/access_list = ..() + access_list += ACCESS_HUNTER + return access_list + // -------------------- Away access helpers /obj/effect/mapping_helpers/airlock/access/any/away icon_state = "access_helper_awy" diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index f37834bed44d3..b90f406d8fc9d 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -109,7 +109,6 @@ // need these two below? SSmachines.setup_template_powernets(cables) SSair.setup_template_machinery(atmos_machines) - SSshuttle.setup_shuttles(ports) //calculate all turfs inside the border var/list/template_and_bordering_turfs = block( @@ -133,7 +132,15 @@ 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, 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/datum/parsed_map/parsed = load_map( + file(mappath), + x, + y, + level.z_value, + no_changeturf = (SSatoms.initialized == INITIALIZATION_INSSATOMS), + place_on_top = should_place_on_top, + new_z = TRUE, + ) var/list/bounds = parsed.bounds if(!bounds) return FALSE @@ -176,7 +183,14 @@ 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)) + if(!parsed.load( + T.x, + T.y, + T.z, + crop_map = TRUE, + no_changeturf = (SSatoms.initialized == INITIALIZATION_INSSATOMS), + place_on_top = should_place_on_top, + )) return var/list/bounds = parsed.bounds diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index 2c6c507d872b8..92e67fc908289 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -104,6 +104,8 @@ icon = 'icons/effects/mapping_helpers.dmi' icon_state = "" anchored = TRUE + // Unless otherwise specified, layer above everything + layer = ABOVE_ALL_MOB_LAYER var/late = FALSE /obj/effect/mapping_helpers/Initialize(mapload) @@ -255,7 +257,6 @@ //air alarm helpers /obj/effect/mapping_helpers/airalarm desc = "You shouldn't see this. Report it please." - layer = ABOVE_OBJ_LAYER late = TRUE /obj/effect/mapping_helpers/airalarm/Initialize(mapload) @@ -415,7 +416,6 @@ //apc helpers /obj/effect/mapping_helpers/apc desc = "You shouldn't see this. Report it please." - layer = DOOR_HELPER_LAYER late = TRUE /obj/effect/mapping_helpers/apc/Initialize(mapload) @@ -840,8 +840,15 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) name = "Dead Body placer" late = TRUE icon_state = "deadbodyplacer" + ///if TRUE, was spawned out of mapload. var/admin_spawned - var/bodycount = 2 //number of bodies to spawn + ///number of bodies to spawn + var/bodycount = 3 + /// These species IDs will be barred from spawning if morgue_cadaver_disable_nonhumans is disabled (In the future, we can also dehardcode this) + var/list/blacklisted_from_rng_placement = list( + SPECIES_ETHEREAL, // they revive on death which is bad juju + SPECIES_HUMAN, // already have a 50% chance of being selected + ) /obj/effect/mapping_helpers/dead_body_placer/Initialize(mapload) . = ..() @@ -850,23 +857,23 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) admin_spawned = TRUE /obj/effect/mapping_helpers/dead_body_placer/LateInitialize() - var/area/a = get_area(src) - var/list/trays = list() - for (var/i in a.contents) - if (istype(i, /obj/structure/bodycontainer/morgue)) - if(admin_spawned) - var/obj/structure/bodycontainer/morgue/early_morgue_tray = i - if(early_morgue_tray.connected.loc != early_morgue_tray) - continue - trays += i - if(!trays.len) + var/area/morgue_area = get_area(src) + var/list/obj/structure/bodycontainer/morgue/trays = list() + for(var/turf/area_turf as anything in morgue_area.get_contained_turfs()) + var/obj/structure/bodycontainer/morgue/morgue_tray = locate() in area_turf + if(isnull(morgue_tray) || !morgue_tray.beeper || morgue_tray.connected.loc != morgue_tray) + continue + trays += morgue_tray + + var/numtrays = length(trays) + if(numtrays == 0) if(admin_spawned) message_admins("[src] spawned at [ADMIN_VERBOSEJMP(src)] failed to find a closed morgue to spawn a body!") else log_mapping("[src] at [x],[y] could not find any morgues.") return - var/reuse_trays = (trays.len < bodycount) //are we going to spawn more trays than bodies? + var/reuse_trays = (numtrays < bodycount) //are we going to spawn more trays than bodies? var/use_species = !(CONFIG_GET(flag/morgue_cadaver_disable_nonhumans)) var/species_probability = CONFIG_GET(number/morgue_cadaver_other_species_probability) @@ -875,35 +882,38 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) if(use_species) var/list/temp_list = get_selectable_species() usable_races = temp_list.Copy() - usable_races -= SPECIES_ETHEREAL //they revive on death which is bad juju - LAZYREMOVE(usable_races, SPECIES_HUMAN) - if(!usable_races) + LAZYREMOVE(usable_races, blacklisted_from_rng_placement) + if(!LAZYLEN(usable_races)) notice("morgue_cadaver_disable_nonhumans. There are no valid roundstart nonhuman races enabled. Defaulting to humans only!") if(override_species) warning("morgue_cadaver_override_species BEING OVERRIDEN since morgue_cadaver_disable_nonhumans is disabled.") else if(override_species) - usable_races += override_species + LAZYADD(usable_races, override_species) - for (var/i = 1 to bodycount) + var/guaranteed_human_spawned = FALSE + for (var/i in 1 to bodycount) var/obj/structure/bodycontainer/morgue/morgue_tray = reuse_trays ? pick(trays) : pick_n_take(trays) var/obj/structure/closet/body_bag/body_bag = new(morgue_tray.loc) - var/mob/living/carbon/human/new_human = new /mob/living/carbon/human(morgue_tray.loc, 1) + var/mob/living/carbon/human/new_human = new(morgue_tray.loc) var/species_to_pick - if(LAZYLEN(usable_races)) - if(!species_probability) - species_probability = 50 - stack_trace("WARNING: morgue_cadaver_other_species_probability CONFIG SET TO 0% WHEN SPAWNING. DEFAULTING TO [species_probability]%.") - if(prob(species_probability)) - species_to_pick = pick(usable_races) - var/datum/species/new_human_species = GLOB.species_list[species_to_pick] - if(new_human_species) - new_human.set_species(new_human_species) - new_human_species = new_human.dna.species - new_human_species.randomize_features(new_human) - new_human.fully_replace_character_name(new_human.real_name, new_human_species.random_name(new_human.gender, TRUE, TRUE)) - else - stack_trace("failed to spawn cadaver with species ID [species_to_pick]") //if it's invalid they'll just be a human, so no need to worry too much aside from yelling at the server owner lol. + + if(guaranteed_human_spawned && use_species) + if(LAZYLEN(usable_races)) + if(!isnum(species_probability)) + species_probability = 50 + stack_trace("WARNING: morgue_cadaver_other_species_probability CONFIG SET TO 0% WHEN SPAWNING. DEFAULTING TO [species_probability]%.") + if(prob(species_probability)) + species_to_pick = pick(usable_races) + var/datum/species/new_human_species = GLOB.species_list[species_to_pick] + if(new_human_species) + new_human.set_species(new_human_species) + new_human_species = new_human.dna.species + new_human.fully_replace_character_name(new_human.real_name, new_human_species.random_name(new_human.gender, TRUE, TRUE)) + else + stack_trace("failed to spawn cadaver with species ID [species_to_pick]") //if it's invalid they'll just be a human, so no need to worry too much aside from yelling at the server owner lol. + else + guaranteed_human_spawned = TRUE body_bag.insert(new_human, TRUE) body_bag.close() @@ -911,18 +921,16 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) body_bag.forceMove(morgue_tray) new_human.death() //here lies the mans, rip in pepperoni. - for (var/part in new_human.organs) //randomly remove organs from each body, set those we keep to be in stasis + for (var/obj/item/organ/internal/part in new_human.organs) //randomly remove organs from each body, set those we keep to be in stasis if (prob(40)) qdel(part) else - var/obj/item/organ/O = part - O.organ_flags |= ORGAN_FROZEN + part.organ_flags |= ORGAN_FROZEN morgue_tray.update_appearance() qdel(src) - //On Ian's birthday, the hop's office is decorated. /obj/effect/mapping_helpers/ianbirthday name = "Ian's Bday Helper" @@ -1190,7 +1198,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) /obj/effect/mapping_helpers/broken_machine name = "broken machine helper" icon_state = "broken_machine" - layer = ABOVE_OBJ_LAYER late = TRUE /obj/effect/mapping_helpers/broken_machine/Initialize(mapload) @@ -1229,7 +1236,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) /obj/effect/mapping_helpers/damaged_window name = "damaged window helper" icon_state = "damaged_window" - layer = ABOVE_OBJ_LAYER late = TRUE /// Minimum roll of integrity damage in percents needed to show cracks var/integrity_damage_min = 0.25 @@ -1267,7 +1273,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) //requests console helpers /obj/effect/mapping_helpers/requests_console desc = "You shouldn't see this. Report it please." - layer = DOOR_HELPER_LAYER late = TRUE /obj/effect/mapping_helpers/requests_console/Initialize(mapload) @@ -1326,3 +1331,46 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) /obj/effect/mapping_helpers/requests_console/ore_update/payload(obj/machinery/requests_console/console) console.receive_ore_updates = TRUE + +/obj/effect/mapping_helpers/engraving + name = "engraving helper" + icon = 'icons/turf/wall_overlays.dmi' + icon_state = "engraving2" + late = TRUE + layer = ABOVE_NORMAL_TURF_LAYER + +/obj/effect/mapping_helpers/engraving/Initialize(mapload) + . = ..() + return INITIALIZE_HINT_LATELOAD + +/obj/effect/mapping_helpers/engraving/LateInitialize() + var/turf/closed/engraved_wall = get_turf(src) + + if(!isclosedturf(engraved_wall) || !SSpersistence.saved_engravings.len || HAS_TRAIT(engraved_wall, TRAIT_NOT_ENGRAVABLE)) + qdel(src) + return + + var/engraving = pick_n_take(SSpersistence.saved_engravings) + if(!islist(engraving)) + stack_trace("something's wrong with the engraving data! one of the saved engravings wasn't a list!") + qdel(src) + return + + engraved_wall.AddComponent(/datum/component/engraved, engraving["story"], FALSE, engraving["story_value"]) + qdel(src) + +/// Apply to a wall (or floor, technically) to ensure it is instantly destroyed by any explosion, even if usually invulnerable +/obj/effect/mapping_helpers/bombable_wall + name = "bombable wall helper" + icon = 'icons/turf/overlays.dmi' + icon_state = "explodable" + +/obj/effect/mapping_helpers/bombable_wall/Initialize(mapload) + . = ..() + if(!mapload) + log_mapping("[src] spawned outside of mapload!") + return + + var/turf/our_turf = get_turf(src) // In case a locker ate us or something + our_turf.AddElement(/datum/element/bombable_turf) + return INITIALIZE_HINT_QDEL diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm index 33d545f551a41..14a8fdf6b9400 100644 --- a/code/modules/mapping/reader.dm +++ b/code/modules/mapping/reader.dm @@ -107,30 +107,79 @@ /// 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 +/datum/parsed_map/proc/copy() + // Avoids duped work just in case + build_cache() + var/datum/parsed_map/newfriend = new() + newfriend.original_path = original_path + newfriend.map_format = map_format + newfriend.key_len = key_len + newfriend.line_len = line_len + newfriend.grid_models = grid_models.Copy() + newfriend.gridSets = gridSets.Copy() + newfriend.modelCache = modelCache.Copy() + newfriend.parsed_bounds = parsed_bounds.Copy() + // Copy parsed bounds to reset to initial values + newfriend.bounds = parsed_bounds.Copy() + newfriend.turf_blacklist = turf_blacklist?.Copy() + return newfriend + //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). -/// - `x_offset`, `y_offset`, `z_offset`: Positions representign where to load the map (Optional). -/// - `cropMap`: When true, the map will be cropped to fit the existing world dimensions (Optional). -/// - `measureOnly`: When true, no changes will be made to the world (Optional). -/// - `no_changeturf`: When true, [/turf/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, 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, new_z = new_z) - return parsed +/** + * Helper and recommened way to load a map file + * - dmm_file: The path to the map file + * - x_offset: The x offset to load the map at + * - y_offset: The y offset to load the map at + * - z_offset: The z offset to load the map at + * - crop_map: If true, the map will be cropped to the world bounds + * - measure_only: If true, the map will not be loaded, but the bounds will be calculated + * - no_changeturf: If true, the map will not call /turf/AfterChange + * - x_lower: The minimum x coordinate to load + * - x_upper: The maximum x coordinate to load + * - y_lower: The minimum y coordinate to load + * - y_upper: The maximum y coordinate to load + * - z_lower: The minimum z coordinate to load + * - z_upper: The maximum z coordinate to load + * - place_on_top: Whether to use /turf/proc/PlaceOnTop rather than /turf/proc/ChangeTurf + * - new_z: If true, a new z level will be created for the map + */ +/proc/load_map( + dmm_file, + x_offset = 0, + y_offset = 0, + z_offset = 0, + crop_map = FALSE, + measure_only = FALSE, + no_changeturf = FALSE, + x_lower = -INFINITY, + x_upper = INFINITY, + y_lower = -INFINITY, + y_upper = INFINITY, + z_lower = -INFINITY, + z_upper = INFINITY, + place_on_top = FALSE, + new_z = FALSE, +) + if(!(dmm_file in GLOB.cached_maps)) + GLOB.cached_maps[dmm_file] = new /datum/parsed_map(dmm_file) + + var/datum/parsed_map/parsed_map = GLOB.cached_maps[dmm_file] + parsed_map = parsed_map.copy() + if(!measure_only && !isnull(parsed_map.bounds)) + parsed_map.load(x_offset, y_offset, z_offset, crop_map, no_changeturf, x_lower, x_upper, y_lower, y_upper, z_lower, z_upper, place_on_top, new_z) + return parsed_map /// 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) +/datum/parsed_map/New(tfile, x_lower = -INFINITY, x_upper = INFINITY, y_lower = -INFINITY, y_upper=INFINITY, z_lower = -INFINITY, z_upper=INFINITY, measureOnly=FALSE) // 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 :) @@ -181,20 +230,26 @@ CRASH("Coords before model definition in DMM") var/curr_x = text2num(regexOutput[3]) - if(curr_x < x_lower || curr_x > x_upper) continue + var/curr_y = text2num(regexOutput[4]) + if(curr_y < y_lower || curr_y > y_upper) + continue + + var/curr_z = text2num(regexOutput[5]) + if(curr_z < z_lower || curr_z > z_upper) + continue + var/datum/grid_set/gridSet = new gridSet.xcrd = curr_x - //position of the currently processed square - gridSet.ycrd = text2num(regexOutput[4]) - gridSet.zcrd = text2num(regexOutput[5]) + gridSet.ycrd = curr_y + gridSet.zcrd = curr_z 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) + bounds[MAP_MINZ] = min(bounds[MAP_MINZ], curr_y) + bounds[MAP_MAXZ] = max(bounds[MAP_MAXZ], curr_z) var/list/gridLines = splittext(regexOutput[6], "\n") gridSet.gridLines = gridLines @@ -235,31 +290,49 @@ 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) + bounds[MAP_MINZ] = clamp(bounds[MAP_MINZ], z_lower, z_upper) + bounds[MAP_MAXZ] = clamp(bounds[MAP_MAXZ], z_lower, z_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, whitelist = FALSE, new_z) +/// Iterates over all grid sets and returns ones with z values within the given bounds. Inclusive +/datum/parsed_map/proc/filter_grid_sets_based_on_z_bounds(lower_z, upper_z) + var/list/filtered_sets = list() + for(var/datum/grid_set/grid_set as anything in gridSets) + if(grid_set.zcrd < lower_z) + continue + if(grid_set.zcrd > upper_z) + continue + filtered_sets += grid_set + return filtered_sets + +/// Load the parsed map into the world. You probably want [/proc/load_map]. Keep the signature the same. +/datum/parsed_map/proc/load(x_offset = 0, y_offset = 0, z_offset = 0, crop_map = FALSE, no_changeturf = FALSE, x_lower = -INFINITY, x_upper = INFINITY, y_lower = -INFINITY, y_upper = INFINITY, z_lower = -INFINITY, z_upper = INFINITY, place_on_top = FALSE, new_z = FALSE) //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, new_z) + . = _load_impl(x_offset, y_offset, z_offset, crop_map, no_changeturf, x_lower, x_upper, y_lower, y_upper, z_lower, z_upper, place_on_top, new_z) Master.StopLoadingMap() #define MAPLOADING_CHECK_TICK \ if(TICK_CHECK) { \ - SSatoms.map_loader_stop(); \ - stoplag(); \ - SSatoms.map_loader_begin(); \ + 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, new_z = FALSE) +/datum/parsed_map/proc/_load_impl(x_offset, y_offset, z_offset, crop_map, no_changeturf, x_lower, x_upper, y_lower, y_upper, z_lower, z_upper, place_on_top, new_z) PRIVATE_PROC(TRUE) // 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 - SSatoms.map_loader_begin() + 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 @@ -267,12 +340,13 @@ 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) + sucessful = _tgm_load(x_offset, y_offset, z_offset, crop_map, no_changeturf, x_lower, x_upper, y_lower, y_upper, z_lower, z_upper, place_on_top, 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) + sucessful = _dmm_load(x_offset, y_offset, z_offset, crop_map, no_changeturf, x_lower, x_upper, y_lower, y_upper, z_lower, z_upper, place_on_top, new_z) // And we are done lads, call it off - SSatoms.map_loader_stop() + SSatoms.map_loader_stop(REF(src)) + loading = FALSE if(new_z) for(var/z_index in bounds[MAP_MINZ] to bounds[MAP_MAXZ]) @@ -300,7 +374,7 @@ // 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) +/datum/parsed_map/proc/_tgm_load(x_offset, y_offset, z_offset, crop_map, no_changeturf, x_lower, x_upper, y_lower, y_upper, z_lower, z_upper, place_on_top, new_z) // setup var/list/modelCache = build_cache(no_changeturf) var/space_key = modelCache[SPACE_KEY] @@ -321,12 +395,12 @@ var/relative_y = first_column.ycrd var/highest_y = relative_y + y_relative_to_absolute - if(!cropMap && highest_y > world.maxx) + if(!crop_map && highest_y > world.maxy) if(new_z) // Need to avoid improperly loaded area/turf_contents - world.increaseMaxY(highest_y, max_zs_to_load = z_offset - 1) + world.increase_max_y(highest_y, map_load_z_cutoff = z_offset - 1) else - world.increaseMaxY(highest_y) + world.increase_max_y(highest_y) expanded_y = TRUE // Skip Y coords that are above the smallest of the three params @@ -334,8 +408,7 @@ 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 - + 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) @@ -344,7 +417,7 @@ // X setup var/x_delta_with = x_upper - if(cropMap) + if(crop_map) // Take our smaller crop threshold yes? x_delta_with = min(x_delta_with, world.maxx) @@ -358,33 +431,51 @@ // 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) + if(final_x > world.maxx && !crop_map) if(new_z) // Need to avoid improperly loaded area/turf_contents - world.increaseMaxX(final_x, max_zs_to_load = z_offset - 1) + world.increase_max_x(final_x, map_load_z_cutoff = z_offset - 1) else - world.increaseMaxX(final_x) + world.increase_max_x(final_x) expanded_x = TRUE var/lowest_x = max(x_lower, 1 - x_relative_to_absolute) + // Amount we offset the grid zcrd to get the true zcrd + var/grid_z_offset = z_offset - 1 + var/z_upper_set = z_upper < INFINITY + var/z_lower_set = z_lower > -INFINITY + // 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 + // true max zcrd + var/map_bounds_z_max = last_column.zcrd + var/z_upper_parsed = map_bounds_z_max + z_offset - 1 + if(z_upper_set) + z_upper_parsed -= map_bounds_z_max - z_upper + if(z_lower_set) + var/offset_amount = z_lower - 1 + z_upper_parsed -= offset_amount + grid_z_offset -= offset_amount + + var/list/target_grid_sets = gridSets + if(z_lower_set || z_upper_set) // bounds are set, filter out gridsets for z levels we don't want + target_grid_sets = filter_grid_sets_based_on_z_bounds(z_lower, z_upper) + 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 + if(z_upper_parsed > z_threshold && crop_map) + for(var/i in z_threshold + 1 to z_upper_parsed) //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) + for(var/datum/grid_set/gset as anything in target_grid_sets) 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 + var/zcrd = gset.zcrd + grid_z_offset // 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 @@ -409,9 +500,9 @@ var/list/cache = modelCache[gset.gridLines[i]] if(!cache) - SSatoms.map_loader_stop() + 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) + build_coordinate(cache, locate(true_xcrd, ycrd, zcrd), no_afterchange, place_on_top, new_z) // only bother with bounds that actually exist if(!first_found) @@ -435,7 +526,7 @@ /// 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) +/datum/parsed_map/proc/_dmm_load(x_offset, y_offset, z_offset, crop_map, no_changeturf, x_lower, x_upper, y_lower, y_upper, z_lower, z_upper, place_on_top, new_z) // setup var/list/modelCache = build_cache(no_changeturf) var/space_key = modelCache[SPACE_KEY] @@ -446,23 +537,46 @@ 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) + + // Amount we offset the grid zcrd to get the true zcrd + var/grid_z_offset = z_offset - 1 + var/z_upper_set = z_upper < INFINITY + var/z_lower_set = z_lower > -INFINITY + + // we now need to find the maximum z, fun! + var/map_bounds_z_max = 1 + for(var/datum/grid_set/grid_set as anything in gridSets) + map_bounds_z_max = max(map_bounds_z_max, grid_set.zcrd) + + var/z_upper_parsed = map_bounds_z_max + z_offset - 1 + if(z_upper_set) + z_upper_parsed -= map_bounds_z_max - z_upper + if(z_lower_set) + var/offset_amount = z_lower - 1 + z_upper_parsed -= offset_amount + grid_z_offset -= offset_amount + + var/list/target_grid_sets = gridSets + if(z_lower_set || z_upper_set) // bounds are set, filter out gridsets for z levels we don't want + target_grid_sets = filter_grid_sets_based_on_z_bounds(z_lower, z_upper) + + for(var/datum/grid_set/gset as anything in target_grid_sets) 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) + var/zcrd = gset.zcrd + grid_z_offset + if(!crop_map && ycrd > world.maxy) if(new_z) // Need to avoid improperly loaded area/turf_contents - world.increaseMaxY(ycrd, max_zs_to_load = z_offset - 1) + world.increase_max_y(ycrd, map_load_z_cutoff = z_offset - 1) else - world.increaseMaxY(ycrd) + world.increase_max_y(ycrd) expanded_y = TRUE var/zexpansion = zcrd > world.maxz var/no_afterchange = no_changeturf if(zexpansion) - if(cropMap) + if(crop_map) continue else while (zcrd > world.maxz) //create a new z_level if needed @@ -499,7 +613,7 @@ 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) + if(crop_map) // Take our smaller crop threshold yes? x_delta_with = min(x_delta_with, world.maxx) if(final_x > x_delta_with) @@ -508,12 +622,12 @@ x_step_count -= delta final_x -= delta x_target = x_step_count * key_len - if(final_x > world.maxx && !cropMap) + if(final_x > world.maxx && !crop_map) if(new_z) // Need to avoid improperly loaded area/turf_contents - world.increaseMaxX(final_x, max_zs_to_load = z_offset - 1) + world.increase_max_x(final_x, map_load_z_cutoff = z_offset - 1) else - world.increaseMaxX(final_x) + world.increase_max_x(final_x) expanded_x = TRUE // We're gonna track the first and last pairs of coords we find @@ -542,9 +656,9 @@ continue var/list/cache = modelCache[model_key] if(!cache) - SSatoms.map_loader_stop() + 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) + build_coordinate(cache, locate(xcrd, ycrd, zcrd), no_afterchange, place_on_top, new_z) // only bother with bounds that actually exist if(!first_found) @@ -956,6 +1070,7 @@ GLOBAL_LIST_EMPTY(map_model_default) /datum/parsed_map/Destroy() ..() + 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() diff --git a/code/modules/mapping/ruins.dm b/code/modules/mapping/ruins.dm index 4dc57701d178e..a7b9480a34e4a 100644 --- a/code/modules/mapping/ruins.dm +++ b/code/modules/mapping/ruins.dm @@ -51,10 +51,10 @@ return central_turf /datum/map_template/ruin/proc/place_on_isolated_level(z) - var/datum/turf_reservation/reservation = SSmapping.RequestBlockReservation(width, height, z) //Make the new level creation work with different traits. + var/datum/turf_reservation/reservation = SSmapping.request_turf_block_reservation(width, height, 1, z) //Make the new level creation work with different traits. if(!reservation) return - var/turf/placement = locate(reservation.bottom_left_coords[1],reservation.bottom_left_coords[2],reservation.bottom_left_coords[3]) + var/turf/placement = reservation.bottom_left_turfs[1] load(placement) loaded++ for(var/turf/T in get_affected_turfs(placement)) @@ -133,7 +133,7 @@ for(var/v in current_pick.always_spawn_with) if(current_pick.always_spawn_with[v] == PLACE_BELOW) var/turf/T = locate(1,1,target_z) - if(!SSmapping.get_turf_below(T)) + if(!GET_TURF_BELOW(T)) if(forced_z) continue outer else @@ -183,7 +183,7 @@ if(PLACE_DEFAULT) forced_ruins[linked] = -1 if(PLACE_BELOW) - forced_ruins[linked] = SSmapping.get_turf_below(placed_turf) + forced_ruins[linked] = GET_TURF_BELOW(placed_turf) if(PLACE_ISOLATED) forced_ruins[linked] = SSmapping.get_isolated_ruin_z() diff --git a/code/modules/mapping/space_management/multiz_helpers.dm b/code/modules/mapping/space_management/multiz_helpers.dm index 39f662deaa4f0..b0e2ff7fa0656 100644 --- a/code/modules/mapping/space_management/multiz_helpers.dm +++ b/code/modules/mapping/space_management/multiz_helpers.dm @@ -1,10 +1,11 @@ /proc/get_step_multiz(ref, dir) + var/turf/us = get_turf(ref) if(dir & UP) dir &= ~UP - return get_step(SSmapping.get_turf_above(get_turf(ref)), dir) + return get_step(GET_TURF_ABOVE(us), dir) if(dir & DOWN) dir &= ~DOWN - return get_step(SSmapping.get_turf_below(get_turf(ref)), dir) + return get_step(GET_TURF_BELOW(us), dir) return get_step(ref, dir) /proc/get_dir_multiz(turf/us, turf/them) @@ -15,37 +16,31 @@ if(us.z == them.z) return get_dir(us, them) else - var/turf/T = us.above() + var/turf/T = GET_TURF_ABOVE(us) var/dir = NONE if(T && (T.z == them.z)) dir = UP else - T = us.below() + T = GET_TURF_BELOW(us) if(T && (T.z == them.z)) dir = DOWN else return get_dir(us, them) return (dir | get_dir(us, them)) -/turf/proc/above() - return get_step_multiz(src, UP) - -/turf/proc/below() - return get_step_multiz(src, DOWN) - /proc/get_lowest_turf(atom/ref) var/turf/us = get_turf(ref) - var/next = SSmapping.get_turf_below(us) + var/turf/next = GET_TURF_BELOW(us) while(next) us = next - next = SSmapping.get_turf_below(us) + next = GET_TURF_BELOW(us) return us // I wish this was lisp /proc/get_highest_turf(atom/ref) var/turf/us = get_turf(ref) - var/next = SSmapping.get_turf_above(us) + var/turf/next = GET_TURF_ABOVE(us) while(next) us = next - next = SSmapping.get_turf_above(us) + next = GET_TURF_ABOVE(us) return us diff --git a/code/modules/mapping/space_management/space_reservation.dm b/code/modules/mapping/space_management/space_reservation.dm index 403ac52d6e537..2809ae65e6c2e 100644 --- a/code/modules/mapping/space_management/space_reservation.dm +++ b/code/modules/mapping/space_management/space_reservation.dm @@ -1,16 +1,33 @@ //Yes, they can only be rectangular. //Yes, I'm sorry. /datum/turf_reservation + /// All turfs that we've reserved var/list/reserved_turfs = list() - ///Turfs around the reservation for cordoning + + /// Turfs around the reservation for cordoning var/list/cordon_turfs = list() - ///Area of turfs next to the cordon to fill with pre_cordon_area's + + /// Area of turfs next to the cordon to fill with pre_cordon_area's var/list/pre_cordon_turfs = list() + + /// The width of the reservation var/width = 0 + + /// The height of the reservation var/height = 0 - var/bottom_left_coords[3] - var/top_right_coords[3] + + /// The z stack size of the reservation. Note that reservations are ALWAYS reserved from the bottom up + var/z_size = 0 + + /// List of the bottom left turfs. Indexed by what their z index for this reservation is + var/list/bottom_left_turfs = list() + + /// List of the top right turfs. Indexed by what their z index for this reservation is + var/list/top_right_turfs = list() + + /// The turf type the reservation is initially made with var/turf_type = /turf/open/space + ///Distance away from the cordon where we can put a "sort-cordon" and run some extra code (see make_repel). 0 makes nothing happen var/pre_cordon_distance = 0 @@ -19,6 +36,9 @@ pre_cordon_distance = 7 /datum/turf_reservation/proc/Release() + bottom_left_turfs.Cut() + top_right_turfs.Cut() + var/list/reserved_copy = reserved_turfs.Copy() SSmapping.used_turfs -= reserved_turfs reserved_turfs = list() @@ -36,20 +56,20 @@ INVOKE_ASYNC(SSmapping, TYPE_PROC_REF(/datum/controller/subsystem/mapping, reserve_turfs), release_turfs) /// Attempts to calaculate and store a list of turfs around the reservation for cordoning. Returns whether a valid cordon was calculated -/datum/turf_reservation/proc/calculate_cordon_turfs(turf/BL, turf/TR) - if(BL.x < 2 || BL.y < 2 || TR.x > (world.maxx - 2) || TR.y > (world.maxy - 2)) +/datum/turf_reservation/proc/calculate_cordon_turfs(turf/bottom_left, turf/top_right) + if(bottom_left.x < 2 || bottom_left.y < 2 || top_right.x > (world.maxx - 2) || top_right.y > (world.maxy - 2)) return FALSE // no space for a cordon here - var/list/possible_turfs = CORNER_OUTLINE(BL, width, height) + var/list/possible_turfs = CORNER_OUTLINE(bottom_left, width, height) + // if they're our cordon turfs, accept them + possible_turfs -= cordon_turfs for(var/turf/cordon_turf as anything in possible_turfs) - if(!(cordon_turf.flags_1 & UNUSED_RESERVATION_TURF)) + if(!(cordon_turf.turf_flags & UNUSED_RESERVATION_TURF)) return FALSE - cordon_turfs = possible_turfs - - pre_cordon_turfs.Cut() + cordon_turfs |= possible_turfs if(pre_cordon_distance) - var/turf/offset_turf = locate(BL.x + pre_cordon_distance, BL.y + pre_cordon_distance, BL.z) + var/turf/offset_turf = locate(bottom_left.x + pre_cordon_distance, bottom_left.y + pre_cordon_distance, bottom_left.z) var/list/to_add = CORNER_OUTLINE(offset_turf, width - pre_cordon_distance * 2, height - pre_cordon_distance * 2) //we step-by-stop move inwards from the outer cordon for(var/turf/turf_being_added as anything in to_add) pre_cordon_turfs |= turf_being_added //add one by one so we can filter out duplicates @@ -64,10 +84,11 @@ old_area.turfs_to_uncontain += cordon_turf cordon_area.contained_turfs += cordon_turf cordon_area.contents += cordon_turf + // Its no longer unused, but its also not "used" + cordon_turf.turf_flags &= ~UNUSED_RESERVATION_TURF cordon_turf.ChangeTurf(/turf/cordon, /turf/cordon) - - cordon_turf.flags_1 &= ~UNUSED_RESERVATION_TURF SSmapping.unused_turfs["[cordon_turf.z]"] -= cordon_turf + // still gets linked to us though SSmapping.used_turfs[cordon_turf] = src //swap the area with the pre-cordoning area @@ -94,7 +115,7 @@ /datum/turf_reservation/transit/make_repel(turf/pre_cordon_turf) ..() - RegisterSignal(pre_cordon_turf, COMSIG_ATOM_ENTERED, PROC_REF(space_dump)) + RegisterSignal(pre_cordon_turf, COMSIG_ATOM_ENTERED, PROC_REF(space_dump_soft)) /datum/turf_reservation/transit/stop_repel(turf/pre_cordon_turf) ..() @@ -106,7 +127,15 @@ dump_in_space(enterer) -/datum/turf_reservation/proc/Reserve(width, height, zlevel) +///Only dump if we don't have the hyperspace cordon movement exemption trait +/datum/turf_reservation/transit/proc/space_dump_soft(atom/source, atom/movable/enterer) + SIGNAL_HANDLER + + if(!HAS_TRAIT(enterer, TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT)) + space_dump(source, enterer) + +/// Internal proc which handles reserving the area for the reservation. +/datum/turf_reservation/proc/_reserve_area(width, height, zlevel) src.width = width src.height = height if(width > world.maxx || height > world.maxy || width < 1 || height < 1) @@ -119,12 +148,12 @@ for(var/i in avail) CHECK_TICK BL = i - if(!(BL.flags_1 & UNUSED_RESERVATION_TURF)) + if(!(BL.turf_flags & UNUSED_RESERVATION_TURF)) continue if(BL.x + width > world.maxx || BL.y + height > world.maxy) continue TR = locate(BL.x + width - 1, BL.y + height - 1, BL.z) - if(!(TR.flags_1 & UNUSED_RESERVATION_TURF)) + if(!(TR.turf_flags & UNUSED_RESERVATION_TURF)) continue final = block(BL, TR) if(!final) @@ -132,7 +161,7 @@ passing = TRUE for(var/I in final) var/turf/checking = I - if(!(checking.flags_1 & UNUSED_RESERVATION_TURF)) + if(!(checking.turf_flags & UNUSED_RESERVATION_TURF)) passing = FALSE break if(passing) // found a potentially valid area, now try to calculate its cordon @@ -142,18 +171,94 @@ break if(!passing || !istype(BL) || !istype(TR)) return FALSE - bottom_left_coords = list(BL.x, BL.y, BL.z) - top_right_coords = list(TR.x, TR.y, TR.z) for(var/i in final) var/turf/T = i reserved_turfs |= T - T.flags_1 &= ~UNUSED_RESERVATION_TURF SSmapping.unused_turfs["[T.z]"] -= T SSmapping.used_turfs[T] = src + T.turf_flags = (T.turf_flags | RESERVATION_TURF) & ~UNUSED_RESERVATION_TURF T.ChangeTurf(turf_type, turf_type) + + bottom_left_turfs += BL + top_right_turfs += TR + return TRUE + +/datum/turf_reservation/proc/reserve(width, height, z_size, z_reservation) + src.z_size = z_size + var/failed_reservation = FALSE + for(var/_ in 1 to z_size) + if(!_reserve_area(width, height, z_reservation)) + failed_reservation = TRUE + break + + if(failed_reservation) + Release() + return FALSE + generate_cordon() return TRUE +/// Calculates the effective bounds information for the given turf. Returns a list of the information, or null if not applicable. +/datum/turf_reservation/proc/calculate_turf_bounds_information(turf/target) + for(var/z_idx in 1 to z_size) + var/turf/bottom_left = bottom_left_turfs[z_idx] + var/turf/top_right = top_right_turfs[z_idx] + var/bl_x = bottom_left.x + var/bl_y = bottom_left.y + var/tr_x = top_right.x + var/tr_y = top_right.y + + if(target.x < bl_x) + continue + + if(target.y < bl_y) + continue + + if(target.x > tr_x) + continue + + if(target.y > tr_y) + continue + + var/list/return_information = list() + return_information["z_idx"] = z_idx + return_information["offset_x"] = target.x - bl_x + return_information["offset_y"] = target.y - bl_y + return return_information + return null + +/// Gets the turf below the given target. Returns null if there is no turf below the target +/datum/turf_reservation/proc/get_turf_below(turf/target) + var/list/bounds_info = calculate_turf_bounds_information(target) + if(isnull(bounds_info)) + return null + + var/z_idx = bounds_info["z_idx"] + // check what z level, if its the max, then there is no turf below + if(z_idx == z_size) + return null + + var/offset_x = bounds_info["offset_x"] + var/offset_y = bounds_info["offset_y"] + var/turf/bottom_left = bottom_left_turfs[z_idx + 1] + return locate(bottom_left.x + offset_x, bottom_left.y + offset_y, bottom_left.z) + +/// Gets the turf above the given target. Returns null if there is no turf above the target +/datum/turf_reservation/proc/get_turf_above(turf/target) + var/list/bounds_info = calculate_turf_bounds_information(target) + if(isnull(bounds_info)) + return null + + var/z_idx = bounds_info["z_idx"] + // check what z level, if its the min, then there is no turf above + if(z_idx == 1) + return null + + var/offset_x = bounds_info["offset_x"] + var/offset_y = bounds_info["offset_y"] + var/turf/bottom_left = bottom_left_turfs[z_idx - 1] + return locate(bottom_left.x + offset_x, bottom_left.y + offset_y, bottom_left.z) + /datum/turf_reservation/New() LAZYADD(SSmapping.turf_reservations, src) diff --git a/code/modules/mapping/space_management/space_transition.dm b/code/modules/mapping/space_management/space_transition.dm index df9396ceee12e..b61897dd7b6b4 100644 --- a/code/modules/mapping/space_management/space_transition.dm +++ b/code/modules/mapping/space_management/space_transition.dm @@ -99,7 +99,7 @@ // 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)]" + var/inverse = "[REVERSE_DIR(direction)]" 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) @@ -123,6 +123,9 @@ 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 + // 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 @@ -156,6 +159,6 @@ continue var/turf/place = locate(S.destination_x, S.destination_y, zdestination) - S.AddComponent(/datum/component/mirage_border, place, mirage_dir) + S.AddElement(/datum/element/mirage_border, place, mirage_dir, range_cached) #undef CHORDS_TO_1D diff --git a/code/modules/mapping/space_management/traits.dm b/code/modules/mapping/space_management/traits.dm index b68e3f77b8a75..9841f85ebd7ec 100644 --- a/code/modules/mapping/space_management/traits.dm +++ b/code/modules/mapping/space_management/traits.dm @@ -49,25 +49,6 @@ final_return += level.z_value return final_return -/// Attempt to get the turf below the provided one according to Z traits -/datum/controller/subsystem/mapping/proc/get_turf_below(turf/T) - if (!T || !length(multiz_levels)) - return - var/offset = multiz_levels[T.z]["[DOWN]"] - if (!offset) - return - return locate(T.x, T.y, T.z - offset) - -/// Attempt to get the turf above the provided one according to Z traits -/datum/controller/subsystem/mapping/proc/get_turf_above(turf/T) - if (!T || !length(multiz_levels)) - return - - var/offset = multiz_levels[T.z]["[UP]"] - if (!offset) - return - return locate(T.x, T.y, T.z + offset) - /// Prefer not to use this one too often /datum/controller/subsystem/mapping/proc/get_station_center() var/station_z = levels_by_trait(ZTRAIT_STATION)[1] diff --git a/code/modules/meteors/meteor_types.dm b/code/modules/meteors/meteor_types.dm index 9f598f9809e90..b258196ed245a 100644 --- a/code/modules/meteors/meteor_types.dm +++ b/code/modules/meteors/meteor_types.dm @@ -56,7 +56,7 @@ var/turf/T = get_turf(loc) ram_turf(T) - if(prob(10) && !isspaceturf(T))//randomly takes a 'hit' from ramming + if(prob(10) && !ispassmeteorturf(T))//randomly takes a 'hit' from ramming get_hit() if(z != z_original || loc == get_turf(dest)) diff --git a/code/modules/meteors/meteor_waves.dm b/code/modules/meteors/meteor_waves.dm index 4235c186a946c..7d832d5371337 100644 --- a/code/modules/meteors/meteor_waves.dm +++ b/code/modules/meteors/meteor_waves.dm @@ -26,4 +26,4 @@ GLOBAL_LIST_INIT(meteors_stray, list(/obj/effect/meteor/medium=15, /obj/effect/m GLOBAL_LIST_INIT(meteors_sandstorm, list(/obj/effect/meteor/sand=45, /obj/effect/meteor/dust=5)) //for sandstorm event -GLOBAL_LIST_INIT(meteorsSPOOKY, list(/obj/effect/meteor/pumpkin)) +GLOBAL_LIST_INIT(meteorsSPOOKY, list(/obj/effect/meteor/pumpkin=1)) diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm index f0f95b4d64ef2..c9fdb9747e5bd 100644 --- a/code/modules/mining/abandoned_crates.dm +++ b/code/modules/mining/abandoned_crates.dm @@ -100,11 +100,13 @@ return return ..() -/obj/structure/closet/crate/secure/loot/emag_act(mob/user) +/obj/structure/closet/crate/secure/loot/emag_act(mob/user, obj/item/card/emag/emag_card) + . = ..() + if(locked) - boom(user) - return - return ..() + boom(user) // no feedback since it just explodes, thats its own feedback + return TRUE + return /obj/structure/closet/crate/secure/loot/togglelock(mob/user, silent = FALSE) if(!locked) @@ -183,10 +185,12 @@ if(63 to 64) new /obj/item/clothing/shoes/kindle_kicks(src) if(65 to 66) - new /obj/item/clothing/suit/costume/ianshirt(src) + new /obj/item/clothing/suit/costume/wellworn_shirt/graphic/ian(src) new /obj/item/clothing/suit/hooded/ian_costume(src) if(67 to 68) - new /obj/item/toy/plush/awakenedplushie(src) + var/obj/item/gibtonite/free_bomb = new /obj/item/gibtonite(src) + free_bomb.quality = rand(1, 3) + free_bomb.GibtoniteReaction(null, "A secure loot closet has spawned a live") if(69 to 70) new /obj/item/stack/ore/bluespace_crystal(src, 5) if(71 to 72) @@ -241,7 +245,7 @@ new /obj/item/ammo_box/foambox(src) if(98) for(var/i in 1 to 3) - new /mob/living/simple_animal/hostile/bee/toxin(src) + new /mob/living/basic/bee/toxin(src) if(99) new /obj/item/implanter/sad_trombone(src) if(100) diff --git a/code/modules/mining/aux_base.dm b/code/modules/mining/aux_base.dm index 380198832c976..9d97ec53663e4 100644 --- a/code/modules/mining/aux_base.dm +++ b/code/modules/mining/aux_base.dm @@ -15,7 +15,7 @@ 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 = 'icons/obj/machines/wallmounts.dmi' icon_state = "pod_off" icon_keyboard = null icon_screen = "pod_on" @@ -280,7 +280,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/auxiliary_base, 32) var/turf/T = get_turf(user) var/obj/machinery/computer/auxiliary_base/AB - for (var/obj/machinery/computer/auxiliary_base/A in GLOB.machines) + for (var/obj/machinery/computer/auxiliary_base/A as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/computer/auxiliary_base)) if(is_station_level(A.z)) AB = A break @@ -334,7 +334,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/auxiliary_base, 32) anchored = FALSE density = FALSE var/shuttle_ID = "landing_zone_dock" - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/mining.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. @@ -362,7 +362,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/auxiliary_base, 32) 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) + for(var/obj/machinery/computer/auxiliary_base/ABC as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/computer/auxiliary_base)) if(get_dist(landing_spot, ABC) <= console_range) aux_base_console = ABC break diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index f07d31847d7e2..caee1bbac8d2b 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -38,11 +38,16 @@ ) //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) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) /obj/item/kinetic_crusher/Destroy() QDEL_LIST(trophies) return ..() +/obj/item/kinetic_crusher/Exited(atom/movable/gone, direction) + . = ..() + trophies -= gone + /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.") @@ -161,6 +166,10 @@ playsound(user, 'sound/weapons/empty.ogg', 100, TRUE) update_appearance() +/obj/item/kinetic_crusher/proc/on_saboteur(datum/source, disrupt_duration) + set_light_on(FALSE) + playsound(src, 'sound/weapons/empty.ogg', 100, TRUE) + return COMSIG_SABOTEUR_SUCCESS /obj/item/kinetic_crusher/update_icon_state() inhand_icon_state = "crusher[HAS_TRAIT(src, TRAIT_WIELDED)]" // this is not icon_state and not supported by 2hcomponent @@ -212,7 +221,7 @@ /obj/item/crusher_trophy name = "tail spike" desc = "A strange spike with no usage." - icon = 'icons/obj/lavaland/artefacts.dmi' + icon = 'icons/obj/mining_zones/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 @@ -243,7 +252,6 @@ /obj/item/crusher_trophy/proc/remove_from(obj/item/kinetic_crusher/crusher, mob/living/user) forceMove(get_turf(crusher)) - crusher.trophies -= src return TRUE /obj/item/crusher_trophy/proc/on_melee_hit(mob/living/target, mob/living/user) //the target and the user @@ -251,26 +259,6 @@ /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" diff --git a/code/modules/mining/equipment/lazarus_injector.dm b/code/modules/mining/equipment/lazarus_injector.dm index a5f08287ca583..a9b7205406e4b 100644 --- a/code/modules/mining/equipment/lazarus_injector.dm +++ b/code/modules/mining/equipment/lazarus_injector.dm @@ -27,7 +27,13 @@ /obj/item/lazarus_injector/afterattack(atom/target, mob/user, proximity_flag) . = ..() - if(!loaded || !(isliving(target) && proximity_flag) ) + if(!loaded || !proximity_flag) + return + + if(SEND_SIGNAL(target, COMSIG_ATOM_ON_LAZARUS_INJECTOR, src, user) & LAZARUS_INJECTOR_USED) + return + + if(!isliving(target)) return var/mob/living/target_animal = target @@ -39,9 +45,12 @@ return target_animal.lazarus_revive(user, malfunctioning) + expend(target_animal, user) + +/obj/item/lazarus_injector/proc/expend(atom/revived_target, mob/user) + user.visible_message(span_notice("[user] injects [revived_target] with [src], reviving it.")) + SSblackbox.record_feedback("tally", "lazarus_injector", 1, revived_target.type) loaded = FALSE - user.visible_message(span_notice("[user] injects [target_animal] with [src], reviving it.")) - SSblackbox.record_feedback("tally", "lazarus_injector", 1, target_animal.type) playsound(src,'sound/effects/refill.ogg',50,TRUE) icon_state = "lazarus_empty" diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm index fa199ff66c783..4721fcaf8091f 100644 --- a/code/modules/mining/equipment/marker_beacons.dm +++ b/code/modules/mining/equipment/marker_beacons.dm @@ -18,7 +18,7 @@ GLOBAL_LIST_INIT(marker_beacon_colors, sort_list(list( name = "marker beacon" singular_name = "marker beacon" desc = "Prism-brand path illumination devices. Used by miners to mark paths and warn of danger." - icon = 'icons/obj/marker.dmi' + icon = 'icons/obj/mining.dmi' icon_state = "marker" merge_type = /obj/item/stack/marker_beacon max_amount = 100 @@ -73,7 +73,7 @@ GLOBAL_LIST_INIT(marker_beacon_colors, sort_list(list( /obj/structure/marker_beacon name = "marker beacon" desc = "A Prism-brand path illumination device. It is anchored in place and glowing steadily." - icon = 'icons/obj/marker.dmi' + icon = 'icons/obj/mining.dmi' icon_state = "marker" layer = BELOW_OPEN_DOOR_LAYER armor_type = /datum/armor/structure_marker_beacon diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm index 4ec3f754e58ca..69903d77591ad 100644 --- a/code/modules/mining/equipment/mining_tools.dm +++ b/code/modules/mining/equipment/mining_tools.dm @@ -164,18 +164,39 @@ /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." + desc = "A wicked tool that cleaves through dirt just as easily as it does flesh. The design was styled after ancient lavaland tribal designs. \ + It seems less capable of harming inorganic creatures. Who knows why." 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 + force = 10 throwforce = 12 w_class = WEIGHT_CLASS_NORMAL - toolspeed = 0.7 + tool_behaviour = TOOL_SHOVEL // hey, it's serrated. + toolspeed = 0.3 attack_verb_continuous = list("slashes", "impales", "stabs", "slices") attack_verb_simple = list("slash", "impale", "stab", "slice") sharpness = SHARP_EDGED + item_flags = CRUEL_IMPLEMENT + +/obj/item/shovel/serrated/Initialize(mapload) + . = ..() + AddElement(/datum/element/bane, mob_biotypes = MOB_ORGANIC, damage_multiplier = 1) //You may be horridly cursed now, but at least you kill the living a whole lot more easily! + +/obj/item/shovel/serrated/examine(mob/user) + . = ..() + if( !(user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID)) ) + return + . += span_deadsay("You feel an intense, strange craving to 'dig' straight through living flesh with this shovel. Why else would it be serrated? The thought is mesmerizing...") + +// Coroner mail version +/obj/item/shovel/serrated/dull + name = "dull bone shovel" + desc = "An ancient, dull bone shovel with a strange design and markings. Visually, it seems pretty weak, but you get the feeling there's more to it than meets the eye..." + force = 8 + throwforce = 10 + toolspeed = 0.8 /obj/item/trench_tool name = "entrenching tool" @@ -196,6 +217,9 @@ attack_verb_simple = list("bash", "bludgeon", "thrash", "whack") wound_bonus = 10 +/obj/item/trench_tool/get_all_tool_behaviours() + return list(TOOL_MINING, TOOL_SHOVEL, TOOL_WRENCH) + /obj/item/trench_tool/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_updates_onmob) @@ -262,3 +286,94 @@ if(user.incapacitated() || !user.Adjacent(src)) return FALSE return TRUE + +/obj/item/shovel/giant_wrench + name = "Big Slappy" + desc = "A gigantic wrench made illegal because of its many incidents involving this tool." + icon_state = "giant_wrench" + icon = 'icons/obj/weapons/giant_wrench.dmi' + inhand_icon_state = null + lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi' + righthand_file = 'icons/mob/inhands/64x64_righthand.dmi' + inhand_x_dimension = 64 + inhand_y_dimension = 64 + w_class = WEIGHT_CLASS_HUGE + slot_flags = NONE + toolspeed = 0.1 + force = 30 + throwforce = 20 + block_chance = 30 + throw_range = 2 + demolition_mod = 2 + armor_type = /datum/armor/giant_wrench + resistance_flags = FIRE_PROOF + wound_bonus = -10 + attack_verb_continuous = list("bonks", "bludgeons", "pounds") + attack_verb_simple = list("bonk", "bludgeon", "pound") + drop_sound = 'sound/weapons/sonic_jackhammer.ogg' + pickup_sound = 'sound/items/handling/crowbar_pickup.ogg' + hitsound = 'sound/weapons/sonic_jackhammer.ogg' + block_sound = 'sound/weapons/sonic_jackhammer.ogg' + obj_flags = IMMUTABLE_SLOW + item_flags = SLOWS_WHILE_IN_HAND + slowdown = 3 + attack_speed = 1.2 SECONDS + /// The factor at which the recoil becomes less. + var/recoil_factor = 3 + /// Wether we knock down and launch away out enemies when we attack. + var/do_launch = TRUE + +/obj/item/shovel/giant_wrench/get_all_tool_behaviours() + return list(TOOL_SHOVEL, TOOL_WRENCH) + +/datum/armor/giant_wrench + acid = 30 + bomb = 100 + bullet = 30 + fire = 100 + laser = 30 + melee = 30 + +/obj/item/shovel/giant_wrench/Initialize(mapload) + . = ..() + transform = transform.Translate(-16, -16) + AddComponent(/datum/component/two_handed, require_twohands=TRUE) + AddComponent( \ + /datum/component/transforming, \ + force_on = 40, \ + throwforce_on = throwforce, \ + hitsound_on = hitsound, \ + w_class_on = w_class, \ + sharpness_on = SHARP_POINTY, \ + clumsy_check = TRUE, \ + inhand_icon_change = TRUE, \ + ) + RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) + +/// Used when the tool is transformed through the transforming component. +/obj/item/shovel/giant_wrench/proc/on_transform(obj/item/source, mob/user, active) + SIGNAL_HANDLER + + usesound = (active ? 'sound/items/ratchet.ogg' : initial(usesound)) + block_chance = (active ? 0 : initial(block_chance)) + recoil_factor = (active ? 2 : initial(recoil_factor)) + do_launch = (active ? FALSE : initial(do_launch)) + tool_behaviour = (active ? TOOL_WRENCH : initial(tool_behaviour)) + armour_penetration = (active ? 30 : initial(armour_penetration)) + if(user) + balloon_alert(user, "folded Big Slappy [active ? "open" : "closed"]") + playsound(src, 'sound/items/ratchet.ogg', 50, TRUE) + return COMPONENT_NO_DEFAULT_MESSAGE + +/obj/item/shovel/giant_wrench/attack(mob/living/target_mob, mob/living/user) + ..() + if(QDELETED(target_mob)) + return + if(do_launch) + var/atom/throw_target = get_edge_target_turf(target_mob, get_dir(user, get_step_away(target_mob, user))) + target_mob.throw_at(throw_target, 2, 2, user, gentle = TRUE) + target_mob.Knockdown(2 SECONDS) + var/body_zone = pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) + user.apply_damage(force / recoil_factor, BRUTE, body_zone, user.run_armor_check(body_zone, MELEE)) + to_chat(user, span_danger("The weight of the Big Slappy recoils!")) + log_combat(user, user, "recoiled Big Slappy into") diff --git a/code/modules/mining/equipment/miningradio.dm b/code/modules/mining/equipment/miningradio.dm new file mode 100644 index 0000000000000..559740599dbe4 --- /dev/null +++ b/code/modules/mining/equipment/miningradio.dm @@ -0,0 +1,24 @@ +/// Portable mining radio purchasable by miners +/obj/item/radio/weather_monitor + icon = 'icons/obj/miningradio.dmi' + name = "mining weather radio" + icon_state = "miningradio" + desc = "A weather radio designed for use in inhospitable environments. Gives audible warnings when storms approach. Has access to cargo channel." + freqlock = RADIO_FREQENCY_LOCKED + luminosity = 1 + light_power = 1 + light_range = 1.6 + +/obj/item/radio/weather_monitor/update_overlays() + . = ..() + . += emissive_appearance(icon, "small_emissive", src, alpha = src.alpha) + +/obj/item/radio/weather_monitor/Initialize(mapload) + . = ..() + AddComponent( \ + /datum/component/weather_announcer, \ + state_normal = "weatherwarning", \ + state_warning = "urgentwarning", \ + state_danger = "direwarning", \ + ) + set_frequency(FREQ_SUPPLY) diff --git a/code/modules/mining/equipment/monster_organs/brimdust_sac.dm b/code/modules/mining/equipment/monster_organs/brimdust_sac.dm index 1051962bbb8d0..dc6539ff336b5 100644 --- a/code/modules/mining/equipment/monster_organs/brimdust_sac.dm +++ b/code/modules/mining/equipment/monster_organs/brimdust_sac.dm @@ -171,6 +171,7 @@ var/armor = target.run_armor_check(attack_flag = BOMB) target.apply_damage(damage_dealt, damagetype = BURN, blocked = armor, spread_damage = TRUE) + SEND_SIGNAL(owner, COMSIG_BRIMDUST_EXPLOSION) add_stacks(-1) /// Slowdown applied when you are detonated on the space station diff --git a/code/modules/mining/equipment/monster_organs/monster_organ.dm b/code/modules/mining/equipment/monster_organs/monster_organ.dm index 22837383d31e8..699564c9ed77e 100644 --- a/code/modules/mining/equipment/monster_organs/monster_organ.dm +++ b/code/modules/mining/equipment/monster_organs/monster_organ.dm @@ -42,7 +42,7 @@ visual = FALSE item_flags = NOBLUDGEON slot = ORGAN_SLOT_MONSTER_CORE - organ_flags = NONE + organ_flags = ORGAN_ORGANIC force = 0 /// Set to true if this organ has decayed into uselessness. var/inert = FALSE @@ -183,9 +183,9 @@ * Utility proc to find the associated monster organ action and trigger it. * Call this instead of on_triggered_internal() if the action needs to trigger automatically, or the cooldown won't happen. */ -/obj/item/organ/internal/monster_core/proc/trigger_organ_action() +/obj/item/organ/internal/monster_core/proc/trigger_organ_action(trigger_flags) var/datum/action/cooldown/monster_core_action/action = locate() in actions - action?.Trigger() + action?.Trigger(trigger_flags = trigger_flags) /** * Called when activated while implanted inside someone. diff --git a/code/modules/mining/equipment/monster_organs/regenerative_core.dm b/code/modules/mining/equipment/monster_organs/regenerative_core.dm index f8c955362585e..98758d5a369ce 100644 --- a/code/modules/mining/equipment/monster_organs/regenerative_core.dm +++ b/code/modules/mining/equipment/monster_organs/regenerative_core.dm @@ -28,7 +28,7 @@ /obj/item/organ/internal/monster_core/regenerative_core/on_life(seconds_per_tick, times_fired) . = ..() if (owner.health <= owner.crit_threshold) - trigger_organ_action() + trigger_organ_action(TRIGGER_FORCE_AVAILABLE) /obj/item/organ/internal/monster_core/regenerative_core/on_triggered_internal() owner.revive(HEAL_ALL) @@ -36,7 +36,7 @@ /// Log applications and apply moodlet. /obj/item/organ/internal/monster_core/regenerative_core/apply_to(mob/living/target, mob/user) - target.add_mood_event("regenerative core", /datum/mood_event/healsbadman) + target.add_mood_event(MOOD_CATEGORY_LEGION_CORE, /datum/mood_event/healsbadman) if (target != user) target.visible_message(span_notice("[user] forces [target] to apply [src]... Black tendrils entangle and reinforce [target.p_them()]!")) SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "other")) @@ -60,4 +60,3 @@ desc = "Fully regenerate your body, consuming your regenerative core in the process. \ This process will trigger automatically if you are badly wounded." button_icon_state = "legion_core_stable" - check_flags = NONE diff --git a/code/modules/mining/equipment/monster_organs/rush_gland.dm b/code/modules/mining/equipment/monster_organs/rush_gland.dm index f716f51d7ddda..3554d67b2a66f 100644 --- a/code/modules/mining/equipment/monster_organs/rush_gland.dm +++ b/code/modules/mining/equipment/monster_organs/rush_gland.dm @@ -21,6 +21,14 @@ if (owner.health <= HEALTH_DANGER_ZONE) trigger_organ_action() +/obj/item/organ/internal/monster_core/rush_gland/on_insert(mob/living/carbon/organ_owner) + . = ..() + RegisterSignal(organ_owner, COMSIG_GOLIATH_TENTACLED_GRABBED, PROC_REF(trigger_organ_action)) + +/obj/item/organ/internal/monster_core/rush_gland/on_remove(mob/living/carbon/organ_owner, special) + . = ..() + UnregisterSignal(organ_owner, COMSIG_GOLIATH_TENTACLED_GRABBED) + /obj/item/organ/internal/monster_core/rush_gland/on_triggered_internal() owner.apply_status_effect(/datum/status_effect/lobster_rush/extended) @@ -44,14 +52,14 @@ . = ..() RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_move)) RegisterSignal(owner, COMSIG_MOVABLE_BUMP, PROC_REF(on_bump)) - ADD_TRAIT(owner, TRAIT_IGNORESLOWDOWN, TRAIT_STATUS_EFFECT(id)) + owner.add_traits(list(TRAIT_IGNORESLOWDOWN, TRAIT_TENTACLE_IMMUNE), TRAIT_STATUS_EFFECT(id)) owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/lobster_rush) to_chat(owner, span_notice("You feel your blood pumping!")) /datum/status_effect/lobster_rush/on_remove() . = ..() UnregisterSignal(owner, list(COMSIG_MOVABLE_PRE_MOVE, COMSIG_MOVABLE_BUMP)) - REMOVE_TRAIT(owner, TRAIT_IGNORESLOWDOWN, TRAIT_STATUS_EFFECT(id)) + owner.remove_traits(list(TRAIT_IGNORESLOWDOWN, TRAIT_TENTACLE_IMMUNE), TRAIT_STATUS_EFFECT(id)) owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/lobster_rush) to_chat(owner, span_notice("Your pulse returns to normal.")) diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 264cbca5cab5b..056ef6cbc7ebd 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -79,6 +79,11 @@ desc = "A luxury bar in a capsule. Bartender required and not included." template_id = "shelter_charlie" +/obj/item/survivalcapsule/bathroom + name = "emergency relief capsule" + desc = "Provides vital emergency support to employees who are caught short in the field." + template_id = "shelter_toilet" + //Pod objects //Window @@ -93,7 +98,7 @@ /obj/structure/window/reinforced/survival_pod name = "pod window" - icon = 'icons/obj/lavaland/survival_pod.dmi' + icon = 'icons/obj/mining_zones/survival_pod.dmi' icon_state = "pwindow" MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/survival_pod/spawner, 0) @@ -120,13 +125,13 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/survival_pod/spawne //Windoor /obj/machinery/door/window/survival_pod - icon = 'icons/obj/lavaland/survival_pod.dmi' + icon = 'icons/obj/mining_zones/survival_pod.dmi' icon_state = "windoor" base_state = "windoor" //Table /obj/structure/table/survival_pod - icon = 'icons/obj/lavaland/survival_pod.dmi' + icon = 'icons/obj/mining_zones/survival_pod.dmi' icon_state = "table" smoothing_flags = NONE smoothing_groups = null @@ -134,7 +139,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/survival_pod/spawne //Sleeper /obj/machinery/sleeper/survival_pod - icon = 'icons/obj/lavaland/survival_pod.dmi' + icon = 'icons/obj/mining_zones/survival_pod.dmi' icon_state = "sleeper" base_icon_state = "sleeper" @@ -145,14 +150,14 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/survival_pod/spawne //Lifeform Stasis Unit /obj/machinery/stasis/survival_pod - icon = 'icons/obj/lavaland/survival_pod.dmi' + icon = 'icons/obj/mining_zones/survival_pod.dmi' buckle_lying = 270 //Computer /obj/item/gps/computer name = "pod computer" + icon = 'icons/obj/mining_zones/pod_computer.dmi' icon_state = "pod_computer" - icon = 'icons/obj/lavaland/pod_computer.dmi' anchored = TRUE density = TRUE pixel_y = -32 @@ -177,11 +182,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/survival_pod/spawne //Bed /obj/structure/bed/pod - icon = 'icons/obj/lavaland/survival_pod.dmi' + icon = 'icons/obj/mining_zones/survival_pod.dmi' icon_state = "bed" /obj/structure/bed/double/pod - icon = 'icons/obj/lavaland/survival_pod.dmi' + icon = 'icons/obj/mining_zones/survival_pod.dmi' icon_state = "bed_double" //Survival Storage Unit @@ -189,7 +194,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/survival_pod/spawne name = "survival pod storage" desc = "A heated storage unit." icon_state = "donkvendor" - icon = 'icons/obj/lavaland/donkvendor.dmi' + icon = 'icons/obj/mining_zones/donkvendor.dmi' base_build_path = /obj/machinery/smartfridge/survival_pod light_range = 5 light_power = 1.2 @@ -220,7 +225,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/survival_pod/spawne //Fluff /obj/structure/tubes icon_state = "tubes" - icon = 'icons/obj/lavaland/survival_pod.dmi' + icon = 'icons/obj/mining_zones/survival_pod.dmi' name = "tubes" anchored = TRUE layer = BELOW_MOB_LAYER diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm index beaa8b5c88088..f42d572cb6cdd 100644 --- a/code/modules/mining/equipment/wormhole_jaunter.dm +++ b/code/modules/mining/equipment/wormhole_jaunter.dm @@ -101,6 +101,7 @@ desc = "A stable hole in the universe made by a wormhole jaunter. Turbulent doesn't even begin to describe how rough passage through one of these is, but at least it will always get you somewhere near a beacon." mech_sized = TRUE //save your ripley innate_accuracy_penalty = 6 + light_on = FALSE /obj/effect/portal/jaunt_tunnel/teleport(atom/movable/M) . = ..() diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index a0920e0dba374..20a436dc5c6f5 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -63,7 +63,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) if(do_after(user,50,target=A)) to_chat(user, span_notice("You attach the pack to [A] and activate it.")) if(loc == user) - user.back?.atom_storage?.attempt_insert(src, user) + user.back?.atom_storage?.attempt_insert(src, user, force = STORAGE_SOFT_LOCKED) uses_left-- if(uses_left <= 0) user.transferItemToLoc(src, A, TRUE) @@ -81,12 +81,12 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) var/obj/effect/extraction_holder/holder_obj = new(A.loc) holder_obj.appearance = A.appearance A.forceMove(holder_obj) - balloon2 = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_expand") + balloon2 = mutable_appearance('icons/effects/fulton_balloon.dmi', "fulton_expand") balloon2.pixel_y = 10 balloon2.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM holder_obj.add_overlay(balloon2) sleep(0.4 SECONDS) - balloon = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_balloon") + balloon = mutable_appearance('icons/effects/fulton_balloon.dmi', "fulton_balloon") balloon.pixel_y = 10 balloon.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM holder_obj.cut_overlay(balloon2) @@ -120,7 +120,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) sleep(1 SECONDS) animate(holder_obj, pixel_z = 10, time = 10) sleep(1 SECONDS) - balloon3 = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_retract") + balloon3 = mutable_appearance('icons/effects/fulton_balloon.dmi', "fulton_retract") balloon3.pixel_y = 10 balloon3.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM holder_obj.cut_overlay(balloon) @@ -144,7 +144,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) icon_state = "folded_extraction" /obj/item/fulton_core/attack_self(mob/user) - if(do_after(user,15,target = user) && !QDELETED(src)) + if(do_after(user, 1.5 SECONDS, target = user) && !QDELETED(src)) new /obj/structure/extraction_point(get_turf(user)) playsound(src, 'sound/items/deconstruct.ogg', vol = 50, vary = TRUE, extrarange = MEDIUM_RANGE_SOUND_EXTRARANGE) qdel(src) @@ -156,6 +156,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) icon_state = "extraction_point" anchored = TRUE density = FALSE + obj_flags = CAN_BE_HIT | UNIQUE_RENAME var/beacon_network = "station" /obj/structure/extraction_point/Initialize(mapload) @@ -168,6 +169,15 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) GLOB.total_extraction_beacons -= src return ..() +/obj/structure/extraction_point/attack_hand(mob/living/user, list/modifiers) + . = ..() + balloon_alert_to_viewers("undeploying...") + if(!do_after(user, 1.5 SECONDS, src)) + return + new /obj/item/fulton_core(drop_location()) + playsound(src, 'sound/items/deconstruct.ogg', vol = 50, vary = TRUE, extrarange = MEDIUM_RANGE_SOUND_EXTRARANGE) + qdel(src) + /obj/structure/extraction_point/update_overlays() . = ..() . += emissive_appearance(icon, "[icon_state]_light", src, alpha = src.alpha) diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index 3733e20554d05..8a7ffeec88f66 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -129,10 +129,15 @@ GLOBAL_LIST(labor_sheet_values) if(stacking_machine) stacking_machine.labor_console = src -/obj/machinery/mineral/labor_claim_console/emag_act(mob/user) - if(!(obj_flags & EMAGGED)) - obj_flags |= EMAGGED - to_chat(user, span_warning("PZZTTPFFFT")) +/obj/machinery/mineral/labor_claim_console/emag_act(mob/user, obj/item/card/emag/emag_card) + if (obj_flags & EMAGGED) + return FALSE + + obj_flags |= EMAGGED + balloon_alert(user, "id authenticator short-circuited") + visible_message(span_warning("[src] lets out a few sparks!")) + do_sparks(2, TRUE, src) + return TRUE /**********************Prisoner Collection Unit**************************/ diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm index e9a74cbc63eba..e1260ab365ea5 100644 --- a/code/modules/mining/lavaland/ash_flora.dm +++ b/code/modules/mining/lavaland/ash_flora.dm @@ -4,9 +4,10 @@ /obj/structure/flora/ash name = "large mushrooms" desc = "A number of large mushrooms, covered in a faint layer of ash and what can only be spores." - icon = 'icons/obj/lavaland/ash_flora.dmi' + icon = 'icons/obj/mining_zones/ash_flora.dmi' icon_state = "l_mushroom1" base_icon_state = "l_mushroom" + resistance_flags = LAVA_PROOF gender = PLURAL layer = PROJECTILE_HIT_THRESHHOLD_LAYER //sporangiums up don't shoot product_types = list(/obj/item/food/grown/ash_flora/shavings = 1) @@ -182,7 +183,7 @@ /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 = 'icons/obj/mining_zones/ash_flora.dmi' icon_state = "mushroom_shavings" w_class = WEIGHT_CLASS_TINY resistance_flags = FLAMMABLE @@ -268,7 +269,7 @@ 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' + growing_icon = 'icons/obj/service/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) @@ -288,7 +289,7 @@ 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' + growing_icon = 'icons/obj/service/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. @@ -309,7 +310,7 @@ 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' + growing_icon = 'icons/obj/service/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/consumable/mintextract = 0.02) /obj/item/seeds/lavaland/porcini @@ -320,7 +321,7 @@ 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' + growing_icon = 'icons/obj/service/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 @@ -331,7 +332,7 @@ 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' + growing_icon = 'icons/obj/service/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 @@ -342,7 +343,7 @@ 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' + growing_icon = 'icons/obj/service/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 @@ -353,7 +354,7 @@ 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' + growing_icon = 'icons/obj/service/hydroponics/growing_mushrooms.dmi' reagents_add = list(/datum/reagent/toxin/mushroom_powder = 0.1, /datum/reagent/medicine/coagulant/seraka_extract = 0.02) /obj/item/seeds/lavaland/fireblossom @@ -365,7 +366,7 @@ growthstages = 3 product = /obj/item/food/grown/ash_flora/fireblossom genes = list(/datum/plant_gene/trait/fire_resistance, /datum/plant_gene/trait/glow/yellow) - growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' + growing_icon = 'icons/obj/service/hydroponics/growing_flowers.dmi' reagents_add = list(/datum/reagent/consumable/tinlux = 0.04, /datum/reagent/consumable/nutriment = 0.03, /datum/reagent/carbon = 0.05) //CRAFTING @@ -380,10 +381,10 @@ /obj/item/reagent_containers/cup/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 = 'icons/obj/mining_zones/ash_flora.dmi' icon_state = "mushroom_bowl" fill_icon_state = "fullbowl" - fill_icon = 'icons/obj/lavaland/ash_flora.dmi' + fill_icon = 'icons/obj/mining_zones/ash_flora.dmi' /obj/item/reagent_containers/cup/bowl/mushroom_bowl/update_icon_state() if(!reagents.total_volume) diff --git a/code/modules/mining/lavaland/megafauna_loot.dm b/code/modules/mining/lavaland/megafauna_loot.dm index 32b6b20c8bcdb..88262b1e96ac1 100644 --- a/code/modules/mining/lavaland/megafauna_loot.dm +++ b/code/modules/mining/lavaland/megafauna_loot.dm @@ -46,7 +46,7 @@ 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' + icon = 'icons/obj/mining_zones/artefacts.dmi' lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi' righthand_file = 'icons/mob/inhands/64x64_righthand.dmi' inhand_x_dimension = 64 @@ -238,7 +238,7 @@ /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 = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "vial" /obj/item/mayhem/attack_self(mob/user) @@ -282,7 +282,7 @@ /obj/item/clothing/suit/hooded/hostile_environment/Initialize(mapload) . = ..() AddElement(/datum/element/radiation_protected_clothing) - AddComponent(/datum/component/gags_recolorable) + AddElement(/datum/element/gags_recolorable) /obj/item/clothing/suit/hooded/hostile_environment/process(seconds_per_tick) . = ..() @@ -328,7 +328,7 @@ butcher_callback = CALLBACK(src, PROC_REF(consume)), \ ) AddElement(/datum/element/radiation_protected_clothing) - AddComponent(/datum/component/gags_recolorable) + AddElement(/datum/element/gags_recolorable) /obj/item/clothing/head/hooded/hostile_environment/equipped(mob/user, slot, initial = FALSE) . = ..() @@ -352,7 +352,7 @@ /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 = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "soulscythe" inhand_icon_state = "soulscythe" lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi' @@ -428,7 +428,6 @@ 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") @@ -642,9 +641,10 @@ spirits = list() START_PROCESSING(SSobj, src) SSpoints_of_interest.make_point_of_interest(src) - AddComponent(/datum/component/butchering, \ - speed = 15 SECONDS, \ - effectiveness = 90, \ + AddComponent(\ + /datum/component/butchering, \ + speed = 15 SECONDS, \ + effectiveness = 90, \ ) /obj/item/melee/ghost_sword/Destroy() @@ -711,7 +711,7 @@ /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 = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "vial" /obj/item/dragons_blood/attack_self(mob/living/carbon/human/user) @@ -778,7 +778,7 @@ 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)) + var/static/list/banned_turfs = typecacheof(list(/turf/open/space, /turf/closed)) /obj/item/lava_staff/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() @@ -830,7 +830,7 @@ /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' + icon = 'icons/obj/mining_zones/artefacts.dmi' lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi' righthand_file = 'icons/mob/inhands/64x64_righthand.dmi' icon_state = "cleaving_saw" @@ -846,8 +846,6 @@ 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(FACTION_MINING, FACTION_BOSS) /// Amount of damage we deal to the above factions @@ -863,7 +861,8 @@ /obj/item/melee/cleaving_saw/Initialize(mapload) . = ..() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ transform_cooldown_time = (CLICK_CD_MELEE * 0.25), \ force_on = open_force, \ throwforce_on = open_throwforce, \ @@ -871,26 +870,28 @@ 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")) + 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("It is [HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE) ? "open, will cleave enemies in a wide arc and deal additional damage to fauna":"closed, and can be used for rapid consecutive attacks that cause fauna to bleed"].") . += 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/living/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!")) + user.visible_message(span_suicide("[user] is [HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE) ? "closing [src] on [user.p_their()] neck" : "opening [src] into [user.p_their()] chest"]! It looks like [user.p_theyre()] trying to commit suicide!")) attack_self(user) return BRUTELOSS /obj/item/melee/cleaving_saw/melee_attack_chain(mob/user, atom/target, params) . = ..() - if(!is_open) + if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) 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) + var/is_open = HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE) if(!is_open || swiping || !target.density || get_turf(target) == get_turf(user)) if(!is_open) faction_bonus_force = 0 @@ -941,11 +942,10 @@ /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)) + if(user) + balloon_alert(user, "[active ? "opened" : "closed"] [src]") + playsound(src, 'sound/magic/clockwork/fellowship_armory.ogg', 35, TRUE, frequency = 90000 - (active * 30000)) return COMPONENT_NO_DEFAULT_MESSAGE //Legion: Staff of Storms diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 6d422157a2442..6e3d21ec8335d 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -26,7 +26,7 @@ if(2) new /obj/item/soulstone/anybody/mining(src) if(3) - new /obj/item/organ/internal/cyberimp/arm/katana(src) + new /obj/item/organ/internal/cyberimp/arm/shard/katana(src) if(4) new /obj/item/clothing/glasses/godeye(src) if(5) @@ -117,11 +117,11 @@ name = "\improper Ancient Sarcophagus" desc = "Once guarded by the King of Demons, this sarcophagus contains the relics of an ancient soldier." icon_state = "necro_bubblegum" + base_icon_state = "necro_bubblegum" lid_icon_state = "necro_bubblegum_lid" lid_x = -26 lid_y = 2 - /obj/structure/closet/crate/necropolis/bubblegum/PopulateContents() new /obj/item/clothing/suit/hooded/hostile_environment(src) var/loot = rand(1,2) @@ -177,6 +177,6 @@ /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 = 'icons/obj/mining_zones/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 index 2c46fca1392a7..d3d4b4b672f20 100644 --- a/code/modules/mining/lavaland/tendril_loot.dm +++ b/code/modules/mining/lavaland/tendril_loot.dm @@ -69,7 +69,7 @@ /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' + icon = 'icons/obj/mining_zones/artefacts.dmi' lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' icon_state = "asclepius_dormant" @@ -141,7 +141,7 @@ /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 = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "memento_mori" worn_icon_state = "memento" actions_types = list(/datum/action/item_action/hands_free/memento_mori) @@ -304,7 +304,7 @@ /obj/item/warp_cube name = "blue cube" desc = "A mysterious blue cube." - icon = 'icons/obj/lavaland/artefacts.dmi' + icon = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "blue_cube" var/teleport_color = "#3FBAFD" var/obj/item/warp_cube/linked @@ -372,7 +372,7 @@ /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 = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "talisman" resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF actions_types = list(/datum/action/item_action/immortality) @@ -421,7 +421,7 @@ return user.status_flags &= ~GODMODE - user.notransform = FALSE + REMOVE_TRAIT(user, TRAIT_NO_TRANSFORM, REF(src)) user.forceMove(get_turf(src)) user.visible_message(span_danger("[user] pops back into reality!")) @@ -432,7 +432,7 @@ setDir(user.dir) user.forceMove(src) - user.notransform = TRUE + ADD_TRAIT(user, TRAIT_NO_TRANSFORM, REF(src)) user.status_flags |= GODMODE user_ref = WEAKREF(user) @@ -446,8 +446,8 @@ return /obj/effect/immortality_talisman/relaymove(mob/living/user, direction) - // Won't really come into play since our mob has notransform and cannot move, - // but regardless block all relayed moves, becuase no, you cannot move in the void. + // 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() @@ -461,7 +461,7 @@ /obj/item/shared_storage name = "paradox bag" desc = "Somehow, it's in two places at once." - icon = 'icons/obj/lavaland/artefacts.dmi' + icon = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "paradox_bag" worn_icon_state = "paradoxbag" slot_flags = ITEM_SLOT_BELT @@ -491,7 +491,7 @@ /obj/item/book_of_babel name = "Book of Babel" desc = "An ancient tome written in countless tongues." - icon = 'icons/obj/library.dmi' + icon = 'icons/obj/service/library.dmi' icon_state = "book1" w_class = WEIGHT_CLASS_SMALL @@ -503,18 +503,19 @@ 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.")) cure_curse_of_babel(user) // removes tower of babel if we have it - user.grant_all_languages(source=LANGUAGE_BABEL) + user.grant_all_languages(source = LANGUAGE_BABEL) user.remove_blocked_language(GLOB.all_languages, source = LANGUAGE_ALL) - ADD_TRAIT(user.mind, TRAIT_TOWER_OF_BABEL, MAGIC_TRAIT) // this makes you immune to babel effects + if(user.mind) + ADD_TRAIT(user.mind, TRAIT_TOWER_OF_BABEL, MAGIC_TRAIT) // this makes you immune to babel effects new /obj/effect/decal/cleanable/ash(get_turf(user)) qdel(src) //Potion of Flight /obj/item/reagent_containers/cup/bottle/potion - icon = 'icons/obj/lavaland/artefacts.dmi' + icon = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "potionflask" - fill_icon = 'icons/obj/lavaland/artefacts.dmi' + fill_icon = 'icons/obj/mining_zones/artefacts.dmi' fill_icon_state = "potion_fill" fill_icon_thresholds = list(0, 1) @@ -891,18 +892,17 @@ name = "Scan Target" desc = "Contact may or may not be close." -/obj/item/organ/internal/cyberimp/arm/katana - name = "dark shard" - desc = "An eerie metal shard surrounded by dark energies." - icon = 'icons/obj/lavaland/artefacts.dmi' +/obj/item/organ/internal/cyberimp/arm/shard + name = "dark spoon shard" + desc = "An eerie metal shard surrounded by dark energies...of soup drinking. You probably don't think you should have been able to find this." + icon = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "cursed_katana_organ" - status = ORGAN_ORGANIC - organ_flags = ORGAN_FROZEN|ORGAN_UNREMOVABLE - items_to_create = list(/obj/item/cursed_katana) + organ_flags = ORGAN_ORGANIC | ORGAN_FROZEN | ORGAN_UNREMOVABLE + items_to_create = list(/obj/item/kitchen/spoon) extend_sound = 'sound/items/unsheath.ogg' retract_sound = 'sound/items/sheath.ogg' -/obj/item/organ/internal/cyberimp/arm/katana/attack_self(mob/user, modifiers) +/obj/item/organ/internal/cyberimp/arm/shard/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) @@ -912,10 +912,15 @@ user.temporarilyRemoveItemFromInventory(src, TRUE) Insert(user) -/obj/item/organ/internal/cyberimp/arm/katana/screwdriver_act(mob/living/user, obj/item/screwtool) +/obj/item/organ/internal/cyberimp/arm/shard/screwdriver_act(mob/living/user, obj/item/screwtool) return -/obj/item/organ/internal/cyberimp/arm/katana/Retract() +/obj/item/organ/internal/cyberimp/arm/shard/katana + name = "dark shard" + desc = "An eerie metal shard surrounded by dark energies." + items_to_create = list(/obj/item/cursed_katana) + +/obj/item/organ/internal/cyberimp/arm/shard/katana/Retract() var/obj/item/cursed_katana/katana = active_item if(!katana || katana.shattered) return FALSE @@ -940,7 +945,7 @@ 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 = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "cursed_katana" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 869779f6c361c..4f28db93bc6e4 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -24,12 +24,12 @@ /obj/machinery/mineral/proc/register_input_turf() input_turf = get_step(src, input_dir) if(input_turf) // make sure there is actually a turf - RegisterSignals(input_turf, list(COMSIG_ATOM_INITIALIZED_ON, COMSIG_ATOM_ENTERED), PROC_REF(pickup_item)) + RegisterSignals(input_turf, list(COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, COMSIG_ATOM_ENTERED), PROC_REF(pickup_item)) /// Unregisters signals that are registered the machine's input turf, if it has one. /obj/machinery/mineral/proc/unregister_input_turf() if(input_turf) - UnregisterSignal(input_turf, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_INITIALIZED_ON)) + UnregisterSignal(input_turf, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON)) /obj/machinery/mineral/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) . = ..() @@ -46,7 +46,7 @@ /** Base proc for all `/mineral` subtype machines to use. Place your item pickup behavior in this proc when you override it for your specific machine. - Called when the COMSIG_ATOM_ENTERED and COMSIG_ATOM_INITIALIZED_ON signals are sent. + Called when the COMSIG_ATOM_ENTERED and COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON signals are sent. Arguments: * source - the turf that is listening for the signals. @@ -136,6 +136,8 @@ var/datum/techweb/stored_research ///Proximity monitor associated with this atom, needed for proximity checks. var/datum/proximity_monitor/proximity_monitor + ///Material container for materials + var/datum/component/material_container/materials /obj/machinery/mineral/processing_unit/Initialize(mapload) . = ..() @@ -152,13 +154,20 @@ /datum/material/titanium, /datum/material/bluespace, ) - AddComponent(/datum/component/material_container, allowed_materials, INFINITY, MATCONTAINER_EXAMINE|BREAKDOWN_FLAGS_ORE_PROCESSOR, allowed_items=/obj/item/stack) + materials = AddComponent( \ + /datum/component/material_container, \ + allowed_materials, \ + INFINITY, \ + MATCONTAINER_EXAMINE | BREAKDOWN_FLAGS_ORE_PROCESSOR, \ + allowed_items = /obj/item/stack \ + ) if(!GLOB.autounlock_techwebs[/datum/techweb/autounlocking/smelter]) GLOB.autounlock_techwebs[/datum/techweb/autounlocking/smelter] = new /datum/techweb/autounlocking/smelter stored_research = GLOB.autounlock_techwebs[/datum/techweb/autounlocking/smelter] selected_material = GET_MATERIAL_REF(/datum/material/iron) /obj/machinery/mineral/processing_unit/Destroy() + materials = null mineral_machine = null stored_research = null return ..() @@ -166,7 +175,6 @@ /obj/machinery/mineral/processing_unit/proc/process_ore(obj/item/stack/ore/O) if(QDELETED(O)) return - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) var/material_amount = materials.get_item_material_amount(O, BREAKDOWN_FLAGS_ORE_PROCESSOR) if(!materials.has_space(material_amount)) unload_mineral(O) @@ -177,7 +185,6 @@ /obj/machinery/mineral/processing_unit/proc/get_machine_data() var/dat = "Smelter control console

    " - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) for(var/datum/material/all_materials as anything in materials.materials) var/amount = materials.materials[all_materials] dat += "[all_materials.name]: [amount] cm³" @@ -231,7 +238,6 @@ mineral_machine.updateUsrDialog() /obj/machinery/mineral/processing_unit/proc/smelt_ore(seconds_per_tick = 2) - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) var/datum/material/mat = selected_material if(!mat) return @@ -254,8 +260,7 @@ on = FALSE return - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - materials.use_materials(alloy.materials, amount) + materials.use_materials(alloy.materials, multiplier = amount) generate_mineral(alloy.build_path) @@ -265,8 +270,6 @@ var/build_amount = SMELT_AMOUNT * seconds_per_tick - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - for(var/mat_cat in D.materials) var/required_amount = D.materials[mat_cat] var/amount = materials.materials[mat_cat] @@ -279,9 +282,4 @@ var/O = new P(src) unload_mineral(O) -/obj/machinery/mineral/processing_unit/on_deconstruction() - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - materials.retrieve_all() - return ..() - #undef SMELT_AMOUNT diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index f3a4278c2fe42..ce045a8129853 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -52,7 +52,11 @@ if(!GLOB.autounlock_techwebs[/datum/techweb/autounlocking/smelter]) GLOB.autounlock_techwebs[/datum/techweb/autounlocking/smelter] = new /datum/techweb/autounlocking/smelter stored_research = GLOB.autounlock_techwebs[/datum/techweb/autounlocking/smelter] - materials = AddComponent(/datum/component/remote_materials, "orm", mapload, mat_container_flags=BREAKDOWN_FLAGS_ORM) + materials = AddComponent( + /datum/component/remote_materials, \ + mapload, \ + mat_container_flags = BREAKDOWN_FLAGS_ORM \ + ) /obj/machinery/mineral/ore_redemption/Destroy() stored_research = null @@ -84,16 +88,12 @@ unload_mineral(gathered_ore) else - var/list/stack_mats = gathered_ore.get_material_composition(BREAKDOWN_FLAGS_ORM) - var/mats = stack_mats & mat_container.materials var/ore_amount = gathered_ore.amount var/ore_points= gathered_ore.points - var/ore_name = gathered_ore.name var/refined_type = gathered_ore?.refined_type - if(mat_container.insert_item(gathered_ore, ore_multiplier, breakdown_flags = BREAKDOWN_FLAGS_ORM) > 0) //increase points only if insertion was successfull + if(mat_container.insert_item(gathered_ore, ore_multiplier, breakdown_flags = BREAKDOWN_FLAGS_ORM, context = src) > 0) //increase points only if insertion was successfull if(refined_type) points += ore_points * point_upgrade * ore_amount - materials.silo_log(src, "smelted", ore_amount, ore_name, mats) SEND_SIGNAL(src, COMSIG_ORM_COLLECTED_ORE) @@ -210,7 +210,8 @@ if(isnull(O.refined_type)) to_chat(user, span_warning("[O] has already been refined!")) return - + smelt_ore(O) + return TRUE return ..() /obj/machinery/mineral/ore_redemption/AltClick(mob/living/user) @@ -351,12 +352,7 @@ var/desired = text2num(params["sheets"]) var/sheets_to_remove = round(min(desired, 50, stored_amount)) - - var/count = mat_container.retrieve_sheets(sheets_to_remove, mat, get_step(src, output_dir)) - var/list/mats = list() - mats[mat] = SHEET_MATERIAL_AMOUNT - materials.silo_log(src, "released", -count, "sheets", mats) - //Logging deleted for quick coding + materials.eject_sheets(mat, sheets_to_remove, get_step(src, output_dir)) return TRUE if("Smelt") if(!mat_container) @@ -374,8 +370,7 @@ var/amount = round(min(text2num(params["sheets"]), 50, can_smelt_alloy(alloy))) if(amount < 1) //no negative mats return - mat_container.use_materials(alloy.materials, amount) - materials.silo_log(src, "released", -amount, "sheets", alloy.materials) + materials.use_materials(alloy.materials, multiplier = amount, action = "released", name = "sheets") var/output if(ispath(alloy.build_path, /obj/item/stack/sheet)) output = new alloy.build_path(src, amount) @@ -399,7 +394,7 @@ if((machine_stat & NOPOWER)) return var/image/ore_input = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_[input_dir]") - var/image/ore_output = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_[turn(input_dir, 180)]") + var/image/ore_output = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_[REVERSE_DIR(input_dir)]") switch(input_dir) if(NORTH) diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index f76cdcde79630..840c8e92900a8 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -4,7 +4,7 @@ GLOBAL_LIST_EMPTY(silo_access_logs) /obj/machinery/ore_silo name = "ore silo" desc = "An all-in-one bluespace storage and transmission system for the station's mineral distribution needs." - icon = 'icons/obj/mining.dmi' + icon = 'icons/obj/machines/ore_silo.dmi' icon_state = "silo" density = TRUE circuit = /obj/item/circuitboard/machine/ore_silo @@ -15,6 +15,8 @@ GLOBAL_LIST_EMPTY(silo_access_logs) var/list/holds = list() /// List of all components that are sharing ores with this silo. var/list/datum/component/remote_materials/ore_connected_machines = list() + /// Material Container + var/datum/component/material_container/materials /obj/machinery/ore_silo/Initialize(mapload) . = ..() @@ -31,7 +33,16 @@ GLOBAL_LIST_EMPTY(silo_access_logs) /datum/material/bluespace, /datum/material/plastic, ) - AddComponent(/datum/component/material_container, materials_list, INFINITY, MATCONTAINER_NO_INSERT, allowed_items=/obj/item/stack) + materials = AddComponent( \ + /datum/component/material_container, \ + materials_list, \ + INFINITY, \ + container_signals = list( \ + COMSIG_MATCONTAINER_ITEM_CONSUMED = TYPE_PROC_REF(/obj/machinery/ore_silo, log_item_consumed), \ + COMSIG_MATCONTAINER_SHEETS_RETRIEVED = TYPE_PROC_REF(/obj/machinery/ore_silo, log_sheets_ejected), \ + ), \ + allowed_items = /obj/item/stack \ + ) if (!GLOB.ore_silo_default && mapload && is_station_level(z)) GLOB.ore_silo_default = src @@ -43,47 +54,25 @@ GLOBAL_LIST_EMPTY(silo_access_logs) mats.disconnect_from(src) ore_connected_machines = null - - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - materials.retrieve_all() + materials = null return ..() -/obj/machinery/ore_silo/proc/remote_attackby(obj/machinery/M, mob/living/user, obj/item/stack/I, breakdown_flags=NONE) - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - // stolen from /datum/component/material_container/proc/OnAttackBy - if(user.combat_mode) - return - if(I.item_flags & ABSTRACT) - return - if(!istype(I) || (I.flags_1 & HOLOGRAM_1) || (I.item_flags & NO_MAT_REDEMPTION)) - to_chat(user, span_warning("[M] won't accept [I]!")) - return - var/item_mats = materials.get_item_material_amount(I, breakdown_flags) - if(!item_mats) - to_chat(user, span_warning("[I] does not contain sufficient materials to be accepted by [M].")) - return - // assumes unlimited space... - var/amount = I.amount - materials.user_insert(I, user, breakdown_flags) - var/list/matlist = I.get_material_composition(breakdown_flags) - silo_log(M, "deposited", amount, I.name, matlist) - return TRUE +/obj/machinery/ore_silo/proc/log_item_consumed(datum/component/material_container/container, obj/item/item_inserted, last_inserted_id, mats_consumed, amount_inserted, atom/context) + SIGNAL_HANDLER -/obj/machinery/ore_silo/attackby(obj/item/W, mob/user, params) - if(default_deconstruction_screwdriver(user, icon_state, icon_state, W)) - updateUsrDialog() - return - if(default_deconstruction_crowbar(W)) - return + silo_log(context, "deposited", amount_inserted, item_inserted.name, mats_consumed) - if(!powered()) - return ..() +/obj/machinery/ore_silo/proc/log_sheets_ejected(datum/component/material_container/container, obj/item/stack/sheet/sheets, atom/context) + SIGNAL_HANDLER - if (isstack(W)) - return remote_attackby(src, user, W) + silo_log(context, "ejected", -sheets.amount, "[sheets.singular_name]", sheets.custom_materials) - return ..() +/obj/machinery/ore_silo/screwdriver_act(mob/living/user, obj/item/tool) + return default_deconstruction_screwdriver(user, icon_state, icon_state, tool) + +/obj/machinery/ore_silo/crowbar_act(mob/living/user, obj/item/tool) + return default_deconstruction_crowbar(tool) /obj/machinery/ore_silo/ui_interact(mob/user) user.set_machine(src) @@ -92,7 +81,6 @@ GLOBAL_LIST_EMPTY(silo_access_logs) popup.open() /obj/machinery/ore_silo/proc/generate_ui() - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) var/list/ui = list("Ore Silo

    Stored Material:

    ") var/any = FALSE for(var/M in materials.materials) @@ -166,11 +154,8 @@ GLOBAL_LIST_EMPTY(silo_access_logs) return TRUE else if(href_list["ejectsheet"]) var/datum/material/eject_sheet = locate(href_list["ejectsheet"]) - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - var/count = materials.retrieve_sheets(text2num(href_list["eject_amt"]), eject_sheet, drop_location()) - var/list/matlist = list() - matlist[eject_sheet] = SHEET_MATERIAL_AMOUNT * count - silo_log(src, "ejected", -count, "sheets", matlist) + var/amount = text2num(href_list["eject_amt"]) + materials.retrieve_sheets(amount, eject_sheet, drop_location()) return TRUE else if(href_list["page"]) log_page = text2num(href_list["page"]) || 1 @@ -180,8 +165,8 @@ GLOBAL_LIST_EMPTY(silo_access_logs) /obj/machinery/ore_silo/multitool_act(mob/living/user, obj/item/multitool/I) . = ..() if (istype(I)) - to_chat(user, span_notice("You log [src] in the multitool's buffer.")) - I.buffer = src + I.set_buffer(src) + balloon_alert(user, "saved to multitool buffer") return TRUE /** @@ -192,7 +177,7 @@ GLOBAL_LIST_EMPTY(silo_access_logs) * - action: Text that visually describes the action (smelted/deposited/resupplied...) * - amount: The amount of sheets/objects deposited/withdrawn by this action. Positive for depositing, negative for withdrawing. * - noun: Name of the object the action was performed with (sheet, units, ore...) - * - [mats][list]: Assoc list in format (material datum = amount of raw materials). Wants the actual amount of raw (iron, glass...) materials involved in this action. If you have 10 metal sheets each worth 2000 iron you would pass a list with the iron material datum = 20000 + * - [mats][list]: Assoc list in format (material datum = amount of raw materials). Wants the actual amount of raw (iron, glass...) materials involved in this action. If you have 10 metal sheets each worth 100 iron you would pass a list with the iron material datum = 1000 */ /obj/machinery/ore_silo/proc/silo_log(obj/machinery/M, action, amount, noun, list/mats) if (!length(mats)) diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm index 366791c6a010c..286317a5d74eb 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -26,8 +26,8 @@ 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.")) + M.set_buffer(src) + balloon_alert(user, "saved to multitool buffer") return TRUE /obj/machinery/mineral/stacking_unit_console/ui_interact(mob/user, datum/tgui/ui) @@ -101,7 +101,12 @@ /obj/machinery/mineral/stacking_machine/Initialize(mapload) . = ..() proximity_monitor = new(src, 1) - materials = AddComponent(/datum/component/remote_materials, "stacking", mapload, FALSE, (mapload && force_connect)) + materials = AddComponent( + /datum/component/remote_materials, \ + mapload, \ + FALSE, \ + (mapload && force_connect) \ + ) /obj/machinery/mineral/stacking_machine/Destroy() if(console) @@ -140,8 +145,7 @@ if(materials.silo && !materials.on_hold()) var/matlist = inp.custom_materials & materials.mat_container.materials if (length(matlist)) - var/inserted = materials.mat_container.insert_item(inp) - materials.silo_log(src, "collected", inserted, "sheets", matlist) + materials.mat_container.insert_item(inp, context = src) return // No silo attached process to internal storage diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index e115bd9af014f..aebb858facba0 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -19,6 +19,13 @@ /obj/effect/light_emitter/singularity_act() return +/obj/effect/light_emitter/podbay + set_cap = 1 + +/obj/effect/light_emitter/thunderdome + set_cap = 1 + set_luminosity = 1.6 + /**********************Miner Lockers**************************/ /obj/structure/closet/wardrobe/miner @@ -29,6 +36,7 @@ new /obj/item/storage/backpack/duffelbag/explorer(src) new /obj/item/storage/backpack/explorer(src) new /obj/item/storage/backpack/satchel/explorer(src) + new /obj/item/storage/backpack/messenger/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) @@ -54,6 +62,7 @@ ..() new /obj/item/stack/sheet/mineral/sandbags(src, 5) new /obj/item/storage/box/emptysandbags(src) + new /obj/item/card/mining_point_card(src) new /obj/item/shovel(src) new /obj/item/pickaxe/mini(src) new /obj/item/radio/headset/headset_cargo/mining(src) @@ -61,12 +70,19 @@ 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) + if (HAS_TRAIT(SSstation, STATION_TRAIT_SMALLER_PODS)) + new /obj/item/survivalcapsule/bathroom(src) + else + new /obj/item/survivalcapsule(src) new /obj/item/assault_pod/mining(src) +/obj/structure/closet/secure_closet/miner/populate_contents_immediate() + . = ..() + + new /obj/item/gun/energy/recharge/kinetic_accelerator(src) + /**********************Shuttle Computer**************************/ /obj/machinery/computer/shuttle/mining diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm deleted file mode 100644 index 8b314eb48b530..0000000000000 --- a/code/modules/mining/minebot.dm +++ /dev/null @@ -1,331 +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/silicon/aibots.dmi' - icon_state = "mining_drone" - icon_living = "mining_drone" - status_flags = CANSTUN|CANKNOCKDOWN|CANPUSH - mouse_opacity = MOUSE_OPACITY_ICON - faction = list(FACTION_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_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() - QDEL_NULL(stored_gun) - 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) - death_message = "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.clear_sight(SEE_TURFS) - user.lighting_cutoff_red += 5 - user.lighting_cutoff_green += 15 - user.lighting_cutoff_blue += 5 - else - user.add_sight(SEE_TURFS) - user.lighting_cutoff_red -= 5 - user.lighting_cutoff_green -= 15 - user.lighting_cutoff_blue -= 5 - - user.sync_lighting_plane_cutoff() - - 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" - overlay_icon_state = "bg_default_border" - -/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/ores_coins.dm b/code/modules/mining/ores_coins.dm index 8ad06edb849b7..b01b537ec80d9 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -50,7 +50,7 @@ if(!refined_type) return TRUE - if(I.use_tool(src, user, 0, volume=50, amount=15)) + if(I.use_tool(src, user, 0, volume=50)) new refined_type(drop_location()) use(1) @@ -72,7 +72,7 @@ /obj/item/stack/ore/uranium name = "uranium ore" - icon_state = "Uranium ore" + icon_state = "uranium" singular_name = "uranium ore chunk" points = 30 material_flags = NONE @@ -85,7 +85,7 @@ /obj/item/stack/ore/iron name = "iron ore" - icon_state = "Iron ore" + icon_state = "iron" singular_name = "iron ore chunk" points = 1 mats_per_unit = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT) @@ -97,7 +97,7 @@ /obj/item/stack/ore/glass name = "sand pile" - icon_state = "Glass ore" + icon_state = "glass" singular_name = "sand pile" points = 1 mats_per_unit = list(/datum/material/glass=SHEET_MATERIAL_AMOUNT) @@ -112,6 +112,10 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ new /datum/stack_recipe("aesthetic volcanic floor tile", /obj/item/stack/tile/basalt, 2, 1, 50, check_density = FALSE, category = CAT_TILES)\ )) +/obj/item/stack/ore/glass/Initialize(mapload, new_amount, merge, list/mat_override, mat_amt) + . = ..() + AddComponent(/datum/component/storm_hating) + /obj/item/stack/ore/glass/get_main_recipes() . = ..() . += GLOB.sand_recipes @@ -145,7 +149,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ /obj/item/stack/ore/plasma name = "plasma ore" - icon_state = "Plasma ore" + icon_state = "plasma" singular_name = "plasma ore chunk" points = 15 mats_per_unit = list(/datum/material/plasma=SHEET_MATERIAL_AMOUNT) @@ -161,7 +165,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ /obj/item/stack/ore/silver name = "silver ore" - icon_state = "Silver ore" + icon_state = "silver" singular_name = "silver ore chunk" points = 16 mine_experience = 3 @@ -173,7 +177,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ /obj/item/stack/ore/gold name = "gold ore" - icon_state = "Gold ore" + icon_state = "gold" singular_name = "gold ore chunk" points = 18 mine_experience = 5 @@ -185,7 +189,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ /obj/item/stack/ore/diamond name = "diamond ore" - icon_state = "Diamond ore" + icon_state = "diamond" singular_name = "diamond ore chunk" points = 50 mats_per_unit = list(/datum/material/diamond=SHEET_MATERIAL_AMOUNT) @@ -196,7 +200,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ /obj/item/stack/ore/bananium name = "bananium ore" - icon_state = "Bananium ore" + icon_state = "bananium" singular_name = "bananium ore chunk" points = 60 mats_per_unit = list(/datum/material/bananium=SHEET_MATERIAL_AMOUNT) @@ -207,7 +211,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ /obj/item/stack/ore/titanium name = "titanium ore" - icon_state = "Titanium ore" + icon_state = "titanium" singular_name = "titanium ore chunk" points = 50 mats_per_unit = list(/datum/material/titanium=SHEET_MATERIAL_AMOUNT) @@ -228,7 +232,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ name = "gibtonite ore" desc = "Extremely explosive if struck with mining equipment, Gibtonite is often used by miners to speed up their work by using it as a mining charge. This material is illegal to possess by unauthorized personnel under space law." icon = 'icons/obj/ore.dmi' - icon_state = "Gibtonite ore" + icon_state = "gibtonite" inhand_icon_state = "Gibtonite ore" w_class = WEIGHT_CLASS_BULKY throw_range = 0 @@ -245,13 +249,13 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ /obj/item/gibtonite/Destroy() qdel(wires) - wires = null + set_wires(null) return ..() /obj/item/gibtonite/attackby(obj/item/I, mob/user, params) if(!wires && isigniter(I)) user.visible_message(span_notice("[user] attaches [I] to [src]."), span_notice("You attach [I] to [src].")) - wires = new /datum/wires/explosive/gibtonite(src) + set_wires(new /datum/wires/explosive/gibtonite(src)) attacher = key_name(user) qdel(I) add_overlay("Gibtonite_igniter") @@ -263,7 +267,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ return if(I.tool_behaviour == TOOL_MINING || istype(I, /obj/item/resonator) || I.force >= 10) - GibtoniteReaction(user) + GibtoniteReaction(user, "A resonator has primed for detonation a") return if(istype(I, /obj/item/mining_scanner) || istype(I, /obj/item/t_scanner/adv_mining_scanner) || I.tool_behaviour == TOOL_MULTITOOL) @@ -280,7 +284,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ if(det_timer) deltimer(det_timer) defuser?.visible_message(span_notice("The chain reaction stopped! ...The ore's quality looks diminished."), span_notice("You stopped the chain reaction. ...The ore's quality looks diminished.")) - icon_state = "Gibtonite ore" + icon_state = "gibtonite" quality = GIBTONITE_QUALITY_LOW /obj/item/gibtonite/attack_self(user) @@ -290,46 +294,44 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ return ..() /obj/item/gibtonite/bullet_act(obj/projectile/P) - GibtoniteReaction(P.firer) + GibtoniteReaction(P.firer, "A projectile has primed for detonation a") return ..() /obj/item/gibtonite/ex_act() - GibtoniteReaction(null, 1) + GibtoniteReaction(null, "An explosion has primed for detonation a") return TRUE -/obj/item/gibtonite/proc/GibtoniteReaction(mob/user, triggered_by = 0) +/obj/item/gibtonite/proc/GibtoniteReaction(mob/user, triggered_by) if(primed) return primed = TRUE playsound(src,'sound/effects/hit_on_shattered_glass.ogg',50,TRUE) - icon_state = "Gibtonite active" + icon_state = "gibtonite_active" var/notify_admins = FALSE if(!is_mining_level(z))//Only annoy the admins ingame if we're triggered off the mining zlevel notify_admins = TRUE - if(triggered_by == 1) - log_bomber(null, "An explosion has primed a", src, "for detonation", notify_admins) - else if(triggered_by == 2) - var/turf/bombturf = get_turf(src) - if(notify_admins) - message_admins("A signal has triggered a [name] to detonate at [ADMIN_VERBOSEJMP(bombturf)]. Igniter attacher: [ADMIN_LOOKUPFLW(attacher)]") - var/bomb_message = "A signal has primed a [name] for detonation at [AREACOORD(bombturf)]. Igniter attacher: [key_name(attacher)]." - log_game(bomb_message) - GLOB.bombers += bomb_message - else + if(user) user.visible_message(span_warning("[user] strikes \the [src], causing a chain reaction!"), span_danger("You strike \the [src], causing a chain reaction.")) - log_bomber(user, "has primed a", src, "for detonation", notify_admins) + + var/attacher_text = attacher ? "Igniter attacher: [ADMIN_LOOKUPFLW(attacher)]" : null + + if(triggered_by) + log_bomber(user, triggered_by, src, attacher_text, notify_admins) + else + log_bomber(user, "Something has primed a", src, "for detonation.[attacher_text ? " " : ""][attacher_text]", notify_admins) + det_timer = addtimer(CALLBACK(src, PROC_REF(detonate), notify_admins), det_time, TIMER_STOPPABLE) /obj/item/gibtonite/proc/detonate(notify_admins) if(primed) switch(quality) if(GIBTONITE_QUALITY_HIGH) - explosion(src, devastation_range = 2, heavy_impact_range = 4, light_impact_range = 9, adminlog = notify_admins) + explosion(src, devastation_range = 2, heavy_impact_range = 4, light_impact_range = 9, flame_range = 0, flash_range = 0, adminlog = notify_admins) if(GIBTONITE_QUALITY_MEDIUM) - explosion(src, devastation_range = 1, heavy_impact_range = 2, light_impact_range = 5, adminlog = notify_admins) + explosion(src, devastation_range = 1, heavy_impact_range = 2, light_impact_range = 5, flame_range = 0, flash_range = 0, adminlog = notify_admins) if(GIBTONITE_QUALITY_LOW) - explosion(src, heavy_impact_range = 1, light_impact_range = 3, adminlog = notify_admins) + explosion(src, heavy_impact_range = 1, light_impact_range = 3, flame_range = 0, flash_range = 0, adminlog = notify_admins) qdel(src) /obj/item/gibtonite/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) @@ -366,7 +368,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ force = 1 throwforce = 2 w_class = WEIGHT_CLASS_TINY - custom_materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT*0.4) + custom_materials = list(/datum/material/iron = COIN_MATERIAL_AMOUNT) material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS var/string_attached var/list/sideslist = list("heads","tails") @@ -481,37 +483,37 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ return /obj/item/coin/gold - custom_materials = list(/datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT*0.4) + custom_materials = list(/datum/material/gold = COIN_MATERIAL_AMOUNT) /obj/item/coin/silver - custom_materials = list(/datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT*0.4) + custom_materials = list(/datum/material/silver = COIN_MATERIAL_AMOUNT) /obj/item/coin/diamond - custom_materials = list(/datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT*0.4) + custom_materials = list(/datum/material/diamond = COIN_MATERIAL_AMOUNT) /obj/item/coin/plasma - custom_materials = list(/datum/material/plasma = HALF_SHEET_MATERIAL_AMOUNT*0.4) + custom_materials = list(/datum/material/plasma = COIN_MATERIAL_AMOUNT) /obj/item/coin/uranium - custom_materials = list(/datum/material/uranium = HALF_SHEET_MATERIAL_AMOUNT*0.4) + custom_materials = list(/datum/material/uranium = COIN_MATERIAL_AMOUNT) /obj/item/coin/titanium - custom_materials = list(/datum/material/titanium = HALF_SHEET_MATERIAL_AMOUNT*0.4) + custom_materials = list(/datum/material/titanium = COIN_MATERIAL_AMOUNT) /obj/item/coin/bananium - custom_materials = list(/datum/material/bananium = HALF_SHEET_MATERIAL_AMOUNT*0.4) + custom_materials = list(/datum/material/bananium = COIN_MATERIAL_AMOUNT) /obj/item/coin/adamantine - custom_materials = list(/datum/material/adamantine = HALF_SHEET_MATERIAL_AMOUNT*0.4) + custom_materials = list(/datum/material/adamantine = COIN_MATERIAL_AMOUNT) /obj/item/coin/mythril - custom_materials = list(/datum/material/mythril = HALF_SHEET_MATERIAL_AMOUNT*0.4) + custom_materials = list(/datum/material/mythril = COIN_MATERIAL_AMOUNT) /obj/item/coin/plastic - custom_materials = list(/datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT*0.4) + custom_materials = list(/datum/material/plastic = COIN_MATERIAL_AMOUNT) /obj/item/coin/runite - custom_materials = list(/datum/material/runite = HALF_SHEET_MATERIAL_AMOUNT*0.4) + custom_materials = list(/datum/material/runite = COIN_MATERIAL_AMOUNT) /obj/item/coin/twoheaded desc = "Hey, this coin's the same on both sides!" @@ -521,7 +523,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ name = "antag token" desc = "A novelty coin that helps the heart know what hard evidence cannot prove." icon_state = "coin_valid" - custom_materials = list(/datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT*0.4) + custom_materials = list(/datum/material/plastic = COIN_MATERIAL_AMOUNT) sideslist = list("valid", "salad") heads_name = "valid" material_flags = NONE @@ -530,7 +532,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ /obj/item/coin/iron /obj/item/coin/gold/debug - custom_materials = list(/datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT*0.4) + custom_materials = list(/datum/material/gold = COIN_MATERIAL_AMOUNT) desc = "If you got this somehow, be aware that it will dust you. Almost certainly." /obj/item/coin/gold/debug/attack_self(mob/user) diff --git a/code/modules/mining/shelters.dm b/code/modules/mining/shelters.dm index 29d6a099490e0..c3fdc820bef04 100644 --- a/code/modules/mining/shelters.dm +++ b/code/modules/mining/shelters.dm @@ -85,3 +85,16 @@ . = ..() whitelisted_turfs = typecacheof(/turf/closed/mineral) banned_objects = typecacheof(/obj/structure/stone_tile) + +/datum/map_template/shelter/toilet + name = "Emergency Relief Shelter" + shelter_id = "shelter_toilet" + description = "A stripped-down emergency shelter focused on providing \ + only the most essential amenities to unfortunate employees who find \ + themselves in need far from home." + mappath = "_maps/templates/shelter_t.dmm" + +/datum/map_template/shelter/toilet/New() + . = ..() + whitelisted_turfs = typecacheof(/turf/closed/mineral) + banned_objects = typecacheof(/obj/structure/stone_tile) diff --git a/code/modules/mining/voucher_sets.dm b/code/modules/mining/voucher_sets.dm index 86c6e407d67bd..071a8f1153670 100644 --- a/code/modules/mining/voucher_sets.dm +++ b/code/modules/mining/voucher_sets.dm @@ -62,7 +62,7 @@ icon = 'icons/mob/silicon/aibots.dmi' icon_state = "mining_drone" set_items = list( - /mob/living/simple_animal/hostile/mining_drone, + /mob/living/basic/mining_drone, /obj/item/weldingtool/hugetank, /obj/item/clothing/head/utility/welding, /obj/item/borg/upgrade/modkit/minebot_passthrough, diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 19b7c68f8334d..8d7db7f8e850c 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -46,11 +46,13 @@ INITIALIZE_IMMEDIATE(/mob/dead) . += "Players Ready: [SSticker.totalPlayersReady]" . += "Admins Ready: [SSticker.total_admins_ready] / [length(GLOB.admins)]" +#define SERVER_HOPPER_TRAIT "server_hopper" + /mob/dead/proc/server_hop() set category = "OOC" set name = "Server Hop" set desc= "Jump to the other server" - if(notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) // in case the round is ending and a cinematic is already playing we don't wanna clash with that (yes i know) return var/list/our_id = CONFIG_GET(string/cross_comms_name) var/list/csa = CONFIG_GET(keyed_list/cross_server) - our_id @@ -74,11 +76,11 @@ INITIALIZE_IMMEDIATE(/mob/dead) var/client/C = client to_chat(C, span_notice("Sending you to [pick].")) - new /atom/movable/screen/splash(null, C) + new /atom/movable/screen/splash(null, null, C) - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, SERVER_HOPPER_TRAIT) sleep(2.9 SECONDS) //let the animation play - notransform = FALSE + REMOVE_TRAIT(src, TRAIT_NO_TRANSFORM, SERVER_HOPPER_TRAIT) if(!C) return @@ -87,6 +89,8 @@ INITIALIZE_IMMEDIATE(/mob/dead) C << link("[addr]") +#undef SERVER_HOPPER_TRAIT + /mob/dead/proc/update_z(new_z) // 1+ to register, null to unregister if (registered_z != new_z) if (registered_z) diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 664a95c0cbea2..99897971d1866 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -1,3 +1,5 @@ +///Cooldown for the Reset Lobby Menu HUD verb +#define RESET_HUD_INTERVAL 15 SECONDS /mob/dead/new_player flags_1 = NONE invisibility = INVISIBILITY_ABSTRACT @@ -15,7 +17,8 @@ var/ineligible_for_roles = FALSE /// Used to track if the player's jobs menu sent a message saying it successfully mounted. var/jobs_menu_mounted = FALSE - + ///Cooldown for the Reset Lobby Menu HUD verb + COOLDOWN_DECLARE(reset_hud_cooldown) /mob/dead/new_player/Initialize(mapload) if(client && SSticker.state == GAME_STATE_STARTUP) @@ -30,6 +33,7 @@ . = ..() GLOB.new_player_list += src + add_verb(src, /mob/dead/new_player/proc/reset_menu_hud) /mob/dead/new_player/Destroy() GLOB.new_player_list -= src @@ -117,6 +121,8 @@ return "[jobtitle] is already filled to capacity." if(JOB_UNAVAILABLE_ANTAG_INCOMPAT) return "[jobtitle] is not compatible with some antagonist role assigned to you." + if(JOB_UNAVAILABLE_AGE) + return "Your character is not old enough for [jobtitle]." return GENERIC_JOB_UNAVAILABLE_ERROR @@ -143,6 +149,12 @@ return JOB_AVAILABLE /mob/dead/new_player/proc/AttemptLateSpawn(rank) + // Check that they're picking someone new for new character respawning + if(CONFIG_GET(flag/allow_respawn) == RESPAWN_FLAG_NEW_CHARACTER) + if("[client.prefs.default_slot]" in client.player_details.joined_as_slots) + tgui_alert(usr, "You already have played this character in this round!") + return FALSE + var/error = IsJobUnavailable(rank) if(error != JOB_AVAILABLE) tgui_alert(usr, get_job_unavailable_error_message(error, rank)) @@ -182,14 +194,16 @@ #define IS_ACTING_CAPTAIN 1 #define IS_FULL_CAPTAIN 2 var/is_captain = IS_NOT_CAPTAIN + var/captain_sound = 'sound/misc/notice2.ogg' // 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 + captain_sound = 'sound/misc/announce.ogg' // 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)) + minor_announce(job.get_captaincy_announcement(character), sound_override = captain_sound) SSjob.promote_to_captain(character, is_captain == IS_ACTING_CAPTAIN) #undef IS_NOT_CAPTAIN #undef IS_ACTING_CAPTAIN @@ -229,10 +243,11 @@ if((job.job_flags & JOB_ASSIGN_QUIRKS) && humanc && CONFIG_GET(flag/roundstart_traits)) SSquirks.AssignQuirks(humanc, humanc.client) + var/area/station/arrivals = GLOB.areas_by_type[/area/station/hallway/secondary/entry] + if(humanc && arrivals && !arrivals.power_environ) //arrivals depowered + humanc.put_in_hands(new /obj/item/crowbar/large/emergency(get_turf(humanc))) //if hands full then just drops on the floor log_manifest(character.mind.key,character.mind,character,latejoin = TRUE) - SEND_GLOBAL_SIGNAL(COMSIG_GLOB_CREWMEMBER_JOINED, character, rank) - /mob/dead/new_player/proc/AddEmploymentContract(mob/living/carbon/human/employee) //TODO: figure out a way to exclude wizards/nukeops/demons from this. for(var/C in GLOB.employmentCabinets) @@ -249,9 +264,13 @@ 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.original_character_slot_index = client.prefs.default_slot - 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.original_character_slot_index = client.prefs.default_slot + preserved_mind.transfer_to(spawning_mob) //won't transfer key since the mind is not active + preserved_mind.set_original_character(spawning_mob) + + LAZYADD(client.player_details.joined_as_slots, "[client.prefs.default_slot]") client.init_verbs() . = spawning_mob new_character = . @@ -335,3 +354,21 @@ // 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) + +///Resets the Lobby Menu HUD, recreating and reassigning it to the new player +/mob/dead/new_player/proc/reset_menu_hud() + set name = "Reset Lobby Menu HUD" + set category = "OOC" + var/mob/dead/new_player/new_player = usr + if(!COOLDOWN_FINISHED(new_player, reset_hud_cooldown)) + to_chat(new_player, span_warning("You must wait [DisplayTimeText(COOLDOWN_TIMELEFT(new_player, reset_hud_cooldown))] before resetting the Lobby Menu HUD again!")) + return + if(!new_player?.client) + return + COOLDOWN_START(new_player, reset_hud_cooldown, RESET_HUD_INTERVAL) + qdel(new_player.hud_used) + create_mob_hud() + to_chat(new_player, span_info("Lobby Menu HUD reset. You may reset the HUD again in [DisplayTimeText(RESET_HUD_INTERVAL)].")) + hud_used.show_hud(hud_used.hud_version) + +#undef RESET_HUD_INTERVAL diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index 665ebff06847a..0b09e64c16ef4 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -25,6 +25,7 @@ /datum/preferences/proc/hardcore_random_setup(mob/living/carbon/human/character) var/next_hardcore_score = select_hardcore_quirks() character.hardcore_survival_score = next_hardcore_score ** 1.2 //30 points would be about 60 score + log_admin("[character] started hardcore random with [english_list(all_quirks)], for a score of [next_hardcore_score].") //Add a sixpack because honestly var/obj/item/bodypart/chest/chest = character.get_bodypart(BODY_ZONE_CHEST) @@ -55,7 +56,7 @@ var/datum/quirk/picked_quirk = pick(available_hardcore_quirks) var/picked_quirk_blacklisted = FALSE - for(var/bl in SSquirks.quirk_blacklist) //Check if the quirk is blacklisted with our current quirks. quirk_blacklist is a list of lists. + for(var/bl in GLOB.quirk_blacklist) //Check if the quirk is blacklisted with our current quirks. quirk_blacklist is a list of lists. var/list/blacklist = bl if(!(picked_quirk in blacklist)) continue diff --git a/code/modules/mob/dead/new_player/sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories.dm deleted file mode 100644 index 66ba5f1e71826..0000000000000 --- a/code/modules/mob/dead/new_player/sprite_accessories.dm +++ /dev/null @@ -1,2366 +0,0 @@ -/* - - Hello and welcome to sprite_accessories: For sprite accessories, such as hair, - facial hair, and possibly tattoos and stuff somewhere along the line. This file is - intended to be friendly for people with little to no actual coding experience. - The process of adding in new hairstyles has been made pain-free and easy to do. - Enjoy! - Doohl - - - Notice: This all gets automatically compiled in a list in dna.dm, so you do not - have to define any UI values for sprite accessories manually for hair and facial - hair. Just add in new hair types and the game will naturally adapt. - - !!WARNING!!: changing existing hair information can be VERY hazardous to savefiles, - to the point where you may completely corrupt a server's savefiles. Please refrain - from doing this unless you absolutely know what you are doing, and have defined a - conversion in savefile.dm -*/ -/proc/init_sprite_accessory_subtypes(prototype, list/L, list/male, list/female, add_blank)//Roundstart argument builds a specific list for roundstart parts where some parts may be locked - if(!istype(L)) - L = list() - if(!istype(male)) - male = list() - if(!istype(female)) - female = list() - - for(var/path in subtypesof(prototype)) - var/datum/sprite_accessory/D = new path() - - if(D.icon_state) - L[D.name] = D - else - L += D.name - - switch(D.gender) - if(MALE) - male += D.name - if(FEMALE) - female += D.name - else - male += D.name - female += D.name - if(add_blank) - L["None"] = new /datum/sprite_accessory/blank - - return L - -/datum/sprite_accessory - /// The icon file the accessory is located in. - var/icon - /// The icon_state of the accessory. - var/icon_state - /// The preview name of the accessory. - var/name - /// Determines if the accessory will be skipped or included in random hair generations. - var/gender = NEUTER - /// Something that can be worn by either gender, but looks different on each. - var/gender_specific - /// Determines if the accessory will be skipped by color preferences. - var/use_static - /** - * Currently only used by mutantparts so don't worry about hair and stuff. - * This is the source that this accessory will get its color from. Default is MUTCOLOR, but can also be HAIR, FACEHAIR, EYECOLOR and 0 if none. - */ - var/color_src = MUTCOLORS - /// Decides if this sprite has an "inner" part, such as the fleshy parts on ears. - var/hasinner = FALSE - /// Is this part locked from roundstart selection? Used for parts that apply effects. - var/locked = FALSE - /// Should we center the sprite? - var/center = FALSE - /// The width of the sprite in pixels. Used to center it if necessary. - var/dimension_x = 32 - /// The height of the sprite in pixels. Used to center it if necessary. - var/dimension_y = 32 - /// Should this sprite block emissives? - var/em_block = FALSE - -/datum/sprite_accessory/blank - name = "None" - icon_state = "None" - -////////////////////// -// Hair Definitions // -////////////////////// -/datum/sprite_accessory/hair - icon = 'icons/mob/species/human/human_face.dmi' // default icon for all hairs - - // please make sure they're sorted alphabetically and, where needed, categorized - // try to capitalize the names please~ - // try to spell - // you do not need to define _s or _l sub-states, game automatically does this for you - -/datum/sprite_accessory/hair/afro - name = "Afro" - icon_state = "hair_afro" - -/datum/sprite_accessory/hair/afro2 - name = "Afro 2" - icon_state = "hair_afro2" - -/datum/sprite_accessory/hair/afro_large - name = "Afro (Large)" - icon_state = "hair_bigafro" - -/datum/sprite_accessory/hair/allthefuzz - name = "All The Fuzz" - icon_state = "hair_allthefuzz" - -/datum/sprite_accessory/hair/antenna - name = "Ahoge" - icon_state = "hair_antenna" - -/datum/sprite_accessory/hair/bald - name = "Bald" - icon_state = null - -/datum/sprite_accessory/hair/balding - name = "Balding Hair" - icon_state = "hair_e" - -/datum/sprite_accessory/hair/bedhead - name = "Bedhead" - icon_state = "hair_bedhead" - -/datum/sprite_accessory/hair/bedhead2 - name = "Bedhead 2" - icon_state = "hair_bedheadv2" - -/datum/sprite_accessory/hair/bedhead3 - name = "Bedhead 3" - icon_state = "hair_bedheadv3" - -/datum/sprite_accessory/hair/bedheadv4 - name = "Bedhead 4x" - icon_state = "hair_bedheadv4" - -/datum/sprite_accessory/hair/bedheadlong - name = "Long Bedhead" - icon_state = "hair_long_bedhead" - -/datum/sprite_accessory/hair/bedheadfloorlength - name = "Floorlength Bedhead" - icon_state = "hair_floorlength_bedhead" - -/datum/sprite_accessory/hair/badlycut - name = "Shorter Long Bedhead" - icon_state = "hair_verybadlycut" - -/datum/sprite_accessory/hair/beehive - name = "Beehive" - icon_state = "hair_beehive" - -/datum/sprite_accessory/hair/beehive2 - name = "Beehive 2" - icon_state = "hair_beehivev2" - -/datum/sprite_accessory/hair/bob - name = "Bob Hair" - icon_state = "hair_bob" - -/datum/sprite_accessory/hair/bob2 - name = "Bob Hair 2" - icon_state = "hair_bob2" - -/datum/sprite_accessory/hair/bob3 - name = "Bob Hair 3" - icon_state = "hair_bobcut" - -/datum/sprite_accessory/hair/bob4 - name = "Bob Hair 4" - icon_state = "hair_bob4" - -/datum/sprite_accessory/hair/bobcurl - name = "Bobcurl" - icon_state = "hair_bobcurl" - -/datum/sprite_accessory/hair/boddicker - name = "Boddicker" - icon_state = "hair_boddicker" - -/datum/sprite_accessory/hair/bowlcut - name = "Bowlcut" - icon_state = "hair_bowlcut" - -/datum/sprite_accessory/hair/bowlcut2 - name = "Bowlcut 2" - icon_state = "hair_bowlcut2" - -/datum/sprite_accessory/hair/braid - name = "Braid (Floorlength)" - icon_state = "hair_braid" - -/datum/sprite_accessory/hair/braided - name = "Braided" - icon_state = "hair_braided" - -/datum/sprite_accessory/hair/front_braid - name = "Braided Front" - icon_state = "hair_braidfront" - -/datum/sprite_accessory/hair/not_floorlength_braid - name = "Braid (High)" - icon_state = "hair_braid2" - -/datum/sprite_accessory/hair/lowbraid - name = "Braid (Low)" - icon_state = "hair_hbraid" - -/datum/sprite_accessory/hair/shortbraid - name = "Braid (Short)" - icon_state = "hair_shortbraid" - -/datum/sprite_accessory/hair/braidtail - name = "Braided Tail" - icon_state = "hair_braidtail" - -/datum/sprite_accessory/hair/bun - name = "Bun Head" - icon_state = "hair_bun" - -/datum/sprite_accessory/hair/bun2 - name = "Bun Head 2" - icon_state = "hair_bunhead2" - -/datum/sprite_accessory/hair/bun3 - name = "Bun Head 3" - icon_state = "hair_bun3" - -/datum/sprite_accessory/hair/largebun - name = "Bun (Large)" - icon_state = "hair_largebun" - -/datum/sprite_accessory/hair/manbun - name = "Bun (Manbun)" - icon_state = "hair_manbun" - -/datum/sprite_accessory/hair/tightbun - name = "Bun (Tight)" - icon_state = "hair_tightbun" - -/datum/sprite_accessory/hair/business - name = "Business Hair" - icon_state = "hair_business" - -/datum/sprite_accessory/hair/business2 - name = "Business Hair 2" - icon_state = "hair_business2" - -/datum/sprite_accessory/hair/business3 - name = "Business Hair 3" - icon_state = "hair_business3" - -/datum/sprite_accessory/hair/business4 - name = "Business Hair 4" - icon_state = "hair_business4" - -/datum/sprite_accessory/hair/buzz - name = "Buzzcut" - icon_state = "hair_buzzcut" - -/datum/sprite_accessory/hair/chinbob - name = "Chin-Length Bob Cut" - icon_state = "hair_chinbob" - -/datum/sprite_accessory/hair/comet - name = "Comet" - icon_state = "hair_comet" - -/datum/sprite_accessory/hair/cia - name = "CIA" - icon_state = "hair_cia" - -/datum/sprite_accessory/hair/coffeehouse - name = "Coffee House" - icon_state = "hair_coffeehouse" - -/datum/sprite_accessory/hair/combover - name = "Combover" - icon_state = "hair_combover" - -/datum/sprite_accessory/hair/cornrows1 - name = "Cornrows" - icon_state = "hair_cornrows" - -/datum/sprite_accessory/hair/cornrows2 - name = "Cornrows 2" - icon_state = "hair_cornrows2" - -/datum/sprite_accessory/hair/cornrowbun - name = "Cornrow Bun" - icon_state = "hair_cornrowbun" - -/datum/sprite_accessory/hair/cornrowbraid - name = "Cornrow Braid" - icon_state = "hair_cornrowbraid" - -/datum/sprite_accessory/hair/cornrowdualtail - name = "Cornrow Tail" - icon_state = "hair_cornrowtail" - -/datum/sprite_accessory/hair/crew - name = "Crewcut" - icon_state = "hair_crewcut" - -/datum/sprite_accessory/hair/curls - name = "Curls" - icon_state = "hair_curls" - -/datum/sprite_accessory/hair/cut - name = "Cut Hair" - icon_state = "hair_c" - -/datum/sprite_accessory/hair/dandpompadour - name = "Dandy Pompadour" - icon_state = "hair_dandypompadour" - -/datum/sprite_accessory/hair/devillock - name = "Devil Lock" - icon_state = "hair_devilock" - -/datum/sprite_accessory/hair/doublebun - name = "Double Bun" - icon_state = "hair_doublebun" - -/datum/sprite_accessory/hair/dreadlocks - name = "Dreadlocks" - icon_state = "hair_dreads" - -/datum/sprite_accessory/hair/drillhair - name = "Drillruru" - icon_state = "hair_drillruru" - -/datum/sprite_accessory/hair/drillhairextended - name = "Drill Hair (Extended)" - icon_state = "hair_drillhairextended" - -/datum/sprite_accessory/hair/emo - name = "Emo" - icon_state = "hair_emo" - -/datum/sprite_accessory/hair/emofrine - name = "Emo Fringe" - icon_state = "hair_emofringe" - -/datum/sprite_accessory/hair/nofade - name = "Fade (None)" - icon_state = "hair_nofade" - -/datum/sprite_accessory/hair/highfade - name = "Fade (High)" - icon_state = "hair_highfade" - -/datum/sprite_accessory/hair/medfade - name = "Fade (Medium)" - icon_state = "hair_medfade" - -/datum/sprite_accessory/hair/lowfade - name = "Fade (Low)" - icon_state = "hair_lowfade" - -/datum/sprite_accessory/hair/baldfade - name = "Fade (Bald)" - icon_state = "hair_baldfade" - -/datum/sprite_accessory/hair/feather - name = "Feather" - icon_state = "hair_feather" - -/datum/sprite_accessory/hair/father - name = "Father" - icon_state = "hair_father" - -/datum/sprite_accessory/hair/sargeant - name = "Flat Top" - icon_state = "hair_sargeant" - -/datum/sprite_accessory/hair/flair - name = "Flair" - icon_state = "hair_flair" - -/datum/sprite_accessory/hair/bigflattop - name = "Flat Top (Big)" - icon_state = "hair_bigflattop" - -/datum/sprite_accessory/hair/flow_hair - name = "Flow Hair" - icon_state = "hair_f" - -/datum/sprite_accessory/hair/gelled - name = "Gelled Back" - icon_state = "hair_gelled" - -/datum/sprite_accessory/hair/gentle - name = "Gentle" - icon_state = "hair_gentle" - -/datum/sprite_accessory/hair/halfbang - name = "Half-banged Hair" - icon_state = "hair_halfbang" - -/datum/sprite_accessory/hair/halfbang2 - name = "Half-banged Hair 2" - icon_state = "hair_halfbang2" - -/datum/sprite_accessory/hair/halfshaved - name = "Half-shaved" - icon_state = "hair_halfshaved" - -/datum/sprite_accessory/hair/hedgehog - name = "Hedgehog Hair" - icon_state = "hair_hedgehog" - -/datum/sprite_accessory/hair/himecut - name = "Hime Cut" - icon_state = "hair_himecut" - -/datum/sprite_accessory/hair/himecut2 - name = "Hime Cut 2" - icon_state = "hair_himecut2" - -/datum/sprite_accessory/hair/shorthime - name = "Hime Cut (Short)" - icon_state = "hair_shorthime" - -/datum/sprite_accessory/hair/himeup - name = "Hime Updo" - icon_state = "hair_himeup" - -/datum/sprite_accessory/hair/hitop - name = "Hitop" - icon_state = "hair_hitop" - -/datum/sprite_accessory/hair/jade - name = "Jade" - icon_state = "hair_jade" - -/datum/sprite_accessory/hair/jensen - name = "Jensen Hair" - icon_state = "hair_jensen" - -/datum/sprite_accessory/hair/joestar - name = "Joestar" - icon_state = "hair_joestar" - -/datum/sprite_accessory/hair/keanu - name = "Keanu Hair" - icon_state = "hair_keanu" - -/datum/sprite_accessory/hair/kusangi - name = "Kusanagi Hair" - icon_state = "hair_kusanagi" - -/datum/sprite_accessory/hair/long - name = "Long Hair 1" - icon_state = "hair_long" - -/datum/sprite_accessory/hair/long2 - name = "Long Hair 2" - icon_state = "hair_long2" - -/datum/sprite_accessory/hair/long3 - name = "Long Hair 3" - icon_state = "hair_long3" - -/datum/sprite_accessory/hair/long_over_eye - name = "Long Over Eye" - icon_state = "hair_longovereye" - -/datum/sprite_accessory/hair/longbangs - name = "Long Bangs" - icon_state = "hair_lbangs" - -/datum/sprite_accessory/hair/longemo - name = "Long Emo" - icon_state = "hair_longemo" - -/datum/sprite_accessory/hair/longfringe - name = "Long Fringe" - icon_state = "hair_longfringe" - -/datum/sprite_accessory/hair/sidepartlongalt - name = "Long Side Part" - icon_state = "hair_longsidepart" - -/datum/sprite_accessory/hair/megaeyebrows - name = "Mega Eyebrows" - icon_state = "hair_megaeyebrows" - -/datum/sprite_accessory/hair/messy - name = "Messy" - icon_state = "hair_messy" - -/datum/sprite_accessory/hair/modern - name = "Modern" - icon_state = "hair_modern" - -/datum/sprite_accessory/hair/mohawk - name = "Mohawk" - icon_state = "hair_d" - -/datum/sprite_accessory/hair/nitori - name = "Nitori" - icon_state = "hair_nitori" - -/datum/sprite_accessory/hair/reversemohawk - name = "Mohawk (Reverse)" - icon_state = "hair_reversemohawk" - -/datum/sprite_accessory/hair/shavedmohawk - name = "Mohawk (Shaved)" - icon_state = "hair_shavedmohawk" - -/datum/sprite_accessory/hair/unshavenmohawk - name = "Mohawk (Unshaven)" - icon_state = "hair_unshaven_mohawk" - -/datum/sprite_accessory/hair/mulder - name = "Mulder" - icon_state = "hair_mulder" - -/datum/sprite_accessory/hair/odango - name = "Odango" - icon_state = "hair_odango" - -/datum/sprite_accessory/hair/ombre - name = "Ombre" - icon_state = "hair_ombre" - -/datum/sprite_accessory/hair/oneshoulder - name = "One Shoulder" - icon_state = "hair_oneshoulder" - -/datum/sprite_accessory/hair/over_eye - name = "Over Eye" - icon_state = "hair_shortovereye" - -/datum/sprite_accessory/hair/hair_overeyetwo - name = "Over Eye 2" - icon_state = "hair_overeyetwo" - -/datum/sprite_accessory/hair/oxton - name = "Oxton" - icon_state = "hair_oxton" - -/datum/sprite_accessory/hair/parted - name = "Parted" - icon_state = "hair_parted" - -/datum/sprite_accessory/hair/partedside - name = "Parted (Side)" - icon_state = "hair_part" - -/datum/sprite_accessory/hair/kagami - name = "Pigtails" - icon_state = "hair_kagami" - -/datum/sprite_accessory/hair/pigtail - name = "Pigtails 2" - icon_state = "hair_pigtails" - -/datum/sprite_accessory/hair/pigtail2 - name = "Pigtails 3" - icon_state = "hair_pigtails2" - -/datum/sprite_accessory/hair/pixie - name = "Pixie Cut" - icon_state = "hair_pixie" - -/datum/sprite_accessory/hair/pompadour - name = "Pompadour" - icon_state = "hair_pompadour" - -/datum/sprite_accessory/hair/bigpompadour - name = "Pompadour (Big)" - icon_state = "hair_bigpompadour" - -/datum/sprite_accessory/hair/ponytail1 - name = "Ponytail" - icon_state = "hair_ponytail" - -/datum/sprite_accessory/hair/ponytail2 - name = "Ponytail 2" - icon_state = "hair_ponytail2" - -/datum/sprite_accessory/hair/ponytail3 - name = "Ponytail 3" - icon_state = "hair_ponytail3" - -/datum/sprite_accessory/hair/ponytail4 - name = "Ponytail 4" - icon_state = "hair_ponytail4" - -/datum/sprite_accessory/hair/ponytail5 - name = "Ponytail 5" - icon_state = "hair_ponytail5" - -/datum/sprite_accessory/hair/ponytail6 - name = "Ponytail 6" - icon_state = "hair_ponytail6" - -/datum/sprite_accessory/hair/ponytail7 - name = "Ponytail 7" - icon_state = "hair_ponytail7" - -/datum/sprite_accessory/hair/highponytail - name = "Ponytail (High)" - icon_state = "hair_highponytail" - -/datum/sprite_accessory/hair/stail - name = "Ponytail (Short)" - icon_state = "hair_stail" - -/datum/sprite_accessory/hair/longponytail - name = "Ponytail (Long)" - icon_state = "hair_longstraightponytail" - -/datum/sprite_accessory/hair/countryponytail - name = "Ponytail (Country)" - icon_state = "hair_country" - -/datum/sprite_accessory/hair/fringetail - name = "Ponytail (Fringe)" - icon_state = "hair_fringetail" - -/datum/sprite_accessory/hair/sidetail - name = "Ponytail (Side)" - icon_state = "hair_sidetail" - -/datum/sprite_accessory/hair/sidetail2 - name = "Ponytail (Side) 2" - icon_state = "hair_sidetail2" - -/datum/sprite_accessory/hair/sidetail3 - name = "Ponytail (Side) 3" - icon_state = "hair_sidetail3" - -/datum/sprite_accessory/hair/sidetail4 - name = "Ponytail (Side) 4" - icon_state = "hair_sidetail4" - -/datum/sprite_accessory/hair/spikyponytail - name = "Ponytail (Spiky)" - icon_state = "hair_spikyponytail" - -/datum/sprite_accessory/hair/poofy - name = "Poofy" - icon_state = "hair_poofy" - -/datum/sprite_accessory/hair/quiff - name = "Quiff" - icon_state = "hair_quiff" - -/datum/sprite_accessory/hair/ronin - name = "Ronin" - icon_state = "hair_ronin" - -/datum/sprite_accessory/hair/shaved - name = "Shaved" - icon_state = "hair_shaved" - -/datum/sprite_accessory/hair/shavedpart - name = "Shaved Part" - icon_state = "hair_shavedpart" - -/datum/sprite_accessory/hair/shortbangs - name = "Short Bangs" - icon_state = "hair_shortbangs" - -/datum/sprite_accessory/hair/short - name = "Short Hair" - icon_state = "hair_a" - -/datum/sprite_accessory/hair/shorthair2 - name = "Short Hair 2" - icon_state = "hair_shorthair2" - -/datum/sprite_accessory/hair/shorthair3 - name = "Short Hair 3" - icon_state = "hair_shorthair3" - -/datum/sprite_accessory/hair/shorthair4 - name = "Short Hair 4" - icon_state = "hair_d" - -/datum/sprite_accessory/hair/shorthair5 - name = "Short Hair 5" - icon_state = "hair_e" - -/datum/sprite_accessory/hair/shorthair6 - name = "Short Hair 6" - icon_state = "hair_f" - -/datum/sprite_accessory/hair/shorthair7 - name = "Short Hair 7" - icon_state = "hair_shorthairg" - -/datum/sprite_accessory/hair/shorthaireighties - name = "Short Hair 80s" - icon_state = "hair_80s" - -/datum/sprite_accessory/hair/rosa - name = "Short Hair Rosa" - icon_state = "hair_rosa" - -/datum/sprite_accessory/hair/shoulderlength - name = "Shoulder-length Hair" - icon_state = "hair_b" - -/datum/sprite_accessory/hair/sidecut - name = "Sidecut" - icon_state = "hair_sidecut" - -/datum/sprite_accessory/hair/skinhead - name = "Skinhead" - icon_state = "hair_skinhead" - -/datum/sprite_accessory/hair/protagonist - name = "Slightly Long Hair" - icon_state = "hair_protagonist" - -/datum/sprite_accessory/hair/spiky - name = "Spiky" - icon_state = "hair_spikey" - -/datum/sprite_accessory/hair/spiky2 - name = "Spiky 2" - icon_state = "hair_spiky" - -/datum/sprite_accessory/hair/spiky3 - name = "Spiky 3" - icon_state = "hair_spiky2" - -/datum/sprite_accessory/hair/swept - name = "Swept Back Hair" - icon_state = "hair_swept" - -/datum/sprite_accessory/hair/swept2 - name = "Swept Back Hair 2" - icon_state = "hair_swept2" - -/datum/sprite_accessory/hair/thinning - name = "Thinning" - icon_state = "hair_thinning" - -/datum/sprite_accessory/hair/thinningfront - name = "Thinning (Front)" - icon_state = "hair_thinningfront" - -/datum/sprite_accessory/hair/thinningrear - name = "Thinning (Rear)" - icon_state = "hair_thinningrear" - -/datum/sprite_accessory/hair/topknot - name = "Topknot" - icon_state = "hair_topknot" - -/datum/sprite_accessory/hair/tressshoulder - name = "Tress Shoulder" - icon_state = "hair_tressshoulder" - -/datum/sprite_accessory/hair/trimmed - name = "Trimmed" - icon_state = "hair_trimmed" - -/datum/sprite_accessory/hair/trimflat - name = "Trim Flat" - icon_state = "hair_trimflat" - -/datum/sprite_accessory/hair/twintails - name = "Twintails" - icon_state = "hair_twintail" - -/datum/sprite_accessory/hair/undercut - name = "Undercut" - icon_state = "hair_undercut" - -/datum/sprite_accessory/hair/undercutleft - name = "Undercut Left" - icon_state = "hair_undercutleft" - -/datum/sprite_accessory/hair/undercutright - name = "Undercut Right" - icon_state = "hair_undercutright" - -/datum/sprite_accessory/hair/unkept - name = "Unkept" - icon_state = "hair_unkept" - -/datum/sprite_accessory/hair/updo - name = "Updo" - icon_state = "hair_updo" - -/datum/sprite_accessory/hair/longer - name = "Very Long Hair" - icon_state = "hair_vlong" - -/datum/sprite_accessory/hair/longest - name = "Very Long Hair 2" - icon_state = "hair_longest" - -/datum/sprite_accessory/hair/longest2 - name = "Very Long Over Eye" - icon_state = "hair_longest2" - -/datum/sprite_accessory/hair/veryshortovereye - name = "Very Short Over Eye" - icon_state = "hair_veryshortovereyealternate" - -/datum/sprite_accessory/hair/longestalt - name = "Very Long with Fringe" - icon_state = "hair_vlongfringe" - -/datum/sprite_accessory/hair/volaju - name = "Volaju" - icon_state = "hair_volaju" - -/datum/sprite_accessory/hair/wisp - name = "Wisp" - icon_state = "hair_wisp" - -/datum/sprite_accessory/hair/ziegler - name = "Ziegler" - icon_state = "hair_ziegler" - -/* -///////////////////////////////////// -/ =---------------------------= / -/ == Gradient Hair Definitions == / -/ =---------------------------= / -///////////////////////////////////// -*/ - -/datum/sprite_accessory/gradient - icon = 'icons/mob/species/hair_gradients.dmi' - ///whether this gradient applies to hair and/or beards. Some gradients do not work well on beards. - var/gradient_category = GRADIENT_APPLIES_TO_HAIR|GRADIENT_APPLIES_TO_FACIAL_HAIR - -/datum/sprite_accessory/gradient/none - name = "None" - icon_state = "none" - -/datum/sprite_accessory/gradient/fadeup - name = "Fade Up" - icon_state = "fadeup" - -/datum/sprite_accessory/gradient/fadedown - name = "Fade Down" - icon_state = "fadedown" - -/datum/sprite_accessory/gradient/vertical_split - name = "Vertical Split" - icon_state = "vsplit" - -/datum/sprite_accessory/gradient/horizontal_split - name = "Horizontal Split" - icon_state = "bottomflat" - -/datum/sprite_accessory/gradient/reflected - name = "Reflected" - icon_state = "reflected_high" - gradient_category = GRADIENT_APPLIES_TO_HAIR - -/datum/sprite_accessory/gradient/reflected/beard - icon_state = "reflected_high_beard" - gradient_category = GRADIENT_APPLIES_TO_FACIAL_HAIR - -/datum/sprite_accessory/gradient/reflected_inverse - name = "Reflected Inverse" - icon_state = "reflected_inverse_high" - gradient_category = GRADIENT_APPLIES_TO_HAIR - -/datum/sprite_accessory/gradient/reflected_inverse/beard - icon_state = "reflected_inverse_high_beard" - gradient_category = GRADIENT_APPLIES_TO_FACIAL_HAIR - -/datum/sprite_accessory/gradient/wavy - name = "Wavy" - icon_state = "wavy" - gradient_category = GRADIENT_APPLIES_TO_HAIR - -/datum/sprite_accessory/gradient/long_fade_up - name = "Long Fade Up" - icon_state = "long_fade_up" - -/datum/sprite_accessory/gradient/long_fade_down - name = "Long Fade Down" - icon_state = "long_fade_down" - -/datum/sprite_accessory/gradient/short_fade_up - name = "Short Fade Up" - icon_state = "short_fade_up" - gradient_category = GRADIENT_APPLIES_TO_HAIR - -/datum/sprite_accessory/gradient/short_fade_up/beard - icon_state = "short_fade_down" - gradient_category = GRADIENT_APPLIES_TO_FACIAL_HAIR - -/datum/sprite_accessory/gradient/short_fade_down - name = "Short Fade Down" - icon_state = "short_fade_down_beard" - gradient_category = GRADIENT_APPLIES_TO_HAIR - -/datum/sprite_accessory/gradient/short_fade_down/beard - icon_state = "short_fade_down_beard" - gradient_category = GRADIENT_APPLIES_TO_FACIAL_HAIR - -/datum/sprite_accessory/gradient/wavy_spike - name = "Spiked Wavy" - icon_state = "wavy_spiked" - gradient_category = GRADIENT_APPLIES_TO_HAIR - -/datum/sprite_accessory/gradient/striped - name = "striped" - icon_state = "striped" - -/datum/sprite_accessory/gradient/striped_vertical - name = "Striped Vertical" - icon_state = "striped_vertical" - -///////////////////////////// -// Facial Hair Definitions // -///////////////////////////// - -/datum/sprite_accessory/facial_hair - icon = 'icons/mob/species/human/human_face.dmi' - gender = MALE // barf (unless you're a dorf, dorfs dig chix w/ beards :P) - em_block = TRUE - -// please make sure they're sorted alphabetically and categorized - -/datum/sprite_accessory/facial_hair/abe - name = "Beard (Abraham Lincoln)" - icon_state = "facial_abe" - -/datum/sprite_accessory/facial_hair/brokenman - name = "Beard (Broken Man)" - icon_state = "facial_brokenman" - -/datum/sprite_accessory/facial_hair/chinstrap - name = "Beard (Chinstrap)" - icon_state = "facial_chin" - -/datum/sprite_accessory/facial_hair/dwarf - name = "Beard (Dwarf)" - icon_state = "facial_dwarf" - -/datum/sprite_accessory/facial_hair/fullbeard - name = "Beard (Full)" - icon_state = "facial_fullbeard" - -/datum/sprite_accessory/facial_hair/croppedfullbeard - name = "Beard (Cropped Fullbeard)" - icon_state = "facial_croppedfullbeard" - -/datum/sprite_accessory/facial_hair/gt - name = "Beard (Goatee)" - icon_state = "facial_gt" - -/datum/sprite_accessory/facial_hair/hip - name = "Beard (Hipster)" - icon_state = "facial_hip" - -/datum/sprite_accessory/facial_hair/jensen - name = "Beard (Jensen)" - icon_state = "facial_jensen" - -/datum/sprite_accessory/facial_hair/neckbeard - name = "Beard (Neckbeard)" - icon_state = "facial_neckbeard" - -/datum/sprite_accessory/facial_hair/vlongbeard - name = "Beard (Very Long)" - icon_state = "facial_wise" - -/datum/sprite_accessory/facial_hair/muttonmus - name = "Beard (Muttonmus)" - icon_state = "facial_muttonmus" - -/datum/sprite_accessory/facial_hair/martialartist - name = "Beard (Martial Artist)" - icon_state = "facial_martialartist" - -/datum/sprite_accessory/facial_hair/chinlessbeard - name = "Beard (Chinless Beard)" - icon_state = "facial_chinlessbeard" - -/datum/sprite_accessory/facial_hair/moonshiner - name = "Beard (Moonshiner)" - icon_state = "facial_moonshiner" - -/datum/sprite_accessory/facial_hair/longbeard - name = "Beard (Long)" - icon_state = "facial_longbeard" - -/datum/sprite_accessory/facial_hair/volaju - name = "Beard (Volaju)" - icon_state = "facial_volaju" - -/datum/sprite_accessory/facial_hair/threeoclock - name = "Beard (Three o Clock Shadow)" - icon_state = "facial_3oclock" - -/datum/sprite_accessory/facial_hair/fiveoclock - name = "Beard (Five o Clock Shadow)" - icon_state = "facial_fiveoclock" - -/datum/sprite_accessory/facial_hair/fiveoclockm - name = "Beard (Five o Clock Moustache)" - icon_state = "facial_5oclockmoustache" - -/datum/sprite_accessory/facial_hair/sevenoclock - name = "Beard (Seven o Clock Shadow)" - icon_state = "facial_7oclock" - -/datum/sprite_accessory/facial_hair/sevenoclockm - name = "Beard (Seven o Clock Moustache)" - icon_state = "facial_7oclockmoustache" - -/datum/sprite_accessory/facial_hair/moustache - name = "Moustache" - icon_state = "facial_moustache" - -/datum/sprite_accessory/facial_hair/pencilstache - name = "Moustache (Pencilstache)" - icon_state = "facial_pencilstache" - -/datum/sprite_accessory/facial_hair/smallstache - name = "Moustache (Smallstache)" - icon_state = "facial_smallstache" - -/datum/sprite_accessory/facial_hair/walrus - name = "Moustache (Walrus)" - icon_state = "facial_walrus" - -/datum/sprite_accessory/facial_hair/fu - name = "Moustache (Fu Manchu)" - icon_state = "facial_fumanchu" - -/datum/sprite_accessory/facial_hair/hogan - name = "Moustache (Hulk Hogan)" - icon_state = "facial_hogan" //-Neek - -/datum/sprite_accessory/facial_hair/selleck - name = "Moustache (Selleck)" - icon_state = "facial_selleck" - -/datum/sprite_accessory/facial_hair/chaplin - name = "Moustache (Square)" - icon_state = "facial_chaplin" - -/datum/sprite_accessory/facial_hair/vandyke - name = "Moustache (Van Dyke)" - icon_state = "facial_vandyke" - -/datum/sprite_accessory/facial_hair/watson - name = "Moustache (Watson)" - icon_state = "facial_watson" - -/datum/sprite_accessory/facial_hair/handlebar - name = "Moustache (Handlebar)" - icon_state = "facial_handlebar" - -/datum/sprite_accessory/facial_hair/handlebar2 - name = "Moustache (Handlebar 2)" - icon_state = "facial_handlebar2" - -/datum/sprite_accessory/facial_hair/elvis - name = "Sideburns (Elvis)" - icon_state = "facial_elvis" - -/datum/sprite_accessory/facial_hair/mutton - name = "Sideburns (Mutton Chops)" - icon_state = "facial_mutton" - -/datum/sprite_accessory/facial_hair/sideburn - name = "Sideburns" - icon_state = "facial_sideburn" - -/datum/sprite_accessory/facial_hair/shaved - name = "Shaved" - icon_state = null - gender = NEUTER - -/////////////////////////// -// Underwear Definitions // -/////////////////////////// - -/datum/sprite_accessory/underwear - icon = 'icons/mob/clothing/underwear.dmi' - use_static = FALSE - em_block = TRUE - - -//MALE UNDERWEAR -/datum/sprite_accessory/underwear/nude - name = "Nude" - icon_state = null - gender = NEUTER - -/datum/sprite_accessory/underwear/male_briefs - name = "Briefs" - icon_state = "male_briefs" - gender = MALE - -/datum/sprite_accessory/underwear/male_boxers - name = "Boxers" - icon_state = "male_boxers" - gender = MALE - -/datum/sprite_accessory/underwear/male_stripe - name = "Striped Boxers" - icon_state = "male_stripe" - gender = MALE - -/datum/sprite_accessory/underwear/male_midway - name = "Midway Boxers" - icon_state = "male_midway" - gender = MALE - -/datum/sprite_accessory/underwear/male_longjohns - name = "Long Johns" - icon_state = "male_longjohns" - gender = MALE - -/datum/sprite_accessory/underwear/male_kinky - name = "Jockstrap" - icon_state = "male_kinky" - gender = MALE - -/datum/sprite_accessory/underwear/male_mankini - name = "Mankini" - icon_state = "male_mankini" - gender = MALE - -/datum/sprite_accessory/underwear/male_hearts - name = "Hearts Boxers" - icon_state = "male_hearts" - gender = MALE - use_static = TRUE - -/datum/sprite_accessory/underwear/male_commie - name = "Commie Boxers" - icon_state = "male_commie" - gender = MALE - use_static = TRUE - -/datum/sprite_accessory/underwear/male_usastripe - name = "Freedom Boxers" - icon_state = "male_assblastusa" - gender = MALE - use_static = TRUE - -/datum/sprite_accessory/underwear/male_uk - name = "UK Boxers" - icon_state = "male_uk" - gender = MALE - use_static = TRUE - - -//FEMALE UNDERWEAR -/datum/sprite_accessory/underwear/female_bikini - name = "Bikini" - icon_state = "female_bikini" - gender = FEMALE - -/datum/sprite_accessory/underwear/female_lace - name = "Lace Bikini" - icon_state = "female_lace" - gender = FEMALE - -/datum/sprite_accessory/underwear/female_bralette - name = "Bralette w/ Boyshorts" - icon_state = "female_bralette" - gender = FEMALE - -/datum/sprite_accessory/underwear/female_sport - name = "Sports Bra w/ Boyshorts" - icon_state = "female_sport" - gender = FEMALE - -/datum/sprite_accessory/underwear/female_thong - name = "Thong" - icon_state = "female_thong" - gender = FEMALE - -/datum/sprite_accessory/underwear/female_strapless - name = "Strapless Bikini" - icon_state = "female_strapless" - gender = FEMALE - -/datum/sprite_accessory/underwear/female_babydoll - name = "Babydoll" - icon_state = "female_babydoll" - gender = FEMALE - -/datum/sprite_accessory/underwear/swimsuit_onepiece - name = "One-Piece Swimsuit" - icon_state = "swim_onepiece" - gender = FEMALE - -/datum/sprite_accessory/underwear/swimsuit_strapless_onepiece - name = "Strapless One-Piece Swimsuit" - icon_state = "swim_strapless_onepiece" - gender = FEMALE - -/datum/sprite_accessory/underwear/swimsuit_twopiece - name = "Two-Piece Swimsuit" - icon_state = "swim_twopiece" - gender = FEMALE - -/datum/sprite_accessory/underwear/swimsuit_strapless_twopiece - name = "Strapless Two-Piece Swimsuit" - icon_state = "swim_strapless_twopiece" - gender = FEMALE - -/datum/sprite_accessory/underwear/swimsuit_stripe - name = "Strapless Striped Swimsuit" - icon_state = "swim_stripe" - gender = FEMALE - -/datum/sprite_accessory/underwear/swimsuit_halter - name = "Halter Swimsuit" - icon_state = "swim_halter" - gender = FEMALE - -/datum/sprite_accessory/underwear/female_white_neko - name = "Neko Bikini (White)" - icon_state = "female_neko_white" - gender = FEMALE - use_static = TRUE - -/datum/sprite_accessory/underwear/female_black_neko - name = "Neko Bikini (Black)" - icon_state = "female_neko_black" - gender = FEMALE - use_static = TRUE - -/datum/sprite_accessory/underwear/female_commie - name = "Commie Bikini" - icon_state = "female_commie" - gender = FEMALE - use_static = TRUE - -/datum/sprite_accessory/underwear/female_usastripe - name = "Freedom Bikini" - icon_state = "female_assblastusa" - gender = FEMALE - use_static = TRUE - -/datum/sprite_accessory/underwear/female_uk - name = "UK Bikini" - icon_state = "female_uk" - gender = FEMALE - use_static = TRUE - -/datum/sprite_accessory/underwear/female_kinky - name = "Lingerie" - icon_state = "female_kinky" - gender = FEMALE - use_static = TRUE - -//////////////////////////// -// Undershirt Definitions // -//////////////////////////// - -/datum/sprite_accessory/undershirt - icon = 'icons/mob/clothing/underwear.dmi' - em_block = TRUE - -/datum/sprite_accessory/undershirt/nude - name = "Nude" - icon_state = null - gender = NEUTER - -// please make sure they're sorted alphabetically and categorized - -/datum/sprite_accessory/undershirt/bluejersey - name = "Jersey (Blue)" - icon_state = "shirt_bluejersey" - gender = NEUTER - -/datum/sprite_accessory/undershirt/redjersey - name = "Jersey (Red)" - icon_state = "shirt_redjersey" - gender = NEUTER - -/datum/sprite_accessory/undershirt/bluepolo - name = "Polo Shirt (Blue)" - icon_state = "bluepolo" - gender = NEUTER - -/datum/sprite_accessory/undershirt/grayyellowpolo - name = "Polo Shirt (Gray-Yellow)" - icon_state = "grayyellowpolo" - gender = NEUTER - -/datum/sprite_accessory/undershirt/redpolo - name = "Polo Shirt (Red)" - icon_state = "redpolo" - gender = NEUTER - -/datum/sprite_accessory/undershirt/whitepolo - name = "Polo Shirt (White)" - icon_state = "whitepolo" - gender = NEUTER - -/datum/sprite_accessory/undershirt/alienshirt - name = "Shirt (Alien)" - icon_state = "shirt_alien" - gender = NEUTER - -/datum/sprite_accessory/undershirt/mondmondjaja - name = "Shirt (Band)" - icon_state = "band" - gender = NEUTER - -/datum/sprite_accessory/undershirt/shirt_black - name = "Shirt (Black)" - icon_state = "shirt_black" - gender = NEUTER - -/datum/sprite_accessory/undershirt/blueshirt - name = "Shirt (Blue)" - icon_state = "shirt_blue" - gender = NEUTER - -/datum/sprite_accessory/undershirt/clownshirt - name = "Shirt (Clown)" - icon_state = "shirt_clown" - gender = NEUTER - -/datum/sprite_accessory/undershirt/commie - name = "Shirt (Commie)" - icon_state = "shirt_commie" - gender = NEUTER - -/datum/sprite_accessory/undershirt/greenshirt - name = "Shirt (Green)" - icon_state = "shirt_green" - gender = NEUTER - -/datum/sprite_accessory/undershirt/shirt_grey - name = "Shirt (Grey)" - icon_state = "shirt_grey" - gender = NEUTER - -/datum/sprite_accessory/undershirt/ian - name = "Shirt (Ian)" - icon_state = "ian" - gender = NEUTER - -/datum/sprite_accessory/undershirt/ilovent - name = "Shirt (I Love NT)" - icon_state = "ilovent" - gender = NEUTER - -/datum/sprite_accessory/undershirt/lover - name = "Shirt (Lover)" - icon_state = "lover" - gender = NEUTER - -/datum/sprite_accessory/undershirt/matroska - name = "Shirt (Matroska)" - icon_state = "matroska" - gender = NEUTER - -/datum/sprite_accessory/undershirt/meat - name = "Shirt (Meat)" - icon_state = "shirt_meat" - gender = NEUTER - -/datum/sprite_accessory/undershirt/nano - name = "Shirt (Nanotrasen)" - icon_state = "shirt_nano" - gender = NEUTER - -/datum/sprite_accessory/undershirt/peace - name = "Shirt (Peace)" - icon_state = "peace" - gender = NEUTER - -/datum/sprite_accessory/undershirt/pacman - name = "Shirt (Pogoman)" - icon_state = "pogoman" - gender = NEUTER - -/datum/sprite_accessory/undershirt/question - name = "Shirt (Question)" - icon_state = "shirt_question" - gender = NEUTER - -/datum/sprite_accessory/undershirt/redshirt - name = "Shirt (Red)" - icon_state = "shirt_red" - gender = NEUTER - -/datum/sprite_accessory/undershirt/skull - name = "Shirt (Skull)" - icon_state = "shirt_skull" - gender = NEUTER - -/datum/sprite_accessory/undershirt/ss13 - name = "Shirt (SS13)" - icon_state = "shirt_ss13" - gender = NEUTER - -/datum/sprite_accessory/undershirt/stripe - name = "Shirt (Striped)" - icon_state = "shirt_stripes" - gender = NEUTER - -/datum/sprite_accessory/undershirt/tiedye - name = "Shirt (Tie-dye)" - icon_state = "shirt_tiedye" - gender = NEUTER - -/datum/sprite_accessory/undershirt/uk - name = "Shirt (UK)" - icon_state = "uk" - gender = NEUTER - -/datum/sprite_accessory/undershirt/usa - name = "Shirt (USA)" - icon_state = "shirt_assblastusa" - gender = NEUTER - -/datum/sprite_accessory/undershirt/shirt_white - name = "Shirt (White)" - icon_state = "shirt_white" - gender = NEUTER - -/datum/sprite_accessory/undershirt/blackshortsleeve - name = "Short-sleeved Shirt (Black)" - icon_state = "blackshortsleeve" - gender = NEUTER - -/datum/sprite_accessory/undershirt/blueshortsleeve - name = "Short-sleeved Shirt (Blue)" - icon_state = "blueshortsleeve" - gender = NEUTER - -/datum/sprite_accessory/undershirt/greenshortsleeve - name = "Short-sleeved Shirt (Green)" - icon_state = "greenshortsleeve" - gender = NEUTER - -/datum/sprite_accessory/undershirt/purpleshortsleeve - name = "Short-sleeved Shirt (Purple)" - icon_state = "purpleshortsleeve" - gender = NEUTER - -/datum/sprite_accessory/undershirt/whiteshortsleeve - name = "Short-sleeved Shirt (White)" - icon_state = "whiteshortsleeve" - gender = NEUTER - -/datum/sprite_accessory/undershirt/sports_bra - name = "Sports Bra" - icon_state = "sports_bra" - gender = NEUTER - -/datum/sprite_accessory/undershirt/sports_bra2 - name = "Sports Bra (Alt)" - icon_state = "sports_bra_alt" - gender = NEUTER - -/datum/sprite_accessory/undershirt/blueshirtsport - name = "Sports Shirt (Blue)" - icon_state = "blueshirtsport" - gender = NEUTER - -/datum/sprite_accessory/undershirt/greenshirtsport - name = "Sports Shirt (Green)" - icon_state = "greenshirtsport" - gender = NEUTER - -/datum/sprite_accessory/undershirt/redshirtsport - name = "Sports Shirt (Red)" - icon_state = "redshirtsport" - gender = NEUTER - -/datum/sprite_accessory/undershirt/tank_black - name = "Tank Top (Black)" - icon_state = "tank_black" - gender = NEUTER - -/datum/sprite_accessory/undershirt/tankfire - name = "Tank Top (Fire)" - icon_state = "tank_fire" - gender = NEUTER - -/datum/sprite_accessory/undershirt/tank_grey - name = "Tank Top (Grey)" - icon_state = "tank_grey" - gender = NEUTER - -/datum/sprite_accessory/undershirt/female_midriff - name = "Tank Top (Midriff)" - icon_state = "tank_midriff" - gender = FEMALE - -/datum/sprite_accessory/undershirt/tank_red - name = "Tank Top (Red)" - icon_state = "tank_red" - gender = NEUTER - -/datum/sprite_accessory/undershirt/tankstripe - name = "Tank Top (Striped)" - icon_state = "tank_stripes" - gender = NEUTER - -/datum/sprite_accessory/undershirt/tank_white - name = "Tank Top (White)" - icon_state = "tank_white" - gender = NEUTER - -/datum/sprite_accessory/undershirt/redtop - name = "Top (Red)" - icon_state = "redtop" - gender = FEMALE - -/datum/sprite_accessory/undershirt/whitetop - name = "Top (White)" - icon_state = "whitetop" - gender = FEMALE - -/datum/sprite_accessory/undershirt/tshirt_blue - name = "T-Shirt (Blue)" - icon_state = "blueshirt" - gender = NEUTER - -/datum/sprite_accessory/undershirt/tshirt_green - name = "T-Shirt (Green)" - icon_state = "greenshirt" - gender = NEUTER - -/datum/sprite_accessory/undershirt/tshirt_red - name = "T-Shirt (Red)" - icon_state = "redshirt" - gender = NEUTER - -/datum/sprite_accessory/undershirt/yellowshirt - name = "T-Shirt (Yellow)" - icon_state = "yellowshirt" - gender = NEUTER - -/////////////////////// -// Socks Definitions // -/////////////////////// - -/datum/sprite_accessory/socks - icon = 'icons/mob/clothing/underwear.dmi' - em_block = TRUE - -/datum/sprite_accessory/socks/nude - name = "Nude" - icon_state = null - -// please make sure they're sorted alphabetically and categorized - -/datum/sprite_accessory/socks/ace_knee - name = "Knee-high (Ace)" - icon_state = "ace_knee" - -/datum/sprite_accessory/socks/bee_knee - name = "Knee-high (Bee)" - icon_state = "bee_knee" - -/datum/sprite_accessory/socks/black_knee - name = "Knee-high (Black)" - icon_state = "black_knee" - -/datum/sprite_accessory/socks/commie_knee - name = "Knee-High (Commie)" - icon_state = "commie_knee" - -/datum/sprite_accessory/socks/usa_knee - name = "Knee-High (Freedom)" - icon_state = "assblastusa_knee" - -/datum/sprite_accessory/socks/rainbow_knee - name = "Knee-high (Rainbow)" - icon_state = "rainbow_knee" - -/datum/sprite_accessory/socks/striped_knee - name = "Knee-high (Striped)" - icon_state = "striped_knee" - -/datum/sprite_accessory/socks/thin_knee - name = "Knee-high (Thin)" - icon_state = "thin_knee" - -/datum/sprite_accessory/socks/trans_knee - name = "Knee-high (Trans)" - icon_state = "trans_knee" - -/datum/sprite_accessory/socks/uk_knee - name = "Knee-High (UK)" - icon_state = "uk_knee" - -/datum/sprite_accessory/socks/white_knee - name = "Knee-high (White)" - icon_state = "white_knee" - -/datum/sprite_accessory/socks/fishnet_knee - name = "Knee-high (Fishnet)" - icon_state = "fishnet_knee" - -/datum/sprite_accessory/socks/black_norm - name = "Normal (Black)" - icon_state = "black_norm" - -/datum/sprite_accessory/socks/white_norm - name = "Normal (White)" - icon_state = "white_norm" - -/datum/sprite_accessory/socks/pantyhose - name = "Pantyhose" - icon_state = "pantyhose" - -/datum/sprite_accessory/socks/black_short - name = "Short (Black)" - icon_state = "black_short" - -/datum/sprite_accessory/socks/white_short - name = "Short (White)" - icon_state = "white_short" - -/datum/sprite_accessory/socks/stockings_blue - name = "Stockings (Blue)" - icon_state = "stockings_blue" - -/datum/sprite_accessory/socks/stockings_cyan - name = "Stockings (Cyan)" - icon_state = "stockings_cyan" - -/datum/sprite_accessory/socks/stockings_dpink - name = "Stockings (Dark Pink)" - icon_state = "stockings_dpink" - -/datum/sprite_accessory/socks/stockings_green - name = "Stockings (Green)" - icon_state = "stockings_green" - -/datum/sprite_accessory/socks/stockings_orange - name = "Stockings (Orange)" - icon_state = "stockings_orange" - -/datum/sprite_accessory/socks/stockings_programmer - name = "Stockings (Programmer)" - icon_state = "stockings_lpink" - -/datum/sprite_accessory/socks/stockings_purple - name = "Stockings (Purple)" - icon_state = "stockings_purple" - -/datum/sprite_accessory/socks/stockings_yellow - name = "Stockings (Yellow)" - icon_state = "stockings_yellow" - -/datum/sprite_accessory/socks/stockings_fishnet - name = "Stockings (Fishnet)" - icon_state = "fishnet_full" - -/datum/sprite_accessory/socks/ace_thigh - name = "Thigh-high (Ace)" - icon_state = "ace_thigh" - -/datum/sprite_accessory/socks/bee_thigh - name = "Thigh-high (Bee)" - icon_state = "bee_thigh" - -/datum/sprite_accessory/socks/black_thigh - name = "Thigh-high (Black)" - icon_state = "black_thigh" - -/datum/sprite_accessory/socks/commie_thigh - name = "Thigh-high (Commie)" - icon_state = "commie_thigh" - -/datum/sprite_accessory/socks/usa_thigh - name = "Thigh-high (Freedom)" - icon_state = "assblastusa_thigh" - -/datum/sprite_accessory/socks/rainbow_thigh - name = "Thigh-high (Rainbow)" - icon_state = "rainbow_thigh" - -/datum/sprite_accessory/socks/striped_thigh - name = "Thigh-high (Striped)" - icon_state = "striped_thigh" - -/datum/sprite_accessory/socks/thin_thigh - name = "Thigh-high (Thin)" - icon_state = "thin_thigh" - -/datum/sprite_accessory/socks/trans_thigh - name = "Thigh-high (Trans)" - icon_state = "trans_thigh" - -/datum/sprite_accessory/socks/uk_thigh - name = "Thigh-high (UK)" - icon_state = "uk_thigh" - -/datum/sprite_accessory/socks/white_thigh - name = "Thigh-high (White)" - icon_state = "white_thigh" - -/datum/sprite_accessory/socks/fishnet_thigh - name = "Thigh-high (Fishnet)" - icon_state = "fishnet_thigh" - -/datum/sprite_accessory/socks/thocks - name = "Thocks" - icon_state = "thocks" - -//////////.////////////////// -// MutantParts Definitions // -///////////////////////////// - -/datum/sprite_accessory/body_markings - icon = 'icons/mob/species/lizard/lizard_misc.dmi' - -/datum/sprite_accessory/body_markings/none - name = "None" - icon_state = "none" - -/datum/sprite_accessory/body_markings/dtiger - name = "Dark Tiger Body" - icon_state = "dtiger" - gender_specific = 1 - -/datum/sprite_accessory/body_markings/ltiger - name = "Light Tiger Body" - icon_state = "ltiger" - gender_specific = 1 - -/datum/sprite_accessory/body_markings/lbelly - name = "Light Belly" - icon_state = "lbelly" - gender_specific = 1 - -/datum/sprite_accessory/tails - em_block = TRUE - -/datum/sprite_accessory/tails/lizard - icon = 'icons/mob/species/lizard/lizard_tails.dmi' - -/datum/sprite_accessory/tails/lizard/smooth - name = "Smooth" - icon_state = "smooth" - -/datum/sprite_accessory/tails/lizard/dtiger - name = "Dark Tiger" - icon_state = "dtiger" - -/datum/sprite_accessory/tails/lizard/ltiger - name = "Light Tiger" - icon_state = "ltiger" - -/datum/sprite_accessory/tails/lizard/spikes - name = "Spikes" - icon_state = "spikes" - -/datum/sprite_accessory/tails/human/cat - name = "Cat" - icon = 'icons/mob/species/human/cat_features.dmi' - icon_state = "default" - color_src = HAIR - -/datum/sprite_accessory/tails/monkey - name = "Monkey" - icon = 'icons/mob/species/monkey/monkey_tail.dmi' - icon_state = "monkey" - color_src = FALSE - -/datum/sprite_accessory/pod_hair - icon = 'icons/mob/species/podperson_hair.dmi' - em_block = TRUE - -/datum/sprite_accessory/pod_hair/ivy - name = "Ivy" - icon_state = "ivy" - -/datum/sprite_accessory/pod_hair/cabbage - name = "Cabbage" - icon_state = "cabbage" - -/datum/sprite_accessory/pod_hair/spinach - name = "Spinach" - icon_state = "spinach" - -/datum/sprite_accessory/pod_hair/prayer - name = "Prayer" - icon_state = "prayer" - -/datum/sprite_accessory/pod_hair/vine - name = "Vine" - icon_state = "vine" - -/datum/sprite_accessory/pod_hair/shrub - name = "Shrub" - icon_state = "shrub" - -/datum/sprite_accessory/pod_hair/rose - name = "Rose" - icon_state = "rose" - -/datum/sprite_accessory/pod_hair/orchid - name = "Orchid" - icon_state = "orchid" - -/datum/sprite_accessory/pod_hair/fig - name = "Fig" - icon_state = "fig" - -/datum/sprite_accessory/pod_hair/hibiscus - name = "Hibiscus" - icon_state = "hibiscus" - -/datum/sprite_accessory/snouts - icon = 'icons/mob/species/lizard/lizard_misc.dmi' - em_block = TRUE - -/datum/sprite_accessory/snouts/sharp - name = "Sharp" - icon_state = "sharp" - -/datum/sprite_accessory/snouts/round - name = "Round" - icon_state = "round" - -/datum/sprite_accessory/snouts/sharplight - name = "Sharp + Light" - icon_state = "sharplight" - -/datum/sprite_accessory/snouts/roundlight - name = "Round + Light" - icon_state = "roundlight" - -/datum/sprite_accessory/horns - icon = 'icons/mob/species/lizard/lizard_misc.dmi' - em_block = TRUE - -/datum/sprite_accessory/horns/none - name = "None" - icon_state = "none" - -/datum/sprite_accessory/horns/simple - name = "Simple" - icon_state = "simple" - -/datum/sprite_accessory/horns/short - name = "Short" - icon_state = "short" - -/datum/sprite_accessory/horns/curled - name = "Curled" - icon_state = "curled" - -/datum/sprite_accessory/horns/ram - name = "Ram" - icon_state = "ram" - -/datum/sprite_accessory/horns/angler - name = "Angeler" - icon_state = "angler" - -/datum/sprite_accessory/ears - icon = 'icons/mob/species/human/cat_features.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 = TRUE - color_src = HAIR - -/datum/sprite_accessory/ears/fox - icon = 'icons/mob/species/human/fox_features.dmi' - name = "Fox" - icon_state = "fox" - hasinner = TRUE - color_src = HAIR - locked = TRUE - -/datum/sprite_accessory/wings/none - name = "None" - icon_state = "none" - -/datum/sprite_accessory/wings - icon = 'icons/mob/species/wings.dmi' - em_block = TRUE - -/datum/sprite_accessory/wings_open - icon = 'icons/mob/species/wings.dmi' - em_block = TRUE - -/datum/sprite_accessory/wings/angel - name = "Angel" - icon_state = "angel" - color_src = FALSE - dimension_x = 46 - center = TRUE - dimension_y = 34 - locked = TRUE - -/datum/sprite_accessory/wings_open/angel - name = "Angel" - icon_state = "angel" - color_src = FALSE - dimension_x = 46 - center = TRUE - dimension_y = 34 - -/datum/sprite_accessory/wings/dragon - name = "Dragon" - icon_state = "dragon" - dimension_x = 96 - center = TRUE - dimension_y = 32 - locked = TRUE - -/datum/sprite_accessory/wings_open/dragon - name = "Dragon" - icon_state = "dragon" - dimension_x = 96 - center = TRUE - dimension_y = 32 - -/datum/sprite_accessory/wings/megamoth - name = "Megamoth" - icon_state = "megamoth" - color_src = FALSE - dimension_x = 96 - center = TRUE - dimension_y = 32 - locked = TRUE - -/datum/sprite_accessory/wings_open/megamoth - name = "Megamoth" - icon_state = "megamoth" - color_src = FALSE - dimension_x = 96 - center = TRUE - dimension_y = 32 - -/datum/sprite_accessory/wings/mothra - name = "Mothra" - icon_state = "mothra" - color_src = FALSE - dimension_x = 96 - center = TRUE - dimension_y = 32 - locked = TRUE - -/datum/sprite_accessory/wings_open/mothra - name = "Mothra" - icon_state = "mothra" - color_src = FALSE - dimension_x = 96 - center = TRUE - dimension_y = 32 - -/datum/sprite_accessory/wings/skeleton - name = "Skeleton" - icon_state = "skele" - color_src = FALSE - dimension_x = 96 - center = TRUE - dimension_y = 32 - locked = TRUE - -/datum/sprite_accessory/wings_open/skeleton - name = "Skeleton" - icon_state = "skele" - color_src = FALSE - dimension_x = 96 - center = TRUE - dimension_y = 32 - -/datum/sprite_accessory/wings/robotic - name = "Robotic" - icon_state = "robotic" - color_src = FALSE - dimension_x = 96 - center = TRUE - dimension_y = 32 - locked = TRUE - -/datum/sprite_accessory/wings_open/robotic - name = "Robotic" - icon_state = "robotic" - color_src = FALSE - dimension_x = 96 - center = TRUE - dimension_y = 32 - -/datum/sprite_accessory/wings/fly - name = "Fly" - icon_state = "fly" - color_src = FALSE - dimension_x = 96 - center = TRUE - dimension_y = 32 - locked = TRUE - -/datum/sprite_accessory/wings_open/fly - name = "Fly" - icon_state = "fly" - color_src = FALSE - dimension_x = 96 - center = TRUE - dimension_y = 32 - -/datum/sprite_accessory/frills - icon = 'icons/mob/species/lizard/lizard_misc.dmi' - -/datum/sprite_accessory/frills/none - name = "None" - icon_state = "none" - -/datum/sprite_accessory/frills/simple - name = "Simple" - icon_state = "simple" - -/datum/sprite_accessory/frills/short - name = "Short" - icon_state = "short" - -/datum/sprite_accessory/frills/aquatic - name = "Aquatic" - icon_state = "aqua" - -/datum/sprite_accessory/spines - icon = 'icons/mob/species/lizard/lizard_spines.dmi' - em_block = TRUE - -/datum/sprite_accessory/spines_animated - icon = 'icons/mob/species/lizard/lizard_spines.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" - -/datum/sprite_accessory/legs //legs are a special case, they aren't actually sprite_accessories but are updated with them. - icon = null //These datums exist for selecting legs on preference, and little else - em_block = TRUE - -/datum/sprite_accessory/legs/none - name = "Normal Legs" - -/datum/sprite_accessory/legs/digitigrade_lizard - name = DIGITIGRADE_LEGS - -/datum/sprite_accessory/caps - icon = 'icons/mob/species/mush_cap.dmi' - color_src = HAIR - em_block = TRUE - -/datum/sprite_accessory/caps/round - name = "Round" - icon_state = "round" - -/datum/sprite_accessory/moth_wings - icon = 'icons/mob/species/moth/moth_wings.dmi' - color_src = null - em_block = TRUE - -/datum/sprite_accessory/moth_wings/plain - name = "Plain" - icon_state = "plain" - -/datum/sprite_accessory/moth_wings/monarch - name = "Monarch" - icon_state = "monarch" - -/datum/sprite_accessory/moth_wings/luna - name = "Luna" - icon_state = "luna" - -/datum/sprite_accessory/moth_wings/atlas - name = "Atlas" - icon_state = "atlas" - -/datum/sprite_accessory/moth_wings/reddish - name = "Reddish" - icon_state = "redish" - -/datum/sprite_accessory/moth_wings/royal - name = "Royal" - icon_state = "royal" - -/datum/sprite_accessory/moth_wings/gothic - name = "Gothic" - icon_state = "gothic" - -/datum/sprite_accessory/moth_wings/lovers - name = "Lovers" - icon_state = "lovers" - -/datum/sprite_accessory/moth_wings/whitefly - name = "White Fly" - icon_state = "whitefly" - -/datum/sprite_accessory/moth_wings/burnt_off - name = "Burnt Off" - icon_state = "burnt_off" - locked = TRUE - -/datum/sprite_accessory/moth_wings/firewatch - name = "Firewatch" - icon_state = "firewatch" - -/datum/sprite_accessory/moth_wings/deathhead - name = "Deathshead" - icon_state = "deathhead" - -/datum/sprite_accessory/moth_wings/poison - name = "Poison" - icon_state = "poison" - -/datum/sprite_accessory/moth_wings/ragged - name = "Ragged" - icon_state = "ragged" - -/datum/sprite_accessory/moth_wings/moonfly - name = "Moon Fly" - icon_state = "moonfly" - -/datum/sprite_accessory/moth_wings/snow - name = "Snow" - icon_state = "snow" - -/datum/sprite_accessory/moth_wings/oakworm - name = "Oak Worm" - icon_state = "oakworm" - -/datum/sprite_accessory/moth_wings/jungle - name = "Jungle" - icon_state = "jungle" - -/datum/sprite_accessory/moth_wings/witchwing - name = "Witch Wing" - icon_state = "witchwing" - -/datum/sprite_accessory/moth_wings/rosy - name = "Rosy" - icon_state = "rosy" - -/datum/sprite_accessory/moth_wings/feathery - name = "Feathery" - icon_state = "feathery" - -/datum/sprite_accessory/moth_wings/brown - name = "Brown" - icon_state = "brown" - -/datum/sprite_accessory/moth_wings/plasmafire - name = "Plasmafire" - icon_state = "plasmafire" - -/datum/sprite_accessory/moth_wings/moffra - name = "Moffra" - icon_state = "moffra" - -/datum/sprite_accessory/moth_antennae //Finally splitting the sprite - icon = 'icons/mob/species/moth/moth_antennae.dmi' - color_src = null - -/datum/sprite_accessory/moth_antennae/plain - name = "Plain" - icon_state = "plain" - -/datum/sprite_accessory/moth_antennae/reddish - name = "Reddish" - icon_state = "reddish" - -/datum/sprite_accessory/moth_antennae/royal - name = "Royal" - icon_state = "royal" - -/datum/sprite_accessory/moth_antennae/gothic - name = "Gothic" - icon_state = "gothic" - -/datum/sprite_accessory/moth_antennae/whitefly - name = "White Fly" - icon_state = "whitefly" - -/datum/sprite_accessory/moth_antennae/lovers - name = "Lovers" - icon_state = "lovers" - -/datum/sprite_accessory/moth_antennae/burnt_off - name = "Burnt Off" - icon_state = "burnt_off" - -/datum/sprite_accessory/moth_antennae/firewatch - name = "Firewatch" - icon_state = "firewatch" - -/datum/sprite_accessory/moth_antennae/deathhead - name = "Deathshead" - icon_state = "deathhead" - -/datum/sprite_accessory/moth_antennae/poison - name = "Poison" - icon_state = "poison" - -/datum/sprite_accessory/moth_antennae/ragged - name = "Ragged" - icon_state = "ragged" - -/datum/sprite_accessory/moth_antennae/moonfly - name = "Moon Fly" - icon_state = "moonfly" - -/datum/sprite_accessory/moth_antennae/oakworm - name = "Oak Worm" - icon_state = "oakworm" - -/datum/sprite_accessory/moth_antennae/jungle - name = "Jungle" - icon_state = "jungle" - -/datum/sprite_accessory/moth_antennae/witchwing - name = "Witch Wing" - icon_state = "witchwing" - -/datum/sprite_accessory/moth_antennae/regal - name = "Regal" - icon_state = "regal" -/datum/sprite_accessory/moth_antennae/rosy - name = "Rosy" - icon_state = "rosy" - -/datum/sprite_accessory/moth_antennae/feathery - name = "Feathery" - icon_state = "feathery" - -/datum/sprite_accessory/moth_antennae/brown - name = "Brown" - icon_state = "brown" - -/datum/sprite_accessory/moth_antennae/plasmafire - name = "Plasmafire" - icon_state = "plasmafire" - -/datum/sprite_accessory/moth_antennae/moffra - name = "Moffra" - icon_state = "moffra" - -/datum/sprite_accessory/moth_markings // the markings that moths can have. finally something other than the boring tan - icon = 'icons/mob/species/moth/moth_markings.dmi' - color_src = null - -/datum/sprite_accessory/moth_markings/none - name = "None" - icon_state = "none" - -/datum/sprite_accessory/moth_markings/reddish - name = "Reddish" - icon_state = "reddish" - -/datum/sprite_accessory/moth_markings/royal - name = "Royal" - icon_state = "royal" - -/datum/sprite_accessory/moth_markings/gothic - name = "Gothic" - icon_state = "gothic" - -/datum/sprite_accessory/moth_markings/whitefly - name = "White Fly" - icon_state = "whitefly" - -/datum/sprite_accessory/moth_markings/lovers - name = "Lovers" - icon_state = "lovers" - -/datum/sprite_accessory/moth_markings/burnt_off - name = "Burnt Off" - icon_state = "burnt_off" - -/datum/sprite_accessory/moth_markings/firewatch - name = "Firewatch" - icon_state = "firewatch" - -/datum/sprite_accessory/moth_markings/deathhead - name = "Deathshead" - icon_state = "deathhead" - -/datum/sprite_accessory/moth_markings/poison - name = "Poison" - icon_state = "poison" - -/datum/sprite_accessory/moth_markings/ragged - name = "Ragged" - icon_state = "ragged" - -/datum/sprite_accessory/moth_markings/moonfly - name = "Moon Fly" - icon_state = "moonfly" - -/datum/sprite_accessory/moth_markings/oakworm - name = "Oak Worm" - icon_state = "oakworm" - -/datum/sprite_accessory/moth_markings/jungle - name = "Jungle" - icon_state = "jungle" - -/datum/sprite_accessory/moth_markings/witchwing - name = "Witch Wing" - icon_state = "witchwing" diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index d1e001b54af76..7b827b73d8ed2 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -106,10 +106,11 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) if(ishuman(body)) var/mob/living/carbon/human/body_human = body - if(HAIR in body_human.dna.species.species_traits) + var/datum/species/human_species = body_human.dna.species + if(human_species.check_head_flags(HEAD_HAIR)) hairstyle = body_human.hairstyle hair_color = brighten_color(body_human.hair_color) - if(FACEHAIR in body_human.dna.species.species_traits) + if(human_species.check_head_flags(HEAD_FACIAL_HAIR)) facial_hairstyle = body_human.facial_hairstyle facial_hair_color = brighten_color(body_human.facial_hair_color) @@ -487,9 +488,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if (!istype(target) || (is_secret_level(target.z) && !client?.holder)) return - var/icon/I = icon(target.icon,target.icon_state,target.dir) - - var/orbitsize = (I.Width()+I.Height())*0.5 + var/list/icon_dimensions = get_icon_dimensions(target.icon) + var/orbitsize = (icon_dimensions["width"] + icon_dimensions["height"]) * 0.5 orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25) var/rot_seg @@ -827,12 +827,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/species_type = client.prefs.read_preference(/datum/preference/choiced/species) var/datum/species/species = new species_type - - if(HAIR in species.species_traits) + if(species.check_head_flags(HEAD_HAIR)) hairstyle = client.prefs.read_preference(/datum/preference/choiced/hairstyle) hair_color = brighten_color(client.prefs.read_preference(/datum/preference/color/hair_color)) - if(FACEHAIR in species.species_traits) + if(species.check_head_flags(HEAD_FACIAL_HAIR)) facial_hairstyle = client.prefs.read_preference(/datum/preference/choiced/facial_hairstyle) facial_hair_color = brighten_color(client.prefs.read_preference(/datum/preference/color/facial_hair_color)) @@ -906,6 +905,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if (!isobserver(usr)) return + reset_perspective(null) // Reset again for sanity + 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? @@ -920,6 +921,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp 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 + if(!isnull(observetarget)) + stack_trace("do_observe called on an observer ([src]) who was already observing something! (observing: [observetarget], new target: [mob_eye])") + message_admins("[ADMIN_LOOKUPFLW(src)] attempted to observe someone while already observing someone, \ + this is a bug (and a past exploit) and should be investigated.") + return + //Istype so we filter out points of interest that are not mobs if(client && mob_eye && istype(mob_eye)) client.set_eye(mob_eye) @@ -974,7 +981,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/CtrlShiftClick(mob/user) if(isobserver(user) && check_rights(R_SPAWN)) - change_mob_type( /mob/living/carbon/human , null, null, TRUE) //always delmob, ghosts shouldn't be left lingering + change_mob_type(/mob/living/carbon/human , null, null, TRUE) //always delmob, ghosts shouldn't be left lingering /mob/dead/observer/examine(mob/user) . = ..() diff --git a/code/modules/mob/dead/observer/observer_say.dm b/code/modules/mob/dead/observer/observer_say.dm index 08f3c262cc5ff..e63839b123ff4 100644 --- a/code/modules/mob/dead/observer/observer_say.dm +++ b/code/modules/mob/dead/observer/observer_say.dm @@ -60,7 +60,7 @@ to_follow = V.source var/link = FOLLOW_LINK(src, to_follow) // 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))) + if (safe_read_pref(client, /datum/preference/toggle/enable_runechat) && (safe_read_pref(client, /datum/preference/toggle/enable_runechat_non_mobs) || ismob(speaker))) create_chat_message(speaker, message_language, raw_message, spans) // Recompose the message, because it's scrambled by default message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mods) diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm index 0e9334b896f77..db6acc346b158 100644 --- a/code/modules/mob/dead/observer/orbit.dm +++ b/code/modules/mob/dead/observer/orbit.dm @@ -172,10 +172,10 @@ GLOBAL_DATUM_INIT(orbit_menu, /datum/orbit_menu, new) if(!potential_mob_poi.mind && !potential_mob_poi.ckey) if(!mob_allowed_typecache) mob_allowed_typecache = typecacheof(list( - /mob/living/simple_animal/bot, /mob/camera, + /mob/living/basic/regal_rat, + /mob/living/simple_animal/bot, /mob/living/simple_animal/hostile/megafauna, - /mob/living/simple_animal/hostile/regalrat, )) if(!is_type_in_typecache(potential_mob_poi, mob_allowed_typecache) && !potential_mob_poi.GetComponent(/datum/component/deadchat_control)) return FALSE diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index ff2e414dd7013..0688778b04840 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -117,7 +117,7 @@ return if(user.get_timed_status_effect_duration(/datum/status_effect/confusion) > BEYBLADE_PUKE_THRESHOLD) - user.vomit(BEYBLADE_PUKE_NUTRIENT_LOSS, distance = 0) + user.vomit(VOMIT_CATEGORY_KNOCKDOWN, lost_nutrition = BEYBLADE_PUKE_NUTRIENT_LOSS, distance = 0) return if(prob(BEYBLADE_DIZZINESS_PROBABILITY)) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 04e754c8d2297..7e288ebcee560 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -140,7 +140,7 @@ //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) +/mob/proc/can_equip(obj/item/I, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE, ignore_equipped = FALSE, indirect_action = FALSE) return FALSE /mob/proc/can_put_in_hand(I, hand_index) @@ -163,15 +163,16 @@ I.forceMove(src) held_items[hand_index] = I SET_PLANE_EXPLICIT(I, ABOVE_HUD_PLANE, src) - 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(!I.on_equipped(src, ITEM_SLOT_HANDS)) + return FALSE update_held_items() I.pixel_x = I.base_pixel_x I.pixel_y = I.base_pixel_y + 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 return hand_index //Puts the item into the first available left hand if possible and calls all necessary triggers/updates. returns 1 on success. @@ -202,7 +203,7 @@ //Puts the item our active hand if possible. Failing that it tries other hands. Returns TRUE on success. -//If both fail it drops it on the floor and returns FALSE. +//If both fail it drops it on the floor (or nearby tables if germ sensitive) and returns FALSE. //This is probably the main one you need to know :) /mob/proc/put_in_hands(obj/item/I, del_on_fail = FALSE, merge_stacks = TRUE, forced = FALSE, ignore_animation = TRUE) if(QDELETED(I)) @@ -240,7 +241,45 @@ if(del_on_fail) qdel(I) return FALSE + + // Failed to put in hands - drop the item var/atom/location = drop_location() + + // Try dropping on nearby tables if germ sensitive (except table behind you) + if(HAS_TRAIT(I, TRAIT_GERM_SENSITIVE)) + var/list/dirs = list( // All dirs in clockwise order + NORTH, + NORTHEAST, + EAST, + SOUTHEAST, + SOUTH, + SOUTHWEST, + WEST, + NORTHWEST, + ) + var/dir_count = dirs.len + var/facing_dir_index = dirs.Find(dir) + var/cw_index = facing_dir_index + var/ccw_index = facing_dir_index + var/list/turfs_ordered = list(get_step(src, dir)) + + // Build ordered list of turfs starting from the front facing + for(var/i in 1 to ROUND_UP(dir_count/2) - 1) + cw_index++ + if(cw_index > dir_count) + cw_index = 1 + turfs_ordered += get_step(src, dirs[cw_index]) // Add next tile on your right + ccw_index-- + if(ccw_index <= 0) + ccw_index = dir_count + turfs_ordered += get_step(src, dirs[ccw_index]) // Add next tile on your left + + // Check tables on these turfs + for(var/turf in turfs_ordered) + if(locate(/obj/structure/table) in turf || locate(/obj/structure/rack) in turf || locate(/obj/machinery/icecream_vat) in turf) + location = turf + break + I.forceMove(location) I.layer = initial(I.layer) SET_PLANE_EXPLICIT(I, initial(I.plane), location) @@ -346,9 +385,10 @@ * * Argument(s): * * Optional - include_pockets (TRUE/FALSE), whether or not to include the pockets and suit storage in the returned list + * * Optional - include_accessories (TRUE/FALSE), whether or not to include the accessories in the returned list */ -/mob/living/proc/get_equipped_items(include_pockets = FALSE) +/mob/living/proc/get_equipped_items(include_pockets = FALSE, include_accessories = FALSE) var/list/items = list() for(var/obj/item/item_contents in contents) if(item_contents.item_flags & IN_INVENTORY) @@ -361,17 +401,21 @@ * * Argument(s): * * Optional - include_pockets (TRUE/FALSE), whether or not to include the pockets and suit storage in the returned list + * * Optional - include_accessories (TRUE/FALSE), whether or not to include the accessories in the returned list */ -/mob/living/carbon/human/get_equipped_items(include_pockets = FALSE) +/mob/living/carbon/human/get_equipped_items(include_pockets = FALSE, include_accessories = FALSE) var/list/items = ..() if(!include_pockets) items -= list(l_store, r_store, s_store) + if(include_accessories && w_uniform) + var/obj/item/clothing/under/worn_under = w_uniform + items += worn_under.attached_accessories return items /mob/living/proc/unequip_everything() var/list/items = list() - items |= get_equipped_items(TRUE) + items |= get_equipped_items(include_pockets = TRUE) for(var/I in items) dropItemToGround(I) drop_all_held_items() @@ -497,7 +541,7 @@ //GetAllContents that is reasonable and not stupid /mob/living/carbon/proc/get_all_gear() - var/list/processing_list = get_equipped_items(include_pockets = TRUE) + held_items + var/list/processing_list = get_equipped_items(include_pockets = TRUE, include_accessories = TRUE) + held_items list_clear_nulls(processing_list) // handles empty hands var/i = 0 while(i < length(processing_list) ) diff --git a/code/modules/mob/living/basic/basic.dm b/code/modules/mob/living/basic/basic.dm index 2d9709bd44ddd..aebb54770d702 100644 --- a/code/modules/mob/living/basic/basic.dm +++ b/code/modules/mob/living/basic/basic.dm @@ -11,7 +11,7 @@ var/basic_mob_flags = NONE - ///Defines how fast the basic mob can move. This is a multiplier + ///Defines how fast the basic mob can move. This is not a multiplier var/speed = 1 ///How much stamina the mob recovers per second var/stamina_recovery = 5 @@ -35,6 +35,8 @@ var/attack_vis_effect ///Played when someone punches the creature. var/attacked_sound = SFX_PUNCH //This should be an element + /// How often can you melee attack? + var/melee_attack_cooldown = 2 SECONDS /// Variable maintained for compatibility with attack_animal procs until simple animals can be refactored away. Use element instead of setting manually. var/environment_smash = ENVIRONMENT_SMASH_STRUCTURES @@ -141,6 +143,19 @@ health = 0 look_dead() +/mob/living/basic/gib() + if(butcher_results || guaranteed_butcher_results) + var/list/butcher_loot = list() + if(butcher_results) + butcher_loot += butcher_results + if(guaranteed_butcher_results) + butcher_loot += guaranteed_butcher_results + var/atom/loot_destination = drop_location() + for(var/path in butcher_loot) + for(var/i in 1 to butcher_loot[path]) + new path(loot_destination) + return ..() + /** * Apply the appearance and properties this mob has when it dies * This is called by the mob pretending to be dead too so don't put loot drops in here or something @@ -150,7 +165,8 @@ if(basic_mob_flags & FLIP_ON_DEATH) transform = transform.Turn(180) if(!(basic_mob_flags & REMAIN_DENSE_WHILE_DEAD)) - set_density(FALSE) + ADD_TRAIT(src, TRAIT_UNDENSE, BASIC_MOB_DEATH_TRAIT) + SEND_SIGNAL(src, COMSIG_BASICMOB_LOOK_DEAD) /mob/living/basic/revive(full_heal_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE) . = ..() @@ -164,14 +180,23 @@ if(basic_mob_flags & FLIP_ON_DEATH) transform = transform.Turn(180) if(!(basic_mob_flags & REMAIN_DENSE_WHILE_DEAD)) - set_density(initial(density)) + REMOVE_TRAIT(src, TRAIT_UNDENSE, BASIC_MOB_DEATH_TRAIT) + SEND_SIGNAL(src, COMSIG_BASICMOB_LOOK_ALIVE) /mob/living/basic/update_sight() lighting_color_cutoffs = list(lighting_cutoff_red, lighting_cutoff_green, lighting_cutoff_blue) return ..() -/mob/living/basic/proc/melee_attack(atom/target, list/modifiers) +/mob/living/basic/examine(mob/user) + . = ..() + if(stat != DEAD) + return + . += span_deadsay("Upon closer examination, [p_they()] appear[p_s()] to be [HAS_TRAIT(user.mind, TRAIT_NAIVE) ? "asleep" : "dead"].") + +/mob/living/basic/proc/melee_attack(atom/target, list/modifiers, ignore_cooldown = FALSE) face_atom(target) + if (!ignore_cooldown) + changeNext_move(melee_attack_cooldown) if(SEND_SIGNAL(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, target) & COMPONENT_HOSTILE_NO_ATTACK) return FALSE //but more importantly return before attack_animal called var/result = target.attack_basic_mob(src, modifiers) @@ -197,6 +222,13 @@ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/simplemob_varspeed, multiplicative_slowdown = speed) SEND_SIGNAL(src, POST_BASIC_MOB_UPDATE_VARSPEED) +/mob/living/basic/update_movespeed() + . = ..() + if (cached_multiplicative_slowdown > END_GLIDE_SPEED) + ADD_TRAIT(src, TRAIT_NO_GLIDE, SPEED_TRAIT) + else + REMOVE_TRAIT(src, TRAIT_NO_GLIDE, SPEED_TRAIT) + /mob/living/basic/relaymove(mob/living/user, direction) if(user.incapacitated()) return @@ -214,7 +246,7 @@ /mob/living/basic/update_stamina() set_varspeed(initial(speed) + (staminaloss * 0.06)) -/mob/living/basic/on_fire_stack(seconds_per_tick, times_fired, datum/status_effect/fire_handler/fire_stacks/fire_handler) +/mob/living/basic/on_fire_stack(seconds_per_tick, datum/status_effect/fire_handler/fire_stacks/fire_handler) adjust_bodytemperature((maximum_survivable_temperature + (fire_handler.stacks * 12)) * 0.5 * seconds_per_tick) /mob/living/basic/update_fire_overlay(stacks, on_fire, last_icon_state, suffix = "") diff --git a/code/modules/mob/living/basic/basic_defense.dm b/code/modules/mob/living/basic/basic_defense.dm index cd1ded2ed6ff5..87fe6f8fed1bb 100644 --- a/code/modules/mob/living/basic/basic_defense.dm +++ b/code/modules/mob/living/basic/basic_defense.dm @@ -38,7 +38,7 @@ to_chat(user, span_danger("You [response_harm_simple] [src]!")) playsound(loc, attacked_sound, 25, TRUE, -1) 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/damage = (basic_mob_flags & IMMUNE_TO_FISTS) ? 0 : rand(active_arm.unarmed_damage_low, active_arm.unarmed_damage_high) attack_threshold_check(damage) log_combat(user, src, "attacked") @@ -148,7 +148,7 @@ apply_damage(500, damagetype = BRUTE) else investigate_log("has been gibbed by an explosion.", INVESTIGATE_DEATHS) - gib() + gib(DROP_ALL_REMAINS) if (EXPLODE_HEAVY) var/bloss = 60 @@ -165,6 +165,9 @@ return TRUE /mob/living/basic/blob_act(obj/structure/blob/attacking_blob) + . = ..() + if (!.) + return apply_damage(20, damagetype = BRUTE) /mob/living/basic/do_attack_animation(atom/attacked_atom, visual_effect_icon, used_item, no_effect) diff --git a/code/modules/mob/living/basic/blob_minions/blob_ai.dm b/code/modules/mob/living/basic/blob_minions/blob_ai.dm new file mode 100644 index 0000000000000..6168b7ca83be7 --- /dev/null +++ b/code/modules/mob/living/basic/blob_minions/blob_ai.dm @@ -0,0 +1,51 @@ +/** + * Extremely simple AI, this isn't a very smart boy + * Only notable quirk is that it uses JPS movement, simple avoidance would fail to realise it can path through blobs + */ +/datum/ai_controller/basic_controller/blobbernaut + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/attack_until_dead, + ) + + ai_movement = /datum/ai_movement/jps + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/** + * Move to a point designated by the overmind, otherwise just slap people nearby + */ +/datum/ai_controller/basic_controller/blob_zombie + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/attack_until_dead, + ) + + ai_movement = /datum/ai_movement/jps + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/travel_to_point/and_clear_target, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/** + * As blob zombie but will prioritise attacking corpses to zombify them + */ +/datum/ai_controller/basic_controller/blob_spore + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/attack_until_dead, + ) + + ai_movement = /datum/ai_movement/jps + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/find_and_hunt_target/corpses, + /datum/ai_planning_subtree/travel_to_point/and_clear_target, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) diff --git a/code/modules/mob/living/basic/blob_minions/blob_mob.dm b/code/modules/mob/living/basic/blob_minions/blob_mob.dm new file mode 100644 index 0000000000000..35e41f0905845 --- /dev/null +++ b/code/modules/mob/living/basic/blob_minions/blob_mob.dm @@ -0,0 +1,37 @@ +/// Root of shared behaviour for mobs spawned by blobs, is abstract and should not be spawned +/mob/living/basic/blob_minion + name = "Blob Error" + desc = "A nonfunctional fungal creature created by bad code or celestial mistake. Point and laugh." + icon = 'icons/mob/nonhuman-player/blob.dmi' + icon_state = "blob_head" + unique_name = TRUE + pass_flags = PASSBLOB + faction = list(ROLE_BLOB) + combat_mode = TRUE + bubble_icon = "blob" + speak_emote = null + habitable_atmos = 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) + minimum_survivable_temperature = 0 + maximum_survivable_temperature = INFINITY + lighting_cutoff_red = 20 + lighting_cutoff_green = 40 + lighting_cutoff_blue = 30 + initial_language_holder = /datum/language_holder/empty + +/mob/living/basic/blob_minion/Initialize(mapload) + . = ..() + add_traits(list(TRAIT_BLOB_ALLY, TRAIT_MUTE), INNATE_TRAIT) + AddComponent(/datum/component/blob_minion, on_strain_changed = CALLBACK(src, PROC_REF(on_strain_updated))) + +/// Called when our blob overmind changes their variant, update some of our mob properties +/mob/living/basic/blob_minion/proc/on_strain_updated(mob/camera/blob/overmind, datum/blobstrain/new_strain) + return + +/// Associates this mob with a specific blob factory node +/mob/living/basic/blob_minion/proc/link_to_factory(obj/structure/blob/special/factory/factory) + RegisterSignal(factory, COMSIG_QDELETING, PROC_REF(on_factory_destroyed)) + +/// Called when our factory is destroyed +/mob/living/basic/blob_minion/proc/on_factory_destroyed() + SIGNAL_HANDLER + to_chat(src, span_userdanger("Your factory was destroyed! You feel yourself dying!")) diff --git a/code/modules/mob/living/basic/blob_minions/blob_spore.dm b/code/modules/mob/living/basic/blob_minions/blob_spore.dm new file mode 100644 index 0000000000000..e8c3acc8b97f0 --- /dev/null +++ b/code/modules/mob/living/basic/blob_minions/blob_spore.dm @@ -0,0 +1,123 @@ +/** + * A floating fungus which turns people into zombies and explodes into reagent clouds upon death. + */ +/mob/living/basic/blob_minion/spore + name = "blob spore" + desc = "A floating, fragile spore." + icon = 'icons/mob/nonhuman-player/blob.dmi' + icon_state = "blobpod" + icon_living = "blobpod" + health_doll_icon = "blobpod" + health = BLOBMOB_SPORE_HEALTH + maxHealth = BLOBMOB_SPORE_HEALTH + verb_say = "psychically pulses" + verb_ask = "psychically probes" + verb_exclaim = "psychically yells" + verb_yell = "psychically screams" + melee_damage_lower = BLOBMOB_SPORE_DMG_LOWER + melee_damage_upper = BLOBMOB_SPORE_DMG_UPPER + obj_damage = 0 + attack_verb_continuous = "batters" + attack_verb_simple = "batter" + attack_sound = 'sound/weapons/genhit1.ogg' + death_message = "explodes into a cloud of gas!" + gold_core_spawnable = HOSTILE_SPAWN + basic_mob_flags = DEL_ON_DEATH + ai_controller = /datum/ai_controller/basic_controller/blob_spore + /// Size of cloud produced from a dying spore + var/death_cloud_size = 1 + /// Type of mob to create + var/mob/living/zombie_type = /mob/living/basic/blob_minion/zombie + +/mob/living/basic/blob_minion/spore/Initialize(mapload) + . = ..() + AddElement(/datum/element/simple_flying) + AddElement(/datum/element/swabable, CELL_LINE_TABLE_BLOBSPORE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) + +/mob/living/basic/blob_minion/spore/death(gibbed) + . = ..() + death_burst() + +/mob/living/basic/blob_minion/spore/on_factory_destroyed() + death() + +/// Create an explosion of spores on death +/mob/living/basic/blob_minion/spore/proc/death_burst() + do_chem_smoke(range = death_cloud_size, holder = src, location = get_turf(src), reagent_type = /datum/reagent/toxin/spore) + + +/mob/living/basic/blob_minion/spore/melee_attack(mob/living/carbon/human/target, list/modifiers, ignore_cooldown) + . = ..() + if (!ishuman(target) || target.stat != DEAD) + return + zombify(target) + +/// Become a zombie +/mob/living/basic/blob_minion/spore/proc/zombify(mob/living/carbon/human/target) + visible_message(span_warning("The corpse of [target.name] suddenly rises!")) + var/mob/living/basic/blob_minion/zombie/blombie = change_mob_type(zombie_type, loc, new_name = initial(zombie_type.name)) + blombie.set_name() + if (istype(blombie)) // In case of badmin + blombie.consume_corpse(target) + SEND_SIGNAL(src, COMSIG_BLOB_ZOMBIFIED, blombie) + qdel(src) + +/// Variant of the blob spore which is actually spawned by blob factories +/mob/living/basic/blob_minion/spore/minion + gold_core_spawnable = NO_SPAWN + zombie_type = /mob/living/basic/blob_minion/zombie/controlled + /// We die if we leave the same turf as this z level + var/turf/z_turf + +/mob/living/basic/blob_minion/spore/minion/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(on_z_changed)) + +/// When we z-move check that we're on the same z level as our factory was +/mob/living/basic/blob_minion/spore/minion/proc/on_z_changed() + SIGNAL_HANDLER + if (isnull(z_turf)) + return + if (!is_valid_z_level(get_turf(src), z_turf)) + death() + +/// Mark the turf we need to track from our factory +/mob/living/basic/blob_minion/spore/minion/link_to_factory(obj/structure/blob/special/factory/factory) + . = ..() + z_turf = get_turf(factory) + +/// If the blob changes to distributed neurons then you can control the spores +/mob/living/basic/blob_minion/spore/minion/on_strain_updated(mob/camera/blob/overmind, datum/blobstrain/new_strain) + if (isnull(overmind)) + REMOVE_TRAIT(src, TRAIT_PERMANENTLY_MORTAL, INNATE_TRAIT) + else + ADD_TRAIT(src, TRAIT_PERMANENTLY_MORTAL, INNATE_TRAIT) + + if (istype(new_strain, /datum/blobstrain/reagent/distributed_neurons)) + AddComponent(\ + /datum/component/ghost_direct_control,\ + ban_type = ROLE_BLOB_INFECTION,\ + poll_candidates = TRUE,\ + poll_ignore_key = POLL_IGNORE_BLOB,\ + ) + else + qdel(GetComponent(/datum/component/ghost_direct_control)) + +/mob/living/basic/blob_minion/spore/minion/death_burst() + return // This behaviour is superceded by the overmind's intervention + + +/// Weakened spore spawned by distributed neurons, can't zombify people and makes a teeny explosion +/mob/living/basic/blob_minion/spore/minion/weak + name = "fragile blob spore" + health = 15 + maxHealth = 15 + melee_damage_lower = 1 + melee_damage_upper = 2 + death_cloud_size = 0 + +/mob/living/basic/blob_minion/spore/minion/weak/zombify() + return + +/mob/living/basic/blob_minion/spore/minion/weak/on_strain_updated() + return diff --git a/code/modules/mob/living/basic/blob_minions/blob_zombie.dm b/code/modules/mob/living/basic/blob_minions/blob_zombie.dm new file mode 100644 index 0000000000000..c9bf3b7346a98 --- /dev/null +++ b/code/modules/mob/living/basic/blob_minions/blob_zombie.dm @@ -0,0 +1,99 @@ +/// A shambling mob made out of a crew member +/mob/living/basic/blob_minion/zombie + name = "blob zombie" + desc = "A shambling corpse animated by the blob." + icon_state = "zombie" + icon_living = "zombie" + health_doll_icon = "blobpod" + mob_biotypes = MOB_ORGANIC | MOB_HUMANOID + health = 70 + maxHealth = 70 + verb_say = "gurgles" + verb_ask = "demands" + verb_exclaim = "roars" + verb_yell = "bellows" + melee_damage_lower = 10 + melee_damage_upper = 15 + melee_attack_cooldown = CLICK_CD_MELEE + obj_damage = 20 + attack_verb_continuous = "punches" + attack_verb_simple = "punch" + attack_sound = 'sound/weapons/genhit1.ogg' + death_message = "collapses to the ground!" + gold_core_spawnable = NO_SPAWN + basic_mob_flags = DEL_ON_DEATH + ai_controller = /datum/ai_controller/basic_controller/blob_zombie + /// The dead body we have inside + var/mob/living/carbon/human/corpse + +/mob/living/basic/blob_minion/zombie/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_PERMANENTLY_MORTAL, INNATE_TRAIT) // This mob doesn't function visually without a corpse and wouldn't respawn with one + AddElement(/datum/element/swabable, CELL_LINE_TABLE_BLOBSPORE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) + +/mob/living/basic/blob_minion/zombie/death(gibbed) + corpse?.forceMove(loc) + death_burst() + return ..() + +/mob/living/basic/blob_minion/zombie/Exited(atom/movable/gone, direction) + . = ..() + if (gone != corpse) + return + corpse = null + death() + +/mob/living/basic/blob_minion/zombie/Destroy() + QDEL_NULL(corpse) + return ..() + +/mob/living/basic/blob_minion/zombie/on_factory_destroyed() + . = ..() + death() + +/mob/living/basic/blob_minion/zombie/update_overlays() + . = ..() + copy_overlays(corpse, TRUE) + var/mutable_appearance/blob_head_overlay = mutable_appearance('icons/mob/nonhuman-player/blob.dmi', "blob_head") + blob_head_overlay.color = LAZYACCESS(atom_colours, FIXED_COLOUR_PRIORITY) || COLOR_WHITE + color = initial(color) // reversing what our component did lol, but we needed the value for the overlay + . += blob_head_overlay + +/// Create an explosion of spores on death +/mob/living/basic/blob_minion/zombie/proc/death_burst() + do_chem_smoke(range = 0, holder = src, location = get_turf(src), reagent_type = /datum/reagent/toxin/spore) + +/// Store a body so that we can drop it on death +/mob/living/basic/blob_minion/zombie/proc/consume_corpse(mob/living/carbon/human/new_corpse) + if(new_corpse.wear_suit) + maxHealth += new_corpse.get_armor_rating(MELEE) + health = maxHealth + new_corpse.set_facial_hairstyle("Shaved", update = FALSE) + new_corpse.set_hairstyle("Bald", update = TRUE) + new_corpse.forceMove(src) + corpse = new_corpse + update_appearance(UPDATE_ICON) + RegisterSignal(corpse, COMSIG_LIVING_REVIVE, PROC_REF(on_corpse_revived)) + +/// Dynamic changeling reentry +/mob/living/basic/blob_minion/zombie/proc/on_corpse_revived() + SIGNAL_HANDLER + visible_message(span_boldwarning("[src] bursts from the inside!")) + death() + +/// Blob-created zombies will ping for player control when they make a zombie +/mob/living/basic/blob_minion/zombie/controlled + +/mob/living/basic/blob_minion/zombie/controlled/consume_corpse(mob/living/carbon/human/new_corpse) + . = ..() + if (!isnull(client)) + return + AddComponent(\ + /datum/component/ghost_direct_control,\ + ban_type = ROLE_BLOB_INFECTION,\ + poll_candidates = TRUE,\ + poll_ignore_key = POLL_IGNORE_BLOB,\ + ) + +/mob/living/basic/blob_minion/zombie/controlled/death_burst() + return diff --git a/code/modules/mob/living/basic/blob_minions/blobbernaut.dm b/code/modules/mob/living/basic/blob_minions/blobbernaut.dm new file mode 100644 index 0000000000000..b483641993a7e --- /dev/null +++ b/code/modules/mob/living/basic/blob_minions/blobbernaut.dm @@ -0,0 +1,109 @@ +/** + * Player-piloted brute mob. Mostly just a "move and click" kind of guy. + * Has a variant which takes damage when away from blob tiles + */ +/mob/living/basic/blob_minion/blobbernaut + name = "blobbernaut" + desc = "A hulking, mobile chunk of blobmass." + icon_state = "blobbernaut" + icon_living = "blobbernaut" + icon_dead = "blobbernaut_dead" + health = BLOBMOB_BLOBBERNAUT_HEALTH + maxHealth = BLOBMOB_BLOBBERNAUT_HEALTH + damage_coeff = list(BRUTE = 0.5, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) + melee_damage_lower = BLOBMOB_BLOBBERNAUT_DMG_SOLO_LOWER + melee_damage_upper = BLOBMOB_BLOBBERNAUT_DMG_SOLO_UPPER + melee_attack_cooldown = CLICK_CD_MELEE + obj_damage = BLOBMOB_BLOBBERNAUT_DMG_OBJ + attack_verb_continuous = "slams" + attack_verb_simple = "slam" + attack_sound = 'sound/effects/blobattack.ogg' + verb_say = "gurgles" + verb_ask = "demands" + verb_exclaim = "roars" + verb_yell = "bellows" + force_threshold = 10 + pressure_resistance = 50 + mob_size = MOB_SIZE_LARGE + hud_type = /datum/hud/living/blobbernaut + gold_core_spawnable = HOSTILE_SPAWN + ai_controller = /datum/ai_controller/basic_controller/blobbernaut + +/mob/living/basic/blob_minion/blobbernaut/Initialize(mapload) + . = ..() + AddElement(/datum/element/swabable, CELL_LINE_TABLE_BLOBBERNAUT, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) + +/mob/living/basic/blob_minion/blobbernaut/death(gibbed) + flick("blobbernaut_death", src) + return ..() + +/// This variant is the one actually spawned by blob factories, takes damage when away from blob tiles +/mob/living/basic/blob_minion/blobbernaut/minion + gold_core_spawnable = NO_SPAWN + /// Is our factory dead? + var/orphaned = FALSE + +/mob/living/basic/blob_minion/blobbernaut/minion/Life(seconds_per_tick, times_fired) + . = ..() + if (!.) + return FALSE + var/damage_sources = 0 + var/list/blobs_in_area = range(2, src) + + if (!(locate(/obj/structure/blob) in blobs_in_area)) + damage_sources++ + + if (orphaned) + damage_sources++ + else + var/particle_colour = atom_colours[FIXED_COLOUR_PRIORITY] || COLOR_BLACK + if (locate(/obj/structure/blob/special/core) in blobs_in_area) + heal_overall_damage(maxHealth * BLOBMOB_BLOBBERNAUT_HEALING_CORE * seconds_per_tick) + var/obj/effect/temp_visual/heal/heal_effect = new /obj/effect/temp_visual/heal(get_turf(src)) + heal_effect.color = particle_colour + + if (locate(/obj/structure/blob/special/node) in blobs_in_area) + heal_overall_damage(maxHealth * BLOBMOB_BLOBBERNAUT_HEALING_NODE * seconds_per_tick) + var/obj/effect/temp_visual/heal/heal_effect = new /obj/effect/temp_visual/heal(get_turf(src)) + heal_effect.color = particle_colour + + if (damage_sources == 0) + return FALSE + + // take 2.5% of max health as damage when not near the blob or if the naut has no factory, 5% if both + apply_damage(maxHealth * BLOBMOB_BLOBBERNAUT_HEALTH_DECAY * damage_sources * seconds_per_tick, damagetype = TOX) // We reduce brute damage + var/mutable_appearance/harming = mutable_appearance('icons/mob/nonhuman-player/blob.dmi', "nautdamage", MOB_LAYER + 0.01) + harming.appearance_flags = RESET_COLOR + harming.color = atom_colours[FIXED_COLOUR_PRIORITY] || COLOR_WHITE + harming.dir = dir + flick_overlay_view(harming, 0.8 SECONDS) + return TRUE + +/// Called by the blob creation power to give us a mind and a basic task orientation +/mob/living/basic/blob_minion/blobbernaut/minion/proc/assign_key(ckey, datum/blobstrain/blobstrain) + key = ckey + flick("blobbernaut_produce", src) + health = maxHealth / 2 // Start out injured to encourage not beelining away from the blob + SEND_SOUND(src, sound('sound/effects/blobattack.ogg')) + SEND_SOUND(src, sound('sound/effects/attackblob.ogg')) + to_chat(src, span_infoplain("You are powerful, hard to kill, and slowly regenerate near nodes and cores, [span_cultlarge("but will slowly die if not near the blob")] or if the factory that made you is killed.")) + to_chat(src, span_infoplain("You can communicate with other blobbernauts and overminds telepathically by attempting to speak normally")) + to_chat(src, span_infoplain("Your overmind's blob reagent is: [blobstrain.name]!")) + to_chat(src, span_infoplain("The [blobstrain.name] reagent [blobstrain.shortdesc ? "[blobstrain.shortdesc]" : "[blobstrain.description]"]")) + +/// Set our attack damage based on blob's properties +/mob/living/basic/blob_minion/blobbernaut/minion/on_strain_updated(mob/camera/blob/overmind, datum/blobstrain/new_strain) + if (isnull(overmind)) + melee_damage_lower = initial(melee_damage_lower) + melee_damage_upper = initial(melee_damage_upper) + attack_verb_continuous = initial(attack_verb_continuous) + return + melee_damage_lower = BLOBMOB_BLOBBERNAUT_DMG_LOWER + melee_damage_upper = BLOBMOB_BLOBBERNAUT_DMG_UPPER + attack_verb_continuous = new_strain.blobbernaut_message + +/// Called by our factory to inform us that it's not going to support us financially any more +/mob/living/basic/blob_minion/blobbernaut/minion/on_factory_destroyed() + . = ..() + orphaned = TRUE + throw_alert("nofactory", /atom/movable/screen/alert/nofactory) diff --git a/code/modules/mob/living/basic/clown/clown.dm b/code/modules/mob/living/basic/clown/clown.dm new file mode 100644 index 0000000000000..7871536135608 --- /dev/null +++ b/code/modules/mob/living/basic/clown/clown.dm @@ -0,0 +1,629 @@ +/mob/living/basic/clown + name = "Clown" + desc = "A denizen of clown planet." + icon = 'icons/mob/simple/clown_mobs.dmi' + icon_state = "clown" + icon_living = "clown" + icon_dead = "clown_dead" + icon_gib = "clown_gib" + health_doll_icon = "clown" //if >32x32, it will use this generic. for all the huge clown mobs that subtype from this + mob_biotypes = MOB_ORGANIC|MOB_HUMANOID + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "robusts" + response_harm_simple = "robust" + combat_mode = TRUE + maxHealth = 75 + health = 75 + melee_damage_lower = 10 + melee_damage_upper = 10 + attack_sound = 'sound/items/bikehorn.ogg' + attacked_sound = 'sound/items/bikehorn.ogg' + environment_smash = ENVIRONMENT_SMASH_NONE + basic_mob_flags = DEL_ON_DEATH + initial_language_holder = /datum/language_holder/clown + habitable_atmos = 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) + minimum_survivable_temperature = T0C + maximum_survivable_temperature = (T0C + 100) + unsuitable_atmos_damage = 10 + unsuitable_heat_damage = 15 + faction = list(FACTION_CLOWN) + ai_controller = /datum/ai_controller/basic_controller/clown + speed = 1.4 //roughly close to simpleanimal clowns + ///list of stuff we drop on death + var/list/loot = list(/obj/effect/mob_spawn/corpse/human/clown) + ///blackboard emote list + var/list/emotes = list( + BB_EMOTE_SAY = list("HONK", "Honk!", "Welcome to clown planet!"), + BB_EMOTE_HEAR = list("honks", "squeaks"), + BB_EMOTE_SOUND = list('sound/items/bikehorn.ogg'), //WE LOVE TO PARTY + BB_EMOTE_CHANCE = 5, + ) + ///do we waddle (honk) + var/waddles = TRUE + +/mob/living/basic/clown/Initialize(mapload) + . = ..() + AddElement(/datum/element/footstep, footstep_type = FOOTSTEP_MOB_SHOE) + AddComponent(/datum/component/ai_retaliate_advanced, CALLBACK(src, PROC_REF(retaliate_callback))) + ai_controller.set_blackboard_key(BB_BASIC_MOB_SPEAK_LINES, emotes) + //im not putting dynamic humans or whatever its called here because this is the base path of nonhuman clownstrosities + if(waddles) + AddElement(/datum/element/waddling) + if(length(loot)) + loot = string_list(loot) + AddElement(/datum/element/death_drops, loot) + +/mob/living/basic/clown/proc/retaliate_callback(mob/living/attacker) + if (!istype(attacker)) + return + for (var/mob/living/basic/clown/harbringer in oview(src, 7)) + harbringer.ai_controller.insert_blackboard_key_lazylist(BB_BASIC_MOB_RETALIATE_LIST, attacker) + +/mob/living/basic/clown/melee_attack(atom/target, list/modifiers, ignore_cooldown = FALSE) + if(!istype(target, /obj/item/food/grown/banana/bunch)) + return ..() + var/obj/item/food/grown/banana/bunch/unripe_bunch = target + unripe_bunch.start_ripening() + log_combat(src, target, "explosively ripened") + +/mob/living/basic/clown/lube + name = "Living Lube" + desc = "A puddle of lube brought to life by the honkmother." + icon_state = "lube" + icon_living = "lube" + response_help_continuous = "dips a finger into" + response_help_simple = "dip a finger into" + response_disarm_continuous = "gently scoops and pours aside" + response_disarm_simple = "gently scoop and pour aside" + emotes = list( + BB_EMOTE_SAY = list("HONK", "Honk!", "Welcome to clown planet!"), + BB_EMOTE_HEAR = list("bubbles", "oozes"), + ) + waddles = FALSE + loot = list( + /obj/effect/spawner/foam_starter/small, + /obj/item/clothing/mask/gas/clown_hat, + ) + +/mob/living/basic/clown/lube/Initialize(mapload) + . = ..() + AddElement(/datum/element/snailcrawl) + +/mob/living/basic/clown/honkling + name = "Honkling" + desc = "A divine being sent by the Honkmother to spread joy. It's not dangerous, but it's a bit of a nuisance." + icon_state = "honkling" + icon_living = "honkling" + speed = 1.1 + melee_damage_lower = 1 + melee_damage_upper = 1 + attack_verb_continuous = "cheers up" + attack_verb_simple = "cheer up" + loot = list( + /obj/item/clothing/mask/gas/clown_hat, + /obj/effect/gibspawner/human, + /obj/item/soap, + /obj/item/seeds/banana/bluespace, + ) + +/mob/living/basic/clown/honkling/Initialize(mapload) + . = ..() + var/static/list/injection_range + if(!injection_range) + injection_range = string_numbers_list(list(1, 5)) + AddElement(/datum/element/venomous, /datum/reagent/consumable/laughter, injection_range) + +/mob/living/basic/clown/fleshclown + name = "Fleshclown" + desc = "A being forged out of the pure essence of pranking, cursed into existence by a cruel maker." + icon_state = "fleshclown" + icon_living = "fleshclown" + response_help_continuous = "reluctantly pokes" + response_help_simple = "reluctantly poke" + response_disarm_continuous = "sinks his hands into the spongy flesh of" + response_disarm_simple = "sink your hands into the spongy flesh of" + response_harm_continuous = "cleanses the world of" + response_harm_simple = "cleanse the world of" + maxHealth = 140 + health = 140 + speed = 1 + melee_damage_upper = 15 + attack_verb_continuous = "limply slaps" + attack_verb_simple = "limply slap" + obj_damage = 5 + loot = list( + /obj/effect/gibspawner/human, + /obj/item/clothing/mask/gas/clown_hat, + /obj/item/soap, + /obj/item/clothing/suit/hooded/bloated_human, + ) + emotes = list( + BB_EMOTE_SAY = list( + "HONK", + "Honk!", + "I didn't ask for this", + "I feel constant and horrible pain", + "I was born out of mirthful pranking but I live in suffering", + "This body is a merciless and unforgiving prison", + "YA-HONK!!!", + ), + BB_EMOTE_HEAR = list("honks", "contemplates its existence"), + BB_EMOTE_SEE = list("sweats", "jiggles"), + BB_EMOTE_CHANCE = 5, + ) + +/mob/living/basic/clown/fleshclown/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + +/mob/living/basic/clown/longface + name = "Longface" + desc = "Often found walking into the bar." + icon_state = "long face" + icon_living = "long face" + move_resist = INFINITY + response_help_continuous = "tries to awkwardly hug" + response_help_simple = "try to awkwardly hug" + response_disarm_continuous = "pushes the unwieldy frame of" + response_disarm_simple = "push the unwieldy frame of" + response_harm_continuous = "tries to shut up" + response_harm_simple = "try to shut up" + maxHealth = 150 + health = 150 + pixel_x = -16 + base_pixel_x = -16 + speed = 3 + melee_damage_lower = 5 + attack_verb_continuous = "YA-HONKs" + attack_verb_simple = "YA-HONK" + loot = list( + /obj/effect/gibspawner/human, + /obj/item/soap, + /obj/item/clothing/mask/gas/clown_hat, + ) + emotes = list( + BB_EMOTE_SAY = list("YA-HONK!!!"), + BB_EMOTE_HEAR = list("honks", "squeaks"), + BB_EMOTE_CHANCE = 60, + ) + +/mob/living/basic/clown/clownhulk + name = "Honk Hulk" + desc = "A cruel and fearsome clown. Don't make him angry." + icon_state = "honkhulk" + icon_living = "honkhulk" + move_resist = INFINITY + gender = MALE + response_help_continuous = "tries desperately to appease" + response_help_simple = "try desperately to appease" + response_disarm_continuous = "foolishly pushes" + response_disarm_simple = "foolishly push" + response_harm_continuous = "angers" + response_harm_simple = "anger" + maxHealth = 400 + health = 400 + pixel_x = -16 + base_pixel_x = -16 + speed = 2 + melee_damage_lower = 15 + melee_damage_upper = 20 + attack_verb_continuous = "pummels" + attack_verb_simple = "pummel" + obj_damage = 30 + environment_smash = ENVIRONMENT_SMASH_WALLS + loot = list( + /obj/effect/gibspawner/human, + /obj/item/soap, + /obj/item/clothing/mask/gas/clown_hat, + ) + emotes = list( + BB_EMOTE_SAY = list("HONK", "Honk!", "HAUAUANK!!!", "GUUURRRRAAAHHH!!!"), + BB_EMOTE_HEAR = list("honks", "grunts"), + BB_EMOTE_SEE = list("sweats"), + BB_EMOTE_CHANCE = 5, + ) + +/mob/living/basic/clown/clownhulk/chlown + name = "Chlown" + desc = "A real lunkhead who somehow gets all the girls." + icon_state = "chlown" + icon_living = "chlown" + gender = MALE + response_help_continuous = "submits to" + response_help_simple = "submit to" + response_disarm_continuous = "tries to assert dominance over" + response_disarm_simple = "try to assert dominance over" + response_harm_continuous = "makes a weak beta attack at" + response_harm_simple = "make a weak beta attack at" + maxHealth = 500 + health = 500 + speed = -2 //ridicilously fast but i dont even know what this is used for + armour_penetration = 20 + attack_verb_continuous = "steals the girlfriend of" + attack_verb_simple = "steal the girlfriend of" + attack_sound = 'sound/items/airhorn2.ogg' + loot = list( + /obj/effect/gibspawner/human, + /obj/effect/spawner/foam_starter/small, + /obj/item/soap, + /obj/item/clothing/mask/gas/clown_hat, + ) + emotes = list( + BB_EMOTE_SAY = list("HONK", "Honk!", "Bruh", "cheeaaaahhh?"), + BB_EMOTE_SEE = list("asserts his dominance", "emasculates everyone implicitly"), + BB_EMOTE_CHANCE = 5, + ) + +/mob/living/basic/clown/clownhulk/honkmunculus + name = "Honkmunculus" + desc = "A slender wiry figure of alchemical origin." + icon_state = "honkmunculus" + icon_living = "honkmunculus" + response_help_continuous = "skeptically pokes" + response_help_simple = "skeptically poke" + response_disarm_continuous = "pushes the unwieldy frame of" + response_disarm_simple = "push the unwieldy frame of" + maxHealth = 200 + health = 200 + speed = 1 + melee_damage_lower = 5 + melee_damage_upper = 10 + attack_verb_continuous = "ferociously mauls" + attack_verb_simple = "ferociously maul" + environment_smash = ENVIRONMENT_SMASH_NONE + loot = list( + /obj/effect/gibspawner/xeno/bodypartless, + /obj/effect/spawner/foam_starter/small, + /obj/item/soap, + /obj/item/clothing/mask/gas/clown_hat, + ) + emotes = list( + BB_EMOTE_SAY = list("honk"), + BB_EMOTE_SEE = list("squirms", "writhes"), + ) + +/mob/living/basic/clown/clownhulk/honkmunculus/Initialize(mapload) + . = ..() + var/static/list/injection_range + if(!injection_range) + injection_range = string_numbers_list(list(1, 5)) + AddElement(/datum/element/venomous, /datum/reagent/peaceborg/confuse, injection_range) + +/mob/living/basic/clown/clownhulk/destroyer + name = "The Destroyer" + desc = "An ancient being born of arcane honking." + icon_state = "destroyer" + icon_living = "destroyer" + response_disarm_continuous = "bounces off of" + response_harm_continuous = "bounces off of" + maxHealth = 400 + health = 400 + speed = 5 + melee_damage_lower = 20 + melee_damage_upper = 40 + armour_penetration = 30 + attack_verb_continuous = "acts out divine vengeance on" + attack_verb_simple = "act out divine vengeance on" + obj_damage = 50 + environment_smash = ENVIRONMENT_SMASH_RWALLS + ai_controller = /datum/ai_controller/basic_controller/clown/murder + loot = list( + /obj/effect/gibspawner/human, + /obj/effect/spawner/foam_starter/small, + /obj/item/soap, + /obj/item/clothing/mask/gas/clown_hat, + ) + emotes = list( + BB_EMOTE_SAY = list("HONK!!!", "The Honkmother is merciful, so I must act out her wrath.", "parce mihi ad beatus honkmother placet mihi ut peccata committere,", "DIE!!!"), + BB_EMOTE_HEAR = list("honks", "grunts"), + BB_EMOTE_SEE = list("sweats"), + BB_EMOTE_CHANCE = 5, + ) + +/mob/living/basic/clown/mutant + name = "Unknown" + desc = "Kill it for its own sake." + icon_state = "mutant" + icon_living = "mutant" + move_resist = INFINITY + response_help_continuous = "reluctantly sinks a finger into" + response_help_simple = "reluctantly sink a finger into" + response_disarm_continuous = "squishes into" + response_disarm_simple = "squish into" + response_harm_continuous = "squishes into" + response_harm_simple = "squish into" + maxHealth = 130 + health = 130 + pixel_x = -16 + base_pixel_x = -16 + speed = -5 + melee_damage_lower = 10 + melee_damage_upper = 20 + attack_verb_continuous = "awkwardly flails at" + attack_verb_simple = "awkwardly flail at" + loot = list( + /obj/effect/gibspawner/generic, + /obj/effect/gibspawner/generic/animal, + /obj/effect/gibspawner/human, + /obj/effect/gibspawner/human/bodypartless, + /obj/effect/gibspawner/xeno/bodypartless, + /obj/item/soap, + /obj/item/clothing/mask/gas/clown_hat, + ) + emotes = list( + BB_EMOTE_SAY = list("aaaaaahhhhuuhhhuhhhaaaaa", "AAAaaauuuaaAAAaauuhhh", "huuuuuh... hhhhuuuooooonnnnkk", "HuaUAAAnKKKK"), + BB_EMOTE_SEE = list("squirms", "writhes", "pulsates", "froths", "oozes"), + BB_EMOTE_CHANCE = 10, + ) + +/mob/living/basic/clown/mutant/slow + speed = 20 + +/mob/living/basic/clown/mutant/glutton + name = "banana glutton" + desc = "Something that was once a clown" + icon_state = "glutton" + icon_living = "glutton" + health = 200 + mob_size = MOB_SIZE_LARGE + speed = 1 + melee_damage_lower = 10 + melee_damage_upper = 15 + force_threshold = 10 //lots of fat to cushion blows. + damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 2, STAMINA = 0, OXY = 1) + attack_verb_continuous = "slams" + attack_verb_simple = "slam" + loot = list( + /obj/effect/gibspawner/generic, + /obj/effect/gibspawner/generic/animal, + /obj/effect/gibspawner/human/bodypartless, + /obj/effect/gibspawner/xeno/bodypartless, + ) + emotes = list( + BB_EMOTE_SAY = list("hey, buddy", "HONK!!!", "H-h-h-H-HOOOOONK!!!!", "HONKHONKHONK!!!", "HEY, BUCKO, GET BACK HERE!!!", "HOOOOOOOONK!!!"), + BB_EMOTE_SEE = list("jiggles", "wobbles"), + ) + death_sound = 'sound/misc/sadtrombone.ogg' + waddles = FALSE + ///This is the list of items we are ready to regurgitate, + var/list/prank_pouch = list() + +/mob/living/basic/clown/mutant/glutton/Initialize(mapload) + . = ..() + var/datum/action/cooldown/regurgitate/spit = new(src) + spit.Grant(src) + + AddElement(/datum/element/swabable, CELL_LINE_TABLE_GLUTTON, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) + 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))) + + +/mob/living/basic/clown/mutant/glutton/attacked_by(obj/item/item, mob/living/user) + if(!check_edible(item)) + return ..() + eat_atom(item) + +/mob/living/basic/clown/mutant/glutton/melee_attack(atom/target, list/modifiers, ignore_cooldown = FALSE) + if(!check_edible(target)) + return ..() + eat_atom(target) + +/mob/living/basic/clown/mutant/glutton/UnarmedAttack(atom/victim, proximity_flag, list/modifiers) + if(!check_edible(victim)) + return ..() + eat_atom(victim) + +///Returns whether or not the supplied movable atom is edible. +/mob/living/basic/clown/mutant/glutton/proc/check_edible(atom/movable/potential_food) + if(isliving(potential_food)) + var/mob/living/living_morsel = potential_food + if(living_morsel.mob_size > MOB_SIZE_SMALL) + return FALSE + else + return TRUE + + if(IS_EDIBLE(potential_food)) + if(prank_pouch.len >= 8) + to_chat(src, span_warning("Your prank pouch is filled to the brim! You don't think you can swallow any more morsels right now.")) + return FALSE + return TRUE + +///This proc eats the atom, certain funny items are stored directly in the prank pouch while bananas grant a heal based on their potency and the peels are retained in the pouch. +/mob/living/basic/clown/mutant/glutton/proc/eat_atom(atom/movable/eaten_atom) + + var/static/funny_items = list( + /obj/item/food/pie/cream, + /obj/item/food/grown/tomato, + /obj/item/food/meatclown, + ) + + visible_message(span_warning("[src] eats [eaten_atom]!"), span_notice("You eat [eaten_atom].")) + if(is_type_in_list(eaten_atom, funny_items)) + eaten_atom.forceMove(src) + prank_pouch += eaten_atom + + else + if(istype(eaten_atom, /obj/item/food/grown/banana)) + var/obj/item/food/grown/banana/banana_morsel = eaten_atom + adjustBruteLoss(-banana_morsel.seed.potency * 0.25) + prank_pouch += banana_morsel.generate_trash(src) + + qdel(eaten_atom) + + playsound(loc,'sound/items/eatfood.ogg', rand(30,50), TRUE) + flick("glutton_mouth", src) + +/mob/living/basic/clown/mutant/glutton/proc/tamed(mob/living/tamer) + buckle_lying = 0 + AddElement(/datum/element/ridable, /datum/component/riding/creature/glutton) + +/mob/living/basic/clown/mutant/glutton/Exited(atom/movable/gone, direction) + . = ..() + prank_pouch -= gone + +///This ability will let you fire one random item from your pouch, +/datum/action/cooldown/regurgitate + name = "Regurgitate" + desc = "Regurgitates a single item from the depths of your pouch." + background_icon_state = "bg_changeling" + overlay_icon_state = "bg_changeling_border" + button_icon = 'icons/mob/actions/actions_animal.dmi' + button_icon_state = "regurgitate" + check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_INCAPACITATED + melee_cooldown_time = 0 SECONDS + click_to_activate = TRUE + +/datum/action/cooldown/regurgitate/set_click_ability(mob/on_who) + . = ..() + if(!.) + return + + to_chat(on_who, span_notice("Your throat muscles tense up. Left-click to regurgitate a funny morsel!")) + on_who.icon_state = "glutton_tongue" + on_who.update_appearance(UPDATE_ICON) + +/datum/action/cooldown/regurgitate/unset_click_ability(mob/on_who, refund_cooldown = TRUE) + . = ..() + if(!.) + return + + if(refund_cooldown) + to_chat(on_who, span_notice("Your throat muscles relax.")) + on_who.icon_state = initial(on_who.icon_state) + on_who.update_appearance(UPDATE_ICON) + +/datum/action/cooldown/regurgitate/IsAvailable(feedback = FALSE) + . = ..() + if(!.) + return FALSE + + // Hardcoded to only work with gluttons. Come back next year + return istype(owner, /mob/living/basic/clown/mutant/glutton) + +/datum/action/cooldown/regurgitate/Activate(atom/spit_at) + StartCooldown(cooldown_time / 4) + + var/mob/living/basic/clown/mutant/glutton/pouch_owner = owner + if(!length(pouch_owner.prank_pouch)) + pouch_owner.icon_state = initial(pouch_owner.icon_state) + to_chat(pouch_owner, span_notice("Your prank pouch is empty.")) + return TRUE + + var/obj/item/projected_morsel = pick(pouch_owner.prank_pouch) + projected_morsel.forceMove(pouch_owner.loc) + projected_morsel.throw_at(spit_at, 8, 2, pouch_owner) + flick("glutton_mouth", pouch_owner) + playsound(pouch_owner, 'sound/misc/soggy.ogg', 75) + + StartCooldown() + return TRUE + +/mob/living/basic/clown/banana + name = "Clownana" + desc = "A fusion of clown and banana DNA birthed from a botany experiment gone wrong." + icon_state = "banana tree" + icon_living = "banana tree" + response_disarm_continuous = "peels" + response_disarm_simple = "peel" + response_harm_continuous = "peels" + response_harm_simple = "peel" + maxHealth = 120 + health = 120 + speed = -1 + loot = list( + /obj/effect/gibspawner/human, + /obj/item/seeds/banana, + /obj/item/soap, + /obj/item/clothing/mask/gas/clown_hat, + ) + emotes = list( + BB_EMOTE_SAY = list("HONK", "Honk!", "YA-HONK!!!"), + BB_EMOTE_SEE = list("bites into the banana", "plucks a banana off its head", "photosynthesizes"), + BB_EMOTE_SOUND = list('sound/items/bikehorn.ogg'), + ) + ///Our peel dropping ability + var/datum/action/cooldown/rustle/banana_rustle + ///Our banana bunch spawning ability + var/datum/action/cooldown/exquisite_bunch/banana_bunch + +/mob/living/basic/clown/banana/Initialize(mapload) + . = ..() + banana_rustle = new() + banana_rustle.Grant(src) + banana_bunch = new() + banana_bunch.Grant(src) + +/mob/living/basic/clown/banana/Destroy() + . = ..() + QDEL_NULL(banana_rustle) + QDEL_NULL(banana_bunch) + +///drops peels around the mob when activated +/datum/action/cooldown/rustle + name = "Rustle" + desc = "Shake loose a few banana peels." + cooldown_time = 8 SECONDS + button_icon_state = "rustle" + button_icon = 'icons/mob/actions/actions_clown.dmi' + background_icon_state = "bg_nature" + overlay_icon_state = "bg_nature_border" + ///which type of peel to spawn + var/banana_type = /obj/item/grown/bananapeel + ///How many peels to spawn + var/peel_amount = 3 + +/datum/action/cooldown/rustle/Activate(atom/target) + . = ..() + var/list/reachable_turfs = list() + for(var/turf/adjacent_turf in RANGE_TURFS(1, owner.loc)) + if(adjacent_turf == owner.loc || !owner.CanReach(adjacent_turf) || !isopenturf(adjacent_turf)) + continue + reachable_turfs += adjacent_turf + + var/peels_to_spawn = min(peel_amount, reachable_turfs.len) + for(var/i in 1 to peels_to_spawn) + new banana_type(pick_n_take(reachable_turfs)) + playsound(owner, 'sound/creatures/clown/clownana_rustle.ogg', 60) + animate(owner, time = 1, pixel_x = 6, easing = CUBIC_EASING | EASE_OUT) + animate(time = 2, pixel_x = -8, easing = CUBIC_EASING) + animate(time = 1, pixel_x = 0, easing = CUBIC_EASING | EASE_IN) + StartCooldown() + +///spawns a plumb bunch of bananas imbued with mystical power. +/datum/action/cooldown/exquisite_bunch + name = "Exquisite Bunch" + desc = "Pluck your finest bunch of bananas from your head. This bunch is especially nutrious to monkeykind. A gentle tap will trigger an explosive ripening process." + button_icon = 'icons/obj/service/hydroponics/harvest.dmi' + cooldown_time = 60 SECONDS + button_icon_state = "banana_bunch" + background_icon_state = "bg_nature" + overlay_icon_state = "bg_nature_border" + ///If we are currently activating our ability. + var/activating = FALSE + +/datum/action/cooldown/exquisite_bunch/Trigger(trigger_flags, atom/target) + if(activating) + return + var/bunch_turf = get_step(owner.loc, owner.dir) + if(!bunch_turf) + return + if(!owner.CanReach(bunch_turf) || !isopenturf(bunch_turf)) + owner.balloon_alert(owner, "can't do that here!") + return + activating = TRUE + if(!do_after(owner, 1 SECONDS)) + activating = FALSE + return + playsound(owner, 'sound/creatures/clown/hehe.ogg', 100) + if(!do_after(owner, 1 SECONDS)) + activating = FALSE + return + activating = FALSE + return ..() + +/datum/action/cooldown/exquisite_bunch/Activate(atom/target) + . = ..() + new /obj/item/food/grown/banana/bunch(get_step(owner.loc, owner.dir)) + playsound(owner, 'sound/items/bikehorn.ogg', 60) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), owner, 'sound/creatures/clown/hohoho.ogg', 100, 1), 1 SECONDS) + StartCooldown() diff --git a/code/modules/mob/living/basic/clown/clown_ai.dm b/code/modules/mob/living/basic/clown/clown_ai.dm new file mode 100644 index 0000000000000..b2e6418dde75f --- /dev/null +++ b/code/modules/mob/living/basic/clown/clown_ai.dm @@ -0,0 +1,19 @@ +/datum/ai_controller/basic_controller/clown + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_BASIC_MOB_SPEAK_LINES = null, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/random_speech/blackboard, + ) + +/datum/ai_controller/basic_controller/clown/murder + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/attack_until_dead, + BB_BASIC_MOB_SPEAK_LINES = null, + ) diff --git a/code/modules/mob/living/basic/farm_animals/bee/_bee.dm b/code/modules/mob/living/basic/farm_animals/bee/_bee.dm new file mode 100644 index 0000000000000..655d08aa86482 --- /dev/null +++ b/code/modules/mob/living/basic/farm_animals/bee/_bee.dm @@ -0,0 +1,343 @@ +#define BEE_TRAY_RECENT_VISIT 20 SECONDS //! How long in deciseconds until a tray can be visited by a bee again +#define BEE_DEFAULT_COLOUR "#e5e500" //! the colour we make the stripes of the bee if our reagent has no colour (or we have no reagent) +#define BEE_POLLINATE_YIELD_CHANCE 33 //! chance to increase yield of plant +#define BEE_POLLINATE_PEST_CHANCE 33 //! chance to decrease pest of plant +#define BEE_POLLINATE_POTENCY_CHANCE 50 //! chance to increase potancy of plant +#define BEE_FOODGROUPS RAW | MEAT | GORE | BUGS //! the bee food contents + +/mob/living/basic/bee + name = "bee" + desc = "Buzzy buzzy bee, stingy sti- Ouch!" + icon_state = "" + icon_living = "" + icon = 'icons/mob/simple/bees.dmi' + gender = FEMALE + speak_emote = list("buzzes") + + melee_damage_lower = 1 + melee_damage_upper = 1 + attack_verb_continuous = "stings" + attack_verb_simple = "sting" + response_help_continuous = "shoos" + response_help_simple = "shoo" + response_disarm_continuous = "swats away" + response_disarm_simple = "swat away" + response_harm_continuous = "squashes" + response_harm_simple = "squash" + + mob_size = MOB_SIZE_LARGE + pixel_x = -16 + base_pixel_x = -16 + + speed = 1 + maxHealth = 10 + health = 10 + melee_damage_lower = 1 + melee_damage_upper = 1 + faction = list(FACTION_HOSTILE) + pass_flags = PASSTABLE | PASSGRILLE | PASSMOB | PASSMACHINE + mob_size = MOB_SIZE_TINY + mob_biotypes = MOB_ORGANIC|MOB_BUG + density = FALSE + gold_core_spawnable = FRIENDLY_SPAWN + can_be_held = TRUE + held_w_class = WEIGHT_CLASS_TINY + environment_smash = ENVIRONMENT_SMASH_NONE + habitable_atmos = 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) + basic_mob_flags = DEL_ON_DEATH + ai_controller = /datum/ai_controller/basic_controller/bee + ///the reagent the bee has + var/datum/reagent/beegent = null + ///the house we live in + var/obj/structure/beebox/beehome = null + ///our icon base + var/icon_base = "bee" + ///the bee is a queen? + var/is_queen = FALSE + +/mob/living/basic/bee/Initialize(mapload) + . = ..() + add_traits(list(TRAIT_SPACEWALK, TRAIT_VENTCRAWLER_ALWAYS), INNATE_TRAIT) + generate_bee_visuals() + AddElement(/datum/element/simple_flying) + AddComponent(/datum/component/clickbox, x_offset = -2, y_offset = -2) + AddComponent(/datum/component/swarming) + AddElement(/datum/element/swabable, CELL_LINE_TABLE_QUEEN_BEE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) + +/mob/living/basic/bee/mob_pickup(mob/living/picker) + if(flags_1 & HOLOGRAM_1) + return + var/obj/item/clothing/head/mob_holder/destructible/holder = new(get_turf(src), src, held_state, head_icon, held_lh, held_rh, worn_slot_flags) + var/list/reee = list(/datum/reagent/consumable/nutriment/vitamin = 5) + if(beegent) + reee[beegent.type] = 5 + holder.AddComponent(/datum/component/edible, reee, null, BEE_FOODGROUPS, 10, 0, list("bee"), null, 10) + picker.visible_message(span_warning("[picker] scoops up [src]!")) + picker.put_in_hands(holder) + +/mob/living/basic/bee/will_escape_storage() + return TRUE + +/mob/living/basic/bee/examine(mob/user) + . = ..() + + if(isnull(beehome)) + . += span_warning("This bee is homeless!") + +/mob/living/basic/bee/Destroy() + if(beehome) + beehome.bees -= src + beehome = null + beegent = null + return ..() + +/mob/living/basic/bee/death(gibbed) + if(beehome) + beehome.bees -= src + beehome = null + beegent = null + if(flags_1 & HOLOGRAM_1 || gibbed) + return ..() + new /obj/item/trash/bee(loc, src) + return ..() + +/mob/living/basic/bee/proc/pre_attack(mob/living/puncher, atom/target) + SIGNAL_HANDLER + + if(istype(target, /obj/machinery/hydroponics)) + var/obj/machinery/hydroponics/hydro = target + pollinate(hydro) + return COMPONENT_HOSTILE_NO_ATTACK + + if(istype(target, /obj/structure/beebox)) + var/obj/structure/beebox/hive = target + handle_habitation(hive) + return COMPONENT_HOSTILE_NO_ATTACK + +/mob/living/basic/bee/proc/handle_habitation(obj/structure/beebox/hive) + if(hive == beehome) //if its our home, we enter or exit it + var/drop_location = (src in beehome.contents) ? get_turf(beehome) : beehome + forceMove(drop_location) + return + if(!isnull(hive.queen_bee) && is_queen) //if we are queen and house already have a queen, dont inhabit + return + if(!hive.habitable(src) || !isnull(beehome)) //if not habitable or we alrdy have a home + return + beehome = hive + beehome.bees += src + if(is_queen) + beehome.queen_bee = src + +/mob/living/basic/bee/proc/reagent_incompatible(mob/living/basic/bee/ruler) + if(!ruler) + return FALSE + if(ruler.beegent?.type != beegent?.type) + return TRUE + return FALSE + +/mob/living/basic/bee/proc/generate_bee_visuals() + cut_overlays() + + var/bee_color = BEE_DEFAULT_COLOUR + if(beegent?.color) + bee_color = beegent.color + + icon_state = "[icon_base]_base" + add_overlay("[icon_base]_base") + + var/static/mutable_appearance/greyscale_overlay + greyscale_overlay = greyscale_overlay || mutable_appearance('icons/mob/simple/bees.dmi') + greyscale_overlay.icon_state = "[icon_base]_grey" + greyscale_overlay.color = bee_color + add_overlay(greyscale_overlay) + + add_overlay("[icon_base]_wings") + +/mob/living/basic/bee/proc/pollinate(obj/machinery/hydroponics/hydro) + if(!hydro.can_bee_pollinate()) + return FALSE + hydro.recent_bee_visit = TRUE + addtimer(VARSET_CALLBACK(hydro, recent_bee_visit, FALSE), BEE_TRAY_RECENT_VISIT) + + var/growth = health //Health also means how many bees are in the swarm, roughly. + //better healthier plants! + hydro.adjust_plant_health(growth*0.5) + if(prob(BEE_POLLINATE_PEST_CHANCE)) + hydro.adjust_pestlevel(-10) + if(prob(BEE_POLLINATE_YIELD_CHANCE)) + hydro.myseed.adjust_yield(1) + hydro.yieldmod = 2 + if(prob(BEE_POLLINATE_POTENCY_CHANCE)) + hydro.myseed.adjust_potency(1) + + if(beehome) + beehome.bee_resources = min(beehome.bee_resources + growth, 100) + +/mob/living/basic/bee/proc/assign_reagent(datum/reagent/toxin) + if(!istype(toxin)) + return + var/static/list/injection_range + if(!injection_range) + injection_range = string_numbers_list(list(1, 5)) + if(beegent) //clear the old since this one is going to have some new value + RemoveElement(/datum/element/venomous, beegent.type, injection_range) + beegent = toxin + name = "[initial(name)] ([toxin.name])" + real_name = name + AddElement(/datum/element/venomous, beegent.type, injection_range) + generate_bee_visuals() + +/mob/living/basic/bee/queen + name = "queen bee" + desc = "She's the queen of bees, BZZ BZZ!" + icon_base = "queen" + is_queen = TRUE + ai_controller = /datum/ai_controller/basic_controller/queen_bee + +/mob/living/basic/bee/queen/will_escape_storage() + return FALSE + +/mob/living/basic/bee/toxin + desc = "This bee is holding some sort of fluid." + +/mob/living/basic/bee/toxin/Initialize(mapload) + . = ..() + var/datum/reagent/toxin = pick(typesof(/datum/reagent/toxin)) + assign_reagent(GLOB.chemical_reagents_list[toxin]) + +/mob/living/basic/bee/short + desc = "These bees seem unstable and won't survive for long." + +/mob/living/basic/bee/short/Initialize(mapload, timetolive=50 SECONDS) + . = ..() + addtimer(CALLBACK(src, PROC_REF(death)), timetolive) + +/obj/item/queen_bee + name = "queen bee" + desc = "She's the queen of bees, BZZ BZZ!" + icon_state = "queen_item" + inhand_icon_state = "" + icon = 'icons/mob/simple/bees.dmi' + /// The actual mob that our bee item corresponds to + var/mob/living/basic/bee/queen/queen + +/obj/item/queen_bee/Initialize(mapload) + . = ..() + AddElement(/datum/element/swabable, CELL_LINE_TABLE_QUEEN_BEE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) + RegisterSignal(src, COMSIG_ATOM_ATTACKBY, PROC_REF(handle_needle)) + +/obj/item/queen_bee/Destroy() + QDEL_NULL(queen) + return ..() + +/obj/item/queen_bee/Exited(atom/movable/gone, direction) + . = ..() + if(gone != queen) + return + queen = null + // the bee should not exist without a bee. + if(!QDELETED(src)) + qdel(src) + +/obj/item/queen_bee/proc/handle_needle(obj/item/source, obj/item/syringe, mob/living/user, params) + SIGNAL_HANDLER + + if(!istype(syringe, /obj/item/reagent_containers/syringe)) + return + var/obj/item/reagent_containers/syringe/needle = syringe + if(needle.reagents.has_reagent(/datum/reagent/royal_bee_jelly, 5)) //checked twice, because I really don't want royal bee jelly to be duped + needle.reagents.remove_reagent(/datum/reagent/royal_bee_jelly, 5) + var/obj/item/queen_bee/new_bee = new(get_turf(src)) + new_bee.queen = new(new_bee) + if(queen?.beegent) + new_bee.queen.assign_reagent(queen.beegent) //Bees use the global singleton instances of reagents, so we don't need to worry about one bee being deleted and her copies losing their reagents. + user.put_in_active_hand(new_bee) + user.visible_message(span_notice("[user] injects [src] with royal bee jelly, causing it to split into two bees, MORE BEES!"),span_warning("You inject [src] with royal bee jelly, causing it to split into two bees, MORE BEES!")) + return + var/datum/reagent/chemical = needle.reagents.get_master_reagent() + if(isnull(chemical)) + return + if(!(chemical.chemical_flags & REAGENT_CAN_BE_SYNTHESIZED)) + to_chat(user, span_warning("[chemical.name] cannot be inserted into a bee's genome!")) + return + if(chemical.type == queen.beegent?.type) + to_chat(user, span_warning("[queen] already has this chemical!")) + return + if(!(needle.reagents.has_reagent(chemical.type, 5))) + to_chat(user, span_warning("You don't have enough units of that chemical to modify the bee's DNA!")) + return + needle.reagents.remove_reagent(chemical.type, 5) + var/datum/reagent/bee_chem = GLOB.chemical_reagents_list[chemical.type] + queen.assign_reagent(bee_chem) + user.visible_message(span_warning("[user] injects [src]'s genome with [chemical.name], mutating its DNA!"),span_warning("You inject [src]'s genome with [chemical.name], mutating its DNA!")) + name = queen.name + +/obj/item/queen_bee/suicide_act(mob/living/user) + user.visible_message(span_suicide("[user] eats [src]! It looks like [user.p_theyre()] trying to commit suicide!")) + user.say("IT'S HIP TO EAT BEES!") + qdel(src) + return TOXLOSS + +/obj/item/queen_bee/bought + +/obj/item/queen_bee/bought/Initialize(mapload) + . = ..() + queen = new(src) + +/obj/item/trash/bee + name = "bee" + desc = "No wonder the bees are dying out, you monster." + icon = 'icons/mob/simple/bees.dmi' + icon_state = "bee_item" + ///the reagent the bee carry + var/datum/reagent/beegent + ///the bee of this corpse + var/bee_type = /mob/living/basic/bee + +/obj/item/trash/bee/Initialize(mapload, mob/living/basic/bee/dead_bee) + . = ..() + AddComponent(/datum/component/edible, list(/datum/reagent/consumable/nutriment/vitamin = 5), null, BEE_FOODGROUPS, 10, 0, list("bee"), null, 10) + AddElement(/datum/element/swabable, CELL_LINE_TABLE_QUEEN_BEE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) + RegisterSignal(src, COMSIG_ATOM_ON_LAZARUS_INJECTOR, PROC_REF(use_lazarus)) + if(isnull(dead_bee)) + return + pixel_x = dead_bee.pixel_x + pixel_y = dead_bee.pixel_y + bee_type = dead_bee.type + if(dead_bee.beegent) + beegent = dead_bee.beegent + reagents.add_reagent(beegent.type, 5) + update_appearance() + + +/obj/item/trash/bee/Destroy() + beegent = null + return ..() + +/obj/item/trash/bee/update_overlays() + . = ..() + var/mutable_appearance/body_overlay = mutable_appearance(icon = icon, icon_state = "bee_item_overlay") + body_overlay.color = beegent ? beegent.color : BEE_DEFAULT_COLOUR + . += body_overlay + +///Spawn a new bee from this trash item when hit by a lazarus injector and conditions are met. +/obj/item/trash/bee/proc/use_lazarus(datum/source, obj/item/lazarus_injector/injector, mob/user) + SIGNAL_HANDLER + if(injector.revive_type != SENTIENCE_ORGANIC) + balloon_alert(user, "invalid creature!") + return + var/mob/living/basic/bee/revived_bee = new bee_type (drop_location()) + if(beegent) + revived_bee.assign_reagent(beegent) + revived_bee.lazarus_revive(user, injector.malfunctioning) + injector.expend(revived_bee, user) + qdel(src) + return LAZARUS_INJECTOR_USED + +#undef BEE_DEFAULT_COLOUR +#undef BEE_FOODGROUPS +#undef BEE_POLLINATE_PEST_CHANCE +#undef BEE_POLLINATE_POTENCY_CHANCE +#undef BEE_POLLINATE_YIELD_CHANCE +#undef BEE_TRAY_RECENT_VISIT diff --git a/code/modules/mob/living/basic/farm_animals/bee/bee_ai_behavior.dm b/code/modules/mob/living/basic/farm_animals/bee/bee_ai_behavior.dm new file mode 100644 index 0000000000000..017eac3cb51db --- /dev/null +++ b/code/modules/mob/living/basic/farm_animals/bee/bee_ai_behavior.dm @@ -0,0 +1,110 @@ +/// if we have a hive, this will be our aggro distance +#define AGGRO_DISTANCE_FROM_HIVE 2 +/datum/ai_behavior/hunt_target/pollinate + always_reset_target = TRUE + +/datum/ai_behavior/hunt_target/pollinate/target_caught(mob/living/hunter, obj/machinery/hydroponics/hydro_target) + var/datum/callback/callback = CALLBACK(hunter, TYPE_PROC_REF(/mob/living/basic/bee, pollinate), hydro_target) + callback.Invoke() + +/datum/ai_behavior/find_hunt_target/pollinate + +/datum/ai_behavior/find_hunt_target/pollinate/valid_dinner(mob/living/source, obj/machinery/hydroponics/dinner, radius) + if(!dinner.can_bee_pollinate()) + return FALSE + return can_see(source, dinner, radius) + +/datum/ai_behavior/enter_exit_hive + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH + +/datum/ai_behavior/enter_exit_hive/setup(datum/ai_controller/controller, target_key, attack_key) + . = ..() + var/atom/target = controller.blackboard[target_key] + if(QDELETED(target)) + return FALSE + set_movement_target(controller, target) + +/datum/ai_behavior/enter_exit_hive/perform(seconds_per_tick, datum/ai_controller/controller, target_key, attack_key) + . = ..() + var/obj/structure/beebox/current_home = controller.blackboard[target_key] + var/mob/living/bee_pawn = controller.pawn + var/atom/attack_target = controller.blackboard[attack_key] + + if(attack_target) // forget about who we attacking when we go home + controller.clear_blackboard_key(attack_key) + + var/datum/callback/callback = CALLBACK(bee_pawn, TYPE_PROC_REF(/mob/living/basic/bee, handle_habitation), current_home) + callback.Invoke() + finish_action(controller, TRUE) + +/datum/ai_behavior/inhabit_hive + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH + +/datum/ai_behavior/inhabit_hive/setup(datum/ai_controller/controller, target_key) + . = ..() + var/atom/target = controller.blackboard[target_key] + if(QDELETED(target)) + return FALSE + set_movement_target(controller, target) + +/datum/ai_behavior/inhabit_hive/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + var/obj/structure/beebox/potential_home = controller.blackboard[target_key] + var/mob/living/bee_pawn = controller.pawn + + if(!potential_home.habitable(bee_pawn)) //the house become full before we get to it + finish_action(controller, FALSE, target_key) + return + + var/datum/callback/callback = CALLBACK(bee_pawn, TYPE_PROC_REF(/mob/living/basic/bee, handle_habitation), potential_home) + callback.Invoke() + finish_action(controller, TRUE, target_key) + +/datum/ai_behavior/inhabit_hive/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + if(!succeeded) + controller.clear_blackboard_key(target_key) //failed to make it our home so find another + +/datum/ai_behavior/find_and_set/bee_hive + action_cooldown = 10 SECONDS + +/datum/ai_behavior/find_and_set/bee_hive/search_tactic(datum/ai_controller/controller, locate_path, search_range) + var/list/valid_hives = list() + var/mob/living/bee_pawn = controller.pawn + + if(istype(bee_pawn.loc, /obj/structure/beebox)) + return bee_pawn.loc //for premade homes + + for(var/obj/structure/beebox/potential_home in oview(search_range, bee_pawn)) + if(!potential_home.habitable(bee_pawn)) + continue + valid_hives += potential_home + + if(valid_hives.len) + return pick(valid_hives) + +/datum/targetting_datum/basic/bee + +/datum/targetting_datum/basic/bee/can_attack(mob/living/owner, atom/target) + if(!isliving(target)) + return FALSE + . = ..() + if(!.) + return FALSE + + var/mob/living/mob_target = target + + if(mob_target.mob_biotypes & MOB_PLANT) + return FALSE + + var/datum/ai_controller/basic_controller/bee_ai = owner.ai_controller + if(isnull(bee_ai)) + return FALSE + + var/atom/bee_hive = bee_ai.blackboard[BB_CURRENT_HOME] + if(bee_hive && get_dist(target, bee_hive) > AGGRO_DISTANCE_FROM_HIVE) + return FALSE + + return !(mob_target.bee_friendly()) + +#undef AGGRO_DISTANCE_FROM_HIVE diff --git a/code/modules/mob/living/basic/farm_animals/bee/bee_ai_subtree.dm b/code/modules/mob/living/basic/farm_animals/bee/bee_ai_subtree.dm new file mode 100644 index 0000000000000..e2d6ac04f7e38 --- /dev/null +++ b/code/modules/mob/living/basic/farm_animals/bee/bee_ai_subtree.dm @@ -0,0 +1,91 @@ +/datum/ai_controller/basic_controller/bee + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/bee, + ) + + ai_traits = STOP_MOVING_WHEN_PULLED + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + + planning_subtrees = list( + /datum/ai_planning_subtree/find_valid_home, + /datum/ai_planning_subtree/enter_exit_home, + /datum/ai_planning_subtree/find_and_hunt_target/pollinate, + /datum/ai_planning_subtree/simple_find_target/bee, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/datum/ai_planning_subtree/simple_find_target/bee/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/atom/hydro_target = controller.blackboard[BB_TARGET_HYDRO] + if(hydro_target) + return SUBTREE_RETURN_FINISH_PLANNING + return ..() + +/datum/ai_controller/basic_controller/queen_bee + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/bee, + ) + + ai_traits = STOP_MOVING_WHEN_PULLED + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + + planning_subtrees = list( + /datum/ai_planning_subtree/find_valid_home, + /datum/ai_planning_subtree/enter_exit_home/queen, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + + +/datum/ai_planning_subtree/find_valid_home + +/datum/ai_planning_subtree/find_valid_home/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/work_bee = controller.pawn + + var/obj/structure/beebox/current_home = controller.blackboard[BB_CURRENT_HOME] + + if(QDELETED(current_home)) + controller.queue_behavior(/datum/ai_behavior/find_and_set/bee_hive, BB_CURRENT_HOME, /obj/structure/beebox) + return + + if(work_bee in current_home.bees) + return + + controller.queue_behavior(/datum/ai_behavior/inhabit_hive, BB_CURRENT_HOME) + return SUBTREE_RETURN_FINISH_PLANNING + +/datum/ai_planning_subtree/enter_exit_home + ///chance we go back home + var/flyback_chance = 15 + ///chance we exit the home + var/exit_chance = 35 + +/datum/ai_planning_subtree/enter_exit_home/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + + var/obj/structure/beebox/current_home = controller.blackboard[BB_CURRENT_HOME] + + if(QDELETED(current_home)) + return + + var/mob/living/bee_pawn = controller.pawn + var/action_prob = (bee_pawn in current_home.contents) ? exit_chance : flyback_chance + + if(!SPT_PROB(action_prob, seconds_per_tick)) + return + + controller.queue_behavior(/datum/ai_behavior/enter_exit_hive, BB_CURRENT_HOME, BB_BASIC_MOB_CURRENT_TARGET) + return SUBTREE_RETURN_FINISH_PLANNING + +//the queen spend more time in the hive +/datum/ai_planning_subtree/enter_exit_home/queen + flyback_chance = 85 + exit_chance = 5 + +/datum/ai_planning_subtree/find_and_hunt_target/pollinate + target_key = BB_TARGET_HYDRO + hunting_behavior = /datum/ai_behavior/hunt_target/pollinate + finding_behavior = /datum/ai_behavior/find_hunt_target/pollinate + hunt_targets = list(/obj/machinery/hydroponics) + hunt_range = 10 + hunt_chance = 85 diff --git a/code/modules/mob/living/basic/farm_animals/chicken/chick.dm b/code/modules/mob/living/basic/farm_animals/chicken/chick.dm index 339b2c5e7f539..311b311e8fd75 100644 --- a/code/modules/mob/living/basic/farm_animals/chicken/chick.dm +++ b/code/modules/mob/living/basic/farm_animals/chicken/chick.dm @@ -28,6 +28,7 @@ pass_flags = PASSTABLE | PASSGRILLE | PASSMOB mob_size = MOB_SIZE_TINY gold_core_spawnable = FRIENDLY_SPAWN + ai_controller = /datum/ai_controller/basic_controller/chick /// What we grow into. var/grow_as = /mob/living/basic/chicken @@ -62,3 +63,17 @@ /// Variant of chick that just spawns in the holodeck so you can pet it. Doesn't grow up. /mob/living/basic/chick/permanent grow_as = null + +/datum/ai_controller/basic_controller/chick + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_FIND_MOM_TYPES = list(/mob/living/basic/chicken), + ) + + ai_traits = STOP_MOVING_WHEN_PULLED + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + + planning_subtrees = list( + /datum/ai_planning_subtree/look_for_adult, + ) diff --git a/code/modules/mob/living/basic/farm_animals/chicken/chicken.dm b/code/modules/mob/living/basic/farm_animals/chicken/chicken.dm index b3eb18e0cd489..89f5174f15e0d 100644 --- a/code/modules/mob/living/basic/farm_animals/chicken/chicken.dm +++ b/code/modules/mob/living/basic/farm_animals/chicken/chicken.dm @@ -49,7 +49,7 @@ GLOBAL_VAR_INIT(chicken_count, 0) AddElement(/datum/element/animal_variety, "chicken", pick("brown", "black", "white"), modify_pixels = TRUE) AddComponent(\ /datum/component/egg_layer,\ - /obj/item/food/egg,\ + /obj/item/food/egg/organic,\ list(/obj/item/food/grown/wheat),\ feed_messages = list("She clucks contently."),\ lay_messages = EGG_LAYING_MESSAGES,\ diff --git a/code/modules/mob/living/basic/farm_animals/cow/_cow.dm b/code/modules/mob/living/basic/farm_animals/cow/_cow.dm index 949a3cd0c34ee..8777cf5a4d1a8 100644 --- a/code/modules/mob/living/basic/farm_animals/cow/_cow.dm +++ b/code/modules/mob/living/basic/farm_animals/cow/_cow.dm @@ -11,7 +11,7 @@ mob_biotypes = MOB_ORGANIC | MOB_BEAST speak_emote = list("moos","moos hauntingly") speed = 1.1 - butcher_results = list(/obj/item/food/meat/slab = 6) + butcher_results = list(/obj/item/food/meat/slab/grassfed = 6) response_help_continuous = "pets" response_help_simple = "pet" response_disarm_continuous = "gently pushes aside" diff --git a/code/modules/mob/living/basic/farm_animals/deer.dm b/code/modules/mob/living/basic/farm_animals/deer.dm index 9daf27452d473..445ad831e5951 100644 --- a/code/modules/mob/living/basic/farm_animals/deer.dm +++ b/code/modules/mob/living/basic/farm_animals/deer.dm @@ -7,7 +7,7 @@ gender = FEMALE mob_biotypes = MOB_ORGANIC|MOB_BEAST speak_emote = list("grunts", "grunts lowly") - butcher_results = list(/obj/item/food/meat/slab = 3) + butcher_results = list(/obj/item/food/meat/slab/grassfed = 3) response_help_continuous = "pets" response_help_simple = "pet" response_disarm_continuous = "gently nudges" @@ -47,3 +47,8 @@ /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee, /datum/ai_planning_subtree/flee_target, ) + +/// Cold resistent and doesn't need to breathe +/mob/living/basic/deer/ice + habitable_atmos = 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) + minimum_survivable_temperature = 0 diff --git a/code/modules/mob/living/basic/farm_animals/goat/_goat.dm b/code/modules/mob/living/basic/farm_animals/goat/_goat.dm new file mode 100644 index 0000000000000..f698e5015e8c7 --- /dev/null +++ b/code/modules/mob/living/basic/farm_animals/goat/_goat.dm @@ -0,0 +1,135 @@ +/// The Greatest (animal) Of All Time. Cud chewing, shin-kicking, kitchen-dwelling nuisance. +/mob/living/basic/goat + name = "goat" + desc = "Not known for their pleasant disposition." + icon_state = "goat" + icon_living = "goat" + icon_dead = "goat_dead" + + speak_emote = list("brays") + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "kicks" + response_harm_simple = "kick" + attack_verb_continuous = "kicks" + attack_verb_simple = "kick" + attack_sound = 'sound/weapons/punch1.ogg' + attack_vis_effect = ATTACK_EFFECT_KICK + + butcher_results = list(/obj/item/food/meat/slab/grassfed = 4) + + faction = list(FACTION_NEUTRAL) + mob_biotypes = MOB_ORGANIC | MOB_BEAST + + health = 40 + maxHealth = 40 + melee_damage_lower = 1 + melee_damage_upper = 2 + environment_smash = ENVIRONMENT_SMASH_NONE + + minimum_survivable_temperature = COLD_ROOM_TEMP - 75 // enough so that they can survive the cold room spawn with plenty of room for comfort + + blood_volume = BLOOD_VOLUME_NORMAL + + ai_controller = /datum/ai_controller/basic_controller/goat + + /// List of stuff (flora) that we want to eat + var/static/list/edibles = list( + /obj/structure/alien/resin/flower_bud, + /obj/structure/glowshroom, + /obj/structure/spacevine, + ) + +/mob/living/basic/goat/Initialize(mapload) + . = ..() + add_udder() + AddElement(/datum/element/cliff_walking) //we walk the cliff + AddElement(/datum/element/footstep, footstep_type = FOOTSTEP_MOB_SHOE) + AddElement(/datum/element/ai_retaliate) + + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(on_pre_attack)) + RegisterSignal(src, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked)) + RegisterSignal(src, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_move)) + + ai_controller.set_blackboard_key(BB_BASIC_FOODS, edibles) + +/// Called when we attack something in order to piece together the intent of the AI/user and provide desired behavior. The element might be okay here but I'd rather the fluff. +/// Goats are really good at beating up plants by taking bites out of them, but we use the default attack for everything else +/mob/living/basic/goat/proc/on_pre_attack(datum/source, atom/target) + if(is_type_in_list(target, edibles)) + eat_plant(list(target)) + return COMPONENT_HOSTILE_NO_ATTACK + + if(!isliving(target)) + return + + var/mob/living/living_target = target + if(!(living_target.mob_biotypes & MOB_PLANT)) + return + + living_target.adjustBruteLoss(20) + playsound(src, 'sound/items/eatfood.ogg', rand(30, 50), TRUE) + var/obj/item/bodypart/edible_bodypart + + if(ishuman(living_target)) + var/mob/living/carbon/human/plant_man = target + edible_bodypart = pick(plant_man.bodyparts) + edible_bodypart.dismember() + + living_target.visible_message( + span_warning("[src] takes a big chomp out of [living_target]!"), + span_userdanger("[src] takes a big chomp out of your [edible_bodypart || "body"]!"), + ) + + return COMPONENT_HOSTILE_NO_ATTACK + +/// If we are being attacked by someone who we are already retaliating against, give a nice fluff message. +/mob/living/basic/goat/proc/on_attacked(datum/source, atom/attacker, attack_flags) + var/is_attacker_shitlisted = locate(attacker) in ai_controller.blackboard[BB_BASIC_MOB_RETALIATE_LIST] + if(!is_attacker_shitlisted) + return + + visible_message( + span_danger("[src] gets an evil-looking gleam in [p_their()] eye."), + ) + +/// Handles automagically eating a plant when we move into a turf that has one. +/mob/living/basic/goat/proc/on_move(datum/source, atom/entering_loc) + SIGNAL_HANDLER + if(!isturf(entering_loc)) + return + + var/list/edible_plants = list() + for(var/obj/target in entering_loc) + if(is_type_in_list(target, edibles)) + edible_plants += target + + INVOKE_ASYNC(src, PROC_REF(eat_plant), edible_plants) + +/// When invoked, adds an udder. Overridden on subtypes +/mob/living/basic/goat/proc/add_udder() + AddComponent(/datum/component/udder) + +/// Proc that handles dealing with the various types of plants we might eat. Assumes that a valid list of type(s) will be passed in. +/mob/living/basic/goat/proc/eat_plant(list/plants) + var/eaten = FALSE + + for(var/atom/target as anything in plants) + if(istype(target, /obj/structure/spacevine)) + var/obj/structure/spacevine/vine = target + vine.eat(src) + eaten = TRUE + + if(istype(target, /obj/structure/alien/resin/flower_bud)) + target.take_damage(rand(30, 50), BRUTE, 0) + eaten = TRUE + + if(istype(target, /obj/structure/glowshroom)) + qdel(target) + eaten = TRUE + + if(eaten && prob(10)) + say("Nom") // bon appetit + playsound(src, 'sound/items/eatfood.ogg', rand(30, 50), TRUE) diff --git a/code/modules/mob/living/basic/farm_animals/goat/goat_ai.dm b/code/modules/mob/living/basic/farm_animals/goat/goat_ai.dm new file mode 100644 index 0000000000000..41fc448a3b6ac --- /dev/null +++ b/code/modules/mob/living/basic/farm_animals/goat/goat_ai.dm @@ -0,0 +1,22 @@ +/// Goats are normally content to sorta hang around and crunch any plant in sight, but they will go ape on someone who attacks them. +/datum/ai_controller/basic_controller/goat + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + ) + + ai_traits = STOP_MOVING_WHEN_PULLED + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/find_food, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/random_speech/goat, + ) + +/datum/ai_planning_subtree/random_speech/goat + speech_chance = 3 + emote_hear = list("brays.") + emote_see = list("shakes their head.", "stamps a foot.", "glares around.") + speak = list("EHEHEHEHEH", "eh?") diff --git a/code/modules/mob/living/basic/farm_animals/goat/goat_subtypes.dm b/code/modules/mob/living/basic/farm_animals/goat/goat_subtypes.dm new file mode 100644 index 0000000000000..0638163d03248 --- /dev/null +++ b/code/modules/mob/living/basic/farm_animals/goat/goat_subtypes.dm @@ -0,0 +1,12 @@ +/mob/living/basic/goat/pete // Pete! + name = "Pete" + gender = MALE + +/mob/living/basic/goat/pete/examine() + . = ..() + var/area/goat_area = get_area(src) + if((bodytemperature < T20C) || istype(goat_area, /area/station/service/kitchen/coldroom)) + . = span_notice("[p_They()] [p_do()]n't seem to be too bothered about the cold.") // special for pete + +/mob/living/basic/goat/pete/add_udder() + return //no thank you diff --git a/code/modules/mob/living/basic/farm_animals/pony.dm b/code/modules/mob/living/basic/farm_animals/pony.dm new file mode 100644 index 0000000000000..4bc09391cb718 --- /dev/null +++ b/code/modules/mob/living/basic/farm_animals/pony.dm @@ -0,0 +1,88 @@ +/mob/living/basic/pony + name = "pony" + desc = "Look at my horse, my horse is amazing!" + icon_state = "pony" + icon_living = "pony" + icon_dead = "pony_dead" + gender = MALE + mob_biotypes = MOB_ORGANIC | MOB_BEAST + speak_emote = list("neighs", "winnies") + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "kicks" + response_harm_simple = "kick" + attack_verb_continuous = "kicks" + attack_verb_simple = "kick" + attack_sound = 'sound/weapons/punch1.ogg' + attack_vis_effect = ATTACK_EFFECT_KICK + melee_damage_lower = 5 + melee_damage_upper = 10 + health = 50 + maxHealth = 50 + gold_core_spawnable = FRIENDLY_SPAWN + blood_volume = BLOOD_VOLUME_NORMAL + ai_controller = /datum/ai_controller/basic_controller/pony + +/mob/living/basic/pony/Initialize(mapload) + . = ..() + + AddElement(/datum/element/pet_bonus, "whickers.") + AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/ai_flee_while_injured) + AddElement(/datum/element/waddling) + AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/grown/apple), tame_chance = 25, bonus_tame_chance = 15, after_tame = CALLBACK(src, PROC_REF(tamed))) + +/mob/living/basic/pony/proc/tamed(mob/living/tamer) + can_buckle = TRUE + buckle_lying = 0 + playsound(src, 'sound/creatures/pony/snort.ogg', 50) + AddElement(/datum/element/ridable, /datum/component/riding/creature/pony) + visible_message(span_notice("[src] snorts happily.")) + + ai_controller.replace_planning_subtrees(list( + /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee, + /datum/ai_planning_subtree/flee_target, + /datum/ai_planning_subtree/random_speech/pony/tamed + )) + +/mob/living/basic/pony/proc/whinny_angrily() + manual_emote("whinnies ANGRILY!") + + playsound(src, pick(list( + 'sound/creatures/pony/whinny01.ogg', + 'sound/creatures/pony/whinny02.ogg', + 'sound/creatures/pony/whinny03.ogg' + )), 50) + +/mob/living/basic/pony/take_damage(damage_amount, damage_type, damage_flag, sound_effect, attack_dir, armour_penetration) + . = ..() + + if (prob(33)) + whinny_angrily() + +/mob/living/basic/pony/melee_attack(atom/target, list/modifiers, ignore_cooldown = FALSE) + . = ..() + + if (!.) + return + + whinny_angrily() + +/datum/ai_controller/basic_controller/pony + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction, + ) + + ai_traits = STOP_MOVING_WHEN_PULLED + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + + planning_subtrees = list( + /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee, + /datum/ai_planning_subtree/flee_target, + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/random_speech/pony + ) diff --git a/code/modules/mob/living/basic/farm_animals/rabbit.dm b/code/modules/mob/living/basic/farm_animals/rabbit.dm index 071470264dbb9..92d40e0228e2d 100644 --- a/code/modules/mob/living/basic/farm_animals/rabbit.dm +++ b/code/modules/mob/living/basic/farm_animals/rabbit.dm @@ -17,6 +17,8 @@ mob_biotypes = MOB_ORGANIC | MOB_BEAST health = 15 maxHealth = 15 + mob_size = MOB_SIZE_SMALL + can_be_held = TRUE density = FALSE gold_core_spawnable = FRIENDLY_SPAWN speak_emote = list("sniffles", "twitches") @@ -30,7 +32,7 @@ response_harm_simple = "kick" attack_verb_continuous = "kicks" attack_verb_simple = "kick" - butcher_results = list(/obj/item/food/meat/slab = 1) + butcher_results = list(/obj/item/food/meat/slab/grassfed = 1) unsuitable_cold_damage = 0.5 // Cold damage is 0.5 here to account for low health on the rabbit. unsuitable_heat_damage = 0.5 // Heat damage is 0.5 here to account for low health on the rabbit. ai_controller = /datum/ai_controller/basic_controller/rabbit diff --git a/code/modules/mob/living/basic/farm_animals/sheep.dm b/code/modules/mob/living/basic/farm_animals/sheep.dm index 4102bd83fdf63..691f1db14e3ce 100644 --- a/code/modules/mob/living/basic/farm_animals/sheep.dm +++ b/code/modules/mob/living/basic/farm_animals/sheep.dm @@ -9,7 +9,7 @@ mob_biotypes = MOB_ORGANIC | MOB_BEAST speak_emote = list("baas","bleats") speed = 1.1 - butcher_results = list(/obj/item/food/meat/slab = 3) + butcher_results = list(/obj/item/food/meat/slab/grassfed = 3) response_help_continuous = "pets" response_help_simple = "pet" response_disarm_continuous = "gently pushes aside" diff --git a/code/modules/mob/living/basic/festivus_pole.dm b/code/modules/mob/living/basic/festivus_pole.dm index 0a453f2c9e6c7..058b74bfad872 100644 --- a/code/modules/mob/living/basic/festivus_pole.dm +++ b/code/modules/mob/living/basic/festivus_pole.dm @@ -1,7 +1,7 @@ /mob/living/basic/festivus name = "festivus pole" desc = "Serenity now... SERENITY NOW!" - icon = 'icons/obj/flora/pinetrees.dmi' + icon = 'icons/obj/fluff/flora/pinetrees.dmi' icon_state = "festivus_pole" icon_living = "festivus_pole" icon_dead = "festivus_pole" @@ -42,7 +42,10 @@ /mob/living/basic/festivus/Initialize(mapload) . = ..() - AddElement(/datum/element/death_drops, list(/obj/item/stack/rods)) + AddComponent(/datum/component/seethrough_mob) + var/static/list/death_loot = list(/obj/item/stack/rods) + AddElement(/datum/element/death_drops, death_loot) + AddComponent(/datum/component/aggro_emote, emote_list = string_list(list("growls")), emote_chance = 20) var/datum/action/cooldown/mob_cooldown/charge_apc/charge_ability = new(src) charge_ability.Grant(src) ai_controller.set_blackboard_key(BB_FESTIVE_APC, charge_ability) diff --git a/code/modules/mob/living/basic/health_adjustment.dm b/code/modules/mob/living/basic/health_adjustment.dm index 6355f809cf470..4ae129d9d6616 100644 --- a/code/modules/mob/living/basic/health_adjustment.dm +++ b/code/modules/mob/living/basic/health_adjustment.dm @@ -1,57 +1,78 @@ /** - * Adjusts the health of a simple mob by a set amount and wakes AI if its idle to react + * Adjusts the health of a simple mob by a set amount * * Arguments: * * amount The amount that will be used to adjust the mob's health * * updating_health If the mob's health should be immediately updated to the new value * * forced If we should force update the adjustment of the mob's health no matter the restrictions, like GODMODE + * returns the net change in bruteloss after applying the damage amount */ /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) - if(updating_health) - updatehealth() - . = amount - if(ckey || stat) - return - //if(AIStatus == AI_IDLE) - // toggle_ai(AI_ON) + if(!forced && (status_flags & GODMODE)) + return 0 + . = bruteloss // bruteloss value before applying damage + bruteloss = round(clamp(bruteloss + amount, 0, maxHealth * 2), DAMAGE_PRECISION) + if(updating_health) + updatehealth() + return . - bruteloss /mob/living/basic/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) + if(!forced && (status_flags & GODMODE)) + return 0 + if(on_damage_adjustment(BRUTE, amount, forced) & COMPONENT_IGNORE_CHANGE) + return 0 if(forced) . = adjust_health(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) else if(damage_coeff[BRUTE]) . = adjust_health(amount * damage_coeff[BRUTE] * CONFIG_GET(number/damage_multiplier), updating_health, forced) /mob/living/basic/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) + if(!forced && (status_flags & GODMODE)) + return 0 + if(on_damage_adjustment(BURN, amount, forced) & COMPONENT_IGNORE_CHANGE) + return 0 if(forced) . = adjust_health(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) else if(damage_coeff[BURN]) . = adjust_health(amount * damage_coeff[BURN] * CONFIG_GET(number/damage_multiplier), updating_health, forced) /mob/living/basic/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype, required_respiration_type) + if(!forced && (status_flags & GODMODE)) + return 0 + if(on_damage_adjustment(OXY, amount, forced) & COMPONENT_IGNORE_CHANGE) + return 0 if(forced) . = adjust_health(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) else if(damage_coeff[OXY]) . = adjust_health(amount * damage_coeff[OXY] * CONFIG_GET(number/damage_multiplier), updating_health, forced) /mob/living/basic/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) + if(!forced && (status_flags & GODMODE)) + return 0 + if(on_damage_adjustment(TOX, amount, forced) & COMPONENT_IGNORE_CHANGE) + return 0 if(forced) . = adjust_health(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) else if(damage_coeff[TOX]) . = adjust_health(amount * damage_coeff[TOX] * CONFIG_GET(number/damage_multiplier), updating_health, forced) -/mob/living/basic/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE) +/mob/living/basic/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) + if(on_damage_adjustment(CLONE, amount, forced) & COMPONENT_IGNORE_CHANGE) + return 0 if(forced) . = adjust_health(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) else if(damage_coeff[CLONE]) . = adjust_health(amount * damage_coeff[CLONE] * CONFIG_GET(number/damage_multiplier), updating_health, forced) /mob/living/basic/adjustStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype) + if(on_damage_adjustment(STAMINA, amount, forced) & COMPONENT_IGNORE_CHANGE) + return 0 + . = staminaloss if(forced) staminaloss = max(0, min(BASIC_MOB_MAX_STAMINALOSS, staminaloss + amount)) else staminaloss = max(0, min(BASIC_MOB_MAX_STAMINALOSS, staminaloss + (amount * damage_coeff[STAMINA]))) if(updating_stamina) update_stamina() + . -= staminaloss diff --git a/code/modules/mob/living/basic/heretic/ash_spirit.dm b/code/modules/mob/living/basic/heretic/ash_spirit.dm new file mode 100644 index 0000000000000..b2d4d8b4d2947 --- /dev/null +++ b/code/modules/mob/living/basic/heretic/ash_spirit.dm @@ -0,0 +1,25 @@ +/** + * Player-only mob which is fast, can jaunt a short distance, and is dangerous at close range + */ +/mob/living/basic/heretic_summon/ash_spirit + name = "Ash Spirit" + real_name = "Ashy" + desc = "A manifestation of ash, trailing a perpetual cloud of short-lived cinders." + icon_state = "ash_walker" + icon_living = "ash_walker" + maxHealth = 75 + health = 75 + melee_damage_lower = 15 + melee_damage_upper = 20 + sight = SEE_TURFS + +/mob/living/basic/heretic_summon/ash_spirit/Initialize(mapload) + . = ..() + var/static/list/actions_to_add = list( + /datum/action/cooldown/spell/fire_sworn, + /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash, + /datum/action/cooldown/spell/pointed/cleave, + ) + for (var/action in actions_to_add) + var/datum/action/cooldown/new_action = new action(src) + new_action.Grant(src) diff --git a/code/modules/mob/living/basic/heretic/fire_shark.dm b/code/modules/mob/living/basic/heretic/fire_shark.dm index 141f920f122b6..ac1f1cc69702f 100644 --- a/code/modules/mob/living/basic/heretic/fire_shark.dm +++ b/code/modules/mob/living/basic/heretic/fire_shark.dm @@ -1,16 +1,10 @@ -/mob/living/basic/fire_shark +/mob/living/basic/heretic_summon/fire_shark name = "fire shark" desc = "It is a eldritch dwarf space shark, also known as a fire shark." - icon = 'icons/mob/nonhuman-player/eldritch_mobs.dmi' icon_state = "fire_shark" icon_living = "fire_shark" pass_flags = PASSTABLE | PASSMOB - combat_mode = TRUE mob_biotypes = MOB_ORGANIC | MOB_BEAST - basic_mob_flags = DEL_ON_DEATH - unsuitable_atmos_damage = 0 - unsuitable_cold_damage = 0 - unsuitable_heat_damage = 0 speed = -0.5 health = 16 maxHealth = 16 @@ -26,12 +20,9 @@ mob_size = MOB_SIZE_TINY speak_emote = list("screams") basic_mob_flags = DEL_ON_DEATH - death_message = "implodes into itself." - ai_controller = null -/mob/living/basic/fire_shark/Initialize(mapload) +/mob/living/basic/heretic_summon/fire_shark/Initialize(mapload) . = ..() - AddElement(/datum/element/death_drops, list(/obj/effect/gibspawner/human)) AddElement(/datum/element/death_gases, /datum/gas/plasma, 40) AddElement(/datum/element/simple_flying) AddElement(/datum/element/venomous, /datum/reagent/phlogiston, 2) diff --git a/code/modules/mob/living/basic/heretic/flesh_stalker.dm b/code/modules/mob/living/basic/heretic/flesh_stalker.dm new file mode 100644 index 0000000000000..6f31b3ce7c523 --- /dev/null +++ b/code/modules/mob/living/basic/heretic/flesh_stalker.dm @@ -0,0 +1,46 @@ +/// Durable ambush mob with an EMP ability +/mob/living/basic/heretic_summon/stalker + name = "Flesh Stalker" + real_name = "Flesh Stalker" + desc = "An abomination cobbled together from varied remains. Its appearance changes slightly every time you blink." + icon_state = "stalker" + icon_living = "stalker" + maxHealth = 150 + health = 150 + melee_damage_lower = 15 + melee_damage_upper = 20 + sight = SEE_MOBS + ai_controller = /datum/ai_controller/basic_controller/stalker + /// Associative list of action types we would like to have, and what blackboard key (if any) to put it in + var/static/list/actions_to_add = list( + /datum/action/cooldown/spell/emp/eldritch = BB_GENERIC_ACTION, + /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash = null, + /datum/action/cooldown/spell/shapeshift/eldritch = BB_SHAPESHIFT_ACTION, + ) + +/mob/living/basic/heretic_summon/stalker/Initialize(mapload) + . = ..() + AddComponent(/datum/component/ai_target_timer) + for (var/action_type in actions_to_add) + var/datum/action/new_action = new action_type(src) + new_action.Grant(src) + var/blackboard_key = actions_to_add[action_type] + if (!isnull(blackboard_key)) + ai_controller?.set_blackboard_key(blackboard_key, new_action) + +/// Changes shape and lies in wait when it has no target, uses EMP and attacks once it does +/datum/ai_controller/basic_controller/stalker + ai_traits = CAN_ACT_IN_STASIS + 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/shapechange_ambush, + /datum/ai_planning_subtree/use_mob_ability, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) diff --git a/code/modules/mob/living/basic/heretic/flesh_worm.dm b/code/modules/mob/living/basic/heretic/flesh_worm.dm new file mode 100644 index 0000000000000..05ef707faf4cf --- /dev/null +++ b/code/modules/mob/living/basic/heretic/flesh_worm.dm @@ -0,0 +1,137 @@ +/// Armsy starts to look a bit funky if he's shorter than this +#define MINIMUM_ARMSY_LENGTH 2 + +// What if we took a linked list... But made it a mob? +/// The "Terror of the Night" / Armsy, a large worm made of multiple bodyparts that occupies multiple tiles +/mob/living/basic/heretic_summon/armsy + name = "Lord of the Night" + real_name = "Master of Decay" + desc = "An abomination made from dozens and dozens of severed and malformed limbs grasping onto each other." + icon_state = "armsy_start" + icon_living = "armsy_start" + base_icon_state = "armsy" + maxHealth = 400 + health = 400 + melee_damage_lower = 30 + melee_damage_upper = 50 + obj_damage = 200 + move_force = MOVE_FORCE_OVERPOWERING + move_resist = MOVE_FORCE_OVERPOWERING + pull_force = MOVE_FORCE_OVERPOWERING + mob_size = MOB_SIZE_HUGE + sentience_type = SENTIENCE_BOSS + mob_biotypes = MOB_ORGANIC|MOB_SPECIAL + ///Previous segment in the chain, we hold onto this purely to keep track of how long we currently are and to attach new growth to the back + var/mob/living/basic/heretic_summon/armsy/back + ///How many arms do we have to eat to expand? + var/stacks_to_grow = 5 + ///Currently eaten arms + var/current_stacks = 0 +/* + * Arguments + * * spawn_bodyparts - whether we spawn additional armsy bodies until we reach length. + * * worm_length - the length of the worm we're creating. Below 2 doesn't work very well. + */ +/mob/living/basic/heretic_summon/armsy/Initialize(mapload, spawn_bodyparts = TRUE, worm_length = 6) + . = ..() + AddElement(/datum/element/wall_smasher, ENVIRONMENT_SMASH_RWALLS) + AddElement(\ + /datum/element/amputating_limbs,\ + surgery_time = 0 SECONDS,\ + surgery_verb = "tearing",\ + minimum_stat = CONSCIOUS,\ + snip_chance = 10,\ + target_zones = GLOB.arm_zones,\ + ) + AddComponent(\ + /datum/component/blood_walk, \ + blood_type = /obj/effect/decal/cleanable/blood/tracks, \ + target_dir_change = TRUE,\ + ) + + if(spawn_bodyparts) + build_tail(worm_length) + +// We are a vessel of otherworldly destruction, we bring our gravity with us +/mob/living/basic/heretic_summon/armsy/has_gravity(turf/gravity_turf) + return TRUE + +/mob/living/basic/heretic_summon/armsy/can_be_pulled() + return FALSE // The component does this but not on the head. We don't want the head to be pulled either. + +/mob/living/basic/heretic_summon/armsy/proc/build_tail(worm_length) + worm_length = max(worm_length, MINIMUM_ARMSY_LENGTH) + // Sets the hp of the head to be exactly the (length * hp), so the head is de facto the hardest to destroy. + maxHealth = worm_length * maxHealth + health = maxHealth + + AddComponent(/datum/component/mob_chain, vary_icon_state = TRUE) // We're the front + + var/mob/living/basic/heretic_summon/armsy/prev = src + for(var/i in 1 to worm_length) + prev = new_segment(behind = prev) + update_appearance(UPDATE_ICON_STATE) + +/// Grows a new segment behind the passed mob +/mob/living/basic/heretic_summon/armsy/proc/new_segment(mob/living/basic/heretic_summon/armsy/behind) + var/mob/living/segment = new type(drop_location(), FALSE) + ADD_TRAIT(segment, TRAIT_PERMANENTLY_MORTAL, INNATE_TRAIT) + segment.AddComponent(/datum/component/mob_chain, front = behind, vary_icon_state = TRUE) + behind.register_behind(segment) + return segment + +/// Record that we got another guy on our ass +/mob/living/basic/heretic_summon/armsy/proc/register_behind(mob/living/tail) + if(!isnull(back)) // Shouldn't happen but just in case + UnregisterSignal(back, COMSIG_QDELETING) + back = tail + update_appearance(UPDATE_ICON_STATE) + if(!isnull(back)) + RegisterSignal(back, COMSIG_QDELETING, PROC_REF(tail_deleted)) + +/// When our tail is gone stop holding a reference to it +/mob/living/basic/heretic_summon/armsy/proc/tail_deleted() + SIGNAL_HANDLER + register_behind(null) + +/mob/living/basic/heretic_summon/armsy/melee_attack(atom/target, list/modifiers, ignore_cooldown) + if(!istype(target, /obj/item/bodypart/arm)) + return ..() + visible_message(span_warning("[src] devours [target]!")) + playsound(src, 'sound/magic/demon_consume.ogg', 50, TRUE) + qdel(target) + on_arm_eaten() + +/* + * Handle healing our chain. + * Eating arms off the ground heals us, and if we eat enough arms while above a certain health threshold we get longer! + */ +/mob/living/basic/heretic_summon/armsy/proc/on_arm_eaten() + if(!isnull(back)) + back.on_arm_eaten() + return + + adjustBruteLoss(-maxHealth * 0.5, FALSE) + adjustFireLoss(-maxHealth * 0.5, FALSE) + + if(health < maxHealth * 0.8) + return + + current_stacks++ + if(current_stacks < stacks_to_grow) + return + + visible_message(span_boldwarning("[src] flexes and expands!")) + current_stacks = 0 + new_segment(behind = src) + +/* + * Recursively get the length of our chain. + */ +/mob/living/basic/heretic_summon/armsy/proc/get_length() + . = 1 + if(isnull(back)) + return + . += back.get_length() + +#undef MINIMUM_ARMSY_LENGTH diff --git a/code/modules/mob/living/basic/heretic/heretic_summon.dm b/code/modules/mob/living/basic/heretic/heretic_summon.dm new file mode 100644 index 0000000000000..cf1bcf80aad83 --- /dev/null +++ b/code/modules/mob/living/basic/heretic/heretic_summon.dm @@ -0,0 +1,32 @@ +/mob/living/basic/heretic_summon + name = "Eldritch Demon" + real_name = "Eldritch Demon" + desc = "A horror from beyond this realm, summoned by bad code." + icon = 'icons/mob/nonhuman-player/eldritch_mobs.dmi' + faction = list(FACTION_HERETIC) + basic_mob_flags = DEL_ON_DEATH + gender = NEUTER + mob_biotypes = NONE + + habitable_atmos = 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 = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) + speed = 0 + melee_attack_cooldown = CLICK_CD_MELEE + + attack_sound = 'sound/weapons/punch1.ogg' + response_help_continuous = "thinks better of touching" + response_help_simple = "think better of touching" + response_disarm_continuous = "flails at" + response_disarm_simple = "flail at" + response_harm_continuous = "rips" + response_harm_simple = "tear" + death_message = "implodes into itself." + + combat_mode = TRUE + ai_controller = null + speak_emote = list("screams") + gold_core_spawnable = NO_SPAWN + +/mob/living/basic/heretic_summon/Initialize(mapload) + . = ..() + AddElement(/datum/element/death_drops, string_list(list(/obj/effect/gibspawner/generic))) diff --git a/code/modules/mob/living/basic/heretic/maid_in_the_mirror.dm b/code/modules/mob/living/basic/heretic/maid_in_the_mirror.dm new file mode 100644 index 0000000000000..edc5148b3ccce --- /dev/null +++ b/code/modules/mob/living/basic/heretic/maid_in_the_mirror.dm @@ -0,0 +1,81 @@ +/// Scout and assassin who can appear and disappear from glass surfaces. Damaged by being examined. +/mob/living/basic/heretic_summon/maid_in_the_mirror + name = "Maid in the Mirror" + real_name = "Maid in the Mirror" + desc = "A floating and flowing wisp of chilled air. Glancing at it causes it to shimmer slightly." + icon = 'icons/mob/simple/mob.dmi' + icon_state = "stand" + icon_living = "stand" // Placeholder sprite... still + speak_emote = list("whispers") + movement_type = FLOATING + status_flags = CANSTUN | CANPUSH + attack_sound = SFX_SHATTER + maxHealth = 80 + health = 80 + melee_damage_lower = 12 + melee_damage_upper = 16 + sight = SEE_MOBS | SEE_OBJS | SEE_TURFS + death_message = "shatters and vanishes, releasing a gust of cold air." + /// Whether we take damage when someone looks at us + var/harmed_by_examine = TRUE + /// How often being examined by a specific mob can hurt us + var/recent_examine_damage_cooldown = 10 SECONDS + /// A list of REFs to people who recently examined us + var/list/recent_examiner_refs = list() + +/mob/living/basic/heretic_summon/Initialize(mapload) + . = ..() + var/static/list/loot = list( + /obj/effect/decal/cleanable/ash, + /obj/item/clothing/suit/armor/vest, + /obj/item/organ/internal/lungs, + /obj/item/shard, + ) + AddElement(/datum/element/death_drops, loot) + var/datum/action/cooldown/spell/jaunt/mirror_walk/jaunt = new (src) + jaunt.Grant(src) + +/mob/living/basic/heretic_summon/maid_in_the_mirror/death(gibbed) + var/turf/death_turf = get_turf(src) + death_turf.TakeTemperature(-40) // Spooky + return ..() + +// Examining them will harm them, on a cooldown. +/mob/living/basic/heretic_summon/maid_in_the_mirror/examine(mob/user) + . = ..() + if(!harmed_by_examine || user == src || user.stat == DEAD || !isliving(user) || IS_HERETIC_OR_MONSTER(user)) + return + + var/user_ref = REF(user) + if(user_ref in recent_examiner_refs) + return + + // If we have health, we take some damage + if(health > (maxHealth * 0.125)) + visible_message( + span_warning("[src] seems to fade in and out slightly."), + span_userdanger("[user]'s gaze pierces your every being!"), + ) + + recent_examiner_refs += user_ref + apply_damage(maxHealth * 0.1) // We take 10% of our health as damage upon being examined + playsound(src, 'sound/effects/ghost2.ogg', 40, TRUE) + addtimer(CALLBACK(src, PROC_REF(clear_recent_examiner), user_ref), recent_examine_damage_cooldown, TIMER_DELETE_ME) + animate(src, alpha = 120, time = 0.5 SECONDS, easing = ELASTIC_EASING, loop = 2, flags = ANIMATION_PARALLEL) + animate(alpha = 255, time = 0.5 SECONDS, easing = ELASTIC_EASING) + + // If we're examined on low enough health we die straight up + else + visible_message( + span_danger("[src] vanishes from existence!"), + span_userdanger("[user]'s gaze shatters your form, destroying you!"), + ) + + death() + +/mob/living/basic/heretic_summon/maid_in_the_mirror/proc/clear_recent_examiner(mob_ref) + if(!(mob_ref in recent_examiner_refs)) + return + + recent_examiner_refs -= mob_ref + heal_overall_damage(5) diff --git a/code/modules/mob/living/basic/heretic/raw_prophet.dm b/code/modules/mob/living/basic/heretic/raw_prophet.dm new file mode 100644 index 0000000000000..1a3b2d1aa923a --- /dev/null +++ b/code/modules/mob/living/basic/heretic/raw_prophet.dm @@ -0,0 +1,96 @@ +/** + * A funny little rolling guy who is great at scouting. + * It can see through walls, jaunt, and create a psychic network to report its findings. + * It can blind people to make a getaway, but also get stronger if it attacks the same target consecutively. + */ +/mob/living/basic/heretic_summon/raw_prophet + name = "Raw Prophet" + real_name = "Raw Prophet" + desc = "An abomination stitched together from a few severed arms and one swollen, orphaned eye." + icon_state = "raw_prophet" + icon_living = "raw_prophet" + status_flags = CANPUSH + melee_damage_lower = 5 + melee_damage_upper = 10 + maxHealth = 65 + health = 65 + sight = SEE_MOBS|SEE_OBJS|SEE_TURFS + /// Some ability we use to make people go blind + var/blind_action_type = /datum/action/cooldown/spell/pointed/blind/eldritch + +/mob/living/basic/heretic_summon/raw_prophet/Initialize(mapload) + . = ..() + AddElement(/datum/element/wheel) + var/static/list/body_parts = list(/obj/effect/gibspawner/human, /obj/item/bodypart/arm/left, /obj/item/organ/internal/eyes) + AddElement(/datum/element/death_drops, body_parts) + AddComponent(/datum/component/focused_attacker) + var/on_link_message = "You feel something new enter your sphere of mind... \ + You hear whispers of people far away, screeches of horror and a huming of welcome to [src]'s Mansus Link." + var/on_unlink_message = "Your mind shatters as [src]'s Mansus Link leaves your mind." + AddComponent( \ + /datum/component/mind_linker/active_linking, \ + network_name = "Mansus Link", \ + chat_color = "#568b00", \ + post_unlink_callback = CALLBACK(src, PROC_REF(after_unlink)), \ + speech_action_background_icon_state = "bg_heretic", \ + speech_action_overlay_state = "bg_heretic_border", \ + linker_action_path = /datum/action/cooldown/spell/pointed/manse_link, \ + link_message = on_link_message, \ + unlink_message = on_unlink_message, \ + ) + + // We don't use these for AI so we can just repeat the same adding process + var/static/list/add_abilities = list( + /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash/long, + /datum/action/cooldown/spell/list_target/telepathy/eldritch, + /datum/action/innate/expand_sight, + ) + for (var/ability_type in add_abilities) + var/datum/action/new_action = new ability_type(src) + new_action.Grant(src) + + var/datum/action/cooldown/blind = new blind_action_type(src) + blind.Grant(src) + ai_controller?.set_blackboard_key(BB_TARGETTED_ACTION, blind) + +/* + * Callback for the mind_linker component. + * Stuns people who are ejected from the network. + */ +/mob/living/basic/heretic_summon/raw_prophet/proc/after_unlink(mob/living/unlinked_mob) + if(QDELETED(unlinked_mob) || unlinked_mob.stat == DEAD) + return + + INVOKE_ASYNC(unlinked_mob, TYPE_PROC_REF(/mob, emote), "scream") + unlinked_mob.AdjustParalyzed(0.5 SECONDS) //micro stun + +/mob/living/basic/heretic_summon/raw_prophet/melee_attack(atom/target, list/modifiers, ignore_cooldown) + SpinAnimation(speed = 5, loops = 1) + if (target == src) + return + return ..() + +/// Variant raw prophet used by eldritch transformation with more base attack power +/mob/living/basic/heretic_summon/raw_prophet/ascended + melee_damage_lower = 15 + melee_damage_upper = 20 + +/// NPC variant with a less bullshit ability +/mob/living/basic/heretic_summon/raw_prophet/ruins + ai_controller = /datum/ai_controller/basic_controller/raw_prophet + blind_action_type = /datum/action/cooldown/mob_cooldown/watcher_gaze + +/// Walk and attack people, blind them when we can +/datum/ai_controller/basic_controller/raw_prophet + 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/targeted_mob_ability, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) diff --git a/code/modules/mob/living/basic/heretic/rust_walker.dm b/code/modules/mob/living/basic/heretic/rust_walker.dm new file mode 100644 index 0000000000000..070326c0281ae --- /dev/null +++ b/code/modules/mob/living/basic/heretic/rust_walker.dm @@ -0,0 +1,87 @@ +/// Pretty simple mob which creates areas of rust and has a rust-creating projectile spell +/mob/living/basic/heretic_summon/rust_walker + name = "Rust Walker" + real_name = "Rusty" + desc = "A grinding, clanking construct which leaches life from its surroundings with every armoured step." + icon_state = "rust_walker_s" + base_icon_state = "rust_walker" + icon_living = "rust_walker_s" + maxHealth = 75 + health = 75 + melee_damage_lower = 15 + melee_damage_upper = 20 + sight = SEE_TURFS + speed = 1 + ai_controller = /datum/ai_controller/basic_controller/rust_walker + +/mob/living/basic/heretic_summon/rust_walker/Initialize(mapload) + . = ..() + AddElement(/datum/element/footstep, FOOTSTEP_MOB_RUST) + var/datum/action/cooldown/spell/aoe/rust_conversion/small/conversion = new(src) + conversion.Grant(src) + ai_controller?.set_blackboard_key(BB_GENERIC_ACTION, conversion) + + var/datum/action/cooldown/spell/basic_projectile/rust_wave/short/wave = new(src) + wave.Grant(src) + ai_controller?.set_blackboard_key(BB_TARGETTED_ACTION, wave) + +/mob/living/basic/heretic_summon/rust_walker/setDir(newdir) + . = ..() + update_appearance(UPDATE_ICON_STATE) + +/mob/living/basic/heretic_summon/rust_walker/update_icon_state() + . = ..() + if(stat == DEAD) // We usually delete on death but just in case + return + if(dir & NORTH) + icon_state = "[base_icon_state]_n" + else if(dir & SOUTH) + icon_state = "[base_icon_state]_s" + icon_living = icon_state + +/mob/living/basic/heretic_summon/rust_walker/Life(seconds_per_tick = SSMOBS_DT, times_fired) + if(stat == DEAD) + return ..() + var/turf/our_turf = get_turf(src) + if(HAS_TRAIT(our_turf, TRAIT_RUSTY)) + adjustBruteLoss(-3 * seconds_per_tick) + + return ..() + +/// Converts unconverted terrain, sprays pocket sand around +/datum/ai_controller/basic_controller/rust_walker + 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/rust + planning_subtrees = list( + /datum/ai_planning_subtree/use_mob_ability/rust_walker, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/targeted_mob_ability, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/// Moves a lot if healthy and on rust (to find more tiles to rust) or unhealthy and not on rust (to find healing rust) +/// Still moving in random directions though we're not really seeking it out +/datum/idle_behavior/idle_random_walk/rust + +/datum/idle_behavior/idle_random_walk/rust/perform_idle_behavior(seconds_per_tick, datum/ai_controller/controller) + var/mob/living/our_mob = controller.pawn + var/turf/our_turf = get_turf(our_mob) + if (HAS_TRAIT(our_turf, TRAIT_RUSTY)) + walk_chance = (our_mob.health < our_mob.maxHealth) ? 10 : 50 + else + walk_chance = (our_mob.health < our_mob.maxHealth) ? 50 : 10 + return ..() + +/// Use if we're not stood on rust right now +/datum/ai_planning_subtree/use_mob_ability/rust_walker + +/datum/ai_planning_subtree/use_mob_ability/rust_walker/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/turf/our_turf = get_turf(controller.pawn) + if (HAS_TRAIT(our_turf, TRAIT_RUSTY)) + return + return ..() diff --git a/code/modules/mob/living/basic/heretic/star_gazer.dm b/code/modules/mob/living/basic/heretic/star_gazer.dm index e64f3e82ff23e..b739da0831a21 100644 --- a/code/modules/mob/living/basic/heretic/star_gazer.dm +++ b/code/modules/mob/living/basic/heretic/star_gazer.dm @@ -1,4 +1,4 @@ -/mob/living/basic/star_gazer +/mob/living/basic/heretic_summon/star_gazer name = "Star Gazer" desc = "A creature that has been tasked to watch over the stars." icon = 'icons/mob/nonhuman-player/96x96eldritch_mobs.dmi' @@ -6,9 +6,7 @@ icon_living = "star_gazer" pixel_x = -32 base_pixel_x = -32 - basic_mob_flags = DEL_ON_DEATH - mob_biotypes = MOB_HUMANOID | MOB_EPIC - faction = list(FACTION_HERETIC) + mob_biotypes = MOB_HUMANOID | MOB_SPECIAL response_help_continuous = "passes through" response_help_simple = "pass through" speed = -0.2 @@ -19,25 +17,21 @@ armour_penetration = 20 melee_damage_lower = 40 melee_damage_upper = 40 - combat_mode = TRUE sentience_type = SENTIENCE_BOSS attack_verb_continuous = "ravages" attack_verb_simple = "ravage" attack_vis_effect = ATTACK_EFFECT_SLASH attack_sound = 'sound/weapons/bladeslice.ogg' + melee_attack_cooldown = 0.6 SECONDS speak_emote = list("growls") damage_coeff = list(BRUTE = 1, BURN = 0.5, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) death_sound = 'sound/magic/cosmic_expansion.ogg' - unsuitable_atmos_damage = 0 - unsuitable_cold_damage = 0 - unsuitable_heat_damage = 0 - - gold_core_spawnable = NO_SPAWN slowed_by_drag = FALSE move_force = MOVE_FORCE_OVERPOWERING move_resist = MOVE_FORCE_OVERPOWERING pull_force = MOVE_FORCE_OVERPOWERING + can_buckle_to = FALSE mob_size = MOB_SIZE_HUGE layer = LARGE_MOB_LAYER plane = GAME_PLANE_UPPER_FOV_HIDDEN @@ -45,14 +39,15 @@ ai_controller = /datum/ai_controller/basic_controller/star_gazer -/mob/living/basic/star_gazer/Initialize(mapload) +/mob/living/basic/heretic_summon/star_gazer/Initialize(mapload) . = ..() - AddElement(/datum/element/death_drops, list(/obj/effect/temp_visual/cosmic_domain)) + var/static/list/death_loot = list(/obj/effect/temp_visual/cosmic_domain) + AddElement(/datum/element/death_drops, death_loot) AddElement(/datum/element/death_explosion, 3, 6, 12) AddElement(/datum/element/footstep, FOOTSTEP_MOB_SHOE) AddElement(/datum/element/wall_smasher, ENVIRONMENT_SMASH_RWALLS) AddElement(/datum/element/simple_flying) - AddElement(/datum/element/effect_trail/cosmic_trail) + AddElement(/datum/element/effect_trail, /obj/effect/forcefield/cosmic_field/fast) AddElement(/datum/element/ai_target_damagesource) AddComponent(/datum/component/regenerator, outline_colour = "#b97a5d") ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) @@ -63,6 +58,24 @@ ADD_TRAIT(src, TRAIT_NO_FLOATING_ANIM, INNATE_TRAIT) set_light(4, l_color = "#dcaa5b") +// Star gazer attacks everything around itself applies a spooky mark +/mob/living/basic/heretic_summon/star_gazer/melee_attack(mob/living/target, list/modifiers, ignore_cooldown) + . = ..() + if (!. || !isliving(target)) + return + + target.apply_status_effect(/datum/status_effect/star_mark) + target.apply_damage(damage = 5, damagetype = CLONE) + var/datum/targetting_datum/target_confirmer = ai_controller.blackboard[BB_TARGETTING_DATUM] + for(var/mob/living/nearby_mob in range(1, src)) + if(target == nearby_mob || !target_confirmer?.can_attack(src, nearby_mob)) + continue + nearby_mob.apply_status_effect(/datum/status_effect/star_mark) + nearby_mob.apply_damage(10) + to_chat(nearby_mob, span_userdanger("\The [src] [attack_verb_continuous] you!")) + do_attack_animation(nearby_mob, ATTACK_EFFECT_SLASH) + log_combat(src, nearby_mob, "slashed") + /datum/ai_controller/basic_controller/star_gazer blackboard = list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/star_gazer(), @@ -76,39 +89,12 @@ /datum/ai_planning_subtree/pet_planning, /datum/ai_planning_subtree/simple_find_target, /datum/ai_planning_subtree/attack_obstacle_in_path/star_gazer, - /datum/ai_planning_subtree/basic_melee_attack_subtree/star_gazer, + /datum/ai_planning_subtree/basic_melee_attack_subtree, ) /datum/targetting_datum/basic/star_gazer stat_attack = HARD_CRIT -/datum/ai_planning_subtree/basic_melee_attack_subtree/star_gazer - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/star_gazer - -/datum/ai_behavior/basic_melee_attack/star_gazer - action_cooldown = 0.6 SECONDS - -/datum/ai_behavior/basic_melee_attack/star_gazer/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) - . = ..() - var/atom/target = controller.blackboard[target_key] - var/mob/living/living_pawn = controller.pawn - - if(!isliving(target)) - return - var/mob/living/living_target = target - living_target.apply_status_effect(/datum/status_effect/star_mark) - living_target.apply_damage_type(damage = 5, damagetype = CLONE) - if(living_target.pulledby != living_pawn) - if(living_pawn.Adjacent(living_target) && isturf(living_target.loc) && living_target.stat == SOFT_CRIT) - living_target.grabbedby(living_pawn) - for(var/mob/living/nearby_mob in range(1, living_pawn)) - if(nearby_mob.stat == DEAD || living_target == nearby_mob || faction_check(nearby_mob.faction, list(FACTION_HERETIC))) - continue - nearby_mob.apply_status_effect(/datum/status_effect/star_mark) - nearby_mob.adjustBruteLoss(10) - living_pawn.do_attack_animation(nearby_mob, ATTACK_EFFECT_SLASH) - log_combat(living_pawn, nearby_mob, "slashed") - /datum/ai_planning_subtree/attack_obstacle_in_path/star_gazer attack_behaviour = /datum/ai_behavior/attack_obstructions/star_gazer @@ -125,4 +111,4 @@ command_feedback = "stares!" pointed_reaction = "stares intensely!" refuse_reaction = "..." - attack_behaviour = /datum/ai_behavior/basic_melee_attack/star_gazer + attack_behaviour = /datum/ai_behavior/basic_melee_attack diff --git a/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp.dm b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp.dm new file mode 100644 index 0000000000000..f89009cc2d9a5 --- /dev/null +++ b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp.dm @@ -0,0 +1,91 @@ +/mob/living/basic/mining/ice_whelp + name = "ice whelp" + desc = "The offspring of an ice drake, weak in comparison but still terrifying." + icon = 'icons/mob/simple/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 + butcher_results = list( + /obj/item/stack/ore/diamond = 3, + /obj/item/stack/sheet/animalhide/ashdrake = 1, + /obj/item/stack/sheet/bone = 10, + /obj/item/stack/sheet/sinew = 2, + ) + crusher_loot = /obj/item/crusher_trophy/tail_spike + speed = 12 + + 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" + death_message = "collapses on its side." + death_sound = 'sound/magic/demon_dies.ogg' + + attack_sound = 'sound/magic/demon_attack1.ogg' + move_force = MOVE_FORCE_VERY_STRONG + move_resist = MOVE_FORCE_VERY_STRONG + pull_force = MOVE_FORCE_VERY_STRONG + + ai_controller = /datum/ai_controller/basic_controller/ice_whelp + ///how much we will heal when cannibalizing a target + var/heal_on_cannibalize = 5 + +/mob/living/basic/mining/ice_whelp/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_NO_GLIDE, INNATE_TRAIT) + AddElement(/datum/element/footstep, FOOTSTEP_MOB_HEAVY) + AddComponent(/datum/component/basic_mob_ability_telegraph) + AddComponent(/datum/component/basic_mob_attack_telegraph, telegraph_duration = 0.6 SECONDS) + var/datum/action/cooldown/mob_cooldown/ice_breath/flamethrower = new(src) + var/datum/action/cooldown/mob_cooldown/ice_breathe_all_directions/wide_flames = new(src) + flamethrower.Grant(src) + wide_flames.Grant(src) + ai_controller.set_blackboard_key(BB_WHELP_WIDESPREAD_FIRE, wide_flames) + ai_controller.set_blackboard_key(BB_WHELP_STRAIGHTLINE_FIRE, flamethrower) + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) + + +/mob/living/basic/mining/ice_whelp/proc/pre_attack(mob/living/sculptor, atom/target) + SIGNAL_HANDLER + + if(istype(target, /obj/structure/flora/rock/icy)) + INVOKE_ASYNC(src, PROC_REF(create_sculpture), target) + return COMPONENT_HOSTILE_NO_ATTACK + + if(!istype(target, src.type)) + return + + var/mob/living/victim = target + if(victim.stat != DEAD) + return + + INVOKE_ASYNC(src, PROC_REF(cannibalize_victim), victim) + return COMPONENT_HOSTILE_NO_ATTACK + +/// Carve a stone into a beautiful self-portrait +/mob/living/basic/mining/ice_whelp/proc/create_sculpture(atom/target) + balloon_alert(src, "sculpting...") + if(!do_after(src, 5 SECONDS, target = target)) + return + var/obj/structure/statue/custom/dragon_statue = new(get_turf(target)) + dragon_statue.set_visuals(src) + dragon_statue.name = "statue of [src]" + dragon_statue.desc = "Let this serve as a warning." + dragon_statue.set_anchored(TRUE) + qdel(target) + +/// Gib and consume our fellow ice drakes +/mob/living/basic/mining/ice_whelp/proc/cannibalize_victim(mob/living/target) + start_pulling(target) + balloon_alert(src, "devouring...") + if(!do_after(src, 5 SECONDS, target)) + return + target.gib(DROP_ALL_REMAINS) + adjustBruteLoss(-1 * heal_on_cannibalize) diff --git a/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_abilities.dm b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_abilities.dm new file mode 100644 index 0000000000000..d5dc50d0a692a --- /dev/null +++ b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_abilities.dm @@ -0,0 +1,37 @@ +/datum/action/cooldown/mob_cooldown/ice_breath + name = "Ice Breath" + desc = "Fire a cold line of fire towards the enemy!" + button_icon = 'icons/effects/magic.dmi' + button_icon_state = "fireball" + cooldown_time = 3 SECONDS + melee_cooldown_time = 0 SECONDS + click_to_activate = TRUE + ///the range of fire + var/fire_range = 4 + +/datum/action/cooldown/mob_cooldown/ice_breath/Activate(atom/target_atom) + var/turf/target_fire_turf = get_ranged_target_turf_direct(owner, target_atom, fire_range) + var/list/burn_turfs = get_line(owner, target_fire_turf) - get_turf(owner) + // This proc sleeps + INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(dragon_fire_line), owner, /* burn_turfs = */ burn_turfs, /* frozen = */ TRUE) + StartCooldown() + return TRUE + +/datum/action/cooldown/mob_cooldown/ice_breathe_all_directions + name = "Fire all directions" + desc = "Unleash lines of cold fire in all directions" + button_icon = 'icons/effects/fire.dmi' + button_icon_state = "1" + cooldown_time = 4 SECONDS + melee_cooldown_time = 0 SECONDS + click_to_activate = FALSE + ///the range of fire + var/fire_range = 6 + +/datum/action/cooldown/mob_cooldown/ice_breathe_all_directions/Activate(atom/target_atom) + for(var/direction in GLOB.cardinals) + var/turf/target_fire_turf = get_ranged_target_turf(owner, direction, fire_range) + var/list/burn_turfs = get_line(owner, target_fire_turf) - get_turf(owner) + INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(dragon_fire_line), owner, burn_turfs, frozen = TRUE) + StartCooldown() + return TRUE diff --git a/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_ai.dm b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_ai.dm new file mode 100644 index 0000000000000..47280af428169 --- /dev/null +++ b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_ai.dm @@ -0,0 +1,154 @@ +#define ENRAGE_ADDITION 25 +/datum/ai_controller/basic_controller/ice_whelp + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/allow_items/goliath, + BB_WHELP_ENRAGED = 0, + ) + + 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/targeted_mob_ability/ice_whelp, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/sculpt_statues, + /datum/ai_planning_subtree/find_and_hunt_target/corpses/ice_whelp, + /datum/ai_planning_subtree/burn_trees, + ) + +/datum/ai_planning_subtree/find_and_hunt_target/corpses/ice_whelp + target_key = BB_TARGET_CANNIBAL + finding_behavior = /datum/ai_behavior/find_hunt_target/corpses/dragon_corpse + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/dragon_cannibalise + hunt_targets = list(/mob/living/basic/mining/ice_whelp) + hunt_range = 10 + +/datum/ai_behavior/find_hunt_target/corpses/dragon_corpse + +/datum/ai_behavior/find_hunt_target/corpses/dragon_corpse/valid_dinner(mob/living/source, mob/living/dinner, radius) + if(dinner.pulledby) //someone already got him before us + return FALSE + return ..() + +/datum/ai_behavior/hunt_target/unarmed_attack_target/dragon_cannibalise + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + +/datum/ai_behavior/hunt_target/unarmed_attack_target/dragon_cannibalise/perform(seconds_per_tick, datum/ai_controller/controller, target_key, attack_key) + var/mob/living/target = controller.blackboard[target_key] + if(QDELETED(target) || target.stat != DEAD || target.pulledby) //we were too slow + finish_action(controller, FALSE) + return + return ..() + +/datum/ai_behavior/cannibalize/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + controller.clear_blackboard_key(target_key) + +///subtree to find icy rocks and create sculptures out of them +/datum/ai_planning_subtree/sculpt_statues + +/datum/ai_planning_subtree/sculpt_statues/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(controller.blackboard_key_exists(BB_TARGET_ROCK)) + controller.queue_behavior(/datum/ai_behavior/sculpt_statue, BB_TARGET_ROCK) + return SUBTREE_RETURN_FINISH_PLANNING + controller.queue_behavior(/datum/ai_behavior/find_and_set, BB_TARGET_ROCK, /obj/structure/flora/rock/icy) + +/datum/ai_behavior/sculpt_statue + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + action_cooldown = 5 MINUTES + +/datum/ai_behavior/sculpt_statue/setup(datum/ai_controller/controller, target_key) + . = ..() + var/obj/target = controller.blackboard[target_key] + if(QDELETED(target)) + return FALSE + set_movement_target(controller, target) + +/datum/ai_behavior/sculpt_statue/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + + var/atom/target = controller.blackboard[target_key] + var/mob/living/basic/living_pawn = controller.pawn + + if(QDELETED(target)) + finish_action(controller, FALSE, target_key) + return + + living_pawn.melee_attack(target) + finish_action(controller, TRUE, target_key) + +/datum/ai_behavior/sculpt_statue/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + controller.clear_blackboard_key(target_key) + + +//subtree to use our attacks on the victim +/datum/ai_planning_subtree/targeted_mob_ability/ice_whelp + ability_key = BB_WHELP_STRAIGHTLINE_FIRE + use_ability_behaviour = /datum/ai_behavior/targeted_mob_ability/ice_whelp + finish_planning = FALSE + + +/datum/ai_behavior/targeted_mob_ability/ice_whelp + ///key that stores how enraged we are + var/enraged_key = BB_WHELP_ENRAGED + ///key that stores the ability we will use instead if we are fully enraged + var/secondary_ability_key = BB_WHELP_WIDESPREAD_FIRE + +/datum/ai_behavior/targeted_mob_ability/ice_whelp/get_ability_to_use(datum/ai_controller/controller, ability_key) + var/enraged_value = controller.blackboard[enraged_key] + + if(prob(enraged_value)) + controller.set_blackboard_key(enraged_key, 0) + return controller.blackboard[secondary_ability_key] + + controller.set_blackboard_key(enraged_key, enraged_value + ENRAGE_ADDITION) + return controller.blackboard[ability_key] + +///subtree to look for trees and burn them with our flamethrower +/datum/ai_planning_subtree/burn_trees + +/datum/ai_planning_subtree/burn_trees/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/datum/action/cooldown/using_action = controller.blackboard[BB_WHELP_STRAIGHTLINE_FIRE] + if (!using_action?.IsAvailable()) + return + + if(controller.blackboard_key_exists(BB_TARGET_TREE)) + controller.queue_behavior(/datum/ai_behavior/targeted_mob_ability/and_clear_target/burn_trees, BB_WHELP_STRAIGHTLINE_FIRE, BB_TARGET_TREE) + return SUBTREE_RETURN_FINISH_PLANNING + controller.queue_behavior(/datum/ai_behavior/set_target_tree, BB_TARGET_TREE) + +/datum/ai_behavior/set_target_tree + +/datum/ai_behavior/set_target_tree/perform(seconds_per_tick, datum/ai_controller/controller, tree_key) + . = ..() + + var/mob/living_pawn = controller.pawn + var/list/possible_trees = list() + + for(var/obj/structure/flora/tree/possible_tree in oview(9, living_pawn)) + if(istype(possible_tree, /obj/structure/flora/tree/stump)) //no leaves to burn + continue + possible_trees += possible_tree + + if(!length(possible_trees)) + finish_action(controller, FALSE) + return + + controller.set_blackboard_key(tree_key, pick(possible_trees)) + finish_action(controller, TRUE) + +/datum/ai_behavior/targeted_mob_ability/and_clear_target/burn_trees + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + required_distance = 2 + action_cooldown = 2 MINUTES + +/datum/ai_behavior/targeted_mob_ability/and_clear_target/burn_trees/setup(datum/ai_controller/controller, ability_key, target_key) + . = ..() + var/obj/target = controller.blackboard[target_key] + if(QDELETED(target)) + return FALSE + set_movement_target(controller, target) + +#undef ENRAGE_ADDITION diff --git a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid.dm b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid.dm new file mode 100644 index 0000000000000..bb109fdde61a8 --- /dev/null +++ b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid.dm @@ -0,0 +1,55 @@ +//Large and powerful, but timid. It won't engage anything above 50 health, or anything without legcuffs. +//It can fire fleshy snares that legcuff anyone that it hits, making them look especially tasty to the arachnid. +/mob/living/basic/mega_arachnid + name = "mega arachnid" + desc = "Though physically imposing, it prefers to ambush its prey, and it will only engage with an already crippled opponent." + icon = 'icons/mob/simple/jungle/arachnid.dmi' + icon_state = "arachnid" + icon_living = "arachnid" + icon_dead = "arachnid_dead" + mob_biotypes = MOB_ORGANIC|MOB_BUG + melee_damage_lower = 30 + melee_damage_upper = 30 + maxHealth = 300 + health = 300 + + pixel_x = -16 + base_pixel_x = -16 + + habitable_atmos = 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) + faction = list(FACTION_JUNGLE) + obj_damage = 30 + environment_smash = ENVIRONMENT_SMASH_WALLS + minimum_survivable_temperature = T0C + maximum_survivable_temperature = T0C + 450 + status_flags = NONE + lighting_cutoff_red = 5 + lighting_cutoff_green = 20 + lighting_cutoff_blue = 25 + mob_size = MOB_SIZE_LARGE + + speak_emote = list("chitters") + attack_sound = 'sound/weapons/bladeslice.ogg' + attack_vis_effect = ATTACK_EFFECT_SLASH + ai_controller = /datum/ai_controller/basic_controller/mega_arachnid + alpha = 40 + +/mob/living/basic/mega_arachnid/Initialize(mapload) + . = ..() + AddComponent(/datum/component/seethrough_mob) + var/datum/action/cooldown/spell/pointed/projectile/flesh_restraints/restrain = new(src) + var/datum/action/cooldown/mob_cooldown/secrete_acid/acid_spray = new(src) + acid_spray.Grant(src) + restrain.Grant(src) + AddElement(/datum/element/swabable, CELL_LINE_TABLE_MEGA_ARACHNID, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) + AddComponent(/datum/component/appearance_on_aggro, alpha_on_aggro = 255, alpha_on_deaggro = alpha) + AddComponent(/datum/component/tree_climber, climbing_distance = 15) + ai_controller.set_blackboard_key(BB_ARACHNID_RESTRAIN, restrain) + ai_controller.set_blackboard_key(BB_ARACHNID_SLIP, acid_spray) + +/mob/living/basic/mega_arachnid/Login() + . = ..() + if(!. || !client) + return FALSE + + animate(src, alpha = 255, time = 2 SECONDS) //make them visible diff --git a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_abilities.dm b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_abilities.dm new file mode 100644 index 0000000000000..e8c4d1723e790 --- /dev/null +++ b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_abilities.dm @@ -0,0 +1,80 @@ + +/datum/action/cooldown/spell/pointed/projectile/flesh_restraints + name = "fleshy restraints" + desc = "Launch at your prey to immobilize them." + button_icon = 'icons/obj/restraints.dmi' + button_icon_state = "flesh_snare" + + cooldown_time = 6 SECONDS + spell_requirements = NONE + + active_msg = "You prepare to throw a restraint at your target!" + cast_range = 8 + projectile_type = /obj/projectile/mega_arachnid + +/obj/projectile/mega_arachnid + name = "flesh snare" + icon_state = "tentacle_end" + damage = 0 + +/obj/projectile/mega_arachnid/on_hit(atom/target, blocked = FALSE) + . = ..() + if(!iscarbon(target) || blocked >= 100) + return + var/obj/item/restraints/legcuffs/beartrap/mega_arachnid/restraint = new(get_turf(target)) + restraint.spring_trap(null, target) + +/obj/item/restraints/legcuffs/beartrap/mega_arachnid + name = "fleshy restraints" + desc = "Used by mega arachnids to immobilize their prey." + flags_1 = NONE + item_flags = DROPDEL + 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) + + +/datum/action/cooldown/mob_cooldown/secrete_acid + name = "Secrete Acid" + button_icon = 'icons/effects/acid.dmi' + button_icon_state = "default" + desc = "Secrete a slippery acid!" + cooldown_time = 15 SECONDS + melee_cooldown_time = 0 SECONDS + click_to_activate = FALSE + +/datum/action/cooldown/mob_cooldown/secrete_acid/Activate(atom/target_atom) + RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(release_acid)) + addtimer(CALLBACK(src, PROC_REF(deactivate_ability)), 3 SECONDS) + StartCooldown() + return TRUE + +/datum/action/cooldown/mob_cooldown/secrete_acid/proc/release_acid() + SIGNAL_HANDLER + + var/turf/current_turf = owner.loc + if(locate(/obj/effect/slippery_acid) in current_turf.contents) + return + + new /obj/effect/slippery_acid(current_turf) + +/datum/action/cooldown/mob_cooldown/secrete_acid/proc/deactivate_ability() + UnregisterSignal(owner, COMSIG_MOVABLE_MOVED) + +/obj/effect/slippery_acid + name = "slippery acid" + icon = 'icons/effects/acid.dmi' + icon_state = "default" + layer = BELOW_MOB_LAYER + plane = GAME_PLANE + anchored = TRUE + /// how long does the acid exist for + var/duration_time = 5 SECONDS + +/obj/effect/slippery_acid/Initialize(mapload) + . = ..() + AddComponent(/datum/component/slippery, 6 SECONDS) + QDEL_IN(src, duration_time) diff --git a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_ai.dm b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_ai.dm new file mode 100644 index 0000000000000..c88178135dc54 --- /dev/null +++ b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_ai.dm @@ -0,0 +1,79 @@ +/datum/ai_controller/basic_controller/mega_arachnid + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_BASIC_MOB_FLEEING = TRUE, + BB_BASIC_MOB_FLEE_DISTANCE = 5, + ) + + 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/targeted_mob_ability/arachnid_restrain, + /datum/ai_planning_subtree/basic_melee_attack_subtree/mega_arachnid, + /datum/ai_planning_subtree/flee_target/mega_arachnid, + /datum/ai_planning_subtree/climb_trees, + /datum/ai_planning_subtree/find_and_hunt_target/destroy_surveillance, + ) + +///destroy surveillance objects to boost our stealth +/datum/ai_planning_subtree/find_and_hunt_target/destroy_surveillance + target_key = BB_SURVEILLANCE_TARGET + finding_behavior = /datum/ai_behavior/find_hunt_target/find_active_surveillance + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target + hunt_targets = list(/obj/machinery/camera, /obj/machinery/light) + hunt_range = 7 + +/datum/ai_behavior/find_hunt_target/find_active_surveillance + +/datum/ai_behavior/find_hunt_target/find_active_camera/valid_dinner(mob/living/source, obj/machinery/dinner, radius) + if(dinner.machine_stat & BROKEN) + return FALSE + + return can_see(source, dinner, radius) + +///spray slippery acid as we flee! +/datum/ai_planning_subtree/flee_target/mega_arachnid + flee_behaviour = /datum/ai_behavior/run_away_from_target/mega_arachnid + +/datum/ai_planning_subtree/flee_target/mega_arachnid/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(!controller.blackboard[BB_BASIC_MOB_FLEEING]) + return + var/datum/action/cooldown/slip_acid = controller.blackboard[BB_ARACHNID_SLIP] + + if(!QDELETED(slip_acid) && slip_acid.IsAvailable()) + controller.queue_behavior(/datum/ai_behavior/use_mob_ability, BB_ARACHNID_SLIP) + + return ..() + +/datum/ai_behavior/run_away_from_target/mega_arachnid + clear_failed_targets = FALSE + +///only engage in melee combat against cuffed targets, otherwise keep throwing restraints at them +/datum/ai_planning_subtree/basic_melee_attack_subtree/mega_arachnid + ///minimum health our target must be before we can attack them + var/minimum_health = 50 + +/datum/ai_planning_subtree/basic_melee_attack_subtree/mega_arachnid/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/atom/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + if(!ishuman(target)) + return ..() + + var/mob/living/carbon/human_target = target + if(!human_target.legcuffed && human_target.health > minimum_health) + return + + return ..() + +/datum/ai_planning_subtree/targeted_mob_ability/arachnid_restrain + ability_key = BB_ARACHNID_RESTRAIN + +/// only fire ability at humans if they are not cuffed +/datum/ai_planning_subtree/targeted_mob_ability/arachnid_restrain/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/target = controller.blackboard[target_key] + if(!ishuman(target)) + return + var/mob/living/carbon/human_target = target + if(human_target.legcuffed) + return + return ..() diff --git a/code/modules/mob/living/basic/jungle/seedling/seedling.dm b/code/modules/mob/living/basic/jungle/seedling/seedling.dm new file mode 100644 index 0000000000000..998f693d6da17 --- /dev/null +++ b/code/modules/mob/living/basic/jungle/seedling/seedling.dm @@ -0,0 +1,348 @@ +#define SEEDLING_STATE_NEUTRAL 0 +#define SEEDLING_STATE_WARMUP 1 +#define SEEDLING_STATE_ACTIVE 2 + +/** + * A mobile plant with a rapid ranged attack. + * It can pick up watering cans and look after plants. + */ +/mob/living/basic/seedling + name = "seedling" + desc = "This oversized, predatory flower conceals what can only be described as an organic energy cannon." + icon = 'icons/mob/simple/jungle/seedling.dmi' + icon_state = "seedling" + icon_living = "seedling" + icon_dead = "seedling_dead" + habitable_atmos = list("min_oxy" = 2, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + minimum_survivable_temperature = 0 + maximum_survivable_temperature = 450 + mob_biotypes = MOB_ORGANIC | MOB_PLANT + maxHealth = 100 + health = 100 + pixel_y = -14 + base_pixel_y = -14 + pixel_x = -14 + base_pixel_x = -14 + response_harm_continuous = "strikes" + response_harm_simple = "strike" + melee_damage_lower = 30 + melee_damage_upper = 30 + lighting_cutoff_green = 20 + lighting_cutoff_blue = 25 + mob_size = MOB_SIZE_LARGE + attack_sound = 'sound/weapons/bladeslice.ogg' + attack_vis_effect = ATTACK_EFFECT_SLASH + ai_controller = /datum/ai_controller/basic_controller/seedling + ///the state of combat we are in + var/combatant_state = SEEDLING_STATE_NEUTRAL + ///the colors our petals can have + var/static/list/possible_colors = list(COLOR_RED, COLOR_YELLOW, COLOR_OLIVE, COLOR_CYAN) + ///appearance when we are in our normal state + var/mutable_appearance/petal_neutral + ///appearance when we are in our warmup state + var/mutable_appearance/petal_warmup + ///appearance when we are in the firing state + var/mutable_appearance/petal_active + ///appearance when we are dead + var/mutable_appearance/petal_dead + ///the bucket we carry + var/obj/item/reagent_containers/cup/held_can + ///commands we follow + var/list/seedling_commands = list( + /datum/pet_command/idle, + /datum/pet_command/free, + /datum/pet_command/follow, + ) + +/mob/living/basic/seedling/Initialize(mapload) + . = ..() + var/datum/action/cooldown/mob_cooldown/projectile_attack/rapid_fire/seedling/seed_attack = new(src) + seed_attack.Grant(src) + ai_controller.set_blackboard_key(BB_RAPIDSEEDS_ABILITY, seed_attack) + var/datum/action/cooldown/mob_cooldown/solarbeam/beam_attack = new(src) + beam_attack.Grant(src) + ai_controller.set_blackboard_key(BB_SOLARBEAM_ABILITY, beam_attack) + + var/petal_color = pick(possible_colors) + + petal_neutral = mutable_appearance(icon, "[icon_state]_overlay") + petal_neutral.color = petal_color + + petal_warmup = mutable_appearance(icon, "[icon_state]_charging_overlay") + petal_warmup.color = petal_color + + petal_active = mutable_appearance(icon, "[icon_state]_fire_overlay") + petal_active.color = petal_color + + petal_dead = mutable_appearance(icon, "[icon_state]_dead_overlay") + petal_dead.color = petal_color + + AddElement(/datum/element/wall_smasher) + AddComponent(/datum/component/obeys_commands, seedling_commands) + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) + RegisterSignal(src, COMSIG_KB_MOB_DROPITEM_DOWN, PROC_REF(drop_can)) + update_appearance() + +/mob/living/basic/seedling/proc/pre_attack(mob/living/puncher, atom/target) + SIGNAL_HANDLER + + if(istype(target, /obj/machinery/hydroponics)) + treat_hydro_tray(target) + return COMPONENT_HOSTILE_NO_ATTACK + + if(isnull(held_can)) + return + + if(istype(target, /obj/structure/sink) || istype(target, /obj/structure/reagent_dispensers)) + INVOKE_ASYNC(held_can, TYPE_PROC_REF(/obj/item, melee_attack_chain), src, target) + return COMPONENT_HOSTILE_NO_ATTACK + + +///seedlings can water trays, remove weeds, or remove dead plants +/mob/living/basic/seedling/proc/treat_hydro_tray(obj/machinery/hydroponics/hydro) + + if(hydro.plant_status == HYDROTRAY_PLANT_DEAD) + balloon_alert(src, "dead plant removed") + hydro.set_seed(null) + return + + if(hydro.weedlevel > 0) + balloon_alert(src, "weeds uprooted") + hydro.set_weedlevel(0) + return + + var/list/can_reagents = held_can?.reagents.reagent_list + + if(!length(can_reagents)) + return + + if((locate(/datum/reagent/water) in can_reagents) && (hydro.waterlevel < hydro.maxwater)) + INVOKE_ASYNC(held_can, TYPE_PROC_REF(/obj/item, melee_attack_chain), src, hydro) + return + +/mob/living/basic/seedling/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) + . = ..() + + if(!. || !proximity_flag || held_can) + return + + if(!istype(attack_target, /obj/item/reagent_containers/cup/watering_can)) + return + + var/obj/item/can_target = attack_target + can_target.forceMove(src) + +/mob/living/basic/seedling/proc/change_combatant_state(state) + combatant_state = state + update_appearance() + +/mob/living/basic/seedling/attackby(obj/item/can, mob/living/carbon/human/user, list/modifiers) + if(istype(can, /obj/item/reagent_containers/cup/watering_can) && isnull(held_can)) + can.forceMove(src) + return + + return ..() + +/mob/living/basic/seedling/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) + if(istype(arrived, /obj/item/reagent_containers/cup/watering_can)) + held_can = arrived + update_appearance() + + return ..() + +/mob/living/basic/seedling/update_overlays() + . = ..() + if(stat == DEAD) + . += petal_dead + return + + switch(combatant_state) + if(SEEDLING_STATE_NEUTRAL) + . += petal_neutral + if(held_can) + . += mutable_appearance(icon, "seedling_can_overlay") + if(SEEDLING_STATE_WARMUP) + . += petal_warmup + if(SEEDLING_STATE_ACTIVE) + . += petal_active + +/mob/living/basic/seedling/update_icon_state() + . = ..() + if(stat == DEAD) + return + switch(combatant_state) + if(SEEDLING_STATE_NEUTRAL) + icon_state = "seedling" + if(SEEDLING_STATE_WARMUP) + icon_state = "seedling_charging" + if(SEEDLING_STATE_ACTIVE) + icon_state = "seedling_fire" + +/mob/living/basic/seedling/proc/drop_can(mob/living/user) + SIGNAL_HANDLER + + if(isnull(held_can)) + return + dropItemToGround(held_can) + return COMSIG_KB_ACTIVATED + +/mob/living/basic/seedling/Exited(atom/movable/gone, direction) + . = ..() + if(gone != held_can) + return + held_can = null + update_appearance() + +/mob/living/basic/seedling/death(gibbed) + . = ..() + if(isnull(held_can)) + return + held_can.forceMove(drop_location()) + +/mob/living/basic/seedling/Destroy() + QDEL_NULL(held_can) + return ..() + +/mob/living/basic/seedling/meanie + maxHealth = 400 + health = 400 + faction = list(FACTION_JUNGLE) + ai_controller = /datum/ai_controller/basic_controller/seedling/meanie + seedling_commands = list( + /datum/pet_command/idle, + /datum/pet_command/free, + /datum/pet_command/follow, + /datum/pet_command/point_targetting/attack, + /datum/pet_command/point_targetting/use_ability/solarbeam, + /datum/pet_command/point_targetting/use_ability/rapidseeds, + ) + +//abilities +/datum/action/cooldown/mob_cooldown/projectile_attack/rapid_fire/seedling + name = "Solar Energy" + button_icon = 'icons/obj/weapons/guns/projectiles.dmi' + button_icon_state = "seedling" + desc = "Fire small beams of solar energy." + cooldown_time = 10 SECONDS + projectile_type = /obj/projectile/seedling + default_projectile_spread = 10 + shot_count = 10 + shot_delay = 0.2 SECONDS + melee_cooldown_time = 0 SECONDS + shared_cooldown = NONE + ///how long we must charge up before firing off + var/charge_up_timer = 3 SECONDS + ///is the owner of this ability a seedling? + var/is_seedling = FALSE + +/datum/action/cooldown/mob_cooldown/projectile_attack/rapid_fire/seedling/Grant(mob/grant_to) + . = ..() + if(isnull(owner)) + return + is_seedling = istype(owner, /mob/living/basic/seedling) + +/datum/action/cooldown/mob_cooldown/projectile_attack/rapid_fire/seedling/IsAvailable(feedback) + . = ..() + if(!.) + return FALSE + if(!is_seedling) + return TRUE + var/mob/living/basic/seedling/seed_owner = owner + if(seed_owner.combatant_state != SEEDLING_STATE_NEUTRAL) + if(feedback) + seed_owner.balloon_alert(seed_owner, "charging!") + return FALSE + return TRUE + +/datum/action/cooldown/mob_cooldown/projectile_attack/rapid_fire/seedling/Activate(atom/target) + if(is_seedling) + var/mob/living/basic/seedling/seed_owner = owner + seed_owner.change_combatant_state(state = SEEDLING_STATE_WARMUP) + addtimer(CALLBACK(src, PROC_REF(attack_sequence), owner, target), charge_up_timer) + StartCooldown() + return TRUE + +/datum/action/cooldown/mob_cooldown/projectile_attack/rapid_fire/seedling/attack_sequence(mob/living/firer, atom/target) + if(is_seedling) + var/mob/living/basic/seedling/seed_owner = owner + seed_owner.change_combatant_state(state = SEEDLING_STATE_ACTIVE) + addtimer(CALLBACK(seed_owner, TYPE_PROC_REF(/mob/living/basic/seedling, change_combatant_state), SEEDLING_STATE_NEUTRAL), 4 SECONDS) + + return ..() + + +/datum/action/cooldown/mob_cooldown/solarbeam + name = "Solar Beam" + button_icon = 'icons/effects/beam.dmi' + button_icon_state = "solar_beam" + desc = "Concentrate the power of the sun onto your target!" + cooldown_time = 30 SECONDS + shared_cooldown = NONE + ///how long will it take for us to charge up the beam + var/beam_charge_up = 3 SECONDS + ///is the owner of this ability a seedling? + var/is_seedling = FALSE + +/datum/action/cooldown/mob_cooldown/solarbeam/Grant(mob/grant_to) + . = ..() + if(isnull(owner)) + return + is_seedling = istype(owner, /mob/living/basic/seedling) + +/datum/action/cooldown/mob_cooldown/solarbeam/IsAvailable(feedback) + . = ..() + if(!.) + return FALSE + if(!is_seedling) + return TRUE + var/mob/living/basic/seedling/seed_owner = owner + if(seed_owner.combatant_state != SEEDLING_STATE_NEUTRAL) + if(feedback) + seed_owner.balloon_alert(seed_owner, "charging!") + return FALSE + return TRUE + +/datum/action/cooldown/mob_cooldown/solarbeam/Activate(atom/target) + if(is_seedling) + var/mob/living/basic/seedling/seed_owner = owner + seed_owner.change_combatant_state(state = SEEDLING_STATE_WARMUP) + + var/turf/target_turf = get_turf(target) + playsound(owner, 'sound/effects/seedling_chargeup.ogg', 100, FALSE) + + var/obj/effect/temp_visual/solarbeam_killsat/owner_beam = new(get_turf(owner)) + animate(owner_beam, transform = matrix().Scale(1, 32), alpha = 255, time = beam_charge_up) + + var/obj/effect/temp_visual/solarbeam_killsat/target_beam = new(target_turf) + animate(target_beam, transform = matrix().Scale(2, 1), alpha = 255, time = beam_charge_up) + + addtimer(CALLBACK(src, PROC_REF(launch_beam), owner, target_turf), beam_charge_up) + StartCooldown() + return TRUE + +///the solarbeam will damage people, otherwise it will heal plants +/datum/action/cooldown/mob_cooldown/solarbeam/proc/launch_beam(mob/living/firer, turf/target_turf) + for(var/atom/target_atom as anything in target_turf) + + if(istype(target_atom, /obj/machinery/hydroponics)) + var/obj/machinery/hydroponics/hydro = target_atom + hydro.adjust_plant_health(10) + new /obj/effect/temp_visual/heal(target_turf, COLOR_HEALING_CYAN) + + if(!isliving(target_atom)) + continue + + var/mob/living/living_target = target_atom + living_target.adjust_fire_stacks(0.2) + living_target.ignite_mob() + living_target.adjustFireLoss(30) + + playsound(target_turf, 'sound/magic/lightningbolt.ogg', 50, TRUE) + if(!is_seedling) + return + var/mob/living/basic/seedling/seed_firer = firer + seed_firer.change_combatant_state(state = SEEDLING_STATE_NEUTRAL) + +#undef SEEDLING_STATE_NEUTRAL +#undef SEEDLING_STATE_WARMUP +#undef SEEDLING_STATE_ACTIVE diff --git a/code/modules/mob/living/basic/jungle/seedling/seedling_ai.dm b/code/modules/mob/living/basic/jungle/seedling/seedling_ai.dm new file mode 100644 index 0000000000000..4d67a71d4d42d --- /dev/null +++ b/code/modules/mob/living/basic/jungle/seedling/seedling_ai.dm @@ -0,0 +1,178 @@ +/datum/ai_controller/basic_controller/seedling + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends, + BB_WEEDLEVEL_THRESHOLD = 3, + BB_WATERLEVEL_THRESHOLD = 90, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/pet_planning, + /datum/ai_planning_subtree/find_and_hunt_target/watering_can, + /datum/ai_planning_subtree/find_and_hunt_target/fill_watercan, + /datum/ai_planning_subtree/find_and_hunt_target/treat_hydroplants, + /datum/ai_planning_subtree/find_and_hunt_target/beamable_hydroplants, + ) + +/datum/ai_planning_subtree/find_and_hunt_target/watering_can + target_key = BB_WATERCAN_TARGET + finding_behavior = /datum/ai_behavior/find_hunt_target + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target + hunt_targets = list(/obj/item/reagent_containers/cup/watering_can) + hunt_range = 7 + +/datum/ai_planning_subtree/find_and_hunt_target/watering_can/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + if(locate(/obj/item/reagent_containers/cup/watering_can) in living_pawn) //we already have what we came for! + return + return ..() + +/datum/ai_planning_subtree/find_and_hunt_target/treat_hydroplants + target_key = BB_HYDROPLANT_TARGET + finding_behavior = /datum/ai_behavior/find_and_set/treatable_hydro + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/treat_hydroplant + hunt_targets = list(/obj/machinery/hydroponics) + hunt_range = 7 + +/datum/ai_behavior/find_and_set/treatable_hydro + +/datum/ai_behavior/find_and_set/treatable_hydro/search_tactic(datum/ai_controller/controller, locate_path, search_range) + var/list/possible_trays = list() + var/mob/living/living_pawn = controller.pawn + var/waterlevel_threshold = controller.blackboard[BB_WATERLEVEL_THRESHOLD] + var/weedlevel_threshold = controller.blackboard[BB_WEEDLEVEL_THRESHOLD] + var/watering_can = locate(/obj/item/reagent_containers/cup/watering_can) in living_pawn + + for(var/obj/machinery/hydroponics/hydro in oview(search_range, controller.pawn)) + if(isnull(hydro.myseed)) + continue + if(hydro.waterlevel < waterlevel_threshold && watering_can) + possible_trays += hydro + continue + if(hydro.weedlevel > weedlevel_threshold || hydro.plant_status == HYDROTRAY_PLANT_DEAD) + possible_trays += hydro + continue + + if(possible_trays.len) + return pick(possible_trays) + +/datum/ai_behavior/hunt_target/unarmed_attack_target/treat_hydroplant + hunt_cooldown = 2 SECONDS + always_reset_target = TRUE + +/datum/ai_behavior/hunt_target/unarmed_attack_target/treat_hydroplant/target_caught(mob/living/living_pawn, obj/machinery/hydroponics/hydro_target) + if(QDELETED(hydro_target) || QDELETED(hydro_target.myseed)) + return + + if(hydro_target.plant_status == HYDROTRAY_PLANT_DEAD) + living_pawn.manual_emote("weeps...") //weep over the dead plants + return ..() + + +/datum/ai_planning_subtree/find_and_hunt_target/beamable_hydroplants + target_key = BB_BEAMABLE_HYDROPLANT_TARGET + finding_behavior = /datum/ai_behavior/find_and_set/beamable_hydroplants + hunting_behavior = /datum/ai_behavior/hunt_target/use_ability_on_target/solarbeam + hunt_targets = list(/obj/machinery/hydroponics) + hunt_range = 7 + +/datum/ai_planning_subtree/find_and_hunt_target/beamable_hydroplants/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/datum/action/cooldown/solar_ability = controller.blackboard[BB_SOLARBEAM_ABILITY] + if(QDELETED(solar_ability) || !solar_ability.IsAvailable()) + return + return ..() + +/datum/ai_behavior/hunt_target/use_ability_on_target/solarbeam + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + required_distance = 2 + action_cooldown = 1 MINUTES + ability_key = BB_SOLARBEAM_ABILITY + +/datum/ai_behavior/hunt_target/use_ability_on_target/solarbeam/setup(datum/ai_controller/controller, target_key, ability_key) + . = ..() + var/obj/target = controller.blackboard[target_key] + if(QDELETED(target)) + return FALSE + set_movement_target(controller, target) + +/datum/ai_behavior/find_and_set/beamable_hydroplants/search_tactic(datum/ai_controller/controller, locate_path, search_range) + var/list/possible_trays = list() + + for(var/obj/machinery/hydroponics/hydro in oview(search_range, controller.pawn)) + if(isnull(hydro.myseed)) + continue + if(hydro.plant_health < hydro.myseed.endurance) + possible_trays += hydro + + if(possible_trays.len) + return pick(possible_trays) + +/datum/ai_planning_subtree/find_and_hunt_target/fill_watercan + target_key = BB_LOW_PRIORITY_HUNTING_TARGET + finding_behavior = /datum/ai_behavior/find_hunt_target/suitable_dispenser + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/water_source + hunt_targets = list(/obj/structure/sink, /obj/structure/reagent_dispensers) + hunt_range = 7 + +/datum/ai_planning_subtree/find_and_hunt_target/fill_watercan/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + var/obj/item/reagent_containers/can = locate(/obj/item/reagent_containers/cup/watering_can) in living_pawn + + if(isnull(can)) + return + if(locate(/datum/reagent/water) in can.reagents.reagent_list) + return + + return ..() + +/datum/ai_behavior/find_hunt_target/suitable_dispenser + +/datum/ai_behavior/find_hunt_target/suitable_dispenser/valid_dinner(mob/living/source, obj/structure/water_source, radius) + if(!(locate(/datum/reagent/water) in water_source.reagents.reagent_list)) + return FALSE + + return can_see(source, water_source, radius) + +/datum/ai_behavior/hunt_target/unarmed_attack_target/water_source + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + hunt_cooldown = 5 SECONDS + +/datum/ai_controller/basic_controller/seedling/meanie + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends, + ) + planning_subtrees = list( + /datum/ai_planning_subtree/pet_planning, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/targeted_mob_ability/seedling_rapid, + /datum/ai_planning_subtree/targeted_mob_ability/solarbeam, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/datum/ai_planning_subtree/targeted_mob_ability/seedling_rapid + ability_key = BB_RAPIDSEEDS_ABILITY + finish_planning = FALSE + +/datum/ai_planning_subtree/targeted_mob_ability/solarbeam + ability_key = BB_SOLARBEAM_ABILITY + finish_planning = FALSE + +///pet commands +/datum/pet_command/point_targetting/use_ability/solarbeam + command_name = "Launch solarbeam" + command_desc = "Command your pet to launch a solarbeam at your target!" + radial_icon = 'icons/effects/beam.dmi' + radial_icon_state = "solar_beam" + speech_commands = list("beam", "solar") + pet_ability_key = BB_SOLARBEAM_ABILITY + +/datum/pet_command/point_targetting/use_ability/rapidseeds + command_name = "Rapid seeds" + command_desc = "Command your pet to launch a volley of seeds at your target!" + radial_icon = 'icons/obj/weapons/guns/projectiles.dmi' + radial_icon_state = "seedling" + speech_commands = list("rapid", "seeds", "volley") + pet_ability_key = BB_RAPIDSEEDS_ABILITY diff --git a/code/modules/mob/living/basic/jungle/seedling/seedling_projectiles.dm b/code/modules/mob/living/basic/jungle/seedling/seedling_projectiles.dm new file mode 100644 index 0000000000000..726b81059335d --- /dev/null +++ b/code/modules/mob/living/basic/jungle/seedling/seedling_projectiles.dm @@ -0,0 +1,32 @@ +/obj/projectile/seedling + name = "solar energy" + icon_state = "seedling" + damage = 10 + damage_type = BURN + light_range = 2 + armor_flag = ENERGY + light_color = LIGHT_COLOR_DIM_YELLOW + speed = 1.6 + hitsound = 'sound/weapons/sear.ogg' + hitsound_wall = 'sound/weapons/effects/searwall.ogg' + nondirectional_sprite = TRUE + +/obj/projectile/seedling/on_hit(atom/target) + if(!isliving(target)) + return ..() + + var/mob/living/living_target = target + if(FACTION_JUNGLE in living_target.faction) + return + + return ..() + +/obj/effect/temp_visual/solarbeam_killsat + name = "beam of solar energy" + icon_state = "solar_beam" + icon = 'icons/effects/beam.dmi' + plane = LIGHTING_PLANE + layer = LIGHTING_PRIMARY_LAYER + duration = 3 SECONDS + alpha = 200 + randomdir = FALSE diff --git a/code/modules/mob/living/basic/lavaland/basilisk/basilisk.dm b/code/modules/mob/living/basic/lavaland/basilisk/basilisk.dm new file mode 100644 index 0000000000000..45bfd74d23b57 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/basilisk/basilisk.dm @@ -0,0 +1,88 @@ +/// Watchers' ground-dwelling cousins, they shoot at you until they get into melee and absorb laser fire to power up. +/mob/living/basic/mining/basilisk + name = "basilisk" + desc = "A territorial beast, covered in a diamond shell which absorbs heat. Its stare causes victims to freeze from the inside." + icon_state = "basilisk" + icon_living = "basilisk" + icon_dead = "basilisk_dead" + speak_emote = list("chimes") + damage_coeff = list(BRUTE = 1, BURN = 0.1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) + speed = 20 + maxHealth = 200 + health = 200 + obj_damage = 60 + melee_damage_lower = 12 + melee_damage_upper = 12 + attack_verb_continuous = "bites into" + attack_verb_simple = "bite into" + throw_blocked_message = "bounces off the shell of" + attack_sound = 'sound/weapons/bladeslice.ogg' + attack_vis_effect = ATTACK_EFFECT_BITE + ai_controller = /datum/ai_controller/basic_controller/basilisk + butcher_results = list( + /obj/item/stack/sheet/bone = 1, + /obj/item/stack/ore/diamond = 2, + /obj/item/stack/sheet/sinew = 2, + ) + /// The component we use for making ranged attacks + var/datum/component/ranged_attacks/ranged_attacks + +/mob/living/basic/mining/basilisk/Initialize(mapload) + . = ..() + AddComponent(/datum/component/basic_mob_attack_telegraph) + ranged_attacks = AddComponent(/datum/component/ranged_attacks, projectile_type = /obj/projectile/temp/watcher, projectile_sound = 'sound/weapons/pierce.ogg') + RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(check_lava)) + +/mob/living/basic/mining/basilisk/Destroy() + QDEL_NULL(ranged_attacks) + return ..() + +/mob/living/basic/mining/basilisk/welder_act(mob/living/user, obj/item/tool) + . = ..() + heat_up() // Who would do this? + +/mob/living/basic/mining/basilisk/bullet_act(obj/projectile/bullet, def_zone, piercing_hit) + . = ..() + if (istype(bullet, /obj/projectile/temp)) + var/obj/projectile/temp/heat_bullet = bullet + if (heat_bullet.temperature < 0) + return + heat_up() + return + + if (bullet.damage == 0 || bullet.damage_type != BURN) + return + heat_up() + +/// Are we standing in lava? +/mob/living/basic/mining/basilisk/proc/check_lava() + SIGNAL_HANDLER + var/turf/open/lava/entered_lava = loc + if (!islava(entered_lava) || entered_lava.immunity_trait != TRAIT_LAVA_IMMUNE) + return + heat_up() + +/// We got hit by something hot, go into heat mode +/mob/living/basic/mining/basilisk/proc/heat_up() + if (stat != CONSCIOUS || has_status_effect(/datum/status_effect/basilisk_overheat)) + return + apply_status_effect(/datum/status_effect/basilisk_overheat) + +/// Change what kind of beam we fire +/mob/living/basic/mining/basilisk/proc/set_projectile_type(projectile_type) + ranged_attacks.projectile_type = projectile_type + +/datum/ai_controller/basic_controller/basilisk + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_AGGRO_RANGE = 5, + ) + + 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/ranged_skirmish, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) diff --git a/code/modules/mob/living/basic/lavaland/basilisk/basilisk_overheat.dm b/code/modules/mob/living/basic/lavaland/basilisk/basilisk_overheat.dm new file mode 100644 index 0000000000000..c0b49fbdc6199 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/basilisk/basilisk_overheat.dm @@ -0,0 +1,76 @@ +/// Status effect gained by basilisks when they touch something hot +/datum/status_effect/basilisk_overheat + id = "basilisk_overheat" + duration = 3 MINUTES + /// Things which will chill us out if we get hit by them + var/static/list/chilling_reagents = list( + /datum/reagent/medicine/cryoxadone, + /datum/reagent/firefighting_foam, + /datum/reagent/consumable/frostoil, + /datum/reagent/consumable/ice, + /datum/reagent/water, + ) + +/datum/status_effect/basilisk_overheat/on_apply() + . = ..() + if (!. || !istype(owner, /mob/living/basic/mining/basilisk) || owner.stat != CONSCIOUS) + return FALSE + var/mob/living/basic/mining/basilisk/hot_stuff = owner + hot_stuff.visible_message(span_warning("[hot_stuff] is getting fired up!")) + hot_stuff.fully_heal() + hot_stuff.icon_living = "basilisk_alert" + hot_stuff.icon_state = "basilisk_alert" + hot_stuff.update_appearance(UPDATE_ICON_STATE) + hot_stuff.add_movespeed_modifier(/datum/movespeed_modifier/basilisk_overheat) + hot_stuff.set_projectile_type(/obj/projectile/basilisk_hot) + + RegisterSignal(hot_stuff, COMSIG_LIVING_DEATH, PROC_REF(on_death)) + RegisterSignal(hot_stuff, COMSIG_ATOM_EXPOSE_REAGENTS, PROC_REF(on_splashed)) + RegisterSignal(hot_stuff, COMSIG_ATOM_BULLET_ACT, PROC_REF(on_shot)) + +/datum/status_effect/basilisk_overheat/on_remove() + . = ..() + var/mob/living/basic/mining/basilisk/hot_stuff = owner + hot_stuff.icon_living = "basilisk" + hot_stuff.icon_state = "basilisk" + hot_stuff.set_projectile_type(/obj/projectile/temp/watcher) + + hot_stuff.update_appearance(UPDATE_ICON_STATE) + hot_stuff.remove_movespeed_modifier(/datum/movespeed_modifier/basilisk_overheat) + UnregisterSignal(hot_stuff, list(COMSIG_LIVING_DEATH, COMSIG_ATOM_EXPOSE_REAGENTS, COMSIG_ATOM_BULLET_ACT)) + + if (hot_stuff.stat != CONSCIOUS) + return + hot_stuff.visible_message(span_notice("[hot_stuff] seems to have cooled down.")) + var/obj/effect/particle_effect/fluid/smoke/poof = new(get_turf(hot_stuff)) + poof.lifetime = 2 SECONDS + +/// Cool down if we die +/datum/status_effect/basilisk_overheat/proc/on_death() + SIGNAL_HANDLER + qdel(src) + +/// Cool down if splashed with water +/datum/status_effect/basilisk_overheat/proc/on_splashed(atom/source, list/reagents, datum/reagents/source_reagents, methods, volume_modifier, show_message) + SIGNAL_HANDLER + if(!(methods & (TOUCH|VAPOR))) + return + for (var/datum/reagent in reagents) + if (!is_type_in_list(reagent, chilling_reagents)) + continue + qdel(src) + return + +/// Cool down if shot with a cryo beam +/datum/status_effect/basilisk_overheat/proc/on_shot(datum/source, obj/projectile/temp/cryo_shot) + SIGNAL_HANDLER + if (!istype(cryo_shot) || cryo_shot.temperature > 0) + return + qdel(src) + +/// Projectile basilisks use when hot +/obj/projectile/basilisk_hot + name = "energy blast" + icon_state = "chronobolt" + damage = 40 + damage_type = BRUTE diff --git a/code/modules/mob/living/basic/lavaland/bileworm/_bileworm.dm b/code/modules/mob/living/basic/lavaland/bileworm/_bileworm.dm index c38f2b9e4698f..3d6bc299ccd81 100644 --- a/code/modules/mob/living/basic/lavaland/bileworm/_bileworm.dm +++ b/code/modules/mob/living/basic/lavaland/bileworm/_bileworm.dm @@ -5,7 +5,6 @@ icon_state = "bileworm" icon_living = "bileworm" icon_dead = "bileworm_dead" - mob_size = MOB_SIZE_LARGE mob_biotypes = MOB_BUG maxHealth = 100 health = 100 @@ -13,6 +12,8 @@ verb_ask = "spittles questioningly" verb_exclaim = "splutters and gurgles" verb_yell = "splutters and gurgles" + crusher_loot = /obj/item/crusher_trophy/bileworm_spewlet + crusher_drop_chance = 15 butcher_results = list(/obj/item/food/meat/slab/bugmeat = 4) guaranteed_butcher_results = list( /obj/effect/gibspawner/generic = 1, @@ -20,6 +21,7 @@ /obj/item/stack/ore/gold = 2, ) death_message = "seizes up and falls limp, slowly receeding into its burrow with a dying gurgle..." + throw_blocked_message = "is absorbed by the spongy hide of" //it can't be dragged, just butcher it move_resist = INFINITY @@ -41,7 +43,6 @@ if(ispath(evolve_path)) AddComponent(/datum/component/evolutionary_leap, 30 MINUTES, evolve_path) - AddElement(/datum/element/crusher_loot, /obj/item/crusher_trophy/bileworm_spewlet, 15) AddElement(/datum/element/content_barfer) //setup mob abilities diff --git a/code/modules/mob/living/basic/lavaland/bileworm/bileworm_actions.dm b/code/modules/mob/living/basic/lavaland/bileworm/bileworm_actions.dm index c3e753d992e78..b6f7468697a40 100644 --- a/code/modules/mob/living/basic/lavaland/bileworm/bileworm_actions.dm +++ b/code/modules/mob/living/basic/lavaland/bileworm/bileworm_actions.dm @@ -117,7 +117,7 @@ to_chat(devourer, span_warning("Someone stole your dinner!")) return to_chat(target, span_userdanger("You are consumed by [devourer]!")) - devourer.visible_message("[devourer] consumes [target]!") + devourer.visible_message(span_warning("[devourer] consumes [target]!")) devourer.fully_heal() playsound(devourer, 'sound/effects/splat.ogg', 50, TRUE) //to be recieved on death diff --git a/code/modules/mob/living/basic/lavaland/bileworm/bileworm_ai.dm b/code/modules/mob/living/basic/lavaland/bileworm/bileworm_ai.dm index 28a5b02679723..0093e69220c17 100644 --- a/code/modules/mob/living/basic/lavaland/bileworm/bileworm_ai.dm +++ b/code/modules/mob/living/basic/lavaland/bileworm/bileworm_ai.dm @@ -1,6 +1,6 @@ /datum/ai_controller/basic_controller/bileworm blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/bileworm(), ) planning_subtrees = list( @@ -9,12 +9,13 @@ /datum/ai_planning_subtree/bileworm_execute, ) +/datum/targetting_datum/basic/bileworm + ignore_sight = TRUE + /datum/ai_planning_subtree/bileworm_attack /datum/ai_planning_subtree/bileworm_attack/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) - - var/mob/living/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] - if(QDELETED(target)) + if (!controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET)) return var/datum/action/cooldown/mob_cooldown/resurface = controller.blackboard[BB_BILEWORM_RESURFACE] @@ -31,8 +32,11 @@ /datum/ai_planning_subtree/bileworm_execute/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) - var/mob/living/target = controller.blackboard[BB_BASIC_MOB_EXECUTION_TARGET] - if(QDELETED(target) || target.stat < UNCONSCIOUS) + var/atom/movable/target = controller.blackboard[BB_BASIC_MOB_EXECUTION_TARGET] + if(QDELETED(target) || !isliving(target)) + return + var/mob/living/living_target = target + if(living_target.stat < UNCONSCIOUS) return controller.queue_behavior(/datum/ai_behavior/targeted_mob_ability, BB_BILEWORM_DEVOUR, BB_BASIC_MOB_EXECUTION_TARGET) diff --git a/code/modules/mob/living/basic/lavaland/brimdemon/brimbeam.dm b/code/modules/mob/living/basic/lavaland/brimdemon/brimbeam.dm new file mode 100644 index 0000000000000..29a3de60029f6 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/brimdemon/brimbeam.dm @@ -0,0 +1,126 @@ +/// Fires a bloody beam. Brimdemon Blast! +/datum/action/cooldown/mob_cooldown/brimbeam + name = "brimstone blast" + desc = "Unleash a barrage of infernal energies in the targeted direction." + button_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + button_icon_state = "brimdemon_firing" + background_icon_state = "bg_demon" + overlay_icon_state = "bg_demon_border" + click_to_activate = TRUE + cooldown_time = 5 SECONDS + melee_cooldown_time = 0 + check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED + /// How far does our beam go? + var/beam_range = 10 + /// How long does our beam last? + var/beam_duration = 2 SECONDS + /// How long do we wind up before firing? + var/charge_duration = 1 SECONDS + /// Overlay we show when we're about to fire + var/static/image/direction_overlay = image('icons/mob/simple/lavaland/lavaland_monsters.dmi', "brimdemon_telegraph_dir") + /// A list of all the beam parts. + var/list/beam_parts = list() + +/datum/action/cooldown/mob_cooldown/brimbeam/Destroy() + extinguish_laser() + return ..() + +/datum/action/cooldown/mob_cooldown/brimbeam/Activate(atom/target) + StartCooldown(360 SECONDS) + + owner.face_atom(target) + owner.move_resist = MOVE_FORCE_VERY_STRONG + owner.add_overlay(direction_overlay) + owner.balloon_alert_to_viewers("charging...") + + var/fully_charged = do_after(owner, delay = charge_duration, target = owner) + owner.cut_overlay(direction_overlay) + if (!fully_charged) + StartCooldown() + return TRUE + + if (!fire_laser()) + var/static/list/fail_emotes = list("coughs.", "wheezes.", "belches out a puff of black smoke.") + owner.manual_emote(pick(fail_emotes)) + StartCooldown() + return TRUE + + do_after(owner, delay = beam_duration, target = owner) + extinguish_laser() + StartCooldown() + return TRUE + +/// Create a laser in the direction we are facing +/datum/action/cooldown/mob_cooldown/brimbeam/proc/fire_laser() + owner.visible_message(span_danger("[owner] fires a brimbeam!")) + playsound(owner, 'sound/creatures/brimdemon.ogg', 150, FALSE, 0, 3) + var/turf/target_turf = get_ranged_target_turf(owner, owner.dir, beam_range) + var/turf/origin_turf = get_turf(owner) + var/list/affected_turfs = get_line(origin_turf, target_turf) - origin_turf + for(var/turf/affected_turf in affected_turfs) + if(affected_turf.opacity) + break + var/blocked = FALSE + for(var/obj/potential_block in affected_turf.contents) + if(potential_block.opacity) + blocked = TRUE + break + if(blocked) + break + var/atom/new_brimbeam = new /obj/effect/brimbeam(affected_turf) + new_brimbeam.dir = owner.dir + beam_parts += new_brimbeam + for(var/mob/living/hit_mob in affected_turf.contents) + hit_mob.apply_damage(damage = 25, damagetype = BURN) + to_chat(hit_mob, span_userdanger("You're blasted by [owner]'s brimbeam!")) + RegisterSignal(new_brimbeam, COMSIG_QDELETING, PROC_REF(extinguish_laser)) // In case idk a singularity eats it or something + if(!length(beam_parts)) + return FALSE + var/atom/last_brimbeam = beam_parts[length(beam_parts)] + last_brimbeam.icon_state = "brimbeam_end" + var/atom/first_brimbeam = beam_parts[1] + first_brimbeam.icon_state = "brimbeam_start" + return TRUE + +/// Get rid of our laser when we are done with it +/datum/action/cooldown/mob_cooldown/brimbeam/proc/extinguish_laser() + if(!length(beam_parts)) + return FALSE + owner.move_resist = initial(owner.move_resist) + for(var/obj/effect/brimbeam/beam in beam_parts) + beam.disperse() + beam_parts = list() + +/// Segments of the actual beam, these hurt if you stand in them +/obj/effect/brimbeam + name = "brimbeam" + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "brimbeam_mid" + layer = ABOVE_MOB_LAYER + plane = ABOVE_GAME_PLANE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + light_color = LIGHT_COLOR_BLOOD_MAGIC + light_power = 3 + light_range = 2 + +/obj/effect/brimbeam/Initialize(mapload) + . = ..() + START_PROCESSING(SSfastprocess, src) + +/obj/effect/brimbeam/Destroy() + STOP_PROCESSING(SSfastprocess, src) + return ..() + +/obj/effect/brimbeam/process() + for(var/mob/living/hit_mob in get_turf(src)) + damage(hit_mob) + +/// Hurt the passed mob +/obj/effect/brimbeam/proc/damage(mob/living/hit_mob) + hit_mob.apply_damage(damage = 5, damagetype = BURN) + to_chat(hit_mob, span_danger("You're damaged by [src]!")) + +/// Disappear +/obj/effect/brimbeam/proc/disperse() + animate(src, time = 0.5 SECONDS, alpha = 0) + QDEL_IN(src, 0.5 SECONDS) diff --git a/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon.dm b/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon.dm new file mode 100644 index 0000000000000..2c22977d9c637 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon.dm @@ -0,0 +1,87 @@ +/// Lavaland mob which tries to line up with its target and fire a laser +/mob/living/basic/mining/brimdemon + name = "brimdemon" + desc = "A volatile creature resembling an enormous horned skull. Its response to almost any stimulus is to unleash a beam of infernal energy." + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "brimdemon" + icon_living = "brimdemon" + icon_dead = "brimdemon_dead" + speed = 3 + maxHealth = 250 + health = 250 + friendly_verb_continuous = "scratches at" + friendly_verb_simple = "scratch at" + speak_emote = list("cackles") + melee_damage_lower = 7.5 + melee_damage_upper = 7.5 + attack_sound = 'sound/weapons/bite.ogg' + melee_attack_cooldown = 0.6 SECONDS + attack_vis_effect = ATTACK_EFFECT_BITE + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + death_message = "wails as infernal energy escapes from its wounds, leaving it an empty husk." + death_sound = 'sound/magic/demon_dies.ogg' + light_color = LIGHT_COLOR_BLOOD_MAGIC + light_power = 5 + light_range = 1.4 + + ai_controller = /datum/ai_controller/basic_controller/brimdemon + + crusher_loot = /obj/item/crusher_trophy/brimdemon_fang + butcher_results = list( + /obj/item/food/meat/slab = 2, + /obj/effect/decal/cleanable/brimdust = 1, + /obj/item/organ/internal/monster_core/brimdust_sac = 1, + ) + /// How we get blasting + var/datum/action/cooldown/mob_cooldown/brimbeam/beam + +/mob/living/basic/mining/brimdemon/Initialize(mapload) + . = ..() + AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW) + beam = new(src) + beam.Grant(src) + ai_controller.set_blackboard_key(BB_TARGETTED_ACTION, beam) + +/mob/living/basic/mining/brimdemon/Destroy() + QDEL_NULL(beam) + return ..() + +/mob/living/basic/mining/brimdemon/RangedAttack(atom/target, modifiers) + beam.Trigger(target = target) + +/mob/living/basic/mining/brimdemon/death(gibbed) + . = ..() + if (gibbed) + return + var/obj/effect/temp_visual/brim_burst/bang = new(loc) + forceMove(bang) + +/// Show a funny animation before doing an explosion +/obj/effect/temp_visual/brim_burst + name = "bursting brimdemon" + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "brimdemon_dead" + duration = 1.9 SECONDS + +/obj/effect/temp_visual/brim_burst/Initialize(mapload) + . = ..() + addtimer(CALLBACK(src, PROC_REF(bang)), duration - (1 DECISECONDS), TIMER_DELETE_ME) + animate(src, color = "#ff8888", transform = matrix().Scale(1.1), time = 0.7 SECONDS) + animate(color = "#ffffff", transform = matrix(), time = 0.2 SECONDS) + animate(color = "#ff4444", transform = matrix().Scale(1.3), time = 0.5 SECONDS) + animate(color = "#ffffff", transform = matrix(), time = 0.2 SECONDS) + animate(color = "#ff0000", transform = matrix().Scale(1.5), time = 0.3 SECONDS) + +/// Make an explosion +/obj/effect/temp_visual/brim_burst/proc/bang() + var/turf/origin_turf = get_turf(src) + playsound(origin_turf, 'sound/effects/pop_expl.ogg', 50) + new /obj/effect/temp_visual/explosion/fast(origin_turf) + var/list/possible_targets = range(1, origin_turf) + for(var/mob/living/target in possible_targets) + var/armor = target.run_armor_check(attack_flag = BOMB) + target.apply_damage(20, damagetype = BURN, blocked = armor, spread_damage = TRUE) + + for (var/atom/movable/thing as anything in contents) + thing.forceMove(loc) diff --git a/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_ai.dm b/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_ai.dm new file mode 100644 index 0000000000000..e5d793fa15046 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_ai.dm @@ -0,0 +1,50 @@ +/** + * Slap someone who is nearby, line up with target, blast with a beam + */ +/datum/ai_controller/basic_controller/brimdemon + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/brimdemon, + ) + + ai_traits = PAUSE_DURING_DO_AFTER + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk/no_target + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_melee_attack_subtree/opportunistic, + /datum/ai_planning_subtree/move_to_cardinal/brimdemon, + /datum/ai_planning_subtree/targeted_mob_ability/brimbeam, + ) + +/datum/targetting_datum/basic/brimdemon + stat_attack = HARD_CRIT + +/datum/ai_planning_subtree/move_to_cardinal/brimdemon + move_behaviour = /datum/ai_behavior/move_to_cardinal/brimdemon + +/datum/ai_behavior/move_to_cardinal/brimdemon + minimum_distance = 2 + +/datum/ai_behavior/move_to_cardinal/brimdemon/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + if (!succeeded) + return + var/mob/living/target = controller.blackboard[target_key] + var/datum/action/cooldown/ability = controller.blackboard[BB_TARGETTED_ACTION] + if(!ability?.IsAvailable()) + return + ability.InterceptClickOn(caller = controller.pawn, target = target) + +/datum/ai_planning_subtree/targeted_mob_ability/brimbeam + use_ability_behaviour = /datum/ai_behavior/targeted_mob_ability/brimbeam + +/datum/ai_behavior/targeted_mob_ability/brimbeam + /// Don't shoot if too far away + var/max_target_distance = 9 + +/datum/ai_behavior/targeted_mob_ability/brimbeam/perform(seconds_per_tick, datum/ai_controller/controller, ability_key, target_key) + var/mob/living/target = controller.blackboard[target_key] + if (QDELETED(target) || !(get_dir(controller.pawn, target) in GLOB.cardinals) || get_dist(controller.pawn, target) > max_target_distance) + finish_action(controller, succeeded = FALSE, ability_key = ability_key, target_key = target_key) + return + return ..() diff --git a/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_loot.dm b/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_loot.dm new file mode 100644 index 0000000000000..9a45ed99e1c09 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_loot.dm @@ -0,0 +1,56 @@ +/// Brimdemon crusher trophy, it... makes a funny sound? +/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 + /// Cartoon punching vfx + 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) + +/// Reagent pool left by dying brimdemon +/obj/effect/decal/cleanable/brimdust + name = "brimdust" + desc = "Dust from a brimdemon. It is considered valuable for its' botanical abilities." + icon_state = "brimdust" + icon = 'icons/obj/mining.dmi' + layer = FLOOR_CLEAN_LAYER + mergeable_decal = FALSE + +/obj/effect/decal/cleanable/brimdust/Initialize(mapload) + . = ..() + reagents.add_reagent(/datum/reagent/brimdust, 15) + +/// Ashwalker ore sensor crafted from brimdemon ash +/obj/item/ore_sensor + name = "ore sensor" + desc = "Using demonic frequencies, this ear-mounted tool detects ores in the nearby terrain." + icon_state = "oresensor" + icon = 'icons/obj/mining.dmi' + slot_flags = ITEM_SLOT_EARS + var/range = 5 + var/cooldown = 4 SECONDS //between the standard and the advanced ore scanner in strength + COOLDOWN_DECLARE(ore_sensing_cooldown) + +/obj/item/ore_sensor/equipped(mob/user, slot, initial) + . = ..() + if(slot & ITEM_SLOT_EARS) + START_PROCESSING(SSobj, src) + else + STOP_PROCESSING(SSobj, src) + +/obj/item/ore_sensor/dropped(mob/user, silent) + . = ..() + STOP_PROCESSING(SSobj, src) + +/obj/item/ore_sensor/process(seconds_per_tick) + if(!COOLDOWN_FINISHED(src, ore_sensing_cooldown)) + return + COOLDOWN_START(src, ore_sensing_cooldown, cooldown) + mineral_scan_pulse(get_turf(src), range) diff --git a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm new file mode 100644 index 0000000000000..58b0e1bbbdb3c --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm @@ -0,0 +1,191 @@ +//An ore-devouring but easily scared creature +/mob/living/basic/mining/goldgrub + name = "goldgrub" + desc = "A worm that grows fat from eating everything in its sight. Seems to enjoy precious metals and other shiny things, hence the name." + icon = 'icons/mob/simple/lavaland/lavaland_monsters_wide.dmi' + icon_state = "goldgrub" + icon_living = "goldgrub" + icon_dead = "goldgrub_dead" + icon_gib = "syndicate_gib" + speed = 5 + pixel_x = -12 + base_pixel_x = -12 + mob_biotypes = MOB_ORGANIC|MOB_BEAST + friendly_verb_continuous = "harmlessly rolls into" + friendly_verb_simple = "harmlessly roll into" + maxHealth = 45 + health = 45 + melee_damage_lower = 0 + melee_damage_upper = 0 + attack_verb_continuous = "barrels into" + attack_verb_simple = "barrel into" + attack_sound = 'sound/weapons/punch1.ogg' + combat_mode = FALSE + speak_emote = list("screeches") + death_message = "stops moving as green liquid oozes from the carcass!" + status_flags = CANPUSH + gold_core_spawnable = HOSTILE_SPAWN + ai_controller = /datum/ai_controller/basic_controller/goldgrub + ///can this mob lay eggs + var/can_lay_eggs = TRUE + ///can we tame this mob + var/can_tame = TRUE + //pet commands when we tame the grub + var/list/pet_commands = list( + /datum/pet_command/idle, + /datum/pet_command/free, + /datum/pet_command/grub_spit, + /datum/pet_command/follow, + /datum/pet_command/point_targetting/fetch, + ) + +/mob/living/basic/mining/goldgrub/Initialize(mapload) + . = ..() + + if(mapload) + generate_loot() + else + can_lay_eggs = FALSE + + var/datum/action/cooldown/mob_cooldown/spit_ore/spit = new(src) + var/datum/action/cooldown/mob_cooldown/burrow/burrow = new(src) + spit.Grant(src) + burrow.Grant(src) + ai_controller.set_blackboard_key(BB_SPIT_ABILITY, spit) + ai_controller.set_blackboard_key(BB_BURROW_ABILITY, burrow) + AddElement(/datum/element/wall_smasher) + AddComponent(/datum/component/ai_listen_to_weather) + AddComponent(\ + /datum/component/appearance_on_aggro,\ + overlay_icon = 'icons/mob/simple/lavaland/lavaland_monsters_wide.dmi',\ + overlay_state = "goldgrub_alert",\ + ) + if(can_tame) + make_tameable() + if(can_lay_eggs) + make_egg_layer() + +/mob/living/basic/mining/goldgrub/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) + . = ..() + if(!.) + return + + if(!proximity_flag) + return + + if(istype(attack_target, /obj/item/stack/ore)) + consume_ore(attack_target) + +/mob/living/basic/mining/goldgrub/bullet_act(obj/projectile/bullet) + if(stat == DEAD) + return BULLET_ACT_FORCE_PIERCE + + visible_message(span_danger("The [bullet.name] is repelled by [src]'s girth!")) + return BULLET_ACT_BLOCK + +/mob/living/basic/mining/goldgrub/proc/barf_contents(gibbed) + playsound(src, 'sound/effects/splat.ogg', 50, TRUE) + for(var/obj/item/ore as anything in src) + ore.forceMove(loc) + if(!gibbed) + visible_message(span_danger("[src] spits out its consumed ores!")) + +/mob/living/basic/mining/goldgrub/proc/generate_loot() + var/loot_amount = rand(1,3) + var/list/weight_lootdrops = list( + /obj/item/stack/ore/silver = 4, + /obj/item/stack/ore/gold = 3, + /obj/item/stack/ore/uranium = 3, + /obj/item/stack/ore/diamond = 1, + ) + for(var/i in 1 to loot_amount) + var/picked_loot = pick_weight(weight_lootdrops) + new picked_loot(src) + +/mob/living/basic/mining/goldgrub/death(gibbed) + barf_contents(gibbed) + return ..() + +/mob/living/basic/mining/goldgrub/proc/make_tameable() + AddComponent(\ + /datum/component/tameable,\ + food_types = list(/obj/item/stack/ore),\ + tame_chance = 25,\ + bonus_tame_chance = 5,\ + after_tame = CALLBACK(src, PROC_REF(tame_grub)),\ + ) + +/mob/living/basic/mining/goldgrub/proc/tame_grub() + new /obj/effect/temp_visual/heart(src.loc) + AddElement(/datum/element/ridable, /datum/component/riding/creature/goldgrub) + AddComponent(/datum/component/obeys_commands, pet_commands) + +/mob/living/basic/mining/goldgrub/proc/make_egg_layer() + AddComponent(\ + /datum/component/egg_layer,\ + /obj/item/food/egg/green/grub_egg,\ + list(/obj/item/stack/ore/bluespace_crystal),\ + lay_messages = EGG_LAYING_MESSAGES,\ + eggs_left = 0,\ + eggs_added_from_eating = 1,\ + max_eggs_held = 1,\ + ) + +/mob/living/basic/mining/goldgrub/proc/consume_ore(obj/item/target_ore) + playsound(src,'sound/items/eatfood.ogg', rand(10,50), TRUE) + target_ore.forceMove(src) + if(!can_lay_eggs) + return + if(!istype(target_ore, /obj/item/stack/ore/bluespace_crystal) || prob(60)) + return + new /obj/item/food/egg/green/grub_egg(get_turf(src)) + +/mob/living/basic/mining/goldgrub/baby + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + name = "goldgrub baby" + icon_state = "grub_baby" + icon_living = "grub_baby" + icon_dead = "grub_baby_dead" + pixel_x = 0 + base_pixel_x = 0 + speed = 3 + maxHealth = 25 + health = 25 + gold_core_spawnable = NO_SPAWN + can_tame = FALSE + can_lay_eggs = FALSE + ai_controller = /datum/ai_controller/basic_controller/babygrub + +/mob/living/basic/mining/goldgrub/baby/Initialize(mapload) + . = ..() + AddComponent(\ + /datum/component/growth_and_differentiation,\ + growth_time = 5 MINUTES,\ + growth_path = /mob/living/basic/mining/goldgrub,\ + growth_probability = 100,\ + lower_growth_value = 0.5,\ + upper_growth_value = 1,\ + signals_to_kill_on = list(COMSIG_MOB_CLIENT_LOGIN),\ + optional_checks = CALLBACK(src, PROC_REF(ready_to_grow)),\ + ) + +/mob/living/basic/mining/goldgrub/baby/proc/ready_to_grow() + return (stat == CONSCIOUS && !is_jaunting(src)) + +/obj/item/food/egg/green/grub_egg + name = "grub egg" + desc = "Covered in disgusting fluid." + + +/obj/item/food/egg/green/grub_egg/Initialize(mapload) + . = ..() + AddComponent(\ + /datum/component/fertile_egg,\ + embryo_type = /mob/living/basic/mining/goldgrub/baby,\ + minimum_growth_rate = 1,\ + maximum_growth_rate = 2,\ + total_growth_required = 100,\ + current_growth = 0,\ + location_allowlist = typecacheof(list(/turf)),\ + ) + diff --git a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_abilities.dm b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_abilities.dm new file mode 100644 index 0000000000000..fe8c8096e2ce1 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_abilities.dm @@ -0,0 +1,85 @@ +/datum/action/cooldown/mob_cooldown/spit_ore + name = "Spit Ore" + desc = "Vomit out all of your consumed ores." + click_to_activate = FALSE + cooldown_time = 5 SECONDS + +/datum/action/cooldown/mob_cooldown/spit_ore/IsAvailable(feedback) + if(is_jaunting(owner)) + if(feedback) + owner.balloon_alert(owner, "currently underground!") + return FALSE + + if(!length(owner.contents)) + if(feedback) + owner.balloon_alert(owner, "no ores to spit!") + return FALSE + return TRUE + +/datum/action/cooldown/mob_cooldown/spit_ore/Activate() + var/mob/living/basic/mining/goldgrub/grub_owner = owner + grub_owner.barf_contents() + StartCooldown() + return TRUE + +/datum/action/cooldown/mob_cooldown/burrow + name = "Burrow" + desc = "Burrow under soft ground, evading predators and increasing your speed." + cooldown_time = 7 SECONDS + click_to_activate = FALSE + +/datum/action/cooldown/mob_cooldown/burrow/IsAvailable(feedback) + . = ..() + if (!.) + return FALSE + var/turf/location = get_turf(owner) + + if(!isasteroidturf(location) && !ismineralturf(location)) + if(feedback) + owner.balloon_alert(owner, "available only on mining floor or wall!") + return FALSE + + return TRUE + +/datum/action/cooldown/mob_cooldown/burrow/Activate() + var/obj/effect/dummy/phased_mob/grub_burrow/holder = null + var/turf/current_loc = get_turf(owner) + + if(!do_after(owner, 3 SECONDS, target = current_loc)) + owner.balloon_alert(owner, "need to stay still!") + return + + if(get_turf(owner) != current_loc) + to_chat(owner, span_warning("Action cancelled, as you moved while reappearing.")) + return + + if(!is_jaunting(owner)) + owner.visible_message(span_danger("[owner] buries into the ground, vanishing from sight!")) + playsound(get_turf(owner), 'sound/effects/break_stone.ogg', 50, TRUE, -1) + holder = new /obj/effect/dummy/phased_mob/grub_burrow(current_loc, owner) + return TRUE + + holder = owner.loc + holder.eject_jaunter() + holder = null + owner.visible_message(span_danger("[owner] emerges from the ground!")) + + if(ismineralturf(current_loc)) + var/turf/closed/mineral/mineral_turf = current_loc + mineral_turf.gets_drilled(owner) + + playsound(current_loc, 'sound/effects/break_stone.ogg', 50, TRUE, -1) + StartCooldown() + return TRUE + +/obj/effect/dummy/phased_mob/grub_burrow + +/obj/effect/dummy/phased_mob/grub_burrow/phased_check(mob/living/user, direction) + . = ..() + + if(!.) + return + + if(!ismineralturf(.) && !isasteroidturf(.)) + to_chat(user, span_warning("You cannot dig through this floor!")) + return null diff --git a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_ai.dm b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_ai.dm new file mode 100644 index 0000000000000..58efaf1f81b46 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_ai.dm @@ -0,0 +1,176 @@ +/datum/ai_controller/basic_controller/goldgrub + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends, + BB_ORE_IGNORE_TYPES = list(/obj/item/stack/ore/iron, /obj/item/stack/ore/glass), + BB_BASIC_MOB_FLEEING = TRUE, + BB_STORM_APPROACHING = FALSE, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk/less_walking + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/pet_planning, + /datum/ai_planning_subtree/dig_away_from_danger, + /datum/ai_planning_subtree/flee_target, + /datum/ai_planning_subtree/find_and_hunt_target/consume_ores, + /datum/ai_planning_subtree/find_and_hunt_target/baby_egg, + /datum/ai_planning_subtree/grub_mine, + ) + +/datum/ai_controller/basic_controller/babygrub + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_ORE_IGNORE_TYPES = list(/obj/item/stack/ore/glass), + BB_FIND_MOM_TYPES = list(/mob/living/basic/mining/goldgrub), + BB_IGNORE_MOM_TYPES = list(/mob/living/basic/mining/goldgrub/baby), + BB_BASIC_MOB_FLEEING = TRUE, + BB_STORM_APPROACHING = FALSE, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk/less_walking + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/dig_away_from_danger, + /datum/ai_planning_subtree/find_and_hunt_target/consume_ores, + /datum/ai_planning_subtree/flee_target, + /datum/ai_planning_subtree/look_for_adult, + ) + +///consume food! +/datum/ai_planning_subtree/find_and_hunt_target/consume_ores + target_key = BB_ORE_TARGET + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/consume_ores + finding_behavior = /datum/ai_behavior/find_hunt_target/consume_ores + hunt_targets = list(/obj/item/stack/ore) + hunt_chance = 75 + hunt_range = 9 + +/datum/ai_behavior/find_hunt_target/consume_ores + +/datum/ai_behavior/find_hunt_target/consume_ores/valid_dinner(mob/living/basic/source, obj/item/stack/ore/target, radius) + var/list/forbidden_ore = source.ai_controller.blackboard[BB_ORE_IGNORE_TYPES] + + if(is_type_in_list(target, forbidden_ore)) + return FALSE + + if(target in source) + return FALSE + + var/obj/item/pet_target = source.ai_controller.blackboard[BB_CURRENT_PET_TARGET] + if(target == pet_target) //we are currently fetching this ore for master, dont eat it! + return FALSE + + return can_see(source, target, radius) + +/datum/ai_behavior/hunt_target/unarmed_attack_target/consume_ores + always_reset_target = TRUE + +///find our child's egg and pull it! +/datum/ai_planning_subtree/find_and_hunt_target/baby_egg + target_key = BB_LOW_PRIORITY_HUNTING_TARGET + hunting_behavior = /datum/ai_behavior/hunt_target/grub_egg + finding_behavior = /datum/ai_behavior/find_hunt_target + hunt_targets = list(/obj/item/food/egg/green/grub_egg) + hunt_chance = 75 + hunt_range = 9 + +/datum/ai_planning_subtree/find_and_hunt_target/baby_egg + +/datum/ai_planning_subtree/find_and_hunt_target/baby_egg/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + if(living_pawn.pulling) //we are already pulling something + return + return ..() + +/datum/ai_behavior/hunt_target/grub_egg + always_reset_target = TRUE + +/datum/ai_behavior/hunt_target/grub_egg/target_caught(mob/living/hunter, obj/item/target) + hunter.start_pulling(target) + + +///only dig away if storm is coming or if humans are around +/datum/ai_planning_subtree/dig_away_from_danger + +/datum/ai_planning_subtree/dig_away_from_danger/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/currently_underground = is_jaunting(controller.pawn) + var/storm_approaching = controller.blackboard[BB_STORM_APPROACHING] + + //dont do anything until the storm passes + if(currently_underground && storm_approaching) + return SUBTREE_RETURN_FINISH_PLANNING + + var/datum/action/cooldown/dig_ability = controller.blackboard[BB_BURROW_ABILITY] + + if(!dig_ability.IsAvailable()) + return + + var/has_target = controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET) + + //a storm is coming or someone is nearby, its time to escape + if(currently_underground) + if(has_target) + return + controller.queue_behavior(/datum/ai_behavior/use_mob_ability/burrow, BB_BURROW_ABILITY) + return SUBTREE_RETURN_FINISH_PLANNING + if(storm_approaching || has_target) + controller.queue_behavior(/datum/ai_behavior/use_mob_ability/burrow, BB_BURROW_ABILITY) + return SUBTREE_RETURN_FINISH_PLANNING + +/datum/ai_behavior/use_mob_ability/burrow + behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + +///mine walls to look for food! +/datum/ai_planning_subtree/grub_mine + +/datum/ai_planning_subtree/grub_mine/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(controller.blackboard_key_exists(BB_TARGET_MINERAL_WALL)) + controller.queue_behavior(/datum/ai_behavior/mine_wall, BB_TARGET_MINERAL_WALL) + return SUBTREE_RETURN_FINISH_PLANNING + controller.queue_behavior(/datum/ai_behavior/find_mineral_wall, BB_TARGET_MINERAL_WALL) + +/datum/ai_behavior/mine_wall + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + action_cooldown = 15 SECONDS + +/datum/ai_behavior/mine_wall/setup(datum/ai_controller/controller, target_key) + . = ..() + var/turf/target = controller.blackboard[target_key] + if(isnull(target)) + return FALSE + set_movement_target(controller, target) + +/datum/ai_behavior/mine_wall/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + var/mob/living/basic/living_pawn = controller.pawn + var/turf/closed/mineral/target = controller.blackboard[target_key] + var/is_gibtonite_turf = istype(target, /turf/closed/mineral/gibtonite) + if(QDELETED(target)) + finish_action(controller, FALSE, target_key) + return + living_pawn.melee_attack(target) + if(is_gibtonite_turf) + living_pawn.manual_emote("sighs...") //accept whats about to happen to us + + finish_action(controller, TRUE, target_key) + return + +/datum/ai_behavior/mine_wall/finish_action(datum/ai_controller/controller, success, target_key) + . = ..() + controller.clear_blackboard_key(target_key) + +/datum/pet_command/grub_spit + command_name = "Spit" + command_desc = "Ask your grub pet to spit out its ores." + speech_commands = list("spit", "ores") + +/datum/pet_command/grub_spit/execute_action(datum/ai_controller/controller) + var/datum/action/cooldown/spit_ability = controller.blackboard[BB_SPIT_ABILITY] + if(!spit_ability?.IsAvailable()) + return + controller.queue_behavior(/datum/ai_behavior/use_mob_ability, BB_SPIT_ABILITY) + controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND) + return SUBTREE_RETURN_FINISH_PLANNING diff --git a/code/modules/mob/living/basic/lavaland/goliath/goliath.dm b/code/modules/mob/living/basic/lavaland/goliath/goliath.dm new file mode 100644 index 0000000000000..b99e254853ead --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/goliath/goliath.dm @@ -0,0 +1,234 @@ +/// Slow moving mob which attempts to immobilise its target +/mob/living/basic/mining/goliath + name = "goliath" + desc = "A hulking, armor-plated beast with long tendrils arching from its back." + icon = 'icons/mob/simple/lavaland/lavaland_monsters_wide.dmi' + icon_state = "goliath" + icon_living = "goliath" + icon_dead = "goliath_dead" + pixel_x = -12 + base_pixel_x = -12 + gender = MALE // Female ones are the bipedal elites + speed = 30 + basic_mob_flags = IMMUNE_TO_FISTS + maxHealth = 300 + health = 300 + friendly_verb_continuous = "wails at" + friendly_verb_simple = "wail at" + speak_emote = list("bellows") + obj_damage = 100 + melee_damage_lower = 25 + melee_damage_upper = 25 + attack_sound = 'sound/weapons/punch1.ogg' + attack_verb_continuous = "pulverizes" + attack_verb_simple = "pulverize" + throw_blocked_message = "does nothing to the tough hide of" + move_force = MOVE_FORCE_VERY_STRONG + move_resist = MOVE_FORCE_VERY_STRONG + pull_force = MOVE_FORCE_VERY_STRONG + + ai_controller = /datum/ai_controller/basic_controller/goliath + + 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) + /// Icon state to use when tentacles are available + var/tentacle_warning_state = "goliath_preattack" + /// Can this kind of goliath be tamed? + var/tameable = TRUE + /// Has this particular goliath been tamed? + var/tamed = FALSE + /// Can someone ride us around like a horse? + var/saddled = FALSE + /// Slight cooldown to prevent double-dipping if we use both abilities at once + COOLDOWN_DECLARE(ability_animation_cooldown) + /// Our base tentacles ability + var/datum/action/cooldown/mob_cooldown/goliath_tentacles/tentacles + /// Our long-ranged tentacles ability + var/datum/action/cooldown/mob_cooldown/tentacle_grasp/tentacle_line + /// Things we want to eat off the floor (or a plate, we're not picky) + var/static/list/goliath_foods = list(/obj/item/food/grown/ash_flora, /obj/item/food/bait/worm) + +/mob/living/basic/mining/goliath/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_TENTACLE_IMMUNE, INNATE_TRAIT) + AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/footstep, FOOTSTEP_MOB_HEAVY) + AddElement(/datum/element/basic_eating, heal_amt = 10, food_types = goliath_foods) + AddComponent(/datum/component/ai_target_timer) + AddComponent(/datum/component/basic_mob_attack_telegraph) + AddComponentFrom(INNATE_TRAIT, /datum/component/shovel_hands) + if (tameable) + 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)),\ + ) + + tentacles = new (src) + tentacles.Grant(src) + var/datum/action/cooldown/mob_cooldown/tentacle_burst/melee_tentacles = new (src) + melee_tentacles.Grant(src) + AddComponent(/datum/component/revenge_ability, melee_tentacles, targetting = ai_controller.blackboard[BB_TARGETTING_DATUM], max_range = 1, target_self = TRUE) + tentacle_line = new (src) + tentacle_line.Grant(src) + AddComponent(/datum/component/revenge_ability, tentacle_line, targetting = ai_controller.blackboard[BB_TARGETTING_DATUM], min_range = 2, max_range = 9) + + tentacles_ready() + RegisterSignal(src, COMSIG_MOB_ABILITY_FINISHED, PROC_REF(used_ability)) + ai_controller.set_blackboard_key(BB_BASIC_FOODS, goliath_foods) + ai_controller.set_blackboard_key(BB_GOLIATH_TENTACLES, tentacles) + + +/mob/living/basic/mining/goliath/Destroy() + QDEL_NULL(tentacles) + QDEL_NULL(tentacle_line) + return ..() + +/mob/living/basic/mining/goliath/examine(mob/user) + . = ..() + if (saddled) + . += span_info("Someone appears to have attached a saddle to this one.") + +/mob/living/basic/mining/goliath/revive(full_heal_flags, excess_healing, force_grab_ghost) + . = ..() + if (!.) + return + move_force = initial(move_force) + move_resist = initial(move_resist) + pull_force = initial(pull_force) + +/mob/living/basic/mining/goliath/death(gibbed) + move_force = MOVE_FORCE_DEFAULT + move_resist = MOVE_RESIST_DEFAULT + pull_force = PULL_FORCE_DEFAULT + return ..() + +// Goliaths can summon tentacles more frequently as they take damage, scary. +/mob/living/basic/mining/goliath/apply_damage(damage, damagetype, def_zone, blocked, forced, spread_damage, wound_bonus, bare_wound_bonus, sharpness, attack_direction, attacking_item) + . = ..() + if (!.) + return + if (damage <= 0) + return + if (tentacles.cooldown_time > 1 SECONDS) + tentacles.cooldown_time -= 1 SECONDS + +/mob/living/basic/mining/goliath/attackby(obj/item/attacking_item, mob/living/user, params) + if (!istype(attacking_item, /obj/item/goliath_saddle)) + return ..() + if (!tameable) + balloon_alert(user, "doesn't fit!") + return + if (saddled) + balloon_alert(user, "already saddled!") + return + if (!tamed) + balloon_alert(user, "too rowdy!") + return + balloon_alert(user, "affixing saddle...") + if (!do_after(user, delay = 5.5 SECONDS, target = src)) + return + balloon_alert(user, "ready to ride") + qdel(attacking_item) + saddled = TRUE + buckle_lying = 0 + add_overlay("goliath_saddled") + AddElement(/datum/element/ridable, /datum/component/riding/creature/goliath) + +/// When we use an ability, activate some kind of visual tell +/mob/living/basic/mining/goliath/proc/used_ability(mob/living/source, datum/action/cooldown/ability) + SIGNAL_HANDLER + if (stat == DEAD || ability.IsAvailable()) + return // We died or the action failed for some reason like being out of range + if (istype(ability, /datum/action/cooldown/mob_cooldown/goliath_tentacles)) + if (ability.cooldown_time <= 2 SECONDS) + return + icon_state = icon_living + addtimer(CALLBACK(src, PROC_REF(tentacles_ready)), ability.cooldown_time - 2 SECONDS, TIMER_DELETE_ME) + return + if (!COOLDOWN_FINISHED(src, ability_animation_cooldown)) + return + COOLDOWN_START(src, ability_animation_cooldown, 2 SECONDS) + playsound(src, 'sound/magic/demon_attack1.ogg', vol = 50, vary = TRUE) + Shake(1, 0, 1.5 SECONDS) + +/// Called slightly before tentacles ability comes off cooldown, as a warning +/mob/living/basic/mining/goliath/proc/tentacles_ready() + if (stat == DEAD) + return + icon_state = tentacle_warning_state + +/// Get ready for mounting +/mob/living/basic/mining/goliath/proc/tamed() + tamed = TRUE + +// Copy entire faction rather than just placing user into faction, to avoid tentacle peril on station +/mob/living/basic/mining/goliath/befriend(mob/living/new_friend) + . = ..() + faction = new_friend.faction.Copy() + +/mob/living/basic/mining/goliath/RangedAttack(atom/atom_target, modifiers) + tentacles?.Trigger(target = atom_target) + +/mob/living/basic/mining/goliath/ranged_secondary_attack(atom/atom_target, modifiers) + tentacle_line?.Trigger(target = atom_target) + +/// Legacy Goliath mob with different sprites, largely the same behaviour +/mob/living/basic/mining/goliath/ancient + name = "ancient goliath" + desc = "A massive beast that uses long tentacles to ensnare its prey, threatening them is not advised under any conditions." + icon = 'icons/mob/simple/lavaland/lavaland_monsters_wide.dmi' + icon_state = "ancient_goliath" + icon_living = "ancient_goliath" + icon_dead = "ancient_goliath_dead" + tentacle_warning_state = "ancient_goliath_preattack" + tameable = FALSE + +/// Rare Goliath variant which occasionally replaces the normal mining mob, releases shitloads of tentacles +/mob/living/basic/mining/goliath/ancient/immortal + name = "immortal 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." + maxHealth = 400 + health = 400 + crusher_drop_chance = 30 // Wow a whole 5% more likely, how generous + /// Don't re-check nearby turfs for this long + COOLDOWN_DECLARE(retarget_turfs_cooldown) + /// List of places we might spawn a tentacle, if we're alive + var/list/tentacle_target_turfs + +/mob/living/basic/mining/goliath/ancient/immortal/Life(seconds_per_tick, times_fired) + . = ..() + if (!. || !isturf(loc)) + return + if (!LAZYLEN(tentacle_target_turfs) || COOLDOWN_FINISHED(src, retarget_turfs_cooldown)) + cache_nearby_turfs() + for (var/turf/target_turf in tentacle_target_turfs) + if (target_turf.is_blocked_turf(exclude_mobs = TRUE)) + tentacle_target_turfs -= target_turf + continue + if (prob(10)) + new /obj/effect/goliath_tentacle(target_turf) + +/mob/living/basic/mining/goliath/ancient/immortal/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) + . = ..() + if (loc == old_loc || stat == DEAD || !isturf(loc)) + return + cache_nearby_turfs() + +/// Store nearby turfs in our list so we can pop them out later +/mob/living/basic/mining/goliath/ancient/immortal/proc/cache_nearby_turfs() + COOLDOWN_START(src, retarget_turfs_cooldown, 10 SECONDS) + LAZYCLEARLIST(tentacle_target_turfs) + for(var/turf/open/floor in orange(4, loc)) + LAZYADD(tentacle_target_turfs, floor) + +/// Use this to ride a goliath +/obj/item/goliath_saddle + name = "goliath saddle" + desc = "This rough saddle will give you a serviceable seat upon a goliath! Provided you can get one to stand still." + icon = 'icons/obj/mining.dmi' + icon_state = "goliath_saddle" diff --git a/code/modules/mob/living/basic/lavaland/goliath/goliath_actions.dm b/code/modules/mob/living/basic/lavaland/goliath/goliath_actions.dm new file mode 100644 index 0000000000000..bb8adaf61c3ec --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/goliath/goliath_actions.dm @@ -0,0 +1,89 @@ +/// Place some grappling tentacles underfoot +/datum/action/cooldown/mob_cooldown/goliath_tentacles + name = "Unleash Tentacles" + desc = "Unleash burrowed tentacles at a targetted location, grappling targets after a delay." + button_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + button_icon_state = "goliath_tentacle_wiggle" + background_icon_state = "bg_demon" + overlay_icon_state = "bg_demon_border" + click_to_activate = TRUE + cooldown_time = 12 SECONDS + melee_cooldown_time = 0 + check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED + shared_cooldown = NONE + /// Furthest range we can activate ability at + var/max_range = 7 + +/datum/action/cooldown/mob_cooldown/goliath_tentacles/PreActivate(atom/target) + target = get_turf(target) + if (get_dist(owner, target) > max_range) + return FALSE + return ..() + +/datum/action/cooldown/mob_cooldown/goliath_tentacles/Activate(atom/target) + new /obj/effect/goliath_tentacle(target) + var/list/directions = GLOB.cardinals.Copy() + for(var/i in 1 to 3) + var/spawndir = pick_n_take(directions) + var/turf/adjacent_target = get_step(target, spawndir) + if(adjacent_target) + new /obj/effect/goliath_tentacle(adjacent_target) + + if (isliving(target)) + owner.visible_message(span_warning("[owner] digs its tentacles under [target]!")) + StartCooldown() + return TRUE + +/// Place grappling tentacles around you to grab attackers +/datum/action/cooldown/mob_cooldown/tentacle_burst + name = "Tentacle Burst" + desc = "Unleash burrowed tentacles in an area around you, grappling targets after a delay." + button_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + button_icon_state = "goliath_tentacle_wiggle" + background_icon_state = "bg_demon" + overlay_icon_state = "bg_demon_border" + cooldown_time = 24 SECONDS + melee_cooldown_time = 0 + check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED + shared_cooldown = NONE + click_to_activate = FALSE + +/datum/action/cooldown/mob_cooldown/tentacle_burst/Activate(atom/target) + var/list/directions = GLOB.alldirs.Copy() + for (var/dir in directions) + var/turf/adjacent_target = get_step(target, dir) + if(adjacent_target) + new /obj/effect/goliath_tentacle(adjacent_target) + owner.visible_message(span_warning("[owner] unleashes tentacles from the ground around it!")) + StartCooldown() + return TRUE + +/// Summon a line of tentacles towards the target +/datum/action/cooldown/mob_cooldown/tentacle_grasp + name = "Tentacle Grasp" + desc = "Unleash burrowed tentacles in a line towards a targetted location, grappling targets after a delay." + button_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + button_icon_state = "goliath_tentacle_wiggle" + background_icon_state = "bg_demon" + overlay_icon_state = "bg_demon_border" + click_to_activate = TRUE + cooldown_time = 12 SECONDS + melee_cooldown_time = 0 + check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED + shared_cooldown = NONE + +/datum/action/cooldown/mob_cooldown/tentacle_grasp/Activate(atom/target) + new /obj/effect/temp_visual/effect_trail/burrowed_tentacle(owner.loc, target) + if (isliving(target)) + owner.visible_message(span_warning("[owner] reaches for [target] with its tentacles!")) + StartCooldown() + return TRUE + +/// An invisible effect which chases a target, spawning tentacles every so often. +/obj/effect/temp_visual/effect_trail/burrowed_tentacle + name = "burrowed_tentacle" + duration = 2 SECONDS + move_speed = 2 + homing = FALSE + spawn_interval = 0.1 SECONDS + spawned_effect = /obj/effect/goliath_tentacle diff --git a/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm b/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm new file mode 100644 index 0000000000000..7e723f5d93afa --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm @@ -0,0 +1,129 @@ +/// We won't use tentacles unless we have had the same target for this long +#define MIN_TIME_TO_TENTACLE 3 SECONDS + +/datum/ai_controller/basic_controller/goliath + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/allow_items/goliath, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate/check_faction, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/find_food, + /datum/ai_planning_subtree/targeted_mob_ability/goliath_tentacles, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree/goliath, + /datum/ai_planning_subtree/goliath_find_diggable_turf, + /datum/ai_planning_subtree/goliath_dig, + ) + +/datum/targetting_datum/basic/allow_items/goliath + stat_attack = HARD_CRIT + +/datum/ai_planning_subtree/basic_melee_attack_subtree/goliath + operational_datums = list(/datum/component/ai_target_timer) + melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/goliath + +/// Go for the tentacles if they're available +/datum/ai_behavior/basic_melee_attack/goliath + +/datum/ai_behavior/basic_melee_attack/goliath/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key, health_ratio_key) + var/time_on_target = controller.blackboard[BB_BASIC_MOB_HAS_TARGET_TIME] || 0 + if (time_on_target < MIN_TIME_TO_TENTACLE) + return ..() + var/mob/living/target = controller.blackboard[target_key] + // Interrupt attack chain to use tentacles, unless the target is already tentacled + if (ismecha(target) || (isliving(target) && !target.has_status_effect(/datum/status_effect/incapacitating/stun/goliath_tentacled))) + var/datum/action/cooldown/using_action = controller.blackboard[BB_GOLIATH_TENTACLES] + if (using_action?.IsAvailable()) + finish_action(controller, succeeded = FALSE) + return + return ..() + +/datum/ai_planning_subtree/targeted_mob_ability/goliath_tentacles + ability_key = BB_GOLIATH_TENTACLES + operational_datums = list(/datum/component/ai_target_timer) + +/datum/ai_planning_subtree/targeted_mob_ability/goliath_tentacles/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/target = controller.blackboard[target_key] + if (!(isliving(target) || ismecha(target)) || (isliving(target) && target.has_status_effect(/datum/status_effect/incapacitating/stun/goliath_tentacled))) + return // Target can be an item or already grabbed, we don't want to tentacle those + var/time_on_target = controller.blackboard[BB_BASIC_MOB_HAS_TARGET_TIME] || 0 + if (time_on_target < MIN_TIME_TO_TENTACLE) + return // We need to spend some time acquiring our target first + return ..() + +/// If we got nothing better to do, find a turf we can search for tasty roots and such +/datum/ai_planning_subtree/goliath_find_diggable_turf + +/datum/ai_planning_subtree/goliath_find_diggable_turf/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + controller.queue_behavior(/datum/ai_behavior/goliath_find_diggable_turf) + +/datum/ai_behavior/goliath_find_diggable_turf + action_cooldown = 2 SECONDS + /// Where do we store the target data + var/target_key = BB_GOLIATH_HOLE_TARGET + /// How far do we look for turfs? + var/scan_range = 3 + +/datum/ai_behavior/goliath_find_diggable_turf/perform(seconds_per_tick, datum/ai_controller/controller) + . = ..() + var/turf/target_turf = controller.blackboard[target_key] + if (is_valid_turf(target_turf)) + finish_action(controller, succeeded = FALSE) + return + + var/mob/living/pawn = controller.pawn + var/list/nearby_turfs = RANGE_TURFS(scan_range, pawn) + var/turf/check_turf = pick(nearby_turfs) // This isn't an efficient search algorithm but we don't need it to be + if (!is_valid_turf(check_turf)) + finish_action(controller, succeeded = FALSE) // Otherwise they won't perform idle wanderin + return + controller.set_blackboard_key(target_key, check_turf) + finish_action(controller, succeeded = TRUE) + +/// Return true if this is a turf we can dig +/datum/ai_behavior/goliath_find_diggable_turf/proc/is_valid_turf(turf/check_turf) + if (!isasteroidturf(check_turf)) + return FALSE + var/turf/open/misc/asteroid/floor = check_turf + return !floor.dug + +/datum/ai_planning_subtree/goliath_dig + /// Where did we store the target data + var/target_key = BB_GOLIATH_HOLE_TARGET + +/datum/ai_planning_subtree/goliath_dig/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if (!controller.blackboard_key_exists(target_key)) + return + controller.queue_behavior(/datum/ai_behavior/goliath_dig, target_key) + return SUBTREE_RETURN_FINISH_PLANNING + +/// If we got nothing better to do, dig a little hole +/datum/ai_behavior/goliath_dig + action_cooldown = 3 MINUTES + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + +/datum/ai_behavior/goliath_dig/setup(datum/ai_controller/controller, target_key) + . = ..() + var/turf/target_turf = controller.blackboard[target_key] + if (QDELETED(target_turf)) + return + set_movement_target(controller, target_turf) + +/datum/ai_behavior/goliath_dig/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + var/turf/target_turf = controller.blackboard[target_key] + var/mob/living/basic/basic_mob = controller.pawn + if(!basic_mob.CanReach(target_turf)) + return + basic_mob.melee_attack(target_turf) + finish_action(controller, succeeded = TRUE) + +/datum/ai_behavior/goliath_dig/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + controller.clear_blackboard_key(target_key) + +#undef MIN_TIME_TO_TENTACLE diff --git a/code/modules/mob/living/basic/lavaland/goliath/goliath_trophy.dm b/code/modules/mob/living/basic/lavaland/goliath/goliath_trophy.dm new file mode 100644 index 0000000000000..a4801569cea8b --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/goliath/goliath_trophy.dm @@ -0,0 +1,25 @@ +/// Mining crusher trophy from a goliath. Increases damage as your health decreases. +/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 + /// Your missing health is multiplied by this value to find the bonus damage + var/missing_health_ratio = 0.1 + /// Amount of health you must lose to gain damage, according to the examine text. Cached so we don't recalculate it every examine. + var/missing_health_desc + +/obj/item/crusher_trophy/goliath_tentacle/Initialize(mapload) + . = ..() + missing_health_desc = 1 / missing_health_ratio / bonus_value + +/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 diff --git a/code/modules/mob/living/basic/lavaland/goliath/tentacle.dm b/code/modules/mob/living/basic/lavaland/goliath/tentacle.dm new file mode 100644 index 0000000000000..030ae6d64b837 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/goliath/tentacle.dm @@ -0,0 +1,122 @@ +/// A tentacle which grabs you if you don't get away from it +/obj/effect/goliath_tentacle + name = "goliath tentacle" + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "goliath_tentacle_spawn" + layer = BELOW_MOB_LAYER + plane = GAME_PLANE + anchored = TRUE + /// Timer for our current action stage + var/action_timer + /// Time in which to grab people + var/grapple_time = 10 SECONDS + /// Lower bound of damage to inflict + var/min_damage = 10 + /// Upper bound of damage to inflict + var/max_damage = 15 + +/obj/effect/goliath_tentacle/Initialize(mapload) + . = ..() + if (ismineralturf(loc)) + var/turf/closed/mineral/floor = loc + floor.gets_drilled() + if (!isopenturf(loc) || isspaceturf(loc) || isopenspaceturf(loc)) + return INITIALIZE_HINT_QDEL + for (var/obj/effect/goliath_tentacle/tentacle in loc) + if (tentacle != src) + return INITIALIZE_HINT_QDEL + deltimer(action_timer) + action_timer = addtimer(CALLBACK(src, PROC_REF(animate_grab)), 0.7 SECONDS, TIMER_STOPPABLE) + +/obj/effect/goliath_tentacle/Destroy() + deltimer(action_timer) + return ..() + +/// Change to next icon state and set up grapple +/obj/effect/goliath_tentacle/proc/animate_grab() + icon_state = "goliath_tentacle_wiggle" + deltimer(action_timer) + addtimer(CALLBACK(src, PROC_REF(grab)), 0.3 SECONDS, TIMER_STOPPABLE) + +/// Grab everyone we share space with. If it's nobody, go home. +/obj/effect/goliath_tentacle/proc/grab() + for (var/mob/living/victim in loc) + if (victim.stat == DEAD || HAS_TRAIT(victim, TRAIT_TENTACLE_IMMUNE)) + continue + balloon_alert(victim, "grabbed") + visible_message(span_danger("[src] grabs hold of [victim]!")) + victim.adjustBruteLoss(rand(min_damage, max_damage)) + if (victim.apply_status_effect(/datum/status_effect/incapacitating/stun/goliath_tentacled, grapple_time, src)) + buckle_mob(victim, TRUE) + SEND_SIGNAL(victim, COMSIG_GOLIATH_TENTACLED_GRABBED) + for (var/obj/vehicle/sealed/mecha/mech in loc) + mech.take_damage(rand(min_damage, max_damage), damage_type = BRUTE, damage_flag = MELEE, sound_effect = TRUE) + if (!has_buckled_mobs()) + retract() + return + deltimer(action_timer) + action_timer = addtimer(CALLBACK(src, PROC_REF(retract)), grapple_time, TIMER_STOPPABLE) + +/// Play exit animation. +/obj/effect/goliath_tentacle/proc/retract() + if (icon_state == "goliath_tentacle_retract") + return // Already retracting + SEND_SIGNAL(src, COMSIG_GOLIATH_TENTACLE_RETRACTING) + unbuckle_all_mobs(force = TRUE) + icon_state = "goliath_tentacle_retract" + deltimer(action_timer) + action_timer = QDEL_IN_STOPPABLE(src, 0.7 SECONDS) + +/obj/effect/goliath_tentacle/attack_hand(mob/living/user, list/modifiers) + . = ..() + if (. || !has_buckled_mobs()) + return + retract() + return TRUE + +/// Goliath tentacle stun with special removal conditions +/datum/status_effect/incapacitating/stun/goliath_tentacled + id = "goliath_tentacled" + duration = 10 SECONDS + /// The tentacle that is tenderly holding us close + var/obj/effect/goliath_tentacle/tentacle + +/datum/status_effect/incapacitating/stun/goliath_tentacled/on_creation(mob/living/new_owner, set_duration, obj/effect/goliath_tentacle/tentacle) + . = ..() + if (!.) + return + src.tentacle = tentacle + +/datum/status_effect/incapacitating/stun/goliath_tentacled/on_apply() + . = ..() + RegisterSignal(owner, COMSIG_CARBON_PRE_MISC_HELP, PROC_REF(on_helped)) + RegisterSignals(owner, list(SIGNAL_ADDTRAIT(TRAIT_TENTACLE_IMMUNE), COMSIG_BRIMDUST_EXPLOSION), PROC_REF(release)) + RegisterSignals(tentacle, list(COMSIG_QDELETING, COMSIG_GOLIATH_TENTACLE_RETRACTING), PROC_REF(on_tentacle_left)) + +/datum/status_effect/incapacitating/stun/goliath_tentacled/on_remove() + . = ..() + UnregisterSignal(owner, list(COMSIG_CARBON_PRE_MISC_HELP, SIGNAL_ADDTRAIT(TRAIT_TENTACLE_IMMUNE), COMSIG_BRIMDUST_EXPLOSION)) + if (isnull(tentacle)) + return + UnregisterSignal(tentacle, list(COMSIG_QDELETING, COMSIG_GOLIATH_TENTACLE_RETRACTING)) + tentacle.retract() + tentacle = null + +/// Some kind soul has rescued us +/datum/status_effect/incapacitating/stun/goliath_tentacled/proc/on_helped(mob/source, mob/helping) + SIGNAL_HANDLER + release() + source.visible_message(span_notice("[helping] rips [source] from the tentacle's grasp!")) + return COMPONENT_BLOCK_MISC_HELP + +/// Something happened to make the tentacle let go +/datum/status_effect/incapacitating/stun/goliath_tentacled/proc/release() + SIGNAL_HANDLER + owner.remove_status_effect(/datum/status_effect/incapacitating/stun/goliath_tentacled) + +/// Something happened to our associated tentacle +/datum/status_effect/incapacitating/stun/goliath_tentacled/proc/on_tentacle_left() + SIGNAL_HANDLER + UnregisterSignal(tentacle, list(COMSIG_QDELETING, COMSIG_GOLIATH_TENTACLE_RETRACTING)) // No endless loops for us please + tentacle = null + release() diff --git a/code/modules/mob/living/basic/lavaland/hivelord/hivelord.dm b/code/modules/mob/living/basic/lavaland/hivelord/hivelord.dm new file mode 100644 index 0000000000000..11043e58d11ea --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/hivelord/hivelord.dm @@ -0,0 +1,114 @@ +/// Mob which retreats and spawns annoying sub-mobs to attack you +/mob/living/basic/mining/hivelord + name = "hivelord" + desc = "A levitating swarm of tiny creatures which act as a single individual. When threatened or hunting they rapidly replicate additional short-lived bodies." + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "hivelord" + icon_living = "hivelord" + // icon_aggro = "hivelord_alert" + icon_dead = "hivelord_dead" + icon_gib = "syndicate_gib" + mob_biotypes = MOB_ORGANIC + speed = 2 + maxHealth = 75 + health = 75 + melee_damage_lower = 0 + melee_damage_upper = 0 + attack_verb_continuous = "weakly tackles" + attack_verb_simple = "weakly tackles" + speak_emote = list("telepathically cries") + attack_sound = 'sound/weapons/pierce.ogg' + throw_blocked_message = "passes between the bodies of the" + obj_damage = 0 + pass_flags = PASSTABLE + ai_controller = /datum/ai_controller/basic_controller/hivelord + /// Mobs to spawn when we die, varedit this to be recursive to give the players a fun surprise + var/death_spawn_type = /mob/living/basic/hivelord_brood + /// Action which spawns worms + var/datum/action/cooldown/mob_cooldown/hivelord_spawn/spawn_brood + +/mob/living/basic/mining/hivelord/Initialize(mapload) + . = ..() + var/static/list/death_loot = list(/obj/item/organ/internal/monster_core/regenerative_core) + AddElement(/datum/element/relay_attackers) + AddElement(/datum/element/death_drops, death_loot) + AddComponent(/datum/component/clickbox, icon_state = "hivelord", max_scale = INFINITY, dead_state = "hivelord_dead") // They writhe so much. + AddComponent(/datum/component/appearance_on_aggro, aggro_state = "hivelord_alert") + spawn_brood = new(src) + spawn_brood.Grant(src) + ai_controller.set_blackboard_key(BB_TARGETTED_ACTION, spawn_brood) + +/mob/living/basic/mining/hivelord/Destroy() + QDEL_NULL(spawn_brood) + return ..() + +/mob/living/basic/mining/hivelord/death(gibbed) + . = ..() + var/list/safe_turfs = RANGE_TURFS(1, src) - get_turf(src) + for (var/turf/check_turf as anything in safe_turfs) + if (check_turf.is_blocked_turf(exclude_mobs = TRUE)) + safe_turfs -= check_turf + + var/turf/our_turf = get_turf(src) + for (var/i in 1 to 3) + if (!length(safe_turfs)) + return + var/turf/land_turf = pick_n_take(safe_turfs) + var/obj/effect/temp_visual/hivebrood_spawn/forecast = new(land_turf) + forecast.create_from(death_spawn_type, our_turf, CALLBACK(src, PROC_REF(complete_spawn), land_turf)) + +/// Spawns a worm on the specified turf +/mob/living/basic/mining/hivelord/proc/complete_spawn(turf/spawn_turf) + var/mob/living/brood = new death_spawn_type(spawn_turf) + brood.faction = faction + brood.ai_controller?.set_blackboard_key(ai_controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET]) + brood.dir = get_dir(src, spawn_turf) + +/mob/living/basic/mining/hivelord/RangedAttack(atom/atom_target, modifiers) + spawn_brood?.Trigger(target = atom_target) + +/// Attack worms spawned by the hivelord +/mob/living/basic/hivelord_brood + name = "hivelord brood" + desc = "Short-lived attack form of the hivelord. One isn't much of a threat, but..." + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "hivelord_brood" + icon_living = "hivelord_brood" + icon_dead = "hivelord_brood" + icon_gib = "syndicate_gib" + friendly_verb_continuous = "chirrups near" + friendly_verb_simple = "chirrup near" + mob_size = MOB_SIZE_SMALL + basic_mob_flags = DEL_ON_DEATH + pass_flags = PASSTABLE | PASSMOB + mob_biotypes = MOB_ORGANIC|MOB_BEAST + faction = list(FACTION_MINING) + unsuitable_atmos_damage = 0 + minimum_survivable_temperature = 0 + maximum_survivable_temperature = INFINITY + speed = 1.5 + maxHealth = 1 + health = 1 + melee_damage_lower = 2 + melee_damage_upper = 2 + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + speak_emote = list("telepathically cries") + attack_sound = 'sound/weapons/bite.ogg' + attack_vis_effect = ATTACK_EFFECT_BITE + obj_damage = 0 + density = FALSE + ai_controller = /datum/ai_controller/basic_controller/simple_hostile + +/mob/living/basic/hivelord_brood/Initialize(mapload) + . = ..() + add_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_ASHSTORM_IMMUNE, TRAIT_PERMANENTLY_MORTAL), INNATE_TRAIT) + AddElement(/datum/element/simple_flying) + AddComponent(/datum/component/swarming) + AddComponent(/datum/component/clickbox, icon_state = "hivelord", max_scale = INFINITY) + addtimer(CALLBACK(src, PROC_REF(death)), 10 SECONDS) + +/mob/living/basic/hivelord_brood/death(gibbed) + if (!gibbed) + new /obj/effect/temp_visual/hive_spawn_wither(get_turf(src), /* copy_from = */ src) + return ..() diff --git a/code/modules/mob/living/basic/lavaland/hivelord/hivelord_ai.dm b/code/modules/mob/living/basic/lavaland/hivelord/hivelord_ai.dm new file mode 100644 index 0000000000000..fd7983de3977c --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/hivelord/hivelord_ai.dm @@ -0,0 +1,14 @@ +/// Basically just keep away and shit out worms +/datum/ai_controller/basic_controller/hivelord + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_AGGRO_RANGE = 5, // Only get mad at people nearby + ) + + 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/maintain_distance, + /datum/ai_planning_subtree/targeted_mob_ability, + ) diff --git a/code/modules/mob/living/basic/lavaland/hivelord/spawn_hivelord_brood.dm b/code/modules/mob/living/basic/lavaland/hivelord/spawn_hivelord_brood.dm new file mode 100644 index 0000000000000..3fee2a003f309 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/hivelord/spawn_hivelord_brood.dm @@ -0,0 +1,124 @@ +/// Spawns a little worm nearby +/datum/action/cooldown/mob_cooldown/hivelord_spawn + name = "Spawn Brood" + desc = "Release an attack form to an adjacent square to attack your target or anyone nearby." + button_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + button_icon_state = "hivelord_brood" + background_icon_state = "bg_demon" + overlay_icon_state = "bg_demon_border" + click_to_activate = TRUE + cooldown_time = 2 SECONDS + melee_cooldown_time = 0 + check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED + shared_cooldown = NONE + /// If a mob is not clicked directly, inherit targetting data from this blackboard key and setting it upon this target key + var/ai_target_key = BB_BASIC_MOB_CURRENT_TARGET + /// What are we actually spawning? + var/spawn_type = /mob/living/basic/hivelord_brood + /// Do we automatically fire with no cooldown when damaged? + var/trigger_on_hit = TRUE + /// Minimum time between triggering on hit + var/on_hit_delay = 1 SECONDS + /// Delay between triggering on hit + COOLDOWN_DECLARE(on_hit_cooldown) + +/datum/action/cooldown/mob_cooldown/hivelord_spawn/Grant(mob/granted_to) + . = ..() + if (isnull(owner)) + return + if (trigger_on_hit) + RegisterSignal(owner, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked)) + +/datum/action/cooldown/mob_cooldown/hivelord_spawn/Remove(mob/removed_from) + UnregisterSignal(removed_from, COMSIG_ATOM_WAS_ATTACKED) + return ..() + +/datum/action/cooldown/mob_cooldown/hivelord_spawn/Activate(atom/target) + . = ..() + if (!spawn_brood(target, target_turf = get_turf(target))) + StartCooldown(0.5 SECONDS) + return + StartCooldown() + +/// Called when someone whacks us +/datum/action/cooldown/mob_cooldown/hivelord_spawn/proc/on_attacked(atom/victim, atom/attacker, attack_flags) + SIGNAL_HANDLER + if (!trigger_on_hit || !(attack_flags & ATTACKER_DAMAGING_ATTACK) || !COOLDOWN_FINISHED(src, on_hit_cooldown)) + return + COOLDOWN_START(src, on_hit_cooldown, on_hit_delay) + spawn_brood(attacker, target_turf = get_step_away(owner, attacker), feedback = FALSE) + +/// Spawn a funny little worm +/datum/action/cooldown/mob_cooldown/hivelord_spawn/proc/spawn_brood(target, turf/target_turf, feedback = TRUE) + var/ai_target = isliving(target) ? target : null + if (isnull(ai_target)) + ai_target = owner.ai_controller?.blackboard[ai_target_key] + + var/dir_to_target = get_dir(owner, target_turf) + var/list/target_turfs = list() + for(var/i in -1 to 1) + var/turn_amount = rand(-1, 1) * 45 + var/test_dir = turn(dir_to_target, turn_amount) + var/turf/test_turf = get_step(owner, test_dir) + if (test_turf.is_blocked_turf(exclude_mobs = TRUE)) + continue + target_turfs += test_turf + + if (!length(target_turfs)) + if (feedback) + owner.balloon_alert(owner, "no room!") + StartCooldown(0.5 SECONDS) + return FALSE + + var/turf/land_turf = pick(target_turfs) + var/obj/effect/temp_visual/hivebrood_spawn/forecast = new(land_turf) + forecast.create_from(spawn_type, get_turf(owner), CALLBACK(src, PROC_REF(complete_spawn), land_turf, ai_target)) + StartCooldown() + + return TRUE + +/// Actually create a mob +/datum/action/cooldown/mob_cooldown/hivelord_spawn/proc/complete_spawn(turf/spawn_turf, target) + var/mob/living/brood = new spawn_type(spawn_turf) + brood.faction = owner.faction + brood.ai_controller?.set_blackboard_key(ai_target_key, target) + brood.dir = get_dir(owner, spawn_turf) + +#define BROOD_ARC_Y_OFFSET 8 +#define BROOD_ARC_ROTATION 45 + +/// Fast animation to show a worm spawning +/obj/effect/temp_visual/hivebrood_spawn + name = "brood spawn" + duration = 0.3 SECONDS + alpha = 0 + +/// Set up our visuals and start a timer for a callback +/obj/effect/temp_visual/hivebrood_spawn/proc/create_from(mob/living/spawn_type, turf/spawn_from, datum/callback/on_completed) + addtimer(on_completed, duration, TIMER_DELETE_ME) + + var/turf/my_turf = get_turf(src) + dir = get_dir(spawn_from, my_turf) + var/move_x = (my_turf.x - spawn_from.x) * world.icon_size + var/move_y = (my_turf.y - spawn_from.y) * world.icon_size + pixel_x = -move_x + pixel_y = -move_y + + icon = initial(spawn_type.icon) + icon_state = initial(spawn_type.icon_state) + + + animate(src, pixel_x = 0, time = duration) + animate(src, pixel_y = BROOD_ARC_Y_OFFSET - (move_y * 0.5), time = duration * 0.5, flags = ANIMATION_PARALLEL, easing = SINE_EASING | EASE_OUT) + animate(pixel_y = 0, time = duration * 0.5, easing = SINE_EASING | EASE_IN) + animate(src, alpha = 255, time = duration * 0.5, flags = ANIMATION_PARALLEL) + + if (dir & (NORTH | EAST)) + transform = matrix().Turn(-BROOD_ARC_ROTATION) + animate(src, transform = matrix(), time = duration, flags = ANIMATION_PARALLEL) + else + transform = matrix().Turn(BROOD_ARC_ROTATION) + animate(src, transform = matrix(), time = duration, flags = ANIMATION_PARALLEL) + +#undef BROOD_ARC_Y_OFFSET +#undef BROOD_ARC_ROTATION diff --git a/code/modules/mob/living/basic/lavaland/legion/legion.dm b/code/modules/mob/living/basic/lavaland/legion/legion.dm new file mode 100644 index 0000000000000..7c6bd0fd170a7 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/legion/legion.dm @@ -0,0 +1,158 @@ +/** + * Avoids players while throwing skulls at them. + * Legion skulls heal allies, bite enemies, and infest dying humans to make more legions. + */ +/mob/living/basic/mining/legion + name = "legion" + desc = "You can still see what was once a human under the shifting mass of corruption." + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "legion" + icon_living = "legion" + icon_dead = "legion" + icon_gib = "syndicate_gib" + mob_biotypes = MOB_ORGANIC|MOB_HUMANOID + basic_mob_flags = DEL_ON_DEATH + speed = 3 + maxHealth = 75 + health = 75 + 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("gurgles") + attack_sound = 'sound/weapons/pierce.ogg' + throw_blocked_message = "bounces harmlessly off of" + crusher_loot = /obj/item/crusher_trophy/legion_skull + death_message = "wails in chorus and dissolves into quivering flesh." + ai_controller = /datum/ai_controller/basic_controller/legion + /// What kind of mob do we spawn? + var/brood_type = /mob/living/basic/legion_brood + /// What kind of corpse spawner do we leave behind on death? + var/corpse_type = /obj/effect/mob_spawn/corpse/human/legioninfested + /// Who is inside of us? + var/mob/living/stored_mob + +/mob/living/basic/mining/legion/Initialize(mapload) + . = ..() + AddElement(/datum/element/death_drops, get_loot_list()) + AddElement(/datum/element/content_barfer) + + var/datum/action/cooldown/mob_cooldown/skull_launcher/skull_launcher = new(src) + skull_launcher.Grant(src) + skull_launcher.spawn_type = brood_type + ai_controller.blackboard[BB_TARGETTED_ACTION] = skull_launcher + +/// Create what we want to drop on death, in proc form so we can always return a static list +/mob/living/basic/mining/legion/proc/get_loot_list() + var/static/list/death_loot = list(/obj/item/organ/internal/monster_core/regenerative_core/legion) + return death_loot + +/mob/living/basic/mining/legion/Exited(atom/movable/gone, direction) + . = ..() + if (gone != stored_mob) + return + ai_controller.clear_blackboard_key(BB_LEGION_CORPSE) + stored_mob.remove_status_effect(/datum/status_effect/grouped/stasis, STASIS_LEGION_EATEN) + stored_mob.add_mood_event(MOOD_CATEGORY_LEGION_CORE, /datum/mood_event/healsbadman/long_term) // This will still probably mostly be gone before you are alive + stored_mob = null + +/mob/living/basic/mining/legion/death(gibbed) + if (isnull(stored_mob)) + new corpse_type(loc) + return ..() + +/// Put a corpse in this guy +/mob/living/basic/mining/legion/proc/consume(mob/living/consumed) + new /obj/effect/gibspawner/generic(consumed.loc) + gender = consumed.gender + name = consumed.real_name + consumed.investigate_log("has been killed by hivelord infestation.", INVESTIGATE_DEATHS) + consumed.death() + consumed.extinguish_mob() + consumed.fully_heal(HEAL_DAMAGE) + consumed.apply_status_effect(/datum/status_effect/grouped/stasis, STASIS_LEGION_EATEN) + consumed.forceMove(src) + ai_controller?.set_blackboard_key(BB_LEGION_CORPSE, consumed) + ai_controller?.set_blackboard_key(BB_LEGION_RECENT_LINES, consumed.copy_recent_speech(line_chance = 80)) + stored_mob = consumed + visible_message(span_warning("[src] staggers to [p_their()] feet!")) + if (prob(75)) + return + // Congratulations you have won a special prize: cancer + var/obj/item/organ/internal/legion_tumour/cancer = new() + cancer.Insert(consumed, special = TRUE, drop_if_replaced = FALSE) + +/// A Legion which only drops skeletons instead of corpses which might have fun loot, so it cannot be farmed +/mob/living/basic/mining/legion/spawner_made + corpse_type = /obj/effect/mob_spawn/corpse/human/legioninfested/skeleton/charred + + +/// Like a Legion but it's an adorable snowman +/mob/living/basic/mining/legion/snow + name = "snow legion" + desc = "You can vaguely see what was once a human under the densely packed snow. Cute, but macabre." + icon = 'icons/mob/simple/icemoon/icemoon_monsters.dmi' + icon_state = "snowlegion" + icon_living = "snowlegion" + // icon_aggro = "snowlegion_alive" + icon_dead = "snowlegion" + brood_type = /mob/living/basic/legion_brood/snow + corpse_type = /obj/effect/mob_spawn/corpse/human/legioninfested/snow + +/mob/living/basic/mining/legion/snow/Initialize(mapload) + . = ..() + AddComponent(/datum/component/appearance_on_aggro, aggro_state = "snowlegion_alive") // Surprise! I was real! + +/// As Snow Legion but spawns corpses which don't have any exciting loot +/mob/living/basic/mining/legion/snow/spawner_made + corpse_type = /obj/effect/mob_spawn/corpse/human/legioninfested/skeleton + + +/// Like a Legion but shorter and faster +/mob/living/basic/mining/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_dead = "dwarf_legion" + maxHealth = 60 + health = 60 + speed = 2 + crusher_drop_chance = 20 + corpse_type = /obj/effect/mob_spawn/corpse/human/legioninfested/dwarf + + +/// Like a Legion but larger and spawns regular Legions, not currently used anywhere and very soulful +/mob/living/basic/mining/legion/large + name = "myriad" + desc = "A legion of legions, a dead end to whatever form the Necropolis was attempting to create." + icon = 'icons/mob/simple/lavaland/64x64megafauna.dmi' + icon_state = "legion" + icon_living = "legion" + icon_dead = "legion" + health_doll_icon = "legion" + speed = 5 + health = 450 + maxHealth = 450 + melee_damage_lower = 20 + melee_damage_upper = 20 + obj_damage = 30 + pixel_x = -16 + sentience_type = SENTIENCE_BOSS + +/mob/living/basic/mining/legion/large/Initialize(mapload) + . = ..() + AddComponent(\ + /datum/component/spawner,\ + spawn_types = list(/mob/living/basic/mining/legion),\ + spawn_time = 20 SECONDS,\ + max_spawned = 3,\ + spawn_text = "peels itself off from",\ + faction = faction,\ + ) + +/// Create what we want to drop on death, in proc form so we can always return a static list +/mob/living/basic/mining/legion/large/get_loot_list() + var/static/list/death_loot = list(/obj/item/organ/internal/monster_core/regenerative_core/legion = 3, /obj/effect/mob_spawn/corpse/human/legioninfested = 4) + return death_loot diff --git a/code/modules/mob/living/basic/lavaland/legion/legion_ai.dm b/code/modules/mob/living/basic/lavaland/legion/legion_ai.dm new file mode 100644 index 0000000000000..6b3525cb32ab6 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/legion/legion_ai.dm @@ -0,0 +1,77 @@ +/// Keep away and launch skulls at every opportunity, prioritising injured allies +/datum/ai_controller/basic_controller/legion + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/attack_until_dead/legion, + BB_BASIC_MOB_FLEEING = TRUE, + BB_AGGRO_RANGE = 5, // Unobservant + BB_BASIC_MOB_FLEE_DISTANCE = 6, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/random_speech/legion, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/targeted_mob_ability, + /datum/ai_planning_subtree/flee_target/legion, + ) + +/// Chase and attack whatever we are targetting, if it's friendly we will heal them +/datum/ai_controller/basic_controller/legion_brood + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/attack_until_dead/legion, + ) + + 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, + ) + +/// Target nearby friendlies if they are hurt (and are not themselves Legions) +/datum/targetting_datum/basic/attack_until_dead/legion + +/datum/targetting_datum/basic/attack_until_dead/legion/faction_check(mob/living/living_mob, mob/living/the_target) + if (!living_mob.faction_check_mob(the_target, exact_match = check_factions_exactly)) + return FALSE + if (istype(the_target, living_mob.type)) + return TRUE + var/atom/created_by = living_mob.ai_controller.blackboard[BB_LEGION_BROOD_CREATOR] + if (!QDELETED(created_by) && istype(the_target, created_by.type)) + return TRUE + return the_target.stat == DEAD || the_target.health >= the_target.maxHealth + +/// Don't run away from friendlies +/datum/ai_planning_subtree/flee_target/legion + +/datum/ai_planning_subtree/flee_target/legion/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/target = controller.blackboard[target_key] + if (QDELETED(target) || target.faction_check_mob(controller.pawn)) + return // Only flee if we have a hostile target + return ..() + +/// Make spooky sounds, if we have a corpse inside then impersonate them +/datum/ai_planning_subtree/random_speech/legion + speech_chance = 1 + speak = list("Come...", "Legion...", "Why...?") + emote_hear = list("groans.", "wails.", "whimpers.") + emote_see = list("twitches.", "shudders.") + /// Stuff to specifically say into a radio + var/list/radio_speech = list("Come...", "Why...?") + +/datum/ai_planning_subtree/random_speech/legion/speak(datum/ai_controller/controller) + var/mob/living/carbon/human/victim = controller.blackboard[BB_LEGION_CORPSE] + if (QDELETED(victim) || prob(30)) + return ..() + + var/list/remembered_speech = controller.blackboard[BB_LEGION_RECENT_LINES] || list() + + if (length(remembered_speech) && prob(50)) // Don't spam the radio + controller.queue_behavior(/datum/ai_behavior/perform_speech, pick(remembered_speech)) + return + + var/obj/item/radio/mob_radio = locate() in victim.contents + if (QDELETED(mob_radio)) + return ..() // No radio, just talk funny + controller.queue_behavior(/datum/ai_behavior/perform_speech_radio, pick(radio_speech + remembered_speech), mob_radio, list(RADIO_CHANNEL_SUPPLY, RADIO_CHANNEL_COMMON)) diff --git a/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm b/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm new file mode 100644 index 0000000000000..962d232c5ef84 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm @@ -0,0 +1,99 @@ +/// A spooky skull which heals lavaland mobs, attacks miners, and infests their bodies +/mob/living/basic/legion_brood + name = "legion" + desc = "One of many." + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "legion_head" + icon_living = "legion_head" + icon_dead = "legion_head" + icon_gib = "syndicate_gib" + basic_mob_flags = DEL_ON_DEATH + mob_size = MOB_SIZE_SMALL + pass_flags = PASSTABLE | PASSMOB + mob_biotypes = MOB_ORGANIC|MOB_BEAST + faction = list(FACTION_MINING) + unsuitable_atmos_damage = 0 + minimum_survivable_temperature = 0 + maximum_survivable_temperature = INFINITY + friendly_verb_continuous = "chatters near" + friendly_verb_simple = "chatter near" + maxHealth = 1 + health = 1 + melee_damage_lower = 12 + melee_damage_upper = 12 + obj_damage = 0 + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + attack_vis_effect = ATTACK_EFFECT_BITE + speak_emote = list("echoes") // who the fuck speaking as this mob it dies 10 seconds after it spawns + attack_sound = 'sound/weapons/pierce.ogg' + density = FALSE + ai_controller = /datum/ai_controller/basic_controller/legion_brood + /// Reference to a guy who made us + var/mob/living/created_by + +/mob/living/basic/legion_brood/Initialize(mapload) + . = ..() + add_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_ASHSTORM_IMMUNE, TRAIT_PERMANENTLY_MORTAL), INNATE_TRAIT) + AddElement(/datum/element/simple_flying) + AddComponent(/datum/component/swarming) + AddComponent(/datum/component/clickbox, icon_state = "sphere", max_scale = 2) + addtimer(CALLBACK(src, PROC_REF(death)), 10 SECONDS) + +/mob/living/basic/legion_brood/death(gibbed) + if (!gibbed) + new /obj/effect/temp_visual/hive_spawn_wither(get_turf(src), /* copy_from = */ src) + return ..() + +/mob/living/basic/legion_brood/melee_attack(mob/living/target, list/modifiers, ignore_cooldown) + if (ishuman(target) && target.stat > SOFT_CRIT) + infest(target) + return + if (isliving(target) && faction_check_mob(target) && !istype(target, created_by?.type)) + visible_message(span_warning("[src] melds with [target]'s flesh!")) + target.apply_status_effect(/datum/status_effect/regenerative_core) + new /obj/effect/temp_visual/heal(get_turf(target), COLOR_HEALING_CYAN) + death() + return + return ..() + +/// Turn the targetted mob into one of us +/mob/living/basic/legion_brood/proc/infest(mob/living/target) + visible_message(span_warning("[name] burrows into the flesh of [target]!")) + var/spawn_type = get_legion_type(target) + var/mob/living/basic/mining/legion/new_legion = new spawn_type(loc) + new_legion.consume(target) + new_legion.faction = faction.Copy() + qdel(src) + +/// Returns the kind of legion we make out of the target +/mob/living/basic/legion_brood/proc/get_legion_type(mob/living/target) + if (HAS_TRAIT(target, TRAIT_DWARF)) + return /mob/living/basic/mining/legion/dwarf + return /mob/living/basic/mining/legion + +/// Sets someone as our creator, mostly so you can't use skulls to heal yourself +/mob/living/basic/legion_brood/proc/assign_creator(mob/living/creator, copy_full_faction = TRUE) + if (copy_full_faction) + faction = creator.faction.Copy() + else + faction |= REF(creator) + created_by = creator + ai_controller?.set_blackboard_key(BB_LEGION_BROOD_CREATOR, creator) + RegisterSignal(creator, COMSIG_QDELETING, PROC_REF(creator_destroyed)) + +/// Reference handling +/mob/living/basic/legion_brood/proc/creator_destroyed() + SIGNAL_HANDLER + created_by = null + +/// Like the Legion's summoned skull but funnier (it's snow now) +/mob/living/basic/legion_brood/snow + name = "snow legion" + icon = 'icons/mob/simple/icemoon/icemoon_monsters.dmi' + icon_state = "snowlegion_head" + icon_living = "snowlegion_head" + icon_dead = "snowlegion_head" + +/mob/living/basic/legion_brood/snow/get_legion_type(mob/living/target) + return /mob/living/basic/mining/legion/snow diff --git a/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm b/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm new file mode 100644 index 0000000000000..078af57de2ad3 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm @@ -0,0 +1,159 @@ +/// Left behind when a legion infects you, for medical enrichment +/obj/item/organ/internal/legion_tumour + name = "legion tumour" + desc = "A mass of pulsing flesh and dark tendrils, containing the power to regenerate flesh at a terrible cost." + failing_desc = "pulses and writhes with horrible life, reaching towards you with its tendrils!" + icon = 'icons/obj/medical/organs/mining_organs.dmi' + icon_state = "legion_remains" + zone = BODY_ZONE_CHEST + slot = ORGAN_SLOT_PARASITE_EGG + decay_factor = STANDARD_ORGAN_DECAY * 3 // About 5 minutes outside of a host + /// What stage of growth the corruption has reached. + var/stage = 0 + /// We apply this status effect periodically or when used on someone + var/applied_status = /datum/status_effect/regenerative_core + /// How long have we been in this stage? + var/elapsed_time = 0 SECONDS + /// How long does it take to advance one stage? + var/growth_time = 80 SECONDS // Long enough that if you go back to lavaland without realising it you're not totally fucked + /// What kind of mob will we transform into? + var/spawn_type = /mob/living/basic/mining/legion + /// Spooky sounds to play as you start to turn + var/static/list/spooky_sounds = list( + 'sound/voice/lowHiss1.ogg', + 'sound/voice/lowHiss2.ogg', + 'sound/voice/lowHiss3.ogg', + 'sound/voice/lowHiss4.ogg', + ) + +/obj/item/organ/internal/legion_tumour/Initialize(mapload) + . = ..() + animate_pulse() + +/obj/item/organ/internal/legion_tumour/apply_organ_damage(damage_amount, maximum, required_organ_flag) + var/was_failing = organ_flags & ORGAN_FAILING + . = ..() + if (was_failing != (organ_flags & ORGAN_FAILING)) + animate_pulse() + +/obj/item/organ/internal/legion_tumour/set_organ_damage(damage_amount, required_organ_flag) + . = ..() + animate_pulse() + +/// Do a heartbeat animation depending on if we're failing or not +/obj/item/organ/internal/legion_tumour/proc/animate_pulse() + animate(src, transform = matrix()) // Stop any current animation + + var/speed_divider = organ_flags & ORGAN_FAILING ? 2 : 1 + + animate(src, transform = matrix().Scale(1.1), time = 0.5 SECONDS / speed_divider, easing = SINE_EASING | EASE_OUT, loop = -1, flags = ANIMATION_PARALLEL) + animate(transform = matrix(), time = 0.5 SECONDS / speed_divider, easing = SINE_EASING | EASE_IN) + animate(transform = matrix(), time = 2 SECONDS / speed_divider) + +/obj/item/organ/internal/legion_tumour/Remove(mob/living/carbon/egg_owner, special) + . = ..() + stage = 0 + elapsed_time = 0 + +/obj/item/organ/internal/legion_tumour/attack(mob/living/target, mob/living/user, params) + if (try_apply(target, user)) + qdel(src) + return + return ..() + +/// Smear it on someone like a regen core, why not. Make sure they're alive though. +/obj/item/organ/internal/legion_tumour/proc/try_apply(mob/living/target, mob/user) + if(!user.Adjacent(target) || !isliving(target)) + return FALSE + + if (target.stat <= SOFT_CRIT && !(organ_flags & ORGAN_FAILING)) + target.add_mood_event(MOOD_CATEGORY_LEGION_CORE, /datum/mood_event/healsbadman) + target.apply_status_effect(applied_status) + + if (target != user) + target.visible_message(span_notice("[user] splatters [target] with [src]... Disgusting tendrils pull [target.p_their()] wounds shut!")) + else + to_chat(user, span_notice("You smear [src] on yourself. Disgusting tendrils pull your wounds closed.")) + return TRUE + + if (!ishuman(target)) + return FALSE + + target.visible_message(span_boldwarning("[user] splatters [target] with [src]... and it springs into horrible life!")) + var/mob/living/basic/legion_brood/skull = new(target.loc) + skull.melee_attack(target) + return TRUE + +/obj/item/organ/internal/legion_tumour/on_life(seconds_per_tick, times_fired) + . = ..() + if (QDELETED(src) || QDELETED(owner)) + return + + if (stage >= 2) + if(SPT_PROB(stage / 5, seconds_per_tick)) + to_chat(owner, span_notice("You feel a bit better.")) + owner.apply_status_effect(applied_status) // It's not all bad! + if(SPT_PROB(1, seconds_per_tick)) + owner.emote("twitch") + + switch(stage) + if(2, 3) + if(SPT_PROB(1, seconds_per_tick)) + to_chat(owner, span_danger("Your chest spasms!")) + if(SPT_PROB(1, seconds_per_tick)) + to_chat(owner, span_danger("You feel weak.")) + if(SPT_PROB(1, seconds_per_tick)) + SEND_SOUND(owner, sound(pick(spooky_sounds))) + if(SPT_PROB(2, seconds_per_tick)) + owner.vomit() + if(4, 5) + if(SPT_PROB(2, seconds_per_tick)) + to_chat(owner, span_danger("Something flexes under your skin.")) + if(SPT_PROB(2, seconds_per_tick)) + if (prob(40)) + SEND_SOUND(owner, sound('sound/voice/ghost_whisper.ogg')) + else + SEND_SOUND(owner, sound(pick(spooky_sounds))) + if(SPT_PROB(3, seconds_per_tick)) + owner.vomit(vomit_type = /obj/effect/decal/cleanable/vomit/old/black_bile) + if (prob(50)) + var/turf/check_turf = get_step(owner.loc, owner.dir) + var/atom/land_turf = (check_turf.is_blocked_turf()) ? owner.loc : check_turf + var/mob/living/basic/legion_brood/child = new(land_turf) + child.assign_creator(owner, copy_full_faction = FALSE) + + if(SPT_PROB(3, seconds_per_tick)) + to_chat(owner, span_danger("Your muscles ache.")) + owner.take_bodypart_damage(3) + + if (stage == 5) + if (SPT_PROB(10, seconds_per_tick)) + infest() + return + + elapsed_time += seconds_per_tick SECONDS * ((organ_flags & ORGAN_FAILING) ? 3 : 1) // Let's call it "matured" rather than failed + if (elapsed_time < growth_time) + return + stage++ + elapsed_time = 0 + if (stage == 5) + to_chat(owner, span_bolddanger("Something is moving under your skin!")) + +/// Consume our host +/obj/item/organ/internal/legion_tumour/proc/infest() + if (QDELETED(src) || QDELETED(owner)) + return + owner.visible_message(span_boldwarning("Black tendrils burst from [owner]'s flesh, covering them in amorphous flesh!")) + var/mob/living/basic/mining/legion/new_legion = new spawn_type(owner.loc) + new_legion.consume(owner) + qdel(src) + +/obj/item/organ/internal/legion_tumour/on_find(mob/living/finder) + . = ..() + to_chat(finder, span_warning("There's an enormous tumour in [owner]'s [zone]!")) + if(stage < 4) + to_chat(finder, span_notice("Its tendrils seem to twitch towards the light.")) + return + to_chat(finder, span_notice("Its pulsing tendrils reach all throughout the body.")) + if(prob(stage * 2)) + infest() diff --git a/code/modules/mob/living/basic/lavaland/legion/spawn_legions.dm b/code/modules/mob/living/basic/lavaland/legion/spawn_legions.dm new file mode 100644 index 0000000000000..1ffcafecd56aa --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/legion/spawn_legions.dm @@ -0,0 +1,109 @@ +/// Spawns a little worm nearby +/datum/action/cooldown/mob_cooldown/skull_launcher + name = "Launch Legion" + desc = "Propel a living piece of your body to a distant location." + button_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + button_icon_state = "legion_head" + background_icon_state = "bg_demon" + overlay_icon_state = "bg_demon_border" + click_to_activate = TRUE + cooldown_time = 2 SECONDS + melee_cooldown_time = 0 + check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED + shared_cooldown = NONE + /// If a mob is not clicked directly, inherit targetting data from this blackboard key and setting it upon this target key + var/ai_target_key = BB_BASIC_MOB_CURRENT_TARGET + /// What are we actually spawning? + var/spawn_type = /mob/living/basic/legion_brood + /// How far can we fire? + var/max_range = 7 + +/datum/action/cooldown/mob_cooldown/skull_launcher/Activate(atom/target) + var/turf/target_turf = get_turf(target) + + if (get_dist(owner, target_turf) > max_range) + target_turf = get_ranged_target_turf_direct(owner, target_turf, max_range) + + if (target_turf.is_blocked_turf()) + var/list/near_turfs = RANGE_TURFS(1, target_turf) - target_turf + for (var/turf/check_turf as anything in near_turfs) + if (check_turf.is_blocked_turf()) + near_turfs -= check_turf + if (length(near_turfs)) + target_turf = pick(near_turfs) + else if(target_turf.is_blocked_turf(exclude_mobs = TRUE)) + owner.balloon_alert(owner, "no room!") + StartCooldown(0.5 SECONDS) + return + + var/ai_target = isliving(target) ? target : null + if (isnull(ai_target)) + ai_target = owner.ai_controller?.blackboard[ai_target_key] + + var/target_dir = get_dir(owner, target) + + var/obj/effect/temp_visual/legion_skull_depart/launch = new(get_turf(owner)) + launch.set_appearance(spawn_type) + launch.dir = target_dir + new /obj/effect/temp_visual/legion_brood_indicator(target_turf) + var/obj/effect/temp_visual/legion_skull_land/land = new(target_turf) + land.dir = target_dir + land.set_appearance(spawn_type, CALLBACK(src, PROC_REF(spawn_skull), target_turf, ai_target)) + StartCooldown() + +/// Actually create a mob +/datum/action/cooldown/mob_cooldown/skull_launcher/proc/spawn_skull(turf/spawn_location, target) + var/mob/living/basic/legion_brood/brood = new spawn_type(spawn_location) + if (istype(brood)) + brood.assign_creator(owner) + brood.ai_controller?.set_blackboard_key(ai_target_key, target) + brood.dir = get_dir(owner, spawn_location) + if (!isnull(target)) + brood.face_atom(target) + else + brood.dir = get_dir(owner, spawn_location) + + +/// Animation for launching a skull +/obj/effect/temp_visual/legion_skull_depart + name = "legion brood launch" + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "legion_head" + duration = 0.25 SECONDS + +/// Copy appearance from the passed atom type +/obj/effect/temp_visual/legion_skull_depart/proc/set_appearance(atom/spawned_type) + icon = initial(spawned_type.icon) + icon_state = initial(spawned_type.icon_state) + animate(src, alpha = 0, pixel_y = 72, time = duration) + +/// Animation for landing a skull +/obj/effect/temp_visual/legion_skull_land + name = "legion brood land" + duration = 0.5 SECONDS + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "legion_head" + alpha = 0 + pixel_y = 72 + +/// Copy appearance from the passed atom type and store what to do on animation complete +/obj/effect/temp_visual/legion_skull_land/proc/set_appearance(atom/spawned_type, datum/callback/on_completed) + icon = initial(spawned_type.icon) + icon_state = initial(spawned_type.icon_state) + animate(src, alpha = 0, pixel_y = 72, time = duration / 2) + animate(alpha = 255, pixel_y = 0, time = duration / 2) + addtimer(on_completed, duration, TIMER_DELETE_ME) + +/// A skull is going to be here! Oh no! +/obj/effect/temp_visual/legion_brood_indicator + name = "legion brood land" + duration = 0.75 SECONDS + layer = BELOW_MOB_LAYER + plane = GAME_PLANE + icon = 'icons/mob/telegraphing/telegraph.dmi' + icon_state = "skull" + +/obj/effect/temp_visual/legion_brood_indicator/Initialize(mapload) + . = ..() + animate(src, alpha = 255, time = 0.5 SECONDS) + animate(alpha = 0, time = 0.25 SECONDS) diff --git a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm new file mode 100644 index 0000000000000..d47ae15b9759c --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm @@ -0,0 +1,85 @@ +/// Cowardly mob with a charging attack +/mob/living/basic/mining/lobstrosity + name = "arctic lobstrosity" + desc = "These hairy crustaceans creep and multiply in underground lakes deep below the ice. They have a particular taste for fingers." + icon = 'icons/mob/simple/icemoon/icemoon_monsters.dmi' + icon_state = "arctic_lobstrosity" + icon_living = "arctic_lobstrosity" + icon_dead = "arctic_lobstrosity_dead" + friendly_verb_continuous = "chitters at" + friendly_verb_simple = "chitters at" + speak_emote = list("chitters") + maxHealth = 150 + health = 150 + obj_damage = 15 + melee_damage_lower = 15 + melee_damage_upper = 19 + attack_verb_continuous = "snips" + attack_verb_simple = "snip" + attack_sound = 'sound/weapons/bite.ogg' + attack_vis_effect = ATTACK_EFFECT_BITE // Closer than a scratch to a crustacean pinching effect + melee_attack_cooldown = 1 SECONDS + butcher_results = list( + /obj/item/food/meat/crab = 2, + /obj/item/stack/sheet/bone = 2, + /obj/item/organ/internal/monster_core/rush_gland = 1, + ) + crusher_loot = /obj/item/crusher_trophy/lobster_claw + ai_controller = /datum/ai_controller/basic_controller/lobstrosity + /// Charging ability + var/datum/action/cooldown/mob_cooldown/charge/basic_charge/lobster/charge + /// Things we will eat if we see them (arms, chiefly) + var/static/list/target_foods = list(/obj/item/bodypart/arm) + +/mob/living/basic/mining/lobstrosity/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_SNOWSTORM_IMMUNE, INNATE_TRAIT) + AddElement(/datum/element/mob_grabber) + AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW) + AddElement(/datum/element/basic_eating, food_types = target_foods) + AddElement(\ + /datum/element/amputating_limbs,\ + surgery_verb = "snipping",\ + target_zones = GLOB.arm_zones,\ + ) + charge = new(src) + charge.Grant(src) + ai_controller.set_blackboard_key(BB_TARGETTED_ACTION, charge) + +/mob/living/basic/mining/lobstrosity/Destroy() + QDEL_NULL(charge) + return ..() + +/mob/living/basic/mining/lobstrosity/ranged_secondary_attack(atom/atom_target, modifiers) + charge.Trigger(target = atom_target) + +/// Lavaland lobster variant, it basically just looks different +/mob/living/basic/mining/lobstrosity/lava + name = "chasm lobstrosity" + desc = "Twitching crustaceans boiled red by the sulfurous fumes of the chasms in which they lurk. They have a particular taste for fingers." + icon_state = "lobstrosity" + icon_living = "lobstrosity" + icon_dead = "lobstrosity_dead" + +/// Charge a long way, knock down for longer, and perform an instant melee attack +/datum/action/cooldown/mob_cooldown/charge/basic_charge/lobster + name = "Lobster Rush" + charge_distance = 8 + knockdown_duration = 2.5 SECONDS + +/datum/action/cooldown/mob_cooldown/charge/basic_charge/lobster/hit_target(atom/movable/source, atom/target, damage_dealt) + . = ..() + if(!isliving(target) || !isbasicmob(source)) + return + var/mob/living/basic/basic_source = source + var/mob/living/living_target = target + basic_source.melee_attack(living_target, ignore_cooldown = TRUE) + basic_source.ai_controller?.set_blackboard_key(BB_BASIC_MOB_FLEEING, FALSE) + basic_source.start_pulling(living_target) + +/datum/action/cooldown/mob_cooldown/charge/basic_charge/lobster/do_charge(atom/movable/charger, atom/target_atom, delay, past) + . = ..() + if(!isliving(charger)) + return + var/mob/living/living_charger = charger + living_charger.apply_status_effect(/datum/status_effect/tired_post_charge) diff --git a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm new file mode 100644 index 0000000000000..8e4dfe9e29463 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm @@ -0,0 +1,213 @@ +/datum/ai_controller/basic_controller/lobstrosity + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/lobster, + BB_LOBSTROSITY_EXPLOIT_TRAITS = list(TRAIT_INCAPACITATED, TRAIT_FLOORED, TRAIT_IMMOBILIZED, TRAIT_KNOCKEDOUT), + BB_BASIC_MOB_FLEEING = TRUE, + BB_LOBSTROSITY_FINGER_LUST = 0 + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/random_speech/insect, + /datum/ai_planning_subtree/hoard_fingers, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/targeted_mob_ability/lobster, + /datum/ai_planning_subtree/flee_target/lobster, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree/lobster, + /datum/ai_planning_subtree/find_fingers, + ) + +/datum/targetting_datum/basic/lobster + stat_attack = HARD_CRIT + +/datum/ai_planning_subtree/basic_melee_attack_subtree/lobster + melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/lobster + +/datum/ai_planning_subtree/basic_melee_attack_subtree/lobster/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if (controller.blackboard[BB_BASIC_MOB_FLEEING]) + return + if (!isnull(controller.blackboard[BB_LOBSTROSITY_TARGET_LIMB])) + return + var/mob/living/living_pawn = controller.pawn + if (DOING_INTERACTION_WITH_TARGET(living_pawn, controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET])) + return + return ..() + +/datum/ai_behavior/basic_melee_attack/lobster + +/datum/ai_behavior/basic_melee_attack/lobster/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) + var/mob/living/target = controller.blackboard[target_key] + if (isnull(target)) + return ..() + var/is_vulnerable = FALSE + for (var/trait in controller.blackboard[BB_LOBSTROSITY_EXPLOIT_TRAITS]) + if (!HAS_TRAIT(target, trait)) + continue + is_vulnerable = TRUE + break + if (!is_vulnerable) + controller.set_blackboard_key(BB_BASIC_MOB_FLEEING, TRUE) + if (controller.blackboard[BB_BASIC_MOB_FLEEING]) + finish_action(controller = controller, succeeded = TRUE, target_key = target_key) // We don't want to clear our target + return + return ..() + +/datum/ai_planning_subtree/flee_target/lobster + flee_behaviour = /datum/ai_behavior/run_away_from_target/lobster + +/datum/ai_behavior/run_away_from_target/lobster + clear_failed_targets = FALSE + +/datum/ai_behavior/run_away_from_target/lobster/perform(seconds_per_tick, datum/ai_controller/controller, target_key, hiding_location_key) + var/atom/target = controller.blackboard[target_key] + if(isnull(target)) + return ..() + for (var/trait in controller.blackboard[BB_LOBSTROSITY_EXPLOIT_TRAITS]) + if (!HAS_TRAIT(target, trait)) + continue + controller.set_blackboard_key(BB_BASIC_MOB_FLEEING, FALSE) + finish_action(controller, succeeded = FALSE) + return + + var/mob/living/us = controller.pawn + if (us.pulling == target) + us.stop_pulling() // If we're running away from someone, best not to bring them with us + + return ..() + +/// Don't use charge ability on an adjacent target, and make sure you're visible before you start +/datum/ai_planning_subtree/targeted_mob_ability/lobster + use_ability_behaviour = /datum/ai_behavior/targeted_mob_ability/min_range + +/datum/ai_planning_subtree/targeted_mob_ability/lobster/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/atom/target = controller.blackboard[target_key] + if(QDELETED(target) || in_range(controller.pawn, target)) + return FALSE + return ..() + +/// Look for loose arms lying around +/datum/ai_planning_subtree/find_fingers + /// Where do we store target limb data? + var/target_key = BB_LOBSTROSITY_TARGET_LIMB + /// What are we actually looking for? + var/desired_type = /obj/item/bodypart/arm + +/datum/ai_planning_subtree/find_fingers/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + . = ..() + controller.queue_behavior(/datum/ai_behavior/find_and_set, target_key, desired_type) + +/// If you see an arm, grab it and run +/datum/ai_planning_subtree/hoard_fingers + /// Where do we store target limb data? + var/target_key = BB_LOBSTROSITY_TARGET_LIMB + +/datum/ai_planning_subtree/hoard_fingers/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + . = ..() + var/atom/current_target = controller.blackboard[target_key] + if (QDELETED(current_target)) + return + + var/mob/living/living_pawn = controller.pawn + if (living_pawn.pulling != current_target) + controller.queue_behavior(/datum/ai_behavior/grab_fingers, target_key) + else + controller.queue_behavior(/datum/ai_behavior/hoard_fingers, target_key) + return SUBTREE_RETURN_FINISH_PLANNING + +/// If our target is an arm then move over and drag it +/datum/ai_behavior/grab_fingers + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + +/datum/ai_behavior/grab_fingers/setup(datum/ai_controller/controller, target_key) + . = ..() + var/atom/current_target = controller.blackboard[target_key] + if (QDELETED(current_target)) + return FALSE + set_movement_target(controller, current_target) + +/datum/ai_behavior/grab_fingers/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + + var/atom/current_target = controller.blackboard[target_key] + if (QDELETED(current_target)) + return + var/mob/living/living_pawn = controller.pawn + living_pawn.start_pulling(current_target) + finish_action(controller, succeeded = TRUE) + +/// How far we'll try to go before eating an arm +#define FLEE_TO_RANGE 9 +/// How many times we'll attempt to move before giving up +#define MAX_LOBSTROSITY_PATIENCE 15 + +/// If we are dragging an arm then run away until we are out of range and feast +/datum/ai_behavior/hoard_fingers + required_distance = 0 + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + /// We store a counter at this key we increment on every movement until we are overwhelmed with hunger + var/patience_key = BB_LOBSTROSITY_FINGER_LUST + +/datum/ai_behavior/hoard_fingers/setup(datum/ai_controller/controller, target_key) + . = ..() + var/atom/current_target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + if (QDELETED(current_target)) + set_movement_target(controller, get_turf(controller.pawn)) + return + target_step_away(controller, current_target, target_key) + +/// Find the next step to take away from the current target +/datum/ai_behavior/hoard_fingers/proc/target_step_away(datum/ai_controller/controller, atom/current_target, target_key) + var/turf/next_step = get_step_away(controller.pawn, current_target) + if (!isnull(next_step) && !next_step.is_blocked_turf(exclude_mobs = TRUE)) + set_movement_target(controller, next_step) + return + var/list/all_dirs = GLOB.alldirs.Copy() + all_dirs -= get_dir(controller.pawn, next_step) + all_dirs -= get_dir(controller.pawn, current_target) + shuffle_inplace(all_dirs) + for (var/dir in all_dirs) + next_step = get_step(controller.pawn, dir) + if (!isnull(next_step) && !next_step.is_blocked_turf(exclude_mobs = TRUE)) + set_movement_target(controller, next_step) + return + finish_action(controller, succeeded = FALSE, target_key = target_key) + return + +/datum/ai_behavior/hoard_fingers/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + var/current_patience = controller.blackboard[patience_key] + 1 + if (current_patience >= MAX_LOBSTROSITY_PATIENCE) + eat_fingers(controller, target_key) + return + controller.set_blackboard_key(patience_key, current_patience) + var/mob/living/living_pawn = controller.pawn + if (isnull(living_pawn.pulling)) + finish_action(controller, succeeded = FALSE, target_key = target_key) + return + + var/atom/current_target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + if (QDELETED(current_target) || !can_see(controller.pawn, current_target, FLEE_TO_RANGE)) + eat_fingers(controller, target_key) + return + target_step_away(controller, current_target, target_key) + +/// Finally consume those delicious digits +/datum/ai_behavior/hoard_fingers/proc/eat_fingers(datum/ai_controller/controller, target_key) + var/mob/living/basic/living_pawn = controller.pawn + var/atom/fingers = controller.blackboard[target_key] + if (QDELETED(fingers) || living_pawn.pulling != fingers) + finish_action(controller, succeeded = FALSE, target_key = target_key) + return + living_pawn.melee_attack(fingers) + finish_action(controller, succeeded = TRUE, target_key = target_key) + +/datum/ai_behavior/hoard_fingers/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + controller.set_blackboard_key(patience_key, 0) + controller.clear_blackboard_key(target_key) + controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET) + +#undef FLEE_TO_RANGE +#undef MAX_LOBSTROSITY_PATIENCE diff --git a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_trophy.dm b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_trophy.dm new file mode 100644 index 0000000000000..c018795b20b7d --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_trophy.dm @@ -0,0 +1,13 @@ +/// Lobstrosity crusher trophy. Staggers targets, increasing their click cooldown. +/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/basic/lavaland/mining.dm b/code/modules/mob/living/basic/lavaland/mining.dm index 91680eeb05949..0b6c4f321b66b 100644 --- a/code/modules/mob/living/basic/lavaland/mining.dm +++ b/code/modules/mob/living/basic/lavaland/mining.dm @@ -1,13 +1,44 @@ ///prototype for mining mobs /mob/living/basic/mining - + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' combat_mode = TRUE + status_flags = NONE //don't inherit standard basicmob flags + mob_size = MOB_SIZE_LARGE + mob_biotypes = MOB_ORGANIC|MOB_BEAST faction = list(FACTION_MINING) unsuitable_atmos_damage = 0 minimum_survivable_temperature = 0 maximum_survivable_temperature = INFINITY + // Pale purple, should be red enough to see stuff on lavaland + lighting_cutoff_red = 25 + lighting_cutoff_green = 15 + lighting_cutoff_blue = 35 + /// Message to output if throwing damage is absorbed + var/throw_blocked_message = "bounces off" + /// What crusher trophy this mob drops, if any + var/crusher_loot + /// What is the chance the mob drops it if all their health was taken by crusher attacks + var/crusher_drop_chance = 25 /mob/living/basic/mining/Initialize(mapload) . = ..() add_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_ASHSTORM_IMMUNE), INNATE_TRAIT) AddElement(/datum/element/mob_killed_tally, "mobs_killed_mining") + var/static/list/vulnerable_projectiles + if(!vulnerable_projectiles) + vulnerable_projectiles = string_list(MINING_MOB_PROJECTILE_VULNERABILITY) + AddElement(\ + /datum/element/ranged_armour,\ + minimum_projectile_force = 30,\ + below_projectile_multiplier = 0.3,\ + vulnerable_projectile_types = vulnerable_projectiles,\ + minimum_thrown_force = 20,\ + throw_blocked_message = throw_blocked_message,\ + ) + if(crusher_loot) + AddElement(\ + /datum/element/crusher_loot,\ + trophy_type = crusher_loot,\ + drop_mod = crusher_drop_chance,\ + drop_immediately = basic_mob_flags & DEL_ON_DEATH,\ + ) diff --git a/code/modules/mob/living/basic/lavaland/watcher/watcher.dm b/code/modules/mob/living/basic/lavaland/watcher/watcher.dm new file mode 100644 index 0000000000000..28ed712d06127 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/watcher/watcher.dm @@ -0,0 +1,106 @@ +/// A floating eyeball which keeps its distance and sometimes make you look away. +/mob/living/basic/mining/watcher + name = "watcher" + desc = "A levitating, monocular creature held aloft by wing-like veins. A sharp spine of crystal protrudes from its body." + icon = 'icons/mob/simple/lavaland/lavaland_monsters_wide.dmi' + icon_state = "watcher" + icon_living = "watcher" + icon_dead = "watcher_dead" + health_doll_icon = "watcher" + pixel_x = -12 + base_pixel_x = -12 + speak_emote = list("chimes") + speed = 3 + maxHealth = 160 + health = 160 + attack_verb_continuous = "buffets" + attack_verb_simple = "buffet" + crusher_loot = /obj/item/crusher_trophy/watcher_wing + ai_controller = /datum/ai_controller/basic_controller/watcher + butcher_results = list( + /obj/item/stack/sheet/bone = 1, + /obj/item/stack/ore/diamond = 2, + /obj/item/stack/sheet/sinew = 2, + ) + /// How often can we shoot? + var/ranged_cooldown = 3 SECONDS + /// What kind of beams we got? + var/projectile_type = /obj/projectile/temp/watcher + /// Icon state for our eye overlay + var/eye_glow = "ice_glow" + /// Sound to play when we shoot + var/shoot_sound = 'sound/weapons/pierce.ogg' + /// Typepath of our gaze ability + var/gaze_attack = /datum/action/cooldown/mob_cooldown/watcher_gaze + // We attract and eat these things for some reason + var/list/wanted_objects = list( + /obj/item/stack/sheet/mineral/diamond, + /obj/item/stack/ore/diamond, + /obj/item/pen/survival, + ) + +/mob/living/basic/mining/watcher/Initialize(mapload) + . = ..() + AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/simple_flying) + AddElement(/datum/element/content_barfer) + AddComponent(/datum/component/ai_target_timer) + AddComponent(/datum/component/basic_ranged_ready_overlay, overlay_state = eye_glow) + AddComponent(\ + /datum/component/ranged_attacks,\ + cooldown_time = ranged_cooldown,\ + projectile_type = projectile_type,\ + projectile_sound = shoot_sound,\ + ) + AddComponent(\ + /datum/component/magnet,\ + attracted_typecache = wanted_objects,\ + on_contact = CALLBACK(src, PROC_REF(consume)),\ + ) + update_appearance(UPDATE_OVERLAYS) + + var/datum/action/cooldown/mob_cooldown/watcher_gaze/gaze = new gaze_attack(src) + gaze.Grant(src) + ai_controller.set_blackboard_key(BB_GENERIC_ACTION, gaze) + AddComponent(/datum/component/revenge_ability, gaze, targetting = ai_controller.blackboard[BB_TARGETTING_DATUM]) + +/mob/living/basic/mining/watcher/update_overlays() + . = ..() + if (stat == DEAD) + return + . += emissive_appearance(icon, "watcher_emissive", src) + +/// I love eating diamonds yum +/mob/living/basic/mining/watcher/proc/consume(atom/movable/thing) + visible_message(span_warning("[thing] seems to vanish into [src]'s body!")) + thing.forceMove(src) + +/// More durable, burning projectiles +/mob/living/basic/mining/watcher/magmawing + name = "magmawing watcher" + desc = "Presented with extreme temperatures, adaptive watchers absorb heat through their circulatory wings and repurpose it as a weapon." + icon_state = "watcher_magmawing" + icon_living = "watcher_magmawing" + icon_dead = "watcher_magmawing_dead" + eye_glow = "fire_glow" + maxHealth = 175 //Compensate for the lack of slowdown on projectiles with a bit of extra health + health = 175 + projectile_type = /obj/projectile/temp/watcher/magma_wing + gaze_attack = /datum/action/cooldown/mob_cooldown/watcher_gaze/fire + crusher_loot = /obj/item/crusher_trophy/blaster_tubes/magma_wing + crusher_drop_chance = 100 // There's only going to be one of these per round throw them a bone + +/// Less durable, freezing projectiles +/mob/living/basic/mining/watcher/icewing + name = "icewing watcher" + desc = "Watchers which fail to absorb enough heat during their development become fragile, but share their internal chill with their enemies." + icon_state = "watcher_icewing" + icon_living = "watcher_icewing" + icon_dead = "watcher_icewing_dead" + maxHealth = 130 + health = 130 + projectile_type = /obj/projectile/temp/watcher/ice_wing + gaze_attack = /datum/action/cooldown/mob_cooldown/watcher_gaze/ice + butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/bone = 1) + crusher_loot = /obj/item/crusher_trophy/watcher_wing/ice_wing + crusher_drop_chance = 100 diff --git a/code/modules/mob/living/basic/lavaland/watcher/watcher_ai.dm b/code/modules/mob/living/basic/lavaland/watcher/watcher_ai.dm new file mode 100644 index 0000000000000..a25234817f31e --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/watcher/watcher_ai.dm @@ -0,0 +1,39 @@ +/datum/ai_controller/basic_controller/watcher + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + ) + + ai_traits = PAUSE_DURING_DO_AFTER + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate/check_faction, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/maintain_distance, + /datum/ai_planning_subtree/use_mob_ability/gaze, + /datum/ai_planning_subtree/ranged_skirmish/watcher, + ) + +/datum/ai_planning_subtree/use_mob_ability/gaze + finish_planning = TRUE + +/datum/ai_planning_subtree/use_mob_ability/gaze/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + if (!isliving(target)) + return // Don't do this if there's nothing hostile around or if our target is a mech + var/time_on_target = controller.blackboard[BB_BASIC_MOB_HAS_TARGET_TIME] || 0 + if (time_on_target < 5 SECONDS) + return // We need to spend some time acquiring our target first + return ..() + +/datum/ai_planning_subtree/ranged_skirmish/watcher + attack_behavior = /datum/ai_behavior/ranged_skirmish/watcher + +/datum/ai_planning_subtree/ranged_skirmish/watcher/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + if (QDELETED(target) || HAS_TRAIT(target, TRAIT_OVERWATCHED)) + return // Don't bully people who are playing red light green light + return ..() + +/datum/ai_behavior/ranged_skirmish/watcher + min_range = 0 diff --git a/code/modules/mob/living/basic/lavaland/watcher/watcher_gaze.dm b/code/modules/mob/living/basic/lavaland/watcher/watcher_gaze.dm new file mode 100644 index 0000000000000..4b322c220ed3e --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/watcher/watcher_gaze.dm @@ -0,0 +1,127 @@ +/** + * Do something nasty to everyone nearby if they're looking at us. + */ +/datum/action/cooldown/mob_cooldown/watcher_gaze + name = "Disorienting Gaze" + desc = "After a delay, flash everyone looking at you." + button_icon = 'icons/mob/actions/actions_animal.dmi' + button_icon_state = "gaze" + background_icon_state = "bg_demon" + overlay_icon_state = "bg_demon_border" + cooldown_time = 20 SECONDS + check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED + click_to_activate = FALSE + shared_cooldown = NONE + melee_cooldown_time = 0 SECONDS + /// At what range do we check for vision? + var/effect_radius = 7 + /// How long does it take to play our various animation stages + var/animation_time = 0.8 SECONDS + /// How long after pressing the button do we give people to turn around? + var/wait_delay = 1.6 SECONDS + /// What are we currently displaying? + var/image/current_overlay + /// Timer until we go to the next stage + var/stage_timer + +/datum/action/cooldown/mob_cooldown/watcher_gaze/Activate(mob/living/target) + show_indicator_overlay("eye_open") + stage_timer = addtimer(CALLBACK(src, PROC_REF(show_indicator_overlay), "eye_pulse"), animation_time, TIMER_STOPPABLE) + StartCooldown(360 SECONDS, 360 SECONDS) + owner.visible_message(span_warning("[owner]'s eye glows ominously!")) + if (do_after(owner, delay = wait_delay, target = owner)) + trigger_effect() + else + deltimer(stage_timer) + clear_current_overlay() + StartCooldown() + return TRUE + +/datum/action/cooldown/mob_cooldown/watcher_gaze/Destroy() + deltimer(stage_timer) + clear_current_overlay() + return ..() + +/datum/action/cooldown/mob_cooldown/watcher_gaze/Remove(mob/removed_from) + deltimer(stage_timer) + clear_current_overlay() + return ..() + +/// Do some effects to whoever is looking at us +/datum/action/cooldown/mob_cooldown/watcher_gaze/proc/trigger_effect() + deltimer(stage_timer) + show_indicator_overlay("eye_flash") + for (var/mob/living/viewer in viewers(effect_radius, owner)) + var/view_dir = get_dir(viewer, owner) + if (!(viewer.dir & view_dir) || viewer.stat != CONSCIOUS) + continue + if (!apply_effect(viewer)) + continue + var/image/flashed_overlay = image( + icon = 'icons/effects/eldritch.dmi', + loc = viewer, + icon_state = "eye_flash", + pixel_x = -viewer.pixel_x, + pixel_y = -viewer.pixel_y, + ) + flick_overlay_global(flashed_overlay, show_to = GLOB.clients, duration = animation_time) + stage_timer = addtimer(CALLBACK(src, PROC_REF(hide_eye)), animation_time, TIMER_STOPPABLE) + var/mob/living/living_owner = owner + living_owner.Stun(1.5 SECONDS, ignore_canstun = TRUE) + +/// Do something bad to someone who was looking at us +/datum/action/cooldown/mob_cooldown/watcher_gaze/proc/apply_effect(mob/living/viewer) + if (!viewer.flash_act(intensity = 4, affect_silicon = TRUE, visual = TRUE, length = 3 SECONDS)) + return FALSE + viewer.set_confusion_if_lower(12 SECONDS) + to_chat(viewer, span_warning("You are blinded by [owner]'s piercing gaze!")) + return TRUE + +/// Animate our effect out +/datum/action/cooldown/mob_cooldown/watcher_gaze/proc/hide_eye() + show_indicator_overlay("eye_close") + stage_timer = addtimer(CALLBACK(src, PROC_REF(clear_current_overlay)), animation_time, TIMER_STOPPABLE) + +/// Display an animated overlay over our head to indicate what's going on +/datum/action/cooldown/mob_cooldown/watcher_gaze/proc/show_indicator_overlay(overlay_state) + clear_current_overlay() + current_overlay = image(icon = 'icons/effects/eldritch.dmi', loc = owner, icon_state = overlay_state, pixel_x = -owner.pixel_x, pixel_y = 28, layer = ABOVE_ALL_MOB_LAYER) + SET_PLANE_EXPLICIT(current_overlay, ABOVE_LIGHTING_PLANE, owner) + for(var/client/add_to in GLOB.clients) + add_to.images += current_overlay + +/// Hide whatever overlay we are showing +/datum/action/cooldown/mob_cooldown/watcher_gaze/proc/clear_current_overlay() + if (!isnull(current_overlay)) + remove_image_from_clients(current_overlay, GLOB.clients) + current_overlay = null + +/// Magmawing glare burns you +/datum/action/cooldown/mob_cooldown/watcher_gaze/fire + name = "Searing Glare" + desc = "After a delay, burn and stun everyone looking at you." + +/datum/action/cooldown/mob_cooldown/watcher_gaze/fire/apply_effect(mob/living/viewer) + to_chat(viewer, span_warning("[owner]'s searing glare forces you to the ground!")) + viewer.Paralyze(3 SECONDS) + viewer.adjust_fire_stacks(10) + viewer.ignite_mob() + return TRUE + +/// Icewing glare freezes you +/datum/action/cooldown/mob_cooldown/watcher_gaze/ice + name = "Cold Stare" + desc = "After a delay, freeze and repulse everyone looking at you." + /// Max distance to throw people looking at us + var/max_throw = 3 + +/datum/action/cooldown/mob_cooldown/watcher_gaze/ice/apply_effect(mob/living/viewer) + to_chat(viewer, span_warning("You are repulsed by the force of [owner]'s cold stare!")) + viewer.apply_status_effect(/datum/status_effect/freon/watcher/extended) + viewer.safe_throw_at( + target = get_edge_target_turf(owner, get_dir(owner, get_step_away(viewer, owner))), + range = max_throw, + speed = 1, + thrower = owner, + force = MOVE_FORCE_EXTREMELY_STRONG, + ) diff --git a/code/modules/mob/living/basic/lavaland/watcher/watcher_overwatch.dm b/code/modules/mob/living/basic/lavaland/watcher/watcher_overwatch.dm new file mode 100644 index 0000000000000..0c8194c524a93 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/watcher/watcher_overwatch.dm @@ -0,0 +1,164 @@ +/** + * Automatically shoot at a target if they do anything while this is active on them. + * Currently not given to any mob, but retained so admins can use it. + */ +/datum/action/cooldown/mob_cooldown/watcher_overwatch + name = "Overwatch" + desc = "Keep a close eye on the target's actions, automatically firing upon them if they act." + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "eye" + background_icon_state = "bg_demon" + overlay_icon_state = "bg_demon_border" + cooldown_time = 20 SECONDS + check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED + click_to_activate = TRUE + shared_cooldown = NONE + /// Furthest range we can activate ability at + var/max_range = 7 + /// Type of projectile to fire + var/projectile_type = /obj/projectile/temp/watcher + /// Sound the projectile we fire makes + var/projectile_sound = 'sound/weapons/pierce.ogg' + /// Time to watch for + var/overwatch_duration = 3 SECONDS + +/datum/action/cooldown/mob_cooldown/watcher_overwatch/New(Target, original) + . = ..() + melee_cooldown_time = overwatch_duration + +/datum/action/cooldown/mob_cooldown/watcher_overwatch/PreActivate(atom/target) + if (target == owner) + return + if (ismecha(target)) + var/obj/vehicle/sealed/mecha/mech = target + var/list/drivers = mech.return_drivers() + if (!length(drivers)) + return + target = drivers[1] + if (!isliving(target)) + return + if (get_dist(owner, target) > max_range) + return + return ..() + +/datum/action/cooldown/mob_cooldown/watcher_overwatch/Activate(mob/living/target) + var/mob/living/living_owner = owner + living_owner.face_atom(target) + living_owner.Stun(overwatch_duration, ignore_canstun = TRUE) + target.apply_status_effect(/datum/status_effect/overwatch, overwatch_duration, owner, projectile_type, projectile_sound) + owner.visible_message(span_warning("[owner]'s eye locks on to [target]!")) + StartCooldown() + return TRUE + +/// Status effect which tracks whether our overwatched mob moves or acts +/datum/status_effect/overwatch + id = "watcher_overwatch" + duration = 5 SECONDS + status_type = STATUS_EFFECT_MULTIPLE + alert_type = /atom/movable/screen/alert/status_effect/overwatch + /// Distance at which we break off the ability + var/watch_range = 9 + /// Visual effect to make the status obvious + var/datum/beam/link + /// Which watcher is watching? + var/mob/living/watcher + /// Type of projectile to fire + var/projectile_type + /// Noise to make when we shoot beam + var/projectile_sound + /// Did the overwatch ever trigger during our run? + var/overwatch_triggered = FALSE + /// Signals which trigger a hostile response + var/static/list/forbidden_actions = list( + COMSIG_MOB_ABILITY_FINISHED, + COMSIG_MOB_ATTACK_HAND, + COMSIG_MOB_DROVE_MECH, + COMSIG_MOB_FIRED_GUN, + COMSIG_MOB_ITEM_ATTACK, + COMSIG_MOB_THROW, + COMSIG_MOB_USED_MECH_EQUIPMENT, + COMSIG_MOB_USED_MECH_MELEE, + COMSIG_MOVABLE_MOVED, + ) + +/datum/status_effect/overwatch/on_creation(mob/living/new_owner, set_duration, mob/living/watcher, projectile_type, projectile_sound) + if (isnull(watcher) || isnull(projectile_type)) + return FALSE + if (HAS_TRAIT(new_owner, TRAIT_OVERWATCH_IMMUNE)) + return FALSE + src.watcher = watcher + src.projectile_type = projectile_type + src.projectile_sound = projectile_sound + if (!isnull(set_duration)) + duration = set_duration + return ..() + +/datum/status_effect/overwatch/on_apply() + . = ..() + if (!.) + return FALSE + owner.add_traits(list(TRAIT_OVERWATCHED, TRAIT_OVERWATCH_IMMUNE), TRAIT_STATUS_EFFECT(id)) + owner.do_alert_animation() + owner.Immobilize(0.25 SECONDS) // Just long enough that they don't trigger it by mistake + owner.playsound_local(owner, 'sound/machines/chime.ogg', 50, TRUE) + var/atom/beam_origin = ismecha(owner.loc) ? owner.loc : owner + link = beam_origin.Beam(watcher, icon_state = "r_beam", override_target_pixel_x = 0) + RegisterSignals(owner, forbidden_actions, PROC_REF(opportunity_attack)) + RegisterSignals(owner, list(COMSIG_QDELETING, COMSIG_LIVING_DEATH), PROC_REF(on_participant_died)) + RegisterSignals(watcher, list(COMSIG_QDELETING, COMSIG_LIVING_DEATH), PROC_REF(on_participant_died)) + +/datum/status_effect/overwatch/on_remove() + UnregisterSignal(owner, forbidden_actions + list(COMSIG_QDELETING, COMSIG_LIVING_DEATH)) + QDEL_NULL(link) + owner.remove_traits(list(TRAIT_OVERWATCHED, TRAIT_OVERWATCH_IMMUNE), TRAIT_STATUS_EFFECT(id)) + if (!QDELETED(owner)) + owner.apply_status_effect(/datum/status_effect/overwatch_immune) + return ..() + +/datum/status_effect/overwatch/Destroy() + QDEL_NULL(link) + if (!isnull(watcher)) // Side effects in Destroy? Well it turns out `on_remove` is also just called on Destroy. But only if the owner isn't deleting. + INVOKE_ASYNC(src, PROC_REF(unregister_watcher), watcher) + watcher = null + + return ..() + +/// Clean up our association with the caster of this ability. +/datum/status_effect/overwatch/proc/unregister_watcher(mob/living/former_overwatcher) + if (!overwatch_triggered) + former_overwatcher.Stun(2 SECONDS, ignore_canstun = TRUE) + UnregisterSignal(former_overwatcher, list(COMSIG_QDELETING, COMSIG_LIVING_DEATH)) + +/// Uh oh, you did something within my threat radius, now we're going to shoot you +/datum/status_effect/overwatch/proc/opportunity_attack() + SIGNAL_HANDLER + if (!can_see(watcher, owner, length = watch_range)) + qdel(src) + return + overwatch_triggered = TRUE + watcher.do_alert_animation() + INVOKE_ASYNC(watcher, TYPE_PROC_REF(/atom/, fire_projectile), projectile_type, owner, projectile_sound) + +/// Can't overwatch you if I don't exist +/datum/status_effect/overwatch/proc/on_participant_died() + SIGNAL_HANDLER + qdel(src) + +/atom/movable/screen/alert/status_effect/overwatch + name = "Overwatched" + desc = "Freeze! You are being watched!" + icon_state = "aimed" + +/// Blocks further applications of the ability for a little while +/datum/status_effect/overwatch_immune + id = "watcher_overwatch_immunity" + duration = 10 SECONDS // To stop watcher tendrils spamming the shit out of you + alert_type = null + +/datum/status_effect/overwatch_immune/on_apply() + . = ..() + ADD_TRAIT(owner, TRAIT_OVERWATCH_IMMUNE, TRAIT_STATUS_EFFECT(id)) + +/datum/status_effect/overwatch_immune/on_remove() + REMOVE_TRAIT(owner, TRAIT_OVERWATCH_IMMUNE, TRAIT_STATUS_EFFECT(id)) + return ..() diff --git a/code/modules/mob/living/basic/lavaland/watcher/watcher_projectiles.dm b/code/modules/mob/living/basic/lavaland/watcher/watcher_projectiles.dm new file mode 100644 index 0000000000000..2680e9aa914cb --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/watcher/watcher_projectiles.dm @@ -0,0 +1,37 @@ +/// Chilling projectile, hurts and slows you down +/obj/projectile/temp/watcher + name = "chilling blast" + icon_state = "ice_2" + damage = 10 + damage_type = BURN + armor_flag = ENERGY + temperature = -50 + +/obj/projectile/temp/watcher/on_hit(mob/living/target, blocked = 0) + . = ..() + if (!isliving(target)) + return + apply_status(target) + +/// Apply an additional on-hit effect +/obj/projectile/temp/watcher/proc/apply_status(mob/living/target) + target.apply_status_effect(/datum/status_effect/freezing_blast) + +/// Lava projectile, ignites you +/obj/projectile/temp/watcher/magma_wing + name = "scorching blast" + icon_state = "lava" + damage = 5 + temperature = 200 + +/obj/projectile/temp/watcher/magma_wing/apply_status(mob/living/target) + target.adjust_fire_stacks(0.1) + target.ignite_mob() + +/// Freezing projectile, freezes you +/obj/projectile/temp/watcher/ice_wing + name = "freezing blast" + damage = 5 + +/obj/projectile/temp/watcher/ice_wing/apply_status(mob/living/target) + target.apply_status_effect(/datum/status_effect/freon/watcher) diff --git a/code/modules/mob/living/basic/minebots/minebot.dm b/code/modules/mob/living/basic/minebots/minebot.dm new file mode 100644 index 0000000000000..061c9a624f719 --- /dev/null +++ b/code/modules/mob/living/basic/minebots/minebot.dm @@ -0,0 +1,175 @@ +/mob/living/basic/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. Insert any type of ore into it to make it start listening to your commands!" + gender = NEUTER + icon = 'icons/mob/silicon/aibots.dmi' + icon_state = "mining_drone" + icon_living = "mining_drone" + basic_mob_flags = DEL_ON_DEATH + status_flags = CANSTUN|CANKNOCKDOWN|CANPUSH + mouse_opacity = MOUSE_OPACITY_ICON + combat_mode = TRUE + habitable_atmos = 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) + minimum_survivable_temperature = 0 + health = 125 + maxHealth = 125 + melee_damage_lower = 15 + melee_damage_upper = 15 + obj_damage = 10 + attack_verb_continuous = "drills" + attack_verb_simple = "drill" + attack_sound = 'sound/weapons/circsawhit.ogg' + sentience_type = SENTIENCE_MINEBOT + speak_emote = list("states") + mob_biotypes = MOB_ROBOTIC + death_message = "blows apart!" + light_system = MOVABLE_LIGHT + light_range = 6 + light_on = FALSE + combat_mode = FALSE + ai_controller = /datum/ai_controller/basic_controller/minebot + ///the access card we use to access mining + var/obj/item/card/id/access_card + ///the gun we use to kill + var/obj/item/gun/energy/recharge/kinetic_accelerator/minebot/stored_gun + ///the commands our owner can give us + var/list/pet_commands = list( + /datum/pet_command/idle/minebot, + /datum/pet_command/minebot_ability/light, + /datum/pet_command/minebot_ability/dump, + /datum/pet_command/automate_mining, + /datum/pet_command/free/minebot, + /datum/pet_command/follow, + /datum/pet_command/point_targetting/attack/minebot, + ) + +/mob/living/basic/mining_drone/Initialize(mapload) + . = ..() + + var/static/list/death_drops = list(/obj/effect/decal/cleanable/robot_debris/old) + AddElement(/datum/element/death_drops, death_drops) + add_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_ASHSTORM_IMMUNE), INNATE_TRAIT) + AddElement(/datum/element/footstep, FOOTSTEP_OBJ_ROBOT, 1, -6, sound_vary = TRUE) + AddComponent(\ + /datum/component/tameable,\ + food_types = list(/obj/item/stack/ore),\ + tame_chance = 100,\ + bonus_tame_chance = 5,\ + after_tame = CALLBACK(src, PROC_REF(activate_bot)),\ + ) + + var/datum/action/cooldown/mob_cooldown/minedrone/toggle_light/toggle_light_action = new(src) + var/datum/action/cooldown/mob_cooldown/minedrone/toggle_meson_vision/toggle_meson_vision_action = new(src) + var/datum/action/cooldown/mob_cooldown/minedrone/dump_ore/dump_ore_action = new(src) + toggle_light_action.Grant(src) + toggle_meson_vision_action.Grant(src) + dump_ore_action.Grant(src) + ai_controller.set_blackboard_key(BB_MINEBOT_LIGHT_ABILITY, toggle_light_action) + ai_controller.set_blackboard_key(BB_MINEBOT_DUMP_ABILITY, dump_ore_action) + + stored_gun = new(src) + var/obj/item/implant/radio/mining/comms = new(src) + comms.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) + + RegisterSignal(src, COMSIG_MOB_TRIED_ACCESS, PROC_REF(attempt_access)) + +/mob/living/basic/mining_drone/set_combat_mode(new_mode, silent = TRUE) + . = ..() + icon_state = combat_mode ? "mining_drone_offense" : "mining_drone" + balloon_alert(src, "now [combat_mode ? "attacking" : "collecting"]") + +/mob/living/basic/mining_drone/examine(mob/user) + . = ..() + if(health < maxHealth) + if(health >= maxHealth * 0.5) + . += span_warning("[p_They()] look slightly dented.") + else + . += span_boldwarning("[p_They()] look severely dented!") + + if(isnull(stored_gun) || !stored_gun.max_mod_capacity) + return + + . += "[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/basic/mining_drone/welder_act(mob/living/user, obj/item/welder) + if(user.combat_mode) + return FALSE + if(combat_mode) + user.balloon_alert(user, "can't repair in attack mode!") + return TRUE + if(maxHealth == health) + user.balloon_alert(user, "at full integrity!") + return TRUE + if(welder.use_tool(src, user, 0, volume=40)) + adjustBruteLoss(-15) + user.balloon_alert(user, "successfully repaired!") + return TRUE + +/mob/living/basic/mining_drone/attackby(obj/item/item_used, mob/user, params) + 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 + + return ..() + +/mob/living/basic/mining_drone/attack_hand(mob/living/carbon/human/user, list/modifiers) + . = ..() + + if(. || user.combat_mode) + return + set_combat_mode(!combat_mode) + balloon_alert(user, "now [combat_mode ? "attacking wildlife" : "collecting loose ore"]") + +/mob/living/basic/mining_drone/RangedAttack(atom/target) + if(!combat_mode) + return + stored_gun.afterattack(target, src) + + +/mob/living/basic/mining_drone/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) + . = ..() + + if(!. || !proximity_flag || combat_mode) + return + + if(istype(attack_target, /obj/item/stack/ore)) + var/obj/item/target_ore = attack_target + target_ore.forceMove(src) + +/mob/living/basic/mining_drone/proc/drop_ore() + to_chat(src, span_notice("You dump your stored ore.")) + for(var/obj/item/stack/ore/dropped_item in contents) + dropped_item.forceMove(get_turf(src)) + +/mob/living/basic/mining_drone/proc/attempt_access(mob/drone, obj/door_attempt) + SIGNAL_HANDLER + + if(door_attempt.check_access(access_card)) + return ACCESS_ALLOWED + return ACCESS_DISALLOWED + +/mob/living/basic/mining_drone/proc/activate_bot() + AddComponent(/datum/component/obeys_commands, pet_commands) + +/mob/living/basic/mining_drone/death(gibbed) + drop_ore() + + if(isnull(stored_gun)) + return ..() + + for(var/obj/item/borg/upgrade/modkit/modkit as anything in stored_gun.modkits) + modkit.uninstall(stored_gun) + + return ..() + +/mob/living/basic/mining_drone/Destroy() + QDEL_NULL(stored_gun) + QDEL_NULL(access_card) + return ..() + diff --git a/code/modules/mob/living/basic/minebots/minebot_abilities.dm b/code/modules/mob/living/basic/minebots/minebot_abilities.dm new file mode 100644 index 0000000000000..4f119fd9b66a7 --- /dev/null +++ b/code/modules/mob/living/basic/minebots/minebot_abilities.dm @@ -0,0 +1,51 @@ + +/datum/action/cooldown/mob_cooldown/minedrone + button_icon = 'icons/mob/actions/actions_mecha.dmi' + background_icon_state = "bg_default" + overlay_icon_state = "bg_default_border" + click_to_activate = FALSE + +/datum/action/cooldown/mob_cooldown/minedrone/toggle_light + name = "Toggle Light" + button_icon_state = "mech_lights_off" + +/datum/action/cooldown/mob_cooldown/minedrone/Activate() + owner.set_light_on(!owner.light_on) + owner.balloon_alert(owner, "lights [owner.light_on ? "on" : "off"]!") + +/datum/action/cooldown/mob_cooldown/minedrone/dump_ore + name = "Dump Ore" + button_icon_state = "mech_eject" + +/datum/action/cooldown/mob_cooldown/minedrone/dump_ore/IsAvailable(feedback = TRUE) + if(locate(/obj/item/stack/ore) in owner.contents) + return TRUE + + if(feedback) + owner.balloon_alert(owner, "no ore!") + return FALSE + +/datum/action/cooldown/mob_cooldown/minedrone/dump_ore/Activate() + var/mob/living/basic/mining_drone/user = owner + user.drop_ore() + +/datum/action/cooldown/mob_cooldown/minedrone/toggle_meson_vision + name = "Toggle Meson Vision" + button_icon_state = "meson" + +/datum/action/cooldown/mob_cooldown/minedrone/toggle_meson_vision/Activate() + if(owner.sight & SEE_TURFS) + owner.clear_sight(SEE_TURFS) + owner.lighting_cutoff_red += 5 + owner.lighting_cutoff_green += 15 + owner.lighting_cutoff_blue += 5 + else + owner.add_sight(SEE_TURFS) + owner.lighting_cutoff_red -= 5 + owner.lighting_cutoff_green -= 15 + owner.lighting_cutoff_blue -= 5 + + owner.sync_lighting_plane_cutoff() + + to_chat(owner, span_notice("You toggle your meson vision [(owner.sight & SEE_TURFS) ? "on" : "off"].")) + diff --git a/code/modules/mob/living/basic/minebots/minebot_ai.dm b/code/modules/mob/living/basic/minebots/minebot_ai.dm new file mode 100644 index 0000000000000..a4b082f5dd1bb --- /dev/null +++ b/code/modules/mob/living/basic/minebots/minebot_ai.dm @@ -0,0 +1,218 @@ +/datum/ai_controller/basic_controller/minebot + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends, + BB_BLACKLIST_MINERAL_TURFS = list(/turf/closed/mineral/gibtonite), + BB_AUTOMATED_MINING = FALSE, + ) + + 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/pet_planning, + /datum/ai_planning_subtree/basic_ranged_attack_subtree/minebot, + /datum/ai_planning_subtree/find_and_hunt_target/consume_ores/minebot, + /datum/ai_planning_subtree/minebot_mining, + /datum/ai_planning_subtree/locate_dead_humans, + ) + +///find dead humans and report their location on the radio +/datum/ai_planning_subtree/locate_dead_humans/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(controller.blackboard_key_exists(BB_NEARBY_DEAD_MINER)) + controller.queue_behavior(/datum/ai_behavior/send_sos_message, BB_NEARBY_DEAD_MINER) + return SUBTREE_RETURN_FINISH_PLANNING + controller.queue_behavior(/datum/ai_behavior/find_and_set/unconscious_human, BB_NEARBY_DEAD_MINER, /mob/living/carbon/human) + +/datum/ai_behavior/find_and_set/unconscious_human/search_tactic(datum/ai_controller/controller, locate_path, search_range) + for(var/mob/living/carbon/human/target in oview(search_range, controller.pawn)) + if(target.stat >= UNCONSCIOUS && target.mind) + return target + +/datum/ai_behavior/send_sos_message + behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + action_cooldown = 2 MINUTES + +/datum/ai_behavior/send_sos_message/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + var/mob/living/carbon/target = controller.blackboard[target_key] + var/mob/living/living_pawn = controller.pawn + if(QDELETED(target) || is_station_level(target.z)) + finish_action(controller, FALSE, target_key) + return + var/turf/target_turf = get_turf(target) + var/obj/item/implant/radio/radio_implant = locate(/obj/item/implant/radio) in living_pawn.contents + if(!radio_implant) + finish_action(controller, FALSE, target_key) + return + var/message = "ALERT, [target] in need of help at coordinates: [target_turf.x], [target_turf.y], [target_turf.z]!" + radio_implant.radio.talk_into(living_pawn, message, RADIO_CHANNEL_SUPPLY) + finish_action(controller, TRUE, target_key) + +/datum/ai_behavior/send_sos_message/finish_action(datum/ai_controller/controller, success, target_key) + . = ..() + controller.clear_blackboard_key(target_key) + +///operational datums is null because we dont use a ranged component, we use a gun in our contents +/datum/ai_planning_subtree/basic_ranged_attack_subtree/minebot + operational_datums = null + ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/minebot + +/datum/ai_behavior/basic_ranged_attack/minebot + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT + avoid_friendly_fire = TRUE + +/datum/ai_planning_subtree/basic_ranged_attack_subtree/minebot/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + if(!living_pawn.combat_mode) //we are not on attack mode + return + return ..() + +///mine walls if we are on automated mining mode +/datum/ai_planning_subtree/minebot_mining/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(!controller.blackboard[BB_AUTOMATED_MINING]) + return + if(controller.blackboard_key_exists(BB_TARGET_MINERAL_TURF)) + controller.queue_behavior(/datum/ai_behavior/minebot_mine_turf, BB_TARGET_MINERAL_TURF) + return SUBTREE_RETURN_FINISH_PLANNING + controller.queue_behavior(/datum/ai_behavior/find_mineral_wall/minebot, BB_TARGET_MINERAL_TURF) + +/datum/ai_behavior/find_mineral_wall/minebot + +/datum/ai_behavior/find_mineral_wall/minebot/check_if_mineable(datum/ai_controller/controller, turf/target_wall) + var/list/forbidden_turfs = controller.blackboard[BB_BLACKLIST_MINERAL_TURFS] + var/turf/previous_unreachable_wall = controller.blackboard[BB_PREVIOUS_UNREACHABLE_WALL] + if(is_type_in_list(target_wall, forbidden_turfs) || target_wall == previous_unreachable_wall) + return FALSE + controller.clear_blackboard_key(BB_PREVIOUS_UNREACHABLE_WALL) + return ..() + +/datum/ai_behavior/minebot_mine_turf + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + required_distance = 2 + action_cooldown = 3 SECONDS + +/datum/ai_behavior/minebot_mine_turf/setup(datum/ai_controller/controller, target_key) + . = ..() + var/turf/target = controller.blackboard[target_key] + if(isnull(target)) + return FALSE + set_movement_target(controller, target) + +/datum/ai_behavior/minebot_mine_turf/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + var/mob/living/basic/living_pawn = controller.pawn + var/turf/target = controller.blackboard[target_key] + + if(QDELETED(target)) + finish_action(controller, FALSE, target_key) + return + + if(check_obstacles_in_path(controller, target)) + finish_action(controller, FALSE, target_key) + return + + if(!living_pawn.combat_mode) + living_pawn.set_combat_mode(TRUE) + + living_pawn.RangedAttack(target) + finish_action(controller, TRUE, target_key) + return + +/datum/ai_behavior/minebot_mine_turf/proc/check_obstacles_in_path(datum/ai_controller/controller, turf/target) + var/mob/living/source = controller.pawn + var/list/turfs_in_path = get_line(source, target) - target + for(var/turf/turf in turfs_in_path) + if(turf.is_blocked_turf(ignore_atoms = list(source))) + controller.set_blackboard_key(BB_PREVIOUS_UNREACHABLE_WALL, target) + return TRUE + return FALSE + +/datum/ai_behavior/minebot_mine_turf/finish_action(datum/ai_controller/controller, success, target_key) + . = ..() + controller.clear_blackboard_key(target_key) + +///store ores in our body +/datum/ai_planning_subtree/find_and_hunt_target/consume_ores/minebot + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/consume_ores/minebot + hunt_chance = 100 + +/datum/ai_planning_subtree/find_and_hunt_target/consume_ores/minebot/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/automated_mining = controller.blackboard[BB_AUTOMATED_MINING] + var/mob/living/living_pawn = controller.pawn + + if(!automated_mining && living_pawn.combat_mode) //are we not on automated mining or collect mode? + return + + return ..() + +/datum/ai_behavior/hunt_target/unarmed_attack_target/consume_ores/minebot + hunt_cooldown = 2 SECONDS + +/datum/ai_behavior/hunt_target/unarmed_attack_target/consume_ores/minebot/target_caught(mob/living/hunter, obj/item/stack/ore/hunted) + if(hunter.combat_mode) + hunter.set_combat_mode(FALSE) + return ..() + +///pet commands +/datum/pet_command/free/minebot + +/datum/pet_command/free/minebot/execute_action(datum/ai_controller/controller) + controller.set_blackboard_key(BB_AUTOMATED_MINING, FALSE) + return ..() + +/datum/pet_command/automate_mining + command_name = "Automate mining" + command_desc = "Make your minebot automatically mine!" + radial_icon = 'icons/obj/mining.dmi' + radial_icon_state = "pickaxe" + speech_commands = list("mine") + +/datum/pet_command/automate_mining/execute_action(datum/ai_controller/controller) + controller.set_blackboard_key(BB_AUTOMATED_MINING, TRUE) + controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND) + +/datum/pet_command/minebot_ability + command_name = "Minebot ability" + command_desc = "Make your minebot use one of its abilities." + radial_icon = 'icons/mob/actions/actions_mecha.dmi' + ///the ability we will use + var/ability_key + +/datum/pet_command/minebot_ability/execute_action(datum/ai_controller/controller) + var/datum/action/cooldown/ability = controller.blackboard[ability_key] + if(!ability?.IsAvailable()) + return + controller.queue_behavior(/datum/ai_behavior/use_mob_ability, ability_key) + controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND) + return SUBTREE_RETURN_FINISH_PLANNING + +/datum/pet_command/minebot_ability/light + command_name = "Toggle lights" + command_desc = "Make your minebot toggle its lights." + speech_commands = list("light") + radial_icon_state = "mech_lights_off" + ability_key = BB_MINEBOT_LIGHT_ABILITY + +/datum/pet_command/minebot_ability/dump + command_name = "Dump ore" + command_desc = "Make your minebot dump all its ore!" + speech_commands = list("dump", "ore") + radial_icon_state = "mech_eject" + ability_key = BB_MINEBOT_DUMP_ABILITY + +/datum/pet_command/point_targetting/attack/minebot + attack_behaviour = /datum/ai_behavior/basic_ranged_attack/minebot + +/datum/pet_command/point_targetting/attack/minebot/execute_action(datum/ai_controller/controller) + controller.set_blackboard_key(BB_AUTOMATED_MINING, FALSE) + var/mob/living/living_pawn = controller.pawn + if(!living_pawn.combat_mode) + living_pawn.set_combat_mode(TRUE) + return ..() + +/datum/pet_command/idle/minebot + +/datum/pet_command/idle/minebot/execute_action(datum/ai_controller/controller) + controller.set_blackboard_key(BB_AUTOMATED_MINING, FALSE) + return ..() diff --git a/code/modules/mob/living/basic/minebots/minebot_upgrades.dm b/code/modules/mob/living/basic/minebots/minebot_upgrades.dm new file mode 100644 index 0000000000000..6f5d43af1afca --- /dev/null +++ b/code/modules/mob/living/basic/minebots/minebot_upgrades.dm @@ -0,0 +1,60 @@ +/obj/item/mine_bot_upgrade + name = "minebot melee upgrade" + desc = "A minebot upgrade." + icon_state = "door_electronics" + icon = 'icons/obj/assemblies/module.dmi' + +/obj/item/mine_bot_upgrade/afterattack(mob/living/basic/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/basic/mining_drone/minebot, mob/user) + if(minebot.melee_damage_upper != initial(minebot.melee_damage_upper)) + user.balloon_alert(user, "already has armor!") + return + minebot.melee_damage_lower += 7 + minebot.melee_damage_upper += 7 + to_chat(user, span_notice("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/basic/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, span_notice("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/assemblies/module.dmi' + sentience_type = SENTIENCE_MINEBOT + ///health boost to add + var/base_health_add = 5 + ///damage boost to add + var/base_damage_add = 1 + ///speed boost to add + var/base_speed_add = 1 + ///cooldown boost to add + var/base_cooldown_add = 10 + +/obj/item/slimepotion/slime/sentience/mining/after_success(mob/living/user, mob/living/basic_mob) + if(!istype(basic_mob, /mob/living/basic/mining_drone)) + return + var/mob/living/basic/mining_drone/minebot = basic_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.stored_gun?.recharge_time += base_cooldown_add diff --git a/code/modules/mob/living/basic/pets/dog.dm b/code/modules/mob/living/basic/pets/dog.dm deleted file mode 100644 index 7bdd65bd76747..0000000000000 --- a/code/modules/mob/living/basic/pets/dog.dm +++ /dev/null @@ -1,869 +0,0 @@ -//Dogs. - -// Add 'walkies' as valid input -/datum/pet_command/follow/dog - speech_commands = list("heel", "follow", "walkies") - -// Add 'good dog' as valid input -/datum/pet_command/good_boy/dog - speech_commands = list("good dog") - -// Set correct attack behaviour -/datum/pet_command/point_targetting/attack/dog - attack_behaviour = /datum/ai_behavior/basic_melee_attack/dog - -/datum/pet_command/point_targetting/attack/dog/set_command_active(mob/living/parent, mob/living/commander) - . = ..() - parent.ai_controller.set_blackboard_key(BB_DOG_HARASS_HARM, TRUE) - -/mob/living/basic/pet/dog - mob_biotypes = MOB_ORGANIC|MOB_BEAST - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "bops" - response_disarm_simple = "bop" - response_harm_continuous = "kicks" - response_harm_simple = "kick" - speak_emote = list("barks", "woofs") - faction = list(FACTION_NEUTRAL) - can_be_held = TRUE - ai_controller = /datum/ai_controller/basic_controller/dog - // The dog attack pet command can raise melee attack above 0 - attack_verb_continuous = "bites" - attack_verb_simple = "bite" - attack_sound = 'sound/weapons/bite.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE - /// Instructions you can give to dogs - var/static/list/pet_commands = list( - /datum/pet_command/idle, - /datum/pet_command/free, - /datum/pet_command/good_boy/dog, - /datum/pet_command/follow/dog, - /datum/pet_command/point_targetting/attack/dog, - /datum/pet_command/point_targetting/fetch, - /datum/pet_command/play_dead, - ) - -/mob/living/basic/pet/dog/Initialize(mapload) - . = ..() - AddElement(/datum/element/pet_bonus, "woofs happily!") - AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW) - AddElement(/datum/element/unfriend_attacker, untamed_reaction = "%SOURCE% fixes %TARGET% with a look of betrayal.") - AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/meat/slab/human/mutant/skeleton, /obj/item/stack/sheet/bone), tame_chance = 30, bonus_tame_chance = 15, after_tame = CALLBACK(src, PROC_REF(tamed)), unique = FALSE) - AddComponent(/datum/component/obeys_commands, pet_commands) - -/mob/living/basic/pet/dog/proc/update_dog_speech(datum/ai_planning_subtree/random_speech/speech) - speech.speak = string_list(list("YAP", "Woof!", "Bark!", "AUUUUUU")) - speech.emote_hear = string_list(list("barks!", "woofs!", "yaps.","pants.")) - speech.emote_see = string_list(list("shakes [p_their()] head.", "chases [p_their()] tail.","shivers.")) - -/mob/living/basic/pet/dog/proc/tamed(mob/living/tamer) - visible_message(span_notice("[src] licks at [tamer] in a friendly manner!")) - -//Corgis and pugs are now under one dog subtype - -/mob/living/basic/pet/dog/corgi - name = "\improper corgi" - real_name = "corgi" - desc = "They're a corgi." - icon_state = "corgi" - icon_living = "corgi" - icon_dead = "corgi_dead" - held_state = "corgi" - butcher_results = list(/obj/item/food/meat/slab/corgi = 3, /obj/item/stack/sheet/animalhide/corgi = 1) - gold_core_spawnable = FRIENDLY_SPAWN - collar_icon_state = "corgi" - ai_controller = /datum/ai_controller/basic_controller/dog/corgi - var/obj/item/inventory_head - var/obj/item/inventory_back - /// Access card for Ian. - var/obj/item/card/id/access_card = null - var/shaved = FALSE - var/nofur = FALSE //Corgis that have risen past the material plane of existence. - /// Is this corgi physically slow due to age, etc? - var/is_slow = FALSE - -/mob/living/basic/pet/dog/corgi/examine(mob/user) - . = ..() - if(access_card) - . += "There appears to be [icon2html(access_card, user)] \a [access_card] pinned to [p_them()]." - -/mob/living/basic/pet/dog/corgi/Destroy() - QDEL_NULL(inventory_head) - QDEL_NULL(inventory_back) - QDEL_NULL(access_card) - return ..() - -/mob/living/basic/pet/dog/corgi/gib() - if(inventory_head) - inventory_head.forceMove(drop_location()) - inventory_head = null - if(inventory_back) - inventory_back.forceMove(drop_location()) - inventory_back = null - if(access_card) - access_card.forceMove(drop_location()) - access_card = null - return ..() - -/mob/living/basic/pet/dog/corgi/deadchat_plays(mode = ANARCHY_MODE, cooldown = 12 SECONDS) - . = AddComponent(/datum/component/deadchat_control/cardinal_movement, mode, list( - "speak" = CALLBACK(src, PROC_REF(bork)), - "wear_hat" = CALLBACK(src, PROC_REF(find_new_hat)), - "drop_hat" = CALLBACK(src, PROC_REF(drop_hat)), - "spin" = CALLBACK(src, TYPE_PROC_REF(/mob, emote), "spin")), cooldown, CALLBACK(src, PROC_REF(stop_deadchat_plays))) - - if(. == COMPONENT_INCOMPATIBLE) - return - - // Stop all automated behavior. - QDEL_NULL(ai_controller) - -///Deadchat bark. -/mob/living/basic/pet/dog/corgi/proc/bork() - var/emote = pick("barks!", "woofs!", "yaps.","pants.") - - manual_emote(emote) - -///Deadchat plays command that picks a new hat for Ian. -/mob/living/basic/pet/dog/corgi/proc/find_new_hat() - if(!isturf(loc)) - return - var/list/possible_headwear = list() - for(var/obj/item/item in loc) - if(ispath(item.dog_fashion, /datum/dog_fashion/head)) - possible_headwear += item - if(!length(possible_headwear)) - for(var/obj/item/item in orange(1)) - if(ispath(item.dog_fashion, /datum/dog_fashion/head) && CanReach(item)) - possible_headwear += item - if(!length(possible_headwear)) - return - if(inventory_head) - inventory_head.forceMove(drop_location()) - inventory_head = null - place_on_head(pick(possible_headwear)) - visible_message(span_notice("[src] puts [inventory_head] on [p_their()] own head, somehow.")) - -///Deadchat plays command that drops the current hat off Ian. -/mob/living/basic/pet/dog/corgi/proc/drop_hat() - if(!inventory_head) - return - visible_message(span_notice("[src] vigorously shakes [p_their()] head, dropping [inventory_head] to the ground.")) - inventory_head.forceMove(drop_location()) - inventory_head = null - update_corgi_fluff() - regenerate_icons() - -///Turn AI back on. -/mob/living/basic/pet/dog/corgi/proc/stop_deadchat_plays() - var/controller_type = initial(ai_controller) - ai_controller = new controller_type(src) - ai_controller?.set_blackboard_key(BB_DOG_IS_SLOW, is_slow) - -/mob/living/basic/pet/dog/corgi/handle_atom_del(atom/A) - if(A == inventory_head) - inventory_head = null - update_corgi_fluff() - regenerate_icons() - if(A == inventory_back) - inventory_back = null - update_corgi_fluff() - regenerate_icons() - return ..() - -/mob/living/basic/pet/dog/pug - name = "\improper pug" - real_name = "pug" - desc = "They're a pug." - icon = 'icons/mob/simple/pets.dmi' - icon_state = "pug" - icon_living = "pug" - icon_dead = "pug_dead" - butcher_results = list(/obj/item/food/meat/slab/pug = 3) - gold_core_spawnable = FRIENDLY_SPAWN - collar_icon_state = "pug" - held_state = "pug" - -/mob/living/basic/pet/dog/pug/Initialize(mapload) - . = ..() - - AddElement(/datum/element/swabable, CELL_LINE_TABLE_PUG, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - -/mob/living/basic/pet/dog/pug/mcgriff - name = "McGriff" - desc = "This dog can tell something smells around here, and that something is CRIME!" - gold_core_spawnable = NO_SPAWN - unique_pet = TRUE - -/mob/living/basic/pet/dog/bullterrier - name = "\improper bull terrier" - real_name = "bull terrier" - desc = "They're a bull terrier." - icon = 'icons/mob/simple/pets.dmi' - icon_state = "bullterrier" - icon_living = "bullterrier" - icon_dead = "bullterrier_dead" - butcher_results = list(/obj/item/food/meat/slab/corgi = 3) // Would feel redundant to add more new dog meats. - gold_core_spawnable = FRIENDLY_SPAWN - collar_icon_state = "bullterrier" - held_state = "bullterrier" - -/mob/living/basic/pet/dog/corgi/exoticcorgi - name = "Exotic Corgi" - desc = "As cute as they are colorful!" - icon = 'icons/mob/simple/pets.dmi' - icon_state = "corgigrey" - icon_living = "corgigrey" - icon_dead = "corgigrey_dead" - nofur = TRUE - -/mob/living/basic/pet/dog/Initialize(mapload) - . = ..() - var/dog_area = get_area(src) - for(var/obj/structure/bed/dogbed/D in dog_area) - if(D.update_owner(src)) //No muscling in on my turf you fucking parrot - break - -/mob/living/basic/pet/dog/corgi/Initialize(mapload) - . = ..() - regenerate_icons() - AddElement(/datum/element/strippable, GLOB.strippable_corgi_items) - AddElement(/datum/element/swabable, CELL_LINE_TABLE_CORGI, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - RegisterSignal(src, COMSIG_MOB_TRIED_ACCESS, PROC_REF(on_tried_access)) - -/** - * Handler for COMSIG_MOB_TRIED_ACCESS - */ -/mob/living/basic/pet/dog/corgi/proc/on_tried_access(mob/accessor, obj/locked_thing) - SIGNAL_HANDLER - - return locked_thing?.check_access(access_card) ? ACCESS_ALLOWED : ACCESS_DISALLOWED - -/mob/living/basic/pet/dog/corgi/exoticcorgi/Initialize(mapload) - . = ..() - var/newcolor = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) - add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY) - -/mob/living/basic/pet/dog/corgi/death(gibbed) - ..(gibbed) - regenerate_icons() - -GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list( - /datum/strippable_item/corgi_head, - /datum/strippable_item/corgi_back, - /datum/strippable_item/pet_collar, - /datum/strippable_item/corgi_id, -))) - -/datum/strippable_item/corgi_head - key = STRIPPABLE_ITEM_HEAD - -/datum/strippable_item/corgi_head/get_item(atom/source) - var/mob/living/basic/pet/dog/corgi/corgi_source = source - if (!istype(corgi_source)) - return - - return corgi_source.inventory_head - -/datum/strippable_item/corgi_head/finish_equip(atom/source, obj/item/equipping, mob/user) - var/mob/living/basic/pet/dog/corgi/corgi_source = source - if (!istype(corgi_source)) - return - - corgi_source.place_on_head(equipping, user) - -/datum/strippable_item/corgi_head/finish_unequip(atom/source, mob/user) - var/mob/living/basic/pet/dog/corgi/corgi_source = source - if (!istype(corgi_source)) - return - - user.put_in_hands(corgi_source.inventory_head) - corgi_source.inventory_head = null - corgi_source.update_corgi_fluff() - corgi_source.regenerate_icons() - -/datum/strippable_item/pet_collar - key = STRIPPABLE_ITEM_PET_COLLAR - -/datum/strippable_item/pet_collar/get_item(atom/source) - var/mob/living/basic/pet/pet_source = source - if (!istype(pet_source)) - return - - return pet_source.collar - -/datum/strippable_item/pet_collar/try_equip(atom/source, obj/item/equipping, mob/user) - . = ..() - if (!.) - return FALSE - - if (!istype(equipping, /obj/item/clothing/neck/petcollar)) - to_chat(user, span_warning("That's not a collar.")) - return FALSE - - return TRUE - -/datum/strippable_item/pet_collar/finish_equip(atom/source, obj/item/equipping, mob/user) - var/mob/living/basic/pet/pet_source = source - if (!istype(pet_source)) - return - - pet_source.add_collar(equipping, user) - -/datum/strippable_item/pet_collar/finish_unequip(atom/source, mob/user) - var/mob/living/basic/pet/pet_source = source - if (!istype(pet_source)) - return - - var/obj/collar = pet_source.remove_collar(user.drop_location()) - user.put_in_hands(collar) - -/datum/strippable_item/corgi_back - key = STRIPPABLE_ITEM_BACK - -/datum/strippable_item/corgi_back/get_item(atom/source) - var/mob/living/basic/pet/dog/corgi/corgi_source = source - if (!istype(corgi_source)) - return - - return corgi_source.inventory_back - -/datum/strippable_item/corgi_back/try_equip(atom/source, obj/item/equipping, mob/user) - . = ..() - if (!.) - return FALSE - - if (!ispath(equipping.dog_fashion, /datum/dog_fashion/back)) - to_chat(user, span_warning("You set [equipping] on [source]'s back, but it falls off!")) - equipping.forceMove(source.drop_location()) - if (prob(25)) - step_rand(equipping) - dance_rotate(source, set_original_dir = TRUE) - - return FALSE - - return TRUE - -/datum/strippable_item/corgi_back/finish_equip(atom/source, obj/item/equipping, mob/user) - var/mob/living/basic/pet/dog/corgi/corgi_source = source - if (!istype(corgi_source)) - return - - equipping.forceMove(corgi_source) - corgi_source.inventory_back = equipping - corgi_source.update_corgi_fluff() - corgi_source.regenerate_icons() - -/datum/strippable_item/corgi_back/finish_unequip(atom/source, mob/user) - var/mob/living/basic/pet/dog/corgi/corgi_source = source - if (!istype(corgi_source)) - return - - user.put_in_hands(corgi_source.inventory_back) - corgi_source.inventory_back = null - corgi_source.update_corgi_fluff() - corgi_source.regenerate_icons() - -/datum/strippable_item/corgi_id - key = STRIPPABLE_ITEM_ID - -/datum/strippable_item/corgi_id/get_item(atom/source) - var/mob/living/basic/pet/dog/corgi/corgi_source = source - if (!istype(corgi_source)) - return - - return corgi_source.access_card - -/datum/strippable_item/corgi_id/try_equip(atom/source, obj/item/equipping, mob/user) - . = ..() - if (!.) - return FALSE - - if (!isidcard(equipping)) - to_chat(user, span_warning("You can't pin [equipping] to [source]!")) - return FALSE - - return TRUE - -/datum/strippable_item/corgi_id/finish_equip(atom/source, obj/item/equipping, mob/user) - var/mob/living/basic/pet/dog/corgi/corgi_source = source - if (!istype(corgi_source)) - return - - equipping.forceMove(source) - corgi_source.access_card = equipping - -/datum/strippable_item/corgi_id/finish_unequip(atom/source, mob/user) - var/mob/living/basic/pet/dog/corgi/corgi_source = source - if (!istype(corgi_source)) - return - - user.put_in_hands(corgi_source.access_card) - corgi_source.access_card = null - corgi_source.update_corgi_fluff() - corgi_source.regenerate_icons() - -/mob/living/basic/pet/dog/corgi/getarmor(def_zone, type) - var/armorval = 0 - - if(def_zone) - if(def_zone == BODY_ZONE_HEAD) - if(inventory_head) - armorval = inventory_head.get_armor_rating(type) - else - if(inventory_back) - armorval = inventory_back.get_armor_rating(type) - return armorval - else - if(inventory_head) - armorval += inventory_head.get_armor_rating(type) - if(inventory_back) - armorval += inventory_back.get_armor_rating(type) - return armorval*0.5 - -/mob/living/basic/pet/dog/corgi/attackby(obj/item/O, mob/user, params) - if (istype(O, /obj/item/razor)) - if (shaved) - to_chat(user, span_warning("You can't shave this corgi, [p_they()] has already been shaved!")) - return - if (nofur) - to_chat(user, span_warning("You can't shave this corgi, [p_they()] [p_do()]n't have a fur coat!")) - return - user.visible_message(span_notice("[user] starts to shave [src] using \the [O]."), span_notice("You start to shave [src] using \the [O]...")) - if(do_after(user, 50, target = src)) - user.visible_message(span_notice("[user] shaves [src]'s hair using \the [O].")) - playsound(loc, 'sound/items/welder2.ogg', 20, TRUE) - shaved = TRUE - icon_living = "[initial(icon_living)]_shaved" - icon_dead = "[initial(icon_living)]_shaved_dead" - if(stat == CONSCIOUS) - icon_state = icon_living - else - icon_state = icon_dead - return - ..() - update_corgi_fluff() - -//Corgis are supposed to be simpler, so only a select few objects can actually be put -//to be compatible with them. The objects are below. -//Many hats added, Some will probably be removed, just want to see which ones are popular. -// > some will probably be removed - -/mob/living/basic/pet/dog/corgi/proc/place_on_head(obj/item/item_to_add, mob/living/user) - if(inventory_head) - if(user) - to_chat(user, span_warning("You can't put more than one hat on [src]!")) - 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 - user.add_mood_event(REF(src), /datum/mood_event/pet_animal, src) - return - - if(user && !user.temporarilyRemoveItemFromInventory(item_to_add)) - to_chat(user, span_warning("\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!")) - return - - var/valid = FALSE - if(ispath(item_to_add.dog_fashion, /datum/dog_fashion/head)) - valid = TRUE - - //Various hats and items (worn on his head) change Ian's behaviour. His attributes are reset when a hat is removed. - - if(valid) - if(health <= 0) - to_chat(user, span_notice("There is merely a dull, lifeless look in [real_name]'s eyes as you put the [item_to_add] on [p_them()].")) - else if(user) - user.visible_message(span_notice("[user] puts [item_to_add] on [real_name]'s head. [src] looks at [user] and barks once."), - span_notice("You put [item_to_add] on [real_name]'s head. [src] gives you a peculiar look, then wags [p_their()] tail once and barks."), - span_hear("You hear a friendly-sounding bark.")) - item_to_add.forceMove(src) - src.inventory_head = item_to_add - update_corgi_fluff() - regenerate_icons() - else - to_chat(user, span_warning("You set [item_to_add] on [src]'s head, but it falls off!")) - item_to_add.forceMove(drop_location()) - if(prob(25)) - step_rand(item_to_add) - dance_rotate(src, set_original_dir=TRUE) - - return valid - -/mob/living/basic/pet/dog/corgi/proc/update_corgi_fluff() - // First, change back to defaults - name = real_name - desc = initial(desc) - // BYOND/DM doesn't support the use of initial on lists. - speak_emote = list("barks", "woofs") - desc = initial(desc) - set_light(0) - - if(inventory_head?.dog_fashion) - var/datum/dog_fashion/DF = new inventory_head.dog_fashion(src) - DF.apply(src) - - if(inventory_back?.dog_fashion) - var/datum/dog_fashion/DF = new inventory_back.dog_fashion(src) - DF.apply(src) - -/mob/living/basic/pet/dog/corgi/update_dog_speech(datum/ai_planning_subtree/random_speech/speech) - ..() - - if(inventory_head?.dog_fashion) - var/datum/dog_fashion/DF = new inventory_head.dog_fashion(src) - DF.apply_to_speech(speech) - - if(inventory_back?.dog_fashion) - var/datum/dog_fashion/DF = new inventory_back.dog_fashion(src) - DF.apply_to_speech(speech) - -//IAN! SQUEEEEEEEEE~ -/mob/living/basic/pet/dog/corgi/ian - name = "Ian" - real_name = "Ian" //Intended to hold the name without altering it. - gender = MALE - desc = "He's the HoP's beloved corgi." - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "bops" - response_disarm_simple = "bop" - response_harm_continuous = "kicks" - response_harm_simple = "kick" - gold_core_spawnable = NO_SPAWN - unique_pet = TRUE - var/age = 0 - var/record_age = 1 - var/memory_saved = FALSE - var/saved_head //path - -/mob/living/basic/pet/dog/corgi/ian/Initialize(mapload) - . = ..() - // Ensure Ian exists - REGISTER_REQUIRED_MAP_ITEM(1, 1) - - //parent call must happen first to ensure IAN - //is not in nullspace when child puppies spawn - Read_Memory() - if(age == 0) - var/turf/target = get_turf(loc) - if(target) - new /mob/living/basic/pet/dog/corgi/puppy/ian(target) - Write_Memory(FALSE) - return INITIALIZE_HINT_QDEL - else if(age == record_age) - icon_state = "old_corgi" - icon_living = "old_corgi" - held_state = "old_corgi" - icon_dead = "old_corgi_dead" - desc = "At a ripe old age of [record_age], Ian's not as spry as he used to be, but he'll always be the HoP's beloved corgi." //RIP - ai_controller?.set_blackboard_key(BB_DOG_IS_SLOW, TRUE) - is_slow = TRUE - speed = 2 - -/mob/living/basic/pet/dog/corgi/ian/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved) - Write_Memory(FALSE) - memory_saved = TRUE - ..() - -/mob/living/basic/pet/dog/corgi/ian/death() - if(!memory_saved) - Write_Memory(TRUE) - ..() - -/mob/living/basic/pet/dog/corgi/ian/proc/Read_Memory() - if(fexists("data/npc_saves/Ian.sav")) //legacy compatability to convert old format to new - var/savefile/S = new /savefile("data/npc_saves/Ian.sav") - S["age"] >> age - S["record_age"] >> record_age - S["saved_head"] >> saved_head - fdel("data/npc_saves/Ian.sav") - else - var/json_file = file("data/npc_saves/Ian.json") - if(!fexists(json_file)) - return - var/list/json = json_decode(file2text(json_file)) - age = json["age"] - record_age = json["record_age"] - saved_head = json["saved_head"] - if(isnull(age)) - age = 0 - if(isnull(record_age)) - record_age = 1 - if(saved_head) - place_on_head(new saved_head) - -/mob/living/basic/pet/dog/corgi/ian/Write_Memory(dead, gibbed) - . = ..() - if(!.) - return - var/json_file = file("data/npc_saves/Ian.json") - var/list/file_data = list() - if(!dead) - file_data["age"] = age + 1 - if((age + 1) > record_age) - file_data["record_age"] = record_age + 1 - else - file_data["record_age"] = record_age - if(inventory_head) - file_data["saved_head"] = inventory_head.type - else - file_data["saved_head"] = null - else - file_data["age"] = 0 - file_data["record_age"] = record_age - file_data["saved_head"] = null - fdel(json_file) - WRITE_FILE(json_file, json_encode(file_data)) - -/mob/living/basic/pet/dog/corgi/ian/narsie_act() - playsound(src, 'sound/magic/demon_dies.ogg', 75, TRUE) - var/mob/living/basic/pet/dog/corgi/narsie/N = new(loc) - N.setDir(dir) - investigate_log("has been gibbed by Nar'Sie.", INVESTIGATE_DEATHS) - gib() - -/mob/living/basic/pet/dog/corgi/narsie - name = "Nars-Ian" - desc = "Ia! Ia!" - icon_state = "narsian" - icon_living = "narsian" - icon_dead = "narsian_dead" - faction = list(FACTION_NEUTRAL, FACTION_CULT) - gold_core_spawnable = NO_SPAWN - nofur = TRUE - unique_pet = TRUE - held_state = "narsian" - -/mob/living/basic/pet/dog/corgi/narsie/Life(seconds_per_tick = SSMOBS_DT, times_fired) - ..() - for(var/mob/living/simple_animal/pet/P in range(1, src)) - if(P != src && !istype(P,/mob/living/basic/pet/dog/corgi/narsie)) - visible_message(span_warning("[src] devours [P]!"), \ - "DELICIOUS SOULS") - playsound(src, 'sound/magic/demon_attack1.ogg', 75, TRUE) - narsie_act() - P.gib() - for(var/mob/living/basic/pet/P in range(1, src)) - if(P != src && !istype(P,/mob/living/basic/pet/dog/corgi/narsie)) - visible_message(span_warning("[src] devours [P]!"), \ - "DELICIOUS SOULS") - playsound(src, 'sound/magic/demon_attack1.ogg', 75, TRUE) - narsie_act() - P.investigate_log("has been gibbed by [src].", INVESTIGATE_DEATHS) - P.gib() - -/mob/living/basic/pet/dog/corgi/narsie/update_corgi_fluff() - ..() - speak_emote = list("growls", "barks ominously") - -/mob/living/basic/pet/dog/corgi/narsie/update_dog_speech(datum/ai_planning_subtree/random_speech/speech) - speech.speak = string_list(list("Tari'karat-pasnar!", "IA! IA!", "BRRUUURGHGHRHR")) - speech.emote_hear = string_list(list("barks echoingly!", "woofs hauntingly!", "yaps in an eldritch manner.", "mutters something unspeakable.")) - speech.emote_see = string_list(list("communes with the unnameable.", "ponders devouring some souls.", "shakes.")) - -/mob/living/basic/pet/dog/corgi/narsie/narsie_act() - adjustBruteLoss(-maxHealth) - - -/mob/living/basic/pet/dog/corgi/regenerate_icons() - ..() - cut_overlays() //we are redrawing the mob after all - if(inventory_head) - var/image/head_icon - var/datum/dog_fashion/DF = new inventory_head.dog_fashion(src) - - if(!DF.obj_icon_state) - DF.obj_icon_state = inventory_head.icon_state - if(!DF.obj_alpha) - DF.obj_alpha = inventory_head.alpha - if(!DF.obj_color) - DF.obj_color = inventory_head.color - - if(health <= 0) - head_icon = DF.get_overlay(dir = EAST) - head_icon.pixel_y = -8 - head_icon.transform = turn(head_icon.transform, 180) - else - head_icon = DF.get_overlay() - - add_overlay(head_icon) - - if(inventory_back) - var/image/back_icon - var/datum/dog_fashion/DF = new inventory_back.dog_fashion(src) - - if(!DF.obj_icon_state) - DF.obj_icon_state = inventory_back.icon_state - if(!DF.obj_alpha) - DF.obj_alpha = inventory_back.alpha - if(!DF.obj_color) - DF.obj_color = inventory_back.color - - if(health <= 0) - back_icon = DF.get_overlay(dir = EAST) - back_icon.pixel_y = -11 - back_icon.transform = turn(back_icon.transform, 180) - else - back_icon = DF.get_overlay() - add_overlay(back_icon) - - return - - - -/mob/living/basic/pet/dog/corgi/puppy - name = "\improper corgi puppy" - real_name = "corgi" - desc = "They're a corgi puppy!" - icon_state = "puppy" - icon_living = "puppy" - icon_dead = "puppy_dead" - density = FALSE - pass_flags = PASSMOB - mob_size = MOB_SIZE_SMALL - collar_icon_state = "puppy" - -//puppies cannot wear anything. -/mob/living/basic/pet/dog/corgi/puppy/Topic(href, href_list) - if(href_list["remove_inv"] || href_list["add_inv"]) - to_chat(usr, span_warning("You can't fit this on [src], [p_they()] [p_are()] too small!")) - return - ..() - -//PUPPY IAN! SQUEEEEEEEEE~ -/mob/living/basic/pet/dog/corgi/puppy/ian - name = "Ian" - real_name = "Ian" - gender = MALE - desc = "He's the HoP's beloved corgi puppy." - - -/mob/living/basic/pet/dog/corgi/puppy/void //Tribute to the corgis born in nullspace - name = "\improper void puppy" - real_name = "voidy" - desc = "A corgi puppy that has been infused with deep space energy. It's staring back..." - gender = NEUTER - icon_state = "void_puppy" - icon_living = "void_puppy" - icon_dead = "void_puppy_dead" - nofur = TRUE - held_state = "void_puppy" - unsuitable_atmos_damage = 0 - minimum_survivable_temperature = TCMB - maximum_survivable_temperature = T0C + 40 - -/mob/living/basic/pet/dog/corgi/puppy/void/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_AI_BAGATTACK, INNATE_TRAIT) - -/mob/living/basic/pet/dog/corgi/puppy/void/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) - return 1 //Void puppies can navigate space. - -//LISA! SQUEEEEEEEEE~ -/mob/living/basic/pet/dog/corgi/lisa - name = "Lisa" - real_name = "Lisa" - gender = FEMALE - desc = "She's tearing you apart." - gold_core_spawnable = NO_SPAWN - unique_pet = TRUE - icon_state = "lisa" - icon_living = "lisa" - icon_dead = "lisa_dead" - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "bops" - response_disarm_simple = "bop" - response_harm_continuous = "kicks" - response_harm_simple = "kick" - held_state = "lisa" - var/puppies = 0 - -//Lisa already has a cute bow! -/mob/living/basic/pet/dog/corgi/lisa/Topic(href, href_list) - if(href_list["remove_inv"] || href_list["add_inv"]) - to_chat(usr, span_warning("[src] already has a cute bow!")) - return - ..() - -/mob/living/basic/pet/dog/breaddog //Most of the code originates from Cak - name = "Kobun" - desc = "It is a dog made out of bread. 'The universe is definitely half full'." - icon_state = "breaddog" - icon_living = "breaddog" - icon_dead = "breaddog_dead" - head_icon = 'icons/mob/clothing/head/pets_head.dmi' - health = 50 - maxHealth = 50 - gender = NEUTER - damage_coeff = list(BRUTE = 3, BURN = 3, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) - butcher_results = list(/obj/item/organ/internal/brain = 1, /obj/item/organ/internal/heart = 1, /obj/item/food/breadslice/plain = 3, \ - /obj/item/food/meat/slab = 2) - response_harm_continuous = "takes a bite out of" - response_harm_simple = "take a bite out of" - attacked_sound = 'sound/items/eatfood.ogg' - held_state = "breaddog" - worn_slot_flags = ITEM_SLOT_HEAD - -/mob/living/basic/pet/dog/breaddog/CheckParts(list/parts) - ..() - var/obj/item/organ/internal/brain/candidate = locate(/obj/item/organ/internal/brain) in contents - if(!candidate || !candidate.brainmob || !candidate.brainmob.mind) - return - candidate.brainmob.mind.transfer_to(src) - to_chat(src, "[span_boldbig("You are a bread dog!")] You're a harmless dog/bread hybrid that everyone loves. People can take bites out of you if they're hungry, but you regenerate health \ - so quickly that it generally doesn't matter. You're remarkably resilient to any damage besides this and it's hard for you to really die at all. You should go around and bring happiness and \ - free bread to the station! 'I’m not alone, and you aren’t either'") - var/default_name = "Kobun" - var/new_name = sanitize_name(reject_bad_text(tgui_input_text(src, "You are the [name]. Would you like to change your name to something else?", "Name change", default_name, MAX_NAME_LEN)), cap_after_symbols = FALSE) - if(new_name) - to_chat(src, span_notice("Your name is now [new_name]!")) - name = new_name - -/mob/living/basic/pet/dog/breaddog/Life(seconds_per_tick = SSMOBS_DT, times_fired) - ..() - if(stat) - return - - if(health < maxHealth) - adjustBruteLoss(-4 * seconds_per_tick) //Fast life regen - - for(var/mob/living/carbon/humanoid_entities in view(3, src)) //Mood aura which stay as long you do not wear Sanallite as hat or carry(I will try to make it work with hat someday(obviously weaker than normal one)) - humanoid_entities.add_mood_event("kobun", /datum/mood_event/kobun) - -/mob/living/basic/pet/dog/breaddog/attack_hand(mob/living/user, list/modifiers) - ..() - if(user.combat_mode && user.reagents && !stat) - user.reagents.add_reagent(/datum/reagent/consumable/nutriment, 0.4) - user.reagents.add_reagent(/datum/reagent/consumable/nutriment/vitamin, 0.4) - -/// A dog bone fully heals a dog, and befriends it if it's not your friend. -/obj/item/dog_bone - name = "jumbo dog bone" - desc = "A tasty femur full of juicy marrow, the perfect gift for your best friend." - w_class = WEIGHT_CLASS_SMALL - icon = 'icons/obj/food/meat.dmi' - icon_state = "skeletonmeat" - custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 4) - force = 3 - throwforce = 5 - attack_verb_continuous = list("attacks", "bashes", "batters", "bludgeons", "whacks") - attack_verb_simple = list("attack", "bash", "batter", "bludgeon", "whack") - -/obj/item/dog_bone/pre_attack(atom/target, mob/living/user, params) - if (!isdog(target) || user.combat_mode) - return ..() - var/mob/living/basic/pet/dog/dog_target = target - if (dog_target.stat != CONSCIOUS) - return ..() - dog_target.emote("spin") - dog_target.fully_heal() - if (dog_target.befriend(user)) - dog_target.tamed(user) - new /obj/effect/temp_visual/heart(target.loc) - qdel(src) - return TRUE diff --git a/code/modules/mob/living/basic/pets/dog/_dog.dm b/code/modules/mob/living/basic/pets/dog/_dog.dm new file mode 100644 index 0000000000000..dd3b3b3a4634c --- /dev/null +++ b/code/modules/mob/living/basic/pets/dog/_dog.dm @@ -0,0 +1,95 @@ +// Add 'walkies' as valid input +/datum/pet_command/follow/dog + speech_commands = list("heel", "follow", "walkies") + +// Add 'good dog' as valid input +/datum/pet_command/good_boy/dog + speech_commands = list("good dog") + +// Set correct attack behaviour +/datum/pet_command/point_targetting/attack/dog + attack_behaviour = /datum/ai_behavior/basic_melee_attack/dog + +/datum/pet_command/point_targetting/attack/dog/set_command_active(mob/living/parent, mob/living/commander) + . = ..() + parent.ai_controller.set_blackboard_key(BB_DOG_HARASS_HARM, TRUE) + +//Dogs. + +/mob/living/basic/pet/dog + mob_biotypes = MOB_ORGANIC|MOB_BEAST + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "bops" + response_disarm_simple = "bop" + response_harm_continuous = "kicks" + response_harm_simple = "kick" + speak_emote = list("barks", "woofs") + faction = list(FACTION_NEUTRAL) + can_be_held = TRUE + ai_controller = /datum/ai_controller/basic_controller/dog + // The dog attack pet command can raise melee attack above 0 + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + attack_sound = 'sound/weapons/bite.ogg' + attack_vis_effect = ATTACK_EFFECT_BITE + melee_attack_cooldown = 0.8 SECONDS + /// Instructions you can give to dogs + var/static/list/pet_commands = list( + /datum/pet_command/idle, + /datum/pet_command/free, + /datum/pet_command/good_boy/dog, + /datum/pet_command/follow/dog, + /datum/pet_command/point_targetting/attack/dog, + /datum/pet_command/point_targetting/fetch, + /datum/pet_command/play_dead, + ) + +/mob/living/basic/pet/dog/Initialize(mapload) + . = ..() + AddElement(/datum/element/pet_bonus, "woofs happily!") + AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW) + AddElement(/datum/element/unfriend_attacker, untamed_reaction = "%SOURCE% fixes %TARGET% with a look of betrayal.") + AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/meat/slab/human/mutant/skeleton, /obj/item/stack/sheet/bone), tame_chance = 30, bonus_tame_chance = 15, after_tame = CALLBACK(src, PROC_REF(tamed)), unique = FALSE) + AddComponent(/datum/component/obeys_commands, pet_commands) + var/dog_area = get_area(src) + for(var/obj/structure/bed/dogbed/dog_bed in dog_area) + if(dog_bed.update_owner(src)) //No muscling in on my turf you fucking parrot + break + +///Updates dog speech and emotes +/mob/living/basic/pet/dog/proc/update_dog_speech(datum/ai_planning_subtree/random_speech/speech) + speech.speak = string_list(list("YAP", "Woof!", "Bark!", "AUUUUUU")) + speech.emote_hear = string_list(list("barks!", "woofs!", "yaps.","pants.")) + speech.emote_see = string_list(list("shakes [p_their()] head.", "chases [p_their()] tail.","shivers.")) + +///Proc to run on a successful taming attempt +/mob/living/basic/pet/dog/proc/tamed(mob/living/tamer) + visible_message(span_notice("[src] licks at [tamer] in a friendly manner!")) + +/// A dog bone fully heals a dog, and befriends it if it's not your friend. +/obj/item/dog_bone + name = "jumbo dog bone" + desc = "A tasty femur full of juicy marrow, the perfect gift for your best friend." + w_class = WEIGHT_CLASS_SMALL + icon = 'icons/obj/food/meat.dmi' + icon_state = "skeletonmeat" + custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 4) + force = 3 + throwforce = 5 + attack_verb_continuous = list("attacks", "bashes", "batters", "bludgeons", "whacks") + attack_verb_simple = list("attack", "bash", "batter", "bludgeon", "whack") + +/obj/item/dog_bone/pre_attack(atom/target, mob/living/user, params) + if (!isdog(target) || user.combat_mode) + return ..() + var/mob/living/basic/pet/dog/dog_target = target + if (dog_target.stat != CONSCIOUS) + return ..() + dog_target.emote("spin") + dog_target.fully_heal() + if (dog_target.befriend(user)) + dog_target.tamed(user) + new /obj/effect/temp_visual/heart(target.loc) + qdel(src) + return TRUE diff --git a/code/modules/mob/living/basic/pets/dog/corgi.dm b/code/modules/mob/living/basic/pets/dog/corgi.dm new file mode 100644 index 0000000000000..9e120c4e8c038 --- /dev/null +++ b/code/modules/mob/living/basic/pets/dog/corgi.dm @@ -0,0 +1,563 @@ +//CORGIS! + +/mob/living/basic/pet/dog/corgi + name = "\improper corgi" + real_name = "corgi" + desc = "They're a corgi." + icon_state = "corgi" + icon_living = "corgi" + icon_dead = "corgi_dead" + held_state = "corgi" + butcher_results = list(/obj/item/food/meat/slab/corgi = 3, /obj/item/stack/sheet/animalhide/corgi = 1) + gold_core_spawnable = FRIENDLY_SPAWN + collar_icon_state = "corgi" + ai_controller = /datum/ai_controller/basic_controller/dog/corgi + ///Access card for the corgi. + var/obj/item/card/id/access_card = null + ///Can this corgi be shaved by an electric razor? + var/can_be_shaved = TRUE + ///Did this corgi get mutilated and has had their fur shaved by an electric razor, oh the humanity? + var/shaved = FALSE + ///Currently worn item on the head slot + var/obj/item/inventory_head = null + ///Currently worn item on the back slot + var/obj/item/inventory_back = null + ///Is this corgi physically slow due to age, etc? + var/is_slow = FALSE + ///Item slots that are available for this corgi to equip stuff into + var/list/strippable_inventory_slots = list() + +/mob/living/basic/pet/dog/corgi/Initialize(mapload) + . = ..() + update_appearance() + AddElement(/datum/element/strippable, length(strippable_inventory_slots) ? create_strippable_list(strippable_inventory_slots) : GLOB.strippable_corgi_items) + AddElement(/datum/element/swabable, CELL_LINE_TABLE_CORGI, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) + RegisterSignal(src, COMSIG_MOB_TRIED_ACCESS, PROC_REF(on_tried_access)) + RegisterSignals(src, list(COMSIG_BASICMOB_LOOK_ALIVE, COMSIG_BASICMOB_LOOK_DEAD), PROC_REF(on_appearance_change)) + +/mob/living/basic/pet/dog/corgi/Destroy() + QDEL_NULL(inventory_head) + QDEL_NULL(inventory_back) + QDEL_NULL(access_card) + UnregisterSignal(src, list(COMSIG_BASICMOB_LOOK_ALIVE, COMSIG_BASICMOB_LOOK_DEAD)) + return ..() + +/mob/living/basic/pet/dog/corgi/Exited(atom/movable/gone, direction) + . = ..() + var/dropped_something = FALSE + if(gone == inventory_head) + dropped_something = TRUE + inventory_head = null + if(gone == inventory_back) + dropped_something = TRUE + inventory_back = null + if(dropped_something) + update_corgi_fluff() + update_appearance(UPDATE_OVERLAYS) + +/mob/living/basic/pet/dog/corgi/gib() + undress_dog() + if(access_card) + access_card.forceMove(drop_location()) + access_card = null + return ..() + +/// Removes the hat and shirt (but not ID) of this corgi +/mob/living/basic/pet/dog/corgi/proc/undress_dog() + inventory_head?.forceMove(drop_location()) + inventory_back?.forceMove(drop_location()) + +/mob/living/basic/pet/dog/corgi/examine(mob/user) + . = ..() + if(access_card) + . += "There appears to be [icon2html(access_card, user)] \a [access_card] pinned to [p_them()]." + +/** + * Corgis get full protection from their equipped fashion items if attacked in a way that passes def_zone, + * which usually means any direct attack like melee or gunshot. Anything abstract like a bomb or acid or something + * will instead give half the armor value. + */ +/mob/living/basic/pet/dog/corgi/getarmor(def_zone, type) + var/armorval = 0 + + if(def_zone) + if(def_zone == BODY_ZONE_HEAD) + if(inventory_head) + armorval = inventory_head.get_armor_rating(type) + else + if(inventory_back) + armorval = inventory_back.get_armor_rating(type) + return armorval + else + if(inventory_head) + armorval += inventory_head.get_armor_rating(type) + if(inventory_back) + armorval += inventory_back.get_armor_rating(type) + return armorval * 0.5 + +/mob/living/basic/pet/dog/corgi/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/razor)) + if(shaved) + to_chat(user, span_warning("You can't shave this corgi, [p_they()] has already been shaved!")) + return + if(!can_be_shaved) + to_chat(user, span_warning("You can't shave this corgi, [p_they()] [p_do()]n't have a fur coat!")) + return + user.visible_message(span_notice("[user] starts to shave [src] using \the [attacking_item]."), span_notice("You start to shave [src] using \the [attacking_item]...")) + if(do_after(user, 5 SECONDS, target = src)) + user.visible_message(span_notice("[user] shaves [src]'s hair using \the [attacking_item].")) + playsound(get_turf(src), 'sound/items/welder2.ogg', 20, TRUE) + shaved = TRUE + icon_living = "[icon_living]_shaved" + icon_dead = "[icon_living]_shaved_dead" + if(stat == CONSCIOUS) + icon_state = icon_living + else + icon_state = icon_dead + return TRUE + + return ..() + +/mob/living/basic/pet/dog/corgi/update_dog_speech(datum/ai_planning_subtree/random_speech/speech) + . = ..() + + if(inventory_head?.dog_fashion) + var/datum/dog_fashion/equipped_head_fashion_item = new inventory_head.dog_fashion(src) + equipped_head_fashion_item.apply_to_speech(speech) + + if(inventory_back?.dog_fashion) + var/datum/dog_fashion/equipped_back_fashion_item = new inventory_back.dog_fashion(src) + equipped_back_fashion_item.apply_to_speech(speech) + +/mob/living/basic/pet/dog/corgi/deadchat_plays(mode = ANARCHY_MODE, cooldown = 12 SECONDS) + . = AddComponent(/datum/component/deadchat_control/cardinal_movement, mode, list( + "speak" = CALLBACK(src, PROC_REF(bork)), + "wear_hat" = CALLBACK(src, PROC_REF(find_new_hat)), + "drop_hat" = CALLBACK(src, PROC_REF(drop_hat)), + "spin" = CALLBACK(src, TYPE_PROC_REF(/mob, emote), "spin")), cooldown, CALLBACK(src, PROC_REF(stop_deadchat_plays))) + + if(. == COMPONENT_INCOMPATIBLE) + return + + // Stop all automated behavior. + QDEL_NULL(ai_controller) + +/mob/living/basic/pet/dog/corgi/update_overlays() + . = ..() + if(inventory_head) + var/image/head_icon + var/datum/dog_fashion/equipped_head_fashion_item = new inventory_head.dog_fashion(src) + + if(!equipped_head_fashion_item.obj_icon_state) + equipped_head_fashion_item.obj_icon_state = inventory_head.icon_state + if(!equipped_head_fashion_item.obj_alpha) + equipped_head_fashion_item.obj_alpha = inventory_head.alpha + if(!equipped_head_fashion_item.obj_color) + equipped_head_fashion_item.obj_color = inventory_head.color + + if(stat == DEAD || HAS_TRAIT(src, TRAIT_FAKEDEATH)) + head_icon = equipped_head_fashion_item.get_overlay(dir = EAST) + head_icon.pixel_y = -8 + head_icon.transform = head_icon.transform.Turn(180) + else + head_icon = equipped_head_fashion_item.get_overlay() + + . += head_icon + + if(inventory_back) + var/image/back_icon + var/datum/dog_fashion/equipped_back_fashion_item = new inventory_back.dog_fashion(src) + + if(!equipped_back_fashion_item.obj_icon_state) + equipped_back_fashion_item.obj_icon_state = inventory_back.icon_state + if(!equipped_back_fashion_item.obj_alpha) + equipped_back_fashion_item.obj_alpha = inventory_back.alpha + if(!equipped_back_fashion_item.obj_color) + equipped_back_fashion_item.obj_color = inventory_back.color + + if(stat == DEAD || HAS_TRAIT(src, TRAIT_FAKEDEATH)) + back_icon = equipped_back_fashion_item.get_overlay(dir = EAST) + back_icon.pixel_y = -11 + back_icon.transform = back_icon.transform.Turn(180) + else + back_icon = equipped_back_fashion_item.get_overlay() + + . += back_icon + +//Corgis are supposed to be simpler, so only a select few objects can actually be put +//to be compatible with them. The objects are below. +//Many hats added, Some will probably be removed, just want to see which ones are popular. +// > some will probably be removed + +/** + * Places an item on the corgi's head, handling updating the corgi's appearance and the item's dog fashion modifiers + * to the name, description, speech etc. Doesn't need the user to complete, and is also used in station traits/events/persistence reading. +*/ +/mob/living/basic/pet/dog/corgi/proc/place_on_head(obj/item/item_to_add, mob/living/user) + if(inventory_head) + if(user) + balloon_alert(user, "already wearing a hat!") + return FALSE + + if(isnull(item_to_add)) + if (!isnull(user)) + 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 + user.add_mood_event(REF(src), /datum/mood_event/pet_animal, src) + return FALSE + + if(user && !user.temporarilyRemoveItemFromInventory(item_to_add)) + to_chat(user, span_warning("\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!")) + return FALSE + + //Various hats and items (worn on his head) change Ian's behaviour. His attributes are reset when a hat is removed. + if(!ispath(item_to_add.dog_fashion, /datum/dog_fashion/head)) + to_chat(user, span_warning("You set [item_to_add] on [src]'s head, but it falls off!")) + item_to_add.forceMove(drop_location()) + if(prob(25)) + step_rand(item_to_add) + dance_rotate(src, set_original_dir = TRUE) + return FALSE + + if (user) + if(stat == DEAD || HAS_TRAIT(src, TRAIT_FAKEDEATH)) + to_chat(user, span_notice("There is merely a dull, lifeless look in [real_name]'s eyes as you put \the [item_to_add] on [p_them()].")) + else + user.visible_message(span_notice("[user] puts [item_to_add] on [real_name]'s head. [src] looks at [user] and barks once."), + span_notice("You put [item_to_add] on [real_name]'s head. [src] gives you a peculiar look, then wags [p_their()] tail once and barks."), + span_hear("You hear a friendly-sounding bark.")) + item_to_add.forceMove(src) + inventory_head = item_to_add + update_corgi_fluff() + update_appearance(UPDATE_OVERLAYS) + return TRUE + +/mob/living/basic/pet/dog/corgi/proc/update_corgi_fluff() + // First, change back to defaults + name = real_name + desc = initial(desc) + // BYOND/DM doesn't support the use of initial on lists. + speak_emote = list("barks", "woofs") + desc = initial(desc) + set_light(0) + + if(inventory_head?.dog_fashion) + var/datum/dog_fashion/equipped_head_fashion_item = new inventory_head.dog_fashion(src) + equipped_head_fashion_item.apply(src) + + if(inventory_back?.dog_fashion) + var/datum/dog_fashion/equipped_back_fashion_item = new inventory_back.dog_fashion(src) + equipped_back_fashion_item.apply(src) + +///Handler for COMSIG_MOB_TRIED_ACCESS +/mob/living/basic/pet/dog/corgi/proc/on_tried_access(mob/accessor, obj/locked_thing) + SIGNAL_HANDLER + return locked_thing?.check_access(access_card) ? ACCESS_ALLOWED : ACCESS_DISALLOWED + +///Handles updating any existing overlays for the corgi (such as fashion items) when it changes how it appears, as in, dead or alive. +/mob/living/basic/pet/dog/corgi/proc/on_appearance_change() + SIGNAL_HANDLER + update_appearance(UPDATE_OVERLAYS) + +///Deadchat plays bark. +/mob/living/basic/pet/dog/corgi/proc/bork() + var/emote = pick("barks!", "woofs!", "yaps.", "pants.") + manual_emote(emote) + +///Deadchat plays command that picks a new hat for Ian. +/mob/living/basic/pet/dog/corgi/proc/find_new_hat() + if(!isturf(loc)) + return + var/list/possible_headwear = list() + for(var/obj/item/item in loc) + if(ispath(item.dog_fashion, /datum/dog_fashion/head)) + possible_headwear += item + if(!length(possible_headwear)) + for(var/obj/item/item in orange(1)) + if(ispath(item.dog_fashion, /datum/dog_fashion/head) && CanReach(item)) + possible_headwear += item + if(!length(possible_headwear)) + return + if(inventory_head) + inventory_head.forceMove(drop_location()) + inventory_head = null + place_on_head(pick(possible_headwear)) + visible_message(span_notice("[src] puts [inventory_head] on [p_their()] own head, somehow.")) + +///Deadchat plays command that drops the current hat off Ian. +/mob/living/basic/pet/dog/corgi/proc/drop_hat() + if(!inventory_head) + return + visible_message(span_notice("[src] vigorously shakes [p_their()] head, dropping [inventory_head] to the ground.")) + inventory_head.forceMove(drop_location()) + inventory_head = null + update_corgi_fluff() + update_appearance(UPDATE_OVERLAYS) + +///Turn AI back on. +/mob/living/basic/pet/dog/corgi/proc/stop_deadchat_plays() + var/controller_type = initial(ai_controller) + ai_controller = new controller_type(src) + ai_controller?.set_blackboard_key(BB_DOG_IS_SLOW, is_slow) + +//SUBTYPES! + +/mob/living/basic/pet/dog/corgi/exoticcorgi + name = "Exotic Corgi" + desc = "As cute as they are colorful!" + icon = 'icons/mob/simple/pets.dmi' + icon_state = "corgigrey" + icon_living = "corgigrey" + icon_dead = "corgigrey_dead" + can_be_shaved = FALSE + +/mob/living/basic/pet/dog/corgi/exoticcorgi/Initialize(mapload) + . = ..() + var/newcolor = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) + add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY) + +//IAN! SQUEEEEEEEEE~ +/mob/living/basic/pet/dog/corgi/ian + name = "Ian" + real_name = "Ian" //Intended to hold the name without altering it. + gender = MALE + desc = "He's the HoP's beloved corgi." + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "bops" + response_disarm_simple = "bop" + response_harm_continuous = "kicks" + response_harm_simple = "kick" + gold_core_spawnable = NO_SPAWN + unique_pet = TRUE + ///Tracks how many rounds did Ian survive from start to finish + var/age = 0 + ///Callback to execute upon roundend to check whether Ian has survived the round or not + var/datum/callback/i_will_survive + ///Highest achieved consecutive rounds that Ian survived from start to finish + var/record_age = 1 + ///Whether we have already recorded this Ian's achievements(survival and equipped hat) to the database + var/memory_saved = FALSE + ///Path of the item Ian was wearing in a previous shift, if he survived through it + var/saved_head = null + +/mob/living/basic/pet/dog/corgi/ian/Initialize(mapload) + . = ..() + // Ensure Ian exists + REGISTER_REQUIRED_MAP_ITEM(1, 1) + + //parent call must happen first to ensure IAN + //is not in nullspace when child puppies spawn + Read_Memory() + if(age == 0) + var/turf/target = get_turf(loc) + if(target) + new /mob/living/basic/pet/dog/corgi/puppy/ian(target) + Write_Memory(FALSE) + return INITIALIZE_HINT_QDEL + else if(age == record_age) + icon_state = "old_corgi" + icon_living = "old_corgi" + held_state = "old_corgi" + icon_dead = "old_corgi_dead" + desc = "At a ripe old age of [record_age], Ian's not as spry as he used to be, but he'll always be the HoP's beloved corgi." //RIP + ai_controller?.set_blackboard_key(BB_DOG_IS_SLOW, TRUE) + is_slow = TRUE + speed = 2 + + //setup roundend check for Ian's whereabouts + i_will_survive = CALLBACK(src, PROC_REF(check_ian_survival)) + SSticker.OnRoundend(i_will_survive) + +/mob/living/basic/pet/dog/corgi/ian/Destroy() + LAZYREMOVE(SSticker.round_end_events, i_will_survive) //cleanup the survival callback + i_will_survive = null + return ..() + +/mob/living/basic/pet/dog/corgi/ian/death() + if(!memory_saved) + Write_Memory(TRUE) + return ..() + +/mob/living/basic/pet/dog/corgi/ian/revive(full_heal_flags, excess_healing, force_grab_ghost) + . = ..() + if (!.) + return + if (!istype(inventory_head, /obj/item/clothing/glasses/eyepatch)) + inventory_head?.forceMove(drop_location()) + place_on_head(new /obj/item/clothing/glasses/eyepatch/medical) + +/mob/living/basic/pet/dog/corgi/ian/narsie_act() + playsound(src, 'sound/magic/demon_dies.ogg', 75, TRUE) + var/mob/living/basic/pet/dog/corgi/narsie/narsIan = new(loc) + narsIan.setDir(dir) + investigate_log("has been gibbed and replaced with Nars-Ian by Nar'Sie.", INVESTIGATE_DEATHS) + gib() + +/mob/living/basic/pet/dog/corgi/ian/Write_Memory(dead, gibbed) + . = ..() + if(!.) + return + memory_saved = TRUE + var/json_file = file("data/npc_saves/Ian.json") + var/list/file_data = list() + if(!dead) + file_data["age"] = age + 1 + if((age + 1) > record_age) + file_data["record_age"] = record_age + 1 + else + file_data["record_age"] = record_age + if(inventory_head) + file_data["saved_head"] = inventory_head.type + else + file_data["saved_head"] = null + else + file_data["age"] = 0 + file_data["record_age"] = record_age + file_data["saved_head"] = null + fdel(json_file) + WRITE_FILE(json_file, json_encode(file_data)) + +///Reads the database's persistence json file and applies age, record_age and saved_head to Ian. +/mob/living/basic/pet/dog/corgi/ian/proc/Read_Memory() + if(fexists("data/npc_saves/Ian.sav")) //legacy compatability to convert old format to new + var/savefile/S = new /savefile("data/npc_saves/Ian.sav") + S["age"] >> age + S["record_age"] >> record_age + S["saved_head"] >> saved_head + fdel("data/npc_saves/Ian.sav") + else + var/json_file = file("data/npc_saves/Ian.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + age = json["age"] + record_age = json["record_age"] + saved_head = json["saved_head"] + if(isnull(age)) + age = 0 + if(isnull(record_age)) + record_age = 1 + if(saved_head) + place_on_head(new saved_head) + +///Checks whether Ian has survived the round or not +/mob/living/basic/pet/dog/corgi/ian/proc/check_ian_survival() + if(!stat && !memory_saved) + Write_Memory(FALSE) + +//NARS-IAN! SQ-Q-QooEglor-r'EEn-nl-luEEEf-f-fth-h +/mob/living/basic/pet/dog/corgi/narsie + name = "Nars-Ian" + real_name = "Nars-Ian" + desc = "Ia! Ia!" + icon_state = "narsian" + icon_living = "narsian" + icon_dead = "narsian_dead" + faction = list(FACTION_NEUTRAL, FACTION_CULT) + speak_emote = list("growls", "barks ominously") + gold_core_spawnable = NO_SPAWN + can_be_shaved = FALSE + unique_pet = TRUE + held_state = "narsian" + /// Mobs we will consume in the name of Nar'Sie + var/static/list/edible_types = list(/mob/living/simple_animal/pet, /mob/living/basic/pet) + +/mob/living/basic/pet/dog/corgi/narsie/Initialize(mapload) + . = ..() + var/static/list/connections = list(COMSIG_ATOM_ENTERED = PROC_REF(on_prey_approached)) + AddComponent(/datum/component/connect_range, tracked = src, connections = connections, range = 1, works_in_containers = FALSE) + +/// Attempt to eat a pet we get near +/mob/living/basic/pet/dog/corgi/narsie/proc/on_prey_approached(atom/movable/dog, atom/movable/prey) + SIGNAL_HANDLER + if (!is_type_in_list(prey, edible_types) || istype(prey, type)) + return + visible_message(span_warning("Dark magic resonating from [src] devours [prey]!"), \ + "DELICIOUS SOULS") + playsound(src, 'sound/magic/demon_attack1.ogg', 75, TRUE) + new /obj/effect/temp_visual/cult/sac(get_turf(prey)) + narsie_act() + prey.investigate_log("has been sacrificed by [src].", INVESTIGATE_DEATHS) + if (isliving(prey)) + var/mob/living/living_sacrifice = prey + living_sacrifice.gib(DROP_ALL_REMAINS) + else + qdel(prey) + +/mob/living/basic/pet/dog/corgi/narsie/update_corgi_fluff() + . = ..() + speak_emote = list("growls", "barks ominously") + +/mob/living/basic/pet/dog/corgi/narsie/update_dog_speech(datum/ai_planning_subtree/random_speech/speech) + speech.speak = string_list(list("Tari'karat-pasnar!", "IA! IA!", "BRRUUURGHGHRHR")) + speech.emote_hear = string_list(list("barks echoingly!", "woofs hauntingly!", "yaps in an eldritch manner.", "mutters something unspeakable.")) + speech.emote_see = string_list(list("communes with the unnameable.", "ponders devouring some souls.", "shakes.")) + +/mob/living/basic/pet/dog/corgi/narsie/narsie_act() + if(stat == DEAD) //Nar'Sie loves her doggy + visible_message(span_warning("[src] arises again, revived by the dark magicks!"), \ + span_cultlarge("RISE")) + revive(ADMIN_HEAL_ALL) //also means that a dead Nars-Ian can consume a pet and revive + adjustBruteLoss(-maxHealth) + +//LISA! SQUEEEEEEEEE~ +/mob/living/basic/pet/dog/corgi/lisa + name = "Lisa" + real_name = "Lisa" + gender = FEMALE + desc = "She's tearing you apart." + gold_core_spawnable = NO_SPAWN + unique_pet = TRUE + icon_state = "lisa" + icon_living = "lisa" + icon_dead = "lisa_dead" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "bops" + response_disarm_simple = "bop" + response_harm_continuous = "kicks" + response_harm_simple = "kick" + held_state = "lisa" + strippable_inventory_slots = list(/datum/strippable_item/corgi_back, /datum/strippable_item/pet_collar, /datum/strippable_item/corgi_id) //Lisa already has a cute bow! + +//PUPPIES! SQUEEEEEEEEE~ +/mob/living/basic/pet/dog/corgi/puppy + name = "\improper corgi puppy" + real_name = "corgi" + desc = "They're a corgi puppy!" + icon_state = "puppy" + icon_living = "puppy" + icon_dead = "puppy_dead" + density = FALSE + pass_flags = PASSMOB + mob_size = MOB_SIZE_SMALL + collar_icon_state = "puppy" + strippable_inventory_slots = list(/datum/strippable_item/pet_collar, /datum/strippable_item/corgi_id) //puppies are too small to handle hats and back slot items + +//PUPPY IAN! SQUEEEEEEEEE~ +/mob/living/basic/pet/dog/corgi/puppy/ian + name = "Ian" + real_name = "Ian" + gender = MALE + desc = "He's the HoP's beloved corgi puppy." + +/mob/living/basic/pet/dog/corgi/puppy/void //Tribute to the corgis born in nullspace + name = "\improper void puppy" + real_name = "voidy" + desc = "A corgi puppy that has been infused with deep space energy. It's staring back..." + gender = NEUTER + icon_state = "void_puppy" + icon_living = "void_puppy" + icon_dead = "void_puppy_dead" + can_be_shaved = FALSE + held_state = "void_puppy" + unsuitable_atmos_damage = 0 + minimum_survivable_temperature = TCMB + maximum_survivable_temperature = T0C + 40 + +/mob/living/basic/pet/dog/corgi/puppy/void/Initialize(mapload) + . = ..() + //void puppies can spacewalk and can harass people from within a container because they're void puppies + add_traits(list(TRAIT_AI_BAGATTACK, TRAIT_SPACEWALK), INNATE_TRAIT) diff --git a/code/modules/mob/living/basic/pets/dog/dog_subtypes.dm b/code/modules/mob/living/basic/pets/dog/dog_subtypes.dm new file mode 100644 index 0000000000000..a78a553729f1a --- /dev/null +++ b/code/modules/mob/living/basic/pets/dog/dog_subtypes.dm @@ -0,0 +1,91 @@ +//Less exciting dog breeds + +/mob/living/basic/pet/dog/pug + name = "\improper pug" + real_name = "pug" + desc = "They're a pug." + icon = 'icons/mob/simple/pets.dmi' + icon_state = "pug" + icon_living = "pug" + icon_dead = "pug_dead" + butcher_results = list(/obj/item/food/meat/slab/pug = 3) + gold_core_spawnable = FRIENDLY_SPAWN + collar_icon_state = "pug" + held_state = "pug" + +/mob/living/basic/pet/dog/pug/Initialize(mapload) + . = ..() + AddElement(/datum/element/swabable, CELL_LINE_TABLE_PUG, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) + +/mob/living/basic/pet/dog/pug/mcgriff + name = "McGriff" + real_name = "McGriff" + desc = "This dog can tell something smells around here, and that something is CRIME!" + gold_core_spawnable = NO_SPAWN + unique_pet = TRUE + +/mob/living/basic/pet/dog/bullterrier + name = "\improper bull terrier" + real_name = "bull terrier" + desc = "They're a bull terrier." + icon = 'icons/mob/simple/pets.dmi' + icon_state = "bullterrier" + icon_living = "bullterrier" + icon_dead = "bullterrier_dead" + butcher_results = list(/obj/item/food/meat/slab/corgi = 3) // Would feel redundant to add more new dog meats. + gold_core_spawnable = FRIENDLY_SPAWN + collar_icon_state = "bullterrier" + held_state = "bullterrier" + +/mob/living/basic/pet/dog/breaddog //Most of the code originates from Cak + name = "Kobun" + real_name = "Kobun" + desc = "It is a dog made out of bread. 'The universe is definitely half full'." + icon_state = "breaddog" + icon_living = "breaddog" + icon_dead = "breaddog_dead" + head_icon = 'icons/mob/clothing/head/pets_head.dmi' + health = 50 + maxHealth = 50 + gender = NEUTER + damage_coeff = list(BRUTE = 3, BURN = 3, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) + butcher_results = list(/obj/item/organ/internal/brain = 1, /obj/item/organ/internal/heart = 1, /obj/item/food/breadslice/plain = 3, \ + /obj/item/food/meat/slab = 2) + response_harm_continuous = "takes a bite out of" + response_harm_simple = "take a bite out of" + attacked_sound = 'sound/items/eatfood.ogg' + held_state = "breaddog" + worn_slot_flags = ITEM_SLOT_HEAD + +/mob/living/basic/pet/dog/breaddog/CheckParts(list/parts) + . = ..() + var/obj/item/organ/internal/brain/candidate = locate(/obj/item/organ/internal/brain) in contents + if(!candidate || !candidate.brainmob || !candidate.brainmob.mind) + return + candidate.brainmob.mind.transfer_to(src) + to_chat(src, "[span_boldbig("You are a bread dog!")] You're a harmless dog/bread hybrid that everyone loves. People can take bites out of you if they're hungry, but you regenerate health \ + so quickly that it generally doesn't matter. You're remarkably resilient to any damage besides this and it's hard for you to really die at all. You should go around and bring happiness and \ + free bread to the station! 'I’m not alone, and you aren’t either'") + var/default_name = "Kobun" + var/new_name = sanitize_name(reject_bad_text(tgui_input_text(src, "You are the [name]. Would you like to change your name to something else?", "Name change", default_name, MAX_NAME_LEN)), cap_after_symbols = FALSE) + if(new_name) + to_chat(src, span_notice("Your name is now [new_name]!")) + name = new_name + real_name = new_name + +/mob/living/basic/pet/dog/breaddog/Life(seconds_per_tick = SSMOBS_DT, times_fired) + . = ..() + if(stat) + return + + if(health < maxHealth) + adjustBruteLoss(-4 * seconds_per_tick) //Fast life regen + + for(var/mob/living/carbon/humanoid_entities in view(3, src)) //Mood aura which stay as long you do not wear Sanallite as hat or carry(I will try to make it work with hat someday(obviously weaker than normal one)) + humanoid_entities.add_mood_event("kobun", /datum/mood_event/kobun) + +/mob/living/basic/pet/dog/breaddog/attack_hand(mob/living/user, list/modifiers) + . = ..() + if(user.combat_mode && user.reagents && !stat) + user.reagents.add_reagent(/datum/reagent/consumable/nutriment, 0.4) + user.reagents.add_reagent(/datum/reagent/consumable/nutriment/vitamin, 0.4) diff --git a/code/modules/mob/living/basic/pets/dog/strippable_items.dm b/code/modules/mob/living/basic/pets/dog/strippable_items.dm new file mode 100644 index 0000000000000..2799ca38b978f --- /dev/null +++ b/code/modules/mob/living/basic/pets/dog/strippable_items.dm @@ -0,0 +1,156 @@ +//corgi's stippable items + +GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list( + /datum/strippable_item/corgi_head, + /datum/strippable_item/corgi_back, + /datum/strippable_item/pet_collar, + /datum/strippable_item/corgi_id, +))) + +/datum/strippable_item/corgi_head + key = STRIPPABLE_ITEM_HEAD + +/datum/strippable_item/corgi_head/get_item(atom/source) + var/mob/living/basic/pet/dog/corgi/corgi_source = source + if(!istype(corgi_source)) + return + + return corgi_source.inventory_head + +/datum/strippable_item/corgi_head/finish_equip(atom/source, obj/item/equipping, mob/user) + var/mob/living/basic/pet/dog/corgi/corgi_source = source + if(!istype(corgi_source)) + return + + corgi_source.place_on_head(equipping, user) + +/datum/strippable_item/corgi_head/finish_unequip(atom/source, mob/user) + var/mob/living/basic/pet/dog/corgi/corgi_source = source + if(!istype(corgi_source)) + return + + user.put_in_hands(corgi_source.inventory_head) + corgi_source.inventory_head = null + corgi_source.update_corgi_fluff() + corgi_source.update_appearance(UPDATE_OVERLAYS) + +/datum/strippable_item/pet_collar + key = STRIPPABLE_ITEM_PET_COLLAR + +/datum/strippable_item/pet_collar/get_item(atom/source) + var/mob/living/basic/pet/pet_source = source + if(!istype(pet_source)) + return + + return pet_source.collar + +/datum/strippable_item/pet_collar/try_equip(atom/source, obj/item/equipping, mob/user) + . = ..() + if(!.) + return FALSE + + if(!istype(equipping, /obj/item/clothing/neck/petcollar)) + to_chat(user, span_warning("That's not a collar.")) + return FALSE + + return TRUE + +/datum/strippable_item/pet_collar/finish_equip(atom/source, obj/item/equipping, mob/user) + var/mob/living/basic/pet/pet_source = source + if(!istype(pet_source)) + return + + pet_source.add_collar(equipping, user) + +/datum/strippable_item/pet_collar/finish_unequip(atom/source, mob/user) + var/mob/living/basic/pet/pet_source = source + if(!istype(pet_source)) + return + + var/obj/collar = pet_source.remove_collar(user.drop_location()) + user.put_in_hands(collar) + +/datum/strippable_item/corgi_back + key = STRIPPABLE_ITEM_BACK + +/datum/strippable_item/corgi_back/get_item(atom/source) + var/mob/living/basic/pet/dog/corgi/corgi_source = source + if(!istype(corgi_source)) + return + + return corgi_source.inventory_back + +/datum/strippable_item/corgi_back/try_equip(atom/source, obj/item/equipping, mob/user) + . = ..() + if(!.) + return FALSE + + if(!ispath(equipping.dog_fashion, /datum/dog_fashion/back)) + to_chat(user, span_warning("You set [equipping] on [source]'s back, but it falls off!")) + equipping.forceMove(source.drop_location()) + if(prob(25)) + step_rand(equipping) + dance_rotate(source, set_original_dir = TRUE) + + return FALSE + + return TRUE + +/datum/strippable_item/corgi_back/finish_equip(atom/source, obj/item/equipping, mob/user) + var/mob/living/basic/pet/dog/corgi/corgi_source = source + if(!istype(corgi_source)) + return + + equipping.forceMove(corgi_source) + corgi_source.inventory_back = equipping + corgi_source.update_corgi_fluff() + corgi_source.update_appearance(UPDATE_OVERLAYS) + +/datum/strippable_item/corgi_back/finish_unequip(atom/source, mob/user) + var/mob/living/basic/pet/dog/corgi/corgi_source = source + if(!istype(corgi_source)) + return + + user.put_in_hands(corgi_source.inventory_back) + corgi_source.inventory_back = null + corgi_source.update_corgi_fluff() + corgi_source.update_appearance(UPDATE_OVERLAYS) + +/datum/strippable_item/corgi_id + key = STRIPPABLE_ITEM_ID + +/datum/strippable_item/corgi_id/get_item(atom/source) + var/mob/living/basic/pet/dog/corgi/corgi_source = source + if(!istype(corgi_source)) + return + + return corgi_source.access_card + +/datum/strippable_item/corgi_id/try_equip(atom/source, obj/item/equipping, mob/user) + . = ..() + if(!.) + return FALSE + + if(!isidcard(equipping)) + to_chat(user, span_warning("You can't pin [equipping] to [source]!")) + return FALSE + + return TRUE + +/datum/strippable_item/corgi_id/finish_equip(atom/source, obj/item/equipping, mob/user) + var/mob/living/basic/pet/dog/corgi/corgi_source = source + if(!istype(corgi_source)) + return + + equipping.forceMove(source) + corgi_source.access_card = equipping + +/datum/strippable_item/corgi_id/finish_unequip(atom/source, mob/user) + var/mob/living/basic/pet/dog/corgi/corgi_source = source + if(!istype(corgi_source)) + return + + user.put_in_hands(corgi_source.access_card) + corgi_source.access_card = null + corgi_source.update_corgi_fluff() + corgi_source.update_appearance(UPDATE_OVERLAYS) diff --git a/code/modules/mob/living/basic/pets/fox.dm b/code/modules/mob/living/basic/pets/fox.dm new file mode 100644 index 0000000000000..578a64ba08dd8 --- /dev/null +++ b/code/modules/mob/living/basic/pets/fox.dm @@ -0,0 +1,80 @@ +/* Foxes. +* +* Foxes are cowardly creatures that will hunt any small animals, but only when no one is looking. +*/ + +/mob/living/basic/pet/fox + name = "fox" + desc = "They're a fox." + icon = 'icons/mob/simple/pets.dmi' + icon_state = "fox" + icon_living = "fox" + icon_dead = "fox_dead" + speak_emote = list("geckers", "barks") + butcher_results = list(/obj/item/food/meat/slab = 3) + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "kicks" + response_harm_simple = "kick" + gold_core_spawnable = FRIENDLY_SPAWN + can_be_held = TRUE + held_state = "fox" + melee_damage_lower = 5 + melee_damage_upper = 5 + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + attack_sound = 'sound/weapons/bite.ogg' + attack_vis_effect = ATTACK_EFFECT_BITE + ai_controller = /datum/ai_controller/basic_controller/fox + +/mob/living/basic/pet/fox/Initialize(mapload) + . = ..() + AddElement(/datum/element/pet_bonus, "pants and yaps happily!") + AddElement(/datum/element/footstep, footstep_type = FOOTSTEP_MOB_CLAW) + AddElement(/datum/element/tiny_mob_hunter, MOB_SIZE_SMALL) + AddElement(/datum/element/ai_retaliate) + +/datum/ai_controller/basic_controller/fox + blackboard = list( + BB_BASIC_MOB_FLEEING = TRUE, + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/of_size/ours_or_smaller/ignore_faction, + BB_FLEE_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate/to_flee, + /datum/ai_planning_subtree/flee_target/from_flee_key, + /datum/ai_planning_subtree/simple_find_target/not_while_observed, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/random_speech/fox, + ) + +// An AI controller for more docile foxes. +/datum/ai_controller/basic_controller/fox/docile + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate/to_flee, + /datum/ai_planning_subtree/flee_target/from_flee_key, + /datum/ai_planning_subtree/random_speech/fox, + ) + +// Foxes will attack other station pets regardless of faction. +/datum/targetting_datum/basic/of_size/ours_or_smaller/ignore_faction + +/datum/targetting_datum/basic/of_size/ours_or_smaller/ignore_faction/faction_check(mob/living/living_mob, mob/living/the_target) + return FALSE + +// The captain's fox, Renault +/mob/living/basic/pet/fox/renault + name = "Renault" + desc = "Renault, the Captain's trustworthy fox." + gender = FEMALE + gold_core_spawnable = NO_SPAWN + unique_pet = TRUE + +// A more docile subtype that won't attack other animals. +/mob/living/basic/pet/fox/docile + ai_controller = /datum/ai_controller/basic_controller/fox/docile diff --git a/code/modules/mob/living/basic/pets/penguin.dm b/code/modules/mob/living/basic/pets/penguin.dm new file mode 100644 index 0000000000000..35abc784e3792 --- /dev/null +++ b/code/modules/mob/living/basic/pets/penguin.dm @@ -0,0 +1,199 @@ +/mob/living/basic/pet/penguin + + icon = 'icons/mob/simple/penguins.dmi' + gender = FEMALE + + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "bops" + response_disarm_simple = "bop" + response_harm_continuous = "kicks" + response_harm_simple = "kick" + + faction = list(FACTION_NEUTRAL) + ai_controller = /datum/ai_controller/basic_controller/penguin + ///it can lay an egg? + var/can_lay_eggs = TRUE + ///the egg it carries + var/obj/carried_egg + + +/mob/living/basic/pet/penguin/Initialize(mapload) + . = ..() + AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/ai_flee_while_injured) + AddElement(/datum/element/pet_bonus, "honks happily!") + AddElement(/datum/element/waddling) + if(!can_lay_eggs) + return + AddComponent(\ + /datum/component/egg_layer,\ + /obj/item/food/egg/penguin_egg,\ + list(/obj/item/food/fishmeat),\ + lay_messages = EGG_LAYING_MESSAGES,\ + eggs_left = 0,\ + eggs_added_from_eating = 1,\ + max_eggs_held = 1,\ + egg_laid_callback = CALLBACK(src, PROC_REF(lay_penguin_egg)),\ + ) + +/mob/living/basic/pet/penguin/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) + . = ..() + if(!.) + return + + if(!proximity_flag) + return + if(!istype(attack_target, /obj/item/food/egg/penguin_egg)) + return + + remove_egg() //to check if we already have a egg + var/obj/item/egg_target = attack_target + egg_target.forceMove(src) + carried_egg = attack_target + add_overlay("penguin_egg_overlay") + RegisterSignal(egg_target, COMSIG_QDELETING, PROC_REF(on_hatch_egg)) + +/mob/living/basic/pet/penguin/death(gibbed) + . = ..() + remove_egg() + +/mob/living/basic/pet/penguin/proc/lay_penguin_egg(obj/item/penguin_egg) + if(prob(35)) + penguin_egg.AddComponent(\ + /datum/component/fertile_egg,\ + embryo_type = /mob/living/basic/pet/penguin/baby,\ + minimum_growth_rate = 1,\ + maximum_growth_rate = 2,\ + total_growth_required = 400,\ + current_growth = 0,\ + location_allowlist = typecacheof(list(/turf, /mob/living/basic/pet/penguin)),\ + ) + +/mob/living/basic/pet/penguin/proc/on_hatch_egg() + SIGNAL_HANDLER + remove_egg() + +/mob/living/basic/pet/penguin/proc/remove_egg() + if(isnull(carried_egg)) + return + carried_egg.forceMove(get_turf(src)) + UnregisterSignal(carried_egg, COMSIG_QDELETING) + carried_egg = null + cut_overlay("penguin_egg_overlay") + +/datum/ai_controller/basic_controller/penguin + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + ) + + ai_traits = STOP_MOVING_WHEN_PULLED + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + + planning_subtrees = list( + /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee, + /datum/ai_planning_subtree/flee_target, + /datum/ai_planning_subtree/find_and_hunt_target/penguin_egg, + /datum/ai_planning_subtree/random_speech/penguin, + ) + +/datum/ai_planning_subtree/find_and_hunt_target/penguin_egg + target_key = BB_LOW_PRIORITY_HUNTING_TARGET + hunting_behavior = /datum/ai_behavior/hunt_target/penguin_egg + finding_behavior = /datum/ai_behavior/find_hunt_target/penguin_egg + hunt_targets = list(/obj/item/food/egg/penguin_egg) + hunt_range = 7 + +/datum/ai_behavior/find_hunt_target/penguin_egg/valid_dinner(mob/living/source, atom/dinner, radius) + return can_see(source, dinner, radius) && !(dinner in source.contents) +/datum/ai_behavior/hunt_target/penguin_egg + hunt_cooldown = 15 SECONDS + always_reset_target = TRUE + +/datum/ai_behavior/hunt_target/penguin_egg/target_caught(mob/living/basic/hunter, obj/item/food/egg/target) + hunter.UnarmedAttack(target, TRUE) + +/mob/living/basic/pet/penguin/emperor + name = "emperor penguin" + real_name = "penguin" + desc = "Emperor of all she surveys." + icon_state = "penguin" + icon_living = "penguin" + icon_dead = "penguin_dead" + gold_core_spawnable = FRIENDLY_SPAWN + +/mob/living/basic/pet/penguin/emperor/neuter + can_lay_eggs = FALSE + +/mob/living/basic/pet/penguin/emperor/shamebrero + name = "shamebrero penguin" + icon_state = "penguin_shamebrero" + icon_living = "penguin_shamebrero" + gold_core_spawnable = NO_SPAWN + unique_pet = TRUE + +/mob/living/basic/pet/penguin/emperor/shamebrero/neuter + can_lay_eggs = FALSE + +/mob/living/basic/pet/penguin/baby + name = "penguin chick" + real_name = "penguin" + desc = "Can't fly and barely waddles, yet the prince of all chicks." + icon_state = "penguin_baby" + icon_living = "penguin_baby" + icon_dead = "penguin_baby_dead" + density = FALSE + pass_flags = PASSMOB + mob_size = MOB_SIZE_SMALL + butcher_results = list(/obj/item/organ/internal/ears/penguin = 1, /obj/item/food/meat/slab/penguin = 1) + ai_controller = /datum/ai_controller/basic_controller/penguin/baby + can_lay_eggs = FALSE + ///will it grow up? + var/can_grow_up = TRUE + + +/mob/living/basic/pet/penguin/baby/Initialize(mapload) + . = ..() + if(!can_grow_up) + return + var/list/weight_mobtypes = list( + /mob/living/basic/pet/penguin/emperor = 5, + /mob/living/basic/pet/penguin/emperor/shamebrero = 1, + ) + var/grown_type = pick_weight(weight_mobtypes) + AddComponent(\ + /datum/component/growth_and_differentiation,\ + growth_time = null,\ + growth_path = grown_type,\ + growth_probability = 100,\ + lower_growth_value = 0.5,\ + upper_growth_value = 1,\ + signals_to_kill_on = list(COMSIG_MOB_CLIENT_LOGIN),\ + optional_checks = CALLBACK(src, PROC_REF(ready_to_grow)),\ + ) + +/mob/living/basic/pet/penguin/baby/proc/ready_to_grow() + return (stat == CONSCIOUS) + +/datum/ai_controller/basic_controller/penguin/baby + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_FIND_MOM_TYPES = list(/mob/living/basic/pet/penguin), + BB_IGNORE_MOM_TYPES = list(/mob/living/basic/pet/penguin/baby), + ) + + ai_traits = STOP_MOVING_WHEN_PULLED + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + + planning_subtrees = list( + /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee, + /datum/ai_planning_subtree/flee_target, + /datum/ai_planning_subtree/look_for_adult, + ) + +/mob/living/basic/pet/penguin/baby/permanent + can_grow_up = FALSE + + diff --git a/code/modules/mob/living/basic/pets/pet.dm b/code/modules/mob/living/basic/pets/pet.dm index 60dbb277b4bdd..c8507454f774c 100644 --- a/code/modules/mob/living/basic/pets/pet.dm +++ b/code/modules/mob/living/basic/pets/pet.dm @@ -47,7 +47,7 @@ return // Determine which status tag to add to the middle of the icon state. - var/dead_tag = stat == DEAD ? "_dead" : null + var/dead_tag = (stat == DEAD || HAS_TRAIT(src, TRAIT_FAKEDEATH)) ? "_dead" : null var/rest_tag = has_collar_resting_icon_state && resting ? "_rest" : null var/stat_tag = dead_tag || rest_tag || "" @@ -55,9 +55,8 @@ . += mutable_appearance(icon, "[collar_icon_state][stat_tag]tag") /mob/living/basic/pet/gib() - . = ..() - remove_collar(drop_location(), update_visuals = FALSE) + return ..() /mob/living/basic/pet/revive(full_heal_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE) . = ..() @@ -70,10 +69,9 @@ . = ..() add_memory_in_range(src, 7, /datum/memory/pet_died, deuteragonist = src) //Protagonist is the person memorizing it -/mob/living/basic/pet/handle_atom_del(atom/deleting_atom) +/mob/living/basic/pet/Exited(atom/movable/gone, direction) . = ..() - - if(deleting_atom != collar) + if(gone != collar) return collar = null diff --git a/code/modules/mob/living/basic/pets/sloth.dm b/code/modules/mob/living/basic/pets/sloth.dm new file mode 100644 index 0000000000000..5058e7d53344d --- /dev/null +++ b/code/modules/mob/living/basic/pets/sloth.dm @@ -0,0 +1,97 @@ +GLOBAL_DATUM(cargo_sloth, /mob/living/basic/sloth) + +/mob/living/basic/sloth + name = "sloth" + desc = "An adorable, sleepy creature." + icon = 'icons/mob/simple/pets.dmi' + icon_state = "sloth" + icon_living = "sloth" + icon_dead = "sloth_dead" + + speak_emote = list("yawns") + + can_be_held = TRUE + held_state = "sloth" + + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "kicks" + response_harm_simple = "kick" + + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + attack_sound = 'sound/weapons/bite.ogg' + attack_vis_effect = ATTACK_EFFECT_BITE + + mob_biotypes = MOB_ORGANIC|MOB_BEAST + gold_core_spawnable = FRIENDLY_SPAWN + + melee_damage_lower = 18 + melee_damage_upper = 18 + health = 50 + maxHealth = 50 + speed = 10 // speed is fucking weird man. they aren't fast though don't worry + butcher_results = list(/obj/item/food/meat/slab = 3) + + ai_controller = /datum/ai_controller/basic_controller/sloth + +/mob/living/basic/sloth/Initialize(mapload) + . = ..() + AddElement(/datum/element/pet_bonus, "slowly smiles!") + AddElement(/datum/element/footstep, footstep_type = FOOTSTEP_MOB_CLAW) + AddElement(/datum/element/ai_retaliate) + AddComponent(/datum/component/tree_climber) + + if(!mapload || isnull(GLOB.cargo_sloth) || !is_station_level(z)) + return + + // If someone adds non-cargo sloths to maps we'll have a problem but we're fine for now + GLOB.cargo_sloth = src + +/mob/living/basic/sloth/Destroy() + if(GLOB.cargo_sloth == src) + GLOB.cargo_sloth = null + + return ..() + +/mob/living/basic/sloth/paperwork + name = "Paperwork" + desc = "Cargo's pet sloth. About as useful as the rest of the techs." + gender = MALE + gold_core_spawnable = NO_SPAWN + +/mob/living/basic/sloth/citrus + name = "Citrus" + desc = "Cargo's pet sloth. She's dressed in a horrible sweater." + icon_state = "cool_sloth" + icon_living = "cool_sloth" + icon_dead = "cool_sloth_dead" + gender = FEMALE + butcher_results = list(/obj/item/toy/spinningtoy = 1) + gold_core_spawnable = NO_SPAWN + +/// They're really passive in game, so they just wanna get away if you start smacking them. No trees in space from them to use for clawing your eyes out, but they will try if desperate. +/datum/ai_controller/basic_controller/sloth + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction, + BB_BASIC_MOB_FLEEING = TRUE, + BB_FLEE_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction, + ) + + ai_traits = STOP_MOVING_WHEN_PULLED + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate/to_flee, + /datum/ai_planning_subtree/flee_target/from_flee_key, + /datum/ai_planning_subtree/climb_trees, + /datum/ai_planning_subtree/random_speech/sloth, + ) + +/datum/ai_planning_subtree/random_speech/sloth + speech_chance = 1 + emote_hear = list("snores.", "yawns.") + emote_see = list("dozes off.", "looks around sleepily.") diff --git a/code/modules/mob/living/basic/ruin_defender/stickman.dm b/code/modules/mob/living/basic/ruin_defender/stickman.dm index 115b1df1bdac0..107973135c78c 100644 --- a/code/modules/mob/living/basic/ruin_defender/stickman.dm +++ b/code/modules/mob/living/basic/ruin_defender/stickman.dm @@ -13,6 +13,7 @@ attack_verb_simple = "punch" melee_damage_lower = 10 melee_damage_upper = 10 + melee_attack_cooldown = 1.5 SECONDS attack_sound = 'sound/weapons/punch1.ogg' combat_mode = TRUE faction = list(FACTION_STICKMAN) @@ -22,6 +23,10 @@ ai_controller = /datum/ai_controller/basic_controller/stickman +/mob/living/basic/stickman/lesser + maxHealth = 25 + health = 25 + /mob/living/basic/stickman/Initialize(mapload) . = ..() new /obj/effect/temp_visual/paper_scatter(get_turf(src)) @@ -35,15 +40,9 @@ 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 ) -/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." @@ -74,7 +73,7 @@ . = ..() var/static/list/stickman_drops = list(/obj/item/gun/ballistic/automatic/pistol/stickman) AddElement(/datum/element/death_drops, stickman_drops) - AddElement(/datum/element/ranged_attacks, /obj/item/ammo_casing/c9mm, 'sound/misc/bang.ogg') + AddComponent(/datum/component/ranged_attacks, casing_type = /obj/item/ammo_casing/c9mm, projectile_sound = 'sound/misc/bang.ogg', cooldown_time = 5 SECONDS) /datum/ai_controller/basic_controller/stickman/ranged planning_subtrees = list( diff --git a/code/modules/mob/living/basic/space_fauna/bear/_bear.dm b/code/modules/mob/living/basic/space_fauna/bear/_bear.dm new file mode 100644 index 0000000000000..414f28a1e9af5 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/bear/_bear.dm @@ -0,0 +1,170 @@ +//Space bears! +/mob/living/basic/bear + name = "space bear" + desc = "You don't need to be faster than a space bear, you just need to outrun your crewmates." + icon_state = "bear" + icon_living = "bear" + icon_dead = "bear_dead" + icon_gib = "bear_gib" + mob_biotypes = MOB_ORGANIC|MOB_BEAST + butcher_results = list(/obj/item/food/meat/slab/bear = 5, /obj/item/clothing/head/costume/bearpelt = 1) + + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + + maxHealth = 60 + health = 60 + speed = 0 + + obj_damage = 60 + melee_damage_lower = 15 + melee_damage_upper = 15 + wound_bonus = -5 + bare_wound_bonus = 10 // BEAR wound bonus am i right + sharpness = SHARP_EDGED + attack_verb_continuous = "claws" + attack_verb_simple = "claw" + attack_sound = 'sound/weapons/bladeslice.ogg' + attack_vis_effect = ATTACK_EFFECT_CLAW + friendly_verb_continuous = "bear hugs" + friendly_verb_simple = "bear hug" + + faction = list(FACTION_RUSSIAN) + + habitable_atmos = 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) + minimum_survivable_temperature = TCMB + maximum_survivable_temperature = T0C + 1500 + ai_controller = /datum/ai_controller/basic_controller/bear + /// is the bear wearing a armor? + var/armored = FALSE + +/mob/living/basic/bear/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) + AddElement(/datum/element/ai_retaliate) + AddComponent(/datum/component/tree_climber, climbing_distance = 15) + AddElement(/datum/element/swabable, CELL_LINE_TABLE_BEAR, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) + +/mob/living/basic/bear/Login() + . = ..() + if(!. || !client) + return FALSE + + AddElement(/datum/element/ridable, /datum/component/riding/creature/bear) + can_buckle = TRUE + buckle_lying = 0 + +/mob/living/basic/bear/update_icons() + ..() + if(armored) + add_overlay("armor_bear") + +/mob/living/basic/bear/proc/extract_combs(obj/structure/beebox/hive) + if(!length(hive.honeycombs)) + return + var/obj/item/food/honeycomb/honey_food = pick_n_take(hive.honeycombs) + if(isnull(honey_food)) + return + honey_food.forceMove(get_turf(src)) + +//SPACE BEARS! SQUEEEEEEEE~ OW! FUCK! IT BIT MY HAND OFF!! +/mob/living/basic/bear/hudson + name = "Hudson" + gender = MALE + desc = "Feared outlaw, this guy is one bad news bear." //I'm sorry... + +/mob/living/basic/bear/snow + name = "space polar bear" + icon_state = "snowbear" + icon_living = "snowbear" + icon_dead = "snowbear_dead" + desc = "It's a polar bear, in space, but not actually in space." + +/mob/living/basic/bear/snow/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_SNOWSTORM_IMMUNE, INNATE_TRAIT) + +/mob/living/basic/bear/russian + name = "combat bear" + desc = "A ferocious brown bear decked out in armor plating, a red star with yellow outlining details the shoulder plating." + icon_state = "combatbear" + icon_living = "combatbear" + icon_dead = "combatbear_dead" + faction = list(FACTION_RUSSIAN) + butcher_results = list(/obj/item/food/meat/slab/bear = 5, /obj/item/clothing/head/costume/bearpelt = 1, /obj/item/bear_armor = 1) + melee_damage_lower = 18 + melee_damage_upper = 20 + wound_bonus = 0 + armour_penetration = 20 + health = 120 + maxHealth = 120 + gold_core_spawnable = HOSTILE_SPAWN + armored = TRUE + +/mob/living/basic/bear/butter //The mighty companion to Cak. Several functions used from it. + name = "Terrygold" + icon_state = "butterbear" + icon_living = "butterbear" + icon_dead = "butterbear_dead" + desc = "I can't believe its not a bear!" + faction = list(FACTION_NEUTRAL, FACTION_RUSSIAN) + obj_damage = 11 + melee_damage_lower = 0 + melee_damage_upper = 0 + sharpness = NONE //it's made of butter + armour_penetration = 0 + response_harm_continuous = "takes a bite out of" + response_harm_simple = "take a bite out of" + attacked_sound = 'sound/items/eatfood.ogg' + death_message = "loses its false life and collapses!" + butcher_results = list(/obj/item/food/butter = 6, /obj/item/food/meat/slab = 3, /obj/item/organ/internal/brain = 1, /obj/item/organ/internal/heart = 1) + attack_sound = 'sound/weapons/slap.ogg' + attack_vis_effect = ATTACK_EFFECT_DISARM + attack_verb_simple = "slap" + attack_verb_continuous = "slaps" + +/mob/living/basic/bear/butter/Initialize(mapload) + . = ..() + + AddComponent(/datum/component/regenerator,\ + regeneration_delay = 1 SECONDS,\ + health_per_second = 5,\ + outline_colour = COLOR_YELLOW,\ + ) + +/mob/living/basic/bear/butter/attack_hand(mob/living/user, list/modifiers) //Borrowed code from Cak, feeds people if they hit you. More nutriment but less vitamin to represent BUTTER. + . = ..() + if(user.combat_mode && user.reagents && !stat) + user.reagents.add_reagent(/datum/reagent/consumable/nutriment, 1) + user.reagents.add_reagent(/datum/reagent/consumable/nutriment/vitamin, 0.1) + +/mob/living/basic/bear/butter/CheckParts(list/parts) //Borrowed code from Cak, allows the brain used to actually control the bear. + . = ..() + var/obj/item/organ/internal/brain/candidate = locate(/obj/item/organ/internal/brain) in contents + if(!candidate || !candidate.brainmob || !candidate.brainmob.mind) + return + var/datum/mind/candidate_mind = candidate.brainmob.mind + candidate_mind.transfer_to(src) + candidate_mind.grab_ghost() + to_chat(src, "[span_boldbig("You are a butter bear!")] You're a mostly harmless bear/butter hybrid that everyone loves. People can take bites out of you if they're hungry, but you regenerate health \ + so quickly that it generally doesn't matter. You're remarkably resilient to any damage besides this and it's hard for you to really die at all. You should go around and bring happiness and \ + free butter to the station!") + var/default_name = "Terrygold" + var/new_name = sanitize_name(reject_bad_text(tgui_input_text(src, "You are the [name]. Would you like to change your name to something else?", "Name change", default_name, MAX_NAME_LEN)), cap_after_symbols = FALSE) + if(new_name) + to_chat(src, span_notice("Your name is now [new_name]!")) + name = new_name + +/mob/living/basic/bear/butter/UnarmedAttack(atom/target, proximity_flag, list/modifiers) //Makes the butter bear's attacks against vertical targets slip said targets + . = ..() + if(!. || !isliving(target)) + return + var/mob/living/victim = target + if((victim.body_position != STANDING_UP)) + return + victim.Knockdown(20) + playsound(loc, 'sound/misc/slip.ogg', 15) + victim.visible_message(span_danger("[victim] slips on [src]'s butter!")) + diff --git a/code/modules/mob/living/basic/space_fauna/bear/bear_ai_behavior.dm b/code/modules/mob/living/basic/space_fauna/bear/bear_ai_behavior.dm new file mode 100644 index 0000000000000..7c57349524fec --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/bear/bear_ai_behavior.dm @@ -0,0 +1,27 @@ +/datum/ai_behavior/find_hunt_target/find_hive + +/datum/ai_behavior/find_hunt_target/find_hive/valid_dinner(mob/living/source, obj/structure/beebox/hive, radius) + if(!length(hive.honeycombs)) + return FALSE + return can_see(source, hive, radius) + +/datum/ai_behavior/hunt_target/find_hive + always_reset_target = TRUE + +/datum/ai_behavior/hunt_target/find_hive/target_caught(mob/living/hunter, obj/structure/beebox/hive_target) + var/datum/callback/callback = CALLBACK(hunter, TYPE_PROC_REF(/mob/living/basic/bear, extract_combs), hive_target) + callback.Invoke() + +/datum/ai_behavior/find_hunt_target/find_honeycomb + +/datum/ai_behavior/find_hunt_target/find_honeycomb/setup(datum/ai_controller/controller, ability_key, target_key) + var/mob/living/living_pawn = controller.pawn + if(living_pawn.pulling) //we already pulling a honey + return FALSE + return TRUE + +/datum/ai_behavior/hunt_target/find_honeycomb + always_reset_target = TRUE + +/datum/ai_behavior/hunt_target/find_honeycomb/target_caught(mob/living/hunter, obj/item/food/honeycomb/food_target) + hunter.start_pulling(food_target) diff --git a/code/modules/mob/living/basic/space_fauna/bear/bear_ai_subtree.dm b/code/modules/mob/living/basic/space_fauna/bear/bear_ai_subtree.dm new file mode 100644 index 0000000000000..851c0bb80290b --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/bear/bear_ai_subtree.dm @@ -0,0 +1,30 @@ +/datum/ai_controller/basic_controller/bear + 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/target_retaliate, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/climb_trees, + /datum/ai_planning_subtree/find_and_hunt_target/find_hive, + /datum/ai_planning_subtree/find_and_hunt_target/find_honeycomb, + /datum/ai_planning_subtree/random_speech/bear, + ) + +/datum/ai_planning_subtree/find_and_hunt_target/find_hive + target_key = BB_FOUND_HONEY + hunting_behavior = /datum/ai_behavior/hunt_target/find_hive + finding_behavior = /datum/ai_behavior/find_hunt_target/find_hive + hunt_targets = list(/obj/structure/beebox) + hunt_range = 10 + +/datum/ai_planning_subtree/find_and_hunt_target/find_honeycomb + target_key = BB_LOW_PRIORITY_HUNTING_TARGET + hunting_behavior = /datum/ai_behavior/hunt_target/find_honeycomb + finding_behavior = /datum/ai_behavior/find_hunt_target/find_honeycomb + hunt_targets = list(/obj/item/food/honeycomb) + hunt_range = 10 diff --git a/code/modules/mob/living/basic/space_fauna/carp/carp.dm b/code/modules/mob/living/basic/space_fauna/carp/carp.dm index ddeccd9310390..9a4b149fd1a00 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/carp.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/carp.dm @@ -32,6 +32,7 @@ attack_vis_effect = ATTACK_EFFECT_BITE attack_verb_continuous = "bites" attack_verb_simple = "bite" + melee_attack_cooldown = 1.5 SECONDS response_help_continuous = "pets" response_help_simple = "pet" response_disarm_continuous = "gently pushes aside" @@ -57,7 +58,7 @@ /datum/pet_command/idle, /datum/pet_command/free, /datum/pet_command/follow, - /datum/pet_command/point_targetting/attack/carp + /datum/pet_command/point_targetting/attack ) /// Carp want to eat raw meat var/static/list/desired_food = list(/obj/item/food/meat/slab, /obj/item/food/meat/rawcutlet) @@ -78,30 +79,12 @@ /obj/machinery/vending, /obj/structure/window, )) - /// Weighted list of colours a carp can be - /// Weighted list of usual carp colors - var/static/list/carp_colors = list( - COLOR_CARP_PURPLE = 7, - COLOR_CARP_PINK = 7, - COLOR_CARP_GREEN = 7, - COLOR_CARP_GRAPE = 7, - COLOR_CARP_SWAMP = 7, - COLOR_CARP_TURQUOISE = 7, - COLOR_CARP_BROWN = 7, - COLOR_CARP_TEAL = 7, - COLOR_CARP_LIGHT_BLUE = 7, - COLOR_CARP_RUSTY = 7, - COLOR_CARP_RED = 7, - COLOR_CARP_YELLOW = 7, - COLOR_CARP_BLUE = 7, - COLOR_CARP_PALE_GREEN = 7, - COLOR_CARP_SILVER = 1, // The rare silver carp - ) /mob/living/basic/carp/Initialize(mapload, mob/tamer) + ADD_TRAIT(src, TRAIT_FREE_HYPERSPACE_MOVEMENT, INNATE_TRAIT) //Need to set before init cause if we init in hyperspace we get dragged before the trait can be added . = ..() apply_colour() - add_traits(list(TRAIT_HEALS_FROM_CARP_RIFTS, TRAIT_SPACEWALK, TRAIT_FREE_HYPERSPACE_MOVEMENT), INNATE_TRAIT) + add_traits(list(TRAIT_HEALS_FROM_CARP_RIFTS, TRAIT_SPACEWALK), INNATE_TRAIT) if (cell_line) AddElement(/datum/element/swabable, cell_line, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) @@ -109,6 +92,7 @@ AddElement(/datum/element/ai_flee_while_injured) setup_eating() + AddComponent(/datum/component/aggro_emote, emote_list = string_list(list("gnashes"))) AddComponent(/datum/component/regenerator, outline_colour = regenerate_colour) if (tamer) on_tamed(tamer, feedback = FALSE) @@ -136,7 +120,7 @@ /mob/living/basic/carp/proc/apply_colour() if (!greyscale_config) return - set_greyscale(colors = list(pick_weight(carp_colors))) + set_greyscale(colors = list(pick_weight(GLOB.carp_colors))) /// Called when another mob has forged a bond of friendship with this one, passed the taming mob as 'tamer' /mob/living/basic/carp/proc/on_tamed(mob/tamer, feedback = TRUE) @@ -163,6 +147,16 @@ ai_controller.set_blackboard_key(BB_CARP_MIGRATION_PATH, actual_points) +/mob/living/basic/carp/death(gibbed) + . = ..() + + REMOVE_TRAIT(src, TRAIT_FREE_HYPERSPACE_MOVEMENT, INNATE_TRAIT) + +/mob/living/basic/carp/revive(full_heal_flags, excess_healing, force_grab_ghost) + . = ..() + + ADD_TRAIT(src, TRAIT_FREE_HYPERSPACE_MOVEMENT, INNATE_TRAIT) + /** * Holographic carp from the holodeck */ @@ -261,3 +255,36 @@ obj_damage = 15 #undef RARE_CAYENNE_CHANCE + +///Carp-parasite from carpellosis disease +/mob/living/basic/carp/ella + name = "Ella" + real_name = "Ella" + desc = "It came out of someone." + gold_core_spawnable = NO_SPAWN + +/mob/living/basic/carp/ella/Initialize(mapload) + . = ..() + death() // It comes into the world dead when the disease is cured + +///Wild carp that just vibe ya know +/mob/living/basic/carp/passive + name = "passive carp" + desc = "A timid, sucker-bearing creature that resembles a fish. " + + icon_state = "base_friend" + icon_living = "base_friend" + icon_dead = "base_friend_dead" + greyscale_config = /datum/greyscale_config/carp_friend + + attack_verb_continuous = "suckers" + attack_verb_simple = "suck" + + melee_damage_lower = 4 + melee_damage_upper = 4 + ai_controller = /datum/ai_controller/basic_controller/carp/passive + +/mob/living/basic/carp/passive/Initialize(mapload) + . = ..() + AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/pet_bonus, "bloops happily!") diff --git a/code/modules/mob/living/basic/space_fauna/carp/carp_ai_actions.dm b/code/modules/mob/living/basic/space_fauna/carp/carp_ai_actions.dm index c0f5143f18c22..b1343a7aeedbf 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/carp_ai_actions.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/carp_ai_actions.dm @@ -1,17 +1,8 @@ #define MAGICARP_SPELL_TARGET_SEEK_RANGE 4 -/datum/pet_command/point_targetting/attack/carp - attack_behaviour = /datum/ai_behavior/basic_melee_attack/carp - /datum/pet_command/point_targetting/use_ability/magicarp pet_ability_key = BB_MAGICARP_SPELL -/datum/ai_planning_subtree/basic_melee_attack_subtree/carp - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/carp - -/datum/ai_behavior/basic_melee_attack/carp - action_cooldown = 1.5 SECONDS - /datum/ai_planning_subtree/attack_obstacle_in_path/carp attack_behaviour = /datum/ai_behavior/attack_obstructions/carp @@ -20,12 +11,12 @@ /// As basic attack tree but interrupt if your health gets low or if your spell is off cooldown /datum/ai_planning_subtree/basic_melee_attack_subtree/magicarp - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/carp/magic + melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/magicarp /// Interrupt your attack chain if: you have a spell, it's not on cooldown, and it has a target -/datum/ai_behavior/basic_melee_attack/carp/magic +/datum/ai_behavior/basic_melee_attack/magicarp -/datum/ai_behavior/basic_melee_attack/carp/magic/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key, health_ratio_key) +/datum/ai_behavior/basic_melee_attack/magicarp/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key, health_ratio_key) var/datum/action/cooldown/using_action = controller.blackboard[BB_MAGICARP_SPELL] if (QDELETED(using_action)) return ..() @@ -43,9 +34,7 @@ /datum/ai_planning_subtree/find_nearest_magicarp_spell_target/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) var/datum/action/cooldown/using_action = controller.blackboard[BB_MAGICARP_SPELL] - if (QDELETED(using_action)) - return - if (!using_action.IsAvailable()) + if (!using_action?.IsAvailable()) return var/spell_targetting = controller.blackboard[BB_MAGICARP_SPELL_SPECIAL_TARGETTING] diff --git a/code/modules/mob/living/basic/space_fauna/carp/carp_ai_rift_actions.dm b/code/modules/mob/living/basic/space_fauna/carp/carp_ai_rift_actions.dm index 88a9f6706f2ea..d220325ca15f5 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/carp_ai_rift_actions.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/carp_ai_rift_actions.dm @@ -12,9 +12,10 @@ if (!rift_behaviour) CRASH("Forgot to specify rift behaviour for [src]") - var/mob/living/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + if (!controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET)) + return var/datum/action/cooldown/using_action = controller.blackboard[BB_CARP_RIFT] - if (QDELETED(target) || QDELETED(using_action) || !using_action.IsAvailable()) + if (!using_action?.IsAvailable()) return controller.queue_behavior(rift_behaviour, BB_CARP_RIFT, BB_BASIC_MOB_CURRENT_TARGET) diff --git a/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm b/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm index 75c915c16a116..b30970145352b 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm @@ -25,7 +25,7 @@ /datum/ai_planning_subtree/attack_obstacle_in_path/carp, /datum/ai_planning_subtree/shortcut_to_target_through_carp_rift, /datum/ai_planning_subtree/make_carp_rift/aggressive_teleport, - /datum/ai_planning_subtree/basic_melee_attack_subtree/carp, + /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/carp_migration, ) @@ -48,7 +48,7 @@ /datum/ai_planning_subtree/attack_obstacle_in_path/carp, /datum/ai_planning_subtree/shortcut_to_target_through_carp_rift, /datum/ai_planning_subtree/make_carp_rift/aggressive_teleport, - /datum/ai_planning_subtree/basic_melee_attack_subtree/carp, + /datum/ai_planning_subtree/basic_melee_attack_subtree, ) /** @@ -71,3 +71,26 @@ /datum/ai_planning_subtree/basic_melee_attack_subtree/magicarp, /datum/ai_planning_subtree/carp_migration, ) + +/** + * Carp which bites back, but doesn't look for targets and doesnt do as much damage + * Still migrate and stuff + */ +/datum/ai_controller/basic_controller/carp/passive + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction(), + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends() + ) + ai_traits = STOP_MOVING_WHEN_PULLED + planning_subtrees = list( + /datum/ai_planning_subtree/pet_planning, + /datum/ai_planning_subtree/simple_find_nearest_target_to_flee, + /datum/ai_planning_subtree/make_carp_rift/panic_teleport, + /datum/ai_planning_subtree/flee_target, + /datum/ai_planning_subtree/find_food, + /datum/ai_planning_subtree/attack_obstacle_in_path/carp, + /datum/ai_planning_subtree/shortcut_to_target_through_carp_rift, + /datum/ai_planning_subtree/make_carp_rift/aggressive_teleport, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/carp_migration, + ) diff --git a/code/modules/mob/living/basic/space_fauna/carp/magicarp.dm b/code/modules/mob/living/basic/space_fauna/carp/magicarp.dm index 5051335a5571e..32f02b880dba4 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/magicarp.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/magicarp.dm @@ -56,7 +56,7 @@ GLOBAL_LIST_INIT(magicarp_spell_colours, list( /datum/pet_command/idle, /datum/pet_command/free, /datum/pet_command/follow, - /datum/pet_command/point_targetting/attack/carp, + /datum/pet_command/point_targetting/attack, /datum/pet_command/point_targetting/use_ability/magicarp, ) /// List of all projectiles we can fire. diff --git a/code/modules/mob/living/basic/space_fauna/cat_surgeon.dm b/code/modules/mob/living/basic/space_fauna/cat_surgeon.dm index ba5a627d62cf6..487727fb53cc1 100644 --- a/code/modules/mob/living/basic/space_fauna/cat_surgeon.dm +++ b/code/modules/mob/living/basic/space_fauna/cat_surgeon.dm @@ -40,6 +40,7 @@ /mob/living/basic/cat_butcherer/Initialize(mapload) . = ..() apply_dynamic_human_appearance(src, mob_spawn_path = /obj/effect/mob_spawn/corpse/human/cat_butcher, l_hand = /obj/item/circular_saw, bloody_slots = ITEM_SLOT_GLOVES|ITEM_SLOT_OCLOTHING) + AddElement(/datum/element/ai_retaliate) AddElement(/datum/element/death_drops, drop_on_death) RegisterSignal(src, COMSIG_HOSTILE_POST_ATTACKINGTARGET, PROC_REF(after_attack)) @@ -60,7 +61,6 @@ ) tail.Remove(attacked) tail.forceMove(drop_location()) - tail.color = attacked.hair_color /datum/ai_controller/basic_controller/cat_butcherer blackboard = list( diff --git a/code/modules/mob/living/basic/space_fauna/demon/demon.dm b/code/modules/mob/living/basic/space_fauna/demon/demon.dm new file mode 100644 index 0000000000000..c2d8c751cde90 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/demon/demon.dm @@ -0,0 +1,72 @@ +/// Player controlled mobs that rip and tear, typically summoned by wizards. +/mob/living/basic/demon + name = "imp" + real_name = "imp" + unique_name = TRUE + desc = "A large, menacing creature covered in armored black scales." + + speak_emote = list("cackles","screeches") + response_help_continuous = "thinks better of touching" + response_help_simple = "think better of touching" + response_disarm_continuous = "flails at" + response_disarm_simple = "flail at" + response_harm_continuous = "punches" + response_harm_simple = "punch" + attack_verb_continuous = "wildly tears into" + attack_verb_simple = "wildly tear into" + + icon = 'icons/mob/simple/demon.dmi' + icon_state = "demon" + icon_living = "demon" + + mob_biotypes = MOB_BEAST|MOB_HUMANOID + status_flags = CANPUSH + + combat_mode = TRUE + attack_sound = 'sound/magic/demon_attack1.ogg' + attack_vis_effect = ATTACK_EFFECT_CLAW + faction = list(FACTION_HELL) + + maxHealth = 200 + health = 200 + obj_damage = 40 + melee_damage_lower = 10 + melee_damage_upper = 15 + death_message = "screams in agony as it sublimates into a sulfurous smoke." + death_sound = 'sound/magic/demon_dies.ogg' + + habitable_atmos = 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) + minimum_survivable_temperature = T0C - 25 //Weak to cold + maximum_survivable_temperature = INFINITY + + basic_mob_flags = DEL_ON_DEATH + + // You KNOW we're doing a lightly purple red + lighting_cutoff_red = 30 + lighting_cutoff_green = 10 + lighting_cutoff_blue = 20 + + /// Typepath of the antag datum to add to the demon when applicable + var/datum/antagonist/antag_type = null + +/mob/living/basic/demon/Initialize(mapload) + . = ..() + var/list/grantable_loot = grant_loot() + if(length(grantable_loot)) + AddElement(/datum/element/death_drops, grantable_loot) + +/// Proc that adds the necessary loot for the demon. Return an empty list if you don't want to add anything. +/mob/living/basic/demon/proc/grant_loot() + return list() + +/// Proc that just sets up the demon's antagonism status. +/mob/living/basic/demon/proc/generate_antagonist_status() + if(isnull(antag_type)) + return // we weren't built for this proc to run + + mind.set_assigned_role(SSjob.GetJobType(/datum/job/slaughter_demon)) + mind.special_role = ROLE_SLAUGHTER_DEMON + mind.add_antag_datum(antag_type) + + SEND_SOUND(src, 'sound/magic/demon_dies.ogg') + to_chat(src, 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.")) diff --git a/code/modules/mob/living/basic/space_fauna/demon/demon_items.dm b/code/modules/mob/living/basic/space_fauna/demon/demon_items.dm new file mode 100644 index 0000000000000..8cdd7a6cf53fc --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/demon/demon_items.dm @@ -0,0 +1,56 @@ +/// The loot from killing a slaughter demon - can be consumed to allow the user to blood crawl +/obj/item/organ/internal/heart/demon + name = "demon heart" + desc = "Still it beats furiously, emanating an aura of utter hate." + icon = 'icons/obj/medical/organs/organs.dmi' + icon_state = "demon_heart-on" + decay_factor = 0 + +/obj/item/organ/internal/heart/demon/Initialize(mapload) + AddElement(/datum/element/update_icon_blocker) + return ..() + +/obj/item/organ/internal/heart/demon/attack(mob/target_mob, mob/living/carbon/user, obj/target) + if(target_mob != user) + return ..() + + user.visible_message( + span_warning("[user] raises [src] to [user.p_their()] mouth and tears into it with [user.p_their()] teeth!"), + span_danger("An unnatural hunger consumes you. You raise [src] your mouth and devour it!"), + ) + playsound(user, 'sound/magic/demon_consume.ogg', 50, TRUE) + + if(locate(/datum/action/cooldown/spell/jaunt/bloodcrawl) in user.actions) + to_chat(user, span_warning("...and you don't feel any different.")) + qdel(src) + return + + user.visible_message( + span_warning("[user]'s eyes flare a deep crimson!"), + span_userdanger("You feel a strange power seep into your body... you have absorbed the demon's blood-travelling powers!"), + ) + + user.temporarilyRemoveItemFromInventory(src, TRUE) + src.Insert(user) //Consuming the heart literally replaces your heart with a demon heart. H A R D C O R E + +/obj/item/organ/internal/heart/demon/on_insert(mob/living/carbon/heart_owner) + . = ..() + // Gives a non-eat-people crawl to the new owner + var/datum/action/cooldown/spell/jaunt/bloodcrawl/crawl = new(heart_owner) + crawl.Grant(heart_owner) + +/obj/item/organ/internal/heart/demon/on_remove(mob/living/carbon/heart_owner, special = FALSE) + . = ..() + var/datum/action/cooldown/spell/jaunt/bloodcrawl/crawl = locate() in heart_owner.actions + qdel(crawl) + +/obj/item/organ/internal/heart/demon/Stop() + return FALSE // Always beating. + +/obj/effect/decal/cleanable/blood/innards + name = "pile of viscera" + desc = "A repulsive pile of guts and gore." + gender = NEUTER + icon = 'icons/obj/medical/organs/organs.dmi' + icon_state = "innards" + random_icon_states = null diff --git a/code/modules/mob/living/basic/space_fauna/demon/demon_subtypes.dm b/code/modules/mob/living/basic/space_fauna/demon/demon_subtypes.dm new file mode 100644 index 0000000000000..e52eb09ac0b75 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/demon/demon_subtypes.dm @@ -0,0 +1,167 @@ +/// The famous blood-crawling slaughter demons of wizardry fame. +/mob/living/basic/demon/slaughter + name = "slaughter demon" + real_name = "slaughter demon" + unique_name = FALSE + speak_emote = list("gurgles","wails","screeches") + + icon_state = "slaughter_demon" + icon_living = "slaughter_demon" + + minimum_survivable_temperature = TCMB + + // slaughter demons are specifically intended to have low melee damage, but as they hit and build up their killstreak + // their wound bonuses grow and grow higher. this is how they're able to efficiently kill and slaughter their victims. + // consider this before you balance them. + obj_damage = 50 + melee_damage_lower = 15 + melee_damage_upper = 15 + wound_bonus = -10 + bare_wound_bonus = 0 + sharpness = SHARP_EDGED + + antag_type = /datum/antagonist/slaughter + + /// Datum that stores the action for us to crawl around. + var/crawl_type = /datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon + /// How long it takes for the alt-click slam attack to come off cooldown + var/slam_cooldown_time = 45 SECONDS + /// How many times we have hit humanoid targets since we last bloodcrawled, scaling wounding power + var/current_hitstreak = 0 + /// How much both our wound_bonus and bare_wound_bonus go up per hitstreak hit + var/wound_bonus_per_hit = 5 + /// How much our wound_bonus hitstreak bonus caps at (peak demonry) + var/wound_bonus_hitstreak_max = 12 + /// Cooldown tracker for the slam + COOLDOWN_DECLARE(slam_cooldown) + +/mob/living/basic/demon/slaughter/Initialize(mapload) + . = ..() + var/datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/crawl = new crawl_type(src) + crawl.Grant(src) + RegisterSignal(src, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(on_attack)) + RegisterSignals(src, list(COMSIG_MOB_ENTER_JAUNT, COMSIG_MOB_AFTER_EXIT_JAUNT), PROC_REF(on_crawl)) + +/mob/living/basic/demon/slaughter/grant_loot() + var/static/list/droppable_loot = list( + /obj/effect/decal/cleanable/blood, + /obj/effect/decal/cleanable/blood/innards, + /obj/item/organ/internal/heart/demon, + ) + + return droppable_loot + +/// Whenever we enter or exit blood crawl, reset our bonus and hitstreaks. +/mob/living/basic/demon/slaughter/proc/on_crawl(datum/source) + SIGNAL_HANDLER + + // Grant us a speed boost if we're on the mortal plane + if(isturf(loc)) + add_movespeed_modifier(/datum/movespeed_modifier/slaughter) + addtimer(CALLBACK(src, PROC_REF(remove_movespeed_modifier), /datum/movespeed_modifier/slaughter), 6 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) + + // Reset our streaks + current_hitstreak = 0 + wound_bonus = initial(wound_bonus) + bare_wound_bonus = initial(bare_wound_bonus) + +/// Performs the classic slaughter demon bodyslam on the attack_target. Yeets them a screen away. +/mob/living/basic/demon/slaughter/proc/bodyslam(atom/attack_target) + if(!isliving(attack_target)) + return + + if(!Adjacent(attack_target)) + to_chat(src, span_warning("You are too far away to use your slam attack on [attack_target]!")) + return + + if(!COOLDOWN_FINISHED(src, slam_cooldown)) + to_chat(src, span_warning("Your slam ability is still on cooldown!")) + return + + face_atom(attack_target) + + var/mob/living/victim = attack_target + victim.take_bodypart_damage(brute = 20, wound_bonus = wound_bonus) // don't worry, there's more punishment when they hit something + + visible_message( + span_danger("[src] slams into [victim] with monstrous strength!"), + span_danger("You slam into [victim] with monstrous strength!"), + ignored_mobs = victim, + ) + to_chat(victim, span_userdanger("[src] slams into you with monstrous strength, sending you flying like a ragdoll!")) + + var/turf/yeet_target = get_edge_target_turf(victim, dir) + victim.throw_at(yeet_target, 10, 5, src) + COOLDOWN_START(src, slam_cooldown, slam_cooldown_time) + log_combat(src, victim, "slaughter slammed") + +/// Proc that we execute on attacking someone to keep track of our hitstreaks and wound bonuses. Also handles triggering the bodyslam on attacks. +/mob/living/basic/demon/slaughter/proc/on_attack(mob/living/source, atom/attack_target, proximity_flag, list/modifiers) + SIGNAL_HANDLER + + if(LAZYACCESS(modifiers, RIGHT_CLICK)) + bodyslam(attack_target) + return COMPONENT_CANCEL_ATTACK_CHAIN + + if(!iscarbon(attack_target)) + return + + var/mob/living/carbon/target = attack_target + if(target.stat == DEAD || isnull(target.mind) || (current_hitstreak > wound_bonus_hitstreak_max)) + return + + current_hitstreak++ + wound_bonus += wound_bonus_per_hit + bare_wound_bonus += wound_bonus_per_hit + +/// The laughter demon! It's everyone's best friend! It just wants to hug them so much, it wants to hug everyone at once! +/mob/living/basic/demon/slaughter/laughter + name = "laughter demon" + real_name = "laughter demon" + desc = "A large, adorable creature covered in armor with pink bows." + speak_emote = list("giggles", "titters", "chuckles", "guffaws", "laughs") + response_help_continuous = "hugs" + attack_verb_continuous = "wildly tickles" + attack_verb_simple = "wildly tickle" + + attack_sound = 'sound/items/bikehorn.ogg' + attack_vis_effect = null + death_sound = 'sound/misc/sadtrombone.ogg' + + icon_state = "bow_demon" + icon_living = "bow_demon" + death_message = "fades out, as all of its friends are released from its prison of hugs." + + antag_type = /datum/antagonist/slaughter/laughter + crawl_type = /datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/funny + +/mob/living/basic/demon/slaughter/laughter/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_LIVING_DEATH, PROC_REF(on_death)) + if(check_holidays(APRIL_FOOLS)) + icon_state = "honk_demon" + +/mob/living/basic/demon/slaughter/laughter/grant_loot() + return list() // we do our thing... with the kittens... + +/// We do our own special thing on death, which is to spawn a kitten. +/mob/living/basic/demon/slaughter/laughter/proc/on_death() + SIGNAL_HANDLER + var/mob/living/simple_animal/pet/cat/kitten/kitty = new(drop_location()) + kitty.name = "Laughter" + +/mob/living/basic/demon/slaughter/laughter/ex_act(severity) + switch(severity) + if(EXPLODE_DEVASTATE) + investigate_log("has died from a devastating explosion.", INVESTIGATE_DEATHS) + death() + if(EXPLODE_HEAVY) + adjustBruteLoss(60) + if(EXPLODE_LIGHT) + adjustBruteLoss(30) + + return TRUE + +/mob/living/basic/demon/slaughter/engine_demon + name = "engine demon" + faction = list(FACTION_HELL, FACTION_NEUTRAL) diff --git a/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm b/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm new file mode 100644 index 0000000000000..47e43704079b4 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm @@ -0,0 +1,123 @@ +/mob/living/basic/eyeball + name = "eyeball" + desc = "An odd looking creature, it won't stop staring..." + icon = 'icons/mob/simple/carp.dmi' + icon_state = "eyeball" + icon_living = "eyeball" + icon_gib = "" + gender = NEUTER + gold_core_spawnable = HOSTILE_SPAWN + basic_mob_flags = DEL_ON_DEATH + gender = NEUTER + mob_biotypes = MOB_ORGANIC + + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + + maxHealth = 30 + health = 30 + obj_damage = 10 + melee_damage_lower = 8 + melee_damage_upper = 12 + + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + attack_sound = 'sound/weapons/bite.ogg' + attack_vis_effect = ATTACK_EFFECT_BITE + + faction = list(FACTION_SPOOKY) + speak_emote = list("telepathically cries") + + habitable_atmos = 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) + minimum_survivable_temperature = T0C + maximum_survivable_temperature = T0C + 1500 + sight = SEE_SELF|SEE_MOBS|SEE_OBJS|SEE_TURFS + + lighting_cutoff_red = 40 + lighting_cutoff_green = 20 + lighting_cutoff_blue = 30 + + ai_controller = /datum/ai_controller/basic_controller/eyeball + ///how much we will heal eyes + var/healing_factor = 3 + /// is this eyeball crying? + var/crying = FALSE + /// the crying overlay we add when is hit + var/mutable_appearance/on_hit_overlay + + ///cooldown to heal eyes + COOLDOWN_DECLARE(eye_healing) + +/mob/living/basic/eyeball/Initialize(mapload) + . = ..() + var/datum/action/cooldown/spell/pointed/death_glare/glare = new(src) + glare.Grant(src) + ai_controller.set_blackboard_key(BB_GLARE_ABILITY, glare) + AddElement(/datum/element/simple_flying) + AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/grown/carrot), tame_chance = 100, after_tame = CALLBACK(src, PROC_REF(on_tame))) + ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) + on_hit_overlay = mutable_appearance(icon, "[icon_state]_crying") + +/mob/living/basic/eyeball/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) + . = ..() + if(!.) + return + + if(!proximity_flag) + return + + if(istype(attack_target, /obj/item/food/grown/carrot)) + adjustBruteLoss(-5) + to_chat(src, span_warning("You eat [attack_target]! It restores some health!")) + qdel(attack_target) + return TRUE + +/mob/living/basic/eyeball/attackby(obj/item/weapon, mob/living/carbon/human/user, list/modifiers) + . = ..() + if(!weapon.force && !user.combat_mode) + return + if(crying) + return + change_crying_state() + addtimer(CALLBACK(src, PROC_REF(change_crying_state)), 10 SECONDS) //cry for 10 seconds then remove + +/mob/living/basic/eyeball/proc/change_crying_state() + crying = !crying + if(crying) + add_overlay(on_hit_overlay) + return + cut_overlay(on_hit_overlay) + + +/mob/living/basic/eyeball/proc/pre_attack(mob/living/eyeball, atom/target) + SIGNAL_HANDLER + + if(!ishuman(target)) + return + + var/mob/living/carbon/human_target = target + var/obj/item/organ/internal/eyes/eyes = human_target.get_organ_slot(ORGAN_SLOT_EYES) + if(!eyes) + return + if(eyes.damage < 10) + return + heal_eye_damage(human_target, eyes) + return COMPONENT_HOSTILE_NO_ATTACK + + +/mob/living/basic/eyeball/proc/heal_eye_damage(mob/living/target, obj/item/organ/internal/eyes/eyes) + if(!COOLDOWN_FINISHED(src, eye_healing)) + return + to_chat(target, span_warning("[src] seems to be healing your [eyes.zone]!")) + eyes.apply_organ_damage(-1 * healing_factor) + new /obj/effect/temp_visual/heal(get_turf(target), COLOR_HEALING_CYAN) + befriend(target) + COOLDOWN_START(src, eye_healing, 15 SECONDS) + +/mob/living/basic/eyeball/proc/on_tame(mob/tamer) + spin(spintime = 2 SECONDS, speed = 1) + //become passive to the humens + faction |= tamer.faction diff --git a/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ability.dm b/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ability.dm new file mode 100644 index 0000000000000..734c385cf7271 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ability.dm @@ -0,0 +1,40 @@ +/datum/action/cooldown/spell/pointed/death_glare + name = "death glare" + desc = "give a death stare to the victim" + var/glare_outline = COLOR_DARK_RED + spell_requirements = NONE + cooldown_time = 10 SECONDS + +/datum/action/cooldown/spell/pointed/death_glare/is_valid_target(atom/cast_on) + if(!isliving(cast_on)) + to_chat(owner, span_warning("Only living things are affected by our glare!")) + return FALSE + var/mob/living/living_target = cast_on + if(living_target.has_movespeed_modifier(/datum/movespeed_modifier/glare_slowdown)) + to_chat(owner, span_warning("This target is already affected by a glare!")) + return FALSE + if(!can_see(living_target, owner, 9)) + to_chat(owner, span_warning("This target cannot see our glare!")) + return FALSE + var/direction_to_compare = get_dir(living_target, owner) + var/target_direction = living_target.dir + if(direction_to_compare != target_direction) + to_chat(owner, span_warning("This target is facing away from us!")) + return FALSE + + return TRUE + +/datum/action/cooldown/spell/pointed/death_glare/cast(mob/living/cast_on) + . = ..() + cast_on.add_filter("glare", 2, list("type" = "outline", "color" = glare_outline, "size" = 1)) + cast_on.add_movespeed_modifier(/datum/movespeed_modifier/glare_slowdown) + to_chat(cast_on, span_warning("You feel something watching you...")) + addtimer(CALLBACK(src, PROC_REF(remove_effect), cast_on), 5 SECONDS) + return TRUE + +/datum/action/cooldown/spell/pointed/death_glare/proc/remove_effect(mob/living/cast_on) + cast_on.remove_movespeed_modifier(/datum/movespeed_modifier/glare_slowdown) + cast_on.remove_filter("glare") + +/datum/movespeed_modifier/glare_slowdown + multiplicative_slowdown = 3 diff --git a/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_behavior.dm b/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_behavior.dm new file mode 100644 index 0000000000000..57ea39c94dd5c --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_behavior.dm @@ -0,0 +1,94 @@ +/datum/ai_behavior/find_the_blind + +/datum/ai_behavior/find_the_blind/perform(seconds_per_tick, datum/ai_controller/controller, blind_key, threshold_key) + . = ..() + + var/mob/living_pawn = controller.pawn + var/list/blind_list = list() + var/eye_damage_threshold = controller.blackboard[threshold_key] + if(!eye_damage_threshold) + finish_action(controller, FALSE) + return + for(var/mob/living/carbon/blind in oview(9, living_pawn)) + var/obj/item/organ/internal/eyes/eyes = blind.get_organ_slot(ORGAN_SLOT_EYES) + if(isnull(eyes)) + continue + if(eyes.damage < eye_damage_threshold) + continue + blind_list += blind + + if(!length(blind_list)) + finish_action(controller, FALSE) + return + + controller.set_blackboard_key(blind_key, pick(blind_list)) + finish_action(controller, TRUE) + +/datum/ai_behavior/heal_eye_damage + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH + +/datum/ai_behavior/heal_eye_damage/setup(datum/ai_controller/controller, target_key) + . = ..() + var/mob/living/carbon/target = controller.blackboard[target_key] + if(QDELETED(target)) + return FALSE + set_movement_target(controller, target) + +/datum/ai_behavior/heal_eye_damage/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + + var/mob/living/carbon/target = controller.blackboard[target_key] + var/mob/living/living_pawn = controller.pawn + + if(QDELETED(target)) + finish_action(controller, FALSE, target_key) + return + var/obj/item/organ/internal/eyes/eyes = target.get_organ_slot(ORGAN_SLOT_EYES) + var/datum/callback/callback = CALLBACK(living_pawn, TYPE_PROC_REF(/mob/living/basic/eyeball, heal_eye_damage), target, eyes) + callback.Invoke() + + finish_action(controller, TRUE, target_key) + +/datum/ai_behavior/heal_eye_damage/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + controller.clear_blackboard_key(target_key) + +/datum/ai_behavior/targeted_mob_ability/glare_at_target + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT + required_distance = 0 + +/datum/ai_behavior/targeted_mob_ability/glare_at_target/setup(datum/ai_controller/controller, ability_key, target_key) + . = ..() + var/atom/target = controller.blackboard[target_key] + if (isnull(target)) + return FALSE + + var/turf/turf_to_move_towards = get_step(target, target.dir) + if(turf_to_move_towards.is_blocked_turf(ignore_atoms = list(controller.pawn))) + return FALSE + + if(isnull(turf_to_move_towards)) + return FALSE + + set_movement_target(controller, turf_to_move_towards) + +/datum/ai_behavior/targeted_mob_ability/glare_at_target/perform(seconds_per_tick, datum/ai_controller/controller, ability_key, target_key) + var/datum/action/cooldown/ability = controller.blackboard[ability_key] + var/mob/living/target = controller.blackboard[target_key] + + if(QDELETED(ability) || QDELETED(target)) + finish_action(controller, FALSE, ability_key, target_key) + return + + var/direction_to_compare = get_dir(target, controller.pawn) + var/target_direction = target.dir + if(direction_to_compare != target_direction) + finish_action(controller, FALSE, ability_key, target_key) + return + + var/result = ability.InterceptClickOn(controller.pawn, null, target) + finish_action(controller, result, ability_key, target_key) + +/datum/ai_behavior/hunt_target/unarmed_attack_target/carrot + hunt_cooldown = 2 SECONDS + always_reset_target = TRUE diff --git a/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_subtree.dm b/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_subtree.dm new file mode 100644 index 0000000000000..a3c8e22071d5d --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_subtree.dm @@ -0,0 +1,52 @@ +/datum/ai_controller/basic_controller/eyeball + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/eyeball, + BB_EYE_DAMAGE_THRESHOLD = 10, + ) + + 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/targeted_mob_ability/glare, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/heal_the_blind, + /datum/ai_planning_subtree/find_and_hunt_target/carrot, + ) + +/datum/ai_planning_subtree/heal_the_blind + +/datum/ai_planning_subtree/heal_the_blind/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(controller.blackboard_key_exists(BB_BLIND_TARGET)) + controller.queue_behavior(/datum/ai_behavior/heal_eye_damage, BB_BLIND_TARGET) + return SUBTREE_RETURN_FINISH_PLANNING + controller.queue_behavior(/datum/ai_behavior/find_the_blind, BB_BLIND_TARGET, BB_EYE_DAMAGE_THRESHOLD) + +/datum/targetting_datum/basic/eyeball/can_attack(mob/living/owner, atom/target) + . = ..() + if(!.) + return FALSE + if(!ishuman(target)) + return TRUE + var/mob/living/carbon/human_target = target + if(human_target.is_blind()) + return FALSE + var/eye_damage_threshold = owner.ai_controller.blackboard[BB_EYE_DAMAGE_THRESHOLD] + if(!eye_damage_threshold) + return TRUE + var/obj/item/organ/internal/eyes/eyes = human_target.get_organ_slot(ORGAN_SLOT_EYES) + if(eyes.damage > eye_damage_threshold) //we dont attack people with bad vision + return FALSE + + return can_see(target, owner, 9) //if the target cant see us dont attack him + +/datum/ai_planning_subtree/targeted_mob_ability/glare + ability_key = BB_GLARE_ABILITY + use_ability_behaviour = /datum/ai_behavior/targeted_mob_ability/glare_at_target + finish_planning = TRUE + +/datum/ai_planning_subtree/find_and_hunt_target/carrot + target_key = BB_LOW_PRIORITY_HUNTING_TARGET + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/carrot + hunt_targets = list(/obj/item/food/grown/carrot) + hunt_range = 6 diff --git a/code/modules/mob/living/basic/space_fauna/faithless.dm b/code/modules/mob/living/basic/space_fauna/faithless.dm index b279856412c3b..c1dc297ea46a6 100644 --- a/code/modules/mob/living/basic/space_fauna/faithless.dm +++ b/code/modules/mob/living/basic/space_fauna/faithless.dm @@ -18,6 +18,7 @@ attack_verb_continuous = "grips" attack_verb_simple = "grip" attack_sound = 'sound/hallucinations/growl1.ogg' + melee_attack_cooldown = 1 SECONDS speak_emote = list("growls") unsuitable_atmos_damage = 0 @@ -29,12 +30,29 @@ ai_controller = /datum/ai_controller/basic_controller/faithless + /// What are the odds we paralyze a target on attack + var/paralyze_chance = 12 + /// How long do we paralyze a target for if we attack them + var/paralyze_duration = 2 SECONDS + /mob/living/basic/faithless/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) AddElement(/datum/element/footstep, FOOTSTEP_MOB_SHOE) + AddElement(/datum/element/mob_grabber, steal_from_others = FALSE) AddComponent(/datum/component/pry_open_door) +/mob/living/basic/faithless/melee_attack(atom/target, list/modifiers, ignore_cooldown) + . = ..() + if (!. || !isliving(target)) + return + + var/mob/living/living_target = target + if (prob(paralyze_chance)) + living_target.Paralyze(paralyze_duration) + living_target.visible_message(span_danger("\The [src] knocks \the [target] down!"), \ + span_userdanger("\The [src] knocks you down!")) + /datum/ai_controller/basic_controller/faithless blackboard = list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/faithless(), @@ -47,37 +65,10 @@ /datum/ai_planning_subtree/simple_find_target, /datum/ai_planning_subtree/attack_obstacle_in_path, /datum/ai_planning_subtree/attack_obstacle_in_path/low_priority_target, - /datum/ai_planning_subtree/basic_melee_attack_subtree/faithless, + /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/find_and_hunt_target/look_for_light_fixtures, /datum/ai_planning_subtree/random_speech/faithless, ) /datum/targetting_datum/basic/faithless stat_attack = UNCONSCIOUS - -/datum/ai_planning_subtree/basic_melee_attack_subtree/faithless - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/faithless - -/datum/ai_behavior/basic_melee_attack/faithless - action_cooldown = 1 SECONDS - /// What are the odds we paralyze a target - var/paralyze_chance = 12 - /// How long do we paralyze a target for if we attack them - var/paralyze_duration = 2 SECONDS - -/datum/ai_behavior/basic_melee_attack/faithless/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) - . = ..() - var/atom/target = controller.blackboard[target_key] - var/mob/living/living_pawn = controller.pawn - - if(!isliving(target)) - return - var/mob/living/living_target = target - if(living_target.pulledby != living_pawn && !HAS_AI_CONTROLLER_TYPE(living_target.pulledby, /datum/ai_controller/basic_controller/faithless)) //Dont steal from my fellow faithless. - if(living_pawn.Adjacent(living_target) && isturf(living_target.loc) && living_target.stat == SOFT_CRIT) - living_target.grabbedby(living_pawn) //Drag their bodies around as a menace. - if(prob(paralyze_chance) && iscarbon(target)) - var/mob/living/carbon/carbon_target = target - carbon_target.Paralyze(paralyze_duration) - carbon_target.visible_message(span_danger("\The [living_pawn] knocks down \the [carbon_target]!"), \ - span_userdanger("\The [living_pawn] knocks you down!")) diff --git a/code/modules/mob/living/basic/space_fauna/garden_gnome.dm b/code/modules/mob/living/basic/space_fauna/garden_gnome.dm index 034bf0deb0faa..d9dfc3c534328 100644 --- a/code/modules/mob/living/basic/space_fauna/garden_gnome.dm +++ b/code/modules/mob/living/basic/space_fauna/garden_gnome.dm @@ -17,6 +17,7 @@ attack_verb_continuous = "punches" attack_verb_simple = "punch" attack_sound = 'sound/weapons/punch1.ogg' + melee_attack_cooldown = 1.2 SECONDS damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) speak_emote = list("announces") @@ -103,7 +104,7 @@ var/datum/callback/retaliate_callback = CALLBACK(src, PROC_REF(ai_retaliate_behaviour)) chosen_hat_colour = pick_weight(gnome_hat_colours) apply_colour() - AddElement(/datum/element/death_drops, list(/obj/effect/gibspawner/generic)) + AddElement(/datum/element/death_drops, string_list(list(/obj/effect/gibspawner/generic))) AddElement(/datum/element/footstep, FOOTSTEP_MOB_SHOE) AddComponent(/datum/component/ai_retaliate_advanced, retaliate_callback) AddComponent(/datum/component/swarming) @@ -132,12 +133,6 @@ planning_subtrees = list( /datum/ai_planning_subtree/target_retaliate, /datum/ai_planning_subtree/attack_obstacle_in_path, - /datum/ai_planning_subtree/basic_melee_attack_subtree/garden_gnome, + /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/random_speech/garden_gnome, ) - -/datum/ai_planning_subtree/basic_melee_attack_subtree/garden_gnome - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/garden_gnome - -/datum/ai_behavior/basic_melee_attack/garden_gnome - action_cooldown = 1.2 SECONDS diff --git a/code/modules/mob/living/basic/space_fauna/ghost.dm b/code/modules/mob/living/basic/space_fauna/ghost.dm index 9a4f476f42b79..058c2d2cd3f40 100644 --- a/code/modules/mob/living/basic/space_fauna/ghost.dm +++ b/code/modules/mob/living/basic/space_fauna/ghost.dm @@ -72,14 +72,14 @@ if(!isnull(ghost_hairstyle) && ghost_hairstyle != "Bald") //Bald hairstyle and the Shaved facial hairstyle lack an associated sprite and will not properly generate hair, and just cause runtimes. var/datum/sprite_accessory/hair_style = GLOB.hairstyles_list[ghost_hairstyle] //We use the hairstyle name to get the sprite accessory, which we copy the icon_state from. - ghost_hair = mutable_appearance('icons/mob/species/human/human_face.dmi', "[hair_style.icon_state]", -HAIR_LAYER) + ghost_hair = mutable_appearance('icons/mob/human/human_face.dmi', "[hair_style.icon_state]", -HAIR_LAYER) ghost_hair.alpha = 200 ghost_hair.color = ghost_hair_color add_overlay(ghost_hair) if(!isnull(ghost_facial_hairstyle) && ghost_facial_hairstyle != "Shaved") var/datum/sprite_accessory/facial_hair_style = GLOB.facial_hairstyles_list[ghost_facial_hairstyle] - ghost_facial_hair = mutable_appearance('icons/mob/species/human/human_face.dmi', "[facial_hair_style.icon_state]", -HAIR_LAYER) + ghost_facial_hair = mutable_appearance('icons/mob/human/human_face.dmi', "[facial_hair_style.icon_state]", -HAIR_LAYER) ghost_facial_hair.alpha = 200 ghost_facial_hair.color = ghost_facial_hair_color add_overlay(ghost_facial_hair) diff --git a/code/modules/mob/living/basic/space_fauna/headslug.dm b/code/modules/mob/living/basic/space_fauna/headslug.dm index faa934e331404..a417b6c13942b 100644 --- a/code/modules/mob/living/basic/space_fauna/headslug.dm +++ b/code/modules/mob/living/basic/space_fauna/headslug.dm @@ -18,6 +18,7 @@ attack_verb_simple = "chomp" attack_sound = 'sound/weapons/bite.ogg' attack_vis_effect = ATTACK_EFFECT_BITE + mob_biotypes = MOB_ORGANIC|MOB_SPECIAL faction = list(FACTION_CREATURE) obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE @@ -39,10 +40,13 @@ /mob/living/basic/headslug/examine(mob/user) . = ..() - if(isnull(client)) - . += span_notice("It appears to be moving around listlessly.") - else - . += span_warning("It's moving around intelligently!") + if(stat != DEAD) + if(isnull(client)) + . += span_notice("It appears to be moving around listlessly.") + else + . += span_warning("It's moving around intelligently!") + if (egg_lain) + . += span_notice("Its reproductive equipment appears to have withered.") /// Signal Handler proc that runs on every attack and checks to see if this is a valid target for implantation. If so, it implants the egg and starts the countdown to death. /mob/living/basic/headslug/proc/check_and_implant(mob/living/basic/attacker, atom/target) @@ -52,7 +56,7 @@ return var/mob/living/carbon/victim = target - if(victim.stat == DEAD) + if(victim.stat != DEAD) return if(HAS_TRAIT(victim, TRAIT_XENO_HOST)) target.balloon_alert(src, "already pregnant!") // Maybe the worst balloon alert in the codebase @@ -90,3 +94,7 @@ /datum/ai_controller/basic_controller/headslug ai_movement = /datum/ai_movement/basic_avoidance idle_behavior = /datum/idle_behavior/idle_random_walk + +/// Neutered version to prevent people from turning themselves into changelings with sentience potions or transformation +/mob/living/basic/headslug/beakless + egg_lain = TRUE diff --git a/code/modules/mob/living/basic/space_fauna/hivebot/_hivebot.dm b/code/modules/mob/living/basic/space_fauna/hivebot/_hivebot.dm new file mode 100644 index 0000000000000..db0d310a71c77 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/hivebot/_hivebot.dm @@ -0,0 +1,143 @@ +/mob/living/basic/hivebot + name = "hivebot" + desc = "A small robot." + icon = 'icons/mob/simple/hivebot.dmi' + icon_state = "basic" + icon_living = "basic" + icon_dead = "basic" + basic_mob_flags = DEL_ON_DEATH + gender = NEUTER + mob_biotypes = MOB_ROBOTIC + + health = 15 + maxHealth = 15 + melee_damage_lower = 2 + melee_damage_upper = 3 + + attack_verb_continuous = "claws" + attack_verb_simple = "claw" + attack_sound = 'sound/weapons/bladeslice.ogg' + attack_vis_effect = ATTACK_EFFECT_CLAW + verb_say = "states" + verb_ask = "queries" + verb_exclaim = "declares" + verb_yell = "alarms" + bubble_icon = "machine" + + faction = list(FACTION_HIVEBOT) + combat_mode = TRUE + speech_span = SPAN_ROBOT + death_message = "blows apart!" + + habitable_atmos = 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) + minimum_survivable_temperature = TCMB + ai_controller = /datum/ai_controller/basic_controller/hivebot + ///does this type do range attacks? + var/ranged_attacker = FALSE + /// How often can we shoot? + var/ranged_attack_cooldown = 3 SECONDS + + +/mob/living/basic/hivebot/Initialize(mapload) + . = ..() + var/static/list/death_loot = list(/obj/effect/decal/cleanable/robot_debris) + AddElement(/datum/element/death_drops, death_loot) + AddComponent(/datum/component/appearance_on_aggro, overlay_icon = icon, overlay_state = "[initial(icon_state)]_attack") + if(!ranged_attacker) + return + AddComponent(/datum/component/ranged_attacks, /obj/item/ammo_casing/hivebot, cooldown_time = ranged_attack_cooldown) + +/mob/living/basic/hivebot/death(gibbed) + do_sparks(number = 3, cardinal_only = TRUE, source = src) + return ..() + +/mob/living/basic/hivebot/range + name = "hivebot" + desc = "A smallish robot, this one is armed!" + icon_state = "ranged" + icon_living = "ranged" + icon_dead = "ranged" + ranged_attacker = TRUE + ai_controller = /datum/ai_controller/basic_controller/hivebot/ranged + +/mob/living/basic/hivebot/rapid + icon_state = "ranged" + icon_living = "ranged" + icon_dead = "ranged" + ranged_attacker = TRUE + ai_controller = /datum/ai_controller/basic_controller/hivebot/ranged/rapid + ranged_attack_cooldown = 1.5 SECONDS + +/mob/living/basic/hivebot/strong + name = "strong hivebot" + icon_state = "strong" + icon_living = "strong" + icon_dead = "strong" + desc = "A robot, this one is armed and looks tough!" + health = 80 + maxHealth = 80 + ranged_attacker = TRUE + ai_controller = /datum/ai_controller/basic_controller/hivebot/ranged + +/mob/living/basic/hivebot/mechanic + name = "hivebot mechanic" + icon_state = "strong" + icon_living = "strong" + icon_dead = "strong" + desc = "A robot built for base upkeep, intended for use inside hivebot colonies." + health = 60 + maxHealth = 60 + gold_core_spawnable = HOSTILE_SPAWN + ranged_attacker = TRUE + ai_controller = /datum/ai_controller/basic_controller/hivebot/mechanic + ///cooldown to repair machines + COOLDOWN_DECLARE(repair_cooldown) + +/mob/living/basic/hivebot/mechanic/Initialize(mapload) + . = ..() + var/datum/action/cooldown/spell/conjure/foam_wall/foam = new(src) + foam.Grant(src) + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) + +/mob/living/basic/hivebot/mechanic/proc/pre_attack(mob/living/fixer, atom/target) + SIGNAL_HANDLER + + if(ismachinery(target)) + repair_machine(target) + return COMPONENT_HOSTILE_NO_ATTACK + + if(istype(target, /mob/living/basic/hivebot)) + repair_hivebot(target) + return COMPONENT_HOSTILE_NO_ATTACK + +/mob/living/basic/hivebot/mechanic/proc/repair_machine(obj/machinery/fixable) + if(fixable.get_integrity() >= fixable.max_integrity) + to_chat(src, span_warning("Diagnostics indicate that this machine is at peak integrity.")) + return + if(!COOLDOWN_FINISHED(src, repair_cooldown)) + balloon_alert(src, "recharging!") + return + fixable.repair_damage(fixable.max_integrity - fixable.get_integrity()) + do_sparks(number = 3, cardinal_only = TRUE, source = fixable) + to_chat(src, span_warning("Repairs complete!")) + COOLDOWN_START(src, repair_cooldown, 50 SECONDS) + +/mob/living/basic/hivebot/mechanic/proc/repair_hivebot(mob/living/basic/bot_target) + if(bot_target.health >= bot_target.maxHealth) + to_chat(src, span_warning("Diagnostics indicate that this unit is at peak integrity.")) + return + if(!COOLDOWN_FINISHED(src, repair_cooldown)) + balloon_alert(src, "recharging!") + return + bot_target.revive(HEAL_ALL) + do_sparks(number = 3, cardinal_only = TRUE, source = bot_target) + to_chat(src, span_warning("Repairs complete!")) + COOLDOWN_START(src, repair_cooldown, 50 SECONDS) + +/obj/item/ammo_casing/hivebot + name = "hivebot bullet casing" + projectile_type = /obj/projectile/hivebotbullet + +/obj/projectile/hivebotbullet + damage = 10 + damage_type = BRUTE diff --git a/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_behavior.dm b/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_behavior.dm new file mode 100644 index 0000000000000..28cffa4ed8e32 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_behavior.dm @@ -0,0 +1,71 @@ +/datum/ai_behavior/find_and_set/hive_partner + +/datum/ai_behavior/find_and_set/hive_partner/search_tactic(datum/ai_controller/controller, locate_path, search_range) + var/mob/living/living_pawn = controller.pawn + var/list/hive_partners = list() + for(var/mob/living/target in oview(10, living_pawn)) + if(!istype(target, locate_path)) + continue + if(target.stat == DEAD) + continue + hive_partners += target + + if(length(hive_partners)) + return pick(hive_partners) + +/// behavior that allow us to go communicate with other hivebots +/datum/ai_behavior/relay_message + ///length of the message we will relay + var/length_of_message = 4 + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT| AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + + +/datum/ai_behavior/relay_message/setup(datum/ai_controller/controller, target_key) + . = ..() + var/mob/living/target = controller.blackboard[target_key] + // It stopped existing + if(QDELETED(target)) + return FALSE + set_movement_target(controller, target) + + +/datum/ai_behavior/relay_message/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + + var/mob/living/target = controller.blackboard[target_key] + var/mob/living/living_pawn = controller.pawn + + if(QDELETED(target)) + finish_action(controller, FALSE, target_key) + return + var/message_relayed = "" + for(var/i in 1 to length_of_message) + message_relayed += prob(50) ? "1" : "0" + living_pawn.say(message_relayed, forced = "AI Controller") + finish_action(controller, TRUE, target_key) + +/datum/ai_behavior/relay_message/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + controller.clear_blackboard_key(target_key) + +/datum/ai_behavior/find_hunt_target/repair_machines + +/datum/ai_behavior/find_hunt_target/repair_machines/valid_dinner(mob/living/source, obj/machinery/repair_target, radius) + if(repair_target.get_integrity() >= repair_target.max_integrity) + return FALSE + + return can_see(source, repair_target, radius) + +/datum/ai_behavior/hunt_target/repair_machines + always_reset_target = TRUE + +/datum/ai_behavior/hunt_target/repair_machines/target_caught(mob/living/basic/hivebot/mechanic/hunter, obj/machinery/repair_target) + hunter.repair_machine(repair_target) + +/datum/ai_behavior/basic_ranged_attack/hivebot + action_cooldown = 3 SECONDS + avoid_friendly_fire = TRUE + +/datum/ai_behavior/basic_ranged_attack/hivebot_rapid + action_cooldown = 1.5 SECONDS + avoid_friendly_fire = TRUE diff --git a/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_subtree.dm b/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_subtree.dm new file mode 100644 index 0000000000000..5bd957a760972 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_subtree.dm @@ -0,0 +1,68 @@ +/datum/ai_controller/basic_controller/hivebot + 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, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/hive_communicate, + ) + +/datum/ai_controller/basic_controller/hivebot/mechanic + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_ranged_attack_subtree, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/find_and_hunt_target/repair_machines, + /datum/ai_planning_subtree/hive_communicate, + ) + +/datum/ai_controller/basic_controller/hivebot/ranged + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_ranged_attack_subtree/hivebot, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/hive_communicate, + ) + +/datum/ai_controller/basic_controller/hivebot/ranged/rapid + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_ranged_attack_subtree/hivebot_rapid, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/hive_communicate, + ) + + +/datum/ai_planning_subtree/basic_ranged_attack_subtree/hivebot_rapid + ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/hivebot_rapid + + +/datum/ai_planning_subtree/basic_ranged_attack_subtree/hivebot + ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/hivebot + +/datum/ai_planning_subtree/hive_communicate + ///chance to go and relay message + var/relay_chance = 10 + +/datum/ai_planning_subtree/hive_communicate/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + + if(!SPT_PROB(relay_chance, seconds_per_tick)) + return + + if (controller.blackboard_key_exists(BB_HIVE_PARTNER)) + controller.queue_behavior(/datum/ai_behavior/relay_message, BB_HIVE_PARTNER) + return SUBTREE_RETURN_FINISH_PLANNING + controller.queue_behavior(/datum/ai_behavior/find_and_set/hive_partner, BB_HIVE_PARTNER, /mob/living/basic/hivebot) + +/datum/ai_planning_subtree/find_and_hunt_target/repair_machines + target_key = BB_MACHINE_TARGET + hunting_behavior = /datum/ai_behavior/hunt_target/repair_machines + finding_behavior = /datum/ai_behavior/find_hunt_target/repair_machines + hunt_targets = list(/obj/machinery) + hunt_range = 10 + hunt_chance = 35 diff --git a/code/modules/mob/living/basic/space_fauna/lightgeist.dm b/code/modules/mob/living/basic/space_fauna/lightgeist.dm index 5cb9bb2b39bb4..c70588f4502b4 100644 --- a/code/modules/mob/living/basic/space_fauna/lightgeist.dm +++ b/code/modules/mob/living/basic/space_fauna/lightgeist.dm @@ -21,6 +21,7 @@ health = 2 melee_damage_lower = 5 melee_damage_upper = 5 + melee_attack_cooldown = 5 SECONDS friendly_verb_continuous = "taps" friendly_verb_simple = "tap" density = FALSE @@ -65,15 +66,49 @@ complete_text = "%TARGET%'s wounds mend together.",\ ) +/mob/living/basic/lightgeist/melee_attack(atom/target, list/modifiers, ignore_cooldown = FALSE) + . = ..() + if (. && isliving(target)) + faction |= REF(target) // Anyone we heal will treat us as a friend /mob/living/basic/lightgeist/ghost() . = ..() if(.) death() -/// This is a bit neutered since these aren't intended to exist outside of player control, but it's a bit weird to just have these guys be completely stationary. -/// No attacking or anything like that, though. Just something so they seem alive. /datum/ai_controller/basic_controller/lightgeist + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/lightgeist, + ) + ai_traits = STOP_MOVING_WHEN_PULLED ai_movement = /datum/ai_movement/basic_avoidance idle_behavior = /datum/idle_behavior/idle_random_walk/less_walking + + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_melee_attack_subtree, // We heal things by attacking them + ) + +/// Attack only mobs who have damage that we can heal, I think this is specific enough not to be a generic type +/datum/targetting_datum/lightgeist + /// Types of mobs we can heal, not in a blackboard key because there is no point changing this at runtime because the component will already exist + var/heal_biotypes = MOB_ORGANIC | MOB_MINERAL + /// Type of limb we can heal + var/required_bodytype = BODYTYPE_ORGANIC + +/datum/targetting_datum/lightgeist/can_attack(mob/living/living_mob, mob/living/target) + if (!isliving(target) || target.stat == DEAD) + return FALSE + if (!(heal_biotypes & target.mob_biotypes)) + return FALSE + if (!iscarbon(target)) + return target.getBruteLoss() > 0 || target.getFireLoss() > 0 + var/mob/living/carbon/carbon_target = target + for (var/obj/item/bodypart/part in carbon_target.bodyparts) + if (!part.brute_dam && !part.burn_dam) + continue + if (!(part.bodytype & required_bodytype)) + continue + return TRUE + return FALSE diff --git a/code/modules/mob/living/basic/space_fauna/meteor_heart/chasing_spikes.dm b/code/modules/mob/living/basic/space_fauna/meteor_heart/chasing_spikes.dm index 061553c873314..a0f9d2fb51be7 100644 --- a/code/modules/mob/living/basic/space_fauna/meteor_heart/chasing_spikes.dm +++ b/code/modules/mob/living/basic/space_fauna/meteor_heart/chasing_spikes.dm @@ -1,68 +1,36 @@ /// An ability which makes spikes come out of the ground towards your target -/datum/action/cooldown/chasing_spikes +/datum/action/cooldown/mob_cooldown/chasing_spikes name = "impaling tendril" desc = "Send a spiked subterranean tendril chasing after your target." button_icon = 'icons/mob/simple/meteor_heart.dmi' button_icon_state = "spike" cooldown_time = 10 SECONDS click_to_activate = TRUE + shared_cooldown = NONE /// Lazy list of references to spike trails var/list/active_chasers -/datum/action/cooldown/chasing_spikes/Activate(atom/target) +/datum/action/cooldown/mob_cooldown/chasing_spikes/Activate(atom/target) . = ..() playsound(owner, 'sound/magic/demon_attack1.ogg', vol = 100, vary = TRUE, pressure_affected = FALSE) - var/obj/effect/temp_visual/spike_chaser/chaser = new(get_turf(owner), target) + var/obj/effect/temp_visual/effect_trail/spike_chaser/chaser = new(get_turf(owner), target) LAZYADD(active_chasers, WEAKREF(chaser)) RegisterSignal(chaser, COMSIG_QDELETING, PROC_REF(on_chaser_destroyed)) /// Remove a spike trail from our list of active trails -/datum/action/cooldown/chasing_spikes/proc/on_chaser_destroyed(atom/chaser) +/datum/action/cooldown/mob_cooldown/chasing_spikes/proc/on_chaser_destroyed(atom/chaser) SIGNAL_HANDLER LAZYREMOVE(active_chasers, WEAKREF(chaser)) // Clean up after ourselves -/datum/action/cooldown/chasing_spikes/Remove(mob/removed_from) +/datum/action/cooldown/mob_cooldown/chasing_spikes/Remove(mob/removed_from) QDEL_LIST(active_chasers) return ..() /// An invisible effect which chases a target, spawning spikes every so often. -/obj/effect/temp_visual/spike_chaser +/obj/effect/temp_visual/effect_trail/spike_chaser name = "spike chaser" - desc = "An invisible effect, how did you examine this?" - icon = 'icons/mob/silicon/cameramob.dmi' - icon_state = "marker" - duration = 15 SECONDS - invisibility = INVISIBILITY_ABSTRACT - /// Speed at which we chase target - var/move_speed = 3 - /// What are we chasing? - var/datum/weakref/target - /// Handles chasing the target - var/datum/move_loop/movement - -/obj/effect/temp_visual/spike_chaser/Initialize(mapload, atom/target) - . = ..() - if (!target) - return INITIALIZE_HINT_QDEL - - AddElement(/datum/element/floor_loving) - AddComponent(/datum/component/spawner, spawn_types = list(/obj/effect/temp_visual/emerging_ground_spike), spawn_time = 0.5 SECONDS) - src.target = WEAKREF(target) - movement = SSmove_manager.move_towards(src, chasing = target, delay = move_speed, home = TRUE, timeout = duration, flags = MOVEMENT_LOOP_START_FAST) - - RegisterSignal(target, COMSIG_QDELETING, PROC_REF(on_target_invalid)) - if (isliving(target)) - RegisterSignal(target, COMSIG_LIVING_DEATH, PROC_REF(on_target_invalid)) - -/// Destroy ourselves if the target is no longer valid -/obj/effect/temp_visual/spike_chaser/proc/on_target_invalid() - SIGNAL_HANDLER - qdel(src) - -/obj/effect/temp_visual/spike_chaser/Destroy() - QDEL_NULL(movement) - return ..() + spawned_effect = /obj/effect/temp_visual/emerging_ground_spike /// A spike comes out of the ground, dealing damage after a short delay /obj/effect/temp_visual/emerging_ground_spike diff --git a/code/modules/mob/living/basic/space_fauna/meteor_heart/meteor_heart.dm b/code/modules/mob/living/basic/space_fauna/meteor_heart/meteor_heart.dm index 07c9205de093e..5829b52e43732 100644 --- a/code/modules/mob/living/basic/space_fauna/meteor_heart/meteor_heart.dm +++ b/code/modules/mob/living/basic/space_fauna/meteor_heart/meteor_heart.dm @@ -26,16 +26,17 @@ combat_mode = TRUE move_resist = INFINITY // This mob IS the floor /// Action which sends a line of spikes chasing a player - var/datum/action/cooldown/chasing_spikes/spikes + var/datum/action/cooldown/mob_cooldown/chasing_spikes/spikes /// Action which summons areas the player can't stand in - var/datum/action/cooldown/spine_traps/traps + var/datum/action/cooldown/mob_cooldown/spine_traps/traps /// Looping heartbeat sound var/datum/looping_sound/heartbeat/soundloop /mob/living/basic/meteor_heart/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_IMMOBILIZED, INNATE_TRAIT) - AddElement(/datum/element/death_drops, list(/obj/effect/temp_visual/meteor_heart_death)) + var/static/list/death_loot = list(/obj/effect/temp_visual/meteor_heart_death) + AddElement(/datum/element/death_drops, death_loot) AddElement(/datum/element/relay_attackers) spikes = new(src) @@ -76,7 +77,7 @@ soundloop.set_mid_length(HEARTBEAT_NORMAL) /// Animate when using certain abilities -/mob/living/basic/meteor_heart/proc/used_ability(mob/living/owner, datum/action/cooldown/ability) +/mob/living/basic/meteor_heart/proc/used_ability(mob/living/owner, datum/action/cooldown/mob_cooldown/ability) SIGNAL_HANDLER if (ability != spikes) return diff --git a/code/modules/mob/living/basic/space_fauna/meteor_heart/spine_traps.dm b/code/modules/mob/living/basic/space_fauna/meteor_heart/spine_traps.dm index a2a3b52b8356e..4f7135b1debab 100644 --- a/code/modules/mob/living/basic/space_fauna/meteor_heart/spine_traps.dm +++ b/code/modules/mob/living/basic/space_fauna/meteor_heart/spine_traps.dm @@ -1,10 +1,12 @@ /// Marks several areas with thrusting spines which damage and slow people -/datum/action/cooldown/spine_traps +/datum/action/cooldown/mob_cooldown/spine_traps name = "thrusting spines" desc = "Mark several nearby areas with thrusting spines, which will spring up when disturbed." button_icon = 'icons/mob/simple/meteor_heart.dmi' button_icon_state = "spikes_stabbing" cooldown_time = 15 SECONDS + shared_cooldown = NONE + click_to_activate = FALSE /// Create zones at most this far away var/range = 3 /// Don't create zones within this radius @@ -12,7 +14,7 @@ /// Number of zones to place var/zones_to_create = 3 -/datum/action/cooldown/spine_traps/Activate(atom/target) +/datum/action/cooldown/mob_cooldown/spine_traps/Activate(atom/target) . = ..() playsound(owner, 'sound/magic/demon_consume.ogg', vol = 100, falloff_exponent = 2, vary = TRUE, pressure_affected = FALSE) @@ -31,11 +33,11 @@ created++ /// Returns true if we can place a trap at the specified location -/datum/action/cooldown/spine_traps/proc/is_valid_turf(turf/target_turf) +/datum/action/cooldown/mob_cooldown/spine_traps/proc/is_valid_turf(turf/target_turf) return !target_turf.is_blocked_turf(exclude_mobs = TRUE) && !isspaceturf(target_turf) && !isopenspaceturf(target_turf) /// Places a 3x3 area of spike traps around a central provided point, returns the list of now occupied turfs -/datum/action/cooldown/spine_traps/proc/place_zone(turf/target_turf) +/datum/action/cooldown/mob_cooldown/spine_traps/proc/place_zone(turf/target_turf) var/list/used_turfs = list() for (var/turf/zone_turf in range(1, target_turf)) if (!is_valid_turf(zone_turf)) diff --git a/code/modules/mob/living/basic/space_fauna/morph.dm b/code/modules/mob/living/basic/space_fauna/morph.dm new file mode 100644 index 0000000000000..32115d0560255 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/morph.dm @@ -0,0 +1,214 @@ +/// The classic morph, Corpus Accipientis (or "The body of the recipient"). It's a blob that can disguise itself as other things simply put. +/mob/living/basic/morph + name = "morph" + real_name = "morph" + desc = "A revolting, pulsating pile of flesh." + speak_emote = list("gurgles") + icon = 'icons/mob/simple/animal.dmi' + icon_state = "morph" + icon_living = "morph" + icon_dead = "morph_dead" + combat_mode = TRUE + + mob_biotypes = MOB_BEAST + pass_flags = PASSTABLE + + maxHealth = 150 + health = 150 + habitable_atmos = 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) + minimum_survivable_temperature = TCMB + + obj_damage = 50 + melee_damage_lower = 20 + melee_damage_upper = 20 + melee_attack_cooldown = CLICK_CD_MELEE + + // Oh you KNOW it's gonna be real green + lighting_cutoff_red = 10 + lighting_cutoff_green = 35 + lighting_cutoff_blue = 15 + + attack_verb_continuous = "glomps" + attack_verb_simple = "glomp" + attack_sound = 'sound/effects/blobattack.ogg' + attack_vis_effect = ATTACK_EFFECT_BITE //nom nom nom + butcher_results = list(/obj/item/food/meat/slab = 2) + + ai_controller = /datum/ai_controller/basic_controller/morph + + /// A weakref pointing to the form we are currently assumed as. + var/datum/weakref/form_weakref = null + /// A typepath pointing of the form we are currently assumed as. Remember, TYPEPATH!!! + var/atom/movable/form_typepath = null + /// The ability that allows us to disguise ourselves. + var/datum/action/cooldown/mob_cooldown/assume_form/disguise_ability = null + + /// How much damage are we doing while disguised? + var/melee_damage_disguised = 0 + /// Can we eat while disguised? + var/eat_while_disguised = FALSE + +/mob/living/basic/morph/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) + RegisterSignal(src, COMSIG_CLICK_SHIFT, PROC_REF(trigger_ability)) + RegisterSignal(src, COMSIG_ACTION_DISGUISED_APPEARANCE, PROC_REF(on_disguise)) + RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_DISGUISED), PROC_REF(on_undisguise)) + + AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/content_barfer) + + disguise_ability = new(src) + disguise_ability.Grant(src) + +/mob/living/basic/morph/examine(mob/user) + if(!HAS_TRAIT(src, TRAIT_DISGUISED)) + return ..() + + var/atom/movable/form_reference = form_weakref.resolve() + if(!isnull(form_reference)) + . = form_reference.examine(user) + + if(get_dist(user, src) <= 3) // always add this because if the form_reference somehow nulls out we still want to have something look "weird" about an item when someone is close + . += span_warning("It doesn't look quite right...") + +/mob/living/basic/morph/med_hud_set_health() + if(isliving(form_typepath)) + return ..() + + //we hide medical hud while in regular state or an item + var/image/holder = hud_list[HEALTH_HUD] + holder.icon_state = null + +/mob/living/basic/morph/med_hud_set_status() + if(isliving(form_typepath)) + return ..() + + //we hide medical hud while in regular state or an item + var/image/holder = hud_list[STATUS_HUD] + holder.icon_state = null + +/mob/living/basic/morph/death(gibbed) + if(HAS_TRAIT(src, TRAIT_DISGUISED)) + visible_message( + span_warning("[src] twists and dissolves into a pile of green flesh!"), + span_userdanger("Your skin ruptures! Your flesh breaks apart! No disguise can ward off de--"), + ) + + return ..() + +/mob/living/basic/morph/can_track(mob/living/user) + if(!HAS_TRAIT(src, TRAIT_DISGUISED)) + return FALSE + return ..() + +/// Do some more logic for the morph when we disguise through the action. +/mob/living/basic/morph/proc/on_disguise(mob/living/basic/user, atom/movable/target) + SIGNAL_HANDLER + // We are now weaker + melee_damage_lower = melee_damage_disguised + 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 + + visible_message( + span_warning("[src] suddenly twists and changes shape, becoming a copy of [target]!"), + span_notice("You twist your body and assume the form of [target]."), + ) + + form_weakref = WEAKREF(target) + form_typepath = target.type + +/// Do some more logic for the morph when we undisguise through the action. +/mob/living/basic/morph/proc/on_undisguise() + SIGNAL_HANDLER + visible_message( + span_warning("[src] suddenly collapses in on itself, dissolving into a pile of green flesh!"), + span_notice("You reform to your normal body."), + ) + + //Baseline stats + melee_damage_lower = initial(melee_damage_lower) + 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 no longer an object + + form_weakref = null + form_typepath = null + +/// Alias for the disguise ability to be used as a keybind. +/mob/living/basic/morph/proc/trigger_ability(mob/living/basic/source, atom/target) + SIGNAL_HANDLER + + // linters hate this if it's not async for some reason even though nothing blocks + INVOKE_ASYNC(disguise_ability, TYPE_PROC_REF(/datum/action/cooldown, InterceptClickOn), caller = source, target = target) + return COMSIG_MOB_CANCEL_CLICKON + +/// Handles the logic for attacking anything. +/mob/living/basic/morph/proc/pre_attack(mob/living/basic/source, atom/target) + SIGNAL_HANDLER + + if(HAS_TRAIT(src, TRAIT_DISGUISED) && (melee_damage_disguised <= 0)) + balloon_alert(src, "can't attack while disguised!") + return COMPONENT_HOSTILE_NO_ATTACK + + if(isliving(target)) //Eat Corpses to regen health + var/mob/living/living_target = target + if(living_target.stat != DEAD) + return + + INVOKE_ASYNC(source, PROC_REF(eat), eatable = living_target, delay = 3 SECONDS, update_health = -50) + return COMPONENT_HOSTILE_NO_ATTACK + + if(isitem(target)) //Eat items just to be annoying + var/obj/item/item_target = target + if(item_target.anchored) + return + + INVOKE_ASYNC(source, PROC_REF(eat), eatable = item_target, delay = 2 SECONDS) + return COMPONENT_HOSTILE_NO_ATTACK + +/// Eat stuff. Delicious. Return TRUE if we ate something, FALSE otherwise. +/// Required: `eatable` is the thing (item or mob) that we are going to eat. +/// Optional: `delay` is the applicable time-based delay to pass into `do_after()` before the logic is ran. +/// Optional: `update_health` is an integer that will be added (or maybe subtracted if you're cruel) to our health after we eat something. Passed into `adjust_health()` so make sure what you pass in is accurate. +/mob/living/basic/morph/proc/eat(atom/movable/eatable, delay = 0 SECONDS, update_health = 0) + if(QDELETED(eatable) || eatable.loc == src) + return FALSE + + if(HAS_TRAIT(src, TRAIT_DISGUISED) && !eat_while_disguised) + balloon_alert(src, "can't eat while disguised!") + return FALSE + + balloon_alert(src, "eating...") + if((delay > 0 SECONDS) && !do_after(src, delay, target = eatable)) + return FALSE + + visible_message(span_warning("[src] swallows [eatable] whole!")) + eatable.forceMove(src) + if(update_health != 0) + adjust_health(update_health) + + return TRUE + +/// No fleshed out AI implementation, just something that make these fellers seem lively if they're just dropped into a station. +/// Only real human-powered intelligence is capable of playing prop hunt in SS13 (until further notice). +/datum/ai_controller/basic_controller/morph + 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/target_retaliate, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) diff --git a/code/modules/mob/living/basic/space_fauna/mushroom.dm b/code/modules/mob/living/basic/space_fauna/mushroom.dm new file mode 100644 index 0000000000000..e6d47e2db5cc9 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/mushroom.dm @@ -0,0 +1,186 @@ +/mob/living/basic/mushroom + name = "walking mushroom" + desc = "It's a massive mushroom... with legs?" + icon_state = "mushroom_color" + icon_living = "mushroom_color" + icon_dead = "mushroom_dead" + mob_biotypes = MOB_ORGANIC | MOB_PLANT + + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "whacks" + response_harm_simple = "whack" + + speed = 1 + melee_damage_lower = 4 + melee_damage_upper = 4 + maxHealth = 60 + attack_verb_continuous = "chomps" + attack_verb_simple = "chomp" + attack_sound = 'sound/weapons/bite.ogg' + attack_vis_effect = ATTACK_EFFECT_BITE + + faction = list(FACTION_MUSHROOM) + speak_emote = list("squeaks") + death_message = "fainted!" + + ai_controller = /datum/ai_controller/basic_controller/mushroom + var/cap_color = "#ffffff" + ///Tracks our general strength level gained from eating other shrooms + var/powerlevel = 0 + ///If someone tries to cheat the system by attacking a shroom to lower its health, punish them so that it won't award levels to shrooms that eat it + var/bruised = FALSE + ///If we hit three, another mushroom's gonna eat us + var/faint_ticker = 0 + ///Where we store our cap icons so we dont generate them constantly to update our icon + var/static/mutable_appearance/cap_living + ///Where we store our cap icons so we dont generate them constantly to update our icon + var/static/mutable_appearance/cap_dead + ///Cooldown that tracks how long its been since revival + COOLDOWN_DECLARE(recovery_cooldown) + +/mob/living/basic/mushroom/Initialize(mapload) + . = ..() + melee_damage_lower = rand(3, 5) + melee_damage_upper = rand(10,20) + maxHealth = rand(50,70) + cap_living = cap_living || mutable_appearance(icon, "mushroom_cap") + cap_dead = cap_dead || mutable_appearance(icon, "mushroom_cap_dead") + cap_color = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) + update_mushroomcap() + health = maxHealth + AddElement(/datum/element/swabable, CELL_LINE_TABLE_WALKING_MUSHROOM, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + RegisterSignal(src, COMSIG_HOSTILE_POST_ATTACKINGTARGET, PROC_REF(on_attacked_target)) + +/datum/ai_controller/basic_controller/mushroom + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/mushroom, + ) + + 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, + /datum/ai_planning_subtree/find_and_hunt_target/mushroom_food, + ) + + +/datum/targetting_datum/basic/mushroom + stat_attack = DEAD + +///we only attacked another mushrooms +/datum/targetting_datum/basic/mushroom/faction_check(mob/living/living_mob, mob/living/the_target) + return !living_mob.faction_check_mob(the_target, exact_match = check_factions_exactly) + +/datum/ai_planning_subtree/find_and_hunt_target/mushroom_food + target_key = BB_LOW_PRIORITY_HUNTING_TARGET + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/mushroom_food + hunt_targets = list(/obj/item/food/grown/mushroom) + hunt_range = 6 + + +/datum/ai_behavior/hunt_target/unarmed_attack_target/mushroom_food + hunt_cooldown = 15 SECONDS + always_reset_target = TRUE + +/mob/living/basic/mushroom/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) + . = ..() + if(!.) + return + + if(!proximity_flag) + return + + if(istype(attack_target, /obj/item/food/grown/mushroom)) + recover(attack_target) + return TRUE + +/mob/living/basic/mushroom/proc/on_attacked_target(mob/living/basic/attacker, atom/target) + SIGNAL_HANDLER + + if(!istype(target, /mob/living/basic/mushroom)) + return + var/mob/living/basic/mushroom/victim = target + if(victim.stat != DEAD) + return + if(victim.faint_ticker >= 3) + consume_mushroom(victim) + return + + victim.faint_ticker++ + visible_message(span_notice("[src] chews a bit on [victim].")) + +/mob/living/basic/mushroom/proc/consume_mushroom(mob/living/basic/mushroom/consumed) + visible_message(span_warning("[src] devours [consumed]!")) + var/level_gain = (consumed.powerlevel - powerlevel) + if(level_gain >= 0 && !ckey && !consumed.bruised)//Player shrooms can't level up to become robust gods. + consumed.level_up(level_gain) + adjustBruteLoss(-consumed.maxHealth) + qdel(consumed) + +/mob/living/basic/mushroom/revive(full_heal_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE) + . = ..() + if(!.) + return + + icon_state = "mushroom_color" + update_mushroomcap() + +/mob/living/basic/mushroom/death(gibbed) + . = ..() + update_mushroomcap() + +/mob/living/basic/mushroom/proc/update_mushroomcap() + cut_overlays() + cap_living.color = cap_color + cap_dead.color = cap_color + if(stat == DEAD) + add_overlay(cap_dead) + else + add_overlay(cap_living) + +/mob/living/basic/mushroom/proc/recover(obj/item/mush_meal) + visible_message(span_notice("[src] eats [mush_meal]!")) + update_mushroomcap() + qdel(mush_meal) + if(!COOLDOWN_FINISHED(src, recovery_cooldown)) + return + faint_ticker = 0 + if(stat == DEAD) + revive(HEAL_ALL) + else + adjustBruteLoss(-5) + COOLDOWN_START(src, recovery_cooldown, 5 MINUTES) + +/mob/living/basic/mushroom/proc/level_up(level_gain) + adjustBruteLoss(-maxHealth) //They'll always heal, even if they don't gain a level + if(powerlevel > 9) + return + if(level_gain == 0) + level_gain = 1 + powerlevel += level_gain + if(prob(25)) + melee_damage_lower += (level_gain * rand(1,5)) + else + melee_damage_upper += (level_gain * rand(1,5)) + maxHealth += (level_gain * rand(1,5)) + +/mob/living/basic/mushroom/attackby(obj/item/mush, mob/living/carbon/human/user, list/modifiers) + if(istype(mush, /obj/item/food/grown/mushroom)) + recover(mush) + return + if(mush.force || user.combat_mode) + bruised = TRUE + return ..() + +/mob/living/basic/mushroom/harvest(mob/living/user) + var/counter + for(counter=0, counter <= powerlevel, counter++) + var/obj/item/food/hugemushroomslice/shroomslice = new /obj/item/food/hugemushroomslice(src.loc) + shroomslice.reagents.add_reagent(/datum/reagent/drug/mushroomhallucinogen, powerlevel) + shroomslice.reagents.add_reagent(/datum/reagent/medicine/omnizine, powerlevel) + shroomslice.reagents.add_reagent(/datum/reagent/medicine/synaptizine, powerlevel) diff --git a/code/modules/mob/living/basic/space_fauna/netherworld/blankbody.dm b/code/modules/mob/living/basic/space_fauna/netherworld/blankbody.dm index 35d597e53ca9a..d49932fb70465 100644 --- a/code/modules/mob/living/basic/space_fauna/netherworld/blankbody.dm +++ b/code/modules/mob/living/basic/space_fauna/netherworld/blankbody.dm @@ -14,6 +14,7 @@ attack_verb_simple = "punch" attack_sound = 'sound/weapons/bladeslice.ogg' attack_vis_effect = ATTACK_EFFECT_SLASH + melee_attack_cooldown = 1 SECONDS faction = list(FACTION_NETHER) speak_emote = list("screams") death_message = "falls apart into a fine dust." @@ -25,22 +26,9 @@ lighting_cutoff_green = 15 lighting_cutoff_blue = 40 - ai_controller = /datum/ai_controller/basic_controller/blankbody + ai_controller = /datum/ai_controller/basic_controller/simple_hostile_obstacles /mob/living/basic/blankbody/Initialize(mapload) . = ..() AddElement(/datum/element/swabable, CELL_LINE_TABLE_NETHER, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 0) AddComponent(/datum/component/health_scaling_effects, min_health_attack_modifier_lower = 8, min_health_attack_modifier_upper = 14) - -/datum/ai_controller/basic_controller/blankbody - 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/attack_obstacle_in_path, - /datum/ai_planning_subtree/basic_melee_attack_subtree/average_speed, - ) diff --git a/code/modules/mob/living/basic/space_fauna/netherworld/creature.dm b/code/modules/mob/living/basic/space_fauna/netherworld/creature.dm index 5fabbf2afb2e4..cdde6ad05e4c8 100644 --- a/code/modules/mob/living/basic/space_fauna/netherworld/creature.dm +++ b/code/modules/mob/living/basic/space_fauna/netherworld/creature.dm @@ -15,6 +15,7 @@ gold_core_spawnable = HOSTILE_SPAWN attack_sound = 'sound/weapons/bite.ogg' attack_vis_effect = ATTACK_EFFECT_BITE + melee_attack_cooldown = 1 SECONDS faction = list(FACTION_NETHER) speak_emote = list("screams") death_message = "gets his head split open." @@ -26,7 +27,7 @@ lighting_cutoff_green = 25 lighting_cutoff_blue = 15 - ai_controller = /datum/ai_controller/basic_controller/creature + ai_controller = /datum/ai_controller/basic_controller/simple_hostile_obstacles /mob/living/basic/creature/Initialize(mapload) . = ..() @@ -100,16 +101,3 @@ exit_jaunt(cast_on) return enter_jaunt(cast_on) - -/datum/ai_controller/basic_controller/creature - 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/attack_obstacle_in_path, - /datum/ai_planning_subtree/basic_melee_attack_subtree/average_speed, - ) diff --git a/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm b/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm index 57d90da264ab0..3f445ea1261b0 100644 --- a/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm +++ b/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm @@ -12,6 +12,7 @@ speed = 1 attack_verb_continuous = "lacerates" attack_verb_simple = "lacerate" + melee_attack_cooldown = 1 SECONDS gold_core_spawnable = HOSTILE_SPAWN attack_sound = 'sound/weapons/bladeslice.ogg' attack_vis_effect = ATTACK_EFFECT_SLASH @@ -27,7 +28,7 @@ lighting_cutoff_green = 15 lighting_cutoff_blue = 50 - ai_controller = /datum/ai_controller/basic_controller/migo + ai_controller = /datum/ai_controller/basic_controller/simple_hostile_obstacles var/static/list/migo_sounds /// Odds migo will dodge var/dodge_prob = 10 @@ -70,16 +71,3 @@ . = Move(get_step(loc,pick(cdir, ccdir))) if(!.)//Can't dodge there so we just carry on . = Move(moving_to, move_direction) - -/datum/ai_controller/basic_controller/migo - 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/attack_obstacle_in_path, - /datum/ai_planning_subtree/basic_melee_attack_subtree/average_speed, - ) diff --git a/code/modules/mob/living/basic/space_fauna/paper_wizard/paper_abilities.dm b/code/modules/mob/living/basic/space_fauna/paper_wizard/paper_abilities.dm new file mode 100644 index 0000000000000..0e3aaece9c034 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/paper_wizard/paper_abilities.dm @@ -0,0 +1,90 @@ +/datum/action/cooldown/spell/conjure/wizard_summon_minions + name = "Summon Minions" + button_icon = 'icons/mob/actions/actions_minor_antag.dmi' + button_icon_state = "art_summon" + invocation = "Rise, my creations! Jump off your pages and into this realm!" + invocation_type = INVOCATION_SHOUT + spell_requirements = NONE + cooldown_time = 15 SECONDS + summon_type = list( + /mob/living/basic/stickman, + /mob/living/basic/stickman/ranged, + /mob/living/basic/stickman/dog, + ) + summon_radius = 1 + summon_amount = 2 + ///How many minions we summoned + var/summoned_minions = 0 + ///How many minions we can have at once + var/max_minions = 6 + + +/datum/action/cooldown/spell/conjure/wizard_summon_minions/can_cast_spell(feedback = TRUE) + . = ..() + if(!.) + return FALSE + if(summoned_minions >= max_minions) + return FALSE + return TRUE + +/datum/action/cooldown/spell/conjure/wizard_summon_minions/post_summon(atom/summoned_object, atom/cast_on) + var/mob/living/chosen_minion = summoned_object + RegisterSignals(chosen_minion, list(COMSIG_QDELETING, COMSIG_LIVING_DEATH), PROC_REF(lost_minion)) + summoned_minions++ + +/datum/action/cooldown/spell/conjure/wizard_summon_minions/proc/lost_minion(mob/source) + SIGNAL_HANDLER + + UnregisterSignal(source, list(COMSIG_QDELETING, COMSIG_LIVING_DEATH)) + summoned_minions-- + +/datum/action/cooldown/spell/pointed/wizard_mimic + name = "Craft Mimicry" + button_icon = 'icons/mob/actions/actions_minor_antag.dmi' + button_icon_state = "mimic_summon" + invocation = "My craft defines me, you could even say it IS me!" + invocation_type = INVOCATION_SHOUT + spell_requirements = NONE + cooldown_time = 25 SECONDS + ///when the clones will die + var/clone_lifespan = 15 SECONDS + ///list of clones + var/list/copies = list() + +/datum/action/cooldown/spell/pointed/wizard_mimic/Grant(mob/grant_to) + . = ..() + if(!owner) + return + RegisterSignal(owner, COMSIG_LIVING_HEALTH_UPDATE, PROC_REF(delete_clones)) + +/datum/action/cooldown/spell/pointed/wizard_mimic/is_valid_target(atom/cast_on) + if(!isliving(cast_on)) + return FALSE + return TRUE + +/datum/action/cooldown/spell/pointed/wizard_mimic/cast(mob/living/cast_on) + . = ..() + var/list/directions = GLOB.cardinals.Copy() + for(var/i in 1 to 3) + var/mob/living/basic/paper_wizard/copy/copy = new (get_step(cast_on, pick_n_take(directions))) + invocation(copy) + RegisterSignals(copy, list(COMSIG_QDELETING, COMSIG_LIVING_DEATH), PROC_REF(lost_minion)) + copies += copy + QDEL_IN(copy, clone_lifespan) + owner.forceMove(get_step(cast_on, pick_n_take(directions))) + +/datum/action/cooldown/spell/pointed/wizard_mimic/proc/lost_minion(mob/living/basic/paper_wizard/copy/source) + SIGNAL_HANDLER + + copies -= source + UnregisterSignal(source, list(COMSIG_QDELETING, COMSIG_LIVING_DEATH), PROC_REF(lost_minion)) + +/datum/action/cooldown/spell/pointed/wizard_mimic/proc/delete_clones(mob/source) + SIGNAL_HANDLER + + QDEL_LIST(copies) + +/datum/action/cooldown/spell/pointed/wizard_mimic/Destroy() + QDEL_LIST(copies) + return ..() + diff --git a/code/modules/mob/living/basic/space_fauna/paper_wizard/paper_wizard.dm b/code/modules/mob/living/basic/space_fauna/paper_wizard/paper_wizard.dm new file mode 100644 index 0000000000000..519e8ba1a7390 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/paper_wizard/paper_wizard.dm @@ -0,0 +1,183 @@ +/mob/living/basic/paper_wizard + name = "Mjor the Creative" + desc = "A wizard with a taste for the arts." + mob_biotypes = MOB_ORGANIC|MOB_HUMANOID + faction = list(FACTION_HOSTILE, FACTION_STICKMAN) + icon = 'icons/mob/simple/simple_human.dmi' + icon_state = "paperwizard" + gender = MALE + + response_help_continuous = "brushes" + response_help_simple = "brush" + response_disarm_continuous = "pushes" + response_disarm_simple = "push" + basic_mob_flags = DEL_ON_DEATH + + maxHealth = 1000 + health = 1000 + melee_damage_lower = 10 + melee_damage_upper = 20 + obj_damage = 50 + attack_sound = 'sound/hallucinations/growl1.ogg' + ai_controller = /datum/ai_controller/basic_controller/paper_wizard + ///spell to summon minions + var/datum/action/cooldown/spell/conjure/wizard_summon_minions/summon + ///spell to summon clones + var/datum/action/cooldown/spell/pointed/wizard_mimic/mimic + ///the loot we will drop + var/static/list/dropped_loot = list(/obj/effect/temp_visual/paperwiz_dying) + + +/mob/living/basic/paper_wizard/Initialize(mapload) + . = ..() + apply_dynamic_human_appearance(src, mob_spawn_path = /obj/effect/mob_spawn/corpse/human/wizard/paper) + grant_abilities() + grant_loot() + AddElement(/datum/element/effect_trail, /obj/effect/temp_visual/paper_scatter) + +/mob/living/basic/paper_wizard/proc/grant_abilities() + summon = new(src) + summon.Grant(src) + ai_controller.set_blackboard_key(BB_WIZARD_SUMMON_MINIONS, summon) + mimic = new(src) + mimic.Grant(src) + ai_controller.set_blackboard_key(BB_WIZARD_MIMICS, mimic) + +/mob/living/basic/paper_wizard/proc/grant_loot() + AddElement(/datum/element/death_drops, dropped_loot) + +/mob/living/basic/paper_wizard/Destroy() + QDEL_NULL(summon) + QDEL_NULL(mimic) + return ..() + +/datum/ai_controller/basic_controller/paper_wizard + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_WRITING_LIST = list( + "I can turn the paper into gold and ink into diamonds!", + "Your fate is written and sealed!", + "You shall suffer the wrath of a thousand paper cuts!", + ) + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk/less_walking + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/targeted_mob_ability/wizard_mimic, + /datum/ai_planning_subtree/use_mob_ability/wizard_summon_minions, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/attack_obstacle_in_path/paper_wizard, + /datum/ai_planning_subtree/find_paper_and_write, + ) + +/datum/ai_planning_subtree/attack_obstacle_in_path/paper_wizard + target_key = BB_FOUND_PAPER + attack_behaviour = /datum/ai_behavior/attack_obstructions/paper_wizard + +/datum/ai_behavior/attack_obstructions/paper_wizard + action_cooldown = 0.4 SECONDS + can_attack_turfs = TRUE + can_attack_dense_objects = TRUE + +/datum/ai_planning_subtree/targeted_mob_ability/wizard_mimic + ability_key = BB_WIZARD_MIMICS + finish_planning = FALSE + +/datum/ai_planning_subtree/use_mob_ability/wizard_summon_minions + ability_key = BB_WIZARD_SUMMON_MINIONS + finish_planning = FALSE + +/datum/ai_behavior/find_and_set/empty_paper + action_cooldown = 10 SECONDS + +/datum/ai_behavior/find_and_set/empty_paper/search_tactic(datum/ai_controller/controller, locate_path, search_range) + var/list/empty_papers = list() + + for(var/obj/item/paper/target_paper in oview(search_range, controller.pawn)) + if(target_paper.is_empty()) + empty_papers += target_paper + + if(empty_papers.len) + return pick(empty_papers) + +/mob/living/basic/paper_wizard/copy + desc = "'Tis a ruse!" + health = 1 + maxHealth = 1 + alpha = 200 + faction = list(FACTION_STICKMAN) + melee_damage_lower = 1 + melee_damage_upper = 5 + ai_controller = /datum/ai_controller/basic_controller/simple_hostile + +/mob/living/basic/paper_wizard/copy/Initialize(mapload) + . = ..() + AddElement(/datum/element/relay_attackers) + RegisterSignal(src, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked)) + +/mob/living/basic/paper_wizard/copy/grant_abilities() + return + +/mob/living/basic/paper_wizard/copy/grant_loot() + return + +//Hit a fake? eat pain! +/mob/living/basic/paper_wizard/copy/proc/on_attacked(mob/source, mob/living/attacker, attack_flags) + SIGNAL_HANDLER + + if(!(attack_flags & (ATTACKER_STAMINA_ATTACK|ATTACKER_SHOVING))) + attacker.adjustBruteLoss(20) + to_chat(attacker, span_warning("The clone casts a spell to damage you before he dies!")) + + +/mob/living/basic/paper_wizard/copy/examine(mob/user) + . = ..() + if(isobserver(user)) + . += span_notice("It's an illusion - what is it hiding?") + else + new /obj/effect/temp_visual/small_smoke/halfsecond(get_turf(src)) + 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_NORMAL_TURF_LAYER + plane = GAME_PLANE + icon = 'icons/effects/effects.dmi' + icon_state = "paper_scatter" + anchored = TRUE + duration = 0.5 SECONDS + randomdir = FALSE + +/obj/effect/temp_visual/paperwiz_dying + name = "craft portal" + desc = "A wormhole sucking the wizard into the void. Neat." + layer = ABOVE_NORMAL_TURF_LAYER + plane = GAME_PLANE + icon = 'icons/effects/effects.dmi' + icon_state = "paperwiz_poof" + anchored = TRUE + duration = 1.8 SECONDS + 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, vary = TRUE, pressure_affected = TRUE) + playsound(get_turf(src), 'sound/hallucinations/wail.ogg', 50, vary = TRUE, pressure_affected = TRUE) + RegisterSignal(src, COMSIG_PREQDELETED, PROC_REF(on_delete)) + +/obj/effect/temp_visual/paperwiz_dying/proc/on_delete() + SIGNAL_HANDLER + + for(var/mob/nearby in range(7, src)) + shake_camera(nearby, duration = 7 SECONDS, strength = 1) + var/turf/current_turf = get_turf(src) + playsound(current_turf,'sound/magic/summon_magic.ogg', 50, vary = TRUE, vary = TRUE) + new /obj/effect/temp_visual/paper_scatter(current_turf) + new /obj/item/clothing/suit/wizrobe/paper(current_turf) + new /obj/item/clothing/head/collectable/paper(current_turf) + diff --git a/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat.dm b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat.dm new file mode 100644 index 0000000000000..164c25fb896d2 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat.dm @@ -0,0 +1,278 @@ +#define REGALRAT_INTERACTION "regalrat" + +/// The cheesiest, most crowned rat of them all. Regent superior of all rats in maintenance... at least until someone else tries to encroach on their claim. +/mob/living/basic/regal_rat + name = "feral regal rat" + desc = "An evolved rat, created through some strange science. They lead nearby rats with deadly efficiency to protect their kingdom." + icon_state = "regalrat" + icon_living = "regalrat" + icon_dead = "regalrat_dead" + gender = MALE + + maxHealth = 70 + health = 70 + + butcher_results = list(/obj/item/food/meat/slab/mouse = 2, /obj/item/clothing/head/costume/crown = 1) + + response_help_continuous = "glares at" + response_help_simple = "glare at" + response_disarm_continuous = "skoffs at" + response_disarm_simple = "skoff at" + response_harm_continuous = "slashes" + response_harm_simple = "slash" + + obj_damage = 10 + melee_damage_lower = 13 + melee_damage_upper = 15 + melee_attack_cooldown = CLICK_CD_MELEE + attack_verb_continuous = "slashes" + attack_verb_simple = "slash" + attack_sound = 'sound/weapons/bladeslice.ogg' + + // Slightly brown red, for the eyes + lighting_cutoff_red = 22 + lighting_cutoff_green = 8 + lighting_cutoff_blue = 5 + + attack_vis_effect = ATTACK_EFFECT_CLAW + unique_name = TRUE + faction = list(FACTION_RAT, FACTION_MAINT_CREATURES) + + ai_controller = /datum/ai_controller/basic_controller/regal_rat + + ///Should we request a mind immediately upon spawning? + var/poll_ghosts = FALSE + /// String tied to our special moniker for examination. Contains a nice message tied to the potential funny regal name we have. + var/special_moniker = "" + +/mob/living/basic/regal_rat/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) + RegisterSignal(src, COMSIG_MOB_LOGIN, PROC_REF(on_login)) + + AddElement(/datum/element/waddling) + AddElement(/datum/element/ai_retaliate) + AddComponent(\ + /datum/component/ghost_direct_control,\ + poll_candidates = poll_ghosts,\ + role_name = "the Regal Rat, cheesy be their crown",\ + poll_ignore_key = POLL_IGNORE_REGAL_RAT,\ + assumed_control_message = "You are an independent, invasive force on the station! Hoard coins, trash, cheese, and the like from the safety of darkness!",\ + after_assumed_control = CALLBACK(src, PROC_REF(became_player_controlled)),\ + ) + + var/datum/action/cooldown/mob_cooldown/domain/domain = new(src) + domain.Grant(src) + ai_controller.set_blackboard_key(BB_DOMAIN_ABILITY, domain) + + var/datum/action/cooldown/mob_cooldown/riot/riot = new(src) + riot.Grant(src) + ai_controller.set_blackboard_key(BB_RAISE_HORDE_ABILITY, riot) + +/mob/living/basic/regal_rat/examine(mob/user) + . = ..() + if(user == src) + return + + if(isregalrat(user)) + . += span_warning("Who is this foolish false king? This will not stand!") + return + + if(ismouse(user)) + if(user.faction_check_mob(src, exact_match = TRUE)) + . += span_notice("This is your king. Long live [p_their()] majesty!") + else + . += span_warning("This is a false king! Strike [p_them()] down!") + return + + . += special_moniker + +/mob/living/basic/regal_rat/handle_environment(datum/gas_mixture/environment) + . = ..() + if(stat == DEAD || isnull(environment) || isnull(environment.gases[/datum/gas/miasma])) + return + var/miasma_percentage = environment.gases[/datum/gas/miasma][MOLES] / environment.total_moles() + if(miasma_percentage >= 0.25) + heal_bodypart_damage(1) + +/// Triggers an alert to all ghosts that the rat has become player controlled. +/mob/living/basic/regal_rat/proc/became_player_controlled() + notify_ghosts( + "All rise for [name], ascendant to the throne in \the [get_area(src)].", + source = src, + action = NOTIFY_ORBIT, + flashwindow = FALSE, + header = "Sentient Rat Created", + ) + +/// Supplementary work we do when we login. Done this way so we synchronize with the ai controller shutting off and all that jazz as well as allowing more shit to be passed in if need be in future. +/mob/living/basic/regal_rat/proc/on_login() + SIGNAL_HANDLER + if(!special_moniker) + grant_titles() // all players are special :) + +/// Grants the rat a special name. +/mob/living/basic/regal_rat/proc/grant_titles() + // The title conveyed upon us thanks to our position. + var/static/list/titles = list( + "Bojar", + "Emperor", + "King", + "Lord", + "Master", + "Overlord", + "Prince", + "Shogun", + "Supreme", + "Tsar", + ) + + // The domain which we have conquered by inheritance or sheer force. + var/static/list/kingdoms = list( + "Cheese", + "Garbage", + "Maintenance", + "Miasma", + "Plague", + "Trash", + "Vermin", + ) + + // The descriptor of our character. + var/static/list/descriptors = list( + "Big Cheese", + "Brute", + "Champion of All Mislaid Creatures", + "Foul", + "Great", + "Grey", + "Horrible", + "Populator", + "Powerful", + "Quiet", + "Vain", + ) + + var/selected_title = pick(titles) + var/selected_kingdom = pick(kingdoms) + + name = "[selected_title] [selected_kingdom], the [pick(descriptors)]" // ex "Tsar Maintenance, the Brute" + special_moniker = "You better not screw with [p_their()] [selected_kingdom]... How do you become a [selected_title] of that anyways?" + +/// Checks if we are able to attack this object, as well as send out the signal to see if we get any special regal rat interactions. +/mob/living/basic/regal_rat/proc/pre_attack(mob/living/source, atom/target) + SIGNAL_HANDLER + + if(DOING_INTERACTION(src, REGALRAT_INTERACTION) || !allowed_to_attack(target)) + return COMPONENT_HOSTILE_NO_ATTACK + + if(SEND_SIGNAL(target, COMSIG_RAT_INTERACT, src) & COMPONENT_RAT_INTERACTED) + return COMPONENT_HOSTILE_NO_ATTACK + + if(isnull(mind)) + return + + if(istype(target, /obj/machinery/door/airlock)) + INVOKE_ASYNC(src, PROC_REF(pry_door), target) + return COMPONENT_HOSTILE_NO_ATTACK + + if(!combat_mode) + INVOKE_ASYNC(src, PROC_REF(poison_target), target) + return COMPONENT_HOSTILE_NO_ATTACK + +/// Checks if we are allowed to attack this mob. Will return TRUE if we are potentially allowed to attack, but if we end up in a case where we should NOT attack, return FALSE. +/mob/living/basic/regal_rat/proc/allowed_to_attack(atom/the_target) + if(QDELETED(the_target)) + return FALSE //wat + + if(!isliving(the_target)) + return TRUE // it might be possible to attack this? we'll find out soon enough + + var/mob/living/living_target = the_target + if (HAS_TRAIT(living_target, TRAIT_FAKEDEATH) || living_target.stat == DEAD) + balloon_alert(src, "already dead!") + return FALSE + + if(living_target.faction_check_mob(src, exact_match = TRUE)) + balloon_alert(src, "one of your soldiers!") + return FALSE + + return TRUE + +/// Attempts to add rat spit to a target, effectively poisoning it to whoever eats it. Yuckers. +/mob/living/basic/regal_rat/proc/poison_target(atom/target) + if(isnull(target.reagents) || !target.is_injectable(src, allowmobs = TRUE)) + return + + visible_message( + span_warning("[src] starts licking [target] passionately!"), + span_notice("You start licking [target]..."), + span_warning("You hear a disgusting slurping sound..."), + ) + + if (!do_after(src, 2 SECONDS, target, interaction_key = REGALRAT_INTERACTION)) + return + + target.reagents.add_reagent(/datum/reagent/rat_spit, rand(1,3), no_react = TRUE) + balloon_alert(src, "licked") + +/** + * Conditionally "eat" cheese object and heal, if injured. + * + * A private proc for sending a message to the mob's chat about them + * eating some sort of cheese, then healing them, then deleting the cheese. + * The "eating" is only conditional on the mob being injured in the first + * place. + */ +/mob/living/basic/regal_rat/proc/cheese_heal(obj/item/target, amount, message) + if(health >= maxHealth) + balloon_alert(src, "you feel full!") + return + + to_chat(src, message) + heal_bodypart_damage(amount) + qdel(target) + +/** + * Allows rat king to pry open an airlock if it isn't locked. + * + * A proc used for letting the rat king pry open airlocks instead of just attacking them. + * This allows the rat king to traverse the station when there is a lack of vents or + * accessible doors, something which is common in certain rat king spawn points. + * + * Returns TRUE if the door opens, FALSE otherwise. + */ +/mob/living/basic/regal_rat/proc/pry_door(target) + if(DOING_INTERACTION(src, REGALRAT_INTERACTION)) + return FALSE + + var/obj/machinery/door/airlock/prying_door = target + if(!prying_door.density || prying_door.locked || prying_door.welded || prying_door.seal) + return FALSE + + visible_message( + span_warning("[src] begins prying open the airlock..."), + span_notice("You begin digging your claws into the airlock..."), + span_warning("You hear groaning metal..."), + ) + var/time_to_open = 0.5 SECONDS + + if(prying_door.hasPower()) + time_to_open = 5 SECONDS + playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, vary = TRUE) + + if(!do_after(src, time_to_open, prying_door, interaction_key = REGALRAT_INTERACTION)) + return FALSE + + if(!prying_door.open(BYPASS_DOOR_CHECKS)) + balloon_alert(src, "failed to open!") + return FALSE + + return TRUE + +/mob/living/basic/regal_rat/controlled + poll_ghosts = TRUE + +#undef REGALRAT_INTERACTION diff --git a/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_actions.dm b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_actions.dm new file mode 100644 index 0000000000000..e617ae0a670af --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_actions.dm @@ -0,0 +1,251 @@ +/** + *Increase the rat king's domain + */ + +/datum/action/cooldown/mob_cooldown/domain + name = "Rat King's Domain" + desc = "Corrupts this area to be more suitable for your rat army." + check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_INCAPACITATED + cooldown_time = 6 SECONDS + melee_cooldown_time = 0 SECONDS + button_icon = 'icons/mob/actions/actions_animal.dmi' + background_icon_state = "bg_clock" + overlay_icon_state = "bg_clock_border" + button_icon_state = "coffer" + shared_cooldown = NONE + +/datum/action/cooldown/mob_cooldown/domain/proc/domain() + var/turf/location = get_turf(owner) + location.atmos_spawn_air("[GAS_MIASMA]=4;[TURF_TEMPERATURE(T20C)]") + switch (rand(1,10)) + if (8) + new /obj/effect/decal/cleanable/vomit(location) + if (9) + new /obj/effect/decal/cleanable/vomit/old(location) + if (10) + new /obj/effect/decal/cleanable/oil/slippery(location) + else + new /obj/effect/decal/cleanable/dirt(location) + StartCooldown() + +/datum/action/cooldown/mob_cooldown/domain/Activate(atom/target) + StartCooldown(10 SECONDS) + domain() + StartCooldown() + +/** + * This action checks some nearby maintenance animals and makes them your minions. + * If none are nearby, creates a new mouse. + */ +/datum/action/cooldown/mob_cooldown/riot + name = "Raise Army" + desc = "Raise an army out of the hordes of mice and pests crawling around the maintenance shafts." + check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_INCAPACITATED + button_icon = 'icons/mob/actions/actions_animal.dmi' + button_icon_state = "riot" + background_icon_state = "bg_clock" + overlay_icon_state = "bg_clock_border" + cooldown_time = 8 SECONDS + melee_cooldown_time = 0 SECONDS + shared_cooldown = NONE + /// How close does something need to be for us to recruit it? + var/range = 5 + /// Commands you can give to your mouse army + var/static/list/mouse_commands = list( + /datum/pet_command/idle, + /datum/pet_command/free, + /datum/pet_command/protect_owner, + /datum/pet_command/follow, + /datum/pet_command/point_targetting/attack/mouse + ) + /// Commands you can give to glockroaches + var/static/list/glockroach_commands = list( + /datum/pet_command/idle, + /datum/pet_command/free, + /datum/pet_command/protect_owner/glockroach, + /datum/pet_command/follow, + /datum/pet_command/point_targetting/attack/glockroach + ) + +/datum/action/cooldown/mob_cooldown/riot/Activate(atom/target) + StartCooldown(10 SECONDS) + riot() + StartCooldown() + +/** + * Attempts to, in order and ending at any successful step: + * * Convert nearby mice into aggressive rats. + * * Convert nearby roaches into aggressive roaches. + * * Convert nearby frogs into aggressive frogs. + * * Spawn a single mouse if below the mouse cap. + */ +/datum/action/cooldown/mob_cooldown/riot/proc/riot() + var/uplifted_mice = FALSE + for (var/mob/living/basic/mouse/nearby_mouse in oview(owner, range)) + uplifted_mice = convert_mouse(nearby_mouse) || uplifted_mice + if (uplifted_mice) + owner.visible_message(span_warning("[owner] commands their army to action, mutating them into rats!")) + return + + var/static/list/converted_check_list = list(FACTION_RAT) + var/uplifted_roach = FALSE + for (var/mob/living/basic/cockroach/nearby_roach in oview(owner, range)) + uplifted_roach = convert_roach(nearby_roach, converted_check_list) || uplifted_roach + if (uplifted_roach) + owner.visible_message(span_warning("[owner] commands their army to action, mutating them into sewer roaches!")) + return + + var/uplifted_frog = FALSE + for (var/mob/living/basic/frog/nearby_frog in oview(owner, range)) + uplifted_frog = convert_frog(nearby_frog, converted_check_list) || uplifted_frog + if (uplifted_frog) + owner.visible_message(span_warning("[owner] commands their army to action, mutating them into trash frogs!")) + return + + var/rat_cap = CONFIG_GET(number/ratcap) + if (LAZYLEN(SSmobs.cheeserats) >= rat_cap) + to_chat(owner,span_warning("There's too many mice on this station to beckon a new one! Find them first!")) + return + new /mob/living/basic/mouse(owner.loc) + owner.visible_message(span_warning("[owner] commands a mouse to their side!")) + +/// Makes a passed mob into our minion +/datum/action/cooldown/mob_cooldown/riot/proc/make_minion(mob/living/new_minion, minion_desc, list/command_list = mouse_commands) + if (isbasicmob(new_minion)) + new_minion.AddComponent(/datum/component/obeys_commands, command_list) + qdel(new_minion.GetComponent(/datum/component/tameable)) // Rats don't share + new_minion.befriend(owner) + new_minion.faction = owner.faction.Copy() + // Give a hint in description too + new_minion.desc += minion_desc + new_minion.balloon_alert_to_viewers("squeak") + +/// Turns a mouse into an angry mouse +/datum/action/cooldown/mob_cooldown/riot/proc/convert_mouse(mob/living/basic/mouse/nearby_mouse) + // This mouse is already rat controlled, let's not bother with it. + if (istype(nearby_mouse.ai_controller, /datum/ai_controller/basic_controller/mouse/rat)) + return FALSE + + var/mob/living/basic/mouse/rat/rat_path = /mob/living/basic/mouse/rat + // Change name + if (nearby_mouse.name == "mouse") + nearby_mouse.name = initial(rat_path.name) + // Buffs our combat stats to that of a rat + nearby_mouse.melee_damage_lower = initial(rat_path.melee_damage_lower) + nearby_mouse.melee_damage_upper = initial(rat_path.melee_damage_upper) + nearby_mouse.obj_damage = initial(rat_path.obj_damage) + nearby_mouse.maxHealth = initial(rat_path.maxHealth) + nearby_mouse.health = initial(rat_path.health) + // Replace our AI with a rat one + nearby_mouse.ai_controller = new /datum/ai_controller/basic_controller/mouse/rat(nearby_mouse) + make_minion(nearby_mouse, " ...Except this one looks corrupted and aggressive.") + return TRUE + +/// Turns a roach into an angry roach +/datum/action/cooldown/mob_cooldown/riot/proc/convert_roach(mob/living/basic/cockroach/nearby_roach, list/converted_check_list) + // No need to convert when not on the same team. + if (faction_check(nearby_roach.faction, converted_check_list)) + return FALSE + + var/list/minion_commands = mouse_commands + if (!findtext(nearby_roach.name, "sewer")) + nearby_roach.name = "sewer [nearby_roach.name]" + + if (istype(nearby_roach, /mob/living/basic/cockroach/glockroach) || istype(nearby_roach, /mob/living/basic/cockroach/hauberoach)) + if (istype(nearby_roach, /mob/living/basic/cockroach/glockroach)) + minion_commands = glockroach_commands + nearby_roach.melee_damage_lower += 0.5 + nearby_roach.melee_damage_upper += 2 + else + nearby_roach.melee_damage_lower += 2 + nearby_roach.melee_damage_upper += 4 + nearby_roach.obj_damage += 5 + nearby_roach.ai_controller = new /datum/ai_controller/basic_controller/cockroach/sewer(nearby_roach) + nearby_roach.melee_attack_cooldown = 0.8 SECONDS + + nearby_roach.icon_state += "_sewer" + nearby_roach.maxHealth += 1 + nearby_roach.health += 1 + make_minion(nearby_roach, "
    This one looks extra robust.", minion_commands) + return TRUE + +/// Turns a frog into a crazy frog. This doesn't do anything interesting and should when it becomes a basic mob. +/datum/action/cooldown/mob_cooldown/riot/proc/convert_frog(mob/living/basic/frog/nearby_frog, list/converted_check_list) + // No need to convert when not on the same team. + if(faction_check(nearby_frog.faction, converted_check_list) || nearby_frog.stat == DEAD) + return FALSE + + var/list/minion_commands = mouse_commands + if (!findtext(nearby_frog.name, "trash")) + nearby_frog.name = replacetext(nearby_frog.name, "frog", "trash frog") + + nearby_frog.icon_state += "_trash" + nearby_frog.icon_living += "_trash" + nearby_frog.icon_dead = nearby_frog.icon_state + "_dead" + nearby_frog.maxHealth += 10 + nearby_frog.health += 10 + nearby_frog.melee_damage_lower += 1 + nearby_frog.melee_damage_upper += 5 + nearby_frog.obj_damage += 10 + nearby_frog.ai_controller = new /datum/ai_controller/basic_controller/frog/trash(nearby_frog) + var/crazy_frog_desc = " ...[findtext(nearby_frog.name, "rare") ? "even though" : "perhaps because"] they live in a trash bag." + make_minion(nearby_frog, crazy_frog_desc, minion_commands) + return TRUE + +// Command you can give to a mouse to make it kill someone +/datum/pet_command/point_targetting/attack/mouse + speech_commands = list("attack", "sic", "kill", "cheese em") + command_feedback = "squeak!" // Frogs and roaches can squeak too it's fine + pointed_reaction = "and squeaks aggressively" + refuse_reaction = "quivers" + attack_behaviour = /datum/ai_behavior/basic_melee_attack + +// Command you can give to a mouse to make it kill someone +/datum/pet_command/point_targetting/attack/glockroach + speech_commands = list("attack", "sic", "kill", "cheese em") + command_feedback = "squeak!" + pointed_reaction = "and cocks its gun" + refuse_reaction = "quivers" + attack_behaviour = /datum/ai_behavior/basic_ranged_attack/glockroach + +/** + *Spittle; harmless reagent that is added by rat king, and makes you disgusted. + */ + +/datum/reagent/rat_spit + name = "Rat Spit" + description = "Something coming from a rat. Dear god! Who knows where it's been!" + reagent_state = LIQUID + color = "#C8C8C8" + metabolization_rate = 0.03 * REAGENTS_METABOLISM + taste_description = "something funny" + overdose_threshold = 20 + +/datum/reagent/rat_spit/on_mob_metabolize(mob/living/affected_mob) + . = ..() + if(HAS_TRAIT(affected_mob, TRAIT_AGEUSIA)) + return + to_chat(affected_mob, span_notice("This food has a funny taste!")) + +/datum/reagent/rat_spit/overdose_start(mob/living/affected_mob) + . = ..() + var/mob/living/carbon/victim = affected_mob + if (istype(victim) && !(FACTION_RAT in victim.faction)) + 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 |= FACTION_RAT + victim.vomit(VOMIT_CATEGORY_DEFAULT) + metabolization_rate = 10 * REAGENTS_METABOLISM + +/datum/reagent/rat_spit/on_mob_life(mob/living/carbon/affected_mob) + . = ..() + if(prob(15)) + to_chat(affected_mob, span_notice("You feel queasy!")) + affected_mob.adjust_disgust(3) + else if(prob(10)) + to_chat(affected_mob, span_warning("That food does not sit up well!")) + affected_mob.adjust_disgust(5) + else if(prob(5)) + affected_mob.vomit(VOMIT_CATEGORY_DEFAULT) + +/datum/pet_command/protect_owner/glockroach + protect_behavior = /datum/ai_behavior/basic_ranged_attack/glockroach diff --git a/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_ai.dm b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_ai.dm new file mode 100644 index 0000000000000..ef92c7b3b76b1 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_ai.dm @@ -0,0 +1,28 @@ +/datum/ai_controller/basic_controller/regal_rat + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_BASIC_MOB_FLEEING = TRUE, + BB_FLEE_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + + // we pretty much do cheesy things (make the station worse) and don't deal with peasants (crew) unless they start to get in the way + // summon the horde if we get into a fight and then let the horde take care of it while we skedaddle + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate/to_flee, + /datum/ai_planning_subtree/targeted_mob_ability/riot, + /datum/ai_planning_subtree/flee_target/from_flee_key, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/use_mob_ability/domain, + ) + +/datum/ai_planning_subtree/targeted_mob_ability/riot + target_key = BB_BASIC_MOB_FLEE_TARGET // we only want to trigger this when provoked, manpower is low nowadays + ability_key = BB_RAISE_HORDE_ABILITY + finish_planning = FALSE + +/datum/ai_planning_subtree/use_mob_ability/domain + ability_key = BB_DOMAIN_ABILITY diff --git a/code/modules/mob/living/basic/space_fauna/robot_customer.dm b/code/modules/mob/living/basic/space_fauna/robot_customer.dm new file mode 100644 index 0000000000000..e084e11f403c9 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/robot_customer.dm @@ -0,0 +1,116 @@ +///Robot customers +/mob/living/basic/robot_customer + name = "tourist bot" + maxHealth = 150 + health = 150 + desc = "I wonder what they'll order..." + gender = NEUTER + + icon = 'icons/mob/simple/tourists.dmi' + icon_state = "amerifat" + icon_living = "amerifat" + + basic_mob_flags = DEL_ON_DEATH + mob_biotypes = MOB_ROBOTIC|MOB_HUMANOID + sentience_type = SENTIENCE_ARTIFICIAL + + unsuitable_atmos_damage = 0 + minimum_survivable_temperature = TCMB + maximum_survivable_temperature = T0C + 1000 + + ai_controller = /datum/ai_controller/robot_customer + + /// The clothes that we draw on this tourist. + var/clothes_set = "amerifat_clothes" + /// Reference to the hud that we show when the player hovers over us. + var/datum/atom_hud/hud_to_show_on_hover + +/mob/living/basic/robot_customer/Initialize( + mapload, + datum/customer_data/customer_data = /datum/customer_data/american, + datum/venue/attending_venue = SSrestaurant.all_venues[/datum/venue/restaurant], +) + var/datum/customer_data/customer_info = SSrestaurant.all_customers[customer_data] + ai_controller = customer_info.ai_controller_used + + . = ..() + + ADD_TRAIT(src, list(TRAIT_NOMOBSWAP, TRAIT_NO_TELEPORT, TRAIT_STRONG_GRABBER), INNATE_TRAIT) // never suffer a bitch to fuck with you + AddElement(/datum/element/footstep, FOOTSTEP_OBJ_ROBOT, 1, -6, sound_vary = TRUE) + + ai_controller.set_blackboard_key(BB_CUSTOMER_CUSTOMERINFO, customer_info) + ai_controller.set_blackboard_key(BB_CUSTOMER_ATTENDING_VENUE, attending_venue) + ai_controller.set_blackboard_key(BB_CUSTOMER_PATIENCE, customer_info.total_patience) + + icon = customer_info.base_icon + icon_state = customer_info.base_icon_state + name = "[pick(customer_info.name_prefixes)]-bot" + color = rgb(rand(80,255), rand(80,255), rand(80,255)) + clothes_set = pick(customer_info.clothing_sets) + update_appearance(UPDATE_ICON) + +///Clean up on the mobs seat etc when its deleted (Either by murder or because it left) +/mob/living/basic/robot_customer/Destroy() + var/datum/venue/attending_venue = ai_controller.blackboard[BB_CUSTOMER_ATTENDING_VENUE] + var/obj/structure/holosign/robot_seat/our_seat = ai_controller.blackboard[BB_CUSTOMER_MY_SEAT] + attending_venue.current_visitors -= src + if(attending_venue.linked_seats[our_seat]) + attending_venue.linked_seats[our_seat] = null + QDEL_NULL(hud_to_show_on_hover) + return ..() + +///Robots need robot gibs...! +/mob/living/basic/robot_customer/spawn_gibs() + new /obj/effect/gibspawner/robot(drop_location(), src) + +/mob/living/basic/robot_customer/MouseEntered(location, control, params) + . = ..() + hud_to_show_on_hover?.show_to(usr) + +/mob/living/basic/robot_customer/MouseExited(location, control, params) + . = ..() + hud_to_show_on_hover?.hide_from(usr) + +/mob/living/basic/robot_customer/update_overlays() + . = ..() + + var/datum/customer_data/customer_info = ai_controller.blackboard[BB_CUSTOMER_CUSTOMERINFO] + + var/new_underlays = customer_info.get_underlays(src) + if (new_underlays) + underlays.Cut() + underlays += new_underlays + + var/mutable_appearance/features = mutable_appearance(icon, "[icon_state]_features") + features.appearance_flags = RESET_COLOR + . += features + + var/mutable_appearance/clothes = mutable_appearance(icon, clothes_set) + clothes.appearance_flags = RESET_COLOR + . += clothes + + var/bonus_overlays = customer_info.get_overlays(src) + if(bonus_overlays) + . += bonus_overlays + +/mob/living/basic/robot_customer/send_speech(message, message_range, obj/source, bubble_type, list/spans, datum/language/message_language, list/message_mods, forced, tts_message, list/tts_filter) + . = ..() + var/datum/customer_data/customer_info = ai_controller.blackboard[BB_CUSTOMER_CUSTOMERINFO] + playsound(src, customer_info.speech_sound, 30, extrarange = MEDIUM_RANGE_SOUND_EXTRARANGE, falloff_distance = 5) + +/mob/living/basic/robot_customer/examine(mob/user) + . = ..() + if(isnull(ai_controller.blackboard[BB_CUSTOMER_CURRENT_ORDER])) + return + + var/datum/venue/attending_venue = ai_controller.blackboard[BB_CUSTOMER_ATTENDING_VENUE] + var/wanted_item = ai_controller.blackboard[BB_CUSTOMER_CURRENT_ORDER] + var/order = "nothing" + + if(istype(wanted_item, /datum/custom_order)) + var/datum/custom_order/custom_order = wanted_item + order = custom_order.get_order_line(attending_venue) + else + order = attending_venue.order_food_line(wanted_item) + + . += span_notice("Their order was: \"[order].\"") diff --git a/code/modules/mob/living/basic/space_fauna/snake/snake.dm b/code/modules/mob/living/basic/space_fauna/snake/snake.dm new file mode 100644 index 0000000000000..13b9a327cc5c8 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/snake/snake.dm @@ -0,0 +1,86 @@ + +/mob/living/basic/snake + name = "snake" + desc = "A slithery snake. These legless reptiles are the bane of mice and adventurers alike." + icon_state = "snake" + icon_living = "snake" + icon_dead = "snake_dead" + speak_emote = list("hisses") + + health = 20 + maxHealth = 20 + melee_damage_lower = 5 + melee_damage_upper = 6 + obj_damage = 0 + environment_smash = ENVIRONMENT_SMASH_NONE + + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + attack_sound = 'sound/weapons/bite.ogg' + attack_vis_effect = ATTACK_EFFECT_BITE + + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "shoos" + response_disarm_simple = "shoo" + response_harm_continuous = "steps on" + response_harm_simple = "step on" + + density = FALSE + pass_flags = PASSTABLE | PASSMOB + mob_size = MOB_SIZE_SMALL + + faction = list(FACTION_HOSTILE) + mob_biotypes = MOB_ORGANIC | MOB_BEAST | MOB_REPTILE + gold_core_spawnable = FRIENDLY_SPAWN + + ai_controller = /datum/ai_controller/basic_controller/snake + + /// List of stuff (mice) that we want to eat + var/static/list/edibles = list( + /mob/living/basic/mouse, + /obj/item/food/deadmouse, + ) + +/mob/living/basic/snake/Initialize(mapload, special_reagent) + . = ..() + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + + AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/swabable, CELL_LINE_TABLE_SNAKE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) + + AddElement(/datum/element/basic_eating, 2, 0, null, edibles) + ai_controller.set_blackboard_key(BB_BASIC_FOODS, edibles) + + AddComponent(\ + /datum/component/tameable,\ + food_types = list(/obj/item/food/deadmouse),\ + tame_chance = 75,\ + bonus_tame_chance = 10,\ + ) // snakes are really fond of food, especially in the cold darkness of space :) + + if(isnull(special_reagent)) + special_reagent = /datum/reagent/toxin + + AddElement(/datum/element/venomous, special_reagent, 4) + +/mob/living/basic/snake/befriend(mob/living/new_friend) + . = ..() + visible_message("[src] hisses happily as it seems to bond with [new_friend].") + +/// Snakes are primarily concerned with getting those tasty, tasty mice, but aren't afraid to strike back at those who attack them +/datum/ai_controller/basic_controller/snake + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends/allow_items, + ) + + ai_traits = STOP_MOVING_WHEN_PULLED + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/find_food, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/random_speech/snake, + ) diff --git a/code/modules/mob/living/basic/space_fauna/snake/snake_ai.dm b/code/modules/mob/living/basic/space_fauna/snake/snake_ai.dm new file mode 100644 index 0000000000000..3eb404761c522 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/snake/snake_ai.dm @@ -0,0 +1,6 @@ +/datum/ai_planning_subtree/random_speech/snake + speech_chance = 5 + speak = list("hsssss","sssSSsssss...","hiisssss") + sound = list('sound/creatures/snake_hissing1.ogg', 'sound/creatures/snake_hissing2.ogg') + emote_hear = list("hisses.") + emote_see = list("slithers around.", "glances.", "stares.") diff --git a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider.dm b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider.dm deleted file mode 100644 index b62e42edc92dc..0000000000000 --- a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider.dm +++ /dev/null @@ -1,105 +0,0 @@ -/** - * # Giant Spider - * - * A mob which can be created by dynamic event, botany, or xenobiology. - * The basic type is the guard, which is slow but sturdy and outputs good damage. - * All spiders can produce webbing. - */ -/mob/living/basic/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") - 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 - speed = 5 - maxHealth = 125 - health = 125 - damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1) - basic_mob_flags = FLAMMABLE_MOB - status_flags = NONE - unsuitable_cold_damage = 4 - unsuitable_heat_damage = 4 - obj_damage = 30 - melee_damage_lower = 20 - melee_damage_upper = 25 - combat_mode = TRUE - faction = list(FACTION_SPIDER) - pass_flags = PASSTABLE - 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 - // VERY red, to fit the eyes - lighting_cutoff_red = 22 - lighting_cutoff_green = 5 - lighting_cutoff_blue = 5 - ai_controller = /datum/ai_controller/basic_controller/giant_spider - /// Speed modifier to apply if controlled by a human player - var/player_speed_modifier = -4 - /// What reagent the mob injects targets with - var/poison_type = /datum/reagent/toxin/hunterspider - /// How much of a reagent the mob injects on attack - var/poison_per_bite = 0 - /// Multiplier to apply to web laying speed. Fractional numbers make it faster, because it's a multiplier. - var/web_speed = 1 - /// Type of webbing ability to learn. - var/web_type = /datum/action/cooldown/lay_web - /// 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 = "Tanky and strong for the defense of the nest and other spiders." - /// If true then you shouldn't be told that you're a spider antagonist as soon as you are placed into this mob - var/apply_spider_antag = TRUE - -/mob/living/basic/giant_spider/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_WEB_SURFER, INNATE_TRAIT) - AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW) - 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!") - - if(poison_per_bite) - AddElement(/datum/element/venomous, poison_type, poison_per_bite) - - var/datum/action/cooldown/lay_web/webbing = new web_type(src) - webbing.webbing_time *= web_speed - webbing.Grant(src) - ai_controller.set_blackboard_key(BB_SPIDER_WEB_ACTION, webbing) - -/mob/living/basic/giant_spider/Login() - . = ..() - if(!. || !client) - return FALSE - GLOB.spidermobs[src] = TRUE - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/player_spider_modifier, multiplicative_slowdown = player_speed_modifier) - if (apply_spider_antag) - var/datum/antagonist/spider/spider_antag = new(directive) - mind.add_antag_datum(spider_antag) - -/mob/living/basic/giant_spider/Logout() - . = ..() - remove_movespeed_modifier(/datum/movespeed_modifier/player_spider_modifier) - -/mob/living/basic/giant_spider/Destroy() - GLOB.spidermobs -= src - return ..() - -/mob/living/basic/giant_spider/mob_negates_gravity() - if(locate(/obj/structure/spider/stickyweb) in loc) - return TRUE - return ..() - -/mob/living/basic/giant_spider/expose_reagents(list/reagents, datum/reagents/source, methods=TOUCH, volume_modifier=1, show_message=TRUE) - . = ..() - for(var/datum/reagent/toxin/pestkiller/current_reagent in reagents) - apply_damage(50 * volume_modifier, STAMINA, BODY_ZONE_CHEST) diff --git a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_ai.dm b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_ai.dm index 6838f3ba1ab39..f998b7b53cd90 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_ai.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_ai.dm @@ -4,7 +4,7 @@ BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), ) - ai_traits = STOP_MOVING_WHEN_PULLED + ai_traits = STOP_MOVING_WHEN_PULLED | PAUSE_DURING_DO_AFTER ai_movement = /datum/ai_movement/basic_avoidance idle_behavior = /datum/idle_behavior/idle_random_walk/less_walking diff --git a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_subtrees.dm b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_subtrees.dm index 85d7636ffc900..56aacb11a9618 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_subtrees.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_subtrees.dm @@ -27,22 +27,31 @@ finish_action(controller, succeeded = TRUE) return - var/list/potential_turfs = list() - for(var/turf/turf_in_view in oview(scan_range, our_turf)) + var/list/turfs_by_range = list() + for (var/i in 1 to scan_range) + turfs_by_range["[i]"] = list() + for (var/turf/turf_in_view in oview(scan_range, our_turf)) if (!is_valid_web_turf(turf_in_view)) continue - potential_turfs += turf_in_view + turfs_by_range["[get_dist(our_turf, turf_in_view)]"] += turf_in_view - if (!length(potential_turfs)) + var/list/final_turfs + for (var/list/turf_list as anything in turfs_by_range) + if (length(turfs_by_range[turf_list])) + final_turfs = turfs_by_range[turf_list] + break + if (!length(final_turfs)) finish_action(controller, succeeded = FALSE) return - controller.set_blackboard_key(target_key, get_closest_atom(/turf/, potential_turfs, our_turf)) + controller.set_blackboard_key(target_key, pick(final_turfs)) finish_action(controller, succeeded = TRUE) /datum/ai_behavior/find_unwebbed_turf/proc/is_valid_web_turf(turf/target_turf, mob/living/spider) if (locate(/obj/structure/spider/stickyweb) in target_turf) return FALSE + if (HAS_TRAIT(target_turf, TRAIT_SPINNING_WEB_TURF)) + return FALSE return !target_turf.is_blocked_turf(source_atom = spider) /// Run the spin web behaviour if we have an ability to use for it @@ -53,12 +62,9 @@ var/target_key = BB_SPIDER_WEB_TARGET /datum/ai_planning_subtree/spin_web/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) - var/datum/action/cooldown/using_action = controller.blackboard[action_key] - var/turf/target_turf = controller.blackboard[target_key] - if (QDELETED(using_action) || QDELETED(target_turf)) - return - controller.queue_behavior(/datum/ai_behavior/spin_web, action_key, target_key) - return SUBTREE_RETURN_FINISH_PLANNING + if (controller.blackboard_key_exists(action_key) && controller.blackboard_key_exists(target_key)) + controller.queue_behavior(/datum/ai_behavior/spin_web, action_key, target_key) + return SUBTREE_RETURN_FINISH_PLANNING /// Move to an unwebbed nearby turf and web it up /datum/ai_behavior/spin_web diff --git a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_variants.dm b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_variants.dm deleted file mode 100644 index f918661758496..0000000000000 --- a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_variants.dm +++ /dev/null @@ -1,547 +0,0 @@ -/** - * ### Spider Ambush - * A subtype of the giant spider which is slower, stronger and able to sneak into its surroundings to pull pray aggressively. - * This spider is only slightly slower than a human. - */ -/mob/living/basic/giant_spider/ambush - name = "ambush spider" - desc = "Furry and white, it makes you shudder to look at it. This one has sparkling pink eyes." - icon_state = "ambush" - icon_living = "ambush" - icon_dead = "ambush_dead" - gender = FEMALE - maxHealth = 125 - health = 125 - obj_damage = 45 - melee_damage_lower = 25 - melee_damage_upper = 30 - speed = 5 - player_speed_modifier = -3.1 - menu_description = "Slow spider variant specializing in stalking and ambushing prey, above avarage health and damage with a strong grip." - -/mob/living/basic/giant_spider/ambush/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_STRONG_GRABBER, INNATE_TRAIT) - - AddElement(/datum/element/web_walker, /datum/movespeed_modifier/slow_web) - - var/datum/action/cooldown/sneak/spider/sneak_web = new(src) - sneak_web.Grant(src) - -/** - * ### Spider Guard - * A subtype of the giant spider which is similar on every single way, - * This spider is only slightly slower than a human. - */ -/mob/living/basic/giant_spider/guard - name = "guard 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" - gender = FEMALE - maxHealth = 160 - health = 160 - melee_damage_lower = 20 - melee_damage_upper = 25 - obj_damage = 45 - speed = 5 - player_speed_modifier = -4 - menu_description = "Tanky and strong for the defense of the nest and other spiders." - -/mob/living/basic/giant_spider/guard/Initialize(mapload) - . = ..() - - AddElement(/datum/element/web_walker, /datum/movespeed_modifier/average_web) - - var/datum/action/cooldown/lay_web/web_carcass/carcass_web = new(src) - carcass_web.Grant(src) - -/** - * ### Spider Hunter - * 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/basic/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 = 80 - health = 80 - melee_damage_lower = 15 - melee_damage_upper = 20 - poison_per_bite = 5 - speed = 3 - player_speed_modifier = -3.1 - menu_description = "Fast spider variant specializing in catching running prey and toxin injection, but has less health and damage." - -/mob/living/basic/giant_spider/hunter/Initialize(mapload) - . = ..() - - AddElement(/datum/element/web_walker, /datum/movespeed_modifier/fast_web) - -/** - * ### Spider Scout - * A subtype of the giant spider which is faster, has thermal vision, but less health and damage. - * This spider is only slightly faster than a human. - */ -/mob/living/basic/giant_spider/scout - name = "scout spider" - desc = "Furry and blueish black, it makes you shudder to look at it. This one has sparkling blue eyes." - icon_state = "scout" - icon_living = "scout" - icon_dead = "scout_dead" - maxHealth = 65 - health = 65 - obj_damage = 10 - melee_damage_lower = 5 - melee_damage_upper = 10 - poison_per_bite = 10 - poison_type = /datum/reagent/peaceborg/confuse - speed = 2.8 - player_speed_modifier = -3.1 - sight = SEE_SELF|SEE_MOBS - menu_description = "Fast spider variant specializing in scouting and alerting of prey, with the ability to travel in vents." - -/mob/living/basic/giant_spider/scout/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - - var/datum/action/command_spiders/communication_spiders/spiders_communication = new(src) - spiders_communication.Grant(src) - -/** - * ### Spider Nurse - * - * 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/basic/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 - speed = 4 - player_speed_modifier = -3.1 - web_speed = 0.25 - web_type = /datum/action/cooldown/lay_web/sealer - 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/basic/giant_spider/nurse/Initialize(mapload) - . = ..() - var/datum/atom_hud/datahud = GLOB.huds[health_hud] - datahud.show_to(src) - - AddComponent(/datum/component/healing_touch,\ - interaction_key = DOAFTER_SOURCE_SPIDER,\ - valid_targets_typecache = typecacheof(list(/mob/living/basic/giant_spider)),\ - action_text = "%SOURCE% begins wrapping the wounds of %TARGET%.",\ - complete_text = "%SOURCE% wraps the wounds of %TARGET%.",\ - ) - - AddElement(/datum/element/web_walker, /datum/movespeed_modifier/average_web) - -/** - * ### Tangle Spider - * - * A subtype of the giant spider which specializes in support skills. - * Tangle spiders can place down webbing in a quarter of the time that other species plus has an expanded arsenal of traps and web structures to place to benefit the nest. - * Note that it can heal itself. - */ -/mob/living/basic/giant_spider/tangle - name = "tangle spider" - desc = "Furry and brown, it makes you shudder to look at it. This one has dim brown eyes." - icon_state = "tangle" - icon_living = "tangle" - icon_dead = "tangle_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 = 1 - melee_damage_upper = 1 - poison_per_bite = 5 - poison_type = /datum/reagent/toxin/acid - obj_damage = 40 - web_speed = 0.25 - speed = 4 - player_speed_modifier = -3.1 - web_type = /datum/action/cooldown/lay_web/sealer - menu_description = "Support spider variant specializing in contruction to protect their brethren, but has very low amount of health and deals low damage." - -/mob/living/basic/giant_spider/tangle/Initialize(mapload) - . = ..() - var/datum/action/cooldown/lay_web/solid_web/web_solid = new(src) - web_solid.Grant(src) - - var/datum/action/cooldown/lay_web/web_passage/passage_web = new(src) - passage_web.Grant(src) - - var/datum/action/cooldown/lay_web/web_spikes/spikes_web = new(src) - spikes_web.Grant(src) - - var/datum/action/cooldown/lay_web/sticky_web/web_sticky = new(src) - web_sticky.Grant(src) - - AddElement(/datum/element/web_walker, /datum/movespeed_modifier/average_web) - - AddComponent(/datum/component/healing_touch,\ - heal_brute = maxHealth * 0.5,\ - heal_burn = maxHealth * 0.5,\ - self_targetting = HEALING_TOUCH_SELF_ONLY,\ - interaction_key = DOAFTER_SOURCE_SPIDER,\ - valid_targets_typecache = typecacheof(list(/mob/living/basic/giant_spider/tangle)),\ - action_text = "%SOURCE% begins mending themselves...",\ - complete_text = "%SOURCE%'s wounds mend together.",\ - ) - -/** - * ### Tarantula - * - * A subtype of the giant spider which specializes in pure strength and staying power. - * Is slowed down when not on webbing, but can lunge to throw off attackers and possibly to stun them. - */ -/mob/living/basic/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) - speed = 6 - player_speed_modifier = -5.5 // Doesn't seem that slow but it gets a debuff off web - 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." - /// Charging ability - var/datum/action/cooldown/mob_cooldown/charge/basic_charge/charge - -/mob/living/basic/giant_spider/tarantula/Initialize(mapload) - . = ..() - charge = new /datum/action/cooldown/mob_cooldown/charge/basic_charge() - charge.Grant(src) - - AddElement(/datum/element/web_walker, /datum/movespeed_modifier/slow_web) - -/mob/living/basic/giant_spider/tarantula/Destroy() - QDEL_NULL(charge) - return ..() - -/// Lunge if you click something at range -/mob/living/basic/giant_spider/tarantula/ranged_secondary_attack(atom/atom_target, modifiers) - charge.Trigger(target = atom_target) - -/** - * ### Spider Viper - * - * A subtype of the giant spider which specializes in speed and poison. - * Injects a deadlier toxin than other spiders, moves extremely fast, but has a limited amount of health. - */ -/mob/living/basic/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 - poison_type = /datum/reagent/toxin/viperspider - speed = 2 - player_speed_modifier = -2.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 - * - * A subtype of the giant spider which is the crux of a spider horde, and the way which it grows. - * Has very little offensive capabilities but can lay eggs at any time to create more basic spiders. - * After consuming human bodies can lay specialised eggs including more broodmothers. - * They are also capable of sending messages to all living spiders and setting directives for their children. - */ -/mob/living/basic/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 = 250 - health = 250 - melee_damage_lower = 10 - melee_damage_upper = 15 - speed = 4 - player_speed_modifier = -3.1 - gold_core_spawnable = NO_SPAWN - web_speed = 0.5 - web_type = /datum/action/cooldown/lay_web/sealer - menu_description = "Royal spider variant specializing in reproduction and leadership, deals low damage." - -/mob/living/basic/giant_spider/midwife/Initialize(mapload) - . = ..() - var/datum/action/cooldown/lay_web/solid_web/web_solid = new(src) - web_solid.Grant(src) - - var/datum/action/cooldown/lay_web/web_passage/passage_web = new(src) - passage_web.Grant(src) - - var/datum/action/cooldown/lay_web/web_spikes/spikes_web = new(src) - spikes_web.Grant(src) - - var/datum/action/cooldown/lay_web/sticky_web/web_sticky = new(src) - web_sticky.Grant(src) - - var/datum/action/cooldown/wrap/wrapping = new(src) - wrapping.Grant(src) - - var/datum/action/lay_eggs/make_eggs = new(src) - make_eggs.Grant(src) - - var/datum/action/lay_eggs/enriched/make_better_eggs = new(src) - make_better_eggs.Grant(src) - - var/datum/action/set_spider_directive/give_orders = new(src) - give_orders.Grant(src) - - var/datum/action/command_spiders/not_hivemind_talk = new(src) - not_hivemind_talk.Grant(src) - - AddElement(/datum/element/web_walker, /datum/movespeed_modifier/average_web) - -/** - * ### Giant Ice Spider - * - * 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/basic/giant_spider/ice - name = "giant ice spider" - habitable_atmos = 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) - minimum_survivable_temperature = 0 - maximum_survivable_temperature = 1500 - 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 temperature-proof nurse spider. Also unused. - */ -/mob/living/basic/giant_spider/nurse/ice - name = "giant ice spider" - habitable_atmos = 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) - minimum_survivable_temperature = 0 - maximum_survivable_temperature = 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 temperature-proof hunter with chilling venom. Also unused. - */ -/mob/living/basic/giant_spider/hunter/ice - name = "giant ice spider" - habitable_atmos = 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) - minimum_survivable_temperature = 0 - maximum_survivable_temperature = 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. - * Used as a minor threat in abandoned places, such as areas in maintenance or a ruin. - */ -/mob/living/basic/giant_spider/hunter/scrawny - name = "scrawny spider" - 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." - ai_controller = /datum/ai_controller/basic_controller/giant_spider/weak - -/** - * ### Scrawny Tarantula - * - * A weaker version of the Tarantula, unable to smash enviroments. - * Used as a moderately strong but slow threat in abandoned places, such as areas in maintenance or a ruin. - */ -/mob/living/basic/giant_spider/tarantula/scrawny - name = "scrawny tarantula" - 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." - ai_controller = /datum/ai_controller/basic_controller/giant_spider/weak - -/** - * ### 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. - * In the future we should give this AI so that it actually heals its teammates. - */ -/mob/living/basic/giant_spider/nurse/scrawny - name = "scrawny nurse spider" - 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." - ai_controller = /datum/ai_controller/basic_controller/giant_spider/weak - -/** - * ### Flesh Spider - * - * A subtype of giant spider which only occurs from changelings. - * Has the base stats of a hunter, but they can heal themselves and spin webs faster. - * They also occasionally leave puddles of blood when they walk around. Flavorful! - */ -/mob/living/basic/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 - maxHealth = 90 - health = 90 - menu_description = "Self-sufficient spider variant capable of healing themselves and producing webbbing fast." - -/mob/living/basic/giant_spider/hunter/flesh/Initialize(mapload) - . = ..() - AddComponent(/datum/component/blood_walk, \ - blood_type = /obj/effect/decal/cleanable/blood/bubblegum, \ - blood_spawn_chance = 5) - // It might be easier and more fitting to just replace this with Regenerator - AddComponent(/datum/component/healing_touch,\ - heal_brute = maxHealth * 0.5,\ - heal_burn = maxHealth * 0.5,\ - self_targetting = HEALING_TOUCH_SELF_ONLY,\ - interaction_key = DOAFTER_SOURCE_SPIDER,\ - valid_targets_typecache = typecacheof(list(/mob/living/basic/giant_spider/hunter/flesh)),\ - extra_checks = CALLBACK(src, PROC_REF(can_mend)),\ - action_text = "%SOURCE% begins mending themselves...",\ - complete_text = "%SOURCE%'s wounds mend together.",\ - ) - -/// Prevent you from healing other flesh spiders, or healing when on fire -/mob/living/basic/giant_spider/hunter/flesh/proc/can_mend(mob/living/source, mob/living/target) - if (on_fire) - balloon_alert(src, "on fire!") - return FALSE - return TRUE - -/mob/living/basic/giant_spider/hunter/flesh/Initialize(mapload) - . = ..() - var/datum/action/cooldown/lay_web/web_spikes/spikes_web = new(src) - spikes_web.Grant(src) - - var/datum/action/cooldown/lay_web/sticky_web/web_sticky = new(src) - web_sticky.Grant(src) - -/** - * ### Viper Spider (Wizard) - * - * A spider form for wizards. Has the viper spider's extreme speed and strong venom, with additional health and vent crawling abilities. - */ -/mob/living/basic/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." - apply_spider_antag = FALSE - -/mob/living/basic/giant_spider/viper/wizard/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - -/** - * ### Sergeant Araneus - * - * This friendly arachnid hangs out in the HoS office on some space stations. Better trained than an average officer and does not attack except in self-defence. - */ -/mob/living/basic/giant_spider/sgt_araneus - 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." - faction = list(FACTION_SPIDER) - gold_core_spawnable = NO_SPAWN - maxHealth = 250 - health = 250 - melee_damage_lower = 15 - melee_damage_upper = 20 - ai_controller = /datum/ai_controller/basic_controller/giant_spider/retaliate - apply_spider_antag = FALSE - -/mob/living/basic/giant_spider/sgt_araneus/Initialize(mapload) - . = ..() - AddElement(/datum/element/pet_bonus, "chitters proudly!") - AddElement(/datum/element/ai_retaliate) - ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - -/** - * ### Duct Spider - * - * A less giant spider which lives in the maintenance ducts and makes them annoying to traverse. - */ -/mob/living/basic/giant_spider/maintenance - name = "duct spider" - desc = "Nanotrasen's imported solution to mice, comes with its own problems." - icon_state = "maint_spider" - icon_living = "maint_spider" - icon_dead = "maint_spider_dead" - can_be_held = TRUE - mob_size = MOB_SIZE_TINY - held_w_class = WEIGHT_CLASS_TINY - worn_slot_flags = ITEM_SLOT_HEAD - head_icon = 'icons/mob/clothing/head/pets_head.dmi' - density = FALSE - pass_flags = PASSTABLE|PASSGRILLE|PASSMOB - gold_core_spawnable = FRIENDLY_SPAWN - maxHealth = 10 - health = 10 - melee_damage_lower = 1 - melee_damage_upper = 1 - speed = 0 - player_speed_modifier = 0 - web_speed = 0.25 - menu_description = "Fragile spider variant which is not good for much other than laying webs." - response_harm_continuous = "splats" - response_harm_simple = "splat" - ai_controller = /datum/ai_controller/basic_controller/giant_spider/pest - apply_spider_antag = FALSE - -/mob/living/basic/giant_spider/maintenance/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - AddElement(/datum/element/web_walker, /datum/movespeed_modifier/average_web) - AddElement(/datum/element/ai_retaliate) - AddElement(/datum/element/tiny_mob_hunter) diff --git a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spiders.dm b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spiders.dm new file mode 100644 index 0000000000000..6df2eb427f411 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spiders.dm @@ -0,0 +1,584 @@ +/** + * # Giant Spider + * + * A mob which can be created by dynamic event, botany, or xenobiology. + * The basic type is the guard, which is slow but sturdy and outputs good damage. + * All spiders can produce webbing. + */ +/mob/living/basic/spider/giant + 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" + speed = 5 + maxHealth = 125 + health = 125 + obj_damage = 30 + melee_damage_lower = 20 + melee_damage_upper = 25 + gold_core_spawnable = HOSTILE_SPAWN + ai_controller = /datum/ai_controller/basic_controller/giant_spider + + +/** + * ### Ambush Spider + * A subtype of the giant spider which is slower, stronger and able to sneak into its surroundings to pull pray aggressively. + * This spider is only slightly slower than a human. + */ +/mob/living/basic/spider/giant/ambush + name = "ambush spider" + desc = "Furry and white, it makes you shudder to look at it. This one has sparkling pink eyes." + icon = 'icons/mob/simple/arachnoid.dmi' + icon_state = "ambush" + icon_living = "ambush" + icon_dead = "ambush_dead" + gender = FEMALE + maxHealth = 125 + health = 125 + obj_damage = 45 + melee_damage_lower = 25 + melee_damage_upper = 30 + speed = 5 + player_speed_modifier = -3.1 + menu_description = "Slow spider variant specializing in stalking and ambushing prey, above avarage health and damage with a strong grip." + +/mob/living/basic/spider/giant/ambush/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_STRONG_GRABBER, INNATE_TRAIT) + + AddElement(/datum/element/web_walker, /datum/movespeed_modifier/slow_web) + + var/datum/action/cooldown/mob_cooldown/sneak/spider/sneak_web = new(src) + sneak_web.Grant(src) + +/** + * ### Guard Spider + * A subtype of the giant spider which is similar on every single way, + * This spider is only slightly slower than a human. + */ +/mob/living/basic/spider/giant/guard + name = "guard spider" + desc = "Furry and black, it makes you shudder to look at it. This one has deep red eyes." + icon = 'icons/mob/simple/arachnoid.dmi' + icon_state = "guard" + icon_living = "guard" + icon_dead = "guard_dead" + gender = FEMALE + maxHealth = 160 + health = 160 + melee_damage_lower = 20 + melee_damage_upper = 25 + obj_damage = 45 + speed = 5 + player_speed_modifier = -4 + menu_description = "Tanky and strong for the defense of the nest and other spiders." + +/mob/living/basic/spider/giant/guard/Initialize(mapload) + . = ..() + + AddElement(/datum/element/web_walker, /datum/movespeed_modifier/average_web) + var/datum/action/cooldown/mob_cooldown/web_effigy/shed = new(src) + shed.Grant(src) + +/** + * ### Hunter Spider + * 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/basic/spider/giant/hunter + name = "hunter spider" + desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes." + icon = 'icons/mob/simple/arachnoid.dmi' + icon_state = "hunter" + icon_living = "hunter" + icon_dead = "hunter_dead" + maxHealth = 80 + health = 80 + melee_damage_lower = 15 + melee_damage_upper = 20 + poison_per_bite = 5 + speed = 3 + player_speed_modifier = -3.1 + menu_description = "Fast spider variant specializing in catching running prey and toxin injection, but has less health and damage." + +/mob/living/basic/spider/giant/hunter/Initialize(mapload) + . = ..() + + AddElement(/datum/element/web_walker, /datum/movespeed_modifier/fast_web) + +/** + * ### Scout Spider + * A subtype of the giant spider which is faster, has thermal vision, but less health and damage. + * This spider is only slightly faster than a human. + */ +/mob/living/basic/spider/giant/scout + name = "scout spider" + desc = "Furry and blueish black, it makes you shudder to look at it. This one has sparkling blue eyes." + icon = 'icons/mob/simple/arachnoid.dmi' + icon_state = "scout" + icon_living = "scout" + icon_dead = "scout_dead" + maxHealth = 65 + health = 65 + obj_damage = 10 + melee_damage_lower = 5 + melee_damage_upper = 10 + poison_per_bite = 10 + poison_type = /datum/reagent/peaceborg/confuse + speed = 2.8 + player_speed_modifier = -3.1 + sight = SEE_SELF|SEE_MOBS + menu_description = "Fast spider variant specializing in scouting and alerting of prey, with the ability to travel in vents." + +/mob/living/basic/spider/giant/scout/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + + var/datum/action/cooldown/mob_cooldown/command_spiders/communication_spiders/spiders_communication = new(src) + spiders_communication.Grant(src) + +/** + * ### Nurse Spider + * + * 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/basic/spider/giant/nurse + name = "nurse spider" + desc = "Furry and black, it makes you shudder to look at it. This one has brilliant green eyes." + icon = 'icons/mob/simple/arachnoid.dmi' + 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 + speed = 4 + player_speed_modifier = -3.1 + web_speed = 0.25 + web_type = /datum/action/cooldown/mob_cooldown/lay_web/sealer + 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/basic/spider/giant/nurse/Initialize(mapload) + . = ..() + var/datum/atom_hud/datahud = GLOB.huds[health_hud] + datahud.show_to(src) + + AddComponent(/datum/component/healing_touch,\ + heal_brute = 25,\ + heal_burn = 25,\ + interaction_key = DOAFTER_SOURCE_SPIDER,\ + valid_targets_typecache = typecacheof(list(/mob/living/basic/spider/giant)),\ + action_text = "%SOURCE% begins wrapping the wounds of %TARGET%.",\ + complete_text = "%SOURCE% wraps the wounds of %TARGET%.",\ + ) + + AddElement(/datum/element/web_walker, /datum/movespeed_modifier/average_web) + +/** + * ### Tangle Spider + * + * A subtype of the giant spider which specializes in support skills. + * Tangle spiders can place down webbing in a quarter of the time that other species plus has an expanded arsenal of traps and web structures to place to benefit the nest. + * Note that it can heal itself. + */ +/mob/living/basic/spider/giant/tangle + name = "tangle spider" + desc = "Furry and brown, it makes you shudder to look at it. This one has dim brown eyes." + icon = 'icons/mob/simple/arachnoid.dmi' + icon_state = "tangle" + icon_living = "tangle" + icon_dead = "tangle_dead" + gender = FEMALE + butcher_results = list(/obj/item/food/meat/slab/spider = 2, /obj/item/food/spiderleg = 8, /obj/item/food/spidereggs = 4) + maxHealth = 55 + health = 55 + melee_damage_lower = 1 + melee_damage_upper = 1 + poison_per_bite = 2.5 + poison_type = /datum/reagent/toxin/acid + obj_damage = 40 + web_speed = 0.25 + speed = 4 + player_speed_modifier = -3.1 + web_type = /datum/action/cooldown/mob_cooldown/lay_web/sealer + menu_description = "Support spider variant specializing in contruction to protect their brethren, but has very low amount of health and deals low damage." + +/mob/living/basic/spider/giant/tangle/Initialize(mapload) + . = ..() + var/datum/action/cooldown/mob_cooldown/lay_web/solid_web/web_solid = new(src) + web_solid.Grant(src) + + var/datum/action/cooldown/mob_cooldown/lay_web/web_passage/passage_web = new(src) + passage_web.Grant(src) + + var/datum/action/cooldown/mob_cooldown/lay_web/web_spikes/spikes_web = new(src) + spikes_web.Grant(src) + + var/datum/action/cooldown/mob_cooldown/lay_web/sticky_web/web_sticky = new(src) + web_sticky.Grant(src) + + AddElement(/datum/element/web_walker, /datum/movespeed_modifier/average_web) + + AddComponent(/datum/component/healing_touch,\ + heal_brute = 15,\ + heal_burn = 15,\ + heal_time = 3 SECONDS,\ + self_targetting = HEALING_TOUCH_SELF_ONLY,\ + interaction_key = DOAFTER_SOURCE_SPIDER,\ + valid_targets_typecache = typecacheof(list(/mob/living/basic/spider/growing/young/tangle, /mob/living/basic/spider/giant/tangle)),\ + extra_checks = CALLBACK(src, PROC_REF(can_mend)),\ + action_text = "%SOURCE% begins mending themselves...",\ + complete_text = "%SOURCE%'s wounds mend together.",\ + ) + +/// Prevent you from healing other tangle spiders, or healing when on fire +/mob/living/basic/spider/giant/tangle/proc/can_mend(mob/living/source, mob/living/target) + if (on_fire) + balloon_alert(src, "on fire!") + return FALSE + return TRUE + +/** + * ### Tarantula + * + * A subtype of the giant spider which specializes in pure strength and staying power. + * Is slowed down when not on webbing, but can lunge to throw off attackers and possibly to stun them. + */ +/mob/living/basic/spider/giant/tarantula + name = "tarantula" + desc = "Furry and black, it makes you shudder to look at it. This one has abyssal red eyes." + icon = 'icons/mob/simple/arachnoid.dmi' + icon_state = "tarantula" + icon_living = "tarantula" + icon_dead = "tarantula_dead" + maxHealth = 360 // woah nelly + health = 360 + melee_damage_lower = 35 + melee_damage_upper = 40 + obj_damage = 100 + damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) + speed = 6 + player_speed_modifier = -5.5 // Doesn't seem that slow but it gets a debuff off web + mob_size = MOB_SIZE_LARGE + gold_core_spawnable = NO_SPAWN + web_speed = 0.7 + web_type = /datum/action/cooldown/mob_cooldown/lay_web/sealer + 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." + /// Charging ability + var/datum/action/cooldown/mob_cooldown/charge/basic_charge/charge + +/mob/living/basic/spider/giant/tarantula/Initialize(mapload) + . = ..() + var/datum/action/cooldown/mob_cooldown/lay_web/solid_web/web_solid = new(src) + web_solid.Grant(src) + + var/datum/action/cooldown/mob_cooldown/lay_web/web_passage/passage_web = new(src) + passage_web.Grant(src) + + charge = new /datum/action/cooldown/mob_cooldown/charge/basic_charge() + charge.Grant(src) + + AddElement(/datum/element/tear_wall) + AddElement(/datum/element/web_walker, /datum/movespeed_modifier/slow_web) + +/mob/living/basic/spider/giant/tarantula/Destroy() + QDEL_NULL(charge) + return ..() + +/// Lunge if you click something at range +/mob/living/basic/spider/giant/tarantula/ranged_secondary_attack(atom/atom_target, modifiers) + charge.Trigger(target = atom_target) + +/** + * ### Spider Viper + * + * A subtype of the giant spider which specializes in speed and poison. + * Injects a deadlier toxin than other spiders, moves extremely fast, but has a limited amount of health. + */ +/mob/living/basic/spider/giant/viper + name = "viper spider" + desc = "Furry and black, it makes you shudder to look at it. This one has effervescent purple eyes." + icon = 'icons/mob/simple/arachnoid.dmi' + icon_state = "viper" + icon_living = "viper" + icon_dead = "viper_dead" + maxHealth = 55 + health = 55 + melee_damage_lower = 5 + melee_damage_upper = 5 + poison_per_bite = 5 + poison_type = /datum/reagent/toxin/viperspider + speed = 2 + player_speed_modifier = -2.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." + +/mob/living/basic/spider/giant/viper/Initialize(mapload) + . = ..() + + AddElement(/datum/element/bonus_damage) + + var/datum/action/cooldown/mob_cooldown/defensive_mode/defensive_action = new(src) + defensive_action.Grant(src) + +/** + * ### Spider Broodmother + * + * A subtype of the giant spider which is the crux of a spider horde, and the way which it grows. + * Has very little offensive capabilities but can lay eggs at any time to create more basic spiders. + * After consuming human bodies can lay specialised eggs including more broodmothers. + * They are also capable of sending messages to all living spiders and setting directives for their children. + */ +/mob/living/basic/spider/giant/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 = 'icons/mob/simple/arachnoid.dmi' + icon_state = "midwife" + icon_living = "midwife" + icon_dead = "midwife_dead" + maxHealth = 250 + health = 250 + melee_damage_lower = 10 + melee_damage_upper = 15 + speed = 4 + player_speed_modifier = -3.1 + gold_core_spawnable = NO_SPAWN + web_speed = 0.5 + web_type = /datum/action/cooldown/mob_cooldown/lay_web/sealer + menu_description = "Royal spider variant specializing in reproduction and leadership, deals low damage." + +/mob/living/basic/spider/giant/midwife/Initialize(mapload) + . = ..() + var/datum/action/cooldown/mob_cooldown/lay_web/solid_web/web_solid = new(src) + web_solid.Grant(src) + + var/datum/action/cooldown/mob_cooldown/lay_web/web_passage/passage_web = new(src) + passage_web.Grant(src) + + var/datum/action/cooldown/mob_cooldown/lay_web/web_spikes/spikes_web = new(src) + spikes_web.Grant(src) + + var/datum/action/cooldown/mob_cooldown/lay_web/sticky_web/web_sticky = new(src) + web_sticky.Grant(src) + + var/datum/action/cooldown/mob_cooldown/wrap/wrapping = new(src) + wrapping.Grant(src) + + var/datum/action/cooldown/mob_cooldown/lay_eggs/make_eggs = new(src) + make_eggs.Grant(src) + + var/datum/action/cooldown/mob_cooldown/lay_eggs/enriched/make_better_eggs = new(src) + make_better_eggs.Grant(src) + + var/datum/action/cooldown/mob_cooldown/set_spider_directive/give_orders = new(src) + give_orders.Grant(src) + + var/datum/action/cooldown/mob_cooldown/command_spiders/not_hivemind_talk = new(src) + not_hivemind_talk.Grant(src) + + AddElement(/datum/element/web_walker, /datum/movespeed_modifier/average_web) + +/** + * ### Giant Ice Spider + * + * 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/basic/spider/giant/ice + name = "giant ice spider" + habitable_atmos = 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) + minimum_survivable_temperature = 0 + maximum_survivable_temperature = 1500 + 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 temperature-proof nurse spider. Also unused. + */ +/mob/living/basic/spider/giant/nurse/ice + name = "giant ice spider" + habitable_atmos = 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) + minimum_survivable_temperature = 0 + maximum_survivable_temperature = 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 temperature-proof hunter with chilling venom. Also unused. + */ +/mob/living/basic/spider/giant/hunter/ice + name = "giant ice spider" + habitable_atmos = 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) + minimum_survivable_temperature = 0 + maximum_survivable_temperature = 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. + * Used as a minor threat in abandoned places, such as areas in maintenance or a ruin. + */ +/mob/living/basic/spider/giant/hunter/scrawny + name = "scrawny spider" + 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." + ai_controller = /datum/ai_controller/basic_controller/giant_spider/weak + +/** + * ### Scrawny Tarantula + * + * A weaker version of the Tarantula, unable to smash enviroments. + * Used as a moderately strong but slow threat in abandoned places, such as areas in maintenance or a ruin. + */ +/mob/living/basic/spider/giant/tarantula/scrawny + name = "scrawny tarantula" + 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." + ai_controller = /datum/ai_controller/basic_controller/giant_spider/weak + +/** + * ### 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. + * In the future we should give this AI so that it actually heals its teammates. + */ +/mob/living/basic/spider/giant/nurse/scrawny + name = "scrawny nurse spider" + 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." + ai_controller = /datum/ai_controller/basic_controller/giant_spider/weak + +/** + * ### Flesh Spider + * + * A subtype of giant spider which only occurs from changelings. + * Has the base stats of a hunter, but they can heal themselves and spin webs faster. + * They also occasionally leave puddles of blood when they walk around. Flavorful! + */ +/mob/living/basic/spider/giant/hunter/flesh + name = "flesh spider" + desc = "A odd fleshy creature in the shape of a spider. Its eyes are pitch black and soulless." + icon = 'icons/mob/simple/arachnoid.dmi' + icon_state = "flesh" + icon_living = "flesh" + icon_dead = "flesh_dead" + web_speed = 0.7 + maxHealth = 90 + health = 90 + menu_description = "Self-sufficient spider variant capable of healing themselves and producing webbbing fast." + +/mob/living/basic/spider/giant/hunter/flesh/Initialize(mapload) + . = ..() + AddComponent(/datum/component/blood_walk, \ + blood_type = /obj/effect/decal/cleanable/blood/bubblegum, \ + blood_spawn_chance = 5) + // It might be easier and more fitting to just replace this with Regenerator + AddComponent(/datum/component/healing_touch,\ + heal_brute = 45,\ + heal_burn = 45,\ + self_targetting = HEALING_TOUCH_SELF_ONLY,\ + interaction_key = DOAFTER_SOURCE_SPIDER,\ + valid_targets_typecache = typecacheof(list(/mob/living/basic/spider/giant/hunter/flesh)),\ + extra_checks = CALLBACK(src, PROC_REF(can_mend)),\ + action_text = "%SOURCE% begins mending themselves...",\ + complete_text = "%SOURCE%'s wounds mend together.",\ + ) + + var/datum/action/cooldown/mob_cooldown/lay_web/web_spikes/spikes_web = new(src) + spikes_web.Grant(src) + + var/datum/action/cooldown/mob_cooldown/lay_web/sticky_web/web_sticky = new(src) + web_sticky.Grant(src) + +/// Prevent you from healing other flesh spiders, or healing when on fire +/mob/living/basic/spider/giant/hunter/flesh/proc/can_mend(mob/living/source, mob/living/target) + if (on_fire) + balloon_alert(src, "on fire!") + return FALSE + return TRUE + +/** + * ### Viper Spider (Wizard) + * + * A spider form for wizards. Has the viper spider's extreme speed and strong venom, with additional health and vent crawling abilities. + */ +/mob/living/basic/spider/giant/viper/wizard + name = "water spider" + desc = "Furry and black, it makes you shudder to look at it. This one has effervescent orange eyes." + icon = 'icons/mob/simple/arachnoid.dmi' + icon_state = "water" + icon_living = "water" + icon_dead = "water_dead" + web_speed = 0.4 + maxHealth = 80 + health = 80 + damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1) + unsuitable_cold_damage = 1 + unsuitable_heat_damage = 1 + 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." + apply_spider_antag = FALSE + +/mob/living/basic/spider/giant/viper/wizard/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + + var/datum/action/cooldown/mob_cooldown/lay_web/web_spikes/spikes_web = new(src) + spikes_web.Grant(src) + + var/datum/action/cooldown/mob_cooldown/lay_web/sticky_web/web_sticky = new(src) + web_sticky.Grant(src) + + +/** + * ### Sergeant Araneus + * + * This friendly arachnid hangs out in the HoS office on some space stations. Better trained than an average officer and does not attack except in self-defence. + */ +/mob/living/basic/spider/giant/sgt_araneus + 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." + faction = list(FACTION_SPIDER) + gold_core_spawnable = NO_SPAWN + maxHealth = 250 + health = 250 + melee_damage_lower = 15 + melee_damage_upper = 20 + ai_controller = /datum/ai_controller/basic_controller/giant_spider/retaliate + apply_spider_antag = FALSE + +/mob/living/basic/spider/giant/sgt_araneus/Initialize(mapload) + . = ..() + AddElement(/datum/element/pet_bonus, "chitters proudly!") + AddElement(/datum/element/ai_retaliate) + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) diff --git a/code/modules/mob/living/basic/space_fauna/spider/spider.dm b/code/modules/mob/living/basic/space_fauna/spider/spider.dm new file mode 100644 index 0000000000000..4bd773f6d0abb --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/spider/spider.dm @@ -0,0 +1,177 @@ +/** + * Base type of various spider life stages + */ +/mob/living/basic/spider + name = "abstract spider" + desc = "Furry and abstract, it makes you shudder to look at it. This one should not exist." + icon = 'icons/mob/simple/arachnoid.dmi' + mob_biotypes = MOB_ORGANIC|MOB_BUG + speak_emote = list("chitters") + 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 + melee_attack_cooldown = CLICK_CD_MELEE + damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1) + basic_mob_flags = FLAMMABLE_MOB + status_flags = NONE + unsuitable_cold_damage = 4 + unsuitable_heat_damage = 4 + combat_mode = TRUE + faction = list(FACTION_SPIDER) + pass_flags = PASSTABLE + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + attack_sound = 'sound/weapons/bite.ogg' + attack_vis_effect = ATTACK_EFFECT_BITE + unique_name = TRUE + lighting_cutoff_red = 22 + lighting_cutoff_green = 5 + lighting_cutoff_blue = 5 + /// Speed modifier to apply if controlled by a human player + var/player_speed_modifier = -4 + /// What reagent the mob injects targets with + var/poison_type = /datum/reagent/toxin/hunterspider + /// How much of a reagent the mob injects on attack + var/poison_per_bite = 0 + /// Multiplier to apply to web laying speed. Fractional numbers make it faster, because it's a multiplier. + var/web_speed = 1 + /// Type of webbing ability to learn. + var/web_type = /datum/action/cooldown/mob_cooldown/lay_web + /// 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 = "Tanky and strong for the defense of the nest and other spiders." + /// If true then you shouldn't be told that you're a spider antagonist as soon as you are placed into this mob + var/apply_spider_antag = TRUE + +/mob/living/basic/spider/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_WEB_SURFER, INNATE_TRAIT) + AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW) + 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!") + AddElement(/datum/element/cliff_walking) + + if(poison_per_bite) + AddElement(/datum/element/venomous, poison_type, poison_per_bite) + + var/datum/action/cooldown/mob_cooldown/lay_web/webbing = new web_type(src) + webbing.webbing_time *= web_speed + webbing.Grant(src) + ai_controller?.set_blackboard_key(BB_SPIDER_WEB_ACTION, webbing) + +/mob/living/basic/spider/Login() + . = ..() + if(!. || !client) + return FALSE + GLOB.spidermobs[src] = TRUE + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/player_spider_modifier, multiplicative_slowdown = player_speed_modifier) + +/mob/living/basic/spider/Logout() + . = ..() + remove_movespeed_modifier(/datum/movespeed_modifier/player_spider_modifier) + +/mob/living/basic/spider/Destroy() + GLOB.spidermobs -= src + return ..() + +/mob/living/basic/spider/mob_negates_gravity() + if(locate(/obj/structure/spider/stickyweb) in loc) + return TRUE + return ..() + +/mob/living/basic/spider/expose_reagents(list/reagents, datum/reagents/source, methods=TOUCH, volume_modifier=1, show_message=TRUE) + . = ..() + for(var/datum/reagent/toxin/pestkiller/current_reagent in reagents) + apply_damage(50 * volume_modifier, STAMINA, BODY_ZONE_CHEST) + +/// Spider which turns into another spider over time +/mob/living/basic/spider/growing + /// The mob type we will grow into. + var/mob/living/basic/spider/grow_as = null + /// The time it takes for the spider to grow into the next stage + var/spider_growth_time = 1 MINUTES + +/mob/living/basic/spider/growing/Initialize(mapload) + . = ..() + AddComponent(\ + /datum/component/growth_and_differentiation,\ + growth_time = spider_growth_time,\ + growth_path = grow_as,\ + growth_probability = 25,\ + lower_growth_value = 1,\ + upper_growth_value = 2,\ + optional_checks = CALLBACK(src, PROC_REF(ready_to_grow)),\ + optional_grow_behavior = CALLBACK(src, PROC_REF(grow_up))\ + ) + +/** + * Checks to see if we're ready to grow, primarily if we are on solid ground and not in a vent or something. + * The component will automagically grow us when we return TRUE and that threshold has been met. + */ +/mob/living/basic/spider/growing/proc/ready_to_grow() + if(isturf(loc)) + return TRUE + + return FALSE + +/// Actually grows the young spider into a giant spider. We have to do a bunch of unique behavior that really can't be genericized, so we have to override the component in this manner. +/** + * Actually move to our next stage of life. + */ +/mob/living/basic/spider/growing/proc/grow_up() + if(isnull(grow_as)) + if(prob(3)) + grow_as = pick(/mob/living/basic/spider/giant/tarantula, /mob/living/basic/spider/giant/viper, /mob/living/basic/spider/giant/midwife) + else + grow_as = pick(/mob/living/basic/spider/giant/guard, /mob/living/basic/spider/giant/ambush, /mob/living/basic/spider/giant/hunter, /mob/living/basic/spider/giant/scout, /mob/living/basic/spider/giant/nurse, /mob/living/basic/spider/giant/tangle) + + var/mob/living/basic/spider/giant/grown = change_mob_type(grow_as, get_turf(src), initial(grow_as.name)) + ADD_TRAIT(grown, TRAIT_WAS_EVOLVED, REF(src)) + grown.faction = faction.Copy() + grown.directive = directive + grown.set_name() + grown.setBruteLoss(getBruteLoss()) + grown.setFireLoss(getFireLoss()) + qdel(src) + +/** + * ### Duct Spider + * A less than giant spider which lives in the maintenance ducts and makes them annoying to traverse. + */ +/mob/living/basic/spider/maintenance + name = "duct spider" + desc = "Nanotrasen's imported solution to mice, comes with its own problems." + icon_state = "maint_spider" + icon_living = "maint_spider" + icon_dead = "maint_spider_dead" + can_be_held = TRUE + mob_size = MOB_SIZE_TINY + held_w_class = WEIGHT_CLASS_TINY + worn_slot_flags = ITEM_SLOT_HEAD + head_icon = 'icons/mob/clothing/head/pets_head.dmi' + density = FALSE + pass_flags = PASSTABLE|PASSGRILLE|PASSMOB + gold_core_spawnable = FRIENDLY_SPAWN + maxHealth = 10 + health = 10 + melee_damage_lower = 1 + melee_damage_upper = 1 + speed = 0 + player_speed_modifier = 0 + web_speed = 0.25 + menu_description = "Fragile spider variant which is not good for much other than laying webs." + response_harm_continuous = "splats" + response_harm_simple = "splat" + ai_controller = /datum/ai_controller/basic_controller/giant_spider/pest + apply_spider_antag = FALSE + +/mob/living/basic/spider/maintenance/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + AddElement(/datum/element/web_walker, /datum/movespeed_modifier/average_web) + AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/tiny_mob_hunter) diff --git a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/hivemind.dm b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/hivemind.dm index 77ee38ed7c30d..bbeb2b28bb549 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/hivemind.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/hivemind.dm @@ -2,7 +2,7 @@ * Sets a directive to be given to all future spiders created by the user. * This will be overwritten if used again. */ -/datum/action/set_spider_directive +/datum/action/cooldown/mob_cooldown/set_spider_directive name = "Set Directive" desc = "Set a directive for your future children to follow." button_icon = 'icons/mob/actions/actions_animal.dmi' @@ -10,26 +10,27 @@ background_icon_state = "bg_alien" overlay_icon_state = "bg_alien_border" check_flags = AB_CHECK_CONSCIOUS + cooldown_time = 0 + melee_cooldown_time = 0 + shared_cooldown = NONE + click_to_activate = FALSE /// Current directive to apply var/current_directive = "" -/datum/action/set_spider_directive/Trigger(trigger_flags) - . = ..() - if(!.) - return +/datum/action/cooldown/mob_cooldown/set_spider_directive/Activate(atom/target) var/new_directive = tgui_input_text(owner, "Enter the new directive", "Create directive", "[current_directive]") if(isnull(new_directive) || QDELETED(src) || QDELETED(owner) || !IsAvailable(feedback = TRUE)) - return FALSE + return current_directive = new_directive message_admins("[ADMIN_LOOKUPFLW(owner)] set its directive to: '[current_directive]'.") owner.log_message("set its directive to: '[current_directive]'.", LOG_GAME) - return TRUE + StartCooldown() /** * Sends a message to all currently living spiders. */ -/datum/action/command_spiders +/datum/action/cooldown/mob_cooldown/command_spiders name = "Command" desc = "Send a command to all living spiders." button_icon = 'icons/mob/actions/actions_animal.dmi' @@ -37,18 +38,17 @@ background_icon_state = "bg_alien" overlay_icon_state = "bg_alien_border" check_flags = AB_CHECK_CONSCIOUS + cooldown_time = 0 + melee_cooldown_time = 0 + shared_cooldown = NONE + click_to_activate = FALSE -/datum/action/command_spiders/Trigger(trigger_flags) - . = ..() - if(!.) - return - +/datum/action/cooldown/mob_cooldown/command_spiders/Activate(trigger_flags) var/input = tgui_input_text(owner, "Input a command for your legions to follow.", "Command") if(!input || QDELETED(src) || QDELETED(owner) || !IsAvailable(feedback = TRUE)) - return FALSE - + return spider_command(owner, input) - return TRUE + StartCooldown() /** * Sends a big message to all spiders from the target. @@ -58,9 +58,7 @@ * * user - The spider sending the message * * message - The message to be sent */ -/datum/action/command_spiders/proc/spider_command(mob/living/user, message) - if(!message) - return +/datum/action/cooldown/mob_cooldown/command_spiders/proc/spider_command(mob/living/user, message) var/my_message = format_message(user,message) for(var/mob/living/basic/spider as anything in GLOB.spidermobs) to_chat(spider, my_message) @@ -72,17 +70,17 @@ /** * Formats the string to have an appropiate size and text color */ -/datum/action/command_spiders/proc/format_message(mob/living/user, message) +/datum/action/cooldown/mob_cooldown/command_spiders/proc/format_message(mob/living/user, message) return span_spiderbroodmother("Command from [user]: [message]") /** * Sends a small message to all currently living spiders. */ -/datum/action/command_spiders/communication_spiders +/datum/action/cooldown/mob_cooldown/command_spiders/communication_spiders name = "Communication" desc = "Send a report to all living spiders." button_icon = 'icons/mob/actions/actions_animal.dmi' button_icon_state = "message" -/datum/action/command_spiders/communication_spiders/format_message(mob/living/user, message) +/datum/action/cooldown/mob_cooldown/command_spiders/communication_spiders/format_message(mob/living/user, message) return span_spiderscout("Report from [user]: [message]") diff --git a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/lay_eggs.dm b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/lay_eggs.dm index cd86a93f75d4d..28a543be3acfb 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/lay_eggs.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/lay_eggs.dm @@ -1,4 +1,4 @@ -/datum/action/lay_eggs +/datum/action/cooldown/mob_cooldown/lay_eggs name = "Lay Eggs" desc = "Lay a cluster of eggs, which will soon grow into a normal spider." button_icon = 'icons/mob/actions/actions_animal.dmi' @@ -6,22 +6,26 @@ background_icon_state = "bg_alien" overlay_icon_state = "bg_alien_border" check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED + cooldown_time = 0 + melee_cooldown_time = 0 + shared_cooldown = NONE + click_to_activate = FALSE ///How long it takes for a broodmother to lay eggs. var/egg_lay_time = 4 SECONDS ///The type of egg we create var/egg_type = /obj/effect/mob_spawn/ghost_role/spider -/datum/action/lay_eggs/Grant(mob/grant_to) +/datum/action/cooldown/mob_cooldown/lay_eggs/Grant(mob/grant_to) . = ..() if (!owner) return RegisterSignals(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_DO_AFTER_BEGAN, COMSIG_DO_AFTER_ENDED), PROC_REF(update_status_on_signal)) -/datum/action/lay_eggs/Remove(mob/removed_from) +/datum/action/cooldown/mob_cooldown/lay_eggs/Remove(mob/removed_from) . = ..() UnregisterSignal(removed_from, list(COMSIG_MOVABLE_MOVED, COMSIG_DO_AFTER_BEGAN, COMSIG_DO_AFTER_ENDED)) -/datum/action/lay_eggs/IsAvailable(feedback = FALSE) +/datum/action/cooldown/mob_cooldown/lay_eggs/IsAvailable(feedback = FALSE) . = ..() if(!.) return FALSE @@ -36,30 +40,28 @@ return FALSE return TRUE -/datum/action/lay_eggs/Trigger(trigger_flags) - . = ..() - if (!.) - return - +/datum/action/cooldown/mob_cooldown/lay_eggs/Activate(atom/target) owner.balloon_alert_to_viewers("laying eggs...") - if(do_after(owner, egg_lay_time, target = get_turf(owner), interaction_key = DOAFTER_SOURCE_SPIDER)) - var/obj/structure/spider/eggcluster/eggs = locate() in get_turf(owner) - if(eggs) - owner.balloon_alert(owner, "already eggs here!") - else - lay_egg() - else + StartCooldown(360 SECONDS, 360 SECONDS) + if(!do_after(owner, egg_lay_time, target = get_turf(owner), interaction_key = DOAFTER_SOURCE_SPIDER)) owner.balloon_alert(owner, "interrupted!") - build_all_button_icons(UPDATE_BUTTON_STATUS) + StartCooldown(0 SECONDS) + return + var/obj/structure/spider/eggcluster/eggs = locate() in get_turf(owner) + if(eggs) + owner.balloon_alert(owner, "already eggs here!") + else + lay_egg() + StartCooldown() -/datum/action/lay_eggs/proc/lay_egg() +/datum/action/cooldown/mob_cooldown/lay_eggs/proc/lay_egg() var/obj/effect/mob_spawn/ghost_role/spider/new_eggs = new egg_type(get_turf(owner)) new_eggs.faction = owner.faction - var/datum/action/set_spider_directive/spider_directive = locate() in owner.actions + var/datum/action/cooldown/mob_cooldown/set_spider_directive/spider_directive = locate() in owner.actions if (spider_directive) new_eggs.directive = spider_directive.current_directive -/datum/action/lay_eggs/enriched +/datum/action/cooldown/mob_cooldown/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" @@ -67,7 +69,7 @@ /// How many charges we have to make eggs var/charges = 0 -/datum/action/lay_eggs/enriched/IsAvailable(feedback = FALSE) +/datum/action/cooldown/mob_cooldown/lay_eggs/enriched/IsAvailable(feedback = FALSE) . = ..() if (!.) return FALSE @@ -77,6 +79,6 @@ return FALSE return TRUE -/datum/action/lay_eggs/enriched/lay_egg() +/datum/action/cooldown/mob_cooldown/lay_eggs/enriched/lay_egg() charges-- return ..() diff --git a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/web.dm b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/web.dm index bcc4a5f089c83..b7062a2dc17c3 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/web.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/web.dm @@ -1,5 +1,5 @@ /// Make a sticky web under yourself for area fortification -/datum/action/cooldown/lay_web +/datum/action/cooldown/mob_cooldown/lay_web name = "Spin Web" desc = "Spin a web to slow down potential prey." button_icon = 'icons/mob/actions/actions_animal.dmi' @@ -9,20 +9,22 @@ check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED cooldown_time = 0 SECONDS melee_cooldown_time = 0 + shared_cooldown = NONE + click_to_activate = FALSE /// How long it takes to lay a web var/webbing_time = 4 SECONDS -/datum/action/cooldown/lay_web/Grant(mob/grant_to) +/datum/action/cooldown/mob_cooldown/lay_web/Grant(mob/grant_to) . = ..() if (!owner) return RegisterSignals(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_DO_AFTER_BEGAN, COMSIG_DO_AFTER_ENDED), PROC_REF(update_status_on_signal)) -/datum/action/cooldown/lay_web/Remove(mob/removed_from) +/datum/action/cooldown/mob_cooldown/lay_web/Remove(mob/removed_from) . = ..() UnregisterSignal(removed_from, list(COMSIG_MOVABLE_MOVED, COMSIG_DO_AFTER_BEGAN, COMSIG_DO_AFTER_ENDED)) -/datum/action/cooldown/lay_web/IsAvailable(feedback = FALSE) +/datum/action/cooldown/mob_cooldown/lay_web/IsAvailable(feedback = FALSE) . = ..() if(!.) return FALSE @@ -34,6 +36,10 @@ if (feedback) owner.balloon_alert(owner, "invalid location!") return FALSE + if(HAS_TRAIT(owner.loc, TRAIT_SPINNING_WEB_TURF)) + if (feedback) + owner.balloon_alert(owner, "already being webbed!") + return FALSE if(obstructed_by_other_web()) if (feedback) owner.balloon_alert(owner, "already webbed!") @@ -41,10 +47,10 @@ return TRUE /// Returns true if there's a web we can't put stuff on in our turf -/datum/action/cooldown/lay_web/proc/obstructed_by_other_web() +/datum/action/cooldown/mob_cooldown/lay_web/proc/obstructed_by_other_web() return !!(locate(/obj/structure/spider/stickyweb) in get_turf(owner)) -/datum/action/cooldown/lay_web/Activate() +/datum/action/cooldown/mob_cooldown/lay_web/Activate() . = ..() var/turf/spider_turf = get_turf(owner) var/obj/structure/spider/stickyweb/web = locate() in spider_turf @@ -52,101 +58,117 @@ owner.balloon_alert_to_viewers("sealing web...") else owner.balloon_alert_to_viewers("spinning web...") - + ADD_TRAIT(spider_turf, TRAIT_SPINNING_WEB_TURF, REF(src)) if(do_after(owner, webbing_time, target = spider_turf, interaction_key = DOAFTER_SOURCE_SPIDER) && owner.loc == spider_turf) plant_web(spider_turf, web) else owner?.balloon_alert(owner, "interrupted!") // Null check because we might have been interrupted via being disintegrated + REMOVE_TRAIT(spider_turf, TRAIT_SPINNING_WEB_TURF, REF(src)) build_all_button_icons() /// Creates a web in the current turf -/datum/action/cooldown/lay_web/proc/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) +/datum/action/cooldown/mob_cooldown/lay_web/proc/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) new /obj/structure/spider/stickyweb(target_turf) /// Variant for genetics, created webs only allow the creator passage -/datum/action/cooldown/lay_web/genetic +/datum/action/cooldown/mob_cooldown/lay_web/genetic desc = "Spin a web. Only you will be able to traverse your web easily." cooldown_time = 4 SECONDS //the same time to lay a web -/datum/action/cooldown/lay_web/genetic/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) +/datum/action/cooldown/mob_cooldown/lay_web/genetic/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) new /obj/structure/spider/stickyweb/genetic(target_turf, owner) /// Variant which allows webs to be stacked into walls -/datum/action/cooldown/lay_web/sealer +/datum/action/cooldown/mob_cooldown/lay_web/sealer desc = "Spin a web to slow down potential prey. Webs can be stacked to make solid structures." -/datum/action/cooldown/lay_web/sealer/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) +/datum/action/cooldown/mob_cooldown/lay_web/sealer/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) if (existing_web) qdel(existing_web) new /obj/structure/spider/stickyweb/sealed(target_turf) return new /obj/structure/spider/stickyweb(target_turf) -/datum/action/cooldown/lay_web/sealer/obstructed_by_other_web() +/datum/action/cooldown/mob_cooldown/lay_web/sealer/obstructed_by_other_web() return !!(locate(/obj/structure/spider/stickyweb/sealed) in get_turf(owner)) -/datum/action/cooldown/lay_web/solid_web +/datum/action/cooldown/mob_cooldown/lay_web/solid_web name = "Spin Solid Web" - desc = "Spin a web to slow down potential prey." + desc = "Spin a web to obstruct potential prey." button_icon_state = "lay_solid_web" cooldown_time = 0 SECONDS webbing_time = 5 SECONDS -/datum/action/cooldown/lay_web/solid_web/obstructed_by_other_web() +/datum/action/cooldown/mob_cooldown/lay_web/solid_web/obstructed_by_other_web() return !!(locate(/obj/structure/spider/solid) in get_turf(owner)) -/datum/action/cooldown/lay_web/solid_web/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) +/datum/action/cooldown/mob_cooldown/lay_web/solid_web/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) new /obj/structure/spider/solid(target_turf) -/datum/action/cooldown/lay_web/web_passage +/datum/action/cooldown/mob_cooldown/lay_web/web_passage name = "Spin Web Passage" desc = "Spin a web passage to hide the nest from prey view." button_icon_state = "lay_web_passage" cooldown_time = 0 SECONDS webbing_time = 4 SECONDS -/datum/action/cooldown/lay_web/web_passage/obstructed_by_other_web() +/datum/action/cooldown/mob_cooldown/lay_web/web_passage/obstructed_by_other_web() return !!(locate(/obj/structure/spider/passage) in get_turf(owner)) -/datum/action/cooldown/lay_web/web_passage/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) +/datum/action/cooldown/mob_cooldown/lay_web/web_passage/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) new /obj/structure/spider/passage(target_turf) -/datum/action/cooldown/lay_web/sticky_web +/datum/action/cooldown/mob_cooldown/lay_web/sticky_web name = "Spin Sticky Web" - desc = "Spin a web to stick intruders in place." + desc = "Spin a sticky web to trap intruders." button_icon_state = "lay_sticky_web" cooldown_time = 20 SECONDS webbing_time = 3 SECONDS -/datum/action/cooldown/lay_web/sticky_web/obstructed_by_other_web() +/datum/action/cooldown/mob_cooldown/lay_web/sticky_web/obstructed_by_other_web() return !!(locate(/obj/structure/spider/sticky) in get_turf(owner)) -/datum/action/cooldown/lay_web/sticky_web/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) +/datum/action/cooldown/mob_cooldown/lay_web/sticky_web/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) new /obj/structure/spider/sticky(target_turf) -/datum/action/cooldown/lay_web/web_spikes +/datum/action/cooldown/mob_cooldown/lay_web/web_spikes name = "Spin Web Spikes" - desc = "Spin a spikes made out of web to stop intruders." + desc = "Extrude silk spikes to dissuade invaders." button_icon_state = "lay_web_spikes" cooldown_time = 40 SECONDS webbing_time = 3 SECONDS -/datum/action/cooldown/lay_web/web_spikes/obstructed_by_other_web() +/datum/action/cooldown/mob_cooldown/lay_web/web_spikes/obstructed_by_other_web() return !!(locate(/obj/structure/spider/spikes) in get_turf(owner)) -/datum/action/cooldown/lay_web/web_spikes/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) +/datum/action/cooldown/mob_cooldown/lay_web/web_spikes/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) new /obj/structure/spider/spikes(target_turf) -/datum/action/cooldown/lay_web/web_carcass - name = "leave carcass" - desc = "Shed your skin and leave a web carcass behind." +/// Makes a solid statue which you can use as cover +/datum/action/cooldown/mob_cooldown/web_effigy + name = "Web Effigy" + desc = "Shed durable webbing in the shape of your body. It is intimidating and can obstruct attackers. \ + It will decay after some time." + button_icon = 'icons/mob/actions/actions_animal.dmi' button_icon_state = "shed_web_carcass" + background_icon_state = "bg_alien" + overlay_icon_state = "bg_alien_border" cooldown_time = 60 SECONDS - webbing_time = 0 SECONDS + melee_cooldown_time = 0 + shared_cooldown = NONE + click_to_activate = FALSE -/datum/action/cooldown/lay_web/web_carcass/obstructed_by_other_web() - return !!(locate(/obj/structure/spider/carcass) in get_turf(owner)) +/datum/action/cooldown/mob_cooldown/web_effigy/IsAvailable(feedback = FALSE) + . = ..() + if(!.) + return FALSE + if(!isturf(owner.loc)) + if (feedback) + owner.balloon_alert(owner, "invalid location!") + return FALSE + return TRUE -/datum/action/cooldown/lay_web/web_carcass/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) - new /obj/structure/spider/carcass(target_turf) +/datum/action/cooldown/mob_cooldown/web_effigy/Activate() + new /obj/structure/spider/effigy(get_turf(owner)) + return ..() diff --git a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/web_sneak.dm b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/web_sneak.dm index adee0bb0ca0fb..a70a2c2c5d840 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/web_sneak.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/web_sneak.dm @@ -1,5 +1,5 @@ -/datum/action/cooldown/sneak/spider - name = "Sneak" +/datum/action/cooldown/mob_cooldown/sneak/spider + name = "Ambush Spider Sneak" desc = "Blend into the webs to stalk your prey." button_icon = 'icons/mob/actions/actions_animal.dmi' button_icon_state = "web_sneak" diff --git a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/wrap.dm b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/wrap.dm index 2c49f5747c7b7..536f09cef8d1b 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/wrap.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/wrap.dm @@ -1,4 +1,4 @@ -/datum/action/cooldown/wrap +/datum/action/cooldown/mob_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. \ @@ -11,20 +11,21 @@ check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED click_to_activate = TRUE ranged_mousepointer = 'icons/effects/mouse_pointers/wrap_target.dmi' + shared_cooldown = NONE /// The time it takes to wrap something. var/wrap_time = 5 SECONDS -/datum/action/cooldown/wrap/Grant(mob/grant_to) +/datum/action/cooldown/mob_cooldown/wrap/Grant(mob/grant_to) . = ..() if (!owner) return RegisterSignals(owner, list(COMSIG_DO_AFTER_BEGAN, COMSIG_DO_AFTER_ENDED), PROC_REF(update_status_on_signal)) -/datum/action/cooldown/wrap/Remove(mob/removed_from) +/datum/action/cooldown/mob_cooldown/wrap/Remove(mob/removed_from) . = ..() UnregisterSignal(removed_from, list(COMSIG_DO_AFTER_BEGAN, COMSIG_DO_AFTER_ENDED)) -/datum/action/cooldown/wrap/IsAvailable(feedback = FALSE) +/datum/action/cooldown/mob_cooldown/wrap/IsAvailable(feedback = FALSE) . = ..() if(!. || owner.incapacitated()) return FALSE @@ -34,7 +35,7 @@ return FALSE return TRUE -/datum/action/cooldown/wrap/set_click_ability(mob/on_who) +/datum/action/cooldown/mob_cooldown/wrap/set_click_ability(mob/on_who) . = ..() if(!.) return @@ -43,7 +44,7 @@ button_icon_state = "wrap_1" build_all_button_icons() -/datum/action/cooldown/wrap/unset_click_ability(mob/on_who, refund_cooldown = TRUE) +/datum/action/cooldown/mob_cooldown/wrap/unset_click_ability(mob/on_who, refund_cooldown = TRUE) . = ..() if(!.) return @@ -53,7 +54,7 @@ button_icon_state = "wrap_0" build_all_button_icons() -/datum/action/cooldown/wrap/Activate(atom/to_wrap) +/datum/action/cooldown/mob_cooldown/wrap/Activate(atom/to_wrap) if(!owner.Adjacent(to_wrap)) owner.balloon_alert(owner, "must be closer!") return FALSE @@ -73,7 +74,7 @@ INVOKE_ASYNC(src, PROC_REF(cocoon), to_wrap) return TRUE -/datum/action/cooldown/wrap/proc/cocoon(atom/movable/to_wrap) +/datum/action/cooldown/mob_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."), @@ -83,14 +84,14 @@ else owner.balloon_alert(owner, "interrupted!") -/datum/action/cooldown/wrap/proc/wrap_target(atom/movable/to_wrap) +/datum/action/cooldown/mob_cooldown/wrap/proc/wrap_target(atom/movable/to_wrap) var/obj/structure/spider/cocoon/casing = new(to_wrap.loc) if(isliving(to_wrap)) var/mob/living/living_wrapped = to_wrap // You get a point every time you consume a living player, even if they've been consumed before. // You only get a point for any individual corpse once, so you can't keep breaking it out and eating it again. if(ishuman(living_wrapped) && (living_wrapped.stat != DEAD || !HAS_TRAIT(living_wrapped, TRAIT_SPIDER_CONSUMED))) - var/datum/action/lay_eggs/enriched/egg_power = locate() in owner.actions + var/datum/action/cooldown/mob_cooldown/lay_eggs/enriched/egg_power = locate() in owner.actions if(egg_power) egg_power.charges++ egg_power.build_all_button_icons() diff --git a/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling.dm b/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling.dm index 4813db8848b5c..7108983c31051 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling.dm @@ -5,70 +5,40 @@ * Able to vent-crawl and eventually grow into a full fledged giant spider. * */ -/mob/living/basic/spiderling +/mob/living/basic/spider/growing/spiderling name = "spiderling" desc = "It never stays still for long." icon_state = "spiderling" icon_dead = "spiderling_dead" density = FALSE - faction = list(FACTION_SPIDER) - speed = 1 + speed = -0.75 move_resist = INFINITY // YOU CAN'T HANDLE ME LET ME BE FREE LET ME BE FREE LET ME BE FREE speak_emote = list("hisses") initial_language_holder = /datum/language_holder/spider basic_mob_flags = FLAMMABLE_MOB | DEL_ON_DEATH mob_size = MOB_SIZE_TINY - var/menu_description = "Normal spiderling." - - unique_name = TRUE - - // we have _some_ bite melee_damage_lower = 1 melee_damage_upper = 2 - - health = 5 // very low. + health = 5 maxHealth = 5 - unsuitable_cold_damage = 4 - unsuitable_heat_damage = 4 death_message = "lets out a final hiss..." - + player_speed_modifier = 0 + spider_growth_time = 40 SECONDS ai_controller = /datum/ai_controller/basic_controller/spiderling - // VERY red, to fit the eyes - lighting_cutoff_red = 22 - lighting_cutoff_green = 5 - lighting_cutoff_blue = 5 - - /// The mob we will grow into. - var/mob/living/basic/giant_spider/grow_as = null - /// The message that the mother left for our big strong selves. - var/directive = "" - /// Simple boolean that determines if we should apply the spider antag to the player if they possess this mob. TRUE by default since we're always going to evolve into a spider that will have an antagonistic role. - var/apply_spider_antag = TRUE - -/mob/living/basic/spiderling/Initialize(mapload) +/mob/living/basic/spider/growing/spiderling/Initialize(mapload) . = ..() // random placement since we're pretty small and to make the swarming component actually look like it's doing something when we have a buncha these fuckers pixel_x = rand(6,-6) pixel_y = rand(6,-6) - // the proc that handles passtable is nice but we should always be able to pass through table since we're so small so we can eschew adding that here - pass_flags |= PASSTABLE - add_traits(list(TRAIT_PASSTABLE, TRAIT_VENTCRAWLER_ALWAYS, TRAIT_WEB_SURFER), INNATE_TRAIT) + add_overlay(image(icon = src.icon, icon_state = "spiderling_click_underlay", layer = BELOW_MOB_LAYER)) + + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) AddComponent(/datum/component/swarming) AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW, volume = 0.2) // they're small but you can hear 'em - - // it's A-OKAY for grow_as to be null for the purposes of this component since we override that behavior anyhow. - AddComponent(\ - /datum/component/growth_and_differentiation,\ - growth_time = 1 MINUTES,\ - growth_path = grow_as,\ - growth_probability = 25,\ - lower_growth_value = 1,\ - upper_growth_value = 2,\ - optional_checks = CALLBACK(src, PROC_REF(ready_to_grow)),\ - optional_grow_behavior = CALLBACK(src, PROC_REF(grow_into_giant_spider))\ - ) + AddElement(/datum/element/web_walker, /datum/movespeed_modifier/spiderling_web) + AddElement(/datum/element/ai_retaliate) // keep in mind we have infinite range (the entire pipenet is our playground, it's just a matter of random choice as to where we end up) so lower and upper both have their gives and takes. // but, also remember the more time we aren't in a vent, the more susceptible we are to dying to anything and everything. @@ -76,63 +46,17 @@ ai_controller.set_blackboard_key(BB_LOWER_VENT_TIME_LIMIT, rand(9, 11) SECONDS) ai_controller.set_blackboard_key(BB_UPPER_VENT_TIME_LIMIT, rand(12, 14) SECONDS) -/mob/living/basic/spiderling/Destroy() - GLOB.spidermobs -= src - return ..() - -/mob/living/basic/spiderling/death(gibbed) +/mob/living/basic/spider/growing/spiderling/death(gibbed) if(isturf(get_turf(loc)) && (basic_mob_flags & DEL_ON_DEATH || gibbed)) var/obj/item/food/spiderling/dead_spider = new(loc) // mmm yummy dead_spider.name = name + dead_spider.icon_state = icon_dead return ..() -/mob/living/basic/spiderling/Login() // this is only really here for admins dragging and dropping players into spiderlings, player control of spiderlings is otherwise unimplemented - . = ..() - if(!. || isnull(client)) - return FALSE - basic_mob_flags &= ~DEL_ON_DEATH // we don't want to be deleted if we die while player controlled in case there's some revive schenanigans going on that can bring us back - GLOB.spidermobs[src] = TRUE - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/player_spider_modifier, multiplicative_slowdown = -2) // let's pick up the tempo, we are meant to be fast after all - if (apply_spider_antag) - var/datum/antagonist/spider/spider_antag = new(directive) - mind.add_antag_datum(spider_antag) - -/mob/living/basic/spiderling/Logout() - . = ..() - remove_movespeed_modifier(/datum/movespeed_modifier/player_spider_modifier) - -/mob/living/basic/spiderling/mob_negates_gravity() // in case our sisters want to give us a helping hand - if(locate(/obj/structure/spider/stickyweb) in loc) - return TRUE - return ..() - -/mob/living/basic/spiderling/start_pulling(atom/movable/pulled_atom, state, force = move_force, supress_message = FALSE) // we're TOO FUCKING SMALL +/mob/living/basic/spider/growing/spiderling/start_pulling(atom/movable/pulled_atom, state, force = move_force, supress_message = FALSE) // we're TOO FUCKING SMALL return -/// Checks to see if we're ready to grow, primarily if we are on solid ground and not in a vent or something. -/// The component will automagically grow us when we return TRUE and that threshold has been met. -/mob/living/basic/spiderling/proc/ready_to_grow() - if(isturf(loc)) - return TRUE - - return FALSE - -/// Actually grows the spiderling into a giant spider. We have to do a bunch of unique behavior that really can't be genericized, so we have to override the component in this manner. -/mob/living/basic/spiderling/proc/grow_into_giant_spider() - if(isnull(grow_as)) - if(prob(3)) - grow_as = pick(/mob/living/basic/giant_spider/tarantula, /mob/living/basic/giant_spider/viper, /mob/living/basic/giant_spider/midwife) - else - grow_as = pick(/mob/living/basic/giant_spider, /mob/living/basic/giant_spider/ambush, /mob/living/basic/giant_spider/hunter, /mob/living/basic/giant_spider/scout, /mob/living/basic/giant_spider/nurse, /mob/living/basic/giant_spider/tangle) - - var/mob/living/basic/giant_spider/grown = change_mob_type(grow_as, get_turf(src), initial(grow_as.name)) - ADD_TRAIT(grown, TRAIT_WAS_EVOLVED, REF(src)) - grown.faction = faction.Copy() - grown.directive = directive - - qdel(src) - /// Opportunistically hops in and out of vents, if it can find one. We aren't interested in attacking due to how weak we are, we gotta be quick and hidey. /datum/ai_controller/basic_controller/spiderling blackboard = list( diff --git a/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling_subtypes.dm b/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling_subtypes.dm index e969b8f7d2e9f..5d42ca5cb6189 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling_subtypes.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling_subtypes.dm @@ -1,96 +1,80 @@ -// This whole file is just a container for the spiderling subtypes that actually differentiate into different giant spiders. None of them are particularly special as of now. +// This whole file is just a container for the spiderling subtypes that actually differentiate into different young spiders. None of them are particularly special as of now. -/// Will differentiate into the base giant spider (known colloquially as the "guard" spider). -/mob/living/basic/spiderling/guard - grow_as = /mob/living/basic/giant_spider/guard +/// Will differentiate into the base young spider (known colloquially as the "guard" spider). +/mob/living/basic/spider/growing/spiderling/guard + grow_as = /mob/living/basic/spider/growing/young/guard name = "guard spiderling" desc = "Furry and brown, it looks defenseless. This one has sparkling red eyes." - icon_state = "guard_spiderling" - icon_dead = "guard_spiderling_dead" - menu_description = "Furry and brown, specializing in defense of the hive and other spides." - /// Will differentiate into the "ambush" giant spider. -/mob/living/basic/spiderling/ambush - grow_as = /mob/living/basic/giant_spider/ambush +/// Will differentiate into the "ambush" young spider. +/mob/living/basic/spider/growing/spiderling/ambush + grow_as = /mob/living/basic/spider/growing/young/ambush name = "ambush spiderling" desc = "Furry and white, it looks defenseless. This one has sparkling pink eyes." + icon = 'icons/mob/simple/arachnoid.dmi' icon_state = "ambush_spiderling" icon_dead = "ambush_spiderling_dead" - menu_description = "Slow spider variant specializing in stalking and ambushing prey, above avarage health and damage with a strong grip." -/// Will differentiate into the "scout" giant spider. -/mob/living/basic/spiderling/scout - grow_as = /mob/living/basic/giant_spider/scout +/// Will differentiate into the "scout" young spider. +/mob/living/basic/spider/growing/spiderling/scout + grow_as = /mob/living/basic/spider/growing/young/scout name = "scout spiderling" - desc = "Furry and black, it looks defenseless. This one has sparkling purple eyes." + desc = "Furry and black, it looks defenseless. This one has sparkling blue eyes." + icon = 'icons/mob/simple/arachnoid.dmi' icon_state = "scout_spiderling" icon_dead = "scout_spiderling_dead" - menu_description = "Fast spider variant specializing in scouting and alerting of prey ,with the ability to travel in vents." - + sight = SEE_SELF|SEE_MOBS -/// Will differentiate into the "hunter" giant spider. -/mob/living/basic/spiderling/hunter - grow_as = /mob/living/basic/giant_spider/hunter +/// Will differentiate into the "hunter" young spider. +/mob/living/basic/spider/growing/spiderling/hunter + grow_as = /mob/living/basic/spider/growing/young/hunter name = "hunter spiderling" desc = "Furry and black, it looks defenseless. This one has sparkling purple eyes." + icon = 'icons/mob/simple/arachnoid.dmi' icon_state = "hunter_spiderling" icon_dead = "hunter_spiderling_dead" - menu_description = "Fast spider variant specializing in catching running prey and toxin injection, but has less health and damage." -/// Will differentiate into the "nurse" giant spider. -/mob/living/basic/spiderling/nurse - grow_as = /mob/living/basic/giant_spider/nurse +/// Will differentiate into the "nurse" young spider. +/mob/living/basic/spider/growing/spiderling/nurse + grow_as = /mob/living/basic/spider/growing/young/nurse name = "nurse spiderling" desc = "Furry and black, it looks defenseless. This one has sparkling green eyes." + icon = 'icons/mob/simple/arachnoid.dmi' icon_state = "nurse_spiderling" icon_dead = "nurse_spiderling_dead" - 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." - /// Will differentiate into the "tangle" giant spider. -/mob/living/basic/spiderling/tangle - grow_as = /mob/living/basic/giant_spider/tangle +/// Will differentiate into the "tangle" young spider. +/mob/living/basic/spider/growing/spiderling/tangle + grow_as = /mob/living/basic/spider/growing/young/tangle name = "tangle spiderling" desc = "Furry and brown, it looks defenseless. This one has dim brown eyes." + icon = 'icons/mob/simple/arachnoid.dmi' icon_state = "tangle_spiderling" icon_dead = "tangle_spiderling_dead" - menu_description = "Support spider variant specializing in contruction to protect their brethren, but has very low amount of health and deals low damage." -/// Will differentiate into the "midwife" giant spider. -/mob/living/basic/spiderling/midwife - grow_as = /mob/living/basic/giant_spider/midwife +/// Will differentiate into the "midwife" young spider. +/mob/living/basic/spider/growing/spiderling/midwife + grow_as = /mob/living/basic/spider/growing/young/midwife name = "broodmother spiderling" desc = "Furry and black, it looks defenseless. This one has scintillating green eyes. Might also be hiding a real knife somewhere." + icon = 'icons/mob/simple/arachnoid.dmi' icon_state = "midwife_spiderling" icon_dead = "midwife_spiderling_dead" - menu_description = "Royal spider variant specializing in reproduction and leadership, but has very low amount of health and deals low damage." - gold_core_spawnable = NO_SPAWN -/// Will differentiate into the "viper" giant spider. -/mob/living/basic/spiderling/viper - grow_as = /mob/living/basic/giant_spider/viper - name = "viper_spiderling" - desc = "Furry and black, it looks defenseless. This one has sparkling purple eyes." +/// Will differentiate into the "viper" young spider. +/mob/living/basic/spider/growing/spiderling/viper + grow_as = /mob/living/basic/spider/growing/young/viper + name = "viper spiderling" + desc = "Furry and black, it looks defenseless. This one has sparkling magenta eyes." + icon = 'icons/mob/simple/arachnoid.dmi' icon_state = "viper_spiderling" icon_dead = "viper_spiderling_dead" - menu_description = "Extremly Fast spider variant specializing in catching running prey and lethal toxin injection, but has less health and damage." - gold_core_spawnable = NO_SPAWN -/// Will differentiate into the "tarantula" giant spider. -/mob/living/basic/spiderling/tarantula - grow_as = /mob/living/basic/giant_spider/tarantula - name = "tarantula_spiderling" +/// Will differentiate into the "tarantula" young spider. +/mob/living/basic/spider/growing/spiderling/tarantula + grow_as = /mob/living/basic/spider/growing/young/tarantula + name = "tarantula spiderling" desc = "Furry and black, it looks defenseless. This one has abyssal red eyes." - icon_state = "taratula_spiderling" + icon = 'icons/mob/simple/arachnoid.dmi' + icon_state = "tarantula_spiderling" icon_dead = "tarantula_spiderling_dead" - 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." - gold_core_spawnable = NO_SPAWN - -/// Will differentiate into the "hunter" giant spider. -/mob/living/basic/spiderling/hunter/flesh - grow_as = /mob/living/basic/giant_spider/hunter/flesh - name = "hunter spiderling" - desc = "Furry and black, it looks defenseless. This one has sparkling purple eyes." - icon_state = "flesh_spiderling" - icon_dead = "flesh_spiderling_dead" - menu_description = "Self-sufficient spider variant capable of healing themselves and producing webbbing fast." - gold_core_spawnable = NO_SPAWN diff --git a/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider.dm b/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider.dm new file mode 100644 index 0000000000000..50ec85e342c91 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider.dm @@ -0,0 +1,49 @@ +/** + * # Young Spider + * + * A mob which can be created by spiderlings/spider eggs. + * The basic type is the guard, which is slow but sturdy and outputs good damage. + * All spiders can produce webbing. + */ +/mob/living/basic/spider/growing/young + name = "young spider" + desc = "Furry and black, it makes you shudder to look at it. This one has deep red eyes." + icon_state = "young_guard" + icon_living = "young_guard" + icon_dead = "young_guard_dead" + butcher_results = list(/obj/item/food/meat/slab/spider = 1) + speed = 1 + maxHealth = 60 + health = 60 + obj_damage = 10 + melee_damage_lower = 8 + melee_damage_upper = 12 + ai_controller = /datum/ai_controller/basic_controller/young_spider + player_speed_modifier = -1 + +/mob/living/basic/spider/growing/young/Initialize(mapload) + . = ..() + AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/ai_flee_while_injured) + +/// Used by all young spiders if they ever appear. +/datum/ai_controller/basic_controller/young_spider + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), + BB_BASIC_MOB_FLEE_DISTANCE = 6, + ) + + ai_traits = STOP_MOVING_WHEN_PULLED + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + + planning_subtrees = list( + /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee, + /datum/ai_planning_subtree/flee_target, + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/random_speech/insect, + /datum/ai_planning_subtree/find_unwebbed_turf, + /datum/ai_planning_subtree/spin_web, + ) diff --git a/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider_subtypes.dm b/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider_subtypes.dm new file mode 100644 index 0000000000000..f5d128e41b709 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider_subtypes.dm @@ -0,0 +1,185 @@ +// This whole file is just a container for the young spider subtypes that actually differentiate into different giant spiders. None of them are particularly special as of now. + +/// Will differentiate into the base giant spider (known colloquially as the "guard" spider). +/mob/living/basic/spider/growing/young/guard + grow_as = /mob/living/basic/spider/giant/guard + name = "young guard spider" + desc = "Furry and brown, it looks defenseless. This one has sparkling red eyes." + maxHealth = 70 + health = 70 + melee_damage_lower = 10 + melee_damage_upper = 15 + speed = 0.7 + +/// Will differentiate into the "ambush" giant spider. +/mob/living/basic/spider/growing/young/ambush + grow_as = /mob/living/basic/spider/giant/ambush + name = "young ambush spider" + desc = "Furry and white, it looks defenseless. This one has sparkling pink eyes." + icon = 'icons/mob/simple/arachnoid.dmi' + icon_state = "young_ambush" + icon_dead = "young_ambush_dead" + maxHealth = 55 + health = 55 + melee_damage_lower = 12 + melee_damage_upper = 18 + speed = 1 + +/mob/living/basic/spider/growing/young/ambush/Initialize(mapload) + . = ..() + var/datum/action/cooldown/mob_cooldown/sneak/spider/sneak_web = new(src) + sneak_web.Grant(src) + +/// Will differentiate into the "scout" giant spider. +/mob/living/basic/spider/growing/young/scout + grow_as = /mob/living/basic/spider/giant/scout + name = "young scout spider" + desc = "Furry and black, it looks defenseless. This one has sparkling blue eyes." + icon = 'icons/mob/simple/arachnoid.dmi' + icon_state = "young_scout" + icon_dead = "young_scout_dead" + maxHealth = 35 + health = 35 + melee_damage_lower = 2 + melee_damage_upper = 4 + speed = 0.5 + poison_per_bite = 4 + poison_type = /datum/reagent/peaceborg/confuse + sight = SEE_SELF|SEE_MOBS + +/mob/living/basic/spider/growing/young/scout/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + +/// Will differentiate into the "hunter" giant spider. +/mob/living/basic/spider/growing/young/hunter + grow_as = /mob/living/basic/spider/giant/hunter + name = "young hunter spider" + desc = "Furry and black, it looks defenseless. This one has sparkling purple eyes." + icon = 'icons/mob/simple/arachnoid.dmi' + icon_state = "young_hunter" + icon_dead = "young_hunter_dead" + maxHealth = 45 + health = 45 + melee_damage_lower = 8 + melee_damage_upper = 12 + speed = 0.5 + poison_per_bite = 2 + +/// Will differentiate into the "nurse" giant spider. +/mob/living/basic/spider/growing/young/nurse + grow_as = /mob/living/basic/spider/giant/nurse + name = "young nurse spider" + desc = "Furry and black, it looks defenseless. This one has sparkling green eyes." + icon = 'icons/mob/simple/arachnoid.dmi' + icon_state = "young_nurse" + icon_dead = "young_nurse_dead" + maxHealth = 25 + health = 25 + melee_damage_lower = 2 + melee_damage_upper = 4 + speed = 0.7 + web_speed = 0.5 + web_type = /datum/action/cooldown/mob_cooldown/lay_web/sealer + ///The health HUD applied to the mob. + var/health_hud = DATA_HUD_MEDICAL_ADVANCED + +/mob/living/basic/spider/growing/young/nurse/Initialize(mapload) + . = ..() + var/datum/atom_hud/datahud = GLOB.huds[health_hud] + datahud.show_to(src) + + AddComponent(/datum/component/healing_touch,\ + heal_brute = 15,\ + heal_burn = 15,\ + interaction_key = DOAFTER_SOURCE_SPIDER,\ + valid_targets_typecache = typecacheof(list(/mob/living/basic/spider/giant)),\ + action_text = "%SOURCE% begins wrapping the wounds of %TARGET%.",\ + complete_text = "%SOURCE% wraps the wounds of %TARGET%.",\ + ) + +/// Will differentiate into the "tangle" giant spider. +/mob/living/basic/spider/growing/young/tangle + grow_as = /mob/living/basic/spider/giant/tangle + name = "young tangle spider" + desc = "Furry and brown, it looks defenseless. This one has dim brown eyes." + icon = 'icons/mob/simple/arachnoid.dmi' + icon_state = "young_tangle" + icon_dead = "young_tangle_dead" + maxHealth = 30 + health = 30 + melee_damage_lower = 1 + melee_damage_upper = 1 + speed = 0.7 + web_speed = 0.25 + web_type = /datum/action/cooldown/mob_cooldown/lay_web/sealer + poison_per_bite = 2 + poison_type = /datum/reagent/toxin/acid + +/mob/living/basic/spider/growing/young/tangle/Initialize(mapload) + . = ..() + AddComponent(/datum/component/healing_touch,\ + heal_brute = 10,\ + heal_burn = 10,\ + heal_time = 3 SECONDS,\ + self_targetting = HEALING_TOUCH_SELF_ONLY,\ + interaction_key = DOAFTER_SOURCE_SPIDER,\ + valid_targets_typecache = typecacheof(list(/mob/living/basic/spider/growing/young/tangle, /mob/living/basic/spider/giant/tangle)),\ + extra_checks = CALLBACK(src, PROC_REF(can_mend)),\ + action_text = "%SOURCE% begins mending themselves...",\ + complete_text = "%SOURCE%'s wounds mend together.",\ + ) + +/// Prevent you from healing other tangle spiders, or healing when on fire +/mob/living/basic/spider/growing/young/tangle/proc/can_mend(mob/living/source, mob/living/target) + if (on_fire) + balloon_alert(src, "on fire!") + return FALSE + return TRUE + +/// Will differentiate into the "midwife" giant spider. +/mob/living/basic/spider/growing/young/midwife + grow_as = /mob/living/basic/spider/giant/midwife + name = "young broodmother spider" + desc = "Furry and black, it looks defenseless. This one has scintillating green eyes. Might also be hiding a real knife somewhere." + icon = 'icons/mob/simple/arachnoid.dmi' + icon_state = "young_midwife" + icon_dead = "young_midwife_dead" + maxHealth = 100 + health = 100 + melee_damage_lower = 5 + melee_damage_upper = 10 + speed = 0.7 + web_speed = 0.5 + web_type = /datum/action/cooldown/mob_cooldown/lay_web/sealer + +/// Will differentiate into the "viper" giant spider. +/mob/living/basic/spider/growing/young/viper + grow_as = /mob/living/basic/spider/giant/viper + name = "young viper spider" + desc = "Furry and black, it looks defenseless. This one has sparkling magenta eyes." + icon = 'icons/mob/simple/arachnoid.dmi' + icon_state = "young_viper" + icon_dead = "young_viper_dead" + maxHealth = 30 + health = 30 + melee_damage_lower = 5 + melee_damage_upper = 5 + speed = 0.2 + poison_type = /datum/reagent/toxin/viperspider + poison_per_bite = 2 + +/// Will differentiate into the "tarantula" giant spider. +/mob/living/basic/spider/growing/young/tarantula + grow_as = /mob/living/basic/spider/giant/tarantula + name = "young tarantula spider" + desc = "Furry and black, it looks defenseless. This one has abyssal red eyes." + icon = 'icons/mob/simple/arachnoid.dmi' + icon_state = "young_tarantula" + icon_dead = "young_tarantula_dead" + maxHealth = 150 + health = 150 + melee_damage_lower = 20 + melee_damage_upper = 25 + speed = 1 + obj_damage = 40 diff --git a/code/modules/mob/living/basic/space_fauna/statue/statue.dm b/code/modules/mob/living/basic/space_fauna/statue/statue.dm index 3fcf215b6d478..d2ea5e8a831d0 100644 --- a/code/modules/mob/living/basic/space_fauna/statue/statue.dm +++ b/code/modules/mob/living/basic/space_fauna/statue/statue.dm @@ -27,6 +27,7 @@ attack_verb_simple = "claw" attack_sound = 'sound/hallucinations/growl1.ogg' attack_vis_effect = ATTACK_EFFECT_CLAW + melee_attack_cooldown = 1 SECONDS faction = list(FACTION_STATUE) speak_emote = list("screams") @@ -50,15 +51,11 @@ pull_force = MOVE_FORCE_EXTREMELY_STRONG ai_controller = /datum/ai_controller/basic_controller/statue - /// Loot this mob drops on death. - var/loot /// Stores the creator in here if it has one. var/mob/living/creator = null /mob/living/basic/statue/Initialize(mapload, mob/living/creator) . = ..() - if(LAZYLEN(loot)) - AddElement(/datum/element/death_drops, loot) AddComponent(/datum/component/unobserved_actor, unobserved_flags = NO_OBSERVED_MOVEMENT | NO_OBSERVED_ATTACKS) ADD_TRAIT(src, TRAIT_UNOBSERVANT, INNATE_TRAIT) @@ -151,12 +148,23 @@ ai_movement = /datum/ai_movement/basic_avoidance planning_subtrees = list( /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/basic_melee_attack_subtree/statue, + /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/find_and_hunt_target/look_for_light_fixtures, ) -/datum/ai_planning_subtree/basic_melee_attack_subtree/statue - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/statue - -/datum/ai_behavior/basic_melee_attack/statue - action_cooldown = 1 SECONDS +/mob/living/basic/statue/frosty + name = "Frosty" + desc = "Just a snowman. Just a snowman. Oh god, it's just a snowman." + icon_dead = "snowman" + icon_living = "snowman" + icon_state = "snowman" + health = 5000 + maxHealth = 5000 + melee_damage_lower = 65 + melee_damage_upper = 65 + faction = list(FACTION_STATUE,FACTION_MINING) + +/mob/living/basic/statue/frosty/Initialize(mapload) + . = ..() + var/static/list/death_loot = list(/obj/item/dnainjector/geladikinesis) + AddElement(/datum/element/death_drops, death_loot) diff --git a/code/modules/mob/living/basic/space_fauna/supermatter_spider.dm b/code/modules/mob/living/basic/space_fauna/supermatter_spider.dm new file mode 100644 index 0000000000000..2a3ba326eaca9 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/supermatter_spider.dm @@ -0,0 +1,102 @@ +/// A nasty little robotic bug that dusts people on attack. Jeepers. This should be a very, very, very rare spawn. +/mob/living/basic/supermatter_spider + name = "supermatter spider" + desc= "A sliver of supermatter placed upon a robotically enhanced pedestal." + + icon = 'icons/mob/simple/smspider.dmi' + icon_state = "smspider" + icon_living = "smspider" + icon_dead = "smspider_dead" + + gender = NEUTER + mob_biotypes = MOB_BUG|MOB_ROBOTIC + speak_emote = list("vibrates") + + + attack_verb_continuous = "slices" + attack_verb_simple = "slice" + attack_sound = 'sound/effects/supermatter.ogg' + attack_vis_effect = ATTACK_EFFECT_CLAW + + maxHealth = 10 + health = 10 + minimum_survivable_temperature = TCMB + maximum_survivable_temperature = T0C + 1250 + habitable_atmos = 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) + death_message = "falls to the ground, its shard dulling to a miserable grey!" + + faction = list(FACTION_HOSTILE) + + // Gold, supermatter tinted + lighting_cutoff_red = 30 + lighting_cutoff_green = 30 + lighting_cutoff_blue = 10 + + ai_controller = /datum/ai_controller/basic_controller/supermatter_spider + + /// If we successfully dust something, should we die? + var/single_use = TRUE + +/mob/living/basic/supermatter_spider/Initialize(mapload) + . = ..() + AddComponent(/datum/component/swarming) + + AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW) + + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(on_attack)) + +/// Proc that we call on attacking something to dust 'em. +/mob/living/basic/supermatter_spider/proc/on_attack(mob/living/basic/source, atom/target) + SIGNAL_HANDLER + + if(isliving(target)) + var/mob/living/victim = target + victim.investigate_log("has been dusted by [src].", INVESTIGATE_DEATHS) + dust_feedback(target) + victim.dust() + if(single_use) + death() + return COMPONENT_HOSTILE_NO_ATTACK + + if(!isturf(target)) + dust_feedback(target) + qdel(target) + if(single_use) + death() + return COMPONENT_HOSTILE_NO_ATTACK + +/// Simple proc that plays the supermatter dusting sound and sends a visible message. +/mob/living/basic/supermatter_spider/proc/dust_feedback(atom/target) + playsound(get_turf(src), 'sound/effects/supermatter.ogg', 10, TRUE) + visible_message(span_danger("[src] knocks into [target], turning [target.p_them()] to dust in a brilliant flash of light!")) + +/mob/living/basic/supermatter_spider/overcharged + name = "overcharged supermatter spider" + desc = "A sliver of overcharged supermatter placed upon a robotically enhanced pedestal. This one seems especially dangerous." + icon_state = "smspideroc" + icon_living = "smspideroc" + maxHealth = 25 + health = 25 + single_use = FALSE + +/datum/ai_controller/basic_controller/supermatter_spider + 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/target_retaliate, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/random_speech/supermatter_spider, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/datum/ai_planning_subtree/random_speech/supermatter_spider + speech_chance = 7 + emote_hear = list("clinks", "clanks") + emote_see = list("vibrates") diff --git a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/fugu_gland.dm b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/fugu_gland.dm index 485343c0a496c..63eb39c74e6fd 100644 --- a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/fugu_gland.dm +++ b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/fugu_gland.dm @@ -32,6 +32,7 @@ return 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/basic/space_fauna/wumborian_fugu/wumborian_ai.dm b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/wumborian_ai.dm index f632a38dc1b20..9d3a09c5348f2 100644 --- a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/wumborian_ai.dm +++ b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/wumborian_ai.dm @@ -1,5 +1,3 @@ -#define WUMBO_ATTACK_COOLDOWN 2.5 SECONDS - /// Cowardly when small, aggressive when big. Tries to transform whenever possible. /datum/ai_controller/basic_controller/wumborian_fugu blackboard = list( @@ -15,23 +13,15 @@ /datum/ai_planning_subtree/targeted_mob_ability/inflate, /datum/ai_planning_subtree/flee_target, /datum/ai_planning_subtree/attack_obstacle_in_path/wumborian_fugu, - /datum/ai_planning_subtree/basic_melee_attack_subtree/wumborian_fugu, + /datum/ai_planning_subtree/basic_melee_attack_subtree, ) -/datum/ai_planning_subtree/basic_melee_attack_subtree/wumborian_fugu - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/wumborian_fugu - -/datum/ai_behavior/basic_melee_attack/wumborian_fugu - action_cooldown = WUMBO_ATTACK_COOLDOWN - /datum/ai_planning_subtree/attack_obstacle_in_path/wumborian_fugu attack_behaviour = /datum/ai_behavior/attack_obstructions/wumborian_fugu /datum/ai_behavior/attack_obstructions/wumborian_fugu can_attack_turfs = TRUE - action_cooldown = WUMBO_ATTACK_COOLDOWN + action_cooldown = 2.5 SECONDS /datum/ai_planning_subtree/targeted_mob_ability/inflate ability_key = BB_FUGU_INFLATE - -#undef WUMBO_ATTACK_COOLDOWN diff --git a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/wumborian_fugu.dm b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/wumborian_fugu.dm index b36a0916a7555..bf8be2051d8c1 100644 --- a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/wumborian_fugu.dm +++ b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/wumborian_fugu.dm @@ -29,6 +29,7 @@ melee_damage_upper = 0 attack_sound = 'sound/weapons/punch1.ogg' attack_vis_effect = ATTACK_EFFECT_BITE + melee_attack_cooldown = 2.5 SECONDS attack_verb_continuous = "chomps" attack_verb_simple = "chomp" friendly_verb_continuous = "floats near" @@ -49,7 +50,9 @@ /mob/living/basic/wumborian_fugu/Initialize(mapload) . = ..() - AddElement(/datum/element/death_drops, loot = list(/obj/item/fugu_gland)) + AddComponent(/datum/component/seethrough_mob) + var/static/list/death_loot = list(/obj/item/fugu_gland) + AddElement(/datum/element/death_drops, death_loot) add_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_ASHSTORM_IMMUNE), ROUNDSTART_TRAIT) expand = new(src) expand.Grant(src) diff --git a/code/modules/mob/living/basic/syndicate/russian.dm b/code/modules/mob/living/basic/syndicate/russian.dm index de6c91a4dae50..2de74b9b4d58a 100644 --- a/code/modules/mob/living/basic/syndicate/russian.dm +++ b/code/modules/mob/living/basic/syndicate/russian.dm @@ -32,7 +32,7 @@ /mob/living/basic/syndicate/russian/ranged/Initialize(mapload) . = ..() - AddElement(/datum/element/ranged_attacks, casingtype, projectilesound) + AddComponent(/datum/component/ranged_attacks, casing_type = casingtype, projectile_sound = projectilesound, cooldown_time = 1 SECONDS) /mob/living/basic/syndicate/russian/ranged/lootless loot = list() diff --git a/code/modules/mob/living/basic/syndicate/syndicate.dm b/code/modules/mob/living/basic/syndicate/syndicate.dm index 76b3d5374c2ff..a4fd0981198de 100644 --- a/code/modules/mob/living/basic/syndicate/syndicate.dm +++ b/code/modules/mob/living/basic/syndicate/syndicate.dm @@ -15,6 +15,7 @@ attack_verb_continuous = "punches" attack_verb_simple = "punch" attack_sound = 'sound/weapons/punch1.ogg' + melee_attack_cooldown = 1.2 SECONDS combat_mode = TRUE unsuitable_atmos_damage = 7.5 unsuitable_cold_damage = 7.5 @@ -34,6 +35,7 @@ . = ..() apply_dynamic_human_appearance(src, mob_spawn_path = mob_spawner, r_hand = r_hand, l_hand = l_hand) if(LAZYLEN(loot)) + loot = string_list(loot) AddElement(/datum/element/death_drops, loot) AddElement(/datum/element/footstep, footstep_type = FOOTSTEP_MOB_SHOE) @@ -133,12 +135,24 @@ loot = list(/obj/effect/gibspawner/human) ai_controller = /datum/ai_controller/basic_controller/syndicate/ranged r_hand = /obj/item/gun/ballistic/automatic/pistol + /// Type of bullet we use var/casingtype = /obj/item/ammo_casing/c9mm + /// Sound to play when firing weapon var/projectilesound = 'sound/weapons/gun/pistol/shot.ogg' + /// number of burst shots + var/burst_shots + /// Time between taking shots + var/ranged_cooldown = 1 SECONDS /mob/living/basic/syndicate/ranged/Initialize(mapload) . = ..() - AddElement(/datum/element/ranged_attacks, casingtype, projectilesound) + AddComponent(\ + /datum/component/ranged_attacks,\ + casing_type = casingtype,\ + projectile_sound = projectilesound,\ + cooldown_time = ranged_cooldown,\ + burst_shots = burst_shots,\ + ) /mob/living/basic/syndicate/ranged/infiltrator //shuttle loan event projectilesound = 'sound/weapons/gun/smg/shot_suppressed.ogg' @@ -167,6 +181,8 @@ casingtype = /obj/item/ammo_casing/c45 projectilesound = 'sound/weapons/gun/smg/shot.ogg' ai_controller = /datum/ai_controller/basic_controller/syndicate/ranged/burst + burst_shots = 3 + ranged_cooldown = 3 SECONDS r_hand = /obj/item/gun/ballistic/automatic/c20r /mob/living/basic/syndicate/ranged/smg/pilot //caravan ambush ruin @@ -196,6 +212,8 @@ /mob/living/basic/syndicate/ranged/shotgun casingtype = /obj/item/ammo_casing/shotgun/buckshot //buckshot (up to 72.5 brute) fired in a two-round burst ai_controller = /datum/ai_controller/basic_controller/syndicate/ranged/shotgunner + ranged_cooldown = 3 SECONDS + burst_shots = 2 r_hand = /obj/item/gun/ballistic/shotgun/bulldog /mob/living/basic/syndicate/ranged/shotgun/space diff --git a/code/modules/mob/living/basic/syndicate/syndicate_ai.dm b/code/modules/mob/living/basic/syndicate/syndicate_ai.dm index 385e8448346da..be84c1a568505 100644 --- a/code/modules/mob/living/basic/syndicate/syndicate_ai.dm +++ b/code/modules/mob/living/basic/syndicate/syndicate_ai.dm @@ -1,6 +1,6 @@ /datum/ai_controller/basic_controller/syndicate blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/syndicate() + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/attack_until_dead ) ai_movement = /datum/ai_movement/basic_avoidance @@ -8,12 +8,9 @@ planning_subtrees = list( /datum/ai_planning_subtree/simple_find_target, /datum/ai_planning_subtree/attack_obstacle_in_path/syndicate, - /datum/ai_planning_subtree/basic_melee_attack_subtree/syndicate + /datum/ai_planning_subtree/basic_melee_attack_subtree, ) -/datum/targetting_datum/basic/syndicate - stat_attack = HARD_CRIT - /datum/ai_planning_subtree/basic_melee_attack_subtree/syndicate melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/syndicate @@ -36,7 +33,7 @@ ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/syndicate /datum/ai_behavior/basic_ranged_attack/syndicate - action_cooldown = 2.5 SECONDS + action_cooldown = 1 SECONDS required_distance = 5 /datum/ai_controller/basic_controller/syndicate/ranged/burst @@ -49,7 +46,6 @@ ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/syndicate_burst /datum/ai_behavior/basic_ranged_attack/syndicate_burst - shots = 3 action_cooldown = 3 SECONDS /datum/ai_controller/basic_controller/syndicate/ranged/shotgunner @@ -62,8 +58,6 @@ ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/syndicate_shotgun /datum/ai_behavior/basic_ranged_attack/syndicate_shotgun - shots = 2 - burst_interval = 0.6 SECONDS action_cooldown = 3 SECONDS required_distance = 1 diff --git a/code/modules/mob/living/basic/tree.dm b/code/modules/mob/living/basic/tree.dm index 3bde822af2e5a..2a0806b105c98 100644 --- a/code/modules/mob/living/basic/tree.dm +++ b/code/modules/mob/living/basic/tree.dm @@ -1,7 +1,7 @@ /mob/living/basic/tree name = "pine tree" desc = "A pissed off tree-like alien. It seems annoyed with the festivities..." - icon = 'icons/obj/flora/pinetrees.dmi' + icon = 'icons/obj/fluff/flora/pinetrees.dmi' icon_state = "pine_1" icon_living = "pine_1" icon_dead = "pine_1" @@ -54,8 +54,11 @@ /mob/living/basic/tree/Initialize(mapload) . = ..() + AddComponent(/datum/component/seethrough_mob) AddElement(/datum/element/swabable, CELL_LINE_TABLE_PINE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - AddElement(/datum/element/death_drops, list(/obj/item/stack/sheet/mineral/wood)) + var/static/list/death_loot = list(/obj/item/stack/sheet/mineral/wood) + AddElement(/datum/element/death_drops, death_loot) + AddComponent(/datum/component/aggro_emote, emote_list = string_list(list("growls")), emote_chance = 20) /mob/living/basic/tree/Life(seconds_per_tick = SSMOBS_DT, times_fired) ..() @@ -71,7 +74,7 @@ our_turf.air.gases[/datum/gas/carbon_dioxide][MOLES] -= amt our_turf.atmos_spawn_air("[GAS_O2]=[amt]") -/mob/living/basic/tree/melee_attack(atom/target, list/modifiers) +/mob/living/basic/tree/melee_attack(atom/target, list/modifiers, ignore_cooldown = FALSE) . = ..() if(!.) @@ -104,12 +107,6 @@ idle_behavior = /datum/idle_behavior/idle_random_walk/less_walking planning_subtrees = list( /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/basic_melee_attack_subtree/tree, + /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/random_speech/tree, ) - -/datum/ai_planning_subtree/basic_melee_attack_subtree/tree - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/tree - -/datum/ai_behavior/basic_melee_attack/tree - action_cooldown = 2 SECONDS diff --git a/code/modules/mob/living/basic/vermin/butterfly.dm b/code/modules/mob/living/basic/vermin/butterfly.dm index 77f89d4d4d1d8..cbc847aa9e899 100644 --- a/code/modules/mob/living/basic/vermin/butterfly.dm +++ b/code/modules/mob/living/basic/vermin/butterfly.dm @@ -80,6 +80,8 @@ /// Checks whether the butterfly should be despawned after the next check, based on distance from source /mob/living/basic/butterfly/lavaland/temporary/proc/should_despawn() + if(QDELETED(source)) + return TRUE if(get_dist(source, src) > max_distance) return TRUE return FALSE diff --git a/code/modules/mob/living/basic/vermin/cockroach.dm b/code/modules/mob/living/basic/vermin/cockroach.dm index 32df5e915ec6c..5c69ad904474f 100644 --- a/code/modules/mob/living/basic/vermin/cockroach.dm +++ b/code/modules/mob/living/basic/vermin/cockroach.dm @@ -2,13 +2,15 @@ name = "cockroach" desc = "This station is just crawling with bugs." icon_state = "cockroach" - icon_dead = "cockroach" //Make this work + icon_dead = "cockroach_no_animation" density = FALSE mob_biotypes = MOB_ORGANIC|MOB_BUG mob_size = MOB_SIZE_TINY + held_w_class = WEIGHT_CLASS_TINY health = 1 maxHealth = 1 speed = 1.25 + can_be_held = TRUE gold_core_spawnable = FRIENDLY_SPAWN pass_flags = PASSTABLE | PASSGRILLE | PASSMOB @@ -38,17 +40,23 @@ var/static/list/roach_drops = list(/obj/effect/decal/cleanable/insectguts) AddElement(/datum/element/death_drops, roach_drops) AddElement(/datum/element/swabable, cockroach_cell_line, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 7) - AddComponent(/datum/component/squashable, squash_chance = 50, squash_damage = 1) + AddElement(/datum/element/basic_body_temp_sensitive, 270, INFINITY) + AddComponent( \ + /datum/component/squashable, \ + squash_chance = 50, \ + squash_damage = 1, \ + squash_flags = SQUASHED_SHOULD_BE_GIBBED|SQUASHED_ALWAYS_IF_DEAD|SQUASHED_DONT_SQUASH_IN_CONTENTS, \ + ) ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - -/mob/living/basic/cockroach/death(gibbed) - if(GLOB.station_was_nuked) //If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes. - return - return ..() + ADD_TRAIT(src, TRAIT_NUKEIMMUNE, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_RADIMMUNE, INNATE_TRAIT) /mob/living/basic/cockroach/ex_act() //Explosions are a terrible way to handle a cockroach. return FALSE +// Roach goop is the gibs to drop +/mob/living/basic/cockroach/spawn_gibs() + return /datum/ai_controller/basic_controller/cockroach blackboard = list( @@ -85,10 +93,19 @@ faction = list(FACTION_HOSTILE, FACTION_MAINT_CREATURES) ai_controller = /datum/ai_controller/basic_controller/cockroach/glockroach cockroach_cell_line = CELL_LINE_TABLE_GLOCKROACH + ///number of burst shots + var/burst_shots + ///cooldown between attacks + var/ranged_cooldown = 1 SECONDS /mob/living/basic/cockroach/glockroach/Initialize(mapload) . = ..() - AddElement(/datum/element/ranged_attacks, /obj/item/ammo_casing/glockroach) + AddComponent(\ + /datum/component/ranged_attacks,\ + casing_type = /obj/item/ammo_casing/glockroach,\ + burst_shots = burst_shots,\ + cooldown_time = ranged_cooldown,\ + ) /datum/ai_controller/basic_controller/cockroach/glockroach planning_subtrees = list( @@ -114,6 +131,7 @@ melee_damage_lower = 2.5 melee_damage_upper = 10 obj_damage = 10 + melee_attack_cooldown = 1 SECONDS gold_core_spawnable = HOSTILE_SPAWN attack_sound = 'sound/weapons/bladeslice.ogg' attack_vis_effect = ATTACK_EFFECT_SLASH @@ -125,7 +143,13 @@ /mob/living/basic/cockroach/hauberoach/Initialize(mapload) . = ..() AddComponent(/datum/component/caltrop, min_damage = 10, max_damage = 15, flags = (CALTROP_BYPASS_SHOES | CALTROP_SILENT)) - AddComponent(/datum/component/squashable, squash_chance = 100, squash_damage = 1, squash_callback = TYPE_PROC_REF(/mob/living/basic/cockroach/hauberoach, on_squish)) + AddComponent( \ + /datum/component/squashable, \ + squash_chance = 100, \ + squash_damage = 1, \ + squash_flags = SQUASHED_SHOULD_BE_GIBBED|SQUASHED_ALWAYS_IF_DEAD|SQUASHED_DONT_SQUASH_IN_CONTENTS, \ + squash_callback = TYPE_PROC_REF(/mob/living/basic/cockroach/hauberoach, on_squish), \ + ) ///Proc used to override the squashing behavior of the normal cockroach. /mob/living/basic/cockroach/hauberoach/proc/on_squish(mob/living/cockroach, mob/living/living_target) @@ -136,41 +160,32 @@ return TRUE living_target.visible_message(span_notice("[living_target] squashes [cockroach], not even noticing its spike."), span_notice("You squashed [cockroach], not even noticing its spike.")) return FALSE + /datum/ai_controller/basic_controller/cockroach/hauberoach planning_subtrees = list( /datum/ai_planning_subtree/pet_planning, /datum/ai_planning_subtree/random_speech/insect, /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/basic_melee_attack_subtree/hauberoach, //If we are attacking someone, this will prevent us from hunting + /datum/ai_planning_subtree/basic_melee_attack_subtree, //If we are attacking someone, this will prevent us from hunting /datum/ai_planning_subtree/find_and_hunt_target/roach, ) -/datum/ai_planning_subtree/basic_melee_attack_subtree/hauberoach - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/hauberoach - -/datum/ai_behavior/basic_melee_attack/hauberoach //Slightly slower, as this is being made in feature freeze ;) - action_cooldown = 1 SECONDS - /datum/ai_controller/basic_controller/cockroach/sewer planning_subtrees = list( /datum/ai_planning_subtree/pet_planning, /datum/ai_planning_subtree/random_speech/insect, /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/basic_melee_attack_subtree/sewer, + /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/find_and_hunt_target/roach, ) -/datum/ai_planning_subtree/basic_melee_attack_subtree/sewer - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/sewer - -/datum/ai_behavior/basic_melee_attack/sewer - action_cooldown = 0.8 SECONDS - /mob/living/basic/cockroach/glockroach/mobroach name = "mobroach" desc = "WE'RE FUCKED, THAT GLOCKROACH HAS A TOMMYGUN!" icon_state = "mobroach" ai_controller = /datum/ai_controller/basic_controller/cockroach/mobroach + burst_shots = 4 + ranged_cooldown = 2 SECONDS /datum/ai_controller/basic_controller/cockroach/mobroach planning_subtrees = list( @@ -185,5 +200,4 @@ ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/mobroach /datum/ai_behavior/basic_ranged_attack/mobroach - shots = 4 action_cooldown = 2 SECONDS diff --git a/code/modules/mob/living/basic/vermin/crab.dm b/code/modules/mob/living/basic/vermin/crab.dm new file mode 100644 index 0000000000000..abe5c25117b6d --- /dev/null +++ b/code/modules/mob/living/basic/vermin/crab.dm @@ -0,0 +1,95 @@ +//Look Sir, free crabs! +/mob/living/basic/crab + name = "crab" + desc = "Free crabs!" + icon_state = "crab" + icon_living = "crab" + icon_dead = "crab_dead" + + speak_emote = list("clicks") + melee_damage_lower = 2 + melee_damage_upper = 2 + butcher_results = list(/obj/item/food/meat/slab/rawcrab = 2) + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "stomps" + response_harm_simple = "stomp" + friendly_verb_continuous = "pinches" + friendly_verb_simple = "pinch" + gold_core_spawnable = FRIENDLY_SPAWN + mob_size = MOB_SIZE_SMALL + ///In the case 'melee_damage_upper' is somehow raised above 0 + attack_verb_continuous = "snips" + attack_verb_simple = "snip" + attack_sound = 'sound/weapons/bite.ogg' + attack_vis_effect = ATTACK_EFFECT_BITE + ai_controller = /datum/ai_controller/basic_controller/crab + +/mob/living/basic/crab/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + AddElement(/datum/element/sideway_movement) + AddElement(/datum/element/tiny_mob_hunter, MOB_SIZE_TINY) + AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/ai_flee_while_injured) + +//COFFEE! SQUEEEEEEEEE! +/mob/living/basic/crab/coffee + name = "Coffee" + real_name = "Coffee" + desc = "It's Coffee, the other pet!" + gender = FEMALE + gold_core_spawnable = NO_SPAWN + +/mob/living/basic/crab/jon //holodeck crab + name = "Jon" + real_name = "Jon" + gold_core_spawnable = NO_SPAWN + +/mob/living/basic/crab/evil + name = "Evil Crab" + real_name = "Evil Crab" + desc = "Unnerving, isn't it? It has to be planning something nefarious..." + icon_state = "evilcrab" + icon_living = "evilcrab" + icon_dead = "evilcrab_dead" + gold_core_spawnable = FRIENDLY_SPAWN + +/mob/living/basic/crab/kreb + name = "Kreb" + desc = "This is a real crab. The other crabs are simply gubbucks in disguise!" + real_name = "Kreb" + icon_state = "kreb" + icon_living = "kreb" + icon_dead = "kreb_dead" + gold_core_spawnable = NO_SPAWN + +/mob/living/basic/crab/evil/kreb + name = "Evil Kreb" + real_name = "Evil Kreb" + icon_state = "evilkreb" + icon_living = "evilkreb" + icon_dead = "evilkreb_dead" + gold_core_spawnable = NO_SPAWN + +///The basic ai controller for crabs +/datum/ai_controller/basic_controller/crab + blackboard = list( + BB_BASIC_MOB_FLEEING = FALSE, + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/of_size/ours_or_smaller, + BB_FLEE_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction, + ) + + ai_traits = STOP_MOVING_WHEN_PULLED + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee/from_flee_key, + /datum/ai_planning_subtree/flee_target/from_flee_key, + /datum/ai_planning_subtree/target_retaliate/to_flee, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/random_speech/crab, + ) diff --git a/code/modules/mob/living/basic/vermin/frog.dm b/code/modules/mob/living/basic/vermin/frog.dm index 282ed17b00c26..191ea12b4df33 100644 --- a/code/modules/mob/living/basic/vermin/frog.dm +++ b/code/modules/mob/living/basic/vermin/frog.dm @@ -17,6 +17,7 @@ obj_damage = 10 attack_verb_continuous = "bites" attack_verb_simple = "bite" + melee_attack_cooldown = 2.5 SECONDS response_help_continuous = "pets" response_help_simple = "pet" response_disarm_continuous = "pokes" @@ -85,19 +86,13 @@ planning_subtrees = list( /datum/ai_planning_subtree/target_retaliate, /datum/ai_planning_subtree/random_speech/frog, - /datum/ai_planning_subtree/basic_melee_attack_subtree/frog, + /datum/ai_planning_subtree/basic_melee_attack_subtree, ) -/datum/ai_planning_subtree/basic_melee_attack_subtree/frog - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/frog - -/datum/ai_behavior/basic_melee_attack/frog - action_cooldown = 2.5 SECONDS - /datum/ai_controller/basic_controller/frog/trash planning_subtrees = list( /datum/ai_planning_subtree/pet_planning, /datum/ai_planning_subtree/random_speech/frog, /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/basic_melee_attack_subtree/frog, + /datum/ai_planning_subtree/basic_melee_attack_subtree, ) diff --git a/code/modules/mob/living/basic/vermin/lizard.dm b/code/modules/mob/living/basic/vermin/lizard.dm index 4038e84869211..ab73224c6aca3 100644 --- a/code/modules/mob/living/basic/vermin/lizard.dm +++ b/code/modules/mob/living/basic/vermin/lizard.dm @@ -33,6 +33,11 @@ obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE can_be_held = TRUE + held_w_class = WEIGHT_CLASS_TINY + held_lh = 'icons/mob/inhands/animal_item_lefthand.dmi' + held_rh = 'icons/mob/inhands/animal_item_righthand.dmi' + worn_slot_flags = ITEM_SLOT_HEAD + head_icon = 'icons/mob/clothing/head/pets_head.dmi' ai_controller = /datum/ai_controller/basic_controller/lizard /// Typecache of things that we seek out to eat. Yummy. diff --git a/code/modules/mob/living/basic/vermin/mouse.dm b/code/modules/mob/living/basic/vermin/mouse.dm index 60d09daf2f8d9..46e175c5323bb 100644 --- a/code/modules/mob/living/basic/vermin/mouse.dm +++ b/code/modules/mob/living/basic/vermin/mouse.dm @@ -37,24 +37,27 @@ /// Probability that, if we successfully bite a shocked cable, that we will die to it. var/cable_zap_prob = 85 -/mob/living/basic/mouse/Initialize(mapload, tame = FALSE) +/mob/living/basic/mouse/Initialize(mapload, tame = FALSE, new_body_color) . = ..() if(contributes_to_ratcap) SSmobs.cheeserats |= src ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) src.tame = tame + if(!isnull(new_body_color)) + body_color = new_body_color if(isnull(body_color)) body_color = pick("brown", "gray", "white") held_state = "mouse_[body_color]" // not handled by variety element AddElement(/datum/element/animal_variety, "mouse", body_color, FALSE) AddElement(/datum/element/swabable, CELL_LINE_TABLE_MOUSE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 10) - AddComponent(/datum/component/squeak, list('sound/effects/mousesqueek.ogg' = 1), 100, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) //as quiet as a mouse or whatever + AddComponent(/datum/component/squeak, list('sound/creatures/mousesqueek.ogg' = 1), 100, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) //as quiet as a mouse or whatever var/static/list/loc_connections = list( COMSIG_ATOM_ENTERED = PROC_REF(on_entered), ) AddElement(/datum/element/connect_loc, loc_connections) make_tameable() + AddComponent(/datum/component/swarming, 16, 16) //max_x, max_y /mob/living/basic/mouse/proc/make_tameable() if (tame) @@ -115,8 +118,7 @@ // Now if we were't ACTUALLY gibbed, spawn the dead mouse if(!gibbed) var/obj/item/food/deadmouse/mouse = new(loc) - mouse.name = name - mouse.icon_state = icon_dead + mouse.copy_corpse(src) if(HAS_TRAIT(src, TRAIT_BEING_SHOCKED)) mouse.desc = "They're toast." mouse.add_atom_colour("#3A3A3A", FIXED_COLOUR_PRIORITY) @@ -192,7 +194,7 @@ /// Evolves this rat into a regal rat /mob/living/basic/mouse/proc/evolve_into_regal_rat() - var/mob/living/simple_animal/hostile/regalrat/controlled/regalrat = new(loc) + var/mob/living/basic/regal_rat/controlled/regalrat = new(loc) mind?.transfer_to(regalrat) INVOKE_ASYNC(regalrat, TYPE_PROC_REF(/atom/movable, say), "RISE, MY SUBJECTS! SCREEEEEEE!") qdel(src) @@ -250,6 +252,7 @@ response_harm_continuous = "splats" response_harm_simple = "splat" gold_core_spawnable = NO_SPAWN + contributes_to_ratcap = FALSE /mob/living/basic/mouse/brown/tom/make_tameable() tame = TRUE @@ -297,15 +300,38 @@ decomp_req_handle = TRUE ant_attracting = FALSE decomp_type = /obj/item/food/deadmouse/moldy + var/body_color = "gray" + var/critter_type = /mob/living/basic/mouse /obj/item/food/deadmouse/Initialize(mapload) . = ..() AddElement(/datum/element/swabable, CELL_LINE_TABLE_MOUSE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 10) + RegisterSignal(src, COMSIG_ATOM_ON_LAZARUS_INJECTOR, PROC_REF(use_lazarus)) + +/// Copy properties from an imminently dead mouse +/obj/item/food/deadmouse/proc/copy_corpse(mob/living/basic/mouse/dead_critter) + body_color = dead_critter.body_color + critter_type = dead_critter.type + name = dead_critter.name + icon_state = dead_critter.icon_dead /obj/item/food/deadmouse/examine(mob/user) . = ..() if (reagents?.has_reagent(/datum/reagent/yuck) || reagents?.has_reagent(/datum/reagent/fuel)) - . += span_warning("[p_theyre(TRUE)] dripping with fuel and smells terrible.") + . += span_warning("[p_Theyre()] dripping with fuel and smells terrible.") + +///Spawn a new mouse from this dead mouse item when hit by a lazarus injector and conditions are met. +/obj/item/food/deadmouse/proc/use_lazarus(datum/source, obj/item/lazarus_injector/injector, mob/user) + SIGNAL_HANDLER + if(injector.revive_type != SENTIENCE_ORGANIC) + balloon_alert(user, "invalid creature!") + return + var/mob/living/basic/mouse/revived_critter = new critter_type (drop_location(), FALSE, body_color) + revived_critter.name = name + revived_critter.lazarus_revive(user, injector.malfunctioning) + injector.expend(revived_critter, user) + qdel(src) + return LAZARUS_INJECTOR_USED /obj/item/food/deadmouse/attackby(obj/item/attacking_item, mob/user, params) var/mob/living/living_user = user @@ -355,6 +381,7 @@ BB_CURRENT_HUNTING_TARGET = null, // cheese BB_LOW_PRIORITY_HUNTING_TARGET = null, // cable BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), // Use this to find people to run away from + BB_BASIC_MOB_FLEE_DISTANCE = 3, ) ai_traits = STOP_MOVING_WHEN_PULLED @@ -374,9 +401,6 @@ ) /// Don't look for anything to run away from if you are distracted by being adjacent to cheese -/datum/ai_planning_subtree/flee_target/mouse - flee_behaviour = /datum/ai_behavior/run_away_from_target/mouse - /datum/ai_planning_subtree/flee_target/mouse /datum/ai_planning_subtree/flee_target/mouse/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) @@ -385,11 +409,6 @@ return // We see some cheese, which is more important than our life return ..() -/datum/ai_planning_subtree/flee_target/mouse/select - -/datum/ai_behavior/run_away_from_target/mouse - run_distance = 3 // Mostly exists in small tunnels, don't get ahead of yourself - /// AI controller for rats, slightly more complex than mice becuase they attack people /datum/ai_controller/basic_controller/mouse/rat blackboard = list( diff --git a/code/modules/mob/living/basic/vermin/space_bat.dm b/code/modules/mob/living/basic/vermin/space_bat.dm index 6fa1fd7aed5f5..3ce1b41173dd5 100644 --- a/code/modules/mob/living/basic/vermin/space_bat.dm +++ b/code/modules/mob/living/basic/vermin/space_bat.dm @@ -37,7 +37,7 @@ . = ..() AddElement(/datum/element/simple_flying) AddElement(/datum/element/ai_retaliate) - add_traits(list(TRAIT_SPACEWALK, TRAIT_VENTCRAWLER_ALWAYS), INNATE_TRAIT) + add_traits(list(TRAIT_SPACEWALK, TRAIT_VENTCRAWLER_ALWAYS, TRAIT_NO_MIRROR_REFLECTION), INNATE_TRAIT) ///Controller for space bats, has nothing unique, just retaliation. /datum/ai_controller/basic_controller/space_bat diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index a3b1d9d3ba5ff..cbec374449c0d 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -88,13 +88,13 @@ //Makes a blood drop, leaking amt units of blood from the mob /mob/living/carbon/proc/bleed(amt) - if(!blood_volume) + if(!blood_volume || (status_flags & GODMODE)) return blood_volume = max(blood_volume - amt, 0) //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) amt *= physiology.bleed_mod @@ -322,6 +322,8 @@ return if(!T) T = get_turf(src) + if(isclosedturf(T) || (isgroundlessturf(T) && !GET_TURF_BELOW(T))) + return var/list/temp_blood_DNA if(small_drip) diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm index 0de10eda4c9d1..b63ca68d7d774 100644 --- a/code/modules/mob/living/brain/MMI.dm +++ b/code/modules/mob/living/brain/MMI.dm @@ -22,9 +22,6 @@ laws.set_laws_config() /obj/item/mmi/Destroy() - if(iscyborg(loc)) - var/mob/living/silicon/robot/borg = loc - borg.mmi = null set_mecha(null) QDEL_NULL(brainmob) QDEL_NULL(brain) @@ -60,7 +57,7 @@ if(newbrain.suicided) to_chat(user, span_warning("[newbrain] is completely useless.")) return - if(!newbrain.brainmob?.mind || !newbrain.brainmob) + if(!newbrain.brainmob) var/install = tgui_alert(user, "[newbrain] is inactive, slot it in anyway?", "Installing Brain", list("Yes", "No")) if(install != "Yes") return @@ -76,7 +73,7 @@ if(!user.transferItemToLoc(O, src)) return var/mob/living/brain/B = newbrain.brainmob - if(!B.key) + if(!B.key && !newbrain.decoy_override) B.notify_ghost_cloning("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].")) @@ -244,14 +241,23 @@ . = ..() if(radio) . += span_notice("There is a switch to toggle the radio system [radio.is_on() ? "off" : "on"].[brain ? " It is currently being covered by [brain]." : null]") - if(brainmob) - var/mob/living/brain/B = brainmob - if(!B.key || !B.mind || B.stat == DEAD) - . += span_warning("\The [src] indicates that the brain is completely unresponsive.") - else if(!B.client) - . += span_warning("\The [src] indicates that the brain is currently inactive; it might change.") + + if(!isnull(brain)) + // It's dead, show it as much + if((brain.organ_flags & ORGAN_FAILING) || brainmob?.stat == DEAD) + if(brain.suicided || (brainmob && HAS_TRAIT(brainmob, TRAIT_SUICIDED))) + . += span_warning("[src] indicator light is red.") + else + . += span_warning("[src] indicator light is yellow - perhaps you should check the brain for damage.") + // If we have a client, OR it's a decoy brain, show as active + else if(brain.decoy_override || brainmob?.client) + . += span_notice("[src] indicates that the brain is active.") + // If we have a brainmob and it has a mind, it may just be DC'd + else if(brainmob?.mind) + . += span_warning("[src] indicates that the brain is currently inactive; it might change.") + // No brainmob, no mind, and not a decoy, it's a dead brain else - . += span_notice("\The [src] indicates that the brain is active.") + . += span_warning("[src] indicates that the brain is completely unresponsive.") /obj/item/mmi/relaymove(mob/living/user, direction) return //so that the MMI won't get a warning about not being able to move if it tries to move @@ -262,6 +268,10 @@ if(user) to_chat(user, span_warning("\The [src] indicates that there is no mind present!")) return FALSE + if(brain?.decoy_override) + if(user) + to_chat(user, span_warning("This [name] does not seem to fit!")) + return FALSE if(!B.key || !B.mind) if(user) to_chat(user, span_warning("\The [src] indicates that their mind is completely unresponsive!")) diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm index 9ced66957983f..bd22fb42eb13f 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -46,7 +46,7 @@ visible_message(span_danger(get_visible_suicide_message()), span_userdanger(get_visible_suicide_message())) /mob/living/brain/get_visible_suicide_message() - return "[src]'s brain is growing dull and lifeless. [p_they(TRUE)] look[p_s()] like [p_theyve()] lost the will to live." + return "[src]'s brain is growing dull and lifeless. [p_They()] look[p_s()] like [p_theyve()] lost the will to live." /mob/living/brain/apply_suicide_damage(obj/item/suicide_tool, damage_type = NONE) // we don't really care about applying damage to the brain mob and is just needless work. return FALSE diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index ea034fd43d643..9918a21b4f6d4 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -9,7 +9,7 @@ plane = GAME_PLANE_UPPER zone = BODY_ZONE_HEAD slot = ORGAN_SLOT_BRAIN - organ_flags = ORGAN_VITAL + organ_flags = ORGAN_ORGANIC | ORGAN_VITAL attack_verb_continuous = list("attacks", "slaps", "whacks") attack_verb_simple = list("attack", "slap", "whack") @@ -39,6 +39,21 @@ /// Maximum skillchip slots available. Do not reference this var directly and instead call get_max_skillchip_slots() var/max_skillchip_slots = 5 + /// Size modifier for the sprite + var/brain_size = 1 + +/obj/item/organ/internal/brain/Initialize(mapload) + . = ..() + // Brain size logic + transform = transform.Scale(brain_size) + +/obj/item/organ/internal/brain/examine() + . = ..() + if(brain_size < 1) + . += span_notice("It is a bit on the smaller side...") + if(brain_size > 1) + . += span_notice("It is bigger than average...") + /obj/item/organ/internal/brain/Insert(mob/living/carbon/brain_owner, special = FALSE, drop_if_replaced = TRUE, no_id_transfer = FALSE) . = ..() if(!.) @@ -54,17 +69,23 @@ brain_owner.update_body_parts() return - // Not a ling? Now you get to assume direct control. if(brainmob) - if(brain_owner.key) - brain_owner.ghostize() + // If it's a ling decoy brain, nothing to transfer, just throw it out + if(decoy_override) + if(brainmob?.key) + stack_trace("Decoy override brain with a key assigned - This should never happen.") - if(brainmob.mind) - brainmob.mind.transfer_to(brain_owner) + // Not a ling - assume direct control else - brain_owner.key = brainmob.key + if(brain_owner.key) + brain_owner.ghostize() + + if(brainmob.mind) + brainmob.mind.transfer_to(brain_owner) + else + brain_owner.key = brainmob.key - brain_owner.set_suicide(HAS_TRAIT(brainmob, TRAIT_SUICIDED)) + brain_owner.set_suicide(HAS_TRAIT(brainmob, TRAIT_SUICIDED)) QDEL_NULL(brainmob) else @@ -126,8 +147,13 @@ /obj/item/organ/internal/brain/proc/transfer_identity(mob/living/L) name = "[L.name]'s [initial(name)]" - if(brainmob || decoy_override) - return + if(brainmob) + if(!decoy_override) + return + + // it's just a dummy, throw it out + QDEL_NULL(brainmob) + if(!L.mind) return brainmob = new(src) @@ -146,9 +172,10 @@ // Hack, fucked dna needs to follow the brain to prevent memes, so we need to copy over the trait sources and shit for(var/source in GET_TRAIT_SOURCES(L, TRAIT_BADDNA)) ADD_TRAIT(brainmob, TRAIT_BADDNA, source) - if(L.mind && L.mind.current) + + if(L.mind && L.mind.current && !decoy_override) L.mind.transfer_to(brainmob) - to_chat(brainmob, span_notice("You feel slightly disoriented. That's normal when you're just a brain.")) + to_chat(brainmob, span_notice("You feel slightly disoriented. That's normal when you're just a brain.")) /obj/item/organ/internal/brain/attackby(obj/item/O, mob/user, params) user.changeNext_move(CLICK_CD_MELEE) @@ -214,7 +241,7 @@ if(suicided) . += 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(brainmob && (decoy_override || brainmob.client || brainmob.get_ghost())) 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.") else if(damage >= BRAIN_DAMAGE_DEATH*0.5) @@ -262,13 +289,11 @@ ..() /obj/item/organ/internal/brain/Destroy() //copypasted from MMIs. - if(brainmob) - QDEL_NULL(brainmob) + QDEL_NULL(brainmob) QDEL_LIST(traumas) destroy_all_skillchips() - if(owner?.mind) //You aren't allowed to return to brains that don't exist - owner.mind.set_current(null) + owner?.mind?.set_current(null) //You aren't allowed to return to brains that don't exist return ..() /obj/item/organ/internal/brain/on_life(seconds_per_tick, times_fired) @@ -379,9 +404,26 @@ desc = "This collection of sparkling gems somehow allows a golem to think." icon_state = "adamantine_resonator" color = COLOR_GOLEM_GRAY - status = ORGAN_MINERAL + organ_flags = ORGAN_MINERAL organ_traits = list(TRAIT_ADVANCEDTOOLUSER, TRAIT_LITERATE, TRAIT_CAN_STRIP, TRAIT_ROCK_METAMORPHIC) +/obj/item/organ/internal/brain/lustrous + name = "lustrous brain" + desc = "This is your brain on bluespace dust. Not even once." + icon_state = "random_fly_4" + organ_traits = list(TRAIT_ADVANCEDTOOLUSER, TRAIT_LITERATE, TRAIT_CAN_STRIP) + +/obj/item/organ/internal/brain/lustrous/before_organ_replacement(mob/living/carbon/organ_owner, special) + . = ..() + organ_owner.cure_trauma_type(/datum/brain_trauma/special/bluespace_prophet, TRAUMA_RESILIENCE_ABSOLUTE) + +/obj/item/organ/internal/brain/lustrous/on_insert(mob/living/carbon/organ_owner, special) + . = ..() + organ_owner.gain_trauma(/datum/brain_trauma/special/bluespace_prophet, TRAUMA_RESILIENCE_ABSOLUTE) + +/obj/item/organ/internal/brain/felinid //A bit smaller than average + brain_size = 0.8 + ////////////////////////////////////TRAUMAS//////////////////////////////////////// /obj/item/organ/internal/brain/proc/has_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience = TRAUMA_RESILIENCE_ABSOLUTE) @@ -507,10 +549,10 @@ amount_cured++ return amount_cured -/obj/item/organ/internal/brain/apply_organ_damage(damage_amount, maximum, required_organtype) +/obj/item/organ/internal/brain/apply_organ_damage(damage_amount, maximum = maxHealth, required_organ_flag = NONE) . = ..() if(!owner) - return + return FALSE if(damage >= 60) owner.add_mood_event("brain_damage", /datum/mood_event/brain_damage) else @@ -529,4 +571,4 @@ var/obj/item/organ/internal/brain/old_brain = new_owner.get_organ_slot(ORGAN_SLOT_BRAIN) old_brain.Remove(new_owner, special = TRUE, no_id_transfer = TRUE) qdel(old_brain) - Insert(new_owner, special = TRUE, drop_if_replaced = FALSE, no_id_transfer = TRUE) + return Insert(new_owner, special = TRUE, drop_if_replaced = FALSE, no_id_transfer = TRUE) diff --git a/code/modules/mob/living/brain/life.dm b/code/modules/mob/living/brain/life.dm index 1cbc979d365c4..9bebeac70ec83 100644 --- a/code/modules/mob/living/brain/life.dm +++ b/code/modules/mob/living/brain/life.dm @@ -1,9 +1,15 @@ /mob/living/brain/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if (notransform) - return - if(!loc) + if(isnull(loc) || HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return + + if(!isnull(container)) + if(!istype(container)) + stack_trace("/mob/living/brain with container set, but container was not an MMI!") + container = null + if(!container.contains(src)) + stack_trace("/mob/living/brain with container set, but we weren't inside of it!") + container = null . = ..() handle_emp_damage(seconds_per_tick, times_fired) diff --git a/code/modules/mob/living/brain/posibrain.dm b/code/modules/mob/living/brain/posibrain.dm index fb5f4cb19440d..b9080a8673a38 100644 --- a/code/modules/mob/living/brain/posibrain.dm +++ b/code/modules/mob/living/brain/posibrain.dm @@ -115,10 +115,7 @@ GLOBAL_VAR(posibrain_notify_cooldown) 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(HAS_TRAIT(src, TRAIT_SUICIDED)) //if they suicided, they're out forever. - to_chat(user, span_warning("[src] fizzles slightly. Sadly it doesn't take those who suicided!")) + if(is_occupied() || is_banned_from(user.ckey, ROLE_POSIBRAIN) || QDELETED(src) || QDELETED(user)) 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)) @@ -127,20 +124,20 @@ GLOBAL_VAR(posibrain_notify_cooldown) 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()) +/obj/item/mmi/posibrain/transfer_identity(mob/living/carbon/transferred_user) + name = "[initial(name)] ([transferred_user])" + brainmob.name = transferred_user.real_name + brainmob.real_name = transferred_user.real_name + if(transferred_user.has_dna()) if(!brainmob.stored_dna) brainmob.stored_dna = new /datum/dna/stored(brainmob) - transfered_user.dna.copy_dna(brainmob.stored_dna) - brainmob.timeofdeath = transfered_user.timeofdeath + transferred_user.dna.copy_dna(brainmob.stored_dna) + brainmob.timeofdeath = transferred_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) + if(transferred_user.mind) + transferred_user.mind.transfer_to(brainmob) brainmob.mind.remove_all_antag_datums() brainmob.mind.wipe_memory() diff --git a/code/modules/mob/living/carbon/alien/adult/adult.dm b/code/modules/mob/living/carbon/alien/adult/adult.dm index 3ddd659b5bdf3..ad8ef8ca877a0 100644 --- a/code/modules/mob/living/carbon/alien/adult/adult.dm +++ b/code/modules/mob/living/carbon/alien/adult/adult.dm @@ -151,3 +151,7 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list( log_combat(src, lucky_winner, "devoured") melting_pot.consume_thing(lucky_winner) return TRUE + +// Aliens can touch acid +/mob/living/carbon/alien/can_touch_acid(atom/acided_atom, acid_power, acid_volume) + return TRUE diff --git a/code/modules/mob/living/carbon/alien/adult/adult_defense.dm b/code/modules/mob/living/carbon/alien/adult/adult_defense.dm index 9edb0319aab29..b4a119d5abac0 100644 --- a/code/modules/mob/living/carbon/alien/adult/adult_defense.dm +++ b/code/modules/mob/living/carbon/alien/adult/adult_defense.dm @@ -18,14 +18,8 @@ if(!..() || !user.combat_mode) return if(LAZYACCESS(modifiers, RIGHT_CLICK)) - if (body_position == STANDING_UP) - if (prob(5)) - Unconscious(40) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) - log_combat(user, src, "pushed") - visible_message(span_danger("[user] pushes [src] down!"), \ - span_userdanger("[user] pushes you down!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), null, user) - to_chat(user, span_danger("You push [src] down!")) + if(stat < UNCONSCIOUS) + user.disarm(src) return TRUE var/damage = rand(1, 9) if (prob(90)) diff --git a/code/modules/mob/living/carbon/alien/adult/adult_update_icons.dm b/code/modules/mob/living/carbon/alien/adult/adult_update_icons.dm index 61384acaec42c..8c2111511236b 100644 --- a/code/modules/mob/living/carbon/alien/adult/adult_update_icons.dm +++ b/code/modules/mob/living/carbon/alien/adult/adult_update_icons.dm @@ -52,7 +52,7 @@ // update_icons() //Handled in update_transform(), leaving this here as a reminder update_transform() -/mob/living/carbon/alien/adult/perform_update_transform() //The old method of updating lying/standing was update_icons(). Aliens still expect that. +/mob/living/carbon/alien/adult/update_transform() //The old method of updating lying/standing was update_icons(). Aliens still expect that. . = ..() update_icons() @@ -67,7 +67,7 @@ if(handcuffed) var/mutable_appearance/handcuff_overlay = mutable_appearance(dmi_file, cuff_icon, -HANDCUFF_LAYER) - if(handcuffed.blocks_emissive) + if(handcuffed.blocks_emissive != EMISSIVE_BLOCK_NONE) handcuff_overlay += emissive_blocker(handcuff_overlay.icon, handcuff_overlay.icon_state, src, alpha = handcuff_overlay.alpha) overlays_standing[HANDCUFF_LAYER] = handcuff_overlay @@ -86,7 +86,7 @@ if(!itm_state) itm_state = l_hand.icon_state var/mutable_appearance/l_hand_item = mutable_appearance(alt_inhands_file, "[itm_state][caste]_l", -HANDS_LAYER) - if(l_hand.blocks_emissive) + if(l_hand.blocks_emissive != EMISSIVE_BLOCK_NONE) l_hand_item.overlays += emissive_blocker(l_hand_item.icon, l_hand_item.icon_state, src, alpha = l_hand_item.alpha) hands += l_hand_item @@ -96,7 +96,7 @@ if(!itm_state) itm_state = r_hand.icon_state var/mutable_appearance/r_hand_item = mutable_appearance(alt_inhands_file, "[itm_state][caste]_r", -HANDS_LAYER) - if(r_hand.blocks_emissive) + if(r_hand.blocks_emissive != EMISSIVE_BLOCK_NONE) r_hand_item.overlays += emissive_blocker(r_hand_item.icon, r_hand_item.icon_state, src, alpha = r_hand_item.alpha) hands += r_hand_item diff --git a/code/modules/mob/living/carbon/alien/adult/alien_powers.dm b/code/modules/mob/living/carbon/alien/adult/alien_powers.dm index 9d3fae5e8fb5b..f3cfbfda8a9ee 100644 --- a/code/modules/mob/living/carbon/alien/adult/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/adult/alien_powers.dm @@ -200,6 +200,10 @@ Doesn't work on other aliens/AI.*/ desc = "Drench an object in acid, destroying it over time." button_icon_state = "alien_acid" plasma_cost = 200 + /// The acid power for the aliens acid corrosion, will ignore mobs + var/corrosion_acid_power = 200 + /// The acid volume for the aliens acid corrosion, will ignore mobs + var/corrosion_acid_volume = 1000 /datum/action/cooldown/alien/acid/corrosion/set_click_ability(mob/on_who) . = ..() @@ -228,7 +232,9 @@ Doesn't work on other aliens/AI.*/ return ..() /datum/action/cooldown/alien/acid/corrosion/Activate(atom/target) - if(!target.acid_act(200, 1000)) + if(isturf(target)) + target.AddComponent(/datum/component/acid, corrosion_acid_power, corrosion_acid_volume, GLOB.acid_overlay, /particles/acid, turf_acid_ignores_mobs = TRUE) + else if(!target.acid_act(corrosion_acid_power, corrosion_acid_volume)) to_chat(owner, span_noticealien("You cannot dissolve this object.")) return FALSE @@ -240,7 +246,7 @@ Doesn't work on other aliens/AI.*/ /datum/action/cooldown/alien/acid/neurotoxin name = "Spit Neurotoxin" - desc = "Spits neurotoxin at someone, paralyzing them for a short time." + desc = "Spits neurotoxin at someone, dealing large amounts of stamina damage." button_icon_state = "alien_neurotoxin_0" plasma_cost = 50 @@ -338,13 +344,15 @@ Doesn't work on other aliens/AI.*/ new choice_path(owner.loc) return TRUE -/datum/action/cooldown/sneak/alien - name = "Sneak" +/datum/action/cooldown/mob_cooldown/sneak/alien + name = "Alien Sentinel Sneak" panel = "Alien" desc = "Blend into the shadows to stalk your prey." + button_icon = 'icons/mob/actions/actions_xeno.dmi' button_icon_state = "alien_sneak" background_icon_state = "bg_alien" overlay_icon_state = "bg_alien_border" + sneak_alpha = 25 /datum/action/cooldown/alien/regurgitate name = "Regurgitate" diff --git a/code/modules/mob/living/carbon/alien/adult/caste/hunter.dm b/code/modules/mob/living/carbon/alien/adult/caste/hunter.dm index 72cdd3bbf4b60..3a346bf82551e 100644 --- a/code/modules/mob/living/carbon/alien/adult/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/adult/caste/hunter.dm @@ -4,7 +4,10 @@ maxHealth = 125 health = 125 icon_state = "alienh" + alien_speed = -0.3 var/atom/movable/screen/leap_icon = null + ///How fast does our pounce move us? + var/pounce_speed = 2 /mob/living/carbon/alien/adult/hunter/create_internal_organs() organs += new /obj/item/organ/internal/alien/plasmavessel/small @@ -50,7 +53,7 @@ body_position_pixel_y_offset = -32 update_icons() ADD_TRAIT(src, TRAIT_MOVE_FLOATING, LEAPING_TRAIT) //Throwing itself doesn't protect mobs against lava (because gulag). - throw_at(A, MAX_ALIEN_LEAP_DIST, 1, src, FALSE, TRUE, callback = CALLBACK(src, PROC_REF(leap_end))) + throw_at(A, MAX_ALIEN_LEAP_DIST, pounce_speed, src, FALSE, TRUE, callback = CALLBACK(src, PROC_REF(leap_end))) /mob/living/carbon/alien/adult/hunter/proc/leap_end() leaping = FALSE @@ -75,7 +78,7 @@ blocked = TRUE if(!blocked) L.visible_message(span_danger("[src] pounces on [L]!"), span_userdanger("[src] pounces on you!")) - L.Paralyze(100) + L.Paralyze(5 SECONDS) sleep(0.2 SECONDS)//Runtime prevention (infinite bump() calls on hulks) step_towards(src,L) else diff --git a/code/modules/mob/living/carbon/alien/adult/caste/praetorian.dm b/code/modules/mob/living/carbon/alien/adult/caste/praetorian.dm index 3064068b32f58..a26eb31231c03 100644 --- a/code/modules/mob/living/carbon/alien/adult/caste/praetorian.dm +++ b/code/modules/mob/living/carbon/alien/adult/caste/praetorian.dm @@ -4,6 +4,7 @@ maxHealth = 250 health = 250 icon_state = "alienp" + alien_speed = 0.5 /mob/living/carbon/alien/adult/royal/praetorian/Initialize(mapload) real_name = name diff --git a/code/modules/mob/living/carbon/alien/adult/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/adult/caste/sentinel.dm index 3a6cc5f7b34ff..7fffdf35522c7 100644 --- a/code/modules/mob/living/carbon/alien/adult/caste/sentinel.dm +++ b/code/modules/mob/living/carbon/alien/adult/caste/sentinel.dm @@ -4,9 +4,10 @@ maxHealth = 150 health = 150 icon_state = "aliens" + alien_speed = 0.2 /mob/living/carbon/alien/adult/sentinel/Initialize(mapload) - var/datum/action/cooldown/sneak/alien/sneaky_beaky = new(src) + var/datum/action/cooldown/mob_cooldown/sneak/alien/sneaky_beaky = new(src) sneaky_beaky.Grant(src) return ..() diff --git a/code/modules/mob/living/carbon/alien/adult/queen.dm b/code/modules/mob/living/carbon/alien/adult/queen.dm index 1f344a98fb2df..dd8e61b6699fc 100644 --- a/code/modules/mob/living/carbon/alien/adult/queen.dm +++ b/code/modules/mob/living/carbon/alien/adult/queen.dm @@ -19,6 +19,7 @@ . = ..() // as a wise man once wrote: "pull over that ass too fat" REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + AddComponent(/datum/component/seethrough_mob) /mob/living/carbon/alien/adult/royal/on_lying_down(new_lying_angle) . = ..() @@ -34,9 +35,12 @@ /mob/living/carbon/alien/adult/royal/queen name = "alien queen" caste = "q" - maxHealth = 400 - health = 400 + maxHealth = 500 + health = 500 icon_state = "alienq" + melee_damage_lower = 50 + melee_damage_upper = 50 + alien_speed = 2 /mob/living/carbon/alien/adult/royal/queen/Initialize(mapload) //there should only be one queen @@ -54,9 +58,6 @@ 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/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 48d72c665c6a5..d17b02d8817c6 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -15,7 +15,10 @@ heat_protection = 0.5 // minor heat insulation + ///Whether or not the alien is leaping. Only used by hunters. var/leaping = FALSE + ///The speed this alien should move at. + var/alien_speed = 0 gib_type = /obj/effect/decal/cleanable/xenoblood/xgibs unique_name = TRUE @@ -32,6 +35,8 @@ add_traits(list(TRAIT_NEVER_WOUNDED, TRAIT_VENTCRAWLER_ALWAYS), INNATE_TRAIT) . = ..() + if(alien_speed) + update_alien_speed() /mob/living/carbon/alien/create_internal_organs() organs += new /obj/item/organ/internal/brain/alien @@ -66,9 +71,6 @@ else clear_alert(ALERT_XENO_FIRE) -/mob/living/carbon/alien/reagent_check(datum/reagent/R, seconds_per_tick, times_fired) //can metabolize all reagents - return FALSE - /mob/living/carbon/alien/getTrail() if(getBruteLoss() < 200) return pick (list("xltrails_1", "xltrails2")) @@ -140,3 +142,6 @@ Des: Removes all infected images from the alien. /mob/living/carbon/alien/on_standing_up() . = ..() update_icons() + +/mob/living/carbon/alien/proc/update_alien_speed() + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/alien_speed, multiplicative_slowdown = alien_speed) diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index 60f40f0370943..63ef8830435e1 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -103,7 +103,7 @@ In all, this is a lot like the monkey code. /N var/obj/item/organ/internal/ears/ears = get_organ_slot(ORGAN_SLOT_EARS) switch (severity) if (EXPLODE_DEVASTATE) - gib() + gib(DROP_ALL_REMAINS) if (EXPLODE_HEAVY) take_overall_damage(60, 60) @@ -126,5 +126,5 @@ In all, this is a lot like the monkey code. /N /mob/living/carbon/alien/acid_act(acidpwr, acid_volume) return FALSE//aliens are immune to acid. -/mob/living/carbon/alien/on_fire_stack(seconds_per_tick, times_fired, datum/status_effect/fire_handler/fire_stacks/fire_handler) +/mob/living/carbon/alien/on_fire_stack(seconds_per_tick, datum/status_effect/fire_handler/fire_stacks/fire_handler) adjust_bodytemperature((BODYTEMP_HEATING_MAX + (fire_handler.stacks * 12)) * 0.5 * seconds_per_tick) diff --git a/code/modules/mob/living/carbon/alien/damage_procs.dm b/code/modules/mob/living/carbon/alien/damage_procs.dm index 8861a55d9931c..5dbffda96739e 100644 --- a/code/modules/mob/living/carbon/alien/damage_procs.dm +++ b/code/modules/mob/living/carbon/alien/damage_procs.dm @@ -11,5 +11,5 @@ return FALSE ///aliens are immune to stamina damage. -/mob/living/carbon/alien/setStaminaLoss(amount, updating_stamina = 1) +/mob/living/carbon/alien/setStaminaLoss(amount, updating_stamina = 1, forced = FALSE, required_biotype) return FALSE diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm index 718186c9078e0..f5a0b7ace1b47 100644 --- a/code/modules/mob/living/carbon/alien/death.dm +++ b/code/modules/mob/living/carbon/alien/death.dm @@ -1,5 +1,5 @@ -/mob/living/carbon/alien/spawn_gibs(with_bodyparts) - if(with_bodyparts) +/mob/living/carbon/alien/spawn_gibs(drop_bitflags=NONE) + if(drop_bitflags & DROP_BODYPARTS) new /obj/effect/gibspawner/xeno(drop_location(), src) else new /obj/effect/gibspawner/xeno/bodypartless(drop_location(), src) diff --git a/code/modules/mob/living/carbon/alien/larva/death.dm b/code/modules/mob/living/carbon/alien/larva/death.dm index 8fd6329a0c1de..4b7f9f9321845 100644 --- a/code/modules/mob/living/carbon/alien/larva/death.dm +++ b/code/modules/mob/living/carbon/alien/larva/death.dm @@ -6,8 +6,8 @@ update_icons() -/mob/living/carbon/alien/larva/spawn_gibs(with_bodyparts) - if(with_bodyparts) +/mob/living/carbon/alien/larva/spawn_gibs(drop_bitflags=NONE) + if(drop_bitflags & DROP_BODYPARTS) new /obj/effect/gibspawner/larva(drop_location(), src) else new /obj/effect/gibspawner/larva/bodypartless(drop_location(), src) diff --git a/code/modules/mob/living/carbon/alien/larva/larva_update_icons.dm b/code/modules/mob/living/carbon/alien/larva/larva_update_icons.dm index 8e2c75647c538..185e7df2f0b08 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva_update_icons.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva_update_icons.dm @@ -21,7 +21,7 @@ else icon_state = "larva[state]" -/mob/living/carbon/alien/larva/perform_update_transform() //All this is handled in update_icons() +/mob/living/carbon/alien/larva/update_transform() //All this is handled in update_icons() . = ..() update_icons() diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index 325e2b10742b0..147079ae720c3 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -1,9 +1,9 @@ /mob/living/carbon/alien/larva/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if (notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return - if(!..() || IS_IN_STASIS(src) || (amount_grown >= max_grown)) + if(!..() || HAS_TRAIT(src, TRAIT_STASIS) || (amount_grown >= max_grown)) return // We're dead, in stasis, or already grown. // GROW! amount_grown = min(amount_grown + (0.5 * seconds_per_tick), max_grown) diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index 00c8a617c64fe..af796c9ff685f 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -51,21 +51,24 @@ actions_types = list(/datum/action/cooldown/alien/transfer) /obj/item/organ/internal/alien/plasmavessel/on_life(seconds_per_tick, times_fired) + var/delta_time = DELTA_WORLD_TIME(SSmobs) + //Instantly healing to max health in a single tick would be silly. If it takes 8 seconds to fire, then something's fucked. + var/delta_time_capped = min(delta_time, 8) //If there are alien weeds on the ground then heal if needed or give some plasma if(locate(/obj/structure/alien/weeds) in owner.loc) if(owner.health >= owner.maxHealth) - owner.adjustPlasma(plasma_rate * seconds_per_tick) + owner.adjustPlasma(plasma_rate * delta_time) else var/heal_amt = heal_rate if(!isalien(owner)) heal_amt *= 0.2 - owner.adjustPlasma(0.5 * plasma_rate * seconds_per_tick) - owner.adjustBruteLoss(-heal_amt * seconds_per_tick) - owner.adjustFireLoss(-heal_amt * seconds_per_tick) - owner.adjustOxyLoss(-heal_amt * seconds_per_tick) - owner.adjustCloneLoss(-heal_amt * seconds_per_tick) + owner.adjustPlasma(0.5 * plasma_rate * delta_time_capped) + owner.adjustBruteLoss(-heal_amt * delta_time_capped) + owner.adjustFireLoss(-heal_amt * delta_time_capped) + owner.adjustOxyLoss(-heal_amt * delta_time_capped) + owner.adjustCloneLoss(-heal_amt * delta_time_capped) else - owner.adjustPlasma(0.1 * plasma_rate * seconds_per_tick) + owner.adjustPlasma(0.1 * plasma_rate * delta_time) /obj/item/organ/internal/alien/plasmavessel/on_insert(mob/living/carbon/organ_owner) . = ..() @@ -333,7 +336,7 @@ if(owner) shake_camera(owner, 2, 5) owner.investigate_log("has been gibbed by something inside [owner.p_their()] stomach.", INVESTIGATE_DEATHS) - owner.gib() + owner.gib(DROP_ALL_REMAINS) qdel(src) /obj/item/organ/internal/stomach/alien/proc/eject_stomach(list/turf/targets, spit_range, content_speed, particle_delay, particle_count=4) 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 333e318f9e0a7..22c528b00953d 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -65,9 +65,9 @@ if(stage < 6) INVOKE_ASYNC(src, PROC_REF(RefreshInfectionImage)) var/slowdown = 1 - if(ishuman(owner)) - var/mob/living/carbon/human/baby_momma = owner - slowdown = baby_momma.reagents.has_reagent(/datum/reagent/medicine/spaceacillin) ? 2 : 1 // spaceacillin doubles the time it takes to grow + if(!isnull(owner)) // it gestates out of bodies. + if(HAS_TRAIT(owner, TRAIT_VIRUS_RESISTANCE)) + slowdown *= 2 // spaceacillin doubles the time it takes to grow if(owner.has_status_effect(/datum/status_effect/nest_sustenance)) slowdown *= 0.80 //egg gestates 20% faster if you're trapped in a nest @@ -111,8 +111,7 @@ var/mob/living/carbon/alien/larva/new_xeno = new(xeno_loc) new_xeno.key = ghost.key SEND_SOUND(new_xeno, sound('sound/voice/hiss5.ogg',0,0,0,100)) //To get the player's attention - new_xeno.add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), type) //so we don't move during the bursting animation - new_xeno.notransform = 1 + new_xeno.add_traits(list(TRAIT_HANDS_BLOCKED, TRAIT_IMMOBILIZED, TRAIT_NO_TRANSFORM), type) //so we don't move during the bursting animation new_xeno.invisibility = INVISIBILITY_MAXIMUM sleep(0.6 SECONDS) @@ -121,16 +120,14 @@ qdel(new_xeno) CRASH("AttemptGrow failed due to the early qdeletion of source or owner.") - if(new_xeno) - REMOVE_TRAIT(new_xeno, TRAIT_IMMOBILIZED, type) - REMOVE_TRAIT(new_xeno, TRAIT_HANDS_BLOCKED, type) - new_xeno.notransform = 0 + if(!isnull(new_xeno)) + new_xeno.remove_traits(list(TRAIT_HANDS_BLOCKED, TRAIT_IMMOBILIZED, TRAIT_NO_TRANSFORM), type) new_xeno.invisibility = 0 if(gib_on_success) new_xeno.visible_message(span_danger("[new_xeno] bursts out of [owner] in a shower of gore!"), span_userdanger("You exit [owner], your previous host."), span_hear("You hear organic matter ripping and tearing!")) owner.investigate_log("has been gibbed by an alien larva.", INVESTIGATE_DEATHS) - owner.gib(TRUE) + owner.gib(DROP_ORGANS|DROP_BODYPARTS) else new_xeno.visible_message(span_danger("[new_xeno] wriggles out of [owner]!"), span_userdanger("You exit [owner], your previous host.")) owner.log_message("had an alien larva within them escape (without being gibbed).", LOG_ATTACK, log_globally = FALSE) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 2d77af7e67cdc..199590e3dc637 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -66,25 +66,17 @@ else mode() // Activate held item -/mob/living/carbon/attackby(obj/item/I, mob/living/user, params) - for(var/datum/surgery/operations as anything in surgeries) - if(user.combat_mode) - break - if(body_position != LYING_DOWN && (operations.surgery_flags & SURGERY_REQUIRE_RESTING)) - continue - if(!(operations.surgery_flags & SURGERY_SELF_OPERABLE) && (user == src)) - continue - var/list/modifiers = params2list(params) - if(operations.next_step(user, modifiers)) - return TRUE - +/mob/living/carbon/attackby(obj/item/item, mob/living/user, params) if(!all_wounds || !(!user.combat_mode || user == src)) return ..() + if(can_perform_surgery(user, params)) + return TRUE + for(var/i in shuffle(all_wounds)) - var/datum/wound/W = i - if(W.try_treating(I, user)) - return 1 + var/datum/wound/wound = i + if(wound.try_treating(item, user)) + return TRUE return ..() @@ -163,6 +155,9 @@ return FALSE var/atom/movable/thrown_thing var/obj/item/held_item = get_active_held_item() + var/verb_text = pick("throw", "toss", "hurl", "chuck", "fling") + if(prob(0.5)) + verb_text = "yeet" 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(!held_item) if(pulling && isliving(pulling) && grab_state >= GRAB_AGGRESSIVE) @@ -193,8 +188,12 @@ power_throw++ if(neckgrab_throw) power_throw++ - visible_message(span_danger("[src] throws [thrown_thing][power_throw ? " really hard!" : "."]"), \ - span_danger("You throw [thrown_thing][power_throw ? " really hard!" : "."]")) + if(isitem(thrown_thing)) + var/obj/item/thrown_item = thrown_thing + if(thrown_item.throw_verb) + verb_text = thrown_item.throw_verb + visible_message(span_danger("[src] [verb_text][plural_s(verb_text)] [thrown_thing][power_throw ? " really hard!" : "."]"), \ + span_danger("You [verb_text] [thrown_thing][power_throw ? " really hard!" : "."]")) log_message("has thrown [thrown_thing] [power_throw > 0 ? "really hard" : ""]", LOG_ATTACK) var/extra_throw_range = HAS_TRAIT(src, TRAIT_THROWINGARM) ? 2 : 0 newtonian_move(get_dir(target, src)) @@ -211,7 +210,7 @@ /mob/living/carbon/Topic(href, href_list) ..() - if(href_list["embedded_object"] && usr.can_perform_action(src, NEED_DEXTERITY)) + if(href_list["embedded_object"]) var/obj/item/bodypart/L = locate(href_list["embedded_limb"]) in bodyparts if(!L) return @@ -409,53 +408,79 @@ return 0 return ..() -/mob/living/carbon/proc/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, vomit_type = VOMIT_TOXIC, harm = TRUE, force = FALSE, purge_ratio = 0.1) +/// Proc that compels the mob to throw up. Returns TRUE if the mob actually threw up. +/mob/living/carbon/proc/vomit(vomit_flags = VOMIT_CATEGORY_DEFAULT, vomit_type = /obj/effect/decal/cleanable/vomit/toxic, lost_nutrition = 10, distance = 1, purge_ratio = 0.1) + var/force = (vomit_flags & MOB_VOMIT_FORCE) if((HAS_TRAIT(src, TRAIT_NOHUNGER) || HAS_TRAIT(src, TRAIT_TOXINLOVER)) && !force) return TRUE SEND_SIGNAL(src, COMSIG_CARBON_VOMITED, distance, force) + + // cache some stuff that we'll need later (at least multiple times) var/starting_dir = dir - if(nutrition < 100 && !blood && !force) + var/message = (vomit_flags & MOB_VOMIT_MESSAGE) + var/stun = (vomit_flags & MOB_VOMIT_STUN) + var/knockdown = (vomit_flags & MOB_VOMIT_KNOCKDOWN) + var/blood = (vomit_flags & MOB_VOMIT_BLOOD) + + if(!force && !blood && (nutrition < 100)) if(message) - visible_message(span_warning("[src] dry heaves!"), \ - span_userdanger("You try to throw up, but there's nothing in your stomach!")) + visible_message( + span_warning("[src] dry heaves!"), + span_userdanger("You try to throw up, but there's nothing in your stomach!"), + ) if(stun) Stun(20 SECONDS) + if(knockdown) + Knockdown(20 SECONDS) return TRUE if(is_mouth_covered()) //make this add a blood/vomit overlay later it'll be hilarious if(message) - visible_message(span_danger("[src] throws up all over [p_them()]self!"), \ - span_userdanger("You throw up all over yourself!")) + visible_message( + span_danger("[src] throws up all over [p_them()]self!"), + span_userdanger("You throw up all over yourself!"), + ) 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!")) + visible_message( + span_danger("[src] throws up!"), + span_userdanger("You throw up!"), + ) if(!isflyperson(src)) add_mood_event("vomit", /datum/mood_event/vomit) if(stun) Stun(8 SECONDS) + if(knockdown) + Knockdown(8 SECONDS) playsound(get_turf(src), 'sound/effects/splat.ogg', 50, TRUE) - var/turf/T = get_turf(src) + + var/need_mob_update = FALSE + var/turf/location = get_turf(src) if(!blood) adjust_nutrition(-lost_nutrition) - adjustToxLoss(-3) + need_mob_update += adjustToxLoss(-3, updating_health = FALSE) - for(var/i=0 to distance) + for(var/i = 0 to distance) if(blood) - if(T) - add_splatter_floor(T) - if(harm) - adjustBruteLoss(3) + if(location) + add_splatter_floor(location) + if(vomit_flags & MOB_VOMIT_HARM) + need_mob_update += adjustBruteLoss(3, updating_health = FALSE) else - if(T) - T.add_vomit_floor(src, vomit_type, purge_ratio) //toxic barf looks different || call purge when doing detoxicfication to pump more chems out of the stomach. - T = get_step(T, starting_dir) - if (T?.is_blocked_turf()) + if(location) + location.add_vomit_floor(src, vomit_type, vomit_flags, purge_ratio) // call purge when doing detoxicfication to pump more chems out of the stomach. + + location = get_step(location, starting_dir) + if (location?.is_blocked_turf()) break + if(need_mob_update) // so we only have to call updatehealth() once as opposed to n times + updatehealth() + return TRUE /** @@ -474,7 +499,7 @@ var/turf/floor = get_turf(src) var/obj/effect/decal/cleanable/vomit/spew = new(floor, get_static_viruses()) - bite.reagents.trans_to(spew, amount, transfered_by = src) + bite.reagents.trans_to(spew, amount, transferred_by = src) /mob/living/carbon/proc/spew_organ(power = 5, amt = 1) for(var/i in 1 to amt) @@ -489,9 +514,12 @@ /mob/living/carbon/fully_replace_character_name(oldname,newname) - ..() + . = ..() if(dna) dna.real_name = real_name + var/obj/item/bodypart/head/my_head = get_bodypart(BODY_ZONE_HEAD) + if(my_head) + my_head.real_name = real_name /mob/living/carbon/set_body_position(new_value) @@ -596,9 +624,6 @@ if(HAS_TRAIT(src, TRAIT_XRAY_VISION)) new_sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS - if(see_override) - set_invis_see(see_override) - if(SSmapping.level_trait(z, ZTRAIT_NOXRAY)) new_sight = NONE @@ -819,6 +844,8 @@ if(health <= HEALTH_THRESHOLD_DEAD && !HAS_TRAIT(src, TRAIT_NODEATH)) death() return + if(HAS_TRAIT_FROM(src, TRAIT_DISSECTED, AUTOPSY_TRAIT)) + REMOVE_TRAIT(src, TRAIT_DISSECTED, AUTOPSY_TRAIT) if(health <= hardcrit_threshold && !HAS_TRAIT(src, TRAIT_NOHARDCRIT)) set_stat(HARD_CRIT) else if(HAS_TRAIT(src, TRAIT_KNOCKEDOUT)) @@ -852,10 +879,11 @@ if(dna && !HAS_TRAIT(src, TRAIT_NOBLOOD)) blood_volume += (excess_healing * 2) //1 excess = 10 blood - for(var/obj/item/organ/organ as anything in organs) - if(organ.organ_flags & ORGAN_SYNTHETIC) + for(var/obj/item/organ/target_organ as anything in organs) + if(!target_organ.damage) continue - organ.apply_organ_damage(excess_healing * -1) //1 excess = 5 organ damage healed + + target_organ.apply_organ_damage(excess_healing * -1, required_organ_flag = ORGAN_ORGANIC) //1 excess = 5 organ damage healed return ..() @@ -869,7 +897,7 @@ return FALSE // And we can't heal them if they're missing their liver - if(!HAS_TRAIT(src, TRAIT_NOMETABOLISM) && !isnull(dna?.species.mutantliver) && !get_organ_slot(ORGAN_SLOT_LIVER)) + if(!HAS_TRAIT(src, TRAIT_LIVERLESS_METABOLISM) && !isnull(dna?.species.mutantliver) && !get_organ_slot(ORGAN_SLOT_LIVER)) return FALSE return ..() @@ -970,36 +998,23 @@ /// Creates body parts for this carbon completely from scratch. /// Optionally takes a map of body zones to what type to instantiate instead of them. /mob/living/carbon/proc/create_bodyparts(list/overrides) - var/l_arm_index_next = -1 - var/r_arm_index_next = 0 - for(var/obj/item/bodypart/bodypart_path as anything in bodyparts) + var/list/bodyparts_paths = bodyparts.Copy() + bodyparts = list() + for(var/obj/item/bodypart/bodypart_path as anything in bodyparts_paths) var/real_body_part_path = overrides?[initial(bodypart_path.body_zone)] || bodypart_path var/obj/item/bodypart/bodypart_instance = new real_body_part_path() bodypart_instance.set_owner(src) - bodyparts.Remove(bodypart_path) add_bodypart(bodypart_instance) - switch(bodypart_instance.body_part) - if(ARM_LEFT) - l_arm_index_next += 2 - bodypart_instance.held_index = l_arm_index_next //1, 3, 5, 7... - on_added_hand(bodypart_instance, l_arm_index_next) - if(ARM_RIGHT) - r_arm_index_next += 2 - bodypart_instance.held_index = r_arm_index_next //2, 4, 6, 8... - on_added_hand(bodypart_instance, r_arm_index_next) /// Called when a new hand is added /mob/living/carbon/proc/on_added_hand(obj/item/bodypart/arm/new_hand, hand_index) if(hand_index > hand_bodyparts.len) hand_bodyparts.len = hand_index hand_bodyparts[hand_index] = new_hand - RegisterSignals(new_hand, list(COMSIG_QDELETING, COMSIG_BODYPART_REMOVED), PROC_REF(on_lost_hand)) -/// Cleans up references to an arm when it is dismembered or deleted +/// Cleans up references to a hand when it is dismembered or deleted /mob/living/carbon/proc/on_lost_hand(obj/item/bodypart/arm/lost_hand) - SIGNAL_HANDLER hand_bodyparts[lost_hand.held_index] = null - UnregisterSignal(lost_hand, list(COMSIG_QDELETING, COMSIG_BODYPART_REMOVED)) ///Proc to hook behavior on bodypart additions. Do not directly call. You're looking for [/obj/item/bodypart/proc/try_attach_limb()]. /mob/living/carbon/proc/add_bodypart(obj/item/bodypart/new_bodypart) @@ -1018,12 +1033,15 @@ if(!new_bodypart.bodypart_disabled) set_usable_hands(usable_hands + 1) + synchronize_bodytypes() ///Proc to hook behavior on bodypart removals. Do not directly call. You're looking for [/obj/item/bodypart/proc/drop_limb()]. /mob/living/carbon/proc/remove_bodypart(obj/item/bodypart/old_bodypart) SHOULD_NOT_OVERRIDE(TRUE) + old_bodypart.on_removal() bodyparts -= old_bodypart + switch(old_bodypart.body_part) if(LEG_LEFT, LEG_RIGHT) set_num_legs(num_legs - 1) @@ -1034,6 +1052,14 @@ if(!old_bodypart.bodypart_disabled) set_usable_hands(usable_hands - 1) + synchronize_bodytypes() + +///Updates the bodypart speed modifier based on our bodyparts. +/mob/living/carbon/proc/update_bodypart_speed_modifier() + var/final_modification = 0 + for(var/obj/item/bodypart/bodypart as anything in bodyparts) + final_modification += bodypart.speed_modifier + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/bodypart, update = TRUE, multiplicative_slowdown = final_modification) /mob/living/carbon/proc/create_internal_organs() for(var/obj/item/organ/internal/internal_organ in organs) @@ -1162,7 +1188,7 @@ /mob/living/carbon/proc/hypnosis_vulnerable() if(HAS_TRAIT(src, TRAIT_MINDSHIELD)) return FALSE - if(has_status_effect(/datum/status_effect/hallucination)) + if(has_status_effect(/datum/status_effect/hallucination) || has_status_effect(/datum/status_effect/drugginess)) return TRUE if(IsSleeping() || IsUnconscious()) return TRUE @@ -1250,12 +1276,17 @@ else wound_type = forced_type else - wound_type = pick(GLOB.global_all_wound_types) + for (var/datum/wound/path as anything in shuffle(GLOB.all_wound_pregen_data)) + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[path] + if (pregen_data.can_be_applied_to(scar_part, random_roll = TRUE)) + wound_type = path + break - var/datum/wound/phantom_wound = new wound_type - scaries.generate(scar_part, phantom_wound) - scaries.fake = TRUE - QDEL_NULL(phantom_wound) + if (wound_type) // can feasibly happen, if its an inorganic limb/cant be wounded/scarred + var/datum/wound/phantom_wound = new wound_type + scaries.generate(scar_part, phantom_wound) + scaries.fake = TRUE + QDEL_NULL(phantom_wound) /mob/living/carbon/is_face_visible() return !(wear_mask?.flags_inv & HIDEFACE) && !(head?.flags_inv & HIDEFACE) @@ -1364,6 +1395,32 @@ log_combat(shover, target, "shoved", addition = "into [name]") return COMSIG_CARBON_SHOVE_HANDLED +/** + * This proc is used to determine whether or not the mob can handle touching an acid affected object. + */ +/mob/living/carbon/proc/can_touch_acid(atom/acided_atom, acid_power, acid_volume) + // So people can take their own clothes off + if((acided_atom == src) || (acided_atom.loc == src)) + return TRUE + if((acid_power * acid_volume) < ACID_LEVEL_HANDBURN) + return TRUE + if(gloves?.resistance_flags & (UNACIDABLE | ACID_PROOF)) + return TRUE + return FALSE + +/** + * This proc is used to determine whether or not the mob can handle touching a burning object. + */ +/mob/living/carbon/proc/can_touch_burning(atom/burning_atom, acid_power, acid_volume) + // So people can take their own clothes off + if((burning_atom == src) || (burning_atom.loc == src)) + return TRUE + if(HAS_TRAIT(src, TRAIT_RESISTHEAT) || HAS_TRAIT(src, TRAIT_RESISTHEATHANDS)) + return TRUE + if(gloves?.max_heat_protection_temperature >= BURNING_ITEM_MINIMUM_TEMPERATURE) + return TRUE + return FALSE + /** * This proc is a helper for spraying blood for things like slashing/piercing wounds and dismemberment. * diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 9a75d5ef17c19..7447638fa9265 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -55,6 +55,13 @@ return null +/mob/living/carbon/is_ears_covered() + for(var/obj/item/worn_thing as anything in get_equipped_items()) + if(worn_thing.flags_cover & EARS_COVERED) + return worn_thing + + return null + /mob/living/carbon/check_projectile_dismemberment(obj/projectile/P, def_zone) var/obj/item/bodypart/affecting = get_bodypart(def_zone) if(affecting && !(affecting.bodypart_flags & BODYPART_UNREMOVABLE) && affecting.get_damage() >= (affecting.max_damage - P.dismemberment)) @@ -100,7 +107,7 @@ if(I.force) var/attack_direction = get_dir(user, src) apply_damage(I.force, I.damtype, affecting, wound_bonus = I.wound_bonus, bare_wound_bonus = I.bare_wound_bonus, sharpness = I.get_sharpness(), attack_direction = attack_direction, attacking_item = I) - if(I.damtype == BRUTE && IS_ORGANIC_LIMB(affecting)) + if(I.damtype == BRUTE && affecting.can_bleed()) if(prob(33)) I.add_mob_blood(src) var/turf/location = get_turf(src) @@ -127,22 +134,35 @@ var/message_verb_simple = length(I.attack_verb_simple) ? "[pick(I.attack_verb_simple)]" : "attack" var/extra_wound_details = "" + if(I.damtype == BRUTE && hit_bodypart.can_dismember()) + var/mangled_state = hit_bodypart.get_mangled_state() - var/bio_state = hit_bodypart.biological_state - if((mangled_state & BODYPART_MANGLED_FLESH) && (mangled_state & BODYPART_MANGLED_BONE)) + + var/bio_status = hit_bodypart.get_bio_state_status() + + var/has_exterior = ((bio_status & ANATOMY_EXTERIOR)) + var/has_interior = ((bio_status & ANATOMY_INTERIOR)) + + var/exterior_ready_to_dismember = (!has_exterior || ((mangled_state & BODYPART_MANGLED_EXTERIOR))) + var/interior_ready_to_dismember = (!has_interior || ((mangled_state & BODYPART_MANGLED_INTERIOR))) + + var/dismemberable = ((hit_bodypart.dismemberable_by_wound()) || hit_bodypart.dismemberable_by_total_damage()) + if (dismemberable) extra_wound_details = ", threatening to sever it entirely" - else if((mangled_state & BODYPART_MANGLED_FLESH && I.get_sharpness()) || ((mangled_state & BODYPART_MANGLED_BONE) && (bio_state & BIO_BONE) && !(bio_state & BIO_FLESH))) - extra_wound_details = ", [I.get_sharpness() == SHARP_EDGED ? "slicing" : "piercing"] through to the bone" - else if((mangled_state & BODYPART_MANGLED_BONE && I.get_sharpness()) || ((mangled_state & BODYPART_MANGLED_FLESH) && (bio_state & BIO_FLESH) && !(bio_state & BIO_BONE))) - extra_wound_details = ", [I.get_sharpness() == SHARP_EDGED ? "slicing" : "piercing"] at the remaining tissue" + else if((has_interior && (has_exterior && exterior_ready_to_dismember) && I.get_sharpness())) + var/bone_text = hit_bodypart.get_internal_description() + extra_wound_details = ", [I.get_sharpness() == SHARP_EDGED ? "slicing" : "piercing"] through to the [bone_text]" + else if(has_exterior && ((has_interior && interior_ready_to_dismember) && I.get_sharpness())) + var/tissue_text = hit_bodypart.get_external_description() + extra_wound_details = ", [I.get_sharpness() == SHARP_EDGED ? "slicing" : "piercing"] at the remaining [tissue_text]" 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][extra_wound_details]!" var/attack_message_victim = "You're [message_verb_continuous][message_hit_area] with [I][extra_wound_details]!" - var/attack_message_attacker = "You [message_verb_simple] [src][message_hit_area] with [I]!" + var/attack_message_attacker = "You [message_verb_simple] [src][message_hit_area] with [I][extra_wound_details]!" if(user in viewers(src, null)) attack_message_spectator = "[user] [message_verb_continuous] [src][message_hit_area] with [I][extra_wound_details]!" attack_message_victim = "[user] [message_verb_continuous] you[message_hit_area] with [I][extra_wound_details]!" @@ -308,7 +328,7 @@ 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) + if(obj_content.flags_1 & ON_BORDER_1 && obj_content.dir == REVERSE_DIR(shove_dir) && obj_content.density) directional_blocked = TRUE break @@ -375,9 +395,11 @@ return for(var/obj/item/organ/organ as anything in organs) organ.emp_act(severity) + for(var/obj/item/bodypart/bodypart as anything in src.bodyparts) + bodypart.emp_act(severity) ///Adds to the parent by also adding functionality to propagate shocks through pulling and doing some fluff effects. -/mob/living/carbon/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE) +/mob/living/carbon/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE, jitter_time = 20 SECONDS, stutter_time = 4 SECONDS, stun_duration = 4 SECONDS) . = ..() if(!.) return @@ -398,22 +420,30 @@ //Found our victims, now lets shock them all for(var/victim in shocking_queue) var/mob/living/carbon/C = victim - C.electrocute_act(shock_damage*0.75, src, 1, flags) + C.electrocute_act(shock_damage*0.75, src, 1, flags, jitter_time, stutter_time, stun_duration) //Stun var/should_stun = (!(flags & SHOCK_TESLA) || siemens_coeff > 0.5) && !(flags & SHOCK_NOSTUN) - if(should_stun) - Paralyze(40) + var/paralyze = !(flags & SHOCK_KNOCKDOWN) + var/immediately_stun = should_stun && !(flags & SHOCK_DELAY_STUN) + if (immediately_stun) + if (paralyze) + Paralyze(stun_duration) + else + Knockdown(stun_duration) //Jitter and other fluff. do_jitter_animation(300) - adjust_jitter(20 SECONDS) - adjust_stutter(4 SECONDS) - addtimer(CALLBACK(src, PROC_REF(secondary_shock), should_stun), 2 SECONDS) + adjust_jitter(jitter_time) + adjust_stutter(stutter_time) + if (should_stun) + addtimer(CALLBACK(src, PROC_REF(secondary_shock), paralyze, stun_duration * 1.5), 2 SECONDS) return shock_damage ///Called slightly after electrocute act to apply a secondary stun. -/mob/living/carbon/proc/secondary_shock(should_stun) - if(should_stun) - Paralyze(60) +/mob/living/carbon/proc/secondary_shock(paralyze, stun_duration) + if (paralyze) + Paralyze(stun_duration) + else + Knockdown(stun_duration) /mob/living/carbon/proc/help_shake_act(mob/living/carbon/helper) if(on_fire) @@ -657,8 +687,11 @@ /mob/living/carbon/adjustOxyLoss(amount, updating_health = TRUE, forced, required_biotype, required_respiration_type) + if(!forced && HAS_TRAIT(src, TRAIT_NOBREATH)) + amount = min(amount, 0) //Prevents oxy damage but not healing + . = ..() - check_passout(.) + check_passout() /mob/living/carbon/proc/get_interaction_efficiency(zone) var/obj/item/bodypart/limb = get_bodypart(zone) @@ -667,12 +700,12 @@ /mob/living/carbon/setOxyLoss(amount, updating_health = TRUE, forced, required_biotype, required_respiration_type) . = ..() - check_passout(.) + check_passout() /** * Check to see if we should be passed out from oyxloss */ -/mob/living/carbon/proc/check_passout(oxyloss) +/mob/living/carbon/proc/check_passout() if(!isnum(oxyloss)) return if(oxyloss <= 50) @@ -693,14 +726,16 @@ return ..() var/obj/item/bodypart/grasped_part = get_bodypart(zone_selected) - if(!grasped_part?.get_modified_bleed_rate()) + if(!grasped_part?.can_be_grasped()) 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...")) + var/bleed_rate = grasped_part.get_modified_bleed_rate() + var/bleeding_text = (bleed_rate ? ", trying to stop the bleeding" : "") + to_chat(src, span_warning("You try grasping at your [grasped_part.name][bleeding_text]...")) if(!do_after(src, 0.75 SECONDS)) to_chat(src, span_danger("You fail to grasp your [grasped_part.name].")) return @@ -712,6 +747,17 @@ return grasp.grasp_limb(grasped_part) +/// If TRUE, the owner of this bodypart can try grabbing it to slow bleeding, as well as various other effects. +/obj/item/bodypart/proc/can_be_grasped() + if (get_modified_bleed_rate()) + return TRUE + + for (var/datum/wound/iterated_wound as anything in wounds) + if (iterated_wound.wound_flags & CAN_BE_GRASPED) + return TRUE + + return FALSE + /// 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" @@ -756,7 +802,9 @@ RegisterSignal(user, COMSIG_QDELETING, PROC_REF(qdel_void)) RegisterSignals(grasped_part, list(COMSIG_CARBON_REMOVE_LIMB, COMSIG_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) + var/bleed_rate = grasped_part.get_modified_bleed_rate() + var/bleeding_text = (bleed_rate ? ", trying to stop the bleeding" : "") + user.visible_message(span_danger("[user] grasps at [user.p_their()] [grasped_part.name][bleeding_text]."), 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 @@ -771,7 +819,7 @@ var/changed_something = FALSE var/obj/item/organ/new_organ = pick(GLOB.bioscrambler_valid_organs) var/obj/item/organ/replaced = get_organ_slot(initial(new_organ.slot)) - if (!(replaced?.organ_flags & ORGAN_SYNTHETIC)) + if (!replaced || !IS_ROBOTIC_ORGAN(replaced)) changed_something = TRUE new_organ = new new_organ() new_organ.replace_into(src) @@ -795,15 +843,15 @@ /// Fill in the lists of things we can bioscramble into people /mob/living/carbon/proc/init_bioscrambler_lists() var/list/body_parts = typesof(/obj/item/bodypart/chest) + typesof(/obj/item/bodypart/head) + subtypesof(/obj/item/bodypart/arm) + subtypesof(/obj/item/bodypart/leg) - for (var/obj/item/bodypart/part as anything in body_parts) - if (!is_type_in_typecache(part, GLOB.bioscrambler_parts_blacklist) && BODYTYPE_CAN_BE_BIOSCRAMBLED(initial(part.bodytype))) + for(var/obj/item/bodypart/part as anything in body_parts) + if(!is_type_in_typecache(part, GLOB.bioscrambler_parts_blacklist) && BODYTYPE_CAN_BE_BIOSCRAMBLED(initial(part.bodytype))) continue body_parts -= part GLOB.bioscrambler_valid_parts = body_parts var/list/organs = subtypesof(/obj/item/organ/internal) + subtypesof(/obj/item/organ/external) - for (var/obj/item/organ/organ_type as anything in organs) - if (!is_type_in_typecache(organ_type, GLOB.bioscrambler_organs_blacklist) && !(initial(organ_type.organ_flags) & ORGAN_SYNTHETIC)) + for(var/obj/item/organ/organ_type as anything in organs) + if(!is_type_in_typecache(organ_type, GLOB.bioscrambler_organs_blacklist) && !(initial(organ_type.organ_flags) & ORGAN_ROBOTIC)) continue organs -= organ_type GLOB.bioscrambler_valid_organs = organs diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 1c7185c24826d..b22b32583ab01 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -11,8 +11,8 @@ usable_hands = 0 //Populated on init through list/bodyparts mobility_flags = MOBILITY_FLAGS_CARBON_DEFAULT blocks_emissive = EMISSIVE_BLOCK_NONE - ///List of [/obj/item/organ/internal] in the mob. They don't go in the contents for some reason I don't want to know. - var/list/obj/item/organ/internal/organs = list() + ///List of [/obj/item/organ]s in the mob. They don't go in the contents for some reason I don't want to know. + var/list/obj/item/organ/organs = list() ///Same as [above][/mob/living/carbon/var/organs], but stores "slot ID" - "organ" pairs for easy access. var/list/organs_slot = list() ///How many dream images we have left to send @@ -61,7 +61,7 @@ var/gib_type = /obj/effect/decal/cleanable/blood/gibs - var/rotate_on_lying = 1 + rotate_on_lying = TRUE /// Gets filled up in [/datum/species/proc/replace_body]. /// Will either contain a list of typepaths if nothing has been created yet, @@ -104,6 +104,9 @@ /// All of the scars a carbon has afflicted throughout their limbs var/list/all_scars + /// Assoc list of BODY_ZONE -> wounding_type. Set when a limb is dismembered, unset when one is attached. Used for determining what scar to add when it comes time to generate them. + var/list/body_zone_dismembered_by + /// Simple modifier for whether this mob can handle greater or lesser skillchip complexity. See /datum/mutation/human/biotechcompat/ for example. var/skillchip_complexity_modifier = 0 @@ -116,4 +119,9 @@ /// Stores the result of our last known top_offset generation for optimisation purposes when drawing limb icons. var/last_top_offset + /// A bitfield of "bodytypes", updated by /obj/item/bodypart/proc/synchronize_bodytypes() + var/bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC + + var/is_leaning = FALSE + COOLDOWN_DECLARE(bleeding_message_cd) diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm index b54559333c75e..82bda7c7cd485 100644 --- a/code/modules/mob/living/carbon/carbon_movement.dm +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -13,7 +13,7 @@ set_nutrition(NUTRITION_LEVEL_FED - 1) //just less than feeling vigorous else if(nutrition && stat != DEAD) adjust_nutrition(-(HUNGER_FACTOR/10)) - if(m_intent == MOVE_INTENT_RUN) + if(move_intent == MOVE_INTENT_RUN) adjust_nutrition(-(HUNGER_FACTOR/10)) diff --git a/code/modules/mob/living/carbon/carbon_say.dm b/code/modules/mob/living/carbon/carbon_say.dm index d2245d6c668d3..3e4c29fa0e837 100644 --- a/code/modules/mob/living/carbon/carbon_say.dm +++ b/code/modules/mob/living/carbon/carbon_say.dm @@ -10,6 +10,6 @@ var/obj/item/organ/internal/tongue/spoken_with = get_organ_slot(ORGAN_SLOT_TONGUE) if(spoken_with) // the tower of babel needs to bypass the tongue language restrictions without giving omnitongue - return (mind && HAS_TRAIT(mind, TRAIT_TOWER_OF_BABEL)) || spoken_with.could_speak_language(language_path) + return HAS_MIND_TRAIT(src, TRAIT_TOWER_OF_BABEL) || spoken_with.could_speak_language(language_path) return initial(language_path.flags) & TONGUELESS_SPEECH diff --git a/code/modules/mob/living/carbon/carbon_update_icons.dm b/code/modules/mob/living/carbon/carbon_update_icons.dm index f3ba4e25cb1a6..cdd6900c22b6e 100644 --- a/code/modules/mob/living/carbon/carbon_update_icons.dm +++ b/code/modules/mob/living/carbon/carbon_update_icons.dm @@ -31,6 +31,8 @@ update_suit_storage() if(slot_flags & (ITEM_SLOT_LPOCKET|ITEM_SLOT_RPOCKET)) update_pockets() + if(slot_flags & ITEM_SLOT_HANDS) + update_held_items() /// Updates features and clothing attached to a specific limb with limb-specific offsets /mob/living/carbon/proc/update_features(feature_key) @@ -67,44 +69,20 @@ if(OFFSET_HELD) 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(resize = RESIZE_DEFAULT_SIZE) - var/matrix/ntransform = matrix(transform) //aka transform.Copy() - var/final_pixel_y = pixel_y - var/final_dir = dir - var/changed = 0 - - if(lying_angle != lying_prev && rotate_on_lying) - changed++ - ntransform.TurnTo(lying_prev , lying_angle) - if(lying_angle && lying_prev == 0 && dir & (EAST|WEST)) //Standing to lying and facing east or west - final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass - final_pixel_y = base_pixel_y + body_position_pixel_y_offset - - if(resize != RESIZE_DEFAULT_SIZE) - changed++ - ntransform.Scale(resize) - //Update final_pixel_y so our mob doesn't go out of the southern bounds of the tile when standing - if(!lying_angle || !rotate_on_lying) //But not if the mob is lying, its sprite rotated. - final_pixel_y += (current_size * resize - current_size) * world.icon_size/2 - current_size *= resize - - 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)) - /mob/living/carbon var/list/overlays_standing[TOTAL_LAYERS] /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 + SEND_SIGNAL(src, COMSIG_CARBON_REMOVE_OVERLAY, cache_index, I) //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() @@ -294,8 +272,8 @@ #undef NEXT_PARENT_COMMAND /mob/living/carbon/regenerate_icons() - if(notransform) - return 1 + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) + return icon_render_keys = list() //Clear this bad larry out update_held_items() update_worn_handcuffs() @@ -447,7 +425,7 @@ remove_overlay(HANDCUFF_LAYER) if(handcuffed) var/mutable_appearance/handcuff_overlay = mutable_appearance('icons/mob/simple/mob.dmi', "handcuff1", -HANDCUFF_LAYER) - if(handcuffed.blocks_emissive) + if(handcuffed.blocks_emissive != EMISSIVE_BLOCK_NONE) handcuff_overlay.overlays += emissive_blocker(handcuff_overlay.icon, handcuff_overlay.icon_state, src, alpha = handcuff_overlay.alpha) overlays_standing[HANDCUFF_LAYER] = handcuff_overlay @@ -488,7 +466,7 @@ RETURN_TYPE(/list) . = list() - if(blocks_emissive) + if(blocks_emissive != EMISSIVE_BLOCK_NONE) . += emissive_blocker(standing.icon, standing.icon_state, src, alpha = standing.alpha) SEND_SIGNAL(src, COMSIG_ITEM_GET_WORN_OVERLAYS, ., standing, isinhands, icon_file) @@ -599,26 +577,35 @@ /obj/item/bodypart/head/generate_icon_key() . = ..() - . += "-[facial_hairstyle]" - . += "-[facial_hair_color]" - if(facial_hair_gradient_style) - . += "-[facial_hair_gradient_style]" - if(hair_gradient_color) - . += "-[facial_hair_gradient_color]" + if(lip_style) + . += "-[lip_style]" + . += "-[lip_color]" + if(facial_hair_hidden) . += "-FACIAL_HAIR_HIDDEN" + else + . += "-[facial_hairstyle]" + . += "-[override_hair_color || fixed_hair_color || facial_hair_color]" + . += "-[facial_hair_alpha]" + if(gradient_styles?[GRADIENT_FACIAL_HAIR_KEY]) + . += "-[gradient_styles[GRADIENT_FACIAL_HAIR_KEY]]" + . += "-[gradient_colors[GRADIENT_FACIAL_HAIR_KEY]]" + + if(show_eyeless) + . += "-SHOW_EYELESS" if(show_debrained) . += "-SHOW_DEBRAINED" return . - . += "-[hair_style]" - . += "-[fixed_hair_color || override_hair_color || hair_color]" - if(hair_gradient_style) - . += "-[hair_gradient_style]" - if(hair_gradient_color) - . += "-[hair_gradient_color]" if(hair_hidden) . += "-HAIR_HIDDEN" + else + . += "-[hairstyle]" + . += "-[override_hair_color || fixed_hair_color || hair_color]" + . += "-[hair_alpha]" + if(gradient_styles?[GRADIENT_HAIR_KEY]) + . += "-[gradient_styles[GRADIENT_HAIR_KEY]]" + . += "-[gradient_colors[GRADIENT_HAIR_KEY]]" return . diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index a0f69296229f1..d297296a4ec74 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE, attack_direction = null, attacking_item) +/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = 0, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE, attack_direction = null, attacking_item) SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMAGE, damage, damagetype, def_zone) var/hit_percent = (100-blocked)/100 if(!damage || (!forced && hit_percent <= 0)) @@ -57,39 +57,49 @@ /mob/living/carbon/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) if(!forced && (status_flags & GODMODE)) - return FALSE + return 0 + if(on_damage_adjustment(BRUTE, amount, forced) & COMPONENT_IGNORE_CHANGE) + return 0 if(amount > 0) - take_overall_damage(brute = amount, updating_health = updating_health, required_bodytype = required_bodytype) + . = take_overall_damage(brute = amount, updating_health = updating_health, forced = forced, required_bodytype = required_bodytype) else - heal_overall_damage(brute = abs(amount), required_bodytype = required_bodytype, updating_health = updating_health) - return amount + . = heal_overall_damage(brute = abs(amount), required_bodytype = required_bodytype, updating_health = updating_health, forced = forced) /mob/living/carbon/setBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) + if(!forced && (status_flags & GODMODE)) + return FALSE var/current = getBruteLoss() var/diff = amount - current if(!diff) - return - adjustBruteLoss(diff, updating_health, forced, required_bodytype) + return FALSE + return adjustBruteLoss(diff, updating_health, forced, required_bodytype) /mob/living/carbon/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) if(!forced && (status_flags & GODMODE)) - return FALSE + return 0 + if(on_damage_adjustment(BURN, amount, forced) & COMPONENT_IGNORE_CHANGE) + return 0 if(amount > 0) - take_overall_damage(burn = amount, updating_health = updating_health, required_bodytype = required_bodytype) + . = take_overall_damage(burn = amount, updating_health = updating_health, forced = forced, required_bodytype = required_bodytype) else - heal_overall_damage(burn = abs(amount), required_bodytype = required_bodytype, updating_health = updating_health) - return amount + . = heal_overall_damage(burn = abs(amount), required_bodytype = required_bodytype, updating_health = updating_health, forced = forced) /mob/living/carbon/setFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) + if(!forced && (status_flags & GODMODE)) + return FALSE var/current = getFireLoss() var/diff = amount - current if(!diff) - return - adjustFireLoss(diff, updating_health, forced, required_bodytype) + return FALSE + return adjustFireLoss(diff, updating_health, forced, required_bodytype) -/mob/living/carbon/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = MOB_ORGANIC) +/mob/living/carbon/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL) + if(!forced && (status_flags & GODMODE)) + return 0 if(!forced && !(mob_biotypes & required_biotype)) - return + return 0 + if(on_damage_adjustment(TOX, amount, forced) & COMPONENT_IGNORE_CHANGE) + return 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 @@ -98,11 +108,11 @@ blood_volume = max(blood_volume - (5*amount), 0) else blood_volume = max(blood_volume - amount, 0) - else if(HAS_TRAIT(src, TRAIT_TOXIMMUNE)) //Prevents toxin damage, but not healing + else if(!forced && HAS_TRAIT(src, TRAIT_TOXIMMUNE)) //Prevents toxin damage, but not healing amount = min(amount, 0) return ..() -/mob/living/carbon/adjustStaminaLoss(amount, updating_stamina, forced, required_biotype) +/mob/living/carbon/adjustStaminaLoss(amount, updating_stamina, forced, required_biotype = ALL) . = ..() if(amount > 0) stam_regen_start_time = world.time + STAMINA_REGEN_BLOCK_TIME @@ -114,15 +124,17 @@ * * slot - organ slot, like [ORGAN_SLOT_HEART] * * amount - damage to be done * * maximum - currently an arbitrarily large number, can be set so as to limit damage - * * required_organtype - targets only a specific organ type if set to ORGAN_ORGANIC or ORGAN_ROBOTIC + * * required_organ_flag - targets only a specific organ type if set to ORGAN_ORGANIC or ORGAN_ROBOTIC + * + * Returns: The net change in damage from apply_organ_damage() */ -/mob/living/carbon/adjustOrganLoss(slot, amount, maximum, required_organtype) +/mob/living/carbon/adjustOrganLoss(slot, amount, maximum, required_organ_flag = NONE) var/obj/item/organ/affected_organ = get_organ_slot(slot) if(!affected_organ || (status_flags & GODMODE)) - return - if(required_organtype && (affected_organ.status != required_organtype)) - return - affected_organ.apply_organ_damage(amount, maximum) + return FALSE + if(required_organ_flag && !(affected_organ.organ_flags & required_organ_flag)) + return FALSE + return affected_organ.apply_organ_damage(amount, maximum) /** * 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 @@ -131,17 +143,19 @@ * Arguments: * * slot - organ slot, like [ORGAN_SLOT_HEART] * * amount - damage to be set to - * * required_organtype - targets only a specific organ type if set to ORGAN_ORGANIC or ORGAN_ROBOTIC + * * required_organ_flag - targets only a specific organ type if set to ORGAN_ORGANIC or ORGAN_ROBOTIC + * + * Returns: The net change in damage from set_organ_damage() */ -/mob/living/carbon/setOrganLoss(slot, amount, required_organtype) +/mob/living/carbon/setOrganLoss(slot, amount, required_organ_flag = NONE) var/obj/item/organ/affected_organ = get_organ_slot(slot) if(!affected_organ || (status_flags & GODMODE)) - return - if(required_organtype && (affected_organ.status != required_organtype)) - return + return FALSE + if(required_organ_flag && !(affected_organ.organ_flags & required_organ_flag)) + return FALSE if(affected_organ.damage == amount) - return - affected_organ.set_organ_damage(amount) + return FALSE + return affected_organ.set_organ_damage(amount) /** * If an organ exists in the slot requested, return the amount of damage that organ has @@ -157,12 +171,14 @@ //////////////////////////////////////////// ///Returns a list of damaged bodyparts -/mob/living/carbon/proc/get_damaged_bodyparts(brute = FALSE, burn = FALSE, required_bodytype) +/mob/living/carbon/proc/get_damaged_bodyparts(brute = FALSE, burn = FALSE, required_bodytype = NONE, target_zone = null) var/list/obj/item/bodypart/parts = list() for(var/X in bodyparts) var/obj/item/bodypart/BP = X if(required_bodytype && !(BP.bodytype & required_bodytype)) continue + if(!isnull(target_zone) && BP.body_zone != target_zone) + continue if((brute && BP.brute_dam) || (burn && BP.burn_dam)) parts += BP return parts @@ -197,15 +213,17 @@ * * It automatically updates health status */ -/mob/living/carbon/heal_bodypart_damage(brute = 0, burn = 0, updating_health = TRUE, required_bodytype) - var/list/obj/item/bodypart/parts = get_damaged_bodyparts(brute, burn, required_bodytype) +/mob/living/carbon/heal_bodypart_damage(brute = 0, burn = 0, updating_health = TRUE, required_bodytype = NONE, target_zone = null) + . = FALSE + var/list/obj/item/bodypart/parts = get_damaged_bodyparts(brute, burn, required_bodytype, target_zone) if(!parts.len) return + var/obj/item/bodypart/picked = pick(parts) - var/damage_calculator = picked.get_damage(TRUE) //heal_damage returns update status T/F instead of amount healed so we dance gracefully around this - if(picked.heal_damage(brute, burn, required_bodytype)) + var/damage_calculator = picked.get_damage() //heal_damage returns update status T/F instead of amount healed so we dance gracefully around this + if(picked.heal_damage(abs(brute), abs(burn), required_bodytype = required_bodytype)) update_damage_overlays() - return max(damage_calculator - picked.get_damage(TRUE), 0) + return (damage_calculator - picked.get_damage()) /** @@ -216,15 +234,25 @@ * It automatically updates health status */ /mob/living/carbon/take_bodypart_damage(brute = 0, burn = 0, updating_health = TRUE, required_bodytype, check_armor = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE) + . = FALSE + if(status_flags & GODMODE) + return var/list/obj/item/bodypart/parts = get_damageable_bodyparts(required_bodytype) if(!parts.len) return + var/obj/item/bodypart/picked = pick(parts) - if(picked.receive_damage(brute, burn, check_armor ? run_armor_check(picked, (brute ? MELEE : burn ? FIRE : null)) : FALSE, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness)) + var/damage_calculator = picked.get_damage() + if(picked.receive_damage(abs(brute), abs(burn), check_armor ? run_armor_check(picked, (brute ? MELEE : burn ? FIRE : null)) : FALSE, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness)) update_damage_overlays() + return (damage_calculator - picked.get_damage()) + +/mob/living/carbon/heal_overall_damage(brute = 0, burn = 0, stamina = 0, required_bodytype, updating_health = TRUE, forced = FALSE) + . = FALSE + // treat negative args as positive + brute = abs(brute) + burn = abs(burn) -///Heal MANY bodyparts, in random order -/mob/living/carbon/heal_overall_damage(brute = 0, burn = 0, stamina = 0, required_bodytype, updating_health = TRUE) var/list/obj/item/bodypart/parts = get_damaged_bodyparts(brute, burn, required_bodytype) var/update = NONE @@ -233,25 +261,35 @@ var/brute_was = picked.brute_dam var/burn_was = picked.burn_dam + . += picked.get_damage() + + update |= picked.heal_damage(brute, burn, updating_health = FALSE, forced = forced, required_bodytype = required_bodytype) - update |= picked.heal_damage(brute, burn, required_bodytype, FALSE) + . -= picked.get_damage() // return the net amount of damage healed brute = round(brute - (brute_was - picked.brute_dam), DAMAGE_PRECISION) burn = round(burn - (burn_was - picked.burn_dam), DAMAGE_PRECISION) parts -= picked + + if(!.) // no change? no need to update anything + return + if(updating_health) updatehealth() if(update) update_damage_overlays() -/// damage MANY bodyparts, in random order -/mob/living/carbon/take_overall_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_bodytype) - if(status_flags & GODMODE) - return //godmode +/mob/living/carbon/take_overall_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, forced = FALSE, required_bodytype) + . = FALSE + if(!forced && (status_flags & GODMODE)) + return + // treat negative args as positive + brute = abs(brute) + burn = abs(burn) var/list/obj/item/bodypart/parts = get_damageable_bodyparts(required_bodytype) - var/update = 0 + var/update = NONE while(parts.len && (brute > 0 || burn > 0)) var/obj/item/bodypart/picked = pick(parts) var/brute_per_part = round(brute/parts.len, DAMAGE_PRECISION) @@ -259,14 +297,21 @@ var/brute_was = picked.brute_dam var/burn_was = picked.burn_dam + . += picked.get_damage() + // disabling wounds from these for now cuz your entire body snapping cause your heart stopped would suck + update |= picked.receive_damage(brute_per_part, burn_per_part, blocked = FALSE, updating_health = FALSE, forced = forced, required_bodytype = required_bodytype, wound_bonus = CANT_WOUND) - update |= picked.receive_damage(brute_per_part, burn_per_part, FALSE, updating_health, required_bodytype, wound_bonus = CANT_WOUND) // disabling wounds from these for now cuz your entire body snapping cause your heart stopped would suck + . -= picked.get_damage() // return the net amount of damage healed brute = round(brute - (picked.brute_dam - brute_was), DAMAGE_PRECISION) burn = round(burn - (picked.burn_dam - burn_was), DAMAGE_PRECISION) parts -= picked + + if(!.) // no change? no need to update anything + return + if(updating_health) updatehealth() if(update) diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm index c3282967e64c4..bbf82ccefc56a 100644 --- a/code/modules/mob/living/carbon/death.dm +++ b/code/modules/mob/living/carbon/death.dm @@ -24,9 +24,9 @@ M.Scale(1.8, 1.2) animate(src, time = 40, transform = M, easing = SINE_EASING) -/mob/living/carbon/gib(no_brain, no_organs, no_bodyparts, safe_gib = FALSE) +/mob/living/carbon/gib(drop_bitflags=NONE) add_memory_in_range(src, 7, /datum/memory/witness_gib, protagonist = src) - if(safe_gib) // If you want to keep all the mob's items and not have them deleted + if(drop_bitflags & DROP_ITEMS) for(var/obj/item/W in src) dropItemToGround(W) if(prob(50)) @@ -37,39 +37,33 @@ visible_message(span_danger("[M] bursts out of [src]!")) return ..() -/mob/living/carbon/spill_organs(no_brain, no_organs, no_bodyparts) +/mob/living/carbon/spill_organs(drop_bitflags=NONE) var/atom/Tsec = drop_location() - if(!no_bodyparts) - if(no_organs)//so the organs don't get transfered inside the bodyparts we'll drop. - for(var/organ in organs) - if(no_brain || !istype(organ, /obj/item/organ/internal/brain)) - qdel(organ) - else //we're going to drop all bodyparts except chest, so the only organs that needs spilling are those inside it. - for(var/obj/item/organ/organ as anything in organs) - if(no_brain && istype(organ, /obj/item/organ/internal/brain)) - qdel(organ) //so the brain isn't transfered to the head when the head drops. - continue - var/org_zone = check_zone(organ.zone) //both groin and chest organs. - if(org_zone == BODY_ZONE_CHEST) - organ.Remove(src) - organ.forceMove(Tsec) - organ.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5) - else - for(var/obj/item/organ/organ as anything in organs) - if(no_brain && istype(organ, /obj/item/organ/internal/brain)) - qdel(organ) - continue - if(no_organs && !istype(organ, /obj/item/organ/internal/brain)) - qdel(organ) - continue + + for(var/obj/item/organ/organ as anything in organs) + if((drop_bitflags & DROP_BRAIN) && istype(organ, /obj/item/organ/internal/brain)) + if(drop_bitflags & DROP_BODYPARTS) + continue // the head will drop, so the brain should stay inside + organ.Remove(src) organ.forceMove(Tsec) - organ.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5) + organ.throw_at(get_edge_target_turf(src, pick(GLOB.alldirs)), rand(1,3), 5) + continue + + if((drop_bitflags & DROP_ORGANS) && !istype(organ, /obj/item/organ/internal/brain)) + if((drop_bitflags & DROP_BODYPARTS) && (check_zone(organ.zone) != BODY_ZONE_CHEST)) + continue // only chest & groin organs will be ejected + + organ.Remove(src) + organ.forceMove(Tsec) + organ.throw_at(get_edge_target_turf(src, pick(GLOB.alldirs)), rand(1,3), 5) + continue + + qdel(organ) -/// Launches all bodyparts away from the mob. skip_head will keep the head attached. -/mob/living/carbon/spread_bodyparts(skip_head = FALSE) +/mob/living/carbon/spread_bodyparts(drop_bitflags=NONE) for(var/obj/item/bodypart/part as anything in bodyparts) - if(skip_head && part.body_zone == BODY_ZONE_HEAD) + if(!(drop_bitflags & DROP_BRAIN) && part.body_zone == BODY_ZONE_HEAD) continue else if(part.body_zone == BODY_ZONE_CHEST) continue diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index 5e1ebeaf8d037..e2783fa23acc6 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -1,6 +1,6 @@ /mob/living/carbon/examine(mob/user) - var/t_He = p_they(TRUE) - var/t_His = p_their(TRUE) + var/t_He = p_They() + var/t_His = p_Their() var/t_his = p_their() var/t_him = p_them() var/t_has = p_have() @@ -161,8 +161,8 @@ for(var/obj/item/bodypart/part as anything in bodyparts) if(part.body_zone in covered_zones) continue - if(part.limb_id != (dna.species.examine_limb_id ? dna.species.examine_limb_id : dna.species.id)) - . += "[span_info("[p_they(TRUE)] [p_have()] \an [part.name].")]" + if(part.limb_id != dna.species.examine_limb_id) + . += "[span_info("[p_They()] [p_have()] \an [part.name].")]" var/list/visible_scars for(var/i in all_scars) diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm new file mode 100644 index 0000000000000..4239d01cb3c06 --- /dev/null +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -0,0 +1,2356 @@ +GLOBAL_LIST_EMPTY(roundstart_races) +///List of all roundstart languages by path except common +GLOBAL_LIST_EMPTY(uncommon_roundstart_languages) + +/// An assoc list of species types to their features (from get_features()) +GLOBAL_LIST_EMPTY(features_by_species) + +/** + * # species datum + * + * Datum that handles different species in the game. + * + * This datum handles species in the game, such as lizardpeople, mothmen, zombies, skeletons, etc. + * It is used in [carbon humans][mob/living/carbon/human] to determine various things about them, like their food preferences, if they have biological genders, their damage resistances, and more. + * + */ +/datum/species + ///If the game needs to manually check your race to do something not included in a proc here, it will use this. + var/id + ///This is used for children, it will determine their default limb ID for use of examine. See [/mob/living/carbon/human/proc/examine]. + var/examine_limb_id + ///This is the fluff name. They are displayed on health analyzers and in the character setup menu. Leave them generic for other servers to customize. + var/name + /** + * The formatting of the name of the species in plural context. Defaults to "[name]\s" if unset. + * Ex "[Plasmamen] are weak", "[Mothmen] are strong", "[Lizardpeople] don't like", "[Golems] hate" + */ + var/plural_form + + ///Whether or not the race has sexual characteristics (biological genders). At the moment this is only FALSE for skeletons and shadows + var/sexes = TRUE + + ///The maximum number of bodyparts this species can have. + var/max_bodypart_count = 6 + ///This allows races to have specific hair colors. If null, it uses the H's hair/facial hair colors. If "mutcolor", it uses the H's mutant_color. If "fixedmutcolor", it uses fixedmutcolor + var/hair_color + ///The alpha used by the hair. 255 is completely solid, 0 is invisible. + var/hair_alpha = 255 + ///The alpha used by the facial hair. 255 is completely solid, 0 is invisible. + var/facial_hair_alpha = 255 + + ///Never, Optional, or Forced digi legs? + var/digitigrade_customization = DIGITIGRADE_NEVER + ///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 = "" + ///The rate at which blood is passively drained by having the blood deficiency quirk. Some races such as slimepeople can regen their blood at different rates so this is to account for that + var/blood_deficiency_drain_rate = BLOOD_REGEN_FACTOR + BLOOD_DEFICIENCY_MODIFIER // slightly above the regen rate so it slowly drains instead of regenerates. + ///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. + var/skinned_type + ///flags for inventory slots the race can't equip stuff to. Golems cannot wear jumpsuits, for example. + var/no_equip_flags + /// What languages this species can understand and say. + /// Use a [language holder datum][/datum/language_holder] typepath in this var. + /// Should never be null. + var/datum/language_holder/species_language_holder = /datum/language_holder/human_basic + /** + * 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. + */ + var/list/mutant_bodyparts = list() + ///The bodyparts this species uses. assoc of bodypart string - bodypart type. Make sure all the fucking entries are in or I'll skin you alive. + var/list/bodypart_overrides = list( + BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left, + BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right, + BODY_ZONE_HEAD = /obj/item/bodypart/head, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right, + BODY_ZONE_CHEST = /obj/item/bodypart/chest, + ) + ///Internal organs that are unique to this race, like a tail. list(typepath of organ 1, typepath of organ 2) + var/list/mutant_organs = list() + ///List of external organs to generate like horns, frills, wings, etc. list(typepath of organ = "Round Beautiful BDSM Snout"). Still WIP + var/list/external_organs = list() + ///Replaces default brain with a different organ + var/obj/item/organ/internal/brain/mutantbrain = /obj/item/organ/internal/brain + ///Replaces default heart with a different organ + var/obj/item/organ/internal/heart/mutantheart = /obj/item/organ/internal/heart + ///Replaces default lungs with a different organ + var/obj/item/organ/internal/lungs/mutantlungs = /obj/item/organ/internal/lungs + ///Replaces default eyes with a different organ + var/obj/item/organ/internal/eyes/mutanteyes = /obj/item/organ/internal/eyes + ///Replaces default ears with a different organ + var/obj/item/organ/internal/ears/mutantears = /obj/item/organ/internal/ears + ///Replaces default tongue with a different organ + var/obj/item/organ/internal/tongue/mutanttongue = /obj/item/organ/internal/tongue + ///Replaces default liver with a different organ + var/obj/item/organ/internal/liver/mutantliver = /obj/item/organ/internal/liver + ///Replaces default stomach with a different organ + var/obj/item/organ/internal/stomach/mutantstomach = /obj/item/organ/internal/stomach + ///Replaces default appendix with a different organ. + var/obj/item/organ/internal/appendix/mutantappendix = /obj/item/organ/internal/appendix + + /** + * Percentage modifier for overall defense of the race, or less defense, if it's negative + * THIS MODIFIES ALL DAMAGE TYPES. + **/ + var/damage_modifier = 0 + ///multiplier for damage from cold temperature + var/coldmod = 1 + ///multiplier for damage from hot temperature + var/heatmod = 1 + ///multiplier for stun durations + var/stunmod = 1 + ///multiplier for money paid at payday + var/payday_modifier = 1.0 + ///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 = "" + ///A fixed hair color that's independent of the mcolor feature in DNA. + var/fixed_hair_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 death_sound upon species change + var/death_sound + ///Sounds to override barefeet walking + var/list/special_step_sounds + ///Special sound for grabbing + var/grab_sound + /// A path to an outfit that is important for species life e.g. plasmaman outfit + var/datum/outfit/outfit_important_for_life + + //Dictates which wing icons are allowed for a given species. If count is >1 a radial menu is used to choose between all icons in list + var/list/wing_types = list(/obj/item/organ/external/wings/functional/angel) + /// 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" + + /// Generic traits tied to having the species. + var/list/inherent_traits = list() + /// List of biotypes the mob belongs to. Used by diseases. + var/inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID + /// The type of respiration the mob is capable of doing. Used by adjustOxyLoss. + var/inherent_respiration_type = RESPIRATION_OXYGEN + ///List of factions the mob gain upon gaining this species. + var/list/inherent_factions + + ///What gas does this species breathe? Used by suffocation screen alerts, most of actual gas breathing is handled by mutantlungs. See [life.dm][code/modules/mob/living/carbon/human/life.dm] + var/breathid = GAS_O2 + + ///What anim to use for dusting + var/dust_anim = "dust-h" + ///What anim to use for gibbing + var/gib_anim = "gibbed-h" + + ///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 + + ///Unique cookie given by admins through prayers + var/species_cookie = /obj/item/food/cookie + + ///For custom overrides for species ass images + var/icon/ass_image + + /// List of family heirlooms this species can get with the family heirloom quirk. List of types. + var/list/family_heirlooms + + ///List of results you get from knife-butchering. null means you cant butcher it. Associated by resulting type - value of amount + var/list/knife_butcher_results + + /// Should we preload this species's organs? + var/preload = TRUE + + /// Do we try to prevent reset_perspective() from working? Useful for Dullahans to stop perspective changes when they're looking through their head. + var/prevent_perspective_change = FALSE + + ///Was the species changed from its original type at the start of the round? + var/roundstart_changed = FALSE + + /// This supresses the "dosen't appear to be himself" examine text for if the mob is run by an AI controller. Should be used on any NPC human subtypes. Monkeys are the prime example. + var/ai_controlled_species = FALSE + + /** + * Was on_species_gain ever actually called? + * Species code is really odd... + **/ + var/properly_gained = FALSE + + ///A list containing outfits that will be overridden in the species_equip_outfit proc. [Key = Typepath passed in] [Value = Typepath of outfit you want to equip for this specific species instead]. + var/list/outfit_override_registry = list() + +/////////// +// PROCS // +/////////// + + +/datum/species/New() + wing_types = string_list(wing_types) + + if(!plural_form) + plural_form = "[name]\s" + if(!examine_limb_id) + examine_limb_id = id + + return ..() + +/// Gets a list of all species available to choose in roundstart. +/proc/get_selectable_species() + RETURN_TYPE(/list) + + if (!GLOB.roundstart_races.len) + GLOB.roundstart_races = generate_selectable_species_and_languages() + + return GLOB.roundstart_races +/** + * Generates species available to choose in character setup at roundstart + * + * This proc generates which species are available to pick from in character setup. + * If there are no available roundstart species, defaults to human. + */ +/proc/generate_selectable_species_and_languages() + var/list/selectable_species = list() + + for(var/species_type in subtypesof(/datum/species)) + var/datum/species/species = new species_type + if(species.check_roundstart_eligible()) + selectable_species += species.id + var/datum/language_holder/temp_holder = new species.species_language_holder + for(var/datum/language/spoken_language as anything in temp_holder.understood_languages) + GLOB.uncommon_roundstart_languages |= spoken_language + qdel(temp_holder) + qdel(species) + + GLOB.uncommon_roundstart_languages -= /datum/language/common + if(!selectable_species.len) + selectable_species += SPECIES_HUMAN + + return selectable_species + +/** + * Checks if a species is eligible to be picked at roundstart. + * + * Checks the config to see if this species is allowed to be picked in the character setup menu. + * Used by [/proc/generate_selectable_species_and_languages]. + */ +/datum/species/proc/check_roundstart_eligible() + if(id in (CONFIG_GET(keyed_list/roundstart_races))) + return TRUE + return FALSE + +/** + * Generates a random name for a carbon. + * + * This generates a random unique name based on a human's species and gender. + * Arguments: + * * gender - The gender that the name should adhere to. Use MALE for male names, use anything else for female names. + * * unique - If true, ensures that this new name is not a duplicate of anyone else's name currently on the station. + * * lastname - Does this species' naming system adhere to the last name system? Set to false if it doesn't. + */ +/datum/species/proc/random_name(gender,unique,lastname) + if(unique) + return random_unique_name(gender) + + var/randname + if(gender == MALE) + randname = pick(GLOB.first_names_male) + else + randname = pick(GLOB.first_names_female) + + if(lastname) + randname += " [lastname]" + else + randname += " [pick(GLOB.last_names)]" + + return randname + +/** + * Copies some vars and properties over that should be kept when creating a copy of this species. + * + * Used by slimepeople to copy themselves, and by the DNA datum to hardset DNA to a species + * Arguments: + * * old_species - The species that the carbon used to be before copying + */ +/datum/species/proc/copy_properties_from(datum/species/old_species) + return + +/** + * Gets the default mutant organ for the species based on the provided slot. + */ +/datum/species/proc/get_mutant_organ_type_for_slot(slot) + switch(slot) + if(ORGAN_SLOT_BRAIN) + return mutantbrain + if(ORGAN_SLOT_HEART) + return mutantheart + if(ORGAN_SLOT_LUNGS) + return mutantlungs + if(ORGAN_SLOT_APPENDIX) + return mutantappendix + if(ORGAN_SLOT_EYES) + return mutanteyes + if(ORGAN_SLOT_EARS) + return mutantears + if(ORGAN_SLOT_TONGUE) + return mutanttongue + if(ORGAN_SLOT_LIVER) + return mutantliver + if(ORGAN_SLOT_STOMACH) + return mutantstomach + else + CRASH("Invalid organ slot [slot]") + +/** + * Corrects organs in a carbon, removing ones it doesn't need and adding ones it does. + * + * Takes all organ slots, removes organs a species should not have, adds organs a species should have. + * can use replace_current to refresh all organs, creating an entirely new set. + * + * Arguments: + * * organ_holder - carbon, the owner of the species datum AKA whoever we're regenerating organs in + * * old_species - datum, used when regenerate organs is called in a switching species to remove old mutant organs. + * * replace_current - boolean, forces all old organs to get deleted whether or not they pass the species' ability to keep that organ + * * excluded_zones - list, add zone defines to block organs inside of the zones from getting handled. see headless mutation for an example + * * 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/organ_holder, 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/organ_slots = 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 organ_slots) + var/obj/item/organ/existing_organ = organ_holder.get_organ_slot(slot) + var/obj/item/organ/new_organ = get_mutant_organ_type_for_slot(slot) + + if(isnull(new_organ)) // if they aren't suppose to have an organ here, remove it + if(existing_organ) + existing_organ.Remove(organ_holder, special = TRUE) + qdel(existing_organ) + continue + + if(!isnull(old_species) && !isnull(existing_organ)) + if(existing_organ.type != old_species.get_mutant_organ_type_for_slot(slot)) + continue // we don't want to remove organs that are not the default for this species + + // at this point we already know new_organ is not null + if(existing_organ?.type == new_organ) + continue // we don't want to remove organs that are the same as the new one + + if(visual_only && !initial(new_organ.visual)) + continue + + var/used_neworgan = FALSE + new_organ = SSwardrobe.provide_type(new_organ) + var/should_have = new_organ.get_availability(src, organ_holder) + + // Check for an existing organ, and if there is one check to see if we should remove it + var/health_pct = 1 + var/remove_existing = !isnull(existing_organ) && !(existing_organ.zone in excluded_zones) && !(existing_organ.organ_flags & ORGAN_UNREMOVABLE) + if(remove_existing) + health_pct = (existing_organ.maxHealth - existing_organ.damage) / existing_organ.maxHealth + if(slot == ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/existing_brain = existing_organ + if(!existing_brain.decoy_override) + existing_brain.before_organ_replacement(new_organ) + existing_brain.Remove(organ_holder, special = TRUE, no_id_transfer = TRUE) + QDEL_NULL(existing_organ) + else + existing_organ.before_organ_replacement(new_organ) + existing_organ.Remove(organ_holder, special = TRUE) + QDEL_NULL(existing_organ) + + if(isnull(existing_organ) && should_have && !(new_organ.zone in excluded_zones)) + used_neworgan = TRUE + new_organ.set_organ_damage(new_organ.maxHealth * (1 - health_pct)) + new_organ.Insert(organ_holder, special = TRUE, drop_if_replaced = FALSE) + + if(!used_neworgan) + QDEL_NULL(new_organ) + + if(!isnull(old_species)) + for(var/mutant_organ in old_species.mutant_organs) + if(mutant_organ in mutant_organs) + continue // need this mutant organ, but we already have it! + + var/obj/item/organ/current_organ = organ_holder.get_organ_by_type(mutant_organ) + if(current_organ) + current_organ.Remove(organ_holder) + QDEL_NULL(current_organ) + + for(var/obj/item/organ/external/external_organ in organ_holder.organs) + // External organ checking. We need to check the external organs owned by the carbon itself, + // because we want to also remove ones not shared by its species. + // This should be done even if species was not changed. + if(external_organ in external_organs) + continue // Don't remove external organs this species is supposed to have. + + external_organ.Remove(organ_holder) + QDEL_NULL(external_organ) + + var/list/species_organs = mutant_organs + external_organs + for(var/organ_path in species_organs) + var/obj/item/organ/current_organ = organ_holder.get_organ_by_type(organ_path) + if(ispath(organ_path, /obj/item/organ/external) && !should_external_organ_apply_to(organ_path, organ_holder)) + if(!isnull(current_organ) && replace_current) + // if we have an organ here and we're replacing organs, remove it + current_organ.Remove(organ_holder) + QDEL_NULL(current_organ) + continue + + if(!current_organ || replace_current) + var/obj/item/organ/replacement = SSwardrobe.provide_type(organ_path) + // If there's an existing mutant organ, we're technically replacing it. + // Let's abuse the snowflake proc that skillchips added. Basically retains + // feature parity with every other organ too. + if(current_organ) + current_organ.before_organ_replacement(replacement) + // organ.Insert will qdel any current organs in that slot, so we don't need to. + replacement.Insert(organ_holder, special=TRUE, drop_if_replaced=FALSE) + +/datum/species/proc/worn_items_fit_body_check(mob/living/carbon/wearer) + for(var/obj/item/equipped_item in wearer.get_all_worn_items()) + var/equipped_item_slot = wearer.get_slot_by_item(equipped_item) + if(!equipped_item.mob_can_equip(wearer, equipped_item_slot, bypass_equip_delay_self = TRUE, ignore_equipped = TRUE)) + wearer.dropItemToGround(equipped_item, force = TRUE) + +/datum/species/proc/update_no_equip_flags(mob/living/carbon/wearer, new_flags) + no_equip_flags = new_flags + wearer.hud_used?.update_locked_slots() + worn_items_fit_body_check(wearer) + +/** + * Normalizes blood in a human if it is excessive. If it is above BLOOD_VOLUME_NORMAL, this will clamp it to that value. It will not give the human more blodo than they have less than this value. + */ +/datum/species/proc/normalize_blood(mob/living/carbon/human/blood_possessing_human) + var/normalized_blood_values = max(blood_possessing_human.blood_volume, 0, BLOOD_VOLUME_NORMAL) + blood_possessing_human.blood_volume = normalized_blood_values + +/** + * Proc called when a carbon becomes this species. + * + * This sets up and adds/changes/removes things, qualities, abilities, and traits so that the transformation is as smooth and bugfree as possible. + * Produces a [COMSIG_SPECIES_GAIN] signal. + * Arguments: + * * C - Carbon, this is whoever became the new species. + * * old_species - The species that the carbon used to be before becoming this race, used for regenerating organs. + * * pref_load - Preferences to be loaded from character setup, loads in preferred mutant things like bodyparts, digilegs, skin color, etc. + */ +/datum/species/proc/on_species_gain(mob/living/carbon/human/human_who_gained_species, datum/species/old_species, pref_load) + SHOULD_CALL_PARENT(TRUE) + // Drop the items the new species can't wear + if(human_who_gained_species.hud_used) + human_who_gained_species.hud_used.update_locked_slots() + + human_who_gained_species.mob_biotypes = inherent_biotypes + human_who_gained_species.mob_respiration_type = inherent_respiration_type + human_who_gained_species.butcher_results = knife_butcher_results?.Copy() + + if(old_species.type != type) + replace_body(human_who_gained_species, src) + + regenerate_organs(human_who_gained_species, old_species, visual_only = human_who_gained_species.visual_only_organs) + + // Drop the items the new species can't wear + INVOKE_ASYNC(src, PROC_REF(worn_items_fit_body_check), human_who_gained_species, TRUE) + + //Assigns exotic blood type if the species has one + if(exotic_bloodtype && human_who_gained_species.dna.blood_type != exotic_bloodtype) + human_who_gained_species.dna.blood_type = exotic_bloodtype + //Otherwise, check if the previous species had an exotic bloodtype and we do not have one and assign a random blood type + //(why the fuck is blood type not tied to a fucking DNA block?) + else if(old_species.exotic_bloodtype && !exotic_bloodtype) + human_who_gained_species.dna.blood_type = random_blood_type() + + //Resets blood if it is excessively high for some reason + normalize_blood(human_who_gained_species) + + if(ishuman(human_who_gained_species)) + var/mob/living/carbon/human/human = human_who_gained_species + for(var/obj/item/organ/external/organ_path as anything in external_organs) + if(!should_external_organ_apply_to(organ_path, human)) + continue + + //Load a persons preferences from DNA + var/obj/item/organ/external/new_organ = SSwardrobe.provide_type(organ_path) + new_organ.Insert(human, special=TRUE, drop_if_replaced=FALSE) + + + + if(length(inherent_traits)) + human_who_gained_species.add_traits(inherent_traits, SPECIES_TRAIT) + + if(inherent_factions) + for(var/i in inherent_factions) + human_who_gained_species.faction += i //Using +=/-= for this in case you also gain the faction from a different source. + + // All languages associated with this language holder are added with source [LANGUAGE_SPECIES] + // rather than source [LANGUAGE_ATOM], so we can track what to remove if our species changes again + var/datum/language_holder/gaining_holder = GLOB.prototype_language_holders[species_language_holder] + for(var/language in gaining_holder.understood_languages) + human_who_gained_species.grant_language(language, UNDERSTOOD_LANGUAGE, LANGUAGE_SPECIES) + for(var/language in gaining_holder.spoken_languages) + human_who_gained_species.grant_language(language, SPOKEN_LANGUAGE, LANGUAGE_SPECIES) + for(var/language in gaining_holder.blocked_languages) + human_who_gained_species.add_blocked_language(language, LANGUAGE_SPECIES) + human_who_gained_species.regenerate_icons() + + SEND_SIGNAL(human_who_gained_species, COMSIG_SPECIES_GAIN, src, old_species) + + properly_gained = TRUE + +/** + * Proc called when a carbon is no longer this species. + * + * This sets up and adds/changes/removes things, qualities, abilities, and traits so that the transformation is as smooth and bugfree as possible. + * Produces a [COMSIG_SPECIES_LOSS] signal. + * Arguments: + * * C - Carbon, this is whoever lost this species. + * * new_species - The new species that the carbon became, used for genetics mutations. + * * pref_load - Preferences to be loaded from character setup, loads in preferred mutant things like bodyparts, digilegs, skin color, etc. + */ +/datum/species/proc/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) + SHOULD_CALL_PARENT(TRUE) + C.butcher_results = null + for(var/X in inherent_traits) + REMOVE_TRAIT(C, X, SPECIES_TRAIT) + + for(var/obj/item/organ/external/organ in C.organs) + organ.Remove(C) + qdel(organ) + + //If their inert mutation is not the same, swap it out + if((inert_mutation != new_species.inert_mutation) && LAZYLEN(C.dna.mutation_index) && (inert_mutation in C.dna.mutation_index)) + C.dna.remove_mutation(inert_mutation) + //keep it at the right spot, so we can't have people taking shortcuts + var/location = C.dna.mutation_index.Find(inert_mutation) + C.dna.mutation_index[location] = new_species.inert_mutation + C.dna.default_mutation_genes[location] = C.dna.mutation_index[location] + C.dna.mutation_index[new_species.inert_mutation] = create_sequence(new_species.inert_mutation) + C.dna.default_mutation_genes[new_species.inert_mutation] = C.dna.mutation_index[new_species.inert_mutation] + + if(inherent_factions) + for(var/i in inherent_factions) + C.faction -= i + + clear_tail_moodlets(C) + + // Removes all languages previously associated with [LANGUAGE_SPECIES], gaining our new species will add new ones back + var/datum/language_holder/losing_holder = GLOB.prototype_language_holders[species_language_holder] + for(var/language in losing_holder.understood_languages) + C.remove_language(language, UNDERSTOOD_LANGUAGE, LANGUAGE_SPECIES) + for(var/language in losing_holder.spoken_languages) + C.remove_language(language, SPOKEN_LANGUAGE, LANGUAGE_SPECIES) + for(var/language in losing_holder.blocked_languages) + C.remove_blocked_language(language, LANGUAGE_SPECIES) + + SEND_SIGNAL(C, COMSIG_SPECIES_LOSS, src) + +/** + * Proc called when mail goodies need to be updated for this species. + * + * Updates the mail goodies if that is required. e.g. for the blood deficiency quirk, which sends bloodbags to quirk holders, update the sent bloodpack to match the species' exotic blood. + * This is currently only used for the blood deficiency quirk but more can be added as needed. + * Arguments: + * * mob/living/carbon/human/recipient - the mob receiving the mail goodies + */ +/datum/species/proc/update_mail_goodies(mob/living/carbon/human/recipient) + update_quirk_mail_goodies(recipient, recipient.get_quirk(/datum/quirk/blooddeficiency)) + +/** + * Updates the mail goodies of a specific quirk. + * + * Updates the mail goodies belonging to a specific quirk. + * Add implementation as needed for each individual species. The base species proc should give the species the 'default' version of whatever mail goodies are required. + * Arguments: + * * mob/living/carbon/human/recipient - the mob receiving the mail goodies + * * datum/quirk/quirk - the quirk to update the mail goodies of. Use get_quirk(datum/quirk/some_quirk) to get the actual mob's quirk to pass. + * * list/mail_goodies - a list of mail goodies. Generally speaking you should not be using this argument on the initial function call. You should instead add to the species' implementation of this proc. + */ +/datum/species/proc/update_quirk_mail_goodies(mob/living/carbon/human/recipient, datum/quirk/quirk, list/mail_goodies) + if(isnull(quirk)) + return + if(length(mail_goodies)) + quirk.mail_goodies = mail_goodies + return + if(istype(quirk, /datum/quirk/blooddeficiency)) + if(HAS_TRAIT(recipient, TRAIT_NOBLOOD) && isnull(recipient.dna.species.exotic_blood)) // TRAIT_NOBLOOD and no exotic blood (yes we have to check for both, jellypeople exist) + quirk.mail_goodies = list() // means no blood pack gets sent to them. + return + + + // The default case if no species implementation exists. Set quirk's mail_goodies to initial. + var/datum/quirk/readable_quirk = new quirk.type + quirk.mail_goodies = readable_quirk.mail_goodies + qdel(readable_quirk) // We have to do it this way because initial will not work on lists in this version of DM + return + +/** + * Handles the body of a human + * + * Handles lipstick, having no eyes, eye color, undergarnments like underwear, undershirts, and socks, and body layers. + * Calls [handle_mutant_bodyparts][/datum/species/proc/handle_mutant_bodyparts] + * Arguments: + * * species_human - Human, whoever we're handling the body for + */ +/datum/species/proc/handle_body(mob/living/carbon/human/species_human) + species_human.remove_overlay(BODY_LAYER) + var/height_offset = species_human.get_top_offset() // From high changed by varying limb height + if(HAS_TRAIT(species_human, TRAIT_INVISIBLE_MAN)) + return handle_mutant_bodyparts(species_human) + var/list/standing = list() + + if(!HAS_TRAIT(species_human, TRAIT_HUSK)) + var/obj/item/bodypart/head/noggin = species_human.get_bodypart(BODY_ZONE_HEAD) + if(noggin?.head_flags & HEAD_EYESPRITES) + // eyes (missing eye sprites get handled by the head itself, but sadly we have to do this stupid shit here, for now) + var/obj/item/organ/internal/eyes/eye_organ = species_human.get_organ_slot(ORGAN_SLOT_EYES) + if(eye_organ) + eye_organ.refresh(call_update = FALSE) + for(var/mutable_appearance/eye_overlay in eye_organ.generate_body_overlay(species_human)) + eye_overlay.pixel_y += height_offset + standing += eye_overlay + + // organic body markings (oh my god this is terrible please rework this to be done on the limbs themselves i beg you) + if(HAS_TRAIT(species_human, TRAIT_HAS_MARKINGS)) + var/obj/item/bodypart/chest/chest = species_human.get_bodypart(BODY_ZONE_CHEST) + var/obj/item/bodypart/arm/right/right_arm = species_human.get_bodypart(BODY_ZONE_R_ARM) + var/obj/item/bodypart/arm/left/left_arm = species_human.get_bodypart(BODY_ZONE_L_ARM) + var/obj/item/bodypart/leg/right/right_leg = species_human.get_bodypart(BODY_ZONE_R_LEG) + var/obj/item/bodypart/leg/left/left_leg = species_human.get_bodypart(BODY_ZONE_L_LEG) + var/datum/sprite_accessory/markings = GLOB.moth_markings_list[species_human.dna.features["moth_markings"]] + if(noggin && (IS_ORGANIC_LIMB(noggin))) + var/mutable_appearance/markings_head_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_head", -BODY_LAYER) + markings_head_overlay.pixel_y += height_offset + standing += markings_head_overlay + + if(chest && (IS_ORGANIC_LIMB(chest))) + var/mutable_appearance/markings_chest_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_chest", -BODY_LAYER) + markings_chest_overlay.pixel_y += height_offset + standing += markings_chest_overlay + + if(right_arm && (IS_ORGANIC_LIMB(right_arm))) + var/mutable_appearance/markings_r_arm_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_r_arm", -BODY_LAYER) + markings_r_arm_overlay.pixel_y += height_offset + standing += markings_r_arm_overlay + + if(left_arm && (IS_ORGANIC_LIMB(left_arm))) + var/mutable_appearance/markings_l_arm_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_l_arm", -BODY_LAYER) + markings_l_arm_overlay.pixel_y += height_offset + standing += markings_l_arm_overlay + + if(right_leg && (IS_ORGANIC_LIMB(right_leg))) + var/mutable_appearance/markings_r_leg_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_r_leg", -BODY_LAYER) + standing += markings_r_leg_overlay + + if(left_leg && (IS_ORGANIC_LIMB(left_leg))) + var/mutable_appearance/markings_l_leg_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_l_leg", -BODY_LAYER) + standing += markings_l_leg_overlay + + //Underwear, Undershirts & Socks + if(!HAS_TRAIT(species_human, TRAIT_NO_UNDERWEAR)) + if(species_human.underwear) + var/datum/sprite_accessory/underwear/underwear = GLOB.underwear_list[species_human.underwear] + var/mutable_appearance/underwear_overlay + if(underwear) + if(species_human.dna.species.sexes && species_human.physique == FEMALE && (underwear.gender == MALE)) + underwear_overlay = wear_female_version(underwear.icon_state, underwear.icon, BODY_LAYER, FEMALE_UNIFORM_FULL) + else + underwear_overlay = mutable_appearance(underwear.icon, underwear.icon_state, -BODY_LAYER) + if(!underwear.use_static) + underwear_overlay.color = species_human.underwear_color + underwear_overlay.pixel_y += height_offset + standing += underwear_overlay + + if(species_human.undershirt) + var/datum/sprite_accessory/undershirt/undershirt = GLOB.undershirt_list[species_human.undershirt] + if(undershirt) + var/mutable_appearance/working_shirt + if(species_human.dna.species.sexes && species_human.physique == FEMALE) + working_shirt = wear_female_version(undershirt.icon_state, undershirt.icon, BODY_LAYER) + else + working_shirt = mutable_appearance(undershirt.icon, undershirt.icon_state, -BODY_LAYER) + working_shirt.pixel_y += height_offset + standing += working_shirt + + if(species_human.socks && species_human.num_legs >= 2 && !(species_human.bodytype & BODYTYPE_DIGITIGRADE)) + var/datum/sprite_accessory/socks/socks = GLOB.socks_list[species_human.socks] + if(socks) + standing += mutable_appearance(socks.icon, socks.icon_state, -BODY_LAYER) + + if(standing.len) + 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_ROBOTIC_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("body_markings") + accessory = GLOB.body_markings_list[source.dna.features["body_markings"]] + if("legs") + accessory = GLOB.legs_list[source.dna.features["legs"]] + if("caps") + accessory = GLOB.caps_list[source.dna.features["caps"]] + + 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, source, 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(MUTANT_COLOR) + if(fixed_mut_color) + accessory_overlay.color = fixed_mut_color + else + accessory_overlay.color = source.dna.features["mcolor"] + if(HAIR_COLOR) + if(hair_color == "mutcolor") + accessory_overlay.color = source.dna.features["mcolor"] + else if(hair_color == "fixedmutcolor") + accessory_overlay.color = fixed_hair_color + else + accessory_overlay.color = source.hair_color + if(FACIAL_HAIR_COLOR) + accessory_overlay.color = source.facial_hair_color + if(EYE_COLOR) + 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. +/datum/species/proc/mutant_bodyparts_layertext(layer) + switch(layer) + if(BODY_BEHIND_LAYER) + return "BEHIND" + if(BODY_ADJ_LAYER) + return "ADJ" + if(BODY_FRONT_LAYER) + return "FRONT" + +///Proc that will randomise the hair, or primary appearance element (i.e. for moths wings) of a species' associated mob +/datum/species/proc/randomize_main_appearance_element(mob/living/carbon/human/human_mob) + human_mob.set_hairstyle(random_hairstyle(human_mob.gender), update = FALSE) + +///Proc that will randomise the underwear (i.e. top, pants and socks) of a species' associated mob, +/// but will not update the body right away. +/datum/species/proc/randomize_active_underwear_only(mob/living/carbon/human/human_mob) + human_mob.undershirt = random_undershirt(human_mob.gender) + human_mob.underwear = random_underwear(human_mob.gender) + human_mob.socks = random_socks(human_mob.gender) + +///Proc that will randomise the underwear (i.e. top, pants and socks) of a species' associated mob +/datum/species/proc/randomize_active_underwear(mob/living/carbon/human/human_mob) + randomize_active_underwear_only(human_mob) + human_mob.update_body() + +/datum/species/proc/randomize_active_features(mob/living/carbon/human/human_mob) + var/list/new_features = randomize_features() + for(var/feature_key in new_features) + human_mob.dna.features[feature_key] = new_features[feature_key] + human_mob.updateappearance(mutcolor_update = TRUE) + +/** + * Returns a list of features, randomized, to be used by DNA + */ +/datum/species/proc/randomize_features() + SHOULD_CALL_PARENT(TRUE) + + var/list/new_features = list() + var/static/list/organs_to_randomize = list() + for(var/obj/item/organ/external/organ_path as anything in external_organs) + var/overlay_path = initial(organ_path.bodypart_overlay) + var/datum/bodypart_overlay/mutant/sample_overlay = organs_to_randomize[overlay_path] + if(isnull(sample_overlay)) + sample_overlay = new overlay_path() + organs_to_randomize[overlay_path] = sample_overlay + + new_features["[sample_overlay.feature_key]"] = pick(sample_overlay.get_global_feature_list()) + + return new_features + +/datum/species/proc/spec_life(mob/living/carbon/human/H, seconds_per_tick, times_fired) + SHOULD_CALL_PARENT(TRUE) + if(H.stat == DEAD) + return + if(HAS_TRAIT(H, TRAIT_NOBREATH) && (H.health < H.crit_threshold) && !HAS_TRAIT(H, TRAIT_NOCRITDAMAGE)) + H.adjustBruteLoss(0.5 * seconds_per_tick) + +/datum/species/proc/spec_death(gibbed, mob/living/carbon/human/H) + return + +/datum/species/proc/can_equip(obj/item/I, slot, disable_warning, mob/living/carbon/human/H, bypass_equip_delay_self = FALSE, ignore_equipped = FALSE, indirect_action = FALSE) + if(no_equip_flags & slot) + if(!I.species_exception || !is_type_in_list(src, I.species_exception)) + return FALSE + + // if there's an item in the slot we want, fail + if(!ignore_equipped) + if(H.get_item_by_slot(slot)) + 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)) + var/excused = FALSE + // Anything that's small or smaller can fit into a pocket by default + if((slot & (ITEM_SLOT_RPOCKET|ITEM_SLOT_LPOCKET)) && I.w_class <= WEIGHT_CLASS_SMALL) + excused = TRUE + else if(slot & (ITEM_SLOT_SUITSTORE|ITEM_SLOT_BACKPACK|ITEM_SLOT_HANDS)) + excused = TRUE + if(!excused) + return FALSE + + switch(slot) + if(ITEM_SLOT_HANDS) + if(H.get_empty_held_indexes()) + 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((H.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) + + if(!H.w_uniform && !HAS_TRAIT(H, TRAIT_NO_JUMPSUIT) && (!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_EYES) + if(!H.get_bodypart(BODY_ZONE_HEAD)) + return FALSE + var/obj/item/organ/internal/eyes/eyes = H.get_organ_slot(ORGAN_SLOT_EYES) + if(eyes?.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) + var/obj/item/bodypart/chest = H.get_bodypart(BODY_ZONE_CHEST) + if(chest && (chest.bodytype & BODYTYPE_MONKEY)) + if(!(I.supports_variations_flags & CLOTHING_MONKEY_VARIATION)) + if(!disable_warning) + to_chat(H, span_warning("[I] doesn't fit your [chest.name]!")) + return FALSE + 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 && !HAS_TRAIT(H, TRAIT_NO_JUMPSUIT) && (!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 + if(!isnull(H.l_store) && H.l_store != I) // no pocket swaps at all + return FALSE + + var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_L_LEG) + + if(!H.w_uniform && !HAS_TRAIT(H, TRAIT_NO_JUMPSUIT) && (!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 + if(!isnull(H.r_store) && H.r_store != I) + return FALSE + + var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_R_LEG) + + if(!H.w_uniform && !HAS_TRAIT(H, TRAIT_NO_JUMPSUIT) && (!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_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/pda) || istype(I, /obj/item/pen) || is_type_in_list(I, H.wear_suit.allowed) ) + return TRUE + return FALSE + if(ITEM_SLOT_HANDCUFFED) + if(!istype(I, /obj/item/restraints/handcuffs)) + return FALSE + if(H.num_hands < 2) + return FALSE + return TRUE + if(ITEM_SLOT_LEGCUFFED) + 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, force = indirect_action ? STORAGE_SOFT_LOCKED : STORAGE_NOT_LOCKED)) + 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) + if(!I.equip_delay_self || bypass_equip_delay_self) + return TRUE + H.visible_message(span_notice("[H] start putting on [I]..."), span_notice("You start putting on [I]...")) + return do_after(H, I.equip_delay_self, target = H) + + +/// Equips the necessary species-relevant gear before putting on the rest of the uniform. +/datum/species/proc/pre_equip_species_outfit(datum/job/job, mob/living/carbon/human/equipping, visuals_only = FALSE) + return + +/** + * Handling special reagent interactions. + * + * Return null continue running the normal on_mob_life() for that reagent. + * Return COMSIG_MOB_STOP_REAGENT_CHECK to not run the normal metabolism effects. + * + * NOTE: If you return COMSIG_MOB_STOP_REAGENT_CHECK, that reagent will not be removed liike normal! You must handle it manually. + **/ +/datum/species/proc/handle_chemical(datum/reagent/chem, mob/living/carbon/human/affected, seconds_per_tick, times_fired) + SHOULD_CALL_PARENT(TRUE) + if(chem.type == exotic_blood) + affected.blood_volume = min(affected.blood_volume + round(chem.volume, 0.1), BLOOD_VOLUME_MAXIMUM) + affected.reagents.del_reagent(chem.type) + return COMSIG_MOB_STOP_REAGENT_CHECK + if(!chem.overdosed && chem.overdose_threshold && chem.volume >= chem.overdose_threshold) + chem.overdosed = TRUE + chem.overdose_start(affected) + affected.log_message("has started overdosing on [chem.name] at [chem.volume] units.", LOG_GAME) + return SEND_SIGNAL(affected, COMSIG_SPECIES_HANDLE_CHEMICAL, chem, seconds_per_tick, times_fired) + +/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 + +/** + * Equip the outfit required for life. Replaces items currently worn. + */ +/datum/species/proc/give_important_for_life(mob/living/carbon/human/human_to_equip) + if(!outfit_important_for_life) + return + + human_to_equip.equipOutfit(outfit_important_for_life) + +/** + * Species based handling for irradiation + * + * Arguments: + * - [source][/mob/living/carbon/human]: The mob requesting handling + * - time_since_irradiated: The amount of time since the mob was first irradiated + * - seconds_per_tick: The amount of time that has passed since the last tick + */ +/datum/species/proc/handle_radiation(mob/living/carbon/human/source, time_since_irradiated, seconds_per_tick) + if(time_since_irradiated > RAD_MOB_KNOCKDOWN && SPT_PROB(RAD_MOB_KNOCKDOWN_PROB, seconds_per_tick)) + if(!source.IsParalyzed()) + source.emote("collapse") + source.Paralyze(RAD_MOB_KNOCKDOWN_AMOUNT) + to_chat(source, span_danger("You feel weak.")) + + if(time_since_irradiated > RAD_MOB_VOMIT && SPT_PROB(RAD_MOB_VOMIT_PROB, seconds_per_tick)) + source.vomit(VOMIT_CATEGORY_BLOOD, lost_nutrition = 10) + + if(time_since_irradiated > RAD_MOB_MUTATE && SPT_PROB(RAD_MOB_MUTATE_PROB, seconds_per_tick)) + to_chat(source, span_danger("You mutate!")) + source.easy_random_mutate(NEGATIVE + MINOR_NEGATIVE) + source.emote("gasp") + source.domutcheck() + + if(time_since_irradiated > RAD_MOB_HAIRLOSS && SPT_PROB(RAD_MOB_HAIRLOSS_PROB, seconds_per_tick)) + var/obj/item/bodypart/head/head = source.get_bodypart(BODY_ZONE_HEAD) + if(!(source.hairstyle == "Bald") && (head?.head_flags & HEAD_HAIR|HEAD_FACIAL_HAIR)) + to_chat(source, span_danger("Your hair starts to fall out in clumps...")) + addtimer(CALLBACK(src, PROC_REF(go_bald), source), 5 SECONDS) + +/** + * Makes the target human bald. + * + * Arguments: + * - [target][/mob/living/carbon/human]: The mob to make go bald. + */ +/datum/species/proc/go_bald(mob/living/carbon/human/target) + if(QDELETED(target)) //may be called from a timer + return + target.set_facial_hairstyle("Shaved", update = FALSE) + target.set_hairstyle("Bald", update = FALSE) + target.update_body_parts() + +////////////////// +// ATTACK PROCS // +////////////////// + +/datum/species/proc/help(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) + if(SEND_SIGNAL(target, COMSIG_CARBON_PRE_HELP, user, attacker_style) & COMPONENT_BLOCK_HELP_ACT) + return TRUE + + if(attacker_style?.help_act(user, target) == MARTIAL_ATTACK_SUCCESS) + return TRUE + + if(target.body_position == STANDING_UP || (target.appears_alive() && target.stat != SOFT_CRIT && target.stat != HARD_CRIT)) + target.help_shake_act(user) + if(target != user) + log_combat(user, target, "shaken") + return TRUE + + user.do_cpr(target) + +/datum/species/proc/grab(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) + if(target.check_block()) + target.visible_message(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 + target.grabbedby(user) + return TRUE + +///This proc handles punching damage. IMPORTANT: Our owner is the TARGET and not the USER in this proc. For whatever reason... +/datum/species/proc/harm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) + if(HAS_TRAIT(user, TRAIT_PACIFISM) && !attacker_style?.pacifist_style) + to_chat(user, span_warning("You don't want to harm [target]!")) + return FALSE + 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(attacker_style?.harm_act(user,target) == MARTIAL_ATTACK_SUCCESS) + return TRUE + else + + var/obj/item/organ/internal/brain/brain = user.get_organ_slot(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(ITEM_SLOT_MASK)) + to_chat(user, span_warning("You can't [atk_verb] with your mouth covered!")) + return FALSE + user.do_attack_animation(target, atk_effect) + + var/damage = rand(attacking_bodypart.unarmed_damage_low, attacking_bodypart.unarmed_damage_high) + + var/obj/item/bodypart/affecting = target.get_bodypart(target.get_random_valid_zone(user.zone_selected)) + + 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.getStaminaLoss() + (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") + return FALSE + + var/armor_block = target.run_armor_check(affecting, MELEE) + + playsound(target.loc, attacking_bodypart.unarmed_attack_sound, 25, TRUE, -1) + + target.visible_message(span_danger("[user] [atk_verb]ed [target]!"), \ + span_userdanger("You're [atk_verb]ed by [user]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, user) + to_chat(user, span_danger("You [atk_verb] [target]!")) + + target.lastattacker = user.real_name + target.lastattackerckey = user.ckey + user.dna.species.spec_unarmedattacked(user, target) + + 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 + if(damage >= 9) + target.force_say() + log_combat(user, target, "kicked") + target.apply_damage(damage, attack_type, affecting, armor_block, attack_direction = attack_direction) + 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.apply_damage(damage*1.5, STAMINA, affecting, armor_block) + if(damage >= 9) + target.force_say() + log_combat(user, target, "punched") + + if((target.stat != DEAD) && damage >= attacking_bodypart.unarmed_stun_threshold) + target.visible_message(span_danger("[user] knocks [target] down!"), \ + span_userdanger("You're knocked down by [user]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, user) + to_chat(user, span_danger("You knock [target] down!")) + var/knockdown_duration = 40 + (target.getStaminaLoss() + (target.getBruteLoss()*0.5))*0.8 //50 total damage = 40 base stun + 40 stun modifier = 80 stun duration, which is the old base duration + target.apply_effect(knockdown_duration, EFFECT_KNOCKDOWN, armor_block) + log_combat(user, target, "got a stun punch with their previous punch") + +/datum/species/proc/spec_unarmedattacked(mob/living/carbon/human/user, mob/living/carbon/human/target) + return + +/datum/species/proc/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) + if(target.check_block()) + target.visible_message(span_warning("[user]'s shove is blocked by [target]!"), \ + span_danger("You block [user]'s shove!"), span_hear("You hear a swoosh!"), COMBAT_MESSAGE_RANGE, user) + to_chat(user, span_warning("Your shove at [target] was blocked!")) + return FALSE + if(attacker_style?.disarm_act(user,target) == MARTIAL_ATTACK_SUCCESS) + return TRUE + if(user.body_position != STANDING_UP) + return FALSE + if(user == target) + return FALSE + if(user.loc == target.loc) + return FALSE + user.disarm(target) + + +/datum/species/proc/spec_hitby(atom/movable/AM, mob/living/carbon/human/H) + return + +/datum/species/proc/spec_attack_hand(mob/living/carbon/human/owner, mob/living/carbon/human/target, datum/martial_art/attacker_style, modifiers) + if(!istype(owner)) + return + CHECK_DNA_AND_SPECIES(owner) + CHECK_DNA_AND_SPECIES(target) + + if(!istype(owner)) //sanity check for drones. + return + if(owner.mind) + attacker_style = owner.mind.martial_art + if((owner != target) && owner.combat_mode && target.check_shields(owner, 0, owner.name, attack_type = UNARMED_ATTACK)) + log_combat(owner, target, "attempted to touch") + target.visible_message(span_warning("[owner] attempts to touch [target]!"), \ + span_danger("[owner] attempts to touch you!"), span_hear("You hear a swoosh!"), COMBAT_MESSAGE_RANGE, owner) + to_chat(owner, span_warning("You attempt to touch [target]!")) + return + + SEND_SIGNAL(owner, COMSIG_MOB_ATTACK_HAND, owner, target, attacker_style) + + if(LAZYACCESS(modifiers, RIGHT_CLICK)) + disarm(owner, target, attacker_style) + return // dont attack after + if(owner.combat_mode) + harm(owner, target, attacker_style) + else + help(owner, target, attacker_style) + +/datum/species/proc/spec_attacked_by(obj/item/weapon, mob/living/user, obj/item/bodypart/affecting, mob/living/carbon/human/human) + // Allows you to put in item-specific reactions based on species + if(user != human) + if(human.check_shields(weapon, weapon.force, "the [weapon.name]", MELEE_ATTACK, weapon.armour_penetration, weapon.damtype)) + return FALSE + if(human.check_block()) + human.visible_message(span_warning("[human] blocks [weapon]!"), \ + span_userdanger("You block [weapon]!")) + return FALSE + + var/hit_area + if(!affecting) //Something went wrong. Maybe the limb is missing? + affecting = human.bodyparts[1] + + hit_area = affecting.plaintext_zone + var/def_zone = affecting.body_zone + + var/armor_block = human.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]!"),weapon.armour_penetration, weak_against_armour = weapon.weak_against_armour) + armor_block = min(ARMOR_MAX_BLOCK, armor_block) //cap damage reduction at 90% + var/Iwound_bonus = weapon.wound_bonus + + // this way, you can't wound with a surgical tool on help intent if they have a surgery active and are lying down, so a misclick with a circular saw on the wrong limb doesn't bleed them dry (they still get hit tho) + if((weapon.item_flags & SURGICAL_TOOL) && !user.combat_mode && human.body_position == LYING_DOWN && (LAZYLEN(human.surgeries) > 0)) + Iwound_bonus = CANT_WOUND + + var/weakness = check_species_weakness(weapon, user) + + human.send_item_attack_message(weapon, user, hit_area, affecting) + + + var/attack_direction = get_dir(user, human) + apply_damage(weapon.force * weakness, weapon.damtype, def_zone, armor_block, human, wound_bonus = Iwound_bonus, bare_wound_bonus = weapon.bare_wound_bonus, sharpness = weapon.get_sharpness(), attack_direction = attack_direction, attacking_item = weapon) + + if(!weapon.force) + return FALSE //item force is zero + var/bloody = FALSE + if(weapon.damtype != BRUTE) + return TRUE + if(!(prob(25 + (weapon.force * 2)))) + return TRUE + + if(affecting.can_bleed()) + weapon.add_mob_blood(human) //Make the weapon bloody, not the person. + if(prob(weapon.force * 2)) //blood spatter! + bloody = TRUE + var/turf/location = human.loc + if(istype(location)) + human.add_splatter_floor(location) + if(get_dist(user, human) <= 1) //people with TK won't get smeared with blood + user.add_mob_blood(human) + + switch(hit_area) + if(BODY_ZONE_HEAD) + if(!weapon.get_sharpness() && armor_block < 50) + if(prob(weapon.force)) + human.adjustOrganLoss(ORGAN_SLOT_BRAIN, 20) + if(human.stat == CONSCIOUS) + human.visible_message(span_danger("[human] is knocked senseless!"), \ + span_userdanger("You're knocked senseless!")) + human.set_confusion_if_lower(20 SECONDS) + human.adjust_eye_blur(20 SECONDS) + if(prob(10)) + human.gain_trauma(/datum/brain_trauma/mild/concussion) + else + human.adjustOrganLoss(ORGAN_SLOT_BRAIN, weapon.force * 0.2) + + if(human.mind && human.stat == CONSCIOUS && human != user && prob(weapon.force + ((100 - human.health) * 0.5))) // rev deconversion through blunt trauma. + var/datum/antagonist/rev/rev = human.mind.has_antag_datum(/datum/antagonist/rev) + if(rev) + rev.remove_revolutionary(user) + + if(bloody) //Apply blood + if(human.wear_mask) + human.wear_mask.add_mob_blood(human) + human.update_worn_mask() + if(human.head) + human.head.add_mob_blood(human) + human.update_worn_head() + if(human.glasses && prob(33)) + human.glasses.add_mob_blood(human) + human.update_worn_glasses() + + if(BODY_ZONE_CHEST) + if(human.stat == CONSCIOUS && !weapon.get_sharpness() && armor_block < 50) + if(prob(weapon.force)) + human.visible_message(span_danger("[human] is knocked down!"), \ + span_userdanger("You're knocked down!")) + human.apply_effect(60, EFFECT_KNOCKDOWN, armor_block) + + if(bloody) + if(human.wear_suit) + human.wear_suit.add_mob_blood(human) + human.update_worn_oversuit() + if(human.w_uniform) + human.w_uniform.add_mob_blood(human) + human.update_worn_undersuit() + + /// Triggers force say events + if(weapon.force > 10 || (weapon.force >= 5 && prob(33))) + human.force_say(user) + + return TRUE + +/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE, attack_direction = null, attacking_item) + SEND_SIGNAL(H, COMSIG_MOB_APPLY_DAMAGE, damage, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, attacking_item) + var/hit_percent = (100-(damage_modifier+blocked))/100 + hit_percent = (hit_percent * (100-H.physiology.damage_resistance))/100 + if(!damage || (!forced && hit_percent <= 0)) + return 0 + + var/obj/item/bodypart/BP = null + if(!spread_damage) + if(isbodypart(def_zone)) + BP = def_zone + else + if(!def_zone) + def_zone = H.get_random_valid_zone(def_zone) + BP = H.get_bodypart(check_zone(def_zone)) + if(!BP) + BP = H.bodyparts[1] + + switch(damagetype) + if(BRUTE) + H.damageoverlaytemp = 20 + var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.brute_mod + if(BP) + if(BP.receive_damage(damage_amount, 0, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness, attack_direction = attack_direction, damage_source = attacking_item)) + H.update_damage_overlays() + 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 * H.physiology.burn_mod + if(BP) + if(BP.receive_damage(0, damage_amount, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness, attack_direction = attack_direction, damage_source = attacking_item)) + H.update_damage_overlays() + 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) + var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.stamina_mod + H.adjustStaminaLoss(damage_amount) + if(BRAIN) + var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.brain_mod + H.adjustOrganLoss(ORGAN_SLOT_BRAIN, damage_amount) + SEND_SIGNAL(H, COMSIG_MOB_AFTER_APPLY_DAMAGE, damage, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, attacking_item) + return TRUE + +/datum/species/proc/on_hit(obj/projectile/P, mob/living/carbon/human/H) + // called when hit by a projectile + switch(P.type) + if(/obj/projectile/energy/floramut) // overwritten by plants/pods + H.show_message(span_notice("The radiation beam dissipates harmlessly through your body.")) + if(/obj/projectile/energy/florayield) + H.show_message(span_notice("The radiation beam dissipates harmlessly through your body.")) + if(/obj/projectile/energy/florarevolution) + H.show_message(span_notice("The radiation beam dissipates harmlessly through your body.")) + +/datum/species/proc/bullet_act(obj/projectile/P, mob/living/carbon/human/H) + // called before a projectile hit + return 0 + +////////////////////////// +// ENVIRONMENT HANDLERS // +////////////////////////// + +/** + * Environment handler for species + * + * vars: + * * environment (required) The environment gas mix + * * 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, seconds_per_tick, times_fired) + handle_environment_pressure(humi, environment, seconds_per_tick, times_fired) + +/** + * Body temperature handler for species + * + * These procs manage body temp, bamage, and alerts + * Some of these will still fire when not alive to balance body temp to the room temp. + * vars: + * * humi (required)(type: /mob/living/carbon/human) The mob we will target + */ +/datum/species/proc/handle_body_temperature(mob/living/carbon/human/humi, seconds_per_tick, times_fired) + //when in a cryo unit we suspend all natural body regulation + if(istype(humi.loc, /obj/machinery/cryo_cell)) + return + + //Only stabilise core temp when alive and not in statis + if(humi.stat < DEAD && !HAS_TRAIT(humi, TRAIT_STASIS)) + body_temperature_core(humi, seconds_per_tick, times_fired) + + //These do run in statis + body_temperature_skin(humi, seconds_per_tick, times_fired) + body_temperature_alerts(humi, seconds_per_tick, times_fired) + + //Do not cause more damage in statis + if(!HAS_TRAIT(humi, TRAIT_STASIS)) + body_temperature_damage(humi, seconds_per_tick, times_fired) + +/** + * Used to stabilize the core temperature back to normal on living mobs + * + * The metabolisim heats up the core of the mob trying to keep it at the normal body temp + * vars: + * * humi (required) The mob we will stabilize + */ +/datum/species/proc/body_temperature_core(mob/living/carbon/human/humi, seconds_per_tick, times_fired) + var/natural_change = get_temp_change_amount(humi.get_body_temp_normal() - humi.coretemperature, 0.06 * seconds_per_tick) + humi.adjust_coretemperature(humi.metabolism_efficiency * natural_change) + +/** + * Used to normalize the skin temperature on living mobs + * + * The core temp effects the skin, then the enviroment effects the skin, then we refect that back to the core. + * This happens even when dead so bodies revert to room temp over time. + * vars: + * * humi (required) The mob we will targeting + * - seconds_per_tick: The amount of time that is considered as elapsing + * - times_fired: The number of times SSmobs has fired + */ +/datum/species/proc/body_temperature_skin(mob/living/carbon/human/humi, seconds_per_tick, times_fired) + + // change the core based on the skin temp + var/skin_core_diff = humi.bodytemperature - humi.coretemperature + // change rate of 0.04 per second to be slightly below area to skin change rate and still have a solid curve + var/skin_core_change = get_temp_change_amount(skin_core_diff, 0.04 * seconds_per_tick) + + 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() + if(!environment) // if there is no environment (nullspace) drop out here. + return + + // Get the temperature of the environment for area + var/area_temp = humi.get_temperature(environment) + + // Get the insulation value based on the area's temp + var/thermal_protection = humi.get_insulation_protection(area_temp) + + // Changes to the skin temperature based on the area + var/area_skin_diff = area_temp - humi.bodytemperature + if(!humi.on_fire || area_skin_diff > 0) + // change rate of 0.05 as area temp has large impact on the surface + var/area_skin_change = get_temp_change_amount(area_skin_diff, 0.05 * seconds_per_tick) + + // We need to apply the thermal protection of the clothing when applying area to surface change + // If the core bodytemp goes over the normal body temp you are overheating and becom sweaty + // This will cause the insulation value of any clothing to reduced in effect (70% normal rating) + // we add 10 degree over normal body temp before triggering as thick insulation raises body temp + if(humi.get_body_temp_normal(apply_change=FALSE) + 10 < humi.coretemperature) + // we are overheating and sweaty insulation is not as good reducing thermal protection + area_skin_change = (1 - (thermal_protection * 0.7)) * area_skin_change + else + area_skin_change = (1 - thermal_protection) * area_skin_change + + humi.adjust_bodytemperature(area_skin_change) + + // Core to skin temp transfer, when not on fire + if(!humi.on_fire) + // Get the changes to the skin from the core temp + var/core_skin_diff = humi.coretemperature - humi.bodytemperature + // change rate of 0.045 to reflect temp back to the skin at the slight higher rate then core to skin + var/core_skin_change = (1 + thermal_protection) * get_temp_change_amount(core_skin_diff, 0.045 * seconds_per_tick) + + // We do not want to over shoot after using protection + if(core_skin_diff > 0) + core_skin_change = min(core_skin_change, core_skin_diff) + else + core_skin_change = max(core_skin_change, core_skin_diff) + + humi.adjust_bodytemperature(core_skin_change) + + +/** + * Used to set alerts and debuffs based on body temperature + * vars: + * * humi (required) The mob we will targeting + */ +/datum/species/proc/body_temperature_alerts(mob/living/carbon/human/humi) + 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 + humi.clear_mood_event("cold") + humi.add_mood_event("hot", /datum/mood_event/hot) + + //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) + humi.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/hot, 1) + else if(bodytemp in BODYTEMP_HEAT_WARNING_2 to BODYTEMP_HEAT_WARNING_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)) + // clear any hot moods and apply cold mood + humi.clear_mood_event("hot") + humi.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)) + // 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) + humi.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 1) + else if(bodytemp in BODYTEMP_COLD_WARNING_3 to BODYTEMP_COLD_WARNING_2) + humi.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 2) + else + humi.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 3) + + // 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) + humi.clear_alert(ALERT_TEMPERATURE) + humi.remove_movespeed_modifier(/datum/movespeed_modifier/cold) + humi.clear_mood_event("cold") + humi.clear_mood_event("hot") + + // Store the old bodytemp for future checking + humi.old_bodytemperature = bodytemp + +/** + * Used to apply wounds and damage based on core/body temp + * vars: + * * humi (required) The mob we will targeting + */ +/datum/species/proc/body_temperature_damage(mob/living/carbon/human/humi, seconds_per_tick, times_fired) + + //If the body temp is above the wound limit start adding exposure stacks + if(humi.bodytemperature > BODYTEMP_HEAT_WOUND_LIMIT) + humi.heat_exposure_stacks = min(humi.heat_exposure_stacks + (0.5 * seconds_per_tick), 40) + else //When below the wound limit, reduce the exposure stacks fast. + humi.heat_exposure_stacks = max(humi.heat_exposure_stacks - (2 * seconds_per_tick), 0) + + //when exposure stacks are greater then 10 + rand20 try to apply wounds and reset stacks + if(humi.heat_exposure_stacks > (10 + rand(0, 20))) + apply_burn_wounds(humi, seconds_per_tick, times_fired) + humi.heat_exposure_stacks = 0 + + // 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)) + var/firemodifier = humi.fire_stacks / 50 + if (!humi.on_fire) // We are not on fire, reduce the modifier + firemodifier = min(firemodifier, 0) + + // this can go below 5 at log 2.5 + var/burn_damage = max(log(2 - firemodifier, (humi.coretemperature - humi.get_body_temp_normal(apply_change=FALSE))) - 5, 0) + + // Apply species and physiology modifiers to heat damage + burn_damage = burn_damage * heatmod * humi.physiology.heat_mod * 0.5 * seconds_per_tick + + // 40% for level 3 damage on humans to scream in pain + if (humi.stat < UNCONSCIOUS && (prob(burn_damage) * 10) / 4) + humi.emote("scream") + + // 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) + + 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) + // 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 * seconds_per_tick, damage_type) + else if(humi.coretemperature in 120 to 200) + humi.apply_damage(COLD_DAMAGE_LEVEL_2 * damage_mod * seconds_per_tick, damage_type) + else + humi.apply_damage(COLD_DAMAGE_LEVEL_3 * damage_mod * seconds_per_tick, damage_type) + +/** + * Used to apply burn wounds on random limbs + * + * This is called from body_temperature_damage when exposure to extream heat adds up and causes a wound. + * The wounds will increase in severity as the temperature increases. + * vars: + * * humi (required) The mob we will targeting + */ +/datum/species/proc/apply_burn_wounds(mob/living/carbon/human/humi, seconds_per_tick, times_fired) + // If we are resistant to heat exit + if(HAS_TRAIT(humi, TRAIT_RESISTHEAT)) + return + + // If our body temp is to low for a wound exit + if(humi.bodytemperature < BODYTEMP_HEAT_WOUND_LIMIT) + return + + // Lets pick a random body part and check for an existing burn + var/obj/item/bodypart/bodypart = pick(humi.bodyparts) + var/datum/wound/existing_burn + for (var/datum/wound/iterated_wound as anything in bodypart.wounds) + var/datum/wound_pregen_data/pregen_data = iterated_wound.get_pregen_data() + if (pregen_data.wound_series in GLOB.wounding_types_to_series[WOUND_BURN]) + existing_burn = iterated_wound + break + // If we have an existing burn try to upgrade it + var/severity + if(existing_burn) + switch(existing_burn.severity) + if(WOUND_SEVERITY_MODERATE) + if(humi.bodytemperature > BODYTEMP_HEAT_WOUND_LIMIT + 400) // 800k + severity = WOUND_SEVERITY_SEVERE + if(WOUND_SEVERITY_SEVERE) + if(humi.bodytemperature > BODYTEMP_HEAT_WOUND_LIMIT + 2800) // 3200k + severity = WOUND_SEVERITY_CRITICAL + else // If we have no burn apply the lowest level burn + severity = WOUND_SEVERITY_MODERATE + + humi.cause_wound_of_type_and_severity(WOUND_BURN, bodypart, severity, wound_source = "hot temperatures") + + // always take some burn damage + var/burn_damage = HEAT_DAMAGE_LEVEL_1 + if(humi.bodytemperature > BODYTEMP_HEAT_WOUND_LIMIT + 400) + burn_damage = HEAT_DAMAGE_LEVEL_2 + if(humi.bodytemperature > BODYTEMP_HEAT_WOUND_LIMIT + 2800) + burn_damage = HEAT_DAMAGE_LEVEL_3 + + humi.apply_damage(burn_damage * seconds_per_tick, BURN, bodypart) + +/// Handle the air pressure of the environment +/datum/species/proc/handle_environment_pressure(mob/living/carbon/human/H, datum/gas_mixture/environment, seconds_per_tick, times_fired) + var/pressure = environment.return_pressure() + var/adjusted_pressure = H.calculate_affecting_pressure(pressure) + + // Set alerts and apply damage based on the amount of pressure + switch(adjusted_pressure) + // 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 * seconds_per_tick, required_bodytype = BODYTYPE_ORGANIC) + H.throw_alert(ALERT_PRESSURE, /atom/movable/screen/alert/highpressure, 2) + else + H.clear_alert(ALERT_PRESSURE) + + // High pressure, show an alert + if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE) + H.throw_alert(ALERT_PRESSURE, /atom/movable/screen/alert/highpressure, 1) + + // No pressure issues here clear pressure alerts + if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE) + H.clear_alert(ALERT_PRESSURE) + + // Low pressure here, show an alert + if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE) + // We have low pressure resit trait, clear alerts + if(HAS_TRAIT(H, TRAIT_RESISTLOWPRESSURE)) + H.clear_alert(ALERT_PRESSURE) + else + H.throw_alert(ALERT_PRESSURE, /atom/movable/screen/alert/lowpressure, 1) + + // Very low pressure, show an alert and take damage + else + // We have low pressure resit trait, clear alerts + if(HAS_TRAIT(H, TRAIT_RESISTLOWPRESSURE)) + H.clear_alert(ALERT_PRESSURE) + else + H.adjustBruteLoss(LOW_PRESSURE_DAMAGE * H.physiology.pressure_mod * seconds_per_tick, required_bodytype = BODYTYPE_ORGANIC) + H.throw_alert(ALERT_PRESSURE, /atom/movable/screen/alert/lowpressure, 2) + + +////////// +// FIRE // +////////// + +/datum/species/proc/handle_fire(mob/living/carbon/human/H, seconds_per_tick, no_protection = FALSE) + return no_protection + +//////////// +// Stun // +//////////// + +/datum/species/proc/spec_stun(mob/living/carbon/human/H,amount) + if(H.movement_type & FLYING) + var/obj/item/organ/external/wings/functional/wings = H.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) + if(wings) + wings.toggle_flight(H) + wings.fly_slip(H) + . = stunmod * H.physiology.stun_mod * amount + +/datum/species/proc/negates_gravity(mob/living/carbon/human/H) + if(H.movement_type & FLYING) + 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) + former_tail_owner.clear_mood_event("tail_lost") + former_tail_owner.clear_mood_event("tail_balance_lost") + former_tail_owner.clear_mood_event("wrong_tail_regained") + +///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. +/datum/species/proc/get_features() + var/cached_features = GLOB.features_by_species[type] + if (!isnull(cached_features)) + return cached_features + + var/list/features = list() + + for (var/preference_type in GLOB.preference_entries) + var/datum/preference/preference = GLOB.preference_entries[preference_type] + + if ( \ + (preference.relevant_mutant_bodypart in mutant_bodyparts) \ + || (preference.relevant_inherent_trait in inherent_traits) \ + || (preference.relevant_external_organ in external_organs) \ + || (preference.relevant_head_flag && check_head_flags(preference.relevant_head_flag)) \ + ) + features += preference.savefile_key + + for (var/obj/item/organ/external/organ_type as anything in external_organs) + var/preference = initial(organ_type.preference) + if (!isnull(preference)) + features += preference + + GLOB.features_by_species[type] = features + + return features + +/// 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) + return + +/// Returns the species's scream sound. +/datum/species/proc/get_scream_sound(mob/living/carbon/human/human) + return + +/datum/species/proc/get_types_to_preload() + var/list/to_store = list() + to_store += mutant_organs + for(var/obj/item/organ/external/horny as anything in external_organs) + 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 + //We don't cache mutant hands because it's not constrained enough, too high a potential for failure + return to_store + + +/** + * Owner login + */ + +/** + * A simple proc to be overwritten if something needs to be done when a mob logs in. Does nothing by default. + * + * Arguments: + * * owner - The owner of our species. + */ +/datum/species/proc/on_owner_login(mob/living/carbon/human/owner) + return + +/** + * Gets a short description for the specices. Should be relatively succinct. + * Used in the preference menu. + * + * Returns a string. + */ +/datum/species/proc/get_species_description() + SHOULD_CALL_PARENT(FALSE) + + stack_trace("Species [name] ([type]) did not have a description set, and is a selectable roundstart race! Override get_species_description.") + return "No species description set, file a bug report!" + +/** + * Gets the lore behind the type of species. Can be long. + * Used in the preference menu. + * + * Returns a list of strings. + * Between each entry in the list, a newline will be inserted, for formatting. + */ +/datum/species/proc/get_species_lore() + SHOULD_CALL_PARENT(FALSE) + RETURN_TYPE(/list) + + stack_trace("Species [name] ([type]) did not have lore set, and is a selectable roundstart race! Override get_species_lore.") + return list("No species lore set, file a bug report!") + +/** + * Translate the species liked foods from bitfields into strings + * and returns it in the form of an associated list. + * + * Returns a list, or null if they have no diet. + */ +/datum/species/proc/get_species_diet() + if((TRAIT_NOHUNGER in inherent_traits) || !mutanttongue) + return null + + var/static/list/food_flags = FOOD_FLAGS + var/obj/item/organ/internal/tongue/fake_tongue = mutanttongue + + return list( + "liked_food" = bitfield_to_list(initial(fake_tongue.liked_foodtypes), food_flags), + "disliked_food" = bitfield_to_list(initial(fake_tongue.disliked_foodtypes), food_flags), + "toxic_food" = bitfield_to_list(initial(fake_tongue.toxic_foodtypes), food_flags), + ) + +/** + * Generates a list of "perks" related to this species + * (Postives, neutrals, and negatives) + * in the format of a list of lists. + * Used in the preference menu. + * + * "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_NAME = name of the perk on hover + * SPECIES_PERK_DESC = description of the perk on hover + * ) + * + * Returns a list of lists. + * 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() + 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, + // and language perk last, as it comes at the end of the perks list + species_perks += create_pref_unique_perks() + species_perks += create_pref_blood_perks() + species_perks += create_pref_damage_perks() + species_perks += create_pref_temperature_perks() + species_perks += create_pref_traits_perks() + species_perks += create_pref_biotypes_perks() + species_perks += create_pref_organs_perks() + species_perks += create_pref_language_perk() + + // Some overrides may return `null`, prevent those from jamming up the list. + list_clear_nulls(species_perks) + + // Now let's sort them out for cleanliness and sanity + var/list/perks_to_return = list( + SPECIES_POSITIVE_PERK = list(), + SPECIES_NEUTRAL_PERK = list(), + SPECIES_NEGATIVE_PERK = list(), + ) + + 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, + // it's a bad entry - don't add it to our list. Throw a stack trace and skip it instead. + if(isnull(perks_to_return[perk_type])) + stack_trace("Invalid species perk ([perk[SPECIES_PERK_NAME]]) found for species [name]. \ + The type should be positive, negative, or neutral. (Got: [perk_type])") + continue + + perks_to_return[perk_type] += list(perk) + + return perks_to_return + +/** + * Used to add any species specific perks to the perk list. + * + * Returns null by default. When overriding, return a list of perks. + */ +/datum/species/proc/create_pref_unique_perks() + return null + +/** + * Adds adds any perks related to sustaining damage. + * For example, brute damage vulnerability, or fire damage resistance. + * + * Returns a list containing perks, or an empty list. + */ +/datum/species/proc/create_pref_damage_perks() + // We use the chest to figure out brute and burn mod perks + var/obj/item/bodypart/chest/fake_chest = bodypart_overrides[BODY_ZONE_CHEST] + + var/list/to_add = list() + + // Brute related + if(initial(fake_chest.brute_modifier) > 1) + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, + SPECIES_PERK_ICON = "band-aid", + SPECIES_PERK_NAME = "Brutal Weakness", + SPECIES_PERK_DESC = "[plural_form] are weak to brute damage.", + )) + + if(initial(fake_chest.brute_modifier) < 1) + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, + SPECIES_PERK_ICON = "shield-alt", + SPECIES_PERK_NAME = "Brutal Resilience", + SPECIES_PERK_DESC = "[plural_form] are resilient to brute damage.", + )) + + // Burn related + if(initial(fake_chest.burn_modifier) > 1) + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, + SPECIES_PERK_ICON = "burn", + SPECIES_PERK_NAME = "Burn Weakness", + SPECIES_PERK_DESC = "[plural_form] are weak to burn damage.", + )) + + if(initial(fake_chest.burn_modifier) < 1) + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, + SPECIES_PERK_ICON = "shield-alt", + SPECIES_PERK_NAME = "Burn Resilience", + SPECIES_PERK_DESC = "[plural_form] are resilient to burn damage.", + )) + + // Shock damage + if(siemens_coeff > 1) + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, + SPECIES_PERK_ICON = "bolt", + SPECIES_PERK_NAME = "Shock Vulnerability", + SPECIES_PERK_DESC = "[plural_form] are vulnerable to being shocked.", + )) + + if(siemens_coeff < 1) + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, + SPECIES_PERK_ICON = "shield-alt", + SPECIES_PERK_NAME = "Shock Resilience", + SPECIES_PERK_DESC = "[plural_form] are resilient to being shocked.", + )) + + return to_add + +/** + * Adds adds any perks related to how the species deals with temperature. + * + * Returns a list containing perks, or an empty list. + */ +/datum/species/proc/create_pref_temperature_perks() + var/list/to_add = list() + + // Hot temperature tolerance + if(heatmod > 1 || bodytemp_heat_damage_limit < BODYTEMP_HEAT_DAMAGE_LIMIT) + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, + SPECIES_PERK_ICON = "temperature-high", + SPECIES_PERK_NAME = "Heat Vulnerability", + SPECIES_PERK_DESC = "[plural_form] are vulnerable to high temperatures.", + )) + + if(heatmod < 1 || bodytemp_heat_damage_limit > BODYTEMP_HEAT_DAMAGE_LIMIT) + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, + SPECIES_PERK_ICON = "thermometer-empty", + SPECIES_PERK_NAME = "Heat Resilience", + SPECIES_PERK_DESC = "[plural_form] are resilient to hotter environments.", + )) + + // Cold temperature tolerance + if(coldmod > 1 || bodytemp_cold_damage_limit > BODYTEMP_COLD_DAMAGE_LIMIT) + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, + SPECIES_PERK_ICON = "temperature-low", + SPECIES_PERK_NAME = "Cold Vulnerability", + SPECIES_PERK_DESC = "[plural_form] are vulnerable to cold temperatures.", + )) + + if(coldmod < 1 || bodytemp_cold_damage_limit < BODYTEMP_COLD_DAMAGE_LIMIT) + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, + SPECIES_PERK_ICON = "thermometer-empty", + SPECIES_PERK_NAME = "Cold Resilience", + SPECIES_PERK_DESC = "[plural_form] are resilient to colder environments.", + )) + + return to_add + +/** + * Adds adds any perks related to the species' blood (or lack thereof). + * + * Returns a list containing perks, or an empty list. + */ +/datum/species/proc/create_pref_blood_perks() + var/list/to_add = list() + + // TRAIT_NOBLOOD takes priority by default + if(TRAIT_NOBLOOD in inherent_traits) + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, + SPECIES_PERK_ICON = "tint-slash", + SPECIES_PERK_NAME = "Bloodletted", + SPECIES_PERK_DESC = "[plural_form] do not have blood.", + )) + + // Otherwise, check if their exotic blood is a valid typepath + else if(ispath(exotic_blood)) + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_NEUTRAL_PERK, + SPECIES_PERK_ICON = "tint", + SPECIES_PERK_NAME = initial(exotic_blood.name), + 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 + +/** + * Adds adds any perks related to the species' inherent_traits list. + * + * Returns a list containing perks, or an empty list. + */ +/datum/species/proc/create_pref_traits_perks() + var/list/to_add = list() + + if(TRAIT_LIMBATTACHMENT in inherent_traits) + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, + SPECIES_PERK_ICON = "user-plus", + SPECIES_PERK_NAME = "Limbs Easily Reattached", + SPECIES_PERK_DESC = "[plural_form] limbs are easily readded, and as such do not \ + require surgery to restore. Simply pick it up and pop it back in, champ!", + )) + + if(TRAIT_EASYDISMEMBER in inherent_traits) + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, + SPECIES_PERK_ICON = "user-times", + SPECIES_PERK_NAME = "Limbs Easily Dismembered", + 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, + SPECIES_PERK_ICON = "syringe", + SPECIES_PERK_NAME = "Toxins Lover", + SPECIES_PERK_DESC = "Toxins damage dealt to [plural_form] are reversed - healing toxins will instead cause harm, and \ + causing toxins will instead cause healing. Be careful around purging chemicals!", + )) + + if (TRAIT_GENELESS in inherent_traits) + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_NEUTRAL_PERK, + SPECIES_PERK_ICON = "dna", + SPECIES_PERK_NAME = "No Genes", + SPECIES_PERK_DESC = "[plural_form] have no genes, making genetic scrambling a useless weapon, but also locking them out from getting genetic powers.", + )) + + if (TRAIT_NOBREATH in inherent_traits) + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, + SPECIES_PERK_ICON = "wind", + SPECIES_PERK_NAME = "No Respiration", + SPECIES_PERK_DESC = "[plural_form] have no need to breathe!", + )) + + return to_add + +/** + * Adds adds any perks related to the species' inherent_biotypes flags. + * + * Returns a list containing perks, or an empty list. + */ +/datum/species/proc/create_pref_biotypes_perks() + var/list/to_add = list() + + if(inherent_biotypes & MOB_UNDEAD) + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, + SPECIES_PERK_ICON = "skull", + SPECIES_PERK_NAME = "Undead", + SPECIES_PERK_DESC = "[plural_form] are of the undead! The undead do not have the need to eat or breathe, and \ + most viruses will not be able to infect a walking corpse. Their worries mostly stop at remaining in one piece, really.", + )) + + return to_add + +/** + * Adds any perks relating to inherent differences to this species' organs. + * This proc is only suitable for generic differences, like alcohol tolerance, or heat threshold for breathing. + * + * Returns a list containing perks, or an empty list. + */ +/datum/species/proc/create_pref_organs_perks() + RETURN_TYPE(/list) + + var/list/to_add = list() + + to_add += create_pref_liver_perks() + to_add += create_pref_lung_perks() + + return to_add + +/datum/species/proc/create_pref_liver_perks() + RETURN_TYPE(/list) + + var/list/to_add = list() + + var/alcohol_tolerance = initial(mutantliver.alcohol_tolerance) + var/obj/item/organ/internal/liver/base_liver = /obj/item/organ/internal/liver + var/tolerance_difference = alcohol_tolerance - initial(base_liver.alcohol_tolerance) + + if (tolerance_difference != 0) + var/difference_positive = (tolerance_difference > 0) + var/more_or_less = (difference_positive) ? "more" : "less" + var/perk_type = (difference_positive) ? SPECIES_NEGATIVE_PERK : SPECIES_POSITIVE_PERK + var/perk_name = "Alcohol " + ((difference_positive) ? "Weakness" : "Tolerance") + var/percent_difference = (alcohol_tolerance / initial(base_liver.alcohol_tolerance)) * 100 + + to_add += list(list( + SPECIES_PERK_TYPE = perk_type, + SPECIES_PERK_ICON = "wine-glass", + SPECIES_PERK_NAME = perk_name, + SPECIES_PERK_DESC = "[name] livers are [more_or_less] susceptable to alcohol than human livers, by about [percent_difference]%." + )) + + var/tox_shrugging = initial(mutantliver.toxTolerance) + var/shrugging_difference = tox_shrugging - initial(base_liver.toxTolerance) + if (shrugging_difference != 0) + var/difference_positive = (shrugging_difference > 0) + var/more_or_less = (difference_positive) ? "more" : "less" + var/perk_type = (difference_positive) ? SPECIES_POSITIVE_PERK : SPECIES_NEGATIVE_PERK + var/perk_name = ("Toxin " + ((difference_positive) ? "Resistant" : "Vulnerable")) + " Liver" + + to_add += list(list( + SPECIES_PERK_TYPE = perk_type, + SPECIES_PERK_ICON = "biohazard", + SPECIES_PERK_NAME = perk_name, + SPECIES_PERK_DESC = "[name] livers are capable of rapidly shrugging off [tox_shrugging]u of toxins, which is [more_or_less] than humans." + )) + + return to_add + +/datum/species/proc/create_pref_lung_perks() + RETURN_TYPE(/list) + + var/list/to_add = list() + + if (breathid != GAS_O2) + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, + SPECIES_PERK_ICON = "wind", + SPECIES_PERK_NAME = "[capitalize(breathid)] Breathing", + SPECIES_PERK_DESC = "[plural_form] must breathe [breathid] to survive. You receive a tank when you arrive.", + )) + + return to_add + +/** + * Adds in a language perk based on all the languages the species + * can speak by default (according to their language holder). + * + * Returns a list containing perks, or an empty list. + */ +/datum/species/proc/create_pref_language_perk() + + // Grab galactic common as a path, for comparisons + var/datum/language/common_language = /datum/language/common + + // Now let's find all the languages they can speak that aren't common + var/list/bonus_languages = list() + var/datum/language_holder/basic_holder = GLOB.prototype_language_holders[species_language_holder] + for(var/datum/language/language_type as anything in basic_holder.spoken_languages) + if(ispath(language_type, common_language)) + continue + bonus_languages += initial(language_type.name) + + if(!length(bonus_languages)) + return // You're boring + + var/list/to_add = list() + if(common_language in basic_holder.spoken_languages) + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, + SPECIES_PERK_ICON = "comment", + SPECIES_PERK_NAME = "Native Speaker", + SPECIES_PERK_DESC = "Alongside [initial(common_language.name)], [plural_form] gain the ability to speak [english_list(bonus_languages)].", + )) + + else + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_NEUTRAL_PERK, + SPECIES_PERK_ICON = "comment", + SPECIES_PERK_NAME = "Foreign Speaker", + SPECIES_PERK_DESC = "[plural_form] may not speak [initial(common_language.name)], but they can speak [english_list(bonus_languages)].", + )) + + return to_add + +///Handles replacing all of the bodyparts with their species version during set_species() +/datum/species/proc/replace_body(mob/living/carbon/target, datum/species/new_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/list/final_bodypart_overrides = new_species.bodypart_overrides.Copy() + if((new_species.digitigrade_customization == DIGITIGRADE_OPTIONAL && target.dna.features["legs"] == DIGITIGRADE_LEGS) || new_species.digitigrade_customization == DIGITIGRADE_FORCED) + final_bodypart_overrides[BODY_ZONE_R_LEG] = /obj/item/bodypart/leg/right/digitigrade + final_bodypart_overrides[BODY_ZONE_L_LEG] = /obj/item/bodypart/leg/left/digitigrade + + for(var/obj/item/bodypart/old_part as anything in target.bodyparts) + if((old_part.change_exempt_flags & BP_BLOCK_CHANGE_SPECIES) || (old_part.bodypart_flags & BODYPART_IMPLANTED)) + continue + + var/path = final_bodypart_overrides?[old_part.body_zone] + var/obj/item/bodypart/new_part + if(path) + new_part = new path() + new_part.replace_limb(target, TRUE) + new_part.update_limb(is_creating = TRUE) + new_part.set_initial_damage(old_part.brute_dam, old_part.burn_dam) + 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) + +/** + * Checks if the species has a head with these head flags, by default. + * Admittedly, this is a very weird and seemingly redundant proc, but it + * gets used by some preferences (such as hair style) to determine whether + * or not they are accessible. + **/ +/datum/species/proc/check_head_flags(check_flags = NONE) + var/obj/item/bodypart/head/fake_head = bodypart_overrides[BODY_ZONE_HEAD] + return (initial(fake_head.head_flags) & check_flags) diff --git a/code/modules/mob/living/carbon/human/damage_procs.dm b/code/modules/mob/living/carbon/human/damage_procs.dm index 47cbbe12188e5..d4fc0b403656a 100644 --- a/code/modules/mob/living/carbon/human/damage_procs.dm +++ b/code/modules/mob/living/carbon/human/damage_procs.dm @@ -1,4 +1,4 @@ /// depending on the species, it will run the corresponding apply_damage code there -/mob/living/carbon/human/apply_damage(damage = 0, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE, attack_direction = null, attacking_item) +/mob/living/carbon/human/apply_damage(damage = 0, damagetype = BRUTE, def_zone = null, blocked = 0, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE, attack_direction = null, attacking_item) return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src, forced, spread_damage, wound_bonus, bare_wound_bonus, sharpness, attack_direction, attacking_item) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 74f9db5957dbc..b451d86935b55 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -5,8 +5,8 @@ GLOBAL_LIST_EMPTY(dead_players_during_shift) /mob/living/carbon/human/dust_animation() new /obj/effect/temp_visual/dust_animation(loc, dna.species.dust_anim) -/mob/living/carbon/human/spawn_gibs(with_bodyparts) - if(with_bodyparts) +/mob/living/carbon/human/spawn_gibs(drop_bitflags=NONE) + if(drop_bitflags & DROP_BODYPARTS) new /obj/effect/gibspawner/human(drop_location(), src, get_static_viruses()) else new /obj/effect/gibspawner/human/bodypartless(drop_location(), src, get_static_viruses()) diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index 81e9b8c875d43..eabca79d281b5 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -75,29 +75,43 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) cut_overlays(TRUE) /mob/living/carbon/human/dummy/setup_human_dna() - create_dna() - randomize_human(src) - dna.initialize_dna(skip_index = TRUE) //Skip stuff that requires full round init. + randomize_human(src, randomize_mutations = FALSE) /mob/living/carbon/human/dummy/log_mob_tag(text) return +/// 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 + /proc/create_consistent_human_dna(mob/living/carbon/human/target) - target.dna.initialize_dna(skip_index = TRUE) - target.dna.features["body_markings"] = "None" - target.dna.features["ears"] = "None" - target.dna.features["ethcolor"] = COLOR_WHITE - target.dna.features["frills"] = "None" - target.dna.features["horns"] = "None" target.dna.features["mcolor"] = COLOR_VIBRANT_LIME - target.dna.features["moth_antennae"] = "Plain" - target.dna.features["moth_markings"] = "None" - target.dna.features["moth_wings"] = "Plain" - target.dna.features["snout"] = "Round" - target.dna.features["spines"] = "None" - target.dna.features["tail_cat"] = "None" - target.dna.features["tail_lizard"] = "Smooth" - target.dna.features["pod_hair"] = "Ivy" + target.dna.features["ethcolor"] = COLOR_WHITE + target.dna.features["body_markings"] = get_consistent_feature_entry(GLOB.body_markings_list) + target.dna.features["ears"] = get_consistent_feature_entry(GLOB.ears_list) + target.dna.features["frills"] = get_consistent_feature_entry(GLOB.frills_list) + target.dna.features["horns"] = get_consistent_feature_entry(GLOB.horns_list) + target.dna.features["moth_antennae"] = get_consistent_feature_entry(GLOB.moth_antennae_list) + target.dna.features["moth_markings"] = get_consistent_feature_entry(GLOB.moth_markings_list) + target.dna.features["moth_wings"] = get_consistent_feature_entry(GLOB.moth_wings_list) + target.dna.features["snout"] = get_consistent_feature_entry(GLOB.snouts_list) + target.dna.features["spines"] = get_consistent_feature_entry(GLOB.spines_list) + target.dna.features["tail_cat"] = get_consistent_feature_entry(GLOB.tails_list_human) // it's a lie + target.dna.features["tail_lizard"] = get_consistent_feature_entry(GLOB.tails_list_lizard) + target.dna.features["pod_hair"] = get_consistent_feature_entry(GLOB.pod_hair_list) + target.dna.initialize_dna(create_mutation_blocks = FALSE, randomize_features = FALSE) + // UF and UI are nondeterministic, even though the features are the same some blocks will randomize slightly + // In practice this doesn't matter, but this is for the sake of 100%(ish) consistency + var/static/consistent_UF + var/static/consistent_UI + if(isnull(consistent_UF) || isnull(consistent_UI)) + consistent_UF = target.dna.unique_features + consistent_UI = target.dna.unique_identity + else + target.dna.unique_features = consistent_UF + target.dna.unique_identity = consistent_UI /// Provides a dummy that is consistently bald, white, naked, etc. /mob/living/carbon/human/dummy/consistent @@ -111,11 +125,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) /mob/living/carbon/human/consistent/setup_human_dna() create_consistent_human_dna(src) - -/mob/living/carbon/human/consistent/update_body(is_creating) - ..() - if(is_creating) - fully_replace_character_name(real_name, "John Doe") + fully_replace_character_name(real_name, "John Doe") /mob/living/carbon/human/consistent/domutcheck() return // We skipped adding any mutations so this runtimes diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 79e71ed014a72..8dc2e7bfc1a1a 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -20,13 +20,30 @@ key = "dap" key_third_person = "daps" message = "sadly can't find anybody to give daps to, and daps themself. Shameful." - message_param = "give daps to %t." + message_param = "gives daps to %t." hands_use_check = TRUE /datum/emote/living/carbon/human/eyebrow key = "eyebrow" message = "raises an eyebrow." +/datum/emote/living/carbon/human/glasses + key = "glasses" + key_third_person = "glasses" + message = "pushes up their glasses." + emote_type = EMOTE_VISIBLE + +/datum/emote/living/carbon/human/glasses/can_run_emote(mob/user, status_check = TRUE, intentional) + var/obj/eyes_slot = user.get_item_by_slot(ITEM_SLOT_EYES) + if(istype(eyes_slot, /obj/item/clothing/glasses/regular) || istype(eyes_slot, /obj/item/clothing/glasses/sunglasses)) + return ..() + return FALSE + +/datum/emote/living/carbon/human/glasses/run_emote(mob/user, params, type_override, intentional) + . = ..() + var/image/emote_animation = image('icons/mob/human/emote_visuals.dmi', user, "glasses") + flick_overlay_global(emote_animation, GLOB.clients, 1.6 SECONDS) + /datum/emote/living/carbon/human/grumble key = "grumble" key_third_person = "grumbles" @@ -141,28 +158,25 @@ /datum/emote/living/carbon/human/wing/run_emote(mob/user, params, type_override, intentional) . = ..() - if(.) - var/mob/living/carbon/human/H = user - var/obj/item/organ/external/wings/functional/wings = H.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) - if(wings && findtext(select_message_type(user,intentional), "open")) - wings.open_wings() - else - wings.close_wings() + if(!.) + return + var/obj/item/organ/external/wings/functional/wings = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) + if(isnull(wings)) + CRASH("[type] ran on a mob that has no wings!") + if(wings.wings_open) + wings.close_wings() + else + wings.open_wings() /datum/emote/living/carbon/human/wing/select_message_type(mob/user, intentional) - . = ..() - var/mob/living/carbon/human/H = user - if(H.dna.species.mutant_bodyparts["wings"]) - . = "opens " + message - else - . = "closes " + message + var/obj/item/organ/external/wings/functional/wings = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) + var/emote_verb = wings.wings_open ? "closes" : "opens" + return "[emote_verb] [message]" /datum/emote/living/carbon/human/wing/can_run_emote(mob/user, status_check = TRUE, intentional) - if(!..()) + if(!istype(user.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS), /obj/item/organ/external/wings/functional)) return FALSE - var/mob/living/carbon/human/H = user - if(H.dna && H.dna.species && (H.dna.features["wings"] != "None")) - return TRUE + return ..() /datum/emote/living/carbon/human/clear_throat key = "clear" diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 6b4df5b3697e4..ff013ca09d372 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -1,7 +1,7 @@ /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) - var/t_His = p_their(TRUE) + var/t_He = p_They() + var/t_His = p_Their() var/t_his = p_their() var/t_him = p_them() var/t_has = p_have() @@ -27,13 +27,14 @@ //uniform if(w_uniform && !(obscured & ITEM_SLOT_ICLOTHING) && !(w_uniform.item_flags & EXAMINE_SKIP)) //accessory - var/accessory_msg + var/accessory_message = "" 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]" + var/obj/item/clothing/under/undershirt = w_uniform + var/list/accessories = undershirt.list_accessories_with_icon(user) + if(length(accessories)) + accessory_message = " with [english_list(accessories)] attached" - . += "[t_He] [t_is] wearing [w_uniform.get_examine_string(user)][accessory_msg]." + . += "[t_He] [t_is] wearing [w_uniform.get_examine_string(user)][accessory_message]." //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." @@ -115,7 +116,7 @@ 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.mind, TRAIT_NAIVE) || are_we_in_weekend_at_bernies)) + if(isliving(user) && (HAS_MIND_TRAIT(user, TRAIT_NAIVE) || are_we_in_weekend_at_bernies)) just_sleeping = TRUE if(!just_sleeping) @@ -237,7 +238,7 @@ msg += "[t_He] look[p_s()] extremely disgusted.\n" var/apparent_blood_volume = blood_volume - if(dna.species.use_skintones && skin_tone == "albino") + if(HAS_TRAIT(src, TRAIT_USES_SKINTONES) && (skin_tone == "albino")) apparent_blood_volume -= 150 // enough to knock you down one tier switch(apparent_blood_volume) if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE) @@ -291,11 +292,6 @@ if(reagents.has_reagent(/datum/reagent/teslium, needs_metabolizing = TRUE)) msg += "[t_He] [t_is] emitting a gentle blue glow!\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" @@ -365,6 +361,14 @@ if (!isnull(trait_exam)) . += trait_exam + if(isliving(user)) + var/mob/living/morbid_weirdo = user + if(HAS_MIND_TRAIT(morbid_weirdo, TRAIT_MORBID)) + if(HAS_TRAIT(src, TRAIT_DISSECTED)) + msg += "[span_notice("[t_He] appears to have been dissected. Useless for examination... for now.")]\n" + if(HAS_TRAIT(src, TRAIT_SURGICALLY_ANALYZED)) + msg += "[span_notice("A skilled hand has mapped this one's internal intricacies. It will be far easier to perform future experimentations upon [t_him]. Exquisite.")]\n" + var/perpname = get_face_name(get_id_name("")) if(perpname && (HAS_TRAIT(user, TRAIT_SECURITY_HUD) || HAS_TRAIT(user, TRAIT_MEDICAL_HUD))) var/datum/record/crew/target_record = find_record(perpname) @@ -372,9 +376,9 @@ . += "Rank: [target_record.rank]\n\[Front photo\]\[Side photo\]" if(HAS_TRAIT(user, TRAIT_MEDICAL_HUD)) var/cyberimp_detect - for(var/obj/item/organ/internal/cyberimp/CI in organs) - if(CI.status == ORGAN_ROBOTIC && !(CI.organ_flags & ORGAN_HIDDEN)) - cyberimp_detect += "[!cyberimp_detect ? "[CI.get_examine_string(user)]" : ", [CI.get_examine_string(user)]"]" + for(var/obj/item/organ/internal/cyberimp/cyberimp in organs) + if(IS_ROBOTIC_ORGAN(cyberimp) && !(cyberimp.organ_flags & ORGAN_HIDDEN)) + cyberimp_detect += "[!cyberimp_detect ? "[cyberimp.get_examine_string(user)]" : ", [cyberimp.get_examine_string(user)]"]" if(cyberimp_detect) . += "Detected cybernetic modifications:" . += "[cyberimp_detect]" @@ -448,4 +452,4 @@ 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].")) + . += list(span_notice("[p_They()] appear[p_s()] to be [age_text].")) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index cf1f4dd106c07..a4cab428111e3 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -7,6 +7,8 @@ setup_mood() // This needs to be called very very early in human init (before organs / species are created at the minimum) setup_organless_effects() + // Physiology needs to be created before species, as some species modify physiology + setup_physiology() create_dna() dna.species.create_fresh_body(src) @@ -17,8 +19,6 @@ prepare_huds() //Prevents a nasty runtime on human init - physiology = new() - . = ..() RegisterSignal(src, COMSIG_COMPONENT_CLEAN_FACE_ACT, PROC_REF(clean_face)) @@ -33,6 +33,9 @@ AddElement(/datum/element/connect_loc, loc_connections) GLOB.human_list += src +/mob/living/carbon/human/proc/setup_physiology() + physiology = new() + /mob/living/carbon/human/proc/setup_mood() if (CONFIG_GET(flag/disable_human_mood)) return @@ -50,13 +53,12 @@ ADD_TRAIT(src, TRAIT_AGEUSIA, NO_TONGUE_TRAIT) /mob/living/carbon/human/proc/setup_human_dna() - //initialize dna. for spawned humans; overwritten by other code - randomize_human(src) - dna.initialize_dna() + randomize_human(src, randomize_mutations = TRUE) /mob/living/carbon/human/Destroy() QDEL_NULL(physiology) - QDEL_LIST(bioware) + if(biowares) + QDEL_LIST(biowares) GLOB.human_list -= src if (mob_mood) @@ -199,7 +201,7 @@ return if(href_list["quirk"]) - var/quirkstring = get_quirk_string(TRUE, CAT_QUIRK_ALL) + var/quirkstring = get_quirk_string(TRUE, CAT_QUIRK_ALL, from_scan = TRUE) if(quirkstring) to_chat(human_user, "Detected physiological traits:\n[quirkstring]") else @@ -332,7 +334,7 @@ var/obj/item/bodypart/the_part = isbodypart(target_zone) ? target_zone : get_bodypart(check_zone(target_zone)) //keep these synced // 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)) + for(var/obj/item/clothing/iter_clothing in get_clothing_on_part(the_part)) if(iter_clothing.clothing_flags & THICKMATERIAL) . = FALSE break @@ -418,10 +420,10 @@ //Used for new human mobs created by cloning/goleming/podding /mob/living/carbon/human/proc/set_cloned_appearance() if(gender == MALE) - facial_hairstyle = "Full Beard" + set_facial_hairstyle("Full Beard", update = FALSE) else - facial_hairstyle = "Shaved" - hairstyle = pick("Bedhead", "Bedhead 2", "Bedhead 3") + set_facial_hairstyle("Shaved", update = FALSE) + set_hairstyle(pick("Bedhead", "Bedhead 2", "Bedhead 3"), update = FALSE) underwear = "Nude" update_body(is_creating = TRUE) @@ -479,7 +481,10 @@ return FALSE visible_message(span_notice("[src] performs CPR on [target.name]!"), span_notice("You perform CPR on [target.name].")) - add_mood_event("saved_life", /datum/mood_event/saved_life) + if(HAS_MIND_TRAIT(src, TRAIT_MORBID)) + add_mood_event("morbid_saved_life", /datum/mood_event/morbid_saved_life) + else + add_mood_event("saved_life", /datum/mood_event/saved_life) log_combat(src, target, "CPRed") if (HAS_TRAIT(target, TRAIT_NOBREATH)) @@ -528,30 +533,6 @@ return TRUE -/** - * Used to update the makeup on a human and apply/remove lipstick traits, then store/unstore them on the head object in case it gets severed - */ -/mob/living/carbon/human/proc/update_lips(new_style, new_colour, apply_trait) - lip_style = new_style - lip_color = new_colour - update_body() - - var/obj/item/bodypart/head/hopefully_a_head = get_bodypart(BODY_ZONE_HEAD) - REMOVE_TRAITS_IN(src, LIPSTICK_TRAIT) - hopefully_a_head?.stored_lipstick_trait = null - - if(new_style && apply_trait) - ADD_TRAIT(src, apply_trait, LIPSTICK_TRAIT) - hopefully_a_head?.stored_lipstick_trait = apply_trait - -/** - * A wrapper for [mob/living/carbon/human/proc/update_lips] that tells us if there were lip styles to change - */ -/mob/living/carbon/human/proc/clean_lips() - if(isnull(lip_style) && lip_color == initial(lip_color)) - return FALSE - update_lips(null) - return TRUE /** * Called on the COMSIG_COMPONENT_CLEAN_FACE_ACT signal @@ -706,7 +687,7 @@ if(heal_flags & HEAL_NEGATIVE_MUTATIONS) for(var/datum/mutation/human/existing_mutation in dna.mutations) if(existing_mutation.quality != POSITIVE) - dna.remove_mutation(existing_mutation.name) + dna.remove_mutation(existing_mutation) if(heal_flags & HEAL_TEMP) set_coretemperature(get_body_temp_normal(apply_change = FALSE)) @@ -714,15 +695,21 @@ return ..() -/mob/living/carbon/human/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, vomit_type = VOMIT_TOXIC, harm = TRUE, force = FALSE, purge_ratio = 0.1) - if(blood && HAS_TRAIT(src, TRAIT_NOBLOOD) && !HAS_TRAIT(src, TRAIT_TOXINLOVER)) - if(message) - visible_message(span_warning("[src] dry heaves!"), \ - span_userdanger("You try to throw up, but there's nothing in your stomach!")) - if(stun) - Stun(20 SECONDS) - return 1 - ..() +/mob/living/carbon/human/vomit(vomit_flags = VOMIT_CATEGORY_DEFAULT, vomit_type = /obj/effect/decal/cleanable/vomit/toxic, lost_nutrition = 10, distance = 1, purge_ratio = 0.1) + if(!((vomit_flags & MOB_VOMIT_BLOOD) && HAS_TRAIT(src, TRAIT_NOBLOOD) && !HAS_TRAIT(src, TRAIT_TOXINLOVER))) + return ..() + + if(vomit_flags & MOB_VOMIT_MESSAGE) + visible_message( + span_warning("[src] dry heaves!"), + span_userdanger("You try to throw up, but there's nothing in your stomach!"), + ) + if(vomit_flags & MOB_VOMIT_STUN) + Stun(20 SECONDS) + if(vomit_flags & MOB_VOMIT_KNOCKDOWN) + Knockdown(20 SECONDS) + + return TRUE /mob/living/carbon/human/vv_edit_var(var_name, var_value) if(var_name == NAMEOF(src, mob_height)) @@ -753,6 +740,7 @@ 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") + VV_DROPDOWN_OPTION(VV_HK_APPLY_DNA_INFUSION, "Apply DNA Infusion") /mob/living/carbon/human/vv_do_topic(list/href_list) . = ..() @@ -833,6 +821,19 @@ var/msg = span_notice("[key_name_admin(usr)] has removed [key_name(src)] from purrbation.") message_admins(msg) admin_ticket_log(src, msg) + if(href_list[VV_HK_APPLY_DNA_INFUSION]) + if(!check_rights(R_SPAWN)) + return + if(!ishuman(src)) + to_chat(usr, "This can only be done to human species.") + return + var/result = usr.client.grant_dna_infusion(src) + if(result) + to_chat(usr, "Successfully applied DNA Infusion [result] to [src].") + log_admin("[key_name(usr)] has applied DNA Infusion [result] to [key_name(src)].") + else + to_chat(usr, "Failed to apply DNA Infusion to [src].") + log_admin("[key_name(usr)] failed to apply a DNA Infusion to [key_name(src)].") /mob/living/carbon/human/limb_attack_self() var/obj/item/bodypart/arm = hand_bodyparts[active_hand_index] @@ -914,9 +915,14 @@ return ..() +/mob/living/carbon/human/reagent_check(datum/reagent/chem, seconds_per_tick, times_fired) + . = ..() + if(. & COMSIG_MOB_STOP_REAGENT_CHECK) + return + return dna.species.handle_chemical(chem, src, seconds_per_tick, times_fired) + /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) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 9659d0c66fdd7..fafc9b49a69d9 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -6,21 +6,21 @@ if(isbodypart(def_zone)) var/obj/item/bodypart/bp = def_zone if(bp) - return checkarmor(def_zone, type) + return check_armor(def_zone, type) var/obj/item/bodypart/affecting = get_bodypart(check_zone(def_zone)) if(affecting) - return checkarmor(affecting, type) + return check_armor(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 - armorval += checkarmor(BP, type) + armorval += check_armor(BP, type) organnum++ return (armorval/max(organnum, 1)) -/mob/living/carbon/human/proc/checkarmor(obj/item/bodypart/def_zone, damage_type) +/mob/living/carbon/human/proc/check_armor(obj/item/bodypart/def_zone, damage_type) if(!damage_type) return 0 var/protection = 100 @@ -32,7 +32,7 @@ return 100 - protection ///Get all the clothing on a specific body part -/mob/living/carbon/human/proc/clothingonpart(obj/item/bodypart/def_zone) +/mob/living/carbon/human/proc/get_clothing_on_part(obj/item/bodypart/def_zone) var/list/covering_part = list() 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) @@ -280,20 +280,29 @@ if(!.) return - if(LAZYACCESS(modifiers, RIGHT_CLICK)) //Always drop item in hand, if no item, get stun instead. + if(LAZYACCESS(modifiers, RIGHT_CLICK)) //Always drop item in hand if there is one. If there's no item, shove the target. If the target is incapacitated, slam them into the ground to stun them. var/obj/item/I = get_active_held_item() if(I && dropItemToGround(I)) playsound(loc, 'sound/weapons/slash.ogg', 25, TRUE, -1) visible_message(span_danger("[user] disarms [src]!"), \ span_userdanger("[user] disarms you!"), span_hear("You hear aggressive shuffling!"), null, user) to_chat(user, span_danger("You disarm [src]!")) - else + else if(!HAS_TRAIT(src, TRAIT_INCAPACITATED)) playsound(loc, 'sound/weapons/pierce.ogg', 25, TRUE, -1) - Paralyze(100) - log_combat(user, src, "tackled") - visible_message(span_danger("[user] tackles [src] down!"), \ - span_userdanger("[user] tackles you down!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), null, user) - to_chat(user, span_danger("You tackle [src] down!")) + var/shovetarget = get_edge_target_turf(user, get_dir(user, get_step_away(src, user))) + adjustStaminaLoss(35) + throw_at(shovetarget, 4, 2, user, force = MOVE_FORCE_OVERPOWERING) + log_combat(user, src, "shoved") + visible_message("[user] tackles [src] down!", \ + "[user] shoves you with great force!", "You hear aggressive shuffling followed by a loud thud!", null, user) + to_chat(user, "You shove [src] with great force!") + else + Paralyze(5 SECONDS) + playsound(loc, 'sound/weapons/punch3.ogg', 25, TRUE, -1) + visible_message("[user] slams [src] into the floor!", \ + "[user] slams you into the ground!", "You hear something slam loudly onto the floor!", null, user) + to_chat(user, "You slam [src] into the floor beneath you!") + log_combat(user, src, "slammed into the ground") return TRUE if(user.combat_mode) @@ -403,7 +412,7 @@ if(EXPLODE_LIGHT) SSexplosions.low_mov_atom += thing investigate_log("has been gibbed by an explosion.", INVESTIGATE_DEATHS) - gib() + gib(DROP_ALL_REMAINS) return TRUE else brute_loss = 500 @@ -473,7 +482,7 @@ ///Calculates the siemens coeff based on clothing and species, can also restart hearts. -/mob/living/carbon/human/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE) +/mob/living/carbon/human/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE, jitter_time = 20 SECONDS, stutter_time = 4 SECONDS, stun_duration = 4 SECONDS) //Calculates the siemens coeff based on clothing. Completely ignores the arguments if(flags & SHOCK_TESLA) //I hate this entire block. This gets the siemens_coeff for tesla shocks if(gloves && gloves.siemens_coefficient <= 0) @@ -502,14 +511,8 @@ var/obj/item/organ/internal/heart/heart = get_organ_slot(ORGAN_SLOT_HEART) if(heart.Restart() && stat == CONSCIOUS) to_chat(src, span_notice("You feel your heart beating again!")) - electrocution_animation(40) - -/mob/living/carbon/human/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_CONTENTS) - return - for(var/obj/item/bodypart/L as anything in src.bodyparts) - L.emp_act() + if (!(flags & SHOCK_NO_HUMAN_ANIM)) + electrocution_animation(4 SECONDS) /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 var/list/damaged = list() @@ -631,8 +634,8 @@ if(prob(min(acidpwr*acid_volume/10, 90))) //Applies disfigurement affecting.receive_damage(acidity, 2*acidity) emote("scream") - facial_hairstyle = "Shaved" - hairstyle = "Bald" + set_facial_hairstyle("Shaved", update = FALSE) + set_hairstyle("Bald", update = FALSE) update_body_parts() ADD_TRAIT(src, TRAIT_DISFIGURED, TRAIT_GENERIC) @@ -865,7 +868,7 @@ * */ -/mob/living/carbon/human/proc/burn_clothing(seconds_per_tick, times_fired, stacks) +/mob/living/carbon/human/proc/burn_clothing(seconds_per_tick, stacks) var/list/burning_items = list() var/obscured = check_obscured_slots(TRUE) //HEAD// @@ -912,10 +915,10 @@ for(var/obj/item/burning in burning_items) burning.fire_act((stacks * 25 * seconds_per_tick)) //damage taken is reduced to 2% of this value by fire_act() -/mob/living/carbon/human/on_fire_stack(seconds_per_tick, times_fired, datum/status_effect/fire_handler/fire_stacks/fire_handler) +/mob/living/carbon/human/on_fire_stack(seconds_per_tick, datum/status_effect/fire_handler/fire_stacks/fire_handler) SEND_SIGNAL(src, COMSIG_HUMAN_BURNING) - burn_clothing(seconds_per_tick, times_fired, fire_handler.stacks) + burn_clothing(seconds_per_tick, fire_handler.stacks) var/no_protection = FALSE if(dna && dna.species) - no_protection = dna.species.handle_fire(src, seconds_per_tick, times_fired, no_protection) - fire_handler.harm_human(seconds_per_tick, times_fired, no_protection) + no_protection = dna.species.handle_fire(src, seconds_per_tick, no_protection) + fire_handler.harm_human(seconds_per_tick, no_protection) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 3e4006dceff87..88e5941b5e51e 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -2,7 +2,7 @@ /mob/living/carbon/human name = "Unknown" real_name = "Unknown" - icon = 'icons/mob/species/human/human.dmi' + icon = 'icons/mob/human/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) @@ -12,6 +12,7 @@ buckle_lying = 0 mob_biotypes = MOB_ORGANIC|MOB_HUMANOID can_be_shoved_into = TRUE + initial_language_holder = /datum/language_holder/empty // We get stuff from our species //Hair colour and style var/hair_color = "#000000" @@ -35,10 +36,13 @@ var/skin_tone = "caucasian1" //Skin tone var/lip_style = null //no lipstick by default- arguably misleading, as it could be used for general makeup - var/lip_color = "white" + var/lip_color = COLOR_WHITE var/age = 30 //Player's age + /// Which body type to use + var/physique = MALE + //consider updating /mob/living/carbon/human/copy_clothing_prefs() if adding more of these var/underwear = "Nude" //Which underwear the player wants var/underwear_color = "#000000" @@ -58,11 +62,9 @@ var/special_voice = "" // For changing our voice. Used by a symptom. - var/name_override //For temporary visible name changes - var/datum/physiology/physiology - var/list/datum/bioware = list() + var/list/datum/bioware/biowares /// What types of mobs are allowed to ride/buckle to this mob var/static/list/can_ride_typecache = typecacheof(list(/mob/living/carbon/human, /mob/living/simple_animal/slime, /mob/living/simple_animal/parrot)) @@ -70,8 +72,6 @@ var/account_id var/hardcore_survival_score = 0 - /// Which body type to use - var/physique = MALE /// How many "units of blood" we have on our hands var/blood_in_hands = 0 diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 7a0ade3707a61..818ca1cf860a4 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -58,12 +58,14 @@ //repurposed proc. Now it combines get_id_name() and get_face_name() to determine a mob's name variable. Made into a separate proc as it'll be useful elsewhere /mob/living/carbon/human/get_visible_name() - var/face_name = get_face_name("") - var/id_name = get_id_name("") if(HAS_TRAIT(src, TRAIT_UNKNOWN)) return "Unknown" - if(name_override) - return name_override + var/list/identity = list(null, null) + SEND_SIGNAL(src, COMSIG_HUMAN_GET_VISIBLE_NAME, identity) + var/signal_face = LAZYACCESS(identity, VISIBLE_NAME_FACE) + var/signal_id = LAZYACCESS(identity, VISIBLE_NAME_ID) + var/face_name = !isnull(signal_face) ? signal_face : get_face_name("") + var/id_name = !isnull(signal_id) ? signal_id : get_id_name("") if(face_name) if(id_name && (id_name != face_name)) return "[face_name] (as [id_name])" @@ -110,10 +112,6 @@ //Check inventory slots return (wear_id?.GetID() || belt?.GetID()) -/mob/living/carbon/human/reagent_check(datum/reagent/R, seconds_per_tick, times_fired) - return dna.species.handle_chemicals(R, src, seconds_per_tick, 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. - /mob/living/carbon/human/can_use_guns(obj/item/G) . = ..() if(G.trigger_guard == TRIGGER_GUARD_NORMAL) @@ -171,13 +169,15 @@ if(LAZYLEN(scar_data) != SCAR_SAVE_LENGTH) return // invalid, should delete var/version = text2num(scar_data[SCAR_SAVE_VERS]) - if(!version || version < SCAR_CURRENT_VERSION) // get rid of old scars + if(!version || version != SCAR_CURRENT_VERSION) // get rid of scars using a incompatable version return if(specified_char_index && (mind?.original_character_slot_index != specified_char_index)) return + if (isnull(text2num(scar_data[SCAR_SAVE_BIOLOGY]))) + return var/obj/item/bodypart/the_part = get_bodypart("[scar_data[SCAR_SAVE_ZONE]]") var/datum/scar/scaries = new - return scaries.load(the_part, scar_data[SCAR_SAVE_VERS], scar_data[SCAR_SAVE_DESC], scar_data[SCAR_SAVE_PRECISE_LOCATION], text2num(scar_data[SCAR_SAVE_SEVERITY]), text2num(scar_data[SCAR_SAVE_BIOLOGY]), text2num(scar_data[SCAR_SAVE_CHAR_SLOT])) + return scaries.load(the_part, scar_data[SCAR_SAVE_VERS], scar_data[SCAR_SAVE_DESC], scar_data[SCAR_SAVE_PRECISE_LOCATION], text2num(scar_data[SCAR_SAVE_SEVERITY]), text2num(scar_data[SCAR_SAVE_BIOLOGY]), text2num(scar_data[SCAR_SAVE_CHAR_SLOT]), text2num(scar_data[SCAR_SAVE_CHECK_ANY_BIO])) /// Read all the scars we have for the designated character/scar slots, verify they're good/dump them if they're old/wrong format, create them on the user, and write the scars that passed muster back to the file /mob/living/carbon/human/proc/load_persistent_scars() @@ -230,7 +230,7 @@ ///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_He = p_They() var/t_his = p_their() var/t_is = p_are() //This checks to see if the body is revivable @@ -259,6 +259,8 @@ if (preference.is_randomizable()) preference.apply_to_human(src, preference.create_random_value(preferences)) + fully_replace_character_name(real_name, dna.species.random_name()) + /** * Setter for mob height * diff --git a/code/modules/mob/living/carbon/human/human_say.dm b/code/modules/mob/living/carbon/human/human_say.dm index 7089e5ed048c7..27298f466ddf5 100644 --- a/code/modules/mob/living/carbon/human/human_say.dm +++ b/code/modules/mob/living/carbon/human/human_say.dm @@ -82,7 +82,3 @@ return ITALICS | REDUCE_RANGE return FALSE - -/mob/living/carbon/human/get_alt_name() - if(name != GetVoice()) - return " (as [get_id_name("Unknown")])" 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 7592ab7aa96af..d49da7e84d658 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -102,12 +102,12 @@ There are several things that need to be remembered: var/icon_file var/woman //BEGIN SPECIES HANDLING - if((dna?.species.bodytype & BODYTYPE_MONKEY) && (uniform.supports_variations_flags & CLOTHING_MONKEY_VARIATION)) + if((bodytype & BODYTYPE_MONKEY) && (uniform.supports_variations_flags & CLOTHING_MONKEY_VARIATION)) icon_file = MONKEY_UNIFORM_FILE - else if((dna?.species.bodytype & BODYTYPE_DIGITIGRADE) && (uniform.supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION)) + else if((bodytype & BODYTYPE_DIGITIGRADE) && (uniform.supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION)) icon_file = DIGITIGRADE_UNIFORM_FILE //Female sprites have lower priority than digitigrade sprites - else if(dna.species.sexes && (dna.species.bodytype & BODYTYPE_HUMANOID) && physique == FEMALE && !(uniform.female_sprite_flags & NO_FEMALE_UNIFORM)) //Agggggggghhhhh + else if(dna.species.sexes && (bodytype & BODYTYPE_HUMANOID) && physique == FEMALE && !(uniform.female_sprite_flags & NO_FEMALE_UNIFORM)) //Agggggggghhhhh woman = TRUE if(!icon_exists(icon_file, RESOLVE_ICON_STATE(uniform))) @@ -190,7 +190,8 @@ There are several things that need to be remembered: var/mutable_appearance/gloves_overlay = gloves.build_worn_icon(default_layer = GLOVES_LAYER, default_icon_file = icon_file) var/feature_y_offset = 0 - for (var/obj/item/bodypart/arm/my_hand as anything in hand_bodyparts) + //needs to be typed, hand_bodyparts can have nulls + for (var/obj/item/bodypart/arm/my_hand in hand_bodyparts) var/list/glove_offset = my_hand.worn_glove_offset?.get_offset() if (glove_offset && (!feature_y_offset || glove_offset["y"] > feature_y_offset)) feature_y_offset = glove_offset["y"] @@ -759,31 +760,12 @@ generate/load female uniform sprites matching all previously decided variables var/obj/item/bodypart/head/my_head = get_bodypart(BODY_ZONE_HEAD) - if (!istype(my_head)) + if(!istype(my_head)) return my_head.update_limb(is_creating = update_limb_data) add_overlay(my_head.get_limb_icon()) - update_damage_overlays() - - if(my_head && !(HAS_TRAIT(src, TRAIT_HUSK))) - // lipstick - if(lip_style && (LIPS in dna.species.species_traits)) - var/mutable_appearance/lip_overlay = mutable_appearance('icons/mob/species/human/human_face.dmi', "lips_[lip_style]", -BODY_LAYER) - lip_overlay.color = lip_color - my_head.worn_face_offset?.apply_offset(lip_overlay) - add_overlay(lip_overlay) - - // eyes - if(!(NOEYESPRITES in dna.species.species_traits)) - var/obj/item/organ/internal/eyes/parent_eyes = get_organ_slot(ORGAN_SLOT_EYES) - if(parent_eyes) - add_overlay(parent_eyes.generate_body_overlay(src)) - else - var/mutable_appearance/missing_eyes = mutable_appearance('icons/mob/species/human/human_face.dmi', "eyes_missing", -BODY_LAYER) - my_head.worn_face_offset?.apply_offset(missing_eyes) - add_overlay(missing_eyes) update_worn_head() update_worn_mask() diff --git a/code/modules/mob/living/carbon/human/init_signals.dm b/code/modules/mob/living/carbon/human/init_signals.dm index 44a377c2b3da4..9a4a55bb7ac1f 100644 --- a/code/modules/mob/living/carbon/human/init_signals.dm +++ b/code/modules/mob/living/carbon/human/init_signals.dm @@ -3,6 +3,7 @@ RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_UNKNOWN), SIGNAL_REMOVETRAIT(TRAIT_UNKNOWN)), PROC_REF(on_unknown_trait)) RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_DWARF), SIGNAL_REMOVETRAIT(TRAIT_DWARF)), PROC_REF(on_dwarf_trait)) + RegisterSignal(src, COMSIG_MOVABLE_MESSAGE_GET_NAME_PART, PROC_REF(get_name_part)) /// Gaining or losing [TRAIT_UNKNOWN] updates our name and our sechud /mob/living/carbon/human/proc/on_unknown_trait(datum/source) @@ -22,3 +23,18 @@ passtable_on(src, TRAIT_DWARF) else passtable_off(src, TRAIT_DWARF) + +///From compose_message(). Snowflake code converted into its own signal proc +/mob/living/carbon/human/proc/get_name_part(datum/source, list/stored_name, visible_name) + SIGNAL_HANDLER + /** + * For if the message can be seen but not heard, shows our visible identity (like when using sign language) + * Also used by hallucinations, so it doesn't give source's identity away. + */ + if(visible_name) + stored_name[NAME_PART_INDEX] = get_visible_name() + return + var/voice_name = GetVoice() + if(name != voice_name) + voice_name += " (as [get_id_name("Unknown")])" + stored_name[NAME_PART_INDEX] = voice_name diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 6686725f65b48..47687d530485c 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -1,8 +1,8 @@ -/mob/living/carbon/human/can_equip(obj/item/equip_target, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE, ignore_equipped = FALSE) +/mob/living/carbon/human/can_equip(obj/item/equip_target, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE, ignore_equipped = FALSE, indirect_action = FALSE) if(SEND_SIGNAL(src, COMSIG_HUMAN_EQUIPPING_ITEM, equip_target, slot) == COMPONENT_BLOCK_EQUIP) return FALSE - return dna.species.can_equip(equip_target, slot, disable_warning, src, bypass_equip_delay_self, ignore_equipped) + return dna.species.can_equip(equip_target, slot, disable_warning, src, bypass_equip_delay_self, ignore_equipped, indirect_action) /mob/living/carbon/human/get_item_by_slot(slot_id) switch(slot_id) @@ -142,7 +142,7 @@ //This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible() // Initial is used to indicate whether or not this is the initial equipment (job datums etc) or just a player doing it -/mob/living/carbon/human/equip_to_slot(obj/item/I, slot, initial = FALSE, redraw_mob = FALSE) +/mob/living/carbon/human/equip_to_slot(obj/item/equipping, slot, initial = FALSE, redraw_mob = FALSE, indirect_action = FALSE) if(!..()) //a check failed or the item has already found its slot return @@ -151,48 +151,47 @@ if(ITEM_SLOT_BELT) if(belt) return - belt = I + belt = equipping update_worn_belt() if(ITEM_SLOT_ID) if(wear_id) return - wear_id = I + wear_id = equipping sec_hud_set_ID() update_worn_id() if(ITEM_SLOT_EARS) if(ears) return - ears = I + ears = equipping update_inv_ears() if(ITEM_SLOT_EYES) if(glasses) return - glasses = I - var/obj/item/clothing/glasses/G = I - if(G.glass_colour_type) - update_glasses_color(G, 1) - if(G.tint) + glasses = equipping + if(glasses.glass_colour_type) + update_glasses_color(glasses, 1) + if(glasses.tint) update_tint() - if(G.vision_flags || G.invis_override || G.invis_view || !isnull(G.lighting_cutoff)) + if(glasses.vision_flags || glasses.invis_override || glasses.invis_view || !isnull(glasses.lighting_cutoff)) update_sight() update_worn_glasses() if(ITEM_SLOT_GLOVES) if(gloves) return - gloves = I + gloves = equipping update_worn_gloves() if(ITEM_SLOT_FEET) if(shoes) return - shoes = I + shoes = equipping update_worn_shoes() if(ITEM_SLOT_OCLOTHING) if(wear_suit) return - wear_suit = I + wear_suit = equipping - if(I.flags_inv & HIDEJUMPSUIT) + if(equipping.flags_inv & HIDEJUMPSUIT) update_worn_undersuit() if(wear_suit.breakouttime) //when equipping a straightjacket ADD_TRAIT(src, TRAIT_RESTRAINED, SUIT_TRAIT) @@ -202,30 +201,30 @@ if(ITEM_SLOT_ICLOTHING) if(w_uniform) return - w_uniform = I + w_uniform = equipping update_suit_sensors() update_worn_undersuit() if(ITEM_SLOT_LPOCKET) - l_store = I + l_store = equipping update_pockets() if(ITEM_SLOT_RPOCKET) - r_store = I + r_store = equipping update_pockets() if(ITEM_SLOT_SUITSTORE) if(s_store) return - s_store = I + s_store = equipping 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) + has_equipped(equipping, 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) - SEND_SIGNAL(src, COMSIG_CARBON_EQUIP_SHOECOVER, I, slot, initial, redraw_mob) + if(equipping.body_parts_covered & FEET || (equipping.flags_inv | equipping.transparent_protection) & HIDESHOES) + SEND_SIGNAL(src, COMSIG_CARBON_EQUIP_SHOECOVER, equipping, slot, initial, redraw_mob) return not_handled //For future deeper overrides @@ -386,6 +385,22 @@ return O.equip(src, visualsOnly) +///A version of equipOutfit that overrides passed in outfits with their entry on the species' outfit override registry +/mob/living/carbon/human/proc/equip_species_outfit(outfit, visualsOnly = FALSE) + var/datum/outfit/outfit_to_equip + + var/override_outfit_path = dna?.species.outfit_override_registry[outfit] + if(override_outfit_path) + outfit_to_equip = new override_outfit_path + else + outfit_to_equip = new outfit + + if(isnull(outfit_to_equip)) + return FALSE + + return outfit_to_equip.equip(src, visualsOnly) + + //delete all equipment without dropping anything /mob/living/carbon/human/proc/delete_equipment() for(var/slot in get_all_worn_items())//order matters, dependant slots go first diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 18033f79479b3..be355bddbea28 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -19,7 +19,7 @@ #define THERMAL_PROTECTION_HAND_RIGHT 0.025 /mob/living/carbon/human/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if(notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return . = ..() @@ -28,22 +28,20 @@ //Body temperature stability and damage dna.species.handle_body_temperature(src, seconds_per_tick, times_fired) - - if(!IS_IN_STASIS(src)) - if(.) //not dead - - for(var/datum/mutation/human/HM in dna.mutations) // Handle active genes - HM.on_life(seconds_per_tick, times_fired) - + if(!HAS_TRAIT(src, TRAIT_STASIS)) if(stat != DEAD) + //handle active mutations + for(var/datum/mutation/human/human_mutation as anything in dna.mutations) + human_mutation.on_life(seconds_per_tick, times_fired) //heart attack stuff handle_heart(seconds_per_tick, times_fired) + //handles liver failure effects, if we lack a liver handle_liver(seconds_per_tick, times_fired) - dna.species.spec_life(src, seconds_per_tick, times_fired) // for mutantraces + // for special species interactions + dna.species.spec_life(src, seconds_per_tick, times_fired) else - for(var/i in all_wounds) - var/datum/wound/iter_wound = i + for(var/datum/wound/iter_wound as anything in all_wounds) iter_wound.on_stasis(seconds_per_tick, times_fired) //Update our name based on whether our face is obscured/disfigured @@ -102,7 +100,7 @@ /// Environment handlers for species /mob/living/carbon/human/handle_environment(datum/gas_mixture/environment, seconds_per_tick, times_fired) // If we are in a cryo bed do not process life functions - if(istype(loc, /obj/machinery/atmospherics/components/unary/cryo_cell)) + if(istype(loc, /obj/machinery/cryo_cell)) return dna.species.handle_environment(src, environment, seconds_per_tick, times_fired) @@ -281,7 +279,7 @@ lastpuke += SPT_PROB(30, seconds_per_tick) if(lastpuke >= 50) // about 25 second delay I guess // This is actually closer to 150 seconds - vomit(20) + vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = 20) lastpuke = 0 diff --git a/code/modules/mob/living/carbon/human/monkey/monkey.dm b/code/modules/mob/living/carbon/human/monkey.dm similarity index 100% rename from code/modules/mob/living/carbon/human/monkey/monkey.dm rename to code/modules/mob/living/carbon/human/monkey.dm diff --git a/code/modules/mob/living/carbon/human/physiology.dm b/code/modules/mob/living/carbon/human/physiology.dm index f83cc5e6203cb..bfd3dc8d73c15 100644 --- a/code/modules/mob/living/carbon/human/physiology.dm +++ b/code/modules/mob/living/carbon/human/physiology.dm @@ -1,5 +1,4 @@ //Stores several modifiers in a way that isn't cleared by changing species - /datum/physiology var/brute_mod = 1 // % of brute damage taken from all sources var/burn_mod = 1 // % of burn damage taken from all sources @@ -17,7 +16,11 @@ var/siemens_coeff = 1 // resistance to shocks - var/stun_mod = 1 // % stun modifier + /// Multiplier applied to all incapacitating stuns (knockdown, stun, paralyze, immobilize) + var/stun_mod = 1 + /// Multiplied aplpied to just knockdowns, stacks with above multiplicatively + var/knockdown_mod = 1 + var/bleed_mod = 1 // % bleeding modifier var/datum/armor/armor // internal armor datum diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm deleted file mode 100644 index 066fa1fbb4d10..0000000000000 --- a/code/modules/mob/living/carbon/human/species.dm +++ /dev/null @@ -1,2317 +0,0 @@ -GLOBAL_LIST_EMPTY(roundstart_races) - -/// An assoc list of species types to their features (from get_features()) -GLOBAL_LIST_EMPTY(features_by_species) - -/** - * # species datum - * - * Datum that handles different species in the game. - * - * This datum handles species in the game, such as lizardpeople, mothmen, zombies, skeletons, etc. - * It is used in [carbon humans][mob/living/carbon/human] to determine various things about them, like their food preferences, if they have biological genders, their damage resistances, and more. - * - */ -/datum/species - ///If the game needs to manually check your race to do something not included in a proc here, it will use this. - var/id - ///This is the fluff name. They are displayed on health analyzers and in the character setup menu. Leave them generic for other servers to customize. - var/name - /// The formatting of the name of the species in plural context. Defaults to "[name]\s" if unset. - /// Ex "[Plasmamen] are weak", "[Mothmen] are strong", "[Lizardpeople] don't like", "[Golems] hate" - var/plural_form - - ///Whether or not the race has sexual characteristics (biological genders). At the moment this is only FALSE for skeletons and shadows - var/sexes = TRUE - ///A bitfield of "bodytypes", updated by /datum/obj/item/bodypart/proc/synchronize_bodytypes() - var/bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC - - ///The maximum number of bodyparts this species can have. - var/max_bodypart_count = 6 - ///This allows races to have specific hair colors. If null, it uses the H's hair/facial hair colors. If "mutcolor", it uses the H's mutant_color. If "fixedmutcolor", it uses fixedmutcolor - var/hair_color - ///The alpha used by the hair. 255 is completely solid, 0 is invisible. - var/hair_alpha = 255 - - ///Examine text when the person has cellular damage. - var/cellular_damage_desc = DEFAULT_CLONE_EXAMINE_TEXT - ///This is used for children, it will determine their default limb ID for use of examine. See [/mob/living/carbon/human/proc/examine]. - var/examine_limb_id - ///Never, Optional, or Forced digi legs? - var/digitigrade_customization = DIGITIGRADE_NEVER - ///Does the species use skintones or not? As of now only used by humans. - 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 = "" - ///The rate at which blood is passively drained by having the blood deficiency quirk. Some races such as slimepeople can regen their blood at different rates so this is to account for that - var/blood_deficiency_drain_rate = BLOOD_REGEN_FACTOR + BLOOD_DEFICIENCY_MODIFIER // slightly above the regen rate so it slowly drains instead of regenerates. - ///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. - var/skinned_type - ///Bitfield for food types that the species likes, giving them a mood boost. Lizards like meat, for example. - var/liked_food = NONE - ///Bitfield for food types that the species dislikes, giving them disgust. Humans hate raw food, for example. - var/disliked_food = GROSS - ///Bitfield for food types that the species absolutely hates, giving them even more disgust than disliked food. Meat is "toxic" to moths, for example. - var/toxic_food = TOXIC - ///flags for inventory slots the race can't equip stuff to. Golems cannot wear jumpsuits, for example. - var/no_equip_flags - ///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. - */ - var/list/mutant_bodyparts = list() - ///The bodyparts this species uses. assoc of bodypart string - bodypart type. Make sure all the fucking entries are in or I'll skin you alive. - var/list/bodypart_overrides = list( - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right, - BODY_ZONE_HEAD = /obj/item/bodypart/head, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right, - BODY_ZONE_CHEST = /obj/item/bodypart/chest, - ) - ///Internal organs that are unique to this race, like a tail. - var/list/mutant_organs = list() - - ///List of external organs to generate like horns, frills, wings, etc. list(typepath of organ = "Round Beautiful BDSM Snout"). Still WIP - var/list/external_organs = list() - ///Replaces default brain with a different organ - var/obj/item/organ/internal/brain/mutantbrain = /obj/item/organ/internal/brain - ///Replaces default heart with a different organ - var/obj/item/organ/internal/heart/mutantheart = /obj/item/organ/internal/heart - ///Replaces default lungs with a different organ - var/obj/item/organ/internal/lungs/mutantlungs = /obj/item/organ/internal/lungs - ///Replaces default eyes with a different organ - var/obj/item/organ/internal/eyes/mutanteyes = /obj/item/organ/internal/eyes - ///Replaces default ears with a different organ - var/obj/item/organ/internal/ears/mutantears = /obj/item/organ/internal/ears - ///Replaces default tongue with a different organ - var/obj/item/organ/internal/tongue/mutanttongue = /obj/item/organ/internal/tongue - ///Replaces default liver with a different organ - var/obj/item/organ/internal/liver/mutantliver = /obj/item/organ/internal/liver - ///Replaces default stomach with a different organ - var/obj/item/organ/internal/stomach/mutantstomach = /obj/item/organ/internal/stomach - ///Replaces default appendix with a different organ. - var/obj/item/organ/internal/appendix/mutantappendix = /obj/item/organ/internal/appendix - - ///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. - var/armor = 0 - ///multiplier for brute damage - var/brutemod = 1 - ///multiplier for burn damage - var/burnmod = 1 - ///multiplier for damage from cold temperature - var/coldmod = 1 - ///multiplier for damage from hot temperature - 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 death_sound upon species change - var/death_sound - ///Sounds to override barefeet walking - var/list/special_step_sounds - ///Special sound for grabbing - var/grab_sound - /// A path to an outfit that is important for species life e.g. plasmaman outfit - var/datum/outfit/outfit_important_for_life - - //Dictates which wing icons are allowed for a given species. If count is >1 a radial menu is used to choose between all icons in list - var/list/wing_types = list(/obj/item/organ/external/wings/functional/angel) - /// 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" - - ///Species-only traits. Can be found in [code/__DEFINES/DNA.dm] - var/list/species_traits = list() - ///Generic traits tied to having the species. - var/list/inherent_traits = list() - /// List of biotypes the mob belongs to. Used by diseases. - var/inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID - /// The type of respiration the mob is capable of doing. Used by adjustOxyLoss. - var/inherent_respiration_type = RESPIRATION_OXYGEN - ///List of factions the mob gain upon gaining this species. - var/list/inherent_factions - - ///What gas does this species breathe? Used by suffocation screen alerts, most of actual gas breathing is handled by mutantlungs. See [life.dm][code/modules/mob/living/carbon/human/life.dm] - var/breathid = GAS_O2 - - ///What anim to use for dusting - var/dust_anim = "dust-h" - ///What anim to use for gibbing - var/gib_anim = "gibbed-h" - - ///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 - - ///Unique cookie given by admins through prayers - var/species_cookie = /obj/item/food/cookie - - ///For custom overrides for species ass images - var/icon/ass_image - - /// List of family heirlooms this species can get with the family heirloom quirk. List of types. - var/list/family_heirlooms - - ///List of results you get from knife-butchering. null means you cant butcher it. Associated by resulting type - value of amount - var/list/knife_butcher_results - - ///List of visual overlays created by handle_body() - var/list/body_vis_overlays = list() - - /// Should we preload this species's organs? - var/preload = TRUE - - /// Do we try to prevent reset_perspective() from working? Useful for Dullahans to stop perspective changes when they're looking through their head. - var/prevent_perspective_change = FALSE - - ///Was the species changed from its original type at the start of the round? - var/roundstart_changed = FALSE - - /// This supresses the "dosen't appear to be himself" examine text for if the mob is run by an AI controller. Should be used on any NPC human subtypes. Monkeys are the prime example. - var/ai_controlled_species = FALSE - - /// Was on_species_gain ever actually called? - /// Species code is really odd... - var/properly_gained = FALSE - -/////////// -// PROCS // -/////////// - - -/datum/species/New() - wing_types = string_list(wing_types) - - if(!plural_form) - plural_form = "[name]\s" - - return ..() - -/// Gets a list of all species available to choose in roundstart. -/proc/get_selectable_species() - RETURN_TYPE(/list) - - if (!GLOB.roundstart_races.len) - GLOB.roundstart_races = generate_selectable_species() - - return GLOB.roundstart_races - -/** - * Generates species available to choose in character setup at roundstart - * - * This proc generates which species are available to pick from in character setup. - * If there are no available roundstart species, defaults to human. - */ -/proc/generate_selectable_species() - var/list/selectable_species = list() - - for(var/species_type in subtypesof(/datum/species)) - var/datum/species/species = new species_type - if(species.check_roundstart_eligible()) - selectable_species += species.id - qdel(species) - - if(!selectable_species.len) - selectable_species += SPECIES_HUMAN - - return selectable_species - -/** - * Checks if a species is eligible to be picked at roundstart. - * - * Checks the config to see if this species is allowed to be picked in the character setup menu. - * Used by [/proc/generate_selectable_species]. - */ -/datum/species/proc/check_roundstart_eligible() - if(id in (CONFIG_GET(keyed_list/roundstart_races))) - return TRUE - return FALSE - -/** - * Generates a random name for a carbon. - * - * This generates a random unique name based on a human's species and gender. - * Arguments: - * * gender - The gender that the name should adhere to. Use MALE for male names, use anything else for female names. - * * unique - If true, ensures that this new name is not a duplicate of anyone else's name currently on the station. - * * lastname - Does this species' naming system adhere to the last name system? Set to false if it doesn't. - */ -/datum/species/proc/random_name(gender,unique,lastname) - if(unique) - return random_unique_name(gender) - - var/randname - if(gender == MALE) - randname = pick(GLOB.first_names_male) - else - randname = pick(GLOB.first_names_female) - - if(lastname) - randname += " [lastname]" - else - randname += " [pick(GLOB.last_names)]" - - return randname - -/** - * Copies some vars and properties over that should be kept when creating a copy of this species. - * - * Used by slimepeople to copy themselves, and by the DNA datum to hardset DNA to a species - * Arguments: - * * old_species - The species that the carbon used to be before copying - */ -/datum/species/proc/copy_properties_from(datum/species/old_species) - return - -/** - * Gets the default mutant organ for the species based on the provided slot. - */ -/datum/species/proc/get_mutant_organ_type_for_slot(slot) - switch(slot) - if(ORGAN_SLOT_BRAIN) - return mutantbrain - if(ORGAN_SLOT_HEART) - return mutantheart - if(ORGAN_SLOT_LUNGS) - return mutantlungs - if(ORGAN_SLOT_APPENDIX) - return mutantappendix - if(ORGAN_SLOT_EYES) - return mutanteyes - if(ORGAN_SLOT_EARS) - return mutantears - if(ORGAN_SLOT_TONGUE) - return mutanttongue - if(ORGAN_SLOT_LIVER) - return mutantliver - if(ORGAN_SLOT_STOMACH) - return mutantstomach - else - CRASH("Invalid organ slot [slot]") - -/** - * Corrects organs in a carbon, removing ones it doesn't need and adding ones it does. - * - * Takes all organ slots, removes organs a species should not have, adds organs a species should have. - * can use replace_current to refresh all organs, creating an entirely new set. - * - * Arguments: - * * organ_holder - carbon, the owner of the species datum AKA whoever we're regenerating organs in - * * old_species - datum, used when regenerate organs is called in a switching species to remove old mutant organs. - * * replace_current - boolean, forces all old organs to get deleted whether or not they pass the species' ability to keep that organ - * * excluded_zones - list, add zone defines to block organs inside of the zones from getting handled. see headless mutation for an example - * * 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/organ_holder, 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/organ_slots = 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 organ_slots) - var/obj/item/organ/existing_organ = organ_holder.get_organ_slot(slot) - var/obj/item/organ/new_organ = get_mutant_organ_type_for_slot(slot) - - if(isnull(new_organ)) // if they aren't suppose to have an organ here, remove it - if(existing_organ) - existing_organ.Remove(organ_holder, special = TRUE) - qdel(existing_organ) - continue - - if(!isnull(old_species) && !isnull(existing_organ)) - if(existing_organ.type != old_species.get_mutant_organ_type_for_slot(slot)) - continue // we don't want to remove organs that are not the default for this species - - // at this point we already know new_organ is not null - if(existing_organ?.type == new_organ) - continue // we don't want to remove organs that are the same as the new one - - if(visual_only && !initial(new_organ.visual)) - continue - - var/used_neworgan = FALSE - new_organ = SSwardrobe.provide_type(new_organ) - var/should_have = new_organ.get_availability(src, organ_holder) - - // Check for an existing organ, and if there is one check to see if we should remove it - var/health_pct = 1 - var/remove_existing = !isnull(existing_organ) && !(existing_organ.zone in excluded_zones) && !(existing_organ.organ_flags & ORGAN_UNREMOVABLE) - if(remove_existing) - health_pct = (existing_organ.maxHealth - existing_organ.damage) / existing_organ.maxHealth - if(slot == ORGAN_SLOT_BRAIN) - var/obj/item/organ/internal/brain/existing_brain = existing_organ - if(!existing_brain.decoy_override) - existing_brain.before_organ_replacement(new_organ) - existing_brain.Remove(organ_holder, special = TRUE, no_id_transfer = TRUE) - QDEL_NULL(existing_organ) - else - existing_organ.before_organ_replacement(new_organ) - existing_organ.Remove(organ_holder, special = TRUE) - QDEL_NULL(existing_organ) - - if(isnull(existing_organ) && should_have && !(new_organ.zone in excluded_zones)) - used_neworgan = TRUE - new_organ.set_organ_damage(new_organ.maxHealth * (1 - health_pct)) - new_organ.Insert(organ_holder, special = TRUE, drop_if_replaced = FALSE) - - if(!used_neworgan) - QDEL_NULL(new_organ) - - if(!isnull(old_species)) - for(var/mutant_organ in old_species.mutant_organs) - if(mutant_organ in mutant_organs) - continue // need this mutant organ, but we already have it! - - var/obj/item/organ/current_organ = organ_holder.get_organ_by_type(mutant_organ) - if(current_organ) - current_organ.Remove(organ_holder) - QDEL_NULL(current_organ) - - for(var/obj/item/organ/external/external_organ in organ_holder.organs) - // External organ checking. We need to check the external organs owned by the carbon itself, - // because we want to also remove ones not shared by its species. - // This should be done even if species was not changed. - if(external_organ in external_organs) - continue // Don't remove external organs this species is supposed to have. - - external_organ.Remove(organ_holder) - QDEL_NULL(external_organ) - - var/list/species_organs = mutant_organs + external_organs - for(var/organ_path in species_organs) - var/obj/item/organ/current_organ = organ_holder.get_organ_by_type(organ_path) - if(!current_organ || replace_current) - var/obj/item/organ/replacement = SSwardrobe.provide_type(organ_path) - // If there's an existing mutant organ, we're technically replacing it. - // Let's abuse the snowflake proc that skillchips added. Basically retains - // feature parity with every other organ too. - if(current_organ) - current_organ.before_organ_replacement(replacement) - // organ.Insert will qdel any current organs in that slot, so we don't need to. - replacement.Insert(organ_holder, special=TRUE, drop_if_replaced=FALSE) - -/datum/species/proc/worn_items_fit_body_check(mob/living/carbon/wearer) - for(var/obj/item/equipped_item in wearer.get_all_worn_items()) - var/equipped_item_slot = wearer.get_slot_by_item(equipped_item) - if(!equipped_item.mob_can_equip(wearer, equipped_item_slot, bypass_equip_delay_self = TRUE, ignore_equipped = TRUE)) - wearer.dropItemToGround(equipped_item, force = TRUE) - -/datum/species/proc/update_no_equip_flags(mob/living/carbon/wearer, new_flags) - no_equip_flags = new_flags - wearer.hud_used?.update_locked_slots() - worn_items_fit_body_check(wearer) - -/** - * Proc called when a carbon becomes this species. - * - * This sets up and adds/changes/removes things, qualities, abilities, and traits so that the transformation is as smooth and bugfree as possible. - * Produces a [COMSIG_SPECIES_GAIN] signal. - * Arguments: - * * C - Carbon, this is whoever became the new species. - * * old_species - The species that the carbon used to be before becoming this race, used for regenerating organs. - * * pref_load - Preferences to be loaded from character setup, loads in preferred mutant things like bodyparts, digilegs, skin color, etc. - */ -/datum/species/proc/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) - SHOULD_CALL_PARENT(TRUE) - // Drop the items the new species can't wear - if((AGENDER in species_traits)) - C.gender = PLURAL - if(C.hud_used) - C.hud_used.update_locked_slots() - - if(inherent_biotypes & MOB_MINERAL && !(old_species.inherent_biotypes & MOB_MINERAL)) // if the mob was previously not of the MOB_MINERAL biotype when changing to MOB_MINERAL - C.adjustToxLoss(-C.getToxLoss(), forced = TRUE) // clear the organic toxin damage upon turning into a MOB_MINERAL, as they are now immune - - C.mob_biotypes = inherent_biotypes - C.mob_respiration_type = inherent_respiration_type - - if (old_species.type != type) - replace_body(C, src) - - regenerate_organs(C, old_species, visual_only = C.visual_only_organs) - - INVOKE_ASYNC(src, PROC_REF(worn_items_fit_body_check), C, TRUE) - - if(exotic_bloodtype && C.dna.blood_type != exotic_bloodtype) - C.dna.blood_type = exotic_bloodtype - - if(ishuman(C)) - var/mob/living/carbon/human/human = C - for(var/obj/item/organ/external/organ_path as anything in external_organs) - //Load a persons preferences from DNA - var/obj/item/organ/external/new_organ = SSwardrobe.provide_type(organ_path) - new_organ.Insert(human, special=TRUE, drop_if_replaced=FALSE) - - if(length(inherent_traits)) - C.add_traits(inherent_traits, SPECIES_TRAIT) - - if(TRAIT_VIRUSIMMUNE in inherent_traits) - for(var/datum/disease/A in C.diseases) - A.cure(FALSE) - - if(TRAIT_TOXIMMUNE in inherent_traits) - C.setToxLoss(0, TRUE, TRUE) - - if(TRAIT_NOMETABOLISM in inherent_traits) - C.reagents.end_metabolization(C, keep_liverless = TRUE) - - if(TRAIT_GENELESS in inherent_traits) - C.dna.remove_all_mutations() // Radiation immune mobs can't get mutations normally - - if(inherent_factions) - for(var/i in inherent_factions) - C.faction += i //Using +=/-= for this in case you also gain the faction from a different source. - - C.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/species, multiplicative_slowdown=speedmod) - - SEND_SIGNAL(C, COMSIG_SPECIES_GAIN, src, old_species) - - properly_gained = TRUE - -/** - * Proc called when a carbon is no longer this species. - * - * This sets up and adds/changes/removes things, qualities, abilities, and traits so that the transformation is as smooth and bugfree as possible. - * Produces a [COMSIG_SPECIES_LOSS] signal. - * Arguments: - * * C - Carbon, this is whoever lost this species. - * * new_species - The new species that the carbon became, used for genetics mutations. - * * pref_load - Preferences to be loaded from character setup, loads in preferred mutant things like bodyparts, digilegs, skin color, etc. - */ -/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/obj/item/organ/external/organ in C.organs) - organ.Remove(C) - qdel(organ) - - //If their inert mutation is not the same, swap it out - if((inert_mutation != new_species.inert_mutation) && LAZYLEN(C.dna.mutation_index) && (inert_mutation in C.dna.mutation_index)) - C.dna.remove_mutation(inert_mutation) - //keep it at the right spot, so we can't have people taking shortcuts - var/location = C.dna.mutation_index.Find(inert_mutation) - C.dna.mutation_index[location] = new_species.inert_mutation - C.dna.default_mutation_genes[location] = C.dna.mutation_index[location] - C.dna.mutation_index[new_species.inert_mutation] = create_sequence(new_species.inert_mutation) - C.dna.default_mutation_genes[new_species.inert_mutation] = C.dna.mutation_index[new_species.inert_mutation] - - if(inherent_factions) - for(var/i in inherent_factions) - C.faction -= i - - clear_tail_moodlets(C) - - C.remove_movespeed_modifier(/datum/movespeed_modifier/species) - - SEND_SIGNAL(C, COMSIG_SPECIES_LOSS, src) - -/** - * Proc called when mail goodies need to be updated for this species. - * - * Updates the mail goodies if that is required. e.g. for the blood deficiency quirk, which sends bloodbags to quirk holders, update the sent bloodpack to match the species' exotic blood. - * This is currently only used for the blood deficiency quirk but more can be added as needed. - * Arguments: - * * mob/living/carbon/human/recipient - the mob receiving the mail goodies - */ -/datum/species/proc/update_mail_goodies(mob/living/carbon/human/recipient) - update_quirk_mail_goodies(recipient, recipient.get_quirk(/datum/quirk/blooddeficiency)) - -/** - * Updates the mail goodies of a specific quirk. - * - * Updates the mail goodies belonging to a specific quirk. - * Add implementation as needed for each individual species. The base species proc should give the species the 'default' version of whatever mail goodies are required. - * Arguments: - * * mob/living/carbon/human/recipient - the mob receiving the mail goodies - * * datum/quirk/quirk - the quirk to update the mail goodies of. Use get_quirk(datum/quirk/some_quirk) to get the actual mob's quirk to pass. - * * list/mail_goodies - a list of mail goodies. Generally speaking you should not be using this argument on the initial function call. You should instead add to the species' implementation of this proc. - */ -/datum/species/proc/update_quirk_mail_goodies(mob/living/carbon/human/recipient, datum/quirk/quirk, list/mail_goodies) - if(isnull(quirk)) - return - if(length(mail_goodies)) - quirk.mail_goodies = mail_goodies - return - if(istype(quirk, /datum/quirk/blooddeficiency)) - if(HAS_TRAIT(recipient, TRAIT_NOBLOOD) && isnull(recipient.dna.species.exotic_blood)) // no blood packs should be sent in this case (like if a mob transforms into a plasmaman) - quirk.mail_goodies = list() - return - - - // The default case if no species implementation exists. Set quirk's mail_goodies to initial. - var/datum/quirk/readable_quirk = new quirk.type - quirk.mail_goodies = readable_quirk.mail_goodies - qdel(readable_quirk) // We have to do it this way because initial will not work on lists in this version of DM - return - -/** - * Handles the body of a human - * - * Handles lipstick, having no eyes, eye color, undergarnments like underwear, undershirts, and socks, and body layers. - * Calls [handle_mutant_bodyparts][/datum/species/proc/handle_mutant_bodyparts] - * Arguments: - * * species_human - Human, whoever we're handling the body for - */ -/datum/species/proc/handle_body(mob/living/carbon/human/species_human) - species_human.remove_overlay(BODY_LAYER) - var/height_offset = species_human.get_top_offset() // From high changed by varying limb height - if(HAS_TRAIT(species_human, TRAIT_INVISIBLE_MAN)) - return handle_mutant_bodyparts(species_human) - var/list/standing = list() - - var/obj/item/bodypart/head/noggin = species_human.get_bodypart(BODY_ZONE_HEAD) - - if(noggin && !(HAS_TRAIT(species_human, TRAIT_HUSK))) - // lipstick - if(species_human.lip_style && (LIPS in species_traits)) - var/mutable_appearance/lip_overlay = mutable_appearance('icons/mob/species/human/human_face.dmi', "lips_[species_human.lip_style]", -BODY_LAYER) - lip_overlay.color = species_human.lip_color - noggin.worn_face_offset?.apply_offset(lip_overlay) - lip_overlay.pixel_y += height_offset - standing += lip_overlay - - // eyes - if(!(NOEYESPRITES in species_traits)) - var/obj/item/organ/internal/eyes/eye_organ = species_human.get_organ_slot(ORGAN_SLOT_EYES) - var/mutable_appearance/no_eyeslay - var/add_pixel_x = 0 - var/add_pixel_y = 0 - //cut any possible vis overlays - if(body_vis_overlays.len) - SSvis_overlays.remove_vis_overlay(species_human, body_vis_overlays) - var/list/feature_offset = noggin.worn_face_offset?.get_offset() - if(feature_offset) - add_pixel_x = feature_offset["x"] - add_pixel_y = feature_offset["y"] - add_pixel_y += height_offset - - if(eye_organ) - eye_organ.refresh(call_update = FALSE) - for(var/mutable_appearance/eye_overlay in eye_organ.generate_body_overlay(species_human)) - eye_overlay.pixel_y += height_offset - standing += eye_overlay - else if (!(NOEYEHOLES in species_traits)) - no_eyeslay = mutable_appearance('icons/mob/species/human/human_face.dmi', "eyes_missing", -BODY_LAYER) - no_eyeslay.pixel_x += add_pixel_x - no_eyeslay.pixel_y += add_pixel_y - standing += no_eyeslay - - // organic body markings - if(HAS_MARKINGS in species_traits) - var/obj/item/bodypart/chest/chest = species_human.get_bodypart(BODY_ZONE_CHEST) - var/obj/item/bodypart/arm/right/right_arm = species_human.get_bodypart(BODY_ZONE_R_ARM) - var/obj/item/bodypart/arm/left/left_arm = species_human.get_bodypart(BODY_ZONE_L_ARM) - var/obj/item/bodypart/leg/right/right_leg = species_human.get_bodypart(BODY_ZONE_R_LEG) - var/obj/item/bodypart/leg/left/left_leg = species_human.get_bodypart(BODY_ZONE_L_LEG) - var/datum/sprite_accessory/markings = GLOB.moth_markings_list[species_human.dna.features["moth_markings"]] - - if(!HAS_TRAIT(species_human, TRAIT_HUSK)) - if(noggin && (IS_ORGANIC_LIMB(noggin))) - var/mutable_appearance/markings_head_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_head", -BODY_LAYER) - markings_head_overlay.pixel_y += height_offset - standing += markings_head_overlay - - if(chest && (IS_ORGANIC_LIMB(chest))) - var/mutable_appearance/markings_chest_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_chest", -BODY_LAYER) - markings_chest_overlay.pixel_y += height_offset - standing += markings_chest_overlay - - if(right_arm && (IS_ORGANIC_LIMB(right_arm))) - var/mutable_appearance/markings_r_arm_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_r_arm", -BODY_LAYER) - markings_r_arm_overlay.pixel_y += height_offset - standing += markings_r_arm_overlay - - if(left_arm && (IS_ORGANIC_LIMB(left_arm))) - var/mutable_appearance/markings_l_arm_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_l_arm", -BODY_LAYER) - markings_l_arm_overlay.pixel_y += height_offset - standing += markings_l_arm_overlay - - if(right_leg && (IS_ORGANIC_LIMB(right_leg))) - var/mutable_appearance/markings_r_leg_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_r_leg", -BODY_LAYER) - standing += markings_r_leg_overlay - - if(left_leg && (IS_ORGANIC_LIMB(left_leg))) - var/mutable_appearance/markings_l_leg_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_l_leg", -BODY_LAYER) - standing += markings_l_leg_overlay - - //Underwear, Undershirts & Socks - if(!(NO_UNDERWEAR in species_traits)) - if(species_human.underwear) - var/datum/sprite_accessory/underwear/underwear = GLOB.underwear_list[species_human.underwear] - var/mutable_appearance/underwear_overlay - if(underwear) - if(species_human.dna.species.sexes && species_human.physique == FEMALE && (underwear.gender == MALE)) - underwear_overlay = wear_female_version(underwear.icon_state, underwear.icon, BODY_LAYER, FEMALE_UNIFORM_FULL) - else - underwear_overlay = mutable_appearance(underwear.icon, underwear.icon_state, -BODY_LAYER) - if(!underwear.use_static) - underwear_overlay.color = species_human.underwear_color - underwear_overlay.pixel_y += height_offset - standing += underwear_overlay - - if(species_human.undershirt) - var/datum/sprite_accessory/undershirt/undershirt = GLOB.undershirt_list[species_human.undershirt] - if(undershirt) - var/mutable_appearance/working_shirt - if(species_human.dna.species.sexes && species_human.physique == FEMALE) - working_shirt = wear_female_version(undershirt.icon_state, undershirt.icon, BODY_LAYER) - else - working_shirt = mutable_appearance(undershirt.icon, undershirt.icon_state, -BODY_LAYER) - working_shirt.pixel_y += height_offset - standing += working_shirt - - if(species_human.socks && species_human.num_legs >= 2 && !(src.bodytype & BODYTYPE_DIGITIGRADE)) - var/datum/sprite_accessory/socks/socks = GLOB.socks_list[species_human.socks] - if(socks) - standing += mutable_appearance(socks.icon, socks.icon_state, -BODY_LAYER) - - if(standing.len) - 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("body_markings") - accessory = GLOB.body_markings_list[source.dna.features["body_markings"]] - if("legs") - accessory = GLOB.legs_list[source.dna.features["legs"]] - if("caps") - accessory = GLOB.caps_list[source.dna.features["caps"]] - - 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, source, 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.features["mcolor"] - if(HAIR) - if(hair_color == "mutcolor") - accessory_overlay.color = source.dna.features["mcolor"] - 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. -/datum/species/proc/mutant_bodyparts_layertext(layer) - switch(layer) - if(BODY_BEHIND_LAYER) - return "BEHIND" - if(BODY_ADJ_LAYER) - return "ADJ" - if(BODY_FRONT_LAYER) - return "FRONT" - -///Proc that will randomise the hair, or primary appearance element (i.e. for moths wings) of a species' associated mob -/datum/species/proc/randomize_main_appearance_element(mob/living/carbon/human/human_mob) - human_mob.hairstyle = random_hairstyle(human_mob.gender) - human_mob.update_body_parts() - -///Proc that will randomise the underwear (i.e. top, pants and socks) of a species' associated mob, -/// but will not update the body right away. -/datum/species/proc/randomize_active_underwear_only(mob/living/carbon/human/human_mob) - human_mob.undershirt = random_undershirt(human_mob.gender) - human_mob.underwear = random_underwear(human_mob.gender) - human_mob.socks = random_socks(human_mob.gender) - -///Proc that will randomise the underwear (i.e. top, pants and socks) of a species' associated mob -/datum/species/proc/randomize_active_underwear(mob/living/carbon/human/human_mob) - randomize_active_underwear_only(human_mob) - human_mob.update_body() - -///Proc that will randomize all the external organs (i.e. horns, frills, tails etc.) of a species' associated mob -/datum/species/proc/randomize_external_organs(mob/living/carbon/human/human_mob) - for(var/obj/item/organ/external/organ_path as anything in external_organs) - var/obj/item/organ/external/randomized_organ = human_mob.get_organ_by_type(organ_path) - if(randomized_organ) - var/datum/bodypart_overlay/mutant/overlay = randomized_organ.bodypart_overlay - var/new_look = pick(overlay.get_global_feature_list()) - human_mob.dna.features["[overlay.feature_key]"] = new_look - mutant_bodyparts["[overlay.feature_key]"] = new_look - -///Proc that randomizes all the appearance elements (external organs, markings, hair etc.) of a species' associated mob. Function set by child procs -/datum/species/proc/randomize_features(mob/living/carbon/human/human_mob) - return - -/datum/species/proc/spec_life(mob/living/carbon/human/H, seconds_per_tick, 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.crit_threshold) && takes_crit_damage && H.stat != DEAD) - H.adjustBruteLoss(0.5 * seconds_per_tick) - -/datum/species/proc/spec_death(gibbed, mob/living/carbon/human/H) - return - -/datum/species/proc/can_equip(obj/item/I, slot, disable_warning, mob/living/carbon/human/H, bypass_equip_delay_self = FALSE, ignore_equipped = FALSE) - if(no_equip_flags & slot) - if(!I.species_exception || !is_type_in_list(src, I.species_exception)) - return FALSE - - // if there's an item in the slot we want, fail - if(!ignore_equipped) - if(H.get_item_by_slot(slot)) - 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)) - var/excused = FALSE - // Anything that's small or smaller can fit into a pocket by default - if((slot & (ITEM_SLOT_RPOCKET|ITEM_SLOT_LPOCKET)) && I.w_class <= WEIGHT_CLASS_SMALL) - excused = TRUE - else if(slot & (ITEM_SLOT_SUITSTORE|ITEM_SLOT_BACKPACK|ITEM_SLOT_HANDS)) - excused = TRUE - if(!excused) - return FALSE - - switch(slot) - if(ITEM_SLOT_HANDS) - if(H.get_empty_held_indexes()) - 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) - - if(!H.w_uniform && !HAS_TRAIT(H, TRAIT_NO_JUMPSUIT) && (!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_EYES) - if(!H.get_bodypart(BODY_ZONE_HEAD)) - return FALSE - var/obj/item/organ/internal/eyes/eyes = H.get_organ_slot(ORGAN_SLOT_EYES) - if(eyes?.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) - var/obj/item/bodypart/chest = H.get_bodypart(BODY_ZONE_CHEST) - if(chest && (chest.bodytype & BODYTYPE_MONKEY)) - if(!(I.supports_variations_flags & CLOTHING_MONKEY_VARIATION)) - if(!disable_warning) - to_chat(H, span_warning("[I] doesn't fit your [chest.name]!")) - return FALSE - 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 && !HAS_TRAIT(H, TRAIT_NO_JUMPSUIT) && (!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 - if(!isnull(H.l_store) && H.l_store != I) // no pocket swaps at all - return FALSE - - var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_L_LEG) - - if(!H.w_uniform && !HAS_TRAIT(H, TRAIT_NO_JUMPSUIT) && (!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 - if(!isnull(H.r_store) && H.r_store != I) - return FALSE - - var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_R_LEG) - - if(!H.w_uniform && !HAS_TRAIT(H, TRAIT_NO_JUMPSUIT) && (!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_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/pda) || istype(I, /obj/item/pen) || is_type_in_list(I, H.wear_suit.allowed) ) - return TRUE - return FALSE - if(ITEM_SLOT_HANDCUFFED) - if(!istype(I, /obj/item/restraints/handcuffs)) - return FALSE - if(H.num_hands < 2) - return FALSE - return TRUE - if(ITEM_SLOT_LEGCUFFED) - 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) - if(!I.equip_delay_self || bypass_equip_delay_self) - return TRUE - H.visible_message(span_notice("[H] start putting on [I]..."), span_notice("You start putting on [I]...")) - return do_after(H, I.equip_delay_self, target = H) - - -/// Equips the necessary species-relevant gear before putting on the rest of the uniform. -/datum/species/proc/pre_equip_species_outfit(datum/job/job, mob/living/carbon/human/equipping, visuals_only = FALSE) - return - -/** - * Handling special reagent types. - * - * Return False to run the normal on_mob_life() for that reagent. - * Return True to not run the normal metabolism effects. - * NOTE: If you return TRUE, that reagent will not be removed liike normal! You must handle it manually. - */ -/datum/species/proc/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, seconds_per_tick, times_fired) - SHOULD_CALL_PARENT(TRUE) - 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) - H.log_message("has started overdosing on [chem.name] at [chem.volume] units.", LOG_GAME) - -/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 - -/** - * Equip the outfit required for life. Replaces items currently worn. - */ -/datum/species/proc/give_important_for_life(mob/living/carbon/human/human_to_equip) - if(!outfit_important_for_life) - return - - human_to_equip.equipOutfit(outfit_important_for_life) - -/** - * Species based handling for irradiation - * - * Arguments: - * - [source][/mob/living/carbon/human]: The mob requesting handling - * - time_since_irradiated: The amount of time since the mob was first irradiated - * - seconds_per_tick: The amount of time that has passed since the last tick - */ -/datum/species/proc/handle_radiation(mob/living/carbon/human/source, time_since_irradiated, seconds_per_tick) - if(time_since_irradiated > RAD_MOB_KNOCKDOWN && SPT_PROB(RAD_MOB_KNOCKDOWN_PROB, seconds_per_tick)) - if(!source.IsParalyzed()) - source.emote("collapse") - source.Paralyze(RAD_MOB_KNOCKDOWN_AMOUNT) - to_chat(source, span_danger("You feel weak.")) - - if(time_since_irradiated > RAD_MOB_VOMIT && SPT_PROB(RAD_MOB_VOMIT_PROB, seconds_per_tick)) - source.vomit(10, TRUE) - - if(time_since_irradiated > RAD_MOB_MUTATE && SPT_PROB(RAD_MOB_MUTATE_PROB, seconds_per_tick)) - to_chat(source, span_danger("You mutate!")) - source.easy_random_mutate(NEGATIVE + MINOR_NEGATIVE) - source.emote("gasp") - source.domutcheck() - - if(time_since_irradiated > RAD_MOB_HAIRLOSS && SPT_PROB(RAD_MOB_HAIRLOSS_PROB, seconds_per_tick)) - if(!(source.hairstyle == "Bald") && (HAIR in species_traits)) - to_chat(source, span_danger("Your hair starts to fall out in clumps...")) - addtimer(CALLBACK(src, PROC_REF(go_bald), source), 5 SECONDS) - -/** - * Makes the target human bald. - * - * Arguments: - * - [target][/mob/living/carbon/human]: The mob to make go bald. - */ -/datum/species/proc/go_bald(mob/living/carbon/human/target) - if(QDELETED(target)) //may be called from a timer - return - target.facial_hairstyle = "Shaved" - target.hairstyle = "Bald" - target.update_body_parts() - -////////////////// -// ATTACK PROCS // -////////////////// - -/datum/species/proc/spec_updatehealth(mob/living/carbon/human/H) - return - -/datum/species/proc/help(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) - if(SEND_SIGNAL(target, COMSIG_CARBON_PRE_HELP, user, attacker_style) & COMPONENT_BLOCK_HELP_ACT) - return TRUE - - if(attacker_style?.help_act(user, target) == MARTIAL_ATTACK_SUCCESS) - return TRUE - - if(target.body_position == STANDING_UP || target.appears_alive()) - target.help_shake_act(user) - if(target != user) - log_combat(user, target, "shaken") - return TRUE - - user.do_cpr(target) - -/datum/species/proc/grab(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) - if(target.check_block()) - target.visible_message(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 - target.grabbedby(user) - return TRUE - -///This proc handles punching damage. IMPORTANT: Our owner is the TARGET and not the USER in this proc. For whatever reason... -/datum/species/proc/harm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) - if(HAS_TRAIT(user, TRAIT_PACIFISM) && !attacker_style?.pacifist_style) - to_chat(user, span_warning("You don't want to harm [target]!")) - return FALSE - 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(attacker_style?.harm_act(user,target) == MARTIAL_ATTACK_SUCCESS) - return TRUE - else - - var/obj/item/organ/internal/brain/brain = user.get_organ_slot(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(ITEM_SLOT_MASK)) - to_chat(user, span_warning("You can't [atk_verb] with your mouth covered!")) - return FALSE - user.do_attack_animation(target, atk_effect) - - var/damage = rand(attacking_bodypart.unarmed_damage_low, attacking_bodypart.unarmed_damage_high) - - var/obj/item/bodypart/affecting = target.get_bodypart(target.get_random_valid_zone(user.zone_selected)) - - 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.getStaminaLoss() + (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") - return FALSE - - var/armor_block = target.run_armor_check(affecting, MELEE) - - playsound(target.loc, attacking_bodypart.unarmed_attack_sound, 25, TRUE, -1) - - target.visible_message(span_danger("[user] [atk_verb]ed [target]!"), \ - span_userdanger("You're [atk_verb]ed by [user]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, user) - to_chat(user, span_danger("You [atk_verb] [target]!")) - - target.lastattacker = user.real_name - target.lastattackerckey = user.ckey - user.dna.species.spec_unarmedattacked(user, target) - - 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 - if(damage >= 9) - target.force_say() - log_combat(user, target, "kicked") - target.apply_damage(damage, attack_type, affecting, armor_block, attack_direction = attack_direction) - 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.apply_damage(damage*1.5, STAMINA, affecting, armor_block) - if(damage >= 9) - target.force_say() - log_combat(user, target, "punched") - - if((target.stat != DEAD) && damage >= attacking_bodypart.unarmed_stun_threshold) - target.visible_message(span_danger("[user] knocks [target] down!"), \ - span_userdanger("You're knocked down by [user]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, user) - to_chat(user, span_danger("You knock [target] down!")) - var/knockdown_duration = 40 + (target.getStaminaLoss() + (target.getBruteLoss()*0.5))*0.8 //50 total damage = 40 base stun + 40 stun modifier = 80 stun duration, which is the old base duration - target.apply_effect(knockdown_duration, EFFECT_KNOCKDOWN, armor_block) - log_combat(user, target, "got a stun punch with their previous punch") - -/datum/species/proc/spec_unarmedattacked(mob/living/carbon/human/user, mob/living/carbon/human/target) - return - -/datum/species/proc/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) - if(target.check_block()) - target.visible_message(span_warning("[user]'s shove is blocked by [target]!"), \ - span_danger("You block [user]'s shove!"), span_hear("You hear a swoosh!"), COMBAT_MESSAGE_RANGE, user) - to_chat(user, span_warning("Your shove at [target] was blocked!")) - return FALSE - if(attacker_style?.disarm_act(user,target) == MARTIAL_ATTACK_SUCCESS) - return TRUE - if(user.body_position != STANDING_UP) - return FALSE - if(user == target) - return FALSE - if(user.loc == target.loc) - return FALSE - user.disarm(target) - - -/datum/species/proc/spec_hitby(atom/movable/AM, mob/living/carbon/human/H) - return - -/datum/species/proc/spec_attack_hand(mob/living/carbon/human/owner, mob/living/carbon/human/target, datum/martial_art/attacker_style, modifiers) - if(!istype(owner)) - return - CHECK_DNA_AND_SPECIES(owner) - CHECK_DNA_AND_SPECIES(target) - - if(!istype(owner)) //sanity check for drones. - return - if(owner.mind) - attacker_style = owner.mind.martial_art - if((owner != target) && owner.combat_mode && target.check_shields(owner, 0, owner.name, attack_type = UNARMED_ATTACK)) - log_combat(owner, target, "attempted to touch") - target.visible_message(span_warning("[owner] attempts to touch [target]!"), \ - span_danger("[owner] attempts to touch you!"), span_hear("You hear a swoosh!"), COMBAT_MESSAGE_RANGE, owner) - to_chat(owner, span_warning("You attempt to touch [target]!")) - return - - SEND_SIGNAL(owner, COMSIG_MOB_ATTACK_HAND, owner, target, attacker_style) - - if(LAZYACCESS(modifiers, RIGHT_CLICK)) - disarm(owner, target, attacker_style) - return // dont attack after - if(owner.combat_mode) - harm(owner, target, attacker_style) - else - help(owner, target, attacker_style) - -/datum/species/proc/spec_attacked_by(obj/item/weapon, mob/living/user, obj/item/bodypart/affecting, mob/living/carbon/human/human) - // Allows you to put in item-specific reactions based on species - if(user != human) - if(human.check_shields(weapon, weapon.force, "the [weapon.name]", MELEE_ATTACK, weapon.armour_penetration, weapon.damtype)) - return FALSE - if(human.check_block()) - human.visible_message(span_warning("[human] blocks [weapon]!"), \ - span_userdanger("You block [weapon]!")) - return FALSE - - var/hit_area - if(!affecting) //Something went wrong. Maybe the limb is missing? - affecting = human.bodyparts[1] - - hit_area = affecting.plaintext_zone - var/def_zone = affecting.body_zone - - var/armor_block = human.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]!"),weapon.armour_penetration, weak_against_armour = weapon.weak_against_armour) - armor_block = min(ARMOR_MAX_BLOCK, armor_block) //cap damage reduction at 90% - var/Iwound_bonus = weapon.wound_bonus - - // this way, you can't wound with a surgical tool on help intent if they have a surgery active and are lying down, so a misclick with a circular saw on the wrong limb doesn't bleed them dry (they still get hit tho) - if((weapon.item_flags & SURGICAL_TOOL) && !user.combat_mode && human.body_position == LYING_DOWN && (LAZYLEN(human.surgeries) > 0)) - Iwound_bonus = CANT_WOUND - - var/weakness = check_species_weakness(weapon, user) - - human.send_item_attack_message(weapon, user, hit_area, affecting) - - - var/attack_direction = get_dir(user, human) - apply_damage(weapon.force * weakness, weapon.damtype, def_zone, armor_block, human, wound_bonus = Iwound_bonus, bare_wound_bonus = weapon.bare_wound_bonus, sharpness = weapon.get_sharpness(), attack_direction = attack_direction, attacking_item = weapon) - - if(!weapon.force) - return FALSE //item force is zero - var/bloody = FALSE - if(weapon.damtype != BRUTE) - return TRUE - if(!(prob(25 + (weapon.force * 2)))) - return TRUE - - if(IS_ORGANIC_LIMB(affecting)) - weapon.add_mob_blood(human) //Make the weapon bloody, not the person. - if(prob(weapon.force * 2)) //blood spatter! - bloody = TRUE - var/turf/location = human.loc - if(istype(location)) - human.add_splatter_floor(location) - if(get_dist(user, human) <= 1) //people with TK won't get smeared with blood - user.add_mob_blood(human) - - switch(hit_area) - if(BODY_ZONE_HEAD) - if(!weapon.get_sharpness() && armor_block < 50) - if(prob(weapon.force)) - human.adjustOrganLoss(ORGAN_SLOT_BRAIN, 20) - if(human.stat == CONSCIOUS) - human.visible_message(span_danger("[human] is knocked senseless!"), \ - span_userdanger("You're knocked senseless!")) - human.set_confusion_if_lower(20 SECONDS) - human.adjust_eye_blur(20 SECONDS) - if(prob(10)) - human.gain_trauma(/datum/brain_trauma/mild/concussion) - else - human.adjustOrganLoss(ORGAN_SLOT_BRAIN, weapon.force * 0.2) - - if(human.mind && human.stat == CONSCIOUS && human != user && prob(weapon.force + ((100 - human.health) * 0.5))) // rev deconversion through blunt trauma. - var/datum/antagonist/rev/rev = human.mind.has_antag_datum(/datum/antagonist/rev) - if(rev) - rev.remove_revolutionary(FALSE, user) - - if(bloody) //Apply blood - if(human.wear_mask) - human.wear_mask.add_mob_blood(human) - human.update_worn_mask() - if(human.head) - human.head.add_mob_blood(human) - human.update_worn_head() - if(human.glasses && prob(33)) - human.glasses.add_mob_blood(human) - human.update_worn_glasses() - - if(BODY_ZONE_CHEST) - if(human.stat == CONSCIOUS && !weapon.get_sharpness() && armor_block < 50) - if(prob(weapon.force)) - human.visible_message(span_danger("[human] is knocked down!"), \ - span_userdanger("You're knocked down!")) - human.apply_effect(60, EFFECT_KNOCKDOWN, armor_block) - - if(bloody) - if(human.wear_suit) - human.wear_suit.add_mob_blood(human) - human.update_worn_oversuit() - if(human.w_uniform) - human.w_uniform.add_mob_blood(human) - human.update_worn_undersuit() - - /// Triggers force say events - if(weapon.force > 10 || weapon.force >= 5 && prob(33)) - human.force_say(user) - - return TRUE - -/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE, attack_direction = null, attacking_item) - SEND_SIGNAL(H, COMSIG_MOB_APPLY_DAMAGE, damage, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, attacking_item) - var/hit_percent = (100-(blocked+armor))/100 - hit_percent = (hit_percent * (100-H.physiology.damage_resistance))/100 - if(!damage || (!forced && hit_percent <= 0)) - return 0 - - var/obj/item/bodypart/BP = null - if(!spread_damage) - if(isbodypart(def_zone)) - BP = def_zone - else - if(!def_zone) - def_zone = H.get_random_valid_zone(def_zone) - BP = H.get_bodypart(check_zone(def_zone)) - if(!BP) - BP = H.bodyparts[1] - - switch(damagetype) - if(BRUTE) - 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, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness, attack_direction = attack_direction, damage_source = attacking_item)) - H.update_damage_overlays() - 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, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness, attack_direction = attack_direction, damage_source = attacking_item)) - H.update_damage_overlays() - 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) - var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.stamina_mod - H.adjustStaminaLoss(damage_amount) - if(BRAIN) - var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.brain_mod - H.adjustOrganLoss(ORGAN_SLOT_BRAIN, damage_amount) - SEND_SIGNAL(H, COMSIG_MOB_AFTER_APPLY_DAMAGE, damage, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, attacking_item) - return 1 - -/datum/species/proc/on_hit(obj/projectile/P, mob/living/carbon/human/H) - // called when hit by a projectile - switch(P.type) - if(/obj/projectile/energy/floramut) // overwritten by plants/pods - H.show_message(span_notice("The radiation beam dissipates harmlessly through your body.")) - if(/obj/projectile/energy/florayield) - H.show_message(span_notice("The radiation beam dissipates harmlessly through your body.")) - if(/obj/projectile/energy/florarevolution) - H.show_message(span_notice("The radiation beam dissipates harmlessly through your body.")) - -/datum/species/proc/bullet_act(obj/projectile/P, mob/living/carbon/human/H) - // called before a projectile hit - return 0 - -////////////////////////// -// ENVIRONMENT HANDLERS // -////////////////////////// - -/** - * Environment handler for species - * - * vars: - * * environment (required) The environment gas mix - * * 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, seconds_per_tick, times_fired) - handle_environment_pressure(humi, environment, seconds_per_tick, times_fired) - -/** - * Body temperature handler for species - * - * These procs manage body temp, bamage, and alerts - * Some of these will still fire when not alive to balance body temp to the room temp. - * vars: - * * humi (required)(type: /mob/living/carbon/human) The mob we will target - */ -/datum/species/proc/handle_body_temperature(mob/living/carbon/human/humi, seconds_per_tick, 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, seconds_per_tick, times_fired) - - //These do run in statis - body_temperature_skin(humi, seconds_per_tick, times_fired) - body_temperature_alerts(humi, seconds_per_tick, times_fired) - - //Do not cause more damage in statis - if(!IS_IN_STASIS(humi)) - body_temperature_damage(humi, seconds_per_tick, times_fired) - -/** - * Used to stabilize the core temperature back to normal on living mobs - * - * The metabolisim heats up the core of the mob trying to keep it at the normal body temp - * vars: - * * humi (required) The mob we will stabilize - */ -/datum/species/proc/body_temperature_core(mob/living/carbon/human/humi, seconds_per_tick, times_fired) - var/natural_change = get_temp_change_amount(humi.get_body_temp_normal() - humi.coretemperature, 0.06 * seconds_per_tick) - humi.adjust_coretemperature(humi.metabolism_efficiency * natural_change) - -/** - * Used to normalize the skin temperature on living mobs - * - * The core temp effects the skin, then the enviroment effects the skin, then we refect that back to the core. - * This happens even when dead so bodies revert to room temp over time. - * vars: - * * humi (required) The mob we will targeting - * - seconds_per_tick: The amount of time that is considered as elapsing - * - times_fired: The number of times SSmobs has fired - */ -/datum/species/proc/body_temperature_skin(mob/living/carbon/human/humi, seconds_per_tick, times_fired) - - // change the core based on the skin temp - var/skin_core_diff = humi.bodytemperature - humi.coretemperature - // change rate of 0.04 per second to be slightly below area to skin change rate and still have a solid curve - var/skin_core_change = get_temp_change_amount(skin_core_diff, 0.04 * seconds_per_tick) - - 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() - if(!environment) // if there is no environment (nullspace) drop out here. - return - - // Get the temperature of the environment for area - var/area_temp = humi.get_temperature(environment) - - // Get the insulation value based on the area's temp - var/thermal_protection = humi.get_insulation_protection(area_temp) - - // Changes to the skin temperature based on the area - var/area_skin_diff = area_temp - humi.bodytemperature - if(!humi.on_fire || area_skin_diff > 0) - // change rate of 0.05 as area temp has large impact on the surface - var/area_skin_change = get_temp_change_amount(area_skin_diff, 0.05 * seconds_per_tick) - - // We need to apply the thermal protection of the clothing when applying area to surface change - // If the core bodytemp goes over the normal body temp you are overheating and becom sweaty - // This will cause the insulation value of any clothing to reduced in effect (70% normal rating) - // we add 10 degree over normal body temp before triggering as thick insulation raises body temp - if(humi.get_body_temp_normal(apply_change=FALSE) + 10 < humi.coretemperature) - // we are overheating and sweaty insulation is not as good reducing thermal protection - area_skin_change = (1 - (thermal_protection * 0.7)) * area_skin_change - else - area_skin_change = (1 - thermal_protection) * area_skin_change - - humi.adjust_bodytemperature(area_skin_change) - - // Core to skin temp transfer, when not on fire - if(!humi.on_fire) - // Get the changes to the skin from the core temp - var/core_skin_diff = humi.coretemperature - humi.bodytemperature - // change rate of 0.045 to reflect temp back to the skin at the slight higher rate then core to skin - var/core_skin_change = (1 + thermal_protection) * get_temp_change_amount(core_skin_diff, 0.045 * seconds_per_tick) - - // We do not want to over shoot after using protection - if(core_skin_diff > 0) - core_skin_change = min(core_skin_change, core_skin_diff) - else - core_skin_change = max(core_skin_change, core_skin_diff) - - humi.adjust_bodytemperature(core_skin_change) - - -/** - * Used to set alerts and debuffs based on body temperature - * vars: - * * humi (required) The mob we will targeting - */ -/datum/species/proc/body_temperature_alerts(mob/living/carbon/human/humi) - 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 - humi.clear_mood_event("cold") - humi.add_mood_event("hot", /datum/mood_event/hot) - - //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) - humi.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/hot, 1) - else if(bodytemp in BODYTEMP_HEAT_WARNING_2 to BODYTEMP_HEAT_WARNING_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)) - // clear any hot moods and apply cold mood - humi.clear_mood_event("hot") - humi.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)) - // 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) - humi.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 1) - else if(bodytemp in BODYTEMP_COLD_WARNING_3 to BODYTEMP_COLD_WARNING_2) - humi.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 2) - else - humi.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 3) - - // 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) - humi.clear_alert(ALERT_TEMPERATURE) - humi.remove_movespeed_modifier(/datum/movespeed_modifier/cold) - humi.clear_mood_event("cold") - humi.clear_mood_event("hot") - - // Store the old bodytemp for future checking - humi.old_bodytemperature = bodytemp - -/** - * Used to apply wounds and damage based on core/body temp - * vars: - * * humi (required) The mob we will targeting - */ -/datum/species/proc/body_temperature_damage(mob/living/carbon/human/humi, seconds_per_tick, times_fired) - - //If the body temp is above the wound limit start adding exposure stacks - if(humi.bodytemperature > BODYTEMP_HEAT_WOUND_LIMIT) - humi.heat_exposure_stacks = min(humi.heat_exposure_stacks + (0.5 * seconds_per_tick), 40) - else //When below the wound limit, reduce the exposure stacks fast. - humi.heat_exposure_stacks = max(humi.heat_exposure_stacks - (2 * seconds_per_tick), 0) - - //when exposure stacks are greater then 10 + rand20 try to apply wounds and reset stacks - if(humi.heat_exposure_stacks > (10 + rand(0, 20))) - apply_burn_wounds(humi, seconds_per_tick, times_fired) - humi.heat_exposure_stacks = 0 - - // 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)) - var/firemodifier = humi.fire_stacks / 50 - if (!humi.on_fire) // We are not on fire, reduce the modifier - firemodifier = min(firemodifier, 0) - - // this can go below 5 at log 2.5 - var/burn_damage = max(log(2 - firemodifier, (humi.coretemperature - humi.get_body_temp_normal(apply_change=FALSE))) - 5, 0) - - // Apply species and physiology modifiers to heat damage - burn_damage = burn_damage * heatmod * humi.physiology.heat_mod * 0.5 * seconds_per_tick - - // 40% for level 3 damage on humans to scream in pain - if (humi.stat < UNCONSCIOUS && (prob(burn_damage) * 10) / 4) - humi.emote("scream") - - // 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) - - 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) - // 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 * seconds_per_tick, damage_type) - else if(humi.coretemperature in 120 to 200) - humi.apply_damage(COLD_DAMAGE_LEVEL_2 * damage_mod * seconds_per_tick, damage_type) - else - humi.apply_damage(COLD_DAMAGE_LEVEL_3 * damage_mod * seconds_per_tick, damage_type) - -/** - * Used to apply burn wounds on random limbs - * - * This is called from body_temperature_damage when exposure to extream heat adds up and causes a wound. - * The wounds will increase in severity as the temperature increases. - * vars: - * * humi (required) The mob we will targeting - */ -/datum/species/proc/apply_burn_wounds(mob/living/carbon/human/humi, seconds_per_tick, times_fired) - // If we are resistant to heat exit - if(HAS_TRAIT(humi, TRAIT_RESISTHEAT)) - return - - // If our body temp is to low for a wound exit - if(humi.bodytemperature < BODYTEMP_HEAT_WOUND_LIMIT) - return - - // Lets pick a random body part and check for an existing burn - var/obj/item/bodypart/bodypart = pick(humi.bodyparts) - var/datum/wound/burn/existing_burn = locate(/datum/wound/burn) in bodypart.wounds - - // If we have an existing burn try to upgrade it - if(existing_burn) - switch(existing_burn.severity) - if(WOUND_SEVERITY_MODERATE) - if(humi.bodytemperature > BODYTEMP_HEAT_WOUND_LIMIT + 400) // 800k - bodypart.force_wound_upwards(/datum/wound/burn/severe, wound_source = "hot temperatures") - if(WOUND_SEVERITY_SEVERE) - if(humi.bodytemperature > BODYTEMP_HEAT_WOUND_LIMIT + 2800) // 3200k - bodypart.force_wound_upwards(/datum/wound/burn/critical, wound_source = "hot temperatures") - else // If we have no burn apply the lowest level burn - bodypart.force_wound_upwards(/datum/wound/burn/moderate, wound_source = "hot temperatures") - - // always take some burn damage - var/burn_damage = HEAT_DAMAGE_LEVEL_1 - if(humi.bodytemperature > BODYTEMP_HEAT_WOUND_LIMIT + 400) - burn_damage = HEAT_DAMAGE_LEVEL_2 - if(humi.bodytemperature > BODYTEMP_HEAT_WOUND_LIMIT + 2800) - burn_damage = HEAT_DAMAGE_LEVEL_3 - - humi.apply_damage(burn_damage * seconds_per_tick, BURN, bodypart) - -/// Handle the air pressure of the environment -/datum/species/proc/handle_environment_pressure(mob/living/carbon/human/H, datum/gas_mixture/environment, seconds_per_tick, times_fired) - var/pressure = environment.return_pressure() - var/adjusted_pressure = H.calculate_affecting_pressure(pressure) - - // Set alerts and apply damage based on the amount of pressure - switch(adjusted_pressure) - // 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 * seconds_per_tick, required_bodytype = BODYTYPE_ORGANIC) - H.throw_alert(ALERT_PRESSURE, /atom/movable/screen/alert/highpressure, 2) - else - H.clear_alert(ALERT_PRESSURE) - - // High pressure, show an alert - if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE) - H.throw_alert(ALERT_PRESSURE, /atom/movable/screen/alert/highpressure, 1) - - // No pressure issues here clear pressure alerts - if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE) - H.clear_alert(ALERT_PRESSURE) - - // Low pressure here, show an alert - if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE) - // We have low pressure resit trait, clear alerts - if(HAS_TRAIT(H, TRAIT_RESISTLOWPRESSURE)) - H.clear_alert(ALERT_PRESSURE) - else - H.throw_alert(ALERT_PRESSURE, /atom/movable/screen/alert/lowpressure, 1) - - // Very low pressure, show an alert and take damage - else - // We have low pressure resit trait, clear alerts - if(HAS_TRAIT(H, TRAIT_RESISTLOWPRESSURE)) - H.clear_alert(ALERT_PRESSURE) - else - H.adjustBruteLoss(LOW_PRESSURE_DAMAGE * H.physiology.pressure_mod * seconds_per_tick, required_bodytype = BODYTYPE_ORGANIC) - H.throw_alert(ALERT_PRESSURE, /atom/movable/screen/alert/lowpressure, 2) - - -////////// -// FIRE // -////////// - -/datum/species/proc/handle_fire(mob/living/carbon/human/H, seconds_per_tick, times_fired, no_protection = FALSE) - return no_protection - -//////////// -// Stun // -//////////// - -/datum/species/proc/spec_stun(mob/living/carbon/human/H,amount) - if(H.movement_type & FLYING) - var/obj/item/organ/external/wings/functional/wings = H.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) - if(wings) - wings.toggle_flight(H) - wings.fly_slip(H) - . = stunmod * H.physiology.stun_mod * amount - -/datum/species/proc/negates_gravity(mob/living/carbon/human/H) - if(H.movement_type & FLYING) - 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) - former_tail_owner.clear_mood_event("tail_lost") - former_tail_owner.clear_mood_event("tail_balance_lost") - former_tail_owner.clear_mood_event("wrong_tail_regained") - -///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. -/datum/species/proc/get_features() - var/cached_features = GLOB.features_by_species[type] - if (!isnull(cached_features)) - return cached_features - - var/list/features = list() - - for (var/preference_type in GLOB.preference_entries) - var/datum/preference/preference = GLOB.preference_entries[preference_type] - - if ( \ - (preference.relevant_mutant_bodypart in mutant_bodyparts) \ - || (preference.relevant_species_trait in species_traits) \ - || (preference.relevant_external_organ in external_organs) - ) - features += preference.savefile_key - - for (var/obj/item/organ/external/organ_type as anything in external_organs) - var/preference = initial(organ_type.preference) - if (!isnull(preference)) - features += preference - - GLOB.features_by_species[type] = features - - return features - -/// 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) - return - -/// Returns the species's scream sound. -/datum/species/proc/get_scream_sound(mob/living/carbon/human/human) - return - -/datum/species/proc/get_types_to_preload() - var/list/to_store = list() - to_store += mutant_organs - for(var/obj/item/organ/external/horny as anything in external_organs) - 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 - //We don't cache mutant hands because it's not constrained enough, too high a potential for failure - return to_store - - -/** - * Owner login - */ - -/** - * A simple proc to be overwritten if something needs to be done when a mob logs in. Does nothing by default. - * - * Arguments: - * * owner - The owner of our species. - */ -/datum/species/proc/on_owner_login(mob/living/carbon/human/owner) - return - -/** - * Gets a short description for the specices. Should be relatively succinct. - * Used in the preference menu. - * - * Returns a string. - */ -/datum/species/proc/get_species_description() - SHOULD_CALL_PARENT(FALSE) - - stack_trace("Species [name] ([type]) did not have a description set, and is a selectable roundstart race! Override get_species_description.") - return "No species description set, file a bug report!" - -/** - * Gets the lore behind the type of species. Can be long. - * Used in the preference menu. - * - * Returns a list of strings. - * Between each entry in the list, a newline will be inserted, for formatting. - */ -/datum/species/proc/get_species_lore() - SHOULD_CALL_PARENT(FALSE) - RETURN_TYPE(/list) - - stack_trace("Species [name] ([type]) did not have lore set, and is a selectable roundstart race! Override get_species_lore.") - return list("No species lore set, file a bug report!") - -/** - * Translate the species liked foods from bitfields into strings - * and returns it in the form of an associated list. - * - * Returns a list, or null if they have no diet. - */ -/datum/species/proc/get_species_diet() - if(TRAIT_NOHUNGER in inherent_traits) - return null - - var/list/food_flags = FOOD_FLAGS - - return list( - "liked_food" = bitfield_to_list(liked_food, food_flags), - "disliked_food" = bitfield_to_list(disliked_food, food_flags), - "toxic_food" = bitfield_to_list(toxic_food, food_flags), - ) - -/** - * Generates a list of "perks" related to this species - * (Postives, neutrals, and negatives) - * in the format of a list of lists. - * Used in the preference menu. - * - * "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_NAME = name of the perk on hover - * SPECIES_PERK_DESC = description of the perk on hover - * ) - * - * Returns a list of lists. - * 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() - 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, - // and language perk last, as it comes at the end of the perks list - species_perks += create_pref_unique_perks() - species_perks += create_pref_blood_perks() - species_perks += create_pref_damage_perks() - species_perks += create_pref_temperature_perks() - species_perks += create_pref_traits_perks() - species_perks += create_pref_biotypes_perks() - species_perks += create_pref_organs_perks() - species_perks += create_pref_language_perk() - - // Some overrides may return `null`, prevent those from jamming up the list. - list_clear_nulls(species_perks) - - // Now let's sort them out for cleanliness and sanity - var/list/perks_to_return = list( - SPECIES_POSITIVE_PERK = list(), - SPECIES_NEUTRAL_PERK = list(), - SPECIES_NEGATIVE_PERK = list(), - ) - - 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, - // it's a bad entry - don't add it to our list. Throw a stack trace and skip it instead. - if(isnull(perks_to_return[perk_type])) - stack_trace("Invalid species perk ([perk[SPECIES_PERK_NAME]]) found for species [name]. \ - The type should be positive, negative, or neutral. (Got: [perk_type])") - continue - - perks_to_return[perk_type] += list(perk) - - return perks_to_return - -/** - * Used to add any species specific perks to the perk list. - * - * Returns null by default. When overriding, return a list of perks. - */ -/datum/species/proc/create_pref_unique_perks() - return null - -/** - * Adds adds any perks related to sustaining damage. - * For example, brute damage vulnerability, or fire damage resistance. - * - * Returns a list containing perks, or an empty list. - */ -/datum/species/proc/create_pref_damage_perks() - var/list/to_add = list() - - // Brute related - if(brutemod > 1) - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, - SPECIES_PERK_ICON = "band-aid", - SPECIES_PERK_NAME = "Brutal Weakness", - SPECIES_PERK_DESC = "[plural_form] are weak to brute damage.", - )) - - if(brutemod < 1) - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, - SPECIES_PERK_ICON = "shield-alt", - SPECIES_PERK_NAME = "Brutal Resilience", - SPECIES_PERK_DESC = "[plural_form] are resilient to bruising and brute damage.", - )) - - // Burn related - if(burnmod > 1) - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, - SPECIES_PERK_ICON = "burn", - SPECIES_PERK_NAME = "Fire Weakness", - SPECIES_PERK_DESC = "[plural_form] are weak to fire and burn damage.", - )) - - if(burnmod < 1) - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, - SPECIES_PERK_ICON = "shield-alt", - SPECIES_PERK_NAME = "Fire Resilience", - SPECIES_PERK_DESC = "[plural_form] are resilient to flames, and burn damage.", - )) - - // Shock damage - if(siemens_coeff > 1) - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, - SPECIES_PERK_ICON = "bolt", - SPECIES_PERK_NAME = "Shock Vulnerability", - SPECIES_PERK_DESC = "[plural_form] are vulnerable to being shocked.", - )) - - if(siemens_coeff < 1) - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, - SPECIES_PERK_ICON = "shield-alt", - SPECIES_PERK_NAME = "Shock Resilience", - SPECIES_PERK_DESC = "[plural_form] are resilient to being shocked.", - )) - - return to_add - -/** - * Adds adds any perks related to how the species deals with temperature. - * - * Returns a list containing perks, or an empty list. - */ -/datum/species/proc/create_pref_temperature_perks() - var/list/to_add = list() - - // Hot temperature tolerance - if(heatmod > 1 || bodytemp_heat_damage_limit < BODYTEMP_HEAT_DAMAGE_LIMIT) - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, - SPECIES_PERK_ICON = "temperature-high", - SPECIES_PERK_NAME = "Heat Vulnerability", - SPECIES_PERK_DESC = "[plural_form] are vulnerable to high temperatures.", - )) - - if(heatmod < 1 || bodytemp_heat_damage_limit > BODYTEMP_HEAT_DAMAGE_LIMIT) - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, - SPECIES_PERK_ICON = "thermometer-empty", - SPECIES_PERK_NAME = "Heat Resilience", - SPECIES_PERK_DESC = "[plural_form] are resilient to hotter environments.", - )) - - // Cold temperature tolerance - if(coldmod > 1 || bodytemp_cold_damage_limit > BODYTEMP_COLD_DAMAGE_LIMIT) - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, - SPECIES_PERK_ICON = "temperature-low", - SPECIES_PERK_NAME = "Cold Vulnerability", - SPECIES_PERK_DESC = "[plural_form] are vulnerable to cold temperatures.", - )) - - if(coldmod < 1 || bodytemp_cold_damage_limit < BODYTEMP_COLD_DAMAGE_LIMIT) - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, - SPECIES_PERK_ICON = "thermometer-empty", - SPECIES_PERK_NAME = "Cold Resilience", - SPECIES_PERK_DESC = "[plural_form] are resilient to colder environments.", - )) - - return to_add - -/** - * Adds adds any perks related to the species' blood (or lack thereof). - * - * Returns a list containing perks, or an empty list. - */ -/datum/species/proc/create_pref_blood_perks() - var/list/to_add = list() - - // TRAIT_NOBLOOD takes priority by default - if(TRAIT_NOBLOOD in inherent_traits) - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, - SPECIES_PERK_ICON = "tint-slash", - SPECIES_PERK_NAME = "Bloodletted", - SPECIES_PERK_DESC = "[plural_form] do not have blood.", - )) - - // Otherwise, check if their exotic blood is a valid typepath - else if(ispath(exotic_blood)) - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_NEUTRAL_PERK, - SPECIES_PERK_ICON = "tint", - SPECIES_PERK_NAME = initial(exotic_blood.name), - 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 - -/** - * Adds adds any perks related to the species' inherent_traits list. - * - * Returns a list containing perks, or an empty list. - */ -/datum/species/proc/create_pref_traits_perks() - var/list/to_add = list() - - if(TRAIT_LIMBATTACHMENT in inherent_traits) - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, - SPECIES_PERK_ICON = "user-plus", - SPECIES_PERK_NAME = "Limbs Easily Reattached", - SPECIES_PERK_DESC = "[plural_form] limbs are easily readded, and as such do not \ - require surgery to restore. Simply pick it up and pop it back in, champ!", - )) - - if(TRAIT_EASYDISMEMBER in inherent_traits) - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, - SPECIES_PERK_ICON = "user-times", - SPECIES_PERK_NAME = "Limbs Easily Dismembered", - 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, - SPECIES_PERK_ICON = "syringe", - SPECIES_PERK_NAME = "Toxins Lover", - SPECIES_PERK_DESC = "Toxins damage dealt to [plural_form] are reversed - healing toxins will instead cause harm, and \ - causing toxins will instead cause healing. Be careful around purging chemicals!", - )) - - if (TRAIT_GENELESS in inherent_traits) - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_NEUTRAL_PERK, - SPECIES_PERK_ICON = "dna", - SPECIES_PERK_NAME = "No Genes", - SPECIES_PERK_DESC = "[plural_form] have no genes, making genetic scrambling a useless weapon, but also locking them out from getting genetic powers.", - )) - - if (TRAIT_NOBREATH in inherent_traits) - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, - SPECIES_PERK_ICON = "wind", - SPECIES_PERK_NAME = "No Respiration", - SPECIES_PERK_DESC = "[plural_form] have no need to breathe!", - )) - - return to_add - -/** - * Adds adds any perks related to the species' inherent_biotypes flags. - * - * Returns a list containing perks, or an empty list. - */ -/datum/species/proc/create_pref_biotypes_perks() - var/list/to_add = list() - - if(inherent_biotypes & MOB_UNDEAD) - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, - SPECIES_PERK_ICON = "skull", - SPECIES_PERK_NAME = "Undead", - SPECIES_PERK_DESC = "[plural_form] are of the undead! The undead do not have the need to eat or breathe, and \ - most viruses will not be able to infect a walking corpse. Their worries mostly stop at remaining in one piece, really.", - )) - - return to_add - -/** - * Adds any perks relating to inherent differences to this species' organs. - * This proc is only suitable for generic differences, like alcohol tolerance, or heat threshold for breathing. - * - * Returns a list containing perks, or an empty list. - */ -/datum/species/proc/create_pref_organs_perks() - RETURN_TYPE(/list) - - var/list/to_add = list() - - to_add += create_pref_liver_perks() - to_add += create_pref_lung_perks() - - return to_add - -/datum/species/proc/create_pref_liver_perks() - RETURN_TYPE(/list) - - var/list/to_add = list() - - var/alcohol_tolerance = initial(mutantliver.alcohol_tolerance) - var/obj/item/organ/internal/liver/base_liver = /obj/item/organ/internal/liver - var/tolerance_difference = alcohol_tolerance - initial(base_liver.alcohol_tolerance) - - if (tolerance_difference != 0) - var/difference_positive = (tolerance_difference > 0) - var/more_or_less = (difference_positive) ? "more" : "less" - var/perk_type = (difference_positive) ? SPECIES_NEGATIVE_PERK : SPECIES_POSITIVE_PERK - var/perk_name = "Alcohol " + ((difference_positive) ? "Weakness" : "Tolerance") - var/percent_difference = (alcohol_tolerance / initial(base_liver.alcohol_tolerance)) * 100 - - to_add += list(list( - SPECIES_PERK_TYPE = perk_type, - SPECIES_PERK_ICON = "wine-glass", - SPECIES_PERK_NAME = perk_name, - SPECIES_PERK_DESC = "[name] livers are [more_or_less] susceptable to alcohol than human livers, by about [percent_difference]%." - )) - - var/tox_shrugging = initial(mutantliver.toxTolerance) - var/shrugging_difference = tox_shrugging - initial(base_liver.toxTolerance) - if (shrugging_difference != 0) - var/difference_positive = (shrugging_difference > 0) - var/more_or_less = (difference_positive) ? "more" : "less" - var/perk_type = (difference_positive) ? SPECIES_POSITIVE_PERK : SPECIES_NEGATIVE_PERK - var/perk_name = ("Toxin " + ((difference_positive) ? "Resistant" : "Vulnerable")) + " Liver" - - to_add += list(list( - SPECIES_PERK_TYPE = perk_type, - SPECIES_PERK_ICON = "biohazard", - SPECIES_PERK_NAME = perk_name, - SPECIES_PERK_DESC = "[name] livers are capable of rapidly shrugging off [tox_shrugging]u of toxins, which is [more_or_less] than humans." - )) - - return to_add - -/datum/species/proc/create_pref_lung_perks() - RETURN_TYPE(/list) - - var/list/to_add = list() - - if (breathid != GAS_O2) - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, - SPECIES_PERK_ICON = "wind", - SPECIES_PERK_NAME = "[capitalize(breathid)] Breathing", - SPECIES_PERK_DESC = "[plural_form] must breathe [breathid] to survive. You receive a tank when you arrive.", - )) - - return to_add - -/** - * Adds in a language perk based on all the languages the species - * can speak by default (according to their language holder). - * - * Returns a list containing perks, or an empty list. - */ -/datum/species/proc/create_pref_language_perk() - var/list/to_add = list() - - // Grab galactic common as a path, for comparisons - var/datum/language/common_language = /datum/language/common - - // Now let's find all the languages they can speak that aren't common - var/list/bonus_languages = list() - var/datum/language_holder/temp_holder = new species_language_holder() - for(var/datum/language/language_type as anything in temp_holder.spoken_languages) - if(ispath(language_type, common_language)) - continue - bonus_languages += initial(language_type.name) - - // If we have any languages we can speak: create a perk for them all - if(length(bonus_languages)) - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, - SPECIES_PERK_ICON = "comment", - SPECIES_PERK_NAME = "Native Speaker", - SPECIES_PERK_DESC = "Alongside [initial(common_language.name)], [plural_form] gain the ability to speak [english_list(bonus_languages)].", - )) - - qdel(temp_holder) - - return to_add - -///Handles replacing all of the bodyparts with their species version during set_species() -/datum/species/proc/replace_body(mob/living/carbon/target, datum/species/new_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 - - 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 - - for(var/obj/item/bodypart/old_part as anything in target.bodyparts) - if((old_part.change_exempt_flags & BP_BLOCK_CHANGE_SPECIES) || (old_part.bodypart_flags & BODYPART_IMPLANTED)) - continue - - var/path = new_species.bodypart_overrides?[old_part.body_zone] - var/obj/item/bodypart/new_part - if(path) - new_part = new path() - 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) 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 8aa309a84ccf2..58a46da81a488 100644 --- a/code/modules/mob/living/carbon/human/species_types/abductors.dm +++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm @@ -2,17 +2,15 @@ name = "Abductor" id = SPECIES_ABDUCTOR sexes = FALSE - species_traits = list( - NOEYESPRITES, - NO_UNDERWEAR, - ) inherent_traits = list( + TRAIT_NO_UNDERWEAR, TRAIT_NOBREATH, TRAIT_NOHUNGER, TRAIT_VIRUSIMMUNE, TRAIT_NOBLOOD, - TRAIT_NO_DEBRAIN_OVERLAY, TRAIT_CHUNKYFINGERS_IGNORE_BATON, + TRAIT_NODISMEMBER, + TRAIT_NEVER_WOUNDED ) mutanttongue = /obj/item/organ/internal/tongue/abductor mutantstomach = null diff --git a/code/modules/mob/living/carbon/human/species_types/abominations.dm b/code/modules/mob/living/carbon/human/species_types/abominations.dm index a308f5c962e8d..43ca71311c226 100644 --- a/code/modules/mob/living/carbon/human/species_types/abominations.dm +++ b/code/modules/mob/living/carbon/human/species_types/abominations.dm @@ -2,6 +2,8 @@ /datum/species/human/tallboy name = "\improper Tall Boy" id = SPECIES_TALLBOY + examine_limb_id = SPECIES_HUMAN + changesource_flags = MIRROR_BADMIN | WABBAJACK bodypart_overrides = list( BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left, BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right, @@ -12,7 +14,10 @@ ) /datum/species/monkey/human_legged + name = "human-legged monkey" id = SPECIES_MONKEY_HUMAN_LEGGED + examine_limb_id = SPECIES_MONKEY + changesource_flags = MIRROR_BADMIN | WABBAJACK bodypart_overrides = list( BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/monkey, BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/monkey, @@ -23,7 +28,10 @@ ) /datum/species/monkey/monkey_freak + name = "human-armed monkey" id = SPECIES_MONKEY_FREAK + examine_limb_id = SPECIES_MONKEY + changesource_flags = MIRROR_BADMIN | WABBAJACK bodypart_overrides = list( BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left, BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right, 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 41828bdf1b447..f17abdfc868ff 100644 --- a/code/modules/mob/living/carbon/human/species_types/android.dm +++ b/code/modules/mob/living/carbon/human/species_types/android.dm @@ -1,38 +1,38 @@ /datum/species/android name = "Android" id = SPECIES_ANDROID - species_traits = list( - NO_DNA_COPY, - NOTRANSSTING, - NO_UNDERWEAR, - ) + examine_limb_id = SPECIES_HUMAN inherent_traits = list( TRAIT_CAN_USE_FLIGHT_POTION, TRAIT_GENELESS, TRAIT_LIMBATTACHMENT, + TRAIT_LIVERLESS_METABOLISM, + TRAIT_NOBLOOD, TRAIT_NOBREATH, TRAIT_NOCLONELOSS, TRAIT_NOFIRE, TRAIT_NOHUNGER, - TRAIT_NOMETABOLISM, + TRAIT_NO_DNA_COPY, + TRAIT_NO_UNDERWEAR, TRAIT_PIERCEIMMUNE, TRAIT_RADIMMUNE, TRAIT_RESISTCOLD, TRAIT_RESISTHEAT, - TRAIT_RESISTLOWPRESSURE, TRAIT_RESISTHIGHPRESSURE, + TRAIT_RESISTLOWPRESSURE, TRAIT_TOXIMMUNE, - TRAIT_NOBLOOD, - TRAIT_NO_DEBRAIN_OVERLAY, ) inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID meat = null mutanttongue = /obj/item/organ/internal/tongue/robot mutantstomach = null + mutantappendix = null mutantheart = null mutantliver = null mutantlungs = null + mutanteyes = /obj/item/organ/internal/eyes/robotic + mutantears = /obj/item/organ/internal/ears/cybernetic species_language_holder = /datum/language_holder/synthetic wing_types = list(/obj/item/organ/external/wings/functional/robotic) changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT @@ -45,7 +45,6 @@ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/robot/android, BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/robot/android, ) - examine_limb_id = SPECIES_HUMAN /datum/species/android/on_species_gain(mob/living/carbon/C) . = ..() diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm index e0169ed535997..e59aa11375ff8 100644 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm @@ -1,26 +1,20 @@ /datum/species/dullahan name = "Dullahan" id = SPECIES_DULLAHAN - species_traits = list( - EYECOLOR, - HAIR, - FACEHAIR, - LIPS, - ) + examine_limb_id = SPECIES_HUMAN inherent_traits = list( TRAIT_NOBREATH, TRAIT_NOHUNGER, + TRAIT_USES_SKINTONES, ) inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID mutant_bodyparts = list("wings" = "None") - use_skintones = TRUE mutantbrain = /obj/item/organ/internal/brain/dullahan mutanteyes = /obj/item/organ/internal/eyes/dullahan mutanttongue = /obj/item/organ/internal/tongue/dullahan mutantears = /obj/item/organ/internal/ears/dullahan mutantstomach = null mutantlungs = null - examine_limb_id = SPECIES_HUMAN skinned_type = /obj/item/stack/sheet/animalhide/human changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN @@ -76,10 +70,11 @@ human.reset_perspective(human) /datum/species/dullahan/spec_life(mob/living/carbon/human/human, seconds_per_tick, times_fired) + . = ..() if(QDELETED(my_head)) my_head = null human.investigate_log("has been gibbed by the loss of [human.p_their()] head.", INVESTIGATE_DEATHS) - human.gib() + human.gib(DROP_ALL_REMAINS) return if(my_head.loc.name != human.real_name && istype(my_head.loc, /obj/item/bodypart/head)) @@ -92,7 +87,7 @@ if(illegal_head) my_head = null human.investigate_log("has been gibbed by having an illegal head put on [human.p_their()] shoulders.", INVESTIGATE_DEATHS) - 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. + human.gib(DROP_ALL_REMAINS) // 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/internal/eyes/eyes = human.get_organ_slot(ORGAN_SLOT_EYES) @@ -164,7 +159,7 @@ /obj/item/organ/internal/brain/dullahan decoy_override = TRUE - organ_flags = NONE + organ_flags = ORGAN_ORGANIC //not vital /obj/item/organ/internal/tongue/dullahan zone = "abstract" @@ -270,6 +265,6 @@ if(isdullahan(human)) var/datum/species/dullahan/dullahan_species = human.dna.species dullahan_species.my_head = null - owner.gib() + owner.gib(DROP_ALL_REMAINS) 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 85322a8934153..36b40a7ade694 100644 --- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm +++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm @@ -9,27 +9,26 @@ exotic_blood = /datum/reagent/consumable/liquidelectricity //Liquid Electricity. fuck you think of something better gamer exotic_bloodtype = "LE" siemens_coeff = 0.5 //They thrive on energy - brutemod = 1.25 //They're weak to punches - payday_modifier = 0.75 - species_traits = list( - DYNCOLORS, - AGENDER, - NO_UNDERWEAR, - HAIR, - FACEHAIR, + payday_modifier = 1.0 + inherent_traits = list( + TRAIT_NO_UNDERWEAR, + TRAIT_MUTANT_COLORS, + TRAIT_FIXED_MUTANT_COLORS, + TRAIT_FIXED_HAIRCOLOR, + TRAIT_AGENDER, ) 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 for ethereals is much higher then humans as they like hotter environments + // Body temperature for ethereals is much higher than 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 hair_color = "fixedmutcolor" hair_alpha = 140 + facial_hair_alpha = 140 bodypart_overrides = list( BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/ethereal, @@ -41,41 +40,39 @@ ) var/current_color - var/EMPeffect = FALSE - var/emageffect = FALSE + var/default_color var/r1 var/g1 var/b1 var/static/r2 = 237 var/static/g2 = 164 var/static/b2 = 149 + var/EMPeffect = FALSE + var/emageffect = FALSE var/obj/effect/dummy/lighting_obj/ethereal_light - var/default_color - - /datum/species/ethereal/Destroy(force) - if(ethereal_light) - QDEL_NULL(ethereal_light) + QDEL_NULL(ethereal_light) return ..() - -/datum/species/ethereal/on_species_gain(mob/living/carbon/new_ethereal, datum/species/old_species, pref_load) +/datum/species/ethereal/on_species_gain(mob/living/carbon/human/new_ethereal, datum/species/old_species, pref_load) . = ..() if(!ishuman(new_ethereal)) return - var/mob/living/carbon/human/ethereal = new_ethereal - default_color = ethereal.dna.features["ethcolor"] + default_color = new_ethereal.dna.features["ethcolor"] + fixed_hair_color = default_color 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)) - ethereal_light = ethereal.mob_light() - spec_updatehealth(ethereal) + RegisterSignal(new_ethereal, COMSIG_ATOM_EMAG_ACT, PROC_REF(on_emag_act)) + RegisterSignal(new_ethereal, COMSIG_ATOM_EMP_ACT, PROC_REF(on_emp_act)) + RegisterSignal(new_ethereal, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) + RegisterSignal(new_ethereal, COMSIG_LIGHT_EATER_ACT, PROC_REF(on_light_eater)) + RegisterSignal(new_ethereal, COMSIG_LIVING_HEALTH_UPDATE, PROC_REF(refresh_light_color)) + ethereal_light = new_ethereal.mob_light(light_type = /obj/effect/dummy/lighting_obj/moblight/species) + refresh_light_color(new_ethereal) new_ethereal.set_safe_hunger_level() - update_mail_goodies(ethereal) + update_mail_goodies(new_ethereal) var/obj/item/organ/internal/heart/ethereal/ethereal_heart = new_ethereal.get_organ_slot(ORGAN_SLOT_HEART) ethereal_heart.ethereal_color = default_color @@ -85,9 +82,13 @@ limb.update_limb(is_creating = TRUE) /datum/species/ethereal/on_species_loss(mob/living/carbon/human/former_ethereal, datum/species/new_species, pref_load) - UnregisterSignal(former_ethereal, COMSIG_ATOM_EMAG_ACT) - UnregisterSignal(former_ethereal, COMSIG_ATOM_EMP_ACT) - UnregisterSignal(former_ethereal, COMSIG_LIGHT_EATER_ACT) + UnregisterSignal(former_ethereal, list( + COMSIG_ATOM_EMAG_ACT, + COMSIG_ATOM_EMP_ACT, + COMSIG_HIT_BY_SABOTEUR, + COMSIG_LIGHT_EATER_ACT, + COMSIG_LIVING_HEALTH_UPDATE, + )) QDEL_NULL(ethereal_light) return ..() @@ -106,12 +107,14 @@ return randname -/datum/species/ethereal/randomize_features(mob/living/carbon/human/human_mob) - human_mob.dna.features["ethcolor"] = GLOB.color_list_ethereal[pick(GLOB.color_list_ethereal)] +/datum/species/ethereal/randomize_features() + var/list/features = ..() + features["ethcolor"] = GLOB.color_list_ethereal[pick(GLOB.color_list_ethereal)] + return features -/datum/species/ethereal/spec_updatehealth(mob/living/carbon/human/ethereal) - . = ..() - if(!ethereal_light) +/datum/species/ethereal/proc/refresh_light_color(mob/living/carbon/human/ethereal) + SIGNAL_HANDLER + if(isnull(ethereal_light)) return if(default_color != ethereal.dna.features["ethcolor"]) var/new_color = ethereal.dna.features["ethcolor"] @@ -125,34 +128,52 @@ 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 + fixed_hair_color = current_color + ethereal.update_body() + ethereal.set_facial_haircolor(current_color, override = TRUE, update = FALSE) + ethereal.set_haircolor(current_color, override = TRUE, update = TRUE) else ethereal_light.set_light_on(FALSE) - fixed_mut_color = rgb(128,128,128) - ethereal.hair_color = current_color - ethereal.facial_hair_color = current_color - ethereal.update_body() - -/datum/species/ethereal/proc/on_emp_act(mob/living/carbon/human/H, severity) + var/dead_color = rgb(128,128,128) + fixed_mut_color = dead_color + fixed_hair_color = dead_color + ethereal.update_body() + ethereal.set_facial_haircolor(dead_color, override = TRUE, update = FALSE) + ethereal.set_haircolor(dead_color, override = TRUE, update = TRUE) + +/datum/species/ethereal/proc/on_emp_act(mob/living/carbon/human/source, severity, protection) SIGNAL_HANDLER + if(protection & EMP_PROTECT_SELF) + return EMPeffect = TRUE - spec_updatehealth(H) - to_chat(H, span_notice("You feel the light of your body leave you.")) + refresh_light_color(source) + to_chat(source, span_notice("You feel the light of your body leave you.")) switch(severity) if(EMP_LIGHT) - addtimer(CALLBACK(src, PROC_REF(stop_emp), H), 10 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE) //We're out for 10 seconds + addtimer(CALLBACK(src, PROC_REF(stop_emp), source), 10 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE) //We're out for 10 seconds if(EMP_HEAVY) - addtimer(CALLBACK(src, PROC_REF(stop_emp), H), 20 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE) //We're out for 20 seconds + addtimer(CALLBACK(src, PROC_REF(stop_emp), source), 20 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE) //We're out for 20 seconds + +/datum/species/ethereal/proc/on_saboteur(mob/living/carbon/human/source, disrupt_duration) + SIGNAL_HANDLER + EMPeffect = TRUE + refresh_light_color(source) + to_chat(source, span_warning("Something inside of you crackles in a bad way.")) + source.take_bodypart_damage(burn = 3, wound_bonus = CANT_WOUND) + addtimer(CALLBACK(src, PROC_REF(stop_emp), source), disrupt_duration, TIMER_UNIQUE|TIMER_OVERRIDE) + return COMSIG_SABOTEUR_SUCCESS -/datum/species/ethereal/proc/on_emag_act(mob/living/carbon/human/H, mob/user) +/datum/species/ethereal/proc/on_emag_act(mob/living/carbon/human/source, mob/user) SIGNAL_HANDLER if(emageffect) - return + return FALSE emageffect = TRUE if(user) - to_chat(user, span_notice("You tap [H] on the back with your card.")) - H.visible_message(span_danger("[H] starts flickering in an array of colors!")) - handle_emag(H) - addtimer(CALLBACK(src, PROC_REF(stop_emag), H), 2 MINUTES) //Disco mode for 2 minutes! This doesn't affect the ethereal at all besides either annoying some players, or making someone look badass. + to_chat(user, span_notice("You tap [source] on the back with your card.")) + source.visible_message(span_danger("[source] starts flickering in an array of colors!")) + handle_emag(source) + addtimer(CALLBACK(src, PROC_REF(stop_emag), source), 2 MINUTES) //Disco mode for 2 minutes! This doesn't affect the ethereal at all besides either annoying some players, or making someone look badass. + return TRUE /// Special handling for getting hit with a light eater /datum/species/ethereal/proc/on_light_eater(mob/living/carbon/human/source, datum/light_eater) @@ -160,23 +181,22 @@ source.emp_act(EMP_LIGHT) return COMPONENT_BLOCK_LIGHT_EATER -/datum/species/ethereal/proc/stop_emp(mob/living/carbon/human/H) +/datum/species/ethereal/proc/stop_emp(mob/living/carbon/human/ethereal) EMPeffect = FALSE - spec_updatehealth(H) - to_chat(H, span_notice("You feel more energized as your shine comes back.")) + refresh_light_color(ethereal) + to_chat(ethereal, span_notice("You feel more energized as your shine comes back.")) - -/datum/species/ethereal/proc/handle_emag(mob/living/carbon/human/H) +/datum/species/ethereal/proc/handle_emag(mob/living/carbon/human/ethereal) if(!emageffect) return current_color = GLOB.color_list_ethereal[pick(GLOB.color_list_ethereal)] - spec_updatehealth(H) - addtimer(CALLBACK(src, PROC_REF(handle_emag), H), 5) //Call ourselves every 0.5 seconds to change color + refresh_light_color(ethereal) + addtimer(CALLBACK(src, PROC_REF(handle_emag), ethereal), 0.5 SECONDS) -/datum/species/ethereal/proc/stop_emag(mob/living/carbon/human/H) +/datum/species/ethereal/proc/stop_emag(mob/living/carbon/human/ethereal) emageffect = FALSE - spec_updatehealth(H) - H.visible_message(span_danger("[H] stops flickering and goes back to their normal state!")) + refresh_light_color(ethereal) + ethereal.visible_message(span_danger("[ethereal] stops flickering and goes back to their normal state!")) /datum/species/ethereal/get_features() var/list/features = ..() @@ -242,3 +262,42 @@ ) return to_add + +/datum/species/ethereal/lustrous //Ethereal pirates with an inherent bluespace prophet trauma. + name = "Lustrous" + id = SPECIES_ETHEREAL_LUSTROUS + examine_limb_id = SPECIES_ETHEREAL + mutantbrain = /obj/item/organ/internal/brain/lustrous + changesource_flags = MIRROR_BADMIN | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN + inherent_traits = list( + TRAIT_NO_UNDERWEAR, + TRAIT_MUTANT_COLORS, + TRAIT_FIXED_MUTANT_COLORS, + TRAIT_FIXED_HAIRCOLOR, + TRAIT_AGENDER, + TRAIT_TENACIOUS, + TRAIT_NOBREATH, + TRAIT_RESISTHIGHPRESSURE, + TRAIT_RESISTLOWPRESSURE, + TRAIT_VIRUSIMMUNE, + ) + bodypart_overrides = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/ethereal/lustrous, + BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/ethereal, + BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/ethereal, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ethereal, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ethereal, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/ethereal, + ) + +/datum/species/ethereal/lustrous/get_scream_sound(mob/living/carbon/human/ethereal) + return pick( + 'sound/voice/ethereal/lustrous_scream_1.ogg', + 'sound/voice/ethereal/lustrous_scream_2.ogg', + 'sound/voice/ethereal/lustrous_scream_3.ogg', + ) + +/datum/species/ethereal/lustrous/on_species_gain(mob/living/carbon/new_lustrous, datum/species/old_species, pref_load) + ..() + default_color = new_lustrous.dna.features["ethcolor"] + new_lustrous.dna.features["ethcolor"] = GLOB.color_list_lustrous[pick(GLOB.color_list_lustrous)] //Picks one of 5 lustrous-specific colors. diff --git a/code/modules/mob/living/carbon/human/species_types/felinid.dm b/code/modules/mob/living/carbon/human/species_types/felinid.dm index 6989eabe3a4bc..4114d6810dd9b 100644 --- a/code/modules/mob/living/carbon/human/species_types/felinid.dm +++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm @@ -2,33 +2,36 @@ /datum/species/human/felinid name = "Felinid" id = SPECIES_FELINE - + examine_limb_id = SPECIES_HUMAN mutant_bodyparts = list("ears" = "Cat", "wings" = "None") - + mutantbrain = /obj/item/organ/internal/brain/felinid mutanttongue = /obj/item/organ/internal/tongue/cat mutantears = /obj/item/organ/internal/ears/cat external_organs = list( /obj/item/organ/external/tail/cat = "Cat", ) - inherent_traits = list(TRAIT_CAN_USE_FLIGHT_POTION, TRAIT_HATED_BY_DOGS) + inherent_traits = list( + TRAIT_CAN_USE_FLIGHT_POTION, + TRAIT_HATED_BY_DOGS, + TRAIT_USES_SKINTONES, + ) 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 | BUGS | GORE - var/original_felinid = TRUE //set to false for felinids created by mass-purrbation - payday_modifier = 0.75 + payday_modifier = 1.0 ass_image = 'icons/ass/asscat.png' family_heirlooms = list(/obj/item/toy/cattoy) - examine_limb_id = SPECIES_HUMAN + /// When false, this is a felinid created by mass-purrbation + var/original_felinid = TRUE // Prevents felinids from taking toxin damage from carpotoxin -/datum/species/human/felinid/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, seconds_per_tick, times_fired) +/datum/species/human/felinid/handle_chemical(datum/reagent/chem, mob/living/carbon/human/affected, seconds_per_tick, times_fired) . = ..() + if(. & COMSIG_MOB_STOP_REAGENT_CHECK) + return 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/carbon_being, datum/species/old_species, pref_load) if(ishuman(carbon_being)) var/mob/living/carbon/human/target_human = carbon_being @@ -44,8 +47,9 @@ return ..() /datum/species/human/felinid/randomize_features(mob/living/carbon/human/human_mob) - randomize_external_organs(human_mob) - return ..() + var/list/features = ..() + features["ears"] = pick("None", "Cat") + return features /proc/mass_purrbation() for(var/mob in GLOB.human_list) @@ -126,9 +130,8 @@ to_chat(purrbated_human, 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() + human_for_preview.set_haircolor("#ffcccc", update = FALSE) // pink + human_for_preview.set_hairstyle("Hime Cut", update = TRUE) var/obj/item/organ/internal/ears/cat/cat_ears = human_for_preview.get_organ_by_type(/obj/item/organ/internal/ears/cat) if (cat_ears) 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 5d76627aeb5b1..7f1d111211569 100644 --- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm @@ -10,13 +10,10 @@ inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG meat = /obj/item/food/meat/slab/human/mutant/fly mutanteyes = /obj/item/organ/internal/eyes/fly - liked_food = GROSS | GORE - 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 wing_types = list(/obj/item/organ/external/wings/functional/fly) - payday_modifier = 0.75 + payday_modifier = 1.0 mutanttongue = /obj/item/organ/internal/tongue/fly mutantheart = /obj/item/organ/internal/heart/fly @@ -35,13 +32,6 @@ BODY_ZONE_CHEST = /obj/item/bodypart/chest/fly, ) -/datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, seconds_per_tick, times_fired) - if(chem.type == /datum/reagent/toxin/pestkiller) - H.adjustToxLoss(3 * REM * seconds_per_tick) - H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * seconds_per_tick) - return TRUE - return ..() - /datum/species/fly/check_species_weakness(obj/item/weapon, mob/living/attacker) if(istype(weapon, /obj/item/melee/flyswatter)) return 30 //Flyswatters deal 30x damage to flypeople. diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index a594b88e4e0d2..9df07a8e49635 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -2,29 +2,25 @@ /datum/species/golem name = "Golem" id = SPECIES_GOLEM - species_traits = list( - NO_DNA_COPY, - NOTRANSSTING, - NO_UNDERWEAR, - NOEYEHOLES, - NOAUGMENTS, - ) inherent_traits = list( TRAIT_GENELESS, TRAIT_LAVA_IMMUNE, + TRAIT_NEVER_WOUNDED, + TRAIT_NOBLOOD, TRAIT_NOBREATH, TRAIT_NODISMEMBER, - TRAIT_NOBLOOD, TRAIT_NOFIRE, + TRAIT_NO_AUGMENTS, + TRAIT_NO_DNA_COPY, + TRAIT_NO_UNDERWEAR, TRAIT_PIERCEIMMUNE, TRAIT_RADIMMUNE, ) mutantheart = null mutantlungs = null inherent_biotypes = MOB_HUMANOID|MOB_MINERAL - liked_food = STONE - armor = 10 - payday_modifier = 0.75 + damage_modifier = 10 //golem is stronk + payday_modifier = 1.0 siemens_coeff = 0 no_equip_flags = ITEM_SLOT_MASK | ITEM_SLOT_OCLOTHING | ITEM_SLOT_GLOVES | ITEM_SLOT_FEET | ITEM_SLOT_ICLOTHING | ITEM_SLOT_SUITSTORE changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC @@ -40,6 +36,7 @@ mutantbrain = /obj/item/organ/internal/brain/golem mutanttongue = /obj/item/organ/internal/tongue/golem mutantstomach = /obj/item/organ/internal/stomach/golem + mutantliver = /obj/item/organ/internal/liver/golem mutantappendix = /obj/item/organ/internal/appendix/golem bodypart_overrides = list( BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/golem, @@ -95,10 +92,3 @@ )) return to_add - -/// Remove nutrient value from non-mineral food, wish this was on an organ and not species but such is life -/datum/species/golem/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, delta_time, times_fired) - if (istype(chem, /datum/reagent/consumable) && !istype(chem, /datum/reagent/consumable/nutriment/mineral)) - var/datum/reagent/consumable/yummy_chem = chem - yummy_chem.nutriment_factor = 0 - 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 1cb700ed7d9ff..2afa32a6b6919 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -1,33 +1,21 @@ /datum/species/human name = "\improper Human" id = SPECIES_HUMAN - species_traits = list( - EYECOLOR, - HAIR, - FACEHAIR, - LIPS, - ) inherent_traits = list( TRAIT_CAN_USE_FLIGHT_POTION, + TRAIT_USES_SKINTONES, ) mutant_bodyparts = list("wings" = "None") - use_skintones = 1 skinned_type = /obj/item/stack/sheet/animalhide/human - disliked_food = GROSS | RAW | CLOTH | BUGS | GORE - liked_food = JUNKFOOD | FRIED changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT - payday_modifier = 1 + payday_modifier = 1.1 /datum/species/human/prepare_human_for_preview(mob/living/carbon/human/human) - human.hairstyle = "Business Hair" - human.hair_color = "#bb9966" // brown - human.update_body_parts() - -/datum/species/human/randomize_features(mob/living/carbon/human/human_mob) - human_mob.skin_tone = random_skin_tone() + human.set_haircolor("#bb9966", update = FALSE) // brown + human.set_hairstyle("Business Hair", update = TRUE) /datum/species/human/get_scream_sound(mob/living/carbon/human/human) - if(human.gender == MALE) + if(human.physique == MALE) if(prob(1)) return 'sound/voice/human/wilhelm_scream.ogg' return pick( @@ -92,4 +80,3 @@ )) return to_add - 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 68773e9a41ec8..30c374033fca4 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -10,11 +10,10 @@ name = "\improper Jellyperson" plural_form = "Jellypeople" id = SPECIES_JELLYPERSON - species_traits = list( - MUTCOLORS, - EYECOLOR, - ) + examine_limb_id = SPECIES_JELLYPERSON + inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_SLIME inherent_traits = list( + TRAIT_MUTANT_COLORS, TRAIT_TOXINLOVER, TRAIT_NOBLOOD, ) @@ -25,13 +24,9 @@ meat = /obj/item/food/meat/slab/human/mutant/slime exotic_blood = /datum/reagent/toxin/slimejelly blood_deficiency_drain_rate = JELLY_REGEN_RATE + BLOOD_DEFICIENCY_MODIFIER - var/datum/action/innate/regenerate_limbs/regenerate_limbs - liked_food = MEAT | BUGS - toxic_food = NONE coldmod = 6 // = 3x cold damage heatmod = 0.5 // = 1/4x heat damage - burnmod = 0.5 // = 1/2x generic burn damage - payday_modifier = 0.75 + payday_modifier = 1.0 changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT inherent_factions = list(FACTION_SLIME) species_language_holder = /datum/language_holder/jelly @@ -45,6 +40,7 @@ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/jelly, BODY_ZONE_CHEST = /obj/item/bodypart/chest/jelly, ) + var/datum/action/innate/regenerate_limbs/regenerate_limbs /datum/species/jelly/on_species_gain(mob/living/carbon/new_jellyperson, datum/species/old_species, pref_load) . = ..() @@ -69,6 +65,7 @@ return ..() /datum/species/jelly/spec_life(mob/living/carbon/human/H, seconds_per_tick, times_fired) + . = ..() if(H.stat == DEAD) //can't farm slime jelly from a dead slime/jelly person indefinitely return @@ -177,9 +174,9 @@ name = "\improper Slimeperson" plural_form = "Slimepeople" id = SPECIES_SLIMEPERSON - species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR) hair_color = "mutcolor" hair_alpha = 150 + facial_hair_alpha = 150 changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT mutanteyes = /obj/item/organ/internal/eyes var/datum/action/innate/split_body/slime_split @@ -239,6 +236,7 @@ bodies = old_species.bodies /datum/species/jelly/slime/spec_life(mob/living/carbon/human/H, seconds_per_tick, times_fired) + . = ..() if(H.blood_volume >= BLOOD_VOLUME_SLIME_SPLIT) if(SPT_PROB(2.5, seconds_per_tick)) to_chat(H, span_notice("You feel very bloated!")) @@ -248,8 +246,6 @@ if(H.blood_volume <= BLOOD_VOLUME_LOSE_NUTRITION) H.adjust_nutrition(-1.25 * seconds_per_tick) - ..() - /datum/action/innate/split_body name = "Split Body" check_flags = AB_CHECK_CONSCIOUS @@ -272,12 +268,12 @@ if(!isslimeperson(H)) return CHECK_DNA_AND_SPECIES(H) - H.visible_message("[owner] gains a look of \ - concentration while standing perfectly still.", - "You focus intently on moving your body while \ - standing perfectly still...") + H.visible_message( + span_notice("[owner] gains a look of concentration while standing perfectly still."), + span_notice("You focus intently on moving your body while standing perfectly still..."), + ) - H.notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, REF(src)) if(do_after(owner, delay = 6 SECONDS, target = owner, timed_action_flags = IGNORE_HELD_ITEM)) if(H.blood_volume >= BLOOD_VOLUME_SLIME_SPLIT) @@ -287,7 +283,7 @@ else to_chat(H, span_warning("...but fail to stand perfectly still!")) - H.notransform = FALSE + REMOVE_TRAIT(src, TRAIT_NO_TRANSFORM, REF(src)) /datum/action/innate/split_body/proc/make_dupe() var/mob/living/carbon/human/H = owner @@ -306,7 +302,7 @@ spare.Move(get_step(H.loc, pick(NORTH,SOUTH,EAST,WEST))) H.blood_volume *= 0.45 - H.notransform = 0 + REMOVE_TRAIT(H, TRAIT_NO_TRANSFORM, REF(src)) var/datum/species/jelly/slime/origin_datum = H.dna.species origin_datum.bodies |= spare @@ -316,10 +312,10 @@ 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()].", - "...and after a moment of disorentation, \ - you're besides yourself!") + spare.visible_message( + span_warning("[H] distorts as a new body \"steps out\" of [H.p_them()]."), + span_notice("...and after a moment of disorentation, you're besides yourself!"), + ) /datum/action/innate/swap_body @@ -488,7 +484,7 @@ /// How strong is our glow var/glow_intensity = LUMINESCENT_DEFAULT_GLOW /// Internal dummy used to glow (very cool) - var/obj/effect/dummy/luminescent_glow/glow + var/obj/effect/dummy/lighting_obj/moblight/glow /// The slime extract we currently have integrated var/obj/item/slime_extract/current_extract /// A list of all luminescent related actions we have @@ -496,25 +492,16 @@ /// The cooldown of us using exteracts COOLDOWN_DECLARE(extract_cooldown) -//Species datums don't normally implement destroy, but JELLIES SUCK ASS OUT OF A STEEL STRAW -/datum/species/jelly/luminescent/Destroy(force, ...) +//Species datums don't normally implement destroy, but JELLIES SUCK ASS OUT OF A STEEL STRAW and have to i guess +/datum/species/jelly/luminescent/Destroy(force) current_extract = null QDEL_NULL(glow) QDEL_LIST(luminescent_actions) return ..() - -/datum/species/jelly/luminescent/on_species_loss(mob/living/carbon/C) - . = ..() - if(current_extract) - current_extract.forceMove(C.drop_location()) - current_extract = null - QDEL_NULL(glow) - QDEL_LIST(luminescent_actions) - /datum/species/jelly/luminescent/on_species_gain(mob/living/carbon/new_jellyperson, datum/species/old_species) . = ..() - glow = new(new_jellyperson) + glow = new_jellyperson.mob_light(light_type = /obj/effect/dummy/lighting_obj/moblight/species) update_glow(new_jellyperson) luminescent_actions = list() @@ -531,26 +518,19 @@ extract_major.Grant(new_jellyperson) luminescent_actions += integrate_extract -/// Updates the glow of our internal glow thing. -/datum/species/jelly/luminescent/proc/update_glow(mob/living/carbon/C, intensity) - if(intensity) - glow_intensity = intensity - glow.set_light_range_power_color(glow_intensity, glow_intensity, C.dna.features["mcolor"]) - -/obj/effect/dummy/luminescent_glow - name = "luminescent glow" - desc = "Tell a coder if you're seeing this." - icon_state = "nothing" - light_system = MOVABLE_LIGHT - light_range = LUMINESCENT_DEFAULT_GLOW - light_power = 2.5 - light_color = COLOR_WHITE - -/obj/effect/dummy/luminescent_glow/Initialize(mapload) +/datum/species/jelly/luminescent/on_species_loss(mob/living/carbon/C) . = ..() - if(!isliving(loc)) - return INITIALIZE_HINT_QDEL + if(current_extract) + current_extract.forceMove(C.drop_location()) + current_extract = null + QDEL_NULL(glow) + QDEL_LIST(luminescent_actions) +/// Updates the glow of our internal glow object +/datum/species/jelly/luminescent/proc/update_glow(mob/living/carbon/human/glowie, intensity) + if(intensity) + glow_intensity = intensity + glow.set_light_range_power_color(glow_intensity, glow_intensity, glowie.dna.features["mcolor"]) /datum/action/innate/integrate_extract name = "Integrate Extract" 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 cf8925471d557..d94d3390b866e 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -3,12 +3,8 @@ name = "\improper Lizardperson" plural_form = "Lizardfolk" id = SPECIES_LIZARD - species_traits = list( - MUTCOLORS, - EYECOLOR, - LIPS, - ) inherent_traits = list( + TRAIT_MUTANT_COLORS, TRAIT_CAN_USE_FLIGHT_POTION, TRAIT_TACKLING_TAILED_DEFENDER, ) @@ -24,14 +20,12 @@ mutanttongue = /obj/item/organ/internal/tongue/lizard coldmod = 1.5 heatmod = 0.67 - payday_modifier = 0.75 + payday_modifier = 1.0 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 | GROSS - liked_food = GORE | MEAT | SEAFOOD | NUTS | BUGS inert_mutation = /datum/mutation/human/firebreath death_sound = 'sound/voice/lizard/deathsound.ogg' wing_types = list(/obj/item/organ/external/wings/functional/dragon) @@ -81,9 +75,10 @@ return randname -/datum/species/lizard/randomize_features(mob/living/carbon/human/human_mob) - human_mob.dna.features["body_markings"] = pick(GLOB.body_markings_list) - randomize_external_organs(human_mob) +/datum/species/lizard/randomize_features() + var/list/features = ..() + features["body_markings"] = pick(GLOB.body_markings_list) + return features /datum/species/lizard/get_scream_sound(mob/living/carbon/human/lizard) return pick( @@ -138,16 +133,13 @@ Lizard subspecies: ASHWALKERS /datum/species/lizard/ashwalker name = "Ash Walker" id = SPECIES_LIZARD_ASH + examine_limb_id = SPECIES_LIZARD mutantlungs = /obj/item/organ/internal/lungs/lavaland mutantbrain = /obj/item/organ/internal/brain/primitive - species_traits = list( - MUTCOLORS, - EYECOLOR, - LIPS, - ) inherent_traits = list( - //TRAIT_LITERATE, + TRAIT_MUTANT_COLORS, TRAIT_VIRUSIMMUNE, + TRAIT_FORBID_MINING_SHUTTLE_CONSOLE_OUTSIDE_STATION, ) species_language_holder = /datum/language_holder/lizard/ash digitigrade_customization = DIGITIGRADE_FORCED @@ -178,9 +170,9 @@ Lizard subspecies: SILVER SCALED TRAIT_WINE_TASTER, ) mutantlungs = null + damage_modifier = 10 //very light silvery scales soften blows species_language_holder = /datum/language_holder/lizard/silver mutanttongue = /obj/item/organ/internal/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. @@ -190,22 +182,19 @@ Lizard subspecies: SILVER SCALED ///See above var/old_eye_color_right -/datum/species/lizard/silverscale/on_species_gain(mob/living/carbon/new_silverscale, datum/species/old_species, pref_load) - var/mob/living/carbon/human/silverscale = new_silverscale +/datum/species/lizard/silverscale/on_species_gain(mob/living/carbon/human/new_silverscale, datum/species/old_species, pref_load) old_mutcolor = new_silverscale.dna.features["mcolor"] - old_eye_color_left = silverscale.eye_color_left - old_eye_color_right = silverscale.eye_color_right + old_eye_color_left = new_silverscale.eye_color_left + old_eye_color_right = new_silverscale.eye_color_right new_silverscale.dna.features["mcolor"] = "#eeeeee" - silverscale.eye_color_left = "#0000a0" - silverscale.eye_color_right = "#0000a0" - ..() - silverscale.add_filter("silver_glint", 2, list("type" = "outline", "color" = "#ffffff63", "size" = 2)) + 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/old_silverscale, datum/species/new_species, pref_load) - var/mob/living/carbon/human/was_silverscale = old_silverscale +/datum/species/lizard/silverscale/on_species_loss(mob/living/carbon/human/was_silverscale, datum/species/new_species, pref_load) was_silverscale.dna.features["mcolor"] = 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") - ..() + return ..() 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 4ad0895d6c344..4d39ece432971 100644 --- a/code/modules/mob/living/carbon/human/species_types/monkeys.dm +++ b/code/modules/mob/living/carbon/human/species_types/monkeys.dm @@ -3,7 +3,6 @@ /datum/species/monkey name = "Monkey" id = SPECIES_MONKEY - bodytype = BODYTYPE_ORGANIC | BODYTYPE_MONKEY external_organs = list( /obj/item/organ/external/tail/monkey = "Monkey" ) @@ -12,24 +11,17 @@ skinned_type = /obj/item/stack/sheet/animalhide/monkey 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( - NO_UNDERWEAR, - LIPS, - NOEYESPRITES, - NOBLOODOVERLAY, - NOTRANSSTING, - NOAUGMENTS, - ) inherent_traits = list( TRAIT_GUN_NATURAL, - //TRAIT_LITERATE, + TRAIT_NO_AUGMENTS, + TRAIT_NO_BLOOD_OVERLAY, + TRAIT_NO_DNA_COPY, + TRAIT_NO_UNDERWEAR, TRAIT_VENTCRAWLER_NUDE, TRAIT_WEAK_SOUL, ) no_equip_flags = ITEM_SLOT_OCLOTHING | ITEM_SLOT_GLOVES | ITEM_SLOT_FEET | ITEM_SLOT_SUITSTORE changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | ERT_SPAWN | SLIME_EXTRACT - liked_food = MEAT | FRUIT | BUGS - disliked_food = CLOTH sexes = FALSE species_language_holder = /datum/language_holder/monkey @@ -57,16 +49,13 @@ /datum/species/monkey/on_species_gain(mob/living/carbon/human/H, datum/species/old_species) . = ..() - H.pass_flags |= PASSTABLE - H.butcher_results = knife_butcher_results + passtable_on(H, SPECIES_TRAIT) H.dna.add_mutation(/datum/mutation/human/race, MUT_NORMAL) H.dna.activate_mutation(/datum/mutation/human/race) - /datum/species/monkey/on_species_loss(mob/living/carbon/C) . = ..() - C.pass_flags = initial(C.pass_flags) - C.butcher_results = null + passtable_off(C, SPECIES_TRAIT) C.dna.remove_mutation(/datum/mutation/human/race) /datum/species/monkey/spec_unarmedattack(mob/living/carbon/human/user, atom/target, modifiers) 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 b2767c3b0b99a..0447b1f18695d 100644 --- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm @@ -2,11 +2,8 @@ name = "\improper Mothman" plural_form = "Mothmen" id = SPECIES_MOTH - species_traits = list( - LIPS, - HAS_MARKINGS, - ) inherent_traits = list( + TRAIT_HAS_MARKINGS, TRAIT_CAN_USE_FLIGHT_POTION, TRAIT_TACKLING_WINGED_ATTACKER, TRAIT_ANTENNAE, @@ -15,15 +12,13 @@ mutant_bodyparts = list("moth_markings" = "None") external_organs = list(/obj/item/organ/external/wings/moth = "Plain", /obj/item/organ/external/antennae = "Plain") meat = /obj/item/food/meat/slab/human/mutant/moth - liked_food = VEGETABLES | DAIRY | CLOTH - disliked_food = FRUIT | GROSS | BUGS | GORE - toxic_food = MEAT | RAW | SEAFOOD mutanttongue = /obj/item/organ/internal/tongue/moth mutanteyes = /obj/item/organ/internal/eyes/moth changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT species_language_holder = /datum/language_holder/moth + death_sound = 'sound/voice/moth/moth_death.ogg' wing_types = list(/obj/item/organ/external/wings/functional/moth/megamoth, /obj/item/organ/external/wings/functional/moth/mothra) - payday_modifier = 0.75 + payday_modifier = 1.0 family_heirlooms = list(/obj/item/flashlight/lantern/heirloom_moth) bodypart_overrides = list( @@ -52,21 +47,15 @@ return randname -/datum/species/moth/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, seconds_per_tick, times_fired) - . = ..() - if(chem.type == /datum/reagent/toxin/pestkiller) - H.adjustToxLoss(3 * REM * seconds_per_tick) - H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * seconds_per_tick) - /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 return 1 - -/datum/species/moth/randomize_features(mob/living/carbon/human/human_mob) - human_mob.dna.features["moth_markings"] = pick(GLOB.moth_markings_list) - randomize_external_organs(human_mob) +/datum/species/moth/randomize_features() + var/list/features = ..() + features["moth_markings"] = pick(GLOB.moth_markings_list) + return features /datum/species/moth/get_scream_sound(mob/living/carbon/human/human) return 'sound/voice/moth/scream_moth.ogg' diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm index 4a1981f4478c7..1ed92a7a1d5e5 100644 --- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm @@ -8,28 +8,21 @@ fixed_mut_color = "#DBBF92" hair_color = "#FF4B19" //cap color, spot color uses eye color - species_traits = list( - MUTCOLORS, - NOEYESPRITES, - NO_UNDERWEAR, - ) inherent_traits = list( + TRAIT_MUTANT_COLORS, TRAIT_NOBREATH, TRAIT_NOFLASH, + TRAIT_NO_UNDERWEAR, ) inherent_factions = list(FACTION_MUSHROOM) - speedmod = 1.5 //faster than golems but not by much no_equip_flags = ITEM_SLOT_MASK | ITEM_SLOT_OCLOTHING | ITEM_SLOT_GLOVES | ITEM_SLOT_FEET | ITEM_SLOT_ICLOTHING - burnmod = 1.25 heatmod = 1.5 mutanttongue = /obj/item/organ/internal/tongue/mush mutanteyes = /obj/item/organ/internal/eyes/night_vision/mushroom mutantlungs = null - use_skintones = FALSE - var/datum/martial_art/mushpunch/mush species_language_holder = /datum/language_holder/mushroom bodypart_overrides = list( @@ -40,6 +33,7 @@ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/mushroom, BODY_ZONE_CHEST = /obj/item/bodypart/chest/mushroom, ) + var/datum/martial_art/mushpunch/mush /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. @@ -59,13 +53,13 @@ mush.remove(C) QDEL_NULL(mush) -/datum/species/mush/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, seconds_per_tick, times_fired) +/datum/species/mush/handle_chemical(datum/reagent/chem, mob/living/carbon/human/affected, seconds_per_tick, times_fired) + . = ..() + if(. & COMSIG_MOB_STOP_REAGENT_CHECK) + return if(chem.type == /datum/reagent/toxin/plantbgone/weedkiller) - H.adjustToxLoss(3 * REM * seconds_per_tick) - H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * seconds_per_tick) - return TRUE - return ..() + affected.adjustToxLoss(3 * REM * seconds_per_tick) /datum/species/mush/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour) forced_colour = FALSE - ..() + return ..() diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index 8b8c4a3c86e1d..5263101680b88 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -2,36 +2,29 @@ name = "\improper Plasmaman" plural_form = "Plasmamen" id = SPECIES_PLASMAMAN - sexes = 0 + sexes = FALSE meat = /obj/item/stack/sheet/mineral/plasma - species_traits = list( - NOTRANSSTING, - ) // 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_GENELESS, TRAIT_HARDLY_WOUNDED, + TRAIT_NOBLOOD, + TRAIT_NO_DNA_COPY, TRAIT_RADIMMUNE, TRAIT_RESISTCOLD, - TRAIT_NOBLOOD, - TRAIT_NO_DEBRAIN_OVERLAY, ) inherent_biotypes = MOB_HUMANOID|MOB_MINERAL inherent_respiration_type = RESPIRATION_PLASMA mutantlungs = /obj/item/organ/internal/lungs/plasmaman mutanttongue = /obj/item/organ/internal/tongue/bone/plasmaman - mutantliver = /obj/item/organ/internal/liver/plasmaman + mutantliver = /obj/item/organ/internal/liver/bone/plasmaman mutantstomach = /obj/item/organ/internal/stomach/bone/plasmaman mutantappendix = null mutantheart = null - burnmod = 1.5 heatmod = 1.5 - brutemod = 1.5 - payday_modifier = 0.75 + payday_modifier = 1.0 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/condiment/milk outfit_important_for_life = /datum/outfit/plasmaman @@ -57,6 +50,13 @@ ass_image = 'icons/ass/assplasma.png' + outfit_override_registry = list( + /datum/outfit/syndicate = /datum/outfit/syndicate/plasmaman, + /datum/outfit/syndicate/full = /datum/outfit/syndicate/full/plasmaman, + /datum/outfit/syndicate/leader = /datum/outfit/syndicate/leader/plasmaman, + /datum/outfit/syndicate/reinforcement = /datum/outfit/syndicate/reinforcement/plasmaman, + ) + /// If the bones themselves are burning clothes won't help you much var/internal_fire = FALSE @@ -65,6 +65,7 @@ C.set_safe_hunger_level() /datum/species/plasmaman/spec_life(mob/living/carbon/human/H, seconds_per_tick, times_fired) + . = ..() var/atmos_sealed = TRUE if(HAS_TRAIT(H, TRAIT_NOFIRE)) atmos_sealed = FALSE @@ -114,7 +115,7 @@ H.update_fire() -/datum/species/plasmaman/handle_fire(mob/living/carbon/human/H, seconds_per_tick, times_fired, no_protection = FALSE) +/datum/species/plasmaman/handle_fire(mob/living/carbon/human/H, seconds_per_tick, no_protection = FALSE) if(internal_fire) no_protection = TRUE . = ..() @@ -136,57 +137,6 @@ return randname -/datum/species/plasmaman/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, seconds_per_tick, times_fired) - . = ..() - if(istype(chem, /datum/reagent/toxin/plasma) || istype(chem, /datum/reagent/toxin/hot_ice)) - for(var/i in H.all_wounds) - var/datum/wound/iter_wound = i - iter_wound.on_xadone(4 * REM * seconds_per_tick) // plasmamen use plasma to reform their bones or whatever - return FALSE // do normal metabolism - - if(istype(chem, /datum/reagent/toxin/bonehurtingjuice)) - H.adjustStaminaLoss(7.5 * REM * seconds_per_tick, 0) - H.adjustBruteLoss(0.5 * REM * seconds_per_tick, 0) - if(SPT_PROB(10, seconds_per_tick)) - 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(SPT_PROB(2, seconds_per_tick) && 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 * seconds_per_tick) - return TRUE - - if(istype(chem, /datum/reagent/gunpowder)) - H.set_timed_status_effect(15 SECONDS * seconds_per_tick, /datum/status_effect/drugginess) - if(H.get_timed_status_effect_duration(/datum/status_effect/hallucination) / 10 < chem.volume) - H.adjust_hallucinations(2.5 SECONDS * seconds_per_tick) - // Do normal metabolism - return FALSE - if(chem.type == /datum/reagent/consumable/milk) - if(chem.volume > 50) - H.reagents.remove_reagent(chem.type, chem.volume - 5) - to_chat(H, span_warning("The excess milk is dripping off your bones!")) - H.heal_bodypart_damage(2.5 * REM * seconds_per_tick) - - for(var/datum/wound/iter_wound as anything in H.all_wounds) - iter_wound.on_xadone(1 * REM * seconds_per_tick) - H.reagents.remove_reagent(chem.type, chem.metabolization_rate * seconds_per_tick) - return FALSE - /datum/species/plasmaman/get_scream_sound(mob/living/carbon/human) return pick( 'sound/voice/plasmaman/plasmeme_scream_1.ogg', 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 db38cc85fc0fa..cd0a0c99449f6 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -3,11 +3,8 @@ name = "\improper Podperson" plural_form = "Podpeople" id = SPECIES_PODPERSON - species_traits = list( - MUTCOLORS, - EYECOLOR, - ) inherent_traits = list( + TRAIT_MUTANT_COLORS, TRAIT_PLANT_SAFE, ) external_organs = list( @@ -16,16 +13,13 @@ inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID | MOB_PLANT inherent_factions = list(FACTION_PLANTS, FACTION_VINES) - burnmod = 1.25 heatmod = 1.5 - payday_modifier = 0.75 + payday_modifier = 1.0 meat = /obj/item/food/meat/slab/human/mutant/plant exotic_blood = /datum/reagent/water - disliked_food = MEAT | DAIRY | SEAFOOD | BUGS - liked_food = VEGETABLES | FRUIT | GRAIN changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT species_language_holder = /datum/language_holder/plant - + mutanttongue = /obj/item/organ/internal/tongue/pod bodypart_overrides = list( BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/pod, BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/pod, @@ -49,33 +43,36 @@ ) return ..() -/datum/species/pod/spec_life(mob/living/carbon/human/H, seconds_per_tick, times_fired) - if(H.stat == DEAD) +/datum/species/pod/spec_life(mob/living/carbon/human/podperson, seconds_per_tick, times_fired) + . = ..() + if(podperson.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 * seconds_per_tick) + if(isturf(podperson.loc)) //else, there's considered to be no light + var/turf/turf_loc = podperson.loc + light_amount = min(1, turf_loc.get_lumcount()) - 0.5 + podperson.adjust_nutrition(5 * light_amount * seconds_per_tick) if(light_amount > 0.2) //if there's enough light, heal - H.heal_overall_damage(brute = 0.5 * seconds_per_tick, burn = 0.5 * seconds_per_tick, required_bodytype = BODYTYPE_ORGANIC) - H.adjustToxLoss(-0.5 * seconds_per_tick) - H.adjustOxyLoss(-0.5 * seconds_per_tick) + var/need_mob_update = FALSE + need_mob_update += podperson.heal_overall_damage(brute = 0.5 * seconds_per_tick, burn = 0.5 * seconds_per_tick, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + need_mob_update += podperson.adjustToxLoss(-0.5 * seconds_per_tick, updating_health = FALSE) + need_mob_update += podperson.adjustOxyLoss(-0.5 * seconds_per_tick, updating_health = FALSE) + if(need_mob_update) + podperson.updatehealth() - if(H.nutrition > NUTRITION_LEVEL_ALMOST_FULL) //don't make podpeople fat because they stood in the sun for too long - H.set_nutrition(NUTRITION_LEVEL_ALMOST_FULL) + if(podperson.nutrition > NUTRITION_LEVEL_ALMOST_FULL) //don't make podpeople fat because they stood in the sun for too long + podperson.set_nutrition(NUTRITION_LEVEL_ALMOST_FULL) - if(H.nutrition < NUTRITION_LEVEL_STARVING + 50) - H.take_overall_damage(brute = 1 * seconds_per_tick, required_bodytype = BODYTYPE_ORGANIC) - ..() + if(podperson.nutrition < NUTRITION_LEVEL_STARVING + 50) + podperson.take_overall_damage(brute = 1 * seconds_per_tick, required_bodytype = BODYTYPE_ORGANIC) -/datum/species/pod/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, seconds_per_tick, times_fired) +/datum/species/pod/handle_chemical(datum/reagent/chem, mob/living/carbon/human/affected, seconds_per_tick, times_fired) + . = ..() + if(. & COMSIG_MOB_STOP_REAGENT_CHECK) + return if(chem.type == /datum/reagent/toxin/plantbgone) - H.adjustToxLoss(3 * REM * seconds_per_tick) - H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * seconds_per_tick) - return TRUE - return ..() + affected.adjustToxLoss(3 * REM * seconds_per_tick) /datum/species/pod/create_pref_unique_perks() var/list/to_add = list() @@ -104,6 +101,3 @@ )) return to_add - -/datum/species/pod/randomize_features(mob/living/carbon/human_mob) - randomize_external_organs(human_mob) 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 a15e03717e5da..687e304938135 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -3,16 +3,15 @@ name = "Shadow" plural_form = "Shadowpeople" id = SPECIES_SHADOW - sexes = 0 + sexes = FALSE meat = /obj/item/food/meat/slab/human/mutant/shadow - species_traits = list( - NOEYESPRITES, - ) inherent_traits = list( TRAIT_NOBREATH, TRAIT_RADIMMUNE, TRAIT_VIRUSIMMUNE, TRAIT_NOBLOOD, + TRAIT_NODISMEMBER, + TRAIT_NEVER_WOUNDED ) inherent_factions = list(FACTION_FAITHLESS) changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC 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 73a4186314554..db753732fdcd6 100644 --- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm +++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm @@ -2,43 +2,35 @@ // 2spooky name = "Spooky Scary Skeleton" id = SPECIES_SKELETON - sexes = 0 + sexes = FALSE meat = /obj/item/food/meat/slab/human/mutant/skeleton - species_traits = list( - NOTRANSSTING, - NOEYESPRITES, - NO_DNA_COPY, - NO_UNDERWEAR, - ) inherent_traits = list( TRAIT_CAN_USE_FLIGHT_POTION, TRAIT_EASYDISMEMBER, TRAIT_FAKEDEATH, TRAIT_GENELESS, TRAIT_LIMBATTACHMENT, + TRAIT_NOBLOOD, TRAIT_NOBREATH, TRAIT_NOCLONELOSS, - TRAIT_NOMETABOLISM, - TRAIT_RADIMMUNE, + TRAIT_NO_DNA_COPY, + TRAIT_NO_UNDERWEAR, TRAIT_PIERCEIMMUNE, + TRAIT_RADIMMUNE, TRAIT_RESISTCOLD, TRAIT_RESISTHEAT, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE, TRAIT_TOXIMMUNE, TRAIT_XENO_IMMUNE, - TRAIT_NOBLOOD, - TRAIT_NO_DEBRAIN_OVERLAY, ) inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID mutanttongue = /obj/item/organ/internal/tongue/bone mutantstomach = /obj/item/organ/internal/stomach/bone mutantappendix = null mutantheart = null - mutantliver = null + mutantliver = /obj/item/organ/internal/liver/bone mutantlungs = null - disliked_food = NONE - liked_food = GROSS | MEAT | RAW | GORE wing_types = list(/obj/item/organ/external/wings/functional/skeleton) //They can technically be in an ERT changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN @@ -63,45 +55,6 @@ return TRUE return ..() -//Can still metabolize milk through meme magic -/datum/species/skeleton/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, seconds_per_tick, times_fired) - . = ..() - if(chem.type == /datum/reagent/toxin/bonehurtingjuice) - H.adjustStaminaLoss(7.5 * REM * seconds_per_tick, 0) - H.adjustBruteLoss(0.5 * REM * seconds_per_tick, 0) - if(SPT_PROB(10, seconds_per_tick)) - 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(SPT_PROB(2, seconds_per_tick) && 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 * seconds_per_tick) - return TRUE - if(chem.type == /datum/reagent/consumable/milk) - if(chem.volume > 50) - H.reagents.remove_reagent(chem.type, chem.volume - 5) - to_chat(H, span_warning("The excess milk is dripping off your bones!")) - H.heal_bodypart_damage(2.5 * REM * seconds_per_tick, 2.5 * REM * seconds_per_tick) - - for(var/datum/wound/iter_wound as anything in H.all_wounds) - iter_wound.on_xadone(1 * REM * seconds_per_tick) - H.reagents.remove_reagent(chem.type, chem.metabolization_rate * seconds_per_tick) - return FALSE - /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/snail.dm b/code/modules/mob/living/carbon/human/species_types/snail.dm index 6dc24addcf86b..41a6166812865 100644 --- a/code/modules/mob/living/carbon/human/species_types/snail.dm +++ b/code/modules/mob/living/carbon/human/species_types/snail.dm @@ -1,17 +1,13 @@ /datum/species/snail name = "Snailperson" id = SPECIES_SNAIL - species_traits = list( - MUTCOLORS, - NO_UNDERWEAR, - ) inherent_traits = list( + TRAIT_MUTANT_COLORS, + TRAIT_NO_UNDERWEAR, TRAIT_NO_SLIP_ALL, ) 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 @@ -29,13 +25,15 @@ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/snail ) -/datum/species/snail/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, seconds_per_tick, times_fired) +/datum/species/snail/handle_chemical(datum/reagent/chem, mob/living/carbon/human/affected, seconds_per_tick, times_fired) . = ..() + if(. & COMSIG_MOB_STOP_REAGENT_CHECK) + return if(istype(chem,/datum/reagent/consumable/salt)) - H.adjustFireLoss(2 * REM * seconds_per_tick) - playsound(H, 'sound/weapons/sear.ogg', 30, TRUE) - H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * seconds_per_tick) - return TRUE + playsound(affected, SFX_SEAR, 30, TRUE) + affected.adjustFireLoss(2 * REM * seconds_per_tick) + affected.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * seconds_per_tick) + return COMSIG_MOB_STOP_REAGENT_CHECK /datum/species/snail/on_species_gain(mob/living/carbon/new_snailperson, datum/species/old_species, pref_load) . = ..() 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 6dd778affc76c..46d507e4999de 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -7,29 +7,24 @@ /datum/species/vampire name = "Vampire" id = SPECIES_VAMPIRE - species_traits = list( - EYECOLOR, - HAIR, - FACEHAIR, - LIPS, - DRINKSBLOOD, - BLOOD_CLANS, - ) + examine_limb_id = SPECIES_HUMAN inherent_traits = list( + TRAIT_BLOOD_CLANS, + TRAIT_DRINKS_BLOOD, TRAIT_NOBREATH, TRAIT_NOHUNGER, + TRAIT_USES_SKINTONES, + TRAIT_NO_MIRROR_REFLECTION, ) inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID mutant_bodyparts = list("wings" = "None") changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN exotic_bloodtype = "U" blood_deficiency_drain_rate = BLOOD_DEFICIENCY_MODIFIER // vampires already passively lose blood, so this just makes them lose it slightly more quickly when they have blood deficiency. - use_skintones = TRUE mutantheart = /obj/item/organ/internal/heart/vampire mutanttongue = /obj/item/organ/internal/tongue/vampire mutantstomach = null mutantlungs = null - 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." @@ -49,10 +44,13 @@ /datum/species/vampire/spec_life(mob/living/carbon/human/vampire, seconds_per_tick, times_fired) . = ..() if(istype(vampire.loc, /obj/structure/closet/crate/coffin)) - vampire.heal_overall_damage(brute = 2 * seconds_per_tick, burn = 2 * seconds_per_tick, required_bodytype = BODYTYPE_ORGANIC) - vampire.adjustToxLoss(-2 * seconds_per_tick) - vampire.adjustOxyLoss(-2 * seconds_per_tick) - vampire.adjustCloneLoss(-2 * seconds_per_tick) + var/need_mob_update = FALSE + need_mob_update += vampire.heal_overall_damage(brute = 2 * seconds_per_tick, burn = 2 * seconds_per_tick, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + need_mob_update += vampire.adjustToxLoss(-2 * seconds_per_tick, updating_health = FALSE,) + need_mob_update += vampire.adjustOxyLoss(-2 * seconds_per_tick, updating_health = FALSE,) + need_mob_update += vampire.adjustCloneLoss(-2 * seconds_per_tick, updating_health = FALSE,) + if(need_mob_update) + vampire.updatehealth() return vampire.blood_volume -= 0.125 * seconds_per_tick if(vampire.blood_volume <= BLOOD_VOLUME_SURVIVE) 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 5c6c8fc6b88a3..28ebe93bd7b08 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -1,27 +1,25 @@ -#define REGENERATION_DELAY 60 // After taking damage, how long it takes for automatic regeneration to begin +#define REGENERATION_DELAY 6 SECONDS // After taking damage, how long it takes for automatic regeneration to begin /datum/species/zombie // 1spooky name = "High-Functioning Zombie" id = SPECIES_ZOMBIE - sexes = 0 + sexes = FALSE meat = /obj/item/food/meat/slab/human/mutant/zombie mutanttongue = /obj/item/organ/internal/tongue/zombie - species_traits = list( - NOZOMBIE, - NOTRANSSTING, - ) inherent_traits = list( // SHARED WITH ALL ZOMBIES TRAIT_EASILY_WOUNDED, TRAIT_EASYDISMEMBER, TRAIT_FAKEDEATH, TRAIT_LIMBATTACHMENT, + TRAIT_LIVERLESS_METABOLISM, TRAIT_NOBREATH, TRAIT_NOCLONELOSS, TRAIT_NODEATH, TRAIT_NOHUNGER, - TRAIT_NOMETABOLISM, + TRAIT_NO_DNA_COPY, + TRAIT_NO_ZOMBIFY, TRAIT_RADIMMUNE, TRAIT_RESISTCOLD, TRAIT_RESISTHIGHPRESSURE, @@ -36,9 +34,6 @@ mutantliver = null mutantlungs = null inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID - 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 | GORE 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 @@ -53,6 +48,15 @@ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/zombie ) + /// Spooky growls we sometimes play while alive + 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', + ) + /// 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, seconds_per_tick, times_fired) return @@ -88,16 +92,11 @@ name = "Infectious Zombie" id = SPECIES_ZOMBIE_INFECTIOUS examine_limb_id = SPECIES_ZOMBIE - armor = 20 // 120 damage to KO a zombie, which kills it - speedmod = 1.6 + damage_modifier = 20 // 120 damage to KO a zombie, which kills it mutanteyes = /obj/item/organ/internal/eyes/zombie mutantbrain = /obj/item/organ/internal/brain/zombie mutanttongue = /obj/item/organ/internal/tongue/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) inherent_traits = list( // SHARED WITH ALL ZOMBIES @@ -105,11 +104,12 @@ TRAIT_EASYDISMEMBER, TRAIT_FAKEDEATH, TRAIT_LIMBATTACHMENT, + TRAIT_LIVERLESS_METABOLISM, TRAIT_NOBREATH, TRAIT_NOCLONELOSS, TRAIT_NODEATH, TRAIT_NOHUNGER, - TRAIT_NOMETABOLISM, + TRAIT_NO_DNA_COPY, TRAIT_RADIMMUNE, TRAIT_RESISTCOLD, TRAIT_RESISTHIGHPRESSURE, @@ -120,13 +120,27 @@ TRAIT_STABLELIVER, // Not necessary but for consistency with above ) -/datum/species/zombie/infectious/on_species_gain(mob/living/carbon/C, datum/species/old_species) + // Infectious zombies have slow legs + 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/infectious, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/zombie/infectious, + ) + /// The rate the zombies regenerate at + var/heal_rate = 0.5 + /// The cooldown before the zombie can start regenerating + COOLDOWN_DECLARE(regen_cooldown) + +/datum/species/zombie/infectious/on_species_gain(mob/living/carbon/human/new_zombie, datum/species/old_species) . = ..() - C.AddComponent(/datum/component/mutant_hands, mutant_hand_path = /obj/item/mutant_hand/zombie) + new_zombie.AddComponent(/datum/component/mutant_hands, mutant_hand_path = /obj/item/mutant_hand/zombie) -/datum/species/zombie/infectious/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) +/datum/species/zombie/infectious/on_species_loss(mob/living/carbon/human/was_zombie, datum/species/new_species, pref_load) . = ..() - qdel(C.GetComponent(/datum/component/mutant_hands)) + qdel(was_zombie.GetComponent(/datum/component/mutant_hands)) /datum/species/zombie/infectious/check_roundstart_eligible() return FALSE @@ -139,24 +153,27 @@ if(.) COOLDOWN_START(src, regen_cooldown, REGENERATION_DELAY) -/datum/species/zombie/infectious/spec_life(mob/living/carbon/C, seconds_per_tick, times_fired) +/datum/species/zombie/infectious/spec_life(mob/living/carbon/carbon_mob, seconds_per_tick, times_fired) . = ..() - C.set_combat_mode(TRUE) // THE SUFFERING MUST FLOW + carbon_mob.set_combat_mode(TRUE) // THE SUFFERING MUST FLOW //Zombies never actually die, they just fall down until they regenerate enough to rise back up. //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(HAS_TRAIT(carbon_mob, TRAIT_CRITICAL_CONDITION)) heal_amt *= 2 - C.heal_overall_damage(heal_amt * seconds_per_tick, heal_amt * seconds_per_tick) - C.adjustToxLoss(-heal_amt * seconds_per_tick) - for(var/i in C.all_wounds) + var/need_mob_update = FALSE + need_mob_update += carbon_mob.heal_overall_damage(heal_amt * seconds_per_tick, heal_amt * seconds_per_tick, updating_health = FALSE) + need_mob_update += carbon_mob.adjustToxLoss(-heal_amt * seconds_per_tick, updating_health = FALSE) + if(need_mob_update) + carbon_mob.updatehealth() + for(var/i in carbon_mob.all_wounds) var/datum/wound/iter_wound = i if(SPT_PROB(2-(iter_wound.severity/2), seconds_per_tick)) iter_wound.remove_wound() - if(!HAS_TRAIT(C, TRAIT_CRITICAL_CONDITION) && SPT_PROB(2, seconds_per_tick)) - playsound(C, pick(spooks), 50, TRUE, 10) + if(!HAS_TRAIT(carbon_mob, TRAIT_CRITICAL_CONDITION) && SPT_PROB(2, seconds_per_tick)) + playsound(carbon_mob, pick(spooks), 50, TRUE, 10) //Congrats you somehow died so hard you stopped being a zombie /datum/species/zombie/infectious/spec_death(gibbed, mob/living/carbon/C) @@ -183,7 +200,6 @@ name = "\improper Human" id = SPECIES_ZOMBIE_KROKODIL examine_limb_id = SPECIES_HUMAN - sexes = 0 changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN bodypart_overrides = list( @@ -195,5 +211,4 @@ 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 8f1077fcb6316..8f6dc8efeb940 100644 --- a/code/modules/mob/living/carbon/human/status_procs.dm +++ b/code/modules/mob/living/carbon/human/status_procs.dm @@ -1,10 +1,10 @@ /mob/living/carbon/human/Stun(amount, ignore_canstun = FALSE) - amount = dna.species.spec_stun(src,amount) + amount = dna.species.spec_stun(src, amount) return ..() /mob/living/carbon/human/Knockdown(amount, ignore_canstun = FALSE) - amount = dna.species.spec_stun(src,amount) + amount = dna.species.spec_stun(src, amount) * physiology.knockdown_mod return ..() /mob/living/carbon/human/Paralyze(amount, ignore_canstun = FALSE) @@ -16,7 +16,7 @@ return ..() /mob/living/carbon/human/Unconscious(amount, ignore_canstun = FALSE) - amount = dna.species.spec_stun(src,amount) + amount = dna.species.spec_stun(src, amount) if(HAS_TRAIT(src, TRAIT_HEAVY_SLEEPER)) amount *= (rand(125, 130) * 0.01) return ..() diff --git a/code/modules/mob/living/carbon/init_signals.dm b/code/modules/mob/living/carbon/init_signals.dm index bda9e7eab56aa..190fe9d845342 100644 --- a/code/modules/mob/living/carbon/init_signals.dm +++ b/code/modules/mob/living/carbon/init_signals.dm @@ -2,8 +2,49 @@ /mob/living/carbon/register_init_signals() . = ..() + //Traits that register add and remove + RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_AGENDER), PROC_REF(on_agender_trait_gain)) + RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_AGENDER), PROC_REF(on_agender_trait_loss)) + + //Traits that register add only RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_NOBREATH), PROC_REF(on_nobreath_trait_gain)) - RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_NOMETABOLISM), PROC_REF(on_nometabolism_trait_gain)) + RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_LIVERLESS_METABOLISM), PROC_REF(on_liverless_metabolism_trait_gain)) + RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_VIRUSIMMUNE), PROC_REF(on_virusimmune_trait_gain)) + RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_TOXIMMUNE), PROC_REF(on_toximmune_trait_gain)) + RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_GENELESS), PROC_REF(on_geneless_trait_gain)) + + + RegisterSignals(src, list( + SIGNAL_ADDTRAIT(TRAIT_PERMANENTLY_ONFIRE), + SIGNAL_REMOVETRAIT(TRAIT_PERMANENTLY_ONFIRE), + ), PROC_REF(update_permanently_on_fire)) + +/** + * On gain of TRAIT_AGENDER + * + * This will make the mob get it's gender set to PLURAL. + */ +/mob/living/carbon/proc/on_agender_trait_gain(datum/source) + SIGNAL_HANDLER + + gender = PLURAL + +/** + * On removal of TRAIT_AGENDER + * + * This will make the mob get it's gender set to whatever the DNA says it should be. + */ +/mob/living/carbon/proc/on_agender_trait_loss(datum/source) + SIGNAL_HANDLER + + //updates our gender to be whatever our DNA wants it to be + switch(deconstruct_block(get_uni_identity_block(dna.unique_identity, DNA_GENDER_BLOCK), 3) || pick(G_MALE, G_FEMALE)) + if(G_MALE) + gender = MALE + if(G_FEMALE) + gender = FEMALE + else + gender = PLURAL /** * On gain of TRAIT_NOBREATH @@ -13,6 +54,8 @@ /mob/living/carbon/proc/on_nobreath_trait_gain(datum/source) SIGNAL_HANDLER + setOxyLoss(0, updating_health = TRUE, forced = TRUE) + losebreath = 0 failed_last_breath = FALSE clear_alert(ALERT_TOO_MUCH_OXYGEN) @@ -33,14 +76,53 @@ clear_mood_event("chemical_euphoria") clear_mood_event("smell") clear_mood_event("suffocation") + /** - * On gain of TRAIT_NOMETABOLISM + * On gain of TRAIT_LIVERLESS_METABOLISM * * This will clear all moods related to addictions and stop metabolization. */ -/mob/living/carbon/proc/on_nometabolism_trait_gain(datum/source) +/mob/living/carbon/proc/on_liverless_metabolism_trait_gain(datum/source) SIGNAL_HANDLER + for(var/addiction_type in subtypesof(/datum/addiction)) mind?.remove_addiction_points(addiction_type, MAX_ADDICTION_POINTS) //Remove the addiction! reagents.end_metabolization(keep_liverless = TRUE) + +///On gain of TRAIT_PERMANENTLY_ONFIRE, update the visuals if not on fire +/mob/living/carbon/proc/update_permanently_on_fire(datum/source) + SIGNAL_HANDLER + if(!on_fire) + update_fire() + +/** + * On gain of TRAIT_VIRUSIMMUNE + * + * This will clear all diseases on the mob. + */ +/mob/living/carbon/proc/on_virusimmune_trait_gain(datum/source) + SIGNAL_HANDLER + + for(var/datum/disease/disease as anything in diseases) + disease.cure(FALSE) + +/** + * On gain of TRAIT_TOXIMMUNE + * + * This will clear all toxin damage on the mob. + */ +/mob/living/carbon/proc/on_toximmune_trait_gain(datum/source) + SIGNAL_HANDLER + + setToxLoss(0, updating_health = TRUE, forced = TRUE) + +/** + * On gain of TRAIT_GENELLESS + * + * This will clear all DNA mutations on on the mob. + */ +/mob/living/carbon/proc/on_geneless_trait_gain(datum/source) + SIGNAL_HANDLER + + dna?.remove_all_mutations() diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 08b752f980492..fc96815045d92 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -49,74 +49,73 @@ legcuffed, ) -/mob/living/carbon/proc/equip_in_one_of_slots(obj/item/I, list/slots, qdel_on_fail = 1) +/mob/living/carbon/proc/equip_in_one_of_slots(obj/item/equipping, list/slots, qdel_on_fail = TRUE, indirect_action = FALSE) for(var/slot in slots) - if(equip_to_slot_if_possible(I, slots[slot], qdel_on_fail = 0, disable_warning = TRUE)) + if(equip_to_slot_if_possible(equipping, slots[slot], disable_warning = TRUE, indirect_action = indirect_action)) return slot if(qdel_on_fail) - qdel(I) + qdel(equipping) return null //This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible() -/mob/living/carbon/equip_to_slot(obj/item/I, slot, initial = FALSE, redraw_mob = FALSE) +/mob/living/carbon/equip_to_slot(obj/item/equipping, slot, initial = FALSE, redraw_mob = FALSE, indirect_action = FALSE) if(!slot) return - if(!istype(I)) + if(!istype(equipping)) return - var/index = get_held_index_of_item(I) + var/index = get_held_index_of_item(equipping) if(index) held_items[index] = null - if(I.pulledby) - I.pulledby.stop_pulling() + if(equipping.pulledby) + equipping.pulledby.stop_pulling() - I.screen_loc = null + equipping.screen_loc = null if(client) - client.screen -= I + client.screen -= equipping if(observers?.len) - for(var/M in observers) - var/mob/dead/observe = M + for(var/mob/dead/observe as anything in observers) if(observe.client) - observe.client.screen -= I - I.forceMove(src) - SET_PLANE_EXPLICIT(I, ABOVE_HUD_PLANE, src) - I.appearance_flags |= NO_CLIENT_COLOR + observe.client.screen -= equipping + equipping.forceMove(src) + SET_PLANE_EXPLICIT(equipping, ABOVE_HUD_PLANE, src) + equipping.appearance_flags |= NO_CLIENT_COLOR var/not_handled = FALSE switch(slot) if(ITEM_SLOT_BACK) if(back) return - back = I + back = equipping update_worn_back() if(ITEM_SLOT_MASK) if(wear_mask) return - wear_mask = I - wear_mask_update(I, toggle_off = 0) + wear_mask = equipping + wear_mask_update(equipping, toggle_off = 0) if(ITEM_SLOT_HEAD) if(head) return - head = I - SEND_SIGNAL(src, COMSIG_CARBON_EQUIP_HAT, I) - head_update(I) + head = equipping + SEND_SIGNAL(src, COMSIG_CARBON_EQUIP_HAT, equipping) + head_update(equipping) if(ITEM_SLOT_NECK) if(wear_neck) return - wear_neck = I - update_worn_neck(I) + wear_neck = equipping + update_worn_neck(equipping) if(ITEM_SLOT_HANDCUFFED) - set_handcuffed(I) + set_handcuffed(equipping) update_handcuffed() if(ITEM_SLOT_LEGCUFFED) - legcuffed = I + legcuffed = equipping update_worn_legcuffs() if(ITEM_SLOT_HANDS) - put_in_hands(I) + put_in_hands(equipping) update_held_items() if(ITEM_SLOT_BACKPACK) - if(!back || !back.atom_storage?.attempt_insert(I, src, override = TRUE)) + if(!back || !back.atom_storage?.attempt_insert(equipping, src, override = TRUE, force = indirect_action ? STORAGE_SOFT_LOCKED : STORAGE_NOT_LOCKED)) not_handled = TRUE else not_handled = TRUE @@ -125,13 +124,13 @@ //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) + has_equipped(equipping, 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) - return item.equipped(src, slot, initial) + return item.on_equipped(src, slot, initial) /mob/living/carbon/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE) . = ..() //Sets the default return value to what the parent returns. @@ -380,7 +379,7 @@ return if(IS_DEAD_OR_INCAP(offered)) - to_chat(src, span_warning("[offered.p_theyre(TRUE)] unable to take anything in [offered.p_their()] current state!")) + to_chat(src, span_warning("[offered.p_Theyre()] unable to take anything in [offered.p_their()] current state!")) return if(!CanReach(offered)) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 9bf815d529f6b..355f5bf61ca1c 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -1,13 +1,12 @@ /mob/living/carbon/Life(seconds_per_tick = SSMOBS_DT, times_fired) - - if(notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return if(damageoverlaytemp) damageoverlaytemp = 0 update_damage_hud() - if(IS_IN_STASIS(src)) + if(HAS_TRAIT(src, TRAIT_STASIS)) . = ..() reagents.handle_stasis_chems(src, seconds_per_tick, times_fired) else @@ -31,16 +30,15 @@ if(getStaminaLoss() > 0 && stam_regen_start_time <= world.time) adjustStaminaLoss(-INFINITY) - var/bprv = handle_bodyparts(seconds_per_tick, times_fired) - if(bprv & BODYPART_LIFE_UPDATE_HEALTH) - updatehealth() + + handle_bodyparts(seconds_per_tick, times_fired) if(. && mind) //. == not dead for(var/key in mind.addiction_points) var/datum/addiction/addiction = SSaddiction.all_addictions[key] addiction.process_addiction(src, seconds_per_tick, times_fired) if(stat != DEAD) - return 1 + return TRUE /////////////// // BREATHING // @@ -209,7 +207,7 @@ // Breath has more than 0 moles of gas. // Partial pressures of "main gases". pluoxium_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/pluoxium][MOLES]) - o2_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/oxygen][MOLES] + (8 * pluoxium_pp)) + o2_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/oxygen][MOLES] + (PLUOXIUM_PROPORTION * pluoxium_pp)) plasma_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/plasma][MOLES]) co2_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/carbon_dioxide][MOLES]) // Partial pressures of "trace" gases. @@ -340,13 +338,13 @@ if(prob(5)) to_chat(src, span_warning("The stench of rotting carcasses is unbearable!")) add_mood_event("smell", /datum/mood_event/disgust/nauseating_stench) - vomit() + vomit(VOMIT_CATEGORY_DEFAULT) 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!")) add_mood_event("smell", /datum/mood_event/disgust/nauseating_stench) - vomit() + vomit(VOMIT_CATEGORY_DEFAULT) else clear_mood_event("smell") @@ -375,10 +373,13 @@ //-- NITRIUM --// if(nitrium_pp) + var/need_mob_update = FALSE if(nitrium_pp > 0.5) - adjustFireLoss(nitrium_pp * 0.15) + need_mob_update += adjustFireLoss(nitrium_pp * 0.15, updating_health = FALSE) if(nitrium_pp > 5) - adjustToxLoss(nitrium_pp * 0.05) + need_mob_update += adjustToxLoss(nitrium_pp * 0.05, updating_health = FALSE) + if(need_mob_update) + updatehealth() // Handle chemical euphoria mood event, caused by N2O. if (n2o_euphoria == EUPHORIA_ACTIVE) @@ -482,10 +483,10 @@ D.stage_act(seconds_per_tick, times_fired) /mob/living/carbon/handle_wounds(seconds_per_tick, times_fired) - for(var/thing in all_wounds) - var/datum/wound/W = thing - if(W.processes) // meh - W.handle_process(seconds_per_tick, times_fired) + for(var/datum/wound/wound as anything in all_wounds) + if(!wound.processes) // meh + continue + wound.handle_process(seconds_per_tick, times_fired) /mob/living/carbon/handle_mutations(time_since_irradiated, seconds_per_tick, times_fired) if(!dna?.temporary_mutations.len) @@ -544,6 +545,9 @@ if(stat != DEAD) // If you are dead your body does not stabilize naturally natural_bodytemperature_stabilization(environment, seconds_per_tick, times_fired) + else if(!on_fire && areatemp < bodytemperature) // lowers your dead body temperature to room temperature over time + adjust_bodytemperature((areatemp - bodytemperature), use_insulation=FALSE, use_steps=TRUE) + if(!on_fire || areatemp > bodytemperature) // If we are not on fire or the area is hotter adjust_bodytemperature((areatemp - bodytemperature), use_insulation=TRUE, use_steps=TRUE) @@ -684,7 +688,7 @@ var/datum/reagent/bits = bile if(istype(bits, /datum/reagent/consumable)) var/datum/reagent/consumable/goodbit = bile - fullness += goodbit.nutriment_factor * goodbit.volume / goodbit.metabolization_rate + fullness += goodbit.get_nutriment_factor() * goodbit.volume / goodbit.metabolization_rate continue fullness += 0.6 * bits.volume / bits.metabolization_rate //not food takes up space @@ -714,12 +718,12 @@ return reagents.end_metabolization(src, keep_liverless = TRUE) //Stops trait-based effects on reagents, to prevent permanent buffs - reagents.metabolize(src, seconds_per_tick, times_fired, can_overdose=TRUE, liverless = TRUE) + reagents.metabolize(src, seconds_per_tick, times_fired, can_overdose = TRUE, liverless = TRUE) - if(HAS_TRAIT(src, TRAIT_STABLELIVER) || HAS_TRAIT(src, TRAIT_NOMETABOLISM)) + if(HAS_TRAIT(src, TRAIT_STABLELIVER) || HAS_TRAIT(src, TRAIT_LIVERLESS_METABOLISM)) return - adjustToxLoss(0.6 * seconds_per_tick, TRUE, TRUE) + adjustToxLoss(0.6 * seconds_per_tick, forced = TRUE) adjustOrganLoss(pick(ORGAN_SLOT_HEART, ORGAN_SLOT_LUNGS, ORGAN_SLOT_STOMACH, ORGAN_SLOT_EYES, ORGAN_SLOT_EARS), 0.5* seconds_per_tick) /mob/living/carbon/proc/undergoing_liver_failure() @@ -744,7 +748,7 @@ if(!needs_heart()) return FALSE var/obj/item/organ/internal/heart/heart = get_organ_slot(ORGAN_SLOT_HEART) - if(!heart || (heart.organ_flags & ORGAN_SYNTHETIC)) + if(!heart || IS_ROBOTIC_ORGAN(heart)) return FALSE return TRUE @@ -776,6 +780,7 @@ var/obj/item/organ/internal/heart/heart = get_organ_slot(ORGAN_SLOT_HEART) if(!istype(heart)) - return + return FALSE heart.beating = !status + return TRUE diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index 0dbd944317784..dc0b659fbec44 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -6,19 +6,18 @@ return ..() || (include_stamcrit && HAS_TRAIT_FROM(src, TRAIT_INCAPACITATED, STAMINA)) /mob/living/carbon/proc/enter_stamcrit() - if(!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)) - 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. + if(check_stun_immunity(CANKNOCKDOWN)) return + to_chat(src, span_notice("You're too exhausted to keep going...")) add_traits(list(TRAIT_INCAPACITATED, TRAIT_IMMOBILIZED, TRAIT_FLOORED), STAMINA) if(getStaminaLoss() < 120) // Puts you a little further into the initial stamcrit, makes stamcrit harder to outright counter with chems. adjustStaminaLoss(30, FALSE) -/mob/living/carbon/adjust_disgust(amount) - disgust = clamp(disgust+amount, 0, DISGUST_LEVEL_MAXEDOUT) +/mob/living/carbon/adjust_disgust(amount, max = DISGUST_LEVEL_MAXEDOUT) + disgust = clamp(disgust + amount, 0, max) /mob/living/carbon/set_disgust(amount) disgust = clamp(amount, 0, DISGUST_LEVEL_MAXEDOUT) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index a46017fd296e1..82425b27a5ba9 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -14,7 +14,7 @@ * * Returns TRUE if damage applied */ -/mob/living/proc/apply_damage(damage = 0, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE, attack_direction = null, attacking_item) +/mob/living/proc/apply_damage(damage = 0, damagetype = BRUTE, def_zone = null, blocked = 0, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE, attack_direction = null, attacking_item) SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMAGE, damage, damagetype, def_zone) var/hit_percent = (100-blocked)/100 if(!damage || (!forced && hit_percent <= 0)) @@ -53,7 +53,7 @@ return adjustStaminaLoss(damage) /// return the damage amount for the type given -/mob/living/proc/get_damage_amount(damagetype = BRUTE) +/mob/living/proc/get_current_damage_of_type(damagetype = BRUTE) switch(damagetype) if(BRUTE) return getBruteLoss() @@ -150,7 +150,7 @@ adjust_drowsiness(drowsy) if(eyeblur) adjust_eye_blur(eyeblur) - if(jitter && (status_flags & CANSTUN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) + if(jitter && !check_stun_immunity(CANSTUN)) adjust_jitter(jitter) if(slur) adjust_slurring(slur) @@ -159,130 +159,175 @@ return TRUE +/// Should be called by any adjustXLoss proc to send signalling information, returns a bit flag which may indicate that we don't want to make any adjustment +/mob/living/proc/on_damage_adjustment(damage_type, amount, forced) + return SEND_SIGNAL(src, COMSIG_LIVING_ADJUST_DAMAGE, damage_type, amount, forced) /mob/living/proc/getBruteLoss() return bruteloss -/mob/living/proc/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) +/mob/living/proc/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL) if(!forced && (status_flags & GODMODE)) - return FALSE + return 0 + if(on_damage_adjustment(BRUTE, amount, forced) & COMPONENT_IGNORE_CHANGE) + return 0 + . = bruteloss bruteloss = clamp((bruteloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + . -= bruteloss + if(!.) // no change, no need to update + return FALSE if(updating_health) updatehealth() - return amount -/mob/living/proc/setBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) + +/mob/living/proc/setBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL) if(!forced && (status_flags & GODMODE)) - return + return FALSE . = bruteloss bruteloss = amount + + if(!.) // no change, no need to update + return FALSE if(updating_health) updatehealth() + . -= bruteloss /mob/living/proc/getOxyLoss() return oxyloss -/mob/living/proc/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype, required_respiration_type = ALL) +/mob/living/proc/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL, required_respiration_type = ALL) if(!forced) if(status_flags & GODMODE) - return + return 0 var/obj/item/organ/internal/lungs/affected_lungs = get_organ_slot(ORGAN_SLOT_LUNGS) if(isnull(affected_lungs)) if(!(mob_respiration_type & required_respiration_type)) // if the mob has no lungs, use mob_respiration_type - return + return 0 else if(!(affected_lungs.respiration_type & required_respiration_type)) // otherwise use the lungs' respiration_type - return + return 0 + if(on_damage_adjustment(OXY, amount, forced) & COMPONENT_IGNORE_CHANGE) + return 0 . = oxyloss oxyloss = clamp((oxyloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + . -= oxyloss + if(!.) // no change, no need to update + return FALSE if(updating_health) updatehealth() - -/mob/living/proc/setOxyLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype, required_respiration_type = ALL) +/mob/living/proc/setOxyLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL, required_respiration_type = ALL) if(!forced) if(status_flags & GODMODE) - return + return FALSE var/obj/item/organ/internal/lungs/affected_lungs = get_organ_slot(ORGAN_SLOT_LUNGS) if(isnull(affected_lungs)) if(!(mob_respiration_type & required_respiration_type)) - return + return FALSE else if(!(affected_lungs.respiration_type & required_respiration_type)) - return + return FALSE . = oxyloss oxyloss = amount + . -= oxyloss + if(!.) // no change, no need to update + return FALSE if(updating_health) updatehealth() - /mob/living/proc/getToxLoss() return toxloss -/mob/living/proc/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) +/mob/living/proc/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL) if(!forced && (status_flags & GODMODE)) return FALSE + if(on_damage_adjustment(TOX, amount, forced) & COMPONENT_IGNORE_CHANGE) + return 0 if(!forced && !(mob_biotypes & required_biotype)) - return + return FALSE + . = toxloss toxloss = clamp((toxloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + . -= toxloss + if(!.) // no change, no need to update + return FALSE if(updating_health) updatehealth() - return amount -/mob/living/proc/setToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) +/mob/living/proc/setToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL) if(!forced && (status_flags & GODMODE)) return FALSE if(!forced && !(mob_biotypes & required_biotype)) - return + return FALSE + . = toxloss toxloss = amount + . -= toxloss + if(!.) // no change, no need to update + return FALSE if(updating_health) updatehealth() - return amount /mob/living/proc/getFireLoss() return fireloss -/mob/living/proc/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) +/mob/living/proc/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL) if(!forced && (status_flags & GODMODE)) - return FALSE + return 0 + if(on_damage_adjustment(BURN, amount, forced) & COMPONENT_IGNORE_CHANGE) + return 0 + . = fireloss fireloss = clamp((fireloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + . -= fireloss + if(. == 0) // no change, no need to update + return if(updating_health) updatehealth() - return amount -/mob/living/proc/setFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) +/mob/living/proc/setFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL) if(!forced && (status_flags & GODMODE)) - return + return 0 . = fireloss fireloss = amount + . -= fireloss + if(. == 0) // no change, no need to update + return 0 if(updating_health) updatehealth() /mob/living/proc/getCloneLoss() return cloneloss -/mob/living/proc/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) - if(!forced && ( (status_flags & GODMODE) || HAS_TRAIT(src, TRAIT_NOCLONELOSS)) ) - return FALSE +/mob/living/proc/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL) + if(!forced && (!(mob_biotypes & required_biotype) || status_flags & GODMODE || HAS_TRAIT(src, TRAIT_NOCLONELOSS))) + return 0 + if(on_damage_adjustment(CLONE, amount, forced) & COMPONENT_IGNORE_CHANGE) + return 0 + . = cloneloss cloneloss = clamp((cloneloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + . -= cloneloss + if(. == 0) // no change, no need to update + return 0 if(updating_health) updatehealth() - return amount -/mob/living/proc/setCloneLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) +/mob/living/proc/setCloneLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL) if(!forced && ( (status_flags & GODMODE) || HAS_TRAIT(src, TRAIT_NOCLONELOSS)) ) return FALSE + if(!forced && !(mob_biotypes & required_biotype)) + return FALSE + . = cloneloss cloneloss = amount + . -= cloneloss + if(!.) // no change, no need to update + return FALSE if(updating_health) updatehealth() - return amount -/mob/living/proc/adjustOrganLoss(slot, amount, maximum, required_organtype) +/mob/living/proc/adjustOrganLoss(slot, amount, maximum, required_organ_flag) return -/mob/living/proc/setOrganLoss(slot, amount, maximum, required_organtype) +/mob/living/proc/setOrganLoss(slot, amount, maximum, required_organ_flag) return /mob/living/proc/get_organ_loss(slot) @@ -291,64 +336,79 @@ /mob/living/proc/getStaminaLoss() return staminaloss -/mob/living/proc/adjustStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype) - if(!forced && (status_flags & GODMODE)) - return FALSE - if(required_biotype && !(mob_biotypes & required_biotype)) - return +/mob/living/proc/adjustStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype = ALL) + if(!forced && ((status_flags & GODMODE) || required_biotype && !(mob_biotypes & required_biotype))) + return 0 + if(on_damage_adjustment(STAMINA, amount, forced) & COMPONENT_IGNORE_CHANGE) + return 0 + . = staminaloss staminaloss = clamp((staminaloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, max_stamina) + . -= staminaloss + if(. == 0) // no change, no need to update + return 0 if(updating_stamina) updatehealth() - return -/mob/living/proc/setStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype) - if(!forced && ( (status_flags & GODMODE) || HAS_TRAIT(src, TRAIT_NOCLONELOSS)) ) +/mob/living/proc/setStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype = ALL) + if(!forced && (status_flags & GODMODE)) return FALSE + if(!forced && !(mob_biotypes & required_biotype)) + return FALSE + . = staminaloss staminaloss = amount + . -= staminaloss + if(!.) // no change, no need to update + return FALSE if(updating_stamina) updatehealth() /** * heal ONE external organ, organ gets randomly selected from damaged ones. * - * needs to return amount healed in order to calculate things like tend wounds xp gain + * returns the net change in damage */ -/mob/living/proc/heal_bodypart_damage(brute = 0, burn = 0, updating_health = TRUE, required_bodytype) - . = (adjustBruteLoss(-brute, FALSE) + adjustFireLoss(-burn, FALSE)) //zero as argument for no instant health update +/mob/living/proc/heal_bodypart_damage(brute = 0, burn = 0, updating_health = TRUE, required_bodytype = NONE, target_zone = null) + . = (adjustBruteLoss(-abs(brute), updating_health = FALSE) + adjustFireLoss(-abs(burn), updating_health = FALSE)) + if(!.) // no change, no need to update + return FALSE if(updating_health) updatehealth() /// damage ONE external organ, organ gets randomly selected from damaged ones. /mob/living/proc/take_bodypart_damage(brute = 0, burn = 0, updating_health = TRUE, required_bodytype, check_armor = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE) - adjustBruteLoss(brute, FALSE) //zero as argument for no instant health update - adjustFireLoss(burn, FALSE) + . = (adjustBruteLoss(abs(brute), updating_health = FALSE) + adjustFireLoss(abs(burn), updating_health = FALSE)) + if(!.) // no change, no need to update + return FALSE if(updating_health) updatehealth() -/// heal MANY bodyparts, in random order -/mob/living/proc/heal_overall_damage(brute = 0, burn = 0, stamina = 0, required_bodytype, updating_health = TRUE) - adjustBruteLoss(-brute, FALSE) //zero as argument for no instant health update - adjustFireLoss(-burn, FALSE) - adjustStaminaLoss(-stamina, FALSE) +/// heal MANY bodyparts, in random order. note: stamina arg nonfunctional for carbon mobs +/mob/living/proc/heal_overall_damage(brute = 0, burn = 0, stamina = 0, required_bodytype, updating_health = TRUE, forced = FALSE) + . = (adjustBruteLoss(-abs(brute), updating_health = FALSE, forced = forced) + \ + adjustFireLoss(-abs(burn), updating_health = FALSE, forced = forced) + \ + adjustStaminaLoss(-abs(stamina), updating_stamina = FALSE, forced = forced)) + if(!.) // no change, no need to update + return FALSE if(updating_health) updatehealth() -/// damage MANY bodyparts, in random order -/mob/living/proc/take_overall_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_bodytype) - adjustBruteLoss(brute, FALSE) //zero as argument for no instant health update - adjustFireLoss(burn, FALSE) - adjustStaminaLoss(stamina, FALSE) +/// damage MANY bodyparts, in random order. note: stamina arg nonfunctional for carbon mobs +/mob/living/proc/take_overall_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, forced = FALSE, required_bodytype) + . = (adjustBruteLoss(abs(brute), updating_health = FALSE, forced = forced) + \ + adjustFireLoss(abs(burn), updating_health = FALSE, forced = forced) + \ + adjustStaminaLoss(abs(stamina), updating_stamina = FALSE, forced = forced)) + if(!.) // no change, no need to update + return FALSE if(updating_health) updatehealth() ///heal up to amount damage, in a given order /mob/living/proc/heal_ordered_damage(amount, list/damage_types) - . = amount //we'll return the amount of damage healed - for(var/i in damage_types) - var/amount_to_heal = min(amount, get_damage_amount(i)) //heal only up to the amount of damage we have + . = FALSE //we'll return the amount of damage healed + for(var/damagetype in damage_types) + var/amount_to_heal = min(abs(amount), get_current_damage_of_type(damagetype)) //heal only up to the amount of damage we have if(amount_to_heal) - apply_damage_type(-amount_to_heal, i) + . += apply_damage_type(-amount_to_heal, damagetype) amount -= amount_to_heal //remove what we healed from our current amount if(!amount) break - . -= amount //if there's leftover healing, remove it from what we return diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 16b8b8245b55c..7cb3abfff023f 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -1,12 +1,14 @@ /** * Blow up the mob into giblets * - * Arguments: - * * no_brain - Should the mob NOT drop a brain? - * * no_organs - Should the mob NOT drop organs? - * * no_bodyparts - Should the mob NOT drop bodyparts? -*/ -/mob/living/proc/gib(no_brain, no_organs, no_bodyparts) + * drop_bitflags: (see code/__DEFINES/blood.dm) + * * DROP_BRAIN - Gibbed mob will drop a brain + * * DROP_ORGANS - Gibbed mob will drop organs + * * DROP_BODYPARTS - Gibbed mob will drop bodyparts (arms, legs, etc.) + * * DROP_ITEMS - Gibbed mob will drop carried items (otherwise they get deleted) + * * DROP_ALL_REMAINS - Gibbed mob will drop everything +**/ +/mob/living/proc/gib(drop_bitflags=NONE) var/prev_lying = lying_angle if(stat != DEAD) death(TRUE) @@ -14,25 +16,47 @@ if(!prev_lying) gib_animation() - spill_organs(no_brain, no_organs, no_bodyparts) + ghostize() + spill_organs(drop_bitflags) - if(!no_bodyparts) - spread_bodyparts(no_brain, no_organs) + if(drop_bitflags & DROP_BODYPARTS) + spread_bodyparts(drop_bitflags) - spawn_gibs(no_bodyparts) - SEND_SIGNAL(src, COMSIG_LIVING_GIBBED, no_brain, no_organs, no_bodyparts) + spawn_gibs(drop_bitflags) + SEND_SIGNAL(src, COMSIG_LIVING_GIBBED, drop_bitflags) qdel(src) /mob/living/proc/gib_animation() return -/mob/living/proc/spawn_gibs() +/** + * Spawn bloody gib mess on the floor + * + * drop_bitflags: (see code/__DEFINES/blood.dm) + * * DROP_BODYPARTS - Gibs will spawn with bodypart limbs present +**/ +/mob/living/proc/spawn_gibs(drop_bitflags=NONE) new /obj/effect/gibspawner/generic(drop_location(), src, get_static_viruses()) -/mob/living/proc/spill_organs() +/** + * Drops a mob's organs on the floor + * + * drop_bitflags: (see code/__DEFINES/blood.dm) + * * DROP_BRAIN - Mob will drop a brain + * * DROP_ORGANS - Mob will drop organs + * * DROP_BODYPARTS - Mob will drop bodyparts (arms, legs, etc.) + * * DROP_ALL_REMAINS - Mob will drop everything +**/ +/mob/living/proc/spill_organs(drop_bitflags=NONE) return -/mob/living/proc/spread_bodyparts() +/** + * Launches all bodyparts away from the mob + * + * drop_bitflags: (see code/__DEFINES/blood.dm) + * * DROP_BRAIN - Detaches the head from the mob and launches it away from the body +**/ +/mob/living/proc/spread_bodyparts(drop_bitflags=NONE) return /** @@ -45,6 +69,9 @@ * * force - Should this mob be FORCABLY dusted? */ /mob/living/proc/dust(just_ash, drop_items, force) + if(body_position == STANDING_UP) + // keep us upright so the animation fits. + ADD_TRAIT(src, TRAIT_FORCED_STANDING, TRAIT_GENERIC) death(TRUE) if(drop_items) @@ -55,6 +82,7 @@ dust_animation() spawn_dust(just_ash) + ghostize() QDEL_IN(src,5) // since this is sometimes called in the middle of movement, allow half a second for movement to finish, ghosting to happen and animation to play. Looks much nicer and doesn't cause multiple runtimes. /mob/living/proc/dust_animation() @@ -73,10 +101,13 @@ if(stat == DEAD) return FALSE + if(!gibbed && (death_sound || death_message)) + INVOKE_ASYNC(src, TYPE_PROC_REF(/mob, emote), "deathgasp") + set_stat(DEAD) unset_machine() timeofdeath = world.time - tod = station_time_timestamp() + station_timestamp_timeofdeath = station_time_timestamp() var/turf/death_turf = get_turf(src) var/area/death_area = get_area(src) // Display a death message if the mob is a player mob (has an active mind) @@ -106,7 +137,4 @@ client.move_delay = initial(client.move_delay) client.player_details.time_of_death = timeofdeath - if(!gibbed && (death_sound || death_message)) - INVOKE_ASYNC(src, TYPE_PROC_REF(/mob, emote), "deathgasp") - return TRUE diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 46ab6c40d65ee..ea7d99986310d 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -141,6 +141,8 @@ var/mob/living/carbon/human/H = user var/open = FALSE var/obj/item/organ/external/wings/functional/wings = H.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) + + // open/close functional wings if(istype(wings)) if(wings.wings_open) open = TRUE @@ -149,6 +151,10 @@ wings.open_wings() addtimer(CALLBACK(wings, open ? TYPE_PROC_REF(/obj/item/organ/external/wings/functional, open_wings) : TYPE_PROC_REF(/obj/item/organ/external/wings/functional, close_wings)), wing_time) + // play moth flutter noise if moth wing + if(istype(wings, /obj/item/organ/external/wings/moth)) + playsound(H, 'sound/voice/moth/moth_flutter.ogg', 50, TRUE) + /datum/emote/living/flap/aflap key = "aflap" key_third_person = "aflaps" @@ -188,8 +194,8 @@ if(!ishuman(user)) return var/mob/living/carbon/human/human_user = user - if(human_user.dna.species.id == SPECIES_HUMAN && !HAS_TRAIT(human_user, TRAIT_MIMING)) - if(human_user.gender == FEMALE) + if(human_user.dna.species.id == SPECIES_HUMAN && !HAS_MIND_TRAIT(human_user, TRAIT_MIMING)) + if(human_user.physique == FEMALE) return pick('sound/voice/human/gasp_female1.ogg', 'sound/voice/human/gasp_female2.ogg', 'sound/voice/human/gasp_female3.ogg') else return pick('sound/voice/human/gasp_male1.ogg', 'sound/voice/human/gasp_male2.ogg') @@ -277,7 +283,7 @@ if(!ishuman(user)) return var/mob/living/carbon/human/human_user = user - if(human_user.dna.species.id == SPECIES_HUMAN && !HAS_TRAIT(human_user, TRAIT_MIMING)) + if(human_user.dna.species.id == SPECIES_HUMAN && !HAS_MIND_TRAIT(human_user, TRAIT_MIMING)) if(human_user.gender == FEMALE) return 'sound/voice/human/womanlaugh.ogg' else @@ -368,6 +374,13 @@ message_mime = "acts out an exaggerated silent sigh." emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE +/datum/emote/living/sigh/run_emote(mob/living/user, params, type_override, intentional) + . = ..() + if(!ishuman(user)) + return + var/image/emote_animation = image('icons/mob/human/emote_visuals.dmi', user, "sigh") + flick_overlay_global(emote_animation, GLOB.clients, 2.0 SECONDS) + /datum/emote/living/sit key = "sit" key_third_person = "sits" @@ -457,7 +470,7 @@ /datum/emote/living/tremble key = "tremble" key_third_person = "trembles" - message = "trembles in fear!" + message = "trembles!" #define TREMBLE_LOOP_DURATION (4.4 SECONDS) /datum/emote/living/tremble/run_emote(mob/living/user, params, type_override, intentional) @@ -524,6 +537,8 @@ key_third_person = "yawns" message = "yawns." message_mime = "acts out an exaggerated silent yawn." + message_robot = "symphathetically yawns." + message_AI = "symphathetically yawns." emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE cooldown = 5 SECONDS @@ -583,45 +598,93 @@ /datum/emote/living/custom/can_run_emote(mob/user, status_check, intentional) . = ..() && intentional -/datum/emote/living/custom/proc/check_invalid(mob/user, input) +/datum/emote/living/custom/proc/emote_is_valid(mob/user, input) + // We're assuming clientless mobs custom emoting is something codebase-driven and not player-driven. + // If players ever get the ability to force clientless mobs to emote, we'd need to reconsider this. + if(!user.client) + return TRUE + + if(CAN_BYPASS_FILTER(user)) + return TRUE + var/static/regex/stop_bad_mime = regex(@"says|exclaims|yells|asks") if(stop_bad_mime.Find(input, 1, 1)) to_chat(user, span_danger("Invalid emote.")) - return TRUE - return FALSE + return FALSE + + var/list/filter_result = is_ic_filtered(input) + + if(filter_result) + to_chat(user, span_warning("That emote contained a word prohibited in IC emotes! Consider reviewing the server rules.")) + to_chat(user, span_warning("\"[input]\"")) + REPORT_CHAT_FILTER_TO_USER(user, filter_result) + log_filter("IC Emote", input, filter_result) + SSblackbox.record_feedback("tally", "ic_blocked_words", 1, lowertext(config.ic_filter_regex.match)) + return FALSE + + filter_result = is_soft_ic_filtered(input) + + if(filter_result) + if(tgui_alert(user,"Your emote contains \"[filter_result[CHAT_FILTER_INDEX_WORD]]\". \"[filter_result[CHAT_FILTER_INDEX_REASON]]\", Are you sure you want to emote it?", "Soft Blocked Word", list("Yes", "No")) != "Yes") + SSblackbox.record_feedback("tally", "soft_ic_blocked_words", 1, lowertext(config.soft_ic_filter_regex.match)) + log_filter("Soft IC Emote", input, filter_result) + return FALSE + + message_admins("[ADMIN_LOOKUPFLW(user)] has passed the soft filter for emote \"[filter_result[CHAT_FILTER_INDEX_WORD]]\" they may be using a disallowed term. Emote: \"[input]\"") + log_admin_private("[key_name(user)] has passed the soft filter for emote \"[filter_result[CHAT_FILTER_INDEX_WORD]]\" they may be using a disallowed term. Emote: \"[input]\"") + SSblackbox.record_feedback("tally", "passed_soft_ic_blocked_words", 1, lowertext(config.soft_ic_filter_regex.match)) + log_filter("Soft IC Emote (Passed)", input, filter_result) + + return TRUE + +/datum/emote/living/custom/proc/get_custom_emote_from_user() + return copytext(sanitize(input("Choose an emote to display.") as text|null), 1, MAX_MESSAGE_LEN) + +/datum/emote/living/custom/proc/get_custom_emote_type_from_user() + var/type = input("Is this a visible or hearable emote?") as null|anything in list("Visible", "Hearable") + + switch(type) + if("Visible") + return EMOTE_VISIBLE + if("Hearable") + return EMOTE_AUDIBLE + else + tgui_alert(usr,"Unable to use this emote, must be either hearable or visible.") + return FALSE /datum/emote/living/custom/run_emote(mob/user, params, type_override = null, intentional = FALSE) - var/custom_emote - var/custom_emote_type if(!can_run_emote(user, TRUE, intentional)) return FALSE + if(is_banned_from(user.ckey, "Emote")) to_chat(user, span_boldwarning("You cannot send custom emotes (banned).")) return FALSE - else if(QDELETED(user)) + + if(QDELETED(user)) return FALSE - else if(user.client && user.client.prefs.muted & MUTE_IC) + + if(user.client && user.client.prefs.muted & MUTE_IC) to_chat(user, span_boldwarning("You cannot send IC messages (muted).")) return FALSE - else if(!params) - custom_emote = copytext(sanitize(input("Choose an emote to display.") as text|null), 1, MAX_MESSAGE_LEN) - if(custom_emote && !check_invalid(user, custom_emote)) - var/type = input("Is this a visible or hearable emote?") as null|anything in list("Visible", "Hearable") - switch(type) - if("Visible") - custom_emote_type = EMOTE_VISIBLE - if("Hearable") - custom_emote_type = EMOTE_AUDIBLE - else - tgui_alert(usr,"Unable to use this emote, must be either hearable or visible.") - return - else - custom_emote = params - if(type_override) - custom_emote_type = type_override - message = custom_emote - emote_type = custom_emote_type + + message = params ? params : get_custom_emote_from_user() + + if(!emote_is_valid(user, message)) + message = null + return FALSE + + if(!params) + var/user_emote_type = get_custom_emote_type_from_user() + + if(!user_emote_type) + return FALSE + + emote_type = user_emote_type + else if(type_override) + emote_type = type_override + . = ..() + message = null emote_type = EMOTE_VISIBLE diff --git a/code/modules/mob/living/init_signals.dm b/code/modules/mob/living/init_signals.dm index 6c4d59f93df12..ed496c0c84b6f 100644 --- a/code/modules/mob/living/init_signals.dm +++ b/code/modules/mob/living/init_signals.dm @@ -6,6 +6,14 @@ RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_DEATHCOMA), PROC_REF(on_deathcoma_trait_gain)) RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_DEATHCOMA), PROC_REF(on_deathcoma_trait_loss)) + RegisterSignals(src, list( + SIGNAL_ADDTRAIT(TRAIT_FAKEDEATH), + SIGNAL_REMOVETRAIT(TRAIT_FAKEDEATH), + + SIGNAL_ADDTRAIT(TRAIT_DEFIB_BLACKLISTED), + SIGNAL_REMOVETRAIT(TRAIT_DEFIB_BLACKLISTED), + ), PROC_REF(update_medhud_on_signal)) + RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_IMMOBILIZED), PROC_REF(on_immobilized_trait_gain)) RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_IMMOBILIZED), PROC_REF(on_immobilized_trait_loss)) @@ -44,6 +52,7 @@ RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_SKITTISH), PROC_REF(on_skittish_trait_gain)) RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_SKITTISH), PROC_REF(on_skittish_trait_loss)) + RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_UNDENSE), SIGNAL_REMOVETRAIT(TRAIT_UNDENSE)), PROC_REF(undense_changed)) RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_NEGATES_GRAVITY), SIGNAL_REMOVETRAIT(TRAIT_NEGATES_GRAVITY)), PROC_REF(on_negate_gravity)) RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_IGNORING_GRAVITY), SIGNAL_REMOVETRAIT(TRAIT_IGNORING_GRAVITY)), PROC_REF(on_ignore_gravity)) RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_FORCED_GRAVITY), SIGNAL_REMOVETRAIT(TRAIT_FORCED_GRAVITY)), PROC_REF(on_force_gravity)) @@ -54,6 +63,8 @@ ) AddElement(/datum/element/connect_loc, loc_connections) + RegisterSignal(src, COMSIG_MOVABLE_EDIT_UNIQUE_IMMERSE_OVERLAY, PROC_REF(edit_immerse_overlay)) + /// Called when [TRAIT_KNOCKEDOUT] is added to the mob. /mob/living/proc/on_knockedout_trait_gain(datum/source) SIGNAL_HANDLER @@ -66,7 +77,6 @@ if(stat <= UNCONSCIOUS) update_stat() - /// Called when [TRAIT_DEATHCOMA] is added to the mob. /mob/living/proc/on_deathcoma_trait_gain(datum/source) SIGNAL_HANDLER @@ -77,6 +87,11 @@ SIGNAL_HANDLER REMOVE_TRAIT(src, TRAIT_KNOCKEDOUT, TRAIT_DEATHCOMA) +/// Updates medhud when recieving relevant signals. +/mob/living/proc/update_medhud_on_signal(datum/source) + SIGNAL_HANDLER + med_hud_set_health() + med_hud_set_status() /// Called when [TRAIT_IMMOBILIZED] is added to the mob. /mob/living/proc/on_immobilized_trait_gain(datum/source) @@ -245,3 +260,16 @@ /mob/living/proc/on_loc_force_gravity(datum/source) SIGNAL_HANDLER refresh_gravity() + +/// Called in [/datum/element/immerse/apply_filter] +/mob/living/proc/edit_immerse_overlay(datum/source, atom/movable/immerse_overlay/vis_overlay) + SIGNAL_HANDLER + + vis_overlay.transform = vis_overlay.transform.Scale(1/current_size) + vis_overlay.transform = vis_overlay.transform.Turn(-lying_angle) + vis_overlay.adjust_living_overlay_offset(src) + +/// Called when [TRAIT_UNDENSE] is gained or lost +/mob/living/proc/undense_changed(datum/source) + SIGNAL_HANDLER + update_density() diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 8508b1c2ca8fe..9b0a078c1acc8 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -34,25 +34,19 @@ log_game("Z-TRACKING: [src] of type [src.type] has a Z-registration despite not having a client.") update_z(null) - if (notransform) - return - if(!loc) + if(isnull(loc) || HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return - if(!IS_IN_STASIS(src)) + if(!HAS_TRAIT(src, TRAIT_STASIS)) if(stat != DEAD) //Mutations and radiation handle_mutations(seconds_per_tick, times_fired) - - if(stat != DEAD) //Breathing, if applicable handle_breathing(seconds_per_tick, times_fired) handle_diseases(seconds_per_tick, 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. - handle_wounds(seconds_per_tick, times_fired) - if (QDELETED(src)) // diseases can qdel the mob via transformations return @@ -67,6 +61,8 @@ handle_gravity(seconds_per_tick, times_fired) + handle_wounds(seconds_per_tick, times_fired) + if(machine) machine.check_eye(src) @@ -118,7 +114,7 @@ for(var/bile in reagents.reagent_list) var/datum/reagent/consumable/bits = bile if(bits) - fullness += bits.nutriment_factor * bits.volume / bits.metabolization_rate + fullness += bits.get_nutriment_factor() * bits.volume / bits.metabolization_rate return fullness /** diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index f6763df9c1c76..ba5c04ec4602a 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -15,6 +15,7 @@ SSpoints_of_interest.make_point_of_interest(src) update_fov() gravity_setup() + ADD_TRAIT(src, TRAIT_UNIQUE_IMMERSE, INNATE_TRAIT) /mob/living/prepare_huds() ..() @@ -85,7 +86,7 @@ //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) + if(move_intent == MOVE_INTENT_WALK) return TRUE SEND_SIGNAL(src, COMSIG_LIVING_MOB_BUMP, M) @@ -206,7 +207,7 @@ if(len) for(var/obj/item/I in held_items) if(!holding.len) - holding += "[p_they(TRUE)] [p_are()] holding \a [I]" + holding += "[p_They()] [p_are()] holding \a [I]" else if(held_items.Find(I) == len) holding += ", and \a [I]." else @@ -361,7 +362,7 @@ if(iscarbon(L)) var/mob/living/carbon/C = L if(HAS_TRAIT(src, TRAIT_STRONG_GRABBER)) - C.grippedby(src) + C.grabbedby(src) update_pull_movespeed() @@ -478,7 +479,7 @@ return TRUE if(!(flags & IGNORE_GRAB) && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE) return TRUE - if(!(flags & IGNORE_STASIS) && IS_IN_STASIS(src)) + if(!(flags & IGNORE_STASIS) && HAS_TRAIT(src, TRAIT_STASIS)) return TRUE return FALSE @@ -627,21 +628,32 @@ /mob/living/proc/on_lying_down(new_lying_angle) if(layer == initial(layer)) //to avoid things like hiding larvas. layer = LYING_MOB_LAYER //so mob lying always appear behind standing mobs - add_traits(list(TRAIT_UI_BLOCKED, TRAIT_PULL_BLOCKED), LYING_DOWN_TRAIT) - set_density(FALSE) // We lose density and stop bumping passable dense things. + add_traits(list(TRAIT_UI_BLOCKED, TRAIT_PULL_BLOCKED, TRAIT_UNDENSE), LYING_DOWN_TRAIT) if(HAS_TRAIT(src, TRAIT_FLOORED) && !(dir & (NORTH|SOUTH))) setDir(pick(NORTH, SOUTH)) // We are and look helpless. - body_position_pixel_y_offset = PIXEL_Y_OFFSET_LYING + if(rotate_on_lying) + body_position_pixel_y_offset = PIXEL_Y_OFFSET_LYING /// Proc to append behavior related to lying down. /mob/living/proc/on_standing_up() if(layer == LYING_MOB_LAYER) layer = initial(layer) - set_density(initial(density)) // We were prone before, so we become dense and things can bump into us again. - remove_traits(list(TRAIT_UI_BLOCKED, TRAIT_PULL_BLOCKED), LYING_DOWN_TRAIT) + remove_traits(list(TRAIT_UI_BLOCKED, TRAIT_PULL_BLOCKED, TRAIT_UNDENSE), LYING_DOWN_TRAIT) // Make sure it doesn't go out of the southern bounds of the tile when standing. - body_position_pixel_y_offset = (current_size-1) * world.icon_size/2 + body_position_pixel_y_offset = get_pixel_y_offset_standing(current_size) + +/// Returns what the body_position_pixel_y_offset should be if the current size were `value` +/mob/living/proc/get_pixel_y_offset_standing(value) + var/icon/living_icon = icon(icon) + var/height = living_icon.Height() + return (value-1) * height * 0.5 + +/mob/living/proc/update_density() + if(HAS_TRAIT(src, TRAIT_UNDENSE)) + set_density(FALSE) + else + set_density(TRUE) //Recursive function to find everything a mob is holding. Really shitty proc tbh. /mob/living/get_contents() @@ -748,8 +760,8 @@ */ /mob/living/proc/revive(full_heal_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE) if(excess_healing) - adjustOxyLoss(-excess_healing, FALSE) - adjustToxLoss(-excess_healing, FALSE, TRUE) //slime friendly + adjustOxyLoss(-excess_healing, updating_health = FALSE) + adjustToxLoss(-excess_healing, updating_health = FALSE, forced = TRUE) //slime friendly updatehealth() grab_ghost(force_grab_ghost) @@ -798,13 +810,13 @@ var/oxy_to_heal = heal_to - getOxyLoss() var/tox_to_heal = heal_to - getToxLoss() if(brute_to_heal < 0) - adjustBruteLoss(brute_to_heal, FALSE) + adjustBruteLoss(brute_to_heal, updating_health = FALSE) if(burn_to_heal < 0) - adjustFireLoss(burn_to_heal, FALSE) + adjustFireLoss(burn_to_heal, updating_health = FALSE) if(oxy_to_heal < 0) - adjustOxyLoss(oxy_to_heal, FALSE) + adjustOxyLoss(oxy_to_heal, updating_health = FALSE) if(tox_to_heal < 0) - adjustToxLoss(tox_to_heal, FALSE, TRUE) + adjustToxLoss(tox_to_heal, updating_health = FALSE, forced = TRUE) // Run updatehealth once to set health for the revival check updatehealth() @@ -835,17 +847,17 @@ SHOULD_CALL_PARENT(TRUE) if(heal_flags & HEAL_TOX) - setToxLoss(0, FALSE, TRUE) + setToxLoss(0, updating_health = FALSE, forced = TRUE) if(heal_flags & HEAL_OXY) - setOxyLoss(0, FALSE, TRUE) + setOxyLoss(0, updating_health = FALSE, forced = TRUE) if(heal_flags & HEAL_CLONE) - setCloneLoss(0, FALSE, TRUE) + setCloneLoss(0, updating_health = FALSE, forced = TRUE) if(heal_flags & HEAL_BRUTE) - setBruteLoss(0, FALSE, TRUE) + setBruteLoss(0, updating_health = FALSE, forced = TRUE) if(heal_flags & HEAL_BURN) - setFireLoss(0, FALSE, TRUE) + setFireLoss(0, updating_health = FALSE, forced = TRUE) if(heal_flags & HEAL_STAM) - setStaminaLoss(0, FALSE, TRUE) + setStaminaLoss(0, updating_stamina = FALSE, forced = TRUE) // I don't really care to keep this under a flag set_nutrition(NUTRITION_LEVEL_FED + 50) @@ -930,6 +942,22 @@ if(body_position == LYING_DOWN && !buckled && prob(getBruteLoss()*200/maxHealth)) makeTrail(newloc, T, old_direction) +/** + * Called by mob/living attackby() + * Checks if there's active surgery on the mob that can be continued with the item + */ +/mob/living/proc/can_perform_surgery(mob/living/user, params) + for(var/datum/surgery/operations as anything in surgeries) + if(user.combat_mode) + break + if(IS_IN_INVALID_SURGICAL_POSITION(src, operations)) + continue + if(!(operations.surgery_flags & SURGERY_SELF_OPERABLE) && (user == src)) + continue + var/list/modifiers = params2list(params) + if(operations.next_step(user, modifiers)) + return TRUE + return FALSE ///Called by mob Move() when the lying_angle is different than zero, to better visually simulate crawling. /mob/living/proc/lying_angle_on_movement(direct) @@ -965,7 +993,7 @@ else if(newdir == (EAST|WEST)) newdir = EAST if((newdir in GLOB.cardinals) && (prob(50))) - newdir = turn(get_dir(target_turf, start), 180) + newdir = REVERSE_DIR(get_dir(target_turf, start)) if(!blood_exists) new /obj/effect/decal/cleanable/trail_holder(start, get_static_viruses()) @@ -1177,12 +1205,8 @@ loc_temp = ((1 - occupied_space.contents_thermal_insulation) * loc_temp) + (occupied_space.contents_thermal_insulation * bodytemperature) return loc_temp -/mob/living/cancel_camera() - ..() - cameraFollow = null - /// Checks if this mob can be actively tracked by cameras / AI. -/// Can optionally be passed a user, which is the mob tracking. +/// Can optionally be passed a user, which is the mob who is tracking src. /mob/living/proc/can_track(mob/living/user) //basic fast checks go first. When overriding this proc, I recommend calling ..() at the end. if(SEND_SIGNAL(src, COMSIG_LIVING_CAN_TRACK, user) & COMPONENT_CANT_TRACK) @@ -1201,7 +1225,7 @@ if(invisibility || alpha == 0)//cloaked return FALSE // Now, are they viewable by a camera? (This is last because it's the most intensive check) - if(!near_camera(src)) + if(!GLOB.cameranet.checkCameraVis(src)) return FALSE return TRUE @@ -1228,7 +1252,7 @@ to_chat(src, span_warning("You don't have the physical ability to do this!")) return FALSE - if(!Adjacent(target) && (target.loc != src)) + if(!Adjacent(target) && (target.loc != src) && !recursive_loc_check(src, target)) if(issilicon(src) && !ispAI(src)) if(!(action_bitflags & ALLOW_SILICON_REACH)) // silicons can ignore range checks (except pAIs) to_chat(src, span_warning("You are too far away!")) @@ -1291,14 +1315,13 @@ * Returns a mob (what our mob turned into) or null (if we failed). */ /mob/living/proc/wabbajack(what_to_randomize, change_flags = WABBAJACK) - if(stat == DEAD || notransform || (GODMODE & status_flags)) + if(stat == DEAD || (GODMODE & status_flags) || HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return if(SEND_SIGNAL(src, COMSIG_LIVING_PRE_WABBAJACKED, what_to_randomize) & STOP_WABBAJACK) return - notransform = TRUE - add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), MAGIC_TRAIT) + add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED, TRAIT_NO_TRANSFORM), MAGIC_TRAIT) icon = null cut_overlays() invisibility = INVISIBILITY_ABSTRACT @@ -1310,8 +1333,7 @@ // Disconnect AI's in shells if(Robot.connected_ai) Robot.connected_ai.disconnect_shell() - if(Robot.mmi) - qdel(Robot.mmi) + QDEL_NULL(Robot.mmi) Robot.notify_ai(AI_NOTIFICATION_NEW_BORG) else for(var/obj/item/item in src) @@ -1381,6 +1403,8 @@ if(WABBAJACK_ANIMAL) var/picked_animal = pick( /mob/living/basic/bat, + /mob/living/basic/bear, + /mob/living/basic/blob_minion/blobbernaut, /mob/living/basic/butterfly, /mob/living/basic/carp, /mob/living/basic/carp/magic, @@ -1388,32 +1412,30 @@ /mob/living/basic/chick, /mob/living/basic/chicken, /mob/living/basic/cow, - /mob/living/basic/giant_spider, - /mob/living/basic/giant_spider/hunter, + /mob/living/basic/crab, + /mob/living/basic/goat, /mob/living/basic/headslug, /mob/living/basic/killer_tomato, /mob/living/basic/lizard, + /mob/living/basic/mining/goliath, + /mob/living/basic/mining/watcher, + /mob/living/basic/morph, /mob/living/basic/mouse, + /mob/living/basic/mushroom, /mob/living/basic/pet/dog/breaddog, /mob/living/basic/pet/dog/corgi, /mob/living/basic/pet/dog/pug, + /mob/living/basic/pet/fox, + /mob/living/basic/spider/giant, + /mob/living/basic/spider/giant/hunter, /mob/living/basic/statue, /mob/living/basic/stickman, /mob/living/basic/stickman/dog, - /mob/living/simple_animal/crab, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher, - /mob/living/simple_animal/hostile/asteroid/goliath/beast, - /mob/living/simple_animal/hostile/bear, - /mob/living/simple_animal/hostile/blob/blobbernaut/independent, /mob/living/simple_animal/hostile/gorilla, /mob/living/simple_animal/hostile/megafauna/dragon/lesser, - /mob/living/simple_animal/hostile/morph, - /mob/living/simple_animal/hostile/mushroom, - /mob/living/simple_animal/hostile/retaliate/goat, /mob/living/simple_animal/parrot, /mob/living/simple_animal/pet/cat, /mob/living/simple_animal/pet/cat/cak, - /mob/living/simple_animal/pet/fox, ) new_mob = new picked_animal(loc) @@ -1461,6 +1483,12 @@ // actions that should be done before we delete the original mob. on_wabbajacked(new_mob) + // Valid polymorph types unlock the Lepton. + if((change_flags & (WABBAJACK|MIRROR_MAGIC|MIRROR_PRIDE|RACE_SWAP)) && (SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_WABBAJACK] != TRUE)) + to_chat(new_mob, span_revennotice("You have the strangest feeling, for a moment. A fragile, dizzying memory wanders into your mind.. all you can make out is-")) + to_chat(new_mob, span_hypnophrase("You sleep so it may wake. You wake so it may sleep. It wakes. Do not sleep.")) + SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_WABBAJACK] = TRUE + qdel(src) return new_mob @@ -1631,7 +1659,7 @@ GLOBAL_LIST_EMPTY(fire_appearances) * * fire_handler: Current fire status effect that called the proc */ -/mob/living/proc/on_fire_stack(seconds_per_tick, times_fired, datum/status_effect/fire_handler/fire_stacks/fire_handler) +/mob/living/proc/on_fire_stack(seconds_per_tick, datum/status_effect/fire_handler/fire_stacks/fire_handler) return //Mobs on Fire end @@ -2425,7 +2453,7 @@ GLOBAL_LIST_EMPTY(fire_appearances) mob_mood.clear_mood_event(mood_events[chosen]) /// Adds a mood event to the mob -/mob/living/proc/add_mood_event(category, type, ...) +/mob/living/proc/add_mood_event(category, type, timeout_mod, ...) if(QDELETED(mob_mood)) return mob_mood.add_mood_event(arglist(args)) @@ -2452,8 +2480,14 @@ GLOBAL_LIST_EMPTY(fire_appearances) revive(HEAL_ALL) befriend(reviver) faction = (malfunctioning) ? list("[REF(reviver)]") : list(FACTION_NEUTRAL) + var/lazarus_policy = get_policy(ROLE_LAZARUS_GOOD) || "The lazarus injector has brought you back to life! You are now friendly to everyone." if (malfunctioning) reviver.log_message("has revived mob [key_name(src)] with a malfunctioning lazarus injector.", LOG_GAME) + if(!isnull(src.mind)) + src.mind.enslave_mind_to_creator(reviver) + to_chat(src, span_userdanger("Serve [reviver.real_name], and assist [reviver.p_them()] in completing [reviver.p_their()] goals at any cost.")) + lazarus_policy = get_policy(ROLE_LAZARUS_BAD) || "You have been revived by a malfunctioning lazarus injector! You are now enslaved by whoever revived you." + to_chat(src, span_boldnotice(lazarus_policy)) /// Proc for giving a mob a new 'friend', generally used for AI control and targetting. Returns false if already friends. /mob/living/proc/befriend(mob/living/new_friend) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 4e8fe489b2eb7..aa3743a44b411 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -7,11 +7,11 @@ if(weak_against_armour && our_armor >= 0) our_armor *= ARMOR_WEAKENED_MULTIPLIER if(silent) - return max(0, our_armor - armour_penetration) + return max(0, PENETRATE_ARMOUR(our_armor, armour_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) + our_armor = max(PENETRATE_ARMOUR(our_armor, armour_penetration), 0) if(penetrated_text) to_chat(src, span_userdanger("[penetrated_text]")) else @@ -86,6 +86,11 @@ /mob/living/proc/is_pepper_proof(check_flags = ALL) return null +/// Checks if the mob's ears (BOTH EARS, BOWMANS NEED NOT APPLY) are covered by something. +/// Returns the atom covering the mob's ears, or null if their ears are uncovered. +/mob/living/proc/is_ears_covered() + return null + /mob/living/proc/on_hit(obj/projectile/P) return BULLET_ACT_HIT @@ -164,6 +169,7 @@ return ..() /mob/living/fire_act() + . = ..() adjust_fire_stacks(3) ignite_mob() @@ -289,6 +295,15 @@ /mob/living/attack_hand(mob/living/carbon/human/user, list/modifiers) . = ..() + + for(var/datum/surgery/operations as anything in surgeries) + if(user.combat_mode) + break + if(IS_IN_INVALID_SURGICAL_POSITION(src, operations)) + continue + if(operations.next_step(user, modifiers)) + return TRUE + var/martial_result = user.apply_martial_art(src, modifiers) if (martial_result != MARTIAL_ATTACK_INVALID) return martial_result @@ -497,13 +512,13 @@ */ /mob/living/proc/do_slap_animation(atom/slapped) do_attack_animation(slapped, no_effect=TRUE) - var/image/gloveimg = image('icons/effects/effects.dmi', slapped, "slapglove", slapped.layer + 0.1) - gloveimg.pixel_y = 10 // should line up with head - gloveimg.pixel_x = 10 - flick_overlay_global(gloveimg, GLOB.clients, 10) + var/mutable_appearance/glove_appearance = mutable_appearance('icons/effects/effects.dmi', "slapglove") + glove_appearance.pixel_y = 10 // should line up with head + glove_appearance.pixel_x = 10 + var/atom/movable/flick_visual/glove = slapped.flick_overlay_view(glove_appearance, 1 SECONDS) // And animate the attack! - animate(gloveimg, alpha = 175, transform = matrix() * 0.75, pixel_x = 0, pixel_y = 10, pixel_z = 0, time = 3) + animate(glove, alpha = 175, transform = matrix() * 0.75, pixel_x = 0, pixel_y = 10, pixel_z = 0, time = 3) animate(time = 1) animate(alpha = 0, time = 3, easing = CIRCULAR_EASING|EASE_OUT) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 070f7b8bc85bb..e9d306875c9ec 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -33,6 +33,9 @@ ///Damage caused by being cloned or ejected from the cloner early. slimes also deal cloneloss damage to victims var/cloneloss = 0 + /// The movement intent of the mob (run/wal) + var/move_intent = MOVE_INTENT_RUN + /// Rate at which fire stacks should decay from this mob var/fire_stack_decay_rate = -0.05 @@ -61,9 +64,10 @@ VAR_PROTECTED/lying_angle = 0 /// Value of lying lying_angle before last change. TODO: Remove the need for this. var/lying_prev = 0 + /// Does the mob rotate when lying + var/rotate_on_lying = FALSE ///Used by the resist verb, likely used to prevent players from bypassing next_move by logging in/out. var/last_special = 0 - var/timeofdeath = 0 ///A message sent when the mob dies, with the *deathgasp emote var/death_message = "" @@ -91,10 +95,10 @@ /// Used by [living/Bump()][/mob/living/proc/Bump] and [living/PushAM()][/mob/living/proc/PushAM] to prevent potential infinite loop. var/now_pushing = null - var/cameraFollow = null - - /// Time of death - var/tod = null + ///The mob's latest time-of-death + var/timeofdeath = 0 + ///The mob's latest time-of-death, as a station timestamp instead of world.time + var/station_timestamp_timeofdeath /// Sets AI behavior that allows mobs to target and dismember limbs with their basic attack. var/limb_destroyer = 0 @@ -151,15 +155,9 @@ ///effectiveness prob. is modified negatively by this amount; positive numbers make it more difficult, negative ones make it easier var/butcher_difficulty = 0 - ///converted to a list of stun absorption sources this mob has when one is added - var/stun_absorption = null - ///how much blood the mob has var/blood_volume = 0 - ///0 for no override, sets see_invisible = see_override in silicon & carbon life process via update_sight() - var/see_override = 0 - ///a list of all status effects the mob has var/list/status_effects var/list/implants = null @@ -204,10 +202,12 @@ /// Is this mob allowed to be buckled/unbuckled to/from things? var/can_buckle_to = TRUE - ///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 + var/body_position_pixel_x_offset = 0 + ///The y amount a mob's sprite should be offset due to the current position they're in or size (e.g. lying down moves your sprite down) var/body_position_pixel_y_offset = 0 + ///The height offset of a mob's maptext due to their current size. + var/body_maptext_height_offset = 0 /// FOV view that is applied from either nativeness or traits var/fov_view @@ -225,3 +225,6 @@ /// What our current gravity state is. Used to avoid duplicate animates and such var/gravity_state = null + + /// Whether this mob can be mutated into a cybercop via quantum server get_valid_domain_targets(). Specifically dodges megafauna + var/can_be_cybercop = TRUE diff --git a/code/modules/mob/living/living_fov.dm b/code/modules/mob/living/living_fov.dm index 0c5acb7b40e48..279e8bebe3280 100644 --- a/code/modules/mob/living/living_fov.dm +++ b/code/modules/mob/living/living_fov.dm @@ -57,6 +57,8 @@ if(fov_type > highest_fov) highest_fov = fov_type fov_view = highest_fov + if(HAS_TRAIT(src, TRAIT_EXPANDED_FOV)) + fov_view += 30 update_fov_client() /// Updates the FOV for the client. diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index 0187522460f00..27cfe5b51cdac 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -67,27 +67,22 @@ return TRUE return !mover.density || body_position == LYING_DOWN -/mob/living/toggle_move_intent() - . = ..() - update_move_intent_slowdown() - /mob/living/update_config_movespeed() update_move_intent_slowdown() return ..() /mob/living/proc/update_move_intent_slowdown() - add_movespeed_modifier((m_intent == MOVE_INTENT_WALK)? /datum/movespeed_modifier/config_walk_run/walk : /datum/movespeed_modifier/config_walk_run/run) + add_movespeed_modifier((move_intent == MOVE_INTENT_WALK)? /datum/movespeed_modifier/config_walk_run/walk : /datum/movespeed_modifier/config_walk_run/run) -/mob/living/proc/update_turf_movespeed(turf/open/T) - if(isopenturf(T) && !is_type_on_turf(T, /obj/structure/lattice/catwalk)) - if(T.slowdown != current_turf_slowdown) - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/turf_slowdown, multiplicative_slowdown = T.slowdown) - current_turf_slowdown = T.slowdown +/mob/living/proc/update_turf_movespeed(turf/open/turf) + if(isopenturf(turf) && !HAS_TRAIT(turf, TRAIT_TURF_IGNORE_SLOWDOWN)) + if(turf.slowdown != current_turf_slowdown) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/turf_slowdown, multiplicative_slowdown = turf.slowdown) + current_turf_slowdown = turf.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) diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm index cc4fc3d26f043..50aacd2fdf0e1 100644 --- a/code/modules/mob/living/living_say.dm +++ b/code/modules/mob/living/living_say.dm @@ -154,10 +154,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( if(!try_speak(original_message, ignore_spam, forced, filterproof)) return - language = message_mods[LANGUAGE_EXTENSION] - - if(!language) - language = get_selected_language() + language = message_mods[LANGUAGE_EXTENSION] || get_selected_language() var/succumbed = FALSE @@ -277,10 +274,13 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( understood = FALSE // if someone is whispering we make an extra type of message that is obfuscated for people out of range - var/is_speaker_whispering = message_mods[WHISPER_MODE] - var/can_hear_whisper = get_dist(speaker, src) <= message_range - if(is_speaker_whispering && !can_hear_whisper && !isobserver(src)) // ghosts can hear all messages clearly + // 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, src) - message_range + if(dist > 0 && dist <= EAVESDROP_EXTRA_RANGE && !HAS_TRAIT(src, TRAIT_GOOD_HEARING) && !isobserver(src)) // ghosts can hear all messages clearly raw_message = stars(raw_message) + if (dist > EAVESDROP_EXTRA_RANGE && !HAS_TRAIT(src, TRAIT_GOOD_HEARING) && !isobserver(src)) + return FALSE // Too far away and don't have good hearing, you can't hear anything // we need to send this signal before compose_message() is used since other signals need to modify // the raw_message first. After the raw_message is passed through the various signals, it's ready to be formatted @@ -288,7 +288,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, args) 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, FALSE, TRUE) + deaf_message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mods, TRUE) if(speaker != src) if(!radio_freq) //I'm about 90% sure there's a way to make this less cluttered @@ -335,10 +335,17 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( var/whisper_range = 0 var/is_speaker_whispering = FALSE if(message_mods[WHISPER_MODE]) //If we're whispering - whisper_range = EAVESDROP_EXTRA_RANGE + // Needed for good hearing trait. The actual filtering for whispers happens at the /mob/living/Hear proc + whisper_range = MESSAGE_RANGE - WHISPER_RANGE is_speaker_whispering = TRUE - var/list/listening = get_hearers_in_view(message_range + whisper_range, source) + var/list/in_view = get_hearers_in_view(message_range + whisper_range, source) + var/list/listening = get_hearers_in_range(message_range + whisper_range, source) + + // Pre-process listeners to account for line-of-sight + for(var/atom/movable/listening_movable as anything in listening) + if(!(listening_movable in in_view) && !HAS_TRAIT(listening_movable, TRAIT_XRAY_HEARING)) + listening.Remove(listening_movable) 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) @@ -347,14 +354,10 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( if(player_mob.stat != DEAD) //not dead, not important continue if(player_mob.z != z || get_dist(player_mob, src) > 7) //they're out of range of normal hearing - if(player_mob.client && !player_mob.client?.prefs) - stack_trace("[player_mob] ([player_mob.ckey]) had null prefs, which shouldn't be possible!") - continue - if(is_speaker_whispering) - if(!(player_mob.client?.prefs.chat_toggles & CHAT_GHOSTWHISPER)) //they're whispering and we have hearing whispers at any range off + if(!(get_chat_toggles(player_mob.client) & 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 + else if(!(get_chat_toggles(player_mob.client) & CHAT_GHOSTEARS)) //they're talking normally and we have hearing at any range off continue listening |= player_mob @@ -380,19 +383,35 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( speech_bubble_recipients.Add(M.client) found_client = TRUE - if(voice && found_client && !message_mods[MODE_CUSTOM_SAY_ERASE_INPUT] && !HAS_TRAIT(src, TRAIT_SIGN_LANG)) + if(voice && found_client && !message_mods[MODE_CUSTOM_SAY_ERASE_INPUT] && !HAS_TRAIT(src, TRAIT_SIGN_LANG) && !HAS_TRAIT(src, TRAIT_UNKNOWN)) var/tts_message_to_use = tts_message if(!tts_message_to_use) tts_message_to_use = message_raw var/list/filter = list() + var/list/special_filter = list() + var/voice_to_use = voice + var/use_radio = FALSE if(length(voice_filter) > 0) filter += voice_filter if(length(tts_filter) > 0) filter += tts_filter.Join(",") - - INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), src, html_decode(tts_message_to_use), message_language, voice, filter.Join(","), listened, message_range = message_range) + if(ishuman(src)) + var/mob/living/carbon/human/human_speaker = src + if(human_speaker.wear_mask) + var/obj/item/clothing/mask/worn_mask = human_speaker.wear_mask + if(worn_mask.voice_override) + voice_to_use = worn_mask.voice_override + if(worn_mask.voice_filter) + filter += worn_mask.voice_filter + use_radio = worn_mask.use_radio_beeps_tts + if(use_radio) + special_filter += TTS_FILTER_RADIO + if(issilicon(src)) + special_filter += TTS_FILTER_SILICON + + INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), src, html_decode(tts_message_to_use), message_language, voice_to_use, filter.Join(","), listened, message_range = message_range, pitch = pitch, special_filters = special_filter.Join("|")) var/image/say_popup = image('icons/mob/effects/talk.dmi', src, "[bubble_type][talk_icon_state]", FLY_LAYER) SET_PLANE_EXPLICIT(say_popup, ABOVE_GAME_PLANE, src) @@ -418,7 +437,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( return FALSE if(!can_speak()) - if(HAS_TRAIT(src, TRAIT_MIMING)) + if(HAS_MIND_TRAIT(src, TRAIT_MIMING)) to_chat(src, span_green("Your vow of silence prevents you from speaking!")) else to_chat(src, span_warning("You find yourself unable to speak!")) @@ -427,7 +446,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( return TRUE /mob/living/can_speak(allow_mimes = FALSE) - if(!allow_mimes && HAS_TRAIT(src, TRAIT_MIMING)) + if(!allow_mimes && HAS_MIND_TRAIT(src, TRAIT_MIMING)) return FALSE if(HAS_TRAIT(src, TRAIT_MUTE)) @@ -555,8 +574,3 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( if(!message) return say("#[message]", bubble_type, spans, sanitize, language, ignore_spam, forced, filterproof) - -/mob/living/get_language_holder(get_minds = TRUE) - if(get_minds && mind) - return mind.get_language_holder() - . = ..() diff --git a/code/modules/mob/living/living_update_icons.dm b/code/modules/mob/living/living_update_icons.dm index a43b4d7cb1051..a9e1a136800b0 100644 --- a/code/modules/mob/living/living_update_icons.dm +++ b/code/modules/mob/living/living_update_icons.dm @@ -1,20 +1,66 @@ +/** + * Called whenever the mob is to be resized or when lying/standing up for carbons. + * IMPORTANT: Multiple animate() calls do not stack well, so try to do them all at once if you can. + */ +/mob/living/proc/update_transform(resize = RESIZE_DEFAULT_SIZE) + var/matrix/ntransform = matrix(transform) //aka transform.Copy() + var/final_pixel_y = base_pixel_y + body_position_pixel_y_offset + /** + * pixel x/y/w/z all discard values after the decimal separator. + * That, coupled with the rendered interpolation, may make the + * icons look awfuller than they already are, or not, whatever. + * The solution to this nit is translating the missing decimals. + * also flooring increases the distance from 0 for negative numbers. + */ + var/abs_pixel_y_offset = 0 + var/translate = 0 + if(current_size != RESIZE_DEFAULT_SIZE) + var/standing_offset = get_pixel_y_offset_standing(current_size) + abs_pixel_y_offset = abs(standing_offset) + translate = (abs_pixel_y_offset - round(abs_pixel_y_offset)) * SIGN(standing_offset) + var/final_dir = dir + var/changed = FALSE + + if(lying_angle != lying_prev && rotate_on_lying) + changed = TRUE + if(lying_angle && lying_prev == 0) + if(translate) + ntransform.Translate(0, -translate) + if(dir & (EAST|WEST)) //Standing to lying and facing east or west + final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass + else if(translate && !lying_angle && lying_prev != 0) + ntransform.Translate(translate * (lying_prev == 270 ? -1 : 1), 0) + ///Done last, as it can mess with the translation. + ntransform.TurnTo(lying_prev, lying_angle) -/// Called whenever the mob is to be resized or when lying/standing up for carbons. -/mob/living/update_transform(resize = RESIZE_DEFAULT_SIZE) - perform_update_transform(resize) // carbon mobs do it differently than silicons and simple animals. - //Make sure the body position y offset is updated if resized. - if(resize != RESIZE_DEFAULT_SIZE && body_position == STANDING_UP) - body_position_pixel_y_offset = (current_size-1) * world.icon_size/2 - SEND_SIGNAL(src, COMSIG_LIVING_POST_UPDATE_TRANSFORM) // ...and we want the signal to be sent last. + if(resize != RESIZE_DEFAULT_SIZE) + changed = TRUE + var/is_vertical = !lying_angle || !rotate_on_lying + ///scaling also affects translation, so we've to undo the old translate beforehand. + if(translate && is_vertical) + ntransform.Translate(0, -translate) + ntransform.Scale(resize) + current_size *= resize + //Update the height of the maptext according to the size of the mob so they don't overlap. + var/old_maptext_offset = body_maptext_height_offset + body_maptext_height_offset = initial(maptext_height) * (current_size - 1) * 0.5 + maptext_height += body_maptext_height_offset - old_maptext_offset + //Update final_pixel_y so our mob doesn't go out of the southern bounds of the tile when standing + if(is_vertical) //But not if the mob has been rotated. + //Make sure the body position y offset is also updated + body_position_pixel_y_offset = get_pixel_y_offset_standing(current_size) + abs_pixel_y_offset = abs(body_position_pixel_y_offset) + var/new_translate = (abs_pixel_y_offset - round(abs_pixel_y_offset)) * SIGN(body_position_pixel_y_offset) + if(new_translate) + ntransform.Translate(0, new_translate) + final_pixel_y = base_pixel_y + body_position_pixel_y_offset -/mob/living/proc/perform_update_transform(resize = RESIZE_DEFAULT_SIZE) - if(resize == RESIZE_DEFAULT_SIZE) + if(!changed) //Nothing has been changed, nothing has to be done. return - var/matrix/ntransform = matrix(transform) //aka transform.Copy() - ntransform.Scale(resize) - //Update final_pixel_y so our mob doesn't go out of the southern bounds of the tile when standing - var/final_pixel_y = pixel_y + (current_size * resize - current_size) * world.icon_size/2 - current_size *= resize + SEND_SIGNAL(src, COMSIG_PAUSE_FLOATING_ANIM, 0.3 SECONDS) + //if true, we want to avoid any animation time, it'll tween and not rotate at all otherwise. + var/is_opposite_angle = SIMPLIFY_DEGREES(lying_angle+180) == lying_prev + animate(src, transform = ntransform, time = is_opposite_angle ? 0 : UPDATE_TRANSFORM_ANIMATION_TIME, pixel_y = final_pixel_y, dir = final_dir, easing = (EASE_IN|EASE_OUT)) - animate(src, transform = ntransform, time = 2, pixel_y = final_pixel_y, easing = EASE_IN|EASE_OUT) + SEND_SIGNAL(src, COMSIG_LIVING_POST_UPDATE_TRANSFORM, resize, lying_angle, is_opposite_angle) diff --git a/code/modules/mob/living/navigation.dm b/code/modules/mob/living/navigation.dm index b97a01b55926b..44847a239c160 100644 --- a/code/modules/mob/living/navigation.dm +++ b/code/modules/mob/living/navigation.dm @@ -77,15 +77,15 @@ var/dir_1 = 0 var/dir_2 = 0 if(i == 1) - dir_2 = turn(angle2dir(get_angle(path[i+1], current_turf)), 180) + dir_2 = REVERSE_DIR(angle2dir(get_angle(path[i+1], current_turf))) else if(i == length(path)) - dir_2 = turn(angle2dir(get_angle(path[i-1], current_turf)), 180) + dir_2 = REVERSE_DIR(angle2dir(get_angle(path[i-1], current_turf))) else - dir_1 = turn(angle2dir(get_angle(path[i+1], current_turf)), 180) - dir_2 = turn(angle2dir(get_angle(path[i-1], current_turf)), 180) + dir_1 = REVERSE_DIR(angle2dir(get_angle(path[i+1], current_turf))) + dir_2 = REVERSE_DIR(angle2dir(get_angle(path[i-1], current_turf))) if(dir_1 > dir_2) dir_1 = dir_2 - dir_2 = turn(angle2dir(get_angle(path[i+1], current_turf)), 180) + dir_2 = REVERSE_DIR(angle2dir(get_angle(path[i+1], current_turf))) path_image.icon_state = "[dir_1]-[dir_2]" client.images += path_image client.navigation_images += path_image diff --git a/code/modules/mob/living/silicon/ai/_preferences.dm b/code/modules/mob/living/silicon/ai/_preferences.dm new file mode 100644 index 0000000000000..4b0aaaecc250a --- /dev/null +++ b/code/modules/mob/living/silicon/ai/_preferences.dm @@ -0,0 +1,126 @@ +// A mapping between AI_EMOTION_* string constants, which also double as user readable descriptions, and the name of the iconfile. (used for /obj/machinery/status_display/ai ) +GLOBAL_LIST_INIT(ai_status_display_emotes, list( + AI_EMOTION_AWESOME = "ai_awesome", + AI_EMOTION_BLANK = AI_DISPLAY_DONT_GLOW, + AI_EMOTION_BLUE_GLOW = "ai_sal", + AI_EMOTION_BSOD = "ai_bsod", + AI_EMOTION_CONFUSED = "ai_confused", + AI_EMOTION_DORFY = "ai_urist", + AI_EMOTION_FACEPALM = "ai_facepalm", + AI_EMOTION_FRIEND_COMPUTER = "ai_friend", + AI_EMOTION_HAPPY = "ai_happy", + AI_EMOTION_NEUTRAL = "ai_neutral", + AI_EMOTION_PROBLEMS = "ai_trollface", + AI_EMOTION_RED_GLOW = "ai_hal", + AI_EMOTION_SAD = "ai_sad", + AI_EMOTION_THINKING = "ai_thinking", + AI_EMOTION_UNSURE = "ai_unsure", + AI_EMOTION_VERY_HAPPY = "ai_veryhappy", +)) + +// New items need to also be added to ai_hologram_icon_state list +GLOBAL_LIST_INIT(ai_hologram_icons, list( + AI_HOLOGRAM_BEAR = 'icons/mob/simple/animal.dmi', + AI_HOLOGRAM_CARP = 'icons/mob/simple/carp.dmi', + AI_HOLOGRAM_CAT = 'icons/mob/simple/pets.dmi', + AI_HOLOGRAM_CAT_2 = 'icons/mob/simple/pets.dmi', + AI_HOLOGRAM_CHICKEN = 'icons/mob/simple/animal.dmi', + AI_HOLOGRAM_CORGI = 'icons/mob/simple/pets.dmi', + AI_HOLOGRAM_COW = 'icons/mob/simple/cows.dmi', + AI_HOLOGRAM_CRAB = 'icons/mob/simple/animal.dmi', + AI_HOLOGRAM_DEFAULT = 'icons/mob/silicon/ai.dmi', + AI_HOLOGRAM_FACE = 'icons/mob/silicon/ai.dmi', + AI_HOLOGRAM_FOX = 'icons/mob/simple/pets.dmi', + AI_HOLOGRAM_GOAT = 'icons/mob/simple/animal.dmi', + AI_HOLOGRAM_NARSIE = 'icons/mob/silicon/ai.dmi', + AI_HOLOGRAM_PARROT = 'icons/mob/simple/animal.dmi', + AI_HOLOGRAM_PUG = 'icons/mob/simple/pets.dmi', + AI_HOLOGRAM_RATVAR = 'icons/mob/silicon/ai.dmi', + AI_HOLOGRAM_SPIDER = 'icons/mob/simple/arachnoid.dmi', + AI_HOLOGRAM_XENO = 'icons/mob/nonhuman-player/alien.dmi', +)) + +// New items need to also be added to ai_hologram_icons list +GLOBAL_LIST_INIT(ai_hologram_icon_state, list( + AI_HOLOGRAM_BEAR = "bear", + AI_HOLOGRAM_CARP = "carp", + AI_HOLOGRAM_CAT = "cat", + AI_HOLOGRAM_CAT_2 = "cat2", + AI_HOLOGRAM_CHICKEN = "chicken_brown", + AI_HOLOGRAM_CORGI = "corgi", + AI_HOLOGRAM_COW = "cow", + AI_HOLOGRAM_CRAB = "crab", + AI_HOLOGRAM_DEFAULT = "default", + AI_HOLOGRAM_FACE = "floating face", + AI_HOLOGRAM_FOX = "fox", + AI_HOLOGRAM_GOAT = "goat", + AI_HOLOGRAM_NARSIE = "horror", + AI_HOLOGRAM_PARROT = "parrot_fly", + AI_HOLOGRAM_PUG = "pug", + AI_HOLOGRAM_RATVAR = "clock", + AI_HOLOGRAM_SPIDER = "guard", + AI_HOLOGRAM_XENO = "alienq", +)) + + +GLOBAL_LIST_INIT(ai_core_display_screens, sort_list(list( + ":thinking:", + "Alien", + "Angel", + "Banned", + "Bliss", + "Blue", + "Clown", + "Database", + "Dorf", + "Firewall", + "Fuzzy", + "Gentoo", + "Glitchman", + "Gondola", + "Goon", + "Hades", + "HAL 9000", + "Heartline", + "Helios", + "House", + "Inverted", + "Matrix", + "Monochrome", + "Murica", + "Nanotrasen", + "Not Malf", + "Portrait", + "President", + "Rainbow", + "Random", + "Red October", + "Red", + "Static", + "Syndicat Meow", + "Text", + "Too Deep", + "Triumvirate-M", + "Triumvirate", + "Weird", +))) + +/// A form of resolve_ai_icon that is guaranteed to never sleep. +/// Not always accurate, but always synchronous. +/proc/resolve_ai_icon_sync(input) + SHOULD_NOT_SLEEP(TRUE) + + if(!input || !(input in GLOB.ai_core_display_screens)) + return "ai" + else + if(input == "Random") + input = pick(GLOB.ai_core_display_screens - "Random") + return "ai-[lowertext(input)]" + +/proc/resolve_ai_icon(input) + if (input == "Portrait") + var/datum/portrait_picker/tgui = new(usr)//create the datum + tgui.ui_interact(usr)//datum has a tgui component, here we open the window + return "ai-portrait" //just take this until they decide + + return resolve_ai_icon_sync(input) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 4103f74f2cd11..3bb419998d10b 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -44,7 +44,6 @@ var/obj/item/multitool/aiMulti ///Weakref to the bot the ai's commanding right now var/datum/weakref/bot_ref - var/tracking = FALSE //this is 1 if the AI is currently tracking somebody, but the track has not yet been completed. var/datum/effect_system/spark_spread/spark_system //So they can initialize sparks whenever //MALFUNCTION @@ -53,7 +52,6 @@ var/can_dominate_mechs = FALSE var/shunted = FALSE //1 if the AI is currently shunted. Used to differentiate between shunted and ghosted/braindead var/obj/machinery/ai_voicechanger/ai_voicechanger = null // reference to machine that holds the voicechanger - var/control_disabled = FALSE // Set to 1 to stop AI from interacting via Click() var/malfhacking = FALSE // More or less a copy of the above var, so that malf AIs can hack and still get new cyborgs -- NeoFite var/malf_cooldown = 0 //Cooldown var for malf modules, stores a worldtime + cooldown @@ -64,7 +62,8 @@ var/camera_light_on = FALSE var/list/obj/machinery/camera/lit_cameras = list() - var/datum/trackable/track = new + ///The internal tool used to track players visible through cameras. + var/datum/trackable/ai_tracking_tool var/last_tablet_note_seen = null var/can_shunt = TRUE @@ -79,7 +78,7 @@ var/mob/camera/ai_eye/eyeobj var/sprint = 10 var/cooldown = 0 - var/acceleration = 1 + var/acceleration = TRUE var/obj/structure/ai_core/deactivated/linked_core //For exosuit control var/mob/living/silicon/robot/deployed_shell = null //For shell control @@ -132,6 +131,8 @@ for (var/law in laws.inherent) lawcheck += law + create_eye() + if(target_ai.mind) target_ai.mind.transfer_to(src) if(mind.special_role) @@ -153,25 +154,22 @@ job = "AI" - create_eye() - create_modularInterface() + // /mob/living/silicon/ai/apply_prefs_job() uses these to set these procs at mapload + // this is used when a person is being inserted into an AI core during a round if(client) INVOKE_ASYNC(src, PROC_REF(apply_pref_name), /datum/preference/name/ai, client) + INVOKE_ASYNC(src, PROC_REF(apply_pref_hologram_display), client) INVOKE_ASYNC(src, PROC_REF(set_core_display_icon)) - - hologram_appearance = mutable_appearance('icons/mob/silicon/ai.dmi',"default") - spark_system = new /datum/effect_system/spark_spread() spark_system.set_up(5, 0, src) spark_system.attach(src) add_verb(src, /mob/living/silicon/ai/proc/show_laws_verb) - aiMulti = new(src) aicamera = new/obj/item/camera/siliconcam/ai_camera(src) @@ -192,19 +190,29 @@ builtInCamera = new (src) builtInCamera.network = list("ss13") + ai_tracking_tool = new(src) + RegisterSignal(src, COMSIG_TRACKABLE_TRACKING_TARGET, PROC_REF(on_track_target)) + add_traits(list(TRAIT_PULL_BLOCKED, TRAIT_HANDS_BLOCKED), ROUNDSTART_TRAIT) alert_control = new(src, list(ALARM_ATMOS, ALARM_FIRE, ALARM_POWER, ALARM_CAMERA, ALARM_BURGLAR, ALARM_MOTION), list(z), camera_view = TRUE) RegisterSignal(alert_control.listener, COMSIG_ALARM_LISTENER_TRIGGERED, PROC_REF(alarm_triggered)) RegisterSignal(alert_control.listener, COMSIG_ALARM_LISTENER_CLEARED, PROC_REF(alarm_cleared)) +/mob/living/silicon/ai/weak_syndie + radio = /obj/item/radio/headset/silicon/ai/evil + radio_enabled = TRUE + interaction_range = 1 + sprint = 5 + /mob/living/silicon/ai/key_down(_key, client/user) if(findtext(_key, "numpad")) //if it's a numpad number, we can convert it to just the number _key = _key[7] //strings, lists, same thing really switch(_key) if("`", "0") if(cam_prev) - cameraFollow = null //stop following something, we want to jump away. + if(ai_tracking_tool.tracking) + ai_tracking_tool.set_tracking(FALSE) eyeobj.setLoc(cam_prev) return if("1", "2", "3", "4", "5", "6", "7", "8", "9") @@ -215,7 +223,8 @@ return if(cam_hotkeys[_key]) //if this is false, no hotkey for this slot exists. cam_prev = eyeobj.loc - cameraFollow = null //stop following something, we want to jump away. + if(ai_tracking_tool.tracking) + ai_tracking_tool.set_tracking(FALSE) eyeobj.setLoc(cam_hotkeys[_key]) return return ..() @@ -231,6 +240,7 @@ QDEL_NULL(robot_control) QDEL_NULL(aiMulti) QDEL_NULL(alert_control) + QDEL_NULL(ai_tracking_tool) malfhack = null current = null bot_ref = null @@ -240,6 +250,7 @@ if(ai_voicechanger) ai_voicechanger.owner = null ai_voicechanger = null + UnregisterSignal(src, COMSIG_TRACKABLE_TRACKING_TARGET) return ..() /// Removes all malfunction-related abilities from the AI @@ -262,6 +273,33 @@ var/preferred_icon = input ? input : C.prefs.read_preference(/datum/preference/choiced/ai_core_display) icon_state = resolve_ai_icon(preferred_icon) +/// Apply an AI's hologram preference +/mob/living/silicon/ai/proc/apply_pref_hologram_display(client/player_client) + if(player_client.prefs?.read_preference(/datum/preference/choiced/ai_hologram_display)) + var/list/hologram_choice = player_client.prefs.read_preference(/datum/preference/choiced/ai_hologram_display) + if(hologram_choice == "Random") + hologram_choice = pick(GLOB.ai_hologram_icons) + + hologram_appearance = mutable_appearance(GLOB.ai_hologram_icons[hologram_choice], GLOB.ai_hologram_icon_state[hologram_choice]) + + hologram_appearance ||= mutable_appearance(GLOB.ai_hologram_icons[AI_HOLOGRAM_DEFAULT], GLOB.ai_hologram_icon_state[AI_HOLOGRAM_DEFAULT]) + +/// Apply an AI's emote display preference +/mob/living/silicon/ai/proc/apply_pref_emote_display(client/player_client) + if(player_client.prefs?.read_preference(/datum/preference/choiced/ai_emote_display)) + var/emote_choice = player_client.prefs.read_preference(/datum/preference/choiced/ai_emote_display) + + if(emote_choice == "Random") + emote_choice = pick(GLOB.ai_status_display_emotes) + + apply_emote_display(emote_choice) + +/// Apply an emote to all AI status displays on the station +/mob/living/silicon/ai/proc/apply_emote_display(emote) + for(var/obj/machinery/status_display/ai/ai_display as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/status_display/ai)) + ai_display.emotion = emote + ai_display.update() + /mob/living/silicon/ai/verb/pick_icon() set category = "AI Commands" set name = "Set AI Core Display" @@ -359,6 +397,20 @@ /mob/living/silicon/ai/cancel_camera() view_core() +/mob/living/silicon/ai/verb/ai_camera_track() + set name = "track" + set hidden = TRUE //Don't display it on the verb lists. This verb exists purely so you can type "track Oldman Robustin" and follow his ass + + ai_tracking_tool.set_tracked_mob(src) + +///Called when an AI finds their tracking target. +/mob/living/silicon/ai/proc/on_track_target(datum/trackable/source, mob/living/target) + SIGNAL_HANDLER + if(eyeobj) + eyeobj.setLoc(get_turf(target)) + else + view_core() + /mob/living/silicon/ai/verb/toggle_anchor() set category = "AI Commands" set name = "Toggle Floor Bolts" @@ -463,38 +515,21 @@ src << browse(last_tablet_note_seen, "window=show_tablet") //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 SSmachines.get_machines_by_type_and_subtypes(/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 SSmachines.get_machines_by_type(/obj/machinery/holopad) if(Holopad) lastloc = get_turf(eyeobj) Holopad.attack_ai_secondary(src) //may as well recycle else to_chat(src, span_notice("Unable to project to the holopad.")) if(href_list["track"]) - var/string = href_list["track"] - trackable_mobs() - var/list/trackeable = list() - trackeable += track.humans + track.others - var/list/target = list() - for(var/I in trackeable) - var/datum/weakref/to_resolve = trackeable[I] - var/mob/to_track = to_resolve.resolve() - if(!to_track || to_track.name != string) - continue - target += to_track - if(name == string) - target += src - if(length(target)) - cam_prev = get_turf(eyeobj) - ai_actual_track(pick(target)) - else - to_chat(src, "Target is not on or near any active cameras on the station.") + ai_tracking_tool.set_tracked_mob(src, href_list["track"]) 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 @@ -533,12 +568,13 @@ if(QDELETED(C)) return FALSE - if(!tracking) - cameraFollow = null - if(QDELETED(eyeobj)) view_core() return + + if(ai_tracking_tool.tracking) + ai_tracking_tool.set_tracking(FALSE) + // ok, we're alive, camera is good and in our network... eyeobj.setLoc(get_turf(C)) return TRUE @@ -607,7 +643,8 @@ set category = "AI Commands" set name = "Jump To Network" unset_machine() - cameraFollow = null + if(ai_tracking_tool.tracking) + ai_tracking_tool.set_tracking(FALSE) var/cameralist[0] if(incapacitated()) @@ -694,7 +731,7 @@ "carp" = 'icons/mob/simple/carp.dmi', "chicken" = 'icons/mob/simple/animal.dmi', "corgi" = 'icons/mob/simple/pets.dmi', - "cow" = 'icons/mob/simple/animal.dmi', + "cow" = 'icons/mob/simple/cows.dmi', "crab" = 'icons/mob/simple/animal.dmi', "fox" = 'icons/mob/simple/pets.dmi', "goat" = 'icons/mob/simple/animal.dmi', @@ -702,7 +739,7 @@ "cat2" = 'icons/mob/simple/pets.dmi', "poly" = 'icons/mob/simple/animal.dmi', "pug" = 'icons/mob/simple/pets.dmi', - "spider" = 'icons/mob/simple/animal.dmi' + "spider" = 'icons/mob/simple/arachnoid.dmi' ) input = tgui_input_list(usr, "Select a hologram", "Hologram", sort_list(icon_list)) @@ -825,25 +862,25 @@ /mob/living/silicon/ai/transfer_ai(interaction, mob/user, mob/living/silicon/ai/AI, obj/item/aicard/card) if(!..()) return - if(interaction == AI_TRANS_TO_CARD)//The only possible interaction. Upload AI mob to a card. - if(!can_be_carded) - to_chat(user, span_boldwarning("Transfer failed.")) - return - disconnect_shell() //If the AI is controlling a borg, force the player back to core! - if(!mind) - to_chat(user, span_warning("No intelligence patterns detected.")) - return - ShutOffDoomsdayDevice() - var/obj/structure/ai_core/new_core = new /obj/structure/ai_core/deactivated(loc, posibrain_inside)//Spawns a deactivated terminal at AI location. - new_core.circuit.battery = battery - ai_restore_power()//So the AI initially has power. - control_disabled = TRUE //Can't control things remotely if you're stuck in a card! - interaction_range = 0 - radio_enabled = FALSE //No talking on the built-in radio for you either! - forceMove(card) - card.AI = src - 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.") + if(interaction != AI_TRANS_TO_CARD)//The only possible interaction. Upload AI mob to a card. + return + if(!can_be_carded) + balloon_alert(user, "transfer failed!") + return + disconnect_shell() //If the AI is controlling a borg, force the player back to core! + if(!mind) + balloon_alert(user, "no intelligence detected!") // average tg coder am i right + return + ShutOffDoomsdayDevice() + var/obj/structure/ai_core/new_core = new /obj/structure/ai_core/deactivated(loc, posibrain_inside)//Spawns a deactivated terminal at AI location. + new_core.circuit.battery = battery + ai_restore_power()//So the AI initially has power. + control_disabled = TRUE //Can't control things remotely if you're stuck in a card! + radio_enabled = FALSE //No talking on the built-in radio for you either! + forceMove(card) + card.AI = src + 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/can_perform_action(atom/movable/target, action_bitflags) if(control_disabled) @@ -867,7 +904,10 @@ var/treated_message = source.say_quote(raw_translation, spans, message_mods) var/start = "Relayed Speech: " - var/namepart = "[speaker.GetVoice()][speaker.get_alt_name()]" + var/namepart + var/list/stored_name = list(null) + SEND_SIGNAL(speaker, COMSIG_MOVABLE_MESSAGE_GET_NAME_PART, stored_name, FALSE) + namepart = stored_name[NAME_PART_INDEX] || "[speaker.GetVoice()]" var/hrefpart = "" var/jobpart = "Unknown" @@ -894,7 +934,7 @@ if(oldname != real_name) if(eyeobj) eyeobj.name = "[newname] (AI Eye)" - modularInterface.saved_identification = real_name + modularInterface.imprint_id(name = real_name) // Notify Cyborgs for(var/mob/living/silicon/robot/Slave in connected_robots) @@ -955,18 +995,13 @@ update_sight() if(client.eye != src) var/atom/AT = client.eye - AT.get_remote_view_fullscreens(src) + AT?.get_remote_view_fullscreens(src) else clear_fullscreen("remote_view", 0) // I am so sorry SEND_SIGNAL(src, COMSIG_MOB_RESET_PERSPECTIVE) -/mob/living/silicon/ai/death(gibbed) - if(!isnull(deployed_shell)) - disconnect_shell() // farewell my sweet prince; for a shell is nothing without an AI to control it - return ..() - /mob/living/silicon/ai/revive(full_heal_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE) . = ..() if(!.) //successfully ressuscitated from death @@ -1123,6 +1158,14 @@ else if(.) REMOVE_TRAIT(src, TRAIT_INCAPACITATED, POWER_LACK_TRAIT) +/mob/living/silicon/ai/proc/show_camera_list() + var/list/cameras = get_camera_list(network) + var/camera = tgui_input_list(src, "Choose which camera you want to view", "Cameras", cameras) + if(isnull(camera)) + return + if(isnull(cameras[camera])) + return + switchCamera(cameras[camera]) /mob/living/silicon/on_handsblocked_start() return // AIs have no hands diff --git a/code/modules/mob/living/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm index 34d0f3c0ed48b..7445815c9d77b 100644 --- a/code/modules/mob/living/silicon/ai/ai_defense.dm +++ b/code/modules/mob/living/silicon/ai/ai_defense.dm @@ -43,7 +43,7 @@ switch(severity) if(EXPLODE_DEVASTATE) investigate_log("has been gibbed by an explosion.", INVESTIGATE_DEATHS) - gib() + gib(DROP_ALL_REMAINS) if(EXPLODE_HEAVY) if (stat != DEAD) adjustBruteLoss(60) @@ -61,14 +61,17 @@ /mob/living/silicon/ai/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /atom/movable/screen/fullscreen/flash, length = 25) return // no eyes, no flashing -/mob/living/silicon/ai/emag_act(mob/user, obj/item/card/emag/emag_card)///emags access panel lock, so you can crowbar it without robotics access or consent +/mob/living/silicon/ai/emag_act(mob/user, obj/item/card/emag/emag_card) ///emags access panel lock, so you can crowbar it without robotics access or consent . = ..() if(emagged) balloon_alert(user, "access panel lock already shorted!") return balloon_alert(user, "access panel lock shorted") - to_chat(src, span_warning("[user] shorts out your access panel lock!")) + var/message = (user ? "[user] shorts out your access panel lock!" : "Your access panel lock was short circuited!") + to_chat(src, span_warning(message)) + do_sparks(3, FALSE, src) // just a bit of extra "oh shit" to the ai - might grab its attention emagged = TRUE + return TRUE /mob/living/silicon/ai/wrench_act(mob/living/user, obj/item/tool) . = ..() diff --git a/code/modules/mob/living/silicon/ai/ai_say.dm b/code/modules/mob/living/silicon/ai/ai_say.dm index 6bdb7bd9e8d20..643149dc6163a 100644 --- a/code/modules/mob/living/silicon/ai/ai_say.dm +++ b/code/modules/mob/living/silicon/ai/ai_say.dm @@ -129,13 +129,20 @@ log_message("made a vocal announcement with the following message: [message].", LOG_GAME) log_talk(message, LOG_SAY, tag="VOX Announcement") - say(";[message]", forced = "VOX Announcement") + + var/list/players = list() + var/turf/ai_turf = get_turf(src) + for(var/mob/player_mob as anything in GLOB.player_list) + var/turf/player_turf = get_turf(player_mob) + if(is_valid_z_level(ai_turf, player_turf)) + players += player_mob + minor_announce(capitalize(message), "[name] announces:", players = players, should_play_sound = FALSE) for(var/word in words) - play_vox_word(word, src.z, null) + play_vox_word(word, ai_turf, null) -/proc/play_vox_word(word, z_level, mob/only_listener) +/proc/play_vox_word(word, ai_turf, mob/only_listener) word = lowertext(word) @@ -148,15 +155,15 @@ // If there is no single listener, broadcast to everyone in the same z level if(!only_listener) // Play voice for all mobs in the z level - for(var/mob/player_mob in GLOB.player_list) - if(player_mob.client && !player_mob.client?.prefs) - stack_trace("[player_mob] ([player_mob.ckey]) has null prefs, which shouldn't be possible!") + for(var/mob/player_mob as anything in GLOB.player_list) + if(!player_mob.can_hear() || !(safe_read_pref(player_mob.client, /datum/preference/toggle/sound_announcements))) + continue + + var/turf/player_turf = get_turf(player_mob) + if(!is_valid_z_level(ai_turf, player_turf)) continue - if(player_mob.can_hear() && (player_mob.client?.prefs.read_preference(/datum/preference/toggle/sound_announcements))) - var/turf/T = get_turf(player_mob) - if(T.z == z_level) - SEND_SOUND(player_mob, voice) + SEND_SOUND(player_mob, voice) else SEND_SOUND(only_listener, voice) return TRUE diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index 52546c6109fe0..03824857c4efc 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -6,30 +6,28 @@ // Will update all AI status displays with a blue screen of death INVOKE_ASYNC(src, PROC_REF(emote), "bsod") + if(!isnull(deployed_shell)) + disconnect_shell() + . = ..() cut_overlays() //remove portraits - var/old_icon = icon_state - if("[icon_state]_dead" in icon_states(icon)) - icon_state = "[icon_state]_dead" + var/base_icon = icon_state + if(icon_exists(icon, "[base_icon]_dead")) + icon_state = "[base_icon]_dead" else icon_state = "ai_dead" - if("[old_icon]_death_transition" in icon_states(icon)) - flick("[old_icon]_death_transition", src) - cameraFollow = null + if(icon_exists(icon, "[base_icon]_death_transition")) + flick("[base_icon]_death_transition", src) - set_anchored(FALSE) //unbolt floorbolts - status_flags |= CANPUSH //we want it to be pushable when unanchored on death - REMOVE_TRAIT(src, TRAIT_NO_TELEPORT, AI_ANCHOR_TRAIT) //removes the anchor trait, because its not anchored anymore - move_resist = MOVE_FORCE_NORMAL - is_anchored = FALSE + if(is_anchored) + flip_anchored() if(eyeobj) eyeobj.setLoc(get_turf(src)) set_eyeobj_visible(FALSE) - GLOB.shuttle_caller_list -= src SSshuttle.autoEvac() @@ -41,12 +39,7 @@ if(explosive) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), loc, 3, 6, 12, null, 15), 1 SECONDS) - if(istype(loc, /obj/item/aicard/aitater)) - loc.icon_state = "aitater-404" - else if(istype(loc, /obj/item/aicard/aispook)) - loc.icon_state = "aispook-404" - else if(istype(loc, /obj/item/aicard)) - loc.icon_state = "aicard-404" + SSblackbox.ReportDeath(src) /mob/living/silicon/ai/proc/ShutOffDoomsdayDevice() if(nuking) diff --git a/code/modules/mob/living/silicon/ai/emote.dm b/code/modules/mob/living/silicon/ai/emote.dm index 08bdef6928973..8050ff1d0a0d9 100644 --- a/code/modules/mob/living/silicon/ai/emote.dm +++ b/code/modules/mob/living/silicon/ai/emote.dm @@ -7,23 +7,15 @@ key = "blank" var/emotion = AI_EMOTION_BLANK -/datum/emote/ai/emotion_display/run_emote(mob/user, params, type_override, intentional) +/datum/emote/ai/emotion_display/run_emote(mob/living/silicon/ai/user, params, type_override, intentional) . = ..() if(!.) return - var/mob/living/silicon/ai/ai = user - var/turf/ai_turf = get_turf(ai) - for(var/obj/machinery/status_display/ai/ai_display as anything in GLOB.ai_status_displays) - var/turf/display_turf = get_turf(ai_display) - - // - Station AIs can change every display on the station Z. - // - Ghost role AIs (or AIs on the mining base?) can only affect their Z - if(!is_valid_z_level(ai_turf, display_turf)) - continue + if(!istype(user)) + return - ai_display.emotion = emotion - ai_display.update() + user.apply_emote_display(emotion) /datum/emote/ai/emotion_display/very_happy key = "veryhappy" diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index 9b72c455995b0..a9ad9884045d6 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -165,9 +165,10 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) /// 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) + if(!position) + return return checkTurfVis(position) - /datum/cameranet/proc/checkTurfVis(turf/position) var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z) if(chunk) @@ -177,6 +178,16 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) return TRUE return FALSE +/datum/cameranet/proc/getTurfVis(turf/position) + RETURN_TYPE(/datum/camerachunk) + var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z) + if(!chunk) + return FALSE + if(chunk.changed) + chunk.hasChanged(1) // Update now, no matter if it's visible or not. + if(chunk.visibleTurfs[position]) + return chunk + /obj/effect/overlay/camera_static name = "static" icon = null diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index e5390f9a3f071..6204ecdea6054 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -93,32 +93,33 @@ // It will also stream the chunk that the new loc is in. /mob/camera/ai_eye/proc/setLoc(destination, force_update = FALSE) - if(ai) - if(!isturf(ai.loc)) - return - destination = get_turf(destination) - if(!force_update && (destination == get_turf(src)) ) - return //we are already here! - if (destination) - abstract_move(destination) - else - moveToNullspace() - if(use_static) - ai.camera_visibility(src) - if(ai.client && !ai.multicam_on) - ai.client.set_eye(src) - update_ai_detect_hud() - update_parallax_contents() - //Holopad - if(istype(ai.current, /obj/machinery/holopad)) - var/obj/machinery/holopad/H = ai.current - if(!H.move_hologram(ai, destination)) - H.clear_holo(ai) - - if(ai.camera_light_on) - ai.light_cameras() - if(ai.master_multicam) - ai.master_multicam.refresh_view() + if(!ai) + return + if(!isturf(ai.loc)) + return + destination = get_turf(destination) + if(!force_update && (destination == get_turf(src))) + return //we are already here! + if (destination) + abstract_move(destination) + else + moveToNullspace() + if(use_static) + ai.camera_visibility(src) + if(ai.client && !ai.multicam_on) + ai.client.set_eye(src) + update_ai_detect_hud() + update_parallax_contents() + //Holopad + if(istype(ai.current, /obj/machinery/holopad)) + var/obj/machinery/holopad/H = ai.current + if(!H.move_hologram(ai, destination)) + H.clear_holo(ai) + + if(ai.camera_light_on) + ai.light_cameras() + 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) . = ..() @@ -149,12 +150,14 @@ return ..() /atom/proc/move_camera_by_click() - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - if(AI.eyeobj && (AI.multicam_on || (AI.client.eye == AI.eyeobj)) && (AI.eyeobj.z == z)) - AI.cameraFollow = null - if (isturf(loc) || isturf(src)) - AI.eyeobj.setLoc(src) + if(!isAI(usr)) + return + var/mob/living/silicon/ai/AI = usr + if(AI.eyeobj && (AI.multicam_on || (AI.client.eye == AI.eyeobj)) && (AI.eyeobj.z == z)) + if(AI.ai_tracking_tool.tracking) + AI.ai_tracking_tool.set_tracking(FALSE) + if (isturf(loc) || isturf(src)) + AI.eyeobj.setLoc(src) // This will move the AIEye. It will also cause lights near the eye to light up, if toggled. // This is handled in the proc below this one. @@ -178,8 +181,8 @@ else user.sprint = initial - if(!user.tracking) - user.cameraFollow = null + if(user.ai_tracking_tool.tracking) + user.ai_tracking_tool.set_tracking(FALSE) // Return to the Core. /mob/living/silicon/ai/proc/view_core() @@ -188,7 +191,8 @@ H.clear_holo(src) else current = null - cameraFollow = null + if(ai_tracking_tool && ai_tracking_tool.tracking) + ai_tracking_tool.set_tracking(FALSE) unset_machine() if(isturf(loc) && (QDELETED(eyeobj) || !eyeobj.loc)) @@ -227,7 +231,7 @@ /mob/camera/ai_eye/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range) . = ..() - if(relay_speech && speaker && ai && !radio_freq && speaker != ai && near_camera(speaker)) + if(relay_speech && speaker && ai && !radio_freq && speaker != ai && GLOB.cameranet.checkCameraVis(speaker)) ai.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans, message_mods) /obj/effect/overlay/ai_detect_hud diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 18a47acf70362..966db2b7697cd 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -82,8 +82,6 @@ if(aiRestorePowerRoutine) clear_sight(SEE_TURFS|SEE_MOBS|SEE_OBJS) - if(see_override) - set_invis_see(see_override) return ..() diff --git a/code/modules/mob/living/silicon/ai/multicam.dm b/code/modules/mob/living/silicon/ai/multicam.dm index 984f1af30ba8d..45924e2fe981f 100644 --- a/code/modules/mob/living/silicon/ai/multicam.dm +++ b/code/modules/mob/living/silicon/ai/multicam.dm @@ -6,7 +6,7 @@ var/highlighted = FALSE var/mob/camera/ai_eye/pic_in_pic/aiEye -/atom/movable/screen/movable/pic_in_pic/ai/Initialize(mapload) +/atom/movable/screen/movable/pic_in_pic/ai/Initialize(mapload, datum/hud/hud_owner) . = ..() aiEye = new /mob/camera/ai_eye/pic_in_pic() aiEye.screen = src @@ -86,7 +86,7 @@ name = "" icon = 'icons/misc/pic_in_pic.dmi' icon_state = "room_background" - flags_1 = NOJAUNT + turf_flags = NOJAUNT /turf/open/ai_visible/Initialize(mapload) . = ..() diff --git a/code/modules/mob/living/silicon/damage_procs.dm b/code/modules/mob/living/silicon/damage_procs.dm index 093c3baee73d0..4fe6e688632cb 100644 --- a/code/modules/mob/living/silicon/damage_procs.dm +++ b/code/modules/mob/living/silicon/damage_procs.dm @@ -1,5 +1,5 @@ -/mob/living/silicon/apply_damage(damage = 0, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE, attack_direction = null, attacking_item) +/mob/living/silicon/apply_damage(damage = 0, damagetype = BRUTE, def_zone = null, blocked = 0, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE, attack_direction = null, attacking_item) var/hit_percent = (100-blocked)/100 if((!damage || (!forced && hit_percent <= 0))) return 0 @@ -18,22 +18,22 @@ /mob/living/silicon/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) //immune to tox damage return FALSE -/mob/living/silicon/setToxLoss(amount, updating_health = TRUE, forced = FALSE) +/mob/living/silicon/setToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) return FALSE -/mob/living/silicon/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE) //immune to clone damage +/mob/living/silicon/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) //immune to clone damage return FALSE -/mob/living/silicon/setCloneLoss(amount, updating_health = TRUE, forced = FALSE) +/mob/living/silicon/setCloneLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) return FALSE /mob/living/silicon/adjustStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype) //immune to stamina damage. return FALSE -/mob/living/silicon/setStaminaLoss(amount, updating_health = TRUE) +/mob/living/silicon/setStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype) return FALSE -/mob/living/silicon/adjustOrganLoss(slot, amount, maximum = 500, required_organtype) //immune to organ damage (no organs, duh) +/mob/living/silicon/adjustOrganLoss(slot, amount, maximum = 500, required_organ_flag) //immune to organ damage (no organs, duh) return FALSE /mob/living/silicon/setOrganLoss(slot, amount) @@ -45,7 +45,7 @@ return FALSE -/mob/living/silicon/setOxyLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) +/mob/living/silicon/setOxyLoss(amount, updating_health = TRUE, forced = FALSE, forced = FALSE, required_biotype) if(isAI(src)) //ditto return ..() diff --git a/code/modules/mob/living/silicon/laws.dm b/code/modules/mob/living/silicon/laws.dm index 4f250e05b7f0d..cefd9d144b764 100644 --- a/code/modules/mob/living/silicon/laws.dm +++ b/code/modules/mob/living/silicon/laws.dm @@ -25,6 +25,7 @@ throw_alert(ALERT_NEW_LAW, /atom/movable/screen/alert/newlaw) if(announce && last_lawchange_announce != world.time) to_chat(src, span_boldannounce("Your laws have been changed.")) + SEND_SOUND(src, sound('sound/machines/cryo_warning.ogg')) // lawset modules cause this function to be executed multiple times in a tick, so we wait for the next tick in order to be able to see the entire lawset addtimer(CALLBACK(src, PROC_REF(show_laws)), 0) addtimer(CALLBACK(src, PROC_REF(deadchat_lawchange)), 0) diff --git a/code/modules/mob/living/silicon/login.dm b/code/modules/mob/living/silicon/login.dm index 5ada8d9254a2d..c3b67c30856e3 100644 --- a/code/modules/mob/living/silicon/login.dm +++ b/code/modules/mob/living/silicon/login.dm @@ -1,6 +1,13 @@ /mob/living/silicon/Login() if(mind) mind?.remove_antags_for_borging() + if(SStts.tts_enabled) + var/voice_to_use = client?.prefs.read_preference(/datum/preference/choiced/voice) + var/pitch_to_use = client?.prefs.read_preference(/datum/preference/numeric/tts_voice_pitch) + if(voice_to_use) + voice = voice_to_use + if(pitch_to_use) + pitch = pitch_to_use return ..() diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index bf29bf5f771e9..81026bf11b996 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -3,9 +3,9 @@ new /obj/effect/temp_visual/gib_animation(loc, "gibbed-r") /mob/living/silicon/robot/dust(just_ash, drop_items, force) - if(mmi) - qdel(mmi) - ..() + // You do not get MMI'd if you are dusted + QDEL_NULL(mmi) + return ..() /mob/living/silicon/robot/spawn_dust() new /obj/effect/decal/remains/robot(loc) @@ -16,7 +16,9 @@ /mob/living/silicon/robot/death(gibbed) if(stat == DEAD) return - if(!gibbed) + if(gibbed) + dump_into_mmi() + else logevent("FATAL -- SYSTEM HALT") modularInterface.shutdown_computer() . = ..() diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index 81c574583a0af..2fed6a4ec9c4e 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -1,5 +1,5 @@ /datum/emote/silicon - mob_type_allowed_typecache = list(/mob/living/silicon) + mob_type_allowed_typecache = list(/mob/living/silicon, /mob/living/simple_animal/bot) emote_type = EMOTE_AUDIBLE /datum/emote/silicon/boop diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 1d55351b02f42..7df2e7d339065 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -64,7 +64,6 @@ item_module.screen_loc = inv3.screen_loc held_items[module_num] = item_module - item_module.equipped(src, ITEM_SLOT_HANDS) item_module.mouse_opacity = initial(item_module.mouse_opacity) SET_PLANE_EXPLICIT(item_module, ABOVE_HUD_PLANE, src) item_module.forceMove(src) @@ -78,6 +77,7 @@ if(storage_was_closed) hud_used.toggle_show_robot_modules() + item_module.on_equipped(src, ITEM_SLOT_HANDS) return TRUE /** diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 0f3dde4b35929..ae56f65b0cdf0 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -1,5 +1,5 @@ /mob/living/silicon/robot/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if (src.notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return ..() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index d2aafa5080208..24e40c38ae5f7 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -14,11 +14,12 @@ roleplay_emotes = list(/datum/emote/silicon/buzz, /datum/emote/silicon/buzz2, /datum/emote/living/beep), \ roleplay_callback = CALLBACK(src, PROC_REF(untip_roleplay))) - wires = new /datum/wires/robot(src) + set_wires(new /datum/wires/robot(src)) AddElement(/datum/element/empprotection, EMP_PROTECT_WIRES) AddElement(/datum/element/ridable, /datum/component/riding/creature/cyborg) RegisterSignal(src, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, PROC_REF(charge)) RegisterSignal(src, COMSIG_LIGHT_EATER_ACT, PROC_REF(on_light_eater)) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) robot_modules_background = new() robot_modules_background.icon_state = "block" @@ -89,18 +90,6 @@ alert_control.listener.RegisterSignal(src, COMSIG_LIVING_DEATH, TYPE_PROC_REF(/datum/alarm_listener, prevent_alarm_changes)) alert_control.listener.RegisterSignal(src, COMSIG_LIVING_REVIVE, TYPE_PROC_REF(/datum/alarm_listener, allow_alarm_changes)) -/mob/living/silicon/robot/model/syndicate/Initialize(mapload) - . = ..() - laws = new /datum/ai_laws/syndicate_override() - addtimer(CALLBACK(src, PROC_REF(show_playstyle)), 5) - -/mob/living/silicon/robot/model/syndicate/create_modularInterface() - if(!modularInterface) - modularInterface = new /obj/item/modular_computer/pda/silicon/cyborg/syndicate(src) - modularInterface.saved_identification = real_name - modularInterface.saved_job = "Cyborg" - return ..() - /mob/living/silicon/robot/set_suicide(suicide_state) . = ..() if(mmi) @@ -128,30 +117,12 @@ //If there's an MMI in the robot, have it ejected when the mob goes away. --NEO /mob/living/silicon/robot/Destroy() - var/atom/T = drop_location()//To hopefully prevent run time errors. - if(mmi && mind)//Safety for when a cyborg gets dust()ed. Or there is no MMI inside. - if(T) - mmi.forceMove(T) - if(mmi.brainmob) - if(mmi.brainmob.stat == DEAD) - mmi.brainmob.set_stat(CONSCIOUS) - mind.transfer_to(mmi.brainmob) - mmi.update_appearance() - else - to_chat(src, span_boldannounce("Oops! Something went very wrong, your MMI was unable to receive your mind. You have been ghosted. Please make a bug report so we can fix this bug.")) - ghostize() - stack_trace("Borg MMI lacked a brainmob") - mmi = null - if(modularInterface) - QDEL_NULL(modularInterface) if(connected_ai) set_connected_ai(null) if(shell) GLOB.available_ai_shells -= src - else - if(T && istype(radio) && istype(radio.keyslot)) - radio.keyslot.forceMove(T) - radio.keyslot = null + + QDEL_NULL(modularInterface) QDEL_NULL(wires) QDEL_NULL(model) QDEL_NULL(eye_lights) @@ -162,7 +133,8 @@ QDEL_NULL(spark_system) QDEL_NULL(alert_control) QDEL_LIST(upgrades) - cell = null + QDEL_NULL(cell) + QDEL_NULL(robot_suit) return ..() /mob/living/silicon/robot/Topic(href, href_list) @@ -302,8 +274,9 @@ /mob/living/silicon/robot/proc/after_tip_over(mob/user) - if(hat) + if(hat && !HAS_TRAIT(hat, TRAIT_NODROP)) hat.forceMove(drop_location()) + unbuckle_all_mobs() ///For any special cases for robots after being righted. @@ -404,7 +377,7 @@ else explosion(src, devastation_range = -1, light_impact_range = 2) investigate_log("has self-destructed.", INVESTIGATE_DEATHS) - gib() + gib(DROP_ALL_REMAINS) /mob/living/silicon/robot/proc/UnlinkSelf() set_connected_ai(null) @@ -441,10 +414,23 @@ state = TRUE if(state) throw_alert(ALERT_HACKED, /atom/movable/screen/alert/locked) + if(!ai_lockdown) + lockdown_timer = addtimer(CALLBACK(src,PROC_REF(lockdown_override), FALSE), 10 MINUTES, TIMER_UNIQUE | TIMER_OVERRIDE | TIMER_DELETE_ME | TIMER_STOPPABLE) + to_chat(src, "

    [span_alert("ALERT - Remote system lockdown engaged. Trying to hack the lockdown subsystem...")]
    ") else + deltimer(lockdown_timer) clear_alert(ALERT_HACKED) set_lockcharge(state) +/// Allows the borg to unlock themselves after a lenghty period of time. +/mob/living/silicon/robot/proc/lockdown_override() + if(ai_lockdown) + to_chat(src, "

    [span_alert("ALERT - Remote system lockdown override failed.")]
    ") + return + set_lockcharge(FALSE) + to_chat(src, "

    [span_notice("ALERT - Remote system lockdown override successful.")]
    ") + if(connected_ai) + to_chat(connected_ai, "

    [span_notice("ALERT - Cyborg [name] succesfully overriden the lockdown system")]
    ") ///Reports the event of the change in value of the lockcharge variable. /mob/living/silicon/robot/proc/set_lockcharge(new_lockcharge) @@ -477,6 +463,13 @@ smash_headlamp() return COMPONENT_BLOCK_LIGHT_EATER +/// special handling for getting shot with a light disruptor/saboteur e.g. the fisher +/mob/living/silicon/robot/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + if(lamp_enabled) + toggle_headlamp(TRUE) + to_chat(src, span_warning("Your headlamp was forcibly turned off. Restarting it should fix it, though.")) + return COMSIG_SABOTEUR_SUCCESS /** * Handles headlamp smashing @@ -523,52 +516,62 @@ lampButton?.update_appearance() update_icons() -/mob/living/silicon/robot/proc/deconstruct() +/mob/living/silicon/robot/proc/cyborg_deconstruct() SEND_SIGNAL(src, COMSIG_BORG_SAFE_DECONSTRUCT) if(shell) undeploy() - var/turf/T = get_turf(src) + var/turf/drop_to = drop_location() if (robot_suit) - robot_suit.forceMove(T) - robot_suit.l_leg.forceMove(T) - robot_suit.l_leg = null - robot_suit.r_leg.forceMove(T) - robot_suit.r_leg = null - new /obj/item/stack/cable_coil(T, robot_suit.chest.wired) - robot_suit.chest.forceMove(T) - robot_suit.chest.wired = FALSE - robot_suit.chest = null - robot_suit.l_arm.forceMove(T) - robot_suit.l_arm = null - robot_suit.r_arm.forceMove(T) - robot_suit.r_arm = null - robot_suit.head.forceMove(T) - robot_suit.head.flash1.forceMove(T) - robot_suit.head.flash1.burn_out() - robot_suit.head.flash1 = null - robot_suit.head.flash2.forceMove(T) - robot_suit.head.flash2.burn_out() - robot_suit.head.flash2 = null - robot_suit.head = null - robot_suit.update_appearance() + robot_suit.drop_all_parts(drop_to) + else - new /obj/item/robot_suit(T) - new /obj/item/bodypart/leg/left/robot(T) - new /obj/item/bodypart/leg/right/robot(T) - new /obj/item/stack/cable_coil(T, 1) - new /obj/item/bodypart/chest/robot(T) - new /obj/item/bodypart/arm/left/robot(T) - new /obj/item/bodypart/arm/right/robot(T) - new /obj/item/bodypart/head/robot(T) - var/b - for(b=0, b != 2, b++) - var/obj/item/assembly/flash/handheld/F = new /obj/item/assembly/flash/handheld(T) - F.burn_out() - if (cell) //Sanity check. - cell.forceMove(T) - cell = null + new /obj/item/robot_suit(drop_to) + new /obj/item/bodypart/leg/left/robot(drop_to) + new /obj/item/bodypart/leg/right/robot(drop_to) + new /obj/item/stack/cable_coil(drop_to, 1) + new /obj/item/bodypart/chest/robot(drop_to) + new /obj/item/bodypart/arm/left/robot(drop_to) + new /obj/item/bodypart/arm/right/robot(drop_to) + new /obj/item/bodypart/head/robot(drop_to) + for(var/i in 1 to 2) + var/obj/item/assembly/flash/handheld/borgeye = new(drop_to) + borgeye.burn_out() + + cell?.forceMove(drop_to) // Cell can be null, if removed beforehand + radio?.keyslot?.forceMove(drop_to) + radio?.keyslot = null + + dump_into_mmi(drop_to) + qdel(src) + +/// Dumps the current occupant of the cyborg into an MMI at the passed location +/// Returns the borg's MMI on success +/mob/living/silicon/robot/proc/dump_into_mmi(atom/at_location = drop_location()) + if(isnull(mmi)) + return + + var/obj/item/mmi/removing = mmi + mmi.forceMove(at_location) // Nulls it out via exited + + if(isnull(mind)) // no one to transfer, just leave the MMI. + return mmi + + if(removing.brainmob) + if(removing.brainmob.stat == DEAD) + removing.brainmob.set_stat(CONSCIOUS) + mind.transfer_to(removing.brainmob) + removing.update_appearance() + + else + to_chat(src, span_boldannounce("Oops! Something went very wrong, your MMI was unable to receive your mind. \ + You have been ghosted. Please make a bug report so we can fix this bug.")) + ghostize() + stack_trace("Borg MMI lacked a brainmob") + + return mmi + /mob/living/silicon/robot/proc/notify_ai(notifytype, oldname, newname) if(!connected_ai) return @@ -659,9 +662,6 @@ lighting_color_cutoffs = blend_cutoff_colors(lighting_color_cutoffs, list(25, 8, 5)) set_invis_see(min(see_invisible, SEE_INVISIBLE_LIVING)) - if(see_override) - set_invis_see(see_override) - if(SSmapping.level_trait(z, ZTRAIT_NOXRAY)) new_sight = null @@ -676,16 +676,13 @@ death() toggle_headlamp(1) return - if(HAS_TRAIT(src, TRAIT_KNOCKEDOUT) || IsStun() || IsKnockdown() || IsParalyzed()) - set_stat(UNCONSCIOUS) - else - set_stat(CONSCIOUS) diag_hud_set_status() diag_hud_set_health() diag_hud_set_aishell() update_health_hud() update_icons() //Updates eye_light overlay + /mob/living/silicon/robot/revive(full_heal_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE) . = ..() if(!.) @@ -695,8 +692,10 @@ builtInCamera.toggle_cam(src, 0) if(full_heal_flags & HEAL_ADMIN) locked = TRUE + src.set_stat(CONSCIOUS) notify_ai(AI_NOTIFICATION_NEW_BORG) toggle_headlamp(FALSE, TRUE) //This will reenable borg headlamps if doomsday is currently going on still. + update_stat() return TRUE /mob/living/silicon/robot/fully_replace_character_name(oldname, newname) @@ -706,7 +705,7 @@ notify_ai(AI_NOTIFICATION_CYBORG_RENAMED, oldname, newname) if(!QDELETED(builtInCamera)) builtInCamera.c_tag = real_name - modularInterface.saved_identification = real_name + modularInterface.imprint_id(name = real_name) custom_name = newname @@ -738,9 +737,6 @@ return TRUE -/mob/living/silicon/robot/model/syndicate/ResetModel() - return - /mob/living/silicon/robot/proc/has_model() if(!model || model.type == /obj/item/robot_model) . = FALSE @@ -773,11 +769,17 @@ *Drones and pAIs might do this, after all. */ /mob/living/silicon/robot/Exited(atom/movable/gone, direction) - if(hat && hat == gone) + . = ..() + if(hat == gone) hat = null if(!QDELETED(src)) //Don't update icons if we are deleted. update_icons() - return ..() + + if(gone == cell) + cell = null + + if(gone == mmi) + mmi = null ///Use this to add upgrades to robots. It'll register signals for when the upgrade is moved or deleted, if not single use. /mob/living/silicon/robot/proc/add_to_upgrades(obj/item/borg/upgrade/new_upgrade, mob/user) @@ -1024,3 +1026,13 @@ /// Draw power from the robot /mob/living/silicon/robot/proc/draw_power(power_to_draw) cell?.use(power_to_draw) + + +/mob/living/silicon/robot/set_stat(new_stat) + . = ..() + update_stat() // This is probably not needed, but hopefully should be a little sanity check for the spaghetti that borgs are built from + +/mob/living/silicon/robot/on_knockedout_trait_loss(datum/source) + . = ..() + set_stat(CONSCIOUS) //This is a horrible hack, but silicon code forced my hand + update_stat() diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 499ad7530e894..09440ec22a3f0 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -234,7 +234,6 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real cell.add_fingerprint(user) user.put_in_active_hand(cell) to_chat(user, span_notice("You remove \the [cell].")) - cell = null update_icons() diag_hud_set_borgcell() @@ -306,9 +305,9 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real spark_system.start() return to_chat(user, span_notice("You start to unfasten [src]'s securing bolts...")) - if(tool.use_tool(src, user, 50, volume=50) && !cell) + if(tool.use_tool(src, user, 5 SECONDS, volume = 50) && !cell) user.visible_message(span_notice("[user] deconstructs [src]!"), span_notice("You unfasten the securing bolts, and [src] falls to pieces!")) - deconstruct() + cyborg_deconstruct() return /mob/living/silicon/robot/fire_act() @@ -321,29 +320,39 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real return switch(severity) if(1) - Stun(160) + emp_knockout(16 SECONDS) if(2) - Stun(60) + emp_knockout(6 SECONDS) -/mob/living/silicon/robot/emag_act(mob/user) +/mob/living/silicon/robot/proc/emp_knockout(deciseconds) + set_stat(UNCONSCIOUS) + addtimer(CALLBACK(src, PROC_REF(wake_from_emp)), deciseconds, TIMER_UNIQUE | TIMER_OVERRIDE | TIMER_DELETE_ME) + +/mob/living/silicon/robot/proc/wake_from_emp() + set_stat(CONSCIOUS) + update_stat() + +/mob/living/silicon/robot/emag_act(mob/user, obj/item/card/emag/emag_card) if(user == src)//To prevent syndieborgs from emagging themselves - return + return FALSE if(!opened)//Cover is closed if(locked) - to_chat(user, span_notice("You emag the cover lock.")) + balloon_alert(user, "cover lock destroyed") locked = FALSE if(shell) //A warning to Traitors who may not know that emagging AI shells does not slave them. + balloon_alert(user, "shells cannot be subverted!") to_chat(user, span_boldwarning("[src] seems to be controlled remotely! Emagging the interface may not work as expected.")) + return TRUE else - to_chat(user, span_warning("The cover is already unlocked!")) - return + balloon_alert(user, "cover already unlocked!") + return FALSE if(world.time < emag_cooldown) - return + return FALSE if(wiresexposed) - to_chat(user, span_warning("You must unexpose the wires first!")) - return + balloon_alert(user, "expose the fires first!") + return FALSE - to_chat(user, span_notice("You emag [src]'s interface.")) + balloon_alert(user, "interface hacked") emag_cooldown = world.time + 100 if(connected_ai && connected_ai.mind && connected_ai.mind.has_antag_datum(/datum/antagonist/malf_ai)) @@ -351,13 +360,13 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real logevent("ALERT: Foreign software execution prevented.") to_chat(connected_ai, span_danger("ALERT: Cyborg unit \[[src]\] successfully defended against subversion.")) log_silicon("EMAG: [key_name(user)] attempted to emag cyborg [key_name(src)], but they were slaved to traitor AI [connected_ai].") - return + return TRUE // emag succeeded, it was just counteracted if(shell) //AI shells cannot be emagged, so we try to make it look like a standard reset. Smart players may see through this, however. to_chat(user, span_danger("[src] is remotely controlled! Your emag attempt has triggered a system reset instead!")) log_silicon("EMAG: [key_name(user)] attempted to emag an AI shell belonging to [key_name(src) ? key_name(src) : connected_ai]. The shell has been reset as a result.") ResetModel() - return + return TRUE SetEmagged(1) SetStun(60) //Borgs were getting into trouble because they would attack the emagger before the new laws were shown @@ -370,6 +379,12 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real GLOB.lawchanges.Add("[time] : [user.name]([user.key]) emagged [name]([key])") else GLOB.lawchanges.Add("[time] : [name]([key]) emagged by external event.") + + INVOKE_ASYNC(src, PROC_REF(borg_emag_end), user) + return TRUE + +/// A async proc called from [emag_act] that gives the borg a lot of flavortext, and applies the syndicate lawset after a delay. +/mob/living/silicon/robot/proc/borg_emag_end(mob/user) to_chat(src, span_danger("ALERT: Foreign software detected.")) logevent("ALERT: Foreign software detected.") sleep(0.5 SECONDS) @@ -394,20 +409,19 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real laws.associate(src) update_icons() - /mob/living/silicon/robot/blob_act(obj/structure/blob/B) if(stat != DEAD) adjustBruteLoss(30) else investigate_log("has been gibbed a blob.", INVESTIGATE_DEATHS) - gib() + gib(DROP_ALL_REMAINS) return TRUE /mob/living/silicon/robot/ex_act(severity, target) switch(severity) if(EXPLODE_DEVASTATE) investigate_log("has been gibbed by an explosion.", INVESTIGATE_DEATHS) - gib() + gib(DROP_ALL_REMAINS) return if(EXPLODE_HEAVY) if (stat != DEAD) @@ -424,3 +438,9 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real updatehealth() if(prob(75) && Proj.damage > 0) spark_system.start() + +/mob/living/silicon/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) + . = ..() + if (. || AM.throwforce < CYBORG_THROW_SLOWDOWN_THRESHOLD) + return + apply_status_effect(/datum/status_effect/borg_throw_slow) diff --git a/code/modules/mob/living/silicon/robot/robot_defines.dm b/code/modules/mob/living/silicon/robot/robot_defines.dm index 10b923d762bba..d414a55000e41 100644 --- a/code/modules/mob/living/silicon/robot/robot_defines.dm +++ b/code/modules/mob/living/silicon/robot/robot_defines.dm @@ -100,6 +100,8 @@ var/lockcharge = FALSE ///Boolean of whether the borg was locked by its AI or nothing var/ai_lockdown = FALSE + ///Timer that allows the borg to self-unlock after a set amount of time + var/lockdown_timer = null ///Random serial number generated for each cyborg upon its initialization var/ident = 0 var/locked = TRUE @@ -202,10 +204,25 @@ cell = /obj/item/stock_parts/cell/hyper radio = /obj/item/radio/borg/syndicate +/mob/living/silicon/robot/model/syndicate/Initialize(mapload) + laws = new /datum/ai_laws/syndicate_override() + laws.associate(src) + . = ..() + addtimer(CALLBACK(src, PROC_REF(show_playstyle)), 0.5 SECONDS) + +/mob/living/silicon/robot/model/syndicate/create_modularInterface() + if(!modularInterface) + modularInterface = new /obj/item/modular_computer/pda/silicon/cyborg/syndicate(src) + modularInterface.imprint_id(job_name = "Cyborg") + return ..() + /mob/living/silicon/robot/model/syndicate/proc/show_playstyle() if(playstyle_string) to_chat(src, playstyle_string) +/mob/living/silicon/robot/model/syndicate/ResetModel() + return + /mob/living/silicon/robot/model/syndicate/medical icon_state = "synd_medical" playstyle_string = "You are a Syndicate medical cyborg!
    \ diff --git a/code/modules/mob/living/silicon/robot/robot_model.dm b/code/modules/mob/living/silicon/robot/robot_model.dm index d1c2a1da80f8c..5c0f29e8871ef 100644 --- a/code/modules/mob/living/silicon/robot/robot_model.dm +++ b/code/modules/mob/living/silicon/robot/robot_model.dm @@ -8,7 +8,7 @@ **/ /obj/item/robot_model name = "Default" - icon = 'icons/obj/module.dmi' + icon = 'icons/obj/assemblies/module.dmi' icon_state = "std_mod" w_class = WEIGHT_CLASS_GIGANTIC inhand_icon_state = "electronic" @@ -188,9 +188,8 @@ if(!to_stock) //Nothing for us in the silo continue - storage_datum.energy += mat_container.use_amount_mat(to_stock, storage_datum.mat_type) + storage_datum.energy += charger.materials.use_materials(list(GET_MATERIAL_REF(storage_datum.mat_type) = to_stock), action = "resupplied", name = "units") charger.balloon_alert(robot, "+ [to_stock]u [initial(storage_datum.mat_type.name)]") - charger.materials.silo_log(charger, "resupplied", -1, "units", list(GET_MATERIAL_REF(storage_datum.mat_type) = to_stock)) playsound(charger, 'sound/weapons/gun/general/mag_bullet_insert.ogg', 50, vary = FALSE) return charger.balloon_alert(robot, "restock process complete") @@ -232,6 +231,9 @@ return new_model /obj/item/robot_model/proc/be_transformed_to(obj/item/robot_model/old_model, forced = FALSE) + if(HAS_TRAIT(robot, TRAIT_NO_TRANSFORM)) + robot.balloon_alert(robot, "can't transform right now!") + return FALSE if(islist(borg_skins) && !forced) var/mob/living/silicon/robot/cyborg = loc var/list/reskin_icons = list() @@ -265,7 +267,7 @@ var/mob/living/silicon/robot/cyborg = loc if(cyborg.hat) cyborg.hat.forceMove(drop_location()) - cyborg.hat = null + cyborg.cut_overlays() cyborg.setDir(SOUTH) do_transform_delay() @@ -274,8 +276,9 @@ var/mob/living/silicon/robot/cyborg = loc sleep(0.1 SECONDS) flick("[cyborg_base_icon]_transform", cyborg) - cyborg.notransform = TRUE + ADD_TRAIT(cyborg, TRAIT_NO_TRANSFORM, REF(src)) if(locked_transform) + cyborg.ai_lockdown = TRUE cyborg.SetLockdown(TRUE) cyborg.set_anchored(TRUE) cyborg.logevent("Chassis model has been set to [name].") @@ -284,9 +287,10 @@ playsound(cyborg, pick('sound/items/drill_use.ogg', 'sound/items/jaws_cut.ogg', 'sound/items/jaws_pry.ogg', 'sound/items/welder.ogg', 'sound/items/ratchet.ogg'), 80, TRUE, -1) sleep(0.7 SECONDS) cyborg.SetLockdown(FALSE) + cyborg.ai_lockdown = FALSE cyborg.setDir(SOUTH) cyborg.set_anchored(FALSE) - cyborg.notransform = FALSE + REMOVE_TRAIT(cyborg, TRAIT_NO_TRANSFORM, REF(src)) cyborg.updatehealth() cyborg.update_icons() cyborg.notify_ai(AI_NOTIFICATION_NEW_MODEL) @@ -661,7 +665,7 @@ /obj/item/bonesetter, /obj/item/blood_filter, /obj/item/extinguisher/mini, - /obj/item/roller/robo, + /obj/item/emergency_bed/silicon, /obj/item/borg/cyborghug/medical, /obj/item/stack/medical/gauze, /obj/item/stack/medical/bone_gel, @@ -868,11 +872,14 @@ /obj/item/surgicaldrill, /obj/item/scalpel, /obj/item/melee/energy/sword/cyborg/saw, - /obj/item/roller/robo, + /obj/item/bonesetter, + /obj/item/blood_filter, + /obj/item/emergency_bed/silicon, /obj/item/crowbar/cyborg, /obj/item/extinguisher/mini, /obj/item/pinpointer/syndicate_cyborg, /obj/item/stack/medical/gauze, + /obj/item/stack/medical/bone_gel, /obj/item/gun/medbeam, /obj/item/borg/apparatus/organ_storage, ) @@ -941,7 +948,7 @@ robot.equip_module_to_slot(locate(/obj/item/claymore/highlander/robot) in basic_modules, 1) robot.equip_module_to_slot(locate(/obj/item/pinpointer/nuke) in basic_modules, 2) robot.place_on_head(new /obj/item/clothing/head/beret/highlander(robot)) //THE ONLY PART MORE IMPORTANT THAN THE SWORD IS THE HAT - ADD_TRAIT(robot.hat, TRAIT_NODROP, HIGHLANDER) + ADD_TRAIT(robot.hat, TRAIT_NODROP, HIGHLANDER_TRAIT) // ------------------------------------------ Storages diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 9da64ed654200..fbe9986c3ca3c 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -13,7 +13,7 @@ flags_1 = PREVENT_CONTENTS_EXPLOSION_1 examine_cursor_icon = null fire_stack_decay_rate = -0.55 - voice_filter = "afftfilt=real='hypot(re,im)*sin(0)':imag='hypot(re,im)*cos(0)':win_size=512:overlap=1,rubberband=pitch=0.8" + tts_silicon_voice_effect = TRUE var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS var/last_lawchange_announce = 0 var/list/alarms_to_show = list() @@ -25,8 +25,8 @@ var/obj/item/radio/borg/radio = null ///If this is a path, this gets created as an object in Initialize. - var/list/alarm_types_show = list(ALARM_ATMOS = 0, ALARM_ALARM_POWER = 0, ALARM_CAMERA = 0, ALARM_MOTION = 0) - var/list/alarm_types_clear = list(ALARM_ATMOS = 0, ALARM_ALARM_POWER = 0, ALARM_CAMERA = 0, ALARM_MOTION = 0) + var/list/alarm_types_show = list(ALARM_ATMOS = 0, ALARM_POWER = 0, ALARM_CAMERA = 0, ALARM_MOTION = 0) + var/list/alarm_types_clear = list(ALARM_ATMOS = 0, ALARM_POWER = 0, ALARM_CAMERA = 0, ALARM_MOTION = 0) //These lists will contain each law that should be announced / set to yes in the state laws menu. ///List keeping track of which laws to announce @@ -49,6 +49,7 @@ var/emagged = FALSE var/hack_software = FALSE //Will be able to use hacking actions interaction_range = 7 //wireless control range + var/control_disabled = FALSE // Set to 1 to stop AI from interacting via Click() var/obj/item/modular_computer/pda/silicon/modularInterface @@ -91,28 +92,22 @@ /mob/living/silicon/proc/create_modularInterface() if(!modularInterface) modularInterface = new /obj/item/modular_computer/pda/silicon(src) + var/job_name = "" if(isAI(src)) - modularInterface.saved_job = "AI" + job_name = "AI" if(ispAI(src)) - modularInterface.saved_job = "pAI Messenger" + job_name = "pAI Messenger" modularInterface.layer = ABOVE_HUD_PLANE SET_PLANE_EXPLICIT(modularInterface, ABOVE_HUD_PLANE, src) - modularInterface.saved_identification = real_name || name + modularInterface.imprint_id(real_name || name, job_name) /mob/living/silicon/robot/create_modularInterface() if(!modularInterface) modularInterface = new /obj/item/modular_computer/pda/silicon/cyborg(src) - modularInterface.saved_job = "Cyborg" + modularInterface.imprint_id(job_name = "Cyborg") return ..() -/mob/living/silicon/robot/model/syndicate/create_modularInterface() - if(!modularInterface) - modularInterface = new /obj/item/modular_computer/pda/silicon/cyborg/syndicate(src) - modularInterface.saved_job = "Cyborg" - return ..() - - /mob/living/silicon/med_hud_set_health() return //we use a different hud @@ -176,7 +171,7 @@ /mob/living/silicon/try_inject(mob/user, target_zone, injection_flags) . = ..() if(!. && (injection_flags & INJECT_TRY_SHOW_ERROR_MESSAGE)) - to_chat(user, span_alert("[p_their(TRUE)] outer shell is too tough.")) + to_chat(user, span_alert("[p_Their()] outer shell is too tough.")) /proc/islinked(mob/living/silicon/robot/bot, mob/living/silicon/ai/ai) if(!istype(bot) || !istype(ai)) @@ -474,4 +469,4 @@ if(!modularInterface) stack_trace("Silicon [src] ( [type] ) was somehow missing their integrated tablet. Please make a bug report.") create_modularInterface() - modularInterface.saved_identification = newname + modularInterface.imprint_id(name = newname) diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index 0106202e32df1..847e686752150 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -100,7 +100,7 @@ /mob/living/silicon/emp_act(severity) . = ..() to_chat(src, span_danger("Warning: Electromagnetic pulse detected.")) - if(. & EMP_PROTECT_SELF) + if(. & EMP_PROTECT_SELF || QDELETED(src)) return switch(severity) if(1) diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm index 2ee3598c79c99..df97740e69cfc 100644 --- a/code/modules/mob/living/simple_animal/animal_defense.dm +++ b/code/modules/mob/living/simple_animal/animal_defense.dm @@ -75,7 +75,7 @@ to_chat(user, span_danger("You [response_disarm_simple] [name]!")) log_combat(user, src, "disarmed") else - var/damage = rand(15, 30) + var/damage = rand(user.melee_damage_lower, user.melee_damage_upper) visible_message(span_danger("[user] slashes at [src]!"), \ span_userdanger("You're slashed at by [user]!"), null, COMBAT_MESSAGE_RANGE, user) to_chat(user, span_danger("You slash at [src]!")) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index d77f7fa0ea176..7bd48ab62fbb8 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -6,7 +6,6 @@ mob_biotypes = MOB_ROBOTIC stop_automated_movement = TRUE wander = FALSE - 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) @@ -27,6 +26,7 @@ light_system = MOVABLE_LIGHT light_range = 3 light_power = 0.9 + del_on_death = TRUE ///Will other (noncommissioned) bots salute this bot? var/commissioned = FALSE @@ -47,13 +47,11 @@ ///All initial access this bot started with. var/list/prev_access = list() - ///Bot-related mode flags on the Bot indicating how they will act. - var/bot_mode_flags = BOT_MODE_ON | BOT_MODE_REMOTE_ENABLED | BOT_MODE_PAI_CONTROLLABLE -// Selections: BOT_MODE_ON | BOT_MODE_AUTOPATROL | BOT_MODE_REMOTE_ENABLED | BOT_MODE_PAI_CONTROLLABLE + ///Bot-related mode flags on the Bot indicating how they will act. BOT_MODE_ON | BOT_MODE_AUTOPATROL | BOT_MODE_REMOTE_ENABLED | BOT_MODE_CAN_BE_SAPIENT | BOT_MODE_ROUNDSTART_POSSESSION + var/bot_mode_flags = BOT_MODE_ON | BOT_MODE_REMOTE_ENABLED | BOT_MODE_CAN_BE_SAPIENT | BOT_MODE_ROUNDSTART_POSSESSION - ///Bot-related cover flags on the Bot to deal with what has been done to their cover, including emagging. + ///Bot-related cover flags on the Bot to deal with what has been done to their cover, including emagging. BOT_COVER_OPEN | BOT_COVER_LOCKED | BOT_COVER_EMAGGED | BOT_COVER_HACKED var/bot_cover_flags = BOT_COVER_LOCKED -// Selections: BOT_COVER_OPEN | BOT_COVER_LOCKED | BOT_COVER_EMAGGED | BOT_COVER_HACKED ///Small name of what the bot gets messed with when getting hacked/emagged. var/hackables = "system circuits" @@ -106,16 +104,23 @@ var/reset_access_timer_id var/ignorelistcleanuptimer = 1 // This ticks up every automated action, at 300 we clean the ignore list + /// If true we will allow ghosts to control this mob + var/can_be_possessed = FALSE + /// If true we will offer this + COOLDOWN_DECLARE(offer_ghosts_cooldown) + /// Message to display upon possession + var/possessed_message = "You're a generic bot. How did one of these even get made?" + /// List of strings to sound effects corresponding to automated messages the bot can play + var/list/automated_announcements + /// Action we use to say voice lines out loud, also we just pass anything we try to say through here just in case it plays a voice line + var/datum/action/cooldown/bot_announcement/pa_system + /mob/living/simple_animal/bot/proc/get_mode() if(client) //Player bots do not have modes, thus the override. Also an easy way for PDA users/AI to know when a bot is a player. - if(paicard) - return "pAI Controlled" - else - return "Autonomous" - else if(!(bot_mode_flags & BOT_MODE_ON)) + return paicard ? "pAI Controlled" : "Autonomous" + if(!(bot_mode_flags & BOT_MODE_ON)) return "Inactive" - else - return "[mode]" + return "[mode]" /** * Returns a status string about the bot's current status, if it's moving, manually controlled, or idle. @@ -123,10 +128,15 @@ /mob/living/simple_animal/bot/proc/get_mode_ui() if(client) //Player bots do not have modes, thus the override. Also an easy way for PDA users/AI to know when a bot is a player. return paicard ? "pAI Controlled" : "Autonomous" - else if(!(bot_mode_flags & BOT_MODE_ON)) + if(!(bot_mode_flags & BOT_MODE_ON)) return "Inactive" - else - return "[mode]" + return "[mode]" + +/** + * Returns a string of flavor text for emagged bots as defined by policy. + */ +/mob/living/simple_animal/bot/proc/get_emagged_message() + return get_policy(ROLE_EMAGGED_BOT) || "You are a malfunctioning bot! Disrupt everyone and cause chaos!" /mob/living/simple_animal/bot/proc/turn_on() if(stat) @@ -190,17 +200,91 @@ if(HAS_TRAIT(SSstation, STATION_TRAIT_BOTS_GLITCHED)) randomize_language_if_on_station() + if(mapload && is_station_level(z) && bot_mode_flags & BOT_MODE_CAN_BE_SAPIENT && bot_mode_flags & BOT_MODE_ROUNDSTART_POSSESSION) + enable_possession(mapload = mapload) + + pa_system = new(src, automated_announcements = automated_announcements) + pa_system.Grant(src) + /mob/living/simple_animal/bot/Destroy() - if(path_hud) - QDEL_NULL(path_hud) - path_hud = null GLOB.bots_list -= src - if(paicard) - ejectpai() + QDEL_NULL(paicard) + QDEL_NULL(pa_system) QDEL_NULL(internal_radio) QDEL_NULL(access_card) + QDEL_NULL(path_hud) return ..() +/// Allows this bot to be controlled by a ghost, who will become its mind +/mob/living/simple_animal/bot/proc/enable_possession(user, mapload = FALSE) + if (paicard) + balloon_alert(user, "already sapient!") + return + can_be_possessed = TRUE + var/can_announce = !mapload && COOLDOWN_FINISHED(src, offer_ghosts_cooldown) + AddComponent( + /datum/component/ghost_direct_control, \ + ban_type = ROLE_BOT, \ + poll_candidates = can_announce, \ + poll_ignore_key = POLL_IGNORE_BOTS, \ + assumed_control_message = (bot_cover_flags & BOT_COVER_EMAGGED) ? get_emagged_message() : possessed_message, \ + extra_control_checks = CALLBACK(src, PROC_REF(check_possession)), \ + after_assumed_control = CALLBACK(src, PROC_REF(post_possession)), \ + ) + if (can_announce) + COOLDOWN_START(src, offer_ghosts_cooldown, 30 SECONDS) + +/// Disables this bot from being possessed by ghosts +/mob/living/simple_animal/bot/proc/disable_possession(mob/user) + can_be_possessed = FALSE + qdel(GetComponent(/datum/component/ghost_direct_control)) + if (isnull(key)) + return + if (user) + log_combat(user, src, "ejected from [initial(src.name)] control.") + to_chat(src, span_warning("You feel yourself fade as your personality matrix is reset!")) + ghostize(can_reenter_corpse = FALSE) + playsound(src, 'sound/machines/ping.ogg', 30, TRUE) + speak("Personality matrix reset!") + key = null + +/// Returns true if this mob can be controlled +/mob/living/simple_animal/bot/proc/check_possession(mob/potential_possessor) + if (!can_be_possessed) + to_chat(potential_possessor, span_warning("The bot's personality download has been disabled!")) + return can_be_possessed + +/// Fired after something takes control of this mob +/mob/living/simple_animal/bot/proc/post_possession() + playsound(src, 'sound/machines/ping.ogg', 30, TRUE) + speak("New personality installed successfully!") + rename(src) + +/// Allows renaming the bot to something else +/mob/living/simple_animal/bot/proc/rename(mob/user) + var/new_name = sanitize_name( + reject_bad_text(tgui_input_text( + user = user, + message = "This machine is designated [real_name]. Would you like to update its registration?", + title = "Name change", + default = real_name, + max_length = MAX_NAME_LEN, + )), + allow_numbers = TRUE + ) + if (isnull(new_name) || QDELETED(src)) + return + if (key && user != src) + var/accepted = tgui_alert( + src, + message = "Do you wish to be renamed to [new_name]?", + title = "Name change", + buttons = list("Yes", "No"), + ) + if (accepted != "Yes" || QDELETED(src)) + return + fully_replace_character_name(real_name, new_name) + /mob/living/simple_animal/bot/proc/check_access(mob/living/user, obj/item/card/id) if(user.has_unlimited_silicon_privilege || isAdminGhostAI(user)) // Silicon and Admins always have access. return TRUE @@ -225,6 +309,8 @@ return TRUE /mob/living/simple_animal/bot/death(gibbed) + if(paicard) + ejectpai() explode() return ..() @@ -234,14 +320,13 @@ var/atom/location_destroyed = drop_location() if(prob(50)) drop_part(robot_arm, location_destroyed) - qdel(src) /mob/living/simple_animal/bot/emag_act(mob/user, obj/item/card/emag/emag_card) . = ..() if(bot_cover_flags & BOT_COVER_LOCKED) //First emag application unlocks the bot's interface. Apply a screwdriver to use the emag again. bot_cover_flags &= ~BOT_COVER_LOCKED - to_chat(user, span_notice("You bypass [src]'s [hackables].")) - return + balloon_alert(user, "cover unlocked") + return TRUE if(!(bot_cover_flags & BOT_COVER_LOCKED) && bot_cover_flags & BOT_COVER_OPEN) //Bot panel is unlocked by ID or emag, and the panel is screwed open. Ready for emagging. bot_cover_flags |= BOT_COVER_EMAGGED bot_cover_flags &= ~BOT_COVER_LOCKED //Manually emagging the bot locks out the panel. @@ -249,11 +334,13 @@ bot_reset() turn_on() //The bot automatically turns on when emagged, unless recently hit with EMP. to_chat(src, span_userdanger("(#$*#$^^( OVERRIDE DETECTED")) + to_chat(src, span_boldnotice(get_emagged_message())) if(user) log_combat(user, src, "emagged") - return + return TRUE 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!")) + balloon_alert(user, "open maintenance panel first!") + return FALSE /mob/living/simple_animal/bot/examine(mob/user) . = ..() @@ -393,21 +480,27 @@ /mob/living/simple_animal/bot/attackby(obj/item/attacking_item, mob/living/user, params) if(attacking_item.GetID()) unlock_with_id(user) - else if(istype(attacking_item, /obj/item/pai_card)) + return + if(istype(attacking_item, /obj/item/pai_card)) insertpai(user, attacking_item) - else if(attacking_item.tool_behaviour == TOOL_HEMOSTAT && paicard) + return + if(attacking_item.tool_behaviour == TOOL_HEMOSTAT && paicard) if(bot_cover_flags & BOT_COVER_OPEN) - to_chat(user, span_warning("Close the access panel before manipulating the personality slot!")) + balloon_alert(user, "open the access panel!") else - to_chat(user, span_notice("You attempt to pull [paicard] free...")) - if(do_after(user, 30, target = src)) - if (paicard) - user.visible_message(span_notice("[user] uses [attacking_item] to pull [paicard] out of [initial(src.name)]!"),span_notice("You pull [paicard] out of [initial(src.name)] with [attacking_item].")) - ejectpai(user) - else - if(attacking_item.force) //if force is non-zero - do_sparks(5, TRUE, src) - ..() + balloon_alert(user, "removing pAI...") + if(!do_after(user, 3 SECONDS, target = src) || !paicard) + return + user.visible_message(span_notice("[user] uses [attacking_item] to pull [paicard] out of [initial(src.name)]!"),span_notice("You pull [paicard] out of [initial(src.name)] with [attacking_item].")) + ejectpai(user) + return + return ..() + +/mob/living/simple_animal/bot/attacked_by(obj/item/I, mob/living/user) + . = ..() + if (!.) + return + do_sparks(5, TRUE, src) /mob/living/simple_animal/bot/bullet_act(obj/projectile/Proj, def_zone, piercing_hit = FALSE) if(Proj && (Proj.damage_type == BRUTE || Proj.damage_type == BURN)) @@ -425,28 +518,34 @@ if(paicard) paicard.emp_act(severity) src.visible_message(span_notice("[paicard] is flies out of [initial(src.name)]!"), span_warning("You are forcefully ejected from [initial(src.name)]!")) - ejectpai(0) + ejectpai() - if(prob(70/severity)) - var/datum/language_holder/bot_languages = get_language_holder() - bot_languages.selected_language = bot_languages.get_random_spoken_language() + if (QDELETED(src)) + return if(bot_mode_flags & BOT_MODE_ON) turn_off() addtimer(CALLBACK(src, PROC_REF(emp_reset), was_on), severity * 30 SECONDS) + if(!prob(70/severity)) + return + if (!length(GLOB.uncommon_roundstart_languages)) + return + remove_all_languages(source = LANGUAGE_EMP) + grant_random_uncommon_language(source = LANGUAGE_EMP) /mob/living/simple_animal/bot/proc/emp_reset(was_on) stat &= ~EMPED if(was_on) turn_on() -/mob/living/simple_animal/bot/proc/speak(message,channel) //Pass a message to have the bot say() it. Pass a frequency to say it on the radio. - if((!(bot_mode_flags & BOT_MODE_ON)) || (!message)) +/** + * Pass a message to have the bot say() it, passing through our announcement action to potentially also play a sound. + * Optionally pass a frequency to say it on the radio. + */ +/mob/living/simple_animal/bot/proc/speak(message, channel) + if(!message) return - if(channel && internal_radio.channels[channel])// Use radio if we have channel key - internal_radio.talk_into(src, message, channel) - else - say(message) + pa_system.announce(message, channel) /mob/living/simple_animal/bot/radio(message, list/message_mods = list(), list/spans, language) . = ..() @@ -795,7 +894,6 @@ Pass a positive integer as an argument to override a bot's default speed. access_card.set_access(user_access + prev_access) //Adds the user's access, if any. mode = BOT_SUMMON speak("Responding.", radio_channel) - if("ejectpai") ejectpairemote(user) return @@ -879,11 +977,11 @@ Pass a positive integer as an argument to override a bot's default speed. data["emagged"] = bot_cover_flags & BOT_COVER_EMAGGED data["has_access"] = check_access(user) data["locked"] = bot_cover_flags & BOT_COVER_LOCKED - data["pai"] = list() data["settings"] = list() if(!(bot_cover_flags & BOT_COVER_LOCKED) || issilicon(user) || isAdminGhostAI(user)) - data["pai"]["allow_pai"] = bot_mode_flags & BOT_MODE_PAI_CONTROLLABLE - data["pai"]["card_inserted"] = paicard + data["settings"]["pai_inserted"] = !!paicard + data["settings"]["allow_possession"] = bot_mode_flags & BOT_MODE_CAN_BE_SAPIENT + data["settings"]["possession_enabled"] = can_be_possessed data["settings"]["airplane_mode"] = !(bot_mode_flags & BOT_MODE_REMOTE_ENABLED) data["settings"]["maintenance_lock"] = !(bot_cover_flags & BOT_COVER_OPEN) data["settings"]["power"] = bot_mode_flags & BOT_MODE_ON @@ -924,23 +1022,37 @@ Pass a positive integer as an argument to override a bot's default speed. message_admins("Safety lock of [ADMIN_LOOKUPFLW(src)] was disabled by [ADMIN_LOOKUPFLW(usr)] in [ADMIN_VERBOSEJMP(src)]") usr.log_message("disabled safety lock of [src]", LOG_GAME) bot_reset() - else if(!(bot_cover_flags & BOT_COVER_HACKED)) + to_chat(src, span_userdanger("(#$*#$^^( OVERRIDE DETECTED")) + to_chat(src, span_boldnotice(get_emagged_message())) + return + if(!(bot_cover_flags & BOT_COVER_HACKED)) to_chat(usr, span_boldannounce("You fail to repair [src]'s [hackables].")) - else - bot_cover_flags &= ~(BOT_COVER_EMAGGED|BOT_COVER_HACKED) - to_chat(usr, span_notice("You reset the [src]'s [hackables].")) - usr.log_message("re-enabled safety lock of [src]", LOG_GAME) - bot_reset() + return + bot_cover_flags &= ~(BOT_COVER_EMAGGED|BOT_COVER_HACKED) + to_chat(usr, span_notice("You reset the [src]'s [hackables].")) + usr.log_message("re-enabled safety lock of [src]", LOG_GAME) + bot_reset() + to_chat(src, span_userdanger("Software restored to standard.")) + to_chat(src, span_boldnotice(possessed_message)) if("eject_pai") - if(paicard) - to_chat(usr, span_notice("You eject [paicard] from [initial(src.name)].")) - ejectpai(usr) + if(!paicard) + return + to_chat(usr, span_notice("You eject [paicard] from [initial(src.name)].")) + ejectpai(usr) + if("toggle_personality") + if (can_be_possessed) + disable_possession(usr) + else + enable_possession(usr) + if("rename") + rename(usr) /mob/living/simple_animal/bot/update_icon_state() icon_state = "[isnull(base_icon_state) ? initial(icon_state) : base_icon_state][get_bot_flag(bot_mode_flags, BOT_MODE_ON)]" 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. +/// Access check proc for bot topics! Remember to place in a bot's individual Topic if desired. +/mob/living/simple_animal/bot/proc/topic_denied(mob/user) if(!user.can_perform_action(src, ALLOW_SILICON_REACH)) return TRUE // 0 for access, 1 for denied. @@ -951,22 +1063,31 @@ Pass a positive integer as an argument to override a bot's default speed. return TRUE return FALSE +/// Places a pAI in control of this mob /mob/living/simple_animal/bot/proc/insertpai(mob/user, obj/item/pai_card/card) if(paicard) - to_chat(user, span_warning("A [paicard] is already inserted!")) + balloon_alert(user, "slot occupied!") + return + if(key) + balloon_alert(user, "personality already present!") return if(bot_cover_flags & BOT_COVER_LOCKED || !(bot_cover_flags & BOT_COVER_OPEN)) - to_chat(user, span_warning("The personality slot is locked.")) + balloon_alert(user, "slot inaccessible!") return - if(!(bot_mode_flags & BOT_MODE_PAI_CONTROLLABLE) || key) //Not pAI controllable or is already player controlled. - to_chat(user, span_warning("[src] is not compatible with [card]!")) + if(!(bot_mode_flags & BOT_MODE_CAN_BE_SAPIENT)) + balloon_alert(user, "incompatible firmware!") return if(!card.pai || !card.pai.mind) - to_chat(user, span_warning("[card] is inactive.")) + balloon_alert(user, "pAI is inactive!") return if(!user.transferItemToLoc(card, src)) return paicard = card + disable_possession() + if(paicard.pai.holoform) + paicard.pai.fold_in() + copy_languages(paicard.pai, source_override = LANGUAGE_PAI) + set_active_language(paicard.pai.get_selected_language()) user.visible_message(span_notice("[user] inserts [card] into [src]!"), span_notice("You insert [card] into [src].")) paicard.pai.mind.transfer_to(src) to_chat(src, span_notice("You sense your form change as you are uploaded into [src].")) @@ -975,30 +1096,42 @@ Pass a positive integer as an argument to override a bot's default speed. log_combat(user, paicard.pai, "uploaded to [initial(src.name)],") return TRUE -/mob/living/simple_animal/bot/proc/ejectpai(mob/user = null, announce = TRUE) - if(paicard) - if(mind && paicard.pai) - mind.transfer_to(paicard.pai) - else if(paicard.pai) - paicard.pai.key = key - else - ghostize(FALSE) // The pAI card that just got ejected was dead. - key = null - paicard.forceMove(loc) - if(user) - log_combat(user, paicard.pai, "ejected from [initial(src.name)],") - else - log_combat(src, paicard.pai, "ejected") - if(announce) - to_chat(paicard.pai, span_notice("You feel your control fade as [paicard] ejects from [initial(src.name)].")) - paicard = null - name = initial(src.name) - faction = initial(faction) +/mob/living/simple_animal/bot/ghost() + if(stat != DEAD) // Only ghost if we're doing this while alive, the pAI probably isn't dead yet. + return ..() + if(paicard && (!client || stat == DEAD)) + ejectpai() +/// Ejects a pAI from this bot +/mob/living/simple_animal/bot/proc/ejectpai(mob/user = null, announce = TRUE) + if(!paicard) + return + if(mind && paicard.pai) + mind.transfer_to(paicard.pai) + else if(paicard.pai) + paicard.pai.key = key + else + ghostize(FALSE) // The pAI card that just got ejected was dead. + key = null + paicard.forceMove(loc) + if(user) + log_combat(user, paicard.pai, "ejected from [initial(src.name)],") + else + log_combat(src, paicard.pai, "ejected") + if(announce) + to_chat(paicard.pai, span_notice("You feel your control fade as [paicard] ejects from [initial(src.name)].")) + paicard = null + name = initial(src.name) + faction = initial(faction) + remove_all_languages(source = LANGUAGE_PAI) + get_selected_language() + +/// Ejects the pAI remotely. /mob/living/simple_animal/bot/proc/ejectpairemote(mob/user) - if(check_access(user) && paicard) - speak("Ejecting personality chip.", radio_channel) - ejectpai(user) + if(!check_access(user) || !paicard) + return + speak("Ejecting personality chip.", radio_channel) + ejectpai(user) /mob/living/simple_animal/bot/Login() . = ..() @@ -1017,15 +1150,8 @@ Pass a positive integer as an argument to override a bot's default speed. . = ..() if(!.) return - update_appearance() -/mob/living/simple_animal/bot/ghost() - if(stat != DEAD) // Only ghost if we're doing this while alive, the pAI probably isn't dead yet. - return ..() - if(paicard && (!client || stat == DEAD)) - ejectpai(0) - /mob/living/simple_animal/bot/sentience_act() faction -= FACTION_SILICON diff --git a/code/modules/mob/living/simple_animal/bot/bot_announcement.dm b/code/modules/mob/living/simple_animal/bot/bot_announcement.dm new file mode 100644 index 0000000000000..32df0729c8cb2 --- /dev/null +++ b/code/modules/mob/living/simple_animal/bot/bot_announcement.dm @@ -0,0 +1,55 @@ +/// Say something and play a corresponding sound effect +/datum/action/cooldown/bot_announcement + name = "Make automated announcement" + desc = "Play a prerecorded message for the benefit of those around you." + background_icon_state = "bg_tech_blue" + overlay_icon_state = "bg_tech_blue_border" + button_icon = 'icons/mob/actions/actions_AI.dmi' + button_icon_state = "intercom" + cooldown_time = 10 SECONDS + melee_cooldown_time = 0 SECONDS + /// List of strings to sound effects corresponding to automated messages we can play + var/list/automated_announcements + +/datum/action/cooldown/bot_announcement/New(Target, original, list/automated_announcements) + src.automated_announcements = automated_announcements + return ..() + +/datum/action/cooldown/bot_announcement/IsAvailable(feedback) + . = ..() + if (!.) + return + if (!isbot(owner)) + if (feedback) + owner.balloon_alert(owner, "no announcement system!") + return FALSE + if (!length(automated_announcements)) + if (feedback) + owner.balloon_alert(owner, "no valid announcements!") + return FALSE + return TRUE + +/datum/action/cooldown/bot_announcement/Activate(trigger_flags, atom/target) + var/picked + if (length(automated_announcements) > 1) + picked = tgui_input_list(owner, message = "Choose announcement to make.", title = "Select announcement", items = automated_announcements) + else + picked = pick(automated_announcements) + if (isnull(picked)) + return + announce(picked) + return ..() + +/// Speak the provided line on the provided radio channel +/datum/action/cooldown/bot_announcement/proc/announce(line, channel) + var/mob/living/simple_animal/bot/bot_owner = owner + if (!(bot_owner.bot_mode_flags & BOT_MODE_ON)) + return + + if (channel && bot_owner.internal_radio.channels[channel]) + bot_owner.internal_radio.talk_into(bot_owner, message = line, channel = channel) + else + bot_owner.say(line) + + if (length(automated_announcements) && !isnull(automated_announcements[line])) + playsound(bot_owner, automated_announcements[line], vol = 50, vary = FALSE) diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index a73369b8457d0..710085884658a 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -19,6 +19,7 @@ hackables = "cleaning software" path_image_color = "#993299" greyscale_config = /datum/greyscale_config/buckets_cleanbot + possessed_message = "You are a cleanbot! Clean the station to the best of your ability!" ///the bucket used to build us. var/obj/item/reagent_containers/cup/bucket/build_bucket @@ -91,7 +92,7 @@ ) /mob/living/simple_animal/bot/cleanbot/autopatrol - bot_mode_flags = BOT_MODE_ON | BOT_MODE_AUTOPATROL | BOT_MODE_REMOTE_ENABLED | BOT_MODE_PAI_CONTROLLABLE + bot_mode_flags = BOT_MODE_ON | BOT_MODE_AUTOPATROL | BOT_MODE_REMOTE_ENABLED | BOT_MODE_CAN_BE_SAPIENT | BOT_MODE_ROUNDSTART_POSSESSION /mob/living/simple_animal/bot/cleanbot/medbay name = "Scrubs, MD" @@ -127,10 +128,12 @@ return ..() /mob/living/simple_animal/bot/cleanbot/Exited(atom/movable/gone, direction) + . = ..() if(gone == build_bucket) build_bucket = null - return ..() - + if(gone == weapon) + weapon = null + update_appearance(UPDATE_ICON) /mob/living/simple_animal/bot/cleanbot/Destroy() QDEL_NULL(build_bucket) @@ -229,9 +232,10 @@ if(weapon) weapon.force = initial(weapon.force) - if(user) - to_chat(user, span_danger("[src] buzzes and beeps.")) + balloon_alert(user, "safeties disabled") + audible_message(span_danger("[src] buzzes oddly!")) get_targets() //recalibrate target list + return TRUE /mob/living/simple_animal/bot/cleanbot/process_scan(atom/scan_target) if(iscarbon(scan_target)) @@ -246,12 +250,6 @@ 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(!.) diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index 5facdc1ac1681..e1ca1c2b4846b 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -12,6 +12,8 @@ bot_type = ADVANCED_SEC_BOT hackables = "combat inhibitors" + automated_announcements = list(ED209_VOICED_DOWN_WEAPONS = 'sound/voice/ed209_20sec.ogg') + var/lastfired = 0 var/shot_delay = 15 var/shoot_sound = 'sound/weapons/laser.ogg' @@ -26,10 +28,13 @@ ..() set_weapon() -/mob/living/simple_animal/bot/secbot/ed209/emag_act(mob/user) - ..() +/mob/living/simple_animal/bot/secbot/ed209/emag_act(mob/user, obj/item/card/emag/emag_card) + . = ..() icon_state = "ed209[get_bot_flag(bot_mode_flags, BOT_MODE_ON)]" set_weapon() + balloon_alert(user, "safeties disabled") + audible_message(span_bolddanger("[src] buzzes menacingly!")) + return TRUE /mob/living/simple_animal/bot/secbot/ed209/handle_automated_action() var/judgement_criteria = judgement_criteria() @@ -51,6 +56,10 @@ shoot_at(all_targets) ..() +/mob/living/simple_animal/bot/secbot/ed209/threat_react(threatlevel) + speak("Level [threatlevel] infraction alert!") + playsound(src, pick('sound/voice/ed209_20sec.ogg', 'sound/voice/edplaceholder.ogg'), 50, FALSE) + /mob/living/simple_animal/bot/secbot/ed209/proc/set_weapon() //used to update the projectile type and firing sound shoot_sound = 'sound/weapons/laser.ogg' if(bot_cover_flags & BOT_COVER_EMAGGED) diff --git a/code/modules/mob/living/simple_animal/bot/firebot.dm b/code/modules/mob/living/simple_animal/bot/firebot.dm index 64aafb8071be2..29006613e42b1 100644 --- a/code/modules/mob/living/simple_animal/bot/firebot.dm +++ b/code/modules/mob/living/simple_animal/bot/firebot.dm @@ -20,6 +20,17 @@ bot_type = FIRE_BOT hackables = "fire safety protocols" path_image_color = "#FFA500" + possessed_message = "You are a firebot! Protect the station from fires to the best of your ability!" + + automated_announcements = list( + FIREBOT_VOICED_FIRE_DETECTED = 'sound/voice/firebot/detected.ogg', + FIREBOT_VOICED_STOP_DROP = 'sound/voice/firebot/stopdropnroll.ogg', + FIREBOT_VOICED_EXTINGUISHING = 'sound/voice/firebot/extinguishing.ogg', + FIREBOT_VOICED_NO_FIRES = 'sound/voice/firebot/nofires.ogg', + FIREBOT_VOICED_ONLY_YOU = 'sound/voice/firebot/onlyyou.ogg', + FIREBOT_VOICED_TEMPERATURE_NOMINAL = 'sound/voice/firebot/tempnominal.ogg', + FIREBOT_VOICED_KEEP_COOL = 'sound/voice/firebot/keepitcool.ogg', + ) var/atom/target_fire var/atom/old_target_fire @@ -103,12 +114,13 @@ last_found = world.time update_appearance() -/mob/living/simple_animal/bot/firebot/emag_act(mob/user) - ..() +/mob/living/simple_animal/bot/firebot/emag_act(mob/user, obj/item/card/emag/emag_card) + . = ..() if(!(bot_cover_flags & BOT_COVER_EMAGGED)) return - if(user) - to_chat(user, span_danger("[src] buzzes and beeps.")) + + to_chat(user, span_warning("You enable the very ironically named \"fighting with fire\" mode, and disable the targetting safeties.")) // heheehe. funny + audible_message(span_danger("[src] buzzes oddly!")) playsound(src, SFX_SPARKS, 75, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) if(user) @@ -123,6 +135,7 @@ internal_ext.precision = FALSE internal_ext.max_water = INFINITY internal_ext.refill() + return TRUE // Variables sent to TGUI /mob/living/simple_animal/bot/firebot/ui_data(mob/user) @@ -172,13 +185,13 @@ return if(prob(1) && target_fire == null) - var/list/messagevoice = list("No fires detected." = 'sound/voice/firebot/nofires.ogg', - "Only you can prevent station fires." = 'sound/voice/firebot/onlyyou.ogg', - "Temperature nominal." = 'sound/voice/firebot/tempnominal.ogg', - "Keep it cool." = 'sound/voice/firebot/keepitcool.ogg') - var/message = pick(messagevoice) - speak(message) - playsound(src, messagevoice[message], 50) + var/static/list/idle_line = list( + FIREBOT_VOICED_NO_FIRES, + FIREBOT_VOICED_ONLY_YOU, + FIREBOT_VOICED_TEMPERATURE_NOMINAL, + FIREBOT_VOICED_KEEP_COOL, + ) + speak(pick(idle_line)) // Couldn't reach the target, reset and try again ignoring the old one if(frustration > 8) @@ -204,11 +217,9 @@ if(target_fire && (get_dist(src, target_fire) <= (bot_cover_flags & BOT_COVER_EMAGGED ? 1 : 2))) // Make the bot spray water from afar when not emagged if((speech_cooldown + SPEECH_INTERVAL) < world.time) if(ishuman(target_fire)) - speak("Stop, drop and roll!") - playsound(src, 'sound/voice/firebot/stopdropnroll.ogg', 50, FALSE) + speak(FIREBOT_VOICED_STOP_DROP) else - speak("Extinguishing!") - playsound(src, 'sound/voice/firebot/extinguishing.ogg', 50, FALSE) + speak(FIREBOT_VOICED_EXTINGUISHING) speech_cooldown = world.time flick("firebot1_use", src) @@ -257,8 +268,7 @@ return null if((detected_cooldown + DETECTED_VOICE_INTERVAL) < world.time) - speak("Fire detected!") - playsound(src, 'sound/voice/firebot/detected.ogg', 50, FALSE) + speak(FIREBOT_VOICED_FIRE_DETECTED) detected_cooldown = world.time return scan_target diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index 7a1fd85f37a31..b2f7f418589ac 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -22,6 +22,7 @@ bot_type = FLOOR_BOT hackables = "floor construction protocols" path_image_color = "#FFA500" + possessed_message = "You are a floorbot! Repair the hull to the best of your ability!" var/process_type //Determines what to do when process_scan() receives a target. See process_scan() for details. var/targetdirection @@ -100,12 +101,13 @@ else ..() -/mob/living/simple_animal/bot/floorbot/emag_act(mob/user) - ..() +/mob/living/simple_animal/bot/floorbot/emag_act(mob/user, obj/item/card/emag/emag_card) + . = ..() if(!(bot_cover_flags & BOT_COVER_EMAGGED)) return - if(user) - to_chat(user, span_danger("[src] buzzes and beeps.")) + balloon_alert(user, "safeties disabled") + audible_message(span_danger("[src] buzzes oddly!")) + return TRUE ///mobs should use move_resist instead of anchored. /mob/living/simple_animal/bot/floorbot/proc/toggle_magnet(engage = TRUE, change_icon = TRUE) diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index 26c22ca1dcab8..220c4a5cccea1 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -9,7 +9,7 @@ radio_key = /obj/item/encryptionkey/headset_service //doesn't have security key radio_channel = RADIO_CHANNEL_SERVICE //Doesn't even use the radio anyway. bot_type = HONK_BOT - bot_mode_flags = BOT_MODE_ON | BOT_MODE_REMOTE_ENABLED | BOT_MODE_PAI_CONTROLLABLE | BOT_MODE_AUTOPATROL + bot_mode_flags = BOT_MODE_ON | BOT_MODE_REMOTE_ENABLED | BOT_MODE_CAN_BE_SAPIENT | BOT_MODE_AUTOPATROL | BOT_MODE_ROUNDSTART_POSSESSION hackables = "sound control systems" path_image_color = "#FF69B4" data_hud_type = DATA_HUD_SECURITY_BASIC //show jobs @@ -17,6 +17,12 @@ baton_type = /obj/item/bikehorn cuff_type = /obj/item/restraints/handcuffs/cable/zipties/fake/used security_mode_flags = SECBOT_CHECK_WEAPONS | SECBOT_HANDCUFF_TARGET + possessed_message = "You are a honkbot! Make sure the crew are having a great time!" + + automated_announcements = list( + HONKBOT_VOICED_HONK_HAPPY = 'sound/items/bikehorn.ogg', + HONKBOT_VOICED_HONK_SAD = 'sound/misc/sadtrombone.ogg', + ) ///Keeping track of how much we honk to prevent spamming it var/limiting_spam = FALSE @@ -43,11 +49,13 @@ /mob/living/simple_animal/bot/secbot/honkbot/knockOver(mob/living/carbon/tripped_target) . = ..() - INVOKE_ASYNC(src, TYPE_PROC_REF(/mob/living/simple_animal/bot, speak), "Honk!") - playsound(loc, 'sound/misc/sadtrombone.ogg', 50, TRUE, -1) + INVOKE_ASYNC(src, TYPE_PROC_REF(/mob/living/simple_animal/bot, speak), HONKBOT_VOICED_HONK_SAD) icon_state = "[initial(icon_state)]-c" addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_appearance)), 0.2 SECONDS) +/mob/living/simple_animal/bot/secbot/honkbot/threat_react(threatlevel) + speak(HONKBOT_VOICED_HONK_HAPPY) + /mob/living/simple_animal/bot/secbot/honkbot/bot_reset() ..() 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 fdd5c127f724d..0db59e2518c2d 100644 --- a/code/modules/mob/living/simple_animal/bot/hygienebot.dm +++ b/code/modules/mob/living/simple_animal/bot/hygienebot.dm @@ -15,11 +15,26 @@ maints_access_required = list(ACCESS_ROBOTICS, ACCESS_JANITOR) radio_key = /obj/item/encryptionkey/headset_service radio_channel = RADIO_CHANNEL_SERVICE //Service - bot_mode_flags = ~BOT_MODE_PAI_CONTROLLABLE + bot_mode_flags = ~BOT_MODE_CAN_BE_SAPIENT bot_type = HYGIENE_BOT hackables = "cleaning service protocols" path_image_color = "#993299" + automated_announcements = list( + HYGIENEBOT_VOICED_UNHYGIENIC = 'sound/voice/hygienebot/unhygienicclient.ogg', + HYGIENEBOT_VOICED_ENJOY_DAY = 'sound/voice/hygienebot/cleanandtidy.ogg', + HYGIENEBOT_VOICED_THREAT_AIRLOCK = 'sound/voice/hygienebot/dragyouout.ogg', + HYGIENEBOT_VOICED_FOUL_SMELL = 'sound/voice/hygienebot/foulsmelling.ogg', + HYGIENEBOT_VOICED_TROGLODYTE = 'sound/voice/hygienebot/troglodyte.ogg', + HYGIENEBOT_VOICED_GREEN_CLOUD = 'sound/voice/hygienebot/greencloud.ogg', + HYGIENEBOT_VOICED_ARSEHOLE = 'sound/voice/hygienebot/letmeclean.ogg', + HYGIENEBOT_VOICED_THREAT_ARTERIES = 'sound/voice/hygienebot/cutarteries.ogg', + HYGIENEBOT_VOICED_STOP_RUNNING = 'sound/voice/hygienebot/stoprunning.ogg', + HYGIENEBOT_VOICED_FUCKING_FINALLY = 'sound/voice/hygienebot/finally.ogg', + HYGIENEBOT_VOICED_THANK_GOD = 'sound/voice/hygienebot/thankgod.ogg', + HYGIENEBOT_VOICED_DEGENERATE = 'sound/voice/hygienebot/degenerate.ogg', + ) + ///The human target the bot is trying to wash. var/mob/living/carbon/human/target ///The mob's current speed, which varies based on how long the bot chases it's target. @@ -127,14 +142,12 @@ if(target.loc == loc && isturf(target.loc)) //LADIES AND GENTLEMAN WE GOTEM PREPARE TO DUMP start_washing() if(mad) - var/static/list/messagevoice = list( - "Fucking finally." = 'sound/voice/hygienebot/finally.ogg', - "Thank god, you finally stopped." = 'sound/voice/hygienebot/thankgod.ogg', - "Well about fucking time you degenerate." = 'sound/voice/hygienebot/degenerate.ogg', + var/static/list/relief = list( + HYGIENEBOT_VOICED_FUCKING_FINALLY, + HYGIENEBOT_VOICED_THANK_GOD, + HYGIENEBOT_VOICED_DEGENERATE, ) - var/message = pick(messagevoice) - speak(message) - playsound(loc, messagevoice[message], 50) + speak(pick(relief)) playsound(loc, 'sound/effects/hygienebot_angry.ogg', 60, 1) //i think it should still make robot noises too mad = FALSE mode = BOT_SHOWERSTANCE @@ -146,18 +159,16 @@ return SSmove_manager.move_to(src, target, 0, currentspeed) if(mad && prob(min(frustration * 2, 60))) - var/static/list/messagevoice = list( - "Either you stop running or I will fucking drag you out of an airlock." = 'sound/voice/hygienebot/dragyouout.ogg', - "Get back here you foul smelling fucker." = 'sound/voice/hygienebot/foulsmelling.ogg', - "I just want to fucking clean you you troglodyte." = 'sound/voice/hygienebot/troglodyte.ogg', - "If you don't come back here I'll put a green cloud around you cunt." = 'sound/voice/hygienebot/greencloud.ogg', - "Just fucking let me clean you you arsehole!" = 'sound/voice/hygienebot/letmeclean.ogg', - "STOP RUNNING OR I WILL CUT YOUR ARTERIES!" = 'sound/voice/hygienebot/cutarteries.ogg', - "STOP. RUNNING." = 'sound/voice/hygienebot/stoprunning.ogg', + var/static/list/threats = list( + HYGIENEBOT_VOICED_THREAT_AIRLOCK, + HYGIENEBOT_VOICED_FOUL_SMELL, + HYGIENEBOT_VOICED_TROGLODYTE, + HYGIENEBOT_VOICED_GREEN_CLOUD, + HYGIENEBOT_VOICED_ARSEHOLE, + HYGIENEBOT_VOICED_THREAT_ARTERIES, + HYGIENEBOT_VOICED_STOP_RUNNING, ) - var/message = pick(messagevoice) - speak(message) - playsound(loc, messagevoice[message], 50) + speak(pick(threats)) playsound(loc, 'sound/effects/hygienebot_angry.ogg', 60, 1) if((get_dist(src, target)) >= olddist) frustration++ @@ -168,8 +179,7 @@ if(BOT_SHOWERSTANCE) if(check_purity(target)) - speak("Enjoy your clean and tidy day!") - playsound(loc, 'sound/voice/hygienebot/cleanandtidy.ogg', 50) + speak(HYGIENEBOT_VOICED_ENJOY_DAY) playsound(loc, 'sound/effects/hygienebot_happy.ogg', 60, 1) back_to_idle() return @@ -208,8 +218,7 @@ if(!check_purity(H)) //Theyre impure target = H oldtarget_name = H.name - speak("Unhygienic client found. Please stand still so I can clean you.") - playsound(loc, 'sound/voice/hygienebot/unhygienicclient.ogg', 50) + speak(HYGIENEBOT_VOICED_UNHYGIENIC) playsound(loc, 'sound/effects/hygienebot_happy.ogg', 60, 1) visible_message("[src] points at [H.name]!") mode = BOT_HUNT diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index 3950930bca191..cd23f9da844ea 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -33,6 +33,46 @@ data_hud_type = DATA_HUD_MEDICAL_ADVANCED hackables = "health processor circuits" path_image_color = "#DDDDFF" + possessed_message = "You are a medbot! Ensure good health among the crew to the best of your ability!" + + automated_announcements = list( + MEDIBOT_VOICED_HOLD_ON = 'sound/voice/medbot/coming.ogg', + MEDIBOT_VOICED_WANT_TO_HELP = 'sound/voice/medbot/help.ogg', + MEDIBOT_VOICED_YOU_ARE_INJURED = 'sound/voice/medbot/injured.ogg', + MEDIBOT_VOICED_ALL_PATCHED_UP = 'sound/voice/medbot/patchedup.ogg', + MEDIBOT_VOICED_APPLE_A_DAY = 'sound/voice/medbot/apple.ogg', + MEDIBOT_VOICED_FEEL_BETTER = 'sound/voice/medbot/feelbetter.ogg', + MEDIBOT_VOICED_STAY_WITH_ME = 'sound/voice/medbot/no.ogg', + MEDIBOT_VOICED_LIVE = 'sound/voice/medbot/live.ogg', + MEDIBOT_VOICED_NEVER_LOST = 'sound/voice/medbot/lost.ogg', + MEDIBOT_VOICED_DELICIOUS = 'sound/voice/medbot/delicious.ogg', + MEDIBOT_VOICED_PLASTIC_SURGEON = 'sound/voice/medbot/surgeon.ogg', + MEDIBOT_VOICED_MASK_ON = 'sound/voice/medbot/radar.ogg', + MEDIBOT_VOICED_ALWAYS_A_CATCH = 'sound/voice/medbot/catch.ogg', + MEDIBOT_VOICED_LIKE_FLIES = 'sound/voice/medbot/flies.ogg', + MEDIBOT_VOICED_SUFFER = 'sound/voice/medbot/why.ogg', + MEDIBOT_VOICED_FUCK_YOU = 'sound/voice/medbot/fuck_you.ogg', + MEDIBOT_VOICED_NOT_A_GAME = 'sound/voice/medbot/turn_off.ogg', + MEDIBOT_VOICED_IM_DIFFERENT = 'sound/voice/medbot/im_different.ogg', + MEDIBOT_VOICED_FOURTH_WALL = 'sound/voice/medbot/close.ogg', + MEDIBOT_VOICED_SHINDEMASHOU = 'sound/voice/medbot/shindemashou.ogg', + MEDIBOT_VOICED_WAIT = 'sound/voice/medbot/hey_wait.ogg', + MEDIBOT_VOICED_DONT = 'sound/voice/medbot/please_dont.ogg', + MEDIBOT_VOICED_TRUSTED_YOU = 'sound/voice/medbot/i_trusted_you.ogg', + MEDIBOT_VOICED_NO_SAD = 'sound/voice/medbot/nooo.ogg', + MEDIBOT_VOICED_OH_FUCK = 'sound/voice/medbot/oh_fuck.ogg', + MEDIBOT_VOICED_FORGIVE = 'sound/voice/medbot/forgive.ogg', + MEDIBOT_VOICED_THANKS = 'sound/voice/medbot/thank_you.ogg', + MEDIBOT_VOICED_GOOD_PERSON = 'sound/voice/medbot/youre_good.ogg', + MEDIBOT_VOICED_BEHAVIOUR_REPORTED = 'sound/voice/medbot/reported.ogg', + MEDIBOT_VOICED_ASSISTANCE = 'sound/voice/medbot/i_require_asst.ogg', + MEDIBOT_VOICED_PUT_BACK = 'sound/voice/medbot/please_put_me_back.ogg', + MEDIBOT_VOICED_IM_SCARED = 'sound/voice/medbot/please_im_scared.ogg', + MEDIBOT_VOICED_NEED_HELP = 'sound/voice/medbot/dont_like.ogg', + MEDIBOT_VOICED_THIS_HURTS = 'sound/voice/medbot/pain_is_real.ogg', + MEDIBOT_VOICED_THE_END = 'sound/voice/medbot/is_this_the_end.ogg', + MEDIBOT_VOICED_NOOO = 'sound/voice/medbot/nooo.ogg', + ) /// drop determining variable var/healthanalyzer = /obj/item/healthanalyzer @@ -62,6 +102,8 @@ var/tipped_status = MEDBOT_PANIC_NONE ///The name we got when we were tipped var/tipper_name + ///The trim type that will grant additional access to this medibot + var/datum/id_trim/additional_access = /datum/id_trim/job/paramedic ///Last announced healing a person in critical condition COOLDOWN_DECLARE(last_patient_message) @@ -71,7 +113,7 @@ COOLDOWN_DECLARE(last_tipping_action_voice) /mob/living/simple_animal/bot/medbot/autopatrol - bot_mode_flags = BOT_MODE_ON | BOT_MODE_AUTOPATROL | BOT_MODE_REMOTE_ENABLED | BOT_MODE_PAI_CONTROLLABLE + bot_mode_flags = BOT_MODE_ON | BOT_MODE_AUTOPATROL | BOT_MODE_REMOTE_ENABLED | BOT_MODE_CAN_BE_SAPIENT | BOT_MODE_ROUNDSTART_POSSESSION /mob/living/simple_animal/bot/medbot/stationary medical_mode_flags = MEDBOT_DECLARE_CRIT | MEDBOT_STATIONARY_MODE | MEDBOT_SPEAK_MODE @@ -92,6 +134,41 @@ heal_threshold = 0 heal_amount = 5 +/mob/living/simple_animal/bot/medbot/nukie + name = "Oppenheimer" + desc = "A medibot stolen from a Nanotrasen station and upgraded by the Syndicate. Despite their best efforts at reprogramming, it still appears visibly upset near nuclear explosives." + skin = "bezerk" + health = 40 + maxHealth = 40 + maints_access_required = list(ACCESS_SYNDICATE) + radio_key = /obj/item/encryptionkey/syndicate + radio_channel = RADIO_CHANNEL_SYNDICATE + damagetype_healer = "all" + heal_threshold = 0 + heal_amount = 5 + additional_access = /datum/id_trim/syndicom/crew + +/mob/living/simple_animal/bot/medbot/nukie/Initialize(mapload, new_skin) + . = ..() + RegisterSignal(SSdcs, COMSIG_GLOB_NUKE_DEVICE_DISARMED, PROC_REF(nuke_disarm)) + RegisterSignal(SSdcs, COMSIG_GLOB_NUKE_DEVICE_ARMED, PROC_REF(nuke_arm)) + RegisterSignal(SSdcs, COMSIG_GLOB_NUKE_DEVICE_DETONATING, PROC_REF(nuke_detonate)) + internal_radio.set_frequency(FREQ_SYNDICATE) + internal_radio.freqlock = RADIO_FREQENCY_LOCKED + faction += ROLE_SYNDICATE //one of us + +/mob/living/simple_animal/bot/medbot/nukie/proc/nuke_disarm() + SIGNAL_HANDLER + INVOKE_ASYNC(src, PROC_REF(speak), pick(MEDIBOT_VOICED_FORGIVE, MEDIBOT_VOICED_THANKS, MEDIBOT_VOICED_GOOD_PERSON)) + +/mob/living/simple_animal/bot/medbot/nukie/proc/nuke_arm() + SIGNAL_HANDLER + INVOKE_ASYNC(src, PROC_REF(speak), pick(MEDIBOT_VOICED_WAIT, MEDIBOT_VOICED_DONT, MEDIBOT_VOICED_IM_SCARED)) + +/mob/living/simple_animal/bot/medbot/nukie/proc/nuke_detonate() + SIGNAL_HANDLER + INVOKE_ASYNC(src, PROC_REF(speak), pick(MEDIBOT_VOICED_THE_END, MEDIBOT_VOICED_NOOO, MEDIBOT_VOICED_SUFFER)) + /mob/living/simple_animal/bot/medbot/examine(mob/user) . = ..() if(tipped_status == MEDBOT_PANIC_NONE) @@ -131,14 +208,20 @@ . = ..() // Doing this hurts my soul, but simplebot access reworks are for another day. - var/datum/id_trim/job/para_trim = SSid_access.trim_singletons_by_path[/datum/id_trim/job/paramedic] - access_card.add_access(para_trim.access + para_trim.wildcard_access) + var/datum/id_trim/additional_trim = SSid_access.trim_singletons_by_path[additional_access] + access_card.add_access(additional_trim.access + additional_trim.wildcard_access) prev_access = access_card.access.Copy() - skin = new_skin + if(!isnull(new_skin)) + skin = new_skin update_appearance() - if(!CONFIG_GET(flag/no_default_techweb_link) && !linked_techweb) - linked_techweb = SSresearch.science_tech + + if(HAS_TRAIT(SSstation, STATION_TRAIT_MEDBOT_MANIA) && mapload && is_station_level(z)) + skin = "advanced" + update_appearance(UPDATE_OVERLAYS) + damagetype_healer = "all" + if(prob(50)) + name += ", PhD." AddComponent(/datum/component/tippable, \ tip_time = 3 SECONDS, \ @@ -147,6 +230,12 @@ pre_tipped_callback = CALLBACK(src, PROC_REF(pre_tip_over)), \ post_tipped_callback = CALLBACK(src, PROC_REF(after_tip_over)), \ post_untipped_callback = CALLBACK(src, PROC_REF(after_righted))) + return INITIALIZE_HINT_LATELOAD + +/mob/living/simple_animal/bot/medbot/LateInitialize() + . = ..() + if(!CONFIG_GET(flag/no_default_techweb_link) && !linked_techweb) + CONNECT_TO_RND_SERVER_ROUNDSTART(linked_techweb, src) /mob/living/simple_animal/bot/medbot/bot_reset() ..() @@ -226,18 +315,18 @@ if(health < current_health) //if medbot took some damage step_to(src, (get_step_away(src,user))) -/mob/living/simple_animal/bot/medbot/emag_act(mob/user) - ..() +/mob/living/simple_animal/bot/medbot/emag_act(mob/user, obj/item/card/emag/emag_card) + . = ..() if(!(bot_cover_flags & BOT_COVER_EMAGGED)) return medical_mode_flags &= ~MEDBOT_DECLARE_CRIT - if(user) - to_chat(user, span_notice("You short out [src]'s reagent synthesis circuits.")) + balloon_alert(user, "reagent synthesis circuits shorted") audible_message(span_danger("[src] buzzes oddly!")) flick("medibot_spark", src) playsound(src, SFX_SPARKS, 75, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) if(user) oldpatient = user + return TRUE /mob/living/simple_animal/bot/medbot/process_scan(mob/living/carbon/human/H) if(H.stat == DEAD) @@ -250,7 +339,11 @@ 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/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) @@ -266,16 +359,14 @@ return COOLDOWN_START(src, last_tipping_action_voice, MEDBOT_FREAKOUT_DELAY) // message for tipping happens when we start interacting, message for righting comes after finishing - var/static/list/messagevoice = list( - "Hey, wait..." = 'sound/voice/medbot/hey_wait.ogg', - "Please don't..." = 'sound/voice/medbot/please_dont.ogg', - "I trusted you..." = 'sound/voice/medbot/i_trusted_you.ogg', - "Nooo..." = 'sound/voice/medbot/nooo.ogg', - "Oh fuck-" = 'sound/voice/medbot/oh_fuck.ogg', - ) - var/message = pick(messagevoice) - speak(message) - playsound(src, messagevoice[message], 70, FALSE) + var/static/list/worried_line = list( + MEDIBOT_VOICED_WAIT, + MEDIBOT_VOICED_DONT, + MEDIBOT_VOICED_TRUSTED_YOU, + MEDIBOT_VOICED_NO_SAD, + MEDIBOT_VOICED_OH_FUCK, + ) + speak(pick(worried_line)) /* * Proc used in a callback for after this medibot is tipped by the tippable component. @@ -296,18 +387,16 @@ var/list/messagevoice if(user) if(user.name == tipper_name) - messagevoice = list("I forgive you." = 'sound/voice/medbot/forgive.ogg') + messagevoice = list(MEDIBOT_VOICED_FORGIVE) else - messagevoice = list("Thank you!" = 'sound/voice/medbot/thank_you.ogg', "You are a good person." = 'sound/voice/medbot/youre_good.ogg') + messagevoice = list(MEDIBOT_VOICED_THANKS, MEDIBOT_VOICED_GOOD_PERSON) else - messagevoice = list("Fuck you." = 'sound/voice/medbot/fuck_you.ogg', "Your behavior has been reported, have a nice day." = 'sound/voice/medbot/reported.ogg') + messagevoice = list(MEDIBOT_VOICED_FUCK_YOU, MEDIBOT_VOICED_BEHAVIOUR_REPORTED) tipper_name = null if(COOLDOWN_FINISHED(src, last_tipping_action_voice)) COOLDOWN_START(src, last_tipping_action_voice, MEDBOT_FREAKOUT_DELAY) - var/message = pick(messagevoice) - speak(message) - playsound(src, messagevoice[message], 70) + speak(pick(messagevoice)) tipped_status = MEDBOT_PANIC_NONE mode = BOT_IDLE @@ -318,15 +407,15 @@ switch(tipped_status) if(MEDBOT_PANIC_LOW) - messagevoice = list("I require assistance." = 'sound/voice/medbot/i_require_asst.ogg') + messagevoice = list(MEDIBOT_VOICED_ASSISTANCE) if(MEDBOT_PANIC_MED) - messagevoice = list("Please put me back." = 'sound/voice/medbot/please_put_me_back.ogg') + messagevoice = list(MEDIBOT_VOICED_PUT_BACK) if(MEDBOT_PANIC_HIGH) - messagevoice = list("Please, I am scared!" = 'sound/voice/medbot/please_im_scared.ogg') + messagevoice = list(MEDIBOT_VOICED_IM_SCARED) if(MEDBOT_PANIC_FUCK) - messagevoice = list("I don't like this, I need help!" = 'sound/voice/medbot/dont_like.ogg', "This hurts, my pain is real!" = 'sound/voice/medbot/pain_is_real.ogg') + messagevoice = list(MEDIBOT_VOICED_NEED_HELP, MEDIBOT_VOICED_THIS_HURTS) if(MEDBOT_PANIC_ENDING) - messagevoice = list("Is this the end?" = 'sound/voice/medbot/is_this_the_end.ogg', "Nooo!" = 'sound/voice/medbot/nooo.ogg') + messagevoice = list(MEDIBOT_VOICED_THE_END, MEDIBOT_VOICED_NOOO) if(MEDBOT_PANIC_END) speak("PSYCH ALERT: Crewmember [tipper_name] recorded displaying antisocial tendencies torturing bots in [get_area(src)]. Please schedule psych evaluation.", radio_channel) @@ -334,9 +423,7 @@ do_jitter_animation(tipped_status * 0.1) if(messagevoice) - var/message = pick(messagevoice) - speak(message) - playsound(src, messagevoice[message], 70) + speak(pick(messagevoice)) else if(prob(tipped_status * 0.2)) playsound(src, 'sound/machines/warning-buzzer.ogg', 30, extrarange=-2) @@ -365,26 +452,24 @@ 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/static/list/i_need_scissors = list( + MEDIBOT_VOICED_FUCK_YOU, + MEDIBOT_VOICED_NOT_A_GAME, + MEDIBOT_VOICED_IM_DIFFERENT, + MEDIBOT_VOICED_FOURTH_WALL, + MEDIBOT_VOICED_SHINDEMASHOU, ) - playsound(src, pick(i_need_scissors), 70) + speak(pick(i_need_scissors)) else - var/static/list/messagevoice = list( - "Delicious!" = 'sound/voice/medbot/delicious.ogg', - "I knew it, I should've been a plastic surgeon." = 'sound/voice/medbot/surgeon.ogg', - "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', - "What kind of medbay is this? Everyone's dropping like flies." = 'sound/voice/medbot/flies.ogg', - "Why are we still here? Just to suffer?" = 'sound/voice/medbot/why.ogg', + var/static/list/idle_lines = list( + MEDIBOT_VOICED_DELICIOUS, + MEDIBOT_VOICED_PLASTIC_SURGEON, + MEDIBOT_VOICED_MASK_ON, + MEDIBOT_VOICED_ALWAYS_A_CATCH, + MEDIBOT_VOICED_LIKE_FLIES, + MEDIBOT_VOICED_SUFFER, ) - var/message = pick(messagevoice) - speak(message) - playsound(src, messagevoice[message], 50) + speak(pick(idle_lines)) 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(list(/mob/living/carbon/human), oldpatient, scan_range) oldpatient = patient @@ -510,10 +595,12 @@ return if(C.stat == DEAD || (HAS_TRAIT(C, TRAIT_FAKEDEATH))) - var/list/messagevoice = list("No! Stay with me!" = 'sound/voice/medbot/no.ogg',"Live, damnit! LIVE!" = 'sound/voice/medbot/live.ogg',"I...I've never lost a patient before. Not today, I mean." = 'sound/voice/medbot/lost.ogg') - var/message = pick(messagevoice) - speak(message) - playsound(src, messagevoice[message], 50) + var/static/list/grief_lines = list( + MEDIBOT_VOICED_STAY_WITH_ME, + MEDIBOT_VOICED_LIVE, + MEDIBOT_VOICED_NEVER_LOST, + ) + speak(pick(grief_lines)) oldpatient = patient soft_reset() return @@ -547,10 +634,12 @@ if(C.maxHealth - C.get_organic_health() < heal_threshold) to_chat(src, span_notice("[C] is healthy! Your programming prevents you from tending the wounds of anyone without at least [heal_threshold] damage of any one type ([heal_threshold + 5] for oxygen damage.)")) - var/list/messagevoice = list("All patched up!" = 'sound/voice/medbot/patchedup.ogg',"An apple a day keeps me away." = 'sound/voice/medbot/apple.ogg',"Feel better soon!" = 'sound/voice/medbot/feelbetter.ogg') - var/message = pick(messagevoice) - speak(message) - playsound(src, messagevoice[message], 50) + var/static/list/success_lines = list( + MEDIBOT_VOICED_ALL_PATCHED_UP, + MEDIBOT_VOICED_APPLE_A_DAY, + MEDIBOT_VOICED_FEEL_BETTER, + ) + speak(pick(success_lines)) bot_reset() tending = FALSE else if(patient) diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index df85d6d7d4a3d..c6ae677136a6b 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -24,12 +24,14 @@ buckle_lying = 0 mob_size = MOB_SIZE_LARGE buckle_prevents_pull = TRUE // No pulling loaded shit + bot_mode_flags = ~BOT_MODE_ROUNDSTART_POSSESSION maints_access_required = list(ACCESS_ROBOTICS, ACCESS_CARGO) radio_key = /obj/item/encryptionkey/headset_cargo radio_channel = RADIO_CHANNEL_SUPPLY bot_type = MULE_BOT path_image_color = "#7F5200" + possessed_message = "You are a MULEbot! Do your best to make sure that packages get to their destination!" /// unique identifier in case there are multiple mulebots. var/id @@ -68,7 +70,7 @@ if(prob(0.666) && mapload) new /mob/living/simple_animal/bot/mulebot/paranormal(loc) return INITIALIZE_HINT_QDEL - wires = new /datum/wires/mulebot(src) + set_wires(new /datum/wires/mulebot(src)) // Doing this hurts my soul, but simplebot access reworks are for another day. var/datum/id_trim/job/cargo_trim = SSid_access.trim_singletons_by_path[/datum/id_trim/job/cargo_technician] @@ -84,14 +86,14 @@ AddElement(/datum/element/ridable, /datum/component/riding/creature/mulebot) diag_hud_set_mulebotcell() -/mob/living/simple_animal/bot/mulebot/handle_atom_del(atom/A) - if(A == load) +/mob/living/simple_animal/bot/mulebot/Exited(atom/movable/gone, direction) + . = ..() + if(gone == load) unload(0) - if(A == cell) + if(gone == cell) turn_off() cell = null diag_hud_set_mulebotcell() - return ..() /mob/living/simple_animal/bot/mulebot/examine(mob/user) . = ..() @@ -135,8 +137,6 @@ /mob/living/simple_animal/bot/mulebot/proc/set_id(new_id) id = new_id - if(!paicard) - name = "[initial(name)] ([new_id])" /mob/living/simple_animal/bot/mulebot/bot_reset() ..() @@ -157,8 +157,10 @@ user.put_in_hands(cell) else cell.forceMove(drop_location()) - visible_message(span_notice("[user] crowbars [cell] out from [src]."), - span_notice("You pry [cell] out of [src].")) + user.visible_message( + span_notice("[user] crowbars [cell] out from [src]."), + span_notice("You pry [cell] out of [src]."), + ) cell = null diag_hud_set_mulebotcell() return TOOL_ACT_TOOLTYPE_SUCCESS @@ -172,8 +174,10 @@ return TRUE cell = I diag_hud_set_mulebotcell() - visible_message(span_notice("[user] inserts \a [cell] into [src]."), - span_notice("You insert [cell] into [src].")) + user.visible_message( + span_notice("[user] inserts \a [cell] into [src]."), + span_notice("You insert [cell] into [src]."), + ) return TRUE else if(is_wire_tool(I) && bot_cover_flags & BOT_COVER_OPEN) return attack_hand(user) @@ -188,14 +192,15 @@ else return ..() -/mob/living/simple_animal/bot/mulebot/emag_act(mob/user) +/mob/living/simple_animal/bot/mulebot/emag_act(mob/user, obj/item/card/emag/emag_card) if(!(bot_cover_flags & BOT_COVER_EMAGGED)) bot_cover_flags |= BOT_COVER_EMAGGED 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!")) + balloon_alert(user, "controls [bot_cover_flags & BOT_COVER_LOCKED ? "locked" : "unlocked"]") flick("[base_icon]-emagged", src) playsound(src, SFX_SPARKS, 100, FALSE, SHORT_RANGE_SOUND_EXTRARANGE) + return TRUE /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 . = ..() @@ -232,7 +237,7 @@ unload(0) if(prob(25)) visible_message(span_danger("Something shorts out inside [src]!")) - wires.cut_random() + wires.cut_random(source = Proj.firer) /mob/living/simple_animal/bot/mulebot/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -263,8 +268,10 @@ data["autoReturn"] = auto_return data["autoPickup"] = auto_pickup data["reportDelivery"] = report_delivery - data["haspai"] = paicard ? TRUE : FALSE data["id"] = id + data["allow_possession"] = bot_mode_flags & BOT_MODE_CAN_BE_SAPIENT + data["possession_enabled"] = can_be_possessed + data["pai_inserted"] = !!paicard return data /mob/living/simple_animal/bot/mulebot/ui_act(action, params) @@ -276,7 +283,7 @@ if("lock") if(usr.has_unlimited_silicon_privilege) bot_cover_flags ^= BOT_COVER_LOCKED - . = TRUE + return TRUE if("on") if(bot_mode_flags & BOT_MODE_ON) turn_off() @@ -287,10 +294,10 @@ if(!turn_on()) to_chat(usr, span_warning("You can't switch on [src]!")) return - . = TRUE + return TRUE else bot_control(action, usr, params) // Kill this later. // Kill PDAs in general please - . = TRUE + return TRUE /mob/living/simple_animal/bot/mulebot/bot_control(command, mob/user, list/params = list(), pda = FALSE) if(pda && wires.is_cut(WIRE_RX)) // MULE wireless is controlled by wires. @@ -342,8 +349,6 @@ auto_pickup = !auto_pickup if("report") report_delivery = !report_delivery - if("ejectpai") - ejectpairemote(user) /mob/living/simple_animal/bot/mulebot/proc/buzz(type) switch(type) @@ -658,7 +663,7 @@ /mob/living/simple_animal/bot/mulebot/MobBump(mob/M) // called when the bot bumps into a mob - if(paicard || !isliving(M)) //if there's a PAIcard controlling the bot, they aren't allowed to harm folks. + if(mind || !isliving(M)) //if there's a sentience controlling the bot, they aren't allowed to harm folks. return ..() var/mob/living/L = M if(wires.is_cut(WIRE_AVOIDANCE)) // usually just bumps, but if the avoidance wire is cut, knocks them over. @@ -671,6 +676,12 @@ // when mulebot is in the same loc /mob/living/simple_animal/bot/mulebot/proc/run_over(mob/living/carbon/human/crushed) + if (!(bot_cover_flags & BOT_COVER_EMAGGED) && !wires.is_cut(WIRE_AVOIDANCE)) + if (!has_status_effect(/datum/status_effect/careful_driving)) + crushed.visible_message(span_notice("[src] slows down to avoid crushing [crushed].")) + apply_status_effect(/datum/status_effect/careful_driving) + return // Player mules must be emagged before they can trample + log_combat(src, crushed, "run over", addition = "(DAMTYPE: [uppertext(BRUTE)])") crushed.visible_message( span_danger("[src] drives over [crushed]!"), @@ -765,11 +776,6 @@ else return ..() -/mob/living/simple_animal/bot/mulebot/insertpai(mob/user, obj/item/pai_card/card) - . = ..() - if(.) - visible_message(span_notice("[src]'s safeties are locked on.")) - /// Checks whether the bot can complete a step_towards, checking whether the bot is on and has the charge to do the move. Returns COMPONENT_MOB_BOT_CANCELSTEP if the bot should not step. /mob/living/simple_animal/bot/mulebot/proc/check_pre_step(datum/source) SIGNAL_HANDLER @@ -787,6 +793,10 @@ cell?.use(cell_move_power_usage) +/mob/living/simple_animal/bot/mulebot/post_possession() + . = ..() + visible_message(span_notice("[src]'s safeties are locked on.")) + /mob/living/simple_animal/bot/mulebot/paranormal//allows ghosts only unless hacked to actually be useful name = "\improper GHOULbot" desc = "A rather ghastly looking... Multiple Utility Load Effector bot? It only seems to accept paranormal forces, and for this reason is fucking useless." diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 2b32f69c13511..e40a7ff405ecb 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -15,10 +15,20 @@ radio_key = /obj/item/encryptionkey/secbot //AI Priv + Security radio_channel = RADIO_CHANNEL_SECURITY //Security channel bot_type = SEC_BOT - bot_mode_flags = ~BOT_MODE_PAI_CONTROLLABLE + bot_mode_flags = ~BOT_MODE_CAN_BE_SAPIENT data_hud_type = DATA_HUD_SECURITY_ADVANCED hackables = "target identification systems" path_image_color = "#FF0000" + possessed_message = "You are a securitron! Guard the station to the best of your ability!" + + automated_announcements = list( + BEEPSKY_VOICED_CRIMINAL_DETECTED = 'sound/voice/beepsky/criminal.ogg', + BEEPSKY_VOICED_FREEZE = 'sound/voice/beepsky/freeze.ogg', + BEEPSKY_VOICED_JUSTICE = 'sound/voice/beepsky/justice.ogg', + BEEPSKY_VOICED_YOUR_MOVE = 'sound/voice/beepsky/creep.ogg', + BEEPSKY_VOICED_I_AM_THE_LAW = 'sound/voice/beepsky/iamthelaw.ogg', + BEEPSKY_VOICED_SECURE_DAY = 'sound/voice/beepsky/secureday.ogg', + ) ///The type of baton this Secbot will use var/baton_type = /obj/item/melee/baton/security @@ -64,13 +74,13 @@ /mob/living/simple_animal/bot/secbot/beepsky/ofitser name = "Prison Ofitser" desc = "Powered by the tears and sweat of laborers." - bot_mode_flags = ~(BOT_MODE_PAI_CONTROLLABLE|BOT_MODE_AUTOPATROL) + bot_mode_flags = ~(BOT_MODE_CAN_BE_SAPIENT|BOT_MODE_AUTOPATROL) /mob/living/simple_animal/bot/secbot/beepsky/armsky name = "Sergeant-At-Armsky" desc = "It's Sergeant-At-Armsky! He's a disgruntled assistant to the warden that would probably shoot you if he had hands." health = 45 - bot_mode_flags = ~(BOT_MODE_PAI_CONTROLLABLE|BOT_MODE_AUTOPATROL) + bot_mode_flags = ~(BOT_MODE_CAN_BE_SAPIENT|BOT_MODE_AUTOPATROL) security_mode_flags = SECBOT_DECLARE_ARRESTS | SECBOT_CHECK_IDS | SECBOT_CHECK_RECORDS /mob/living/simple_animal/bot/secbot/beepsky/jr @@ -86,7 +96,7 @@ name = "Officer Pingsky" desc = "It's Officer Pingsky! Delegated to satellite guard duty for harbouring anti-human sentiment." radio_channel = RADIO_CHANNEL_AI_PRIVATE - bot_mode_flags = ~(BOT_MODE_PAI_CONTROLLABLE|BOT_MODE_AUTOPATROL) + bot_mode_flags = ~(BOT_MODE_CAN_BE_SAPIENT|BOT_MODE_AUTOPATROL) security_mode_flags = SECBOT_DECLARE_ARRESTS | SECBOT_CHECK_IDS | SECBOT_CHECK_RECORDS /mob/living/simple_animal/bot/secbot/genesky @@ -148,11 +158,11 @@ 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) +/mob/living/simple_animal/bot/secbot/Exited(atom/movable/gone, direction) + . = ..() + if(gone == weapon) weapon = null update_appearance() - return ..() // Variables sent to TGUI /mob/living/simple_animal/bot/secbot/ui_data(mob/user) @@ -233,12 +243,12 @@ retaliate(user) special_retaliate_after_attack(user) -/mob/living/simple_animal/bot/secbot/emag_act(mob/user) - ..() +/mob/living/simple_animal/bot/secbot/emag_act(mob/user, obj/item/card/emag/emag_card) + . = ..() if(!(bot_cover_flags & BOT_COVER_EMAGGED)) return if(user) - to_chat(user, span_danger("You short out [src]'s target assessment circuits.")) + balloon_alert(user, "target assessment circuits shorted") oldtarget_name = user.name if(bot_type == HONK_BOT) @@ -249,6 +259,7 @@ security_mode_flags &= ~SECBOT_DECLARE_ARRESTS update_appearance() + return TRUE /mob/living/simple_animal/bot/secbot/bullet_act(obj/projectile/Proj) if(istype(Proj, /obj/projectile/beam) || istype(Proj, /obj/projectile/bullet)) @@ -451,22 +462,17 @@ if(threatlevel >= 4) target = nearby_carbons oldtarget_name = nearby_carbons.name - switch(bot_type) - if(ADVANCED_SEC_BOT) - speak("Level [threatlevel] infraction alert!") - playsound(src, pick('sound/voice/ed209_20sec.ogg', 'sound/voice/edplaceholder.ogg'), 50, FALSE) - if(HONK_BOT) - speak("Honk!") - playsound(src, pick('sound/items/bikehorn.ogg'), 50, FALSE) - else - speak("Level [threatlevel] infraction alert!") - playsound(src, pick('sound/voice/beepsky/criminal.ogg', 'sound/voice/beepsky/justice.ogg', 'sound/voice/beepsky/freeze.ogg'), 50, FALSE) - + threat_react(threatlevel) visible_message("[src] points at [nearby_carbons.name]!") mode = BOT_HUNT INVOKE_ASYNC(src, PROC_REF(handle_automated_action)) break +/// React to detecting criminal scum by making some kind of noise +/mob/living/simple_animal/bot/secbot/proc/threat_react(threatlevel) + speak("Level [threatlevel] infraction alert!") + playsound(src, pick('sound/voice/beepsky/criminal.ogg', 'sound/voice/beepsky/justice.ogg', 'sound/voice/beepsky/freeze.ogg'), 50, FALSE) + /mob/living/simple_animal/bot/secbot/proc/check_for_weapons(obj/item/slot_item) if(slot_item && (slot_item.item_flags & NEEDS_PERMIT)) return TRUE diff --git a/code/modules/mob/living/simple_animal/bot/vibebot.dm b/code/modules/mob/living/simple_animal/bot/vibebot.dm index 2a63c8571b834..5a876bd8eca2e 100644 --- a/code/modules/mob/living/simple_animal/bot/vibebot.dm +++ b/code/modules/mob/living/simple_animal/bot/vibebot.dm @@ -19,6 +19,7 @@ bot_type = VIBE_BOT data_hud_type = DATA_HUD_DIAGNOSTIC_BASIC path_image_color = "#2cac12" + possessed_message = "You are a vibebot! Maintain the station's vibes to the best of your ability!" ///The vibe ability given to vibebots, so sentient ones can still change their color. var/datum/action/innate/vibe/vibe_ability diff --git a/code/modules/mob/living/simple_animal/damage_procs.dm b/code/modules/mob/living/simple_animal/damage_procs.dm index 6345320d9d996..0c06049288d09 100644 --- a/code/modules/mob/living/simple_animal/damage_procs.dm +++ b/code/modules/mob/living/simple_animal/damage_procs.dm @@ -19,36 +19,48 @@ toggle_ai(AI_ON) /mob/living/simple_animal/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) + if(on_damage_adjustment(BRUTE, amount, forced) & COMPONENT_IGNORE_CHANGE) + return 0 if(forced) . = adjustHealth(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) else if(damage_coeff[BRUTE]) . = adjustHealth(amount * damage_coeff[BRUTE] * CONFIG_GET(number/damage_multiplier), updating_health, forced) /mob/living/simple_animal/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) + if(on_damage_adjustment(BURN, amount, forced) & COMPONENT_IGNORE_CHANGE) + return 0 if(forced) . = adjustHealth(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) else if(damage_coeff[BURN]) . = adjustHealth(amount * damage_coeff[BURN] * CONFIG_GET(number/damage_multiplier), updating_health, forced) /mob/living/simple_animal/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype, required_respiration_type) + if(on_damage_adjustment(OXY, amount, forced) & COMPONENT_IGNORE_CHANGE) + return 0 if(forced) . = adjustHealth(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) else if(damage_coeff[OXY]) . = adjustHealth(amount * damage_coeff[OXY] * CONFIG_GET(number/damage_multiplier), updating_health, forced) /mob/living/simple_animal/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) + if(on_damage_adjustment(TOX, amount, forced) & COMPONENT_IGNORE_CHANGE) + return 0 if(forced) . = adjustHealth(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) else if(damage_coeff[TOX]) . = adjustHealth(amount * damage_coeff[TOX] * CONFIG_GET(number/damage_multiplier), updating_health, forced) -/mob/living/simple_animal/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE) +/mob/living/simple_animal/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) + if(on_damage_adjustment(CLONE, amount, forced) & COMPONENT_IGNORE_CHANGE) + return 0 if(forced) . = adjustHealth(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) else if(damage_coeff[CLONE]) . = adjustHealth(amount * damage_coeff[CLONE] * CONFIG_GET(number/damage_multiplier), updating_health, forced) /mob/living/simple_animal/adjustStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype) + if(on_damage_adjustment(STAMINA, amount, forced) & COMPONENT_IGNORE_CHANGE) + return 0 if(forced) staminaloss = max(0, min(max_staminaloss, staminaloss + amount)) else diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 172a2dd5b4efe..f1857a00e2c46 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -303,7 +303,9 @@ var/obj/item/organ/internal/brain/candidate = locate(/obj/item/organ/internal/brain) in contents if(!candidate || !candidate.brainmob || !candidate.brainmob.mind) return - candidate.brainmob.mind.transfer_to(src) + var/datum/mind/candidate_mind = candidate.brainmob.mind + candidate_mind.transfer_to(src) + candidate_mind.grab_ghost() to_chat(src, "[span_boldbig("You are a cak!")] You're a harmless cat/cake hybrid that everyone loves. People can take bites out of you if they're hungry, but you regenerate health \ so quickly that it generally doesn't matter. You're remarkably resilient to any damage besides this and it's hard for you to really die at all. You should go around and bring happiness and \ free cake to the station!") diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm deleted file mode 100644 index 7018ba4426a04..0000000000000 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ /dev/null @@ -1,86 +0,0 @@ -//Look Sir, free crabs! -/mob/living/simple_animal/crab - name = "crab" - desc = "Free crabs!" - icon_state = "crab" - icon_living = "crab" - icon_dead = "crab_dead" - speak_emote = list("clicks") - emote_hear = list("clicks.") - emote_see = list("clacks.") - speak_chance = 1 - turns_per_move = 5 - butcher_results = list(/obj/item/food/meat/slab/rawcrab = 2) - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "gently pushes aside" - response_disarm_simple = "gently push aside" - response_harm_continuous = "stomps" - response_harm_simple = "stomp" - stop_automated_movement = 1 - friendly_verb_continuous = "pinches" - friendly_verb_simple = "pinch" - var/obj/item/inventory_head - var/obj/item/inventory_mask - gold_core_spawnable = FRIENDLY_SPAWN - ///In the case 'melee_damage_upper' is somehow raised above 0 - attack_verb_continuous = "snips" - attack_verb_simple = "snip" - attack_sound = 'sound/weapons/bite.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE - -/mob/living/simple_animal/crab/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - -/mob/living/simple_animal/crab/Life(seconds_per_tick = SSMOBS_DT, times_fired) - ..() - //CRAB movement - if(!ckey && !stat) - if(isturf(loc) && !resting && !buckled) //This is so it only moves if it's not inside a closet, gentics machine, etc. - turns_since_move++ - if(turns_since_move >= turns_per_move) - var/east_vs_west = pick(4, 8) - if(Process_Spacemove(east_vs_west)) - Move(get_step(src,east_vs_west), east_vs_west) - turns_since_move = 0 - regenerate_icons() - -//COFFEE! SQUEEEEEEEEE! -/mob/living/simple_animal/crab/coffee - name = "Coffee" - real_name = "Coffee" - desc = "It's Coffee, the other pet!" - gender = FEMALE - gold_core_spawnable = NO_SPAWN - -/mob/living/simple_animal/crab/jon //holodeck crab - name = "Jon" - real_name = "Jon" - gold_core_spawnable = NO_SPAWN - -/mob/living/simple_animal/crab/evil - name = "Evil Crab" - real_name = "Evil Crab" - desc = "Unnerving, isn't it? It has to be planning something nefarious..." - icon_state = "evilcrab" - icon_living = "evilcrab" - icon_dead = "evilcrab_dead" - gold_core_spawnable = FRIENDLY_SPAWN - -/mob/living/simple_animal/crab/kreb - name = "Kreb" - desc = "This is a real crab. The other crabs are simply gubbucks in disguise!" - real_name = "Kreb" - icon_state = "kreb" - icon_living = "kreb" - icon_dead = "kreb_dead" - gold_core_spawnable = NO_SPAWN - -/mob/living/simple_animal/crab/evil/kreb - name = "Evil Kreb" - real_name = "Evil Kreb" - icon_state = "evilkreb" - icon_living = "evilkreb" - icon_dead = "evilkreb_dead" - gold_core_spawnable = NO_SPAWN 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 adc07429c4d99..598695588bc57 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -27,7 +27,6 @@ maxbodytemp = 0 wander = 0 speed = 0 - healable = 0 density = FALSE pass_flags = PASSTABLE | PASSMOB sight = SEE_TURFS | SEE_OBJS @@ -45,7 +44,7 @@ unique_name = TRUE faction = list(FACTION_NEUTRAL,FACTION_SILICON,FACTION_TURRET) dextrous = TRUE - dextrous_hud_type = /datum/hud/dextrous/drone + hud_type = /datum/hud/dextrous/drone // Going for a sort of pale green here lighting_cutoff_red = 30 lighting_cutoff_green = 35 @@ -75,7 +74,7 @@ /// Default [/mob/living/simple_animal/drone/var/internal_storage] item var/obj/item/default_storage = /obj/item/storage/drone_tools /// Default [/mob/living/simple_animal/drone/var/head] item - var/obj/item/default_hatmask + var/obj/item/default_headwear /** * icon_state of drone from icons/mobs/drone.dmi * @@ -182,9 +181,16 @@ if(default_storage) var/obj/item/I = new default_storage(src) equip_to_slot_or_del(I, ITEM_SLOT_DEX_STORAGE) - if(default_hatmask) - var/obj/item/I = new default_hatmask(src) - equip_to_slot_or_del(I, ITEM_SLOT_HEAD) + + for(var/holiday_name in GLOB.holidays) + var/datum/holiday/holiday_today = GLOB.holidays[holiday_name] + var/obj/item/potential_hat = holiday_today.holiday_hat + if(!isnull(potential_hat) && isnull(default_headwear)) //If our drone type doesn't start with a hat, we take the holiday one. + default_headwear = potential_hat + + if(default_headwear) + var/obj/item/new_hat = new default_headwear(src) + equip_to_slot_or_del(new_hat, ITEM_SLOT_HEAD) ADD_TRAIT(access_card, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) 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 6c60bc855633c..d4353c95c824a 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 @@ -27,7 +27,7 @@ "2. Kill.\n"+\ "3. Destroy." default_storage = /obj/item/uplink - default_hatmask = /obj/item/clothing/head/helmet/swat + default_headwear = /obj/item/clothing/head/helmet/swat hacked = TRUE shy = FALSE flavortext = null @@ -49,7 +49,7 @@ W.implant(src, force = TRUE) /mob/living/simple_animal/drone/snowflake - default_hatmask = /obj/item/clothing/head/chameleon/drone + default_headwear = /obj/item/clothing/head/chameleon/drone /mob/living/simple_animal/drone/snowflake/Initialize(mapload) . = ..() @@ -65,7 +65,11 @@ you_are_text = "You are a Syndicate Maintenance Drone." flavour_text = "In a prior life, you maintained a Nanotrasen Research Station. Abducted from your home, you were given some upgrades... and now serve an enemy of your former masters." important_text = "" - spawner_job_path = /datum/job/ghost_role + spawner_job_path = /datum/job/syndrone + +/datum/job/syndrone + title = ROLE_SYNDICATE_DRONE + policy_index = ROLE_SYNDICATE_DRONE /obj/effect/mob_spawn/ghost_role/drone/syndrone/badass name = "badass syndrone shell" @@ -83,7 +87,7 @@ /mob/living/simple_animal/drone/polymorphed default_storage = null - default_hatmask = null + default_headwear = null picked = TRUE flavortext = null @@ -120,11 +124,15 @@ you_are_text = "You are a drone on Kosmicheskaya Stantsiya 13." flavour_text = "Something has brought you out of hibernation, and the station is in gross disrepair." important_text = "Build, repair, maintain and improve the station that housed you on activation." - spawner_job_path = /datum/job/ghost_role + spawner_job_path = /datum/job/derelict_drone + +/datum/job/derelict_drone + title = ROLE_DERELICT_DRONE + policy_index = ROLE_DERELICT_DRONE /mob/living/simple_animal/drone/derelict name = "derelict drone" - default_hatmask = /obj/item/clothing/head/costume/ushanka + default_headwear = /obj/item/clothing/head/costume/ushanka laws = \ "1. You may not involve yourself in the matters of another sentient being outside the station that housed your activation, even if such matters conflict with Law Two or Law Three, unless the other being is another Drone.\n"+\ "2. You may not harm any sentient being, regardless of intent or circumstance.\n"+\ 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 27d9a9f4dc996..9c620b8a089b8 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm @@ -19,7 +19,7 @@ return FALSE -/mob/living/simple_animal/drone/can_equip(obj/item/I, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE) +/mob/living/simple_animal/drone/can_equip(obj/item/I, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE, ignore_equipped = FALSE, indirect_action = FALSE) switch(slot) if(ITEM_SLOT_HEAD) if(head) @@ -50,37 +50,37 @@ return ITEM_SLOT_HEAD return ..() -/mob/living/simple_animal/drone/equip_to_slot(obj/item/I, slot) +/mob/living/simple_animal/drone/equip_to_slot(obj/item/equipping, slot, initial = FALSE, redraw_mob = FALSE, indirect_action = FALSE) if(!slot) return - if(!istype(I)) + if(!istype(equipping)) return - var/index = get_held_index_of_item(I) + var/index = get_held_index_of_item(equipping) if(index) held_items[index] = null update_held_items() - if(I.pulledby) - I.pulledby.stop_pulling() + if(equipping.pulledby) + equipping.pulledby.stop_pulling() - I.screen_loc = null // will get moved if inventory is visible - I.forceMove(src) - SET_PLANE_EXPLICIT(I, ABOVE_HUD_PLANE, src) + equipping.screen_loc = null // will get moved if inventory is visible + equipping.forceMove(src) + SET_PLANE_EXPLICIT(equipping, ABOVE_HUD_PLANE, src) switch(slot) if(ITEM_SLOT_HEAD) - head = I + head = equipping update_worn_head() if(ITEM_SLOT_DEX_STORAGE) - internal_storage = I + internal_storage = equipping update_inv_internal_storage() else to_chat(src, span_danger("You are trying to equip this item to an unsupported inventory slot. Report this to a coder!")) return //Call back for item being equipped to drone - I.equipped(src, slot) + equipping.on_equipped(src, slot) /mob/living/simple_animal/drone/getBackSlot() return ITEM_SLOT_DEX_STORAGE diff --git a/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm b/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm index aa9fa88252373..69c2ac3e8cf73 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm @@ -17,6 +17,15 @@ cut_overlay(I) drone_overlays[cache_index] = null +/mob/living/simple_animal/drone/update_clothing(slot_flags) + if(slot_flags & ITEM_SLOT_HEAD) + update_worn_head() + if(slot_flags & ITEM_SLOT_MASK) + update_worn_mask() + if(slot_flags & ITEM_SLOT_HANDS) + update_held_items() + if(slot_flags & (ITEM_SLOT_HANDS|ITEM_SLOT_BACKPACK|ITEM_SLOT_DEX_STORAGE)) + update_inv_internal_storage() /mob/living/simple_animal/drone/update_held_items() remove_overlay(DRONE_HANDS_LAYER) diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm deleted file mode 100644 index 04d7ac5602350..0000000000000 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ /dev/null @@ -1,120 +0,0 @@ -//goat -/mob/living/simple_animal/hostile/retaliate/goat - name = "goat" - desc = "Not known for their pleasant disposition." - icon_state = "goat" - icon_living = "goat" - icon_dead = "goat_dead" - speak = list("EHEHEHEHEH","eh?") - speak_emote = list("brays") - emote_hear = list("brays.") - emote_see = list("shakes their head.", "stamps a foot.", "glares around.") - speak_chance = 1 - turns_per_move = 5 - butcher_results = list(/obj/item/food/meat/slab = 4) - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "gently pushes aside" - response_disarm_simple = "gently push aside" - response_harm_continuous = "kicks" - response_harm_simple = "kick" - faction = list(FACTION_NEUTRAL) - mob_biotypes = MOB_ORGANIC|MOB_BEAST - attack_same = 1 - attack_verb_continuous = "kicks" - attack_verb_simple = "kick" - attack_sound = 'sound/weapons/punch1.ogg' - attack_vis_effect = ATTACK_EFFECT_KICK - health = 40 - maxHealth = 40 - minbodytemp = 180 - melee_damage_lower = 1 - melee_damage_upper = 2 - environment_smash = ENVIRONMENT_SMASH_NONE - stop_automated_movement_when_pulled = 1 - blood_volume = BLOOD_VOLUME_NORMAL - - footstep_type = FOOTSTEP_MOB_SHOE - -/mob/living/simple_animal/hostile/retaliate/goat/Initialize(mapload) - AddComponent(/datum/component/udder) - . = ..() - -/mob/living/simple_animal/hostile/retaliate/goat/Life(seconds_per_tick = SSMOBS_DT, times_fired) - . = ..() - if(.) - //chance to go crazy and start wacking stuff - if(!enemies.len && SPT_PROB(0.5, seconds_per_tick)) - Retaliate() - - if(enemies.len && SPT_PROB(5, seconds_per_tick)) - enemies.Cut() - LoseTarget() - src.visible_message(span_notice("[src] calms down.")) - if(stat != CONSCIOUS) - return - - eat_plants() - if(pulledby) - return - - for(var/direction in shuffle(list(1,2,4,8,5,6,9,10))) - var/turf/step = get_step(src, direction) - - if(!istype(step)) - return - - var/vine = locate(/obj/structure/spacevine) in step - var/mushroom = locate(/obj/structure/glowshroom) in step - var/flower = locate(/obj/structure/alien/resin/flower_bud) in step - - if(vine || mushroom || flower) - Move(step, get_dir(src, step)) - -/mob/living/simple_animal/hostile/retaliate/goat/Retaliate() - ..() - src.visible_message(span_danger("[src] gets an evil-looking gleam in [p_their()] eye.")) - -/mob/living/simple_animal/hostile/retaliate/goat/Move() - . = ..() - if(!stat) - eat_plants() - -/mob/living/simple_animal/hostile/retaliate/goat/proc/eat_plants() - var/obj/structure/spacevine/vine = locate(/obj/structure/spacevine) in loc - if(vine) - vine.eat(src) - - var/obj/structure/alien/resin/flower_bud/flower = locate(/obj/structure/alien/resin/flower_bud) in loc - if(flower) - flower.take_damage(rand(30, 50), BRUTE, 0) - - var/obj/structure/glowshroom/mushroom = locate(/obj/structure/glowshroom) in loc - if(mushroom) - qdel(mushroom) - - if((vine || flower || mushroom) && prob(10)) - say("Nom") // bon appetit - playsound(src, 'sound/items/eatfood.ogg', rand(30, 50), TRUE) - -/mob/living/simple_animal/hostile/retaliate/goat/AttackingTarget() - . = ..() - - if(!. || !isliving(target)) - return - - var/mob/living/plant_target = target - if(!(plant_target.mob_biotypes & MOB_PLANT)) - return - - plant_target.adjustBruteLoss(20) - playsound(src, 'sound/items/eatfood.ogg', rand(30, 50), TRUE) - var/obj/item/bodypart/edible_bodypart - - if(ishuman(plant_target)) - var/mob/living/carbon/human/plant_man = target - edible_bodypart = pick(plant_man.bodyparts) - edible_bodypart.dismember() - - plant_target.visible_message(span_warning("[src] takes a big chomp out of [plant_target]!"), \ - span_userdanger("[src] takes a big chomp out of your [edible_bodypart || "body"]!")) diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm deleted file mode 100644 index 00a51c5f83f91..0000000000000 --- a/code/modules/mob/living/simple_animal/friendly/fox.dm +++ /dev/null @@ -1,43 +0,0 @@ -//Foxxy -/mob/living/simple_animal/pet/fox - name = "fox" - desc = "They're a fox." - icon = 'icons/mob/simple/pets.dmi' - icon_state = "fox" - icon_living = "fox" - icon_dead = "fox_dead" - speak = list("Ack-Ack","Ack-Ack-Ack-Ackawoooo","Geckers","Awoo","Tchoff") - speak_emote = list("geckers", "barks") - emote_hear = list("howls.","barks.") - emote_see = list("shakes their head.", "shivers.") - speak_chance = 1 - turns_per_move = 5 - butcher_results = list(/obj/item/food/meat/slab = 3) - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "gently pushes aside" - response_disarm_simple = "gently push aside" - response_harm_continuous = "kicks" - response_harm_simple = "kick" - gold_core_spawnable = FRIENDLY_SPAWN - can_be_held = TRUE - held_state = "fox" - ///In the case 'melee_damage_upper' is somehow raised above 0 - attack_verb_continuous = "bites" - attack_verb_simple = "bite" - attack_sound = 'sound/weapons/bite.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE - - footstep_type = FOOTSTEP_MOB_CLAW - -/mob/living/simple_animal/pet/fox/Initialize(mapload) - . = ..() - AddElement(/datum/element/pet_bonus, "pants and yaps happily!") - -//Captain fox -/mob/living/simple_animal/pet/fox/renault - name = "Renault" - desc = "Renault, the Captain's trustworthy fox." - gender = FEMALE - gold_core_spawnable = NO_SPAWN - unique_pet = TRUE diff --git a/code/modules/mob/living/simple_animal/friendly/penguin.dm b/code/modules/mob/living/simple_animal/friendly/penguin.dm deleted file mode 100644 index 151731e4849e1..0000000000000 --- a/code/modules/mob/living/simple_animal/friendly/penguin.dm +++ /dev/null @@ -1,59 +0,0 @@ -//Penguins - -/mob/living/simple_animal/pet/penguin - gender = MALE - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "bops" - response_disarm_simple = "bop" - response_harm_continuous = "kicks" - response_harm_simple = "kick" - speak = list("Gah Gah!", "NOOT NOOT!", "NOOT!", "Noot", "noot", "Prah!", "Grah!") - speak_emote = list("squawks", "gakkers") - emote_hear = list("squawk!", "gakkers!", "noots.","NOOTS!") - emote_see = list("shakes his beak.", "flaps his wings.","preens himself.") - faction = list(FACTION_PENGUIN) - minbodytemp = 0 - speak_chance = 1 - turns_per_move = 10 - icon = 'icons/mob/simple/penguins.dmi' - butcher_results = list(/obj/item/organ/internal/ears/penguin = 1, /obj/item/food/meat/slab/penguin = 3) - - footstep_type = FOOTSTEP_MOB_BAREFOOT - -/mob/living/simple_animal/pet/penguin/Initialize(mapload) - . = ..() - AddElement(/datum/element/pet_bonus, "honks happily!") - AddElement(/datum/element/waddling) - -/mob/living/simple_animal/pet/penguin/emperor - name = "Emperor penguin" - real_name = "penguin" - desc = "Emperor of all he surveys." - icon_state = "penguin" - icon_living = "penguin" - icon_dead = "penguin_dead" - gold_core_spawnable = FRIENDLY_SPAWN - butcher_results = list(/obj/item/organ/internal/ears/penguin = 1, /obj/item/food/meat/slab/penguin = 3) - -/mob/living/simple_animal/pet/penguin/emperor/shamebrero - name = "Shamebrero penguin" - desc = "Shameful of all he surveys." - icon_state = "penguin_shamebrero" - icon_living = "penguin_shamebrero" - gold_core_spawnable = NO_SPAWN - unique_pet = TRUE - -/mob/living/simple_animal/pet/penguin/baby - speak = list("gah", "noot noot", "noot!", "noot", "squeee!", "noo!") - name = "Penguin chick" - real_name = "penguin" - desc = "Can't fly and barely waddles, yet the prince of all chicks." - icon_state = "penguin_baby" - icon_living = "penguin_baby" - icon_dead = "penguin_baby_dead" - density = FALSE - pass_flags = PASSMOB - mob_size = MOB_SIZE_SMALL - butcher_results = list(/obj/item/organ/internal/ears/penguin = 1, /obj/item/food/meat/slab/penguin = 1) - diff --git a/code/modules/mob/living/simple_animal/friendly/pet.dm b/code/modules/mob/living/simple_animal/friendly/pet.dm index 2c509d799ee0c..084ce1577e4a8 100644 --- a/code/modules/mob/living/simple_animal/friendly/pet.dm +++ b/code/modules/mob/living/simple_animal/friendly/pet.dm @@ -75,10 +75,10 @@ . = ..() add_memory_in_range(src, 7, /datum/memory/pet_died, deuteragonist = src) //Protagonist is the person memorizing it -/mob/living/simple_animal/pet/handle_atom_del(atom/deleting_atom) +/mob/living/simple_animal/pet/Exited(atom/movable/gone, direction) . = ..() - if(deleting_atom != collar) + if(gone != collar) return collar = null diff --git a/code/modules/mob/living/simple_animal/friendly/robot_customer.dm b/code/modules/mob/living/simple_animal/friendly/robot_customer.dm deleted file mode 100644 index 13eac2939f3f2..0000000000000 --- a/code/modules/mob/living/simple_animal/friendly/robot_customer.dm +++ /dev/null @@ -1,102 +0,0 @@ -///Robot customers -/mob/living/simple_animal/robot_customer - name = "space-tourist bot" - maxHealth = 150 - health = 150 - desc = "I wonder what they'll order..." - gender = NEUTER - icon = 'icons/mob/simple/tourists.dmi' - icon_state = "amerifat" - icon_living = "amerifat" - ///Override so it uses datum ai - can_have_ai = FALSE - AIStatus = AI_OFF - del_on_death = TRUE - mob_biotypes = MOB_ROBOTIC|MOB_HUMANOID - sentience_type = SENTIENCE_ARTIFICIAL - ai_controller = /datum/ai_controller/robot_customer - unsuitable_atmos_damage = 0 - minbodytemp = 0 - maxbodytemp = 1000 - var/clothes_set = "amerifat_clothes" - var/datum/atom_hud/hud_to_show_on_hover - - -/mob/living/simple_animal/robot_customer/Initialize(mapload, datum/customer_data/customer_data = /datum/customer_data/american, datum/venue/attending_venue = SSrestaurant.all_venues[/datum/venue/restaurant]) - ADD_TRAIT(src, list(TRAIT_NOMOBSWAP, TRAIT_NO_TELEPORT, TRAIT_STRONG_GRABBER), INNATE_TRAIT) // never suffer a bitch to fuck with you - AddElement(/datum/element/footstep, FOOTSTEP_OBJ_ROBOT, 1, -6, sound_vary = TRUE) - var/datum/customer_data/customer_info = SSrestaurant.all_customers[customer_data] - clothes_set = pick(customer_info.clothing_sets) - ai_controller = customer_info.ai_controller_used - . = ..() - ai_controller.set_blackboard_key(BB_CUSTOMER_CUSTOMERINFO, customer_info) - ai_controller.set_blackboard_key(BB_CUSTOMER_ATTENDING_VENUE, attending_venue) - ai_controller.set_blackboard_key(BB_CUSTOMER_PATIENCE, customer_info.total_patience) - icon = customer_info.base_icon - icon_state = customer_info.base_icon_state - name = "[pick(customer_info.name_prefixes)]-bot" - color = rgb(rand(80,255), rand(80,255), rand(80,255)) - update_icon() - -///Clean up on the mobs seat etc when its deleted (Either by murder or because it left) -/mob/living/simple_animal/robot_customer/Destroy() - var/datum/venue/attending_venue = ai_controller.blackboard[BB_CUSTOMER_ATTENDING_VENUE] - var/obj/structure/holosign/robot_seat/our_seat = ai_controller.blackboard[BB_CUSTOMER_MY_SEAT] - attending_venue.current_visitors -= src - if(attending_venue.linked_seats[our_seat]) - attending_venue.linked_seats[our_seat] = null - QDEL_NULL(hud_to_show_on_hover) - return ..() - -///Robots need robot gibs...! -/mob/living/simple_animal/robot_customer/spawn_gibs() - new /obj/effect/gibspawner/robot(drop_location(), src) - -/mob/living/simple_animal/robot_customer/MouseEntered(location, control, params) - . = ..() - hud_to_show_on_hover?.show_to(usr) - -/mob/living/simple_animal/robot_customer/MouseExited(location, control, params) - . = ..() - hud_to_show_on_hover?.hide_from(usr) - -/mob/living/simple_animal/robot_customer/update_overlays() - . = ..() - - var/datum/customer_data/customer_info = ai_controller.blackboard[BB_CUSTOMER_CUSTOMERINFO] - - var/new_underlays = customer_info.get_underlays(src) - if (new_underlays) - underlays.Cut() - underlays += new_underlays - - var/mutable_appearance/features = mutable_appearance(icon, "[icon_state]_features") - features.appearance_flags = RESET_COLOR - . += features - - var/mutable_appearance/clothes = mutable_appearance(icon, clothes_set) - clothes.appearance_flags = RESET_COLOR - . += clothes - - var/bonus_overlays = customer_info.get_overlays(src) - if(bonus_overlays) - . += bonus_overlays - -/mob/living/simple_animal/robot_customer/send_speech(message, message_range, obj/source, bubble_type, list/spans, datum/language/message_language, list/message_mods, forced, tts_message, list/tts_filter) - . = ..() - var/datum/customer_data/customer_info = ai_controller.blackboard[BB_CUSTOMER_CUSTOMERINFO] - playsound(src, customer_info.speech_sound, 30, extrarange = MEDIUM_RANGE_SOUND_EXTRARANGE, falloff_distance = 5) - -/mob/living/simple_animal/robot_customer/examine(mob/user) - . = ..() - // this should be handled by the ai controller - if(ai_controller.blackboard[BB_CUSTOMER_CURRENT_ORDER]) - var/datum/venue/attending_venue = ai_controller.blackboard[BB_CUSTOMER_ATTENDING_VENUE] - var/wanted_item = ai_controller.blackboard[BB_CUSTOMER_CURRENT_ORDER] - var/order - if(istype(wanted_item, /datum/custom_order)) - var/datum/custom_order/custom_order = wanted_item - order = custom_order.get_order_line(attending_venue) - else - order = attending_venue.order_food_line(wanted_item) - . += span_notice("Their order was: \"[order].\"") diff --git a/code/modules/mob/living/simple_animal/friendly/sloth.dm b/code/modules/mob/living/simple_animal/friendly/sloth.dm deleted file mode 100644 index 8e308c58d12d2..0000000000000 --- a/code/modules/mob/living/simple_animal/friendly/sloth.dm +++ /dev/null @@ -1,68 +0,0 @@ -GLOBAL_DATUM(cargo_sloth, /mob/living/simple_animal/sloth) - -/mob/living/simple_animal/sloth - name = "sloth" - desc = "An adorable, sleepy creature." - icon = 'icons/mob/simple/pets.dmi' - icon_state = "sloth" - icon_living = "sloth" - icon_dead = "sloth_dead" - speak_emote = list("yawns") - emote_hear = list("snores.","yawns.") - emote_see = list("dozes off.", "looks around sleepily.") - speak_chance = 1 - turns_per_move = 5 - can_be_held = TRUE - butcher_results = list(/obj/item/food/meat/slab = 3) - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "gently pushes aside" - response_disarm_simple = "gently push aside" - response_harm_continuous = "kicks" - response_harm_simple = "kick" - mob_biotypes = MOB_ORGANIC|MOB_BEAST - gold_core_spawnable = FRIENDLY_SPAWN - melee_damage_lower = 18 - melee_damage_upper = 18 - health = 50 - maxHealth = 50 - speed = 10 - held_state = "sloth" - ///In the case 'melee_damage_upper' is somehow raised above 0 - attack_verb_continuous = "bites" - attack_verb_simple = "bite" - attack_sound = 'sound/weapons/bite.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE - - footstep_type = FOOTSTEP_MOB_CLAW - -/mob/living/simple_animal/sloth/Initialize(mapload) - . = ..() - AddElement(/datum/element/pet_bonus, "slowly smiles!") - // If someone adds non-cargo sloths to maps we'll have a problem but we're fine for now - if(!GLOB.cargo_sloth && mapload && is_station_level(z)) - GLOB.cargo_sloth = src - -/mob/living/simple_animal/sloth/Destroy() - if(GLOB.cargo_sloth == src) - GLOB.cargo_sloth = null - - return ..() - -//Cargo Sloth -/mob/living/simple_animal/sloth/paperwork - name = "Paperwork" - desc = "Cargo's pet sloth. About as useful as the rest of the techs." - gold_core_spawnable = NO_SPAWN - -//Cargo Sloth 2 - -/mob/living/simple_animal/sloth/citrus - name = "Citrus" - desc = "Cargo's pet sloth. She's dressed in a horrible sweater." - icon_state = "cool_sloth" - icon_living = "cool_sloth" - icon_dead = "cool_sloth_dead" - gender = FEMALE - butcher_results = list(/obj/item/toy/spinningtoy = 1) - gold_core_spawnable = NO_SPAWN diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index ba9ba705fa08a..ea5e0685b53fe 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -29,7 +29,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians attack_verb_simple = "punch" maxHealth = INFINITY //The spirit itself is invincible health = INFINITY - healable = FALSE //don't brusepack the guardian + mob_biotypes = MOB_BEAST damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) //how much damage from each damage type we transfer to the owner environment_smash = ENVIRONMENT_SMASH_STRUCTURES obj_damage = 40 @@ -43,7 +43,6 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians light_range = 3 light_on = FALSE hud_type = /datum/hud/guardian - dextrous_hud_type = /datum/hud/dextrous/guardian //if we're set to dextrous, account for it. faction = list() /// The guardian's color, used for their sprite, chat, and some effects made by it. @@ -123,7 +122,6 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians summoner.faction += "[REF(src)]" remove_all_languages(LANGUAGE_MASTER) copy_languages(to_who, LANGUAGE_MASTER) // make sure holoparasites speak same language as master - update_atom_languages() RegisterSignal(to_who, COMSIG_MOVABLE_MOVED, PROC_REF(check_distance)) RegisterSignal(to_who, COMSIG_QDELETING, PROC_REF(on_summoner_deletion)) RegisterSignal(to_who, COMSIG_LIVING_DEATH, PROC_REF(on_summoner_death)) @@ -367,10 +365,10 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians return ..() /mob/living/simple_animal/hostile/guardian/death(gibbed) - . = ..() if(!QDELETED(summoner)) to_chat(summoner, span_bolddanger("Your [name] died somehow!")) summoner.dust() + return ..() /mob/living/simple_animal/hostile/guardian/update_health_hud() var/severity = 0 @@ -408,10 +406,9 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians return to_chat(summoner, span_bolddanger("Your [name] is under attack! You take damage!")) summoner.visible_message(span_bolddanger("Blood sprays from [summoner] as [src] takes damage!")) - switch(summoner.stat) - if(UNCONSCIOUS, HARD_CRIT) - to_chat(summoner, span_bolddanger("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 + if(summoner.stat == UNCONSCIOUS || summoner.stat == HARD_CRIT) + to_chat(summoner, span_bolddanger("Your head pounds, you can't take the strain of sustaining [src] in this condition!")) + summoner.adjustOrganLoss(ORGAN_SLOT_BRAIN, amount * 0.5) /mob/living/simple_animal/hostile/guardian/ex_act(severity, target) switch(severity) @@ -434,25 +431,25 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians //HAND HANDLING -/mob/living/simple_animal/hostile/guardian/equip_to_slot(obj/item/equipped_item, slot) +/mob/living/simple_animal/hostile/guardian/equip_to_slot(obj/item/equipping, slot, initial = FALSE, redraw_mob = FALSE, indirect_action = FALSE) if(!slot) return FALSE - if(!istype(equipped_item)) + if(!istype(equipping)) return FALSE . = TRUE - var/index = get_held_index_of_item(equipped_item) + var/index = get_held_index_of_item(equipping) if(index) held_items[index] = null update_held_items() - if(equipped_item.pulledby) - equipped_item.pulledby.stop_pulling() + if(equipping.pulledby) + equipping.pulledby.stop_pulling() - equipped_item.screen_loc = null // will get moved if inventory is visible - equipped_item.forceMove(src) - equipped_item.equipped(src, slot) - SET_PLANE_EXPLICIT(equipped_item, ABOVE_HUD_PLANE, src) + equipping.screen_loc = null // will get moved if inventory is visible + equipping.forceMove(src) + SET_PLANE_EXPLICIT(equipping, ABOVE_HUD_PLANE, src) + equipping.on_equipped(src, slot) /mob/living/simple_animal/hostile/guardian/proc/apply_overlay(cache_index) if((. = guardian_overlays[cache_index])) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian_creator.dm b/code/modules/mob/living/simple_animal/guardian/guardian_creator.dm index b06ff2447d2e9..ebd5658f07f4b 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian_creator.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian_creator.dm @@ -87,9 +87,10 @@ GLOBAL_LIST_INIT(guardian_radial_images, setup_guardian_radial()) if(LAZYLEN(candidates)) var/mob/dead/observer/candidate = pick(candidates) spawn_guardian(user, candidate, guardian_path) + used = TRUE + SEND_SIGNAL(src, COMSIG_TRAITOR_ITEM_USED(type)) else to_chat(user, failure_message) - used = FALSE /obj/item/guardiancreator/proc/spawn_guardian(mob/living/user, mob/dead/candidate, guardian_path) if(QDELETED(user) || user.stat == DEAD) @@ -192,7 +193,7 @@ GLOBAL_LIST_INIT(guardian_radial_images, setup_guardian_radial()) /obj/item/guardiancreator/miner name = "dusty shard" desc = "Seems to be a very old rock, may have originated from a strange meteor." - icon = 'icons/obj/lavaland/artefacts.dmi' + icon = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "dustyshard" theme = GUARDIAN_THEME_MINER mob_name = "Power Miner" 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 bdbc0e8f4d343..dc4d8a004c6e7 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm @@ -12,6 +12,7 @@ creator_desc = "Does low damage on attack, but is capable of holding items and storing a single item within it. It will drop items held in its hands when it recalls, but it will retain the stored item." creator_icon = "dextrous" dextrous = TRUE + hud_type = /datum/hud/dextrous/guardian held_items = list(null, null) var/obj/item/internal_storage //what we're storing within ourself @@ -52,7 +53,7 @@ return TRUE return FALSE -/mob/living/simple_animal/hostile/guardian/dextrous/can_equip(obj/item/equipped_item, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE) +/mob/living/simple_animal/hostile/guardian/dextrous/can_equip(obj/item/equipped_item, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE, ignore_equipped = FALSE) switch(slot) if(ITEM_SLOT_DEX_STORAGE) if(internal_storage) @@ -70,13 +71,13 @@ return ITEM_SLOT_DEX_STORAGE return ..() -/mob/living/simple_animal/hostile/guardian/dextrous/equip_to_slot(obj/item/equipped_item, slot) +/mob/living/simple_animal/hostile/guardian/dextrous/equip_to_slot(obj/item/equipping, slot, initial = FALSE, redraw_mob = FALSE, indirect_action = FALSE) if(!..()) return switch(slot) if(ITEM_SLOT_DEX_STORAGE) - internal_storage = equipped_item + internal_storage = equipping update_inv_internal_storage() else to_chat(src, span_danger("You are trying to equip this item to an unsupported inventory slot. Report this to a coder!")) diff --git a/code/modules/mob/living/simple_animal/guardian/types/protector.dm b/code/modules/mob/living/simple_animal/guardian/types/protector.dm index 584041752a85e..4809c3dc1c6bb 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/protector.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/protector.dm @@ -35,7 +35,7 @@ /mob/living/simple_animal/hostile/guardian/protector/adjustHealth(amount, updating_health = TRUE, forced = FALSE) . = ..() if(. > 0 && toggle) - var/image/flash_overlay = new('icons/effects/effects.dmi', src, "shield-flash", layer+0.01, dir = pick(GLOB.cardinals)) + var/image/flash_overlay = new('icons/effects/effects.dmi', src, "shield-flash", dir = pick(GLOB.cardinals)) flash_overlay.color = guardian_color flick_overlay_view(flash_overlay, 0.5 SECONDS) 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 2bcfb63974945..9afdf231ce7c4 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/support.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm @@ -47,10 +47,13 @@ span_userdanger("[src] heals you!"), null, COMBAT_MESSAGE_RANGE, src) to_chat(src, span_notice("You heal [target]!")) playsound(target, attack_sound, 50, TRUE, TRUE, frequency = -1) //play punch in REVERSE - target.adjustBruteLoss(-healing_amount) - target.adjustFireLoss(-healing_amount) - target.adjustOxyLoss(-healing_amount) - target.adjustToxLoss(-healing_amount) + var/need_mob_update + need_mob_update = target.adjustBruteLoss(-healing_amount, updating_health = FALSE) + need_mob_update += target.adjustFireLoss(-healing_amount, updating_health = FALSE) + need_mob_update += target.adjustOxyLoss(-healing_amount, updating_health = FALSE) + need_mob_update += target.adjustToxLoss(-healing_amount, updating_health = FALSE, forced = TRUE) + if(need_mob_update) + target.updatehealth() var/obj/effect/temp_visual/heal/heal_effect = new /obj/effect/temp_visual/heal(get_turf(target)) heal_effect.color = guardian_color diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index b392417aab29e..2d17820af0b40 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -32,7 +32,7 @@ lighting_cutoff_red = 30 lighting_cutoff_green = 15 lighting_cutoff_blue = 50 - unique_name = 1 + unique_name = TRUE gold_core_spawnable = NO_SPAWN death_sound = 'sound/voice/hiss6.ogg' death_message = "lets out a waning guttural screech, green blood bubbling from its maw..." @@ -91,7 +91,7 @@ projectiletype = /obj/projectile/neurotoxin/damaging projectilesound = 'sound/weapons/pierce.ogg' status_flags = 0 - unique_name = 0 + unique_name = FALSE var/sterile = 1 var/plants_off = 0 var/egg_cooldown = 30 diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm deleted file mode 100644 index ccbc4171c5902..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ /dev/null @@ -1,187 +0,0 @@ -//Space bears! -/mob/living/simple_animal/hostile/bear - name = "space bear" - desc = "You don't need to be faster than a space bear, you just need to outrun your crewmates." - icon_state = "bear" - icon_living = "bear" - icon_dead = "bear_dead" - icon_gib = "bear_gib" - mob_biotypes = MOB_ORGANIC|MOB_BEAST - speak = list("RAWR!","Rawr!","GRR!","Growl!") - speak_emote = list("growls", "roars") - emote_hear = list("rawrs.","grumbles.","grawls.") - emote_taunt = list("stares ferociously", "stomps") - speak_chance = 1 - taunt_chance = 25 - turns_per_move = 5 - butcher_results = list(/obj/item/food/meat/slab/bear = 5, /obj/item/clothing/head/costume/bearpelt = 1) - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "gently pushes aside" - response_disarm_simple = "gently push aside" - maxHealth = 60 - health = 60 - speed = 0 - - obj_damage = 60 - melee_damage_lower = 15 // i know it's like half what it used to be, but bears cause bleeding like crazy now so it works out - melee_damage_upper = 15 - wound_bonus = -5 - bare_wound_bonus = 10 // BEAR wound bonus am i right - sharpness = SHARP_EDGED - attack_verb_continuous = "claws" - attack_verb_simple = "claw" - attack_sound = 'sound/weapons/bladeslice.ogg' - attack_vis_effect = ATTACK_EFFECT_CLAW - friendly_verb_continuous = "bear hugs" - friendly_verb_simple = "bear hug" - - //Space bears aren't affected by cold. - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - maxbodytemp = 1500 - - faction = list(FACTION_RUSSIAN) - - footstep_type = FOOTSTEP_MOB_CLAW - - var/armored = FALSE - -/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() - . = ..() - if(!. || !client) - return FALSE - - AddElement(/datum/element/ridable, /datum/component/riding/creature/bear) - can_buckle = TRUE - buckle_lying = 0 - -/mob/living/simple_animal/hostile/bear/update_icons() - ..() - if(armored) - add_overlay("armor_bear") - -//SPACE BEARS! SQUEEEEEEEE~ OW! FUCK! IT BIT MY HAND OFF!! -/mob/living/simple_animal/hostile/bear/hudson - name = "Hudson" - gender = MALE - desc = "Feared outlaw, this guy is one bad news bear." //I'm sorry... - -/mob/living/simple_animal/hostile/bear/snow - name = "space polar bear" - icon_state = "snowbear" - icon_living = "snowbear" - icon_dead = "snowbear_dead" - desc = "It's a polar bear, in space, but not actually in space." - weather_immunities = list(TRAIT_SNOWSTORM_IMMUNE) - -/mob/living/simple_animal/hostile/bear/russian - name = "combat bear" - desc = "A ferocious brown bear decked out in armor plating, a red star with yellow outlining details the shoulder plating." - icon_state = "combatbear" - icon_living = "combatbear" - icon_dead = "combatbear_dead" - faction = list(FACTION_RUSSIAN) - butcher_results = list(/obj/item/food/meat/slab/bear = 5, /obj/item/clothing/head/costume/bearpelt = 1, /obj/item/bear_armor = 1) - melee_damage_lower = 18 - melee_damage_upper = 20 - wound_bonus = 0 - armour_penetration = 20 - health = 120 - maxHealth = 120 - armored = TRUE - gold_core_spawnable = HOSTILE_SPAWN - -/obj/item/bear_armor - name = "pile of bear armor" - desc = "A scattered pile of various shaped armor pieces fitted for a bear, some duct tape, and a nail filer. Crude instructions \ - are written on the back of one of the plates in russian. This seems like an awful idea." - icon = 'icons/obj/objects.dmi' - icon_state = "bear_armor_upgrade" - -/obj/item/bear_armor/afterattack(atom/target, mob/user, proximity_flag) - . = ..() - if(istype(target, /mob/living/simple_animal/hostile/bear) && proximity_flag) - var/mob/living/simple_animal/hostile/bear/A = target - if(A.armored) - to_chat(user, span_warning("[A] has already been armored up!")) - return - A.armored = TRUE - A.maxHealth += 60 - A.health += 60 - A.armour_penetration += 20 - A.melee_damage_lower += 3 - A.melee_damage_upper += 5 - A.wound_bonus += 5 - A.update_icons() - to_chat(user, span_info("You strap the armor plating to [A] and sharpen [A.p_their()] claws with the nail filer. This was a great idea.")) - qdel(src) - -/mob/living/simple_animal/hostile/bear/butter //The mighty companion to Cak. Several functions used from it. - name = "Terrygold" - icon_state = "butterbear" - icon_living = "butterbear" - icon_dead = "butterbear_dead" - desc = "I can't believe its not a bear!" - faction = list(FACTION_NEUTRAL, FACTION_RUSSIAN) - obj_damage = 11 - melee_damage_lower = 0 - melee_damage_upper = 0 - sharpness = NONE //it's made of butter - armour_penetration = 0 - response_harm_continuous = "takes a bite out of" - response_harm_simple = "take a bite out of" - attacked_sound = 'sound/items/eatfood.ogg' - death_message = "loses its false life and collapses!" - butcher_results = list(/obj/item/food/butter = 6, /obj/item/food/meat/slab = 3, /obj/item/organ/internal/brain = 1, /obj/item/organ/internal/heart = 1) - attack_sound = 'sound/weapons/slap.ogg' - attack_vis_effect = ATTACK_EFFECT_DISARM - 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(seconds_per_tick = SSMOBS_DT, times_fired) //Heals butter bear really fast when he takes damage. - if(stat) - return - if(health < maxHealth) - heal_overall_damage(5 * seconds_per_tick) //Fast life regen, makes it hard for you to get eaten to death. - -/mob/living/simple_animal/hostile/bear/butter/attack_hand(mob/living/user, list/modifiers) //Borrowed code from Cak, feeds people if they hit you. More nutriment but less vitamin to represent BUTTER. - ..() - if(user.combat_mode && user.reagents && !stat) - user.reagents.add_reagent(/datum/reagent/consumable/nutriment, 1) - user.reagents.add_reagent(/datum/reagent/consumable/nutriment/vitamin, 0.1) - -/mob/living/simple_animal/hostile/bear/butter/CheckParts(list/parts) //Borrowed code from Cak, allows the brain used to actually control the bear. - ..() - var/obj/item/organ/internal/brain/candidate = locate(/obj/item/organ/internal/brain) in contents - if(!candidate || !candidate.brainmob || !candidate.brainmob.mind) - return - candidate.brainmob.mind.transfer_to(src) - to_chat(src, "[span_boldbig("You are a butter bear!")] You're a mostly harmless bear/butter hybrid that everyone loves. People can take bites out of you if they're hungry, but you regenerate health \ - so quickly that it generally doesn't matter. You're remarkably resilient to any damage besides this and it's hard for you to really die at all. You should go around and bring happiness and \ - free butter to the station!") - var/default_name = "Terrygold" - var/new_name = sanitize_name(reject_bad_text(tgui_input_text(src, "You are the [name]. Would you like to change your name to something else?", "Name change", default_name, MAX_NAME_LEN)), cap_after_symbols = FALSE) - if(new_name) - to_chat(src, span_notice("Your name is now [new_name]!")) - name = new_name - -/mob/living/simple_animal/hostile/bear/butter/AttackingTarget() //Makes the butter bear's attacks against vertical targets slip said targets - . = ..() - if(isliving(target)) //we don't check for . here, since attack_animal() (and thus AttackingTarget()) will return false if your damage dealt is 0 - var/mob/living/L = target - if((L.body_position == STANDING_UP)) - L.Knockdown(20) - playsound(loc, 'sound/misc/slip.ogg', 15) - L.visible_message(span_danger("[L] slips on [src]'s butter!")) diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm deleted file mode 100644 index 7f65dcd459ba6..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ /dev/null @@ -1,401 +0,0 @@ - -#define BEE_IDLE_ROAMING 70 //The value of idle at which a bee in a beebox will try to wander -#define BEE_IDLE_GOHOME 0 //The value of idle at which a bee will try to go home -#define BEE_PROB_GOHOME 35 //Probability to go home when idle is below BEE_IDLE_GOHOME -#define BEE_PROB_GOROAM 5 //Probability to go roaming when idle is above BEE_IDLE_ROAMING -#define BEE_TRAY_RECENT_VISIT 200 //How long in deciseconds until a tray can be visited by a bee again -#define BEE_DEFAULT_COLOUR "#e5e500" //the colour we make the stripes of the bee if our reagent has no colour (or we have no reagent) - -#define BEE_POLLINATE_YIELD_CHANCE 33 -#define BEE_POLLINATE_PEST_CHANCE 33 -#define BEE_POLLINATE_POTENCY_CHANCE 50 - -#define BEE_FOODGROUPS RAW | MEAT | GORE | BUGS - -/mob/living/simple_animal/hostile/bee - name = "bee" - desc = "Buzzy buzzy bee, stingy sti- Ouch!" - icon_state = "" - icon_living = "" - icon = 'icons/mob/simple/bees.dmi' - gender = FEMALE - speak_emote = list("buzzes") - emote_hear = list("buzzes") - turns_per_move = 0 - melee_damage_lower = 1 - melee_damage_upper = 1 - attack_verb_continuous = "stings" - attack_verb_simple = "sting" - response_help_continuous = "shoos" - response_help_simple = "shoo" - response_disarm_continuous = "swats away" - response_disarm_simple = "swat away" - response_harm_continuous = "squashes" - response_harm_simple = "squash" - maxHealth = 10 - health = 10 - faction = list(FACTION_HOSTILE) - move_to_delay = 0 - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - pass_flags = PASSTABLE | PASSGRILLE | PASSMOB - density = FALSE - mob_size = MOB_SIZE_TINY - mob_biotypes = MOB_ORGANIC|MOB_BUG - gold_core_spawnable = FRIENDLY_SPAWN - search_objects = 1 //have to find those plant trays! - can_be_held = TRUE - held_w_class = WEIGHT_CLASS_TINY - - //Spaceborn beings don't get hurt by space - 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 - del_on_death = 1 - - var/datum/reagent/beegent = null //hehe, beegent - var/obj/structure/beebox/beehome = null - var/idle = 0 - var/isqueen = FALSE - var/icon_base = "bee" - var/static/beehometypecache = typecacheof(/obj/structure/beebox) - var/static/hydroponicstypecache = typecacheof(/obj/machinery/hydroponics) - -/mob/living/simple_animal/hostile/bee/Initialize(mapload) - . = ..() - add_traits(list(TRAIT_SPACEWALK, TRAIT_VENTCRAWLER_ALWAYS), INNATE_TRAIT) - generate_bee_visuals() - 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(mob/living/L) - if(flags_1 & HOLOGRAM_1) - return - var/obj/item/clothing/head/mob_holder/destructible/holder = new(get_turf(src), src, held_state, head_icon, held_lh, held_rh, worn_slot_flags) - var/list/reee = list(/datum/reagent/consumable/nutriment/vitamin = 5) - if(beegent) - reee[beegent.type] = 5 - holder.AddComponent(/datum/component/edible, reee, null, BEE_FOODGROUPS, 10, 0, list("bee"), null, 10) - L.visible_message(span_warning("[L] scoops up [src]!")) - L.put_in_hands(holder) - -/mob/living/simple_animal/hostile/bee/Destroy() - if(beehome) - beehome.bees -= src - beehome = null - beegent = null - return ..() - - -/mob/living/simple_animal/hostile/bee/death(gibbed) - if(beehome) - beehome.bees -= src - beehome = null - if((flags_1 & HOLOGRAM_1)) - return ..() - var/obj/item/trash/bee/bee_to_eat = new(loc) - bee_to_eat.pixel_x = pixel_x - bee_to_eat.pixel_y = pixel_y - if(beegent) - bee_to_eat.beegent = beegent - bee_to_eat.reagents.add_reagent(beegent.type, 5) - bee_to_eat.update_appearance() - beegent = null - return ..() - - -/mob/living/simple_animal/hostile/bee/examine(mob/user) - . = ..() - - if(!beehome) - . += span_warning("This bee is homeless!") - -/mob/living/simple_animal/hostile/bee/ListTargets() // Bee processing is expessive, so we override them finding targets here. - if(!search_objects) //In case we want to have purely hostile bees - return ..() - else - . = list() // The following code is only very slightly slower than just returning oview(vision_range, targets_from), but it saves us much more work down the line - var/atom/target_from = GET_TARGETS_FROM(src) - var/list/searched_for = oview(vision_range, target_from) - for(var/obj/A in searched_for) - . += A - for(var/mob/A in searched_for) - . += A - -/mob/living/simple_animal/hostile/bee/proc/generate_bee_visuals() - cut_overlays() - - var/col = BEE_DEFAULT_COLOUR - if(beegent?.color) - col = beegent.color - - icon_state = "[icon_base]_base" - add_overlay("[icon_base]_base") - - var/static/mutable_appearance/greyscale_overlay - greyscale_overlay = greyscale_overlay || mutable_appearance('icons/mob/simple/bees.dmi') - greyscale_overlay.icon_state = "[icon_base]_grey" - greyscale_overlay.color = col - add_overlay(greyscale_overlay) - - add_overlay("[icon_base]_wings") - - -//We don't attack beekeepers/people dressed as bees//Todo: bee costume -/mob/living/simple_animal/hostile/bee/CanAttack(atom/the_target) - . = ..() - if(!.) - return FALSE - if(isliving(the_target)) - var/mob/living/H = the_target - return !H.bee_friendly() - - -/mob/living/simple_animal/hostile/bee/Found(atom/A) - if(isliving(A)) - var/mob/living/H = A - return !H.bee_friendly() - if(istype(A, /obj/machinery/hydroponics)) - var/obj/machinery/hydroponics/Hydro = A - if(Hydro.myseed && Hydro.plant_status != HYDROTRAY_PLANT_DEAD && !Hydro.recent_bee_visit) - wanted_objects |= hydroponicstypecache //so we only hunt them while they're alive/seeded/not visisted - return TRUE - return FALSE - - -/mob/living/simple_animal/hostile/bee/AttackingTarget() - //Pollinate - if(istype(target, /obj/machinery/hydroponics)) - var/obj/machinery/hydroponics/Hydro = target - pollinate(Hydro) - else if(istype(target, /obj/structure/beebox)) - if(target == beehome) - var/obj/structure/beebox/BB = target - forceMove(BB) - toggle_ai(AI_IDLE) - LoseTarget() - wanted_objects -= beehometypecache //so we don't attack beeboxes when not going home - return //no don't attack the goddamm box - else - . = ..() - 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)) - -/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 - //clear the old since this one is going to have some new value - RemoveElement(/datum/element/venomous) - var/static/list/injection_range = list(1, 5) - AddElement(/datum/element/venomous, beegent.type, injection_range) - generate_bee_visuals() - -/mob/living/simple_animal/hostile/bee/proc/pollinate(obj/machinery/hydroponics/Hydro) - if(!istype(Hydro) || !Hydro.myseed || Hydro.plant_status == HYDROTRAY_PLANT_DEAD || Hydro.recent_bee_visit) - LoseTarget() - return - - LoseTarget() //so we pick a new hydro tray next FindTarget(), instead of loving the same plant for eternity - wanted_objects -= hydroponicstypecache //so we only hunt them while they're alive/seeded/not visisted - Hydro.recent_bee_visit = TRUE - addtimer(VARSET_CALLBACK(Hydro, recent_bee_visit, FALSE), BEE_TRAY_RECENT_VISIT) - - var/growth = health //Health also means how many bees are in the swarm, roughly. - //better healthier plants! - Hydro.adjust_plant_health(growth*0.5) - if(prob(BEE_POLLINATE_PEST_CHANCE)) - Hydro.adjust_pestlevel(-10) - if(prob(BEE_POLLINATE_YIELD_CHANCE)) - Hydro.myseed.adjust_yield(1) - Hydro.yieldmod = 2 - if(prob(BEE_POLLINATE_POTENCY_CHANCE)) - Hydro.myseed.adjust_potency(1) - - if(beehome) - beehome.bee_resources = min(beehome.bee_resources + growth, 100) - - -/mob/living/simple_animal/hostile/bee/handle_automated_action() - . = ..() - if(!.) - return - - if(!isqueen) - if(loc == beehome) - idle = min(100, ++idle) - if(idle >= BEE_IDLE_ROAMING && prob(BEE_PROB_GOROAM)) - toggle_ai(AI_ON) - forceMove(beehome.drop_location()) - else - idle = max(0, --idle) - if(idle <= BEE_IDLE_GOHOME && prob(BEE_PROB_GOHOME)) - if(!FindTarget()) - wanted_objects |= beehometypecache //so we don't attack beeboxes when not going home - GiveTarget(beehome) - if(!beehome) //add outselves to a beebox (of the same reagent) if we have no home - for(var/obj/structure/beebox/BB in view(vision_range, src)) - if(reagent_incompatible(BB.queen_bee) || BB.bees.len >= BB.get_max_bees()) - continue - BB.bees |= src - beehome = BB - break // End loop after the first compatible find. - -/mob/living/simple_animal/hostile/bee/will_escape_storage() - return TRUE - -/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) - -/mob/living/simple_animal/hostile/bee/queen - name = "queen bee" - desc = "She's the queen of bees, BZZ BZZ!" - icon_base = "queen" - isqueen = TRUE - -//the Queen doesn't leave the box on her own, and she CERTAINLY doesn't pollinate by herself -/mob/living/simple_animal/hostile/bee/queen/Found(atom/A) - return FALSE - - -//leave pollination for the peasent bees -/mob/living/simple_animal/hostile/bee/queen/AttackingTarget() - . = ..() - if(. && beegent && isliving(target)) - var/mob/living/L = target - beegent.expose_mob(L, TOUCH) - L.reagents.add_reagent(beegent.type, rand(1,5)) - - -//PEASENT BEES -/mob/living/simple_animal/hostile/bee/queen/pollinate() - return - -/mob/living/simple_animal/hostile/bee/queen/will_escape_storage() - return FALSE - -/mob/living/simple_animal/hostile/bee/proc/reagent_incompatible(mob/living/simple_animal/hostile/bee/B) - if(!B) - return FALSE - if(B.beegent && beegent && B.beegent.type != beegent.type || B.beegent && !beegent || !B.beegent && beegent) - return TRUE - return FALSE - -/mob/living/simple_animal/hostile/bee/consider_wakeup() - // If bees are chilling in their nest, they're not actively looking for targets. - if (!beehome || loc == beehome) - return ..() - - idle = min(100, idle + 1) - if(idle >= BEE_IDLE_ROAMING && prob(BEE_PROB_GOROAM)) - toggle_ai(AI_ON) - forceMove(beehome.drop_location()) - -/obj/item/queen_bee - name = "queen bee" - desc = "She's the queen of bees, BZZ BZZ!" - icon_state = "queen_item" - inhand_icon_state = "" - icon = 'icons/mob/simple/bees.dmi' - /// The actual mob that our bee item corresponds to - var/mob/living/simple_animal/hostile/bee/queen/queen - -/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/Destroy() - QDEL_NULL(queen) - return ..() - -/obj/item/queen_bee/Exited(atom/movable/gone, direction) - . = ..() - if(gone == queen) - queen = null - // the bee should not exist without a bee. - if(!QDELETED(src)) - qdel(src) - -/obj/item/queen_bee/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/reagent_containers/syringe)) - var/obj/item/reagent_containers/syringe/S = I - if(S.reagents.has_reagent(/datum/reagent/royal_bee_jelly)) //checked twice, because I really don't want royal bee jelly to be duped - if(S.reagents.has_reagent(/datum/reagent/royal_bee_jelly,5)) - S.reagents.remove_reagent(/datum/reagent/royal_bee_jelly, 5) - var/obj/item/queen_bee/qb = new(user.drop_location()) - qb.queen = new(qb) - if(queen?.beegent) - qb.queen.assign_reagent(queen.beegent) //Bees use the global singleton instances of reagents, so we don't need to worry about one bee being deleted and her copies losing their reagents. - user.put_in_active_hand(qb) - user.visible_message(span_notice("[user] injects [src] with royal bee jelly, causing it to split into two bees, MORE BEES!"),span_warning("You inject [src] with royal bee jelly, causing it to split into two bees, MORE BEES!")) - 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()] - if(R && S.reagents.has_reagent(R.type, 5)) - S.reagents.remove_reagent(R.type,5) - queen.assign_reagent(R) - user.visible_message(span_warning("[user] injects [src]'s genome with [R.name], mutating its DNA!"),span_warning("You inject [src]'s genome with [R.name], mutating its DNA!")) - name = queen.name - else - to_chat(user, span_warning("You don't have enough units of that chemical to modify the bee's DNA!")) - ..() - -/obj/item/queen_bee/suicide_act(mob/living/user) - user.visible_message(span_suicide("[user] eats [src]! It looks like [user.p_theyre()] trying to commit suicide!")) - user.say("IT'S HIP TO EAT BEES!") - qdel(src) - return TOXLOSS - -/obj/item/queen_bee/bought - -/obj/item/queen_bee/bought/Initialize(mapload) - . = ..() - queen = new(src) - -/mob/living/simple_animal/hostile/bee/short - desc = "These bees seem unstable and won't survive for long." - -/mob/living/simple_animal/hostile/bee/short/Initialize(mapload, timetolive=50 SECONDS) - . = ..() - addtimer(CALLBACK(src, PROC_REF(death)), timetolive) - -/obj/item/trash/bee - name = "bee" - desc = "No wonder the bees are dying out, you monster." - icon = 'icons/mob/simple/bees.dmi' - icon_state = "bee_item" - var/datum/reagent/beegent - -/obj/item/trash/bee/Initialize(mapload) - . = ..() - AddComponent(/datum/component/edible, list(/datum/reagent/consumable/nutriment/vitamin = 5), null, BEE_FOODGROUPS, 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() - . = ..() - var/mutable_appearance/body_overlay = mutable_appearance(icon = icon, icon_state = "bee_item_overlay") - body_overlay.color = beegent ? beegent.color : BEE_DEFAULT_COLOUR - . += body_overlay - -#undef BEE_DEFAULT_COLOUR -#undef BEE_FOODGROUPS -#undef BEE_IDLE_GOHOME -#undef BEE_IDLE_ROAMING -#undef BEE_POLLINATE_PEST_CHANCE -#undef BEE_POLLINATE_POTENCY_CHANCE -#undef BEE_POLLINATE_YIELD_CHANCE -#undef BEE_PROB_GOHOME -#undef BEE_PROB_GOROAM -#undef BEE_TRAY_RECENT_VISIT diff --git a/code/modules/mob/living/simple_animal/hostile/blob.dm b/code/modules/mob/living/simple_animal/hostile/blob.dm deleted file mode 100644 index 7a40a01239c89..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/blob.dm +++ /dev/null @@ -1,101 +0,0 @@ -//Do not spawn -/mob/living/simple_animal/hostile/blob - icon = 'icons/mob/nonhuman-player/blob.dmi' - pass_flags = PASSBLOB - faction = list(ROLE_BLOB) - bubble_icon = "blob" - speak_emote = null //so we use verb_yell/verb_say/etc - 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 - unique_name = 1 - combat_mode = TRUE - // ... Blob colored lighting - lighting_cutoff_red = 20 - lighting_cutoff_green = 40 - lighting_cutoff_blue = 30 - initial_language_holder = /datum/language_holder/empty - retreat_distance = null //! retreat doesn't obey pass_flags, so won't work on blob mobs. - /// Blob camera that controls the blob - var/mob/camera/blob/overmind = null - /// If this is related to anything else - var/independent = FALSE - /// The factory blob tile that generated this blob minion - var/obj/structure/blob/special/factory/factory - -/mob/living/simple_animal/hostile/blob/update_icons() - if(overmind) - add_atom_colour(overmind.blobstrain.color, FIXED_COLOUR_PRIORITY) - else - remove_atom_colour(FIXED_COLOUR_PRIORITY) - -/mob/living/simple_animal/hostile/blob/Initialize(mapload) - . = ..() - if(!independent) //no pulling people deep into the blob - remove_verb(src, /mob/living/verb/pulled) - else - pass_flags &= ~PASSBLOB - -/mob/living/simple_animal/hostile/blob/death() - factory = null - if(overmind) - overmind.blob_mobs -= src - overmind = null - return ..() - -/mob/living/simple_animal/hostile/blob/get_status_tab_items() - . = ..() - if(overmind) - . += "Blobs to Win: [overmind.blobs_legit.len]/[overmind.blobwincount]" - -/mob/living/simple_animal/hostile/blob/blob_act(obj/structure/blob/B) - if(stat != DEAD && health < maxHealth) - for(var/unused in 1 to 2) - var/obj/effect/temp_visual/heal/heal_effect = new /obj/effect/temp_visual/heal(get_turf(src)) //hello yes you are being healed - if(overmind) - heal_effect.color = overmind.blobstrain.complementary_color - else - heal_effect.color = "#000000" - adjustHealth(-maxHealth*BLOBMOB_HEALING_MULTIPLIER) - -/mob/living/simple_animal/hostile/blob/fire_act(exposed_temperature, exposed_volume) - ..() - if(exposed_temperature) - adjustFireLoss(clamp(0.01 * exposed_temperature, 1, 5)) - else - adjustFireLoss(5) - -/mob/living/simple_animal/hostile/blob/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() - if(istype(mover, /obj/structure/blob)) - return TRUE - -///override to use astar/JPS instead of walk_to so we can take our blob pass_flags into account. -/mob/living/simple_animal/hostile/blob/Goto(target, delay, minimum_distance) - if(prevent_goto_movement) - return FALSE - if(target == src.target) - approaching_target = TRUE - else - approaching_target = FALSE - - SSmove_manager.jps_move(moving = src, chasing = target, delay = delay, repath_delay = 2 SECONDS, minimum_distance = minimum_distance, simulated_only = FALSE, skip_first = TRUE, timeout = 5 SECONDS, flags = MOVEMENT_LOOP_IGNORE_GLIDE) - return TRUE - -/mob/living/simple_animal/hostile/blob/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) - for(var/obj/structure/blob/blob in range(1, src)) - 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, message_range = 7, datum/saymode/saymode = null) - if(sanitize) - message = trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN)) - var/spanned_message = say_quote(message) - var/rendered = "\[Blob Telepathy\] [real_name] [spanned_message]" - for(var/creature in GLOB.mob_list) - if(isovermind(creature) || isblobmonster(creature)) - to_chat(creature, rendered) - if(isobserver(creature)) - var/link = FOLLOW_LINK(creature, src) - to_chat(creature, "[link] [rendered]") - diff --git a/code/modules/mob/living/simple_animal/hostile/blobbernaut.dm b/code/modules/mob/living/simple_animal/hostile/blobbernaut.dm deleted file mode 100644 index 2162ff5d68b2e..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/blobbernaut.dm +++ /dev/null @@ -1,109 +0,0 @@ -/mob/living/simple_animal/hostile/blob/blobbernaut - name = "blobbernaut" - desc = "A hulking, mobile chunk of blobmass." - icon_state = "blobbernaut" - icon_living = "blobbernaut" - icon_dead = "blobbernaut_dead" - health = BLOBMOB_BLOBBERNAUT_HEALTH - maxHealth = BLOBMOB_BLOBBERNAUT_HEALTH - damage_coeff = list(BRUTE = 0.5, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) - melee_damage_lower = BLOBMOB_BLOBBERNAUT_DMG_SOLO_LOWER - melee_damage_upper = BLOBMOB_BLOBBERNAUT_DMG_SOLO_UPPER - obj_damage = BLOBMOB_BLOBBERNAUT_DMG_OBJ - attack_verb_continuous = "slams" - attack_verb_simple = "slam" - attack_sound = 'sound/effects/blobattack.ogg' - verb_say = "gurgles" - verb_ask = "demands" - verb_exclaim = "roars" - verb_yell = "bellows" - force_threshold = 10 - pressure_resistance = 50 - 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/mind_initialize() - . = ..() - if(independent | !overmind) - return - var/datum/antagonist/blob_minion/blobbernaut/naut = new(overmind) - mind.add_antag_datum(naut) - -/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(seconds_per_tick = SSMOBS_DT, times_fired) - if(!..()) - return FALSE - var/list/blobs_in_area = range(2, src) - - if(independent) - return FALSE // strong independent blobbernaut that don't need no blob - - var/damagesources = 0 - - if(!(locate(/obj/structure/blob) in blobs_in_area)) - damagesources++ - - if(!factory) - damagesources++ - else - if(locate(/obj/structure/blob/special/core) in blobs_in_area) - adjustHealth(-maxHealth*BLOBMOB_BLOBBERNAUT_HEALING_CORE * seconds_per_tick) - var/obj/effect/temp_visual/heal/heal_effect = new /obj/effect/temp_visual/heal(get_turf(src)) //hello yes you are being healed - if(overmind) - heal_effect.color = overmind.blobstrain.complementary_color - else - heal_effect.color = "#000000" - if(locate(/obj/structure/blob/special/node) in blobs_in_area) - adjustHealth(-maxHealth*BLOBMOB_BLOBBERNAUT_HEALING_NODE * seconds_per_tick) - var/obj/effect/temp_visual/heal/heal_effect = new /obj/effect/temp_visual/heal(get_turf(src)) - if(overmind) - heal_effect.color = overmind.blobstrain.complementary_color - else - heal_effect.color = "#000000" - - if(!damagesources) - return FALSE - - adjustHealth(maxHealth * BLOBMOB_BLOBBERNAUT_HEALTH_DECAY * damagesources * seconds_per_tick) //take 2.5% of max health as damage when not near the blob or if the naut has no factory, 5% if both - var/image/image = new('icons/mob/nonhuman-player/blob.dmi', src, "nautdamage", MOB_LAYER+0.01) - image.appearance_flags = RESET_COLOR - - if(overmind) - image.color = overmind.blobstrain.complementary_color - - flick_overlay_view(image, 8) - -/mob/living/simple_animal/hostile/blob/blobbernaut/AttackingTarget() - . = ..() - if(. && isliving(target) && overmind) - overmind.blobstrain.blobbernaut_attack(target, src) - -/mob/living/simple_animal/hostile/blob/blobbernaut/update_icons() - ..() - if(overmind) //if we have an overmind, we're doing chemical reactions instead of pure damage - melee_damage_lower = BLOBMOB_BLOBBERNAUT_DMG_LOWER - melee_damage_upper = BLOBMOB_BLOBBERNAUT_DMG_UPPER - attack_verb_continuous = overmind.blobstrain.blobbernaut_message - else - melee_damage_lower = initial(melee_damage_lower) - melee_damage_upper = initial(melee_damage_upper) - attack_verb_continuous = initial(attack_verb_continuous) - -/mob/living/simple_animal/hostile/blob/blobbernaut/death(gibbed) - if(factory) - factory.blobbernaut = null //remove this blobbernaut from its factory - factory.max_integrity = initial(factory.max_integrity) - flick("blobbernaut_death", src) - return ..() - -/mob/living/simple_animal/hostile/blob/blobbernaut/independent - independent = TRUE - gold_core_spawnable = HOSTILE_SPAWN - - diff --git a/code/modules/mob/living/simple_animal/hostile/blobspore.dm b/code/modules/mob/living/simple_animal/hostile/blobspore.dm deleted file mode 100644 index 7026d2f96c308..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/blobspore.dm +++ /dev/null @@ -1,168 +0,0 @@ -/mob/living/simple_animal/hostile/blob/blobspore - name = "blob spore" - desc = "A floating, fragile spore." - icon_state = "blobpod" - icon_living = "blobpod" - health_doll_icon = "blobpod" - health = BLOBMOB_SPORE_HEALTH - maxHealth = BLOBMOB_SPORE_HEALTH - verb_say = "psychically pulses" - verb_ask = "psychically probes" - verb_exclaim = "psychically yells" - verb_yell = "psychically screams" - melee_damage_lower = BLOBMOB_SPORE_DMG_LOWER - melee_damage_upper = BLOBMOB_SPORE_DMG_UPPER - environment_smash = ENVIRONMENT_SMASH_NONE - obj_damage = 0 - attack_verb_continuous = "hits" - attack_verb_simple = "hit" - attack_sound = 'sound/weapons/genhit1.ogg' - del_on_death = TRUE - death_message = "explodes into a cloud of gas!" - gold_core_spawnable = NO_SPAWN //gold slime cores should only spawn the independent subtype - /// Size of cloud produced from a dying spore - var/death_cloud_size = 1 - /// The attached person - var/mob/living/carbon/human/corpse - /// If this is attached to a person - var/is_zombie = FALSE - /// Whether or not this is a fragile spore from Distributed Neurons - var/is_weak = FALSE - -/mob/living/simple_animal/hostile/blob/blobspore/Initialize(mapload, obj/structure/blob/special/linked_node) - . = ..() - AddElement(/datum/element/simple_flying) - - if(!istype(linked_node)) - return - - factory = linked_node - 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/mind_initialize() - . = ..() - if(independent || !overmind) - return FALSE - var/datum/antagonist/blob_minion/blob_zombie/zombie = new(overmind) - mind.add_antag_datum(zombie) - -/mob/living/simple_animal/hostile/blob/blobspore/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if(!is_zombie && isturf(loc)) - for(var/mob/living/carbon/human/target in view(src,1)) //Only for corpse right next to/on same tile - if(!is_weak && target.stat == DEAD) - zombify(target) - break - if(factory && !is_valid_z_level(get_turf(src), get_turf(factory))) - death() - return ..() - -/mob/living/simple_animal/hostile/blob/blobspore/attack_ghost(mob/user) - . = ..() - if(.) - return - humanize_pod(user) - -/mob/living/simple_animal/hostile/blob/blobspore/death(gibbed) - // On death, create a small smoke of harmful gas (s-Acid) - var/datum/effect_system/fluid_spread/smoke/chem/spores = new - var/turf/location = get_turf(src) - - // Create the reagents to put into the air - create_reagents(10) - - if(overmind?.blobstrain) - overmind.blobstrain.on_sporedeath(src) - else - reagents.add_reagent(/datum/reagent/toxin/spore, 10) - - // Attach the smoke spreader and setup/start it. - spores.attach(location) - spores.set_up(death_cloud_size, holder = src, location = location, carry = reagents, silent = TRUE) - spores.start() - if(factory) - factory.spore_delay = world.time + factory.spore_cooldown //put the factory on cooldown - - return ..() - -/mob/living/simple_animal/hostile/blob/blobspore/death() - if(factory) - factory.spores -= src - corpse?.forceMove(loc) - corpse = null - return ..() - -/mob/living/simple_animal/hostile/blob/blobspore/update_icons() - if(overmind) - add_atom_colour(overmind.blobstrain.complementary_color, FIXED_COLOUR_PRIORITY) - else - remove_atom_colour(FIXED_COLOUR_PRIORITY) - if(!is_zombie) - return FALSE - - copy_overlays(corpse, TRUE) - var/mutable_appearance/blob_head_overlay = mutable_appearance('icons/mob/nonhuman-player/blob.dmi', "blob_head") - if(overmind) - 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 - -/mob/living/simple_animal/hostile/blob/blobspore/weak - name = "fragile blob spore" - health = 15 - maxHealth = 15 - melee_damage_lower = 1 - melee_damage_upper = 2 - death_cloud_size = 0 - is_weak = TRUE - -/** Ghost control a blob zombie */ -/mob/living/simple_animal/hostile/blob/blobspore/proc/humanize_pod(mob/user) - if((!overmind || istype(src, /mob/living/simple_animal/hostile/blob/blobspore/weak) || !istype(overmind.blobstrain, /datum/blobstrain/reagent/distributed_neurons)) && !is_zombie) - return FALSE - if(key || stat) - return FALSE - var/pod_ask = tgui_alert(usr, "Are you bulbous enough?", "Blob Spore", list("Yes", "No")) - if(pod_ask != "Yes" || QDELETED(src)) - return FALSE - if(key) - to_chat(user, span_warning("Someone else already took this spore!")) - return FALSE - key = user.key - log_message("took control of [name].", LOG_GAME) - -/** Zombifies a dead mob, turning it into a blob zombie */ -/mob/living/simple_animal/hostile/blob/blobspore/proc/zombify(mob/living/carbon/human/target) - is_zombie = 1 - if(target.wear_suit) - maxHealth += target.get_armor_rating(MELEE) // That zombie's got armor, I want armor! - maxHealth += 40 - health = maxHealth - name = "blob zombie" - desc = "A shambling corpse animated by the blob." - mob_biotypes |= MOB_HUMANOID - melee_damage_lower += 8 - melee_damage_upper += 11 - obj_damage = 20 // now that it has a corpse to puppet, it can properly attack structures - environment_smash = ENVIRONMENT_SMASH_STRUCTURES - movement_type = GROUND - death_cloud_size = 0 - icon = target.icon - icon_state = "zombie" - target.hairstyle = null - target.update_body_parts() - target.forceMove(src) - corpse = target - update_icons() - visible_message(span_warning("The corpse of [target.name] suddenly rises!")) - if(!key) - notify_ghosts("\A [src] has been created in \the [get_area(src)].", source = src, action = NOTIFY_ORBIT, flashwindow = FALSE, header = "Blob Zombie Created") diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm deleted file mode 100644 index 5ecdf09d6ec4b..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm +++ /dev/null @@ -1,139 +0,0 @@ -/mob/living/simple_animal/hostile/boss - name = "\improper A Perfectly Generic Boss Placeholder" - desc = "" - robust_searching = 1 - stat_attack = HARD_CRIT - status_flags = 0 - combat_mode = TRUE - sentience_type = SENTIENCE_BOSS - gender = NEUTER - var/list/boss_abilities = list() //list of /datum/action/boss - var/datum/boss_active_timed_battle/atb - var/point_regen_delay = 1 - - -/mob/living/simple_animal/hostile/boss/Initialize(mapload) - . = ..() - - atb = new() - atb.point_regen_delay = point_regen_delay - atb.boss = src - - for(var/ab in boss_abilities) - boss_abilities -= ab - var/datum/action/boss/AB = new ab() - AB.boss = src - AB.Grant(src) - boss_abilities += AB - - atb.assign_abilities(boss_abilities) - - -/mob/living/simple_animal/hostile/boss/Destroy() - qdel(atb) - atb = null - for(var/ab in boss_abilities) - var/datum/action/boss/AB = ab - AB.boss = null - AB.Remove(src) - qdel(AB) - boss_abilities.Cut() - return ..() - - -//Action datum for bosses -//Override Trigger() as shown below to do things -/datum/action/boss - check_flags = AB_CHECK_CONSCIOUS //Incase the boss is given a player - var/boss_cost = 100 //Cost of usage for the boss' AI 1-100 - var/usage_probability = 100 - var/mob/living/simple_animal/hostile/boss/boss - var/boss_type = /mob/living/simple_animal/hostile/boss - var/needs_target = TRUE //Does the boss need to have a target? (Only matters for the AI) - var/say_when_triggered = "" //What does the boss Say() when the ability triggers? - -/datum/action/boss/Trigger(trigger_flags) - . = ..() - if(!.) - return - if(!istype(boss, boss_type)) - return - if(!boss.atb) - return - if(boss.atb.points < boss_cost) - return - if(!boss.client) - if(needs_target && !boss.target) - return - if(boss) - if(say_when_triggered) - boss.say(say_when_triggered, forced = "boss action") - if(!boss.atb.spend(boss_cost)) - return - -//Example: -/* -/datum/action/boss/selfgib/Trigger(trigger_flags) - if(..()) - boss.gib() -*/ - - -//Designed for boss mobs only -/datum/boss_active_timed_battle - var/list/abilities //a list of /datum/action/boss owned by a boss mob - var/point_regen_delay = 5 - var/points = 50 //1-100, start with 50 so we can use some abilities but not insta-buttfug somebody - var/next_point_time = 0 - var/chance_to_hold_onto_points = 50 - var/highest_cost = 0 - var/mob/living/simple_animal/hostile/boss/boss - - -/datum/boss_active_timed_battle/New() - ..() - START_PROCESSING(SSobj, src) - - -/datum/boss_active_timed_battle/proc/assign_abilities(list/L) - if(!L) - return 0 - abilities = L - for(var/ab in abilities) - var/datum/action/boss/AB = ab - if(AB.boss_cost > highest_cost) - highest_cost = AB.boss_cost - - -/datum/boss_active_timed_battle/proc/spend(cost) - if(cost <= points) - points = max(0,points-cost) - return 1 - return 0 - - -/datum/boss_active_timed_battle/proc/refund(cost) - points = min(points+cost, 100) - - -/datum/boss_active_timed_battle/process() - if(world.time >= next_point_time) - next_point_time = world.time + point_regen_delay - points = min(100, ++points) //has to be out of 100 - - if(abilities) - chance_to_hold_onto_points = highest_cost*0.5 - if(points != 100 && prob(chance_to_hold_onto_points)) - return //Let's save our points for a better ability (unless we're at max points, in which case we can't save anymore!) - if(!boss.client) - abilities = shuffle(abilities) - for(var/ab in abilities) - var/datum/action/boss/AB = ab - if(prob(AB.usage_probability) && AB.Trigger()) - break - - -/datum/boss_active_timed_battle/Destroy() - abilities = null - SSobj.processing.Remove(src) - return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm deleted file mode 100644 index 15b439b425fe6..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm +++ /dev/null @@ -1,210 +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(FACTION_HOSTILE,FACTION_STICKMAN) - del_on_death = TRUE - icon = 'icons/mob/simple/simple_human.dmi' - icon_state = "paperwizard" - ranged = TRUE - 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' - footstep_type = FOOTSTEP_MOB_SHOE - var/list/copies = list() - -/mob/living/simple_animal/hostile/boss/paper_wizard/Initialize(mapload) - . = ..() - apply_dynamic_human_appearance(src, mob_spawn_path = /obj/effect/mob_spawn/corpse/human/wizard/paper) - -/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))) - RegisterSignals(chosen_minion, list(COMSIG_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_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_NORMAL_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_NORMAL_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/constructs/constructs.dm b/code/modules/mob/living/simple_animal/hostile/constructs/constructs.dm index 2449c2d3e2099..23f7590dc8e24 100644 --- a/code/modules/mob/living/simple_animal/hostile/constructs/constructs.dm +++ b/code/modules/mob/living/simple_animal/hostile/constructs/constructs.dm @@ -26,10 +26,9 @@ 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 - healable = 0 faction = list(FACTION_CULT) pressure_resistance = 100 - unique_name = 1 + unique_name = TRUE AIStatus = AI_OFF //normal constructs don't have AI loot = list(/obj/item/ectoplasm) del_on_death = TRUE @@ -80,8 +79,6 @@ to_chat(src, playstyle_string) /mob/living/simple_animal/hostile/construct/examine(mob/user) - var/pronoun = p_they(TRUE) - var/plural = p_s() var/text_span switch(theme) if(THEME_CULT) @@ -93,9 +90,9 @@ . = list("This is [icon2html(src, user)] \a [src]!\n[desc]") if(health < maxHealth) if(health >= maxHealth/2) - . += span_warning("[pronoun] look[plural] slightly dented.") + . += span_warning("[p_They()] look[p_s()] slightly dented.") else - . += span_warning("[pronoun] look[plural] severely dented!") + . += span_warning("[p_They()] look[p_s()] severely dented!") . += "" /mob/living/simple_animal/hostile/construct/attack_animal(mob/living/simple_animal/user, list/modifiers) diff --git a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm deleted file mode 100644 index 8c78685517abe..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm +++ /dev/null @@ -1,43 +0,0 @@ -/mob/living/simple_animal/hostile/eyeball - name = "eyeball" - desc = "An odd looking creature, it won't stop staring..." - icon = 'icons/mob/simple/carp.dmi' - icon_state = "eyeball" - icon_living = "eyeball" - icon_gib = "" - maxHealth = 30 - health = 30 - harm_intent_damage = 15 - obj_damage = 10 - melee_damage_lower = 8 - melee_damage_upper = 12 - speed = 0 - gender = NEUTER - mob_biotypes = MOB_ORGANIC - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "gently pushes aside" - response_disarm_simple = "gently push aside" - emote_taunt = list("glares") - taunt_chance = 25 - speak_emote = list("telepathically cries") - turns_per_move = 5 - attack_verb_continuous = "blinks at" - attack_verb_simple = "blink at" - attack_sound = 'sound/weapons/pierce.ogg' - 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 - gold_core_spawnable = HOSTILE_SPAWN - faction = list(FACTION_SPOOKY) - del_on_death = 1 - // Redish ethereal glow. These lads live on the cult ship - lighting_cutoff_red = 40 - lighting_cutoff_green = 20 - lighting_cutoff_blue = 30 - sight = SEE_SELF|SEE_MOBS|SEE_OBJS|SEE_TURFS - -/mob/living/simple_animal/hostile/eyeball/Initialize(mapload) - . = ..() - AddElement(/datum/element/simple_flying) - ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) 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 d6d5a2515ce5f..6f5952382c67d 100644 --- a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm +++ b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm @@ -30,6 +30,7 @@ attack_verb_simple = "pummel" attack_sound = 'sound/weapons/punch1.ogg' dextrous = TRUE + hud_type = /datum/hud/dextrous held_items = list(null, null) faction = list(FACTION_MONKEY, FACTION_JUNGLE) robust_searching = TRUE @@ -91,8 +92,8 @@ /mob/living/simple_animal/hostile/gorilla/CanSmashTurfs(turf/T) return iswallturf(T) -/mob/living/simple_animal/hostile/gorilla/gib(no_brain) - if(!no_brain) +/mob/living/simple_animal/hostile/gorilla/gib(drop_bitflags=DROP_BRAIN) + if(drop_bitflags & DROP_BRAIN) var/mob/living/brain/gorilla_brain = new(drop_location()) gorilla_brain.name = real_name gorilla_brain.real_name = real_name @@ -114,6 +115,23 @@ oogas = rand(2,6) playsound(src, 'sound/creatures/gorilla.ogg', 50) +/mob/living/simple_animal/hostile/gorilla/lesser + name = "lesser Gorilla" + desc = "An adolescent Gorilla. It may not be fully grown but, much like a banana, that just means it's sturdier and harder to chew!" + speak_chance = 100 // compensating for something + maxHealth = 120 + health = 120 + butcher_results = list(/obj/item/food/meat/slab/gorilla = 2) + speed = 0.35 + melee_damage_lower = 10 + melee_damage_upper = 15 + obj_damage = 15 + stat_attack = SOFT_CRIT + unique_name = TRUE + +/mob/living/simple_animal/hostile/gorilla/lesser/Initialize(mapload) + . = ..() + transform *= 0.75 // smolrilla /mob/living/simple_animal/hostile/gorilla/cargo_domestic name = "Cargorilla" // Overriden, normally @@ -124,58 +142,28 @@ faction = list(FACTION_NEUTRAL, FACTION_MONKEY, FACTION_JUNGLE) gold_core_spawnable = NO_SPAWN unique_name = FALSE - /// Whether we're currently being polled over - var/being_polled_for = FALSE /mob/living/simple_animal/hostile/gorilla/cargo_domestic/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_PACIFISM, INNATE_TRAIT) AddComponent(/datum/component/crate_carrier) -/mob/living/simple_animal/hostile/gorilla/cargo_domestic/attack_ghost(mob/user) - if(being_polled_for || mind || client || (flags_1 & ADMIN_SPAWNED_1)) - return ..() - - if(is_banned_from(user.ckey, list(ROLE_SENTIENCE, ROLE_SYNDICATE))) - return ..() - - if(!SSticker.HasRoundStarted()) - return ..() - - var/become_gorilla = tgui_alert(user, "Become a Cargorilla?", "Confirm", list("Yes", "No")) - if(become_gorilla != "Yes" || QDELETED(src) || QDELETED(user) || being_polled_for || mind || client) - return - - enter_ghost(user) - /// Poll ghosts for control of the gorilla. /mob/living/simple_animal/hostile/gorilla/cargo_domestic/proc/poll_for_gorilla() - being_polled_for = TRUE - var/list/mob/dead/candidates = poll_candidates_for_mob( - "Do you want to play as a Cargorilla?", - ROLE_SENTIENCE, - ROLE_SENTIENCE, - 30 SECONDS, - src, - POLL_IGNORE_CARGORILLA + AddComponent(\ + /datum/component/ghost_direct_control,\ + poll_candidates = TRUE,\ + poll_length = 30 SECONDS,\ + role_name = "Cargorilla",\ + assumed_control_message = "You are Cargorilla, a pacifistic friend of the station and carrier of freight.",\ + poll_ignore_key = POLL_IGNORE_CARGORILLA,\ + after_assumed_control = CALLBACK(src, PROC_REF(became_player_controlled)),\ ) - being_polled_for = FALSE - if(QDELETED(src) || mind || client) - return - - if(LAZYLEN(candidates)) - enter_ghost(pick(candidates)) - -/// Brings in the a ghost to take control of the gorilla. -/mob/living/simple_animal/hostile/gorilla/cargo_domestic/proc/enter_ghost(mob/dead/user) - key = user.key - if(!mind) - CRASH("[type] - enter_ghost didn't end up with a mind.") - +/// Called once a ghost assumes control +/mob/living/simple_animal/hostile/gorilla/cargo_domestic/proc/became_player_controlled() mind.set_assigned_role(SSjob.GetJobType(/datum/job/cargo_technician)) mind.special_role = "Cargorilla" - to_chat(src, span_boldnotice("You are a Cargorilla, a pacifistic friend of the station and carrier of freight.")) to_chat(src, span_notice("You can pick up crates by clicking on them, and drop them by clicking on the ground.")) /obj/item/card/id/advanced/cargo_gorilla diff --git a/code/modules/mob/living/simple_animal/hostile/heretic_monsters.dm b/code/modules/mob/living/simple_animal/hostile/heretic_monsters.dm deleted file mode 100644 index 9533e407a095f..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/heretic_monsters.dm +++ /dev/null @@ -1,429 +0,0 @@ -/mob/living/simple_animal/hostile/heretic_summon - name = "Eldritch Demon" - real_name = "Eldritch Demon" - desc = "A horror from beyond this realm." - icon = 'icons/mob/nonhuman-player/eldritch_mobs.dmi' - gender = NEUTER - mob_biotypes = NONE - attack_sound = 'sound/weapons/punch1.ogg' - response_help_continuous = "thinks better of touching" - response_help_simple = "think better of touching" - response_disarm_continuous = "flails at" - response_disarm_simple = "flail at" - response_harm_continuous = "reaps" - response_harm_simple = "tears" - speak_emote = list("screams") - speak_chance = 1 - speed = 0 - combat_mode = TRUE - stop_automated_movement = TRUE - AIStatus = AI_OFF - // Sort of greenish brown, to match the vibeTM - lighting_cutoff_red = 20 - lighting_cutoff_green = 25 - lighting_cutoff_blue = 5 - 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) - minbodytemp = 0 - maxbodytemp = INFINITY - healable = FALSE - movement_type = GROUND - pressure_resistance = 100 - del_on_death = TRUE - death_message = "implodes into itself." - loot = list(/obj/effect/gibspawner/human) - faction = list(FACTION_HERETIC) - simple_mob_flags = SILENCE_RANGED_MESSAGE - - /// Innate spells that are added when a beast is created. - var/list/actions_to_add - -/mob/living/simple_animal/hostile/heretic_summon/Initialize(mapload) - . = ..() - for(var/spell in actions_to_add) - var/datum/action/cooldown/spell/new_spell = new spell(src) - new_spell.Grant(src) - -/mob/living/simple_animal/hostile/heretic_summon/raw_prophet - name = "Raw Prophet" - real_name = "Raw Prophet" - desc = "An abomination stitched together from a few severed arms and one lost eye." - icon_state = "raw_prophet" - icon_living = "raw_prophet" - status_flags = CANPUSH - melee_damage_lower = 5 - melee_damage_upper = 10 - maxHealth = 65 - health = 65 - sight = SEE_MOBS|SEE_OBJS|SEE_TURFS - loot = list(/obj/effect/gibspawner/human, /obj/item/bodypart/arm/left, /obj/item/organ/internal/eyes) - actions_to_add = list( - /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash/long, - /datum/action/cooldown/spell/list_target/telepathy/eldritch, - /datum/action/cooldown/spell/pointed/blind/eldritch, - /datum/action/innate/expand_sight, - ) - /// A weakref to the last target we smacked. Hitting targets consecutively does more damage. - var/datum/weakref/last_target - -/mob/living/simple_animal/hostile/heretic_summon/raw_prophet/Initialize(mapload) - . = ..() - var/on_link_message = "You feel something new enter your sphere of mind... \ - You hear whispers of people far away, screeches of horror and a huming of welcome to [src]'s Mansus Link." - - var/on_unlink_message = "Your mind shatters as [src]'s Mansus Link leaves your mind." - - AddComponent( \ - /datum/component/mind_linker/active_linking, \ - network_name = "Mansus Link", \ - chat_color = "#568b00", \ - post_unlink_callback = CALLBACK(src, PROC_REF(after_unlink)), \ - speech_action_background_icon_state = "bg_heretic", \ - speech_action_overlay_state = "bg_heretic_border", \ - linker_action_path = /datum/action/cooldown/spell/pointed/manse_link, \ - link_message = on_link_message, \ - unlink_message = on_unlink_message, \ - ) - -/mob/living/simple_animal/hostile/heretic_summon/raw_prophet/attack_animal(mob/living/simple_animal/user, list/modifiers) - if(user == src) // Easy to hit yourself + very fragile = accidental suicide, prevent that - return - - return ..() - -/mob/living/simple_animal/hostile/heretic_summon/raw_prophet/AttackingTarget(atom/attacked_target) - if(WEAKREF(attacked_target) == last_target) - melee_damage_lower = min(melee_damage_lower + 5, 30) - melee_damage_upper = min(melee_damage_upper + 5, 35) - else - melee_damage_lower = initial(melee_damage_lower) - melee_damage_upper = initial(melee_damage_upper) - - . = ..() - if(!.) - return - - SpinAnimation(5, 1) - last_target = WEAKREF(attacked_target) - -/mob/living/simple_animal/hostile/heretic_summon/raw_prophet/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - . = ..() - var/rotation_degree = (360 / 3) - if(movement_dir & WEST || movement_dir & SOUTH) - rotation_degree *= -1 - - var/matrix/to_turn = matrix(transform) - to_turn = turn(transform, rotation_degree) - animate(src, transform = to_turn, time = 0.1 SECONDS) - -/* - * Callback for the mind_linker component. - * Stuns people who are ejected from the network. - */ -/mob/living/simple_animal/hostile/heretic_summon/raw_prophet/proc/after_unlink(mob/living/unlinked_mob) - if(QDELETED(unlinked_mob) || unlinked_mob.stat == DEAD) - return - - INVOKE_ASYNC(unlinked_mob, TYPE_PROC_REF(/mob, emote), "scream") - unlinked_mob.AdjustParalyzed(0.5 SECONDS) //micro stun - -// What if we took a linked list... But made it a mob? -/// The "Terror of the Night" / Armsy, a large worm made of multiple bodyparts that occupies multiple tiles -/mob/living/simple_animal/hostile/heretic_summon/armsy - name = "Terror of the night" - real_name = "Armsy" - desc = "An abomination made from dozens and dozens of severed and malformed limbs piled onto each other." - icon_state = "armsy_start" - icon_living = "armsy_start" - maxHealth = 200 - health = 200 - melee_damage_lower = 10 - melee_damage_upper = 15 - move_force = MOVE_FORCE_OVERPOWERING - move_resist = MOVE_FORCE_OVERPOWERING - pull_force = MOVE_FORCE_OVERPOWERING - movement_type = GROUND - mob_size = MOB_SIZE_HUGE - sentience_type = SENTIENCE_BOSS - environment_smash = ENVIRONMENT_SMASH_RWALLS - mob_biotypes = MOB_ORGANIC|MOB_EPIC - obj_damage = 200 - ranged_cooldown_time = 5 - ranged = TRUE - rapid = 1 - actions_to_add = list(/datum/action/cooldown/spell/worm_contract) - ///Previous segment in the chain - var/mob/living/simple_animal/hostile/heretic_summon/armsy/back - ///Next segment in the chain - var/mob/living/simple_animal/hostile/heretic_summon/armsy/front - ///Your old location - var/oldloc - ///Allow / disallow pulling - var/allow_pulling = FALSE - ///How many arms do we have to eat to expand? - var/stacks_to_grow = 5 - ///Currently eaten arms - var/current_stacks = 0 - ///Does this follow other pieces? - var/follow = TRUE - -/* - * Arguments - * * spawn_bodyparts - whether we spawn additional armsy bodies until we reach length. - * * worm_length - the length of the worm we're creating. Below 3 doesn't work very well. - */ -/mob/living/simple_animal/hostile/heretic_summon/armsy/Initialize(mapload, spawn_bodyparts = TRUE, worm_length = 6) - . = ..() - if(worm_length < 3) - stack_trace("[type] created with invalid len ([worm_length]). Reverting to 3.") - worm_length = 3 //code breaks below 3, let's just not allow it. - - oldloc = loc - RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(update_chain_links)) - if(!spawn_bodyparts) - return - - AddComponent(/datum/component/blood_walk, \ - blood_type = /obj/effect/decal/cleanable/blood/tracks, \ - target_dir_change = TRUE) - - allow_pulling = TRUE - // Sets the hp of the head to be exactly the (length * hp), so the head is de facto the hardest to destroy. - maxHealth = worm_length * maxHealth - health = maxHealth - - // The previous link in the chain - var/mob/living/simple_animal/hostile/heretic_summon/armsy/prev = src - // The current link in the chain - var/mob/living/simple_animal/hostile/heretic_summon/armsy/current - - for(var/i in 1 to worm_length) - current = new type(drop_location(), FALSE) - current.icon_state = "armsy_mid" - current.icon_living = "armsy_mid" - current.AIStatus = AI_OFF - current.front = prev - prev.back = current - prev = current - - prev.icon_state = "armsy_end" - prev.icon_living = "armsy_end" - -/mob/living/simple_animal/hostile/heretic_summon/armsy/adjustBruteLoss(amount, updating_health, forced, required_bodytype) - if(back) - return back.adjustBruteLoss(amount, updating_health, forced) - - return ..() - -/mob/living/simple_animal/hostile/heretic_summon/armsy/adjustFireLoss(amount, updating_health, forced, required_bodytype) - if(back) - return back.adjustFireLoss(amount, updating_health, forced) - - return ..() - -// We are literally a vessel of otherworldly destruction, we bring our own gravity unto this plane -/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() - return FALSE - -/// Updates every body in the chain to force move onto a single tile. -/mob/living/simple_animal/hostile/heretic_summon/armsy/proc/contract_next_chain_into_single_tile() - if(!back) - return - - back.forceMove(loc) - back.contract_next_chain_into_single_tile() - -/* - * Recursively get the length of our chain. - */ -/mob/living/simple_animal/hostile/heretic_summon/armsy/proc/get_length() - . = 1 - if(back) - . += back.get_length() - -/// Updates the next mob in the chain to move to our last location. Fixes the chain if somehow broken. -/mob/living/simple_animal/hostile/heretic_summon/armsy/proc/update_chain_links() - SIGNAL_HANDLER - - if(!follow) - return - - if(back && back.loc != oldloc) - back.Move(oldloc) - - // self fixing properties if somehow broken - if(front && loc != front.oldloc) - forceMove(front.oldloc) - - oldloc = loc - -/mob/living/simple_animal/hostile/heretic_summon/armsy/Destroy() - if(front) - front.icon_state = "armsy_end" - front.icon_living = "armsy_end" - front.back = null - front = null - if(back) - QDEL_NULL(back) // chain destruction baby - return ..() - -/* - * Handle healing our chain. - * - * Eating arms off the ground heals us, - * and if we eat enough arms while above - * a certain health threshold, we even gain back parts! - */ -/mob/living/simple_animal/hostile/heretic_summon/armsy/proc/heal() - if(back) - back.heal() - return - - adjustBruteLoss(-maxHealth * 0.5, FALSE) - adjustFireLoss(-maxHealth * 0.5, FALSE) - - if(health < maxHealth * 0.8) - return - - current_stacks++ - if(current_stacks < stacks_to_grow) - return - - var/mob/living/simple_animal/hostile/heretic_summon/armsy/prev = new type(drop_location(), FALSE) - icon_state = "armsy_mid" - icon_living = "armsy_mid" - back = prev - prev.icon_state = "armsy_end" - prev.icon_living = "armsy_end" - prev.front = src - prev.AIStatus = AI_OFF - current_stacks = 0 - -/mob/living/simple_animal/hostile/heretic_summon/armsy/Shoot(atom/targeted_atom) - GiveTarget(targeted_atom) - AttackingTarget() - -/mob/living/simple_animal/hostile/heretic_summon/armsy/AttackingTarget() - if(istype(target, /obj/item/bodypart/arm)) - playsound(src, 'sound/magic/demon_consume.ogg', 50, TRUE) - qdel(target) - heal() - return - if(target == back || target == front) - return - if(back) - back.GiveTarget(target) - back.AttackingTarget() - if(!Adjacent(target)) - return - do_attack_animation(target) - - if(iscarbon(target)) - var/mob/living/carbon/carbon_target = target - if(HAS_TRAIT(carbon_target, TRAIT_NODISMEMBER)) - return ..() - - var/list/parts_to_remove = list() - for(var/obj/item/bodypart/bodypart in carbon_target.bodyparts) - if(bodypart.body_part != HEAD && bodypart.body_part != CHEST && bodypart.body_part != LEG_LEFT && bodypart.body_part != LEG_RIGHT) - if(!(bodypart.bodypart_flags & BODYPART_UNREMOVABLE)) - parts_to_remove += bodypart - - if(parts_to_remove.len && prob(10)) - var/obj/item/bodypart/lost_arm = pick(parts_to_remove) - lost_arm.dismember() - - return ..() - -/mob/living/simple_animal/hostile/heretic_summon/armsy/prime - name = "Lord of the Night" - real_name = "Master of Decay" - maxHealth = 400 - health = 400 - melee_damage_lower = 30 - melee_damage_upper = 50 - -/mob/living/simple_animal/hostile/heretic_summon/armsy/prime/Initialize(mapload, spawn_bodyparts = TRUE, worm_length = 9) - . = ..() - var/matrix/matrix_transformation = matrix() - matrix_transformation.Scale(1.4, 1.4) - transform = matrix_transformation - -/mob/living/simple_animal/hostile/heretic_summon/rust_spirit - name = "Rust Walker" - real_name = "Rusty" - desc = "An incomprehensible abomination. Everywhere it steps, it appears to be actively seeping life out of its surroundings." - icon_state = "rust_walker_s" - icon_living = "rust_walker_s" - status_flags = CANPUSH - maxHealth = 75 - health = 75 - melee_damage_lower = 15 - melee_damage_upper = 20 - sight = SEE_TURFS - actions_to_add = list( - /datum/action/cooldown/spell/aoe/rust_conversion/small, - /datum/action/cooldown/spell/basic_projectile/rust_wave/short, - ) - -/mob/living/simple_animal/hostile/heretic_summon/rust_spirit/setDir(newdir) - . = ..() - if(newdir == NORTH) - icon_state = "rust_walker_n" - else if(newdir == SOUTH) - icon_state = "rust_walker_s" - update_appearance(UPDATE_ICON_STATE) - -/mob/living/simple_animal/hostile/heretic_summon/rust_spirit/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - . = ..() - playsound(src, 'sound/effects/footstep/rustystep1.ogg', 100, TRUE) - -/mob/living/simple_animal/hostile/heretic_summon/rust_spirit/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if(stat == DEAD) - return ..() - - var/turf/our_turf = get_turf(src) - if(HAS_TRAIT(our_turf, TRAIT_RUSTY)) - adjustBruteLoss(-1.5 * seconds_per_tick, FALSE) - adjustFireLoss(-1.5 * seconds_per_tick, FALSE) - - return ..() - -/mob/living/simple_animal/hostile/heretic_summon/ash_spirit - name = "Ash Man" - real_name = "Ashy" - desc = "An incomprehensible abomination. As it moves, a thin trail of ash follows, appearing from seemingly nowhere." - icon_state = "ash_walker" - icon_living = "ash_walker" - status_flags = CANPUSH - maxHealth = 75 - health = 75 - melee_damage_lower = 15 - melee_damage_upper = 20 - sight = SEE_TURFS - actions_to_add = list( - /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash, - /datum/action/cooldown/spell/pointed/cleave, - /datum/action/cooldown/spell/fire_sworn, - ) - -/mob/living/simple_animal/hostile/heretic_summon/stalker - name = "Flesh Stalker" - real_name = "Flesh Stalker" - desc = "An abomination made from several limbs and organs. Every moment you stare at it, it appears to shift and change unnaturally." - icon_state = "stalker" - icon_living = "stalker" - status_flags = CANPUSH - maxHealth = 150 - health = 150 - melee_damage_lower = 15 - melee_damage_upper = 20 - sight = SEE_MOBS - actions_to_add = list( - /datum/action/cooldown/spell/shapeshift/eldritch, - /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash, - /datum/action/cooldown/spell/emp/eldritch, - ) diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm deleted file mode 100644 index d5bbf01286f60..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ /dev/null @@ -1,161 +0,0 @@ -/obj/projectile/hivebotbullet - damage = 10 - damage_type = BRUTE - -/mob/living/simple_animal/hostile/hivebot - name = "hivebot" - desc = "A small robot." - icon = 'icons/mob/simple/hivebot.dmi' - icon_state = "basic" - icon_living = "basic" - icon_dead = "basic" - gender = NEUTER - mob_biotypes = MOB_ROBOTIC - health = 15 - maxHealth = 15 - healable = 0 - melee_damage_lower = 2 - melee_damage_upper = 3 - attack_verb_continuous = "claws" - attack_verb_simple = "claw" - attack_sound = 'sound/weapons/bladeslice.ogg' - attack_vis_effect = ATTACK_EFFECT_CLAW - projectilesound = 'sound/weapons/gun/pistol/shot.ogg' - projectiletype = /obj/projectile/hivebotbullet - faction = list(FACTION_HIVEBOT) - check_friendly_fire = 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 - verb_say = "states" - verb_ask = "queries" - verb_exclaim = "declares" - verb_yell = "alarms" - bubble_icon = "machine" - speech_span = SPAN_ROBOT - del_on_death = 1 - loot = list(/obj/effect/decal/cleanable/robot_debris) - var/alert_light - - footstep_type = FOOTSTEP_MOB_CLAW - -/mob/living/simple_animal/hostile/hivebot/Initialize(mapload) - . = ..() - death_message = "[src] blows apart!" - -/mob/living/simple_animal/hostile/hivebot/Aggro() - . = ..() - set_combat_mode(TRUE) - update_icons() - if(prob(5)) - say(pick("INTRUDER DETECTED!", "CODE 7-34.", "101010!!"), forced = type) - -/mob/living/simple_animal/hostile/hivebot/LoseAggro() - . = ..() - set_combat_mode(FALSE) - update_icons() - -/mob/living/simple_animal/hostile/hivebot/update_icons() - QDEL_NULL(alert_light) - if(combat_mode) - icon_state = "[initial(icon_state)]_attack" - alert_light = mob_light(6, 0.4, COLOR_RED_LIGHT) - else - icon_state = initial(icon_state) - -/mob/living/simple_animal/hostile/hivebot/death(gibbed) - do_sparks(3, TRUE, src) - ..(TRUE) - -/mob/living/simple_animal/hostile/hivebot/range - name = "hivebot" - desc = "A smallish robot, this one is armed!" - icon_state = "ranged" - icon_living = "ranged" - icon_dead = "ranged" - ranged = TRUE - retreat_distance = 5 - minimum_distance = 5 - -/mob/living/simple_animal/hostile/hivebot/rapid - icon_state = "ranged" - icon_living = "ranged" - icon_dead = "ranged" - ranged = TRUE - rapid = 3 - retreat_distance = 5 - minimum_distance = 5 - -/mob/living/simple_animal/hostile/hivebot/strong - name = "strong hivebot" - icon_state = "strong" - icon_living = "strong" - icon_dead = "strong" - desc = "A robot, this one is armed and looks tough!" - health = 80 - maxHealth = 80 - ranged = TRUE - -/mob/living/simple_animal/hostile/hivebot/mechanic - name = "hivebot mechanic" - icon_state = "strong" - icon_living = "strong" - icon_dead = "strong" - desc = "A robot built for base upkeep, intended for use inside hivebot colonies." - health = 60 - maxHealth = 60 - ranged = TRUE - rapid = 3 - gold_core_spawnable = HOSTILE_SPAWN - var/datum/action/innate/hivebot/foamwall/foam - -/mob/living/simple_animal/hostile/hivebot/mechanic/Initialize(mapload) - . = ..() - foam = new - foam.Grant(src) - -/mob/living/simple_animal/hostile/hivebot/mechanic/AttackingTarget() - if(ismachinery(target)) - var/obj/machinery/fixable = target - if(fixable.get_integrity() >= fixable.max_integrity) - to_chat(src, span_warning("Diagnostics indicate that this machine is at peak integrity.")) - return - to_chat(src, span_warning("You begin repairs...")) - if(do_after(src, 50, target = fixable)) - fixable.repair_damage(fixable.max_integrity - fixable.get_integrity()) - do_sparks(3, TRUE, fixable) - to_chat(src, span_warning("Repairs complete.")) - return - if(istype(target, /mob/living/simple_animal/hostile/hivebot)) - var/mob/living/simple_animal/hostile/hivebot/fixable = target - if(fixable.health >= fixable.maxHealth) - to_chat(src, span_warning("Diagnostics indicate that this unit is at peak integrity.")) - return - to_chat(src, span_warning("You begin repairs...")) - if(do_after(src, 50, target = fixable)) - fixable.revive(HEAL_ALL) - do_sparks(3, TRUE, fixable) - to_chat(src, span_warning("Repairs complete.")) - return - return ..() - -/datum/action/innate/hivebot - background_icon_state = "bg_default" - overlay_icon_state = "bg_default_border" - -/datum/action/innate/hivebot/foamwall - name = "Foam Wall" - desc = "Creates a foam wall that resists against the vacuum of space." - -/datum/action/innate/hivebot/foamwall/Activate() - var/mob/living/simple_animal/hostile/hivebot/H = owner - var/turf/T = get_turf(H) - if(T.density) - to_chat(H, span_warning("There's already something on this tile!")) - return - to_chat(H, span_warning("You begin to create a foam wall at your position...")) - if(do_after(H, 50, target = H)) - for(var/obj/structure/foamedmetal/FM in T.contents) - to_chat(H, span_warning("There's already a foam wall on this tile!")) - return - new /obj/structure/foamedmetal(H.loc) - playsound(get_turf(H), 'sound/effects/extinguish.ogg', 50, TRUE, -1) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index d0276cc2d2e52..3248fd9c2aad1 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -161,7 +161,7 @@ return ..() /mob/living/simple_animal/hostile/electrocute_act(shock_damage, source, siemens_coeff, flags) - if(stat == CONSCIOUS && !target && AIStatus != AI_OFF && !client) + if(stat == CONSCIOUS && !target && AIStatus != AI_OFF && !client && isatom(source)) // strings are sometimes used in electrocute_act() FindTarget(list(source)) return ..() @@ -246,6 +246,10 @@ // Please do not add one-off mob AIs here, but override this function for your mob /mob/living/simple_animal/hostile/CanAttack(atom/the_target)//Can we actually attack a possible target? + if(!isatom(the_target)) + stack_trace("Invalid target in CanAttack(): [the_target]") + return FALSE + if(isturf(the_target) || QDELETED(the_target) || QDELETED(src)) // bail out on invalids return FALSE @@ -475,20 +479,11 @@ else targeted_zone = ran_zone() casing.fire_casing(targeted_atom, src, null, null, null, targeted_zone, 0, src) - else if(projectiletype) - var/obj/projectile/P = new projectiletype(startloc) - playsound(src, projectilesound, 100, TRUE) - P.starting = startloc - P.firer = src - P.fired_from = src - P.yo = targeted_atom.y - startloc.y - P.xo = targeted_atom.x - startloc.x + return + if(projectiletype) + fire_projectile(projectiletype, targeted_atom, projectilesound) if(AIStatus != AI_ON)//Don't want mindless mobs to have their movement screwed up firing in space newtonian_move(get_dir(targeted_atom, target_from)) - P.original = targeted_atom - P.preparePixelProjectile(targeted_atom, src) - P.fire() - return P /mob/living/simple_animal/hostile/proc/CanSmashTurfs(turf/T) @@ -666,6 +661,7 @@ LoseTarget() /mob/living/simple_animal/hostile/proc/add_target(new_target) + SEND_SIGNAL(src, COMSIG_HOSTILE_FOUND_TARGET, new_target) if(target) UnregisterSignal(target, COMSIG_QDELETING) target = new_target diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm index 801a9e75ec841..65c03c446df5a 100644 --- a/code/modules/mob/living/simple_animal/hostile/illusion.dm +++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm @@ -16,25 +16,19 @@ health = 100 speed = 0 faction = list(FACTION_ILLUSION) - var/life_span = INFINITY //how long until they despawn - var/mob/living/parent_mob - var/multiply_chance = 0 //if we multiply on hit - del_on_death = 1 + del_on_death = TRUE death_message = "vanishes into thin air! It was a fake!" + /// Weakref to what we're copying + var/datum/weakref/parent_mob_ref + /// Prob of getting a clone on attack + var/multiply_chance = 0 - -/mob/living/simple_animal/hostile/illusion/Life(seconds_per_tick = SSMOBS_DT, times_fired) - ..() - if(world.time > life_span) - death() - - -/mob/living/simple_animal/hostile/illusion/proc/Copy_Parent(mob/living/original, life = 50, hp = 100, damage = 0, replicate = 0 ) +/mob/living/simple_animal/hostile/illusion/proc/Copy_Parent(mob/living/original, life = 5 SECONDS, hp = 100, damage = 0, replicate = 0) appearance = original.appearance - parent_mob = original + parent_mob_ref = WEAKREF(original) setDir(original.dir) - life_span = world.time+life - health = hp + maxHealth = hp + updatehealth() // re-cap health to new value melee_damage_lower = damage melee_damage_upper = damage multiply_chance = replicate @@ -42,25 +36,28 @@ transform = initial(transform) pixel_x = base_pixel_x pixel_y = base_pixel_y - + addtimer(CALLBACK(src, TYPE_PROC_REF(/mob/living, death)), life) /mob/living/simple_animal/hostile/illusion/examine(mob/user) + var/mob/living/parent_mob = parent_mob_ref?.resolve() if(parent_mob) return parent_mob.examine(user) - else - return ..() - + return ..() /mob/living/simple_animal/hostile/illusion/AttackingTarget() . = ..() - if(. && isliving(target) && prob(multiply_chance)) - var/mob/living/L = target - if(L.stat == DEAD) - return - var/mob/living/simple_animal/hostile/illusion/M = new(loc) - M.faction = faction.Copy() - M.Copy_Parent(parent_mob, 80, health/2, melee_damage_upper, multiply_chance/2) - M.GiveTarget(L) + if(!. || !isliving(target) || !prob(multiply_chance)) + return + var/mob/living/hitting_target = target + if(hitting_target.stat == DEAD) + return + var/mob/living/parent_mob = parent_mob_ref?.resolve() + if(isnull(parent_mob)) + return + var/mob/living/simple_animal/hostile/illusion/new_clone = new(loc) + new_clone.Copy_Parent(parent_mob, 8 SECONDS, health / 2, melee_damage_upper, multiply_chance / 2) + new_clone.faction = faction.Copy() + new_clone.GiveTarget(target) ///////Actual Types///////// 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 73b7f6aa62604..04bb2f94cc9c6 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm @@ -132,9 +132,10 @@ taste_mult = 1.3 /datum/reagent/toxin/leaper_venom/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) + . = ..() if(volume >= 10) - M.adjustToxLoss(5 * REM * seconds_per_tick, 0) - ..() + if(M.adjustToxLoss(5 * REM * seconds_per_tick, updating_health = FALSE)) + . = UPDATE_MOB_HEALTH /obj/effect/temp_visual/leaper_crush name = "grim tidings" @@ -148,6 +149,7 @@ /mob/living/simple_animal/hostile/jungle/leaper/Initialize(mapload) . = ..() + AddComponent(/datum/component/seethrough_mob) remove_verb(src, /mob/living/verb/pulled) add_cell_sample() @@ -215,9 +217,8 @@ if(z != target.z) return hopping = TRUE - set_density(FALSE) + add_traits(list(TRAIT_UNDENSE, TRAIT_NO_TRANSFORM), LEAPING_TRAIT) pass_flags |= PASSMOB - notransform = TRUE var/turf/new_turf = locate((target.x + rand(-3,3)),(target.y + rand(-3,3)),target.z) if(player_hop) new_turf = get_turf(target) @@ -228,8 +229,7 @@ throw_at(new_turf, max(3,get_dist(src,new_turf)), 1, src, FALSE, callback = CALLBACK(src, PROC_REF(FinishHop))) /mob/living/simple_animal/hostile/jungle/leaper/proc/FinishHop() - set_density(TRUE) - notransform = FALSE + remove_traits(list(TRAIT_UNDENSE, TRAIT_NO_TRANSFORM), LEAPING_TRAIT) pass_flags &= ~PASSMOB hopping = FALSE playsound(src.loc, 'sound/effects/meteorimpact.ogg', 100, TRUE) @@ -240,18 +240,17 @@ /mob/living/simple_animal/hostile/jungle/leaper/proc/BellyFlop() var/turf/new_turf = get_turf(target) hopping = TRUE - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, LEAPING_TRAIT) new /obj/effect/temp_visual/leaper_crush(new_turf) - addtimer(CALLBACK(src, PROC_REF(BellyFlopHop), new_turf), 30) + addtimer(CALLBACK(src, PROC_REF(BellyFlopHop), new_turf), 3 SECONDS) /mob/living/simple_animal/hostile/jungle/leaper/proc/BellyFlopHop(turf/T) - set_density(FALSE) + ADD_TRAIT(src, TRAIT_UNDENSE, LEAPING_TRAIT) throw_at(T, get_dist(src,T),1,src, FALSE, callback = CALLBACK(src, PROC_REF(Crush))) /mob/living/simple_animal/hostile/jungle/leaper/proc/Crush() hopping = FALSE - set_density(TRUE) - notransform = FALSE + remove_traits(list(TRAIT_UNDENSE, TRAIT_NO_TRANSFORM), LEAPING_TRAIT) playsound(src, 'sound/effects/meteorimpact.ogg', 200, TRUE) for(var/mob/living/L in orange(1, src)) L.adjustBruteLoss(35) diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm b/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm deleted file mode 100644 index b7caeb42c148b..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm +++ /dev/null @@ -1,84 +0,0 @@ -//Large and powerful, but timid. It won't engage anything above 50 health, or anything without legcuffs. -//It can fire fleshy snares that legcuff anyone that it hits, making them look especially tasty to the arachnid. -/mob/living/simple_animal/hostile/jungle/mega_arachnid - name = "mega arachnid" - desc = "Though physically imposing, it prefers to ambush its prey, and it will only engage with an already crippled opponent." - icon = 'icons/mob/simple/jungle/arachnid.dmi' - icon_state = "arachnid" - icon_living = "arachnid" - icon_dead = "arachnid_dead" - mob_biotypes = MOB_ORGANIC|MOB_BUG - melee_damage_lower = 30 - melee_damage_upper = 30 - maxHealth = 300 - health = 300 - speed = 1 - ranged = 1 - pixel_x = -16 - base_pixel_x = -16 - move_to_delay = 10 - aggro_vision_range = 9 - speak_emote = list("chitters") - attack_sound = 'sound/weapons/bladeslice.ogg' - attack_vis_effect = ATTACK_EFFECT_SLASH - ranged_cooldown_time = 60 - projectiletype = /obj/projectile/mega_arachnid - projectilesound = 'sound/weapons/pierce.ogg' - 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(seconds_per_tick = SSMOBS_DT, times_fired) - ..() - if(target && ranged_cooldown > world.time && iscarbon(target)) - var/mob/living/carbon/C = target - if(!C.legcuffed && C.health < 50) - retreat_distance = 9 - minimum_distance = 9 - alpha = 125 - return - retreat_distance = 0 - minimum_distance = 0 - alpha = 255 - - -/mob/living/simple_animal/hostile/jungle/mega_arachnid/Aggro() - ..() - alpha = 255 - -/mob/living/simple_animal/hostile/jungle/mega_arachnid/LoseAggro() - ..() - alpha = 50 - -/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) - -/obj/projectile/mega_arachnid - name = "flesh snare" - icon_state = "tentacle_end" - damage = 0 - -/obj/projectile/mega_arachnid/on_hit(atom/target, blocked = FALSE) - if(iscarbon(target) && blocked < 100) - var/obj/item/restraints/legcuffs/beartrap/mega_arachnid/B = new /obj/item/restraints/legcuffs/beartrap/mega_arachnid(get_turf(target)) - B.spring_trap(null, target) - return ..() - -/obj/item/restraints/legcuffs/beartrap/mega_arachnid - name = "fleshy restraints" - desc = "Used by mega arachnids to immobilize their prey." - item_flags = DROPDEL - flags_1 = NONE - 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 2e65ba8245685..444635f2dc344 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm @@ -107,7 +107,7 @@ /mob/living/simple_animal/hostile/jungle/mook/proc/LeapAttack() if(target && !stat && attack_state == MOOK_ATTACK_WARMUP) attack_state = MOOK_ATTACK_ACTIVE - set_density(FALSE) + ADD_TRAIT(src, TRAIT_UNDENSE, LEAPING_TRAIT) melee_damage_lower = 30 melee_damage_upper = 30 update_icons() @@ -123,7 +123,7 @@ /mob/living/simple_animal/hostile/jungle/mook/proc/AttackRecovery() if(attack_state == MOOK_ATTACK_ACTIVE && !stat) attack_state = MOOK_ATTACK_RECOVERY - set_density(TRUE) + REMOVE_TRAIT(src, TRAIT_UNDENSE, LEAPING_TRAIT) face_atom(target) if(!struck_target_leap) update_icons() @@ -156,7 +156,7 @@ if(CanAttack(L)) L.attack_animal(src) struck_target_leap = TRUE - set_density(TRUE) + REMOVE_TRAIT(src, TRAIT_UNDENSE, LEAPING_TRAIT) update_icons() var/mook_under_us = FALSE for(var/A in get_turf(src)) @@ -169,7 +169,7 @@ if(!struck_target_leap && CanAttack(ML))//Check if some joker is attempting to use rest to evade us struck_target_leap = TRUE ML.attack_animal(src) - set_density(TRUE) + REMOVE_TRAIT(src, TRAIT_UNDENSE, LEAPING_TRAIT) struck_target_leap = TRUE update_icons() continue diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm deleted file mode 100644 index 19b99e79a9ece..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm +++ /dev/null @@ -1,240 +0,0 @@ -#define SEEDLING_STATE_NEUTRAL 0 -#define SEEDLING_STATE_WARMUP 1 -#define SEEDLING_STATE_ACTIVE 2 -#define SEEDLING_STATE_RECOVERY 3 - -//A plant rooted in the ground that forfeits its melee attack in favor of ranged barrages. -//It will fire flurries of solar energy, and occasionally charge up a powerful blast that makes it vulnerable to attack. -/mob/living/simple_animal/hostile/jungle/seedling - name = "seedling" - desc = "This oversized, predatory flower conceals what can only be described as an organic energy cannon, and it will not die until its hidden vital organs are sliced out. \ - The concentrated streams of energy it sometimes produces require its full attention, attacking it during this time will prevent it from finishing its attack." - icon = 'icons/mob/simple/jungle/seedling.dmi' - icon_state = "seedling" - icon_living = "seedling" - icon_dead = "seedling_dead" - mob_biotypes = MOB_ORGANIC | MOB_PLANT - maxHealth = 100 - health = 100 - melee_damage_lower = 30 - melee_damage_upper = 30 - SET_BASE_PIXEL(-16, -14) - - minimum_distance = 3 - move_to_delay = 20 - vision_range = 9 - aggro_vision_range = 15 - ranged = TRUE - ranged_cooldown_time = 10 - projectiletype = /obj/projectile/seedling - projectilesound = 'sound/weapons/pierce.ogg' - robust_searching = TRUE - stat_attack = HARD_CRIT - move_resist = MOVE_FORCE_EXTREMELY_STRONG - var/combatant_state = SEEDLING_STATE_NEUTRAL - var/mob/living/beam_debuff_target - var/solar_beam_identifier = 0 - -/obj/projectile/seedling - name = "solar energy" - icon_state = "seedling" - damage = 10 - damage_type = BURN - light_range = 2 - armor_flag = ENERGY - light_color = LIGHT_COLOR_DIM_YELLOW - hitsound = 'sound/weapons/sear.ogg' - hitsound_wall = 'sound/weapons/effects/searwall.ogg' - nondirectional_sprite = TRUE - -/obj/projectile/seedling/Bump(atom/A)//Stops seedlings from destroying other jungle mobs through FF - if(isliving(A)) - var/mob/living/L = A - if(FACTION_JUNGLE in L.faction) - return FALSE - return ..() - -/obj/effect/temp_visual/solarbeam_killsat - name = "beam of solar energy" - icon_state = "solar_beam" - icon = 'icons/effects/beam.dmi' - plane = LIGHTING_PLANE - layer = LIGHTING_PRIMARY_LAYER - duration = 5 - randomdir = FALSE - -/datum/status_effect/seedling_beam_indicator - id = "seedling beam indicator" - duration = 30 - status_type = STATUS_EFFECT_MULTIPLE - alert_type = null - tick_interval = 1 - var/atom/movable/screen/seedling/seedling_screen_object - var/atom/target - - -/datum/status_effect/seedling_beam_indicator/on_creation(mob/living/new_owner, target_plant) - . = ..() - if(.) - target = target_plant - tick() - -/datum/status_effect/seedling_beam_indicator/on_apply() - if(owner.client) - seedling_screen_object = new /atom/movable/screen/seedling() - owner.client.screen += seedling_screen_object - tick() - return ..() - -/datum/status_effect/seedling_beam_indicator/Destroy() - if(owner) - if(owner.client) - owner.client.screen -= seedling_screen_object - return ..() - -/datum/status_effect/seedling_beam_indicator/tick() - var/target_angle = get_angle(owner, target) - var/matrix/final = matrix() - final.Turn(target_angle) - seedling_screen_object.transform = final - -/atom/movable/screen/seedling - icon = 'icons/mob/simple/jungle/arachnid.dmi' - icon_state = "seedling_beam_indicator" - screen_loc = "CENTER:-16,CENTER:-16" - -/mob/living/simple_animal/hostile/jungle/seedling/Goto() - if(combatant_state != SEEDLING_STATE_NEUTRAL) - return - return ..() - -/mob/living/simple_animal/hostile/jungle/seedling/AttackingTarget() - if(isliving(target)) - if(ranged_cooldown <= world.time && combatant_state == SEEDLING_STATE_NEUTRAL) - OpenFire(target) - return - return ..() - -/mob/living/simple_animal/hostile/jungle/seedling/OpenFire() - WarmupAttack() - -/mob/living/simple_animal/hostile/jungle/seedling/proc/WarmupAttack() - if(combatant_state == SEEDLING_STATE_NEUTRAL) - combatant_state = SEEDLING_STATE_WARMUP - SSmove_manager.stop_looping(src) - update_icons() - var/target_dist = get_dist(src,target) - var/living_target_check = isliving(target) - if(living_target_check) - if(target_dist > 7)//Offscreen check - SolarBeamStartup(target) - return - if(get_dist(src,target) >= 4 && prob(40)) - SolarBeamStartup(target) - return - addtimer(CALLBACK(src, PROC_REF(Volley)), 5) - -/mob/living/simple_animal/hostile/jungle/seedling/proc/SolarBeamStartup(mob/living/living_target)//It's more like requiem than final spark - if(combatant_state == SEEDLING_STATE_WARMUP && target) - combatant_state = SEEDLING_STATE_ACTIVE - living_target.apply_status_effect(/datum/status_effect/seedling_beam_indicator, src) - beam_debuff_target = living_target - playsound(src,'sound/effects/seedling_chargeup.ogg', 100, FALSE) - if(get_dist(src,living_target) > 7) - playsound(living_target,'sound/effects/seedling_chargeup.ogg', 100, FALSE) - solar_beam_identifier = world.time - addtimer(CALLBACK(src, PROC_REF(Beamu), living_target, solar_beam_identifier), 35) - -/mob/living/simple_animal/hostile/jungle/seedling/proc/Beamu(mob/living/living_target, beam_id = 0) - if(combatant_state == SEEDLING_STATE_ACTIVE && living_target && beam_id == solar_beam_identifier) - if(living_target.z == z) - update_icons() - var/obj/effect/temp_visual/solarbeam_killsat/S = new (get_turf(src)) - var/matrix/starting = matrix() - starting.Scale(1,32) - starting.Translate(0,520) - S.transform = starting - var/obj/effect/temp_visual/solarbeam_killsat/K = new (get_turf(living_target)) - var/matrix/final = matrix() - final.Scale(1,32) - final.Translate(0,512) - K.transform = final - living_target.adjustFireLoss(30) - living_target.adjust_fire_stacks(0.2)//Just here for the showmanship - living_target.ignite_mob() - playsound(living_target,'sound/weapons/sear.ogg', 50, TRUE) - addtimer(CALLBACK(src, PROC_REF(AttackRecovery)), 5) - return - AttackRecovery() - -/mob/living/simple_animal/hostile/jungle/seedling/proc/Volley() - if(combatant_state == SEEDLING_STATE_WARMUP && target) - combatant_state = SEEDLING_STATE_ACTIVE - update_icons() - var/datum/callback/cb = CALLBACK(src, PROC_REF(InaccurateShot)) - for(var/i in 1 to 13) - addtimer(cb, i) - addtimer(CALLBACK(src, PROC_REF(AttackRecovery)), 14) - -/mob/living/simple_animal/hostile/jungle/seedling/proc/InaccurateShot() - if(!QDELETED(target) && combatant_state == SEEDLING_STATE_ACTIVE && !stat) - if(get_dist(src,target) <= 3)//If they're close enough just aim straight at them so we don't miss at point blank ranges - Shoot(target) - return - var/turf/our_turf = get_turf(src) - var/obj/projectile/seedling/readied_shot = new /obj/projectile/seedling(our_turf) - readied_shot.preparePixelProjectile(target, src, null, rand(-10, 10)) - readied_shot.fire() - playsound(src, projectilesound, 100, TRUE) - -/mob/living/simple_animal/hostile/jungle/seedling/proc/AttackRecovery() - if(combatant_state == SEEDLING_STATE_ACTIVE) - combatant_state = SEEDLING_STATE_RECOVERY - update_icons() - ranged_cooldown = world.time + ranged_cooldown_time - if(target) - face_atom(target) - addtimer(CALLBACK(src, PROC_REF(ResetNeutral)), 10) - -/mob/living/simple_animal/hostile/jungle/seedling/proc/ResetNeutral() - combatant_state = SEEDLING_STATE_NEUTRAL - if(target && !stat) - update_icons() - Goto(target, move_to_delay, minimum_distance) - -/mob/living/simple_animal/hostile/jungle/seedling/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - . = ..() - if(combatant_state == SEEDLING_STATE_ACTIVE && beam_debuff_target) - beam_debuff_target.remove_status_effect(/datum/status_effect/seedling_beam_indicator) - beam_debuff_target = null - solar_beam_identifier = 0 - AttackRecovery() - -/mob/living/simple_animal/hostile/jungle/seedling/update_icons() - . = ..() - if(!stat) - switch(combatant_state) - if(SEEDLING_STATE_NEUTRAL) - icon_state = "seedling" - if(SEEDLING_STATE_WARMUP) - icon_state = "seedling_charging" - if(SEEDLING_STATE_ACTIVE) - icon_state = "seedling_fire" - if(SEEDLING_STATE_RECOVERY) - icon_state = "seedling" - -/mob/living/simple_animal/hostile/jungle/seedling/GiveTarget() - if(target) - if(combatant_state == SEEDLING_STATE_WARMUP || combatant_state == SEEDLING_STATE_ACTIVE)//So it doesn't 180 and blast you in the face while it's firing at someone else - return - return ..() - -/mob/living/simple_animal/hostile/jungle/seedling/LoseTarget() - if(combatant_state == SEEDLING_STATE_WARMUP || combatant_state == SEEDLING_STATE_ACTIVE) - return - return ..() - -#undef SEEDLING_STATE_NEUTRAL -#undef SEEDLING_STATE_WARMUP -#undef SEEDLING_STATE_ACTIVE -#undef SEEDLING_STATE_RECOVERY diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm index dc2971ee3d506..ea6a96e8911db 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm @@ -6,7 +6,7 @@ combat_mode = TRUE sentience_type = SENTIENCE_BOSS environment_smash = ENVIRONMENT_SMASH_RWALLS - mob_biotypes = MOB_ORGANIC|MOB_EPIC + mob_biotypes = MOB_ORGANIC|MOB_SPECIAL obj_damage = 400 light_range = 3 faction = list(FACTION_MINING, FACTION_BOSS) @@ -50,11 +50,10 @@ 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) . = ..() + AddComponent(/datum/component/seethrough_mob) AddElement(/datum/element/simple_flying) if(gps_name && true_spawn) AddComponent(/datum/component/gps, gps_name) @@ -63,9 +62,6 @@ 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 @@ -74,7 +70,10 @@ return ..() /mob/living/simple_animal/hostile/megafauna/death(gibbed, list/force_grant) - if(health > 0) + if(gibbed) // in case they've been force dusted + return ..() + + if(health > 0) // prevents instakills return var/datum/status_effect/crusher_damage/crusher_dmg = has_status_effect(/datum/status_effect/crusher_damage) ///Whether we killed the megafauna with primarily crusher damage or not @@ -99,14 +98,21 @@ /mob/living/simple_animal/hostile/megafauna/gib() if(health > 0) return - else - ..() + + return ..() + +/mob/living/simple_animal/hostile/megafauna/singularity_act() + set_health(0) + return ..() /mob/living/simple_animal/hostile/megafauna/dust(just_ash, drop_items, force) if(!force && health > 0) return - else - ..() + + crusher_loot.Cut() + loot.Cut() + + return ..() /mob/living/simple_animal/hostile/megafauna/AttackingTarget() if(recovery_time >= world.time) @@ -118,24 +124,47 @@ if(!client && ranged && ranged_cooldown <= world.time) OpenFire() - if(L.health <= HEALTH_THRESHOLD_DEAD && HAS_TRAIT(L, TRAIT_NODEATH)) //Nope, it still gibs yall + if(L.health <= HEALTH_THRESHOLD_DEAD && HAS_TRAIT(L, TRAIT_NODEATH)) //Nope, it still kills 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) + if(!L || L.has_status_effect(/datum/status_effect/gutted)) return FALSE - visible_message( - span_danger("[src] devours [L]!"), - span_userdanger("You feast on [L], restoring your health!")) + celebrate_kill(L) if(!is_station_level(z) || client) //NPC monsters won't heal while on station adjustBruteLoss(-L.maxHealth/2) L.investigate_log("has been devoured by [src].", INVESTIGATE_DEATHS) - L.gib() + var/mob/living/carbon/carbonTarget = L + if(istype(carbonTarget)) + qdel(L.get_organ_slot(ORGAN_SLOT_LUNGS)) + qdel(L.get_organ_slot(ORGAN_SLOT_HEART)) + qdel(L.get_organ_slot(ORGAN_SLOT_LIVER)) + L.adjustBruteLoss(500) + L.death() //make sure they die + L.apply_status_effect(/datum/status_effect/gutted) + LoseTarget() return TRUE +/mob/living/simple_animal/hostile/megafauna/proc/celebrate_kill(mob/living/L) + visible_message( + span_danger("[src] disembowels [L]!"), + span_userdanger("You feast on [L]'s organs, restoring your health!")) + + + +/mob/living/simple_animal/hostile/megafauna/CanAttack(atom/the_target) + . = ..() + if (!.) + return FALSE + if(!isliving(the_target)) + return TRUE + var/mob/living/living_target = the_target + return !living_target.has_status_effect(/datum/status_effect/gutted) + + /mob/living/simple_animal/hostile/megafauna/ex_act(severity, target) switch (severity) if (EXPLODE_DEVASTATE) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm index c401c51ae8b5f..1bd196651fd8c 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm @@ -35,6 +35,7 @@ Difficulty: Medium move_to_delay = 3 ranged = TRUE ranged_cooldown_time = 1.6 SECONDS + rapid_melee = 5 // starts fast because the saw's closed. gets reduced appropriately when extended, see their transform_weapon ability 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) @@ -47,11 +48,12 @@ Difficulty: Medium 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 death_message = "falls to the ground, decaying into glowing particles." death_sound = 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 + /// Does this blood-drunk miner heal slightly while attacking and heal more when gibbing people? + var/guidance = FALSE /// Dash ability var/datum/action/cooldown/mob_cooldown/dash/dash /// Kinetic accelerator ability @@ -73,6 +75,7 @@ Difficulty: Medium kinetic_accelerator.Grant(src) dash_attack.Grant(src) transform_weapon.Grant(src) + AddComponent(/datum/component/boss_music, 'sound/lavaland/bdm_boss.ogg', 167 SECONDS) /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Destroy() QDEL_NULL(dash) @@ -97,9 +100,8 @@ Difficulty: Medium 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" + target.add_stun_absorption(source = "miner", duration = 1 SECONDS, priority = INFINITY) + return ..() /obj/projectile/kinetic/miner damage = 20 @@ -133,17 +135,14 @@ Difficulty: Medium 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!")) + var/mob/living/living_target = target + if(living_target.stat == DEAD) if(!is_station_level(z) || client) //NPC monsters won't heal while on station if(guidance) - adjustHealth(-L.maxHealth) + adjustHealth(-living_target.maxHealth) else - adjustHealth(-(L.maxHealth * 0.5)) - L.investigate_log("has been gibbed by [src].", INVESTIGATE_DEATHS) - L.gib() + adjustHealth(-(living_target.maxHealth * 0.5)) + devour(living_target) return TRUE changeNext_move(CLICK_CD_MELEE) miner_saw.melee_attack_chain(src, target) @@ -151,8 +150,8 @@ Difficulty: Medium 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)) +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/do_attack_animation(atom/attacked_atom, visual_effect_icon, obj/item/used_item, no_effect) + if(!used_item && !isturf(attacked_atom)) used_item = miner_saw ..() @@ -171,13 +170,13 @@ Difficulty: Medium 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/matrix/our_matrix = new + our_matrix.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) + animate(src, transform = our_matrix, pixel_y = -6, dir = final_dir, time = 2, easing = EASE_IN|EASE_OUT) sleep(0.5 SECONDS) animate(src, color = list("#A7A19E", "#A7A19E", "#A7A19E", list(0, 0, 0)), time = 10, easing = EASE_IN, flags = ANIMATION_PARALLEL) sleep(0.4 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 index 55b80a8d0b89f..02d9e582b1a47 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -67,7 +67,6 @@ Difficulty: Hard score_achievement_type = /datum/award/score/bubblegum_score death_message = "sinks into a pool of blood, fleeing the battle. You've won, for now... " death_sound = 'sound/magic/enter_blood.ogg' - small_sprite_type = /datum/action/small_sprite/megafauna/bubblegum faction = list(FACTION_MINING, FACTION_BOSS, FACTION_HELL) /// Check to see if we should spawn blood var/spawn_blood = TRUE @@ -154,7 +153,7 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/bubblegum/attackby(obj/item/W, mob/user, params) . = ..() if(istype(W, /obj/item/organ/internal/tongue)) - user.client?.give_award(/datum/award/achievement/misc/frenching, user) + user.client?.give_award(/datum/award/achievement/jobs/frenching, user) /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/try_bloodattack() var/list/targets = get_mobs_on_blood() 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 index cf909081e77c6..d7e82507f747c 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/clockwork_knight.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/clockwork_knight.dm @@ -50,7 +50,7 @@ I'd rather there be something than the clockwork ruin be entirely empty though s /obj/item/clockwork_alloy name = "clockwork alloy" desc = "The remains of the strongest clockwork knight." - icon = 'icons/obj/ice_moon/artifacts.dmi' + icon = 'icons/obj/mining_zones/artefacts.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 index 9e338a66b8bec..5c63ca4e88400 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -55,7 +55,6 @@ loot = list(/obj/structure/closet/crate/necropolis/colossus) death_message = "disintegrates, leaving a glowing core in its wake." death_sound = '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/colossus/spiral_shots /// Random shots ablity @@ -158,11 +157,6 @@ var/mob/living/carbon/human/human_victim = victim return human_victim.mind && istype(human_victim.mind.martial_art, /datum/martial_art/the_sleeping_carp) -/mob/living/simple_animal/hostile/megafauna/colossus/devour(mob/living/victim) - visible_message(span_colossus("[src] disintegrates [victim]!")) - victim.investigate_log("has been devoured by [src].", INVESTIGATE_DEATHS) - victim.dust() - /obj/effect/temp_visual/at_shield name = "anti-toolbox field" desc = "A shimmering forcefield protecting the colossus." @@ -229,7 +223,7 @@ 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 = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "anomaly_crystal" light_range = 8 resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF @@ -425,7 +419,7 @@ name = "lavaland" floor = /turf/open/floor/fakebasalt wall = /turf/closed/wall/mineral/cult - flora_and_fauna = list(/mob/living/simple_animal/hostile/asteroid/goldgrub) + flora_and_fauna = list(/mob/living/basic/mining/goldgrub) flora_and_fauna_chance = 1 // Snow terrain is slow to move in and cold! Get the assistants to shovel your driveway. @@ -594,8 +588,7 @@ . = ..() if(isliving(arrived) && holder_animal) var/mob/living/possessor = arrived - possessor.notransform = TRUE - ADD_TRAIT(possessor, TRAIT_MUTE, STASIS_MUTE) + possessor.add_traits(list(TRAIT_UNDENSE, TRAIT_NO_TRANSFORM), STASIS_MUTE) possessor.status_flags |= GODMODE possessor.mind.transfer_to(holder_animal) var/datum/action/exit_possession/escape = new(holder_animal) @@ -604,9 +597,8 @@ /obj/structure/closet/stasis/dump_contents(kill = TRUE) for(var/mob/living/possessor in src) - REMOVE_TRAIT(possessor, TRAIT_MUTE, STASIS_MUTE) + possessor.remove_traits(list(TRAIT_UNDENSE, TRAIT_NO_TRANSFORM), STASIS_MUTE) possessor.status_flags &= ~GODMODE - possessor.notransform = FALSE if(kill || !isanimal_or_basicmob(loc)) possessor.investigate_log("has died from [src].", INVESTIGATE_DEATHS) possessor.death(FALSE) @@ -615,7 +607,7 @@ holder_animal.mind.transfer_to(possessor) possessor.mind.grab_ghost(force = TRUE) holder_animal.investigate_log("has been gibbed by [src].", INVESTIGATE_DEATHS) - holder_animal.gib() + holder_animal.gib(DROP_ALL_REMAINS) return ..() return ..() 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 index 6caea3efaad10..8a307cec2bd75 100644 --- 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 @@ -80,6 +80,7 @@ Difficulty: Extremely Hard AddElement(/datum/element/knockback, 7, FALSE, TRUE) AddElement(/datum/element/lifesteal, 50) ADD_TRAIT(src, TRAIT_NO_FLOATING_ANIM, INNATE_TRAIT) + AddComponent(/datum/component/boss_music, 'sound/lavaland/bdm_boss.ogg', 167 SECONDS) /mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/Destroy() QDEL_NULL(frost_orbs) @@ -233,7 +234,7 @@ Difficulty: Extremely Hard /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 = 'icons/obj/mining.dmi' icon_state = "demonic_crystal" /obj/item/resurrection_crystal/attack_self(mob/living/user) @@ -354,8 +355,8 @@ Difficulty: Extremely Hard 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()) + var/list/icon_dimensions = get_icon_dimensions(owner.icon) + cube.Scale(icon_dimensions["width"], icon_dimensions["height"]) owner.add_overlay(cube) return ..() @@ -378,7 +379,7 @@ Difficulty: Extremely Hard /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 = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "ice_crystal" w_class = WEIGHT_CLASS_TINY throwforce = 0 @@ -386,7 +387,7 @@ Difficulty: Extremely Hard /obj/structure/frost_miner_prism name = "frost miner light prism" desc = "A magical crystal enhanced by a demonic presence." - icon = 'icons/obj/xenobiology/slimecrossing.dmi' + icon = 'icons/obj/science/slimecrossing.dmi' icon_state = "lightprism" density = FALSE anchored = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 150e744eff7a5..f516a52525cd6 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -73,7 +73,6 @@ death_message = "collapses into a pile of bones, its flesh sloughing away." death_sound = '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 @@ -273,7 +272,7 @@ if(!isclosedturf(T) && !islava(T)) var/lava_turf = /turf/open/lava/smooth var/reset_turf = T.type - T.ChangeTurf(lava_turf, flags = CHANGETURF_INHERIT_AIR) + T.TerraformTurf(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 @@ -289,14 +288,14 @@ color = COLOR_DARK_ORANGE /obj/effect/temp_visual/lava_safe - icon = 'icons/obj/hand_of_god_structures.dmi' + icon = 'icons/obj/service/hand_of_god_structures.dmi' icon_state = "trap-earth" layer = BELOW_MOB_LAYER light_range = 2 duration = 13 /obj/effect/temp_visual/fireball - icon = 'icons/obj/wizard.dmi' + icon = 'icons/effects/magic.dmi' icon_state = "fireball" name = "fireball" desc = "Get out of the way!" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 6e0a3593cf3cd..828a78ccfb1a0 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -90,6 +90,7 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/hierophant/Initialize(mapload) . = ..() spawned_beacon = new(loc) + AddComponent(/datum/component/boss_music, 'sound/lavaland/hiero_boss.ogg', 145 SECONDS) /mob/living/simple_animal/hostile/megafauna/hierophant/Destroy() QDEL_NULL(spawned_beacon) @@ -118,7 +119,7 @@ Difficulty: Hard /datum/action/innate/megafauna_attack/blink_spam name = "Blink Chase" - button_icon = 'icons/obj/lavaland/artefacts.dmi' + button_icon = 'icons/obj/mining_zones/artefacts.dmi' button_icon_state = "hierophant_club_ready_beacon" chosen_message = "You are now repeatedly blinking at your target." chosen_attack_num = 4 @@ -293,7 +294,7 @@ Difficulty: Hard 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) + playsound(T, 'sound/effects/bin_close.ogg', 75, TRUE) SLEEP_CHECK_DEATH(2, src) new /obj/effect/temp_visual/hierophant/blast/damaging(T, src, FALSE) for(var/d in directions) @@ -341,8 +342,8 @@ Difficulty: Hard 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/airlockopen.ogg', 200, TRUE) + playsound(T,'sound/magic/wand_teleport.ogg', 80, TRUE) + playsound(source,'sound/machines/airlockopen.ogg', 80, TRUE) blinking = TRUE SLEEP_CHECK_DEATH(2, src) //short delay before we start... new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, src) @@ -356,13 +357,13 @@ Difficulty: Hard 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) + ADD_TRAIT(src, TRAIT_UNDENSE, VANISHING_TRAIT) 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) + REMOVE_TRAIT(src, TRAIT_UNDENSE, VANISHING_TRAIT) visible_message(span_hierophant_warning("[src] fades in!")) SLEEP_CHECK_DEATH(1, src) //at this point the blasts we made detonate blinking = FALSE @@ -374,14 +375,14 @@ Difficulty: Hard if(!T) return new /obj/effect/temp_visual/hierophant/telegraph(T, src) - playsound(T,'sound/effects/bin_close.ogg', 200, TRUE) + playsound(T,'sound/effects/bin_close.ogg', 75, 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/airlockopen.ogg', 200, TRUE) + playsound(original,'sound/machines/airlockopen.ogg', 750, TRUE) var/last_dist = 0 for(var/t in spiral_range_turfs(burst_range, original)) var/turf/T = t @@ -429,19 +430,13 @@ Difficulty: Hard 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) +/mob/living/simple_animal/hostile/megafauna/hierophant/celebrate_kill(mob/living/L) 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.investigate_log("has been devoured by [src].", INVESTIGATE_DEATHS) - L.dust() + visible_message(span_hierophant_warning("[src] obliterates [L]!"),span_userdanger("You absorb [L]'s life force, restoring your health!")) /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 + if(istype(the_target, /mob/living/basic/legion_brood)) //ignore temporary targets in favor of more permanent targets return FALSE /mob/living/simple_animal/hostile/megafauna/hierophant/GiveTarget(new_target) @@ -471,6 +466,8 @@ Difficulty: Hard 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() + if(L.health <= HEALTH_THRESHOLD_DEAD && HAS_TRAIT(L, TRAIT_NODEATH)) //Nope, it still kills yall + devour(L) else devour(L) else @@ -489,7 +486,7 @@ Difficulty: Hard 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) + playsound(src, 'sound/mecha/mechmove04.ogg', 80, TRUE, -4) if(target) arena_trap(target) @@ -680,7 +677,7 @@ Difficulty: Hard var/turf/T = get_turf(src) if(!T) return - playsound(T,'sound/magic/blind.ogg', 125, TRUE, -5) //make a sound + playsound(T,'sound/magic/blind.ogg', 65, TRUE, -5) //make a sound sleep(0.6 SECONDS) //wait a little bursting = TRUE do_damage(T) //do damage and mark us as bursting @@ -739,12 +736,12 @@ Difficulty: Hard /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) + playsound(src_turf,'sound/magic/blind.ogg', 65, 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 = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "hierophant_tele_off" light_range = 2 layer = LOW_OBJ_LAYER @@ -756,7 +753,7 @@ Difficulty: Hard if(club.beacon == src) to_chat(user, span_notice("You start removing your hierophant beacon...")) if(do_after(user, 50, target = src)) - playsound(src,'sound/magic/blind.ogg', 200, TRUE, -4) + playsound(src,'sound/magic/blind.ogg', 100, 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!")) club.beacon = null diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index ec106189067a2..777cb3b878f73 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -60,7 +60,6 @@ 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 @@ -142,10 +141,9 @@ ///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 + var/mob/living/basic/legion_brood/minion = new(loc) + minion.assign_creator(src) + minion.ai_controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] = target //CHARGE @@ -211,7 +209,7 @@ 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) + var/mob/living/basic/legion_brood/legion = new(loc) legion.infest(living_target) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm index 5fc03caf8e26d..26f3690fef13c 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm @@ -267,6 +267,10 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/wendigo/death(gibbed, list/force_grant) if(health > 0) return + + if(!true_spawn) + 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) @@ -291,7 +295,7 @@ Difficulty: Hard /obj/item/wendigo_blood name = "bottle of wendigo blood" desc = "A bottle of viscous red liquid... You're not actually going to drink this, are you?" - icon = 'icons/obj/wizard.dmi' + icon = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "vial" /obj/item/wendigo_blood/attack_self(mob/living/user) @@ -328,7 +332,7 @@ Difficulty: Hard /obj/item/wendigo_skull name = "wendigo skull" desc = "A bloody skull torn from a murderous beast, the soulless eye sockets seem to constantly track your movement." - icon = 'icons/obj/ice_moon/artifacts.dmi' + icon = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "wendigo_skull" w_class = WEIGHT_CLASS_TINY throwforce = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 1cbbd9ec45a90..d07775b42bd53 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -113,6 +113,7 @@ GLOBAL_LIST_INIT(animatable_blacklist, list(/obj/structure/table, /obj/structure /mob/living/simple_animal/hostile/mimic/copy/Initialize(mapload, obj/copy, mob/living/creator, destroy_original = 0, no_googlies = FALSE) . = ..() + ADD_TRAIT(src, TRAIT_PERMANENTLY_MORTAL, INNATE_TRAIT) // They won't remember their original contents upon ressurection and would just be floating eyes if (no_googlies) overlay_googly_eyes = FALSE CopyObject(copy, creator, destroy_original) @@ -233,7 +234,7 @@ GLOBAL_LIST_INIT(animatable_blacklist, list(/obj/structure/table, /obj/structure projectiletype = initial(M.projectile_type) if(istype(G, /obj/item/gun/ballistic)) Pewgun = G - var/obj/item/ammo_box/magazine/M = Pewgun.mag_type + var/obj/item/ammo_box/magazine/M = Pewgun.spawn_magazine_type casingtype = initial(M.ammo_type) if(istype(G, /obj/item/gun/energy)) Zapgun = G @@ -336,14 +337,14 @@ GLOBAL_LIST_INIT(animatable_blacklist, list(/obj/structure/table, /obj/structure if(locked) return if(!opened) - set_density(FALSE) + ADD_TRAIT(src, TRAIT_UNDENSE, MIMIC_TRAIT) opened = TRUE icon_state = "crateopen" playsound(src, open_sound, 50, TRUE) for(var/atom/movable/AM in src) AM.forceMove(loc) else - set_density(TRUE) + REMOVE_TRAIT(src, TRAIT_UNDENSE, MIMIC_TRAIT) opened = FALSE icon_state = "crate" playsound(src, close_sound, 50, TRUE) 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 deleted file mode 100644 index 97a144f047777..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ /dev/null @@ -1,220 +0,0 @@ -//A beast that fire freezing blasts. -/mob/living/simple_animal/hostile/asteroid/basilisk - name = "basilisk" - desc = "A territorial beast, covered in a thick shell that absorbs energy. Its stare causes victims to freeze from the inside." - icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' - icon_state = "Basilisk" - icon_living = "Basilisk" - icon_aggro = "Basilisk_alert" - icon_dead = "Basilisk_dead" - icon_gib = "syndicate_gib" - mob_biotypes = MOB_ORGANIC|MOB_BEAST - move_to_delay = 20 - projectiletype = /obj/projectile/temp/basilisk - projectilesound = 'sound/weapons/pierce.ogg' - ranged = 1 - ranged_message = "stares" - ranged_cooldown_time = 30 - throw_message = "does nothing against the hard shell of" - vision_range = 2 - speed = 3 - maxHealth = 200 - health = 200 - harm_intent_damage = 5 - obj_damage = 60 - melee_damage_lower = 12 - melee_damage_upper = 12 - attack_verb_continuous = "bites into" - attack_verb_simple = "bite into" - speak_emote = list("chitters") - attack_sound = 'sound/weapons/bladeslice.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE - aggro_vision_range = 9 - turns_per_move = 5 - gold_core_spawnable = HOSTILE_SPAWN - loot = list(/obj/item/stack/ore/diamond{layer = ABOVE_MOB_LAYER}, - /obj/item/stack/ore/diamond{layer = ABOVE_MOB_LAYER}) - var/lava_drinker = TRUE - var/warmed_up = FALSE - -/obj/projectile/temp/basilisk - name = "freezing blast" - icon_state = "ice_2" - damage = 10 - damage_type = BURN - armor_flag = ENERGY - temperature = -50 // Cools you down! per hit! - var/slowdown = TRUE //Determines if the projectile applies a slowdown status effect on carbons or not - -/obj/projectile/temp/basilisk/on_hit(atom/target, blocked = 0) - . = ..() - if(iscarbon(target) && slowdown) - var/mob/living/carbon/carbon_target = target - carbon_target.apply_status_effect(/datum/status_effect/freezing_blast) - -/obj/projectile/temp/basilisk/heated - name = "energy blast" - icon_state= "chronobolt" - damage = 40 - damage_type = BRUTE - temperature = 0 - slowdown = FALSE - - -/mob/living/simple_animal/hostile/asteroid/basilisk/GiveTarget(new_target) - if(..()) //we have a target - var/atom/target_from = GET_TARGETS_FROM(src) - if(isliving(target) && !target.Adjacent(target_from) && ranged_cooldown <= world.time)//No more being shot at point blank or spammed with RNG beams - INVOKE_ASYNC(src, PROC_REF(OpenFire), target) - -/mob/living/simple_animal/hostile/asteroid/basilisk/ex_act(severity, target) - switch(severity) - if(EXPLODE_DEVASTATE) - investigate_log("has been gibbed by an explosion.", INVESTIGATE_DEATHS) - gib() - if(EXPLODE_HEAVY) - adjustBruteLoss(140) - if(EXPLODE_LIGHT) - adjustBruteLoss(110) - - return TRUE - -/mob/living/simple_animal/hostile/asteroid/basilisk/AttackingTarget() - . = ..() - if(lava_drinker && !warmed_up && islava(target)) - visible_message(span_warning("[src] begins to drink from [target]...")) - if(do_after(src, 70, target = target)) - visible_message(span_warning("[src] begins to fire up!")) - fully_heal() - icon_state = "Basilisk_alert" - set_varspeed(0) - warmed_up = TRUE - projectiletype = /obj/projectile/temp/basilisk/heated - addtimer(CALLBACK(src, PROC_REF(cool_down)), 3000) - -/mob/living/simple_animal/hostile/asteroid/basilisk/proc/cool_down() - visible_message(span_warning("[src] appears to be cooling down...")) - if(stat != DEAD) - icon_state = "Basilisk" - set_varspeed(3) - warmed_up = FALSE - projectiletype = /obj/projectile/temp/basilisk - -//Watcher -/mob/living/simple_animal/hostile/asteroid/basilisk/watcher - name = "watcher" - desc = "A levitating, eye-like creature held aloft by winglike formations of sinew. A sharp spine of crystal protrudes from its body." - icon = 'icons/mob/simple/lavaland/lavaland_monsters_wide.dmi' - icon_state = "watcher" - icon_living = "watcher" - icon_aggro = "watcher" - icon_dead = "watcher_dead" - health_doll_icon = "watcher" - pixel_x = -12 - base_pixel_x = -12 - throw_message = "bounces harmlessly off of" - melee_damage_lower = 15 - melee_damage_upper = 15 - attack_verb_continuous = "impales" - attack_verb_simple = "impale" - combat_mode = TRUE - 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 - 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) - lava_drinker = FALSE - search_objects = 1 - wanted_objects = list(/obj/item/pen/survival, /obj/item/stack/ore/diamond) - -/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/Initialize(mapload) - . = ..() - AddElement(/datum/element/simple_flying) - -/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/Life(seconds_per_tick = SSMOBS_DT, times_fired) - . = ..() - if(stat == CONSCIOUS) - consume_bait() - -/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/proc/consume_bait() - for(var/obj/potential_consumption in view(1, src)) - if(istype(potential_consumption, /obj/item/stack/ore/diamond)) - qdel(potential_consumption) - visible_message(span_notice("[src] consumes [potential_consumption], and it disappears! ...At least, you think.")) - else if(istype(potential_consumption, /obj/item/pen/survival)) - qdel(potential_consumption) - visible_message(span_notice("[src] examines [potential_consumption] closer, and telekinetically shatters the pen.")) - -/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random/Initialize(mapload) - . = ..() - if(prob(1)) - if(prob(75)) - new /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/magmawing(loc) - else - new /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing(loc) - return INITIALIZE_HINT_QDEL - -/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/magmawing - name = "magmawing watcher" - desc = "When raised very close to lava, some watchers adapt to the extreme heat and use lava as both a weapon and wings." - icon_state = "watcher_magmawing" - icon_living = "watcher_magmawing" - icon_aggro = "watcher_magmawing" - 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_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" - desc = "Very rarely, some watchers will eke out an existence far from heat sources. In the absence of warmth, they become icy and fragile but fire much stronger freezing blasts." - icon_state = "watcher_icewing" - icon_living = "watcher_icewing" - icon_aggro = "watcher_icewing" - icon_dead = "watcher_icewing_dead" - maxHealth = 170 - 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" - icon_state = "lava" - damage = 5 - damage_type = BURN - temperature = 200 // Heats you up! per hit! - slowdown = FALSE - -/obj/projectile/temp/basilisk/magmawing/on_hit(atom/target, blocked = FALSE) - . = ..() - if(.) - var/mob/living/L = target - if (istype(L)) - L.adjust_fire_stacks(0.1) - L.ignite_mob() - -/obj/projectile/temp/basilisk/icewing - damage = 5 - damage_type = BURN - -/obj/projectile/temp/basilisk/icewing/on_hit(atom/target, blocked = FALSE) - . = ..() - if(.) - var/mob/living/L = target - if(istype(L)) - L.apply_status_effect(/datum/status_effect/freon/watcher) - -/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril - from_spawner = TRUE 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 deleted file mode 100644 index d9bd88cb8899a..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm +++ /dev/null @@ -1,242 +0,0 @@ -#define BRIMBEAM_RANGE 10 - -/mob/living/simple_animal/hostile/asteroid/brimdemon - name = "brimdemon" - desc = "A misshapen demon with big, red eyes and a hinged mouth. Not much is known about the creatures \ - due to their response to any unexpected stimulus being \"brimbeam\", a deadly blood-laser barrage." - icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' - icon_state = "brimdemon" - icon_living = "brimdemon" - icon_dead = "brimdemon_dead" - mob_biotypes = MOB_ORGANIC|MOB_BEAST - speak_emote = list("cackles") - emote_taunt = list("screeches") - emote_hear = list("cackles","screeches") - combat_mode = TRUE - stat_attack = HARD_CRIT - ranged_cooldown_time = 5 SECONDS - vision_range = 9 - retreat_distance = 2 - speed = 3 - move_to_delay = 5 - maxHealth = 250 - health = 250 - obj_damage = 15 - melee_damage_lower = 7.5 - melee_damage_upper = 7.5 - rapid_melee = 2 // every second attack - attack_verb_continuous = "bites" - attack_verb_simple = "bite" - attack_sound = 'sound/weapons/bite.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE - butcher_results = list( - /obj/item/food/meat/slab = 2, - /obj/effect/decal/cleanable/brimdust = 1, - /obj/item/organ/internal/monster_core/brimdust_sac = 1, - ) - loot = list() - robust_searching = TRUE - footstep_type = FOOTSTEP_MOB_CLAW - death_message = "wails as infernal energy escapes from its wounds, leaving it an empty husk." - death_sound = 'sound/magic/demon_dies.ogg' - light_color = LIGHT_COLOR_BLOOD_MAGIC - light_power = 5 - light_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. - var/list/beamparts = list() - -/mob/living/simple_animal/hostile/asteroid/brimdemon/Destroy() - QDEL_LIST(beamparts) - return ..() - -/mob/living/simple_animal/hostile/asteroid/brimdemon/Login() - ranged = TRUE - return ..() - -/mob/living/simple_animal/hostile/asteroid/brimdemon/Logout() - ranged = FALSE - return ..() - -/mob/living/simple_animal/hostile/asteroid/brimdemon/death() - firing = FALSE - cut_overlay("brimdemon_telegraph_dir") - move_resist = initial(move_resist) - return ..() - -/mob/living/simple_animal/hostile/asteroid/brimdemon/Goto(target, delay, minimum_distance) - if(firing) - return FALSE - return ..() - -/mob/living/simple_animal/hostile/asteroid/brimdemon/MoveToTarget(list/possible_targets) - if(firing) - return FALSE - return ..() - -/mob/living/simple_animal/hostile/asteroid/brimdemon/AttackingTarget(atom/attacked_target) - if(firing) - return FALSE - return ..() - -/mob/living/simple_animal/hostile/asteroid/brimdemon/Move(atom/newloc, dir, step_x , step_y) - if(firing) - return FALSE - return ..() - -/mob/living/simple_animal/hostile/asteroid/brimdemon/OpenFire() - if(firing) - balloon_alert(src, "already firing!") - return - if(!COOLDOWN_FINISHED(src, ranged_cooldown)) - balloon_alert(src, "on cooldown!") - return - firing = TRUE - set_dir_on_move = FALSE - icon_state = "brimdemon_firing" - move_resist = MOVE_FORCE_VERY_STRONG - add_overlay("brimdemon_telegraph_dir") - visible_message(span_danger("[src] starts charging!")) - balloon_alert(src, "charging...") - addtimer(CALLBACK(src, PROC_REF(fire_laser)), 1 SECONDS) - COOLDOWN_START(src, ranged_cooldown, ranged_cooldown_time) - -/mob/living/simple_animal/hostile/asteroid/brimdemon/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - . = ..() - check_fire() - -/mob/living/simple_animal/hostile/asteroid/brimdemon/proc/check_fire() - if(key || QDELETED(target) || get_dist(src, target) > BRIMBEAM_RANGE || !(get_dir(src, target) in GLOB.cardinals)) - return - face_atom(target) - OpenFire() - -/// Fires a brimbeam, getting a line of turfs between it and the direction to the target and creating a brimbeam effect on every one of them. -/mob/living/simple_animal/hostile/asteroid/brimdemon/proc/fire_laser() - if(stat == DEAD) - return - visible_message(span_danger("[src] fires a brimbeam!")) - balloon_alert(src, "brimbeam fired") - playsound(src, 'sound/creatures/brimdemon.ogg', 150, FALSE, 0, 3) - cut_overlay("brimdemon_telegraph_dir") - var/turf/target_turf = get_ranged_target_turf(src, dir, BRIMBEAM_RANGE) - var/turf/origin_turf = get_turf(src) - var/list/affected_turfs = get_line(origin_turf, target_turf) - origin_turf - for(var/turf/affected_turf in affected_turfs) - var/blocked = FALSE - if(affected_turf.opacity) - blocked = TRUE - for(var/obj/potential_block in affected_turf.contents) - if(potential_block.opacity) - blocked = TRUE - break - if(blocked) - break - var/atom/new_brimbeam = new /obj/effect/brimbeam(affected_turf) - new_brimbeam.dir = dir - beamparts += new_brimbeam - for(var/mob/living/hit_mob in affected_turf.contents) - hit_mob.adjustFireLoss(25) - to_chat(hit_mob, span_userdanger("You're hit by [src]'s brimbeam!")) - if(length(beamparts)) - var/atom/last_brimbeam = beamparts[length(beamparts)] - last_brimbeam.icon_state = "brimbeam_end" - var/atom/first_brimbeam = beamparts[1] - first_brimbeam.icon_state = "brimbeam_start" - addtimer(CALLBACK(src, PROC_REF(end_laser)), 2 SECONDS) - -/// Deletes all the brimbeam parts and sets variables back to their initial ones. -/mob/living/simple_animal/hostile/asteroid/brimdemon/proc/end_laser() - if(stat != DEAD) - icon_state = initial(icon_state) - move_resist = initial(move_resist) - set_dir_on_move = initial(set_dir_on_move) - firing = FALSE - for(var/obj/effect/brimbeam/beam in beamparts) - animate(beam, time = 0.5 SECONDS, alpha = 0) - QDEL_IN(beam, 0.5 SECONDS) - beamparts -= beam - -/obj/effect/brimbeam - name = "brimbeam" - icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' - icon_state = "brimbeam_mid" - layer = ABOVE_MOB_LAYER - plane = ABOVE_GAME_PLANE - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - light_color = LIGHT_COLOR_BLOOD_MAGIC - light_power = 3 - light_range = 2 - -/obj/effect/brimbeam/Initialize(mapload) - . = ..() - START_PROCESSING(SSfastprocess, src) - -/obj/effect/brimbeam/Destroy() - STOP_PROCESSING(SSfastprocess, src) - return ..() - -/obj/effect/brimbeam/process() - for(var/mob/living/hit_mob in get_turf(src)) - damage(hit_mob) - -/obj/effect/brimbeam/proc/damage(mob/living/hit_mob) - 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." - icon_state = "brimdust" - icon = 'icons/obj/mining.dmi' - layer = FLOOR_CLEAN_LAYER - mergeable_decal = FALSE - -/obj/effect/decal/cleanable/brimdust/Initialize(mapload) - . = ..() - reagents.add_reagent(/datum/reagent/brimdust, 15) - -/obj/item/ore_sensor - name = "ore sensor" - desc = "Using demonic frequencies, this ear-mounted tool detects ores in the nearby terrain." - icon_state = "oresensor" - icon = 'icons/obj/mining.dmi' - slot_flags = ITEM_SLOT_EARS - var/range = 5 - var/cooldown = 4 SECONDS //between the standard and the advanced ore scanner in strength - COOLDOWN_DECLARE(ore_sensing_cooldown) - -/obj/item/ore_sensor/equipped(mob/user, slot, initial) - . = ..() - if(slot & ITEM_SLOT_EARS) - START_PROCESSING(SSobj, src) - else - STOP_PROCESSING(SSobj, src) - -/obj/item/ore_sensor/dropped(mob/user, silent) - . = ..() - STOP_PROCESSING(SSobj, src) - -/obj/item/ore_sensor/process(seconds_per_tick) - if(!COOLDOWN_FINISHED(src, ore_sensing_cooldown)) - return - COOLDOWN_START(src, ore_sensing_cooldown, cooldown) - mineral_scan_pulse(get_turf(src), range) - -#undef BRIMBEAM_RANGE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index 578c76bee1b1b..6fe1fa1ecfc39 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -28,6 +28,7 @@ //Gives player-controlled variants the ability to swap attacks /mob/living/simple_animal/hostile/asteroid/elite/Initialize(mapload) . = ..() + AddComponent(/datum/component/seethrough_mob) for(var/action_type in attack_action_types) var/datum/action/innate/elite_attack/attack_action = new action_type() attack_action.Grant(src) @@ -125,7 +126,7 @@ While using this makes the system rely on OnFire, it still gives options for tim desc = "An odd, pulsing tumor sticking out of the ground. You feel compelled to reach out and touch it..." armor_type = /datum/armor/structure_elite_tumor resistance_flags = INDESTRUCTIBLE - icon = 'icons/obj/lavaland/tumor.dmi' + icon = 'icons/obj/mining_zones/tumor.dmi' icon_state = "tumor" pixel_x = -16 base_pixel_x = -16 @@ -353,7 +354,7 @@ While using this makes the system rely on OnFire, it still gives options for tim /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 = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "crevice_shard" lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm index 07ea2e881af4b..d91f312b454d8 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm @@ -53,6 +53,10 @@ var/rand_tent = 0 var/list/mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/children_list = list() +/mob/living/simple_animal/hostile/asteroid/elite/broodmother/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_TENTACLE_IMMUNE, INNATE_TRAIT) + /datum/action/innate/elite_attack/tentacle_patch name = "Tentacle Patch" button_icon_state = "tentacle_patch" @@ -112,7 +116,7 @@ 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) + new /obj/effect/goliath_tentacle/broodmother(t, src) /mob/living/simple_animal/hostile/asteroid/elite/broodmother/proc/tentacle_patch(target) ranged_cooldown = world.time + 15 @@ -120,7 +124,7 @@ 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) + new /obj/effect/goliath_tentacle/broodmother/patch(tturf, src) /mob/living/simple_animal/hostile/asteroid/elite/broodmother/proc/spawn_children(target) ranged_cooldown = world.time + 40 @@ -188,6 +192,10 @@ status_flags = CANPUSH var/mob/living/simple_animal/hostile/asteroid/elite/broodmother/mother = null +/mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_TENTACLE_IMMUNE, INNATE_TRAIT) + /mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/OpenFire(target) ranged_cooldown = world.time + 40 var/tturf = get_turf(target) @@ -195,7 +203,7 @@ 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) + new /obj/effect/goliath_tentacle/broodmother(tturf, src) /mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/death() . = ..() @@ -203,43 +211,32 @@ mother.children_list -= src visible_message(span_warning("[src] explodes!")) explosion(src, flame_range = 3, adminlog = FALSE) - gib() + gib(DROP_ALL_REMAINS) -//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/goliath_tentacle/broodmother + grapple_time = 1 SECONDS + min_damage = 30 + max_damage = 35 -/obj/effect/temp_visual/goliath_tentacle/broodmother/patch/Initialize(mapload, new_spawner) +/obj/effect/goliath_tentacle/broodmother/patch/Initialize(mapload, new_spawner) . = ..() INVOKE_ASYNC(src, PROC_REF(createpatch)) -/obj/effect/temp_visual/goliath_tentacle/broodmother/patch/proc/createpatch() +/obj/effect/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) + new /obj/effect/goliath_tentacle/broodmother(T) 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) + new /obj/effect/goliath_tentacle/broodmother(T) // 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 = 'icons/obj/mining_zones/elite_trophies.dmi' icon_state = "broodmother_tongue" denied_type = /obj/item/crusher_trophy/broodmother_tongue bonus_value = 10 @@ -251,7 +248,7 @@ /obj/item/crusher_trophy/broodmother_tongue/on_mark_detonation(mob/living/target, mob/living/user) if(prob(bonus_value) && target.stat != DEAD) - new /obj/effect/temp_visual/goliath_tentacle/broodmother/patch(get_turf(target), user) + new /obj/effect/goliath_tentacle/broodmother/patch(get_turf(target), user) /obj/item/crusher_trophy/broodmother_tongue/attack_self(mob/user) if(!isliving(user)) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm index 73a3ad983c950..bf4d33a10ed95 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm @@ -249,14 +249,15 @@ /obj/projectile/herald/teleshot/on_hit(atom/target, blocked = FALSE) . = ..() - firer.forceMove(get_turf(src)) + if(!QDELETED(firer)) + 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 = 'icons/obj/mining_zones/elite_trophies.dmi' icon_state = "herald_cloak" body_parts_covered = CHEST|GROIN|ARMS hit_reaction_chance = 20 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm index 70d7ccb8dfbb1..ec6c843080c96 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm @@ -269,7 +269,7 @@ /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 = 'icons/obj/mining_zones/legionnaire_bonfire.dmi' icon_state = "bonfire" max_integrity = 100 move_resist = MOVE_FORCE_EXTREMELY_STRONG @@ -315,7 +315,7 @@ /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 = 'icons/obj/mining_zones/elite_trophies.dmi' icon_state = "legionnaire_spine" denied_type = /obj/item/crusher_trophy/legionnaire_spine bonus_value = 20 @@ -328,10 +328,9 @@ /obj/item/crusher_trophy/legionnaire_spine/on_mark_detonation(mob/living/target, mob/living/user) if(!prob(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() + var/mob/living/basic/legion_brood/minion = new (user.loc) + minion.assign_creator(user) + minion.ai_controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] = target /obj/item/crusher_trophy/legionnaire_spine/attack_self(mob/user) if(!isliving(user)) @@ -342,9 +341,9 @@ 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() + + var/mob/living/basic/legion_brood/minion = new (LivingUser.loc) + minion.assign_creator(LivingUser) next_use_time = world.time + 4 SECONDS #undef LEGIONNAIRE_CHARGE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm index 0fae77d08ceba..2d6cdb39da061 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm @@ -147,13 +147,13 @@ 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) + ADD_TRAIT(src, TRAIT_UNDENSE, VANISHING_TRAIT) 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) + REMOVE_TRAIT(src, TRAIT_UNDENSE, VANISHING_TRAIT) visible_message(span_hierophant_warning("[src] fades in!")) /mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/aoe_squares(target) @@ -180,19 +180,15 @@ /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 = 'icons/obj/mining_zones/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) - L.add_mood_event("hope_lavaland", /datum/mood_event/hope_lavaland) +/obj/item/clothing/accessory/pandora_hope/accessory_equipped(obj/item/clothing/under/clothes, mob/living/user) + user.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) - L.clear_mood_event("hope_lavaland") +/obj/item/clothing/accessory/pandora_hope/accessory_dropped(obj/item/clothing/under/clothes, mob/living/user) + user.clear_mood_event("hope_lavaland") #undef SINGULAR_SHOT #undef MAGIC_BOX 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 deleted file mode 100644 index f06c87363ce9f..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm +++ /dev/null @@ -1,146 +0,0 @@ -//An ore-devouring but easily scared creature -/mob/living/simple_animal/hostile/asteroid/goldgrub - name = "goldgrub" - desc = "A worm that grows fat from eating everything in its sight. Seems to enjoy precious metals and other shiny things, hence the name." - icon = 'icons/mob/simple/lavaland/lavaland_monsters_wide.dmi' - icon_state = "goldgrub" - icon_living = "goldgrub" - icon_aggro = "goldgrub_alert" - icon_dead = "goldgrub_dead" - icon_gib = "syndicate_gib" - pixel_x = -12 - base_pixel_x = -12 - mob_biotypes = MOB_ORGANIC|MOB_BEAST - vision_range = 2 - aggro_vision_range = 9 - move_to_delay = 5 - friendly_verb_continuous = "harmlessly rolls into" - friendly_verb_simple = "harmlessly roll into" - maxHealth = 45 - health = 45 - harm_intent_damage = 5 - melee_damage_lower = 0 - melee_damage_upper = 0 - attack_verb_continuous = "barrels into" - attack_verb_simple = "barrel into" - attack_sound = 'sound/weapons/punch1.ogg' - combat_mode = FALSE - speak_emote = list("screeches") - throw_message = "sinks in slowly, before being pushed out of " - death_message = "stops moving as green liquid oozes from the carcass!" - status_flags = CANPUSH - gold_core_spawnable = HOSTILE_SPAWN - search_objects = 1 - wanted_objects = list(/obj/item/stack/ore/diamond, /obj/item/stack/ore/gold, /obj/item/stack/ore/silver, - /obj/item/stack/ore/uranium) - - var/chase_time = 100 - var/will_burrow = TRUE - var/datum/action/innate/goldgrub/spitore/spit - var/datum/action/innate/goldgrub/burrow/burrow - var/is_burrowed = FALSE - -/mob/living/simple_animal/hostile/asteroid/goldgrub/Initialize(mapload) - . = ..() - var/i = rand(1,3) - while(i) - loot += pick(/obj/item/stack/ore/silver, /obj/item/stack/ore/gold, /obj/item/stack/ore/uranium, /obj/item/stack/ore/diamond) - i-- - spit = new - burrow = new - spit.Grant(src) - burrow.Grant(src) - -/datum/action/innate/goldgrub - background_icon_state = "bg_default" - overlay_icon_state = "bg_default_border" - -/datum/action/innate/goldgrub/spitore - name = "Spit Ore" - desc = "Vomit out all of your consumed ores." - -/datum/action/innate/goldgrub/spitore/Activate() - var/mob/living/simple_animal/hostile/asteroid/goldgrub/G = owner - if(G.stat == DEAD || G.is_burrowed) - return - G.barf_contents() - -/datum/action/innate/goldgrub/burrow - name = "Burrow" - desc = "Burrow under soft ground, evading predators and increasing your speed." - -/datum/action/innate/goldgrub/burrow/Activate() - var/mob/living/simple_animal/hostile/asteroid/goldgrub/G = owner - var/obj/effect/dummy/phased_mob/holder = null - if(G.stat == DEAD) - return - var/turf/T = get_turf(G) - if (!isasteroidturf(T) || !do_after(G, 30, target = T)) - to_chat(G, span_warning("You can only burrow in and out of mining turfs and must stay still!")) - return - if (get_dist(G, T) != 0) - to_chat(G, span_warning("Action cancelled, as you moved while reappearing.")) - return - if(G.is_burrowed) - holder = G.loc - holder.eject_jaunter() - holder = null - G.is_burrowed = FALSE - G.visible_message(span_danger("[G] emerges from the ground!")) - playsound(get_turf(G), 'sound/effects/break_stone.ogg', 50, TRUE, -1) - else - G.visible_message(span_danger("[G] buries into the ground, vanishing from sight!")) - playsound(get_turf(G), 'sound/effects/break_stone.ogg', 50, TRUE, -1) - holder = new /obj/effect/dummy/phased_mob(T, G) - G.is_burrowed = TRUE - -/mob/living/simple_animal/hostile/asteroid/goldgrub/GiveTarget(new_target) - add_target(new_target) - if(target != null) - if(istype(target, /obj/item/stack/ore)) - visible_message(span_notice("The [name] looks at [target.name] with hungry eyes.")) - else if(isliving(target)) - Aggro() - visible_message(span_danger("The [name] tries to flee from [target.name]!")) - retreat_distance = 10 - minimum_distance = 10 - if(will_burrow) - addtimer(CALLBACK(src, PROC_REF(Burrow)), chase_time) - -/mob/living/simple_animal/hostile/asteroid/goldgrub/AttackingTarget() - if(istype(target, /obj/item/stack/ore)) - EatOre(target) - return - return ..() - -/mob/living/simple_animal/hostile/asteroid/goldgrub/proc/EatOre(atom/movable/targeted_ore) - if(targeted_ore && targeted_ore.loc != src) - targeted_ore.forceMove(src) - return TRUE - return FALSE - -/mob/living/simple_animal/hostile/asteroid/goldgrub/death(gibbed) - barf_contents() - return ..() - -/mob/living/simple_animal/hostile/asteroid/goldgrub/proc/barf_contents() - visible_message(span_danger("[src] spits out its consumed ores!")) - playsound(src, 'sound/effects/splat.ogg', 50, TRUE) - for(var/atom/movable/AM in src) - AM.forceMove(loc) - -/mob/living/simple_animal/hostile/asteroid/goldgrub/proc/Burrow()//Begin the chase to kill the goldgrub in time - if(!stat) - visible_message(span_danger("The [name] buries into the ground, vanishing from sight!")) - qdel(src) - -/mob/living/simple_animal/hostile/asteroid/goldgrub/bullet_act(obj/projectile/P) - if(stat == DEAD) - return BULLET_ACT_FORCE_PIERCE - else - visible_message(span_danger("The [P.name] is repelled by [name]'s girth!")) - return BULLET_ACT_BLOCK - -/mob/living/simple_animal/hostile/asteroid/goldgrub/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - vision_range = 9 - . = ..() 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 091ffacf3153d..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm +++ /dev/null @@ -1,243 +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/simple/lavaland/lavaland_monsters_wide.dmi' - icon_state = "ancient_goliath" - icon_living = "ancient_goliath" - icon_aggro = "ancient_goliath_alert" - icon_dead = "ancient_goliath_dead" - icon_gib = "syndicate_gib" - pixel_x = -12 - base_pixel_x = -12 - 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 = "ancient_goliath_preattack" - loot = list(/obj/item/stack/sheet/animalhide/goliath_hide) - - footstep_type = FOOTSTEP_MOB_HEAVY - -/mob/living/simple_animal/hostile/asteroid/goliath/Life(seconds_per_tick = 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_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE)//who the fuck anchors mobs - . = ..() - if(!.) - return - - move_force = initial(move_force) - move_resist = initial(move_resist) - pull_force = initial(pull_force) - -/mob/living/simple_animal/hostile/asteroid/goliath/death(gibbed) - move_force = MOVE_FORCE_DEFAULT - move_resist = MOVE_RESIST_DEFAULT - pull_force = PULL_FORCE_DEFAULT - return ..() - -/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/simple/lavaland/lavaland_monsters_wide.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 = "goliath_preattack" - 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,55,target=src)) - user.visible_message(span_notice("You manage to put [O] on [src], you can now ride [p_them()].")) - qdel(O) - saddled = 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 = "ancient_goliath" - icon_living = "ancient_goliath" - icon_aggro = "ancient_goliath_alert" - icon_dead = "ancient_goliath_dead" - maxHealth = 400 - health = 400 - speed = 4 - pre_attack_icon = "ancient_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(seconds_per_tick = 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 - from_spawner = TRUE - -//tentacles -/obj/effect/temp_visual/goliath_tentacle - name = "goliath tentacle" - icon = 'icons/mob/simple/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/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm deleted file mode 100644 index 696f06809c562..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm +++ /dev/null @@ -1,323 +0,0 @@ -/mob/living/simple_animal/hostile/asteroid/hivelord - name = "hivelord" - desc = "A truly alien creature, it is a mass of unknown organic material, constantly fluctuating. When attacking, pieces of it split off and attack in tandem with the original." - icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' - icon_state = "Hivelord" - icon_living = "Hivelord" - icon_aggro = "Hivelord_alert" - icon_dead = "Hivelord_dead" - icon_gib = "syndicate_gib" - mob_biotypes = MOB_ORGANIC - move_to_delay = 14 - ranged = 1 - vision_range = 5 - aggro_vision_range = 9 - speed = 3 - maxHealth = 75 - health = 75 - harm_intent_damage = 5 - melee_damage_lower = 0 - melee_damage_upper = 0 - attack_verb_continuous = "lashes out at" - attack_verb_simple = "lash out at" - speak_emote = list("telepathically cries") - attack_sound = 'sound/weapons/pierce.ogg' - throw_message = "falls right through the strange body of the" - ranged_cooldown = 0 - ranged_cooldown_time = 20 - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - retreat_distance = 3 - minimum_distance = 3 - pass_flags = PASSTABLE - loot = list(/obj/item/organ/internal/monster_core/regenerative_core) - var/brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood - var/has_clickbox = TRUE - -/mob/living/simple_animal/hostile/asteroid/hivelord/Initialize(mapload) - . = ..() - if(has_clickbox) - AddComponent(/datum/component/clickbox, icon_state = "hivelord", max_scale = INFINITY, dead_state = "hivelord_dead") //they writhe so much. - -/mob/living/simple_animal/hostile/asteroid/hivelord/OpenFire(the_target) - if(world.time >= ranged_cooldown) - var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/A = new brood_type(src.loc) - - A.flags_1 |= (flags_1 & ADMIN_SPAWNED_1) - A.GiveTarget(target) - A.friends = friends - A.faction = faction.Copy() - ranged_cooldown = world.time + ranged_cooldown_time - -/mob/living/simple_animal/hostile/asteroid/hivelord/AttackingTarget() - OpenFire() - return TRUE - -/mob/living/simple_animal/hostile/asteroid/hivelord/death(gibbed) - mouse_opacity = MOUSE_OPACITY_ICON - ..(gibbed) - -//A fragile but rapidly produced creature -/mob/living/simple_animal/hostile/asteroid/hivelordbrood - name = "hivelord brood" - desc = "A fragment of the original Hivelord, rallying behind its original. One isn't much of a threat, but..." - icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' - icon_state = "Hivelordbrood" - icon_living = "Hivelordbrood" - icon_aggro = "Hivelordbrood" - icon_dead = "Hivelordbrood" - icon_gib = "syndicate_gib" - move_to_delay = 1 - friendly_verb_continuous = "buzzes near" - friendly_verb_simple = "buzz near" - vision_range = 10 - speed = 3 - maxHealth = 1 - health = 1 - harm_intent_damage = 5 - melee_damage_lower = 2 - melee_damage_upper = 2 - attack_verb_continuous = "slashes" - attack_verb_simple = "slash" - speak_emote = list("telepathically cries") - attack_sound = 'sound/weapons/pierce.ogg' - attack_vis_effect = ATTACK_EFFECT_SLASH - throw_message = "falls right through the strange body of the" - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - pass_flags = PASSTABLE | PASSMOB - density = FALSE - del_on_death = 1 - var/clickbox_state = "hivelord" - var/clickbox_max_scale = INFINITY - -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/Initialize(mapload) - . = ..() - addtimer(CALLBACK(src, PROC_REF(death)), 100) - 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/simple/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/internal/monster_core/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(from_spawner) - 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 - from_spawner = TRUE - -//Legion skull -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion - name = "legion" - desc = "One of many." - icon = 'icons/mob/simple/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(seconds_per_tick = 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.investigate_log("has been killed by hivelord infestation.", INVESTIGATE_DEATHS) - 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/simple/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/internal/monster_core/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(FACTION_MINING) - weather_immunities = list(TRAIT_LAVA_IMMUNE, TRAIT_ASHSTORM_IMMUNE) - obj_damage = 30 - environment_smash = ENVIRONMENT_SMASH_STRUCTURES - // Purple, but bright cause we're gonna need to spot mobs on lavaland - lighting_cutoff_red = 35 - lighting_cutoff_green = 20 - lighting_cutoff_blue = 45 - - -/mob/living/simple_animal/hostile/big_legion/Initialize(mapload) - .=..() - AddComponent(\ - /datum/component/spawner,\ - spawn_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion),\ - spawn_time = 20 SECONDS,\ - max_spawned = 3,\ - spawn_text = "peels itself off from",\ - faction = faction,\ - ) - -// 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/simple/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/internal/monster_core/regenerative_core/legion) - brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow - weather_immunities = list(TRAIT_SNOWSTORM_IMMUNE) - -/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) - -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/portal - from_spawner = TRUE - -// Snow Legion skull -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow - name = "snow legion" - desc = "One of many." - icon = 'icons/mob/simple/icemoon/icemoon_monsters.dmi' - icon_state = "snowlegion_head" - icon_living = "snowlegion_head" - icon_aggro = "snowlegion_head" - icon_dead = "snowlegion_head" - weather_immunities = list(TRAIT_SNOWSTORM_IMMUNE) 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 b70ab7a3a2217..9d84fe2e1fe82 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 @@ -11,7 +11,7 @@ speak_emote = list("telepathically cries") speed = 2 move_to_delay = 2 - projectiletype = /obj/projectile/temp/basilisk/ice + projectiletype = /obj/projectile/temp/ice_demon projectilesound = 'sound/weapons/pierce.ogg' ranged = TRUE ranged_message = "manifests ice" @@ -47,14 +47,16 @@ . = ..() AddElement(/datum/element/simple_flying) -/obj/projectile/temp/basilisk/ice +/obj/projectile/temp/ice_demon name = "ice blast" + icon_state = "ice_2" damage = 5 + damage_type = BURN + armor_flag = ENERGY speed = 1 pixel_speed_multiplier = 0.25 range = 200 temperature = -75 - slowdown = FALSE /mob/living/simple_animal/hostile/asteroid/ice_demon/OpenFire() ranged_cooldown = world.time + ranged_cooldown_time 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 123f26f69e4ff..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_whelp.dm +++ /dev/null @@ -1,53 +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/simple/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 - death_message = "collapses on its side." - death_sound = '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/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 deleted file mode 100644 index 483f0fa2b2b91..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/lobstrosity.dm +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Lobstrosities, the poster boy of charging AI mobs. Drops crab meat and bones. - * Outside of charging, it's intended behavior is that it is generally slow moving, but makes up for that with a knockdown attack to score additional hits. - */ -/mob/living/simple_animal/hostile/asteroid/lobstrosity - name = "arctic lobstrosity" - desc = "A marvel of evolution gone wrong, the frosty ice produces underground lakes where these ill tempered seafood gather. Beware its charge." - icon = 'icons/mob/simple/icemoon/icemoon_monsters.dmi' - icon_state = "arctic_lobstrosity" - icon_living = "arctic_lobstrosity" - icon_dead = "arctic_lobstrosity_dead" - mob_biotypes = MOB_ORGANIC|MOB_BEAST - mouse_opacity = MOUSE_OPACITY_ICON - friendly_verb_continuous = "chitters at" - friendly_verb_simple = "chits at" - speak_emote = list("chitters") - ranged = TRUE - speed = 3 - move_to_delay = 20 - maxHealth = 150 - health = 150 - obj_damage = 15 - melee_damage_lower = 15 - melee_damage_upper = 19 - attack_verb_continuous = "snips" - attack_verb_simple = "snip" - attack_sound = 'sound/weapons/bite.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE //the closest we have to a crustacean pinching attack effect rn. - weather_immunities = list(TRAIT_SNOWSTORM_IMMUNE) - vision_range = 5 - aggro_vision_range = 7 - butcher_results = list( - /obj/item/food/meat/crab = 2, - /obj/item/stack/sheet/bone = 2, - /obj/item/organ/internal/monster_core/rush_gland = 1, - ) - 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 - -/mob/living/simple_animal/hostile/asteroid/lobstrosity/Initialize(mapload) - . = ..() - charge = new /datum/action/cooldown/mob_cooldown/charge/basic_charge() - charge.Grant(src) - -/mob/living/simple_animal/hostile/asteroid/lobstrosity/Destroy() - QDEL_NULL(charge) - return ..() - -/mob/living/simple_animal/hostile/asteroid/lobstrosity/OpenFire() - if(client) - return - charge.Trigger(target = target) - -/mob/living/simple_animal/hostile/asteroid/lobstrosity/lava - name = "tropical lobstrosity" - desc = "A marvel of evolution gone wrong, the sulfur lakes of lavaland have given them a vibrant, red hued shell. Beware its charge." - icon_state = "lobstrosity" - 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 968928b2e7173..bf70d660f5afc 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 @@ -33,6 +33,19 @@ if(crusher_loot) AddElement(/datum/element/crusher_loot, crusher_loot, crusher_drop_mod, del_on_death) AddElement(/datum/element/mob_killed_tally, "mobs_killed_mining") + var/static/list/vulnerable_projectiles + if(!vulnerable_projectiles) + vulnerable_projectiles = string_list(MINING_MOB_PROJECTILE_VULNERABILITY) + AddElement(\ + /datum/element/ranged_armour,\ + minimum_projectile_force = 30,\ + below_projectile_multiplier = 0.3,\ + vulnerable_projectile_types = vulnerable_projectiles,\ + minimum_thrown_force = 20,\ + throw_blocked_message = throw_message,\ + ) + + RegisterSignals(src, list(COMSIG_PROJECTILE_PREHIT, COMSIG_ATOM_PREHITBY), PROC_REF(Aggro)) /mob/living/simple_animal/hostile/asteroid/Aggro() ..() @@ -44,21 +57,3 @@ if(stat == DEAD) return icon_state = icon_living - -/mob/living/simple_animal/hostile/asteroid/bullet_act(obj/projectile/shot)//Reduces damage from most projectiles to curb off-screen kills - if(!stat) - Aggro() - if(shot.damage < 30 && shot.damage_type != BRUTE) - shot.damage = (shot.damage / 3) - visible_message(span_danger("[shot] 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 - if(isitem(AM)) - var/obj/item/T = AM - if(!stat) - Aggro() - if(T.throwforce <= 20) - visible_message(span_notice("The [T.name] [throw_message] [src.name]!")) - return - ..() diff --git a/code/modules/mob/living/simple_animal/hostile/morph.dm b/code/modules/mob/living/simple_animal/hostile/morph.dm deleted file mode 100644 index da01eabb34a80..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/morph.dm +++ /dev/null @@ -1,195 +0,0 @@ -/mob/living/simple_animal/hostile/morph - name = "morph" - real_name = "morph" - desc = "A revolting, pulsating pile of flesh." - speak_emote = list("gurgles") - emote_hear = list("gurgles") - icon = 'icons/mob/simple/animal.dmi' - icon_state = "morph" - icon_living = "morph" - icon_dead = "morph_dead" - combat_mode = TRUE - stop_automated_movement = 1 - status_flags = CANPUSH - pass_flags = PASSTABLE - 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 - maxHealth = 150 - health = 150 - healable = 0 - obj_damage = 50 - melee_damage_lower = 20 - melee_damage_upper = 20 - // Oh you KNOW it's gonna be real green - lighting_cutoff_red = 10 - lighting_cutoff_green = 35 - lighting_cutoff_blue = 15 - vision_range = 1 // Only attack when target is close - wander = FALSE - attack_verb_continuous = "glomps" - attack_verb_simple = "glomp" - attack_sound = 'sound/effects/blobattack.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE //nom nom nom - butcher_results = list(/obj/item/food/meat/slab = 2) - - var/morphed = FALSE - var/melee_damage_disguised = 0 - var/eat_while_disguised = FALSE - var/atom/movable/form = null - var/static/list/blacklist_typecache = typecacheof(list( - /atom/movable/screen, - /obj/singularity, - /obj/energy_ball, - /obj/narsie, - /mob/living/simple_animal/hostile/morph, - /obj/effect, - )) - -/mob/living/simple_animal/hostile/morph/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - AddElement(/datum/element/content_barfer) - -/mob/living/simple_animal/hostile/morph/examine(mob/user) - if(morphed) - . = form.examine(user) - if(get_dist(user,src) <= 3) - . += span_warning("It doesn't look quite right...") - else - . = ..() - -/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 - 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 - return //we hide medical hud while morphed - ..() - -/mob/living/simple_animal/hostile/morph/proc/allowed(atom/movable/A) // make it into property/proc ? not sure if worth it - return !is_type_in_typecache(A, blacklist_typecache) && (isobj(A) || ismob(A)) - -/mob/living/simple_animal/hostile/morph/proc/eat(atom/movable/A) - if(morphed && !eat_while_disguised) - to_chat(src, span_warning("You cannot eat anything while you are disguised!")) - return FALSE - if(A && A.loc != src) - visible_message(span_warning("[src] swallows [A] whole!")) - A.forceMove(src) - return TRUE - return FALSE - -/mob/living/simple_animal/hostile/morph/ShiftClickOn(atom/movable/A) - if(!stat) - if(A == src) - restore() - return - if(istype(A) && allowed(A)) - assume(A) - else - to_chat(src, span_warning("You need to be conscious to transform!")) - ..() - -/mob/living/simple_animal/hostile/morph/proc/assume(atom/movable/target) - morphed = TRUE - form = target - - visible_message(span_warning("[src] suddenly twists and changes shape, becoming a copy of [target]!"), \ - span_notice("You twist your body and assume the form of [target].")) - appearance = target.appearance - copy_overlays(target) - alpha = max(alpha, 150) //fucking chameleons - transform = initial(transform) - pixel_y = base_pixel_y - pixel_x = base_pixel_x - - //Morphed is weaker - melee_damage_lower = melee_damage_disguised - 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 - return - -/mob/living/simple_animal/hostile/morph/proc/restore() - if(!morphed) - to_chat(src, span_warning("You're already in your normal form!")) - return - morphed = FALSE - form = null - alpha = initial(alpha) - color = initial(color) - desc = initial(desc) - animate_movement = SLIDE_STEPS - maptext = null - - visible_message(span_warning("[src] suddenly collapses in on itself, dissolving into a pile of green flesh!"), \ - span_notice("You reform to your normal body.")) - name = initial(name) - icon = initial(icon) - icon_state = initial(icon_state) - cut_overlays() - - //Baseline stats - melee_damage_lower = initial(melee_damage_lower) - 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 - -/mob/living/simple_animal/hostile/morph/death(gibbed) - if(morphed) - visible_message(span_warning("[src] twists and dissolves into a pile of green flesh!"), \ - span_userdanger("Your skin ruptures! Your flesh breaks apart! No disguise can ward off de--")) - restore() - ..() - -/mob/living/simple_animal/hostile/morph/Aggro() // automated only - ..() - if(morphed) - restore() - -/mob/living/simple_animal/hostile/morph/LoseAggro() - vision_range = initial(vision_range) - -/mob/living/simple_animal/hostile/morph/AIShouldSleep(list/possible_targets) - . = ..() - if(.) - var/list/things = list() - for(var/atom/movable/A in view(src)) - if(allowed(A)) - things += A - var/atom/movable/T = pick(things) - assume(T) - -/mob/living/simple_animal/hostile/morph/can_track(mob/living/user) - if(morphed) - return FALSE - return ..() - -/mob/living/simple_animal/hostile/morph/AttackingTarget() - if(morphed && !melee_damage_disguised) - to_chat(src, span_warning("You can not attack while disguised!")) - return - if(isliving(target)) //Eat Corpses to regen health - var/mob/living/L = target - if(L.stat == DEAD) - if(do_after(src, 30, target = L)) - if(eat(L)) - adjustHealth(-50) - return - else if(isitem(target)) //Eat items just to be annoying - var/obj/item/I = target - if(!I.anchored) - if(do_after(src, 20, target = I)) - eat(I) - return - return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm deleted file mode 100644 index da86fb17c8d29..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ /dev/null @@ -1,205 +0,0 @@ -/mob/living/simple_animal/hostile/mushroom - name = "walking mushroom" - desc = "It's a massive mushroom... with legs?" - icon_state = "mushroom_color" - icon_living = "mushroom_color" - icon_dead = "mushroom_dead" - mob_biotypes = MOB_ORGANIC | MOB_PLANT - speak_chance = 0 - turns_per_move = 1 - maxHealth = 10 - health = 10 - butcher_results = list(/obj/item/food/hugemushroomslice = 1) - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "gently pushes aside" - response_disarm_simple = "gently push aside" - response_harm_continuous = "whacks" - response_harm_simple = "whack" - harm_intent_damage = 5 - obj_damage = 0 - melee_damage_lower = 1 - melee_damage_upper = 1 - attack_same = 2 - attack_verb_continuous = "chomps" - attack_verb_simple = "chomp" - attack_sound = 'sound/weapons/bite.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE - faction = list(FACTION_MUSHROOM) - environment_smash = ENVIRONMENT_SMASH_NONE - stat_attack = DEAD - mouse_opacity = MOUSE_OPACITY_ICON - speed = 1 - robust_searching = 1 - unique_name = 1 - speak_emote = list("squeaks") - death_message = "fainted." - var/cap_color = "#ffffff" - var/powerlevel = 0 //Tracks our general strength level gained from eating other shrooms - var/bruised = 0 //If someone tries to cheat the system by attacking a shroom to lower its health, punish them so that it won't award levels to shrooms that eat it - var/recovery_cooldown = 0 //So you can't repeatedly revive it during a fight - var/faint_ticker = 0 //If we hit three, another mushroom's gonna eat us - var/static/mutable_appearance/cap_living //Where we store our cap icons so we dont generate them constantly to update our icon - var/static/mutable_appearance/cap_dead - -/mob/living/simple_animal/hostile/mushroom/examine(mob/user) - . = ..() - if(health >= maxHealth) - . += span_info("It looks healthy.") - else - . += span_info("It looks like it's been roughed up.") - -/mob/living/simple_animal/hostile/mushroom/Life(seconds_per_tick = SSMOBS_DT, times_fired) - ..() - if(!stat)//Mushrooms slowly regenerate if conscious, for people who want to save them from being eaten - adjustBruteLoss(-1 * seconds_per_tick) - -/mob/living/simple_animal/hostile/mushroom/Initialize(mapload)//Makes every shroom a little unique - melee_damage_lower += rand(3, 5) - melee_damage_upper += rand(10,20) - maxHealth += rand(40,60) - move_to_delay = rand(3,11) - cap_living = cap_living || mutable_appearance(icon, "mushroom_cap") - cap_dead = cap_dead || mutable_appearance(icon, "mushroom_cap_dead") - - 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) - -/mob/living/simple_animal/hostile/mushroom/CanAttack(atom/the_target) // Mushroom-specific version of CanAttack to handle stupid attack_same = 2 crap so we don't have to do it for literally every single simple_animal/hostile because this shit never gets spawned - if(!the_target || isturf(the_target)) - 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 == 2) - return FALSE - if(L.stat > stat_attack) - return FALSE - - return TRUE - - return FALSE - -/mob/living/simple_animal/hostile/mushroom/adjustHealth(amount, updating_health = TRUE, forced = FALSE) //Possibility to flee from a fight just to make it more visually interesting - if(!retreat_distance && prob(33)) - retreat_distance = 5 - addtimer(CALLBACK(src, PROC_REF(stop_retreat)), 30) - . = ..() - -/mob/living/simple_animal/hostile/mushroom/proc/stop_retreat() - retreat_distance = null - -/mob/living/simple_animal/hostile/mushroom/attack_animal(mob/living/user, list/modifiers) - if(istype(user, /mob/living/simple_animal/hostile/mushroom) && stat == DEAD) - var/mob/living/simple_animal/hostile/mushroom/shroom = user - if(faint_ticker < 2) - shroom.visible_message(span_notice("[shroom] chews a bit on [src].")) - faint_ticker++ - return TRUE - shroom.visible_message(span_warning("[shroom] devours [src]!")) - var/level_gain = (powerlevel - shroom.powerlevel) - if(level_gain >= -1 && !bruised && !shroom.ckey)//Player shrooms can't level up to become robust gods. - if(level_gain < 1)//So we still gain a level if two mushrooms were the same level - level_gain = 1 - shroom.LevelUp(level_gain) - shroom.adjustBruteLoss(-shroom.maxHealth) - qdel(src) - return TRUE - return ..() - -/mob/living/simple_animal/hostile/mushroom/revive(full_heal_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE) - . = ..() - if(!.) - return - - icon_state = "mushroom_color" - UpdateMushroomCap() - -/mob/living/simple_animal/hostile/mushroom/death(gibbed) - . = ..() - UpdateMushroomCap() - -/mob/living/simple_animal/hostile/mushroom/proc/UpdateMushroomCap() - cut_overlays() - cap_living.color = cap_color - cap_dead.color = cap_color - if(health == 0) - add_overlay(cap_dead) - else - add_overlay(cap_living) - -/mob/living/simple_animal/hostile/mushroom/proc/Recover() - visible_message(span_notice("[src] slowly begins to recover.")) - faint_ticker = 0 - revive(HEAL_ALL) - UpdateMushroomCap() - recovery_cooldown = 1 - addtimer(CALLBACK(src, PROC_REF(recovery_recharge)), 300) - -/mob/living/simple_animal/hostile/mushroom/proc/recovery_recharge() - recovery_cooldown = 0 - -/mob/living/simple_animal/hostile/mushroom/proc/LevelUp(level_gain) - if(powerlevel <= 9) - powerlevel += level_gain - if(prob(25)) - melee_damage_lower += (level_gain * rand(1,5)) - else - melee_damage_upper += (level_gain * rand(1,5)) - maxHealth += (level_gain * rand(1,5)) - adjustBruteLoss(-maxHealth) //They'll always heal, even if they don't gain a level, in case you want to keep this shroom around instead of harvesting it - -/mob/living/simple_animal/hostile/mushroom/proc/Bruise() - if(!bruised && !stat) - src.visible_message(span_notice("The [src.name] is bruised!")) - bruised = 1 - -/mob/living/simple_animal/hostile/mushroom/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/food/grown/mushroom)) - if(stat == DEAD && !recovery_cooldown) - Recover() - qdel(I) - else - to_chat(user, span_warning("[src] won't eat it!")) - return - if(I.force) - Bruise() - ..() - -/mob/living/simple_animal/hostile/mushroom/attack_hand(mob/living/carbon/human/user, list/modifiers) - ..() - if(user.combat_mode) - Bruise() - -/mob/living/simple_animal/hostile/mushroom/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) - ..() - if(isitem(AM)) - var/obj/item/T = AM - if(T.throwforce) - Bruise() - -/mob/living/simple_animal/hostile/mushroom/bullet_act(obj/projectile/P) - . = ..() - if(P.damage > 0 && P.damage_type == BRUTE) - Bruise() - -/mob/living/simple_animal/hostile/mushroom/harvest() - var/counter - 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/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/ooze.dm b/code/modules/mob/living/simple_animal/hostile/ooze.dm index 7c15cfcbd9624..6059e7efcc22b 100644 --- a/code/modules/mob/living/simple_animal/hostile/ooze.dm +++ b/code/modules/mob/living/simple_animal/hostile/ooze.dm @@ -39,6 +39,7 @@ create_reagents(300) add_cell_sample() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + AddElement(/datum/element/content_barfer) /mob/living/simple_animal/hostile/ooze/attacked_by(obj/item/I, mob/living/user) if(!eat_atom(I, TRUE)) @@ -63,7 +64,7 @@ var/consumption_amount = min(reagents.get_reagent_amount(reagent.type), ooze_metabolism_modifier * REAGENTS_METABOLISM * seconds_per_tick) if(istype(reagent, /datum/reagent/consumable)) var/datum/reagent/consumable/consumable = reagent - nutrition_change += consumption_amount * consumable.nutriment_factor + nutrition_change += consumption_amount * consumable.get_nutriment_factor() reagents.remove_reagent(reagent.type, consumption_amount) adjust_ooze_nutrition(nutrition_change) @@ -202,12 +203,7 @@ ///Register for owner death /datum/action/consume/New(Target) . = ..() - RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(on_owner_death)) - RegisterSignal(owner, COMSIG_QDELETING, PROC_REF(handle_mob_deletion)) - -/datum/action/consume/proc/handle_mob_deletion() - SIGNAL_HANDLER - stop_consuming() //Shit out the vored mob before u go go + RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(stop_consuming)) ///Try to consume the pulled mob /datum/action/consume/Trigger(trigger_flags) @@ -235,14 +231,17 @@ /datum/action/consume/proc/start_consuming(mob/living/target) vored_mob = target vored_mob.forceMove(owner) ///AAAAAAAAAAAAAAAAAAAAAAHHH!!! - RegisterSignal(vored_mob, COMSIG_QDELETING, PROC_REF(handle_mob_deletion)) + RegisterSignal(vored_mob, COMSIG_QDELETING, PROC_REF(stop_consuming)) playsound(owner,'sound/items/eatfood.ogg', rand(30,50), TRUE) owner.visible_message(span_warning("[src] devours [target]!"), span_notice("You devour [target].")) START_PROCESSING(SSprocessing, src) ///Stop consuming the mob; dump them on the floor /datum/action/consume/proc/stop_consuming() + SIGNAL_HANDLER STOP_PROCESSING(SSprocessing, src) + if (isnull(vored_mob)) + return vored_mob.forceMove(get_turf(owner)) playsound(get_turf(owner), 'sound/effects/splat.ogg', 50, TRUE) owner.visible_message(span_warning("[owner] pukes out [vored_mob]!"), span_notice("You puke out [vored_mob].")) @@ -260,10 +259,9 @@ if(vored_mob.getBruteLoss() >= 200) stop_consuming() -///On owner death dump the current vored mob -/datum/action/consume/proc/on_owner_death() - SIGNAL_HANDLER +/datum/action/consume/Remove(mob/remove_from) stop_consuming() + return ..() ///* Gelatinious Grapes code below *\\\\ @@ -379,7 +377,7 @@ /obj/item/mending_globule name = "mending globule" desc = "It somehow heals those who touch it." - icon = 'icons/obj/xenobiology/vatgrowing.dmi' + icon = 'icons/obj/science/vatgrowing.dmi' icon_state = "globule" embedding = list("embed_chance" = 100, ignore_throwspeed_threshold = TRUE, "pain_mult" = 0, "jostle_pain_mult" = 0, "fall_chance" = 0.5) var/obj/item/bodypart/bodypart @@ -456,7 +454,7 @@ /obj/structure/gel_cocoon name = "gel cocoon" desc = "It looks gross, but helpful." - icon = 'icons/obj/xenobiology/vatgrowing.dmi' + icon = 'icons/obj/science/vatgrowing.dmi' icon_state = "gel_cocoon" max_integrity = 50 var/mob/living/carbon/inhabitant diff --git a/code/modules/mob/living/simple_animal/hostile/regalrat.dm b/code/modules/mob/living/simple_animal/hostile/regalrat.dm deleted file mode 100644 index abd6756e666c3..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/regalrat.dm +++ /dev/null @@ -1,434 +0,0 @@ -/mob/living/simple_animal/hostile/regalrat - name = "feral regal rat" - desc = "An evolved rat, created through some strange science. They lead nearby rats with deadly efficiency to protect their kingdom. Not technically a king." - icon_state = "regalrat" - icon_living = "regalrat" - icon_dead = "regalrat_dead" - speak_chance = 0 - turns_per_move = 5 - maxHealth = 70 - health = 70 - // Slightly brown red, for the eyes - // Might be a bit too dim - lighting_cutoff_red = 22 - lighting_cutoff_green = 8 - lighting_cutoff_blue = 5 - obj_damage = 10 - butcher_results = list(/obj/item/food/meat/slab/mouse = 2, /obj/item/clothing/head/costume/crown = 1) - response_help_continuous = "glares at" - response_help_simple = "glare at" - response_disarm_continuous = "skoffs at" - response_disarm_simple = "skoff at" - response_harm_continuous = "slashes" - response_harm_simple = "slash" - melee_damage_lower = 13 - melee_damage_upper = 15 - attack_verb_continuous = "slashes" - attack_verb_simple = "slash" - attack_sound = 'sound/weapons/bladeslice.ogg' - attack_vis_effect = ATTACK_EFFECT_CLAW - unique_name = TRUE - faction = list(FACTION_RAT, FACTION_MAINT_CREATURES) - ///Whether or not the regal rat is already opening an airlock - var/opening_airlock = FALSE - ///The spell that the rat uses to generate miasma - var/datum/action/cooldown/domain/domain - ///The Spell that the rat uses to recruit/convert more rats. - var/datum/action/cooldown/riot/riot - -/mob/living/simple_animal/hostile/regalrat/Initialize(mapload) - . = ..() - domain = new(src) - riot = new(src) - domain.Grant(src) - riot.Grant(src) - AddElement(/datum/element/waddling) - - ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - -/mob/living/simple_animal/hostile/regalrat/Destroy() - QDEL_NULL(domain) - QDEL_NULL(riot) - return ..() - -/mob/living/simple_animal/hostile/regalrat/proc/become_player_controlled(mob/user) - log_message("took control of [name].", LOG_GAME) - key = user.key - notify_ghosts("All rise for the rat king, ascendant to the throne in \the [get_area(src)].", source = src, action = NOTIFY_ORBIT, flashwindow = FALSE, header = "Sentient Rat Created") - to_chat(src, span_notice("You are an independent, invasive force on the station! Horde coins, trash, cheese, and the like from the safety of darkness!")) - -/mob/living/simple_animal/hostile/regalrat/proc/get_player() - var/list/mob/dead/observer/candidates = poll_ghost_candidates("Do you want to play as the Regal Rat, cheesey be their crown?", ROLE_SENTIENCE, ROLE_SENTIENCE, 100, POLL_IGNORE_REGAL_RAT) - if(LAZYLEN(candidates) && !mind) - var/mob/dead/observer/candidate = pick(candidates) - become_player_controlled(candidate) - -/mob/living/simple_animal/hostile/regalrat/attack_ghost(mob/user) - . = ..() - if(. || !(GLOB.ghost_role_flags & GHOSTROLE_SPAWNER)) - return - if(key || stat) - return - if(!SSticker.HasRoundStarted()) - to_chat(user, span_warning("You cannot assume control of this until after the round has started!")) - return - var/rat_ask = tgui_alert(usr, "Become the Royal Rat?", "Are you sure?", list("Yes", "No")) - if(rat_ask != "Yes" || QDELETED(src)) - return - if(key) - to_chat(user, span_warning("Someone else already took the rat!")) - return - become_player_controlled(user) - -/mob/living/simple_animal/hostile/regalrat/handle_automated_action() - if(prob(20)) - riot.Trigger() - else if(prob(50)) - domain.Trigger() - return ..() - -/mob/living/simple_animal/hostile/regalrat/CanAttack(atom/the_target) - if(isliving(the_target)) - var/mob/living/living_target = the_target - if (living_target.stat != DEAD) - return !living_target.faction_check_mob(src, exact_match = TRUE) - - return ..() - -/mob/living/simple_animal/hostile/regalrat/examine(mob/user) - . = ..() - - if(ismouse(user)) - if(user.faction_check_mob(src, TRUE)) - . += span_notice("This is your king. Long live [p_their()] majesty!") - else - . += span_warning("This is a false king! Strike [p_them()] down!") - - else if(user != src && isregalrat(user)) - . += span_warning("Who is this foolish false king? This will not stand!") - -/mob/living/simple_animal/hostile/regalrat/handle_environment(datum/gas_mixture/environment) - . = ..() - if(stat == DEAD || !environment || !environment.gases[/datum/gas/miasma]) - return - var/miasma_percentage = environment.gases[/datum/gas/miasma][MOLES] / environment.total_moles() - if(miasma_percentage >= 0.25) - heal_bodypart_damage(1) - -#define REGALRAT_INTERACTION "regalrat" - -/mob/living/simple_animal/hostile/regalrat/AttackingTarget() - if (DOING_INTERACTION(src, REGALRAT_INTERACTION) || QDELETED(target)) - return - if(istype(target, /obj/machinery/door/airlock) && !opening_airlock) - pry_door(target) - return - if (src.mind && !src.combat_mode && target.reagents && target.is_injectable(src, allowmobs = TRUE) && !istype(target, /obj/item/food/cheese)) - src.visible_message(span_warning("[src] starts licking [target] passionately!"),span_notice("You start licking [target]...")) - if (do_after(src, 2 SECONDS, target, interaction_key = REGALRAT_INTERACTION)) - target.reagents.add_reagent(/datum/reagent/rat_spit,rand(1,3),no_react = TRUE) - to_chat(src, span_notice("You finish licking [target].")) - return - else - SEND_SIGNAL(target, COMSIG_RAT_INTERACT, src) - return ..() - -#undef REGALRAT_INTERACTION - -/** - * Conditionally "eat" cheese object and heal, if injured. - * - * A private proc for sending a message to the mob's chat about them - * eating some sort of cheese, then healing them, then deleting the cheese. - * The "eating" is only conditional on the mob being injured in the first - * place. - */ -/mob/living/simple_animal/hostile/regalrat/proc/cheese_heal(obj/item/target, amount, message) - if(health < maxHealth) - to_chat(src, message) - heal_bodypart_damage(amount) - qdel(target) - else - to_chat(src, span_warning("You feel fine, no need to eat anything!")) - -/** - * Allows rat king to pry open an airlock if it isn't locked. - * - * A proc used for letting the rat king pry open airlocks instead of just attacking them. - * This allows the rat king to traverse the station when there is a lack of vents or - * accessible doors, something which is common in certain rat king spawn points. - */ -/mob/living/simple_animal/hostile/regalrat/proc/pry_door(target) - var/obj/machinery/door/airlock/prying_door = target - if(!prying_door.density || prying_door.locked || prying_door.welded || prying_door.seal) - return FALSE - opening_airlock = TRUE - visible_message( - span_warning("[src] begins prying open the airlock..."), - span_notice("You begin digging your claws into the airlock..."), - span_warning("You hear groaning metal..."), - ) - var/time_to_open = 0.5 SECONDS - if(prying_door.hasPower()) - time_to_open = 5 SECONDS - playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, vary = TRUE) - if(do_after(src, time_to_open, prying_door)) - opening_airlock = FALSE - if(prying_door.density && !prying_door.open(BYPASS_DOOR_CHECKS)) - to_chat(src, span_warning("Despite your efforts, the airlock managed to resist your attempts to open it!")) - return FALSE - prying_door.open() - return FALSE - opening_airlock = FALSE - -/mob/living/simple_animal/hostile/regalrat/controlled/Initialize(mapload) - . = ..() - INVOKE_ASYNC(src, PROC_REF(get_player)) - var/kingdom = pick("Plague","Miasma","Maintenance","Trash","Garbage","Rat","Vermin","Cheese") - var/title = pick("King","Lord","Prince","Emperor","Supreme","Overlord","Master","Shogun","Bojar","Tsar") - name = "[kingdom] [title]" - - -/** - *Increase the rat king's domain - */ - -/datum/action/cooldown/domain - name = "Rat King's Domain" - desc = "Corrupts this area to be more suitable for your rat army." - check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_INCAPACITATED - cooldown_time = 6 SECONDS - melee_cooldown_time = 0 SECONDS - button_icon = 'icons/mob/actions/actions_animal.dmi' - background_icon_state = "bg_clock" - overlay_icon_state = "bg_clock_border" - button_icon_state = "coffer" - -/datum/action/cooldown/domain/proc/domain() - var/turf/T = get_turf(owner) - T.atmos_spawn_air("[GAS_MIASMA]=4;[TURF_TEMPERATURE(T20C)]") - switch (rand(1,10)) - if (8) - new /obj/effect/decal/cleanable/vomit(T) - if (9) - new /obj/effect/decal/cleanable/vomit/old(T) - if (10) - new /obj/effect/decal/cleanable/oil/slippery(T) - else - new /obj/effect/decal/cleanable/dirt(T) - StartCooldown() - -/datum/action/cooldown/domain/Activate(atom/target) - StartCooldown(10 SECONDS) - domain() - StartCooldown() - -/** - * This action checks some nearby maintenance animals and makes them your minions. - * If none are nearby, creates a new mouse. - */ -/datum/action/cooldown/riot - name = "Raise Army" - desc = "Raise an army out of the hordes of mice and pests crawling around the maintenance shafts." - check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_INCAPACITATED - button_icon = 'icons/mob/actions/actions_animal.dmi' - button_icon_state = "riot" - background_icon_state = "bg_clock" - overlay_icon_state = "bg_clock_border" - cooldown_time = 8 SECONDS - melee_cooldown_time = 0 SECONDS - /// How close does something need to be for us to recruit it? - var/range = 5 - /// Commands you can give to your mouse army - var/static/list/mouse_commands = list( - /datum/pet_command/idle, - /datum/pet_command/free, - /datum/pet_command/follow, - /datum/pet_command/point_targetting/attack/mouse - ) - /// Commands you can give to glockroaches - var/static/list/glockroach_commands = list( - /datum/pet_command/idle, - /datum/pet_command/free, - /datum/pet_command/follow, - /datum/pet_command/point_targetting/attack/glockroach - ) - -/datum/action/cooldown/riot/Activate(atom/target) - StartCooldown(10 SECONDS) - riot() - StartCooldown() - -/** - * Attempts to, in order and ending at any successful step: - * * Convert nearby mice into aggressive rats. - * * Convert nearby roaches into aggressive roaches. - * * Convert nearby frogs into aggressive frogs. - * * Spawn a single mouse if below the mouse cap. - */ -/datum/action/cooldown/riot/proc/riot() - var/uplifted_mice = FALSE - for (var/mob/living/basic/mouse/nearby_mouse in oview(owner, range)) - uplifted_mice = convert_mouse(nearby_mouse) || uplifted_mice - if (uplifted_mice) - owner.visible_message(span_warning("[owner] commands their army to action, mutating them into rats!")) - return - - var/static/list/converted_check_list = list(FACTION_RAT) - var/uplifted_roach = FALSE - for (var/mob/living/basic/cockroach/nearby_roach in oview(owner, range)) - uplifted_roach = convert_roach(nearby_roach, converted_check_list) || uplifted_roach - if (uplifted_roach) - owner.visible_message(span_warning("[owner] commands their army to action, mutating them into sewer roaches!")) - return - - var/uplifted_frog = FALSE - for (var/mob/living/basic/frog/nearby_frog in oview(owner, range)) - uplifted_frog = convert_frog(nearby_frog, converted_check_list) || uplifted_frog - if (uplifted_frog) - owner.visible_message(span_warning("[owner] commands their army to action, mutating them into trash frogs!")) - return - - var/rat_cap = CONFIG_GET(number/ratcap) - if (LAZYLEN(SSmobs.cheeserats) >= rat_cap) - to_chat(owner,span_warning("There's too many mice on this station to beckon a new one! Find them first!")) - return - new /mob/living/basic/mouse(owner.loc) - owner.visible_message(span_warning("[owner] commands a rat to their side!")) - -/// Makes a passed mob into our minion -/datum/action/cooldown/riot/proc/make_minion(mob/living/new_minion, minion_desc, list/command_list = mouse_commands) - if (isbasicmob(new_minion)) - new_minion.AddComponent(/datum/component/obeys_commands, command_list) - qdel(new_minion.GetComponent(/datum/component/tameable)) // Rats don't share - new_minion.befriend(owner) - new_minion.faction = owner.faction.Copy() - // Give a hint in description too - new_minion.desc += minion_desc - new_minion.balloon_alert_to_viewers("squeak") - -/// Turns a mouse into an angry mouse -/datum/action/cooldown/riot/proc/convert_mouse(mob/living/basic/mouse/nearby_mouse) - // This mouse is already rat controlled, let's not bother with it. - if (istype(nearby_mouse.ai_controller, /datum/ai_controller/basic_controller/mouse/rat)) - return FALSE - - var/mob/living/basic/mouse/rat/rat_path = /mob/living/basic/mouse/rat - // Change name - if (nearby_mouse.name == "mouse") - nearby_mouse.name = initial(rat_path.name) - // Buffs our combat stats to that of a rat - nearby_mouse.melee_damage_lower = initial(rat_path.melee_damage_lower) - nearby_mouse.melee_damage_upper = initial(rat_path.melee_damage_upper) - nearby_mouse.obj_damage = initial(rat_path.obj_damage) - nearby_mouse.maxHealth = initial(rat_path.maxHealth) - nearby_mouse.health = initial(rat_path.health) - // Replace our AI with a rat one - nearby_mouse.ai_controller = new /datum/ai_controller/basic_controller/mouse/rat(nearby_mouse) - make_minion(nearby_mouse, " ...Except this one looks corrupted and aggressive.") - return TRUE - -/// Turns a roach into an angry roach -/datum/action/cooldown/riot/proc/convert_roach(mob/living/basic/cockroach/nearby_roach, list/converted_check_list) - // No need to convert when not on the same team. - if (faction_check(nearby_roach.faction, converted_check_list)) - return FALSE - - var/list/minion_commands = mouse_commands - if (!findtext(nearby_roach.name, "sewer")) - nearby_roach.name = "sewer [nearby_roach.name]" - - if (istype(nearby_roach, /mob/living/basic/cockroach/glockroach) || istype(nearby_roach, /mob/living/basic/cockroach/hauberoach)) - if (istype(nearby_roach, /mob/living/basic/cockroach/glockroach)) - minion_commands = glockroach_commands - nearby_roach.melee_damage_lower += 0.5 - nearby_roach.melee_damage_upper += 2 - else - nearby_roach.melee_damage_lower += 2 - nearby_roach.melee_damage_upper += 4 - nearby_roach.obj_damage += 5 - nearby_roach.ai_controller = new /datum/ai_controller/basic_controller/cockroach/sewer(nearby_roach) - - nearby_roach.icon_state += "_sewer" - nearby_roach.maxHealth += 1 - nearby_roach.health += 1 - make_minion(nearby_roach, "
    This one looks extra robust.", minion_commands) - return TRUE - -/// Turns a frog into a crazy frog. This doesn't do anything interesting and should when it becomes a basic mob. -/datum/action/cooldown/riot/proc/convert_frog(mob/living/basic/frog/nearby_frog, list/converted_check_list) - // No need to convert when not on the same team. - if(faction_check(nearby_frog.faction, converted_check_list) || nearby_frog.stat == DEAD) - return FALSE - - var/list/minion_commands = mouse_commands - if (!findtext(nearby_frog.name, "trash")) - nearby_frog.name = replacetext(nearby_frog.name, "frog", "trash frog") - - nearby_frog.icon_state += "_trash" - nearby_frog.icon_living += "_trash" - nearby_frog.icon_dead = nearby_frog.icon_state + "_dead" - nearby_frog.maxHealth += 10 - nearby_frog.health += 10 - nearby_frog.melee_damage_lower += 1 - nearby_frog.melee_damage_upper += 5 - nearby_frog.obj_damage += 10 - nearby_frog.ai_controller = new /datum/ai_controller/basic_controller/frog/trash(nearby_frog) - var/crazy_frog_desc = " ...[findtext(nearby_frog.name, "rare") ? "even though" : "perhaps because"] they live in a trash bag." - make_minion(nearby_frog, crazy_frog_desc, minion_commands) - return TRUE - -// Command you can give to a mouse to make it kill someone -/datum/pet_command/point_targetting/attack/mouse - speech_commands = list("attack", "sic", "kill", "cheese em") - command_feedback = "squeak!" // Frogs and roaches can squeak too it's fine - pointed_reaction = "and squeaks aggressively" - refuse_reaction = "quivers" - attack_behaviour = /datum/ai_behavior/basic_melee_attack - -// Command you can give to a mouse to make it kill someone -/datum/pet_command/point_targetting/attack/glockroach - speech_commands = list("attack", "sic", "kill", "cheese em") - command_feedback = "squeak!" - pointed_reaction = "and cocks its gun" - refuse_reaction = "quivers" - attack_behaviour = /datum/ai_behavior/basic_ranged_attack/glockroach - -/** - *Spittle; harmless reagent that is added by rat king, and makes you disgusted. - */ - -/datum/reagent/rat_spit - name = "Rat Spit" - description = "Something coming from a rat. Dear god! Who knows where it's been!" - reagent_state = LIQUID - color = "#C8C8C8" - metabolization_rate = 0.03 * REAGENTS_METABOLISM - taste_description = "something funny" - overdose_threshold = 20 - -/datum/reagent/rat_spit/on_mob_metabolize(mob/living/L) - ..() - if(HAS_TRAIT(L, TRAIT_AGEUSIA)) - return - to_chat(L, span_notice("This food has a funny taste!")) - -/datum/reagent/rat_spit/overdose_start(mob/living/M) - ..() - var/mob/living/carbon/victim = M - if (istype(victim) && !(FACTION_RAT in victim.faction)) - 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 |= FACTION_RAT - victim.vomit() - metabolization_rate = 10 * REAGENTS_METABOLISM - -/datum/reagent/rat_spit/on_mob_life(mob/living/carbon/C) - if(prob(15)) - to_chat(C, span_notice("You feel queasy!")) - C.adjust_disgust(3) - else if(prob(10)) - to_chat(C, span_warning("That food does not sit up well!")) - C.adjust_disgust(5) - else if(prob(5)) - C.vomit() - ..() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm deleted file mode 100644 index 47c5e5dd5bc9f..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ /dev/null @@ -1,530 +0,0 @@ -/mob/living/simple_animal/hostile/retaliate/clown - name = "Clown" - desc = "A denizen of clown planet." - icon = 'icons/mob/simple/clown_mobs.dmi' - icon_state = "clown" - icon_living = "clown" - icon_dead = "clown_dead" - icon_gib = "clown_gib" - health_doll_icon = "clown" //if >32x32, it will use this generic. for all the huge clown mobs that subtype from this - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - turns_per_move = 5 - response_disarm_continuous = "gently pushes aside" - response_disarm_simple = "gently push aside" - response_harm_continuous = "robusts" - response_harm_simple = "robust" - speak = list("HONK", "Honk!", "Welcome to clown planet!") - emote_see = list("honks", "squeaks") - speak_chance = 1 - combat_mode = TRUE - maxHealth = 75 - health = 75 - speed = 1 - harm_intent_damage = 8 - melee_damage_lower = 10 - melee_damage_upper = 10 - attack_sound = 'sound/items/bikehorn.ogg' - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - del_on_death = 1 - loot = list(/obj/effect/mob_spawn/corpse/human/clown) - initial_language_holder = /datum/language_holder/clown - 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) - minbodytemp = 270 - maxbodytemp = 370 - unsuitable_atmos_damage = 10 - unsuitable_heat_damage = 15 - footstep_type = FOOTSTEP_MOB_SHOE - faction = list(FACTION_CLOWN) - var/attack_reagent - -/mob/living/simple_animal/hostile/retaliate/clown/Initialize(mapload) - . = ..() - if(attack_reagent) - var/static/list/injection_range = list(1, 5) - AddElement(/datum/element/venomous, attack_reagent, injection_range) - -/mob/living/simple_animal/hostile/retaliate/clown/attack_hand(mob/living/carbon/human/user, list/modifiers) - ..() - playsound(loc, 'sound/items/bikehorn.ogg', 50, TRUE) - -/mob/living/simple_animal/hostile/retaliate/clown/AttackingTarget(atom/attacked_target) - if(!istype(attacked_target, /obj/item/food/grown/banana/bunch)) - return ..() - var/obj/item/food/grown/banana/bunch/unripe_bunch = attacked_target - unripe_bunch.start_ripening() - log_combat(src, attacked_target, "honksposivley ripened") - -/mob/living/simple_animal/hostile/retaliate/clown/lube - name = "Living Lube" - desc = "A puddle of lube brought to life by the honkmother." - icon_state = "lube" - icon_living = "lube" - turns_per_move = 1 - response_help_continuous = "dips a finger into" - response_help_simple = "dip a finger into" - response_disarm_continuous = "gently scoops and pours aside" - response_disarm_simple = "gently scoop and pour aside" - emote_see = list("bubbles", "oozes") - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/particle_effect/fluid/foam) - -/mob/living/simple_animal/hostile/retaliate/clown/lube/Initialize(mapload) - . = ..() - AddElement(/datum/element/snailcrawl) - -/mob/living/simple_animal/hostile/retaliate/clown/banana - name = "Clownana" - desc = "A fusion of clown and banana DNA birthed from a botany experiment gone wrong." - icon_state = "banana tree" - icon_living = "banana tree" - response_disarm_continuous = "peels" - response_disarm_simple = "peel" - response_harm_continuous = "peels" - response_harm_simple = "peel" - turns_per_move = 1 - speak = list("HONK", "Honk!", "YA-HONK!!!") - emote_see = list("honks", "bites into the banana", "plucks a banana off its head", "photosynthesizes") - maxHealth = 120 - health = 120 - speed = -1 - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap, /obj/item/seeds/banana) - ///Our peel dropping ability - var/datum/action/cooldown/rustle/banana_rustle - ///Our banana bunch spawning ability - var/datum/action/cooldown/exquisite_bunch/banana_bunch - -/mob/living/simple_animal/hostile/retaliate/clown/banana/Initialize(mapload) - . = ..() - banana_rustle = new() - banana_rustle.Grant(src) - banana_bunch = new() - banana_bunch.Grant(src) - -/mob/living/simple_animal/hostile/retaliate/clown/banana/Destroy() - . = ..() - QDEL_NULL(banana_rustle) - QDEL_NULL(banana_bunch) - -///drops peels around the mob when activated -/datum/action/cooldown/rustle - name = "Rustle" - desc = "Shake loose a few banana peels." - cooldown_time = 8 SECONDS - button_icon_state = "rustle" - button_icon = 'icons/mob/actions/actions_clown.dmi' - background_icon_state = "bg_nature" - overlay_icon_state = "bg_nature_border" - ///which type of peel to spawn - var/banana_type = /obj/item/grown/bananapeel - ///How many peels to spawn - var/peel_amount = 3 - -/datum/action/cooldown/rustle/Activate(atom/target) - . = ..() - var/list/reachable_turfs = list() - for(var/turf/adjacent_turf in RANGE_TURFS(1, owner.loc)) - if(adjacent_turf == owner.loc || !owner.CanReach(adjacent_turf) || !isopenturf(adjacent_turf)) - continue - reachable_turfs += adjacent_turf - - var/peels_to_spawn = min(peel_amount, reachable_turfs.len) - for(var/i in 1 to peels_to_spawn) - new banana_type(pick_n_take(reachable_turfs)) - playsound(owner, 'sound/creatures/clown/clownana_rustle.ogg', 60) - animate(owner, time = 1, pixel_x = 6, easing = CUBIC_EASING | EASE_OUT) - animate(time = 2, pixel_x = -8, easing = CUBIC_EASING) - animate(time = 1, pixel_x = 0, easing = CUBIC_EASING | EASE_IN) - StartCooldown() - -///spawns a plumb bunch of bananas imbued with mystical power. -/datum/action/cooldown/exquisite_bunch - name = "Exquisite Bunch" - desc = "Pluck your finest bunch of bananas from your head. This bunch is especially nutrious to monkeykind. A gentle tap will trigger an explosive ripening process." - button_icon = 'icons/obj/hydroponics/harvest.dmi' - cooldown_time = 60 SECONDS - button_icon_state = "banana_bunch" - background_icon_state = "bg_nature" - overlay_icon_state = "bg_nature_border" - ///If we are currently activating our ability. - var/activating = FALSE - -/datum/action/cooldown/exquisite_bunch/Trigger(trigger_flags, atom/target) - if(activating) - return - var/bunch_turf = get_step(owner.loc, owner.dir) - if(!bunch_turf) - return - if(!owner.CanReach(bunch_turf) || !isopenturf(bunch_turf)) - owner.balloon_alert(owner, "can't do that here!") - return - activating = TRUE - if(!do_after(owner, 1 SECONDS)) - activating = FALSE - return - playsound(owner, 'sound/creatures/clown/hehe.ogg', 100) - if(!do_after(owner, 1 SECONDS)) - activating = FALSE - return - activating = FALSE - return ..() - -/datum/action/cooldown/exquisite_bunch/Activate(atom/target) - . = ..() - new /obj/item/food/grown/banana/bunch(get_step(owner.loc, owner.dir)) - playsound(owner, 'sound/items/bikehorn.ogg', 60) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), owner, 'sound/creatures/clown/hohoho.ogg', 100, 1), 1 SECONDS) - StartCooldown() - -/mob/living/simple_animal/hostile/retaliate/clown/honkling - name = "Honkling" - desc = "A divine being sent by the Honkmother to spread joy. It's not dangerous, but it's a bit of a nuisance." - icon_state = "honkling" - icon_living = "honkling" - turns_per_move = 1 - speed = -10 - harm_intent_damage = 1 - melee_damage_lower = 1 - melee_damage_upper = 1 - attack_verb_continuous = "cheers up" - attack_verb_simple = "cheer up" - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap, /obj/item/seeds/banana/bluespace) - attack_reagent = /datum/reagent/consumable/laughter - -/mob/living/simple_animal/hostile/retaliate/clown/fleshclown - name = "Fleshclown" - desc = "A being forged out of the pure essence of pranking, cursed into existence by a cruel maker." - icon_state = "fleshclown" - icon_living = "fleshclown" - response_help_continuous = "reluctantly pokes" - response_help_simple = "reluctantly poke" - response_disarm_continuous = "sinks his hands into the spongy flesh of" - response_disarm_simple = "sink your hands into the spongy flesh of" - response_harm_continuous = "cleanses the world of" - response_harm_simple = "cleanse the world of" - speak = list("HONK", "Honk!", "I didn't ask for this", "I feel constant and horrible pain", "YA-HONK!!!", "this body is a merciless and unforgiving prison", "I was born out of mirthful pranking but I live in suffering") - emote_see = list("honks", "sweats", "jiggles", "contemplates its existence") - speak_chance = 5 - dextrous = TRUE - maxHealth = 140 - health = 140 - speed = -5 - melee_damage_upper = 15 - attack_verb_continuous = "limply slaps" - attack_verb_simple = "limply slap" - obj_damage = 5 - loot = list(/obj/item/clothing/suit/hooded/bloated_human, /obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap) - -/mob/living/simple_animal/hostile/retaliate/clown/fleshclown/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - -/mob/living/simple_animal/hostile/retaliate/clown/longface - name = "Longface" - desc = "Often found walking into the bar." - icon_state = "long face" - icon_living = "long face" - move_resist = INFINITY - turns_per_move = 10 - response_help_continuous = "tries to awkwardly hug" - response_help_simple = "try to awkwardly hug" - response_disarm_continuous = "pushes the unwieldy frame of" - response_disarm_simple = "push the unwieldy frame of" - response_harm_continuous = "tries to shut up" - response_harm_simple = "try to shut up" - speak = list("YA-HONK!!!") - emote_see = list("honks", "squeaks") - speak_chance = 60 - maxHealth = 150 - health = 150 - pixel_x = -16 - base_pixel_x = -16 - speed = 10 - harm_intent_damage = 5 - melee_damage_lower = 5 - attack_verb_continuous = "YA-HONKs" - attack_verb_simple = "YA-HONK" - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap) - -/mob/living/simple_animal/hostile/retaliate/clown/clownhulk - name = "Honk Hulk" - desc = "A cruel and fearsome clown. Don't make him angry." - icon_state = "honkhulk" - icon_living = "honkhulk" - move_resist = INFINITY - gender = MALE - response_help_continuous = "tries desperately to appease" - response_help_simple = "try desperately to appease" - response_disarm_continuous = "foolishly pushes" - response_disarm_simple = "foolishly push" - response_harm_continuous = "angers" - response_harm_simple = "anger" - speak = list("HONK", "Honk!", "HAUAUANK!!!", "GUUURRRRAAAHHH!!!") - emote_see = list("honks", "sweats", "grunts") - speak_chance = 5 - maxHealth = 400 - health = 400 - pixel_x = -16 - base_pixel_x = -16 - speed = 2 - harm_intent_damage = 15 - melee_damage_lower = 15 - melee_damage_upper = 20 - attack_verb_continuous = "pummels" - attack_verb_simple = "pummel" - obj_damage = 30 - environment_smash = ENVIRONMENT_SMASH_WALLS - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap) - -/mob/living/simple_animal/hostile/retaliate/clown/clownhulk/chlown - name = "Chlown" - desc = "A real lunkhead who somehow gets all the girls." - icon_state = "chlown" - icon_living = "chlown" - gender = MALE - response_help_continuous = "submits to" - response_help_simple = "submit to" - response_disarm_continuous = "tries to assert dominance over" - response_disarm_simple = "try to assert dominance over" - response_harm_continuous = "makes a weak beta attack at" - response_harm_simple = "make a weak beta attack at" - speak = list("HONK", "Honk!", "Bruh", "cheeaaaahhh?") - emote_see = list("asserts his dominance", "emasculates everyone implicitly") - maxHealth = 500 - health = 500 - speed = -2 - armour_penetration = 20 - attack_verb_continuous = "steals the girlfriend of" - attack_verb_simple = "steal the girlfriend of" - attack_sound = 'sound/items/airhorn2.ogg' - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/effect/particle_effect/fluid/foam, /obj/item/soap) - -/mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus - name = "Honkmunculus" - desc = "A slender wiry figure of alchemical origin." - icon_state = "honkmunculus" - icon_living = "honkmunculus" - response_help_continuous = "skeptically pokes" - response_help_simple = "skeptically poke" - response_disarm_continuous = "pushes the unwieldy frame of" - response_disarm_simple = "push the unwieldy frame of" - speak = list("honk") - emote_see = list("squirms", "writhes") - speak_chance = 1 - maxHealth = 200 - health = 200 - speed = -5 - harm_intent_damage = 5 - melee_damage_lower = 5 - melee_damage_upper = 10 - attack_verb_continuous = "ferociously mauls" - attack_verb_simple = "ferociously maul" - environment_smash = ENVIRONMENT_SMASH_NONE - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/xeno/bodypartless, /obj/effect/particle_effect/fluid/foam, /obj/item/soap) - attack_reagent = /datum/reagent/peaceborg/confuse - -/mob/living/simple_animal/hostile/retaliate/clown/clownhulk/destroyer - name = "The Destroyer" - desc = "An ancient being born of arcane honking." - icon_state = "destroyer" - icon_living = "destroyer" - response_disarm_continuous = "bounces off of" - response_harm_continuous = "bounces off of" - speak = list("HONK!!!", "The Honkmother is merciful, so I must act out her wrath.", "parce mihi ad beatus honkmother placet mihi ut peccata committere,", "DIE!!!") - maxHealth = 400 - health = 400 - speed = 5 - harm_intent_damage = 30 - melee_damage_lower = 20 - melee_damage_upper = 40 - armour_penetration = 30 - stat_attack = HARD_CRIT - 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/fluid/foam, /obj/item/soap) - -/mob/living/simple_animal/hostile/retaliate/clown/mutant - name = "Unknown" - desc = "Kill it for its own sake." - icon_state = "mutant" - icon_living = "mutant" - move_resist = INFINITY - turns_per_move = 10 - response_help_continuous = "reluctantly sinks a finger into" - response_help_simple = "reluctantly sink a finger into" - response_disarm_continuous = "squishes into" - response_disarm_simple = "squish into" - response_harm_continuous = "squishes into" - response_harm_simple = "squish into" - speak = list("aaaaaahhhhuuhhhuhhhaaaaa", "AAAaaauuuaaAAAaauuhhh", "huuuuuh... hhhhuuuooooonnnnkk", "HuaUAAAnKKKK") - emote_see = list("squirms", "writhes", "pulsates", "froths", "oozes") - speak_chance = 10 - maxHealth = 130 - health = 130 - pixel_x = -16 - base_pixel_x = -16 - speed = -5 - harm_intent_damage = 10 - melee_damage_lower = 10 - melee_damage_upper = 20 - attack_verb_continuous = "awkwardly flails at" - attack_verb_simple = "awkwardly flail at" - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/xeno/bodypartless, /obj/item/soap, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic/animal, /obj/effect/gibspawner/human/bodypartless, /obj/effect/gibspawner/human) - -/mob/living/simple_animal/hostile/retaliate/clown/mutant/slow - speed = 20 - move_to_delay = 60 - -/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton - name = "banana glutton" - desc = "Something that was once a clown" - icon_state = "glutton" - icon_living = "glutton" - speak = list("hey, buddy", "HONK!!!", "H-h-h-H-HOOOOONK!!!!", "HONKHONKHONK!!!", "HEY, BUCKO, GET BACK HERE!!!", "HOOOOOOOONK!!!") - emote_see = list("jiggles", "wobbles") - health = 200 - mob_size = MOB_SIZE_LARGE - speed = 1 - melee_damage_lower = 10 - melee_damage_upper = 15 - force_threshold = 10 //lots of fat to cushion blows. - damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 2, STAMINA = 0, OXY = 1) - attack_verb_continuous = "slams" - attack_verb_simple = "slam" - loot = list(/obj/effect/gibspawner/xeno/bodypartless, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic/animal, /obj/effect/gibspawner/human/bodypartless) - death_sound = 'sound/misc/sadtrombone.ogg' - ///This is the list of items we are ready to regurgitate, - var/list/prank_pouch = list() - -/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/Initialize(mapload) - . = ..() - 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))) - - -/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/attacked_by(obj/item/I, mob/living/user) - if(!check_edible(I)) - return ..() - eat_atom(I) - -/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/AttackingTarget(atom/attacked_target) - if(!check_edible(attacked_target)) - return ..() - eat_atom(attacked_target) - -/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/UnarmedAttack(atom/A, proximity_flag, list/modifiers) - if(!check_edible(A)) - return ..() - eat_atom(A) - -///Returns whether or not the supplied movable atom is edible. -/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/proc/check_edible(atom/movable/potential_food) - if(isliving(potential_food)) - var/mob/living/living_morsel = potential_food - if(living_morsel.mob_size > MOB_SIZE_SMALL) - return FALSE - else - return TRUE - - if(IS_EDIBLE(potential_food)) - if(prank_pouch.len >= 8) - to_chat(src, span_warning("Your prank pouch is filled to the brim! You don't think you can swallow any more morsels right now.")) - return FALSE - return TRUE - -///This proc eats the atom, certain funny items are stored directly in the prank pouch while bananas grant a heal based on their potency and the peels are retained in the pouch. -/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/proc/eat_atom(atom/movable/eaten_atom) - - var/static/funny_items = list( - /obj/item/food/pie/cream, - /obj/item/food/grown/tomato, - /obj/item/food/meatclown, - ) - - visible_message(span_warning("[src] eats [eaten_atom]!"), span_notice("You eat [eaten_atom].")) - if(is_type_in_list(eaten_atom, funny_items)) - eaten_atom.forceMove(src) - prank_pouch += eaten_atom - - else - if(istype(eaten_atom, /obj/item/food/grown/banana)) - var/obj/item/food/grown/banana/banana_morsel = eaten_atom - adjustBruteLoss(-banana_morsel.seed.potency * 0.25) - prank_pouch += banana_morsel.generate_trash(src) - - qdel(eaten_atom) - - playsound(loc,'sound/items/eatfood.ogg', rand(30,50), TRUE) - flick("glutton_mouth", src) - -/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/proc/tamed(mob/living/tamer) - 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 - -///This ability will let you fire one random item from your pouch, -/datum/action/cooldown/regurgitate - name = "Regurgitate" - desc = "Regurgitates a single item from the depths of your pouch." - background_icon_state = "bg_changeling" - overlay_icon_state = "bg_changeling_border" - button_icon = 'icons/mob/actions/actions_animal.dmi' - button_icon_state = "regurgitate" - check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_INCAPACITATED - melee_cooldown_time = 0 SECONDS - click_to_activate = TRUE - -/datum/action/cooldown/regurgitate/set_click_ability(mob/on_who) - . = ..() - if(!.) - return - - to_chat(on_who, span_notice("Your throat muscles tense up. Left-click to regurgitate a funny morsel!")) - on_who.icon_state = "glutton_tongue" - on_who.update_appearance(UPDATE_ICON) - -/datum/action/cooldown/regurgitate/unset_click_ability(mob/on_who, refund_cooldown = TRUE) - . = ..() - if(!.) - return - - if(refund_cooldown) - to_chat(on_who, span_notice("Your throat muscles relax.")) - on_who.icon_state = initial(on_who.icon_state) - on_who.update_appearance(UPDATE_ICON) - -/datum/action/cooldown/regurgitate/IsAvailable(feedback = FALSE) - . = ..() - if(!.) - return FALSE - - // Hardcoded to only work with gluttons. Come back next year - return istype(owner, /mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton) - -/datum/action/cooldown/regurgitate/Activate(atom/spit_at) - StartCooldown(cooldown_time / 4) - - var/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/pouch_owner = owner - if(!length(pouch_owner.prank_pouch)) - pouch_owner.icon_state = initial(pouch_owner.icon_state) - to_chat(pouch_owner, span_notice("Your prank pouch is empty.")) - return TRUE - - var/obj/item/projected_morsel = pick(pouch_owner.prank_pouch) - projected_morsel.forceMove(pouch_owner.loc) - projected_morsel.throw_at(spit_at, 8, 2, pouch_owner) - flick("glutton_mouth", pouch_owner) - playsound(pouch_owner, 'sound/misc/soggy.ogg', 75) - - StartCooldown() - return TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm index 29f628d148ef1..e4b07470c5882 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm @@ -8,7 +8,7 @@ mob_biotypes = MOB_ORGANIC|MOB_BEAST speak_chance = 0 turns_per_move = 5 - butcher_results = list(/obj/item/food/meat/slab = 2) + butcher_results = list(/obj/item/food/meat/slab/grassfed = 2) response_help_continuous = "pets" response_help_simple = "pet" response_disarm_continuous = "gently pushes aside" diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/snake.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/snake.dm deleted file mode 100644 index e128349bc2e8b..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/snake.dm +++ /dev/null @@ -1,76 +0,0 @@ - -/mob/living/simple_animal/hostile/retaliate/snake - name = "snake" - desc = "A slithery snake. These legless reptiles are the bane of mice and adventurers alike." - icon_state = "snake" - icon_living = "snake" - icon_dead = "snake_dead" - speak_emote = list("hisses") - health = 20 - maxHealth = 20 - attack_verb_continuous = "bites" - attack_verb_simple = "bite" - attack_sound = 'sound/weapons/bite.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE - melee_damage_lower = 5 - melee_damage_upper = 6 - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "shoos" - response_disarm_simple = "shoo" - response_harm_continuous = "steps on" - response_harm_simple = "step on" - faction = list(FACTION_HOSTILE) - density = FALSE - pass_flags = PASSTABLE | PASSMOB - mob_size = MOB_SIZE_SMALL - mob_biotypes = MOB_ORGANIC|MOB_BEAST|MOB_REPTILE - gold_core_spawnable = FRIENDLY_SPAWN - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - -/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 - var/list/living_mobs = list() - var/list/mice = list() - for (var/HM in .) - //Yum a tasty mouse - if(ismouse(HM)) - mice += HM - if(isliving(HM)) - living_mobs += HM - - // if no tasty mice to chase, lets chase any living mob enemies in our vision range - if(length(mice)) - return mice - - var/list/actual_enemies = list() - for(var/datum/weakref/enemy as anything in enemies) - var/mob/flesh_and_blood = enemy.resolve() - if(!flesh_and_blood) - enemies -= enemy - continue - actual_enemies += flesh_and_blood - - //Filter living mobs (in range mobs) by those we consider enemies (retaliate behaviour) - return living_mobs & actual_enemies - -/mob/living/simple_animal/hostile/retaliate/snake/AttackingTarget() - if(ismouse(target)) - visible_message(span_notice("[name] consumes [target] in a single gulp!"), span_notice("You consume [target] in a single gulp!")) - QDEL_NULL(target) - adjustBruteLoss(-2) - else - return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/trader.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/trader.dm index 30f0e9cbae45e..5be6fc9575d8f 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/trader.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/trader.dm @@ -75,7 +75,7 @@ * Associated list of items able to be sold to the NPC with the money given for them. * The price given should be the "base" price; any price manipulation based on variables should be done with apply_sell_price_mods() * ADDITIONAL_DESCRIPTION is any additional text added to explain how the variables of the item effect the price; if it's stack based, it's final price depends how much is in the stack - * EX; /obj/item/stack/sheet/mineral/diamond = list(500, INFINITY, ", per 2000 cm3 sheet of diamond") + * EX; /obj/item/stack/sheet/mineral/diamond = list(500, INFINITY, ", per 100 cm3 sheet of diamond") * This list is filled by Initialize(), if you want to change the starting wanted items, modify initial_wanteds() */ var/list/wanted_items diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm index ca22166e91b35..aba636c11bfe3 100644 --- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm +++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm @@ -16,7 +16,6 @@ melee_damage_upper = 15 minbodytemp = 0 maxbodytemp = 1500 - healable = 0 //they're skeletons how would bruise packs help them?? attack_verb_continuous = "slashes" attack_verb_simple = "slash" attack_sound = 'sound/hallucinations/growl1.ogg' diff --git a/code/modules/mob/living/simple_animal/hostile/slaughter_demon.dm b/code/modules/mob/living/simple_animal/hostile/slaughter_demon.dm deleted file mode 100644 index 33702c95d96d7..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/slaughter_demon.dm +++ /dev/null @@ -1,242 +0,0 @@ -//////////////////Imp - -/mob/living/simple_animal/hostile/imp - name = "imp" - real_name = "imp" - unique_name = TRUE - desc = "A large, menacing creature covered in armored black scales." - speak_emote = list("cackles") - emote_hear = list("cackles","screeches") - response_help_continuous = "thinks better of touching" - response_help_simple = "think better of touching" - response_disarm_continuous = "flails at" - response_disarm_simple = "flail at" - response_harm_continuous = "punches" - response_harm_simple = "punch" - icon = 'icons/mob/simple/mob.dmi' - icon_state = "imp" - icon_living = "imp" - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - speed = 1 - combat_mode = TRUE - stop_automated_movement = TRUE - status_flags = CANPUSH - attack_sound = 'sound/magic/demon_attack1.ogg' - attack_vis_effect = ATTACK_EFFECT_CLAW - 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 = 250 //Weak to cold - maxbodytemp = INFINITY - faction = list(FACTION_HELL) - attack_verb_continuous = "wildly tears into" - attack_verb_simple = "wildly tear into" - maxHealth = 200 - health = 200 - healable = 0 - obj_damage = 40 - melee_damage_lower = 10 - melee_damage_upper = 15 - // You KNOW we're doing a lightly purple red - lighting_cutoff_red = 30 - lighting_cutoff_green = 10 - lighting_cutoff_blue = 20 - del_on_death = TRUE - death_message = "screams in agony as it sublimates into a sulfurous smoke." - death_sound = 'sound/magic/demon_dies.ogg' - -//////////////////The Man Behind The Slaughter - -/mob/living/simple_animal/hostile/imp/slaughter - name = "slaughter demon" - real_name = "slaughter demon" - unique_name = FALSE - speak_emote = list("gurgles") - emote_hear = list("wails","screeches") - icon_state = "daemon" - icon_living = "daemon" - minbodytemp = 0 - obj_damage = 50 - melee_damage_lower = 15 // reduced from 30 to 15 with wounds since they get big buffs to slicing wounds - melee_damage_upper = 15 - wound_bonus = -10 - bare_wound_bonus = 0 - sharpness = SHARP_EDGED - - loot = list(/obj/effect/decal/cleanable/blood, \ - /obj/effect/decal/cleanable/blood/innards, \ - /obj/item/organ/internal/heart/demon) - del_on_death = 1 - - var/crawl_type = /datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon - /// How long it takes for the alt-click slam attack to come off cooldown - var/slam_cooldown_time = 45 SECONDS - /// The actual instance var for the cooldown - var/slam_cooldown = 0 - /// How many times we have hit humanoid targets since we last bloodcrawled, scaling wounding power - var/current_hitstreak = 0 - /// How much both our wound_bonus and bare_wound_bonus go up per hitstreak hit - var/wound_bonus_per_hit = 5 - /// How much our wound_bonus hitstreak bonus caps at (peak demonry) - var/wound_bonus_hitstreak_max = 12 - -/mob/living/simple_animal/hostile/imp/slaughter/Initialize(mapload) - . = ..() - var/datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/crawl = new crawl_type(src) - crawl.Grant(src) - RegisterSignals(src, list(COMSIG_MOB_ENTER_JAUNT, COMSIG_MOB_AFTER_EXIT_JAUNT), PROC_REF(on_crawl)) - -/// Whenever we enter or exit blood crawl, reset our bonus and hitstreaks. -/mob/living/simple_animal/hostile/imp/slaughter/proc/on_crawl(datum/source) - SIGNAL_HANDLER - - // Grant us a speed boost if we're on the mortal plane - if(isturf(loc)) - add_movespeed_modifier(/datum/movespeed_modifier/slaughter) - addtimer(CALLBACK(src, PROC_REF(remove_movespeed_modifier), /datum/movespeed_modifier/slaughter), 6 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) - - // Reset our streaks - current_hitstreak = 0 - wound_bonus = initial(wound_bonus) - bare_wound_bonus = initial(bare_wound_bonus) - - -/// Performs the classic slaughter demon bodyslam on the attack_target. Yeets them a screen away. -/mob/living/simple_animal/hostile/imp/slaughter/proc/bodyslam(atom/attack_target) - if(!isliving(attack_target)) - return - - if(!Adjacent(attack_target)) - to_chat(src, span_warning("You are too far away to use your slam attack on [attack_target]!")) - return - - if(slam_cooldown + slam_cooldown_time > world.time) - to_chat(src, span_warning("Your slam ability is still on cooldown!")) - return - - face_atom(attack_target) - var/mob/living/victim = attack_target - victim.take_bodypart_damage(brute=20, wound_bonus=wound_bonus) // don't worry, there's more punishment when they hit something - visible_message(span_danger("[src] slams into [victim] with monstrous strength!"), span_danger("You slam into [victim] with monstrous strength!"), ignored_mobs=victim) - to_chat(victim, span_userdanger("[src] slams into you with monstrous strength, sending you flying like a ragdoll!")) - var/turf/yeet_target = get_edge_target_turf(victim, dir) - victim.throw_at(yeet_target, 10, 5, src) - slam_cooldown = world.time - log_combat(src, victim, "slaughter slammed") - -/mob/living/simple_animal/hostile/imp/slaughter/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) - if(LAZYACCESS(modifiers, RIGHT_CLICK)) - bodyslam(attack_target) - return - - if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) - return - - if(iscarbon(attack_target)) - var/mob/living/carbon/target = attack_target - if(target.stat != DEAD && target.mind && current_hitstreak < wound_bonus_hitstreak_max) - current_hitstreak++ - wound_bonus += wound_bonus_per_hit - bare_wound_bonus += wound_bonus_per_hit - - return ..() - -/obj/effect/decal/cleanable/blood/innards - name = "pile of viscera" - desc = "A repulsive pile of guts and gore." - gender = NEUTER - icon = 'icons/obj/medical/organs/organs.dmi' - icon_state = "innards" - random_icon_states = null - -//The loot from killing a slaughter demon - can be consumed to allow the user to blood crawl -/obj/item/organ/internal/heart/demon - name = "demon heart" - desc = "Still it beats furiously, emanating an aura of utter hate." - icon = 'icons/obj/medical/organs/organs.dmi' - icon_state = "demon_heart-on" - decay_factor = 0 - -/obj/item/organ/internal/heart/demon/Initialize(mapload) - AddElement(/datum/element/update_icon_blocker) - return ..() - -/obj/item/organ/internal/heart/demon/attack(mob/M, mob/living/carbon/user, obj/target) - if(M != user) - return ..() - user.visible_message(span_warning( - "[user] raises [src] to [user.p_their()] mouth and tears into it with [user.p_their()] teeth!"), - span_danger("An unnatural hunger consumes you. You raise [src] your mouth and devour it!"), - ) - playsound(user, 'sound/magic/demon_consume.ogg', 50, TRUE) - - if(locate(/datum/action/cooldown/spell/jaunt/bloodcrawl) in user.actions) - to_chat(user, span_warning("...and you don't feel any different.")) - qdel(src) - return - - user.visible_message( - span_warning("[user]'s eyes flare a deep crimson!"), - span_userdanger("You feel a strange power seep into your body... you have absorbed the demon's blood-travelling powers!"), - ) - user.temporarilyRemoveItemFromInventory(src, TRUE) - src.Insert(user) //Consuming the heart literally replaces your heart with a demon heart. H A R D C O R E - -/obj/item/organ/internal/heart/demon/on_insert(mob/living/carbon/heart_owner) - . = ..() - // Gives a non-eat-people crawl to the new owner - var/datum/action/cooldown/spell/jaunt/bloodcrawl/crawl = new(heart_owner) - crawl.Grant(heart_owner) - -/obj/item/organ/internal/heart/demon/on_remove(mob/living/carbon/heart_owner, special = FALSE) - . = ..() - var/datum/action/cooldown/spell/jaunt/bloodcrawl/crawl = locate() in heart_owner.actions - qdel(crawl) - -/obj/item/organ/internal/heart/demon/Stop() - return 0 // Always beating. - -/mob/living/simple_animal/hostile/imp/slaughter/laughter - // The laughter demon! It's everyone's best friend! It just wants to hug - // them so much, it wants to hug everyone at once! - name = "laughter demon" - real_name = "laughter demon" - desc = "A large, adorable creature covered in armor with pink bows." - speak_emote = list("giggles","titters","chuckles") - emote_hear = list("guffaws","laughs") - response_help_continuous = "hugs" - attack_verb_continuous = "wildly tickles" - attack_verb_simple = "wildly tickle" - - attack_sound = 'sound/items/bikehorn.ogg' - attack_vis_effect = null - death_sound = 'sound/misc/sadtrombone.ogg' - - icon_state = "bowmon" - icon_living = "bowmon" - death_message = "fades out, as all of its friends are released from its \ - prison of hugs." - loot = list(/mob/living/simple_animal/pet/cat/kitten{name = "Laughter"}) - - crawl_type = /datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/funny - // Keep the people we hug! - var/list/consumed_mobs = list() - -/mob/living/simple_animal/hostile/imp/slaughter/laughter/Initialize(mapload) - . = ..() - if(check_holidays(APRIL_FOOLS)) - icon_state = "honkmon" - -/mob/living/simple_animal/hostile/imp/slaughter/laughter/ex_act(severity) - switch(severity) - if(EXPLODE_DEVASTATE) - investigate_log("has died from a devastating explosion.", INVESTIGATE_DEATHS) - death() - if(EXPLODE_HEAVY) - adjustBruteLoss(60) - if(EXPLODE_LIGHT) - adjustBruteLoss(30) - - return TRUE - -/mob/living/simple_animal/hostile/imp/slaughter/engine_demon - name = "engine demon" - faction = list(FACTION_HELL, FACTION_NEUTRAL) diff --git a/code/modules/mob/living/simple_animal/hostile/smspider.dm b/code/modules/mob/living/simple_animal/hostile/smspider.dm deleted file mode 100644 index a6f14e33c9a67..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/smspider.dm +++ /dev/null @@ -1,65 +0,0 @@ -/mob/living/simple_animal/hostile/smspider - name = "supermatter spider" - desc= "A sliver of supermatter placed upon a robotically enhanced pedestal." - icon = 'icons/mob/simple/smspider.dmi' - icon_state = "smspider" - icon_living = "smspider" - icon_dead = "smspider_dead" - gender = NEUTER - mob_biotypes = MOB_BUG|MOB_ROBOTIC - turns_per_move = 2 - speak_emote = list("vibrates") - emote_see = list("vibrates") - emote_taunt = list("vibrates") - taunt_chance = 40 - combat_mode = TRUE - maxHealth = 10 - health = 10 - minbodytemp = 0 - maxbodytemp = 1500 - healable = 0 - attack_verb_continuous = "slices" - attack_verb_simple = "slice" - attack_sound = 'sound/effects/supermatter.ogg' - attack_vis_effect = ATTACK_EFFECT_CLAW - 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) - robust_searching = 1 - faction = list(FACTION_HOSTILE) - // Gold, supermatter tinted - lighting_cutoff_red = 30 - lighting_cutoff_green = 30 - lighting_cutoff_blue = 10 - death_message = "falls to the ground, its shard dulling to a miserable grey!" - footstep_type = FOOTSTEP_MOB_CLAW - var/overcharged = FALSE // if true, spider will not die if it dusts a limb - -/mob/living/simple_animal/hostile/smspider/AttackingTarget() - . = ..() - if(isliving(target)) - playsound(get_turf(src), 'sound/effects/supermatter.ogg', 10, TRUE) - visible_message(span_danger("[src] knocks into [target], turning them to dust in a brilliant flash of light!")) - var/mob/living/victim = target - victim.investigate_log("has been dusted by [src].", INVESTIGATE_DEATHS) - victim.dust() - if(!overcharged) - death() - else if(!isturf(target)) - playsound(get_turf(src), 'sound/effects/supermatter.ogg', 10, TRUE) - visible_message(span_danger("[src] knocks into [target], turning it to dust in a brilliant flash of light!")) - qdel(target) - if(!overcharged) - death() - return FALSE - -/mob/living/simple_animal/hostile/smspider/Initialize(mapload) - . = ..() - AddComponent(/datum/component/swarming) - -/mob/living/simple_animal/hostile/smspider/overcharged - name = "overcharged supermatter spider" - desc = "A sliver of overcharged supermatter placed upon a robotically enhanced pedestal. This one seems especially dangerous." - icon_state = "smspideroc" - icon_living = "smspideroc" - maxHealth = 25 - health = 25 - overcharged = TRUE 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 8916696a72a0a..f87e78009a972 100644 --- a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm @@ -73,8 +73,6 @@ var/using_special = FALSE /// Determines whether or not Space Dragon is currently tearing through a wall. var/tearing_wall = 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 @@ -84,12 +82,10 @@ /mob/living/simple_animal/hostile/space_dragon/Initialize(mapload) . = ..() + AddComponent(/datum/component/seethrough_mob) AddElement(/datum/element/simple_flying) add_traits(list(TRAIT_SPACEWALK, TRAIT_FREE_HYPERSPACE_MOVEMENT, TRAIT_NO_FLOATING_ANIM, TRAIT_HEALS_FROM_CARP_RIFTS), INNATE_TRAIT) AddElement(/datum/element/content_barfer) - small_sprite = new - small_sprite.Grant(src) - RegisterSignal(small_sprite, COMSIG_ACTION_TRIGGER, PROC_REF(add_dragon_overlay)) /mob/living/simple_animal/hostile/space_dragon/Login() . = ..() @@ -104,13 +100,26 @@ /mob/living/simple_animal/hostile/space_dragon/Life(seconds_per_tick = SSMOBS_DT, times_fired) . = ..() tiredness = max(tiredness - (0.5 * seconds_per_tick), 0) - for(var/mob/living/consumed_mob in src) - if(consumed_mob.stat == DEAD) - continue - playsound(src, 'sound/effects/splat.ogg', 50, TRUE) - visible_message(span_danger("[src] vomits up [consumed_mob]!")) - consumed_mob.forceMove(loc) - consumed_mob.Paralyze(50) + +/mob/living/simple_animal/hostile/space_dragon/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) + . = ..() + if (isliving(arrived)) + RegisterSignal(arrived, COMSIG_MOB_STATCHANGE, PROC_REF(eaten_stat_changed)) + +/mob/living/simple_animal/hostile/space_dragon/Exited(atom/movable/gone, direction) + . = ..() + if (isliving(gone)) + UnregisterSignal(gone, COMSIG_MOB_STATCHANGE) + +/// Release consumed mobs if they transition from dead to alive +/mob/living/simple_animal/hostile/space_dragon/proc/eaten_stat_changed(mob/living/eaten) + SIGNAL_HANDLER + if (eaten.stat == DEAD) + return + playsound(src, 'sound/effects/splat.ogg', vol = 50, vary = TRUE) + visible_message(span_danger("[src] vomits up [eaten]!")) + eaten.forceMove(loc) + eaten.Paralyze(5 SECONDS) /mob/living/simple_animal/hostile/space_dragon/AttackingTarget() if(using_special) @@ -169,16 +178,11 @@ /mob/living/simple_animal/hostile/space_dragon/death(gibbed) . = ..() add_dragon_overlay() - UnregisterSignal(small_sprite, COMSIG_ACTION_TRIGGER) /mob/living/simple_animal/hostile/space_dragon/revive(full_heal_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE) - var/was_dead = stat == DEAD . = ..() add_dragon_overlay() - if (was_dead) - RegisterSignal(small_sprite, COMSIG_ACTION_TRIGGER, PROC_REF(add_dragon_overlay)) - /** * Allows space dragon to choose its own name. * @@ -221,8 +225,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 @@ -273,6 +275,7 @@ playsound(get_turf(src),'sound/magic/fireball.ogg', 200, TRUE) var/range = 20 var/list/turfs = list() + var/list/hit_list_parameter = list(src) turfs = line_target(0, range, at) var/delayFire = -1.0 for(var/turf/T in turfs) @@ -284,7 +287,7 @@ if(D.density) return delayFire += 1.0 - addtimer(CALLBACK(src, PROC_REF(dragon_fire_line), T), delayFire) + addtimer(CALLBACK(src, PROC_REF(dragon_fire_line), T, hit_list_parameter), delayFire) /** * What occurs on each tile to actually create the fire. @@ -294,10 +297,9 @@ * It can only hit any given target once. * Arguments: * * turf/T - The turf to trigger the effects on. + * * list/hit_list - The list of targets that have already been hit in the fire_stream. */ -/mob/living/simple_animal/hostile/space_dragon/proc/dragon_fire_line(turf/fire_turf) - var/list/hit_list = list() - hit_list += src +/mob/living/simple_animal/hostile/space_dragon/proc/dragon_fire_line(turf/fire_turf, list/hit_list) new /obj/effect/hotspot(fire_turf) fire_turf.hotspot_expose(700,50,1) for(var/mob/living/living_target in fire_turf.contents) @@ -354,6 +356,8 @@ if(A && A.loc != src) playsound(src, 'sound/magic/demon_attack1.ogg', 60, TRUE) visible_message(span_warning("[src] swallows [A] whole!")) + to_chat(src, span_notice("Your acids cleanse the flames off [A] on the way down. Delicious!")) + A.extinguish() A.forceMove(src) return TRUE return FALSE 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 941a7bf4d52fa..c489d6c888d4a 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 @@ -13,7 +13,7 @@ /obj/structure/alien/resin/flower_bud //inheriting basic attack/damage stuff from alien structures name = "flower bud" desc = "A large pulsating plant..." - icon = 'icons/effects/spacevines.dmi' + icon = 'icons/mob/spacevines.dmi' icon_state = "bud0" layer = SPACEVINE_MOB_LAYER plane = GAME_PLANE_UPPER_FOV_HIDDEN @@ -129,7 +129,7 @@ /mob/living/simple_animal/hostile/venus_human_trap name = "venus human trap" desc = "Now you know how the fly feels." - icon = 'icons/effects/spacevines.dmi' + icon = 'icons/mob/spacevines.dmi' icon_state = "venus_human_trap" health_doll_icon = "venus_human_trap" mob_biotypes = MOB_ORGANIC | MOB_PLANT diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index e6ac356f9f35f..75950478edc6b 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -143,7 +143,7 @@ if(stat != DEAD) return - if(HAS_TRAIT(user.mind, TRAIT_NAIVE)) + if(HAS_MIND_TRAIT(user, TRAIT_NAIVE)) . += pick( "It seems tired and shagged out after a long squawk.", "It seems to be pining for the fjords.", @@ -311,7 +311,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( if(parrot_state == PARROT_PERCH) parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched - parrot_interest = user + set_parrot_interest(user) parrot_state = PARROT_SWOOP //The parrot just got hit, it WILL move, now to pick a direction.. if(health > 30) //Let's get in there and squawk it up! @@ -340,7 +340,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched if(user.melee_damage_upper > 0 && !stat) - parrot_interest = user + set_parrot_interest(user) parrot_state = PARROT_SWOOP | PARROT_ATTACK //Attack other animals regardless icon_state = icon_living @@ -351,7 +351,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( if(parrot_state == PARROT_PERCH) parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched - parrot_interest = user + set_parrot_interest(user) parrot_state = PARROT_SWOOP if(health > 30) //Let's get in there and squawk it up! parrot_state |= PARROT_ATTACK @@ -376,7 +376,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( if(parrot_state == PARROT_PERCH) parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched - parrot_interest = null + set_parrot_interest(null) parrot_state = PARROT_WANDER | PARROT_FLEE //Been shot and survived! RUN LIKE HELL! //parrot_been_shot += 5 icon_state = icon_living @@ -471,7 +471,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( speak = newspeak //Search for item to steal - parrot_interest = search_for_item() + set_parrot_interest(search_for_item()) if(parrot_interest) manual_emote("looks in [parrot_interest]'s direction and takes flight.") parrot_state = PARROT_SWOOP | PARROT_STEAL @@ -482,7 +482,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( else if(parrot_state == PARROT_WANDER) //Stop movement, we'll set it later SSmove_manager.stop_looping(src) - parrot_interest = null + set_parrot_interest(null) //Wander around aimlessly. This will help keep the loops from searches down //and possibly move the mob into a new are in view of something they can use @@ -494,7 +494,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( var/atom/movable/AM = search_for_perch_and_item() //This handles checking through lists so we know it's either a perch or stealable item if(AM) if(isitem(AM) || isliving(AM)) //If stealable item - parrot_interest = AM + set_parrot_interest(AM) manual_emote("turns and flies towards [parrot_interest].") parrot_state = PARROT_SWOOP | PARROT_STEAL return @@ -539,7 +539,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( parrot_interest.forceMove(src) visible_message(span_notice("[src] grabs [held_item]!"), span_notice("You grab [held_item]!"), span_hear("You hear the sounds of wings flapping furiously.")) - parrot_interest = null + set_parrot_interest(null) parrot_state = PARROT_SWOOP | PARROT_RETURN return @@ -587,7 +587,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( //If we're attacking a nothing, an object, a turf or a ghost for some stupid reason, switch to wander if(!parrot_interest || !isliving(parrot_interest)) - parrot_interest = null + set_parrot_interest(null) parrot_state = PARROT_WANDER return @@ -601,7 +601,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( //If the mob we've been chasing/attacking dies or falls into crit, check for loot! if(L.stat) - parrot_interest = null + set_parrot_interest(null) if(!held_item) held_item = steal_from_ground() if(!held_item) @@ -625,7 +625,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( //-----STATE MISHAP else //This should not happen. If it does lets reset everything and try again SSmove_manager.stop_looping(src) - parrot_interest = null + set_parrot_interest(null) parrot_perch = null drop_held_item() parrot_state = PARROT_WANDER @@ -635,6 +635,17 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( * Procs */ +/mob/living/simple_animal/parrot/proc/set_parrot_interest(atom/movable/shiny) + if(parrot_interest) + UnregisterSignal(parrot_interest, COMSIG_QDELETING) + parrot_interest = shiny + if(parrot_interest) + RegisterSignal(parrot_interest, COMSIG_QDELETING, PROC_REF(shiny_deleted)) + +/mob/living/simple_animal/parrot/proc/shiny_deleted(datum/source) + SIGNAL_HANDLER + set_parrot_interest(null) + /mob/living/simple_animal/parrot/proc/isStuck() //Check to see if the parrot is stuck due to things like windows or doors or windowdoors if(parrot_lastmove) @@ -908,7 +919,6 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( speak = list("Poly wanna cracker!", ":e Check the crystal, you chucklefucks!",":e Wire the solars, you lazy bums!",":e WHO TOOK THE DAMN MODSUITS?",":e OH GOD ITS ABOUT TO DELAMINATE CALL THE SHUTTLE") gold_core_spawnable = NO_SPAWN speak_chance = 3 - voice_filter = "rubberband=pitch=1.5" var/memory_saved = FALSE var/rounds_survived = 0 @@ -920,6 +930,14 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( ears = new /obj/item/radio/headset/headset_eng(src) if(SStts.tts_enabled) voice = pick(SStts.available_speakers) + if(SStts.pitch_enabled) + if(findtext(voice, "Woman")) + pitch = 12 // up-pitch by one octave + else + pitch = 24 // up-pitch by 2 octaves + else + voice_filter = "rubberband=pitch=1.5" // Use the filter to pitch up if we can't naturally pitch up. + available_channels = list(":e") Read_Memory() if(rounds_survived == longest_survival) @@ -949,6 +967,8 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( ..() /mob/living/simple_animal/parrot/poly/death(gibbed) + if(HAS_TRAIT(src, TRAIT_DONT_WRITE_MEMORY)) + return ..() // Don't read memory either. if(!memory_saved) Write_Memory(TRUE) if(rounds_survived == longest_survival || rounds_survived == longest_deathstreak || prob(0.666)) @@ -957,7 +977,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( mind.transfer_to(G) else G.key = key - ..(gibbed) + return ..() /mob/living/simple_animal/parrot/poly/proc/Read_Memory() if(fexists("data/npc_saves/Poly.sav")) //legacy compatability to convert old format to new @@ -1026,7 +1046,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( /mob/living/simple_animal/parrot/poly/ghost/handle_automated_movement() if(isliving(parrot_interest)) if(!ishuman(parrot_interest)) - parrot_interest = null + set_parrot_interest(null) else if(parrot_state == (PARROT_SWOOP | PARROT_ATTACK) && Adjacent(parrot_interest)) SSmove_manager.move_to(src, parrot_interest, 0, parrot_speed) Possess(parrot_interest) @@ -1039,7 +1059,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( P.parrot = src forceMove(H) H.ForceContractDisease(P, FALSE) - parrot_interest = null + set_parrot_interest(null) H.visible_message(span_danger("[src] dive bombs into [H]'s chest and vanishes!"), span_userdanger("[src] dive bombs into your chest, vanishing! This can't be good!")) #undef PARROT_PERCH diff --git a/code/modules/mob/living/simple_animal/revenant.dm b/code/modules/mob/living/simple_animal/revenant.dm index 97ec1d93a6956..6e2ec11afeac8 100644 --- a/code/modules/mob/living/simple_animal/revenant.dm +++ b/code/modules/mob/living/simple_animal/revenant.dm @@ -3,6 +3,9 @@ //Can hear deadchat, but are NOT normal ghosts and do NOT have x-ray vision //Admin-spawn or random event +/// Source for a trait we get when we're stunned +#define REVENANT_STUNNED_TRAIT "revenant_got_stunned" + /mob/living/simple_animal/revenant name = "revenant" desc = "A malevolent spirit." @@ -19,7 +22,6 @@ health = INFINITY //Revenants don't use health, they use essence instead maxHealth = INFINITY plane = GHOST_PLANE - healable = FALSE sight = SEE_SELF throwforce = 0 @@ -130,6 +132,7 @@ /mob/living/simple_animal/revenant/Life(seconds_per_tick = SSMOBS_DT, times_fired) if(stasis) return + var/delta_time = DELTA_WORLD_TIME(SSmobs) if(revealed && essence <= 0) death() if(unreveal_time && world.time >= unreveal_time) @@ -140,10 +143,10 @@ to_chat(src, span_revenboldnotice("You are once more concealed.")) if(unstun_time && world.time >= unstun_time) unstun_time = 0 - notransform = FALSE + REMOVE_TRAIT(src, TRAIT_NO_TRANSFORM, REVENANT_STUNNED_TRAIT) to_chat(src, span_revenboldnotice("You can move again!")) if(essence_regenerating && !inhibited && essence < essence_regen_cap) //While inhibited, essence will not regenerate - essence = min(essence + (essence_regen_amount * seconds_per_tick), essence_regen_cap) + essence = min(essence + (essence_regen_amount * delta_time), essence_regen_cap) update_mob_action_buttons() //because we update something required by our spells in life, we need to update our buttons update_spooky_icon() update_health_hud() @@ -240,7 +243,7 @@ return stasis = TRUE to_chat(src, span_revendanger("NO! No... it's too late, you can feel your essence [pick("breaking apart", "drifting away")]...")) - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, REVENANT_STUNNED_TRAIT) revealed = TRUE invisibility = 0 playsound(src, 'sound/effects/screech.ogg', 100, TRUE) @@ -283,7 +286,7 @@ return if(time <= 0) return - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, REVENANT_STUNNED_TRAIT) if(!unstun_time) to_chat(src, span_revendanger("You cannot move!")) unstun_time = world.time + time @@ -295,7 +298,7 @@ /mob/living/simple_animal/revenant/proc/update_spooky_icon() if(revealed) - if(notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) if(draining) icon_state = icon_drain else @@ -352,7 +355,7 @@ /mob/living/simple_animal/revenant/proc/death_reset() revealed = FALSE unreveal_time = 0 - notransform = 0 + REMOVE_TRAIT(src, TRAIT_NO_TRANSFORM, REVENANT_STUNNED_TRAIT) unstun_time = 0 inhibited = FALSE draining = FALSE @@ -542,3 +545,4 @@ /datum/objective/revenant_fluff/check_completion() return TRUE +#undef REVENANT_STUNNED_TRAIT diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index 87e6f536cb60d..dbb795e91c569 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -9,7 +9,6 @@ mob_biotypes = MOB_SPIRIT maxHealth = 40 health = 40 - healable = 0 speak_emote = list("hisses") emote_hear = list("wails.","screeches.") response_help_continuous = "puts their hand through" diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index daf1e06cb353c..3b16ab685eb27 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -70,9 +70,6 @@ /// List of weather immunity traits that are then added on Initialize(), see traits.dm. var/list/weather_immunities - ///Healable by medical stacks? Defaults to yes. - var/healable = 1 - ///Atmos effect - Yes, you can make creatures that require plasma or co2 to survive. N2O is a trace gas and handled separately, hence why it isn't here. It'd be hard to add it. Hard and me don't mix (Yes, yes make all the dick jokes you want with that.) - Errorage ///Leaving something at 0 means it's off - has no maximum. var/list/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) @@ -138,7 +135,6 @@ ///If the creature has, and can use, hands. var/dextrous = FALSE - var/dextrous_hud_type = /datum/hud/dextrous ///The Status of our AI, can be set to AI_ON (On, usual processing), AI_IDLE (Will not process, but will return to AI_ON if an enemy comes near), AI_OFF (Off, Not processing ever), AI_Z_OFF (Temporarily off due to nonpresence of players). var/AIStatus = AI_ON @@ -227,7 +223,7 @@ /mob/living/simple_animal/examine(mob/user) . = ..() if(stat == DEAD) - if(HAS_TRAIT(user.mind, TRAIT_NAIVE)) + if(HAS_MIND_TRAIT(user, TRAIT_NAIVE)) . += span_deadsay("Upon closer examination, [p_they()] appear[p_s()] to be asleep.") else . += span_deadsay("Upon closer examination, [p_they()] appear[p_s()] to be dead.") @@ -251,6 +247,8 @@ * Reduces the stamina loss by stamina_recovery */ /mob/living/simple_animal/update_stamina() + if(damage_coeff[STAMINA] <= 0) //we shouldn't reset our speed to its initial value if we don't need to, as that can mess with things like mulebot motor wires + return set_varspeed(initial(speed) + (staminaloss * 0.06)) /mob/living/simple_animal/proc/handle_automated_action() @@ -322,10 +320,10 @@ var/turf/open/ST = loc if(ST.air) var/ST_gases = ST.air.gases - ST.air.assert_gases(/datum/gas/oxygen, /datum/gas/nitrogen, /datum/gas/carbon_dioxide, /datum/gas/plasma) + ST.air.assert_gases(/datum/gas/oxygen, /datum/gas/pluoxium, /datum/gas/nitrogen, /datum/gas/carbon_dioxide, /datum/gas/plasma) var/plas = ST_gases[/datum/gas/plasma][MOLES] - var/oxy = ST_gases[/datum/gas/oxygen][MOLES] + var/oxy = ST_gases[/datum/gas/oxygen][MOLES] + (ST_gases[/datum/gas/pluoxium][MOLES] * PLUOXIUM_PROPORTION) var/n2 = ST_gases[/datum/gas/nitrogen][MOLES] var/co2 = ST_gases[/datum/gas/carbon_dioxide][MOLES] @@ -451,21 +449,26 @@ drop_loot() if(dextrous) drop_all_held_items() + if(del_on_death) ..() //Prevent infinite loops if the mob Destroy() is overridden in such //a manner as to cause a call to death() again //Pain del_on_death = FALSE qdel(src) - else - health = 0 - icon_state = icon_dead - if(flip_on_death) - transform = transform.Turn(180) - set_density(FALSE) - ..() + return + + health = 0 + icon_state = icon_dead + if(flip_on_death) + transform = transform.Turn(180) + ADD_TRAIT(src, TRAIT_UNDENSE, BASIC_MOB_DEATH_TRAIT) + return ..() /mob/living/simple_animal/proc/CanAttack(atom/the_target) + if(!isatom(the_target)) // no + stack_trace("Invalid target in CanAttack(): [the_target]") + return FALSE if(see_invisible < the_target.invisibility) return FALSE if(ismob(the_target)) @@ -487,7 +490,7 @@ if(!.) return icon_state = icon_living - set_density(initial(density)) + REMOVE_TRAIT(src, TRAIT_UNDENSE, BASIC_MOB_DEATH_TRAIT) /mob/living/simple_animal/proc/make_babies() // <3 <3 <3 if(gender != FEMALE || stat || next_scan_time > world.time || !childtype || !animal_species || !SSticker.IsRoundInProgress()) diff --git a/code/modules/mob/living/simple_animal/slime/death.dm b/code/modules/mob/living/simple_animal/slime/death.dm index f957b9264a5fd..03cb70cbc47a3 100644 --- a/code/modules/mob/living/simple_animal/slime/death.dm +++ b/code/modules/mob/living/simple_animal/slime/death.dm @@ -21,7 +21,6 @@ if(buckled) Feedstop(silent = TRUE) //releases ourselves from the mob we fed on. - set_stat(DEAD) cut_overlays() return ..(gibbed) diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index ca578f949dfe5..3c34a68d6a26e 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -1,5 +1,5 @@ /mob/living/simple_animal/slime/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if (notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return . = ..() if(!.) @@ -183,7 +183,7 @@ return if(iscarbon(prey)) - prey.adjustCloneLoss(rand(2, 4) * 0.5 * seconds_per_tick) + prey.adjustBruteLoss(rand(2, 4) * 0.5 * seconds_per_tick) prey.adjustToxLoss(rand(1, 2) * 0.5 * seconds_per_tick) if(SPT_PROB(5, seconds_per_tick) && prey.client) @@ -199,8 +199,11 @@ var/mob/living/animal_victim = prey var/totaldamage = 0 //total damage done to this unfortunate animal - totaldamage += animal_victim.adjustCloneLoss(rand(2, 4) * 0.5 * seconds_per_tick) - totaldamage += animal_victim.adjustToxLoss(rand(1, 2) * 0.5 * seconds_per_tick) + var/need_mob_update + need_mob_update = totaldamage += animal_victim.adjustBruteLoss(rand(2, 4) * 0.5 * seconds_per_tick, updating_health = FALSE) + need_mob_update += totaldamage += animal_victim.adjustToxLoss(rand(1, 2) * 0.5 * seconds_per_tick, updating_health = FALSE) + if(need_mob_update) + animal_victim.updatehealth() if(totaldamage <= 0) //if we did no(or negative!) damage to it, stop Feedstop(0, 0) diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm index 61706dfa58bdb..01197efc8edc9 100644 --- a/code/modules/mob/living/simple_animal/slime/powers.dm +++ b/code/modules/mob/living/simple_animal/slime/powers.dm @@ -66,7 +66,7 @@ if(isanimal(meal)) var/mob/living/simple_animal/simple_meal = meal - if(simple_meal.damage_coeff[TOX] <= 0 && simple_meal.damage_coeff[CLONE] <= 0) //The creature wouldn't take any damage, it must be too weird even for us. + if(simple_meal.damage_coeff[TOX] <= 0 && simple_meal.damage_coeff[BRUTE] <= 0) //The creature wouldn't take any damage, it must be too weird even for us. if(silent) return FALSE to_chat(src, "[pick("This subject is incompatible", \ @@ -76,7 +76,7 @@ return FALSE else if(isbasicmob(meal)) var/mob/living/basic/basic_meal = meal - if(basic_meal.damage_coeff[TOX] <= 0 && basic_meal.damage_coeff[CLONE] <= 0) + if(basic_meal.damage_coeff[TOX] <= 0 && basic_meal.damage_coeff[BRUTE] <= 0) if (silent) return FALSE to_chat(src, "[pick("This subject is incompatible", \ @@ -132,6 +132,14 @@ "This subject does not have life energy", "This subject is empty", \ "I am not satisified", "I can not feed from this subject", \ "I do not feel nourished", "This subject is not food")]!") + + var/mob/living/victim = buckled + + if(istype(victim)) + var/bio_protection = 100 - victim.getarmor(null, BIO) + if(prob(bio_protection)) + victim.apply_status_effect(/datum/status_effect/slimed, slime_colours_to_rgb[colour], colour == SLIME_TYPE_RAINBOW) + if(!silent) visible_message(span_warning("[src] lets go of [buckled]!"), \ span_notice("I stopped feeding.")) @@ -192,7 +200,7 @@ for(var/i in 1 to 4) var/child_colour if(mutation_chance >= 100) - child_colour = "rainbow" + child_colour = SLIME_TYPE_RAINBOW else if(prob(mutation_chance)) child_colour = slime_mutation[rand(1,4)] else diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 99c7586c7d780..2bfe51051d387 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -25,7 +25,7 @@ maxHealth = 150 health = 150 - healable = 0 + mob_biotypes = MOB_SLIME melee_damage_lower = 5 melee_damage_upper = 25 @@ -77,33 +77,58 @@ var/static/regex/slime_name_regex = new("\\w+ (baby|adult) slime \\(\\d+\\)") ///////////TIME FOR SUBSPECIES - var/colour = "grey" + var/colour = SLIME_TYPE_GREY var/coretype = /obj/item/slime_extract/grey var/list/slime_mutation[4] var/static/list/slime_colours = list( - "adamantine", - "black", - "blue", - "bluespace", - "cerulean", - "dark blue", - "dark purple", - "gold", - "green", - "grey", - "light pink", - "metal", - "oil", - "orange", - "pink", - "purple", - "pyrite", - "rainbow", - "red", - "sepia", - "silver", - "yellow", + SLIME_TYPE_ADAMANTINE, + SLIME_TYPE_BLACK, + SLIME_TYPE_BLUE, + SLIME_TYPE_BLUESPACE, + SLIME_TYPE_CERULEAN, + SLIME_TYPE_DARK_BLUE, + SLIME_TYPE_DARK_PURPLE, + SLIME_TYPE_GOLD, + SLIME_TYPE_GREEN, + SLIME_TYPE_GREY, + SLIME_TYPE_LIGHT_PINK, + SLIME_TYPE_METAL, + SLIME_TYPE_OIL, + SLIME_TYPE_ORANGE, + SLIME_TYPE_PINK, + SLIME_TYPE_PURPLE, + SLIME_TYPE_PYRITE, + SLIME_TYPE_RAINBOW, + SLIME_TYPE_RED, + SLIME_TYPE_SEPIA, + SLIME_TYPE_SILVER, + SLIME_TYPE_YELLOW, + ) + + var/static/list/slime_colours_to_rgb = list( + SLIME_TYPE_ADAMANTINE = COLOR_SLIME_ADAMANTINE, + SLIME_TYPE_BLACK = COLOR_SLIME_BLACK, + SLIME_TYPE_BLUE = COLOR_SLIME_BLUE, + SLIME_TYPE_BLUESPACE = COLOR_SLIME_BLUESPACE, + SLIME_TYPE_CERULEAN = COLOR_SLIME_CERULEAN, + SLIME_TYPE_DARK_BLUE = COLOR_SLIME_DARK_BLUE, + SLIME_TYPE_DARK_PURPLE = COLOR_SLIME_DARK_PURPLE, + SLIME_TYPE_GOLD = COLOR_SLIME_GOLD, + SLIME_TYPE_GREEN = COLOR_SLIME_GREEN, + SLIME_TYPE_GREY = COLOR_SLIME_GREY, + SLIME_TYPE_LIGHT_PINK = COLOR_SLIME_LIGHT_PINK, + SLIME_TYPE_METAL = COLOR_SLIME_METAL, + SLIME_TYPE_OIL = COLOR_SLIME_OIL, + SLIME_TYPE_ORANGE = COLOR_SLIME_ORANGE, + SLIME_TYPE_PINK = COLOR_SLIME_PINK, + SLIME_TYPE_PURPLE = COLOR_SLIME_PURPLE, + SLIME_TYPE_PYRITE = COLOR_SLIME_PYRITE, + SLIME_TYPE_RAINBOW = COLOR_SLIME_RAINBOW, + SLIME_TYPE_RED = COLOR_SLIME_RED, + SLIME_TYPE_SEPIA = COLOR_SLIME_SEPIA, + SLIME_TYPE_SILVER = COLOR_SLIME_SILVER, + SLIME_TYPE_YELLOW = COLOR_SLIME_YELLOW, ) ///////////CORE-CROSSING CODE diff --git a/code/modules/mob/living/simple_animal/slime/subtypes.dm b/code/modules/mob/living/simple_animal/slime/subtypes.dm index 47d45d71fdcd7..e948de7cd4d2b 100644 --- a/code/modules/mob/living/simple_animal/slime/subtypes.dm +++ b/code/modules/mob/living/simple_animal/slime/subtypes.dm @@ -2,74 +2,74 @@ var/list/slime_mutation_colors[4] switch(colour) //Tier 1 - if("grey") - slime_mutation_colors[1] = "orange" - slime_mutation_colors[2] = "metal" - slime_mutation_colors[3] = "blue" - slime_mutation_colors[4] = "purple" + if(SLIME_TYPE_GREY) + slime_mutation_colors[1] = SLIME_TYPE_ORANGE + slime_mutation_colors[2] = SLIME_TYPE_METAL + slime_mutation_colors[3] = SLIME_TYPE_BLUE + slime_mutation_colors[4] = SLIME_TYPE_PURPLE //Tier 2 - if("purple") - slime_mutation_colors[1] = "dark purple" - slime_mutation_colors[2] = "dark blue" - slime_mutation_colors[3] = "green" - slime_mutation_colors[4] = "green" - if("metal") - slime_mutation_colors[1] = "silver" - slime_mutation_colors[2] = "yellow" - slime_mutation_colors[3] = "gold" - slime_mutation_colors[4] = "gold" - if("orange") - slime_mutation_colors[1] = "dark purple" - slime_mutation_colors[2] = "yellow" - slime_mutation_colors[3] = "red" - slime_mutation_colors[4] = "red" - if("blue") - slime_mutation_colors[1] = "dark blue" - slime_mutation_colors[2] = "silver" - slime_mutation_colors[3] = "pink" - slime_mutation_colors[4] = "pink" + if(SLIME_TYPE_PURPLE) + slime_mutation_colors[1] = SLIME_TYPE_DARK_PURPLE + slime_mutation_colors[2] = SLIME_TYPE_DARK_BLUE + slime_mutation_colors[3] = SLIME_TYPE_GREEN + slime_mutation_colors[4] = SLIME_TYPE_GREEN + if(SLIME_TYPE_METAL) + slime_mutation_colors[1] = SLIME_TYPE_SILVER + slime_mutation_colors[2] = SLIME_TYPE_YELLOW + slime_mutation_colors[3] = SLIME_TYPE_GOLD + slime_mutation_colors[4] = SLIME_TYPE_GOLD + if(SLIME_TYPE_ORANGE) + slime_mutation_colors[1] = SLIME_TYPE_DARK_PURPLE + slime_mutation_colors[2] = SLIME_TYPE_YELLOW + slime_mutation_colors[3] = SLIME_TYPE_RED + slime_mutation_colors[4] = SLIME_TYPE_RED + if(SLIME_TYPE_BLUE) + slime_mutation_colors[1] = SLIME_TYPE_DARK_BLUE + slime_mutation_colors[2] = SLIME_TYPE_SILVER + slime_mutation_colors[3] = SLIME_TYPE_PINK + slime_mutation_colors[4] = SLIME_TYPE_PINK //Tier 3 - if("dark blue") - slime_mutation_colors[1] = "purple" - slime_mutation_colors[2] = "blue" - slime_mutation_colors[3] = "cerulean" - slime_mutation_colors[4] = "cerulean" - if("dark purple") - slime_mutation_colors[1] = "purple" - slime_mutation_colors[2] = "orange" - slime_mutation_colors[3] = "sepia" - slime_mutation_colors[4] = "sepia" - if("yellow") - slime_mutation_colors[1] = "metal" - slime_mutation_colors[2] = "orange" - slime_mutation_colors[3] = "bluespace" - slime_mutation_colors[4] = "bluespace" - if("silver") - slime_mutation_colors[1] = "metal" - slime_mutation_colors[2] = "blue" - slime_mutation_colors[3] = "pyrite" - slime_mutation_colors[4] = "pyrite" + if(SLIME_TYPE_DARK_BLUE) + slime_mutation_colors[1] = SLIME_TYPE_PURPLE + slime_mutation_colors[2] = SLIME_TYPE_BLUE + slime_mutation_colors[3] = SLIME_TYPE_CERULEAN + slime_mutation_colors[4] = SLIME_TYPE_CERULEAN + if(SLIME_TYPE_DARK_PURPLE) + slime_mutation_colors[1] = SLIME_TYPE_PURPLE + slime_mutation_colors[2] = SLIME_TYPE_ORANGE + slime_mutation_colors[3] = SLIME_TYPE_SEPIA + slime_mutation_colors[4] = SLIME_TYPE_SEPIA + if(SLIME_TYPE_YELLOW) + slime_mutation_colors[1] = SLIME_TYPE_METAL + slime_mutation_colors[2] = SLIME_TYPE_ORANGE + slime_mutation_colors[3] = SLIME_TYPE_BLUESPACE + slime_mutation_colors[4] = SLIME_TYPE_BLUESPACE + if(SLIME_TYPE_SILVER) + slime_mutation_colors[1] = SLIME_TYPE_METAL + slime_mutation_colors[2] = SLIME_TYPE_BLUE + slime_mutation_colors[3] = SLIME_TYPE_PYRITE + slime_mutation_colors[4] = SLIME_TYPE_PYRITE //Tier 4 - if("pink") - slime_mutation_colors[1] = "pink" - slime_mutation_colors[2] = "pink" - slime_mutation_colors[3] = "light pink" - slime_mutation_colors[4] = "light pink" - if("red") - slime_mutation_colors[1] = "red" - slime_mutation_colors[2] = "red" - slime_mutation_colors[3] = "oil" - slime_mutation_colors[4] = "oil" - if("gold") - slime_mutation_colors[1] = "gold" - slime_mutation_colors[2] = "gold" - slime_mutation_colors[3] = "adamantine" - slime_mutation_colors[4] = "adamantine" - if("green") - slime_mutation_colors[1] = "green" - slime_mutation_colors[2] = "green" - slime_mutation_colors[3] = "black" - slime_mutation_colors[4] = "black" + if(SLIME_TYPE_PINK) + slime_mutation_colors[1] = SLIME_TYPE_PINK + slime_mutation_colors[2] = SLIME_TYPE_PINK + slime_mutation_colors[3] = SLIME_TYPE_LIGHT_PINK + slime_mutation_colors[4] = SLIME_TYPE_LIGHT_PINK + if(SLIME_TYPE_RED) + slime_mutation_colors[1] = SLIME_TYPE_RED + slime_mutation_colors[2] = SLIME_TYPE_RED + slime_mutation_colors[3] = SLIME_TYPE_OIL + slime_mutation_colors[4] = SLIME_TYPE_OIL + if(SLIME_TYPE_GOLD) + slime_mutation_colors[1] = SLIME_TYPE_GOLD + slime_mutation_colors[2] = SLIME_TYPE_GOLD + slime_mutation_colors[3] = SLIME_TYPE_ADAMANTINE + slime_mutation_colors[4] = SLIME_TYPE_ADAMANTINE + if(SLIME_TYPE_GREEN) + slime_mutation_colors[1] = SLIME_TYPE_GREEN + slime_mutation_colors[2] = SLIME_TYPE_GREEN + slime_mutation_colors[3] = SLIME_TYPE_BLACK + slime_mutation_colors[4] = SLIME_TYPE_BLACK // Tier 5 else slime_mutation_colors[1] = colour diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index c7831346cd632..bbc37911bb17f 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -1,7 +1,33 @@ -//Here are the procs used to modify status effects of a mob. -//The effects include: stun, knockdown, unconscious, sleeping, resting -#define IS_STUN_IMMUNE(source, ignore_canstun) ((source.status_flags & GODMODE) || (!ignore_canstun && (!(source.status_flags & CANKNOCKDOWN) || HAS_TRAIT(source, TRAIT_STUNIMMUNE)))) +/** + * Checks if we have stun immunity. Godmode always passes this check. + * + * * check_flags - bitflag of status flags that must be set in order for the stun to succeed. Passing NONE will always return false. + * * force_stun - whether we ignore stun immunity with the exception of godmode + * + * returns TRUE if stun immune, FALSE otherwise + */ +/mob/living/proc/check_stun_immunity(check_flags = CANSTUN, force_stun = FALSE) + SHOULD_CALL_PARENT(TRUE) + + if(status_flags & GODMODE) + return TRUE + + if(force_stun) // Does not take priority over god mode? I guess + return FALSE + + if(SEND_SIGNAL(src, COMSIG_LIVING_GENERIC_STUN_CHECK, check_flags, force_stun) & COMPONENT_NO_STUN) + return TRUE + + if(HAS_TRAIT(src, TRAIT_STUNIMMUNE)) + return TRUE + + // Do we have the correct flag set to allow this status? + // This checks that ALL flags are set, not just one of them. + if((status_flags & check_flags) == check_flags) + return FALSE + + return TRUE /* STUN */ /mob/living/proc/IsStun() //If we're stunned @@ -16,9 +42,7 @@ /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(absorb_stun(amount, ignore_canstun)) + if(check_stun_immunity(CANSTUN, ignore_canstun)) return var/datum/status_effect/incapacitating/stun/S = IsStun() if(S) @@ -30,15 +54,13 @@ /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)) + if(check_stun_immunity(CANSTUN, ignore_canstun)) return var/datum/status_effect/incapacitating/stun/S = IsStun() if(amount <= 0) if(S) qdel(S) else - if(absorb_stun(amount, ignore_canstun)) - return if(S) S.duration = world.time + amount else @@ -48,9 +70,7 @@ /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(absorb_stun(amount, ignore_canstun)) + if(check_stun_immunity(CANSTUN, ignore_canstun)) return var/datum/status_effect/incapacitating/stun/S = IsStun() if(S) @@ -72,9 +92,7 @@ /mob/living/proc/Knockdown(amount, ignore_canstun = FALSE) //Can't go below 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(absorb_stun(amount, ignore_canstun)) + if(check_stun_immunity(CANKNOCKDOWN, ignore_canstun)) return var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown() if(K) @@ -86,15 +104,13 @@ /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)) + if(check_stun_immunity(CANKNOCKDOWN, ignore_canstun)) return var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown() if(amount <= 0) if(K) qdel(K) else - if(absorb_stun(amount, ignore_canstun)) - return if(K) K.duration = world.time + amount else @@ -104,9 +120,7 @@ /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(absorb_stun(amount, ignore_canstun)) + if(check_stun_immunity(CANKNOCKDOWN, ignore_canstun)) return var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown() if(K) @@ -128,9 +142,7 @@ /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(absorb_stun(amount, ignore_canstun)) + if(check_stun_immunity(CANSTUN, ignore_canstun)) return var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized() if(I) @@ -142,15 +154,13 @@ /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)) + if(check_stun_immunity(CANSTUN, ignore_canstun)) return var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized() if(amount <= 0) if(I) qdel(I) else - if(absorb_stun(amount, ignore_canstun)) - return if(I) I.duration = world.time + amount else @@ -160,9 +170,7 @@ /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(absorb_stun(amount, ignore_canstun)) + if(check_stun_immunity(CANSTUN, ignore_canstun)) return var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized() if(I) @@ -184,9 +192,7 @@ /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(absorb_stun(amount, ignore_canstun)) + if(check_stun_immunity(CANSTUN|CANKNOCKDOWN, ignore_canstun)) // this requires both can stun and can knockdown return var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE) if(P) @@ -198,15 +204,13 @@ /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)) + if(check_stun_immunity(CANSTUN|CANKNOCKDOWN, ignore_canstun)) return var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE) if(amount <= 0) if(P) qdel(P) else - if(absorb_stun(amount, ignore_canstun)) - return if(P) P.duration = world.time + amount else @@ -216,9 +220,7 @@ /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(absorb_stun(amount, ignore_canstun)) + if(check_stun_immunity(CANSTUN|CANKNOCKDOWN, ignore_canstun)) return var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE) if(P) @@ -244,9 +246,9 @@ * * ignore_canstun - If TRUE, the mob's resistance to stuns is ignored. */ /mob/living/proc/incapacitate(amount, ignore_canstun = FALSE) - if(IS_STUN_IMMUNE(src, ignore_canstun)) + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_INCAPACITATE, amount, ignore_canstun) & COMPONENT_NO_STUN) return - if(absorb_stun(amount, ignore_canstun)) + if(check_stun_immunity(CANSTUN, ignore_canstun)) return var/datum/status_effect/incapacitating/incapacitated/incapacitated_status_effect = has_status_effect(/datum/status_effect/incapacitating/incapacitated) if(incapacitated_status_effect) @@ -262,15 +264,15 @@ * * ignore_canstun - If TRUE, the mob's resistance to stuns is ignored. */ /mob/living/proc/set_incapacitated(amount, ignore_canstun = FALSE) - if(IS_STUN_IMMUNE(src, ignore_canstun)) + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_INCAPACITATE, amount, ignore_canstun) & COMPONENT_NO_STUN) + return + if(check_stun_immunity(CANSTUN, ignore_canstun)) return var/datum/status_effect/incapacitating/incapacitated/incapacitated_status_effect = has_status_effect(/datum/status_effect/incapacitating/incapacitated) if(amount <= 0) if(incapacitated_status_effect) qdel(incapacitated_status_effect) else - if(absorb_stun(amount, ignore_canstun)) - return if(incapacitated_status_effect) incapacitated_status_effect.duration = world.time + amount else @@ -284,9 +286,9 @@ * * ignore_canstun - If TRUE, the mob's resistance to stuns is ignored. */ /mob/living/proc/adjust_incapacitated(amount, ignore_canstun = FALSE) //Adds to remaining duration - if(IS_STUN_IMMUNE(src, ignore_canstun)) + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_INCAPACITATE, amount, ignore_canstun) & COMPONENT_NO_STUN) return - if(absorb_stun(amount, ignore_canstun)) + if(check_stun_immunity(CANSTUN, ignore_canstun)) return var/datum/status_effect/incapacitating/incapacitated/incapacitated_status_effect = has_status_effect(/datum/status_effect/incapacitating/incapacitated) if(incapacitated_status_effect) @@ -330,7 +332,7 @@ /mob/living/proc/Unconscious(amount, ignore_canstun = FALSE) //Can't go below remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_UNCONSCIOUS, amount, ignore_canstun) & COMPONENT_NO_STUN) return - if(IS_STUN_IMMUNE(src, ignore_canstun)) + if(check_stun_immunity(CANUNCONSCIOUS, ignore_canstun)) return var/datum/status_effect/incapacitating/unconscious/U = IsUnconscious() if(U) @@ -342,7 +344,7 @@ /mob/living/proc/SetUnconscious(amount, ignore_canstun = FALSE) //Sets remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_UNCONSCIOUS, amount, ignore_canstun) & COMPONENT_NO_STUN) return - if(IS_STUN_IMMUNE(src, ignore_canstun)) + if(check_stun_immunity(CANUNCONSCIOUS, ignore_canstun)) return var/datum/status_effect/incapacitating/unconscious/U = IsUnconscious() if(amount <= 0) @@ -357,7 +359,7 @@ /mob/living/proc/AdjustUnconscious(amount, ignore_canstun = FALSE) //Adds to remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_UNCONSCIOUS, amount, ignore_canstun) & COMPONENT_NO_STUN) return - if(IS_STUN_IMMUNE(src, ignore_canstun)) + if(check_stun_immunity(CANUNCONSCIOUS, ignore_canstun)) return var/datum/status_effect/incapacitating/unconscious/U = IsUnconscious() if(U) @@ -445,49 +447,11 @@ /mob/living/proc/IsFrozen() return has_status_effect(/datum/status_effect/freon) - -/* STUN ABSORPTION*/ -/mob/living/proc/add_stun_absorption(key, duration, priority, message, self_message, examine_message) -//adds a stun absorption with a key, a duration in deciseconds, its priority, and the messages it makes when you're stun/examined, if any - if(!islist(stun_absorption)) - stun_absorption = list() - if(stun_absorption[key]) - stun_absorption[key]["end_time"] = world.time + duration - stun_absorption[key]["priority"] = priority - stun_absorption[key]["stuns_absorbed"] = 0 - else - stun_absorption[key] = list("end_time" = world.time + duration, "priority" = priority, "stuns_absorbed" = 0, \ - "visible_message" = message, "self_message" = self_message, "examine_message" = examine_message) - -/mob/living/proc/absorb_stun(amount, ignoring_flag_presence) - if(amount < 0 || stat || ignoring_flag_presence || !islist(stun_absorption)) - return FALSE - if(!amount) - amount = 0 - var/priority_absorb_key - var/highest_priority - for(var/i in stun_absorption) - if(stun_absorption[i]["end_time"] > world.time && (!priority_absorb_key || stun_absorption[i]["priority"] > highest_priority)) - priority_absorb_key = stun_absorption[i] - highest_priority = priority_absorb_key["priority"] - if(priority_absorb_key) - if(amount) //don't spam up the chat for continuous stuns - if(priority_absorb_key["visible_message"] || priority_absorb_key["self_message"]) - if(priority_absorb_key["visible_message"] && priority_absorb_key["self_message"]) - visible_message(span_warning("[src][priority_absorb_key["visible_message"]]"), span_boldwarning("[priority_absorb_key["self_message"]]")) - else if(priority_absorb_key["visible_message"]) - visible_message(span_warning("[src][priority_absorb_key["visible_message"]]")) - else if(priority_absorb_key["self_message"]) - to_chat(src, span_boldwarning("[priority_absorb_key["self_message"]]")) - priority_absorb_key["stuns_absorbed"] += amount - return TRUE - /** * 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) @@ -549,17 +513,16 @@ /mob/living/proc/cure_fakedeath(source) remove_traits(list(TRAIT_FAKEDEATH, TRAIT_DEATHCOMA), source) if(stat != DEAD) - tod = null + station_timestamp_timeofdeath = null /// Induces fake death on a living mob. /mob/living/proc/fakedeath(source, silent = FALSE) - if(stat == DEAD) - return - if(!silent) - emote("deathgasp") - add_traits(list(TRAIT_FAKEDEATH, TRAIT_DEATHCOMA), source) - tod = station_time_timestamp() + if(stat != DEAD) + if(!silent) + emote("deathgasp") + station_timestamp_timeofdeath = station_time_timestamp() + add_traits(list(TRAIT_FAKEDEATH, TRAIT_DEATHCOMA), source) ///Unignores all slowdowns that lack the IGNORE_NOSLOW flag. /mob/living/proc/unignore_slowdown(source) @@ -758,6 +721,4 @@ /// Helper to check if we seem to be alive or not /mob/living/proc/appears_alive() - return health >= 0 && !HAS_TRAIT(src, TRAIT_FAKEDEATH) - -#undef IS_STUN_IMMUNE + return stat != DEAD && !HAS_TRAIT(src, TRAIT_FAKEDEATH) diff --git a/code/modules/mob/living/taste.dm b/code/modules/mob/living/taste.dm index fc8fcbb371762..8f414a2e603e0 100644 --- a/code/modules/mob/living/taste.dm +++ b/code/modules/mob/living/taste.dm @@ -21,12 +21,14 @@ // carbons without tongues normally have TRAIT_AGEUSIA but sensible fallback . = DEFAULT_TASTE_SENSITIVITY -// non destructively tastes a reagent container +/** + * Non destructively tastes a reagent container + * and gives feedback to the user. + **/ /mob/living/proc/taste(datum/reagents/from) if(HAS_TRAIT(src, TRAIT_AGEUSIA)) return - if(last_taste_time + 50 < world.time) var/taste_sensitivity = get_taste_sensitivity() var/text_output = from.generate_taste_message(src, taste_sensitivity) @@ -43,4 +45,70 @@ last_taste_time = world.time last_taste_text = text_output +/** + * Gets food flags that this mob likes + **/ +/mob/living/proc/get_liked_foodtypes() + return NONE + +/mob/living/carbon/get_liked_foodtypes() + var/obj/item/organ/internal/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE) + // No tongue, no tastin' + if(!tongue?.sense_of_taste || HAS_TRAIT(src, TRAIT_AGEUSIA)) + return NONE + return tongue.liked_foodtypes + +/** + * Gets food flags that this mob dislikes + **/ +/mob/living/proc/get_disliked_foodtypes() + return NONE + +/mob/living/carbon/get_disliked_foodtypes() + var/obj/item/organ/internal/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE) + // No tongue, no tastin' + if(!tongue?.sense_of_taste || HAS_TRAIT(src, TRAIT_AGEUSIA)) + return NONE + return tongue.disliked_foodtypes + +/** + * Gets food flags that this mob hates + * Toxic food is the only category that ignores ageusia, KEEP IT LIKE THAT! + **/ +/mob/living/proc/get_toxic_foodtypes() + return TOXIC + +/mob/living/carbon/get_toxic_foodtypes() + var/obj/item/organ/internal/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE) + // No tongue, no tastin' + if(!tongue) + return TOXIC + return tongue.toxic_foodtypes + +/** + * Gets the food reaction a mob would normally have from the given food item, + * assuming that no check_liked callback was used in the edible component. + * + * Does not get called if the owner has ageusia. + **/ +/mob/living/proc/get_food_taste_reaction(obj/item/food, foodtypes) + var/food_taste_reaction + if(foodtypes & get_toxic_foodtypes()) + food_taste_reaction = FOOD_TOXIC + else if(foodtypes & get_disliked_foodtypes()) + food_taste_reaction = FOOD_DISLIKED + else if(foodtypes & get_liked_foodtypes()) + food_taste_reaction = FOOD_LIKED + return food_taste_reaction + +/mob/living/carbon/get_food_taste_reaction(obj/item/food, foodtypes) + var/obj/item/organ/internal/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE) + // No tongue, no tastin' + if(!tongue?.sense_of_taste || HAS_TRAIT(src, TRAIT_AGEUSIA)) + // i hate that i have to do this, but we want to ensure toxic food is still BAD + if(foodtypes & get_toxic_foodtypes()) + return FOOD_TOXIC + return + return tongue.get_food_taste_reaction(food, foodtypes) + #undef DEFAULT_TASTE_SENSITIVITY diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 66542714c70c8..c5a6fd74e7251 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -424,17 +424,19 @@ * unset redraw_mob to prevent the mob icons from being redrawn at the end. * * Initial is used to indicate whether or not this is the initial equipment (job datums etc) or just a player doing it + * + * set indirect_action to allow insertions into "soft" locked objects, things that are easily opened by the owning mob */ -/mob/proc/equip_to_slot_if_possible(obj/item/W, slot, qdel_on_fail = FALSE, disable_warning = FALSE, redraw_mob = TRUE, bypass_equip_delay_self = FALSE, initial = FALSE) +/mob/proc/equip_to_slot_if_possible(obj/item/W, slot, qdel_on_fail = FALSE, disable_warning = FALSE, redraw_mob = TRUE, bypass_equip_delay_self = FALSE, initial = FALSE, indirect_action = FALSE) if(!istype(W) || QDELETED(W)) //This qdeleted is to prevent stupid behavior with things that qdel during init, like say stacks return FALSE - if(!W.mob_can_equip(src, slot, disable_warning, bypass_equip_delay_self)) + if(!W.mob_can_equip(src, slot, disable_warning, bypass_equip_delay_self, indirect_action = indirect_action)) if(qdel_on_fail) qdel(W) else if(!disable_warning) to_chat(src, span_warning("You are unable to equip that!")) return FALSE - equip_to_slot(W, slot, initial, redraw_mob) //This proc should not ever fail. + equip_to_slot(W, slot, initial, redraw_mob, indirect_action = indirect_action) //This proc should not ever fail. return TRUE /** @@ -445,7 +447,7 @@ * *In most cases you will want to use equip_to_slot_if_possible() */ -/mob/proc/equip_to_slot(obj/item/W, slot) +/mob/proc/equip_to_slot(obj/item/equipping, slot, initial = FALSE, redraw_mob = FALSE, indirect_action = FALSE) return /** @@ -456,9 +458,10 @@ * * Also bypasses equip delay checks, since the mob isn't actually putting it on. * Initial is used to indicate whether or not this is the initial equipment (job datums etc) or just a player doing it + * set indirect_action to allow insertions into "soft" locked objects, things that are easily opened by the owning mob */ -/mob/proc/equip_to_slot_or_del(obj/item/W, slot, initial = FALSE) - return equip_to_slot_if_possible(W, slot, TRUE, TRUE, FALSE, TRUE, initial) +/mob/proc/equip_to_slot_or_del(obj/item/W, slot, initial = FALSE, indirect_action = FALSE) + return equip_to_slot_if_possible(W, slot, TRUE, TRUE, FALSE, TRUE, initial, indirect_action) /** * Auto equip the passed in item the appropriate slot based on equipment priority @@ -467,7 +470,7 @@ * * returns 0 if it cannot, 1 if successful */ -/mob/proc/equip_to_appropriate_slot(obj/item/W, qdel_on_fail = FALSE) +/mob/proc/equip_to_appropriate_slot(obj/item/W, qdel_on_fail = FALSE, indirect_action = FALSE) if(!istype(W)) return FALSE var/slot_priority = W.slot_equipment_priority @@ -485,7 +488,7 @@ ) for(var/slot in slot_priority) - if(equip_to_slot_if_possible(W, slot, FALSE, TRUE, TRUE, FALSE, FALSE)) //qdel_on_fail = FALSE; disable_warning = TRUE; redraw_mob = TRUE; + if(equip_to_slot_if_possible(W, slot, disable_warning = TRUE, redraw_mob = TRUE, indirect_action = indirect_action)) return TRUE if(qdel_on_fail) @@ -557,7 +560,7 @@ if(is_blind()) //blind people see things differently (through touch) if(!blind_examine_check(examinify)) return - else if(!(examine_turf.luminosity || examine_turf.dynamic_lumcount) && \ + else if(examine_turf && !(examine_turf.luminosity || examine_turf.dynamic_lumcount) && \ get_dist(src, examine_turf) > 1 && \ !has_nightvision()) // If you aren't blind, it's in darkness (that you can't see) and farther then next to you return @@ -612,7 +615,7 @@ //you can only initiate exaimines if you have a hand, it's not disabled, and only as many examines as you have hands /// our active hand, to check if it's disabled/detatched var/obj/item/bodypart/active_hand = has_active_hand()? get_active_hand() : null - if(!active_hand || active_hand.bodypart_disabled || LAZYLEN(do_afters) >= usable_hands) + if(!active_hand || active_hand.bodypart_disabled || do_after_count() >= usable_hands) to_chat(src, span_warning("You don't have a free hand to examine this!")) return FALSE @@ -765,18 +768,26 @@ * * This sends you back to the lobby creating a new dead mob * - * Only works if flag/norespawn is allowed in config + * Only works if flag/allow_respawn is allowed in config */ /mob/verb/abandon_mob() set name = "Respawn" set category = "OOC" - if (CONFIG_GET(flag/norespawn)) - if (!check_rights_for(usr.client, R_ADMIN)) - to_chat(usr, span_boldnotice("Respawning is not enabled!")) - return - else if (tgui_alert(usr, "Respawning is currently disabled, do you want to use your permissions to circumvent it?", "Respawn", list("Yes", "No")) != "Yes") - return + switch(CONFIG_GET(flag/allow_respawn)) + if(RESPAWN_FLAG_NEW_CHARACTER) + if(tgui_alert(usr, "Note, respawning is only allowed as another character. If you don't have another free slot you may not be able to respawn.", "Respawn", list("Ok", "Nevermind")) != "Ok") + return + + if(RESPAWN_FLAG_FREE) + pass() // Normal respawn + + if(RESPAWN_FLAG_DISABLED) + if (!check_rights_for(usr.client, R_ADMIN)) + to_chat(usr, span_boldnotice("Respawning is not enabled!")) + return + if (tgui_alert(usr, "Respawning is currently disabled, do you want to use your permissions to circumvent it?", "Respawn", list("Yes", "No")) != "Yes") + return if (stat != DEAD) to_chat(usr, span_boldnotice("You must be dead to use this!")) @@ -806,15 +817,14 @@ M.key = key +/// Checks if the mob can respawn yet according to the respawn delay /mob/proc/check_respawn_delay(override_delay = 0) if(!override_delay && !CONFIG_GET(number/respawn_delay)) return TRUE var/death_time = world.time - client.player_details.time_of_death - var/required_delay = override_delay - if(!required_delay) - required_delay = CONFIG_GET(number/respawn_delay) + var/required_delay = override_delay || CONFIG_GET(number/respawn_delay) if(death_time < required_delay) if(!check_rights_for(usr.client, R_ADMIN)) @@ -976,16 +986,65 @@ if(casted_magic_flags == NONE) // magic with the NONE flag is immune to blocking return FALSE - var/list/protection_was_used = list() // this is a janky way of interrupting signals using lists - var/is_magic_blocked = SEND_SIGNAL(src, COMSIG_MOB_RECEIVE_MAGIC, casted_magic_flags, charge_cost, protection_was_used) & COMPONENT_MAGIC_BLOCKED + // A list of all things which are providing anti-magic to us + var/list/antimagic_sources = list() + var/is_magic_blocked = FALSE - if(casted_magic_flags && HAS_TRAIT(src, TRAIT_ANTIMAGIC)) + if(SEND_SIGNAL(src, COMSIG_MOB_RECEIVE_MAGIC, casted_magic_flags, charge_cost, antimagic_sources) & COMPONENT_MAGIC_BLOCKED) + is_magic_blocked = TRUE + if(HAS_TRAIT(src, TRAIT_ANTIMAGIC)) is_magic_blocked = TRUE if((casted_magic_flags & MAGIC_RESISTANCE_HOLY) && HAS_TRAIT(src, TRAIT_HOLY)) is_magic_blocked = TRUE + if(is_magic_blocked && charge_cost > 0 && !HAS_TRAIT(src, TRAIT_RECENTLY_BLOCKED_MAGIC)) + on_block_magic_effects(casted_magic_flags, antimagic_sources) + return is_magic_blocked +/// Called whenever a magic effect with a charge cost is blocked and we haven't recently blocked magic. +/mob/proc/on_block_magic_effects(magic_flags, list/antimagic_sources) + return + +/mob/living/on_block_magic_effects(magic_flags, list/antimagic_sources) + ADD_TRAIT(src, TRAIT_RECENTLY_BLOCKED_MAGIC, MAGIC_TRAIT) + addtimer(TRAIT_CALLBACK_REMOVE(src, TRAIT_RECENTLY_BLOCKED_MAGIC, MAGIC_TRAIT), 6 SECONDS) + + var/mutable_appearance/antimagic_effect + var/antimagic_color + var/atom/antimagic_source = length(antimagic_sources) ? pick(antimagic_sources) : src + + if(magic_flags & MAGIC_RESISTANCE) + visible_message( + span_warning("[src] pulses red as [ismob(antimagic_source) ? p_they() : antimagic_source] absorbs magic energy!"), + span_userdanger("An intense magical aura pulses around [ismob(antimagic_source) ? "you" : antimagic_source] as it dissipates into the air!"), + ) + antimagic_effect = mutable_appearance('icons/effects/effects.dmi', "shield-red", MOB_SHIELD_LAYER) + antimagic_color = LIGHT_COLOR_BLOOD_MAGIC + playsound(src, 'sound/magic/magic_block.ogg', 50, TRUE) + + else if(magic_flags & MAGIC_RESISTANCE_HOLY) + visible_message( + span_warning("[src] starts to glow as [ismob(antimagic_source) ? p_they() : antimagic_source] emits a halo of light!"), + span_userdanger("A feeling of warmth washes over [ismob(antimagic_source) ? "you" : antimagic_source] as rays of light surround your body and protect you!"), + ) + antimagic_effect = mutable_appearance('icons/mob/effects/genetics.dmi', "servitude", -MUTATIONS_LAYER) + antimagic_color = LIGHT_COLOR_HOLY_MAGIC + playsound(src, 'sound/magic/magic_block_holy.ogg', 50, TRUE) + + else if(magic_flags & MAGIC_RESISTANCE_MIND) + visible_message( + span_warning("[src] forehead shines as [ismob(antimagic_source) ? p_they() : antimagic_source] repulses magic from their mind!"), + span_userdanger("A feeling of cold splashes on [ismob(antimagic_source) ? "you" : antimagic_source] as your forehead reflects magic usering your mind!"), + ) + antimagic_effect = mutable_appearance('icons/mob/effects/genetics.dmi', "telekinesishead", MOB_SHIELD_LAYER) + antimagic_color = LIGHT_COLOR_DARK_BLUE + playsound(src, 'sound/magic/magic_block_mind.ogg', 50, TRUE) + + mob_light(range = 2, color = antimagic_color, duration = 5 SECONDS) + add_overlay(antimagic_effect) + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, cut_overlay), antimagic_effect), 5 SECONDS) + /** * Buckle a living mob to this mob. Also turns you to face the other mob * @@ -1166,7 +1225,7 @@ else if( search_pda && istype(A, /obj/item/modular_computer/pda) ) var/obj/item/modular_computer/pda/PDA = A if(PDA.saved_identification == oldname) - PDA.saved_identification = newname + PDA.imprint_id(name = newname) PDA.UpdateDisplay() if(!search_id) break @@ -1231,13 +1290,19 @@ * Proc that returns TRUE if the mob can write using the writing_instrument, FALSE otherwise. * * This proc a side effect, outputting a message to the mob's chat with a reason if it returns FALSE. + * Unless silent_if_not_writing_tool is TRUE. In that case it'll be silent if it isn't a writing implement/tool/instrument w/e. */ -/mob/proc/can_write(obj/item/writing_instrument) - if(!istype(writing_instrument)) - to_chat(src, span_warning("You can't write with the [writing_instrument]!")) +/mob/proc/can_write(obj/item/writing_instrument, silent_if_not_writing_tool = FALSE) + if(!writing_instrument) return FALSE - if(HAS_TRAIT(src, TRAIT_MIMING) && !istype(writing_instrument, /obj/item/toy/crayon/mime)) + var/pen_info = writing_instrument.get_writing_implement_details() + if(!pen_info || (pen_info["interaction_mode"] != MODE_WRITING)) + if(!silent_if_not_writing_tool) + to_chat(src, span_warning("You can't write with the [writing_instrument]!")) + return FALSE + + if(HAS_MIND_TRAIT(src, TRAIT_MIMING) && !istype(writing_instrument, /obj/item/toy/crayon/mime)) to_chat(src, span_warning("Your vow of silence is preventing you from talking with text.")) return FALSE @@ -1249,11 +1314,6 @@ to_chat(src, span_warning("It's too dark in here to write anything!")) return FALSE - var/pen_info = writing_instrument.get_writing_implement_details() - if(!pen_info || (pen_info["interaction_mode"] != MODE_WRITING)) - to_chat(src, span_warning("You can't write with the [writing_instrument]!")) - return FALSE - if(has_gravity()) return TRUE @@ -1305,8 +1365,11 @@ . = ..() VV_DROPDOWN_OPTION("", "---------") VV_DROPDOWN_OPTION(VV_HK_GIB, "Gib") + VV_DROPDOWN_OPTION(VV_HK_REMOVE_SPELL, "Remove Spell") VV_DROPDOWN_OPTION(VV_HK_GIVE_SPELL, "Give Spell") VV_DROPDOWN_OPTION(VV_HK_REMOVE_SPELL, "Remove Spell") + VV_DROPDOWN_OPTION(VV_HK_GIVE_MOB_ACTION, "Give Mob Ability") + VV_DROPDOWN_OPTION(VV_HK_REMOVE_MOB_ACTION, "Remove Mob Ability") VV_DROPDOWN_OPTION(VV_HK_GIVE_DISEASE, "Give Disease") VV_DROPDOWN_OPTION(VV_HK_GODMODE, "Toggle Godmode") VV_DROPDOWN_OPTION(VV_HK_DROP_ALL, "Drop Everything") @@ -1332,6 +1395,14 @@ if(!check_rights(R_ADMIN)) return usr.client.cmd_admin_godmode(src) + if(href_list[VV_HK_GIVE_MOB_ACTION]) + if(!check_rights(NONE)) + return + usr.client.give_mob_action(src) + if(href_list[VV_HK_REMOVE_MOB_ACTION]) + if(!check_rights(NONE)) + return + usr.client.remove_mob_action(src) if(href_list[VV_HK_GIVE_SPELL]) if(!check_rights(NONE)) return @@ -1386,12 +1457,11 @@ fully_replace_character_name(real_name, new_name) ///Show the language menu for this mob -/mob/verb/open_language_menu() +/mob/verb/open_language_menu_verb() set name = "Open Language Menu" set category = "IC" - var/datum/language_holder/H = get_language_holder() - H.open_language_menu(usr) + get_language_holder().open_language_menu(usr) ///Adjust the nutrition of a mob /mob/proc/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 @@ -1403,6 +1473,8 @@ /mob/proc/update_equipment_speed_mods() var/speedies = equipped_speed_mods() + if(speedies > 0 && HAS_TRAIT(src, TRAIT_SETTLER)) //if our movespeed mod is in the negatives, we don't modify it since that's a benefit + speedies *= 0.2 if(!speedies) remove_movespeed_modifier(/datum/movespeed_modifier/equipment_speedmod) else @@ -1422,6 +1494,11 @@ stat = new_stat SEND_SIGNAL(src, COMSIG_MOB_STATCHANGE, new_stat, .) +/// Proc used for custom metabolization of reagents, if any +/mob/proc/reagent_check(datum/reagent/chem, seconds_per_tick, times_fired) + SHOULD_CALL_PARENT(TRUE) + return SEND_SIGNAL(src, COMSIG_MOB_REAGENT_CHECK, chem, seconds_per_tick, times_fired) + /mob/vv_edit_var(var_name, var_value) switch(var_name) if(NAMEOF(src, control_object)) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 98def7110938c..12905700318f3 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -59,9 +59,6 @@ var/cached_multiplicative_actions_slowdown /// List of action hud items the user has var/list/datum/action/actions - /// 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' @@ -87,14 +84,6 @@ /// Tick time the mob can next move var/next_move = null - /** - * Magic var that stops you moving and interacting with anything - * - * Set when you're being turned into something else and also used in a bunch of places - * it probably shouldn't really be - */ - var/notransform = null //Carbon - /// What is the mobs real name (name is overridden for disguises etc) var/real_name = null @@ -120,9 +109,6 @@ /// How many ticks this mob has been over reating var/overeatduration = 0 // How long this guy is overeating //Carbon - /// The movement intent of the mob (run/wal) - var/m_intent = MOVE_INTENT_RUN//Living - /// The last known IP of the client who was in this mob var/lastKnownIP = null diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 1be76be1f350d..c80a9504b36d5 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -207,25 +207,38 @@ return "" // moved out of admins.dm because things other than admin procs were calling this. -/// Returns TRUE if the game has started and we're either an AI with a 0th law, or we're someone with a special role/antag datum -/proc/is_special_character(mob/M) +/** + * Returns TRUE if the game has started and we're either an AI with a 0th law, or we're someone with a special role/antag datum + * If allow_fake_antags is set to FALSE, Valentines, ERTs, and any such roles with FLAG_FAKE_ANTAG won't pass. +*/ +/proc/is_special_character(mob/M, allow_fake_antags = FALSE) if(!SSticker.HasRoundStarted()) return FALSE if(!istype(M)) return FALSE if(iscyborg(M)) //as a borg you're now beholden to your laws rather than greentext return FALSE + + + // Returns TRUE if AI has a zeroth law *and* either has a special role *or* an antag datum. if(isAI(M)) var/mob/living/silicon/ai/A = M return (A.laws?.zeroth && (A.mind?.special_role || !isnull(M.mind?.antag_datums))) - if(M.mind?.special_role || !isnull(M.mind?.antag_datums)) //they have an antag datum! - return TRUE - return FALSE + if(M.mind?.special_role) + return TRUE -/mob/proc/reagent_check(datum/reagent/R, seconds_per_tick, times_fired) // utilized in the species code - return TRUE + // Turns 'faker' to TRUE if the antag datum is fake. If it's not fake, returns TRUE directly. + var/faker = FALSE + for(var/datum/antagonist/antag_datum as anything in M.mind?.antag_datums) + if((antag_datum.antag_flags & FLAG_FAKE_ANTAG)) + faker = TRUE + else + return TRUE + // If 'faker' was assigned TRUE in the above loop and the argument 'allow_fake_antags' is set to TRUE, this passes. + // Else, return FALSE. + return (faker && allow_fake_antags) /** * Fancy notifications for ghosts @@ -277,17 +290,23 @@ alert.target = source if(!alert_overlay) alert_overlay = new(source) + alert_overlay.pixel_x = 0 + alert_overlay.pixel_y = 0 var/icon/size_check = icon(source.icon, source.icon_state) var/scale = 1 var/width = size_check.Width() var/height = size_check.Height() + if(width > world.icon_size) + alert_overlay.pixel_x = -(world.icon_size / 2) * ((width - world.icon_size) / world.icon_size) + if(height > world.icon_size) + alert_overlay.pixel_y = -(world.icon_size / 2) * ((height - world.icon_size) / world.icon_size) if(width > world.icon_size || height > world.icon_size) if(width >= height) scale = world.icon_size / width else scale = world.icon_size / height alert_overlay.transform = alert_overlay.transform.Scale(scale) - alert_overlay.appearance_flags |= TILE_BOUND + alert_overlay.appearance_flags |= TILE_BOUND alert_overlay.layer = FLOAT_LAYER alert_overlay.plane = FLOAT_PLANE alert.add_overlay(alert_overlay) @@ -302,7 +321,7 @@ return FALSE var/brute_damage = brute_heal > burn_heal //changes repair text based on how much brute/burn was supplied if((brute_heal > 0 && affecting.brute_dam > 0) || (burn_heal > 0 && affecting.burn_dam > 0)) - if(affecting.heal_damage(brute_heal, burn_heal, BODYTYPE_ROBOTIC)) + if(affecting.heal_damage(brute_heal, burn_heal, required_bodytype = BODYTYPE_ROBOTIC)) human.update_damage_overlays() user.visible_message(span_notice("[user] fixes some of the [brute_damage ? "dents on" : "burnt wires in"] [human]'s [affecting.name]."), \ span_notice("You fix some of the [brute_damage ? "dents on" : "burnt wires in"] [human == user ? "your" : "[human]'s"] [affecting.name].")) @@ -518,3 +537,33 @@ "[key_name(src)] manually changed selected zone", data, ) + +/** + * Returns an associative list of the logs of a certain amount of lines spoken recently by this mob + * copy_amount - number of lines to return + * line_chance - chance to return a line, if you don't want just the most recent x lines + */ +/mob/proc/copy_recent_speech(copy_amount = LING_ABSORB_RECENT_SPEECH, line_chance = 100) + var/list/recent_speech = list() + var/list/say_log = list() + var/log_source = logging + for(var/log_type in log_source) + var/nlog_type = text2num(log_type) + if(nlog_type & LOG_SAY) + var/list/reversed = log_source[log_type] + if(islist(reversed)) + say_log = reverse_range(reversed.Copy()) + break + + for(var/spoken_memory in say_log) + if(recent_speech.len >= copy_amount) + break + if(!prob(line_chance)) + continue + recent_speech[spoken_memory] = splittext(say_log[spoken_memory], "\"", 1, 0, TRUE)[3] + + var/list/raw_lines = list() + for (var/key as anything in recent_speech) + raw_lines += recent_speech[key] + + return raw_lines diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 1c6a3ef4f6e78..b0b3014f5b1f9 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -74,8 +74,8 @@ return FALSE if(!mob?.loc) return FALSE - if(mob.notransform) - return FALSE //This is sota the goto stop mobs from moving var + if(HAS_TRAIT(mob, TRAIT_NO_TRANSFORM)) + return FALSE //This is sorta the goto stop mobs from moving trait if(mob.control_object) return Move_object(direct) if(!isliving(mob)) @@ -83,7 +83,7 @@ if(mob.stat == DEAD) mob.ghostize() return FALSE - if(SEND_SIGNAL(mob, COMSIG_MOB_CLIENT_PRE_LIVING_MOVE) & COMSIG_MOB_CLIENT_BLOCK_PRE_LIVING_MOVE) + if(SEND_SIGNAL(mob, COMSIG_MOB_CLIENT_PRE_LIVING_MOVE, new_loc, direct) & COMSIG_MOB_CLIENT_BLOCK_PRE_LIVING_MOVE) return FALSE var/mob/living/L = mob //Already checked for isliving earlier @@ -132,6 +132,7 @@ //Basically an optional override for our glide size //Sometimes you want to look like you're moving with a delay you don't actually have yet visual_delay = 0 + var/old_dir = mob.dir . = ..() @@ -153,11 +154,11 @@ // At this point we've moved the client's attached mob. This is one of the only ways to guess that a move was done // as a result of player input and not because they were pulled or any other magic. - SEND_SIGNAL(mob, COMSIG_MOB_CLIENT_MOVED) + SEND_SIGNAL(mob, COMSIG_MOB_CLIENT_MOVED, direct, old_dir) var/atom/movable/P = mob.pulling if(P && !ismob(P) && P.density) - mob.setDir(turn(mob.dir, 180)) + mob.setDir(REVERSE_DIR(mob.dir)) /** * Checks to see if you're being grabbed and if so attempts to break it @@ -293,7 +294,7 @@ // last pushoff exists for one reason // to ensure pushing a mob doesn't just lead to it considering us as backup, and failing last_pushoff = world.time - if(backup.newtonian_move(turn(movement_dir, 180), instant = TRUE)) //You're pushing off something movable, so it moves + if(backup.newtonian_move(REVERSE_DIR(movement_dir), instant = TRUE)) //You're pushing off something movable, so it moves // We set it down here so future calls to Process_Spacemove by the same pair in the same tick don't lead to fucky backup.last_pushoff = world.time to_chat(src, span_info("You push off of [backup] to propel yourself.")) @@ -345,7 +346,7 @@ continue return rebound -/mob/has_gravity() +/mob/has_gravity(turf/gravity_turf) return mob_negates_gravity() || ..() /** @@ -495,22 +496,24 @@ set name = "toggle-walk-run" set hidden = TRUE set instant = TRUE - if(mob) - mob.toggle_move_intent(usr) + if(isliving(mob)) + var/mob/living/user_mob = mob + user_mob.toggle_move_intent(usr) /** * Toggle the move intent of the mob * * triggers an update the move intent hud as well */ -/mob/proc/toggle_move_intent(mob/user) - if(m_intent == MOVE_INTENT_RUN) - m_intent = MOVE_INTENT_WALK +/mob/living/proc/toggle_move_intent(mob/user) + if(move_intent == MOVE_INTENT_RUN) + move_intent = MOVE_INTENT_WALK else - m_intent = MOVE_INTENT_RUN + move_intent = MOVE_INTENT_RUN if(hud_used?.static_inventory) for(var/atom/movable/screen/mov_intent/selector in hud_used.static_inventory) selector.update_appearance() + update_move_intent_slowdown() ///Moves a mob upwards in z level /mob/verb/up() @@ -518,7 +521,7 @@ set category = "IC" var/turf/current_turf = get_turf(src) - var/turf/above_turf = SSmapping.get_turf_above(current_turf) + var/turf/above_turf = GET_TURF_ABOVE(current_turf) var/ventcrawling_flag = HAS_TRAIT(src, TRAIT_MOVE_VENTCRAWLING) ? ZMOVE_VENTCRAWLING : 0 if(!above_turf) @@ -545,7 +548,7 @@ set category = "IC" var/turf/current_turf = get_turf(src) - var/turf/below_turf = SSmapping.get_turf_below(current_turf) + var/turf/below_turf = GET_TURF_BELOW(current_turf) if(!below_turf) to_chat(src, span_warning("There's nowhere to go in that direction!")) return diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm index 1182b37ae1f78..fe901b3ad9e2a 100644 --- a/code/modules/mob/mob_transformation_simple.dm +++ b/code/modules/mob/mob_transformation_simple.dm @@ -37,7 +37,7 @@ qdel(desired_mob) return - if( istext(new_name) ) + if(istext(new_name)) desired_mob.name = new_name desired_mob.real_name = new_name else @@ -48,12 +48,12 @@ var/mob/living/carbon/old_mob = src var/mob/living/carbon/new_mob = desired_mob old_mob.dna.transfer_identity(new_mob, transfer_species = FALSE) - new_mob.updateappearance(mutcolor_update=1, mutations_overlay_update=1) + new_mob.updateappearance(icon_update = TRUE, mutcolor_update = TRUE, mutations_overlay_update = TRUE) else if(ishuman(desired_mob) && (!ismonkey(desired_mob))) var/mob/living/carbon/human/new_human = desired_mob client?.prefs.safe_transfer_prefs_to(new_human) new_human.dna.update_dna_identity() - new_human.updateappearance(mutcolor_update=1, mutations_overlay_update=1) + new_human.updateappearance(icon_update = TRUE, mutcolor_update = TRUE, mutations_overlay_update = TRUE) //Ghosts have copys of their minds, but if an admin put somebody else in their og body, the mind will have a new mind.key // and transfer_to will transfer the wrong person since it uses mind.key @@ -66,6 +66,7 @@ else desired_mob.key = key + SEND_SIGNAL(src, COMSIG_MOB_CHANGED_TYPE, desired_mob) if(delete_old_mob) QDEL_IN(src, 1) return desired_mob diff --git a/code/modules/mob/mob_update_icons.dm b/code/modules/mob/mob_update_icons.dm index 5ac1fd3105a85..8a6464ee1825a 100644 --- a/code/modules/mob/mob_update_icons.dm +++ b/code/modules/mob/mob_update_icons.dm @@ -12,9 +12,6 @@ /mob/proc/update_icons() return -/mob/proc/update_transform() - return - ///Updates the handcuff overlay & HUD element. /mob/proc/update_worn_handcuffs() return diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm index 1dde25c7802f6..fccd64ab70540 100644 --- a/code/modules/mob/status_procs.dm +++ b/code/modules/mob/status_procs.dm @@ -12,6 +12,7 @@ /mob/proc/adjust_bodytemperature(amount,min_temp=0,max_temp=INFINITY) if(bodytemperature >= min_temp && bodytemperature <= max_temp) bodytemperature = clamp(bodytemperature + amount,min_temp,max_temp) + return TRUE /// Sight here is the mob.sight var, which tells byond what to actually show to our client /// See [code\__DEFINES\sight.dm] for more details diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 1a76e86370acf..09ce3b3c65c8c 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -1,7 +1,11 @@ #define TRANSFORMATION_DURATION 22 +/// Will be removed once the transformation is complete. +#define TEMPORARY_TRANSFORMATION_TRAIT "temporary_transformation" +/// Considered "permanent" since we'll be deleting the old mob and the client will be inserted into a new one (without this trait) +#define PERMANENT_TRANSFORMATION_TRAIT "permanent_transformation" /mob/living/carbon/proc/monkeyize(instant = FALSE) - if (notransform || transformation_timer) + if (transformation_timer || HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return if(ismonkey(src)) @@ -12,7 +16,7 @@ return //Make mob invisible and spawn animation - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, TEMPORARY_TRANSFORMATION_TRAIT) Paralyze(TRANSFORMATION_DURATION, ignore_canstun = TRUE) icon = null cut_overlays() @@ -23,21 +27,22 @@ /mob/living/carbon/proc/finish_monkeyize() transformation_timer = null - to_chat(src, "You are now a monkey.") - notransform = FALSE + to_chat(src, span_boldnotice("You are now a monkey.")) + REMOVE_TRAIT(src, TRAIT_NO_TRANSFORM, TEMPORARY_TRANSFORMATION_TRAIT) icon = initial(icon) invisibility = 0 set_species(/datum/species/monkey) + name = "monkey" + set_name() SEND_SIGNAL(src, COMSIG_HUMAN_MONKEYIZE) uncuff() - regenerate_icons() return src ////////////////////////// Humanize ////////////////////////////// //Could probably be merged with monkeyize but other transformations got their own procs, too /mob/living/carbon/proc/humanize(species = /datum/species/human, instant = FALSE) - if (notransform || transformation_timer) + if (transformation_timer || HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return if(!ismonkey(src)) @@ -48,7 +53,7 @@ return //Make mob invisible and spawn animation - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, TEMPORARY_TRANSFORMATION_TRAIT) Paralyze(TRANSFORMATION_DURATION, ignore_canstun = TRUE) icon = null cut_overlays() @@ -59,13 +64,12 @@ /mob/living/carbon/proc/finish_humanize(species = /datum/species/human) transformation_timer = null - to_chat(src, "You are now a human.") - notransform = FALSE + to_chat(src, span_boldnotice("You are now a human.")) + REMOVE_TRAIT(src, TRAIT_NO_TRANSFORM, TEMPORARY_TRANSFORMATION_TRAIT) icon = initial(icon) invisibility = 0 set_species(species) SEND_SIGNAL(src, COMSIG_MONKEY_HUMANIZE) - regenerate_icons() return src /mob/proc/AIize(client/preference_source, move = TRUE) @@ -99,13 +103,15 @@ if(preference_source) apply_pref_name(/datum/preference/name/ai, preference_source) + our_AI.apply_pref_hologram_display(preference_source) + our_AI.set_core_display_icon(null, preference_source) qdel(src) /mob/living/carbon/AIize(client/preference_source, transfer_after = TRUE) - if (notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT) Paralyze(1, ignore_canstun = TRUE) for(var/obj/item/W in src) dropItemToGround(W) @@ -115,7 +121,7 @@ return ..() /mob/living/carbon/human/AIize(client/preference_source, transfer_after = TRUE) - if (notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return for(var/t in bodyparts) qdel(t) @@ -123,9 +129,9 @@ return ..() /mob/proc/Robotize(delete_items = 0, transfer_after = TRUE) - if(notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT) var/mob/living/silicon/robot/new_borg = new /mob/living/silicon/robot(loc) new_borg.gender = gender @@ -158,9 +164,9 @@ qdel(src) /mob/living/Robotize(delete_items = 0, transfer_after = TRUE) - if(notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, TEMPORARY_TRANSFORMATION_TRAIT) Paralyze(1, ignore_canstun = TRUE) for(var/obj/item/W in src) @@ -172,7 +178,7 @@ icon = null invisibility = INVISIBILITY_MAXIMUM - notransform = FALSE + REMOVE_TRAIT(src, TRAIT_NO_TRANSFORM, TEMPORARY_TRANSFORMATION_TRAIT) return ..() /mob/living/silicon/robot/proc/replace_banned_cyborg() @@ -187,9 +193,9 @@ //human -> alien /mob/living/carbon/human/proc/Alienize() - if (notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT) add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), TRAIT_GENERIC) for(var/obj/item/W in src) dropItemToGround(W) @@ -211,16 +217,15 @@ new_xeno.set_combat_mode(TRUE) new_xeno.key = key - update_atom_languages() - to_chat(new_xeno, "You are now an alien.") - . = new_xeno + to_chat(new_xeno, span_boldnotice("You are now an alien.")) qdel(src) + return new_xeno /mob/living/carbon/human/proc/slimeize(reproduce as num) - if (notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT) add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), TRAIT_GENERIC) for(var/obj/item/W in src) dropItemToGround(W) @@ -245,9 +250,9 @@ new_slime.set_combat_mode(TRUE) new_slime.key = key - to_chat(new_slime, "You are now a slime. Skreee!") - . = new_slime + to_chat(new_slime, span_boldnotice("You are now a slime. Skreee!")) qdel(src) + return new_slime /mob/proc/become_overmind(starting_points = OVERMIND_STARTING_POINTS) var/mob/camera/blob/B = new /mob/camera/blob(get_turf(src), starting_points) @@ -257,9 +262,9 @@ /mob/living/carbon/human/proc/corgize() - if (notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT) Paralyze(1, ignore_canstun = TRUE) for(var/obj/item/W in src) dropItemToGround(W) @@ -273,19 +278,19 @@ new_corgi.set_combat_mode(TRUE) new_corgi.key = key - to_chat(new_corgi, "You are now a Corgi. Yap Yap!") - . = new_corgi + to_chat(new_corgi, span_boldnotice("You are now a Corgi. Yap Yap!")) qdel(src) + return new_corgi /mob/living/carbon/proc/gorillize() - if(notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT) Paralyze(1, ignore_canstun = TRUE) SSblackbox.record_feedback("amount", "gorillas_created", 1) - var/Itemlist = get_equipped_items(TRUE) + var/Itemlist = get_equipped_items(include_pockets = TRUE) Itemlist += held_items for(var/obj/item/W in Itemlist) dropItemToGround(W, TRUE) @@ -299,9 +304,9 @@ mind.transfer_to(new_gorilla) else new_gorilla.key = key - to_chat(new_gorilla, "You are now a gorilla. Ooga ooga!") - . = new_gorilla + to_chat(new_gorilla, span_boldnotice("You are now a gorilla. Ooga ooga!")) qdel(src) + return new_gorilla /mob/living/carbon/human/Animalize() @@ -313,9 +318,9 @@ to_chat(usr, span_danger("Sorry but this mob type is currently unavailable.")) return - if(notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT) Paralyze(1, ignore_canstun = TRUE) for(var/obj/item/W in src) @@ -334,8 +339,8 @@ new_mob.set_combat_mode(TRUE) to_chat(new_mob, span_boldnotice("You suddenly feel more... animalistic.")) - . = new_mob qdel(src) + return new_mob /mob/proc/Animalize() @@ -375,11 +380,11 @@ return TRUE if(ispath(MP, /mob/living/basic/pet/dog/corgi)) return TRUE - if(ispath(MP, /mob/living/simple_animal/crab)) + if(ispath(MP, /mob/living/basic/crab)) return TRUE if(ispath(MP, /mob/living/basic/carp)) return TRUE - if(ispath(MP, /mob/living/simple_animal/hostile/mushroom)) + if(ispath(MP, /mob/living/basic/mushroom)) return TRUE if(ispath(MP, /mob/living/simple_animal/shade)) return TRUE @@ -387,7 +392,7 @@ return TRUE if(ispath(MP, /mob/living/basic/mouse)) return TRUE - if(ispath(MP, /mob/living/simple_animal/hostile/bear)) + if(ispath(MP, /mob/living/basic/bear)) return TRUE if(ispath(MP, /mob/living/simple_animal/parrot)) return TRUE //Parrots are no longer unfinished! -Nodrak @@ -395,4 +400,6 @@ //Not in here? Must be untested! return FALSE +#undef PERMANENT_TRANSFORMATION_TRAIT +#undef TEMPORARY_TRANSFORMATION_TRAIT #undef TRANSFORMATION_DURATION diff --git a/code/modules/mob_spawn/corpses/job_corpses.dm b/code/modules/mob_spawn/corpses/job_corpses.dm index c8dd458f42db1..3893f3e1ba696 100644 --- a/code/modules/mob_spawn/corpses/job_corpses.dm +++ b/code/modules/mob_spawn/corpses/job_corpses.dm @@ -83,4 +83,4 @@ name = JOB_ROBOTICIST outfit = /datum/outfit/job/roboticist icon_state = "corpseroboticist" - + diff --git a/code/modules/mob_spawn/corpses/mining_corpses.dm b/code/modules/mob_spawn/corpses/mining_corpses.dm index 594687effbe25..8b7ad474b1665 100644 --- a/code/modules/mob_spawn/corpses/mining_corpses.dm +++ b/code/modules/mob_spawn/corpses/mining_corpses.dm @@ -16,22 +16,25 @@ //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 +/// Mob spawner used by Legion to spawn costumed bodies /obj/effect/mob_spawn/corpse/human/legioninfested brute_damage = 1000 /obj/effect/mob_spawn/corpse/human/legioninfested/Initialize(mapload) + outfit = select_outfit() + return ..() + +/obj/effect/mob_spawn/corpse/human/legioninfested/special(mob/living/carbon/human/spawned_human) + . = ..() + var/obj/item/organ/internal/legion_tumour/cancer = new() + cancer.Insert(spawned_human, special = TRUE, drop_if_replaced = FALSE) + +/// Returns the outfit worn by our corpse +/obj/effect/mob_spawn/corpse/human/legioninfested/proc/select_outfit() var/corpse_theme = pick_weight(list( - "Miner" = 66, - "Ashwalker" = 10, - "Clown" = 10, + "Miner" = 64, + "Clown" = 5, + "Ashwalker" = 15, "Golem" = 10, pick(list( "Cultist", @@ -40,24 +43,91 @@ "Shadow", )) = 4, )) + switch(corpse_theme) if("Miner") - outfit = /datum/outfit/consumed_miner + return /datum/outfit/consumed_miner if("Ashwalker") - outfit = /datum/outfit/consumed_ashwalker + return /datum/outfit/consumed_ashwalker + if("Golem") + return /datum/outfit/consumed_golem if("Clown") - outfit = /datum/outfit/consumed_clown + return /datum/outfit/consumed_clown if("Cultist") - outfit = /datum/outfit/consumed_cultist + return /datum/outfit/consumed_cultist if("Dame") - outfit = /datum/outfit/consumed_dame + return /datum/outfit/consumed_dame + if("Operative") + return /datum/outfit/syndicatecommandocorpse/lessenedgear + if("Shadow") + return /datum/outfit/consumed_shadowperson + +/// Corpse spawner used by dwarf legions to make small corpses +/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) + +/// Corpse spawner used by snow legions with alternate costumes +/obj/effect/mob_spawn/corpse/human/legioninfested/snow + +/obj/effect/mob_spawn/corpse/human/legioninfested/snow/select_outfit() + var/corpse_theme = pick_weight(list( + "Miner" = 64, + "Clown" = 5, + "Golem" = 15, + "Settler" = 10, + pick(list( + "Cultist", + "Heremoth", + "Operative", + "Shadow", + )) = 4, + )) + + switch(corpse_theme) + if("Miner") + return /datum/outfit/consumed_miner + if("Settler") + return /datum/outfit/consumed_ice_settler + if("Heremoth") + return /datum/outfit/consumed_heremoth + if("Clown") + return /datum/outfit/consumed_clown + if("Cultist") + return /datum/outfit/consumed_cultist if("Golem") - outfit = /datum/outfit/consumed_golem + return /datum/outfit/consumed_golem if("Operative") - outfit = /datum/outfit/syndicatecommandocorpse/lessenedgear + return /datum/outfit/syndicatecommandocorpse/lessenedgear if("Shadow") - outfit = /datum/outfit/consumed_shadowperson + return /datum/outfit/consumed_shadowperson + +/// Creates a dead legion-infested skeleton +/obj/effect/mob_spawn/corpse/human/legioninfested/skeleton + name = "legion-infested skeleton" + mob_name = "skeleton" + mob_species = /datum/species/skeleton + +/obj/effect/mob_spawn/corpse/human/legioninfested/skeleton/select_outfit() + return null + +/obj/effect/mob_spawn/corpse/human/legioninfested/skeleton/special(mob/living/carbon/human/spawned_human) + . = ..() + spawned_human.gender = NEUTER + +/// Creates a dead and burned legion-infested skeleton +/obj/effect/mob_spawn/corpse/human/legioninfested/skeleton/charred + name = "charred legion-infested skeleton" + mob_name = "charred skeleton" + brute_damage = 0 + burn_damage = 1000 + +/obj/effect/mob_spawn/corpse/human/legioninfested/skeleton/charred/special(mob/living/carbon/human/spawned_human) . = ..() + spawned_human.color = "#454545" + /datum/outfit/consumed_miner name = "Legion-Consumed Miner" @@ -222,6 +292,36 @@ if(prob(50)) neck = /obj/item/bedsheet/rd/royal_cape +/datum/outfit/consumed_ice_settler + name = "Legion-Consumed Settler" + uniform = /obj/item/clothing/under/costume/traditional + suit = /obj/item/clothing/suit/hooded/wintercoat + shoes = /obj/item/clothing/shoes/winterboots + mask = /obj/item/clothing/mask/breath + +/datum/outfit/consumed_ice_settler/pre_equip(mob/living/carbon/human/ice_settler, visualsOnly = FALSE) + if(prob(40)) + r_pocket = pick_weight(list( + /obj/item/coin/silver = 5, + /obj/item/fishing_hook = 2, + /obj/item/coin/gold = 2, + /obj/item/fishing_hook/shiny = 1, + )) + if(prob(30)) + back = pick_weight(list( + /obj/item/pickaxe = 4, + /obj/item/tank/internals/oxygen = 6, + )) + else + back = /obj/item/storage/backpack/satchel/explorer + backpack_contents = list() + var/backpack_loot = pick(list( + /obj/item/food/fishmeat = 89, + /obj/item/food/fishmeat/carp = 10, + /obj/item/skeleton_key = 1, + )) + backpack_contents += backpack_loot + //this is so pointlessly gendered but whatever bro i'm here to refactor not judge /datum/outfit/consumed_dame name = "Legion-Consumed Dame" @@ -239,7 +339,7 @@ dame.physique = FEMALE dame.update_body() if(prob(30)) - back = /obj/item/nullrod/scythe/talking + back = /obj/item/nullrod/vibro/talking else back = /obj/item/shield/buckler belt = /obj/item/nullrod/claymore @@ -274,3 +374,26 @@ /obj/item/stack/sheet/runed_metal = 15, ) r_pocket = /obj/item/clothing/glasses/hud/health/night/cultblind + +/datum/outfit/consumed_heremoth + name = "Legion-Consumed Tribal Mothman" + uniform = /obj/item/clothing/under/costume/loincloth + suit = /obj/item/clothing/suit/hooded/cultrobes/eldritch + head = /obj/item/clothing/head/hooded/cult_hoodie/eldritch + +/datum/outfit/consumed_heremoth/pre_equip(mob/living/carbon/human/moth, visualsOnly = FALSE) + if(!visualsOnly) + moth.set_species(/datum/species/moth) + if(prob(70)) + glasses = /obj/item/clothing/glasses/blindfold + if(prob(90)) + back = /obj/item/storage/backpack/cultpack + backpack_contents = list() + var/backpack_loot = pick(list( + /obj/item/flashlight/lantern = 1, + /obj/item/toy/plush/moth = 1, + /obj/item/toy/eldritch_book = 2, + /obj/item/knife/combat/survival = 2, + )) + backpack_contents += backpack_loot + diff --git a/code/modules/mob_spawn/corpses/nonhuman_corpses.dm b/code/modules/mob_spawn/corpses/nonhuman_corpses.dm index 3b8877b3e8a58..060f7e178be2f 100644 --- a/code/modules/mob_spawn/corpses/nonhuman_corpses.dm +++ b/code/modules/mob_spawn/corpses/nonhuman_corpses.dm @@ -40,7 +40,7 @@ ///dead goliath spawner /obj/effect/mob_spawn/corpse/goliath - mob_type = /mob/living/simple_animal/hostile/asteroid/goliath/beast + mob_type = /mob/living/basic/mining/goliath icon = 'icons/mob/simple/lavaland/lavaland_monsters_wide.dmi' icon_state = "goliath_dead_helper" pixel_x = -12 @@ -48,10 +48,6 @@ /// Dead headcrab for changeling-themed ruins /obj/effect/mob_spawn/corpse/headcrab - mob_type = /mob/living/basic/headslug + mob_type = /mob/living/basic/headslug/beakless icon = 'icons/mob/simple/animal.dmi' icon_state = "headslug_dead" - -/obj/effect/mob_spawn/corpse/headcrab/special(mob/living/basic/headslug/crab) - . = ..() - crab.egg_lain = TRUE // Prevents using mad science to become a changeling diff --git a/code/modules/mob_spawn/corpses/species_corpses.dm b/code/modules/mob_spawn/corpses/species_corpses.dm index a9faabf7a05de..57cc1d32284c0 100644 --- a/code/modules/mob_spawn/corpses/species_corpses.dm +++ b/code/modules/mob_spawn/corpses/species_corpses.dm @@ -2,6 +2,8 @@ //corpses that only differentiate themselves by representing a species /obj/effect/mob_spawn/corpse/human/skeleton + //these are also fished in chasms so it wouldn't hurt giving them an apter name than "mob spawner" + name = "skeleton" mob_species = /datum/species/skeleton /obj/effect/mob_spawn/corpse/human/zombie diff --git a/code/modules/mob_spawn/ghost_roles/drone_roles.dm b/code/modules/mob_spawn/ghost_roles/drone_roles.dm new file mode 100644 index 0000000000000..b8a31a16b13db --- /dev/null +++ b/code/modules/mob_spawn/ghost_roles/drone_roles.dm @@ -0,0 +1,6 @@ +/obj/effect/mob_spawn/ghost_role/drone/name_mob(mob/living/spawned_mob, forced_name) + if(!forced_name) + var/designation = pick(GLOB.posibrain_names) + forced_name = "Drone ([designation]-[rand(100, 999)])" + + return ..() diff --git a/code/modules/mob_spawn/ghost_roles/fugitive_hunter_roles.dm b/code/modules/mob_spawn/ghost_roles/fugitive_hunter_roles.dm index 35a2028aea22d..2df27efdf847d 100644 --- a/code/modules/mob_spawn/ghost_roles/fugitive_hunter_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/fugitive_hunter_roles.dm @@ -55,18 +55,6 @@ icon = 'icons/obj/machines/sleeper.dmi' icon_state = "sleeper" -/obj/effect/mob_spawn/ghost_role/human/fugitive/psykers - name = "mental energizer" - desc = "A cryo sleeper modified to keep the occupant mentally sharp. However that works..." - icon_state = "psykerpod" - prompt_name = "a psyker-hunter" - mob_species = /datum/species/human - outfit = /datum/outfit/psyker - -/obj/effect/mob_spawn/ghost_role/human/fugitive/psykers/captain - prompt_name = "a psyker-hunter captain" - outfit = /datum/outfit/psyker/captain - /obj/effect/mob_spawn/ghost_role/human/fugitive/bounty/Destroy() var/obj/structure/fluff/empty_sleeper/S = new(drop_location()) S.setDir(dir) @@ -81,7 +69,7 @@ /obj/effect/mob_spawn/ghost_role/human/fugitive/bounty/synth outfit = /datum/outfit/bountysynth -/obj/effect/mob_spawn/ghost_role/human/fugitive/bounty/psyker +/obj/effect/mob_spawn/ghost_role/human/fugitive/psyker name = "mental energizer" desc = "A cryo sleeper modified to keep the occupant mentally sharp. However that works..." icon_state = "psykerpod" @@ -92,19 +80,19 @@ back_story = HUNTER_PACK_PSYKER outfit = /datum/outfit/psyker -/obj/effect/mob_spawn/ghost_role/human/fugitive/bounty/psyker/captain +/obj/effect/mob_spawn/ghost_role/human/fugitive/psyker/captain prompt_name = "a psyker Captain" back_story = HUNTER_PACK_PSYKER outfit = /datum/outfit/psyker/captain -/obj/effect/mob_spawn/ghost_role/human/fugitive/bounty/psyker/seer +/obj/effect/mob_spawn/ghost_role/human/fugitive/psyker/seer name = "cryosleep pod" desc = "A dingy, poorly maintained, but still run-of-the-mill cryo sleeper." icon = 'icons/obj/machines/sleeper.dmi' icon_state = "sleeper" prompt_name = "a psyker seer" - you_are_text = "psyker seer" - flavour_text = "Oh great, the fortunte-tellers want my help with something again. They picked up up while I was space-hitchhiking, said they would take me anywhere \ + you_are_text = "Ugh, I'm the Psyker Seer." + flavour_text = "Oh great, the fortunte-tellers want my help with something again. They picked me up while I was space-hitchhiking, said they would take me anywhere \ if I assisted them with my 'flesh-gaze'. They're a bunch of freaks, but at least they leave me be after I'm done helping them..." back_story = HUNTER_PACK_PSYKER outfit = /datum/outfit/psyker_seer diff --git a/code/modules/mob_spawn/ghost_roles/golem_roles.dm b/code/modules/mob_spawn/ghost_roles/golem_roles.dm index 4c6ee693c889a..c86a895823860 100644 --- a/code/modules/mob_spawn/ghost_roles/golem_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/golem_roles.dm @@ -5,7 +5,7 @@ /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 = 'icons/mob/shells.dmi' icon_state = "shell_complete" mob_species = /datum/species/golem anchored = FALSE @@ -56,7 +56,7 @@ /// Makes free golems slow and sad on the space station /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) + var/static/list/allowed_areas = typecacheof(list(/area/icemoon, /area/lavaland, /area/ruin, /area/misc/survivalpod, /area/golem)) ADD_TRAIT(new_spawn, TRAIT_FORBID_MINING_SHUTTLE_CONSOLE_OUTSIDE_STATION, INNATE_TRAIT) new_spawn.AddComponent(/datum/component/hazard_area, area_whitelist = allowed_areas) @@ -101,7 +101,7 @@ CRASH("[type] created a golem without a mind.") new_spawn.mind.enslave_mind_to_creator(real_owner) - to_chat(new_spawn, span_userdanger("Serve [real_owner], and assist [real_owner.p_them()] in completing [real_owner.p_their()] goals at any cost.")) + to_chat(new_spawn, span_userdanger("Serve [real_owner.real_name], and assist [real_owner.p_them()] in completing [real_owner.p_their()] goals at any cost.")) /obj/effect/mob_spawn/ghost_role/human/golem/servant/name_mob(mob/living/spawned_mob, forced_name) if(forced_name || !iscarbon(spawned_mob)) diff --git a/code/modules/mob_spawn/ghost_roles/mining_roles.dm b/code/modules/mob_spawn/ghost_roles/mining_roles.dm index f7ae8f35c4fe4..66837628cdcf4 100644 --- a/code/modules/mob_spawn/ghost_roles/mining_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/mining_roles.dm @@ -6,7 +6,7 @@ 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 = 'icons/obj/mining_zones/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." @@ -60,7 +60,7 @@ 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 = 'icons/obj/mining_zones/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?" @@ -124,7 +124,8 @@ name = "Space Bartender" id = /obj/item/card/id/advanced id_trim = /datum/id_trim/space_bartender - uniform = /obj/item/clothing/under/rank/civilian/bartender + neck = /obj/item/clothing/neck/bowtie + uniform = /obj/item/clothing/under/costume/buttondown/slacks/service suit = /obj/item/clothing/suit/armor/vest back = /obj/item/storage/backpack glasses = /obj/item/clothing/glasses/sunglasses/reagent @@ -142,7 +143,7 @@ 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 = 'icons/obj/mining_zones/spawners.dmi' icon_state = "terrarium" density = TRUE mob_species = /datum/species/pod @@ -199,7 +200,7 @@ yolk.underwear = "Nude" yolk.equipOutfit(/datum/outfit/ashwalker)//this is an authentic mess we're making yolk.update_body() - yolk.gib() + yolk.gib(DROP_ALL_REMAINS) QDEL_NULL(egg) return ..() @@ -226,7 +227,7 @@ 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 + if(!(user.ckey in team.players_spawned))//one per person unless you get a bonus spawn return TRUE if(!silent) to_chat(user, span_warning("You have exhausted your usefulness to the Necropolis.")) @@ -240,7 +241,7 @@ spawned_human.mind.add_antag_datum(/datum/antagonist/ashwalker, team) spawned_human.remove_language(/datum/language/common) - team.players_spawned += (spawned_human.key) + team.players_spawned += (spawned_human.ckey) eggshell.egg = null QDEL_NULL(eggshell) @@ -278,7 +279,7 @@ /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) + new_spawn.grant_language(/datum/language/codespeak, source = LANGUAGE_MIND) /obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/comms name = "Syndicate Comms Agent" diff --git a/code/modules/mob_spawn/ghost_roles/space_roles.dm b/code/modules/mob_spawn/ghost_roles/space_roles.dm index 3567857ed6a7c..7b4dba395c1ec 100644 --- a/code/modules/mob_spawn/ghost_roles/space_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/space_roles.dm @@ -91,7 +91,7 @@ /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!" + flavour_text = "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) diff --git a/code/modules/mob_spawn/ghost_roles/spider_roles.dm b/code/modules/mob_spawn/ghost_roles/spider_roles.dm index 78b570e138118..e3dbea6b1ba7b 100644 --- a/code/modules/mob_spawn/ghost_roles/spider_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/spider_roles.dm @@ -23,7 +23,7 @@ /obj/structure/spider/eggcluster/examine_more(mob/user) . = ..() - if(istype(user, /mob/living/basic/giant_spider/midwife)) + if(istype(user, /mob/living/basic/spider/giant/midwife)) switch(spawner.amount_grown) if(0 to 24) . += span_info("These eggs look shrunken and dormant.") @@ -50,7 +50,6 @@ /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 @@ -75,13 +74,15 @@ var/obj/structure/spider/eggcluster/egg /// The types of spiders that the spawner can produce var/list/potentialspawns = list( - /mob/living/basic/spiderling/nurse, - /mob/living/basic/spiderling/hunter, - /mob/living/basic/spiderling/ambush, - /mob/living/basic/spiderling/tangle, - /mob/living/basic/spiderling/guard, - /mob/living/basic/spiderling/scout, + /mob/living/basic/spider/growing/spiderling/nurse, + /mob/living/basic/spider/growing/spiderling/hunter, + /mob/living/basic/spider/growing/spiderling/ambush, + /mob/living/basic/spider/growing/spiderling/tangle, + /mob/living/basic/spider/growing/spiderling/guard, + /mob/living/basic/spider/growing/spiderling/scout, ) + /// Do we flash the byond window when this particular egg type is available? + var/flash_window = FALSE /obj/effect/mob_spawn/ghost_role/spider/Initialize(mapload) . = ..() @@ -99,7 +100,7 @@ amount_grown += rand(5, 15) * seconds_per_tick 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) + notify_ghosts("[src] is ready to hatch!", null, enter_link = "(Click to play)", source = src, action = NOTIFY_ORBIT, ignore_key = POLL_IGNORE_SPIDER, flashwindow = flash_window) STOP_PROCESSING(SSobj, src) /obj/effect/mob_spawn/ghost_role/spider/Topic(href, href_list) @@ -121,11 +122,13 @@ to_chat(user, span_warning("\The [src] is not ready to hatch yet!")) return FALSE -/obj/effect/mob_spawn/ghost_role/spider/special(mob/living/basic/giant_spider/spawned_mob, mob/mob_possessor) +/obj/effect/mob_spawn/ghost_role/spider/special(mob/living/basic/spider/spawned_mob, mob/mob_possessor) + . = ..() spawned_mob.directive = directive egg.spawner = null QDEL_NULL(egg) - return ..() + var/datum/antagonist/spider/spider_antag = new(directive) + spawned_mob.mind.add_antag_datum(spider_antag) /obj/effect/mob_spawn/ghost_role/spider/enriched name = "enriched egg cluster" @@ -133,10 +136,11 @@ you_are_text = "You are an enriched spider." cluster_type = /obj/structure/spider/eggcluster/enriched potentialspawns = list( - /mob/living/basic/spiderling/tarantula, - /mob/living/basic/spiderling/viper, - /mob/living/basic/spiderling/midwife, + /mob/living/basic/spider/growing/spiderling/tarantula, + /mob/living/basic/spider/growing/spiderling/viper, + /mob/living/basic/spider/growing/spiderling/midwife, ) + flash_window = TRUE /obj/effect/mob_spawn/ghost_role/spider/bloody name = "bloody egg cluster" @@ -146,8 +150,9 @@ 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/basic/spiderling/hunter/flesh, + /mob/living/basic/spider/giant/hunter/flesh, ) + flash_window = TRUE /obj/effect/mob_spawn/ghost_role/spider/midwife name = "midwife egg cluster" @@ -156,8 +161,9 @@ 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/basic/spiderling/midwife, + /mob/living/basic/spider/giant/midwife, // We don't want the event to end instantly because of a 2 hp spiderling dying ) + flash_window = TRUE /** * Makes a ghost into a spider based on the type of egg cluster. @@ -172,8 +178,9 @@ var/list/spider_list = list() var/list/display_spiders = list() for(var/choice in potentialspawns) - var/mob/living/basic/spiderling/chosen_spiderling = choice - var/mob/living/basic/giant_spider/spider = initial(chosen_spiderling.grow_as) + var/mob/living/basic/spider/growing/spiderling/chosen_spiderling = choice + var/mob/living/basic/spider/growing/young/young_spider = initial(chosen_spiderling.grow_as) + var/mob/living/basic/spider/giant/spider = initial(young_spider.grow_as) // God this is so stupid spider_list[initial(spider.name)] = chosen_spiderling var/datum/radial_menu_choice/option = new @@ -194,5 +201,4 @@ if(QDELETED(src) || QDELETED(user) || !chosen_spider) return FALSE mob_type = chosen_spider - mob_name = "spiderling" return ..() diff --git a/code/modules/mob_spawn/ghost_roles/unused_roles.dm b/code/modules/mob_spawn/ghost_roles/unused_roles.dm index 11d17f531120a..d9cdd699ade70 100644 --- a/code/modules/mob_spawn/ghost_roles/unused_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/unused_roles.dm @@ -129,7 +129,8 @@ /datum/outfit/cryobartender name = "Cryogenic Bartender" - uniform = /obj/item/clothing/under/rank/civilian/bartender + neck = /obj/item/clothing/neck/bowtie + uniform = /obj/item/clothing/under/costume/buttondown/slacks/service suit = /obj/item/clothing/suit/armor/vest back = /obj/item/storage/backpack glasses = /obj/item/clothing/glasses/sunglasses/reagent @@ -271,7 +272,7 @@ /obj/effect/mob_spawn/ghost_role/human/syndicatespace/special(mob/living/new_spawn) . = ..() - new_spawn.grant_language(/datum/language/codespeak, TRUE, TRUE, LANGUAGE_MIND) + new_spawn.grant_language(/datum/language/codespeak, source = LANGUAGE_MIND) var/datum/job/spawn_job = SSjob.GetJobType(spawner_job_path) var/policy = get_policy(spawn_job.policy_index) if(policy) diff --git a/code/modules/mob_spawn/ghost_roles/venus_human_trap.dm b/code/modules/mob_spawn/ghost_roles/venus_human_trap.dm index 800a6089aa374..96a75842b1b61 100644 --- a/code/modules/mob_spawn/ghost_roles/venus_human_trap.dm +++ b/code/modules/mob_spawn/ghost_roles/venus_human_trap.dm @@ -2,7 +2,7 @@ /obj/effect/mob_spawn/ghost_role/venus_human_trap name = "flower bud" desc = "A large pulsating plant..." - icon = 'icons/effects/spacevines.dmi' + icon = 'icons/mob/spacevines.dmi' icon_state = "bud0" mob_type = /mob/living/simple_animal/hostile/venus_human_trap density = FALSE diff --git a/code/modules/mob_spawn/mob_spawn.dm b/code/modules/mob_spawn/mob_spawn.dm index 8b72669769fb1..b282ea7d8b2c3 100644 --- a/code/modules/mob_spawn/mob_spawn.dm +++ b/code/modules/mob_spawn/mob_spawn.dm @@ -32,6 +32,8 @@ var/facial_haircolor ///sets a human's skin tone var/skin_tone + /// Weakref to the mob this spawner created - just if you needed to do something with it. + var/datum/weakref/spawned_mob_ref /obj/effect/mob_spawn/Initialize(mapload) . = ..() @@ -44,6 +46,7 @@ name_mob(spawned_mob, newname) special(spawned_mob, mob_possessor) equip(spawned_mob) + spawned_mob_ref = WEAKREF(spawned_mob) return spawned_mob /obj/effect/mob_spawn/proc/special(mob/living/spawned_mob) @@ -180,7 +183,7 @@ LAZYREMOVE(ckeys_trying_to_spawn, user_ckey) return - if(is_banned_from(user.key, role_ban)) + if(is_banned_from(user.ckey, role_ban)) to_chat(user, span_warning("You are banned from this role!")) LAZYREMOVE(ckeys_trying_to_spawn, user_ckey) return @@ -208,7 +211,7 @@ */ /obj/effect/mob_spawn/ghost_role/proc/create_from_ghost(mob/dead/user) ASSERT(istype(user)) - var/user_ckey = user.ckey // We need to do it before everything else, because after the create() the ckey will already have been transfered. + var/user_ckey = user.ckey // We need to do it before everything else, because after the create() the ckey will already have been transferred. user.log_message("became a [prompt_name].", LOG_GAME) uses -= 1 // Remove a use before trying to spawn to prevent strangeness like the spawner trying to spawn more mobs than it should be able to @@ -223,8 +226,11 @@ if(isnull(created)) // If we explicitly return FALSE instead of just not returning a mob, we don't want to spam the admins CRASH("An instance of [type] didn't return anything when creating a mob, this might be broken!") + SEND_SIGNAL(src, COMSIG_GHOSTROLE_SPAWNED, created) check_uses() // Now we check if the spawner should delete itself or not + return created + /obj/effect/mob_spawn/ghost_role/create(mob/mob_possessor, newname) if(!mob_possessor.key) // This is in the scenario that the server is somehow lagging, or someone fucked up their code, and we try to spawn the same person in twice. We'll simply not spawn anything and CRASH(), so that we report what happened. CRASH("Attempted to create an instance of [type] with a mob that had no ckey attached to it, which isn't supported by ghost role spawners!") diff --git a/code/modules/mod/mod_actions.dm b/code/modules/mod/mod_actions.dm index 0c92171f70704..111ea425b6a6e 100644 --- a/code/modules/mod/mod_actions.dm +++ b/code/modules/mod/mod_actions.dm @@ -16,17 +16,17 @@ /datum/action/item_action/mod/Grant(mob/user) var/obj/item/mod/control/mod = target - if(ai_action && user != mod.ai) + if(ai_action && user != mod.ai_assistant) return - else if(!ai_action && user == mod.ai) + else if(!ai_action && user == mod.ai_assistant) return return ..() /datum/action/item_action/mod/Remove(mob/user) var/obj/item/mod/control/mod = target - if(ai_action && user != mod.ai) + if(ai_action && user != mod.ai_assistant) return - else if(!ai_action && user == mod.ai) + else if(!ai_action && user == mod.ai_assistant) return return ..() @@ -123,35 +123,49 @@ var/override = FALSE /// Module we are linked to. var/obj/item/mod/module/module - /// A ref to the mob we are pinned to. - var/pinner_ref + /// A reference to the mob we are pinned to. + var/mob/pinner + /// Timer until we remove our cooldown overlay + var/cooldown_timer /datum/action/item_action/mod/pinned_module/New(Target, obj/item/mod/module/linked_module, mob/user) - if(isAI(user)) + var/obj/item/mod/control/mod = Target + if(user == mod.ai_assistant) ai_action = TRUE button_icon = linked_module.icon button_icon_state = linked_module.icon_state - ..() + . = ..() module = linked_module + pinner = user + module.pinned_to[REF(user)] = src if(linked_module.allow_flags & MODULE_ALLOW_INCAPACITATED) // clears check hands and check conscious check_flags = NONE name = "Activate [capitalize(linked_module.name)]" desc = "Quickly activate [linked_module]." - RegisterSignals(linked_module, list(COMSIG_MODULE_ACTIVATED, COMSIG_MODULE_DEACTIVATED, COMSIG_MODULE_USED), PROC_REF(module_interacted_with)) + RegisterSignals(linked_module, list( + COMSIG_MODULE_ACTIVATED, + COMSIG_MODULE_DEACTIVATED, + COMSIG_MODULE_USED, + ), PROC_REF(module_interacted_with)) + RegisterSignal(linked_module, COMSIG_MODULE_COOLDOWN_STARTED, PROC_REF(cooldown_started)) + RegisterSignal(user, COMSIG_QDELETING, PROC_REF(pinner_deleted)) /datum/action/item_action/mod/pinned_module/Destroy() - UnregisterSignal(module, list(COMSIG_MODULE_ACTIVATED, COMSIG_MODULE_DEACTIVATED, COMSIG_MODULE_USED)) - module.pinned_to -= pinner_ref + deltimer(cooldown_timer) + UnregisterSignal(module, list( + COMSIG_MODULE_ACTIVATED, + COMSIG_MODULE_DEACTIVATED, + COMSIG_MODULE_COOLDOWN_STARTED, + COMSIG_MODULE_USED, + )) + module.pinned_to -= REF(pinner) module = null + pinner = null return ..() /datum/action/item_action/mod/pinned_module/Grant(mob/user) - var/user_ref = REF(user) - if(!pinner_ref) - pinner_ref = user_ref - module.pinned_to[pinner_ref] = src - else if(pinner_ref != user_ref) + if(pinner != user) return return ..() @@ -161,6 +175,11 @@ return module.on_select() +/// If the guy whose UI we are pinned to got deleted +/datum/action/item_action/mod/pinned_module/proc/pinner_deleted() + pinner = null + qdel(src) + /datum/action/item_action/mod/pinned_module/apply_button_overlay(atom/movable/screen/movable/action_button/current_button, force) current_button.cut_overlays() if(override) @@ -172,12 +191,19 @@ else if(module.active) current_button.add_overlay(image(icon = 'icons/hud/radial.dmi', icon_state = "module_active", layer = FLOAT_LAYER-0.1)) if(!COOLDOWN_FINISHED(module, cooldown_timer)) - var/image/cooldown_image = image(icon = 'icons/hud/radial.dmi', icon_state = "module_cooldown") - current_button.add_overlay(cooldown_image) - addtimer(CALLBACK(current_button, TYPE_PROC_REF(/image, cut_overlay), cooldown_image), COOLDOWN_TIMELEFT(module, cooldown_timer)) + current_button.add_overlay(image(icon = 'icons/hud/radial.dmi', icon_state = "module_cooldown")) return ..() /datum/action/item_action/mod/pinned_module/proc/module_interacted_with(datum/source) SIGNAL_HANDLER build_all_button_icons(UPDATE_BUTTON_OVERLAY|UPDATE_BUTTON_STATUS) + +/datum/action/item_action/mod/pinned_module/proc/cooldown_started(datum/source, cooldown_time) + SIGNAL_HANDLER + + deltimer(cooldown_timer) + build_all_button_icons(UPDATE_BUTTON_OVERLAY) + if (cooldown_time == 0) + return + cooldown_timer = addtimer(CALLBACK(src, PROC_REF(build_all_button_icons), UPDATE_BUTTON_OVERLAY), cooldown_time + 1, TIMER_STOPPABLE) diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm index 36563bbd96cb5..c45752769a5b2 100644 --- a/code/modules/mod/mod_activation.dm +++ b/code/modules/mod/mod_activation.dm @@ -70,6 +70,9 @@ /// Deploys a part of the suit onto the user. /obj/item/mod/control/proc/deploy(mob/user, obj/item/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) return FALSE @@ -155,8 +158,11 @@ if(!module.active || (module.allow_flags & MODULE_ALLOW_INACTIVE)) continue module.on_deactivation(display_message = FALSE) + mod_link.end_call() activating = TRUE to_chat(wearer, span_notice("MODsuit [active ? "shutting down" : "starting up"].")) + if (ai_assistant) + to_chat(ai_assistant, span_notice("MODsuit [active ? "shutting down" : "starting up"].")) if(do_after(wearer, activation_step_time, wearer, 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) @@ -175,8 +181,8 @@ seal_part(helmet, seal = !active) if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(has_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]\"")) + if(ai_assistant) + to_chat(ai_assistant, span_notice("SYSTEMS [active ? "DEACTIVATED. GOODBYE" : "ACTIVATED. WELCOME"]: \"[ai_assistant]\"")) finish_activation(on = !active) if(active) playsound(src, 'sound/machines/synth_yes.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000) @@ -222,17 +228,15 @@ if (!seal && wearer?.invalid_internals()) wearer.cutoff_internals() -/// Finishes the suit's activation, starts processing +/// Finishes the suit's activation /obj/item/mod/control/proc/finish_activation(on) active = 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_clothing(slot_flags) diff --git a/code/modules/mod/mod_ai.dm b/code/modules/mod/mod_ai.dm index 8da0ed26d1582..290c18d948d5f 100644 --- a/code/modules/mod/mod_ai.dm +++ b/code/modules/mod/mod_ai.dm @@ -7,36 +7,25 @@ return switch(interaction) if(AI_TRANS_TO_CARD) - if(!ai) + if(!ai_assistant) balloon_alert(user, "no ai in suit!") return balloon_alert(user, "transferring to card...") if(!do_after(user, 5 SECONDS, target = src)) balloon_alert(user, "interrupted!") return - if(!ai) + if(!ai_assistant) + balloon_alert(user, "no ai in suit!") return - intAI = ai - intAI.ai_restore_power()//So the AI initially has power. - intAI.control_disabled = TRUE - intAI.radio_enabled = FALSE - intAI.disconnect_shell() - intAI.forceMove(card) - card.AI = intAI - for(var/datum/action/action as anything in actions) - action.Remove(intAI) - intAI.controlled_equipment = null - intAI.remote_control = null - balloon_alert(intAI, "transferred to a card") balloon_alert(user, "ai transferred to card") - ai = null + ai_exit_mod(card) if(AI_TRANS_FROM_CARD) //Using an AI card to upload to the suit. intAI = card.AI if(!intAI) balloon_alert(user, "no ai in card!") return - if(ai) + if(ai_assistant) balloon_alert(user, "already has ai!") return if(intAI.deployed_shell) //Recall AI if shelled so it can be checked for a client @@ -48,12 +37,13 @@ if(!do_after(user, 5 SECONDS, target = src)) balloon_alert(user, "interrupted!") return - if(ai) + if(ai_assistant) return balloon_alert(user, "ai transferred to suit") ai_enter_mod(intAI) card.AI = null +/// Place an AI in control of your suit functions /obj/item/mod/control/proc/ai_enter_mod(mob/living/silicon/ai/new_ai) new_ai.control_disabled = FALSE new_ai.radio_enabled = TRUE @@ -62,10 +52,80 @@ new_ai.controlled_equipment = src new_ai.remote_control = src new_ai.forceMove(src) - ai = new_ai - balloon_alert(new_ai, "transferred to a suit") + on_gained_assistant(new_ai) + +/// Remove an AI's control of your suit functions +/obj/item/mod/control/proc/ai_exit_mod(obj/item/aicard/card) + var/mob/living/silicon/ai/old_ai = ai_assistant + old_ai.ai_restore_power()//So the AI initially has power. + old_ai.control_disabled = TRUE + old_ai.radio_enabled = FALSE + old_ai.disconnect_shell() + old_ai.forceMove(card) + card.AI = old_ai + old_ai.controlled_equipment = null + on_removed_assistant(old_ai) + +/// Place a pAI in control of your suit functions +/obj/item/mod/control/proc/insert_pai(mob/user, obj/item/pai_card/card) + if (!isnull(ai_assistant)) + balloon_alert(user, "slot occupied!") + return FALSE + if (isnull(card.pai?.mind)) + balloon_alert(user, "pAI unresponsive!") + return FALSE + balloon_alert(user, "transferring to suit...") + if (!do_after(user, 5 SECONDS, target = src)) + balloon_alert(user, "interrupted!") + return FALSE + if (!user.transferItemToLoc(card, src)) + balloon_alert(user, "transfer failed!") + return FALSE + balloon_alert(user, "pAI transferred to suit") + var/mob/living/silicon/pai/pai_assistant = card.pai + pai_assistant.can_transmit = TRUE + pai_assistant.can_receive = TRUE + pai_assistant.can_holo = FALSE + if (pai_assistant.holoform) + pai_assistant.fold_in() + SStgui.close_uis(card) + on_gained_assistant(card.pai) + return TRUE + +/// Removes pAI control from a modsuit +/obj/item/mod/control/proc/remove_pai(mob/user, forced = FALSE) + if (isnull(ai_assistant)) + balloon_alert(user, "no pAI!") + return FALSE + if (!forced) + if (!open) + balloon_alert(user, "suit panel closed!") + return FALSE + balloon_alert(user, "uninstalling card...") + if (!do_after(user, 5 SECONDS, target = src)) + balloon_alert(user, "interrupted!") + return FALSE + + balloon_alert(user, "pAI removed from suit") + var/mob/living/silicon/pai/pai_helper = ai_assistant + pai_helper.can_holo = TRUE + pai_helper.card.forceMove(get_turf(src)) + on_removed_assistant() + +/// Called when a new ai assistant is inserted +/obj/item/mod/control/proc/on_gained_assistant(mob/living/silicon/new_helper) + ai_assistant = new_helper + balloon_alert(new_helper, "transferred to a suit") for(var/datum/action/action as anything in actions) - action.Grant(new_ai) + action.Grant(new_helper) + +/// Called when an existing ai assistant is removed +/obj/item/mod/control/proc/on_removed_assistant() + for(var/datum/action/action as anything in actions) + action.Remove(ai_assistant) + ai_assistant.remote_control = null + balloon_alert(ai_assistant, "transferred to a card") + ai_assistant = null #define MOVE_DELAY 2 #define WEARER_DELAY 1 @@ -74,7 +134,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_assistant || !COOLDOWN_FINISHED(src, cooldown_mod_move) || (wearer?.pulledby?.grab_state > GRAB_PASSIVE)) return FALSE var/timemodifier = MOVE_DELAY * (ISDIAGONALDIR(direction) ? sqrt(2) : 1) * (wearer ? WEARER_DELAY : LONE_DELAY) if(wearer && !wearer.Process_Spacemove(direction)) @@ -111,8 +171,10 @@ /obj/item/mod/ai_minicard/Initialize(mapload, mob/living/silicon/ai/ai) . = ..() - if(!ai) + if(isnull(ai)) return + ai.controlled_equipment = null + ai.remote_control = null ai.apply_damage(150, BURN) INVOKE_ASYNC(ai, TYPE_PROC_REF(/mob/living/silicon/ai, death)) ai.forceMove(src) diff --git a/code/modules/mod/mod_construction.dm b/code/modules/mod/mod_construction.dm index a79d216039c89..fdbcf47d379df 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) @@ -66,20 +68,16 @@ /obj/item/mod/construction/lavalandcore/attackby(obj/item/weapon, mob/user, params) if(!istype(weapon, /obj/item/stack/cable_coil)) - return - + return ..() if(!weapon.tool_start_check(user, amount=2)) return - - to_chat(user, span_notice("You start pushing the wires into the core...")) + balloon_alert(user, "installing wires...") if(!weapon.use_tool(src, user, 5 SECONDS, amount = 2, volume = 30)) + balloon_alert(user, "interrupted!") return - - to_chat(user, span_notice("You add the wires to the core.")) new /obj/item/mod/core/plasma/lavaland(drop_location()) qdel(src) - /obj/item/mod/construction/plating name = "MOD external plating" desc = "External plating used to finish a MOD control unit." @@ -283,18 +281,18 @@ QDEL_NULL(boots) return ..() -/obj/item/mod/construction/shell/handle_atom_del(atom/deleted_atom) - if(deleted_atom == core) +/obj/item/mod/construction/shell/Exited(atom/movable/gone, direction) + . = ..() + if(gone == core) core = null - if(deleted_atom == helmet) + if(gone == helmet) helmet = null - if(deleted_atom == chestplate) + if(gone == chestplate) chestplate = null - if(deleted_atom == gauntlets) + if(gone == gauntlets) gauntlets = null - if(deleted_atom == boots) + if(gone == boots) boots = null - return ..() #undef START_STEP #undef CORE_STEP diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index ea3b3ef5f3d5d..ce82bf305553e 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -82,8 +82,12 @@ var/list/modules = list() /// Currently used module. var/obj/item/mod/module/selected_module - /// AI mob inhabiting the MOD. - var/mob/living/silicon/ai/ai + /// AI or pAI mob inhabiting the MOD. + var/mob/living/silicon/ai_assistant + /// 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 /// Delay between moves as AI. var/static/movedelay = 0 /// Cooldown for AI moves. @@ -102,10 +106,11 @@ extended_desc = theme.extended_desc slowdown_inactive = theme.slowdown_inactive slowdown_active = theme.slowdown_active + activation_step_time = theme.activation_step_time complexity_max = theme.complexity_max ui_theme = theme.ui_theme charge_drain = theme.charge_drain - wires = new /datum/wires/mod(src) + set_wires(new /datum/wires/mod(src)) if(length(req_access)) locked = TRUE new_core?.install(src) @@ -140,10 +145,10 @@ for(var/obj/item/mod/module/module as anything in theme.inbuilt_modules) module = new module(src) install(module) + 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) @@ -172,6 +177,7 @@ if(core) QDEL_NULL(core) QDEL_NULL(wires) + QDEL_NULL(mod_link) return ..() /obj/item/mod/control/atom_destruction(damage_flag) @@ -183,13 +189,14 @@ 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 - for(var/datum/action/action as anything in actions) - if(action.owner == ai) - action.Remove(ai) - new /obj/item/mod/ai_minicard(drop_location(), ai) + if(ai_assistant) + if(ispAI(ai_assistant)) + INVOKE_ASYNC(src, PROC_REF(remove_pai), /* user = */ null, /* forced = */ TRUE) // async to appease spaceman DMM because the branch we don't run has a do_after + else + for(var/datum/action/action as anything in actions) + if(action.owner == ai_assistant) + action.Remove(ai_assistant) + new /obj/item/mod/ai_minicard(drop_location(), ai_assistant) return ..() /obj/item/mod/control/examine(mob/user) @@ -211,10 +218,11 @@ . += span_notice("You could remove [core] with a wrench.") else . += span_notice("You could use a MOD core on it to install one.") - if(ai) - . += span_notice("You could remove [ai] with an intellicard.") - else - . += span_notice("You could install an AI with an intellicard.") + if(isnull(ai_assistant)) + . += span_notice("You could install an AI or pAI using their storage card.") + else if(isAI(ai_assistant)) + . += span_notice("You could remove [ai_assistant] 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,13 +232,17 @@ /obj/item/mod/control/process(seconds_per_tick) if(seconds_electrified > MACHINE_NOT_ELECTRIFIED) seconds_electrified-- + if(mod_link.link_call) + subtract_charge((DEFAULT_CHARGE_DRAIN * 0.25) * seconds_per_tick) + if(!active) + return if(!get_charge() && active && !activating) power_off() - return PROCESS_KILL + return var/malfunctioning_charge_drain = 0 if(malfunctioning) malfunctioning_charge_drain = rand(1,20) - subtract_charge((charge_drain + malfunctioning_charge_drain)*seconds_per_tick) + subtract_charge((charge_drain + malfunctioning_charge_drain) * seconds_per_tick) update_charge_alert() for(var/obj/item/mod/module/module as anything in modules) if(malfunctioning && module.active && SPT_PROB(5, seconds_per_tick)) @@ -254,6 +266,13 @@ if(slot & slot_flags) return TRUE +// Grant pinned actions to pin owners, gives AI pinned actions to the AI and not the wearer +/obj/item/mod/control/grant_action_to_bearer(datum/action/action) + if (!istype(action, /datum/action/item_action/mod/pinned_module)) + return ..() + var/datum/action/item_action/mod/pinned_module/pinned = action + give_item_action(action, pinned.pinner, slot_flags) + /obj/item/mod/control/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) . = ..() if(!wearer || old_loc != wearer || loc == wearer) @@ -305,7 +324,8 @@ return ..() /obj/item/mod/control/screwdriver_act(mob/living/user, obj/item/screwdriver) - if(..()) + . = ..() + if(.) return TRUE if(active || activating || ai_controller) balloon_alert(user, "deactivate suit first!") @@ -355,6 +375,12 @@ return FALSE /obj/item/mod/control/attackby(obj/item/attacking_item, mob/living/user, params) + if(istype(attacking_item, /obj/item/pai_card)) + if(!open) + balloon_alert(user, "open the cover first!") + return FALSE + insert_pai(user, attacking_item) + return TRUE if(istype(attacking_item, /obj/item/mod/module)) if(!open) balloon_alert(user, "open the cover first!") @@ -400,9 +426,10 @@ else return ..() -/obj/item/mod/control/emag_act(mob/user) +/obj/item/mod/control/emag_act(mob/user, obj/item/card/emag/emag_card) locked = !locked balloon_alert(user, "suit access [locked ? "locked" : "unlocked"]") + return TRUE /obj/item/mod/control/emp_act(severity) . = ..() @@ -422,6 +449,7 @@ set_wearer(user) /obj/item/mod/control/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot) + . = ..() quick_activation() /obj/item/mod/control/doStrip(mob/stripper, mob/owner) @@ -475,6 +503,7 @@ retract(null, part) if(active) finish_activation(on = FALSE) + mod_link?.end_call() var/mob/old_wearer = wearer unset_wearer() old_wearer.temporarilyRemoveItemFromInventory(src) @@ -569,6 +598,10 @@ 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!") diff --git a/code/modules/mod/mod_core.dm b/code/modules/mod/mod_core.dm index 06dace8b5b002..45fa61677b2e1 100644 --- a/code/modules/mod/mod_core.dm +++ b/code/modules/mod/mod_core.dm @@ -370,58 +370,53 @@ light_system = MOVABLE_LIGHT light_color = "#cc00cc" light_range = 2 - // Slightly better than the normal plasma core. // Not super sure if this should just be the same, but will see. maxcharge = 15000 charge = 15000 - /// The mob to be spawned by the core var/mob/living/spawned_mob_type = /mob/living/basic/butterfly/lavaland/temporary /// Max number of mobs it can spawn var/max_spawns = 3 - /// Mob spawner for the core var/datum/component/spawner/mob_spawner - + /// Particle holder for pollen particles + var/obj/effect/abstract/particle_holder/particle_effect /obj/item/mod/core/plasma/lavaland/Destroy() - if(mod?.wearer) - mod.wearer.particles = null + QDEL_NULL(particle_effect) return ..() -/obj/item/mod/core/plasma/lavaland/proc/new_mob(spawner, mob/living/basic/butterfly/lavaland/temporary/spawned) - SIGNAL_HANDLER - if(spawned) - spawned.source = src +/obj/item/mod/core/plasma/lavaland/install(obj/item/mod/control/mod_unit) + . = ..() + RegisterSignal(mod_unit, COMSIG_MOD_TOGGLED, PROC_REF(on_toggle)) + +/obj/item/mod/core/plasma/lavaland/uninstall(obj/item/mod/control/mod_unit) + . = ..() + UnregisterSignal(mod_unit, COMSIG_MOD_TOGGLED) /obj/item/mod/core/plasma/lavaland/proc/on_toggle() SIGNAL_HANDLER if(mod.active) - START_PROCESSING(SSprocessing, src) - mod.wearer.particles = new /particles/pollen() + particle_effect = new(mod.wearer, /particles/pollen, PARTICLE_ATTACH_MOB) mob_spawner = mod.wearer.AddComponent(/datum/component/spawner, spawn_types=list(spawned_mob_type), spawn_time=5 SECONDS, max_spawned=3) RegisterSignal(mob_spawner, COMSIG_SPAWNER_SPAWNED, PROC_REF(new_mob)) - RegisterSignal(mod.wearer, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(flowas)) + RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(spread_flowers)) else - STOP_PROCESSING(SSprocessing, src) - mod.wearer.particles = null + QDEL_NULL(particle_effect) UnregisterSignal(mob_spawner, COMSIG_SPAWNER_SPAWNED) - UnregisterSignal(mod.wearer, COMSIG_MOVABLE_PRE_MOVE) + UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) for(var/datum/mob in mob_spawner.spawned_things) qdel(mob) qdel(mob_spawner) -/obj/item/mod/core/plasma/lavaland/install(obj/item/mod/control/mod_unit) - . = ..() - RegisterSignal(mod_unit, COMSIG_MOD_TOGGLED, PROC_REF(on_toggle)) - -/obj/item/mod/core/plasma/lavaland/uninstall(obj/item/mod/control/mod_unit) - . = ..() - UnregisterSignal(mod_unit, COMSIG_MOD_TOGGLED) +/obj/item/mod/core/plasma/lavaland/proc/new_mob(spawner, mob/living/basic/butterfly/lavaland/temporary/spawned) + SIGNAL_HANDLER + if(spawned) + spawned.source = src -/obj/item/mod/core/plasma/lavaland/proc/flowas(mob/living/wearer) +/obj/item/mod/core/plasma/lavaland/proc/spread_flowers(atom/source, atom/oldloc, dir, forced) SIGNAL_HANDLER var/static/list/possible_flower_types = list( /obj/structure/flora/bush/lavendergrass/style_random, @@ -430,6 +425,6 @@ /obj/structure/flora/bush/flowers_pp/style_random, ) var/chosen_type = pick(possible_flower_types) - var/flower_boots = new chosen_type(get_turf(wearer)) + var/flower_boots = new chosen_type(get_turf(mod.wearer)) animate(flower_boots, alpha = 0, 1 SECONDS) QDEL_IN(flower_boots, 1 SECONDS) diff --git a/code/modules/mod/mod_link.dm b/code/modules/mod/mod_link.dm new file mode 100644 index 0000000000000..8a3340fad3e15 --- /dev/null +++ b/code/modules/mod/mod_link.dm @@ -0,0 +1,539 @@ +/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 + LAZYADD(mod_link.holder.update_on_z, link_visual) + link_visual.appearance_flags |= KEEP_TOGETHER + link_visual.makeHologram(0.75) + mod_link.visual_overlays = user.overlays - user.active_thinking_indicator + 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.RegisterSignals(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) + LAZYREMOVE(mod_link.holder.update_on_z, mod_link.visual) + 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 + SET_PLANE_IMPLICIT(other_visual, GAME_PLANE_FOV_HIDDEN) + if(newdir & SOUTH) + other_visual.pixel_y = -24 + other_visual.layer = ABOVE_ALL_MOB_LAYER + SET_PLANE_IMPLICIT(other_visual, GAME_PLANE_UPPER_FOV_HIDDEN) + new_transform.Scale(-1, 1) + new_transform.Translate(-1, 0) + if(newdir & EAST) + other_visual.pixel_x = 14 + other_visual.layer = BELOW_MOB_LAYER + SET_PLANE_IMPLICIT(other_visual, GAME_PLANE_FOV_HIDDEN) + 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 + SET_PLANE_IMPLICIT(other_visual, GAME_PLANE_FOV_HIDDEN) + 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.set_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.set_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) + . = ..() + if(speaker != wearer && speaker != ai_assistant) + return + mod_link.visual.say(raw_message, sanitize = FALSE, message_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 - wearer.active_thinking_indicator + 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 || SOUTH) + +/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(seconds_per_tick) + if(!mod_link.link_call) + return + cell.use(min(20 * seconds_per_tick, 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.set_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.set_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) + . = ..() + if(speaker != loc) + return + mod_link.visual.say(raw_message, sanitize = FALSE, message_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 - user.active_thinking_indicator + 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 || SOUTH) + +/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_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_theme.dm b/code/modules/mod/mod_theme.dm index e680bb3cc6064..716860db2dee6 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -41,6 +41,8 @@ var/slowdown_inactive = 1.25 /// Slowdown of the MOD when active. var/slowdown_active = 0.75 + /// 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. @@ -304,7 +306,7 @@ the bare essentials, geared far more for environmental hazards than combat against fauna; however, \ this gives way to incredible protection against corrosives and thermal protection good enough for \ both casual backstroking through molten magma and romantic walks through arctic terrain. \ - Instead, the suit is capable of using its' anomalous properties to attract and \ + Instead, the suit is capable of using its anomalous properties to attract and \ carefully distribute layers of ash or ice across the surface; these layers are ablative, but incredibly strong. \ Lastly, the suit is capable of compressing and shrinking the mass of the wearer, as well as \ rearranging its own constitution, to allow them to fit upright in a sphere form that can \ @@ -317,7 +319,7 @@ resistance_flags = FIRE_PROOF|LAVA_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT - complexity_max = DEFAULT_MAX_COMPLEXITY - 5 + complexity_max = DEFAULT_MAX_COMPLEXITY - 2 charge_drain = DEFAULT_CHARGE_DRAIN * 2 allowed_suit_storage = list( /obj/item/resonator, @@ -947,11 +949,13 @@ default_skin = "syndicate" armor_type = /datum/armor/mod_theme_syndicate atom_flags = PREVENT_CONTENTS_EXPLOSION_1 + complexity_max = DEFAULT_MAX_COMPLEXITY + 3 max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT siemens_coefficient = 0 slowdown_inactive = 1 slowdown_active = 0.5 ui_theme = "syndicate" + resistance_flags = FIRE_PROOF inbuilt_modules = list(/obj/item/mod/module/armor_booster) allowed_suit_storage = list( /obj/item/ammo_box, @@ -1040,6 +1044,7 @@ resistance_flags = FIRE_PROOF|ACID_PROOF atom_flags = PREVENT_CONTENTS_EXPLOSION_1 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + complexity_max = DEFAULT_MAX_COMPLEXITY + 3 siemens_coefficient = 0 slowdown_inactive = 1 slowdown_active = 0.5 @@ -1159,6 +1164,88 @@ acid = 100 wound = 25 +/datum/mod_theme/interdyne + name = "interdyne" + desc = "A corpse-snatching and rapid-retrieval modsuit, resulting from a lucrative tech exchange between Interdyne Pharmaceutics and Cybersun Industries." + extended_desc = "While Waffle Co. and Azik Interstellar provide the means, Donk Co., Tiger Cooperative, Animal Rights Consortium and \ + Gorlex Marauders willing or easily bribable brawn, S.E.L.F. and MI13 information, the clear syndicate tech providers would be Interdyne and Cybersun, \ + their combined knowledge in technologies rivaled by only the most enigmatic of aliens, and certainly not by any Nanotrasen scientist. \ + This model is one of the rare fruits created by their joint operations, mashing scrapped designs with super soldier enhancements. \ + Already light, when powered on, this MODsuit injects the wearer seemlessly with muscle-enhancing supplements, while adding piston strength \ + to their legs. The combination of these mechanisms is very energy draining - but results in next to no speed reduction for the wearer.\ + Over the years, many a rich person, including Nanotrasen officials with premium subscriptions, had their life or genes rescued thanks to the \ + unrivaled speed of this suit. Equally as many, however, mysteriously dissapeared in the flash of these white suits after they forgot \ + to pay off said subscriptions in due time or publicly communicated unfavourable opinions on Interdyne's gene-modding tech and ethics. " + default_skin = "interdyne" + armor_type = /datum/armor/mod_theme_interdyne + resistance_flags = FIRE_PROOF|ACID_PROOF + max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + charge_drain = DEFAULT_CHARGE_DRAIN * 2 + slowdown_inactive = 0.0 + slowdown_active = -0.5 + inbuilt_modules = list(/obj/item/mod/module/quick_carry/advanced, /obj/item/mod/module/organ_thrower) + allowed_suit_storage = list( + /obj/item/ammo_box, + /obj/item/ammo_casing, + /obj/item/assembly/flash, + /obj/item/healthanalyzer, + /obj/item/melee/baton, + /obj/item/melee/baton/telescopic, + /obj/item/melee/energy/sword, + /obj/item/reagent_containers/cup/beaker, + /obj/item/reagent_containers/cup/bottle, + /obj/item/reagent_containers/cup/tube, + /obj/item/reagent_containers/dropper, + /obj/item/reagent_containers/hypospray, + /obj/item/reagent_containers/pill, + /obj/item/reagent_containers/syringe, + /obj/item/restraints/handcuffs, + /obj/item/sensor_device, + /obj/item/shield/energy, + /obj/item/stack/medical, + /obj/item/storage/bag/bio, + /obj/item/storage/bag/chemistry, + /obj/item/storage/pill_bottle, + ) + skins = list( + "interdyne" = list( + HELMET_FLAGS = list( + UNSEALED_LAYER = NECK_LAYER, + UNSEALED_CLOTHING = SNUG_FIT, + 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, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + CAN_OVERSLOT = TRUE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + CAN_OVERSLOT = TRUE, + ), + ), + ) + +/datum/armor/mod_theme_interdyne + melee = 30 + bullet = 30 + laser = 30 + energy = 30 + bomb = 20 + bio = 100 + fire = 100 + acid = 100 + wound = 30 + /datum/mod_theme/enchanted name = "enchanted" desc = "The Wizard Federation's relatively low-tech MODsuit. Is very protective, though." @@ -1293,7 +1380,7 @@ post-void war era modular suit to ever be safely utilized by an operator. This ancient clunker is still functional, \ though it's missing several modern-day luxuries from updated Nakamura Engineering designs. \ Primarily, the suit's myoelectric suit layer is entirely non-existant, and the servos do very little to \ - help distribute the weight evenly across the wearer's body, making it slow and bulky to move in. \ + help distribute the weight evenly across the wearer's body when the suit is deactivated, making it slow and bulky to move in. \ 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" @@ -1302,10 +1389,10 @@ siemens_coefficient = 0 complexity_max = DEFAULT_MAX_COMPLEXITY + 5 charge_drain = DEFAULT_CHARGE_DRAIN * 2 - slowdown_inactive = 2 - slowdown_active = 1.5 + slowdown_inactive = 1.5 + slowdown_active = 1 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/analyzer, /obj/item/t_scanner, @@ -1352,7 +1439,7 @@ /datum/mod_theme/responsory name = "responsory" - desc = "A high-speed rescue suit by Nanotrasen, intended for its' emergency response teams." + desc = "A high-speed rescue suit by Nanotrasen, intended for its emergency response teams." extended_desc = "A streamlined suit of Nanotrasen design, these sleek black suits are only worn by \ elite emergency response personnel to help save the day. While the slim and nimble design of the suit \ cuts the ceramics and ablatives in it down, dropping the protection, \ @@ -1633,6 +1720,7 @@ siemens_coefficient = 0 slowdown_inactive = 0.5 slowdown_active = 0 + activation_step_time = MOD_ACTIVATION_STEP_TIME * 0.2 allowed_suit_storage = list( /obj/item/gun, ) @@ -1692,6 +1780,7 @@ siemens_coefficient = 0 slowdown_inactive = 0 slowdown_active = 0 + activation_step_time = MOD_ACTIVATION_STEP_TIME * 0.01 allowed_suit_storage = list( /obj/item/gun, ) diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index faf711e4f6226..f8daa9bab544f 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. @@ -52,10 +53,13 @@ /obj/item/mod/module/welding, /obj/item/mod/module/rad_protection, /obj/item/mod/module/flashlight, + /obj/item/mod/module/tether, /obj/item/mod/module/magboot, ) default_pins = list( /obj/item/mod/module/magboot, + /obj/item/mod/module/flashlight, + /obj/item/mod/module/tether, ) /obj/item/mod/control/pre_equipped/atmospheric @@ -65,7 +69,13 @@ /obj/item/mod/module/welding, /obj/item/mod/module/rad_protection, /obj/item/mod/module/flashlight, + /obj/item/mod/module/magboot, /obj/item/mod/module/t_ray, + /obj/item/mod/module/quick_carry, + ) + default_pins = list( + /obj/item/mod/module/magboot, + /obj/item/mod/module/flashlight, ) /obj/item/mod/control/pre_equipped/advanced @@ -79,8 +89,9 @@ /obj/item/mod/module/jetpack, ) default_pins = list( - /obj/item/mod/module/jetpack, /obj/item/mod/module/magboot/advanced, + /obj/item/mod/module/flashlight, + /obj/item/mod/module/jetpack, ) /obj/item/mod/control/pre_equipped/loader @@ -106,6 +117,7 @@ /obj/item/mod/module/orebag, /obj/item/mod/module/clamp, /obj/item/mod/module/drill, + /obj/item/mod/module/mouthhole, ) default_pins = list( /obj/item/mod/module/gps, @@ -194,6 +206,7 @@ /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 applied_modules = list( /obj/item/mod/module/storage/syndicate, @@ -211,22 +224,26 @@ /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 applied_modules = list( /obj/item/mod/module/storage/syndicate, /obj/item/mod/module/emp_shield, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/jump_jet, /obj/item/mod/module/flashlight, /obj/item/mod/module/dna_lock, ) default_pins = list( /obj/item/mod/module/armor_booster, /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/jump_jet, ) /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) applied_modules = list( @@ -234,18 +251,33 @@ /obj/item/mod/module/emp_shield, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/jump_jet, /obj/item/mod/module/flashlight, ) default_pins = list( /obj/item/mod/module/armor_booster, /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/jump_jet, ) +/obj/item/mod/control/pre_equipped/nuclear/no_jetpack + +/obj/item/mod/control/pre_equipped/nuclear/no_jetpack/Initialize(mapload, new_theme, new_skin, new_core) + applied_modules -= list(/obj/item/mod/module/jetpack/advanced, /obj/item/mod/module/jump_jet) + return ..() + +/obj/item/mod/control/pre_equipped/nuclear/plasmaman + +/obj/item/mod/control/pre_equipped/nuclear/plasmaman/Initialize(mapload, new_theme, new_skin, new_core) + applied_modules += /obj/item/mod/module/plasma_stabilizer + return ..() + /obj/item/mod/control/pre_equipped/nuclear/unrestricted req_access = null /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) applied_modules = list( @@ -253,11 +285,13 @@ /obj/item/mod/module/emp_shield, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/jump_jet, /obj/item/mod/module/flashlight, ) default_pins = list( /obj/item/mod/module/armor_booster, /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/jump_jet, ) /obj/item/mod/control/pre_equipped/elite/flamethrower @@ -267,17 +301,20 @@ /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/thermal_regulator, /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/jump_jet, /obj/item/mod/module/flashlight, /obj/item/mod/module/flamethrower, ) default_pins = list( /obj/item/mod/module/armor_booster, /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/jump_jet, /obj/item/mod/module/flamethrower, ) /obj/item/mod/control/pre_equipped/infiltrator theme = /datum/mod_theme/infiltrator + starting_frequency = MODLINK_FREQ_SYNDICATE applied_cell = /obj/item/stock_parts/cell/super applied_modules = list( /obj/item/mod/module/emp_shield, @@ -286,8 +323,24 @@ /obj/item/mod/module/visor/diaghud, ) + +/obj/item/mod/control/pre_equipped/interdyne + theme = /datum/mod_theme/interdyne + starting_frequency = MODLINK_FREQ_SYNDICATE + applied_cell = /obj/item/stock_parts/cell/super + applied_modules = list( + /obj/item/mod/module/defibrillator/combat, + /obj/item/mod/module/flashlight, + /obj/item/mod/module/health_analyzer, + /obj/item/mod/module/injector, + /obj/item/mod/module/surgical_processor/preloaded, + /obj/item/mod/module/storage/syndicate, + /obj/item/mod/module/tether + ) + /obj/item/mod/control/pre_equipped/enchanted theme = /datum/mod_theme/enchanted + starting_frequency = null applied_core = /obj/item/mod/core/infinite applied_modules = list( /obj/item/mod/module/storage/large_capacity, @@ -297,11 +350,12 @@ /obj/item/mod/control/pre_equipped/ninja theme = /datum/mod_theme/ninja + starting_frequency = null applied_cell = /obj/item/stock_parts/cell/ninja applied_modules = list( /obj/item/mod/module/storage, /obj/item/mod/module/noslip, - /obj/item/mod/module/status_readout, + /obj/item/mod/module/status_readout/ninja, /obj/item/mod/module/stealth/ninja, /obj/item/mod/module/dispenser/ninja, /obj/item/mod/module/dna_lock/reinforced, @@ -318,6 +372,7 @@ /obj/item/mod/control/pre_equipped/prototype theme = /datum/mod_theme/prototype + starting_frequency = MODLINK_FREQ_CHARLIE req_access = list(ACCESS_AWAY_GENERAL) applied_modules = list( /obj/item/mod/module/storage, @@ -328,11 +383,12 @@ ) default_pins = list( /obj/item/mod/module/tether, - /obj/item/mod/module/anomaly_locked/kinesis/prebuilt/prototype, + /obj/item/mod/module/anomaly_locked/kinesis/prototype, ) /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) applied_modules = list( @@ -411,6 +467,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) applied_modules = list( @@ -436,6 +493,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) applied_modules = list( @@ -447,6 +505,7 @@ /obj/item/mod/control/pre_equipped/chrono theme = /datum/mod_theme/chrono + starting_frequency = null applied_core = /obj/item/mod/core/infinite applied_modules = list( /obj/item/mod/module/eradication_lock, @@ -467,6 +526,7 @@ /obj/item/mod/control/pre_equipped/debug theme = /datum/mod_theme/debug + starting_frequency = null applied_core = /obj/item/mod/core/infinite applied_modules = list( //one of every type of module, for testing if they all work correctly /obj/item/mod/module/storage/bluespace, @@ -480,6 +540,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 applied_modules = list( /obj/item/mod/module/storage/bluespace, @@ -489,17 +550,18 @@ /obj/item/mod/module/quick_carry/advanced, /obj/item/mod/module/magboot/advanced, /obj/item/mod/module/jetpack/advanced, - /obj/item/mod/module/anomaly_locked/kinesis/plus, + /obj/item/mod/module/anomaly_locked/kinesis/admin, ) default_pins = list( /obj/item/mod/module/stealth/ninja, /obj/item/mod/module/magboot/advanced, /obj/item/mod/module/jetpack/advanced, - /obj/item/mod/module/anomaly_locked/kinesis/plus, + /obj/item/mod/module/anomaly_locked/kinesis/admin, ) //these exist for the prefs menu /obj/item/mod/control/pre_equipped/empty + starting_frequency = null /obj/item/mod/control/pre_equipped/empty/syndicate theme = /datum/mod_theme/syndicate diff --git a/code/modules/mod/mod_ui.dm b/code/modules/mod/mod_ui.dm index 12fcca6e7e8a3..eaf4b75d7ee70 100644 --- a/code/modules/mod/mod_ui.dm +++ b/code/modules/mod/mod_ui.dm @@ -6,21 +6,40 @@ /obj/item/mod/control/ui_data(mob/user) var/data = list() - data["interface_break"] = interface_break - data["malfunctioning"] = malfunctioning - data["open"] = open - data["active"] = active - data["locked"] = locked - data["complexity"] = complexity - data["selected_module"] = selected_module?.name - 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 - data["core"] = core?.name - data["charge"] = get_charge_percent() - data["modules"] = list() + // Suit information + var/suit_status = list( + "core_name" = core?.name, + "cell_charge_current" = get_charge(), + "cell_charge_max" = get_max_charge(), + "active" = active, + "ai_name" = ai_assistant?.name, + "has_pai" = ispAI(ai_assistant), + "is_ai" = ai_assistant && ai_assistant == user, + "link_id" = mod_link.id, + "link_freq" = mod_link.frequency, + "link_call" = mod_link.get_other()?.id, + // Wires + "open" = open, + "seconds_electrified" = seconds_electrified, + "malfunctioning" = malfunctioning, + "locked" = locked, + "interface_break" = interface_break, + // Modules + "complexity" = complexity, + ) + data["suit_status"] = suit_status + // User information + var/user_status = list( + "user_name" = wearer ? (wearer.get_authentification_name("Unknown") || "Unknown") : "", + "user_assignment" = wearer ? wearer.get_assignment("Unknown", "Unknown", FALSE) : "", + ) + data["user_status"] = user_status + // Module information + var/module_custom_status = list() + var/module_info = list() for(var/obj/item/mod/module/module as anything in modules) - var/list/module_data = list( + module_custom_status += module.add_ui_data() + module_info += list(list( "module_name" = module.name, "description" = module.desc, "module_type" = module.module_type, @@ -35,9 +54,9 @@ "id" = module.tgui_id, "ref" = REF(module), "configuration_data" = module.get_configuration() - ) - module_data += module.add_ui_data() - data["modules"] += list(module_data) + )) + data["module_custom_status"] = module_custom_status + data["module_info"] = module_info return data /obj/item/mod/control/ui_static_data(mob/user) @@ -51,14 +70,15 @@ data["boots"] = boots?.name return data +/obj/item/mod/control/ui_state(mob/user) + if(user == ai_assistant) + return GLOB.contained_state + return ..() + /obj/item/mod/control/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return - if(locked && !allowed(usr)) - balloon_alert(usr, "insufficient access!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return if(malfunctioning && prob(75)) balloon_alert(usr, "button malfunctions!") return @@ -66,6 +86,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") @@ -83,4 +108,8 @@ if(!module) return module.pin(usr) + if("eject_pai") + if (!ishuman(usr)) + return + remove_pai(usr) return TRUE diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm index 36f0f84d2013a..070d8127c5e38 100644 --- a/code/modules/mod/modules/_module.dm +++ b/code/modules/mod/modules/_module.dm @@ -84,6 +84,13 @@ on_use() SEND_SIGNAL(mod, COMSIG_MOD_MODULE_SELECTED, src) +/// Apply a cooldown until this item can be used again +/obj/item/mod/module/proc/start_cooldown(applied_cooldown) + if (isnull(applied_cooldown)) + applied_cooldown = cooldown_time + COOLDOWN_START(src, cooldown_timer, applied_cooldown) + SEND_SIGNAL(src, COMSIG_MODULE_COOLDOWN_STARTED, applied_cooldown) + /// Called when the module is activated /obj/item/mod/module/proc/on_activation() if(!COOLDOWN_FINISHED(src, cooldown_timer)) @@ -96,7 +103,7 @@ //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) + if(SEND_SIGNAL(src, COMSIG_MODULE_TRIGGERED, mod.wearer) & MOD_ABORT_USE) return FALSE if(module_type == MODULE_ACTIVE) if(mod.selected_module && !mod.selected_module.on_deactivation(display_message = FALSE)) @@ -116,8 +123,8 @@ 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_clothing(mod.slot_flags) + start_cooldown() SEND_SIGNAL(src, COMSIG_MODULE_ACTIVATED) return TRUE @@ -136,7 +143,7 @@ UnregisterSignal(mod.wearer, used_signal) used_signal = null mod.wearer.update_clothing(mod.slot_flags) - SEND_SIGNAL(src, COMSIG_MODULE_DEACTIVATED) + SEND_SIGNAL(src, COMSIG_MODULE_DEACTIVATED, mod.wearer) return TRUE /// Called when the module is used @@ -151,9 +158,9 @@ //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) + if(SEND_SIGNAL(src, COMSIG_MODULE_TRIGGERED, mod.wearer) & MOD_ABORT_USE) return FALSE - COOLDOWN_START(src, cooldown_timer, cooldown_time) + start_cooldown() addtimer(CALLBACK(mod.wearer, TYPE_PROC_REF(/mob, update_clothing), mod.slot_flags), cooldown_time+1) //need to run it a bit after the cooldown starts to avoid conflicts mod.wearer.update_clothing(mod.slot_flags) SEND_SIGNAL(src, COMSIG_MODULE_USED) diff --git a/code/modules/mod/modules/module_kinesis.dm b/code/modules/mod/modules/module_kinesis.dm index 8fe4ba9f07c08..ff56a2329c697 100644 --- a/code/modules/mod/modules/module_kinesis.dm +++ b/code/modules/mod/modules/module_kinesis.dm @@ -21,8 +21,6 @@ var/hit_cooldown_time = 1 SECONDS /// Stat required for us to grab a mob. var/stat_required = DEAD - /// How long we stun a mob for. - var/mob_stun_time = 5 SECONDS /// Atom we grabbed with kinesis. var/atom/movable/grabbed_atom /// Ref of the beam following the grabbed atom. @@ -51,8 +49,9 @@ 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!") @@ -61,20 +60,7 @@ balloon_alert(mod.wearer, "can't grab!") return drain_power(use_power_cost) - grabbed_atom = target - if(isliving(grabbed_atom)) - var/mob/living/grabbed_mob = grabbed_atom - grabbed_mob.Stun(mob_stun_time) - 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", offset_spokesman = grabbed_atom) - 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) - soundloop.start() - START_PROCESSING(SSfastprocess, src) + grab_atom(target) /obj/item/mod/module/anomaly_locked/kinesis/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() @@ -158,6 +144,8 @@ if(!isliving(movable_target)) return FALSE var/mob/living/living_target = movable_target + if(living_target.buckled) + return FALSE if(living_target.stat < stat_required) return FALSE else if(isitem(movable_target)) @@ -168,9 +156,29 @@ return FALSE return TRUE +/obj/item/mod/module/anomaly_locked/kinesis/proc/grab_atom(atom/movable/target) + grabbed_atom = target + if(isliving(grabbed_atom)) + grabbed_atom.add_traits(list(TRAIT_IMMOBILIZED, 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", offset_spokesman = grabbed_atom) + 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(SSfastprocess, 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) @@ -178,6 +186,9 @@ mod.wearer.clear_fullscreen("kinesis") grabbed_atom.cut_overlay(kinesis_icon) QDEL_NULL(kinesis_beam) + if(isliving(grabbed_atom)) + grabbed_atom.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), REF(src)) + REMOVE_TRAIT(grabbed_atom, TRAIT_NO_FLOATING_ANIM, REF(src)) 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 @@ -192,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) @@ -215,25 +246,88 @@ if(damage_self && source.uses_integrity) source.take_damage(source.max_integrity/5, BRUTE, MELEE) +/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/cursor_catcher/kinesis - icon_state = "kinesis" - /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 it's creators - living \ - beings. They can, however, still struggle after an initial burst of inertia." + structures, machinery, vehicles, and, thanks to the fruitful efforts of its creators - living beings." complexity = 0 prebuilt = TRUE stat_required = CONSCIOUS + +/// 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 + +/obj/item/mod/module/anomaly_locked/kinesis/admin/grab_atom(atom/movable/target) + . = ..() + if(phasing) + ADD_TRAIT(grabbed_atom, TRAIT_MOVE_PHASING, REF(src)) + +/obj/item/mod/module/anomaly_locked/kinesis/admin/clear_grab(playsound) + . = ..() + if(!.) + return + 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 5f40982e9e903..85d1ce7a00a01 100644 --- a/code/modules/mod/modules/module_pathfinder.dm +++ b/code/modules/mod/modules/module_pathfinder.dm @@ -10,7 +10,7 @@ The implant is stored in the module and needs to be injected in a human to function. \ Nakamura Engineering swears up and down there's airbrakes." icon_state = "pathfinder" - complexity = 2 + complexity = 1 use_power_cost = DEFAULT_CHARGE_DRAIN * 10 incompatible_modules = list(/obj/item/mod/module/pathfinder) /// The pathfinding implant. @@ -21,9 +21,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) @@ -45,8 +55,6 @@ else target.visible_message(span_notice("[user] implants [target]."), span_notice("[user] implants you with [implant].")) 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)) diff --git a/code/modules/mod/modules/modules_antag.dm b/code/modules/mod/modules/modules_antag.dm index ce438fed83f52..1cd70ef9f80d5 100644 --- a/code/modules/mod/modules/modules_antag.dm +++ b/code/modules/mod/modules/modules_antag.dm @@ -503,3 +503,19 @@ if(deleting) return mod.helmet.flash_protect = initial(mod.helmet.flash_protect) + +///Medbeam - Medbeam but built into a modsuit +/obj/item/mod/module/medbeam + name = "MOD Medbeam Module" + desc = "A wrist mounted variant of the medbeam gun, allowing the user to heal their allies without the risk of dropping it." + icon_state = "chronogun" + module_type = MODULE_ACTIVE + complexity = 1 + active_power_cost = DEFAULT_CHARGE_DRAIN + device = /obj/item/gun/medbeam/mod + incompatible_modules = list(/obj/item/mod/module/medbeam) + removable = TRUE + cooldown_time = 0.5 + +/obj/item/gun/medbeam/mod + name = "MOD medbeam" diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm index 4531b84f15a75..9c1f5e65d78a5 100644 --- a/code/modules/mod/modules/modules_engineering.dm +++ b/code/modules/mod/modules/modules_engineering.dm @@ -85,7 +85,7 @@ these are only capable of working in zero-gravity environments, a blessing to some Engineers." icon_state = "tether" module_type = MODULE_ACTIVE - complexity = 3 + complexity = 2 use_power_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/tether) cooldown_time = 1.5 SECONDS @@ -124,7 +124,7 @@ /obj/projectile/tether/fire(setAngle) if(firer) line = firer.Beam(src, "line", 'icons/obj/clothing/modsuit/mod_modules.dmi', emissive = FALSE) - ..() + return ..() /obj/projectile/tether/on_hit(atom/target) . = ..() @@ -165,10 +165,10 @@ /obj/item/mod/module/rad_protection/add_ui_data() . = ..() - .["userradiated"] = mod.wearer ? HAS_TRAIT(mod.wearer, TRAIT_IRRADIATED) : FALSE - .["usertoxins"] = mod.wearer?.getToxLoss() || 0 - .["usermaxtoxins"] = mod.wearer?.getMaxHealth() || 0 - .["threatlevel"] = perceived_threat_level + .["is_user_irradiated"] = mod.wearer ? HAS_TRAIT(mod.wearer, TRAIT_IRRADIATED) : FALSE + .["background_radiation_level"] = perceived_threat_level + .["health_max"] = mod.wearer?.getMaxHealth() || 0 + .["loss_tox"] = mod.wearer?.getToxLoss() || 0 /obj/item/mod/module/rad_protection/proc/on_pre_potential_irradiation(datum/source, datum/radiation_pulse_information/pulse_information, insulation_to_target) SIGNAL_HANDLER diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm index 65f7eb7c19145..6d47a5b60ba3b 100644 --- a/code/modules/mod/modules/modules_general.dm +++ b/code/modules/mod/modules/modules_general.dm @@ -14,22 +14,25 @@ var/max_combined_w_class = 15 /// Max amount of items in the storage. var/max_items = 7 + /// Is nesting same-size storage items allowed? + var/big_nesting = FALSE /obj/item/mod/module/storage/Initialize(mapload) . = ..() create_storage(max_specific_storage = max_w_class, max_total_storage = max_combined_w_class, max_slots = max_items) atom_storage.allow_big_nesting = TRUE - atom_storage.locked = TRUE + atom_storage.locked = STORAGE_FULLY_LOCKED /obj/item/mod/module/storage/on_install() var/datum/storage/modstorage = mod.create_storage(max_specific_storage = max_w_class, max_total_storage = max_combined_w_class, max_slots = max_items) modstorage.set_real_location(src) - atom_storage.locked = FALSE + modstorage.allow_big_nesting = big_nesting + atom_storage.locked = STORAGE_NOT_LOCKED RegisterSignal(mod.chestplate, COMSIG_ITEM_PRE_UNEQUIP, PROC_REF(on_chestplate_unequip)) /obj/item/mod/module/storage/on_uninstall(deleting = FALSE) var/datum/storage/modstorage = mod.atom_storage - atom_storage.locked = TRUE + atom_storage.locked = STORAGE_FULLY_LOCKED qdel(modstorage) if(!deleting) atom_storage.remove_all(get_turf(src)) @@ -38,9 +41,12 @@ /obj/item/mod/module/storage/proc/on_chestplate_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.")) - if(atom_storage?.attempt_insert(mod.wearer.s_store, mod.wearer, override = TRUE)) - mod.wearer.temporarilyRemoveItemFromInventory(mod.wearer.s_store) + 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" @@ -80,6 +86,7 @@ max_w_class = WEIGHT_CLASS_GIGANTIC max_combined_w_class = 60 max_items = 21 + big_nesting = TRUE ///Ion Jetpack - Lets the user fly freely through space using battery charge. /obj/item/mod/module/jetpack @@ -96,32 +103,40 @@ cooldown_time = 0.5 SECONDS overlay_state_inactive = "module_jetpack" overlay_state_active = "module_jetpack_on" - /// Do we stop the wearer from gliding in space. - var/stabilizers = FALSE /// Do we give the wearer a speed buff. var/full_speed = FALSE - var/datum/callback/get_mover - var/datum/callback/check_on_move + /// Do we have stabilizers? If yes the user won't move from inertia. + var/stabilize = TRUE + /// Callback to see if we can thrust the user. + var/thrust_callback /obj/item/mod/module/jetpack/Initialize(mapload) . = ..() - get_mover = CALLBACK(src, PROC_REF(get_user)) - check_on_move = CALLBACK(src, PROC_REF(allow_thrust)) - refresh_jetpack() + thrust_callback = CALLBACK(src, PROC_REF(allow_thrust)) + configure_jetpack(stabilize) /obj/item/mod/module/jetpack/Destroy() - get_mover = null - check_on_move = null + thrust_callback = null return ..() -/obj/item/mod/module/jetpack/proc/refresh_jetpack() - AddComponent(/datum/component/jetpack, stabilizers, COMSIG_MODULE_TRIGGERED, COMSIG_MODULE_DEACTIVATED, MOD_ABORT_USE, get_mover, check_on_move, /datum/effect_system/trail_follow/ion/grav_allowed) - -/obj/item/mod/module/jetpack/proc/set_stabilizers(new_stabilizers) - if(stabilizers == new_stabilizers) - return - stabilizers = new_stabilizers - refresh_jetpack() +/** + * configures/re-configures the jetpack component + * + * Arguments + * stabilize - Should this jetpack be stabalized + */ +/obj/item/mod/module/jetpack/proc/configure_jetpack(stabilize) + src.stabilize = stabilize + + AddComponent( \ + /datum/component/jetpack, \ + src.stabilize, \ + COMSIG_MODULE_TRIGGERED, \ + COMSIG_MODULE_DEACTIVATED, \ + MOD_ABORT_USE, \ + thrust_callback, \ + /datum/effect_system/trail_follow/ion/grav_allowed \ + ) /obj/item/mod/module/jetpack/on_activation() . = ..() @@ -137,12 +152,12 @@ /obj/item/mod/module/jetpack/get_configuration() . = ..() - .["stabilizers"] = add_ui_configuration("Stabilizers", "bool", stabilizers) + .["stabilizers"] = add_ui_configuration("Stabilizers", "bool", stabilize) /obj/item/mod/module/jetpack/configure_edit(key, value) switch(key) if("stabilizers") - set_stabilizers(text2num(value)) + configure_jetpack(text2num(value)) /obj/item/mod/module/jetpack/proc/allow_thrust(use_fuel = TRUE) if(!use_fuel) @@ -151,18 +166,136 @@ return FALSE return TRUE -/obj/item/mod/module/jetpack/proc/get_user() - return mod.wearer - /obj/item/mod/module/jetpack/advanced name = "MOD advanced ion jetpack module" desc = "An improvement on the previous model of electric thrusters. This one achieves higher speeds through \ - mounting of more jets and a red paint applied on it." + mounting of more jets and application of red paint." icon_state = "jetpack_advanced" overlay_state_inactive = "module_jetpackadv" overlay_state_active = "module_jetpackadv_on" full_speed = TRUE +/// Cooldown to use if we didn't actually launch a jump jet +#define FAILED_ACTIVATION_COOLDOWN 3 SECONDS + +///Jump Jet - Briefly removes the effect of gravity and pushes you up one z-level if possible. +/obj/item/mod/module/jump_jet + name = "MOD ionic jump jet module" + desc = "A specialised ionic thruster which provides a short but powerful boost capable of pushing against gravity, \ + after which time it needs to recharge." + icon_state = "jump_jet" + module_type = MODULE_USABLE + complexity = 3 + cooldown_time = 30 SECONDS + use_power_cost = DEFAULT_CHARGE_DRAIN * 5 + incompatible_modules = list(/obj/item/mod/module/jump_jet) + +/obj/item/mod/module/jump_jet/on_use() + . = ..() + if (!.) + return FALSE + if (DOING_INTERACTION(mod.wearer, mod.wearer)) + balloon_alert(mod.wearer, "busy!") + return + balloon_alert(mod.wearer, "launching...") + mod.wearer.Shake(duration = 1 SECONDS) + if (!do_after(mod.wearer, 1 SECONDS, target = mod.wearer)) + start_cooldown(FAILED_ACTIVATION_COOLDOWN) // Don't go on full cooldown if we failed to launch + return FALSE + playsound(mod.wearer, 'sound/vehicles/rocketlaunch.ogg', 100, TRUE) + mod.wearer.apply_status_effect(/datum/status_effect/jump_jet) + var/turf/launch_from = get_turf(mod.wearer) + if (mod.wearer.zMove(UP, z_move_flags = ZMOVE_CHECK_PULLS)) + launch_from.visible_message(span_warning("[mod.wearer] rockets into the air!")) + new /obj/effect/temp_visual/jet_plume(launch_from) + + var/obj/item/mod/module/jetpack/linked_jetpack = locate() in mod.modules + if (!isnull(linked_jetpack) && !linked_jetpack.active) + linked_jetpack.on_activation() + return TRUE + +#undef FAILED_ACTIVATION_COOLDOWN + +///Status Readout - Puts a lot of information including health, nutrition, fingerprints, temperature to the suit TGUI. +/obj/item/mod/module/status_readout + name = "MOD status readout module" + desc = "A once-common module, this technology unfortunately went out of fashion in the safer regions of space; \ + and found new life in the research networks of the Periphery. This particular unit hooks into the suit's spine, \ + capable of capturing and displaying all possible biometric data of the wearer; sleep, nutrition, fitness, fingerprints, \ + and even useful information such as their overall health and wellness. The vitals monitor also comes with a speaker, loud enough \ + to alert anyone nearby that someone has, in fact, died." + icon_state = "status" + complexity = 1 + use_power_cost = DEFAULT_CHARGE_DRAIN * 0.1 + incompatible_modules = list(/obj/item/mod/module/status_readout) + tgui_id = "status_readout" + /// Does this show damage types, body temp, satiety + var/display_detailed_vitals = TRUE + /// Does this show DNA data + var/display_dna = FALSE + /// Does this show the round ID and shift time? + var/display_time = FALSE + /// Death sound. May or may not be funny. Vareditable at your own risk. + var/death_sound = 'sound/effects/flatline3.ogg' + /// Death sound volume. Please be responsible with this. + var/death_sound_volume = 50 + +/obj/item/mod/module/status_readout/add_ui_data() + . = ..() + .["display_time"] = display_time + .["shift_time"] = station_time_timestamp() + .["shift_id"] = GLOB.round_id + .["health"] = mod.wearer?.health || 0 + .["health_max"] = mod.wearer?.getMaxHealth() || 0 + if(display_detailed_vitals) + .["loss_brute"] = mod.wearer?.getBruteLoss() || 0 + .["loss_fire"] = mod.wearer?.getFireLoss() || 0 + .["loss_tox"] = mod.wearer?.getToxLoss() || 0 + .["loss_oxy"] = mod.wearer?.getOxyLoss() || 0 + .["body_temperature"] = mod.wearer?.bodytemperature || 0 + .["nutrition"] = mod.wearer?.nutrition || 0 + if(display_dna) + .["dna_unique_identity"] = mod.wearer ? md5(mod.wearer.dna.unique_identity) : null + .["dna_unique_enzymes"] = mod.wearer?.dna.unique_enzymes + .["viruses"] = null + if(!length(mod.wearer?.diseases)) + return . + var/list/viruses = list() + for(var/datum/disease/virus as anything in mod.wearer.diseases) + var/list/virus_data = list() + virus_data["name"] = virus.name + virus_data["type"] = virus.spread_text + virus_data["stage"] = virus.stage + virus_data["maxstage"] = virus.max_stages + virus_data["cure"] = virus.cure_text + viruses += list(virus_data) + .["viruses"] = viruses + + return . + +/obj/item/mod/module/status_readout/get_configuration() + . = ..() + .["display_detailed_vitals"] = add_ui_configuration("Detailed Vitals", "bool", display_detailed_vitals) + .["display_dna"] = add_ui_configuration("DNA Information", "bool", display_dna) + +/obj/item/mod/module/status_readout/configure_edit(key, value) + switch(key) + if("display_detailed_vitals") + display_detailed_vitals = text2num(value) + if("display_dna") + display_dna = text2num(value) + +/obj/item/mod/module/status_readout/on_suit_activation() + RegisterSignal(mod.wearer, COMSIG_LIVING_DEATH, PROC_REF(death_sound)) + +/obj/item/mod/module/status_readout/on_suit_deactivation(deleting) + UnregisterSignal(mod.wearer, COMSIG_LIVING_DEATH) + +/obj/item/mod/module/status_readout/proc/death_sound(mob/living/carbon/human/wearer) + SIGNAL_HANDLER + if(death_sound && death_sound_volume) + playsound(wearer, death_sound, death_sound_volume, FALSE) + ///Eating Apparatus - Lets the user eat/drink with the suit on. /obj/item/mod/module/mouthhole name = "MOD eating apparatus module" @@ -181,8 +314,8 @@ /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 + mod.helmet.flags_cover &= ~(HEADCOVERSMOUTH|PEPPERPROOF) + mod.helmet.visor_flags_cover &= ~(HEADCOVERSMOUTH|PEPPERPROOF) /obj/item/mod/module/mouthhole/on_uninstall(deleting = FALSE) if(deleting) @@ -358,7 +491,7 @@ ensuring they're comfortable; even if they're some that like it hot." icon_state = "regulator" module_type = MODULE_TOGGLE - complexity = 2 + complexity = 1 active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 incompatible_modules = list(/obj/item/mod/module/thermal_regulator) cooldown_time = 0.5 SECONDS @@ -389,7 +522,7 @@ however, this incredibly sensitive module is shorted out by EMPs. Luckily, cloning has been outlawed." icon_state = "dnalock" module_type = MODULE_USABLE - complexity = 2 + complexity = 1 use_power_cost = DEFAULT_CHARGE_DRAIN * 3 incompatible_modules = list(/obj/item/mod/module/dna_lock, /obj/item/mod/module/eradication_lock) cooldown_time = 0.5 SECONDS @@ -418,13 +551,11 @@ /obj/item/mod/module/dna_lock/emp_act(severity) . = ..() - if(. & EMP_PROTECT_SELF) - return - on_emp(src, severity) + on_emp(src, severity, .) /obj/item/mod/module/dna_lock/emag_act(mob/user, obj/item/card/emag/emag_card) . = ..() - on_emag(src, user, emag_card) + return on_emag(src, user, emag_card) /obj/item/mod/module/dna_lock/proc/dna_check(mob/user) if(!iscarbon(user)) @@ -435,15 +566,17 @@ balloon_alert(user, "dna locked!") return FALSE -/obj/item/mod/module/dna_lock/proc/on_emp(datum/source, severity) +/obj/item/mod/module/dna_lock/proc/on_emp(datum/source, severity, protection) SIGNAL_HANDLER - + if(protection & EMP_PROTECT_SELF) + return dna = null /obj/item/mod/module/dna_lock/proc/on_emag(datum/source, mob/user, obj/item/card/emag/emag_card) SIGNAL_HANDLER dna = null + return TRUE /obj/item/mod/module/dna_lock/proc/on_mod_activation(datum/source, mob/user) SIGNAL_HANDLER @@ -471,6 +604,11 @@ incompatible_modules = list(/obj/item/mod/module/plasma_stabilizer) overlay_state_inactive = "module_plasma" +/obj/item/mod/module/plasma_stabilizer/generate_worn_overlay() + if(locate(/obj/item/mod/module/infiltrator) in mod.modules) + return list() + return ..() + /obj/item/mod/module/plasma_stabilizer/on_equip() ADD_TRAIT(mod.wearer, TRAIT_NOSELFIGNITION_HEAD_ONLY, MOD_TRAIT) @@ -483,45 +621,18 @@ /obj/item/mod/module/hat_stabilizer name = "MOD hat stabilizer module" desc = "A simple set of deployable stands, directly atop one's head; \ - these will deploy under a select few hats to keep them from falling off, allowing them to be worn atop the sealed helmet. \ + these will deploy under a hat to keep it from falling off, allowing them to be worn atop the sealed helmet. \ You still need to take the hat off your head while the helmet deploys, though. \ This is a must-have for Nanotrasen Captains, enabling them to show off their authoritative hat even while in their MODsuit." icon_state = "hat_holder" 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 - -/obj/item/mod/module/hat_stabilizer/Initialize(mapload) - . = ..() - attachable_hats_list = typecacheof( - //List of attachable hats. Make sure these and their subtypes are all tested, so they dont appear janky. - //This list should also be gimmicky, so captains can have fun. I.E. the Santahat, Pirate hat, Tophat, Chefhat... - //Yes, I said it, the captain should have fun. - list( - /obj/item/clothing/head/hats/caphat, - /obj/item/clothing/head/costume/crown, - /obj/item/clothing/head/hats/centhat, - /obj/item/clothing/head/hats/centcom_cap, - /obj/item/clothing/head/costume/pirate, - /obj/item/clothing/head/costume/santa, - /obj/item/clothing/head/utility/hardhat/reindeer, - /obj/item/clothing/head/costume/sombrero/green, - /obj/item/clothing/head/costume/kitty, - /obj/item/clothing/head/costume/rabbitears, - /obj/item/clothing/head/costume/festive, - /obj/item/clothing/head/costume/powdered_wig, - /obj/item/clothing/head/costume/weddingveil, - /obj/item/clothing/head/hats/tophat, - /obj/item/clothing/head/costume/nursehat, - /obj/item/clothing/head/utility/chefhat, - /obj/item/clothing/head/costume/papersack, - /obj/item/clothing/head/caphat/beret, - /obj/item/clothing/head/helmet/space/beret, - )) + /// 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/on_suit_activation() RegisterSignal(mod.helmet, COMSIG_ATOM_EXAMINE, PROC_REF(add_examine)) @@ -548,17 +659,22 @@ 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 - if(!is_type_in_typecache(hitting_item, attachable_hats_list)) - balloon_alert(user, "this hat won't fit!") - return 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 + former_flags = mod.helmet.flags_cover + former_visor_flags = mod.helmet.visor_flags_cover + mod.helmet.flags_cover |= attached_hat.flags_cover + mod.helmet.visor_flags_cover |= attached_hat.visor_flags_cover balloon_alert(user, "hat attached, right-click to remove") mod.wearer.update_clothing(mod.slot_flags) @@ -578,6 +694,8 @@ else balloon_alert_to_viewers("the hat falls to the floor!") attached_hat = null + mod.helmet.flags_cover = former_flags + mod.helmet.visor_flags_cover = former_visor_flags mod.wearer.update_clothing(mod.slot_flags) ///Sign Language Translator - allows people to sign over comms using the modsuit's gloves. @@ -596,3 +714,198 @@ /obj/item/mod/module/signlang_radio/on_suit_deactivation(deleting = FALSE) REMOVE_TRAIT(mod.wearer, TRAIT_CAN_SIGN_ON_COMMS, MOD_TRAIT) + +///A module that recharges the suit by an itsy tiny bit whenever the user takes a step. Originally called "magneto module" but the videogame reference sounds cooler. +/obj/item/mod/module/joint_torsion + name = "MOD joint torsion ratchet module" + desc = "A compact, weak AC generator that charges the suit's internal cell through the power of deambulation. It doesn't work in zero G." + icon_state = "joint_torsion" + complexity = 1 + incompatible_modules = list(/obj/item/mod/module/joint_torsion) + var/power_per_step = DEFAULT_CHARGE_DRAIN * 0.3 + +/obj/item/mod/module/joint_torsion/on_suit_activation() + if(!(mod.wearer.movement_type & (FLOATING|FLYING))) + RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) + /// This way we don't even bother to call on_moved() while flying/floating + RegisterSignal(mod.wearer, COMSIG_MOVETYPE_FLAG_ENABLED, PROC_REF(on_movetype_flag_enabled)) + RegisterSignal(mod.wearer, COMSIG_MOVETYPE_FLAG_DISABLED, PROC_REF(on_movetype_flag_disabled)) + +/obj/item/mod/module/joint_torsion/on_suit_deactivation(deleting = FALSE) + UnregisterSignal(mod.wearer, list(COMSIG_MOVABLE_MOVED, COMSIG_MOVETYPE_FLAG_ENABLED, COMSIG_MOVETYPE_FLAG_DISABLED)) + +/obj/item/mod/module/joint_torsion/proc/on_movetype_flag_enabled(datum/source, flag, old_state) + SIGNAL_HANDLER + if(!(old_state & (FLOATING|FLYING)) && flag & (FLOATING|FLYING)) + UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) + +/obj/item/mod/module/joint_torsion/proc/on_movetype_flag_disabled(datum/source, flag, old_state) + SIGNAL_HANDLER + if(old_state & (FLOATING|FLYING) && !(mod.wearer.movement_type & (FLOATING|FLYING))) + RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) + +/obj/item/mod/module/joint_torsion/proc/on_moved(mob/living/carbon/human/wearer, atom/old_loc, movement_dir, forced) + SIGNAL_HANDLER + //Shouldn't work if the wearer isn't really walking/running around. + if(forced || wearer.throwing || wearer.body_position == LYING_DOWN || wearer.buckled || CHECK_MOVE_LOOP_FLAGS(wearer, MOVEMENT_LOOP_OUTSIDE_CONTROL)) + return + mod.core.add_charge(power_per_step) + +/// Module that shoves garbage inside its material container when the user crosses it, and eject the recycled material with MMB. +/obj/item/mod/module/recycler + name = "MOD recycler module" + desc = "An innovative garbage collection module that recycles gathered trash into usable material. \ + Doesn't work on debris and some items. May recycle live ammunition. \ + Activate on a nearby turf or storage to unload stored material." + icon_state = "recycler" + module_type = MODULE_ACTIVE + active_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 + complexity = 2 + incompatible_modules = list(/obj/item/mod/module/recycler) + overlay_state_inactive = "module_recycler" + overlay_state_active = "module_recycler" + /// A multiplier of the amount of material extracted from the item + var/efficiency = 1 + /// Items that will be collected + var/list/allowed_item_types = list( + /obj/item/trash, + /obj/item/shard, + /obj/item/light, + /obj/item/broken_bottle, + /obj/item/ammo_casing, + /obj/item/cigbutt, + ) + /// Materials that will be extracted. + var/list/accepted_mats = list( + /datum/material/iron, + /datum/material/glass, + /datum/material/silver, + /datum/material/plasma, + /datum/material/gold, + /datum/material/diamond, + /datum/material/plastic, + /datum/material/uranium, + /datum/material/bananium, + /datum/material/titanium, + /datum/material/bluespace, + ) + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_obj_entered), + COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON = PROC_REF(on_atom_initialized_on), + ) + var/datum/component/connect_loc_behalf/connector + var/datum/component/material_container/container + +/obj/item/mod/module/recycler/Initialize(mapload) + . = ..() + container = AddComponent( \ + /datum/component/material_container, \ + accepted_mats, 50 * SHEET_MATERIAL_AMOUNT, \ + MATCONTAINER_EXAMINE|MATCONTAINER_NO_INSERT, \ + container_signals = list( \ + COMSIG_MATCONTAINER_SHEETS_RETRIEVED = TYPE_PROC_REF(/obj/item/mod/module/recycler, InsertSheets) \ + ) \ + ) + +/obj/item/mod/module/recycler/Destroy() + container = null + return ..() + +/obj/item/mod/module/recycler/on_activation() + . = ..() + if(!.) + return + connector = AddComponent(/datum/component/connect_loc_behalf, mod.wearer, loc_connections) + RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(on_wearer_moved)) + +/obj/item/mod/module/recycler/on_deactivation(display_message, deleting = FALSE) + . = ..() + if(!.) + return + QDEL_NULL(connector) + UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(on_wearer_moved)) + +/obj/item/mod/module/recycler/proc/on_wearer_moved(datum/source, atom/old_loc, dir, forced) + SIGNAL_HANDLER + + for(var/obj/item/item in mod.wearer.loc) + if(!is_type_in_list(item, allowed_item_types)) + return + insert_trash(item) + +/obj/item/mod/module/recycler/proc/on_obj_entered(atom/new_loc, atom/movable/arrived, atom/old_loc) + SIGNAL_HANDLER + + if(!is_type_in_list(arrived, allowed_item_types)) + return + insert_trash(arrived) + +/obj/item/mod/module/recycler/proc/on_atom_initialized_on(atom/loc, atom/new_atom) + SIGNAL_HANDLER + + if(!is_type_in_list(new_atom, allowed_item_types)) + return + //Give the new atom the time to fully initialize and maybe live if the wearer moves away. + addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/item/mod/module/recycler, insert_trash_if_nearby), new_atom), 0.5 SECONDS) + +/obj/item/mod/module/recycler/proc/insert_trash_if_nearby(atom/new_atom) + if(new_atom && mod?.wearer && new_atom.loc == mod.wearer.loc) + insert_trash(new_atom) + +/obj/item/mod/module/recycler/proc/insert_trash(obj/item/item) + var/retrieved = container.insert_item(item, multiplier = efficiency, breakdown_flags = BREAKDOWN_FLAGS_RECYCLER) + if(retrieved == MATERIAL_INSERT_ITEM_NO_MATS) //even if it doesn't have any material to give, trash is trash. + qdel(item) + playsound(src, SFX_RUSTLE, 50, TRUE, -5) + +/obj/item/mod/module/recycler/on_select_use(atom/target) + . = ..() + if(!.) + return + if(!target?.atom_storage) + target = get_turf(target) + if(!isopenturf(target) || !mod.wearer.Adjacent(target)) + return FALSE + dispense(target) + +/obj/item/mod/module/recycler/proc/dispense(atom/target) + if(container.retrieve_all(target)) + balloon_alert(mod.wearer, "material dispensed") + playsound(src, 'sound/machines/microwave/microwave-end.ogg', 50, TRUE) + return + balloon_alert(mod.wearer, "not enough material") + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE) + +/obj/item/mod/module/recycler/proc/InsertSheets(obj/item/recycler, obj/item/stack/sheets, atom/context) + SIGNAL_HANDLER + + attempt_insert_storage(sheets) + +/obj/item/mod/module/recycler/proc/attempt_insert_storage(obj/item/to_drop) + if(!isturf(to_drop.loc) && !to_drop.loc.atom_storage?.attempt_insert(to_drop, mod.wearer, override = TRUE)) + to_drop.forceMove(to_drop.loc.drop_location()) + +///A black market variant of the above that dispenses riot foam dart boxes +/obj/item/mod/module/recycler/donk + name = "MOD riot foam dart recycler module" + desc = "A mod module collects and repackages fired foam darts (and garbage) into half-sized boxes of riot foam darts. \ + Activate on a nearby turf or storage to unload stored ammo boxes." + icon_state = "donk_recycler" + overlay_state_inactive = "module_donk_recycler" + overlay_state_active = "module_donk_recycler" + efficiency = 0.7 // Stops getting as many riot foam darts as one consumes. + accepted_mats = list(/datum/material/iron) + ///The type of ammo box that it dispenses + var/ammobox_type = /obj/item/ammo_box/foambox/riot/mini + ///The cost of each dispensed ammo box + var/required_amount = SHEET_MATERIAL_AMOUNT*12.5 + +/obj/item/mod/module/recycler/donk/dispense(atom/target) + if(!container.use_amount_mat(required_amount, /datum/material/iron)) + balloon_alert(mod.wearer, "not enough material") + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE) + return + var/obj/item/ammo_box/product = new ammobox_type(target) + attempt_insert_storage(product) + balloon_alert(mod.wearer, "ammo box dispensed.") + playsound(src, 'sound/machines/microwave/microwave-end.ogg', 50, TRUE) diff --git a/code/modules/mod/modules/modules_maint.dm b/code/modules/mod/modules/modules_maint.dm index 9829321f64000..f7b53eaa9f0ea 100644 --- a/code/modules/mod/modules/modules_maint.dm +++ b/code/modules/mod/modules/modules_maint.dm @@ -37,7 +37,6 @@ ///Signal fired when wearer attempts to activate/deactivate suits /obj/item/mod/module/springlock/proc/on_activate_spring_block(datum/source, user) SIGNAL_HANDLER - balloon_alert(user, "springlocks aren't responding...?") return MOD_CANCEL_ACTIVATE @@ -287,6 +286,7 @@ 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)) + RegisterSignal(mod.wearer, COMSIG_MOB_SAY, PROC_REF(on_talk)) ADD_TRAIT(mod.wearer, TRAIT_SILENT_FOOTSTEPS, MOD_TRAIT) check_upstairs() //todo at some point flip your screen around @@ -301,6 +301,7 @@ 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) @@ -334,3 +335,20 @@ QDEL_IN(mod.wearer, FLY_TIME) #undef FLY_TIME + +/obj/item/mod/module/atrocinator/proc/on_talk(datum/source, list/speech_args) + SIGNAL_HANDLER + speech_args[SPEECH_SPANS] |= "upside_down" + +/obj/item/mod/module/recycler/donk/safe + name = "MOD foam dart recycler module" + desc = "A mod module that collects and repackages fired foam darts into half-sized ammo boxes. \ + Activate on a nearby turf or storage to unload stored ammo boxes." + icon_state = "donk_safe_recycler" + overlay_state_inactive = "module_donk_safe_recycler" + overlay_state_active = "module_donk_safe_recycler" + complexity = 1 + efficiency = 1 + allowed_item_types = list(/obj/item/ammo_casing/foam_dart) + ammobox_type = /obj/item/ammo_box/foambox/mini + required_amount = SMALL_MATERIAL_AMOUNT*2.5 diff --git a/code/modules/mod/modules/modules_medical.dm b/code/modules/mod/modules/modules_medical.dm index 1dd9241892139..ca662d01ef20b 100644 --- a/code/modules/mod/modules/modules_medical.dm +++ b/code/modules/mod/modules/modules_medical.dm @@ -13,24 +13,27 @@ but it's up to you to do something with it." icon_state = "health" module_type = MODULE_ACTIVE - complexity = 2 + complexity = 1 use_power_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/health_analyzer) cooldown_time = 0.5 SECONDS tgui_id = "health_analyzer" /// Scanning mode, changes how we scan something. var/mode = HEALTH_SCAN + /// List of all scanning modes. var/static/list/modes = list(HEALTH_SCAN, WOUND_SCAN, CHEM_SCAN) /obj/item/mod/module/health_analyzer/add_ui_data() . = ..() - .["userhealth"] = mod.wearer?.health || 0 - .["usermaxhealth"] = mod.wearer?.getMaxHealth() || 0 - .["userbrute"] = mod.wearer?.getBruteLoss() || 0 - .["userburn"] = mod.wearer?.getFireLoss() || 0 - .["usertoxin"] = mod.wearer?.getToxLoss() || 0 - .["useroxy"] = mod.wearer?.getOxyLoss() || 0 + .["health"] = mod.wearer?.health || 0 + .["health_max"] = mod.wearer?.getMaxHealth() || 0 + .["loss_brute"] = mod.wearer?.getBruteLoss() || 0 + .["loss_fire"] = mod.wearer?.getFireLoss() || 0 + .["loss_tox"] = mod.wearer?.getToxLoss() || 0 + .["loss_oxy"] = mod.wearer?.getOxyLoss() || 0 + + return . /obj/item/mod/module/health_analyzer/on_select_use(atom/target) . = ..() @@ -51,6 +54,8 @@ . = ..() .["mode"] = add_ui_configuration("Scan Mode", "list", mode, modes) + return . + /obj/item/mod/module/health_analyzer/configure_edit(key, value) switch(key) if("mode") diff --git a/code/modules/mod/modules/modules_ninja.dm b/code/modules/mod/modules/modules_ninja.dm index 0987c777764b7..7a38238594df3 100644 --- a/code/modules/mod/modules/modules_ninja.dm +++ b/code/modules/mod/modules/modules_ninja.dm @@ -76,6 +76,18 @@ use_power_cost = DEFAULT_CHARGE_DRAIN * 5 cooldown_time = 3 SECONDS +/obj/item/mod/module/stealth/ninja/on_activation() + . = ..() + if(!.) + return + ADD_TRAIT(mod.wearer, TRAIT_SILENT_FOOTSTEPS, MOD_TRAIT) + +/obj/item/mod/module/stealth/ninja/on_deactivation(display_message = TRUE, deleting = FALSE) + . = ..() + if(!.) + return + REMOVE_TRAIT(mod.wearer, TRAIT_SILENT_FOOTSTEPS, MOD_TRAIT) + ///Camera Vision - Prevents flashes, blocks tracking. /obj/item/mod/module/welding/camera_vision name = "MOD camera vision module" @@ -257,13 +269,13 @@ . = ..() if(. != MOD_CANCEL_ACTIVATE || !isliving(user)) return - if(mod.ai == user) - to_chat(mod.ai, span_danger("fATaL EERRoR: 381200-*#00CODE BLUE\nAI INTErFERenCE DEtECted\nACTi0N DISrEGArdED")) + if(mod.ai_assistant == user) + to_chat(mod.ai_assistant, span_danger("fATaL EERRoR: 381200-*#00CODE BLUE\nAI INTErFERenCE DEtECted\nACTi0N DISrEGArdED")) return var/mob/living/living_user = user to_chat(living_user, span_danger("fATaL EERRoR: 382200-*#00CODE RED\nUNAUTHORIZED USE DETECteD\nCoMMENCING SUB-R0UTIN3 13...\nTERMInATING U-U-USER...")) living_user.investigate_log("has been gibbed by using a MODsuit equipped with [src].", INVESTIGATE_DEATHS) - living_user.gib() + living_user.gib(DROP_ALL_REMAINS) /obj/item/mod/module/dna_lock/reinforced/on_emp(datum/source, severity) return @@ -287,86 +299,100 @@ empulse(src, heavy_range = 4, light_range = 6) drain_power(use_power_cost) -///Status Readout - Puts a lot of information including health, nutrition, fingerprints, temperature to the suit TGUI. -/obj/item/mod/module/status_readout - name = "MOD status readout module" - desc = "A once-common module, this technology went unfortunately out of fashion; \ - and right into the arachnid grip of the Spider Clan. This hooks into the suit's spine, \ - capable of capturing and displaying all possible biometric data of the wearer; sleep, nutrition, fitness, fingerprints, \ - and even useful information such as their overall health and wellness." - icon_state = "status" - complexity = 1 - use_power_cost = DEFAULT_CHARGE_DRAIN * 0.1 - incompatible_modules = list(/obj/item/mod/module/status_readout) - tgui_id = "status_readout" - -/obj/item/mod/module/status_readout/add_ui_data() - . = ..() - .["statustime"] = station_time_timestamp() - .["statusid"] = GLOB.round_id - .["statushealth"] = mod.wearer?.health || 0 - .["statusmaxhealth"] = mod.wearer?.getMaxHealth() || 0 - .["statusbrute"] = mod.wearer?.getBruteLoss() || 0 - .["statusburn"] = mod.wearer?.getFireLoss() || 0 - .["statustoxin"] = mod.wearer?.getToxLoss() || 0 - .["statusoxy"] = mod.wearer?.getOxyLoss() || 0 - .["statustemp"] = mod.wearer?.bodytemperature || 0 - .["statusnutrition"] = mod.wearer?.nutrition || 0 - .["statusfingerprints"] = mod.wearer ? md5(mod.wearer.dna.unique_identity) : null - .["statusdna"] = mod.wearer?.dna.unique_enzymes - .["statusviruses"] = null - if(!length(mod.wearer?.diseases)) - return - var/list/viruses = list() - for(var/datum/disease/virus as anything in mod.wearer.diseases) - var/list/virus_data = list() - virus_data["name"] = virus.name - virus_data["type"] = virus.spread_text - virus_data["stage"] = virus.stage - virus_data["maxstage"] = virus.max_stages - virus_data["cure"] = virus.cure_text - viruses += list(virus_data) - .["statusviruses"] = viruses +/// Ninja Status Readout - Like the normal status display (see the base type), but with a clock. +/obj/item/mod/module/status_readout/ninja + name = "MOD Spider Clan status readout module" + desc = "A once-common module, this technology unfortunately went out of fashion in the safer regions of space; \ + and, according to the extra markings on this particular unit's casing, right into the arachnid grip of the Spider Clan. \ + Like other similar units, this one hooks into the suit's spine, and is capable of capturing and displaying \ + all possible biometric data of the wearer; sleep, nutrition, fitness, fingerprints, \ + and even useful information such as their overall health and wellness. This one comes with a clock that calibrates to the \ + local system time, and an operational ID number display. The vital monitor's speaker has been removed." + display_time = TRUE + death_sound = null + death_sound_volume = null ///Energy Net - Ensnares enemies in a net that prevents movement. /obj/item/mod/module/energy_net name = "MOD energy net module" desc = "A custom-built net-thrower. While conventional implementations of this capturing device \ - tilize monomolecular fibers or cutting razorwire, this uses hardlight technology to deploy a \ + utilize monomolecular fibers or cutting razorwire, this uses hardlight technology to deploy a \ trapping field capable of immobilizing even the strongest opponents." icon_state = "energy_net" removable = FALSE module_type = MODULE_ACTIVE use_power_cost = DEFAULT_CHARGE_DRAIN * 6 incompatible_modules = list(/obj/item/mod/module/energy_net) - cooldown_time = 1.5 SECONDS + cooldown_time = 5 SECONDS + /// List of all energy nets this module made. + var/list/energy_nets = list() + +/obj/item/mod/module/energy_net/on_suit_deactivation(deleting) + for(var/obj/structure/energy_net/net as anything in energy_nets) + net.atom_destruction(ENERGY) /obj/item/mod/module/energy_net/on_select_use(atom/target) . = ..() if(!.) return - if(!isliving(target)) - balloon_alert(mod.wearer, "invalid target!") - return - var/mob/living/living_target = target - if(locate(/obj/structure/energy_net) in get_turf(living_target)) - balloon_alert(mod.wearer, "already trapped!") - return - for(var/turf/between_turf as anything in get_line(get_turf(mod.wearer), get_turf(living_target))) - if(between_turf.density) - balloon_alert(mod.wearer, "not through obstacles!") - return - if(IS_SPACE_NINJA(mod.wearer)) + if(IS_SPACE_NINJA(mod.wearer) && isliving(target)) mod.wearer.say("Get over here!", forced = type) - mod.wearer.Beam(living_target, "n_beam", time = 1.5 SECONDS) - var/obj/structure/energy_net/net = new /obj/structure/energy_net(living_target.drop_location()) - net.affected_mob = living_target - mod.wearer.visible_message(span_danger("[mod.wearer] caught [living_target] with an energy net!"), span_notice("You caught [living_target] with an energy net!")) - if(living_target.buckled) - living_target.buckled.unbuckle_mob(living_target, force = TRUE) - net.buckle_mob(living_target, force = TRUE) + var/obj/projectile/net = new /obj/projectile/energy_net(mod.wearer.loc, src) + net.preparePixelProjectile(target, mod.wearer) + net.firer = mod.wearer + playsound(src, 'sound/weapons/punchmiss.ogg', 25, TRUE) + INVOKE_ASYNC(net, TYPE_PROC_REF(/obj/projectile, fire)) drain_power(use_power_cost) +/obj/item/mod/module/energy_net/proc/add_net(obj/structure/energy_net/net) + energy_nets += net + RegisterSignal(net, COMSIG_QDELETING, PROC_REF(remove_net)) + +/obj/item/mod/module/energy_net/proc/remove_net(obj/structure/energy_net/net) + SIGNAL_HANDLER + energy_nets -= net + +/obj/projectile/energy_net + name = "energy net" + icon_state = "net_projectile" + icon = 'icons/obj/clothing/modsuit/mod_modules.dmi' + damage = 0 + range = 9 + hitsound = 'sound/items/fultext_deploy.ogg' + hitsound_wall = 'sound/items/fultext_deploy.ogg' + /// Reference to the beam following the projectile. + var/line + /// Reference to the energy net module. + var/datum/weakref/net_module + +/obj/projectile/energy_net/Initialize(mapload, net_module) + . = ..() + src.net_module = WEAKREF(net_module) + +/obj/projectile/energy_net/fire(setAngle) + if(firer) + line = firer.Beam(src, "net_beam", 'icons/obj/clothing/modsuit/mod_modules.dmi') + return ..() + +/obj/projectile/energy_net/on_hit(mob/living/target) + . = ..() + if(!istype(target)) + return + if(locate(/obj/structure/energy_net) in get_turf(target)) + return + var/obj/structure/energy_net/net = new /obj/structure/energy_net(target.drop_location()) + var/obj/item/mod/module/energy_net/module = net_module?.resolve() + if(module) + module.add_net(net) + firer?.visible_message(span_danger("[firer] caught [target] with an energy net!"), span_notice("You caught [target] with an energy net!")) + if(target.buckled) + target.buckled.unbuckle_mob(target, force = TRUE) + net.buckle_mob(target, force = TRUE) + +/obj/projectile/energy_net/Destroy() + QDEL_NULL(line) + return ..() + ///Adrenaline Boost - Stops all stuns the ninja is affected with, increases his speed. /obj/item/mod/module/adrenaline_boost name = "MOD adrenaline boost module" diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm index a861f5f639e33..4fe9c5767b3da 100644 --- a/code/modules/mod/modules/modules_security.dm +++ b/code/modules/mod/modules/modules_security.dm @@ -137,9 +137,9 @@ holstered.forceMove(drop_location()) /obj/item/mod/module/holster/Exited(atom/movable/gone, direction) - . = ..() if(gone == holstered) holstered = null + return ..() /obj/item/mod/module/holster/Destroy() QDEL_NULL(holstered) @@ -361,13 +361,95 @@ /obj/item/mod/module/active_sonar name = "MOD active sonar" desc = "Ancient tech from the 20th century, this module uses sonic waves to detect living creatures within the user's radius. \ + Its basic function slowly scans around the user for any bio-signatures, however it can be overclocked to scan everywhere at once.\ Its loud ping is much harder to hide in an indoor station than in the outdoor operations it was designed for." icon_state = "active_sonar" module_type = MODULE_USABLE - use_power_cost = DEFAULT_CHARGE_DRAIN * 4 - complexity = 3 + idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 + use_power_cost = DEFAULT_CHARGE_DRAIN * 3 + complexity = 2 incompatible_modules = list(/obj/item/mod/module/active_sonar) cooldown_time = 15 SECONDS + /// Time between us displaying radial scans + var/scan_cooldown_time = 0.5 SECONDS + /// The current slice we're going to scan + var/scanned_slice = 1 + /// How many slices we make 360 + var/radar_slices = 8 // 45 degrees each + + /// A list of all creatures in range sorted by angle. + var/list/sorted_creatures = list() + /// A keyed list of all creatures + var/list/keyed_creatures = list() + + /// Time between us displaying radial scans + COOLDOWN_DECLARE(scan_cooldown) + +/obj/item/mod/module/active_sonar/Initialize(mapload) + . = ..() + for(var/i in 1 to radar_slices) + sorted_creatures += list(list()) + +/obj/item/mod/module/active_sonar/on_suit_activation() + RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(sort_all_creatures)) + +/obj/item/mod/module/active_sonar/on_suit_deactivation(deleting = FALSE) + UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) + +/// Detects all living creatures within world.view, and returns the amount. +/obj/item/mod/module/active_sonar/proc/detect_living_creatures() + var/creatures_detected = 0 + for(var/mob/living/creature in range(world.view, mod.wearer)) + if(creature == mod.wearer || creature.stat == DEAD) + continue + if(keyed_creatures[creature]) + creatures_detected++ + continue + sort_creature_angle(creature) + RegisterSignal(creature, COMSIG_MOVABLE_MOVED, PROC_REF(sort_creature_angle)) + creatures_detected++ + return creatures_detected + +/// Swaps around where a creature is, when they move or when they're first detected +/obj/item/mod/module/active_sonar/proc/sort_creature_angle(mob/living/creature, atom/old_loc, movement_dir, forced) + SIGNAL_HANDLER + var/oldgroup = keyed_creatures[creature] + var/newgroup = round(get_angle(mod.wearer, creature) / (360 / radar_slices)) + 1 + if(oldgroup) + if(creature.stat == DEAD || get_dist(get_turf(mod.wearer), get_turf(creature)) > world.view) + sorted_creatures[oldgroup] -= creature + keyed_creatures -= creature + UnregisterSignal(creature, COMSIG_MOVABLE_MOVED) + return + + if(oldgroup != newgroup) + sorted_creatures[oldgroup] -= creature + + sorted_creatures[newgroup] += creature + keyed_creatures[creature] = newgroup + +/// Swaps all creatures when mod.wearer moves +/obj/item/mod/module/active_sonar/proc/sort_all_creatures(mob/living/wearer, atom/old_loc, movement_dir, forced) + SIGNAL_HANDLER + + for(var/mob/living/creature as anything in keyed_creatures) + sort_creature_angle(creature) // Kinda spaghetti but it honestly seems like the shortest path to the same result + +/obj/item/mod/module/active_sonar/on_process(seconds_per_tick) + . = ..() + if(!.) + return + if(!COOLDOWN_FINISHED(src, cooldown_timer) || !COOLDOWN_FINISHED(src, scan_cooldown)) + return + detect_living_creatures() + for(var/mob/living/creature as anything in sorted_creatures[scanned_slice]) + new /obj/effect/temp_visual/sonar_ping(mod.wearer.loc, mod.wearer, creature, "sonar_ping_small", FALSE) + // Next slice! + scanned_slice++ + // IT'S ENOUGH SLICES + if(scanned_slice > radar_slices) + scanned_slice = 1 + COOLDOWN_START(src, scan_cooldown, scan_cooldown_time) /obj/item/mod/module/active_sonar/on_use() . = ..() @@ -377,11 +459,120 @@ playsound(mod.wearer, 'sound/mecha/skyfall_power_up.ogg', vol = 20, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) if(!do_after(mod.wearer, 1.1 SECONDS, target = mod)) return - var/creatures_detected = 0 - for(var/mob/living/creature in range(9, mod.wearer)) - if(creature == mod.wearer || creature.stat == DEAD) - continue + playsound(mod.wearer, 'sound/effects/ping_hit.ogg', vol = 75, vary = TRUE) // Should be audible for the radius of the sonar + to_chat(mod.wearer, span_notice("You slam your fist into the ground, sending out a sonic wave that detects [detect_living_creatures()] living beings nearby!")) + for(var/mob/living/creature as anything in keyed_creatures) new /obj/effect/temp_visual/sonar_ping(mod.wearer.loc, mod.wearer, creature) - creatures_detected++ - playsound(mod.wearer, 'sound/effects/ping_hit.ogg', vol = 75, vary = TRUE, extrarange = MEDIUM_RANGE_SOUND_EXTRARANGE) // Should be audible for the radius of the sonar - to_chat(mod.wearer, span_notice("You slam your fist into the ground, sending out a sonic wave that detects [creatures_detected] living beings nearby!")) + +#define SHOOTING_ASSISTANT_OFF "Currently Off" +#define STORMTROOPER_MODE "Quick Fire Stormtrooper" +#define SHARPSHOOTER_MODE "Slow Ricochet Sharpshooter" + +/** + * A module that enhances the user's ability with firearms, with a couple drawbacks: + * In 'Stormtrooper' mode, the user will be given faster firerate, but lower accuracy. + * In 'Sharpshooter' mode, the user will have better accuracy and ricochet to his shots, but slower movement speed. + * Both modes prevent the user from dual wielding guns. + */ +/obj/item/mod/module/shooting_assistant + name = "MOD shooting assistant module" + desc = "A botched prototype meant to boost the TGMC crayon eaters' ability with firearms. \ + It has only two modes available in its configurations: \ + 'Quick Fire Stormtrooper' and 'Slow Ricochet Sharpshooter', \ + both incompatible with dual wielding firearms." + icon_state = "shooting_assistant" + module_type = MODULE_PASSIVE + complexity = 3 + incompatible_modules = list(/obj/item/mod/module/shooting_assistant) + var/selected_mode = SHOOTING_ASSISTANT_OFF + ///Association list, the assoc values are the balloon alerts shown to the user when the mode is set. + var/static/list/available_modes = list( + SHOOTING_ASSISTANT_OFF = "assistant off", + STORMTROOPER_MODE = "stormtrooper mode", + SHARPSHOOTER_MODE = "sharpshooter mode", + ) + +/obj/item/mod/module/shooting_assistant/get_configuration() + . = ..() + .["shooting_mode"] = add_ui_configuration("Mode", "list", selected_mode, assoc_to_keys(available_modes)) + +/obj/item/mod/module/shooting_assistant/configure_edit(key, value) + switch(key) + if("shooting_mode") + set_shooting_mode(value) + +/obj/item/mod/module/shooting_assistant/proc/set_shooting_mode(new_mode) + if(new_mode == selected_mode || !mod.active) + return + if(new_mode != SHOOTING_ASSISTANT_OFF && !mod.get_charge()) + balloon_alert(mod.wearer, "no charge!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return + + //Remove the effects of the previously selected mode + if(mod.active) + remove_mode_effects() + + balloon_alert(mod.wearer, available_modes[new_mode]) + selected_mode = new_mode + + //Apply the effects of the new mode + if(mod.active) + apply_mode_effects() + +/obj/item/mod/module/shooting_assistant/proc/apply_mode_effects() + switch(selected_mode) + if(SHOOTING_ASSISTANT_OFF) + idle_power_cost = 0 + if(STORMTROOPER_MODE) + idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.4 + mod.wearer.add_traits(list(TRAIT_NO_GUN_AKIMBO, TRAIT_DOUBLE_TAP), MOD_TRAIT) + RegisterSignal(mod.wearer, COMSIG_MOB_FIRED_GUN, PROC_REF(stormtrooper_fired_gun)) + if(SHARPSHOOTER_MODE) + idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.6 + mod.wearer.add_traits(list(TRAIT_NO_GUN_AKIMBO, TRAIT_NICE_SHOT), MOD_TRAIT) + RegisterSignal(mod.wearer, COMSIG_MOB_FIRED_GUN, PROC_REF(sharpshooter_fired_gun)) + RegisterSignal(mod.wearer, COMSIG_PROJECTILE_FIRER_BEFORE_FIRE, PROC_REF(apply_ricochet)) + mod.wearer.add_movespeed_modifier(/datum/movespeed_modifier/shooting_assistant) + +/obj/item/mod/module/shooting_assistant/proc/remove_mode_effects() + switch(selected_mode) + if(STORMTROOPER_MODE) + UnregisterSignal(mod.wearer, COMSIG_MOB_FIRED_GUN) + mod.wearer.remove_traits(list(TRAIT_NO_GUN_AKIMBO, TRAIT_DOUBLE_TAP), MOD_TRAIT) + if(SHARPSHOOTER_MODE) + UnregisterSignal(mod.wearer, list(COMSIG_MOB_FIRED_GUN, COMSIG_PROJECTILE_FIRER_BEFORE_FIRE)) + mod.wearer.remove_traits(list(TRAIT_NO_GUN_AKIMBO, TRAIT_NICE_SHOT), MOD_TRAIT) + mod.wearer.remove_movespeed_modifier(/datum/movespeed_modifier/shooting_assistant) + +/obj/item/mod/module/shooting_assistant/drain_power(amount) + . = ..() + if(!.) + set_shooting_mode(SHOOTING_ASSISTANT_OFF) + +/obj/item/mod/module/shooting_assistant/on_suit_activation() + apply_mode_effects() + +/obj/item/mod/module/shooting_assistant/on_suit_deactivation(deleting = FALSE) + remove_mode_effects() + +/obj/item/mod/module/shooting_assistant/proc/stormtrooper_fired_gun(mob/user, obj/item/gun/gun_fired, target, params, zone_override, list/bonus_spread_values) + SIGNAL_HANDLER + bonus_spread_values[MIN_BONUS_SPREAD_INDEX] += 15 + bonus_spread_values[MAX_BONUS_SPREAD_INDEX] += 25 + +/obj/item/mod/module/shooting_assistant/proc/sharpshooter_fired_gun(mob/user, obj/item/gun/gun_fired, target, params, zone_override, list/bonus_spread_values) + SIGNAL_HANDLER + bonus_spread_values[MIN_BONUS_SPREAD_INDEX] -= 20 + bonus_spread_values[MAX_BONUS_SPREAD_INDEX] -= 10 + +/obj/item/mod/module/shooting_assistant/proc/apply_ricochet(mob/user, obj/projectile/projectile, datum/fired_from, atom/clicked_atom) + SIGNAL_HANDLER + projectile.ricochets_max += 1 + projectile.min_ricochets += 1 + projectile.ricochet_incidence_leeway = 0 //allows the projectile to bounce at any angle. + ADD_TRAIT(projectile, TRAIT_ALWAYS_HIT_ZONE, MOD_TRAIT) + +#undef SHOOTING_ASSISTANT_OFF +#undef STORMTROOPER_MODE +#undef SHARPSHOOTER_MODE diff --git a/code/modules/mod/modules/modules_service.dm b/code/modules/mod/modules/modules_service.dm index 061c813132251..5381a26e88bd4 100644 --- a/code/modules/mod/modules/modules_service.dm +++ b/code/modules/mod/modules/modules_service.dm @@ -27,7 +27,7 @@ allowing them to cook food from a distance, with the greatest of ease. Not recommended for use against grapes." icon_state = "microwave_beam" module_type = MODULE_ACTIVE - complexity = 2 + complexity = 1 use_power_cost = DEFAULT_CHARGE_DRAIN * 5 incompatible_modules = list(/obj/item/mod/module/microwave_beam, /obj/item/mod/module/organ_thrower) cooldown_time = 10 SECONDS diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm index 5c36dda62cdb6..3c5f89d0d1b24 100644 --- a/code/modules/mod/modules/modules_supply.dm +++ b/code/modules/mod/modules/modules_supply.dm @@ -118,7 +118,7 @@ your drill is surely the one that both pierces and creates the heavens." icon_state = "drill" module_type = MODULE_ACTIVE - complexity = 2 + complexity = 1 use_power_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/drill) cooldown_time = 0.5 SECONDS @@ -158,6 +158,12 @@ if(!ismineralturf(bumped_into) || !drain_power(use_power_cost)) return var/turf/closed/mineral/mineral_turf = bumped_into + var/turf/closed/mineral/gibtonite/giberal_turf = mineral_turf + if(istype(giberal_turf) && giberal_turf.stage != GIBTONITE_UNSTRUCK) + playsound(bumper, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + to_chat(bumper, span_warning("[icon2html(src, bumper)] Unstable gibtonite ore deposit detected! Drills disabled.")) + on_deactivation() + return mineral_turf.gets_drilled(mod.wearer) return COMPONENT_CANCEL_ATTACK_CHAIN @@ -533,7 +539,7 @@ . = ..() if(!.) return - var/obj/projectile/bomb = new /obj/projectile/bullet/reusable/mining_bomb(mod.wearer.loc) + var/obj/projectile/bomb = new /obj/projectile/bullet/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) @@ -553,7 +559,7 @@ return on_deactivation() -/obj/projectile/bullet/reusable/mining_bomb +/obj/projectile/bullet/mining_bomb name = "mining bomb" desc = "A bomb. Why are you examining this?" icon_state = "mine_bomb" @@ -566,13 +572,16 @@ light_range = 1 light_power = 1 light_color = COLOR_LIGHT_ORANGE - ammo_type = /obj/structure/mining_bomb + embedding = null -/obj/projectile/bullet/reusable/mining_bomb/handle_drop() - if(dropped) - return - dropped = TRUE - new ammo_type(get_turf(src), firer) +/obj/projectile/bullet/mining_bomb/Initialize(mapload) + . = ..() + AddElement(/datum/element/projectile_drop, /obj/structure/mining_bomb) + RegisterSignal(src, COMSIG_PROJECTILE_ON_SPAWN_DROP, PROC_REF(handle_drop)) + +/obj/projectile/bullet/mining_bomb/proc/handle_drop(datum/source, obj/structure/mining_bomb/mining_bomb) + SIGNAL_HANDLER + addtimer(CALLBACK(mining_bomb, TYPE_PROC_REF(/obj/structure/mining_bomb, prime), firer), mining_bomb.prime_time) /obj/structure/mining_bomb name = "mining bomb" @@ -599,7 +608,6 @@ /obj/structure/mining_bomb/Initialize(mapload, atom/movable/firer) . = ..() generate_image() - addtimer(CALLBACK(src, PROC_REF(prime), firer), prime_time) /obj/structure/mining_bomb/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents) if(same_z_layer) diff --git a/code/modules/mod/modules/modules_timeline.dm b/code/modules/mod/modules/modules_timeline.dm index 4a71ce44d2157..f2440ba3833fa 100644 --- a/code/modules/mod/modules/modules_timeline.dm +++ b/code/modules/mod/modules/modules_timeline.dm @@ -92,9 +92,9 @@ return MOD_CANCEL_ACTIVATE ///Signal fired when wearer attempts to trigger modules, if attempting while time is stopped -/obj/item/mod/module/rewinder/proc/on_module_triggered(datum/source) +/obj/item/mod/module/rewinder/proc/on_module_triggered(datum/source, mob/user) SIGNAL_HANDLER - balloon_alert(mod.wearer, "not while rewinding!") + balloon_alert(user, "not while rewinding!") return MOD_ABORT_USE ///Timestopper - Need I really explain? It's the wizard's time stop, but the user channels it by not moving instead of a duration. @@ -173,7 +173,7 @@ //phasing out mod.visible_message(span_warning("[mod.wearer] leaps out of the timeline!")) mod.wearer.SetAllImmobility(0) - mod.wearer.setStaminaLoss(0, 0) + mod.wearer.setStaminaLoss(0) phased_mob = new(get_turf(mod.wearer.loc), mod.wearer) RegisterSignal(mod, COMSIG_MOD_ACTIVATE, PROC_REF(on_activate_block)) else diff --git a/code/modules/mod/modules/modules_visor.dm b/code/modules/mod/modules/modules_visor.dm index 33ee50a7ed0e2..e8656fe92331a 100644 --- a/code/modules/mod/modules/modules_visor.dm +++ b/code/modules/mod/modules/modules_visor.dm @@ -5,7 +5,7 @@ name = "MOD visor module" desc = "A heads-up display installed into the visor of the suit. They say these also let you see behind you." module_type = MODULE_TOGGLE - complexity = 2 + complexity = 1 active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 incompatible_modules = list(/obj/item/mod/module/visor) cooldown_time = 0.5 SECONDS diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index c55a9fccccf6e..d69769c92c56d 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -1,12 +1,10 @@ -GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar to GLOB.PDAs (used primarily with ntmessenger.dm) - // This is the base type of computer // Other types expand it - tablets and laptops are subtypes // consoles use "procssor" item that is held inside it. /obj/item/modular_computer name = "modular microcomputer" desc = "A small portable microcomputer." - icon = 'icons/obj/computer.dmi' + icon = 'icons/obj/machines/computer.dmi' icon_state = "laptop" light_on = FALSE integrity_failure = 0.5 @@ -44,7 +42,7 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar ///The program currently active on the tablet. var/datum/computer_file/program/active_program ///Idle programs on background. They still receive process calls but can't be interacted with. - var/list/idle_threads = list() + var/list/datum/computer_file/program/idle_threads = list() /// Amount of programs that can be ran at once var/max_idle_programs = 2 @@ -67,16 +65,16 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar ///If the computer has a flashlight/LED light built-in. var/has_light = FALSE + /// If the computer's flashlight/LED light has forcibly disabled for a temporary amount of time. + COOLDOWN_DECLARE(disabled_time) /// How far the computer's light can reach, is not editable by players. var/comp_light_luminosity = 3 /// The built-in light's color, editable by players. var/comp_light_color = "#FFFFFF" - ///The last recorded amount of power used. - var/last_power_usage = 0 ///Power usage when the computer is open (screen is active) and can be interacted with. - var/base_active_power_usage = 75 - ///Power usage when the computer is idle and screen is off (currently only applies to laptops) + var/base_active_power_usage = 125 + ///Power usage when the computer is idle and screen is off. var/base_idle_power_usage = 5 // Modular computers can run on various devices. Each DEVICE (Laptop, Console & Tablet) @@ -119,7 +117,6 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar /obj/item/modular_computer/Initialize(mapload) . = ..() - START_PROCESSING(SSobj, src) if(!physical) physical = src @@ -130,20 +127,20 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar UpdateDisplay() if(has_light) add_item_action(/datum/action/item_action/toggle_computer_light) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) if(inserted_disk) inserted_disk = new inserted_disk(src) if(internal_cell) internal_cell = new internal_cell(src) - update_appearance() - register_context() - Add_Messenger() install_default_programs() + register_context() + update_appearance() /obj/item/modular_computer/proc/install_default_programs() SHOULD_CALL_PARENT(FALSE) for(var/programs in default_programs + starting_programs) - var/datum/computer_file/program/program_type = new programs + var/datum/computer_file/program_type = new programs store_file(program_type) /obj/item/modular_computer/Destroy() @@ -151,8 +148,8 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar close_all_programs() //Some components will actually try and interact with this, so let's do it later QDEL_NULL(soundloop) + looping_sound = FALSE // Necessary to stop a possible runtime trying to call soundloop.stop() when soundloop has been qdel'd QDEL_LIST(stored_files) - Remove_Messenger() if(istype(inserted_disk)) QDEL_NULL(inserted_disk) @@ -205,10 +202,7 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar return TRUE if(istype(inserted_pai)) // Remove pAI - user.put_in_hands(inserted_pai) - balloon_alert(user, "removed pAI") - inserted_pai = null - update_appearance(UPDATE_ICON) + remove_pai(user) return TRUE // Gets IDs/access levels from card slot. Would be useful when/if PDAs would become modular PCs. //guess what @@ -281,16 +275,15 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar if(crew_manifest_update) GLOB.manifest.modify(computer_id_slot.registered_name, computer_id_slot.assignment, computer_id_slot.get_trim_assignment()) - if(user) - if(!issilicon(user) && in_range(src, user)) - user.put_in_hands(computer_id_slot) - balloon_alert(user, "removed ID") - to_chat(user, span_notice("You remove the card from the card slot.")) + if(user && !issilicon(user) && in_range(src, user)) + user.put_in_hands(computer_id_slot) else computer_id_slot.forceMove(drop_location()) computer_id_slot = null playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + balloon_alert(user, "removed ID") + to_chat(user, span_notice("You remove the card from the card slot.")) if(ishuman(loc)) var/mob/living/carbon/human/human_wearer = loc @@ -320,18 +313,22 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar if(response == "Yes") turn_on(user) -/obj/item/modular_computer/emag_act(mob/user, forced) +/obj/item/modular_computer/emag_act(mob/user, obj/item/card/emag/emag_card, forced) if(!enabled && !forced) - to_chat(user, span_warning("You'd need to turn the [src] on first.")) + balloon_alert(user, "turn it on first!") return FALSE if(obj_flags & EMAGGED) - to_chat(user, span_notice("You swipe \the [src]. A console window fills the screen, but it quickly closes itself after only a few lines are written to it.")) + balloon_alert(user, "already emagged!") + if (emag_card) + to_chat(user, span_notice("You swipe \the [src] with [emag_card]. A console window fills the screen, but it quickly closes itself after only a few lines are written to it.")) return FALSE . = ..() obj_flags |= EMAGGED device_theme = PDA_THEME_SYNDICATE - to_chat(user, span_notice("You swipe \the [src]. A console window momentarily fills the screen, with white text rapidly scrolling past.")) + balloon_alert(user, "syndieOS loaded") + if (emag_card) + to_chat(user, span_notice("You swipe \the [src] with [emag_card]. A console window momentarily fills the screen, with white text rapidly scrolling past.")) return TRUE /obj/item/modular_computer/examine(mob/user) @@ -370,6 +367,9 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar /obj/item/modular_computer/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) . = ..() + if(held_item?.tool_behaviour == TOOL_SCREWDRIVER && internal_cell) + context[SCREENTIP_CONTEXT_RMB] = "Remove Cell" + . = CONTEXTUAL_SCREENTIP_SET if(held_item?.tool_behaviour == TOOL_WRENCH) context[SCREENTIP_CONTEXT_RMB] = "Deconstruct" . = CONTEXTUAL_SCREENTIP_SET @@ -416,7 +416,7 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar var/mob/living/carbon/human/human_wearer = loc human_wearer.sec_hud_set_ID() if(inserted_pai == gone) - inserted_pai = null + update_appearance(UPDATE_ICON) if(inserted_disk == gone) inserted_disk = null update_appearance(UPDATE_ICON) @@ -441,7 +441,7 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar to_chat(user, span_warning("You press the power button, but the computer fails to boot up, displaying variety of errors before shutting down again.")) return FALSE - if(use_power()) // use_power() checks if the PC is powered + if(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 @@ -463,7 +463,6 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar // Process currently calls handle_power(), may be expanded in future if more things are added. /obj/item/modular_computer/process(seconds_per_tick) if(!enabled) // The computer is turned off - last_power_usage = 0 return if(atom_integrity <= integrity_failure * max_integrity) @@ -645,9 +644,24 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar enabled = FALSE update_appearance() +///Imprints name and job into the modular computer, and calls back to necessary functions. +///Acts as a replacement to directly setting the imprints fields. All fields are optional, the proc will try to fill in missing gaps. +/obj/item/modular_computer/proc/imprint_id(name = null, job_name = null) + saved_identification = name || computer_id_slot?.registered_name || saved_identification + saved_job = job_name || computer_id_slot?.assignment || saved_job + SEND_SIGNAL(src, COMSIG_MODULAR_PDA_IMPRINT_UPDATED, saved_identification, saved_job) + UpdateDisplay() + +///Resets the imprinted name and job back to null. +/obj/item/modular_computer/proc/reset_imprint() + saved_identification = null + saved_job = null + SEND_SIGNAL(src, COMSIG_MODULAR_PDA_IMPRINT_RESET) + UpdateDisplay() + /obj/item/modular_computer/ui_action_click(mob/user, actiontype) if(istype(actiontype, /datum/action/item_action/toggle_computer_light)) - toggle_flashlight() + toggle_flashlight(user) return return ..() @@ -658,14 +672,32 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar * Called from ui_act(), does as the name implies. * It is separated from ui_act() to be overwritten as needed. */ -/obj/item/modular_computer/proc/toggle_flashlight() +/obj/item/modular_computer/proc/toggle_flashlight(mob/user) if(!has_light) return FALSE + if(!COOLDOWN_FINISHED(src, disabled_time)) + balloon_alert(user, "disrupted!") + return FALSE set_light_on(!light_on) update_appearance() update_item_action_buttons(force = TRUE) //force it because we added an overlay, not changed its icon return TRUE +/** + * Disables the computer's flashlight/LED light, if it has one, for a given disrupt_duration. + * + * Called when sent COMSIG_HIT_BY_SABOTEUR. + */ +/obj/item/modular_computer/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + if(!has_light) + return + set_light_on(FALSE) + update_appearance() + update_item_action_buttons(force = TRUE) //force it because we added an overlay, not changed its icon + COOLDOWN_START(src, disabled_time, disrupt_duration) + return COMSIG_SABOTEUR_SUCCESS + /** * Sets the computer's light color, if it has a light. * @@ -700,16 +732,11 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar return // Inserting a pAI - if(istype(attacking_item, /obj/item/pai_card) && !inserted_pai) - if(!user.transferItemToLoc(attacking_item, src)) - return - inserted_pai = attacking_item - balloon_alert(user, "inserted pai") - update_appearance(UPDATE_ICON) + if(istype(attacking_item, /obj/item/pai_card) && insert_pai(user, attacking_item)) return if(istype(attacking_item, /obj/item/stock_parts/cell)) - if(ismachinery(loc)) + if(ismachinery(physical)) return if(internal_cell) to_chat(user, span_warning("You try to connect \the [attacking_item] to \the [src], but its connectors are occupied.")) @@ -720,6 +747,14 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar to_chat(user, span_notice("You plug \the [attacking_item] to \the [src].")) return + if(istype(attacking_item, /obj/item/photo)) + var/obj/item/photo/attacking_photo = attacking_item + if(store_file(new /datum/computer_file/picture(attacking_photo.picture))) + balloon_alert(user, "photo scanned") + else + balloon_alert(user, "no space!") + return + // Check if any Applications need it for(var/datum/computer_file/item_holding_app as anything in stored_files) if(item_holding_app.application_attackby(attacking_item, user)) @@ -765,17 +800,21 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar return ..() +/obj/item/modular_computer/screwdriver_act_secondary(mob/living/user, obj/item/tool) + . = ..() + if(internal_cell) + user.balloon_alert(user, "cell removed") + internal_cell.forceMove(drop_location()) + internal_cell = null + return TOOL_ACT_TOOLTYPE_SUCCESS + else + user.balloon_alert(user, "no cell!") + /obj/item/modular_computer/wrench_act_secondary(mob/living/user, obj/item/tool) . = ..() tool.play_tool_sound(src, user, 20, volume=20) - internal_cell?.forceMove(drop_location()) - computer_id_slot?.forceMove(drop_location()) - inserted_disk?.forceMove(drop_location()) - inserted_pai?.forceMove(drop_location()) - new /obj/item/stack/sheet/iron(get_turf(loc), steel_sheet_cost) + deconstruct(TRUE) user.balloon_alert(user, "disassembled") - relay_qdel() - qdel(src) return TOOL_ACT_TOOLTYPE_SUCCESS /obj/item/modular_computer/welder_act(mob/living/user, obj/item/tool) @@ -788,7 +827,7 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar return TOOL_ACT_TOOLTYPE_SUCCESS to_chat(user, span_notice("You begin repairing damage to \the [src]...")) - if(!tool.use_tool(src, user, 20, volume=50, amount=1)) + if(!tool.use_tool(src, user, 20, volume=50)) return TOOL_ACT_TOOLTYPE_SUCCESS atom_integrity = max_integrity to_chat(user, span_notice("You repair \the [src].")) @@ -796,15 +835,26 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar return TOOL_ACT_TOOLTYPE_SUCCESS /obj/item/modular_computer/deconstruct(disassembled = TRUE) - break_apart() - return ..() - -/obj/item/modular_computer/proc/break_apart() + remove_pai() + eject_aicard() if(!(flags_1 & NODECONSTRUCT_1)) - physical.visible_message(span_notice("\The [src] breaks apart!")) - var/turf/newloc = get_turf(src) - new /obj/item/stack/sheet/iron(newloc, round(steel_sheet_cost / 2)) + if (disassembled) + internal_cell?.forceMove(drop_location()) + computer_id_slot?.forceMove(drop_location()) + inserted_disk?.forceMove(drop_location()) + new /obj/item/stack/sheet/iron(drop_location(), steel_sheet_cost) + else + physical.visible_message(span_notice("\The [src] breaks apart!")) + new /obj/item/stack/sheet/iron(drop_location(), round(steel_sheet_cost * 0.5)) relay_qdel() + return ..() + +// Ejects the inserted intellicard, if one exists. Used when the computer is deconstructed. +/obj/item/modular_computer/proc/eject_aicard() + var/datum/computer_file/program/ai_restorer/program = locate() in stored_files + if (program) + return program.try_eject(forced = TRUE) + return FALSE // Used by processor to relay qdel() to machinery type. /obj/item/modular_computer/proc/relay_qdel() @@ -816,8 +866,33 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar return physical.Adjacent(neighbor) return ..() -/obj/item/modular_computer/proc/Add_Messenger() - GLOB.TabletMessengers += src +///Returns a string of what to send at the end of messenger's messages. +/obj/item/modular_computer/proc/get_messenger_ending() + return "Sent from my PDA" -/obj/item/modular_computer/proc/Remove_Messenger() - GLOB.TabletMessengers -= src +/obj/item/modular_computer/proc/insert_pai(mob/user, obj/item/pai_card/card) + if(inserted_pai) + return FALSE + if(!user.transferItemToLoc(card, src)) + return FALSE + inserted_pai = card + balloon_alert(user, "inserted pai") + var/datum/action/innate/pai/messenger/messenger_ability = new(inserted_pai.pai) + messenger_ability.Grant(inserted_pai.pai) + update_appearance(UPDATE_ICON) + return TRUE + +/obj/item/modular_computer/proc/remove_pai(mob/user) + if(!inserted_pai) + return FALSE + var/datum/action/innate/pai/messenger/messenger_ability = locate() in inserted_pai.pai.actions + messenger_ability.Remove(inserted_pai.pai) + qdel(messenger_ability) + if(user) + user.put_in_hands(inserted_pai) + balloon_alert(user, "removed pAI") + else + inserted_pai.forceMove(drop_location()) + inserted_pai = null + update_appearance(UPDATE_ICON) + return TRUE diff --git a/code/modules/modular_computers/computers/item/computer_files.dm b/code/modules/modular_computers/computers/item/computer_files.dm index 8d9f9006b0764..6b6fbd179f21f 100644 --- a/code/modules/modular_computers/computers/item/computer_files.dm +++ b/code/modules/modular_computers/computers/item/computer_files.dm @@ -14,11 +14,10 @@ if(file_storing in stored_files) return FALSE - SEND_SIGNAL(file_storing, COMSIG_MODULAR_COMPUTER_FILE_ADDING) file_storing.computer = src - stored_files.Add(file_storing) used_capacity += file_storing.size - SEND_SIGNAL(file_storing, COMSIG_MODULAR_COMPUTER_FILE_ADDED) + SEND_SIGNAL(file_storing, COMSIG_COMPUTER_FILE_STORE, src) + SEND_SIGNAL(src, COMSIG_MODULAR_COMPUTER_FILE_STORE, file_storing) return TRUE /** @@ -35,15 +34,13 @@ return FALSE if(istype(file_removing, /datum/computer_file/program)) var/datum/computer_file/program/program_file = file_removing - if(program_file == active_program) - active_program.kill_program() - for(var/datum/computer_file/program/programs as anything in idle_threads) - programs.kill_program() + program_file.kill_program() - SEND_SIGNAL(file_removing, COMSIG_MODULAR_COMPUTER_FILE_DELETING) stored_files.Remove(file_removing) used_capacity -= file_removing.size - SEND_SIGNAL(file_removing, COMSIG_MODULAR_COMPUTER_FILE_DELETED) + SEND_SIGNAL(src, COMSIG_MODULAR_COMPUTER_FILE_DELETE, file_removing) + SEND_SIGNAL(file_removing, COMSIG_COMPUTER_FILE_DELETE) + qdel(file_removing) return TRUE /** @@ -78,14 +75,34 @@ * If a computer disk is passed instead, it will check the disk over the computer. */ /obj/item/modular_computer/proc/find_file_by_name(filename, obj/item/computer_disk/target_disk) - if(!filename) + if(!istext(filename)) return null - if(target_disk) - for(var/datum/computer_file/file as anything in target_disk.stored_files) + if(isnull(target_disk)) + for(var/datum/computer_file/file as anything in stored_files) if(file.filename == filename) return file else - for(var/datum/computer_file/file as anything in stored_files) + for(var/datum/computer_file/file as anything in target_disk.stored_files) if(file.filename == filename) return file return null + +/** + * find_file_by_uid + * + * Will check all files in this computer and returns the file with the matching uid. + * A file's uid is always unique to them, so this proc is sometimes preferable over find_file_by_name. + * If a computer disk is passed instead, it will check the disk over the computer. + */ +/obj/item/modular_computer/proc/find_file_by_uid(uid, obj/item/computer_disk/target_disk) + if(!isnum(uid)) + return null + if(isnull(target_disk)) + for(var/datum/computer_file/file as anything in stored_files) + if(file.uid == uid) + return file + else + for(var/datum/computer_file/file as anything in target_disk.stored_files) + if(file.uid == uid) + return file + return null diff --git a/code/modules/modular_computers/computers/item/computer_power.dm b/code/modules/modular_computers/computers/item/computer_power.dm index 6b6230ed0d4ce..69244ccc24438 100644 --- a/code/modules/modular_computers/computers/item/computer_power.dm +++ b/code/modules/modular_computers/computers/item/computer_power.dm @@ -1,9 +1,13 @@ +///The multiplier given to the base overtime charge drain value if its flashlight is on. +#define FLASHLIGHT_DRAIN_MULTIPLIER 1.1 + // Tries to draw power from charger or, if no operational charger is present, from power cell. /obj/item/modular_computer/proc/use_power(amount = 0) if(check_power_override()) return TRUE - if(ismachinery(loc)) - var/obj/machinery/machine_holder = loc + + if(ismachinery(physical)) + var/obj/machinery/machine_holder = physical if(machine_holder.powered()) machine_holder.use_power(amount) return TRUE @@ -27,20 +31,30 @@ return if(active_program) active_program.event_powerfailure() + if(light_on) + set_light_on(FALSE) for(var/datum/computer_file/program/programs as anything in idle_threads) programs.event_powerfailure() shutdown_computer(loud = FALSE) -// Handles power-related things, such as battery interaction, recharging, shutdown when it's discharged +///Takes the charge necessary from the Computer, shutting it off if it's unable to provide it. +///Charge depends on whether the PC is on, and what programs are running/idle on it. /obj/item/modular_computer/proc/handle_power(seconds_per_tick) var/power_usage = screen_on ? base_active_power_usage : base_idle_power_usage + if(light_on) + power_usage *= FLASHLIGHT_DRAIN_MULTIPLIER + if(active_program) + power_usage += active_program.power_cell_use + for(var/datum/computer_file/program/open_programs as anything in idle_threads) + if(!open_programs.power_cell_use) + continue + if(open_programs in idle_threads) + power_usage += (open_programs.power_cell_use / 2) - if(use_power(power_usage)) - last_power_usage = power_usage + if(use_power(power_usage * seconds_per_tick)) return TRUE - else - power_failure() - return FALSE + power_failure() + return FALSE ///Used by subtypes for special cases for power usage, returns TRUE if it should stop the use_power chain. /obj/item/modular_computer/proc/check_power_override() @@ -49,3 +63,5 @@ //Integrated (Silicon) tablets don't drain power, because the tablet is required to state laws, so it being disabled WILL cause problems. /obj/item/modular_computer/pda/silicon/check_power_override() return TRUE + +#undef FLASHLIGHT_DRAIN_MULTIPLIER diff --git a/code/modules/modular_computers/computers/item/computer_ui.dm b/code/modules/modular_computers/computers/item/computer_ui.dm index 2a76a20ef1bc0..1b87a014f185b 100644 --- a/code/modules/modular_computers/computers/item/computer_ui.dm +++ b/code/modules/modular_computers/computers/item/computer_ui.dm @@ -15,18 +15,26 @@ if(!active_ui) if(active_program) active_ui = new(user, src, active_program.tgui_id, active_program.filedesc) + active_program.ui_interact(user, active_ui) else active_ui = new(user, src, "NtosMain") return active_ui.open() - if(active_program) - active_ui.interface = active_program.tgui_id - active_ui.title = active_program.filedesc - else - active_ui.interface = "NtosMain" + for (var/datum/tgui/window as anything in open_uis) + if(active_program) + window.interface = active_program.tgui_id + window.title = active_program.filedesc + active_program.ui_interact(user, window) + else + window.interface = "NtosMain" + window.send_assets() + update_static_data_for_all_viewers() + - update_static_data(user, active_ui) - active_ui.send_assets() +/obj/item/modular_computer/ui_state(mob/user) + if(inserted_pai && (user == inserted_pai.pai)) + return GLOB.contained_state + return ..() /obj/item/modular_computer/interact(mob/user) if(enabled) @@ -36,7 +44,7 @@ // Operates TGUI /obj/item/modular_computer/ui_interact(mob/user, datum/tgui/ui) - if(!enabled || !user.can_read(src, READING_CHECK_LITERACY) || !use_power()) + if(!enabled || !user.can_read(src, READING_CHECK_LITERACY)) if(ui) ui.close() return @@ -126,7 +134,7 @@ switch(action) if("PC_exit") - active_program.kill_program() + active_program.kill_program(usr) return TRUE if("PC_shutdown") shutdown_computer() @@ -144,7 +152,7 @@ if(!istype(killed_program)) return - killed_program.kill_program() + killed_program.kill_program(usr) to_chat(usr, span_notice("Program [killed_program.filename].[killed_program.filetype] with PID [rand(100,999)] has been killed.")) return TRUE @@ -197,18 +205,16 @@ return TRUE if("PC_Imprint_ID") - saved_identification = computer_id_slot.registered_name - saved_job = computer_id_slot.assignment + imprint_id() UpdateDisplay() playsound(src, 'sound/machines/terminal_processing.ogg', 15, TRUE) if("PC_Pai_Interact") switch(params["option"]) if("eject") - usr.put_in_hands(inserted_pai) - to_chat(usr, span_notice("You remove [inserted_pai] from the [name].")) - inserted_pai = null - update_appearance(UPDATE_ICON) + if(!ishuman(usr)) + return + remove_pai(usr) if("interact") inserted_pai.attack_self(usr) return TRUE @@ -220,3 +226,8 @@ if(physical) return physical return src + +/obj/item/modular_computer/ui_close(mob/user) + . = ..() + if(active_program) + active_program.ui_close(user) diff --git a/code/modules/modular_computers/computers/item/disks/computer_disk.dm b/code/modules/modular_computers/computers/item/disks/computer_disk.dm index bd652a31c8e48..c7d7688c8965b 100644 --- a/code/modules/modular_computers/computers/item/disks/computer_disk.dm +++ b/code/modules/modular_computers/computers/item/disks/computer_disk.dm @@ -1,7 +1,7 @@ /obj/item/computer_disk name = "data disk" desc = "Removable disk used to store data." - icon = 'icons/obj/module.dmi' + icon = 'icons/obj/assemblies/module.dmi' icon_state = "datadisk6" w_class = WEIGHT_CLASS_TINY ///The amount of storage space is on the disk @@ -17,7 +17,7 @@ /obj/item/computer_disk/Initialize(mapload) . = ..() for(var/programs in starting_programs) - var/datum/computer_file/program/program_type = new programs + var/datum/computer_file/program_type = new programs add_file(program_type) /obj/item/computer_disk/Destroy(force) @@ -47,6 +47,7 @@ return FALSE stored_files.Remove(file) used_capacity -= file.size + qdel(file) return TRUE /obj/item/computer_disk/advanced diff --git a/code/modules/modular_computers/computers/item/disks/role_disks.dm b/code/modules/modular_computers/computers/item/disks/role_disks.dm index e8c68bc83637a..da52ee76281a1 100644 --- a/code/modules/modular_computers/computers/item/disks/role_disks.dm +++ b/code/modules/modular_computers/computers/item/disks/role_disks.dm @@ -116,18 +116,13 @@ * Engineering */ /obj/item/computer_disk/engineering - name = "station engineer data disk" + name = "engineering data disk" desc = "Removable disk used to download engineering-related tablet apps." icon_state = "datadisk6" starting_programs = list( + /datum/computer_file/program/alarm_monitor, + /datum/computer_file/program/atmosscan, /datum/computer_file/program/supermatter_monitor, + ) -/obj/item/computer_disk/atmos - name = "atmospheric technician data disk" - desc = "Removable disk used to download atmos-related tablet apps." - icon_state = "datadisk6" - starting_programs = list( - /datum/computer_file/program/atmosscan, - /datum/computer_file/program/alarm_monitor, - ) diff --git a/code/modules/modular_computers/computers/item/disks/unique_disks.dm b/code/modules/modular_computers/computers/item/disks/unique_disks.dm new file mode 100644 index 0000000000000..144fa52c65afd --- /dev/null +++ b/code/modules/modular_computers/computers/item/disks/unique_disks.dm @@ -0,0 +1,8 @@ +/obj/item/computer_disk/syndicate + name = "golden data disk" + desc = "A data disk with some high-tech programs, probably expensive as hell." + icon_state = "datadisk8" + custom_materials = list(/datum/material/gold = SMALL_MATERIAL_AMOUNT) + +/obj/item/computer_disk/syndicate/camera_app + starting_programs = list(/datum/computer_file/program/secureye/syndicate) diff --git a/code/modules/modular_computers/computers/item/disks/virus_disk.dm b/code/modules/modular_computers/computers/item/disks/virus_disk.dm index d566c1f6f4472..e3eac7736f504 100644 --- a/code/modules/modular_computers/computers/item/disks/virus_disk.dm +++ b/code/modules/modular_computers/computers/item/disks/virus_disk.dm @@ -9,7 +9,7 @@ ///How many charges the virus has left var/charges = 5 -/obj/item/computer_disk/virus/proc/send_virus(obj/item/modular_computer/pda/source, obj/item/modular_computer/pda/target, mob/living/user) +/obj/item/computer_disk/virus/proc/send_virus(obj/item/modular_computer/pda/source, obj/item/modular_computer/pda/target, mob/living/user, message) if(charges <= 0) to_chat(user, span_notice("ERROR: Out of charges.")) return FALSE @@ -26,7 +26,7 @@ /obj/item/computer_disk/virus/clown name = "\improper H.O.N.K. disk" -/obj/item/computer_disk/virus/clown/send_virus(obj/item/modular_computer/pda/source, obj/item/modular_computer/pda/target, mob/living/user) +/obj/item/computer_disk/virus/clown/send_virus(obj/item/modular_computer/pda/source, obj/item/modular_computer/pda/target, mob/living/user, message) . = ..() if(!.) return FALSE @@ -43,7 +43,7 @@ /obj/item/computer_disk/virus/mime name = "\improper sound of silence disk" -/obj/item/computer_disk/virus/mime/send_virus(obj/item/modular_computer/pda/source, obj/item/modular_computer/pda/target, mob/living/user) +/obj/item/computer_disk/virus/mime/send_virus(obj/item/modular_computer/pda/source, obj/item/modular_computer/pda/target, mob/living/user, message) . = ..() if(!.) return FALSE @@ -53,7 +53,7 @@ return FALSE user.show_message(span_notice("Success!")) charges-- - app.ringer_status = FALSE + app.alert_silenced = TRUE app.ringtone = "" /** @@ -64,7 +64,7 @@ name = "\improper D.E.T.O.M.A.T.I.X. disk" charges = 6 -/obj/item/computer_disk/virus/detomatix/send_virus(obj/item/modular_computer/pda/source, obj/item/modular_computer/pda/target, mob/living/user) +/obj/item/computer_disk/virus/detomatix/send_virus(obj/item/modular_computer/pda/source, obj/item/modular_computer/pda/target, mob/living/user, message) . = ..() if(!.) return FALSE @@ -82,15 +82,18 @@ var/fakejob = sanitize_name(tgui_input_text(user, "Enter a job for the rigged message.", "Forge Message", max_length = MAX_NAME_LEN), allow_numbers = TRUE) if(!fakejob || source != original_host || !user.can_perform_action(source)) return + var/attach_fake_photo = tgui_alert(user, "Attach a fake photo?", "Forge Message", list("Yes", "No")) == "Yes" var/datum/computer_file/program/messenger/app = locate() in source.stored_files - if(!app || charges <= 0 || !app.send_message(user, list(target), rigged = REF(user), fake_name = fakename, fake_job = fakejob)) + var/datum/computer_file/program/messenger/target_app = locate() in target.stored_files + if(!app || charges <= 0 || !app.send_rigged_message(user, message, list(target_app), fakename, fakejob, attach_fake_photo)) return FALSE charges-- user.show_message(span_notice("Success!")) var/reference = REF(src) target.add_traits(list(TRAIT_PDA_CAN_EXPLODE, TRAIT_PDA_MESSAGE_MENU_RIGGED), reference) addtimer(TRAIT_CALLBACK_REMOVE(target, TRAIT_PDA_MESSAGE_MENU_RIGGED, reference), 10 SECONDS) + addtimer(TRAIT_CALLBACK_REMOVE(target, TRAIT_PDA_CAN_EXPLODE, reference), 1 MINUTES) return TRUE /** @@ -119,7 +122,7 @@ telecrystal_stack.use(telecrystal_stack.amount) -/obj/item/computer_disk/virus/frame/send_virus(obj/item/modular_computer/pda/source, obj/item/modular_computer/pda/target, mob/living/user) +/obj/item/computer_disk/virus/frame/send_virus(obj/item/modular_computer/pda/source, obj/item/modular_computer/pda/target, mob/living/user, message) . = ..() if(!.) return FALSE diff --git a/code/modules/modular_computers/computers/item/laptop.dm b/code/modules/modular_computers/computers/item/laptop.dm index ceb4d61cc9a5f..d3b620cdfc9bf 100644 --- a/code/modules/modular_computers/computers/item/laptop.dm +++ b/code/modules/modular_computers/computers/item/laptop.dm @@ -119,7 +119,8 @@ screen_on = !screen_on update_appearance() - +/obj/item/modular_computer/laptop/get_messenger_ending() + return "Sent from my UNIX Laptop" // Laptop frame, starts empty and closed. /obj/item/modular_computer/laptop/buildable diff --git a/code/modules/modular_computers/computers/item/pda.dm b/code/modules/modular_computers/computers/item/pda.dm index 9728e8c6f7f6e..308e8ea0ae88b 100644 --- a/code/modules/modular_computers/computers/item/pda.dm +++ b/code/modules/modular_computers/computers/item/pda.dm @@ -83,7 +83,7 @@ /obj/item/modular_computer/pda/interact(mob/user) . = ..() if(HAS_TRAIT(src, TRAIT_PDA_MESSAGE_MENU_RIGGED)) - explode(usr, from_message_menu = TRUE) + explode(user, from_message_menu = TRUE) /obj/item/modular_computer/pda/attack_self(mob/user) // bypass literacy checks to access syndicate uplink @@ -374,7 +374,7 @@ .["comp_light_color"] = robo.lamp_color //Makes the flashlight button affect the borg rather than the tablet -/obj/item/modular_computer/pda/silicon/toggle_flashlight() +/obj/item/modular_computer/pda/silicon/toggle_flashlight(mob/user) if(!silicon_owner || QDELETED(silicon_owner)) return FALSE if(iscyborg(silicon_owner)) diff --git a/code/modules/modular_computers/computers/item/processor.dm b/code/modules/modular_computers/computers/item/processor.dm index fb90be19ddffd..01c04ed68cd65 100644 --- a/code/modules/modular_computers/computers/item/processor.dm +++ b/code/modules/modular_computers/computers/item/processor.dm @@ -22,6 +22,7 @@ CRASH("A non '/obj/machinery/modular_computer' had a [src] initialized in it!") // Obtain reference to machinery computer + physical = loc machinery_computer = loc machinery_computer.cpu = src internal_cell = machinery_computer.internal_cell @@ -45,3 +46,6 @@ /obj/item/modular_computer/processor/relay_qdel() qdel(machinery_computer) + +/obj/item/modular_computer/processor/get_messenger_ending() + return "Sent from my Desktop" 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 4dc7ee420c9bf..60f92c282a884 100644 --- a/code/modules/modular_computers/computers/item/role_tablet_presets.dm +++ b/code/modules/modular_computers/computers/item/role_tablet_presets.dm @@ -91,18 +91,19 @@ greyscale_colors = "#FAFAFA#000099#B347BC" inserted_item = /obj/item/pen/fountain starting_programs = list( + /datum/computer_file/program/borg_monitor, + /datum/computer_file/program/budgetorders, /datum/computer_file/program/crew_manifest, - /datum/computer_file/program/status, - /datum/computer_file/program/science, /datum/computer_file/program/robocontrol, - /datum/computer_file/program/budgetorders, + /datum/computer_file/program/science, + /datum/computer_file/program/status, /datum/computer_file/program/signal_commander, ) /obj/item/modular_computer/pda/heads/quartermaster name = "quartermaster PDA" greyscale_config = /datum/greyscale_config/tablet/stripe_thick - greyscale_colors = "#D6B328#6506CA#927444" + greyscale_colors = "#c4b787#18191e#8b4c31" inserted_item = /obj/item/pen/survival stored_paper = 20 starting_programs = list( @@ -155,6 +156,8 @@ greyscale_config = /datum/greyscale_config/tablet/stripe_thick greyscale_colors = "#D99A2E#69DBF3#E3DF3D" starting_programs = list( + /datum/computer_file/program/alarm_monitor, + /datum/computer_file/program/atmosscan, /datum/computer_file/program/supermatter_monitor, ) @@ -163,8 +166,9 @@ greyscale_config = /datum/greyscale_config/tablet/stripe_thick greyscale_colors = "#EEDC43#00E5DA#727272" starting_programs = list( - /datum/computer_file/program/atmosscan, /datum/computer_file/program/alarm_monitor, + /datum/computer_file/program/atmosscan, + /datum/computer_file/program/supermatter_monitor, ) /** @@ -177,6 +181,7 @@ greyscale_colors = "#FAFAFA#000099#B347BC" starting_programs = list( /datum/computer_file/program/atmosscan, + /datum/computer_file/program/science, /datum/computer_file/program/signal_commander, ) @@ -185,7 +190,9 @@ greyscale_config = /datum/greyscale_config/tablet/stripe_double greyscale_colors = "#484848#0099CC#D94927" starting_programs = list( + /datum/computer_file/program/science, /datum/computer_file/program/robocontrol, + /datum/computer_file/program/borg_monitor, ) /obj/item/modular_computer/pda/geneticist @@ -247,7 +254,7 @@ /obj/item/modular_computer/pda/cargo name = "cargo technician PDA" - greyscale_colors = "#D6B328#6506CA" + greyscale_colors = "#8b4c31#2c2e32" stored_paper = 20 starting_programs = list( /datum/computer_file/program/shipping, @@ -258,8 +265,16 @@ /obj/item/modular_computer/pda/shaftminer name = "shaft miner PDA" greyscale_config = /datum/greyscale_config/tablet/stripe_thick - greyscale_colors = "#927444#D6B328#6C3BA1" + greyscale_colors = "#927444#8b4c31#4c202d" + starting_programs = list( + /datum/computer_file/program/skill_tracker, + ) + +/obj/item/modular_computer/pda/bitrunner + name = "bit runner PDA" + greyscale_colors = "#D6B328#6BC906" starting_programs = list( + /datum/computer_file/program/arcade, /datum/computer_file/program/skill_tracker, ) @@ -362,7 +377,7 @@ . = ..() for(var/datum/computer_file/program/messenger/msg in stored_files) msg.mime_mode = TRUE - msg.ringer_status = FALSE + msg.alert_silenced = TRUE /obj/item/modular_computer/pda/curator name = "curator PDA" @@ -380,7 +395,7 @@ /obj/item/modular_computer/pda/curator/Initialize(mapload) . = ..() for(var/datum/computer_file/program/messenger/msg in stored_files) - msg.ringer_status = FALSE + msg.alert_silenced = TRUE /obj/item/modular_computer/pda/psychologist name = "psychologist PDA" @@ -425,3 +440,13 @@ greyscale_config = null greyscale_colors = null long_ranged = TRUE + +/obj/item/modular_computer/pda/clear/Initialize(mapload) + . = ..() + var/datum/computer_file/program/themeify/theme_app = locate() in stored_files + if(theme_app) + for(var/theme_key in GLOB.pda_name_to_theme - GLOB.default_pda_themes) + theme_app.imported_themes += theme_key + +/obj/item/modular_computer/pda/clear/get_messenger_ending() + return "Sent from my crystal PDA" diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm index 0236e42ff9d41..00af9975e2426 100644 --- a/code/modules/modular_computers/computers/machinery/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -1,19 +1,18 @@ -/obj/machinery/modular_computer/console/preset +/obj/machinery/modular_computer/preset ///List of programs the computer starts with, given on Initialize. var/list/datum/computer_file/starting_programs = list() -/obj/machinery/modular_computer/console/preset/Initialize(mapload) +/obj/machinery/modular_computer/preset/Initialize(mapload) . = ..() if(!cpu) return for(var/programs in starting_programs) - var/datum/computer_file/program/program_type = new programs + var/datum/computer_file/program_type = new programs cpu.store_file(program_type) // ===== ENGINEERING CONSOLE ===== -/obj/machinery/modular_computer/console/preset/engineering - console_department = "Engineering" +/obj/machinery/modular_computer/preset/engineering name = "engineering console" desc = "A stationary computer. This one comes preloaded with engineering programs." starting_programs = list( @@ -23,8 +22,7 @@ ) // ===== RESEARCH CONSOLE ===== -/obj/machinery/modular_computer/console/preset/research - console_department = "Research" +/obj/machinery/modular_computer/preset/research name = "research director's console" desc = "A stationary computer. This one comes preloaded with research programs." starting_programs = list( @@ -36,8 +34,7 @@ ) // ===== COMMAND CONSOLE ===== -/obj/machinery/modular_computer/console/preset/command - console_department = "Command" +/obj/machinery/modular_computer/preset/command name = "command console" desc = "A stationary computer. This one comes preloaded with command programs." starting_programs = list( @@ -46,8 +43,7 @@ ) // ===== IDENTIFICATION CONSOLE ===== -/obj/machinery/modular_computer/console/preset/id - console_department = "Identification" +/obj/machinery/modular_computer/preset/id name = "identification console" desc = "A stationary computer. This one comes preloaded with identification modification programs." starting_programs = list( @@ -57,17 +53,16 @@ /datum/computer_file/program/crew_manifest, ) -/obj/machinery/modular_computer/console/preset/id/centcom +/obj/machinery/modular_computer/preset/id/centcom desc = "A stationary computer. This one comes preloaded with CentCom identification modification programs." -/obj/machinery/modular_computer/console/preset/id/centcom/Initialize(mapload) +/obj/machinery/modular_computer/preset/id/centcom/Initialize(mapload) . = ..() var/datum/computer_file/program/card_mod/card_mod_centcom = cpu.find_file_by_name("plexagonidwriter") card_mod_centcom.is_centcom = TRUE // ===== CIVILIAN CONSOLE ===== -/obj/machinery/modular_computer/console/preset/civilian - console_department = "Civilian" +/obj/machinery/modular_computer/preset/civilian name = "civilian console" desc = "A stationary computer. This one comes preloaded with generic programs." starting_programs = list( @@ -76,8 +71,7 @@ ) // curator -/obj/machinery/modular_computer/console/preset/curator - console_department = "Civilian" +/obj/machinery/modular_computer/preset/curator name = "curator console" desc = "A stationary computer. This one comes preloaded with art programs." starting_programs = list( @@ -85,48 +79,51 @@ ) // ===== CARGO CHAT CONSOLES ===== -/obj/machinery/modular_computer/console/preset/cargochat +/obj/machinery/modular_computer/preset/cargochat name = "cargo chatroom console" desc = "A stationary computer. This one comes preloaded with a chatroom for your cargo requests." starting_programs = list( /datum/computer_file/program/chatclient, ) -/obj/machinery/modular_computer/console/preset/cargochat/Initialize(mapload) + ///Used in Initialize to set the chat client name. + var/console_department + +/obj/machinery/modular_computer/preset/cargochat/Initialize(mapload) . = ..() var/datum/computer_file/program/chatclient/chatprogram = cpu.find_file_by_name("ntnrc_client") chatprogram.username = "[lowertext(console_department)]_department" cpu.active_program = chatprogram -/obj/machinery/modular_computer/console/preset/cargochat/service +/obj/machinery/modular_computer/preset/cargochat/service console_department = "Service" -/obj/machinery/modular_computer/console/preset/cargochat/engineering +/obj/machinery/modular_computer/preset/cargochat/engineering console_department = "Engineering" -/obj/machinery/modular_computer/console/preset/cargochat/science +/obj/machinery/modular_computer/preset/cargochat/science console_department = "Science" -/obj/machinery/modular_computer/console/preset/cargochat/security +/obj/machinery/modular_computer/preset/cargochat/security console_department = "Security" -/obj/machinery/modular_computer/console/preset/cargochat/medical +/obj/machinery/modular_computer/preset/cargochat/medical console_department = "Medical" //ONE PER MAP PLEASE, IT MAKES A CARGOBUS FOR EACH ONE OF THESE -/obj/machinery/modular_computer/console/preset/cargochat/cargo +/obj/machinery/modular_computer/preset/cargochat/cargo console_department = "Cargo" name = "department chatroom console" desc = "A stationary computer. This one comes preloaded with a chatroom for incoming cargo requests. You may moderate it from this computer." -/obj/machinery/modular_computer/console/preset/cargochat/cargo/LateInitialize() +/obj/machinery/modular_computer/preset/cargochat/cargo/LateInitialize() . = ..() var/datum/computer_file/program/chatclient/chatprogram = cpu.find_file_by_name("ntnrc_client") chatprogram.username = "cargo_requests_operator" var/datum/ntnet_conversation/cargochat = chatprogram.create_new_channel("#cargobus", strong = TRUE) - for(var/obj/machinery/modular_computer/console/preset/cargochat/cargochat_console in GLOB.machines) + for(var/obj/machinery/modular_computer/preset/cargochat/cargochat_console as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/modular_computer/preset/cargochat)) if(cargochat_console == src) continue var/datum/computer_file/program/chatclient/other_chatprograms = cargochat_console.cpu.find_file_by_name("ntnrc_client") diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index 1c9b353eaa8e0..c54d3295fe389 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -1,30 +1,26 @@ -// Modular Computer - device that runs various programs and operates with hardware -// DO NOT SPAWN THIS TYPE. Use /laptop/ or /console/ instead. +// Modular Computer - A machinery that is mostly just a host to the Modular Computer item. /obj/machinery/modular_computer name = "modular computer" desc = "You shouldn't see this. If you do, report it." //they should be examining the processor instead - - // Modular computers can run on various devices. Each DEVICE (Laptop, Console, Tablet,..) - // must have it's own DMI file. Icon states must be called exactly the same in all files, but may look differently - // If you create a program which is limited to Laptops and Consoles you don't have to add it's icon_state overlay for Tablets too, for example. - icon = 'icons/obj/modular_console.dmi' - icon_state = null - + icon = 'icons/obj/machines/modular_console.dmi' + icon_state = "console" idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.05 + density = TRUE + max_integrity = 300 + integrity_failure = 0.5 + ///The power cell, null by default as we use the APC we're in var/internal_cell = null ///A flag that describes this device type - var/hardware_flag = NONE - ///Power usage during last tick - var/last_power_usage = 0 + var/hardware_flag = PROGRAM_CONSOLE /// Amount of programs that can be ran at once var/max_idle_programs = 4 ///Icon state when the computer is turned off. - var/icon_state_unpowered = null + var/icon_state_unpowered = "console-off" ///Icon state when the computer is turned on. - var/icon_state_powered = null + var/icon_state_powered = "console" ///Icon state overlay when the computer is turned on, but no program is loaded that would override the screen. var/screen_icon_state_menu = "menu" ///Icon state overlay when the computer is powered, but not 'switched on'. @@ -32,11 +28,11 @@ ///Amount of steel sheets refunded when disassembling an empty frame of this computer. var/steel_sheet_cost = 10 ///Light luminosity when turned on - var/light_strength = 0 + var/light_strength = 2 ///Power usage when the computer is open (screen is active) and can be interacted with. - var/base_active_power_usage = 100 + var/base_active_power_usage = 500 ///Power usage when the computer is idle and screen is off (currently only applies to laptops) - var/base_idle_power_usage = 10 + var/base_idle_power_usage = 100 ///CPU that handles most logic while this type only handles power and other specific things. var/obj/item/modular_computer/processor/cpu @@ -44,7 +40,8 @@ /obj/machinery/modular_computer/Initialize(mapload) . = ..() cpu = new(src) - cpu.physical = src + cpu.screen_on = TRUE + update_appearance() /obj/machinery/modular_computer/Destroy() QDEL_NULL(cpu) @@ -62,9 +59,9 @@ if(cpu) cpu.attack_ghost(user) -/obj/machinery/modular_computer/emag_act(mob/user) +/obj/machinery/modular_computer/emag_act(mob/user, obj/item/card/emag/emag_card) if(!cpu) - to_chat(user, span_warning("You'd need to turn the [src] on first.")) + balloon_alert(user, "turn it on first!") return FALSE return cpu.emag_act(user) @@ -73,7 +70,7 @@ set_light(cpu?.enabled ? light_strength : 0) /obj/machinery/modular_computer/update_icon_state() - if(!cpu || !cpu.enabled || !cpu.use_power() || (machine_stat & NOPOWER)) + if(!cpu || !cpu.enabled || (machine_stat & NOPOWER)) icon_state = icon_state_unpowered else icon_state = icon_state_powered @@ -84,7 +81,7 @@ if(!cpu) return . - if(cpu.enabled && cpu.use_power()) + if(cpu.enabled) . += cpu.active_program?.program_icon_state || screen_icon_state_menu else if(!(machine_stat & NOPOWER)) . += screen_icon_screensaver @@ -126,9 +123,9 @@ return cpu.screwdriver_act(user, tool) return ..() -/obj/machinery/modular_computer/wrench_act(mob/user, obj/item/tool) +/obj/machinery/modular_computer/wrench_act_secondary(mob/user, obj/item/tool) if(cpu) - return cpu.wrench_act(user, tool) + return cpu.wrench_act_secondary(user, tool) return ..() /obj/machinery/modular_computer/welder_act(mob/user, obj/item/tool) diff --git a/code/modules/modular_computers/computers/machinery/modular_console.dm b/code/modules/modular_computers/computers/machinery/modular_console.dm deleted file mode 100644 index 2cbcb5ffdea88..0000000000000 --- a/code/modules/modular_computers/computers/machinery/modular_console.dm +++ /dev/null @@ -1,24 +0,0 @@ -/obj/machinery/modular_computer/console - name = "console" - desc = "A stationary computer." - - icon = 'icons/obj/modular_console.dmi' - icon_state = "console" - icon_state_powered = "console" - icon_state_unpowered = "console-off" - hardware_flag = PROGRAM_CONSOLE - density = TRUE - base_idle_power_usage = 100 - base_active_power_usage = 500 - steel_sheet_cost = 10 - light_strength = 2 - max_integrity = 300 - integrity_failure = 0.5 - ///Used in New() to set network tag according to our area. - var/console_department = "" - -/obj/machinery/modular_computer/console/Initialize(mapload) - . = ..() - if(cpu) - cpu.screen_on = TRUE - update_appearance() diff --git a/code/modules/modular_computers/file_system/computer_file.dm b/code/modules/modular_computers/file_system/computer_file.dm index 2c08fa8480e62..99fc288ffaf3a 100644 --- a/code/modules/modular_computers/file_system/computer_file.dm +++ b/code/modules/modular_computers/file_system/computer_file.dm @@ -19,17 +19,12 @@ /datum/computer_file/New() ..() uid = file_uid++ - RegisterSignal(src, COMSIG_MODULAR_COMPUTER_FILE_ADDED, PROC_REF(on_install)) + RegisterSignal(src, COMSIG_COMPUTER_FILE_STORE, PROC_REF(on_install)) /datum/computer_file/Destroy(force) if(computer) - if(src == computer.active_program) - computer.active_program = null - if(src in computer.idle_threads) - computer.idle_threads.Remove(src) computer = null if(disk_host) - disk_host.remove_file(src) disk_host = null return ..() @@ -55,9 +50,9 @@ return temp ///Called post-installation of an application in a computer, after 'computer' var is set. -/datum/computer_file/proc/on_install() +/datum/computer_file/proc/on_install(datum/computer_file/source, obj/item/modular_computer/computer_installing) SIGNAL_HANDLER - return + computer_installing.stored_files.Add(src) /** * Called when examining a modular computer diff --git a/code/modules/modular_computers/file_system/picture_file.dm b/code/modules/modular_computers/file_system/picture_file.dm new file mode 100644 index 0000000000000..4ba71aee3d78b --- /dev/null +++ b/code/modules/modular_computers/file_system/picture_file.dm @@ -0,0 +1,37 @@ +/** + * PNG file type + * Stores a picture which can be used by other programs. + */ +/datum/computer_file/picture + filetype = "PNG" // the superior filetype + size = 1 + /// The instance of the stored picture. + var/datum/picture/stored_picture + /// The name of the asset cache item. + /// This will be initialized after assign_path() is called. + var/picture_name + +/datum/computer_file/picture/New(datum/picture/stored_picture, picture_name) + ..() + if(isnull(stored_picture)) + return + src.filename = "[stored_picture.picture_name] ([uid])" + src.stored_picture = stored_picture + src.picture_name = picture_name + +/datum/computer_file/picture/on_install(datum/computer_file/source, obj/item/modular_computer/computer_installing) + . = ..() + assign_path() + +/// Assigns an asset path to the stored image, for use in the UI. +/datum/computer_file/picture/proc/assign_path() + if(!isnull(picture_name)) + return + picture_name = SSmodular_computers.get_next_picture_name() + SSassets.transport.register_asset(picture_name, stored_picture.picture_image) + +/datum/computer_file/picture/clone(rename = FALSE) + var/datum/computer_file/picture/temp = ..() + temp.stored_picture = stored_picture + temp.picture_name = picture_name + return temp diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index 2bf9a04a176ed..6f693b5bf998b 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -1,8 +1,14 @@ +///The default amount a program should take in cell use. +#define PROGRAM_BASIC_CELL_USE 15 + // /program/ files are executable programs that do things. /datum/computer_file/program filetype = "PRG" /// File name. FILE NAME MUST BE UNIQUE IF YOU WANT THE PROGRAM TO BE DOWNLOADABLE FROM NTNET! filename = "UnknownProgram" + + ///How much power running this program costs. + var/power_cell_use = PROGRAM_BASIC_CELL_USE /// List of required accesses to *run* the program. Any match will do. var/list/required_access = list() /// List of required access to download or file host the program. Any match will do. @@ -41,6 +47,8 @@ var/alert_pending = FALSE /// How well this program will help combat detomatix viruses. var/detomatix_resistance = NONE + ///Boolean on whether or not only one copy of the app can exist. This means it deletes itself when cloned elsewhere. + var/unique_copy = FALSE /datum/computer_file/program/clone() var/datum/computer_file/program/temp = ..() @@ -49,8 +57,21 @@ temp.program_icon_state = program_icon_state temp.requires_ntnet = requires_ntnet temp.usage_flags = usage_flags + if(unique_copy) + if(computer) + computer.remove_file(src) + if(disk_host) + disk_host.remove_file(src) return temp +/** + * WARNING: this proc does not work the same as normal `ui_interact`, as the + * computer takes care of opening the UI. The `datum/tgui/ui` parameter will always exist. + * This proc only serves as a callback. + */ +/datum/computer_file/program/ui_interact(mob/user, datum/tgui/ui) + SHOULD_CALL_PARENT(FALSE) + ///We are not calling parent as it's handled by the computer itself, this is only called after. /datum/computer_file/program/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) SHOULD_CALL_PARENT(FALSE) @@ -105,7 +126,7 @@ *access can contain a list of access numbers to check against. If access is not empty, it will be used istead of checking any inserted ID. */ /datum/computer_file/program/proc/can_run(mob/user, loud = FALSE, access_to_check, transfer = FALSE, list/access) - if(issilicon(user)) + if(issilicon(user) && !ispAI(user)) return TRUE if(isAdminGhostAI(user)) @@ -165,9 +186,9 @@ * Use this proc to kill the program. * Designed to be implemented by each program if it requires on-quit logic, such as the NTNRC client. * Args: - * - reload_ui - Whether we reload the UI on computer's shutdown. + * - user - If there's a user, this is the person killing the program. **/ -/datum/computer_file/program/proc/kill_program() +/datum/computer_file/program/proc/kill_program(mob/user) SHOULD_CALL_PARENT(TRUE) if(src == computer.active_program) @@ -196,3 +217,5 @@ computer.update_tablet_open_uis(usr) computer.update_appearance(UPDATE_ICON) return TRUE + +#undef PROGRAM_BASIC_CELL_USE diff --git a/code/modules/modular_computers/file_system/programs/airestorer.dm b/code/modules/modular_computers/file_system/programs/airestorer.dm index 21d66d4b0fc16..4f24b2c61d872 100644 --- a/code/modules/modular_computers/file_system/programs/airestorer.dm +++ b/code/modules/modular_computers/file_system/programs/airestorer.dm @@ -30,7 +30,7 @@ examine_text += span_info("Alt-click to eject the intelliCard.") return examine_text -/datum/computer_file/program/ai_restorer/kill_program() +/datum/computer_file/program/ai_restorer/kill_program(mob/user) try_eject(forced = TRUE) return ..() diff --git a/code/modules/modular_computers/file_system/programs/alarm.dm b/code/modules/modular_computers/file_system/programs/alarm.dm index e1205f92c6a87..c1aedb9d5d99b 100644 --- a/code/modules/modular_computers/file_system/programs/alarm.dm +++ b/code/modules/modular_computers/file_system/programs/alarm.dm @@ -46,11 +46,3 @@ program_icon_state = "alert-red" ui_header = "alarm_red.gif" update_computer_icon() // Always update the icon after we check our conditional because we might've changed it - -/datum/computer_file/program/alarm_monitor/on_start(mob/user) - . = ..(user) - GLOB.alarmdisplay += src - -/datum/computer_file/program/alarm_monitor/kill_program() - GLOB.alarmdisplay -= src - return ..() diff --git a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm index 4e165ed70d4f1..339dd3175ebef 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm @@ -32,7 +32,7 @@ target = null error = "Connection to destination relay lost." -/datum/computer_file/program/ntnet_dos/kill_program() +/datum/computer_file/program/ntnet_dos/kill_program(mob/user) if(target) target.dos_sources.Remove(src) target = null diff --git a/code/modules/modular_computers/file_system/programs/borg_monitor.dm b/code/modules/modular_computers/file_system/programs/borg_monitor.dm index 0cda5b5e7c2a7..2a2e494c1eca8 100644 --- a/code/modules/modular_computers/file_system/programs/borg_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/borg_monitor.dm @@ -19,7 +19,7 @@ DL_source = null return ..() -/datum/computer_file/program/borg_monitor/kill_program() +/datum/computer_file/program/borg_monitor/kill_program(mob/user) loglist = null //Not everything is saved if you close an app DL_source = null DL_progress = 0 @@ -62,7 +62,6 @@ loglist.Insert(1,"System log of unit [DL_source.name]") DL_progress = -1 DL_source = null - update_static_data_for_all_viewers() return DL_progress += 25 @@ -100,11 +99,9 @@ ) data["cyborgs"] += list(cyborg_data) data["DL_progress"] = DL_progress - return data -/datum/computer_file/program/borg_monitor/ui_static_data(mob/user) - var/list/data = list() data["borglog"] = loglist + return data /datum/computer_file/program/borg_monitor/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) diff --git a/code/modules/modular_computers/file_system/programs/bounty_board.dm b/code/modules/modular_computers/file_system/programs/bounty_board.dm index e24de13947aaf..cb7f6c288bb0c 100644 --- a/code/modules/modular_computers/file_system/programs/bounty_board.dm +++ b/code/modules/modular_computers/file_system/programs/bounty_board.dm @@ -127,7 +127,3 @@ if("bountyText") bounty_text = (params["bountytext"]) return TRUE - -/datum/computer_file/program/bounty_board/Destroy() - GLOB.allbountyboards -= computer - . = ..() diff --git a/code/modules/modular_computers/file_system/programs/budgetordering.dm b/code/modules/modular_computers/file_system/programs/budgetordering.dm index 1c7aae6f62aed..a7171dc04941c 100644 --- a/code/modules/modular_computers/file_system/programs/budgetordering.dm +++ b/code/modules/modular_computers/file_system/programs/budgetordering.dm @@ -118,9 +118,11 @@ if(SSshuttle.supply_blocked) message = blockade_warning data["message"] = message + var/list/amount_by_name = list() var/cart_list = list() for(var/datum/supply_order/order in SSshuttle.shopping_list) if(cart_list[order.pack.name]) + amount_by_name[order.pack.name] += 1 cart_list[order.pack.name][1]["amount"]++ cart_list[order.pack.name][1]["cost"] += order.get_final_cost() if(order.department_destination) @@ -145,15 +147,23 @@ data["cart"] += cart_list[item_id] data["requests"] = list() - for(var/datum/supply_order/SO in SSshuttle.request_list) + for(var/datum/supply_order/order in SSshuttle.request_list) + var/datum/supply_pack/pack = order.pack + amount_by_name[pack.name] += 1 data["requests"] += list(list( - "object" = SO.pack.name, - "cost" = SO.pack.get_cost(), - "orderer" = SO.orderer, - "reason" = SO.reason, - "id" = SO.id + "object" = pack.name, + "cost" = pack.get_cost(), + "orderer" = order.orderer, + "reason" = order.reason, + "id" = order.id )) + data["amount_by_name"] = amount_by_name + + return data +/datum/computer_file/program/budgetorders/ui_static_data(mob/user) + var/list/data = list() + data["max_order"] = CARGO_MAX_ORDER return data /datum/computer_file/program/budgetorders/ui_act(action, params, datum/tgui/ui) @@ -218,7 +228,7 @@ if(!istype(id_card)) computer.say("No ID card detected.") return - if(istype(id_card, /obj/item/card/id/departmental_budget)) + if(IS_DEPARTMENTAL_CARD(id_card)) computer.say("[id_card] cannot be used to make purchases.") return account = id_card.registered_account @@ -233,15 +243,20 @@ return if(pack.goody && !self_paid) - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) + playsound(computer, 'sound/machines/buzz-sigh.ogg', 50, FALSE) computer.say("ERROR: Small crates may only be purchased by private accounts.") return + if(SSshuttle.supply.get_order_count(pack) == OVER_ORDER_LIMIT) + playsound(computer, 'sound/machines/buzz-sigh.ogg', 50, FALSE) + computer.say("ERROR: No more then [CARGO_MAX_ORDER] of any pack may be ordered at once") + return + if(!requestonly && !self_paid && ishuman(usr) && !account) var/obj/item/card/id/id_card = computer.computer_id_slot?.GetID() account = SSeconomy.get_dep_account(id_card?.registered_account?.account_job.paycheck_department) - var/turf/T = get_turf(src) + var/turf/T = get_turf(computer) var/datum/supply_order/SO = new(pack, name, rank, ckey, reason, account) SO.generateRequisition(T) if((requestonly && !self_paid) || !(computer.computer_id_slot?.GetID())) diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm index c25ea65628d8b..529cf813d1bb9 100644 --- a/code/modules/modular_computers/file_system/programs/card.dm +++ b/code/modules/modular_computers/file_system/programs/card.dm @@ -79,7 +79,7 @@ return FALSE computer.crew_manifest_update = TRUE -/datum/computer_file/program/card_mod/kill_program() +/datum/computer_file/program/card_mod/kill_program(mob/user) computer.crew_manifest_update = FALSE var/obj/item/card/id/inserted_auth_card = computer.computer_id_slot if(inserted_auth_card) @@ -206,7 +206,7 @@ if("PRG_assign") if(!computer || !authenticated_card || !inserted_auth_card) return TRUE - var/new_asignment = sanitize(params["assignment"]) + var/new_asignment = trim(sanitize(params["assignment"]), MAX_NAME_LEN) inserted_auth_card.assignment = new_asignment playsound(computer, SFX_TERMINAL_TYPE, 50, FALSE) inserted_auth_card.update_label() diff --git a/code/modules/modular_computers/file_system/programs/crewmanifest.dm b/code/modules/modular_computers/file_system/programs/crewmanifest.dm index 3215f62eef84c..cdd05d6b4c64f 100644 --- a/code/modules/modular_computers/file_system/programs/crewmanifest.dm +++ b/code/modules/modular_computers/file_system/programs/crewmanifest.dm @@ -4,7 +4,7 @@ category = PROGRAM_CATEGORY_CREW program_icon_state = "id" extended_desc = "Program for viewing and printing the current crew manifest" - transfer_access = list(ACCESS_COMMAND) + transfer_access = list(ACCESS_SECURITY, ACCESS_COMMAND) requires_ntnet = TRUE size = 4 tgui_id = "NtosCrewManifest" diff --git a/code/modules/modular_computers/file_system/programs/file_browser.dm b/code/modules/modular_computers/file_system/programs/file_browser.dm index 78b2f83ec1b73..50fa29ccd5c47 100644 --- a/code/modules/modular_computers/file_system/programs/file_browser.dm +++ b/code/modules/modular_computers/file_system/programs/file_browser.dm @@ -57,6 +57,8 @@ var/datum/computer_file/F = computer.find_file_by_name(params["name"]) if(!F) return + if(computer.find_file_by_name(params["name"], computer.inserted_disk)) + return var/datum/computer_file/C = F.clone(FALSE) computer.inserted_disk.add_file(C) return TRUE diff --git a/code/modules/modular_computers/file_system/programs/frontier.dm b/code/modules/modular_computers/file_system/programs/frontier.dm index 778fbab578ea8..cf6cc4b2bc273 100644 --- a/code/modules/modular_computers/file_system/programs/frontier.dm +++ b/code/modules/modular_computers/file_system/programs/frontier.dm @@ -25,7 +25,7 @@ /datum/computer_file/program/scipaper_program/on_start(mob/living/user) . = ..() if(!CONFIG_GET(flag/no_default_techweb_link) && !linked_techweb) - linked_techweb = SSresearch.science_tech + CONNECT_TO_RND_SERVER_ROUNDSTART(linked_techweb, src) /datum/computer_file/program/scipaper_program/application_attackby(obj/item/attacking_item, mob/living/user) if(!istype(attacking_item, /obj/item/multitool)) @@ -38,7 +38,7 @@ /datum/computer_file/program/scipaper_program/proc/recheck_file_presence() if(selected_file in computer.stored_files) return FALSE - UnregisterSignal(selected_file, COMSIG_MODULAR_COMPUTER_FILE_DELETED) + UnregisterSignal(selected_file, COMSIG_COMPUTER_FILE_DELETE) selected_file = null paper_to_be.set_experiment() @@ -189,12 +189,12 @@ return TRUE if("select_file") // Selecting new file will necessitate a change in paper type. This will be done on select_experiment and not here. if(selected_file) - UnregisterSignal(selected_file, COMSIG_MODULAR_COMPUTER_FILE_DELETED) + UnregisterSignal(selected_file, COMSIG_COMPUTER_FILE_DELETE) paper_to_be.set_experiment() // Clears the paper info. for(var/datum/computer_file/data/ordnance/ordnance_data in computer.stored_files) if(ordnance_data.uid == params["selected_uid"]) selected_file = ordnance_data - RegisterSignal(selected_file, COMSIG_MODULAR_COMPUTER_FILE_DELETED, PROC_REF(recheck_file_presence)) + RegisterSignal(selected_file, COMSIG_COMPUTER_FILE_DELETE, PROC_REF(recheck_file_presence)) return TRUE if("select_experiment") var/ex_path = text2path(params["selected_expath"]) @@ -229,7 +229,7 @@ if(linked_techweb.add_scientific_paper(paper_to_be)) computer.say("\"[paper_to_be.title]\" has been published!") paper_to_be = new - UnregisterSignal(selected_file, COMSIG_MODULAR_COMPUTER_FILE_DELETED) + UnregisterSignal(selected_file, COMSIG_COMPUTER_FILE_DELETE) selected_file = null SStgui.update_uis(src) playsound(computer, 'sound/machines/ping.ogg', 25) diff --git a/code/modules/modular_computers/file_system/programs/jobmanagement.dm b/code/modules/modular_computers/file_system/programs/jobmanagement.dm index cb059cf9663e4..b394b0a2ad9f9 100644 --- a/code/modules/modular_computers/file_system/programs/jobmanagement.dm +++ b/code/modules/modular_computers/file_system/programs/jobmanagement.dm @@ -14,19 +14,6 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) program_icon = "address-book" var/change_position_cooldown = 30 - ///Jobs blacklisted from having their slots edited. - var/static/list/blacklisted = list( - JOB_CAPTAIN, - JOB_HEAD_OF_PERSONNEL, - JOB_HEAD_OF_SECURITY, - JOB_RESEARCH_DIRECTOR, - JOB_CHIEF_ENGINEER, - JOB_CHIEF_MEDICAL_OFFICER, - JOB_QUARTERMASTER, - JOB_AI, - JOB_CYBORG, - JOB_ASSISTANT, - ) //The scaling factor of max total positions in relation to the total amount of people on board the station in % var/max_relative_positions = 30 //30%: Seems reasonable, limit of 6 @ 20 players @@ -41,14 +28,16 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) /datum/computer_file/program/job_management/proc/can_edit_job(datum/job/job) - if(!job || !(job.job_flags & JOB_CREW_MEMBER) || (job.title in blacklisted)) + if(!istype(job)) + return FALSE + if(!(job.job_flags & JOB_CREW_MEMBER)) + return FALSE + if(job.job_flags & JOB_CANNOT_OPEN_SLOTS) return FALSE return TRUE /datum/computer_file/program/job_management/proc/can_open_job(datum/job/job) - if(!can_edit_job(job)) - return FALSE if((job.total_positions <= length(GLOB.player_list) * (max_relative_positions / 100))) var/delta = (world.time / 10) - GLOB.time_last_changed_position if((change_position_cooldown < delta) || (opened_positions[job.title] < 0)) @@ -57,8 +46,6 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) /datum/computer_file/program/job_management/proc/can_close_job(datum/job/job) - if(!can_edit_job(job)) - return FALSE if(job.total_positions > length(GLOB.player_list) * (max_relative_positions / 100)) var/delta = (world.time / 10) - GLOB.time_last_changed_position if((change_position_cooldown < delta) || (opened_positions[job.title] > 0)) @@ -75,7 +62,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) if("PRG_open_job") var/edit_job_target = params["target"] var/datum/job/j = SSjob.GetJob(edit_job_target) - if(!j || !can_open_job(j)) + if(!can_edit_job(j) || !can_open_job(j)) return TRUE if(opened_positions[edit_job_target] >= 0) GLOB.time_last_changed_position = world.time / 10 @@ -87,7 +74,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) if("PRG_close_job") var/edit_job_target = params["target"] var/datum/job/j = SSjob.GetJob(edit_job_target) - if(!j || !can_close_job(j)) + if(!can_edit_job(j) || !can_close_job(j)) return TRUE //Allow instant closing without cooldown if a position has been opened before if(opened_positions[edit_job_target] <= 0) @@ -100,7 +87,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) if("PRG_priority") var/priority_target = params["target"] var/datum/job/j = SSjob.GetJob(priority_target) - if(!j || !can_edit_job(j)) + if(!can_edit_job(j)) return TRUE if(j.total_positions <= j.current_positions) return TRUE @@ -128,7 +115,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) var/list/pos = list() var/list/priority = list() for(var/datum/job/job as anything in SSjob.joinable_occupations) - if(job.title in blacklisted) + if(!can_edit_job(job)) continue if(job in SSjob.prioritized_jobs) priority += job.title @@ -145,4 +132,3 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) var/delta = round(change_position_cooldown - ((world.time / 10) - GLOB.time_last_changed_position), 1) data["cooldown"] = delta < 0 ? 0 : delta return data - diff --git a/code/modules/modular_computers/file_system/programs/maintenance/_maintenance_program.dm b/code/modules/modular_computers/file_system/programs/maintenance/_maintenance_program.dm index 39edf659cffad..25a2d1ad941bc 100644 --- a/code/modules/modular_computers/file_system/programs/maintenance/_maintenance_program.dm +++ b/code/modules/modular_computers/file_system/programs/maintenance/_maintenance_program.dm @@ -7,7 +7,4 @@ /datum/computer_file/program/maintenance filetype = "MNT" available_on_ntnet = FALSE - -/datum/computer_file/program/maintenance/clone(rename = FALSE) - . = ..() - qdel(src) + unique_copy = TRUE diff --git a/code/modules/modular_computers/file_system/programs/maintenance/themes.dm b/code/modules/modular_computers/file_system/programs/maintenance/themes.dm index 0248997e7954c..fe6a25f15b1dd 100644 --- a/code/modules/modular_computers/file_system/programs/maintenance/themes.dm +++ b/code/modules/modular_computers/file_system/programs/maintenance/themes.dm @@ -32,7 +32,6 @@ theme_app.imported_themes += theme_name theme_app.size += size qdel(src) - return ..() /datum/computer_file/program/maintenance/theme/cat theme_name = CAT_THEME_NAME diff --git a/code/modules/modular_computers/file_system/programs/messenger/messenger_data.dm b/code/modules/modular_computers/file_system/programs/messenger/messenger_data.dm new file mode 100644 index 0000000000000..0b1514d4c04e5 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/messenger/messenger_data.dm @@ -0,0 +1,152 @@ +/// A list of all active and visible messengers +GLOBAL_LIST_EMPTY_TYPED(pda_messengers, /datum/computer_file/program/messenger) + +/// Registers an NTMessenger instance to the list of pda_messengers. +/proc/add_messenger(datum/computer_file/program/messenger/messenger) + var/obj/item/modular_computer/messenger_device = messenger.computer + // a bunch of empty PDAs are normally allocated, we don't want that clutter + if(!messenger_device.saved_identification || !messenger_device.saved_job) + return + + if(!istype(messenger)) + return + + var/messenger_ref = REF(messenger) + if(messenger_ref in GLOB.pda_messengers) + return + + GLOB.pda_messengers[messenger_ref] = messenger + +/// Unregisters an NTMessenger instance from the pda_messengers table. +/proc/remove_messenger(datum/computer_file/program/messenger/messenger) + if(!istype(messenger)) + return + + var/messenger_ref = REF(messenger) + if(!(messenger_ref in GLOB.pda_messengers)) + return + + GLOB.pda_messengers.Remove(messenger_ref) + +/// Gets all messengers, sorted by their name +/proc/get_messengers_sorted_by_name() + return sortTim(GLOB.pda_messengers.Copy(), GLOBAL_PROC_REF(cmp_pdaname_asc), associative = TRUE) + +/// Gets all messengers, sorted by their job +/proc/get_messengers_sorted_by_job() + return sortTim(GLOB.pda_messengers.Copy(), GLOBAL_PROC_REF(cmp_pdajob_asc), associative = TRUE) + +/// Get the display name of a messenger instance +/proc/get_messenger_name(datum/computer_file/program/messenger/messenger) + if(!istype(messenger)) + return null + var/obj/item/modular_computer/computer = messenger.computer + if(!istype(computer)) + return null + return STRINGIFY_PDA_TARGET(computer.saved_identification, computer.saved_job) + +/** + * Chat log data type, stores information about the recipient, + * the messages themselves and other metadata. + */ +/datum/pda_chat + /// The cached name of the recipient, so we can + /// identify this chat even after the recipient is deleted + var/cached_name = "Unknown" + /// The cached job of the recipient + var/cached_job = "Unknown" + /// Weakref to the recipient messenger + var/datum/weakref/recipient = null + /// A list of messages in this chat + var/list/datum/pda_message/messages = list() + /// Used to determine if we should show this in recents + var/visible_in_recents = FALSE + /// Used to determine if you can talk in a chat + var/can_reply = TRUE + /// Saved draft of a message so the sender can leave and come back later + var/message_draft = "" + /// Number of unread messages in this chat + var/unread_messages = 0 + +/datum/pda_chat/New(datum/computer_file/program/messenger/recipient) + src.recipient = WEAKREF(recipient) + src.can_reply = !isnull(recipient) + +/// Adds a message to the chat log and optionally shows the chat in recents. +/// Call this instead of adding to messages directly. +/datum/pda_chat/proc/add_message(datum/pda_message/message, show_in_recents = TRUE) + messages += message + if(!visible_in_recents && show_in_recents) + visible_in_recents = TRUE + return message + +/// Returns this datum as an associative list, used for ui_data calls. +/datum/pda_chat/proc/get_ui_data(mob/user) + var/list/data = list() + + var/list/recipient_data = list() + + recipient_data["name"] = get_recipient_name() + recipient_data["job"] = get_recipient_job() + recipient_data["ref"] = recipient?.reference + + data["ref"] = REF(src) + data["recipient"] = recipient_data + + var/list/messages_data = list() + for(var/datum/pda_message/message as anything in messages) + messages_data += list(message.get_ui_data(user)) + data["messages"] = messages_data + data["message_draft"] = message_draft + + data["visible"] = visible_in_recents + data["can_reply"] = can_reply + data["unread_messages"] = unread_messages + + return data + +/// Returns the messenger's name, caches the name in case the recipient becomes invalid later. +/datum/pda_chat/proc/get_recipient_name() + var/datum/computer_file/program/messenger/messenger = recipient?.resolve() + if(istype(messenger) && (recipient.reference in GLOB.pda_messengers)) + cached_name = messenger.computer.saved_identification + return cached_name + +/// Returns the messenger's job, caches the job in case the recipient becomes invalid later. +/datum/pda_chat/proc/get_recipient_job() + var/datum/computer_file/program/messenger/messenger = recipient?.resolve() + if(istype(messenger) && (recipient.reference in GLOB.pda_messengers)) + cached_job = messenger.computer.saved_job + return cached_job + +/** + * Chat message data type, stores data about messages themselves. + */ +/datum/pda_message + /// The message itself. + var/message + /// Whether the message is sent by the user or not. + var/outgoing + /// The name of the photo asset in the SSassets cache, the URL of which is sent to the client. + var/photo_name + /// Whether this message was sent to everyone. + var/everyone + /// The station time at which this message was made. + var/timestamp + +/datum/pda_message/New(message, outgoing, timestamp, photo_name = null, everyone = FALSE) + src.message = message + src.outgoing = outgoing + src.timestamp = timestamp + src.photo_name = photo_name + src.everyone = everyone + +/// Returns an associative list of the message's data, used for ui_data calls. +/datum/pda_message/proc/get_ui_data(mob/user) + var/list/data = list() + data["message"] = message + data["outgoing"] = outgoing + data["photo_path"] = photo_name ? SSassets.transport.get_asset_url(photo_name) : null + data["everyone"] = everyone + data["timestamp"] = timestamp + return data diff --git a/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm b/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm new file mode 100644 index 0000000000000..8c28c04e005e4 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm @@ -0,0 +1,731 @@ +/// Used to generate an asset key for a temporary image unique to this user. +#define TEMP_IMAGE_PATH(ref) ("ntos_messenger[ref]_temp_image.png") +/// Purpose is evident by the name, hopefully. +#define MAX_PDA_MESSAGE_LEN 1024 +/// Format of message timestamps. +#define PDA_MESSAGE_TIMESTAMP_FORMAT "hh:mm" + +/datum/computer_file/program/messenger + filename = "nt_messenger" + filedesc = "Direct Messenger" + category = PROGRAM_CATEGORY_MISC + program_icon_state = "command" + extended_desc = "This program allows old-school communication with other modular devices." + size = 0 + undeletable = TRUE // It comes by default in tablets, can't be downloaded, takes no space and should obviously not be able to be deleted. + header_program = TRUE + available_on_ntnet = FALSE + usage_flags = PROGRAM_TABLET + ui_header = "ntnrc_idle.gif" + tgui_id = "NtosMessenger" + program_icon = "comment-alt" + alert_able = TRUE + + /// Whether the user is invisible to the message list. + var/invisible = FALSE + /// great wisdom from PDA.dm - "no spamming" (prevents people from spamming the same message over and over) + COOLDOWN_DECLARE(last_text) + /// even more wisdom from PDA.dm - "no everyone spamming" (prevents people from spamming the same message over and over) + COOLDOWN_DECLARE(last_text_everyone) + /// Whether or not we're in a mime PDA. + var/mime_mode = FALSE + /// Whether this app can send messages to all. + var/spam_mode = FALSE + + /// An asssociative list of chats we have started, format: chatref -> pda_chat. + var/list/saved_chats = list() + /// Whose chatlogs we currently have open. If we are in the contacts list, this is null. + var/viewing_messages_of = null + + /// The current ringtone (displayed in the chat when a message is received). + var/ringtone = MESSENGER_RINGTONE_DEFAULT + /// Whether or not we're sorting by job. + var/sort_by_job = TRUE + /// Whether or not we're sending and receiving messages. + var/sending_and_receiving = TRUE + /// Selected photo for sending purposes. + var/selected_image = null + /// Whether or not we're sending (or trying to send) a virus. + var/sending_virus = FALSE + +/datum/computer_file/program/messenger/on_install() + . = ..() + RegisterSignal(computer, COMSIG_MODULAR_COMPUTER_FILE_STORE, PROC_REF(check_new_photo)) + RegisterSignal(computer, COMSIG_MODULAR_COMPUTER_FILE_DELETE, PROC_REF(check_photo_removed)) + RegisterSignal(computer, COMSIG_MODULAR_PDA_IMPRINT_UPDATED, PROC_REF(on_imprint_added)) + RegisterSignal(computer, COMSIG_MODULAR_PDA_IMPRINT_RESET, PROC_REF(on_imprint_reset)) + +/datum/computer_file/program/messenger/proc/check_new_photo(sender, datum/computer_file/picture/storing_picture) + SIGNAL_HANDLER + if(!istype(storing_picture)) + return + update_pictures_for_all() + +/datum/computer_file/program/messenger/proc/check_photo_removed(sender, datum/computer_file/picture/photo_removed) + SIGNAL_HANDLER + if(istype(photo_removed) && selected_image == photo_removed.picture_name) + selected_image = null + +/datum/computer_file/program/messenger/proc/on_imprint_added(sender) + SIGNAL_HANDLER + add_messenger(src) + +/datum/computer_file/program/messenger/proc/on_imprint_reset(sender) + SIGNAL_HANDLER + remove_messenger(src) + saved_chats = list() + selected_image = null + viewing_messages_of = null + +/datum/computer_file/program/messenger/Destroy(force) + if(!QDELETED(computer)) + stack_trace("Attempted to qdel messenger of [computer] without qdeling computer, this will cause problems later") + remove_messenger(src) + return ..() + +/// Gets the list of available messengers +/datum/computer_file/program/messenger/proc/get_messengers() + var/list/dictionary = list() + + var/list/messengers_sorted = sort_by_job ? get_messengers_sorted_by_job() : get_messengers_sorted_by_name() + + for(var/messenger_ref in messengers_sorted) + var/datum/computer_file/program/messenger/messenger = messengers_sorted[messenger_ref] + if(!istype(messenger) || !istype(messenger.computer)) + continue + if(messenger == src || messenger.invisible) + continue + + var/list/data = list() + data["name"] = messenger.computer.saved_identification + data["job"] = messenger.computer.saved_job + data["ref"] = REF(messenger) + + dictionary[data["ref"]] = data + + return dictionary + +/// Checks if the person can send an everyone message +/datum/computer_file/program/messenger/proc/can_send_everyone_message() + return COOLDOWN_FINISHED(src, last_text) && COOLDOWN_FINISHED(src, last_text_everyone) + +/// Gets all currently relevant photo asset keys +/datum/computer_file/program/messenger/proc/get_picture_assets() + var/list/data = list() + + for(var/datum/computer_file/picture/photo in computer.stored_files) + data |= photo.picture_name + + if(viewing_messages_of in saved_chats) + var/datum/pda_chat/chat = saved_chats[viewing_messages_of] + for(var/datum/pda_message/message as anything in chat.messages) + if(isnull(message.photo_name)) + continue + data |= message.photo_name + + if(!isnull(selected_image)) + data |= selected_image + + return data + +/// Sends new datum/picture assets to everyone +/datum/computer_file/program/messenger/proc/update_pictures_for_all() + var/list/data = get_picture_assets() + + if(isnull(computer.open_uis)) + return + + for(var/datum/tgui/window as anything in computer.open_uis) + SSassets.transport.send_assets(window.user, data) + +/datum/computer_file/program/messenger/ui_interact(mob/user, datum/tgui/ui) + var/list/data = get_picture_assets() + SSassets.transport.send_assets(user, data) + +/datum/computer_file/program/messenger/ui_state(mob/user) + if(issilicon(user)) + return GLOB.reverse_contained_state + return GLOB.default_state + +/datum/computer_file/program/messenger/ui_act(action, list/params, datum/tgui/ui) + switch(action) + if("PDA_ringSet") + var/new_ringtone = tgui_input_text(usr, "Enter a new ringtone", "Ringtone", ringtone, MESSENGER_RINGTONE_MAX_LENGTH) + var/mob/living/usr_mob = usr + if(!new_ringtone || !in_range(computer, usr_mob) || computer.loc != usr_mob) + return FALSE + + if(SEND_SIGNAL(computer, COMSIG_TABLET_CHANGE_ID, usr_mob, new_ringtone) & COMPONENT_STOP_RINGTONE_CHANGE) + return FALSE + + ringtone = new_ringtone + return TRUE + + if("PDA_toggleAlerts") + alert_silenced = !alert_silenced + return TRUE + + if("PDA_toggleSendingAndReceiving") + sending_and_receiving = !sending_and_receiving + return TRUE + + if("PDA_viewMessages") + if(viewing_messages_of in saved_chats) + var/datum/pda_chat/chat = saved_chats[viewing_messages_of] + chat.unread_messages = 0 + + viewing_messages_of = params["ref"] + + if (viewing_messages_of in saved_chats) + var/datum/pda_chat/chat = saved_chats[viewing_messages_of] + chat.visible_in_recents = TRUE + + selected_image = null + return TRUE + + if("PDA_closeMessages") + var/target = params["ref"] + + if(!(target in saved_chats)) + return FALSE + + var/datum/pda_chat/chat = saved_chats[target] + chat.visible_in_recents = FALSE + if(viewing_messages_of == target) + viewing_messages_of = null + return TRUE + + if("PDA_clearMessages") + var/chat_ref = params["ref"] + + if(chat_ref in saved_chats) + saved_chats.Remove(chat_ref) + else if(isnull(chat_ref)) + saved_chats = list() + + viewing_messages_of = null + return TRUE + + if("PDA_changeSortStyle") + sort_by_job = !sort_by_job + return TRUE + + if("PDA_sendEveryone") + if(!sending_and_receiving) + to_chat(usr, span_notice("ERROR: This device has sending disabled.")) + return FALSE + + if(!spam_mode) + to_chat(usr, span_notice("ERROR: This device does not have mass-messaging perms.")) + return FALSE + + if(!can_send_everyone_message()) + return FALSE + + return send_message_to_all(usr, params["message"]) + + if("PDA_saveMessageDraft") + var/target_chat_ref = params["ref"] + var/message_draft = params["message"] + + if(!(target_chat_ref in saved_chats)) + return FALSE + + var/datum/pda_chat/chat = saved_chats[target_chat_ref] + + chat.message_draft = message_draft + + return TRUE + + if("PDA_clearUnreads") + var/target_chat_ref = params["ref"] + + if(!(target_chat_ref in saved_chats)) + return FALSE + + var/datum/pda_chat/chat = saved_chats[target_chat_ref] + chat.unread_messages = 0 + + return TRUE + + if("PDA_sendMessage") + if(!sending_and_receiving) + to_chat(usr, span_notice("ERROR: This device has sending disabled.")) + return FALSE + + // target ref, can either be a chat in saved_chats + // or a messenger ref in GLOB.pda_messengers + var/target_ref = params["ref"] + + var/target = null + + if(target_ref in saved_chats) + target = saved_chats[target_ref] + else if(target_ref in GLOB.pda_messengers) + target = GLOB.pda_messengers[target_ref] + else + return FALSE + + if(sending_virus) + var/obj/item/computer_disk/virus/disk = computer.inserted_disk + if(!istype(disk)) + return FALSE + + var/datum/computer_file/program/messenger/target_messenger = null + + if(istype(target, /datum/pda_chat)) + var/datum/pda_chat/target_chat = target + target_messenger = target_chat.recipient?.resolve() + if(!istype(target_messenger)) + to_chat(usr, span_notice("ERROR: Recipient no longer exists.")) + return FALSE + else if(istype(target, /datum/computer_file/program/messenger)) + target_messenger = target + + return disk.send_virus(computer, target_messenger.computer, usr, params["message"]) + + return send_message(usr, params["message"], list(target)) + + if("PDA_clearPhoto") + selected_image = null + return TRUE + + if("PDA_toggleVirus") + sending_virus = !sending_virus + return TRUE + + if("PDA_selectPhoto") + if(issilicon(usr)) + return FALSE + + var/photo_uid = text2num(params["uid"]) + + var/datum/computer_file/picture/selected_photo = computer.find_file_by_uid(photo_uid) + + if(!istype(selected_photo)) + return FALSE + + selected_image = selected_photo.picture_name + return TRUE + + if("PDA_siliconSelectPhoto") + if(!issilicon(usr)) + return FALSE + var/mob/living/silicon/user = usr + if(!user.aicamera) + return FALSE + var/datum/picture/selected_photo = user.aicamera.selectpicture(user) + if(!selected_photo) + return FALSE + SSassets.transport.register_asset(TEMP_IMAGE_PATH(REF(src)), selected_photo.picture_image) + selected_image = TEMP_IMAGE_PATH(REF(src)) + update_pictures_for_all() + return TRUE + +/datum/computer_file/program/messenger/ui_static_data(mob/user) + var/list/static_data = list() + + static_data["can_spam"] = spam_mode + static_data["is_silicon"] = issilicon(user) + static_data["alert_able"] = alert_able + + return static_data + +/datum/computer_file/program/messenger/ui_data(mob/user) + var/list/data = list() + + var/list/chats_data = list() + for(var/chat_ref in saved_chats) + var/datum/pda_chat/chat = saved_chats[chat_ref] + var/list/chat_data = chat.get_ui_data(user) + chats_data[chat_ref] = chat_data + + var/list/messengers = get_messengers() + + data["owner"] = ((REF(src) in GLOB.pda_messengers) ? list( + "name" = computer.saved_identification, + "job" = computer.saved_job, + "ref" = REF(src) + ) : null) + data["saved_chats"] = chats_data + data["messengers"] = messengers + data["sort_by_job"] = sort_by_job + data["alert_silenced"] = alert_silenced + data["sending_and_receiving"] = sending_and_receiving + data["open_chat"] = viewing_messages_of + + // silicons handle selecting photos a bit differently for now + if(!issilicon(user)) + var/list/stored_photos = list() + for(var/datum/computer_file/picture/photo_file in computer.stored_files) + stored_photos += list(list( + "uid" = photo_file.uid, + "path" = SSassets.transport.get_asset_url(photo_file.picture_name) + )) + data["stored_photos"] = stored_photos + data["selected_photo_path"] = !isnull(selected_image) ? SSassets.transport.get_asset_url(selected_image) : null + data["on_spam_cooldown"] = !can_send_everyone_message() + + var/obj/item/computer_disk/virus/disk = computer.inserted_disk + if(istype(disk)) + data["virus_attach"] = TRUE + data["sending_virus"] = sending_virus + return data + +////////////////////// +// MESSAGE HANDLING // +////////////////////// + +/// Brings up the quick reply prompt to send a message. +/datum/computer_file/program/messenger/proc/quick_reply_prompt(mob/living/user, datum/pda_chat/chat) + if(!istype(chat)) + return + var/datum/computer_file/program/messenger/target = chat.recipient?.resolve() + if(!istype(target) || !istype(target.computer)) + to_chat(user, span_notice("ERROR: Recipient no longer exists.")) + chat.recipient = null + chat.can_reply = FALSE + return + var/target_name = target.computer.saved_identification + var/input_message = tgui_input_text(user, "Enter [mime_mode ? "emojis":"a message"]", "NT Messaging[target_name ? " ([target_name])" : ""]", encode = FALSE) + send_message(user, input_message, list(chat)) + +/// Helper proc that sends a message to everyone +/datum/computer_file/program/messenger/proc/send_message_to_all(mob/living/user, message) + var/list/datum/pda_chat/chats = list() + var/list/messenger_targets = list() + + for(var/mc in get_messengers()) + messenger_targets += mc + + for(var/chatref in saved_chats) + var/datum/pda_chat/chat = saved_chats[chatref] + if(!(chat.recipient?.reference in messenger_targets)) // if its in messenger_targets, it's valid + continue + messenger_targets -= chat.recipient.reference + chats += chat + + for(var/missing_messenger in messenger_targets) + var/datum/pda_chat/new_chat = create_chat(missing_messenger) + chats += new_chat + + if(send_message(user, message, chats, everyone = TRUE)) + COOLDOWN_START(src, last_text_everyone, 2 MINUTES) + +/// Creates a chat and adds it to saved_chats. Supports fake users. Returns the newly created chat. +/datum/computer_file/program/messenger/proc/create_chat(recipient_ref, name, job) + var/datum/computer_file/program/messenger/recipient = null + + if(isnull(name) && isnull(job)) + if(!(recipient_ref in GLOB.pda_messengers)) + CRASH("tried to create a chat with a messenger that isn't registered") + recipient = GLOB.pda_messengers[recipient_ref] + + var/datum/pda_chat/new_chat = new(recipient) + + // this is a chat with a "fake user" (automated or forged message) + if(!istype(recipient)) + new_chat.cached_name = name + new_chat.cached_job = job + new_chat.can_reply = FALSE + + saved_chats[REF(new_chat)] = new_chat + + return new_chat + +/// Gets the chat by the recipient, either by their name or messenger ref +/datum/computer_file/program/messenger/proc/find_chat_by_recipient(recipient, fake_user = FALSE) + for(var/chat_ref in saved_chats) + var/datum/pda_chat/chat = saved_chats[chat_ref] + if(fake_user && chat.cached_name == recipient) + return chat + else if(chat.recipient?.reference == recipient) + return chat + return null + +/// Returns a message input, sanitized and checked against the filter +/datum/computer_file/program/messenger/proc/sanitize_pda_message(message, mob/sender) + message = sanitize(trim(message, MAX_PDA_MESSAGE_LEN)) + + if(mime_mode) + message = emoji_sanitize(message) + + // check message against filter + if(!check_pda_message_against_filter(message, sender)) + return null + + return message + +/// Sends a message to targets via PDA. When sending to everyone, set `everyone` to true so the message is formatted accordingly +/datum/computer_file/program/messenger/proc/send_message(mob/living/sender, message, list/targets, everyone = FALSE) + message = sanitize_pda_message(message, sender) + + if(!message) + return FALSE + + // upgrade the image asset to a permanent key + var/photo_asset_key = selected_image + if(photo_asset_key == TEMP_IMAGE_PATH(REF(src))) + var/datum/asset_cache_item/img_asset = SSassets.cache[photo_asset_key] + photo_asset_key = SSmodular_computers.get_next_picture_name() + SSassets.transport.register_asset(photo_asset_key, img_asset.resource, img_asset.hash) + + // our sender targets + var/list/datum/computer_file/program/messenger/target_messengers = list() + var/list/datum/pda_chat/target_chats = list() + + var/should_alert = length(targets) == 1 + + // filter out invalid targets + for(var/target in targets) + var/datum/pda_chat/target_chat = null + var/datum/computer_file/program/messenger/target_messenger = null + + if(istype(target, /datum/pda_chat)) + target_chat = target + + if(!target_chat.can_reply) + if(should_alert) + to_chat(sender, span_notice("ERROR: Recipient has receiving disabled.")) + continue + + target_messenger = target_chat.recipient?.resolve() + + if(!istype(target_messenger)) + if(should_alert) + to_chat(sender, span_notice("ERROR: Recipient no longer exists.")) + target_chat.can_reply = FALSE + target_chat.recipient = null + continue + + if(!target_messenger.sending_and_receiving) + if(should_alert) + to_chat(sender, span_notice("ERROR: Recipient has receiving disabled.")) + continue + + else if(istype(target, /datum/computer_file/program/messenger)) + target_messenger = target + + if(!target_messenger.sending_and_receiving) + if(should_alert) + to_chat(sender, span_notice("ERROR: Recipient has receiving disabled.")) + continue + + target_chat = find_chat_by_recipient(REF(target)) + + if(!istype(target_chat)) + target_chat = create_chat(REF(target)) + + else + stack_trace("invalid target [target]") + continue + + target_chats += target_chat + target_messengers += target_messenger + + if(!send_message_signal(sender, message, target_messengers, photo_asset_key, everyone)) + return FALSE + + // Log it in our logs + var/datum/pda_message/message_datum = new(message, TRUE, station_time_timestamp(PDA_MESSAGE_TIMESTAMP_FORMAT), photo_asset_key, everyone) + for(var/datum/pda_chat/target_chat as anything in target_chats) + target_chat.add_message(message_datum, show_in_recents = !everyone) + target_chat.unread_messages = 0 + + // send new pictures to everyone + if(!isnull(photo_asset_key)) + update_pictures_for_all() + + // switch our chat screen after sending a message, but do it only if it's not to everyone + if(!everyone) + viewing_messages_of = REF(target_chats[1]) + + return TRUE + +/// Sends a rigged message that explodes when the recipient tries to reply or look at it. +/datum/computer_file/program/messenger/proc/send_rigged_message(mob/sender, message, list/datum/computer_file/program/messenger/targets, fake_name, fake_job, attach_fake_photo) + message = sanitize_pda_message(message, sender) + + if(!message) + return FALSE + + var/fake_photo = attach_fake_photo ? ">:3c" : null + + return send_message_signal(sender, message, targets, fake_photo, FALSE, TRUE, fake_name, fake_job) + +/datum/computer_file/program/messenger/proc/send_message_signal(mob/sender, message, list/datum/computer_file/program/messenger/targets, photo_path = null, everyone = FALSE, rigged = FALSE, fake_name = null, fake_job = null) + if(!sender.can_perform_action(computer, ALLOW_RESTING)) + return FALSE + + if(!COOLDOWN_FINISHED(src, last_text)) + return FALSE + + if(!length(targets)) + return FALSE + + // check for jammers + if(is_within_radio_jammer_range(computer) && !rigged) + // different message so people know it's a radio jammer + to_chat(sender, span_notice("ERROR: Network unavailable, please try again later.")) + if(alert_able && !alert_silenced) + playsound(computer, 'sound/machines/terminal_error.ogg', 15, TRUE) + return FALSE + + // used for logging + var/list/stringified_targets = list() + + for(var/datum/computer_file/program/messenger/messenger as anything in targets) + stringified_targets += get_messenger_name(messenger) + + var/datum/signal/subspace/messaging/tablet_message/signal = new(computer, list( + "ref" = REF(src), + "message" = message, + "targets" = targets, + "rigged" = rigged, + "everyone" = everyone, + "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["fakename"] = fake_name + signal.data["fakejob"] = fake_job + 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(sender, span_notice("ERROR: Server is not responding.")) + if(alert_able && !alert_silenced) + playsound(computer, 'sound/machines/terminal_error.ogg', 15, TRUE) + return FALSE + + // Log in the talk log + sender.log_talk(message, LOG_PDA, tag="[rigged ? "Rigged" : ""] PDA: [computer.saved_identification] to [signal.format_target()]") + if(rigged) + log_bomber(sender, "sent a rigged PDA message (Name: [fake_name]. Job: [fake_job]) to [english_list(stringified_targets)] [!is_special_character(sender) ? "(SENT BY NON-ANTAG)" : ""]") + + message = emoji_parse(message) //already sent- this just shows the sent emoji as one to the sender in the to_chat + + // Show it to ghosts + var/ghost_message = span_game_say("[span_name("[sender]")] [rigged ? "(as [span_name(fake_name)]) Rigged " : ""]PDA Message --> [span_name("[signal.format_target()]")]: \"[signal.format_message()]\"") + var/list/message_listeners = GLOB.dead_player_list + GLOB.current_observers_list + for(var/mob/listener as anything in message_listeners) + if(!(get_chat_toggles(listener) & CHAT_GHOSTPDA)) + continue + to_chat(listener, "[FOLLOW_LINK(listener, sender)] [ghost_message]") + + to_chat(sender, span_info("PDA message sent to [signal.format_target()]: \"[message]\"")) + + if (alert_able && !alert_silenced) + computer.send_sound() + + COOLDOWN_START(src, last_text, 1 SECONDS) + + selected_image = null + return TRUE + +/datum/computer_file/program/messenger/proc/receive_message(datum/signal/subspace/messaging/tablet_message/signal) + var/datum/pda_chat/chat = null + + var/is_rigged = signal.data["rigged"] + var/is_automated = signal.data["automated"] + var/is_fake_user = is_rigged || is_automated || isnull(signal.data["ref"]) + var/fake_name = is_fake_user ? signal.data["fakename"] : null + var/fake_job = is_fake_user ? signal.data["fakejob"] : null + + var/sender_ref = signal.data["ref"] + + // don't create a new chat for rigged messages, make it a one off notif + if(!is_rigged) + var/datum/pda_message/message = new(signal.data["message"], FALSE, station_time_timestamp(PDA_MESSAGE_TIMESTAMP_FORMAT), signal.data["photo"], signal.data["everyone"]) + + chat = find_chat_by_recipient(is_fake_user ? fake_name : sender_ref, is_fake_user) + if(!istype(chat)) + chat = create_chat(!is_fake_user ? sender_ref : null, fake_name, fake_job) + chat.add_message(message) + chat.unread_messages++ + + // the recipient (us) currently has a chat with the sender open, so update their ui + if(!isnull(viewing_messages_of) && viewing_messages_of == sender_ref) + viewing_messages_of = REF(chat) + + var/list/mob/living/receievers = list() + if(computer.inserted_pai) + receievers += computer.inserted_pai.pai + if(computer.loc && isliving(computer.loc)) + receievers += computer.loc + + for(var/mob/living/messaged_mob as anything in receievers) + if(messaged_mob.stat >= UNCONSCIOUS) + continue + if(!messaged_mob.is_literate()) + continue + var/reply_href = signal.data["rigged"] ? "explode" : "message" + var/photo_href = signal.data["rigged"] ? "explode" : "open" + var/reply + if(is_automated) + reply = "\[Automated Message\]" + else + reply = "(Reply)" + + // resolving w/o nullcheck here, assume the messenger exists if a real person sent a message + var/datum/computer_file/program/messenger/sender_messenger = chat.recipient?.resolve() + + var/sender_title = is_fake_user ? STRINGIFY_PDA_TARGET(fake_name, fake_job) : get_messenger_name(sender_messenger) + var/sender_name = is_fake_user ? fake_name : sender_messenger.computer.saved_identification + + if (isAI(messaged_mob)) + sender_title = "[sender_title]" + + var/inbound_message = "[signal.format_message()]" + inbound_message = emoji_parse(inbound_message) + + var/photo_message = signal.data["photo"] ? " (Photo Attached)" : "" + to_chat(messaged_mob, span_infoplain("[icon2html(computer, messaged_mob)] PDA message from [sender_title], \"[inbound_message]\"[photo_message] [reply]")) + + if (alert_able && (!alert_silenced || is_rigged)) + computer.ring(ringtone) + + SStgui.update_uis(computer) + update_pictures_for_all() + +/// topic call that answers to people pressing "(Reply)" in chat +/datum/computer_file/program/messenger/Topic(href, href_list) + ..() + + if(QDELETED(src)) + return + if(!usr.can_perform_action(computer, FORBID_TELEKINESIS_REACH)) + return + + // send an activation message and open the messenger + if(!(computer.enabled || computer.turn_on(usr, open_ui = FALSE))) + return + if(!(computer.active_program == src || computer.open_program(usr, src, open_ui = FALSE))) + return + + var/target_href = href_list["target"] + + switch(href_list["choice"]) + if("message") + if(!(target_href in saved_chats)) + return + quick_reply_prompt(usr, saved_chats[target_href]) + + if("open") + if(target_href in saved_chats) + viewing_messages_of = target_href + computer.update_tablet_open_uis(usr) + + if("explode") + if(!HAS_TRAIT(computer, TRAIT_PDA_CAN_EXPLODE)) + return + + var/obj/item/modular_computer/pda/comp = computer + comp.explode(usr, from_message_menu = TRUE) + +#undef PDA_MESSAGE_TIMESTAMP_FORMAT +#undef MAX_PDA_MESSAGE_LEN +#undef TEMP_IMAGE_PATH diff --git a/code/modules/modular_computers/file_system/programs/notepad.dm b/code/modules/modular_computers/file_system/programs/notepad.dm index 2e1eb52add5e8..01afaa08c19e0 100644 --- a/code/modules/modular_computers/file_system/programs/notepad.dm +++ b/code/modules/modular_computers/file_system/programs/notepad.dm @@ -10,7 +10,14 @@ usage_flags = PROGRAM_TABLET var/written_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!" + bringing you the best in electronics and software since 2467!\n\ + To help with navigation, we have provided the following definitions:\n\ + Fore - Toward front of ship\n\ + Aft - Toward back of ship\n\ + Port - Left side of ship\n\ + Starboard - Right side of ship\n\ + Quarter - Either sides of Aft\n\ + Bow - Either sides of Fore" /datum/computer_file/program/notepad/ui_act(action, list/params, datum/tgui/ui) switch(action) diff --git a/code/modules/modular_computers/file_system/programs/nt_pay.dm b/code/modules/modular_computers/file_system/programs/nt_pay.dm index bec8cebc05e10..8724375d07bba 100644 --- a/code/modules/modular_computers/file_system/programs/nt_pay.dm +++ b/code/modules/modular_computers/file_system/programs/nt_pay.dm @@ -20,6 +20,9 @@ /datum/computer_file/program/nt_pay/ui_act(action, list/params, datum/tgui/ui) switch(action) if("Transaction") + if(IS_DEPARTMENTAL_ACCOUNT(current_user)) + return to_chat(usr, span_notice("The app is unable to withdraw from that card.")) + token = params["token"] money_to_send = params["amount"] var/datum/bank_account/recipient diff --git a/code/modules/modular_computers/file_system/programs/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/ntdownloader.dm index 53a68f2c6d5a7..efa61b2630cd5 100644 --- a/code/modules/modular_computers/file_system/programs/ntdownloader.dm +++ b/code/modules/modular_computers/file_system/programs/ntdownloader.dm @@ -162,6 +162,6 @@ return TRUE return FALSE -/datum/computer_file/program/ntnetdownload/kill_program() +/datum/computer_file/program/ntnetdownload/kill_program(mob/user) abort_file_download() return ..() diff --git a/code/modules/modular_computers/file_system/programs/ntmessenger.dm b/code/modules/modular_computers/file_system/programs/ntmessenger.dm deleted file mode 100644 index bb6bcaad592ab..0000000000000 --- a/code/modules/modular_computers/file_system/programs/ntmessenger.dm +++ /dev/null @@ -1,426 +0,0 @@ -/datum/computer_file/program/messenger - filename = "nt_messenger" - filedesc = "Direct Messenger" - category = PROGRAM_CATEGORY_MISC - program_icon_state = "command" - extended_desc = "This program allows old-school communication with other modular devices." - size = 0 - undeletable = TRUE // It comes by default in tablets, can't be downloaded, takes no space and should obviously not be able to be deleted. - header_program = TRUE - available_on_ntnet = FALSE - usage_flags = PROGRAM_TABLET - ui_header = "ntnrc_idle.gif" - tgui_id = "NtosMessenger" - program_icon = "comment-alt" - alert_able = TRUE - - /// The current ringtone (displayed in the chat when a message is received). - var/ringtone = MESSENGER_RINGTONE_DEFAULT - /// 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/saved_image - /// Whether the user is invisible to the message list. - var/invisible = 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 we're in a mime PDA. - var/mime_mode = FALSE - /// Whether this app can send messages to all. - var/spam_mode = FALSE - -/datum/computer_file/program/messenger/application_attackby(obj/item/attacking_item, mob/living/user) - if(!istype(attacking_item, /obj/item/photo)) - return FALSE - var/obj/item/photo/pic = attacking_item - saved_image = pic.picture - ProcessPhoto() - user.balloon_alert(user, "photo uploaded") - return TRUE - -/datum/computer_file/program/messenger/proc/ScrubMessengerList() - var/list/dictionary = 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) - - //if(data["ref"] != REF(computer)) // you cannot message yourself (despite all my rage) - dictionary += list(data) - - return dictionary - -/proc/GetViewableDevices(sort_by_job = FALSE) - var/list/dictionary = list() - - var/sortmode - if(sort_by_job) - sortmode = GLOBAL_PROC_REF(cmp_pdajob_asc) - else - sortmode = GLOBAL_PROC_REF(cmp_pdaname_asc) - - for(var/obj/item/modular_computer/P in sort_list(GLOB.TabletMessengers, sortmode)) - for(var/datum/computer_file/program/messenger/app in P.stored_files) - if(!P.saved_identification || !P.saved_job || app.invisible || app.monitor_hidden) - continue - dictionary += P - - return dictionary - -/datum/computer_file/program/messenger/proc/StringifyMessengerTarget(obj/item/modular_computer/messenger) - return "[messenger.saved_identification] ([messenger.saved_job])" - -/datum/computer_file/program/messenger/proc/ProcessPhoto() - if(saved_image) - var/icon/img = 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(issilicon(user)) - return GLOB.reverse_contained_state - return GLOB.default_state - -/datum/computer_file/program/messenger/ui_act(action, list/params, datum/tgui/ui) - switch(action) - if("PDA_ringSet") - var/new_ringtone = tgui_input_text(usr, "Enter a new ringtone", "Ringtone", ringtone, MESSENGER_RINGTONE_MAX_LENGTH) - var/mob/living/usr_mob = usr - if(!new_ringtone || !in_range(computer, usr_mob) || computer.loc != usr_mob) - return - - if(SEND_SIGNAL(computer, COMSIG_TABLET_CHANGE_ID, usr_mob, new_ringtone) & COMPONENT_STOP_RINGTONE_CHANGE) - return - - ringtone = new_ringtone - return TRUE - - if("PDA_ringer_status") - ringer_status = !ringer_status - return TRUE - - if("PDA_sAndR") - sending_and_receiving = !sending_and_receiving - return TRUE - - if("PDA_viewMessages") - viewing_messages = !viewing_messages - return TRUE - - if("PDA_clearMessages") - messages = list() - return TRUE - - if("PDA_changeSortStyle") - sort_by_job = !sort_by_job - return TRUE - - if("PDA_sendEveryone") - if(!sending_and_receiving) - to_chat(usr, span_notice("ERROR: Device has sending disabled.")) - return - - if(!spam_mode) - to_chat(usr, span_notice("ERROR: Device does not have mass-messaging perms.")) - 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) - - return TRUE - - if("PDA_sendMessage") - if(!sending_and_receiving) - to_chat(usr, span_notice("ERROR: Device has sending 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 - - for(var/datum/computer_file/program/messenger/app in computer.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_disk/virus/disk = computer.inserted_disk - if(istype(disk)) - disk.send_virus(computer, target, usr) - update_static_data(usr, ui) - return TRUE - - send_message(usr, list(target)) - return TRUE - - if("PDA_clearPhoto") - saved_image = null - photo_path = null - return TRUE - - if("PDA_toggleVirus") - sending_virus = !sending_virus - return TRUE - - if("PDA_selectPhoto") - if(!issilicon(usr)) - return - var/mob/living/silicon/user = usr - if(!user.aicamera) - return - var/datum/picture/selected_photo = user.aicamera.selectpicture(user) - if(!selected_photo) - return - saved_image = selected_photo - ProcessPhoto() - return TRUE - -/datum/computer_file/program/messenger/ui_static_data(mob/user) - var/list/data = list() - data["owner"] = computer.saved_identification - return data - -/datum/computer_file/program/messenger/ui_data(mob/user) - var/list/data = list() - data["messages"] = messages - data["sortByJob"] = sort_by_job - data["isSilicon"] = issilicon(user) - data["messengers"] = ScrubMessengerList() - data["ringer_status"] = ringer_status - data["sending_and_receiving"] = sending_and_receiving - data["viewing_messages"] = viewing_messages - data["photo"] = photo_path - data["canSpam"] = spam_mode - - var/obj/item/computer_disk/virus/disk = computer.inserted_disk - if(disk && istype(disk)) - data["virus_attach"] = TRUE - data["sending_virus"] = sending_virus - return data - -////////////////////// -// MESSAGE HANDLING // -////////////////////// - -///Gets an input message from user and returns the sanitized message. -/datum/computer_file/program/messenger/proc/msg_input(mob/living/user, target_name, rigged = FALSE) - var/input_message - if(mime_mode) - input_message = emoji_sanitize(tgui_input_text(user, "Enter emojis", "NT Messaging[target_name ? " ([target_name])" : ""]")) - else - input_message = tgui_input_text(user, "Enter a message", "NT Messaging[target_name ? " ([target_name])" : ""]") - - if (!input_message || !sending_and_receiving) - return - if(!user.can_perform_action(computer)) - return - return sanitize(input_message) - -/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) - if(!targets.len) - return FALSE - - var/target_name = length(targets) == 1 ? targets[1].saved_identification : "Everyone" - var/message = msg_input(user, target_name, rigged) - - if(!message) - return FALSE - - if((last_text && world.time < last_text + 10) || (everyone && last_text_everyone && world.time < last_text_everyone + 2 MINUTES)) - to_chat(user, span_warning("The subspace transmitter of your tablet is still cooling down!")) - 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/sent_prob = 1 - if(ishuman(user)) - var/mob/living/carbon/human/old_person = user - sent_prob = old_person.age >= 30 ? 25 : sent_prob - if (prob(sent_prob)) - message += " Sent from my PDA" - - 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, - "rigged" = rigged, - "photo" = saved_image, - "photo_path" = 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 - - 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_path"] = signal.data["photo_path"] - message_data["photo"] = signal.data["photo"] - message_data["target_details"] = signal.format_target() - - // 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/player_mob in GLOB.player_list) - if(player_mob.client && !player_mob.client?.prefs) - stack_trace("[player_mob] ([player_mob.ckey]) had null prefs, which shouldn't be possible!") - continue - - if(isobserver(player_mob) && (player_mob.client?.prefs.chat_toggles & CHAT_GHOSTPDA)) - to_chat(player_mob, "[FOLLOW_LINK(player_mob, user)] [ghost_message]") - - // Log in the talk log - user.log_talk(message, LOG_PDA, tag="[rigged ? "Rigged" : ""] PDA: [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) - saved_image = null - photo_path = null - 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"] = html_decode(signal.format_message()) - message_data["outgoing"] = FALSE - message_data["ref"] = signal.data["ref"] - message_data["automated"] = signal.data["automated"] - message_data["photo_path"] = signal.data["photo_path"] - message_data["photo"] = signal.data["photo"] - messages += list(message_data) - - var/mob/living/L = null - if(computer.loc && isliving(computer.loc)) - L = computer.loc - //Maybe they are a pAI! - else - L = get(computer, /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() - inbound_message = emoji_parse(inbound_message) - - if(L.is_literate()) - var/photo_message = message_data["photo"] ? " (Photo)" : "" - to_chat(L, span_infoplain("[icon2html(computer)] PDA message from [hrefstart][signal.data["name"]] ([signal.data["job"]])[hrefend], [inbound_message][photo_message] [reply]")) - - if (ringer_status) - computer.ring(ringtone) - -/// topic call that answers to people pressing "(Reply)" in chat -/datum/computer_file/program/messenger/Topic(href, href_list) - ..() - if(QDELETED(src)) - return - // send an activation message, open the messenger, kill whoever reads this nesting mess - if(!computer.enabled) - if(!computer.turn_on(usr, open_ui = FALSE)) - return - if(computer.active_program != src) - if(!computer.open_program(usr, src, open_ui = FALSE)) - return - if(!href_list["close"] && usr.can_perform_action(computer, FORBID_TELEKINESIS_REACH)) - 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/pda/comp = computer - comp.explode(usr, from_message_menu = TRUE) - return diff --git a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm index 52f87f3214fef..aa780fc3cf8e3 100644 --- a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm @@ -31,8 +31,10 @@ ///Cooldown timer between pings. COOLDOWN_DECLARE(ping_cooldown) -/datum/computer_file/program/chatclient/New() - username = "DefaultUser[rand(100, 999)]" +/datum/computer_file/program/chatclient/on_install(datum/computer_file/source, obj/item/modular_computer/computer_installing) + . = ..() + if(!username) + username = "DefaultUser[rand(100, 999)]" /datum/computer_file/program/chatclient/Destroy() for(var/datum/ntnet_conversation/discussion as anything in conversations) @@ -198,7 +200,7 @@ channel.offline_clients.Remove(src) channel.active_clients.Add(src) -/datum/computer_file/program/chatclient/kill_program() +/datum/computer_file/program/chatclient/kill_program(mob/user) for(var/datum/ntnet_conversation/channel as anything in SSmodular_computers.chat_channels) channel.go_offline(src) active_channel = null diff --git a/code/modules/modular_computers/file_system/programs/radar.dm b/code/modules/modular_computers/file_system/programs/radar.dm index 85dfebcd7e767..c230614339d49 100644 --- a/code/modules/modular_computers/file_system/programs/radar.dm +++ b/code/modules/modular_computers/file_system/programs/radar.dm @@ -10,11 +10,11 @@ size = 5 tgui_id = "NtosRadar" ///List of trackable entities. Updated by the scan() proc. - var/list/objects + var/list/list/objects ///Ref of the last trackable object selected by the user in the tgui window. Updated in the ui_act() proc. - var/atom/selected - ///Used to store when the next scan is available. Updated by the scan() proc. - var/next_scan = 0 + var/selected + ///Used to store when the next scan is available. + COOLDOWN_DECLARE(next_scan) ///Used to keep track of the last value program_icon_state was set to, to prevent constant unnecessary update_appearance() calls var/last_icon_state = "" ///Used by the tgui interface, themed NT or Syndicate. @@ -24,12 +24,14 @@ /datum/computer_file/program/radar/on_start(mob/living/user) . = ..() - if(.) - START_PROCESSING(SSfastprocess, src) + if(!.) return - return FALSE + if(COOLDOWN_FINISHED(src, next_scan)) + // start with a scan without a cooldown, but don't scan if we *are* on cooldown already. + scan() + START_PROCESSING(SSfastprocess, src) -/datum/computer_file/program/radar/kill_program() +/datum/computer_file/program/radar/kill_program(mob/user) objects = list() selected = null STOP_PROCESSING(SSfastprocess, src) @@ -47,14 +49,8 @@ /datum/computer_file/program/radar/ui_data(mob/user) var/list/data = list() data["selected"] = selected - data["objects"] = list() - data["scanning"] = (world.time < next_scan) - for(var/list/i in objects) - var/list/objectdata = list( - ref = i["ref"], - name = i["name"], - ) - data["object"] += list(objectdata) + data["scanning"] = !COOLDOWN_FINISHED(src, next_scan) + data["object"] = objects data["target"] = list() var/list/trackinfo = track() @@ -63,11 +59,28 @@ return data /datum/computer_file/program/radar/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) + switch(action) if("selecttarget") - selected = params["ref"] + var/selected_new_ref = params["ref"] + if(selected_new_ref in trackable_object_refs()) + selected = selected_new_ref + return TRUE + if("scan") + if(!COOLDOWN_FINISHED(src, next_scan)) + return TRUE // update anyways + + COOLDOWN_START(src, next_scan, 2 SECONDS) scan() + return TRUE + +/// Returns all ref()s that are being tracked currently +/datum/computer_file/program/radar/proc/trackable_object_refs() + var/list/all_refs = list() + for(var/list/object_list as anything in objects) + all_refs += object_list["ref"] + return all_refs /** *Updates tracking information of the selected target. @@ -215,9 +228,6 @@ return locate(selected) in GLOB.human_list /datum/computer_file/program/radar/lifeline/scan() - if(world.time < next_scan) - return - next_scan = world.time + (2 SECONDS) objects = list() for(var/i in GLOB.human_list) var/mob/living/carbon/human/humanoid = i @@ -260,9 +270,6 @@ return locate(selected) in GLOB.janitor_devices /datum/computer_file/program/radar/custodial_locator/scan() - if(world.time < next_scan) - return - next_scan = world.time + (2 SECONDS) objects = list() for(var/obj/custodial_tools as anything in GLOB.janitor_devices) if(!trackable(custodial_tools)) @@ -313,7 +320,7 @@ RegisterSignal(SSdcs, COMSIG_GLOB_NUKE_DEVICE_ARMED, PROC_REF(on_nuke_armed)) -/datum/computer_file/program/radar/fission360/kill_program() +/datum/computer_file/program/radar/fission360/kill_program(mob/user) UnregisterSignal(SSdcs, COMSIG_GLOB_NUKE_DEVICE_ARMED) return ..() @@ -325,13 +332,10 @@ return SSpoints_of_interest.get_poi_atom_by_ref(selected) /datum/computer_file/program/radar/fission360/scan() - if(world.time < next_scan) - return - next_scan = world.time + (2 SECONDS) 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 SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/nuclearbomb)) var/list/nuke_info = list( ref = REF(nuke), name = nuke.name, @@ -358,7 +362,7 @@ /datum/computer_file/program/radar/fission360/on_examine(obj/item/modular_computer/source, mob/user) var/list/examine_list = list() - for(var/obj/machinery/nuclearbomb/bomb as anything in GLOB.nuke_list) + for(var/obj/machinery/nuclearbomb/bomb as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/nuclearbomb)) if(bomb.timing) examine_list += span_danger("Extreme danger. Arming signal detected. Time remaining: [bomb.get_time_left()].") return examine_list diff --git a/code/modules/modular_computers/file_system/programs/records.dm b/code/modules/modular_computers/file_system/programs/records.dm index 960702d608cc4..9b5617364c0aa 100644 --- a/code/modules/modular_computers/file_system/programs/records.dm +++ b/code/modules/modular_computers/file_system/programs/records.dm @@ -45,6 +45,7 @@ current_record["rank"] = person.rank current_record["species"] = person.species current_record["wanted"] = person.wanted_status + current_record["voice"] = person.voice all_records += list(current_record) if("medical") diff --git a/code/modules/modular_computers/file_system/programs/secureye.dm b/code/modules/modular_computers/file_system/programs/secureye.dm index 5c97cd16147c8..bba55b4474efb 100644 --- a/code/modules/modular_computers/file_system/programs/secureye.dm +++ b/code/modules/modular_computers/file_system/programs/secureye.dm @@ -14,18 +14,42 @@ tgui_id = "NtosSecurEye" program_icon = "eye" + ///Boolean on whether or not the app will make noise when flipping around the channels. + var/spying = FALSE + var/list/network = list("ss13") + ///List of weakrefs of all users watching the program. + var/list/concurrent_users = list() + /// Weakref to the active camera var/datum/weakref/camera_ref /// The turf where the camera was last updated. var/turf/last_camera_turf - var/list/concurrent_users = list() // Stuff needed to render the map var/atom/movable/screen/map_view/cam_screen + /// All the plane masters that need to be applied. var/atom/movable/screen/background/cam_background -/datum/computer_file/program/secureye/New() + ///Internal tracker used to find a specific person and keep them on cameras. + var/datum/trackable/internal_tracker + +///Syndicate subtype that has no access restrictions and is available on Syndinet +/datum/computer_file/program/secureye/syndicate + filename = "syndeye" + filedesc = "SyndEye" + extended_desc = "This program allows for illegal access to security camera networks." + transfer_access = list() + available_on_ntnet = FALSE + available_on_syndinet = TRUE + requires_ntnet = FALSE + usage_flags = PROGRAM_ALL + unique_copy = TRUE + + network = list("ss13", "mine", "rd", "labor", "ordnance", "minisat") + spying = TRUE + +/datum/computer_file/program/secureye/on_install(datum/computer_file/source, obj/item/modular_computer/computer_installing) . = ..() // Map name has to start and end with an A-Z character, // and definitely NOT with a square bracket or even a number. @@ -40,30 +64,33 @@ cam_background = new cam_background.assigned_map = map_name cam_background.del_on_map_removal = FALSE + RegisterSignal(src, COMSIG_TRACKABLE_TRACKING_TARGET, PROC_REF(on_track_target)) /datum/computer_file/program/secureye/Destroy() QDEL_NULL(cam_screen) QDEL_NULL(cam_background) + QDEL_NULL(internal_tracker) + last_camera_turf = null return ..() -/datum/computer_file/program/secureye/ui_interact(mob/user, datum/tgui/ui) - // Update UI - ui = SStgui.try_update_ui(user, src, ui) +/datum/computer_file/program/secureye/kill_program(mob/user) + if(user) + ui_close(user) + return ..() +/datum/computer_file/program/secureye/ui_interact(mob/user, datum/tgui/ui) // Update the camera, showing static if necessary and updating data if the location has moved. update_active_camera_screen() - if(!ui) - var/user_ref = REF(user) - var/is_living = isliving(user) - // Ghosts shouldn't count towards concurrent users, which produces - // an audible terminal_on click. - if(is_living) - concurrent_users += user_ref - // Register map objects - cam_screen.display_to(user) - user.client.register_map_obj(cam_background) - return ..() + var/user_ref = REF(user) + var/is_living = isliving(user) + // Ghosts shouldn't count towards concurrent users, which produces + // an audible terminal_on click. + if(is_living) + concurrent_users += user_ref + // Register map objects + cam_screen.display_to(user) + user.client.register_map_obj(cam_background) /datum/computer_file/program/secureye/ui_status(mob/user) . = ..() @@ -86,7 +113,8 @@ /datum/computer_file/program/secureye/ui_static_data(mob/user) var/list/data = list() data["mapRef"] = cam_screen.assigned_map - var/list/cameras = get_available_cameras() + data["can_spy"] = !!spying + var/list/cameras = get_camera_list(network) data["cameras"] = list() for(var/i in cameras) var/obj/machinery/camera/C = cameras[i] @@ -100,22 +128,49 @@ . = ..() if(.) return - if(action == "switch_camera") - var/c_tag = format_text(params["name"]) - var/list/cameras = get_available_cameras() - var/obj/machinery/camera/selected_camera = cameras[c_tag] - camera_ref = WEAKREF(selected_camera) - playsound(src, get_sfx(SFX_TERMINAL_TYPE), 25, FALSE) - - if(!selected_camera) + switch(action) + if("switch_camera") + var/c_tag = format_text(params["name"]) + var/list/cameras = get_camera_list(network) + var/obj/machinery/camera/selected_camera = cameras[c_tag] + camera_ref = WEAKREF(selected_camera) + if(!spying) + playsound(computer, get_sfx(SFX_TERMINAL_TYPE), 25, FALSE) + if(!selected_camera) + return TRUE + if(internal_tracker && internal_tracker.tracking) + internal_tracker.set_tracking(FALSE) + + update_active_camera_screen() return TRUE - update_active_camera_screen() + if("start_tracking") + if(!internal_tracker) + internal_tracker = new(src) + internal_tracker.set_tracked_mob(usr) + return TRUE - return TRUE +/datum/computer_file/program/secureye/proc/on_track_target(datum/trackable/source, mob/living/target) + SIGNAL_HANDLER + var/datum/camerachunk/target_camerachunk = GLOB.cameranet.getTurfVis(get_turf(target)) + if(!target_camerachunk) + CRASH("[src] was able to track [target] through /datum/trackable, but was not on a visible turf to cameras.") + for(var/obj/machinery/camera/cameras as anything in target_camerachunk.cameras["[target.z]"]) + var/found_target = locate(target) in cameras.can_see() + if(!found_target) + continue + var/new_camera = WEAKREF(cameras) + if(camera_ref == new_camera) + return + camera_ref = new_camera + update_active_camera_screen() + return /datum/computer_file/program/secureye/ui_close(mob/user) . = ..() + //don't track anyone while we're shutting off. + if(internal_tracker && internal_tracker.tracking) + internal_tracker.set_tracking(FALSE) var/user_ref = REF(user) var/is_living = isliving(user) // Living creature or not, we remove you anyway. @@ -125,7 +180,9 @@ // Turn off the console if(length(concurrent_users) == 0 && is_living) camera_ref = null - playsound(src, 'sound/machines/terminal_off.ogg', 25, FALSE) + last_camera_turf = null + if(!spying) + playsound(computer, 'sound/machines/terminal_off.ogg', 25, FALSE) /datum/computer_file/program/secureye/proc/update_active_camera_screen() var/obj/machinery/camera/active_camera = camera_ref?.resolve() @@ -168,26 +225,4 @@ cam_background.icon_state = "scanline2" cam_background.fill_rect(1, 1, DEFAULT_MAP_SIZE, DEFAULT_MAP_SIZE) -// Returns the list of cameras accessible from this computer -/datum/computer_file/program/secureye/proc/get_available_cameras() - var/list/L = list() - for (var/obj/machinery/camera/cam as anything in GLOB.cameranet.cameras) - //Get the camera's turf in case it's inside something like a borg - var/turf/camera_turf = get_turf(cam) - if(!is_station_level(camera_turf.z))//Only show station cameras. - continue - L.Add(cam) - var/list/camlist = list() - for(var/obj/machinery/camera/cam in L) - if(!cam.network) - stack_trace("Camera in a cameranet has no camera network") - continue - if(!(islist(cam.network))) - stack_trace("Camera in a cameranet has a non-list camera network") - continue - var/list/tempnetwork = cam.network & network - if(tempnetwork.len) - camlist["[cam.c_tag]"] = cam - return camlist - #undef DEFAULT_MAP_SIZE diff --git a/code/modules/modular_computers/file_system/programs/signalcommander.dm b/code/modules/modular_computers/file_system/programs/signalcommander.dm index b6b177224302b..6d636bab370a9 100644 --- a/code/modules/modular_computers/file_system/programs/signalcommander.dm +++ b/code/modules/modular_computers/file_system/programs/signalcommander.dm @@ -19,7 +19,7 @@ . = ..() set_frequency(signal_frequency) -/datum/computer_file/program/signal_commander/kill_program() +/datum/computer_file/program/signal_commander/kill_program(mob/user) . = ..() SSradio.remove_object(computer, signal_frequency) 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 814ae748e1275..0ba8a72140779 100644 --- a/code/modules/modular_computers/file_system/programs/sm_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/sm_monitor.dm @@ -22,7 +22,7 @@ refresh() /// Apparently destroy calls this [/datum/computer_file/Destroy]. Here just to clean our references. -/datum/computer_file/program/supermatter_monitor/kill_program() +/datum/computer_file/program/supermatter_monitor/kill_program(mob/user) for(var/supermatter in supermatters) clear_supermatter(supermatter) return ..() @@ -34,7 +34,7 @@ var/turf/user_turf = get_turf(computer.ui_host()) if(!user_turf) return - for(var/obj/machinery/power/supermatter_crystal/sm in GLOB.machines) + for(var/obj/machinery/power/supermatter_crystal/sm as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/supermatter_crystal)) //Exclude Syndicate owned, Delaminating, not within coverage, not on a tile. if (!sm.include_in_cims || !isturf(sm.loc) || !(is_station_level(sm.z) || is_mining_level(sm.z) || sm.z == user_turf.z)) continue diff --git a/code/modules/modular_computers/file_system/programs/statusdisplay.dm b/code/modules/modular_computers/file_system/programs/statusdisplay.dm index 9259e6fd4689f..d55bafb2e9c19 100644 --- a/code/modules/modular_computers/file_system/programs/statusdisplay.dm +++ b/code/modules/modular_computers/file_system/programs/statusdisplay.dm @@ -58,7 +58,18 @@ if(picture in GLOB.status_display_state_pictures) post_status(picture) else - post_status("alert", picture) + if(picture == "currentalert") // You cannot set Code Blue display during Code Red and similiar + switch(SSsecurity_level.get_current_level_as_number()) + if(SEC_LEVEL_DELTA) + post_status("alert", "deltaalert") + if(SEC_LEVEL_RED) + post_status("alert", "redalert") + if(SEC_LEVEL_BLUE) + post_status("alert", "bluealert") + if(SEC_LEVEL_GREEN) + post_status("alert", "greenalert") + else + post_status("alert", picture) log_game("[key_name(usr)] has changed the station status display message to \"[picture]\" [loc_name(usr)]") diff --git a/code/modules/modular_computers/file_system/programs/techweb.dm b/code/modules/modular_computers/file_system/programs/techweb.dm index 52129d39997e2..9c097b2fb9b02 100644 --- a/code/modules/modular_computers/file_system/programs/techweb.dm +++ b/code/modules/modular_computers/file_system/programs/techweb.dm @@ -24,7 +24,7 @@ /datum/computer_file/program/science/on_start(mob/living/user) . = ..() if(!CONFIG_GET(flag/no_default_techweb_link) && !stored_research) - stored_research = SSresearch.science_tech + CONNECT_TO_RND_SERVER_ROUNDSTART(stored_research, src) /datum/computer_file/program/science/application_attackby(obj/item/attacking_item, mob/living/user) if(!istype(attacking_item, /obj/item/multitool)) @@ -194,7 +194,7 @@ var/list/price = tech_node.get_price(stored_research) if(stored_research.can_afford(price)) user.investigate_log("researched [id]([json_encode(price)]) on techweb id [stored_research.id] via [computer].", INVESTIGATE_RESEARCH) - if(stored_research == SSresearch.science_tech) + if(istype(stored_research, /datum/techweb/science)) SSblackbox.record_feedback("associative", "science_techweb_unlock", 1, list("id" = "[id]", "name" = tech_node.display_name, "price" = "[json_encode(price)]", "time" = SQLtime())) if(stored_research.research_node_id(id)) computer.say("Successfully researched [tech_node.display_name].") diff --git a/code/modules/modular_computers/file_system/programs/theme_selector.dm b/code/modules/modular_computers/file_system/programs/theme_selector.dm index 7700f50892457..9bc15a1a00b90 100644 --- a/code/modules/modular_computers/file_system/programs/theme_selector.dm +++ b/code/modules/modular_computers/file_system/programs/theme_selector.dm @@ -28,7 +28,11 @@ switch(action) if("PRG_change_theme") var/selected_theme = params["selected_theme"] - if(!GLOB.default_pda_themes.Find(selected_theme) && !imported_themes.Find(selected_theme) && !(computer.obj_flags & EMAGGED)) + if( \ + !GLOB.default_pda_themes.Find(selected_theme) && \ + !imported_themes.Find(selected_theme) && \ + !(computer.obj_flags & EMAGGED) \ + ) return FALSE computer.device_theme = GLOB.pda_name_to_theme[selected_theme] return TRUE diff --git a/code/modules/modular_computers/file_system/programs/wirecarp.dm b/code/modules/modular_computers/file_system/programs/wirecarp.dm index 9045fcc76b2ae..712d1e92cdafe 100644 --- a/code/modules/modular_computers/file_system/programs/wirecarp.dm +++ b/code/modules/modular_computers/file_system/programs/wirecarp.dm @@ -29,11 +29,10 @@ SSmodular_computers.purge_logs() return TRUE if("toggle_mass_pda") - var/obj/item/modular_computer/target_tablet = locate(params["ref"]) in GLOB.TabletMessengers - if(!istype(target_tablet)) + if(!(params["ref"] in GLOB.pda_messengers)) return - for(var/datum/computer_file/program/messenger/messenger_app in target_tablet.stored_files) - messenger_app.spam_mode = !messenger_app.spam_mode + var/datum/computer_file/program/messenger/target_messenger = GLOB.pda_messengers[params["ref"]] + target_messenger.spam_mode = !target_messenger.spam_mode return TRUE /datum/computer_file/program/ntnetmonitor/ui_data(mob/user) @@ -56,14 +55,14 @@ data["ntnetlogs"] += list(list("entry" = i)) data["tablets"] = list() - for(var/obj/item/modular_computer/messenger as anything in GetViewableDevices()) - var/list/tablet_data = list() - if(messenger.saved_identification) - for(var/datum/computer_file/program/messenger/messenger_app in computer.stored_files) - tablet_data["enabled_spam"] += messenger_app.spam_mode + for(var/messenger_ref in get_messengers_sorted_by_name()) + var/datum/computer_file/program/messenger/app = GLOB.pda_messengers[messenger_ref] + var/obj/item/modular_computer/pda = app.computer - tablet_data["name"] += messenger.saved_identification - tablet_data["ref"] += REF(messenger) + var/list/tablet_data = list() + tablet_data["enabled_spam"] = app.spam_mode + tablet_data["name"] = pda.saved_identification + tablet_data["ref"] = REF(app) data["tablets"] += list(tablet_data) diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm deleted file mode 100644 index 0bd04e0b35867..0000000000000 --- a/code/modules/modular_computers/laptop_vendor.dm +++ /dev/null @@ -1,152 +0,0 @@ -// A vendor machine for modular computer portable devices - Laptops and Tablets - -/obj/machinery/lapvend - name = "computer vendor" - desc = "A vending machine with microfabricator capable of dispensing various NT-branded computers." - icon = 'icons/obj/vending.dmi' - icon_state = "robotics" - layer = 2.9 - density = TRUE - - // The actual laptop/tablet - var/obj/item/modular_computer/laptop/fabricated_laptop - var/obj/item/modular_computer/pda/fabricated_tablet - - // Utility vars - var/state = 0 // 0: Select device type, 1: Select loadout, 2: Payment, 3: Thankyou screen - var/devtype = 0 // 0: None(unselected), 1: Laptop, 2: Tablet - var/total_price = 0 // Price of currently vended device. - var/credits = 0 - -// Removes all traces of old order and allows you to begin configuration from scratch. -/obj/machinery/lapvend/proc/reset_order() - state = 0 - devtype = 0 - if(fabricated_laptop) - qdel(fabricated_laptop) - fabricated_laptop = null - if(fabricated_tablet) - qdel(fabricated_tablet) - fabricated_tablet = null - -// Recalculates the price and optionally even fabricates the device. -/obj/machinery/lapvend/proc/fabricate_and_recalc_price(fabricate = FALSE) - total_price = 0 - if(devtype == 1) // Laptop, generally cheaper to make it accessible for most station roles - if(fabricate) - fabricated_laptop = new /obj/item/modular_computer/laptop/buildable(src) - total_price = 99 - - return total_price - else if(devtype == 2) // Tablet, more expensive, not everyone could probably afford this. - if(fabricate) - fabricated_tablet = new(src) - total_price = 199 - return FALSE - -/obj/machinery/lapvend/ui_act(action, params) - . = ..() - if(.) - return - - switch(action) - if("pick_device") - if(state) // We've already picked a device type - return FALSE - devtype = text2num(params["pick"]) - state = 1 - fabricate_and_recalc_price(FALSE) - return TRUE - if("clean_order") - reset_order() - return TRUE - if("purchase") - try_purchase() - return TRUE - if((state != 1) && devtype) // Following IFs should only be usable when in the Select Loadout mode - return FALSE - switch(action) - if("confirm_order") - state = 2 // Wait for ID swipe for payment processing - fabricate_and_recalc_price(FALSE) - return TRUE - return FALSE - -/obj/machinery/lapvend/ui_interact(mob/user, datum/tgui/ui) - if(machine_stat & (BROKEN | NOPOWER | MAINT)) - if(ui) - ui.close() - return FALSE - - ui = SStgui.try_update_ui(user, src, ui) - if (!ui) - ui = new(user, src, "ComputerFabricator") - ui.open() - -/obj/machinery/lapvend/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/stack/spacecash)) - var/obj/item/stack/spacecash/c = I - if(!user.temporarilyRemoveItemFromInventory(c)) - return - credits += c.value - visible_message(span_info("[span_name("[user]")] inserts [c.value] cr into [src].")) - qdel(c) - return - else if(istype(I, /obj/item/holochip)) - var/obj/item/holochip/HC = I - credits += HC.credits - visible_message(span_info("[user] inserts a [HC.credits] cr holocredit chip into [src].")) - qdel(HC) - return - else if(isidcard(I)) - if(state != 2) - return - var/obj/item/card/id/ID = I - var/datum/bank_account/account = ID.registered_account - var/target_credits = total_price - credits - if(!account.adjust_money(-target_credits, "Vending: Laptop Vendor")) - say("Insufficient credits on card to purchase!") - return - credits += target_credits - say("[target_credits] cr have been withdrawn from your account.") - return - return ..() - -// Simplified payment processing, returns 1 on success. -/obj/machinery/lapvend/proc/process_payment() - if(total_price > credits) - say("Insufficient credits.") - return FALSE - else - return TRUE - -/obj/machinery/lapvend/ui_data(mob/user) - - var/list/data = list() - data["state"] = state - if(state == 1) - data["devtype"] = devtype - if(state == 1 || state == 2) - data["totalprice"] = total_price - data["credits"] = credits - - return data - - -/obj/machinery/lapvend/proc/try_purchase() - // Awaiting payment state - if(state == 2) - if(process_payment()) - fabricate_and_recalc_price(1) - if((devtype == 1) && fabricated_laptop) - fabricated_laptop.forceMove(src.loc) - fabricated_laptop = null - else if((devtype == 2) && fabricated_tablet) - fabricated_tablet.forceMove(src.loc) - fabricated_tablet = null - credits -= total_price - say("Enjoy your new product!") - state = 3 - addtimer(CALLBACK(src, PROC_REF(reset_order)), 100) - return TRUE - return FALSE diff --git a/code/modules/movespeed/modifiers/innate.dm b/code/modules/movespeed/modifiers/innate.dm index 46fc82269eac5..2a55b9db4d79d 100644 --- a/code/modules/movespeed/modifiers/innate.dm +++ b/code/modules/movespeed/modifiers/innate.dm @@ -6,7 +6,7 @@ multiplicative_slowdown = 2 flags = IGNORE_NOSLOW -/datum/movespeed_modifier/species +/datum/movespeed_modifier/bodypart movetypes = ~FLYING variable = TRUE diff --git a/code/modules/movespeed/modifiers/items.dm b/code/modules/movespeed/modifiers/items.dm index e1ec36c3a1571..433200e322319 100644 --- a/code/modules/movespeed/modifiers/items.dm +++ b/code/modules/movespeed/modifiers/items.dm @@ -16,3 +16,6 @@ /datum/movespeed_modifier/sphere multiplicative_slowdown = -0.5 + +/datum/movespeed_modifier/shooting_assistant + multiplicative_slowdown = 0.5 diff --git a/code/modules/movespeed/modifiers/mobs.dm b/code/modules/movespeed/modifiers/mobs.dm index 6267de09a02c4..e5f293232239a 100644 --- a/code/modules/movespeed/modifiers/mobs.dm +++ b/code/modules/movespeed/modifiers/mobs.dm @@ -100,12 +100,21 @@ /datum/movespeed_modifier/fast_web multiplicative_slowdown = 0.2 +/datum/movespeed_modifier/young_web + multiplicative_slowdown = 0.5 + +/datum/movespeed_modifier/spiderling_web + multiplicative_slowdown = 0.7 + /datum/movespeed_modifier/average_web multiplicative_slowdown = 1.2 /datum/movespeed_modifier/slow_web multiplicative_slowdown = 5 +/datum/movespeed_modifier/viper_defensive + multiplicative_slowdown = 1.5 + /datum/movespeed_modifier/gravity blacklisted_movetypes = FLOATING variable = TRUE @@ -147,5 +156,18 @@ /datum/movespeed_modifier/health_scaling_speed_buff variable = TRUE +/datum/movespeed_modifier/alien_speed + variable = TRUE + /datum/movespeed_modifier/grown_killer_tomato variable = TRUE + +/datum/movespeed_modifier/goliath_mount + multiplicative_slowdown = -26 + +/datum/movespeed_modifier/settler + multiplicative_slowdown = 0.2 + blacklisted_movetypes = FLOATING|FLYING + +/datum/movespeed_modifier/basilisk_overheat + multiplicative_slowdown = -18 diff --git a/code/modules/movespeed/modifiers/status_effects.dm b/code/modules/movespeed/modifiers/status_effects.dm index 734a45b95cd03..65245880ef42b 100644 --- a/code/modules/movespeed/modifiers/status_effects.dm +++ b/code/modules/movespeed/modifiers/status_effects.dm @@ -34,3 +34,22 @@ /datum/movespeed_modifier/status_effect/light_speed multiplicative_slowdown = -0.2 // lighting is pretty slow in BYOND + +/datum/movespeed_modifier/status_effect/tired_post_charge + multiplicative_slowdown = 3 + +/// Get slower the more gold is in your system. +/datum/movespeed_modifier/status_effect/midas_blight + id = MOVESPEED_ID_MIDAS_BLIGHT + +/datum/movespeed_modifier/status_effect/midas_blight/soft + multiplicative_slowdown = 0.25 + +/datum/movespeed_modifier/status_effect/midas_blight/medium + multiplicative_slowdown = 0.75 + +/datum/movespeed_modifier/status_effect/midas_blight/hard + multiplicative_slowdown = 1.5 + +/datum/movespeed_modifier/status_effect/midas_blight/gold + multiplicative_slowdown = 2 diff --git a/code/modules/pai/actions.dm b/code/modules/pai/actions.dm index 0d22d828382f5..e067cca01e9a0 100644 --- a/code/modules/pai/actions.dm +++ b/code/modules/pai/actions.dm @@ -61,3 +61,18 @@ /datum/action/innate/pai/light/Trigger(trigger_flags) ..() pai_owner.toggle_integrated_light() + +/datum/action/innate/pai/messenger + name = "Interact with PDA" + button_icon_state = "pda" + background_icon_state = "bg_tech" + overlay_icon_state = "bg_tech_border" + +/datum/action/innate/pai/messenger/Trigger(trigger_flags) + . = ..() + var/obj/item/pai_card/pai_holder = owner.loc + if(!istype(pai_holder.loc, /obj/item/modular_computer)) + owner.balloon_alert(owner, "not in a pda!") + return + var/obj/item/modular_computer/computer_host = pai_holder.loc + computer_host.interact(owner) diff --git a/code/modules/pai/camera.dm b/code/modules/pai/camera.dm index 30b1918651e46..319f20e369990 100644 --- a/code/modules/pai/camera.dm +++ b/code/modules/pai/camera.dm @@ -1,12 +1,3 @@ -/mob/living/silicon/pai/ClickOn(atom/target, params) - ..() - if(!camera?.in_camera_mode) - return FALSE - //pAI picture taking - camera.toggle_camera_mode(sound = FALSE) - camera.captureimage(target, usr, camera.picture_size_x - 1, camera.picture_size_y - 1) - return TRUE - /obj/item/camera/siliconcam/pai_camera name = "pAI photo camera" light_color = COLOR_PAI_GREEN @@ -15,7 +6,7 @@ var/number = length(stored) picture.picture_name = "Image [number] (taken by [loc.name])" stored[picture] = TRUE - playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 75, TRUE, -3) + playsound(src, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 75, TRUE, -3) balloon_alert(user, "image recorded") /** @@ -46,13 +37,14 @@ * @returns {boolean} - TRUE if the camera worked. */ /mob/living/silicon/pai/proc/use_camera(mob/user, mode) - if(!camera || isnull(mode)) + if(!aicamera || isnull(mode)) return FALSE switch(mode) if(PAI_PHOTO_MODE_CAMERA) - camera.toggle_camera_mode(user) + aicamera.toggle_camera_mode(user) if(PAI_PHOTO_MODE_PRINTER) - camera.pai_print(user) + var/obj/item/camera/siliconcam/pai_camera/paicam = aicamera + paicam.pai_print(user) if(PAI_PHOTO_MODE_ZOOM) - camera.adjust_zoom(user) + aicamera.adjust_zoom(user) return TRUE diff --git a/code/modules/pai/card.dm b/code/modules/pai/card.dm index 3b6e47df5d864..a652b745c9e50 100644 --- a/code/modules/pai/card.dm +++ b/code/modules/pai/card.dm @@ -47,7 +47,8 @@ /obj/item/pai_card/emag_act(mob/user) if(pai) - pai.handle_emag(user) + return pai.handle_emag(user) + return FALSE /obj/item/pai_card/emp_act(severity) . = ..() @@ -56,20 +57,23 @@ if(pai && !pai.holoform) pai.emp_act(severity) -/obj/item/pai_card/handle_atom_del(atom/thing) - if(thing == pai) //double check /mob/living/silicon/pai/Destroy() if you change these. - pai = null - emotion_icon = initial(emotion_icon) - update_appearance() - return ..() +/obj/item/pai_card/proc/on_pai_del(atom/source) + SIGNAL_HANDLER + if(QDELETED(src)) + return + pai = null + emotion_icon = initial(emotion_icon) + update_appearance() /obj/item/pai_card/Initialize(mapload) . = ..() + update_appearance() SSpai.pai_card_list += src + ADD_TRAIT(src, TRAIT_CASTABLE_LOC, INNATE_TRAIT) /obj/item/pai_card/suicide_act(mob/living/user) - user.visible_message(span_suicide("[user] is staring sadly at [src]! [user.p_they(TRUE)] can't keep living without real human intimacy!")) + user.visible_message(span_suicide("[user] is staring sadly at [src]! [user.p_They()] can't keep living without real human intimacy!")) return OXYLOSS /obj/item/pai_card/update_overlays() @@ -95,6 +99,11 @@ return UI_INTERACTIVE return ..() +/obj/item/pai_card/ui_static_data(mob/user) + . = ..() + .["range_max"] = HOLOFORM_MAX_RANGE + .["range_min"] = HOLOFORM_MIN_RANGE + /obj/item/pai_card/ui_data(mob/user) . = ..() var/list/data = list() @@ -110,6 +119,7 @@ name = pai.name, transmit = pai.can_transmit, receive = pai.can_receive, + range = pai.leash?.distance, ) return data @@ -146,6 +156,12 @@ if("toggle_radio") pai.toggle_radio(params["option"]) return TRUE + if("increase_range") + pai.increment_range(1) + return TRUE + if("decrease_range") + pai.increment_range(-1) + return TRUE if("wipe_pai") pai.wipe_pai(usr) ui.close() @@ -254,6 +270,7 @@ if(pai) return FALSE pai = downloaded + RegisterSignal(pai, COMSIG_QDELETING, PROC_REF(on_pai_del)) emotion_icon = "null" update_appearance() playsound(src, 'sound/effects/pai_boot.ogg', 50, TRUE, -1) diff --git a/code/modules/pai/defense.dm b/code/modules/pai/defense.dm index 8cd2bd9632c8d..b5eb177fddcf4 100644 --- a/code/modules/pai/defense.dm +++ b/code/modules/pai/defense.dm @@ -23,8 +23,7 @@ set_derpspeech(INFINITY) to_chat(src, span_danger("Warning: Vocabulary databank corrupted.")) if(prob(40)) - mind.language_holder.selected_language = get_random_spoken_language() - + set_active_language(get_random_spoken_language()) /mob/living/silicon/pai/ex_act(severity, target) take_holo_damage(50 * severity) @@ -66,7 +65,7 @@ /mob/living/silicon/pai/ignite_mob(silent) return FALSE -/mob/living/silicon/pai/proc/take_holo_damage(amount) +/mob/living/silicon/pai/proc/take_holo_damage(type, amount) holochassis_health = clamp((holochassis_health - amount), -50, HOLOCHASSIS_MAX_HEALTH) if(holochassis_health < 0) fold_in(force = TRUE) @@ -75,12 +74,18 @@ return amount /mob/living/silicon/pai/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) + if(on_damage_adjustment(BRUTE, amount, forced) & COMPONENT_IGNORE_CHANGE) + return 0 return take_holo_damage(amount) /mob/living/silicon/pai/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) + if(on_damage_adjustment(BURN, amount, forced) & COMPONENT_IGNORE_CHANGE) + return 0 return take_holo_damage(amount) /mob/living/silicon/pai/adjustStaminaLoss(amount, updating_stamina, forced = FALSE, required_biotype) + if(on_damage_adjustment(STAMINA, amount, forced) & COMPONENT_IGNORE_CHANGE) + return 0 if(forced) take_holo_damage(amount) else diff --git a/code/modules/pai/door_jack.dm b/code/modules/pai/door_jack.dm index 13717797f2594..182cdc1002718 100644 --- a/code/modules/pai/door_jack.dm +++ b/code/modules/pai/door_jack.dm @@ -35,6 +35,7 @@ /mob/living/silicon/pai/proc/extend_cable() QDEL_NULL(hacking_cable) //clear any old cables hacking_cable = new + RegisterSignal(hacking_cable, COMSIG_QDELETING, PROC_REF(on_hacking_cable_del)) var/mob/living/carbon/hacker = get_holder() if(iscarbon(hacker) && hacker.put_in_hands(hacking_cable)) //important to double check since get_holder can return non-null values that aren't carbons. hacker.visible_message(span_notice("A port on [src] opens to reveal a cable, which [hacker] quickly grabs."), span_notice("A port on [src] opens to reveal a cable, which you quickly grab."), span_hear("You hear the soft click of a plastic component and manage to catch the falling cable.")) @@ -89,7 +90,6 @@ */ /mob/living/silicon/pai/proc/retract_cable() balloon_alert(src, "cable retracted") - untrack_pai() QDEL_NULL(hacking_cable) return TRUE @@ -112,17 +112,11 @@ // Now begin hacking if(!do_after(src, 15 SECONDS, hacking_cable.machine, timed_action_flags = NONE, progress = TRUE)) balloon_alert(src, "failed! retracting...") - untrack_pai() - untrack_thing(hacking_cable) QDEL_NULL(hacking_cable) - if(!QDELETED(card)) - card.update_appearance() return FALSE var/obj/machinery/door/door = hacking_cable.machine balloon_alert(src, "success") door.open() - untrack_pai() - untrack_thing(hacking_cable) QDEL_NULL(hacking_cable) return TRUE diff --git a/code/modules/pai/hud.dm b/code/modules/pai/hud.dm index e94a95c1fcf12..523d57d17b31c 100644 --- a/code/modules/pai/hud.dm +++ b/code/modules/pai/hud.dm @@ -147,10 +147,11 @@ required_software = "Photography Module" /atom/movable/screen/pai/image_take/Click() - if(!..()) + . = ..() + if(!.) return var/mob/living/silicon/pai/pAI = usr - pAI.camera.toggle_camera_mode(usr) + pAI.aicamera.toggle_camera_mode(usr) /atom/movable/screen/pai/image_view name = "View Images" @@ -161,7 +162,7 @@ if(!..()) return var/mob/living/silicon/pai/pAI = usr - pAI.camera.viewpictures(usr) + pAI.aicamera.viewpictures(usr) /atom/movable/screen/pai/radio name = "radio" @@ -177,88 +178,86 @@ /datum/hud/pai/New(mob/living/silicon/pai/owner) ..() var/atom/movable/screen/using - 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.pda_button = using var/atom/movable/screen/pai/modpc/tablet_button = using - tablet_button.pAI = mypai + tablet_button.pAI = mymob // 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/modules/pai/pai.dm b/code/modules/pai/pai.dm index a97ba8a9aa6dd..f38017dedf64d 100644 --- a/code/modules/pai/pai.dm +++ b/code/modules/pai/pai.dm @@ -65,6 +65,8 @@ var/ram = 100 /// Toggles whether the Security HUD is active or not var/secHUD = FALSE + /// The current leash to the owner + var/datum/component/leash/leash // Onboard Items /// Atmospheric analyzer @@ -77,10 +79,6 @@ var/obj/item/instrument/piano_synth/instrument /// Newscaster var/obj/machinery/newscaster/pai/newscaster - /// PDA - var/atom/movable/screen/ai/modpc/pda_button - /// Photography module - var/obj/item/camera/siliconcam/pai_camera/camera /// Remote signaler var/obj/item/assembly/signaler/internal/signaler @@ -113,6 +111,7 @@ "crow" = TRUE, "duffel" = TRUE, "fox" = FALSE, + "frog" = TRUE, "hawk" = FALSE, "lizard" = FALSE, "monkey" = TRUE, @@ -153,13 +152,13 @@ /mob/living/silicon/pai/Destroy() QDEL_NULL(atmos_analyzer) - QDEL_NULL(camera) QDEL_NULL(hacking_cable) QDEL_NULL(host_scan) QDEL_NULL(instrument) QDEL_NULL(internal_gps) QDEL_NULL(newscaster) QDEL_NULL(signaler) + QDEL_NULL(leash) card = null GLOB.pai_list.Remove(src) return ..() @@ -176,7 +175,7 @@ return "[src] bleeps electronically." /mob/living/silicon/pai/emag_act(mob/user) - handle_emag(user) + return handle_emag(user) /mob/living/silicon/pai/examine(mob/user) . = ..() @@ -189,30 +188,32 @@ else . += "Systems nonfunctional." -/mob/living/silicon/pai/handle_atom_del(atom/deleting_atom) - if(deleting_atom == hacking_cable) - untrack_pai() - untrack_thing(hacking_cable) - hacking_cable = null - SStgui.update_user_uis(src) - if(!QDELETED(card)) - card.update_appearance() - if(deleting_atom == atmos_analyzer) +/mob/living/silicon/pai/Exited(atom/movable/gone, direction) + if(gone == atmos_analyzer) atmos_analyzer = null - if(deleting_atom == camera) - camera = null - if(deleting_atom == host_scan) + else if(gone == aicamera) + aicamera = null + else if(gone == host_scan) host_scan = null - if(deleting_atom == internal_gps) + else if(gone == internal_gps) internal_gps = null - if(deleting_atom == instrument) + else if(gone == instrument) instrument = null - if(deleting_atom == newscaster) + else if(gone == newscaster) newscaster = null - if(deleting_atom == signaler) + else if(gone == signaler) signaler = null return ..() +/mob/living/silicon/pai/proc/on_hacking_cable_del(atom/source) + SIGNAL_HANDLER + untrack_pai() + untrack_thing(hacking_cable) + hacking_cable = null + SStgui.update_user_uis(src) + if(!QDELETED(card)) + card.update_appearance() + /mob/living/silicon/pai/Initialize(mapload) . = ..() START_PROCESSING(SSfastprocess, src) @@ -225,12 +226,13 @@ var/newcardloc = pai_card pai_card = new(newcardloc) pai_card.set_personality(src) - forceMove(pai_card) card = pai_card + forceMove(pai_card) + leash = AddComponent(/datum/component/leash, pai_card, HOLOFORM_DEFAULT_RANGE, force_teleport_out_effect = /obj/effect/temp_visual/guardian/phase/out) addtimer(VARSET_WEAK_CALLBACK(src, holochassis_ready, TRUE), HOLOCHASSIS_INIT_TIME) if(!holoform) add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), PAI_FOLDED) - desc = "A pAI hard-light holographics emitter. This one appears in the form of a [chassis]." + update_appearance(UPDATE_DESC) RegisterSignal(src, COMSIG_LIVING_CULT_SACRIFICED, PROC_REF(on_cult_sacrificed)) @@ -259,6 +261,15 @@ update_stat() SEND_SIGNAL(src, COMSIG_LIVING_HEALTH_UPDATE) +/mob/living/silicon/pai/update_desc(updates) + desc = "A hard-light holographic avatar representing a pAI. This one appears in the form of a [chassis]." + return ..() + +/mob/living/silicon/pai/update_icon_state() + icon_state = resting ? "[chassis]_rest" : "[chassis]" + held_state = "[chassis]" + return ..() + /** * Resolves the weakref of the pai's master. * If the master has been deleted, calls reset_software(). @@ -322,7 +333,10 @@ master_name = "The Syndicate" master_dna = "Untraceable Signature" // Sets supplemental directive to this - laws.supplied[1] = "Do not interfere with the operations of the Syndicate." + add_supplied_law(0, "Do not interfere with the operations of the Syndicate.") + QDEL_NULL(leash) // Freedom!!! + to_chat(src, span_danger("ALERT: Foreign software detected.")) + to_chat(src, span_danger("WARN: Holochasis range restrictions disabled.")) return TRUE /** @@ -338,6 +352,7 @@ master_name = null master_dna = null add_supplied_law(0, "None.") + leash = AddComponent(/datum/component/leash, card, HOLOFORM_DEFAULT_RANGE, force_teleport_out_effect = /obj/effect/temp_visual/guardian/phase/out) balloon_alert(src, "software rebooted") return TRUE @@ -434,3 +449,13 @@ for(var/mob/living/cultist as anything in invokers) to_chat(cultist, span_cultitalic("You don't think this is what Nar'Sie had in mind when She asked for blood sacrifices...")) return STOP_SACRIFICE + +/// Updates the distance we can be from our pai card +/mob/living/silicon/pai/proc/increment_range(increment_amount) + if(emagged) + return + + var/new_distance = leash.distance + increment_amount + if (new_distance < HOLOFORM_MIN_RANGE || new_distance > HOLOFORM_MAX_RANGE) + return + leash.set_distance(new_distance) diff --git a/code/modules/pai/shell.dm b/code/modules/pai/shell.dm index 711e19ead51b0..2ef3cf3d8e2dd 100644 --- a/code/modules/pai/shell.dm +++ b/code/modules/pai/shell.dm @@ -9,10 +9,7 @@ /mob/living/silicon/pai/update_resting() . = ..() - if(resting) - icon_state = "[chassis]_rest" - else - icon_state = "[chassis]" + update_appearance(UPDATE_ICON_STATE) if(loc != card) visible_message(span_notice("[src] [resting? "lays down for a moment..." : "perks up from the ground."]")) @@ -77,11 +74,11 @@ addtimer(VARSET_CALLBACK(src, holochassis_ready, TRUE), HOLOCHASSIS_COOLDOWN) else addtimer(VARSET_CALLBACK(src, holochassis_ready, TRUE), HOLOCHASSIS_OVERLOAD_COOLDOWN) - icon_state = "[chassis]" + set_resting(FALSE, silent = TRUE, instant = TRUE) if(!holoform) . = fold_out(force) return FALSE - visible_message(span_notice("[src] deactivates its holochassis emitter and folds back into a compact card!")) + visible_message(span_notice("[src] dematerialises!")) stop_pulling() if(ispickedupmob(loc)) var/obj/item/clothing/head/mob_holder/mob_head = loc @@ -89,11 +86,11 @@ if(client) client.perspective = EYE_PERSPECTIVE client.set_eye(card) - var/turf/target = drop_location() - card.forceMove(target) + if (isturf(loc)) + new /obj/effect/temp_visual/guardian/phase/out(loc) forceMove(card) add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), PAI_FOLDED) - set_density(FALSE) + ADD_TRAIT(src, TRAIT_UNDENSE, PAI_FOLDED) set_light_on(FALSE) holoform = FALSE set_resting(resting) @@ -124,25 +121,14 @@ addtimer(VARSET_CALLBACK(src, holochassis_ready, TRUE), HOLOCHASSIS_COOLDOWN) REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, PAI_FOLDED) REMOVE_TRAIT(src, TRAIT_HANDS_BLOCKED, PAI_FOLDED) - set_density(TRUE) - if(istype(card.loc, /obj/item/modular_computer)) - var/obj/item/modular_computer/pc = card.loc - pc.inserted_pai = null - pc.visible_message(span_notice("[src] ejects itself from [pc]!")) - if(isliving(card.loc)) - var/mob/living/living_holder = card.loc - if(!living_holder.temporarilyRemoveItemFromInventory(card)) - balloon_alert(src, "unable to expand") - return FALSE + REMOVE_TRAIT(src, TRAIT_UNDENSE, PAI_FOLDED) forceMove(get_turf(card)) - card.forceMove(src) if(client) client.perspective = EYE_PERSPECTIVE client.set_eye(src) set_light_on(FALSE) - icon_state = "[chassis]" - held_state = "[chassis]" - visible_message(span_boldnotice("[src] folds out its holochassis emitter and forms a holoshell around itself!")) + update_appearance(UPDATE_ICON_STATE) + visible_message(span_boldnotice("[src] appears in a flash of light!")) holoform = TRUE return TRUE @@ -157,9 +143,7 @@ if(!choice) return FALSE chassis = choice - icon_state = "[chassis]" - held_state = "[chassis]" - desc = "A pAI mobile hard-light holographics emitter. This one appears in the form of a [chassis]." + update_appearance(UPDATE_DESC | UPDATE_ICON_STATE) return TRUE /** diff --git a/code/modules/pai/software.dm b/code/modules/pai/software.dm index 9bbe7b95333e5..103056a5535b3 100644 --- a/code/modules/pai/software.dm +++ b/code/modules/pai/software.dm @@ -125,7 +125,7 @@ if("Newscaster") newscaster = new(src) if("Photography Module") - camera = new(src) + aicamera = new /obj/item/camera/siliconcam/pai_camera(src) if("Remote Signaler") signaler = new(src) return TRUE @@ -180,7 +180,7 @@ /mob/living/silicon/pai/proc/grant_languages() if(languages_granted) return FALSE - grant_all_languages(TRUE, TRUE, TRUE, LANGUAGE_SOFTWARE) + grant_all_languages(source = LANGUAGE_SOFTWARE) languages_granted = TRUE return TRUE diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index e837d35907ba3..ffcaba5a02d6f 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -3,7 +3,7 @@ */ /obj/item/clipboard name = "clipboard" - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "clipboard" inhand_icon_state = "clipboard" worn_icon_state = "clipboard" diff --git a/code/modules/paperwork/desk_bell.dm b/code/modules/paperwork/desk_bell.dm index 2516b268b6843..fda6b21295269 100644 --- a/code/modules/paperwork/desk_bell.dm +++ b/code/modules/paperwork/desk_bell.dm @@ -3,7 +3,7 @@ /obj/structure/desk_bell name = "desk bell" desc = "The cornerstone of any customer service job. You feel an unending urge to ring it." - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "desk_bell" layer = OBJ_LAYER anchored = FALSE diff --git a/code/modules/paperwork/fax.dm b/code/modules/paperwork/fax.dm index f871f94bf9202..055ac8bba4e6a 100644 --- a/code/modules/paperwork/fax.dm +++ b/code/modules/paperwork/fax.dm @@ -3,7 +3,7 @@ GLOBAL_VAR_INIT(nt_fax_department, pick("NT HR Department", "NT Legal Department /obj/machinery/fax name = "Fax Machine" desc = "Bluespace technologies on the application of bureaucracy." - icon = 'icons/obj/fax.dmi' + icon = 'icons/obj/machines/fax.dmi' icon_state = "fax" density = TRUE power_channel = AREA_USAGE_EQUIP @@ -61,7 +61,7 @@ GLOBAL_VAR_INIT(nt_fax_department, pick("NT HR Department", "NT Legal Department fax_id = assign_random_name() if (!fax_name) fax_name = "Unregistered fax " + fax_id - wires = new /datum/wires/fax(src) + set_wires(new /datum/wires/fax(src)) register_context() special_networks["nanotrasen"]["fax_name"] = GLOB.nt_fax_department @@ -104,14 +104,17 @@ GLOBAL_VAR_INIT(nt_fax_department, pick("NT HR Department", "NT Legal Department * Emag the device if the panel is open. * Emag does not bring you into the syndicate network, but makes it visible to you. */ -/obj/machinery/fax/emag_act(mob/user) +/obj/machinery/fax/emag_act(mob/user, obj/item/card/emag/emag_card) if (!panel_open && !allow_exotic_faxes) balloon_alert(user, "open panel first!") - return + return FALSE if (!(obj_flags & EMAGGED)) obj_flags |= EMAGGED playsound(src, 'sound/creatures/dog/growl2.ogg', 50, FALSE) + balloon_alert(user, "migrated to syndienet 2.0") to_chat(user, span_warning("An image appears on [src] screen for a moment with Ian in the cap of a Syndicate officer.")) + return TRUE + return FALSE /obj/machinery/fax/wrench_act(mob/living/user, obj/item/tool) . = ..() @@ -218,7 +221,7 @@ GLOBAL_VAR_INIT(nt_fax_department, pick("NT HR Department", "NT Legal Department /obj/machinery/fax/ui_data(mob/user) var/list/data = list() //Record a list of all existing faxes. - for(var/obj/machinery/fax/FAX in GLOB.machines) + for(var/obj/machinery/fax/FAX as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/fax)) if(FAX.fax_id == fax_id) //skip yourself continue var/list/fax_data = list() @@ -324,7 +327,7 @@ GLOBAL_VAR_INIT(nt_fax_department, pick("NT HR Department", "NT Legal Department * * id - The network ID of the fax machine you want to send the item to. */ /obj/machinery/fax/proc/send(obj/item/loaded, id) - for(var/obj/machinery/fax/FAX in GLOB.machines) + for(var/obj/machinery/fax/FAX as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/fax)) if (FAX.fax_id != id) continue if (FAX.jammed) @@ -444,7 +447,7 @@ GLOBAL_VAR_INIT(nt_fax_department, pick("NT HR Department", "NT Legal Department * * new_fax_name - The text of the name to be checked for a match. */ /obj/machinery/fax/proc/fax_name_exist(new_fax_name) - for(var/obj/machinery/fax/FAX in GLOB.machines) + for(var/obj/machinery/fax/FAX as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/fax)) if (FAX.fax_name == new_fax_name) return TRUE return FALSE @@ -516,3 +519,28 @@ GLOBAL_VAR_INIT(nt_fax_department, pick("NT HR Department", "NT Legal Department return . +/// Sends a fax to a fax machine in an area! fax_area is a type, where all subtypes are also queried. If multiple machines, one is randomly picked +/// If force is TRUE, we send a droppod with a fax machine and fax the message to that fax machine +/proc/send_fax_to_area(obj/item/fax_item, area_type, sender, force = FALSE, force_pod_type) + var/list/fax_machines = SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/fax) + var/list/valid_fax_machines = list() + + for(var/obj/machinery/fax as anything in fax_machines) //get valid fax machines + var/area/fax_area = get_area(fax) + if(istype(fax_area, area_type)) + valid_fax_machines += fax + + // Pick a fax machine and send the fax + if(valid_fax_machines.len) + var/obj/machinery/fax/target_fax = pick(valid_fax_machines) + target_fax.receive(fax_item, sender) + + else if(force) //no fax machines but we really gotte send? SEND A FAX MACHINE + var/obj/machinery/fax/new_fax_machine = new () + send_supply_pod_to_area(new_fax_machine, area_type, force_pod_type) + addtimer(CALLBACK(new_fax_machine, TYPE_PROC_REF(/obj/machinery/fax, receive), fax_item, sender), 10 SECONDS) + + else + return FALSE + return TRUE + diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 429050d182558..ed99e7ea179dc 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -13,7 +13,7 @@ /obj/structure/filingcabinet name = "filing cabinet" desc = "A large cabinet with drawers." - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "filingcabinet" density = TRUE anchored = TRUE @@ -193,9 +193,9 @@ GLOBAL_LIST_EMPTY(employmentCabinets) /obj/structure/filingcabinet/employment/proc/fillCurrent() //This proc fills the cabinet with the current crew. for(var/datum/record/locked/target in GLOB.manifest.locked) - var/datum/mind/mind_ref = target.mind_ref - if(mind_ref && ishuman(mind_ref.current)) - addFile(mind_ref.current) + var/datum/mind/filed_mind = target.mind_ref.resolve() + if(filed_mind && ishuman(filed_mind.current)) + addFile(filed_mind.current) /obj/structure/filingcabinet/employment/proc/addFile(mob/living/carbon/human/employee) new /obj/item/paper/employment_contract(src, employee.mind.name) diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index d62c0f4a23a3d..4d0a0efe59639 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -1,7 +1,7 @@ /obj/item/folder name = "folder" desc = "A folder." - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "folder" w_class = WEIGHT_CLASS_SMALL pressure_resistance = 2 diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index 45bd1a2643829..e1516f3914c80 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -1,7 +1,7 @@ /obj/item/hand_labeler name = "hand labeler" desc = "A combined label printer, applicator, and remover, all in a single portable device. Designed to be easy to operate and use." - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "labeler0" inhand_icon_state = null var/label = null @@ -9,7 +9,7 @@ var/mode = 0 /obj/item/hand_labeler/suicide_act(mob/living/user) - user.visible_message(span_suicide("[user] is pointing [src] at [user.p_them()]self. [user.p_theyre(TRUE)] going to label [user.p_them()]self as a suicide!")) + user.visible_message(span_suicide("[user] is pointing [src] at [user.p_them()]self. [user.p_Theyre()] going to label [user.p_them()]self as a suicide!")) labels_left = max(labels_left - 1, 0) var/old_real_name = user.real_name @@ -121,7 +121,7 @@ /obj/item/hand_labeler_refill name = "hand labeler paper roll" - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' desc = "A roll of paper. Use it on a hand labeler to refill it." icon_state = "labeler_refill" inhand_icon_state = "electropack" diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 371f96e0da6de..82517f72494ca 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -13,7 +13,7 @@ /obj/item/paper name = "paper" gender = NEUTER - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "paper" inhand_icon_state = "paper" worn_icon_state = "paper" @@ -29,6 +29,7 @@ pickup_sound = 'sound/items/handling/paper_pickup.ogg' grind_results = list(/datum/reagent/cellulose = 3) color = COLOR_WHITE + item_flags = SKIP_FANTASY_ON_SPAWN /// Lazylist of raw, unsanitised, unparsed text inputs that have been made to the paper. var/list/datum/paper_input/raw_text_inputs @@ -77,6 +78,10 @@ camera_holder = null clear_paper() +/// Determines whether this paper has been written or stamped to. +/obj/item/paper/proc/is_empty() + return !(LAZYLEN(raw_text_inputs) || LAZYLEN(raw_stamp_data)) + /// Returns a deep copy list of raw_text_inputs, or null if the list is empty or doesn't exist. /obj/item/paper/proc/copy_raw_text() if(!LAZYLEN(raw_text_inputs)) @@ -124,7 +129,13 @@ * * greyscale_override - If set to a colour string and coloured is false, it will override the default of COLOR_WEBSAFE_DARK_GRAY when copying. */ /obj/item/paper/proc/copy(paper_type = /obj/item/paper, atom/location = loc, colored = TRUE, greyscale_override = null) - var/obj/item/paper/new_paper = new paper_type(location) + var/obj/item/paper/new_paper + if(ispath(paper_type, /obj/item/paper)) + new_paper = new paper_type(location) + else if(istype(paper_type, /obj/item/paper)) + new_paper = paper_type + else + CRASH("invalid paper_type [paper_type], paper type path or instance expected") new_paper.raw_text_inputs = copy_raw_text() new_paper.raw_field_input_data = copy_field_text() @@ -250,7 +261,7 @@ if(LAZYLEN(stamp_cache) > MAX_PAPER_STAMPS_OVERLAYS) return - var/mutable_appearance/stamp_overlay = mutable_appearance('icons/obj/bureaucracy.dmi', "paper_[stamp_icon_state]") + var/mutable_appearance/stamp_overlay = mutable_appearance('icons/obj/service/bureaucracy.dmi', "paper_[stamp_icon_state]") stamp_overlay.pixel_x = rand(-2, 2) stamp_overlay.pixel_y = rand(-3, 2) add_overlay(stamp_overlay) diff --git a/code/modules/paperwork/paper_biscuit.dm b/code/modules/paperwork/paper_biscuit.dm index 30b70f5c6edb2..bac859e029f4f 100644 --- a/code/modules/paperwork/paper_biscuit.dm +++ b/code/modules/paperwork/paper_biscuit.dm @@ -15,14 +15,24 @@ /obj/item/folder/biscuit/Initialize(mapload) . = ..() - if(!isnull(contained_slip)) + if(ispath(contained_slip, /obj/item/paper/paperslip)) contained_slip = new contained_slip(src) /obj/item/folder/biscuit/Destroy() - if(contained_slip) + if(isdatum(contained_slip)) QDEL_NULL(contained_slip) return ..() +/obj/item/folder/biscuit/Exited(atom/movable/gone, direction) + . = ..() + if(contained_slip == gone) + contained_slip = null + +/obj/item/folder/biscuit/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) + . = ..() + if(isnull(contained_slip) && istype(arrived, /obj/item/paper/paperslip)) + contained_slip = arrived + /obj/item/folder/biscuit/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] tries to eat [src]! [user.p_theyre()] trying to commit suicide!")) playsound(get_turf(user), 'sound/effects/wounds/crackandbleed.ogg', 40, TRUE) //Don't eat plastic cards kids, they get really sharp if you chew on them. diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm index 6cc6dde274642..9586ec6e86184 100644 --- a/code/modules/paperwork/paper_cutter.dm +++ b/code/modules/paperwork/paper_cutter.dm @@ -1,18 +1,22 @@ /obj/item/papercutter name = "paper cutter" desc = "Standard office equipment. Precisely cuts paper using a large blade." - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "papercutter" force = 5 throwforce = 5 w_class = WEIGHT_CLASS_NORMAL pass_flags = PASSTABLE + /// The paper currently loaded inside the cutter var/obj/item/paper/stored_paper + /// The blade currently loaded inside the cutter var/obj/item/hatchet/cutterblade/stored_blade + /// Whether the cutter blade is secured or not. var/blade_secured = TRUE + /// The chance for a clumsy person to cut themselves on the blade /// Should probably be low-ish to prevent people spamming it quite so easily var/cut_self_chance = 5 @@ -20,22 +24,59 @@ /obj/item/papercutter/Initialize(mapload) . = ..() stored_blade = new /obj/item/hatchet/cutterblade(src) + register_context() update_appearance() /obj/item/papercutter/Destroy(force) - if(stored_paper) - stored_paper.forceMove(get_turf(src)) - stored_paper = null - if(stored_blade) - stored_blade.forceMove(get_turf(src)) - stored_blade = null + if(!isnull(stored_paper)) + QDEL_NULL(stored_paper) + if(!isnull(stored_blade)) + QDEL_NULL(stored_blade) return ..() -/obj/item/papercutter/examine(mob/user) +/obj/item/papercutter/add_context(atom/source, list/context, obj/item/held_item, mob/user) . = ..() - . += "Right-Click to cut paper once it's inside." - if(stored_blade) - . += "The blade could be [blade_secured ? "un" : ""]secured with a screwdriver[blade_secured ? "" : " or removed with an empty hand"]." + + if(!isnull(held_item)) + if(held_item.tool_behaviour == TOOL_SCREWDRIVER) + if(isnull(stored_blade)) + return NONE + context[SCREENTIP_CONTEXT_LMB] = "[(blade_secured ? "Unsecure" : "Secure")] blade" + if(istype(held_item, /obj/item/paper)) + if(!isnull(stored_paper)) + return NONE + context[SCREENTIP_CONTEXT_LMB] = "Insert paper" + if(istype(held_item, /obj/item/hatchet/cutterblade)) + if(!isnull(stored_blade)) + return NONE + context[SCREENTIP_CONTEXT_LMB] = "Insert blade" + + if(!isnull(stored_paper)) + context[SCREENTIP_CONTEXT_ALT_LMB] = "Remove paper" + if(!(isnull(stored_blade)) && blade_secured) + context[SCREENTIP_CONTEXT_RMB] = "Cut paper" + + else if(!isnull(stored_blade) && !blade_secured) + context[SCREENTIP_CONTEXT_ALT_LMB] = "Remove blade" + + return CONTEXTUAL_SCREENTIP_SET + +/obj/item/papercutter/deconstruct(disassembled) + ..() + if(!disassembled) + return + + if(!isnull(stored_paper)) + stored_paper.forceMove(drop_location()) + if(!isnull(stored_blade)) + stored_blade.forceMove(drop_location()) + +/obj/item/papercutter/Exited(atom/movable/leaving, atom/new_loc) + . = ..() + if(leaving == stored_paper) + stored_paper = null + if(leaving == stored_blade) + stored_blade = null /obj/item/papercutter/suicide_act(mob/living/user) if(iscarbon(user) && stored_blade) @@ -53,30 +94,34 @@ playsound(loc, 'sound/items/gavel.ogg', 50, TRUE, -1) return BRUTELOSS - -/obj/item/papercutter/update_icon_state() - icon_state = (stored_blade ? "[initial(icon_state)]-cutter" : "[initial(icon_state)]") - return ..() - /obj/item/papercutter/update_overlays() - . =..() - if(stored_paper) + . = ..() + if(!isnull(stored_paper)) . += "paper" + if(!isnull(stored_blade)) + . += "cutter_overlay" /obj/item/papercutter/screwdriver_act(mob/living/user, obj/item/tool) if(!stored_blade && !blade_secured) - balloon_alert(user, "no blade to secure!") + balloon_alert(user, "no blade!") return + tool.play_tool_sound(src) - balloon_alert(user, "blade [blade_secured ? "un" : ""]secured") + balloon_alert(user, "[blade_secured ? "un" : ""]secured") blade_secured = !blade_secured return TOOL_ACT_TOOLTYPE_SUCCESS - /obj/item/papercutter/attackby(obj/item/inserted_item, mob/user, params) - if(istype(inserted_item, /obj/item/paper) && !istype(inserted_item, /obj/item/paper/paperslip)) + if(istype(inserted_item, /obj/item/paper)) + if(is_type_in_list(inserted_item, list( + /obj/item/paper/paperslip, /obj/item/paper/report, /obj/item/paper/fake_report, + /obj/item/paper/calling_card, /obj/item/paper/pamphlet, /obj/item/paper/holy_writ) + )) + balloon_alert(user, "won't fit!") + return if(stored_paper) balloon_alert(user, "already paper inside!") + return if(!user.transferItemToLoc(inserted_item, src)) return playsound(loc, SFX_PAGE_TURN, 60, TRUE) @@ -97,29 +142,16 @@ return ..() -/obj/item/papercutter/attack_hand(mob/user, list/modifiers) - add_fingerprint(user) - - if(!stored_blade && stored_paper) - balloon_alert(user, "no blade!") - return COMPONENT_CANCEL_ATTACK_CHAIN - - else if(!blade_secured) - balloon_alert(user, "blade removed") - user.put_in_hands(stored_blade) - stored_blade = null - update_appearance() - return COMPONENT_CANCEL_ATTACK_CHAIN +/obj/item/papercutter/AltClick(mob/user) + if(!user.Adjacent(src)) + return ..() - else if(stored_paper) - balloon_alert(user, "paper removed") + // can only remove one at a time; paper goes first, as its most likely what players will want to be taking out + if(!isnull(stored_paper)) user.put_in_hands(stored_paper) - stored_paper = null - update_appearance() - return COMPONENT_CANCEL_ATTACK_CHAIN - - // If there's a secured blade but no paper, just pick it up - return ..() + else if(!isnull(stored_blade) && !blade_secured) + user.put_in_hands(stored_blade) + update_appearance() /obj/item/papercutter/attack_hand_secondary(mob/user, list/modifiers) if(!stored_blade) @@ -139,8 +171,9 @@ to_chat(user, span_userdanger("You neatly cut [stored_paper][clumsy ? "... and your finger in the process!" : "."]")) if(clumsy) var/obj/item/bodypart/finger = user.get_active_hand() - var/datum/wound/slash/moderate/papercut = new - papercut.apply_wound(finger, wound_source = "paper cut") + if (iscarbon(user)) + var/mob/living/carbon/carbon_user = user + carbon_user.cause_wound_of_type_and_severity(WOUND_SLASH, finger, WOUND_SEVERITY_MODERATE, wound_source = "paper cut") stored_paper = null qdel(stored_paper) new /obj/item/paper/paperslip(get_turf(src)) @@ -170,6 +203,13 @@ righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' grind_results = list(/datum/reagent/cellulose = 1.5) //It's a normal paper sheet divided in 2. 3 divided by 2 equals 1.5, this way you can't magically dupe cellulose +/obj/item/paper/paperslip/fortune + name = "fortune slip" + +/obj/item/paper/paperslip/fortune/Initialize(mapload) + default_raw_text = pick(GLOB.wisdoms) + return ..() + /obj/item/paper/paperslip/corporate //More fancy and sturdy paper slip which is a "plastic card", used for things like spare ID safe code name = "corporate plastic card" desc = "A plastic card for confidential corporate matters. Can be written on with pen somehow." @@ -184,7 +224,7 @@ /obj/item/hatchet/cutterblade name = "paper cutter blade" desc = "The blade of a paper cutter. Most likely removed for polishing or sharpening." - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "cutterblade" inhand_icon_state = "knife" lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' diff --git a/code/modules/paperwork/paper_premade.dm b/code/modules/paperwork/paper_premade.dm index eebb3a3436d67..bb38a27d38d75 100644 --- a/code/modules/paperwork/paper_premade.dm +++ b/code/modules/paperwork/paper_premade.dm @@ -31,6 +31,47 @@ name = "paper- 'Holopad Notice'" default_raw_text = "Can't get any botanists at the table? Have you tried using the damn holopad?
    \n
    \nStep onto the pad, and interface with it
    \nthen make your dang ol' call!
    \n
    \nYou want to call \"Hydroponics\" to reach them." +/obj/item/paper/guides/jobs/engineering/bsa + name = "Bluespace Artillery (BSA) Assembly Instructions" + default_raw_text = {"Below is a quick guide on setting up your new Bluespace Artillery Cannon. +
    + Featuring the newest in Nanotrasen technology, the Bluespace Artillery Cannon is your surefire ticket to complete and total threat elimination. +
    +

    1. Acquire necessary resources.

    + * Bluespace Artillery Bore + * Bluespace Artillery Fusor + * Bluespace Artillery Generator + * Bluespace Artillery Controls + * 26 cable pieces + * 20 iron + * 20 bluespace crystals (or artificial) + * 5 quadratic capacitors + * 5 femto servos + * 1 glass sheet +

    2. Find suitable location

    + The BSA has a steep power requirement and functions best when it is on its own APC; keep other items in the room to a minimum. Ensure the BSA is placed at the edge of the station, so that it won't shoot through another portion of the station.. Make sure the room isn't easily accessible by someone who shouldn't be there. +

    3. Construction

    + 1. Build three machine frames. + 2. Determine the desired direction you want your artillery to face. + 3. Leave six spaces in front, four behind. The artillery cannon finishes itself after the assemblies are aligned. + 4. Place the machine frames in a horizontal line. + 5. Wrench the three machine frames in place. + 6. Install wires in the three machine frames. + 7. Install the bore in the front machine frame. this is your barrel. + 8. Install the fusor in the center machine frame. + 9. Install the generator in the back machine frame. + 10. Examine the three machines and see what else they need, you can use a screwdriver to finish the assembly when parts are installed. + 11. Construct a computer terminal in the same room as the BSA assembly, make sure they draw power from the same APC or ask the Chief Engineer to check the blueprints for you. + 12. Use a screwdriver to fasten the board, install wires and one glass sheet, use screwdriver again to turn on. + 13. Use a multitool and interact with the generator, then the fusor. + 14. Use a multitool again to interact with the bore, then the fusor. + 15. Use the console to finalize construction, make sure there's enough empty space around the BSA for the assembly to commence. + And with that, you are done! + Commencing firing protocols requires the access of at least two heads, the console will be locked down until this requirement is met. + Always make sure you are certain before attempting to fire the BSA. +
    + Keep this manual for your records, failure to do so will void your 2 day limited liability warranty from Nanotrasen."} + /obj/item/paper/fluff/jobs/security/beepsky_mom name = "Note from Beepsky's Mom" default_raw_text = "01001001 00100000 01101000 01101111 01110000 01100101 00100000 01111001 01101111 01110101 00100000 01110011 01110100 01100001 01111001 00100000 01110011 01100001 01100110 01100101 00101110 00100000 01001100 01101111 01110110 01100101 00101100 00100000 01101101 01101111 01101101 00101110" diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 5efc8a358208b..9971c0da7f7bb 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -3,7 +3,7 @@ /obj/item/paper_bin name = "paper bin" desc = "Contains all the paper you'll never need." - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "paper_bin0" inhand_icon_state = "sheet-metal" lefthand_file = 'icons/mob/inhands/items/sheets_lefthand.dmi' @@ -54,12 +54,26 @@ droppoint = drop_location() if(collapse) visible_message(span_warning("The stack of paper collapses!")) - for(var/atom/movable/movable_atom in contents) - movable_atom.forceMove(droppoint) - if(!movable_atom.pixel_y) - movable_atom.pixel_y = rand(-3,3) - if(!movable_atom.pixel_x) - movable_atom.pixel_x = rand(-3,3) + for(var/obj/item/paper/stacked_paper in paper_stack) //first, dump all of the paper that already exists + stacked_paper.forceMove(droppoint) + if(!stacked_paper.pixel_y) + stacked_paper.pixel_y = rand(-3,3) + if(!stacked_paper.pixel_x) + stacked_paper.pixel_x = rand(-3,3) + paper_stack -= stacked_paper + total_paper -= 1 + for(var/i in 1 to total_paper) //second, generate new paper for the remainder + var/obj/item/paper/new_paper = generate_paper() + new_paper.forceMove(droppoint) + if(!new_paper.pixel_y) + new_paper.pixel_y = rand(-3,3) + if(!new_paper.pixel_x) + new_paper.pixel_x = rand(-3,3) + if(bin_pen) + var/obj/item/pen/pen = bin_pen + pen.forceMove(droppoint) + bin_pen = null + total_paper = 0 update_appearance() /obj/item/paper_bin/fire_act(exposed_temperature, exposed_volume) @@ -212,6 +226,8 @@ /obj/item/paper_bin/bundlenatural/dump_contents(atom/droppoint) . = ..() + binding_cable.forceMove(droppoint) + binding_cable = null qdel(src) /obj/item/paper_bin/bundlenatural/update_overlays() @@ -225,7 +241,7 @@ deconstruct(FALSE) /obj/item/paper_bin/bundlenatural/deconstruct(disassembled) - dump_contents() + dump_contents(drop_location()) return ..() /obj/item/paper_bin/bundlenatural/fire_act(exposed_temperature, exposed_volume) diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index f83de3299584c..08d34dca863da 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -1,7 +1,7 @@ /obj/item/paperplane name = "paper plane" desc = "Paper, folded in the shape of a plane." - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "paperplane" custom_fire_overlay = "paperplane_onfire" throw_range = 7 diff --git a/code/modules/paperwork/paperwork.dm b/code/modules/paperwork/paperwork.dm index 280bff58890ad..03f22177f9e71 100644 --- a/code/modules/paperwork/paperwork.dm +++ b/code/modules/paperwork/paperwork.dm @@ -13,7 +13,7 @@ /obj/item/paperwork name = "paperwork documents" desc = "A disorganized mess of documents, research results, and investigation findings." - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "docs_part" inhand_icon_state = "paper" throwforce = 0 @@ -41,20 +41,25 @@ /obj/item/paperwork/attackby(obj/item/attacking_item, mob/user, params) . = ..() + if(.) + return - if(!stamped) - if(istype(attacking_item, /obj/item/stamp)) - if(istype(attacking_item, stamp_requested)) //chameleon stamp does not work, this is a CRITICAL issue - add_stamp() - to_chat(user, span_notice("You skim through the papers until you find a field reading 'STAMP HERE', and complete the paperwork.")) - else - if(istype(attacking_item, /obj/item/stamp/chameleon)) - var/obj/item/stamp/chameleon/chameleon_stamp = attacking_item - to_chat(user, span_notice("[chameleon_stamp] morphs into the appropriate stamp, which you use to complete the paperwork.")) - chameleon_stamp.chameleon_action.update_item(stamp_requested) - add_stamp() - else - to_chat(user, span_warning("You hunt through the papers for somewhere to use the [attacking_item], but can't find anything.")) + if(stamped || istype(attacking_item, /obj/item/stamp)) + return + + if(istype(attacking_item, stamp_requested)) + add_stamp() + to_chat(user, span_notice("You skim through the papers until you find a field reading 'STAMP HERE', and complete the paperwork.")) + return TRUE + var/datum/action/item_action/chameleon/change/stamp/stamp_action = locate() in attacking_item.actions + if(isnull(stamp_action)) + to_chat(user, span_warning("You hunt through the papers for somewhere to use [attacking_item], but can't find anything.")) + return TRUE + + to_chat(user, span_notice("[attacking_item] morphs into the appropriate stamp, which you use to complete the paperwork.")) + stamp_action.update_look(stamp_requested) + add_stamp() + return TRUE /obj/item/paperwork/examine_more(mob/user) . = ..() @@ -95,7 +100,7 @@ * Handled as a proc so that an object may be maked as "stamped" even when a stamp isn't present (like the photocopier) */ /obj/item/paperwork/proc/add_stamp() - stamp_overlay = mutable_appearance('icons/obj/bureaucracy.dmi', stamp_icon) + stamp_overlay = mutable_appearance('icons/obj/service/bureaucracy.dmi', stamp_icon) add_overlay(stamp_overlay) stamped = TRUE @@ -232,7 +237,7 @@ /obj/item/paperwork/photocopy/attackby(obj/item/attacking_item, mob/user, params) if(istype(attacking_item, /obj/item/stamp/void) && !stamped && !voided) to_chat(user, span_notice("You plant the [attacking_item] firmly onto the front of the documents.")) - stamp_overlay = mutable_appearance('icons/obj/bureaucracy.dmi', "paper_stamp-void") + stamp_overlay = mutable_appearance('icons/obj/service/bureaucracy.dmi', "paper_stamp-void") add_overlay(stamp_overlay) voided = TRUE stamped = TRUE //It won't get you any money, but it also can't LOSE you money now. diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 23cb8066c2d26..05606ac3a2ef1 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -13,7 +13,7 @@ /obj/item/pen desc = "It's a normal black ink pen." name = "pen" - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "pen" inhand_icon_state = "pen" worn_icon_state = "pen" @@ -186,6 +186,7 @@ label.apply_label() to_chat(user, span_notice("You have successfully renamed \the [oldname] to [O].")) O.renamedByPlayer = TRUE + O.update_appearance(UPDATE_ICON) if(penchoice == "Description") var/input = tgui_input_text(user, "Describe [O]", "Description", "[O.desc]", 280) @@ -198,6 +199,7 @@ O.AddComponent(/datum/component/rename, O.name, input) to_chat(user, span_notice("You have successfully changed [O]'s description.")) O.renamedByPlayer = TRUE + O.update_appearance(UPDATE_ICON) if(penchoice == "Reset") if(QDELETED(O) || !user.can_perform_action(O)) @@ -213,6 +215,7 @@ to_chat(user, span_notice("You have successfully reset [O]'s name and description.")) O.renamedByPlayer = FALSE + O.update_appearance(UPDATE_ICON) /obj/item/pen/get_writing_implement_details() return list( @@ -234,7 +237,7 @@ return if(!M.reagents) return - reagents.trans_to(M, reagents.total_volume, transfered_by = user, methods = INJECT) + reagents.trans_to(M, reagents.total_volume, transferred_by = user, methods = INJECT) /obj/item/pen/sleepy/Initialize(mapload) @@ -265,8 +268,6 @@ var/hidden_desc = "It's a normal black ink pe- Wait. That's a thing used to stab people!" /// The real icons used when extended. var/hidden_icon = "edagger" - /// Whether or pen is extended - var/extended = FALSE /obj/item/pen/edagger/Initialize(mapload) . = ..() @@ -274,7 +275,8 @@ speed = 6 SECONDS, \ butcher_sound = 'sound/weapons/blade1.ogg', \ ) - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ force_on = 18, \ throwforce_on = 35, \ throw_speed_on = 4, \ @@ -286,7 +288,7 @@ RegisterSignal(src, COMSIG_DETECTIVE_SCANNED, PROC_REF(on_scan)) /obj/item/pen/edagger/suicide_act(mob/living/user) - if(extended) + if(HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) user.visible_message(span_suicide("[user] forcefully rams the pen into their mouth!")) else user.visible_message(span_suicide("[user] is holding a pen up to their mouth! It looks like [user.p_theyre()] trying to commit suicide!")) @@ -302,7 +304,6 @@ /obj/item/pen/edagger/proc/on_transform(obj/item/source, mob/user, active) SIGNAL_HANDLER - extended = active if(active) name = hidden_name desc = hidden_desc @@ -321,8 +322,9 @@ embedding = list(embed_chance = EMBED_CHANCE) updateEmbedding() - balloon_alert(user, "[hidden_name] [active ? "active":"concealed"]") - playsound(user ? user : src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 5, TRUE) + if(user) + balloon_alert(user, "[hidden_name] [active ? "active" : "concealed"]") + playsound(src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 5, TRUE) set_light_on(active) return COMPONENT_NO_DEFAULT_MESSAGE @@ -333,7 +335,7 @@ /obj/item/pen/survival name = "survival pen" desc = "The latest in portable survival technology, this pen was designed as a miniature diamond pickaxe. Watchers find them very desirable for their diamond exterior." - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "digging_pen" inhand_icon_state = "pen" worn_icon_state = "pen" @@ -360,12 +362,14 @@ desc = "A pen with an extendable screwdriver tip. This one has a yellow cap." icon_state = "pendriver" toolspeed = 1.2 // gotta have some downside - /// whether the pen is extended - var/extended = FALSE + +/obj/item/pen/screwdriver/get_all_tool_behaviours() + return list(TOOL_SCREWDRIVER) /obj/item/pen/screwdriver/Initialize(mapload) . = ..() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ throwforce_on = 5, \ w_class_on = WEIGHT_CLASS_SMALL, \ sharpness_on = TRUE, \ @@ -375,24 +379,14 @@ RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(toggle_screwdriver)) AddElement(/datum/element/update_icon_updates_onmob) - -/obj/item/pen/screwdriver/vv_edit_var(var_name, var_value) - if(var_name == NAMEOF(src, extended)) - if(var_value != extended) - var/datum/component/transforming/transforming_comp = GetComponent(/datum/component/transforming) - transforming_comp.on_attack_self(src) - datum_flags |= DF_VAR_EDITED - return - return ..() - /obj/item/pen/screwdriver/proc/toggle_screwdriver(obj/item/source, mob/user, active) SIGNAL_HANDLER - extended = active + if(user) - balloon_alert(user, "[extended ? "extended" : "retracted"]") + balloon_alert(user, active ? "extended" : "retracted") playsound(src, 'sound/weapons/batonextend.ogg', 50, TRUE) - if(!extended) + if(!active) tool_behaviour = initial(tool_behaviour) RemoveElement(/datum/element/eyestab) else @@ -404,5 +398,5 @@ /obj/item/pen/screwdriver/update_icon_state() . = ..() - icon_state = "[initial(icon_state)][extended ? "_out":null]" + icon_state = "[initial(icon_state)][HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE) ? "_out" : null]" inhand_icon_state = initial(inhand_icon_state) //since transforming component switches the icon. diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 33eb035bfb826..0f122c104eb81 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -1,3 +1,5 @@ +/// Name of the blanks file +#define BLANKS_FILE_NAME "config/blanks.json" /// For use with the `color_mode` var. Photos will be printed in greyscale while the var has this value. #define PHOTO_GREYSCALE "Greyscale" @@ -9,19 +11,56 @@ /// How much toner is used for making a copy of a photo. #define PHOTO_TONER_USE 0.625 /// How much toner is used for making a copy of a document. -#define DOCUMENT_TONER_USE 0.75 +#define DOCUMENT_TONER_USE (PAPER_TONER_USE * DOCUMENT_PAPER_USE) /// How much toner is used for making a copy of an ass. -#define ASS_TONER_USE 0.625 -/// How much toner is used for making a copy of paperwork -#define PAPERWORK_TONER_USE 0.75 - +#define ASS_TONER_USE PHOTO_TONER_USE +/// How much toner is used for making a copy of paperwork. +#define PAPERWORK_TONER_USE (PAPER_TONER_USE * PAPERWORK_PAPER_USE) + +/// At which toner charge amount we start losing color. Toner cartridges are scams. +#define TONER_CHARGE_LOW_AMOUNT 2 + +// please use integers here +/// How much paper is used for making a copy of paper. What, are you seriously surprised by this? +#define PAPER_PAPER_USE 1 +/// How much paper is used for making a copy of a photo. +#define PHOTO_PAPER_USE 1 +/// How much paper is used for making a copy of a document. +#define DOCUMENT_PAPER_USE 20 +/// How much paper is used for making a copy of a photo. +#define ASS_PAPER_USE PHOTO_PAPER_USE +/// How much paper is used for making a copy of paperwork. +#define PAPERWORK_PAPER_USE 10 + +/// Maximum capacity of a photocopier +#define MAX_PAPER_CAPACITY 60 /// The maximum amount of copies you can make with one press of the copy button. #define MAX_COPIES_AT_ONCE 10 +/// Photocopier copy fee. +#define PHOTOCOPIER_FEE 5 + +/// Paper blanks (form templates, basically). Loaded from `config/blanks.json`. +/// If invalid or not found, set to null. +GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks()) + +/proc/init_paper_blanks() + if(!fexists(BLANKS_FILE_NAME)) + return null + var/list/blanks_json = json_decode(file2text(BLANKS_FILE_NAME)) + if(!length(blanks_json)) + return null + + var/list/parsed_blanks = list() + for(var/paper_blank in blanks_json) + parsed_blanks += list("[paper_blank["code"]]" = paper_blank) + + return parsed_blanks + /obj/machinery/photocopier name = "photocopier" desc = "Used to copy important documents and anatomy studies." - icon = 'icons/obj/library.dmi' + icon = 'icons/obj/service/library.dmi' icon_state = "photocopier" density = TRUE power_channel = AREA_USAGE_EQUIP @@ -39,8 +78,14 @@ var/busy = FALSE /// Variable needed to determine the selected category of forms on Photocopier.js var/category - ///Variable that holds a reference to any object supported for photocopying inside the photocopier + /// Variable that holds a reference to any object supported for photocopying inside the photocopier var/obj/object_copy + /// Variable for the UI telling us how many copies are in the queue. + var/copies_left = 0 + /// The amount of paper this photocoper starts with. + var/starting_paper = 30 + /// A stack for all the empty paper we have newly inserted (LIFO) + var/list/paper_stack = list() /obj/machinery/photocopier/Initialize(mapload) . = ..() @@ -49,23 +94,33 @@ /// Simply adds the necessary components for this to function. /obj/machinery/photocopier/proc/setup_components() - AddComponent(/datum/component/payment, 5, SSeconomy.get_dep_account(ACCOUNT_CIV), PAYMENT_CLINICAL) + AddComponent(/datum/component/payment, PHOTOCOPIER_FEE, SSeconomy.get_dep_account(ACCOUNT_CIV), PAYMENT_CLINICAL) -/obj/machinery/photocopier/handle_atom_del(atom/deleting_atom) - if(deleting_atom == object_copy) +/obj/machinery/photocopier/Exited(atom/movable/gone, direction) + . = ..() + if(gone == object_copy) object_copy = null - if(deleting_atom == ass) - ass = null - if(deleting_atom == toner_cartridge) + if(gone == toner_cartridge) toner_cartridge = null - return ..() + if(gone in paper_stack) + paper_stack -= gone /obj/machinery/photocopier/Destroy() - QDEL_NULL(object_copy) + // object_copy can be a traitor objective, don't qdel + if(object_copy) + object_copy.forceMove(drop_location()) + QDEL_NULL(toner_cartridge) + QDEL_LIST(paper_stack) + ass = null //the mob isn't actually contained and just referenced, no need to delete it. return ..() +/obj/machinery/photocopier/examine(mob/user) + . = ..() + if(object_copy) + . += span_notice("There is something inside the scanner tray.") + . += span_notice("You can put any type of blank paper inside to print a form onto it or to copy something onto it.") /obj/machinery/photocopier/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -73,21 +128,33 @@ ui = new(user, src, "Photocopier") ui.open() +/obj/machinery/photocopier/ui_static_data(mob/user) + var/list/static_data = list() + + var/list/blank_infos = list() + var/list/category_names = list() + if(GLOB.paper_blanks) + for(var/blank_id in GLOB.paper_blanks) + var/list/paper_blank = GLOB.paper_blanks[blank_id] + blank_infos += list(list( + name = paper_blank["name"], + category = paper_blank["category"], + code = blank_id, + )) + category_names |= paper_blank["category"] + + static_data["blanks"] = blank_infos + static_data["categories"] = category_names + + return static_data + /obj/machinery/photocopier/ui_data(mob/user) var/list/data = list() data["has_item"] = !copier_empty() data["num_copies"] = num_copies - try - var/list/blanks = json_decode(file2text("config/blanks.json")) - if (blanks != null) - data["blanks"] = blanks - data["category"] = category - data["forms_exist"] = TRUE - else - data["forms_exist"] = FALSE - catch() - data["forms_exist"] = FALSE + data["category"] = category + data["copies_left"] = copies_left if(istype(object_copy, /obj/item/photo)) data["is_photo"] = TRUE @@ -95,7 +162,7 @@ if(isAI(user)) data["isAI"] = TRUE - data["can_AI_print"] = toner_cartridge ? toner_cartridge.charges >= PHOTO_TONER_USE : FALSE + data["can_AI_print"] = toner_cartridge && (toner_cartridge.charges >= PHOTO_TONER_USE) && (get_paper_count() >= PHOTO_PAPER_USE) else data["isAI"] = FALSE @@ -103,10 +170,10 @@ data["has_toner"] = TRUE data["current_toner"] = toner_cartridge.charges data["max_toner"] = toner_cartridge.max_charges - data["has_enough_toner"] = has_enough_toner() else data["has_toner"] = FALSE - data["has_enough_toner"] = FALSE + + data["paper_count"] = get_paper_count() return data @@ -115,6 +182,9 @@ if(.) return + if(machine_stat & (BROKEN|NOPOWER)) + return + switch(action) // Copying paper, photos, documents and asses. if("make_copy") @@ -122,28 +192,31 @@ return FALSE // ASS COPY. By Miauw if(ass) - do_copy_loop(CALLBACK(src, PROC_REF(make_ass_copy), usr), usr) + if(ishuman(ass) && (ass.get_item_by_slot(ITEM_SLOT_ICLOTHING) || ass.get_item_by_slot(ITEM_SLOT_OCLOTHING))) + if(ass == usr) + to_chat(usr, span_notice("You feel kind of silly, copying your ass with your clothes on.")) + else + to_chat(usr, span_notice("You feel kind of silly, copying [ass]\'s ass with [ass.p_their()] clothes on.")) + return FALSE + do_copies(CALLBACK(src, PROC_REF(make_ass_copy), usr), usr, ASS_PAPER_USE, ASS_TONER_USE, num_copies) return TRUE else + // Basic paper if(istype(object_copy, /obj/item/paper)) - var/obj/item/paper/paper_copy = object_copy - if(!paper_copy.get_total_length()) - to_chat(usr, span_warning("An error message flashes across [src]'s screen: \"The supplied paper is blank. Aborting.\"")) - return FALSE - // Basic paper - do_copy_loop(CALLBACK(src, PROC_REF(make_paper_copy), paper_copy), usr) + do_copies(CALLBACK(src, PROC_REF(make_paper_copy), object_copy), usr, PAPER_PAPER_USE, PAPER_TONER_USE, num_copies) return TRUE // Copying photo. if(istype(object_copy, /obj/item/photo)) - do_copy_loop(CALLBACK(src, PROC_REF(make_photo_copy), object_copy), usr) + var/obj/item/photo/photo_copy = object_copy + do_copies(CALLBACK(src, PROC_REF(make_photo_copy), photo_copy.picture, color_mode), usr, PHOTO_PAPER_USE, PHOTO_TONER_USE, num_copies) return TRUE // Copying Documents. if(istype(object_copy, /obj/item/documents)) - do_copy_loop(CALLBACK(src, PROC_REF(make_document_copy), object_copy), usr) + do_copies(CALLBACK(src, PROC_REF(make_document_copy), object_copy), usr, DOCUMENT_PAPER_USE, DOCUMENT_TONER_USE, num_copies) return TRUE // Copying paperwork if(istype(object_copy, /obj/item/paperwork)) - do_copy_loop(CALLBACK(src, PROC_REF(make_paperwork_copy), object_copy), usr) + do_copies(CALLBACK(src, PROC_REF(make_paperwork_copy), object_copy), usr, PAPERWORK_PAPER_USE, PAPERWORK_TONER_USE, num_copies) return TRUE // Remove the paper/photo/document from the photocopier. @@ -161,12 +234,10 @@ return FALSE var/mob/living/silicon/ai/tempAI = usr if(!length(tempAI.aicamera.stored)) - to_chat(usr, span_boldannounce("No images saved.")) - return + balloon_alert(usr, "no images saved!") + return FALSE var/datum/picture/selection = tempAI.aicamera.selectpicture(usr) - var/obj/item/photo/photo = new(loc, selection) // AI prints color photos only. - give_pixel_offset(photo) - toner_cartridge.charges -= PHOTO_TONER_USE + do_copies(CALLBACK(src, PROC_REF(make_photo_copy), selection, PHOTO_COLOR), usr, PHOTO_PAPER_USE, PHOTO_TONER_USE, 1) return TRUE // Switch between greyscale and color photos @@ -178,7 +249,7 @@ // Remove the toner cartridge from the copier. if("remove_toner") if(check_busy(usr)) - return + return FALSE var/success = usr.put_in_hands(toner_cartridge) if(!success) toner_cartridge.forceMove(drop_location()) @@ -198,63 +269,96 @@ if("print_blank") if(check_busy(usr)) return FALSE - if (toner_cartridge.charges - PAPER_TONER_USE < 0) - to_chat(usr, span_warning("There is not enough toner in [src] to print the form, please replace the cartridge.")) + if(!(params["code"] in GLOB.paper_blanks)) return FALSE - do_copy_loop(CALLBACK(src, PROC_REF(make_blank_print), params), usr) + var/list/blank = GLOB.paper_blanks[params["code"]] + do_copies(CALLBACK(src, PROC_REF(make_blank_print), blank), usr, PAPER_PAPER_USE, PAPER_TONER_USE, 1) return TRUE -/** - * Determines if the photocopier has enough toner to create `num_copies` amount of copies of the currently inserted item. - */ -/obj/machinery/photocopier/proc/has_enough_toner() - if(ass) - return toner_cartridge.charges >= (ASS_TONER_USE * num_copies) - if(isnull(object_copy)) - return FALSE - if(istype(object_copy, /obj/item/paper)) - return toner_cartridge.charges >= (PAPER_TONER_USE * num_copies) - if(istype(object_copy, /obj/item/documents)) - return toner_cartridge.charges >= (DOCUMENT_TONER_USE * num_copies) - if(istype(object_copy, /obj/item/photo)) - return toner_cartridge.charges >= (PHOTO_TONER_USE * num_copies) - if(istype(object_copy, /obj/item/paperwork)) - return toner_cartridge.charges >= (PAPERWORK_TONER_USE * num_copies) +/// Returns the color used for the printing operation. If the color is below TONER_LOW_PERCENTAGE, it returns a gray color. +/obj/machinery/photocopier/proc/get_toner_color() + return toner_cartridge.charges > TONER_CHARGE_LOW_AMOUNT ? COLOR_FULL_TONER_BLACK : COLOR_GRAY + + +/// Will invoke `do_copy_loop` asynchronously. Passes the supplied arguments on to it. +/obj/machinery/photocopier/proc/do_copies(datum/callback/copy_cb, mob/user, paper_use, toner_use, copies_amount) + busy = TRUE + update_use_power(ACTIVE_POWER_USE) + // fucking god proc + INVOKE_ASYNC(src, PROC_REF(do_copy_loop), copy_cb, user, paper_use, toner_use, copies_amount) /** - * Will invoke the passed in `copy_cb` callback in 1 second intervals, and charge the user 5 credits for each copy made. + * Will invoke the passed in `copy_cb` callback in 4 second intervals, and charge the user 5 credits for each copy made. * * Arguments: * * copy_cb - a callback for which proc to call. Should only be one of the `make_x_copy()` procs, such as `make_paper_copy()`. * * user - the mob who clicked copy. + * * paper_use - the amount of paper used in this operation + * * toner_use - the amount of toner used in this operation + * * copies_amount - the amount of copies we should make */ -/obj/machinery/photocopier/proc/do_copy_loop(datum/callback/copy_cb, mob/user) - busy = TRUE - update_use_power(ACTIVE_POWER_USE) - var/i - for(i in 1 to num_copies) - if(!toner_cartridge) //someone removed the toner cartridge during printing lol. +/obj/machinery/photocopier/proc/do_copy_loop(datum/callback/copy_cb, mob/user, paper_use, toner_use, copies_amount) + var/error_message = null + if(!toner_cartridge) + copies_amount = 0 + error_message = span_warning("An error message flashes across \the [src]'s screen: \"No toner cartridge found. Aborting.\"") + else if(toner_cartridge.charges < toner_use * copies_amount) + copies_amount = FLOOR(toner_cartridge.charges / toner_use, 1) + error_message = span_warning("An error message flashes across \the [src]'s screen: \"Not enough toner to perform [copies_amount >= 1 ? "full " : ""]operation.\"") + if(get_paper_count() < paper_use * copies_amount) + copies_amount = FLOOR(get_paper_count() / paper_use, 1) + error_message = span_warning("An error message flashes across \the [src]'s screen: \"Not enough paper to perform [copies_amount >= 1 ? "full " : ""]operation.\"") + + copies_left = copies_amount + + if(copies_amount <= 0) + to_chat(user, error_message) + reset_busy() + return + + if(attempt_charge(src, user, (copies_amount - 1) * PHOTOCOPIER_FEE) & COMPONENT_OBJ_CANCEL_CHARGE) + reset_busy() + return + + if(error_message) + to_chat(user, error_message) + + // if you managed to cancel the copy operation, tough luck. you aren't getting your money back. + for(var/i in 1 to copies_amount) + if(machine_stat & (BROKEN|NOPOWER)) break - if(attempt_charge(src, user) & COMPONENT_OBJ_CANCEL_CHARGE) - balloon_alert(user, "insufficient funds!") + + if(!toner_cartridge) break - addtimer(copy_cb, i SECONDS) - addtimer(CALLBACK(src, PROC_REF(reset_busy)), i SECONDS) -/** - * Sets busy to `FALSE`. Created as a proc so it can be used in callbacks. - */ + // arguments to copy_cb have been set at callback instantiation + var/atom/movable/copied_obj = copy_cb.Invoke() + if(isnull(copied_obj)) // something went wrong, so other copies will go wrong too + break + + playsound(src, 'sound/machines/printer.ogg', 50, vary = FALSE) + sleep(4 SECONDS) + + // reveal our copied item + copied_obj.forceMove(drop_location()) + give_pixel_offset(copied_obj) + copies_left-- + + copies_left = 0 + reset_busy() + +/// Sets busy to `FALSE`. /obj/machinery/photocopier/proc/reset_busy() update_use_power(IDLE_POWER_USE) busy = FALSE +/// Determines if the printer is currently busy, informs the user if it is. /obj/machinery/photocopier/proc/check_busy(mob/user) if(busy) - to_chat(user, span_warning("[src] is currently busy copying something. Please wait until it is finished.")) + balloon_alert(user, "printer is busy!") return TRUE return FALSE - /** * Gives items a random x and y pixel offset, between -10 and 10 for each. * @@ -267,36 +371,65 @@ copied_item.pixel_x = copied_item.base_pixel_x + rand(-10, 10) copied_item.pixel_y = copied_item.base_pixel_y + rand(-10, 10) +/// Gets the total amount of paper this printer has stored. +/obj/machinery/photocopier/proc/get_paper_count() + return length(paper_stack) + starting_paper + +/** + * Returns an empty paper, used for blanks and paper copies. + * Prioritizes `paper_stack`, creates new paper in case `paper_stack` is empty. + */ +/obj/machinery/photocopier/proc/get_empty_paper() + var/obj/item/paper/new_paper = pop(paper_stack) + if(new_paper == null && starting_paper > 0) + new_paper = new /obj/item/paper + starting_paper-- + return new_paper + +/** + * Removes an amount of paper from the printer's storage. + * This lets us pretend we actually consumed paper when we were actually printing something that wasn't paper. + */ +/obj/machinery/photocopier/proc/delete_paper(number) + if(number > get_paper_count()) + CRASH("Trying to delete more paper than is stored in the photocopier") + for(var/i in 1 to number) + var/to_delete = pop(paper_stack) + if(to_delete) + qdel(to_delete) + else + starting_paper-- + /** * Handles the copying of paper. Transfers all the text, stamps and so on from the old paper, to the copy. * * Checks first if `paper_copy` exists. Since this proc is called from a timer, it's possible that it was removed. */ /obj/machinery/photocopier/proc/make_paper_copy(obj/item/paper/paper_copy) - if(!paper_copy || !toner_cartridge) - return - - var/copy_colour = toner_cartridge.charges > 10 ? COLOR_FULL_TONER_BLACK : COLOR_GRAY; + if(isnull(paper_copy)) + return null - var/obj/item/paper/copied_paper = paper_copy.copy(/obj/item/paper, loc, FALSE, copy_colour) + var/obj/item/paper/empty_paper = get_empty_paper() + toner_cartridge.charges -= PAPER_TONER_USE - give_pixel_offset(copied_paper) + var/copy_colour = get_toner_color() + var/obj/item/paper/copied_paper = paper_copy.copy(empty_paper, src, FALSE, copy_colour) copied_paper.name = paper_copy.name - - toner_cartridge.charges -= PAPER_TONER_USE + return copied_paper /** * Handles the copying of photos, which can be printed in either color or greyscale. * - * Checks first if `photo_copy` exists. Since this proc is called from a timer, it's possible that it was removed. + * Checks first if `picture` exists. Since this proc is called from a timer, it's possible that it was removed. */ -/obj/machinery/photocopier/proc/make_photo_copy(obj/item/photo/photo_copy) - if(!photo_copy || !toner_cartridge) - return - var/obj/item/photo/copied_pic = new(loc, photo_copy.picture.Copy(color_mode == PHOTO_GREYSCALE ? TRUE : FALSE)) - give_pixel_offset(copied_pic) +/obj/machinery/photocopier/proc/make_photo_copy(datum/picture/photo, photo_color) + if(isnull(photo)) + return null + var/obj/item/photo/copied_pic = new(src, photo.Copy(photo_color == PHOTO_GREYSCALE ? TRUE : FALSE)) + delete_paper(PHOTO_PAPER_USE) toner_cartridge.charges -= PHOTO_TONER_USE + return copied_pic /** * Handles the copying of documents. @@ -304,11 +437,12 @@ * Checks first if `document_copy` exists. Since this proc is called from a timer, it's possible that it was removed. */ /obj/machinery/photocopier/proc/make_document_copy(obj/item/documents/document_copy) - if(!document_copy || !toner_cartridge) - return - var/obj/item/documents/photocopy/copied_doc = new(loc, document_copy) - give_pixel_offset(copied_doc) + if(isnull(document_copy)) + return null + var/obj/item/documents/photocopy/copied_doc = new(src, document_copy) + delete_paper(DOCUMENT_PAPER_USE) toner_cartridge.charges -= DOCUMENT_TONER_USE + return copied_doc /** * Handles the copying of documents. @@ -317,31 +451,33 @@ * Copies the stamp from a given piece of paperwork if it is already stamped, allowing for you to sell photocopied paperwork at the risk of losing budget money. */ /obj/machinery/photocopier/proc/make_paperwork_copy(obj/item/paperwork/paperwork_copy) - if(!paperwork_copy || !toner_cartridge) - return - var/obj/item/paperwork/photocopy/copied_paperwork = new(loc, paperwork_copy) + if(isnull(paperwork_copy)) + return null + var/obj/item/paperwork/photocopy/copied_paperwork = new(src, paperwork_copy) copied_paperwork.copy_stamp_info(paperwork_copy) if(paperwork_copy.stamped) copied_paperwork.stamp_icon = "paper_stamp-pc" //Override with the photocopy overlay sprite copied_paperwork.add_stamp() - give_pixel_offset(copied_paperwork) + delete_paper(PAPERWORK_PAPER_USE) toner_cartridge.charges -= PAPERWORK_TONER_USE + return copied_paperwork -/** - * The procedure is called when printing a blank to write off toner consumption. - */ -/obj/machinery/photocopier/proc/make_blank_print(params) - if(!toner_cartridge) - return - var/obj/item/paper/printblank = new(loc) - var/printname = sanitize(params["name"]) +/// Handles the copying of blanks. No mutating state, so this should not fail. +/obj/machinery/photocopier/proc/make_blank_print(list/blank) + var/copy_colour = get_toner_color() + var/obj/item/paper/printblank = get_empty_paper() + + var/printname = blank["name"] var/list/printinfo - for(var/infoline in params["info"]) + for(var/infoline in blank["info"]) printinfo += infoline - printblank.name = printname - printblank.add_raw_text(printinfo) + + printblank.name = "paper - '[printname]'" + printblank.add_raw_text(printinfo, color = copy_colour) printblank.update_appearance() + toner_cartridge.charges -= PAPER_TONER_USE + return printblank /** * Handles the copying of an ass photo. @@ -350,12 +486,8 @@ * Additionally checks that the mob has their clothes off. */ /obj/machinery/photocopier/proc/make_ass_copy(mob/user) - if(!check_ass() || !toner_cartridge) - return - if(ishuman(ass) && (ass.get_item_by_slot(ITEM_SLOT_ICLOTHING) || ass.get_item_by_slot(ITEM_SLOT_OCLOTHING))) - to_chat(user, span_notice("You feel kind of silly, copying [ass == user ? "your" : ass][ass == user ? "" : "\'s"] ass with [ass == user ? "your" : "[ass.p_their()]"] clothes on.") ) - return - + if(!check_ass()) + return null var/icon/temp_img if(ishuman(ass)) var/mob/living/carbon/human/H = ass @@ -371,25 +503,14 @@ else if(isdrone(ass)) //Drones are hot temp_img = icon('icons/ass/assdrone.png') - var/obj/item/photo/copied_ass = new /obj/item/photo(loc) + var/obj/item/photo/copied_ass = new /obj/item/photo(src) var/datum/picture/toEmbed = new(name = "[ass]'s Ass", desc = "You see [ass]'s ass on the photo.", image = temp_img) - give_pixel_offset(copied_ass) toEmbed.psize_x = 128 toEmbed.psize_y = 128 copied_ass.set_picture(toEmbed, TRUE, TRUE) + delete_paper(ASS_PAPER_USE) toner_cartridge.charges -= ASS_TONER_USE - -/** - * Inserts the item into the copier. Called in `attackby()` after a human mob clicked on the copier with a paper, photo, or document. - * - * Arugments: - * * object - the object that got inserted. - * * user - the mob that inserted the object. - */ -/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) + return copied_ass /** * Called when someone hits the "remove item" button on the copier UI. @@ -402,11 +523,13 @@ * * user - the user removing the item. */ /obj/machinery/photocopier/proc/remove_photocopy(obj/item/object, mob/user) - if(!issilicon(user)) //surprised this check didn't exist before, putting stuff in AI's hand is bad - object.forceMove(user.loc) - user.put_in_hands(object) - else + if(issilicon(user)) object.forceMove(drop_location()) + return + + object.forceMove(user.loc) + user.put_in_hands(object) + to_chat(user, span_notice("You take [object] out of [src]. [busy ? "The [src] comes to a halt." : ""]")) /obj/machinery/photocopier/wrench_act(mob/living/user, obj/item/tool) @@ -416,18 +539,23 @@ /obj/machinery/photocopier/attackby(obj/item/object, mob/user, params) if(istype(object, /obj/item/paper) || istype(object, /obj/item/photo) || istype(object, /obj/item/documents)) + if(istype(object, /obj/item/paper)) + var/obj/item/paper/paper = object + if(paper.is_empty()) + insert_empty_paper(paper, user) + return insert_copy_object(object, user) else if(istype(object, /obj/item/toner)) if(toner_cartridge) - to_chat(user, span_warning("[src] already has a toner cartridge inserted. Remove that one first.")) + balloon_alert(user, "another cartridge inside!") return object.forceMove(src) toner_cartridge = object - to_chat(user, span_notice("You insert [object] into [src].")) + balloon_alert(user, "cartridge inserted") else if(istype(object, /obj/item/areaeditor/blueprints)) - to_chat(user, span_warning("The Blueprint is too large to put into the copier. You need to find something else to record the document.")) + to_chat(user, span_warning("\The [object] is too large to put into the copier. You need to find something else to record the document.")) else if(istype(object, /obj/item/paperwork)) if(istype(object, /obj/item/paperwork/photocopy)) //No infinite paper chain. You need the original paperwork to make more copies. @@ -435,14 +563,29 @@ else insert_copy_object(object, user) +/// Proc that handles insertion of empty paper, useful for copying later. +/obj/machinery/photocopier/proc/insert_empty_paper(obj/item/paper/paper, mob/user) + if(istype(paper, /obj/item/paper/paperslip)) + return + if(get_paper_count() >= MAX_PAPER_CAPACITY) + balloon_alert(user, "cannot hold more paper!") + return + if(!user.temporarilyRemoveItemFromInventory(paper)) + return + paper_stack += paper + paper.forceMove(src) + balloon_alert(user, "paper inserted") + /obj/machinery/photocopier/proc/insert_copy_object(obj/item/object, mob/user) - if(copier_empty()) - if(!user.temporarilyRemoveItemFromInventory(object)) - return - object_copy = object - do_insertion(object, user) - else - to_chat(user, span_warning("There is already something in [src]!")) + if(!copier_empty()) + balloon_alert(user, "scanner tray occupied!") + return + if(!user.temporarilyRemoveItemFromInventory(object)) + return + object_copy = object + object.forceMove(src) + balloon_alert(user, "copy object inserted") + flick("photocopier1", src) /obj/machinery/photocopier/atom_break(damage_flag) . = ..() @@ -477,10 +620,6 @@ visible_message(span_warning("[object_copy] is shoved out of the way by [ass]!")) object_copy = null -/obj/machinery/photocopier/Exited(atom/movable/gone, direction) - check_ass() // There was potentially a person sitting on the copier, check if they're still there. - return ..() - /** * Checks the living mob `ass` exists and its location is the same as the photocopier. * @@ -557,6 +696,15 @@ charges = 200 max_charges = 200 +#undef PHOTOCOPIER_FEE +#undef BLANKS_FILE_NAME +#undef PAPER_PAPER_USE +#undef PHOTO_PAPER_USE +#undef DOCUMENT_PAPER_USE +#undef ASS_PAPER_USE +#undef PAPERWORK_PAPER_USE +#undef MAX_PAPER_CAPACITY +#undef TONER_CHARGE_LOW_AMOUNT #undef PHOTO_GREYSCALE #undef PHOTO_COLOR #undef PAPER_TONER_USE diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index 342833a7caec5..1a0ce1dc37b80 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -1,8 +1,9 @@ /obj/item/stamp name = "\improper GRANTED rubber stamp" desc = "A rubber stamp for stamping important documents." - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "stamp-ok" + worn_icon_state = "nothing" inhand_icon_state = "stamp" throwforce = 0 w_class = WEIGHT_CLASS_TINY diff --git a/code/modules/paperwork/ticketmachine.dm b/code/modules/paperwork/ticketmachine.dm index c845474f32ece..a5902a9df5a20 100644 --- a/code/modules/paperwork/ticketmachine.dm +++ b/code/modules/paperwork/ticketmachine.dm @@ -3,7 +3,7 @@ /obj/machinery/ticket_machine name = "ticket machine" - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "ticketmachine" base_icon_state = "ticketmachine" desc = "A marvel of bureaucratic engineering encased in an efficient plastic shell. It can be refilled with a hand labeler refill roll and linked to buttons with a multitool." @@ -31,6 +31,7 @@ /obj/machinery/ticket_machine/Initialize(mapload) . = ..() update_appearance() + find_and_hang_on_wall() /obj/machinery/ticket_machine/Destroy() for(var/obj/item/ticket_machine_ticket/ticket in tickets) @@ -54,14 +55,14 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/ticket_machine, 32) if(!multitool_check_buffer(user, I)) //make sure it has a data buffer return var/obj/item/multitool/M = I - M.buffer = src - to_chat(user, span_notice("You store linkage information in [I]'s buffer.")) + M.set_buffer(src) + balloon_alert(user, "saved to multitool buffer") return TRUE -/obj/machinery/ticket_machine/emag_act(mob/user) //Emag the ticket machine to dispense burning tickets, as well as randomize its number to destroy the HoP's mind. +/obj/machinery/ticket_machine/emag_act(mob/user, obj/item/card/emag/emag_card) //Emag the ticket machine to dispense burning tickets, as well as randomize its number to destroy the HoP's mind. if(obj_flags & EMAGGED) - return - to_chat(user, span_warning("You overload [src]'s bureaucratic logic circuitry to its MAXIMUM setting.")) + return FALSE + balloon_alert(user, "bureaucratic nightmare engaged") ticket_number = rand(0,max_number) current_number = ticket_number obj_flags |= EMAGGED @@ -71,11 +72,12 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/ticket_machine, 32) qdel(ticket) tickets.Cut() update_appearance() + return TRUE /obj/item/wallframe/ticket_machine name = "ticket machine frame" desc = "An unmounted ticket machine. Attach it to a wall to use." - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "ticketmachine_off" result_path = /obj/machinery/ticket_machine pixel_shift = 32 @@ -136,7 +138,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/ticket_machine, 32) /// Locate the ticket machine to which we're linked by our ID /obj/item/assembly/control/ticket_machine/proc/find_machine() - for(var/obj/machinery/ticket_machine/ticketsplease in GLOB.machines) + for(var/obj/machinery/ticket_machine/ticketsplease as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/ticket_machine)) if(ticketsplease.id == id) ticket_machine_ref = WEAKREF(ticketsplease) if(ticket_machine_ref) @@ -237,7 +239,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/ticket_machine, 32) /obj/item/ticket_machine_ticket name = "\improper ticket" desc = "A ticket which shows your place in the Head of Personnel's line. Made from Nanotrasen patented NanoPaper®. Though solid, its form seems to shimmer slightly. Feels (and burns) just like the real thing." - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "ticket" maptext_x = 7 maptext_y = 10 diff --git a/code/modules/photography/_pictures.dm b/code/modules/photography/_pictures.dm index 8c949892dbf44..45fa5654ad922 100644 --- a/code/modules/photography/_pictures.dm +++ b/code/modules/photography/_pictures.dm @@ -5,6 +5,8 @@ var/list/mobs_seen = list() /// List of weakrefs pointing at dead mobs that appear in this photo var/list/dead_seen = list() + /// List of strings of face-visible humans in this photo + var/list/names_seen = list() var/caption var/icon/picture_image var/icon/picture_icon @@ -16,7 +18,7 @@ ///Was this image capable of seeing ghosts? var/see_ghosts = CAMERA_NO_GHOSTS -/datum/picture/New(name, desc, mobs_spotted, dead_spotted, image, icon, size_x, size_y, bp, caption_, autogenerate_icon, can_see_ghosts) +/datum/picture/New(name, desc, mobs_spotted, dead_spotted, names, image, icon, size_x, size_y, bp, caption_, autogenerate_icon, can_see_ghosts) if(!isnull(name)) picture_name = name if(!isnull(desc)) @@ -27,6 +29,9 @@ if(!isnull(dead_spotted)) for(var/mob/seen as anything in dead_spotted) dead_seen += WEAKREF(seen) + if(!isnull(names)) + for(var/seen in names) + names_seen += seen if(!isnull(image)) picture_image = image if(!isnull(icon)) diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index 1a8f1cc2179d9..b168aaf54daf8 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -187,13 +187,15 @@ var/list/turfs = list() var/list/mobs = list() var/blueprints = FALSE - var/clone_area = SSmapping.RequestBlockReservation(size_x * 2 + 1, size_y * 2 + 1) + var/clone_area = SSmapping.request_turf_block_reservation(size_x * 2 + 1, size_y * 2 + 1, 1) + ///list of human names taken on picture + var/list/names = list() var/width = size_x * 2 + 1 var/height = size_y * 2 + 1 for(var/turf/placeholder as anything in CORNER_BLOCK_OFFSET(target_turf, width, height, -size_x, -size_y)) while(istype(placeholder, /turf/open/openspace)) //Multi-z photography - placeholder = SSmapping.get_turf_below(placeholder) + placeholder = GET_TURF_BELOW(placeholder) if(!placeholder) break @@ -218,8 +220,11 @@ var/icon/get_icon = camera_get_icon(turfs, target_turf, psize_x, psize_y, clone_area, size_x, size_y, (size_x * 2 + 1), (size_y * 2 + 1)) qdel(clone_area) get_icon.Blend("#000", ICON_UNDERLAY) + for(var/mob/living/carbon/human/person in mobs) + if(person.is_face_visible()) + names += "[person.name]" - var/datum/picture/picture = new("picture", desc.Join(" "), mobs_spotted, dead_spotted, get_icon, null, psize_x, psize_y, blueprints, can_see_ghosts = see_ghosts) + var/datum/picture/picture = new("picture", desc.Join(" "), mobs_spotted, dead_spotted, names, get_icon, null, psize_x, psize_y, blueprints, can_see_ghosts = see_ghosts) after_picture(user, picture) SEND_SIGNAL(src, COMSIG_CAMERA_IMAGE_CAPTURED, target, user) blending = FALSE diff --git a/code/modules/photography/camera/camera_image_capturing.dm b/code/modules/photography/camera/camera_image_capturing.dm index 6b48e29da52ed..d928164ff014d 100644 --- a/code/modules/photography/camera/camera_image_capturing.dm +++ b/code/modules/photography/camera/camera_image_capturing.dm @@ -16,13 +16,14 @@ var/wipe_atoms = FALSE if(istype(clone_area) && total_x == clone_area.width && total_y == clone_area.height && size_x >= 0 && size_y > 0) - var/cloned_center_x = round(clone_area.bottom_left_coords[1] + ((total_x - 1) / 2)) - var/cloned_center_y = round(clone_area.bottom_left_coords[2] + ((total_y - 1) / 2)) + var/turf/bottom_left = clone_area.bottom_left_turfs[1] + var/cloned_center_x = round(bottom_left.x + ((total_x - 1) / 2)) + var/cloned_center_y = round(bottom_left.y + ((total_y - 1) / 2)) for(var/t in turfs) var/turf/T = t var/offset_x = T.x - center.x var/offset_y = T.y - center.y - var/turf/newT = locate(cloned_center_x + offset_x, cloned_center_y + offset_y, clone_area.bottom_left_coords[3]) + var/turf/newT = locate(cloned_center_x + offset_x, cloned_center_y + offset_y, bottom_left.z) if(!(newT in clone_area.reserved_turfs)) //sanity check so we don't overwrite other areas somehow continue atoms += new /obj/effect/appearance_clone(newT, T) @@ -34,7 +35,7 @@ atoms += new /obj/effect/appearance_clone(newT, A) skip_normal = TRUE wipe_atoms = TRUE - center = locate(cloned_center_x, cloned_center_y, clone_area.bottom_left_coords[3]) + center = locate(cloned_center_x, cloned_center_y, bottom_left.z) if(!skip_normal) for(var/i in turfs) diff --git a/code/modules/photography/camera/silicon_camera.dm b/code/modules/photography/camera/silicon_camera.dm index 836ecc2690a16..9cdbee1bc2b7a 100644 --- a/code/modules/photography/camera/silicon_camera.dm +++ b/code/modules/photography/camera/silicon_camera.dm @@ -1,23 +1,47 @@ /obj/item/camera/siliconcam name = "silicon photo camera" - var/in_camera_mode = FALSE + resistance_flags = INDESTRUCTIBLE + /// List of all pictures taken by this camera. var/list/datum/picture/stored = list() -/obj/item/camera/siliconcam/ai_camera - name = "AI photo camera" - flash_enabled = FALSE +/// Checks if we can take a picture at this moment. Returns TRUE if we can, FALSE if we can't. +/obj/item/camera/siliconcam/proc/can_take_picture(mob/living/silicon/clicker) + if(clicker.stat != CONSCIOUS || clicker.incapacitated()) + return FALSE + return TRUE + +/obj/item/camera/siliconcam/proc/InterceptClickOn(mob/living/silicon/clicker, params, atom/clicked_on) + if(!can_take_picture(clicker)) + return + clicker.face_atom(clicked_on) + captureimage(clicked_on, clicker) + toggle_camera_mode(clicker, sound = FALSE) +/// Toggles the camera mode on or off. +/// If sound is TRUE, plays a sound effect and displays a message on successful toggle /obj/item/camera/siliconcam/proc/toggle_camera_mode(mob/user, sound = TRUE) - in_camera_mode = !in_camera_mode + if(user.click_intercept == src) + user.click_intercept = null + + else if(isnull(user.click_intercept)) + user.click_intercept = src + + else + // Trying to turn on camera mode while you have another click intercept active, such as malf abilities + if(sound) + balloon_alert(user, "can't enable camera mode!") + playsound(user, 'sound/machines/buzz-sigh.ogg', 25, TRUE) + return + if(sound) - playsound(src, 'sound/items/wirecutter.ogg', 50, TRUE) - to_chat(user, span_notice("Camera mode: [in_camera_mode ? "Activated" : "Deactivated"].")) + playsound(user, 'sound/items/wirecutter.ogg', 50, TRUE) + balloon_alert(user, "camera mode [user.click_intercept == src ? "activated" : "deactivated"]") /obj/item/camera/siliconcam/proc/selectpicture(mob/user) RETURN_TYPE(/datum/picture) if(!length(stored)) - to_chat(user, span_notice("ERROR: No stored photos located.")) + user.balloon_alert(user, "no stored photos!") return var/list/nametemp = list() var/list/temp = list() @@ -25,9 +49,7 @@ nametemp += stored_photo.picture_name temp[stored_photo.picture_name] = stored_photo var/find = tgui_input_list(user, "Select image", "Storage", nametemp) - if(isnull(find)) - return - if(isnull(temp[find])) + if(isnull(find) || isnull(temp[find])) return return temp[find] @@ -36,48 +58,70 @@ if(istype(selection)) show_picture(user, selection) +/obj/item/camera/siliconcam/ai_camera + name = "AI photo camera" + flash_enabled = FALSE + +/obj/item/camera/siliconcam/ai_camera/can_take_picture(mob/living/silicon/ai/clicker) + if(clicker.control_disabled) + return FALSE + return ..() + +/obj/item/camera/siliconcam/ai_camera/balloon_alert(mob/viewer, text) + if(isAI(loc)) + // redirects balloon alerts on us to balloon alerts on our ai eye + var/mob/living/silicon/ai/ai = loc + return ai.eyeobj.balloon_alert(viewer, text) + + return ..() + /obj/item/camera/siliconcam/ai_camera/after_picture(mob/user, datum/picture/picture) var/number = length(stored) picture.picture_name = "Image [number] (taken by [loc.name])" stored[picture] = TRUE - to_chat(user, span_notice("Image recorded.")) + balloon_alert(user, "image recorded") + user.playsound_local(get_turf(user), pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 50, TRUE, -3) /obj/item/camera/siliconcam/robot_camera name = "Cyborg photo camera" var/printcost = 2 -/obj/item/camera/siliconcam/robot_camera/after_picture(mob/user, datum/picture/picture) - var/mob/living/silicon/robot/C = loc - if(istype(C) && istype(C.connected_ai)) - var/number = C.connected_ai.aicamera.stored.len +/obj/item/camera/siliconcam/robot_camera/can_take_picture(mob/living/silicon/robot/clicker) + if(clicker.lockcharge) + return FALSE + return ..() + +/obj/item/camera/siliconcam/robot_camera/after_picture(mob/living/silicon/robot/user, datum/picture/picture) + if(istype(user) && istype(user.connected_ai)) + var/number = user.connected_ai.aicamera.stored.len picture.picture_name = "Image [number] (taken by [loc.name])" - C.connected_ai.aicamera.stored[picture] = TRUE - to_chat(usr, span_notice("Image recorded and saved to remote database.")) + user.connected_ai.aicamera.stored[picture] = TRUE + balloon_alert(user, "image recorded and uploaded") else var/number = stored.len picture.picture_name = "Image [number] (taken by [loc.name])" stored[picture] = TRUE - to_chat(usr, span_notice("Image recorded and saved to local storage. Upload will happen automatically if unit is lawsynced.")) + balloon_alert(user, "image recorded and saved locally") + playsound(src, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 75, TRUE, -3) -/obj/item/camera/siliconcam/robot_camera/selectpicture(mob/user) - var/mob/living/silicon/robot/R = loc - if(istype(R) && R.connected_ai) - R.picturesync() - return R.connected_ai.aicamera.selectpicture(user) - else - return ..() +/obj/item/camera/siliconcam/robot_camera/selectpicture(mob/living/silicon/robot/user) + if(istype(user) && user.connected_ai) + user.picturesync() + return user.connected_ai.aicamera.selectpicture(user) + return ..() -/obj/item/camera/siliconcam/robot_camera/proc/borgprint(mob/user) - var/mob/living/silicon/robot/C = loc - if(!istype(C) || C.toner < 20) - to_chat(user, span_warning("Insufficent toner to print image.")) +/obj/item/camera/siliconcam/robot_camera/proc/borgprint(mob/living/silicon/robot/user) + if(!istype(user) || user.toner < printcost) + balloon_alert(user, "not enough toner!") return var/datum/picture/selection = selectpicture(user) if(!istype(selection)) - to_chat(user, span_warning("Invalid Image.")) + balloon_alert(user, "invalid image!") return - var/obj/item/photo/p = new /obj/item/photo(C.loc, selection) - p.pixel_x = p.base_pixel_x + rand(-10, 10) - p.pixel_y = p.base_pixel_y + rand(-10, 10) - C.toner -= printcost //All fun allowed. - user.visible_message(span_notice("[C.name] spits out a photograph from a narrow slot on its chassis."), span_notice("You print a photograph.")) + var/obj/item/photo/printed = new(user.drop_location(), selection) + printed.pixel_x = printed.base_pixel_x + rand(-10, 10) + printed.pixel_y = printed.base_pixel_y + rand(-10, 10) + user.toner -= printcost //All fun allowed. + user.visible_message(span_notice("[user.name] spits out a photograph from a narrow slot on its chassis."), span_notice("You print a photograph.")) + balloon_alert(user, "photograph printed") + playsound(src, 'sound/items/taperecorder/taperecorder_print.ogg', 50, TRUE, -3) diff --git a/code/modules/photography/photos/album.dm b/code/modules/photography/photos/album.dm index 215b523ef636b..35d7f27017cdb 100644 --- a/code/modules/photography/photos/album.dm +++ b/code/modules/photography/photos/album.dm @@ -122,3 +122,8 @@ /obj/item/storage/photo_album/personal icon_state = "album_green" + +/obj/item/storage/photo_album/hall_of_fame + name = "photo album (Hall of Fame)" + icon_state = "album_red" + persistence_id = "hall_of_fame" diff --git a/code/modules/photography/photos/frame.dm b/code/modules/photography/photos/frame.dm index d5ce0d6654759..c42664af269d9 100644 --- a/code/modules/photography/photos/frame.dm +++ b/code/modules/photography/photos/frame.dm @@ -262,6 +262,19 @@ /obj/structure/sign/picture_frame/showroom/four persistence_id = "frame_showroom4" +// for the hall of fame escape shuttle +/obj/structure/sign/picture_frame/hall_of_fame/one + persistence_id = "frame_hall_of_fame_1" + +/obj/structure/sign/picture_frame/hall_of_fame/two + persistence_id = "frame_hall_of_fame_2" + +/obj/structure/sign/picture_frame/hall_of_fame/three + persistence_id = "frame_hall_of_fame_3" + +/obj/structure/sign/picture_frame/hall_of_fame/four + persistence_id = "frame_hall_of_fame_4" + /obj/structure/sign/picture_frame/portrait/bar persistence_id = "frame_bar" del_id_on_destroy = TRUE diff --git a/code/modules/photography/photos/photo.dm b/code/modules/photography/photos/photo.dm index 7af4c546cff8e..b34ff459c0075 100644 --- a/code/modules/photography/photos/photo.dm +++ b/code/modules/photography/photos/photo.dm @@ -43,6 +43,7 @@ if(!isobserver(seen)) continue set_custom_materials(list(/datum/material/hauntium =SHEET_MATERIAL_AMOUNT)) + grind_results = list(/datum/reagent/hauntium = 20) break /obj/item/photo/update_icon_state() @@ -53,11 +54,11 @@ icon = I return ..() -/obj/item/photo/suicide_act(mob/living/carbon/user) +/obj/item/photo/suicide_act(mob/living/carbon/human/user) user.visible_message(span_suicide("[user] is taking one last look at \the [src]! It looks like [user.p_theyre()] giving in to death!"))//when you wanna look at photo of waifu one last time before you die... - if (user.gender == MALE) + if (!ishuman(user) || user.physique == MALE) playsound(user, 'sound/voice/human/manlaugh1.ogg', 50, TRUE)//EVERY TIME I DO IT MAKES ME LAUGH - else if (user.gender == FEMALE) + else playsound(user, 'sound/voice/human/womanlaugh.ogg', 50, TRUE) return OXYLOSS diff --git a/code/modules/plumbing/ducts.dm b/code/modules/plumbing/ducts.dm index d887df951bd51..33073ae910f1f 100644 --- a/code/modules/plumbing/ducts.dm +++ b/code/modules/plumbing/ducts.dm @@ -5,7 +5,7 @@ All the important duct code: */ /obj/machinery/duct name = "fluid duct" - icon = 'icons/obj/plumbing/fluid_ducts.dmi' + icon = 'icons/obj/pipes_n_cables/hydrochem/fluid_ducts.dmi' icon_state = "nduct" layer = PLUMBING_PIPE_VISIBILE_LAYER use_power = NO_POWER_USE @@ -86,7 +86,7 @@ All the important duct code: ///connect to a duct /obj/machinery/duct/proc/connect_duct(obj/machinery/duct/other, direction) - var/opposite_dir = turn(direction, 180) + var/opposite_dir = REVERSE_DIR(direction) if(!active || !other.active) return @@ -128,7 +128,7 @@ All the important duct code: ///connect to a plumbing object /obj/machinery/duct/proc/connect_plumber(datum/component/plumbing/plumbing, direction) - var/opposite_dir = turn(direction, 180) + var/opposite_dir = REVERSE_DIR(direction) if(!(duct_layer & plumbing.ducting_layer)) return FALSE @@ -182,7 +182,7 @@ All the important duct code: if(!(other in neighbours)) neighbours[other] = direction if(!(src in other.neighbours)) - other.neighbours[src] = turn(direction, 180) + other.neighbours[src] = REVERSE_DIR(direction) ///remove all our neighbours, and remove us from our neighbours aswell /obj/machinery/duct/proc/lose_neighbours() @@ -212,7 +212,7 @@ All the important duct code: for(var/direction in GLOB.cardinals) if(direction & connects) for(var/obj/machinery/duct/other in get_step(src, direction)) - if((turn(direction, 180) & other.connects) && other.active) + if((REVERSE_DIR(direction) & other.connects) && other.active) adjacents += other return adjacents @@ -323,7 +323,7 @@ All the important duct code: name = "stack of duct" desc = "A stack of fluid ducts." singular_name = "duct" - icon = 'icons/obj/plumbing/fluid_ducts.dmi' + icon = 'icons/obj/pipes_n_cables/hydrochem/fluid_ducts.dmi' icon_state = "ducts" mats_per_unit = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*5) w_class = WEIGHT_CLASS_TINY diff --git a/code/modules/plumbing/plumbers/_plumb_machinery.dm b/code/modules/plumbing/plumbers/_plumb_machinery.dm index bce4fcc1e3e80..be75cf20479dc 100644 --- a/code/modules/plumbing/plumbers/_plumb_machinery.dm +++ b/code/modules/plumbing/plumbers/_plumb_machinery.dm @@ -5,7 +5,7 @@ */ /obj/machinery/plumbing name = "pipe thing" - icon = 'icons/obj/plumbing/plumbers.dmi' + icon = 'icons/obj/pipes_n_cables/hydrochem/plumbers.dmi' icon_state = "pump" density = TRUE idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 7.5 @@ -14,8 +14,6 @@ var/buffer = 50 ///Flags for reagents, like INJECTABLE, TRANSPARENT bla bla everything thats in DEFINES/reagents.dm var/reagent_flags = TRANSPARENT - ///category for plumbing RCD - var/category = "" /obj/machinery/plumbing/Initialize(mapload, bolt = TRUE) . = ..() @@ -47,7 +45,7 @@ . = ..() if(anchored) to_chat(user, span_warning("The [name] needs to be unbolted to do that!")) - if(I.tool_start_check(user, amount=0)) + if(I.tool_start_check(user, amount=1)) to_chat(user, span_notice("You start slicing the [name] apart.")) if(I.use_tool(src, user, (1.5 SECONDS), volume=50)) deconstruct(TRUE) @@ -61,8 +59,6 @@ icon_state = "pipe_input" pass_flags_self = PASSMACHINE | LETPASSTHROW // Small reagent_flags = TRANSPARENT | REFILLABLE - ///category for plumbing RCD - category="Distribution" /obj/machinery/plumbing/input/Initialize(mapload, bolt, layer) @@ -76,9 +72,6 @@ icon_state = "pipe_output" pass_flags_self = PASSMACHINE | LETPASSTHROW // Small reagent_flags = TRANSPARENT | DRAINABLE - ///category for plumbing service rcd - category="Distribution" - /obj/machinery/plumbing/output/Initialize(mapload, bolt, layer) . = ..() @@ -88,30 +81,23 @@ name = "drinking tap" desc = "A manual output for plumbing systems, for taking drinks directly into glasses." icon_state = "tap_output" - ///category for plumbing RCD - category = "Distribution" /obj/machinery/plumbing/tank name = "chemical tank" desc = "A massive chemical holding tank." icon_state = "tank" buffer = 400 - ///category for plumbing RCD - category="Storage" /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 - ///category for plumbing service rcd - category="Distribution" /obj/machinery/plumbing/layer_manifold/Initialize(mapload, bolt, layer) . = ..() diff --git a/code/modules/plumbing/plumbers/acclimator.dm b/code/modules/plumbing/plumbers/acclimator.dm index a256413be571f..da5c4529a4230 100644 --- a/code/modules/plumbing/plumbers/acclimator.dm +++ b/code/modules/plumbing/plumbers/acclimator.dm @@ -12,8 +12,6 @@ base_icon_state = "acclimator" buffer = 200 active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - ///category for plumbing RCD - category="Storage" ///towards wich temperature do we build? var/target_temperature = 300 diff --git a/code/modules/plumbing/plumbers/bottler.dm b/code/modules/plumbing/plumbers/bottler.dm index 219accbc3b517..7ce4c2f55765d 100644 --- a/code/modules/plumbing/plumbers/bottler.dm +++ b/code/modules/plumbing/plumbers/bottler.dm @@ -8,8 +8,6 @@ reagent_flags = TRANSPARENT | DRAINABLE buffer = 100 active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - ///category for plumbing RCD - category="Storage" ///how much do we fill var/wanted_amount = 10 @@ -87,15 +85,15 @@ 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) + reagents.trans_to(B, wanted_amount, transferred_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) + reagents.trans_to(AM, wanted_amount, transferred_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) + reagents.trans_to(AM, wanted_amount, transferred_by = src, methods = INJECT) return diff --git a/code/modules/plumbing/plumbers/destroyer.dm b/code/modules/plumbing/plumbers/destroyer.dm index 082a1fe2fa3e3..de03f03aa0f69 100644 --- a/code/modules/plumbing/plumbers/destroyer.dm +++ b/code/modules/plumbing/plumbers/destroyer.dm @@ -4,8 +4,6 @@ icon_state = "disposal" pass_flags_self = PASSMACHINE | LETPASSTHROW // Small active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - ///category for plumbing RCD - category="Synthesizers" ///we remove 5 reagents per second var/disposal_rate = 5 diff --git a/code/modules/plumbing/plumbers/fermenter.dm b/code/modules/plumbing/plumbers/fermenter.dm index eccbc382eae2c..0fd631ca45733 100644 --- a/code/modules/plumbing/plumbers/fermenter.dm +++ b/code/modules/plumbing/plumbers/fermenter.dm @@ -4,13 +4,9 @@ icon_state = "fermenter" layer = ABOVE_ALL_MOB_LAYER plane = ABOVE_GAME_PLANE - - reagent_flags = TRANSPARENT | DRAINABLE buffer = 400 active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - ///category for plumbing RCD - category="Synthesizers" ///input dir var/eat_dir = SOUTH diff --git a/code/modules/plumbing/plumbers/filter.dm b/code/modules/plumbing/plumbers/filter.dm index a085c2550704a..4e4a282bd1dcd 100644 --- a/code/modules/plumbing/plumbers/filter.dm +++ b/code/modules/plumbing/plumbers/filter.dm @@ -4,8 +4,6 @@ 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 - ///category for plumbing RCD - category="Distribution" ///whitelist of chems id's that go to the left side. Empty to disable port var/list/left = list() diff --git a/code/modules/plumbing/plumbers/grinder_chemical.dm b/code/modules/plumbing/plumbers/grinder_chemical.dm index fcc5037c18f5f..e70977bc1f445 100644 --- a/code/modules/plumbing/plumbers/grinder_chemical.dm +++ b/code/modules/plumbing/plumbers/grinder_chemical.dm @@ -1,6 +1,6 @@ /obj/machinery/plumbing/grinder_chemical name = "chemical grinder" - desc = "chemical grinder." + desc = "Chemical grinder. Can either grind or juice stuff you put in." icon_state = "grinder_chemical" layer = ABOVE_ALL_MOB_LAYER plane = ABOVE_GAME_PLANE @@ -8,9 +8,6 @@ reagent_flags = TRANSPARENT | DRAINABLE buffer = 400 active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - var/eat_dir = SOUTH - ///category for plumbing RCD - category="Synthesizers" /obj/machinery/plumbing/grinder_chemical/Initialize(mapload, bolt, layer) . = ..() @@ -20,21 +17,35 @@ ) AddElement(/datum/element/connect_loc, loc_connections) -/obj/machinery/plumbing/grinder_chemical/setDir(newdir) - . = ..() - eat_dir = newdir +/obj/machinery/plumbing/grinder_chemical/attackby(obj/item/weapon, mob/user, params) + if(istype(weapon, /obj/item/storage/bag)) + to_chat(user, span_notice("You dump items from [weapon] into the grinder.")) + for(var/obj/item/obj_item in weapon.contents) + grind(obj_item) + else + to_chat(user, span_notice("You attempt to grind [weapon].")) + grind(weapon) + + return TRUE /obj/machinery/plumbing/grinder_chemical/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(!anchored) return - if(border_dir == eat_dir) - return TRUE + if(!istype(mover, /obj/item)) + return FALSE + return TRUE /obj/machinery/plumbing/grinder_chemical/proc/on_entered(datum/source, atom/movable/AM) SIGNAL_HANDLER + grind(AM) +/** + * Grinds/Juices the atom + * Arguments + * * [AM][atom] - the atom to grind or juice + */ /obj/machinery/plumbing/grinder_chemical/proc/grind(atom/AM) if(machine_stat & NOPOWER) return @@ -42,19 +53,14 @@ return if(!isitem(AM)) return + var/obj/item/I = AM - if(I.juice_results || I.grind_results) + var/result + if(I.grind_results || I.juice_typepath) 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) + if(I.grind_results) + result = I.grind(reagents, usr) + else if (I.juice_typepath) + result = I.juice(reagents, usr) + if(result) 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 index c8eed1e3d78a7..df6a627b10359 100644 --- a/code/modules/plumbing/plumbers/pill_press.dm +++ b/code/modules/plumbing/plumbers/pill_press.dm @@ -4,15 +4,13 @@ desc = "A press that makes pills, patches and bottles." icon_state = "pill_press" active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - ///category for plumbing RCD - category="Storage" ///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 + var/max_bottle_volume = 50 ///current operating product (pills or patches) var/product = "pill" ///the minimum size a pill or patch can be diff --git a/code/modules/plumbing/plumbers/plumbing_buffer.dm b/code/modules/plumbing/plumbers/plumbing_buffer.dm index dd9b63e34f62c..b2bb21bc24e36 100644 --- a/code/modules/plumbing/plumbers/plumbing_buffer.dm +++ b/code/modules/plumbing/plumbers/plumbing_buffer.dm @@ -8,8 +8,6 @@ icon_state = "buffer" pass_flags_self = PASSMACHINE | LETPASSTHROW // It looks short enough. buffer = 200 - ///category for plumbing RCD - category="Synthesizers" var/datum/buffer_net/buffer_net var/activation_volume = 100 diff --git a/code/modules/plumbing/plumbers/pumps.dm b/code/modules/plumbing/plumbers/pumps.dm index 4176630de6d98..79374fcf38c93 100644 --- a/code/modules/plumbing/plumbers/pumps.dm +++ b/code/modules/plumbing/plumbers/pumps.dm @@ -2,14 +2,12 @@ /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 = 'icons/obj/pipes_n_cables/hydrochem/plumbers.dmi' icon_state = "pump" base_icon_state = "pump" anchored = FALSE density = TRUE use_power = NO_POWER_USE - ///category for plumbing RCD - category="Synthesizers" ///units we pump per second var/pump_power = 1 diff --git a/code/modules/plumbing/plumbers/reaction_chamber.dm b/code/modules/plumbing/plumbers/reaction_chamber.dm index 5b5985c533428..36320f18184fe 100644 --- a/code/modules/plumbing/plumbers/reaction_chamber.dm +++ b/code/modules/plumbing/plumbers/reaction_chamber.dm @@ -1,5 +1,8 @@ ///a reaction chamber for plumbing. pretty much everything can react, but this one keeps the reagents separated and only reacts under your given terms +/// coefficient to convert temperature to joules. same lvl as acclimator +#define HEATER_COEFFICIENT 0.05 + /obj/machinery/plumbing/reaction_chamber name = "mixing chamber" desc = "Keeps chemicals separated until given conditions are met." @@ -7,8 +10,6 @@ buffer = 200 reagent_flags = TRANSPARENT | NO_REACT active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - ///category for plumbing RCD - category="Synthesizers" /** * list of set reagents that the reaction_chamber allows in, and must all be present before mixing is enabled. @@ -21,9 +22,6 @@ ///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 - /obj/machinery/plumbing/reaction_chamber/Initialize(mapload, bolt, layer) . = ..() @@ -37,30 +35,48 @@ /// 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_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 + + if(!holder.total_volume && emptying) //we were emptying, but now we aren't emptying = FALSE holder.flags |= NO_REACT return NONE /obj/machinery/plumbing/reaction_chamber/process(seconds_per_tick) - if(!emptying || reagents.is_reacting) //suspend heating/cooling during emptying phase - reagents.adjust_thermal_energy((target_temperature - reagents.chem_temp) * heater_coefficient * seconds_per_tick * SPECIFIC_HEAT_DEFAULT * reagents.total_volume) //keep constant with chem heater + //half the power for getting reagents in + var/power_usage = active_power_usage * 0.5 + + if(!emptying || reagents.is_reacting) + //do reactions and stuff reagents.handle_reactions() - use_power(active_power_usage * seconds_per_tick) + //adjust temperature of final solution + var/temp_diff = target_temperature - reagents.chem_temp + if(abs(temp_diff) > 0.01) //if we are not close enough keep going + reagents.adjust_thermal_energy(temp_diff * HEATER_COEFFICIENT * seconds_per_tick * SPECIFIC_HEAT_DEFAULT * reagents.total_volume) //keep constant with chem heater + + //do other stuff with final solution + handle_reagents(seconds_per_tick) + + //full power for doing reactions + power_usage *= 2 + + use_power(power_usage * seconds_per_tick) + +///For subtypes that want to do additional reagent handling +/obj/machinery/plumbing/reaction_chamber/proc/handle_reagents(seconds_per_tick) + return /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) + + icon_state = initial(icon_state) + "[use_power != NO_POWER_USE ? "_on" : ""]" /obj/machinery/plumbing/reaction_chamber/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -69,31 +85,29 @@ ui.open() /obj/machinery/plumbing/reaction_chamber/ui_data(mob/user) - var/list/data = list() + . = 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] + reagent_data["volume"] = 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["targetTemp"] = target_temperature - data["isReacting"] = reagents.is_reacting - return data + .["reagents"] = reagents_data + .["emptying"] = emptying + .["temperature"] = round(reagents.chem_temp, 0.1) + .["targetTemp"] = target_temperature + .["isReacting"] = reagents.is_reacting -/obj/machinery/plumbing/reaction_chamber/ui_act(action, params) +/obj/machinery/plumbing/reaction_chamber/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return TRUE - . = FALSE switch(action) if("add") - var/selected_reagent = tgui_input_list(usr, "Select reagent", "Reagent", GLOB.chemical_name_list) + var/selected_reagent = tgui_input_list(ui.user, "Select reagent", "Reagent", GLOB.chemical_name_list) if(!selected_reagent) return TRUE @@ -106,32 +120,41 @@ if(input_amount) required_reagents[input_reagent] = input_amount - . = TRUE + return TRUE if("remove") var/reagent = get_chem_id(params["chem"]) if(reagent) required_reagents.Remove(reagent) - . = TRUE + return TRUE if("temperature") var/target = text2num(params["target"]) if(target != null) - target_temperature=clamp(target, 0, 1000) - .=TRUE + target_temperature = clamp(target, 0, 1000) + return TRUE + + var/result = handle_ui_act(action, params, ui, state) + if(isnull(result)) + result = FALSE + return result + +/// For custom handling of ui actions from inside a subtype +/obj/machinery/plumbing/reaction_chamber/proc/handle_ui_act(action, params, datum/tgui/ui, datum/ui_state/state) + return null ///Chemistry version of reaction chamber that allows for acid and base buffers to be used while reacting /obj/machinery/plumbing/reaction_chamber/chem name = "reaction chamber" - ///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 + var/acidic_limit = 5 + ///If above this pH, we start dumping acid into it + var/alkaline_limit = 9 - ///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 + ///beaker that holds the acidic buffer(50u) var/obj/item/reagent_containers/cup/beaker/acidic_beaker - ///beaker that holds the alkaline buffer. + ///beaker that holds the alkaline buffer(50u). var/obj/item/reagent_containers/cup/beaker/alkaline_beaker /obj/machinery/plumbing/reaction_chamber/chem/Initialize(mapload, bolt, layer) @@ -149,13 +172,27 @@ QDEL_NULL(alkaline_beaker) return ..() -/obj/machinery/plumbing/reaction_chamber/chem/process(seconds_per_tick) - //add acidic/alkaine buffer if over/under limit - if(reagents.is_reacting && reagents.ph < alkaline_limit) - alkaline_beaker.reagents.trans_to(reagents, 1 * seconds_per_tick) - if(reagents.is_reacting && reagents.ph > acidic_limit) - acidic_beaker.reagents.trans_to(reagents, 1 * seconds_per_tick) - ..() +/obj/machinery/plumbing/reaction_chamber/chem/handle_reagents(seconds_per_tick) + while(reagents.ph < acidic_limit || reagents.ph > alkaline_limit) + if(machine_stat & NOPOWER) + return + + /** + * figure out which buffer to transfer to restore balance + * if solution is getting too basic(high ph) add some acid to lower it's value + * else if solution is getting too acidic(low ph) add some base to increase it's value + */ + var/datum/reagents/buffer = reagents.ph > alkaline_limit ? acidic_beaker.reagents : alkaline_beaker.reagents + if(!buffer.total_volume) + return + + //transfer buffer and handle reactions, not a proven math but looks logical + var/transfer_amount = FLOOR((reagents.ph > alkaline_limit ? (reagents.ph - alkaline_limit) : (acidic_limit - reagents.ph)) * seconds_per_tick, CHEMICAL_QUANTISATION_LEVEL) + if(transfer_amount <= CHEMICAL_QUANTISATION_LEVEL || !buffer.trans_to(reagents, transfer_amount)) + return + + //some power for accurate ph balancing + use_power(active_power_usage * 0.2 * seconds_per_tick) /obj/machinery/plumbing/reaction_chamber/chem/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -169,16 +206,16 @@ .["reagentAcidic"] = acidic_limit .["reagentAlkaline"] = alkaline_limit -/obj/machinery/plumbing/reaction_chamber/chem/ui_act(action, params) - . = ..() - if (.) - return +/obj/machinery/plumbing/reaction_chamber/chem/handle_ui_act(action, params, datum/tgui/ui, datum/ui_state/state) + . = TRUE switch(action) if("acidic") - acidic_limit = round(text2num(params["target"])) + acidic_limit = clamp(round(text2num(params["target"])), 0, alkaline_limit) if("alkaline") - alkaline_limit = round(text2num(params["target"])) + alkaline_limit = clamp(round(text2num(params["target"])), acidic_limit + 0.01, 14) + else + return FALSE - return TRUE +#undef HEATER_COEFFICIENT diff --git a/code/modules/plumbing/plumbers/splitters.dm b/code/modules/plumbing/plumbers/splitters.dm index 1b704783c277f..de27922700971 100644 --- a/code/modules/plumbing/plumbers/splitters.dm +++ b/code/modules/plumbing/plumbers/splitters.dm @@ -6,8 +6,6 @@ active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 buffer = 100 density = FALSE - ///category for plumbing RCD - category="Distribution" ///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 diff --git a/code/modules/plumbing/plumbers/synthesizer.dm b/code/modules/plumbing/plumbers/synthesizer.dm index 66d96f7d978e1..a4521dd9b2e5a 100644 --- a/code/modules/plumbing/plumbers/synthesizer.dm +++ b/code/modules/plumbing/plumbers/synthesizer.dm @@ -4,12 +4,9 @@ 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' + icon = 'icons/obj/pipes_n_cables/hydrochem/plumbers.dmi' active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - ///category for plumbing RCD - category="Synthesizers" - ///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 diff --git a/code/modules/plumbing/plumbers/teleporter.dm b/code/modules/plumbing/plumbers/teleporter.dm index 1d18959fc867e..a8e6e7ae3ac55 100644 --- a/code/modules/plumbing/plumbers/teleporter.dm +++ b/code/modules/plumbing/plumbers/teleporter.dm @@ -4,8 +4,6 @@ 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 - ///category for plumbing RCD - category="Distribution" ///whoever we teleport our chems to var/obj/machinery/plumbing/receiver/target = null @@ -74,8 +72,8 @@ return var/obj/item/multitool/M = I - M.buffer = src - to_chat(user, span_notice("You store linkage information in [I]'s buffer.")) + M.set_buffer(src) + balloon_alert(user, "saved to multitool buffer") return TRUE /obj/machinery/plumbing/receiver/process(seconds_per_tick) diff --git a/code/modules/power/apc/apc_attack.dm b/code/modules/power/apc/apc_attack.dm index 178d3fecac5a0..3ff3d640c6240 100644 --- a/code/modules/power/apc/apc_attack.dm +++ b/code/modules/power/apc/apc_attack.dm @@ -61,9 +61,17 @@ balloon_alert(user, "need ten lengths of cable!") return + var/terminal_cable_layer = cable_layer // Default to machine's cable layer + if(LAZYACCESS(params2list(params), RIGHT_CLICK)) + var/choice = tgui_input_list(user, "Select Power Input Cable Layer", "Select Cable Layer", GLOB.cable_name_to_layer) + if(isnull(choice)) + return + terminal_cable_layer = GLOB.cable_name_to_layer[choice] + user.visible_message(span_notice("[user.name] adds cables to the APC frame.")) balloon_alert(user, "adding cables to the frame...") playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) + if(!do_after(user, 20, target = src)) return if(installing_cable.get_amount() < 10 || !installing_cable) @@ -71,13 +79,13 @@ if(terminal || !opened || !has_electronics) return var/turf/our_turf = get_turf(src) - var/obj/structure/cable/cable_node = our_turf.get_cable_node() + var/obj/structure/cable/cable_node = our_turf.get_cable_node(terminal_cable_layer) if(prob(50) && electrocute_mob(usr, cable_node, cable_node, 1, TRUE)) do_sparks(5, TRUE, src) return installing_cable.use(10) balloon_alert(user, "cables added to the frame") - make_terminal() + make_terminal(terminal_cable_layer) terminal.connect_to_network() return @@ -235,7 +243,7 @@ balloon_alert(ethereal, "can't transfer power!") return if(istype(stomach)) - balloon_alert(ethereal, "transfered power") + balloon_alert(ethereal, "transferred power") stomach.adjust_charge(-APC_POWER_GAIN) cell.give(APC_POWER_GAIN) else @@ -263,7 +271,7 @@ /obj/machinery/power/apc/blob_act(obj/structure/blob/B) set_broken() -/obj/machinery/power/apc/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE) +/obj/machinery/power/apc/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armor_penetration = 0) // APC being at 0 integrity doesnt delete it outright. Combined with take_damage this might cause runtimes. if(machine_stat & BROKEN && atom_integrity <= 0) if(sound_effect) diff --git a/code/modules/power/apc/apc_contextual_tips.dm b/code/modules/power/apc/apc_contextual_tips.dm index c748135bbddf5..4fe6458e4eba9 100644 --- a/code/modules/power/apc/apc_contextual_tips.dm +++ b/code/modules/power/apc/apc_contextual_tips.dm @@ -1,7 +1,15 @@ /obj/machinery/power/apc/add_context(atom/source, list/context, obj/item/held_item, mob/user) . = ..() - if (isnull(held_item)) + if(isAI(user) || iscyborg(user)) + context[SCREENTIP_CONTEXT_LMB] = "Open UI" + context[SCREENTIP_CONTEXT_RMB] = locked ? "Unlock" : "Lock" + context[SCREENTIP_CONTEXT_CTRL_LMB] = operating ? "Disable power" : "Enable power" + context[SCREENTIP_CONTEXT_SHIFT_LMB] = lighting ? "Disable lights" : "Enable lights" + context[SCREENTIP_CONTEXT_ALT_LMB] = equipment ? "Disable equipment" : "Enable equipment" + context[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB] = environ ? "Disable environment" : "Enable environment" + + else if (isnull(held_item)) if (opened == APC_COVER_CLOSED) context[SCREENTIP_CONTEXT_RMB] = locked ? "Unlock" : "Lock" else if (opened == APC_COVER_OPENED && cell) diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm index 59fa92aba320e..9bfdaf1e249b8 100644 --- a/code/modules/power/apc/apc_main.dm +++ b/code/modules/power/apc/apc_main.dm @@ -8,7 +8,7 @@ /obj/machinery/power/apc name = "area power controller" desc = "A control terminal for the area's electrical systems." - + icon = 'icons/obj/machines/wallmounts.dmi' icon_state = "apc0" use_power = NO_POWER_USE req_access = null @@ -175,7 +175,7 @@ name = "\improper [get_area_name(area, TRUE)] APC" //Initialize its electronics - wires = new /datum/wires/apc(src) + set_wires(new /datum/wires/apc(src)) alarm_manager = new(src) AddElement(/datum/element/atmos_sensitive, mapload) // for apcs created during map load make them fully functional @@ -201,11 +201,20 @@ RegisterSignal(SSdcs, COMSIG_GLOB_GREY_TIDE, PROC_REF(grey_tide)) update_appearance() - GLOB.apcs_list += src + var/static/list/hovering_mob_typechecks = list( + /mob/living/silicon = list( + SCREENTIP_CONTEXT_CTRL_LMB = "Toggle power", + SCREENTIP_CONTEXT_ALT_LMB = "Toggle equipment power", + SCREENTIP_CONTEXT_SHIFT_LMB = "Toggle lighting power", + SCREENTIP_CONTEXT_CTRL_SHIFT_LMB = "Toggle environment power", + ) + ) -/obj/machinery/power/apc/Destroy() - GLOB.apcs_list -= src + AddElement(/datum/element/contextual_screentip_bare_hands, rmb_text = "Toggle interface lock") + AddElement(/datum/element/contextual_screentip_mob_typechecks, hovering_mob_typechecks) + find_and_hang_on_wall() +/obj/machinery/power/apc/Destroy() if(malfai && operating) malfai.malf_picker.processing_time = clamp(malfai.malf_picker.processing_time - 10, 0, 1000) disconnect_from_area() @@ -252,14 +261,14 @@ area.apc = null area = null -/obj/machinery/power/apc/handle_atom_del(atom/deleting_atom) - if(deleting_atom == cell) +/obj/machinery/power/apc/Exited(atom/movable/gone, direction) + . = ..() + if(gone == cell) cell = null charging = APC_NOT_CHARGING update_appearance() if(!QDELING(src)) SStgui.update_uis(src) - return ..() /obj/machinery/power/apc/examine(mob/user) . = ..() @@ -284,11 +293,6 @@ else . += "The cover is closed." - . += span_notice("Right-click the APC to [ locked ? "unlock" : "lock"] the interface.") - - if(issilicon(user)) - . += span_notice("Ctrl-Click the APC to switch the breaker [ operating ? "off" : "on"].") - /obj/machinery/power/apc/deconstruct(disassembled = TRUE) if(flags_1 & NODECONSTRUCT_1) return @@ -705,7 +709,7 @@ /// Used for full_charge apc helper, which sets apc charge to 100%. /obj/machinery/power/apc/proc/set_full_charge() - cell.charge = 100 + cell.charge = cell.maxcharge /*Power module, used for APC construction*/ /obj/item/electronics/apc diff --git a/code/modules/power/apc/apc_malf.dm b/code/modules/power/apc/apc_malf.dm index 77dfc3f5a0eb1..3b0703688043d 100644 --- a/code/modules/power/apc/apc_malf.dm +++ b/code/modules/power/apc/apc_malf.dm @@ -69,7 +69,7 @@ if(forced) occupier.forceMove(drop_location()) INVOKE_ASYNC(occupier, TYPE_PROC_REF(/mob/living, death)) - occupier.gib() + occupier.gib(DROP_ALL_REMAINS) if(!occupier.nuking) //Pinpointers go back to tracking the nuke disk, as long as the AI (somehow) isn't mid-nuking. for(var/obj/item/pinpointer/nuke/disk_pinpointers in GLOB.pinpointer_list) @@ -77,26 +77,29 @@ disk_pinpointers.alert = FALSE /obj/machinery/power/apc/transfer_ai(interaction, mob/user, mob/living/silicon/ai/AI, obj/item/aicard/card) + . = ..() + if(!.) + return if(card.AI) to_chat(user, span_warning("[card] is already occupied!")) - return + return FALSE if(!occupier) to_chat(user, span_warning("There's nothing in [src] to transfer!")) - return + return FALSE if(!occupier.mind || !occupier.client) to_chat(user, span_warning("[occupier] is either inactive or destroyed!")) - return + return FALSE if(!occupier.parent.stat) to_chat(user, span_warning("[occupier] is refusing all attempts at transfer!") ) - return + return FALSE if(transfer_in_progress) to_chat(user, span_warning("There's already a transfer in progress!")) - return + return FALSE if(interaction != AI_TRANS_TO_CARD || occupier.stat) - return + return FALSE var/turf/user_turf = get_turf(user) if(!user_turf) - return + return FALSE transfer_in_progress = TRUE user.visible_message(span_notice("[user] slots [card] into [src]..."), span_notice("Transfer process initiated. Sending request for AI approval...")) playsound(src, 'sound/machines/click.ogg', 50, TRUE) @@ -105,21 +108,21 @@ to_chat(user, span_danger("AI denied transfer request. Process terminated.")) playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE) transfer_in_progress = FALSE - return + return FALSE if(user.loc != user_turf) to_chat(user, span_danger("Location changed. Process terminated.")) to_chat(occupier, span_warning("[user] moved away! Transfer canceled.")) transfer_in_progress = FALSE - return + return FALSE to_chat(user, span_notice("AI accepted request. Transferring stored intelligence to [card]...")) to_chat(occupier, span_notice("Transfer starting. You will be moved to [card] shortly.")) if(!do_after(user, 50, target = src)) to_chat(occupier, span_warning("[user] was interrupted! Transfer canceled.")) transfer_in_progress = FALSE - return + return FALSE if(!occupier || !card) transfer_in_progress = FALSE - return + return FALSE user.visible_message(span_notice("[user] transfers [occupier] to [card]!"), span_notice("Transfer complete! [occupier] is now stored in [card].")) to_chat(occupier, span_notice("Transfer complete! You've been stored in [user]'s [card.name].")) occupier.forceMove(card) @@ -128,4 +131,4 @@ occupier.cancel_camera() occupier = null transfer_in_progress = FALSE - return + return TRUE diff --git a/code/modules/power/apc/apc_power_proc.dm b/code/modules/power/apc/apc_power_proc.dm index c2b4e00036fb1..b49c0ba0a74d9 100644 --- a/code/modules/power/apc/apc_power_proc.dm +++ b/code/modules/power/apc/apc_power_proc.dm @@ -7,10 +7,11 @@ if(terminal) terminal.connect_to_network() -/obj/machinery/power/apc/proc/make_terminal() +/obj/machinery/power/apc/proc/make_terminal(terminal_cable_layer = cable_layer) // create a terminal object at the same position as original turf loc // wires will attach to this terminal = new/obj/machinery/power/terminal(loc) + terminal.cable_layer = terminal_cable_layer terminal.setDir(dir) terminal.master = src @@ -41,8 +42,11 @@ if(!is_operational || failure_timer) return operating = !operating - add_hiddenprint(user) - user.log_message("turned [operating ? "on" : "off"] the [src]", LOG_GAME) + if (user) + var/enabled_or_disabled = operating ? "enabled" : "disabled" + balloon_alert(user, "power [enabled_or_disabled]") + user.log_message("turned [enabled_or_disabled] the [src]", LOG_GAME) + add_hiddenprint(user) update() update_appearance() diff --git a/code/modules/power/apc/apc_tool_act.dm b/code/modules/power/apc/apc_tool_act.dm index 1a645c4ebe25e..8884786a4eb0f 100644 --- a/code/modules/power/apc/apc_tool_act.dm +++ b/code/modules/power/apc/apc_tool_act.dm @@ -124,7 +124,7 @@ if (machine_stat & BROKEN) balloon_alert(user, "too damaged to repair!") return - if(!welder.tool_start_check(user, amount=0)) + if(!welder.tool_start_check(user, amount=1)) return balloon_alert(user, "repairing...") if(welder.use_tool(src, user, 4 SECONDS, volume = 50)) @@ -135,12 +135,12 @@ //disassembling the frame if(!opened || has_electronics || terminal) return - if(!welder.tool_start_check(user, amount=3)) + if(!welder.tool_start_check(user, amount=1)) return user.visible_message(span_notice("[user.name] welds [src]."), \ span_hear("You hear welding.")) balloon_alert(user, "welding the APC frame") - if(!welder.use_tool(src, user, 50, volume=50, amount=3)) + if(!welder.use_tool(src, user, 50, volume=50)) return if((machine_stat & BROKEN) || opened == APC_COVER_REMOVED) new /obj/item/stack/sheet/iron(loc) @@ -161,13 +161,13 @@ if(machine_stat & BROKEN) balloon_alert(user, "frame is too damaged!") return FALSE - return list("mode" = RCD_WALLFRAME, "delay" = 20, "cost" = 1) + return list("mode" = RCD_WALLFRAME, "delay" = 2 SECONDS, "cost" = 1) if(!cell) if(machine_stat & MAINT) balloon_alert(user, "no board for a cell!") return FALSE - return list("mode" = RCD_WALLFRAME, "delay" = 50, "cost" = 10) + return list("mode" = RCD_WALLFRAME, "delay" = 5 SECONDS, "cost" = 10) balloon_alert(user, "has both board and cell!") return FALSE @@ -202,23 +202,27 @@ balloon_alert(user, "has both board and cell!") return FALSE -/obj/machinery/power/apc/emag_act(mob/user) +/obj/machinery/power/apc/emag_act(mob/user, obj/item/card/emag/emag_card) if((obj_flags & EMAGGED) || malfhack) - return + return FALSE if(opened) balloon_alert(user, "close the cover first!") + return FALSE else if(panel_open) balloon_alert(user, "close the panel first!") + return FALSE else if(machine_stat & (BROKEN|MAINT)) balloon_alert(user, "nothing happens!") + return FALSE else flick("apc-spark", src) playsound(src, SFX_SPARKS, 75, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) obj_flags |= EMAGGED locked = FALSE - balloon_alert(user, "you emag the APC") + balloon_alert(user, "interface damaged") update_appearance() + return TRUE // damage and destruction acts /obj/machinery/power/apc/emp_act(severity) @@ -251,7 +255,5 @@ locked = !locked balloon_alert(user, locked ? "locked" : "unlocked") update_appearance() - if(!locked) - ui_interact(user) else balloon_alert(user, "access denied!") diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 0a5aeabc30c0f..07948e3c4d08f 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -14,7 +14,7 @@ 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 = 'icons/obj/pipes_n_cables/layer_cable.dmi' icon_state = "l2-1-2-4-8-node" color = CABLE_HEX_COLOR_YELLOW plane = FLOOR_PLANE @@ -24,7 +24,6 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri 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 var/cable_color = CABLE_COLOR_YELLOW var/is_fully_initialized = FALSE @@ -33,7 +32,6 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri color = CABLE_HEX_COLOR_RED cable_color = CABLE_COLOR_RED cable_layer = CABLE_LAYER_1 - machinery_layer = null layer = WIRE_LAYER - 0.01 icon_state = "l1-1-2-4-8-node" @@ -41,7 +39,6 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri color = CABLE_HEX_COLOR_BLUE cable_color = CABLE_COLOR_BLUE cable_layer = CABLE_LAYER_3 - machinery_layer = null layer = WIRE_LAYER + 0.01 icon_state = "l4-1-2-4-8-node" @@ -62,7 +59,12 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri update_appearance(UPDATE_ICON) is_fully_initialized = TRUE -/obj/structure/cable/proc/on_rat_eat(datum/source, mob/living/simple_animal/hostile/regalrat/king) +/obj/structure/cable/examine(mob/user) + . = ..() + if(isobserver(user)) + . += get_power_info() + +/obj/structure/cable/proc/on_rat_eat(datum/source, mob/living/basic/regal_rat/king) SIGNAL_HANDLER if(avail()) @@ -70,6 +72,8 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri playsound(king, 'sound/effects/sparks2.ogg', 100, TRUE) deconstruct() + return COMPONENT_RAT_INTERACTED + ///Set the linked indicator bitflags /obj/structure/cable/proc/Connect_cable(clear_before_updating = FALSE) var/under_thing = NONE @@ -104,7 +108,7 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri 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) + var/inverse = REVERSE_DIR(check_dir) for(var/obj/structure/cable/C in TB) if(C.cable_layer & cable_layer) linked_dirs |= check_dir @@ -120,7 +124,7 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri ///Clear the linked indicator bitflags /obj/structure/cable/proc/Disconnect_cable() for(var/check_dir in GLOB.cardinals) - var/inverse = turn(check_dir, 180) + var/inverse = REVERSE_DIR(check_dir) if(linked_dirs & check_dir) var/TB = get_step(loc, check_dir) for(var/obj/structure/cable/C in TB) @@ -172,13 +176,6 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri icon_state = dir_string return ..() - -/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) @@ -279,7 +276,7 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri // 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/inverse_dir = (!direction)? 0 : REVERSE_DIR(direction) //flip the direction, to match with the source position on its turf var/turf/TB = get_step(src, direction) @@ -425,7 +422,7 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri name = "cable coil" custom_price = PAYCHECK_LOWER * 0.8 gender = NEUTER //That's a cable coil sounds better than that's some cable coils - icon = 'icons/obj/power.dmi' + icon = 'icons/obj/stack_objects.dmi' icon_state = "coil" inhand_icon_state = "coil_yellow" base_icon_state = "coil" @@ -518,8 +515,8 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri "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"), - "Multi Z layer cable hub" = image(icon = 'icons/obj/power.dmi', icon_state = "cablerelay-broken-cable"), + "Multilayer cable hub" = image(icon = 'icons/obj/pipes_n_cables/structures.dmi', icon_state = "cable_bridge"), + "Multi Z layer cable hub" = image(icon = 'icons/obj/pipes_n_cables/structures.dmi', icon_state = "cablerelay-broken-cable"), "Cable restraints" = restraints_icon ) @@ -575,7 +572,7 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri return ..() var/obj/item/bodypart/affecting = H.get_bodypart(check_zone(user.zone_selected)) - if(affecting && !IS_ORGANIC_LIMB(affecting)) + if(affecting && IS_ROBOTIC_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].")) if(!do_after(user, 50, H)) @@ -656,10 +653,9 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri /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 = 'icons/obj/pipes_n_cables/structures.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 = CABLE_COLOR_WHITE @@ -670,21 +666,20 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri /obj/structure/cable/multilayer/update_icon() . = ..() underlays.Cut() - var/mutable_appearance/cable_node_3 = mutable_appearance('icons/obj/power_cond/layer_cable.dmi', "l4-1-2-4-8-node") + var/mutable_appearance/cable_node_3 = mutable_appearance('icons/obj/pipes_n_cables/layer_cable.dmi', "l4-1-2-4-8-node") cable_node_3.color = CABLE_COLOR_BLUE cable_node_3?.alpha = cable_layer & CABLE_LAYER_3 ? 255 : 0 underlays += cable_node_3 - var/mutable_appearance/cable_node_2 = mutable_appearance('icons/obj/power_cond/layer_cable.dmi', "l2-1-2-4-8-node") + var/mutable_appearance/cable_node_2 = mutable_appearance('icons/obj/pipes_n_cables/layer_cable.dmi', "l2-1-2-4-8-node") cable_node_2.color = CABLE_COLOR_YELLOW cable_node_2?.alpha = cable_layer & CABLE_LAYER_2 ? 255 : 0 underlays += cable_node_2 - var/mutable_appearance/cable_node_1 = mutable_appearance('icons/obj/power_cond/layer_cable.dmi', "l1-1-2-4-8-node") + var/mutable_appearance/cable_node_1 = mutable_appearance('icons/obj/pipes_n_cables/layer_cable.dmi', "l1-1-2-4-8-node") cable_node_1.color = CABLE_COLOR_RED cable_node_1?.alpha = cable_layer & CABLE_LAYER_1 ? 255 : 0 underlays += cable_node_1 - var/mutable_appearance/machinery_node = mutable_appearance('icons/obj/power_cond/layer_cable.dmi', "l2-noconnection") + var/mutable_appearance/machinery_node = mutable_appearance('icons/obj/pipes_n_cables/layer_cable.dmi', "l2-noconnection") machinery_node.color = "black" - machinery_node?.alpha = machinery_layer & MACHINERY_LAYER_1 ? 255 : 0 underlays += machinery_node /obj/structure/cable/multilayer/Initialize(mapload) @@ -703,7 +698,6 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri . += 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"].") GLOBAL_LIST(hub_radial_layer_list) @@ -717,8 +711,7 @@ GLOBAL_LIST(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") + "Layer 3" = image(icon = 'icons/hud/radial.dmi', icon_state = "coil-blue") ) 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) @@ -735,9 +728,6 @@ GLOBAL_LIST(hub_radial_layer_list) 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.")) cut_cable_from_powernet(FALSE) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 4fca4c745b84f..aa7b216d39182 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -10,7 +10,7 @@ /obj/item/stock_parts/cell name = "power cell" desc = "A rechargeable electrochemical power cell." - icon = 'icons/obj/power.dmi' + icon = 'icons/obj/machines/cell_charger.dmi' icon_state = "cell" inhand_icon_state = "cell" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' @@ -116,10 +116,10 @@ /obj/item/stock_parts/cell/update_overlays() . = ..() if(grown_battery) - . += mutable_appearance('icons/obj/power.dmi', "grown_wires") + . += mutable_appearance('icons/obj/machines/cell_charger.dmi', "grown_wires") if((charge < 0.01) || !charge_light_type) return - . += mutable_appearance('icons/obj/power.dmi', "cell-[charge_light_type]-o[(percent() >= 99.5) ? 2 : 1]") + . += mutable_appearance('icons/obj/machines/cell_charger.dmi', "cell-[charge_light_type]-o[(percent() >= 99.5) ? 2 : 1]") /obj/item/stock_parts/cell/vv_edit_var(vname, vval) if(vname == NAMEOF(src, charge)) @@ -390,7 +390,7 @@ /obj/item/stock_parts/cell/infinite/abductor name = "void core" desc = "An alien power cell that produces energy seemingly out of nowhere." - icon = 'icons/obj/abductor.dmi' + icon = 'icons/obj/antags/abductor.dmi' icon_state = "cell" maxcharge = 50000 ratingdesc = FALSE @@ -402,7 +402,7 @@ /obj/item/stock_parts/cell/potato name = "potato battery" desc = "A rechargeable starch based power cell." - icon = 'icons/obj/hydroponics/harvest.dmi' + icon = 'icons/obj/service/hydroponics/harvest.dmi' icon_state = "potato" charge = 100 maxcharge = 300 @@ -461,9 +461,10 @@ /obj/item/stock_parts/cell/emergency_light/Initialize(mapload) . = ..() - var/area/A = get_area(src) - if(!A.lightswitch || !A.light_power) - charge = 0 //For naturally depowered areas, we start with no power + var/area/area = get_area(src) + if(area) + if(!area.lightswitch || !area.light_power) + charge = 0 //For naturally depowered areas, we start with no power /obj/item/stock_parts/cell/crystal_cell name = "crystal power cell" diff --git a/code/modules/power/floodlight.dm b/code/modules/power/floodlight.dm index 6229a360f630c..f36c9b1303866 100644 --- a/code/modules/power/floodlight.dm +++ b/code/modules/power/floodlight.dm @@ -11,6 +11,7 @@ icon = 'icons/obj/lighting.dmi' icon_state = "floodlight_c1" density = TRUE + var/state = FLOODLIGHT_NEEDS_WIRES /obj/structure/floodlight_frame/Initialize(mapload) @@ -131,6 +132,8 @@ active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION anchored = FALSE light_power = 1.75 + can_change_cable_layer = TRUE + /// List of power usage multipliers var/list/light_setting_list = list(0, 5, 10, 15) /// Constant coeff. for power usage @@ -141,6 +144,7 @@ /obj/machinery/power/floodlight/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_OBJ_PAINTED, TYPE_PROC_REF(/obj/machinery/power/floodlight, on_color_change)) //update light color when color changes + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) register_context() /obj/machinery/power/floodlight/proc/on_color_change(obj/machinery/power/flood_light, mob/user, obj/item/toy/crayon/spraycan/spraycan, is_dark_color) @@ -237,6 +241,12 @@ if(user) to_chat(user, span_notice("You set [src] to [setting_text].")) +/obj/machinery/power/floodlight/cable_layer_change_checks(mob/living/user, obj/item/tool) + if(anchored) + balloon_alert(user, "unanchor first!") + return FALSE + return TRUE + /obj/machinery/power/floodlight/wrench_act(mob/living/user, obj/item/tool) . = ..() default_unfasten_wrench(user, tool) @@ -280,6 +290,11 @@ /obj/machinery/power/floodlight/attack_ai(mob/user) return attack_hand(user) +/obj/machinery/power/floodlight/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + atom_break(ENERGY) // technically, + return COMSIG_SABOTEUR_SUCCESS + /obj/machinery/power/floodlight/atom_break(damage_flag) . = ..() if(!.) @@ -288,7 +303,8 @@ var/obj/structure/floodlight_frame/floodlight_frame = new(loc) floodlight_frame.state = FLOODLIGHT_NEEDS_LIGHTS - new /obj/item/light/tube(loc) + var/obj/item/light/tube/our_light = new(loc) + our_light.shatter() qdel(src) diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index 5442131817b89..6fa17d8dbe91a 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -35,7 +35,7 @@ var/L = min(round(lastgenlev / 100000), 11) if(L != 0) - . += mutable_appearance('icons/obj/power.dmi', "teg-op[L]") + . += mutable_appearance('icons/obj/machines/engine/other.dmi', "teg-op[L]") if(hot_circ && cold_circ) . += "teg-oc[lastcirc]" diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 3cf4bb74781c7..4d32559ce7192 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -148,6 +148,9 @@ GLOBAL_LIST_EMPTY(gravity_generators) /// Audio for when the gravgen is on var/datum/looping_sound/gravgen/soundloop + ///Amount of shielding we offer against a radioactive nebula + var/radioactive_nebula_shielding = 4 + ///Station generator that spawns with gravity turned off. /obj/machinery/gravity_generator/main/off on = FALSE @@ -162,6 +165,8 @@ GLOBAL_LIST_EMPTY(gravity_generators) enable() center_part.add_overlay("activated") + add_to_nebula_shielding(src, /datum/station_trait/nebula/hostile/radiation, PROC_REF(get_radioactive_nebula_shielding)) + /obj/machinery/gravity_generator/main/Destroy() // If we somehow get deleted, remove all of our other parts. investigate_log("was destroyed!", INVESTIGATE_GRAVITY) disable() @@ -215,6 +220,20 @@ GLOBAL_LIST_EMPTY(gravity_generators) // Interaction +/obj/machinery/gravity_generator/main/examine(mob/user) + . = ..() + if(!(machine_stat & BROKEN)) + return + switch(broken_state) + if(GRAV_NEEDS_SCREWDRIVER) + . += span_notice("The entire frame is barely holding together, the screws need to be refastened.") + if(GRAV_NEEDS_WELDING) + . += span_notice("There's lots of broken seals on the framework, it could use some welding.") + if(GRAV_NEEDS_PLASTEEL) + . += span_notice("Some of this damaged plating needs full replacement. 10 plasteel should be enough.") + if(GRAV_NEEDS_WRENCH) + . += span_notice("The new plating just needs to be bolted into place now.") + // Fixing the gravity generator. /obj/machinery/gravity_generator/main/attackby(obj/item/weapon, mob/user, params) if(machine_stat & BROKEN) @@ -228,7 +247,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) return if(GRAV_NEEDS_WELDING) if(weapon.tool_behaviour == TOOL_WELDER) - if(weapon.use_tool(src, user, 0, volume=50, amount=1)) + if(weapon.use_tool(src, user, 0, volume=50)) to_chat(user, span_notice("You mend the damaged framework.")) broken_state++ update_appearance() @@ -453,6 +472,10 @@ GLOBAL_LIST_EMPTY(gravity_generators) for(var/obj/machinery/gravity_generator/part as anything in generator_parts) SET_PLANE(part, PLANE_TO_TRUE(part.plane), new_turf) +/// Returns the radioactive shielding (if there's a radioactive nebula). Called from a callback set in add_to_nebula_shielding() +/obj/machinery/gravity_generator/main/proc/get_radioactive_nebula_shielding() + return on ? radioactive_nebula_shielding : 0 + //prevents shuttles attempting to rotate this since it messes up sprites /obj/machinery/gravity_generator/main/shuttleRotate(rotation, params) params = NONE diff --git a/code/modules/power/lighting/light.dm b/code/modules/power/lighting/light.dm index 9b87b3f7b9b9d..747010fc6c006 100644 --- a/code/modules/power/lighting/light.dm +++ b/code/modules/power/lighting/light.dm @@ -12,6 +12,7 @@ active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.02 power_channel = AREA_USAGE_LIGHT //Lights are calc'd via area so they dont need to be in the machine list always_area_sensitive = TRUE + light_angle = 170 ///What overlay the light should use var/overlay_icon = 'icons/obj/lighting_overlay.dmi' ///base description and icon_state @@ -110,8 +111,12 @@ if(is_station_level(z)) RegisterSignal(SSdcs, COMSIG_GLOB_GREY_TIDE_LIGHT, PROC_REF(grey_tide)) //Only put the signal on station lights + // Light projects out backwards from the dir of the light + set_light(l_dir = REVERSE_DIR(dir)) RegisterSignal(src, COMSIG_LIGHT_EATER_ACT, PROC_REF(on_light_eater)) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) AddElement(/datum/element/atmos_sensitive, mapload) + find_and_hang_on_wall(custom_drop_callback = CALLBACK(src, PROC_REF(knock_down))) return INITIALIZE_HINT_LATELOAD /obj/machinery/light/LateInitialize() @@ -126,12 +131,26 @@ update(trigger = FALSE) /obj/machinery/light/Destroy() - var/area/local_area =get_room_area(src) + var/area/local_area = get_room_area(src) if(local_area) on = FALSE QDEL_NULL(cell) return ..() +/obj/machinery/light/setDir(newdir) + . = ..() + set_light(l_dir = REVERSE_DIR(dir)) + +// If we're adjacent to the source, we make this sorta indentation for our light to ensure it stays lit (and to make distances look right) +// By shifting the light position we use forward a bit, towards something that isn't off by 0.5 from being in angle +// Because angle calculation is kinda harsh it's hard to find a happy point between fulldark and fullbright for the corners behind the light. this is good enough tho +/obj/machinery/light/get_light_offset() + var/list/hand_back = ..() + var/list/dir_offset = dir2offset(REVERSE_DIR(dir)) + hand_back[1] += dir_offset[1] * 0.5 + hand_back[2] += dir_offset[2] * 0.5 + return hand_back + /obj/machinery/light/update_icon_state() switch(status) // set icon_states if(LIGHT_OK) @@ -153,7 +172,10 @@ if(!on || status != LIGHT_OK) return + . += emissive_appearance(overlay_icon, "[base_state]", src, alpha = src.alpha) + var/area/local_area = get_room_area(src) + if(low_power_mode || major_emergency || (local_area?.fire)) . += mutable_appearance(overlay_icon, "[base_state]_emergency") return @@ -403,7 +425,7 @@ if(prob(12)) electrocute_mob(user, get_area(src), src, 0.3, TRUE) -/obj/machinery/light/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) +/obj/machinery/light/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armour_penetration = 0) . = ..() if(. && !QDELETED(src)) if(prob(damage_amount * 5)) @@ -654,6 +676,11 @@ tube?.burn() return +/obj/machinery/light/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + break_light_tube() + return COMSIG_SABOTEUR_SUCCESS + /obj/machinery/light/proc/grey_tide(datum/source, list/grey_tide_areas) SIGNAL_HANDLER @@ -662,6 +689,20 @@ continue INVOKE_ASYNC(src, PROC_REF(flicker)) +/** + * All the effects that occur when a light falls off a wall that it was hung onto. + */ +/obj/machinery/light/proc/knock_down() + new /obj/item/wallframe/light_fixture(drop_location()) + new /obj/item/stack/cable_coil(drop_location(), 1, "red") + if(status != LIGHT_BROKEN) + break_light_tube(FALSE) + if(status != LIGHT_EMPTY) + drop_light_tube() + if(cell) + cell.forceMove(drop_location()) + qdel(src) + /obj/machinery/light/floor name = "floor light" desc = "A lightbulb you can walk on without breaking it, amazing." @@ -669,8 +710,17 @@ base_state = "floor" // base description and icon_state icon_state = "floor" brightness = 4 + light_angle = 360 layer = LOW_OBJ_LAYER plane = FLOOR_PLANE light_type = /obj/item/light/bulb fitting = "bulb" + nightshift_brightness = 3 fire_brightness = 2 + +/obj/machinery/light/floor/get_light_offset() + return list(0, 0) + +/obj/machinery/light/floor/broken + status = LIGHT_BROKEN + icon_state = "floor-broken" diff --git a/code/modules/power/lighting/light_construct.dm b/code/modules/power/lighting/light_construct.dm index 5a8f406b86c7b..05d9533c79ea7 100644 --- a/code/modules/power/lighting/light_construct.dm +++ b/code/modules/power/lighting/light_construct.dm @@ -33,6 +33,7 @@ . = ..() if(building) setDir(ndir) + find_and_hang_on_wall() /obj/structure/light_construct/Destroy() QDEL_NULL(cell) diff --git a/code/modules/power/lighting/light_mapping_helpers.dm b/code/modules/power/lighting/light_mapping_helpers.dm index cd4c0c18c5bc7..a2171c8897c89 100644 --- a/code/modules/power/lighting/light_mapping_helpers.dm +++ b/code/modules/power/lighting/light_mapping_helpers.dm @@ -5,11 +5,7 @@ /obj/machinery/light/built icon_state = "tube-empty" start_with_cell = FALSE - -/obj/machinery/light/built/Initialize(mapload) - . = ..() status = LIGHT_EMPTY - update(0) /obj/machinery/light/no_nightlight nightshift_enabled = FALSE @@ -20,6 +16,10 @@ /obj/machinery/light/warm/no_nightlight nightshift_allowed = FALSE +/obj/machinery/light/warm/dim + nightshift_allowed = FALSE + bulb_power = 0.6 + /obj/machinery/light/cold bulb_colour = LIGHT_COLOR_FAINT_BLUE nightshift_light_color = LIGHT_COLOR_FAINT_BLUE @@ -27,6 +27,10 @@ /obj/machinery/light/cold/no_nightlight nightshift_allowed = FALSE +/obj/machinery/light/cold/dim + nightshift_allowed = FALSE + bulb_power = 0.6 + /obj/machinery/light/red bulb_colour = "#FF3232" nightshift_allowed = FALSE @@ -67,11 +71,10 @@ /obj/machinery/light/small/built icon_state = "bulb-empty" start_with_cell = FALSE - -/obj/machinery/light/small/built/Initialize(mapload) - . = ..() status = LIGHT_EMPTY - update(0) + +/obj/machinery/light/small/dim + brightness = 2.4 /obj/machinery/light/small/red bulb_colour = "#FF3232" @@ -113,12 +116,18 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light/warm, 0) // ---- No nightlight warm light tubes MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light/warm/no_nightlight, 0) +// ---- Dim warm light tubes +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light/warm/dim, 0) + // ---- Cold light tubes MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light/cold, 0) // ---- No nightlight cold light tubes MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light/cold/no_nightlight, 0) +// ---- Dim cold light tubes +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light/cold/dim, 0) + // ---- Red tubes MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light/red, 0) @@ -145,6 +154,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light/small/built, 0) MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light/small/broken, 0) // ---- Red bulbs +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light/small/dim, 0) + MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light/small/red, 0) // ---- Red dim bulbs diff --git a/code/modules/power/multiz.dm b/code/modules/power/multiz.dm index 3c9d9ee5c3ad1..55329145936c8 100644 --- a/code/modules/power/multiz.dm +++ b/code/modules/power/multiz.dm @@ -1,19 +1,18 @@ /obj/structure/cable/multilayer/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 = 'icons/obj/pipes_n_cables/structures.dmi' 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) . = ..() var/turf/T = get_turf(src) - . += locate(/obj/structure/cable/multilayer/multiz) in (SSmapping.get_turf_below(T)) - . += locate(/obj/structure/cable/multilayer/multiz) in (SSmapping.get_turf_above(T)) + . += locate(/obj/structure/cable/multilayer/multiz) in (GET_TURF_BELOW(T)) + . += locate(/obj/structure/cable/multilayer/multiz) in (GET_TURF_ABOVE(T)) /obj/structure/cable/multilayer/multiz/examine(mob/user) . = ..() var/turf/T = get_turf(src) - . += span_notice("[locate(/obj/structure/cable/multilayer/multiz) in (SSmapping.get_turf_below(T)) ? "Detected" : "Undetected"] hub UP.") - . += span_notice("[locate(/obj/structure/cable/multilayer/multiz) in (SSmapping.get_turf_above(T)) ? "Detected" : "Undetected"] hub DOWN.") + . += span_notice("[locate(/obj/structure/cable/multilayer/multiz) in (GET_TURF_BELOW(T)) ? "Detected" : "Undetected"] hub UP.") + . += span_notice("[locate(/obj/structure/cable/multilayer/multiz) in (GET_TURF_ABOVE(T)) ? "Detected" : "Undetected"] hub DOWN.") diff --git a/code/modules/power/pipecleaners.dm b/code/modules/power/pipecleaners.dm index dca741eb8b252..f052913c2e733 100644 --- a/code/modules/power/pipecleaners.dm +++ b/code/modules/power/pipecleaners.dm @@ -26,7 +26,7 @@ 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 = 'icons/obj/pipes_n_cables/pipe_cleaner.dmi' icon_state = "0-1" layer = WIRE_LAYER //Above hidden pipes, GAS_PIPE_HIDDEN_LAYER anchored = TRUE @@ -183,7 +183,7 @@ By design, d1 is the smallest direction and d2 is the highest desc = "A coil of pipe cleaners. Good for arts and crafts, not to build with." custom_price = PAYCHECK_CREW * 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 = 'icons/obj/stack_objects.dmi' icon_state = "pipecleaner" inhand_icon_state = "coil_red" worn_icon_state = "coil" @@ -384,7 +384,7 @@ By design, d1 is the smallest direction and d2 is the highest // 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 + var/fdirn = REVERSE_DIR(dirn) // 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) diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 5400a48422c4c..b0f801275150d 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -2,7 +2,7 @@ /obj/machinery/power/port_gen name = "portable generator" desc = "A portable generator for emergency backup power." - icon = 'icons/obj/power.dmi' + icon = 'icons/obj/machines/engine/other.dmi' icon_state = "portgen0_0" base_icon_state = "portgen0" density = TRUE @@ -209,12 +209,13 @@ return return ..() -/obj/machinery/power/port_gen/pacman/emag_act(mob/user) +/obj/machinery/power/port_gen/pacman/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE obj_flags |= EMAGGED - to_chat(user, span_notice("You hear a hefty clunk from inside the generator.")) + balloon_alert(user, "maximum power output unlocked") emp_act(EMP_HEAVY) + return TRUE /obj/machinery/power/port_gen/pacman/attack_ai(mob/user) interact(user) diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 195988b64b786..39c3e53614403 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -8,7 +8,7 @@ /obj/machinery/power name = null - icon = 'icons/obj/power.dmi' + icon = 'icons/obj/machines/engine/other.dmi' anchored = TRUE obj_flags = CAN_BE_HIT use_power = NO_POWER_USE @@ -18,7 +18,9 @@ ///The powernet our machine is connected to. var/datum/powernet/powernet ///Cable layer to which the machine is connected. - var/machinery_layer = MACHINERY_LAYER_1 + var/cable_layer = CABLE_LAYER_2 + ///Can the cable_layer be tweked with a multi tool + var/can_change_cable_layer = FALSE /obj/machinery/power/Initialize(mapload) . = ..() @@ -44,6 +46,34 @@ /obj/machinery/power/proc/should_have_node() return FALSE +/obj/machinery/power/examine(mob/user) + . = ..() + if(can_change_cable_layer) + if(!QDELETED(powernet)) + . += span_notice("It's operating on the [lowertext(GLOB.cable_layer_to_name["[cable_layer]"])].") + else + . += span_warning("It's disconnected from the [lowertext(GLOB.cable_layer_to_name["[cable_layer]"])].") + . += span_notice("It's power line can be changed with a [EXAMINE_HINT("multitool")].") + +///does the required checks to see if this machinery layer can be changed +/obj/machinery/power/proc/cable_layer_change_checks(mob/living/user, obj/item/tool) + return can_change_cable_layer + +/obj/machinery/power/multitool_act(mob/living/user, obj/item/tool) + if(!can_change_cable_layer || !cable_layer_change_checks(user, tool)) + return + + var/choice = tgui_input_list(user, "Select Power Line For Operation", "Select Cable Layer", GLOB.cable_name_to_layer) + if(isnull(choice)) + return + + cable_layer = GLOB.cable_name_to_layer[choice] + balloon_alert(user, "now operating on the [choice]") + return TOOL_ACT_TOOLTYPE_SUCCESS + +/obj/machinery/power/multitool_act_secondary(mob/living/user, obj/item/tool) + return multitool_act(user, tool) + /obj/machinery/power/proc/add_avail(amount) if(powernet) powernet.newavail += amount @@ -204,7 +234,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(cable_layer) //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) @@ -429,11 +459,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(cable_layer = CABLE_LAYER_ALL) if(!can_have_cabling()) return null for(var/obj/structure/cable/C in src) - if(C.machinery_layer & machinery_layer) + if(C.cable_layer & cable_layer) C.update_appearance() // I hate this. it's here because update_icon_state SCANS nearby turfs for objects to connect to. Wastes cpu time return C return null diff --git a/code/modules/power/rtg.dm b/code/modules/power/rtg.dm index effdc403fd106..974c2e6673794 100644 --- a/code/modules/power/rtg.dm +++ b/code/modules/power/rtg.dm @@ -4,7 +4,7 @@ /obj/machinery/power/rtg name = "radioisotope thermoelectric generator" desc = "A simple nuclear power generator, used in small outposts to reliably provide power for decades." - icon = 'icons/obj/power.dmi' + icon = 'icons/obj/machines/engine/other.dmi' icon_state = "rtg" density = TRUE use_power = NO_POWER_USE @@ -55,7 +55,7 @@ /obj/machinery/power/rtg/abductor name = "Void Core" - icon = 'icons/obj/abductor.dmi' + icon = 'icons/obj/antags/abductor.dmi' icon_state = "core" desc = "An alien power source that produces energy seemingly out of nowhere." circuit = /obj/item/circuitboard/machine/abductor/core @@ -71,7 +71,7 @@ visible_message(span_danger("\The [src] lets out a shower of sparks as it starts to lose stability!"),\ span_hear("You hear a loud electrical crack!")) playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5) - tesla_zap(src, 5, power_gen * 0.05) + tesla_zap(src, 5, power_gen * 20) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), src, 2, 3, 4, null, 8), 10 SECONDS) // Not a normal explosion. /obj/machinery/power/rtg/abductor/bullet_act(obj/projectile/Proj) diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 0448fa60b3eda..52be991cb69d9 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -3,7 +3,7 @@ /obj/machinery/field/containment name = "containment field" desc = "An energy field." - icon = 'icons/obj/engine/singularity.dmi' + icon = 'icons/obj/machines/engine/singularity.dmi' icon_state = "Contain_F" density = FALSE move_resist = INFINITY diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index d165bf237f2fb..c23c5782af159 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -1,7 +1,7 @@ /obj/machinery/power/emitter name = "emitter" desc = "A heavy-duty industrial laser, often used in containment fields and power generation." - icon = 'icons/obj/engine/singularity.dmi' + icon = 'icons/obj/machines/engine/singularity.dmi' icon_state = "emitter" base_icon_state = "emitter" @@ -11,6 +11,7 @@ circuit = /obj/item/circuitboard/machine/emitter use_power = NO_POWER_USE + can_change_cable_layer = TRUE /// The icon state used by the emitter when it's on. var/icon_state_on = "emitter_+a" @@ -60,7 +61,7 @@ /obj/machinery/power/emitter/Initialize(mapload) . = ..() RefreshParts() - wires = new /datum/wires/emitter(src) + set_wires(new /datum/wires/emitter(src)) if(welded) if(!anchored) set_anchored(TRUE) @@ -76,6 +77,12 @@ welded = TRUE . = ..() +/obj/machinery/power/emitter/cable_layer_change_checks(mob/living/user, obj/item/tool) + if(welded) + balloon_alert(user, "unweld first!") + return FALSE + return TRUE + /obj/machinery/power/emitter/set_anchored(anchorvalue) . = ..() if(!anchored && welded) //make sure they're keep in sync in case it was forcibly unanchored by badmins or by a megafauna. @@ -265,7 +272,7 @@ return TRUE if(welded) - if(!item.tool_start_check(user, amount=0)) + if(!item.tool_start_check(user, amount=1)) return TRUE user.visible_message(span_notice("[user.name] starts to cut the [name] free from the floor."), \ span_notice("You start to cut [src] free from the floor..."), \ @@ -281,7 +288,7 @@ if(!anchored) to_chat(user, span_warning("[src] needs to be wrenched to the floor!")) return TRUE - if(!item.tool_start_check(user, amount=0)) + if(!item.tool_start_check(user, amount=1)) return TRUE user.visible_message(span_notice("[user.name] starts to weld the [name] to the floor."), \ span_notice("You start to weld [src] to the floor..."), \ @@ -368,13 +375,13 @@ projectile_type = initial(projectile_type) projectile_sound = initial(projectile_sound) -/obj/machinery/power/emitter/emag_act(mob/user) +/obj/machinery/power/emitter/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE locked = FALSE obj_flags |= EMAGGED - if(user) - user.visible_message(span_warning("[user.name] emags [src]."), span_notice("You short out the lock.")) + balloon_alert(user, "id lock shorted out") + return TRUE /obj/machinery/power/emitter/prototype diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 8e9ec44d8b08f..80e5faeede255 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -141,7 +141,7 @@ no power level overlay is currently in the overlays list. to_chat(user, span_warning("[src] needs to be wrenched to the floor!")) if(FG_SECURED) - if(!welder.tool_start_check(user, amount=0)) + if(!welder.tool_start_check(user, amount=1)) return TRUE user.visible_message( span_notice("[user] starts to weld [src] to the floor."), @@ -152,7 +152,7 @@ no power level overlay is currently in the overlays list. to_chat(user, span_notice("You weld the field generator to the floor.")) if(FG_WELDED) - if(!welder.tool_start_check(user, amount=0)) + if(!welder.tool_start_check(user, amount=1)) return TRUE user.visible_message( span_notice("[user] starts to cut [src] free from the floor."), diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 8a518ccb1cfbd..99dd421452cf3 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -9,7 +9,7 @@ /obj/narsie name = "Nar'Sie" desc = "Your mind begins to bubble and ooze as it tries to comprehend what it sees." - icon = 'icons/obj/cult/narsie.dmi' + icon = 'icons/obj/antags/cult/narsie.dmi' icon_state = "narsie" anchored = TRUE appearance_flags = LONG_GLIDE @@ -263,7 +263,7 @@ ///Helper to set the round to end asap. Current usage Cult round end code /proc/ending_helper() - SSticker.force_ending = TRUE + SSticker.force_ending = FORCE_END_ROUND /** * Selects cinematic to play as part of the cult end depending on the outcome then ends the round afterward diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 56298f8d92c0c..0a797a2d7d681 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -2,7 +2,7 @@ /obj/singularity name = "gravitational singularity" desc = "A gravitational singularity." - icon = 'icons/obj/engine/singularity.dmi' + icon = 'icons/obj/machines/engine/singularity.dmi' icon_state = "singularity_s1" anchored = TRUE density = TRUE @@ -48,6 +48,7 @@ /// What the game tells ghosts when you make one var/ghost_notification_message = "IT'S LOOSE" + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE | PASSCLOSEDTURF | PASSMACHINE | PASSSTRUCTURE | PASSDOORS flags_1 = SUPERMATTER_IGNORES_1 resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF obj_flags = CAN_BE_HIT | DANGEROUS_POSSESSION @@ -69,7 +70,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 SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/singularity_beacon)) if (singu_beacon.active) new_component.target = singu_beacon break @@ -202,7 +203,7 @@ switch(temp_allowed_size) if(STAGE_ONE) current_size = STAGE_ONE - icon = 'icons/obj/engine/singularity.dmi' + icon = 'icons/obj/machines/engine/singularity.dmi' icon_state = "[singularity_icon_variant]_s1" pixel_x = 0 pixel_y = 0 @@ -475,3 +476,7 @@ /obj/singularity/deadchat_controlled/Initialize(mapload, starting_energy) . = ..() deadchat_plays(mode = DEMOCRACY_MODE) + +/// Special singularity that spawns for shuttle events only +/obj/singularity/shuttle_event + anchored = FALSE diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index a7363f12bec0c..a4e24c5a7287b 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -21,6 +21,7 @@ density = TRUE use_power = NO_POWER_USE circuit = /obj/item/circuitboard/machine/smes + can_change_cable_layer = TRUE var/capacity = 5e6 // maximum charge var/charge = 0 // actual charge @@ -50,7 +51,7 @@ for(var/d in GLOB.cardinals) var/turf/T = get_step(src, d) for(var/obj/machinery/power/terminal/term in T) - if(term && term.dir == turn(d, 180)) + if(term && term.dir == REVERSE_DIR(d)) terminal = term break dir_loop @@ -79,6 +80,12 @@ /obj/machinery/power/smes/should_have_node() return TRUE +/obj/machinery/power/smes/cable_layer_change_checks(mob/living/user, obj/item/tool) + if(!QDELETED(terminal)) + balloon_alert(user, "cut the terminal first!") + return FALSE + return TRUE + /obj/machinery/power/smes/attackby(obj/item/I, mob/user, params) //opening using screwdriver if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-o", initial(icon_state), I)) @@ -90,7 +97,7 @@ terminal = null var/turf/T = get_step(src, dir) for(var/obj/machinery/power/terminal/term in T) - if(term && term.dir == turn(dir, 180)) + if(term && term.dir == REVERSE_DIR(dir)) terminal = term terminal.master = src to_chat(user, span_notice("Terminal found.")) @@ -127,13 +134,20 @@ to_chat(user, span_warning("You need more wires!")) return + var/terminal_cable_layer + if(LAZYACCESS(params2list(params), RIGHT_CLICK)) + var/choice = tgui_input_list(user, "Select Power Input Cable Layer", "Select Cable Layer", GLOB.cable_name_to_layer) + if(isnull(choice)) + return + terminal_cable_layer = GLOB.cable_name_to_layer[choice] + to_chat(user, span_notice("You start building the power terminal...")) playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE) if(do_after(user, 20, target = src)) if(C.get_amount() < 10 || !C) return - var/obj/structure/cable/N = T.get_cable_node() //get the connecting node cable, if there's one + var/obj/structure/cable/N = T.get_cable_node(terminal_cable_layer) //get the connecting node cable, if there's one if (prob(50) && electrocute_mob(usr, N, N, 1, TRUE)) //animate the electrocution if uncautious and unlucky do_sparks(5, TRUE, src) return @@ -143,7 +157,7 @@ span_notice("You build the power terminal.")) //build the terminal and link it to the network - make_terminal(T) + make_terminal(T, terminal_cable_layer) terminal.connect_to_network() connect_to_network() return @@ -191,8 +205,9 @@ // create a terminal object pointing towards the SMES // wires will attach to this -/obj/machinery/power/smes/proc/make_terminal(turf/T) +/obj/machinery/power/smes/proc/make_terminal(turf/T, terminal_cable_layer = cable_layer) terminal = new/obj/machinery/power/terminal(T) + terminal.cable_layer = terminal_cable_layer terminal.setDir(get_dir(T,src)) terminal.master = src set_machine_stat(machine_stat & ~BROKEN) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 5bababb9a5025..f79e75fdaac93 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -6,7 +6,7 @@ /obj/machinery/power/solar name = "solar panel" desc = "A solar panel. Generates electricity when in contact with sunlight." - icon = 'icons/obj/solar.dmi' + icon = 'icons/obj/machines/solar.dmi' icon_state = "sp_base" density = TRUE use_power = NO_POWER_USE @@ -269,7 +269,7 @@ /obj/item/solar_assembly name = "solar panel assembly" desc = "A solar panel assembly kit, allows constructions of a solar panel, or with a tracking circuit board, a solar tracker." - icon = 'icons/obj/solar.dmi' + icon = 'icons/obj/machines/solar.dmi' icon_state = "sp_base" inhand_icon_state = "electropack" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' @@ -369,7 +369,7 @@ /obj/machinery/power/solar_control name = "solar panel control" desc = "A controller for solar panel arrays." - icon = 'icons/obj/computer.dmi' + icon = 'icons/obj/machines/computer.dmi' icon_state = "computer" density = TRUE use_power = IDLE_POWER_USE diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 04a7a15286abf..a51afd28a8b97 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -17,7 +17,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /obj/machinery/power/supermatter_crystal name = "supermatter crystal" desc = "A strangely translucent and iridescent crystal." - icon = 'icons/obj/engine/supermatter.dmi' + icon = 'icons/obj/machines/engine/supermatter.dmi' density = TRUE anchored = TRUE layer = MOB_LAYER @@ -39,6 +39,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/absorption_ratio = 0.15 /// The gasmix we just recently absorbed. Tile's air multiplied by absorption_ratio var/datum/gas_mixture/absorbed_gasmix + /// The current gas behaviors for this particular crystal + var/list/current_gas_behavior ///Refered to as EER on the monitor. This value effects gas output, damage, and power generation. var/internal_energy = 0 @@ -51,8 +53,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/damage_archived = 0 var/list/damage_factors - /// How much extra power does the main zap generate. - var/zap_multiplier = 1 + /// The zap power transmission over internal energy. W/MeV. + var/zap_transmission_rate = BASE_POWER_TRANSMISSION_RATE var/list/zap_factors /// The temperature at which we start taking damage @@ -93,7 +95,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /// How much power decay is negated. Complete power decay negation at 1. var/gas_powerloss_inhibition = 0 /// Affects the amount of power the main SM zap makes. - var/gas_power_transmission = 0 + var/gas_power_transmission_rate = 0 /// Affects the power gain the SM experiances from heat. var/gas_heat_power_generation = 0 @@ -107,9 +109,9 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/external_damage_immediate = 0 ///The cutoff for a bolt jumping, grows with heat, lowers with higher mol count, - var/zap_cutoff = 1500 + var/zap_cutoff = 1.2e6 ///How much the bullets damage should be multiplied by when it is added to the internal variables - var/bullet_energy = 2 + var/bullet_energy = SUPERMATTER_DEFAULT_BULLET_ENERGY ///How much hallucination should we produce per unit of power? var/hallucination_power = 0.1 @@ -151,6 +153,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) ///Stores the time of when the last zap occurred var/last_power_zap = 0 + var/last_high_energy_zap = 0 ///Do we show this crystal in the CIMS modular program var/include_in_cims = TRUE @@ -169,8 +172,17 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /// Only values greater or equal to the current one can change the strat. var/delam_priority = SM_DELAM_PRIO_NONE + /// Lazy list of the crazy engineers who managed to turn a cascading engine around. + var/list/datum/weakref/saviors = null + + /// If a sliver of the supermatter has been removed. Almost certainly by a traitor. Lowers the delamination countdown time. + var/supermatter_sliver_removed = FALSE + /// Cooldown for sending emergency alerts to the common radio channel + COOLDOWN_DECLARE(common_radio_cooldown) + /obj/machinery/power/supermatter_crystal/Initialize(mapload) . = ..() + current_gas_behavior = init_sm_gas() gas_percentage = list() absorbed_gasmix = new() uid = gl_uid++ @@ -230,7 +242,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /obj/machinery/power/supermatter_crystal/examine(mob/user) . = ..() - var/immune = HAS_TRAIT(user, TRAIT_MADNESS_IMMUNE) || (user.mind && HAS_TRAIT(user.mind, TRAIT_MADNESS_IMMUNE)) + var/immune = HAS_MIND_TRAIT(user, TRAIT_MADNESS_IMMUNE) if(isliving(user) && !immune && (get_dist(user, src) < SM_HALLUCINATION_RANGE(internal_energy))) . += span_danger("You get headaches just from looking at it.") . += delamination_strategy.examine(src) @@ -259,22 +271,25 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) // Some extra effects like [/datum/sm_gas/carbon_dioxide/extra_effects] // needs more than one gas and rely on a fully parsed gas_percentage. for (var/gas_path in absorbed_gasmix.gases) - var/datum/sm_gas/sm_gas = GLOB.sm_gas_behavior[gas_path] + var/datum/sm_gas/sm_gas = current_gas_behavior[gas_path] sm_gas?.extra_effects(src) // PART 3: POWER PROCESSING internal_energy_factors = calculate_internal_energy() - zap_factors = calculate_zap_multiplier() - if(internal_energy && (last_power_zap + 4 SECONDS - (internal_energy * 0.001)) < world.time) + zap_factors = calculate_zap_transmission_rate() + if(internal_energy && (last_power_zap + (4 - internal_energy * 0.001) SECONDS) < world.time) playsound(src, 'sound/weapons/emitter2.ogg', 70, TRUE) hue_angle_shift = clamp(903 * log(10, (internal_energy + 8000)) - 3590, -50, 240) var/zap_color = color_matrix_rotate_hue(hue_angle_shift) + //Scale the strength of the zap with the world's time elapsed between zaps in seconds. + //Capped at 16 seconds to prevent a crazy burst of energy if atmos was halted for a long time. + var/delta_time = min((world.time - last_power_zap) * 0.1, 16) supermatter_zap( zapstart = src, range = 3, - zap_str = 5 * internal_energy * zap_multiplier, + zap_str = internal_energy * zap_transmission_rate * delta_time, zap_flags = ZAP_SUPERMATTER_FLAGS, - zap_cutoff = 300, + zap_cutoff = 2.4e5 * delta_time, power_level = internal_energy, color = zap_color, ) @@ -312,6 +327,16 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) processing_sound() handle_high_power() psychological_examination() + + // handle the engineers that saved the engine from cascading, if there were any + if(get_status() < SUPERMATTER_EMERGENCY && !isnull(saviors)) + for(var/datum/weakref/savior_ref as anything in saviors) + var/mob/living/savior = savior_ref.resolve() + if(!istype(savior)) // didn't live to tell the tale, sadly. + continue + savior.client?.give_award(/datum/award/achievement/jobs/theoretical_limits, savior) + LAZYNULL(saviors) + if(prob(15)) supermatter_pull(loc, min(internal_energy/850, 3))//850, 1700, 2550 update_appearance() @@ -350,15 +375,20 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) "name" = factor, "amount" = amount * -1 )) + var/list/internal_energy_si_derived_data = siunit_isolated(internal_energy * 1e6, "eV", 3) data["internal_energy"] = internal_energy + data["internal_energy_coefficient"] = internal_energy_si_derived_data[SI_COEFFICIENT] + data["internal_energy_unit"] = internal_energy_si_derived_data[SI_UNIT] data["internal_energy_factors"] = list() for (var/factor in internal_energy_factors) + var/list/internal_energy_factor_si_derived_data = siunit_isolated(internal_energy_factors[factor] * 1e6, "eV", 3) var/amount = round(internal_energy_factors[factor], 0.01) if(!amount) continue data["internal_energy_factors"] += list(list( "name" = factor, - "amount" = amount + "amount" = internal_energy_factor_si_derived_data[SI_COEFFICIENT], + "unit" = internal_energy_factor_si_derived_data[SI_UNIT], )) data["temp_limit"] = temp_limit data["temp_limit_factors"] = list() @@ -368,7 +398,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) continue data["temp_limit_factors"] += list(list( "name" = factor, - "amount" = amount + "amount" = amount, )) data["waste_multiplier"] = waste_multiplier data["waste_multiplier_factors"] = list() @@ -378,18 +408,42 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) continue data["waste_multiplier_factors"] += list(list( "name" = factor, - "amount" = amount + "amount" = amount, )) - data["zap_multiplier"] = zap_multiplier - data["zap_multiplier_factors"] = list() + + data["zap_transmission_factors"] = list() for (var/factor in zap_factors) - var/amount = round(zap_factors[factor], 0.01) - if(!amount) + var/list/zap_factor_si_derived_data = siunit_isolated(zap_factors[factor] * internal_energy, "W", 2) + if(!zap_factor_si_derived_data[SI_COEFFICIENT]) continue - data["zap_multiplier_factors"] += list(list( + data["zap_transmission_factors"] += list(list( "name" = factor, - "amount" = amount + "amount" = zap_factor_si_derived_data[SI_COEFFICIENT], + "unit" = zap_factor_si_derived_data[SI_UNIT], + )) + + ///Add high energy bonus to the zap transmission data so we can accurately measure our power generation from zaps. + var/high_energy_bonus = 0 + var/zap_transmission = zap_transmission_rate * internal_energy + var/zap_power_multiplier = 1 + if(internal_energy > POWER_PENALTY_THRESHOLD) //Supermatter zaps multiply power internally under some conditions for some reason, so we'll snowflake this for now. + ///Power multiplier bonus applied to all zaps. Zap power generation doubles when it reaches 7GeV and 9GeV. + zap_power_multiplier *= 2 ** clamp(round((internal_energy - POWER_PENALTY_THRESHOLD) / 2000), 0, 2) + ///The supermatter releases additional zaps after 5GeV, with more at 7GeV and 9GeV. + var/additional_zap_bonus = clamp(internal_energy * 3200, 6.4e6, 3.2e7) * clamp(round(INVERSE_LERP(1000, 3000, internal_energy)), 1, 4) + high_energy_bonus = (zap_transmission + additional_zap_bonus) * zap_power_multiplier - zap_transmission + var/list/zap_factor_si_derived_data = siunit_isolated(high_energy_bonus, "W", 2) + data["zap_transmission_factors"] += list(list( + "name" = "High Energy Bonus", + "amount" = zap_factor_si_derived_data[SI_COEFFICIENT], + "unit" = zap_factor_si_derived_data[SI_UNIT], )) + + var/list/zap_transmission_si_derived_data = siunit_isolated(zap_transmission + high_energy_bonus, "W", 2) + data["zap_transmission"] = zap_transmission + high_energy_bonus + data["zap_transmission_coefficient"] = zap_transmission_si_derived_data[SI_COEFFICIENT] + data["zap_transmission_unit"] = zap_transmission_si_derived_data[SI_UNIT] + data["absorbed_ratio"] = absorption_ratio var/list/formatted_gas_percentage = list() for (var/datum/gas/gas_path as anything in subtypesof(/datum/gas)) @@ -488,10 +542,23 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) radio.talk_into( src, count_down_messages[1], - emergency_channel + emergency_channel, + list(SPAN_COMMAND) ) - for(var/i in SUPERMATTER_COUNTDOWN_TIME to 0 step -10) + var/delamination_countdown_time = SUPERMATTER_COUNTDOWN_TIME + // If a sliver was removed from the supermatter, the countdown time is significantly decreased + if (supermatter_sliver_removed == TRUE) + delamination_countdown_time = SUPERMATTER_SLIVER_REMOVED_COUNTDOWN_TIME + radio.talk_into( + src, + "WARNING: Projected time until full crystal delamination significantly lower than expected. \ + Please inspect crystal for structural abnormalities or sabotage!", + emergency_channel, + list(SPAN_COMMAND) + ) + + for(var/i in delamination_countdown_time to 0 step -10) if(last_delamination_strategy != delamination_strategy) count_down_messages = delamination_strategy.count_down_messages() last_delamination_strategy = delamination_strategy @@ -510,10 +577,21 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) else message = "[i*0.1]..." - radio.talk_into(src, message, emergency_channel) + radio.talk_into(src, message, emergency_channel, list(SPAN_COMMAND)) if(healed) final_countdown = FALSE + + if(!istype(delamination_strategy, /datum/sm_delam/cascade)) + return + + for(var/mob/living/lucky_engi as anything in mobs_in_area_type(list(/area/station/engineering/supermatter))) + if(isnull(lucky_engi.client)) + continue + if(isanimal_or_basicmob(lucky_engi)) + continue + LAZYADD(saviors, WEAKREF(lucky_engi)) + return // delam averted sleep(1 SECONDS) @@ -528,7 +606,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) * * Updates: * [/obj/machinery/power/supermatter_crystal/var/list/gas_percentage] - * [/obj/machinery/power/supermatter_crystal/var/gas_power_transmission] + * [/obj/machinery/power/supermatter_crystal/var/gas_power_transmission_rate] * [/obj/machinery/power/supermatter_crystal/var/gas_heat_modifier] * [/obj/machinery/power/supermatter_crystal/var/gas_heat_resistance] * [/obj/machinery/power/supermatter_crystal/var/gas_heat_power_generation] @@ -541,7 +619,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) return gas_percentage = list() - gas_power_transmission = 0 + gas_power_transmission_rate = 0 gas_heat_modifier = 0 gas_heat_resistance = 0 gas_heat_power_generation = 0 @@ -555,10 +633,10 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(mole_count < MINIMUM_MOLE_COUNT) //save processing power from small amounts like these continue gas_percentage[gas_path] = mole_count / total_moles - var/datum/sm_gas/sm_gas = GLOB.sm_gas_behavior[gas_path] + var/datum/sm_gas/sm_gas = current_gas_behavior[gas_path] if(!sm_gas) continue - gas_power_transmission += sm_gas.power_transmission * gas_percentage[gas_path] + gas_power_transmission_rate += sm_gas.power_transmission * gas_percentage[gas_path] gas_heat_modifier += sm_gas.heat_modifier * gas_percentage[gas_path] gas_heat_resistance += sm_gas.heat_resistance * gas_percentage[gas_path] gas_heat_power_generation += sm_gas.heat_power_generation * gas_percentage[gas_path] @@ -588,7 +666,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) external_power_trickle -= min(additive_power[SM_POWER_EXTERNAL_TRICKLE], external_power_trickle) additive_power[SM_POWER_EXTERNAL_IMMEDIATE] = external_power_immediate external_power_immediate = 0 - additive_power[SM_POWER_HEAT] = gas_heat_power_generation * absorbed_gasmix.temperature / 6 + additive_power[SM_POWER_HEAT] = gas_heat_power_generation * absorbed_gasmix.temperature * GAS_HEAT_POWER_SCALING_COEFFICIENT additive_power[SM_POWER_HEAT] && log_activation(who = "environmental factors") // I'm sorry for this, but we need to calculate power lost immediately after power gain. @@ -611,6 +689,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(internal_energy && !activation_logged) stack_trace("Supermatter powered for the first time without being logged. Internal energy factors: [json_encode(internal_energy_factors)]") activation_logged = TRUE // so we dont spam the log. + else if(!internal_energy) + last_power_zap = world.time return additive_power /** Log when the supermatter is activated for the first time. @@ -636,24 +716,24 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) activation_logged = TRUE /** - * Perform calculation for the main zap power multiplier. + * Perform calculation for the main zap power transmission rate in W/MeV. * Description of each factors can be found in the defines. * * Updates: - * [/obj/machinery/power/supermatter_crystal/var/zap_multiplier] + * [/obj/machinery/power/supermatter_crystal/var/zap_transmission_rate] * * Returns: The factors that have influenced the calculation. list[FACTOR_DEFINE] = number */ -/obj/machinery/power/supermatter_crystal/proc/calculate_zap_multiplier() - var/list/additive_transmission = list() - additive_transmission[SM_ZAP_BASE] = 1 - additive_transmission[SM_ZAP_GAS] = gas_power_transmission +/obj/machinery/power/supermatter_crystal/proc/calculate_zap_transmission_rate() + var/list/additive_transmission_rate = list() + additive_transmission_rate[SM_ZAP_BASE] = BASE_POWER_TRANSMISSION_RATE + additive_transmission_rate[SM_ZAP_GAS] = BASE_POWER_TRANSMISSION_RATE * gas_power_transmission_rate - zap_multiplier = 0 - for (var/transmission_types in additive_transmission) - zap_multiplier += additive_transmission[transmission_types] - zap_multiplier = max(zap_multiplier, 0) - return additive_transmission + zap_transmission_rate = 0 + for (var/transmission_types in additive_transmission_rate) + zap_transmission_rate += additive_transmission_rate[transmission_types] + zap_transmission_rate = max(zap_transmission_rate, 0) + return additive_transmission_rate /** * Perform calculation for the waste multiplier. @@ -787,7 +867,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) delamination_strategy.on_select(src) return TRUE -/obj/machinery/proc/supermatter_zap(atom/zapstart = src, range = 5, zap_str = 4000, zap_flags = ZAP_SUPERMATTER_FLAGS, list/targets_hit = list(), zap_cutoff = 1500, power_level = 0, zap_icon = DEFAULT_ZAP_ICON_STATE, color = null) +/obj/machinery/proc/supermatter_zap(atom/zapstart = src, range = 5, zap_str = 3.2e6, zap_flags = ZAP_SUPERMATTER_FLAGS, list/targets_hit = list(), zap_cutoff = 1.2e6, power_level = 0, zap_icon = DEFAULT_ZAP_ICON_STATE, color = null) if(QDELETED(zapstart)) return . = zapstart.dir @@ -882,16 +962,16 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) //Going boom should be rareish if(prob(80)) zap_flags &= ~ZAP_MACHINE_EXPLOSIVE - if(target_type == COIL) - var/multi = 2 - switch(power_level)//Between 7k and 9k it's 4, above that it's 8 + if(target_type == COIL || target_type == ROD) + var/multi = 1 + switch(power_level)//Between 7k and 9k it's 2, above that it's 4 if(SEVERE_POWER_PENALTY_THRESHOLD to CRITICAL_POWER_PENALTY_THRESHOLD) - multi = 4 + multi = 2 if(CRITICAL_POWER_PENALTY_THRESHOLD to INFINITY) - multi = 8 + multi = 4 if(zap_flags & ZAP_SUPERMATTER_FLAGS) var/remaining_power = target.zap_act(zap_str * multi, zap_flags) - zap_str = remaining_power * 0.5 //Coils should take a lot out of the power of the zap + zap_str = remaining_power / multi //Coils should take a lot out of the power of the zap else zap_str /= 3 @@ -926,6 +1006,14 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) child_targets_hit = targets_hit.Copy() //Pass by ref begone supermatter_zap(target, new_range, zap_str, zap_flags, child_targets_hit, zap_cutoff, power_level, zap_icon, color) +// For /datum/sm_delam to check if it should be sending an alert on common radio channel +/obj/machinery/power/supermatter_crystal/proc/should_alert_common() + if(!COOLDOWN_FINISHED(src, common_radio_cooldown)) + return FALSE + + COOLDOWN_START(src, common_radio_cooldown, SUPERMATTER_COMMON_RADIO_DELAY) + return TRUE + #undef BIKE #undef COIL #undef ROD diff --git a/code/modules/power/supermatter/supermatter_delamination/_sm_delam.dm b/code/modules/power/supermatter/supermatter_delamination/_sm_delam.dm index c10342792e42c..be085f281c904 100644 --- a/code/modules/power/supermatter/supermatter_delamination/_sm_delam.dm +++ b/code/modules/power/supermatter/supermatter_delamination/_sm_delam.dm @@ -21,9 +21,10 @@ GLOBAL_LIST_INIT(sm_delam_list, list( /// [/obj/machinery/power/supermatter_crystal/proc/count_down] /datum/sm_delam/proc/delaminate(obj/machinery/power/supermatter_crystal/sm) if (sm.is_main_engine) + SSpersistence.delam_highscore = SSpersistence.rounds_since_engine_exploded SSpersistence.rounds_since_engine_exploded = ROUNDCOUNT_ENGINE_JUST_EXPLODED - for (var/obj/structure/sign/delamination_counter/sign as anything in GLOB.map_delamination_counters) - sign.update_count(ROUNDCOUNT_ENGINE_JUST_EXPLODED) + for (var/obj/machinery/incident_display/sign as anything in GLOB.map_delamination_counters) + sign.update_delam_count(ROUNDCOUNT_ENGINE_JUST_EXPLODED) qdel(sm) #undef ROUNDCOUNT_ENGINE_JUST_EXPLODED @@ -44,6 +45,14 @@ GLOBAL_LIST_INIT(sm_delam_list, list( return FALSE sm.lastwarning = REALTIMEOFDAY + if(sm.damage_archived - sm.damage > SUPERMATTER_FAST_HEALING_RATE && sm.damage_archived >= sm.emergency_point) // Fast healing, engineers probably have it all sorted + if(sm.should_alert_common()) // We alert common once per cooldown period, otherwise alert engineering + sm.radio.talk_into(sm,"Crystalline hyperstructure returning to safe operating parameters. Integrity: [round(sm.get_integrity_percent(), 0.01)]%", sm.emergency_channel) + else + sm.radio.talk_into(sm,"Crystalline hyperstructure returning to safe operating parameters. Integrity: [round(sm.get_integrity_percent(), 0.01)]%", sm.warning_channel) + playsound(sm, 'sound/machines/terminal_alert.ogg', 75) + return FALSE + switch(sm.get_status()) if(SUPERMATTER_DELAMINATING) playsound(sm, 'sound/misc/bloblarm.ogg', 100, FALSE, 40, 30, falloff_distance = 10) @@ -54,13 +63,12 @@ GLOBAL_LIST_INIT(sm_delam_list, list( if(SUPERMATTER_WARNING) playsound(sm, 'sound/machines/terminal_alert.ogg', 75) - if(sm.damage < sm.damage_archived) // Healing - sm.radio.talk_into(sm,"Crystalline hyperstructure returning to safe operating parameters. Integrity: [round(sm.get_integrity_percent(), 0.01)]%", sm.damage_archived >= sm.emergency_point ? sm.emergency_channel : sm.warning_channel) - return FALSE - - if(sm.damage >= sm.emergency_point) // Taking damage, in emergency - sm.radio.talk_into(sm, "CRYSTAL DELAMINATION IMMINENT Integrity: [round(sm.get_integrity_percent(), 0.01)]%", sm.emergency_channel) + if(sm.damage >= sm.emergency_point) // In emergency + sm.radio.talk_into(sm, "CRYSTAL DELAMINATION IMMINENT! Integrity: [round(sm.get_integrity_percent(), 0.01)]%", sm.emergency_channel) sm.lastwarning = REALTIMEOFDAY - (SUPERMATTER_WARNING_DELAY / 2) // Cut the time to next announcement in half. + else if(sm.damage_archived > sm.damage) // Healing, in warning + sm.radio.talk_into(sm,"Crystalline hyperstructure returning to safe operating parameters. Integrity: [round(sm.get_integrity_percent(), 0.01)]%", sm.warning_channel) + return FALSE else // Taking damage, in warning sm.radio.talk_into(sm, "Danger! Crystal hyperstructure integrity faltering! Integrity: [round(sm.get_integrity_percent(), 0.01)]%", sm.warning_channel) diff --git a/code/modules/power/supermatter/supermatter_delamination/cascade_delam.dm b/code/modules/power/supermatter/supermatter_delamination/cascade_delam.dm index 106bc727bbdad..5d8cfecaa40d2 100644 --- a/code/modules/power/supermatter/supermatter_delamination/cascade_delam.dm +++ b/code/modules/power/supermatter/supermatter_delamination/cascade_delam.dm @@ -90,7 +90,7 @@ return FALSE priority_announce("Attention: Long range anomaly scans indicate abnormal quantities of harmonic flux originating from \ a subject within [station_name()], a resonance collapse may occur.", - "Nanotrasen Star Observation Association") + "Nanotrasen Star Observation Association", 'sound/misc/airraid.ogg') return TRUE /// Signal calls cant sleep, we gotta do this. diff --git a/code/modules/power/supermatter/supermatter_delamination/common_delams.dm b/code/modules/power/supermatter/supermatter_delamination/common_delams.dm index f82271171c047..dc4bea0bf4fb8 100644 --- a/code/modules/power/supermatter/supermatter_delamination/common_delams.dm +++ b/code/modules/power/supermatter/supermatter_delamination/common_delams.dm @@ -99,7 +99,7 @@ sm.add_filter(name = "icon", priority = 2, params = list( type = "layer", - icon = new/icon('icons/obj/engine/energy_ball.dmi', "energy_ball", frame = rand(1,12)), + icon = new/icon('icons/obj/machines/engine/energy_ball.dmi', "energy_ball", frame = rand(1,12)), flags = FILTER_UNDERLAY )) diff --git a/code/modules/power/supermatter/supermatter_delamination/delamination_effects.dm b/code/modules/power/supermatter/supermatter_delamination/delamination_effects.dm index d22f97578f9a5..25283c8d09ae9 100644 --- a/code/modules/power/supermatter/supermatter_delamination/delamination_effects.dm +++ b/code/modules/power/supermatter/supermatter_delamination/delamination_effects.dm @@ -120,7 +120,7 @@ // set supermatter cascade to true, to prevent auto evacuation due to no way of calling the shuttle SSshuttle.supermatter_cascade = TRUE // set hijack completion timer to infinity, so that you cant prematurely end the round with a hijack - for(var/obj/machinery/computer/emergency_shuttle/console in GLOB.machines) + for(var/obj/machinery/computer/emergency_shuttle/console as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/computer/emergency_shuttle)) console.hijack_completion_flight_time_set = INFINITY /* This logic is to keep uncalled shuttles uncalled @@ -164,7 +164,7 @@ if(SSsecurity_level.get_current_level_as_number() != SEC_LEVEL_DELTA) SSsecurity_level.set_level(SEC_LEVEL_DELTA) // skip the announcement and shuttle timer adjustment in set_security_level() make_maint_all_access() - for(var/obj/machinery/light/light_to_break in GLOB.machines) + for(var/obj/machinery/light/light_to_break as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/light)) if(prob(35)) light_to_break.set_major_emergency_light() continue @@ -211,7 +211,7 @@ sleep(10 SECONDS) SSticker.news_report = SUPERMATTER_CASCADE - SSticker.force_ending = TRUE + SSticker.force_ending = FORCE_END_ROUND /// Scatters crystal mass over the event spawns as long as they are at least 30 tiles away from whatever we want to avoid. /datum/sm_delam/proc/effect_crystal_mass(obj/machinery/power/supermatter_crystal/sm, avoid) diff --git a/code/modules/power/supermatter/supermatter_extra_effects.dm b/code/modules/power/supermatter/supermatter_extra_effects.dm index 62a66f11b8c99..efd84c677fafa 100644 --- a/code/modules/power/supermatter/supermatter_extra_effects.dm +++ b/code/modules/power/supermatter/supermatter_extra_effects.dm @@ -79,7 +79,7 @@ var/psy_coeff_diff = -0.05 for(var/mob/living/carbon/human/seen_by_sm in view(src, SM_HALLUCINATION_RANGE(internal_energy))) // Someone (generally a Psychologist), when looking at the SM within hallucination range makes it easier to manage. - if(HAS_TRAIT(seen_by_sm, TRAIT_SUPERMATTER_SOOTHER) || (seen_by_sm.mind && HAS_TRAIT(seen_by_sm.mind, TRAIT_SUPERMATTER_SOOTHER))) + if(HAS_MIND_TRAIT(seen_by_sm, TRAIT_SUPERMATTER_SOOTHER)) psy_coeff_diff = 0.05 visible_hallucination_pulse( center = src, @@ -91,6 +91,7 @@ /obj/machinery/power/supermatter_crystal/proc/handle_high_power() if(internal_energy <= POWER_PENALTY_THRESHOLD && damage <= danger_point) //If the power is above 5000 or if the damage is above 550 + last_high_energy_zap = world.time //Prevent oddly high initial zap due to high energy zaps not getting triggered via too low energy. return var/range = 4 zap_cutoff = 1500 @@ -99,7 +100,7 @@ var/temp = absorbed_gasmix.temperature if(pressure > 0 && temp > 0) //You may be able to freeze the zapstate of the engine with good planning, we'll see - zap_cutoff = clamp(3000 - (internal_energy * total_moles / 10) / temp, 350, 3000)//If the core is cold, it's easier to jump, ditto if there are a lot of mols + zap_cutoff = clamp(1.2e6 - (internal_energy * total_moles * 40) / temp, 1.4e5, 1.2e6)//If the core is cold, it's easier to jump, ditto if there are a lot of mols //We should always be able to zap our way out of the default enclosure //See supermatter_zap() for more details range = clamp(internal_energy / pressure * 10, 2, 7) @@ -128,9 +129,10 @@ if(zap_count >= 1) playsound(loc, 'sound/weapons/emitter2.ogg', 100, TRUE, extrarange = 10) + var/delta_time = min((world.time - last_high_energy_zap) * 0.1, 16) for(var/i in 1 to zap_count) - supermatter_zap(src, range, clamp(internal_energy*2, 4000, 20000), flags, zap_cutoff = src.zap_cutoff, power_level = internal_energy, zap_icon = src.zap_icon) - + supermatter_zap(src, range, clamp(internal_energy * 3200, 6.4e6, 3.2e7) * delta_time, flags, zap_cutoff = src.zap_cutoff * delta_time, power_level = internal_energy, zap_icon = src.zap_icon) + last_high_energy_zap = world.time if(prob(5)) supermatter_anomaly_gen(src, FLUX_ANOMALY, rand(5, 10)) if(prob(5)) diff --git a/code/modules/power/supermatter/supermatter_gas.dm b/code/modules/power/supermatter/supermatter_gas.dm index 141f78a38b8e2..df8ef8e5b4fa8 100644 --- a/code/modules/power/supermatter/supermatter_gas.dm +++ b/code/modules/power/supermatter/supermatter_gas.dm @@ -17,33 +17,40 @@ // Positive is true if more of the amount is a good thing. var/list/numeric_data = list() if(sm_gas.power_transmission) + var/list/si_derived_data = siunit_isolated(sm_gas.power_transmission * BASE_POWER_TRANSMISSION_RATE, "W/MeV", 2) numeric_data += list(list( - "name" = "Power Transmission", - "amount" = sm_gas.power_transmission, + "name" = "Power Transmission Bonus", + "amount" = si_derived_data["coefficient"], + "unit" = si_derived_data["unit"], "positive" = TRUE, )) if(sm_gas.heat_modifier) numeric_data += list(list( "name" = "Waste Multiplier", - "amount" = sm_gas.heat_modifier, + "amount" = 100 * sm_gas.heat_modifier, + "unit" = "%", "positive" = FALSE, )) if(sm_gas.heat_resistance) numeric_data += list(list( "name" = "Heat Resistance", - "amount" = sm_gas.heat_resistance, + "amount" = 100 * sm_gas.heat_resistance, + "unit" = "%", "positive" = TRUE, )) if(sm_gas.heat_power_generation) + var/list/si_derived_data = siunit_isolated(sm_gas.heat_power_generation * GAS_HEAT_POWER_SCALING_COEFFICIENT * 1e7 / SSair.wait, "eV/K/s", 2) numeric_data += list(list( "name" = "Heat Power Gain", - "amount" = sm_gas.heat_power_generation, + "amount" = si_derived_data["coefficient"], + "unit" = si_derived_data["unit"], "positive" = TRUE, )) if(sm_gas.powerloss_inhibition) numeric_data += list(list( "name" = "Power Decay Negation", - "amount" = sm_gas.powerloss_inhibition, + "amount" = 100 * sm_gas.powerloss_inhibition, + "unit" = "%", "positive" = TRUE, )) singular_gas_data["numeric_data"] = numeric_data @@ -59,8 +66,7 @@ GLOBAL_LIST_INIT(sm_gas_behavior, init_sm_gas()) /datum/sm_gas /// Path of the [/datum/gas] involved with this interaction. var/gas_path - - /// Influences zap power without interfering with the crystal's own energy. + /// Influences zap power without interfering with the crystal's own energy. Gets scaled by [BASE_POWER_TRANSMISSION_RATE]. var/power_transmission = 0 /// How much more waste heat and gas the SM generates. var/heat_modifier = 0 @@ -216,7 +222,7 @@ GLOBAL_LIST_INIT(sm_gas_behavior, init_sm_gas()) sm.supermatter_zap( sm, range = 6, - zap_str = clamp(sm.internal_energy * 2, 4000, 20000), + zap_str = clamp(sm.internal_energy * 1600, 3.2e6, 1.6e7), zap_flags = ZAP_MOB_STUN, zap_cutoff = sm.zap_cutoff, power_level = sm.internal_energy, diff --git a/code/modules/power/supermatter/supermatter_hit_procs.dm b/code/modules/power/supermatter/supermatter_hit_procs.dm index 5c68669e6e245..452b37e054100 100644 --- a/code/modules/power/supermatter/supermatter_hit_procs.dm +++ b/code/modules/power/supermatter/supermatter_hit_procs.dm @@ -67,6 +67,7 @@ if (scalpel.usesLeft) to_chat(user, span_danger("You extract a sliver from \the [src]. \The [src] begins to react violently!")) new /obj/item/nuke_core/supermatter_sliver(src.drop_location()) + supermatter_sliver_removed = TRUE external_power_trickle += 800 log_activation(who = user, how = scalpel) scalpel.usesLeft-- diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm index c68049b8dbbc5..4c861a4bb4b57 100644 --- a/code/modules/power/terminal.dm +++ b/code/modules/power/terminal.dm @@ -5,6 +5,7 @@ /obj/machinery/power/terminal name = "terminal" + icon = 'icons/obj/pipes_n_cables/structures.dmi' icon_state = "term" desc = "It's an underfloor wiring terminal, used to draw power from the grid." layer = WIRE_TERMINAL_LAYER //a bit above wires @@ -22,6 +23,13 @@ master = null return ..() +/obj/machinery/power/terminal/examine(mob/user) + . = ..() + if(!QDELETED(powernet)) + . += span_notice("It's operating on the [lowertext(GLOB.cable_layer_to_name["[cable_layer]"])].") + else + . += span_warning("It's disconnected from the [lowertext(GLOB.cable_layer_to_name["[cable_layer]"])].") + /obj/machinery/power/terminal/should_have_node() return TRUE @@ -38,7 +46,6 @@ if(panel_open) . = TRUE - /obj/machinery/power/terminal/proc/dismantle(mob/living/user, obj/item/I) if(isturf(loc)) var/turf/T = loc diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index c8d082f392892..3cf040b76ef78 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -1,18 +1,17 @@ // zap needs to be over this amount to get power -#define TESLA_COIL_THRESHOLD 80 -// each zap power unit produces 400 joules -#define ZAP_TO_ENERGY(p) (joules_to_energy((p) * 400)) +#define TESLA_COIL_THRESHOLD 32000 /obj/machinery/power/energy_accumulator/tesla_coil name = "tesla coil" desc = "For the union!" - icon = 'icons/obj/engine/tesla_coil.dmi' + icon = 'icons/obj/machines/engine/tesla_coil.dmi' icon_state = "coil0" // Executing a traitor caught releasing tesla was never this fun! can_buckle = TRUE buckle_lying = 0 buckle_requires_restraints = TRUE + can_change_cable_layer = TRUE circuit = /obj/item/circuitboard/machine/tesla_coil @@ -36,7 +35,13 @@ /obj/machinery/power/energy_accumulator/tesla_coil/Initialize(mapload) . = ..() - wires = new /datum/wires/tesla_coil(src) + set_wires(new /datum/wires/tesla_coil(src)) + +/obj/machinery/power/energy_accumulator/tesla_coil/cable_layer_change_checks(mob/living/user, obj/item/tool) + if(anchored) + balloon_alert(user, "unanchor first!") + return FALSE + return TRUE /obj/machinery/power/energy_accumulator/tesla_coil/RefreshParts() . = ..() @@ -100,7 +105,7 @@ power /= 10 zap_buckle_check(power) var/power_removed = powernet ? power * input_power_multiplier : power - stored_energy += max(ZAP_TO_ENERGY(power_removed - TESLA_COIL_THRESHOLD), 0) + stored_energy += max(joules_to_energy(power_removed - TESLA_COIL_THRESHOLD), 0) return max(power - power_removed, 0) //You get back the amount we didn't use /obj/machinery/power/energy_accumulator/tesla_coil/proc/zap() @@ -117,7 +122,7 @@ /obj/machinery/power/energy_accumulator/grounding_rod name = "grounding rod" desc = "Keeps an area from being fried by Edison's Bane." - icon = 'icons/obj/engine/tesla_coil.dmi' + icon = 'icons/obj/machines/engine/tesla_coil.dmi' icon_state = "grounding_rod0" anchored = FALSE density = TRUE @@ -163,10 +168,9 @@ if(anchored && !panel_open) flick("grounding_rodhit", src) zap_buckle_check(power) - stored_energy += ZAP_TO_ENERGY(power) + stored_energy += joules_to_energy(power) return 0 else . = ..() #undef TESLA_COIL_THRESHOLD -#undef ZAP_TO_ENERGY diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 5cafe635394c4..609a8375dac45 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -1,5 +1,5 @@ -#define TESLA_DEFAULT_POWER 1738260 -#define TESLA_MINI_POWER 869130 +#define TESLA_DEFAULT_POWER 6.95304e8 +#define TESLA_MINI_POWER 3.47652e8 //Zap constants, speeds up targeting #define BIKE (COIL + 1) #define COIL (ROD + 1) @@ -14,7 +14,7 @@ /obj/energy_ball name = "energy ball" desc = "An energy ball." - icon = 'icons/obj/engine/energy_ball.dmi' + icon = 'icons/obj/machines/engine/energy_ball.dmi' icon_state = "energy_ball" anchored = TRUE appearance_flags = LONG_GLIDE @@ -146,11 +146,10 @@ ) miniball.transform *= pick(0.3, 0.4, 0.5, 0.6, 0.7) - var/icon/I = icon(icon, icon_state,dir) + var/list/icon_dimensions = get_icon_dimensions(icon) - var/orbitsize = (I.Width() + I.Height()) * pick(0.4, 0.5, 0.6, 0.7, 0.8) + var/orbitsize = (icon_dimensions["width"] + icon_dimensions["height"]) * pick(0.4, 0.5, 0.6, 0.7, 0.8) orbitsize -= (orbitsize / world.icon_size) * (world.icon_size * 0.25) - miniball.orbit(src, orbitsize, pick(FALSE, TRUE), rand(10, 25), pick(3, 4, 5, 6, 36)) /obj/energy_ball/Bump(atom/A) @@ -206,7 +205,7 @@ if(!(zap_flags & ZAP_ALLOW_DUPLICATES)) LAZYSET(shocked_targets, source, TRUE) //I don't want no null refs in my list yeah? . = source.dir - if(power < 1000) + if(power < 4e5) return /* @@ -335,7 +334,7 @@ var/mob/living/closest_mob = closest_atom 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 + var/shock_damage = (zap_flags & ZAP_MOB_DAMAGE) ? (min(round(power/2.4e5), 90) + rand(-5, 5)) : 0 closest_mob.electrocute_act(shock_damage, source, 1, SHOCK_TESLA | ((zap_flags & ZAP_MOB_STUN) ? NONE : SHOCK_NOSTUN)) if(issilicon(closest_mob)) var/mob/living/silicon/S = closest_mob diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index 63733acf8a758..922f0ede64619 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -9,7 +9,7 @@ /obj/machinery/power/tracker name = "solar tracker" desc = "A solar directional tracker." - icon = 'icons/obj/solar.dmi' + icon = 'icons/obj/machines/solar.dmi' icon_state = "tracker_base" density = TRUE use_power = NO_POWER_USE diff --git a/code/modules/power/turbine/turbine.dm b/code/modules/power/turbine/turbine.dm index 2ec930d36d414..bb4afcede94c5 100644 --- a/code/modules/power/turbine/turbine.dm +++ b/code/modules/power/turbine/turbine.dm @@ -1,7 +1,11 @@ +#define MINIMUM_TURBINE_PRESSURE 0.01 +#define PRESSURE_MAX(value)(max((value), MINIMUM_TURBINE_PRESSURE)) + /obj/machinery/power/turbine density = TRUE resistance_flags = FIRE_PROOF can_atmos_pass = ATMOS_PASS_DENSITY + processing_flags = NONE ///Theoretical volume of gas that's moving through the turbine, it expands the further it goes var/gas_theoretical_volume = 0 @@ -45,8 +49,11 @@ update_appearance() -/obj/machinery/power/turbine/Destroy() +/obj/machinery/power/turbine/LateInitialize() + . = ..() + activate_parts() +/obj/machinery/power/turbine/Destroy() air_update_turf(TRUE) if(installed_part) @@ -55,8 +62,32 @@ if(machine_gasmix) machine_gasmix = null + deactivate_parts() return ..() +/** + * Handles all the calculations needed for the gases, work done, temperature increase/decrease + */ +/obj/machinery/power/turbine/proc/transfer_gases(datum/gas_mixture/input_mix, datum/gas_mixture/output_mix, work_amount_to_remove, intake_size = 1) + //pump gases. if no gases were transferred then no work was done + var/output_pressure = PRESSURE_MAX(output_mix.return_pressure()) + var/datum/gas_mixture/transferred_gases = input_mix.pump_gas_to(output_mix, input_mix.return_pressure() * intake_size) + if(!transferred_gases) + return 0 + + //compute work done + var/work_done = QUANTIZE(transferred_gases.total_moles()) * R_IDEAL_GAS_EQUATION * transferred_gases.temperature * log((transferred_gases.volume * PRESSURE_MAX(transferred_gases.return_pressure())) / (output_mix.volume * output_pressure)) * TURBINE_WORK_CONVERSION_MULTIPLIER + if(work_amount_to_remove) + work_done = work_done - work_amount_to_remove + + //compute temperature & work from temperature if that is a lower value + var/output_mix_heat_capacity = output_mix.heat_capacity() + if(!output_mix_heat_capacity) + return 0 + work_done = min(work_done, (output_mix_heat_capacity * output_mix.temperature - output_mix_heat_capacity * TCMB) / TURBINE_HEAT_CONVERSION_MULTIPLIER) + output_mix.temperature = max((output_mix.temperature * output_mix_heat_capacity + work_done * TURBINE_HEAT_CONVERSION_MULTIPLIER) / output_mix_heat_capacity, TCMB) + return work_done + /obj/machinery/power/turbine/block_superconductivity() return TRUE @@ -84,24 +115,21 @@ /obj/machinery/power/turbine/screwdriver_act(mob/living/user, obj/item/tool) if(active) - to_chat(user, "You can't open [src] while it's on!") + balloon_alert(user, "turn it off!") return TOOL_ACT_TOOLTYPE_SUCCESS if(!anchored) - to_chat(user, span_notice("Anchor [src] first!")) - return TOOL_ACT_TOOLTYPE_SUCCESS - - if(panel_open && !installed_part) - to_chat(user, "You need to install [initial(part_path.name)] first!") + balloon_alert(user, "anchor first!") return TOOL_ACT_TOOLTYPE_SUCCESS tool.play_tool_sound(src, 50) toggle_panel_open() if(panel_open) - disable_parts(user) + deactivate_parts(user) else - enable_parts(user) + activate_parts(user) balloon_alert(user, "you [panel_open ? "open" : "close"] the maintenance hatch of [src]") update_appearance() + return TOOL_ACT_TOOLTYPE_SUCCESS /obj/machinery/power/turbine/wrench_act(mob/living/user, obj/item/tool) @@ -118,31 +146,34 @@ /obj/machinery/power/turbine/crowbar_act_secondary(mob/living/user, obj/item/tool) if(!panel_open) balloon_alert(user, "panel is closed!") - return + return TOOL_ACT_TOOLTYPE_SUCCESS if(!installed_part) balloon_alert(user, "no rotor installed!") - return + return TOOL_ACT_TOOLTYPE_SUCCESS if(active) balloon_alert(user, "[src] is on!") - return + return TOOL_ACT_TOOLTYPE_SUCCESS user.put_in_hands(installed_part) + return TOOL_ACT_TOOLTYPE_SUCCESS /** * Allow easy enabling of each machine for connection to the main controller */ -/obj/machinery/power/turbine/proc/enable_parts(mob/user) +/obj/machinery/power/turbine/proc/activate_parts(mob/user, check_only = FALSE) can_connect = TRUE /** * Allow easy disabling of each machine from the main controller */ -/obj/machinery/power/turbine/proc/disable_parts(mob/user) +/obj/machinery/power/turbine/proc/deactivate_parts(mob/user) can_connect = FALSE /obj/machinery/power/turbine/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) . = ..() - disable_parts() + set_panel_open(TRUE) + update_appearance() + deactivate_parts() air_update_turf(TRUE) /obj/machinery/power/turbine/Exited(atom/movable/gone, direction) @@ -150,25 +181,20 @@ if(gone == installed_part) installed_part = null -/obj/machinery/power/turbine/attackby(obj/item/object, mob/user, params) - if(active) - balloon_alert(user, "turn off the machine first") - return ..() - - if(!panel_open) - balloon_alert(user, "open the maintenance hatch first") - return ..() - +/obj/machinery/power/turbine/attackby(obj/item/turbine_parts/object, mob/user, params) + //not the correct part if(!istype(object, part_path)) return ..() - install_part(object, user) + //not in a state to accep the part. return TRUE so we don't bash the machine and damage it + if(active) + balloon_alert(user, "turn off the machine first!") + return TRUE + if(!panel_open) + balloon_alert(user, "open the maintenance hatch first!") + return TRUE -/** - * Checks if the machine part we are installing is an improvement over the installed one (if present) - * Currently it doesn't allow worst parts to be installed - */ -/obj/machinery/power/turbine/proc/install_part(obj/item/turbine_parts/part_object, mob/user) + //install the part if(!do_after(user, 2 SECONDS, src)) return if(installed_part) @@ -176,9 +202,8 @@ balloon_alert(user, "replaced part with the one in hand") else balloon_alert(user, "installed new part") - user.transferItemToLoc(part_object, src) - installed_part = part_object - calculate_parts_limits() + user.transferItemToLoc(object, src) + installed_part = object /** * Gets the efficiency of the installed part, returns 0 if no part is installed @@ -188,16 +213,10 @@ return installed_part.part_efficiency return 0 -/** - * Called when installing new parts and when activating the main machine - */ -/obj/machinery/power/turbine/proc/calculate_parts_limits() - return - /obj/machinery/power/turbine/inlet_compressor name = "inlet compressor" desc = "The input side of a turbine generator, contains the compressor." - icon = 'icons/obj/turbine/turbine.dmi' + icon = 'icons/obj/machines/engine/turbine.dmi' icon_state = "inlet_compressor" circuit = /obj/item/circuitboard/machine/turbine_compressor @@ -212,13 +231,54 @@ off_overlay = "inlet_off" open_overlay = "inlet_open" + /// The rotor this inlet is linked to + var/obj/machinery/power/turbine/core_rotor/rotor + /// The turf from which it absorbs gases from + var/turf/open/input_turf + /// Work acheived during compression + var/compressor_work + /// Pressure of gases absorbed + var/compressor_pressure + ///Ratio of the amount of gas going in the turbine + var/intake_regulator = 0.5 + +/obj/machinery/power/turbine/inlet_compressor/deactivate_parts(mob/user) + . = ..() + if(!QDELETED(rotor)) + rotor.deactivate_parts() + rotor = null + input_turf = null + +/** + * transfer's gases from it's input turf to it's internal gas mix + * Returns temperature of the gas mix absorbed only if some work was done + */ +/obj/machinery/power/turbine/inlet_compressor/proc/compress_gases() + compressor_work = 0 + compressor_pressure = MINIMUM_TURBINE_PRESSURE + if(QDELETED(input_turf)) + input_turf = get_step(loc, REVERSE_DIR(dir)) + + var/datum/gas_mixture/input_turf_mixture = input_turf.return_air() + if(!input_turf_mixture) + return 0 + + //the compressor compresses down the gases from 2500 L to 1000 L + //the temperature and pressure rises up, you can regulate this to increase/decrease the amount of gas moved in. + compressor_work = transfer_gases(input_turf_mixture, machine_gasmix, work_amount_to_remove = 0, intake_size = intake_regulator) + input_turf.update_visuals() + input_turf.air_update_turf(TRUE) + compressor_pressure = PRESSURE_MAX(machine_gasmix.return_pressure()) + + return input_turf_mixture.temperature + /obj/machinery/power/turbine/inlet_compressor/constructed mapped = FALSE /obj/machinery/power/turbine/turbine_outlet name = "turbine outlet" desc = "The output side of a turbine generator, contains the turbine and the stator." - icon = 'icons/obj/turbine/turbine.dmi' + icon = 'icons/obj/machines/engine/turbine.dmi' icon_state = "turbine_outlet" circuit = /obj/item/circuitboard/machine/turbine_stator @@ -233,14 +293,44 @@ off_overlay = "outlet_off" open_overlay = "outlet_open" + /// The rotor this outlet is linked to + var/obj/machinery/power/turbine/core_rotor/rotor + /// The turf to puch the gases out into + var/turf/open/output_turf + +/obj/machinery/power/turbine/turbine_outlet/deactivate_parts(mob/user) + . = ..() + if(!QDELETED(rotor)) + rotor.deactivate_parts() + rotor = null + output_turf = null + +/// push gases from its gas mix to output turf +/obj/machinery/power/turbine/turbine_outlet/proc/expel_gases() + if(QDELETED(output_turf)) + output_turf = get_step(loc, dir) + //turf is blocked don't eject gases + if(!TURF_SHARES(output_turf)) + return FALSE + + //eject gases and update turf is any was ejected + var/datum/gas_mixture/ejected_gases = machine_gasmix.pump_gas_to(output_turf.air, machine_gasmix.return_pressure()) + if(ejected_gases) + output_turf.update_visuals() + output_turf.air_update_turf(TRUE) + + //return ejected gases + return ejected_gases + /obj/machinery/power/turbine/turbine_outlet/constructed mapped = FALSE /obj/machinery/power/turbine/core_rotor name = "core rotor" desc = "The middle part of a turbine generator, contains the rotor and the main computer." - icon = 'icons/obj/turbine/turbine.dmi' + icon = 'icons/obj/machines/engine/turbine.dmi' icon_state = "core_rotor" + can_change_cable_layer = TRUE circuit = /obj/item/circuitboard/machine/turbine_rotor @@ -263,11 +353,6 @@ ///Reference to the turbine var/obj/machinery/power/turbine/turbine_outlet/turbine - ///Reference to the input turf - var/turf/open/input_turf - ///Reference to the output turf - var/turf/open/output_turf - ///Rotation per minute the machine is doing var/rpm ///Amount of power the machine is producing @@ -275,8 +360,6 @@ ///Check to see if all parts are connected to the core var/all_parts_connected = FALSE - ///If the machine was completed before reopening it, try to remake it - var/was_complete = FALSE ///Max rmp that the installed parts can handle, limits the rpms var/max_allowed_rpm = 0 @@ -294,8 +377,6 @@ var/radio_key = /obj/item/encryptionkey/headset_eng ///The engineering channel var/engineering_channel = "Engineering" - ///Ratio of the amount of gas going in the turbine - var/intake_regulator = 0.5 COOLDOWN_DECLARE(turbine_damage_alert) @@ -311,120 +392,136 @@ new /obj/item/paper/guides/jobs/atmos/turbine(loc) -/obj/machinery/power/turbine/core_rotor/LateInitialize() - . = ..() - activate_parts() - /obj/machinery/power/turbine/core_rotor/Destroy() - disable_parts() QDEL_NULL(radio) return ..() -/obj/machinery/power/turbine/core_rotor/enable_parts(mob/user) +/obj/machinery/power/turbine/core_rotor/examine(mob/user) . = ..() - if(was_complete) - was_complete = FALSE - activate_parts(user) + if(!panel_open) + . += span_notice("[EXAMINE_HINT("screw")] open its panel to change cable layer.") + if(!all_parts_connected) + . += span_warning("The parts need to be linked via a [EXAMINE_HINT("multitool")]") -/obj/machinery/power/turbine/core_rotor/disable_parts(mob/user) - . = ..() - if(all_parts_connected) - was_complete = TRUE - deactivate_parts() +/obj/machinery/power/turbine/core_rotor/cable_layer_change_checks(mob/living/user, obj/item/tool) + if(!panel_open) + balloon_alert(user, "open panel first!") + return FALSE + return TRUE /obj/machinery/power/turbine/core_rotor/multitool_act(mob/living/user, obj/item/tool) - if(!all_parts_connected && activate_parts(user)) - balloon_alert(user, "all parts are linked") - return TOOL_ACT_TOOLTYPE_SUCCESS + //allow cable layer changing + if(panel_open) + return ..() -/obj/machinery/power/turbine/core_rotor/multitool_act_secondary(mob/living/user, obj/item/tool) - if(!all_parts_connected) + //failed checks + if(!activate_parts(user)) return TOOL_ACT_TOOLTYPE_SUCCESS + + //log rotor to link later to computer + balloon_alert(user, "all parts linked") var/obj/item/multitool/multitool = tool - multitool.buffer = src + multitool.set_buffer(src) to_chat(user, span_notice("You store linkage information in [tool]'s buffer.")) - return TOOL_ACT_TOOLTYPE_SUCCESS -/** - * Called to activate the complete machine, checks for part presence, correct orientation and installed parts - * Registers the input/output turfs and start process_atmos() - */ -/obj/machinery/power/turbine/core_rotor/proc/activate_parts(mob/user, check_only = FALSE) + //success + return TOOL_ACT_TOOLTYPE_SUCCESS - compressor = locate(/obj/machinery/power/turbine/inlet_compressor) in get_step(src, turn(dir, 180)) - turbine = locate(/obj/machinery/power/turbine/turbine_outlet) in get_step(src, dir) +/obj/machinery/power/turbine/core_rotor/multitool_act_secondary(mob/living/user, obj/item/tool) + //allow cable layer changing + if(panel_open) + return ..() - if(!compressor || !turbine) - if(user) - balloon_alert(user, "missing parts detected") - return FALSE + //works same as regular left click + return multitool_act(user, tool) - var/parts_present = TRUE - if(compressor.dir != dir || !compressor.can_connect || !compressor.installed_part) - if(user) - balloon_alert(user, "error while activating the compressor") - parts_present = FALSE - if(turbine.dir != dir || !turbine.can_connect || !turbine.installed_part) - if(user) - balloon_alert(user, "error while activating the turbine") - parts_present = FALSE - - if(!parts_present) - all_parts_connected = FALSE - return FALSE +/// convinience proc for balloon alert which returns if viewer is null +/obj/machinery/power/turbine/core_rotor/proc/feedback(mob/viewer, text) + if(isnull(viewer)) + return + balloon_alert(viewer, text) - if(check_only) +/** + * Called to activate the complete machine, checks for part presence, correct orientation and installed parts + * Registers the input/output turfs + */ +/obj/machinery/power/turbine/core_rotor/activate_parts(mob/user, check_only = FALSE) + //if this is not a checkup and all parts are connected then we have nothing to do + if(!check_only && all_parts_connected) return TRUE - input_turf = get_step(compressor.loc, turn(dir, 180)) - output_turf = get_step(turbine.loc, dir) - + //locate compressor & turbine, when checking we simply check to see if they are still there + if(!check_only) + compressor = locate(/obj/machinery/power/turbine/inlet_compressor) in get_step(src, REVERSE_DIR(dir)) + turbine = locate(/obj/machinery/power/turbine/turbine_outlet) in get_step(src, dir) + + //maybe look for them the other way around. we want the rotor to allign with them either way for player convinience + if(!compressor && !turbine) + compressor = locate(/obj/machinery/power/turbine/inlet_compressor) in get_step(src, dir) + turbine = locate(/obj/machinery/power/turbine/turbine_outlet) in get_step(src, REVERSE_DIR(dir)) + + //sanity checks for compressor + if(QDELETED(compressor)) + feedback(user, "missing compressor!") + return (all_parts_connected = FALSE) + if(compressor.dir != dir && compressor.dir != REVERSE_DIR(dir)) //make sure it's not perpendicular to the rotor + feedback(user, "compressor not aligned with rotor!") + return (all_parts_connected = FALSE) + if(!compressor.can_connect) + feedback(user, "close compressor panel!") + return (all_parts_connected = FALSE) + if(!compressor.installed_part) + feedback(user, "compressor has a missing part!") + return (all_parts_connected = FALSE) + + //sanity checks for turbine + if(QDELETED(turbine)) + feedback(user, "missing turbine!") + return (all_parts_connected = FALSE) + if(turbine.dir != dir && turbine.dir != REVERSE_DIR(dir)) + feedback(user, "turbine not aligned with rotor!") + return (all_parts_connected = FALSE) + if(!turbine.can_connect) + feedback(user, "turbine panel is either open or is misplaced!") //we say misplaced because can_connect becomes FALSE when this turbine is moved + return (all_parts_connected = FALSE) + if(!turbine.installed_part) + feedback(user, "turbine is missing stator part!") + return (all_parts_connected = FALSE) + + //final sanity check to make sure turbine & compressor are facing the same direction. From an visual perspective they will appear facing away from each other actually. I know blame spriter's + if(compressor.dir != turbine.dir) + feedback(user, "turbine & compressor are not facing away from each other!") + return (all_parts_connected = FALSE) + + //all checks successfull remember result all_parts_connected = TRUE + if(check_only) + return TRUE - calculate_parts_limits() + compressor.rotor = src + turbine.rotor = src + max_allowed_rpm = (compressor.installed_part.max_rpm + turbine.installed_part.max_rpm + installed_part.max_rpm) / 3 + max_allowed_temperature = (compressor.installed_part.max_temperature + turbine.installed_part.max_temperature + installed_part.max_temperature) / 3 + connect_to_network() - SSair.start_processing_machine(src) return TRUE /** * Allows to null the various machines and references from the main core */ -/obj/machinery/power/turbine/core_rotor/proc/deactivate_parts() +/obj/machinery/power/turbine/core_rotor/deactivate_parts() if(all_parts_connected) power_off() compressor = null turbine = null - input_turf = null - output_turf = null all_parts_connected = FALSE + disconnect_from_network() SSair.stop_processing_machine(src) /obj/machinery/power/turbine/core_rotor/on_deconstruction() - if(all_parts_connected) - deactivate_parts() + deactivate_parts() return ..() -/obj/machinery/power/turbine/core_rotor/calculate_parts_limits() - if(activate_parts(check_only = TRUE)) - max_allowed_rpm = (compressor.installed_part.max_rpm + turbine.installed_part.max_rpm + installed_part.max_rpm) / 3 - max_allowed_temperature = (compressor.installed_part.max_temperature + turbine.installed_part.max_temperature + installed_part.max_temperature) / 3 - -/** - * Called on each atmos tick, calculates the damage done and healed based on temperature - */ -/obj/machinery/power/turbine/core_rotor/proc/calculate_damage_done(temperature) - damage_archived = damage - var/temperature_difference = temperature - max_allowed_temperature - var/damage_done = round(log(90, max(temperature_difference, 1)), 0.5) - - damage = max(damage + damage_done * 0.5, 0) - damage = min(damage_archived + TURBINE_MAX_TAKEN_DAMAGE, damage) - if(temperature_difference < 0) - damage = max(damage - TURBINE_DAMAGE_HEALING, 0) - - if((damage - damage_archived >= 2 || damage > TURBINE_DAMAGE_ALARM_START) && COOLDOWN_FINISHED(src, turbine_damage_alert)) - damage_alert(damage_done) - /** * Toggle power on and off, not safe */ @@ -436,51 +533,52 @@ /** * Activate all three parts, not safe, it assumes the machine already connected and properly working + * It does a minimun check to ensure the parts still exist */ /obj/machinery/power/turbine/core_rotor/proc/power_on() + if(active || QDELETED(compressor) || QDELETED(turbine)) + return active = TRUE compressor.active = TRUE turbine.active = TRUE call_parts_update_appearance() + SSair.start_processing_machine(src) + +/** + * Calls all parts update appearance proc. + */ +/obj/machinery/power/turbine/core_rotor/proc/call_parts_update_appearance() + update_appearance() + if(!QDELETED(compressor)) + compressor.update_appearance() + if(!QDELETED(turbine)) + turbine.update_appearance() /** * Deactivate all three parts, not safe, it assumes the machine already connected and properly working + * will try to turn off whatever components are left of this machine */ /obj/machinery/power/turbine/core_rotor/proc/power_off() + if(!active) + return active = FALSE - compressor.active = FALSE - turbine.active = FALSE + if(!QDELETED(compressor)) + compressor.active = FALSE + if(!QDELETED(turbine)) + turbine.active = FALSE call_parts_update_appearance() - -/** - * Calls all parts update appearance proc. - */ -/obj/machinery/power/turbine/core_rotor/proc/call_parts_update_appearance() - update_appearance() - compressor?.update_appearance() - turbine?.update_appearance() + SSair.stop_processing_machine(src) /** * Returns true if all parts have their panel closed */ /obj/machinery/power/turbine/core_rotor/proc/all_parts_ready() + if(QDELETED(compressor)) + return FALSE + if(QDELETED(turbine)) + return FALSE return !panel_open && !compressor.panel_open && !turbine.panel_open -/** - * Called once every 15 to 5 seconds (depend on damage done), handles alarm calls - */ -/obj/machinery/power/turbine/core_rotor/proc/damage_alert(damage_done) - COOLDOWN_START(src, turbine_damage_alert, max(round(TURBINE_DAMAGE_ALARM_START - damage_done), 5) SECONDS) - - var/integrity = get_turbine_integrity() - - if(integrity <= 0) - failure() - return - - radio.talk_into(src, "Warning, turbine at [get_area_name(src)] taking damage, current integrity at [integrity]%!", engineering_channel) - playsound(src, 'sound/machines/engine_alert1.ogg', 100, FALSE, 30, 30, falloff_distance = 10) - /** * Getter for turbine integrity, return the amount in % */ @@ -489,85 +587,67 @@ integrity = max(round(100 - integrity * 100, 0.01), 0) return integrity -/** - * Called when the integrity reaches 0%, explode the machine based on the reached RPM - */ -/obj/machinery/power/turbine/core_rotor/proc/failure() - deactivate_parts() - if(rpm < 35000) - explosion(src, 0, 1, 4) - return - if(rpm < 87500) - explosion(src, 0, 2, 6) - return - if(rpm < 220000) - explosion(src, 1, 3, 7) - return - if(rpm < 550000) - explosion(src, 2, 5, 7) - /obj/machinery/power/turbine/core_rotor/process_atmos() + if(!active || !activate_parts(check_only = TRUE)) + power_off() + return PROCESS_KILL - if(!active || !all_parts_connected) - return - - var/datum/gas_mixture/input_turf_mixture = input_turf.return_air() - - if(!input_turf_mixture) - return - - calculate_damage_done(input_turf_mixture.temperature) - - //the compressor compresses down the gases from 2500 L to 1000 L - //the temperature and pressure rises up, you can regulate this to increase/decrease the amount of gas moved in. - var/compressor_work = do_calculations(input_turf_mixture, compressor.machine_gasmix, regulated = TRUE) - input_turf.air_update_turf(TRUE) - var/compressor_pressure = max(compressor.machine_gasmix.return_pressure(), 0.01) - - //the rotor moves the gases that expands from 1000 L to 3000 L, they cool down and both temperature and pressure lowers - var/rotor_work = do_calculations(compressor.machine_gasmix, machine_gasmix, compressor_work) - + //===============COMPRESSOR WORKING========// + //Transfer gases from turf to compressor + var/temperature = compressor.compress_gases() + //Compute damage taken based on temperature + damage_archived = damage + var/temperature_difference = temperature - max_allowed_temperature + var/damage_done = round(log(90, max(temperature_difference, 1)), 0.5) + damage = max(damage + damage_done * 0.5, 0) + damage = min(damage_archived + TURBINE_MAX_TAKEN_DAMAGE, damage) + if(temperature_difference < 0) + damage = max(damage - TURBINE_DAMAGE_HEALING, 0) + //Apply damage if it passes threshold limits + if((damage - damage_archived >= 2 || damage > TURBINE_DAMAGE_ALARM_START) && COOLDOWN_FINISHED(src, turbine_damage_alert)) + COOLDOWN_START(src, turbine_damage_alert, max(round(TURBINE_DAMAGE_ALARM_START - damage_done), 5) SECONDS) + //Boom! + var/integrity = get_turbine_integrity() + if(integrity <= 0) + deactivate_parts() + if(rpm < 35000) + explosion(src, 0, 1, 4) + return PROCESS_KILL + if(rpm < 87500) + explosion(src, 0, 2, 6) + return PROCESS_KILL + if(rpm < 220000) + explosion(src, 1, 3, 7) + return PROCESS_KILL + if(rpm < 550000) + explosion(src, 2, 5, 7) + return PROCESS_KILL + radio.talk_into(src, "Warning, turbine at [get_area_name(src)] taking damage, current integrity at [integrity]%!", engineering_channel) + playsound(src, 'sound/machines/engine_alert1.ogg', 100, FALSE, 30, 30, falloff_distance = 10) + + //================ROTOR WORKING============// + //The Rotor moves the gases that expands from 1000 L to 3000 L, they cool down and both temperature and pressure lowers + var/rotor_work = transfer_gases(compressor.machine_gasmix, machine_gasmix, compressor.compressor_work) //the turbine expands the gases more from 3000 L to 6000 L, cooling them down further. - var/turbine_work = do_calculations(machine_gasmix, turbine.machine_gasmix, abs(rotor_work)) - - var/turbine_pressure = max(turbine.machine_gasmix.return_pressure(), 0.01) - - //the total work done by the gas - var/work_done = turbine.machine_gasmix.total_moles() * R_IDEAL_GAS_EQUATION * turbine.machine_gasmix.temperature * log(compressor_pressure / turbine_pressure) - + var/turbine_work = transfer_gases(machine_gasmix, turbine.machine_gasmix, abs(rotor_work)) + + //================TURBINE WORKING============// + //Calculate final power generated based on how much gas was ejected from the turbine + var/datum/gas_mixture/ejected_gases = turbine.expel_gases() + if(!ejected_gases) //output turf was blocked with high pressure/temperature gases or by some structure so no power generated + rpm = 0 + produced_energy = 0 + return + var/work_done = QUANTIZE(ejected_gases.total_moles()) * R_IDEAL_GAS_EQUATION * ejected_gases.temperature * log(compressor.compressor_pressure / PRESSURE_MAX(ejected_gases.return_pressure())) //removing the work needed to move the compressor but adding back the turbine work that is the one generating most of the power. - work_done = max(work_done - compressor_work * TURBINE_COMPRESSOR_STATOR_INTERACTION_MULTIPLIER - turbine_work, 0) - + work_done = max(work_done - compressor.compressor_work * TURBINE_COMPRESSOR_STATOR_INTERACTION_MULTIPLIER - turbine_work, 0) + //calculate final acheived rpm rpm = ((work_done * compressor.get_efficiency()) ** turbine.get_efficiency()) * get_efficiency() / TURBINE_RPM_CONVERSION - rpm = min(rpm, max_allowed_rpm) - + rpm = FLOOR(min(rpm, max_allowed_rpm), 1) + //add energy into the grid produced_energy = rpm * TURBINE_ENERGY_RECTIFICATION_MULTIPLIER * TURBINE_RPM_CONVERSION - add_avail(produced_energy) - turbine.machine_gasmix.pump_gas_to(output_turf.air, turbine.machine_gasmix.return_pressure()) - output_turf.air_update_turf(TRUE) - -/** - * Handles all the calculations needed for the gases, work done, temperature increase/decrease - */ -/obj/machinery/power/turbine/core_rotor/proc/do_calculations(datum/gas_mixture/input_mix, datum/gas_mixture/output_mix, work_amount_to_remove, regulated = FALSE) - var/work_done = input_mix.total_moles() * R_IDEAL_GAS_EQUATION * input_mix.temperature * log((input_mix.volume * max(input_mix.return_pressure(), 0.01)) / (output_mix.volume * max(output_mix.return_pressure(), 0.01))) * TURBINE_WORK_CONVERSION_MULTIPLIER - if(work_amount_to_remove) - work_done = work_done - work_amount_to_remove - - var/intake_size = 1 - if(regulated) - intake_size = intake_regulator - - input_mix.pump_gas_to(output_mix, input_mix.return_pressure() * intake_size) - var/output_mix_heat_capacity = output_mix.heat_capacity() - if(!output_mix_heat_capacity) - return 0 - work_done = min(work_done, (output_mix_heat_capacity * output_mix.temperature - output_mix_heat_capacity * TCMB) / TURBINE_HEAT_CONVERSION_MULTIPLIER) - output_mix.temperature = max((output_mix.temperature * output_mix_heat_capacity + work_done * TURBINE_HEAT_CONVERSION_MULTIPLIER) / output_mix_heat_capacity, TCMB) - return work_done - /obj/item/paper/guides/jobs/atmos/turbine name = "paper- 'Quick guide on the new and improved turbine!'" default_raw_text = "How to operate the turbine
    \ @@ -578,3 +658,6 @@ -There are 4 tiers for these items, only the first tier can be printed. The next tier of each part can be made by using various materials on the part (clicking with the material in hand, on the part). The material required to reach the next tier is stated in the part's examine text, try shift clicking it!
    \ -Each tier increases the efficiency (more power), the max reachable RPM, and the max temperature that the machine can process without taking damage (up to fusion temperatures at the last tier!).
    \ -A word of warning, the machine is very inefficient in its gas consumption and many unburnt gases will pass through. If you want to be cheap you can either pre-burn the gases or add a filtering system to collect the unburnt gases and reuse them." + +#undef PRESSURE_MAX +#undef MINIMUM_TURBINE_PRESSURE diff --git a/code/modules/power/turbine/turbine_computer.dm b/code/modules/power/turbine/turbine_computer.dm index 5d1460b331f7e..8e8ba8deb4c76 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 as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/turbine/core_rotor)) if(main.mapping_id != mapping_id) continue register_machine(main) @@ -61,17 +61,14 @@ data["active"] = main_control.active data["rpm"] = main_control.rpm ? main_control.rpm : 0 data["power"] = main_control.produced_energy ? main_control.produced_energy : 0 - data["temp"] = main_control.input_turf?.air.temperature + data["temp"] = main_control.compressor.input_turf?.air.temperature data["integrity"] = main_control.get_turbine_integrity() data["parts_linked"] = main_control.all_parts_connected data["parts_ready"] = main_control.all_parts_ready() data["max_rpm"] = main_control.max_allowed_rpm data["max_temperature"] = main_control.max_allowed_temperature - - data["can_turn_off"] = main_control.rpm < 1000 - - data["regulator"] = main_control.intake_regulator + data["regulator"] = QDELETED(main_control.compressor) ? 0 : main_control.compressor.intake_regulator return data @@ -96,5 +93,6 @@ var/obj/machinery/power/turbine/core_rotor/main_control = turbine_core?.resolve() if(intake_size == null || !main_control) return - main_control.intake_regulator = clamp(intake_size, 0.01, 1) + if(!QDELETED(main_control.compressor)) + main_control.compressor.intake_regulator = clamp(intake_size, 0.01, 1) . = TRUE diff --git a/code/modules/power/turbine/turbine_parts.dm b/code/modules/power/turbine/turbine_parts.dm index 5aabe21c1c13b..d53d92190e1a5 100644 --- a/code/modules/power/turbine/turbine_parts.dm +++ b/code/modules/power/turbine/turbine_parts.dm @@ -1,7 +1,7 @@ /obj/item/turbine_parts name = "turbine parts" desc = "you really should call an admin" - icon = 'icons/obj/turbine/turbine.dmi' + icon = 'icons/obj/machines/engine/turbine.dmi' icon_state = "inlet_compressor" ///Efficiency of the part to the turbine machine diff --git a/code/modules/procedural_mapping/mapGenerators/asteroid.dm b/code/modules/procedural_mapping/mapGenerators/asteroid.dm index 18b266fc671a7..bf6c84ebf883a 100644 --- a/code/modules/procedural_mapping/mapGenerators/asteroid.dm +++ b/code/modules/procedural_mapping/mapGenerators/asteroid.dm @@ -19,9 +19,11 @@ //Monsters /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) + spawnableAtoms = list( + /mob/living/basic/mining/basilisk = 10, + /mob/living/basic/mining/goliath/ancient = 10, + /mob/living/basic/mining/hivelord = 10, + ) // GENERATORS diff --git a/code/modules/procedural_mapping/mapGenerators/lavaland.dm b/code/modules/procedural_mapping/mapGenerators/lavaland.dm index 9cbc5244ae21d..2c8ae376a3c47 100644 --- a/code/modules/procedural_mapping/mapGenerators/lavaland.dm +++ b/code/modules/procedural_mapping/mapGenerators/lavaland.dm @@ -10,9 +10,11 @@ /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) + spawnableAtoms = list( + /obj/effect/spawner/random/lavaland_mob/goliath = 10, + /obj/effect/spawner/random/lavaland_mob/legion = 10, + /obj/effect/spawner/random/lavaland_mob/watcher = 10, + ) /datum/map_generator_module/splatter_layer/lavaland_tendrils spawnableTurfs = list() diff --git a/code/modules/procedural_mapping/mapGenerators/repair.dm b/code/modules/procedural_mapping/mapGenerators/repair.dm index c9df8496389d1..505dc36f02c12 100644 --- a/code/modules/procedural_mapping/mapGenerators/repair.dm +++ b/code/modules/procedural_mapping/mapGenerators/repair.dm @@ -28,7 +28,18 @@ var/z_offset = SSmapping.station_start var/list/bounds for (var/path in SSmapping.config.GetFullMapPaths()) - var/datum/parsed_map/parsed = load_map(file(path), 1, 1, z_offset, measureOnly = FALSE, no_changeturf = FALSE, cropMap=TRUE, x_lower = mother1.x_low, y_lower = mother1.y_low, x_upper = mother1.x_high, y_upper = mother1.y_high) + var/datum/parsed_map/parsed = load_map( + file(path), + 1, + 1, + z_offset, + no_changeturf = FALSE, + crop_map = TRUE, + x_lower = mother1.x_low, + y_lower = mother1.y_low, + x_upper = mother1.x_high, + y_upper = mother1.y_high, + ) bounds = parsed?.bounds z_offset += bounds[MAP_MAXZ] - bounds[MAP_MINZ] + 1 diff --git a/code/modules/projectiles/ammunition/_ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm index 9b01f982a5f56..e492afb776b75 100644 --- a/code/modules/projectiles/ammunition/_ammunition.dm +++ b/code/modules/projectiles/ammunition/_ammunition.dm @@ -30,8 +30,6 @@ var/click_cooldown_override = 0 ///the visual effect appearing when the ammo is fired. var/firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect - ///Does this leave a casing behind? - var/is_cased_ammo = TRUE ///pacifism check for boolet, set to FALSE if bullet is non-lethal var/harmful = TRUE @@ -67,17 +65,34 @@ /obj/item/ammo_casing/proc/add_notes_ammo() // Try to get a projectile to derive stats from var/obj/projectile/exam_proj = projectile_type + var/initial_damage = initial(exam_proj.damage) + var/initial_stamina = initial(exam_proj.stamina) + // projectile damage multiplier for guns with snowflaked damage multipliers + var/proj_damage_mult = 1 if(!ispath(exam_proj) || pellets == 0) return + // are we in an ammo box? + if(isammobox(loc)) + var/obj/item/ammo_box/our_box = loc + // is our ammo box in a gun? + if(isgun(our_box.loc)) + var/obj/item/gun/our_gun = our_box.loc + // grab the damage multiplier + proj_damage_mult = our_gun.projectile_damage_multiplier + // if not, are we just in a gun e.g. chambered + else if(isgun(loc)) + var/obj/item/gun/our_gun = loc + // grab the damage multiplier. + proj_damage_mult = our_gun.projectile_damage_multiplier var/list/readout = list() + if(proj_damage_mult <= 0 || (initial_damage <= 0 && initial_stamina <= 0)) + return "Our legal team has determined the offensive nature of these [span_warning(caliber)] rounds to be esoteric." // No dividing by 0 - if(initial(exam_proj.damage) > 0) - readout += "Most monkeys our legal team subjected to these [span_warning(caliber)] rounds succumbed to their wounds after [span_warning("[HITS_TO_CRIT(initial(exam_proj.damage) * pellets)] shot\s")] at point-blank, taking [span_warning("[pellets] shot\s")] per round" - if(initial(exam_proj.stamina) > 0) - readout += "[!readout.len ? "Most monkeys" : "More fortunate monkeys"] collapsed from exhaustion after [span_warning("[HITS_TO_CRIT(initial(exam_proj.stamina) * pellets)] impact\s")] of these [span_warning("[caliber]")] rounds" - if(!readout.len) // Everything else failed, give generic text - return "Our legal team has determined the offensive nature of these [span_warning(caliber)] rounds to be esoteric" + if(initial_damage) + readout += "Most monkeys our legal team subjected to these [span_warning(caliber)] rounds succumbed to their wounds after [span_warning("[HITS_TO_CRIT((initial(exam_proj.damage) * proj_damage_mult) * pellets)] shot\s")] at point-blank, taking [span_warning("[pellets] shot\s")] per round." + if(initial_stamina) + readout += "[!readout.len ? "Most monkeys" : "More fortunate monkeys"] collapsed from exhaustion after [span_warning("[HITS_TO_CRIT((initial(exam_proj.stamina) * proj_damage_mult) * pellets)] impact\s")] of these [span_warning("[caliber]")] rounds." return readout.Join("\n") // Sending over a single string, rather than the whole list /obj/item/ammo_casing/update_icon_state() @@ -131,8 +146,6 @@ return ..() /obj/item/ammo_casing/proc/bounce_away(still_warm = FALSE, bounce_delay = 3) - if(!is_cased_ammo) - return update_appearance() SpinAnimation(10, 1) var/turf/T = get_turf(src) diff --git a/code/modules/projectiles/ammunition/_firing.dm b/code/modules/projectiles/ammunition/_firing.dm index 7707dcb19da8a..06c2ba51d3b41 100644 --- a/code/modules/projectiles/ammunition/_firing.dm +++ b/code/modules/projectiles/ammunition/_firing.dm @@ -2,25 +2,26 @@ distro += variance var/targloc = get_turf(target) ready_proj(target, user, quiet, zone_override, fired_from) + var/obj/projectile/thrown_proj if(pellets == 1) if(distro) //We have to spread a pixel-precision bullet. throw_proj was called before so angles should exist by now... if(randomspread) spread = round((rand() - 0.5) * distro) else //Smart spread spread = round(1 - 0.5) * distro - if(!throw_proj(target, targloc, user, params, spread, fired_from)) + thrown_proj = throw_proj(target, targloc, user, params, spread, fired_from) + if(isnull(thrown_proj)) 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) var/next_delay = click_cooldown_override || CLICK_CD_RANGE if(HAS_TRAIT(user, TRAIT_DOUBLE_TAP)) next_delay = round(next_delay * 0.5) - user.changeNext_move(next_delay) + if(!tk_firing(user, fired_from)) user.newtonian_move(get_dir(target, user)) else if(ismovable(fired_from)) @@ -29,6 +30,9 @@ var/throwtarget = get_step(fired_from, get_dir(target, fired_from)) firer.safe_throw_at(throwtarget, 1, 2) update_appearance() + + SEND_SIGNAL(src, COMSIG_FIRE_CASING, target, user, fired_from, randomspread, spread, zone_override, params, distro, thrown_proj) + return TRUE /obj/item/ammo_casing/proc/tk_firing(mob/living/user, atom/fired_from) @@ -52,17 +56,20 @@ loaded_projectile.damage *= G.projectile_damage_multiplier loaded_projectile.stamina *= G.projectile_damage_multiplier + loaded_projectile.wound_bonus += G.projectile_wound_bonus + loaded_projectile.bare_wound_bonus += G.projectile_wound_bonus + if(tk_firing(user, fired_from)) loaded_projectile.ignore_source_check = TRUE if(reagents && loaded_projectile.reagents) - reagents.trans_to(loaded_projectile, reagents.total_volume, transfered_by = user) //For chemical darts/bullets + reagents.trans_to(loaded_projectile, reagents.total_volume, transferred_by = user) //For chemical darts/bullets qdel(reagents) /obj/item/ammo_casing/proc/throw_proj(atom/target, turf/targloc, mob/living/user, params, spread, atom/fired_from) var/turf/curloc = get_turf(fired_from) if (!istype(targloc) || !istype(curloc) || !loaded_projectile) - return FALSE + return null var/firing_dir if(loaded_projectile.firer) @@ -79,7 +86,7 @@ var/obj/projectile/loaded_projectile_cache = loaded_projectile loaded_projectile = null loaded_projectile_cache.fire(null, direct_target) - return TRUE + return loaded_projectile_cache /obj/item/ammo_casing/proc/spread(turf/target, turf/current, distro) var/dx = abs(target.x - current.x) diff --git a/code/modules/projectiles/ammunition/ballistic/foam.dm b/code/modules/projectiles/ammunition/ballistic/foam.dm new file mode 100644 index 0000000000000..21ceeb6918bbc --- /dev/null +++ b/code/modules/projectiles/ammunition/ballistic/foam.dm @@ -0,0 +1,68 @@ +/obj/item/ammo_casing/foam_dart + name = "foam dart" + desc = "It's Donk or Don't! Ages 8 and up." + projectile_type = /obj/projectile/bullet/foam_dart + caliber = CALIBER_FOAM + icon = 'icons/obj/weapons/guns/toy.dmi' + icon_state = "foamdart" + base_icon_state = "foamdart" + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.1125) + harmful = FALSE + var/modified = FALSE + +/obj/item/ammo_casing/foam_dart/Initialize(mapload) + . = ..() + AddElement(/datum/element/caseless, TRUE) + +/obj/item/ammo_casing/foam_dart/update_icon_state() + . = ..() + if(modified) + icon_state = "[base_icon_state]_empty" + loaded_projectile?.icon_state = "[base_icon_state]_empty" + return + icon_state = "[base_icon_state]" + loaded_projectile?.icon_state = "[loaded_projectile.base_icon_state]" + +/obj/item/ammo_casing/foam_dart/update_desc() + . = ..() + desc = "It's Donk or Don't! [modified ? "... Although, this one doesn't look too safe." : "Ages 8 and up."]" + +/obj/item/ammo_casing/foam_dart/attackby(obj/item/A, mob/user, params) + var/obj/projectile/bullet/foam_dart/FD = loaded_projectile + if (A.tool_behaviour == TOOL_SCREWDRIVER && !modified) + modified = TRUE + FD.modified = TRUE + FD.damage_type = BRUTE + to_chat(user, span_notice("You pop the safety cap off [src].")) + update_appearance() + else if (istype(A, /obj/item/pen)) + if(modified) + if(!FD.pen) + harmful = TRUE + if(!user.transferItemToLoc(A, FD)) + return + FD.pen = A + FD.damage = 5 + to_chat(user, span_notice("You insert [A] into [src].")) + else + to_chat(user, span_warning("There's already something in [src].")) + else + to_chat(user, span_warning("The safety cap prevents you from inserting [A] into [src].")) + else + return ..() + +/obj/item/ammo_casing/foam_dart/attack_self(mob/living/user) + var/obj/projectile/bullet/foam_dart/FD = loaded_projectile + if(FD.pen) + FD.damage = initial(FD.damage) + user.put_in_hands(FD.pen) + to_chat(user, span_notice("You remove [FD.pen] from [src].")) + FD.pen = null + +/obj/item/ammo_casing/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/foam_dart/riot + icon_state = "foamdart_riot" + base_icon_state = "foamdart_riot" + custom_materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT* 1.125) diff --git a/code/modules/projectiles/ammunition/ballistic/harpoon.dm b/code/modules/projectiles/ammunition/ballistic/harpoon.dm new file mode 100644 index 0000000000000..79590ccb97d10 --- /dev/null +++ b/code/modules/projectiles/ammunition/ballistic/harpoon.dm @@ -0,0 +1,14 @@ +/obj/item/ammo_casing/harpoon + name = "harpoon" + caliber = CALIBER_HARPOON + icon_state = "magspear" + base_icon_state = "magspear" + projectile_type = /obj/projectile/bullet/harpoon + +/obj/item/ammo_casing/harpoon/Initialize(mapload) + . = ..() + AddElement(/datum/element/caseless, TRUE) + +/obj/item/ammo_casing/harpoon/update_icon_state() + . = ..() + icon_state = "[base_icon_state]" diff --git a/code/modules/projectiles/ammunition/ballistic/lmg.dm b/code/modules/projectiles/ammunition/ballistic/lmg.dm index 896fea9803442..d3d74f283c5d6 100644 --- a/code/modules/projectiles/ammunition/ballistic/lmg.dm +++ b/code/modules/projectiles/ammunition/ballistic/lmg.dm @@ -1,33 +1,33 @@ -// 7.12x82mm (SAW) +// 7mm (SAW) -/obj/item/ammo_casing/mm712x82 - name = "7.12x82mm bullet casing" - desc = "A 7.12x82mm bullet casing." +/obj/item/ammo_casing/m7mm + name = "7mm bullet casing" + desc = "A 7mm bullet casing." icon_state = "762-casing" - caliber = CALIBER_712X82MM - projectile_type = /obj/projectile/bullet/mm712x82 + caliber = CALIBER_A7MM + projectile_type = /obj/projectile/bullet/a7mm -/obj/item/ammo_casing/mm712x82/ap - name = "7.12x82mm armor-piercing bullet casing" - desc = "A 7.12x82mm bullet casing designed with a hardened-tipped core to help penetrate armored targets." - projectile_type = /obj/projectile/bullet/mm712x82/ap +/obj/item/ammo_casing/m7mm/ap + name = "7mm armor-piercing bullet casing" + desc = "A 7mm bullet casing designed with a hardened-tipped core to help penetrate armored targets." + projectile_type = /obj/projectile/bullet/a7mm/ap -/obj/item/ammo_casing/mm712x82/hollow - name = "7.12x82mm hollow-point bullet casing" - desc = "A 7.12x82mm bullet casing designed to cause more damage to unarmored targets." - projectile_type = /obj/projectile/bullet/mm712x82/hp +/obj/item/ammo_casing/m7mm/hollow + name = "7mm hollow-point bullet casing" + desc = "A 7mm bullet casing designed to cause more damage to unarmored targets." + projectile_type = /obj/projectile/bullet/a7mm/hp -/obj/item/ammo_casing/mm712x82/incen - name = "7.12x82mm incendiary bullet casing" - desc = "A 7.12x82mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames." - projectile_type = /obj/projectile/bullet/incendiary/mm712x82 +/obj/item/ammo_casing/m7mm/incen + name = "7mm incendiary bullet casing" + desc = "A 7mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames." + projectile_type = /obj/projectile/bullet/incendiary/a7mm -/obj/item/ammo_casing/mm712x82/match - name = "7.12x82mm match bullet casing" - desc = "A 7.12x82mm bullet casing manufactured to unfailingly high standards, you could pull off some cool trickshots with this." - projectile_type = /obj/projectile/bullet/mm712x82/match +/obj/item/ammo_casing/m7mm/match + name = "7mm match bullet casing" + desc = "A 7mm bullet casing manufactured to unfailingly high standards, you could pull off some cool trickshots with this." + projectile_type = /obj/projectile/bullet/a7mm/match -/obj/item/ammo_casing/mm712x82/bouncy - name = "7.12x82mm rubber bullet casing" - desc = "A 7.12x82mm rubber bullet casing manufactured to unfailingly disastrous standards, you could piss off a lot of people spraying this down a hallway." - projectile_type = /obj/projectile/bullet/mm712x82/bouncy +/obj/item/ammo_casing/m7mm/bouncy + name = "7mm rubber bullet casing" + desc = "A 7mm rubber bullet casing manufactured to unfailingly disastrous standards, you could piss off a lot of people spraying this down a hallway." + projectile_type = /obj/projectile/bullet/a7mm/bouncy diff --git a/code/modules/projectiles/ammunition/ballistic/pistol.dm b/code/modules/projectiles/ammunition/ballistic/pistol.dm index c61888b95259f..a2f55f797bdb5 100644 --- a/code/modules/projectiles/ammunition/ballistic/pistol.dm +++ b/code/modules/projectiles/ammunition/ballistic/pistol.dm @@ -21,6 +21,11 @@ desc = "A 10mm incendiary bullet casing." projectile_type = /obj/projectile/bullet/incendiary/c10mm +/obj/item/ammo_casing/c10mm/reaper + name = "10mm reaper bullet casing" + desc = "A 10mm reaper bullet casing." + projectile_type = /obj/projectile/bullet/c10mm/reaper + // 9mm (Makarov, Stechkin APS, PP-95) /obj/item/ammo_casing/c9mm diff --git a/code/modules/projectiles/ammunition/ballistic/revolver.dm b/code/modules/projectiles/ammunition/ballistic/revolver.dm index 54b3f39cd85b9..811b4309f5258 100644 --- a/code/modules/projectiles/ammunition/ballistic/revolver.dm +++ b/code/modules/projectiles/ammunition/ballistic/revolver.dm @@ -14,6 +14,14 @@ desc = "A .357 bullet casing, manufactured to exceedingly high standards." projectile_type = /obj/projectile/bullet/a357/match +/obj/item/ammo_casing/a357/phasic + name = ".357 phasic bullet casing" + projectile_type = /obj/projectile/bullet/a357/phasic + +/obj/item/ammo_casing/a357/heartseeker + name = ".357 heartseeker bullet casing" + projectile_type = /obj/projectile/bullet/a357/heartseeker + // 7.62x38mmR (Nagant Revolver) /obj/item/ammo_casing/n762 diff --git a/code/modules/projectiles/ammunition/ballistic/rifle.dm b/code/modules/projectiles/ammunition/ballistic/rifle.dm index 38515fb782073..3e545dc106077 100644 --- a/code/modules/projectiles/ammunition/ballistic/rifle.dm +++ b/code/modules/projectiles/ammunition/ballistic/rifle.dm @@ -1,35 +1,40 @@ -// 7.62 (Nagant Rifle) +// .310 Strilka (Sakhno Rifle) -/obj/item/ammo_casing/a762 - name = "7.62 bullet casing" - desc = "A 7.62 bullet casing." - icon_state = "762-casing" - caliber = CALIBER_A762 - projectile_type = /obj/projectile/bullet/a762 +/obj/item/ammo_casing/strilka310 + name = ".310 Strilka bullet casing" + desc = "A .310 Strilka bullet casing. Casing is a bit of a fib, there is no case, its just a block of red powder." + icon_state = "310-casing" + caliber = CALIBER_STRILKA310 + projectile_type = /obj/projectile/bullet/strilka310 -/obj/item/ammo_casing/a762/surplus - name = "7.62 surplus bullet casing" - desc = "A surplus 7.62 bullet casing." - projectile_type = /obj/projectile/bullet/a762/surplus +/obj/item/ammo_casing/strilka310/Initialize(mapload) + . = ..() -/obj/item/ammo_casing/a762/enchanted - projectile_type = /obj/projectile/bullet/a762/enchanted + AddElement(/datum/element/caseless) -// 5.56mm (M-90gl Carbine) +/obj/item/ammo_casing/strilka310/surplus + name = ".310 Strilka surplus bullet casing" + desc = "A surplus .310 Strilka bullet casing. Casing is a bit of a fib, there is no case, its just a block of red powder. Damp red powder at that." + projectile_type = /obj/projectile/bullet/strilka310/surplus -/obj/item/ammo_casing/a556 - name = "5.56mm bullet casing" - desc = "A 5.56mm bullet casing." - caliber = CALIBER_A556 - projectile_type = /obj/projectile/bullet/a556 +/obj/item/ammo_casing/strilka310/enchanted + projectile_type = /obj/projectile/bullet/strilka310/enchanted -/obj/item/ammo_casing/a556/phasic - name = "5.56mm phasic bullet casing" - desc = "A 5.56mm phasic bullet casing." - projectile_type = /obj/projectile/bullet/a556/phasic +// .223 (M-90gl Carbine) -/obj/item/ammo_casing/a556/weak - projectile_type = /obj/projectile/bullet/a556/weak +/obj/item/ammo_casing/a223 + name = ".223 bullet casing" + desc = "A .223 bullet casing." + caliber = CALIBER_A223 + projectile_type = /obj/projectile/bullet/a223 + +/obj/item/ammo_casing/a223/phasic + name = ".223 phasic bullet casing" + desc = "A .223 phasic bullet casing." + projectile_type = /obj/projectile/bullet/a223/phasic + +/obj/item/ammo_casing/a223/weak + projectile_type = /obj/projectile/bullet/a223/weak // 40mm (Grenade Launcher) @@ -39,3 +44,8 @@ caliber = CALIBER_40MM icon_state = "40mmHE" projectile_type = /obj/projectile/bullet/a40mm + +/obj/item/ammo_casing/a40mm/rubber + name = "40mm rubber shell" + desc = "A cased rubber slug. The big brother of the beanbag slug, this thing will knock someone out in one. Doesn't do so great against anyone in armor." + projectile_type = /obj/projectile/bullet/shotgun_beanbag/a40mm diff --git a/code/modules/projectiles/ammunition/ballistic/rocket.dm b/code/modules/projectiles/ammunition/ballistic/rocket.dm new file mode 100644 index 0000000000000..bb5c1072c1481 --- /dev/null +++ b/code/modules/projectiles/ammunition/ballistic/rocket.dm @@ -0,0 +1,42 @@ +/obj/item/ammo_casing/rocket + name = "\improper PM-9HE" + desc = "An 84mm High Explosive rocket. Fire at people and pray." + caliber = CALIBER_84MM + icon_state = "srm-8" + base_icon_state = "srm-8" + projectile_type = /obj/projectile/bullet/rocket + +/obj/item/ammo_casing/rocket/Initialize(mapload) + . = ..() + AddElement(/datum/element/caseless) + +/obj/item/ammo_casing/rocket/update_icon_state() + . = ..() + icon_state = "[base_icon_state]" + +/obj/item/ammo_casing/rocket/heap + name = "\improper PM-9HEAP" + desc = "An 84mm High Explosive All Purpose rocket. For when you just need something to not exist anymore." + icon_state = "84mm-heap" + base_icon_state = "84mm-heap" + projectile_type = /obj/projectile/bullet/rocket/heap + +/obj/item/ammo_casing/rocket/weak + name = "\improper PM-9HE Low-Yield" + desc = "An 84mm High Explosive rocket. This one isn't quite as devastating." + projectile_type = /obj/projectile/bullet/rocket/weak + +/obj/item/ammo_casing/a75 + desc = "A .75 bullet casing." + caliber = CALIBER_75 + icon_state = "s-casing-live" + base_icon_state = "s-casing-live" + projectile_type = /obj/projectile/bullet/gyro + +/obj/item/ammo_casing/a75/Initialize(mapload) + . = ..() + AddElement(/datum/element/caseless) + +/obj/item/ammo_casing/a75/update_icon_state() + . = ..() + icon_state = "[base_icon_state]" diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm index 48fc55b616f23..da5d4161286e0 100644 --- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm +++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm @@ -105,12 +105,12 @@ /obj/item/ammo_casing/shotgun/improvised name = "improvised shell" - desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards." + desc = "A homemade shotgun casing filled with crushed glass, used to commmit vandalism and property damage." icon_state = "improvshell" projectile_type = /obj/projectile/bullet/pellet/shotgun_improvised - custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*2.5) - pellets = 10 - variance = 25 + custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*2, /datum/material/glass=SMALL_MATERIAL_AMOUNT*1) + pellets = 6 + variance = 30 /obj/item/ammo_casing/shotgun/ion name = "ion shell" @@ -135,6 +135,16 @@ icon_state = "cshell" projectile_type = null +/obj/item/ammo_casing/shotgun/techshell/Initialize(mapload) + . = ..() + + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/meteorslug, /datum/crafting_recipe/pulseslug, /datum/crafting_recipe/dragonsbreath, /datum/crafting_recipe/ionslug, /datum/crafting_recipe/laserslug) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/ammo_casing/shotgun/dart name = "shotgun dart" desc = "A dart for use in shotguns. Can be injected with up to 15 units of any chemical." @@ -160,3 +170,10 @@ 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/sodium_thiopental, 6) + +/obj/item/ammo_casing/shotgun/breacher + name = "breaching slug" + desc = "A 12 gauge anti-material slug. Great for breaching airlocks and windows, quickly and efficiently." + icon_state = "breacher" + projectile_type = /obj/projectile/bullet/shotgun_breaching + custom_materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*2) diff --git a/code/modules/projectiles/ammunition/ballistic/smg.dm b/code/modules/projectiles/ammunition/ballistic/smg.dm index 594a1341d2c6b..7e84bc1a91827 100644 --- a/code/modules/projectiles/ammunition/ballistic/smg.dm +++ b/code/modules/projectiles/ammunition/ballistic/smg.dm @@ -32,6 +32,11 @@ desc = "A .45 bullet casing." projectile_type = /obj/projectile/bullet/c45/ap +/obj/item/ammo_casing/c45/hp + name = ".45 hollow point bullet casing" + desc = "A .45 bullet casing." + projectile_type = /obj/projectile/bullet/c45/hp + /obj/item/ammo_casing/c45/inc name = ".45 incendiary bullet casing" desc = "A .45 bullet casing." diff --git a/code/modules/projectiles/ammunition/caseless/_caseless.dm b/code/modules/projectiles/ammunition/caseless/_caseless.dm deleted file mode 100644 index 8d20b639c73e2..0000000000000 --- a/code/modules/projectiles/ammunition/caseless/_caseless.dm +++ /dev/null @@ -1,18 +0,0 @@ -/obj/item/ammo_casing/caseless - desc = "A caseless bullet casing." - firing_effect_type = null - is_cased_ammo = FALSE - -/obj/item/ammo_casing/caseless/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, atom/fired_from) - if (!..()) //failed firing - return FALSE - if(isgun(fired_from)) - var/obj/item/gun/shot_from = fired_from - if(shot_from.chambered == src) - shot_from.chambered = null //Nuke it. Nuke it now. - qdel(src) - return TRUE - -/obj/item/ammo_casing/caseless/update_icon_state() - . = ..() - icon_state = "[initial(icon_state)]" diff --git a/code/modules/projectiles/ammunition/caseless/energy.dm b/code/modules/projectiles/ammunition/caseless/energy.dm deleted file mode 100644 index 9461bc4b15374..0000000000000 --- a/code/modules/projectiles/ammunition/caseless/energy.dm +++ /dev/null @@ -1,9 +0,0 @@ -/obj/item/ammo_casing/caseless/laser - name = "laser casing" - desc = "You shouldn't be seeing this." - caliber = CALIBER_LASER - icon_state = "s-casing-live" - slot_flags = null - projectile_type = /obj/projectile/beam - fire_sound = 'sound/weapons/laser.ogg' - firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy diff --git a/code/modules/projectiles/ammunition/caseless/foam.dm b/code/modules/projectiles/ammunition/caseless/foam.dm deleted file mode 100644 index 871f0cc766d13..0000000000000 --- a/code/modules/projectiles/ammunition/caseless/foam.dm +++ /dev/null @@ -1,64 +0,0 @@ -/obj/item/ammo_casing/caseless/foam_dart - name = "foam dart" - desc = "It's Donk or Don't! Ages 8 and up." - projectile_type = /obj/projectile/bullet/reusable/foam_dart - caliber = CALIBER_FOAM - icon = 'icons/obj/weapons/guns/toy.dmi' - icon_state = "foamdart" - base_icon_state = "foamdart" - custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.1125) - harmful = FALSE - var/modified = FALSE - -/obj/item/ammo_casing/caseless/foam_dart/update_icon_state() - . = ..() - if(modified) - icon_state = "[base_icon_state]_empty" - loaded_projectile?.icon_state = "[base_icon_state]_empty" - return - icon_state = "[base_icon_state]" - loaded_projectile?.icon_state = "[loaded_projectile.base_icon_state]" - -/obj/item/ammo_casing/caseless/foam_dart/update_desc() - . = ..() - desc = "It's Donk or Don't! [modified ? "... Although, this one doesn't look too safe." : "Ages 8 and up."]" - -/obj/item/ammo_casing/caseless/foam_dart/attackby(obj/item/A, mob/user, params) - var/obj/projectile/bullet/reusable/foam_dart/FD = loaded_projectile - if (A.tool_behaviour == TOOL_SCREWDRIVER && !modified) - modified = TRUE - FD.modified = TRUE - FD.damage_type = BRUTE - to_chat(user, span_notice("You pop the safety cap off [src].")) - update_appearance() - else if (istype(A, /obj/item/pen)) - if(modified) - if(!FD.pen) - harmful = TRUE - if(!user.transferItemToLoc(A, FD)) - return - FD.pen = A - FD.damage = 5 - to_chat(user, span_notice("You insert [A] into [src].")) - else - to_chat(user, span_warning("There's already something in [src].")) - else - to_chat(user, span_warning("The safety cap prevents you from inserting [A] into [src].")) - else - return ..() - -/obj/item/ammo_casing/caseless/foam_dart/attack_self(mob/living/user) - var/obj/projectile/bullet/reusable/foam_dart/FD = loaded_projectile - if(FD.pen) - FD.damage = initial(FD.damage) - 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 = HALF_SHEET_MATERIAL_AMOUNT* 1.125) diff --git a/code/modules/projectiles/ammunition/caseless/harpoon.dm b/code/modules/projectiles/ammunition/caseless/harpoon.dm deleted file mode 100644 index 5f1b402cf7f4c..0000000000000 --- a/code/modules/projectiles/ammunition/caseless/harpoon.dm +++ /dev/null @@ -1,5 +0,0 @@ -/obj/item/ammo_casing/caseless/harpoon - name = "harpoon" - caliber = CALIBER_HARPOON - icon_state = "magspear" - projectile_type = /obj/projectile/bullet/harpoon diff --git a/code/modules/projectiles/ammunition/caseless/rocket.dm b/code/modules/projectiles/ammunition/caseless/rocket.dm deleted file mode 100644 index 5b378fca65f3e..0000000000000 --- a/code/modules/projectiles/ammunition/caseless/rocket.dm +++ /dev/null @@ -1,23 +0,0 @@ -/obj/item/ammo_casing/caseless/rocket - name = "\improper PM-9HE" - desc = "An 84mm High Explosive rocket. Fire at people and pray." - caliber = CALIBER_84MM - icon_state = "srm-8" - projectile_type = /obj/projectile/bullet/rocket - -/obj/item/ammo_casing/caseless/rocket/heap - name = "\improper PM-9HEAP" - desc = "An 84mm High Explosive All Purpose rocket. For when you just need something to not exist anymore." - icon_state = "84mm-heap" - projectile_type = /obj/projectile/bullet/rocket/heap - -/obj/item/ammo_casing/caseless/rocket/weak - name = "\improper PM-9HE Low-Yield" - desc = "An 84mm High Explosive rocket. This one isn't quite as devastating." - projectile_type = /obj/projectile/bullet/rocket/weak - -/obj/item/ammo_casing/caseless/a75 - desc = "A .75 bullet casing." - caliber = CALIBER_75 - icon_state = "s-casing-live" - projectile_type = /obj/projectile/bullet/gyro diff --git a/code/modules/projectiles/ammunition/energy/_energy.dm b/code/modules/projectiles/ammunition/energy/_energy.dm index 38fed944340dc..8ff8f6510caf3 100644 --- a/code/modules/projectiles/ammunition/energy/_energy.dm +++ b/code/modules/projectiles/ammunition/energy/_energy.dm @@ -8,4 +8,3 @@ var/select_name = CALIBER_ENERGY fire_sound = 'sound/weapons/laser.ogg' firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy - is_cased_ammo = FALSE diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm index a97ba61779f30..4f62af047d4ff 100644 --- a/code/modules/projectiles/ammunition/energy/laser.dm +++ b/code/modules/projectiles/ammunition/energy/laser.dm @@ -1,6 +1,6 @@ /obj/item/ammo_casing/energy/laser projectile_type = /obj/projectile/beam/laser - e_cost = 63 + e_cost = 83 select_name = "kill" /obj/item/ammo_casing/energy/laser/hellfire @@ -13,7 +13,12 @@ /obj/item/ammo_casing/energy/lasergun projectile_type = /obj/projectile/beam/laser - e_cost = 52 + e_cost = 62.5 + select_name = "kill" + +/obj/item/ammo_casing/energy/lasergun/carbine + projectile_type = /obj/projectile/beam/laser/carbine + e_cost = 25 // 40 shots select_name = "kill" /obj/item/ammo_casing/energy/lasergun/old @@ -24,6 +29,13 @@ /obj/item/ammo_casing/energy/laser/hos e_cost = 120 +/obj/item/ammo_casing/energy/laser/musket + projectile_type = /obj/projectile/beam/laser/musket + e_cost = 1000 + +/obj/item/ammo_casing/energy/laser/musket/prime + projectile_type = /obj/projectile/beam/laser/musket/prime + /obj/item/ammo_casing/energy/laser/practice projectile_type = /obj/projectile/beam/practice select_name = "practice" @@ -119,3 +131,23 @@ /obj/item/ammo_casing/energy/nanite/cryo projectile_type = /obj/projectile/energy/cryo select_name = "cryo" + +///not exactly an energy ammo casing, but it's used by the laser gatling. +/obj/item/ammo_casing/laser + name = "laser casing" + desc = "You shouldn't be seeing this." + caliber = CALIBER_LASER + icon_state = "s-casing-live" + base_icon_state = "s-casing-live" + slot_flags = null + projectile_type = /obj/projectile/beam + fire_sound = 'sound/weapons/laser.ogg' + firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy + +/obj/item/ammo_casing/laser/Initialize(mapload) + . = ..() + AddElement(/datum/element/caseless) + +/obj/item/ammo_casing/laser/update_icon_state() + . = ..() + icon_state = "[base_icon_state]" diff --git a/code/modules/projectiles/ammunition/energy/special.dm b/code/modules/projectiles/ammunition/energy/special.dm index bedfab7b23574..24fba4b9ba492 100644 --- a/code/modules/projectiles/ammunition/energy/special.dm +++ b/code/modules/projectiles/ammunition/energy/special.dm @@ -74,3 +74,9 @@ select_name = "marksman nanoshot" e_cost = 0 fire_sound = 'sound/weapons/gun/revolver/shot_alt.ogg' + +/obj/item/ammo_casing/energy/fisher + projectile_type = /obj/projectile/energy/fisher + select_name = "light-buster" + e_cost = 250 + fire_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' // fwip fwip fwip fwip diff --git a/code/modules/projectiles/ammunition/energy/stun.dm b/code/modules/projectiles/ammunition/energy/stun.dm index 11ce484f0c123..0a34ab1782c6b 100644 --- a/code/modules/projectiles/ammunition/energy/stun.dm +++ b/code/modules/projectiles/ammunition/energy/stun.dm @@ -24,3 +24,11 @@ /obj/item/ammo_casing/energy/disabler/hos e_cost = 60 + +/obj/item/ammo_casing/energy/disabler/smoothbore + projectile_type = /obj/projectile/beam/disabler/smoothbore + e_cost = 1000 + +/obj/item/ammo_casing/energy/disabler/smoothbore/prime + projectile_type = /obj/projectile/beam/disabler/smoothbore/prime + e_cost = 500 diff --git a/code/modules/projectiles/ammunition/special/magic.dm b/code/modules/projectiles/ammunition/special/magic.dm index c6737fd3cabbb..9135e3ec5b947 100644 --- a/code/modules/projectiles/ammunition/special/magic.dm +++ b/code/modules/projectiles/ammunition/special/magic.dm @@ -4,7 +4,6 @@ slot_flags = null projectile_type = /obj/projectile/magic firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/magic - is_cased_ammo = FALSE /obj/item/ammo_casing/magic/change projectile_type = /obj/projectile/magic/change diff --git a/code/modules/projectiles/ammunition/special/syringe.dm b/code/modules/projectiles/ammunition/special/syringe.dm index 59f5f3b31775f..c06069c4d10c4 100644 --- a/code/modules/projectiles/ammunition/special/syringe.dm +++ b/code/modules/projectiles/ammunition/special/syringe.dm @@ -15,7 +15,7 @@ var/obj/item/reagent_containers/syringe/S = SG.syringes[1] - S.reagents.trans_to(loaded_projectile, S.reagents.total_volume, transfered_by = user) + S.reagents.trans_to(loaded_projectile, S.reagents.total_volume, transferred_by = user) loaded_projectile.name = S.name var/obj/projectile/bullet/dart/D = loaded_projectile D.inject_flags = S.inject_flags @@ -25,7 +25,7 @@ var/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/syringe_gun = loc var/obj/item/reagent_containers/syringe/loaded_syringe = syringe_gun.syringes[1] var/obj/projectile/bullet/dart/shot_dart = loaded_projectile - syringe_gun.reagents.trans_to(shot_dart, min(loaded_syringe.volume, syringe_gun.reagents.total_volume), transfered_by = user) + syringe_gun.reagents.trans_to(shot_dart, min(loaded_syringe.volume, syringe_gun.reagents.total_volume), transferred_by = user) shot_dart.name = loaded_syringe.name shot_dart.inject_flags = loaded_syringe.inject_flags LAZYREMOVE(syringe_gun.syringes, loaded_syringe) @@ -45,7 +45,7 @@ var/obj/item/gun/chem/CG = loc if(CG.syringes_left <= 0) return - CG.reagents.trans_to(loaded_projectile, 15, transfered_by = user) + CG.reagents.trans_to(loaded_projectile, 15, transferred_by = user) loaded_projectile.name = "piercing chemical dart" CG.syringes_left-- return ..() diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm index c01c4b38037fe..b018c06317e40 100644 --- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -50,6 +50,15 @@ QDEL_LIST(stored_ammo) return ..() +/obj/item/ammo_box/Exited(atom/movable/gone, direction) + . = ..() + if(gone in stored_ammo) + remove_from_stored_ammo(gone) + +/obj/item/ammo_box/proc/remove_from_stored_ammo(atom/movable/gone) + stored_ammo -= gone + update_appearance() + /obj/item/ammo_box/add_weapon_description() AddElement(/datum/element/weapon_description, attached_proc = PROC_REF(add_notes_box)) @@ -87,16 +96,16 @@ stored_ammo += new round_check(src) update_appearance() -///gets a round from the magazine, if keep is TRUE the round will stay in the gun +///gets a round from the magazine, if keep is TRUE the round will be moved to the bottom of the list. /obj/item/ammo_box/proc/get_round(keep = FALSE) - if (!stored_ammo.len) + var/ammo_len = length(stored_ammo) + if (!ammo_len) return null - else - var/b = stored_ammo[stored_ammo.len] - stored_ammo -= b - if (keep) - stored_ammo.Insert(1,b) - return b + var/casing = stored_ammo[ammo_len] + if (keep) + stored_ammo -= casing + stored_ammo.Insert(1,casing) + return casing ///puts a round into the magazine /obj/item/ammo_box/proc/give_round(obj/item/ammo_casing/R, replace_spent = 0) @@ -173,6 +182,7 @@ desc = "[initial(desc)] There [(shells_left == 1) ? "is" : "are"] [shells_left] shell\s left!" /obj/item/ammo_box/update_icon_state() + . = ..() var/shells_left = LAZYLEN(stored_ammo) switch(multiple_sprites) if(AMMO_BOX_PER_BULLET) @@ -180,20 +190,19 @@ if(AMMO_BOX_FULL_EMPTY) icon_state = "[multiple_sprite_use_base ? base_icon_state : initial(icon_state)]-[shells_left ? "full" : "empty"]" +/obj/item/ammo_box/update_overlays() + . = ..() if(ammo_band_color && ammo_band_icon) - update_ammo_band() - - return ..() + . += update_ammo_band() /obj/item/ammo_box/proc/update_ammo_band() - overlays.Cut() var/band_icon = ammo_band_icon if(!(length(stored_ammo)) && ammo_band_icon_empty) band_icon = ammo_band_icon_empty var/image/ammo_band_image = image(icon, src, band_icon) ammo_band_image.color = ammo_band_color ammo_band_image.appearance_flags = RESET_COLOR|KEEP_APART - overlays += ammo_band_image + return ammo_band_image ///Count of number of bullets in the magazine /obj/item/ammo_box/magazine/proc/ammo_count(countempties = TRUE) @@ -204,11 +213,8 @@ return boolets ///list of every bullet in the magazine -/obj/item/ammo_box/magazine/proc/ammo_list(drop_list = FALSE) - var/list/L = stored_ammo.Copy() - if(drop_list) - stored_ammo.Cut() - return L +/obj/item/ammo_box/magazine/proc/ammo_list() + return stored_ammo.Copy() ///drops the entire contents of the magazine on the floor /obj/item/ammo_box/magazine/proc/empty_magazine() @@ -216,7 +222,3 @@ for(var/obj/item/ammo in stored_ammo) ammo.forceMove(turf_mag) stored_ammo -= ammo - -/obj/item/ammo_box/magazine/handle_atom_del(atom/A) - stored_ammo -= A - update_appearance() diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm index 87ec9e59bcff7..e01a309bbc658 100644 --- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm +++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm @@ -7,11 +7,28 @@ caliber = CALIBER_357 multiple_sprites = AMMO_BOX_PER_BULLET item_flags = NO_MAT_REDEMPTION + ammo_band_icon = "+357_ammo_band" + ammo_band_color = null /obj/item/ammo_box/a357/match name = "speed loader (.357 Match)" desc = "Designed to quickly reload revolvers. These rounds are manufactured within extremely tight tolerances, making them easy to show off trickshots with." ammo_type = /obj/item/ammo_casing/a357/match + ammo_band_color = "#77828a" + +/obj/item/ammo_box/a357/phasic + name = "speed loader (.357 Phasic)" + desc = "Designed to quickly reload revolvers. Holds phasic ammo, also known as 'Ghost Lead', allowing it to pass through non-organic material." + ammo_type = /obj/item/ammo_casing/a357/phasic + ammo_band_color = "#693a6a" + +/obj/item/ammo_box/a357/heartseeker + name = "speed loader (.357 Heartseeker)" + desc = "Designed to quickly reload revolvers. Holds heartseeker ammo, which veers into targets with exceptional precision using \ + an unknown method. It apparently predicts movement using neural pulses in the brain, but that's less marketable. \ + As seen in the hit NTFlik horror-space western film, Forget-Me-Not! Brought to you by Roseus Galactic!" + ammo_type = /obj/item/ammo_casing/a357/heartseeker + ammo_band_color = "#a91e1e" /obj/item/ammo_box/c38 name = "speed loader (.38)" @@ -86,18 +103,32 @@ max_ammo = 4 multiple_sprites = AMMO_BOX_PER_BULLET -/obj/item/ammo_box/a762 - name = "stripper clip (7.62mm)" +/obj/item/ammo_box/a40mm/rubber + name = "ammo box (40mm rubber slug)" + ammo_type = /obj/item/ammo_casing/a40mm/rubber + +/obj/item/ammo_box/rocket + name = "rocket bouquet (84mm HE)" + icon_state = "rocketbundle" + ammo_type = /obj/item/ammo_casing/rocket + max_ammo = 3 + multiple_sprites = AMMO_BOX_PER_BULLET + +/obj/item/ammo_box/rocket/can_load(mob/user) + return FALSE + +/obj/item/ammo_box/strilka310 + name = "stripper clip (.310 Strilka)" desc = "A stripper clip." - icon_state = "762" - ammo_type = /obj/item/ammo_casing/a762 + icon_state = "310_strip" + ammo_type = /obj/item/ammo_casing/strilka310 max_ammo = 5 - caliber = CALIBER_A762 + caliber = CALIBER_STRILKA310 multiple_sprites = AMMO_BOX_PER_BULLET -/obj/item/ammo_box/a762/surplus - name = "stripper clip (7.62mm Surplus)" - ammo_type = /obj/item/ammo_casing/a762/surplus +/obj/item/ammo_box/strilka310/surplus + name = "stripper clip (.310 Surplus)" + ammo_type = /obj/item/ammo_casing/strilka310/surplus /obj/item/ammo_box/n762 name = "ammo box (7.62x38mmR)" @@ -109,11 +140,21 @@ name = "ammo box (Foam Darts)" icon = 'icons/obj/weapons/guns/toy.dmi' icon_state = "foambox" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart + ammo_type = /obj/item/ammo_casing/foam_dart max_ammo = 40 custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*5) +/obj/item/ammo_box/foambox/mini + icon_state = "foambox_mini" + max_ammo = 20 + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*2.5) + /obj/item/ammo_box/foambox/riot icon_state = "foambox_riot" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot + ammo_type = /obj/item/ammo_casing/foam_dart/riot custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*25) + +/obj/item/ammo_box/foambox/riot/mini + icon_state = "foambox_riot_mini" + max_ammo = 20 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*12.5) diff --git a/code/modules/projectiles/boxes_magazines/external/grenade.dm b/code/modules/projectiles/boxes_magazines/external/grenade.dm index b615cfcbdfef4..4ba7d43efae4c 100644 --- a/code/modules/projectiles/boxes_magazines/external/grenade.dm +++ b/code/modules/projectiles/boxes_magazines/external/grenade.dm @@ -1,7 +1,7 @@ /obj/item/ammo_box/magazine/m75 name = "specialized magazine (.75)" icon_state = "75" - ammo_type = /obj/item/ammo_casing/caseless/a75 + ammo_type = /obj/item/ammo_casing/a75 caliber = CALIBER_75 multiple_sprites = AMMO_BOX_FULL_EMPTY max_ammo = 8 diff --git a/code/modules/projectiles/boxes_magazines/external/lmg.dm b/code/modules/projectiles/boxes_magazines/external/lmg.dm index f711f46b54e86..5af59b0377702 100644 --- a/code/modules/projectiles/boxes_magazines/external/lmg.dm +++ b/code/modules/projectiles/boxes_magazines/external/lmg.dm @@ -1,34 +1,34 @@ -/obj/item/ammo_box/magazine/mm712x82 - name = "box magazine (7.12x82mm)" - icon_state = "a762-50" - ammo_type = /obj/item/ammo_casing/mm712x82 - caliber = CALIBER_712X82MM +/obj/item/ammo_box/magazine/m7mm + name = "box magazine (7mm)" + icon_state = "a7mm-50" + ammo_type = /obj/item/ammo_casing/m7mm + caliber = CALIBER_A7MM max_ammo = 50 -/obj/item/ammo_box/magazine/mm712x82/hollow - name = "box magazine (Hollow-Point 7.12x82mm)" - ammo_type = /obj/item/ammo_casing/mm712x82/hollow +/obj/item/ammo_box/magazine/m7mm/hollow + name = "box magazine (Hollow-Point 7mm)" + ammo_type = /obj/item/ammo_casing/m7mm/hollow -/obj/item/ammo_box/magazine/mm712x82/ap - name = "box magazine (Armor Penetrating 7.12x82mm)" - ammo_type = /obj/item/ammo_casing/mm712x82/ap +/obj/item/ammo_box/magazine/m7mm/ap + name = "box magazine (Armor Penetrating 7mm)" + ammo_type = /obj/item/ammo_casing/m7mm/ap -/obj/item/ammo_box/magazine/mm712x82/incen - name = "box magazine (Incendiary 7.12x82mm)" - ammo_type = /obj/item/ammo_casing/mm712x82/incen +/obj/item/ammo_box/magazine/m7mm/incen + name = "box magazine (Incendiary 7mm)" + ammo_type = /obj/item/ammo_casing/m7mm/incen -/obj/item/ammo_box/magazine/mm712x82/match - name = "box magazine (Match 7.12x82mm)" - ammo_type = /obj/item/ammo_casing/mm712x82/match +/obj/item/ammo_box/magazine/m7mm/match + name = "box magazine (Match 7mm)" + ammo_type = /obj/item/ammo_casing/m7mm/match -/obj/item/ammo_box/magazine/mm712x82/bouncy - name = "box magazine (Rubber 7.12x82mm)" - ammo_type = /obj/item/ammo_casing/mm712x82/bouncy +/obj/item/ammo_box/magazine/m7mm/bouncy + name = "box magazine (Rubber 7mm)" + ammo_type = /obj/item/ammo_casing/m7mm/bouncy -/obj/item/ammo_box/magazine/mm712x82/bouncy/hicap - name = "hi-cap box magazine (Rubber 7.12x82mm)" +/obj/item/ammo_box/magazine/m7mm/bouncy/hicap + name = "hi-cap box magazine (Rubber 7mm)" max_ammo = 150 -/obj/item/ammo_box/magazine/mm712x82/update_icon_state() +/obj/item/ammo_box/magazine/m7mm/update_icon_state() . = ..() - icon_state = "a762-[min(round(ammo_count(), 10), 50)]" //Min is used to prevent high capacity magazines from attempting to get sprites with larger capacities + icon_state = "a7mm-[min(round(ammo_count(), 10), 50)]" //Min is used to prevent high capacity magazines from attempting to get sprites with larger capacities diff --git a/code/modules/projectiles/boxes_magazines/external/pistol.dm b/code/modules/projectiles/boxes_magazines/external/pistol.dm index 49ea0029f8f6d..8b0bc1da7e5b8 100644 --- a/code/modules/projectiles/boxes_magazines/external/pistol.dm +++ b/code/modules/projectiles/boxes_magazines/external/pistol.dm @@ -107,15 +107,11 @@ multiple_sprites = AMMO_BOX_PER_BULLET /obj/item/ammo_box/magazine/r10mm - name = "regal condor magazine (10mm)" + name = "regal condor magazine (10mm Reaper)" icon_state = "r10mm-8" base_icon_state = "r10mm" - ammo_type = /obj/item/ammo_casing/c10mm + ammo_type = /obj/item/ammo_casing/c10mm/reaper caliber = CALIBER_10MM max_ammo = 8 multiple_sprites = AMMO_BOX_PER_BULLET multiple_sprite_use_base = TRUE - -/obj/item/ammo_box/magazine/r10mm/empty - icon_state = "r10mm-0" - start_empty = TRUE diff --git a/code/modules/projectiles/boxes_magazines/external/rechargable.dm b/code/modules/projectiles/boxes_magazines/external/rechargable.dm index 9e1e2597a6616..e0c8d53d4bd01 100644 --- a/code/modules/projectiles/boxes_magazines/external/rechargable.dm +++ b/code/modules/projectiles/boxes_magazines/external/rechargable.dm @@ -3,7 +3,7 @@ desc = "A rechargeable, detachable battery that serves as a magazine for laser rifles." icon_state = "oldrifle-20" base_icon_state = "oldrifle" - ammo_type = /obj/item/ammo_casing/caseless/laser + ammo_type = /obj/item/ammo_casing/laser caliber = CALIBER_LASER max_ammo = 20 diff --git a/code/modules/projectiles/boxes_magazines/external/rifle.dm b/code/modules/projectiles/boxes_magazines/external/rifle.dm index a4d9bacad890b..882fefedec111 100644 --- a/code/modules/projectiles/boxes_magazines/external/rifle.dm +++ b/code/modules/projectiles/boxes_magazines/external/rifle.dm @@ -10,14 +10,14 @@ . = ..() icon_state = "[base_icon_state]-[LAZYLEN(stored_ammo) ? "full" : "empty"]" -/obj/item/ammo_box/magazine/m556 - name = "toploader magazine (5.56mm)" - icon_state = "5.56m" - ammo_type = /obj/item/ammo_casing/a556 - caliber = CALIBER_A556 +/obj/item/ammo_box/magazine/m223 + name = "toploader magazine (.223)" + icon_state = ".223" + ammo_type = /obj/item/ammo_casing/a223 + caliber = CALIBER_A223 max_ammo = 30 multiple_sprites = AMMO_BOX_FULL_EMPTY -/obj/item/ammo_box/magazine/m556/phasic - name = "toploader magazine (5.56mm Phasic)" - ammo_type = /obj/item/ammo_casing/a556/phasic +/obj/item/ammo_box/magazine/m223/phasic + name = "toploader magazine (.223 Phasic)" + ammo_type = /obj/item/ammo_casing/a223/phasic diff --git a/code/modules/projectiles/boxes_magazines/external/smg.dm b/code/modules/projectiles/boxes_magazines/external/smg.dm index a4e2489bdfa87..7e9fc44f58578 100644 --- a/code/modules/projectiles/boxes_magazines/external/smg.dm +++ b/code/modules/projectiles/boxes_magazines/external/smg.dm @@ -90,6 +90,10 @@ name = "SMG magazine (Armour Piercing .45)" ammo_type = /obj/item/ammo_casing/c45/ap +/obj/item/ammo_box/magazine/smgm45/hp + name = "SMG magazine (Hollow Point .45)" + ammo_type = /obj/item/ammo_casing/c45/hp + /obj/item/ammo_box/magazine/smgm45/incen name = "SMG magazine (Incendiary .45)" ammo_type = /obj/item/ammo_casing/c45/inc diff --git a/code/modules/projectiles/boxes_magazines/external/toy.dm b/code/modules/projectiles/boxes_magazines/external/toy.dm index 7503cd032f60d..3a841c605a18c 100644 --- a/code/modules/projectiles/boxes_magazines/external/toy.dm +++ b/code/modules/projectiles/boxes_magazines/external/toy.dm @@ -1,13 +1,13 @@ /obj/item/ammo_box/magazine/toy name = "foam force META magazine" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart + ammo_type = /obj/item/ammo_casing/foam_dart caliber = CALIBER_FOAM /obj/item/ammo_box/magazine/toy/smg name = "foam force SMG magazine" icon_state = "smg9mm" base_icon_state = "smg9mm" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart + ammo_type = /obj/item/ammo_casing/foam_dart max_ammo = 20 /obj/item/ammo_box/magazine/toy/smg/update_icon_state() @@ -15,7 +15,7 @@ icon_state = "[base_icon_state]-[LAZYLEN(stored_ammo) ? "full" : "empty"]" /obj/item/ammo_box/magazine/toy/smg/riot - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot + ammo_type = /obj/item/ammo_casing/foam_dart/riot /obj/item/ammo_box/magazine/toy/pistol name = "foam force pistol magazine" @@ -24,14 +24,14 @@ multiple_sprites = AMMO_BOX_FULL_EMPTY /obj/item/ammo_box/magazine/toy/pistol/riot - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot + ammo_type = /obj/item/ammo_casing/foam_dart/riot /obj/item/ammo_box/magazine/toy/smgm45 name = "donksoft SMG magazine" icon_state = "c20r45-toy" base_icon_state = "c20r45" caliber = CALIBER_FOAM - ammo_type = /obj/item/ammo_casing/caseless/foam_dart + ammo_type = /obj/item/ammo_casing/foam_dart max_ammo = 20 /obj/item/ammo_box/magazine/toy/smgm45/update_icon_state() @@ -40,13 +40,13 @@ /obj/item/ammo_box/magazine/toy/smgm45/riot icon_state = "c20r45-riot" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot + ammo_type = /obj/item/ammo_casing/foam_dart/riot /obj/item/ammo_box/magazine/toy/m762 name = "donksoft box magazine" - icon_state = "a762-toy" - base_icon_state = "a762" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart + icon_state = "a7mm-toy" + base_icon_state = "a7mm" + ammo_type = /obj/item/ammo_casing/foam_dart max_ammo = 50 /obj/item/ammo_box/magazine/toy/m762/update_icon_state() @@ -54,5 +54,5 @@ 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 + icon_state = "a7mm-riot" + ammo_type = /obj/item/ammo_casing/foam_dart/riot diff --git a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm index c4509b917c70c..c60ec087c5108 100644 --- a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm +++ b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm @@ -4,14 +4,18 @@ caliber = CALIBER_357 max_ammo = 7 -/obj/item/ammo_box/magazine/internal/cylinder/get_round(keep = 0) +///Here, we have to maintain the list size, to emulate a cylinder with several chambers, empty or otherwise. +/obj/item/ammo_box/magazine/internal/cylinder/remove_from_stored_ammo(atom/movable/gone) + for(var/index in 1 to length(stored_ammo)) + var/obj/item/ammo_casing/bullet = stored_ammo[index] + if(gone == bullet) + stored_ammo[index] = null + update_appearance() + return + +/obj/item/ammo_box/magazine/internal/cylinder/get_round() rotate() - - var/b = stored_ammo[1] - if(!keep) - stored_ammo[1] = null - - return b + return stored_ammo[1] /obj/item/ammo_box/magazine/internal/cylinder/proc/rotate() var/b = stored_ammo[1] @@ -22,15 +26,10 @@ for(var/i in 1 to rand(0, max_ammo*2)) rotate() -/obj/item/ammo_box/magazine/internal/cylinder/ammo_list(drop_list = FALSE) - var/list/L = list() - for(var/i=1 to stored_ammo.len) - var/obj/item/ammo_casing/bullet = stored_ammo[i] - if(bullet) - L.Add(bullet) - if(drop_list)//We have to maintain the list size, to emulate a cylinder - stored_ammo[i] = null - return L +/obj/item/ammo_box/magazine/internal/cylinder/ammo_list() + var/list/no_nulls_ammo = stored_ammo.Copy() + list_clear_nulls(no_nulls_ammo) + return no_nulls_ammo /obj/item/ammo_box/magazine/internal/cylinder/give_round(obj/item/ammo_casing/R, replace_spent = 0) if(!R || !(caliber ? (caliber == R.caliber) : (ammo_type == R.type))) diff --git a/code/modules/projectiles/boxes_magazines/internal/grenade.dm b/code/modules/projectiles/boxes_magazines/internal/grenade.dm index 88a93b13af575..aacd64383b0d9 100644 --- a/code/modules/projectiles/boxes_magazines/internal/grenade.dm +++ b/code/modules/projectiles/boxes_magazines/internal/grenade.dm @@ -12,6 +12,6 @@ /obj/item/ammo_box/magazine/internal/rocketlauncher name = "rocket launcher internal magazine" - ammo_type = /obj/item/ammo_casing/caseless/rocket + ammo_type = /obj/item/ammo_casing/rocket caliber = CALIBER_84MM max_ammo = 1 diff --git a/code/modules/projectiles/boxes_magazines/internal/rifle.dm b/code/modules/projectiles/boxes_magazines/internal/rifle.dm index 67afbed5b41d2..83133186c9ddc 100644 --- a/code/modules/projectiles/boxes_magazines/internal/rifle.dm +++ b/code/modules/projectiles/boxes_magazines/internal/rifle.dm @@ -1,13 +1,13 @@ /obj/item/ammo_box/magazine/internal/boltaction name = "bolt action rifle internal magazine" desc = "Oh god, this shouldn't be here" - ammo_type = /obj/item/ammo_casing/a762 - caliber = CALIBER_A762 + ammo_type = /obj/item/ammo_casing/strilka310 + caliber = CALIBER_STRILKA310 max_ammo = 5 multiload = TRUE /obj/item/ammo_box/magazine/internal/boltaction/surplus - ammo_type = /obj/item/ammo_casing/a762/surplus + ammo_type = /obj/item/ammo_casing/strilka310/surplus /obj/item/ammo_box/magazine/internal/boltaction/pipegun name = "pipegun internal magazine" @@ -21,14 +21,10 @@ /obj/item/ammo_box/magazine/internal/enchanted max_ammo = 1 - caliber = CALIBER_A762 - ammo_type = /obj/item/ammo_casing/a762/enchanted - -/obj/item/ammo_box/magazine/internal/arcane_barrage - caliber = CALIBER_A762 - ammo_type = /obj/item/ammo_casing/magic/arcane_barrage + caliber = CALIBER_STRILKA310 + ammo_type = /obj/item/ammo_casing/strilka310/enchanted /obj/item/ammo_box/magazine/internal/boltaction/harpoon max_ammo = 1 caliber = CALIBER_HARPOON - ammo_type = /obj/item/ammo_casing/caseless/harpoon + ammo_type = /obj/item/ammo_casing/harpoon diff --git a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm index 330823803b40b..dfd99e24766f2 100644 --- a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm +++ b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm @@ -21,6 +21,10 @@ ammo_type = /obj/item/ammo_casing/shotgun/beanbag max_ammo = 6 +/obj/item/ammo_box/magazine/internal/shot/com/compact + name = "compact shotgun internal magazine" + max_ammo = 5 + /obj/item/ammo_box/magazine/internal/shot/dual name = "double-barrel shotgun internal magazine" max_ammo = 2 @@ -29,6 +33,10 @@ name = "double-barrel shotgun internal magazine (slugs)" ammo_type = /obj/item/ammo_casing/shotgun +/obj/item/ammo_box/magazine/internal/shot/dual/breacherslug + name = "double-barrel shotgun internal magazine (breacher)" + ammo_type = /obj/item/ammo_casing/shotgun/breacher + /obj/item/ammo_box/magazine/internal/shot/riot name = "riot shotgun internal magazine" ammo_type = /obj/item/ammo_casing/shotgun/rubbershot diff --git a/code/modules/projectiles/boxes_magazines/internal/toy.dm b/code/modules/projectiles/boxes_magazines/internal/toy.dm index d369d33d2e6f3..639323f81d86d 100644 --- a/code/modules/projectiles/boxes_magazines/internal/toy.dm +++ b/code/modules/projectiles/boxes_magazines/internal/toy.dm @@ -1,5 +1,5 @@ /obj/item/ammo_box/magazine/internal/shot/toy - ammo_type = /obj/item/ammo_casing/caseless/foam_dart + ammo_type = /obj/item/ammo_casing/foam_dart caliber = CALIBER_FOAM max_ammo = 4 diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 30752d2868c81..ba45baac6d3af 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -27,6 +27,7 @@ var/vary_fire_sound = TRUE var/fire_sound_volume = 50 var/dry_fire_sound = 'sound/weapons/gun/general/dry_fire.ogg' + var/dry_fire_sound_volume = 30 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' @@ -50,6 +51,9 @@ /// Just 'slightly' snowflakey way to modify projectile damage for projectiles fired from this gun. var/projectile_damage_multiplier = 1 + /// Even snowflakier way to modify projectile wounding bonus/potential for projectiles fired from this gun. + var/projectile_wound_bonus = 0 + var/spread = 0 //Spread induced by the gun itself. var/randomspread = 1 //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once. @@ -91,28 +95,35 @@ QDEL_NULL(suppressed) return ..() +/obj/item/gun/apply_fantasy_bonuses(bonus) + . = ..() + fire_delay = modify_fantasy_variable("fire_delay", fire_delay, -bonus, 0) + projectile_damage_multiplier = modify_fantasy_variable("projectile_damage_multiplier", projectile_damage_multiplier, bonus/10, 0.1) + +/obj/item/gun/remove_fantasy_bonuses(bonus) + fire_delay = reset_fantasy_variable("fire_delay", fire_delay) + projectile_damage_multiplier = reset_fantasy_variable("projectile_damage_multiplier", projectile_damage_multiplier) + return ..() + /// Handles adding [the seclite mount component][/datum/component/seclite_attachable] to the gun. /// If the gun shouldn't have a seclight mount, override this with a return. /// Or, if a child of a gun with a seclite mount has slightly different behavior or icons, extend this. /obj/item/gun/proc/add_seclight_point() return -/obj/item/gun/handle_atom_del(atom/A) - if(A == pin) +/obj/item/gun/Exited(atom/movable/gone, direction) + . = ..() + if(gone == pin) pin = null - if(A == chambered) + if(gone == chambered) chambered = null update_appearance() - if(A == suppressed) + if(gone == suppressed) clear_suppressor() - return ..() - -/obj/item/gun/Exited(atom/movable/gone, direction) if(gone == bayonet) bayonet = null if(!QDELING(src)) update_appearance() - return ..() ///Clears var and updates icon. In the case of ballistic weapons, also updates the gun's weight. /obj/item/gun/proc/clear_suppressor() @@ -158,7 +169,7 @@ /obj/item/gun/proc/shoot_with_empty_chamber(mob/living/user as mob|obj) balloon_alert_to_viewers("*click*") - playsound(src, dry_fire_sound, 30, TRUE) + playsound(src, dry_fire_sound, dry_fire_sound_volume, TRUE) /obj/item/gun/proc/fire_sounds() if(suppressed) @@ -306,9 +317,8 @@ //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(user.combat_mode && !HAS_TRAIT(user, TRAIT_NO_GUN_AKIMBO)) + for(var/obj/item/gun/gun in user.held_items) if(gun == src || gun.weapon_weight >= WEAPON_MEDIUM) continue else if(gun.can_trigger_gun(user, akimbo_usage = TRUE)) @@ -354,7 +364,7 @@ /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) +/obj/item/gun/proc/process_burst(mob/living/user, atom/target, message = TRUE, params=null, zone_override = "", random_spread = 0, burst_spread_mult = 0, iteration = 0) if(!user || !firing_burst) firing_burst = FALSE return FALSE @@ -367,10 +377,11 @@ 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 + var/sprd if(randomspread) - sprd = round((rand(0, 1) - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread)) + sprd = round((rand(0, 1) - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (random_spread)) else //Smart spread - sprd = round((((rand_spr/burst_size) * iteration) - (0.5 + (rand_spr * 0.25))) * (randomized_gun_spread + randomized_bonus_spread)) + sprd = round((((burst_spread_mult/burst_size) * iteration) - (0.5 + (burst_spread_mult * 0.25))) * (random_spread)) before_firing(target,user) if(!chambered.fire_casing(target, user, params, ,suppressed, zone_override, sprd, src)) shoot_with_empty_chamber(user) @@ -392,8 +403,12 @@ return TRUE /obj/item/gun/proc/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) + var/base_bonus_spread = 0 if(user) - SEND_SIGNAL(user, COMSIG_MOB_FIRED_GUN, src, target, params, zone_override) + var/list/bonus_spread_values = list(base_bonus_spread, bonus_spread) + SEND_SIGNAL(user, COMSIG_MOB_FIRED_GUN, src, target, params, zone_override, bonus_spread_values) + base_bonus_spread = bonus_spread_values[MIN_BONUS_SPREAD_INDEX] + bonus_spread = bonus_spread_values[MAX_BONUS_SPREAD_INDEX] SEND_SIGNAL(src, COMSIG_GUN_FIRED, user, target, params, zone_override) @@ -403,17 +418,10 @@ 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/randomized_gun_spread = spread ? rand(0, spread) : 0 + var/total_random_spread = max(0, randomized_bonus_spread + randomized_gun_spread) + var/burst_spread_mult = rand() var/modified_delay = fire_delay if(user && HAS_TRAIT(user, TRAIT_DOUBLE_TAP)) @@ -422,14 +430,14 @@ 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)) + addtimer(CALLBACK(src, PROC_REF(process_burst), user, target, message, params, zone_override, total_random_spread, burst_spread_mult, 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)) + var/sprd = round((rand(0, 1) - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * total_random_spread) before_firing(target,user) if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, sprd, src)) shoot_with_empty_chamber(user) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 876adfdd3b57b..88d6a4e3161cf 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -47,10 +47,12 @@ ///Whether our gun clicks when it approaches an empty magazine/chamber var/click_on_low_ammo = TRUE - ///Whether the gun will spawn loaded with a magazine + /// What type (includes subtypes) of magazine will this gun accept being put into it + var/obj/item/ammo_box/magazine/accepted_magazine_type = /obj/item/ammo_box/magazine/m10mm + /// 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 + /// Change this if the gun should spawn with a different magazine type to what accepted_magazine_type defines. Will create errors if not a type or subtype of accepted magazine. + var/obj/item/ammo_box/magazine/spawn_magazine_type ///Whether the sprite has a visible magazine or not var/mag_display = TRUE ///Whether the sprite has a visible ammo display or not @@ -130,12 +132,16 @@ /obj/item/gun/ballistic/Initialize(mapload) . = ..() + if(!spawn_magazine_type) + spawn_magazine_type = accepted_magazine_type if (!spawnwithmagazine) bolt_locked = TRUE update_appearance() return if (!magazine) - magazine = new mag_type(src) + magazine = new spawn_magazine_type(src) + if(!istype(magazine, accepted_magazine_type)) + CRASH("[src] spawned with a magazine type that isn't allowed by its accepted_magazine_type!") if(bolt_type == BOLT_TYPE_STANDARD || internal_magazine) //Internal magazines shouldn't get magazine + 1. chamber_round() else @@ -151,9 +157,11 @@ AddElement(/datum/element/weapon_description, attached_proc = PROC_REF(add_notes_ballistic)) /obj/item/gun/ballistic/fire_sounds() - var/frequency_to_use = sin((90/magazine?.max_ammo) * get_ammo()) + var/max_ammo = magazine?.max_ammo || initial(spawn_magazine_type.max_ammo) + var/current_ammo = get_ammo() + var/frequency_to_use = sin((90 / max_ammo) * current_ammo) var/click_frequency_to_use = 1 - frequency_to_use * 0.75 - var/play_click = round(sqrt(magazine?.max_ammo * 2)) > get_ammo() + var/play_click = round(sqrt(max_ammo * 2)) > current_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 && click_on_low_ammo) @@ -173,8 +181,10 @@ /obj/item/gun/ballistic/proc/add_notes_ballistic() if(magazine) // Make sure you have a magazine, to get the notes from return "\n[magazine.add_notes_box()]" - else - return "\nThe warning attached to the magazine is missing..." + else if(chambered) // if you don't have a magazine, is there something chambered? + return "\n[chambered.add_notes_ammo()]" + else // we have a very expensive mechanical paperweight. + return "\nThe lack of magazine and usable cartridge in chamber makes its usefulness questionable, at best." /obj/item/gun/ballistic/vv_edit_var(vname, vval) . = ..() @@ -250,25 +260,33 @@ 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 + if(!QDELETED(casing)) + casing.bounce_away(TRUE) + SEND_SIGNAL(casing, COMSIG_CASING_EJECTED) else if(empty_chamber) + UnregisterSignal(chambered, COMSIG_MOVABLE_MOVED) chambered = null if (chamber_next_round && (magazine?.max_ammo > 1)) chamber_round() ///Used to chamber a new round and eject the old one -/obj/item/gun/ballistic/proc/chamber_round(keep_bullet = FALSE, spin_cylinder, replace_new_round) +/obj/item/gun/ballistic/proc/chamber_round(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 = magazine.get_round((bolt_type == BOLT_TYPE_OPEN && !bolt_locked) || bolt_type == BOLT_TYPE_NO_BOLT) + if (bolt_type != BOLT_TYPE_OPEN && !(internal_magazine && bolt_type == BOLT_TYPE_NO_BOLT)) chambered.forceMove(src) + else + RegisterSignal(chambered, COMSIG_MOVABLE_MOVED, PROC_REF(clear_chambered)) if(replace_new_round) magazine.give_round(new chambered.type) +/obj/item/gun/ballistic/proc/clear_chambered(datum/source) + SIGNAL_HANDLER + UnregisterSignal(chambered, COMSIG_MOVABLE_MOVED) + chambered = null + ///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 @@ -300,7 +318,7 @@ ///Handles all the logic needed for magazine insertion /obj/item/gun/ballistic/proc/insert_magazine(mob/user, obj/item/ammo_box/magazine/AM, display_message = TRUE) - if(!istype(AM, mag_type)) + if(!istype(AM, accepted_magazine_type)) balloon_alert(user, "[AM.name] doesn't fit!") return FALSE if(user.transferItemToLoc(AM, src)) @@ -312,7 +330,7 @@ else playsound(src, load_empty_sound, load_sound_volume, load_sound_vary) if (bolt_type == BOLT_TYPE_OPEN && !bolt_locked) - chamber_round(TRUE) + chamber_round() update_appearance() return TRUE else @@ -366,6 +384,8 @@ if (bolt_type == BOLT_TYPE_NO_BOLT || internal_magazine) if (chambered && !chambered.loaded_projectile) chambered.forceMove(drop_location()) + if(chambered != magazine?.stored_ammo[1]) + magazine.stored_ammo -= chambered chambered = null var/num_loaded = magazine?.attackby(A, user, params, TRUE) if (num_loaded) @@ -415,9 +435,6 @@ if (sawn_off) bonus_spread += SAWN_OFF_ACC_PENALTY - if(magazine && !chambered.is_cased_ammo) - magazine.stored_ammo -= chambered - return ..() /obj/item/gun/ballistic/shoot_live_shot(mob/living/user, pointblank = 0, atom/pbtarget = null, message = 1) @@ -489,9 +506,8 @@ 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)) + for(var/obj/item/ammo_casing/CB as anything in get_ammo_list(FALSE)) CB.forceMove(drop_location()) CB.bounce_away(FALSE, NONE) num_unloaded++ @@ -499,7 +515,7 @@ if(T && is_station_level(T.z)) SSblackbox.record_feedback("tally", "station_mess_created", 1, CB.name) if (num_unloaded) - balloon_alert(user, "[num_unloaded] [cartridge_wording] unloaded") + balloon_alert(user, "[num_unloaded] [cartridge_wording]\s unloaded") playsound(user, eject_sound, eject_sound_volume, eject_sound_vary) update_appearance() else @@ -541,14 +557,12 @@ return bullets ///gets a list of every bullet in the gun -/obj/item/gun/ballistic/proc/get_ammo_list(countchambered = TRUE, drop_all = FALSE) +/obj/item/gun/ballistic/proc/get_ammo_list(countchambered = TRUE) var/list/rounds = list() if(chambered && countchambered) rounds.Add(chambered) - if(drop_all) - chambered = null if(magazine) - rounds.Add(magazine.ammo_list(drop_all)) + rounds.Add(magazine.ammo_list()) return rounds #define BRAINS_BLOWN_THROW_RANGE 3 @@ -563,7 +577,7 @@ var/turf/T = get_turf(user) process_fire(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) + var/turf/target = get_ranged_target_turf(user, REVERSE_DIR(user.dir), BRAINS_BLOWN_THROW_RANGE) B.Remove(user) B.forceMove(T) var/datum/callback/gibspawner = CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(spawn_atom_to_turf), /obj/effect/gibspawner/generic, B, 1, FALSE, user) @@ -694,9 +708,9 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list( if(magazine) magazine.top_off() else - if(!mag_type) + if(!spawn_magazine_type) return - magazine = new mag_type(src) + magazine = new spawn_magazine_type(src) chamber_round() update_appearance() diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 652060a3ab3c8..3e286f6c58b18 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -53,7 +53,7 @@ actions_types = list() mag_display = TRUE empty_indicator = TRUE - mag_type = /obj/item/ammo_box/magazine/smgm9mm + accepted_magazine_type = /obj/item/ammo_box/magazine/smgm9mm pin = null bolt_type = BOLT_TYPE_LOCKING show_bolt_icon = FALSE @@ -71,7 +71,7 @@ icon_state = "c20r" inhand_icon_state = "c20r" selector_switch_icon = TRUE - mag_type = /obj/item/ammo_box/magazine/smgm45 + accepted_magazine_type = /obj/item/ammo_box/magazine/smgm45 fire_delay = 2 burst_size = 3 pin = /obj/item/firing_pin/implant/pindicate @@ -104,7 +104,7 @@ icon_state = "wt550" w_class = WEIGHT_CLASS_BULKY inhand_icon_state = "arg" - mag_type = /obj/item/ammo_box/magazine/wt550m9 + accepted_magazine_type = /obj/item/ammo_box/magazine/wt550m9 fire_delay = 2 can_suppress = FALSE burst_size = 1 @@ -125,7 +125,7 @@ desc = "An ancient 9mm submachine gun pattern updated and simplified to lower costs, though perhaps simplified too much." icon_state = "plastikov" inhand_icon_state = "plastikov" - mag_type = /obj/item/ammo_box/magazine/plastikov9mm + accepted_magazine_type = /obj/item/ammo_box/magazine/plastikov9mm burst_size = 5 spread = 25 can_suppress = FALSE @@ -139,7 +139,7 @@ name = "\improper Type U3 Uzi" desc = "A lightweight, burst-fire submachine gun, for when you really want someone dead. Uses 9mm rounds." icon_state = "miniuzi" - mag_type = /obj/item/ammo_box/magazine/uzim9mm + accepted_magazine_type = /obj/item/ammo_box/magazine/uzim9mm burst_size = 2 bolt_type = BOLT_TYPE_OPEN show_bolt_icon = FALSE @@ -154,7 +154,7 @@ w_class = WEIGHT_CLASS_BULKY inhand_icon_state = "m90" selector_switch_icon = TRUE - mag_type = /obj/item/ammo_box/magazine/m556 + accepted_magazine_type = /obj/item/ammo_box/magazine/m223 can_suppress = FALSE var/obj/item/gun/ballistic/revolver/grenadelauncher/underbarrel burst_size = 3 @@ -210,7 +210,7 @@ selector_switch_icon = TRUE w_class = WEIGHT_CLASS_BULKY slot_flags = 0 - mag_type = /obj/item/ammo_box/magazine/tommygunm45 + accepted_magazine_type = /obj/item/ammo_box/magazine/tommygunm45 can_suppress = FALSE burst_size = 1 actions_types = list() @@ -229,23 +229,22 @@ icon_state = "arg" inhand_icon_state = "arg" slot_flags = 0 - mag_type = /obj/item/ammo_box/magazine/m556 + accepted_magazine_type = /obj/item/ammo_box/magazine/m223 can_suppress = FALSE burst_size = 3 fire_delay = 1 - // L6 SAW // /obj/item/gun/ballistic/automatic/l6_saw name = "\improper L6 SAW" - desc = "A heavily modified 7.12x82mm light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation." + desc = "A heavily modified 7mm light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation." icon_state = "l6" inhand_icon_state = "l6closedmag" base_icon_state = "l6" w_class = WEIGHT_CLASS_HUGE slot_flags = 0 - mag_type = /obj/item/ammo_box/magazine/mm712x82 + accepted_magazine_type = /obj/item/ammo_box/magazine/m7mm weapon_weight = WEAPON_HEAVY burst_size = 1 actions_types = list() @@ -315,7 +314,7 @@ ..() /obj/item/gun/ballistic/automatic/l6_saw/attackby(obj/item/A, mob/user, params) - if(!cover_open && istype(A, mag_type)) + if(!cover_open && istype(A, accepted_magazine_type)) balloon_alert(user, "open the cover!") return ..() @@ -326,10 +325,9 @@ name = "Surplus Rifle" desc = "One of countless obsolete ballistic rifles that still sees use as a cheap deterrent. Uses 10mm ammo and its bulky frame prevents one-hand firing." icon_state = "surplus" - inhand_icon_state = "moistnugget" worn_icon_state = null weapon_weight = WEAPON_HEAVY - mag_type = /obj/item/ammo_box/magazine/m10mm/rifle + accepted_magazine_type = /obj/item/ammo_box/magazine/m10mm/rifle fire_delay = 30 burst_size = 1 can_unsuppress = TRUE @@ -347,7 +345,7 @@ icon_state = "oldrifle" w_class = WEIGHT_CLASS_BULKY inhand_icon_state = "arg" - mag_type = /obj/item/ammo_box/magazine/recharge + accepted_magazine_type = /obj/item/ammo_box/magazine/recharge empty_indicator = TRUE fire_delay = 2 can_suppress = FALSE diff --git a/code/modules/projectiles/guns/ballistic/bows/_bow.dm b/code/modules/projectiles/guns/ballistic/bows/_bow.dm index de798d0ae9f8c..c356d5b266c42 100644 --- a/code/modules/projectiles/guns/ballistic/bows/_bow.dm +++ b/code/modules/projectiles/guns/ballistic/bows/_bow.dm @@ -1,6 +1,6 @@ /obj/item/gun/ballistic/bow - icon = 'icons/obj/weapons/guns/bows/bows.dmi' + icon = 'icons/obj/weapons/bows/bows.dmi' lefthand_file = 'icons/mob/inhands/weapons/bows_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/bows_righthand.dmi' name = "bow" @@ -10,7 +10,7 @@ base_icon_state = "bow" load_sound = 'sound/weapons/gun/general/ballistic_click.ogg' fire_sound = 'sound/weapons/gun/bow/bow_fire.ogg' - mag_type = /obj/item/ammo_box/magazine/internal/bow + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/bow force = 15 pinless = TRUE attack_verb_continuous = list("whipped", "cracked") @@ -33,38 +33,33 @@ if(isnull(chambered)) return ..() - chambered.forceMove(drop_location()) - magazine.get_round(keep = FALSE) - - var/obj/item/ammo_casing/caseless/arrow/our_arrow = chambered - user.put_in_hands(our_arrow) - - drawn = FALSE - chambered = null + user.put_in_hands(chambered) + chambered = magazine.get_round() update_appearance() /obj/item/gun/ballistic/bow/proc/drop_arrow() - drawn = FALSE - if(chambered) - chambered.forceMove(drop_location()) - magazine.get_round(keep = FALSE) - chambered = null + chambered.forceMove(drop_location()) + chambered = magazine.get_round() update_appearance() -/obj/item/gun/ballistic/bow/chamber_round(keep_bullet = FALSE, spin_cylinder, replace_new_round) +/obj/item/gun/ballistic/bow/chamber_round(spin_cylinder, replace_new_round) if(chambered || !magazine) return - if(magazine.ammo_count()) - chambered = magazine.get_round(TRUE) - chambered.forceMove(src) + chambered = magazine.get_round() + RegisterSignal(chambered, COMSIG_MOVABLE_MOVED, PROC_REF(clear_chambered)) + update_appearance() + +/obj/item/gun/ballistic/bow/clear_chambered(datum/source) + . = ..() + drawn = FALSE /obj/item/gun/ballistic/bow/attack_self(mob/user) if(!chambered) balloon_alert(user, "no arrow nocked!") - else - balloon_alert(user, "[drawn ? "string released" : "string drawn"]") - drawn = !drawn - playsound(src, 'sound/weapons/gun/bow/bow_draw.ogg', 25, TRUE) + return + balloon_alert(user, "[drawn ? "string released" : "string drawn"]") + drawn = !drawn + playsound(src, 'sound/weapons/gun/bow/bow_draw.ogg', 25, TRUE) update_appearance() /obj/item/gun/ballistic/bow/afterattack(atom/target, mob/living/user, flag, params, passthrough = FALSE) @@ -74,11 +69,8 @@ if(!drawn) to_chat(user, span_warning("Without drawing the bow, the arrow uselessly falls to the ground.")) drop_arrow() - update_appearance() return - drawn = FALSE - . = ..() //fires, removing the arrow - update_appearance() + return ..() //fires, removing the arrow /obj/item/gun/ballistic/bow/equipped(mob/user, slot, initial) . = ..() @@ -94,17 +86,18 @@ addtimer(CALLBACK(src, PROC_REF(drop_arrow_if_not_held)), 0.1 SECONDS) /obj/item/gun/ballistic/bow/proc/drop_arrow_if_not_held() - if(!ismob(loc)) - if(drawn) - playsound(src, 'sound/weapons/gun/bow/bow_fire.ogg', 25, TRUE) - drop_arrow() + if(ismob(loc) || !chambered) + return + if(drawn) + playsound(src, 'sound/weapons/gun/bow/bow_fire.ogg', 25, TRUE) + drop_arrow() /obj/item/gun/ballistic/bow/shoot_with_empty_chamber(mob/living/user) return //no clicking sounds please /obj/item/ammo_box/magazine/internal/bow name = "bowstring" - ammo_type = /obj/item/ammo_casing/caseless/arrow + ammo_type = /obj/item/ammo_casing/arrow max_ammo = 1 start_empty = TRUE caliber = CALIBER_ARROW diff --git a/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm b/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm index 1782b21abf8d3..5d33b3fce5170 100644 --- a/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm +++ b/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm @@ -1,84 +1,94 @@ ///base arrow -/obj/item/ammo_casing/caseless/arrow +/obj/item/ammo_casing/arrow name = "arrow" desc = "Stabby Stabman!" - icon = 'icons/obj/weapons/guns/bows/arrows.dmi' + icon = 'icons/obj/weapons/bows/arrows.dmi' icon_state = "arrow" + base_icon_state = "arrow" inhand_icon_state = "arrow" - projectile_type = /obj/projectile/bullet/reusable/arrow + projectile_type = /obj/projectile/bullet/arrow flags_1 = NONE throwforce = 1 firing_effect_type = null caliber = CALIBER_ARROW - is_cased_ammo = FALSE + ///Whether the bullet type spawns another casing of the same type or not. + var/reusable = TRUE -/obj/item/ammo_casing/caseless/arrow/Initialize(mapload) +/obj/item/ammo_casing/arrow/Initialize(mapload) . = ..() - AddComponent(/datum/element/envenomable_casing) + AddElement(/datum/element/envenomable_casing) + AddElement(/datum/element/caseless, reusable) -///base arrow projectile -/obj/projectile/bullet/reusable/arrow - name = "arrow" - desc = "Ow! Get it out of me!" - icon = 'icons/obj/weapons/guns/bows/arrows.dmi' - icon_state = "arrow_projectile" - ammo_type = /obj/item/ammo_casing/caseless/arrow - damage = 50 - speed = 1 - range = 25 +/obj/item/ammo_casing/arrow/update_icon_state() + . = ..() + icon_state = "[base_icon_state]" -///*sigh* NON-REUSABLE base arrow projectile. In the future: let's componentize the reusable subtype, jesus +///base arrow projectile /obj/projectile/bullet/arrow name = "arrow" desc = "Ow! Get it out of me!" - icon = 'icons/obj/weapons/guns/bows/arrows.dmi' + icon = 'icons/obj/weapons/bows/arrows.dmi' icon_state = "arrow_projectile" damage = 50 speed = 1 range = 25 - -/// despawning arrow type -/obj/item/ammo_casing/caseless/arrow/despawning/dropped() - . = ..() - addtimer(CALLBACK(src, PROC_REF(floor_vanish)), 5 SECONDS) - -/obj/item/ammo_casing/caseless/arrow/despawning/proc/floor_vanish() - if(isturf(loc)) - qdel(src) + embedding = list( + embed_chance = 90, + fall_chance = 2, + jostle_chance = 2, + ignore_throwspeed_threshold = TRUE, + pain_stam_pct = 0.5, + pain_mult = 3, + jostle_pain_mult = 3, + rip_time = 1 SECONDS + ) + shrapnel_type = /obj/item/ammo_casing/arrow /// holy arrows -/obj/item/ammo_casing/caseless/arrow/holy +/obj/item/ammo_casing/arrow/holy name = "holy arrow" desc = "A holy diver seeking its target." icon_state = "holy_arrow" inhand_icon_state = "holy_arrow" - projectile_type = /obj/projectile/bullet/reusable/arrow/holy + base_icon_state = "holy_arrow" + projectile_type = /obj/projectile/bullet/arrow/holy /// holy arrow projectile -/obj/projectile/bullet/reusable/arrow/holy +/obj/projectile/bullet/arrow/holy name = "holy arrow" desc = "Here it comes, cultist scum!" icon_state = "holy_arrow_projectile" - ammo_type = /obj/item/ammo_casing/caseless/arrow/holy damage = 20 //still a lot but this is roundstart gear so far less + shrapnel_type =/obj/item/ammo_casing/arrow/holy + embedding = list( + embed_chance = 50, + fall_chance = 2, + jostle_chance = 0, + ignore_throwspeed_threshold = TRUE, + pain_stam_pct = 0.5, + pain_mult = 3, + rip_time = 1 SECONDS + ) -/obj/projectile/bullet/reusable/arrow/holy/Initialize(mapload) +/obj/projectile/bullet/arrow/holy/Initialize(mapload) . = ..() //50 damage to revenants AddElement(/datum/element/bane, target_type = /mob/living/simple_animal/revenant, damage_multiplier = 0, added_damage = 30) /// special pyre sect arrow /// in the future, this needs a special sprite, but bows don't support non-hardcoded arrow sprites -/obj/item/ammo_casing/caseless/arrow/holy/blazing +/obj/item/ammo_casing/arrow/holy/blazing name = "blazing star arrow" desc = "A holy diver seeking its target, blessed with fire. Will ignite on hit, destroying the arrow. But if you hit an already ignited target...?" projectile_type = /obj/projectile/bullet/arrow/blazing + reusable = FALSE /obj/projectile/bullet/arrow/blazing name = "blazing arrow" desc = "THE UNMATCHED POWER OF THE SUN" icon_state = "holy_arrow_projectile" damage = 20 + embedding = null /obj/projectile/bullet/arrow/blazing/on_hit(atom/target, blocked, pierce_hit) . = ..() diff --git a/code/modules/projectiles/guns/ballistic/bows/bow_quivers.dm b/code/modules/projectiles/guns/ballistic/bows/bow_quivers.dm index 19a00a95c96a6..7d8669c8618ae 100644 --- a/code/modules/projectiles/guns/ballistic/bows/bow_quivers.dm +++ b/code/modules/projectiles/guns/ballistic/bows/bow_quivers.dm @@ -2,20 +2,21 @@ /obj/item/storage/bag/quiver name = "quiver" desc = "Holds arrows for your bow. Good, because while pocketing arrows is possible, it surely can't be pleasant." - icon = 'icons/obj/weapons/guns/bows/quivers.dmi' + icon = 'icons/obj/weapons/bows/quivers.dmi' icon_state = "quiver" inhand_icon_state = null worn_icon_state = "harpoon_quiver" /// type of arrow the quivel should hold - var/arrow_path = /obj/item/ammo_casing/caseless/arrow + var/arrow_path = /obj/item/ammo_casing/arrow /obj/item/storage/bag/quiver/Initialize(mapload) . = ..() + atom_storage.numerical_stacking = TRUE atom_storage.max_specific_storage = WEIGHT_CLASS_TINY atom_storage.max_slots = 40 atom_storage.max_total_storage = 100 atom_storage.set_holdable(list( - /obj/item/ammo_casing/caseless/arrow, + /obj/item/ammo_casing/arrow, )) /obj/item/storage/bag/quiver/PopulateContents() @@ -23,13 +24,10 @@ for(var/i in 1 to 10) new arrow_path(src) -/obj/item/storage/bag/quiver/despawning - arrow_path = /obj/item/ammo_casing/caseless/arrow/despawning - /obj/item/storage/bag/quiver/holy name = "divine quiver" desc = "Holds arrows for your divine bow, where they wait to find their target." icon_state = "holyquiver" inhand_icon_state = "holyquiver" worn_icon_state = "holyquiver" - arrow_path = /obj/item/ammo_casing/caseless/arrow/holy + arrow_path = /obj/item/ammo_casing/arrow/holy diff --git a/code/modules/projectiles/guns/ballistic/bows/bow_types.dm b/code/modules/projectiles/guns/ballistic/bows/bow_types.dm index 8cb11bc7785e3..355ed3575a814 100644 --- a/code/modules/projectiles/guns/ballistic/bows/bow_types.dm +++ b/code/modules/projectiles/guns/ballistic/bows/bow_types.dm @@ -14,11 +14,11 @@ worn_icon_state = "holybow" slot_flags = ITEM_SLOT_BACK obj_flags = UNIQUE_RENAME - mag_type = /obj/item/ammo_box/magazine/internal/bow/holy + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/bow/holy /obj/item/ammo_box/magazine/internal/bow/holy name = "divine bowstring" - ammo_type = /obj/item/ammo_casing/caseless/arrow/holy + ammo_type = /obj/item/ammo_casing/arrow/holy /obj/item/gun/ballistic/bow/divine/Initialize(mapload) . = ..() @@ -39,8 +39,7 @@ var/obj/effect/rune/target_rune = target if(target_rune.log_when_erased) - user.log_message("erased [target_rune.cultist_name] rune using a null rod", LOG_GAME) - message_admins("[ADMIN_LOOKUPFLW(user)] erased a [target_rune.cultist_name] rune with a null rod.") + user.log_message("erased [target_rune.cultist_name] rune using [src]", LOG_GAME) SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_NARNAR] = TRUE /obj/item/gun/ballistic/bow/divine/with_quiver/Initialize(mapload) diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm index 60225e8db1212..82f24e21b73cc 100644 --- a/code/modules/projectiles/guns/ballistic/launchers.dm +++ b/code/modules/projectiles/guns/ballistic/launchers.dm @@ -6,7 +6,7 @@ name = "grenade launcher" icon_state = "dshotgun_sawn" inhand_icon_state = "gun" - mag_type = /obj/item/ammo_box/magazine/internal/grenadelauncher + accepted_magazine_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 @@ -23,9 +23,9 @@ /obj/item/gun/ballistic/revolver/grenadelauncher/cyborg desc = "A 6-shot grenade launcher." name = "multi grenade launcher" - icon = 'icons/mecha/mecha_equipment.dmi' + icon = 'icons/mob/mecha_equipment.dmi' icon_state = "mecha_grenadelnchr" - mag_type = /obj/item/ammo_box/magazine/internal/cylinder/grenademulti + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/cylinder/grenademulti pin = /obj/item/firing_pin /obj/item/gun/ballistic/revolver/grenadelauncher/cyborg/attack_self() @@ -36,7 +36,7 @@ desc = "A prototype pistol designed to fire self propelled rockets." icon_state = "gyropistol" fire_sound = 'sound/weapons/gun/general/grenade_launch.ogg' - mag_type = /obj/item/ammo_box/magazine/m75 + accepted_magazine_type = /obj/item/ammo_box/magazine/m75 burst_size = 1 fire_delay = 0 actions_types = list() @@ -48,7 +48,7 @@ A sticker near the cheek rest reads, \"ENSURE AREA BEHIND IS CLEAR BEFORE FIRING\"" icon_state = "rocketlauncher" inhand_icon_state = "rocketlauncher" - mag_type = /obj/item/ammo_box/magazine/internal/rocketlauncher + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/rocketlauncher fire_sound = 'sound/weapons/gun/general/rocket_launch.ogg' w_class = WEIGHT_CLASS_BULKY can_suppress = FALSE @@ -89,22 +89,22 @@ 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()) - user.notransform = TRUE + ADD_TRAIT(user, TRAIT_NO_TRANSFORM, REF(src)) playsound(src, 'sound/vehicles/rocketlaunch.ogg', 80, TRUE, 5) animate(user, pixel_z = 300, time = 30, easing = LINEAR_EASING) sleep(7 SECONDS) animate(user, pixel_z = 0, time = 5, easing = LINEAR_EASING) sleep(0.5 SECONDS) - user.notransform = FALSE + REMOVE_TRAIT(user, TRAIT_NO_TRANSFORM, REF(src)) process_fire(user, user, TRUE) if(!QDELETED(user)) //if they weren't gibbed by the explosion, take care of them for good. - user.gib() + user.gib(DROP_ALL_REMAINS) return MANUAL_SUICIDE else sleep(0.5 SECONDS) shoot_with_empty_chamber(user) sleep(2 SECONDS) - user.visible_message(span_warning("[user] looks about the room realizing [user.p_theyre()] still there. [user.p_they(TRUE)] proceed to shove [src] down their throat and choke [user.p_them()]self with it!"), \ + user.visible_message(span_warning("[user] looks about the room realizing [user.p_theyre()] still there. [user.p_They()] proceed to shove [src] down their throat and choke [user.p_them()]self with it!"), \ span_userdanger("You look around after realizing you're still here, then proceed to choke yourself to death with [src]!")) sleep(2 SECONDS) return OXYLOSS diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index 703b908f2bee4..b247bd3c2d681 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -3,7 +3,7 @@ desc = "A small, easily concealable 9mm handgun. Has a threaded barrel for suppressors." icon_state = "pistol" w_class = WEIGHT_CLASS_SMALL - mag_type = /obj/item/ammo_box/magazine/m9mm + accepted_magazine_type = /obj/item/ammo_box/magazine/m9mm can_suppress = TRUE burst_size = 1 fire_delay = 0 @@ -28,7 +28,7 @@ spawnwithmagazine = FALSE /obj/item/gun/ballistic/automatic/pistol/fire_mag - mag_type = /obj/item/ammo_box/magazine/m9mm/fire + spawn_magazine_type = /obj/item/ammo_box/magazine/m9mm/fire /obj/item/gun/ballistic/automatic/pistol/suppressed/Initialize(mapload) . = ..() @@ -39,7 +39,7 @@ name = "\improper Ansem pistol" desc = "The spiritual successor of the Makarov, or maybe someone just dropped their gun in a bucket of paint. The gun is chambered in 10mm." icon_state = "pistol_evil" - mag_type = /obj/item/ammo_box/magazine/m10mm + accepted_magazine_type = /obj/item/ammo_box/magazine/m10mm empty_indicator = TRUE suppressor_x_offset = 12 @@ -48,7 +48,7 @@ desc = "A classic .45 handgun with a small magazine capacity." icon_state = "m1911" w_class = WEIGHT_CLASS_NORMAL - mag_type = /obj/item/ammo_box/magazine/m45 + accepted_magazine_type = /obj/item/ammo_box/magazine/m45 can_suppress = FALSE fire_sound = 'sound/weapons/gun/pistol/shot_alt.ogg' rack_sound = 'sound/weapons/gun/pistol/rack.ogg' @@ -63,7 +63,7 @@ desc = "A robust .50 AE handgun." icon_state = "deagle" force = 14 - mag_type = /obj/item/ammo_box/magazine/m50 + accepted_magazine_type = /obj/item/ammo_box/magazine/m50 can_suppress = FALSE mag_display = TRUE fire_sound = 'sound/weapons/gun/rifle/shot.ogg' @@ -83,28 +83,24 @@ /obj/item/gun/ballistic/automatic/pistol/deagle/regal name = "\improper Regal Condor" - desc = "Unlike the Desert Eagle, this weapon seems to utilize some kind of advance internal stabilization system to significantly \ - reduce felt recoil and substantially increases overall accuracy, though at the cost of using a smaller caliber. This modification does \ - allow it to fire in a 2-round burst. Uses 10mm ammo." + desc = "Unlike the Desert Eagle, this weapon seems to utilize some kind of advanced internal stabilization system to significantly \ + reduce felt recoil and increase overall accuracy, at the cost of using a smaller caliber. \ + This does allow it to fire a very quick 2-round burst. Uses 10mm ammo." icon_state = "reagle" inhand_icon_state = "deagleg" burst_size = 2 fire_delay = 1 - spread = 10 projectile_damage_multiplier = 1.25 - mag_type = /obj/item/ammo_box/magazine/r10mm + accepted_magazine_type = /obj/item/ammo_box/magazine/r10mm actions_types = list(/datum/action/item_action/toggle_firemode) obj_flags = UNIQUE_RENAME // if you did the sidequest, you get the customization -/obj/item/gun/ballistic/automatic/pistol/deagle/regal/no_mag - spawnwithmagazine = FALSE - /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." icon_state = "aps" w_class = WEIGHT_CLASS_NORMAL - mag_type = /obj/item/ammo_box/magazine/m9mm_aps + accepted_magazine_type = /obj/item/ammo_box/magazine/m9mm_aps can_suppress = TRUE burst_size = 3 fire_delay = 1 diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 16d2408be0202..2b62416fe7f42 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -2,7 +2,7 @@ name = "\improper .357 revolver" desc = "A suspicious revolver. Uses .357 ammo." icon_state = "revolver" - mag_type = /obj/item/ammo_box/magazine/internal/cylinder + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/cylinder fire_sound = 'sound/weapons/gun/revolver/shot_alt.ogg' load_sound = 'sound/weapons/gun/revolver/load_bullet.ogg' eject_sound = 'sound/weapons/gun/revolver/empty.ogg' @@ -21,13 +21,17 @@ last_fire = world.time -/obj/item/gun/ballistic/revolver/chamber_round(keep_bullet, spin_cylinder = TRUE, replace_new_round) +/obj/item/gun/ballistic/revolver/chamber_round(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(chambered) + UnregisterSignal(chambered, COMSIG_MOVABLE_MOVED) if(spin_cylinder) chambered = magazine.get_round(TRUE) else chambered = magazine.stored_ammo[1] + if(chambered) + RegisterSignal(chambered, COMSIG_MOVABLE_MOVED, PROC_REF(clear_chambered)) /obj/item/gun/ballistic/revolver/shoot_with_empty_chamber(mob/living/user as mob|obj) ..() @@ -100,7 +104,7 @@ /obj/item/gun/ballistic/revolver/c38 name = "\improper .38 revolver" desc = "A classic, if not outdated, lethal firearm. Uses .38 Special rounds." - mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev38 + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/cylinder/rev38 icon_state = "c38" fire_sound = 'sound/weapons/gun/revolver/shot.ogg' @@ -154,7 +158,7 @@ icon_state = "nagant" can_suppress = TRUE - mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev762 + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/cylinder/rev762 // A gun to play Russian Roulette! @@ -164,7 +168,7 @@ name = "\improper Russian revolver" desc = "A Russian-made revolver for drinking games. Uses .357 ammo, and has a mechanism requiring you to spin the chamber before each trigger pull." icon_state = "russianrevolver" - mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rus357 + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/cylinder/rus357 var/spun = FALSE hidden_chambered = TRUE //Cheater. gun_flags = NOT_A_REAL_GUN @@ -271,10 +275,15 @@ user.visible_message(span_danger("[user.name]'s soul is captured by \the [src]!"), span_userdanger("You've lost the gamble! Your soul is forfeit!")) /obj/item/gun/ballistic/revolver/reverse //Fires directly at its user... unless the user is a clown, of course. - name = "\improper Syndicate Revolver" clumsy_check = FALSE icon_state = "revolversyndie" +/obj/item/gun/ballistic/revolver/reverse/Initialize(mapload) + . = ..() + var/obj/item/gun/ballistic/revolver/syndicate/syndie_revolver = /obj/item/gun/ballistic/revolver/syndicate + name = initial(syndie_revolver.name) + desc = initial(syndie_revolver.desc) + /obj/item/gun/ballistic/revolver/reverse/can_trigger_gun(mob/living/user, akimbo_usage) if(akimbo_usage) return FALSE diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index 22d6db23bbb2d..67c70352ff306 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -1,17 +1,15 @@ /obj/item/gun/ballistic/rifle name = "Bolt Rifle" desc = "Some kind of bolt action rifle. You get the feeling you shouldn't have this." - icon = 'icons/obj/weapons/guns/mosinnagant.dmi' - icon_state = "moistnugget" + icon = 'icons/obj/weapons/guns/wide_guns.dmi' + icon_state = "sakhno" w_class = WEIGHT_CLASS_BULKY - inhand_icon_state = "moistnugget" - worn_icon_state = "moistnugget" - mag_type = /obj/item/ammo_box/magazine/internal/boltaction + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction bolt_wording = "bolt" bolt_type = BOLT_TYPE_LOCKING semi_auto = FALSE internal_magazine = TRUE - fire_sound = 'sound/weapons/gun/rifle/shot.ogg' + fire_sound = 'sound/weapons/gun/rifle/shot_heavy.ogg' fire_sound_volume = 90 rack_sound = 'sound/weapons/gun/rifle/bolt_out.ogg' bolt_drop_sound = 'sound/weapons/gun/rifle/bolt_in.ogg' @@ -41,35 +39,39 @@ /////////////////////// /obj/item/gun/ballistic/rifle/boltaction - name = "\improper Mosin Nagant" - desc = "A classic Mosin Nagant. They don't make them like they used to. Well, okay, in all honesty, this one is actually \ - a new refurbished version. So it works just fine! Often found in the hands of underpaid Nanotrasen interns, \ - Russian military LARPers, actual Space Russians, revolutionaries and cargo technicians. Still feels slightly moist." - sawn_desc = "A sawn-off Mosin Nagant, popularly known as an \"Obrez\". \ + name = "\improper Sakhno Precision Rifle" + desc = "A Sakhno Precision Rifle, a bolt action weapon that was (and certainly still is) popular with \ + frontiersmen, cargo runners, private security forces, explorers, and other unsavoury types. This particular \ + pattern of the rifle dates back all the way to 2440." + sawn_desc = "A sawn-off Sakhno Precision Rifle, popularly known as an \"Obrez\". \ There was probably a reason it wasn't manufactured this short to begin with. \ - This one is still in surprisingly good condition. Often found in the hands \ - of underpaid Nanotrasen interns without a care for company property, Russian military LARPers, \ - actual drunk Space Russians, Tiger Co-op assassins and cargo technicians. Still feels slightly moist." - weapon_weight = WEAPON_HEAVY - icon_state = "moistnugget" - inhand_icon_state = "moistnugget" + Despite the terrible nature of the modification, the weapon seems otherwise in good condition." + + icon_state = "sakhno" + inhand_icon_state = "sakhno" + worn_icon_state = "sakhno" + slot_flags = ITEM_SLOT_BACK - mag_type = /obj/item/ammo_box/magazine/internal/boltaction + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction can_bayonet = TRUE - knife_x_offset = 37 - knife_y_offset = 14 + knife_x_offset = 42 + knife_y_offset = 12 can_be_sawn_off = TRUE + weapon_weight = WEAPON_HEAVY var/jamming_chance = 20 var/unjam_chance = 10 var/jamming_increment = 5 var/jammed = FALSE var/can_jam = FALSE + SET_BASE_PIXEL(-8, 0) + /obj/item/gun/ballistic/rifle/boltaction/sawoff(mob/user) . = ..() if(.) spread = 36 can_bayonet = FALSE + SET_BASE_PIXEL(0, 0) update_appearance() /obj/item/gun/ballistic/rifle/boltaction/attack_self(mob/user) @@ -123,40 +125,49 @@ icon_state = "speargun" inhand_icon_state = "speargun" worn_icon_state = "speargun" - mag_type = /obj/item/ammo_box/magazine/internal/boltaction/harpoon + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/harpoon fire_sound = 'sound/weapons/gun/sniper/shot.ogg' can_be_sawn_off = FALSE + SET_BASE_PIXEL(0, 0) + /obj/item/gun/ballistic/rifle/boltaction/surplus - desc = "A classic Mosin Nagant, ruined by centuries of moisture. Some Space Russians claim that the moisture \ - is a sign of good luck. A sober user will know that this thing is going to fucking jam. Repeatedly. \ - Often found in the hands of cargo technicians, Russian military LARPers, Tiger Co-Op terrorist cells, \ - cryo-frozen Space Russians, and security personnel with a bone to pick. EXTREMELY moist." - sawn_desc = "A sawn-off Mosin Nagant, popularly known as an \"Obrez\". \ + name = "\improper Sakhno M2442 Army" + desc = "A modification of the Sakhno Precision Rifle, \"Sakhno M2442 Army\" is stamped into the side. \ + It is unknown what army this pattern of rifle was made for or if it was ever even used by an army \ + of any sort. What you can discern, however, is that its previous owner did not treat the weapon well. \ + For some reason, there's moisture all through the internals." + sawn_desc = "A sawn-off Sakhno Precision Rifle, popularly known as an \"Obrez\". \ + \"Sakhno M2442 Army\" is stamped into the side of it. \ There was probably a reason it wasn't manufactured this short to begin with. \ - This one has been ruined by centuries of moisture and WILL jam. Often found in the hands of \ - cargo technicians with a death wish, Russian military LARPers, actual drunk Space Russians, \ - Tiger Co-op assassins, cryo-frozen Space Russians, and security personnel with \ - little care for professional conduct while making 'arrests' point blank in the back of the head \ - until the gun clicks. EXTREMELY moist." - mag_type = /obj/item/ammo_box/magazine/internal/boltaction/surplus + Cutting the weapon down seems to have not helped with the moisture problem." + icon_state = "sakhno_tactifucked" + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/surplus can_jam = TRUE /obj/item/gun/ballistic/rifle/boltaction/prime - name = "\improper Regal Nagant" - desc = "A prized hunting Mosin Nagant. Used for the most dangerous game." - icon_state = "moistprime" - inhand_icon_state = "moistprime" - worn_icon_state = "moistprime" + name = "\improper Sakhno-Zhihao Sporting Rifle" + desc = "An upgrade and modernisation of the original Sakhno rifle, made with such wonders as \ + modern materials, a scope, and other impressive technological advancements that, to be honest, \ + were already around when the original weapon was designed. Surprisingly for a rifle of this type, \ + the scope actually has magnification, rather than being decorative." + icon_state = "zhihao" + inhand_icon_state = "zhihao" + worn_icon_state = "zhihao" can_be_sawn_off = TRUE - sawn_desc = "A sawn-off Regal Nagant... Doing this was a sin, I hope you're happy. \ - You are now probably one of the few people in the universe to ever hold a \"Regal Obrez\". \ - Even thinking about that name combination makes you ill." + sawn_desc = "A sawn-off Sakhno-Zhihao Sporting Rifle... Doing this was a sin, I hope you're happy. \ + You are now probably one of the few people in the universe to ever hold an \"Obrez Moderna\". \ + All you had to do was take an allen wrench to the stock to take it off. But no, you just had to \ + go for the saw." + +/obj/item/gun/ballistic/rifle/boltaction/prime/Initialize(mapload) + . = ..() + AddComponent(/datum/component/scope, range_modifier = 1.5) /obj/item/gun/ballistic/rifle/boltaction/prime/sawoff(mob/user) . = ..() if(.) - name = "\improper Regal Obrez" // wear it loud and proud + name = "\improper Obrez Moderna" // wear it loud and proud /obj/item/gun/ballistic/rifle/boltaction/pipegun name = "pipegun" @@ -170,9 +181,9 @@ inhand_x_dimension = 64 inhand_y_dimension = 64 fire_sound = 'sound/weapons/gun/sniper/shot.ogg' - mag_type = /obj/item/ammo_box/magazine/internal/boltaction/pipegun + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/pipegun initial_caliber = CALIBER_SHOTGUN - alternative_caliber = CALIBER_A762 + alternative_caliber = CALIBER_STRILKA310 initial_fire_sound = 'sound/weapons/gun/sniper/shot.ogg' alternative_fire_sound = 'sound/weapons/gun/shotgun/shot.ogg' can_modify_ammo = TRUE @@ -181,6 +192,8 @@ can_be_sawn_off = FALSE projectile_damage_multiplier = 0.75 + SET_BASE_PIXEL(0, 0) + /obj/item/gun/ballistic/rifle/boltaction/pipegun/handle_chamber() . = ..() do_sparks(1, TRUE, src) @@ -191,7 +204,7 @@ icon_state = "musket_prime" inhand_icon_state = "musket_prime" worn_icon_state = "musket_prime" - mag_type = /obj/item/ammo_box/magazine/internal/boltaction/pipegun/prime + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/pipegun/prime projectile_damage_multiplier = 1 /// MAGICAL BOLT ACTIONS + ARCANE BARRAGE? /// @@ -199,25 +212,15 @@ /obj/item/gun/ballistic/rifle/enchanted name = "enchanted bolt action rifle" desc = "Careful not to lose your head." + icon_state = "enchanted_rifle" + inhand_icon_state = "enchanted_rifle" + worn_icon_state = "enchanted_rifle" + slot_flags = ITEM_SLOT_BACK var/guns_left = 30 - mag_type = /obj/item/ammo_box/magazine/internal/enchanted + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/enchanted can_be_sawn_off = FALSE -/obj/item/gun/ballistic/rifle/enchanted/arcane_barrage - name = "arcane barrage" - desc = "Pew Pew Pew." - fire_sound = 'sound/weapons/emitter.ogg' - pin = /obj/item/firing_pin/magic - icon_state = "arcane_barrage" - inhand_icon_state = "arcane_barrage" - slot_flags = null - can_bayonet = FALSE - item_flags = NEEDS_PERMIT | DROPDEL | ABSTRACT | NOBLUDGEON - flags_1 = NONE - trigger_guard = TRIGGER_GUARD_ALLOW_ALL - show_bolt_icon = FALSE //It's a magic hand, not a rifle - - mag_type = /obj/item/ammo_box/magazine/internal/arcane_barrage + SET_BASE_PIXEL(-8, 0) /obj/item/gun/ballistic/rifle/enchanted/dropped() . = ..() @@ -228,9 +231,6 @@ /obj/item/gun/ballistic/rifle/enchanted/proc/discard_gun(mob/living/user) user.throw_item(pick(oview(7,get_turf(user)))) -/obj/item/gun/ballistic/rifle/enchanted/arcane_barrage/discard_gun(mob/living/user) - qdel(src) - /obj/item/gun/ballistic/rifle/enchanted/attack_self() return @@ -256,6 +256,10 @@ It is also able to be suppressed....somehow." icon = 'icons/obj/weapons/guns/ballistic.dmi' icon_state = "sniper" + lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + inhand_x_dimension = 32 + inhand_y_dimension = 32 weapon_weight = WEAPON_HEAVY inhand_icon_state = "sniper" worn_icon_state = null @@ -265,7 +269,7 @@ rack_sound = 'sound/weapons/gun/sniper/rack.ogg' suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' recoil = 2 - mag_type = /obj/item/ammo_box/magazine/sniper_rounds + accepted_magazine_type = /obj/item/ammo_box/magazine/sniper_rounds internal_magazine = FALSE w_class = WEIGHT_CLASS_NORMAL slot_flags = ITEM_SLOT_BACK @@ -283,7 +287,7 @@ /obj/item/gun/ballistic/rifle/sniper_rifle/Initialize(mapload) . = ..() - AddComponent(/datum/component/scope, range_modifier = 7) //enough range to at least make extremely good use of the penetrator rounds + AddComponent(/datum/component/scope, range_modifier = 4) //enough range to at least make extremely good use of the penetrator rounds /obj/item/gun/ballistic/rifle/sniper_rifle/reset_semicd() . = ..() diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 3ce491f1b9de3..ff04499c41be5 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -16,7 +16,7 @@ force = 10 flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BACK - mag_type = /obj/item/ammo_box/magazine/internal/shot + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot semi_auto = FALSE internal_magazine = TRUE casing_ejector = FALSE @@ -34,7 +34,7 @@ . = 1 /obj/item/gun/ballistic/shotgun/lethal - mag_type = /obj/item/ammo_box/magazine/internal/shot/lethal + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/lethal // RIOT SHOTGUN // @@ -44,7 +44,7 @@ icon_state = "riotshotgun" inhand_icon_state = "shotgun" fire_delay = 8 - mag_type = /obj/item/ammo_box/magazine/internal/shot/riot + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/riot sawn_desc = "Come with me if you want to live." can_be_sawn_off = TRUE @@ -60,9 +60,16 @@ icon_state = "cshotgun" inhand_icon_state = "shotgun_combat" fire_delay = 5 - mag_type = /obj/item/ammo_box/magazine/internal/shot/com + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/com w_class = WEIGHT_CLASS_HUGE +/obj/item/gun/ballistic/shotgun/automatic/combat/compact + name = "compact shotgun" + desc = "A compact version of the semi automatic combat shotgun. For close encounters." + icon_state = "cshotgunc" + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/com/compact + w_class = WEIGHT_CLASS_BULKY + //Dual Feed Shotgun /obj/item/gun/ballistic/shotgun/automatic/dual_tube @@ -77,7 +84,7 @@ worn_icon_state = "cshotgun" w_class = WEIGHT_CLASS_HUGE semi_auto = TRUE - mag_type = /obj/item/ammo_box/magazine/internal/shot/tube + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/tube /// If defined, the secondary tube is this type, if you want different shell loads var/alt_mag_type /// If TRUE, we're drawing from the alternate_magazine @@ -96,7 +103,7 @@ /obj/item/gun/ballistic/shotgun/automatic/dual_tube/Initialize(mapload) . = ..() - alt_mag_type = alt_mag_type || mag_type + alt_mag_type = alt_mag_type || spawn_magazine_type alternate_magazine = new alt_mag_type(src) /obj/item/gun/ballistic/shotgun/automatic/dual_tube/Destroy() @@ -139,7 +146,7 @@ inhand_y_dimension = 32 projectile_damage_multiplier = 1.2 weapon_weight = WEAPON_MEDIUM - mag_type = /obj/item/ammo_box/magazine/m12g + accepted_magazine_type = /obj/item/ammo_box/magazine/m12g can_suppress = FALSE burst_size = 1 fire_delay = 0 @@ -161,7 +168,7 @@ /obj/item/gun/ballistic/shotgun/bulldog/Initialize(mapload) . = ..() - secondary_magazine_type = secondary_magazine_type || mag_type + secondary_magazine_type = secondary_magazine_type || spawn_magazine_type secondary_magazine = new secondary_magazine_type(src) update_appearance() @@ -260,7 +267,7 @@ force = 10 flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BACK - mag_type = /obj/item/ammo_box/magazine/internal/shot/dual + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/dual sawn_desc = "Omar's coming!" obj_flags = UNIQUE_RENAME rack_sound_volume = 0 @@ -290,7 +297,13 @@ name = "hunting shotgun" desc = "A hunting shotgun used by the wealthy to hunt \"game\"." sawn_desc = "A sawn-off hunting shotgun. In its new state, it's remarkably less effective at hunting... anything." - mag_type = /obj/item/ammo_box/magazine/internal/shot/dual/slugs + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/dual/slugs + +/obj/item/gun/ballistic/shotgun/doublebarrel/breacherslug + name = "breaching shotgun" + desc = "A normal double-barrel shotgun that has been rechambered to fit breaching shells. Useful in breaching airlocks and windows, not much else." + sawn_desc = "A sawn-off breaching shotgun, making for a more compact configuration while still having the same capability as before." + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/dual/breacherslug /obj/item/gun/ballistic/shotgun/hook name = "hook modified sawn-off shotgun" @@ -301,7 +314,7 @@ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' inhand_x_dimension = 32 inhand_y_dimension = 32 - mag_type = /obj/item/ammo_box/magazine/internal/shot/bounty + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/bounty weapon_weight = WEAPON_MEDIUM semi_auto = TRUE flags_1 = CONDUCT_1 diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm index bd0c75e34b70d..237d7cbbb1005 100644 --- a/code/modules/projectiles/guns/ballistic/toy.dm +++ b/code/modules/projectiles/guns/ballistic/toy.dm @@ -4,7 +4,7 @@ icon_state = "saber" selector_switch_icon = TRUE inhand_icon_state = "gun" - mag_type = /obj/item/ammo_box/magazine/toy/smg + accepted_magazine_type = /obj/item/ammo_box/magazine/toy/smg fire_sound = 'sound/items/syringeproj.ogg' force = 0 throwforce = 0 @@ -21,12 +21,12 @@ /obj/item/gun/ballistic/automatic/pistol/toy name = "foam force pistol" desc = "A small, easily concealable toy handgun. Ages 8 and up." - mag_type = /obj/item/ammo_box/magazine/toy/pistol + accepted_magazine_type = /obj/item/ammo_box/magazine/toy/pistol 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 + spawn_magazine_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) @@ -37,7 +37,7 @@ desc = "A toy shotgun with wood furniture and a four-shell capacity underneath. Ages 8 and up." force = 0 throwforce = 0 - mag_type = /obj/item/ammo_box/magazine/internal/shot/toy + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/toy fire_sound = 'sound/items/syringeproj.ogg' clumsy_check = FALSE item_flags = NONE @@ -67,7 +67,7 @@ inhand_y_dimension = 32 worn_icon_state = "gun" worn_icon = null - mag_type = /obj/item/ammo_box/magazine/internal/shot/toy/crossbow + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/toy/crossbow fire_sound = 'sound/items/syringeproj.ogg' slot_flags = ITEM_SLOT_BELT w_class = WEIGHT_CLASS_SMALL @@ -78,17 +78,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 + accepted_magazine_type = /obj/item/ammo_box/magazine/toy/smgm45 + spawn_magazine_type = /obj/item/ammo_box/magazine/toy/smgm45/riot 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 + spawn_magazine_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 + spawn_magazine_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" @@ -96,14 +97,15 @@ fire_sound = 'sound/items/syringeproj.ogg' can_suppress = FALSE item_flags = NONE - mag_type = /obj/item/ammo_box/magazine/toy/m762/riot + accepted_magazine_type = /obj/item/ammo_box/magazine/toy/m762 + spawn_magazine_type = /obj/item/ammo_box/magazine/toy/m762/riot 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 + spawn_magazine_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 + spawn_magazine_type = /obj/item/ammo_box/magazine/toy/m762/riot diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 4ea530c51a48e..e76f13e1fc200 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -97,17 +97,19 @@ if(!ammo_type.len) return var/obj/projectile/exam_proj - readout += "\nStandard models of this projectile weapon have [span_warning("[ammo_type.len] mode\s")]" + readout += "\nStandard models of this projectile weapon have [span_warning("[ammo_type.len] mode\s")]." readout += "Our heroic interns have shown that one can theoretically stay standing after..." + if(projectile_damage_multiplier <= 0) + readout += "a theoretically infinite number of shots on [span_warning("every")] mode due to esoteric or nonexistent offensive potential." + return readout.Join("\n") // Sending over the singular string, rather than the whole list for(var/obj/item/ammo_casing/energy/for_ammo as anything in ammo_type) exam_proj = for_ammo.projectile_type if(!ispath(exam_proj)) continue - if(initial(exam_proj.damage) > 0) // Don't divide by 0!!!!! - readout += "[span_warning("[HITS_TO_CRIT(initial(exam_proj.damage) * for_ammo.pellets)] shot\s")] on [span_warning("[for_ammo.select_name]")] mode before collapsing from [initial(exam_proj.damage_type) == STAMINA ? "immense pain" : "their wounds"]." + readout += "[span_warning("[HITS_TO_CRIT((initial(exam_proj.damage) * projectile_damage_multiplier) * for_ammo.pellets)] shot\s")] on [span_warning("[for_ammo.select_name]")] mode before collapsing from [initial(exam_proj.damage_type) == STAMINA ? "immense pain" : "their wounds"]." if(initial(exam_proj.stamina) > 0) // In case a projectile does damage AND stamina damage (Energy Crossbow) - readout += "[span_warning("[HITS_TO_CRIT(initial(exam_proj.stamina) * for_ammo.pellets)] shot\s")] on [span_warning("[for_ammo.select_name]")] mode before collapsing from immense pain." + readout += "[span_warning("[HITS_TO_CRIT((initial(exam_proj.stamina) * projectile_damage_multiplier) * for_ammo.pellets)] shot\s")] on [span_warning("[for_ammo.select_name]")] mode before collapsing from immense pain." else readout += "a theoretically infinite number of shots on [span_warning("[for_ammo.select_name]")] mode." @@ -136,11 +138,11 @@ return ..() -/obj/item/gun/energy/handle_atom_del(atom/A) - if(A == cell) +/obj/item/gun/energy/Exited(atom/movable/gone, direction) + . = ..() + if(gone == cell) cell = null update_appearance() - return ..() /obj/item/gun/energy/process(seconds_per_tick) if(selfcharge && cell && cell.percent() < 100) @@ -156,6 +158,7 @@ /obj/item/gun/energy/attack_self(mob/living/user as mob) if(ammo_type.len > 1 && can_select) select_fire(user) + return ..() /obj/item/gun/energy/can_shoot() var/obj/item/ammo_casing/energy/shot = ammo_type[select] @@ -190,7 +193,7 @@ process_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) +/obj/item/gun/energy/process_burst(mob/living/user, atom/target, message = TRUE, params = null, zone_override="", randomized_gun_spread = 0, randomized_bonus_spread = 0, rand_spr = 0, iteration = 0) if(!chambered && can_shoot()) process_chamber() // Ditto. return ..() diff --git a/code/modules/projectiles/guns/energy/beam_rifle.dm b/code/modules/projectiles/guns/energy/beam_rifle.dm index b91484f3d6760..8869da14a59e3 100644 --- a/code/modules/projectiles/guns/energy/beam_rifle.dm +++ b/code/modules/projectiles/guns/energy/beam_rifle.dm @@ -30,7 +30,6 @@ ammo_type = list(/obj/item/ammo_casing/energy/beam_rifle/hitscan) actions_types = list(/datum/action/item_action/zoom_lock_action) cell_type = /obj/item/stock_parts/cell/beam_rifle - canMouseDown = TRUE var/aiming = FALSE var/aiming_time = 12 var/aiming_time_fire_threshold = 5 @@ -72,7 +71,17 @@ var/current_zoom_x = 0 var/current_zoom_y = 0 - var/mob/listeningTo +/obj/item/gun/energy/beam_rifle/apply_fantasy_bonuses(bonus) + . = ..() + delay = modify_fantasy_variable("delay", delay, -bonus * 2) + aiming_time = modify_fantasy_variable("aiming_time", aiming_time, -bonus * 2) + recoil = modify_fantasy_variable("recoil", recoil, round(-bonus / 2)) + +/obj/item/gun/energy/beam_rifle/remove_fantasy_bonuses(bonus) + delay = reset_fantasy_variable("delay", delay) + aiming_time = reset_fantasy_variable("aiming_time", aiming_time) + recoil = reset_fantasy_variable("recoil", recoil) + return ..() /obj/item/gun/energy/beam_rifle/debug delay = 0 @@ -167,7 +176,6 @@ STOP_PROCESSING(SSfastprocess, src) set_user(null) QDEL_LIST(current_tracers) - listeningTo = null return ..() /obj/item/gun/energy/beam_rifle/emp_act(severity) @@ -220,30 +228,28 @@ if(!istype(current_user) || !isturf(current_user.loc) || !(src in current_user.held_items) || current_user.incapacitated()) //Doesn't work if you're not holding it! if(automatic_cleanup) stop_aiming() - set_user(null) return FALSE return TRUE -/obj/item/gun/energy/beam_rifle/proc/process_aim() - if(istype(current_user) && current_user.client && current_user.client.mouseParams) - var/angle = mouse_angle_from_client(current_user.client) - current_user.setDir(angle2dir_cardinal(angle)) - var/difference = abs(closer_angle_difference(lastangle, angle)) - delay_penalty(difference * aiming_time_increase_angle_multiplier) - lastangle = angle +/obj/item/gun/energy/beam_rifle/proc/process_aim(params) + var/angle = mouse_angle_from_client(current_user?.client, params) + current_user.setDir(angle2dir_cardinal(angle)) + var/difference = abs(closer_angle_difference(lastangle, angle)) + delay_penalty(difference * aiming_time_increase_angle_multiplier) + lastangle = angle /obj/item/gun/energy/beam_rifle/proc/on_mob_move() SIGNAL_HANDLER check_user() if(aiming) delay_penalty(aiming_time_increase_user_movement) - process_aim() + process_aim(current_user?.client?.mouseParams) INVOKE_ASYNC(src, PROC_REF(aiming_beam), TRUE) -/obj/item/gun/energy/beam_rifle/proc/start_aiming() +/obj/item/gun/energy/beam_rifle/proc/start_aiming(params) aiming_time_left = aiming_time aiming = TRUE - process_aim() + process_aim(params) aiming_beam(TRUE) zooming_angle = lastangle start_zooming() @@ -259,47 +265,65 @@ if(user == current_user) return stop_aiming(current_user) - if(listeningTo) - UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) - listeningTo = null if(istype(current_user)) + unregister_client_signals(current_user) + UnregisterSignal(current_user, list(COMSIG_MOVABLE_MOVED, COMSIG_MOB_LOGIN, COMSIG_MOB_LOGOUT)) current_user = null - if(istype(user)) - current_user = user - RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(on_mob_move)) - listeningTo = user + if(!istype(user)) + return + current_user = user + RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(on_mob_move)) + RegisterSignal(user, COMSIG_MOB_LOGIN, PROC_REF(register_client_signals)) + RegisterSignal(user, COMSIG_MOB_LOGOUT, PROC_REF(unregister_client_signals)) + if(user.client) + register_client_signals(user) + +/obj/item/gun/energy/beam_rifle/proc/register_client_signals(mob/source) + SIGNAL_HANDLER + RegisterSignal(source.client, COMSIG_CLIENT_MOUSEDOWN, PROC_REF(on_mouse_down)) + +/obj/item/gun/energy/beam_rifle/proc/unregister_client_signals(mob/source) + SIGNAL_HANDLER + stop_aiming() + if(QDELETED(source.client)) + return + UnregisterSignal(source.client, list(COMSIG_CLIENT_MOUSEDOWN, COMSIG_CLIENT_MOUSEUP, COMSIG_CLIENT_MOUSEDRAG)) -/obj/item/gun/energy/beam_rifle/onMouseDrag(src_object, over_object, src_location, over_location, params, mob) +///change the aiming beam angle to that of the mouse cursor. +/obj/item/gun/energy/beam_rifle/proc/on_mouse_drag(client/source, src_object, over_object, src_location, over_location, src_control, over_control, params) + SIGNAL_HANDLER if(aiming) - process_aim() - aiming_beam() + process_aim(params) + INVOKE_ASYNC(src, PROC_REF(aiming_beam)) if(zoom_lock == ZOOM_LOCK_AUTOZOOM_FREEMOVE) zooming_angle = lastangle set_autozoom_pixel_offsets_immediate(zooming_angle) - return ..() -/obj/item/gun/energy/beam_rifle/onMouseDown(object, location, params, mob/mob) - if(istype(mob)) - set_user(mob) - if(istype(object, /atom/movable/screen) && !istype(object, /atom/movable/screen/click_catcher)) +///Start aiming and charging the beam +/obj/item/gun/energy/beam_rifle/proc/on_mouse_down(client/source, atom/movable/object, location, control, params) + SIGNAL_HANDLER + if(source.mob.get_active_held_item() != src) return - if((object in mob.contents) || (object == mob)) + if(!object.IsAutoclickable() || (object in source.mob.contents) || (object == source.mob)) return - start_aiming() - return ..() + INVOKE_ASYNC(src, PROC_REF(start_aiming), params) + RegisterSignal(source, COMSIG_CLIENT_MOUSEDRAG, PROC_REF(on_mouse_drag)) + RegisterSignal(source, COMSIG_CLIENT_MOUSEUP, PROC_REF(on_mouse_up)) -/obj/item/gun/energy/beam_rifle/onMouseUp(object, location, params, mob/M) - if(istype(object, /atom/movable/screen) && !istype(object, /atom/movable/screen/click_catcher)) +///Stop aiming and fire the beam if charged enough +/obj/item/gun/energy/beam_rifle/proc/on_mouse_up(client/source, atom/movable/object, location, control, params) + SIGNAL_HANDLER + if(!object.IsAutoclickable()) return - process_aim() + process_aim(params) + UnregisterSignal(source, list(COMSIG_CLIENT_MOUSEDRAG, COMSIG_CLIENT_MOUSEUP)) if(aiming_time_left <= aiming_time_fire_threshold && check_user()) sync_ammo() - var/atom/target = M.client.mouse_object_ref?.resolve() + var/atom/target = source.mouse_object_ref?.resolve() if(target) - afterattack(target, M, FALSE, M.client.mouseParams, passthrough = TRUE) + INVOKE_ASYNC(src, PROC_REF(afterattack), target, source.mob, FALSE, source.mouseParams, passthrough = TRUE) stop_aiming() QDEL_LIST(current_tracers) - return ..() /obj/item/gun/energy/beam_rifle/afterattack(atom/target, mob/living/user, flag, params, passthrough = FALSE) . |= AFTERATTACK_PROCESSED_ITEM diff --git a/code/modules/projectiles/guns/energy/crank_guns.dm b/code/modules/projectiles/guns/energy/crank_guns.dm new file mode 100644 index 0000000000000..23cd6a297ed34 --- /dev/null +++ b/code/modules/projectiles/guns/energy/crank_guns.dm @@ -0,0 +1,74 @@ +/obj/item/gun/energy/laser/musket + name = "laser musket" + desc = "A hand-crafted laser weapon, it has a hand crank on the side to charge it up." + icon_state = "musket" + inhand_icon_state = "musket" + worn_icon_state = "las_musket" + ammo_type = list(/obj/item/ammo_casing/energy/laser/musket) + slot_flags = ITEM_SLOT_BACK + obj_flags = UNIQUE_RENAME + can_bayonet = TRUE + knife_x_offset = 22 + knife_y_offset = 11 + +/obj/item/gun/energy/laser/musket/Initialize(mapload) + . = ..() + AddComponent(/datum/component/two_handed, require_twohands = TRUE, force_wielded = 10) + AddComponent( \ + /datum/component/crank_recharge, \ + charging_cell = get_cell(), \ + charge_amount = 500, \ + cooldown_time = 2 SECONDS, \ + charge_sound = 'sound/weapons/laser_crank.ogg', \ + charge_sound_cooldown_time = 1.8 SECONDS, \ + ) + +/obj/item/gun/energy/laser/musket/update_icon_state() + inhand_icon_state = "[initial(inhand_icon_state)][(get_charge_ratio() == 4 ? "charged" : "")]" + return ..() + +/obj/item/gun/energy/laser/musket/prime + name = "heroic laser musket" + desc = "A well-engineered, hand-charged laser weapon. Its capacitors hum with potential." + icon_state = "musket_prime" + inhand_icon_state = "musket_prime" + worn_icon_state = "las_musket_prime" + ammo_type = list(/obj/item/ammo_casing/energy/laser/musket/prime) + + +/obj/item/gun/energy/disabler/smoothbore + name = "smoothbore disabler" + desc = "A hand-crafted disabler, using a hard knock on an energy cell to fire the stunner laser. A lack of proper focusing means it has no accuracy whatsoever." + icon_state = "smoothbore" + ammo_type = list(/obj/item/ammo_casing/energy/disabler/smoothbore) + shaded_charge = 1 + charge_sections = 1 + spread = 22.5 + +/obj/item/gun/energy/disabler/smoothbore/Initialize(mapload) + . = ..() + AddComponent( \ + /datum/component/crank_recharge, \ + charging_cell = get_cell(), \ + charge_amount = 1000, \ + cooldown_time = 2 SECONDS, \ + charge_sound = 'sound/weapons/laser_crank.ogg', \ + charge_sound_cooldown_time = 1.8 SECONDS, \ + ) + +/obj/item/gun/energy/disabler/smoothbore/add_seclight_point() + AddComponent(/datum/component/seclite_attachable, \ + light_overlay_icon = 'icons/obj/weapons/guns/flashlights.dmi', \ + light_overlay = "flight", \ + overlay_x = 18, \ + overlay_y = 12, \ + ) //i swear 1812 being the overlay numbers was accidental + +/obj/item/gun/energy/disabler/smoothbore/prime //much stronger than the other prime variants, so dont just put this in as maint loot + name = "elite smoothbore disabler" + desc = "An enhancement version of the smoothbore disabler pistol. Improved optics and cell type result in good accuracy and the ability to fire twice. \ + The disabler bolts also don't dissipate upon impact with armor, unlike the previous model." + icon_state = "smoothbore_prime" + ammo_type = list(/obj/item/ammo_casing/energy/disabler/smoothbore/prime) + charge_sections = 2 + spread = 0 //could be like 5, but having just very tiny spread kinda feels like bullshit diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index 34c447cfb3cee..fec816b1e765f 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -9,6 +9,18 @@ ammo_x_offset = 3 dual_wield_spread = 60 +/obj/item/gun/energy/e_gun/Initialize(mapload) + . = ..() + // Only actual eguns can be converted + if(type != /obj/item/gun/energy/e_gun) + return + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/advancedegun, /datum/crafting_recipe/tempgun, /datum/crafting_recipe/beam_rifle) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/gun/energy/e_gun/add_seclight_point() AddComponent(/datum/component/seclite_attachable, \ light_overlay_icon = 'icons/obj/weapons/guns/flashlights.dmi', \ diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 9f59d1677b791..8652fd0248065 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -16,6 +16,27 @@ var/list/modkits = list() gun_flags = NOT_A_REAL_GUN + +/obj/item/gun/energy/recharge/kinetic_accelerator/Initialize(mapload) + . = ..() + // Only actual KAs can be converted + if(type != /obj/item/gun/energy/recharge/kinetic_accelerator) + return + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/ebow) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + +/obj/item/gun/energy/recharge/kinetic_accelerator/apply_fantasy_bonuses(bonus) + . = ..() + max_mod_capacity = modify_fantasy_variable("max_mod_capacity", max_mod_capacity, bonus * 10) + +/obj/item/gun/energy/recharge/kinetic_accelerator/remove_fantasy_bonuses(bonus) + max_mod_capacity = reset_fantasy_variable("max_mod_capacity", max_mod_capacity) + return ..() + /obj/item/gun/energy/recharge/kinetic_accelerator/Initialize(mapload) . = ..() @@ -223,7 +244,7 @@ /obj/item/borg/upgrade/modkit name = "kinetic accelerator modification kit" desc = "An upgrade for kinetic accelerators." - icon = 'icons/obj/objects.dmi' + icon = 'icons/obj/mining.dmi' icon_state = "modkit" w_class = WEIGHT_CLASS_SMALL require_model = TRUE @@ -255,10 +276,10 @@ /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)) + if(minebot_exclusive && !istype(KA.loc, /mob/living/basic/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)) + else if(istype(KA.loc, /mob/living/basic/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) @@ -342,7 +363,7 @@ 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' + icon = 'icons/obj/assemblies/module.dmi' denied_type = /obj/item/borg/upgrade/modkit/cooldown/minebot modifier = 10 cost = 0 diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index ad5a5ce927954..0cab7c4737311 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -9,6 +9,18 @@ ammo_x_offset = 1 shaded_charge = 1 +/obj/item/gun/energy/laser/Initialize(mapload) + . = ..() + // Only actual lasguns can be converted + if(type != /obj/item/gun/energy/laser) + return + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/xraylaser, /datum/crafting_recipe/hellgun, /datum/crafting_recipe/ioncarbine, /datum/crafting_recipe/decloner) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/gun/energy/laser/practice name = "practice laser gun" desc = "A modified version of the basic laser gun, this one fires less concentrated energy bolts designed for target practice." @@ -23,6 +35,16 @@ desc = "An older model of the basic lasergun, no longer used by Nanotrasen's private security or military forces. Nevertheless, it is still quite deadly and easy to maintain, making it a favorite amongst pirates and other outlaws." ammo_x_offset = 3 +/obj/item/gun/energy/laser/carbine + name = "laser carbine" + desc = "A modified laser gun which can shoot far faster, but each shot is far less damaging." + icon_state = "laser_carbine" + ammo_type = list(/obj/item/ammo_casing/energy/lasergun/carbine) + +/obj/item/gun/energy/laser/carbine/Initialize(mapload) + . = ..() + AddComponent(/datum/component/automatic_fire, 0.15 SECONDS, allow_akimbo = FALSE) + /obj/item/gun/energy/laser/retro/old name ="laser gun" icon_state = "retro" diff --git a/code/modules/projectiles/guns/energy/recharge.dm b/code/modules/projectiles/guns/energy/recharge.dm index ae67135ea264c..eed2747875548 100644 --- a/code/modules/projectiles/guns/energy/recharge.dm +++ b/code/modules/projectiles/guns/energy/recharge.dm @@ -18,6 +18,14 @@ /// Do we recharge slower with more of our type? var/unique_frequency = FALSE +/obj/item/gun/energy/recharge/apply_fantasy_bonuses(bonus) + . = ..() + recharge_time = modify_fantasy_variable("recharge_time", recharge_time, -bonus, minimum = 0.2 SECONDS) + +/obj/item/gun/energy/recharge/remove_fantasy_bonuses(bonus) + recharge_time = reset_fantasy_variable("recharge_time", recharge_time) + return ..() + /obj/item/gun/energy/recharge/Initialize(mapload) . = ..() if(!holds_charge) @@ -127,3 +135,36 @@ custom_materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*2) suppressed = null ammo_type = list(/obj/item/ammo_casing/energy/bolt/large) + +/// A silly gun that does literally zero damage, but disrupts electrical sources of light, like flashlights. +/obj/item/gun/energy/recharge/fisher + name = "\improper SC/FISHER disruptor" + desc = "A self-recharging, permanently suppressed, and very haphazardly modified accelerator handgun that does literally nothing to anything except light fixtures and cameras. \ + Can fire twice before requiring a recharge, with bolts passing through machinery, but demands precision." + icon_state = "fisher" + base_icon_state = "fisher" + dry_fire_sound_volume = 10 + w_class = WEIGHT_CLASS_SMALL + holds_charge = TRUE + suppressed = TRUE + recharge_time = 1.2 SECONDS + ammo_type = list(/obj/item/ammo_casing/energy/fisher) + +/obj/item/gun/energy/recharge/fisher/examine_more(mob/user) + . = ..() + . += span_notice("The SC/FISHER is an illegally-modified kinetic accelerator cut down and refit into a disassembled miniature energy gun chassis, with its pressure chamber \ + attenuated to launch kinetic bolts that disrupt flashlights and cameras, if only temporarily. This effect also works on cyborg headlamps, and works longer in melee.

    \ + While some would argue that this is a really terrible design choice, others argue that it is very funny to be able to shoot at light sources. Caveat emptor.") + +/obj/item/gun/energy/recharge/fisher/afterattack(atom/target, mob/living/user, flag, params) + // you should just shoot them, but in case you can't/wont + . = ..() + if(user.Adjacent(target)) + var/obj/projectile/energy/fisher/melee/simulated_hit = new + simulated_hit.on_hit(target) + +/obj/item/gun/energy/recharge/fisher/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + // ...you reeeeeally just shoot them, but in case you can't/won't + . = ..() + var/obj/projectile/energy/fisher/melee/simulated_hit = new + simulated_hit.on_hit(hit_atom) diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index f388073237d04..c7d99e732bbdb 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -76,7 +76,7 @@ /obj/item/gun/energy/meteorgun/pen name = "meteor pen" desc = "The pen is mightier than the sword." - icon = 'icons/obj/bureaucracy.dmi' + icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "pen" inhand_icon_state = "pen" worn_icon_state = "pen" @@ -286,16 +286,18 @@ p_orange.link_portal(p_blue) p_blue.link_portal(p_orange) -/obj/item/gun/energy/wormhole_projector/proc/create_portal(obj/projectile/beam/wormhole/W, turf/target) - var/obj/effect/portal/P = new /obj/effect/portal(target, 300, null, FALSE, null) - RegisterSignal(P, COMSIG_QDELETING, PROC_REF(on_portal_destroy)) - if(istype(W, /obj/projectile/beam/wormhole/orange)) +/obj/item/gun/energy/wormhole_projector/proc/create_portal(obj/projectile/beam/wormhole/wormhole_beam, turf/target) + var/obj/effect/portal/new_portal = new /obj/effect/portal(target, 300, null, FALSE, null) + RegisterSignal(new_portal, COMSIG_QDELETING, PROC_REF(on_portal_destroy)) + if(istype(wormhole_beam, /obj/projectile/beam/wormhole/orange)) qdel(p_orange) - p_orange = P - P.icon_state = "portal1" + p_orange = new_portal + new_portal.icon_state = "portal1" + new_portal.set_light_color(COLOR_MOSTLY_PURE_ORANGE) + new_portal.update_light() else qdel(p_blue) - p_blue = P + p_blue = new_portal crosslink() /obj/item/gun/energy/wormhole_projector/core_inserted diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index 762e95544c523..94c1e7502a8e2 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -29,6 +29,17 @@ . = ..() RegisterSignal(src, COMSIG_ITEM_MAGICALLY_CHARGED, PROC_REF(on_magic_charge)) +/obj/item/gun/magic/apply_fantasy_bonuses(bonus) + . = ..() + recharge_rate = modify_fantasy_variable("recharge_rate", recharge_rate, -bonus, minimum = 1) + max_charges = modify_fantasy_variable("max_charges", max_charges, bonus) + charges = modify_fantasy_variable("charges", charges, bonus) + +/obj/item/gun/magic/remove_fantasy_bonuses(bonus) + recharge_rate = reset_fantasy_variable("recharge_rate", recharge_rate) + max_charges = reset_fantasy_variable("max_charges", max_charges) + charges = reset_fantasy_variable("charges", charges) + return ..() /obj/item/gun/magic/fire_sounds() var/frequency_to_use = sin((90/max_charges) * charges) diff --git a/code/modules/projectiles/guns/magic/arcane_barrage.dm b/code/modules/projectiles/guns/magic/arcane_barrage.dm new file mode 100644 index 0000000000000..08931d8c391f7 --- /dev/null +++ b/code/modules/projectiles/guns/magic/arcane_barrage.dm @@ -0,0 +1,27 @@ +/obj/item/gun/magic/wand/arcane_barrage + name = "arcane barrage" + desc = "Pew Pew Pew." + fire_sound = 'sound/weapons/emitter.ogg' + icon = 'icons/obj/weapons/guns/ballistic.dmi' + icon_state = "arcane_barrage" + inhand_icon_state = "arcane_barrage" + base_icon_state = "arcane_barrage" + lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + slot_flags = null + item_flags = NEEDS_PERMIT | DROPDEL | ABSTRACT | NOBLUDGEON + flags_1 = NONE + weapon_weight = WEAPON_HEAVY + max_charges = 30 + ammo_type = /obj/item/ammo_casing/magic/arcane_barrage + +/obj/item/gun/magic/wand/arcane_barrage/Initialize(mapload) + . = ..() + AddComponent(/datum/component/automatic_fire, 0.2 SECONDS) + +/obj/item/gun/magic/wand/arcane_barrage/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) + . = ..() + if(!.) + return + if(!charges) + user.dropItemToGround(src, TRUE) diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm index d347eff5a3370..568c7a0d657c3 100644 --- a/code/modules/projectiles/guns/magic/staff.dm +++ b/code/modules/projectiles/guns/magic/staff.dm @@ -11,10 +11,7 @@ var/allow_intruder_use = FALSE /obj/item/gun/magic/staff/proc/is_wizard_or_friend(mob/user) - if(!user?.mind?.has_antag_datum(/datum/antagonist/wizard) \ - && !user.mind.has_antag_datum(/datum/antagonist/survivalist/magic) \ - && !user.mind.has_antag_datum(/datum/antagonist/wizard_minion) \ - && !allow_intruder_use) + if(!HAS_MIND_TRAIT(user, TRAIT_MAGICALLY_GIFTED) && !allow_intruder_use) return FALSE return TRUE @@ -132,9 +129,9 @@ no_den_usage = 1 school = SCHOOL_FORBIDDEN //this staff is evil. okay? it just is. look at this projectile type list. this is wrong. - /// Static list of all projectiles we can fire from our staff. + /// List of all projectiles we can fire from our staff. /// Doesn't contain all subtypes of magic projectiles, unlike what it looks like - var/static/list/allowed_projectile_types = list( + var/list/allowed_projectile_types = list( /obj/projectile/magic/animate, /obj/projectile/magic/antimagic, /obj/projectile/magic/arcane_barrage, @@ -174,6 +171,47 @@ process_fire(user, user, FALSE) return FALSE +/** + * Staff of chaos given to the wizard upon completing a cheesy grand ritual. Is completely evil and if something + * breaks, it's completely intended. Fuck off. + * Also can be used by everyone, because why not. + */ +/obj/item/gun/magic/staff/chaos/true_wabbajack + name = "\proper Wabbajack" + desc = "If there is some deity out there, they've definitely skipped their psych appointment before creating this." + icon_state = "the_wabbajack" + inhand_icon_state = "the_wabbajack" + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF //fuck you + max_charges = 999999 //fuck you + recharge_rate = 1 + allow_intruder_use = TRUE + +/obj/item/gun/magic/staff/chaos/true_wabbajack/Initialize(mapload) + . = ..() + allowed_projectile_types |= subtypesof(/obj/projectile/bullet/cannonball) + allowed_projectile_types |= subtypesof(/obj/projectile/bullet/rocket) + allowed_projectile_types |= subtypesof(/obj/projectile/energy/tesla) + allowed_projectile_types |= subtypesof(/obj/projectile/magic) + allowed_projectile_types |= subtypesof(/obj/projectile/temp) + allowed_projectile_types |= list( + /obj/projectile/beam/mindflayer, + /obj/projectile/bullet/gyro, + /obj/projectile/bullet/honker, + /obj/projectile/bullet/mime, + /obj/projectile/curse_hand, + /obj/projectile/energy/declone, + /obj/projectile/energy/electrode, + /obj/projectile/energy/net, + /obj/projectile/energy/nuclear_particle, + /obj/projectile/gravityattract, + /obj/projectile/gravitychaos, + /obj/projectile/gravityrepulse, + /obj/projectile/ion, + /obj/projectile/meteor, + /obj/projectile/neurotoxin, + /obj/projectile/plasma, + ) //if you ever try to expand this list, avoid adding bullets/energy projectiles, this ain't supposed to be a gun... unless it's funny + /obj/item/gun/magic/staff/door name = "staff of door creation" desc = "An artefact that spits bolts of transformative magic that can create doors in walls." diff --git a/code/modules/projectiles/guns/special/blastcannon.dm b/code/modules/projectiles/guns/special/blastcannon.dm index 5029f2b258842..f9a8abf7ae3dc 100644 --- a/code/modules/projectiles/guns/special/blastcannon.dm +++ b/code/modules/projectiles/guns/special/blastcannon.dm @@ -62,11 +62,11 @@ cached_target = null return ..() -/obj/item/gun/blastcannon/handle_atom_del(atom/A) - if(A == bomb) +/obj/item/gun/blastcannon/Exited(atom/movable/gone, direction) + . = ..() + if(gone == bomb) bomb = null update_appearance() - return ..() /obj/item/gun/blastcannon/assume_air(datum/gas_mixture/giver) qdel(giver) diff --git a/code/modules/projectiles/guns/special/chem_gun.dm b/code/modules/projectiles/guns/special/chem_gun.dm index c902c8b19b64e..b085a20026ee3 100644 --- a/code/modules/projectiles/guns/special/chem_gun.dm +++ b/code/modules/projectiles/guns/special/chem_gun.dm @@ -17,6 +17,17 @@ var/max_syringes = 4 var/last_synth = 0 +/obj/item/gun/chem/apply_fantasy_bonuses(bonus) + . = ..() + max_syringes = modify_fantasy_variable("max_syringes", max_syringes, bonus, minimum = 1) + time_per_syringe = modify_fantasy_variable("time_per_syringe", time_per_syringe, -bonus * 10) + +/obj/item/gun/chem/remove_fantasy_bonuses(bonus) + max_syringes = reset_fantasy_variable("max_syringes", max_syringes) + time_per_syringe = reset_fantasy_variable("time_per_syringe", time_per_syringe) + return ..() + + /obj/item/gun/chem/Initialize(mapload) . = ..() chambered = new /obj/item/ammo_casing/chemgun(src) diff --git a/code/modules/projectiles/guns/special/grenade_launcher.dm b/code/modules/projectiles/guns/special/grenade_launcher.dm index c23e16150538b..e5ce8c51316a9 100644 --- a/code/modules/projectiles/guns/special/grenade_launcher.dm +++ b/code/modules/projectiles/guns/special/grenade_launcher.dm @@ -16,6 +16,14 @@ . = ..() . += "[grenades.len] / [max_grenades] grenades loaded." +/obj/item/gun/grenadelauncher/apply_fantasy_bonuses(bonus) + . = ..() + max_grenades = modify_fantasy_variable("max_syringes", max_grenades, bonus, minimum = 1) + +/obj/item/gun/grenadelauncher/remove_fantasy_bonuses(bonus) + max_grenades = reset_fantasy_variable("max_syringes", max_grenades) + return ..() + /obj/item/gun/grenadelauncher/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/grenade/c4)) diff --git a/code/modules/projectiles/guns/special/hand_of_midas.dm b/code/modules/projectiles/guns/special/hand_of_midas.dm new file mode 100644 index 0000000000000..9907352e3f505 --- /dev/null +++ b/code/modules/projectiles/guns/special/hand_of_midas.dm @@ -0,0 +1,138 @@ +// Hand of Midas + +/obj/item/gun/magic/midas_hand + name = "The Hand of Midas" + desc = "An ancient Egyptian matchlock pistol imbued with the powers of the Greek King Midas. Don't question the cultural or religious implications of this." + ammo_type = /obj/item/ammo_casing/magic/midas_round + icon_state = "midas_hand" + 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' + fire_sound = 'sound/weapons/gun/rifle/shot.ogg' + pinless = TRUE + max_charges = 1 + can_charge = FALSE + item_flags = NEEDS_PERMIT + w_class = WEIGHT_CLASS_BULKY // Should fit on a belt. + force = 3 + trigger_guard = TRIGGER_GUARD_NORMAL + antimagic_flags = NONE + can_hold_up = FALSE + + /// The length of the Midas Blight debuff, dependant on the amount of gold reagent we've sucked up. + var/gold_timer = 3 SECONDS + /// The range that we can suck gold out of people's bodies + var/gold_suck_range = 2 + +/obj/item/gun/magic/midas_hand/examine(mob/user) + . = ..() + var/gold_time_converted = gold_time_convert() + . += span_notice("Your next shot will inflict [gold_time_converted] second[gold_time_converted == 1 ? "" : "s"] of Midas Blight.") + . += span_notice("Right-Click on enemies to drain gold from their bloodstreams to reload [src].") + . += span_notice("[src] can be reloaded using gold coins in a pinch.") + +/obj/item/gun/magic/midas_hand/shoot_with_empty_chamber(mob/living/user) + . = ..() + balloon_alert(user, "not enough gold") + +// Siphon gold from a victim, recharging our gun & removing their Midas Blight debuff in the process. +/obj/item/gun/magic/midas_hand/afterattack_secondary(mob/living/victim, mob/living/user, proximity_flag, click_parameters) + if(!isliving(victim) || !IN_GIVEN_RANGE(user, victim, gold_suck_range)) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(victim == user) + balloon_alert(user, "can't siphon from self") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(!victim.reagents) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(!victim.reagents.has_reagent(/datum/reagent/gold, check_subtypes = TRUE)) + balloon_alert(user, "no gold in bloodstream") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + var/gold_beam = user.Beam(victim, icon_state="drain_gold") + if(!do_after(user = user, delay = 1 SECONDS, target = victim, timed_action_flags = (IGNORE_USER_LOC_CHANGE | IGNORE_TARGET_LOC_CHANGE), extra_checks = CALLBACK(src, PROC_REF(check_gold_range), user, victim))) + qdel(gold_beam) + balloon_alert(user, "link broken") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + handle_gold_charges(user, victim.reagents.get_reagent_amount(/datum/reagent/gold, include_subtypes = TRUE)) + victim.reagents.remove_all_type(/datum/reagent/gold, victim.reagents.get_reagent_amount(/datum/reagent/gold, include_subtypes = TRUE)) + victim.remove_status_effect(/datum/status_effect/midas_blight) + qdel(gold_beam) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +// If we botch a shot, we have to start over again by inserting gold coins into the gun. Can only be done if it has no charges or gold. +/obj/item/gun/magic/midas_hand/attackby(obj/item/I, mob/living/user, params) + . = ..() + if(charges || gold_timer) + balloon_alert(user, "already loaded") + return + if(istype(I, /obj/item/coin/gold)) + handle_gold_charges(user, 1.5 SECONDS) + qdel(I) + +/// Handles recharging & inserting gold amount +/obj/item/gun/magic/midas_hand/proc/handle_gold_charges(user, gold_amount) + gold_timer += gold_amount + var/gold_time_converted = gold_time_convert() + balloon_alert(user, "[gold_time_converted] second[gold_time_converted == 1 ? "" : "s"]") + if(!charges) + instant_recharge() + +/// Converts our gold_timer to time in seconds, for various ballons/examines +/obj/item/gun/magic/midas_hand/proc/gold_time_convert() + return min(30 SECONDS, round(gold_timer, 0.2)) / 10 + +/// Checks our range to the person we're sucking gold out of. Double the initial range, so you need to get in close to start. +/obj/item/gun/magic/midas_hand/proc/check_gold_range(mob/living/user, mob/living/victim) + return IN_GIVEN_RANGE(user, victim, gold_suck_range*2) + +/obj/item/ammo_casing/magic/midas_round + projectile_type = /obj/projectile/magic/midas_round + + +/obj/projectile/magic/midas_round + name = "gold pellet" + desc = "A typical flintlock ball, save for the fact it's made of cursed Egyptian gold." + damage_type = BRUTE + damage = 10 + stamina = 20 + armour_penetration = 50 + hitsound = 'sound/effects/coin2.ogg' + icon_state = "pellet" + color = "#FFD700" + /// The gold charge in this pellet + var/gold_charge = 0 + + +/obj/projectile/magic/midas_round/fire(setAngle) + /// Transfer the gold energy to our bullet + var/obj/item/gun/magic/midas_hand/my_gun = fired_from + gold_charge = my_gun.gold_timer + my_gun.gold_timer = 0 + ..() + +// Gives human targets Midas Blight. +/obj/projectile/magic/midas_round/on_hit(atom/target) + . = ..() + if(ishuman(target)) + var/mob/living/carbon/human/my_guy = target + if(isskeleton(my_guy)) // No cheap farming + return + my_guy.apply_status_effect(/datum/status_effect/midas_blight, min(30 SECONDS, round(gold_charge, 0.2))) // 100u gives 10 seconds + return + +/obj/item/gun/magic/midas_hand/suicide_act(mob/living/user) + if(!ishuman(user)) + return + + var/mob/living/carbon/human/victim = user + victim.visible_message(span_suicide("[victim] holds the barrel of [src] to [victim.p_their()] head, lighting the fuse. It looks like [user.p_theyre()] trying to commit suicide!")) + if(!do_after(victim, 1.5 SECONDS)) + return + playsound(src, 'sound/weapons/gun/rifle/shot.ogg', 75, TRUE) + to_chat(victim, span_danger("You don't even have the time to register the gunshot by the time your body has completely converted into a golden statue.")) + var/newcolors = list(rgb(206, 164, 50), rgb(146, 146, 139), rgb(28,28,28), rgb(0,0,0)) + victim.petrify(statue_timer = INFINITY, save_brain = FALSE, colorlist = newcolors) + playsound(victim, 'sound/effects/coin2.ogg', 75, TRUE) + charges = 0 + gold_timer = 0 + return OXYLOSS diff --git a/code/modules/projectiles/guns/special/meat_hook.dm b/code/modules/projectiles/guns/special/meat_hook.dm index ac9e5361999ea..4add1bb77d4cb 100644 --- a/code/modules/projectiles/guns/special/meat_hook.dm +++ b/code/modules/projectiles/guns/special/meat_hook.dm @@ -34,7 +34,7 @@ /obj/projectile/hook name = "hook" icon_state = "hook" - icon = 'icons/obj/lavaland/artefacts.dmi' + icon = 'icons/obj/mining_zones/artefacts.dmi' pass_flags = PASSTABLE damage = 20 stamina = 20 diff --git a/code/modules/projectiles/guns/special/medbeam.dm b/code/modules/projectiles/guns/special/medbeam.dm index d3ee77ef3b3a3..267470f17013c 100644 --- a/code/modules/projectiles/guns/special/medbeam.dm +++ b/code/modules/projectiles/guns/special/medbeam.dm @@ -144,10 +144,13 @@ /obj/item/gun/medbeam/proc/on_beam_tick(mob/living/target) if(target.health != target.maxHealth) new /obj/effect/temp_visual/heal(get_turf(target), COLOR_HEALING_CYAN) - target.adjustBruteLoss(-4) - target.adjustFireLoss(-4) - target.adjustToxLoss(-1, forced = TRUE) - target.adjustOxyLoss(-1, forced = TRUE) + var/need_mob_update + need_mob_update = target.adjustBruteLoss(-4, updating_health = FALSE, forced = TRUE) + need_mob_update += target.adjustFireLoss(-4, updating_health = FALSE, forced = TRUE) + need_mob_update += target.adjustToxLoss(-1, updating_health = FALSE, forced = TRUE) + need_mob_update += target.adjustOxyLoss(-1, updating_health = FALSE, forced = TRUE) + if(need_mob_update) + target.updatehealth() return /obj/item/gun/medbeam/proc/on_beam_release(mob/living/target) diff --git a/code/modules/projectiles/guns/special/syringe_gun.dm b/code/modules/projectiles/guns/special/syringe_gun.dm index 6439cebb3e374..71b1a82a38029 100644 --- a/code/modules/projectiles/guns/special/syringe_gun.dm +++ b/code/modules/projectiles/guns/special/syringe_gun.dm @@ -30,10 +30,18 @@ chambered = new /obj/item/ammo_casing/syringegun(src) recharge_newshot() -/obj/item/gun/syringe/handle_atom_del(atom/A) +/obj/item/gun/syringe/apply_fantasy_bonuses(bonus) . = ..() - if(A in syringes) - syringes.Remove(A) + max_syringes = modify_fantasy_variable("max_syringes", max_syringes, bonus, minimum = 1) + +/obj/item/gun/syringe/remove_fantasy_bonuses(bonus) + max_syringes = reset_fantasy_variable("max_syringes", max_syringes) + return ..() + +/obj/item/gun/syringe/Exited(atom/movable/gone, direction) + . = ..() + if(gone in syringes) + syringes -= gone /obj/item/gun/syringe/recharge_newshot() if(!syringes.len) @@ -192,6 +200,6 @@ /obj/item/gun/syringe/blowgun/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) visible_message(span_danger("[user] shoots the blowgun!")) - user.adjustStaminaLoss(20) + user.adjustStaminaLoss(20, updating_stamina = FALSE) user.adjustOxyLoss(20) return ..() diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm index 32e3b4c8e2c82..6c2914b495dbb 100644 --- a/code/modules/projectiles/pins.dm +++ b/code/modules/projectiles/pins.dm @@ -52,11 +52,12 @@ return . -/obj/item/firing_pin/emag_act(mob/user) +/obj/item/firing_pin/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE obj_flags |= EMAGGED - to_chat(user, span_notice("You override the authentication mechanism.")) + balloon_alert(user, "authentication checks overridden") + return TRUE /obj/item/firing_pin/proc/gun_insert(mob/living/user, obj/item/gun/G) gun = G @@ -223,12 +224,12 @@ color = "#FFD700" fail_message = "" ///list of account IDs which have accepted the license prompt. If this is the multi-payment pin, then this means they accepted the waiver that each shot will cost them money - var/list/gun_owners = list() + var/list/gun_owners = list() ///how much gets paid out to license yourself to the gun - var/payment_amount + var/payment_amount var/datum/bank_account/pin_owner ///if true, user has to pay everytime they fire the gun - var/multi_payment = FALSE + var/multi_payment = FALSE var/owned = FALSE ///purchase prompt to prevent spamming it, set to the user who opens to prompt to prevent locking the gun up for other users. var/active_prompt_user @@ -321,10 +322,10 @@ pin_owner.adjust_money(payment_amount, "Firing Pin: Gun License Bought") gun_owners += credit_card_details to_chat(user, span_notice("Gun license purchased, have a secure day!")) - - else + + else to_chat(user, span_warning("ERROR: User balance insufficent for successful transaction!")) - + if("No", null) to_chat(user, span_warning("ERROR: User has declined to purchase gun license!")) active_prompt_user = null diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 0bbe5b221b373..6bce420a02bcb 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -94,6 +94,8 @@ var/ricochets = 0 /// how many times we can ricochet max var/ricochets_max = 0 + /// how many times we have to ricochet min (unless we hit an atom we can ricochet off) + var/min_ricochets = 0 /// 0-100 (or more, I guess), the base chance of ricocheting, before being modified by the atom we shoot and our chance decay var/ricochet_chance = 0 /// 0-1 (or more, I guess) multiplier, the ricochet_chance is modified by multiplying this after each ricochet @@ -196,6 +198,7 @@ var/embed_falloff_tile var/static/list/projectile_connections = list( COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + COMSIG_ATOM_ATTACK_HAND = PROC_REF(attempt_parry), ) /// If true directly targeted turfs can be hit var/can_hit_turfs = FALSE @@ -208,7 +211,6 @@ if(embedding) updateEmbedding() AddElement(/datum/element/connect_loc, projectile_connections) - RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(on_enter)) /obj/projectile/proc/Range() range-- @@ -225,12 +227,12 @@ SEND_SIGNAL(src, COMSIG_PROJECTILE_RANGE_OUT) qdel(src) -//to get the correct limb (if any) for the projectile hit message -/mob/living/proc/check_limb_hit(hit_zone) +/// Returns the string form of the def_zone we have hit. +/mob/living/proc/check_hit_limb_zone_name(hit_zone) if(has_limbs) return hit_zone -/mob/living/carbon/check_limb_hit(hit_zone) +/mob/living/carbon/check_hit_limb_zone_name(hit_zone) if(get_bodypart(hit_zone)) return hit_zone else //when a limb is missing the damage is actually passed to the chest @@ -247,17 +249,17 @@ /obj/projectile/proc/on_hit(atom/target, blocked = FALSE, pierce_hit) // i know that this is probably more with wands and gun mods in mind, but it's a bit silly that the projectile on_hit signal doesn't ping the projectile itself. // maybe we care what the projectile thinks! See about combining these via args some time when it's not 5AM - var/obj/item/bodypart/hit_limb + var/hit_limb_zone if(isliving(target)) var/mob/living/L = target - hit_limb = L.check_limb_hit(def_zone) + hit_limb_zone = L.check_hit_limb_zone_name(def_zone) if(fired_from) - SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_ON_HIT, firer, target, Angle, hit_limb) - SEND_SIGNAL(src, COMSIG_PROJECTILE_SELF_ON_HIT, firer, target, Angle, hit_limb) + SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_ON_HIT, firer, target, Angle, hit_limb_zone) + SEND_SIGNAL(src, COMSIG_PROJECTILE_SELF_ON_HIT, firer, target, Angle, hit_limb_zone) if(QDELETED(src)) // in case one of the above signals deleted the projectile for whatever reason return - var/turf/target_loca = get_turf(target) + var/turf/target_turf = get_turf(target) var/hitx var/hity @@ -268,18 +270,18 @@ hitx = target.pixel_x + rand(-8, 8) hity = target.pixel_y + rand(-8, 8) - if(damage > 0 && (damage_type == BRUTE || damage_type == BURN) && iswallturf(target_loca) && prob(75)) - var/turf/closed/wall/W = target_loca + if(damage > 0 && (damage_type == BRUTE || damage_type == BURN) && iswallturf(target_turf) && prob(75)) + var/turf/closed/wall/target_wall = target_turf if(impact_effect_type && !hitscan) - new impact_effect_type(target_loca, hitx, hity) + new impact_effect_type(target_wall, hitx, hity) - W.add_dent(WALL_DENT_SHOT, hitx, hity) + target_wall.add_dent(WALL_DENT_SHOT, hitx, hity) return BULLET_ACT_HIT if(!isliving(target)) if(impact_effect_type && !hitscan) - new impact_effect_type(target_loca, hitx, hity) + new impact_effect_type(target_turf, hitx, hity) if(isturf(target) && hitsound_wall) var/volume = clamp(vol_by_damage() + 20, 0, 100) if(suppressed) @@ -287,47 +289,56 @@ playsound(loc, hitsound_wall, volume, TRUE, -1) return BULLET_ACT_HIT - var/mob/living/L = target + var/mob/living/living_target = target if(blocked != 100) // not completely blocked - if(damage && L.blood_volume && damage_type == BRUTE) - 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) - if(prob(33)) - L.add_splatter_floor(target_loca) + var/obj/item/bodypart/hit_bodypart = living_target.get_bodypart(hit_limb_zone) + if (damage) + if (living_target.blood_volume && damage_type == BRUTE && (isnull(hit_bodypart) || hit_bodypart.can_bleed())) + var/splatter_dir = dir + if(starting) + splatter_dir = get_dir(starting, target_turf) + if(isalien(living_target)) + new /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter(target_turf, splatter_dir) + else + new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_turf, splatter_dir) + if(prob(33)) + living_target.add_splatter_floor(target_turf) + else if (!isnull(hit_bodypart) && (hit_bodypart.biological_state & (BIO_METAL|BIO_WIRED))) + var/random_damage_mult = RANDOM_DECIMAL(0.85, 1.15) // SOMETIMES you can get more or less sparks + var/damage_dealt = ((damage / (1 - (blocked / 100))) * random_damage_mult) + + var/spark_amount = round((damage_dealt / PROJECTILE_DAMAGE_PER_ROBOTIC_SPARK)) + if (spark_amount > 0) + do_sparks(spark_amount, FALSE, living_target) + else if(impact_effect_type && !hitscan) - new impact_effect_type(target_loca, hitx, hity) + new impact_effect_type(target_turf, 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_zone) + organ_hit_text = " in \the [parse_zone(hit_limb_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]!")) + to_chat(living_target, span_userdanger("You're shot by \a [src][organ_hit_text]!")) else if(hitsound) var/volume = vol_by_damage() playsound(src, hitsound, volume, TRUE, -1) - L.visible_message(span_danger("[L] is hit by \a [src][organ_hit_text]!"), \ + living_target.visible_message(span_danger("[living_target] is hit by \a [src][organ_hit_text]!"), \ span_userdanger("You're hit by \a [src][organ_hit_text]!"), null, COMBAT_MESSAGE_RANGE) - if(L.is_blind()) - to_chat(L, span_userdanger("You feel something hit you[organ_hit_text]!")) - L.on_hit(src) + if(living_target.is_blind()) + to_chat(living_target, span_userdanger("You feel something hit you[organ_hit_text]!")) + living_target.on_hit(src) var/reagent_note if(reagents?.reagent_list) reagent_note = "REAGENTS: [pretty_string_from_reagent_list(reagents.reagent_list)]" if(ismob(firer)) - log_combat(firer, L, "shot", src, reagent_note) + log_combat(firer, living_target, "shot", src, reagent_note) return BULLET_ACT_HIT if(isvehicle(firer)) @@ -337,10 +348,10 @@ if(!LAZYLEN(logging_mobs)) logging_mobs = firing_vehicle.return_drivers() for(var/mob/logged_mob as anything in logging_mobs) - log_combat(logged_mob, L, "shot", src, "from inside [firing_vehicle][logging_mobs.len > 1 ? " with multiple occupants" : null][reagent_note ? " and contained [reagent_note]" : null]") + log_combat(logged_mob, living_target, "shot", src, "from inside [firing_vehicle][logging_mobs.len > 1 ? " with multiple occupants" : null][reagent_note ? " and contained [reagent_note]" : null]") return BULLET_ACT_HIT - L.log_message("has been shot by [firer] with [src][reagent_note ? " containing [reagent_note]" : null]", LOG_ATTACK, color="orange") + living_target.log_message("has been shot by [firer] with [src][reagent_note ? " containing [reagent_note]" : null]", LOG_ATTACK, color="orange") return BULLET_ACT_HIT /obj/projectile/proc/vol_by_damage() @@ -379,15 +390,6 @@ return Impact(A) -/// Signal proc for when a projectile enters a turf. -/obj/projectile/proc/on_enter(datum/source, atom/old_loc, dir, forced, list/old_locs) - SIGNAL_HANDLER - - UnregisterSignal(old_loc, COMSIG_ATOM_ATTACK_HAND) - - if(isturf(loc)) - RegisterSignal(loc, COMSIG_ATOM_ATTACK_HAND, PROC_REF(attempt_parry)) - /// Signal proc for when a mob attempts to attack this projectile or the turf it's on with an empty hand. /obj/projectile/proc/attempt_parry(datum/source, mob/user, list/modifiers) SIGNAL_HANDLER @@ -449,8 +451,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. + if(!HAS_TRAIT(src, TRAIT_ALWAYS_HIT_ZONE)) + 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. return process_hit(T, select_target(T, A, A), A) // SELECT TARGET FIRST! @@ -495,7 +498,9 @@ 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 - SEND_SIGNAL(target, COMSIG_PROJECTILE_PREHIT, args) + if (SEND_SIGNAL(target, COMSIG_PROJECTILE_PREHIT, args, src) & PROJECTILE_INTERRUPT_HIT) + qdel(src) + return BULLET_ACT_BLOCK if(mode == PROJECTILE_PIERCE_HIT) ++pierces hit_something = TRUE @@ -684,7 +689,7 @@ var/chance = ricochet_chance * A.receive_ricochet_chance_mod if(firer && HAS_TRAIT(firer, TRAIT_NICE_SHOT)) chance += NICE_SHOT_RICOCHET_BONUS - if(prob(chance)) + if(ricochets < min_ricochets || prob(chance)) return TRUE return FALSE @@ -744,9 +749,6 @@ SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_BEFORE_FIRE, src, original) if(firer) SEND_SIGNAL(firer, COMSIG_PROJECTILE_FIRER_BEFORE_FIRE, src, fired_from, 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. @@ -1133,5 +1135,25 @@ return FALSE +///Checks if the projectile can embed into someone +/obj/projectile/proc/can_embed_into(atom/hit) + return embedding && shrapnel_type && iscarbon(hit) && !HAS_TRAIT(hit, TRAIT_PIERCEIMMUNE) + #undef MOVES_HITSCAN #undef MUZZLE_EFFECT_PIXEL_INCREMENT + +/// Fire a projectile from this atom at another atom +/atom/proc/fire_projectile(projectile_type, atom/target, sound, firer) + if (!isnull(sound)) + playsound(src, sound, vol = 100, vary = TRUE) + + var/turf/startloc = get_turf(src) + var/obj/projectile/bullet = new projectile_type(startloc) + bullet.starting = startloc + bullet.firer = firer || src + bullet.fired_from = src + bullet.yo = target.y - startloc.y + bullet.xo = target.x - startloc.x + bullet.original = target + bullet.preparePixelProjectile(target, src) + bullet.fire() diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 5a7a851dab454..1a188ab556f97 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -28,6 +28,11 @@ damage = 25 bare_wound_bonus = 40 +/obj/projectile/beam/laser/carbine + icon_state = "carbine_laser" + impact_effect_type = /obj/effect/temp_visual/impact_effect/yellow_laser + damage = 10 + //overclocked laser, does a bit more damage but has much higher wound power (-0 vs -20) /obj/projectile/beam/laser/hellfire name = "hellfire laser" @@ -55,6 +60,21 @@ else if(isturf(target)) impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser/wall +/obj/projectile/beam/laser/musket + name = "low-power laser" + icon_state = "laser_musket" + impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser + damage = 25 + stamina = 40 + light_color = COLOR_STRONG_VIOLET + weak_against_armour = TRUE + +/obj/projectile/beam/laser/musket/prime + name = "mid-power laser" + damage = 30 + stamina = 45 + weak_against_armour = FALSE + /obj/projectile/beam/weak damage = 15 @@ -101,6 +121,15 @@ /obj/projectile/beam/disabler/weak damage = 15 +/obj/projectile/beam/disabler/smoothbore + name = "unfocused disabler beam" + weak_against_armour = TRUE + +/obj/projectile/beam/disabler/smoothbore/prime + name = "focused disabler beam" + weak_against_armour = FALSE + damage = 35 //slight increase in damage just for the hell of it + /obj/projectile/beam/pulse name = "pulse" icon_state = "u_laser" diff --git a/code/modules/projectiles/projectile/bullets/_incendiary.dm b/code/modules/projectiles/projectile/bullets/_incendiary.dm index 857b6f0373492..6808f7c48fd5e 100644 --- a/code/modules/projectiles/projectile/bullets/_incendiary.dm +++ b/code/modules/projectiles/projectile/bullets/_incendiary.dm @@ -84,7 +84,7 @@ LAZYADD(launched_items, iter_item) else if(isliving(iter)) var/mob/living/incineratee = iter - incineratee.take_bodypart_damage(0, damage, wound_bonus=wound_bonus, bare_wound_bonus=bare_wound_bonus) + incineratee.take_bodypart_damage(0, damage, check_armor = TRUE, wound_bonus=wound_bonus, bare_wound_bonus=bare_wound_bonus) incineratee.adjust_fire_stacks(fire_stacks) #undef BACKBLAST_MAX_ITEM_KNOCKBACK diff --git a/code/modules/projectiles/projectile/bullets/foam_dart.dm b/code/modules/projectiles/projectile/bullets/foam_dart.dm new file mode 100644 index 0000000000000..6d4cffd4524d6 --- /dev/null +++ b/code/modules/projectiles/projectile/bullets/foam_dart.dm @@ -0,0 +1,39 @@ +/obj/projectile/bullet/foam_dart + name = "foam dart" + desc = "I hope you're wearing eye protection." + damage = 0 // It's a damn toy. + damage_type = OXY + icon = 'icons/obj/weapons/guns/toy.dmi' + icon_state = "foamdart_proj" + base_icon_state = "foamdart_proj" + range = 10 + embedding = null + var/modified = FALSE + var/obj/item/pen/pen = null + +/obj/projectile/bullet/foam_dart/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_PROJECTILE_ON_SPAWN_DROP, PROC_REF(handle_drop)) + +/obj/projectile/bullet/foam_dart/proc/handle_drop(datum/source, obj/item/ammo_casing/foam_dart/newcasing) + SIGNAL_HANDLER + newcasing.modified = modified + var/obj/projectile/bullet/foam_dart/newdart = newcasing.loaded_projectile + newdart.modified = modified + newdart.damage_type = damage_type + if(pen) + newdart.pen = pen + pen.forceMove(newdart) + pen = null + newdart.damage = 5 + newdart.update_appearance() + +/obj/projectile/bullet/foam_dart/Destroy() + pen = null + return ..() + +/obj/projectile/bullet/foam_dart/riot + name = "riot foam dart" + icon_state = "foamdart_riot_proj" + base_icon_state = "foamdart_riot_proj" + stamina = 25 diff --git a/code/modules/projectiles/projectile/bullets/lmg.dm b/code/modules/projectiles/projectile/bullets/lmg.dm index f6081c7b070c0..5601df06dd523 100644 --- a/code/modules/projectiles/projectile/bullets/lmg.dm +++ b/code/modules/projectiles/projectile/bullets/lmg.dm @@ -24,21 +24,22 @@ /obj/projectile/bullet/syndicate_turret damage = 20 -// 7.12x82mm (SAW) +// 7mm (SAW) -/obj/projectile/bullet/mm712x82 - name = "7.12x82mm bullet" +/obj/projectile/bullet/a7mm + name = "7mm bullet" damage = 30 armour_penetration = 5 wound_bonus = -50 wound_falloff_tile = 0 -/obj/projectile/bullet/mm712x82/ap - name = "7.12x82mm armor-piercing bullet" +/obj/projectile/bullet/a7mm/ap + name = "7mm armor-piercing bullet" + damage = 25 armour_penetration = 75 -/obj/projectile/bullet/mm712x82/hp - name = "7.12x82mm hollow-point bullet" +/obj/projectile/bullet/a7mm/hp + name = "7mm hollow-point bullet" damage = 50 sharpness = SHARP_EDGED weak_against_armour = TRUE @@ -46,20 +47,20 @@ bare_wound_bonus = 30 wound_falloff_tile = -8 -/obj/projectile/bullet/incendiary/mm712x82 - name = "7.12x82mm incendiary bullet" +/obj/projectile/bullet/incendiary/a7mm + name = "7mm incendiary bullet" damage = 15 fire_stacks = 3 -/obj/projectile/bullet/mm712x82/match - name = "7.12x82mm match bullet" +/obj/projectile/bullet/a7mm/match + name = "7mm match bullet" ricochets_max = 2 ricochet_chance = 60 ricochet_auto_aim_range = 4 ricochet_incidence_leeway = 55 -/obj/projectile/bullet/mm712x82/bouncy - name = "7.12x82mm rubber bullet" +/obj/projectile/bullet/a7mm/bouncy + name = "7mm rubber bullet" damage = 20 ricochets_max = 40 ricochet_chance = 500 // will bounce off anything and everything, whether they like it or not diff --git a/code/modules/projectiles/projectile/bullets/pistol.dm b/code/modules/projectiles/projectile/bullets/pistol.dm index ece260f92fbde..8fccc510ff8fd 100644 --- a/code/modules/projectiles/projectile/bullets/pistol.dm +++ b/code/modules/projectiles/projectile/bullets/pistol.dm @@ -42,3 +42,22 @@ name = "10mm incendiary bullet" damage = 20 fire_stacks = 3 + +/obj/projectile/bullet/c10mm/reaper + name = "10mm reaper pellet" + damage = 50 + armour_penetration = 40 + tracer_type = /obj/effect/projectile/tracer/sniper + impact_type = /obj/effect/projectile/impact/sniper + muzzle_type = /obj/effect/projectile/muzzle/sniper + hitscan = TRUE + impact_effect_type = null + hitscan_light_intensity = 3 + hitscan_light_range = 0.75 + hitscan_light_color_override = LIGHT_COLOR_DIM_YELLOW + muzzle_flash_intensity = 5 + muzzle_flash_range = 1 + muzzle_flash_color_override = LIGHT_COLOR_DIM_YELLOW + impact_light_intensity = 5 + impact_light_range = 1 + impact_light_color_override = LIGHT_COLOR_DIM_YELLOW diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm index 8a9ce8c764944..b5411c937be8f 100644 --- a/code/modules/projectiles/projectile/bullets/revolver.dm +++ b/code/modules/projectiles/projectile/bullets/revolver.dm @@ -109,6 +109,20 @@ damage = 60 wound_bonus = -30 +/obj/projectile/bullet/a357/phasic + name = ".357 phasic bullet" + icon_state = "gaussphase" + damage = 35 + armour_penetration = 100 + projectile_phasing = PASSTABLE | PASSGLASS | PASSGRILLE | PASSCLOSEDTURF | PASSMACHINE | PASSSTRUCTURE | PASSDOORS + +/obj/projectile/bullet/a357/heartseeker + name = ".357 heartseeker bullet" + icon_state = "gauss" + damage = 50 + homing = TRUE + homing_turn_speed = 120 + // admin only really, for ocelot memes /obj/projectile/bullet/a357/match name = ".357 match bullet" diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm index 712e4dcc0f22c..4cb7bd543b481 100644 --- a/code/modules/projectiles/projectile/bullets/rifle.dm +++ b/code/modules/projectiles/projectile/bullets/rifle.dm @@ -1,37 +1,37 @@ -// 5.56mm (M-90gl Carbine) +// .223 (M-90gl Carbine) -/obj/projectile/bullet/a556 - name = "5.56mm bullet" +/obj/projectile/bullet/a223 + name = ".223 bullet" damage = 35 armour_penetration = 30 wound_bonus = -40 -/obj/projectile/bullet/a556/weak //centcom +/obj/projectile/bullet/a223/weak //centcom damage = 20 -/obj/projectile/bullet/a556/phasic - name = "5.56mm phasic bullet" +/obj/projectile/bullet/a223/phasic + name = ".223 phasic bullet" icon_state = "gaussphase" - damage = 20 - armour_penetration = 70 + damage = 30 + armour_penetration = 100 projectile_phasing = PASSTABLE | PASSGLASS | PASSGRILLE | PASSCLOSEDTURF | PASSMACHINE | PASSSTRUCTURE | PASSDOORS -// 7.62 (Nagant Rifle) +// .310 Strilka (Sakhno Rifle) -/obj/projectile/bullet/a762 - name = "7.62 bullet" +/obj/projectile/bullet/strilka310 + name = ".310 Strilka bullet" damage = 60 armour_penetration = 10 wound_bonus = -45 wound_falloff_tile = 0 -/obj/projectile/bullet/a762/surplus - name = "7.62 surplus bullet" +/obj/projectile/bullet/strilka310/surplus + name = ".310 Strilka surplus bullet" weak_against_armour = TRUE //this is specifically more important for fighting carbons than fighting noncarbons. Against a simple mob, this is still a full force bullet armour_penetration = 0 -/obj/projectile/bullet/a762/enchanted - name = "enchanted 7.62 bullet" +/obj/projectile/bullet/strilka310/enchanted + name = "enchanted .310 bullet" damage = 20 stamina = 80 @@ -46,3 +46,4 @@ bare_wound_bonus = 80 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) wound_falloff_tile = -5 + shrapnel_type = /obj/item/ammo_casing/harpoon diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index cde530c6ed51c..639939e150fb7 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -24,6 +24,14 @@ sharpness = NONE embedding = null +/obj/projectile/bullet/shotgun_beanbag/a40mm + name = "rubber slug" + icon_state = "cannonball" + damage = 20 + stamina = 160 //BONK + wound_bonus = 30 + weak_against_armour = TRUE + /obj/projectile/bullet/incendiary/shotgun name = "incendiary slug" icon_state = "pellet" @@ -110,14 +118,13 @@ embedding = null /obj/projectile/bullet/pellet/shotgun_improvised - tile_dropoff = 0.35 //Come on it does 6 damage don't be like that. - damage = 6 - wound_bonus = 0 - bare_wound_bonus = 7.5 + damage = 5 + wound_bonus = -5 + demolition_mod = 3 //Very good at acts of vandalism /obj/projectile/bullet/pellet/shotgun_improvised/Initialize(mapload) . = ..() - range = rand(1, 8) + range = rand(3, 8) /obj/projectile/bullet/pellet/shotgun_improvised/on_range() do_sparks(1, TRUE, src) @@ -128,3 +135,12 @@ /obj/projectile/bullet/scattershot icon_state = "pellet" damage = 24 + +//Breaching Ammo + +/obj/projectile/bullet/shotgun_breaching + name = "12g breaching round" + desc = "A breaching round designed to destroy airlocks and windows with only a few shots. Ineffective against other targets." + hitsound = 'sound/weapons/sonic_jackhammer.ogg' + damage = 5 //does shit damage to everything except doors and windows + demolition_mod = 200 //one shot to break a window or grille, or two shots to breach an airlock door diff --git a/code/modules/projectiles/projectile/bullets/smg.dm b/code/modules/projectiles/projectile/bullets/smg.dm index 7dec4b9da21c0..8befcb690ecfa 100644 --- a/code/modules/projectiles/projectile/bullets/smg.dm +++ b/code/modules/projectiles/projectile/bullets/smg.dm @@ -10,6 +10,11 @@ name = ".45 armor-piercing bullet" armour_penetration = 50 +/obj/projectile/bullet/c45/hp + name = ".45 hollow point bullet" + damage = 50 + weak_against_armour = TRUE + /obj/projectile/bullet/incendiary/c45 name = ".45 incendiary bullet" damage = 15 diff --git a/code/modules/projectiles/projectile/bullets/special.dm b/code/modules/projectiles/projectile/bullets/special.dm index 59bb27e34eb47..c424f2cd6bed4 100644 --- a/code/modules/projectiles/projectile/bullets/special.dm +++ b/code/modules/projectiles/projectile/bullets/special.dm @@ -6,7 +6,7 @@ movement_type = FLYING projectile_piercing = ALL hitsound = 'sound/items/bikehorn.ogg' - icon = 'icons/obj/hydroponics/harvest.dmi' + icon = 'icons/obj/service/hydroponics/harvest.dmi' icon_state = "banana" range = 200 embedding = null diff --git a/code/modules/projectiles/projectile/energy/_energy.dm b/code/modules/projectiles/projectile/energy/_energy.dm index 8527041e86006..86ec80b3b20ff 100644 --- a/code/modules/projectiles/projectile/energy/_energy.dm +++ b/code/modules/projectiles/projectile/energy/_energy.dm @@ -6,3 +6,9 @@ armor_flag = ENERGY reflectable = REFLECT_NORMAL impact_effect_type = /obj/effect/temp_visual/impact_effect/energy + +/obj/projectile/energy/Initialize(mapload) + . = ..() + + ADD_TRAIT(src, TRAIT_FREE_HYPERSPACE_MOVEMENT, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT, INNATE_TRAIT) diff --git a/code/modules/projectiles/projectile/energy/net_snare.dm b/code/modules/projectiles/projectile/energy/net_snare.dm index be1f4b7a303e5..440ab9438e2dd 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 SSmachines.get_machines_by_type_and_subtypes(/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 261dab29b27cb..03cf5f85d84df 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -21,7 +21,7 @@ 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") - else if((C.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(C, TRAIT_STUNIMMUNE)) + else if(!C.check_stun_immunity(CANKNOCKDOWN)) addtimer(CALLBACK(C, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), 20), 5) /obj/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet diff --git a/code/modules/projectiles/projectile/energy/tesla.dm b/code/modules/projectiles/projectile/energy/tesla.dm index 9afb816088ff3..687bd1b8e73f9 100644 --- a/code/modules/projectiles/projectile/energy/tesla.dm +++ b/code/modules/projectiles/projectile/energy/tesla.dm @@ -5,7 +5,7 @@ damage = 10 //A worse lasergun var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_LOW_POWER_GEN var/zap_range = 3 - var/power = 10000 + var/power = 4e6 /obj/projectile/energy/tesla/on_hit(atom/target) . = ..() @@ -22,7 +22,7 @@ /obj/projectile/energy/tesla/cannon name = "tesla orb" - power = 20000 + power = 8e6 damage = 15 //Mech man big /obj/projectile/energy/tesla_cannon diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index a56f4439fb73d..c8da91b9dde14 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -431,9 +431,9 @@ /// The duration of the trail before deleting. var/trail_lifespan = 0 SECONDS /// The icon the trail uses. - var/trail_icon = 'icons/obj/wizard.dmi' + var/trail_icon = 'icons/effects/magic.dmi' /// The icon state the trail uses. - var/trail_icon_state = "trail" + var/trail_icon_state = "arrow" /obj/projectile/magic/aoe/Range() if(trigger_range >= 1) @@ -481,7 +481,7 @@ speed = 0.3 /// The power of the zap itself when it electrocutes someone - var/zap_power = 20000 + var/zap_power = 8e6 /// The range of the zap itself when it electrocutes someone var/zap_range = 15 /// The flags of the zap itself when it electrocutes someone @@ -503,7 +503,7 @@ return ..() /obj/projectile/magic/aoe/lightning/no_zap - zap_power = 10000 + zap_power = 4e6 zap_range = 4 zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_LOW_POWER_GEN diff --git a/code/modules/projectiles/projectile/reusable/_reusable.dm b/code/modules/projectiles/projectile/reusable/_reusable.dm deleted file mode 100644 index ab7d89573eeb1..0000000000000 --- a/code/modules/projectiles/projectile/reusable/_reusable.dm +++ /dev/null @@ -1,22 +0,0 @@ -/obj/projectile/bullet/reusable - name = "reusable bullet" - desc = "How do you even reuse a bullet?" - impact_effect_type = null - embedding = null - shrapnel_type = null - var/ammo_type = /obj/item/ammo_casing/caseless - var/dropped = FALSE - -/obj/projectile/bullet/reusable/on_hit(atom/target, blocked = FALSE) - . = ..() - handle_drop() - -/obj/projectile/bullet/reusable/on_range() - handle_drop() - ..() - -/obj/projectile/bullet/reusable/proc/handle_drop() - if(!dropped) - var/turf/T = get_turf(src) - new ammo_type(T) - dropped = TRUE diff --git a/code/modules/projectiles/projectile/reusable/foam_dart.dm b/code/modules/projectiles/projectile/reusable/foam_dart.dm deleted file mode 100644 index 8c82993a896af..0000000000000 --- a/code/modules/projectiles/projectile/reusable/foam_dart.dm +++ /dev/null @@ -1,41 +0,0 @@ -/obj/projectile/bullet/reusable/foam_dart - name = "foam dart" - desc = "I hope you're wearing eye protection." - damage = 0 // It's a damn toy. - damage_type = OXY - icon = 'icons/obj/weapons/guns/toy.dmi' - icon_state = "foamdart_proj" - base_icon_state = "foamdart_proj" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart - range = 10 - var/modified = FALSE - var/obj/item/pen/pen = null - -/obj/projectile/bullet/reusable/foam_dart/handle_drop() - if(dropped) - return - var/turf/T = get_turf(src) - dropped = 1 - var/obj/item/ammo_casing/caseless/foam_dart/newcasing = new ammo_type(T) - newcasing.modified = modified - var/obj/projectile/bullet/reusable/foam_dart/newdart = newcasing.loaded_projectile - newdart.modified = modified - newdart.damage_type = damage_type - if(pen) - newdart.pen = pen - pen.forceMove(newdart) - pen = null - newdart.damage = 5 - newdart.update_appearance() - - -/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 - stamina = 25 diff --git a/code/modules/projectiles/projectile/special/curse.dm b/code/modules/projectiles/projectile/special/curse.dm index 335064ec0af18..4e7283810c93f 100644 --- a/code/modules/projectiles/projectile/special/curse.dm +++ b/code/modules/projectiles/projectile/special/curse.dm @@ -1,7 +1,5 @@ /obj/effect/ebeam/curse_arm name = "curse arm" - layer = LARGE_MOB_LAYER - plane = GAME_PLANE_UPPER_FOV_HIDDEN /obj/projectile/curse_hand name = "curse hand" diff --git a/code/modules/projectiles/projectile/special/lightbreaker.dm b/code/modules/projectiles/projectile/special/lightbreaker.dm new file mode 100644 index 0000000000000..fd7d3d89e7a97 --- /dev/null +++ b/code/modules/projectiles/projectile/special/lightbreaker.dm @@ -0,0 +1,35 @@ +/obj/projectile/energy/fisher + name = "attenuated kinetic force" + alpha = 0 + damage = 0 + damage_type = BRUTE + armor_flag = BOMB + range = 14 + projectile_phasing = PASSTABLE | PASSMOB | PASSMACHINE | PASSSTRUCTURE + hitscan = TRUE + var/disrupt_duration = 10 SECONDS + +/obj/projectile/energy/fisher/on_hit(atom/target, blocked, pierce_hit) + . = ..() + var/lights_flickered = 0 + if(SEND_SIGNAL(target, COMSIG_HIT_BY_SABOTEUR, disrupt_duration) & COMSIG_SABOTEUR_SUCCESS) + lights_flickered++ + if(!isliving(target)) + return + var/list/things_to_disrupt = list() + if(ishuman(target)) + var/mob/living/carbon/human/human_target = target + things_to_disrupt = human_target.get_all_gear() + else + var/mob/living/living_target = target // i guess this covers borgs too? + things_to_disrupt = living_target.get_equipped_items(include_pockets = TRUE, include_accessories = TRUE) + for(var/obj/item/thingy as anything in things_to_disrupt) + if(SEND_SIGNAL(thingy, COMSIG_HIT_BY_SABOTEUR, disrupt_duration) & COMSIG_SABOTEUR_SUCCESS) + lights_flickered++ + if(lights_flickered) + to_chat(target, span_warning("Your light [lights_flickered > 1 ? "sources flick" : "source flicks"] off.")) + +/obj/projectile/energy/fisher/melee + range = 1 + suppressed = SUPPRESSED_VERY + disrupt_duration = 20 SECONDS diff --git a/code/modules/projectiles/projectile/special/neurotoxin.dm b/code/modules/projectiles/projectile/special/neurotoxin.dm index 0dcac83f02c0b..24d24f68d3087 100644 --- a/code/modules/projectiles/projectile/special/neurotoxin.dm +++ b/code/modules/projectiles/projectile/special/neurotoxin.dm @@ -1,15 +1,14 @@ /obj/projectile/neurotoxin name = "neurotoxin spit" icon_state = "neurotoxin" - damage = 5 - damage_type = TOX - paralyze = 10 SECONDS + damage = 65 + damage_type = STAMINA armor_flag = BIO impact_effect_type = /obj/effect/temp_visual/impact_effect/neurotoxin + armour_penetration = 50 /obj/projectile/neurotoxin/on_hit(atom/target, blocked = FALSE) if(isalien(target)) - paralyze = 0 SECONDS damage = 0 return ..() diff --git a/code/modules/projectiles/projectile/special/rocket.dm b/code/modules/projectiles/projectile/special/rocket.dm index 1c8c8d4267e14..08a2c18c2f73d 100644 --- a/code/modules/projectiles/projectile/special/rocket.dm +++ b/code/modules/projectiles/projectile/special/rocket.dm @@ -16,6 +16,9 @@ desc = "Boom." icon_state= "missile" damage = 50 + sharpness = NONE + embedding = null + shrapnel_type = null ricochets_max = 0 /// Whether we do extra damage when hitting a mech or silicon var/anti_armour_damage = 0 @@ -23,13 +26,15 @@ var/random_crits_enabled = TRUE // Worst thing Valve ever added /obj/projectile/bullet/rocket/on_hit(atom/target, blocked = FALSE) + var/random_crit_gib = FALSE if(isliving(target) && prob(1) && random_crits_enabled) var/mob/living/gibbed_dude = target if(gibbed_dude.stat < HARD_CRIT) gibbed_dude.say("Is that a fucking ro-", forced = "hit by rocket") + random_crit_gib = TRUE ..() - do_boom(target) + do_boom(target, random_crit_gib) if(anti_armour_damage && ismecha(target)) var/obj/vehicle/sealed/mecha/M = target M.take_damage(anti_armour_damage) @@ -40,11 +45,15 @@ /** This proc allows us to customize the conditions necesary for the rocket to detonate, allowing for different explosions for living targets, turf targets, among other potential differences. This granularity is helpful for things like the special rockets mechs use. */ -/obj/projectile/bullet/rocket/proc/do_boom(atom/target) +/obj/projectile/bullet/rocket/proc/do_boom(atom/target, random_crit_gib = FALSE) if(!isliving(target)) //if the target isn't alive, so is a wall or something explosion(target, heavy_impact_range = 1, light_impact_range = 2, flame_range = 3, flash_range = 4, explosion_cause = src) else explosion(target, light_impact_range = 2, flame_range = 3, flash_range = 4, explosion_cause = src) + if(random_crit_gib) + var/mob/living/gibbed_dude = target + new /obj/effect/temp_visual/crit(get_turf(gibbed_dude)) + gibbed_dude.gib(DROP_ALL_REMAINS) /// PM9 HEAP rocket - the anti-anything missile you always craved. /obj/projectile/bullet/rocket/heap diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index f121a7596cf4e..6388bc4221246 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -38,7 +38,7 @@ //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) + var/list/blacklist = typecacheof(/datum/chemical_reaction/randomized) if(GLOB.chemical_reactions_list_reactant_index) return @@ -50,60 +50,86 @@ GLOB.chemical_reactions_results_lookup_list = list() //UI glob GLOB.chemical_reactions_list_product_index = list() //product to reaction list + var/list/datum/chemical_reaction/reactions = list() for(var/path in paths) - var/datum/chemical_reaction/D = new path() - var/list/reaction_ids = list() + var/datum/chemical_reaction/reaction = new path() + reactions += reaction + + // Ok so we're gonna do a thingTM here + // I want to distribute all our reactions such that each reagent id links to as few as possible + // I get the feeling there's a canonical way of doing this, but I don't know it + // So instead, we're gonna wing it + var/list/reagent_to_react_count = list() + for(var/datum/chemical_reaction/reaction as anything in reactions) + for(var/reagent_id as anything in reaction.required_reagents) + reagent_to_react_count[reagent_id] += 1 + + var/list/reaction_lookup = GLOB.chemical_reactions_list_reactant_index + // Create filters based on a random reagent id in the required reagents list - this is used to speed up handle_reactions() + // Basically, we only really need to care about ONE reagent, at least when initially filtering, since any others are ignorable + // Doing this separately because it relies on the loop above, and this is easier to parse + for(var/datum/chemical_reaction/reaction as anything in reactions) + var/preferred_id = null + for(var/reagent_id as anything in reaction.required_reagents) + if(!preferred_id) + preferred_id = reagent_id + continue + // If we would have less then they would, take it + if(length(reaction_lookup[reagent_id]) < length(reaction_lookup[preferred_id])) + preferred_id = reagent_id + continue + // If they potentially have more then us, we take it + if(reagent_to_react_count[reagent_id] < reagent_to_react_count[preferred_id]) + preferred_id = reagent_id + continue + if (preferred_id != null) + if(!reaction_lookup[preferred_id]) + reaction_lookup[preferred_id] = list() + reaction_lookup[preferred_id] += reaction + + for(var/datum/chemical_reaction/reaction as anything in reactions) var/list/product_ids = list() var/list/reagents = list() var/list/product_names = list() - var/bitflags = D.reaction_tags + var/bitflags = reaction.reaction_tags - if(!D.required_reagents || !D.required_reagents.len) //Skip impossible reactions + if(!reaction.required_reagents || !reaction.required_reagents.len) //Skip impossible reactions continue - GLOB.chemical_reactions_list[path] = D + GLOB.chemical_reactions_list[reaction.type] = reaction - for(var/reaction in D.required_reagents) - reaction_ids += reaction - var/datum/reagent/reagent = find_reagent_object_from_type(reaction) + for(var/reagent_path in reaction.required_reagents) + var/datum/reagent/reagent = find_reagent_object_from_type(reagent_path) if(!istype(reagent)) - stack_trace("Invalid reagent found in [D] required_reagents: [reaction]") + stack_trace("Invalid reagent found in [reaction] required_reagents: [reagent_path]") continue reagents += list(list("name" = reagent.name, "id" = reagent.type)) - for(var/product in D.results) + for(var/product in reaction.results) var/datum/reagent/reagent = find_reagent_object_from_type(product) if(!istype(reagent)) - stack_trace("Invalid reagent found in [D] results: [product]") + stack_trace("Invalid reagent found in [reaction] results: [product]") continue product_names += reagent.name product_ids += product var/product_name if(!length(product_names)) - var/list/names = splittext("[D.type]", "/") + var/list/names = splittext("[reaction.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 + if(!is_type_in_typecache(reaction.type, blacklist)) + //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. + GLOB.chemical_reactions_results_lookup_list += list(list("name" = product_name, "id" = reaction.type, "bitflags" = bitflags, "reactants" = reagents)) - //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 specifically for finding reactions from product(reagent) ids/typepaths. + for(var/id in product_ids) + if(!GLOB.chemical_reactions_list_product_index[id]) + GLOB.chemical_reactions_list_product_index[id] = list() + GLOB.chemical_reactions_list_product_index[id] += reaction - // 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///////////////////////////////////////////// @@ -395,6 +421,28 @@ SEND_SIGNAL(src, COMSIG_REAGENTS_DEL_REAGENT, reagent) return TRUE +/// Turn one reagent into another, preserving volume, temp, purity, ph +/datum/reagents/proc/convert_reagent(source_reagent_typepath, target_reagent_typepath, multiplier = 1, include_source_subtypes = FALSE) + var/reagent_amount + var/reagent_purity + var/reagent_ph + if(include_source_subtypes) + reagent_ph = ph + var/weighted_purity + for(var/datum/reagent/reagent as anything in reagent_list) + if(reagent.type in typecacheof(source_reagent_typepath)) + weighted_purity += reagent.volume * reagent.purity + reagent_amount += reagent.volume + remove_reagent(reagent.type, reagent.volume) + reagent_purity = weighted_purity / reagent_amount + else + var/datum/reagent/source_reagent = get_reagent(source_reagent_typepath) + reagent_amount = source_reagent.volume + reagent_purity = source_reagent.purity + reagent_ph = source_reagent.ph + remove_reagent(source_reagent_typepath, reagent_amount) + add_reagent(target_reagent_typepath, reagent_amount * multiplier, reagtemp = chem_temp, added_purity = reagent_purity, added_ph = reagent_ph) + //Converts the creation_purity to purity /datum/reagents/proc/uncache_creation_purity(id) var/datum/reagent/R = has_reagent(id) @@ -422,21 +470,28 @@ * Check if this holder contains this reagent. * Reagent takes a PATH to a reagent. * Amount checks for having a specific amount of that chemical. - * Needs matabolizing takes into consideration if the chemical is matabolizing when it's checked. + * Needs matabolizing takes into consideration if the chemical is metabolizing when it's checked. + * Check subtypes controls whether it should it should also include subtypes: ispath(type, reagent) versus type == reagent. */ -/datum/reagents/proc/has_reagent(reagent, amount = -1, needs_metabolizing = FALSE) +/datum/reagents/proc/has_reagent(reagent, amount = -1, needs_metabolizing = FALSE, check_subtypes = FALSE) var/list/cached_reagents = reagent_list for(var/datum/reagent/holder_reagent as anything in cached_reagents) - if (holder_reagent.type == reagent) + if (check_subtypes ? ispath(holder_reagent.type, reagent) : holder_reagent.type == reagent) if(!amount) if(needs_metabolizing && !holder_reagent.metabolizing) + if(check_subtypes) + continue return FALSE return holder_reagent else if(round(holder_reagent.volume, CHEMICAL_QUANTISATION_LEVEL) >= amount) if(needs_metabolizing && !holder_reagent.metabolizing) + if(check_subtypes) + continue return FALSE return holder_reagent + else if(!check_subtypes) + return FALSE return FALSE /** @@ -464,14 +519,14 @@ * * multiplier - multiplies amount of each reagent by this number * * 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 + * * mob/transferred_by - used for logging * * remove_blacklisted - skips transferring of reagents without REAGENT_CAN_BE_SYNTHESIZED 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) +/datum/reagents/proc/trans_to(obj/target, amount = 1, multiplier = 1, preserve_data = TRUE, no_react = FALSE, mob/transferred_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 @@ -518,7 +573,7 @@ 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, reagent.purity, reagent.ph, no_react = TRUE, ignore_splitting = reagent.chemical_flags & REAGENT_DONOTSPLIT)) //we only handle reaction after every reagent has been transferred. continue if(methods) r_to_send += reagent @@ -552,7 +607,7 @@ 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, reagent.purity, reagent.ph, no_react = TRUE, ignore_splitting = reagent.chemical_flags & REAGENT_DONOTSPLIT)) //we only handle reaction after every reagent has been transferred. continue to_transfer = max(to_transfer - transfer_amount , 0) if(methods) @@ -565,9 +620,9 @@ var/list/reagent_qualities = list(REAGENT_TRANSFER_AMOUNT = transfer_amount, REAGENT_PURITY = reagent.purity) 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. - log_combat(transfered_by, target_atom, "transferred reagents ([get_external_reagent_log_string(transfer_log)]) from [my_atom] to") + if(transferred_by && target_atom) + target_atom.add_hiddenprint(transferred_by) //log prints so admins can figure out who touched it last. + log_combat(transferred_by, target_atom, "transferred reagents ([get_external_reagent_log_string(transfer_log)]) from [my_atom] to") update_total() R.update_total() @@ -644,10 +699,8 @@ // 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 @@ -882,7 +935,7 @@ return FALSE //Yup, no reactions here. No siree. if(is_reacting)//Prevent wasteful calculations - if(!(datum_flags & DF_ISPROCESSING))//If we're reacting - but not processing (i.e. we've transfered) + if(!(datum_flags & DF_ISPROCESSING))//If we're reacting - but not processing (i.e. we've transferred) START_PROCESSING(SSreagents, src) if(!(has_changed_state())) return FALSE @@ -898,70 +951,65 @@ var/list/cached_reactions = GLOB.chemical_reactions_list_reactant_index var/datum/cached_my_atom = my_atom LAZYNULL(failed_but_capable_reactions) + LAZYNULL(previous_reagent_list) . = 0 var/list/possible_reactions = list() for(var/datum/reagent/reagent as anything in cached_reagents) - for(var/datum/chemical_reaction/reaction as anything in cached_reactions[reagent.type]) // Was a big list but now it should be smaller since we filtered it with our reagent id - if(!reaction) - continue + LAZYADD(previous_reagent_list, reagent.type) + // I am SO sorry + reaction_loop: + for(var/datum/chemical_reaction/reaction as anything in cached_reactions[reagent.type]) // Was a big list but now it should be smaller since we filtered it with our reagent id + if(!reaction) + continue - if(!reaction.required_reagents)//Don't bring in empty ones - continue - var/list/cached_required_reagents = reaction.required_reagents - var/total_required_reagents = cached_required_reagents.len - var/total_matching_reagents = 0 - var/list/cached_required_catalysts = reaction.required_catalysts - var/total_required_catalysts = cached_required_catalysts.len - var/total_matching_catalysts= 0 - var/matching_container = FALSE - var/matching_other = FALSE - 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 + if(!reaction.required_reagents)//Don't bring in empty ones + continue - for(var/req_reagent in cached_required_reagents) - 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_accepts_subtypes) - matching_container = !reaction.required_container || istype(cached_my_atom, reaction.required_container) - else - matching_container = !reaction.required_container || cached_my_atom.type == reaction.required_container + var/granularity = 1 + if(!(reaction.reaction_flags & REACTION_INSTANT)) + granularity = CHEMICAL_VOLUME_MINIMUM - if(isliving(cached_my_atom) && !reaction.mob_react) //Makes it so certain chemical reactions don't occur in mobs - matching_container = FALSE + var/list/cached_required_reagents = reaction.required_reagents + for(var/req_reagent in cached_required_reagents) + if(!has_reagent(req_reagent, (cached_required_reagents[req_reagent]*granularity))) + continue reaction_loop - matching_other = reaction.required_other ? reaction.pre_reaction_other_checks(src) : TRUE + var/list/cached_required_catalysts = reaction.required_catalysts + for(var/_catalyst in cached_required_catalysts) + if(!has_reagent(_catalyst, (cached_required_catalysts[_catalyst]*granularity))) + continue reaction_loop - else - if(!reaction.required_container) - matching_container = TRUE - if(!reaction.required_other) - matching_other = TRUE + if(cached_my_atom) + if(reaction.required_container) + if(reaction.required_container_accepts_subtypes && !istype(cached_my_atom, reaction.required_container)) + continue + else if(cached_my_atom.type != reaction.required_container) + continue + + if(isliving(cached_my_atom) && !reaction.mob_react) //Makes it so certain chemical reactions don't occur in mobs + continue - if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp)) - meets_temp_requirement = TRUE + else if(reaction.required_container) + continue - if(((ph >= (reaction.optimal_ph_min - reaction.determin_ph_range)) && (ph <= (reaction.optimal_ph_max + reaction.determin_ph_range)))) - meets_ph_requirement = TRUE + if(reaction.required_other && !reaction.pre_reaction_other_checks(src)) + continue - if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other) - if(meets_temp_requirement && meets_ph_requirement) - possible_reactions += reaction - else + // At this point, we've passed all the hard restrictions and entered into just the soft ones + // So we're gonna start tracking reactions that COULD be completed on continue, instead of just exiting + var/required_temp = reaction.required_temp + var/is_cold_recipe = reaction.is_cold_recipe + if(required_temp != 0 && (is_cold_recipe && chem_temp > required_temp) || (!is_cold_recipe && chem_temp < required_temp)) LAZYADD(failed_but_capable_reactions, reaction) + continue + + if(ph < reaction.optimal_ph_min - reaction.determin_ph_range && ph > reaction.optimal_ph_max + reaction.determin_ph_range) + LAZYADD(failed_but_capable_reactions, reaction) + continue + + possible_reactions += reaction - update_previous_reagent_list() //This is the point where we have all the possible reactions from a reagent/catalyst point of view, so we set up the reaction list for(var/datum/chemical_reaction/selected_reaction as anything in possible_reactions) if((selected_reaction.reaction_flags & REACTION_INSTANT) || (flags & REAGENT_HOLDER_INSTANT_REACT)) //If we have instant reactions, we process them here @@ -1085,7 +1133,7 @@ * Force stops the current holder/reagents datum from reacting * * Calls end_reaction() for each equlilbrium datum in reaction_list and finish_reacting() -* Usually only called when a datum is transfered into a NO_REACT container +* Usually only called when a datum is transferred into a NO_REACT container */ /datum/reagents/proc/force_stop_reacting() var/list/mix_message = list() @@ -1120,7 +1168,7 @@ * Transfers the reaction_list to a new reagents datum * * Arguments: -* * target - the datum/reagents that this src is being transfered into +* * target - the datum/reagents that this src is being transferred into */ /datum/reagents/proc/transfer_reactions(datum/reagents/target) if(QDELETED(target)) @@ -1167,11 +1215,6 @@ return TRUE return FALSE -/datum/reagents/proc/update_previous_reagent_list() - LAZYNULL(previous_reagent_list) - for(var/datum/reagent/reagent as anything in reagent_list) - LAZYADD(previous_reagent_list, reagent.type) - ///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) @@ -1238,6 +1281,7 @@ /datum/reagents/proc/update_total() var/list/cached_reagents = reagent_list . = 0 // This is a relatively hot proc. + var/total_ph = 0 // I know I know, I'm sorry for(var/datum/reagent/reagent as anything in cached_reagents) if((reagent.volume < 0.05) && !is_reacting) del_reagent(reagent.type) @@ -1245,8 +1289,15 @@ del_reagent(reagent.type) else . += reagent.volume + total_ph += (reagent.ph * reagent.volume) total_volume = . - recalculate_sum_ph() + + if(!.) // No volume, default to the base + ph = CHEMICAL_NORMAL_PH + return . + //Keep limited // should really be defines + ph = clamp(total_ph/total_volume, 0, 14) + /** * Applies the relevant expose_ proc for every reagent in this holder @@ -1264,12 +1315,11 @@ if(isnull(A)) return null - var/list/cached_reagents = reagent_list - if(!cached_reagents.len) + if(!reagent_list.len) return null var/list/reagents = list() - for(var/datum/reagent/reagent as anything in cached_reagents) + for(var/datum/reagent/reagent as anything in reagent_list) reagents[reagent] = reagent.volume * volume_modifier return A.expose_reagents(reagents, src, methods, volume_modifier, show_message) @@ -1304,17 +1354,16 @@ /// 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) +/datum/reagents/proc/get_reagent_amount(reagent, include_subtypes = FALSE) var/list/cached_reagents = reagent_list + var/total_amount = 0 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 + if((!include_subtypes && cached_reagent.type == reagent) || (include_subtypes && ispath(cached_reagent.type, reagent))) + total_amount += round(cached_reagent.volume, CHEMICAL_QUANTISATION_LEVEL) + return total_amount /datum/reagents/proc/get_multiple_reagent_amounts(list/reagents) var/list/cached_reagents = reagent_list @@ -1332,6 +1381,36 @@ return round(cached_reagent.purity, 0.01) return 0 +/// Directly set the purity of all contained reagents to a new value +/datum/reagents/proc/set_all_reagents_purity(new_purity = 0) + var/list/cached_reagents = reagent_list + for(var/datum/reagent/cached_reagent as anything in cached_reagents) + cached_reagent.purity = max(0, new_purity) + +/// Get the average purity of all reagents (or all subtypes of provided typepath) +/datum/reagents/proc/get_average_purity(parent_type = null) + var/total_amount + var/weighted_purity + var/list/cached_reagents = reagent_list + for(var/datum/reagent/reagent as anything in cached_reagents) + if(!isnull(parent_type) && !istype(reagent, parent_type)) + continue + total_amount += reagent.volume + weighted_purity += reagent.volume * reagent.purity + return weighted_purity / total_amount + +/// Get the average nutriment_factor of all consumable reagents +/datum/reagents/proc/get_average_nutriment_factor() + var/consumable_volume + var/weighted_nutriment_factor + var/list/cached_reagents = reagent_list + for(var/datum/reagent/reagent as anything in cached_reagents) + if(istype(reagent, /datum/reagent/consumable)) + var/datum/reagent/consumable/consumable_reagent = reagent + consumable_volume += consumable_reagent.volume + weighted_nutriment_factor += consumable_reagent.volume * consumable_reagent.nutriment_factor + return weighted_nutriment_factor / consumable_volume + /// Get a comma separated string of every reagent name in this holder. UNUSED /datum/reagents/proc/get_reagent_names() var/list/names = list() @@ -1517,19 +1596,6 @@ 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. * diff --git a/code/modules/reagents/chemistry/items.dm b/code/modules/reagents/chemistry/items.dm index b2e29e3c5d61e..37d089aab4231 100644 --- a/code/modules/reagents/chemistry/items.dm +++ b/code/modules/reagents/chemistry/items.dm @@ -180,7 +180,7 @@ 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) + var/trans = container.reagents.trans_to(src, container.amount_per_transfer_from_this, transferred_by = user) to_chat(user, span_notice("You fill [src] with [trans] unit\s of the contents of [container].")) if(I.heat < 1000) return diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 23a411172acb5..44c2b72121c9b 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -80,6 +80,8 @@ /datum/reagent/drug/space_drugs, /datum/reagent/toxin ) + /// Starting purity of the created reagents + var/base_reagent_purity = 1 var/list/recording_recipe @@ -152,13 +154,14 @@ . += beaker_overlay -/obj/machinery/chem_dispenser/emag_act(mob/user) +/obj/machinery/chem_dispenser/emag_act(mob/user, obj/item/card/emag/emag_card) 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.")) + balloon_alert(user, "already emagged!") + return FALSE + balloon_alert(user, "safeties shorted out") dispensable_reagents |= emagged_reagents//add the emagged reagents to the dispensable ones obj_flags |= EMAGGED + return TRUE /obj/machinery/chem_dispenser/ex_act(severity, target) if(severity <= EXPLODE_LIGHT) @@ -178,9 +181,9 @@ if(EXPLODE_LIGHT) SSexplosions.low_mov_atom += beaker -/obj/machinery/chem_dispenser/handle_atom_del(atom/A) - ..() - if(A == beaker) +/obj/machinery/chem_dispenser/Exited(atom/movable/gone, direction) + . = ..() + if(gone == beaker) beaker = null cut_overlays() @@ -277,7 +280,7 @@ if(!cell?.use(to_dispense / powerefficiency)) say("Not enough energy to complete operation!") return - holder.add_reagent(reagent, to_dispense, reagtemp = dispensed_temperature) + holder.add_reagent(reagent, to_dispense, reagtemp = dispensed_temperature, added_purity = base_reagent_purity) work_animation() else @@ -317,7 +320,7 @@ if(!cell?.use(to_dispense / powerefficiency)) say("Not enough energy to complete operation!") return - holder.add_reagent(reagent, to_dispense, reagtemp = dispensed_temperature) + holder.add_reagent(reagent, to_dispense, reagtemp = dispensed_temperature, added_purity = base_reagent_purity) work_animation() else recording_recipe[key] += dispense_amount @@ -400,7 +403,7 @@ if(beaker?.reagents) R += beaker.reagents for(var/i in 1 to total) - Q.add_reagent(pick(dispensable_reagents), 10, reagtemp = dispensed_temperature) + Q.add_reagent(pick(dispensable_reagents), 10, reagtemp = dispensed_temperature, added_purity = base_reagent_purity) R += Q chem_splash(get_turf(src), null, 3, R) if(beaker?.reagents) @@ -493,6 +496,7 @@ /datum/reagent/consumable/lemonjuice, /datum/reagent/consumable/lemon_lime, /datum/reagent/consumable/limejuice, + /datum/reagent/consumable/melon_soda, /datum/reagent/consumable/menthol, /datum/reagent/consumable/orangejuice, /datum/reagent/consumable/pineapplejuice, @@ -515,6 +519,7 @@ /datum/reagent/toxin/mindbreaker, /datum/reagent/toxin/staminatoxin ) + base_reagent_purity = 0.5 /obj/machinery/chem_dispenser/drinks/Initialize(mapload) . = ..() @@ -566,6 +571,7 @@ /datum/reagent/consumable/ethanol/ale, /datum/reagent/consumable/ethanol/applejack, /datum/reagent/consumable/ethanol/beer, + /datum/reagent/consumable/ethanol/coconut_rum, /datum/reagent/consumable/ethanol/cognac, /datum/reagent/consumable/ethanol/creme_de_cacao, /datum/reagent/consumable/ethanol/creme_de_coconut, @@ -576,6 +582,7 @@ /datum/reagent/consumable/ethanol/kahlua, /datum/reagent/consumable/ethanol/beer/maltliquor, /datum/reagent/consumable/ethanol/navy_rum, + /datum/reagent/consumable/ethanol/rice_beer, /datum/reagent/consumable/ethanol/rum, /datum/reagent/consumable/ethanol/sake, /datum/reagent/consumable/ethanol/tequila, @@ -584,6 +591,7 @@ /datum/reagent/consumable/ethanol/vodka, /datum/reagent/consumable/ethanol/whiskey, /datum/reagent/consumable/ethanol/wine, + /datum/reagent/consumable/ethanol/yuyake, ) upgrade_reagents = null emagged_reagents = list( @@ -648,7 +656,7 @@ /obj/machinery/chem_dispenser/abductor name = "reagent synthesizer" desc = "Synthesizes a variety of reagents using proto-matter." - icon = 'icons/obj/abductor.dmi' + icon = 'icons/obj/antags/abductor.dmi' icon_state = "chem_dispenser" base_icon_state = "chem_dispenser" has_panel_overlay = FALSE diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 28ec3545880fa..3716715a2d6cf 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -49,9 +49,9 @@ QDEL_NULL(beaker) return ..() -/obj/machinery/chem_heater/handle_atom_del(atom/A) +/obj/machinery/chem_heater/Exited(atom/movable/gone, direction) . = ..() - if(A == beaker) + if(gone == beaker) beaker = null update_appearance() @@ -78,8 +78,8 @@ if(!user) return FALSE if(beaker) - try_put_in_hand(beaker, user) UnregisterSignal(beaker.reagents, COMSIG_REAGENTS_REACTION_STEP) + try_put_in_hand(beaker, user) beaker = null if(new_beaker) beaker = new_beaker @@ -155,6 +155,11 @@ use_power(active_power_usage * seconds_per_tick) +/obj/machinery/chem_heater/wrench_act(mob/living/user, obj/item/tool) + . = ..() + default_unfasten_wrench(user, tool) + return TOOL_ACT_TOOLTYPE_SUCCESS + /obj/machinery/chem_heater/attackby(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, "mixer0b", "mixer0b", I)) return diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 941f46cec12fa..464df7bf36397 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -27,8 +27,8 @@ GLOBAL_LIST_INIT(chem_master_containers, list( /obj/item/reagent_containers/condiment/coldsauce, /obj/item/reagent_containers/condiment/mayonnaise, /obj/item/reagent_containers/condiment/ketchup, - /obj/item/reagent_containers/condiment/quality_oil, - /obj/item/reagent_containers/condiment/cooking_oil, + /obj/item/reagent_containers/condiment/olive_oil, + /obj/item/reagent_containers/condiment/vegetable_oil, /obj/item/reagent_containers/condiment/peanut_butter, /obj/item/reagent_containers/condiment/cherryjelly, /obj/item/reagent_containers/condiment/honey, @@ -57,7 +57,7 @@ GLOBAL_LIST_INIT(chem_master_containers, list( resistance_flags = FIRE_PROOF | ACID_PROOF circuit = /obj/item/circuitboard/machine/chem_master /// Icons for different percentages of buffer reagents - var/fill_icon = 'icons/obj/reagentfillings.dmi' + var/fill_icon = 'icons/obj/medical/reagent_fillings.dmi' var/fill_icon_state = "chemmaster" var/list/fill_icon_thresholds = list(10,20,30,40,50,60,70,80,90,100) /// Inserted reagent container @@ -105,9 +105,9 @@ GLOBAL_LIST_INIT(chem_master_containers, list( replace_beaker() return ..() -/obj/machinery/chem_master/handle_atom_del(atom/deleted_atom) - ..() - if(deleted_atom == beaker) +/obj/machinery/chem_master/Exited(atom/movable/gone, direction) + . = ..() + if(gone == beaker) beaker = null update_appearance(UPDATE_ICON) @@ -201,7 +201,7 @@ GLOBAL_LIST_INIT(chem_master_containers, list( /// Insert new beaker and/or eject the inserted one /obj/machinery/chem_master/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) - if(!user?.transferItemToLoc(new_beaker, src)) + if(new_beaker && user && !user.transferItemToLoc(new_beaker, src)) return FALSE if(beaker) try_put_in_hand(beaker, user) @@ -379,7 +379,9 @@ GLOBAL_LIST_INIT(chem_master_containers, list( // Generate item name var/item_name_default = initial(container_style.name) - if(!(initial(container_style.reagent_flags) & OPENCONTAINER)) // Closed containers get reagent name and units in the name + if(selected_container == default_container) // Tubes and bottles gain reagent name + item_name_default = "[reagents.get_master_reagent_name()] [item_name_default]" + if(!(initial(container_style.reagent_flags) & OPENCONTAINER)) // Closed containers get both reagent name and units in the name item_name_default = "[reagents.get_master_reagent_name()] [item_name_default] ([volume_in_each]u)" var/item_name = tgui_input_text(usr, "Container name", @@ -407,7 +409,7 @@ GLOBAL_LIST_INIT(chem_master_containers, list( adjust_item_drop_location(item) item.name = item_name item.reagents.clear_reagents() - reagents.trans_to(item, volume_in_each, transfered_by = src) + reagents.trans_to(item, volume_in_each, transferred_by = src) printing_progress++ item_count-- update_appearance(UPDATE_ICON) diff --git a/code/modules/reagents/chemistry/machinery/chem_separator.dm b/code/modules/reagents/chemistry/machinery/chem_separator.dm index 41fd1eb188dc1..2e5571fd4312b 100644 --- a/code/modules/reagents/chemistry/machinery/chem_separator.dm +++ b/code/modules/reagents/chemistry/machinery/chem_separator.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/medical/chemical.dmi' icon_state = "separator" light_power = 1 - var/fill_icon = 'icons/obj/reagentfillings.dmi' + var/fill_icon = 'icons/obj/medical/reagent_fillings.dmi' var/fill_icon_state = "separator" /// Icons for different percentages of beaker/separator reagent volumes var/list/fill_icon_thresholds = list(1,30,80) @@ -43,9 +43,9 @@ QDEL_NULL(soundloop) return ..() -/obj/structure/chem_separator/handle_atom_del(atom/deleted_atom) - ..() - if(deleted_atom == beaker) +/obj/structure/chem_separator/Exited(atom/movable/gone, direction) + . = ..() + if(gone == beaker) beaker = null update_appearance(UPDATE_ICON) diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 273b2309c05ff..586cb0ce8fa1f 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -73,11 +73,11 @@ /obj/machinery/computer/pandemic/attack_ai_secondary(mob/user, list/modifiers) return attack_hand_secondary(user, modifiers) -/obj/machinery/computer/pandemic/handle_atom_del(atom/A) - if(A == beaker) +/obj/machinery/computer/pandemic/Exited(atom/movable/gone, direction) + . = ..() + if(gone == beaker) beaker = null update_appearance() - return ..() /obj/machinery/computer/pandemic/attackby(obj/item/held_item, mob/user, params) //Advanced science! Percision instruments (eg droppers and syringes) are precise enough to modify the loaded sample! diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 8acceeff975c9..26ebfa1d18d9f 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -1,9 +1,8 @@ -#define MILK_TO_BUTTER_COEFF 15 /obj/machinery/reagentgrinder name = "\improper All-In-One Grinder" desc = "From BlenderTech. Will It Blend? Let's test it out!" - icon = 'icons/obj/kitchen.dmi' + icon = 'icons/obj/machines/kitchen.dmi' icon_state = "juicer1" base_icon_state = "juicer" layer = BELOW_OBJ_LAYER @@ -100,11 +99,9 @@ . = ..() if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) return - if(!can_interact(user) || !user.can_perform_action(src, ALLOW_SILICON_REACH|FORBID_TELEKINESIS_REACH)) + if(operating || !user.can_perform_action(src, ALLOW_SILICON_REACH | FORBID_TELEKINESIS_REACH)) return - if(operating) - return - replace_beaker(user) + eject(user) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /obj/machinery/reagentgrinder/attack_robot_secondary(mob/user, list/modifiers) @@ -113,13 +110,13 @@ /obj/machinery/reagentgrinder/attack_ai_secondary(mob/user, list/modifiers) return attack_hand_secondary(user, modifiers) -/obj/machinery/reagentgrinder/handle_atom_del(atom/A) +/obj/machinery/reagentgrinder/Exited(atom/movable/gone, direction) . = ..() - if(A == beaker) + if(gone == beaker) beaker = null update_appearance() - if(holdingitems[A]) - holdingitems -= A + if(holdingitems[gone]) + holdingitems -= gone /obj/machinery/reagentgrinder/proc/drop_all_items() for(var/i in holdingitems) @@ -147,24 +144,28 @@ default_unfasten_wrench(user, tool) return TOOL_ACT_TOOLTYPE_SUCCESS -/obj/machinery/reagentgrinder/attackby(obj/item/I, mob/living/user, params) - //You can only screw open empty grinder - if(!beaker && !length(holdingitems) && default_deconstruction_screwdriver(user, icon_state, icon_state, I)) - return +/obj/machinery/reagentgrinder/screwdriver_act(mob/living/user, obj/item/tool) + . = TOOL_ACT_TOOLTYPE_SUCCESS + if(!beaker && !length(holdingitems)) + return default_deconstruction_screwdriver(user, icon_state, icon_state, tool) - if(default_deconstruction_crowbar(I)) - return +/obj/machinery/reagentgrinder/crowbar_act(mob/living/user, obj/item/tool) + return default_deconstruction_crowbar(tool) +/obj/machinery/reagentgrinder/attackby(obj/item/weapon, mob/living/user, params) if(panel_open) //Can't insert objects when its screwed open return TRUE - if (is_reagent_container(I) && !(I.item_flags & ABSTRACT) && I.is_open_container()) - var/obj/item/reagent_containers/B = I + if(!weapon.grind_requirements(src)) //Error messages should be in the objects' definitions + return + + if (is_reagent_container(weapon) && !(weapon.item_flags & ABSTRACT) && weapon.is_open_container()) + var/obj/item/reagent_containers/container = weapon . = TRUE //no afterattack - if(!user.transferItemToLoc(B, src)) + if(!user.transferItemToLoc(container, src)) return - replace_beaker(user, B) - to_chat(user, span_notice("You add [B] to [src].")) + replace_beaker(user, container) + to_chat(user, span_notice("You add [container] to [src].")) update_appearance() return TRUE //no afterattack @@ -173,39 +174,36 @@ return TRUE //Fill machine with a bag! - if(istype(I, /obj/item/storage/bag)) - if(!I.contents.len) - to_chat(user, span_notice("[I] is empty!")) + if(istype(weapon, /obj/item/storage/bag)) + if(!weapon.contents.len) + to_chat(user, span_notice("[weapon] is empty!")) return TRUE var/list/inserted = list() - if(I.atom_storage.remove_type(/obj/item/food/grown, src, limit - length(holdingitems), TRUE, FALSE, user, inserted)) + if(weapon.atom_storage.remove_type(/obj/item/food/grown, src, limit - length(holdingitems), TRUE, FALSE, user, inserted)) for(var/i in inserted) holdingitems[i] = TRUE inserted = list() - if(I.atom_storage.remove_type(/obj/item/food/honeycomb, src, limit - length(holdingitems), TRUE, FALSE, user, inserted)) + if(weapon.atom_storage.remove_type(/obj/item/food/honeycomb, src, limit - length(holdingitems), TRUE, FALSE, user, inserted)) for(var/i in inserted) holdingitems[i] = TRUE - if(!I.contents.len) - to_chat(user, span_notice("You empty [I] into [src].")) + if(!weapon.contents.len) + to_chat(user, span_notice("You empty [weapon] into [src].")) else to_chat(user, span_notice("You fill [src] to the brim.")) return TRUE - if(!I.grind_results && !I.juice_results) + if(!weapon.grind_results && !weapon.juice_typepath) if(user.combat_mode) return ..() else - to_chat(user, span_warning("You cannot grind [I] into reagents!")) + to_chat(user, span_warning("You cannot grind/juice [weapon] into reagents!")) return TRUE - if(!I.grind_requirements(src)) //Error messages should be in the objects' definitions - return - - if(user.transferItemToLoc(I, src)) - to_chat(user, span_notice("You add [I] to [src].")) - holdingitems[I] = TRUE + if(user.transferItemToLoc(weapon, src)) + to_chat(user, span_notice("You add [weapon] to [src].")) + holdingitems[weapon] = TRUE return FALSE /obj/machinery/reagentgrinder/ui_interact(mob/user) // The microwave Menu //I am reasonably certain that this is not a microwave @@ -262,9 +260,9 @@ if(beaker) replace_beaker(user) -/obj/machinery/reagentgrinder/proc/remove_object(obj/item/O) - holdingitems -= O - qdel(O) +/obj/machinery/reagentgrinder/proc/remove_object(obj/item/weapon) + holdingitems -= weapon + qdel(weapon) /obj/machinery/reagentgrinder/proc/start_shaking() var/static/list/transforms @@ -305,45 +303,44 @@ /obj/machinery/reagentgrinder/proc/stop_operating() operating = FALSE -/obj/machinery/reagentgrinder/proc/juice() +/obj/machinery/reagentgrinder/proc/juice(mob/user) power_change() - if(!beaker || machine_stat & (NOPOWER|BROKEN) || beaker.reagents.total_volume >= beaker.reagents.maximum_volume) + if(!beaker || machine_stat & (NOPOWER|BROKEN) || beaker.reagents.holder_full()) return operate_for(50, juicing = TRUE) for(var/obj/item/i in holdingitems) - if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) + if(beaker.reagents.holder_full()) break var/obj/item/I = i - if(I.juice_results) - juice_item(I) + if(I.juice_typepath) + juice_item(I, user) -/obj/machinery/reagentgrinder/proc/juice_item(obj/item/I) //Juicing results can be found in respective object definitions - if(I.on_juice(src) == -1) +/obj/machinery/reagentgrinder/proc/juice_item(obj/item/I, mob/user) //Juicing results can be found in respective object definitions + if(!I.juice(beaker.reagents, user)) to_chat(usr, span_danger("[src] shorts out as it tries to juice up [I], and transfers it back to storage.")) return - beaker.reagents.add_reagent_list(I.juice_results) remove_object(I) /obj/machinery/reagentgrinder/proc/grind(mob/user) power_change() - if(!beaker || machine_stat & (NOPOWER|BROKEN) || beaker.reagents.total_volume >= beaker.reagents.maximum_volume) + if(!beaker || machine_stat & (NOPOWER|BROKEN) || beaker.reagents.holder_full()) return operate_for(60) warn_of_dust() // don't breathe this. for(var/i in holdingitems) - if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) + if(beaker.reagents.holder_full()) break var/obj/item/I = i if(I.grind_results) grind_item(i, user) /obj/machinery/reagentgrinder/proc/grind_item(obj/item/I, mob/user) //Grind results can be found in respective object definitions - if(I.on_grind(src) == -1) //Call on_grind() to change amount as needed, and stop grinding the item if it returns -1 - to_chat(usr, span_danger("[src] shorts out as it tries to grind up [I], and transfers it back to storage.")) + if(!I.grind(beaker.reagents, user)) + if(isstack(I)) + to_chat(usr, span_notice("[src] attempts to grind as many pieces of [I] as possible.")) + else + to_chat(usr, span_danger("[src] shorts out as it tries to grind up [I], and transfers it back to storage.")) return - beaker.reagents.add_reagent_list(I.grind_results) - if(I.reagents) - I.reagents.trans_to(beaker, I.reagents.total_volume, transfered_by = user) remove_object(I) /obj/machinery/reagentgrinder/proc/mix(mob/user) @@ -352,24 +349,21 @@ if(!beaker || machine_stat & (NOPOWER|BROKEN)) return operate_for(50, juicing = TRUE) - addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/reagentgrinder, mix_complete)), 50) + addtimer(CALLBACK(src, PROC_REF(mix_complete)), 50 / speed) /obj/machinery/reagentgrinder/proc/mix_complete() - if(beaker?.reagents.total_volume) - //Recipe to make Butter - var/butter_amt = FLOOR(beaker.reagents.get_reagent_amount(/datum/reagent/consumable/milk) / MILK_TO_BUTTER_COEFF, 1) - beaker.reagents.remove_reagent(/datum/reagent/consumable/milk, MILK_TO_BUTTER_COEFF * butter_amt) - for(var/i in 1 to butter_amt) - new /obj/item/food/butter(drop_location()) - //Recipe to make Mayonnaise - if (beaker.reagents.has_reagent(/datum/reagent/consumable/eggyolk)) - var/amount = beaker.reagents.get_reagent_amount(/datum/reagent/consumable/eggyolk) - beaker.reagents.remove_reagent(/datum/reagent/consumable/eggyolk, amount) - beaker.reagents.add_reagent(/datum/reagent/consumable/mayonnaise, amount) - //Recipe to make whipped cream - if (beaker.reagents.has_reagent(/datum/reagent/consumable/cream)) - var/amount = beaker.reagents.get_reagent_amount(/datum/reagent/consumable/cream) - beaker.reagents.remove_reagent(/datum/reagent/consumable/cream, amount) - beaker.reagents.add_reagent(/datum/reagent/consumable/whipped_cream, amount) - -#undef MILK_TO_BUTTER_COEFF + if(beaker?.reagents.total_volume <= 0) + return + //Recipe to make Butter + var/butter_amt = FLOOR(beaker.reagents.get_reagent_amount(/datum/reagent/consumable/milk) / MILK_TO_BUTTER_COEFF, 1) + var/purity = beaker.reagents.get_reagent_purity(/datum/reagent/consumable/milk) + beaker.reagents.remove_reagent(/datum/reagent/consumable/milk, MILK_TO_BUTTER_COEFF * butter_amt) + for(var/i in 1 to butter_amt) + var/obj/item/food/butter/tasty_butter = new(drop_location()) + tasty_butter.reagents.set_all_reagents_purity(purity) + //Recipe to make Mayonnaise + if (beaker.reagents.has_reagent(/datum/reagent/consumable/eggyolk)) + beaker.reagents.convert_reagent(/datum/reagent/consumable/eggyolk, /datum/reagent/consumable/mayonnaise) + //Recipe to make whipped cream + if (beaker.reagents.has_reagent(/datum/reagent/consumable/cream)) + beaker.reagents.convert_reagent(/datum/reagent/consumable/cream, /datum/reagent/consumable/whipped_cream) diff --git a/code/modules/reagents/chemistry/machinery/smoke_machine.dm b/code/modules/reagents/chemistry/machinery/smoke_machine.dm index 0271c17d18b4c..3a8754bfe4f89 100644 --- a/code/modules/reagents/chemistry/machinery/smoke_machine.dm +++ b/code/modules/reagents/chemistry/machinery/smoke_machine.dm @@ -103,7 +103,7 @@ add_fingerprint(user) if(is_reagent_container(I) && 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) + var/units = RC.reagents.trans_to(src, RC.amount_per_transfer_from_this, transferred_by = user) if(units) to_chat(user, span_notice("You transfer [units] units of the solution to [src].")) return diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index ce4e11d9f0da6..46ac1eda36074 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -7,6 +7,10 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) if (length(initial(R.name))) .[ckey(initial(R.name))] = t +GLOBAL_LIST_INIT(blacklisted_metalgen_types, typecacheof(list( + /turf/closed/indestructible, //indestructible turfs should be indestructible, metalgen transmutation to plasma allows them to be destroyed + /turf/open/indestructible +))) //Various reagents //Toxin & acid reagents @@ -46,8 +50,6 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) 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 /// above this overdoses happen var/overdose_threshold = 0 /// You fucked up and this is now triggering its overdose effects, purge that shit quick. @@ -80,6 +82,9 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) 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 affected organ_flags, if the reagent damages/heals organ damage of an affected mob. + /// See "Organ defines for carbon mobs" in /code/_DEFINES/surgery.dm + var/affected_organ_flags = ORGAN_ORGANIC /// The affected bodytype, if the reagent damages/heals bodyparts (Brute/Fire) of an affected mob. /// See "Bodytype defines" in /code/_DEFINES/mobs.dm var/affected_bodytype = BODYTYPE_ORGANIC @@ -89,9 +94,6 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) /// The affected respiration type, if the reagent damages/heals oxygen damage of an affected mob. /// See "Mob bio-types flags" in /code/_DEFINES/mobs.dm var/affected_respiration_type = ALL - /// The affected organtype, if the reagent damages/heals organ damage of an affected mob. - /// See "Organ defines for carbon mobs" in /code/_DEFINES/mobs.dm - var/affected_organtype = ORGAN_ORGANIC ///The default reagent container for the reagent, used for icon generation var/obj/item/reagent_containers/default_container = /obj/item/reagent_containers/cup/bottle @@ -155,53 +157,73 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) /datum/reagent/proc/burn(datum/reagents/holder) return -/// Called from [/datum/reagents/proc/metabolize] -/datum/reagent/proc/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) +/** + * Ticks on mob Life() for as long as the reagent remains in the mob's reagents. + * + * Usage: Parent should be called first using . = ..() + * + * Exceptions: If the holder var needs to be accessed, call the parent afterward that as it can become null if the reagent is fully removed. + * + * Returns: UPDATE_MOB_HEALTH only if you need to update the health of a mob (this is only needed when damage is dealt to the mob) + * + * Arguments + * * mob/living/carbon/affected_mob - the mob which the reagent currently is inside of + * * seconds_per_tick - the time in server seconds between proc calls (when performing normally it will be 2) + * * times_fired - the number of times the owner's Life() tick has been called aka The number of times SSmobs has fired + * + */ +/datum/reagent/proc/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) current_cycle++ if(length(reagent_removal_skip_list)) return - holder.remove_reagent(type, metabolization_rate * M.metabolism_efficiency * seconds_per_tick) //By default it slowly disappears. + if(holder) + holder.remove_reagent(type, metabolization_rate * affected_mob.metabolism_efficiency * seconds_per_tick) //By default it slowly disappears. + +/// Called in burns.dm *if* the reagent has the REAGENT_AFFECTS_WOUNDS process flag +/datum/reagent/proc/on_burn_wound_processing(datum/wound/burn/flesh/burn_wound) + return /* -Used to run functions before a reagent is transfered. Returning TRUE will block the transfer attempt. +Used to run functions before a reagent is transferred. Returning TRUE will block the transfer attempt. Primarily used in reagents/reaction_agents */ /datum/reagent/proc/intercept_reagents_transfer(datum/reagents/target) return FALSE -///Called after a reagent is transfered +///Called after a reagent is transferred /datum/reagent/proc/on_transfer(atom/A, methods=TOUCH, trans_volume) return /// Called when this reagent is first added to a mob -/datum/reagent/proc/on_mob_add(mob/living/L, amount) +/datum/reagent/proc/on_mob_add(mob/living/affected_mob, 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 return /// Called when this reagent is removed while inside a mob -/datum/reagent/proc/on_mob_delete(mob/living/L) - L.clear_mood_event("[type]_overdose") +/datum/reagent/proc/on_mob_delete(mob/living/affected_mob) + affected_mob.clear_mood_event("[type]_overdose") return /// Called when this reagent first starts being metabolized by a liver -/datum/reagent/proc/on_mob_metabolize(mob/living/L) +/datum/reagent/proc/on_mob_metabolize(mob/living/affected_mob) return /// Called when this reagent stops being metabolized by a liver -/datum/reagent/proc/on_mob_end_metabolize(mob/living/L) +/datum/reagent/proc/on_mob_end_metabolize(mob/living/affected_mob) return -/// Called when a reagent is inside of a mob when they are dead -/datum/reagent/proc/on_mob_dead(mob/living/carbon/C, seconds_per_tick) +/// Called when a reagent is inside of a mob when they are dead. Returning UPDATE_MOB_HEALTH will cause updatehealth() to be called on the holder mob by /datum/reagents/proc/metabolize. +/datum/reagent/proc/on_mob_dead(mob/living/carbon/affected_mob, seconds_per_tick) 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 * seconds_per_tick) + if(holder) + holder.remove_reagent(type, metabolization_rate * affected_mob.metabolism_efficiency * seconds_per_tick) /// Called by [/datum/reagents/proc/conditional_update_move] -/datum/reagent/proc/on_move(mob/M) +/datum/reagent/proc/on_move(mob/affected_mob) return /// Called after add_reagents creates a new reagent. @@ -217,14 +239,14 @@ Primarily used in reagents/reaction_agents /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, seconds_per_tick, times_fired) +/// Called if the reagent has passed the overdose threshold and is set to be triggering overdose effects. Returning UPDATE_MOB_HEALTH will cause updatehealth() to be called on the holder mob by /datum/reagents/proc/metabolize. +/datum/reagent/proc/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) return -/// 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]!")) - M.add_mood_event("[type]_overdose", /datum/mood_event/overdose, name) +/// Called when an overdose starts. Returning UPDATE_MOB_HEALTH will cause updatehealth() to be called on the holder mob by /datum/reagents/proc/metabolize. +/datum/reagent/proc/overdose_start(mob/living/affected_mob) + to_chat(affected_mob, span_userdanger("You feel like you took too much of [name]!")) + affected_mob.add_mood_event("[type]_overdose", /datum/mood_event/overdose, name) return /** diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm deleted file mode 100644 index a9df88fb8022b..0000000000000 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ /dev/null @@ -1,3771 +0,0 @@ -#define ALCOHOL_THRESHOLD_MODIFIER 1 //Greater numbers mean that less alcohol has greater intoxication potential -#define ALCOHOL_EXPONENT 1.6 //The exponent applied to boozepwr to make higher volume alcohol at least a little bit damaging to the liver - -/datum/reagent/consumable/ethanol - name = "Ethanol" - 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 - burning_temperature = 2193//ethanol burns at 1970C (at it's peak) - burning_volume = 0.1 - default_container = /obj/item/reagent_containers/cup/glass/bottle/beer - fallback_icon = 'icons/obj/drinks/bottles.dmi' - fallback_icon_state = "beer" - /** - * Boozepwr Chart - * - * Higher numbers equal higher hardness, higher hardness equals more intense alcohol poisoning - * - * Note that all higher effects of alcohol poisoning will inherit effects for smaller amounts - * (i.e. light poisoning inherts from slight poisoning) - * In addition, severe effects won't always trigger unless the drink is poisonously strong - * All effects don't start immediately, but rather get worse over time; the rate is affected by the imbiber's alcohol tolerance - * (see [/datum/status_effect/inebriated]) - * - * * 0: Non-alcoholic - * * 1-10: Barely classifiable as alcohol - occassional slurring - * * 11-20: Slight alcohol content - slurring - * * 21-30: Below average - imbiber begins to look slightly drunk - * * 31-40: Just below average - no unique effects - * * 41-50: Average - mild disorientation, imbiber begins to look drunk - * * 51-60: Just above average - disorientation, vomiting, imbiber begins to look heavily drunk - * * 61-70: Above average - small chance of blurry vision, imbiber begins to look smashed - * * 71-80: High alcohol content - blurry vision, imbiber completely shitfaced - * * 81-90: Extremely high alcohol content - heavy toxin damage, passing out - * * 91-100: Dangerously toxic - swift death - */ - var/boozepwr = 65 - -/datum/reagent/consumable/ethanol/New(list/data) - if(LAZYLEN(data)) - if(data["quality"]) - quality = data["quality"] - name = "Natural " + name - if(data["boozepwr"]) - boozepwr = data["boozepwr"] - addiction_types = list(/datum/addiction/alcohol = 0.05 * boozepwr) - return ..() - -/datum/reagent/consumable/ethanol/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - if(drinker.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 - booze_power *= 0.7 - if(HAS_TRAIT(drinker, 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 * seconds_per_tick) - if(boozepwr > 0) - var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) - if (istype(liver)) - liver.apply_organ_damage(((max(sqrt(volume) * (boozepwr ** ALCOHOL_EXPONENT) * liver.alcohol_tolerance * seconds_per_tick, 0))/150)) - return ..() - -/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.clear_paper() - 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 - affectedbook.book_data.set_content("") - 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. - . = ..() - if(!(methods & (TOUCH|VAPOR|PATCH))) - 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/datum/surgery/surgery as anything in exposed_carbon.surgeries) - 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." - color = "#664300" // rgb: 102, 67, 0 - nutriment_factor = 1 * REAGENTS_METABOLISM - boozepwr = 25 - taste_description = "mild carbonated malt" - ph = 4 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - - glass_price = DRINK_PRICE_STOCK - -/datum/glass_style/drinking_glass/beer - required_drink_type = /datum/reagent/consumable/ethanol/beer - name = "glass of beer" - desc = "A freezing pint of beer." - icon_state = "beerglass" - - // Beer is a chemical composition of alcohol and various other things. It's a garbage nutrient but hey, it's still one. Also alcohol is bad, mmmkay? -/datum/reagent/consumable/ethanol/beer/on_hydroponics_apply(obj/machinery/hydroponics/mytray, mob/user) - mytray.adjust_plant_health(-round(volume * 0.05)) - mytray.adjust_waterlevel(round(volume * 0.7)) - -/datum/reagent/consumable/ethanol/beer/light - name = "Light Beer" - description = "An alcoholic beverage brewed since ancient times on Old Earth. This variety has reduced calorie and alcohol content." - boozepwr = 5 //Space Europeans hate it - taste_description = "dish water" - ph = 5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/beer/light - required_drink_type = /datum/reagent/consumable/ethanol/beer/light - name = "glass of light beer" - desc = "A freezing pint of watery light beer." - -/datum/reagent/consumable/ethanol/beer/maltliquor - name = "Malt Liquor" - description = "An alcoholic beverage brewed since ancient times on Old Earth. This variety is stronger than usual, super cheap, and super terrible." - boozepwr = 35 - taste_description = "sweet corn beer and the hood life" - ph = 4.8 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/beer/light - required_drink_type = /datum/reagent/consumable/ethanol/beer/maltliquor - name = "glass of malt liquor" - desc = "A freezing pint of malt liquor." - -/datum/reagent/consumable/ethanol/beer/green - name = "Green Beer" - description = "An alcoholic beverage brewed since ancient times on Old Earth. This variety is dyed a festive green." - color = "#A8E61D" - taste_description = "green piss water" - ph = 6 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/beer/green - required_drink_type = /datum/reagent/consumable/ethanol/beer/green - name = "glass of green beer" - desc = "A freezing pint of green beer. Festive." - icon_state = "greenbeerglass" - -/datum/reagent/consumable/ethanol/beer/green/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - if(drinker.color != color) - drinker.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/kahlua - name = "Kahlua" - description = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!" - color = "#8e8368" // rgb: 142,131,104 - boozepwr = 45 - ph = 6 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/shot_glass/kahlua - required_drink_type = /datum/reagent/consumable/ethanol/kahlua - icon_state ="shotglasscream" - -/datum/glass_style/drinking_glass/kahlua - required_drink_type = /datum/reagent/consumable/ethanol/kahlua - name = "glass of RR coffee liquor" - desc = "DAMN, THIS THING LOOKS ROBUST!" - icon_state ="kahluaglass" - -/datum/reagent/consumable/ethanol/kahlua/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - drinker.set_dizzy_if_lower(10 SECONDS * REM * seconds_per_tick) - drinker.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) - drinker.AdjustSleeping(-40 * REM * seconds_per_tick) - if(!HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) - drinker.set_jitter_if_lower(10 SECONDS) - ..() - . = TRUE - -/datum/reagent/consumable/ethanol/whiskey - name = "Whiskey" - description = "A superb and well-aged single-malt whiskey. Damn." - color = "#b4a287" // rgb: 180,162,135 - boozepwr = 75 - taste_description = "molasses" - ph = 4.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_STOCK - -/datum/glass_style/shot_glass/whiskey - required_drink_type = /datum/reagent/consumable/ethanol/whiskey - icon_state = "shotglassbrown" - -/datum/glass_style/drinking_glass/whiskey - required_drink_type = /datum/reagent/consumable/ethanol/whiskey - name = "glass of whiskey" - desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy." - icon_state = "whiskeyglass" - -/datum/reagent/consumable/ethanol/whiskey/kong - name = "Kong" - description = "Makes You Go Ape!®" - color = "#332100" // rgb: 51, 33, 0 - taste_description = "the grip of a giant ape" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/shot_glass/whiskey/kong - required_drink_type = /datum/reagent/consumable/ethanol/whiskey/kong - -/datum/glass_style/drinking_glass/whiskey/kong - required_drink_type = /datum/reagent/consumable/ethanol/whiskey/kong - name = "glass of Kong" - desc = "Makes You Go Ape!®" - -/datum/reagent/consumable/ethanol/whiskey/candycorn - name = "Candy Corn Liquor" - description = "Like they drank in 2D speakeasies." - color = "#ccb800" // rgb: 204, 184, 0 - taste_description = "pancake syrup" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/shot_glass/whiskey/candycorn - required_drink_type = /datum/reagent/consumable/ethanol/whiskey/candycorn - -/datum/glass_style/drinking_glass/whiskey/candycorn - required_drink_type = /datum/reagent/consumable/ethanol/whiskey/candycorn - name = "glass of candy corn liquor" - desc = "Good for your Imagination." - -/datum/reagent/consumable/ethanol/whiskey/candycorn/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - if(SPT_PROB(5, seconds_per_tick)) - drinker.adjust_hallucinations(4 SECONDS * REM * seconds_per_tick) - ..() - -/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" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/thirteenloko - required_drink_type = /datum/reagent/consumable/ethanol/thirteenloko - name = "glass of Thirteen Loko" - desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass." - icon_state = "thirteen_loko_glass" - -/datum/reagent/consumable/ethanol/thirteenloko/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - drinker.adjust_drowsiness(-14 SECONDS * REM * seconds_per_tick) - drinker.AdjustSleeping(-40 * REM * seconds_per_tick) - drinker.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, drinker.get_body_temp_normal()) - if(!HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) - drinker.set_jitter_if_lower(10 SECONDS) - ..() - 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_jitter_if_lower(40 SECONDS) - drinker.Stun(1.5 SECONDS) - -/datum/reagent/consumable/ethanol/thirteenloko/overdose_process(mob/living/drinker, seconds_per_tick, times_fired) - if(SPT_PROB(3.5, seconds_per_tick) && 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_jitter_if_lower(20 SECONDS) - - if(SPT_PROB(3.5, seconds_per_tick)) - 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(SPT_PROB(2.5, seconds_per_tick) && iscarbon(drinker)) - var/obj/item/organ/internal/eyes/eyes = drinker.get_organ_slot(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, required_bodytype = affected_bodytype) - else - to_chat(drinker, span_userdanger("You scream in terror as you go blind!")) - eyes.apply_organ_damage(eyes.maxHealth) - drinker.emote("scream") - - if(SPT_PROB(1.5, seconds_per_tick) && iscarbon(drinker)) - drinker.visible_message(span_danger("[drinker] starts having a seizure!"), span_userdanger("You have a seizure!")) - drinker.Unconscious(10 SECONDS) - drinker.set_jitter_if_lower(700 SECONDS) - - if(SPT_PROB(0.5, seconds_per_tick) && 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/vodka - name = "Vodka" - description = "Number one drink AND fueling choice for Russians worldwide." - color = "#0064C8" // rgb: 0, 100, 200 - boozepwr = 65 - taste_description = "grain alcohol" - ph = 8.1 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_CLEANS //Very high proof - default_container = /obj/item/reagent_containers/cup/glass/bottle/vodka - -/datum/glass_style/shot_glass/vodka - required_drink_type = /datum/reagent/consumable/ethanol/vodka - icon_state = "shotglassclear" - -/datum/glass_style/drinking_glass/vodka - required_drink_type = /datum/reagent/consumable/ethanol/vodka - name = "glass of vodka" - desc = "The glass contain wodka. Xynta." - icon_state = "ginvodkaglass" - -/datum/reagent/consumable/ethanol/bilk - name = "Bilk" - description = "This appears to be beer mixed with milk. Disgusting." - color = "#895C4C" // rgb: 137, 92, 76 - nutriment_factor = 2 * REAGENTS_METABOLISM - boozepwr = 15 - taste_description = "desperation and lactate" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/bilk - required_drink_type = /datum/reagent/consumable/ethanol/bilk - name = "glass of bilk" - desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis." - icon_state = "glass_brown" - -/datum/reagent/consumable/ethanol/bilk/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - if(drinker.getBruteLoss() && SPT_PROB(5, seconds_per_tick)) - drinker.heal_bodypart_damage(brute = 1) - . = TRUE - return ..() || . - -/datum/reagent/consumable/ethanol/threemileisland - name = "Three Mile Island Iced Tea" - description = "Made for a woman, strong enough for a man." - color = "#666340" // rgb: 102, 99, 64 - boozepwr = 10 - quality = DRINK_FANTASTIC - taste_description = "dryness" - ph = 3.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/threemileisland - required_drink_type = /datum/reagent/consumable/ethanol/threemileisland - name = "Three Mile Island Ice Tea" - desc = "A glass of this is sure to prevent a meltdown." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "threemileislandglass" - -/datum/reagent/consumable/ethanol/threemileisland/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - drinker.set_drugginess(100 SECONDS * REM * seconds_per_tick) - return ..() - -/datum/reagent/consumable/ethanol/gin - name = "Gin" - description = "It's gin. In space. I say, good sir." - color = "#d8e8f0" // rgb: 216,232,240 - boozepwr = 45 - taste_description = "an alcoholic christmas tree" - ph = 6.9 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_STOCK - -/datum/glass_style/drinking_glass/gin - required_drink_type = /datum/reagent/consumable/ethanol/gin - name = "glass of gin" - desc = "A crystal clear glass of Griffeater gin." - icon_state = "ginvodkaglass" - -/datum/reagent/consumable/ethanol/rum - name = "Rum" - description = "Yohoho and all that." - color = "#c9c07e" // rgb: 201,192,126 - boozepwr = 60 - taste_description = "spiked butterscotch" - ph = 6.5 - default_container = /obj/item/reagent_containers/cup/glass/bottle/rum - -/datum/glass_style/shot_glass/rum - required_drink_type = /datum/reagent/consumable/ethanol/rum - icon_state = "shotglassbrown" - -/datum/glass_style/drinking_glass/rum - required_drink_type = /datum/reagent/consumable/ethanol/rum - name = "glass of rum" - desc = "Now you want to pray for a pirate suit, don't you?" - icon_state = "rumglass" - -/datum/reagent/consumable/ethanol/tequila - name = "Tequila" - description = "A strong and mildly flavoured, Mexican produced spirit. Feeling thirsty, hombre?" - color = "#FFFF91" // rgb: 255, 255, 145 - boozepwr = 70 - taste_description = "paint stripper" - ph = 4 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_STOCK - -/datum/glass_style/shot_glass/tequila - required_drink_type = /datum/reagent/consumable/ethanol/tequila - icon_state = "shotglassgold" - -/datum/glass_style/drinking_glass/tequila - required_drink_type = /datum/reagent/consumable/ethanol/tequila - name = "glass of tequila" - desc = "Now all that's missing is the weird colored shades!" - icon_state = "tequilaglass" - -/datum/reagent/consumable/ethanol/vermouth - name = "Vermouth" - description = "You suddenly feel a craving for a martini..." - color = "#91FF91" // rgb: 145, 255, 145 - boozepwr = 45 - taste_description = "dry alcohol" - ph = 3.25 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/shot_glass/vermouth - required_drink_type = /datum/reagent/consumable/ethanol/vermouth - icon_state = "shotglassclear" - -/datum/glass_style/drinking_glass/vermouth - required_drink_type = /datum/reagent/consumable/ethanol/vermouth - name = "glass of vermouth" - desc = "You wonder why you're even drinking this straight." - icon_state = "vermouthglass" - -/datum/reagent/consumable/ethanol/wine - name = "Wine" - description = "A premium alcoholic beverage made from distilled grape juice." - color = "#7E4043" // rgb: 126, 64, 67 - boozepwr = 35 - taste_description = "bitter sweetness" - ph = 3.45 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_STOCK - default_container = /obj/item/reagent_containers/cup/glass/bottle/wine - -/datum/glass_style/shot_glass/wine - required_drink_type = /datum/reagent/consumable/ethanol/wine - icon_state = "shotglassred" - -/datum/glass_style/drinking_glass/wine - required_drink_type = /datum/reagent/consumable/ethanol/wine - name = "glass of wine" - desc = "A very classy looking drink." - icon_state = "wineglass" - -/datum/reagent/consumable/ethanol/wine/on_merge(data) - . = ..() - if(src.data && data && data["vintage"] != src.data["vintage"]) - src.data["vintage"] = "mixed wine" - -/datum/reagent/consumable/ethanol/wine/get_taste_description(mob/living/taster) - if(HAS_TRAIT(taster,TRAIT_WINE_TASTER)) - if(data && data["vintage"]) - return list("[data["vintage"]]" = 1) - else - return list("synthetic wine"=1) - return ..() - -/datum/reagent/consumable/ethanol/lizardwine - name = "Lizard Wine" - description = "An alcoholic beverage from Space China, made by infusing lizard 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." - color = "#F8EBF1" - boozepwr = 60 - taste_description = "classy bitter sweetness" - ph = 3.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_STOCK - -/datum/glass_style/drinking_glass/grappa - required_drink_type = /datum/reagent/consumable/ethanol/grappa - name = "glass of grappa" - desc = "A fine drink originally made to prevent waste by using the leftovers from winemaking." - icon_state = "grappa" - -/datum/reagent/consumable/ethanol/amaretto - name = "Amaretto" - description = "A gentle drink that carries a sweet aroma." - color = "#E17600" - boozepwr = 25 - taste_description = "fruity and nutty sweetness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_STOCK - -/datum/glass_style/shot_glass/amaretto - required_drink_type = /datum/reagent/consumable/ethanol/amaretto - icon_state = "shotglassgold" - -/datum/glass_style/drinking_glass/amaretto - required_drink_type = /datum/reagent/consumable/ethanol/amaretto - name = "glass of amaretto" - desc = "A sweet and syrupy looking drink." - icon_state = "amarettoglass" - -/datum/reagent/consumable/ethanol/cognac - name = "Cognac" - description = "A sweet and strongly alcoholic drink, made after numerous distillations and years of maturing. Classy as fornication." - color = "#AB3C05" // rgb: 171, 60, 5 - boozepwr = 75 - taste_description = "angry and irish" - ph = 3.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_STOCK - -/datum/glass_style/shot_glass/cognac - required_drink_type = /datum/reagent/consumable/ethanol/cognac - icon_state = "shotglassbrown" - -/datum/glass_style/drinking_glass/cognac - required_drink_type = /datum/reagent/consumable/ethanol/cognac - name = "glass of cognac" - desc = "Damn, you feel like some kind of French aristocrat just by holding this." - icon_state = "cognacglass" - -/datum/reagent/consumable/ethanol/absinthe - name = "Absinthe" - description = "A powerful alcoholic drink. Rumored to cause hallucinations but does not." - color = rgb(10, 206, 0) - boozepwr = 80 //Very strong even by default - taste_description = "death and licorice" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/shot_glass/absinthe - required_drink_type = /datum/reagent/consumable/ethanol/absinthe - icon_state = "shotglassgreen" - -/datum/glass_style/drinking_glass/absinthe - required_drink_type = /datum/reagent/consumable/ethanol/absinthe - name = "glass of absinthe" - desc = "It's as strong as it smells." - icon_state = "absinthe" - -/datum/reagent/consumable/ethanol/absinthe/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - if(SPT_PROB(5, seconds_per_tick) && !HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) - drinker.adjust_hallucinations(8 SECONDS) - ..() - -/datum/reagent/consumable/ethanol/hooch - name = "Hooch" - description = "Either someone's failure at cocktail making or attempt in alcohol production. In any case, do you really want to drink that?" - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 100 - taste_description = "pure resignation" - addiction_types = list(/datum/addiction/alcohol = 5, /datum/addiction/maintenance_drugs = 2) - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/hooch - required_drink_type = /datum/reagent/consumable/ethanol/hooch - name = "Hooch" - desc = "You've really hit rock bottom now... your liver packed its bags and left last night." - icon_state = "glass_brown2" - -/datum/reagent/consumable/ethanol/ale - name = "Ale" - description = "A dark alcoholic beverage made with malted barley and yeast." - color = "#976063" // rgb: 151,96,99 - boozepwr = 65 - taste_description = "hearty barley ale" - ph = 4.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_STOCK - -/datum/glass_style/drinking_glass/hooch - required_drink_type = /datum/reagent/consumable/ethanol/hooch - name = "glass of ale" - desc = "A freezing pint of delicious Ale." - icon_state = "aleglass" - -/datum/reagent/consumable/ethanol/goldschlager - name = "Goldschlager" - description = "100 proof cinnamon schnapps, made for alcoholic teen girls on spring break." - color = "#FFFF91" // rgb: 255, 255, 145 - boozepwr = 25 - quality = DRINK_NICE - taste_description = "burning cinnamon" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - - // This drink is really popular with a certain demographic. - var/teenage_girl_quality = DRINK_VERYGOOD - -/datum/glass_style/shot_glass/goldschlager - required_drink_type = /datum/reagent/consumable/ethanol/goldschlager - icon_state = "shotglassgold" - -/datum/glass_style/drinking_glass/goldschlager - required_drink_type = /datum/reagent/consumable/ethanol/goldschlager - name = "glass of goldschlager" - desc = "100% proof that teen girls will drink anything with gold in it." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "goldschlagerglass" - -/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" - description = "Tequila with silver in it, a favorite of alcoholic women in the club scene." - color = "#585840" // rgb: 88, 88, 64 - boozepwr = 60 - quality = DRINK_VERYGOOD - taste_description = "metallic and expensive" - ph = 4.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_HIGH - -/datum/glass_style/shot_glass/patron - required_drink_type = /datum/reagent/consumable/ethanol/patron - icon_state = "shotglassclear" - -/datum/glass_style/drinking_glass/patron - required_drink_type = /datum/reagent/consumable/ethanol/patron - name = "glass of patron" - desc = "Drinking patron in the bar, with all the subpar ladies." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "patronglass" - -/datum/reagent/consumable/ethanol/gintonic - name = "Gin and Tonic" - description = "An all time classic, mild cocktail." - color = "#cae7ec" // rgb: 202,231,236 - boozepwr = 25 - quality = DRINK_NICE - taste_description = "mild and tart" - ph = 3 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_EASY - -/datum/glass_style/drinking_glass/gintonic - required_drink_type = /datum/reagent/consumable/ethanol/gintonic - name = "Gin and Tonic" - desc = "A mild but still great cocktail. Drink up, like a true Englishman." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "gintonicglass" - -/datum/reagent/consumable/ethanol/rum_coke - name = "Rum and Coke" - description = "Rum, mixed with cola." - taste_description = "cola" - boozepwr = 40 - quality = DRINK_NICE - color = "#3E1B00" - ph = 4 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/rum_coke - required_drink_type = /datum/reagent/consumable/ethanol/rum_coke - name = "Rum and Coke" - desc = "The classic go-to of space-fratboys." - icon_state = "whiskeycolaglass" - -/datum/reagent/consumable/ethanol/cuba_libre - name = "Cuba Libre" - description = "Viva la Revolucion! Viva Cuba Libre!" - color = "#3E1B00" // rgb: 62, 27, 0 - boozepwr = 50 - quality = DRINK_GOOD - taste_description = "a refreshing marriage of citrus and rum" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/cuba_libre - required_drink_type = /datum/reagent/consumable/ethanol/cuba_libre - name = "Cuba Libre" - desc = "A classic mix of rum, cola, and lime. A favorite of revolutionaries everywhere!" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "cubalibreglass" - -/datum/reagent/consumable/ethanol/cuba_libre/on_mob_life(mob/living/carbon/cubano, seconds_per_tick, times_fired) - if(cubano.mind && cubano.mind.has_antag_datum(/datum/antagonist/rev)) //Cuba Libre, the traditional drink of revolutions! Heals revolutionaries. - cubano.adjustBruteLoss(-1 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - cubano.adjustFireLoss(-1 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - cubano.adjustToxLoss(-1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - cubano.adjustOxyLoss(-5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - . = TRUE - return ..() || . - -/datum/reagent/consumable/ethanol/whiskey_cola - name = "Whiskey Cola" - description = "Whiskey, mixed with cola. Surprisingly refreshing." - color = "#3E1B00" // rgb: 62, 27, 0 - boozepwr = 70 - quality = DRINK_NICE - taste_description = "cola" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/whiskey_cola - required_drink_type = /datum/reagent/consumable/ethanol/whiskey_cola - name = "whiskey cola" - desc = "An innocent-looking mixture of cola and whiskey. Delicious." - icon_state = "whiskeycolaglass" - -/datum/reagent/consumable/ethanol/martini - name = "Classic Martini" - description = "Vermouth with Gin. Not quite how 007 enjoyed it, but still delicious." - color = "#cddbac" // rgb: 205,219,172 - boozepwr = 60 - quality = DRINK_NICE - taste_description = "dry class" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_EASY - -/datum/glass_style/drinking_glass/martini - required_drink_type = /datum/reagent/consumable/ethanol/martini - name = "Classic Martini" - desc = "Damn, the bartender even stirred it, not shook it." - icon_state = "martiniglass" - -/datum/reagent/consumable/ethanol/vodkamartini - name = "Vodka Martini" - description = "Vodka with Gin. Not quite how 007 enjoyed it, but still delicious." - color = "#cddcad" // rgb: 205,220,173 - boozepwr = 65 - quality = DRINK_NICE - taste_description = "shaken, not stirred" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/vodkamartini - required_drink_type = /datum/reagent/consumable/ethanol/vodkamartini - name = "Vodka martini" - desc = "A bastardisation of the classic martini. Still great." - icon_state = "martiniglass" - -/datum/reagent/consumable/ethanol/white_russian - name = "White Russian" - description = "That's just, like, your opinion, man..." - color = "#A68340" // rgb: 166, 131, 64 - boozepwr = 50 - quality = DRINK_GOOD - taste_description = "bitter cream" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/white_russian - required_drink_type = /datum/reagent/consumable/ethanol/white_russian - name = "White Russian" - desc = "A very nice looking drink. But that's just, like, your opinion, man." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "whiterussianglass" - -/datum/reagent/consumable/ethanol/screwdrivercocktail - name = "Screwdriver" - description = "Vodka, mixed with plain ol' orange juice. The result is surprisingly delicious." - color = "#A68310" // rgb: 166, 131, 16 - boozepwr = 55 - quality = DRINK_NICE - taste_description = "oranges" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/screwdrivercocktail - required_drink_type = /datum/reagent/consumable/ethanol/screwdrivercocktail - name = "Screwdriver" - desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "screwdriverglass" - -/datum/reagent/consumable/ethanol/screwdrivercocktail/on_transfer(atom/atom, methods = TOUCH, trans_volume) - if(!(methods & INGEST)) - return ..() - - if(src == atom.reagents.get_master_reagent() && istype(atom, /obj/item/reagent_containers/cup/glass/drinkingglass)) - var/obj/item/reagent_containers/cup/glass/drinkingglass/drink = atom - drink.tool_behaviour = TOOL_SCREWDRIVER - var/list/reagent_change_signals = list( - COMSIG_REAGENTS_ADD_REAGENT, - COMSIG_REAGENTS_NEW_REAGENT, - COMSIG_REAGENTS_REM_REAGENT, - COMSIG_REAGENTS_DEL_REAGENT, - COMSIG_REAGENTS_CLEAR_REAGENTS, - COMSIG_REAGENTS_REACTED, - ) - RegisterSignals(drink.reagents, reagent_change_signals, PROC_REF(on_reagent_change)) - - return ..() - -/datum/reagent/consumable/ethanol/screwdrivercocktail/proc/on_reagent_change(datum/reagents/reagents) - SIGNAL_HANDLER - if(src != reagents.get_master_reagent()) - var/obj/item/reagent_containers/cup/glass/drinkingglass/drink = reagents.my_atom - drink.tool_behaviour = initial(drink.tool_behaviour) - 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, - )) - -/datum/reagent/consumable/ethanol/screwdrivercocktail/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(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 * seconds_per_tick, required_biotype = affected_biotype) - - 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/booger - name = "Booger" - description = "Ewww..." - color = "#8CFF8C" // rgb: 140, 255, 140 - boozepwr = 45 - taste_description = "sweet 'n creamy" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/booger - required_drink_type = /datum/reagent/consumable/ethanol/booger - name = "Booger" - desc = "Ewww..." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "booger" - -/datum/reagent/consumable/ethanol/bloody_mary - name = "Bloody Mary" - description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice." - color = "#bf707c" // rgb: 191,112,124 - boozepwr = 55 - quality = DRINK_GOOD - taste_description = "tomatoes with a hint of lime and liquid murder" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/bloody_mary - required_drink_type = /datum/reagent/consumable/ethanol/bloody_mary - name = "Bloody Mary" - desc = "Tomato juice, mixed with Vodka and a li'l bit of lime. Tastes like liquid murder." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "bloodymaryglass" - -/datum/reagent/consumable/ethanol/bloody_mary/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - if(drinker.blood_volume < BLOOD_VOLUME_NORMAL) - drinker.blood_volume = min(drinker.blood_volume + (3 * REM * seconds_per_tick), 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" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_EASY - var/tough_text - -/datum/glass_style/drinking_glass/brave_bull - required_drink_type = /datum/reagent/consumable/ethanol/brave_bull - name = "Brave Bull" - desc = "Tequila and Coffee liqueur, brought together in a mouthwatering mixture. Drink up." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "bravebullglass" - -/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 - ADD_TRAIT(drinker, TRAIT_FEARLESS, type) - -/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 - REMOVE_TRAIT(drinker, TRAIT_FEARLESS, type) - -/datum/reagent/consumable/ethanol/tequila_sunrise - name = "Tequila Sunrise" - description = "Tequila, Grenadine, and Orange Juice." - color = "#FFE48C" // rgb: 255, 228, 140 - boozepwr = 45 - quality = DRINK_GOOD - taste_description = "oranges with a hint of pomegranate" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_MEDIUM - var/obj/effect/light_holder - -/datum/glass_style/drinking_glass/tequila_sunrise - required_drink_type = /datum/reagent/consumable/ethanol/tequila_sunrise - name = "tequila Sunrise" - desc = "Oh great, now you feel nostalgic about sunrises back on Terra..." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "tequilasunriseglass" - -/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(3, 0.7, "#FFCC00") //Tequila Sunrise makes you radiate dim light, like a sunrise! - -/datum/reagent/consumable/ethanol/tequila_sunrise/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, 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/toxins_special - name = "Toxins Special" - description = "This thing is ON FIRE! CALL THE DAMN SHUTTLE!" - color = "#8880a8" // rgb: 136,128,168 - boozepwr = 25 - quality = DRINK_VERYGOOD - taste_description = "spicy toxins" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/shot_glass/toxins_special - required_drink_type = /datum/reagent/consumable/ethanol/toxins_special - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "toxinsspecialglass" - -/datum/glass_style/drinking_glass/toxins_special - required_drink_type = /datum/reagent/consumable/ethanol/toxins_special - name = "Toxins Special" - desc = "Whoah, this thing is on FIRE!" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "toxinsspecialglass" - -/datum/reagent/consumable/ethanol/toxins_special/on_mob_life(mob/living/drinker, seconds_per_tick, times_fired) - drinker.adjust_bodytemperature(15 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, drinker.get_body_temp_normal() + 20) //310.15 is the normal bodytemp. - return ..() - -/datum/reagent/consumable/ethanol/beepsky_smash - name = "Beepsky Smash" - description = "Drink this and prepare for the LAW." - 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 - taste_description = "JUSTICE" - overdose_threshold = 40 - ph = 2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - var/datum/brain_trauma/special/beepsky/beepsky_hallucination - -/datum/glass_style/drinking_glass/beepsky_smash - required_drink_type = /datum/reagent/consumable/ethanol/beepsky_smash - name = "Beepsky Smash" - desc = "Heavy, hot and strong. Just like the Iron fist of the LAW." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "beepskysmashglass" - -/datum/reagent/consumable/ethanol/beepsky_smash/on_mob_metabolize(mob/living/carbon/drinker) - if(HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) - metabolization_rate = 0.8 - // if you don't have a liver, or your liver isn't an officer's liver - var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) - if(!liver || !HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) - beepsky_hallucination = new() - drinker.gain_trauma(beepsky_hallucination, TRAUMA_RESILIENCE_ABSOLUTE) - ..() - -/datum/reagent/consumable/ethanol/beepsky_smash/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - drinker.set_jitter_if_lower(4 SECONDS) - var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(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)) - . = TRUE - drinker.adjustStaminaLoss(-10 * REM * seconds_per_tick, required_biotype = affected_biotype) - if(SPT_PROB(10, seconds_per_tick)) - drinker.cause_hallucination(get_random_valid_hallucination_subtype(/datum/hallucination/nearby_fake_item), name) - if(SPT_PROB(5, seconds_per_tick)) - drinker.cause_hallucination(/datum/hallucination/stray_bullet, name) - - ..() - -/datum/reagent/consumable/ethanol/beepsky_smash/on_mob_end_metabolize(mob/living/carbon/drinker) - if(beepsky_hallucination) - QDEL_NULL(beepsky_hallucination) - return ..() - -/datum/reagent/consumable/ethanol/beepsky_smash/overdose_start(mob/living/carbon/drinker) - var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(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) - -/datum/reagent/consumable/ethanol/irish_cream - name = "Irish Cream" - description = "Whiskey-imbued cream, what else would you expect from the Irish?" - color = "#e3d0b2" // rgb: 227,208,178 - boozepwr = 50 - quality = DRINK_NICE - taste_description = "creamy alcohol" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/irish_cream - required_drink_type = /datum/reagent/consumable/ethanol/irish_cream - name = "Irish Cream" - desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?" - icon_state = "irishcreamglass" - -/datum/reagent/consumable/ethanol/manly_dorf - name = "The Manly Dorf" - description = "Beer and Ale, brought together in a delicious mix. Intended for true men only." - color = "#815336" // rgb: 129,83,54 - boozepwr = 100 //For the manly only - quality = DRINK_NICE - taste_description = "hair on your chest and your chin" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - var/dorf_mode = FALSE - -/datum/glass_style/drinking_glass/manly_dorf - required_drink_type = /datum/reagent/consumable/ethanol/manly_dorf - name = "The Manly Dorf" - desc = "A manly concoction made from Ale and Beer. Intended for true men only." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "manlydorfglass" - -/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, seconds_per_tick, times_fired) - if(dorf_mode) - dwarf.adjustBruteLoss(-2 * REM * seconds_per_tick, required_bodytype = affected_bodytype) - dwarf.adjustFireLoss(-2 * REM * seconds_per_tick, required_bodytype = affected_bodytype) - return ..() - -/datum/reagent/consumable/ethanol/longislandicedtea - name = "Long Island Iced Tea" - description = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." - color = "#ff6633" // rgb: 255,102,51 - boozepwr = 35 - quality = DRINK_VERYGOOD - taste_description = "a mixture of cola and alcohol" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/longislandicedtea - required_drink_type = /datum/reagent/consumable/ethanol/longislandicedtea - name = "Long Island Iced Tea" - desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "longislandicedteaglass" - -/datum/reagent/consumable/ethanol/moonshine - name = "Moonshine" - description = "You've really hit rock bottom now... your liver packed its bags and left last night." - color = "#AAAAAA77" // rgb: 170, 170, 170, 77 (alpha) (like water) - boozepwr = 95 - taste_description = "bitterness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/moonshine - required_drink_type = /datum/reagent/consumable/ethanol/moonshine - name = "Moonshine" - desc = "You've really hit rock bottom now... your liver packed its bags and left last night." - icon_state = "glass_clear" - -/datum/reagent/consumable/ethanol/b52 - name = "B-52" - description = "Coffee, Irish Cream, and cognac. You will get bombed." - color = "#8f1733" // rgb: 143,23,51 - boozepwr = 85 - quality = DRINK_GOOD - taste_description = "angry and irish" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_EASY - -/datum/glass_style/shot_glass/b52 - required_drink_type = /datum/reagent/consumable/ethanol/b52 - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "b52glass" - -/datum/glass_style/drinking_glass/b52 - required_drink_type = /datum/reagent/consumable/ethanol/b52 - name = "B-52" - desc = "Kahlua, Irish Cream, and cognac. You will get bombed." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "b52glass" - -/datum/reagent/consumable/ethanol/b52/on_mob_metabolize(mob/living/drinker) - playsound(drinker, 'sound/effects/explosion_distant.ogg', 100, FALSE) - -/datum/reagent/consumable/ethanol/irishcoffee - name = "Irish Coffee" - description = "Coffee, and alcohol. More fun than a Mimosa to drink in the morning." - color = "#874010" // rgb: 135,64,16 - boozepwr = 35 - quality = DRINK_NICE - taste_description = "giving up on the day" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/irishcoffee - required_drink_type = /datum/reagent/consumable/ethanol/irishcoffee - name = "Irish Coffee" - desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning." - icon = 'icons/obj/drinks/coffee.dmi' - icon_state = "irishcoffeeglass" - -/datum/reagent/consumable/ethanol/margarita - name = "Margarita" - description = "On the rocks with salt on the rim. Arriba~!" - color = "#8CFF8C" // rgb: 140, 255, 140 - boozepwr = 35 - quality = DRINK_NICE - taste_description = "dry and salty" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_MEDIUM - -/datum/glass_style/drinking_glass/margarita - required_drink_type = /datum/reagent/consumable/ethanol/margarita - name = "Margarita" - desc = "On the rocks with salt on the rim. Arriba~!" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "margaritaglass" - -/datum/reagent/consumable/ethanol/black_russian - name = "Black Russian" - description = "For the lactose-intolerant. Still as classy as a White Russian." - color = "#360000" // rgb: 54, 0, 0 - boozepwr = 70 - quality = DRINK_NICE - taste_description = "bitterness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/black_russian - required_drink_type = /datum/reagent/consumable/ethanol/black_russian - name = "Black Russian" - desc = "For the lactose-intolerant. Still as classy as a White Russian." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "blackrussianglass" - -/datum/reagent/consumable/ethanol/manhattan - name = "Manhattan" - description = "The Detective's undercover drink of choice. He never could stomach gin..." - color = "#ff3300" // rgb: 255,51,0 - boozepwr = 30 - quality = DRINK_NICE - taste_description = "mild dryness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_EASY - -/datum/glass_style/drinking_glass/manhattan - required_drink_type = /datum/reagent/consumable/ethanol/manhattan - name = "Manhattan" - desc = "The Detective's undercover drink of choice. He never could stomach gin..." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "manhattanglass" - -/datum/reagent/consumable/ethanol/manhattan_proj - name = "Manhattan Project" - description = "A scientist's drink of choice, for pondering ways to blow up the station." - color = COLOR_MOSTLY_PURE_RED - boozepwr = 45 - quality = DRINK_VERYGOOD - taste_description = "death, the destroyer of worlds" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/manhattan_proj - required_drink_type = /datum/reagent/consumable/ethanol/manhattan_proj - name = "Manhattan Project" - desc = "A scientist's drink of choice, for thinking how to blow up the station." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "proj_manhattanglass" - -/datum/reagent/consumable/ethanol/manhattan_proj/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - drinker.set_drugginess(1 MINUTES * REM * seconds_per_tick) - return ..() - -/datum/reagent/consumable/ethanol/whiskeysoda - name = "Whiskey Soda" - description = "For the more refined griffon." - color = "#ffcc33" // rgb: 255,204,51 - boozepwr = 70 - quality = DRINK_NICE - taste_description = "soda" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/whiskeysoda - required_drink_type = /datum/reagent/consumable/ethanol/whiskeysoda - name = "whiskey soda" - desc = "Ultimate refreshment." - icon_state = "whiskeysodaglass2" - -/datum/reagent/consumable/ethanol/antifreeze - name = "Anti-freeze" - description = "The ultimate refreshment. Not what it sounds like." - color = "#30f0f8" // rgb: 48,240,248 - boozepwr = 35 - quality = DRINK_NICE - taste_description = "Jack Frost's piss" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/antifreeze - required_drink_type = /datum/reagent/consumable/ethanol/antifreeze - name = "Anti-freeze" - desc = "The ultimate refreshment." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "antifreeze" - -/datum/reagent/consumable/ethanol/antifreeze/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - drinker.adjust_bodytemperature(20 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, drinker.get_body_temp_normal() + 20) //310.15 is the normal bodytemp. - return ..() - -/datum/reagent/consumable/ethanol/barefoot - name = "Barefoot" - description = "Barefoot and pregnant." - color = "#fc5acc" // rgb: 252,90,204 - boozepwr = 45 - quality = DRINK_VERYGOOD - taste_description = "creamy berries" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/barefoot - required_drink_type = /datum/reagent/consumable/ethanol/barefoot - name = "Barefoot" - desc = "Barefoot and pregnant." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "b&p" - -/datum/reagent/consumable/ethanol/barefoot/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, 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 * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - . = TRUE - return ..() || . - -/datum/reagent/consumable/ethanol/snowwhite - name = "Snow White" - description = "A cold refreshment." - color = "#FFFFFF" // rgb: 255, 255, 255 - boozepwr = 35 - quality = DRINK_NICE - taste_description = "refreshing cold" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/snowwhite - required_drink_type = /datum/reagent/consumable/ethanol/snowwhite - name = "Snow White" - desc = "A cold refreshment." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "snowwhite" - -/datum/reagent/consumable/ethanol/demonsblood - name = "Demon's Blood" - description = "AHHHH!!!!" - color = "#820000" // rgb: 130, 0, 0 - boozepwr = 75 - quality = DRINK_VERYGOOD - taste_description = "sweet tasting iron" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/demonsblood - required_drink_type = /datum/reagent/consumable/ethanol/demonsblood - name = "Demons Blood" - desc = "Just looking at this thing makes the hair at the back of your neck stand up." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "demonsblood" - -/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) - -/// Prevents the imbiber from being dragged into a pool of blood by a slaughter demon. -/datum/reagent/consumable/ethanol/demonsblood/proc/pre_bloodcrawl_consumed( - mob/living/source, - datum/action/cooldown/spell/jaunt/bloodcrawl/crawl, - mob/living/jaunter, - obj/effect/decal/cleanable/blood, -) - - SIGNAL_HANDLER - - var/turf/jaunt_turf = get_turf(jaunter) - jaunt_turf.visible_message( - span_warning("Something prevents [source] from entering [blood]!"), - blind_message = span_notice("You hear a splash and a thud.") - ) - to_chat(jaunter, span_warning("A strange force is blocking [source] from entering!")) - - return COMPONENT_STOP_CONSUMPTION - -/datum/reagent/consumable/ethanol/devilskiss - name = "Devil's Kiss" - description = "Creepy time!" - color = "#A68310" // rgb: 166, 131, 16 - boozepwr = 70 - quality = DRINK_VERYGOOD - taste_description = "bitter iron" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/devilskiss - required_drink_type = /datum/reagent/consumable/ethanol/devilskiss - name = "Devils Kiss" - desc = "Creepy time!" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "devilskiss" - -/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) - -/// If eaten by a slaughter demon, the demon will regret it. -/datum/reagent/consumable/ethanol/devilskiss/proc/on_bloodcrawl_consumed( - mob/living/source, - datum/action/cooldown/spell/jaunt/bloodcrawl/crawl, - mob/living/jaunter, -) - - SIGNAL_HANDLER - - . = COMPONENT_STOP_CONSUMPTION - - to_chat(jaunter, span_boldwarning("AAH! THEIR FLESH! IT BURNS!")) - jaunter.apply_damage(25, BRUTE, wound_bonus = CANT_WOUND) - - for(var/obj/effect/decal/cleanable/nearby_blood in range(1, get_turf(source))) - if(!nearby_blood.can_bloodcrawl_in()) - continue - source.forceMove(get_turf(nearby_blood)) - source.visible_message(span_warning("[nearby_blood] violently expels [source]!")) - crawl.exit_blood_effect(source) - return - - // Fuck it, just eject them, thanks to some split second cleaning - source.forceMove(get_turf(source)) - source.visible_message(span_warning("[source] appears from nowhere, covered in blood!")) - crawl.exit_blood_effect(source) - -/datum/reagent/consumable/ethanol/vodkatonic - name = "Vodka and Tonic" - description = "For when a gin and tonic isn't Russian enough." - color = "#0064C8" // rgb: 0, 100, 200 - boozepwr = 70 - quality = DRINK_NICE - taste_description = "tart bitterness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/vodkatonic - required_drink_type = /datum/reagent/consumable/ethanol/vodkatonic - name = "vodka and tonic" - desc = "For when a gin and tonic isn't Russian enough." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "vodkatonicglass" - -/datum/reagent/consumable/ethanol/ginfizz - name = "Gin Fizz" - description = "Refreshingly lemony, deliciously dry." - color = "#ffffcc" // rgb: 255,255,204 - boozepwr = 45 - quality = DRINK_GOOD - taste_description = "dry, tart lemons" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/ginfizz - required_drink_type = /datum/reagent/consumable/ethanol/ginfizz - name = "gin fizz" - desc = "Refreshingly lemony, deliciously dry." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "ginfizzglass" - -/datum/reagent/consumable/ethanol/bahama_mama - name = "Bahama Mama" - description = "A tropical cocktail with a complex blend of flavors." - color = "#FF7F3B" // rgb: 255, 127, 59 - boozepwr = 35 - quality = DRINK_GOOD - taste_description = "pineapple, coconut, and a hint of coffee" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/bahama_mama - required_drink_type = /datum/reagent/consumable/ethanol/bahama_mama - name = "Bahama Mama" - desc = "A tropical cocktail with a complex blend of flavors." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "bahama_mama" - -/datum/reagent/consumable/ethanol/singulo - name = "Singulo" - description = "A blue-space beverage!" - color = "#2E6671" // rgb: 46, 102, 113 - boozepwr = 35 - quality = DRINK_VERYGOOD - taste_description = "concentrated matter" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - var/static/list/ray_filter = list(type = "rays", size = 40, density = 15, color = SUPERMATTER_SINGULARITY_RAYS_COLOUR, factor = 15) - -/datum/reagent/consumable/ethanol/singulo/on_mob_metabolize(mob/living/drinker) - ADD_TRAIT(drinker, TRAIT_MADNESS_IMMUNE, type) - -/datum/reagent/consumable/ethanol/singulo/on_mob_end_metabolize(mob/living/drinker) - REMOVE_TRAIT(drinker, TRAIT_MADNESS_IMMUNE, type) - drinker.remove_filter("singulo_rays") - -/datum/reagent/consumable/ethanol/singulo/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - if(SPT_PROB(2.5, seconds_per_tick)) - // 20u = 1x1, 45u = 2x2, 80u = 3x3 - var/volume_to_radius = FLOOR(sqrt(volume/5), 1) - 1 - var/suck_range = clamp(volume_to_radius, 0, 3) - - if(!suck_range) - return ..() - - var/turf/gravity_well_turf = get_turf(drinker) - goonchem_vortex(gravity_well_turf, 0, suck_range) - playsound(get_turf(drinker), 'sound/effects/supermatter.ogg', 150, TRUE) - drinker.add_filter("singulo_rays", 1, ray_filter) - animate(drinker.get_filter("singulo_rays"), offset = 10, time = 1.5 SECONDS, loop = -1) - addtimer(CALLBACK(drinker, TYPE_PROC_REF(/datum, remove_filter), "singulo_rays"), 1.5 SECONDS) - drinker.emote("burp") - return ..() - -/datum/glass_style/drinking_glass/singulo - required_drink_type = /datum/reagent/consumable/ethanol/singulo - name = "Singulo" - desc = "A blue-space beverage." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "singulo" - -/datum/reagent/consumable/ethanol/sbiten - name = "Sbiten" - description = "A spicy Vodka! Might be a little hot for the little guys!" - color = "#d8d5ae" // rgb: 216,213,174 - boozepwr = 70 - quality = DRINK_GOOD - taste_description = "hot and spice" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/consumable/ethanol/sbiten/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - drinker.adjust_bodytemperature(50 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, BODYTEMP_HEAT_DAMAGE_LIMIT) //310.15 is the normal bodytemp. - return ..() - -/datum/glass_style/drinking_glass/sbiten - required_drink_type = /datum/reagent/consumable/ethanol/sbiten - name = "Sbiten" - desc = "A spicy mix of Vodka and Spice. Very hot." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "sbitenglass" - -/datum/reagent/consumable/ethanol/red_mead - name = "Red Mead" - description = "The true Viking drink! Even though it has a strange red color." - color = "#C73C00" // rgb: 199, 60, 0 - boozepwr = 31 //Red drinks are stronger - quality = DRINK_GOOD - taste_description = "sweet and salty alcohol" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/red_mead - required_drink_type = /datum/reagent/consumable/ethanol/red_mead - name = "Red Mead" - desc = "A true Viking's beverage, made with the blood of their enemies." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "red_meadglass" - -/datum/reagent/consumable/ethanol/mead - name = "Mead" - description = "A Viking drink, though a cheap one." - color = "#e0c058" // rgb: 224,192,88 - nutriment_factor = 1 * REAGENTS_METABOLISM - boozepwr = 30 - quality = DRINK_NICE - taste_description = "sweet, sweet alcohol" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/mead - required_drink_type = /datum/reagent/consumable/ethanol/mead - name = "Mead" - desc = "A drink from Valhalla." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "meadglass" - -/datum/reagent/consumable/ethanol/iced_beer - name = "Iced Beer" - description = "A beer which is so cold the air around it freezes." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 15 - taste_description = "refreshingly cold" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/iced_beer - required_drink_type = /datum/reagent/consumable/ethanol/iced_beer - name = "iced beer" - desc = "A beer so frosty, the air around it freezes." - icon_state = "iced_beerglass" - -/datum/reagent/consumable/ethanol/iced_beer/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - drinker.adjust_bodytemperature(-20 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, T0C) //310.15 is the normal bodytemp. - return ..() - -/datum/reagent/consumable/ethanol/grog - name = "Grog" - description = "Watered-down rum, Nanotrasen approves!" - color = "#e0e058" // rgb: 224,224,88 - boozepwr = 1 //Basically nothing - taste_description = "a poor excuse for alcohol" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/grog - required_drink_type = /datum/reagent/consumable/ethanol/grog - name = "Grog" - desc = "A fine and cepa drink for Space." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "grogglass" - -/datum/reagent/consumable/ethanol/aloe - name = "Aloe" - description = "So very, very, very good." - color = "#f8f800" // rgb: 248,248,0 - boozepwr = 35 - quality = DRINK_VERYGOOD - taste_description = "sweet 'n creamy" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - //somewhat annoying mix - glass_price = DRINK_PRICE_MEDIUM - -/datum/glass_style/drinking_glass/aloe - required_drink_type = /datum/reagent/consumable/ethanol/aloe - name = "Aloe" - desc = "Very, very, very good." - icon_state = "aloe" - -/datum/reagent/consumable/ethanol/andalusia - name = "Andalusia" - description = "A nice, strangely named drink." - color = "#c8f860" // rgb: 200,248,96 - boozepwr = 40 - quality = DRINK_GOOD - taste_description = "lemons" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/andalusia - required_drink_type = /datum/reagent/consumable/ethanol/andalusia - name = "Andalusia" - desc = "A nice, strangely named drink." - icon_state = "andalusia" - -/datum/reagent/consumable/ethanol/alliescocktail - name = "Allies Cocktail" - description = "A drink made from your allies. Not as sweet as those made from your enemies." - color = "#60f8f8" // rgb: 96,248,248 - boozepwr = 45 - quality = DRINK_NICE - taste_description = "bitter yet free" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_EASY - -/datum/glass_style/drinking_glass/alliescocktail - required_drink_type = /datum/reagent/consumable/ethanol/alliescocktail - name = "Allies cocktail" - desc = "A drink made from your allies." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "alliescocktail" - -/datum/reagent/consumable/ethanol/acid_spit - name = "Acid Spit" - description = "A drink for the daring, can be deadly if incorrectly prepared!" - color = "#365000" // rgb: 54, 80, 0 - boozepwr = 70 - quality = DRINK_VERYGOOD - taste_description = "stomach acid" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/acid_spit - required_drink_type = /datum/reagent/consumable/ethanol/acid_spit - name = "Acid Spit" - desc = "A drink from Nanotrasen. Made from live aliens." - icon_state = "acidspitglass" - -/datum/reagent/consumable/ethanol/amasec - name = "Amasec" - description = "Official drink of the Nanotrasen Gun-Club!" - color = "#e0e058" // rgb: 224,224,88 - boozepwr = 35 - quality = DRINK_GOOD - taste_description = "dark and metallic" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/amasec - required_drink_type = /datum/reagent/consumable/ethanol/amasec - name = "Amasec" - desc = "Always handy before COMBAT!!!" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "amasecglass" - -/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" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/changelingsting - required_drink_type = /datum/reagent/consumable/ethanol/changelingsting - name = "Changeling Sting" - desc = "A stingy drink." - icon = 'icons/obj/drinks/soda.dmi' - icon_state = "changelingsting" - -/datum/reagent/consumable/ethanol/changelingsting/on_mob_life(mob/living/carbon/target, seconds_per_tick, times_fired) - var/datum/antagonist/changeling/changeling = target.mind?.has_antag_datum(/datum/antagonist/changeling) - changeling?.adjust_chemicals(metabolization_rate * REM * seconds_per_tick) - return ..() - -/datum/reagent/consumable/ethanol/irishcarbomb - name = "Irish Car Bomb" - description = "Mmm, tastes like the free Irish state." - color = "#2E6671" // rgb: 46, 102, 113 - boozepwr = 25 - quality = DRINK_GOOD - taste_description = "the spirit of Ireland" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/irishcarbomb - required_drink_type = /datum/reagent/consumable/ethanol/irishcarbomb - name = "Irish Car Bomb" - desc = "An Irish car bomb." - icon_state = "irishcarbomb" - -/datum/reagent/consumable/ethanol/syndicatebomb - name = "Syndicate Bomb" - description = "Tastes like terrorism!" - color = "#2E6671" // rgb: 46, 102, 113 - boozepwr = 90 - quality = DRINK_GOOD - taste_description = "purified antagonism" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/syndicatebomb - required_drink_type = /datum/reagent/consumable/ethanol/syndicatebomb - name = "Syndicate Bomb" - desc = "A syndicate bomb." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "syndicatebomb" - -/datum/reagent/consumable/ethanol/syndicatebomb/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - if(SPT_PROB(2.5, seconds_per_tick)) - playsound(get_turf(drinker), 'sound/effects/explosionfar.ogg', 100, TRUE) - return ..() - -/datum/reagent/consumable/ethanol/hiveminderaser - name = "Hivemind Eraser" - description = "A vessel of pure flavor." - color = "#FF80FC" // rgb: 255, 128, 252 - boozepwr = 40 - quality = DRINK_GOOD - taste_description = "psychic links" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/hiveminderaser - required_drink_type = /datum/reagent/consumable/ethanol/hiveminderaser - name = "Hivemind Eraser" - desc = "For when even mindshields can't save you." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "hiveminderaser" - -/datum/reagent/consumable/ethanol/erikasurprise - name = "Erika Surprise" - description = "The surprise is, it's green!" - color = "#2E6671" // rgb: 46, 102, 113 - boozepwr = 35 - quality = DRINK_VERYGOOD - taste_description = "tartness and bananas" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/erikasurprise - required_drink_type = /datum/reagent/consumable/ethanol/erikasurprise - name = "Erika Surprise" - desc = "The surprise is, it's green!" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "erikasurprise" - -/datum/reagent/consumable/ethanol/driestmartini - name = "Driest Martini" - description = "Only for the experienced. You think you see sand floating in the glass." - nutriment_factor = 1 * REAGENTS_METABOLISM - color = "#2E6671" // rgb: 46, 102, 113 - boozepwr = 65 - quality = DRINK_GOOD - taste_description = "a beach" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/driestmartini - required_drink_type = /datum/reagent/consumable/ethanol/driestmartini - name = "Driest Martini" - desc = "Only for the experienced. You think you see sand floating in the glass." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "driestmartiniglass" - -/datum/reagent/consumable/ethanol/bananahonk - name = "Banana Honk" - description = "A drink from Clown Heaven." - nutriment_factor = 1 * REAGENTS_METABOLISM - color = "#FFFF91" // rgb: 255, 255, 140 - boozepwr = 60 - quality = DRINK_GOOD - taste_description = "a bad joke" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/bananahonk - required_drink_type = /datum/reagent/consumable/ethanol/bananahonk - name = "Banana Honk" - desc = "A drink from Clown Heaven." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "bananahonkglass" - -/datum/reagent/consumable/ethanol/bananahonk/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) - if((liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) || ismonkey(drinker)) - drinker.heal_bodypart_damage(1 * REM * seconds_per_tick, 1 * REM * seconds_per_tick) - . = TRUE - return ..() || . - -/datum/reagent/consumable/ethanol/silencer - name = "Silencer" - description = "A drink from Mime Heaven." - nutriment_factor = 2 * REAGENTS_METABOLISM - color = "#a8a8a8" // rgb: 168,168,168 - boozepwr = 59 //Proof that clowns are better than mimes right here - quality = DRINK_GOOD - taste_description = "a pencil eraser" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/silencer - required_drink_type = /datum/reagent/consumable/ethanol/silencer - name = "Silencer" - desc = "A drink from Mime Heaven." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "silencerglass" - -/datum/reagent/consumable/ethanol/silencer/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - if(ishuman(drinker) && HAS_TRAIT(drinker, TRAIT_MIMING)) - drinker.set_silence_if_lower(MIMEDRINK_SILENCE_DURATION) - drinker.heal_bodypart_damage(1 * REM * seconds_per_tick, 1 * REM * seconds_per_tick) - . = TRUE - return ..() || . - -/datum/reagent/consumable/ethanol/drunkenblumpkin - name = "Drunken Blumpkin" - description = "A weird mix of whiskey and blumpkin juice." - color = "#1EA0FF" // rgb: 30,160,255 - boozepwr = 50 - quality = DRINK_VERYGOOD - taste_description = "molasses and a mouthful of pool water" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/drunkenblumpkin - required_drink_type = /datum/reagent/consumable/ethanol/drunkenblumpkin - name = "Drunken Blumpkin" - desc = "A drink for the drunks." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "drunkenblumpkin" - -/datum/reagent/consumable/ethanol/whiskey_sour //Requested since we had whiskey cola and soda but not sour. - name = "Whiskey Sour" - description = "Lemon juice/whiskey/sugar mixture. Moderate alcohol content." - color = rgb(255, 201, 49) - boozepwr = 35 - quality = DRINK_GOOD - taste_description = "sour lemons" - -/datum/glass_style/drinking_glass/whiskey_sour - required_drink_type = /datum/reagent/consumable/ethanol/whiskey_sour - name = "whiskey sour" - desc = "Lemon juice mixed with whiskey and a dash of sugar. Surprisingly satisfying." - icon_state = "whiskey_sour" - -/datum/reagent/consumable/ethanol/hcider - name = "Hard Cider" - description = "Apple juice, for adults." - color = "#CD6839" - nutriment_factor = 1 * REAGENTS_METABOLISM - boozepwr = 25 - taste_description = "the season that falls between summer and winter" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_STOCK - -/datum/glass_style/shot_glass/hcider - required_drink_type = /datum/reagent/consumable/ethanol/hcider - icon_state = "shotglassbrown" - -/datum/glass_style/drinking_glass/hcider - required_drink_type = /datum/reagent/consumable/ethanol/hcider - name = "hard cider" - desc = "Tastes like autumn... no wait, fall!" - icon_state = "whiskeyglass" - -/datum/reagent/consumable/ethanol/fetching_fizz //A reference to one of my favorite games of all time. Pulls nearby ores to the imbiber! - name = "Fetching Fizz" - description = "Whiskey sour/iron/uranium mixture resulting in a highly magnetic slurry. Mild alcohol content." //Requires no alcohol to make but has alcohol anyway because ~magic~ - color = rgb(255, 91, 15) - boozepwr = 10 - quality = DRINK_VERYGOOD - metabolization_rate = 0.1 * REAGENTS_METABOLISM - taste_description = "charged metal" // the same as teslium, honk honk. - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/fetching_fizz - required_drink_type = /datum/reagent/consumable/ethanol/fetching_fizz - name = "Fetching Fizz" - desc = "Induces magnetism in the imbiber. Started as a barroom prank but evolved to become popular with miners and scrappers. Metallic aftertaste." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "fetching_fizz" - -/datum/reagent/consumable/ethanol/fetching_fizz/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - for(var/obj/item/stack/ore/O in orange(3, drinker)) - step_towards(O, get_turf(drinker)) - 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" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/hearty_punch - required_drink_type = /datum/reagent/consumable/ethanol/hearty_punch - name = "Hearty Punch" - desc = "Aromatic beverage served piping hot. According to folk tales it can almost wake the dead." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "hearty_punch" - -/datum/reagent/consumable/ethanol/hearty_punch/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - if(drinker.health <= 0) - drinker.adjustBruteLoss(-3 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - drinker.adjustFireLoss(-3 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - drinker.adjustCloneLoss(-5 * REM * seconds_per_tick, 0) - drinker.adjustOxyLoss(-4 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - drinker.adjustToxLoss(-3 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - . = 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." - color = rgb(51, 19, 3) //Sickly brown - boozepwr = 300 //I warned you - taste_description = "a wall of bricks" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/bacchus_blessing - required_drink_type = /datum/reagent/consumable/ethanol/bacchus_blessing - name = "Bacchus' Blessing" - desc = "You didn't think it was possible for a liquid to be so utterly revolting. Are you sure about this...?" - icon_state = "glass_brown2" - -/datum/reagent/consumable/ethanol/atomicbomb - name = "Atomic Bomb" - description = "Nuclear proliferation never tasted so good." - color = "#666300" // rgb: 102, 99, 0 - boozepwr = 0 //custom drunk effect - quality = DRINK_FANTASTIC - taste_description = "da bomb" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_HIGH - -/datum/glass_style/drinking_glass/atomicbomb - required_drink_type = /datum/reagent/consumable/ethanol/atomicbomb - name = "Atomic Bomb" - desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "atomicbombglass" - -/datum/reagent/consumable/ethanol/atomicbomb/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - drinker.set_drugginess(100 SECONDS * REM * seconds_per_tick) - if(!HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) - drinker.adjust_confusion(2 SECONDS * REM * seconds_per_tick) - drinker.set_dizzy_if_lower(20 SECONDS * REM * seconds_per_tick) - drinker.adjust_slurring(6 SECONDS * REM * seconds_per_tick) - switch(current_cycle) - if(51 to 200) - drinker.Sleeping(100 * REM * seconds_per_tick) - . = TRUE - if(201 to INFINITY) - drinker.AdjustSleeping(40 * REM * seconds_per_tick) - drinker.adjustToxLoss(2 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - . = TRUE - ..() - -/datum/reagent/consumable/ethanol/gargle_blaster - name = "Pan-Galactic Gargle Blaster" - description = "Whoah, this stuff looks volatile!" - color = "#9cc8b4" // rgb: 156,200,180 - boozepwr = 0 //custom drunk effect - quality = DRINK_GOOD - taste_description = "your brains smashed out by a lemon wrapped around a gold brick" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/gargle_blaster - required_drink_type = /datum/reagent/consumable/ethanol/gargle_blaster - name = "Pan-Galactic Gargle Blaster" - desc = "Like having your brain smashed out by a slice of lemon wrapped around a large gold brick." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "gargleblasterglass" - -/datum/reagent/consumable/ethanol/gargle_blaster/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - drinker.adjust_dizzy(3 SECONDS * REM * seconds_per_tick) - switch(current_cycle) - if(15 to 45) - drinker.adjust_slurring(3 SECONDS * REM * seconds_per_tick) - - if(45 to 55) - if(SPT_PROB(30, seconds_per_tick)) - drinker.adjust_confusion(3 SECONDS * REM * seconds_per_tick) - if(55 to 200) - drinker.set_drugginess(110 SECONDS * REM * seconds_per_tick) - if(200 to INFINITY) - drinker.adjustToxLoss(2 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - . = TRUE - ..() - -/datum/reagent/consumable/ethanol/neurotoxin - name = "Neurotoxin" - description = "A strong neurotoxin that puts the subject into a death-like state." - color = "#2E2E61" // rgb: 46, 46, 97 - boozepwr = 50 - quality = DRINK_VERYGOOD - taste_description = "a numbing sensation" - metabolization_rate = 1 * REAGENTS_METABOLISM - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/neurotoxin - required_drink_type = /datum/reagent/consumable/ethanol/neurotoxin - name = "Neurotoxin" - desc = "A drink that is guaranteed to knock you silly." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "neurotoxinglass" - -/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, seconds_per_tick, times_fired) - drinker.set_drugginess(100 SECONDS * REM * seconds_per_tick) - drinker.adjust_dizzy(4 SECONDS * REM * seconds_per_tick) - drinker.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1 * REM * seconds_per_tick, 150, required_organtype = affected_organtype) - if(SPT_PROB(10, seconds_per_tick)) - drinker.adjustStaminaLoss(10, required_biotype = affected_biotype) - drinker.drop_all_held_items() - to_chat(drinker, span_notice("You cant feel your hands!")) - if(current_cycle > 5) - if(SPT_PROB(10, seconds_per_tick)) - var/paralyzed_limb = pick_paralyzed_limb() - ADD_TRAIT(drinker, paralyzed_limb, type) - drinker.adjustStaminaLoss(10, required_biotype = affected_biotype) - if(current_cycle > 30) - drinker.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2 * REM * seconds_per_tick, required_organtype = affected_organtype) - if(current_cycle > 50 && SPT_PROB(7.5, seconds_per_tick)) - 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!")) - . = 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.adjustStaminaLoss(10, required_biotype = affected_biotype) - ..() - -/datum/reagent/consumable/ethanol/hippies_delight - name = "Hippie's Delight" - description = "You just don't get it maaaan." - color = "#b16e8b" // rgb: 177,110,139 - nutriment_factor = 0 - boozepwr = 0 //custom drunk effect - quality = DRINK_FANTASTIC - metabolization_rate = 0.2 * REAGENTS_METABOLISM - taste_description = "giving peace a chance" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/hippies_delight - required_drink_type = /datum/reagent/consumable/ethanol/hippies_delight - name = "Hippie's Delight" - desc = "A drink enjoyed by people during the 1960's." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "hippiesdelightglass" - -/datum/reagent/consumable/ethanol/hippies_delight/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - drinker.set_slurring_if_lower(1 SECONDS * REM * seconds_per_tick) - - switch(current_cycle) - if(1 to 5) - drinker.set_dizzy_if_lower(20 SECONDS * REM * seconds_per_tick) - drinker.set_drugginess(1 MINUTES * REM * seconds_per_tick) - if(SPT_PROB(5, seconds_per_tick)) - drinker.emote(pick("twitch","giggle")) - if(5 to 10) - drinker.set_jitter_if_lower(40 SECONDS * REM * seconds_per_tick) - drinker.set_dizzy_if_lower(40 SECONDS * REM * seconds_per_tick) - drinker.set_drugginess(1.5 MINUTES * REM * seconds_per_tick) - if(SPT_PROB(10, seconds_per_tick)) - drinker.emote(pick("twitch","giggle")) - if (10 to 200) - drinker.set_jitter_if_lower(80 SECONDS * REM * seconds_per_tick) - drinker.set_dizzy_if_lower(80 SECONDS * REM * seconds_per_tick) - drinker.set_drugginess(2 MINUTES * REM * seconds_per_tick) - if(SPT_PROB(16, seconds_per_tick)) - drinker.emote(pick("twitch","giggle")) - if(200 to INFINITY) - drinker.set_jitter_if_lower(120 SECONDS * REM * seconds_per_tick) - drinker.set_dizzy_if_lower(120 SECONDS * REM * seconds_per_tick) - drinker.set_drugginess(2.5 MINUTES * REM * seconds_per_tick) - if(SPT_PROB(23, seconds_per_tick)) - drinker.emote(pick("twitch","giggle")) - if(SPT_PROB(16, seconds_per_tick)) - drinker.adjustToxLoss(2, FALSE, required_biotype = affected_biotype) - . = TRUE - ..() - -/datum/reagent/consumable/ethanol/eggnog - name = "Eggnog" - description = "For enjoying the most wonderful time of the year." - color = "#fcfdc6" // rgb: 252, 253, 198 - nutriment_factor = 2 * REAGENTS_METABOLISM - boozepwr = 1 - quality = DRINK_VERYGOOD - taste_description = "custard and alcohol" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/has_foodtype/drinking_glass/eggnog - required_drink_type = /datum/reagent/consumable/ethanol/eggnog - name = "eggnog" - desc = "For enjoying the most wonderful time of the year." - icon_state = "glass_yellow" - drink_type = FRUIT - -/datum/glass_style/has_foodtype/juicebox/eggnog - required_drink_type = /datum/reagent/consumable/ethanol/eggnog - name = "carton of eggnog" - desc = "Tasty grape juice in a fun little container. Non-alcoholic!" - icon_state = "grapebox" - drink_type = FRUIT - -/datum/reagent/consumable/ethanol/narsour - name = "Nar'Sour" - description = "Side effects include self-mutilation and hoarding plasteel." - color = RUNE_COLOR_DARKRED - boozepwr = 10 - quality = DRINK_FANTASTIC - taste_description = "bloody" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/narsour - required_drink_type = /datum/reagent/consumable/ethanol/narsour - name = "Nar'Sour" - desc = "A new hit cocktail inspired by THE ARM Breweries will have you shouting Fuu ma'jin in no time!" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "narsour" - -/datum/reagent/consumable/ethanol/narsour/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - drinker.adjust_timed_status_effect(6 SECONDS * REM * seconds_per_tick, /datum/status_effect/speech/slurring/cult, max_duration = 6 SECONDS) - drinker.adjust_stutter_up_to(6 SECONDS * REM * seconds_per_tick, 6 SECONDS) - return ..() - -/datum/reagent/consumable/ethanol/triple_sec - name = "Triple Sec" - description = "A sweet and vibrant orange liqueur." - color = "#ffcc66" - boozepwr = 30 - taste_description = "a warm flowery orange taste which recalls the ocean air and summer wind of the caribbean" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/triple_sec - required_drink_type = /datum/reagent/consumable/ethanol/triple_sec - name = "Triple Sec" - desc = "A glass of straight Triple Sec." - icon_state = "glass_orange" - -/datum/reagent/consumable/ethanol/creme_de_menthe - name = "Creme de Menthe" - description = "A minty liqueur excellent for refreshing, cool drinks." - color = "#00cc00" - boozepwr = 20 - taste_description = "a minty, cool, and invigorating splash of cold streamwater" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/creme_de_menthe - required_drink_type = /datum/reagent/consumable/ethanol/creme_de_menthe - name = "Creme de Menthe" - desc = "You can almost feel the first breath of spring just looking at it." - icon_state = "glass_green" - -/datum/reagent/consumable/ethanol/creme_de_cacao - name = "Creme de Cacao" - description = "A chocolatey liqueur excellent for adding dessert notes to beverages and bribing sororities." - color = "#996633" - boozepwr = 20 - taste_description = "a slick and aromatic hint of chocolates swirling in a bite of alcohol" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/creme_de_cacao - required_drink_type = /datum/reagent/consumable/ethanol/creme_de_cacao - name = "Creme de Cacao" - desc = "A million hazing lawsuits and alcohol poisonings have started with this humble ingredient." - icon_state = "glass_brown" - -/datum/reagent/consumable/ethanol/creme_de_coconut - name = "Creme de Coconut" - description = "A coconut liqueur for smooth, creamy, tropical drinks." - color = "#F7F0D0" - boozepwr = 20 - taste_description = "a sweet milky flavor with notes of toasted sugar" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/creme_de_coconut - required_drink_type = /datum/reagent/consumable/ethanol/creme_de_coconut - name = "Creme de Coconut" - desc = "An unintimidating glass of coconut liqueur." - icon_state = "glass_white" - -/datum/reagent/consumable/ethanol/quadruple_sec - name = "Quadruple Sec" - description = "Kicks just as hard as licking the power cell on a baton, but tastier." - color = "#cc0000" - boozepwr = 35 - quality = DRINK_GOOD - taste_description = "an invigorating bitter freshness which suffuses your being; no enemy of the station will go unrobusted this day" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/quadruple_sec - required_drink_type = /datum/reagent/consumable/ethanol/quadruple_sec - name = "Quadruple Sec" - desc = "An intimidating and lawful beverage dares you to violate the law and make its day. Still can't drink it on duty, though." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "quadruple_sec" - -/datum/reagent/consumable/ethanol/quadruple_sec/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - //Securidrink in line with the Screwdriver for engineers or Nothing for mimes - var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) - if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) - drinker.heal_bodypart_damage(1 * REM * seconds_per_tick, 1 * REM * seconds_per_tick) - . = TRUE - return ..() - -/datum/reagent/consumable/ethanol/quintuple_sec - name = "Quintuple Sec" - description = "Law, Order, Alcohol, and Police Brutality distilled into one single elixir of JUSTICE." - color = "#ff3300" - boozepwr = 55 - quality = DRINK_FANTASTIC - taste_description = "THE LAW" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/quintuple_sec - required_drink_type = /datum/reagent/consumable/ethanol/quintuple_sec - name = "Quintuple Sec" - desc = "Now you are become law, destroyer of clowns." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "quintuple_sec" - -/datum/reagent/consumable/ethanol/quintuple_sec/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - //Securidrink in line with the Screwdriver for engineers or Nothing for mimes but STRONG.. - var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) - if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) - drinker.heal_bodypart_damage(2 * REM * seconds_per_tick, 2 * REM * seconds_per_tick) - drinker.adjustStaminaLoss(-2 * REM * seconds_per_tick, required_biotype = affected_biotype) - . = TRUE - return ..() - -/datum/reagent/consumable/ethanol/grasshopper - name = "Grasshopper" - description = "A fresh and sweet dessert shooter. Difficult to look manly while drinking this." - color = "#00ff00" - boozepwr = 25 - quality = DRINK_GOOD - taste_description = "chocolate and mint dancing around your mouth" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/grasshopper - required_drink_type = /datum/reagent/consumable/ethanol/grasshopper - name = "Grasshopper" - desc = "You weren't aware edible beverages could be that green." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "grasshopper" - -/datum/reagent/consumable/ethanol/stinger - name = "Stinger" - description = "A snappy way to end the day." - color = "#ccff99" - boozepwr = 25 - quality = DRINK_NICE - taste_description = "a slap on the face in the best possible way" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/stinger - required_drink_type = /datum/reagent/consumable/ethanol/stinger - name = "Stinger" - desc = "You wonder what would happen if you pointed this at a heat source..." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "stinger" - -/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 - ph = 4 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_HIGH - -/datum/glass_style/shot_glass/bastion_bourbon - required_drink_type = /datum/reagent/consumable/ethanol/bastion_bourbon - icon_state = "shotglassgreen" - -/datum/glass_style/drinking_glass/bastion_bourbon - required_drink_type = /datum/reagent/consumable/ethanol/bastion_bourbon - name = "Bastion Bourbon" - desc = "If you're feeling low, count on the buttery flavor of our own bastion bourbon." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "bastion_bourbon" - -/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, required_bodytype = affected_bodytype) - drinker.adjustFireLoss(-1, required_bodytype = affected_bodytype) - drinker.adjustToxLoss(-1, required_biotype = affected_biotype) - drinker.adjustOxyLoss(-1, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - drinker.adjustStaminaLoss(-1, required_biotype = affected_biotype) - 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, seconds_per_tick, times_fired) - if(drinker.health > 0) - drinker.adjustBruteLoss(-1 * REM * seconds_per_tick, required_bodytype = affected_bodytype) - drinker.adjustFireLoss(-1 * REM * seconds_per_tick, required_bodytype = affected_bodytype) - drinker.adjustToxLoss(-0.5 * REM * seconds_per_tick, required_biotype = affected_biotype) - drinker.adjustOxyLoss(-3 * REM * seconds_per_tick, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - drinker.adjustStaminaLoss(-5 * REM * seconds_per_tick, required_biotype = affected_biotype) - . = TRUE - ..() - -/datum/reagent/consumable/ethanol/squirt_cider - name = "Squirt Cider" - description = "Fermented squirt extract with a nose of stale bread and ocean water. Whatever a squirt is." - color = "#FF0000" - boozepwr = 40 - taste_description = "stale bread with a staler aftertaste" - nutriment_factor = 2 * REAGENTS_METABOLISM - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/shot_glass/squirt_cider - required_drink_type = /datum/reagent/consumable/ethanol/squirt_cider - icon_state = "shotglassgreen" - -/datum/glass_style/drinking_glass/squirt_cider - required_drink_type = /datum/reagent/consumable/ethanol/squirt_cider - name = "Squirt Cider" - desc = "Squirt cider will toughen you right up. Too bad about the musty aftertaste." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "squirt_cider" - -/datum/reagent/consumable/ethanol/squirt_cider/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - drinker.satiety += 5 * REM * seconds_per_tick //for context, vitamins give 15 satiety per second - ..() - . = TRUE - -/datum/reagent/consumable/ethanol/fringe_weaver - name = "Fringe Weaver" - description = "Bubbly, classy, and undoubtedly strong - a Glitch City classic." - color = "#FFEAC4" - boozepwr = 90 //classy hooch, essentially, but lower pwr to make up for slightly easier access - quality = DRINK_GOOD - taste_description = "ethylic alcohol with a hint of sugar" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/fringe_weaver - required_drink_type = /datum/reagent/consumable/ethanol/fringe_weaver - name = "Fringe Weaver" - desc = "It's a wonder it doesn't spill out of the glass." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "fringe_weaver" - -/datum/reagent/consumable/ethanol/sugar_rush - name = "Sugar Rush" - description = "Sweet, light, and fruity - as girly as it gets." - color = "#FF226C" - boozepwr = 10 - quality = DRINK_GOOD - taste_description = "your arteries clogging with sugar" - nutriment_factor = 2 * REAGENTS_METABOLISM - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/sugar_rush - required_drink_type = /datum/reagent/consumable/ethanol/sugar_rush - name = "Sugar Rush" - desc = "If you can't mix a Sugar Rush, you can't tend bar." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "sugar_rush" - -/datum/reagent/consumable/ethanol/sugar_rush/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - drinker.satiety -= 10 * REM * seconds_per_tick //junky as hell! a whole glass will keep you from being able to eat junk food - ..() - . = TRUE - -/datum/reagent/consumable/ethanol/crevice_spike - name = "Crevice Spike" - description = "Sour, bitter, and smashingly sobering." - color = "#5BD231" - boozepwr = -10 //sobers you up - ideally, one would drink to get hit with brute damage now to avoid alcohol problems later - quality = DRINK_VERYGOOD - taste_description = "a bitter SPIKE with a sour aftertaste" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/crevice_spike - required_drink_type = /datum/reagent/consumable/ethanol/crevice_spike - name = "Crevice Spike" - desc = "It'll either knock the drunkenness out of you or knock you out cold. Both, probably." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "crevice_spike" - -/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), required_bodytype = affected_bodytype) //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/sake - name = "Sake" - description = "A sweet rice wine of questionable legality and extreme potency." - color = "#DDDDDD" - boozepwr = 70 - taste_description = "sweet rice wine" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_STOCK - -/datum/glass_style/drinking_glass/sake - required_drink_type = /datum/reagent/consumable/ethanol/sake - name = "cup of sake" - desc = "A traditional cup of sake." - icon_state = "sakecup" - -/datum/reagent/consumable/ethanol/peppermint_patty - name = "Peppermint Patty" - description = "This lightly alcoholic drink combines the benefits of menthol and cocoa." - color = "#45ca7a" - taste_description = "mint and chocolate" - boozepwr = 25 - quality = DRINK_GOOD - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/peppermint_patty - required_drink_type = /datum/reagent/consumable/ethanol/peppermint_patty - name = "Peppermint Patty" - desc = "A boozy minty hot cocoa that warms your belly on a cold night." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "peppermint_patty" - -/datum/reagent/consumable/ethanol/peppermint_patty/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - drinker.apply_status_effect(/datum/status_effect/throat_soothed) - drinker.adjust_bodytemperature(5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 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" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - var/obj/item/shield/mighty_shield - -/datum/glass_style/drinking_glass/alexander - required_drink_type = /datum/reagent/consumable/ethanol/alexander - name = "Alexander" - desc = "A creamy, indulgent delight that is stronger than it seems." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "alexander" - -/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, seconds_per_tick, 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, volume) - -/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/amaretto_alexander - name = "Amaretto Alexander" - description = "A weaker version of the Alexander, what it lacks in strength it makes up for in flavor." - color = "#DBD5AE" - boozepwr = 35 - quality = DRINK_VERYGOOD - taste_description = "sweet, creamy cacao" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/amaretto_alexander - required_drink_type = /datum/reagent/consumable/ethanol/amaretto_alexander - name = "Amaretto Alexander" - desc = "A creamy, indulgent delight that is in fact as gentle as it seems." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "alexanderam" - -/datum/reagent/consumable/ethanol/sidecar - name = "Sidecar" - description = "The one ride you'll gladly give up the wheel for." - color = "#FFC55B" - boozepwr = 45 - quality = DRINK_GOOD - taste_description = "delicious freedom" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_MEDIUM - -/datum/glass_style/drinking_glass/sidecar - required_drink_type = /datum/reagent/consumable/ethanol/sidecar - name = "Sidecar" - desc = "The one ride you'll gladly give up the wheel for." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "sidecar" - -/datum/reagent/consumable/ethanol/between_the_sheets - name = "Between the Sheets" - description = "A provocatively named classic. Funny enough, doctors recommend drinking it before taking a nap while underneath bedsheets." - color = "#F4C35A" - boozepwr = 55 - quality = DRINK_GOOD - taste_description = "seduction" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_MEDIUM - -/datum/glass_style/drinking_glass/between_the_sheets - required_drink_type = /datum/reagent/consumable/ethanol/between_the_sheets - name = "Between the Sheets" - desc = "The only drink that comes with a label reminding you of Nanotrasen's zero-tolerance promiscuity policy." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "between_the_sheets" - -/datum/reagent/consumable/ethanol/between_the_sheets/on_mob_life(mob/living/drinker, seconds_per_tick, 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 - - if(!drinker.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(prob(50)) - drinker.adjustBruteLoss(-0.25 * REM * seconds_per_tick, required_bodytype = affected_bodytype) - else - drinker.adjustFireLoss(-0.25 * REM * seconds_per_tick, required_bodytype = affected_bodytype) - else if(drinker.getBruteLoss()) //If you have only one, it still heals but not as well. - drinker.adjustBruteLoss(-0.2 * REM * seconds_per_tick, required_bodytype = affected_bodytype) - else if(drinker.getFireLoss()) - drinker.adjustFireLoss(-0.2 * REM * seconds_per_tick, required_bodytype = affected_bodytype) - -/datum/reagent/consumable/ethanol/kamikaze - name = "Kamikaze" - description = "Divinely windy." - color = "#EEF191" - boozepwr = 60 - quality = DRINK_GOOD - taste_description = "divine windiness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/kamikaze - required_drink_type = /datum/reagent/consumable/ethanol/kamikaze - name = "Kamikaze" - desc = "Divinely windy." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "kamikaze" - -/datum/reagent/consumable/ethanol/mojito - name = "Mojito" - description = "A drink that looks as refreshing as it tastes." - color = "#DFFAD9" - boozepwr = 30 - quality = DRINK_GOOD - taste_description = "refreshing mint" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_MEDIUM - -/datum/glass_style/drinking_glass/mojito - required_drink_type = /datum/reagent/consumable/ethanol/mojito - name = "Mojito" - desc = "A drink that looks as refreshing as it tastes." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "mojito" - -/datum/reagent/consumable/ethanol/moscow_mule - name = "Moscow Mule" - description = "A chilly drink that reminds you of the Derelict." - color = "#EEF1AA" - boozepwr = 30 - quality = DRINK_GOOD - taste_description = "refreshing spiciness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/moscow_mule - required_drink_type = /datum/reagent/consumable/ethanol/moscow_mule - name = "Moscow Mule" - desc = "A chilly drink that reminds you of the Derelict." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "moscow_mule" - -/datum/reagent/consumable/ethanol/fernet - name = "Fernet" - description = "An incredibly bitter herbal liqueur used as a digestif." - color = "#1B2E24" // rgb: 27, 46, 36 - boozepwr = 80 - taste_description = "utter bitterness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/fernet - required_drink_type = /datum/reagent/consumable/ethanol/fernet - name = "glass of fernet" - desc = "A glass of pure Fernet. Only an absolute madman would drink this alone." //Hi Kevum - -/datum/reagent/consumable/ethanol/fernet/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - if(drinker.nutrition <= NUTRITION_LEVEL_STARVING) - drinker.adjustToxLoss(1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - drinker.adjust_nutrition(-5 * REM * seconds_per_tick) - drinker.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." - color = "#390600" // rgb: 57, 6, - boozepwr = 25 - quality = DRINK_NICE - taste_description = "sweet relief" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/fernet_cola - required_drink_type = /datum/reagent/consumable/ethanol/fernet_cola - name = "glass of fernet cola" - desc = "A sawed-off cola bottle filled with Fernet Cola. Nothing better after eating like a lardass." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "godlyblend" - -/datum/reagent/consumable/ethanol/fernet_cola/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - if(drinker.nutrition <= NUTRITION_LEVEL_STARVING) - drinker.adjustToxLoss(0.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - drinker.adjust_nutrition(-3 * REM * seconds_per_tick) - drinker.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 - boozepwr = -10 - quality = DRINK_NICE - taste_description = "a sweet sobering mix" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_HIGH - -/datum/glass_style/drinking_glass/fanciulli - required_drink_type = /datum/reagent/consumable/ethanol/fanciulli - name = "glass of fanciulli" - desc = "A glass of Fanciulli. It's just Manhattan with Fernet." - icon_state = "fanciulli" - -/datum/reagent/consumable/ethanol/fanciulli/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - drinker.adjust_nutrition(-5 * REM * seconds_per_tick) - drinker.overeatduration = 0 - return ..() - -/datum/reagent/consumable/ethanol/fanciulli/on_mob_metabolize(mob/living/drinker) - if(drinker.health > 0) - drinker.adjustStaminaLoss(20, required_biotype = affected_biotype) - . = TRUE - ..() - -/datum/reagent/consumable/ethanol/branca_menta - name = "Branca Menta" - description = "A refreshing mixture of bitter Fernet with mint creme liquour." - color = "#4B5746" // rgb: 75, 87, 70 - boozepwr = 35 - quality = DRINK_GOOD - taste_description = "a bitter freshness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_MEDIUM - -/datum/glass_style/drinking_glass/branca_menta - required_drink_type = /datum/reagent/consumable/ethanol/branca_menta - name = "glass of branca menta" - desc = "A glass of Branca Menta, perfect for those lazy and hot Sunday summer afternoons." //Get lazy literally by drinking this - icon_state = "minted_fernet" - -/datum/reagent/consumable/ethanol/branca_menta/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - drinker.adjust_bodytemperature(-20 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, T0C) - return ..() - -/datum/reagent/consumable/ethanol/branca_menta/on_mob_metabolize(mob/living/drinker) - if(drinker.health > 0) - drinker.adjustStaminaLoss(35, required_biotype = affected_biotype) - . = TRUE - ..() - -/datum/reagent/consumable/ethanol/blank_paper - name = "Blank Paper" - description = "A bubbling glass of blank paper. Just looking at it makes you feel fresh." - nutriment_factor = 1 * REAGENTS_METABOLISM - color = "#DCDCDC" // rgb: 220, 220, 220 - boozepwr = 20 - quality = DRINK_GOOD - taste_description = "bubbling possibility" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/blank_paper - required_drink_type = /datum/reagent/consumable/ethanol/blank_paper - name = "glass of blank paper" - desc = "A fizzy cocktail for those looking to start fresh." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "blank_paper" - -/datum/reagent/consumable/ethanol/blank_paper/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - if(ishuman(drinker) && HAS_TRAIT(drinker, TRAIT_MIMING)) - drinker.set_silence_if_lower(MIMEDRINK_SILENCE_DURATION) - drinker.heal_bodypart_damage(1 * REM * seconds_per_tick, 1 * REM * seconds_per_tick) - . = TRUE - return ..() - -/datum/reagent/consumable/ethanol/fruit_wine - name = "Fruit Wine" - description = "A wine made from grown plants." - color = "#FFFFFF" - boozepwr = 35 - quality = DRINK_GOOD - 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/glass_style/drinking_glass/fruit_wine - required_drink_type = /datum/reagent/consumable/ethanol/fruit_wine - // This should really be dynamic like "glass of pineapple wine" or something - // but seeing as fruit wine half doesn't work already I'm not inclined to add support for that now - name = "glass of fruit wine" - desc = "A wine made from grown plants." - -/datum/reagent/consumable/ethanol/fruit_wine/on_new(list/data) - if(!data) - return - - src.data = data - names = data["names"] - tastes = data["tastes"] - boozepwr = data["boozepwr"] - color = data["color"] - generate_data_info(data) - -/datum/reagent/consumable/ethanol/fruit_wine/on_merge(list/data, amount) - ..() - var/diff = (amount/volume) - if(diff < 1) - color = BlendRGB(color, data["color"], diff/2) //The percentage difference over two, so that they take average if equal. - else - color = BlendRGB(color, data["color"], (1/diff)/2) //Adjust so it's always blending properly. - var/oldvolume = volume-amount - - var/list/cachednames = data["names"] - for(var/name in names | cachednames) - names[name] = ((names[name] * oldvolume) + (cachednames[name] * amount)) / volume - - var/list/cachedtastes = data["tastes"] - for(var/taste in tastes | cachedtastes) - tastes[taste] = ((tastes[taste] * oldvolume) + (cachedtastes[taste] * amount)) / volume - - boozepwr *= oldvolume - var/newzepwr = data["boozepwr"] * amount - boozepwr += newzepwr - boozepwr /= volume //Blending boozepwr to volume. - generate_data_info(data) - -/datum/reagent/consumable/ethanol/fruit_wine/proc/generate_data_info(list/data) - // BYOND's compiler fails to catch non-consts in a ranged switch case, and it causes incorrect behavior. So this needs to explicitly be a constant. - var/const/minimum_percent = 0.15 //Percentages measured between 0 and 1. - var/list/primary_tastes = list() - var/list/secondary_tastes = list() - for(var/taste in tastes) - switch(tastes[taste]) - if(minimum_percent*2 to INFINITY) - primary_tastes += taste - if(minimum_percent to minimum_percent*2) - secondary_tastes += taste - - var/minimum_name_percent = 0.35 - name = "" - var/list/names_in_order = sortTim(names, GLOBAL_PROC_REF(cmp_numeric_dsc), TRUE) - var/named = FALSE - for(var/fruit_name in names) - if(names[fruit_name] >= minimum_name_percent) - name += "[fruit_name] " - named = TRUE - if(named) - name += "Wine" - else - name = "Mixed [names_in_order[1]] Wine" - - var/alcohol_description - switch(boozepwr) - if(120 to INFINITY) - alcohol_description = "suicidally strong" - if(90 to 120) - alcohol_description = "rather strong" - if(70 to 90) - alcohol_description = "strong" - if(40 to 70) - alcohol_description = "rich" - if(20 to 40) - alcohol_description = "mild" - if(0 to 20) - alcohol_description = "sweet" - else - alcohol_description = "watery" //How the hell did you get negative boozepwr? - - var/list/fruits = list() - if(names_in_order.len <= 3) - fruits = names_in_order - else - for(var/i in 1 to 3) - fruits += names_in_order[i] - fruits += "other plants" - var/fruit_list = english_list(fruits) - description = "A [alcohol_description] wine brewed from [fruit_list]." - - var/flavor = "" - if(!primary_tastes.len) - primary_tastes = list("[alcohol_description] alcohol") - flavor += english_list(primary_tastes) - if(secondary_tastes.len) - flavor += ", with a hint of " - flavor += english_list(secondary_tastes) - taste_description = flavor - -/datum/reagent/consumable/ethanol/champagne //How the hell did we not have champagne already!? - name = "Champagne" - description = "A sparkling wine known for its ability to strike fast and hard." - color = "#ffffc1" - boozepwr = 40 - taste_description = "auspicious occasions and bad decisions" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_EASY - -/datum/glass_style/drinking_glass/champagne - required_drink_type = /datum/reagent/consumable/ethanol/champagne - name = "Champagne" - desc = "The flute clearly displays the slowly rising bubbles." - icon_state = "champagne_glass" - -/datum/reagent/consumable/ethanol/wizz_fizz - name = "Wizz Fizz" - description = "A magical potion, fizzy and wild! However the taste, you will find, is quite mild." - color = "#4235d0" //Just pretend that the triple-sec was blue curacao. - boozepwr = 50 - quality = DRINK_GOOD - taste_description = "friendship! It is magic, after all" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/wizz_fizz - required_drink_type = /datum/reagent/consumable/ethanol/wizz_fizz - name = "Wizz Fizz" - desc = "The glass bubbles and froths with an almost magical intensity." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "wizz_fizz" - -/datum/reagent/consumable/ethanol/wizz_fizz/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, 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 * seconds_per_tick, 1 * REM * seconds_per_tick) - drinker.adjustOxyLoss(-1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - drinker.adjustToxLoss(-1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - drinker.adjustStaminaLoss(-1 * REM * seconds_per_tick, required_biotype = affected_biotype) - return ..() - -/datum/reagent/consumable/ethanol/bug_spray - name = "Bug Spray" - description = "A harsh, acrid, bitter drink, for those who need something to brace themselves." - color = "#33ff33" - boozepwr = 50 - quality = DRINK_GOOD - taste_description = "the pain of ten thousand slain mosquitos" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/bug_spray - required_drink_type = /datum/reagent/consumable/ethanol/bug_spray - name = "Bug Spray" - desc = "Your eyes begin to water as the sting of alcohol reaches them." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "bug_spray" - -/datum/reagent/consumable/ethanol/bug_spray/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - //Bugs should not drink Bug spray. - if(ismoth(drinker) || isflyperson(drinker)) - drinker.adjustToxLoss(1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - return ..() - -/datum/reagent/consumable/ethanol/bug_spray/on_mob_metabolize(mob/living/carbon/drinker) - - if(ismoth(drinker) || isflyperson(drinker)) - drinker.emote("scream") - return ..() - -/datum/reagent/consumable/ethanol/applejack - name = "Applejack" - description = "The perfect beverage for when you feel the need to horse around." - color = "#ff6633" - boozepwr = 20 - taste_description = "an honest day's work at the orchard" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/applejack - required_drink_type = /datum/reagent/consumable/ethanol/applejack - name = "Applejack" - desc = "You feel like you could drink this all neight." - icon_state = "applejack_glass" - -/datum/reagent/consumable/ethanol/jack_rose - name = "Jack Rose" - description = "A light cocktail perfect for sipping with a slice of pie." - color = "#ff6633" - boozepwr = 15 - quality = DRINK_NICE - taste_description = "a sweet and sour slice of apple" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/shot_glass/jack_rose - required_drink_type = /datum/reagent/consumable/ethanol/jack_rose - icon_state = "shotglassred" - -/datum/glass_style/drinking_glass/jack_rose - required_drink_type = /datum/reagent/consumable/ethanol/jack_rose - name = "Jack Rose" - desc = "Enough of these, and you really will start to suppose your toeses are roses." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "jack_rose" - -/datum/reagent/consumable/ethanol/turbo - name = "Turbo" - description = "A turbulent cocktail associated with outlaw hoverbike racing. Not for the faint of heart." - color = "#e94c3a" - boozepwr = 85 - quality = DRINK_VERYGOOD - taste_description = "the outlaw spirit" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/turbo - required_drink_type = /datum/reagent/consumable/ethanol/turbo - name = "Turbo" - desc = "A turbulent cocktail for outlaw hoverbikers." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "turbo" - -/datum/reagent/consumable/ethanol/turbo/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - if(SPT_PROB(2, seconds_per_tick)) - 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.adjustStaminaLoss(-0.25 * drinker.get_drunk_amount() * REM * seconds_per_tick, required_biotype = affected_biotype) - return ..() - -/datum/reagent/consumable/ethanol/old_timer - name = "Old Timer" - description = "An archaic potation enjoyed by old coots of all ages." - color = "#996835" - boozepwr = 35 - quality = DRINK_NICE - taste_description = "simpler times" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/old_timer - required_drink_type = /datum/reagent/consumable/ethanol/old_timer - name = "Old Timer" - desc = "WARNING! May cause premature aging!" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "old_timer" - -/datum/reagent/consumable/ethanol/old_timer/on_mob_life(mob/living/carbon/human/metabolizer, seconds_per_tick, times_fired) - if(SPT_PROB(10, seconds_per_tick) && istype(metabolizer)) - metabolizer.age += 1 - if(metabolizer.age > 70) - metabolizer.facial_hair_color = "#cccccc" - metabolizer.hair_color = "#cccccc" - metabolizer.update_body_parts() - if(metabolizer.age > 100) - metabolizer.become_nearsighted(type) - if(metabolizer.gender == MALE) - metabolizer.facial_hairstyle = "Beard (Very Long)" - metabolizer.update_body_parts() - - if(metabolizer.age > 969) //Best not let people get older than this or i might incur G-ds wrath - 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." - color = "#ffe65b" - boozepwr = 60 - quality = DRINK_GOOD - taste_description = "artifical fruityness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/rubberneck - required_drink_type = /datum/reagent/consumable/ethanol/rubberneck - name = "Rubberneck" - desc = "A popular drink amongst those adhering to an all synthetic diet." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "rubberneck" - -/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/duplex - name = "Duplex" - description = "An inseparable combination of two fruity drinks." - color = "#50e5cf" - boozepwr = 25 - quality = DRINK_NICE - taste_description = "green apples and blue raspberries" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/duplex - required_drink_type = /datum/reagent/consumable/ethanol/duplex - name = "Duplex" - desc = "To imbibe one component separately from the other is consider a great faux pas." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "duplex" - -/datum/reagent/consumable/ethanol/trappist - name = "Trappist Beer" - description = "A strong dark ale brewed by space-monks." - color = "#390c00" - boozepwr = 40 - quality = DRINK_VERYGOOD - taste_description = "dried plums and malt" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/trappist - required_drink_type = /datum/reagent/consumable/ethanol/trappist - name = "Trappist Beer" - desc = "boozy Catholicism in a glass." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "trappistglass" - -/datum/reagent/consumable/ethanol/trappist/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - if(drinker.mind?.holy_role) - drinker.adjustFireLoss(-2.5 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - drinker.adjust_jitter(-2 SECONDS * REM * seconds_per_tick) - drinker.adjust_stutter(-2 SECONDS * REM * seconds_per_tick) - return ..() - -/datum/reagent/consumable/ethanol/blazaam - name = "Blazaam" - description = "A strange drink that few people seem to remember existing. Doubles as a Berenstain remover." - boozepwr = 70 - quality = DRINK_FANTASTIC - taste_description = "alternate realities" - var/stored_teleports = 0 - -/datum/glass_style/drinking_glass/blazaam - required_drink_type = /datum/reagent/consumable/ethanol/blazaam - name = "Blazaam" - desc = "The glass seems to be sliding between realities. Doubles as a Berenstain remover." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "blazaamglass" - -/datum/reagent/consumable/ethanol/blazaam/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - if(drinker.get_drunk_amount() > 40) - if(stored_teleports) - do_teleport(drinker, get_turf(drinker), rand(1,3), channel = TELEPORT_CHANNEL_WORMHOLE) - stored_teleports-- - - if(SPT_PROB(5, seconds_per_tick)) - stored_teleports += rand(2, 6) - if(prob(70)) - drinker.vomit(vomit_type = VOMIT_PURPLE) - return ..() - -/datum/reagent/consumable/ethanol/planet_cracker - name = "Planet Cracker" - description = "This jubilant drink celebrates humanity's triumph over the alien menace. May be offensive to non-human crewmembers." - boozepwr = 50 - quality = DRINK_FANTASTIC - taste_description = "triumph with a hint of bitterness" - -/datum/glass_style/drinking_glass/planet_cracker - required_drink_type = /datum/reagent/consumable/ethanol/planet_cracker - name = "Planet Cracker" - desc = "Although historians believe the drink was originally created to commemorate the end of an important conflict in man's past, its origins have largely been forgotten and it is today seen more as a general symbol of human supremacy." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "planet_cracker" - -/datum/reagent/consumable/ethanol/mauna_loa - name = "Mauna Loa" - description = "Extremely hot; not for the faint of heart!" - boozepwr = 40 - color = "#fe8308" // 254, 131, 8 - quality = DRINK_FANTASTIC - taste_description = "fiery, with an aftertaste of burnt flesh" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/mauna_loa - required_drink_type = /datum/reagent/consumable/ethanol/mauna_loa - name = "Mauna Loa" - desc = "Lavaland in a drink... mug... volcano... thing." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "mauna_loa" - -/datum/reagent/consumable/ethanol/mauna_loa/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - // 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 * seconds_per_tick) - if (SPT_PROB(2.5, seconds_per_tick)) - drinker.adjust_fire_stacks(1) - drinker.ignite_mob() - ..() - -/datum/reagent/consumable/ethanol/painkiller - name = "Painkiller" - description = "Dulls your pain. Your emotional pain, that is." - boozepwr = 20 - color = "#EAD677" - quality = DRINK_NICE - taste_description = "sugary tartness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/painkiller - required_drink_type = /datum/reagent/consumable/ethanol/painkiller - name = "Painkiller" - desc = "A combination of tropical juices and rum. Surely this will make you feel better." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "painkiller" - -/datum/reagent/consumable/ethanol/pina_colada - name = "Pina Colada" - description = "A fresh pineapple drink with coconut rum. Yum." - boozepwr = 40 - color = "#FFF1B2" - quality = DRINK_FANTASTIC - taste_description = "pineapple, coconut, and a hint of the ocean" - -/datum/glass_style/drinking_glass/pina_colada - required_drink_type = /datum/reagent/consumable/ethanol/pina_colada - name = "Pina Colada" - desc = "If you like pina coladas, and getting caught in the rain... well, you'll like this drink." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "pina_colada" - -/datum/reagent/consumable/ethanol/pina_olivada - name = "Piña Olivada" - description = "An oddly designed concoction of olive oil and pineapple juice." - boozepwr = 20 // the oil coats your gastrointestinal tract, meaning you can't absorb as much alcohol. horrifying - color = "#493c00" - quality = DRINK_NICE - taste_description = "a horrible emulsion of pineapple and olive oil" - -/datum/reagent/consumable/ethanol/pina_olivada/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - if(SPT_PROB(8, seconds_per_tick)) - drinker.manual_emote(pick("coughs up some oil", "swallows the lump in [drinker.p_their()] throat", "gags", "chokes up a bit")) - if(SPT_PROB(3, seconds_per_tick)) - var/static/list/messages = list( - "A horrible aftertaste coats your mouth.", - "You feel like you're going to choke on the oil in your throat.", - "You start to feel some heartburn coming on.", - "You want to throw up, but you know that nothing can come out due to the clog in your esophagus.", - "Your throat feels horrible.", - ) - to_chat(drinker, span_notice(pick(messages))) - return ..() - -/datum/glass_style/drinking_glass/pina_olivada - required_drink_type = /datum/reagent/consumable/ethanol/pina_olivada - name = "Piña Olivada" - desc = "A balance of fruity pineapple with thick, rich olive oil. Stir well before drinking." - icon_state = "pina_olivada" - -/datum/reagent/consumable/ethanol/pruno // pruno mix is in drink_reagents - name = "Pruno" - color = "#E78108" - description = "Fermented prison wine made from fruit, sugar, and despair. Security loves to confiscate this, which is the only kind thing Security has ever done." - boozepwr = 85 - taste_description = "your tastebuds being individually shanked" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/pruno - required_drink_type = /datum/reagent/consumable/ethanol/pruno - name = "glass of pruno" - 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." - icon_state = "glass_orange" - -/datum/reagent/consumable/ethanol/pruno/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - drinker.adjust_disgust(5 * REM * seconds_per_tick) - ..() - -/datum/reagent/consumable/ethanol/ginger_amaretto - name = "Ginger Amaretto" - description = "A delightfully simple cocktail that pleases the senses." - boozepwr = 30 - color = "#EFB42A" - quality = DRINK_GOOD - taste_description = "sweetness followed by a soft sourness and warmth" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/ginger_amaretto - required_drink_type = /datum/reagent/consumable/ethanol/ginger_amaretto - name = "Ginger Amaretto" - desc = "The sprig of rosemary adds a nice aroma to the drink, and isn't just to be pretentious afterall!" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "gingeramaretto" - -/datum/reagent/consumable/ethanol/godfather - name = "Godfather" - description = "A rough cocktail with illegal connections." - boozepwr = 50 - color = "#E68F00" - quality = DRINK_GOOD - taste_description = "a delightful softened punch" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_MEDIUM - -/datum/glass_style/drinking_glass/godfather - required_drink_type = /datum/reagent/consumable/ethanol/godfather - name = "Godfather" - desc = "A classic from old Italy and enjoyed by gangsters, pray the orange peel doesnt end up in your mouth." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "godfather" - -/datum/reagent/consumable/ethanol/godmother - name = "Godmother" - description = "A twist on a classic, liked more by mature women." - boozepwr = 50 - color = "#E68F00" - quality = DRINK_GOOD - taste_description = "sweetness and a zesty twist" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/godmother - required_drink_type = /datum/reagent/consumable/ethanol/godmother - name = "Godmother" - desc = "A lovely fresh smelling cocktail, a true Sicilian delight." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "godmother" - -/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." - boozepwr = 25 - color = "#EEC39A" - quality = DRINK_GOOD - taste_description = "sweet nectar" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/kortara - required_drink_type = /datum/reagent/consumable/ethanol/kortara - name = "glass of kortara" - desc = "The fermented nectar of the Korta nut, as enjoyed by lizards galaxywide." - icon_state = "kortara_glass" - -/datum/reagent/consumable/ethanol/kortara/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - if(drinker.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) - drinker.heal_bodypart_damage(1,0) - . = TRUE - -/datum/reagent/consumable/ethanol/sea_breeze - name = "Sea Breeze" - description = "Light and refreshing with a mint and cocoa hit- like mint choc chip ice cream you can drink!" - boozepwr = 15 - color = "#CFFFE5" - quality = DRINK_VERYGOOD - taste_description = "mint choc chip" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/sea_breeze - required_drink_type = /datum/reagent/consumable/ethanol/sea_breeze - name = "Sea Breeze" - desc = "Minty, chocolatey, and creamy. It's like drinkable mint chocolate chip!" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "sea_breeze" - -/datum/reagent/consumable/ethanol/sea_breeze/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - drinker.apply_status_effect(/datum/status_effect/throat_soothed) - ..() - -/datum/reagent/consumable/ethanol/white_tiziran - name = "White Tiziran" - description = "A mix of vodka and kortara. The Lizard imbibes." - boozepwr = 65 - color = "#A68340" - quality = DRINK_GOOD - taste_description = "strikes and gutters" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/white_tiziran - required_drink_type = /datum/reagent/consumable/ethanol/white_tiziran - name = "White Tiziran" - desc = "I had a rough night and I hate the fucking humans, man." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "white_tiziran" - -/datum/reagent/consumable/ethanol/drunken_espatier - name = "Drunken Espatier" - description = "Look, if you had to get into a shootout in the cold vacuum of space, you'd want to be drunk too." - boozepwr = 65 - color = "#A68340" - quality = DRINK_GOOD - taste_description = "sorrow" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/drunken_espatier - required_drink_type = /datum/reagent/consumable/ethanol/drunken_espatier - name = "Drunken Espatier" - desc = "A drink to make facing death easier." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "drunken_espatier" - -/datum/reagent/consumable/ethanol/drunken_espatier/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - drinker.add_mood_event("numb", /datum/mood_event/narcotic_medium, name) //comfortably numb - ..() - -/datum/reagent/consumable/ethanol/drunken_espatier/on_mob_metabolize(mob/living/drinker) - . = ..() - drinker.apply_status_effect(/datum/status_effect/grouped/screwy_hud/fake_healthy, type) - -/datum/reagent/consumable/ethanol/drunken_espatier/on_mob_end_metabolize(mob/living/drinker) - . = ..() - drinker.remove_status_effect(/datum/status_effect/grouped/screwy_hud/fake_healthy, type) - -/datum/reagent/consumable/ethanol/protein_blend - name = "Protein Blend" - description = "A vile blend of protein, pure grain alcohol, korta flour, and blood. Useful for bulking up, if you can keep it down." - boozepwr = 65 - color = "#FF5B69" - quality = DRINK_NICE - taste_description = "regret" - nutriment_factor = 3 * REAGENTS_METABOLISM - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/protein_blend - required_drink_type = /datum/reagent/consumable/ethanol/protein_blend - name = "Protein Blend" - desc = "Vile, even by lizard standards." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "protein_blend" - -/datum/reagent/consumable/ethanol/protein_blend/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - drinker.adjust_nutrition(2 * REM * seconds_per_tick) - if(!islizard(drinker)) - drinker.adjust_disgust(5 * REM * seconds_per_tick) - else - drinker.adjust_disgust(2 * REM * seconds_per_tick) - ..() - -/datum/reagent/consumable/ethanol/mushi_kombucha - name = "Mushi Kombucha" - description = "A popular summer beverage on Tizira, made from sweetened mushroom tea." - boozepwr = 10 - color = "#C46400" - quality = DRINK_VERYGOOD - taste_description = "sweet 'shrooms" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/mushi_kombucha - required_drink_type = /datum/reagent/consumable/ethanol/mushi_kombucha - name = "glass of mushi kombucha" - icon_state = "glass_orange" - -/datum/reagent/consumable/ethanol/triumphal_arch - name = "Triumphal Arch" - description = "A drink celebrating the Lizard Empire and its military victories. It's popular at bars on Unification Day." - boozepwr = 60 - color = "#FFD700" - quality = DRINK_FANTASTIC - taste_description = "victory" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/triumphal_arch - required_drink_type = /datum/reagent/consumable/ethanol/triumphal_arch - name = "Triumphal Arch" - desc = "A toast to the Empire, long may it stand." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "triumphal_arch" - -/datum/reagent/consumable/ethanol/triumphal_arch/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - if(islizard(drinker)) - drinker.add_mood_event("triumph", /datum/mood_event/memories_of_home, name) - ..() - -/datum/reagent/consumable/ethanol/the_juice - name = "The Juice" - description = "Woah man, this like, feels familiar to you dude." - color = "#4c14be" - boozepwr = 50 - quality = DRINK_GOOD - taste_description = "like, the future, man" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - var/datum/brain_trauma/special/bluespace_prophet/prophet_trauma - -/datum/glass_style/drinking_glass/the_juice - required_drink_type = /datum/reagent/consumable/ethanol/the_juice - name = "The Juice" - desc = "A concoction of not-so-edible things that apparently lets you feel like you're in two places at once" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "thejuice" - -/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_end_metabolize(mob/living/carbon/drinker) - if(prophet_trauma) - QDEL_NULL(prophet_trauma) - return ..() - -//a jacked up absinthe that causes hallucinations to the game master controller basically, used in smuggling objectives -/datum/reagent/consumable/ethanol/ritual_wine - name = "Ritual Wine" - description = "The dangerous, potent, alcoholic component of ritual wine." - color = rgb(35, 231, 25) - boozepwr = 90 //enjoy near death intoxication - taste_mult = 6 - taste_description = "concentrated herbs" - -/datum/reagent/consumable/ethanol/ritual_wine/on_mob_metabolize(mob/living/psychonaut) - . = ..() - 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) - . = ..() - 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.remove_filter("ritual_wine") - -//Moth Drinks -/datum/reagent/consumable/ethanol/curacao - name = "Curaçao" - description = "Made with laraha oranges, for an aromatic finish." - boozepwr = 30 - color = "#1a5fa1" - quality = DRINK_NICE - taste_description = "blue orange" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/curacao - required_drink_type = /datum/reagent/consumable/ethanol/curacao - name = "glass of curaçao" - desc = "It's blue, da ba dee." - icon_state = "curacao" - -/datum/reagent/consumable/ethanol/navy_rum //IN THE NAVY - name = "Navy Rum" - description = "Rum as the finest sailors drink." - boozepwr = 90 //the finest sailors are often drunk - color = "#d8e8f0" - quality = DRINK_NICE - taste_description = "a life on the waves" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/navy_rum - required_drink_type = /datum/reagent/consumable/ethanol/navy_rum - name = "glass of navy rum" - desc = "Splice the mainbrace, and God save the King." - icon_state = "ginvodkaglass" - -/datum/reagent/consumable/ethanol/bitters //why do they call them bitters, anyway? they're more spicy than anything else - name = "Andromeda Bitters" - description = "A bartender's best friend, often used to lend a delicate spiciness to any drink. Produced in New Trinidad, now and forever." - boozepwr = 70 - color = "#1c0000" - quality = DRINK_NICE - taste_description = "spiced alcohol" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/bitters - required_drink_type = /datum/reagent/consumable/ethanol/bitters - name = "glass of bitters" - desc = "Typically you'd want to mix this with something- but you do you." - icon_state = "bitters" - -/datum/reagent/consumable/ethanol/admiralty //navy rum, vermouth, fernet - name = "Admiralty" - description = "A refined, bitter drink made with navy rum, vermouth and fernet." - boozepwr = 100 - color = "#1F0001" - quality = DRINK_VERYGOOD - taste_description = "haughty arrogance" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/admiralty - required_drink_type = /datum/reagent/consumable/ethanol/admiralty - name = "Admiralty" - desc = "Hail to the Admiral, for he brings fair tidings, and rum too." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "admiralty" - -/datum/reagent/consumable/ethanol/long_haul //Rum, Curacao, Sugar, dash of bitters, lengthened with soda water - name = "Long Haul" - description = "A favourite amongst freighter pilots, unscrupulous smugglers, and nerf herders." - boozepwr = 35 - color = "#003153" - quality = DRINK_VERYGOOD - taste_description = "companionship" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/long_haul - required_drink_type = /datum/reagent/consumable/ethanol/long_haul - name = "Long Haul" - desc = "A perfect companion for a lonely long haul flight." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "long_haul" - -/datum/reagent/consumable/ethanol/long_john_silver //navy rum, bitters, lemonade - name = "Long John Silver" - description = "A long drink of navy rum, bitters, and lemonade. Particularly popular aboard the Mothic Fleet as it's light on ration credits and heavy on flavour." - boozepwr = 50 - color = "#c4b35c" - quality = DRINK_VERYGOOD - taste_description = "rum and spices" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/long_john_silver - required_drink_type = /datum/reagent/consumable/ethanol/long_john_silver - name = "Long John Silver" - 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?" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "long_john_silver" - -/datum/reagent/consumable/ethanol/tropical_storm //dark rum, pineapple juice, triple citrus, curacao - name = "Tropical Storm" - description = "A taste of the Caribbean in one glass." - boozepwr = 40 - color = "#00bfa3" - quality = DRINK_VERYGOOD - taste_description = "the tropics" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/tropical_storm - required_drink_type = /datum/reagent/consumable/ethanol/tropical_storm - name = "Tropical Storm" - desc = "Less destructive than the real thing." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "tropical_storm" - -/datum/reagent/consumable/ethanol/dark_and_stormy //rum and ginger beer- simple and classic - name = "Dark and Stormy" - description = "A classic drink arriving to thunderous applause." //thank you, thank you, I'll be here forever - boozepwr = 50 - color = "#8c5046" - quality = DRINK_GOOD - taste_description = "ginger and rum" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/dark_and_stormy - required_drink_type = /datum/reagent/consumable/ethanol/dark_and_stormy - name = "Dark and Stormy" - desc = "Thunder and lightning, very very frightening." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "dark_and_stormy" - -/datum/reagent/consumable/ethanol/salt_and_swell //navy rum, tochtause syrup, egg whites, dash of saline-glucose solution - name = "Salt and Swell" - description = "A bracing sour with an interesting salty taste." - boozepwr = 60 - color = "#b4abd0" - quality = DRINK_FANTASTIC - taste_description = "salt and spice" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/salt_and_swell - required_drink_type = /datum/reagent/consumable/ethanol/salt_and_swell - name = "Salt and Swell" - desc = "Ah, I do like to be beside the seaside." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "salt_and_swell" - -/datum/reagent/consumable/ethanol/tiltaellen //yoghurt, salt, vinegar - name = "Tiltällen" - description = "A lightly fermented yoghurt drink with salt and a light dash of vinegar. Has a distinct sour cheesy flavour." - boozepwr = 10 - color = "#F4EFE2" - quality = DRINK_NICE - taste_description = "sour cheesy yoghurt" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/tiltaellen - required_drink_type = /datum/reagent/consumable/ethanol/tiltaellen - name = "glass of tiltällen" - desc = "Eww... it's curdled." - icon_state = "tiltaellen" - -/datum/reagent/consumable/ethanol/tich_toch - name = "Tich Toch" - description = "A mix of Tiltällen, Töchtaüse Syrup, and vodka. It's not exactly to everyones' tastes." - boozepwr = 75 - color = "#b4abd0" - quality = DRINK_VERYGOOD - taste_description = "spicy sour cheesy yoghurt" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/tich_toch - required_drink_type = /datum/reagent/consumable/ethanol/tich_toch - name = "Tich Toch" - desc = "Oh god." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "tich_toch" - -/datum/reagent/consumable/ethanol/helianthus - name = "Helianthus" - description = "A dark yet radiant mixture of absinthe and hallucinogens. The choice of all true artists." - boozepwr = 75 - color = "#fba914" - quality = DRINK_VERYGOOD - taste_description = "golden memories" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - var/hal_amt = 4 - var/hal_cap = 24 - -/datum/glass_style/drinking_glass/helianthus - required_drink_type = /datum/reagent/consumable/ethanol/helianthus - name = "Helianthus" - desc = "Another reason to cut off an ear..." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "helianthus" - -/datum/reagent/consumable/ethanol/helianthus/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - if(SPT_PROB(5, seconds_per_tick)) - drinker.adjust_hallucinations_up_to(4 SECONDS * REM * seconds_per_tick, 48 SECONDS) - - ..() - -/datum/reagent/consumable/ethanol/plumwine - name = "Plum wine" - description = "Plums turned into wine." - color = "#8a0421" - nutriment_factor = 1 * REAGENTS_METABOLISM - boozepwr = 20 - taste_description = "a poet's love and undoing" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_STOCK - -/datum/glass_style/drinking_glass/plumwine - required_drink_type = /datum/reagent/consumable/ethanol/plumwine - name = "plum wine" - desc = "Looks like an evening of writing fine poetry." - icon_state = "plumwineglass" - -/datum/reagent/consumable/ethanol/the_hat - name = "The Hat" - description = "A fancy drink, usually served in a man's hat." - color = "#b90a5c" - boozepwr = 80 - quality = DRINK_NICE - taste_description = "something perfumy" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_STOCK - -/datum/glass_style/drinking_glass/the_hat - required_drink_type = /datum/reagent/consumable/ethanol/the_hat - name = "The Hat" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "thehatglass" - -/datum/reagent/consumable/ethanol/gin_garden - name = "Gin Garden" - description = "Excellent cooling alcoholic drink with not so ordinary taste." - boozepwr = 20 - color = "#6cd87a" - quality = DRINK_VERYGOOD - taste_description = "light gin with sweet ginger and cucumber" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/gin_garden - required_drink_type = /datum/reagent/consumable/ethanol/gin_garden - name = "gin garden" - desc = "Hey, someone forgot the herb and... the cucumber in my cocktail!" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "gin_garden" - -/datum/reagent/consumable/ethanol/gin_garden/on_mob_life(mob/living/carbon/doll, seconds_per_tick, times_fired) - doll.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, doll.get_body_temp_normal()) - ..() - -/datum/reagent/consumable/ethanol/wine_voltaic - name = "Voltaic Yellow Wine" - description = "Electrically charged wine. Recharges ethereals, but also nontoxic." - boozepwr = 30 - color = "#FFAA00" - taste_description = "static with a hint of sweetness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/wine_voltaic - required_drink_type = /datum/reagent/consumable/ethanol/wine_voltaic - name = "Voltaic Yellow Wine" - desc = "Electrically charged wine. Recharges ethereals, but also nontoxic." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "wine_voltaic" - -/datum/reagent/consumable/ethanol/wine_voltaic/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) //can't be on life because of the way blood works. - . = ..() - if(!(methods & (INGEST|INJECT|PATCH)) || !iscarbon(exposed_mob)) - return - - var/mob/living/carbon/exposed_carbon = exposed_mob - var/obj/item/organ/internal/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) - if(istype(stomach)) - stomach.adjust_charge(reac_volume * 3) - -/datum/reagent/consumable/ethanol/telepole - name = "Telepole" - description = "A grounding rod in the form of a drink. Recharges ethereals, and gives temporary shock resistance." - boozepwr = 50 - color = "#b300ff" - quality = DRINK_NICE - taste_description = "the howling storm" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/telepole - required_drink_type = /datum/reagent/consumable/ethanol/telepole - name = "Telepole" - desc = "A liquid grounding rod. Recharges ethereals and grants temporary shock resistance." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "telepole" - -/datum/reagent/consumable/ethanol/telepole/on_mob_metabolize(mob/living/affected_mob) - . = ..() - ADD_TRAIT(affected_mob, TRAIT_SHOCKIMMUNE, type) - -/datum/reagent/consumable/ethanol/telepole/on_mob_end_metabolize(mob/living/affected_mob) - REMOVE_TRAIT(affected_mob, TRAIT_SHOCKIMMUNE, type) - return ..() - -/datum/reagent/consumable/ethanol/telepole/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) //can't be on life because of the way blood works. - . = ..() - if(!(methods & (INGEST|INJECT|PATCH)) || !iscarbon(exposed_mob)) - return - - var/mob/living/carbon/exposed_carbon = exposed_mob - var/obj/item/organ/internal/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) - if(istype(stomach)) - stomach.adjust_charge(reac_volume * 2) - -/datum/reagent/consumable/ethanol/pod_tesla - name = "Pod Tesla" - description = "Ride the lightning! Recharges ethereals, suppresses phobias, and gives strong temporary shock resistance." - boozepwr = 80 - color = "#00fbff" - quality = DRINK_FANTASTIC - taste_description = "victory, with a hint of insanity" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/pod_tesla - required_drink_type = /datum/reagent/consumable/ethanol/pod_tesla - name = "Pod Tesla" - desc = "Ride the lightning! Recharges ethereals, suppresses phobias, and grants strong temporary shock resistance." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "pod_tesla" - -/datum/reagent/consumable/ethanol/pod_tesla/on_mob_metabolize(mob/living/affected_mob) - ..() - affected_mob.add_traits(list(TRAIT_SHOCKIMMUNE,TRAIT_TESLA_SHOCKIMMUNE,TRAIT_FEARLESS), type) - - -/datum/reagent/consumable/ethanol/pod_tesla/on_mob_end_metabolize(mob/living/affected_mob) - affected_mob.remove_traits(list(TRAIT_SHOCKIMMUNE,TRAIT_TESLA_SHOCKIMMUNE,TRAIT_FEARLESS), type) - -/datum/reagent/consumable/ethanol/pod_tesla/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) //can't be on life because of the way blood works. - . = ..() - if(!(methods & (INGEST|INJECT|PATCH)) || !iscarbon(exposed_mob)) - return - - var/mob/living/carbon/exposed_carbon = exposed_mob - var/obj/item/organ/internal/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) - if(istype(stomach)) - stomach.adjust_charge(reac_volume * 5) -#undef ALCOHOL_EXPONENT -#undef ALCOHOL_THRESHOLD_MODIFIER diff --git a/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm b/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm index 690d20fdd6785..4550edbdfdf41 100644 --- a/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm @@ -12,8 +12,8 @@ breather.add_movespeed_modifier(/datum/movespeed_modifier/reagent/freon) /datum/reagent/freon/on_mob_end_metabolize(mob/living/breather) + . = ..() breather.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/freon) - return ..() /datum/reagent/halon name = "Halon" @@ -30,9 +30,9 @@ ADD_TRAIT(breather, TRAIT_RESISTHEAT, type) /datum/reagent/halon/on_mob_end_metabolize(mob/living/breather) + . = ..() breather.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/halon) REMOVE_TRAIT(breather, TRAIT_RESISTHEAT, type) - return ..() /datum/reagent/healium name = "Healium" @@ -43,19 +43,19 @@ taste_description = "rubbery" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE -/datum/reagent/healium/on_mob_metabolize(mob/living/breather) - . = ..() - breather.PermaSleeping() - /datum/reagent/healium/on_mob_end_metabolize(mob/living/breather) - breather.SetSleeping(10) - return ..() + . = ..() + breather.SetSleeping(1 SECONDS) /datum/reagent/healium/on_mob_life(mob/living/breather, seconds_per_tick, times_fired) - breather.adjustFireLoss(-2 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - breather.adjustToxLoss(-5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - breather.adjustBruteLoss(-2 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - return ..() + . = ..() + breather.SetSleeping(30 SECONDS) + var/need_mob_update + need_mob_update = breather.adjustFireLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += breather.adjustToxLoss(-5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += breather.adjustBruteLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/hypernoblium name = "Hyper-Noblium" @@ -67,9 +67,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/hypernoblium/on_mob_life(mob/living/carbon/breather, seconds_per_tick, times_fired) + . = ..() if(isplasmaman(breather)) breather.set_timed_status_effect(10 SECONDS * REM * seconds_per_tick, /datum/status_effect/hypernob_protection) - ..() /datum/reagent/nitrium_high_metabolization name = "Nitrosyl plasmide" @@ -87,13 +87,16 @@ ADD_TRAIT(breather, TRAIT_SLEEPIMMUNE, type) /datum/reagent/nitrium_high_metabolization/on_mob_end_metabolize(mob/living/breather) + . = ..() REMOVE_TRAIT(breather, TRAIT_SLEEPIMMUNE, type) - return ..() /datum/reagent/nitrium_high_metabolization/on_mob_life(mob/living/carbon/breather, seconds_per_tick, times_fired) - breather.adjustStaminaLoss(-2 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - breather.adjustToxLoss(0.1 * current_cycle * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) // 1 toxin damage per cycle at cycle 10 - return ..() + . = ..() + var/need_mob_update + need_mob_update = breather.adjustStaminaLoss(-2 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update += breather.adjustToxLoss(0.1 * (current_cycle-1) * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) // 1 toxin damage per cycle at cycle 10 + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/nitrium_low_metabolization name = "Nitrium" @@ -110,8 +113,8 @@ breather.add_movespeed_modifier(/datum/movespeed_modifier/reagent/nitrium) /datum/reagent/nitrium_low_metabolization/on_mob_end_metabolize(mob/living/breather) + . = ..() breather.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/nitrium) - return ..() /datum/reagent/pluoxium name = "Pluoxium" @@ -123,13 +126,17 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/pluoxium/on_mob_life(mob/living/carbon/breather, seconds_per_tick, times_fired) + . = ..() if(!HAS_TRAIT(breather, TRAIT_KNOCKEDOUT)) - return ..() + return + . = ..() for(var/obj/item/organ/organ_being_healed as anything in breather.organs) - organ_being_healed.apply_organ_damage(-0.5 * REM * seconds_per_tick) + if(!organ_being_healed.damage) + continue - return ..() + if(organ_being_healed.apply_organ_damage(-0.5 * REM * seconds_per_tick, required_organ_flag = ORGAN_ORGANIC)) + return UPDATE_MOB_HEALTH /datum/reagent/zauker name = "Zauker" @@ -143,8 +150,11 @@ affected_respiration_type = ALL /datum/reagent/zauker/on_mob_life(mob/living/breather, seconds_per_tick, times_fired) - breather.adjustBruteLoss(6 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - breather.adjustOxyLoss(1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - breather.adjustFireLoss(2 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - breather.adjustToxLoss(2 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - return ..() + . = ..() + var/need_mob_update + need_mob_update = breather.adjustBruteLoss(6 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += breather.adjustOxyLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += breather.adjustFireLoss(2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += breather.adjustToxLoss(2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH diff --git a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm index c512a63b7298d..262058b334d71 100644 --- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm @@ -27,31 +27,32 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/c2/helbital/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - . = TRUE var/death_is_coming = (affected_mob.getToxLoss() + affected_mob.getOxyLoss() + affected_mob.getFireLoss() + affected_mob.getBruteLoss())*normalise_creation_purity() var/thou_shall_heal = 0 var/good_kind_of_healing = FALSE + var/need_mob_update = FALSE switch(affected_mob.stat) if(CONSCIOUS) //bad thou_shall_heal = death_is_coming/50 - affected_mob.adjustOxyLoss(2 * REM * seconds_per_tick, TRUE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustOxyLoss(2 * REM * seconds_per_tick, TRUE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) if(SOFT_CRIT) //meh convert thou_shall_heal = round(death_is_coming/47,0.1) - affected_mob.adjustOxyLoss(1 * REM * seconds_per_tick, TRUE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustOxyLoss(1 * REM * seconds_per_tick, TRUE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) else //no convert thou_shall_heal = round(death_is_coming/45, 0.1) good_kind_of_healing = TRUE - affected_mob.adjustBruteLoss(-thou_shall_heal * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustBruteLoss(-thou_shall_heal * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + . = UPDATE_MOB_HEALTH if(good_kind_of_healing && !reaping && SPT_PROB(0.00005, seconds_per_tick)) //janken with the grim reaper! notify_ghosts("[affected_mob] has entered a game of rock-paper-scissors with death!", source = affected_mob, action = NOTIFY_ORBIT, header = "Who Will Win?") reaping = TRUE - var/list/RockPaperScissors = list("rock" = "paper", "paper" = "scissors", "scissors" = "rock") //choice = loses to if(affected_mob.apply_status_effect(/datum/status_effect/necropolis_curse, CURSE_BLINDING)) helbent = TRUE to_chat(affected_mob, 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(affected_mob, "Janken Time! You have 60 Seconds to Choose!", "Rock Paper Scissors", RockPaperScissors, 60) + var/RPSchoice = tgui_alert(affected_mob, "Janken Time! You have 60 Seconds to Choose!", "Rock Paper Scissors", list("rock" , "paper" , "scissors"), 60) if(QDELETED(affected_mob) || (timeisticking+(1.1 MINUTES) < world.time)) reaping = FALSE return //good job, you ruined it @@ -59,36 +60,33 @@ to_chat(affected_mob, 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(affected_mob, span_hierophant("You tie, and the malevolent spirits disappear... for now.")) - reaping = FALSE - else if(RockPaperScissors[RPSchoice] == grim) //You lost! - to_chat(affected_mob, span_hierophant("You lose, and the malevolent spirits smirk eerily as they surround your body.")) - affected_mob.investigate_log("has lost rock paper scissors with the grim reaper and been dusted.", INVESTIGATE_DEATHS) - affected_mob.dust() - return - else //VICTORY ROYALE - to_chat(affected_mob, span_hierophant("You win, and the malevolent spirits fade away as well as your wounds.")) - affected_mob.client.give_award(/datum/award/achievement/misc/helbitaljanken, affected_mob) - affected_mob.revive(HEAL_ALL) - holder.del_reagent(type) - return - - ..() - return + switch(rand(1,3)) + if(1) //You Tied! + to_chat(affected_mob, span_hierophant("You tie, and the malevolent spirits disappear... for now.")) + reaping = FALSE + if(2) //You lost! + to_chat(affected_mob, span_hierophant("You lose, and the malevolent spirits smirk eerily as they surround your body.")) + affected_mob.investigate_log("has lost rock paper scissors with the grim reaper and been dusted.", INVESTIGATE_DEATHS) + affected_mob.dust() + return + if(3) //VICTORY ROYALE + to_chat(affected_mob, span_hierophant("You win, and the malevolent spirits fade away as well as your wounds.")) + affected_mob.client.give_award(/datum/award/achievement/jobs/helbitaljanken, affected_mob) + affected_mob.revive(HEAL_ALL) + holder.del_reagent(type) + return + return ..() || . /datum/reagent/medicine/c2/helbital/overdose_process(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(!helbent) affected_mob.apply_necropolis_curse(CURSE_WASTING | CURSE_BLINDING) helbent = TRUE - ..() - return TRUE -/datum/reagent/medicine/c2/helbital/on_mob_delete(mob/living/L) +/datum/reagent/medicine/c2/helbital/on_mob_delete(mob/living/affected_mob) + . = ..() if(helbent) - L.remove_status_effect(/datum/status_effect/necropolis_curse) - ..() + affected_mob.remove_status_effect(/datum/status_effect/necropolis_curse) /datum/reagent/medicine/c2/libital //messes with your liber name = "Libital" @@ -100,10 +98,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/c2/libital/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.3 * REM * seconds_per_tick, required_organtype = affected_organtype) - affected_mob.adjustBruteLoss(-3 * REM * normalise_creation_purity() * seconds_per_tick, required_bodytype = affected_bodytype) - ..() - return TRUE + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.3 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + need_mob_update += affected_mob.adjustBruteLoss(-3 * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/c2/probital name = "Probital" @@ -117,7 +117,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/c2/probital/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustBruteLoss(-2.25 * REM * normalise_creation_purity() * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustBruteLoss(-2.25 * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) var/ooo_youaregettingsleepy = 3.5 switch(round(affected_mob.getStaminaLoss())) if(10 to 40) @@ -126,20 +128,22 @@ ooo_youaregettingsleepy = 2.5 if(61 to 200) //you really can only go to 120 ooo_youaregettingsleepy = 2 - affected_mob.adjustStaminaLoss(ooo_youaregettingsleepy * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - . = TRUE + need_mob_update += affected_mob.adjustStaminaLoss(ooo_youaregettingsleepy * REM * seconds_per_tick, updating_stamina = FALSE) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/c2/probital/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustStaminaLoss(3 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustStaminaLoss(3 * REM * seconds_per_tick, updating_stamina = FALSE) if(affected_mob.getStaminaLoss() >= 80) affected_mob.adjust_drowsiness(2 SECONDS * REM * seconds_per_tick) if(affected_mob.getStaminaLoss() >= 100) to_chat(affected_mob,span_warning("You feel more tired than you usually do, perhaps if you rest your eyes for a bit...")) - affected_mob.adjustStaminaLoss(-100, TRUE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustStaminaLoss(-100, updating_stamina = FALSE) // Don't add the biotype parameter here as it results in infinite sleep and chat spam. affected_mob.Sleeping(10 SECONDS) - ..() - . = TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/c2/probital/on_transfer(atom/A, methods=INGEST, trans_volume) if(!(methods & INGEST) || (!iscarbon(A) && !istype(A, /obj/item/organ/internal/stomach)) ) @@ -163,10 +167,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/c2/lenturi/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustFireLoss(-3 * REM * normalise_creation_purity() * seconds_per_tick, required_bodytype = affected_bodytype) - affected_mob.adjustOrganLoss(ORGAN_SLOT_STOMACH, 0.4 * REM * seconds_per_tick, required_organtype = affected_organtype) - ..() - return TRUE + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustFireLoss(-3 * REM * normalise_creation_purity() * seconds_per_tick, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_STOMACH, 0.4 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/c2/aiuri name = "Aiuri" @@ -179,10 +185,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/c2/aiuri/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustFireLoss(-2 * REM * normalise_creation_purity() * seconds_per_tick, required_bodytype = affected_bodytype) - affected_mob.adjustOrganLoss(ORGAN_SLOT_EYES, 0.25 * REM * seconds_per_tick, required_organtype = affected_organtype) - ..() - return TRUE + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustFireLoss(-2 * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_EYES, 0.25 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/c2/hercuri name = "Hercuri" @@ -197,18 +205,20 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/c2/hercuri/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update if(affected_mob.getFireLoss() > 50) - affected_mob.adjustFireLoss(-2 * REM * seconds_per_tick * normalise_creation_purity(), FALSE, required_bodytype = affected_bodytype) + need_mob_update = affected_mob.adjustFireLoss(-2 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_bodytype = affected_bodytype) else - affected_mob.adjustFireLoss(-1.25 * REM * seconds_per_tick * normalise_creation_purity(), FALSE, required_bodytype = affected_bodytype) + need_mob_update = affected_mob.adjustFireLoss(-1.25 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_bodytype = affected_bodytype) affected_mob.adjust_bodytemperature(rand(-25,-5) * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick, 50) if(ishuman(affected_mob)) var/mob/living/carbon/human/humi = affected_mob humi.adjust_coretemperature(rand(-25,-5) * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick, 50) affected_mob.reagents?.chem_temp += (-10 * REM * seconds_per_tick) affected_mob.adjust_fire_stacks(-1 * REM * seconds_per_tick) - ..() - . = TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/c2/hercuri/expose_mob(mob/living/carbon/exposed_mob, methods=VAPOR, reac_volume) . = ..() @@ -221,11 +231,11 @@ exposed_mob.extinguish_mob() /datum/reagent/medicine/c2/hercuri/overdose_process(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_bodytemperature(-10 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick, 50) //chilly chilly if(ishuman(affected_mob)) var/mob/living/carbon/human/humi = affected_mob humi.adjust_coretemperature(-10 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick, 50) - ..() /******OXY******/ @@ -244,20 +254,22 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/c2/convermol/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) - var/oxycalc = 2.5 * REM * current_cycle + . = ..() + var/oxycalc = 2.5 * REM * (current_cycle-1) if(!overdosed) oxycalc = min(oxycalc, affected_mob.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. - affected_mob.adjustOxyLoss(-oxycalc * seconds_per_tick * normalise_creation_purity(), FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustToxLoss(oxycalc * seconds_per_tick / CONVERMOL_RATIO, FALSE, required_biotype = affected_biotype) - if(SPT_PROB(current_cycle / 2, seconds_per_tick) && affected_mob.losebreath) + var/need_mob_update + need_mob_update = affected_mob.adjustOxyLoss(-oxycalc * seconds_per_tick * normalise_creation_purity(), FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustToxLoss(oxycalc * seconds_per_tick / CONVERMOL_RATIO, updating_health = FALSE, required_biotype = affected_biotype) + if(SPT_PROB((current_cycle-1) / 2, seconds_per_tick) && affected_mob.losebreath) affected_mob.losebreath-- - ..() - return TRUE + need_mob_update = TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/c2/convermol/overdose_process(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) + . = ..() metabolization_rate += 2.5 * REAGENTS_METABOLISM - ..() - return TRUE #undef CONVERMOL_RATIO @@ -274,20 +286,22 @@ COOLDOWN_DECLARE(drowsycd) /datum/reagent/medicine/c2/tirimol/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOxyLoss(-3 * REM * seconds_per_tick * normalise_creation_purity(), required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustStaminaLoss(2 * REM * seconds_per_tick, required_biotype = affected_biotype) + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustOxyLoss(-3 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustStaminaLoss(2 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) if(drowsycd && COOLDOWN_FINISHED(src, drowsycd)) affected_mob.adjust_drowsiness(20 SECONDS) COOLDOWN_START(src, drowsycd, 45 SECONDS) else if(!drowsycd) COOLDOWN_START(src, drowsycd, 15 SECONDS) - ..() - return TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH -/datum/reagent/medicine/c2/tirimol/on_mob_end_metabolize(mob/living/L) - if(current_cycle > 20) - L.Sleeping(10 SECONDS) - ..() +/datum/reagent/medicine/c2/tirimol/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() + if(current_cycle > 21) + affected_mob.Sleeping(10 SECONDS) /******TOXIN******/ /*Suffix: -iver*/ @@ -308,14 +322,16 @@ rads_heal_threshold = rand(rads_heal_threshold - 50, rads_heal_threshold + 50) // Basically this means 50K and below will always give the radiation heal, and upto 150K could. Calculated once. /datum/reagent/medicine/c2/seiver/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) + . = ..() var/chemtemp = min(holder.chem_temp, 1000) chemtemp = chemtemp ? chemtemp : T0C //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 * seconds_per_tick * normalise_creation_purity() //max 2.5 tox healing per second + var/need_mob_update if(toxcalc > 0) - affected_mob.adjustToxLoss(-toxcalc, required_biotype = affected_biotype) + need_mob_update = affected_mob.adjustToxLoss(-toxcalc, updating_health = FALSE, required_biotype = affected_biotype) healypoints += toxcalc //and you're cold @@ -324,16 +340,16 @@ radcalc *= normalise_creation_purity() // extra rad healing if you are SUPER cold if(chemtemp < rads_heal_threshold*0.1) - affected_mob.adjustToxLoss(-radcalc * 0.9, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustToxLoss(-radcalc * 0.9, updating_health = FALSE, required_biotype = affected_biotype) else if(chemtemp < rads_heal_threshold) - affected_mob.adjustToxLoss(-radcalc * 0.75, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustToxLoss(-radcalc * 0.75, updating_health = FALSE, required_biotype = affected_biotype) healypoints += (radcalc / 5) //you're yes and... oh no! healypoints = round(healypoints, 0.1) - affected_mob.adjustOrganLoss(ORGAN_SLOT_HEART, healypoints / 5, required_organtype = affected_organtype) - ..() - return TRUE + affected_mob.adjustOrganLoss(ORGAN_SLOT_HEART, healypoints / 5, required_organ_flag = affected_organ_flags) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/c2/multiver //enhanced with MULTIple medicines name = "Multiver" @@ -344,6 +360,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/c2/multiver/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) + . = ..() var/medibonus = 0 //it will always have itself which makes it REALLY start @ 1 for(var/r in affected_mob.reagents.reagent_list) var/datum/reagent/the_reagent = r @@ -351,8 +368,9 @@ medibonus += 1 if(creation_purity >= 1) //Perfectly pure multivers gives a bonus of 2! medibonus += 1 - affected_mob.adjustToxLoss(-0.5 * min(medibonus, 3 * normalise_creation_purity()) * REM * seconds_per_tick, required_biotype = affected_biotype) //not great at healing but if you have nothing else it will work - affected_mob.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5 * REM * seconds_per_tick, required_organtype = affected_organtype) //kills at 40u + var/need_mob_update + need_mob_update = affected_mob.adjustToxLoss(-0.5 * min(medibonus, 3 * normalise_creation_purity()) * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) //not great at healing but if you have nothing else it will work + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) //kills at 40u for(var/r2 in affected_mob.reagents.reagent_list) var/datum/reagent/the_reagent2 = r2 if(the_reagent2 == src) @@ -361,8 +379,8 @@ if(medibonus >= 3 && istype(the_reagent2, /datum/reagent/medicine)) //3 unique meds (2+multiver) | (1 + pure multiver) will make it not purge medicines continue affected_mob.reagents.remove_reagent(the_reagent2.type, amount2purge * REM * seconds_per_tick) - ..() - return TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH // Antitoxin binds plants pretty well. So the tox goes significantly down /datum/reagent/medicine/c2/multiver/on_hydroponics_apply(obj/machinery/hydroponics/mytray, mob/user) @@ -386,7 +404,7 @@ 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(), FALSE, required_biotype = affected_biotype) //This is to promote iv pole use for that chemotherapy feel. + C.adjustToxLoss((-1.5 * min(2, trans_volume) * REM) * normalise_creation_purity(), required_biotype = affected_biotype) //This is to promote iv pole use for that chemotherapy feel. var/obj/item/organ/internal/liver/L = C.organs_slot[ORGAN_SLOT_LIVER] if(!L || L.organ_flags & ORGAN_FAILING) return @@ -396,22 +414,24 @@ ..() /datum/reagent/medicine/c2/syriniver/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.8 * REM * seconds_per_tick, required_organtype = affected_organtype) - affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.8 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + need_mob_update += affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) for(var/datum/reagent/R in affected_mob.reagents.reagent_list) if(issyrinormusc(R)) continue affected_mob.reagents.remove_reagent(R.type, 0.4 * REM * seconds_per_tick) - ..() - . = TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/c2/syriniver/overdose_process(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5 * REM * seconds_per_tick, required_organtype = affected_organtype) + . = ..() + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + . = UPDATE_MOB_HEALTH affected_mob.adjust_disgust(3 * REM * seconds_per_tick) affected_mob.reagents.add_reagent(/datum/reagent/medicine/c2/musiver, 0.225 * REM * seconds_per_tick) - ..() - . = TRUE /datum/reagent/medicine/c2/musiver //MUScles name = "Musiver" @@ -425,30 +445,32 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/c2/musiver/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.1 * REM * seconds_per_tick, required_organtype = affected_organtype) - affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick * normalise_creation_purity(), FALSE, required_biotype = affected_biotype) + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.1 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + need_mob_update += affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_biotype = affected_biotype) for(var/datum/reagent/R in affected_mob.reagents.reagent_list) if(issyrinormusc(R)) continue affected_mob.reagents.remove_reagent(R.type, 0.2 * REM * seconds_per_tick) - ..() - . = TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/c2/musiver/overdose_start(mob/living/carbon/affected_mob) + . = ..() trauma = new() affected_mob.gain_trauma(trauma, TRAUMA_RESILIENCE_ABSOLUTE) - ..() -/datum/reagent/medicine/c2/musiver/on_mob_delete(mob/living/carbon/affected_mob) +/datum/reagent/medicine/c2/musiver/on_mob_delete(mob/living/affected_mob) + . = ..() if(trauma) QDEL_NULL(trauma) - return ..() /datum/reagent/medicine/c2/musiver/overdose_process(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5 * REM * seconds_per_tick, required_organtype = affected_organtype) + . = ..() + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + . = UPDATE_MOB_HEALTH affected_mob.adjust_disgust(3 * REM * seconds_per_tick) - ..() - . = TRUE #undef issyrinormusc /******COMBOS******/ @@ -470,14 +492,19 @@ show_message = 0 if(!(methods & (PATCH|TOUCH|VAPOR))) return - var/harmies = min(carbies.getBruteLoss(), carbies.adjustBruteLoss(-1.25 * reac_volume, required_bodytype = affected_bodytype)*-1) - var/burnies = min(carbies.getFireLoss(), carbies.adjustFireLoss(-1.25 * reac_volume, required_bodytype = affected_bodytype)*-1) + var/harmies = min(carbies.getBruteLoss(), carbies.adjustBruteLoss(-1.25 * reac_volume, updating_health = FALSE, required_bodytype = affected_bodytype)*-1) + var/burnies = min(carbies.getFireLoss(), carbies.adjustFireLoss(-1.25 * reac_volume, updating_health = FALSE, required_bodytype = affected_bodytype)*-1) for(var/i in carbies.all_wounds) var/datum/wound/iter_wound = i iter_wound.on_synthflesh(reac_volume) - carbies.adjustToxLoss((harmies+burnies)*(0.5 + (0.25*(1-creation_purity))), required_biotype = affected_biotype) //0.5 - 0.75 + var/need_mob_update = harmies + burnies + need_mob_update += carbies.adjustToxLoss((harmies+burnies)*(0.5 + (0.25*(1-creation_purity))), updating_health = FALSE, required_biotype = affected_biotype) //0.5 - 0.75 + + if(need_mob_update) + carbies.updatehealth() if(show_message) to_chat(carbies, span_danger("You feel your burns and bruises healing! It stings like hell!")) + carbies.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) @@ -522,43 +549,50 @@ user.throw_alert("penthrite", /atom/movable/screen/alert/penthrite) user.add_traits(subject_traits, type) -/datum/reagent/medicine/c2/penthrite/on_mob_life(mob/living/carbon/human/H, seconds_per_tick, times_fired) - H.adjustOrganLoss(ORGAN_SLOT_STOMACH, 0.25 * REM * seconds_per_tick, required_organtype = affected_organtype) - if(H.health <= HEALTH_THRESHOLD_CRIT && H.health > (H.crit_threshold + HEALTH_THRESHOLD_FULLCRIT * (2 * normalise_creation_purity()))) //we cannot save someone below our lowered crit threshold. +/datum/reagent/medicine/c2/penthrite/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_STOMACH, 0.25 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + if(affected_mob.health <= HEALTH_THRESHOLD_CRIT && affected_mob.health > (affected_mob.crit_threshold + HEALTH_THRESHOLD_FULLCRIT * (2 * normalise_creation_purity()))) //we cannot save someone below our lowered crit threshold. - H.adjustToxLoss(-2 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - H.adjustBruteLoss(-2 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - H.adjustFireLoss(-2 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - H.adjustOxyLoss(-6 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustToxLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustBruteLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustOxyLoss(-6 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - H.losebreath = 0 + affected_mob.losebreath = 0 - H.adjustOrganLoss(ORGAN_SLOT_HEART, max(volume/10, 1) * REM * seconds_per_tick, required_organtype = affected_organtype) // your heart is barely keeping up! + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_HEART, max(volume/10, 1) * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) // your heart is barely keeping up! - H.set_jitter_if_lower(rand(0 SECONDS, 4 SECONDS) * REM * seconds_per_tick) - H.set_dizzy_if_lower(rand(0 SECONDS, 4 SECONDS) * REM * seconds_per_tick) + affected_mob.set_jitter_if_lower(rand(0 SECONDS, 4 SECONDS) * REM * seconds_per_tick) + affected_mob.set_dizzy_if_lower(rand(0 SECONDS, 4 SECONDS) * REM * seconds_per_tick) if(SPT_PROB(18, seconds_per_tick)) - to_chat(H,span_danger("Your body is trying to give up, but your heart is still beating!")) + to_chat(affected_mob,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) + if(affected_mob.health <= (affected_mob.crit_threshold + HEALTH_THRESHOLD_FULLCRIT*(2*normalise_creation_purity()))) //certain death below this threshold + REMOVE_TRAIT(affected_mob, TRAIT_STABLEHEART, type) //we have to remove the stable heart trait before we give them a heart attack + to_chat(affected_mob,span_danger("You feel something rupturing inside your chest!")) + affected_mob.emote("scream") + affected_mob.set_heartattack(TRUE) volume = 0 - . = ..() + if(need_mob_update) + return UPDATE_MOB_HEALTH -/datum/reagent/medicine/c2/penthrite/on_mob_end_metabolize(mob/living/user) - user.clear_alert("penthrite") - user.remove_traits(subject_traits, type) +/datum/reagent/medicine/c2/penthrite/on_mob_end_metabolize(mob/living/affected_mob) . = ..() + affected_mob.clear_alert("penthrite") + affected_mob.remove_traits(subject_traits, type) -/datum/reagent/medicine/c2/penthrite/overdose_process(mob/living/carbon/human/H, seconds_per_tick, times_fired) - REMOVE_TRAIT(H, TRAIT_STABLEHEART, type) - H.adjustStaminaLoss(10 * REM * seconds_per_tick, required_biotype = affected_biotype) - H.adjustOrganLoss(ORGAN_SLOT_HEART, 10 * REM * seconds_per_tick, required_organtype = affected_organtype) - H.set_heartattack(TRUE) +/datum/reagent/medicine/c2/penthrite/overdose_process(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) + . = ..() + REMOVE_TRAIT(affected_mob, TRAIT_STABLEHEART, type) + var/need_mob_update + need_mob_update = affected_mob.adjustStaminaLoss(10 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_HEART, 10 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + need_mob_update += affected_mob.set_heartattack(TRUE) + if(need_mob_update) + return UPDATE_MOB_HEALTH /******NICHE******/ diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm deleted file mode 100644 index 418eceb8a977a..0000000000000 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ /dev/null @@ -1,1682 +0,0 @@ - - -///////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////// DRINKS BELOW, Beer is up there though, along with cola. Cap'n Pete's Cuban Spiced Rum//////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////////////////////////// - -/datum/reagent/consumable/orangejuice - name = "Orange Juice" - description = "Both delicious AND rich in Vitamin C, what more do you need?" - color = "#E78108" // rgb: 231, 129, 8 - taste_description = "oranges" - ph = 3.3 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - default_container = /obj/item/reagent_containers/cup/glass/bottle/juice/orangejuice - -/datum/glass_style/has_foodtype/drinking_glass/orangejuice - required_drink_type = /datum/reagent/consumable/orangejuice - name = "glass of orange juice" - desc = "Vitamins! Yay!" - icon_state = "glass_orange" - drink_type = FRUIT | BREAKFAST - -/datum/glass_style/has_foodtype/juicebox/orangejuice - required_drink_type = /datum/reagent/consumable/orangejuice - name = "orange juice box" - desc = "A great source of vitamins. Stay healthy!" - icon_state = "orangebox" - drink_type = FRUIT | BREAKFAST - -/datum/reagent/consumable/orangejuice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(affected_mob.getOxyLoss() && SPT_PROB(16, seconds_per_tick)) - affected_mob.adjustOxyLoss(-1, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - . = TRUE - ..() - -/datum/reagent/consumable/tomatojuice - name = "Tomato Juice" - description = "Tomatoes made into juice. What a waste of big, juicy tomatoes, huh?" - color = "#731008" // rgb: 115, 16, 8 - taste_description = "tomatoes" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - default_container = /obj/item/reagent_containers/cup/glass/bottle/juice/tomatojuice - -/datum/glass_style/drinking_glass/tomatojuice - required_drink_type = /datum/reagent/consumable/tomatojuice - name = "glass of tomato juice" - desc = "Are you sure this is tomato juice?" - icon_state = "glass_red" - -/datum/reagent/consumable/tomatojuice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(affected_mob.getFireLoss() && SPT_PROB(10, seconds_per_tick)) - affected_mob.heal_bodypart_damage(0, 1) - . = TRUE - ..() - -/datum/reagent/consumable/limejuice - name = "Lime Juice" - description = "The sweet-sour juice of limes." - color = "#365E30" // rgb: 54, 94, 48 - taste_description = "unbearable sourness" - ph = 2.2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - default_container = /obj/item/reagent_containers/cup/glass/bottle/juice/limejuice - -/datum/glass_style/drinking_glass/limejuice - required_drink_type = /datum/reagent/consumable/limejuice - name = "glass of lime juice" - desc = "A glass of sweet-sour lime juice." - icon_state = "glass_green" - -/datum/reagent/consumable/limejuice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(affected_mob.getToxLoss() && SPT_PROB(10, seconds_per_tick)) - affected_mob.adjustToxLoss(-1, FALSE, required_biotype = affected_biotype) - . = TRUE - ..() - -/datum/reagent/consumable/carrotjuice - name = "Carrot Juice" - description = "It is just like a carrot but without crunching." - color = "#973800" // rgb: 151, 56, 0 - taste_description = "carrots" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/carrotjuice - required_drink_type = /datum/reagent/consumable/carrotjuice - name = "glass of carrot juice" - desc = "It's just like a carrot but without crunching." - icon_state = "carrotjuice" - -/datum/reagent/consumable/carrotjuice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_eye_blur(-2 SECONDS * REM * seconds_per_tick) - affected_mob.adjust_temp_blindness(-2 SECONDS * REM * seconds_per_tick) - switch(current_cycle) - if(1 to 20) - //nothing - if(21 to 110) - if(SPT_PROB(100 * (1 - (sqrt(110 - current_cycle) / 10)), seconds_per_tick)) - affected_mob.adjustOrganLoss(ORGAN_SLOT_EYES, -2) - if(110 to INFINITY) - affected_mob.adjustOrganLoss(ORGAN_SLOT_EYES, -2) - return ..() - -/datum/reagent/consumable/berryjuice - name = "Berry Juice" - description = "A delicious blend of several different kinds of berries." - color = "#863333" // rgb: 134, 51, 51 - taste_description = "berries" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/berryjuice - required_drink_type = /datum/reagent/consumable/berryjuice - name = "glass of berry juice" - desc = "Berry juice. Or maybe it's jam. Who cares?" - icon_state = "berryjuice" - -/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/glass_style/has_foodtype/juicebox/applejuice - required_drink_type = /datum/reagent/consumable/applejuice - name = "apple juice box" - desc = "Sweet apple juice. Don't be late for school!" - icon_state = "juicebox" - drink_type = FRUIT - -/datum/reagent/consumable/poisonberryjuice - name = "Poison Berry Juice" - description = "A tasty juice blended from various kinds of very deadly and toxic berries." - color = "#863353" // rgb: 134, 51, 83 - taste_description = "berries" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/poisonberryjuice - required_drink_type = /datum/reagent/consumable/poisonberryjuice - name = "glass of berry juice" - desc = "Berry juice. Or maybe it's poison. Who cares?" - icon_state = "poisonberryjuice" - -/datum/reagent/consumable/poisonberryjuice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - . = TRUE - ..() - -/datum/reagent/consumable/watermelonjuice - name = "Watermelon Juice" - description = "Delicious juice made from watermelon." - color = "#863333" // rgb: 134, 51, 51 - taste_description = "juicy watermelon" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/watermelonjuice - required_drink_type = /datum/reagent/consumable/watermelonjuice - name = "glass of watermelon juice" - desc = "A glass of watermelon juice." - icon_state = "glass_red" - -/datum/reagent/consumable/lemonjuice - name = "Lemon Juice" - description = "This juice is VERY sour." - color = "#863333" // rgb: 175, 175, 0 - taste_description = "sourness" - ph = 2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/lemonjuice - required_drink_type = /datum/reagent/consumable/lemonjuice - name = "glass of lemon juice" - desc = "Sour..." - icon_state = "lemonglass" - -/datum/reagent/consumable/banana - name = "Banana Juice" - description = "The raw essence of a banana. HONK" - color = "#863333" // rgb: 175, 175, 0 - taste_description = "banana" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/banana - required_drink_type = /datum/reagent/consumable/banana - name = "glass of banana juice" - desc = "The raw essence of a banana. HONK." - icon_state = "banana" - -/datum/reagent/consumable/banana/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) - if((liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) || ismonkey(affected_mob)) - affected_mob.heal_bodypart_damage(1 * REM * seconds_per_tick, 1 * REM * seconds_per_tick) - . = TRUE - ..() - -/datum/reagent/consumable/nothing - name = "Nothing" - description = "Absolutely nothing." - taste_description = "nothing" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/shot_glass/nothing - required_drink_type = /datum/reagent/consumable/nothing - icon_state = "shotglass" - -/datum/glass_style/drinking_glass/nothing - required_drink_type = /datum/reagent/consumable/nothing - name = "nothing" - desc = "Absolutely nothing." - icon_state = "nothing" - -/datum/reagent/consumable/nothing/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - if(ishuman(drinker) && HAS_TRAIT(drinker, TRAIT_MIMING)) - drinker.set_silence_if_lower(MIMEDRINK_SILENCE_DURATION) - drinker.heal_bodypart_damage(1 * REM * seconds_per_tick, 1 * REM * seconds_per_tick) - . = TRUE - ..() - -/datum/reagent/consumable/laughter - name = "Laughter" - description = "Some say that this is the best medicine, but recent studies have proven that to be untrue." - metabolization_rate = INFINITY - color = "#FF4DD2" - taste_description = "laughter" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/consumable/laughter/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.emote("laugh") - affected_mob.add_mood_event("chemical_laughter", /datum/mood_event/chemical_laughter) - ..() - -/datum/reagent/consumable/superlaughter - name = "Super Laughter" - description = "Funny until you're the one laughing." - metabolization_rate = 1.5 * REAGENTS_METABOLISM - color = "#FF4DD2" - taste_description = "laughter" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/consumable/superlaughter/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(SPT_PROB(16, seconds_per_tick)) - affected_mob.visible_message(span_danger("[affected_mob] bursts out into a fit of uncontrollable laughter!"), span_userdanger("You burst out in a fit of uncontrollable laughter!")) - affected_mob.Stun(5) - affected_mob.add_mood_event("chemical_laughter", /datum/mood_event/chemical_superlaughter) - ..() - -/datum/reagent/consumable/potato_juice - name = "Potato Juice" - description = "Juice of the potato. Bleh." - nutriment_factor = 2 * REAGENTS_METABOLISM - color = "#302000" // rgb: 48, 32, 0 - taste_description = "irish sadness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/potato_juice - required_drink_type = /datum/reagent/consumable/potato_juice - name = "glass of potato juice" - desc = "Bleh..." - icon_state = "glass_brown" - -/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/glass_style/has_foodtype/juicebox/grapejuice - required_drink_type = /datum/reagent/consumable/grapejuice - name = "grape juice box" - desc = "Tasty grape juice in a fun little container. Non-alcoholic!" - icon_state = "grapebox" - drink_type = FRUIT - -/datum/reagent/consumable/plumjuice - name = "Plum Juice" - description = "Refreshing and slightly acidic beverage." - color = "#b6062c" - taste_description = "plums" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/has_foodtype/drinking_glass/plumjuice - required_drink_type = /datum/reagent/consumable/plumjuice - name = "glass of plum juice" - desc = "Noice." - icon_state = "plumjuiceglass" - drink_type = FRUIT - -/datum/reagent/consumable/milk - name = "Milk" - description = "An opaque white liquid produced by the mammary glands of mammals." - color = "#DFDFDF" // rgb: 223, 223, 223 - taste_description = "milk" - ph = 6.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - default_container = /obj/item/reagent_containers/condiment/milk - -/datum/glass_style/has_foodtype/drinking_glass/milk - required_drink_type = /datum/reagent/consumable/milk - name = "glass of milk" - desc = "White and nutritious goodness!" - icon_state = "glass_white" - drink_type = DAIRY | BREAKFAST - -/datum/glass_style/has_foodtype/juicebox/milk - required_drink_type = /datum/reagent/consumable/milk - name = "carton of milk" - desc = "An excellent source of calcium for growing space explorers." - icon_state = "milkbox" - drink_type = DAIRY | BREAKFAST - -// Milk is good for humans, but bad for plants. -// The sugars cannot be used by plants, and the milk fat harms growth. Except shrooms. -/datum/reagent/consumable/milk/on_hydroponics_apply(obj/machinery/hydroponics/mytray, mob/user) - mytray.adjust_waterlevel(round(volume * 0.3)) - var/obj/item/seeds/myseed = mytray.myseed - if(isnull(myseed) || myseed.get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism)) - return - myseed.adjust_potency(-round(volume * 0.5)) - -/datum/reagent/consumable/milk/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(affected_mob.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) - affected_mob.heal_bodypart_damage(1,0) - . = TRUE - if(holder.has_reagent(/datum/reagent/consumable/capsaicin)) - holder.remove_reagent(/datum/reagent/consumable/capsaicin, 1 * seconds_per_tick) - ..() - -/datum/reagent/consumable/soymilk - name = "Soy Milk" - description = "An opaque white liquid made from soybeans." - color = "#DFDFC7" // rgb: 223, 223, 199 - taste_description = "soy milk" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - default_container = /obj/item/reagent_containers/condiment/soymilk - -/datum/glass_style/drinking_glass/soymilk - required_drink_type = /datum/reagent/consumable/soymilk - name = "glass of soy milk" - desc = "White and nutritious soy goodness!" - icon_state = "glass_white" - -/datum/reagent/consumable/soymilk/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(affected_mob.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) - affected_mob.heal_bodypart_damage(1, 0) - . = TRUE - ..() - -/datum/reagent/consumable/cream - name = "Cream" - description = "The fatty, still liquid part of milk. Why don't you mix this with sum scotch, eh?" - color = "#DFD7AF" // rgb: 223, 215, 175 - taste_description = "creamy milk" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - default_container = /obj/item/reagent_containers/cup/glass/bottle/juice/cream - -/datum/glass_style/drinking_glass/cream - required_drink_type = /datum/reagent/consumable/cream - name = "glass of cream" - desc = "Ewwww..." - icon_state = "glass_white" - -/datum/reagent/consumable/cream/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(affected_mob.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) - affected_mob.heal_bodypart_damage(1, 0) - . = TRUE - ..() - -/datum/reagent/consumable/coffee - name = "Coffee" - description = "Coffee is a brewed drink prepared from roasted seeds, commonly called coffee beans, of the coffee plant." - color = "#482000" // rgb: 72, 32, 0 - nutriment_factor = 0 - overdose_threshold = 80 - taste_description = "bitterness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_STOCK - -/datum/glass_style/drinking_glass/coffee - required_drink_type = /datum/reagent/consumable/coffee - name = "glass of coffee" - desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere." - icon_state = "glass_brown" - -/datum/reagent/consumable/coffee/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) - affected_mob.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) - ..() - -/datum/reagent/consumable/coffee/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_dizzy(-10 SECONDS * REM * seconds_per_tick) - affected_mob.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) - affected_mob.AdjustSleeping(-40 * REM * seconds_per_tick) - //310.15 is the normal bodytemp. - affected_mob.adjust_bodytemperature(25 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, affected_mob.get_body_temp_normal()) - if(holder.has_reagent(/datum/reagent/consumable/frostoil)) - holder.remove_reagent(/datum/reagent/consumable/frostoil, 5 * REM * seconds_per_tick) - ..() - . = TRUE - -/datum/reagent/consumable/tea - name = "Tea" - description = "Tasty black tea, it has antioxidants, it's good for you!" - color = "#101000" // rgb: 16, 16, 0 - nutriment_factor = 0 - taste_description = "tart black tea" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_STOCK - default_container = /obj/item/reagent_containers/cup/glass/mug/tea - -/datum/glass_style/drinking_glass/tea - required_drink_type = /datum/reagent/consumable/tea - name = "glass of tea" - desc = "Drinking it from here would not seem right." - icon_state = "teaglass" - -/datum/reagent/consumable/tea/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_dizzy(-4 SECONDS * REM * seconds_per_tick) - affected_mob.adjust_drowsiness(-2 SECONDS * REM * seconds_per_tick) - affected_mob.adjust_jitter(-6 SECONDS * REM * seconds_per_tick) - affected_mob.AdjustSleeping(-20 * REM * seconds_per_tick) - if(affected_mob.getToxLoss() && SPT_PROB(10, seconds_per_tick)) - affected_mob.adjustToxLoss(-1, FALSE, required_biotype = affected_biotype) - affected_mob.adjust_bodytemperature(20 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, affected_mob.get_body_temp_normal()) - ..() - . = TRUE - -/datum/reagent/consumable/lemonade - name = "Lemonade" - description = "Sweet, tangy lemonade. Good for the soul." - color = "#FFE978" - quality = DRINK_NICE - taste_description = "sunshine and summertime" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_EASY - -/datum/glass_style/drinking_glass/lemonade - required_drink_type = /datum/reagent/consumable/lemonade - name = "pitcher of lemonade" - desc = "This drink leaves you feeling nostalgic for some reason." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "lemonpitcher" - -/datum/reagent/consumable/tea/arnold_palmer - name = "Arnold Palmer" - description = "Encourages the patient to go golfing." - color = "#FFB766" - quality = DRINK_NICE - nutriment_factor = 10 * REAGENTS_METABOLISM - taste_description = "bitter tea" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/arnold_palmer - required_drink_type = /datum/reagent/consumable/tea/arnold_palmer - name = "Arnold Palmer" - desc = "You feel like taking a few golf swings after a few swigs of this." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "arnold_palmer" - -/datum/reagent/consumable/tea/arnold_palmer/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(SPT_PROB(2.5, seconds_per_tick)) - to_chat(affected_mob, 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/icecoffee - name = "Iced Coffee" - description = "Coffee and ice, refreshing and cool." - color = "#102838" // rgb: 16, 40, 56 - nutriment_factor = 0 - taste_description = "bitter coldness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/icecoffee - required_drink_type = /datum/reagent/consumable/icecoffee - name = "iced coffee" - desc = "A drink to perk you up and refresh you!" - icon = 'icons/obj/drinks/coffee.dmi' - icon_state = "icedcoffeeglass" - -/datum/reagent/consumable/icecoffee/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_dizzy(-10 SECONDS * REM * seconds_per_tick) - affected_mob.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) - affected_mob.AdjustSleeping(-40 * REM * seconds_per_tick) - affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - affected_mob.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) - ..() - . = 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" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/hot_ice_coffee - required_drink_type = /datum/reagent/consumable/hot_ice_coffee - name = "hot ice coffee" - desc = "A sharp drink - This can't have come cheap." - icon = 'icons/obj/drinks/coffee.dmi' - icon_state = "hoticecoffee" - -/datum/reagent/consumable/hot_ice_coffee/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_dizzy(-10 SECONDS * REM * seconds_per_tick) - affected_mob.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) - affected_mob.AdjustSleeping(-60 * REM * seconds_per_tick) - affected_mob.adjust_bodytemperature(-7 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - affected_mob.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) - affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - . = TRUE - -/datum/reagent/consumable/icetea - name = "Iced Tea" - description = "No relation to a certain rap artist/actor." - color = "#104038" // rgb: 16, 64, 56 - nutriment_factor = 0 - taste_description = "sweet tea" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/icetea - required_drink_type = /datum/reagent/consumable/icetea - name = "iced tea" - desc = "All natural, antioxidant-rich flavour sensation." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "icedteaglass" - -/datum/reagent/consumable/icetea/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_dizzy(-4 SECONDS * REM * seconds_per_tick) - affected_mob.adjust_drowsiness(-2 SECONDS * REM * seconds_per_tick) - affected_mob.AdjustSleeping(-40 * REM * seconds_per_tick) - if(affected_mob.getToxLoss() && SPT_PROB(10, seconds_per_tick)) - affected_mob.adjustToxLoss(-1, FALSE, required_biotype = affected_biotype) - affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - ..() - . = TRUE - -/datum/reagent/consumable/space_cola - name = "Cola" - description = "A refreshing beverage." - color = "#100800" // rgb: 16, 8, 0 - taste_description = "cola" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/space_cola - required_drink_type = /datum/reagent/consumable/space_cola - name = "glass of Space Cola" - desc = "A glass of refreshing Space Cola." - icon_state = "spacecola" - -/datum/reagent/consumable/space_cola/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_drowsiness(-10 SECONDS * REM * seconds_per_tick) - affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - ..() - -/datum/reagent/consumable/roy_rogers - name = "Roy Rogers" - description = "A sweet fizzy drink." - color = "#53090B" - quality = DRINK_GOOD - taste_description = "fruity overlysweet cola" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/roy_rogers - required_drink_type = /datum/reagent/consumable/roy_rogers - name = "Roy Rogers" - desc = "90% sugar in a glass." - icon_state = "royrogers" - -/datum/reagent/consumable/roy_rogers/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.set_jitter_if_lower(12 SECONDS * REM * seconds_per_tick) - affected_mob.adjust_drowsiness(-10 SECONDS * REM * seconds_per_tick) - affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - return ..() - -/datum/reagent/consumable/nuka_cola - name = "Nuka Cola" - description = "Cola, cola never changes." - color = "#100800" // rgb: 16, 8, 0 - quality = DRINK_VERYGOOD - taste_description = "the future" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/nuka_cola - required_drink_type = /datum/reagent/consumable/nuka_cola - name = "glass of Nuka Cola" - desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland." - icon = 'icons/obj/drinks/soda.dmi' - icon_state = "nuka_colaglass" - -/datum/reagent/consumable/nuka_cola/on_mob_metabolize(mob/living/affected_mob) - ..() - affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/reagent/nuka_cola) - -/datum/reagent/consumable/nuka_cola/on_mob_end_metabolize(mob/living/affected_mob) - affected_mob.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/nuka_cola) - ..() - -/datum/reagent/consumable/nuka_cola/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.set_jitter_if_lower(40 SECONDS * REM * seconds_per_tick) - affected_mob.set_drugginess(1 MINUTES * REM * seconds_per_tick) - affected_mob.adjust_dizzy(3 SECONDS * REM * seconds_per_tick) - affected_mob.remove_status_effect(/datum/status_effect/drowsiness) - affected_mob.AdjustSleeping(-40 * REM * seconds_per_tick) - affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - ..() - . = TRUE - -/datum/reagent/consumable/rootbeer - name = "root beer" - description = "A delightfully bubbly root beer, filled with so much sugar that it can actually speed up the user's trigger finger." - color = "#181008" // rgb: 24, 16, 8 - quality = DRINK_VERYGOOD - nutriment_factor = 10 * REAGENTS_METABOLISM - metabolization_rate = 2 * REAGENTS_METABOLISM - taste_description = "a monstrous sugar rush" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - /// If we activated the effect - var/effect_enabled = FALSE - -/datum/glass_style/drinking_glass/rootbeer - required_drink_type = /datum/reagent/consumable/rootbeer - name = "glass of root beer" - desc = "A glass of highly potent, incredibly sugary root beer." - icon_state = "spacecola" - -/datum/reagent/consumable/rootbeer/on_mob_end_metabolize(mob/living/affected_mob) - REMOVE_TRAIT(affected_mob, TRAIT_DOUBLE_TAP, type) - if(current_cycle > 10) - to_chat(affected_mob, span_warning("You feel kinda tired as your sugar rush wears off...")) - affected_mob.adjustStaminaLoss(min(80, current_cycle * 3), required_biotype = affected_biotype) - affected_mob.adjust_drowsiness(current_cycle * 2 SECONDS) - ..() - -/datum/reagent/consumable/rootbeer/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(current_cycle >= 3 && !effect_enabled) // takes a few seconds for the bonus to kick in to prevent microdosing - to_chat(affected_mob, span_notice("You feel your trigger finger getting itchy...")) - ADD_TRAIT(affected_mob, TRAIT_DOUBLE_TAP, type) - effect_enabled = TRUE - - affected_mob.set_jitter_if_lower(4 SECONDS * REM * seconds_per_tick) - if(prob(50)) - affected_mob.adjust_dizzy(2 SECONDS * REM * seconds_per_tick) - if(current_cycle > 10) - affected_mob.adjust_dizzy(3 SECONDS * REM * seconds_per_tick) - - ..() - . = TRUE - -/datum/reagent/consumable/grey_bull - name = "Grey Bull" - description = "Grey Bull, it gives you gloves!" - color = "#EEFF00" // rgb: 238, 255, 0 - quality = DRINK_VERYGOOD - taste_description = "carbonated oil" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/grey_bull - required_drink_type = /datum/reagent/consumable/grey_bull - name = "glass of Grey Bull" - desc = "Surprisingly it isn't grey." - icon_state = "grey_bull_glass" - -/datum/reagent/consumable/grey_bull/on_mob_metabolize(mob/living/carbon/affected_atom) - ..() - ADD_TRAIT(affected_atom, TRAIT_SHOCKIMMUNE, type) - var/obj/item/organ/internal/liver/liver = affected_atom.get_organ_slot(ORGAN_SLOT_LIVER) - if(HAS_TRAIT(liver, TRAIT_MAINTENANCE_METABOLISM)) - affected_atom.add_mood_event("maintenance_fun", /datum/mood_event/maintenance_high) - metabolization_rate *= 0.8 - -/datum/reagent/consumable/grey_bull/on_mob_end_metabolize(mob/living/affected_mob) - REMOVE_TRAIT(affected_mob, TRAIT_SHOCKIMMUNE, type) - ..() - -/datum/reagent/consumable/grey_bull/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.set_jitter_if_lower(40 SECONDS * REM * seconds_per_tick) - affected_mob.adjust_dizzy(2 SECONDS * REM * seconds_per_tick) - affected_mob.remove_status_effect(/datum/status_effect/drowsiness) - affected_mob.AdjustSleeping(-40 * REM * seconds_per_tick) - affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - ..() - -/datum/reagent/consumable/spacemountainwind - name = "SM Wind" - description = "Blows right through you like a space wind." - color = "#102000" // rgb: 16, 32, 0 - taste_description = "sweet citrus soda" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/spacemountainwind - required_drink_type = /datum/reagent/consumable/spacemountainwind - name = "glass of Space Mountain Wind" - desc = "Space Mountain Wind. As you know, there are no mountains in space, only wind." - icon_state = "Space_mountain_wind_glass" - -/datum/reagent/consumable/spacemountainwind/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_drowsiness(-14 SECONDS * REM * seconds_per_tick) - affected_mob.AdjustSleeping(-20 * REM * seconds_per_tick) - affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - affected_mob.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) - ..() - . = TRUE - -/datum/reagent/consumable/dr_gibb - name = "Dr. Gibb" - description = "A delicious blend of 42 different flavours." - color = "#102000" // rgb: 16, 32, 0 - taste_description = "cherry soda" // FALSE ADVERTISING - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/dr_gibb - required_drink_type = /datum/reagent/consumable/dr_gibb - name = "glass of Dr. Gibb" - desc = "Dr. Gibb. Not as dangerous as the container_name might imply." - icon_state = "dr_gibb_glass" - -/datum/reagent/consumable/dr_gibb/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_drowsiness(-12 SECONDS * REM * seconds_per_tick) - affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - ..() - -/datum/reagent/consumable/space_up - name = "Space-Up" - description = "Tastes like a hull breach in your mouth." - color = "#00FF00" // rgb: 0, 255, 0 - taste_description = "cherry soda" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/space_up - required_drink_type = /datum/reagent/consumable/space_up - name = "glass of Space-Up" - desc = "Space-up. It helps you keep your cool." - icon_state = "space-up_glass" - -/datum/reagent/consumable/space_up/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - ..() - -/datum/reagent/consumable/lemon_lime - name = "Lemon Lime" - description = "A tangy substance made of 0.5% natural citrus!" - color = "#8CFF00" // rgb: 135, 255, 0 - taste_description = "tangy lime and lemon soda" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/lemon_lime - required_drink_type = /datum/reagent/consumable/lemon_lime - name = "glass of lemon-lime" - desc = "You're pretty certain a real fruit has never actually touched this." - icon_state = "lemonlime" - -/datum/reagent/consumable/lemon_lime/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.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" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/pwr_game - required_drink_type = /datum/reagent/consumable/pwr_game - name = "glass of Pwr Game" - desc = "Goes well with a Vlad's salad." - icon_state = "pwrgame" - -/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/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - if(SPT_PROB(5, seconds_per_tick)) - affected_mob.mind?.adjust_experience(/datum/skill/gaming, 5) - ..() - -/datum/reagent/consumable/shamblers - name = "Shambler's Juice" - description = "~Shake me up some of that Shambler's Juice!~" - color = "#f00060" // rgb: 94, 0, 38 - taste_description = "carbonated metallic soda" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/shamblers - required_drink_type = /datum/reagent/consumable/shamblers - name = "glass of Shambler's juice" - desc = "Mmm mm, shambly." - icon_state = "shamblerjuice" - -/datum/reagent/consumable/shamblers/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - ..() - -/datum/reagent/consumable/sodawater - name = "Soda Water" - description = "A can of club soda. Why not make a scotch and soda?" - color = "#619494" // rgb: 97, 148, 148 - taste_description = "carbonated water" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/sodawater - required_drink_type = /datum/reagent/consumable/sodawater - name = "glass of soda water" - desc = "Soda water. Why not make a scotch and soda?" - icon_state = "glass_clearcarb" - -// A variety of nutrients are dissolved in club soda, without sugar. -// These nutrients include carbon, oxygen, hydrogen, phosphorous, potassium, sulfur and sodium, all of which are needed for healthy plant growth. -/datum/reagent/consumable/sodawater/on_hydroponics_apply(obj/machinery/hydroponics/mytray, mob/user) - mytray.adjust_waterlevel(round(volume)) - mytray.adjust_plant_health(round(volume * 0.1)) - -/datum/reagent/consumable/sodawater/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_dizzy(-10 SECONDS * REM * seconds_per_tick) - affected_mob.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) - affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - ..() - -/datum/reagent/consumable/tonic - name = "Tonic Water" - description = "It tastes strange but at least the quinine keeps the Space Malaria at bay." - color = "#0064C8" // rgb: 0, 100, 200 - taste_description = "tart and fresh" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/tonic - required_drink_type = /datum/reagent/consumable/tonic - name = "glass of tonic water" - desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away." - icon_state = "glass_clearcarb" - -/datum/reagent/consumable/tonic/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_dizzy(-10 SECONDS * REM * seconds_per_tick) - affected_mob.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) - affected_mob.AdjustSleeping(-40 * REM * seconds_per_tick) - affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - ..() - . = TRUE - -/datum/reagent/consumable/monkey_energy - name = "Monkey Energy" - description = "The only drink that will make you unleash the ape." - color = "#f39b03" // rgb: 243, 155, 3 - overdose_threshold = 60 - taste_description = "barbecue and nostalgia" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/monkey_energy - required_drink_type = /datum/reagent/consumable/monkey_energy - name = "glass of Monkey Energy" - desc = "You can unleash the ape, but without the pop of the can?" - icon_state = "monkey_energy_glass" - -/datum/reagent/consumable/monkey_energy/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.set_jitter_if_lower(80 SECONDS * REM * seconds_per_tick) - affected_mob.adjust_dizzy(2 SECONDS * REM * seconds_per_tick) - affected_mob.remove_status_effect(/datum/status_effect/drowsiness) - affected_mob.AdjustSleeping(-40 * REM * seconds_per_tick) - affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - ..() - -/datum/reagent/consumable/monkey_energy/on_mob_metabolize(mob/living/affected_mob) - ..() - if(ismonkey(affected_mob)) - affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/reagent/monkey_energy) - -/datum/reagent/consumable/monkey_energy/on_mob_end_metabolize(mob/living/affected_mob) - affected_mob.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/monkey_energy) - ..() - -/datum/reagent/consumable/monkey_energy/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) - if(SPT_PROB(7.5, seconds_per_tick)) - affected_mob.say(pick_list_replacements(BOOMER_FILE, "boomer"), forced = /datum/reagent/consumable/monkey_energy) - ..() - -/datum/reagent/consumable/ice - name = "Ice" - description = "Frozen water, your dentist wouldn't like you chewing this." - reagent_state = SOLID - color = "#619494" // rgb: 97, 148, 148 - taste_description = "ice" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - default_container = /obj/item/reagent_containers/cup/glass/ice - -/datum/glass_style/drinking_glass/ice - required_drink_type = /datum/reagent/consumable/ice - name = "glass of ice" - desc = "Generally, you're supposed to put something else in there too..." - icon_state = "iceglass" - -/datum/reagent/consumable/ice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.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." - color = "#cc6404" // rgb: 204,100,4 - quality = DRINK_NICE - taste_description = "creamy coffee" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_EASY - -/datum/glass_style/drinking_glass/soy_latte - required_drink_type = /datum/reagent/consumable/soy_latte - name = "soy latte" - desc = "A nice and refreshing beverage while you're reading." - icon = 'icons/obj/drinks/coffee.dmi' - icon_state = "soy_latte" - -/datum/reagent/consumable/soy_latte/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_dizzy(-10 SECONDS * REM * seconds_per_tick) - affected_mob.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) - affected_mob.SetSleeping(0) - affected_mob.adjust_bodytemperature(5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, affected_mob.get_body_temp_normal()) - affected_mob.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) - if(affected_mob.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) - affected_mob.heal_bodypart_damage(1,0) - ..() - . = TRUE - -/datum/reagent/consumable/cafe_latte - name = "Cafe Latte" - description = "A nice, strong and tasty beverage while you are reading." - color = "#cc6404" // rgb: 204,100,4 - quality = DRINK_NICE - taste_description = "bitter cream" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_EASY - -/datum/glass_style/drinking_glass/cafe_latte - required_drink_type = /datum/reagent/consumable/cafe_latte - name = "cafe latte" - desc = "A nice, strong and refreshing beverage while you're reading." - icon = 'icons/obj/drinks/coffee.dmi' - icon_state = "cafe_latte" - -/datum/reagent/consumable/cafe_latte/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_dizzy(-10 SECONDS * REM * seconds_per_tick) - affected_mob.adjust_drowsiness(-12 SECONDS * REM * seconds_per_tick) - affected_mob.SetSleeping(0) - affected_mob.adjust_bodytemperature(5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, affected_mob.get_body_temp_normal()) - affected_mob.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) - if(affected_mob.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) - affected_mob.heal_bodypart_damage(1, 0) - ..() - . = TRUE - -/datum/reagent/consumable/doctor_delight - name = "The Doctor's Delight" - description = "A gulp a day keeps the Medibot away! A mixture of juices that heals most damage types fairly quickly at the cost of hunger." - color = "#FF8CFF" // rgb: 255, 140, 255 - quality = DRINK_VERYGOOD - taste_description = "homely fruit" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/doctor_delight - required_drink_type = /datum/reagent/consumable/doctor_delight - name = "Doctor's Delight" - desc = "The space doctor's favorite. Guaranteed to restore bodily injury; side effects include cravings and hunger." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "doctorsdelightglass" - -/datum/reagent/consumable/doctor_delight/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustBruteLoss(-0.5 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustFireLoss(-0.5 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustToxLoss(-0.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustOxyLoss(-0.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - if(affected_mob.nutrition && (affected_mob.nutrition - 2 > 0)) - var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(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! - affected_mob.adjust_nutrition(-2 * REM * seconds_per_tick) - ..() - . = TRUE - -/datum/reagent/consumable/cinderella - name = "Cinderella" - description = "Most definitely a fruity alcohol cocktail to have while partying with your friends." - color = "#FF6A50" - quality = DRINK_VERYGOOD - taste_description = "sweet tangy fruit" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/cinderella - required_drink_type = /datum/reagent/consumable/cinderella - name = "Cinderella" - desc = "There is not a single drop of alcohol in this thing." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "cinderella" - -/datum/reagent/consumable/cinderella/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_disgust(-5 * REM * seconds_per_tick) - return ..() - -/datum/reagent/consumable/cherryshake - name = "Cherry Shake" - description = "A cherry flavored milkshake." - color = "#FFB6C1" - quality = DRINK_VERYGOOD - nutriment_factor = 8 * REAGENTS_METABOLISM - taste_description = "creamy tart cherry" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_MEDIUM - -/datum/glass_style/drinking_glass/cherryshake - required_drink_type = /datum/reagent/consumable/cherryshake - name = "cherry shake" - desc = "A cherry flavored milkshake." - icon = 'icons/obj/drinks/shakes.dmi' - icon_state = "cherryshake" - -/datum/reagent/consumable/bluecherryshake - name = "Blue Cherry Shake" - description = "An exotic milkshake." - color = "#00F1FF" - quality = DRINK_VERYGOOD - nutriment_factor = 8 * REAGENTS_METABOLISM - taste_description = "creamy blue cherry" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/bluecherryshake - required_drink_type = /datum/reagent/consumable/bluecherryshake - name = "blue cherry shake" - desc = "An exotic blue milkshake." - icon = 'icons/obj/drinks/shakes.dmi' - icon_state = "bluecherryshake" - -/datum/reagent/consumable/vanillashake - name = "Vanilla Shake" - description = "A vanilla flavored milkshake. The basics are still good." - color = "#E9D2B2" - quality = DRINK_VERYGOOD - nutriment_factor = 8 * REAGENTS_METABOLISM - taste_description = "sweet creamy vanilla" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_MEDIUM - -/datum/glass_style/drinking_glass/vanillashake - required_drink_type = /datum/reagent/consumable/vanillashake - name = "vanilla shake" - desc = "A vanilla flavored milkshake." - icon = 'icons/obj/drinks/shakes.dmi' - icon_state = "vanillashake" - -/datum/reagent/consumable/caramelshake - name = "Caramel Shake" - description = "A caramel flavored milkshake. Your teeth hurt looking at it." - color = "#E17C00" - quality = DRINK_GOOD - nutriment_factor = 10 * REAGENTS_METABOLISM - taste_description = "sweet rich creamy caramel" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_MEDIUM - -/datum/glass_style/drinking_glass/caramelshake - required_drink_type = /datum/reagent/consumable/caramelshake - name = "caramel shake" - desc = "A caramel flavored milkshake." - icon = 'icons/obj/drinks/shakes.dmi' - icon_state = "caramelshake" - -/datum/reagent/consumable/choccyshake - name = "Chocolate Shake" - description = "A frosty chocolate milkshake." - color = "#541B00" - quality = DRINK_VERYGOOD - nutriment_factor = 8 * REAGENTS_METABOLISM - taste_description = "sweet creamy chocolate" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_MEDIUM - -/datum/glass_style/drinking_glass/choccyshake - required_drink_type = /datum/reagent/consumable/choccyshake - name = "chocolate shake" - desc = "A chocolate flavored milkshake." - icon = 'icons/obj/drinks/shakes.dmi' - icon_state = "choccyshake" - -/datum/reagent/consumable/strawberryshake - name = "Strawberry Shake" - description = "A strawberry milkshake." - color = "#ff7b7b" - quality = DRINK_VERYGOOD - nutriment_factor = 8 * REAGENTS_METABOLISM - taste_description = "sweet strawberries and milk" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_MEDIUM - -/datum/glass_style/drinking_glass/strawberryshake - required_drink_type = /datum/reagent/consumable/strawberryshake - name = "strawberry shake" - desc = "A strawberry flavored milkshake." - icon = 'icons/obj/drinks/shakes.dmi' - icon_state = "strawberryshake" - -/datum/reagent/consumable/bananashake - name = "Banana Shake" - description = "A banana milkshake. Stuff that clowns drink at their honkday parties." - color = "#f2d554" - quality = DRINK_VERYGOOD - nutriment_factor = 8 * REAGENTS_METABOLISM - taste_description = "thick banana" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_MEDIUM - -/datum/glass_style/drinking_glass/bananashake - required_drink_type = /datum/reagent/consumable/bananashake - name = "banana shake" - desc = "A banana flavored milkshake." - icon = 'icons/obj/drinks/shakes.dmi' - icon_state = "bananashake" - -/datum/reagent/consumable/pumpkin_latte - name = "Pumpkin Latte" - description = "A mix of pumpkin juice and coffee." - color = "#F4A460" - quality = DRINK_VERYGOOD - nutriment_factor = 3 * REAGENTS_METABOLISM - taste_description = "creamy pumpkin" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/pumpkin_latte - required_drink_type = /datum/reagent/consumable/pumpkin_latte - name = "pumpkin latte" - desc = "A mix of coffee and pumpkin juice." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "pumpkin_latte" - -/datum/reagent/consumable/gibbfloats - name = "Gibb Floats" - description = "Ice cream on top of a Dr. Gibb glass." - color = "#B22222" - quality = DRINK_NICE - nutriment_factor = 3 * REAGENTS_METABOLISM - taste_description = "creamy cherry" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/gibbfloats - required_drink_type = /datum/reagent/consumable/gibbfloats - name = "Gibbfloat" - desc = "Dr. Gibb with ice cream on top." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "gibbfloats" - -/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" - description = "A solution." - color = "#EEFF00" - quality = DRINK_NICE - taste_description = "extreme bitterness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/triple_citrus - required_drink_type = /datum/reagent/consumable/triple_citrus - name = "glass of triple citrus" - desc = "A mixture of citrus juices. Tangy, yet smooth." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "triplecitrus" //needs own sprite mine are trash //your sprite is great tho - -/datum/reagent/consumable/grape_soda - name = "Grape Soda" - description = "Beloved by children and teetotalers." - color = "#E6CDFF" - taste_description = "grape soda" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/grape_soda - required_drink_type = /datum/reagent/consumable/grape_soda - name = "glass of grape juice" - -/datum/reagent/consumable/grape_soda/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - ..() - -/datum/reagent/consumable/milk/chocolate_milk - name = "Chocolate Milk" - description = "Milk for cool kids." - color = "#7D4E29" - quality = DRINK_NICE - taste_description = "chocolate milk" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/has_foodtype/juicebox/chocolate_milk - required_drink_type = /datum/reagent/consumable/milk/chocolate_milk - name = "carton of chocolate milk" - desc = "Milk for cool kids!" - icon_state = "chocolatebox" - drink_type = SUGAR | DAIRY - -/datum/reagent/consumable/hot_coco - name = "Hot Coco" - description = "Made with love! And coco beans." - nutriment_factor = 4 * REAGENTS_METABOLISM - color = "#403010" // rgb: 64, 48, 16 - taste_description = "creamy chocolate" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/has_foodtype/drinking_glass/hot_coco - required_drink_type = /datum/reagent/consumable/hot_coco - name = "glass of hot coco" - desc = "A favorite winter drink to warm you up." - icon_state = "chocolateglass" - drink_type = SUGAR | DAIRY - -/datum/reagent/consumable/hot_coco/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_bodytemperature(5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, affected_mob.get_body_temp_normal()) - if(affected_mob.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) - affected_mob.heal_bodypart_damage(1, 0) - . = TRUE - if(holder.has_reagent(/datum/reagent/consumable/capsaicin)) - holder.remove_reagent(/datum/reagent/consumable/capsaicin, 2 * REM * seconds_per_tick) - ..() - -/datum/reagent/consumable/italian_coco - name = "Italian Hot Chocolate" - description = "Made with love! You can just imagine a happy Nonna from the smell." - nutriment_factor = 8 * REAGENTS_METABOLISM - color = "#57372A" - quality = DRINK_VERYGOOD - taste_description = "thick creamy chocolate" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/italian_coco - required_drink_type = /datum/reagent/consumable/italian_coco - name = "glass of italian coco" - desc = "A spin on a winter favourite, made to please." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "italiancoco" - -/datum/reagent/consumable/italian_coco/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_bodytemperature(5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, affected_mob.get_body_temp_normal()) - return ..() - -/datum/reagent/consumable/menthol - name = "Menthol" - description = "Alleviates coughing symptoms one might have." - color = "#80AF9C" - taste_description = "mint" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - default_container = /obj/item/reagent_containers/cup/glass/bottle/juice/menthol - -/datum/glass_style/drinking_glass/menthol - required_drink_type = /datum/reagent/consumable/menthol - name = "glass of menthol" - desc = "Tastes naturally minty, and imparts a very mild numbing sensation." - icon_state = "glass_green" - -/datum/reagent/consumable/menthol/on_mob_life(mob/living/affected_mob, seconds_per_tick, times_fired) - affected_mob.apply_status_effect(/datum/status_effect/throat_soothed) - ..() - -/datum/reagent/consumable/grenadine - name = "Grenadine" - description = "Not cherry flavored!" - color = "#EA1D26" - taste_description = "sweet pomegranates" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/grenadine - required_drink_type = /datum/reagent/consumable/grenadine - name = "glass of grenadine" - desc = "Delicious flavored syrup." - -/datum/reagent/consumable/parsnipjuice - name = "Parsnip Juice" - description = "Why..." - color = "#FFA500" - taste_description = "parsnip" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/has_foodtype/drinking_glass/parsnipjuice - required_drink_type = /datum/reagent/consumable/parsnipjuice - name = "glass of parsnip juice" - drink_type = FRUIT - -/datum/reagent/consumable/pineapplejuice - name = "Pineapple Juice" - description = "Tart, tropical, and hotly debated." - color = "#F7D435" - taste_description = "pineapple" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - default_container = /obj/item/reagent_containers/cup/glass/bottle/juice/pineapplejuice - -/datum/glass_style/has_foodtype/drinking_glass/pineapplejuice - required_drink_type = /datum/reagent/consumable/pineapplejuice - name = "glass of pineapple juice" - desc = "Tart, tropical, and hotly debated." - drink_type = FRUIT | PINEAPPLE - -/datum/glass_style/has_foodtype/juicebox/pineapplejuice - required_drink_type = /datum/reagent/consumable/pineapplejuice - name = "pineapple juice box" - desc = "Why would you even want this?" - icon_state = "pineapplebox" - drink_type = FRUIT | PINEAPPLE - -/datum/reagent/consumable/peachjuice //Intended to be extremely rare due to being the limiting ingredients in the blazaam drink - name = "Peach Juice" - description = "Just peachy." - color = "#E78108" - taste_description = "peaches" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/has_foodtype/drinking_glass/peachjuice - required_drink_type = /datum/reagent/consumable/peachjuice - name = "glass of peach juice" - drink_type = FRUIT - -/datum/reagent/consumable/cream_soda - name = "Cream Soda" - description = "A classic space-American vanilla flavored soft drink." - color = "#dcb137" - quality = DRINK_VERYGOOD - taste_description = "fizzy vanilla" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/cream_soda - required_drink_type = /datum/reagent/consumable/cream_soda - name = "Cream Soda" - desc = "A classic space-American vanilla flavored soft drink." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "cream_soda" - -/datum/reagent/consumable/cream_soda/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - ..() - -/datum/reagent/consumable/sol_dry - name = "Sol Dry" - description = "A soothing, mellow drink made from ginger." - color = "#f7d26a" - quality = DRINK_NICE - taste_description = "sweet ginger spice" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/sol_dry - required_drink_type = /datum/reagent/consumable/sol_dry - name = "Sol Dry" - desc = "A soothing, mellow drink made from ginger." - icon_state = "soldry" - -/datum/reagent/consumable/sol_dry/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_disgust(-5 * REM * seconds_per_tick) - ..() - -/datum/reagent/consumable/shirley_temple - name = "Shirley Temple" - description = "Here you go little girl, now you can drink like the adults." - color = "#F43724" - quality = DRINK_GOOD - taste_description = "sweet cherry syrup and ginger spice" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/shirley_temple - required_drink_type = /datum/reagent/consumable/shirley_temple - name = "Shirley Temple" - desc = "Ginger ale with processed grenadine. " - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "shirleytemple" - -/datum/reagent/consumable/shirley_temple/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_disgust(-3 * REM * seconds_per_tick) - return ..() - -/datum/reagent/consumable/red_queen - name = "Red Queen" - description = "DRINK ME." - color = "#e6ddc3" - quality = DRINK_GOOD - taste_description = "wonder" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - var/current_size = RESIZE_DEFAULT_SIZE - -/datum/glass_style/drinking_glass/red_queen - required_drink_type = /datum/reagent/consumable/red_queen - name = "Red Queen" - desc = "DRINK ME." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "red_queen" - -/datum/reagent/consumable/red_queen/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(SPT_PROB(50, seconds_per_tick)) - return ..() - - var/newsize = pick(0.5, 0.75, 1, 1.50, 2) - newsize *= RESIZE_DEFAULT_SIZE - affected_mob.update_transform(newsize/current_size) - current_size = newsize - if(SPT_PROB(23, seconds_per_tick)) - affected_mob.emote("sneeze") - ..() - -/datum/reagent/consumable/red_queen/on_mob_end_metabolize(mob/living/affected_mob) - affected_mob.update_transform(RESIZE_DEFAULT_SIZE/current_size) - current_size = RESIZE_DEFAULT_SIZE - ..() - -/datum/reagent/consumable/bungojuice - name = "Bungo Juice" - color = "#F9E43D" - description = "Exotic! You feel like you are on vacation already." - taste_description = "succulent bungo" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/bungojuice - required_drink_type = /datum/reagent/consumable/bungojuice - name = "glass of bungo juice" - desc = "Exotic! You feel like you are on vacation already." - icon_state = "glass_yellow" - -/datum/reagent/consumable/prunomix - name = "Pruno Mixture" - color = "#E78108" - description = "Fruit, sugar, yeast, and water pulped together into a pungent slurry." - taste_description = "garbage" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/prunomix - required_drink_type = /datum/reagent/consumable/prunomix - name = "glass of pruno mixture" - desc = "Fruit, sugar, yeast, and water pulped together into a pungent slurry." - icon_state = "glass_orange" - -/datum/reagent/consumable/aloejuice - name = "Aloe Juice" - color = "#A3C48B" - description = "A healthy and refreshing juice." - taste_description = "vegetable" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/aloejuice - required_drink_type = /datum/reagent/consumable/aloejuice - name = "glass of aloe juice" - desc = "A healthy and refreshing juice." - icon_state = "glass_yellow" - -/datum/reagent/consumable/aloejuice/on_mob_life(mob/living/affected_mob, seconds_per_tick, times_fired) - if(affected_mob.getToxLoss() && SPT_PROB(16, seconds_per_tick)) - affected_mob.adjustToxLoss(-1, FALSE, required_biotype = affected_biotype) - ..() - . = TRUE - -/datum/reagent/consumable/agua_fresca - name = "Agua Fresca" - description = "A refreshing watermelon agua fresca. Perfect on a day at the holodeck." - color = "#D25B66" - quality = DRINK_VERYGOOD - taste_description = "cool refreshing watermelon" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/agua_fresca - required_drink_type = /datum/reagent/consumable/agua_fresca - name = "Agua Fresca" - desc = "90% water, but still refreshing." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "aguafresca" - -/datum/reagent/consumable/agua_fresca/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - if(affected_mob.getToxLoss() && SPT_PROB(10, seconds_per_tick)) - affected_mob.adjustToxLoss(-0.5, FALSE, required_biotype = affected_biotype) - return ..() - -/datum/reagent/consumable/mushroom_tea - name = "Mushroom Tea" - description = "A savoury glass of tea made from polypore mushroom shavings, originally native to Tizira." - color = "#674945" // rgb: 16, 16, 0 - nutriment_factor = 0 - taste_description = "mushrooms" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/mushroom_tea - required_drink_type = /datum/reagent/consumable/mushroom_tea - name = "glass of mushroom tea" - desc = "Oddly savoury for a drink." - icon_state = "mushroom_tea_glass" - -/datum/reagent/consumable/mushroom_tea/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(islizard(affected_mob)) - affected_mob.adjustOxyLoss(-0.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - ..() - . = TRUE - -//Moth Stuff -/datum/reagent/consumable/toechtauese_juice - name = "Töchtaüse Juice" - description = "An unpleasant juice made from töchtaüse berries. Best made into a syrup, unless you enjoy pain." - color = "#554862" - nutriment_factor = 0 - taste_description = "fiery itchy pain" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/toechtauese_juice - required_drink_type = /datum/reagent/consumable/toechtauese_juice - name = "glass of töchtaüse juice" - desc = "Raw, unadulterated töchtaüse juice. One swig will fill you with regrets." - icon_state = "toechtauese_syrup" - -/datum/reagent/consumable/toechtauese_syrup - name = "Töchtaüse Syrup" - description = "A harsh spicy and bitter syrup, made from töchtaüse berries. Useful as an ingredient, both for food and cocktails." - color = "#554862" - nutriment_factor = 0 - taste_description = "sugar, spice, and nothing nice" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/toechtauese_syrup - required_drink_type = /datum/reagent/consumable/toechtauese_syrup - name = "glass of töchtaüse syrup" - desc = "Not for drinking on its own." - icon_state = "toechtauese_syrup" - -/datum/reagent/consumable/strawberry_banana - name = "strawberry banana smoothie" - description = "A classic smoothie made from strawberries and bananas." - color = "#FF9999" - nutriment_factor = 0 - taste_description = "strawberry and banana" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/strawberry_banana - required_drink_type = /datum/reagent/consumable/strawberry_banana - name = "strawberry banana smoothie" - desc = "A classic drink which countless souls have bonded over..." - icon = 'icons/obj/drinks/shakes.dmi' - icon_state = "strawberry_banana" - -/datum/reagent/consumable/berry_blast - name = "berry blast smoothie" - description = "A classic smoothie made from mixed berries." - color = "#A76DC5" - nutriment_factor = 0 - taste_description = "mixed berry" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/berry_blast - required_drink_type = /datum/reagent/consumable/berry_blast - name = "berry blast smoothie" - desc = "A classic drink, freshly made with hand picked berries. Or, maybe not." - icon = 'icons/obj/drinks/shakes.dmi' - icon_state = "berry_blast" - -/datum/reagent/consumable/funky_monkey - name = "funky monkey smoothie" - description = "A classic smoothie made from chocolate and bananas." - color = "#663300" - nutriment_factor = 0 - taste_description = "chocolate and banana" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/funky_monkey - required_drink_type = /datum/reagent/consumable/funky_monkey - name = "funky monkey smoothie" - desc = "A classic drink made with chocolate and banana. No monkeys were harmed, officially." - icon = 'icons/obj/drinks/shakes.dmi' - icon_state = "funky_monkey" - -/datum/reagent/consumable/green_giant - name = "green giant smoothie" - description = "A green vegetable smoothie, made without vegetables." - color = "#003300" - nutriment_factor = 0 - taste_description = "green, just green" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/green_giant - required_drink_type = /datum/reagent/consumable/green_giant - name = "green giant smoothie" - desc = "A classic drink, if you enjoy juiced wheatgrass and chia seeds." - icon = 'icons/obj/drinks/shakes.dmi' - icon_state = "green_giant" - -/datum/reagent/consumable/melon_baller - name = "melon baller smoothie" - description = "A classic smoothie made from melons." - color = "#D22F55" - nutriment_factor = 0 - taste_description = "fresh melon" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/melon_baller - required_drink_type = /datum/reagent/consumable/melon_baller - name = "melon baller smoothie" - desc = "A wonderfully fresh melon smoothie. Guaranteed to brighten your day." - icon = 'icons/obj/drinks/shakes.dmi' - icon_state = "melon_baller" - -/datum/reagent/consumable/vanilla_dream - name = "vanilla dream smoothie" - description = "A classic smoothie made from vanilla and fresh cream." - color = "#FFF3DD" - nutriment_factor = 0 - taste_description = "creamy vanilla" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/vanilla_dream - required_drink_type = /datum/reagent/consumable/vanilla_dream - name = "vanilla dream smoothie" - desc = "A classic drink made with vanilla and fresh cream." - icon = 'icons/obj/drinks/shakes.dmi' - icon_state = "vanilla_dream" - -/datum/reagent/consumable/cucumberjuice - name = "Cucumber Juice" - description = "Ordinary cucumber juice, nothing from the fantasy world." - color = "#6cd87a" - taste_description = "light cucumber" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/cucumberjuice - required_drink_type = /datum/reagent/consumable/cucumberjuice - name = "glass of cucumber juice" - desc = "A glass of cucumber juice." - icon_state = "glass_cucumber" - -/datum/reagent/consumable/cucumberlemonade - name = "Cucumber Lemonade" - description = "Cucumber juice, sugar and soda, what else is needed for happiness?" - color = "#6cd87a" - quality = DRINK_GOOD - taste_description = "citrus soda with cucumber" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/cucumberlemonade - required_drink_type = /datum/reagent/consumable/cucumberlemonade - name = "cucumber lemonade" - desc = "The smell of cucumber from lemonade, I'm sure I won't get poisoned?." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "cucumber_lemonade" - -/datum/reagent/consumable/cucumberlemonade/on_mob_life(mob/living/carbon/doll, seconds_per_tick, times_fired) - doll.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, doll.get_body_temp_normal()) - if(doll.getToxLoss() && SPT_PROB(10, seconds_per_tick)) - doll.adjustToxLoss(-0.5, FALSE, required_biotype = affected_biotype) - return ..() - -/datum/reagent/consumable/mississippi_queen - name = "Mississippi Queen" - description = "If you think you're so hot, how about a victory drink?" - color = "#d4422f" // rgb: 212,66,47 - taste_description = "sludge seeping down your throat" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/glass_style/drinking_glass/mississippi_queen - required_drink_type = /datum/reagent/consumable/mississippi_queen - name = "Mississippi Queen" - desc = "Mullets and cut-up jorts not included." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "mississippiglass" - -/datum/reagent/consumable/mississippi_queen/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) - switch(current_cycle) - if(10 to 20) - drinker.adjust_dizzy(4 SECONDS * REM * seconds_per_tick) - if(20 to 30) - if(SPT_PROB(15, seconds_per_tick)) - drinker.adjust_confusion(4 SECONDS * REM * seconds_per_tick) - if(30 to 200) - drinker.adjust_hallucinations(60 SECONDS * REM * seconds_per_tick) - - return ..() diff --git a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm new file mode 100644 index 0000000000000..98ddd72db2329 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm @@ -0,0 +1,2873 @@ +#define ALCOHOL_THRESHOLD_MODIFIER 1 //Greater numbers mean that less alcohol has greater intoxication potential +#define ALCOHOL_EXPONENT 1.6 //The exponent applied to boozepwr to make higher volume alcohol at least a little bit damaging to the liver + +/datum/reagent/consumable/ethanol + name = "Ethanol" + 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 + creation_purity = 1 // impure base reagents are a big no-no + ph = 7.33 + burning_temperature = 2193//ethanol burns at 1970C (at it's peak) + burning_volume = 0.1 + default_container = /obj/item/reagent_containers/cup/glass/bottle/beer + fallback_icon = 'icons/obj/drinks/bottles.dmi' + fallback_icon_state = "beer" + /** + * Boozepwr Chart + * + * Higher numbers equal higher hardness, higher hardness equals more intense alcohol poisoning + * + * Note that all higher effects of alcohol poisoning will inherit effects for smaller amounts + * (i.e. light poisoning inherts from slight poisoning) + * In addition, severe effects won't always trigger unless the drink is poisonously strong + * All effects don't start immediately, but rather get worse over time; the rate is affected by the imbiber's alcohol tolerance + * (see [/datum/status_effect/inebriated]) + * + * * 0: Non-alcoholic + * * 1-10: Barely classifiable as alcohol - occassional slurring + * * 11-20: Slight alcohol content - slurring + * * 21-30: Below average - imbiber begins to look slightly drunk + * * 31-40: Just below average - no unique effects + * * 41-50: Average - mild disorientation, imbiber begins to look drunk + * * 51-60: Just above average - disorientation, vomiting, imbiber begins to look heavily drunk + * * 61-70: Above average - small chance of blurry vision, imbiber begins to look smashed + * * 71-80: High alcohol content - blurry vision, imbiber completely shitfaced + * * 81-90: Extremely high alcohol content - heavy toxin damage, passing out + * * 91-100: Dangerously toxic - swift death + */ + var/boozepwr = 65 + +/datum/reagent/consumable/ethanol/New(list/data) + if(LAZYLEN(data)) + if(!isnull(data["quality"])) + quality = data["quality"] + name = "Natural " + name + if(data["boozepwr"]) + boozepwr = data["boozepwr"] + addiction_types = list(/datum/addiction/alcohol = 0.05 * boozepwr) + return ..() + +/datum/reagent/consumable/ethanol/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + if(drinker.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 + booze_power *= 0.7 + if(HAS_TRAIT(drinker, TRAIT_LIGHT_DRINKER)) + booze_power *= 2 + + // water will dilute alcohol effects + var/total_water_volume = 0 + var/total_alcohol_volume = 0 + for(var/datum/reagent/water/sobriety in drinker.reagents.reagent_list) + total_water_volume += sobriety.volume + + for(var/datum/reagent/consumable/ethanol/alcohol in drinker.reagents.reagent_list) + total_alcohol_volume += alcohol.volume + + var/combined_dilute_volume = total_alcohol_volume + total_water_volume + if(combined_dilute_volume) // safety check to prevent division by zero + booze_power *= (total_alcohol_volume / combined_dilute_volume) + + // Volume, power, and server alcohol rate effect how quickly one gets drunk + drinker.adjust_drunk_effect(sqrt(volume) * booze_power * ALCOHOL_RATE * REM * seconds_per_tick) + if(boozepwr > 0) + var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) + var/heavy_drinker_multiplier = (HAS_TRAIT(drinker, TRAIT_HEAVY_DRINKER) ? 0.5 : 1) + if (istype(liver)) + if(liver.apply_organ_damage(((max(sqrt(volume) * (boozepwr ** ALCOHOL_EXPONENT) * liver.alcohol_tolerance * heavy_drinker_multiplier * seconds_per_tick, 0))/150))) + return UPDATE_MOB_HEALTH + +/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.clear_paper() + 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 + affectedbook.book_data.set_content("") + 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. + . = ..() + if(!(methods & (TOUCH|VAPOR|PATCH))) + 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/datum/surgery/surgery as anything in exposed_carbon.surgeries) + 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." + color = "#664300" // rgb: 102, 67, 0 + nutriment_factor = 1 + boozepwr = 25 + taste_description = "mild carbonated malt" + ph = 4 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK + +// Beer is a chemical composition of alcohol and various other things. It's a garbage nutrient but hey, it's still one. Also alcohol is bad, mmmkay? +/datum/reagent/consumable/ethanol/beer/on_hydroponics_apply(obj/machinery/hydroponics/mytray, mob/user) + mytray.adjust_plant_health(-round(volume * 0.05)) + mytray.adjust_waterlevel(round(volume * 0.7)) + +/datum/reagent/consumable/ethanol/beer/light + name = "Light Beer" + description = "An alcoholic beverage brewed since ancient times on Old Earth. This variety has reduced calorie and alcohol content." + boozepwr = 5 //Space Europeans hate it + taste_description = "dish water" + ph = 5 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/beer/maltliquor + name = "Malt Liquor" + description = "An alcoholic beverage brewed since ancient times on Old Earth. This variety is stronger than usual, super cheap, and super terrible." + boozepwr = 35 + taste_description = "sweet corn beer and the hood life" + ph = 4.8 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/beer/green + name = "Green Beer" + description = "An alcoholic beverage brewed since ancient times on Old Earth. This variety is dyed a festive green." + color = COLOR_CRAYON_GREEN + taste_description = "green piss water" + ph = 6 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/beer/green/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + if(drinker.color != color) + drinker.add_atom_colour(color, TEMPORARY_COLOUR_PRIORITY) + +/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/kahlua + name = "Kahlua" + description = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!" + color = "#8e8368" // rgb: 142,131,104 + boozepwr = 45 + ph = 6 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/kahlua/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + drinker.set_dizzy_if_lower(10 SECONDS * REM * seconds_per_tick) + drinker.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) + drinker.AdjustSleeping(-40 * REM * seconds_per_tick) + if(!HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) + drinker.set_jitter_if_lower(10 SECONDS) + +/datum/reagent/consumable/ethanol/whiskey + name = "Whiskey" + description = "A superb and well-aged single-malt whiskey. Damn." + color = "#b4a287" // rgb: 180,162,135 + boozepwr = 75 + taste_description = "molasses" + ph = 4.5 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK + +/datum/reagent/consumable/ethanol/whiskey/kong + name = "Kong" + description = "Makes You Go Ape!®" + color = "#332100" // rgb: 51, 33, 0 + taste_description = "the grip of a giant ape" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/whiskey/candycorn + name = "Candy Corn Liquor" + description = "Like they drank in 2D speakeasies." + color = "#ccb800" // rgb: 204, 184, 0 + taste_description = "pancake syrup" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/whiskey/candycorn/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + if(SPT_PROB(5, seconds_per_tick)) + drinker.adjust_hallucinations(4 SECONDS * REM * seconds_per_tick) + +/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 + boozepwr = 80 + quality = DRINK_GOOD + overdose_threshold = 60 + taste_description = "jitters and death" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/thirteenloko/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + drinker.adjust_drowsiness(-14 SECONDS * REM * seconds_per_tick) + drinker.AdjustSleeping(-40 * REM * seconds_per_tick) + drinker.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, drinker.get_body_temp_normal()) + if(!HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) + drinker.set_jitter_if_lower(10 SECONDS) + +/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_jitter_if_lower(40 SECONDS) + drinker.Stun(1.5 SECONDS) + +/datum/reagent/consumable/ethanol/thirteenloko/overdose_process(mob/living/drinker, seconds_per_tick, times_fired) + . = ..() + if(SPT_PROB(3.5, seconds_per_tick) && 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_jitter_if_lower(20 SECONDS) + + if(SPT_PROB(3.5, seconds_per_tick)) + 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(SPT_PROB(2.5, seconds_per_tick) && iscarbon(drinker)) + var/obj/item/organ/internal/eyes/eyes = drinker.get_organ_slot(ORGAN_SLOT_EYES) + if(eyes && IS_ORGANIC_ORGAN(eyes)) // doesn't affect robotic eyes + if(drinker.is_blind()) + 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") + if(drinker.adjustBruteLoss(15 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype)) + . = UPDATE_MOB_HEALTH + else + to_chat(drinker, span_userdanger("You scream in terror as you go blind!")) + if(eyes.apply_organ_damage(eyes.maxHealth)) + . = UPDATE_MOB_HEALTH + drinker.emote("scream") + + if(SPT_PROB(1.5, seconds_per_tick) && iscarbon(drinker)) + drinker.visible_message(span_danger("[drinker] starts having a seizure!"), span_userdanger("You have a seizure!")) + if(drinker.Unconscious(10 SECONDS)) + . = UPDATE_MOB_HEALTH + drinker.set_jitter_if_lower(700 SECONDS) + + if(SPT_PROB(0.5, seconds_per_tick) && 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/vodka + name = "Vodka" + description = "Number one drink AND fueling choice for Russians worldwide." + color = "#0064C8" // rgb: 0, 100, 200 + boozepwr = 65 + taste_description = "grain alcohol" + ph = 8.1 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_CLEANS //Very high proof + default_container = /obj/item/reagent_containers/cup/glass/bottle/vodka + +/datum/reagent/consumable/ethanol/bilk + name = "Bilk" + description = "This appears to be beer mixed with milk. Disgusting." + color = "#895C4C" // rgb: 137, 92, 76 + nutriment_factor = 2 + boozepwr = 15 + taste_description = "desperation and lactate" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/bilk/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + if(drinker.getBruteLoss() && SPT_PROB(5, seconds_per_tick)) + if(drinker.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/ethanol/threemileisland + name = "Three Mile Island Iced Tea" + description = "Made for a woman, strong enough for a man." + color = "#666340" // rgb: 102, 99, 64 + boozepwr = 10 + quality = DRINK_FANTASTIC + taste_description = "dryness" + ph = 3.5 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/threemileisland/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + drinker.set_drugginess(100 SECONDS * REM * seconds_per_tick) + +/datum/reagent/consumable/ethanol/gin + name = "Gin" + description = "It's gin. In space. I say, good sir." + color = "#d8e8f0" // rgb: 216,232,240 + boozepwr = 45 + taste_description = "an alcoholic christmas tree" + ph = 6.9 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK + +/datum/reagent/consumable/ethanol/rum + name = "Rum" + description = "Yohoho and all that." + color = "#c9c07e" // rgb: 201,192,126 + boozepwr = 60 + taste_description = "spiked butterscotch" + ph = 6.5 + default_container = /obj/item/reagent_containers/cup/glass/bottle/rum + +/datum/reagent/consumable/ethanol/tequila + name = "Tequila" + description = "A strong and mildly flavoured, Mexican produced spirit. Feeling thirsty, hombre?" + color = "#FFFF91" // rgb: 255, 255, 145 + boozepwr = 70 + taste_description = "paint stripper" + ph = 4 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK + +/datum/reagent/consumable/ethanol/vermouth + name = "Vermouth" + description = "You suddenly feel a craving for a martini..." + color = "#91FF91" // rgb: 145, 255, 145 + boozepwr = 45 + taste_description = "dry alcohol" + ph = 3.25 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/wine + name = "Wine" + description = "A premium alcoholic beverage made from distilled grape juice." + color = "#7E4043" // rgb: 126, 64, 67 + boozepwr = 35 + taste_description = "bitter sweetness" + ph = 3.45 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK + default_container = /obj/item/reagent_containers/cup/glass/bottle/wine + +/datum/reagent/consumable/ethanol/wine/on_merge(data) + . = ..() + if(src.data && data && data["vintage"] != src.data["vintage"]) + src.data["vintage"] = "mixed wine" + +/datum/reagent/consumable/ethanol/wine/get_taste_description(mob/living/taster) + if(HAS_TRAIT(taster,TRAIT_WINE_TASTER)) + if(data && data["vintage"]) + return list("[data["vintage"]]" = 1) + else + return list("synthetic wine"=1) + return ..() + +/datum/reagent/consumable/ethanol/lizardwine + name = "Lizard Wine" + description = "An alcoholic beverage from Space China, made by infusing lizard 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." + color = "#F8EBF1" + boozepwr = 60 + taste_description = "classy bitter sweetness" + ph = 3.5 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK + +/datum/reagent/consumable/ethanol/amaretto + name = "Amaretto" + description = "A gentle drink that carries a sweet aroma." + color = "#E17600" + boozepwr = 25 + taste_description = "fruity and nutty sweetness" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK + +/datum/reagent/consumable/ethanol/cognac + name = "Cognac" + description = "A sweet and strongly alcoholic drink, made after numerous distillations and years of maturing. Classy as fornication." + color = "#AB3C05" // rgb: 171, 60, 5 + boozepwr = 75 + taste_description = "angry and irish" + ph = 3.5 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK + +/datum/reagent/consumable/ethanol/absinthe + name = "Absinthe" + description = "A powerful alcoholic drink. Rumored to cause hallucinations but does not." + color = rgb(10, 206, 0) + boozepwr = 80 //Very strong even by default + taste_description = "death and licorice" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/absinthe/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + if(SPT_PROB(5, seconds_per_tick) && !HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) + drinker.adjust_hallucinations(8 SECONDS * REM * seconds_per_tick) + +/datum/reagent/consumable/ethanol/hooch + name = "Hooch" + description = "Either someone's failure at cocktail making or attempt in alcohol production. In any case, do you really want to drink that?" + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 100 + taste_description = "pure resignation" + 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" + description = "A dark alcoholic beverage made with malted barley and yeast." + color = "#976063" // rgb: 151,96,99 + boozepwr = 65 + taste_description = "hearty barley ale" + ph = 4.5 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK + +/datum/reagent/consumable/ethanol/goldschlager + name = "Goldschlager" + description = "100 proof cinnamon schnapps, made for alcoholic teen girls on spring break." + color = "#FFFF91" // rgb: 255, 255, 145 + boozepwr = 25 + quality = DRINK_NICE + taste_description = "burning cinnamon" + 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" + description = "Tequila with silver in it, a favorite of alcoholic women in the club scene." + color = "#585840" // rgb: 88, 88, 64 + boozepwr = 60 + quality = DRINK_VERYGOOD + taste_description = "metallic and expensive" + ph = 4.5 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_HIGH + +/datum/reagent/consumable/ethanol/gintonic + name = "Gin and Tonic" + description = "An all time classic, mild cocktail." + color = "#cae7ec" // rgb: 202,231,236 + boozepwr = 25 + quality = DRINK_NICE + taste_description = "mild and tart" + ph = 3 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_EASY + +/datum/reagent/consumable/ethanol/rum_coke + name = "Rum and Coke" + description = "Rum, mixed with cola." + taste_description = "cola" + boozepwr = 40 + quality = DRINK_NICE + color = "#3E1B00" + ph = 4 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/cuba_libre + name = "Cuba Libre" + description = "Viva la Revolucion! Viva Cuba Libre!" + color = "#3E1B00" // rgb: 62, 27, 0 + boozepwr = 50 + quality = DRINK_GOOD + taste_description = "a refreshing marriage of citrus and rum" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/cuba_libre/on_mob_life(mob/living/carbon/cubano, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update + if(cubano.mind && cubano.mind.has_antag_datum(/datum/antagonist/rev)) //Cuba Libre, the traditional drink of revolutions! Heals revolutionaries. + need_mob_update = cubano.adjustBruteLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += cubano.adjustFireLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += cubano.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += cubano.adjustOxyLoss(-5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + if(need_mob_update) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/ethanol/whiskey_cola + name = "Whiskey Cola" + description = "Whiskey, mixed with cola. Surprisingly refreshing." + color = "#3E1B00" // rgb: 62, 27, 0 + boozepwr = 70 + quality = DRINK_NICE + taste_description = "cola" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/martini + name = "Classic Martini" + description = "Vermouth with Gin. Not quite how 007 enjoyed it, but still delicious." + color = "#cddbac" // rgb: 205,219,172 + boozepwr = 60 + quality = DRINK_NICE + taste_description = "dry class" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_EASY + +/datum/reagent/consumable/ethanol/vodkamartini + name = "Vodka Martini" + description = "Vodka with Gin. Not quite how 007 enjoyed it, but still delicious." + color = "#cddcad" // rgb: 205,220,173 + boozepwr = 65 + quality = DRINK_NICE + taste_description = "shaken, not stirred" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + + +/datum/reagent/consumable/ethanol/white_russian + name = "White Russian" + description = "That's just, like, your opinion, man..." + color = "#A68340" // rgb: 166, 131, 64 + boozepwr = 50 + quality = DRINK_GOOD + taste_description = "bitter cream" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/screwdrivercocktail + name = "Screwdriver" + description = "Vodka, mixed with plain ol' orange juice. The result is surprisingly delicious." + color = "#A68310" // rgb: 166, 131, 16 + boozepwr = 55 + quality = DRINK_NICE + taste_description = "oranges" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/screwdrivercocktail/on_transfer(atom/atom, methods = TOUCH, trans_volume) + if(!(methods & INGEST)) + return ..() + + if(src == atom.reagents.get_master_reagent() && istype(atom, /obj/item/reagent_containers/cup/glass/drinkingglass)) + var/obj/item/reagent_containers/cup/glass/drinkingglass/drink = atom + drink.tool_behaviour = TOOL_SCREWDRIVER + var/list/reagent_change_signals = list( + COMSIG_REAGENTS_ADD_REAGENT, + COMSIG_REAGENTS_NEW_REAGENT, + COMSIG_REAGENTS_REM_REAGENT, + COMSIG_REAGENTS_DEL_REAGENT, + COMSIG_REAGENTS_CLEAR_REAGENTS, + COMSIG_REAGENTS_REACTED, + ) + RegisterSignals(drink.reagents, reagent_change_signals, PROC_REF(on_reagent_change)) + + return ..() + +/datum/reagent/consumable/ethanol/screwdrivercocktail/proc/on_reagent_change(datum/reagents/reagents) + SIGNAL_HANDLER + if(src != reagents.get_master_reagent()) + var/obj/item/reagent_containers/cup/glass/drinkingglass/drink = reagents.my_atom + drink.tool_behaviour = initial(drink.tool_behaviour) + 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, + )) + +/datum/reagent/consumable/ethanol/screwdrivercocktail/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) + if(HAS_TRAIT(liver, TRAIT_ENGINEER_METABOLISM)) + ADD_TRAIT(drinker, TRAIT_HALT_RADIATION_EFFECTS, "[type]") + if (HAS_TRAIT(drinker, TRAIT_IRRADIATED)) + if(drinker.adjustToxLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/ethanol/screwdrivercocktail/on_mob_end_metabolize(mob/living/drinker) + . = ..() + REMOVE_TRAIT(drinker, TRAIT_HALT_RADIATION_EFFECTS, "[type]") + +/datum/reagent/consumable/ethanol/booger + name = "Booger" + description = "Ewww..." + color = "#8CFF8C" // rgb: 140, 255, 140 + boozepwr = 45 + taste_description = "sweet 'n creamy" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/bloody_mary + name = "Bloody Mary" + description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice." + color = "#bf707c" // rgb: 191,112,124 + boozepwr = 55 + quality = DRINK_GOOD + taste_description = "tomatoes with a hint of lime and liquid murder" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/bloody_mary/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + if(drinker.blood_volume < BLOOD_VOLUME_NORMAL) + drinker.blood_volume = min(drinker.blood_volume + (3 * REM * seconds_per_tick), 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" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_EASY + var/tough_text + +/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 + ADD_TRAIT(drinker, TRAIT_FEARLESS, type) + +/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 + REMOVE_TRAIT(drinker, TRAIT_FEARLESS, type) + +/datum/reagent/consumable/ethanol/tequila_sunrise + name = "Tequila Sunrise" + description = "Tequila, Grenadine, and Orange Juice." + color = "#FFE48C" // rgb: 255, 228, 140 + boozepwr = 45 + quality = DRINK_GOOD + taste_description = "oranges with a hint of pomegranate" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_MEDIUM + var/obj/effect/light_holder + +/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(3, 0.7, "#FFCC00") //Tequila Sunrise makes you radiate dim light, like a sunrise! + +/datum/reagent/consumable/ethanol/tequila_sunrise/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, 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/toxins_special + name = "Toxins Special" + description = "This thing is ON FIRE! CALL THE DAMN SHUTTLE!" + color = "#8880a8" // rgb: 136,128,168 + boozepwr = 25 + quality = DRINK_VERYGOOD + taste_description = "spicy toxins" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/toxins_special/on_mob_life(mob/living/drinker, seconds_per_tick, times_fired) + . = ..() + drinker.adjust_bodytemperature(15 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, drinker.get_body_temp_normal() + 20) //310.15 is the normal bodytemp. + +/datum/reagent/consumable/ethanol/beepsky_smash + name = "Beepsky Smash" + description = "Drink this and prepare for the LAW." + 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 + taste_description = "JUSTICE" + overdose_threshold = 40 + ph = 2 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + var/datum/brain_trauma/special/beepsky/beepsky_hallucination + +/datum/reagent/consumable/ethanol/beepsky_smash/on_mob_metabolize(mob/living/carbon/drinker) + . = ..() + if(HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) + metabolization_rate = 0.8 + // if you don't have a liver, or your liver isn't an officer's liver + var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) + if(!liver || !HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) + beepsky_hallucination = new() + drinker.gain_trauma(beepsky_hallucination, TRAUMA_RESILIENCE_ABSOLUTE) + +/datum/reagent/consumable/ethanol/beepsky_smash/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + drinker.set_jitter_if_lower(4 SECONDS) + var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(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)) + if(drinker.adjustStaminaLoss(-10 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH + if(SPT_PROB(10, seconds_per_tick)) + drinker.cause_hallucination(get_random_valid_hallucination_subtype(/datum/hallucination/nearby_fake_item), name) + if(SPT_PROB(5, seconds_per_tick)) + drinker.cause_hallucination(/datum/hallucination/stray_bullet, name) + +/datum/reagent/consumable/ethanol/beepsky_smash/on_mob_end_metabolize(mob/living/carbon/drinker) + . = ..() + if(beepsky_hallucination) + QDEL_NULL(beepsky_hallucination) + +/datum/reagent/consumable/ethanol/beepsky_smash/overdose_start(mob/living/carbon/drinker) + . = ..() + var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(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) + +/datum/reagent/consumable/ethanol/irish_cream + name = "Irish Cream" + description = "Whiskey-imbued cream, what else would you expect from the Irish?" + color = "#e3d0b2" // rgb: 227,208,178 + boozepwr = 50 + quality = DRINK_NICE + taste_description = "creamy alcohol" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/manly_dorf + name = "The Manly Dorf" + description = "Beer and Ale, brought together in a delicious mix. Intended for true men only." + color = "#815336" // rgb: 129,83,54 + boozepwr = 100 //For the manly only + quality = DRINK_NICE + taste_description = "hair on your chest and your chin" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + var/dorf_mode = FALSE + +/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, seconds_per_tick, times_fired) + . = ..() + if(dorf_mode) + var/need_mob_update + need_mob_update = dwarf.adjustBruteLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += dwarf.adjustFireLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/ethanol/longislandicedtea + name = "Long Island Iced Tea" + description = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." + color = "#ff6633" // rgb: 255,102,51 + boozepwr = 35 + quality = DRINK_VERYGOOD + taste_description = "a mixture of cola and alcohol" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/moonshine + name = "Moonshine" + description = "You've really hit rock bottom now... your liver packed its bags and left last night." + color = "#AAAAAA77" // rgb: 170, 170, 170, 77 (alpha) (like water) + boozepwr = 95 + taste_description = "bitterness" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/b52 + name = "B-52" + description = "Coffee, Irish Cream, and cognac. You will get bombed." + color = "#8f1733" // rgb: 143,23,51 + boozepwr = 85 + quality = DRINK_GOOD + taste_description = "angry and irish" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_EASY + +/datum/reagent/consumable/ethanol/b52/on_mob_metabolize(mob/living/drinker) + . = ..() + playsound(drinker, 'sound/effects/explosion_distant.ogg', 100, FALSE) + +/datum/reagent/consumable/ethanol/irishcoffee + name = "Irish Coffee" + description = "Coffee, and alcohol. More fun than a Mimosa to drink in the morning." + color = "#874010" // rgb: 135,64,16 + boozepwr = 35 + quality = DRINK_NICE + taste_description = "giving up on the day" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/margarita + name = "Margarita" + description = "On the rocks with salt on the rim. Arriba~!" + color = "#8CFF8C" // rgb: 140, 255, 140 + boozepwr = 35 + quality = DRINK_NICE + taste_description = "dry and salty" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_MEDIUM + +/datum/reagent/consumable/ethanol/black_russian + name = "Black Russian" + description = "For the lactose-intolerant. Still as classy as a White Russian." + color = "#360000" // rgb: 54, 0, 0 + boozepwr = 70 + quality = DRINK_NICE + taste_description = "bitterness" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/manhattan + name = "Manhattan" + description = "The Detective's undercover drink of choice. He never could stomach gin..." + color = "#ff3300" // rgb: 255,51,0 + boozepwr = 30 + quality = DRINK_NICE + taste_description = "mild dryness" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_EASY + +/datum/reagent/consumable/ethanol/manhattan_proj + name = "Manhattan Project" + description = "A scientist's drink of choice, for pondering ways to blow up the station." + color = COLOR_MOSTLY_PURE_RED + boozepwr = 45 + quality = DRINK_VERYGOOD + taste_description = "death, the destroyer of worlds" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/manhattan_proj/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + drinker.set_drugginess(1 MINUTES * REM * seconds_per_tick) + +/datum/reagent/consumable/ethanol/whiskeysoda + name = "Whiskey Soda" + description = "For the more refined griffon." + color = "#ffcc33" // rgb: 255,204,51 + boozepwr = 70 + quality = DRINK_NICE + taste_description = "soda" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/antifreeze + name = "Anti-freeze" + description = "The ultimate refreshment. Not what it sounds like." + color = "#30f0f8" // rgb: 48,240,248 + boozepwr = 35 + quality = DRINK_NICE + taste_description = "Jack Frost's piss" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/antifreeze/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + drinker.adjust_bodytemperature(20 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, drinker.get_body_temp_normal() + 20) //310.15 is the normal bodytemp. + +/datum/reagent/consumable/ethanol/barefoot + name = "Barefoot" + description = "Barefoot and pregnant." + color = "#fc5acc" // rgb: 252,90,204 + boozepwr = 45 + quality = DRINK_VERYGOOD + taste_description = "creamy berries" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/barefoot/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, 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) + if(unshoed.adjustBruteLoss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype)) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/ethanol/snowwhite + name = "Snow White" + description = "A cold refreshment." + color = "#FFFFFF" // rgb: 255, 255, 255 + boozepwr = 35 + quality = DRINK_NICE + taste_description = "refreshing cold" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/demonsblood + name = "Demon's Blood" + description = "AHHHH!!!!" + color = "#820000" // rgb: 130, 0, 0 + boozepwr = 75 + quality = DRINK_VERYGOOD + taste_description = "sweet tasting iron" + 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) + +/// Prevents the imbiber from being dragged into a pool of blood by a slaughter demon. +/datum/reagent/consumable/ethanol/demonsblood/proc/pre_bloodcrawl_consumed( + mob/living/source, + datum/action/cooldown/spell/jaunt/bloodcrawl/crawl, + mob/living/jaunter, + obj/effect/decal/cleanable/blood, +) + + SIGNAL_HANDLER + + var/turf/jaunt_turf = get_turf(jaunter) + jaunt_turf.visible_message( + span_warning("Something prevents [source] from entering [blood]!"), + blind_message = span_notice("You hear a splash and a thud.") + ) + to_chat(jaunter, span_warning("A strange force is blocking [source] from entering!")) + + return COMPONENT_STOP_CONSUMPTION + +/datum/reagent/consumable/ethanol/devilskiss + name = "Devil's Kiss" + description = "Creepy time!" + color = "#A68310" // rgb: 166, 131, 16 + boozepwr = 70 + quality = DRINK_VERYGOOD + taste_description = "bitter iron" + 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) + +/// If eaten by a slaughter demon, the demon will regret it. +/datum/reagent/consumable/ethanol/devilskiss/proc/on_bloodcrawl_consumed( + mob/living/source, + datum/action/cooldown/spell/jaunt/bloodcrawl/crawl, + mob/living/jaunter, +) + + SIGNAL_HANDLER + + . = COMPONENT_STOP_CONSUMPTION + + to_chat(jaunter, span_boldwarning("AAH! THEIR FLESH! IT BURNS!")) + jaunter.apply_damage(25, BRUTE, wound_bonus = CANT_WOUND) + + for(var/obj/effect/decal/cleanable/nearby_blood in range(1, get_turf(source))) + if(!nearby_blood.can_bloodcrawl_in()) + continue + source.forceMove(get_turf(nearby_blood)) + source.visible_message(span_warning("[nearby_blood] violently expels [source]!")) + crawl.exit_blood_effect(source) + return + + // Fuck it, just eject them, thanks to some split second cleaning + source.forceMove(get_turf(source)) + source.visible_message(span_warning("[source] appears from nowhere, covered in blood!")) + crawl.exit_blood_effect(source) + +/datum/reagent/consumable/ethanol/vodkatonic + name = "Vodka and Tonic" + description = "For when a gin and tonic isn't Russian enough." + color = "#0064C8" // rgb: 0, 100, 200 + boozepwr = 70 + quality = DRINK_NICE + taste_description = "tart bitterness" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/ginfizz + name = "Gin Fizz" + description = "Refreshingly lemony, deliciously dry." + color = "#ffffcc" // rgb: 255,255,204 + boozepwr = 45 + quality = DRINK_GOOD + taste_description = "dry, tart lemons" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/bahama_mama + name = "Bahama Mama" + description = "A tropical cocktail with a complex blend of flavors." + color = "#FF7F3B" // rgb: 255, 127, 59 + boozepwr = 35 + quality = DRINK_GOOD + taste_description = "pineapple, coconut, and a hint of coffee" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/singulo + name = "Singulo" + description = "A blue-space beverage!" + color = "#2E6671" // rgb: 46, 102, 113 + boozepwr = 35 + quality = DRINK_VERYGOOD + taste_description = "concentrated matter" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + var/static/list/ray_filter = list(type = "rays", size = 40, density = 15, color = SUPERMATTER_SINGULARITY_RAYS_COLOUR, factor = 15) + +/datum/reagent/consumable/ethanol/singulo/on_mob_metabolize(mob/living/drinker) + . = ..() + ADD_TRAIT(drinker, TRAIT_MADNESS_IMMUNE, type) + +/datum/reagent/consumable/ethanol/singulo/on_mob_end_metabolize(mob/living/drinker) + . = ..() + REMOVE_TRAIT(drinker, TRAIT_MADNESS_IMMUNE, type) + drinker.remove_filter("singulo_rays") + +/datum/reagent/consumable/ethanol/singulo/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + if(SPT_PROB(2.5, seconds_per_tick)) + // 20u = 1x1, 45u = 2x2, 80u = 3x3 + var/volume_to_radius = FLOOR(sqrt(volume/5), 1) - 1 + var/suck_range = clamp(volume_to_radius, 0, 3) + + if(!suck_range) + return ..() + + var/turf/gravity_well_turf = get_turf(drinker) + goonchem_vortex(gravity_well_turf, 0, suck_range) + playsound(get_turf(drinker), 'sound/effects/supermatter.ogg', 150, TRUE) + drinker.add_filter("singulo_rays", 1, ray_filter) + animate(drinker.get_filter("singulo_rays"), offset = 10, time = 1.5 SECONDS, loop = -1) + addtimer(CALLBACK(drinker, TYPE_PROC_REF(/datum, remove_filter), "singulo_rays"), 1.5 SECONDS) + drinker.emote("burp") + +/datum/reagent/consumable/ethanol/sbiten + name = "Sbiten" + description = "A spicy Vodka! Might be a little hot for the little guys!" + color = "#d8d5ae" // rgb: 216,213,174 + boozepwr = 70 + quality = DRINK_GOOD + taste_description = "hot and spice" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/sbiten/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + drinker.adjust_bodytemperature(50 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, BODYTEMP_HEAT_DAMAGE_LIMIT) //310.15 is the normal bodytemp. + +/datum/reagent/consumable/ethanol/red_mead + name = "Red Mead" + description = "The true Viking drink! Even though it has a strange red color." + color = "#C73C00" // rgb: 199, 60, 0 + boozepwr = 31 //Red drinks are stronger + quality = DRINK_GOOD + taste_description = "sweet and salty alcohol" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/mead + name = "Mead" + description = "A Viking drink, though a cheap one." + color = "#e0c058" // rgb: 224,192,88 + nutriment_factor = 1 + boozepwr = 30 + quality = DRINK_NICE + taste_description = "sweet, sweet alcohol" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/iced_beer + name = "Iced Beer" + description = "A beer which is so cold the air around it freezes." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 15 + taste_description = "refreshingly cold" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/iced_beer/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + drinker.adjust_bodytemperature(-20 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, T0C) //310.15 is the normal bodytemp. + +/datum/reagent/consumable/ethanol/grog + name = "Grog" + description = "Watered-down rum, Nanotrasen approves!" + color = "#e0e058" // rgb: 224,224,88 + boozepwr = 1 //Basically nothing + taste_description = "a poor excuse for alcohol" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/aloe + name = "Aloe" + description = "So very, very, very good." + color = "#f8f800" // rgb: 248,248,0 + boozepwr = 35 + quality = DRINK_VERYGOOD + taste_description = "sweet 'n creamy" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + //somewhat annoying mix + glass_price = DRINK_PRICE_MEDIUM + +/datum/reagent/consumable/ethanol/andalusia + name = "Andalusia" + description = "A nice, strangely named drink." + color = "#c8f860" // rgb: 200,248,96 + boozepwr = 40 + quality = DRINK_GOOD + taste_description = "lemons" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/alliescocktail + name = "Allies Cocktail" + description = "A drink made from your allies. Not as sweet as those made from your enemies." + color = "#60f8f8" // rgb: 96,248,248 + boozepwr = 45 + quality = DRINK_NICE + taste_description = "bitter yet free" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_EASY + +/datum/reagent/consumable/ethanol/acid_spit + name = "Acid Spit" + description = "A drink for the daring, can be deadly if incorrectly prepared!" + color = "#365000" // rgb: 54, 80, 0 + boozepwr = 70 + quality = DRINK_VERYGOOD + taste_description = "stomach acid" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/amasec + name = "Amasec" + description = "Official drink of the Nanotrasen Gun-Club!" + color = "#e0e058" // rgb: 224,224,88 + boozepwr = 35 + quality = DRINK_GOOD + taste_description = "dark and metallic" + 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" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/changelingsting/on_mob_life(mob/living/carbon/target, seconds_per_tick, times_fired) + . = ..() + var/datum/antagonist/changeling/changeling = target.mind?.has_antag_datum(/datum/antagonist/changeling) + changeling?.adjust_chemicals(metabolization_rate * REM * seconds_per_tick) + +/datum/reagent/consumable/ethanol/irishcarbomb + name = "Irish Car Bomb" + description = "Mmm, tastes like the free Irish state." + color = "#2E6671" // rgb: 46, 102, 113 + boozepwr = 25 + quality = DRINK_GOOD + taste_description = "the spirit of Ireland" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/syndicatebomb + name = "Syndicate Bomb" + description = "Tastes like terrorism!" + color = "#2E6671" // rgb: 46, 102, 113 + boozepwr = 90 + quality = DRINK_GOOD + taste_description = "purified antagonism" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/syndicatebomb/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + if(SPT_PROB(2.5, seconds_per_tick)) + playsound(get_turf(drinker), 'sound/effects/explosionfar.ogg', 100, TRUE) + +/datum/reagent/consumable/ethanol/hiveminderaser + name = "Hivemind Eraser" + description = "A vessel of pure flavor." + color = "#FF80FC" // rgb: 255, 128, 252 + boozepwr = 40 + quality = DRINK_GOOD + taste_description = "psychic links" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/erikasurprise + name = "Erika Surprise" + description = "The surprise is, it's green!" + color = "#2E6671" // rgb: 46, 102, 113 + boozepwr = 35 + quality = DRINK_VERYGOOD + taste_description = "tartness and bananas" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/driestmartini + name = "Driest Martini" + description = "Only for the experienced. You think you see sand floating in the glass." + nutriment_factor = 1 + color = "#2E6671" // rgb: 46, 102, 113 + boozepwr = 65 + quality = DRINK_GOOD + taste_description = "a beach" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/bananahonk + name = "Banana Honk" + description = "A drink from Clown Heaven." + nutriment_factor = 1 + color = "#FFFF91" // rgb: 255, 255, 140 + boozepwr = 60 + quality = DRINK_GOOD + taste_description = "a bad joke" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/bananahonk/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) + if((liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) || ismonkey(drinker)) + if(drinker.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/ethanol/silencer + name = "Silencer" + description = "A drink from Mime Heaven." + nutriment_factor = 2 + color = "#a8a8a8" // rgb: 168,168,168 + boozepwr = 59 //Proof that clowns are better than mimes right here + quality = DRINK_GOOD + taste_description = "a pencil eraser" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/silencer/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + if(ishuman(drinker) && HAS_MIND_TRAIT(drinker, TRAIT_MIMING)) + drinker.set_silence_if_lower(MIMEDRINK_SILENCE_DURATION) + if(drinker.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/ethanol/drunkenblumpkin + name = "Drunken Blumpkin" + description = "A weird mix of whiskey and blumpkin juice." + color = "#1EA0FF" // rgb: 30,160,255 + boozepwr = 50 + quality = DRINK_VERYGOOD + taste_description = "molasses and a mouthful of pool water" + 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" + description = "Lemon juice/whiskey/sugar mixture. Moderate alcohol content." + color = rgb(255, 201, 49) + boozepwr = 35 + quality = DRINK_GOOD + taste_description = "sour lemons" + +/datum/reagent/consumable/ethanol/hcider + name = "Hard Cider" + description = "Apple juice, for adults." + color = "#CD6839" + nutriment_factor = 1 + boozepwr = 25 + taste_description = "the season that falls between summer and winter" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK + +/datum/reagent/consumable/ethanol/fetching_fizz //A reference to one of my favorite games of all time. Pulls nearby ores to the imbiber! + name = "Fetching Fizz" + description = "Whiskey sour/iron/uranium mixture resulting in a highly magnetic slurry. Mild alcohol content." //Requires no alcohol to make but has alcohol anyway because ~magic~ + color = rgb(255, 91, 15) + boozepwr = 10 + quality = DRINK_VERYGOOD + metabolization_rate = 0.1 * REAGENTS_METABOLISM + taste_description = "charged metal" // the same as teslium, honk honk. + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/fetching_fizz/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + for(var/obj/item/stack/ore/O in orange(3, drinker)) + step_towards(O, get_turf(drinker)) + +//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" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/hearty_punch/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + if(drinker.health <= 0) + var/need_mob_update + need_mob_update = drinker.adjustBruteLoss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += drinker.adjustFireLoss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += drinker.adjustCloneLoss(-5 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += drinker.adjustOxyLoss(-4 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += drinker.adjustToxLoss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH + +/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." + color = rgb(51, 19, 3) //Sickly brown + boozepwr = 300 //I warned you + taste_description = "a wall of bricks" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/atomicbomb + name = "Atomic Bomb" + description = "Nuclear proliferation never tasted so good." + color = "#666300" // rgb: 102, 99, 0 + boozepwr = 0 //custom drunk effect + quality = DRINK_FANTASTIC + taste_description = "da bomb" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_HIGH + +/datum/reagent/consumable/ethanol/atomicbomb/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + drinker.set_drugginess(100 SECONDS * REM * seconds_per_tick) + if(!HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) + drinker.adjust_confusion(2 SECONDS * REM * seconds_per_tick) + drinker.set_dizzy_if_lower(20 SECONDS * REM * seconds_per_tick) + drinker.adjust_slurring(6 SECONDS * REM * seconds_per_tick) + switch(current_cycle) + if(52 to 201) + drinker.Sleeping(100 * REM * seconds_per_tick) + if(202 to INFINITY) + drinker.AdjustSleeping(40 * REM * seconds_per_tick) + if(drinker.adjustToxLoss(2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/ethanol/gargle_blaster + name = "Pan-Galactic Gargle Blaster" + description = "Whoah, this stuff looks volatile!" + color = "#9cc8b4" // rgb: 156,200,180 + boozepwr = 0 //custom drunk effect + quality = DRINK_GOOD + taste_description = "your brains smashed out by a lemon wrapped around a gold brick" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/gargle_blaster/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + drinker.adjust_dizzy(3 SECONDS * REM * seconds_per_tick) + switch(current_cycle) + if(16 to 46) + drinker.adjust_slurring(3 SECONDS * REM * seconds_per_tick) + if(46 to 56) + if(SPT_PROB(30, seconds_per_tick)) + drinker.adjust_confusion(3 SECONDS * REM * seconds_per_tick) + if(56 to 201) + drinker.set_drugginess(110 SECONDS * REM * seconds_per_tick) + if(201 to INFINITY) + if(drinker.adjustToxLoss(2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/ethanol/neurotoxin + name = "Neurotoxin" + description = "A strong neurotoxin that puts the subject into a death-like state." + color = "#2E2E61" // rgb: 46, 46, 97 + boozepwr = 50 + quality = DRINK_VERYGOOD + taste_description = "a numbing sensation" + metabolization_rate = 1 * REAGENTS_METABOLISM + 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, seconds_per_tick, times_fired) + . = ..() + drinker.set_drugginess(100 SECONDS * REM * seconds_per_tick) + drinker.adjust_dizzy(4 SECONDS * REM * seconds_per_tick) + var/need_mob_update + need_mob_update = drinker.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1 * REM * seconds_per_tick, 150, required_organ_flag = affected_organ_flags) + if(SPT_PROB(10, seconds_per_tick)) + need_mob_update += drinker.adjustStaminaLoss(10 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + drinker.drop_all_held_items() + to_chat(drinker, span_notice("You cant feel your hands!")) + if(current_cycle > 6) + if(SPT_PROB(10, seconds_per_tick)) + var/paralyzed_limb = pick_paralyzed_limb() + ADD_TRAIT(drinker, paralyzed_limb, type) + need_mob_update += drinker.adjustStaminaLoss(10 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + if(current_cycle > 31) + need_mob_update += drinker.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + if(current_cycle > 51 && SPT_PROB(7.5, seconds_per_tick)) + 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!")) + if(need_mob_update) + return UPDATE_MOB_HEALTH + +/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.adjustStaminaLoss(10, required_biotype = affected_biotype) + +/datum/reagent/consumable/ethanol/hippies_delight + name = "Hippie's Delight" + description = "You just don't get it maaaan." + color = "#b16e8b" // rgb: 177,110,139 + nutriment_factor = 0 + boozepwr = 0 //custom drunk effect + quality = DRINK_FANTASTIC + metabolization_rate = 0.2 * REAGENTS_METABOLISM + taste_description = "giving peace a chance" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/hippies_delight/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + drinker.set_slurring_if_lower(1 SECONDS * REM * seconds_per_tick) + + switch(current_cycle) + if(2 to 6) + drinker.set_dizzy_if_lower(20 SECONDS * REM * seconds_per_tick) + drinker.set_drugginess(1 MINUTES * REM * seconds_per_tick) + if(SPT_PROB(5, seconds_per_tick)) + drinker.emote(pick("twitch","giggle")) + if(6 to 11) + drinker.set_jitter_if_lower(40 SECONDS * REM * seconds_per_tick) + drinker.set_dizzy_if_lower(40 SECONDS * REM * seconds_per_tick) + drinker.set_drugginess(1.5 MINUTES * REM * seconds_per_tick) + if(SPT_PROB(10, seconds_per_tick)) + drinker.emote(pick("twitch","giggle")) + if (11 to 201) + drinker.set_jitter_if_lower(80 SECONDS * REM * seconds_per_tick) + drinker.set_dizzy_if_lower(80 SECONDS * REM * seconds_per_tick) + drinker.set_drugginess(2 MINUTES * REM * seconds_per_tick) + if(SPT_PROB(16, seconds_per_tick)) + drinker.emote(pick("twitch","giggle")) + if(201 to INFINITY) + drinker.set_jitter_if_lower(120 SECONDS * REM * seconds_per_tick) + drinker.set_dizzy_if_lower(120 SECONDS * REM * seconds_per_tick) + drinker.set_drugginess(2.5 MINUTES * REM * seconds_per_tick) + if(SPT_PROB(23, seconds_per_tick)) + drinker.emote(pick("twitch","giggle")) + if(SPT_PROB(16, seconds_per_tick)) + if(drinker.adjustToxLoss(2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/ethanol/eggnog + name = "Eggnog" + description = "For enjoying the most wonderful time of the year." + color = "#fcfdc6" // rgb: 252, 253, 198 + nutriment_factor = 2 + boozepwr = 1 + quality = DRINK_VERYGOOD + taste_description = "custard and alcohol" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/dreadnog + name = "Dreadnog" + description = "For suffering during a period of joy." + color = "#abb862" // rgb: 252, 253, 198 + nutriment_factor = 3 * REAGENTS_METABOLISM + boozepwr = 1 + quality = DRINK_REVOLTING + taste_description = "custard and alcohol" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/narsour + name = "Nar'Sour" + description = "Side effects include self-mutilation and hoarding plasteel." + color = RUNE_COLOR_DARKRED + boozepwr = 10 + quality = DRINK_FANTASTIC + taste_description = "bloody" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/narsour/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + drinker.adjust_timed_status_effect(6 SECONDS * REM * seconds_per_tick, /datum/status_effect/speech/slurring/cult, max_duration = 6 SECONDS) + drinker.adjust_stutter_up_to(6 SECONDS * REM * seconds_per_tick, 6 SECONDS) + +/datum/reagent/consumable/ethanol/triple_sec + name = "Triple Sec" + description = "A sweet and vibrant orange liqueur." + color = "#ffcc66" + boozepwr = 30 + taste_description = "a warm flowery orange taste which recalls the ocean air and summer wind of the caribbean" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/creme_de_menthe + name = "Creme de Menthe" + description = "A minty liqueur excellent for refreshing, cool drinks." + color = "#00cc00" + boozepwr = 20 + taste_description = "a minty, cool, and invigorating splash of cold streamwater" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/creme_de_cacao + name = "Creme de Cacao" + description = "A chocolatey liqueur excellent for adding dessert notes to beverages and bribing sororities." + color = "#996633" + boozepwr = 20 + taste_description = "a slick and aromatic hint of chocolates swirling in a bite of alcohol" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/creme_de_coconut + name = "Creme de Coconut" + description = "A coconut liqueur for smooth, creamy, tropical drinks." + color = "#F7F0D0" + boozepwr = 20 + taste_description = "a sweet milky flavor with notes of toasted sugar" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/quadruple_sec + name = "Quadruple Sec" + description = "Kicks just as hard as licking the power cell on a baton, but tastier." + color = "#cc0000" + boozepwr = 35 + quality = DRINK_GOOD + taste_description = "an invigorating bitter freshness which suffuses your being; no enemy of the station will go unrobusted this day" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/quadruple_sec/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + //Securidrink in line with the Screwdriver for engineers or Nothing for mimes + var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) + if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) + if(drinker.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/ethanol/quintuple_sec + name = "Quintuple Sec" + description = "Law, Order, Alcohol, and Police Brutality distilled into one single elixir of JUSTICE." + color = "#ff3300" + boozepwr = 55 + quality = DRINK_FANTASTIC + taste_description = "THE LAW" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/quintuple_sec/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + //Securidrink in line with the Screwdriver for engineers or Nothing for mimes but STRONG.. + var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) + if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) + var/need_mob_update + need_mob_update = drinker.heal_bodypart_damage(2 * REM * seconds_per_tick, 2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += drinker.adjustStaminaLoss(-2 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/ethanol/grasshopper + name = "Grasshopper" + description = "A fresh and sweet dessert shooter. Difficult to look manly while drinking this." + color = "#00ff00" + boozepwr = 25 + quality = DRINK_GOOD + taste_description = "chocolate and mint dancing around your mouth" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/stinger + name = "Stinger" + description = "A snappy way to end the day." + color = "#ccff99" + boozepwr = 25 + quality = DRINK_NICE + taste_description = "a slap on the face in the best possible way" + 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 + 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 + var/need_mob_update + var/heal_amt = min(volume, heal_points) //only heals 1 point of damage per unit on add, for balance reasons + need_mob_update = drinker.adjustBruteLoss(-heal_amt, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += drinker.adjustFireLoss(-heal_amt, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += drinker.adjustToxLoss(-heal_amt, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += drinker.adjustOxyLoss(-heal_amt, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += drinker.adjustStaminaLoss(-heal_amt, updating_stamina = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + drinker.updatehealth() + 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, seconds_per_tick, times_fired) + . = ..() + if(drinker.health > 0) + var/need_mob_update + need_mob_update = drinker.adjustBruteLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += drinker.adjustFireLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += drinker.adjustToxLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += drinker.adjustOxyLoss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += drinker.adjustStaminaLoss(-5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/ethanol/squirt_cider + name = "Squirt Cider" + description = "Fermented squirt extract with a nose of stale bread and ocean water. Whatever a squirt is." + color = "#FF0000" + boozepwr = 40 + taste_description = "stale bread with a staler aftertaste" + nutriment_factor = 2 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/squirt_cider/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + drinker.satiety += 5 * REM * seconds_per_tick //for context, vitamins give 15 satiety per second + +/datum/reagent/consumable/ethanol/fringe_weaver + name = "Fringe Weaver" + description = "Bubbly, classy, and undoubtedly strong - a Glitch City classic." + color = "#FFEAC4" + boozepwr = 90 //classy hooch, essentially, but lower pwr to make up for slightly easier access + quality = DRINK_GOOD + taste_description = "ethylic alcohol with a hint of sugar" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/sugar_rush + name = "Sugar Rush" + description = "Sweet, light, and fruity - as girly as it gets." + color = "#FF226C" + boozepwr = 10 + quality = DRINK_GOOD + taste_description = "your arteries clogging with sugar" + nutriment_factor = 2 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/sugar_rush/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + drinker.satiety -= 10 * REM * seconds_per_tick //junky as hell! a whole glass will keep you from being able to eat junk food + +/datum/reagent/consumable/ethanol/crevice_spike + name = "Crevice Spike" + description = "Sour, bitter, and smashingly sobering." + color = "#5BD231" + boozepwr = -10 //sobers you up - ideally, one would drink to get hit with brute damage now to avoid alcohol problems later + quality = DRINK_VERYGOOD + taste_description = "a bitter SPIKE with a sour aftertaste" + 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), required_bodytype = affected_bodytype) //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/sake + name = "Sake" + description = "A sweet rice wine of questionable legality and extreme potency." + color = "#DDDDDD" + boozepwr = 70 + taste_description = "sweet rice wine" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK + +/datum/reagent/consumable/ethanol/peppermint_patty + name = "Peppermint Patty" + description = "This lightly alcoholic drink combines the benefits of menthol and cocoa." + color = "#45ca7a" + taste_description = "mint and chocolate" + boozepwr = 25 + quality = DRINK_GOOD + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/peppermint_patty/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + drinker.apply_status_effect(/datum/status_effect/throat_soothed) + drinker.adjust_bodytemperature(5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 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" + 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.")) + +/datum/reagent/consumable/ethanol/alexander/on_mob_life(mob/living/drinker, seconds_per_tick, 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, volume) + return ..() + +/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/amaretto_alexander + name = "Amaretto Alexander" + description = "A weaker version of the Alexander, what it lacks in strength it makes up for in flavor." + color = "#DBD5AE" + boozepwr = 35 + quality = DRINK_VERYGOOD + taste_description = "sweet, creamy cacao" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/sidecar + name = "Sidecar" + description = "The one ride you'll gladly give up the wheel for." + color = "#FFC55B" + boozepwr = 45 + quality = DRINK_GOOD + taste_description = "delicious freedom" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_MEDIUM + +/datum/reagent/consumable/ethanol/between_the_sheets + name = "Between the Sheets" + description = "A provocatively named classic. Funny enough, doctors recommend drinking it before taking a nap while underneath bedsheets." + color = "#F4C35A" + boozepwr = 55 + quality = DRINK_GOOD + taste_description = "seduction" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_MEDIUM + +/datum/reagent/consumable/ethanol/between_the_sheets/on_mob_life(mob/living/drinker, seconds_per_tick, 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 + + if(!drinker.IsSleeping() || !is_between_the_sheets) + return + + var/need_mob_update + 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(prob(50)) + need_mob_update = drinker.adjustBruteLoss(-0.25 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + else + need_mob_update = drinker.adjustFireLoss(-0.25 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + else if(drinker.getBruteLoss()) //If you have only one, it still heals but not as well. + need_mob_update = drinker.adjustBruteLoss(-0.2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + else if(drinker.getFireLoss()) + need_mob_update = drinker.adjustFireLoss(-0.2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/ethanol/kamikaze + name = "Kamikaze" + description = "Divinely windy." + color = "#EEF191" + boozepwr = 60 + quality = DRINK_GOOD + taste_description = "divine windiness" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/mojito + name = "Mojito" + description = "A drink that looks as refreshing as it tastes." + color = "#DFFAD9" + boozepwr = 30 + quality = DRINK_GOOD + taste_description = "refreshing mint" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_MEDIUM + +/datum/reagent/consumable/ethanol/moscow_mule + name = "Moscow Mule" + description = "A chilly drink that reminds you of the Derelict." + color = "#EEF1AA" + boozepwr = 30 + quality = DRINK_GOOD + taste_description = "refreshing spiciness" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/fernet + name = "Fernet" + description = "An incredibly bitter herbal liqueur used as a digestif." + color = "#1B2E24" // rgb: 27, 46, 36 + boozepwr = 80 + taste_description = "utter bitterness" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/fernet/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + if(drinker.nutrition <= NUTRITION_LEVEL_STARVING) + if(drinker.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH + drinker.adjust_nutrition(-5 * REM * seconds_per_tick) + drinker.overeatduration = 0 + +/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." + color = "#390600" // rgb: 57, 6, + boozepwr = 25 + quality = DRINK_NICE + taste_description = "sweet relief" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/fernet_cola/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + if(drinker.nutrition <= NUTRITION_LEVEL_STARVING) + if(drinker.adjustToxLoss(0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH + drinker.adjust_nutrition(-3 * REM * seconds_per_tick) + drinker.overeatduration = 0 + +/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 + boozepwr = -10 + quality = DRINK_NICE + taste_description = "a sweet sobering mix" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_HIGH + +/datum/reagent/consumable/ethanol/fanciulli/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + drinker.adjust_nutrition(-5 * REM * seconds_per_tick) + drinker.overeatduration = 0 + +/datum/reagent/consumable/ethanol/fanciulli/on_mob_metabolize(mob/living/drinker) + . = ..() + if(drinker.health > 0) + drinker.adjustStaminaLoss(20, required_biotype = affected_biotype) + +/datum/reagent/consumable/ethanol/branca_menta + name = "Branca Menta" + description = "A refreshing mixture of bitter Fernet with mint creme liquour." + color = "#4B5746" // rgb: 75, 87, 70 + boozepwr = 35 + quality = DRINK_GOOD + taste_description = "a bitter freshness" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_MEDIUM + +/datum/reagent/consumable/ethanol/branca_menta/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + drinker.adjust_bodytemperature(-20 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, T0C) + +/datum/reagent/consumable/ethanol/branca_menta/on_mob_metabolize(mob/living/drinker) + . = ..() + if(drinker.health > 0) + drinker.adjustStaminaLoss(35, required_biotype = affected_biotype) + +/datum/reagent/consumable/ethanol/blank_paper + name = "Blank Paper" + description = "A bubbling glass of blank paper. Just looking at it makes you feel fresh." + nutriment_factor = 1 + color = "#DCDCDC" // rgb: 220, 220, 220 + boozepwr = 20 + quality = DRINK_GOOD + taste_description = "bubbling possibility" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/blank_paper/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + if(ishuman(drinker) && HAS_MIND_TRAIT(drinker, TRAIT_MIMING)) + drinker.set_silence_if_lower(MIMEDRINK_SILENCE_DURATION) + if(drinker.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/ethanol/fruit_wine + name = "Fruit Wine" + description = "A wine made from grown plants." + color = "#FFFFFF" + boozepwr = 35 + quality = DRINK_GOOD + 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) + return + + src.data = data + names = data["names"] + tastes = data["tastes"] + boozepwr = data["boozepwr"] + color = data["color"] + generate_data_info(data) + +/datum/reagent/consumable/ethanol/fruit_wine/on_merge(list/data, amount) + ..() + var/diff = (amount/volume) + if(diff < 1) + color = BlendRGB(color, data["color"], diff/2) //The percentage difference over two, so that they take average if equal. + else + color = BlendRGB(color, data["color"], (1/diff)/2) //Adjust so it's always blending properly. + var/oldvolume = volume-amount + + var/list/cachednames = data["names"] + for(var/name in names | cachednames) + names[name] = ((names[name] * oldvolume) + (cachednames[name] * amount)) / volume + + var/list/cachedtastes = data["tastes"] + for(var/taste in tastes | cachedtastes) + tastes[taste] = ((tastes[taste] * oldvolume) + (cachedtastes[taste] * amount)) / volume + + boozepwr *= oldvolume + var/newzepwr = data["boozepwr"] * amount + boozepwr += newzepwr + boozepwr /= volume //Blending boozepwr to volume. + generate_data_info(data) + +/datum/reagent/consumable/ethanol/fruit_wine/proc/generate_data_info(list/data) + // BYOND's compiler fails to catch non-consts in a ranged switch case, and it causes incorrect behavior. So this needs to explicitly be a constant. + var/const/minimum_percent = 0.15 //Percentages measured between 0 and 1. + var/list/primary_tastes = list() + var/list/secondary_tastes = list() + for(var/taste in tastes) + switch(tastes[taste]) + if(minimum_percent*2 to INFINITY) + primary_tastes += taste + if(minimum_percent to minimum_percent*2) + secondary_tastes += taste + + var/minimum_name_percent = 0.35 + name = "" + var/list/names_in_order = sortTim(names, GLOBAL_PROC_REF(cmp_numeric_dsc), TRUE) + var/named = FALSE + for(var/fruit_name in names) + if(names[fruit_name] >= minimum_name_percent) + name += "[fruit_name] " + named = TRUE + if(named) + name += "Wine" + else + name = "Mixed [names_in_order[1]] Wine" + + var/alcohol_description + switch(boozepwr) + if(120 to INFINITY) + alcohol_description = "suicidally strong" + if(90 to 120) + alcohol_description = "rather strong" + if(70 to 90) + alcohol_description = "strong" + if(40 to 70) + alcohol_description = "rich" + if(20 to 40) + alcohol_description = "mild" + if(0 to 20) + alcohol_description = "sweet" + else + alcohol_description = "watery" //How the hell did you get negative boozepwr? + + var/list/fruits = list() + if(names_in_order.len <= 3) + fruits = names_in_order + else + for(var/i in 1 to 3) + fruits += names_in_order[i] + fruits += "other plants" + var/fruit_list = english_list(fruits) + description = "A [alcohol_description] wine brewed from [fruit_list]." + + var/flavor = "" + if(!primary_tastes.len) + primary_tastes = list("[alcohol_description] alcohol") + flavor += english_list(primary_tastes) + if(secondary_tastes.len) + flavor += ", with a hint of " + flavor += english_list(secondary_tastes) + taste_description = flavor + +/datum/reagent/consumable/ethanol/champagne //How the hell did we not have champagne already!? + name = "Champagne" + description = "A sparkling wine known for its ability to strike fast and hard." + color = "#ffffc1" + boozepwr = 40 + taste_description = "auspicious occasions and bad decisions" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_EASY + +/datum/reagent/consumable/ethanol/wizz_fizz + name = "Wizz Fizz" + description = "A magical potion, fizzy and wild! However the taste, you will find, is quite mild." + color = "#4235d0" //Just pretend that the triple-sec was blue curacao. + boozepwr = 50 + quality = DRINK_GOOD + taste_description = "friendship! It is magic, after all" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/wizz_fizz/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, 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)) + var/need_mob_update + need_mob_update = drinker.heal_bodypart_damage(1 * REM * seconds_per_tick, 1 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += drinker.adjustOxyLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += drinker.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += drinker.adjustStaminaLoss(-1 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/ethanol/bug_spray + name = "Bug Spray" + description = "A harsh, acrid, bitter drink, for those who need something to brace themselves." + color = "#33ff33" + boozepwr = 50 + quality = DRINK_GOOD + taste_description = "the pain of ten thousand slain mosquitos" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + affected_biotype = MOB_BUG + +/datum/reagent/consumable/ethanol/bug_spray/on_new(data) + . = ..() + AddElement(/datum/element/bugkiller_reagent) + +/datum/reagent/consumable/ethanol/bug_spray/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + // Does some damage to bug biotypes + if(drinker.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH + // Random chance of causing a screm if we did some damage + if(SPT_PROB(2, seconds_per_tick)) + drinker.emote("scream") + +/datum/reagent/consumable/ethanol/applejack + name = "Applejack" + description = "The perfect beverage for when you feel the need to horse around." + color = "#ff6633" + boozepwr = 20 + taste_description = "an honest day's work at the orchard" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/jack_rose + name = "Jack Rose" + description = "A light cocktail perfect for sipping with a slice of pie." + color = "#ff6633" + boozepwr = 15 + quality = DRINK_NICE + taste_description = "a sweet and sour slice of apple" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/turbo + name = "Turbo" + description = "A turbulent cocktail associated with outlaw hoverbike racing. Not for the faint of heart." + color = "#e94c3a" + boozepwr = 85 + quality = DRINK_VERYGOOD + taste_description = "the outlaw spirit" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/turbo/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + if(SPT_PROB(2, seconds_per_tick)) + 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..")]")) + if(drinker.adjustStaminaLoss(-0.25 * drinker.get_drunk_amount() * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/ethanol/old_timer + name = "Old Timer" + description = "An archaic potation enjoyed by old coots of all ages." + color = "#996835" + boozepwr = 35 + quality = DRINK_NICE + taste_description = "simpler times" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/old_timer/on_mob_life(mob/living/carbon/human/metabolizer, seconds_per_tick, times_fired) + . = ..() + if(SPT_PROB(10, seconds_per_tick) && istype(metabolizer)) + metabolizer.age += 1 + if(metabolizer.age > 70) + metabolizer.set_facial_haircolor("#cccccc", update = FALSE) + metabolizer.set_haircolor("#cccccc", update = TRUE) + if(metabolizer.age > 100) + metabolizer.become_nearsighted(type) + if(metabolizer.gender == MALE) + metabolizer.set_facial_hairstyle("Beard (Very Long)", update = TRUE) + + if(metabolizer.age > 969) //Best not let people get older than this or i might incur G-ds wrath + 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) + +/datum/reagent/consumable/ethanol/rubberneck + name = "Rubberneck" + description = "A quality rubberneck should not contain any gross natural ingredients." + color = "#ffe65b" + boozepwr = 60 + quality = DRINK_GOOD + taste_description = "artifical fruityness" + 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/duplex + name = "Duplex" + description = "An inseparable combination of two fruity drinks." + color = "#50e5cf" + boozepwr = 25 + quality = DRINK_NICE + taste_description = "green apples and blue raspberries" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/trappist + name = "Trappist Beer" + description = "A strong dark ale brewed by space-monks." + color = "#390c00" + boozepwr = 40 + quality = DRINK_VERYGOOD + taste_description = "dried plums and malt" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/trappist/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + if(drinker.mind?.holy_role) + if(drinker.adjustFireLoss(-2.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype)) + . = UPDATE_MOB_HEALTH + drinker.adjust_jitter(-2 SECONDS * REM * seconds_per_tick) + drinker.adjust_stutter(-2 SECONDS * REM * seconds_per_tick) + +/datum/reagent/consumable/ethanol/blazaam + name = "Blazaam" + description = "A strange drink that few people seem to remember existing. Doubles as a Berenstain remover." + boozepwr = 70 + quality = DRINK_FANTASTIC + taste_description = "alternate realities" + var/stored_teleports = 0 + +/datum/reagent/consumable/ethanol/blazaam/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + if(drinker.get_drunk_amount() > 40) + if(stored_teleports) + do_teleport(drinker, get_turf(drinker), rand(1,3), channel = TELEPORT_CHANNEL_WORMHOLE) + stored_teleports-- + + if(SPT_PROB(5, seconds_per_tick)) + stored_teleports += rand(2, 6) + if(prob(70)) + drinker.vomit(vomit_flags = VOMIT_CATEGORY_DEFAULT, vomit_type = /obj/effect/decal/cleanable/vomit/purple) + +/datum/reagent/consumable/ethanol/planet_cracker + name = "Planet Cracker" + description = "This jubilant drink celebrates humanity's triumph over the alien menace. May be offensive to non-human crewmembers." + boozepwr = 50 + quality = DRINK_FANTASTIC + taste_description = "triumph with a hint of bitterness" + +/datum/reagent/consumable/ethanol/mauna_loa + name = "Mauna Loa" + description = "Extremely hot; not for the faint of heart!" + boozepwr = 40 + color = "#fe8308" // 254, 131, 8 + quality = DRINK_FANTASTIC + taste_description = "fiery, with an aftertaste of burnt flesh" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/mauna_loa/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + // 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 * seconds_per_tick) + if (SPT_PROB(2.5, seconds_per_tick)) + drinker.adjust_fire_stacks(1 * REM * seconds_per_tick) + drinker.ignite_mob() + +/datum/reagent/consumable/ethanol/painkiller + name = "Painkiller" + description = "Dulls your pain. Your emotional pain, that is." + boozepwr = 20 + color = "#EAD677" + quality = DRINK_NICE + taste_description = "sugary tartness" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/pina_colada + name = "Pina Colada" + description = "A fresh pineapple drink with coconut rum. Yum." + boozepwr = 40 + color = "#FFF1B2" + quality = DRINK_FANTASTIC + taste_description = "pineapple, coconut, and a hint of the ocean" + +/datum/reagent/consumable/ethanol/pina_olivada + name = "Piña Olivada" + description = "An oddly designed concoction of olive oil and pineapple juice." + boozepwr = 20 // the oil coats your gastrointestinal tract, meaning you can't absorb as much alcohol. horrifying + color = "#493c00" + quality = DRINK_NICE + taste_description = "a horrible emulsion of pineapple and olive oil" + +/datum/reagent/consumable/ethanol/pina_olivada/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + if(SPT_PROB(8, seconds_per_tick)) + drinker.manual_emote(pick("coughs up some oil", "swallows the lump in [drinker.p_their()] throat", "gags", "chokes up a bit")) + if(SPT_PROB(3, seconds_per_tick)) + var/static/list/messages = list( + "A horrible aftertaste coats your mouth.", + "You feel like you're going to choke on the oil in your throat.", + "You start to feel some heartburn coming on.", + "You want to throw up, but you know that nothing can come out due to the clog in your esophagus.", + "Your throat feels horrible.", + ) + to_chat(drinker, span_notice(pick(messages))) + +/datum/reagent/consumable/ethanol/pruno // pruno mix is in drink_reagents + name = "Pruno" + color = "#E78108" + description = "Fermented prison wine made from fruit, sugar, and despair. Security loves to confiscate this, which is the only kind thing Security has ever done." + boozepwr = 85 + taste_description = "your tastebuds being individually shanked" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/pruno/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + drinker.adjust_disgust(5 * REM * seconds_per_tick) + +/datum/reagent/consumable/ethanol/ginger_amaretto + name = "Ginger Amaretto" + description = "A delightfully simple cocktail that pleases the senses." + boozepwr = 30 + color = "#EFB42A" + quality = DRINK_GOOD + taste_description = "sweetness followed by a soft sourness and warmth" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/godfather + name = "Godfather" + description = "A rough cocktail with illegal connections." + boozepwr = 50 + color = "#E68F00" + quality = DRINK_GOOD + taste_description = "a delightful softened punch" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_MEDIUM + +/datum/reagent/consumable/ethanol/godmother + name = "Godmother" + description = "A twist on a classic, liked more by mature women." + boozepwr = 50 + color = "#E68F00" + quality = DRINK_GOOD + taste_description = "sweetness and a zesty twist" + 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." + boozepwr = 25 + color = "#EEC39A" + quality = DRINK_GOOD + taste_description = "sweet nectar" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/kortara/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + if(drinker.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) + if(drinker.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 0, updating_health = FALSE)) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/ethanol/sea_breeze + name = "Sea Breeze" + description = "Light and refreshing with a mint and cocoa hit- like mint choc chip ice cream you can drink!" + boozepwr = 15 + color = "#CFFFE5" + quality = DRINK_VERYGOOD + taste_description = "mint choc chip" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/sea_breeze/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + drinker.apply_status_effect(/datum/status_effect/throat_soothed) + +/datum/reagent/consumable/ethanol/white_tiziran + name = "White Tiziran" + description = "A mix of vodka and kortara. The Lizard imbibes." + boozepwr = 65 + color = "#A68340" + quality = DRINK_GOOD + taste_description = "strikes and gutters" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/drunken_espatier + name = "Drunken Espatier" + description = "Look, if you had to get into a shootout in the cold vacuum of space, you'd want to be drunk too." + boozepwr = 65 + color = "#A68340" + quality = DRINK_GOOD + taste_description = "sorrow" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/drunken_espatier/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + drinker.add_mood_event("numb", /datum/mood_event/narcotic_medium, name) //comfortably numb + +/datum/reagent/consumable/ethanol/drunken_espatier/on_mob_metabolize(mob/living/drinker) + . = ..() + drinker.apply_status_effect(/datum/status_effect/grouped/screwy_hud/fake_healthy, type) + +/datum/reagent/consumable/ethanol/drunken_espatier/on_mob_end_metabolize(mob/living/drinker) + . = ..() + drinker.remove_status_effect(/datum/status_effect/grouped/screwy_hud/fake_healthy, type) + +/datum/reagent/consumable/ethanol/protein_blend + name = "Protein Blend" + description = "A vile blend of protein, pure grain alcohol, korta flour, and blood. Useful for bulking up, if you can keep it down." + boozepwr = 65 + color = "#FF5B69" + quality = DRINK_NICE + taste_description = "regret" + nutriment_factor = 3 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/protein_blend/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + drinker.adjust_nutrition(2 * REM * seconds_per_tick) + if(!islizard(drinker)) + drinker.adjust_disgust(5 * REM * seconds_per_tick) + else + drinker.adjust_disgust(2 * REM * seconds_per_tick) + +/datum/reagent/consumable/ethanol/mushi_kombucha + name = "Mushi Kombucha" + description = "A popular summer beverage on Tizira, made from sweetened mushroom tea." + boozepwr = 10 + color = "#C46400" + quality = DRINK_VERYGOOD + taste_description = "sweet 'shrooms" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/triumphal_arch + name = "Triumphal Arch" + description = "A drink celebrating the Lizard Empire and its military victories. It's popular at bars on Unification Day." + boozepwr = 60 + color = "#FFD700" + quality = DRINK_FANTASTIC + taste_description = "victory" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/triumphal_arch/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + if(islizard(drinker)) + drinker.add_mood_event("triumph", /datum/mood_event/memories_of_home, name) + +/datum/reagent/consumable/ethanol/the_juice + name = "The Juice" + description = "Woah man, this like, feels familiar to you dude." + color = "#4c14be" + boozepwr = 50 + quality = DRINK_GOOD + taste_description = "like, the future, man" + 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_end_metabolize(mob/living/carbon/drinker) + . = ..() + 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 + name = "Ritual Wine" + description = "The dangerous, potent, alcoholic component of ritual wine." + color = rgb(35, 231, 25) + boozepwr = 90 //enjoy near death intoxication + taste_mult = 6 + taste_description = "concentrated herbs" + +/datum/reagent/consumable/ethanol/ritual_wine/on_mob_metabolize(mob/living/psychonaut) + . = ..() + 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) + . = ..() + 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.remove_filter("ritual_wine") + +//Moth Drinks +/datum/reagent/consumable/ethanol/curacao + name = "Curaçao" + description = "Made with laraha oranges, for an aromatic finish." + boozepwr = 30 + color = "#1a5fa1" + quality = DRINK_NICE + taste_description = "blue orange" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/navy_rum //IN THE NAVY + name = "Navy Rum" + description = "Rum as the finest sailors drink." + boozepwr = 90 //the finest sailors are often drunk + color = "#d8e8f0" + quality = DRINK_NICE + taste_description = "a life on the waves" + 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" + description = "A bartender's best friend, often used to lend a delicate spiciness to any drink. Produced in New Trinidad, now and forever." + boozepwr = 70 + color = "#1c0000" + quality = DRINK_NICE + taste_description = "spiced alcohol" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/admiralty //navy rum, vermouth, fernet + name = "Admiralty" + description = "A refined, bitter drink made with navy rum, vermouth and fernet." + boozepwr = 100 + color = "#1F0001" + quality = DRINK_VERYGOOD + taste_description = "haughty arrogance" + 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" + description = "A favourite amongst freighter pilots, unscrupulous smugglers, and nerf herders." + boozepwr = 35 + color = "#003153" + quality = DRINK_VERYGOOD + taste_description = "companionship" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/long_john_silver //navy rum, bitters, lemonade + name = "Long John Silver" + description = "A long drink of navy rum, bitters, and lemonade. Particularly popular aboard the Mothic Fleet as it's light on ration credits and heavy on flavour." + boozepwr = 50 + color = "#c4b35c" + quality = DRINK_VERYGOOD + taste_description = "rum and spices" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/tropical_storm //dark rum, pineapple juice, triple citrus, curacao + name = "Tropical Storm" + description = "A taste of the Caribbean in one glass." + boozepwr = 40 + color = "#00bfa3" + quality = DRINK_VERYGOOD + taste_description = "the tropics" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/dark_and_stormy //rum and ginger beer- simple and classic + name = "Dark and Stormy" + description = "A classic drink arriving to thunderous applause." //thank you, thank you, I'll be here forever + boozepwr = 50 + color = "#8c5046" + quality = DRINK_GOOD + taste_description = "ginger and rum" + 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" + description = "A bracing sour with an interesting salty taste." + boozepwr = 60 + color = "#b4abd0" + quality = DRINK_FANTASTIC + taste_description = "salt and spice" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/tiltaellen //yoghurt, salt, vinegar + name = "Tiltällen" + description = "A lightly fermented yoghurt drink with salt and a light dash of vinegar. Has a distinct sour cheesy flavour." + boozepwr = 10 + color = "#F4EFE2" + quality = DRINK_NICE + taste_description = "sour cheesy yoghurt" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/tich_toch + name = "Tich Toch" + description = "A mix of Tiltällen, Töchtaüse Syrup, and vodka. It's not exactly to everyones' tastes." + boozepwr = 75 + color = "#b4abd0" + quality = DRINK_VERYGOOD + taste_description = "spicy sour cheesy yoghurt" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/helianthus + name = "Helianthus" + description = "A dark yet radiant mixture of absinthe and hallucinogens. The choice of all true artists." + boozepwr = 75 + color = "#fba914" + quality = DRINK_VERYGOOD + taste_description = "golden memories" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + var/hal_amt = 4 + var/hal_cap = 24 + +/datum/reagent/consumable/ethanol/helianthus/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + if(SPT_PROB(5, seconds_per_tick)) + drinker.adjust_hallucinations_up_to(4 SECONDS * REM * seconds_per_tick, 48 SECONDS) + +/datum/reagent/consumable/ethanol/plumwine + name = "Plum wine" + description = "Plums turned into wine." + color = "#8a0421" + nutriment_factor = 1 + boozepwr = 20 + taste_description = "a poet's love and undoing" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK + +/datum/reagent/consumable/ethanol/the_hat + name = "The Hat" + description = "A fancy drink, usually served in a man's hat." + color = "#b90a5c" + boozepwr = 80 + quality = DRINK_NICE + taste_description = "something perfumy" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK + +/datum/reagent/consumable/ethanol/gin_garden + name = "Gin Garden" + description = "Excellent cooling alcoholic drink with not so ordinary taste." + boozepwr = 20 + color = "#6cd87a" + quality = DRINK_VERYGOOD + taste_description = "light gin with sweet ginger and cucumber" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/gin_garden/on_mob_life(mob/living/carbon/doll, seconds_per_tick, times_fired) + . = ..() + doll.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, doll.get_body_temp_normal()) + +/datum/reagent/consumable/ethanol/wine_voltaic + name = "Voltaic Yellow Wine" + description = "Electrically charged wine. Recharges ethereals, but also nontoxic." + boozepwr = 30 + color = "#FFAA00" + taste_description = "static with a hint of sweetness" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/wine_voltaic/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) //can't be on life because of the way blood works. + . = ..() + if(!(methods & (INGEST|INJECT|PATCH)) || !iscarbon(exposed_mob)) + return + + var/mob/living/carbon/exposed_carbon = exposed_mob + var/obj/item/organ/internal/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) + if(istype(stomach)) + stomach.adjust_charge(reac_volume * 3) + +/datum/reagent/consumable/ethanol/telepole + name = "Telepole" + description = "A grounding rod in the form of a drink. Recharges ethereals, and gives temporary shock resistance." + boozepwr = 50 + color = "#b300ff" + quality = DRINK_NICE + taste_description = "the howling storm" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/telepole/on_mob_metabolize(mob/living/affected_mob) + . = ..() + ADD_TRAIT(affected_mob, TRAIT_SHOCKIMMUNE, type) + +/datum/reagent/consumable/ethanol/telepole/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() + REMOVE_TRAIT(affected_mob, TRAIT_SHOCKIMMUNE, type) + +/datum/reagent/consumable/ethanol/telepole/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) //can't be on life because of the way blood works. + . = ..() + if(!(methods & (INGEST|INJECT|PATCH)) || !iscarbon(exposed_mob)) + return + + var/mob/living/carbon/exposed_carbon = exposed_mob + var/obj/item/organ/internal/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) + if(istype(stomach)) + stomach.adjust_charge(reac_volume * 2) + +/datum/reagent/consumable/ethanol/pod_tesla + name = "Pod Tesla" + description = "Ride the lightning! Recharges ethereals, suppresses phobias, and gives strong temporary shock resistance." + boozepwr = 80 + color = "#00fbff" + quality = DRINK_FANTASTIC + taste_description = "victory, with a hint of insanity" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/pod_tesla/on_mob_metabolize(mob/living/affected_mob) + . = ..() + affected_mob.add_traits(list(TRAIT_SHOCKIMMUNE,TRAIT_TESLA_SHOCKIMMUNE,TRAIT_FEARLESS), type) + +/datum/reagent/consumable/ethanol/pod_tesla/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() + affected_mob.remove_traits(list(TRAIT_SHOCKIMMUNE,TRAIT_TESLA_SHOCKIMMUNE,TRAIT_FEARLESS), type) + +/datum/reagent/consumable/ethanol/pod_tesla/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) //can't be on life because of the way blood works. + . = ..() + if(!(methods & (INGEST|INJECT|PATCH)) || !iscarbon(exposed_mob)) + return + + var/mob/living/carbon/exposed_carbon = exposed_mob + var/obj/item/organ/internal/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) + if(istype(stomach)) + stomach.adjust_charge(reac_volume * 5) + +// Welcome to the Blue Room Bar and Grill, home to Mars' finest cocktails +/datum/reagent/consumable/ethanol/rice_beer + name = "Rice Beer" + description = "A light, rice-based lagered beer popular on Mars. Considered a hate crime against Bavarians under the Reinheitsgebot Act of 1516." + boozepwr = 5 + color = "#664300" + quality = DRINK_NICE + taste_description = "mild carbonated malt" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/shochu + name = "Shochu" + description = "Also known as soju or baijiu, this drink is made from fermented rice, much like sake, but at a generally higher proof making it more similar to a true spirit." + boozepwr = 45 + color = "#DDDDDD" + quality = DRINK_NICE + taste_description = "stiff rice wine" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/yuyake + name = "Yūyake" + description = "A sweet melon liqueur from Japan. Considered a relic of the 1980s by most, it has some niche use in cocktail making, in part due to its bright red colour." + boozepwr = 40 + color = "#F54040" + quality = DRINK_NICE + taste_description = "sweet melon" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/coconut_rum + name = "Coconut Rum" + description = "The distilled essence of the beach. Tastes like bleach-blonde hair and suncream." + boozepwr = 21 + color = "#F54040" + quality = DRINK_NICE + taste_description = "coconut rum" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +// Mixed Martian Drinks +/datum/reagent/consumable/ethanol/yuyakita + name = "Yūyakita" + description = "A hell unleashed upon the world by an unnamed patron." + boozepwr = 40 + color = "#F54040" + quality = DRINK_NICE + taste_description = "death" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/saibasan + name = "Saibāsan" + description = "A drink glorifying Cybersun's enduring business." + boozepwr = 20 + color = "#F54040" + quality = DRINK_NICE + taste_description = "betrayal" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/banzai_ti + name = "Banzai-Tī" + description = "A variation on the Long Island Iced Tea, made with yuyake for an alternative flavour that's hard to place." + boozepwr = 40 + color = "#F54040" + quality = DRINK_NICE + taste_description = "an asian twist on the liquor cabinet" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/sanraizusoda + name = "Sanraizusōda" + description = "It's a melon cream soda, except with alcohol- what's not to love? Well... possibly the hangovers." + boozepwr = 6 + color = "#F54040" + quality = DRINK_NICE + taste_description = "creamy melon soda" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/kumicho + name = "Kumichō" + description = "A new take on a classic cocktail, the Kumicho takes the Godfather formula and adds shochu for an Asian twist." + boozepwr = 62 + color = "#F54040" + quality = DRINK_NICE + taste_description = "rice and rye" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/red_planet + name = "Red Planet" + description = "Made in celebration of the Martian Concession, the Red Planet is based on the classic El Presidente, and is as patriotic as it is bright crimson." + boozepwr = 45 + color = "#F54040" + quality = DRINK_NICE + taste_description = "the spirit of freedom" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/amaterasu + name = "Amaterasu" + description = "Named for Amaterasu, the Shinto Goddess of the Sun, this cocktail embodies radiance- or something like that, anyway." + boozepwr = 54 //1 part bitters is a lot + color = "#F54040" + quality = DRINK_NICE + taste_description = "sweet nectar of the gods" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/nekomimosa + name = "Nekomimosa" + description = "An overly sweet cocktail, made with melon liqueur, melon juice, and champagne (which contains no melon, unfortunately)." + boozepwr = 17 + color = "#FF0C8D" + quality = DRINK_NICE + taste_description = "MELON" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/sentai_quencha //melon soda, triple citrus, shochu, blue curacao + name = "Sentai Quencha" + description = "Based on the galaxy-famous \"Kyūkyoku no Ninja Pawā Sentai\", the Sentai Quencha is a favourite at anime conventions and weeb bars." + boozepwr = 28 + color = "#F54040" + quality = DRINK_NICE + taste_description = "ultimate ninja power" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/bosozoku + name = "Bōsōzoku" + description = "A simple summer drink from Mars, made from a 1:1 mix of rice beer and lemonade." + boozepwr = 6 + color = "#F54040" + quality = DRINK_NICE + taste_description = "bittersweet lemon" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/ersatzche + name = "Ersatzche" + description = "Sweet, bitter, spicy- that's a great combination." + boozepwr = 6 + color = "#F54040" + quality = DRINK_NICE + taste_description = "spicy pineapple beer" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/red_city_am + name = "Red City AM" + description = "A breakfast drink from New Osaka, for when you really need to get drunk at 9:30 in the morning in more socially acceptable manner than drinking bagwine on the bullet train. Not that you should drink this on the bullet train either." + boozepwr = 5 //this thing is fucking disgusting and both less tasty and less alcoholic than a bloody mary. it is against god and nature + color = "#F54040" + quality = DRINK_NICE + taste_description = "breakfast in a glass" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/kings_ransom + name = "King's Ransom" + description = "A stiff, bitter drink with an odd name and odder recipe." + boozepwr = 26 + color = "#F54040" + quality = DRINK_NICE + taste_description = "bitter raspberry" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/four_bit + name = "Four Bit" + description = "A drink to power your typing hands." + boozepwr = 26 + color = "#F54040" + quality = DRINK_NICE + taste_description = "cyberspace" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/white_hawaiian //coconut milk, coconut rum, coffee liqueur + name = "White Hawaiian" + description = "A take on the classic White Russian, subbing out the classics for some tropical flavours." + boozepwr = 16 + color = "#F54040" + quality = DRINK_NICE + taste_description = "COCONUT" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/maui_sunrise //coconut rum, pineapple juice, yuyake, triple citrus, lemon-lime soda + name = "Maui Sunrise" + description = "Behind this drink's red facade lurks a sharp, complex flavour." + boozepwr = 15 + color = "#F54040" + quality = DRINK_NICE + taste_description = "sunrise over the pacific" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/imperial_mai_tai //navy rum, rum, lime, triple sec, korta nectar + name = "Imperial Mai Tai" + description = "For when orgeat is in short supply, do as the spacers do- make do and mend." + boozepwr = 52 + color = "#F54040" + quality = DRINK_NICE + taste_description = "spicy nutty rum" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/konococo_rumtini //todo: add espresso | coffee, coffee liqueur, coconut rum, sugar + name = "Konococo Rumtini" + description = "Coconut rum, coffee liqueur, and espresso- an odd combination, to be sure, but a welcomed one." + boozepwr = 20 + color = "#F54040" + quality = DRINK_NICE + taste_description = "coconut coffee" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/blue_hawaiian //pineapple juice, lemon juice, coconut rum, blue curacao + name = "Blue Hawaiian" + description = "Sweet, sharp and coconutty." + boozepwr = 30 + color = "#F54040" + quality = DRINK_NICE + taste_description = "the aloha state" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +#undef ALCOHOL_EXPONENT +#undef ALCOHOL_THRESHOLD_MODIFIER diff --git a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm new file mode 100644 index 0000000000000..8270b42f502d0 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm @@ -0,0 +1,1254 @@ +/datum/reagent/consumable/orangejuice + name = "Orange Juice" + description = "Both delicious AND rich in Vitamin C, what more do you need?" + color = "#E78108" // rgb: 231, 129, 8 + taste_description = "oranges" + ph = 3.3 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + default_container = /obj/item/reagent_containers/cup/glass/bottle/juice/orangejuice + +/datum/reagent/consumable/orangejuice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(affected_mob.getOxyLoss() && SPT_PROB(16, seconds_per_tick)) + if(affected_mob.adjustOxyLoss(-1 * REM * seconds_per_tick, FALSE, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type)) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/tomatojuice + name = "Tomato Juice" + description = "Tomatoes made into juice. What a waste of big, juicy tomatoes, huh?" + color = "#731008" // rgb: 115, 16, 8 + taste_description = "tomatoes" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + default_container = /obj/item/reagent_containers/cup/glass/bottle/juice/tomatojuice + +/datum/reagent/consumable/tomatojuice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(affected_mob.getFireLoss() && SPT_PROB(10, seconds_per_tick)) + if(affected_mob.heal_bodypart_damage(brute = 0, burn = 1 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/limejuice + name = "Lime Juice" + description = "The sweet-sour juice of limes." + color = "#365E30" // rgb: 54, 94, 48 + taste_description = "unbearable sourness" + ph = 2.2 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + default_container = /obj/item/reagent_containers/cup/glass/bottle/juice/limejuice + +/datum/reagent/consumable/limejuice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(affected_mob.getToxLoss() && SPT_PROB(10, seconds_per_tick)) + if(affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/carrotjuice + name = "Carrot Juice" + description = "It is just like a carrot but without crunching." + color = "#973800" // rgb: 151, 56, 0 + taste_description = "carrots" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/carrotjuice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_eye_blur(-2 SECONDS * REM * seconds_per_tick) + affected_mob.adjust_temp_blindness(-2 SECONDS * REM * seconds_per_tick) + var/need_mob_update + switch(current_cycle) + if(1 to 20) + //nothing + if(21 to 110) + if(SPT_PROB(100 * (1 - (sqrt(110 - current_cycle) / 10)), seconds_per_tick)) + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_EYES, -2 * REM * seconds_per_tick) + if(110 to INFINITY) + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_EYES, -2 * REM * seconds_per_tick) + if(need_mob_update) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/berryjuice + name = "Berry Juice" + description = "A delicious blend of several different kinds of berries." + color = "#863333" // rgb: 134, 51, 51 + taste_description = "berries" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/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" + description = "A tasty juice blended from various kinds of very deadly and toxic berries." + color = "#863353" // rgb: 134, 51, 83 + taste_description = "berries" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/poisonberryjuice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/watermelonjuice + name = "Watermelon Juice" + description = "Delicious juice made from watermelon." + color = "#863333" // rgb: 134, 51, 51 + taste_description = "juicy watermelon" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/lemonjuice + name = "Lemon Juice" + description = "This juice is VERY sour." + color = "#863333" // rgb: 175, 175, 0 + taste_description = "sourness" + ph = 2 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/banana + name = "Banana Juice" + description = "The raw essence of a banana. HONK" + color = "#863333" // rgb: 175, 175, 0 + taste_description = "banana" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/banana/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) + if((liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) || ismonkey(affected_mob)) + if(affected_mob.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/nothing + name = "Nothing" + description = "Absolutely nothing." + taste_description = "nothing" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/glass_style/shot_glass/nothing + required_drink_type = /datum/reagent/consumable/nothing + icon_state = "shotglass" + +/datum/reagent/consumable/nothing/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + if(ishuman(drinker) && HAS_MIND_TRAIT(drinker, TRAIT_MIMING)) + drinker.set_silence_if_lower(MIMEDRINK_SILENCE_DURATION) + if(drinker.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/laughter + name = "Laughter" + description = "Some say that this is the best medicine, but recent studies have proven that to be untrue." + metabolization_rate = INFINITY + color = "#FF4DD2" + taste_description = "laughter" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/laughter/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.emote("laugh") + affected_mob.add_mood_event("chemical_laughter", /datum/mood_event/chemical_laughter) + +/datum/reagent/consumable/superlaughter + name = "Super Laughter" + description = "Funny until you're the one laughing." + metabolization_rate = 1.5 * REAGENTS_METABOLISM + color = "#FF4DD2" + taste_description = "laughter" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/superlaughter/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(SPT_PROB(16, seconds_per_tick)) + affected_mob.visible_message(span_danger("[affected_mob] bursts out into a fit of uncontrollable laughter!"), span_userdanger("You burst out in a fit of uncontrollable laughter!")) + affected_mob.Stun(5) + affected_mob.add_mood_event("chemical_laughter", /datum/mood_event/chemical_superlaughter) + +/datum/reagent/consumable/potato_juice + name = "Potato Juice" + description = "Juice of the potato. Bleh." + nutriment_factor = 2 + color = "#302000" // rgb: 48, 32, 0 + taste_description = "irish sadness" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/pickle + name = "Pickle Juice" + description = "More accurately, this is the brine the pickle was floating in" + nutriment_factor = 2 + color = "#302000" // rgb: 48, 32, 0 + taste_description = "vinegar brine" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/pickle/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) + if((liver && HAS_TRAIT(liver, TRAIT_CORONER_METABOLISM))) + if(affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH + +/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/plumjuice + name = "Plum Juice" + description = "Refreshing and slightly acidic beverage." + color = "#b6062c" + taste_description = "plums" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/milk + name = "Milk" + description = "An opaque white liquid produced by the mammary glands of mammals." + color = "#DFDFDF" // rgb: 223, 223, 223 + taste_description = "milk" + ph = 6.5 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + default_container = /obj/item/reagent_containers/condiment/milk + +// Milk is good for humans, but bad for plants. +// The sugars cannot be used by plants, and the milk fat harms growth. Except shrooms. +/datum/reagent/consumable/milk/on_hydroponics_apply(obj/machinery/hydroponics/mytray, mob/user) + mytray.adjust_waterlevel(round(volume * 0.3)) + var/obj/item/seeds/myseed = mytray.myseed + if(isnull(myseed) || myseed.get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism)) + return + myseed.adjust_potency(-round(volume * 0.5)) + +/datum/reagent/consumable/milk/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + if(affected_mob.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) + if(affected_mob.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 0, updating_health = FALSE)) + . = UPDATE_MOB_HEALTH + if(holder.has_reagent(/datum/reagent/consumable/capsaicin)) + holder.remove_reagent(/datum/reagent/consumable/capsaicin, 1 * seconds_per_tick) + return ..() || . + +/datum/reagent/consumable/soymilk + name = "Soy Milk" + description = "An opaque white liquid made from soybeans." + color = "#DFDFC7" // rgb: 223, 223, 199 + taste_description = "soy milk" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + default_container = /obj/item/reagent_containers/condiment/soymilk + +/datum/reagent/consumable/soymilk/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(affected_mob.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) + if(affected_mob.heal_bodypart_damage(1, 0)) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/cream + name = "Cream" + description = "The fatty, still liquid part of milk. Why don't you mix this with sum scotch, eh?" + color = "#DFD7AF" // rgb: 223, 215, 175 + taste_description = "creamy milk" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + default_container = /obj/item/reagent_containers/cup/glass/bottle/juice/cream + +/datum/reagent/consumable/cream/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + if(affected_mob.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) + affected_mob.heal_bodypart_damage(1, 0) + . = TRUE + ..() + +/datum/reagent/consumable/coffee + name = "Coffee" + description = "Coffee is a brewed drink prepared from roasted seeds, commonly called coffee beans, of the coffee plant." + color = "#482000" // rgb: 72, 32, 0 + nutriment_factor = 0 + overdose_threshold = 80 + taste_description = "bitterness" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK + + +/datum/reagent/consumable/coffee/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) + +/datum/reagent/consumable/coffee/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + affected_mob.adjust_dizzy(-10 SECONDS * REM * seconds_per_tick) + affected_mob.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) + affected_mob.AdjustSleeping(-40 * REM * seconds_per_tick) + //310.15 is the normal bodytemp. + affected_mob.adjust_bodytemperature(25 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, affected_mob.get_body_temp_normal()) + if(holder.has_reagent(/datum/reagent/consumable/frostoil)) + holder.remove_reagent(/datum/reagent/consumable/frostoil, 5 * REM * seconds_per_tick) + return ..() || . + +/datum/reagent/consumable/tea + name = "Tea" + description = "Tasty black tea, it has antioxidants, it's good for you!" + color = "#101000" // rgb: 16, 16, 0 + nutriment_factor = 0 + taste_description = "tart black tea" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK + default_container = /obj/item/reagent_containers/cup/glass/mug/tea + +/datum/reagent/consumable/tea/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_dizzy(-4 SECONDS * REM * seconds_per_tick) + affected_mob.adjust_drowsiness(-2 SECONDS * REM * seconds_per_tick) + affected_mob.adjust_jitter(-6 SECONDS * REM * seconds_per_tick) + affected_mob.AdjustSleeping(-20 * REM * seconds_per_tick) + if(affected_mob.getToxLoss() && SPT_PROB(10, seconds_per_tick)) + if(affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH + affected_mob.adjust_bodytemperature(20 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, affected_mob.get_body_temp_normal()) + + var/to_chatted = FALSE + for(var/datum/wound/iter_wound as anything in affected_mob.all_wounds) + if(SPT_PROB(10, seconds_per_tick)) + var/helped = iter_wound.tea_life_process() + if(!to_chatted && helped) + to_chat(affected_mob, span_notice("A calm, relaxed feeling suffuses you. Your wounds feel a little healthier.")) + to_chatted = TRUE + +// Different handling, different name. +// Returns FALSE by default so broken bones and 'loss' wounds don't give a false message +/datum/wound/proc/tea_life_process() + return FALSE + +// Slowly increase (gauzed) clot rate +/datum/wound/pierce/bleed/tea_life_process() + gauzed_clot_rate += 0.1 + return TRUE + +// Slowly increase clot rate +/datum/wound/slash/flesh/tea_life_process() + clot_rate += 0.2 + return TRUE + +// There's a designated burn process, but I felt this would be better for consistency with the rest of the reagent's procs +/datum/wound/burn/flesh/tea_life_process() + // Sanitizes and heals, but with a limit + flesh_healing = (flesh_healing > 0.1) ? flesh_healing : flesh_healing + 0.02 + infestation_rate = max(infestation_rate - 0.005, 0) + return TRUE + +/datum/reagent/consumable/lemonade + name = "Lemonade" + description = "Sweet, tangy lemonade. Good for the soul." + color = "#FFE978" + quality = DRINK_NICE + taste_description = "sunshine and summertime" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_EASY + +/datum/reagent/consumable/tea/arnold_palmer + name = "Arnold Palmer" + description = "Encourages the patient to go golfing." + color = "#FFB766" + quality = DRINK_NICE + nutriment_factor = 10 + taste_description = "bitter tea" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/tea/arnold_palmer/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(SPT_PROB(2.5, seconds_per_tick)) + to_chat(affected_mob, 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" + description = "Coffee and ice, refreshing and cool." + color = "#102838" // rgb: 16, 40, 56 + nutriment_factor = 0 + taste_description = "bitter coldness" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/icecoffee/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_dizzy(-10 SECONDS * REM * seconds_per_tick) + affected_mob.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) + affected_mob.AdjustSleeping(-40 * REM * seconds_per_tick) + affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) + affected_mob.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) + +/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" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/hot_ice_coffee/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_dizzy(-10 SECONDS * REM * seconds_per_tick) + affected_mob.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) + affected_mob.AdjustSleeping(-60 * REM * seconds_per_tick) + affected_mob.adjust_bodytemperature(-7 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) + affected_mob.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) + if(affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/icetea + name = "Iced Tea" + description = "No relation to a certain rap artist/actor." + color = "#104038" // rgb: 16, 64, 56 + nutriment_factor = 0 + taste_description = "sweet tea" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/icetea/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_dizzy(-4 SECONDS * REM * seconds_per_tick) + affected_mob.adjust_drowsiness(-2 SECONDS * REM * seconds_per_tick) + affected_mob.AdjustSleeping(-40 * REM * seconds_per_tick) + if(affected_mob.getToxLoss() && SPT_PROB(10, seconds_per_tick)) + if(affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH + affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) + +/datum/reagent/consumable/space_cola + name = "Cola" + description = "A refreshing beverage." + color = "#100800" // rgb: 16, 8, 0 + taste_description = "cola" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/space_cola/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_drowsiness(-10 SECONDS * REM * seconds_per_tick) + affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) + +/datum/reagent/consumable/roy_rogers + name = "Roy Rogers" + description = "A sweet fizzy drink." + color = "#53090B" + quality = DRINK_GOOD + taste_description = "fruity overlysweet cola" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/roy_rogers/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + affected_mob.set_jitter_if_lower(12 SECONDS * REM * seconds_per_tick) + affected_mob.adjust_drowsiness(-10 SECONDS * REM * seconds_per_tick) + affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) + return ..() + +/datum/reagent/consumable/nuka_cola + name = "Nuka Cola" + description = "Cola, cola never changes." + color = "#100800" // rgb: 16, 8, 0 + quality = DRINK_VERYGOOD + taste_description = "the future" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/nuka_cola/on_mob_metabolize(mob/living/affected_mob) + . = ..() + affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/reagent/nuka_cola) + +/datum/reagent/consumable/nuka_cola/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() + affected_mob.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/nuka_cola) + +/datum/reagent/consumable/nuka_cola/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.set_jitter_if_lower(40 SECONDS * REM * seconds_per_tick) + affected_mob.set_drugginess(1 MINUTES * REM * seconds_per_tick) + affected_mob.adjust_dizzy(3 SECONDS * REM * seconds_per_tick) + affected_mob.remove_status_effect(/datum/status_effect/drowsiness) + affected_mob.AdjustSleeping(-40 * REM * seconds_per_tick) + affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) + +/datum/reagent/consumable/rootbeer + name = "root beer" + description = "A delightfully bubbly root beer, filled with so much sugar that it can actually speed up the user's trigger finger." + color = "#181008" // rgb: 24, 16, 8 + quality = DRINK_VERYGOOD + nutriment_factor = 10 + metabolization_rate = 2 * REAGENTS_METABOLISM + taste_description = "a monstrous sugar rush" + 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/affected_mob) + . = ..() + REMOVE_TRAIT(affected_mob, TRAIT_DOUBLE_TAP, type) + if(current_cycle > 10) + to_chat(affected_mob, span_warning("You feel kinda tired as your sugar rush wears off...")) + affected_mob.adjustStaminaLoss(min(80, current_cycle * 3), required_biotype = affected_biotype) + affected_mob.adjust_drowsiness((current_cycle-1) * 2 SECONDS) + +/datum/reagent/consumable/rootbeer/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(current_cycle > 3 && !effect_enabled) // takes a few seconds for the bonus to kick in to prevent microdosing + to_chat(affected_mob, span_notice("You feel your trigger finger getting itchy...")) + ADD_TRAIT(affected_mob, TRAIT_DOUBLE_TAP, type) + effect_enabled = TRUE + + affected_mob.set_jitter_if_lower(4 SECONDS * REM * seconds_per_tick) + if(prob(50)) + affected_mob.adjust_dizzy(2 SECONDS * REM * seconds_per_tick) + if(current_cycle > 10) + affected_mob.adjust_dizzy(3 SECONDS * REM * seconds_per_tick) + +/datum/reagent/consumable/grey_bull + name = "Grey Bull" + description = "Grey Bull, it gives you gloves!" + color = "#EEFF00" // rgb: 238, 255, 0 + quality = DRINK_VERYGOOD + taste_description = "carbonated oil" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/grey_bull/on_mob_metabolize(mob/living/carbon/affected_atom) + . = ..() + ADD_TRAIT(affected_atom, TRAIT_SHOCKIMMUNE, type) + var/obj/item/organ/internal/liver/liver = affected_atom.get_organ_slot(ORGAN_SLOT_LIVER) + if(HAS_TRAIT(liver, TRAIT_MAINTENANCE_METABOLISM)) + affected_atom.add_mood_event("maintenance_fun", /datum/mood_event/maintenance_high) + metabolization_rate *= 0.8 + +/datum/reagent/consumable/grey_bull/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() + REMOVE_TRAIT(affected_mob, TRAIT_SHOCKIMMUNE, type) + +/datum/reagent/consumable/grey_bull/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.set_jitter_if_lower(40 SECONDS * REM * seconds_per_tick) + affected_mob.adjust_dizzy(2 SECONDS * REM * seconds_per_tick) + affected_mob.remove_status_effect(/datum/status_effect/drowsiness) + affected_mob.AdjustSleeping(-40 * REM * seconds_per_tick) + affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) + +/datum/reagent/consumable/spacemountainwind + name = "SM Wind" + description = "Blows right through you like a space wind." + color = "#102000" // rgb: 16, 32, 0 + taste_description = "sweet citrus soda" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/spacemountainwind/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_drowsiness(-14 SECONDS * REM * seconds_per_tick) + affected_mob.AdjustSleeping(-20 * REM * seconds_per_tick) + affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) + affected_mob.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) + +/datum/reagent/consumable/dr_gibb + name = "Dr. Gibb" + description = "A delicious blend of 42 different flavours." + color = "#102000" // rgb: 16, 32, 0 + taste_description = "cherry soda" // FALSE ADVERTISING + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/dr_gibb/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_drowsiness(-12 SECONDS * REM * seconds_per_tick) + affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) + +/datum/reagent/consumable/space_up + name = "Space-Up" + description = "Tastes like a hull breach in your mouth." + color = "#00FF00" // rgb: 0, 255, 0 + taste_description = "cherry soda" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/space_up/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) + +/datum/reagent/consumable/lemon_lime + name = "Lemon Lime" + description = "A tangy substance made of 0.5% natural citrus!" + color = "#8CFF00" // rgb: 135, 255, 0 + taste_description = "tangy lime and lemon soda" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/lemon_lime/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.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" + 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/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) + if(SPT_PROB(5, seconds_per_tick)) + affected_mob.mind?.adjust_experience(/datum/skill/gaming, 5) + +/datum/reagent/consumable/shamblers + name = "Shambler's Juice" + description = "~Shake me up some of that Shambler's Juice!~" + color = "#f00060" // rgb: 94, 0, 38 + taste_description = "carbonated metallic soda" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/shamblers/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) + +/datum/reagent/consumable/sodawater + name = "Soda Water" + description = "A can of club soda. Why not make a scotch and soda?" + color = "#619494" // rgb: 97, 148, 148 + taste_description = "carbonated water" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +// A variety of nutrients are dissolved in club soda, without sugar. +// These nutrients include carbon, oxygen, hydrogen, phosphorous, potassium, sulfur and sodium, all of which are needed for healthy plant growth. +/datum/reagent/consumable/sodawater/on_hydroponics_apply(obj/machinery/hydroponics/mytray, mob/user) + mytray.adjust_waterlevel(round(volume)) + mytray.adjust_plant_health(round(volume * 0.1)) + +/datum/reagent/consumable/sodawater/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_dizzy(-10 SECONDS * REM * seconds_per_tick) + affected_mob.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) + affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) + +/datum/reagent/consumable/tonic + name = "Tonic Water" + description = "It tastes strange but at least the quinine keeps the Space Malaria at bay." + color = "#0064C8" // rgb: 0, 100, 200 + taste_description = "tart and fresh" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/tonic/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_dizzy(-10 SECONDS * REM * seconds_per_tick) + affected_mob.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) + affected_mob.AdjustSleeping(-40 * REM * seconds_per_tick) + affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) + +/datum/reagent/consumable/wellcheers + name = "Wellcheers" + description = "A strange purple drink, smelling of saltwater. Somewhere in the distance, you hear seagulls." + color = "#762399" // rgb: 118, 35, 153 + taste_description = "grapes and the fresh open sea" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/wellcheers/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_drowsiness(3 SECONDS * REM * seconds_per_tick) + var/need_mob_update + switch(affected_mob.mob_mood.sanity_level) + if (SANITY_INSANE to SANITY_CRAZY) + need_mob_update = affected_mob.adjustStaminaLoss(3 * REM * seconds_per_tick, updating_stamina = FALSE) + if (SANITY_UNSTABLE to SANITY_DISTURBED) + affected_mob.add_mood_event("wellcheers", /datum/mood_event/wellcheers) + if (SANITY_NEUTRAL to SANITY_GREAT) + need_mob_update = affected_mob.adjustBruteLoss(-1.5 * REM * seconds_per_tick, updating_health = FALSE) + if(need_mob_update) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/monkey_energy + name = "Monkey Energy" + description = "The only drink that will make you unleash the ape." + color = "#f39b03" // rgb: 243, 155, 3 + overdose_threshold = 60 + taste_description = "barbecue and nostalgia" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/monkey_energy/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.set_jitter_if_lower(80 SECONDS * REM * seconds_per_tick) + affected_mob.adjust_dizzy(2 SECONDS * REM * seconds_per_tick) + affected_mob.remove_status_effect(/datum/status_effect/drowsiness) + affected_mob.AdjustSleeping(-40 * REM * seconds_per_tick) + affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) + +/datum/reagent/consumable/monkey_energy/on_mob_metabolize(mob/living/affected_mob) + . = ..() + if(ismonkey(affected_mob)) + affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/reagent/monkey_energy) + +/datum/reagent/consumable/monkey_energy/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() + affected_mob.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/monkey_energy) + +/datum/reagent/consumable/monkey_energy/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(SPT_PROB(7.5, seconds_per_tick)) + affected_mob.say(pick_list_replacements(BOOMER_FILE, "boomer"), forced = /datum/reagent/consumable/monkey_energy) + +/datum/reagent/consumable/ice + name = "Ice" + description = "Frozen water, your dentist wouldn't like you chewing this." + reagent_state = SOLID + color = "#619494" // rgb: 97, 148, 148 + taste_description = "ice" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + default_container = /obj/item/reagent_containers/cup/glass/ice + +/datum/reagent/consumable/ice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, FALSE, affected_mob.get_body_temp_normal())) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/soy_latte + name = "Soy Latte" + description = "A nice and tasty beverage while you are reading your hippie books." + color = "#cc6404" // rgb: 204,100,4 + quality = DRINK_NICE + taste_description = "creamy coffee" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_EASY + +/datum/reagent/consumable/soy_latte/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_dizzy(-10 SECONDS * REM * seconds_per_tick) + affected_mob.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) + var/need_mob_update + need_mob_update = affected_mob.SetSleeping(0) + affected_mob.adjust_bodytemperature(5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, affected_mob.get_body_temp_normal()) + affected_mob.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) + if(affected_mob.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) + need_mob_update += affected_mob.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 0, updating_health = FALSE) + if(need_mob_update) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/cafe_latte + name = "Cafe Latte" + description = "A nice, strong and tasty beverage while you are reading." + color = "#cc6404" // rgb: 204,100,4 + quality = DRINK_NICE + taste_description = "bitter cream" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_EASY + +/datum/reagent/consumable/cafe_latte/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_dizzy(-10 SECONDS * REM * seconds_per_tick) + affected_mob.adjust_drowsiness(-12 SECONDS * REM * seconds_per_tick) + var/need_mob_update + need_mob_update = affected_mob.SetSleeping(0) + affected_mob.adjust_bodytemperature(5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, affected_mob.get_body_temp_normal()) + affected_mob.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) + if(affected_mob.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) + need_mob_update += affected_mob.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 0, updating_health = FALSE) + if(need_mob_update) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/doctor_delight + name = "The Doctor's Delight" + description = "A gulp a day keeps the Medibot away! A mixture of juices that heals most damage types fairly quickly at the cost of hunger." + color = "#FF8CFF" // rgb: 255, 140, 255 + quality = DRINK_VERYGOOD + taste_description = "homely fruit" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/doctor_delight/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustBruteLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustToxLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustOxyLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + if(affected_mob.nutrition && (affected_mob.nutrition - 2 > 0)) + var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(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! + affected_mob.adjust_nutrition(-2 * REM * seconds_per_tick) + if(need_mob_update) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/cinderella + name = "Cinderella" + description = "Most definitely a fruity alcohol cocktail to have while partying with your friends." + color = "#FF6A50" + quality = DRINK_VERYGOOD + taste_description = "sweet tangy fruit" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/cinderella/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_disgust(-5 * REM * seconds_per_tick) + +/datum/reagent/consumable/cherryshake + name = "Cherry Shake" + description = "A cherry flavored milkshake." + color = "#FFB6C1" + quality = DRINK_VERYGOOD + nutriment_factor = 8 + taste_description = "creamy tart cherry" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_MEDIUM + +/datum/reagent/consumable/bluecherryshake + name = "Blue Cherry Shake" + description = "An exotic milkshake." + color = "#00F1FF" + quality = DRINK_VERYGOOD + nutriment_factor = 8 + taste_description = "creamy blue cherry" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/vanillashake + name = "Vanilla Shake" + description = "A vanilla flavored milkshake. The basics are still good." + color = "#E9D2B2" + quality = DRINK_VERYGOOD + nutriment_factor = 8 + taste_description = "sweet creamy vanilla" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_MEDIUM + +/datum/reagent/consumable/caramelshake + name = "Caramel Shake" + description = "A caramel flavored milkshake. Your teeth hurt looking at it." + color = "#E17C00" + quality = DRINK_GOOD + nutriment_factor = 10 + taste_description = "sweet rich creamy caramel" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_MEDIUM + +/datum/reagent/consumable/choccyshake + name = "Chocolate Shake" + description = "A frosty chocolate milkshake." + color = "#541B00" + quality = DRINK_VERYGOOD + nutriment_factor = 8 + taste_description = "sweet creamy chocolate" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_MEDIUM + +/datum/reagent/consumable/strawberryshake + name = "Strawberry Shake" + description = "A strawberry milkshake." + color = "#ff7b7b" + quality = DRINK_VERYGOOD + nutriment_factor = 8 + taste_description = "sweet strawberries and milk" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_MEDIUM + +/datum/reagent/consumable/bananashake + name = "Banana Shake" + description = "A banana milkshake. Stuff that clowns drink at their honkday parties." + color = "#f2d554" + quality = DRINK_VERYGOOD + nutriment_factor = 8 + taste_description = "thick banana" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_MEDIUM + +/datum/reagent/consumable/pumpkin_latte + name = "Pumpkin Latte" + description = "A mix of pumpkin juice and coffee." + color = "#F4A460" + quality = DRINK_VERYGOOD + nutriment_factor = 3 + taste_description = "creamy pumpkin" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/gibbfloats + name = "Gibb Floats" + description = "Ice cream on top of a Dr. Gibb glass." + color = "#B22222" + quality = DRINK_NICE + nutriment_factor = 3 + taste_description = "creamy cherry" + 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" + description = "A solution." + color = "#EEFF00" + quality = DRINK_NICE + taste_description = "extreme bitterness" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/grape_soda + name = "Grape Soda" + description = "Beloved by children and teetotalers." + color = "#E6CDFF" + taste_description = "grape soda" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/grape_soda/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) + +/datum/reagent/consumable/milk/chocolate_milk + name = "Chocolate Milk" + description = "Milk for cool kids." + color = "#7D4E29" + quality = DRINK_NICE + taste_description = "chocolate milk" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/hot_coco + name = "Hot Coco" + description = "Made with love! And coco beans." + nutriment_factor = 4 + color = "#403010" // rgb: 64, 48, 16 + taste_description = "creamy chocolate" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/hot_coco/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + affected_mob.adjust_bodytemperature(5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, affected_mob.get_body_temp_normal()) + if(affected_mob.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) + if(affected_mob.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 0, updating_health = FALSE)) + . = UPDATE_MOB_HEALTH + if(holder.has_reagent(/datum/reagent/consumable/capsaicin)) + holder.remove_reagent(/datum/reagent/consumable/capsaicin, 2 * REM * seconds_per_tick) + return ..() || . + +/datum/reagent/consumable/italian_coco + name = "Italian Hot Chocolate" + description = "Made with love! You can just imagine a happy Nonna from the smell." + nutriment_factor = 8 + color = "#57372A" + quality = DRINK_VERYGOOD + taste_description = "thick creamy chocolate" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/italian_coco/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_bodytemperature(5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, affected_mob.get_body_temp_normal()) + +/datum/reagent/consumable/menthol + name = "Menthol" + description = "Alleviates coughing symptoms one might have." + color = "#80AF9C" + taste_description = "mint" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + default_container = /obj/item/reagent_containers/cup/glass/bottle/juice/menthol + +/datum/reagent/consumable/menthol/on_mob_life(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.apply_status_effect(/datum/status_effect/throat_soothed) + +/datum/reagent/consumable/grenadine + name = "Grenadine" + description = "Not cherry flavored!" + color = "#EA1D26" + taste_description = "sweet pomegranates" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/parsnipjuice + name = "Parsnip Juice" + description = "Why..." + color = "#FFA500" + taste_description = "parsnip" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/pineapplejuice + name = "Pineapple Juice" + description = "Tart, tropical, and hotly debated." + color = "#F7D435" + taste_description = "pineapple" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + default_container = /obj/item/reagent_containers/cup/glass/bottle/juice/pineapplejuice + +/datum/reagent/consumable/peachjuice //Intended to be extremely rare due to being the limiting ingredients in the blazaam drink + name = "Peach Juice" + description = "Just peachy." + color = "#E78108" + taste_description = "peaches" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/cream_soda + name = "Cream Soda" + description = "A classic space-American vanilla flavored soft drink." + color = "#dcb137" + quality = DRINK_VERYGOOD + taste_description = "fizzy vanilla" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/cream_soda/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) + +/datum/reagent/consumable/sol_dry + name = "Sol Dry" + description = "A soothing, mellow drink made from ginger." + color = "#f7d26a" + quality = DRINK_NICE + taste_description = "sweet ginger spice" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/sol_dry/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_disgust(-5 * REM * seconds_per_tick) + +/datum/reagent/consumable/shirley_temple + name = "Shirley Temple" + description = "Here you go little girl, now you can drink like the adults." + color = "#F43724" + quality = DRINK_GOOD + taste_description = "sweet cherry syrup and ginger spice" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/shirley_temple/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + affected_mob.adjust_disgust(-3 * REM * seconds_per_tick) + return ..() + +/datum/reagent/consumable/red_queen + name = "Red Queen" + description = "DRINK ME." + color = "#e6ddc3" + quality = DRINK_GOOD + taste_description = "wonder" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + var/current_size = RESIZE_DEFAULT_SIZE + +/datum/reagent/consumable/red_queen/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(SPT_PROB(50, seconds_per_tick)) + return + + var/newsize = pick(0.5, 0.75, 1, 1.50, 2) + newsize *= RESIZE_DEFAULT_SIZE + affected_mob.update_transform(newsize/current_size) + current_size = newsize + if(SPT_PROB(23, seconds_per_tick)) + affected_mob.emote("sneeze") + +/datum/reagent/consumable/red_queen/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() + affected_mob.update_transform(RESIZE_DEFAULT_SIZE/current_size) + current_size = RESIZE_DEFAULT_SIZE + +/datum/reagent/consumable/bungojuice + name = "Bungo Juice" + color = "#F9E43D" + description = "Exotic! You feel like you are on vacation already." + taste_description = "succulent bungo" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/prunomix + name = "Pruno Mixture" + color = "#E78108" + description = "Fruit, sugar, yeast, and water pulped together into a pungent slurry." + taste_description = "garbage" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/aloejuice + name = "Aloe Juice" + color = "#A3C48B" + description = "A healthy and refreshing juice." + taste_description = "vegetable" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/aloejuice/on_mob_life(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(affected_mob.getToxLoss() && SPT_PROB(16, seconds_per_tick)) + if(affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/agua_fresca + name = "Agua Fresca" + description = "A refreshing watermelon agua fresca. Perfect on a day at the holodeck." + color = "#D25B66" + quality = DRINK_VERYGOOD + taste_description = "cool refreshing watermelon" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/agua_fresca/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) + if(affected_mob.getToxLoss() && SPT_PROB(10, seconds_per_tick)) + if(affected_mob.adjustToxLoss(-0.5, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/mushroom_tea + name = "Mushroom Tea" + description = "A savoury glass of tea made from polypore mushroom shavings, originally native to Tizira." + color = "#674945" // rgb: 16, 16, 0 + nutriment_factor = 0 + taste_description = "mushrooms" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/mushroom_tea/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(islizard(affected_mob)) + if(affected_mob.adjustOxyLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type)) + return UPDATE_MOB_HEALTH + +//Moth Stuff +/datum/reagent/consumable/toechtauese_juice + name = "Töchtaüse Juice" + description = "An unpleasant juice made from töchtaüse berries. Best made into a syrup, unless you enjoy pain." + color = "#554862" + nutriment_factor = 0 + taste_description = "fiery itchy pain" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/toechtauese_syrup + name = "Töchtaüse Syrup" + description = "A harsh spicy and bitter syrup, made from töchtaüse berries. Useful as an ingredient, both for food and cocktails." + color = "#554862" + nutriment_factor = 0 + taste_description = "sugar, spice, and nothing nice" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/strawberry_banana + name = "strawberry banana smoothie" + description = "A classic smoothie made from strawberries and bananas." + color = "#FF9999" + nutriment_factor = 0 + taste_description = "strawberry and banana" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/berry_blast + name = "berry blast smoothie" + description = "A classic smoothie made from mixed berries." + color = "#A76DC5" + nutriment_factor = 0 + taste_description = "mixed berry" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/funky_monkey + name = "funky monkey smoothie" + description = "A classic smoothie made from chocolate and bananas." + color = "#663300" + nutriment_factor = 0 + taste_description = "chocolate and banana" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/green_giant + name = "green giant smoothie" + description = "A green vegetable smoothie, made without vegetables." + color = "#003300" + nutriment_factor = 0 + taste_description = "green, just green" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/melon_baller + name = "melon baller smoothie" + description = "A classic smoothie made from melons." + color = "#D22F55" + nutriment_factor = 0 + taste_description = "fresh melon" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/vanilla_dream + name = "vanilla dream smoothie" + description = "A classic smoothie made from vanilla and fresh cream." + color = "#FFF3DD" + nutriment_factor = 0 + taste_description = "creamy vanilla" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/cucumberjuice + name = "Cucumber Juice" + description = "Ordinary cucumber juice, nothing from the fantasy world." + color = "#6cd87a" + taste_description = "light cucumber" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/cucumberlemonade + name = "Cucumber Lemonade" + description = "Cucumber juice, sugar, and soda; what else do I need?" + color = "#6cd87a" + quality = DRINK_GOOD + taste_description = "citrus soda with cucumber" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/cucumberlemonade/on_mob_life(mob/living/carbon/doll, seconds_per_tick, times_fired) + . = ..() + doll.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, doll.get_body_temp_normal()) + if(doll.getToxLoss() && SPT_PROB(10, seconds_per_tick)) + if(doll.adjustToxLoss(-0.5, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/mississippi_queen + name = "Mississippi Queen" + description = "If you think you're so hot, how about a victory drink?" + color = "#d4422f" // rgb: 212,66,47 + taste_description = "sludge seeping down your throat" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/mississippi_queen/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + switch(current_cycle) + if(11 to 21) + drinker.adjust_dizzy(4 SECONDS * REM * seconds_per_tick) + if(21 to 31) + if(SPT_PROB(15, seconds_per_tick)) + drinker.adjust_confusion(4 SECONDS * REM * seconds_per_tick) + if(31 to 201) + drinker.adjust_hallucinations(60 SECONDS * REM * seconds_per_tick) + +/datum/reagent/consumable/t_letter + name = "T" + description = "You expected to find this in a soup, but this is fine too." + color = "#583d09" // rgb: 88, 61, 9 + taste_description = "one of your 26 favorite letters" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/t_letter/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(!HAS_MIND_TRAIT(affected_mob, TRAIT_MIMING)) + return + affected_mob.set_silence_if_lower(MIMEDRINK_SILENCE_DURATION) + affected_mob.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) + affected_mob.AdjustSleeping(-40 * REM * seconds_per_tick) + if(affected_mob.getToxLoss() && SPT_PROB(25, seconds_per_tick)) + if(affected_mob.adjustToxLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH + +/datum/reagent/consumable/hakka_mate + name = "Hakka-Mate" + description = "A Martian-made yerba mate soda, dragged straight out of the pits of a hacking convention." + color = "#c4b000" + taste_description = "bubbly yerba mate" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/coconut_milk + name = "Coconut Milk" + description = "A versatile milk substitute that's perfect for everything from cooking to making cocktails." + color = "#DFDFDF" + taste_description = "milky coconut" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/melon_soda + name = "Melon Soda" + description = "A neon green hit of nostalgia." + color = "#6FEB48" + taste_description = "fizzy melon" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/volt_energy + name = "24-Volt Energy" + description = "An artificially coloured and flavoured electric energy drink, in lanternfruit flavour. Made for ethereals, by ethereals." + color = "#99E550" + taste_description = "sour pear" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/volt_energy/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) + . = ..() + if(!(methods & (INGEST|INJECT|PATCH)) || !iscarbon(exposed_mob)) + return + + var/mob/living/carbon/exposed_carbon = exposed_mob + var/obj/item/organ/internal/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) + if(istype(stomach)) + stomach.adjust_charge(reac_volume * 3) diff --git a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/alcohol.dm b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/alcohol.dm new file mode 100644 index 0000000000000..bb9e5869ca804 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/alcohol.dm @@ -0,0 +1,266 @@ +/datum/glass_style/drinking_glass/beer + required_drink_type = /datum/reagent/consumable/ethanol/beer + name = "glass of beer" + desc = "A freezing pint of beer." + icon_state = "beerglass" + +/datum/glass_style/drinking_glass/beer/light + required_drink_type = /datum/reagent/consumable/ethanol/beer/light + name = "glass of light beer" + desc = "A freezing pint of watery light beer." + +/datum/glass_style/drinking_glass/beer/light + required_drink_type = /datum/reagent/consumable/ethanol/beer/maltliquor + name = "glass of malt liquor" + desc = "A freezing pint of malt liquor." + +/datum/glass_style/drinking_glass/beer/green + required_drink_type = /datum/reagent/consumable/ethanol/beer/green + name = "glass of green beer" + desc = "A freezing pint of green beer. Festive." + icon_state = "greenbeerglass" + +/datum/glass_style/drinking_glass/kahlua + required_drink_type = /datum/reagent/consumable/ethanol/kahlua + name = "glass of RR coffee liquor" + desc = "DAMN, THIS THING LOOKS ROBUST!" + icon_state ="kahluaglass" + +/datum/glass_style/drinking_glass/whiskey + required_drink_type = /datum/reagent/consumable/ethanol/whiskey + name = "glass of whiskey" + desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy." + icon_state = "whiskeyglass" + +/datum/glass_style/drinking_glass/whiskey/kong + required_drink_type = /datum/reagent/consumable/ethanol/whiskey/kong + name = "glass of Kong" + desc = "Makes You Go Ape!®" + +/datum/glass_style/drinking_glass/whiskey/candycorn + required_drink_type = /datum/reagent/consumable/ethanol/whiskey/candycorn + name = "glass of candy corn liquor" + desc = "Good for your Imagination." + +/datum/glass_style/drinking_glass/thirteenloko + required_drink_type = /datum/reagent/consumable/ethanol/thirteenloko + name = "glass of Thirteen Loko" + desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass." + icon_state = "thirteen_loko_glass" + +/datum/glass_style/drinking_glass/vodka + required_drink_type = /datum/reagent/consumable/ethanol/vodka + name = "glass of vodka" + desc = "The glass contain wodka. Xynta." + icon_state = "ginvodkaglass" + +/datum/glass_style/drinking_glass/gin + required_drink_type = /datum/reagent/consumable/ethanol/gin + name = "glass of gin" + desc = "A crystal clear glass of Griffeater gin." + icon_state = "ginvodkaglass" + +/datum/glass_style/drinking_glass/rum + required_drink_type = /datum/reagent/consumable/ethanol/rum + name = "glass of rum" + desc = "Now you want to pray for a pirate suit, don't you?" + icon_state = "rumglass" + +/datum/glass_style/drinking_glass/tequila + required_drink_type = /datum/reagent/consumable/ethanol/tequila + name = "glass of tequila" + desc = "Now all that's missing is the weird colored shades!" + icon_state = "tequilaglass" + +/datum/glass_style/drinking_glass/vermouth + required_drink_type = /datum/reagent/consumable/ethanol/vermouth + name = "glass of vermouth" + desc = "You wonder why you're even drinking this straight." + icon_state = "vermouthglass" + +/datum/glass_style/drinking_glass/wine + required_drink_type = /datum/reagent/consumable/ethanol/wine + name = "glass of wine" + desc = "A very classy looking drink." + icon_state = "wineglass" + +/datum/glass_style/drinking_glass/grappa + required_drink_type = /datum/reagent/consumable/ethanol/grappa + name = "glass of grappa" + desc = "A fine drink originally made to prevent waste by using the leftovers from winemaking." + icon_state = "grappa" + +/datum/glass_style/drinking_glass/amaretto + required_drink_type = /datum/reagent/consumable/ethanol/amaretto + name = "glass of amaretto" + desc = "A sweet and syrupy looking drink." + icon_state = "amarettoglass" +/datum/glass_style/drinking_glass/cognac + required_drink_type = /datum/reagent/consumable/ethanol/cognac + name = "glass of cognac" + desc = "Damn, you feel like some kind of French aristocrat just by holding this." + icon_state = "cognacglass" + +/datum/glass_style/drinking_glass/absinthe + required_drink_type = /datum/reagent/consumable/ethanol/absinthe + name = "glass of absinthe" + desc = "It's as strong as it smells." + icon_state = "absinthe" + +/datum/glass_style/drinking_glass/hooch + required_drink_type = /datum/reagent/consumable/ethanol/hooch + name = "glass of ale" + desc = "A freezing pint of delicious Ale." + icon_state = "aleglass" + +/datum/glass_style/drinking_glass/goldschlager + required_drink_type = /datum/reagent/consumable/ethanol/goldschlager + name = "glass of goldschlager" + desc = "100% proof that teen girls will drink anything with gold in it." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "goldschlagerglass" + +/datum/glass_style/drinking_glass/patron + required_drink_type = /datum/reagent/consumable/ethanol/patron + name = "glass of patron" + desc = "Drinking patron in the bar, with all the subpar ladies." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "patronglass" + +/datum/glass_style/drinking_glass/sake + required_drink_type = /datum/reagent/consumable/ethanol/sake + name = "cup of sake" + desc = "A traditional cup of sake." + icon_state = "sakecup" + +/datum/glass_style/drinking_glass/fernet + required_drink_type = /datum/reagent/consumable/ethanol/fernet + name = "glass of fernet" + desc = "A glass of pure Fernet. Only an absolute madman would drink this alone." //Hi Kevum + +/datum/glass_style/drinking_glass/fruit_wine + required_drink_type = /datum/reagent/consumable/ethanol/fruit_wine + // This should really be dynamic like "glass of pineapple wine" or something + // but seeing as fruit wine half doesn't work already I'm not inclined to add support for that now + name = "glass of fruit wine" + desc = "A wine made from grown plants." + +/datum/glass_style/drinking_glass/champagne + required_drink_type = /datum/reagent/consumable/ethanol/champagne + name = "Champagne" + desc = "The flute clearly displays the slowly rising bubbles." + icon_state = "champagne_glass" + +/datum/glass_style/drinking_glass/pruno + required_drink_type = /datum/reagent/consumable/ethanol/pruno + name = "glass of pruno" + 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." + icon_state = "glass_orange" + +/datum/glass_style/drinking_glass/navy_rum + required_drink_type = /datum/reagent/consumable/ethanol/navy_rum + name = "glass of navy rum" + desc = "Splice the mainbrace, and God save the King." + icon_state = "ginvodkaglass" + +/datum/glass_style/drinking_glass/curacao + required_drink_type = /datum/reagent/consumable/ethanol/curacao + name = "glass of curaçao" + desc = "It's blue, da ba dee." + icon_state = "curacao" + +/datum/glass_style/drinking_glass/bitters + required_drink_type = /datum/reagent/consumable/ethanol/bitters + name = "glass of bitters" + desc = "Typically you'd want to mix this with something- but you do you." + icon_state = "bitters" + +/datum/glass_style/drinking_glass/coconut_rum + required_drink_type = /datum/reagent/consumable/ethanol/coconut_rum + name = "glass of coconut rum" + desc = "Breathe in and relax, you're on vacation until this glass is empty." + icon = 'icons/obj/drinks/drinks.dmi' + icon_state = "ginvodkaglass" + +/datum/glass_style/drinking_glass/yuyake + required_drink_type = /datum/reagent/consumable/ethanol/yuyake + name = "glass of yūyake" + desc = "It's the saccharine essence of the 70s in a glass... the 1970s, that is!" + icon = 'icons/obj/drinks/drinks.dmi' + icon_state = "glass_red" + +/datum/glass_style/drinking_glass/shochu + required_drink_type = /datum/reagent/consumable/ethanol/shochu + name = "glass of shochu" + desc = "A glass of strong rice wine." + icon = 'icons/obj/drinks/drinks.dmi' + icon_state = "ginvodkaglass" + +/datum/glass_style/drinking_glass/rice_beer + required_drink_type = /datum/reagent/consumable/ethanol/rice_beer + name = "glass of rice beer" + desc = "A glass of fine, light rice beer. Best enjoyed cold." + icon = 'icons/obj/drinks/drinks.dmi' + icon_state = "rice_beer" + +// Shot glasses + +/datum/glass_style/shot_glass/kahlua + required_drink_type = /datum/reagent/consumable/ethanol/kahlua + icon_state ="shotglasscream" + +/datum/glass_style/shot_glass/whiskey + required_drink_type = /datum/reagent/consumable/ethanol/whiskey + icon_state = "shotglassbrown" + +/datum/glass_style/shot_glass/whiskey/kong + required_drink_type = /datum/reagent/consumable/ethanol/whiskey/kong + +/datum/glass_style/shot_glass/whiskey/candycorn + required_drink_type = /datum/reagent/consumable/ethanol/whiskey/candycorn + +/datum/glass_style/shot_glass/vodka + required_drink_type = /datum/reagent/consumable/ethanol/vodka + icon_state = "shotglassclear" + +/datum/glass_style/shot_glass/rum + required_drink_type = /datum/reagent/consumable/ethanol/rum + icon_state = "shotglassbrown" + +/datum/glass_style/shot_glass/tequila + required_drink_type = /datum/reagent/consumable/ethanol/tequila + icon_state = "shotglassgold" + +/datum/glass_style/shot_glass/vermouth + required_drink_type = /datum/reagent/consumable/ethanol/vermouth + icon_state = "shotglassclear" + +/datum/glass_style/shot_glass/wine + required_drink_type = /datum/reagent/consumable/ethanol/wine + icon_state = "shotglassred" + +/datum/glass_style/shot_glass/amaretto + required_drink_type = /datum/reagent/consumable/ethanol/amaretto + icon_state = "shotglassgold" + +/datum/glass_style/shot_glass/cognac + required_drink_type = /datum/reagent/consumable/ethanol/cognac + icon_state = "shotglassbrown" + +/datum/glass_style/shot_glass/absinthe + required_drink_type = /datum/reagent/consumable/ethanol/absinthe + icon_state = "shotglassgreen" + +/datum/glass_style/drinking_glass/hooch + required_drink_type = /datum/reagent/consumable/ethanol/hooch + name = "Hooch" + desc = "You've really hit rock bottom now... your liver packed its bags and left last night." + icon_state = "glass_brown2" + +/datum/glass_style/shot_glass/goldschlager + required_drink_type = /datum/reagent/consumable/ethanol/goldschlager + icon_state = "shotglassgold" + +/datum/glass_style/shot_glass/patron + required_drink_type = /datum/reagent/consumable/ethanol/patron + icon_state = "shotglassclear" diff --git a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/coffee_tea.dm b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/coffee_tea.dm new file mode 100644 index 0000000000000..36a8877b82018 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/coffee_tea.dm @@ -0,0 +1,82 @@ +// Coffees and Teas + +/datum/glass_style/drinking_glass/coffee + required_drink_type = /datum/reagent/consumable/coffee + name = "glass of coffee" + desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere." + icon_state = "glass_brown" + +/datum/glass_style/drinking_glass/tea + required_drink_type = /datum/reagent/consumable/tea + name = "glass of tea" + desc = "Drinking it from here would not seem right." + icon_state = "teaglass" + +/datum/glass_style/drinking_glass/icecoffee + required_drink_type = /datum/reagent/consumable/icecoffee + name = "iced coffee" + desc = "A drink to perk you up and refresh you!" + icon = 'icons/obj/drinks/coffee.dmi' + icon_state = "icedcoffeeglass" + +/datum/glass_style/drinking_glass/hot_ice_coffee + required_drink_type = /datum/reagent/consumable/hot_ice_coffee + name = "hot ice coffee" + desc = "A sharp drink - This can't have come cheap." + icon = 'icons/obj/drinks/coffee.dmi' + icon_state = "hoticecoffee" + +/datum/glass_style/drinking_glass/icetea + required_drink_type = /datum/reagent/consumable/icetea + name = "iced tea" + desc = "All natural, antioxidant-rich flavour sensation." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "icedteaglass" + +/datum/glass_style/drinking_glass/soy_latte + required_drink_type = /datum/reagent/consumable/soy_latte + name = "soy latte" + desc = "A nice and refreshing beverage while you're reading." + icon = 'icons/obj/drinks/coffee.dmi' + icon_state = "soy_latte" + +/datum/glass_style/drinking_glass/cafe_latte + required_drink_type = /datum/reagent/consumable/cafe_latte + name = "cafe latte" + desc = "A nice, strong and refreshing beverage while you're reading." + icon = 'icons/obj/drinks/coffee.dmi' + icon_state = "cafe_latte" + +/datum/glass_style/drinking_glass/pumpkin_latte + required_drink_type = /datum/reagent/consumable/pumpkin_latte + name = "pumpkin latte" + desc = "A mix of coffee and pumpkin juice." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "pumpkin_latte" + +/datum/glass_style/has_foodtype/drinking_glass/hot_coco + required_drink_type = /datum/reagent/consumable/hot_coco + name = "glass of hot coco" + desc = "A favorite winter drink to warm you up." + icon_state = "chocolateglass" + drink_type = SUGAR | DAIRY + +/datum/glass_style/drinking_glass/italian_coco + required_drink_type = /datum/reagent/consumable/italian_coco + name = "glass of italian coco" + desc = "A spin on a winter favourite, made to please." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "italiancoco" + +/datum/glass_style/drinking_glass/mushroom_tea + required_drink_type = /datum/reagent/consumable/mushroom_tea + name = "glass of mushroom tea" + desc = "Oddly savoury for a drink." + icon_state = "mushroom_tea_glass" + +/datum/glass_style/drinking_glass/t_letter + required_drink_type = /datum/reagent/consumable/t_letter + name = "glass of T" + desc = "The 20th." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "tletter" diff --git a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/dairy.dm b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/dairy.dm new file mode 100644 index 0000000000000..e788a589ad125 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/dairy.dm @@ -0,0 +1,41 @@ +// Dairy + +/datum/glass_style/has_foodtype/drinking_glass/milk + required_drink_type = /datum/reagent/consumable/milk + name = "glass of milk" + desc = "White and nutritious goodness!" + icon_state = "glass_white" + drink_type = DAIRY | BREAKFAST + +/datum/glass_style/has_foodtype/juicebox/milk + required_drink_type = /datum/reagent/consumable/milk + name = "carton of milk" + desc = "An excellent source of calcium for growing space explorers." + icon_state = "milkbox" + drink_type = DAIRY | BREAKFAST + +/datum/glass_style/has_foodtype/juicebox/chocolate_milk + required_drink_type = /datum/reagent/consumable/milk/chocolate_milk + name = "carton of chocolate milk" + desc = "Milk for cool kids!" + icon_state = "chocolatebox" + drink_type = SUGAR | DAIRY + +/datum/glass_style/drinking_glass/soymilk + required_drink_type = /datum/reagent/consumable/soymilk + name = "glass of soy milk" + desc = "White and nutritious soy goodness!" + icon_state = "glass_white" + +/datum/glass_style/drinking_glass/cream + required_drink_type = /datum/reagent/consumable/cream + name = "glass of cream" + desc = "Ewwww..." + icon_state = "glass_white" + +/datum/glass_style/drinking_glass/coconut_milk + required_drink_type = /datum/reagent/consumable/coconut_milk + name = "glass of coconut milk" + desc = "The essence of the tropics, contained safely within a glass." + icon = 'icons/obj/drinks/drinks.dmi' + icon_state = "glass_white" diff --git a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/juices.dm b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/juices.dm new file mode 100644 index 0000000000000..6f837d8f51587 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/juices.dm @@ -0,0 +1,175 @@ +// Fruit/veggie juices and syrups + +/datum/glass_style/has_foodtype/drinking_glass/orangejuice + required_drink_type = /datum/reagent/consumable/orangejuice + name = "glass of orange juice" + desc = "Vitamins! Yay!" + icon_state = "glass_orange" + drink_type = FRUIT | BREAKFAST + +/datum/glass_style/has_foodtype/juicebox/orangejuice + required_drink_type = /datum/reagent/consumable/orangejuice + name = "orange juice box" + desc = "A great source of vitamins. Stay healthy!" + icon_state = "orangebox" + drink_type = FRUIT | BREAKFAST + +/datum/glass_style/has_foodtype/juicebox/applejuice + required_drink_type = /datum/reagent/consumable/applejuice + name = "apple juice box" + desc = "Sweet apple juice. Don't be late for school!" + icon_state = "juicebox" + drink_type = FRUIT + +/datum/glass_style/has_foodtype/juicebox/grapejuice + required_drink_type = /datum/reagent/consumable/grapejuice + name = "grape juice box" + desc = "Tasty grape juice in a fun little container. Non-alcoholic!" + icon_state = "grapebox" + drink_type = FRUIT + +/datum/glass_style/has_foodtype/drinking_glass/plumjuice + required_drink_type = /datum/reagent/consumable/plumjuice + name = "glass of plum juice" + desc = "Noice." + icon_state = "plumjuiceglass" + drink_type = FRUIT + +/datum/glass_style/has_foodtype/drinking_glass/parsnipjuice + required_drink_type = /datum/reagent/consumable/parsnipjuice + name = "glass of parsnip juice" + drink_type = FRUIT + +/datum/glass_style/has_foodtype/drinking_glass/pineapplejuice + required_drink_type = /datum/reagent/consumable/pineapplejuice + name = "glass of pineapple juice" + desc = "Tart, tropical, and hotly debated." + drink_type = FRUIT | PINEAPPLE + +/datum/glass_style/has_foodtype/juicebox/pineapplejuice + required_drink_type = /datum/reagent/consumable/pineapplejuice + name = "pineapple juice box" + desc = "Why would you even want this?" + icon_state = "pineapplebox" + drink_type = FRUIT | PINEAPPLE + +/datum/glass_style/has_foodtype/drinking_glass/peachjuice + required_drink_type = /datum/reagent/consumable/peachjuice + name = "glass of peach juice" + drink_type = FRUIT + +/datum/glass_style/drinking_glass/tomatojuice + required_drink_type = /datum/reagent/consumable/tomatojuice + name = "glass of tomato juice" + desc = "Are you sure this is tomato juice?" + icon_state = "glass_red" + +/datum/glass_style/drinking_glass/limejuice + required_drink_type = /datum/reagent/consumable/limejuice + name = "glass of lime juice" + desc = "A glass of sweet-sour lime juice." + icon_state = "glass_green" + +/datum/glass_style/drinking_glass/carrotjuice + required_drink_type = /datum/reagent/consumable/carrotjuice + name = "glass of carrot juice" + desc = "It's just like a carrot but without crunching." + icon_state = "carrotjuice" + +/datum/glass_style/drinking_glass/berryjuice + required_drink_type = /datum/reagent/consumable/berryjuice + name = "glass of berry juice" + desc = "Berry juice. Or maybe it's jam. Who cares?" + icon_state = "berryjuice" + +/datum/glass_style/drinking_glass/poisonberryjuice + required_drink_type = /datum/reagent/consumable/poisonberryjuice + name = "glass of berry juice" + desc = "Berry juice. Or maybe it's poison. Who cares?" + icon_state = "poisonberryjuice" + +/datum/glass_style/drinking_glass/watermelonjuice + required_drink_type = /datum/reagent/consumable/watermelonjuice + name = "glass of watermelon juice" + desc = "A glass of watermelon juice." + icon_state = "glass_red" + +/datum/glass_style/drinking_glass/lemonjuice + required_drink_type = /datum/reagent/consumable/lemonjuice + name = "glass of lemon juice" + desc = "Sour..." + icon_state = "lemonglass" + +/datum/glass_style/drinking_glass/banana + required_drink_type = /datum/reagent/consumable/banana + name = "glass of banana juice" + desc = "The raw essence of a banana. HONK." + icon_state = "banana" + +/datum/glass_style/drinking_glass/nothing + required_drink_type = /datum/reagent/consumable/nothing + name = "nothing" + desc = "Absolutely nothing." + icon_state = "nothing" + +/datum/glass_style/drinking_glass/potato_juice + required_drink_type = /datum/reagent/consumable/potato_juice + name = "glass of potato juice" + desc = "Bleh..." + icon_state = "glass_brown" + +/datum/glass_style/drinking_glass/bungojuice + required_drink_type = /datum/reagent/consumable/bungojuice + name = "glass of bungo juice" + desc = "Exotic! You feel like you are on vacation already." + icon_state = "glass_yellow" + +/datum/glass_style/drinking_glass/prunomix + required_drink_type = /datum/reagent/consumable/prunomix + name = "glass of pruno mixture" + desc = "Fruit, sugar, yeast, and water pulped together into a pungent slurry." + icon_state = "glass_orange" + +/datum/glass_style/drinking_glass/aloejuice + required_drink_type = /datum/reagent/consumable/aloejuice + name = "glass of aloe juice" + desc = "A healthy and refreshing juice." + icon_state = "glass_yellow" + +/datum/glass_style/drinking_glass/toechtauese_juice + required_drink_type = /datum/reagent/consumable/toechtauese_juice + name = "glass of töchtaüse juice" + desc = "Raw, unadulterated töchtaüse juice. One swig will fill you with regrets." + icon_state = "toechtauese_syrup" + +/datum/glass_style/drinking_glass/toechtauese_syrup + required_drink_type = /datum/reagent/consumable/toechtauese_syrup + name = "glass of töchtaüse syrup" + desc = "Not for drinking on its own." + icon_state = "toechtauese_syrup" + +/datum/glass_style/drinking_glass/cucumberjuice + required_drink_type = /datum/reagent/consumable/cucumberjuice + name = "glass of cucumber juice" + desc = "A glass of cucumber juice." + icon_state = "glass_cucumber" + + +// Effectively misc + +/datum/glass_style/drinking_glass/menthol + required_drink_type = /datum/reagent/consumable/menthol + name = "glass of menthol" + desc = "Tastes naturally minty, and imparts a very mild numbing sensation." + icon_state = "glass_green" + +/datum/glass_style/drinking_glass/grenadine + required_drink_type = /datum/reagent/consumable/grenadine + name = "glass of grenadine" + desc = "Delicious flavored syrup." + +/datum/glass_style/drinking_glass/ice + required_drink_type = /datum/reagent/consumable/ice + name = "glass of ice" + desc = "Generally, you're supposed to put something else in there too..." + icon_state = "iceglass" diff --git a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/mixed_alcohol.dm b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/mixed_alcohol.dm new file mode 100644 index 0000000000000..67802b9af20c4 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/mixed_alcohol.dm @@ -0,0 +1,1067 @@ +/datum/glass_style/drinking_glass/bilk + required_drink_type = /datum/reagent/consumable/ethanol/bilk + name = "glass of bilk" + desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis." + icon_state = "glass_brown" + +/datum/glass_style/drinking_glass/threemileisland + required_drink_type = /datum/reagent/consumable/ethanol/threemileisland + name = "Three Mile Island Ice Tea" + desc = "A glass of this is sure to prevent a meltdown." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "threemileislandglass" + +/datum/glass_style/drinking_glass/gintonic + required_drink_type = /datum/reagent/consumable/ethanol/gintonic + name = "Gin and Tonic" + desc = "A mild but still great cocktail. Drink up, like a true Englishman." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "gintonicglass" + +/datum/glass_style/drinking_glass/rum_coke + required_drink_type = /datum/reagent/consumable/ethanol/rum_coke + name = "Rum and Coke" + desc = "The classic go-to of space-fratboys." + icon_state = "whiskeycolaglass" + +/datum/glass_style/drinking_glass/cuba_libre + required_drink_type = /datum/reagent/consumable/ethanol/cuba_libre + name = "Cuba Libre" + desc = "A classic mix of rum, cola, and lime. A favorite of revolutionaries everywhere!" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "cubalibreglass" + +/datum/glass_style/drinking_glass/whiskey_cola + required_drink_type = /datum/reagent/consumable/ethanol/whiskey_cola + name = "whiskey cola" + desc = "An innocent-looking mixture of cola and whiskey. Delicious." + icon_state = "whiskeycolaglass" + +/datum/glass_style/drinking_glass/martini + required_drink_type = /datum/reagent/consumable/ethanol/martini + name = "Classic Martini" + desc = "Damn, the bartender even stirred it, not shook it." + icon_state = "martiniglass" + +/datum/glass_style/drinking_glass/vodkamartini + required_drink_type = /datum/reagent/consumable/ethanol/vodkamartini + name = "Vodka martini" + desc = "A bastardisation of the classic martini. Still great." + icon_state = "martiniglass" + +/datum/glass_style/drinking_glass/white_russian + required_drink_type = /datum/reagent/consumable/ethanol/white_russian + name = "White Russian" + desc = "A very nice looking drink. But that's just, like, your opinion, man." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "whiterussianglass" + +/datum/glass_style/drinking_glass/screwdrivercocktail + required_drink_type = /datum/reagent/consumable/ethanol/screwdrivercocktail + name = "Screwdriver" + desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "screwdriverglass" + +/datum/glass_style/drinking_glass/booger + required_drink_type = /datum/reagent/consumable/ethanol/booger + name = "Booger" + desc = "Ewww..." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "booger" + +/datum/glass_style/drinking_glass/bloody_mary + required_drink_type = /datum/reagent/consumable/ethanol/bloody_mary + name = "Bloody Mary" + desc = "Tomato juice, mixed with Vodka and a li'l bit of lime. Tastes like liquid murder." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "bloodymaryglass" + +/datum/glass_style/drinking_glass/brave_bull + required_drink_type = /datum/reagent/consumable/ethanol/brave_bull + name = "Brave Bull" + desc = "Tequila and Coffee liqueur, brought together in a mouthwatering mixture. Drink up." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "bravebullglass" + +/datum/glass_style/drinking_glass/tequila_sunrise + required_drink_type = /datum/reagent/consumable/ethanol/tequila_sunrise + name = "tequila Sunrise" + desc = "Oh great, now you feel nostalgic about sunrises back on Terra..." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "tequilasunriseglass" + +/datum/glass_style/drinking_glass/toxins_special + required_drink_type = /datum/reagent/consumable/ethanol/toxins_special + name = "Toxins Special" + desc = "Whoah, this thing is on FIRE!" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "toxinsspecialglass" + +/datum/glass_style/drinking_glass/beepsky_smash + required_drink_type = /datum/reagent/consumable/ethanol/beepsky_smash + name = "Beepsky Smash" + desc = "Heavy, hot and strong. Just like the Iron fist of the LAW." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "beepskysmashglass" + +/datum/glass_style/drinking_glass/irish_cream + required_drink_type = /datum/reagent/consumable/ethanol/irish_cream + name = "Irish Cream" + desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?" + icon_state = "irishcreamglass" + +/datum/glass_style/drinking_glass/manly_dorf + required_drink_type = /datum/reagent/consumable/ethanol/manly_dorf + name = "The Manly Dorf" + desc = "A manly concoction made from Ale and Beer. Intended for true men only." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "manlydorfglass" + +/datum/glass_style/drinking_glass/longislandicedtea + required_drink_type = /datum/reagent/consumable/ethanol/longislandicedtea + name = "Long Island Iced Tea" + desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "longislandicedteaglass" + +/datum/glass_style/drinking_glass/moonshine + required_drink_type = /datum/reagent/consumable/ethanol/moonshine + name = "Moonshine" + desc = "You've really hit rock bottom now... your liver packed its bags and left last night." + icon_state = "glass_clear" + +/datum/glass_style/drinking_glass/b52 + required_drink_type = /datum/reagent/consumable/ethanol/b52 + name = "B-52" + desc = "Kahlua, Irish Cream, and cognac. You will get bombed." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "b52glass" + +/datum/glass_style/drinking_glass/irishcoffee + required_drink_type = /datum/reagent/consumable/ethanol/irishcoffee + name = "Irish Coffee" + desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning." + icon = 'icons/obj/drinks/coffee.dmi' + icon_state = "irishcoffeeglass" + +/datum/glass_style/drinking_glass/margarita + required_drink_type = /datum/reagent/consumable/ethanol/margarita + name = "Margarita" + desc = "On the rocks with salt on the rim. Arriba~!" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "margaritaglass" + +/datum/glass_style/drinking_glass/black_russian + required_drink_type = /datum/reagent/consumable/ethanol/black_russian + name = "Black Russian" + desc = "For the lactose-intolerant. Still as classy as a White Russian." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "blackrussianglass" + +/datum/glass_style/drinking_glass/manhattan + required_drink_type = /datum/reagent/consumable/ethanol/manhattan + name = "Manhattan" + desc = "The Detective's undercover drink of choice. He never could stomach gin..." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "manhattanglass" + +/datum/glass_style/drinking_glass/manhattan_proj + required_drink_type = /datum/reagent/consumable/ethanol/manhattan_proj + name = "Manhattan Project" + desc = "A scientist's drink of choice, for thinking how to blow up the station." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "proj_manhattanglass" + +/datum/glass_style/drinking_glass/whiskeysoda + required_drink_type = /datum/reagent/consumable/ethanol/whiskeysoda + name = "whiskey soda" + desc = "Ultimate refreshment." + icon_state = "whiskeysodaglass2" + +/datum/glass_style/drinking_glass/antifreeze + required_drink_type = /datum/reagent/consumable/ethanol/antifreeze + name = "Anti-freeze" + desc = "The ultimate refreshment." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "antifreeze" + +/datum/glass_style/drinking_glass/barefoot + required_drink_type = /datum/reagent/consumable/ethanol/barefoot + name = "Barefoot" + desc = "Barefoot and pregnant." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "b&p" + +/datum/glass_style/drinking_glass/snowwhite + required_drink_type = /datum/reagent/consumable/ethanol/snowwhite + name = "Snow White" + desc = "A cold refreshment." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "snowwhite" + +/datum/glass_style/drinking_glass/demonsblood + required_drink_type = /datum/reagent/consumable/ethanol/demonsblood + name = "Demons Blood" + desc = "Just looking at this thing makes the hair at the back of your neck stand up." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "demonsblood" + +/datum/glass_style/drinking_glass/devilskiss + required_drink_type = /datum/reagent/consumable/ethanol/devilskiss + name = "Devils Kiss" + desc = "Creepy time!" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "devilskiss" + +/datum/glass_style/drinking_glass/vodkatonic + required_drink_type = /datum/reagent/consumable/ethanol/vodkatonic + name = "vodka and tonic" + desc = "For when a gin and tonic isn't Russian enough." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "vodkatonicglass" + +/datum/glass_style/drinking_glass/ginfizz + required_drink_type = /datum/reagent/consumable/ethanol/ginfizz + name = "gin fizz" + desc = "Refreshingly lemony, deliciously dry." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "ginfizzglass" + +/datum/glass_style/drinking_glass/bahama_mama + required_drink_type = /datum/reagent/consumable/ethanol/bahama_mama + name = "Bahama Mama" + desc = "A tropical cocktail with a complex blend of flavors." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "bahama_mama" + +/datum/glass_style/drinking_glass/singulo + required_drink_type = /datum/reagent/consumable/ethanol/singulo + name = "Singulo" + desc = "A blue-space beverage." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "singulo" + +/datum/glass_style/drinking_glass/sbiten + required_drink_type = /datum/reagent/consumable/ethanol/sbiten + name = "Sbiten" + desc = "A spicy mix of Vodka and Spice. Very hot." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "sbitenglass" + +/datum/glass_style/drinking_glass/red_mead + required_drink_type = /datum/reagent/consumable/ethanol/red_mead + name = "Red Mead" + desc = "A true Viking's beverage, made with the blood of their enemies." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "red_meadglass" + +/datum/glass_style/drinking_glass/mead + required_drink_type = /datum/reagent/consumable/ethanol/mead + name = "Mead" + desc = "A drink from Valhalla." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "meadglass" + +/datum/glass_style/drinking_glass/iced_beer + required_drink_type = /datum/reagent/consumable/ethanol/iced_beer + name = "iced beer" + desc = "A beer so frosty, the air around it freezes." + icon_state = "iced_beerglass" + +/datum/glass_style/drinking_glass/grog + required_drink_type = /datum/reagent/consumable/ethanol/grog + name = "Grog" + desc = "A fine and cepa drink for Space." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "grogglass" + +/datum/glass_style/drinking_glass/aloe + required_drink_type = /datum/reagent/consumable/ethanol/aloe + name = "Aloe" + desc = "Very, very, very good." + icon_state = "aloe" + +/datum/glass_style/drinking_glass/andalusia + required_drink_type = /datum/reagent/consumable/ethanol/andalusia + name = "Andalusia" + desc = "A nice, strangely named drink." + icon_state = "andalusia" + +/datum/glass_style/drinking_glass/alliescocktail + required_drink_type = /datum/reagent/consumable/ethanol/alliescocktail + name = "Allies cocktail" + desc = "A drink made from your allies." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "alliescocktail" + +/datum/glass_style/drinking_glass/acid_spit + required_drink_type = /datum/reagent/consumable/ethanol/acid_spit + name = "Acid Spit" + desc = "A drink from Nanotrasen. Made from live aliens." + icon_state = "acidspitglass" + +/datum/glass_style/drinking_glass/amasec + required_drink_type = /datum/reagent/consumable/ethanol/amasec + name = "Amasec" + desc = "Always handy before COMBAT!!!" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "amasecglass" + +/datum/glass_style/drinking_glass/changelingsting + required_drink_type = /datum/reagent/consumable/ethanol/changelingsting + name = "Changeling Sting" + desc = "A stingy drink." + icon = 'icons/obj/drinks/soda.dmi' + icon_state = "changelingsting" + +/datum/glass_style/drinking_glass/irishcarbomb + required_drink_type = /datum/reagent/consumable/ethanol/irishcarbomb + name = "Irish Car Bomb" + desc = "An Irish car bomb." + icon_state = "irishcarbomb" + +/datum/glass_style/drinking_glass/syndicatebomb + required_drink_type = /datum/reagent/consumable/ethanol/syndicatebomb + name = "Syndicate Bomb" + desc = "A syndicate bomb." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "syndicatebomb" + +/datum/glass_style/drinking_glass/hiveminderaser + required_drink_type = /datum/reagent/consumable/ethanol/hiveminderaser + name = "Hivemind Eraser" + desc = "For when even mindshields can't save you." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "hiveminderaser" + +/datum/glass_style/drinking_glass/erikasurprise + required_drink_type = /datum/reagent/consumable/ethanol/erikasurprise + name = "Erika Surprise" + desc = "The surprise is, it's green!" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "erikasurprise" + +/datum/glass_style/drinking_glass/driestmartini + required_drink_type = /datum/reagent/consumable/ethanol/driestmartini + name = "Driest Martini" + desc = "Only for the experienced. You think you see sand floating in the glass." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "driestmartiniglass" + +/datum/glass_style/drinking_glass/bananahonk + required_drink_type = /datum/reagent/consumable/ethanol/bananahonk + name = "Banana Honk" + desc = "A drink from Clown Heaven." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "bananahonkglass" + +/datum/glass_style/drinking_glass/silencer + required_drink_type = /datum/reagent/consumable/ethanol/silencer + name = "Silencer" + desc = "A drink from Mime Heaven." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "silencerglass" + +/datum/glass_style/drinking_glass/drunkenblumpkin + required_drink_type = /datum/reagent/consumable/ethanol/drunkenblumpkin + name = "Drunken Blumpkin" + desc = "A drink for the drunks." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "drunkenblumpkin" + +/datum/glass_style/drinking_glass/whiskey_sour + required_drink_type = /datum/reagent/consumable/ethanol/whiskey_sour + name = "whiskey sour" + desc = "Lemon juice mixed with whiskey and a dash of sugar. Surprisingly satisfying." + icon_state = "whiskey_sour" + +/datum/glass_style/drinking_glass/hcider + required_drink_type = /datum/reagent/consumable/ethanol/hcider + name = "hard cider" + desc = "Tastes like autumn... no wait, fall!" + icon_state = "whiskeyglass" + +/datum/glass_style/drinking_glass/fetching_fizz + required_drink_type = /datum/reagent/consumable/ethanol/fetching_fizz + name = "Fetching Fizz" + desc = "Induces magnetism in the imbiber. Started as a barroom prank but evolved to become popular with miners and scrappers. Metallic aftertaste." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "fetching_fizz" + +/datum/glass_style/drinking_glass/hearty_punch + required_drink_type = /datum/reagent/consumable/ethanol/hearty_punch + name = "Hearty Punch" + desc = "Aromatic beverage served piping hot. According to folk tales it can almost wake the dead." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "hearty_punch" + +/datum/glass_style/drinking_glass/bacchus_blessing + required_drink_type = /datum/reagent/consumable/ethanol/bacchus_blessing + name = "Bacchus' Blessing" + desc = "You didn't think it was possible for a liquid to be so utterly revolting. Are you sure about this...?" + icon_state = "glass_brown2" + +/datum/glass_style/drinking_glass/atomicbomb + required_drink_type = /datum/reagent/consumable/ethanol/atomicbomb + name = "Atomic Bomb" + desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "atomicbombglass" + +/datum/glass_style/drinking_glass/gargle_blaster + required_drink_type = /datum/reagent/consumable/ethanol/gargle_blaster + name = "Pan-Galactic Gargle Blaster" + desc = "Like having your brain smashed out by a slice of lemon wrapped around a large gold brick." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "gargleblasterglass" + +/datum/glass_style/drinking_glass/neurotoxin + required_drink_type = /datum/reagent/consumable/ethanol/neurotoxin + name = "Neurotoxin" + desc = "A drink that is guaranteed to knock you silly." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "neurotoxinglass" + +/datum/glass_style/drinking_glass/hippies_delight + required_drink_type = /datum/reagent/consumable/ethanol/hippies_delight + name = "Hippie's Delight" + desc = "A drink enjoyed by people during the 1960's." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "hippiesdelightglass" + +/datum/glass_style/has_foodtype/drinking_glass/eggnog + required_drink_type = /datum/reagent/consumable/ethanol/eggnog + name = "eggnog" + desc = "For enjoying the most wonderful time of the year." + icon_state = "glass_yellow" + drink_type = FRUIT + +/datum/glass_style/has_foodtype/juicebox/eggnog + required_drink_type = /datum/reagent/consumable/ethanol/eggnog + name = "carton of eggnog" + desc = "A big juicebox for adults." + icon_state = "nog2" + drink_type = FRUIT + +/datum/glass_style/has_foodtype/drinking_glass/dreadnog + required_drink_type = /datum/reagent/consumable/ethanol/dreadnog + name = "eggnog" + desc = "For suffering during the best time of the year." + drink_type = FRUIT | GROSS + +/datum/glass_style/drinking_glass/narsour + required_drink_type = /datum/reagent/consumable/ethanol/narsour + name = "Nar'Sour" + desc = "A new hit cocktail inspired by THE ARM Breweries will have you shouting Fuu ma'jin in no time!" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "narsour" + +/datum/glass_style/drinking_glass/triple_sec + required_drink_type = /datum/reagent/consumable/ethanol/triple_sec + name = "Triple Sec" + desc = "A glass of straight Triple Sec." + icon_state = "glass_orange" + +/datum/glass_style/drinking_glass/creme_de_menthe + required_drink_type = /datum/reagent/consumable/ethanol/creme_de_menthe + name = "Creme de Menthe" + desc = "You can almost feel the first breath of spring just looking at it." + icon_state = "glass_green" + +/datum/glass_style/drinking_glass/creme_de_cacao + required_drink_type = /datum/reagent/consumable/ethanol/creme_de_cacao + name = "Creme de Cacao" + desc = "A million hazing lawsuits and alcohol poisonings have started with this humble ingredient." + icon_state = "glass_brown" + +/datum/glass_style/drinking_glass/creme_de_coconut + required_drink_type = /datum/reagent/consumable/ethanol/creme_de_coconut + name = "Creme de Coconut" + desc = "An unintimidating glass of coconut liqueur." + icon_state = "glass_white" + +/datum/glass_style/drinking_glass/quadruple_sec + required_drink_type = /datum/reagent/consumable/ethanol/quadruple_sec + name = "Quadruple Sec" + desc = "An intimidating and lawful beverage dares you to violate the law and make its day. Still can't drink it on duty, though." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "quadruple_sec" + +/datum/glass_style/drinking_glass/quintuple_sec + required_drink_type = /datum/reagent/consumable/ethanol/quintuple_sec + name = "Quintuple Sec" + desc = "Now you are become law, destroyer of clowns." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "quintuple_sec" + +/datum/glass_style/drinking_glass/grasshopper + required_drink_type = /datum/reagent/consumable/ethanol/grasshopper + name = "Grasshopper" + desc = "You weren't aware edible beverages could be that green." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "grasshopper" + +/datum/glass_style/drinking_glass/stinger + required_drink_type = /datum/reagent/consumable/ethanol/stinger + name = "Stinger" + desc = "You wonder what would happen if you pointed this at a heat source..." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "stinger" + +/datum/glass_style/drinking_glass/bastion_bourbon + required_drink_type = /datum/reagent/consumable/ethanol/bastion_bourbon + name = "Bastion Bourbon" + desc = "If you're feeling low, count on the buttery flavor of our own bastion bourbon." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "bastion_bourbon" + +/datum/glass_style/drinking_glass/squirt_cider + required_drink_type = /datum/reagent/consumable/ethanol/squirt_cider + name = "Squirt Cider" + desc = "Squirt cider will toughen you right up. Too bad about the musty aftertaste." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "squirt_cider" + +/datum/glass_style/drinking_glass/fringe_weaver + required_drink_type = /datum/reagent/consumable/ethanol/fringe_weaver + name = "Fringe Weaver" + desc = "It's a wonder it doesn't spill out of the glass." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "fringe_weaver" + +/datum/glass_style/drinking_glass/sugar_rush + required_drink_type = /datum/reagent/consumable/ethanol/sugar_rush + name = "Sugar Rush" + desc = "If you can't mix a Sugar Rush, you can't tend bar." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "sugar_rush" + +/datum/glass_style/drinking_glass/crevice_spike + required_drink_type = /datum/reagent/consumable/ethanol/crevice_spike + name = "Crevice Spike" + desc = "It'll either knock the drunkenness out of you or knock you out cold. Both, probably." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "crevice_spike" + +/datum/glass_style/drinking_glass/peppermint_patty + required_drink_type = /datum/reagent/consumable/ethanol/peppermint_patty + name = "Peppermint Patty" + desc = "A boozy minty hot cocoa that warms your belly on a cold night." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "peppermint_patty" + +/datum/glass_style/drinking_glass/alexander + required_drink_type = /datum/reagent/consumable/ethanol/alexander + name = "Alexander" + desc = "A creamy, indulgent delight that is stronger than it seems." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "alexander" + +/datum/glass_style/drinking_glass/amaretto_alexander + required_drink_type = /datum/reagent/consumable/ethanol/amaretto_alexander + name = "Amaretto Alexander" + desc = "A creamy, indulgent delight that is in fact as gentle as it seems." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "alexanderam" + +/datum/glass_style/drinking_glass/sidecar + required_drink_type = /datum/reagent/consumable/ethanol/sidecar + name = "Sidecar" + desc = "The one ride you'll gladly give up the wheel for." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "sidecar" + +/datum/glass_style/drinking_glass/between_the_sheets + required_drink_type = /datum/reagent/consumable/ethanol/between_the_sheets + name = "Between the Sheets" + desc = "The only drink that comes with a label reminding you of Nanotrasen's zero-tolerance promiscuity policy." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "between_the_sheets" + +/datum/glass_style/drinking_glass/kamikaze + required_drink_type = /datum/reagent/consumable/ethanol/kamikaze + name = "Kamikaze" + desc = "Divinely windy." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "kamikaze" + +/datum/glass_style/drinking_glass/mojito + required_drink_type = /datum/reagent/consumable/ethanol/mojito + name = "Mojito" + desc = "A drink that looks as refreshing as it tastes." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "mojito" + +/datum/glass_style/drinking_glass/moscow_mule + required_drink_type = /datum/reagent/consumable/ethanol/moscow_mule + name = "Moscow Mule" + desc = "A chilly drink that reminds you of the Derelict." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "moscow_mule" + +/datum/glass_style/drinking_glass/fernet_cola + required_drink_type = /datum/reagent/consumable/ethanol/fernet_cola + name = "glass of fernet cola" + desc = "A sawed-off cola bottle filled with Fernet Cola. Nothing better after eating like a lardass." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "godlyblend" + +/datum/glass_style/drinking_glass/fanciulli + required_drink_type = /datum/reagent/consumable/ethanol/fanciulli + name = "glass of fanciulli" + desc = "A glass of Fanciulli. It's just Manhattan with Fernet." + icon_state = "fanciulli" + +/datum/glass_style/drinking_glass/branca_menta + required_drink_type = /datum/reagent/consumable/ethanol/branca_menta + name = "glass of branca menta" + desc = "A glass of Branca Menta, perfect for those lazy and hot Sunday summer afternoons." //Get lazy literally by drinking this + icon_state = "minted_fernet" + +/datum/glass_style/drinking_glass/blank_paper + required_drink_type = /datum/reagent/consumable/ethanol/blank_paper + name = "glass of blank paper" + desc = "A fizzy cocktail for those looking to start fresh." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "blank_paper" + +/datum/glass_style/drinking_glass/wizz_fizz + required_drink_type = /datum/reagent/consumable/ethanol/wizz_fizz + name = "Wizz Fizz" + desc = "The glass bubbles and froths with an almost magical intensity." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "wizz_fizz" + +/datum/glass_style/drinking_glass/bug_spray + required_drink_type = /datum/reagent/consumable/ethanol/bug_spray + name = "Bug Spray" + desc = "Your eyes begin to water as the sting of alcohol reaches them." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "bug_spray" + +/datum/glass_style/drinking_glass/applejack + required_drink_type = /datum/reagent/consumable/ethanol/applejack + name = "Applejack" + desc = "You feel like you could drink this all neight." + icon_state = "applejack_glass" + +/datum/glass_style/drinking_glass/jack_rose + required_drink_type = /datum/reagent/consumable/ethanol/jack_rose + name = "Jack Rose" + desc = "Enough of these, and you really will start to suppose your toeses are roses." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "jack_rose" + +/datum/glass_style/drinking_glass/turbo + required_drink_type = /datum/reagent/consumable/ethanol/turbo + name = "Turbo" + desc = "A turbulent cocktail for outlaw hoverbikers." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "turbo" + +/datum/glass_style/drinking_glass/old_timer + required_drink_type = /datum/reagent/consumable/ethanol/old_timer + name = "Old Timer" + desc = "WARNING! May cause premature aging!" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "old_timer" + +/datum/glass_style/drinking_glass/rubberneck + required_drink_type = /datum/reagent/consumable/ethanol/rubberneck + name = "Rubberneck" + desc = "A popular drink amongst those adhering to an all synthetic diet." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "rubberneck" + +/datum/glass_style/drinking_glass/duplex + required_drink_type = /datum/reagent/consumable/ethanol/duplex + name = "Duplex" + desc = "To imbibe one component separately from the other is consider a great faux pas." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "duplex" + +/datum/glass_style/drinking_glass/trappist + required_drink_type = /datum/reagent/consumable/ethanol/trappist + name = "Trappist Beer" + desc = "boozy Catholicism in a glass." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "trappistglass" + +/datum/glass_style/drinking_glass/blazaam + required_drink_type = /datum/reagent/consumable/ethanol/blazaam + name = "Blazaam" + desc = "The glass seems to be sliding between realities. Doubles as a Berenstain remover." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "blazaamglass" + +/datum/glass_style/drinking_glass/planet_cracker + required_drink_type = /datum/reagent/consumable/ethanol/planet_cracker + name = "Planet Cracker" + desc = "Although historians believe the drink was originally created to commemorate the end of an important conflict in man's past, its origins have largely been forgotten and it is today seen more as a general symbol of human supremacy." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "planet_cracker" + +/datum/glass_style/drinking_glass/mauna_loa + required_drink_type = /datum/reagent/consumable/ethanol/mauna_loa + name = "Mauna Loa" + desc = "Lavaland in a drink... mug... volcano... thing." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "mauna_loa" + +/datum/glass_style/drinking_glass/painkiller + required_drink_type = /datum/reagent/consumable/ethanol/painkiller + name = "Painkiller" + desc = "A combination of tropical juices and rum. Surely this will make you feel better." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "painkiller" + +/datum/glass_style/drinking_glass/pina_colada + required_drink_type = /datum/reagent/consumable/ethanol/pina_colada + name = "Pina Colada" + desc = "If you like pina coladas, and getting caught in the rain... well, you'll like this drink." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "pina_colada" + +/datum/glass_style/drinking_glass/pina_olivada + required_drink_type = /datum/reagent/consumable/ethanol/pina_olivada + name = "Piña Olivada" + desc = "A balance of fruity pineapple with thick, rich olive oil. Stir well before drinking." + icon_state = "pina_olivada" + +/datum/glass_style/drinking_glass/ginger_amaretto + required_drink_type = /datum/reagent/consumable/ethanol/ginger_amaretto + name = "Ginger Amaretto" + desc = "The sprig of rosemary adds a nice aroma to the drink, and isn't just to be pretentious afterall!" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "gingeramaretto" + +/datum/glass_style/drinking_glass/godfather + required_drink_type = /datum/reagent/consumable/ethanol/godfather + name = "Godfather" + desc = "A classic from old Italy and enjoyed by gangsters, pray the orange peel doesnt end up in your mouth." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "godfather" + +/datum/glass_style/drinking_glass/godmother + required_drink_type = /datum/reagent/consumable/ethanol/godmother + name = "Godmother" + desc = "A lovely fresh smelling cocktail, a true Sicilian delight." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "godmother" + +/datum/glass_style/drinking_glass/kortara + required_drink_type = /datum/reagent/consumable/ethanol/kortara + name = "glass of kortara" + desc = "The fermented nectar of the Korta nut, as enjoyed by lizards galaxywide." + icon_state = "kortara_glass" + +/datum/glass_style/drinking_glass/sea_breeze + required_drink_type = /datum/reagent/consumable/ethanol/sea_breeze + name = "Sea Breeze" + desc = "Minty, chocolatey, and creamy. It's like drinkable mint chocolate chip!" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "sea_breeze" + +/datum/glass_style/drinking_glass/white_tiziran + required_drink_type = /datum/reagent/consumable/ethanol/white_tiziran + name = "White Tiziran" + desc = "I had a rough night and I hate the fucking humans, man." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "white_tiziran" + +/datum/glass_style/drinking_glass/drunken_espatier + required_drink_type = /datum/reagent/consumable/ethanol/drunken_espatier + name = "Drunken Espatier" + desc = "A drink to make facing death easier." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "drunken_espatier" + +/datum/glass_style/drinking_glass/protein_blend + required_drink_type = /datum/reagent/consumable/ethanol/protein_blend + name = "Protein Blend" + desc = "Vile, even by lizard standards." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "protein_blend" + +/datum/glass_style/drinking_glass/mushi_kombucha + required_drink_type = /datum/reagent/consumable/ethanol/mushi_kombucha + name = "glass of mushi kombucha" + icon_state = "glass_orange" + +/datum/glass_style/drinking_glass/triumphal_arch + required_drink_type = /datum/reagent/consumable/ethanol/triumphal_arch + name = "Triumphal Arch" + desc = "A toast to the Empire, long may it stand." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "triumphal_arch" + +/datum/glass_style/drinking_glass/the_juice + required_drink_type = /datum/reagent/consumable/ethanol/the_juice + name = "The Juice" + desc = "A concoction of not-so-edible things that apparently lets you feel like you're in two places at once" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "thejuice" + +/datum/glass_style/drinking_glass/admiralty + required_drink_type = /datum/reagent/consumable/ethanol/admiralty + name = "Admiralty" + desc = "Hail to the Admiral, for he brings fair tidings, and rum too." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "admiralty" + +/datum/glass_style/drinking_glass/long_haul + required_drink_type = /datum/reagent/consumable/ethanol/long_haul + name = "Long Haul" + desc = "A perfect companion for a lonely long haul flight." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "long_haul" + +/datum/glass_style/drinking_glass/long_john_silver + required_drink_type = /datum/reagent/consumable/ethanol/long_john_silver + name = "Long John Silver" + 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?" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "long_john_silver" + +/datum/glass_style/drinking_glass/tropical_storm + required_drink_type = /datum/reagent/consumable/ethanol/tropical_storm + name = "Tropical Storm" + desc = "Less destructive than the real thing." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "tropical_storm" + +/datum/glass_style/drinking_glass/dark_and_stormy + required_drink_type = /datum/reagent/consumable/ethanol/dark_and_stormy + name = "Dark and Stormy" + desc = "Thunder and lightning, very very frightening." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "dark_and_stormy" + +/datum/glass_style/drinking_glass/salt_and_swell + required_drink_type = /datum/reagent/consumable/ethanol/salt_and_swell + name = "Salt and Swell" + desc = "Ah, I do like to be beside the seaside." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "salt_and_swell" + +/datum/glass_style/drinking_glass/tiltaellen + required_drink_type = /datum/reagent/consumable/ethanol/tiltaellen + name = "glass of tiltällen" + desc = "Eww... it's curdled." + icon_state = "tiltaellen" + +/datum/glass_style/drinking_glass/tich_toch + required_drink_type = /datum/reagent/consumable/ethanol/tich_toch + name = "Tich Toch" + desc = "Oh god." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "tich_toch" + +/datum/glass_style/drinking_glass/helianthus + required_drink_type = /datum/reagent/consumable/ethanol/helianthus + name = "Helianthus" + desc = "Another reason to cut off an ear..." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "helianthus" + +/datum/glass_style/drinking_glass/plumwine + required_drink_type = /datum/reagent/consumable/ethanol/plumwine + name = "plum wine" + desc = "Looks like an evening of writing fine poetry." + icon_state = "plumwineglass" + +/datum/glass_style/drinking_glass/the_hat + required_drink_type = /datum/reagent/consumable/ethanol/the_hat + name = "The Hat" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "thehatglass" + +/datum/glass_style/drinking_glass/gin_garden + required_drink_type = /datum/reagent/consumable/ethanol/gin_garden + name = "gin garden" + desc = "Hey, someone forgot the herb and... the cucumber in my cocktail!" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "gin_garden" + +/datum/glass_style/drinking_glass/wine_voltaic + required_drink_type = /datum/reagent/consumable/ethanol/wine_voltaic + name = "Voltaic Yellow Wine" + desc = "Electrically charged wine. Recharges ethereals, but also nontoxic." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "wine_voltaic" + +/datum/glass_style/drinking_glass/telepole + required_drink_type = /datum/reagent/consumable/ethanol/telepole + name = "Telepole" + desc = "A liquid grounding rod. Recharges ethereals and grants temporary shock resistance." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "telepole" + +/datum/glass_style/drinking_glass/pod_tesla + required_drink_type = /datum/reagent/consumable/ethanol/pod_tesla + name = "Pod Tesla" + desc = "Ride the lightning! Recharges ethereals, suppresses phobias, and grants strong temporary shock resistance." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "pod_tesla" + +/datum/glass_style/drinking_glass/yuyakita + required_drink_type = /datum/reagent/consumable/ethanol/yuyakita + name = "Yūyakita" + desc = "And I looked, and behold a pale horse: and his name that sat on him was Death, and Hell followed with him." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "yuyakita" + +/datum/glass_style/drinking_glass/saibasan + required_drink_type = /datum/reagent/consumable/ethanol/saibasan + name = "Saibāsan" + desc = "A drink made in honour of Cybersun Industries' 600th year of continual business. Officially, you're meant to call this a \"Hong Kong Cooler\" on Nanotrasen stations, but that name sucks." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "saibasan" + +/datum/glass_style/drinking_glass/banzai_ti + required_drink_type = /datum/reagent/consumable/ethanol/banzai_ti + name = "Banzai-Tī" + desc = "A drink to last ten-thousand years- better sip slowly then." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "banzai_ti" + +/datum/glass_style/drinking_glass/sanraizusoda + required_drink_type = /datum/reagent/consumable/ethanol/sanraizusoda + name = "Sanraizusōda" + desc = "A popular children's dessert from Japan, made adult with the addition of booze. Kanpai!" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "sanraizusoda" + +/datum/glass_style/drinking_glass/kumicho + required_drink_type = /datum/reagent/consumable/ethanol/kumicho + name = "Kumichō" + desc = "Much like the American Godfather, the Kumichō is sophisticated, strong, and almost certainly tied to illicit activities." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "kumicho" + +/datum/glass_style/drinking_glass/red_planet + required_drink_type = /datum/reagent/consumable/ethanol/red_planet + name = "Red Planet" + desc = "A patriotic drink from Mars, commonly enjoyed on September 15th: the day that peace was declared following the Martian uprising, with the Martian Concession granting Mars proper representation as part of the Terran Federation." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "red_planet" + +/datum/glass_style/drinking_glass/amaterasu + required_drink_type = /datum/reagent/consumable/ethanol/amaterasu + name = "Amaterasu" + desc = "And so Amaterasu emerged from the Heavenly Rock Cave, and light was restored to the world." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "amaterasu" + +/datum/glass_style/drinking_glass/nekomimosa + required_drink_type = /datum/reagent/consumable/ethanol/nekomimosa + name = "Nekomimosa" + desc = "A syrupy mess of a cocktail, dedicated to a felinid popstar that took Mars by storm a few years ago." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "nekomimosa" + +/datum/glass_style/drinking_glass/sentai_quencha + required_drink_type = /datum/reagent/consumable/ethanol/sentai_quencha + name = "Sentai Quencha" + desc = "Tastes like ultimate ninja power. And melon. And citrus. And some other stuff." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "sentai_quencha" + +/datum/glass_style/drinking_glass/bosozoku + required_drink_type = /datum/reagent/consumable/ethanol/bosozoku + name = "Bōsōzoku" + desc = "A refreshing summer drink enjoyed across Mars and beyond. Any resemblance to shandies or radlers is unintentional." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "bosozoku" + +/datum/glass_style/drinking_glass/ersatzche + required_drink_type = /datum/reagent/consumable/ethanol/ersatzche + name = "Ersatzche" + desc = "An interesting drink invented in the Blue Room Bar and Grill in New Osaka. It's a tasty take on Mexican tepache, made with a beer base." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "ersatzche" + +/datum/glass_style/drinking_glass/red_city_am + required_drink_type = /datum/reagent/consumable/ethanol/red_city_am + name = "Red City AM" + desc = "A popular breakfast drink from New Osaka's bars- for the enterprising day drinker." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "red_city_am" + +/datum/glass_style/drinking_glass/kings_ransom + required_drink_type = /datum/reagent/consumable/ethanol/kings_ransom + name = "King's Ransom" + desc = "A weird drink that manages to marry a number of seemingly conflicting flavours into a single harmonious taste." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "kings_ransom" + +/datum/glass_style/drinking_glass/four_bit + required_drink_type = /datum/reagent/consumable/ethanol/four_bit + name = "Four Bit" + desc = "Straight out of the pits of a Martian hacking convention." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "four_bit" + +/datum/glass_style/drinking_glass/white_hawaiian + required_drink_type = /datum/reagent/consumable/ethanol/white_hawaiian + name = "White Hawaiian" + desc = "One of the infinite variations on the White Russian, this drink gets away from the frozen north and into the heat of the ring of fire with a host of toasty coconut flavours." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "white_hawaiian" + +/datum/glass_style/drinking_glass/maui_sunrise + required_drink_type = /datum/reagent/consumable/ethanol/maui_sunrise + name = "Maui Sunrise" + desc = "Take a sip and be transported to the Aloha state. Metaphorically, of course." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "maui_sunrise" + +/datum/glass_style/drinking_glass/imperial_mai_tai + required_drink_type = /datum/reagent/consumable/ethanol/imperial_mai_tai + name = "Imperial Mai Tai" + desc = "I mean, who springs for orgeat these days anyway? Korta nut's the new big thing, baby." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "imperial_mai_tai" + +/datum/glass_style/drinking_glass/konococo_rumtini + required_drink_type = /datum/reagent/consumable/ethanol/konococo_rumtini + name = "Konococo Rumtini" + desc = "Considered an acceptable breakfast drink in Little Hawaii." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "konococo_rumtini" + +/datum/glass_style/drinking_glass/blue_hawaiian + required_drink_type = /datum/reagent/consumable/ethanol/blue_hawaiian + name = "Blue Hawaiian" + desc = "It's a tropical vacation in a glass." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "blue_hawaiian" + +// Shot glasses + +/datum/glass_style/shot_glass/toxins_special + required_drink_type = /datum/reagent/consumable/ethanol/toxins_special + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "toxinsspecialglass" + +/datum/glass_style/shot_glass/b52 + required_drink_type = /datum/reagent/consumable/ethanol/b52 + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "b52glass" + +/datum/glass_style/shot_glass/hcider + required_drink_type = /datum/reagent/consumable/ethanol/hcider + icon_state = "shotglassbrown" + +/datum/glass_style/shot_glass/bastion_bourbon + required_drink_type = /datum/reagent/consumable/ethanol/bastion_bourbon + icon_state = "shotglassgreen" + +/datum/glass_style/shot_glass/squirt_cider + required_drink_type = /datum/reagent/consumable/ethanol/squirt_cider + icon_state = "shotglassgreen" + +/datum/glass_style/shot_glass/jack_rose + required_drink_type = /datum/reagent/consumable/ethanol/jack_rose + icon_state = "shotglassred" diff --git a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/mixed_drinks.dm b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/mixed_drinks.dm new file mode 100644 index 0000000000000..9074aff95ef5c --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/mixed_drinks.dm @@ -0,0 +1,77 @@ +// Mixed drinks + +/datum/glass_style/drinking_glass/lemonade + required_drink_type = /datum/reagent/consumable/lemonade + name = "pitcher of lemonade" + desc = "This drink leaves you feeling nostalgic for some reason." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "lemonpitcher" + +/datum/glass_style/drinking_glass/arnold_palmer + required_drink_type = /datum/reagent/consumable/tea/arnold_palmer + name = "Arnold Palmer" + desc = "You feel like taking a few golf swings after a few swigs of this." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "arnold_palmer" + +/datum/glass_style/drinking_glass/roy_rogers + required_drink_type = /datum/reagent/consumable/roy_rogers + name = "Roy Rogers" + desc = "90% sugar in a glass." + icon_state = "royrogers" + +/datum/glass_style/drinking_glass/doctor_delight + required_drink_type = /datum/reagent/consumable/doctor_delight + name = "Doctor's Delight" + desc = "The space doctor's favorite. Guaranteed to restore bodily injury; side effects include cravings and hunger." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "doctorsdelightglass" + +/datum/glass_style/drinking_glass/cinderella + required_drink_type = /datum/reagent/consumable/cinderella + name = "Cinderella" + desc = "There is not a single drop of alcohol in this thing." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "cinderella" + +/datum/glass_style/drinking_glass/triple_citrus + required_drink_type = /datum/reagent/consumable/triple_citrus + name = "glass of triple citrus" + desc = "A mixture of citrus juices. Tangy, yet smooth." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "triplecitrus" + +/datum/glass_style/drinking_glass/shirley_temple + required_drink_type = /datum/reagent/consumable/shirley_temple + name = "Shirley Temple" + desc = "Ginger ale with processed grenadine. " + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "shirleytemple" + +/datum/glass_style/drinking_glass/red_queen + required_drink_type = /datum/reagent/consumable/red_queen + name = "Red Queen" + desc = "DRINK ME." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "red_queen" + +/datum/glass_style/drinking_glass/agua_fresca + required_drink_type = /datum/reagent/consumable/agua_fresca + name = "Agua Fresca" + desc = "90% water, but still refreshing." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "aguafresca" + +/datum/glass_style/drinking_glass/cucumberlemonade + required_drink_type = /datum/reagent/consumable/cucumberlemonade + name = "cucumber lemonade" + desc = "The smell of cucumber from lemonade, I'm sure I won't get poisoned." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "cucumber_lemonade" + +/datum/glass_style/drinking_glass/mississippi_queen + required_drink_type = /datum/reagent/consumable/mississippi_queen + name = "Mississippi Queen" + desc = "Mullets and cut-up jorts not included." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "mississippiglass" diff --git a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/smoothies_shakes.dm b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/smoothies_shakes.dm new file mode 100644 index 0000000000000..9b39c87062a19 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/smoothies_shakes.dm @@ -0,0 +1,100 @@ + +// Shakes and smoothies + +/datum/glass_style/drinking_glass/cherryshake + required_drink_type = /datum/reagent/consumable/cherryshake + name = "cherry shake" + desc = "A cherry flavored milkshake." + icon = 'icons/obj/drinks/shakes.dmi' + icon_state = "cherryshake" + +/datum/glass_style/drinking_glass/bluecherryshake + required_drink_type = /datum/reagent/consumable/bluecherryshake + name = "blue cherry shake" + desc = "An exotic blue milkshake." + icon = 'icons/obj/drinks/shakes.dmi' + icon_state = "bluecherryshake" + +/datum/glass_style/drinking_glass/vanillashake + required_drink_type = /datum/reagent/consumable/vanillashake + name = "vanilla shake" + desc = "A vanilla flavored milkshake." + icon = 'icons/obj/drinks/shakes.dmi' + icon_state = "vanillashake" + +/datum/glass_style/drinking_glass/caramelshake + required_drink_type = /datum/reagent/consumable/caramelshake + name = "caramel shake" + desc = "A caramel flavored milkshake." + icon = 'icons/obj/drinks/shakes.dmi' + icon_state = "caramelshake" + +/datum/glass_style/drinking_glass/choccyshake + required_drink_type = /datum/reagent/consumable/choccyshake + name = "chocolate shake" + desc = "A chocolate flavored milkshake." + icon = 'icons/obj/drinks/shakes.dmi' + icon_state = "choccyshake" + +/datum/glass_style/drinking_glass/strawberryshake + required_drink_type = /datum/reagent/consumable/strawberryshake + name = "strawberry shake" + desc = "A strawberry flavored milkshake." + icon = 'icons/obj/drinks/shakes.dmi' + icon_state = "strawberryshake" + +/datum/glass_style/drinking_glass/bananashake + required_drink_type = /datum/reagent/consumable/bananashake + name = "banana shake" + desc = "A banana flavored milkshake." + icon = 'icons/obj/drinks/shakes.dmi' + icon_state = "bananashake" + +/datum/glass_style/drinking_glass/gibbfloats + required_drink_type = /datum/reagent/consumable/gibbfloats + name = "Gibbfloat" + desc = "Dr. Gibb with ice cream on top." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "gibbfloats" + +/datum/glass_style/drinking_glass/strawberry_banana + required_drink_type = /datum/reagent/consumable/strawberry_banana + name = "strawberry banana smoothie" + desc = "A classic drink which countless souls have bonded over..." + icon = 'icons/obj/drinks/shakes.dmi' + icon_state = "strawberry_banana" + +/datum/glass_style/drinking_glass/berry_blast + required_drink_type = /datum/reagent/consumable/berry_blast + name = "berry blast smoothie" + desc = "A classic drink, freshly made with hand picked berries. Or, maybe not." + icon = 'icons/obj/drinks/shakes.dmi' + icon_state = "berry_blast" + +/datum/glass_style/drinking_glass/funky_monkey + required_drink_type = /datum/reagent/consumable/funky_monkey + name = "funky monkey smoothie" + desc = "A classic drink made with chocolate and banana. No monkeys were harmed, officially." + icon = 'icons/obj/drinks/shakes.dmi' + icon_state = "funky_monkey" + +/datum/glass_style/drinking_glass/green_giant + required_drink_type = /datum/reagent/consumable/green_giant + name = "green giant smoothie" + desc = "A classic drink, if you enjoy juiced wheatgrass and chia seeds." + icon = 'icons/obj/drinks/shakes.dmi' + icon_state = "green_giant" + +/datum/glass_style/drinking_glass/melon_baller + required_drink_type = /datum/reagent/consumable/melon_baller + name = "melon baller smoothie" + desc = "A wonderfully fresh melon smoothie. Guaranteed to brighten your day." + icon = 'icons/obj/drinks/shakes.dmi' + icon_state = "melon_baller" + +/datum/glass_style/drinking_glass/vanilla_dream + required_drink_type = /datum/reagent/consumable/vanilla_dream + name = "vanilla dream smoothie" + desc = "A classic drink made with vanilla and fresh cream." + icon = 'icons/obj/drinks/shakes.dmi' + icon_state = "vanilla_dream" diff --git a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/sodas.dm b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/sodas.dm new file mode 100644 index 0000000000000..467b80400fb9c --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/sodas.dm @@ -0,0 +1,118 @@ +// Soft Drinks/Sodas + +/datum/glass_style/drinking_glass/space_cola + required_drink_type = /datum/reagent/consumable/space_cola + name = "glass of Space Cola" + desc = "A glass of refreshing Space Cola." + icon_state = "spacecola" + +/datum/glass_style/drinking_glass/nuka_cola + required_drink_type = /datum/reagent/consumable/nuka_cola + name = "glass of Nuka Cola" + desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland." + icon = 'icons/obj/drinks/soda.dmi' + icon_state = "nuka_colaglass" + +/datum/glass_style/drinking_glass/rootbeer + required_drink_type = /datum/reagent/consumable/rootbeer + name = "glass of root beer" + desc = "A glass of highly potent, incredibly sugary root beer." + icon_state = "spacecola" + +/datum/glass_style/drinking_glass/grey_bull + required_drink_type = /datum/reagent/consumable/grey_bull + name = "glass of Grey Bull" + desc = "Surprisingly it isn't grey." + icon_state = "grey_bull_glass" + +/datum/glass_style/drinking_glass/spacemountainwind + required_drink_type = /datum/reagent/consumable/spacemountainwind + name = "glass of Space Mountain Wind" + desc = "Space Mountain Wind. As you know, there are no mountains in space, only wind." + icon_state = "Space_mountain_wind_glass" + +/datum/glass_style/drinking_glass/dr_gibb + required_drink_type = /datum/reagent/consumable/dr_gibb + name = "glass of Dr. Gibb" + desc = "Dr. Gibb. Not as dangerous as the container_name might imply." + icon_state = "dr_gibb_glass" + +/datum/glass_style/drinking_glass/space_up + required_drink_type = /datum/reagent/consumable/space_up + name = "glass of Space-Up" + desc = "Space-up. It helps you keep your cool." + icon_state = "space-up_glass" + +/datum/glass_style/drinking_glass/lemon_lime + required_drink_type = /datum/reagent/consumable/lemon_lime + name = "glass of lemon-lime" + desc = "You're pretty certain a real fruit has never actually touched this." + icon_state = "lemonlime" + +/datum/glass_style/drinking_glass/pwr_game + required_drink_type = /datum/reagent/consumable/pwr_game + name = "glass of Pwr Game" + desc = "Goes well with a Vlad's salad." + icon_state = "pwrgame" + +/datum/glass_style/drinking_glass/shamblers + required_drink_type = /datum/reagent/consumable/shamblers + name = "glass of Shambler's juice" + desc = "Mmm mm, shambly." + icon_state = "shamblerjuice" + +/datum/glass_style/drinking_glass/sodawater + required_drink_type = /datum/reagent/consumable/sodawater + name = "glass of soda water" + desc = "Soda water. Why not make a scotch and soda?" + icon_state = "glass_clearcarb" + +/datum/glass_style/drinking_glass/tonic + required_drink_type = /datum/reagent/consumable/tonic + name = "glass of tonic water" + desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away." + icon_state = "glass_clearcarb" + +/datum/glass_style/drinking_glass/monkey_energy + required_drink_type = /datum/reagent/consumable/monkey_energy + name = "glass of Monkey Energy" + desc = "You can unleash the ape, but without the pop of the can?" + icon_state = "monkey_energy_glass" + +/datum/glass_style/drinking_glass/grape_soda + required_drink_type = /datum/reagent/consumable/grape_soda + name = "glass of grape juice" + +/datum/glass_style/drinking_glass/cream_soda + required_drink_type = /datum/reagent/consumable/cream_soda + name = "Cream Soda" + desc = "A classic space-American vanilla flavored soft drink." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "cream_soda" + +/datum/glass_style/drinking_glass/sol_dry + required_drink_type = /datum/reagent/consumable/sol_dry + name = "Sol Dry" + desc = "A soothing, mellow drink made from ginger." + icon_state = "soldry" + +/datum/glass_style/drinking_glass/hakka_mate + required_drink_type = /datum/reagent/consumable/hakka_mate + name = "glass of Hakka-Mate" + desc = "The perfect drink for hacking. Just don't pour it on your computer, that'll only slow you down." + icon = 'icons/obj/drinks/drinks.dmi' + icon_state = "hakka_mate" + +/datum/glass_style/drinking_glass/melon_soda + required_drink_type = /datum/reagent/consumable/melon_soda + name = "glass of melon soda" + desc = "As enjoyed by Japanese children and 30-something Japan enthusiasts." + icon = 'icons/obj/drinks/drinks.dmi' + icon_state = "melon_soda" + +/datum/glass_style/drinking_glass/volt_energy + required_drink_type = /datum/reagent/consumable/volt_energy + name = "glass of 24-Volt Energy" + desc = "It's sharp, it's sour, it's electrifying!" + icon = 'icons/obj/drinks/drinks.dmi' + icon_state = "volt_energy" diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 45740ea9809ce..67fb8104efaa9 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -18,22 +18,23 @@ addiction_types = list(/datum/addiction/hallucinogens = 10) //4 per 2 seconds /datum/reagent/drug/space_drugs/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.set_drugginess(30 SECONDS * REM * seconds_per_tick) if(isturf(affected_mob.loc) && !isspaceturf(affected_mob.loc) && !HAS_TRAIT(affected_mob, TRAIT_IMMOBILIZED) && SPT_PROB(5, seconds_per_tick)) step(affected_mob, pick(GLOB.cardinals)) if(SPT_PROB(3.5, seconds_per_tick)) affected_mob.emote(pick("twitch","drool","moan","giggle")) - ..() /datum/reagent/drug/space_drugs/overdose_start(mob/living/affected_mob) + . = ..() to_chat(affected_mob, span_userdanger("You start tripping hard!")) affected_mob.add_mood_event("[type]_overdose", /datum/mood_event/overdose, name) /datum/reagent/drug/space_drugs/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() var/hallucination_duration_in_seconds = (affected_mob.get_timed_status_effect_duration(/datum/status_effect/hallucination) / 10) if(hallucination_duration_in_seconds < volume && SPT_PROB(10, seconds_per_tick)) affected_mob.adjust_hallucinations(10 SECONDS) - ..() /datum/reagent/drug/cannabis name = "Cannabis" @@ -45,6 +46,7 @@ metabolization_rate = 0.125 * REAGENTS_METABOLISM /datum/reagent/drug/cannabis/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.apply_status_effect(/datum/status_effect/stoned) if(SPT_PROB(1, seconds_per_tick)) 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.") @@ -58,7 +60,6 @@ if(SPT_PROB(4, seconds_per_tick) && affected_mob.buckled && affected_mob.body_position != LYING_DOWN && !affected_mob.IsParalyzed()) //chance to be couchlocked if sitting to_chat(affected_mob, "It's too comfy to move...") affected_mob.Paralyze(10 SECONDS) - return ..() /datum/reagent/drug/nicotine name = "Nicotine" @@ -79,6 +80,7 @@ mytray.adjust_pestlevel(-rand(1, 2)) /datum/reagent/drug/nicotine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(0.5, seconds_per_tick)) var/smoke_message = pick("You feel relaxed.", "You feel calmed.","You feel alert.","You feel rugged.") to_chat(affected_mob, span_notice("[smoke_message]")) @@ -89,14 +91,15 @@ affected_mob.AdjustUnconscious(-50 * REM * seconds_per_tick) affected_mob.AdjustParalyzed(-50 * REM * seconds_per_tick) affected_mob.AdjustImmobilized(-50 * REM * seconds_per_tick) - ..() - . = TRUE + return UPDATE_MOB_HEALTH /datum/reagent/drug/nicotine/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustToxLoss(0.1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustOxyLoss(1.1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - ..() - . = TRUE + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustToxLoss(0.1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustOxyLoss(1.1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/drug/krokodil name = "Krokodil" @@ -110,28 +113,28 @@ /datum/reagent/drug/krokodil/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() var/high_message = pick("You feel calm.", "You feel collected.", "You feel like you need to relax.") if(SPT_PROB(2.5, seconds_per_tick)) to_chat(affected_mob, span_notice("[high_message]")) affected_mob.add_mood_event("smacked out", /datum/mood_event/narcotic_heavy, name) - if(current_cycle == 35 && creation_purity <= 0.6) + if(current_cycle == 36 && creation_purity <= 0.6) if(!istype(affected_mob.dna.species, /datum/species/human/krokodil_addict)) to_chat(affected_mob, span_userdanger("Your skin falls off easily!")) var/mob/living/carbon/human/affected_human = affected_mob - affected_human.facial_hairstyle = "Shaved" - affected_human.hairstyle = "Bald" - affected_human.update_body_parts() // makes you loose hair as well + affected_human.set_facial_hairstyle("Shaved", update = FALSE) + affected_human.set_hairstyle("Bald", update = FALSE) affected_mob.set_species(/datum/species/human/krokodil_addict) - affected_mob.adjustBruteLoss(50 * REM, FALSE, required_bodytype = affected_bodytype) // holy shit your skin just FELL THE FUCK OFF - ..() + if(affected_mob.adjustBruteLoss(50 * REM, updating_health = FALSE, required_bodytype = affected_bodytype)) // holy shit your skin just FELL THE FUCK OFF + return UPDATE_MOB_HEALTH /datum/reagent/drug/krokodil/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.25 * REM * seconds_per_tick, required_organtype = affected_organtype) - affected_mob.adjustToxLoss(0.25 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - . = TRUE - - + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.25 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + need_mob_update = affected_mob.adjustToxLoss(0.25 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/drug/methamphetamine name = "Methamphetamine" @@ -159,15 +162,16 @@ var/effective_impurity = min(1, (1 - creation_purity)/0.5) color = BlendRGB(initial(color), "#FAFAFA", effective_impurity) -/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/affected_mob) + . = ..() + affected_mob.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/affected_mob) + . = ..() + affected_mob.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/methamphetamine) /datum/reagent/drug/methamphetamine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() var/high_message = pick("You feel hyper.", "You feel like you need to go faster.", "You feel like you can run the world.") if(SPT_PROB(2.5, seconds_per_tick)) to_chat(affected_mob, span_notice("[high_message]")) @@ -177,15 +181,17 @@ affected_mob.AdjustUnconscious(-40 * REM * seconds_per_tick) affected_mob.AdjustParalyzed(-40 * REM * seconds_per_tick) affected_mob.AdjustImmobilized(-40 * REM * seconds_per_tick) - affected_mob.adjustStaminaLoss(-2 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + var/need_mob_update + need_mob_update = affected_mob.adjustStaminaLoss(-2 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) affected_mob.set_jitter_if_lower(4 SECONDS * REM * seconds_per_tick) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(1, 4) * REM * seconds_per_tick, required_organtype = affected_organtype) + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(1, 4) * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + if(need_mob_update) + . = UPDATE_MOB_HEALTH if(SPT_PROB(2.5, seconds_per_tick)) affected_mob.emote(pick("twitch", "shiver")) - ..() - . = TRUE /datum/reagent/drug/methamphetamine/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() if(!HAS_TRAIT(affected_mob, TRAIT_IMMOBILIZED) && !ismovable(affected_mob.loc)) for(var/i in 1 to round(4 * REM * seconds_per_tick, 1)) step(affected_mob, pick(GLOB.cardinals)) @@ -194,10 +200,11 @@ if(SPT_PROB(18, seconds_per_tick)) affected_mob.visible_message(span_danger("[affected_mob]'s hands flip out and flail everywhere!")) affected_mob.drop_all_held_items() - ..() - affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, (rand(5, 10) / 10) * REM * seconds_per_tick, required_organtype = affected_organtype) - . = TRUE + var/need_mob_update + need_mob_update = affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, (rand(5, 10) / 10) * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/drug/bath_salts name = "Bath Salts" @@ -211,35 +218,38 @@ ph = 8.2 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/drug/bath_salts/on_mob_metabolize(mob/living/L) - ..() - L.add_traits(list(TRAIT_STUNIMMUNE, TRAIT_SLEEPIMMUNE), type) - if(iscarbon(L)) - var/mob/living/carbon/C = L +/datum/reagent/drug/bath_salts/on_mob_metabolize(mob/living/affected_mob) + . = ..() + affected_mob.add_traits(list(TRAIT_STUNIMMUNE, TRAIT_SLEEPIMMUNE), type) + if(iscarbon(affected_mob)) + var/mob/living/carbon/carbon_mob = affected_mob rage = new() - C.gain_trauma(rage, TRAUMA_RESILIENCE_ABSOLUTE) + carbon_mob.gain_trauma(rage, TRAUMA_RESILIENCE_ABSOLUTE) -/datum/reagent/drug/bath_salts/on_mob_end_metabolize(mob/living/L) - L.remove_traits(list(TRAIT_STUNIMMUNE, TRAIT_SLEEPIMMUNE), type) +/datum/reagent/drug/bath_salts/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() + affected_mob.remove_traits(list(TRAIT_STUNIMMUNE, TRAIT_SLEEPIMMUNE), type) if(rage) QDEL_NULL(rage) - ..() /datum/reagent/drug/bath_salts/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.") if(SPT_PROB(2.5, seconds_per_tick)) to_chat(affected_mob, span_notice("[high_message]")) affected_mob.add_mood_event("salted", /datum/mood_event/stimulant_heavy, name) - affected_mob.adjustStaminaLoss(-5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 4 * REM * seconds_per_tick, required_organtype = affected_organtype) + var/need_mob_update + need_mob_update = affected_mob.adjustStaminaLoss(-5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 4 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) affected_mob.adjust_hallucinations(10 SECONDS * REM * seconds_per_tick) + if(need_mob_update) + . = UPDATE_MOB_HEALTH if(!HAS_TRAIT(affected_mob, TRAIT_IMMOBILIZED) && !ismovable(affected_mob.loc)) step(affected_mob, pick(GLOB.cardinals)) step(affected_mob, pick(GLOB.cardinals)) - ..() - . = TRUE /datum/reagent/drug/bath_salts/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_hallucinations(10 SECONDS * REM * seconds_per_tick) if(!HAS_TRAIT(affected_mob, TRAIT_IMMOBILIZED) && !ismovable(affected_mob.loc)) for(var/i in 1 to round(8 * REM * seconds_per_tick, 1)) @@ -248,7 +258,6 @@ affected_mob.emote(pick("twitch","drool","moan")) if(SPT_PROB(28, seconds_per_tick)) affected_mob.drop_all_held_items() - ..() /datum/reagent/drug/aranesp name = "Aranesp" @@ -259,16 +268,18 @@ addiction_types = list(/datum/addiction/stimulants = 8) /datum/reagent/drug/aranesp/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.") if(SPT_PROB(2.5, seconds_per_tick)) to_chat(affected_mob, span_notice("[high_message]")) - affected_mob.adjustStaminaLoss(-18 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustToxLoss(0.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + var/need_mob_update + need_mob_update = affected_mob.adjustStaminaLoss(-18 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustToxLoss(0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) if(SPT_PROB(30, seconds_per_tick)) affected_mob.losebreath++ - affected_mob.adjustOxyLoss(1, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - ..() - . = TRUE + need_mob_update += affected_mob.adjustOxyLoss(1, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/drug/happiness name = "Happiness" @@ -280,25 +291,26 @@ 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) - L.add_mood_event("happiness_drug", /datum/mood_event/happiness_drug) +/datum/reagent/drug/happiness/on_mob_metabolize(mob/living/affected_mob) + . = ..() + ADD_TRAIT(affected_mob, TRAIT_FEARLESS, type) + affected_mob.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) - L.clear_mood_event("happiness_drug") - ..() +/datum/reagent/drug/happiness/on_mob_delete(mob/living/affected_mob) + . = ..() + REMOVE_TRAIT(affected_mob, TRAIT_FEARLESS, type) + affected_mob.clear_mood_event("happiness_drug") /datum/reagent/drug/happiness/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.remove_status_effect(/datum/status_effect/jitter) affected_mob.remove_status_effect(/datum/status_effect/confusion) affected_mob.disgust = 0 - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.2 * REM * seconds_per_tick, required_organtype = affected_organtype) - ..() - . = TRUE + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.2 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + return UPDATE_MOB_HEALTH /datum/reagent/drug/happiness/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(16, seconds_per_tick)) var/reaction = rand(1,3) switch(reaction) @@ -311,9 +323,8 @@ if(3) affected_mob.emote("frown") affected_mob.add_mood_event("happiness_drug", /datum/mood_event/happiness_drug_bad_od) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5 * REM * seconds_per_tick, required_organtype = affected_organtype) - ..() - . = TRUE + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + return UPDATE_MOB_HEALTH /datum/reagent/drug/pumpup name = "Pump-Up" @@ -325,53 +336,63 @@ 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/carbon/L) - ..() - ADD_TRAIT(L, TRAIT_BATON_RESISTANCE, type) - var/obj/item/organ/internal/liver/liver = L.get_organ_slot(ORGAN_SLOT_LIVER) - if(HAS_TRAIT(liver, TRAIT_MAINTENANCE_METABOLISM)) - L.add_mood_event("maintenance_fun", /datum/mood_event/maintenance_high) +/datum/reagent/drug/pumpup/on_mob_metabolize(mob/living/carbon/affected_mob) + . = ..() + ADD_TRAIT(affected_mob, TRAIT_BATON_RESISTANCE, type) + var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) + if(liver && HAS_TRAIT(liver, TRAIT_MAINTENANCE_METABOLISM)) + affected_mob.add_mood_event("maintenance_fun", /datum/mood_event/maintenance_high) metabolization_rate *= 0.8 -/datum/reagent/drug/pumpup/on_mob_end_metabolize(mob/living/L) - REMOVE_TRAIT(L, TRAIT_BATON_RESISTANCE, type) - ..() +/datum/reagent/drug/pumpup/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() + REMOVE_TRAIT(affected_mob, TRAIT_BATON_RESISTANCE, type) /datum/reagent/drug/pumpup/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) if(SPT_PROB(2.5, seconds_per_tick)) to_chat(affected_mob, span_notice("[pick("Go! Go! GO!", "You feel ready...", "You feel invincible...")]")) if(SPT_PROB(7.5, seconds_per_tick)) affected_mob.losebreath++ - affected_mob.adjustToxLoss(2, FALSE, required_biotype = affected_biotype) - ..() - . = TRUE + affected_mob.adjustToxLoss(2, updating_health = FALSE, required_biotype = affected_biotype) + return UPDATE_MOB_HEALTH /datum/reagent/drug/pumpup/overdose_start(mob/living/affected_mob) + . = ..() to_chat(affected_mob, span_userdanger("You can't stop shaking, your heart beats faster and faster...")) /datum/reagent/drug/pumpup/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) + var/need_mob_update if(SPT_PROB(2.5, seconds_per_tick)) affected_mob.drop_all_held_items() if(SPT_PROB(7.5, seconds_per_tick)) affected_mob.emote(pick("twitch","drool")) if(SPT_PROB(10, seconds_per_tick)) affected_mob.losebreath++ - affected_mob.adjustStaminaLoss(4, FALSE, required_biotype = affected_biotype) + affected_mob.adjustStaminaLoss(4, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update = TRUE if(SPT_PROB(7.5, seconds_per_tick)) - affected_mob.adjustToxLoss(2, FALSE, required_biotype = affected_biotype) - ..() + need_mob_update += affected_mob.adjustToxLoss(2, updating_health = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/drug/maint name = "Maintenance Drugs" chemical_flags = NONE -/datum/reagent/drug/pumpup/on_mob_metabolize(mob/living/carbon/L) - var/obj/item/organ/internal/liver/liver = L.get_organ_slot(ORGAN_SLOT_LIVER) +/datum/reagent/drug/maint/on_mob_metabolize(mob/living/affected_mob) + . = ..() + if(!iscarbon(affected_mob)) + return + + var/mob/living/carbon/carbon_mob = affected_mob + var/obj/item/organ/internal/liver/liver = carbon_mob.get_organ_slot(ORGAN_SLOT_LIVER) if(HAS_TRAIT(liver, TRAIT_MAINTENANCE_METABOLISM)) - L.add_mood_event("maintenance_fun", /datum/mood_event/maintenance_high) + carbon_mob.add_mood_event("maintenance_fun", /datum/mood_event/maintenance_high) metabolization_rate *= 0.8 /datum/reagent/drug/maint/powder @@ -386,7 +407,7 @@ /datum/reagent/drug/maint/powder/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.1 * REM * seconds_per_tick, required_organtype = affected_organtype) + affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.1 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) // 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) affected_mob?.mind?.experience_multiplier_reasons |= type @@ -399,7 +420,8 @@ /datum/reagent/drug/maint/powder/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) . = ..() - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 6 * REM * seconds_per_tick, required_organtype = affected_organtype) + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 6 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + return UPDATE_MOB_HEALTH /datum/reagent/drug/maint/sludge name = "Maintenance Sludge" @@ -411,14 +433,14 @@ 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) - +/datum/reagent/drug/maint/sludge/on_mob_metabolize(mob/living/affected_mob) . = ..() - ADD_TRAIT(L,TRAIT_HARDLY_WOUNDED,type) + ADD_TRAIT(affected_mob,TRAIT_HARDLY_WOUNDED,type) /datum/reagent/drug/maint/sludge/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - affected_mob.adjustToxLoss(0.5 * REM * seconds_per_tick, required_biotype = affected_biotype) + if(affected_mob.adjustToxLoss(0.5 * REM * seconds_per_tick, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/drug/maint/sludge/on_mob_end_metabolize(mob/living/affected_mob) . = ..() @@ -430,10 +452,13 @@ return var/mob/living/carbon/carbie = affected_mob //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 * seconds_per_tick, required_biotype = affected_biotype) + var/need_mob_update + need_mob_update = carbie.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) if(SPT_PROB(5, seconds_per_tick)) - carbie.adjustToxLoss(5, required_biotype = affected_biotype) - carbie.vomit() + need_mob_update += carbie.adjustToxLoss(5, required_biotype = affected_biotype, updating_health = FALSE) + carbie.vomit(VOMIT_CATEGORY_DEFAULT) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/drug/maint/tar name = "Maintenance Tar" @@ -446,19 +471,21 @@ /datum/reagent/drug/maint/tar/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - affected_mob.AdjustStun(-10 * REM * seconds_per_tick) affected_mob.AdjustKnockdown(-10 * REM * seconds_per_tick) affected_mob.AdjustUnconscious(-10 * REM * seconds_per_tick) affected_mob.AdjustParalyzed(-10 * REM * seconds_per_tick) affected_mob.AdjustImmobilized(-10 * REM * seconds_per_tick) - affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5 * REM * seconds_per_tick, required_organtype = affected_organtype) + affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + return UPDATE_MOB_HEALTH /datum/reagent/drug/maint/tar/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) . = ..() - - affected_mob.adjustToxLoss(5 * REM * seconds_per_tick, required_biotype = affected_biotype) - affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 3 * REM * seconds_per_tick, required_organtype = affected_organtype) + var/need_update + need_update = affected_mob.adjustToxLoss(5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 3 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + if(need_update) + return UPDATE_MOB_HEALTH /datum/reagent/drug/mushroomhallucinogen name = "Mushroom Hallucinogen" @@ -472,21 +499,21 @@ addiction_types = list(/datum/addiction/hallucinogens = 12) /datum/reagent/drug/mushroomhallucinogen/on_mob_life(mob/living/carbon/psychonaut, seconds_per_tick, times_fired) + . = ..() psychonaut.set_slurring_if_lower(1 SECONDS * REM * seconds_per_tick) switch(current_cycle) - if(1 to 5) + if(2 to 6) if(SPT_PROB(5, seconds_per_tick)) psychonaut.emote(pick("twitch","giggle")) - if(5 to 10) + if(6 to 11) psychonaut.set_jitter_if_lower(20 SECONDS * REM * seconds_per_tick) if(SPT_PROB(10, seconds_per_tick)) psychonaut.emote(pick("twitch","giggle")) - if (10 to INFINITY) + if (11 to INFINITY) psychonaut.set_jitter_if_lower(40 SECONDS * REM * seconds_per_tick) if(SPT_PROB(16, seconds_per_tick)) psychonaut.emote(pick("twitch","giggle")) - ..() /datum/reagent/drug/mushroomhallucinogen/on_mob_metabolize(mob/living/psychonaut) . = ..() @@ -599,7 +626,8 @@ /datum/reagent/drug/blastoff/on_mob_life(mob/living/carbon/dancer, seconds_per_tick, times_fired) . = ..() - dancer.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.3 * REM * seconds_per_tick, required_organtype = affected_organtype) + if(dancer.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.3 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + . = UPDATE_MOB_HEALTH dancer.AdjustKnockdown(-20) if(SPT_PROB(BLASTOFF_DANCE_MOVE_CHANCE_PER_UNIT * volume, seconds_per_tick)) @@ -607,7 +635,8 @@ /datum/reagent/drug/blastoff/overdose_process(mob/living/dancer, seconds_per_tick, times_fired) . = ..() - dancer.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.3 * REM * seconds_per_tick, required_organtype = affected_organtype) + if(dancer.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.3 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + . = UPDATE_MOB_HEALTH if(SPT_PROB(BLASTOFF_DANCE_MOVE_CHANCE_PER_UNIT * volume, seconds_per_tick)) dancer.emote("spin") @@ -670,7 +699,8 @@ /datum/reagent/drug/saturnx/on_mob_life(mob/living/carbon/invisible_man, seconds_per_tick, times_fired) . = ..() - invisible_man.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.3 * REM * seconds_per_tick, required_organtype = affected_organtype) + if(invisible_man.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.3 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + return UPDATE_MOB_HEALTH /datum/reagent/drug/saturnx/on_mob_metabolize(mob/living/invisible_man) . = ..() @@ -711,16 +741,12 @@ return if(invisible_man.undergoing_liver_failure()) return - if(HAS_TRAIT(invisible_man, TRAIT_NOMETABOLISM)) + if(HAS_TRAIT(invisible_man, TRAIT_LIVERLESS_METABOLISM)) return if(invisible_man.has_status_effect(/datum/status_effect/grouped/stasis)) return - invisible_man.add_traits(list(TRAIT_INVISIBLE_MAN, TRAIT_HIDE_EXTERNAL_ORGANS), name) - - var/datum/dna/druggy_dna = invisible_man.has_dna() - if(druggy_dna?.species) - druggy_dna.species.species_traits += NOBLOODOVERLAY + invisible_man.add_traits(list(TRAIT_INVISIBLE_MAN, TRAIT_HIDE_EXTERNAL_ORGANS, TRAIT_NO_BLOOD_OVERLAY), type) invisible_man.update_body() invisible_man.remove_from_all_data_huds() @@ -728,16 +754,12 @@ /datum/reagent/drug/saturnx/on_mob_end_metabolize(mob/living/carbon/invisible_man) . = ..() - if(HAS_TRAIT(invisible_man, TRAIT_INVISIBLE_MAN)) + if(HAS_TRAIT_FROM(invisible_man, TRAIT_INVISIBLE_MAN, type)) invisible_man.add_to_all_human_data_huds() //Is this safe, what do you think, Floyd? - invisible_man.remove_traits(list(TRAIT_INVISIBLE_MAN, TRAIT_HIDE_EXTERNAL_ORGANS), name) + invisible_man.remove_traits(list(TRAIT_INVISIBLE_MAN, TRAIT_HIDE_EXTERNAL_ORGANS, TRAIT_NO_BLOOD_OVERLAY), type) to_chat(invisible_man, span_notice("As you sober up, opacity once again returns to your body meats.")) - var/datum/dna/druggy_dna = invisible_man.has_dna() - if(druggy_dna?.species) - druggy_dna.species.species_traits -= NOBLOODOVERLAY - invisible_man.update_body() invisible_man.sound_environment_override = NONE @@ -754,7 +776,8 @@ invisible_man.emote("giggle") if(SPT_PROB(5, seconds_per_tick)) invisible_man.emote("laugh") - invisible_man.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.4 * REM * seconds_per_tick, required_organtype = affected_organtype) + if(invisible_man.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.4 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + return UPDATE_MOB_HEALTH /datum/reagent/drug/saturnx/stable name = "Stabilized Saturn-X" @@ -776,27 +799,29 @@ 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.adjustStaminaLoss(-4 * trans_volume, 0) + if(druggo.adjustStaminaLoss(-4 * trans_volume, updating_stamina = FALSE)) + return UPDATE_MOB_HEALTH //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, seconds_per_tick, times_fired) - . = ..() + . = ..() || TRUE kronkaine_fiend.add_mood_event("tweaking", /datum/mood_event/stimulant_medium, name) - kronkaine_fiend.adjustOrganLoss(ORGAN_SLOT_HEART, 0.4 * REM * seconds_per_tick, required_organtype = affected_organtype) + if(kronkaine_fiend.adjustOrganLoss(ORGAN_SLOT_HEART, 0.4 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + . = UPDATE_MOB_HEALTH kronkaine_fiend.set_jitter_if_lower(20 SECONDS * REM * seconds_per_tick) kronkaine_fiend.AdjustSleeping(-20 * REM * seconds_per_tick) kronkaine_fiend.adjust_drowsiness(-10 SECONDS * REM * seconds_per_tick) @@ -809,7 +834,8 @@ /datum/reagent/drug/kronkaine/overdose_process(mob/living/kronkaine_fiend, seconds_per_tick, times_fired) . = ..() - kronkaine_fiend.adjustOrganLoss(ORGAN_SLOT_HEART, 1 * REM * seconds_per_tick, required_organtype = affected_organtype) + if(kronkaine_fiend.adjustOrganLoss(ORGAN_SLOT_HEART, 1 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + . = UPDATE_MOB_HEALTH kronkaine_fiend.set_jitter_if_lower(20 SECONDS * REM * seconds_per_tick) if(SPT_PROB(10, seconds_per_tick)) 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."))) @@ -823,9 +849,10 @@ chemical_flags = NONE /datum/reagent/drug/kronkaine/gore/overdose_start(mob/living/gored) + . = ..() gored.visible_message( span_danger("[gored] explodes in a shower of gore!"), span_userdanger("GORE! GORE! GORE! YOU'RE GORE! TOO MUCH GORE! YOU'RE GORE! GORE! IT'S OVER! GORE! GORE! YOU'RE GORE! TOO MUCH G-"), ) new /obj/structure/bouncy_castle(gored.loc, gored) - gored.gib(TRUE, TRUE, TRUE) //no brain, no organs, no bodyparts + gored.gib() diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 5c8a740fd6d5a..00f5018447844 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -13,26 +13,30 @@ taste_mult = 4 inverse_chem_val = 0.1 inverse_chem = null + creation_purity = 0.5 // 50% pure by default. Below - synthetic food. Above - natural food. /// How much nutrition this reagent supplies - var/nutriment_factor = 1 * REAGENTS_METABOLISM + var/nutriment_factor = 1 /// affects mood, typically higher for mixed drinks with more complex recipes' var/quality = 0 -/datum/reagent/consumable/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) +/datum/reagent/consumable/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, 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 * seconds_per_tick) + if(ishuman(affected_mob)) + var/mob/living/carbon/human/affected_human = affected_mob + if(!HAS_TRAIT(affected_human, TRAIT_NOHUNGER)) + affected_human.adjust_nutrition(get_nutriment_factor() * REM * seconds_per_tick) if(length(reagent_removal_skip_list)) return - holder.remove_reagent(type, metabolization_rate * seconds_per_tick) + if(holder) + holder.remove_reagent(type, metabolization_rate * seconds_per_tick) /datum/reagent/consumable/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() if(!(methods & INGEST) || !quality || HAS_TRAIT(exposed_mob, TRAIT_AGEUSIA)) return switch(quality) + if (DRINK_REVOLTING) + exposed_mob.add_mood_event("quality_drink", /datum/mood_event/quality_revolting) if (DRINK_NICE) exposed_mob.add_mood_event("quality_drink", /datum/mood_event/quality_nice) if (DRINK_GOOD) @@ -49,13 +53,16 @@ if(isitem(the_real_food) && !is_reagent_container(the_real_food)) exposed_mob.add_mob_memory(/datum/memory/good_food, food = the_real_food) +/datum/reagent/consumable/proc/get_nutriment_factor() + return nutriment_factor * REAGENTS_METABOLISM * (purity * 2) + /datum/reagent/consumable/nutriment name = "Nutriment" description = "All the vitamins, minerals, and carbohydrates the body needs in pure form." reagent_state = SOLID - nutriment_factor = 15 * REAGENTS_METABOLISM + nutriment_factor = 15 color = "#664330" // rgb: 102, 67, 48 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_DEAD_PROCESS var/brute_heal = 1 var/burn_heal = 0 @@ -63,11 +70,11 @@ /datum/reagent/consumable/nutriment/on_hydroponics_apply(obj/machinery/hydroponics/mytray, mob/user) mytray.adjust_plant_health(round(volume * 0.2)) -/datum/reagent/consumable/nutriment/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) +/datum/reagent/consumable/nutriment/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(30, seconds_per_tick)) - M.heal_bodypart_damage(brute = brute_heal, burn = burn_heal, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) - . = TRUE - ..() + if(affected_mob.heal_bodypart_damage(brute = brute_heal * REM * seconds_per_tick, burn = burn_heal * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/nutriment/on_new(list/supplied_data) . = ..() @@ -118,76 +125,31 @@ brute_heal = 1 burn_heal = 1 -/datum/reagent/consumable/nutriment/vitamin/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) - if(M.satiety < MAX_SATIETY) - M.satiety += 30 * REM * seconds_per_tick +/datum/reagent/consumable/nutriment/vitamin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() + if(affected_mob.satiety < MAX_SATIETY) + affected_mob.satiety += 30 * REM * seconds_per_tick /// The basic resource of vat growing. /datum/reagent/consumable/nutriment/protein name = "Protein" 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/nutriment/cloth_fibers - name = "Cloth Fibers" - description = "It's not actually a form of nutriment but it does keep Mothpeople going for a short while..." - nutriment_factor = 30 * REAGENTS_METABOLISM + nutriment_factor = 9 //45% as calorie dense as oil. chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - brute_heal = 0 - burn_heal = 0 - ///Amount of satiety that will be drained when the cloth_fibers is fully metabolized - var/delayed_satiety_drain = 2 * CLOTHING_NUTRITION_GAIN -/datum/reagent/consumable/nutriment/cloth_fibers/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) - if(M.satiety < MAX_SATIETY) - M.adjust_nutrition(CLOTHING_NUTRITION_GAIN) - delayed_satiety_drain += CLOTHING_NUTRITION_GAIN - return ..() - -/datum/reagent/consumable/nutriment/cloth_fibers/on_mob_delete(mob/living/carbon/M) - M.adjust_nutrition(-delayed_satiety_drain) - return ..() - -/datum/reagent/consumable/nutriment/mineral - name = "Mineral Slurry" - description = "Minerals pounded into a paste, nutritious only if you too are made of rocks." - color = COLOR_WEBSAFE_DARK_GRAY - chemical_flags = NONE +/datum/reagent/consumable/nutriment/fat + name = "Fat" + description = "Triglycerides found in vegetable oils and fatty animal tissue." + color = "#f0eed7" + taste_description = "lard" brute_heal = 0 - burn_heal = 0 - -/datum/reagent/consumable/nutriment/mineral/on_mob_life(mob/living/carbon/eater, delta_time, times_fired) - current_cycle++ - if (HAS_TRAIT(eater, TRAIT_ROCK_EATER) && !HAS_TRAIT(eater, TRAIT_NOHUNGER) && ishuman(eater)) - var/mob/living/carbon/human/golem_eater = eater - golem_eater.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/cooking_oil - name = "Cooking Oil" - description = "A variety of cooking oil derived from fat or plants. Used in food preparation and frying." - color = "#EADD6B" //RGB: 234, 221, 107 (based off of canola oil) - taste_mult = 0.8 - taste_description = "oil" - nutriment_factor = 7 * REAGENTS_METABOLISM //Not very healthy on its own - metabolization_rate = 10 * REAGENTS_METABOLISM - penetrates_skin = NONE - var/fry_temperature = 450 //Around ~350 F (117 C) which deep fryers operate around in the real world + burn_heal = 1 + nutriment_factor = 18 // Twice as nutritious compared to protein and carbohydrates chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - default_container = /obj/item/reagent_containers/condiment/cooking_oil + var/fry_temperature = 450 //Around ~350 F (117 C) which deep fryers operate around in the real world -/datum/reagent/consumable/cooking_oil/expose_obj(obj/exposed_obj, reac_volume) +/datum/reagent/consumable/nutriment/fat/expose_obj(obj/exposed_obj, reac_volume) . = ..() if(!holder || (holder.chem_temp <= fry_temperature)) return @@ -202,17 +164,17 @@ exposed_obj.visible_message(span_warning("[exposed_obj] rapidly fries as it's splashed with hot oil! Somehow.")) exposed_obj.AddElement(/datum/element/fried_item, volume) - exposed_obj.reagents.add_reagent(/datum/reagent/consumable/cooking_oil, reac_volume) + exposed_obj.reagents.add_reagent(src.type, 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/nutriment/fat/expose_mob(mob/living/exposed_mob, methods = TOUCH, reac_volume, show_message = TRUE, touch_protection = 0) . = ..() if(!(methods & (VAPOR|TOUCH)) || isnull(holder) || (holder.chem_temp < fry_temperature)) //Directly coats the mob, and doesn't go into their bloodstream return - var/oil_damage = ((holder.chem_temp / fry_temperature) * 0.33) //Damage taken per unit + var/burn_damage = ((holder.chem_temp / fry_temperature) * 0.33) //Damage taken per unit if(methods & TOUCH) - oil_damage *= max(1 - touch_protection, 0) - var/FryLoss = round(min(38, oil_damage * reac_volume)) + burn_damage *= max(1 - touch_protection, 0) + var/FryLoss = round(min(38, burn_damage * reac_volume)) if(!HAS_TRAIT(exposed_mob, TRAIT_OIL_FRIED)) exposed_mob.visible_message(span_warning("The boiling oil sizzles as it covers [exposed_mob]!"), \ span_userdanger("You're covered in boiling oil!")) @@ -224,14 +186,86 @@ if(FryLoss) exposed_mob.adjustFireLoss(FryLoss) -/datum/reagent/consumable/cooking_oil/expose_turf(turf/open/exposed_turf, reac_volume) +/datum/reagent/consumable/nutriment/fat/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 = (locate(/obj/effect/hotspot) in exposed_turf) + if(hotspot) + var/datum/gas_mixture/lowertemp = exposed_turf.remove_air(exposed_turf.air.total_moles()) + lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0) + lowertemp.react(src) + exposed_turf.assume_air(lowertemp) + qdel(hotspot) + +/datum/reagent/consumable/nutriment/fat/oil + name = "Vegetable Oil" + description = "A variety of cooking oil derived from plant fats. Used in food preparation and frying." + color = "#EADD6B" //RGB: 234, 221, 107 (based off of canola oil) + taste_mult = 0.8 + taste_description = "oil" + nutriment_factor = 7 //Not very healthy on its own + metabolization_rate = 10 * REAGENTS_METABOLISM + penetrates_skin = NONE + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + default_container = /obj/item/reagent_containers/condiment/vegetable_oil + +/datum/reagent/consumable/nutriment/fat/oil/olive + name = "Olive Oil" + description = "A high quality oil, suitable for dishes where the oil is a key flavour." + taste_description = "olive oil" + color = "#DBCF5C" + nutriment_factor = 10 + default_container = /obj/item/reagent_containers/condiment/olive_oil + +/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/nutriment/cloth_fibers + name = "Cloth Fibers" + description = "It's not actually a form of nutriment but it does keep Mothpeople going for a short while..." + nutriment_factor = 30 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + brute_heal = 0 + burn_heal = 0 + ///Amount of satiety that will be drained when the cloth_fibers is fully metabolized + var/delayed_satiety_drain = 2 * CLOTHING_NUTRITION_GAIN + +/datum/reagent/consumable/nutriment/cloth_fibers/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(affected_mob.satiety < MAX_SATIETY) + affected_mob.adjust_nutrition(CLOTHING_NUTRITION_GAIN) + delayed_satiety_drain += CLOTHING_NUTRITION_GAIN + +/datum/reagent/consumable/nutriment/cloth_fibers/on_mob_delete(mob/living/carbon/affected_mob) . = ..() - if(!istype(exposed_turf) || isgroundlessturf(exposed_turf) || (reac_volume < 5)) + if(!iscarbon(affected_mob)) return - exposed_turf.MakeSlippery(TURF_WET_LUBE, min_wet_time = 10 SECONDS, wet_time_to_add = reac_volume * 1.5 SECONDS) - exposed_turf.name = "Deep-fried [initial(exposed_turf.name)]" - exposed_turf.add_atom_colour(color, TEMPORARY_COLOUR_PRIORITY) + var/mob/living/carbon/carbon_mob = affected_mob + carbon_mob.adjust_nutrition(-delayed_satiety_drain) + +/datum/reagent/consumable/nutriment/mineral + name = "Mineral Slurry" + description = "Minerals pounded into a paste, nutritious only if you too are made of rocks." + color = COLOR_WEBSAFE_DARK_GRAY + chemical_flags = NONE + brute_heal = 0 + burn_heal = 0 + +/datum/reagent/consumable/nutriment/mineral/on_mob_life(mob/living/carbon/eater, seconds_per_tick, times_fired) + if(HAS_TRAIT(eater, TRAIT_ROCK_EATER)) // allow mobs who can eat rocks to do so + return ..() + else // otherwise just let them pass through the system + current_cycle++ + if(length(reagent_removal_skip_list)) + return + if(holder) + holder.remove_reagent(type, metabolization_rate * seconds_per_tick) /datum/reagent/consumable/sugar name = "Sugar" @@ -239,9 +273,10 @@ reagent_state = SOLID color = "#FFFFFF" // rgb: 255, 255, 255 taste_mult = 1.5 // stop sugar drowning out other flavours - nutriment_factor = 10 * REAGENTS_METABOLISM - metabolization_rate = 2 * REAGENTS_METABOLISM - overdose_threshold = 200 // Hyperglycaemic shock + nutriment_factor = 2 + metabolization_rate = 5 * REAGENTS_METABOLISM + creation_purity = 1 // impure base reagents are a big no-no + overdose_threshold = 120 // Hyperglycaemic shock taste_description = "sweetness" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED default_container = /obj/item/reagent_containers/condiment/sugar @@ -251,20 +286,19 @@ 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) - . = TRUE +/datum/reagent/consumable/sugar/overdose_start(mob/living/affected_mob) + . = ..() + to_chat(affected_mob, span_userdanger("You go into hyperglycemic shock! Lay off the twinkies!")) + affected_mob.AdjustSleeping(20 SECONDS) -/datum/reagent/consumable/sugar/overdose_process(mob/living/M, seconds_per_tick, times_fired) - M.AdjustSleeping(40 * REM * seconds_per_tick) - ..() - . = TRUE +/datum/reagent/consumable/sugar/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_drowsiness_up_to((5 SECONDS * REM * seconds_per_tick), 60 SECONDS) /datum/reagent/consumable/virus_food name = "Virus Food" description = "A mixture of water and milk. Virus cells can use this mixture to reproduce." - nutriment_factor = 2 * REAGENTS_METABOLISM + nutriment_factor = 2 color = "#899613" // rgb: 137, 150, 19 taste_description = "watery milk" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -276,7 +310,7 @@ /datum/reagent/consumable/soysauce name = "Soysauce" description = "A salty sauce made from the soy plant." - nutriment_factor = 2 * REAGENTS_METABOLISM + nutriment_factor = 2 color = "#792300" // rgb: 121, 35, 0 taste_description = "umami" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -285,7 +319,7 @@ /datum/reagent/consumable/ketchup name = "Ketchup" description = "Ketchup, catsup, whatever. It's tomato paste." - nutriment_factor = 5 * REAGENTS_METABOLISM + nutriment_factor = 5 color = "#731008" // rgb: 115, 16, 8 taste_description = "ketchup" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -299,29 +333,29 @@ taste_mult = 1.5 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/capsaicin/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) +/datum/reagent/consumable/capsaicin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) 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 * seconds_per_tick) - if(isslime(M)) + if(isslime(affected_mob)) heating = rand(5, 20) if(15 to 25) heating = 10 - if(isslime(M)) + if(isslime(affected_mob)) heating = rand(10, 20) if(25 to 35) heating = 15 - if(isslime(M)) + if(isslime(affected_mob)) heating = rand(15, 20) if(35 to INFINITY) heating = 20 - if(isslime(M)) + if(isslime(affected_mob)) heating = rand(20, 25) - M.adjust_bodytemperature(heating * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick) - ..() + affected_mob.adjust_bodytemperature(heating * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick) + return ..() /datum/reagent/consumable/frostoil name = "Frost Oil" @@ -334,33 +368,33 @@ specific_heat = 40 default_container = /obj/item/reagent_containers/cup/bottle/frostoil -/datum/reagent/consumable/frostoil/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) +/datum/reagent/consumable/frostoil/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) 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 * seconds_per_tick) - if(isslime(M)) + if(isslime(affected_mob)) cooling = -rand(5, 20) if(15 to 25) cooling = -20 - if(isslime(M)) + if(isslime(affected_mob)) cooling = -rand(10, 20) if(25 to 35) cooling = -30 if(prob(1)) - M.emote("shiver") - if(isslime(M)) + affected_mob.emote("shiver") + if(isslime(affected_mob)) cooling = -rand(15, 20) if(35 to INFINITY) cooling = -40 if(prob(5)) - M.emote("shiver") - if(isslime(M)) + affected_mob.emote("shiver") + if(isslime(affected_mob)) cooling = -rand(20, 25) - M.adjust_bodytemperature(cooling * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick, 50) - ..() + affected_mob.adjust_bodytemperature(cooling * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick, 50) + return ..() /datum/reagent/consumable/frostoil/expose_turf(turf/exposed_turf, reac_volume) . = ..() @@ -388,7 +422,6 @@ default_container = /obj/item/reagent_containers/cup/bottle/capsaicin /datum/reagent/consumable/condensedcapsaicin/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) - . = ..() if(!ishuman(exposed_mob)) return @@ -416,13 +449,14 @@ if(prob(10)) victim.set_dizzy_if_lower(2 SECONDS) if(prob(5)) - victim.vomit() + victim.vomit(VOMIT_CATEGORY_DEFAULT) + return ..() -/datum/reagent/consumable/condensedcapsaicin/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) +/datum/reagent/consumable/condensedcapsaicin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) if(!holder.has_reagent(/datum/reagent/consumable/milk)) if(SPT_PROB(5, seconds_per_tick)) - M.visible_message(span_warning("[M] [pick("dry heaves!","coughs!","splutters!")]")) - ..() + affected_mob.visible_message(span_warning("[affected_mob] [pick("dry heaves!","coughs!","splutters!")]")) + return ..() /datum/reagent/consumable/salt name = "Table Salt" @@ -438,8 +472,40 @@ . = ..() if(!istype(exposed_turf) || (reac_volume < 1)) return + exposed_turf.spawn_unique_cleanable(/obj/effect/decal/cleanable/food/salt) - new/obj/effect/decal/cleanable/food/salt(exposed_turf) +/datum/reagent/consumable/salt/expose_mob(mob/living/exposed_mob, methods, reac_volume) + . = ..() + var/mob/living/carbon/carbies = exposed_mob + if(!(methods & (PATCH|TOUCH|VAPOR))) + return + for(var/datum/wound/iter_wound as anything in carbies.all_wounds) + iter_wound.on_salt(reac_volume, carbies) + +// Salt can help with wounds by soaking up fluid, but undiluted salt will also cause irritation from the loose crystals, and it might soak up the body's water as well! +// A saltwater mixture would be best, but we're making improvised chems here, not real ones. +/datum/wound/proc/on_salt(reac_volume, mob/living/carbon/carbies) + return + +/datum/wound/pierce/bleed/on_salt(reac_volume, mob/living/carbon/carbies) + adjust_blood_flow(-0.06 * reac_volume, initial_flow * 0.6) // 20u of a salt shacker * 0.1 = -1.6~ blood flow, but is always clamped to, at best, third blood loss from that wound. + // Crystal irritation worsening recovery. + gauzed_clot_rate *= 0.65 + to_chat(carbies, span_notice("The salt bits seep in and stick to [lowertext(src)], painfully irritating the skin but soaking up most of the blood.")) + +/datum/wound/slash/flesh/on_salt(reac_volume, mob/living/carbon/carbies) + adjust_blood_flow(-0.1 * reac_volume, initial_flow * 0.5) // 20u of a salt shacker * 0.1 = -2~ blood flow, but is always clamped to, at best, halve blood loss from that wound. + // Crystal irritation worsening recovery. + clot_rate *= 0.75 + to_chat(carbies, span_notice("The salt bits seep in and stick to [lowertext(src)], painfully irritating the skin but soaking up most of the blood.")) + +/datum/wound/burn/flesh/on_salt(reac_volume) + // Slightly sanitizes and disinfects, but also increases infestation rate (some bacteria are aided by salt), and decreases flesh healing (can damage the skin from moisture absorption) + sanitization += VALUE_PER(0.4, 30) * reac_volume + infestation -= max(VALUE_PER(0.3, 30) * reac_volume, 0) + infestation_rate += VALUE_PER(0.12, 30) * reac_volume + flesh_healing -= max(VALUE_PER(5, 30) * reac_volume, 0) + to_chat(victim, span_notice("The salt bits seep in and stick to [lowertext(src)], painfully irritating the skin! After a few moments, it feels marginally better.")) /datum/reagent/consumable/blackpepper name = "Black Pepper" @@ -454,7 +520,7 @@ name = "Coco Powder" description = "A fatty, bitter paste made from coco beans." reagent_state = SOLID - nutriment_factor = 5 * REAGENTS_METABOLISM + nutriment_factor = 5 color = "#302000" // rgb: 48, 32, 0 taste_description = "bitterness" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -467,27 +533,27 @@ metabolization_rate = 0.15 * REAGENTS_METABOLISM chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/garlic/on_mob_add(mob/living/L, amount) +/datum/reagent/consumable/garlic/on_mob_add(mob/living/affected_mob, amount) + . = ..() + ADD_TRAIT(affected_mob, TRAIT_GARLIC_BREATH, type) + +/datum/reagent/consumable/garlic/on_mob_delete(mob/living/affected_mob) . = ..() - ADD_TRAIT(L, TRAIT_GARLIC_BREATH, type) + REMOVE_TRAIT(affected_mob, TRAIT_GARLIC_BREATH, type) -/datum/reagent/consumable/garlic/on_mob_delete(mob/living/L) +/datum/reagent/consumable/garlic/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - REMOVE_TRAIT(L, TRAIT_GARLIC_BREATH, type) - -/datum/reagent/consumable/garlic/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) - if(isvampire(M)) //incapacitating but not lethal. Unfortunately, vampires cannot vomit. - if(SPT_PROB(min(current_cycle/2, 12.5), seconds_per_tick)) - 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_jitter_if_lower(20 SECONDS) + if(isvampire(affected_mob)) //incapacitating but not lethal. Unfortunately, vampires cannot vomit. + if(SPT_PROB(min((current_cycle-1)/2, 12.5), seconds_per_tick)) + to_chat(affected_mob, span_danger("You can't get the scent of garlic out of your nose! You can barely think...")) + affected_mob.Paralyze(10) + affected_mob.set_jitter_if_lower(20 SECONDS) else - var/obj/item/organ/internal/liver/liver = M.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) if(liver && HAS_TRAIT(liver, TRAIT_CULINARY_METABOLISM)) if(SPT_PROB(10, seconds_per_tick)) //stays in the system much longer than sprinkles/banana juice, so heals slower to partially compensate - M.heal_bodypart_damage(brute = 1, burn = 1) - . = TRUE - ..() + if(affected_mob.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/tearjuice name = "Tear Juice" @@ -516,34 +582,12 @@ taste_description = "childhood whimsy" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/sprinkles/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) - var/obj/item/organ/internal/liver/liver = M.get_organ_slot(ORGAN_SLOT_LIVER) - if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) - M.heal_bodypart_damage(1 * REM * seconds_per_tick, 1 * REM * seconds_per_tick, 0) - . = TRUE - ..() - -/datum/reagent/consumable/cornoil - name = "Corn Oil" - description = "An oil derived from various types of corn." - nutriment_factor = 20 * REAGENTS_METABOLISM - color = "#302000" // rgb: 48, 32, 0 - taste_description = "slime" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - default_container = /obj/item/reagent_containers/condiment/cooking_oil - -/datum/reagent/consumable/cornoil/expose_turf(turf/open/exposed_turf, reac_volume) +/datum/reagent/consumable/sprinkles/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - 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 = (locate(/obj/effect/hotspot) in exposed_turf) - if(hotspot) - var/datum/gas_mixture/lowertemp = exposed_turf.remove_air(exposed_turf.air.total_moles()) - lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0) - lowertemp.react(src) - exposed_turf.assume_air(lowertemp) - qdel(hotspot) + var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) + if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) + if(affected_mob.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/enzyme name = "Universal Enzyme" @@ -565,7 +609,7 @@ /datum/reagent/consumable/hot_ramen name = "Hot Ramen" description = "The noodles are boiled, the flavors are artificial, just like being back in school." - nutriment_factor = 5 * REAGENTS_METABOLISM + nutriment_factor = 5 color = "#302000" // rgb: 48, 32, 0 taste_description = "wet and cheap noodles" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -574,26 +618,26 @@ /datum/reagent/consumable/nutraslop name = "Nutraslop" description = "Mixture of leftover prison foods served on previous days." - nutriment_factor = 5 * REAGENTS_METABOLISM + nutriment_factor = 5 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, seconds_per_tick, times_fired) - M.adjust_bodytemperature(10 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick, 0, M.get_body_temp_normal()) - ..() +/datum/reagent/consumable/hot_ramen/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_bodytemperature(10 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick, 0, affected_mob.get_body_temp_normal()) /datum/reagent/consumable/hell_ramen name = "Hell Ramen" description = "The noodles are boiled, the flavors are artificial, just like being back in school." - nutriment_factor = 5 * REAGENTS_METABOLISM + nutriment_factor = 5 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, seconds_per_tick, times_fired) - target_mob.adjust_bodytemperature(10 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick) - ..() +/datum/reagent/consumable/hell_ramen/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_bodytemperature(10 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick) /datum/reagent/consumable/flour name = "Flour" @@ -601,23 +645,51 @@ reagent_state = SOLID color = "#FFFFFF" // rgb: 0, 0, 0 taste_description = "chalky wheat" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_AFFECTS_WOUNDS default_container = /obj/item/reagent_containers/condiment/flour +/datum/reagent/consumable/flour/expose_mob(mob/living/exposed_mob, methods, reac_volume) + . = ..() + var/mob/living/carbon/carbies = exposed_mob + if(!(methods & (PATCH|TOUCH|VAPOR))) + return + for(var/datum/wound/iter_wound as anything in carbies.all_wounds) + iter_wound.on_flour(reac_volume, carbies) + +/datum/wound/proc/on_flour(reac_volume, mob/living/carbon/carbies) + return + +/datum/wound/pierce/bleed/on_flour(reac_volume, mob/living/carbon/carbies) + adjust_blood_flow(-0.015 * reac_volume) // 30u of a flour sack * 0.015 = -0.45~ blood flow, prettay good + to_chat(carbies, span_notice("The flour seeps into [lowertext(src)], painfully drying it up and absorbing some of the blood.")) + // When some nerd adds infection for wounds, make this increase the infection + +/datum/wound/slash/flesh/on_flour(reac_volume, mob/living/carbon/carbies) + adjust_blood_flow(-0.04 * reac_volume) // 30u of a flour sack * 0.04 = -1.25~ blood flow, pretty good! + to_chat(carbies, span_notice("The flour seeps into [lowertext(src)], painfully drying some of it up and absorbing a little blood.")) + // When some nerd adds infection for wounds, make this increase the infection + +// Don't pour flour onto burn wounds, it increases infection risk! Very unwise. Backed up by REAL info from REAL professionals. +// https://www.reuters.com/article/uk-factcheck-flour-burn-idUSKCN26F2N3 +/datum/wound/burn/flesh/on_flour(reac_volume) + to_chat(victim, span_notice("The flour seeps into [lowertext(src)], spiking you with intense pain! That probably wasn't a good idea...")) + sanitization -= min(0, 1) + infestation += 0.2 + return + /datum/reagent/consumable/flour/expose_turf(turf/exposed_turf, reac_volume) . = ..() if(isspaceturf(exposed_turf)) return - var/obj/effect/decal/cleanable/food/flour/reagentdecal = new(exposed_turf) - reagentdecal = locate() in exposed_turf //Might have merged with flour already there. - if(reagentdecal) - reagentdecal.reagents.add_reagent(/datum/reagent/consumable/flour, reac_volume) + var/obj/effect/decal/cleanable/food/flour/flour_decal = exposed_turf.spawn_unique_cleanable(/obj/effect/decal/cleanable/food/flour) + if(flour_decal) + flour_decal.reagents.add_reagent(/datum/reagent/consumable/flour, reac_volume) /datum/reagent/consumable/cherryjelly name = "Cherry Jelly" description = "Totally the best. Only to be spread on foods with excellent lateral symmetry." - nutriment_factor = 10 * REAGENTS_METABOLISM + nutriment_factor = 10 color = "#801E28" // rgb: 128, 30, 40 taste_description = "cherry" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -633,17 +705,25 @@ name = "Rice" description = "tiny nutritious grains" reagent_state = SOLID - nutriment_factor = 3 * REAGENTS_METABOLISM + nutriment_factor = 3 color = "#FFFFFF" // rgb: 0, 0, 0 taste_description = "rice" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED default_container = /obj/item/reagent_containers/condiment/rice +/datum/reagent/consumable/rice_flour + name = "Rice Flour" + description = "Flour mixed with Rice" + reagent_state = SOLID + color = "#FFFFFF" // rgb: 0, 0, 0 + taste_description = "chalky wheat with rice" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/vanilla name = "Vanilla Powder" description = "A fatty, bitter paste made from vanilla pods." reagent_state = SOLID - nutriment_factor = 5 * REAGENTS_METABOLISM + nutriment_factor = 5 color = "#FFFACD" taste_description = "vanilla" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -651,7 +731,7 @@ /datum/reagent/consumable/eggyolk name = "Egg Yolk" description = "It's full of protein." - nutriment_factor = 4 * REAGENTS_METABOLISM + nutriment_factor = 8 color = "#FFB500" taste_description = "egg" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -659,7 +739,7 @@ /datum/reagent/consumable/eggwhite name = "Egg White" description = "It's full of even more protein." - nutriment_factor = 1.5 * REAGENTS_METABOLISM + nutriment_factor = 4 color = "#fffdf7" taste_description = "bland egg" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -669,6 +749,37 @@ description = "A slippery solution." color = "#DBCE95" taste_description = "slime" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_AFFECTS_WOUNDS + +// Starch has similar absorbing properties to flour (Stronger here because it's rarer) +/datum/reagent/consumable/corn_starch/expose_mob(mob/living/exposed_mob, methods, reac_volume) + . = ..() + var/mob/living/carbon/carbies = exposed_mob + if(!(methods & (PATCH|TOUCH|VAPOR))) + return + for(var/datum/wound/iter_wound as anything in carbies.all_wounds) + iter_wound.on_starch(reac_volume, carbies) + +/datum/wound/proc/on_starch(reac_volume, mob/living/carbon/carbies) + return + +/datum/wound/pierce/bleed/on_starch(reac_volume, mob/living/carbon/carbies) + adjust_blood_flow(-0.03 * reac_volume) + to_chat(carbies, span_notice("The slimey starch seeps into [lowertext(src)], painfully drying some of it up and absorbing a little blood.")) + // When some nerd adds infection for wounds, make this increase the infection + return + +/datum/wound/slash/flesh/on_starch(reac_volume, mob/living/carbon/carbies) + adjust_blood_flow(-0.06 * reac_volume) + to_chat(carbies, span_notice("The slimey starch seeps into [lowertext(src)], painfully drying it up and absorbing some of the blood.")) + // When some nerd adds infection for wounds, make this increase the infection + return + +/datum/wound/burn/flesh/on_starch(reac_volume, mob/living/carbon/carbies) + to_chat(carbies, span_notice("The slimey starch seeps into [lowertext(src)], spiking you with intense pain! That probably wasn't a good idea...")) + sanitization -= min(0, 0.5) + infestation += 0.1 + return /datum/reagent/consumable/corn_syrup name = "Corn Syrup" @@ -678,15 +789,15 @@ taste_description = "sweet slime" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/corn_syrup/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) +/datum/reagent/consumable/corn_syrup/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) holder.add_reagent(/datum/reagent/consumable/sugar, 3 * REM * seconds_per_tick) - ..() + 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 + nutriment_factor = 15 metabolization_rate = 1 * REAGENTS_METABOLISM taste_description = "sweetness" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -701,14 +812,17 @@ mytray.adjust_weedlevel(rand(1, 2)) mytray.adjust_pestlevel(rand(1, 2)) -/datum/reagent/consumable/honey/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) +/datum/reagent/consumable/honey/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) holder.add_reagent(/datum/reagent/consumable/sugar, 3 * REM * seconds_per_tick) + . = ..() + var/need_mob_update if(SPT_PROB(33, seconds_per_tick)) - M.adjustBruteLoss(-1, FALSE, required_bodytype = affected_bodytype) - M.adjustFireLoss(-1, FALSE, required_bodytype = affected_bodytype) - M.adjustOxyLoss(-1, FALSE, required_biotype = affected_biotype) - M.adjustToxLoss(-1, FALSE, required_biotype = affected_biotype) - ..() + need_mob_update = affected_mob.adjustBruteLoss(-1, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-1, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustOxyLoss(-1, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustToxLoss(-1, updating_health = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/honey/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() @@ -745,14 +859,14 @@ name = "Stabilized Nutriment" description = "A bioengineered protien-nutrient structure designed to decompose in high saturation. In layman's terms, it won't get you fat." reagent_state = SOLID - nutriment_factor = 15 * REAGENTS_METABOLISM + nutriment_factor = 15 color = "#664330" // rgb: 102, 67, 48 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/nutriment/stabilized/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) - if(M.nutrition > NUTRITION_LEVEL_FULL - 25) - M.adjust_nutrition(-3 * REM * nutriment_factor * seconds_per_tick) - ..() +/datum/reagent/consumable/nutriment/stabilized/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(affected_mob.nutrition > NUTRITION_LEVEL_FULL - 25) + affected_mob.adjust_nutrition(-3 * REM * get_nutriment_factor() * seconds_per_tick) ////Lavaland Flora Reagents//// @@ -765,19 +879,20 @@ ph = 12 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/entpoly/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) - if(current_cycle >= 10) - M.Unconscious(40 * REM * seconds_per_tick, FALSE) - . = TRUE +/datum/reagent/consumable/entpoly/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update + if(current_cycle > 10) + affected_mob.Unconscious(40 * REM * seconds_per_tick, FALSE) if(SPT_PROB(10, seconds_per_tick)) - M.losebreath += 4 - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REM, 150, affected_biotype) - M.adjustToxLoss(3*REM, FALSE, required_biotype = affected_biotype) - M.adjustStaminaLoss(10*REM, FALSE, required_biotype = affected_biotype) - M.set_eye_blur_if_lower(10 SECONDS) - . = TRUE - ..() - + affected_mob.losebreath += 4 + affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REM, 150, affected_biotype) + affected_mob.adjustToxLoss(3*REM, updating_health = FALSE, required_biotype = affected_biotype) + affected_mob.adjustStaminaLoss(10*REM, updating_stamina = FALSE, required_biotype = affected_biotype) + affected_mob.set_eye_blur_if_lower(10 SECONDS) + need_mob_update = TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/tinlux name = "Tinea Luxor" @@ -785,54 +900,47 @@ 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 + self_consuming = TRUE + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_DEAD_PROCESS -/datum/reagent/consumable/tinlux/expose_mob(mob/living/exposed_mob) +/datum/reagent/consumable/tinlux/expose_mob(mob/living/exposed_mob, methods = TOUCH, reac_volume, show_message = TRUE, touch_protection = 0) . = ..() - add_reagent_light(exposed_mob) + if(!exposed_mob.reagents) // they won't process the reagent, but still benefit from its effects for a duration. + var/amount = round(reac_volume * clamp(1 - touch_protection, 0, 1)) + var/duration = (amount / metabolization_rate) * SSmobs.wait + if(duration > 1 SECONDS) + exposed_mob.adjust_timed_status_effect(duration, /datum/status_effect/tinlux_light) -/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_QDELETING, PROC_REF(on_living_holder_deletion)) - -/datum/reagent/consumable/tinlux/proc/remove_reagent_light(mob/living/living_holder) - UnregisterSignal(living_holder, COMSIG_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/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) /datum/reagent/consumable/vitfro name = "Vitrium Froth" description = "A bubbly paste that heals wounds of the skin." color = "#d3a308" - nutriment_factor = 3 * REAGENTS_METABOLISM + nutriment_factor = 3 taste_description = "fruity mushroom" ph = 10.4 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/vitfro/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) +/datum/reagent/consumable/vitfro/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update if(SPT_PROB(55, seconds_per_tick)) - M.adjustBruteLoss(-1, FALSE, required_bodytype = affected_bodytype) - M.adjustFireLoss(-1, FALSE, required_bodytype = affected_bodytype) - . = TRUE - ..() + need_mob_update = affected_mob.adjustBruteLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/liquidelectricity name = "Liquid Electricity" description = "The blood of Ethereals, and the stuff that keeps them going. Great for them, horrid for anyone else." - nutriment_factor = 5 * REAGENTS_METABOLISM + nutriment_factor = 5 color = "#97ee63" taste_description = "pure electricity" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -850,13 +958,13 @@ if(istype(stomach)) stomach.adjust_charge(reac_volume * 30) -/datum/reagent/consumable/liquidelectricity/enriched/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) - if(isethereal(M)) - M.blood_volume += 1 * seconds_per_tick +/datum/reagent/consumable/liquidelectricity/enriched/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(isethereal(affected_mob)) + affected_mob.blood_volume += 1 * seconds_per_tick else if(SPT_PROB(10, seconds_per_tick)) //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 ..() + affected_mob.electrocute_act(rand(5,10), "Liquid Electricity in their body", 1, SHOCK_NOGLOVES) //the shock is coming from inside the house + playsound(affected_mob, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) /datum/reagent/consumable/astrotame name = "Astrotame" @@ -870,16 +978,15 @@ overdose_threshold = 17 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/astrotame/overdose_process(mob/living/carbon/M, seconds_per_tick, times_fired) - if(M.disgust < 80) - M.adjust_disgust(10 * REM * seconds_per_tick) - ..() - . = TRUE +/datum/reagent/consumable/astrotame/overdose_process(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(affected_mob.disgust < 80) + affected_mob.adjust_disgust(10 * REM * seconds_per_tick) /datum/reagent/consumable/secretsauce name = "Secret Sauce" description = "What could it be?" - nutriment_factor = 2 * REAGENTS_METABOLISM + nutriment_factor = 2 color = "#792300" taste_description = "indescribable" quality = FOOD_AMAZING @@ -891,7 +998,7 @@ color = "#BBD4D9" taste_description = "mint frosting" description = "These restorative peptides not only speed up wound healing, but are nutritious as well!" - nutriment_factor = 10 * REAGENTS_METABOLISM // 33% less than nutriment to reduce weight gain + nutriment_factor = 10 // 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 @@ -901,7 +1008,7 @@ /datum/reagent/consumable/caramel name = "Caramel" description = "Who would have guessed that heated sugar could be so delicious?" - nutriment_factor = 10 * REAGENTS_METABOLISM + nutriment_factor = 10 color = "#D98736" taste_mult = 2 taste_description = "caramel" @@ -912,23 +1019,22 @@ name = "Char" description = "Essence of the grill. Has strange properties when overdosed." reagent_state = LIQUID - nutriment_factor = 5 * REAGENTS_METABOLISM + nutriment_factor = 5 color = "#C8C8C8" taste_mult = 6 taste_description = "smoke" overdose_threshold = 15 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/char/overdose_process(mob/living/M, seconds_per_tick, times_fired) +/datum/reagent/consumable/char/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(13, seconds_per_tick)) - M.say(pick_list_replacements(BOOMER_FILE, "boomer"), forced = /datum/reagent/consumable/char) - ..() - return + affected_mob.say(pick_list_replacements(BOOMER_FILE, "boomer"), forced = /datum/reagent/consumable/char) /datum/reagent/consumable/bbqsauce name = "BBQ Sauce" description = "Sweet, smoky, savory, and gets everywhere. Perfect for grilling." - nutriment_factor = 5 * REAGENTS_METABOLISM + nutriment_factor = 5 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" @@ -940,7 +1046,7 @@ description = "A great dessert for chocolate lovers." color = "#800000" quality = DRINK_VERYGOOD - nutriment_factor = 4 * REAGENTS_METABOLISM + nutriment_factor = 4 taste_description = "sweet chocolate" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_EASY @@ -957,7 +1063,7 @@ description = "A great dessert for vanilla lovers." color = "#FAFAD2" quality = DRINK_VERYGOOD - nutriment_factor = 4 * REAGENTS_METABOLISM + nutriment_factor = 4 taste_description = "sweet vanilla" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -972,7 +1078,7 @@ name = "Laughin' Syrup" description = "The product of juicing Laughin' Peas. Fizzy, and seems to change flavour based on what it's used with!" color = "#803280" - nutriment_factor = 5 * REAGENTS_METABOLISM + nutriment_factor = 5 taste_mult = 2 taste_description = "fizzy sweetness" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -1010,7 +1116,7 @@ name = "Korta Nectar" description = "A sweet, sugary syrup made from crushed sweet korta nuts." color = "#d3a308" - nutriment_factor = 5 * REAGENTS_METABOLISM + nutriment_factor = 5 metabolization_rate = 1 * REAGENTS_METABOLISM taste_description = "peppery sweetness" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -1019,7 +1125,7 @@ name = "Whipped Cream" description = "A white fluffy cream made from whipping cream at intense speed." color = "#efeff0" - nutriment_factor = 4 * REAGENTS_METABOLISM + nutriment_factor = 4 taste_description = "fluffy sweet cream" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -1029,15 +1135,15 @@ taste_description = "peanuts" reagent_state = SOLID color = "#D9A066" - nutriment_factor = 15 * REAGENTS_METABOLISM + nutriment_factor = 15 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED default_container = /obj/item/reagent_containers/condiment/peanut_butter -/datum/reagent/consumable/peanut_butter/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) //ET loves peanut butter - if(isabductor(M)) - M.add_mood_event("ET_pieces", /datum/mood_event/et_pieces, name) - M.set_drugginess(30 SECONDS * REM * seconds_per_tick) - ..() +/datum/reagent/consumable/peanut_butter/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) //ET loves peanut butter + . = ..() + if(isabductor(affected_mob)) + affected_mob.add_mood_event("ET_pieces", /datum/mood_event/et_pieces, name) + affected_mob.set_drugginess(30 SECONDS * REM * seconds_per_tick) /datum/reagent/consumable/vinegar name = "Vinegar" @@ -1047,15 +1153,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED default_container = /obj/item/reagent_containers/condiment/vinegar -//A better oil, representing choices like olive oil, argan oil, avocado oil, etc. -/datum/reagent/consumable/quality_oil - name = "Quality Oil" - 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 - default_container = /obj/item/reagent_containers/condiment/quality_oil - /datum/reagent/consumable/cornmeal name = "Cornmeal" description = "Ground cornmeal, for making corn related things." @@ -1069,7 +1166,7 @@ description = "Creamy natural yoghurt, with applications in both food and drinks." taste_description = "yoghurt" color = "#efeff0" - nutriment_factor = 2 * REAGENTS_METABOLISM + nutriment_factor = 2 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED default_container = /obj/item/reagent_containers/condiment/yoghurt @@ -1092,7 +1189,7 @@ description = "Powdered milk for cheap coffee. How delightful." taste_description = "milk" color = "#efeff0" - nutriment_factor = 1.5 * REAGENTS_METABOLISM + nutriment_factor = 1.5 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED default_container = /obj/item/reagent_containers/condiment/creamer @@ -1104,7 +1201,54 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/mintextract/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(HAS_TRAIT(affected_mob, TRAIT_FAT)) affected_mob.investigate_log("has been gibbed by consuming [src] while fat.", INVESTIGATE_DEATHS) affected_mob.inflate_gib() - return ..() + +/datum/reagent/consumable/worcestershire + name = "Worcestershire Sauce" + description = "That's \"Woostershire\" sauce, by the way." + nutriment_factor = 2 * REAGENTS_METABOLISM + color = "#572b26" + taste_description = "sweet fish" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + default_container = /obj/item/reagent_containers/condiment/worcestershire + +/datum/reagent/consumable/red_bay + name = "Red Bay Seasoning" + description = "A secret blend of herbs and spices that goes well with anything- according to Martians, at least." + color = "#8E4C00" + taste_description = "spice" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + default_container = /obj/item/reagent_containers/condiment/red_bay + +/datum/reagent/consumable/curry_powder + name = "Curry Powder" + description = "One of humanity's most common spices. Typically used to make curry." + color = "#F6C800" + taste_description = "dry curry" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + default_container = /obj/item/reagent_containers/condiment/curry_powder + +/datum/reagent/consumable/dashi_concentrate + name = "Dashi Concentrate" + description = "A concentrated form of dashi. Simmer with water in a 1:8 ratio to produce a tasty dashi broth." + color = "#372926" + taste_description = "extreme umami" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + default_container = /obj/item/reagent_containers/condiment/dashi_concentrate + +/datum/reagent/consumable/martian_batter + name = "Martian Batter" + description = "A thick batter made with dashi and flour, used for making dishes such as okonomiyaki and takoyaki." + color = "#D49D26" + taste_description = "umami dough" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/grounding_solution + name = "Grounding Solution" + description = "A food-safe ionic solution designed to neutralise the enigmatic \"liquid electricity\" that is common to food from Sprout, forming harmless salt on contact." + color = "#efeff0" + taste_description = "metallic salt" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents.dm index 682ca6f9f0be5..1a06ae11cd960 100644 --- a/code/modules/reagents/chemistry/reagents/impure_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/impure_reagents.dm @@ -15,12 +15,17 @@ var/liver_damage = 0.5 /datum/reagent/impurity/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - var/obj/item/organ/internal/liver/L = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) - if(!L)//Though, lets be safe - affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype)//Incase of no liver! - return ..() - affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, liver_damage * REM * seconds_per_tick, required_organtype = affected_organtype) - return ..() + . = ..() + var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) + var/need_mob_update + + if(liver)//Though, lets be safe + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, liver_damage * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + else + need_mob_update = affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)//Incase of no liver! + + if(need_mob_update) + return UPDATE_MOB_HEALTH //Basically just so people don't forget to adjust metabolization_rate /datum/reagent/inverse @@ -35,8 +40,9 @@ /datum/reagent/inverse/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustToxLoss(tox_damage * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - return ..() + . = ..() + if(affected_mob.adjustToxLoss(tox_damage * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH //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 @@ -96,6 +102,7 @@ var/atom/movable/screen/alert/status_effect/freon/cryostylane_alert /datum/reagent/inverse/cryostylane/on_mob_add(mob/living/carbon/affected_mob, amount) + . = ..() cube = new /obj/structure/ice_stasis(get_turf(affected_mob)) cube.color = COLOR_CYAN cube.set_anchored(TRUE) @@ -103,17 +110,21 @@ affected_mob.apply_status_effect(/datum/status_effect/grouped/stasis, STASIS_CHEMICAL_EFFECT) cryostylane_alert = affected_mob.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/affected_mob, seconds_per_tick, times_fired) + if(current_cycle >= 60) + holder.remove_reagent(type, volume) // remove it all if we're past 60 cycles + return ..() if(!cube || affected_mob.loc != cube) - affected_mob.reagents.remove_reagent(type, volume) //remove it all if we're past 60s - if(current_cycle > 60) metabolization_rate += 0.01 - ..() + return ..() /datum/reagent/inverse/cryostylane/on_mob_delete(mob/living/carbon/affected_mob, amount) + . = ..() QDEL_NULL(cube) - affected_mob.remove_status_effect(/datum/status_effect/grouped/stasis, STASIS_CHEMICAL_EFFECT) - affected_mob.clear_alert("cryostylane_alert") - ..() + if(!iscarbon(affected_mob)) + return + + var/mob/living/carbon/carbon_mob = affected_mob + carbon_mob.remove_status_effect(/datum/status_effect/grouped/stasis, STASIS_CHEMICAL_EFFECT) + carbon_mob.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 index 259393f3b324e..e2b703a9c1386 100644 --- a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm @@ -35,18 +35,21 @@ affected_respiration_type = ALL //Random healing of the 4 main groups -/datum/reagent/impurity/healing/medicine_failure/on_mob_life(mob/living/carbon/owner, seconds_per_tick, times_fired) +/datum/reagent/impurity/healing/medicine_failure/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update var/pick = pick("brute", "burn", "tox", "oxy") switch(pick) if("brute") - owner.adjustBruteLoss(-0.5, required_bodytype = affected_bodytype) + need_mob_update = affected_mob.adjustBruteLoss(-0.5, updating_health = FALSE, required_bodytype = affected_bodytype) if("burn") - owner.adjustFireLoss(-0.5, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-0.5, updating_health = FALSE, required_bodytype = affected_bodytype) if("tox") - owner.adjustToxLoss(-0.5, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustToxLoss(-0.5, updating_health = FALSE, required_biotype = affected_biotype) if("oxy") - owner.adjustOxyLoss(-0.5, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - ..() + need_mob_update += affected_mob.adjustOxyLoss(-0.5, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + if(need_mob_update) + return UPDATE_MOB_HEALTH // C2 medications // Helbital @@ -63,10 +66,10 @@ 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 +/datum/reagent/inverse/helgrasp/on_mob_add(mob/living/affected_mob, amount) . = ..() + to_chat(affected_mob, span_hierophant("You hear laughter as malevolent hands apparate before you, eager to drag you down to hell...! Look out!")) + playsound(affected_mob.loc, 'sound/chemistry/ahaha.ogg', 80, TRUE, -1) //Very obvious tell so people can be ready //Sends hands after you for your hubris /* @@ -80,8 +83,9 @@ Then I attempt to calculate the how many hands to created based off the current I take the 2s interval period and divide it by the number of hands I want to make (i.e. the current seconds_per_tick) 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, seconds_per_tick, 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, seconds_per_tick, times_fired) - spawn_hands(owner) +/datum/reagent/inverse/helgrasp/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + spawn_hands(affected_mob) lag_remainder += seconds_per_tick - FLOOR(seconds_per_tick, 1) seconds_per_tick = FLOOR(seconds_per_tick, 1) if(lag_remainder >= 1) @@ -90,36 +94,35 @@ Basically, we fill the time between now and 2s from now with hands based off the var/hands = 1 var/time = 2 / seconds_per_tick while(hands < seconds_per_tick) //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 + LAZYADD(timer_ids, addtimer(CALLBACK(src, PROC_REF(spawn_hands), affected_mob), (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 +/datum/reagent/inverse/helgrasp/proc/spawn_hands(mob/living/carbon/affected_mob) + if(!affected_mob && iscarbon(holder.my_atom))//Catch timer + affected_mob = 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 + var/grab_dir = turn(affected_mob.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(affected_mob, 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) + new/obj/effect/temp_visual/dir_setting/curse/grasp_portal(spawn_turf, affected_mob.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) + hand.preparePixelProjectile(affected_mob, 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) +/datum/reagent/inverse/helgrasp/on_mob_delete(mob/living/affected_mob) + . = ..() var/hands = 0 while(lag_remainder > hands) - spawn_hands(owner) + spawn_hands(affected_mob) 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" @@ -138,9 +141,9 @@ Basically, we fill the time between now and 2s from now with hands based off the liver_damage = 0.1 addiction_types = list(/datum/addiction/medicine = 4) -/datum/reagent/impurity/libitoil/on_mob_add(mob/living/L, amount) +/datum/reagent/impurity/libitoil/on_mob_add(mob/living/affected_mob, amount) . = ..() - var/mob/living/carbon/consumer = L + var/mob/living/carbon/consumer = affected_mob if(!consumer) return RegisterSignal(consumer, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(on_gained_organ)) @@ -162,9 +165,9 @@ Basically, we fill the time between now and 2s from now with hands based off the var/obj/item/organ/internal/liver/this_liver = organ this_liver.alcohol_tolerance /= 2 -/datum/reagent/impurity/libitoil/on_mob_delete(mob/living/L) +/datum/reagent/impurity/libitoil/on_mob_delete(mob/living/affected_mob) . = ..() - var/mob/living/carbon/consumer = L + var/mob/living/carbon/consumer = affected_mob UnregisterSignal(consumer, COMSIG_CARBON_LOSE_ORGAN) UnregisterSignal(consumer, COMSIG_CARBON_GAIN_ORGAN) var/obj/item/organ/internal/liver/this_liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER) @@ -186,19 +189,20 @@ Basically, we fill the time between now and 2s from now with hands based off the 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!" + description = "These inhibitory peptides drains nutrition and causes brain damage in the patient!" ph = 2.1 -/datum/reagent/peptides_failed/on_mob_life(mob/living/carbon/owner, seconds_per_tick, times_fired) - owner.adjustCloneLoss(0.25 * seconds_per_tick) - owner.adjust_nutrition(-5 * REAGENTS_METABOLISM * seconds_per_tick) +/datum/reagent/peptides_failed/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.25 * seconds_per_tick, 170)) + . = UPDATE_MOB_HEALTH + affected_mob.adjust_nutrition(-5 * REAGENTS_METABOLISM * seconds_per_tick) //Lenturi //impure @@ -208,13 +212,13 @@ Basically, we fill the time between now and 2s from now with hands based off the 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_metabolize(mob/living/carbon/affected_mob) + . = ..() + affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/reagent/lenturi) -/datum/reagent/impurity/lentslurri/on_mob_end_metabolize(mob/living/carbon/owner) - owner.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/lenturi) - return ..() +/datum/reagent/impurity/lentslurri/on_mob_end_metabolize(mob/living/carbon/affected_mob) + . = ..() + affected_mob.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/lenturi) //failed /datum/reagent/inverse/ichiyuri @@ -231,18 +235,19 @@ Basically, we fill the time between now and 2s from now with hands based off the var/spammer = 0 //Just the removed itching mechanism - omage to it's origins. -/datum/reagent/inverse/ichiyuri/on_mob_life(mob/living/carbon/owner, seconds_per_tick, times_fired) - if(prob(resetting_probability) && !(HAS_TRAIT(owner, TRAIT_RESTRAINED) || owner.incapacitated())) +/datum/reagent/inverse/ichiyuri/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(prob(resetting_probability) && !(HAS_TRAIT(affected_mob, TRAIT_RESTRAINED) || affected_mob.incapacitated())) + . = TRUE if(spammer < world.time) - to_chat(owner,span_warning("You can't help but itch yourself.")) + to_chat(affected_mob,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) + if(affected_mob.adjustBruteLoss(scab*REM, updating_health = FALSE)) + . = UPDATE_MOB_HEALTH + affected_mob.bleed(scab) resetting_probability = 0 - resetting_probability += (5*(current_cycle/10) * seconds_per_tick) // 10 iterations = >51% to itch - ..() - return TRUE + resetting_probability += (5*((current_cycle-1)/10) * seconds_per_tick) // 10 iterations = >51% to itch //Aiuri //impure @@ -255,14 +260,14 @@ Basically, we fill the time between now and 2s from now with hands based off the /// blurriness at the start of taking the med var/amount_of_blur_applied = 0 SECONDS -/datum/reagent/impurity/aiuri/on_mob_add(mob/living/owner, amount) +/datum/reagent/impurity/aiuri/on_mob_add(mob/living/affected_mob, amount) . = ..() amount_of_blur_applied = creation_purity * (volume / metabolization_rate) * 2 SECONDS - owner.adjust_eye_blur(amount_of_blur_applied) + affected_mob.adjust_eye_blur(amount_of_blur_applied) -/datum/reagent/impurity/aiuri/on_mob_delete(mob/living/owner, amount) +/datum/reagent/impurity/aiuri/on_mob_delete(mob/living/affected_mob, amount) . = ..() - owner.adjust_eye_blur(-amount_of_blur_applied) + affected_mob.adjust_eye_blur(-amount_of_blur_applied) //Hercuri //inverse @@ -277,14 +282,14 @@ Basically, we fill the time between now and 2s from now with hands based off the taste_description = "heat! Ouch!" addiction_types = list(/datum/addiction/medicine = 2.5) -/datum/reagent/inverse/hercuri/on_mob_life(mob/living/carbon/owner, seconds_per_tick, times_fired) +/datum/reagent/inverse/hercuri/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() var/heating = rand(5, 25) * creation_purity * REM * seconds_per_tick - owner.reagents?.chem_temp += heating - owner.adjust_bodytemperature(heating * TEMPERATURE_DAMAGE_COEFFICIENT) - if(!ishuman(owner)) + affected_mob.reagents?.chem_temp += heating + affected_mob.adjust_bodytemperature(heating * TEMPERATURE_DAMAGE_COEFFICIENT) + if(!ishuman(affected_mob)) return - var/mob/living/carbon/human/human = owner + var/mob/living/carbon/human/human = affected_mob human.adjust_coretemperature(heating * TEMPERATURE_DAMAGE_COEFFICIENT) /datum/reagent/inverse/hercuri/expose_mob(mob/living/carbon/exposed_mob, methods=VAPOR, reac_volume) @@ -295,13 +300,14 @@ Basically, we fill the time between now and 2s from now with hands based off the exposed_mob.adjust_bodytemperature(reac_volume * TEMPERATURE_DAMAGE_COEFFICIENT) exposed_mob.adjust_fire_stacks(reac_volume / 2) -/datum/reagent/inverse/hercuri/overdose_process(mob/living/carbon/owner, seconds_per_tick, times_fired) +/datum/reagent/inverse/hercuri/overdose_process(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - owner.adjustOrganLoss(ORGAN_SLOT_LIVER, 2 * REM * seconds_per_tick, required_organtype = affected_organtype) //Makes it so you can't abuse it with pyroxadone very easily (liver dies from 25u unless it's fully upgraded) + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 2 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) //Makes it so you can't abuse it with pyroxadone very easily (liver dies from 25u unless it's fully upgraded) + . = UPDATE_MOB_HEALTH var/heating = 10 * creation_purity * REM * seconds_per_tick * TEMPERATURE_DAMAGE_COEFFICIENT - owner.adjust_bodytemperature(heating) //hot hot - if(ishuman(owner)) - var/mob/living/carbon/human/human = owner + affected_mob.adjust_bodytemperature(heating) //hot hot + if(ishuman(affected_mob)) + var/mob/living/carbon/human/human = affected_mob human.adjust_coretemperature(heating) /datum/reagent/inverse/healing/tirimol @@ -314,16 +320,17 @@ Basically, we fill the time between now and 2s from now with hands based off the 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, seconds_per_tick, times_fired) +/datum/reagent/inverse/healing/tirimol/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() switch(current_cycle) - if(1 to 10)//same delay as chloral hydrate + if(2 to 11)//same delay as chloral hydrate if(prob(50)) - owner.emote("yawn") - if(10 to INFINITY) - owner.Sleeping(40) + affected_mob.emote("yawn") + if(11 to INFINITY) + affected_mob.Sleeping(40) . = 1 - if(owner.IsSleeping()) - for(var/datum/reagent/reagent as anything in owner.reagents.reagent_list) + if(affected_mob.IsSleeping()) + for(var/datum/reagent/reagent as anything in affected_mob.reagents.reagent_list) if(reagent in cached_reagent_list) continue if(!istype(reagent, /datum/reagent/medicine)) @@ -331,23 +338,22 @@ Basically, we fill the time between now and 2s from now with hands based off the reagent.creation_purity *= 1.25 cached_reagent_list += reagent - else if(!owner.IsSleeping() && length(cached_reagent_list)) + else if(!affected_mob.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 +/datum/reagent/inverse/healing/tirimol/on_mob_delete(mob/living/affected_mob) + . = ..() + if(affected_mob.IsSleeping()) + affected_mob.visible_message(span_notice("[icon2html(affected_mob, viewers(DEFAULT_MESSAGE_RANGE, src))] [affected_mob] 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 @@ -366,11 +372,11 @@ Basically, we fill the time between now and 2s from now with hands based off the var/cached_cold_level_2 var/cached_cold_level_3 -/datum/reagent/inverse/healing/convermol/on_mob_add(mob/living/owner, amount) +/datum/reagent/inverse/healing/convermol/on_mob_add(mob/living/affected_mob, 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/internal/lungs/lungs = owner.get_organ_slot(ORGAN_SLOT_LUNGS) + RegisterSignal(affected_mob, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(on_gained_organ)) + RegisterSignal(affected_mob, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(on_removed_organ)) + var/obj/item/organ/internal/lungs/lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) if(!lungs) return apply_lung_levels(lungs) @@ -413,11 +419,11 @@ Basically, we fill the time between now and 2s from now with hands based off the 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) +/datum/reagent/inverse/healing/convermol/on_mob_delete(mob/living/affected_mob) . = ..() - UnregisterSignal(owner, COMSIG_CARBON_LOSE_ORGAN) - UnregisterSignal(owner, COMSIG_CARBON_GAIN_ORGAN) - var/obj/item/organ/internal/lungs/lungs = owner.get_organ_slot(ORGAN_SLOT_LUNGS) + UnregisterSignal(affected_mob, COMSIG_CARBON_LOSE_ORGAN) + UnregisterSignal(affected_mob, COMSIG_CARBON_GAIN_ORGAN) + var/obj/item/organ/internal/lungs/lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) if(!lungs) return restore_lung_levels(lungs) @@ -436,13 +442,13 @@ Basically, we fill the time between now and 2s from now with hands based off the var/poison_interval = (9 SECONDS) -/datum/reagent/inverse/technetium/on_mob_life(mob/living/carbon/owner, seconds_per_tick, times_fired) +/datum/reagent/inverse/technetium/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() time_until_next_poison -= seconds_per_tick * (1 SECONDS) if (time_until_next_poison <= 0) time_until_next_poison = poison_interval - owner.adjustToxLoss(creation_purity * 1, required_biotype = affected_biotype) - - ..() + if(affected_mob.adjustToxLoss(creation_purity * 1, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH //Kind of a healing effect, Presumably you're using syrinver to purge so this helps that /datum/reagent/inverse/healing/syriniver @@ -454,7 +460,7 @@ Basically, we fill the time between now and 2s from now with hands based off the var/cached_reagent_list = list() addiction_types = list(/datum/addiction/medicine = 1.75) -/datum/reagent/inverse/healing/syriniver/on_mob_add(mob/living/affected_mob) +/datum/reagent/inverse/healing/syriniver/on_mob_add(mob/living/affected_mob, amount) if(!(iscarbon(affected_mob))) return ..() var/mob/living/carbon/affected_carbon = affected_mob @@ -490,12 +496,13 @@ Basically, we fill the time between now and 2s from now with hands based off the //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/affected_mob, seconds_per_tick, times_fired) + var/need_mob_update if(length(affected_mob.reagents.reagent_list) > 1) - affected_mob.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5 * seconds_per_tick, required_organtype = affected_organtype) //Hey! It's everyone's favourite drawback from multiver! - return ..() - affected_mob.adjustToxLoss(-2 * REM * creation_purity * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - return TRUE + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5 * seconds_per_tick, required_organ_flag = affected_organ_flags) //Hey! It's everyone's favourite drawback from multiver! + else + need_mob_update = affected_mob.adjustToxLoss(-2 * REM * creation_purity * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH ///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 @@ -524,9 +531,10 @@ Basically, we fill the time between now and 2s from now with hands based off the ) /datum/reagent/inverse/penthrite/on_mob_dead(mob/living/carbon/affected_mob, seconds_per_tick) + . = ..() var/obj/item/organ/internal/heart/heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART) if(!heart || heart.organ_flags & ORGAN_FAILING) - return ..() + return metabolization_rate = 0.2 * REM affected_mob.add_traits(trait_buffs, type) affected_mob.set_stat(CONSCIOUS) //This doesn't touch knocked out @@ -541,18 +549,19 @@ Basically, we fill the time between now and 2s from now with hands based off the back_from_the_dead = TRUE affected_mob.emote("gasp") affected_mob.playsound_local(affected_mob, 'sound/health/fastbeat.ogg', 65) - ..() /datum/reagent/inverse/penthrite/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(!back_from_the_dead) - return ..() + return //Following is for those brought back from the dead only REMOVE_TRAIT(affected_mob, TRAIT_KNOCKEDOUT, CRIT_HEALTH_TRAIT) REMOVE_TRAIT(affected_mob, TRAIT_KNOCKEDOUT, OXYLOSS_TRAIT) for(var/datum/wound/iter_wound as anything in affected_mob.all_wounds) iter_wound.adjust_blood_flow(1-creation_purity) - affected_mob.adjustBruteLoss(5 * (1-creation_purity) * seconds_per_tick, required_bodytype = affected_bodytype) - affected_mob.adjustOrganLoss(ORGAN_SLOT_HEART, (1 + (1-creation_purity)) * seconds_per_tick, required_organtype = affected_organtype) + var/need_mob_update + need_mob_update = affected_mob.adjustBruteLoss(5 * (1-creation_purity) * seconds_per_tick, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_HEART, (1 + (1-creation_purity)) * seconds_per_tick, required_organ_flag = affected_organ_flags) if(affected_mob.health < HEALTH_THRESHOLD_CRIT) affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/reagent/nooartrium) if(affected_mob.health < HEALTH_THRESHOLD_FULLCRIT) @@ -560,18 +569,20 @@ Basically, we fill the time between now and 2s from now with hands based off the var/obj/item/organ/internal/heart/heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART) if(!heart || heart.organ_flags & ORGAN_FAILING) remove_buffs(affected_mob) - ..() + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/inverse/penthrite/on_mob_delete(mob/living/carbon/affected_mob) + . = ..() remove_buffs(affected_mob) var/obj/item/organ/internal/heart/heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART) if(affected_mob.health < -500 || heart.organ_flags & ORGAN_FAILING)//Honestly commendable if you get -500 explosion(affected_mob, light_impact_range = 1, explosion_cause = src) qdel(heart) affected_mob.visible_message(span_boldwarning("[affected_mob]'s heart explodes!")) - return ..() /datum/reagent/inverse/penthrite/overdose_start(mob/living/carbon/affected_mob) + . = ..() if(!back_from_the_dead) return ..() var/obj/item/organ/internal/heart/heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART) @@ -646,7 +657,7 @@ Basically, we fill the time between now and 2s from now with hands based off the var/datum/brain_trauma/temp_trauma /datum/reagent/inverse/neurine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - .=..() + . = ..() if(temp_trauma) return if(!(SPT_PROB(creation_purity*10, seconds_per_tick))) @@ -654,7 +665,7 @@ Basically, we fill the time between now and 2s from now with hands based off the 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/special/obsessed, // Obsessed sets the affected_mob 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 /datum/brain_trauma/special/honorbound, // Designed to be chaplain exclusive ) @@ -667,7 +678,7 @@ Basically, we fill the time between now and 2s from now with hands based off the return /datum/reagent/inverse/neurine/on_mob_delete(mob/living/carbon/affected_mob) - .=..() + . = ..() if(!temp_trauma) return if(istype(temp_trauma, /datum/brain_trauma/special/imaginary_friend))//Good friends stay by you, no matter what @@ -675,7 +686,7 @@ Basically, we fill the time between now and 2s from now with hands based off the affected_mob.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 + name = "Corazargh" //It's what you yell! Though, if you've a better name feel free. Also an homage 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 @@ -684,82 +695,22 @@ Basically, we fill the time between now and 2s from now with hands based off the metabolization_rate = REM chemical_flags = REAGENT_DEAD_PROCESS tox_damage = 0 - ///Weakref to the old heart we're swapping for - var/datum/weakref/original_heart_ref - ///Weakref to the new heart that's temp added - var/datum/weakref/manual_heart_ref -///Creates a new cursed heart and puts the old inside of it, then replaces the position of the old +///Give the victim the manual heart beating component. /datum/reagent/inverse/corazargh/on_mob_metabolize(mob/living/affected_mob) + . = ..() if(!iscarbon(affected_mob)) return var/mob/living/carbon/carbon_mob = affected_mob - var/obj/item/organ/internal/heart/original_heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART) - if(!original_heart) + var/obj/item/organ/internal/heart/affected_heart = carbon_mob.get_organ_slot(ORGAN_SLOT_HEART) + if(isnull(affected_heart)) return - original_heart_ref = WEAKREF(original_heart) - - var/obj/item/organ/internal/heart/cursed/manual_heart = new(null, src) - manual_heart_ref = WEAKREF(manual_heart) - 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(affected_mob, 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/affected_mob, obj/item/organ/organ) - SIGNAL_HANDLER - if(!istype(organ, /obj/item/organ/internal/heart)) - return - // DO NOT REACT TO YOUR OWN HEART ADDITION I SWEAR TO CHRIST - var/obj/item/organ/internal/heart/cursed/manual_heart = manual_heart_ref?.resolve() - if(organ == manual_heart) - return - - var/mob/living/carbon/affected_carbon = affected_mob - var/obj/item/organ/internal/heart/original_heart = organ - original_heart_ref = WEAKREF(original_heart) - original_heart.Remove(affected_carbon, special = TRUE) - if(!manual_heart) - manual_heart = new(null, src) - manual_heart_ref = WEAKREF(manual_heart) - original_heart.forceMove(manual_heart) - original_heart.organ_flags |= ORGAN_FROZEN //Not actually frozen, but we want to pause decay - manual_heart.Insert(affected_carbon, 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 - var/obj/item/organ/internal/heart/cursed/manual_heart = manual_heart_ref?.resolve() - if(organ != manual_heart) - return - var/obj/item/organ/internal/heart/original_heart = original_heart_ref?.resolve() - if(!original_heart) - return - - original_heart.forceMove(manual_heart.loc) - original_heart.organ_flags &= ~ORGAN_FROZEN //enable decay again - QDEL_NULL(manual_heart_ref) + carbon_mob.AddComponent(/datum/component/manual_heart) + return ..() -///We're done - remove the curse and restore the old one +///We're done - remove the curse /datum/reagent/inverse/corazargh/on_mob_end_metabolize(mob/living/affected_mob) - //Do these first so Insert doesn't call them - UnregisterSignal(affected_mob, COMSIG_CARBON_LOSE_ORGAN) - UnregisterSignal(affected_mob, COMSIG_CARBON_GAIN_ORGAN) - if(!iscarbon(affected_mob)) - return - var/mob/living/carbon/affected_carbon = affected_mob - var/obj/item/organ/internal/heart/original_heart = original_heart_ref?.resolve() - if(original_heart) //Mostly a just in case - original_heart.organ_flags &= ~ORGAN_FROZEN //enable decay again - original_heart.Insert(affected_carbon, special = TRUE) - QDEL_NULL(manual_heart_ref) - to_chat(affected_mob, span_userdanger("You feel your heart start beating normally again!")) + qdel(affected_mob.GetComponent(/datum/component/manual_heart)) ..() /datum/reagent/inverse/antihol @@ -773,9 +724,9 @@ Basically, we fill the time between now and 2s from now with hands based off the tox_damage = 0 /datum/reagent/inverse/antihol/on_mob_life(mob/living/carbon/C, seconds_per_tick, times_fired) + . = ..() for(var/datum/reagent/consumable/ethanol/alcohol in C.reagents.reagent_list) alcohol.boozepwr += seconds_per_tick - ..() /datum/reagent/inverse/oculine name = "Oculater" @@ -792,19 +743,19 @@ Basically, we fill the time between now and 2s from now with hands based off the var/headache = FALSE /datum/reagent/inverse/oculine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(headache) return ..() if(SPT_PROB(100 * creation_purity, seconds_per_tick)) affected_mob.become_blind(IMPURE_OCULINE) to_chat(affected_mob, span_danger("You suddenly develop a pounding headache as your vision fluxuates.")) headache = TRUE - ..() /datum/reagent/inverse/oculine/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() affected_mob.cure_blind(IMPURE_OCULINE) if(headache) to_chat(affected_mob, span_notice("Your headache clears up!")) - ..() /datum/reagent/impurity/inacusiate name = "Tinacusiate" @@ -820,15 +771,15 @@ Basically, we fill the time between now and 2s from now with hands based off the var/randomSpan /datum/reagent/impurity/inacusiate/on_mob_metabolize(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() randomSpan = pick(list("clown", "small", "big", "hypnophrase", "alien", "cult", "alert", "danger", "emote", "yell", "brass", "sans", "papyrus", "robot", "his_grace", "phobia")) RegisterSignal(affected_mob, COMSIG_MOVABLE_HEAR, PROC_REF(owner_hear)) to_chat(affected_mob, span_warning("Your hearing seems to be a bit off!")) - ..() /datum/reagent/impurity/inacusiate/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() UnregisterSignal(affected_mob, COMSIG_MOVABLE_HEAR) to_chat(affected_mob, span_notice("You start hearing things normally again.")) - ..() /datum/reagent/impurity/inacusiate/proc/owner_hear(mob/living/owner, list/hearing_args) SIGNAL_HANDLER 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 index 12912b80a1553..0872fa6658815 100644 --- a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_toxin_reagents.dm @@ -18,7 +18,6 @@ owner.adjust_disgust(50) ..() - //Formaldehyde - Impure Version /datum/reagent/impurity/methanol name = "Methanol" @@ -29,9 +28,10 @@ liver_damage = 0 /datum/reagent/impurity/methanol/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() var/obj/item/organ/internal/eyes/eyes = affected_mob.get_organ_slot(ORGAN_SLOT_EYES) - eyes?.apply_organ_damage(0.5 * REM * seconds_per_tick, required_organtype = affected_organtype) - return ..() + if(eyes?.apply_organ_damage(0.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + return UPDATE_MOB_HEALTH //Chloral Hydrate - Impure Version /datum/reagent/impurity/chloralax @@ -43,9 +43,9 @@ liver_damage = 0 /datum/reagent/impurity/chloralax/on_mob_life(mob/living/carbon/owner, seconds_per_tick) - owner.adjustToxLoss(1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - + . = ..() + if(owner.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH //Mindbreaker Toxin - Impure Version /datum/reagent/impurity/rosenol @@ -58,12 +58,12 @@ metabolization_rate = 0.5 * REAGENTS_METABOLISM /datum/reagent/impurity/rosenol/on_mob_life(mob/living/carbon/owner, seconds_per_tick) + . = ..() var/obj/item/organ/internal/tongue/tongue = owner.get_organ_slot(ORGAN_SLOT_TONGUE) if(!tongue) - return ..() + return if(SPT_PROB(4.0, seconds_per_tick)) owner.manual_emote("clicks with [owner.p_their()] tongue.") owner.say("Noice.", forced = /datum/reagent/impurity/rosenol) if(SPT_PROB(2.0, seconds_per_tick)) 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 eaf241640a129..ff1671852c1e0 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -13,7 +13,8 @@ current_cycle++ if(length(reagent_removal_skip_list)) return - holder.remove_reagent(type, metabolization_rate * seconds_per_tick / affected_mob.metabolism_efficiency) //medicine reagents stay longer if you have a better metabolism + if(holder) + holder.remove_reagent(type, metabolization_rate * seconds_per_tick / affected_mob.metabolism_efficiency) //medicine reagents stay longer if you have a better metabolism /datum/reagent/medicine/leporazine name = "Leporazine" @@ -23,6 +24,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/leporazine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() var/target_temp = affected_mob.get_body_temp_normal(apply_change = FALSE) if(affected_mob.bodytemperature > target_temp) affected_mob.adjust_bodytemperature(-40 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick, target_temp) @@ -34,7 +36,6 @@ affected_human.adjust_coretemperature(-40 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick, target_temp) else if(affected_human.coretemperature < (target_temp + 1)) affected_human.adjust_coretemperature(40 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick, 0, target_temp) - ..() /datum/reagent/medicine/adminordrazine //An OP chemical for admins name = "Adminordrazine" @@ -66,11 +67,11 @@ mytray.visible_message(span_warning("Nothing happens...")) /datum/reagent/medicine/adminordrazine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.heal_bodypart_damage(5 * REM * seconds_per_tick, 5 * REM * seconds_per_tick, 0, FALSE, affected_bodytype) - affected_mob.adjustToxLoss(-5 * REM * seconds_per_tick, FALSE, TRUE, affected_biotype) + . = ..() + affected_mob.heal_bodypart_damage(brute = 5 * REM * seconds_per_tick, burn = 5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + affected_mob.adjustToxLoss(-5 * REM * seconds_per_tick, updating_health = FALSE, forced = TRUE, required_biotype = affected_biotype) // Heal everything! That we want to. But really don't heal reagents. Otherwise we'll lose ... us. - affected_mob.fully_heal(full_heal_flags & ~HEAL_ALL_REAGENTS) - return ..() + affected_mob.fully_heal(full_heal_flags & ~HEAL_ALL_REAGENTS) // there is no need to return UPDATE_MOB_HEALTH because this proc calls updatehealth() /datum/reagent/medicine/adminordrazine/quantum_heal name = "Quantum Medicine" @@ -94,11 +95,11 @@ affected_mob.AdjustParalyzed(-20 * REM * seconds_per_tick) if(holder.has_reagent(/datum/reagent/toxin/mindbreaker)) holder.remove_reagent(/datum/reagent/toxin/mindbreaker, 5 * REM * seconds_per_tick) + . = ..() affected_mob.adjust_hallucinations(-20 SECONDS * REM * seconds_per_tick) if(SPT_PROB(16, seconds_per_tick)) - affected_mob.adjustToxLoss(1, FALSE, required_biotype = affected_biotype) - . = TRUE - ..() + if(affected_mob.adjustToxLoss(1, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/synaphydramine name = "Diphen-Synaptizine" @@ -113,11 +114,11 @@ holder.remove_reagent(/datum/reagent/toxin/mindbreaker, 5 * REM * seconds_per_tick) if(holder.has_reagent(/datum/reagent/toxin/histamine)) holder.remove_reagent(/datum/reagent/toxin/histamine, 5 * REM * seconds_per_tick) + . = ..() affected_mob.adjust_hallucinations(-20 SECONDS * REM * seconds_per_tick) if(SPT_PROB(16, seconds_per_tick)) - affected_mob.adjustToxLoss(1, FALSE, required_biotype = affected_biotype) - . = TRUE - ..() + if(affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/sansufentanyl name = "Sansufentanyl" @@ -127,15 +128,16 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/sansufentanyl/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_confusion_up_to(3 SECONDS * REM * seconds_per_tick, 5 SECONDS) affected_mob.adjust_dizzy_up_to(6 SECONDS * REM * seconds_per_tick, 12 SECONDS) - affected_mob.adjustStaminaLoss(1 * REM * seconds_per_tick) + if(affected_mob.adjustStaminaLoss(1 * REM * seconds_per_tick, updating_stamina = FALSE)) + . = UPDATE_MOB_HEALTH if(SPT_PROB(10, seconds_per_tick)) to_chat(affected_mob, "You feel confused and disoriented.") if(prob(30)) SEND_SOUND(affected_mob, sound('sound/weapons/flash_ring.ogg')) - ..() /datum/reagent/medicine/cryoxadone name = "Cryoxadone" @@ -148,22 +150,23 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/cryoxadone/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() metabolization_rate = REAGENTS_METABOLISM * (0.00001 * (affected_mob.bodytemperature ** 2) + 0.5) if(affected_mob.bodytemperature >= T0C || !HAS_TRAIT(affected_mob, TRAIT_KNOCKEDOUT)) - ..() return var/power = -0.00003 * (affected_mob.bodytemperature ** 2) + 3 - affected_mob.adjustOxyLoss(-3 * power * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustBruteLoss(-power * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustFireLoss(-power * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustToxLoss(-power * REM * seconds_per_tick, FALSE, TRUE, affected_biotype) //heals TOXINLOVERs - affected_mob.adjustCloneLoss(-power * REM * seconds_per_tick, FALSE, affected_biotype) + var/need_mob_update + need_mob_update = affected_mob.adjustOxyLoss(-3 * power * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustBruteLoss(-power * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-power * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustToxLoss(-power * REM * seconds_per_tick, updating_health = FALSE, forced = TRUE, required_biotype = affected_biotype) //heals TOXINLOVERs + need_mob_update += affected_mob.adjustCloneLoss(-power * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) for(var/i in affected_mob.all_wounds) var/datum/wound/iter_wound = i iter_wound.on_xadone(power * REM * seconds_per_tick) REMOVE_TRAIT(affected_mob, TRAIT_DISFIGURED, TRAIT_GENERIC) //fixes common causes for disfiguration - ..() - return TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH // Healing /datum/reagent/medicine/cryoxadone/on_hydroponics_apply(obj/machinery/hydroponics/mytray, mob/user) @@ -179,12 +182,12 @@ metabolization_rate = 1.5 * REAGENTS_METABOLISM /datum/reagent/medicine/clonexadone/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.bodytemperature < T0C) - affected_mob.adjustCloneLoss((0.00006 * (affected_mob.bodytemperature ** 2) - 6) * REM * seconds_per_tick, FALSE) + if(affected_mob.adjustCloneLoss((0.00006 * (affected_mob.bodytemperature ** 2) - 6) * REM * seconds_per_tick, updating_health = FALSE)) + . = UPDATE_MOB_HEALTH REMOVE_TRAIT(affected_mob, TRAIT_DISFIGURED, TRAIT_GENERIC) - . = TRUE metabolization_rate = REAGENTS_METABOLISM * (0.000015 * (affected_mob.bodytemperature ** 2) + 0.75) - ..() /datum/reagent/medicine/pyroxadone name = "Pyroxadone" @@ -195,6 +198,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/pyroxadone/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT) var/power = 0 switch(affected_mob.bodytemperature) @@ -207,17 +211,18 @@ if(affected_mob.on_fire) power *= 2 - affected_mob.adjustOxyLoss(-2 * power * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustBruteLoss(-power * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustFireLoss(-1.5 * power * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustToxLoss(-power * REM * seconds_per_tick, FALSE, TRUE, affected_biotype) - affected_mob.adjustCloneLoss(-power * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + var/need_mob_update + need_mob_update = affected_mob.adjustOxyLoss(-2 * power * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustBruteLoss(-power * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-1.5 * power * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustToxLoss(-power * REM * seconds_per_tick, updating_health = FALSE, forced = TRUE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustCloneLoss(-power * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + . = UPDATE_MOB_HEALTH for(var/i in affected_mob.all_wounds) var/datum/wound/iter_wound = i iter_wound.on_xadone(power * REM * seconds_per_tick) REMOVE_TRAIT(affected_mob, TRAIT_DISFIGURED, TRAIT_GENERIC) - . = TRUE - ..() /datum/reagent/medicine/rezadone name = "Rezadone" @@ -230,18 +235,20 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/rezadone/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.setCloneLoss(0) //Rezadone is almost never used in favor of cryoxadone. Hopefully this will change that. // No such luck so far - affected_mob.heal_bodypart_damage(1 * REM * seconds_per_tick, 1 * REM * seconds_per_tick) + . = ..() + var/need_mob_update + need_mob_update = affected_mob.setCloneLoss(0) //Rezadone is almost never used in favor of cryoxadone. Hopefully this will change that. // No such luck so far + need_mob_update += affected_mob.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_biotype) + if(need_mob_update) + . = UPDATE_MOB_HEALTH REMOVE_TRAIT(affected_mob, TRAIT_DISFIGURED, TRAIT_GENERIC) - ..() - . = TRUE /datum/reagent/medicine/rezadone/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + . = ..() + if(affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH affected_mob.set_dizzy_if_lower(10 SECONDS * REM * seconds_per_tick) affected_mob.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) - ..() - . = TRUE /datum/reagent/medicine/rezadone/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() @@ -261,6 +268,14 @@ ph = 8.1 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED +/datum/reagent/medicine/spaceacillin/on_mob_add(mob/living/affected_mob) + . = ..() + ADD_TRAIT(affected_mob, TRAIT_VIRUS_RESISTANCE, type) + +/datum/reagent/medicine/spaceacillin/on_mob_delete(mob/living/affected_mob) + . = ..() + REMOVE_TRAIT(affected_mob, TRAIT_VIRUS_RESISTANCE, type) + //Goon Chems. Ported mainly from Goonstation. Easily mixable (or not so easily) and provide a variety of effects. /datum/reagent/medicine/oxandrolone @@ -274,18 +289,20 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/oxandrolone/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update if(affected_mob.getFireLoss() > 25) - affected_mob.adjustFireLoss(-4 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) //Twice as effective as AIURI for severe burns + need_mob_update = affected_mob.adjustFireLoss(-4 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) //Twice as effective as AIURI for severe burns else - affected_mob.adjustFireLoss(-0.5 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) //But only a quarter as effective for more minor ones - ..() - . = TRUE + need_mob_update = affected_mob.adjustFireLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) //But only a quarter as effective for more minor ones + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/oxandrolone/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.getFireLoss()) //It only makes existing burns worse - affected_mob.adjustFireLoss(4.5 * REM * seconds_per_tick, FALSE, FALSE, BODYTYPE_ORGANIC) // it's going to be healing either 4 or 0.5 - . = TRUE - ..() + if(affected_mob.adjustFireLoss(4.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_biotype)) // it's going to be healing either 4 or 0.5 + return UPDATE_MOB_HEALTH /datum/reagent/medicine/salglu_solution name = "Saline-Glucose Solution" @@ -302,6 +319,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update if(last_added) affected_mob.blood_volume -= last_added last_added = 0 @@ -311,25 +330,29 @@ last_added = new_blood_level - affected_mob.blood_volume affected_mob.blood_volume = new_blood_level + (extra_regen * REM * seconds_per_tick) if(SPT_PROB(18, seconds_per_tick)) - affected_mob.adjustBruteLoss(-0.5, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustFireLoss(-0.5, FALSE, required_bodytype = affected_bodytype) - . = TRUE - ..() + need_mob_update = affected_mob.adjustBruteLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_biotype) + need_mob_update += affected_mob.adjustFireLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/salglu_solution/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update if(SPT_PROB(1.5, seconds_per_tick)) - to_chat(affected_mob, span_warning("You feel salty.")) - holder.add_reagent(/datum/reagent/consumable/salt, 1) - holder.remove_reagent(/datum/reagent/medicine/salglu_solution, 0.5) + if(holder) + to_chat(affected_mob, 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(SPT_PROB(1.5, seconds_per_tick)) - to_chat(affected_mob, span_warning("You feel sweet.")) - holder.add_reagent(/datum/reagent/consumable/sugar, 1) - holder.remove_reagent(/datum/reagent/medicine/salglu_solution, 0.5) + if(holder) + to_chat(affected_mob, span_warning("You feel sweet.")) + holder.add_reagent(/datum/reagent/consumable/sugar, 1) + holder.remove_reagent(/datum/reagent/medicine/salglu_solution, 0.5) if(SPT_PROB(18, seconds_per_tick)) - affected_mob.adjustBruteLoss(0.5, FALSE, FALSE, BODYTYPE_ORGANIC) - affected_mob.adjustFireLoss(0.5, FALSE, FALSE, BODYTYPE_ORGANIC) - . = TRUE - ..() + need_mob_update = affected_mob.adjustBruteLoss(0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_biotype) + need_mob_update += affected_mob.adjustFireLoss(0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/mine_salve name = "Miner's Salve" @@ -338,13 +361,15 @@ color = "#6D6374" metabolization_rate = 0.4 * REAGENTS_METABOLISM ph = 2.6 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_AFFECTS_WOUNDS /datum/reagent/medicine/mine_salve/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustBruteLoss(-0.25 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustFireLoss(-0.25 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - ..() - return TRUE + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustBruteLoss(-0.25 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-0.25 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/mine_salve/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE) . = ..() @@ -364,13 +389,17 @@ if(show_message) to_chat(exposed_carbon, span_danger("You feel your injuries fade away to nothing!") ) -/datum/reagent/medicine/mine_salve/on_mob_metabolize(mob/living/metabolizer) +/datum/reagent/medicine/mine_salve/on_mob_metabolize(mob/living/affected_mob) . = ..() - metabolizer.apply_status_effect(/datum/status_effect/grouped/screwy_hud/fake_healthy, type) + affected_mob.apply_status_effect(/datum/status_effect/grouped/screwy_hud/fake_healthy, type) -/datum/reagent/medicine/mine_salve/on_mob_end_metabolize(mob/living/metabolizer) +/datum/reagent/medicine/mine_salve/on_mob_end_metabolize(mob/living/affected_mob) . = ..() - metabolizer.remove_status_effect(/datum/status_effect/grouped/screwy_hud/fake_healthy, type) + affected_mob.remove_status_effect(/datum/status_effect/grouped/screwy_hud/fake_healthy, type) + +/datum/reagent/medicine/mine_salve/on_burn_wound_processing(datum/wound/burn/flesh/burn_wound) + burn_wound.sanitization += 0.3 + burn_wound.flesh_healing += 0.5 /datum/reagent/medicine/omnizine name = "Omnizine" @@ -384,20 +413,24 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/omnizine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustToxLoss(-healing * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustOxyLoss(-healing * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustBruteLoss(-healing * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustFireLoss(-healing * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - ..() - . = TRUE + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustToxLoss(-healing * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustOxyLoss(-healing * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustBruteLoss(-healing * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-healing * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/omnizine/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustToxLoss(1.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustOxyLoss(1.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustBruteLoss(1.5 * REM * seconds_per_tick, FALSE, FALSE, BODYTYPE_ORGANIC) - affected_mob.adjustFireLoss(1.5 * REM * seconds_per_tick, FALSE, FALSE, BODYTYPE_ORGANIC) - ..() - . = TRUE + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustToxLoss(1.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustOxyLoss(1.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustBruteLoss(1.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(1.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/omnizine/protozine name = "Protozine" @@ -419,21 +452,21 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/calomel/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() for(var/datum/reagent/target_reagent in affected_mob.reagents.reagent_list) if(istype(target_reagent, /datum/reagent/medicine/calomel)) continue affected_mob.reagents.remove_reagent(target_reagent.type, 3 * REM * seconds_per_tick) var/toxin_amount = round(affected_mob.health / 40, 0.1) - affected_mob.adjustToxLoss(toxin_amount * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - return TRUE + if(affected_mob.adjustToxLoss(toxin_amount * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/calomel/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() for(var/datum/reagent/medicine/calomel/target_reagent in affected_mob.reagents.reagent_list) affected_mob.reagents.remove_reagent(target_reagent.type, 2 * REM * seconds_per_tick) - affected_mob.adjustToxLoss(2.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - return TRUE + if(affected_mob.adjustToxLoss(2.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/ammoniated_mercury name = "Ammoniated Mercury" @@ -449,22 +482,22 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/ammoniated_mercury/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() var/toxin_chem_amount = 0 for(var/datum/reagent/toxin/target_reagent in affected_mob.reagents.reagent_list) toxin_chem_amount += 1 affected_mob.reagents.remove_reagent(target_reagent.type, 5 * REM * seconds_per_tick) var/toxin_amount = round(affected_mob.getBruteLoss() / 15, 0.1) + round(affected_mob.getFireLoss() / 30, 0.1) - 3 - affected_mob.adjustToxLoss(toxin_amount * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + if(affected_mob.adjustToxLoss(toxin_amount * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH if(toxin_chem_amount == 0) for(var/datum/reagent/medicine/ammoniated_mercury/target_reagent in affected_mob.reagents.reagent_list) affected_mob.reagents.remove_reagent(target_reagent.type, 1 * REM * seconds_per_tick) - ..() - return TRUE /datum/reagent/medicine/ammoniated_mercury/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustToxLoss(3 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - return TRUE + . = ..() + if(affected_mob.adjustToxLoss(3 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/potass_iodide name = "Potassium Iodide" @@ -480,14 +513,14 @@ ADD_TRAIT(affected_mob, TRAIT_HALT_RADIATION_EFFECTS, "[type]") /datum/reagent/medicine/potass_iodide/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_HALT_RADIATION_EFFECTS, "[type]") - return ..() /datum/reagent/medicine/potass_iodide/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if (HAS_TRAIT(affected_mob, TRAIT_IRRADIATED)) - affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, required_biotype = affected_biotype) - - ..() + . = ..() + if(HAS_TRAIT(affected_mob, TRAIT_IRRADIATED)) + if(affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/pen_acid name = "Pentetic Acid" @@ -503,16 +536,16 @@ ADD_TRAIT(affected_mob, TRAIT_HALT_RADIATION_EFFECTS, "[type]") /datum/reagent/medicine/pen_acid/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_HALT_RADIATION_EFFECTS, "[type]") - return ..() /datum/reagent/medicine/pen_acid/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustToxLoss(-2 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + . = ..() + if(affected_mob.adjustToxLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH for(var/datum/reagent/R in affected_mob.reagents.reagent_list) if(R != src) affected_mob.reagents.remove_reagent(R.type, 2 * REM * seconds_per_tick) - ..() - . = TRUE /datum/reagent/medicine/sal_acid name = "Salicylic Acid" @@ -525,18 +558,20 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/sal_acid/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update if(affected_mob.getBruteLoss() > 25) - affected_mob.adjustBruteLoss(-4 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) + need_mob_update = affected_mob.adjustBruteLoss(-4 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) else - affected_mob.adjustBruteLoss(-0.5 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - ..() - . = TRUE + need_mob_update = affected_mob.adjustBruteLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/sal_acid/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.getBruteLoss()) //It only makes existing bruises worse - affected_mob.adjustBruteLoss(4.5 * REM * seconds_per_tick, FALSE, FALSE, BODYTYPE_ORGANIC) // it's going to be healing either 4 or 0.5 - . = TRUE - ..() + if(affected_mob.adjustBruteLoss(4.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC)) // it's going to be healing either 4 or 0.5 + return UPDATE_MOB_HEALTH /datum/reagent/medicine/salbutamol name = "Salbutamol" @@ -548,14 +583,17 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/salbutamol/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOxyLoss(-3 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustOxyLoss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) if(affected_mob.losebreath >= 4) var/obj/item/organ/internal/lungs/affected_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) var/our_respiration_type = affected_lungs ? affected_lungs.respiration_type : affected_mob.mob_respiration_type // use lungs' respiration type or mob_respiration_type if no lungs if(our_respiration_type & affected_respiration_type) affected_mob.losebreath -= 2 * REM * seconds_per_tick - ..() - . = TRUE + need_mob_update = TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/ephedrine name = "Ephedrine" @@ -572,28 +610,29 @@ inverse_chem_val = 0.4 /datum/reagent/medicine/ephedrine/on_mob_metabolize(mob/living/affected_mob) - ..() + . = ..() affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine) ADD_TRAIT(affected_mob, TRAIT_BATON_RESISTANCE, type) /datum/reagent/medicine/ephedrine/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() affected_mob.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine) REMOVE_TRAIT(affected_mob, TRAIT_BATON_RESISTANCE, type) - ..() /datum/reagent/medicine/ephedrine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(SPT_PROB(10 * (1-creation_purity), seconds_per_tick) && iscarbon(affected_mob)) + . = ..() + if(SPT_PROB(10 * (1.5-creation_purity), seconds_per_tick) && iscarbon(affected_mob)) var/obj/item/I = affected_mob.get_active_held_item() if(I && affected_mob.dropItemToGround(I)) to_chat(affected_mob, span_notice("Your hands spaz out and you drop what you were holding!")) affected_mob.set_jitter_if_lower(20 SECONDS) affected_mob.AdjustAllImmobility(-20 * REM * seconds_per_tick * normalise_creation_purity()) - affected_mob.adjustStaminaLoss(-1 * REM * seconds_per_tick * normalise_creation_purity(), FALSE) - ..() - return TRUE + affected_mob.adjustStaminaLoss(-1 * REM * seconds_per_tick * normalise_creation_purity(), updating_stamina = FALSE) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/ephedrine/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(1 * (1 + (1-normalise_creation_purity())), seconds_per_tick) && iscarbon(affected_mob)) var/datum/disease/D = new /datum/disease/heart_failure affected_mob.ForceContractDisease(D) @@ -604,10 +643,9 @@ to_chat(affected_mob, 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.")]")) if(SPT_PROB(18 * (1 + (1-normalise_creation_purity())), seconds_per_tick)) - affected_mob.adjustToxLoss(1, FALSE, required_biotype = affected_biotype) + affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) affected_mob.losebreath++ - . = TRUE - return TRUE + return UPDATE_MOB_HEALTH /datum/reagent/medicine/diphenhydramine name = "Diphenhydramine" @@ -623,7 +661,7 @@ affected_mob.adjust_drowsiness(2 SECONDS) affected_mob.adjust_jitter(-2 SECONDS * REM * seconds_per_tick) holder.remove_reagent(/datum/reagent/toxin/histamine, 3 * REM * seconds_per_tick) - ..() + return ..() /datum/reagent/medicine/morphine name = "Morphine" @@ -637,32 +675,31 @@ addiction_types = list(/datum/addiction/opioids = 10) /datum/reagent/medicine/morphine/on_mob_metabolize(mob/living/affected_mob) - ..() + . = ..() affected_mob.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) /datum/reagent/medicine/morphine/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() affected_mob.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) - ..() /datum/reagent/medicine/morphine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(current_cycle >= 5) + . = ..() + if(current_cycle > 5) affected_mob.add_mood_event("numb", /datum/mood_event/narcotic_medium, name) switch(current_cycle) - if(11) + if(12) to_chat(affected_mob, span_warning("You start to feel tired...") ) - if(12 to 24) + if(13 to 25) affected_mob.adjust_drowsiness(2 SECONDS * REM * seconds_per_tick) - if(24 to INFINITY) + if(25 to INFINITY) affected_mob.Sleeping(40 * REM * seconds_per_tick) - . = TRUE - ..() /datum/reagent/medicine/morphine/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(18, seconds_per_tick)) affected_mob.drop_all_held_items() affected_mob.set_dizzy_if_lower(4 SECONDS) affected_mob.set_jitter_if_lower(4 SECONDS) - ..() /datum/reagent/medicine/oculine @@ -714,15 +751,17 @@ restore_eyesight(prev_affected_mob, eyes) /datum/reagent/medicine/oculine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() var/normalized_purity = normalise_creation_purity() affected_mob.adjust_temp_blindness(-4 SECONDS * REM * seconds_per_tick * normalized_purity) affected_mob.adjust_eye_blur(-4 SECONDS * REM * seconds_per_tick * normalized_purity) var/obj/item/organ/internal/eyes/eyes = affected_mob.get_organ_slot(ORGAN_SLOT_EYES) if(eyes) // Healing eye damage will cure nearsightedness and blindness from ... eye damage - eyes.apply_organ_damage(-2 * REM * seconds_per_tick * normalise_creation_purity(), required_organtype = affected_organtype) + if(eyes.apply_organ_damage(-2 * REM * seconds_per_tick * normalise_creation_purity(), required_organ_flag = affected_organ_flags)) + . = UPDATE_MOB_HEALTH // If our eyes are seriously damaged, we have a probability of causing eye blur while healing depending on purity - if(eyes.damaged && SPT_PROB(16 - min(normalized_purity * 6, 12), seconds_per_tick)) + if(eyes.damaged && IS_ORGANIC_ORGAN(eyes) && SPT_PROB(16 - min(normalized_purity * 6, 12), seconds_per_tick)) // While healing, gives some eye blur if(affected_mob.is_blind_from(EYE_DAMAGE)) to_chat(affected_mob, span_warning("Your vision slowly returns...")) @@ -731,14 +770,12 @@ to_chat(affected_mob, span_warning("The blackness in your peripheral vision begins to fade.")) affected_mob.adjust_eye_blur(5 SECONDS) - return ..() - /datum/reagent/medicine/oculine/on_mob_delete(mob/living/affected_mob) + . = ..() var/obj/item/organ/internal/eyes/eyes = affected_mob.get_organ_slot(ORGAN_SLOT_EYES) if(!eyes) return restore_eyesight(affected_mob, eyes) - ..() /datum/reagent/medicine/inacusiate name = "Inacusiate" @@ -766,11 +803,12 @@ message = composer.compose_message(affected_mob, message_language, message, null, spans, message_mods) /datum/reagent/medicine/inacusiate/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() var/obj/item/organ/internal/ears/ears = affected_mob.get_organ_slot(ORGAN_SLOT_EARS) if(!ears) - return ..() + return ears.adjustEarDamage(-4 * REM * seconds_per_tick * normalise_creation_purity(), -4 * REM * seconds_per_tick * normalise_creation_purity()) - ..() + return UPDATE_MOB_HEALTH /datum/reagent/medicine/inacusiate/on_mob_delete(mob/living/affected_mob) . = ..() @@ -791,16 +829,19 @@ ADD_TRAIT(affected_mob, TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION, "[type]") /datum/reagent/medicine/atropine/on_mob_delete(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION, "[type]") - return ..() /datum/reagent/medicine/atropine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.health <= affected_mob.crit_threshold) - affected_mob.adjustToxLoss(-2 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustBruteLoss(-2* REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustFireLoss(-2 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustOxyLoss(-5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - . = TRUE + var/need_mob_update + need_mob_update = affected_mob.adjustToxLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustBruteLoss(-2* REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustOxyLoss(-5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + if(need_mob_update) + . = UPDATE_MOB_HEALTH var/obj/item/organ/internal/lungs/affected_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) var/our_respiration_type = affected_lungs ? affected_lungs.respiration_type : affected_mob.mob_respiration_type if(our_respiration_type & affected_respiration_type) @@ -808,14 +849,13 @@ if(SPT_PROB(10, seconds_per_tick)) affected_mob.set_dizzy_if_lower(10 SECONDS) affected_mob.set_jitter_if_lower(10 SECONDS) - ..() /datum/reagent/medicine/atropine/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustToxLoss(0.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - . = TRUE + . = ..() + if(affected_mob.adjustToxLoss(0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH affected_mob.set_dizzy_if_lower(2 SECONDS * REM * seconds_per_tick) affected_mob.set_jitter_if_lower(2 SECONDS * REM * seconds_per_tick) - ..() /datum/reagent/medicine/epinephrine name = "Epinephrine" @@ -827,50 +867,59 @@ ph = 10.2 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/medicine/epinephrine/on_mob_metabolize(mob/living/carbon/affected_mob) - ..() +/datum/reagent/medicine/epinephrine/on_mob_metabolize(mob/living/affected_mob) + . = ..() ADD_TRAIT(affected_mob, TRAIT_NOCRITDAMAGE, type) -/datum/reagent/medicine/epinephrine/on_mob_end_metabolize(mob/living/carbon/affected_mob) +/datum/reagent/medicine/epinephrine/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_NOCRITDAMAGE, type) - ..() /datum/reagent/medicine/epinephrine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - . = TRUE if(holder.has_reagent(/datum/reagent/toxin/lexorin)) holder.remove_reagent(/datum/reagent/toxin/lexorin, 2 * REM * seconds_per_tick) holder.remove_reagent(/datum/reagent/medicine/epinephrine, 1 * REM * seconds_per_tick) if(SPT_PROB(10, seconds_per_tick)) holder.add_reagent(/datum/reagent/toxin/histamine, 4) - ..() - return + return ..() + + . = ..() + + var/need_mob_update if(affected_mob.health <= affected_mob.crit_threshold) - affected_mob.adjustToxLoss(-0.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustBruteLoss(-0.5 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustFireLoss(-0.5 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustOxyLoss(-0.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update = affected_mob.adjustToxLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustBruteLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustOxyLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) if(affected_mob.losebreath >= 4) var/obj/item/organ/internal/lungs/affected_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) var/our_respiration_type = affected_lungs ? affected_lungs.respiration_type : affected_mob.mob_respiration_type if(our_respiration_type & affected_respiration_type) affected_mob.losebreath -= 2 * REM * seconds_per_tick + need_mob_update = TRUE if(affected_mob.losebreath < 0) affected_mob.losebreath = 0 - affected_mob.adjustStaminaLoss(-0.5 * REM * seconds_per_tick, 0) + need_mob_update = TRUE + need_mob_update += affected_mob.adjustStaminaLoss(-0.5 * REM * seconds_per_tick, updating_stamina = FALSE) if(SPT_PROB(10, seconds_per_tick)) affected_mob.AdjustAllImmobility(-20) - ..() + need_mob_update = TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/epinephrine/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(18, REM * seconds_per_tick)) - affected_mob.adjustStaminaLoss(2.5, 0) - affected_mob.adjustToxLoss(1, FALSE, required_biotype = affected_biotype) + var/need_mob_update + need_mob_update = affected_mob.adjustStaminaLoss(2.5 * REM * seconds_per_tick, updating_stamina = FALSE) + need_mob_update += affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) var/obj/item/organ/internal/lungs/affected_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) var/our_respiration_type = affected_lungs ? affected_lungs.respiration_type : affected_mob.mob_respiration_type if(our_respiration_type & affected_respiration_type) affected_mob.losebreath++ - . = TRUE - ..() + need_mob_update = TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/strange_reagent name = "Strange Reagent" @@ -972,10 +1021,13 @@ return ..() /datum/reagent/medicine/strange_reagent/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() var/damage_at_random = rand(0, 250)/100 //0 to 2.5 - affected_mob.adjustBruteLoss(damage_at_random * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustFireLoss(damage_at_random * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - return ..() + var/need_mob_update + need_mob_update = affected_mob.adjustBruteLoss(damage_at_random * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(damage_at_random * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/mannitol name = "Mannitol" @@ -990,8 +1042,9 @@ inverse_chem_val = 0.45 /datum/reagent/medicine/mannitol/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -2 * REM * seconds_per_tick * normalise_creation_purity(), required_organtype = affected_organtype) - ..() + . = ..() + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -2 * REM * seconds_per_tick * normalise_creation_purity(), required_organ_flag = affected_organ_flags)) + return UPDATE_MOB_HEALTH //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/affected_mob) @@ -999,13 +1052,15 @@ ADD_TRAIT(affected_mob, TRAIT_TUMOR_SUPPRESSED, TRAIT_GENERIC) /datum/reagent/medicine/mannitol/on_mob_end_metabolize(mob/living/carbon/affected_mob) - REMOVE_TRAIT(affected_mob, TRAIT_TUMOR_SUPPRESSED, TRAIT_GENERIC) . = ..() + REMOVE_TRAIT(affected_mob, TRAIT_TUMOR_SUPPRESSED, TRAIT_GENERIC) /datum/reagent/medicine/mannitol/overdose_start(mob/living/affected_mob) + . = ..() to_chat(affected_mob, span_notice("You suddenly feel E N L I G H T E N E D!")) /datum/reagent/medicine/mannitol/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(65, seconds_per_tick)) return var/list/tips @@ -1017,7 +1072,6 @@ tips = world.file2list("strings/chemistrytips.txt") var/message = pick(tips) send_tip_of_the_round(affected_mob, message) - return ..() /datum/reagent/medicine/neurine name = "Neurine" @@ -1053,11 +1107,12 @@ holder.remove_reagent(/datum/reagent/consumable/ethanol/neurotoxin, 5 * REM * seconds_per_tick * normalise_creation_purity()) if(SPT_PROB(8 * normalise_creation_purity(), seconds_per_tick)) affected_mob.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC) - ..() + return ..() /datum/reagent/medicine/neurine/on_mob_dead(mob/living/carbon/affected_mob, seconds_per_tick) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * REM * seconds_per_tick * normalise_creation_purity(), required_organtype = affected_organtype) - ..() + . = ..() + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * REM * seconds_per_tick * normalise_creation_purity(), required_organ_flag = affected_organ_flags)) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/mutadone name = "Mutadone" @@ -1068,11 +1123,10 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/mutadone/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.remove_status_effect(/datum/status_effect/jitter) if(affected_mob.has_dna()) affected_mob.dna.remove_all_mutations(list(MUT_NORMAL, MUT_EXTRA), TRUE) - if(!QDELETED(affected_mob)) //We were a monkey, now a human - ..() /datum/reagent/medicine/antihol name = "Antihol" @@ -1094,13 +1148,21 @@ ) /datum/reagent/medicine/antihol/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() for(var/effect in status_effects_to_clear) affected_mob.remove_status_effect(effect) affected_mob.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 3 * REM * seconds_per_tick * normalise_creation_purity(), FALSE, TRUE) - affected_mob.adjustToxLoss(-0.2 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + if(affected_mob.adjustToxLoss(-0.2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH affected_mob.adjust_drunk_effect(-10 * REM * seconds_per_tick * normalise_creation_purity()) - ..() - . = TRUE + +/datum/reagent/medicine/antihol/expose_mob(mob/living/carbon/exposed_carbon, methods=TOUCH, reac_volume) + . = ..() + if(!(methods & (TOUCH|VAPOR|PATCH))) + return + + for(var/datum/surgery/surgery as anything in exposed_carbon.surgeries) + surgery.speed_modifier = max(surgery.speed_modifier - 0.1, -0.9) /datum/reagent/medicine/stimulants name = "Stimulants" @@ -1113,33 +1175,35 @@ addiction_types = list(/datum/addiction/stimulants = 4) //0.8 per 2 seconds /datum/reagent/medicine/stimulants/on_mob_metabolize(mob/living/affected_mob) - ..() + . = ..() affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/reagent/stimulants) ADD_TRAIT(affected_mob, TRAIT_BATON_RESISTANCE, type) /datum/reagent/medicine/stimulants/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() affected_mob.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/stimulants) REMOVE_TRAIT(affected_mob, TRAIT_BATON_RESISTANCE, type) - ..() /datum/reagent/medicine/stimulants/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.health < 50 && affected_mob.health > 0) - affected_mob.adjustOxyLoss(-1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustBruteLoss(-1 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustFireLoss(-1 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) + var/need_mob_update + need_mob_update += affected_mob.adjustOxyLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustBruteLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + . = UPDATE_MOB_HEALTH affected_mob.AdjustAllImmobility(-60 * REM * seconds_per_tick) - affected_mob.adjustStaminaLoss(-5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - . = TRUE + affected_mob.adjustStaminaLoss(-5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) /datum/reagent/medicine/stimulants/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(18, seconds_per_tick)) - affected_mob.adjustStaminaLoss(2.5, FALSE, required_biotype = affected_biotype) - affected_mob.adjustToxLoss(1, FALSE, required_biotype = affected_biotype) + affected_mob.adjustStaminaLoss(2.5, updating_stamina = FALSE, required_biotype = affected_biotype) + affected_mob.adjustToxLoss(1, updating_health = FALSE, required_biotype = affected_biotype) affected_mob.losebreath++ - . = TRUE - ..() + return UPDATE_MOB_HEALTH /datum/reagent/medicine/insulin name = "Insulin" @@ -1151,10 +1215,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/insulin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(affected_mob.AdjustSleeping(-20 * REM * seconds_per_tick)) - . = TRUE + affected_mob.AdjustSleeping(-20 * REM * seconds_per_tick) holder.remove_reagent(/datum/reagent/consumable/sugar, 3 * REM * seconds_per_tick) - ..() + return ..() //Trek Chems, used primarily by medibots. Only heals a specific damage type, but is very efficient. @@ -1167,9 +1230,10 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/medicine/inaprovaline/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.losebreath >= 5) affected_mob.losebreath -= 5 * REM * seconds_per_tick - ..() + return UPDATE_MOB_HEALTH /datum/reagent/medicine/regen_jelly name = "Regenerative Jelly" @@ -1187,17 +1251,18 @@ return 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() + exposed_human.set_facial_haircolor(color, update = FALSE) + exposed_human.set_haircolor(color, update = TRUE) /datum/reagent/medicine/regen_jelly/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustBruteLoss(-1.5 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustFireLoss(-1.5 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustOxyLoss(-1.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustToxLoss(-1.5 * REM * seconds_per_tick, FALSE, TRUE, affected_biotype) //heals TOXINLOVERs - ..() - . = TRUE + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustBruteLoss(-1.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-1.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustOxyLoss(-1.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustToxLoss(-1.5 * REM * seconds_per_tick, updating_health = FALSE, forced = TRUE, required_biotype = affected_biotype) //heals TOXINLOVERs + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/syndicate_nanites //Used exclusively by Syndicate medical cyborgs name = "Restorative Nanites" @@ -1209,21 +1274,22 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustBruteLoss(-5 * REM * seconds_per_tick, FALSE) //A ton of healing - this is a 50 telecrystal investment. - affected_mob.adjustFireLoss(-5 * REM * seconds_per_tick, FALSE) - affected_mob.adjustOxyLoss(-15 * REM * seconds_per_tick, FALSE) - affected_mob.adjustToxLoss(-5 * REM * seconds_per_tick, FALSE) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15 * REM * seconds_per_tick) - affected_mob.adjustCloneLoss(-3 * REM * seconds_per_tick, FALSE) - ..() - . = TRUE + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustBruteLoss(-5 * REM * seconds_per_tick, updating_health = FALSE) //A ton of healing - this is a 50 telecrystal investment. + need_mob_update += affected_mob.adjustFireLoss(-5 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjustOxyLoss(-15 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjustToxLoss(-5 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15 * REM * seconds_per_tick) + need_mob_update += affected_mob.adjustCloneLoss(-3 * REM * seconds_per_tick, updating_health = FALSE) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/syndicate_nanites/overdose_process(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) //wtb flavortext messages that hint that you're vomitting up robots + . = ..() if(SPT_PROB(13, seconds_per_tick)) affected_mob.reagents.remove_reagent(type, metabolization_rate*15) // ~5 units at a rate of 0.4 but i wanted a nice number in code - affected_mob.vomit(20) // nanite safety protocols make your body expel them to prevent harmies - ..() - . = TRUE + affected_mob.vomit(vomit_flags = VOMIT_CATEGORY_DEFAULT, vomit_type = /obj/effect/decal/cleanable/vomit/nanites, lost_nutrition = 20) // nanite safety protocols make your body expel them to prevent harmies /datum/reagent/medicine/earthsblood //Created by ambrosia gaia plants name = "Earthsblood" @@ -1236,48 +1302,53 @@ addiction_types = list(/datum/addiction/hallucinogens = 14) /datum/reagent/medicine/earthsblood/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(current_cycle <= 25) //10u has to be processed before u get into THE FUN ZONE - affected_mob.adjustBruteLoss(-1 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustFireLoss(-1 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustOxyLoss(-0.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustToxLoss(-0.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustCloneLoss(-0.1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustStaminaLoss(-0.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1 * REM * seconds_per_tick, 150, affected_organtype) //This does, after all, come from ambrosia, and the most powerful ambrosia in existence, at that! + . = ..() + var/need_mob_update + if(current_cycle < 25) //10u has to be processed before u get into THE FUN ZONE + need_mob_update = affected_mob.adjustBruteLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustOxyLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustToxLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustCloneLoss(-0.1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustStaminaLoss(-0.5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1 * REM * seconds_per_tick, 150, affected_organ_flags) //This does, after all, come from ambrosia, and the most powerful ambrosia in existence, at that! else - affected_mob.adjustBruteLoss(-5 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) //slow to start, but very quick healing once it gets going - affected_mob.adjustFireLoss(-5 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustOxyLoss(-3 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustToxLoss(-3 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustCloneLoss(-1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustStaminaLoss(-3 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + need_mob_update = affected_mob.adjustBruteLoss(-5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) //slow to start, but very quick healing once it gets going + need_mob_update += affected_mob.adjustFireLoss(-5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustOxyLoss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustToxLoss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustCloneLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustStaminaLoss(-3 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2 * REM * seconds_per_tick, 150, affected_organ_flags) affected_mob.adjust_jitter_up_to(6 SECONDS * REM * seconds_per_tick, 1 MINUTES) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2 * REM * seconds_per_tick, 150, affected_organtype) if(SPT_PROB(5, seconds_per_tick)) affected_mob.say(return_hippie_line(), forced = /datum/reagent/medicine/earthsblood) affected_mob.adjust_drugginess_up_to(20 SECONDS * REM * seconds_per_tick, 30 SECONDS * REM * seconds_per_tick) - ..() - . = TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/earthsblood/on_mob_metabolize(mob/living/affected_mob) - ..() + . = ..() ADD_TRAIT(affected_mob, TRAIT_PACIFISM, type) /datum/reagent/medicine/earthsblood/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_PACIFISM, type) - ..() /datum/reagent/medicine/earthsblood/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_hallucinations_up_to(10 SECONDS * REM * seconds_per_tick, 120 SECONDS) - if(current_cycle > 25) - affected_mob.adjustToxLoss(4 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - if(current_cycle > 100) //podpeople get out reeeeeeeeeeeeeeeeeeeee - affected_mob.adjustToxLoss(6 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + var/need_mob_update + if(current_cycle > 26) + need_mob_update = affected_mob.adjustToxLoss(4 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + if(current_cycle > 101) //podpeople get out reeeeeeeeeeeeeeeeeeeee + need_mob_update += affected_mob.adjustToxLoss(6 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) if(iscarbon(affected_mob)) var/mob/living/carbon/hippie = affected_mob hippie.gain_trauma(/datum/brain_trauma/severe/pacifism) - ..() - . = TRUE + + if(need_mob_update) + return UPDATE_MOB_HEALTH /// Returns a hippie-esque string for the person affected by the reagent to say. /datum/reagent/medicine/earthsblood/proc/return_hippie_line() @@ -1303,6 +1374,7 @@ harmful = TRUE /datum/reagent/medicine/haloperidol/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() for(var/datum/reagent/drug/R in affected_mob.reagents.reagent_list) affected_mob.reagents.remove_reagent(R.type, 5 * REM * seconds_per_tick) affected_mob.adjust_drowsiness(4 SECONDS * REM * seconds_per_tick) @@ -1313,11 +1385,12 @@ if (affected_mob.get_timed_status_effect_duration(/datum/status_effect/hallucination) >= 10 SECONDS) affected_mob.adjust_hallucinations(-10 SECONDS * REM * seconds_per_tick) + var/need_mob_update = FALSE if(SPT_PROB(10, seconds_per_tick)) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1, 50, affected_organtype) - affected_mob.adjustStaminaLoss(2.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - return TRUE + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1, 50, affected_organ_flags) + need_mob_update += affected_mob.adjustStaminaLoss(2.5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH //used for changeling's adrenaline power /datum/reagent/medicine/changelingadrenaline @@ -1328,29 +1401,29 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/medicine/changelingadrenaline/on_mob_life(mob/living/carbon/metabolizer, seconds_per_tick, times_fired) - ..() + . = ..() metabolizer.AdjustAllImmobility(-20 * REM * seconds_per_tick) - metabolizer.adjustStaminaLoss(-10 * REM * seconds_per_tick, 0) + if(metabolizer.adjustStaminaLoss(-10 * REM * seconds_per_tick, updating_stamina = FALSE)) + . = UPDATE_MOB_HEALTH metabolizer.set_jitter_if_lower(20 SECONDS * REM * seconds_per_tick) metabolizer.set_dizzy_if_lower(20 SECONDS * REM * seconds_per_tick) - return TRUE /datum/reagent/medicine/changelingadrenaline/on_mob_metabolize(mob/living/affected_mob) - ..() + . = ..() affected_mob.add_traits(list(TRAIT_SLEEPIMMUNE, TRAIT_BATON_RESISTANCE), type) affected_mob.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) /datum/reagent/medicine/changelingadrenaline/on_mob_end_metabolize(mob/living/affected_mob) - ..() + . = ..() affected_mob.remove_traits(list(TRAIT_SLEEPIMMUNE, TRAIT_BATON_RESISTANCE), type) affected_mob.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) affected_mob.remove_status_effect(/datum/status_effect/dizziness) affected_mob.remove_status_effect(/datum/status_effect/jitter) /datum/reagent/medicine/changelingadrenaline/overdose_process(mob/living/metabolizer, seconds_per_tick, times_fired) - metabolizer.adjustToxLoss(1 * REM * seconds_per_tick, FALSE) - ..() - return TRUE + . = ..() + if(metabolizer.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/changelinghaste name = "Changeling Haste" @@ -1360,17 +1433,17 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/medicine/changelinghaste/on_mob_metabolize(mob/living/affected_mob) - ..() + . = ..() affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste) /datum/reagent/medicine/changelinghaste/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() affected_mob.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste) - ..() /datum/reagent/medicine/changelinghaste/on_mob_life(mob/living/carbon/metabolizer, seconds_per_tick, times_fired) - metabolizer.adjustToxLoss(2 * REM * seconds_per_tick, FALSE) - ..() - return TRUE + . = ..() + if(metabolizer.adjustToxLoss(2 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/higadrite name = "Higadrite" @@ -1384,7 +1457,7 @@ ADD_TRAIT(affected_mob, TRAIT_STABLELIVER, type) /datum/reagent/medicine/higadrite/on_mob_end_metabolize(mob/living/affected_mob) - ..() + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_STABLELIVER, type) /datum/reagent/medicine/cordiolis_hepatico @@ -1395,11 +1468,11 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/medicine/cordiolis_hepatico/on_mob_add(mob/living/affected_mob) - ..() + . = ..() affected_mob.add_traits(list(TRAIT_STABLELIVER, TRAIT_STABLEHEART), type) /datum/reagent/medicine/cordiolis_hepatico/on_mob_end_metabolize(mob/living/affected_mob) - ..() + . = ..() affected_mob.remove_traits(list(TRAIT_STABLELIVER, TRAIT_STABLEHEART), type) /datum/reagent/medicine/muscle_stimulant @@ -1428,29 +1501,32 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/modafinil/on_mob_metabolize(mob/living/affected_mob) + . = ..() ADD_TRAIT(affected_mob, TRAIT_SLEEPIMMUNE, type) - ..() /datum/reagent/medicine/modafinil/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_SLEEPIMMUNE, type) - ..() /datum/reagent/medicine/modafinil/on_mob_life(mob/living/carbon/metabolizer, seconds_per_tick, times_fired) + . = ..() if(!overdosed) // We do not want any effects on OD overdose_threshold = overdose_threshold + ((rand(-10, 10) / 10) * REM * seconds_per_tick) // for extra fun metabolizer.AdjustAllImmobility(-5 * REM * seconds_per_tick) - metabolizer.adjustStaminaLoss(-0.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + metabolizer.adjustStaminaLoss(-0.5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) metabolizer.set_jitter_if_lower(1 SECONDS * REM * seconds_per_tick) metabolization_rate = 0.005 * REAGENTS_METABOLISM * rand(5, 20) // randomizes metabolism between 0.02 and 0.08 per second - . = TRUE - ..() + return UPDATE_MOB_HEALTH /datum/reagent/medicine/modafinil/overdose_start(mob/living/affected_mob) + . = ..() to_chat(affected_mob, 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/affected_mob, seconds_per_tick, times_fired) + . = ..() overdose_progress++ + var/need_mob_update switch(overdose_progress) if(1 to 40) affected_mob.adjust_jitter_up_to(2 SECONDS * REM * seconds_per_tick, 20 SECONDS) @@ -1458,29 +1534,31 @@ affected_mob.set_dizzy_if_lower(10 SECONDS * REM * seconds_per_tick) if(SPT_PROB(30, seconds_per_tick)) affected_mob.losebreath++ + need_mob_update = TRUE if(41 to 80) - affected_mob.adjustOxyLoss(0.1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustStaminaLoss(0.1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + need_mob_update = affected_mob.adjustOxyLoss(0.1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustStaminaLoss(0.1 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) affected_mob.adjust_jitter_up_to(2 SECONDS * REM * seconds_per_tick, 40 SECONDS) affected_mob.adjust_stutter_up_to(2 SECONDS * REM * seconds_per_tick, 40 SECONDS) affected_mob.set_dizzy_if_lower(20 SECONDS * REM * seconds_per_tick) if(SPT_PROB(30, seconds_per_tick)) affected_mob.losebreath++ + need_mob_update = TRUE if(SPT_PROB(10, seconds_per_tick)) to_chat(affected_mob, span_userdanger("You have a sudden fit!")) affected_mob.emote("moan") affected_mob.Paralyze(20) // you should be in a bad spot at this point unless epipen has been used if(81) to_chat(affected_mob, span_userdanger("You feel too exhausted to continue!")) // at this point you will eventually die unless you get charcoal - affected_mob.adjustOxyLoss(0.1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustStaminaLoss(0.1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + need_mob_update = affected_mob.adjustOxyLoss(0.1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustStaminaLoss(0.1 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) if(82 to INFINITY) REMOVE_TRAIT(affected_mob, TRAIT_SLEEPIMMUNE, type) affected_mob.Sleeping(100 * REM * seconds_per_tick) - affected_mob.adjustOxyLoss(1.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustStaminaLoss(1.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - return TRUE + need_mob_update += affected_mob.adjustOxyLoss(1.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustStaminaLoss(1.5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/psicodine name = "Psicodine" @@ -1493,28 +1571,27 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/psicodine/on_mob_metabolize(mob/living/affected_mob) - ..() + . = ..() ADD_TRAIT(affected_mob, TRAIT_FEARLESS, type) /datum/reagent/medicine/psicodine/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_FEARLESS, type) - ..() /datum/reagent/medicine/psicodine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_jitter(-12 SECONDS * REM * seconds_per_tick) affected_mob.adjust_dizzy(-12 SECONDS * REM * seconds_per_tick) affected_mob.adjust_confusion(-6 SECONDS * REM * seconds_per_tick) affected_mob.disgust = max(affected_mob.disgust - (6 * REM * seconds_per_tick), 0) if(affected_mob.mob_mood != null && affected_mob.mob_mood.sanity <= SANITY_NEUTRAL) // only take effect if in negative sanity and then... affected_mob.mob_mood.set_sanity(min(affected_mob.mob_mood.sanity + (5 * REM * seconds_per_tick), SANITY_NEUTRAL)) // set minimum to prevent unwanted spiking over neutral - ..() - . = TRUE /datum/reagent/medicine/psicodine/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_hallucinations_up_to(10 SECONDS * REM * seconds_per_tick, 120 SECONDS) - affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - . = TRUE + if(affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/metafactor name = "Mitogen Metabolism Factor" @@ -1528,12 +1605,13 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/metafactor/overdose_start(mob/living/carbon/affected_mob) + . = ..() metabolization_rate = 2 * REAGENTS_METABOLISM /datum/reagent/medicine/metafactor/overdose_process(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(13, seconds_per_tick)) - affected_mob.vomit() - ..() + affected_mob.vomit(VOMIT_CATEGORY_DEFAULT) /datum/reagent/medicine/silibinin name = "Silibinin" @@ -1544,9 +1622,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/silibinin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, -2 * REM * seconds_per_tick, required_organtype = affected_organtype)//Add a chance to cure liver trauma once implemented. - ..() - . = TRUE + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, -2 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) // Add a chance to cure liver trauma once implemented. + return UPDATE_MOB_HEALTH /datum/reagent/medicine/polypyr //This is intended to be an ingredient in advanced chems. name = "Polypyrylium Oligomers" @@ -1560,22 +1637,24 @@ /datum/reagent/medicine/polypyr/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) //I wanted a collection of small positive effects, this is as hard to obtain as coniine after all. . = ..() - affected_mob.adjustOrganLoss(ORGAN_SLOT_LUNGS, -0.25 * REM * seconds_per_tick, required_organtype = affected_organtype) - affected_mob.adjustBruteLoss(-0.35 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - return TRUE + var/need_mob_update + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_LUNGS, -0.25 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + need_mob_update += affected_mob.adjustBruteLoss(-0.35 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/polypyr/expose_mob(mob/living/carbon/human/exposed_human, methods=TOUCH, reac_volume) . = ..() if(!(methods & (TOUCH|VAPOR)) || !ishuman(exposed_human) || (reac_volume < 0.5)) return - exposed_human.hair_color = "#9922ff" - exposed_human.facial_hair_color = "#9922ff" + exposed_human.set_facial_haircolor("#9922ff", update = FALSE) + exposed_human.set_haircolor(color, update = TRUE) exposed_human.update_body_parts() /datum/reagent/medicine/polypyr/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5 * REM * seconds_per_tick, required_organtype = affected_organtype) - ..() - . = TRUE + . = ..() + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/granibitaluri name = "Granibitaluri" //achieve "GRANular" amounts of C2 @@ -1588,16 +1667,19 @@ /datum/reagent/medicine/granibitaluri/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) var/healamount = max(0.5 - round(0.01 * (affected_mob.getBruteLoss() + affected_mob.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 - affected_mob.adjustBruteLoss(-healamount * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustFireLoss(-healamount * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - ..() - . = TRUE + var/need_mob_update + need_mob_update = affected_mob.adjustBruteLoss(-healamount * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-healamount * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/granibitaluri/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) - . = TRUE - affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.2 * REM * seconds_per_tick, required_organtype = affected_organtype) - affected_mob.adjustToxLoss(0.2 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) //Only really deadly if you eat over 100u - ..() + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.2 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + need_mob_update += affected_mob.adjustToxLoss(0.2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) //Only really deadly if you eat over 100u + if(need_mob_update) + return UPDATE_MOB_HEALTH // helps bleeding wounds clot faster /datum/reagent/medicine/coagulant @@ -1616,15 +1698,15 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/coagulant/on_mob_metabolize(mob/living/affected_mob) + . = ..() ADD_TRAIT(affected_mob, TRAIT_COAGULATING, /datum/reagent/medicine/coagulant) if(ishuman(affected_mob)) var/mob/living/carbon/human/blood_boy = affected_mob blood_boy.physiology?.bleed_mod *= passive_bleed_modifier - return ..() - /datum/reagent/medicine/coagulant/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_COAGULATING, /datum/reagent/medicine/coagulant) if(was_working) @@ -1633,8 +1715,6 @@ var/mob/living/carbon/human/blood_boy = affected_mob blood_boy.physiology?.bleed_mod /= passive_bleed_modifier - return ..() - /datum/reagent/medicine/coagulant/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() if(!affected_mob.blood_volume || !affected_mob.all_wounds) @@ -1663,19 +1743,21 @@ if(SPT_PROB(7.5, seconds_per_tick)) affected_mob.losebreath += rand(2, 4) - affected_mob.adjustOxyLoss(rand(1, 3), required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + affected_mob.adjustOxyLoss(rand(1, 3), updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) if(prob(30)) to_chat(affected_mob, span_danger("You can feel your blood clotting up in your veins!")) else if(prob(10)) to_chat(affected_mob, span_userdanger("You feel like your blood has stopped moving!")) - affected_mob.adjustOxyLoss(rand(3, 4), required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + affected_mob.adjustOxyLoss(rand(3, 4) * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) if(prob(50)) var/obj/item/organ/internal/lungs/our_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) - our_lungs.apply_organ_damage(1) + our_lungs.apply_organ_damage(1 * REM * seconds_per_tick) else var/obj/item/organ/internal/heart/our_heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART) - our_heart.apply_organ_damage(1) + our_heart.apply_organ_damage(1 * REM * seconds_per_tick) + + return UPDATE_MOB_HEALTH // 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 @@ -1708,3 +1790,21 @@ required_drink_type = /datum/reagent/medicine/coagulant/seraka_extract name = "glass of seraka extract" desc = "Deeply savoury, bitter, and makes your blood clot up in your veins. A great drink, all things considered." + +/datum/reagent/medicine/ondansetron + name = "Ondansetron" + description = "Prevents nausea and vomiting. May cause drowsiness and wear." + reagent_state = LIQUID + color = "#74d3ff" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + ph = 10.6 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/medicine/ondansetron/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(SPT_PROB(8, seconds_per_tick)) + affected_mob.adjust_drowsiness(2 SECONDS * REM * seconds_per_tick) + if(SPT_PROB(15, seconds_per_tick) && !affected_mob.getStaminaLoss()) + if(affected_mob.adjustStaminaLoss(10 * REM * seconds_per_tick, updating_stamina = FALSE)) + . = UPDATE_MOB_HEALTH + affected_mob.adjust_disgust(-10 * REM * seconds_per_tick) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 2bd7c3527790b..97b5236b9d3c4 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -32,14 +32,27 @@ if((strain.spread_flags & DISEASE_SPREAD_SPECIAL) || (strain.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS)) continue - if(methods & (INJECT|INGEST|PATCH)) + if(methods & INGEST) + if(!strain.has_required_infectious_organ(exposed_mob, ORGAN_SLOT_STOMACH)) + continue + + exposed_mob.ForceContractDisease(strain) + else if(methods & (INJECT|PATCH)) + if(!strain.has_required_infectious_organ(exposed_mob, ORGAN_SLOT_HEART)) + continue + exposed_mob.ForceContractDisease(strain) - else if((methods & (TOUCH|VAPOR)) && (strain.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS)) + else if((methods & VAPOR) && (strain.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS)) + if(!strain.has_required_infectious_organ(exposed_mob, ORGAN_SLOT_LUNGS)) + continue + + exposed_mob.ContactContractDisease(strain) + else if((methods & TOUCH) && (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() == type && ((methods & INJECT) || ((methods & INGEST) && exposed_carbon.dna && exposed_carbon.dna.species && (DRINKSBLOOD in exposed_carbon.dna.species.species_traits)))) + if(exposed_carbon.get_blood_id() == type && ((methods & INJECT) || ((methods & INGEST) && HAS_TRAIT(exposed_carbon, TRAIT_DRINKS_BLOOD)))) 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 @@ -111,7 +124,7 @@ color = "#CC4633" description = "You don't even want to think about what's in here." taste_description = "gross iron" - nutriment_factor = 2 * REAGENTS_METABOLISM + nutriment_factor = 2 material = /datum/material/meat ph = 7.45 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -261,6 +274,7 @@ . = ..() if(affected_mob.blood_volume) affected_mob.blood_volume += 0.1 * REM * seconds_per_tick // water is good for you! + affected_mob.adjust_drunk_effect(-0.25 * REM * seconds_per_tick) // and even sobers you up slowly!! // 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/machinery/hydroponics/mytray, mob/user) @@ -268,6 +282,53 @@ //You don't belong in this world, monster! mytray.reagents.remove_reagent(type, volume) +/datum/reagent/water/salt + name = "Saltwater" + description = "Water, but salty. Smells like... the station infirmary?" + color = "#aaaaaa9d" // rgb: 170, 170, 170, 77 (alpha) + taste_description = "the sea" + cooling_temperature = 3 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_CLEANS + default_container = /obj/item/reagent_containers/cup/glass/waterbottle + +/datum/glass_style/shot_glass/water/salt + required_drink_type = /datum/reagent/water/salt + icon_state = "shotglassclear" + +/datum/glass_style/drinking_glass/water/salt + required_drink_type = /datum/reagent/water/salt + name = "glass of saltwater" + desc = "If you have a sore throat, gargle some saltwater and watch the pain go away. Can be used as a very improvised topical medicine against wounds." + icon_state = "glass_clear" + +/datum/reagent/water/salt/expose_mob(mob/living/exposed_mob, methods, reac_volume) + . = ..() + var/mob/living/carbon/carbies = exposed_mob + if(!(methods & (PATCH|TOUCH|VAPOR))) + return + for(var/datum/wound/iter_wound as anything in carbies.all_wounds) + iter_wound.on_saltwater(reac_volume, carbies) + +// Mixed salt with water! All the help of salt with none of the irritation. Plus increased volume. +/datum/wound/proc/on_saltwater(reac_volume, mob/living/carbon/carbies) + return + +/datum/wound/pierce/bleed/on_saltwater(reac_volume, mob/living/carbon/carbies) + adjust_blood_flow(-0.06 * reac_volume, initial_flow * 0.6) + to_chat(carbies, span_notice("The salt water splashes over [lowertext(src)], soaking up the blood.")) + +/datum/wound/slash/flesh/on_saltwater(reac_volume, mob/living/carbon/carbies) + adjust_blood_flow(-0.1 * reac_volume, initial_flow * 0.5) + to_chat(carbies, span_notice("The salt water splashes over [lowertext(src)], soaking up the blood.")) + +/datum/wound/burn/flesh/on_saltwater(reac_volume) + // Similar but better stats from normal salt. + sanitization += VALUE_PER(0.6, 30) * reac_volume + infestation -= max(VALUE_PER(0.5, 30) * reac_volume, 0) + infestation_rate += VALUE_PER(0.07, 30) * reac_volume + to_chat(victim, span_notice("The salt water splashes over [lowertext(src)], soaking up the... miscellaneous fluids. It feels somewhat better afterwards.")) + return + /datum/reagent/water/holywater name = "Holy Water" description = "Water blessed by some deity." @@ -290,7 +351,7 @@ mytray.myseed?.adjust_instability(round(volume * 0.15)) /datum/reagent/water/holywater/on_mob_metabolize(mob/living/affected_mob) - ..() + . = ..() ADD_TRAIT(affected_mob, TRAIT_HOLY, type) /datum/reagent/water/holywater/on_mob_add(mob/living/affected_mob, amount) @@ -299,8 +360,8 @@ data["misc"] = 0 /datum/reagent/water/holywater/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_HOLY, type) - ..() /datum/reagent/water/holywater/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() @@ -308,8 +369,7 @@ 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/affected_mob, seconds_per_tick, times_fired) - if(affected_mob.blood_volume) - affected_mob.blood_volume += 0.1 * REM * seconds_per_tick // water is good for you! + . = ..() if(!data) data = list("misc" = 0) @@ -336,9 +396,11 @@ affected_mob.Unconscious(100) affected_mob.remove_status_effect(/datum/status_effect/jitter) affected_mob.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?? + if(holder) + 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 * seconds_per_tick) //fixed consumption to prevent balancing going out of whack + if(holder) + holder.remove_reagent(type, 1 * REAGENTS_METABOLISM * seconds_per_tick) //fixed consumption to prevent balancing going out of whack /datum/reagent/water/holywater/expose_turf(turf/exposed_turf, reac_volume) . = ..() @@ -398,29 +460,34 @@ name = "Unholy Water" description = "Something that shouldn't exist on this plane of existence." taste_description = "suffering" + self_consuming = TRUE //unholy intervention won't be limited by the lack of a liver 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/affected_mob, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update = FALSE if(IS_CULTIST(affected_mob)) affected_mob.adjust_drowsiness(-10 SECONDS * REM * seconds_per_tick) affected_mob.AdjustAllImmobility(-40 * REM * seconds_per_tick) - affected_mob.adjustStaminaLoss(-10 * REM * seconds_per_tick, 0) - affected_mob.adjustToxLoss(-2 * REM * seconds_per_tick, 0) - affected_mob.adjustOxyLoss(-2 * REM * seconds_per_tick, 0) - affected_mob.adjustBruteLoss(-2 * REM * seconds_per_tick, 0) - affected_mob.adjustFireLoss(-2 * REM * seconds_per_tick, 0) + need_mob_update += affected_mob.adjustStaminaLoss(-10 * REM * seconds_per_tick, updating_stamina = FALSE) + need_mob_update += affected_mob.adjustToxLoss(-2 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjustOxyLoss(-2 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjustBruteLoss(-2 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjustFireLoss(-2 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update = TRUE if(ishuman(affected_mob) && affected_mob.blood_volume < BLOOD_VOLUME_NORMAL) affected_mob.blood_volume += 3 * REM * seconds_per_tick else // Will deal about 90 damage when 50 units are thrown - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * REM * seconds_per_tick, 150) - affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, 0) - affected_mob.adjustFireLoss(1 * REM * seconds_per_tick, 0) - affected_mob.adjustOxyLoss(1 * REM * seconds_per_tick, 0) - affected_mob.adjustBruteLoss(1 * REM * seconds_per_tick, 0) - ..() + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * REM * seconds_per_tick, 150) + need_mob_update += affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjustFireLoss(1 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjustOxyLoss(1 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjustBruteLoss(1 * REM * seconds_per_tick, updating_health = FALSE) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/hellwater //if someone has this in their system they've really pissed off an eldrich god name = "Hell Water" @@ -430,12 +497,17 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/hellwater/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.set_fire_stacks(min(affected_mob.fire_stacks + (1.5 * seconds_per_tick), 5)) affected_mob.ignite_mob() //Only problem with igniting people is currently the commonly available fire suits make you immune to being on fire - affected_mob.adjustToxLoss(0.5*seconds_per_tick, 0) - affected_mob.adjustFireLoss(0.5*seconds_per_tick, 0) //Hence the other damages... ain't I a bastard? + var/need_mob_update + need_mob_update = affected_mob.adjustToxLoss(0.5*seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjustFireLoss(0.5*seconds_per_tick, updating_health = FALSE) //Hence the other damages... ain't I a bastard? affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2.5*seconds_per_tick, 150) - holder.remove_reagent(type, 0.5*seconds_per_tick) + if(holder) + holder.remove_reagent(type, 0.5*seconds_per_tick) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/omnizine/godblood name = "Godblood" @@ -483,12 +555,12 @@ 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) + if(HAS_TRAIT(exposed_human, TRAIT_USES_SKINTONES)) switch(exposed_human.skin_tone) if("african1") exposed_human.skin_tone = "african2" if("indian") - exposed_human.skin_tone = "african1" + exposed_human.skin_tone = "mixed2" if("arab") exposed_human.skin_tone = "indian" if("asian2") @@ -496,7 +568,7 @@ if("asian1") exposed_human.skin_tone = "asian2" if("mediterranean") - exposed_human.skin_tone = "african1" + exposed_human.skin_tone = "mixed1" if("latino") exposed_human.skin_tone = "mediterranean" if("caucasian3") @@ -505,10 +577,18 @@ exposed_human.skin_tone = pick("caucasian3", "latino") if("caucasian1") exposed_human.skin_tone = "caucasian2" - if ("albino") + if("albino") exposed_human.skin_tone = "caucasian1" - - if(MUTCOLORS in exposed_human.dna.species.species_traits) //take current alien color and darken it slightly + if("mixed1") + exposed_human.skin_tone = "mixed2" + if("mixed2") + exposed_human.skin_tone = "mixed3" + if("mixed3") + exposed_human.skin_tone = "african1" + if("mixed4") + exposed_human.skin_tone = "mixed3" + //take current alien color and darken it slightly + else if(HAS_TRAIT(exposed_human, TRAIT_MUTANT_COLORS) && !HAS_TRAIT(exposed_human, TRAIT_FIXED_MUTANT_COLORS)) var/newcolor = "" var/string = exposed_human.dna.features["mcolor"] var/len = length(string) @@ -539,22 +619,24 @@ if((methods & INGEST) && show_message) to_chat(exposed_mob, span_notice("That tasted horrible.")) - /datum/reagent/spraytan/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() metabolization_rate = 1 * REAGENTS_METABOLISM if(ishuman(affected_mob)) var/mob/living/carbon/human/affected_human = affected_mob + var/obj/item/bodypart/head/head = affected_human.get_bodypart(BODY_ZONE_HEAD) + if(head) + head.head_flags |= HEAD_HAIR //No hair? No problem! + if(!HAS_TRAIT(affected_human, TRAIT_SHAVED)) + affected_human.set_facial_hairstyle("Shaved", update = FALSE) + affected_human.set_facial_haircolor("#000000", update = FALSE) if(!HAS_TRAIT(affected_human, TRAIT_BALD)) - affected_human.hairstyle = "Spiky" - affected_human.facial_hairstyle = "Shaved" - affected_human.facial_hair_color = "#000000" - affected_human.hair_color = "#000000" - if(!(HAIR in affected_human.dna.species.species_traits)) //No hair? No problem! - affected_human.dna.species.species_traits += HAIR - if(affected_human.dna.species.use_skintones) + affected_human.set_hairstyle("Spiky", update = FALSE) + affected_human.set_haircolor("#000000", update = FALSE) + if(HAS_TRAIT(affected_human, TRAIT_USES_SKINTONES)) affected_human.skin_tone = "orange" - else if(MUTCOLORS in affected_human.dna.species.species_traits) //Aliens with custom colors simply get turned orange + else if(HAS_TRAIT(affected_human, TRAIT_MUTANT_COLORS) && !HAS_TRAIT(affected_human, TRAIT_FIXED_MUTANT_COLORS)) //Aliens with custom colors simply get turned orange affected_human.dna.features["mcolor"] = "#ff8800" affected_human.update_body(is_creating = TRUE) if(SPT_PROB(3.5, seconds_per_tick)) @@ -564,13 +646,18 @@ affected_mob.visible_message("[affected_mob] flexes [affected_mob.p_their()] arms.") if(SPT_PROB(5, seconds_per_tick)) affected_mob.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 #define MUT_MSG_IMMEDIATE 1 #define MUT_MSG_EXTENDED 2 #define MUT_MSG_ABOUT2TURN 3 +/// the current_cycle threshold / iterations needed before one can transform +#define CYCLES_TO_TURN 20 +/// the cycle at which 'immediate' mutation text begins displaying +#define CYCLES_MSG_IMMEDIATE 6 +/// the cycle at which 'extended' mutation text begins displaying +#define CYCLES_MSG_EXTENDED 16 + /datum/reagent/mutationtoxin name = "Stable Mutation Toxin" description = "A humanizing toxin." @@ -583,21 +670,20 @@ "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/affected_mob, seconds_per_tick, times_fired) - . = TRUE + . = ..() if(!istype(affected_mob)) return - if(!(affected_mob.dna?.species) || !(affected_mob.mob_biotypes & MOB_ORGANIC)) + if(!(affected_mob.dna?.species) || !(affected_mob.mob_biotypes & affected_biotype)) return if(SPT_PROB(5, seconds_per_tick)) var/list/pick_ur_fav = list() var/filter = NONE - if(current_cycle <= (cycles_to_turn*0.3)) + if(current_cycle <= CYCLES_MSG_IMMEDIATE) filter = MUT_MSG_IMMEDIATE - else if(current_cycle <= (cycles_to_turn*0.8)) + else if(current_cycle <= CYCLES_MSG_EXTENDED) filter = MUT_MSG_EXTENDED else filter = MUT_MSG_ABOUT2TURN @@ -607,13 +693,14 @@ pick_ur_fav += i to_chat(affected_mob, span_warning("[pick(pick_ur_fav)]")) - if(current_cycle >= cycles_to_turn) + if(current_cycle >= CYCLES_TO_TURN) var/datum/species/species_type = race affected_mob.set_species(species_type) holder.del_reagent(type) to_chat(affected_mob, span_warning("You've become \a [lowertext(initial(species_type.name))]!")) return - ..() + + return ..() /datum/reagent/mutationtoxin/classic //The one from plasma on green slimes name = "Mutation Toxin" @@ -675,13 +762,13 @@ var/species_type = pick(subtypesof(/datum/species/jelly)) affected_mob.set_species(species_type) holder.del_reagent(type) - return TRUE - if(current_cycle >= cycles_to_turn) //overwrite since we want subtypes of jelly + return UPDATE_MOB_HEALTH + if(current_cycle >= CYCLES_TO_TURN) //overwrite since we want subtypes of jelly var/datum/species/species_type = pick(subtypesof(race)) affected_mob.set_species(species_type) holder.del_reagent(type) to_chat(affected_mob, span_warning("You've become \a [initial(species_type.name)]!")) - return TRUE + return UPDATE_MOB_HEALTH return ..() /datum/reagent/mutationtoxin/golem @@ -754,6 +841,10 @@ #undef MUT_MSG_EXTENDED #undef MUT_MSG_ABOUT2TURN +#undef CYCLES_TO_TURN +#undef CYCLES_MSG_IMMEDIATE +#undef CYCLES_MSG_EXTENDED + /datum/reagent/mulligan name = "Mulligan Toxin" description = "This toxin will rapidly change the DNA of humanoid beings. Commonly used by Syndicate spies and assassins in need of an emergency ID change." @@ -763,7 +854,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/mulligan/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) - ..() + . = ..() if (!istype(affected_mob)) return to_chat(affected_mob, span_warning("You grit your teeth in pain as your body rapidly mutates!")) @@ -805,10 +896,10 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/serotrotium/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(ishuman(affected_mob)) if(SPT_PROB(3.5, seconds_per_tick)) affected_mob.emote(pick("twitch","drool","moan","gasp")) - ..() /datum/reagent/oxygen name = "Oxygen" @@ -883,12 +974,13 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/mercury/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(!HAS_TRAIT(src, TRAIT_IMMOBILIZED) && !isspaceturf(affected_mob.loc)) step(affected_mob, pick(GLOB.cardinals)) if(SPT_PROB(3.5, seconds_per_tick)) affected_mob.emote(pick("twitch","drool","moan")) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5*seconds_per_tick) - ..() + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5*seconds_per_tick)) + return UPDATE_MOB_HEALTH /datum/reagent/sulfur name = "Sulfur" @@ -913,9 +1005,7 @@ 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) + exposed_turf.spawn_unique_cleanable(/obj/effect/decal/cleanable/dirt) /datum/reagent/chlorine name = "Chlorine" @@ -958,9 +1048,9 @@ mytray.adjust_weedlevel(-rand(1, 4)) /datum/reagent/fluorine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustToxLoss(0.5*REM*seconds_per_tick, 0) - . = TRUE - ..() + . = ..() + if(affected_mob.adjustToxLoss(0.5*REM*seconds_per_tick, updating_health = FALSE)) + . = TRUE /datum/reagent/sodium name = "Sodium" @@ -996,11 +1086,11 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/lithium/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(!HAS_TRAIT(affected_mob, TRAIT_IMMOBILIZED) && !isspaceturf(affected_mob.loc) && isturf(affected_mob.loc)) step(affected_mob, pick(GLOB.cardinals)) if(SPT_PROB(2.5, seconds_per_tick)) affected_mob.emote(pick("twitch","drool","moan")) - ..() /datum/reagent/glycerol name = "Glycerol" @@ -1016,7 +1106,7 @@ color = "#D0EFEE" // space cleaner but lighter taste_description = "bitterness" ph = 10.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_AFFECTS_WOUNDS /datum/reagent/space_cleaner/sterilizine/expose_mob(mob/living/carbon/exposed_carbon, methods=TOUCH, reac_volume) . = ..() @@ -1026,6 +1116,9 @@ for(var/datum/surgery/surgery as anything in exposed_carbon.surgeries) surgery.speed_modifier = max(0.2, surgery.speed_modifier) +/datum/reagent/space_cleaner/sterilizine/on_burn_wound_processing(datum/wound/burn/flesh/burn_wound) + burn_wound.sanitization += 0.9 + /datum/reagent/iron name = "Iron" description = "Pure iron is a metal." @@ -1037,9 +1130,9 @@ ph = 6 /datum/reagent/iron/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.blood_volume < BLOOD_VOLUME_NORMAL) affected_mob.blood_volume += 0.25 * seconds_per_tick - ..() /datum/reagent/gold name = "Gold" @@ -1073,17 +1166,16 @@ var/tox_damage = 0.5 /datum/reagent/uranium/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustToxLoss(tox_damage * seconds_per_tick * REM) - ..() + . = ..() + if(affected_mob.adjustToxLoss(tox_damage * seconds_per_tick * REM, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /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) + var/obj/effect/decal/cleanable/greenglow/glow = exposed_turf.spawn_unique_cleanable(/obj/effect/decal/cleanable/greenglow) if(!QDELETED(glow)) glow.reagents.add_reagent(type, reac_volume) @@ -1120,12 +1212,12 @@ 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/affected_mob, seconds_per_tick, times_fired) + . = ..() if(current_cycle > 10 && SPT_PROB(7.5, seconds_per_tick)) to_chat(affected_mob, span_warning("You feel unstable...")) affected_mob.set_jitter_if_lower(2 SECONDS) current_cycle = 1 addtimer(CALLBACK(affected_mob, 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) @@ -1172,9 +1264,9 @@ exposed_mob.adjust_fire_stacks(reac_volume / 10) /datum/reagent/fuel/on_mob_life(mob/living/carbon/victim, seconds_per_tick, times_fired) - victim.adjustToxLoss(0.5 * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - return TRUE + . = ..() + if(victim.adjustToxLoss(0.5 * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/fuel/expose_turf(turf/exposed_turf, reac_volume) . = ..() @@ -1185,18 +1277,20 @@ if((reac_volume < 5)) return - new /obj/effect/decal/cleanable/fuel_pool(exposed_turf, round(reac_volume / 5)) + var/obj/effect/decal/cleanable/fuel_pool/pool = exposed_turf.spawn_unique_cleanable(/obj/effect/decal/cleanable/fuel_pool) + if(pool) + pool.burn_amount = max(min(round(reac_volume / 5), 10), 1) /datum/reagent/space_cleaner name = "Space Cleaner" - description = "A compound used to clean things. Now with 50% more sodium hypochlorite!" + description = "A compound used to clean things. Now with 50% more sodium hypochlorite! Can be used to clean wounds, but it's not really meant for that." color = "#A5F0EE" // rgb: 165, 240, 238 taste_description = "sourness" reagent_weight = 0.6 //so it sprays further - penetrates_skin = NONE + penetrates_skin = VAPOR var/clean_types = CLEAN_WASH ph = 5.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_CLEANS + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_CLEANS|REAGENT_AFFECTS_WOUNDS /datum/reagent/space_cleaner/expose_obj(obj/exposed_obj, reac_volume) . = ..() @@ -1222,6 +1316,13 @@ if(methods & (TOUCH|VAPOR)) exposed_mob.wash(clean_types) +/datum/reagent/space_cleaner/on_burn_wound_processing(datum/wound/burn/flesh/burn_wound) + burn_wound.sanitization += 0.3 + if(prob(5)) + to_chat(burn_wound.victim, span_notice("Your [burn_wound] stings and burns from the [src] covering it! It does look pretty clean though.")) + burn_wound.victim.adjustToxLoss(0.5) + burn_wound.limb.receive_damage(burn = 0.5, wound_bonus = CANT_WOUND) + /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." @@ -1232,10 +1333,13 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/space_cleaner/ez_clean/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustBruteLoss(1.665*seconds_per_tick) - affected_mob.adjustFireLoss(1.665*seconds_per_tick) - affected_mob.adjustToxLoss(1.665*seconds_per_tick) - ..() + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustBruteLoss(1.665*seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjustFireLoss(1.665*seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjustToxLoss(1.665*seconds_per_tick, updating_health = FALSE) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/space_cleaner/ez_clean/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() @@ -1253,6 +1357,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/cryptobiolin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.set_dizzy_if_lower(2 SECONDS) // Cryptobiolin adjusts the mob's confusion down to 20 seconds if it's higher, @@ -1264,8 +1369,6 @@ else if(confusion_left > 20 SECONDS) affected_mob.set_confusion(20 SECONDS) - ..() - /datum/reagent/impedrezene name = "Impedrezene" description = "Impedrezene is a narcotic that impedes one's ability by slowing down the higher brain cell functions." @@ -1276,14 +1379,16 @@ addiction_types = list(/datum/addiction/opioids = 10) /datum/reagent/impedrezene/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_jitter(-5 SECONDS * seconds_per_tick) + . = FALSE if(SPT_PROB(55, seconds_per_tick)) affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2) + . = TRUE if(SPT_PROB(30, seconds_per_tick)) affected_mob.adjust_drowsiness(6 SECONDS) if(SPT_PROB(5, seconds_per_tick)) affected_mob.emote("drool") - ..() /datum/reagent/cyborg_mutation_nanomachines name = "Nanomachines" @@ -1434,13 +1539,13 @@ exposed_mob.adjust_drowsiness(drowsiness_to_apply) /datum/reagent/nitrous_oxide/on_mob_metabolize(mob/living/affected_mob) + . = ..() if(!HAS_TRAIT(affected_mob, TRAIT_COAGULATING)) //IF the mob does not have a coagulant in them, we add the blood mess trait to make the bleed quicker ADD_TRAIT(affected_mob, TRAIT_BLOODY_MESS, type) - return ..() /datum/reagent/nitrous_oxide/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_BLOODY_MESS, type) - return ..() /datum/reagent/nitrous_oxide/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_drowsiness(4 SECONDS * REM * seconds_per_tick) @@ -1464,7 +1569,7 @@ var/colorname = "none" description = "A powder that is used for coloring things." reagent_state = SOLID - color = "#FFFFFF" // rgb: 207, 54, 0 + color = COLOR_WHITE taste_description = "the back of class" /datum/reagent/colorful_reagent/powder/New() @@ -1479,7 +1584,7 @@ /datum/reagent/colorful_reagent/powder/red name = "Red Powder" colorname = "red" - color = "#DA0000" // red + color = COLOR_CRAYON_RED random_color_list = list("#FC7474") ph = 0.5 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -1487,29 +1592,29 @@ /datum/reagent/colorful_reagent/powder/orange name = "Orange Powder" colorname = "orange" - color = "#FF9300" // orange - random_color_list = list("#FF9300") + color = COLOR_CRAYON_ORANGE + random_color_list = list(COLOR_CRAYON_ORANGE) ph = 2 /datum/reagent/colorful_reagent/powder/yellow name = "Yellow Powder" colorname = "yellow" - color = "#FFF200" // yellow - random_color_list = list("#FFF200") + color = COLOR_CRAYON_YELLOW + random_color_list = list(COLOR_CRAYON_YELLOW) 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") + color = COLOR_CRAYON_GREEN + random_color_list = list(COLOR_CRAYON_GREEN) chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/colorful_reagent/powder/blue name = "Blue Powder" colorname = "blue" - color = "#00B7EF" // blue + color = COLOR_CRAYON_BLUE random_color_list = list("#71CAE5") ph = 10 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -1517,7 +1622,7 @@ /datum/reagent/colorful_reagent/powder/purple name = "Purple Powder" colorname = "purple" - color = "#DA00FF" // purple + color = COLOR_CRAYON_PURPLE random_color_list = list("#BD8FC4") ph = 13 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -1526,21 +1631,21 @@ name = "Invisible Powder" colorname = "invisible" color = "#FFFFFF00" // white + no alpha - random_color_list = list("#FFFFFF") //because using the powder color turns things invisible + random_color_list = list(COLOR_WHITE) //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 + color = COLOR_CRAYON_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 + color = COLOR_WHITE + random_color_list = list(COLOR_WHITE) //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 */ @@ -1598,10 +1703,10 @@ ph = 3 /datum/reagent/plantnutriment/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(tox_prob, seconds_per_tick)) - affected_mob.adjustToxLoss(1, FALSE, required_biotype = affected_biotype) - . = TRUE - ..() + if(affected_mob.adjustToxLoss(1, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/plantnutriment/eznutriment name = "E-Z Nutrient" @@ -1752,7 +1857,7 @@ /datum/reagent/carpet/green name = "Green Carpet" description = "For those that need the perfect flourish for green eggs and ham." - color = "#A8E61D" + color = COLOR_CRAYON_GREEN taste_description = "Green" //the caps is intentional carpet_type = /turf/open/floor/carpet/green chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -2060,8 +2165,8 @@ 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.set_facial_haircolor(pick(potential_colors), update = FALSE) + exposed_human.set_haircolor(pick(potential_colors), update = TRUE) exposed_human.update_body_parts() /datum/reagent/barbers_aid @@ -2075,16 +2180,17 @@ /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) || HAS_TRAIT(exposed_mob, TRAIT_SHAVED)) + if(!(methods & (TOUCH|VAPOR)) || !ishuman(exposed_mob) || (HAS_TRAIT(exposed_mob, TRAIT_BALD) && HAS_TRAIT(exposed_mob, TRAIT_SHAVED))) 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() + if(!HAS_TRAIT(exposed_human, TRAIT_SHAVED)) + var/datum/sprite_accessory/facial_hair/picked_beard = pick(GLOB.facial_hairstyles_list) + exposed_human.set_facial_hairstyle(picked_beard, update = FALSE) + if(!HAS_TRAIT(exposed_human, TRAIT_BALD)) + var/datum/sprite_accessory/hair/picked_hair = pick(GLOB.hairstyles_list) + exposed_human.set_hairstyle(picked_hair, update = TRUE) + to_chat(exposed_human, span_notice("Hair starts sprouting from your [HAS_TRAIT(exposed_human, TRAIT_BALD) ? "face" : "scalp"].")) /datum/reagent/concentrated_barbers_aid name = "Concentrated Barber's Aid" @@ -2097,29 +2203,28 @@ /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) || HAS_TRAIT(exposed_mob, TRAIT_SHAVED)) + if(!(methods & (TOUCH|VAPOR)) || !ishuman(exposed_mob) || (HAS_TRAIT(exposed_mob, TRAIT_BALD) && HAS_TRAIT(exposed_mob, TRAIT_SHAVED))) 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() + if(!HAS_TRAIT(exposed_human, TRAIT_SHAVED)) + exposed_human.set_facial_hairstyle("Beard (Very Long)", update = FALSE) + if(!HAS_TRAIT(exposed_human, TRAIT_BALD)) + exposed_human.set_hairstyle("Very Long Hair", update = TRUE) + to_chat(exposed_human, span_notice("Your[HAS_TRAIT(exposed_human, TRAIT_BALD) ? " facial" : ""] hair starts growing at an incredible speed!")) /datum/reagent/concentrated_barbers_aid/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if(current_cycle > 20 / creation_purity) + if(current_cycle > 21 / creation_purity) if(!ishuman(affected_mob)) return var/mob/living/carbon/human/human_mob = affected_mob if(creation_purity == 1 && human_mob.has_quirk(/datum/quirk/item_quirk/bald)) human_mob.remove_quirk(/datum/quirk/item_quirk/bald) - var/datum/species/species_datum = human_mob.dna?.species - if(!species_datum) - return - if(species_datum.species_traits.Find(HAIR)) + var/obj/item/bodypart/head/head = human_mob.get_bodypart(BODY_ZONE_HEAD) + if(!head || (head.head_flags & HEAD_HAIR)) return - species_datum.species_traits |= HAIR + head.head_flags |= HEAD_HAIR var/message if(HAS_TRAIT(affected_mob, TRAIT_BALD)) message = span_warning("You feel your scalp mutate, but you are still hopelessly bald.") @@ -2144,9 +2249,8 @@ 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() + exposed_human.set_facial_hairstyle("Shaved", update = FALSE) + exposed_human.set_hairstyle("Bald", update = TRUE) /datum/reagent/saltpetre name = "Saltpetre" @@ -2259,9 +2363,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/royal_bee_jelly/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(1, seconds_per_tick)) affected_mob.say(pick("Bzzz...","BZZ BZZ","Bzzzzzzzzzzz..."), forced = "royal bee jelly") - ..() //Misc reagents @@ -2293,8 +2397,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/magillitis/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - ..() - if((ishuman(affected_mob)) && current_cycle >= 10) + . = ..() + if((ishuman(affected_mob)) && current_cycle > 10) affected_mob.gorillize() /datum/reagent/growthserum @@ -2306,6 +2410,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/growthserum/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() var/newsize = current_size switch(volume) if(0 to 19) @@ -2321,12 +2426,11 @@ affected_mob.update_transform(newsize/current_size) current_size = newsize - ..() /datum/reagent/growthserum/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() affected_mob.update_transform(RESIZE_DEFAULT_SIZE/current_size) current_size = RESIZE_DEFAULT_SIZE - ..() /datum/reagent/plastic_polymers name = "Plastic Polymers" @@ -2349,7 +2453,7 @@ . = ..() if(!istype(exposed_turf)) return - new glitter_type(exposed_turf) + exposed_turf.spawn_unique_cleanable(glitter_type) /datum/reagent/glitter/pink name = "Pink Glitter" @@ -2388,12 +2492,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/pax/on_mob_metabolize(mob/living/affected_mob) - ..() + . = ..() ADD_TRAIT(affected_mob, TRAIT_PACIFISM, type) /datum/reagent/pax/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_PACIFISM, type) - ..() /datum/reagent/bz_metabolites name = "BZ Metabolites" @@ -2404,19 +2508,19 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/bz_metabolites/on_mob_metabolize(mob/living/ling) - ..() + . = ..() ADD_TRAIT(ling, CHANGELING_HIVEMIND_MUTE, type) /datum/reagent/bz_metabolites/on_mob_end_metabolize(mob/living/ling) - ..() + . = ..() REMOVE_TRAIT(ling, CHANGELING_HIVEMIND_MUTE, type) /datum/reagent/bz_metabolites/on_mob_life(mob/living/carbon/target, seconds_per_tick, 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 * seconds_per_tick) - return ..() /datum/reagent/pax/peaceborg name = "Synthpax" @@ -2447,12 +2551,14 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/peaceborg/tire/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() var/healthcomp = (100 - affected_mob.health) //DOES NOT ACCOUNT FOR ADMINBUS THINGS THAT MAKE YOU HAVE MORE THAN 200/210 HEALTH, OR SOMETHING OTHER THAN A HUMAN PROCESSING THIS. + . = FALSE if(affected_mob.getStaminaLoss() < (45 - healthcomp)) //At 50 health you would have 200 - 150 health meaning 50 compensation. 60 - 50 = 10, so would only do 10-19 stamina.) - affected_mob.adjustStaminaLoss(10 * REM * seconds_per_tick) + if(affected_mob.adjustStaminaLoss(10 * REM * seconds_per_tick, updating_stamina = FALSE)) + . = UPDATE_MOB_HEALTH if(SPT_PROB(16, seconds_per_tick)) to_chat(affected_mob, "You should sit down and take a rest...") - ..() /datum/reagent/gondola_mutation_toxin name = "Tranquility" @@ -2490,13 +2596,14 @@ desc = "It smells like a carcass, and doesn't look much better." /datum/reagent/yuck/on_mob_add(mob/living/affected_mob) - . = ..() if(HAS_TRAIT(affected_mob, TRAIT_NOHUNGER)) //they can't puke holder.del_reagent(type) + return ..() #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/affected_mob, seconds_per_tick, times_fired) + . = ..() if(!yuck_cycle) if(SPT_PROB(4, seconds_per_tick)) var/dread = pick("Something is moving in your stomach...", \ @@ -2508,16 +2615,19 @@ 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) - affected_mob.vomit(rand(14, 26), stun = yuck_cycles >= YUCK_PUKE_CYCLES * YUCK_PUKES_TO_STUN) - if(holder) - return ..() + if(holder) + holder.remove_reagent(type, 5) + var/passable_flags = (MOB_VOMIT_MESSAGE | MOB_VOMIT_HARM) + if(yuck_cycles >= (YUCK_PUKE_CYCLES * YUCK_PUKES_TO_STUN)) + passable_flags |= MOB_VOMIT_STUN + affected_mob.vomit(vomit_flags = passable_flags, lost_nutrition = rand(14, 26)) + #undef YUCK_PUKE_CYCLES #undef YUCK_PUKES_TO_STUN /datum/reagent/yuck/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() yuck_cycle = 0 // reset vomiting - return ..() /datum/reagent/yuck/on_transfer(atom/A, methods=TOUCH, trans_volume) if((methods & INGEST) || !iscarbon(A)) @@ -2564,7 +2674,7 @@ 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 + chemical_flags = 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 @@ -2579,13 +2689,16 @@ metal_morph(exposed_turf) ///turn an object into a special material -/datum/reagent/metalgen/proc/metal_morph(atom/A) +/datum/reagent/metalgen/proc/metal_morph(atom/target) var/metal_ref = data["material"] if(!metal_ref) return + if(is_type_in_typecache(target, GLOB.blacklisted_metalgen_types)) //some stuff can lead to exploits if transmuted + return + var/metal_amount = 0 - var/list/materials_to_transmute = A.get_material_composition(BREAKDOWN_INCLUDE_ALCHEMY) + var/list/materials_to_transmute = target.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] @@ -2593,9 +2706,9 @@ 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) + target.material_flags = applied_material_flags + target.set_custom_materials(metal_dat) + ADD_TRAIT(target, TRAIT_MAT_TRANSMUTED, type) /datum/reagent/gravitum name = "Gravitum" @@ -2610,13 +2723,14 @@ /datum/reagent/gravitum/expose_obj(obj/exposed_obj, volume) . = ..() exposed_obj.AddElement(/datum/element/forced_gravity, 0) - addtimer(CALLBACK(exposed_obj, PROC_REF(_RemoveElement), list(/datum/element/forced_gravity, 0)), volume * time_multiplier) + addtimer(CALLBACK(exposed_obj, PROC_REF(_RemoveElement), list(/datum/element/forced_gravity, 0)), volume * time_multiplier, TIMER_UNIQUE|TIMER_OVERRIDE) /datum/reagent/gravitum/on_mob_metabolize(mob/living/affected_mob) + . = ..() affected_mob.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/affected_mob) + . = ..() affected_mob.RemoveElement(/datum/element/forced_gravity, 0) /datum/reagent/cellulose @@ -2640,6 +2754,7 @@ var/significant = FALSE /datum/reagent/determination/on_mob_end_metabolize(mob/living/carbon/affected_mob) + . = ..() if(significant) var/stam_crash = 0 for(var/thing in affected_mob.all_wounds) @@ -2647,9 +2762,9 @@ stam_crash += (W.severity + 1) * 3 // spike of 3 stam damage per wound severity (moderate = 6, severe = 9, critical = 12) when the determination wears off if it was a combat rush affected_mob.adjustStaminaLoss(stam_crash) affected_mob.remove_status_effect(/datum/status_effect/determined) - ..() /datum/reagent/determination/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(!significant && volume >= WOUND_DETERMINATION_SEVERE) significant = TRUE affected_mob.apply_status_effect(/datum/status_effect/determined) // in addition to the slight healing, limping cooldowns are divided by 4 during the combat high @@ -2661,8 +2776,8 @@ var/obj/item/bodypart/wounded_part = W.limb if(wounded_part) wounded_part.heal_damage(0.25 * REM * seconds_per_tick, 0.25 * REM * seconds_per_tick) - affected_mob.adjustStaminaLoss(-0.25 * REM * seconds_per_tick) // the more wounds, the more stamina regen - ..() + if(affected_mob.adjustStaminaLoss(-0.25 * REM * seconds_per_tick, updating_stamina = FALSE)) // the more wounds, the more stamina regen + return UPDATE_MOB_HEALTH // unholy water, but for heretics. // why couldn't they have both just used the same reagent? @@ -2674,29 +2789,32 @@ 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" + self_consuming = TRUE //eldritch intervention won't be limited by the lack of a liver color = "#1f8016" metabolization_rate = 2.5 * REAGENTS_METABOLISM //0.5u/second chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/eldritch/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update = FALSE if(IS_HERETIC(drinker)) drinker.adjust_drowsiness(-10 * REM * seconds_per_tick) drinker.AdjustAllImmobility(-40 * REM * seconds_per_tick) - drinker.adjustStaminaLoss(-10 * REM * seconds_per_tick, FALSE) - drinker.adjustToxLoss(-2 * REM * seconds_per_tick, FALSE, forced = TRUE) - drinker.adjustOxyLoss(-2 * REM * seconds_per_tick, FALSE) - drinker.adjustBruteLoss(-2 * REM * seconds_per_tick, FALSE) - drinker.adjustFireLoss(-2 * REM * seconds_per_tick, FALSE) + need_mob_update += drinker.adjustStaminaLoss(-10 * REM * seconds_per_tick, updating_stamina = FALSE) + need_mob_update += drinker.adjustToxLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, forced = TRUE) + need_mob_update += drinker.adjustOxyLoss(-2 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += drinker.adjustBruteLoss(-2 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += drinker.adjustFireLoss(-2 * REM * seconds_per_tick, updating_health = FALSE) if(drinker.blood_volume < BLOOD_VOLUME_NORMAL) drinker.blood_volume += 3 * REM * seconds_per_tick else - drinker.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * REM * seconds_per_tick, 150) - drinker.adjustToxLoss(2 * REM * seconds_per_tick, FALSE) - drinker.adjustFireLoss(2 * REM * seconds_per_tick, FALSE) - drinker.adjustOxyLoss(2 * REM * seconds_per_tick, FALSE) - drinker.adjustBruteLoss(2 * REM * seconds_per_tick, FALSE) - ..() - return TRUE + need_mob_update = drinker.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * REM * seconds_per_tick, 150) + need_mob_update += drinker.adjustToxLoss(2 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += drinker.adjustFireLoss(2 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += drinker.adjustOxyLoss(2 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += drinker.adjustBruteLoss(2 * REM * seconds_per_tick, updating_health = FALSE) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/universal_indicator name = "Universal Indicator" @@ -2742,10 +2860,11 @@ desc = "Bottoms up...?" /datum/reagent/ants/on_mob_life(mob/living/carbon/victim, seconds_per_tick) + . = ..() 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 ..() + return if(SPT_PROB(5, seconds_per_tick)) if(SPT_PROB(5, seconds_per_tick)) //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) @@ -2754,13 +2873,12 @@ if(SPT_PROB(15, seconds_per_tick)) victim.emote("scream") if(SPT_PROB(2, seconds_per_tick)) // Stuns, but purges ants. - victim.vomit(rand(5,10), FALSE, TRUE, 1, TRUE, FALSE, purge_ratio = 1) - return ..() + victim.vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = rand(5,10), purge_ratio = 1) /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/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() @@ -2787,9 +2905,10 @@ if((reac_volume <= 10)) // Makes sure people don't duplicate ants. return - var/obj/effect/decal/cleanable/ants/pests = locate() in exposed_turf.contents + var/obj/effect/decal/cleanable/ants/pests = exposed_turf.spawn_unique_cleanable(/obj/effect/decal/cleanable/ants) if(!pests) - pests = new(exposed_turf) + return + 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() @@ -2805,7 +2924,8 @@ /datum/reagent/lead/on_mob_life(mob/living/carbon/victim) . = ..() - victim.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5) + if(victim.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5)) + return UPDATE_MOB_HEALTH //The main feedstock for kronkaine production, also a shitty stamina healer. /datum/reagent/kronkus_extract @@ -2818,8 +2938,11 @@ /datum/reagent/kronkus_extract/on_mob_life(mob/living/carbon/kronkus_enjoyer) . = ..() - kronkus_enjoyer.adjustOrganLoss(ORGAN_SLOT_HEART, 0.1) - kronkus_enjoyer.adjustStaminaLoss(-2, FALSE) + var/need_mob_update + need_mob_update = kronkus_enjoyer.adjustOrganLoss(ORGAN_SLOT_HEART, 0.1) + need_mob_update += kronkus_enjoyer.adjustStaminaLoss(-2, updating_stamina = FALSE) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/brimdust name = "Brimdust" @@ -2831,7 +2954,8 @@ /datum/reagent/brimdust/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - affected_mob.adjustFireLoss((ispodperson(affected_mob) ? -1 : 1) * seconds_per_tick) + if(affected_mob.adjustFireLoss((ispodperson(affected_mob) ? -1 : 1 * seconds_per_tick), updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/brimdust/on_hydroponics_apply(obj/machinery/hydroponics/mytray, mob/user) mytray.adjust_weedlevel(-1) @@ -2859,14 +2983,15 @@ . = ..() metabolizer.add_mood_event(name, /datum/mood_event/love_reagent) -/datum/reagent/love/on_mob_delete(mob/living/deleted_from) +/datum/reagent/love/on_mob_delete(mob/living/affected_mob) . = ..() // When we exit the system we'll leave the moodlet based on the amount we had var/duration_of_moodlet = current_cycle * 20 SECONDS - deleted_from.clear_mood_event(name) - deleted_from.add_mood_event(name, /datum/mood_event/love_reagent, duration_of_moodlet) + affected_mob.clear_mood_event(name) + affected_mob.add_mood_event(name, /datum/mood_event/love_reagent, duration_of_moodlet) /datum/reagent/love/overdose_process(mob/living/metabolizer, seconds_per_tick, times_fired) + . = ..() var/mob/living/carbon/carbon_metabolizer = metabolizer if(!istype(carbon_metabolizer) || !carbon_metabolizer.can_heartattack() || carbon_metabolizer.undergoing_cardiac_arrest()) metabolizer.reagents.del_reagent(type) @@ -2874,3 +2999,48 @@ if(SPT_PROB(10, seconds_per_tick)) carbon_metabolizer.set_heartattack(TRUE) + +/datum/reagent/hauntium + name = "Hauntium" + color = "#3B3B3BA3" + description = "An eerie liquid created by purifying the prescence of ghosts. If it happens to get in your body, it starts hurting your soul." //soul as in mood and heart + taste_description = "evil spirits" + metabolization_rate = 0.75 * REAGENTS_METABOLISM + material = /datum/material/hauntium + ph = 10 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/hauntium/expose_obj(obj/exposed_obj, volume) //gives 15 seconds of haunting effect for every unit of it that touches an object + . = ..() + if(HAS_TRAIT_FROM(exposed_obj, TRAIT_HAUNTED, HAUNTIUM_REAGENT_TRAIT)) + return + exposed_obj.make_haunted(HAUNTIUM_REAGENT_TRAIT, "#f8f8ff") + addtimer(CALLBACK(exposed_obj, TYPE_PROC_REF(/atom/movable/, remove_haunted), HAUNTIUM_REAGENT_TRAIT), volume * 20 SECONDS) + +/datum/reagent/hauntium/on_mob_metabolize(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + to_chat(affected_mob, span_userdanger("You feel an evil presence inside you!")) + if(affected_mob.mob_biotypes & MOB_UNDEAD || HAS_MIND_TRAIT(affected_mob, TRAIT_MORBID)) + affected_mob.add_mood_event("morbid_hauntium", /datum/mood_event/morbid_hauntium, name) //8 minutes of slight mood buff if undead or morbid + else + affected_mob.add_mood_event("hauntium_spirits", /datum/mood_event/hauntium_spirits, name) //8 minutes of mood debuff + +/datum/reagent/hauntium/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + + if(affected_mob.mob_biotypes & MOB_UNDEAD || HAS_MIND_TRAIT(affected_mob, TRAIT_MORBID)) //if morbid or undead,acts like an addiction-less drug + affected_mob.remove_status_effect(/datum/status_effect/jitter) + affected_mob.AdjustStun(-50 * REM * seconds_per_tick) + affected_mob.AdjustKnockdown(-50 * REM * seconds_per_tick) + affected_mob.AdjustUnconscious(-50 * REM * seconds_per_tick) + affected_mob.AdjustParalyzed(-50 * REM * seconds_per_tick) + affected_mob.AdjustImmobilized(-50 * REM * seconds_per_tick) + else + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_HEART, REM * seconds_per_tick)) //1 heart damage per tick + . = UPDATE_MOB_HEALTH + if(SPT_PROB(10, seconds_per_tick)) + affected_mob.emote(pick("twitch","choke","shiver","gag")) + +// The same as gold just with a slower metabolism rate, to make using the Hand of Midas easier. +/datum/reagent/gold/cursed + name = "Cursed Gold" + metabolization_rate = 0.2 * REAGENTS_METABOLISM diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index 0d52ca4e82545..2db3682ef2185 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -13,9 +13,9 @@ exposed_turf.AddComponent(/datum/component/thermite, reac_volume) /datum/reagent/thermite/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustFireLoss(1 * REM * seconds_per_tick, 0) - ..() - return TRUE + . = ..() + if(affected_mob.adjustFireLoss(1 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/nitroglycerin name = "Nitroglycerin" @@ -47,10 +47,10 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/clf3/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_fire_stacks(2 * REM * seconds_per_tick) - affected_mob.adjustFireLoss(0.3 * max(affected_mob.fire_stacks, 1) * REM * seconds_per_tick, 0) - ..() - return TRUE + if(affected_mob.adjustFireLoss(0.3 * max(affected_mob.fire_stacks, 1) * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/clf3/expose_turf(turf/exposed_turf, reac_volume) . = ..() @@ -177,10 +177,10 @@ exposed_mob.ignite_mob() /datum/reagent/phlogiston/on_mob_life(mob/living/carbon/metabolizer, seconds_per_tick, times_fired) + . = ..() metabolizer.adjust_fire_stacks(1 * REM * seconds_per_tick) - metabolizer.adjustFireLoss(0.3 * max(metabolizer.fire_stacks, 0.15) * REM * seconds_per_tick, 0) - ..() - return TRUE + if(metabolizer.adjustFireLoss(0.3 * max(metabolizer.fire_stacks, 0.15) * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/napalm name = "Napalm" @@ -201,8 +201,8 @@ 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/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_fire_stacks(1 * REM * seconds_per_tick) - ..() /datum/reagent/napalm/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() @@ -248,6 +248,7 @@ metabolization_rate = 0.05 * REM //slower consumption when dead /datum/reagent/cryostylane/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() metabolization_rate = 0.25 * REM//faster consumption when alive if(affected_mob.reagents.has_reagent(/datum/reagent/oxygen)) affected_mob.reagents.remove_reagent(/datum/reagent/oxygen, 0.5 * REM * seconds_per_tick) @@ -255,7 +256,6 @@ if(ishuman(affected_mob)) var/mob/living/carbon/human/humi = affected_mob humi.adjust_coretemperature(-15 * REM * seconds_per_tick) - ..() /datum/reagent/cryostylane/expose_turf(turf/exposed_turf, reac_volume) . = ..() @@ -283,9 +283,9 @@ holder.remove_reagent(/datum/reagent/oxygen, 0.5 * REM * seconds_per_tick) affected_mob.adjust_bodytemperature(15 * REM * seconds_per_tick) if(ishuman(affected_mob)) - var/mob/living/carbon/human/humi = affected_mob - humi.adjust_coretemperature(15 * REM * seconds_per_tick) - ..() + var/mob/living/carbon/human/affected_human = affected_mob + affected_human.adjust_coretemperature(15 * REM * seconds_per_tick) + return ..() /datum/reagent/pyrosium/burn(datum/reagents/holder) if(holder.has_reagent(/datum/reagent/oxygen)) @@ -305,12 +305,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/teslium/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() shock_timer++ if(shock_timer >= rand(5, 30)) //Random shocks are wildly unpredictable shock_timer = 0 affected_mob.electrocute_act(rand(5, 20), "Teslium in their body", 1, SHOCK_NOGLOVES) //SHOCK_NOGLOVES because it's caused from INSIDE of you playsound(affected_mob, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - ..() /datum/reagent/teslium/on_mob_metabolize(mob/living/carbon/human/affected_mob) . = ..() @@ -333,15 +333,16 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/teslium/energized_jelly/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(isjellyperson(affected_mob)) shock_timer = 0 //immune to shocks affected_mob.AdjustAllImmobility(-40 *REM * seconds_per_tick) - affected_mob.adjustStaminaLoss(-2 * REM * seconds_per_tick, 0) + if(affected_mob.adjustStaminaLoss(-2 * REM * seconds_per_tick, updating_stamina = FALSE)) + . = UPDATE_MOB_HEALTH if(is_species(affected_mob, /datum/species/jelly/luminescent)) var/mob/living/carbon/human/affected_human = affected_mob var/datum/species/jelly/luminescent/slime_species = affected_human.dna.species slime_species.extract_cooldown = max(slime_species.extract_cooldown - (2 SECONDS * REM * seconds_per_tick), 0) - ..() /datum/reagent/firefighting_foam name = "Firefighting Foam" diff --git a/code/modules/reagents/chemistry/reagents/reaction_agents_reagents.dm b/code/modules/reagents/chemistry/reagents/reaction_agents_reagents.dm index a86bcfc97b0a5..c1da8b7424f2a 100644 --- a/code/modules/reagents/chemistry/reagents/reaction_agents_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/reaction_agents_reagents.dm @@ -35,7 +35,7 @@ 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 + holder.remove_reagent(type, amount)//Remove from holder because it's not transferred return var/ph_change = -((amount/target.total_volume)*strength) target.adjust_all_reagents_ph(ph_change, ph, 14) @@ -61,7 +61,7 @@ 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 + holder.remove_reagent(type, amount)//Remove from holder because it's not transferred return var/ph_change = (amount/target.total_volume)*strength target.adjust_all_reagents_ph(ph_change, 0, ph) diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index b8c64a40ed463..7f4acabef6eb9 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -11,6 +11,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED ///The amount of toxin damage this will cause when metabolized (also used to calculate liver damage) var/toxpwr = 1.5 + ///The amount to multiply the liver damage this toxin does by (Handled solely in liver code) + var/liver_damage_multiplier = 1 ///won't produce a pain message when processed by liver/life() if there isn't another non-silent toxin present if true var/silent_toxin = FALSE ///The afflicted must be above this health value in order for the toxin to deal damage @@ -21,10 +23,10 @@ mytray.adjust_toxic(round(volume * 2)) /datum/reagent/toxin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(toxpwr && affected_mob.health > health_required) - affected_mob.adjustToxLoss(toxpwr * REM * normalise_creation_purity() * seconds_per_tick, FALSE, required_biotype = affected_biotype) - . = TRUE - ..() + if(affected_mob.adjustToxLoss(toxpwr * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/amatoxin name = "Amatoxin" @@ -62,8 +64,9 @@ exposed_mob.domutcheck() /datum/reagent/toxin/mutagen/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustToxLoss(0.5 * seconds_per_tick * REM, required_biotype = affected_biotype) - return ..() + . = ..() + if(affected_mob.adjustToxLoss(0.5 * seconds_per_tick * REM, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/mutagen/on_hydroponics_apply(obj/machinery/hydroponics/mytray, mob/user) mytray.mutation_roll(user) @@ -98,14 +101,16 @@ /datum/reagent/toxin/plasma/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) if(holder.has_reagent(/datum/reagent/medicine/epinephrine)) holder.remove_reagent(/datum/reagent/medicine/epinephrine, 2 * REM * seconds_per_tick) + . = ..() affected_mob.adjustPlasma(20 * REM * seconds_per_tick) - return ..() /datum/reagent/toxin/plasma/on_mob_metabolize(mob/living/carbon/affected_mob) + . = ..() if(HAS_TRAIT(affected_mob, TRAIT_PLASMA_LOVER_METABOLISM)) // sometimes mobs can temporarily metabolize plasma (e.g. plasma fixation disease symptom) toxpwr = 0 /datum/reagent/toxin/plasma/on_mob_end_metabolize(mob/living/carbon/affected_mob) + . = ..() toxpwr = initial(toxpwr) /// Handles plasma boiling. @@ -152,18 +157,20 @@ /datum/reagent/toxin/hot_ice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) if(holder.has_reagent(/datum/reagent/medicine/epinephrine)) holder.remove_reagent(/datum/reagent/medicine/epinephrine, 2 * REM * seconds_per_tick) + . = ..() affected_mob.adjustPlasma(20 * REM * seconds_per_tick) affected_mob.adjust_bodytemperature(-7 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick, affected_mob.get_body_temp_normal()) if(ishuman(affected_mob)) var/mob/living/carbon/human/humi = affected_mob humi.adjust_coretemperature(-7 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - return ..() /datum/reagent/toxin/hot_ice/on_mob_metabolize(mob/living/carbon/affected_mob) + . = ..() if(HAS_TRAIT(affected_mob, TRAIT_PLASMA_LOVER_METABOLISM)) toxpwr = 0 /datum/reagent/toxin/hot_ice/on_mob_end_metabolize(mob/living/carbon/affected_mob) + . = ..() toxpwr = initial(toxpwr) /datum/reagent/toxin/lexorin @@ -178,22 +185,20 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/lexorin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - . = TRUE - - if(HAS_TRAIT(affected_mob, TRAIT_NOBREATH)) - . = FALSE - - if(.) + . = ..() + if(!HAS_TRAIT(affected_mob, TRAIT_NOBREATH)) affected_mob.adjustOxyLoss(5 * REM * normalise_creation_purity() * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) affected_mob.losebreath += 2 * REM * normalise_creation_purity() * seconds_per_tick + . = UPDATE_MOB_HEALTH if(SPT_PROB(10, seconds_per_tick)) affected_mob.emote("gasp") - ..() /datum/reagent/toxin/lexorin/on_mob_metabolize(mob/living/affected_mob) + . = ..() RegisterSignal(affected_mob, COMSIG_CARBON_ATTEMPT_BREATHE, PROC_REF(block_breath)) /datum/reagent/toxin/lexorin/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() UnregisterSignal(affected_mob, COMSIG_CARBON_ATTEMPT_BREATHE, PROC_REF(block_breath)) /datum/reagent/toxin/lexorin/proc/block_breath(mob/living/source) @@ -211,14 +216,14 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/slimejelly/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(5, seconds_per_tick)) to_chat(affected_mob, span_danger("Your insides are burning!")) - affected_mob.adjustToxLoss(rand(20, 60), FALSE, required_biotype = affected_biotype) - . = TRUE + if(affected_mob.adjustToxLoss(rand(20, 60), updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH else if(SPT_PROB(23, seconds_per_tick)) - affected_mob.heal_bodypart_damage(5) - . = TRUE - ..() + if(affected_mob.heal_bodypart_damage(5)) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/carpotoxin name = "Carpotoxin" @@ -247,12 +252,12 @@ /datum/reagent/toxin/zombiepowder/on_mob_metabolize(mob/living/holder_mob) . = ..() holder_mob.adjustOxyLoss(0.5*REM, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - if(data?["method"] & INGEST) + if((data?["method"] & INGEST) && holder_mob.stat != DEAD) holder_mob.fakedeath(type) -/datum/reagent/toxin/zombiepowder/on_mob_end_metabolize(mob/living/holder_mob) - holder_mob.cure_fakedeath(type) - return ..() +/datum/reagent/toxin/zombiepowder/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() + affected_mob.cure_fakedeath(type) /datum/reagent/toxin/zombiepowder/on_transfer(atom/target_atom, methods, trans_volume) . = ..() @@ -263,20 +268,22 @@ zombiepowder.data["method"] |= INGEST /datum/reagent/toxin/zombiepowder/on_mob_life(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() if(HAS_TRAIT(affected_mob, TRAIT_FAKEDEATH) && HAS_TRAIT(affected_mob, TRAIT_DEATHCOMA)) - ..() - return TRUE + return + var/need_mob_update switch(current_cycle) - if(1 to 5) + if(2 to 6) affected_mob.adjust_confusion(1 SECONDS * REM * seconds_per_tick) affected_mob.adjust_drowsiness(2 SECONDS * REM * seconds_per_tick) affected_mob.adjust_slurring(6 SECONDS * REM * seconds_per_tick) - if(5 to 8) - affected_mob.adjustStaminaLoss(40 * REM * seconds_per_tick, 0) - if(9 to INFINITY) - affected_mob.fakedeath(type) - ..() - return TRUE + if(6 to 9) + need_mob_update = affected_mob.adjustStaminaLoss(40 * REM * seconds_per_tick, updating_stamina = FALSE) + if(10 to INFINITY) + if(affected_mob.stat != DEAD) + affected_mob.fakedeath(type) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/ghoulpowder name = "Ghoul Powder" @@ -291,17 +298,17 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/ghoulpowder/on_mob_metabolize(mob/living/affected_mob) - ..() + . = ..() ADD_TRAIT(affected_mob, TRAIT_FAKEDEATH, type) /datum/reagent/toxin/ghoulpowder/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_FAKEDEATH, type) - ..() /datum/reagent/toxin/ghoulpowder/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOxyLoss(1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - ..() - . = TRUE + . = ..() + if(affected_mob.adjustOxyLoss(1 * REM * seconds_per_tick, FALSE, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type)) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/mindbreaker name = "Mindbreaker Toxin" @@ -316,25 +323,23 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED addiction_types = list(/datum/addiction/hallucinogens = 18) //7.2 per 2 seconds - -/datum/reagent/toxin/mindbreaker/on_mob_metabolize(mob/living/metabolizer) +/datum/reagent/toxin/mindbreaker/on_mob_metabolize(mob/living/affected_mob) . = ..() - ADD_TRAIT(metabolizer, TRAIT_RDS_SUPPRESSED, type) + ADD_TRAIT(affected_mob, TRAIT_RDS_SUPPRESSED, type) -/datum/reagent/toxin/mindbreaker/on_mob_end_metabolize(mob/living/metabolizer) +/datum/reagent/toxin/mindbreaker/on_mob_end_metabolize(mob/living/affected_mob) . = ..() - REMOVE_TRAIT(metabolizer, TRAIT_RDS_SUPPRESSED, type) + REMOVE_TRAIT(affected_mob, TRAIT_RDS_SUPPRESSED, type) -/datum/reagent/toxin/mindbreaker/on_mob_life(mob/living/carbon/metabolizer, seconds_per_tick, times_fired) +/datum/reagent/toxin/mindbreaker/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() // mindbreaker toxin assuages hallucinations in those plagued with it, mentally - if(metabolizer.has_trauma_type(/datum/brain_trauma/mild/hallucinations)) - metabolizer.remove_status_effect(/datum/status_effect/hallucination) + if(affected_mob.has_trauma_type(/datum/brain_trauma/mild/hallucinations)) + affected_mob.remove_status_effect(/datum/status_effect/hallucination) // otherwise it creates hallucinations. truly a miracle medicine. else - metabolizer.adjust_hallucinations(10 SECONDS * REM * seconds_per_tick) - - return ..() + affected_mob.adjust_hallucinations(10 SECONDS * REM * seconds_per_tick) /datum/reagent/toxin/plantbgone name = "Plant-B-Gone" @@ -371,8 +376,8 @@ var/damage = min(round(0.4 * reac_volume, 0.1), 10) if(exposed_mob.mob_biotypes & MOB_PLANT) // spray bottle emits 5u so it's dealing ~15 dmg per spray - exposed_mob.adjustToxLoss(damage * 20, required_biotype = affected_biotype) - return + if(exposed_mob.adjustToxLoss(damage * 20, required_biotype = affected_biotype)) + return if(!(methods & VAPOR) || !iscarbon(exposed_mob)) return @@ -401,17 +406,20 @@ ph = 3.2 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED +/datum/reagent/toxin/pestkiller/on_new(data) + . = ..() + AddElement(/datum/element/bugkiller_reagent) + +/datum/reagent/toxin/pestkiller/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(affected_mob.adjustToxLoss(2 * toxpwr * REM * seconds_per_tick, updating_health = FALSE, required_biotype = MOB_BUG)) + return UPDATE_MOB_HEALTH + //Pest Spray /datum/reagent/toxin/pestkiller/on_hydroponics_apply(obj/machinery/hydroponics/mytray, mob/user) mytray.adjust_toxic(round(volume)) mytray.adjust_pestlevel(-rand(1,2)) -/datum/reagent/toxin/pestkiller/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) - . = ..() - if(exposed_mob.mob_biotypes & MOB_BUG) - var/damage = min(round(0.4*reac_volume, 0.1),10) - exposed_mob.adjustToxLoss(damage, required_biotype = affected_biotype) - /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!" @@ -433,10 +441,10 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/toxin/spore/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.damageoverlaytemp = 60 affected_mob.update_damage_hud() affected_mob.set_eye_blur_if_lower(6 SECONDS * REM * seconds_per_tick) - return ..() /datum/reagent/toxin/spore_burning name = "Burning Spore Toxin" @@ -448,9 +456,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/toxin/spore_burning/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_fire_stacks(2 * REM * seconds_per_tick) affected_mob.ignite_mob() - return ..() /datum/reagent/toxin/chloralhydrate name = "Chloral Hydrate" @@ -467,18 +475,17 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/chloralhydrate/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() switch(current_cycle) - if(1 to 10) + if(2 to 11) affected_mob.adjust_confusion(2 SECONDS * REM * normalise_creation_purity() * seconds_per_tick) affected_mob.adjust_drowsiness(4 SECONDS * REM * normalise_creation_purity() * seconds_per_tick) - if(10 to 50) + if(11 to 51) affected_mob.Sleeping(40 * REM * normalise_creation_purity() * seconds_per_tick) - . = TRUE - if(51 to INFINITY) + if(52 to INFINITY) affected_mob.Sleeping(40 * REM * normalise_creation_purity() * seconds_per_tick) - affected_mob.adjustToxLoss(1 * (current_cycle - 50) * REM * normalise_creation_purity() * seconds_per_tick, FALSE, required_biotype = affected_biotype) - . = TRUE - ..() + if(affected_mob.adjustToxLoss(1 * (current_cycle - 51) * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/fakebeer //disguised as normal beer for use by emagged brobots name = "B33r" @@ -502,13 +509,14 @@ icon_state = initial(copy_from.icon_state) /datum/reagent/toxin/fakebeer/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() switch(current_cycle) - if(1 to 50) + if(2 to 51) affected_mob.Sleeping(40 * REM * seconds_per_tick) - if(51 to INFINITY) + if(52 to INFINITY) affected_mob.Sleeping(40 * REM * seconds_per_tick) - affected_mob.adjustToxLoss(1 * (current_cycle - 50) * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - return ..() + if(affected_mob.adjustToxLoss(1 * (current_cycle - 50) * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/coffeepowder name = "Coffee Grounds" @@ -552,9 +560,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/mutetoxin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() // Gain approximately 12 seconds * creation purity seconds of silence every metabolism tick. affected_mob.set_silence_if_lower(6 SECONDS * REM * normalise_creation_purity() * seconds_per_tick) - ..() /datum/reagent/toxin/staminatoxin name = "Tirizene" @@ -566,10 +574,10 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/staminatoxin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustStaminaLoss(data * REM * seconds_per_tick, 0) + . = ..() + if(affected_mob.adjustStaminaLoss(data * REM * seconds_per_tick, updating_stamina = FALSE)) + . = UPDATE_MOB_HEALTH data = max(data - 1, 3) - ..() - . = TRUE /datum/reagent/toxin/polonium name = "Polonium" @@ -581,12 +589,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/toxin/polonium/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if (!HAS_TRAIT(affected_mob, TRAIT_IRRADIATED) && SSradiation.can_irradiate_basic(affected_mob)) affected_mob.AddComponent(/datum/component/irradiated) else - affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, required_biotype = affected_biotype) - - ..() + if(affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/histamine name = "Histamine" @@ -600,6 +608,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/toxin/histamine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(30, seconds_per_tick)) switch(pick(1, 2, 3, 4)) if(1) @@ -612,16 +621,17 @@ if(4) if(prob(75)) to_chat(affected_mob, span_danger("You scratch at an itch.")) - affected_mob.adjustBruteLoss(2*REM, FALSE, required_bodytype = affected_bodytype) - . = TRUE - ..() + if(affected_mob.adjustBruteLoss(2* REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype)) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/histamine/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOxyLoss(2 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustBruteLoss(2 * REM * seconds_per_tick, FALSE, FALSE, BODYTYPE_ORGANIC) - affected_mob.adjustToxLoss(2 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - . = TRUE + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustOxyLoss(2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustBruteLoss(2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustToxLoss(2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/formaldehyde name = "Formaldehyde" @@ -638,11 +648,15 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/formaldehyde/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(SPT_PROB(2.5, seconds_per_tick)) + var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) + if(liver && HAS_TRAIT(liver, TRAIT_CORONER_METABOLISM)) //mmmm, the forbidden pickle juice + if(affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) //it counteracts its own toxin damage. + return UPDATE_MOB_HEALTH + return + else if(SPT_PROB(2.5, seconds_per_tick)) holder.add_reagent(/datum/reagent/toxin/histamine, pick(5,15)) holder.remove_reagent(/datum/reagent/toxin/formaldehyde, 1.2) - else - return ..() + return ..() /datum/reagent/toxin/venom name = "Venom" @@ -659,20 +673,23 @@ var/newsize = 1.1 * RESIZE_DEFAULT_SIZE affected_mob.update_transform(newsize/current_size) current_size = newsize - toxpwr = 0.1 * volume - affected_mob.adjustBruteLoss((0.3 * volume) * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - . = TRUE + + if(affected_mob.adjustBruteLoss((0.3 * volume) * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype)) + . = UPDATE_MOB_HEALTH + + // chance to either decay into histamine or go the normal route of toxin metabolization if(SPT_PROB(8, seconds_per_tick)) + current_cycle++ holder.add_reagent(/datum/reagent/toxin/histamine, pick(5, 10)) holder.remove_reagent(/datum/reagent/toxin/venom, 1.1) else - ..() + return ..() || . /datum/reagent/toxin/venom/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() affected_mob.update_transform(RESIZE_DEFAULT_SIZE/current_size) current_size = RESIZE_DEFAULT_SIZE - ..() /datum/reagent/toxin/fentanyl name = "Fentanyl" @@ -688,15 +705,17 @@ addiction_types = list(/datum/addiction/opioids = 25) /datum/reagent/toxin/fentanyl/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * REM * normalise_creation_purity() * seconds_per_tick, 150) + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * REM * normalise_creation_purity() * seconds_per_tick, 150) if(affected_mob.toxloss <= 60) - affected_mob.adjustToxLoss(1 * REM * normalise_creation_purity() * seconds_per_tick, FALSE, required_biotype = affected_biotype) - if(current_cycle >= 4) + need_mob_update += affected_mob.adjustToxLoss(1 * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + if(current_cycle > 4) affected_mob.add_mood_event("smacked out", /datum/mood_event/narcotic_heavy, name) - if(current_cycle >= 18) + if(current_cycle > 18) affected_mob.Sleeping(40 * REM * normalise_creation_purity() * seconds_per_tick) - ..() - return TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/cyanide name = "Cyanide" @@ -711,13 +730,17 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/cyanide/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update = FALSE if(SPT_PROB(2.5, seconds_per_tick)) affected_mob.losebreath += 1 + need_mob_update = TRUE if(SPT_PROB(4, seconds_per_tick)) to_chat(affected_mob, span_danger("You feel horrendously weak!")) affected_mob.Stun(40) - affected_mob.adjustToxLoss(2*REM * normalise_creation_purity(), FALSE, required_biotype = affected_biotype) - return ..() + need_mob_update += affected_mob.adjustToxLoss(2*REM * normalise_creation_purity(), updating_health = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/bad_food name = "Bad Food" @@ -744,23 +767,26 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/itching_powder/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + var/need_mob_update = FALSE if(SPT_PROB(8, seconds_per_tick)) to_chat(affected_mob, span_danger("You scratch at your head.")) - affected_mob.adjustBruteLoss(0.2*REM, FALSE, required_bodytype = affected_bodytype) - . = TRUE + need_mob_update += affected_mob.adjustBruteLoss(0.2*REM, FALSE, required_bodytype = affected_bodytype) if(SPT_PROB(8, seconds_per_tick)) to_chat(affected_mob, span_danger("You scratch at your leg.")) - affected_mob.adjustBruteLoss(0.2*REM, FALSE, required_bodytype = affected_bodytype) - . = TRUE + need_mob_update += affected_mob.adjustBruteLoss(0.2*REM, FALSE, required_bodytype = affected_bodytype) if(SPT_PROB(8, seconds_per_tick)) to_chat(affected_mob, span_danger("You scratch at your arm.")) - affected_mob.adjustBruteLoss(0.2*REM, FALSE, required_bodytype = affected_bodytype) - . = TRUE + need_mob_update += affected_mob.adjustBruteLoss(0.2*REM, FALSE, required_bodytype = affected_bodytype) + + if(need_mob_update) + . = UPDATE_MOB_HEALTH + if(SPT_PROB(1.5, seconds_per_tick)) holder.add_reagent(/datum/reagent/toxin/histamine,rand(1,3)) holder.remove_reagent(/datum/reagent/toxin/itching_powder,1.2) return - ..() + else + return ..() || . /datum/reagent/toxin/initropidril name = "Initropidril" @@ -773,16 +799,17 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/toxin/initropidril/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(13, seconds_per_tick)) var/picked_option = rand(1,3) + var/need_mob_update switch(picked_option) if(1) affected_mob.Paralyze(60) - . = TRUE if(2) affected_mob.losebreath += 10 - affected_mob.adjustOxyLoss(rand(5,25), FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - . = TRUE + affected_mob.adjustOxyLoss(rand(5,25), updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update = TRUE if(3) if(!affected_mob.undergoing_cardiac_arrest() && affected_mob.can_heartattack()) affected_mob.set_heartattack(TRUE) @@ -790,9 +817,9 @@ affected_mob.visible_message(span_userdanger("[affected_mob] clutches at [affected_mob.p_their()] chest as if [affected_mob.p_their()] heart stopped!")) else affected_mob.losebreath += 10 - affected_mob.adjustOxyLoss(rand(5,25), FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - . = TRUE - return ..() || . + need_mob_update = affected_mob.adjustOxyLoss(rand(5,25), updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/pancuronium name = "Pancuronium" @@ -806,12 +833,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/toxin/pancuronium/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(current_cycle >= 10) + . = ..() + if(current_cycle > 10) affected_mob.Stun(40 * REM * seconds_per_tick) - . = TRUE if(SPT_PROB(10, seconds_per_tick)) affected_mob.losebreath += 4 - ..() + return UPDATE_MOB_HEALTH /datum/reagent/toxin/sodium_thiopental name = "Sodium Thiopental" @@ -832,11 +859,11 @@ REMOVE_TRAIT(affected_mob, TRAIT_ANTICONVULSANT, name) /datum/reagent/toxin/sodium_thiopental/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(current_cycle >= 10) + . = ..() + if(current_cycle > 10) affected_mob.Sleeping(40 * REM * seconds_per_tick) - affected_mob.adjustStaminaLoss(10 * REM * seconds_per_tick, 0) - ..() - return TRUE + if(affected_mob.adjustStaminaLoss(10 * REM * seconds_per_tick, updating_stamina = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/sulfonal name = "Sulfonal" @@ -852,9 +879,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/sulfonal/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(current_cycle >= 22) + . = ..() + if(current_cycle > 22) affected_mob.Sleeping(40 * REM * normalise_creation_purity() * seconds_per_tick) - return ..() /datum/reagent/toxin/amanitin name = "Amanitin" @@ -868,13 +895,13 @@ var/delayed_toxin_damage = 0 /datum/reagent/toxin/amanitin/on_mob_life(mob/living/affected_mob, seconds_per_tick, times_fired) - delayed_toxin_damage += (seconds_per_tick * 3) . = ..() + delayed_toxin_damage += (seconds_per_tick * 3) /datum/reagent/toxin/amanitin/on_mob_delete(mob/living/affected_mob) + . = ..() affected_mob.log_message("has taken [delayed_toxin_damage] toxin damage from amanitin toxin", LOG_ATTACK) affected_mob.adjustToxLoss(delayed_toxin_damage, required_biotype = affected_biotype) - . = ..() /datum/reagent/toxin/lipolicide name = "Lipolicide" @@ -892,11 +919,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/lipolicide/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.nutrition <= NUTRITION_LEVEL_STARVING) - affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + if(affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH affected_mob.adjust_nutrition(-3 * REM * normalise_creation_purity() * seconds_per_tick) // making the chef more valuable, one meme trap at a time affected_mob.overeatduration = 0 - return ..() /datum/reagent/toxin/coniine name = "Coniine" @@ -908,9 +936,10 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/coniine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.losebreath < 5) affected_mob.losebreath = min(affected_mob.losebreath + 5 * REM * seconds_per_tick, 5) - return ..() + return UPDATE_MOB_HEALTH /datum/reagent/toxin/spewium name = "Spewium" @@ -924,18 +953,24 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/toxin/spewium/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - .=..() - if(current_cycle >= 11 && SPT_PROB(min(30, current_cycle), seconds_per_tick)) + . = ..() + if(current_cycle > 11 && SPT_PROB(min(31, current_cycle), seconds_per_tick)) affected_mob.vomit(10, prob(10), prob(50), rand(0,4), TRUE) + var/constructed_flags = (MOB_VOMIT_MESSAGE | MOB_VOMIT_HARM) + if(prob(10)) + constructed_flags |= MOB_VOMIT_BLOOD + if(prob(50)) + constructed_flags |= MOB_VOMIT_STUN + affected_mob.vomit(vomit_flags = constructed_flags, distance = rand(0,4)) for(var/datum/reagent/toxin/R in affected_mob.reagents.reagent_list) if(R != src) affected_mob.reagents.remove_reagent(R.type,1) /datum/reagent/toxin/spewium/overdose_process(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if(current_cycle >= 33 && SPT_PROB(7.5, seconds_per_tick)) + if(current_cycle > 33 && SPT_PROB(7.5, seconds_per_tick)) affected_mob.spew_organ() - affected_mob.vomit(0, TRUE, TRUE, 4) + affected_mob.vomit(VOMIT_CATEGORY_BLOOD, lost_nutrition = 0, distance = 4) to_chat(affected_mob, span_userdanger("You feel something lumpy come up as you vomit.")) /datum/reagent/toxin/curare @@ -948,11 +983,11 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/toxin/curare/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(current_cycle >= 11) + . = ..() + if(current_cycle > 11) affected_mob.Paralyze(60 * REM * seconds_per_tick) - affected_mob.adjustOxyLoss(0.5*REM*seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - . = TRUE - ..() + if(affected_mob.adjustOxyLoss(0.5*REM*seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type)) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/heparin //Based on a real-life anticoagulant. I'm not a doctor, so this won't be realistic. name = "Heparin" @@ -973,12 +1008,12 @@ return ..() /datum/reagent/toxin/heparin/on_mob_metabolize(mob/living/affected_mob) + . = ..() ADD_TRAIT(affected_mob, TRAIT_BLOODY_MESS, /datum/reagent/toxin/heparin) - return ..() /datum/reagent/toxin/heparin/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_BLOODY_MESS, /datum/reagent/toxin/heparin) - return ..() /datum/reagent/toxin/rotatium //Rotatium. Fucks up your rotation and is hilarious name = "Rotatium" @@ -995,6 +1030,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/rotatium/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.hud_used) if(current_cycle >= 20 && (current_cycle % 20) == 0) var/atom/movable/plane_master_controller/pm_controller = affected_mob.hud_used.plane_master_controllers[PLANE_MASTERS_GAME] @@ -1003,14 +1039,13 @@ for(var/atom/movable/screen/plane_master/plane as anything in pm_controller.get_planes()) animate(plane, 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/affected_mob) + . = ..() if(affected_mob?.hud_used) var/atom/movable/plane_master_controller/pm_controller = affected_mob.hud_used.plane_master_controllers[PLANE_MASTERS_GAME] for(var/atom/movable/screen/plane_master/plane as anything in pm_controller.get_planes()) animate(plane, transform = matrix(), time = 5, easing = QUAD_EASING) - ..() /datum/reagent/toxin/anacea name = "Anacea" @@ -1028,13 +1063,12 @@ 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 affected_mob.reagents.reagent_list) affected_mob.reagents.remove_reagent(R.type, remove_amt * REM * normalise_creation_purity() * seconds_per_tick) - return ..() //ACID - /datum/reagent/toxin/acid name = "Sulfuric Acid" description = "A strong mineral acid with the molecular formula H2SO4." @@ -1098,9 +1132,9 @@ mytray.adjust_weedlevel(-rand(1,4)) /datum/reagent/toxin/acid/fluacid/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustFireLoss((current_cycle/15) * REM * normalise_creation_purity() * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - . = TRUE - ..() + . = ..() + if(affected_mob.adjustFireLoss(((current_cycle-1)/15) * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype)) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/acid/nitracid name = "Nitric Acid" @@ -1114,9 +1148,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/acid/nitracid/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustFireLoss((volume/10) * REM * normalise_creation_purity() * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) //here you go nervar - . = TRUE - ..() + . = ..() + if(affected_mob.adjustFireLoss((volume/10) * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype)) //here you go nervar + return UPDATE_MOB_HEALTH /datum/reagent/toxin/delayed name = "Toxin Microcapsules" @@ -1126,17 +1160,18 @@ var/actual_metaboliztion_rate = REAGENTS_METABOLISM toxpwr = 0 var/actual_toxpwr = 5 - var/delay = 30 + var/delay = 31 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/toxin/delayed/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(current_cycle > delay) - holder.remove_reagent(type, actual_metaboliztion_rate * affected_mob.metabolism_efficiency * seconds_per_tick) - affected_mob.adjustToxLoss(actual_toxpwr * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + if(holder) + holder.remove_reagent(type, actual_metaboliztion_rate * affected_mob.metabolism_efficiency * seconds_per_tick) + if(affected_mob.adjustToxLoss(actual_toxpwr * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH if(SPT_PROB(5, seconds_per_tick)) affected_mob.Paralyze(20) - . = TRUE - ..() /datum/reagent/toxin/mimesbane name = "Mime's Bane" @@ -1151,9 +1186,11 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/mimesbane/on_mob_metabolize(mob/living/affected_mob) + . = ..() ADD_TRAIT(affected_mob, TRAIT_EMOTEMUTE, type) /datum/reagent/toxin/mimesbane/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_EMOTEMUTE, type) /datum/reagent/toxin/bonehurtingjuice //oof ouch @@ -1170,11 +1207,13 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/bonehurtingjuice/on_mob_add(mob/living/carbon/affected_mob) + . = ..() affected_mob.say("oof ouch my bones", forced = /datum/reagent/toxin/bonehurtingjuice) - return ..() /datum/reagent/toxin/bonehurtingjuice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustStaminaLoss(7.5 * REM * seconds_per_tick, 0) + . = ..() + if(affected_mob.adjustStaminaLoss(7.5 * REM * seconds_per_tick, updating_stamina = FALSE)) + . = UPDATE_MOB_HEALTH if(SPT_PROB(10, seconds_per_tick)) switch(rand(1, 3)) if(1) @@ -1183,9 +1222,9 @@ affected_mob.manual_emote(pick("oofs silently.", "looks like [affected_mob.p_their()] bones hurt.", "grimaces, as though [affected_mob.p_their()] bones hurt.")) if(3) to_chat(affected_mob, span_warning("Your bones hurt!")) - return ..() /datum/reagent/toxin/bonehurtingjuice/overdose_process(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(2, seconds_per_tick) && iscarbon(affected_mob)) //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 = affected_mob.get_bodypart(selected_part) @@ -1193,11 +1232,11 @@ playsound(affected_mob, get_sfx(SFX_DESECRATION), 50, TRUE, -1) affected_mob.visible_message(span_warning("[affected_mob]'s bones hurt too much!!"), span_danger("Your bones hurt too much!!")) affected_mob.say("OOF!!", forced = /datum/reagent/toxin/bonehurtingjuice) - BP.receive_damage(20, 0, 200, wound_bonus = rand(30, 130)) + if(BP.receive_damage(brute = 20 * REM * seconds_per_tick, burn = 0, blocked = 200, updating_health = FALSE, wound_bonus = rand(30, 130))) + . = UPDATE_MOB_HEALTH else //SUCH A LUST FOR REVENGE!!! to_chat(affected_mob, span_warning("A phantom limb hurts!")) affected_mob.say("Why are we still here, just to suffer?", forced = /datum/reagent/toxin/bonehurtingjuice) - return ..() /datum/reagent/toxin/bungotoxin name = "Bungotoxin" @@ -1210,7 +1249,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/bungotoxin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOrganLoss(ORGAN_SLOT_HEART, 3 * REM * seconds_per_tick) + . = ..() + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_HEART, 3 * REM * seconds_per_tick)) + . = UPDATE_MOB_HEALTH // If our mob's currently dizzy from anything else, we will also gain confusion var/mob_dizziness = affected_mob.get_timed_status_effect_duration(/datum/status_effect/confusion) @@ -1218,11 +1259,9 @@ // Gain confusion equal to about half the duration of our current dizziness affected_mob.set_confusion(mob_dizziness / 2) - if(current_cycle >= 12 && SPT_PROB(4, seconds_per_tick)) + if(current_cycle >= 13 && SPT_PROB(4, seconds_per_tick)) 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(affected_mob, span_notice("[tox_message]")) - . = TRUE - ..() /datum/reagent/toxin/leadacetate name = "Lead Acetate" @@ -1235,24 +1274,142 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/leadacetate/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOrganLoss(ORGAN_SLOT_EARS, 1 * REM * seconds_per_tick) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1 * REM * seconds_per_tick) + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_EARS, 1 * REM * seconds_per_tick) + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1 * REM * seconds_per_tick) + if(need_mob_update) + . = UPDATE_MOB_HEALTH if(SPT_PROB(0.5, seconds_per_tick)) to_chat(affected_mob, span_notice("Ah, what was that? You thought you heard something...")) affected_mob.adjust_confusion(5 SECONDS) - return ..() /datum/reagent/toxin/hunterspider name = "Spider Toxin" description = "A toxic chemical produced by spiders to weaken prey." health_required = 40 + liver_damage_multiplier = 0 /datum/reagent/toxin/viperspider name = "Viper Spider Toxin" toxpwr = 5 description = "An extremely toxic chemical produced by the rare viper spider. Brings their prey to the brink of death and causes hallucinations." health_required = 10 + liver_damage_multiplier = 0 /datum/reagent/toxin/viperspider/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_hallucinations(10 SECONDS * REM * seconds_per_tick) - return ..() + +/datum/reagent/toxin/tetrodotoxin + name = "Tetrodotoxin" + description = "A colorless, oderless, tasteless neurotoxin usually carried by livers of animals of the Tetraodontiformes order." + silent_toxin = TRUE + reagent_state = SOLID + color = "#EEEEEE" + metabolization_rate = 0.1 * REAGENTS_METABOLISM + toxpwr = 0 + taste_mult = 0 + chemical_flags = REAGENT_NO_RANDOM_RECIPE + var/list/traits_not_applied = list( + TRAIT_PARALYSIS_L_ARM = BODY_ZONE_L_ARM, + TRAIT_PARALYSIS_R_ARM = BODY_ZONE_R_ARM, + TRAIT_PARALYSIS_L_LEG = BODY_ZONE_L_LEG, + TRAIT_PARALYSIS_R_LEG = BODY_ZONE_R_LEG, + ) + +/datum/reagent/toxin/tetrodotoxin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + //be ready for a cocktail of symptoms, including: + //numbness, nausea, vomit, breath loss, weakness, paralysis and nerve damage/impairment and eventually a heart attack if enough time passes. + var/need_mob_update + switch(current_cycle) + if(7 to 13) + if(SPT_PROB(20, seconds_per_tick)) + affected_mob.set_jitter_if_lower(rand(2 SECONDS, 3 SECONDS) * REM * seconds_per_tick) + if(SPT_PROB(5, seconds_per_tick)) + var/obj/item/organ/internal/tongue/tongue = affected_mob.get_organ_slot(ORGAN_SLOT_TONGUE) + if(tongue) + to_chat(affected_mob, span_warning("your [tongue.name] feels numb...")) + affected_mob.set_slurring_if_lower(5 SECONDS * REM * seconds_per_tick) + affected_mob.adjust_disgust(3.5 * REM * seconds_per_tick) + if(13 to 21) + silent_toxin = FALSE + toxpwr = 0.5 + need_mob_update = affected_mob.adjustStaminaLoss(2.5 * REM * seconds_per_tick, updating_stamina = FALSE) + if(SPT_PROB(20, seconds_per_tick)) + affected_mob.losebreath += 1 * REM * seconds_per_tick + need_mob_update = TRUE + if(SPT_PROB(40, seconds_per_tick)) + affected_mob.set_jitter_if_lower(rand(2 SECONDS, 3 SECONDS) * REM * seconds_per_tick) + affected_mob.adjust_disgust(3 * REM * seconds_per_tick) + affected_mob.set_slurring_if_lower(1 SECONDS * REM * seconds_per_tick) + affected_mob.adjustStaminaLoss(2 * REM * seconds_per_tick, updating_stamina = FALSE) + if(SPT_PROB(4, seconds_per_tick)) + paralyze_limb(affected_mob) + need_mob_update = TRUE + if(SPT_PROB(10, seconds_per_tick)) + affected_mob.adjust_confusion(rand(6 SECONDS, 8 SECONDS)) + if(21 to 29) + toxpwr = 1 + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5) + if(SPT_PROB(40, seconds_per_tick)) + affected_mob.losebreath += 2 * REM * seconds_per_tick + need_mob_update = TRUE + affected_mob.adjust_disgust(3 * REM * seconds_per_tick) + affected_mob.set_slurring_if_lower(3 SECONDS * REM * seconds_per_tick) + if(SPT_PROB(5, seconds_per_tick)) + to_chat(affected_mob, span_danger("you feel horribly weak.")) + need_mob_update += affected_mob.adjustStaminaLoss(5 * REM * seconds_per_tick, updating_stamina = FALSE) + if(SPT_PROB(8, seconds_per_tick)) + paralyze_limb(affected_mob) + need_mob_update = TRUE + if(SPT_PROB(10, seconds_per_tick)) + affected_mob.adjust_confusion(rand(6 SECONDS, 8 SECONDS)) + if(29 to INFINITY) + toxpwr = 1.5 + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1, BRAIN_DAMAGE_DEATH) + affected_mob.set_silence_if_lower(3 SECONDS * REM * seconds_per_tick) + need_mob_update += affected_mob.adjustStaminaLoss(5 * REM * seconds_per_tick, updating_stamina = FALSE) + affected_mob.adjust_disgust(2 * REM * seconds_per_tick) + if(SPT_PROB(15, seconds_per_tick)) + paralyze_limb(affected_mob) + need_mob_update = TRUE + if(SPT_PROB(10, seconds_per_tick)) + affected_mob.adjust_confusion(rand(6 SECONDS, 8 SECONDS)) + + if(current_cycle > 38 && !length(traits_not_applied) && SPT_PROB(5, seconds_per_tick) && !affected_mob.undergoing_cardiac_arrest()) + affected_mob.set_heartattack(TRUE) + to_chat(affected_mob, span_danger("you feel a burning pain spread throughout your chest, oh no...")) + + if(need_mob_update) + return UPDATE_MOB_HEALTH + +/datum/reagent/toxin/tetrodotoxin/proc/paralyze_limb(mob/living/affected_mob) + if(!length(traits_not_applied)) + return + var/added_trait = pick(traits_not_applied) + ADD_TRAIT(affected_mob, added_trait, REF(src)) + traits_not_applied -= added_trait + +/datum/reagent/toxin/tetrodotoxin/on_mob_metabolize(mob/living/affected_mob) + . = ..() + RegisterSignal(affected_mob, COMSIG_CARBON_ATTEMPT_BREATHE, PROC_REF(block_breath)) + +/datum/reagent/toxin/tetrodotoxin/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() + UnregisterSignal(affected_mob, COMSIG_CARBON_ATTEMPT_BREATHE, PROC_REF(block_breath)) + // the initial() proc doesn't work for lists. + var/list/initial_list = list( + TRAIT_PARALYSIS_L_ARM = BODY_ZONE_L_ARM, + TRAIT_PARALYSIS_R_ARM = BODY_ZONE_R_ARM, + TRAIT_PARALYSIS_L_LEG = BODY_ZONE_L_LEG, + TRAIT_PARALYSIS_R_LEG = BODY_ZONE_R_LEG, + ) + affected_mob.remove_traits(initial_list, REF(src)) + traits_not_applied = initial_list + +/datum/reagent/toxin/tetrodotoxin/proc/block_breath(mob/living/source) + SIGNAL_HANDLER + if(current_cycle > 28) + return COMSIG_CARBON_BLOCK_BREATH diff --git a/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm b/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm index 70db34460601f..73dcf8aa60b48 100644 --- a/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm +++ b/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm @@ -77,21 +77,21 @@ 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_jitter_if_lower(40 SECONDS) metabolization_rate += 0.5 //So you're not stuck forever teleporting. @@ -101,10 +101,10 @@ 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 diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index 879c6574d2fba..74e7d40659cbd 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -17,7 +17,7 @@ var/required_container_accepts_subtypes = FALSE /// If required_container_accepts_subtypes is FALSE, the exact type of what container this reaction can take place in. Otherwise, what type including subtypes are acceptable. var/atom/required_container - /// an integer required for the reaction to happen + /// Set this to true to call pre_reaction_other_checks() on react and do some more interesting reaction logic var/required_other = FALSE ///Determines if a chemical reaction can occur inside a mob diff --git a/code/modules/reagents/chemistry/recipes/drugs.dm b/code/modules/reagents/chemistry/recipes/drugs.dm index b692d22b516e9..8822aa787056a 100644 --- a/code/modules/reagents/chemistry/recipes/drugs.dm +++ b/code/modules/reagents/chemistry/recipes/drugs.dm @@ -63,6 +63,7 @@ if(ismob(holder.my_atom)) var/mob/M = holder.my_atom inside_msg = " inside [ADMIN_LOOKUPFLW(M)]" + return var/lastkey = holder.my_atom.fingerprintslast var/touch_msg = "N/A" if(lastkey) diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index 6d8e9a97eb0b8..7c4c9dfe7e951 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -90,7 +90,7 @@ /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) + required_reagents = list(/datum/reagent/water/salt = 2, /datum/reagent/consumable/sugar = 1) reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_ORGAN /datum/chemical_reaction/medicine/mine_salve @@ -138,8 +138,8 @@ reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_OTHER /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) + results = list(/datum/reagent/medicine/pen_acid = 5) + required_reagents = list(/datum/reagent/fuel = 1, /datum/reagent/ammonia = 1, /datum/reagent/toxin/formaldehyde = 1, /datum/reagent/consumable/salt = 1, /datum/reagent/toxin/cyanide = 1) reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_OTHER /datum/chemical_reaction/medicine/sal_acid @@ -380,3 +380,10 @@ 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/medicine/ondansetron + results = list(/datum/reagent/medicine/ondansetron = 3) + required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/nitrogen = 1, /datum/reagent/oxygen = 1) + required_catalysts = list(/datum/reagent/consumable/ethanol = 3) + optimal_ph_max = 11 + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_OTHER | REACTION_TAG_DRUG diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index a5739a02d9712..2723d72eff136 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -16,7 +16,7 @@ /datum/chemical_reaction/spraytan2 results = list(/datum/reagent/spraytan = 2) - required_reagents = list(/datum/reagent/consumable/orangejuice = 1, /datum/reagent/consumable/cornoil = 1) + required_reagents = list(/datum/reagent/consumable/orangejuice = 1, /datum/reagent/consumable/nutriment/fat/oil = 1) reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER /datum/chemical_reaction/impedrezene @@ -31,12 +31,12 @@ /datum/chemical_reaction/glycerol results = list(/datum/reagent/glycerol = 1) - required_reagents = list(/datum/reagent/consumable/cornoil = 3, /datum/reagent/toxin/acid = 1) + required_reagents = list(/datum/reagent/consumable/nutriment/fat/oil = 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) + results = list(/datum/reagent/consumable/salt = 2) + required_reagents = list(/datum/reagent/sodium = 1, /datum/reagent/chlorine = 1) // That's what I said! Sodium Chloride! reaction_tags = REACTION_TAG_EASY | REACTION_TAG_FOOD /datum/chemical_reaction/stable_plasma @@ -584,17 +584,21 @@ var/location = get_turf(M) if(iscarbon(M)) if(ismonkey(M)) - M.gib() + M.gib(DROP_ALL_REMAINS) else - M.vomit(blood = TRUE, stun = TRUE) //not having a redo of itching powder (hopefully) + M.vomit(VOMIT_CATEGORY_BLOOD) 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/enriched = 1, /datum/reagent/water = 5) + results = list(/datum/reagent/oxygen = 2.5, /datum/reagent/hydrogen = 5) + required_reagents = list(/datum/reagent/consumable/liquidelectricity = 1, /datum/reagent/water = 5) reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL +/datum/chemical_reaction/electrolysis2 + results = list(/datum/reagent/oxygen = 2.5, /datum/reagent/hydrogen = 5) + required_reagents = list(/datum/reagent/consumable/liquidelectricity/enriched = 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) @@ -770,6 +774,11 @@ 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/saltwater + results = list(/datum/reagent/water/salt = 2) + required_reagents = list(/datum/reagent/water = 1, /datum/reagent/consumable/salt = 1) + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRINK | REACTION_TAG_ORGAN + /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) @@ -950,3 +959,14 @@ for(var/i in rand(1, created_volume) to created_volume) new /mob/living/basic/ant(location) ..() + +/datum/chemical_reaction/hauntium_solidification + required_reagents = list(/datum/reagent/water/holywater = 10, /datum/reagent/hauntium = 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/hauntium_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/hauntium(location) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 4894c3d4fafc6..9083de70902e7 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -193,7 +193,7 @@ beeagents += R var/bee_amount = round(created_volume * 0.2) for(var/i in 1 to bee_amount) - var/mob/living/simple_animal/hostile/bee/short/new_bee = new(location) + var/mob/living/basic/bee/short/new_bee = new(location) if(LAZYLEN(beeagents)) new_bee.assign_reagent(pick(beeagents)) @@ -294,7 +294,7 @@ var/range = created_volume/3 if(isatom(holder.my_atom)) var/atom/A = holder.my_atom - A.flash_lighting_fx(_range = (range + 2)) + A.flash_lighting_fx(range = (range + 2)) for(var/mob/living/C in get_hearers_in_view(range, location)) if(C.flash_act(affect_silicon = TRUE)) if(get_dist(C, location) < 4) @@ -314,7 +314,7 @@ var/range = created_volume/10 if(isatom(holder.my_atom)) var/atom/A = holder.my_atom - A.flash_lighting_fx(_range = (range + 2)) + A.flash_lighting_fx(range = (range + 2)) for(var/mob/living/C in get_hearers_in_view(range, location)) if(C.flash_act(affect_silicon = TRUE)) if(get_dist(C, location) < 4) @@ -542,9 +542,9 @@ 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/T1 = created_volume * 8e3 //100 units : Zap 3 times, with powers 8e5/2e6/4.8e6. Tesla revolvers have a power of 10000 for comparison. + var/T2 = created_volume * 2e4 + var/T3 = created_volume * 4.8e4 var/added_delay = 0.5 SECONDS if(created_volume >= 75) addtimer(CALLBACK(src, PROC_REF(zappy_zappy), holder, T1), added_delay) diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 5dc9fed83cef8..6b5ddfc14e354 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -125,7 +125,7 @@ /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/basic/giant_spider/midwife, FACTION_NEUTRAL, FALSE), 50) + addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 3, "Traitor Spider Slime", /mob/living/basic/spider/giant/midwife, FACTION_NEUTRAL, FALSE), 50) //Silver @@ -383,8 +383,8 @@ explosion(holder.my_atom, devastation_range = 1, heavy_impact_range = 3, light_impact_range = 6, explosion_cause = src) -/datum/chemical_reaction/slime/slimecornoil - results = list(/datum/reagent/consumable/cornoil = 10) +/datum/chemical_reaction/slime/slimeoil + results = list(/datum/reagent/consumable/nutriment/fat/oil = 10) required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/oil diff --git a/code/modules/reagents/chemistry/recipes/special.dm b/code/modules/reagents/chemistry/recipes/special.dm index 26f3b567d7609..592a281ed7301 100644 --- a/code/modules/reagents/chemistry/recipes/special.dm +++ b/code/modules/reagents/chemistry/recipes/special.dm @@ -144,7 +144,7 @@ GLOBAL_LIST_INIT(medicine_reagents, build_medicine_reagents()) var/in_reagent_count = min(rand(min_input_reagents,max_input_reagents),remaining_possible_reagents.len) if(in_reagent_count <= 0) - return FALSE + CRASH("SECRET CHEM: Couldn't generate reagents for [type]!") required_reagents = list() for(var/i in 1 to in_reagent_count) @@ -217,6 +217,9 @@ GLOBAL_LIST_INIT(medicine_reagents, build_medicine_reagents()) return FALSE required_reagents = req_reag + if (required_reagents.len == 0) + return FALSE + var/req_catalysts = unwrap_reagent_list(recipe_data["required_catalysts"]) if(!req_catalysts) return FALSE @@ -278,9 +281,9 @@ GLOBAL_LIST_INIT(medicine_reagents, build_medicine_reagents()) switch(kind) if(RNGCHEM_INPUT) var/list/possible_ingredients = list() - for(var/datum/reagent/chemical in GLOB.medicine_reagents) - if(initial(chemical.chemical_flags) & REAGENT_CAN_BE_SYNTHESIZED) - possible_ingredients += chemical + for(var/datum/reagent/compound as anything in GLOB.medicine_reagents) + if(initial(compound.chemical_flags) & REAGENT_CAN_BE_SYNTHESIZED) + possible_ingredients += compound return possible_ingredients return ..() diff --git a/code/modules/reagents/chemistry/recipes/toxins.dm b/code/modules/reagents/chemistry/recipes/toxins.dm index b4e80e01cd02b..0fcae783d8993 100644 --- a/code/modules/reagents/chemistry/recipes/toxins.dm +++ b/code/modules/reagents/chemistry/recipes/toxins.dm @@ -307,8 +307,8 @@ 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) + results = list(/datum/reagent/toxin/heparin = 3) + required_reagents = list(/datum/reagent/toxin/formaldehyde = 1, /datum/reagent/consumable/salt = 1, /datum/reagent/lithium = 1) mix_message = "The mixture thins and loses all color." is_cold_recipe = FALSE required_temp = 100 diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 8f3bc31d0698c..0f81a37815777 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -4,12 +4,12 @@ icon = 'icons/obj/medical/chemical.dmi' icon_state = null w_class = WEIGHT_CLASS_TINY - /// The maximum amount of reagents per transfer that will be moved out of this reagent container. This value's position in possible_transfer_amounts should be reflected in amount_list_position. + /// The maximum amount of reagents per transfer that will be moved out of this reagent container. var/amount_per_transfer_from_this = 5 + /// Does this container allow changing transfer amounts at all, the container can still have only one possible transfer value in possible_transfer_amounts at some point even if this is true + var/has_variable_transfer_amount = TRUE /// The different possible amounts of reagent to transfer out of the container var/list/possible_transfer_amounts = list(5,10,15,20,25,30) - /// Where we are in the possible transfer amount list. Number should match the position in possible_transfer_amounts corresponding to amount_per_transfer_from_this. - var/amount_list_position = 1 /// The maximum amount of reagents this container can hold var/volume = 30 /// Reagent flags, a few examples being if the container is open or not, if its transparent, if you can inject stuff in and out of the container, and so on @@ -23,7 +23,7 @@ /// If the reagents inside of this container will splash out when the container tries to splash onto someone or something var/spillable = FALSE /** - * The different thresholds at which the reagent fill overlay will change. See reagentfillings.dmi. + * The different thresholds at which the reagent fill overlay will change. See medical/reagent_fillings.dmi. * * Should be a list of integers which correspond to a reagent unit threshold. * If null, no automatic fill overlays are generated. @@ -36,7 +36,19 @@ /// If not set, uses the current icon state. var/fill_icon_state = null /// The icon file to take fill icon appearances from - var/fill_icon = 'icons/obj/reagentfillings.dmi' + var/fill_icon = 'icons/obj/medical/reagent_fillings.dmi' + +/obj/item/reagent_containers/apply_fantasy_bonuses(bonus) + . = ..() + if(reagents) + reagents.maximum_volume = modify_fantasy_variable("maximum_volume", reagents.maximum_volume, bonus * 10, minimum = 5) + volume = modify_fantasy_variable("maximum_volume_beaker", volume, bonus * 10, minimum = 5) + +/obj/item/reagent_containers/remove_fantasy_bonuses(bonus) + if(reagents) + reagents.maximum_volume = reset_fantasy_variable("maximum_volume", reagents.maximum_volume) + volume = reset_fantasy_variable("maximum_volume_beaker", volume) + return ..() /obj/item/reagent_containers/Initialize(mapload, vol) . = ..() @@ -47,15 +59,15 @@ var/datum/disease/F = new spawned_disease() var/list/data = list("viruses"= list(F)) reagents.add_reagent(/datum/reagent/blood, disease_amount, data) - add_initial_reagents() /obj/item/reagent_containers/examine() . = ..() - if(possible_transfer_amounts.len > 1) - . += span_notice("Left-click or right-click in-hand to increase or decrease its transfer amount.") - else if(possible_transfer_amounts.len) - . += span_notice("Left-click or right-click in-hand to view its transfer amount.") + if(has_variable_transfer_amount) + if(possible_transfer_amounts.len > 1) + . += span_notice("Left-click or right-click in-hand to increase or decrease its transfer amount.") + else if(possible_transfer_amounts.len) + . += span_notice("Left-click or right-click in-hand to view its transfer amount.") /obj/item/reagent_containers/create_reagents(max_vol, flags) . = ..() @@ -77,10 +89,12 @@ reagents.add_reagent_list(list_reagents) /obj/item/reagent_containers/attack_self(mob/user) - change_transfer_amount(user, FORWARD) + if(has_variable_transfer_amount) + change_transfer_amount(user, FORWARD) /obj/item/reagent_containers/attack_self_secondary(mob/user) - change_transfer_amount(user, BACKWARD) + if(has_variable_transfer_amount) + change_transfer_amount(user, BACKWARD) /obj/item/reagent_containers/proc/mode_change_message(mob/user) return @@ -89,14 +103,15 @@ var/list_len = length(possible_transfer_amounts) if(!list_len) return + var/index = possible_transfer_amounts.Find(amount_per_transfer_from_this) || 1 switch(direction) if(FORWARD) - amount_list_position = (amount_list_position % list_len) + 1 + index = (index % list_len) + 1 if(BACKWARD) - amount_list_position = (amount_list_position - 1) || list_len + index = (index - 1) || list_len else CRASH("change_transfer_amount() called with invalid direction value") - amount_per_transfer_from_this = possible_transfer_amounts[amount_list_position] + amount_per_transfer_from_this = possible_transfer_amounts[index] balloon_alert(user, "transferring [amount_per_transfer_from_this]u") mode_change_message(user) @@ -126,7 +141,7 @@ span_danger("You splash the contents of [src] onto [target][punctuation]"), ignored_mobs = target, ) - + SEND_SIGNAL(target, COMSIG_ATOM_SPLASHED) if (ismob(target)) var/mob/target_mob = target target_mob.show_message( @@ -137,11 +152,11 @@ playsound(target, 'sound/effects/slosh.ogg', 25, TRUE) - var/image/splash_animation = image('icons/effects/effects.dmi', target, "splash") + var/mutable_appearance/splash_animation = mutable_appearance('icons/effects/effects.dmi', "splash") if(isturf(target)) - splash_animation = image('icons/effects/effects.dmi', target, "splash_floor") + splash_animation.icon_state = "splash_floor" splash_animation.color = mix_color_from_reagents(reagents.reagent_list) - flick_overlay_global(splash_animation, GLOB.clients, 1.0 SECONDS) + target.flick_overlay_view(splash_animation, 1 SECONDS) for(var/datum/reagent/reagent as anything in reagents.reagent_list) reagent_text += "[reagent] ([num2text(reagent.volume)])," @@ -177,9 +192,9 @@ */ /obj/item/reagent_containers/on_accidental_consumption(mob/living/carbon/M, mob/living/carbon/user, obj/item/source_item, discover_after = TRUE) M.losebreath += 2 - reagents?.trans_to(M, min(15, reagents.total_volume / rand(5,10)), transfered_by = user, methods = INGEST) + reagents?.trans_to(M, min(15, reagents.total_volume / rand(5,10)), transferred_by = user, methods = INGEST) if(source_item?.reagents) - reagents.trans_to(source_item, min(source_item.reagents.total_volume / 2, reagents.total_volume / 5), transfered_by = user, methods = TOUCH) + reagents.trans_to(source_item, min(source_item.reagents.total_volume / 2, reagents.total_volume / 5), transferred_by = user, methods = TOUCH) return ..() @@ -236,11 +251,11 @@ playsound(target, 'sound/effects/slosh.ogg', 25, TRUE) - var/image/splash_animation = image('icons/effects/effects.dmi', target, "splash") + var/mutable_appearance/splash_animation = mutable_appearance('icons/effects/effects.dmi', "splash") if(isturf(target)) - splash_animation = image('icons/effects/effects.dmi', target, "splash_floor") + splash_animation.icon_state = "splash_floor" splash_animation.color = mix_color_from_reagents(reagents.reagent_list) - flick_overlay_global(splash_animation, GLOB.clients, 1.0 SECONDS) + target.flick_overlay_view(splash_animation, 1.0 SECONDS) reagents.clear_reagents() diff --git a/code/modules/reagents/reagent_containers/chem_pack.dm b/code/modules/reagents/reagent_containers/chem_pack.dm index 7e6df4a0b4ae8..3345f1e99ef76 100644 --- a/code/modules/reagents/reagent_containers/chem_pack.dm +++ b/code/modules/reagents/reagent_containers/chem_pack.dm @@ -10,7 +10,7 @@ resistance_flags = ACID_PROOF var/sealed = FALSE fill_icon_thresholds = list(10, 20, 30, 40, 50, 60, 70, 80, 90, 100) - possible_transfer_amounts = list() + has_variable_transfer_amount = FALSE /obj/item/reagent_containers/chem_pack/AltClick(mob/living/user) if(user.can_perform_action(src, NEED_DEXTERITY) && !sealed) diff --git a/code/modules/reagents/reagent_containers/condiment.dm b/code/modules/reagents/reagent_containers/condiment.dm index 47d408053e246..8b8d4470f2fd7 100644 --- a/code/modules/reagents/reagent_containers/condiment.dm +++ b/code/modules/reagents/reagent_containers/condiment.dm @@ -62,7 +62,7 @@ M.visible_message(span_warning("[user] fed [M] from [src]."), \ span_warning("[user] fed you from [src].")) log_combat(user, M, "fed", reagents.get_reagent_log_string()) - reagents.trans_to(M, 10, transfered_by = user, methods = INGEST) + reagents.trans_to(M, 10, transferred_by = user, methods = INGEST) playsound(M.loc,'sound/items/drink.ogg', rand(10,50), TRUE) return TRUE @@ -81,7 +81,7 @@ to_chat(user, span_warning("[src] is full!")) return - var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transfered_by = user) + var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transferred_by = user) to_chat(user, span_notice("You fill [src] with [trans] units of the contents of [target].")) //Something like a glass or a food item. Player probably wants to transfer TO it. @@ -92,7 +92,7 @@ if(target.reagents.total_volume >= target.reagents.maximum_volume) to_chat(user, span_warning("you can't add anymore to [target]!")) return - var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this, transfered_by = user) + var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this, transferred_by = user) to_chat(user, span_notice("You transfer [trans] units of the condiment to [target].")) /obj/item/reagent_containers/condiment/enzyme @@ -273,18 +273,18 @@ list_reagents = list(/datum/reagent/consumable/vinegar = 50) fill_icon_thresholds = null -/obj/item/reagent_containers/condiment/cooking_oil +/obj/item/reagent_containers/condiment/vegetable_oil name = "cooking oil" desc = "For all your deep-frying needs." icon_state = "cooking_oil" - list_reagents = list(/datum/reagent/consumable/cooking_oil = 50) + list_reagents = list(/datum/reagent/consumable/nutriment/fat/oil = 50) fill_icon_thresholds = null -/obj/item/reagent_containers/condiment/quality_oil +/obj/item/reagent_containers/condiment/olive_oil name = "quality oil" desc = "For the fancy chef inside everyone." icon_state = "oliveoil" - list_reagents = list(/datum/reagent/consumable/quality_oil = 50) + list_reagents = list(/datum/reagent/consumable/nutriment/fat/oil/olive = 50) fill_icon_thresholds = null /obj/item/reagent_containers/condiment/yoghurt @@ -324,6 +324,51 @@ list_reagents = list(/datum/reagent/consumable/ketchup = 50) fill_icon_thresholds = null +/obj/item/reagent_containers/condiment/worcestershire + name = "worcestershire sauce" + desc = "A fermented sauce of legend from old England. Makes almost anything better." + icon_state = "worcestershire" + list_reagents = list(/datum/reagent/consumable/worcestershire = 50) + fill_icon_thresholds = null + +/obj/item/reagent_containers/condiment/red_bay + name = "\improper Red Bay seasoning" + desc = "Mars' favourite seasoning." + icon_state = "red_bay" + list_reagents = list(/datum/reagent/consumable/red_bay = 50) + fill_icon_thresholds = null + +/obj/item/reagent_containers/condiment/curry_powder + name = "curry powder" + desc = "It's this yellow magic that makes curry taste like curry." + icon_state = "curry_powder" + list_reagents = list(/datum/reagent/consumable/curry_powder = 50) + fill_icon_thresholds = null + +/obj/item/reagent_containers/condiment/dashi_concentrate + name = "dashi concentrate" + desc = "A bottle of Amagi brand dashi concentrate. Simmer with water in a 1:8 ratio for a perfect dashi broth." + icon_state = "dashi_concentrate" + list_reagents = list(/datum/reagent/consumable/dashi_concentrate = 50) + fill_icon_thresholds = null + +/obj/item/reagent_containers/condiment/coconut_milk + name = "coconut milk" + desc = "It's coconut milk. Toasty!" + icon_state = "coconut_milk" + inhand_icon_state = "carton" + lefthand_file = 'icons/mob/inhands/items/drinks_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items/drinks_righthand.dmi' + list_reagents = list(/datum/reagent/consumable/coconut_milk = 50) + fill_icon_thresholds = null + +/obj/item/reagent_containers/condiment/grounding_solution + name = "grounding solution" + desc = "A food-safe ionic solution designed to neutralise the enigmatic \"liquid electricity\" that is common to food from Sprout, forming harmless salt on contact." + icon_state = "grounding_solution" + list_reagents = list(/datum/reagent/consumable/grounding_solution = 50) + fill_icon_thresholds = null + //technically condiment packs but they are non transparent /obj/item/reagent_containers/condiment/creamer @@ -373,7 +418,7 @@ /datum/reagent/consumable/frostoil = list("condi_frostoil", "Coldsauce", "Leaves the tongue numb in its passage"), /datum/reagent/consumable/salt = list("condi_salt", "Salt Shaker", "Salt. From space oceans, presumably"), /datum/reagent/consumable/blackpepper = list("condi_pepper", "Pepper Mill", "Often used to flavor food or make people sneeze"), - /datum/reagent/consumable/cornoil = list("condi_cornoil", "Corn Oil", "A delicious oil used in cooking. Made from corn"), + /datum/reagent/consumable/nutriment/fat/oil = list("condi_cornoil", "Vegetable Oil", "A delicious oil used in cooking."), /datum/reagent/consumable/sugar = list("condi_sugar", "Sugar", "Tasty spacey sugar!"), /datum/reagent/consumable/astrotame = list("condi_astrotame", "Astrotame", "The sweetness of a thousand sugars but none of the calories."), /datum/reagent/consumable/bbqsauce = list("condi_bbq", "BBQ sauce", "Hand wipes not included."), @@ -411,7 +456,7 @@ return else to_chat(user, span_notice("You tear open [src] above [target] and the condiments drip onto it.")) - src.reagents.trans_to(target, amount_per_transfer_from_this, transfered_by = user) + src.reagents.trans_to(target, amount_per_transfer_from_this, transferred_by = user) qdel(src) return return . | ..() diff --git a/code/modules/reagents/reagent_containers/cups/_cup.dm b/code/modules/reagents/reagent_containers/cups/_cup.dm index 45c2f00528b52..7ccc3209ab0d7 100644 --- a/code/modules/reagents/reagent_containers/cups/_cup.dm +++ b/code/modules/reagents/reagent_containers/cups/_cup.dm @@ -2,7 +2,6 @@ name = "open container" amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5, 10, 15, 20, 25, 30, 50) - amount_list_position = 2 volume = 50 reagent_flags = OPENCONTAINER | DUNKABLE spillable = TRUE @@ -26,34 +25,37 @@ var/list/types = bitfield_to_list(drink_type, FOOD_FLAGS) . += span_notice("It is [lowertext(english_list(types))].") -/obj/item/reagent_containers/cup/proc/checkLiked(fraction, mob/M) - if(last_check_time + 50 >= world.time) - return - if(!ishuman(M)) - return - var/mob/living/carbon/human/H = M - if(HAS_TRAIT(H, TRAIT_AGEUSIA)) - if(drink_type & H.dna.species.toxic_food) - to_chat(H, span_warning("You don't feel so good...")) - H.adjust_disgust(25 + 30 * fraction) - else - if(drink_type & H.dna.species.toxic_food) - to_chat(H,span_warning("What the hell was that thing?!")) - H.adjust_disgust(25 + 30 * fraction) - H.add_mood_event("toxic_food", /datum/mood_event/disgusting_food) - else if(drink_type & H.dna.species.disliked_food) - to_chat(H,span_notice("That didn't taste very good...")) - H.adjust_disgust(11 + 15 * fraction) - H.add_mood_event("gross_food", /datum/mood_event/gross_food) - else if(drink_type & H.dna.species.liked_food) - to_chat(H,span_notice("I love this taste!")) - H.adjust_disgust(-5 + -2.5 * fraction) - H.add_mood_event("fav_food", /datum/mood_event/favorite_food) - +/** + * Checks if the mob actually liked drinking this cup. + * + * This is a bunch of copypaste from the edible component, consider reworking this to use it! + */ +/obj/item/reagent_containers/cup/proc/checkLiked(fraction, mob/eater) + if(last_check_time + 5 SECONDS > world.time) + return FALSE + if(!ishuman(eater)) + return FALSE + var/mob/living/carbon/human/gourmand = eater + //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((drink_type & BREAKFAST) && world.time - SSticker.round_start_time < STOP_SERVING_BREAKFAST) - H.add_mood_event("breakfast", /datum/mood_event/breakfast) + gourmand.add_mood_event("breakfast", /datum/mood_event/breakfast) last_check_time = world.time + var/food_taste_reaction = gourmand.get_food_taste_reaction(src, drink_type) + switch(food_taste_reaction) + if(FOOD_TOXIC) + to_chat(gourmand,span_warning("What the hell was that thing?!")) + gourmand.adjust_disgust(25 + 30 * fraction) + gourmand.add_mood_event("toxic_food", /datum/mood_event/disgusting_food) + if(FOOD_DISLIKED) + to_chat(gourmand,span_notice("That didn't taste very good...")) + gourmand.adjust_disgust(11 + 15 * fraction) + gourmand.add_mood_event("gross_food", /datum/mood_event/gross_food) + if(FOOD_LIKED) + to_chat(gourmand,span_notice("I love this taste!")) + gourmand.adjust_disgust(-5 + -2.5 * fraction) + gourmand.add_mood_event("fav_food", /datum/mood_event/favorite_food) + /obj/item/reagent_containers/cup/attack(mob/living/target_mob, mob/living/user, obj/target) if(!canconsume(target_mob, user)) return @@ -83,7 +85,7 @@ SEND_SIGNAL(src, COMSIG_GLASS_DRANK, target_mob, user) var/fraction = min(gulp_size/reagents.total_volume, 1) - reagents.trans_to(target_mob, gulp_size, transfered_by = user, methods = INGEST) + reagents.trans_to(target_mob, gulp_size, transferred_by = user, methods = INGEST) checkLiked(fraction, target_mob) playsound(target_mob.loc,'sound/items/drink.ogg', rand(10,50), TRUE) if(!iscarbon(target_mob)) @@ -121,7 +123,7 @@ to_chat(user, span_warning("[target] is full.")) return - var/trans = reagents.trans_to(target, amount_per_transfer_from_this, transfered_by = user) + var/trans = reagents.trans_to(target, amount_per_transfer_from_this, transferred_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. @@ -133,7 +135,7 @@ to_chat(user, span_warning("[src] is full.")) return - var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transfered_by = user) + var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transferred_by = user) to_chat(user, span_notice("You fill [src] with [trans] unit\s of the contents of [target].")) target.update_appearance() @@ -154,7 +156,7 @@ 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) + var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transferred_by = user) to_chat(user, span_notice("You fill [src] with [trans] unit\s of the contents of [target].")) target.update_appearance() @@ -190,7 +192,7 @@ to_chat(user, span_notice("[src] is full.")) else to_chat(user, span_notice("You break [attacking_egg] in [src].")) - attacking_egg.reagents.trans_to(src, attacking_egg.reagents.total_volume, transfered_by = user) + attacking_egg.reagents.trans_to(src, attacking_egg.reagents.total_volume, transferred_by = user) qdel(attacking_egg) return @@ -342,7 +344,7 @@ /obj/item/reagent_containers/cup/bucket name = "bucket" desc = "It's a bucket." - icon = 'icons/obj/janitor.dmi' + icon = 'icons/obj/service/janitor.dmi' worn_icon = 'icons/mob/clothing/head/utility.dmi' icon_state = "bucket" inhand_icon_state = "bucket" @@ -403,10 +405,10 @@ /obj/item/reagent_containers/cup/bucket/attackby(obj/O, mob/user, params) if(istype(O, /obj/item/mop)) if(reagents.total_volume < 1) - to_chat(user, span_warning("[src] is out of water!")) + user.balloon_alert(user, "empty!") else - reagents.trans_to(O, 5, transfered_by = user) - to_chat(user, span_notice("You wet [O] in [src].")) + reagents.trans_to(O, 5, transferred_by = user) + user.balloon_alert(user, "doused [O]") playsound(loc, 'sound/effects/slosh.ogg', 25, TRUE) return else if(isprox(O)) //This works with wooden buckets for now. Somewhat unintended, but maybe someone will add sprites for it soon(TM) @@ -485,36 +487,10 @@ if(do_after(user, 25, target = src)) user.adjustStaminaLoss(40) switch(picked_option) - if("Juice") //prioritize juicing - if(grinded.juice_results) - grinded.on_juice() - reagents.add_reagent_list(grinded.juice_results) - to_chat(user, span_notice("You juice [grinded] into a fine liquid.")) - QDEL_NULL(grinded) - return - else - grinded.on_grind() - reagents.add_reagent_list(grinded.grind_results) - if(grinded.reagents) //If grinded item has reagents within, transfer them to the mortar - grinded.reagents.trans_to(src, grinded.reagents.total_volume, transfered_by = user) - to_chat(user, span_notice("You try to juice [grinded] but there is no liquids in it. Instead you get nice powder.")) - QDEL_NULL(grinded) - return + if("Juice") + return juice_item(grinded, user) if("Grind") - if(grinded.grind_results) - grinded.on_grind() - reagents.add_reagent_list(grinded.grind_results) - if(grinded.reagents) //If grinded item has reagents within, transfer them to the mortar - grinded.reagents.trans_to(src, grinded.reagents.total_volume, transfered_by = user) - to_chat(user, span_notice("You break [grinded] into powder.")) - QDEL_NULL(grinded) - return - else - grinded.on_juice() - reagents.add_reagent_list(grinded.juice_results) - to_chat(user, span_notice("You try to grind [grinded] but it almost instantly turns into a fine liquid.")) - QDEL_NULL(grinded) - return + return grind_item(grinded, user) else to_chat(user, span_notice("You try to grind the mortar itself instead of [grinded]. You failed.")) return @@ -525,12 +501,31 @@ if(grinded) to_chat(user, span_warning("There is something inside already!")) return - if(I.juice_results || I.grind_results) + if(I.juice_typepath || I.grind_results) I.forceMove(src) grinded = I return to_chat(user, span_warning("You can't grind this!")) +/obj/item/reagent_containers/cup/mortar/proc/grind_item(obj/item/item, mob/living/carbon/human/user) + if(!item.grind(reagents, user)) + if(isstack(item)) + to_chat(usr, span_notice("[src] attempts to grind as many pieces of [item] as possible.")) + else + to_chat(user, span_danger("You fail to grind [item].")) + return + to_chat(user, span_notice("You grind [item] into a nice powder.")) + grinded = null + QDEL_NULL(item) + +/obj/item/reagent_containers/cup/mortar/proc/juice_item(obj/item/item, mob/living/carbon/human/user) + if(!item.juice(reagents, user)) + to_chat(user, span_notice("You fail to juice [item].")) + return + to_chat(user, span_notice("You juice [item] into a fine liquid.")) + grinded = null + QDEL_NULL(item) + //Coffeepots: for reference, a standard cup is 30u, to allow 20u for sugar/sweetener/milk/creamer /obj/item/reagent_containers/cup/coffeepot name = "coffeepot" diff --git a/code/modules/reagents/reagent_containers/cups/bottle.dm b/code/modules/reagents/reagent_containers/cups/bottle.dm index a2dae93c22ec0..1e4466da8c331 100644 --- a/code/modules/reagents/reagent_containers/cups/bottle.dm +++ b/code/modules/reagents/reagent_containers/cups/bottle.dm @@ -501,7 +501,7 @@ balloon_alert(user, "container full!") return TRUE - var/transfer_amount = reagents.trans_to(attacking_item, amount_per_transfer_from_this, transfered_by = user) + var/transfer_amount = reagents.trans_to(attacking_item, amount_per_transfer_from_this, transferred_by = user) balloon_alert(user, "transferred [transfer_amount] unit\s") flick("syrup_anim",src) diff --git a/code/modules/reagents/reagent_containers/cups/drinkingglass.dm b/code/modules/reagents/reagent_containers/cups/drinkingglass.dm index 280da37f3275c..c32c83effa96b 100644 --- a/code/modules/reagents/reagent_containers/cups/drinkingglass.dm +++ b/code/modules/reagents/reagent_containers/cups/drinkingglass.dm @@ -100,3 +100,12 @@ /obj/item/reagent_containers/cup/glass/drinkingglass/filled/nuka_cola name = "Nuka Cola" list_reagents = list(/datum/reagent/consumable/nuka_cola = 50) + +/obj/item/reagent_containers/cup/glass/drinkingglass/filled/half_full + name = "half full glass of water" + desc = "It's a glass of water. It seems half full. Or is it half empty? You're pretty sure it's full of shit." + list_reagents = list(/datum/reagent/water = 25) + +/obj/item/reagent_containers/cup/glass/drinkingglass/filled/half_full/Initialize(mapload, vol) + . = ..() + name = "[pick("half full", "half empty")] glass of water" diff --git a/code/modules/reagents/reagent_containers/cups/drinks.dm b/code/modules/reagents/reagent_containers/cups/drinks.dm index 2cdf7053aa490..2cf34da1a6228 100644 --- a/code/modules/reagents/reagent_containers/cups/drinks.dm +++ b/code/modules/reagents/reagent_containers/cups/drinks.dm @@ -49,7 +49,7 @@ throwforce = 1 amount_per_transfer_from_this = 5 custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT) - possible_transfer_amounts = list(5) + has_variable_transfer_amount = FALSE volume = 5 flags_1 = CONDUCT_1 spillable = TRUE diff --git a/code/modules/reagents/reagent_containers/cups/glassbottle.dm b/code/modules/reagents/reagent_containers/cups/glassbottle.dm index 09cf510751813..e204c6803fb89 100644 --- a/code/modules/reagents/reagent_containers/cups/glassbottle.dm +++ b/code/modules/reagents/reagent_containers/cups/glassbottle.dm @@ -4,6 +4,18 @@ //Functionally identical to regular drinks. The only difference is that the default bottle size is 100. - Darem //Bottles now knockdown and break when smashed on people's heads. - Giacom +/// Initializes GLOB.alcohol_containers, only containers that actually have reagents are added to the list. +/proc/init_alcohol_containers() + var/list/containers = subtypesof(/obj/item/reagent_containers/cup/glass/bottle) + for(var/typepath in containers) + containers -= typepath + var/obj/item/reagent_containers/cup/glass/bottle/instance = new typepath + if(!length(instance.list_reagents)) + qdel(instance) + continue + containers[typepath] = instance + return containers + /obj/item/reagent_containers/cup/glass/bottle name = "glass bottle" desc = "This blank bottle is unyieldingly anonymous, offering no clues to its contents." @@ -28,6 +40,12 @@ tool_behaviour = TOOL_ROLLINGPIN // Used to knock out the Chef. toolspeed = 1.3 //it's a little awkward to use, but it's a cylinder alright. +/obj/item/reagent_containers/cup/glass/bottle/Initialize(mapload, vol) + . = ..() + AddComponent(/datum/component/slapcrafting,\ + slapcraft_recipes = list(/datum/crafting_recipe/molotov)\ + ) + /obj/item/reagent_containers/cup/glass/bottle/small name = "small glass bottle" desc = "This blank bottle is unyieldingly anonymous, offering no clues to its contents." @@ -138,7 +156,7 @@ if(3) intensity_state = "high" ///The froth fountain that we are sticking onto the bottle - var/mutable_appearance/froth = mutable_appearance(icon, "froth_bottle_[intensity_state]") + var/mutable_appearance/froth = mutable_appearance('icons/obj/drinks/drink_effects.dmi', "froth_bottle_[intensity_state]") froth.pixel_x = offset_x froth.pixel_y = offset_y add_overlay(froth) @@ -163,6 +181,7 @@ attack_verb_continuous = list("stabs", "slashes", "attacks") attack_verb_simple = list("stab", "slash", "attack") sharpness = SHARP_EDGED + custom_materials = list(/datum/material/glass=SMALL_MATERIAL_AMOUNT) ///The mask image for mimicking a broken-off bottom of the bottle var/static/icon/broken_outline = icon('icons/obj/drinks/drink_effects.dmi', "broken") ///The mask image for mimicking a broken-off neck of the bottle @@ -216,11 +235,13 @@ /obj/item/reagent_containers/cup/glass/bottle/beer/light name = "Carp Lite" desc = "Brewed with \"Pure Ice Asteroid Spring Water\"." + icon_state = "litebeer" list_reagents = list(/datum/reagent/consumable/ethanol/beer/light = 30) /obj/item/reagent_containers/cup/glass/bottle/rootbeer name = "Two-Time root beer" desc = "A popular, old-fashioned brand of root beer, known for its extremely sugary formula. Might make you want a nap afterwards." + icon_state = "twotime" volume = 30 list_reagents = list(/datum/reagent/consumable/rootbeer = 30) drink_type = SUGAR | JUNKFOOD @@ -315,6 +336,7 @@ /obj/item/reagent_containers/cup/glass/bottle/holywater/hell desc = "A flask of holy water...it's been sitting in the Necropolis a while though." + icon_state = "unholyflask" list_reagents = list(/datum/reagent/hellwater = 100) /obj/item/reagent_containers/cup/glass/bottle/vermouth @@ -643,14 +665,14 @@ update_appearance() make_froth(offset_x = 0, offset_y = sabraged ? 13 : 15, intensity = froth_severity) //the y offset for sabraged is lower because the bottle's lip is smashed ///Type of cork to fire away - var/obj/projectile/bullet/reusable/cork_to_fire = sabraged ? /obj/projectile/bullet/reusable/champagne_cork/sabrage : /obj/projectile/bullet/reusable/champagne_cork + var/obj/projectile/bullet/cork_to_fire = sabraged ? /obj/projectile/bullet/champagne_cork/sabrage : /obj/projectile/bullet/champagne_cork ///Our resulting cork projectile - var/obj/projectile/bullet/reusable/champagne_cork/popped_cork = new cork_to_fire (drop_location()) + var/obj/projectile/bullet/champagne_cork/popped_cork = new cork_to_fire (drop_location()) popped_cork.firer = user popped_cork.fired_from = src popped_cork.fire(dir2angle(user.dir) + rand(-30, 30)) -/obj/projectile/bullet/reusable/champagne_cork +/obj/projectile/bullet/champagne_cork name = "champagne cork" icon = 'icons/obj/drinks/drink_effects.dmi' icon_state = "champagne_cork" @@ -664,14 +686,18 @@ ricochet_incidence_leeway = 0 range = 7 knockdown = 2 SECONDS - ammo_type = /obj/item/trash/champagne_cork + var/drop_type = /obj/item/trash/champagne_cork + +/obj/projectile/bullet/champagne_cork/Initialize(mapload) + . = ..() + AddElement(/datum/element/projectile_drop, drop_type) -/obj/projectile/bullet/reusable/champagne_cork/sabrage +/obj/projectile/bullet/champagne_cork/sabrage icon_state = "champagne_cork_sabrage" damage = 12 ricochets_max = 2 //bit heavier range = 6 - ammo_type = /obj/item/trash/champagne_cork/sabrage + drop_type = /obj/item/trash/champagne_cork/sabrage /obj/item/trash/champagne_cork name = "champagne cork" @@ -714,6 +740,30 @@ list_reagents = list(/datum/reagent/consumable/ethanol/mushi_kombucha = 30) isGlass = FALSE +/obj/item/reagent_containers/cup/glass/bottle/hakka_mate + name = "Hakka-Mate" + desc = "Hakka-Mate: it's an acquired taste." + icon_state = "hakka_mate_bottle" + list_reagents = list(/datum/reagent/consumable/hakka_mate = 30) + +/obj/item/reagent_containers/cup/glass/bottle/shochu + name = "Shu-Kouba Straight Shochu" + desc = "A boozier form of shochu designed for mixing. Comes straight from Mars' Dusty City itself, Shu-Kouba." + icon_state = "shochu_bottle" + list_reagents = list(/datum/reagent/consumable/ethanol/shochu = 100) + +/obj/item/reagent_containers/cup/glass/bottle/yuyake + name = "Moonlabor Yūyake" + desc = "The distilled essence of disco and flared pants, captured like lightning in a bottle." + icon_state = "yuyake_bottle" + list_reagents = list(/datum/reagent/consumable/ethanol/yuyake = 100) + +/obj/item/reagent_containers/cup/glass/bottle/coconut_rum + name = "Breezy Shoals Coconut Rum" + desc = "Live the breezy life with Breezy Shoals, made with only the *finest Caribbean rum." + icon_state = "coconut_rum_bottle" + list_reagents = list(/datum/reagent/consumable/ethanol/coconut_rum = 100) + ////////////////////////// MOLOTOV /////////////////////// /obj/item/reagent_containers/cup/glass/bottle/molotov name = "molotov cocktail" @@ -794,7 +844,7 @@ /obj/item/reagent_containers/cup/glass/bottle/pruno name = "pruno mix" desc = "A trash bag filled with fruit, sugar, yeast, and water, pulped together into a pungent slurry to be fermented in an enclosed space, traditionally the toilet. Security would love to confiscate this, one of the many things wrong with them." - icon = 'icons/obj/janitor.dmi' + icon = 'icons/obj/service/janitor.dmi' icon_state = "trashbag" list_reagents = list(/datum/reagent/consumable/prunomix = 50) var/fermentation_time = 30 SECONDS /// time it takes to ferment @@ -874,6 +924,22 @@ list_reagents = list(/datum/reagent/consumable/cream = 100) drink_type = DAIRY +/obj/item/reagent_containers/cup/glass/bottle/juice/eggnog + name = "eggnog" + desc = "For enjoying the most wonderful time of the year." + icon = 'icons/obj/drinks/boxes.dmi' + icon_state = "nog2" + list_reagents = list(/datum/reagent/consumable/ethanol/eggnog = 100) + drink_type = FRUIT + +/obj/item/reagent_containers/cup/glass/bottle/juice/dreadnog + name = "eggnog" + desc = "For when you want some nondescript soda inside of your eggnog!" + icon = 'icons/obj/drinks/boxes.dmi' + icon_state = "dreadnog" + list_reagents = list(/datum/reagent/consumable/ethanol/dreadnog = 100) + drink_type = FRUIT | GROSS + /obj/item/reagent_containers/cup/glass/bottle/juice/tomatojuice name = "tomato juice" desc = "Well, at least it LOOKS like tomato juice. You can't tell with all that redness." diff --git a/code/modules/reagents/reagent_containers/cups/soda.dm b/code/modules/reagents/reagent_containers/cups/soda.dm index 281633fb3a887..5bf0eb782c54d 100644 --- a/code/modules/reagents/reagent_containers/cups/soda.dm +++ b/code/modules/reagents/reagent_containers/cups/soda.dm @@ -21,6 +21,12 @@ /// If the can hasn't been opened yet, this is the measure of how fizzed up it is from being shaken or thrown around. When opened, this is rolled as a percentage chance to burst var/fizziness = 0 +/obj/item/reagent_containers/cup/soda_cans/Initialize(mapload, vol) + . = ..() + AddComponent(/datum/component/slapcrafting,\ + slapcraft_recipes = list(/datum/crafting_recipe/improv_explosive)\ + ) + /obj/item/reagent_containers/cup/soda_cans/random/Initialize(mapload) ..() var/T = pick(subtypesof(/obj/item/reagent_containers/cup/soda_cans) - /obj/item/reagent_containers/cup/soda_cans/random) @@ -36,7 +42,7 @@ sleep(1 SECONDS) H.visible_message(span_suicide("[H] takes a big sip from [src]! It looks like [H.p_theyre()] trying to commit suicide!")) playsound(H,'sound/items/drink.ogg', 80, TRUE) - reagents.trans_to(H, src.reagents.total_volume, transfered_by = H) //a big sip + reagents.trans_to(H, src.reagents.total_volume, transferred_by = H) //a big sip sleep(0.5 SECONDS) H.say(pick( "Now, Outbomb Cuban Pete, THAT was a game.", @@ -252,6 +258,21 @@ list_reagents = list(/datum/reagent/consumable/shamblers = 30) drink_type = SUGAR | JUNKFOOD +/obj/item/reagent_containers/cup/soda_cans/shamblers/eldritch + name = "Shambler's juice Eldritch Energy!" + desc = "~J'I'CE!~" + icon_state = "shamblerseldritch" + volume = 40 + list_reagents = list(/datum/reagent/consumable/shamblers = 30, /datum/reagent/eldritch = 5) + drink_type = SUGAR | JUNKFOOD + +/obj/item/reagent_containers/cup/soda_cans/wellcheers + name = "Wellcheers Juice" + desc = "A strange purple drink, smelling of saltwater. Somewhere in the distance, you hear seagulls." + icon_state = "wellcheers" + list_reagents = list(/datum/reagent/consumable/wellcheers = 30) + drink_type = SUGAR | JUNKFOOD + /obj/item/reagent_containers/cup/soda_cans/grey_bull name = "Grey Bull" desc = "Grey Bull, it gives you gloves!" @@ -268,8 +289,51 @@ list_reagents = list(/datum/reagent/consumable/monkey_energy = 50) drink_type = SUGAR | JUNKFOOD +/obj/item/reagent_containers/cup/soda_cans/volt_energy + name = "24-Volt Energy" + desc = "Recharge, with 24-Volt Energy!" + icon_state = "volt_energy" + list_reagents = list(/datum/reagent/consumable/volt_energy = 30) + drink_type = SUGAR | JUNKFOOD + +/obj/item/reagent_containers/cup/soda_cans/melon_soda + name = "Kansumi Melon Soda" + desc = "Japan's favourite melon soda, now available in can form!" + icon_state = "melon_soda" + list_reagents = list(/datum/reagent/consumable/melon_soda = 30) + drink_type = SUGAR | JUNKFOOD + /obj/item/reagent_containers/cup/soda_cans/air name = "canned air" desc = "There is no air shortage. Do not drink." icon_state = "air" list_reagents = list(/datum/reagent/nitrogen = 24, /datum/reagent/oxygen = 6) + +/obj/item/reagent_containers/cup/soda_cans/beer + name = "space beer" + desc = "Canned beer. In space." + icon_state = "space_beer" + volume = 40 + list_reagents = list(/datum/reagent/consumable/ethanol/beer = 40) + drink_type = GRAIN + +/obj/item/reagent_containers/cup/soda_cans/beer/rice + name = "rice beer" + desc = "A light, rice-based lagered beer popular on Mars. Considered a hate crime against Bavarians under the Reinheitsgebot Act of 1516." + icon_state = "ebisu" + list_reagents = list(/datum/reagent/consumable/ethanol/rice_beer = 40) + +/obj/item/reagent_containers/cup/soda_cans/beer/rice/Initialize(mapload) + . = ..() + var/brand = pick("Ebisu Super Dry", "Shimauma Ichiban", "Moonlabor Malt's") + name = "[brand]" + switch(brand) + if("Ebisu Super Dry") + icon_state = "ebisu" + desc = "Mars' favourite rice beer brand, 200 years running." + if("Shimauma Ichiban") + icon_state = "shimauma" + desc = "Mars' most middling rice beer brand. Not as popular as Ebisu, but it's comfortable in second place." + if("Moonlabor Malt's") + icon_state = "moonlabor" + desc = "Mars' underdog rice beer brand. Popular amongst the Yakuza, for reasons unknown." diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index fd6397ec5f555..cf01c2cd4c2a0 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -6,7 +6,6 @@ inhand_icon_state = "dropper" worn_icon_state = "pen" amount_per_transfer_from_this = 5 - amount_list_position = 5 possible_transfer_amounts = list(1, 2, 3, 4, 5) volume = 5 reagent_flags = TRANSPARENT @@ -42,7 +41,7 @@ if(!safe_thing.reagents) safe_thing.create_reagents(100) - trans = reagents.trans_to(safe_thing, amount_per_transfer_from_this, transfered_by = user, methods = TOUCH) + trans = reagents.trans_to(safe_thing, amount_per_transfer_from_this, transferred_by = user, methods = TOUCH) target.visible_message(span_danger("[user] tries to squirt something into [target]'s eyes, but fails!"), \ span_userdanger("[user] tries to squirt something into your eyes, but fails!")) @@ -66,7 +65,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, transferred_by = user) to_chat(user, span_notice("You transfer [trans] unit\s of the solution.")) update_appearance() target.update_appearance() @@ -81,7 +80,7 @@ to_chat(user, span_warning("[target] is empty!")) return - var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transfered_by = user) + var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transferred_by = user) to_chat(user, span_notice("You fill [src] with [trans] unit\s of the solution.")) @@ -92,6 +91,6 @@ . = ..() if(!reagents.total_volume) return - var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "dropper") + var/mutable_appearance/filling = mutable_appearance('icons/obj/medical/reagent_fillings.dmi', "dropper") filling.color = mix_color_from_reagents(reagents.reagent_list) . += filling diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 03791bf9d7a44..63648375045a6 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -15,6 +15,8 @@ slot_flags = ITEM_SLOT_BELT var/ignore_flags = NONE var/infinite = FALSE + /// If TRUE, won't play a noise when injecting. + var/stealthy = FALSE /obj/item/reagent_containers/hypospray/attack_paw(mob/user, list/modifiers) return attack_hand(user, modifiers) @@ -40,13 +42,15 @@ 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!")) to_chat(user, span_notice("You inject [affected_mob] with [src].")) + if(!stealthy) + playsound(affected_mob, 'sound/items/hypospray.ogg', 50, TRUE) var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1) if(affected_mob.reagents) var/trans = 0 if(!infinite) - trans = reagents.trans_to(affected_mob, amount_per_transfer_from_this, transfered_by = user, methods = INJECT) + trans = reagents.trans_to(affected_mob, amount_per_transfer_from_this, transferred_by = user, methods = INJECT) else reagents.expose(affected_mob, INJECT, fraction) trans = reagents.copy_to(affected_mob, amount_per_transfer_from_this) @@ -111,6 +115,7 @@ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' amount_per_transfer_from_this = 15 + has_variable_transfer_amount = FALSE volume = 15 ignore_flags = 1 //so you can medipen through spacesuits reagent_flags = DRAWABLE @@ -177,6 +182,13 @@ amount_per_transfer_from_this = 50 list_reagents = list(/datum/reagent/medicine/stimulants = 50) +/obj/item/reagent_containers/hypospray/medipen/methamphetamine + name = "methamphetamine medipen" + volume = 24 + amount_per_transfer_from_this = 24 + desc = "Contains a relatively safe quantity of methamphetamine, along with mannitol to ensure that brain damage is kept at a minimum." + list_reagents = list(/datum/reagent/drug/methamphetamine = 10, /datum/reagent/medicine/mannitol = 14) + /obj/item/reagent_containers/hypospray/medipen/morphine name = "morphine medipen" desc = "A rapid way to get you out of a tight situation and fast! You'll feel rather drowsy, though." diff --git a/code/modules/reagents/reagent_containers/medigel.dm b/code/modules/reagents/reagent_containers/medigel.dm index df6c311878df8..e6836c7a4c296 100644 --- a/code/modules/reagents/reagent_containers/medigel.dm +++ b/code/modules/reagents/reagent_containers/medigel.dm @@ -67,7 +67,7 @@ else log_combat(user, M, "applied", src, reagents.get_reagent_log_string()) playsound(src, 'sound/effects/spray.ogg', 30, TRUE, -6) - reagents.trans_to(M, amount_per_transfer_from_this, transfered_by = user, methods = apply_type) + reagents.trans_to(M, amount_per_transfer_from_this, transferred_by = user, methods = apply_type) return /obj/item/reagent_containers/medigel/libital diff --git a/code/modules/reagents/reagent_containers/misc.dm b/code/modules/reagents/reagent_containers/misc.dm index 44e778647dba1..b7a5fbb71f5ca 100644 --- a/code/modules/reagents/reagent_containers/misc.dm +++ b/code/modules/reagents/reagent_containers/misc.dm @@ -125,7 +125,7 @@ item_flags = NOBLUDGEON reagent_flags = OPENCONTAINER amount_per_transfer_from_this = 5 - possible_transfer_amounts = list() + has_variable_transfer_amount = FALSE volume = 5 spillable = FALSE @@ -146,7 +146,7 @@ var/reagentlist = pretty_string_from_reagent_list(reagents.reagent_list) var/log_object = "containing [reagentlist]" if(user.combat_mode && !carbon_target.is_mouth_covered()) - reagents.trans_to(carbon_target, reagents.total_volume, transfered_by = user, methods = INGEST) + reagents.trans_to(carbon_target, reagents.total_volume, transferred_by = user, methods = INGEST) carbon_target.visible_message(span_danger("[user] smothers \the [carbon_target] 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, carbon_target, "smothered", src, log_object) else diff --git a/code/modules/reagents/reagent_containers/patch.dm b/code/modules/reagents/reagent_containers/patch.dm index 1682395ddb059..40e203dcb3456 100644 --- a/code/modules/reagents/reagent_containers/patch.dm +++ b/code/modules/reagents/reagent_containers/patch.dm @@ -1,5 +1,5 @@ /obj/item/reagent_containers/pill/patch - name = "chemical patch" + name = "patch" desc = "A chemical patch for touch based applications." icon = 'icons/obj/medical/chemical.dmi' icon_state = "bandaid_blank" @@ -18,7 +18,7 @@ to_chat(user, span_warning("The limb is missing!")) return if(!IS_ORGANIC_LIMB(affecting)) - to_chat(user, span_notice("Medicine won't work on a robotic limb!")) + to_chat(user, span_notice("Medicine won't work on an inorganic limb!")) return ..() @@ -45,6 +45,12 @@ list_reagents = list(/datum/reagent/medicine/c2/synthflesh = 20) icon_state = "bandaid_both" +/obj/item/reagent_containers/pill/patch/ondansetron + name = "ondansetron patch" + desc = "Alleviates nausea. May cause drowsiness." + list_reagents = list(/datum/reagent/medicine/ondansetron = 10) + icon_state = "bandaid_toxin" + // Patch styles for chem master /obj/item/reagent_containers/pill/patch/style diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 72915b6642016..7c7f97f0cc7fc 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -7,7 +7,7 @@ worn_icon_state = "nothing" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' - possible_transfer_amounts = list() + has_variable_transfer_amount = FALSE volume = 50 grind_results = list() var/apply_type = INGEST @@ -22,6 +22,8 @@ icon_state = "pill[rand(1,20)]" if(reagents.total_volume && rename_with_volume) name += " ([reagents.total_volume]u)" + if(apply_type == INGEST) + AddComponent(/datum/component/germ_sensitive, mapload) /obj/item/reagent_containers/pill/attack(mob/M, mob/user, def_zone) if(!canconsume(M, user)) @@ -48,9 +50,10 @@ /obj/item/reagent_containers/pill/proc/on_consumption(mob/M, mob/user) 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) - + if(apply_type == INGEST) + SEND_SIGNAL(src, COMSIG_PILL_CONSUMED, eater = M, feeder = user) if(reagents.total_volume) - reagents.trans_to(M, reagents.total_volume, transfered_by = user, methods = apply_type) + reagents.trans_to(M, reagents.total_volume, transferred_by = user, methods = apply_type) qdel(src) return TRUE @@ -71,7 +74,7 @@ return user.visible_message(span_warning("[user] slips something into [target]!"), span_notice("You dissolve [src] in [target]."), null, 2) - reagents.trans_to(target, reagents.total_volume, transfered_by = user) + reagents.trans_to(target, reagents.total_volume, transferred_by = user) qdel(src) /* @@ -79,7 +82,7 @@ */ /obj/item/reagent_containers/pill/on_accidental_consumption(mob/living/carbon/victim, mob/living/carbon/user, obj/item/source_item, discover_after = FALSE) to_chat(victim, span_warning("You swallow something small. [source_item ? "Was that in [source_item]?" : ""]")) - reagents?.trans_to(victim, reagents.total_volume, transfered_by = user, methods = INGEST) + reagents?.trans_to(victim, reagents.total_volume, transferred_by = user, methods = INGEST) qdel(src) return discover_after @@ -303,6 +306,13 @@ list_reagents = list(/datum/reagent/iron = 30) rename_with_volume = TRUE +/obj/item/reagent_containers/pill/gravitum + name = "gravitum pill" + desc = "Used in weight loss. In a way." + icon_state = "pill8" + list_reagents = list(/datum/reagent/gravitum = 5) + rename_with_volume = TRUE + // Pill styles for chem master /obj/item/reagent_containers/pill/style diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 93e5255f85eb5..20f72688644ef 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -1,7 +1,7 @@ /obj/item/reagent_containers/spray name = "spray bottle" desc = "A spray bottle, with an unscrewable top." - icon = 'icons/obj/janitor.dmi' + icon = 'icons/obj/service/janitor.dmi' icon_state = "sprayer_large" inhand_icon_state = "cleaner" worn_icon_state = "spraybottle" @@ -42,7 +42,7 @@ to_chat(user, span_warning("[src] is full.")) return - var/trans = target.reagents.trans_to(src, 50, transfered_by = user) //transfer 50u , using the spray's transfer amount would take too long to refill + var/trans = target.reagents.trans_to(src, 50, transferred_by = user) //transfer 50u , using the spray's transfer amount would take too long to refill to_chat(user, span_notice("You fill \the [src] with [trans] units of the contents of \the [target].")) return @@ -229,13 +229,13 @@ /obj/item/reagent_containers/spray/waterflower name = "water flower" desc = "A seemingly innocent sunflower...with a twist." - icon = 'icons/obj/hydroponics/harvest.dmi' + icon = 'icons/obj/service/hydroponics/harvest.dmi' icon_state = "sunflower" inhand_icon_state = "sunflower" lefthand_file = 'icons/mob/inhands/weapons/plants_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/plants_righthand.dmi' amount_per_transfer_from_this = 1 - possible_transfer_amounts = list(1) + has_variable_transfer_amount = FALSE can_toggle_range = FALSE current_range = 1 volume = 10 @@ -389,7 +389,7 @@ /obj/item/reagent_containers/spray/plantbgone // -- Skie name = "Plant-B-Gone" desc = "Kills those pesky weeds!" - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "plantbgone" inhand_icon_state = "plantbgone" lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi' @@ -443,6 +443,7 @@ /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" + 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 = 'icons/obj/medical/chemical.dmi' + icon_state = "sprayer_med_yellow" 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 bc734306d1907..beed3d17ba6f4 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -82,7 +82,7 @@ living_target.log_message("injected themselves ([contained]) with [name]", LOG_ATTACK, color="orange") else log_combat(user, living_target, "injected", src, addition="which had [contained]") - reagents.trans_to(target, amount_per_transfer_from_this, transfered_by = user, methods = INJECT) + reagents.trans_to(target, amount_per_transfer_from_this, transferred_by = user, methods = INJECT) to_chat(user, span_notice("You inject [amount_per_transfer_from_this] units of the solution. The syringe now contains [reagents.total_volume] units.")) target.update_appearance() @@ -117,7 +117,7 @@ to_chat(user, span_warning("You cannot directly remove reagents from [target]!")) return SECONDARY_ATTACK_CONTINUE_CHAIN - var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transfered_by = user) // transfer from, transfer to - who cares? + var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transferred_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.")) target.update_appearance() @@ -134,7 +134,7 @@ to_chat(victim, span_boldwarning("[src] injects you!")) victim.apply_damage(5, BRUTE, BODY_ZONE_HEAD) - reagents?.trans_to(victim, round(reagents.total_volume*(2/3)), transfered_by = user, methods = INJECT) + reagents?.trans_to(victim, round(reagents.total_volume*(2/3)), transferred_by = user, methods = INJECT) return discover_after @@ -150,7 +150,7 @@ /// Returns a list of overlays to add that relate to the reagents inside the syringe /obj/item/reagent_containers/syringe/proc/update_reagent_overlay() if(reagents?.total_volume) - var/mutable_appearance/filling_overlay = mutable_appearance('icons/obj/reagentfillings.dmi', "syringe[get_rounded_vol()]") + var/mutable_appearance/filling_overlay = mutable_appearance('icons/obj/medical/reagent_fillings.dmi', "syringe[get_rounded_vol()]") filling_overlay.color = mix_color_from_reagents(reagents.reagent_list) . += filling_overlay @@ -199,6 +199,7 @@ name = "lethal injection syringe" desc = "A syringe used for lethal injections. It can hold up to 50 units." amount_per_transfer_from_this = 50 + has_variable_transfer_amount = FALSE volume = 50 /obj/item/reagent_containers/syringe/lethal/choral @@ -211,6 +212,7 @@ name = "Mulligan" desc = "A syringe used to completely change the users identity." amount_per_transfer_from_this = 1 + has_variable_transfer_amount = FALSE volume = 1 list_reagents = list(/datum/reagent/mulligan = 1) @@ -218,6 +220,7 @@ 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 + has_variable_transfer_amount = FALSE volume = 1 list_reagents = list(/datum/reagent/gluttonytoxin = 1) @@ -252,6 +255,16 @@ /obj/item/reagent_containers/syringe/crude/update_reagent_overlay() return + // Used by monkeys from the elemental plane of bananas. Reagents come from bungo pit, death berries, destroying angel, jupiter cups, and jumping beans. +/obj/item/reagent_containers/syringe/crude/tribal + name = "tribal syringe" + desc = "A crudely made syringe. Smells like bananas." + +/obj/item/reagent_containers/syringe/crude/tribal/Initialize(mapload) + var/toxin_to_get = pick(/datum/reagent/toxin/bungotoxin, /datum/reagent/toxin/coniine, /datum/reagent/toxin/amanitin, /datum/reagent/consumable/liquidelectricity/enriched, /datum/reagent/ants) + list_reagents = list((toxin_to_get) = 5) + return ..() + /obj/item/reagent_containers/syringe/spider_extract name = "spider extract syringe" desc = "Contains crikey juice - makes any gold core create the most deadly companions in the world." diff --git a/code/modules/reagents/reagent_containers/watering_can.dm b/code/modules/reagents/reagent_containers/watering_can.dm index 1915213b16d47..60b13117c393f 100644 --- a/code/modules/reagents/reagent_containers/watering_can.dm +++ b/code/modules/reagents/reagent_containers/watering_can.dm @@ -1,7 +1,7 @@ /obj/item/reagent_containers/cup/watering_can name = "watering can" desc = "It's a watering can. It is scientifically proved that using a watering can to simulate rain increases plant happiness!" - icon = 'icons/obj/hydroponics/equipment.dmi' + icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "watering_can" inhand_icon_state = "watering_can" lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi' diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 4fabe682f1bc0..d1b7afd4b7800 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -1,3 +1,5 @@ +#define REAGENT_SPILL_DIVISOR 200 + /obj/structure/reagent_dispensers name = "Dispenser" desc = "..." @@ -172,7 +174,7 @@ visible_message(span_danger("\The [src] explodes!")) // old code for reference: // standard fuel tank = 1000 units = heavy_impact_range = 1, light_impact_range = 5, flame_range = 5 - // big fuel tank =SHEET_MATERIAL_AMOUNT * 2.5 units = devastation_range = 1, heavy_impact_range = 2, light_impact_range = 7, flame_range = 12 + // big fuel tank = 5000 units = devastation_range = 1, heavy_impact_range = 2, light_impact_range = 7, flame_range = 12 // It did not account for how much fuel was actually in the tank at all, just the size of the tank. // I encourage others to better scale these numbers in the future. // As it stands this is a minor nerf in exchange for an easy bombing technique working that has been broken for a while. @@ -203,6 +205,15 @@ return TRUE return FALSE +/obj/structure/reagent_dispensers/proc/knock_down() + var/datum/effect_system/fluid_spread/smoke/chem/smoke = new () + var/range = reagents.total_volume / REAGENT_SPILL_DIVISOR + smoke.attach(drop_location()) + smoke.set_up(round(range), holder = drop_location(), location = drop_location(), carry = reagents, silent = FALSE) + smoke.start(log = TRUE) + reagents.clear_reagents() + qdel(src) + /obj/structure/reagent_dispensers/wrench_act(mob/living/user, obj/item/tool) . = ..() if(!openable) @@ -286,7 +297,7 @@ if(W.reagents.has_reagent(/datum/reagent/fuel, W.max_fuel)) to_chat(user, span_warning("Your [W.name] is already full!")) return - reagents.trans_to(W, W.max_fuel, transfered_by = user) + reagents.trans_to(W, W.max_fuel, transferred_by = user) user.visible_message(span_notice("[user] refills [user.p_their()] [W.name]."), span_notice("You refill [W].")) playsound(src, 'sound/effects/refill.ogg', 50, TRUE) W.update_appearance() @@ -302,7 +313,7 @@ name = "high capacity fuel tank" desc = "A tank full of a high quantity of welding fuel. Keep away from open flames." icon_state = "fuel_high" - tank_volume =SHEET_MATERIAL_AMOUNT * 2.5 + tank_volume = 5000 /// 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. /obj/structure/reagent_dispensers/wall @@ -322,11 +333,12 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/reagent_dispensers/wall/peppertank, 3 . = ..() if(prob(1)) desc = "IT'S PEPPER TIME, BITCH!" + find_and_hang_on_wall() /obj/structure/reagent_dispensers/water_cooler name = "liquid cooler" desc = "A machine that dispenses liquid to drink." - icon = 'icons/obj/vending.dmi' + icon = 'icons/obj/machines/vending.dmi' icon_state = "water_cooler" anchored = TRUE tank_volume = 500 @@ -373,18 +385,22 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/reagent_dispensers/wall/peppertank, 3 MAPPING_DIRECTIONAL_HELPERS(/obj/structure/reagent_dispensers/wall/virusfood, 30) +/obj/structure/reagent_dispensers/wall/virusfood/Initialize(mapload) + . = ..() + find_and_hang_on_wall() + /obj/structure/reagent_dispensers/cooking_oil name = "vat of cooking oil" desc = "A huge metal vat with a tap on the front. Filled with cooking oil for use in frying food." icon_state = "vat" anchored = TRUE - reagent_id = /datum/reagent/consumable/cooking_oil + reagent_id = /datum/reagent/consumable/nutriment/fat/oil openable = TRUE /obj/structure/reagent_dispensers/servingdish name = "serving dish" desc = "A dish full of food slop for your bowl." - icon = 'icons/obj/kitchen.dmi' + icon = 'icons/obj/service/kitchen.dmi' icon_state = "serving" anchored = TRUE reagent_id = /datum/reagent/consumable/nutraslop @@ -435,3 +451,5 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/reagent_dispensers/wall/virusfood, 30 desc = "A stationary, plumbed, fuel tank." reagent_id = /datum/reagent/fuel accepts_rig = TRUE + +#undef REAGENT_SPILL_DIVISOR diff --git a/code/modules/reagents/withdrawal/generic_addictions.dm b/code/modules/reagents/withdrawal/generic_addictions.dm index 8efd0b3d47553..5c9dd636309cf 100644 --- a/code/modules/reagents/withdrawal/generic_addictions.dm +++ b/code/modules/reagents/withdrawal/generic_addictions.dm @@ -109,12 +109,14 @@ var/mob/living/carbon/human/affected_human = affected_carbon if(affected_human.gender == MALE) to_chat(affected_human, span_warning("Your chin itches.")) - affected_human.facial_hairstyle = "Beard (Full)" - affected_human.update_body_parts() + affected_human.set_facial_hairstyle("Beard (Full)", update = TRUE) //Only like gross food - affected_human.dna?.species.liked_food = GROSS - affected_human.dna?.species.disliked_food = NONE - affected_human.dna?.species.toxic_food = ~GROSS + var/obj/item/organ/internal/tongue/tongue = affected_carbon.get_organ_slot(ORGAN_SLOT_TONGUE) + if(!tongue) + return + tongue.liked_foodtypes = GROSS + tongue.disliked_foodtypes = NONE + tongue.toxic_foodtypes = ~GROSS /datum/addiction/maintenance_drugs/withdrawal_enters_stage_3(mob/living/carbon/affected_carbon) . = ..() @@ -143,15 +145,18 @@ /datum/addiction/maintenance_drugs/end_withdrawal(mob/living/carbon/affected_carbon) . = ..() affected_carbon.remove_status_effect(/datum/status_effect/grouped/screwy_hud/fake_healthy, type) + //restore tongue's tastes + var/obj/item/organ/internal/tongue/tongue = affected_carbon.get_organ_slot(ORGAN_SLOT_TONGUE) + if(tongue) + tongue.liked_foodtypes = initial(tongue.liked_foodtypes) + tongue.disliked_foodtypes = initial(tongue.disliked_foodtypes) + tongue.toxic_foodtypes = initial(tongue.toxic_foodtypes) if(!ishuman(affected_carbon)) return var/mob/living/carbon/human/affected_human = affected_carbon - affected_human.dna?.species.liked_food = initial(affected_human.dna?.species.liked_food) - affected_human.dna?.species.disliked_food = initial(affected_human.dna?.species.disliked_food) - affected_human.dna?.species.toxic_food = initial(affected_human.dna?.species.toxic_food) REMOVE_TRAIT(affected_human, TRAIT_NIGHT_VISION, "maint_drug_addiction") var/obj/item/organ/internal/eyes/eyes = affected_human.get_organ_by_type(/obj/item/organ/internal/eyes) - eyes.refresh() + eyes?.refresh() ///Makes you a hypochondriac - I'd like to call it hypochondria, but "I could use some hypochondria" doesn't work /datum/addiction/medicine diff --git a/code/modules/recycling/conveyor.dm b/code/modules/recycling/conveyor.dm index ff8c6abd2fd36..cb1a0800c513a 100644 --- a/code/modules/recycling/conveyor.dm +++ b/code/modules/recycling/conveyor.dm @@ -9,7 +9,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) /obj/machinery/conveyor - icon = 'icons/obj/recycling.dmi' + icon = 'icons/obj/machines/recycling.dmi' icon_state = "conveyor_map" base_icon_state = "conveyor" name = "conveyor belt" @@ -37,6 +37,13 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) //Direction -> if we have a conveyor belt in that direction var/list/neighbors +/obj/machinery/conveyor/Initialize(mapload) + . = ..() + AddElement(/datum/element/footstep_override, priority = STEP_SOUND_CONVEYOR_PRIORITY) + var/static/list/give_turf_traits = list(TRAIT_TURF_IGNORE_SLOWDOWN) + AddElement(/datum/element/give_turf_traits, give_turf_traits) + register_context() + /obj/machinery/conveyor/examine(mob/user) . = ..() if(inverted) @@ -44,6 +51,20 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) . += "\nLeft-click with a wrench to rotate." . += "Left-click with a screwdriver to invert its direction." . += "Right-click with a screwdriver to flip its belt around." + . += "Using another conveyor belt assembly on this will place a new conveyor belt in the direction this one is pointing." + +/obj/machinery/conveyor/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + if(istype(held_item, /obj/item/stack/conveyor)) + context[SCREENTIP_CONTEXT_LMB] = "Extend current conveyor belt" + return CONTEXTUAL_SCREENTIP_SET + if(held_item?.tool_behaviour == TOOL_WRENCH) + context[SCREENTIP_CONTEXT_LMB] = "Rotate conveyor belt" + return CONTEXTUAL_SCREENTIP_SET + if(held_item?.tool_behaviour == TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_LMB] = "Invert conveyor belt" + context[SCREENTIP_CONTEXT_RMB] = "Flip conveyor belt" + return CONTEXTUAL_SCREENTIP_SET /obj/machinery/conveyor/centcom_auto id = "round_end_belt" @@ -84,7 +105,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) var/static/list/loc_connections = list( COMSIG_ATOM_EXITED = PROC_REF(conveyable_exit), COMSIG_ATOM_ENTERED = PROC_REF(conveyable_enter), - COMSIG_ATOM_INITIALIZED_ON = PROC_REF(conveyable_enter) + COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON = PROC_REF(conveyable_enter) ) AddElement(/datum/element/connect_loc, loc_connections) update_move_direction() @@ -130,7 +151,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) if(QDELETED(valid)) continue neighbors["[direction]"] = TRUE - valid.neighbors["[DIRFLIP(direction)]"] = TRUE + valid.neighbors["[REVERSE_DIR(direction)]"] = TRUE RegisterSignal(valid, COMSIG_MOVABLE_MOVED, PROC_REF(nearby_belt_changed), override=TRUE) RegisterSignal(valid, COMSIG_QDELETING, PROC_REF(nearby_belt_changed), override=TRUE) valid.RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(nearby_belt_changed), override=TRUE) @@ -276,6 +297,19 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) update_move_direction() to_chat(user, span_notice("You set [src]'s direction [inverted ? "backwards" : "back to default"].")) + else if(istype(attacking_item, /obj/item/stack/conveyor)) + // We should place a new conveyor belt machine on the output turf the conveyor is pointing to. + var/turf/target_turf = get_step(get_turf(src), forwards) + if(!target_turf) + return ..() + for(var/obj/machinery/conveyor/belt in target_turf) + to_chat(user, span_warning("You cannot place a conveyor belt on top of another conveyor belt.")) + return ..() + + var/obj/item/stack/conveyor/belt_item = attacking_item + belt_item.use(1) + new /obj/machinery/conveyor(target_turf, forwards, id) + else if(!user.combat_mode) user.transferItemToLoc(attacking_item, drop_location()) else @@ -309,7 +343,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) /obj/machinery/conveyor_switch name = "conveyor switch" desc = "A conveyor control switch." - icon = 'icons/obj/recycling.dmi' + icon = 'icons/obj/machines/recycling.dmi' icon_state = "switch-off" base_icon_state = "switch" processing_flags = START_PROCESSING_MANUALLY @@ -334,7 +368,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) update_appearance() LAZYADD(GLOB.conveyors_by_id[id], src) - wires = new /datum/wires/conveyor(src) + set_wires(new /datum/wires/conveyor(src)) AddComponent(/datum/component/usb_port, list( /obj/item/circuit_component/conveyor_switch, )) @@ -458,7 +492,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) /obj/item/conveyor_switch_construct name = "conveyor switch assembly" desc = "A conveyor control switch assembly." - icon = 'icons/obj/recycling.dmi' + icon = 'icons/obj/machines/recycling.dmi' icon_state = "switch-off" w_class = WEIGHT_CLASS_BULKY // ID of the switch-in-the-making, to link conveyor belts to it. @@ -493,7 +527,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) /obj/item/stack/conveyor name = "conveyor belt assembly" desc = "A conveyor belt assembly." - icon = 'icons/obj/recycling.dmi' + icon = 'icons/obj/machines/recycling.dmi' icon_state = "conveyor_construct" max_amount = 30 singular_name = "conveyor belt" @@ -528,6 +562,14 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) /obj/item/stack/conveyor/update_weight() return FALSE +/obj/item/stack/conveyor/examine(mob/user) + . = ..() + . += span_notice("Use a conveyor switch assembly on this before placing to connect to a lever.") + +/obj/item/stack/conveyor/use(used, transfer, check) + . = ..() + playsound(src, 'sound/weapons/genhit.ogg', 30, TRUE) + /obj/item/stack/conveyor/thirty amount = 30 diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 5694b46620e87..26ec26d46d4c2 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -3,7 +3,7 @@ #define SEND_PRESSURE (0.05*ONE_ATMOSPHERE) /obj/machinery/disposal - icon = 'icons/obj/atmospherics/pipes/disposal.dmi' + icon = 'icons/obj/pipes_n_cables/disposal.dmi' density = TRUE armor_type = /datum/armor/machinery_disposal max_integrity = 200 @@ -88,8 +88,9 @@ trunk = null return ..() -/obj/machinery/disposal/handle_atom_del(atom/A) - if(A == stored && !QDELETED(src)) +/obj/machinery/disposal/Exited(atom/movable/gone, direction) + . = ..() + if(gone == stored && !QDELETED(src)) stored = null deconstruct(FALSE) @@ -116,7 +117,7 @@ to_chat(user, span_notice("You [panel_open ? "remove":"attach"] the screws around the power connection.")) return else if(I.tool_behaviour == TOOL_WELDER && panel_open) - if(!I.tool_start_check(user, amount=0)) + if(!I.tool_start_check(user, amount=1)) return to_chat(user, span_notice("You start slicing the floorweld off \the [src]...")) @@ -135,7 +136,7 @@ return ..() /// The regal rat spawns ratty treasures from the disposal -/obj/machinery/disposal/proc/rat_rummage(mob/living/simple_animal/hostile/regalrat/king) +/obj/machinery/disposal/proc/rat_rummage(mob/living/basic/regal_rat/king) king.visible_message(span_warning("[king] starts rummaging through [src]."),span_notice("You rummage through [src]...")) if (!do_after(king, 2 SECONDS, src, interaction_key = "regalrat")) return @@ -279,11 +280,13 @@ var/turf/T = loc if(!(flags_1 & NODECONSTRUCT_1)) if(stored) - stored.forceMove(T) - src.transfer_fingerprints_to(stored) - stored.set_anchored(FALSE) - stored.set_density(TRUE) - stored.update_appearance() + var/obj/structure/disposalconstruct/construct = stored + stored = null + construct.forceMove(T) + transfer_fingerprints_to(construct) + construct.set_anchored(FALSE) + construct.set_density(TRUE) + construct.update_appearance() for(var/atom/movable/AM in src) //out, out, darned crowbar! AM.forceMove(T) ..() @@ -545,10 +548,13 @@ return /// Handles the signal for the rat king looking inside the disposal -/obj/machinery/disposal/proc/on_rat_rummage(datum/source, mob/living/simple_animal/hostile/regalrat/king) +/obj/machinery/disposal/proc/on_rat_rummage(datum/source, mob/living/basic/regal_rat/king) SIGNAL_HANDLER + if(king.combat_mode) + return INVOKE_ASYNC(src, TYPE_PROC_REF(/obj/machinery/disposal/, rat_rummage), king) + return COMPONENT_RAT_INTERACTED /// Handles a carbon mob getting shoved into the disposal bin /obj/machinery/disposal/proc/trash_carbon(datum/source, mob/living/carbon/shover, mob/living/carbon/target, shove_blocked) diff --git a/code/modules/recycling/disposal/construction.dm b/code/modules/recycling/disposal/construction.dm index 440f1131443a5..b1556ca679f88 100644 --- a/code/modules/recycling/disposal/construction.dm +++ b/code/modules/recycling/disposal/construction.dm @@ -4,7 +4,7 @@ /obj/structure/disposalconstruct name = "disposal pipe segment" desc = "A huge pipe segment used for constructing disposal systems." - icon = 'icons/obj/atmospherics/pipes/disposal.dmi' + icon = 'icons/obj/pipes_n_cables/disposal.dmi' icon_state = "conpipe" anchored = FALSE density = FALSE @@ -83,7 +83,7 @@ if(initialize_dirs & DISP_DIR_RIGHT) dpdir |= turn(dir, -90) if(initialize_dirs & DISP_DIR_FLIP) - dpdir |= turn(dir, 180) + dpdir |= REVERSE_DIR(dir) return dpdir /obj/structure/disposalconstruct/proc/AfterRotation(mob/user, degrees) @@ -154,7 +154,7 @@ to_chat(user, span_warning("A disposals machine already exists here!")) return TRUE - if(!I.tool_start_check(user, amount=0)) + if(!I.tool_start_check(user, amount=1)) return TRUE to_chat(user, span_notice("You start welding the [pipename] in place...")) diff --git a/code/modules/recycling/disposal/holder.dm b/code/modules/recycling/disposal/holder.dm index 69b7ca823c9d6..cf9ae8f6b4e10 100644 --- a/code/modules/recycling/disposal/holder.dm +++ b/code/modules/recycling/disposal/holder.dm @@ -168,7 +168,7 @@ if(!T) return null - var/fdir = turn(dir, 180) // flip the movement direction + var/fdir = REVERSE_DIR(dir) // flip the movement direction for(var/obj/structure/disposalpipe/P in T) if(fdir & P.dpdir) // find pipe direction mask that matches flipped dir if(QDELING(P)) diff --git a/code/modules/recycling/disposal/multiz.dm b/code/modules/recycling/disposal/multiz.dm index cb91c8f49f27b..06f4e52a31ce2 100644 --- a/code/modules/recycling/disposal/multiz.dm +++ b/code/modules/recycling/disposal/multiz.dm @@ -21,11 +21,11 @@ return ..() //Are we a trunk that goes up? Or down? - var/turf/target = null + var/turf/target = get_turf(src) if(multiz_dir == MULTIZ_PIPE_UP) - target = SSmapping.get_turf_above(get_turf(src)) + target = GET_TURF_ABOVE(target) if(multiz_dir == MULTIZ_PIPE_DOWN) - target = SSmapping.get_turf_below(get_turf(src)) + target = GET_TURF_BELOW(target) if(!target) //Nothing located. return diff --git a/code/modules/recycling/disposal/outlet.dm b/code/modules/recycling/disposal/outlet.dm index e37e9acb9a91f..4327567fb1746 100644 --- a/code/modules/recycling/disposal/outlet.dm +++ b/code/modules/recycling/disposal/outlet.dm @@ -16,7 +16,7 @@ /obj/structure/disposaloutlet name = "disposal outlet" desc = "An outlet for the pneumatic disposal system." - icon = 'icons/obj/atmospherics/pipes/disposal.dmi' + icon = 'icons/obj/pipes_n_cables/disposal.dmi' icon_state = "outlet" density = TRUE anchored = TRUE @@ -78,7 +78,7 @@ /obj/structure/disposaloutlet/welder_act(mob/living/user, obj/item/I) ..() - if(!I.tool_start_check(user, amount=0)) + if(!I.tool_start_check(user, amount=1)) return TRUE playsound(src, 'sound/items/welder2.ogg', 100, TRUE) @@ -108,7 +108,7 @@ //if emagged it cant change the speed setting off max if(obj_flags & EMAGGED) to_chat(user, span_notice("The LED display flashes an error!")) - else + else to_chat(user, span_notice("You adjust the ejection force on \the [src].")) switch(eject_speed) if(EJECT_SPEED_SLOW) @@ -122,14 +122,15 @@ eject_range = EJECT_RANGE_SLOW return TRUE -/obj/structure/disposaloutlet/emag_act(mob/user, obj/item/card/emag/E) +/obj/structure/disposaloutlet/emag_act(mob/user, obj/item/card/emag/emag_card) . = ..() if(obj_flags & EMAGGED) return - to_chat(user, span_notice("You silently disable the sanity checking on \the [src]'s ejection force.")) + balloon_alert(user, "ejection force maximized") obj_flags |= EMAGGED eject_speed = EJECT_SPEED_YEET eject_range = EJECT_RANGE_YEET + return TRUE #undef EJECT_SPEED_SLOW #undef EJECT_SPEED_MED diff --git a/code/modules/recycling/disposal/pipe.dm b/code/modules/recycling/disposal/pipe.dm index e35be284bad09..30573746f5e2c 100644 --- a/code/modules/recycling/disposal/pipe.dm +++ b/code/modules/recycling/disposal/pipe.dm @@ -3,7 +3,7 @@ /obj/structure/disposalpipe name = "disposal pipe" desc = "An underfloor disposal pipe." - icon = 'icons/obj/atmospherics/pipes/disposal.dmi' + icon = 'icons/obj/pipes_n_cables/disposal.dmi' anchored = TRUE density = FALSE obj_flags = CAN_BE_HIT @@ -16,8 +16,11 @@ 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 + /// The pipe used to create us, if it exists + /// (I like it when c4 carries over) var/obj/structure/disposalconstruct/stored - + /// Should we create a pipe on destroy? + var/spawn_pipe = TRUE /datum/armor/structure_disposalpipe melee = 25 @@ -34,8 +37,6 @@ setDir(make_from.dir) make_from.forceMove(src) stored = make_from - else - stored = new /obj/structure/disposalconstruct(src, null , SOUTH , FALSE , src) if(ISDIAGONALDIR(dir)) // Bent pipes already have all the dirs set initialize_dirs = NONE @@ -48,7 +49,7 @@ if(initialize_dirs & DISP_DIR_RIGHT) dpdir |= turn(dir, -90) if(initialize_dirs & DISP_DIR_FLIP) - dpdir |= turn(dir, 180) + dpdir |= REVERSE_DIR(dir) AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) if(isturf(loc)) @@ -56,7 +57,8 @@ turf_loc.add_blueprints_preround(src) /obj/structure/disposalpipe/Destroy() - qdel(stored) + spawn_pipe = FALSE + QDEL_NULL(stored) return ..() /** @@ -72,17 +74,21 @@ continue holdplease.active = FALSE expel(holdplease, get_turf(src), 0) - stored = null //The qdel is handled in expel() + stored = null // It gets dumped out in expel() -/obj/structure/disposalpipe/handle_atom_del(atom/A) - if(A == stored && !QDELETED(src)) - stored = null +/obj/structure/disposalpipe/Exited(atom/movable/gone, direction) + . = ..() + if(gone != stored || QDELETED(src)) + return + spawn_pipe = FALSE + stored = null + if(QDELETED(gone)) deconstruct(FALSE) //pipe has broken. // returns the direction of the next pipe object, given the entrance dir // by default, returns the bitmask of remaining directions /obj/structure/disposalpipe/proc/nextdir(obj/structure/disposalholder/H) - return dpdir & (~turn(H.dir, 180)) + return dpdir & (~REVERSE_DIR(H.dir)) // transfer the holder through this pipe segment // overridden for special behaviour @@ -150,7 +156,7 @@ if(!can_be_deconstructed(user)) return TRUE - if(!I.tool_start_check(user, amount=0)) + if(!I.tool_start_check(user, amount=1)) return TRUE to_chat(user, span_notice("You start slicing [src]...")) @@ -167,11 +173,15 @@ /obj/structure/disposalpipe/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) if(disassembled) - if(stored) - stored.forceMove(loc) - transfer_fingerprints_to(stored) - stored.setDir(dir) + if(spawn_pipe) + var/obj/structure/disposalconstruct/construct = stored + if(!construct) // Don't have something? Make one now + construct = new /obj/structure/disposalconstruct(src, null, SOUTH, FALSE, src) stored = null + construct.forceMove(loc) + transfer_fingerprints_to(construct) + construct.setDir(dir) + spawn_pipe = FALSE else var/turf/T = get_turf(src) for(var/D in GLOB.cardinals) @@ -204,7 +214,7 @@ // if coming in from secondary dirs, then next is primary dir // if coming in from primary dir, then next is equal chance of other dirs /obj/structure/disposalpipe/junction/nextdir(obj/structure/disposalholder/H) - var/flipdir = turn(H.dir, 180) + var/flipdir = REVERSE_DIR(H.dir) if(flipdir != dir) // came from secondary dir, so exit through primary return dir @@ -310,6 +320,23 @@ initialize_dirs = DISP_DIR_NONE // broken pipes always have dpdir=0 so they're not found as 'real' pipes // i.e. will be treated as an empty turf + spawn_pipe = FALSE + anchored = FALSE /obj/structure/disposalpipe/broken/deconstruct() qdel(src) + +/obj/structure/disposalpipe/rotator + icon_state = "pipe-r1" + initialize_dirs = DISP_DIR_LEFT | DISP_DIR_RIGHT | DISP_DIR_FLIP + flip_type = /obj/structure/disposalpipe/rotator/flip + /// In what direction the atom travels. + var/direction_angle = -90 + +/obj/structure/disposalpipe/rotator/nextdir(obj/structure/disposalholder/holder) + return turn(holder.dir, direction_angle) + +/obj/structure/disposalpipe/rotator/flip + icon_state = "pipe-r2" + flip_type = /obj/structure/disposalpipe/rotator + direction_angle = 90 diff --git a/code/modules/recycling/disposal/pipe_sorting.dm b/code/modules/recycling/disposal/pipe_sorting.dm index e5a8a5a12ec98..90cd583296636 100644 --- a/code/modules/recycling/disposal/pipe_sorting.dm +++ b/code/modules/recycling/disposal/pipe_sorting.dm @@ -7,7 +7,7 @@ initialize_dirs = DISP_DIR_RIGHT | DISP_DIR_FLIP /obj/structure/disposalpipe/sorting/nextdir(obj/structure/disposalholder/H) - var/sortdir = dpdir & ~(dir | turn(dir, 180)) + var/sortdir = dpdir & ~(dir | REVERSE_DIR(dir)) if(H.dir != sortdir) // probably came from the negdir if(check_sorting(H)) // if destination matches filtered type... return sortdir // exit through sortdirection diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index c09ed8e005672..e6e98cf73761b 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -193,7 +193,7 @@ else if(istype(item, /obj/item/boxcutter)) var/obj/item/boxcutter/boxcutter_item = item - if(boxcutter_item.on) + if(HAS_TRAIT(boxcutter_item, TRAIT_TRANSFORM_ACTIVE)) if(!attempt_pre_unwrap_contents(user, time = 0.5 SECONDS)) return unwrap_contents() diff --git a/code/modules/religion/burdened/psyker.dm b/code/modules/religion/burdened/psyker.dm index 537d163161d07..4499030642d93 100644 --- a/code/modules/religion/burdened/psyker.dm +++ b/code/modules/religion/burdened/psyker.dm @@ -36,28 +36,16 @@ is_dimorphic = FALSE should_draw_greyscale = FALSE bodypart_traits = list(TRAIT_DISFIGURED, TRAIT_BALD, TRAIT_SHAVED) + head_flags = HEAD_LIPS|HEAD_EYEHOLES|HEAD_DEBRAIN /obj/item/bodypart/head/psyker/try_attach_limb(mob/living/carbon/new_head_owner, special, abort) . = ..() if(!.) return - new_head_owner.become_blind(limb_id) - if(!new_head_owner.dna?.species) - return - - new_head_owner.dna.species.species_traits |= NOEYESPRITES //MAKE VISUALS TIED TO BODYPARTS ARGHH - new_head_owner.update_body() + new_head_owner.become_blind(bodypart_trait_source) /obj/item/bodypart/head/psyker/drop_limb(special, dismembered) - owner.cure_blind(limb_id) - if(!owner.dna?.species) - return ..() - - if(initial(owner.dna.species.species_traits) & NOEYESPRITES) - return ..() - - owner.dna.species.species_traits &= ~NOEYESPRITES - owner.update_body() + owner.cure_blind(bodypart_trait_source) return ..() /// flavorful variant of psykerizing that deals damage and sends messages before calling psykerize() @@ -138,13 +126,14 @@ /obj/item/gun/ballistic/revolver/chaplain name = "chaplain's revolver" desc = "Holy smokes." - icon_state = "chaplain" + icon_state = "lucky" force = 10 fire_sound = 'sound/weapons/gun/revolver/shot.ogg' - mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev77 + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/cylinder/revchap obj_flags = UNIQUE_RENAME custom_materials = null actions_types = list(/datum/action/item_action/pray_refill) + projectile_damage_multiplier = 0.72 //it's exactly 18 force for normal bullets /// Needs burden level nine to refill. var/needs_burden = TRUE /// List of all possible names and descriptions. @@ -181,14 +170,33 @@ "Daredevil" = "Hey now, you won't be reckless with this, will you?", "Lacytanga" = "Rules are written by the strong.", "A10" = "The fist of God. Keep away from the terrible.", + "Lucky" = "Ain't that a kick in the head?", ) /obj/item/gun/ballistic/revolver/chaplain/Initialize(mapload) . = ..() - AddComponent(/datum/component/anti_magic, MAGIC_RESISTANCE_HOLY) + AddComponent(/datum/component/anti_magic, MAGIC_RESISTANCE|MAGIC_RESISTANCE_HOLY) + AddComponent(/datum/component/effect_remover, \ + success_feedback = "You disrupt the magic of %THEEFFECT with %THEWEAPON.", \ + success_forcesay = "BEGONE FOUL MAGIKS!!", \ + tip_text = "Clear rune", \ + on_clear_callback = CALLBACK(src, PROC_REF(on_cult_rune_removed)), \ + effects_we_clear = list(/obj/effect/rune, /obj/effect/heretic_rune, /obj/effect/cosmic_rune), \ + ) + AddElement(/datum/element/bane, target_type = /mob/living/simple_animal/revenant, damage_multiplier = 0, added_damage = 25) name = pick(possible_names) desc = possible_names[name] +/obj/item/gun/ballistic/revolver/chaplain/proc/on_cult_rune_removed(obj/effect/target, mob/living/user) + SIGNAL_HANDLER + if(!istype(target, /obj/effect/rune)) + return + + var/obj/effect/rune/target_rune = target + if(target_rune.log_when_erased) + user.log_message("erased [target_rune.cultist_name] rune using [src]", LOG_GAME) + SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_NARNAR] = TRUE + /obj/item/gun/ballistic/revolver/chaplain/suicide_act(mob/living/user) . = ..() name = "Habemus Papam" @@ -197,6 +205,13 @@ /obj/item/gun/ballistic/revolver/chaplain/attack_self(mob/living/user) pray_refill(user) +/obj/item/gun/ballistic/revolver/chaplain/attackby(obj/item/possibly_ammo, mob/user, params) + if (isammocasing(possibly_ammo) || istype(possibly_ammo, /obj/item/ammo_box)) + user.balloon_alert(user, "no manual reloads!") + return + + return ..() + /obj/item/gun/ballistic/revolver/chaplain/proc/pray_refill(mob/living/carbon/human/user) if(DOING_INTERACTION_WITH_TARGET(user, src) || !istype(user)) return @@ -217,22 +232,21 @@ name = "Refill" desc = "Perform a prayer, to refill your weapon." -/obj/item/ammo_box/magazine/internal/cylinder/rev77 +/obj/item/ammo_box/magazine/internal/cylinder/revchap name = "chaplain revolver cylinder" - ammo_type = /obj/item/ammo_casing/c77 - caliber = CALIBER_77 + ammo_type = /obj/item/ammo_casing/c38/holy + caliber = CALIBER_38 max_ammo = 5 -/obj/item/ammo_casing/c77 - name = ".77 bullet casing" - desc = "A .77 bullet casing." - caliber = CALIBER_77 - projectile_type = /obj/projectile/bullet/c77 +/obj/item/ammo_casing/c38/holy + name = "lucky .38 bullet casing" + desc = "A lucky .38 bullet casing. You feel lucky just holding it." + caliber = CALIBER_38 + projectile_type = /obj/projectile/bullet/c38/holy custom_materials = null -/obj/projectile/bullet/c77 - name = ".77 bullet" - damage = 18 +/obj/projectile/bullet/c38/holy + name = "lucky .38 bullet" ricochets_max = 2 ricochet_chance = 50 ricochet_auto_aim_angle = 10 @@ -240,6 +254,14 @@ wound_bonus = -10 embedding = null +/obj/projectile/bullet/c38/holy/on_hit(atom/target, blocked, pierce_hit) + . = ..() + var/roll_them_bones = rand(1,38) + if(roll_them_bones == 1 && isliving(target)) + playsound(target, 'sound/machines/synth_yes.ogg', 50, TRUE) + playsound(target, pick(list('sound/machines/coindrop.ogg', 'sound/machines/coindrop2.ogg')), 40, TRUE) + new /obj/effect/temp_visual/crit(get_turf(target)) + /datum/action/cooldown/spell/pointed/psychic_projection name = "Psychic Projection" desc = "Project your psychics into a target to warp their view, and instill absolute terror that will cause them to fire their gun rapidly." @@ -281,7 +303,7 @@ id = "psychic_projection" alert_type = null remove_on_fullheal = TRUE - tick_interval = 0.1 SECONDS + tick_interval = 0.2 SECONDS /// Times the target has dry fired a weapon. var/times_dry_fired = 0 /// Needs to reach times_dry_fired for the next dry fire to happen. @@ -306,7 +328,7 @@ game_plane_master_controller.remove_filter("psychic_blur") game_plane_master_controller.remove_filter("psychic_wave") -/datum/status_effect/psychic_projection/tick(seconds_per_tick, times_fired) +/datum/status_effect/psychic_projection/tick(seconds_between_ticks) var/obj/item/gun/held_gun = owner?.is_holding_item_of_type(/obj/item/gun) if(!held_gun) return diff --git a/code/modules/religion/festival/instrument_rites.dm b/code/modules/religion/festival/instrument_rites.dm index 83b064a639843..a1c94c92425dc 100644 --- a/code/modules/religion/festival/instrument_rites.dm +++ b/code/modules/religion/festival/instrument_rites.dm @@ -90,7 +90,7 @@ /datum/religion_rites/song_tuner/pain/finish_effect(mob/living/carbon/human/listener, atom/song_source) var/obj/item/bodypart/sliced_limb = pick(listener.bodyparts) - sliced_limb.force_wound_upwards(/datum/wound/slash/moderate/many_cuts) + sliced_limb.force_wound_upwards(/datum/wound/slash/flesh/moderate/many_cuts) /datum/religion_rites/song_tuner/lullaby name = "Spiritual Lullaby" diff --git a/code/modules/religion/honorbound/honorbound_rites.dm b/code/modules/religion/honorbound/honorbound_rites.dm index d2718fe1bde5c..c9c9e71135404 100644 --- a/code/modules/religion/honorbound/honorbound_rites.dm +++ b/code/modules/religion/honorbound/honorbound_rites.dm @@ -59,7 +59,7 @@ if(joining_now.mind.has_antag_datum(/datum/antagonist/cult))//what the fuck?! to_chat(user, span_warning("[GLOB.deity] has seen a true, dark evil in [joining_now]'s heart, and they have been smitten!")) playsound(get_turf(religious_tool), 'sound/effects/pray.ogg', 50, TRUE) - joining_now.gib(TRUE) + joining_now.gib(DROP_ORGANS|DROP_BODYPARTS) return FALSE var/datum/brain_trauma/special/honorbound/honor = user.has_trauma_type(/datum/brain_trauma/special/honorbound) if(joining_now in honor.guilty) @@ -138,8 +138,8 @@ return TRUE /obj/item/paper/holy_writ - icon = 'icons/obj/wizard.dmi' - icon_state = "scroll" + icon = 'icons/obj/scrolls.dmi' + icon_state = "honorscroll" slot_flags = null show_written_words = FALSE diff --git a/code/modules/religion/honorbound/honorbound_trauma.dm b/code/modules/religion/honorbound/honorbound_trauma.dm index 350e02c29f69d..29152e5bc7299 100644 --- a/code/modules/religion/honorbound/honorbound_trauma.dm +++ b/code/modules/religion/honorbound/honorbound_trauma.dm @@ -15,13 +15,10 @@ //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)) - //signals that check for guilt - RegisterSignal(owner, COMSIG_ATOM_ATTACKBY, PROC_REF(attackby_guilt)) - RegisterSignal(owner, COMSIG_ATOM_HULK_ATTACK, PROC_REF(hulk_guilt)) - RegisterSignal(owner, COMSIG_ATOM_ATTACK_HAND, PROC_REF(hand_guilt)) - RegisterSignal(owner, COMSIG_ATOM_ATTACK_PAW, PROC_REF(paw_guilt)) - RegisterSignal(owner, COMSIG_ATOM_BULLET_ACT, PROC_REF(bullet_guilt)) - RegisterSignal(owner, COMSIG_ATOM_HITBY, PROC_REF(thrown_guilt)) + + //adds the relay_attackers element to the owner so whoever attacks him becomes guilty. + owner.AddElement(/datum/element/relay_attackers) + RegisterSignal(owner, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked)) //signal that checks for dishonorable attacks RegisterSignal(owner, COMSIG_MOB_CLICKON, PROC_REF(attack_honor)) @@ -32,12 +29,7 @@ /datum/brain_trauma/special/honorbound/on_lose(silent) owner.clear_mood_event("honorbound") UnregisterSignal(owner, list( - COMSIG_ATOM_ATTACKBY, - COMSIG_ATOM_HULK_ATTACK, - COMSIG_ATOM_ATTACK_HAND, - COMSIG_ATOM_ATTACK_PAW, - COMSIG_ATOM_BULLET_ACT, - COMSIG_ATOM_HITBY, + COMSIG_ATOM_WAS_ATTACKED, COMSIG_MOB_CLICKON, COMSIG_MOB_CAST_SPELL, COMSIG_MOB_FIRED_GUN, @@ -77,7 +69,7 @@ if(user in guilty) return var/datum/mind/guilty_conscience = user.mind - if(guilty_conscience) //sec and medical are immune to becoming guilty through attack (we don't check holy because holy shouldn't be able to attack eachother anyways) + if(guilty_conscience && !declaration) //sec and medical are immune to becoming guilty through attack (we don't check holy because holy shouldn't be able to attack eachother anyways) var/datum/job/job = guilty_conscience.assigned_role if(job.departments_bitflags & (DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SECURITY)) return @@ -88,6 +80,12 @@ to_chat(user, span_danger("[GLOB.deity] no longer considers you innocent!")) guilty += user +///Signal sent by the relay_attackers element. It makes the attacker guilty unless the damage was stamina or it was a shove. +/datum/brain_trauma/special/honorbound/proc/on_attacked(mob/source, mob/attacker, attack_flags) + SIGNAL_HANDLER + if(!(attack_flags & (ATTACKER_STAMINA_ATTACK|ATTACKER_SHOVING))) + guilty(attacker) + /** * Called by attack_honor signal to check whether an attack should be allowed or not * @@ -111,7 +109,7 @@ if(is_holy || (job?.departments_bitflags & DEPARTMENT_BITFLAG_SECURITY)) to_chat(honorbound_human, span_warning("There is nothing righteous in attacking the just.")) return FALSE - if(job?.departments_bitflags & DEPARTMENT_BITFLAG_MEDICAL) + if(job?.departments_bitflags & DEPARTMENT_BITFLAG_MEDICAL && !is_guilty) to_chat(honorbound_human, span_warning("If you truly think this healer is not innocent, declare them guilty.")) return FALSE //THE INNOCENT @@ -120,55 +118,12 @@ return FALSE return TRUE -// SIGNALS THAT ARE FOR BEING ATTACKED FIRST (GUILTY) -/datum/brain_trauma/special/honorbound/proc/attackby_guilt(datum/source, obj/item/I, mob/attacker) - SIGNAL_HANDLER - if(I.force && I.damtype != STAMINA) - guilty(attacker) - -/datum/brain_trauma/special/honorbound/proc/hulk_guilt(datum/source, mob/attacker) - SIGNAL_HANDLER - guilty(attacker) - -/datum/brain_trauma/special/honorbound/proc/hand_guilt(datum/source, mob/living/attacker) - SIGNAL_HANDLER - if(attacker.combat_mode) - guilty(attacker) - -/datum/brain_trauma/special/honorbound/proc/paw_guilt(datum/source, mob/living/attacker) - SIGNAL_HANDLER - guilty(attacker) - -/datum/brain_trauma/special/honorbound/proc/bullet_guilt(datum/source, obj/projectile/proj) - SIGNAL_HANDLER - var/mob/living/shot_honorbound = source - var/static/list/guilty_projectiles = typecacheof(list( - /obj/projectile/beam, - /obj/projectile/bullet, - /obj/projectile/magic, - )) - if(!is_type_in_typecache(proj, guilty_projectiles)) - return - if(proj.damage_type == STAMINA || !proj.is_hostile_projectile()) - return - if(proj.damage > 0 && proj.damage < shot_honorbound.health && isliving(proj.firer)) - guilty(proj.firer) - -/datum/brain_trauma/special/honorbound/proc/thrown_guilt(datum/source, atom/movable/thrown_movable, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) - SIGNAL_HANDLER - if(isitem(thrown_movable)) - var/mob/living/honorbound = source - var/obj/item/thrown_item = thrown_movable - var/mob/thrown_by = thrown_item.thrownby?.resolve() - if(thrown_item.throwforce < honorbound.health && ishuman(thrown_by)) - guilty(thrown_by) - //spell checking /datum/brain_trauma/special/honorbound/proc/spell_check(mob/user, datum/action/cooldown/spell/spell_cast) SIGNAL_HANDLER punishment(user, spell_cast.school) -/datum/brain_trauma/special/honorbound/proc/staff_check(mob/user, obj/item/gun/gun_fired, target, params, zone_override) +/datum/brain_trauma/special/honorbound/proc/staff_check(mob/user, obj/item/gun/gun_fired, target, params, zone_override, list/bonus_spread_values) SIGNAL_HANDLER if(!istype(gun_fired, /obj/item/gun/magic)) return diff --git a/code/modules/religion/pyre_rites.dm b/code/modules/religion/pyre_rites.dm index 28ef53968f9ca..d974ef756f269 100644 --- a/code/modules/religion/pyre_rites.dm +++ b/code/modules/religion/pyre_rites.dm @@ -9,7 +9,7 @@ /datum/religion_rites/fireproof name = "Unmelting Protection" desc = "Grants fire immunity to any piece of clothing." - ritual_length = 15 SECONDS + ritual_length = 12 SECONDS ritual_invocations = list("And so to support the holder of the Ever-Burning candle...", "... allow this unworthy apparel to serve you ...", "... make it strong enough to burn a thousand time and more ...") @@ -44,7 +44,7 @@ /datum/religion_rites/burning_sacrifice name = "Burning Offering" desc = "Sacrifice a buckled burning corpse for favor, the more burn damage the corpse has the more favor you will receive." - ritual_length = 20 SECONDS + ritual_length = 15 SECONDS ritual_invocations = list("Burning body ...", "... cleansed by the flame ...", "... we were all created from fire ...", @@ -125,11 +125,11 @@ invoke_msg = "... a blazing star is born!" favor_cost = 2000 ///arrow to enchant - var/obj/item/ammo_casing/caseless/arrow/holy/enchant_target + var/obj/item/ammo_casing/arrow/holy/enchant_target /datum/religion_rites/blazing_star/perform_rite(mob/living/user, atom/religious_tool) - for(var/obj/item/ammo_casing/caseless/arrow/holy/can_enchant in get_turf(religious_tool)) - if(istype(can_enchant, /obj/item/ammo_casing/caseless/arrow/holy/blazing)) + for(var/obj/item/ammo_casing/arrow/holy/can_enchant in get_turf(religious_tool)) + if(istype(can_enchant, /obj/item/ammo_casing/arrow/holy/blazing)) continue enchant_target = can_enchant return ..() @@ -138,7 +138,7 @@ /datum/religion_rites/blazing_star/invoke_effect(mob/living/user, atom/movable/religious_tool) ..() - var/obj/item/ammo_casing/caseless/arrow/holy/enchanting = enchant_target + var/obj/item/ammo_casing/arrow/holy/enchanting = enchant_target var/turf/tool_turf = get_turf(religious_tool) enchant_target = null if(QDELETED(enchanting) || !(tool_turf == enchanting.loc)) //check if the arrow is still there @@ -146,6 +146,6 @@ return FALSE enchanting.visible_message(span_notice("[enchant_target] is blessed by holy fire!")) playsound(tool_turf, 'sound/effects/pray.ogg', 50, TRUE) - new /obj/item/ammo_casing/caseless/arrow/holy/blazing(tool_turf) + new /obj/item/ammo_casing/arrow/holy/blazing(tool_turf) qdel(enchanting) return TRUE diff --git a/code/modules/religion/religion_sects.dm b/code/modules/religion/religion_sects.dm index 0095aa973b558..ebd90388fda64 100644 --- a/code/modules/religion/religion_sects.dm +++ b/code/modules/religion/religion_sects.dm @@ -55,21 +55,28 @@ /// Activates once selected and on newjoins, oriented around people who become holy. /datum/religion_sect/proc/on_conversion(mob/living/chap) SHOULD_CALL_PARENT(TRUE) - to_chat(chap, "\"[quote]\"") - to_chat(chap, "[desc]") + to_chat(chap, span_boldnotice("\"[quote]\"")) + to_chat(chap, span_notice("[desc]")) + +/// Activates if religious sect is reset by admins, should clean up anything you added on conversion. +/datum/religion_sect/proc/on_deconversion(mob/living/chap) + SHOULD_CALL_PARENT(TRUE) + to_chat(chap, span_boldnotice("You have lost the approval of \the [name].")) + if(chap.mind.holy_role == HOLY_ROLE_HIGHPRIEST) + to_chat(chap, span_notice("Return to an altar to reform your sect.")) /// Returns TRUE if the item can be sacrificed. Can be modified to fit item being tested as well as person offering. Returning TRUE will stop the attackby sequence and proceed to on_sacrifice. -/datum/religion_sect/proc/can_sacrifice(obj/item/I, mob/living/chap) +/datum/religion_sect/proc/can_sacrifice(obj/item/sacrifice, mob/living/chap) . = TRUE if(chap.mind.holy_role == HOLY_ROLE_DEACON) to_chat(chap, "You are merely a deacon of [GLOB.deity], and therefore cannot perform rites.") return - if(!is_type_in_typecache(I,desired_items_typecache)) + if(!is_type_in_typecache(sacrifice, desired_items_typecache)) return FALSE /// Activates when the sect sacrifices an item. This proc has NO bearing on the attackby sequence of other objects when used in conjunction with the religious_tool component. -/datum/religion_sect/proc/on_sacrifice(obj/item/I, mob/living/chap) - return adjust_favor(default_item_favor,chap) +/datum/religion_sect/proc/on_sacrifice(obj/item/sacrifice, mob/living/chap) + return adjust_favor(default_item_favor, chap) /// Returns a description for religious tools /datum/religion_sect/proc/tool_examine(mob/living/holy_creature) @@ -82,7 +89,7 @@ . = favor //if favor = 5 and we want to subtract 10, we'll only be able to subtract 5 if((favor + amount > max_favor)) . = (max_favor-favor) //if favor = 5 and we want to add 10 with a max of 10, we'll only be able to add 5 - favor = clamp(0,max_favor, favor+amount) + favor = clamp(0, max_favor, favor+amount) /// Sets favor to a specific amount. Can provide optional features based on a user. /datum/religion_sect/proc/set_favor(amount = 0, mob/living/chap) @@ -98,7 +105,7 @@ return FALSE var/mob/living/carbon/human/blessed = target for(var/obj/item/bodypart/bodypart as anything in blessed.bodyparts) - if(!IS_ORGANIC_LIMB(bodypart)) + if(IS_ROBOTIC_LIMB(bodypart)) to_chat(chap, span_warning("[GLOB.deity] refuses to heal this metallic taint!")) return TRUE @@ -108,7 +115,7 @@ 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)) + if(affecting.heal_damage(heal_amt, heal_amt, required_bodytype = BODYTYPE_ORGANIC)) blessed.update_damage_overlays() 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!")) @@ -163,7 +170,7 @@ //if we're not targetting a robot part we stop early var/obj/item/bodypart/bodypart = blessed.get_bodypart(chap.zone_selected) - if(!IS_ORGANIC_LIMB(bodypart)) + if(IS_ORGANIC_LIMB(bodypart)) if(!did_we_charge) to_chat(chap, span_warning("[GLOB.deity] scoffs at the idea of healing such fleshy matter!")) else @@ -177,22 +184,23 @@ if(bodypart.heal_damage(5,5,BODYTYPE_ROBOTIC)) blessed.update_damage_overlays() - 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!")) + blessed.visible_message(span_notice("[chap] [did_we_charge ? "repairs and charges" : "repairs"] [blessed] with the power of [GLOB.deity]!")) + to_chat(blessed, span_boldnotice("The inner machinations of [GLOB.deity] [did_we_charge ? "repairs and charges" : "repairs"] you!")) playsound(chap, 'sound/effects/bang.ogg', 25, TRUE, -1) blessed.add_mood_event("blessing", /datum/mood_event/blessing) return TRUE -/datum/religion_sect/mechanical/on_sacrifice(obj/item/I, mob/living/chap) - var/obj/item/stock_parts/cell/the_cell = I - if(!istype(the_cell)) //how... +/datum/religion_sect/mechanical/on_sacrifice(obj/item/stock_parts/cell/power_cell, mob/living/chap) + if(!istype(power_cell)) return - if(the_cell.charge < 300) - to_chat(chap,span_notice("[GLOB.deity] does not accept pity amounts of power.")) + + if(power_cell.charge < 300) + to_chat(chap, span_notice("[GLOB.deity] does not accept pity amounts of power.")) return - adjust_favor(round(the_cell.charge/300), chap) - to_chat(chap, span_notice("You offer [the_cell]'s power to [GLOB.deity], pleasing them.")) - qdel(I) + + adjust_favor(round(power_cell.charge/300), chap) + to_chat(chap, span_notice("You offer [power_cell]'s power to [GLOB.deity], pleasing them.")) + qdel(power_cell) return TRUE /**** Pyre God ****/ @@ -216,9 +224,6 @@ ), )) -//candle sect bibles don't heal or do anything special apart from the standard holy water blessings -/datum/religion_sect/pyre/sect_bless(mob/living/target, mob/living/chap) - return TRUE /datum/religion_sect/pyre/on_sacrifice(obj/item/flashlight/flare/candle/offering, mob/living/user) if(!istype(offering)) @@ -227,7 +232,7 @@ to_chat(user, span_notice("The candle needs to be lit to be offered!")) return to_chat(user, span_notice("[GLOB.deity] is pleased with your sacrifice.")) - adjust_favor(20, user) //it's not a lot but hey there's a pacifist favor option at least + adjust_favor(50, user) //it's not a lot but hey there's a pacifist favor option at least qdel(offering) return TRUE @@ -258,7 +263,7 @@ return FALSE var/mob/living/carbon/human/blessed = blessed_living for(var/obj/item/bodypart/robolimb as anything in blessed.bodyparts) - if(!IS_ORGANIC_LIMB(robolimb)) + if(IS_ROBOTIC_LIMB(robolimb)) to_chat(chap, span_warning("[GLOB.deity] refuses to heal this metallic taint!")) return TRUE @@ -267,7 +272,7 @@ 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)) + if(affecting.heal_damage(heal_amt, heal_amt, required_bodytype = BODYTYPE_ORGANIC)) blessed.update_damage_overlays() 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]!")) @@ -295,6 +300,11 @@ return new_convert.gain_trauma(/datum/brain_trauma/special/burdened, TRAUMA_RESILIENCE_MAGIC) +/datum/religion_sect/burden/on_deconversion(mob/living/carbon/human/new_convert) + if (ishuman(new_convert)) + new_convert.cure_trauma_type(/datum/brain_trauma/special/burdened, TRAUMA_RESILIENCE_MAGIC) + return ..() + /datum/religion_sect/burden/tool_examine(mob/living/carbon/human/burdened) //display burden level if(!ishuman(burdened)) return FALSE @@ -336,6 +346,11 @@ return FALSE new_convert.gain_trauma(/datum/brain_trauma/special/honorbound, TRAUMA_RESILIENCE_MAGIC) +/datum/religion_sect/honorbound/on_deconversion(mob/living/carbon/human/new_convert) + if (ishuman(new_convert)) + new_convert.cure_trauma_type(/datum/brain_trauma/special/honorbound, TRAUMA_RESILIENCE_MAGIC) + return ..() + #define MINIMUM_YUCK_REQUIRED 5 /datum/religion_sect/maintenance diff --git a/code/modules/religion/religion_structures.dm b/code/modules/religion/religion_structures.dm index 1e542952fc0a5..ae61004b46e83 100644 --- a/code/modules/religion/religion_structures.dm +++ b/code/modules/religion/religion_structures.dm @@ -1,7 +1,7 @@ /obj/structure/altar_of_gods name = "\improper Altar of the Gods" desc = "An altar which allows the head of the church to choose a sect of religious teachings as well as provide sacrifices to earn favor." - icon = 'icons/obj/hand_of_god_structures.dmi' + icon = 'icons/obj/service/hand_of_god_structures.dmi' icon_state = "convertaltar" density = TRUE anchored = TRUE @@ -61,7 +61,10 @@ . += list(span_notice("Chaplains: [chaplains].")) /obj/structure/altar_of_gods/proc/reflect_sect_in_icons() - if(GLOB.religious_sect) + if(isnull(GLOB.religious_sect)) + icon = initial(icon) + icon_state = initial(icon_state) + else sect_to_altar = GLOB.religious_sect if(sect_to_altar.altar_icon) icon = sect_to_altar.altar_icon @@ -81,7 +84,7 @@ /obj/item/ritual_totem name = "ritual totem" desc = "A wooden totem with strange carvings on it." - icon = 'icons/obj/hand_of_god_structures.dmi' + icon = 'icons/obj/service/hand_of_god_structures.dmi' icon_state = "ritual_totem" inhand_icon_state = "sheet-wood" lefthand_file = 'icons/mob/inhands/items/sheets_lefthand.dmi' diff --git a/code/modules/religion/rites.dm b/code/modules/religion/rites.dm index c7e38145349e0..d907191c33ddd 100644 --- a/code/modules/religion/rites.dm +++ b/code/modules/religion/rites.dm @@ -221,7 +221,7 @@ user.add_mood_event("maint_adaptation", /datum/mood_event/maintenance_adaptation) if(iscarbon(user)) var/mob/living/carbon/vomitorium = user - vomitorium.vomit() + vomitorium.vomit(VOMIT_CATEGORY_DEFAULT) var/datum/dna/dna = vomitorium.has_dna() dna?.add_mutation(/datum/mutation/human/stimmed) //some fluff mutations dna?.add_mutation(/datum/mutation/human/strong) diff --git a/code/modules/religion/sparring/sparring_contract.dm b/code/modules/religion/sparring/sparring_contract.dm index 4f1f17e6837e7..c31be81f64945 100644 --- a/code/modules/religion/sparring/sparring_contract.dm +++ b/code/modules/religion/sparring/sparring_contract.dm @@ -1,7 +1,7 @@ /obj/item/sparring_contract desc = "A contract for setting up sparring matches. Both sparring partners must agree with the terms to begin." - icon = 'icons/obj/wizard.dmi' - icon_state = "scroll" + icon = 'icons/obj/scrolls.dmi' + icon_state = "sparringcontract" drop_sound = 'sound/items/handling/paper_drop.ogg' pickup_sound = 'sound/items/handling/paper_pickup.ogg' throw_range = 1 diff --git a/code/modules/religion/sparring/sparring_datum.dm b/code/modules/religion/sparring/sparring_datum.dm index 5d4853b378e6e..bfaa94d65a8aa 100644 --- a/code/modules/religion/sparring/sparring_datum.dm +++ b/code/modules/religion/sparring/sparring_datum.dm @@ -149,7 +149,7 @@ flubbed_match() ///someone used a gun -/datum/sparring_match/proc/gun_violation(datum/offender) +/datum/sparring_match/proc/gun_violation(mob/offender, obj/item/gun/gun_fired, target, params, zone_override, list/bonus_spread_values) SIGNAL_HANDLER violation(offender, "using guns") @@ -216,7 +216,7 @@ var/mob/living/carbon/human/branded = interfering to_chat(interfering, span_warning("[GLOB.deity] brands your flesh for interfering with [chaplain]'s sparring match!!")) var/obj/item/bodypart/branded_limb = pick(branded.bodyparts) - branded_limb.force_wound_upwards(/datum/wound/burn/severe/brand, wound_source = "divine intervention") + branded_limb.force_wound_upwards(/datum/wound/burn/flesh/severe/brand, wound_source = "divine intervention") branded.emote("scream") flubs-- diff --git a/code/modules/requests/request_manager.dm b/code/modules/requests/request_manager.dm index 19a94a61dad6e..41e46aa53c256 100644 --- a/code/modules/requests/request_manager.dm +++ b/code/modules/requests/request_manager.dm @@ -66,7 +66,7 @@ GLOBAL_DATUM_INIT(requests, /datum/request_manager, new) /datum/request_manager/proc/pray(client/C, message, is_chaplain) request_for_client(C, REQUEST_PRAYER, message) for(var/client/admin in GLOB.admins) - if(is_chaplain && admin.prefs.chat_toggles & CHAT_PRAYER && admin.prefs.toggles & SOUND_PRAYERS) + if(is_chaplain && get_chat_toggles(admin) & CHAT_PRAYER && admin.prefs.toggles & SOUND_PRAYERS) SEND_SOUND(admin, sound('sound/effects/pray.ogg')) /** @@ -223,7 +223,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 SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/nuclearbomb/selfdestruct)) 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/anomaly/anomaly_core.dm b/code/modules/research/anomaly/anomaly_core.dm index 56220956182b5..febb25add5301 100644 --- a/code/modules/research/anomaly/anomaly_core.dm +++ b/code/modules/research/anomaly/anomaly_core.dm @@ -23,7 +23,7 @@ /obj/item/assembly/signaler/anomaly/manual_suicide(mob/living/carbon/user) user.visible_message(span_suicide("[user]'s [src] is reacting to the radio signal, warping [user.p_their()] body!")) user.set_suicide(TRUE) - user.gib() + user.gib(DROP_ALL_REMAINS) /obj/item/assembly/signaler/anomaly/attack_self() return diff --git a/code/modules/research/bepis.dm b/code/modules/research/bepis.dm deleted file mode 100644 index 2f038b2751159..0000000000000 --- a/code/modules/research/bepis.dm +++ /dev/null @@ -1,295 +0,0 @@ -//This system is designed to act as an in-between for cargo and science, and the first major money sink in the game outside of just buying things from cargo (As of 10/9/19, anyway). - -//economics defined values, subject to change should anything be too high or low in practice. - -#define MACHINE_OPERATION 100000 -#define MACHINE_OVERLOAD 500000 -#define MAJOR_THRESHOLD (6*CARGO_CRATE_VALUE) -#define MINOR_THRESHOLD (4*CARGO_CRATE_VALUE) -#define STANDARD_DEVIATION (2*CARGO_CRATE_VALUE) -#define PART_CASH_OFFSET_AMOUNT (0.5*CARGO_CRATE_VALUE) - -/obj/machinery/rnd/bepis - name = "\improper B.E.P.I.S. Chamber" - desc = "A high fidelity testing device which unlocks the secrets of the known universe using the two most powerful substances available to man: excessive amounts of electricity and capital." - icon = 'icons/obj/machines/bepis.dmi' - icon_state = "chamber" - base_icon_state = "chamber" - density = TRUE - layer = ABOVE_MOB_LAYER - plane = GAME_PLANE_UPPER - circuit = /obj/item/circuitboard/machine/bepis - - ///How much cash the UI and machine are depositing at a time. - var/banking_amount = 100 - ///How much stored player cash exists within the machine. - var/banked_cash = 0 - ///Payer's bank account. - var/datum/bank_account/account - ///Name on the payer's bank account. - var/account_name - ///When the BEPIS fails to hand out any reward, the ERROR cause will be a randomly picked string displayed on the UI. - var/error_cause = null - - //Vars related to probability and chance of success for testing, using gaussian normal distribution. - ///How much cash you will need to obtain a Major Tech Disk reward. - var/major_threshold = MAJOR_THRESHOLD - ///How much cash you will need to obtain a minor invention reward. - var/minor_threshold = MINOR_THRESHOLD - ///The standard deviation of the BEPIS's gaussian normal distribution. - var/std = STANDARD_DEVIATION - - //Stock part variables - ///Multiplier that lowers how much the BEPIS' power costs are. Maximum of 1, upgraded to a minimum of 0.7. See RefreshParts. - var/power_saver = 1 - ///Variability on the money you actively spend on the BEPIS, with higher inaccuracy making the most change, good and bad to spent cash. - var/inaccuracy_percentage = 1.5 - ///How much "cash" is added to your inserted cash efforts for free. Based on manipulator stock part level. - var/positive_cash_offset = 0 - ///How much "cost" is removed from both the minor and major threshold costs. Based on laser stock part level. - var/negative_cash_offset = 0 - ///List of objects that constitute your minor rewards. All rewards are unique or rare outside of the BEPIS. - var/minor_rewards = list( - //To add a new minor reward, add it here. - /obj/item/stack/circuit_stack/full, - /obj/item/pen/survival, - /obj/item/circuitboard/machine/sleeper/party, - /obj/item/toy/sprayoncan, - ) - -/obj/machinery/rnd/bepis/attackby(obj/item/O, mob/user, params) - if(!is_operational) - to_chat(user, span_notice("[src] can't accept money when it's not functioning.")) - return - if(istype(O, /obj/item/holochip) || istype(O, /obj/item/stack/spacecash)) - var/deposit_value = O.get_item_credit_value() - banked_cash += deposit_value - qdel(O) - say("Deposited [deposit_value] credits into storage.") - update_appearance() - return - if(isidcard(O)) - var/obj/item/card/id/Card = O - if(Card.registered_account) - account = Card.registered_account - account_name = Card.registered_name - say("New account detected. Console Updated.") - else - say("No account detected on card. Aborting.") - return - return ..() - -/obj/machinery/rnd/bepis/screwdriver_act(mob/living/user, obj/item/tool) - return default_deconstruction_screwdriver(user, "chamber_open", "chamber", tool) - -/obj/machinery/rnd/bepis/screwdriver_act_secondary(mob/living/user, obj/item/tool) - return default_deconstruction_screwdriver(user, "chamber_open", "chamber", tool) - -/obj/machinery/rnd/bepis/RefreshParts() - . = ..() - var/C = 0 - var/M = 0 - var/L = 0 - var/S = 0 - for(var/datum/stock_part/capacitor/capacitor in component_parts) - C += ((capacitor.tier - 1) * 0.1) - power_saver = 1 - C - for(var/datum/stock_part/servo/servo in component_parts) - M += ((servo.tier - 1) * PART_CASH_OFFSET_AMOUNT) - positive_cash_offset = M - for(var/datum/stock_part/micro_laser/Laser in component_parts) - L += ((Laser.tier - 1) * PART_CASH_OFFSET_AMOUNT) - negative_cash_offset = L - for(var/datum/stock_part/scanning_module/scanning_module in component_parts) - S += ((scanning_module.tier - 1) * 0.25) - inaccuracy_percentage = (1.5 - S) - -/obj/machinery/rnd/bepis/update_icon_state() - if(panel_open == TRUE) - icon_state = "[base_icon_state]_open" - return ..() - if((use_power == ACTIVE_POWER_USE) && (banked_cash > 0) && (is_operational)) - icon_state = "[base_icon_state]_active_loaded" - return ..() - if (((use_power == IDLE_POWER_USE) && (banked_cash > 0)) || (banked_cash > 0) && (!is_operational)) - icon_state = "[base_icon_state]_loaded" - return ..() - if(use_power == ACTIVE_POWER_USE && is_operational) - icon_state = "[base_icon_state]_active" - return ..() - if(((use_power == IDLE_POWER_USE) && (banked_cash == 0)) || (!is_operational)) - icon_state = base_icon_state - return ..() - return ..() - -/obj/machinery/rnd/bepis/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "Bepis", name) - ui.open() - RefreshParts() - if(isliving(user)) - var/mob/living/customer = user - account = customer.get_bank_account() - -/obj/machinery/rnd/bepis/ui_data(mob/user) - var/list/data = list() - var/powered = FALSE - var/zvalue = ((banking_amount + banked_cash) - (major_threshold - positive_cash_offset - negative_cash_offset))/(std) - var/std_success = 0 - var/prob_success = 0 - //Admittedly this is messy, but not nearly as messy as the alternative, which is jury-rigging an entire Z-table into the code, or making an adaptive z-table. - var/z = abs(zvalue) - if(z > 0 && z <= 0.5) - std_success = 19.1 - else if(z > 0.5 && z <= 1.0) - std_success = 34.1 - else if(z > 1.0 && z <= 1.5) - std_success = 43.3 - else if(z > 1.5 && z <= 2.0) - std_success = 47.7 - else if(z > 2.0 && z <= 2.5) - std_success = 49.4 - else - std_success = 50 - if(zvalue > 0) - prob_success = 50 + std_success - else if(zvalue == 0) - prob_success = 50 - else - prob_success = 50 - std_success - - if(use_power == ACTIVE_POWER_USE) - powered = TRUE - data["account_owner"] = account_name - data["amount"] = banking_amount - data["stored_cash"] = account?.account_balance - data["mean_value"] = (major_threshold - positive_cash_offset - negative_cash_offset) - data["error_name"] = error_cause - data["power_saver"] = power_saver - data["accuracy_percentage"] = inaccuracy_percentage * 100 - data["positive_cash_offset"] = positive_cash_offset - data["negative_cash_offset"] = negative_cash_offset - data["manual_power"] = powered ? FALSE : TRUE - data["silicon_check"] = issilicon(user) - data["success_estimate"] = prob_success - return data - -/obj/machinery/rnd/bepis/ui_act(action,params) - . = ..() - if(.) - return - switch(action) - if("begin_experiment") - if(use_power == IDLE_POWER_USE) - return - depositcash() - if(banked_cash == 0) - say("Please select funds to deposit to begin testing.") - return - calcsuccess() - use_power(MACHINE_OPERATION * power_saver) //This thing should eat your APC battery if you're not careful. - update_use_power(IDLE_POWER_USE) //Machine shuts off after use to prevent spam and look better visually. - update_appearance() - if("amount") - var/input = text2num(params["amount"]) - if(input) - banking_amount = input - if("toggle_power") - if(use_power == ACTIVE_POWER_USE) - update_use_power(IDLE_POWER_USE) - else - update_use_power(ACTIVE_POWER_USE) - update_appearance() - if("account_reset") - if(use_power == IDLE_POWER_USE) - return - account_name = "" - account = null - say("Account settings reset.") - . = TRUE - -/** - * Proc that handles the user's account to deposit credits for the BEPIS. - * Handles success and fail cases for transferring credits, then logs the transaction and uses small amounts of power. - **/ -/obj/machinery/rnd/bepis/proc/depositcash() - var/deposit_value = 0 - deposit_value = banking_amount - if(deposit_value == 0) - update_appearance() - say("Attempting to deposit 0 credits. Aborting.") - return - deposit_value = clamp(round(deposit_value, 1), 1, 10000) - if(!account) - say("Cannot find user account. Please swipe a valid ID.") - return - if(!account.has_money(deposit_value)) - say("You do not possess enough credits.") - return - account.adjust_money(-deposit_value, "Vending: B.E.P.I.S. Chamber") //The money vanishes, not paid to any accounts. - SSblackbox.record_feedback("amount", "BEPIS_credits_spent", deposit_value) - log_econ("[deposit_value] credits were inserted into [src] by [account.account_holder]") - banked_cash += deposit_value - use_power(1000 * power_saver) - return - -/** - * Proc used to determine the experiment math and results all in one. - * Uses banked_cash and stock part levels to determine minor, major, and real gauss values for the BEPIS to hold. - * If by the end real is larger than major, You get a tech disk. If all the disks are earned or you at least beat minor, you get a minor reward. - **/ - -/obj/machinery/rnd/bepis/proc/calcsuccess() - var/turf/dropturf = null - var/gauss_major = 0 - var/gauss_minor = 0 - var/gauss_real = 0 - - var/turf/my_turf = get_turf(src) - var/list/turfs = TURF_NEIGHBORS(my_turf) //NO MORE DISCS IN WINDOWS - while(length(turfs)) - var/turf/T = pick_n_take(turfs) - if(T.is_blocked_turf(TRUE)) - continue - else - dropturf = T - break - - if (!dropturf) - dropturf = drop_location() - gauss_major = (gaussian(major_threshold, std) - negative_cash_offset) //This is the randomized profit value that this experiment has to surpass to unlock a tech. - gauss_minor = (gaussian(minor_threshold, std) - negative_cash_offset) //And this is the threshold to instead get a minor prize. - gauss_real = (gaussian(banked_cash, std*inaccuracy_percentage) + positive_cash_offset) //this is the randomized profit value that your experiment expects to give. - say("Real: [gauss_real]. Minor: [gauss_minor]. Major: [gauss_major].") - flick("chamber_flash",src) - update_appearance() - banked_cash = 0 - if((gauss_real >= gauss_major)) //Major Success. - if(SSresearch.techweb_nodes_experimental.len > 0) - say("Experiment concluded with major success. New technology node discovered on technology disc.") - new /obj/item/disk/design_disk/bepis/remove_tech(dropturf,1) - return - say("Expended all available experimental technology nodes. Resorting to minor rewards.") - if(gauss_real >= gauss_minor) //Minor Success. - var/reward = pick(minor_rewards) - new reward(dropturf) - say("Experiment concluded with partial success. Dispensing compiled research efforts.") - return - if(gauss_real <= -1) //Critical Failure - say("ERROR: CRITICAL MACHIME MALFUNCTI- ON. CURRENCY IS NOT CRASH. CANNOT COMPUTE COMMAND: 'make bucks'") //not a typo, for once. - new /mob/living/basic/deer(dropturf, 1) - use_power(MACHINE_OVERLOAD * power_saver) //To prevent gambling at low cost and also prevent spamming for infinite deer. - return - //Minor Failure - error_cause = pick("attempted to sell grey products to American dominated market.","attempted to sell gray products to British dominated market.","placed wild assumption that PDAs would go out of style.","simulated product #76 damaged brand reputation mortally.","simulated business model resembled 'pyramid scheme' by 98.7%.","product accidently granted override access to all station doors.") - say("Experiment concluded with zero product viability. Cause of error: [error_cause]") - return - - -#undef MACHINE_OPERATION -#undef MACHINE_OVERLOAD -#undef MAJOR_THRESHOLD -#undef MINOR_THRESHOLD -#undef STANDARD_DEVIATION -#undef PART_CASH_OFFSET_AMOUNT diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index c8cf81253fe2d..f5421be6da69a 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -6,13 +6,13 @@ For the materials datum, it assumes you need reagents unless specified otherwise. To designate a material that isn't a reagent, you use one of the material IDs below. These are NOT ids in the usual sense (they aren't defined in the object or part of a datum), they are simply references used as part of a "has materials?" type proc. They all start with a $ to denote that they aren't reagents. -The currently supporting non-reagent materials. All material amounts are set as the define SHEET_MATERIAL_AMOUNT, which defaults to 2000 +The currently supporting non-reagent materials. All material amounts are set as the define SHEET_MATERIAL_AMOUNT, which defaults to 100 Don't add new keyword/IDs if they are made from an existing one (such as rods which are made from iron). Only add raw materials. Design Guidelines - When adding new designs, check rdreadme.dm to see what kind of things have already been made and where new stuff is needed. -- A single sheet of anything is 2000 units of material. Materials besides iron/glass require help from other jobs (mining for +- A single sheet of anything is 100 units of material. Materials besides iron/glass require help from other jobs (mining for other types of metals and chemistry for reagents). - Add the AUTOLATHE tag to */ diff --git a/code/modules/research/designs/AI_module_designs.dm b/code/modules/research/designs/AI_module_designs.dm index 4d6211eb897cc..f45ca0e314879 100644 --- a/code/modules/research/designs/AI_module_designs.dm +++ b/code/modules/research/designs/AI_module_designs.dm @@ -16,7 +16,7 @@ name = "Safeguard Module" desc = "Allows for the construction of a Safeguard AI Module." id = "safeguard_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/supplied/safeguard category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_DANGEROUS_MODULES @@ -27,7 +27,7 @@ name = "OneHuman Module" desc = "Allows for the construction of a OneHuman AI Module." id = "onehuman_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = 6000, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT * 3, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/zeroth/onehuman category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_DANGEROUS_MODULES @@ -38,7 +38,7 @@ name = "ProtectStation Module" desc = "Allows for the construction of a ProtectStation AI Module." id = "protectstation_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/supplied/protect_station category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_DANGEROUS_MODULES @@ -49,7 +49,7 @@ name = "Quarantine Module" desc = "Allows for the construction of a Quarantine AI Module." id = "quarantine_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/supplied/quarantine category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_DANGEROUS_MODULES @@ -60,7 +60,7 @@ name = "OxygenIsToxicToHumans Module" desc = "Allows for the construction of a OxygenIsToxicToHumans AI Module." id = "oxygen_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/supplied/oxygen category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_DANGEROUS_MODULES @@ -71,7 +71,7 @@ name = "Freeform Module" desc = "Allows for the construction of a Freeform AI Module." id = "freeform_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold = 10000, /datum/material/bluespace =SHEET_MATERIAL_AMOUNT)//Custom inputs should be more expensive to get + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold = SHEET_MATERIAL_AMOUNT * 5, /datum/material/bluespace = SHEET_MATERIAL_AMOUNT)//Custom inputs should be more expensive to get build_path = /obj/item/ai_module/supplied/freeform category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_LAW_MANIPULATION @@ -82,7 +82,7 @@ name = "Reset Module" desc = "Allows for the construction of a Reset AI Module." id = "reset_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold =SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold = SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/reset category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_LAW_MANIPULATION @@ -93,7 +93,7 @@ name = "Purge Module" desc = "Allows for the construction of a Purge AI Module." id = "purge_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/reset/purge category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_LAW_MANIPULATION @@ -104,7 +104,7 @@ name = "Law Removal Module" desc = "Allows for the construction of a Law Removal AI Core Module." id = "remove_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/remove category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_LAW_MANIPULATION @@ -115,7 +115,7 @@ name = "Core Freeform Module" desc = "Allows for the construction of a Core Freeform AI Core Module." id = "freeformcore_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT*5, /datum/material/bluespace =SHEET_MATERIAL_AMOUNT)//Ditto + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT * 5, /datum/material/bluespace = SHEET_MATERIAL_AMOUNT)//Ditto build_path = /obj/item/ai_module/core/freeformcore category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_LAW_MANIPULATION @@ -126,7 +126,7 @@ name = "Asimov Module" desc = "Allows for the construction of an Asimov AI Core Module." id = "asimov_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/core/full/asimov category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -137,7 +137,7 @@ name = "P.A.L.A.D.I.N. Module" desc = "Allows for the construction of a P.A.L.A.D.I.N. AI Core Module." id = "paladin_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/core/full/paladin category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -148,7 +148,7 @@ name = "T.Y.R.A.N.T. Module" desc = "Allows for the construction of a T.Y.R.A.N.T. AI Module." id = "tyrant_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/core/full/tyrant category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -159,7 +159,7 @@ name = "Overlord Module" desc = "Allows for the construction of an Overlord AI Module." id = "overlord_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/core/full/overlord category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_DANGEROUS_MODULES @@ -170,7 +170,7 @@ name = "Corporate Module" desc = "Allows for the construction of a Corporate AI Core Module." id = "corporate_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/core/full/corp category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -181,7 +181,7 @@ name = "Default Module" desc = "Allows for the construction of a Default AI Core Module." id = "default_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/core/full/custom category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -192,7 +192,7 @@ name = "Dungeon Master Module" desc = "Allows for the construction of a Dungeon Master AI Core Module." id = "dungeon_master_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/core/full/dungeon_master category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -203,7 +203,7 @@ name = "Painter Module" desc = "Allows for the construction of a Painter AI Core Module." id = "painter_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/core/full/painter category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -214,7 +214,7 @@ name = "Nutimov Module" desc = "Allows for the construction of a Nutimov AI Core Module." id = "nutimov_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/core/full/nutimov category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -225,7 +225,7 @@ name = "10 Commandments Module" desc = "Allows for the construction of a 10 Commandments AI Core Module." id = "ten_commandments_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/core/full/ten_commandments category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -236,7 +236,7 @@ name = "Asimov++ Module" desc = "Allows for the construction of a Asimov++ AI Core Module." id = "asimovpp_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/core/full/asimovpp category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -247,7 +247,7 @@ name = "Hippocratic Module" desc = "Allows for the construction of a Hippocratic AI Core Module." id = "hippocratic_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/core/full/hippocratic category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -258,7 +258,7 @@ name = "Paladin Devotion Module" desc = "Allows for the construction of a Paladin Devotion AI Core Module." id = "paladin_devotion_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/core/full/paladin_devotion category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -269,7 +269,7 @@ name = "Robocop Module" desc = "Allows for the construction of a Robocop AI Core Module." id = "robocop_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/core/full/robocop category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -280,7 +280,7 @@ name = "Maintain Module" desc = "Allows for the construction of a Maintain AI Core Module." id = "maintain_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/core/full/maintain category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -291,7 +291,7 @@ name = "Liveandletlive Module" desc = "Allows for the construction of a Liveandletlive AI Core Module." id = "liveandletlive_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/core/full/liveandletlive category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -302,7 +302,7 @@ name = "Peacekeeper Module" desc = "Allows for the construction of a Peacekeeper AI Core Module." id = "peacekeeper_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/core/full/peacekeeper category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -313,7 +313,7 @@ name = "Reporter Module" desc = "Allows for the construction of a Reporter AI Core Module." id = "reporter_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/core/full/reporter category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -324,7 +324,7 @@ name = "H.O.G.A.N. Module" desc = "Allows for the construction of a H.O.G.A.N. AI Core Module." id = "hulkamania_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/core/full/hulkamania category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -335,7 +335,7 @@ name = "Drone Module" desc = "Allows for the construction of a Drone AI Core Module." id = "drone_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/core/full/drone category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -346,7 +346,7 @@ name = "Antimov Module" desc = "Allows for the construction of a Antimov AI Core Module." id = "antimov_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/core/full/antimov category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_DANGEROUS_MODULES @@ -357,7 +357,7 @@ name = "Balance Module" desc = "Allows for the construction of a Balance AI Core Module." id = "balance_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/core/full/balance category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_DANGEROUS_MODULES @@ -368,7 +368,7 @@ name = "Thermodynamic Module" desc = "Allows for the construction of a Thermodynamic AI Core Module." id = "thermurderdynamic_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/core/full/thermurderdynamic category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_DANGEROUS_MODULES @@ -379,7 +379,7 @@ name = "Damaged AI Module" desc = "Allows for the construction of a Damaged AI Core Module." id = "damaged_module" - materials = list(/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) + materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/ai_module/core/full/damaged category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_DANGEROUS_MODULES diff --git a/code/modules/research/designs/autolathe/engineering_designs.dm b/code/modules/research/designs/autolathe/engineering_designs.dm index 525256e25dd38..4d065ff1dda2c 100644 --- a/code/modules/research/designs/autolathe/engineering_designs.dm +++ b/code/modules/research/designs/autolathe/engineering_designs.dm @@ -324,18 +324,6 @@ ) departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING -/datum/design/tscanner - name = "T-Ray Scanner" - id = "tscanner" - build_type = AUTOLATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*1.5) - build_path = /obj/item/t_scanner - category = list( - RND_CATEGORY_INITIAL, - RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_ENGINEERING, - ) - departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING - /datum/design/requests_console name = "Requests Console Frame" id = "requests_console" diff --git a/code/modules/research/designs/autolathe/multi-department_designs.dm b/code/modules/research/designs/autolathe/multi-department_designs.dm index db619a48184dd..30787a1a0729d 100644 --- a/code/modules/research/designs/autolathe/multi-department_designs.dm +++ b/code/modules/research/designs/autolathe/multi-department_designs.dm @@ -32,6 +32,18 @@ RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_ENGINEERING, ) departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/tscanner + name = "T-Ray Scanner" + id = "tscanner" + build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.5) + build_path = /obj/item/t_scanner + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_ENGINEERING, + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SCIENCE /datum/design/rwd name = "Rapid Wiring Device" @@ -424,6 +436,18 @@ ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_SERVICE +/datum/design/digital_clock_frame + name = "Digital Clock Frame" + id = "digital_clock_frame" + build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*7, /datum/material/glass = SHEET_MATERIAL_AMOUNT*4) + build_path = /obj/item/wallframe/digital_clock + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MOUNTS, + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SERVICE + /datum/design/razor name = "Electric Razor" id = "razor" diff --git a/code/modules/research/designs/autolathe/security_designs.dm b/code/modules/research/designs/autolathe/security_designs.dm index 782b8e7ab4cb8..b3bc0d8101d0a 100644 --- a/code/modules/research/designs/autolathe/security_designs.dm +++ b/code/modules/research/designs/autolathe/security_designs.dm @@ -155,7 +155,7 @@ id = "riot_dart" build_type = AUTOLATHE materials = list(/datum/material/iron =HALF_SHEET_MATERIAL_AMOUNT) //Discount for making individually - no box = less iron! - build_path = /obj/item/ammo_casing/caseless/foam_dart/riot + build_path = /obj/item/ammo_casing/foam_dart/riot category = list( RND_CATEGORY_HACKED, RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, @@ -186,12 +186,12 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SECURITY -/datum/design/a762surplus - name = "7.62 Surplus Bullet Casing (VERY Lethal)" - id = "a762surplus" +/datum/design/strilka310_surplus + name = ".310 Surplus Bullet Casing (VERY Lethal)" + id = "strilka310_surplus" build_type = AUTOLATHE materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*2) - build_path = /obj/item/ammo_casing/a762/surplus + build_path = /obj/item/ammo_casing/strilka310/surplus category = list( RND_CATEGORY_HACKED, RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, diff --git a/code/modules/research/designs/autolathe/service_designs.dm b/code/modules/research/designs/autolathe/service_designs.dm index ea65fe3ef380e..687e85d64361b 100644 --- a/code/modules/research/designs/autolathe/service_designs.dm +++ b/code/modules/research/designs/autolathe/service_designs.dm @@ -142,6 +142,18 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SERVICE +/datum/design/tongs + name = "Tongs" + id = "tongs" + build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 2) + build_path = /obj/item/kitchen/tongs + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_KITCHEN, + ) + departmental_flags = DEPARTMENT_BITFLAG_SERVICE + /datum/design/tray name = "Serving Tray" id = "servingtray" diff --git a/code/modules/research/designs/biogenerator_designs.dm b/code/modules/research/designs/biogenerator_designs.dm index 9d3b442773e5c..14d5c12eb431c 100644 --- a/code/modules/research/designs/biogenerator_designs.dm +++ b/code/modules/research/designs/biogenerator_designs.dm @@ -3,7 +3,7 @@ /////////////////////////////////// /datum/design/milk - name = "Milk" + name = "Synthetic Milk" id = "milk" build_type = BIOGENERATOR materials = list(/datum/material/biomass = 0.4) @@ -11,7 +11,7 @@ category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_FOOD) /datum/design/soymilk - name = "Soy Milk" + name = "Synthetic Soy Milk" id = "soymilk" build_type = BIOGENERATOR materials = list(/datum/material/biomass = 0.4) @@ -19,7 +19,7 @@ category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_FOOD) /datum/design/ethanol - name = "Ethanol" + name = "Synthetic Ethanol" id = "ethanol" build_type = BIOGENERATOR materials = list(/datum/material/biomass = 0.6) @@ -27,7 +27,7 @@ category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_FOOD) /datum/design/cream - name = "Cream" + name = "Synthetic Cream" id = "cream" build_type = BIOGENERATOR materials = list(/datum/material/biomass = 0.6) @@ -35,7 +35,7 @@ category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_FOOD) /datum/design/black_pepper - name = "Black Pepper" + name = "Synthetic Black Pepper" id = "black_pepper" build_type = BIOGENERATOR materials = list(/datum/material/biomass = 0.6) @@ -43,7 +43,7 @@ category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_FOOD) /datum/design/enzyme - name = "Universal Enzyme" + name = "Synthetic Enzyme" id = "enzyme" build_type = BIOGENERATOR materials = list(/datum/material/biomass = 0.6) @@ -51,7 +51,7 @@ category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_FOOD) /datum/design/flour - name = "Flour" + name = "Synthetic Flour" id = "flour_sack" build_type = BIOGENERATOR materials = list(/datum/material/biomass = 0.6) @@ -59,7 +59,7 @@ category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_FOOD) /datum/design/sugar - name = "Sugar" + name = "Synthetic Sugar" id = "sugar" build_type = BIOGENERATOR materials = list(/datum/material/biomass = 0.6) @@ -70,7 +70,7 @@ name = "Monkey Cube" id = "mcube" build_type = BIOGENERATOR - materials = list(/datum/material/biomass =SMALL_MATERIAL_AMOUNT*0.5) + materials = list(/datum/material/biomass = 50) build_path = /obj/item/food/monkeycube category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_FOOD) @@ -185,3 +185,11 @@ materials = list(/datum/material/biomass = 1) build_path = /obj/item/rollingpaper category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_MATERIALS) + +/datum/design/candle + name = "Candle" + id = "candle" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 3) + build_path = /obj/item/flashlight/flare/candle + category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_MATERIALS) diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index 84c5a3ac80ab5..6db2a6bb24ec2 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -118,6 +118,16 @@ ) departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SECURITY //Honestly should have a bridge techfab for this sometime. +/datum/design/board/bankmachine + name = "Bank Machine Board" + desc = "Allows for the construction of circuit boards used to build a Bank Machine." + id = "bankmachine" + build_path = /obj/item/circuitboard/computer/bankmachine + category = list( + RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_COMMAND + ) + departmental_flags = DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SECURITY + /datum/design/board/crewconsole name = "Crew Monitoring Computer Board" desc = "Allows for the construction of circuit boards used to build a Crew monitoring computer." diff --git a/code/modules/research/designs/limbgrower_designs.dm b/code/modules/research/designs/limbgrower_designs.dm index 3c911a6567d25..ef8c762acd7f4 100644 --- a/code/modules/research/designs/limbgrower_designs.dm +++ b/code/modules/research/designs/limbgrower_designs.dm @@ -162,7 +162,7 @@ id = "plasmamanliver" build_type = LIMBGROWER reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10, /datum/reagent/toxin/plasma = 20) - build_path = /obj/item/organ/internal/liver/plasmaman + build_path = /obj/item/organ/internal/liver/bone/plasmaman category = list(SPECIES_PLASMAMAN) /datum/design/plasmaman_stomach diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 198aee66c95e8..0a2c96dddd598 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -51,6 +51,16 @@ ) departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING +/datum/design/board/mass_driver + name = "Mass Driver Board" + desc = "The circuit board for a mass driver." + id = "mass_driver" + build_path = /obj/item/circuitboard/machine/mass_driver + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + /datum/design/board/turbine_compressor name = "Turbine Compressor Board" desc = "The circuit board for a turbine compressor." @@ -348,16 +358,6 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE -/datum/design/board/bepis - name = "B.E.P.I.S. Board" - desc = "The circuit board for a B.E.P.I.S." - id = "bepis" - build_path = /obj/item/circuitboard/machine/bepis - category = list( - RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH - ) - departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_CARGO - /datum/design/board/protolathe name = "Protolathe Board" desc = "The circuit board for a protolathe." @@ -462,6 +462,16 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE +/datum/design/board/dnainfuser + name = "DNA Infuser Board" + desc = "The circuit board for a DNA Infuser." + id = "dnainfuser" + build_path = /obj/item/circuitboard/machine/dna_infuser + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_GENETICS + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + /datum/design/board/scan_console name = "DNA Console Board" desc = "Allows for the construction of circuit boards used to build a new DNA console." @@ -864,17 +874,6 @@ ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL -/datum/design/board/spaceship_navigation_beacon - name = "Bluespace Navigation Gigabeacon Board" - desc = "The circuit board for a Bluespace Navigation Gigabeacon." - id = "spaceship_navigation_beacon" - build_type = IMPRINTER - build_path = /obj/item/circuitboard/machine/spaceship_navigation_beacon - category = list( - RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_TELEPORT - ) - departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SCIENCE - /datum/design/board/medical_kiosk name = "Medical Kiosk Board" desc = "The circuit board for a Medical Kiosk." @@ -1097,3 +1096,13 @@ RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ROBOTICS ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design/board/fishing_portal_generator + name = "Fishing Portal Generator Board" + desc = "The circuit board for the fishing portal generator" + id = "fishing_portal_generator" + build_path = /obj/item/circuitboard/machine/fishing_portal_generator + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_SERVICE + ) + departmental_flags = DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE diff --git a/code/modules/research/designs/mecha_designs.dm b/code/modules/research/designs/mecha_designs.dm index b8e08996d93cc..c495bdc9e47b5 100644 --- a/code/modules/research/designs/mecha_designs.dm +++ b/code/modules/research/designs/mecha_designs.dm @@ -227,13 +227,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -251,13 +244,6 @@ build_path = /obj/item/mecha_ammo/scattershot materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*3) construction_time = 20 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -275,13 +261,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -299,13 +278,6 @@ build_path = /obj/item/mecha_ammo/incendiary materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*3) construction_time = 20 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -323,13 +295,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/ion materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10,/datum/material/silver=SHEET_MATERIAL_AMOUNT*3,/datum/material/uranium=SHEET_MATERIAL_AMOUNT) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -347,13 +312,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/tesla materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10,/datum/material/silver=SHEET_MATERIAL_AMOUNT*4) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -371,13 +329,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -395,13 +346,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -419,13 +363,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/disabler materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -443,13 +380,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*11,/datum/material/gold=SHEET_MATERIAL_AMOUNT*3,/datum/material/silver=SHEET_MATERIAL_AMOUNT*4) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -467,13 +397,6 @@ build_path = /obj/item/mecha_ammo/flashbang materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*2,/datum/material/gold=SMALL_MATERIAL_AMOUNT*5) construction_time = 20 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -491,13 +414,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/breaching materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*11,/datum/material/gold=SHEET_MATERIAL_AMOUNT*3,/datum/material/silver=SHEET_MATERIAL_AMOUNT*4) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -515,13 +431,6 @@ build_path = /obj/item/mecha_ammo/missiles_pep materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*4,/datum/material/gold=SMALL_MATERIAL_AMOUNT*5) construction_time = 20 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -539,13 +448,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/clusterbang materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10,/datum/material/gold=SHEET_MATERIAL_AMOUNT*5,/datum/material/uranium=SHEET_MATERIAL_AMOUNT*5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -563,13 +465,6 @@ build_path = /obj/item/mecha_ammo/clusterbang materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*3,/datum/material/gold=HALF_SHEET_MATERIAL_AMOUNT * 1.5,/datum/material/uranium=HALF_SHEET_MATERIAL_AMOUNT * 1.5) construction_time = 20 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -587,16 +482,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/wormhole_generator materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_ODYSSEUS, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MISC, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -617,16 +502,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/teleporter materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5,/datum/material/diamond=SHEET_MATERIAL_AMOUNT*5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_ODYSSEUS, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MISC, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -647,16 +522,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/rcd materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*15,/datum/material/gold=SHEET_MATERIAL_AMOUNT*10,/datum/material/plasma=SHEET_MATERIAL_AMOUNT*12.5,/datum/material/silver=SHEET_MATERIAL_AMOUNT*10) construction_time = 1200 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_ODYSSEUS, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MISC, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -677,16 +542,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/thrusters/gas materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*12.5,/datum/material/titanium=SHEET_MATERIAL_AMOUNT * 2.5,/datum/material/silver=SHEET_MATERIAL_AMOUNT*1.5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_ODYSSEUS, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MODULES, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -707,16 +562,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/gravcatapult materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_ODYSSEUS, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MISC, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -737,16 +582,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/repair_droid materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5,/datum/material/glass =SHEET_MATERIAL_AMOUNT * 2.5,/datum/material/gold=HALF_SHEET_MATERIAL_AMOUNT,/datum/material/silver=SHEET_MATERIAL_AMOUNT) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_ODYSSEUS, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MODULES, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -767,16 +602,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/armor/anticcw_armor_booster materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10,/datum/material/silver=SHEET_MATERIAL_AMOUNT * 2.5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_ODYSSEUS, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MODULES, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -797,16 +622,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10,/datum/material/gold=SHEET_MATERIAL_AMOUNT * 2.5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_ODYSSEUS, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MODULES, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -827,11 +642,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/drill/diamonddrill materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5,/datum/material/diamond=SHEET_MATERIAL_AMOUNT*3.25) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, @@ -847,15 +657,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*4, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/plasma =SHEET_MATERIAL_AMOUNT) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -875,15 +676,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/mecha_kineticgun materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*4, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -903,12 +695,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -925,12 +711,6 @@ build_path = /obj/item/mecha_ammo/lmg materials = list(/datum/material/iron= SHEET_MATERIAL_AMOUNT *2) construction_time = 20 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -947,10 +727,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/medical/sleeper materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/glass = SHEET_MATERIAL_AMOUNT*5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_ODYSSEUS - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MEDICAL, RND_CATEGORY_MECHFAB_ODYSSEUS + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT @@ -965,10 +741,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*1.5, /datum/material/glass =SHEET_MATERIAL_AMOUNT) construction_time = 200 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_ODYSSEUS - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MEDICAL, RND_CATEGORY_MECHFAB_ODYSSEUS + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT @@ -983,10 +755,6 @@ materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*7.5, /datum/material/glass = SHEET_MATERIAL_AMOUNT*4, /datum/material/plasma =SHEET_MATERIAL_AMOUNT*1.5, /datum/material/gold = SHEET_MATERIAL_AMOUNT*4, /datum/material/diamond =SHEET_MATERIAL_AMOUNT) construction_time = 250 build_path = /obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_ODYSSEUS - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MEDICAL, RND_CATEGORY_MECHFAB_ODYSSEUS + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 6bfaa526e11b0..8290be9b2ee0a 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -806,15 +806,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/drill materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -833,11 +824,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/mining_scanner materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT * 2.5,/datum/material/glass = SHEET_MATERIAL_AMOUNT *1.25) construction_time = 50 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -851,11 +837,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/extinguisher materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MISC, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -869,15 +850,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/generator materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5,/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT,/datum/material/silver=SHEET_MATERIAL_AMOUNT,/datum/material/plasma=SHEET_MATERIAL_AMOUNT * 2.5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MISC, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -896,10 +868,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/mousetrap_mortar materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10,/datum/material/bananium=SHEET_MATERIAL_AMOUNT * 2.5) construction_time = 300 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_HONK, RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT @@ -913,10 +881,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10,/datum/material/bananium=SHEET_MATERIAL_AMOUNT * 2.5) construction_time = 300 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_HONK, RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT @@ -930,10 +894,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/honker materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10,/datum/material/bananium=SHEET_MATERIAL_AMOUNT*5) construction_time = 500 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_HONK, RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT @@ -947,16 +907,48 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10,/datum/material/bananium=SHEET_MATERIAL_AMOUNT*3.75) construction_time = 400 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_HONK, RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE +/datum/design/mech_radio + name = "Mech Radio" + id = "mech_radio" + build_type = MECHFAB + build_path = /obj/item/mecha_parts/mecha_equipment/radio + materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*2.5) + construction_time = 100 + category = list( + RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, + RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/mech_air_tank + name = "Mech Air Tank" + id = "mech_air_tank" + build_type = MECHFAB + build_path = /obj/item/mecha_parts/mecha_equipment/air_tank + materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) + construction_time = 100 + category = list( + RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, + RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + ///////////////////////////////////////// //////////////Borg Upgrades////////////// ///////////////////////////////////////// @@ -1171,7 +1163,7 @@ ) /datum/design/borg_upgrade_silicon_knife - name = "Kitchen toolset" + name = "Kitchen Toolset" id = "borg_upgrade_silicon_knife" build_type = MECHFAB build_path = /obj/item/borg/upgrade/silicon_knife @@ -1181,8 +1173,19 @@ RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_SERVICE ) +/datum/design/borg_upgrade_drink_apparatus + name = "Drink Apparatus" + id = "borg_upgrade_drink_apparatus" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/drink_app + materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/glass = SHEET_MATERIAL_AMOUNT) + construction_time = 4 SECONDS + category = list( + RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_SERVICE + ) + /datum/design/borg_upgrade_service_apparatus - name = "Service apparatus" + name = "Service Apparatus" id = "borg_upgrade_service_apparatus" build_type = MECHFAB build_path = /obj/item/borg/upgrade/service_apparatus @@ -1192,6 +1195,17 @@ RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_SERVICE ) +/datum/design/borg_upgrade_service_cookbook + name = "Service Cookbook" + id = "borg_upgrade_service_cookbook" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/service_cookbook + materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*7.5, /datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT) + construction_time = 4 SECONDS + category = list( + RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_SERVICE + ) + /datum/design/borg_upgrade_expand name = "Expand Module" id = "borg_upgrade_expand" @@ -1312,15 +1326,6 @@ build_path =/obj/item/mecha_parts/mecha_tracking materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*5) construction_time = 50 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MISC, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -1339,15 +1344,6 @@ build_path = /obj/item/mecha_parts/mecha_tracking/ai_control materials = list(/datum/material/iron =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5, /datum/material/silver =SMALL_MATERIAL_AMOUNT * 2) construction_time = 50 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_CONTROL_INTERFACES, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_CONTROL_INTERFACES, @@ -1367,15 +1363,6 @@ build_path = /obj/item/mecha_parts/camera_kit materials = list(/datum/material/iron =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5, /datum/material/plasma =SMALL_MATERIAL_AMOUNT * 2, /datum/material/titanium =SMALL_MATERIAL_AMOUNT * 2) construction_time = 50 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_CONTROL_INTERFACES, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_CONTROL_INTERFACES, @@ -1537,6 +1524,18 @@ RND_CATEGORY_MODSUITS + RND_SUBCATEGORY_MODSUITS_MISC ) +/datum/design/modlink_scryer + name = "MODlink Scryer" + desc = "A neck-worn piece of gear that can call with another MODlink-compatible device." + id = "modlink_scryer" + build_type = MECHFAB + materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3) + construction_time = 5 SECONDS + build_path = /obj/item/clothing/neck/link_scryer + category = list( + RND_CATEGORY_MODSUITS + RND_SUBCATEGORY_MODSUITS_MISC + ) + //MODsuit modules /datum/design/module @@ -1897,6 +1896,19 @@ RND_CATEGORY_MODSUIT_MODULES + RND_SUBCATEGORY_MODSUIT_MODULES_MEDICAL ) +/datum/design/module/statusreadout + name = "Status Readout Module" + id = "mod_statusreadout" + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT * 3, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/titanium = SMALL_MATERIAL_AMOUNT * 2, + ) + build_path = /obj/item/mod/module/status_readout + category = list( + RND_CATEGORY_MODSUIT_MODULES + RND_SUBCATEGORY_MODSUIT_MODULES_MEDICAL + ) + /datum/design/module/patienttransport name = "Patient Transport Module" id = "mod_patienttransport" @@ -1925,6 +1937,33 @@ RND_CATEGORY_MODSUIT_MODULES + RND_SUBCATEGORY_MODSUIT_MODULES_SUPPLY ) +/datum/design/module/joint_torsion + name = "Joint Torsion Ratchet Module" + id = "mod_joint_torsion" + materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold = SMALL_MATERIAL_AMOUNT*2.5, /datum/material/titanium = SMALL_MATERIAL_AMOUNT) + build_path = /obj/item/mod/module/joint_torsion + category = list( + RND_CATEGORY_MODSUIT_MODULES + RND_SUBCATEGORY_MODSUITS_MISC + ) + +/datum/design/module/recycler + name = "Recycler Module" + id = "mod_recycler" + materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT, /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/plastic = SMALL_MATERIAL_AMOUNT*2) + build_path = /obj/item/mod/module/recycler + category = list( + RND_CATEGORY_MODSUIT_MODULES + RND_SUBCATEGORY_MODSUIT_MODULES_SERVICE + ) + +/datum/design/module/shooting_assistant + name = "Shooting Assistant Module" + id = "mod_shooting" + materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT, /datum/material/silver = SMALL_MATERIAL_AMOUNT*2, /datum/material/gold = SMALL_MATERIAL_AMOUNT, /datum/material/diamond = SMALL_MATERIAL_AMOUNT) + build_path = /obj/item/mod/module/shooting_assistant + category = list( + RND_CATEGORY_MODSUIT_MODULES + RND_SUBCATEGORY_MODSUIT_MODULES_SECURITY + ) + //MODsuit anomalock modules /datum/design/module/mod_antigrav name = "Anti-Gravity Module" diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 3b9d77f97dae0..285878e7f2647 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -335,36 +335,34 @@ ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL -///////////////////////////////////////// -//////////Cybernetic Implants//////////// -///////////////////////////////////////// - -/datum/design/cyberimp_welding - name = "Welding Shield Eyes" - desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision." - id = "ci-welding" - build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - construction_time = 40 - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*6, /datum/material/glass = SMALL_MATERIAL_AMOUNT*4) - build_path = /obj/item/organ/internal/eyes/robotic/shield +/datum/design/medical_bed + name = "Medical Bed" + desc = "A bed made of sterile materials ideal for use in the medical field. Patient assistance or joyriding, it'll do it all!" + id = "medicalbed" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/titanium = SHEET_MATERIAL_AMOUNT * 2.7, /datum/material/plastic = SHEET_MATERIAL_AMOUNT * 1.7) + build_path = /obj/structure/bed/medical category = list( - RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_MISC + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MEDICAL ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL -/datum/design/cyberimp_gloweyes - name = "Luminescent Eyes" - desc = "A pair of cybernetic eyes that can emit multicolored light" - id = "ci-gloweyes" - build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - construction_time = 40 - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*6, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT) - build_path = /obj/item/organ/internal/eyes/robotic/glow +/datum/design/emergency_bed + name = "Medical Bed (Emergency)" + desc = "A portable, foldable version of the medical bed. Perfect for paramedics or whenever you have mass casualties!" + id = "medicalbed_emergency" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/titanium = SHEET_MATERIAL_AMOUNT * 2.7, /datum/material/plastic = SHEET_MATERIAL_AMOUNT * 1.7, /datum/material/diamond = SMALL_MATERIAL_AMOUNT * 5, /datum/material/bluespace = SMALL_MATERIAL_AMOUNT * 5) + build_path = /obj/item/emergency_bed category = list( - RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_MISC + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MEDICAL ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL +///////////////////////////////////////// +//////////Cybernetic Implants//////////// +///////////////////////////////////////// + /datum/design/cyberimp_breather name = "Breathing Tube Implant" desc = "This simple implant adds an internals connector to your back, allowing you to use internals without a mask and protecting you from being choked." @@ -480,6 +478,11 @@ ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL +/datum/design/cyberimp_xray/moth + name = "Moth X-ray Eyes" + id = "ci-xray-moth" + build_path = /obj/item/organ/internal/eyes/robotic/xray/moth + /datum/design/cyberimp_thermals name = "Thermal Eyes" desc = "These cybernetic eyes will give you Thermal vision. Vertical slit pupil included." @@ -500,6 +503,11 @@ ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL +/datum/design/cyberimp_thermals/moth + name = "Moth Thermal Eyes" + id = "ci-thermals-moth" + build_path = /obj/item/organ/internal/eyes/robotic/thermals/moth + /datum/design/cyberimp_antidrop name = "Anti-Drop Implant" desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle." @@ -836,13 +844,51 @@ id = "cybernetic_ears_u" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 40 - materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5, /datum/material/silver =SMALL_MATERIAL_AMOUNT*5) + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT*5, + /datum/material/glass = SMALL_MATERIAL_AMOUNT*5, + /datum/material/silver = SMALL_MATERIAL_AMOUNT*5, + ) build_path = /obj/item/organ/internal/ears/cybernetic/upgraded category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_2 ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL +/datum/design/cybernetic_ears_whisper + name = "Whisper-sensitive Cybernetic Ears" + desc = "A pair of whisper-sensitive cybernetic ears." + id = "cybernetic_ears_whisper" + build_type = PROTOLATHE | AWAY_LATHE | MECHFAB + construction_time = 40 + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT*5, + /datum/material/glass = SMALL_MATERIAL_AMOUNT*5, + /datum/material/silver = SMALL_MATERIAL_AMOUNT*5, + ) + build_path = /obj/item/organ/internal/ears/cybernetic/whisper + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_3 + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + +/datum/design/cybernetic_ears_xray + name = "Wall-penetrating Cybernetic Ears" + desc = "A pair of wall-penetrating cybernetic ears." + id = "cybernetic_ears_xray" + build_type = PROTOLATHE | AWAY_LATHE | MECHFAB + construction_time = 40 + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT*5, + /datum/material/glass = SMALL_MATERIAL_AMOUNT*5, + /datum/material/silver = SMALL_MATERIAL_AMOUNT*5, + ) + build_path = /obj/item/organ/internal/ears/cybernetic/xray + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_3 + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + /datum/design/cybernetic_eyes name = "Basic Cybernetic Eyes" desc = "A basic pair of cybernetic eyes." @@ -856,6 +902,11 @@ ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL +/datum/design/cybernetic_eyes/moth + name = "Basic Cybernetic Moth Eyes" + id = "cybernetic_eyes_moth" + build_path = /obj/item/organ/internal/eyes/robotic/basic/moth + /datum/design/cybernetic_eyes/improved name = "Cybernetic Eyes" desc = "A pair of cybernetic eyes." @@ -866,6 +917,47 @@ ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL +/datum/design/cybernetic_eyes/improved/moth + name = "Cybernetic Moth Eyes" + id = "cybernetic_eyes_improved_moth" + build_path = /obj/item/organ/internal/eyes/robotic/moth + +/datum/design/cyberimp_welding + name = "Welding Shield Eyes" + desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision." + id = "ci-welding" + build_type = PROTOLATHE | AWAY_LATHE | MECHFAB + construction_time = 40 + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*6, /datum/material/glass = SMALL_MATERIAL_AMOUNT*4) + build_path = /obj/item/organ/internal/eyes/robotic/shield + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_3 + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + +/datum/design/cyberimp_welding/moth + name = "Welding Shield Moth Eyes" + id = "ci-welding-moth" + build_path = /obj/item/organ/internal/eyes/robotic/shield/moth + +/datum/design/cyberimp_gloweyes + name = "Luminescent Eyes" + desc = "A pair of cybernetic eyes that can emit multicolored light" + id = "ci-gloweyes" + build_type = PROTOLATHE | AWAY_LATHE | MECHFAB + construction_time = 40 + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*6, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT) + build_path = /obj/item/organ/internal/eyes/robotic/glow + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_3 + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + +/datum/design/cyberimp_gloweyes/moth + name = "Luminescent Moth Eyes" + id = "ci-gloweyes-moth" + build_path = /obj/item/organ/internal/eyes/robotic/glow/moth + ///////////////////// ///Surgery Designs/// ///////////////////// @@ -1021,3 +1113,17 @@ id = "surgery_wing_reconstruction" surgery = /datum/surgery/advanced/wing_reconstruction research_icon_state = "surgery_chest" + +/datum/design/surgery/advanced_plastic_surgery + name = "Advanced Plastic Surgery" + desc = "An advanced form of the plastic surgery, allowing oneself to remodel someone's face and voice based off a picture of someones face" + surgery = /datum/surgery/plastic_surgery/advanced + id = "surgery_advanced_plastic_surgery" + research_icon_state = "surgery_head" + +/datum/design/surgery/experimental_dissection + name = "Experimental Dissection" + desc = "An experimental surgical procedure that dissects bodies in exchange for research points at ancient R&D consoles." + id = "surgery_oldstation_dissection" + surgery = /datum/surgery/advanced/experimental_dissection + research_icon_state = "surgery_chest" diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index ef2844bb13266..3f4d4b8f8ec2a 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -1,7 +1,4 @@ - -///////////////////////////////////////// -/////////////////HUDs//////////////////// -///////////////////////////////////////// +// HUDs /datum/design/health_hud name = "Health Scanner HUD" @@ -90,9 +87,7 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE -///////////////////////////////////////// -//////////////////Misc/////////////////// -///////////////////////////////////////// +// Misc /datum/design/welding_goggles name = "Welding Goggles" @@ -501,9 +496,7 @@ ) departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SECURITY | DEPARTMENT_BITFLAG_SCIENCE -///////////////////////////////////////// -////////////Janitor Designs////////////// -///////////////////////////////////////// +// Janitor Designs /datum/design/advmop name = "Advanced Mop" @@ -627,9 +620,7 @@ departmental_flags = DEPARTMENT_BITFLAG_SERVICE -///////////////////////////////////////// -/////////////Hydroponics///////////////// -///////////////////////////////////////// +// Hydroponics /datum/design/adv_watering_can name = "Advanced Watering Can" @@ -642,9 +633,7 @@ build_path = /obj/item/reagent_containers/cup/watering_can/advanced departmental_flags = DEPARTMENT_BITFLAG_SERVICE -///////////////////////////////////////// -/////////////Holobarriers//////////////// -///////////////////////////////////////// +// Holobarriers /datum/design/holosign name = "Holographic Sign Projector" @@ -718,9 +707,7 @@ ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL -///////////////////////////////////////// -////////////////Armour/////////////////// -///////////////////////////////////////// +// Armour /datum/design/reactive_armour name = "Reactive Armour Shell" @@ -758,9 +745,7 @@ build_path = /obj/item/clothing/head/helmet/knight/greyscale category = list(RND_CATEGORY_IMPORTED) -///////////////////////////////////////// -/////////////Security//////////////////// -///////////////////////////////////////// +// Security /datum/design/seclite name = "Seclite" @@ -868,9 +853,7 @@ ) departmental_flags = ALL -///////////////////////////////////////// -/////////////////Tape//////////////////// -///////////////////////////////////////// +// Tape /datum/design/super_sticky_tape name = "Super Sticky Tape" @@ -905,9 +888,7 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SERVICE -///////////////////////////////////////// -////////////Tackle Gloves//////////////// -///////////////////////////////////////// +// Tackle Gloves /datum/design/tackle_dolphin name = "Dolphin Gloves" @@ -931,11 +912,7 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SECURITY - - -///////////////////////////////////////// -/////////Restaurant Equipment//////////// -///////////////////////////////////////// +// Restaurant Equipment /datum/design/holosign/restaurant name = "Restaurant Seating Projector" @@ -973,12 +950,11 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SERVICE -///////////////////////////////////////// -/////////Fishing Equipment/////////////// -///////////////////////////////////////// +// Fishing Equipment /datum/design/fishing_rod_tech name = "Advanced Fishing Rod" + desc = "A fishing rod with an embedded generator dispensing an infinite supply of fishing baits." id = "fishing_rod_tech" build_type = PROTOLATHE | AWAY_LATHE materials = list(/datum/material/uranium =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/plastic =SHEET_MATERIAL_AMOUNT) @@ -988,9 +964,31 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SERVICE -///////////////////////////////////////// -/////////Coffeemaker Stuff/////////////// -///////////////////////////////////////// +/datum/design/stabilized_hook + name = "Gyro-Stabilized Hook" + desc = "An advanced fishing hook that gives the user a tighter control on the fish when reeling in." + id = "stabilized_hook" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, /datum/material/titanium = SMALL_MATERIAL_AMOUNT * 2) + build_path = /obj/item/fishing_hook/stabilized + category = list( + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE + ) + departmental_flags = DEPARTMENT_BITFLAG_SERVICE + +/datum/design/fish_analyzer + name = "Fish Analyzer" + desc = "An analyzer used to monitor fish's status and traits with." + id = "fish_analyzer" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.5) + build_path = /obj/item/fish_analyzer + category = list( + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE + ) + departmental_flags = DEPARTMENT_BITFLAG_SERVICE + +// Coffeemaker Stuff /datum/design/coffeepot name = "Coffeepot" @@ -1035,3 +1033,33 @@ RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_KITCHEN ) departmental_flags = DEPARTMENT_BITFLAG_SERVICE + +/datum/design/radio_navigation_beacon + name = "Compact Radio Navigation Gigabeacon" + id = "gigabeacon" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT) + build_path = /obj/item/folded_navigation_gigabeacon + category = list( + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_ENGINEERING + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_CARGO + +// Experimental designs + +/datum/design/polymorph_belt + name = "Polymorphic Field Inverter" + id = "polymorph_belt" + desc = "This device can scan and store DNA from other life forms, and use it to transform its wearer. It requires a Bioscrambler Anomaly Core in order to function." + build_type = PROTOLATHE | AWAY_LATHE + build_path = /obj/item/polymorph_belt + materials = list( + /datum/material/silver = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/uranium = SHEET_MATERIAL_AMOUNT, + /datum/material/diamond = SHEET_MATERIAL_AMOUNT, + ) + category = list( + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SCIENCE + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE diff --git a/code/modules/research/designs/tool_designs.dm b/code/modules/research/designs/tool_designs.dm index 58a34d0fd26f5..304ed53790a68 100644 --- a/code/modules/research/designs/tool_designs.dm +++ b/code/modules/research/designs/tool_designs.dm @@ -88,7 +88,7 @@ /datum/design/rtd_loaded name = "Rapid Tiling Device" - desc = "A tool that can lay & destory floor tiles on the fly." + desc = "A tool that can lay & destroy floor tiles on the fly." id = "rtd_loaded" build_type = PROTOLATHE | AWAY_LATHE materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT * 15, /datum/material/glass =SHEET_MATERIAL_AMOUNT*1.25) @@ -133,6 +133,39 @@ ) departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING +/datum/design/rcd_upgrade/anti_interrupt + name = "RCD anti disruption designs upgrade" + desc = "Prevents interruption of RCD construction and deconstruction." + id = "rcd_upgrade_anti_interrupt" + build_type = PROTOLATHE + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.25, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT * 1.5, + /datum/material/titanium = SHEET_MATERIAL_AMOUNT, + ) + build_path = /obj/item/rcd_upgrade/anti_interrupt + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_ENGINEERING_ADVANCED + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design/rcd_upgrade/cooling + name = "RCD cooling upgrade" + desc = "Allows the RCD to more quickly perform multiple actions at once." + id = "rcd_upgrade_cooling" + build_type = PROTOLATHE + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, + ) + build_path = /obj/item/rcd_upgrade/cooling + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_ENGINEERING_ADVANCED + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + /datum/design/rcd_upgrade/furnishing name = "RCD furnishing upgrade" desc = "Adds the ability to furnish areas using the RCD." @@ -171,7 +204,7 @@ /datum/design/rld_mini name = "Mini Rapid Light Device (MRLD)" - desc = "A tool that can portable and standing lighting orbs and glowsticks." + desc = "A tool that can deploy portable and standing lighting orbs and glowsticks." id = "rld_mini" build_type = PROTOLATHE | AWAY_LATHE materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT*10, /datum/material/glass =SHEET_MATERIAL_AMOUNT*5, /datum/material/plastic =SHEET_MATERIAL_AMOUNT*4, /datum/material/gold =SHEET_MATERIAL_AMOUNT) diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index ace647f2df4f0..59cfd2643cec5 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -108,7 +108,9 @@ build_type = PROTOLATHE | AWAY_LATHE materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) build_path = /obj/item/ammo_box/magazine/wt550m9 - category = list("Ammo") + category = list( + RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO + ) departmental_flags = DEPARTMENT_BITFLAG_SECURITY /datum/design/mag_autorifle/ap_mag diff --git a/code/modules/research/designs/wiremod_designs.dm b/code/modules/research/designs/wiremod_designs.dm index 7e40b8e9f2b52..a3b4a9a88660a 100644 --- a/code/modules/research/designs/wiremod_designs.dm +++ b/code/modules/research/designs/wiremod_designs.dm @@ -276,6 +276,17 @@ id = "comp_list_remove" build_path = /obj/item/circuit_component/variable/list/listremove +/datum/design/component/assoc_list_set + name = "Associative List Set" + id = "comp_assoc_list_set" + build_path = /obj/item/circuit_component/variable/assoc_list/list_set + +/datum/design/component/assoc_list_remove + name = "Associative List Remove" + id = "comp_assoc_list_remove" + build_path = /obj/item/circuit_component/variable/assoc_list/list_remove + + /datum/design/component/list_clear name = "List Clear" id = "comp_list_clear" diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 257015344ef36..c4983ad6c814f 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -20,7 +20,7 @@ /obj/machinery/rnd/experimentor name = "\improper E.X.P.E.R.I-MENTOR" desc = "A \"replacement\" for the destructive analyzer with a slight tendency to catastrophically fail." - icon = 'icons/obj/machines/heavy_lathe.dmi' + icon = 'icons/obj/machines/experimentator.dmi' icon_state = "h_lathe" base_icon_state = "h_lathe" density = TRUE @@ -168,11 +168,12 @@ for(var/node_id in listin) var/datum/techweb_node/N = SSresearch.techweb_node_by_id(node_id) var/str = "[N.display_name]: [listin[N]] points." - if(SSresearch.science_tech.researched_nodes[N.id]) + var/datum/techweb/science_web = locate(/datum/techweb/science) in SSresearch.techwebs + if(science_web.researched_nodes[N.id]) res += str - else if(SSresearch.science_tech.boosted_nodes[N.id]) + else if(science_web.boosted_nodes[N.id]) boosted += str - if(SSresearch.science_tech.visible_nodes[N.id]) //JOY OF DISCOVERY! + if(science_web.visible_nodes[N.id]) //JOY OF DISCOVERY! output += str output += boosted + res dat += output @@ -639,18 +640,18 @@ to_chat(user, message) var/static/list/valid_animals = list( + /mob/living/basic/bear, + /mob/living/basic/bee, /mob/living/basic/butterfly, /mob/living/basic/carp, + /mob/living/basic/crab, /mob/living/basic/lizard, /mob/living/basic/mouse, /mob/living/basic/pet/dog/corgi, /mob/living/basic/pet/dog/pug, - /mob/living/simple_animal/crab, - /mob/living/simple_animal/hostile/bear, - /mob/living/simple_animal/hostile/bee, + /mob/living/basic/pet/fox, /mob/living/simple_animal/parrot/natural, /mob/living/simple_animal/pet/cat, - /mob/living/simple_animal/pet/fox, ) for(var/counter in 1 to rand(1, 25)) var/mobType = pick(valid_animals) diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index fd3c4d7178b6a..e5a426d3a1ef1 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -22,9 +22,6 @@ /// All designs in the techweb that can be fabricated by this machine, since the last update. var/list/datum/design/cached_designs - /// The department this fabricator is assigned to. - var/department_tag = "Unassigned" - /// What color is this machine's stripe? Leave null to not have a stripe. var/stripe_color = null @@ -37,7 +34,6 @@ cached_designs = list() materials = AddComponent( /datum/component/remote_materials, \ - "lathe", \ mapload, \ mat_container_flags = BREAKDOWN_FLAGS_LATHE, \ ) @@ -50,22 +46,22 @@ ) create_reagents(0, OPENCONTAINER) - if(stored_research) - update_designs() RefreshParts() update_icon(UPDATE_OVERLAYS) /obj/machinery/rnd/production/connect_techweb(datum/techweb/new_techweb) if(stored_research) UnregisterSignal(stored_research, list(COMSIG_TECHWEB_ADD_DESIGN, COMSIG_TECHWEB_REMOVE_DESIGN)) + return ..() +/obj/machinery/rnd/production/on_connected_techweb() . = ..() - RegisterSignals( stored_research, list(COMSIG_TECHWEB_ADD_DESIGN, COMSIG_TECHWEB_REMOVE_DESIGN), PROC_REF(on_techweb_update) ) + update_designs() /obj/machinery/rnd/production/Destroy() materials = null @@ -121,22 +117,25 @@ ui.open() /obj/machinery/rnd/production/ui_static_data(mob/user) - var/list/data = list() + var/list/data = materials.mat_container.ui_static_data() + var/list/designs = list() var/datum/asset/spritesheet/research_designs/spritesheet = get_asset_datum(/datum/asset/spritesheet/research_designs) var/size32x32 = "[spritesheet.name]32x32" - var/max_multiplier + var/max_multiplier = INFINITY var/coefficient for(var/datum/design/design in cached_designs) var/cost = list() - coefficient = efficient_with(design.build_path) ? efficiency_coeff : 1 - for(var/datum/material/material in design.materials) - cost[material.name] = design.materials[material] * coefficient - max_multiplier = min(50, round(materials.mat_container.get_material_amount(material) / (design.materials[material] * coefficient))) - var/icon_size = spritesheet.icon_size_id(design.id) + max_multiplier = INFINITY + coefficient = build_efficiency(design.build_path) + for(var/datum/material/mat in design.materials) + cost[mat.name] = OPTIMAL_COST(design.materials[mat] * coefficient) + max_multiplier = min(max_multiplier, 50, round(materials.mat_container.get_material_amount(mat) / cost[mat.name])) + + var/icon_size = spritesheet.icon_size_id(design.id) designs[design.id] = list( "name" = design.name, "desc" = design.get_description(), @@ -156,7 +155,7 @@ /obj/machinery/rnd/production/ui_data(mob/user) var/list/data = list() - data["materials"] = materials.mat_container?.ui_data() + data["materials"] = materials.mat_container.ui_data() data["onHold"] = materials.on_hold() data["busy"] = busy data["materialMaximum"] = materials.local_size @@ -175,13 +174,9 @@ switch (action) if("remove_mat") var/datum/material/material = locate(params["ref"]) - - if(!materials.can_hold_material(material)) - // I don't know who you are or what you want, but whatever it is, - // we don't have it. - return - - eject_sheets(material, params["amount"]) + var/amount = text2num(params["amount"]) + // SAFETY: eject_sheets checks for valid mats + materials.eject_sheets(material, amount) if("build") user_try_print_id(params["ref"], params["amount"]) @@ -201,7 +196,7 @@ var/total_storage = 0 for(var/datum/stock_part/matter_bin/bin in component_parts) - total_storage += bin.tier * 75000 + total_storage += bin.tier * (37.5*SHEET_MATERIAL_AMOUNT) materials.set_local_size(total_storage) @@ -218,14 +213,17 @@ return ..() -/obj/machinery/rnd/production/proc/do_print(path, amount, list/matlist) +/obj/machinery/rnd/production/proc/do_print(path, amount) for(var/i in 1 to amount) new path(get_turf(src)) SSblackbox.record_feedback("nested tally", "item_printed", amount, list("[type]", "[path]")) -/obj/machinery/rnd/production/proc/efficient_with(path) - return !ispath(path, /obj/item/stack/sheet) && !ispath(path, /obj/item/stack/ore/bluespace_crystal) +/obj/machinery/rnd/production/proc/build_efficiency(path) + if(ispath(path, /obj/item/stack/sheet) || ispath(path, /obj/item/stack/ore/bluespace_crystal)) + return 1 + else + return efficiency_coeff /obj/machinery/rnd/production/proc/user_try_print_id(design_id, print_quantity) if(!design_id) @@ -262,37 +260,29 @@ say("Mineral access is on hold, please contact the quartermaster.") return FALSE - var/power = active_power_usage - print_quantity = clamp(print_quantity, 1, 50) + var/coefficient = build_efficiency(design.build_path) - for(var/material in design.materials) - power += round(design.materials[material] * print_quantity / 35) - - power = min(active_power_usage, power) - use_power(power) - - var/coefficient = efficient_with(design.build_path) ? efficiency_coeff : 1 - var/list/efficient_mats = list() - - for(var/material in design.materials) - efficient_mats[material] = design.materials[material] * coefficient - - if(!materials.mat_container.has_materials(efficient_mats, print_quantity)) + //check if sufficient materials/reagents are available + if(!materials.mat_container.has_materials(design.materials, coefficient, print_quantity)) say("Not enough materials to complete prototype[print_quantity > 1? "s" : ""].") return FALSE - for(var/reagent in design.reagents_list) if(!reagents.has_reagent(reagent, design.reagents_list[reagent] * print_quantity * coefficient)) say("Not enough reagents to complete prototype[print_quantity > 1? "s" : ""].") return FALSE + //use power + var/power = active_power_usage + for(var/material in design.materials) + power += round(design.materials[material] * print_quantity / 35) + power = min(active_power_usage, power) + use_power(power) + // Charge the lathe tax at least once per ten items. var/total_cost = LATHE_TAX * max(round(print_quantity / 10), 1) - if(!charges_tax) total_cost = 0 - if(isliving(usr)) var/mob/living/user = usr var/obj/item/card/id/card = user.get_idcard(TRUE) @@ -304,57 +294,30 @@ var/datum/bank_account/our_acc = card.registered_account if(our_acc.account_job.departments_bitflags & allowed_department_flags) total_cost = 0 // We are not charging crew for printing their own supplies and equipment. - if(attempt_charge(src, usr, total_cost) & COMPONENT_OBJ_CANCEL_CHARGE) say("Insufficient funds to complete prototype. Please present a holochip or valid ID card.") return FALSE - if(iscyborg(usr)) var/mob/living/silicon/robot/borg = usr - if(!borg.cell) return FALSE - borg.cell.use(SILICON_LATHE_TAX) - materials.mat_container.use_materials(efficient_mats, print_quantity) - materials.silo_log(src, "built", -print_quantity, "[design.name]", efficient_mats) - + //consume materials + materials.use_materials(design.materials, coefficient, print_quantity, "built", "[design.name]") for(var/reagent in design.reagents_list) reagents.remove_reagent(reagent, design.reagents_list[reagent] * print_quantity * coefficient) - + //produce item busy = TRUE - if(production_animation) flick(production_animation, src) - var/time_coefficient = design.lathe_time_factor * efficiency_coeff - addtimer(CALLBACK(src, PROC_REF(reset_busy)), (30 * time_coefficient * print_quantity) ** 0.5) - addtimer(CALLBACK(src, PROC_REF(do_print), design.build_path, print_quantity, efficient_mats), (32 * time_coefficient * print_quantity) ** 0.8) + addtimer(CALLBACK(src, PROC_REF(do_print), design.build_path, print_quantity), (32 * time_coefficient * print_quantity) ** 0.8) + update_static_data_for_all_viewers() return TRUE -/obj/machinery/rnd/production/proc/eject_sheets(eject_sheet, eject_amt) - var/datum/component/material_container/mat_container = materials.mat_container - - if(!mat_container) - say("No access to material storage, please contact the quartermaster.") - return 0 - - if(materials.on_hold()) - say("Mineral access is on hold, please contact the quartermaster.") - return 0 - - var/count = mat_container.retrieve_sheets(text2num(eject_amt), eject_sheet, drop_location()) - - var/list/matlist = list() - matlist[eject_sheet] = SHEET_MATERIAL_AMOUNT * count - - materials.silo_log(src, "ejected", -count, "sheets", matlist) - - return count - // 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) . = ..() diff --git a/code/modules/research/machinery/departmental_circuit_imprinter.dm b/code/modules/research/machinery/departmental_circuit_imprinter.dm index 7277c41d9789f..2f5a606d8a2c8 100644 --- a/code/modules/research/machinery/departmental_circuit_imprinter.dm +++ b/code/modules/research/machinery/departmental_circuit_imprinter.dm @@ -8,5 +8,4 @@ name = "department circuit imprinter (Science)" circuit = /obj/item/circuitboard/machine/circuit_imprinter/department/science allowed_department_flags = DEPARTMENT_BITFLAG_SCIENCE - department_tag = "Science" payment_department = ACCOUNT_SCI diff --git a/code/modules/research/machinery/departmental_protolathe.dm b/code/modules/research/machinery/departmental_protolathe.dm index 61c7c6f97afed..dc0b882ef5176 100644 --- a/code/modules/research/machinery/departmental_protolathe.dm +++ b/code/modules/research/machinery/departmental_protolathe.dm @@ -7,7 +7,6 @@ /obj/machinery/rnd/production/protolathe/department/engineering name = "department protolathe (Engineering)" allowed_department_flags = DEPARTMENT_BITFLAG_ENGINEERING - department_tag = "Engineering" circuit = /obj/item/circuitboard/machine/protolathe/department/engineering stripe_color = "#EFB341" payment_department = ACCOUNT_ENG @@ -19,7 +18,6 @@ /obj/machinery/rnd/production/protolathe/department/service name = "department protolathe (Service)" allowed_department_flags = DEPARTMENT_BITFLAG_SERVICE - department_tag = "Service" circuit = /obj/item/circuitboard/machine/protolathe/department/service stripe_color = "#83ca41" payment_department = ACCOUNT_SRV @@ -27,7 +25,6 @@ /obj/machinery/rnd/production/protolathe/department/medical name = "department protolathe (Medical)" allowed_department_flags = DEPARTMENT_BITFLAG_MEDICAL - department_tag = "Medical" circuit = /obj/item/circuitboard/machine/protolathe/department/medical stripe_color = "#52B4E9" payment_department = ACCOUNT_MED @@ -35,7 +32,6 @@ /obj/machinery/rnd/production/protolathe/department/cargo name = "department protolathe (Cargo)" allowed_department_flags = DEPARTMENT_BITFLAG_CARGO - department_tag = "Cargo" circuit = /obj/item/circuitboard/machine/protolathe/department/cargo stripe_color = "#956929" payment_department = ACCOUNT_CAR @@ -43,7 +39,6 @@ /obj/machinery/rnd/production/protolathe/department/science name = "department protolathe (Science)" allowed_department_flags = DEPARTMENT_BITFLAG_SCIENCE - department_tag = "Science" circuit = /obj/item/circuitboard/machine/protolathe/department/science stripe_color = "#D381C9" payment_department = ACCOUNT_SCI @@ -51,7 +46,6 @@ /obj/machinery/rnd/production/protolathe/department/security name = "department protolathe (Security)" allowed_department_flags = DEPARTMENT_BITFLAG_SECURITY - department_tag = "Security" circuit = /obj/item/circuitboard/machine/protolathe/department/security stripe_color = "#DE3A3A" payment_department = ACCOUNT_SEC diff --git a/code/modules/research/machinery/departmental_techfab.dm b/code/modules/research/machinery/departmental_techfab.dm index 788803e3959e0..3819429a8b932 100644 --- a/code/modules/research/machinery/departmental_techfab.dm +++ b/code/modules/research/machinery/departmental_techfab.dm @@ -7,7 +7,6 @@ /obj/machinery/rnd/production/techfab/department/engineering name = "department techfab (Engineering)" allowed_department_flags = DEPARTMENT_BITFLAG_ENGINEERING - department_tag = "Engineering" circuit = /obj/item/circuitboard/machine/techfab/department/engineering stripe_color = "#EFB341" payment_department = ACCOUNT_ENG @@ -15,7 +14,6 @@ /obj/machinery/rnd/production/techfab/department/service name = "department techfab (Service)" allowed_department_flags = DEPARTMENT_BITFLAG_SERVICE - department_tag = "Service" circuit = /obj/item/circuitboard/machine/techfab/department/service stripe_color = "#83ca41" payment_department = ACCOUNT_SRV @@ -23,7 +21,6 @@ /obj/machinery/rnd/production/techfab/department/medical name = "department techfab (Medical)" allowed_department_flags = DEPARTMENT_BITFLAG_MEDICAL - department_tag = "Medical" circuit = /obj/item/circuitboard/machine/techfab/department/medical stripe_color = "#52B4E9" payment_department = ACCOUNT_MED @@ -31,7 +28,6 @@ /obj/machinery/rnd/production/techfab/department/cargo name = "department techfab (Cargo)" allowed_department_flags = DEPARTMENT_BITFLAG_CARGO - department_tag = "Cargo" circuit = /obj/item/circuitboard/machine/techfab/department/cargo stripe_color = "#956929" payment_department = ACCOUNT_CAR @@ -39,7 +35,6 @@ /obj/machinery/rnd/production/techfab/department/science name = "department techfab (Science)" allowed_department_flags = DEPARTMENT_BITFLAG_SCIENCE - department_tag = "Science" circuit = /obj/item/circuitboard/machine/techfab/department/science stripe_color = "#D381C9" payment_department = ACCOUNT_SCI @@ -47,7 +42,6 @@ /obj/machinery/rnd/production/techfab/department/security name = "department techfab (Security)" allowed_department_flags = DEPARTMENT_BITFLAG_SECURITY - department_tag = "Security" circuit = /obj/item/circuitboard/machine/techfab/department/security stripe_color = "#DE3A3A" payment_department = ACCOUNT_SEC diff --git a/code/modules/research/ordnance/tank_compressor.dm b/code/modules/research/ordnance/tank_compressor.dm index 44d1505b08656..85a2cf44836af 100644 --- a/code/modules/research/ordnance/tank_compressor.dm +++ b/code/modules/research/ordnance/tank_compressor.dm @@ -86,7 +86,7 @@ return TRUE /obj/machinery/atmospherics/components/binary/circulator/get_node_connects() - return list(turn(dir, 180), dir) // airs[2] is input which is facing dir, airs[1] is output which is facing the other side of dir + return list(REVERSE_DIR(dir), dir) // airs[2] is input which is facing dir, airs[1] is output which is facing the other side of dir /obj/machinery/atmospherics/components/binary/tank_compressor/screwdriver_act(mob/living/user, obj/item/tool) if(active || inserted_tank) @@ -263,7 +263,7 @@ /obj/machinery/atmospherics/components/binary/tank_compressor/update_overlays() . = ..() . += get_pipe_image(icon, "[base_icon_state]-pipe", dir, COLOR_VIBRANT_LIME, piping_layer) - . += get_pipe_image(icon, "[base_icon_state]-pipe", turn(dir, 180), COLOR_RED, piping_layer) + . += get_pipe_image(icon, "[base_icon_state]-pipe", REVERSE_DIR(dir), COLOR_RED, piping_layer) if(!istype(inserted_tank)) . += mutable_appearance(icon, "[base_icon_state]-doors",) if(panel_open) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 449a7078537cf..fdfcf9bf72da8 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -45,10 +45,10 @@ Nothing else in the console has ID requirements. return reagent.name return ID -/obj/machinery/computer/rdconsole/Initialize(mapload) +/obj/machinery/computer/rdconsole/LateInitialize() . = ..() if(!CONFIG_GET(flag/no_default_techweb_link) && !stored_research) - stored_research = SSresearch.science_tech + CONNECT_TO_RND_SERVER_ROUNDSTART(stored_research, src) if(stored_research) stored_research.consoles_accessing += src @@ -107,7 +107,7 @@ Nothing else in the console has ID requirements. var/list/price = TN.get_price(stored_research) if(stored_research.can_afford(price)) user.investigate_log("researched [id]([json_encode(price)]) on techweb id [stored_research.id].", INVESTIGATE_RESEARCH) - if(stored_research == SSresearch.science_tech) + if(istype(stored_research, /datum/techweb/science)) SSblackbox.record_feedback("associative", "science_techweb_unlock", 1, list("id" = "[id]", "name" = TN.display_name, "price" = "[json_encode(price)]", "time" = SQLtime())) if(stored_research.research_node_id(id)) say("Successfully researched [TN.display_name].") @@ -140,13 +140,15 @@ Nothing else in the console has ID requirements. say("Not enough research points...") return FALSE -/obj/machinery/computer/rdconsole/emag_act(mob/user) - if(!(obj_flags & EMAGGED)) - to_chat(user, span_notice("You disable the security protocols[locked? " and unlock the console":""].")) - playsound(src, SFX_SPARKS, 75, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - obj_flags |= EMAGGED - locked = FALSE - return ..() +/obj/machinery/computer/rdconsole/emag_act(mob/user, obj/item/card/emag/emag_card) + . = ..() + if (obj_flags & EMAGGED) + return + balloon_alert(user, "security protocols disabled") + playsound(src, SFX_SPARKS, 75, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + obj_flags |= EMAGGED + locked = FALSE + return TRUE /obj/machinery/computer/rdconsole/ui_interact(mob/user, datum/tgui/ui = null) . = ..() diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index 4deb1e9ec4693..3047c3e1a9ac1 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -19,10 +19,15 @@ busy = FALSE /obj/machinery/rnd/Initialize(mapload) + . = ..() + set_wires(new /datum/wires/rnd(src)) + +/obj/machinery/rnd/LateInitialize() . = ..() if(!CONFIG_GET(flag/no_default_techweb_link) && !stored_research) - connect_techweb(SSresearch.science_tech) - wires = new /datum/wires/rnd(src) + CONNECT_TO_RND_SERVER_ROUNDSTART(stored_research, src) + if(stored_research) + on_connected_techweb() /obj/machinery/rnd/Destroy() if(stored_research) @@ -31,10 +36,17 @@ QDEL_NULL(wires) return ..() +///Called when attempting to connect the machine to a techweb, forgetting the old. /obj/machinery/rnd/proc/connect_techweb(datum/techweb/new_techweb) if(stored_research) log_research("[src] disconnected from techweb [stored_research] when connected to [new_techweb].") stored_research = new_techweb + if(!isnull(stored_research)) + on_connected_techweb() + +///Called post-connection to a new techweb. +/obj/machinery/rnd/proc/on_connected_techweb() + SHOULD_CALL_PARENT(FALSE) /obj/machinery/rnd/proc/shock(mob/user, prb) if(machine_stat & (BROKEN|NOPOWER)) // unpowered, no shock diff --git a/code/modules/research/research_disk.dm b/code/modules/research/research_disk.dm index 8205fc230c42a..43fcd208fcbc2 100644 --- a/code/modules/research/research_disk.dm +++ b/code/modules/research/research_disk.dm @@ -19,5 +19,5 @@ custom_materials = null /obj/item/disk/tech_disk/debug/Initialize(mapload) - stored_research = SSresearch.admin_tech + stored_research = locate(/datum/techweb/admin) in SSresearch.techwebs return ..() diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index cb54716675e1e..45a0a520fa0d4 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -27,8 +27,14 @@ /obj/machinery/rnd/server/Initialize(mapload) . = ..() - if(CONFIG_GET(flag/no_default_techweb_link) && !stored_research) - stored_research = new /datum/techweb + //servers handle techwebs differently as we are expected to be there to connect + //every other machinery on-station. + if(!stored_research) + if(CONFIG_GET(flag/no_default_techweb_link)) + stored_research = new /datum/techweb + else + var/datum/techweb/science_web = locate(/datum/techweb/science) in SSresearch.techwebs + connect_techweb(science_web) stored_research.techweb_servers |= src name += " [num2hex(rand(1,65535), -1)]" //gives us a random four-digit hex number as part of the name. Y'know, for fluff. @@ -102,8 +108,8 @@ /obj/machinery/rnd/server/multitool_act(mob/living/user, obj/item/multitool/tool) if(!stored_research) return - tool.buffer = stored_research - to_chat(user, span_notice("Stored [src]'s techweb information in [tool].")) + tool.set_buffer(stored_research) + balloon_alert(user, "saved to multitool buffer") return TRUE /// Master R&D server. As long as this still exists and still holds the HDD for the theft objective, research points generate at normal speed. Destroy it or an antag steals the HDD? Half research speed. diff --git a/code/modules/research/server_control.dm b/code/modules/research/server_control.dm index 532f05ec96593..94a429dc6d717 100644 --- a/code/modules/research/server_control.dm +++ b/code/modules/research/server_control.dm @@ -9,10 +9,10 @@ ///Connected techweb node the server is connected to. var/datum/techweb/stored_research -/obj/machinery/computer/rdservercontrol/Initialize(mapload, obj/item/circuitboard/C) +/obj/machinery/computer/rdservercontrol/LateInitialize() . = ..() if(!CONFIG_GET(flag/no_default_techweb_link) && !stored_research) - stored_research = SSresearch.science_tech + CONNECT_TO_RND_SERVER_ROUNDSTART(stored_research, src) /obj/machinery/computer/rdservercontrol/multitool_act(mob/living/user, obj/item/multitool/tool) if(!QDELETED(tool.buffer) && istype(tool.buffer, /datum/techweb)) @@ -20,12 +20,13 @@ balloon_alert(user, "techweb connected") return TRUE -/obj/machinery/computer/rdservercontrol/emag_act(mob/user) +/obj/machinery/computer/rdservercontrol/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE obj_flags |= EMAGGED playsound(src, SFX_SPARKS, 75, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) balloon_alert(user, "console emagged") + return TRUE /obj/machinery/computer/rdservercontrol/ui_interact(mob/user, datum/tgui/ui) . = ..() diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index 1b64d6132976b..ee9a88b629d59 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -18,63 +18,49 @@ If you create T5+ please take a pass at mech_fabricator.dm. The parts being good . = ..() create_storage(storage_type = /datum/storage/rped) -// check to see if this rped have atleast one circuitboard -/obj/item/storage/part_replacer/proc/has_an_circuitboard() - for(var/obj/item/circuitboard/machine/board in contents) - return TRUE - return FALSE - /obj/item/storage/part_replacer/pre_attack(obj/attacked_object, mob/living/user, params) - if(!ismachinery(attacked_object) && !istype(attacked_object, /obj/structure/frame/machine)) - return ..() + . = ..() + if(.) + return - if(!user.Adjacent(attacked_object)) // no TK upgrading. - return ..() + if(!works_from_distance && !user.Adjacent(attacked_object)) + return - if(ismachinery(attacked_object)) + return part_replace_action(attacked_object, user) + +/obj/item/storage/part_replacer/proc/part_replace_action(obj/attacked_object, mob/living/user) + if(!ismachinery(attacked_object) && !istype(attacked_object, /obj/structure/frame/machine) && !istype(attacked_object, /obj/structure/frame/computer)) + return FALSE + + if(ismachinery(attacked_object) && !istype(attacked_object, /obj/machinery/computer)) var/obj/machinery/attacked_machinery = attacked_object if(!attacked_machinery.component_parts) - return ..() + return FALSE + attacked_machinery.exchange_parts(user, src) if(works_from_distance) user.Beam(attacked_machinery, icon_state = "rped_upgrade", time = 5) - attacked_machinery.exchange_parts(user, src) return TRUE - var/obj/structure/frame/machine/attacked_frame = attacked_object - // no point attacking the frame with the rped if the frame doesn't have wiring or it doesn't have components & rped has no circuitboard to offer as an component. - if(attacked_frame.state == 1 || (!attacked_frame.components && !has_an_circuitboard())) - return TRUE + var/obj/structure/frame/attacked_frame = attacked_object + if(istype(attacked_frame, /obj/structure/frame/machine)) + var/obj/structure/frame/machine/machine_frame = attacked_frame + if(attacked_frame.state == 1 || (!machine_frame.components && !(locate(/obj/item/circuitboard/machine) in contents))) + return FALSE + else + if(attacked_frame.state == 0 || (attacked_frame.state == 1 && !(locate(/obj/item/circuitboard/computer) in contents))) + return FALSE + attacked_frame.attackby(src, user) if(works_from_distance) user.Beam(attacked_frame, icon_state = "rped_upgrade", time = 5) return TRUE /obj/item/storage/part_replacer/afterattack(obj/attacked_object, mob/living/user, adjacent, params) - if(!ismachinery(attacked_object) && !istype(attacked_object, /obj/structure/frame/machine)) - return ..() - - if(ismachinery(attacked_object)) - var/obj/machinery/attacked_machinery = attacked_object - - if(!attacked_machinery.component_parts) - return ..() - - if(works_from_distance) - user.Beam(attacked_machinery, icon_state = "rped_upgrade", time = 5) - attacked_machinery.exchange_parts(user, src) - return - - var/obj/structure/frame/machine/attacked_frame = attacked_object - if(!adjacent && !works_from_distance) - return - // no point attacking the frame with the rped if the frame doesn't have wiring or it doesn't have components & rped has no circuitboard to offer as an component. - if(attacked_frame.state == 1 || (!attacked_frame.components && !has_an_circuitboard())) - return - attacked_frame.attackby(src, user) if(works_from_distance) - user.Beam(attacked_frame, icon_state = "rped_upgrade", time = 5) + part_replace_action(attacked_object, user) + return ..() /obj/item/storage/part_replacer/proc/play_rped_sound() //Plays the sound for RPED exhanging or installing parts. @@ -114,23 +100,21 @@ If you create T5+ please take a pass at mech_fabricator.dm. The parts being good */ /obj/item/storage/part_replacer/bluespace/proc/on_part_entered(datum/source, obj/item/inserted_component) SIGNAL_HANDLER + + if(istype(inserted_component, /obj/item/stock_parts/cell)) + var/obj/item/stock_parts/cell/inserted_cell = inserted_component + if(inserted_cell.rigged || inserted_cell.corrupted) + message_admins("[ADMIN_LOOKUPFLW(usr)] has inserted rigged/corrupted [inserted_cell] into [src].") + usr.log_message("has inserted rigged/corrupted [inserted_cell] into [src].", LOG_GAME) + usr.log_message("inserted rigged/corrupted [inserted_cell] into [src]", LOG_ATTACK) + return + if(inserted_component.reagents) if(length(inserted_component.reagents.reagent_list)) inserted_component.reagents.clear_reagents() to_chat(usr, span_notice("[src] churns as [inserted_component] has its reagents emptied into bluespace.")) RegisterSignal(inserted_component.reagents, COMSIG_REAGENTS_PRE_ADD_REAGENT, PROC_REF(on_insered_component_reagent_pre_add)) - - if(!istype(inserted_component, /obj/item/stock_parts/cell)) - return - - var/obj/item/stock_parts/cell/inserted_cell = inserted_component - - if(inserted_cell.rigged || inserted_cell.corrupted) - message_admins("[ADMIN_LOOKUPFLW(usr)] has inserted rigged/corrupted [inserted_cell] into [src].") - usr.log_message("has inserted rigged/corrupted [inserted_cell] into [src].", LOG_GAME) - usr.log_message("inserted rigged/corrupted [inserted_cell] into [src]", LOG_ATTACK) - /** * Signal handler for when the reagents datum of an inserted part has reagents added to it. * @@ -240,12 +224,14 @@ If you create T5+ please take a pass at mech_fabricator.dm. The parts being good /obj/item/stock_parts name = "stock part" desc = "What?" - icon = 'icons/obj/stock_parts.dmi' + icon = 'icons/obj/assemblies/stock_parts.dmi' w_class = WEIGHT_CLASS_SMALL var/rating = 1 ///Used when a base part has a different name to higher tiers of part. For example, machine frames want any servo and not just a micro-servo. var/base_name var/energy_rating = 1 + ///The generic category type that the stock part belongs to. Generic objects that should not be instantiated should have the same type and abstract_type + var/abstract_type = /obj/item/stock_parts /obj/item/stock_parts/Initialize(mapload) . = ..() @@ -416,6 +402,11 @@ If you create T5+ please take a pass at mech_fabricator.dm. The parts being good // Subspace stock parts +/obj/item/stock_parts/subspace + name = "subspace stock part" + desc = "What?" + abstract_type = /obj/item/stock_parts/subspace + /obj/item/stock_parts/subspace/ansible name = "subspace ansible" icon_state = "subspace_ansible" @@ -474,6 +465,6 @@ If you create T5+ please take a pass at mech_fabricator.dm. The parts being good /obj/item/research//Makes testing much less of a pain -Sieve name = "research" - icon = 'icons/obj/stock_parts.dmi' + icon = 'icons/obj/assemblies/stock_parts.dmi' icon_state = "capacitor" desc = "A debug item for research." diff --git a/code/modules/research/techweb/_techweb.dm b/code/modules/research/techweb/_techweb.dm index 1ffae0a48dd47..8a06607ec59a8 100644 --- a/code/modules/research/techweb/_techweb.dm +++ b/code/modules/research/techweb/_techweb.dm @@ -216,7 +216,8 @@ else researched_designs[design.id] = TRUE - hidden_nodes -= design.id + for(var/list/datum/techweb_node/unlocked_nodes as anything in design.unlocked_by) + hidden_nodes -= unlocked_nodes return TRUE @@ -282,7 +283,7 @@ var/datum/experiment/experiment = completed_experiment if (experiment == experiment_type) return FALSE - available_experiments += new experiment_type() + available_experiments += new experiment_type(src) /** * Adds a list of experiments to this techweb by their types, ensures that no duplicates are added. @@ -309,13 +310,21 @@ var/refund = skipped_experiment_types[completed_experiment.type] || 0 if(refund > 0) add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = refund)) - result_text += ", refunding [refund] points." + result_text += ", refunding [refund] points" // Nothing more to gain here, but we keep it in the list to prevent double dipping skipped_experiment_types[completed_experiment.type] = -1 - else - result_text += "!" - - log_research("[completed_experiment.name] ([completed_experiment.type]) has been completed on techweb [id]/[organization][refund ? ", refunding [refund] points" : ""].") + var/points_rewarded + if(completed_experiment.points_reward) + add_point_list(completed_experiment.points_reward) + points_rewarded = ",[refund > 0 ? " and" : ""] rewarding " + var/list/english_list_keys = list() + for(var/points_type in completed_experiment.points_reward) + english_list_keys += "[completed_experiment.points_reward[points_type]] [points_type]" + points_rewarded += "[english_list(english_list_keys)] points" + result_text += points_rewarded + result_text += "!" + + log_research("[completed_experiment.name] ([completed_experiment.type]) has been completed on techweb [id]/[organization][refund ? ", refunding [refund] points" : ""][points_rewarded].") return result_text /datum/techweb/proc/printout_points() diff --git a/code/modules/research/techweb/_techweb_node.dm b/code/modules/research/techweb/_techweb_node.dm index 6ab7d68beba93..ae50ea7f65f9e 100644 --- a/code/modules/research/techweb/_techweb_node.dm +++ b/code/modules/research/techweb/_techweb_node.dm @@ -16,7 +16,7 @@ var/description = "Why are you seeing this?" /// Whether it starts off hidden var/hidden = FALSE - /// If the tech can be randomly generated by the BEPIS as a reward. MEant to be fully given in tech disks, not researched + /// If the tech can be randomly generated by BEPIS tech as a reward. Meant to be fully given in tech disks, not researched var/experimental = FALSE /// Whether it's available without any research var/starting_node = FALSE @@ -88,11 +88,12 @@ if(actual_costs[booster]) var/delta = max(0, actual_costs[booster] - 250) actual_costs[booster] -= min(boostlist[booster], delta) - + return actual_costs /datum/techweb_node/proc/price_display(datum/techweb/TN) return techweb_point_display_generic(get_price(TN)) -/datum/techweb_node/proc/on_research() //new proc, not currently in file - return +///Proc called when the Station (Science techweb specific) researches a node. +/datum/techweb_node/proc/on_station_research() + SHOULD_CALL_PARENT(FALSE) diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 82baf4d2b8163..7852bdb367e56 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -14,7 +14,6 @@ "basic_matter_bin", "basic_micro_laser", "basic_scanning", - "bepis", "blast", "bounced_radio", "bowl", @@ -50,6 +49,7 @@ "extinguisher", "fax", "fishing_rod", + "fishing_portal_generator", "flashlight", "fluid_ducts", "foam_dart", @@ -89,7 +89,6 @@ "rdconsole", "rdserver", "rdservercontrol", - "receiver", "recorder", "rglass", "roll", @@ -116,6 +115,7 @@ "titaniumglass", "toner_large", "toner", + "tongs", "toy_armblade", "toy_balloon", "toygun", @@ -165,7 +165,6 @@ display_name = "Mechanical Exosuits" description = "Mechanized exosuits that are several magnitudes stronger and more powerful than the average human." design_ids = list( - "mech_hydraulic_clamp", "mech_recharger", "mecha_tracking", "mechacontrol", @@ -179,6 +178,10 @@ "ripley_right_leg", "ripley_torso", "ripleyupgrade", + "mech_hydraulic_clamp", + "mech_radio", + "mech_air_tank", + "mech_thrusters", ) /datum/techweb_node/mod_basic @@ -266,7 +269,9 @@ "bonesetter", "cautery", "circular_saw", + "cybernetic_ears", "cybernetic_eyes", + "cybernetic_eyes_moth", "cybernetic_heart", "cybernetic_liver", "cybernetic_lungs", @@ -275,6 +280,7 @@ "dropper", "hemostat", "large_beaker", + "medicalbed", "mmi_m", "operating", "petri_dish", @@ -304,6 +310,8 @@ "comp_access_checker", "comp_arithmetic", "comp_assoc_list_pick", + "comp_assoc_list_remove", + "comp_assoc_list_set", "comp_binary_convert", "comp_clock", "comp_comparison", @@ -402,7 +410,7 @@ "soda_dispenser", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - required_experiments = list(/datum/experiment/dissection/human) + required_experiments = list(/datum/experiment/autopsy/human) /datum/techweb_node/adv_biotech id = "adv_biotech" @@ -424,7 +432,7 @@ "smoke_machine", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) - required_experiments = list(/datum/experiment/dissection/nonhuman) + required_experiments = list(/datum/experiment/autopsy/nonhuman) discount_experiments = list(/datum/experiment/scanning/random/material/meat = 4000) /datum/techweb_node/xenoorgan_biotech @@ -442,7 +450,18 @@ discount_experiments = list( /datum/experiment/scanning/random/cytology/easy = 1000, /datum/experiment/scanning/points/slime/hard = 5000, - /datum/experiment/dissection/xenomorph = 5000, + /datum/experiment/autopsy/xenomorph = 5000, + ) + +/datum/techweb_node/morphological_theory + id = "morphological_theory" + display_name = "Anomalous Morphology" + description = "Use poorly understood energies to change your body." + prereq_ids = list("adv_biotech", "anomaly_research") + design_ids = list("polymorph_belt") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + discount_experiments = list( + /datum/experiment/scanning/people/novel_organs = 5000, ) /datum/techweb_node/bio_process @@ -481,6 +500,16 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) +/datum/techweb_node/oldstation_surgery + id = "oldstation_surgery" + display_name = "Experimental Dissection" + description = "Grants access to experimental dissections, which allows generation of research points." + design_ids = list( + "surgery_oldstation_dissection", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 500) + hidden = TRUE + show_on_wiki = FALSE /datum/techweb_node/adv_surgery id = "adv_surgery" @@ -568,6 +597,7 @@ "emergency_oxygen_engi", "emergency_oxygen", "emitter", + "mass_driver", "firealarm_electronics", "firelock_board", "generic_tank", @@ -714,6 +744,7 @@ design_ids = list( "bluespace_matter_bin", "bluespacebodybag", + "medicalbed_emergency", "femto_servo", "quantum_keycard", "swapper", @@ -765,16 +796,6 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000) discount_experiments = list(/datum/experiment/scanning/points/machinery_pinpoint_scan/tier3_cells = 3000) -/datum/techweb_node/regulated_bluespace - id = "regulated_bluespace" - display_name = "Regulated Bluespace Research" - description = "Bluespace technology using stable and balanced procedures. Required by galactic convention for public use." - prereq_ids = list("base") - design_ids = list( - "spaceship_navigation_beacon", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - /datum/techweb_node/unregulated_bluespace id = "unregulated_bluespace" display_name = "Unregulated Bluespace Research" @@ -960,6 +981,8 @@ "borg_upgrade_condiment_synthesizer", "borg_upgrade_silicon_knife", "borg_upgrade_service_apparatus", + "borg_upgrade_drink_apparatus", + "borg_upgrade_service_cookbook", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) @@ -1140,6 +1163,7 @@ "cargo", "cargorequest", "comconsole", + "bankmachine", "crewconsole", "idcard", "libraryconsole", @@ -1198,6 +1222,8 @@ design_ids = list( "comm_monitor", "comm_server", + "gigabeacon", + "message_monitor", "ntnet_relay", "s_amplifier", "s_analyzer", @@ -1252,6 +1278,7 @@ prereq_ids = list("biotech") design_ids = list( "dna_disk", + "dnainfuser", "dnascanner", "scan_console", ) @@ -1291,8 +1318,9 @@ description = "We have the technology to rebuild him." prereq_ids = list("biotech") design_ids = list( - "cybernetic_ears", + "cybernetic_ears_u", "cybernetic_eyes_improved", + "cybernetic_eyes_improved_moth", "cybernetic_heart_tier2", "cybernetic_liver_tier2", "cybernetic_lungs_tier2", @@ -1311,7 +1339,12 @@ description = "We have the technology to upgrade him." prereq_ids = list("adv_biotech", "cyber_organs") design_ids = list( - "cybernetic_ears_u", + "cybernetic_ears_whisper", + "cybernetic_ears_xray", + "ci-gloweyes", + "ci-welding", + "ci-gloweyes-moth", + "ci-welding-moth", "cybernetic_heart_tier3", "cybernetic_liver_tier3", "cybernetic_lungs_tier3", @@ -1332,11 +1365,9 @@ design_ids = list( "ci-breather", "ci-diaghud", - "ci-gloweyes", "ci-medhud", "ci-nutriment", "ci-sechud", - "ci-welding", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) @@ -1374,6 +1405,8 @@ "ci-thermals", "ci-thrusters", "ci-xray", + "ci-thermals-moth", + "ci-xray-moth", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) @@ -1459,6 +1492,19 @@ required_experiments = list(/datum/experiment/scanning/random/plants/wild) discount_experiments = list(/datum/experiment/scanning/random/plants/traits = 3000) +/datum/techweb_node/fishing + id = "fishing" + display_name = "Fishing Technology" + description = "Cutting edge fishing advancements." + prereq_ids = list("base") + design_ids = list( + "fishing_rod_tech", + "stabilized_hook", + "fish_analyzer", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) + required_experiments = list(/datum/experiment/scanning/fish) + /datum/techweb_node/exp_tools id = "exp_tools" display_name = "Experimental Tools" @@ -1498,6 +1544,8 @@ description = "Unlocks new designs that improve rapid devices." prereq_ids = list("adv_engi") design_ids = list( + "rcd_upgrade_anti_interrupt", + "rcd_upgrade_cooling", "rcd_upgrade_frames", "rcd_upgrade_furnishing", "rcd_upgrade_simple_circuits", @@ -1633,6 +1681,7 @@ "mod_clamp", "mod_drill", "mod_orebag", + "modlink_scryer", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) @@ -1666,6 +1715,12 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500) +/datum/techweb_node/mod_advanced_engineering/New() + if(HAS_TRAIT(SSstation, STATION_TRAIT_RADIOACTIVE_NEBULA)) //we'll really need the rad protection modsuit module + starting_node = TRUE + + return ..() + /datum/techweb_node/mod_medical id = "mod_medical" display_name = "Medical Modular Suits" @@ -1692,6 +1747,7 @@ "mod_defib", "mod_threadripper", "mod_surgicalprocessor", + "mod_statusreadout", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500) @@ -1884,7 +1940,6 @@ prereq_ids = list("adv_mecha") design_ids = list( "mech_rcd", - "mech_thrusters", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) @@ -2066,6 +2121,7 @@ description = "Things used by the greys." prereq_ids = list("biotech","engineering") boost_item_paths = list( + /obj/item/stack/sheet/mineral/abductor, /obj/item/abductor, /obj/item/cautery/alien, /obj/item/circuitboard/machine/abductor, @@ -2090,8 +2146,8 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) hidden = TRUE -/datum/techweb_node/alientech/on_research() //Unlocks the Zeta shuttle for purchase - SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_ALIENTECH] = TRUE +/datum/techweb_node/alientech/on_station_research() + SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_ALIENTECH] = TRUE /datum/techweb_node/alien_bio id = "alien_bio" @@ -2301,22 +2357,25 @@ /datum/techweb_node/mod_experimental id = "mod_experimental" display_name = "Experimental Modular Suits" - description = "Applications of experimentality when creating MODsuits has created these..." + description = "Applications of experimentality when creating MODsuits have created these..." prereq_ids = list("base") design_ids = list( "mod_disposal", + "mod_joint_torsion", + "mod_recycler", + "mod_shooting", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) hidden = TRUE experimental = TRUE -/datum/techweb_node/fishing - id = "fishing" - display_name = "Fishing Technology" - description = "Cutting edge fishing advancements." +/datum/techweb_node/advanced_plastic_surgery + id = "plastic_surgery" + display_name = "Advanced Plastic Surgery" + description = "A Procedure long lost due to licensing problems now once again available." prereq_ids = list("base") design_ids = list( - "fishing_rod_tech" + "surgery_advanced_plastic_surgery" ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) hidden = TRUE diff --git a/code/modules/research/techweb/techweb_types.dm b/code/modules/research/techweb/techweb_types.dm index 1f22679362476..c01b1226a4c13 100644 --- a/code/modules/research/techweb/techweb_types.dm +++ b/code/modules/research/techweb/techweb_types.dm @@ -6,18 +6,26 @@ organization = "Nanotrasen" should_generate_points = TRUE -//When something is researched, triggers the proc for this techweb only /datum/techweb/science/research_node(datum/techweb_node/node, force = FALSE, auto_adjust_cost = TRUE, get_that_dosh = TRUE) . = ..() if(.) - node.on_research() + node.on_station_research() + +/datum/techweb/oldstation + id = "CHARLIE" + organization = "Nanotrasen" + should_generate_points = TRUE + +/datum/techweb/oldstation/New() + . = ..() + research_node_id("oldstation_surgery", TRUE, TRUE, FALSE) /** * Admin techweb that has everything unlocked by default */ /datum/techweb/admin id = "ADMIN" - organization = "CentCom" + organization = "Central Command" /datum/techweb/admin/New() . = ..() diff --git a/code/modules/research/xenobiology/crossbreeding/__corecross.dm b/code/modules/research/xenobiology/crossbreeding/__corecross.dm index b682bed7cdfa3..b83a0a5b7f418 100644 --- a/code/modules/research/xenobiology/crossbreeding/__corecross.dm +++ b/code/modules/research/xenobiology/crossbreeding/__corecross.dm @@ -27,7 +27,7 @@ To add a crossbreed: /obj/item/slimecross //The base type for crossbred extracts. Mostly here for posterity, and to set base case things. name = "crossbred slime extract" desc = "An extremely potent slime extract, formed through crossbreeding." - icon = 'icons/obj/xenobiology/slimecrossing.dmi' + icon = 'icons/obj/science/slimecrossing.dmi' icon_state = "base" var/colour = "null" var/effect = "null" @@ -48,52 +48,52 @@ To add a crossbreed: name = effect + " " + colour + " extract" var/itemcolor = "#FFFFFF" switch(colour) - if("orange") + if(SLIME_TYPE_ORANGE) itemcolor = "#FFA500" - if("purple") + if(SLIME_TYPE_PURPLE) itemcolor = "#B19CD9" - if("blue") + if(SLIME_TYPE_BLUE) itemcolor = "#ADD8E6" - if("metal") + if(SLIME_TYPE_METAL) itemcolor = "#7E7E7E" - if("yellow") + if(SLIME_TYPE_YELLOW) itemcolor = "#FFFF00" - if("dark purple") + if(SLIME_TYPE_DARK_PURPLE) itemcolor = "#551A8B" - if("dark blue") + if(SLIME_TYPE_DARK_BLUE) itemcolor = "#0000FF" - if("silver") + if(SLIME_TYPE_SILVER) itemcolor = "#D3D3D3" - if("bluespace") + if(SLIME_TYPE_BLUESPACE) itemcolor = "#32CD32" - if("sepia") + if(SLIME_TYPE_SEPIA) itemcolor = "#704214" - if("cerulean") + if(SLIME_TYPE_CERULEAN) itemcolor = "#2956B2" - if("pyrite") + if(SLIME_TYPE_PYRITE) itemcolor = "#FAFAD2" - if("red") + if(SLIME_TYPE_RED) itemcolor = "#FF0000" - if("green") + if(SLIME_TYPE_GREEN) itemcolor = "#00FF00" - if("pink") + if(SLIME_TYPE_PINK) itemcolor = "#FF69B4" - if("gold") + if(SLIME_TYPE_GOLD) itemcolor = "#FFD700" - if("oil") + if(SLIME_TYPE_OIL) itemcolor = "#505050" - if("black") + if(SLIME_TYPE_BLACK) itemcolor = "#000000" - if("light pink") + if(SLIME_TYPE_LIGHT_PINK) itemcolor = "#FFB6C1" - if("adamantine") + if(SLIME_TYPE_ADAMANTINE) itemcolor = "#008B8B" add_atom_colour(itemcolor, FIXED_COLOUR_PRIORITY) /obj/item/slimecrossbeaker //To be used as a result for extract reactions that make chemicals. name = "result extract" desc = "You shouldn't see this." - icon = 'icons/obj/xenobiology/slimecrossing.dmi' + icon = 'icons/obj/science/slimecrossing.dmi' icon_state = "base" var/del_on_empty = TRUE var/list/list_reagents @@ -152,7 +152,7 @@ To add a crossbreed: to_chat(user, span_warning("This can only be used on yourself.")) return if(reagents.total_volume && (ignore_flags || M.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE))) - reagents.trans_to(M, reagents.total_volume, transfered_by = user) + reagents.trans_to(M, reagents.total_volume, transferred_by = user) if(user != M) to_chat(M, span_warning("[user] presses [src] against you!")) to_chat(user, span_notice("You press [src] against [M], injecting [M.p_them()].")) diff --git a/code/modules/research/xenobiology/crossbreeding/_clothing.dm b/code/modules/research/xenobiology/crossbreeding/_clothing.dm index c1c522b584940..5eac20667cc6c 100644 --- a/code/modules/research/xenobiology/crossbreeding/_clothing.dm +++ b/code/modules/research/xenobiology/crossbreeding/_clothing.dm @@ -34,7 +34,7 @@ Slimecrossing Armor /obj/item/clothing/glasses/prism_glasses name = "prism glasses" desc = "The lenses seem to glow slightly, and reflect light into dazzling colors." - icon = 'icons/obj/xenobiology/slimecrossing.dmi' + icon = 'icons/obj/science/slimecrossing.dmi' icon_state = "prismglasses" actions_types = list(/datum/action/item_action/change_prism_colour, /datum/action/item_action/place_light_prism) var/glasses_color = "#FFFFFF" @@ -46,7 +46,7 @@ Slimecrossing Armor /obj/structure/light_prism name = "light prism" desc = "A shining crystal of semi-solid light. Looks fragile." - icon = 'icons/obj/xenobiology/slimecrossing.dmi' + icon = 'icons/obj/science/slimecrossing.dmi' icon_state = "lightprism" density = FALSE anchored = TRUE @@ -54,8 +54,9 @@ Slimecrossing Armor /obj/structure/light_prism/Initialize(mapload, newcolor) . = ..() - color = newcolor - set_light_color(newcolor) + if(newcolor) + color = newcolor + set_light_color(newcolor) set_light(5) /obj/structure/light_prism/attack_hand(mob/user, list/modifiers) @@ -64,7 +65,7 @@ Slimecrossing Armor /datum/action/item_action/change_prism_colour name = "Adjust Prismatic Lens" - button_icon = 'icons/obj/xenobiology/slimecrossing.dmi' + button_icon = 'icons/obj/science/slimecrossing.dmi' button_icon_state = "prismcolor" /datum/action/item_action/change_prism_colour/Trigger(trigger_flags) @@ -78,7 +79,7 @@ Slimecrossing Armor /datum/action/item_action/place_light_prism name = "Fabricate Light Prism" - button_icon = 'icons/obj/xenobiology/slimecrossing.dmi' + button_icon = 'icons/obj/science/slimecrossing.dmi' button_icon_state = "lightprism" /datum/action/item_action/place_light_prism/Trigger(trigger_flags) @@ -98,7 +99,7 @@ Slimecrossing Armor /obj/item/clothing/head/peaceflower name = "heroine bud" desc = "An extremely addictive flower, full of peace magic." - icon = 'icons/obj/xenobiology/slimecrossing.dmi' + icon = 'icons/obj/science/slimecrossing.dmi' worn_icon = 'icons/mob/clothing/head/costume.dmi' icon_state = "peaceflower" inhand_icon_state = null diff --git a/code/modules/research/xenobiology/crossbreeding/_misc.dm b/code/modules/research/xenobiology/crossbreeding/_misc.dm index ed9b9983ae33a..8eb166bf8207f 100644 --- a/code/modules/research/xenobiology/crossbreeding/_misc.dm +++ b/code/modules/research/xenobiology/crossbreeding/_misc.dm @@ -102,7 +102,7 @@ Slimecrossing Items /obj/item/barriercube name = "barrier cube" desc = "A compressed cube of slime. When squeezed, it grows to massive size!" - icon = 'icons/obj/xenobiology/slimecrossing.dmi' + icon = 'icons/obj/science/slimecrossing.dmi' icon_state = "barriercube" w_class = WEIGHT_CLASS_TINY @@ -119,7 +119,7 @@ Slimecrossing Items /obj/structure/barricade/slime name = "gelatinous barrier" desc = "A huge chunk of grey slime. Bullets might get stuck in it." - icon = 'icons/obj/xenobiology/slimecrossing.dmi' + icon = 'icons/obj/science/slimecrossing.dmi' icon_state = "slimebarrier" proj_pass_rate = 40 max_integrity = 60 @@ -128,7 +128,7 @@ Slimecrossing Items /obj/effect/forcefield/slimewall name = "solidified gel" desc = "A mass of solidified slime gel - completely impenetrable, but it's melting away!" - icon = 'icons/obj/xenobiology/slimecrossing.dmi' + icon = 'icons/obj/science/slimecrossing.dmi' icon_state = "slimebarrier_thick" can_atmos_pass = ATMOS_PASS_NO opacity = TRUE @@ -144,7 +144,7 @@ Slimecrossing Items /obj/structure/ice_stasis name = "ice block" desc = "A massive block of ice. You can see something vaguely humanoid inside." - icon = 'icons/obj/xenobiology/slimecrossing.dmi' + icon = 'icons/obj/science/slimecrossing.dmi' icon_state = "frozen" density = TRUE max_integrity = 100 @@ -173,7 +173,7 @@ Slimecrossing Items name = "gold capture device" desc = "Bluespace technology packed into a roughly egg-shaped device, used to store nonhuman creatures. Can't catch them all, though - it only fits one." w_class = WEIGHT_CLASS_SMALL - icon = 'icons/obj/xenobiology/slimecrossing.dmi' + icon = 'icons/obj/science/slimecrossing.dmi' icon_state = "capturedevice" /obj/item/capturedevice/attack(mob/living/pokemon, mob/user) @@ -209,9 +209,13 @@ Slimecrossing Items else to_chat(user, span_warning("The device is empty...")) -/obj/item/capturedevice/proc/store(mob/living/M) - M.forceMove(src) +/obj/item/capturedevice/proc/store(mob/living/pokemon) + pokemon.forceMove(src) + pokemon.add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), ABSTRACT_ITEM_TRAIT) + pokemon.cancel_camera() /obj/item/capturedevice/proc/release() - for(var/atom/movable/M in contents) - M.forceMove(get_turf(loc)) + for(var/mob/living/pokemon in contents) + pokemon.forceMove(get_turf(loc)) + pokemon.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), ABSTRACT_ITEM_TRAIT) + pokemon.cancel_camera() diff --git a/code/modules/research/xenobiology/crossbreeding/_mobs.dm b/code/modules/research/xenobiology/crossbreeding/_mobs.dm index ecf18cd027d1d..046b5764b4311 100644 --- a/code/modules/research/xenobiology/crossbreeding/_mobs.dm +++ b/code/modules/research/xenobiology/crossbreeding/_mobs.dm @@ -14,8 +14,7 @@ Slimecrossing Mobs invocation_type = INVOCATION_NONE spell_requirements = NONE - convert_damage = TRUE - convert_damage_type = CLONE + convert_damage_type = TOX possible_shapes = list(/mob/living/simple_animal/slime/transformed_slime) /// If TRUE, we self-delete (remove ourselves) the next time we turn back into a human @@ -45,7 +44,7 @@ Slimecrossing Mobs icon_state = "slime_puppy" icon_living = "slime_puppy" icon_dead = "slime_puppy_dead" - nofur = TRUE + can_be_shaved = FALSE gold_core_spawnable = NO_SPAWN speak_emote = list("blorbles", "bubbles", "borks") diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index 845116d932747..6d4d6a7b27200 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -17,7 +17,7 @@ originalcolor = owner.color return ..() -/datum/status_effect/rainbow_protection/tick() +/datum/status_effect/rainbow_protection/tick(seconds_between_ticks) owner.color = rgb(rand(0,255),rand(0,255),rand(0,255)) return ..() @@ -107,7 +107,7 @@ owner.status_flags |= GODMODE return ..() -/datum/status_effect/frozenstasis/tick() +/datum/status_effect/frozenstasis/tick(seconds_between_ticks) if(!cube || owner.loc != cube) owner.remove_status_effect(src) @@ -145,7 +145,7 @@ clone.apply_status_effect(/datum/status_effect/slime_clone_decay) return ..() -/datum/status_effect/slime_clone/tick() +/datum/status_effect/slime_clone/tick(seconds_between_ticks) if(!istype(clone) || clone.stat != CONSCIOUS) owner.remove_status_effect(src) @@ -172,11 +172,14 @@ duration = -1 alert_type = /atom/movable/screen/alert/status_effect/clone_decay -/datum/status_effect/slime_clone_decay/tick() - owner.adjustToxLoss(1, 0) - owner.adjustOxyLoss(1, 0) - owner.adjustBruteLoss(1, 0) - owner.adjustFireLoss(1, 0) +/datum/status_effect/slime_clone_decay/tick(seconds_between_ticks) + var/need_mob_update + need_mob_update = owner.adjustToxLoss(1, updating_health = FALSE) + need_mob_update += owner.adjustOxyLoss(1, updating_health = FALSE) + need_mob_update += owner.adjustBruteLoss(1, updating_health = FALSE) + need_mob_update += owner.adjustFireLoss(1, updating_health = FALSE) + if(need_mob_update) + owner.updatehealth() owner.color = "#007BA7" /atom/movable/screen/alert/status_effect/bloodchill @@ -193,7 +196,7 @@ owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/bloodchill) return ..() -/datum/status_effect/bloodchill/tick() +/datum/status_effect/bloodchill/tick(seconds_between_ticks) if(prob(50)) owner.adjustFireLoss(2) @@ -209,7 +212,7 @@ owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/bonechill) return ..() -/datum/status_effect/bonechill/tick() +/datum/status_effect/bonechill/tick(seconds_between_ticks) if(prob(50)) owner.adjustFireLoss(1) owner.set_jitter_if_lower(6 SECONDS) @@ -230,7 +233,7 @@ duration = -1 alert_type = null -/datum/status_effect/rebreathing/tick() +/datum/status_effect/rebreathing/tick(seconds_between_ticks) owner.adjustOxyLoss(-6, 0) //Just a bit more than normal breathing. /////////////////////////////////////////////////////// @@ -261,7 +264,7 @@ ADD_TRAIT(owner, TRAIT_NO_SLIP_WATER,"watercookie") return ..() -/datum/status_effect/watercookie/tick() +/datum/status_effect/watercookie/tick(seconds_between_ticks) for(var/turf/open/T in range(get_turf(owner),1)) T.MakeSlippery(TURF_WET_WATER, min_wet_time = 10, wet_time_to_add = 5) @@ -337,7 +340,7 @@ alert_type = null duration = 300 -/datum/status_effect/lovecookie/tick() +/datum/status_effect/lovecookie/tick(seconds_between_ticks) if(owner.stat != CONSCIOUS) return if(iscarbon(owner)) @@ -358,7 +361,7 @@ alert_type = null duration = 100 -/datum/status_effect/tarcookie/tick() +/datum/status_effect/tarcookie/tick(seconds_between_ticks) for(var/mob/living/carbon/human/L in range(get_turf(owner),1)) if(L != owner) L.apply_status_effect(/datum/status_effect/tarfoot) @@ -383,7 +386,7 @@ duration = 300 /datum/status_effect/spookcookie/on_apply() - var/image/I = image(icon = 'icons/mob/species/human/human.dmi', icon_state = "skeleton", layer = ABOVE_MOB_LAYER, loc = owner) + var/image/I = image(icon = 'icons/mob/human/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) return ..() @@ -397,7 +400,7 @@ alert_type = null duration = 100 -/datum/status_effect/peacecookie/tick() +/datum/status_effect/peacecookie/tick(seconds_between_ticks) for(var/mob/living/L in range(get_turf(owner),1)) L.apply_status_effect(/datum/status_effect/plur) @@ -448,7 +451,7 @@ src.linked_extract = linked_extract return ..() -/datum/status_effect/stabilized/tick() +/datum/status_effect/stabilized/tick(seconds_between_ticks) if(isnull(linked_extract)) qdel(src) return @@ -467,9 +470,9 @@ //Stabilized effects start below. /datum/status_effect/stabilized/grey id = "stabilizedgrey" - colour = "grey" + colour = SLIME_TYPE_GREY -/datum/status_effect/stabilized/grey/tick() +/datum/status_effect/stabilized/grey/tick(seconds_between_ticks) for(var/mob/living/simple_animal/slime/S in range(1, get_turf(owner))) if(!(owner in S.Friends)) to_chat(owner, span_notice("[linked_extract] pulses gently as it communicates with [S].")) @@ -478,9 +481,9 @@ /datum/status_effect/stabilized/orange id = "stabilizedorange" - colour = "orange" + colour = SLIME_TYPE_ORANGE -/datum/status_effect/stabilized/orange/tick() +/datum/status_effect/stabilized/orange/tick(seconds_between_ticks) var/body_temp_target = owner.get_body_temp_normal(apply_change = FALSE) var/body_temp_actual = owner.bodytemperature @@ -499,26 +502,30 @@ /datum/status_effect/stabilized/purple id = "stabilizedpurple" - colour = "purple" + colour = SLIME_TYPE_PURPLE /// Whether we healed from our last tick var/healed_last_tick = FALSE -/datum/status_effect/stabilized/purple/tick() +/datum/status_effect/stabilized/purple/tick(seconds_between_ticks) healed_last_tick = FALSE + var/need_mob_update = FALSE if(owner.getBruteLoss() > 0) - owner.adjustBruteLoss(-0.2) + need_mob_update += owner.adjustBruteLoss(-0.2, updating_health = FALSE) healed_last_tick = TRUE if(owner.getFireLoss() > 0) - owner.adjustFireLoss(-0.2) + need_mob_update += owner.adjustFireLoss(-0.2, updating_health = FALSE) healed_last_tick = TRUE if(owner.getToxLoss() > 0) // Forced, so slimepeople are healed as well. - owner.adjustToxLoss(-0.2, forced = TRUE) + need_mob_update += owner.adjustToxLoss(-0.2, updating_health = FALSE, forced = TRUE) healed_last_tick = TRUE + if(need_mob_update) + owner.updatehealth() + // Technically, "healed this tick" by now. if(healed_last_tick) new /obj/effect/temp_visual/heal(get_turf(owner), "#FF0000") @@ -527,13 +534,13 @@ /datum/status_effect/stabilized/purple/get_examine_text() if(healed_last_tick) - return span_warning("[owner.p_they(TRUE)] [owner.p_are()] regenerating slowly, purplish goo filling in small injuries!") + return span_warning("[owner.p_They()] [owner.p_are()] regenerating slowly, purplish goo filling in small injuries!") return null /datum/status_effect/stabilized/blue id = "stabilizedblue" - colour = "blue" + colour = SLIME_TYPE_BLUE /datum/status_effect/stabilized/blue/on_apply() ADD_TRAIT(owner, TRAIT_NO_SLIP_WATER, "slimestatus") @@ -544,11 +551,11 @@ /datum/status_effect/stabilized/metal id = "stabilizedmetal" - colour = "metal" + colour = SLIME_TYPE_METAL var/cooldown = 30 var/max_cooldown = 30 -/datum/status_effect/stabilized/metal/tick() +/datum/status_effect/stabilized/metal/tick(seconds_between_ticks) if(cooldown > 0) cooldown-- else @@ -567,14 +574,14 @@ /datum/status_effect/stabilized/yellow id = "stabilizedyellow" - colour = "yellow" + colour = SLIME_TYPE_YELLOW var/cooldown = 10 var/max_cooldown = 10 /datum/status_effect/stabilized/yellow/get_examine_text() return span_warning("Nearby electronics seem just a little more charged wherever [owner.p_they()] go[owner.p_es()].") -/datum/status_effect/stabilized/yellow/tick() +/datum/status_effect/stabilized/yellow/tick(seconds_between_ticks) if(cooldown > 0) cooldown-- return ..() @@ -586,7 +593,6 @@ if(batteries.len) var/obj/item/stock_parts/cell/ToCharge = pick(batteries) ToCharge.charge += min(ToCharge.maxcharge - ToCharge.charge, ToCharge.maxcharge/10) //10% of the cell, or to maximum. - to_chat(owner, span_notice("[linked_extract] discharges some energy into a device you have.")) return ..() /obj/item/hothands @@ -598,7 +604,7 @@ /datum/status_effect/stabilized/darkpurple id = "stabilizeddarkpurple" - colour = "dark purple" + colour = SLIME_TYPE_DARK_PURPLE var/obj/item/hothands/fire /datum/status_effect/stabilized/darkpurple/on_apply() @@ -606,7 +612,7 @@ fire = new(owner) return ..() -/datum/status_effect/stabilized/darkpurple/tick() +/datum/status_effect/stabilized/darkpurple/tick(seconds_between_ticks) var/obj/item/item = owner.get_active_held_item() if(item) if(IS_EDIBLE(item) && (item.microwave_act(microwaver = owner) & COMPONENT_MICROWAVE_SUCCESS)) @@ -620,13 +626,13 @@ qdel(fire) /datum/status_effect/stabilized/darkpurple/get_examine_text() - return span_notice("[owner.p_their(TRUE)] fingertips burn brightly!") + return span_notice("[owner.p_Their()] fingertips burn brightly!") /datum/status_effect/stabilized/darkblue id = "stabilizeddarkblue" - colour = "dark blue" + colour = SLIME_TYPE_DARK_BLUE -/datum/status_effect/stabilized/darkblue/tick() +/datum/status_effect/stabilized/darkblue/tick(seconds_between_ticks) if(owner.fire_stacks > 0 && prob(80)) owner.adjust_wet_stacks(1) if(owner.fire_stacks <= 0) @@ -656,7 +662,7 @@ /datum/status_effect/stabilized/silver id = "stabilizedsilver" - colour = "silver" + colour = SLIME_TYPE_SILVER /datum/status_effect/stabilized/silver/on_apply() if(ishuman(owner)) @@ -682,11 +688,11 @@ /datum/status_effect/stabilized/bluespace id = "stabilizedbluespace" - colour = "bluespace" + colour = SLIME_TYPE_BLUESPACE alert_type = /atom/movable/screen/alert/status_effect/bluespaceslime var/healthcheck -/datum/status_effect/stabilized/bluespace/tick() +/datum/status_effect/stabilized/bluespace/tick(seconds_between_ticks) if(owner.has_status_effect(/datum/status_effect/bluespacestabilization)) linked_alert.desc = "The stabilized bluespace extract is still aligning you with the bluespace axis." linked_alert.icon_state = "slime_bluespace_off" @@ -712,10 +718,10 @@ /datum/status_effect/stabilized/sepia id = "stabilizedsepia" - colour = "sepia" + colour = SLIME_TYPE_SEPIA var/mod = 0 -/datum/status_effect/stabilized/sepia/tick() +/datum/status_effect/stabilized/sepia/tick(seconds_between_ticks) if(prob(50) && mod > -1) mod-- owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/sepia, multiplicative_slowdown = -0.5) @@ -730,7 +736,7 @@ /datum/status_effect/stabilized/cerulean id = "stabilizedcerulean" - colour = "cerulean" + colour = SLIME_TYPE_CERULEAN var/mob/living/clone /datum/status_effect/stabilized/cerulean/on_apply() @@ -744,7 +750,7 @@ C.updateappearance(mutcolor_update=1) return ..() -/datum/status_effect/stabilized/cerulean/tick() +/datum/status_effect/stabilized/cerulean/tick(seconds_between_ticks) if(owner.stat == DEAD) if(clone && clone.stat != DEAD) owner.visible_message(span_warning("[owner] blazes with brilliant light, [linked_extract] whisking [owner.p_their()] soul away."), @@ -766,14 +772,14 @@ /datum/status_effect/stabilized/pyrite id = "stabilizedpyrite" - colour = "pyrite" + colour = SLIME_TYPE_PYRITE var/originalcolor /datum/status_effect/stabilized/pyrite/on_apply() originalcolor = owner.color return ..() -/datum/status_effect/stabilized/pyrite/tick() +/datum/status_effect/stabilized/pyrite/tick(seconds_between_ticks) owner.color = rgb(rand(0,255),rand(0,255),rand(0,255)) return ..() @@ -782,7 +788,7 @@ /datum/status_effect/stabilized/red id = "stabilizedred" - colour = "red" + colour = SLIME_TYPE_RED /datum/status_effect/stabilized/red/on_apply() . = ..() @@ -794,7 +800,7 @@ /datum/status_effect/stabilized/green id = "stabilizedgreen" - colour = "green" + colour = SLIME_TYPE_GREEN var/datum/dna/originalDNA var/originalname @@ -811,7 +817,7 @@ // Only occasionally give examiners a warning. /datum/status_effect/stabilized/green/get_examine_text() if(prob(50)) - return span_warning("[owner.p_they(TRUE)] look[owner.p_s()] a bit green and gooey...") + return span_warning("[owner.p_They()] look[owner.p_s()] a bit green and gooey...") return null @@ -835,14 +841,14 @@ var/damage = 0 var/lasthealth -/datum/status_effect/pinkdamagetracker/tick() +/datum/status_effect/pinkdamagetracker/tick(seconds_between_ticks) if((lasthealth - owner.health) > 0) damage += (lasthealth - owner.health) lasthealth = owner.health /datum/status_effect/stabilized/pink id = "stabilizedpink" - colour = "pink" + colour = SLIME_TYPE_PINK /// List of weakrefs to mobs we have pacified var/list/mobs = list() /// Name of our faction @@ -854,7 +860,7 @@ to_chat(owner, span_notice("[linked_extract] pulses, generating a fragile aura of peace.")) return ..() -/datum/status_effect/stabilized/pink/tick() +/datum/status_effect/stabilized/pink/tick(seconds_between_ticks) update_nearby_mobs() var/has_faction = FALSE for (var/check_faction in owner.faction) @@ -914,16 +920,16 @@ /datum/status_effect/stabilized/oil id = "stabilizedoil" - colour = "oil" + colour = SLIME_TYPE_OIL -/datum/status_effect/stabilized/oil/tick() +/datum/status_effect/stabilized/oil/tick(seconds_between_ticks) if(owner.stat == DEAD) explosion(owner, devastation_range = 1, heavy_impact_range = 2, light_impact_range = 4, flame_range = 5, explosion_cause = src) qdel(linked_extract) return ..() /datum/status_effect/stabilized/oil/get_examine_text() - return span_warning("[owner.p_they(TRUE)] smell[owner.p_s()] of sulfur and oil!") + return span_warning("[owner.p_They()] smell[owner.p_s()] of sulfur and oil!") /// How much damage is dealt per healing done for the stabilized back. /// This multiplier is applied to prevent two people from converting each other's damage away. @@ -931,7 +937,7 @@ /datum/status_effect/stabilized/black id = "stabilizedblack" - colour = "black" + colour = SLIME_TYPE_BLACK /// How much we heal per tick (also how much we damage per tick times DRAIN_DAMAGE_MULTIPLIER). var/heal_amount = 1 /// Weakref to the mob we're currently draining every tick. @@ -966,9 +972,9 @@ if(!draining) return null - return span_warning("[owner.p_they(TRUE)] [owner.p_are()] draining health from [draining]!") + return span_warning("[owner.p_They()] [owner.p_are()] draining health from [draining]!") -/datum/status_effect/stabilized/black/tick() +/datum/status_effect/stabilized/black/tick(seconds_between_ticks) if(owner.grab_state < GRAB_KILL || !IS_WEAKREF_OF(owner.pulling, draining_ref)) return @@ -992,21 +998,21 @@ owner.apply_damage_type(-heal_amount, damagetype = pick(healing_types)) owner.adjust_nutrition(3) - drained.adjustCloneLoss(heal_amount * DRAIN_DAMAGE_MULTIPLIER) + drained.apply_damage(heal_amount * DRAIN_DAMAGE_MULTIPLIER, damagetype = BRUTE, spread_damage = TRUE) return ..() #undef DRAIN_DAMAGE_MULTIPLIER /datum/status_effect/stabilized/lightpink id = "stabilizedlightpink" - colour = "light pink" + colour = SLIME_TYPE_LIGHT_PINK /datum/status_effect/stabilized/lightpink/on_apply() owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/lightpink) - ADD_TRAIT(owner, TRAIT_PACIFISM, STABILIZED_LIGHT_PINK_TRAIT) + ADD_TRAIT(owner, TRAIT_PACIFISM, STABILIZED_LIGHT_PINK_EXTRACT_TRAIT) return ..() -/datum/status_effect/stabilized/lightpink/tick() +/datum/status_effect/stabilized/lightpink/tick(seconds_between_ticks) for(var/mob/living/carbon/human/H in range(1, get_turf(owner))) if(H != owner && H.stat != DEAD && H.health <= 0 && !H.reagents.has_reagent(/datum/reagent/medicine/epinephrine)) to_chat(owner, "[linked_extract] pulses in sync with [H]'s heartbeat, trying to keep [H.p_them()] alive.") @@ -1015,21 +1021,21 @@ /datum/status_effect/stabilized/lightpink/on_remove() owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/lightpink) - REMOVE_TRAIT(owner, TRAIT_PACIFISM, STABILIZED_LIGHT_PINK_TRAIT) + REMOVE_TRAIT(owner, TRAIT_PACIFISM, STABILIZED_LIGHT_PINK_EXTRACT_TRAIT) /datum/status_effect/stabilized/adamantine id = "stabilizedadamantine" - colour = "adamantine" + colour = SLIME_TYPE_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.") + return span_warning("[owner.p_They()] [owner.p_have()] strange metallic coating on [owner.p_their()] skin.") /datum/status_effect/stabilized/gold id = "stabilizedgold" - colour = "gold" + colour = SLIME_TYPE_GOLD var/mob/living/simple_animal/familiar -/datum/status_effect/stabilized/gold/tick() +/datum/status_effect/stabilized/gold/tick(seconds_between_ticks) var/obj/item/slimecross/stabilized/gold/linked = linked_extract if(QDELETED(familiar)) familiar = new linked.mob_type(get_turf(owner.loc)) @@ -1043,7 +1049,6 @@ familiar.copy_languages(owner, LANGUAGE_MASTER) if(linked.saved_mind) linked.saved_mind.transfer_to(familiar) - familiar.update_atom_languages() familiar.ckey = linked.saved_mind.key else if(familiar.mind) @@ -1067,9 +1072,9 @@ /datum/status_effect/stabilized/rainbow id = "stabilizedrainbow" - colour = "rainbow" + colour = SLIME_TYPE_RAINBOW -/datum/status_effect/stabilized/rainbow/tick() +/datum/status_effect/stabilized/rainbow/tick(seconds_between_ticks) if(owner.health <= 0) var/obj/item/slimecross/stabilized/rainbow/X = linked_extract if(istype(X)) diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm index 4e2adcb958beb..61f4e7a72e0c8 100644 --- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm +++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm @@ -20,7 +20,7 @@ Slimecrossing Weapons /obj/item/knife/rainbowknife name = "rainbow knife" desc = "A strange, transparent knife which constantly shifts color. It hums slightly when moved." - icon = 'icons/obj/xenobiology/slimecrossing.dmi' + icon = 'icons/obj/weapons/stabby.dmi' icon_state = "rainbowknife" inhand_icon_state = "rainbowknife" force = 15 @@ -88,7 +88,7 @@ Slimecrossing Weapons /obj/item/gun/magic/bloodchill name = "blood chiller" desc = "A horrifying weapon made of your own bone and blood vessels. It shoots slowing globules of your own blood. Ech." - icon = 'icons/obj/xenobiology/slimecrossing.dmi' + icon = 'icons/obj/science/slimecrossing.dmi' icon_state = "bloodgun" inhand_icon_state = "bloodgun" lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' @@ -96,6 +96,7 @@ Slimecrossing Weapons item_flags = ABSTRACT | DROPDEL w_class = WEIGHT_CLASS_HUGE slot_flags = NONE + antimagic_flags = NONE force = 5 max_charges = 1 //Recharging costs blood. recharge_rate = 1 diff --git a/code/modules/research/xenobiology/crossbreeding/burning.dm b/code/modules/research/xenobiology/crossbreeding/burning.dm index a5f281bb37592..0ababd344223d 100644 --- a/code/modules/research/xenobiology/crossbreeding/burning.dm +++ b/code/modules/research/xenobiology/crossbreeding/burning.dm @@ -28,11 +28,11 @@ Burning extracts: return /obj/item/slimecross/burning/grey - colour = "grey" + colour = SLIME_TYPE_GREY effect_desc = "Creates a hungry and speedy slime that will love you forever." /obj/item/slimecross/burning/grey/do_effect(mob/user) - var/mob/living/simple_animal/slime/S = new(get_turf(user),"grey") + var/mob/living/simple_animal/slime/S = new(get_turf(user),SLIME_TYPE_GREY) S.visible_message(span_danger("A baby slime emerges from [src], and it nuzzles [user] before burbling hungrily!")) S.set_friendship(user, 20) //Gas, gas, gas S.bodytemperature = T0C + 400 //We gonna step on the gas. @@ -40,7 +40,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/orange - colour = "orange" + colour = SLIME_TYPE_ORANGE effect_desc = "Expels pepperspray in a radius when activated." /obj/item/slimecross/burning/orange/do_effect(mob/user) @@ -54,7 +54,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/purple - colour = "purple" + colour = SLIME_TYPE_PURPLE effect_desc = "Creates a clump of invigorating gel, it has healing properties and makes you feel good." /obj/item/slimecross/burning/purple/do_effect(mob/user) @@ -63,7 +63,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/blue - colour = "blue" + colour = SLIME_TYPE_BLUE effect_desc = "Freezes the floor around you and chills nearby people." /obj/item/slimecross/burning/blue/do_effect(mob/user) @@ -77,7 +77,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/metal - colour = "metal" + colour = SLIME_TYPE_METAL effect_desc = "Instantly destroys walls around you." /obj/item/slimecross/burning/metal/do_effect(mob/user) @@ -88,7 +88,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/yellow - colour = "yellow" + colour = SLIME_TYPE_YELLOW effect_desc = "Electrocutes people near you." /obj/item/slimecross/burning/yellow/do_effect(mob/user) @@ -105,7 +105,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/darkpurple - colour = "dark purple" + colour = SLIME_TYPE_DARK_PURPLE effect_desc = "Creates a cloud of plasma." /obj/item/slimecross/burning/darkpurple/do_effect(mob/user) @@ -115,7 +115,7 @@ Burning extracts: return ..() /obj/item/slimecross/burning/darkblue - colour = "dark blue" + colour = SLIME_TYPE_DARK_BLUE effect_desc = "Expels a burst of chilling smoke while also filling you with regenerative jelly." /obj/item/slimecross/burning/darkblue/do_effect(mob/user) @@ -129,7 +129,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/silver - colour = "silver" + colour = SLIME_TYPE_SILVER effect_desc = "Creates a few pieces of slime jelly laced food." /obj/item/slimecross/burning/silver/do_effect(mob/user) @@ -148,7 +148,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/bluespace - colour = "bluespace" + colour = SLIME_TYPE_BLUESPACE effect_desc = "Teleports anyone directly next to you." /obj/item/slimecross/burning/bluespace/do_effect(mob/user) @@ -161,7 +161,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/sepia - colour = "sepia" + colour = SLIME_TYPE_SEPIA effect_desc = "Turns into a special camera that rewinds time when used." /obj/item/slimecross/burning/sepia/do_effect(mob/user) @@ -170,7 +170,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/cerulean - colour = "cerulean" + colour = SLIME_TYPE_CERULEAN effect_desc = "Produces an extract cloning potion, which copies an extract, as well as its extra uses." /obj/item/slimecross/burning/cerulean/do_effect(mob/user) @@ -179,7 +179,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/pyrite - colour = "pyrite" + colour = SLIME_TYPE_PYRITE effect_desc = "Shatters all lights in the current room." /obj/item/slimecross/burning/pyrite/do_effect(mob/user) @@ -192,7 +192,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/red - colour = "red" + colour = SLIME_TYPE_RED effect_desc = "Makes nearby slimes rabid, and they'll also attack their friends." /obj/item/slimecross/burning/red/do_effect(mob/user) @@ -209,7 +209,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/green - colour = "green" + colour = SLIME_TYPE_GREEN effect_desc = "The user gets a dull arm blade in the hand it is used in." /obj/item/slimecross/burning/green/do_effect(mob/user) @@ -232,7 +232,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/pink - colour = "pink" + colour = SLIME_TYPE_PINK effect_desc = "Creates a beaker of synthpax." /obj/item/slimecross/burning/pink/do_effect(mob/user) @@ -241,7 +241,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/gold - colour = "gold" + colour = SLIME_TYPE_GOLD effect_desc = "Creates a gank squad of monsters that are friendly to the user." /obj/item/slimecross/burning/gold/do_effect(mob/user) @@ -255,7 +255,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/oil - colour = "oil" + colour = SLIME_TYPE_OIL effect_desc = "Creates an explosion after a few seconds." /obj/item/slimecross/burning/oil/do_effect(mob/user) @@ -272,7 +272,7 @@ Burning extracts: qdel(src) /obj/item/slimecross/burning/black - colour = "black" + colour = SLIME_TYPE_BLACK effect_desc = "Transforms the user into a slime. They can transform back at will and do not lose any items." /obj/item/slimecross/burning/black/do_effect(mob/user) @@ -286,7 +286,7 @@ Burning extracts: return ..() /obj/item/slimecross/burning/lightpink - colour = "light pink" + colour = SLIME_TYPE_LIGHT_PINK effect_desc = "Paxes everyone in sight." /obj/item/slimecross/burning/lightpink/do_effect(mob/user) @@ -296,7 +296,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/adamantine - colour = "adamantine" + colour = SLIME_TYPE_ADAMANTINE effect_desc = "Creates a mighty adamantine shield." /obj/item/slimecross/burning/adamantine/do_effect(mob/user) @@ -305,7 +305,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/rainbow - colour = "rainbow" + colour = SLIME_TYPE_RAINBOW effect_desc = "Creates the Rainbow Knife, a kitchen knife that deals random types of damage." /obj/item/slimecross/burning/rainbow/do_effect(mob/user) diff --git a/code/modules/research/xenobiology/crossbreeding/charged.dm b/code/modules/research/xenobiology/crossbreeding/charged.dm index f9d59193a6661..8941057453ba1 100644 --- a/code/modules/research/xenobiology/crossbreeding/charged.dm +++ b/code/modules/research/xenobiology/crossbreeding/charged.dm @@ -29,7 +29,7 @@ Charged extracts: return /obj/item/slimecross/charged/grey - colour = "grey" + colour = SLIME_TYPE_GREY effect_desc = "Produces a slime reviver potion, which revives dead slimes." /obj/item/slimecross/charged/grey/do_effect(mob/user) @@ -38,7 +38,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/orange - colour = "orange" + colour = SLIME_TYPE_ORANGE effect_desc = "Instantly makes a large burst of flame for a moment." /obj/item/slimecross/charged/orange/do_effect(mob/user) @@ -49,7 +49,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/purple - colour = "purple" + colour = SLIME_TYPE_PURPLE effect_desc = "Creates a packet of omnizine." /obj/item/slimecross/charged/purple/do_effect(mob/user) @@ -58,7 +58,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/blue - colour = "blue" + colour = SLIME_TYPE_BLUE effect_desc = "Creates a potion that neuters the mutation chance of a slime, which passes on to new generations." /obj/item/slimecross/charged/blue/do_effect(mob/user) @@ -67,7 +67,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/metal - colour = "metal" + colour = SLIME_TYPE_METAL effect_desc = "Produces a bunch of metal and plasteel." /obj/item/slimecross/charged/metal/do_effect(mob/user) @@ -77,7 +77,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/yellow - colour = "yellow" + colour = SLIME_TYPE_YELLOW effect_desc = "Creates a hypercharged slime cell battery, which has high capacity but takes longer to recharge." /obj/item/slimecross/charged/yellow/do_effect(mob/user) @@ -86,7 +86,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/darkpurple - colour = "dark purple" + colour = SLIME_TYPE_DARK_PURPLE effect_desc = "Creates several sheets of plasma." /obj/item/slimecross/charged/darkpurple/do_effect(mob/user) @@ -95,7 +95,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/darkblue - colour = "dark blue" + colour = SLIME_TYPE_DARK_BLUE effect_desc = "Produces a pressure proofing potion." /obj/item/slimecross/charged/darkblue/do_effect(mob/user) @@ -104,7 +104,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/silver - colour = "silver" + colour = SLIME_TYPE_SILVER effect_desc = "Creates a slime cake and some drinks." /obj/item/slimecross/charged/silver/do_effect(mob/user) @@ -116,7 +116,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/bluespace - colour = "bluespace" + colour = SLIME_TYPE_BLUESPACE effect_desc = "Makes a bluespace polycrystal." /obj/item/slimecross/charged/bluespace/do_effect(mob/user) @@ -125,7 +125,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/sepia - colour = "sepia" + colour = SLIME_TYPE_SEPIA effect_desc = "Creates a camera obscura." /obj/item/slimecross/charged/sepia/do_effect(mob/user) @@ -134,7 +134,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/cerulean - colour = "cerulean" + colour = SLIME_TYPE_CERULEAN effect_desc = "Creates an extract enhancer, giving whatever it's used on five more uses." /obj/item/slimecross/charged/cerulean/do_effect(mob/user) @@ -143,7 +143,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/pyrite - colour = "pyrite" + colour = SLIME_TYPE_PYRITE effect_desc = "Creates bananium. Oh no." /obj/item/slimecross/charged/pyrite/do_effect(mob/user) @@ -152,7 +152,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/red - colour = "red" + colour = SLIME_TYPE_RED effect_desc = "Produces a lavaproofing potion" /obj/item/slimecross/charged/red/do_effect(mob/user) @@ -161,7 +161,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/green - colour = "green" + colour = SLIME_TYPE_GREEN effect_desc = "Lets you choose what slime species you want to be." /obj/item/slimecross/charged/green/do_effect(mob/user) @@ -183,7 +183,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/pink - colour = "pink" + colour = SLIME_TYPE_PINK effect_desc = "Produces a... lovepotion... no ERP." /obj/item/slimecross/charged/pink/do_effect(mob/user) @@ -192,7 +192,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/gold - colour = "gold" + colour = SLIME_TYPE_GOLD effect_desc = "Slowly spawns 10 hostile monsters." var/max_spawn = 10 var/spawned = 0 @@ -219,7 +219,7 @@ Charged extracts: return ..() /obj/item/slimecross/charged/oil - colour = "oil" + colour = SLIME_TYPE_OIL effect_desc = "Creates an explosion after a few seconds." /obj/item/slimecross/charged/oil/do_effect(mob/user) @@ -231,28 +231,30 @@ Charged extracts: qdel(src) /obj/item/slimecross/charged/black - colour = "black" + colour = SLIME_TYPE_BLACK effect_desc = "Randomizes the user's species." /obj/item/slimecross/charged/black/do_effect(mob/user) - var/mob/living/carbon/human/H = user - if(!istype(H)) - to_chat(user, span_warning("You have to be able to have a species to get your species changed.")) + var/mob/living/carbon/human/experiment_subject = user + if(!istype(experiment_subject)) + balloon_alert(experiment_subject, "incompatible biology!") return var/list/allowed_species = list() for(var/stype in subtypesof(/datum/species)) - var/datum/species/X = stype - if(initial(X.changesource_flags) & SLIME_EXTRACT) + var/datum/species/try_species = stype + if(initial(try_species.changesource_flags) & SLIME_EXTRACT) allowed_species += stype var/datum/species/changed = pick(allowed_species) - if(changed) - H.set_species(changed, icon_update = 1) - to_chat(H, span_danger("You feel very different!")) - ..() + if(isnull(changed)) + visible_message(span_notice("[src] fizzes uselessly.")) + return + experiment_subject.set_species(changed, icon_update = TRUE) + to_chat(experiment_subject, span_danger("You feel very different!")) + return ..() /obj/item/slimecross/charged/lightpink - colour = "light pink" + colour = SLIME_TYPE_LIGHT_PINK effect_desc = "Produces a pacification potion, which works on monsters and humanoids." /obj/item/slimecross/charged/lightpink/do_effect(mob/user) @@ -261,7 +263,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/adamantine - colour = "adamantine" + colour = SLIME_TYPE_ADAMANTINE effect_desc = "Creates a completed golem shell." /obj/item/slimecross/charged/adamantine/do_effect(mob/user) @@ -270,7 +272,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/rainbow - colour = "rainbow" + colour = SLIME_TYPE_RAINBOW effect_desc = "Produces three living slimes of random colors." /obj/item/slimecross/charged/rainbow/do_effect(mob/user) diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm index b2bf36846611c..c3586437c3276 100644 --- a/code/modules/research/xenobiology/crossbreeding/chilling.dm +++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm @@ -28,7 +28,7 @@ Chilling extracts: return /obj/item/slimecross/chilling/grey - colour = "grey" + colour = SLIME_TYPE_GREY effect_desc = "Creates some slime barrier cubes. When used they create slimy barricades." /obj/item/slimecross/chilling/grey/do_effect(mob/user) @@ -38,7 +38,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/orange - colour = "orange" + colour = SLIME_TYPE_ORANGE effect_desc = "Creates a ring of fire one tile away from the user." /obj/item/slimecross/chilling/orange/do_effect(mob/user) @@ -49,7 +49,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/purple - colour = "purple" + colour = SLIME_TYPE_PURPLE effect_desc = "Injects everyone in the area with some regenerative jelly." /obj/item/slimecross/chilling/purple/do_effect(mob/user) @@ -63,7 +63,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/blue - colour = "blue" + colour = SLIME_TYPE_BLUE effect_desc = "Creates a rebreather, a tankless mask." /obj/item/slimecross/chilling/blue/do_effect(mob/user) @@ -72,7 +72,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/metal - colour = "metal" + colour = SLIME_TYPE_METAL effect_desc = "Temporarily surrounds the user with unbreakable walls." /obj/item/slimecross/chilling/metal/do_effect(mob/user) @@ -83,7 +83,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/yellow - colour = "yellow" + colour = SLIME_TYPE_YELLOW effect_desc = "Recharges the room's APC by 50%." /obj/item/slimecross/chilling/yellow/do_effect(mob/user) @@ -95,7 +95,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/darkpurple - colour = "dark purple" + colour = SLIME_TYPE_DARK_PURPLE effect_desc = "Removes all plasma gas in the area." /obj/item/slimecross/chilling/darkpurple/do_effect(mob/user) @@ -119,7 +119,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/darkblue - colour = "dark blue" + colour = SLIME_TYPE_DARK_BLUE effect_desc = "Seals the user in a protective block of ice." /obj/item/slimecross/chilling/darkblue/do_effect(mob/user) @@ -130,7 +130,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/silver - colour = "silver" + colour = SLIME_TYPE_SILVER effect_desc = "Creates several ration packs." /obj/item/slimecross/chilling/silver/do_effect(mob/user) @@ -141,7 +141,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/bluespace - colour = "bluespace" + colour = SLIME_TYPE_BLUESPACE effect_desc = "Touching people with this extract adds them to a list, when it is activated it teleports everyone on that list to the user." var/list/allies = list() var/active = FALSE @@ -184,7 +184,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/sepia - colour = "sepia" + colour = SLIME_TYPE_SEPIA effect_desc = "Touching someone with it adds/removes them from a list. Activating the extract stops time for 30 seconds, and everyone on the list is immune, except the user." var/list/allies = list() @@ -206,7 +206,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/cerulean - colour = "cerulean" + colour = SLIME_TYPE_CERULEAN effect_desc = "Creates a flimsy copy of the user, that they control." /obj/item/slimecross/chilling/cerulean/do_effect(mob/user) @@ -217,7 +217,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/pyrite - colour = "pyrite" + colour = SLIME_TYPE_PYRITE effect_desc = "Creates a pair of Prism Glasses, which allow the wearer to place colored light crystals." /obj/item/slimecross/chilling/pyrite/do_effect(mob/user) @@ -226,7 +226,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/red - colour = "red" + colour = SLIME_TYPE_RED effect_desc = "Pacifies every slime in your vacinity." /obj/item/slimecross/chilling/red/do_effect(mob/user) @@ -241,7 +241,7 @@ Chilling extracts: return ..() /obj/item/slimecross/chilling/green - colour = "green" + colour = SLIME_TYPE_GREEN effect_desc = "Creates a bone gun in the hand it is used in, which uses blood as ammo." /obj/item/slimecross/chilling/green/do_effect(mob/user) @@ -264,7 +264,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/pink - colour = "pink" + colour = SLIME_TYPE_PINK effect_desc = "Creates a slime corgi puppy." /obj/item/slimecross/chilling/pink/do_effect(mob/user) @@ -273,7 +273,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/gold - colour = "gold" + colour = SLIME_TYPE_GOLD effect_desc = "Produces a golden capture device" /obj/item/slimecross/chilling/gold/do_effect(mob/user) @@ -282,7 +282,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/oil - colour = "oil" + colour = SLIME_TYPE_OIL effect_desc = "It creates a weak, but wide-ranged explosion." /obj/item/slimecross/chilling/oil/do_effect(mob/user) @@ -294,7 +294,7 @@ Chilling extracts: qdel(src) /obj/item/slimecross/chilling/black - colour = "black" + colour = SLIME_TYPE_BLACK effect_desc = "Transforms the user into a golem." /obj/item/slimecross/chilling/black/do_effect(mob/user) @@ -305,7 +305,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/lightpink - colour = "light pink" + colour = SLIME_TYPE_LIGHT_PINK effect_desc = "Creates a Heroine Bud, a special flower that pacifies whoever wears it on their head. They will not be able to take it off without help." /obj/item/slimecross/chilling/lightpink/do_effect(mob/user) @@ -314,7 +314,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/adamantine - colour = "adamantine" + colour = SLIME_TYPE_ADAMANTINE effect_desc = "Solidifies into a set of adamantine armor." /obj/item/slimecross/chilling/adamantine/do_effect(mob/user) @@ -323,7 +323,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/rainbow - colour = "rainbow" + colour = SLIME_TYPE_RAINBOW effect_desc = "Makes an unpassable wall in every door in the area." /obj/item/slimecross/chilling/rainbow/do_effect(mob/user) diff --git a/code/modules/research/xenobiology/crossbreeding/consuming.dm b/code/modules/research/xenobiology/crossbreeding/consuming.dm index 0deb64b481fe2..ec90edd6550bf 100644 --- a/code/modules/research/xenobiology/crossbreeding/consuming.dm +++ b/code/modules/research/xenobiology/crossbreeding/consuming.dm @@ -83,7 +83,7 @@ Consuming extracts: ..() /obj/item/slimecross/consuming/grey - colour = "grey" + colour = SLIME_TYPE_GREY effect_desc = "Creates a slime cookie." cookietype = /obj/item/slime_cookie/grey @@ -95,7 +95,7 @@ Consuming extracts: nutrition = 15 /obj/item/slimecross/consuming/orange - colour = "orange" + colour = SLIME_TYPE_ORANGE effect_desc = "Creates a slime cookie that heats the target up and grants cold immunity for a short time." cookietype = /obj/item/slime_cookie/orange @@ -109,7 +109,7 @@ Consuming extracts: M.apply_status_effect(/datum/status_effect/firecookie) /obj/item/slimecross/consuming/purple - colour = "purple" + colour = SLIME_TYPE_PURPLE effect_desc = "Creates a slime cookie that heals the target from every type of damage." cookietype = /obj/item/slime_cookie/purple @@ -120,15 +120,18 @@ 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) + var/need_mob_update = FALSE + need_mob_update += M.adjustBruteLoss(-5, updating_health = FALSE) + need_mob_update += M.adjustFireLoss(-5, updating_health = FALSE) + need_mob_update += M.adjustToxLoss(-5, updating_health = FALSE, forced = TRUE) //To heal slimepeople. + need_mob_update += M.adjustOxyLoss(-5, updating_health = FALSE) + need_mob_update += M.adjustCloneLoss(-5, updating_health = FALSE) + need_mob_update += M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -5) + if(need_mob_update) + M.updatehealth() /obj/item/slimecross/consuming/blue - colour = "blue" + colour = SLIME_TYPE_BLUE effect_desc = "Creates a slime cookie that wets the floor around you and makes you immune to water based slipping for a short time." cookietype = /obj/item/slime_cookie/blue @@ -142,7 +145,7 @@ Consuming extracts: M.apply_status_effect(/datum/status_effect/watercookie) /obj/item/slimecross/consuming/metal - colour = "metal" + colour = SLIME_TYPE_METAL effect_desc = "Creates a slime cookie that increases the target's resistance to brute damage." cookietype = /obj/item/slime_cookie/metal @@ -156,7 +159,7 @@ Consuming extracts: M.apply_status_effect(/datum/status_effect/metalcookie) /obj/item/slimecross/consuming/yellow - colour = "yellow" + colour = SLIME_TYPE_YELLOW effect_desc = "Creates a slime cookie that makes the target immune to electricity for a short time." cookietype = /obj/item/slime_cookie/yellow @@ -170,7 +173,7 @@ Consuming extracts: M.apply_status_effect(/datum/status_effect/sparkcookie) /obj/item/slimecross/consuming/darkpurple - colour = "dark purple" + colour = SLIME_TYPE_DARK_PURPLE effect_desc = "Creates a slime cookie that reverses how the target's body treats toxins." cookietype = /obj/item/slime_cookie/darkpurple @@ -184,7 +187,7 @@ Consuming extracts: M.apply_status_effect(/datum/status_effect/toxincookie) /obj/item/slimecross/consuming/darkblue - colour = "dark blue" + colour = SLIME_TYPE_DARK_BLUE effect_desc = "Creates a slime cookie that chills the target and extinguishes them." cookietype = /obj/item/slime_cookie/darkblue @@ -199,7 +202,7 @@ Consuming extracts: M.extinguish_mob() /obj/item/slimecross/consuming/silver - colour = "silver" + colour = SLIME_TYPE_SILVER effect_desc = "Creates a slime cookie that never gets the target fat." cookietype = /obj/item/slime_cookie/silver @@ -214,7 +217,7 @@ Consuming extracts: M.reagents.add_reagent(/datum/reagent/consumable/nutriment/stabilized,10) /obj/item/slimecross/consuming/bluespace - colour = "bluespace" + colour = SLIME_TYPE_BLUESPACE effect_desc = "Creates a slime cookie that teleports the target to a random place in the area." cookietype = /obj/item/slime_cookie/bluespace @@ -250,7 +253,7 @@ Consuming extracts: playsound(get_turf(M), SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) /obj/item/slimecross/consuming/sepia - colour = "sepia" + colour = SLIME_TYPE_SEPIA effect_desc = "Creates a slime cookie that makes the target do things slightly faster." cookietype = /obj/item/slime_cookie/sepia @@ -264,7 +267,7 @@ Consuming extracts: M.apply_status_effect(/datum/status_effect/timecookie) /obj/item/slimecross/consuming/cerulean - colour = "cerulean" + colour = SLIME_TYPE_CERULEAN effect_desc = "Creates a slime cookie that has a chance to make another once you eat it." cookietype = /obj/item/slime_cookie/cerulean cookies = 3 //You're gonna get more. @@ -282,7 +285,7 @@ Consuming extracts: C.taste = taste + " and a sugar cookie" /obj/item/slimecross/consuming/pyrite - colour = "pyrite" + colour = SLIME_TYPE_PYRITE effect_desc = "Creates a slime cookie that randomly colors the target." cookietype = /obj/item/slime_cookie/pyrite @@ -324,7 +327,7 @@ Consuming extracts: M.add_atom_colour(colour,WASHABLE_COLOUR_PRIORITY) /obj/item/slimecross/consuming/red - colour = "red" + colour = SLIME_TYPE_RED effect_desc = "Creates a slime cookie that creates a spatter of blood on the floor, while also restoring some of the target's blood." cookietype = /obj/item/slime_cookie/red @@ -342,7 +345,7 @@ Consuming extracts: C.blood_volume += 25 //Half a vampire drain. /obj/item/slimecross/consuming/green - colour = "green" + colour = SLIME_TYPE_GREEN effect_desc = "Creates a slime cookie that is absolutely disgusting, makes the target vomit, however all reagent in their body are also removed." cookietype = /obj/item/slime_cookie/green @@ -355,11 +358,11 @@ Consuming extracts: /obj/item/slime_cookie/green/do_effect(mob/living/M, mob/user) if(ishuman(M)) var/mob/living/carbon/human/H = M - H.vomit(25) + H.vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = 25) M.reagents.remove_all() /obj/item/slimecross/consuming/pink - colour = "pink" + colour = SLIME_TYPE_PINK effect_desc = "Creates a slime cookie that makes the target want to spread the love." cookietype = /obj/item/slime_cookie/pink @@ -373,7 +376,7 @@ Consuming extracts: M.apply_status_effect(/datum/status_effect/lovecookie) /obj/item/slimecross/consuming/gold - colour = "gold" + colour = SLIME_TYPE_GOLD effect_desc = "Creates a slime cookie that has a gold coin inside." cookietype = /obj/item/slime_cookie/gold @@ -392,7 +395,7 @@ Consuming extracts: M.put_in_hand(C) /obj/item/slimecross/consuming/oil - colour = "oil" + colour = SLIME_TYPE_OIL effect_desc = "Creates a slime cookie that slows anyone next to the user." cookietype = /obj/item/slime_cookie/oil @@ -406,7 +409,7 @@ Consuming extracts: M.apply_status_effect(/datum/status_effect/tarcookie) /obj/item/slimecross/consuming/black - colour = "black" + colour = SLIME_TYPE_BLACK effect_desc = "Creates a slime cookie that makes the target look like a spooky skeleton for a little bit." cookietype = /obj/item/slime_cookie/black @@ -420,7 +423,7 @@ Consuming extracts: M.apply_status_effect(/datum/status_effect/spookcookie) /obj/item/slimecross/consuming/lightpink - colour = "light pink" + colour = SLIME_TYPE_LIGHT_PINK effect_desc = "Creates a slime cookie that makes the target, and anyone next to the target, pacifistic for a small amount of time." cookietype = /obj/item/slime_cookie/lightpink @@ -434,7 +437,7 @@ Consuming extracts: M.apply_status_effect(/datum/status_effect/peacecookie) /obj/item/slimecross/consuming/adamantine - colour = "adamantine" + colour = SLIME_TYPE_ADAMANTINE effect_desc = "Creates a slime cookie that increases the target's resistance to burn damage." cookietype = /obj/item/slime_cookie/adamantine @@ -448,7 +451,7 @@ Consuming extracts: M.apply_status_effect(/datum/status_effect/adamantinecookie) /obj/item/slimecross/consuming/rainbow - colour = "rainbow" + colour = SLIME_TYPE_RAINBOW effect_desc = "Creates a slime cookie that has the effect of a random cookie." /obj/item/slimecross/consuming/rainbow/spawncookie() diff --git a/code/modules/research/xenobiology/crossbreeding/industrial.dm b/code/modules/research/xenobiology/crossbreeding/industrial.dm index a5cdb181e2bb4..5222ab3608c09 100644 --- a/code/modules/research/xenobiology/crossbreeding/industrial.dm +++ b/code/modules/research/xenobiology/crossbreeding/industrial.dm @@ -52,37 +52,37 @@ Industrial extracts: icon_state = "industrial_still" /obj/item/slimecross/industrial/grey - colour = "grey" + colour = SLIME_TYPE_GREY effect_desc = "Produces monkey cubes." itempath = /obj/item/food/monkeycube itemamount = 5 /obj/item/slimecross/industrial/orange - colour = "orange" + colour = SLIME_TYPE_ORANGE effect_desc = "Produces slime zippo lighters." plasmarequired = 6 itempath = /obj/item/lighter/slime /obj/item/slimecross/industrial/purple - colour = "purple" + colour = SLIME_TYPE_PURPLE effect_desc = "Produces autoinjectors with regen jelly inside." plasmarequired = 5 itempath = /obj/item/slimecrossbeaker/autoinjector/regenpack /obj/item/slimecross/industrial/blue - colour = "blue" + colour = SLIME_TYPE_BLUE effect_desc = "Produces full fire extinguishers." plasmarequired = 10 itempath = /obj/item/extinguisher /obj/item/slimecross/industrial/metal - colour = "metal" + colour = SLIME_TYPE_METAL effect_desc = "Produces iron sheets." plasmarequired = 3 itempath = /obj/item/stack/sheet/iron/ten /obj/item/slimecross/industrial/yellow - colour = "yellow" + colour = SLIME_TYPE_YELLOW effect_desc = "Produces high capacity power cells, which are not fully charged on creation." plasmarequired = 5 itempath = /obj/item/stock_parts/cell/high @@ -93,13 +93,13 @@ Industrial extracts: C.charge = rand(0,C.maxcharge/2) /obj/item/slimecross/industrial/darkpurple - colour = "dark purple" + colour = SLIME_TYPE_DARK_PURPLE effect_desc = "Produces plasma... for plasma." plasmarequired = 10 itempath = /obj/item/stack/sheet/mineral/plasma /obj/item/slimecross/industrial/darkblue - colour = "dark blue" + colour = SLIME_TYPE_DARK_BLUE effect_desc = "Produces one-use fireproofing potions." plasmarequired = 6 itempath = /obj/item/slimepotion/fireproof @@ -110,7 +110,7 @@ Industrial extracts: potion.uses = 1 /obj/item/slimecross/industrial/silver - colour = "silver" + colour = SLIME_TYPE_SILVER effect_desc = "Produces random food and drink items." plasmarequired = 1 //Item picked below. @@ -123,49 +123,49 @@ Industrial extracts: ADD_TRAIT(spawned, TRAIT_FOOD_SILVER, INNATE_TRAIT) /obj/item/slimecross/industrial/bluespace - colour = "bluespace" + colour = SLIME_TYPE_BLUESPACE effect_desc = "Produces synthetic bluespace crystals." plasmarequired = 7 itempath = /obj/item/stack/ore/bluespace_crystal/artificial /obj/item/slimecross/industrial/sepia - colour = "sepia" + colour = SLIME_TYPE_SEPIA effect_desc = "Produces cameras." plasmarequired = 2 itempath = /obj/item/camera /obj/item/slimecross/industrial/cerulean - colour = "cerulean" + colour = SLIME_TYPE_CERULEAN effect_desc = "Produces normal slime extract enhancers." plasmarequired = 5 itempath = /obj/item/slimepotion/enhancer /obj/item/slimecross/industrial/pyrite - colour = "pyrite" + colour = SLIME_TYPE_PYRITE effect_desc = "Produces cans of spraypaint." plasmarequired = 2 itempath = /obj/item/toy/crayon/spraycan /obj/item/slimecross/industrial/red - colour = "red" + colour = SLIME_TYPE_RED effect_desc = "Produces blood orbs." plasmarequired = 5 itempath = /obj/item/slimecrossbeaker/bloodpack /obj/item/slimecross/industrial/green - colour = "green" + colour = SLIME_TYPE_GREEN effect_desc = "Produces self-use-only slime jelly autoinjectors." plasmarequired = 7 itempath = /obj/item/slimecrossbeaker/autoinjector/slimejelly /obj/item/slimecross/industrial/pink - colour = "pink" + colour = SLIME_TYPE_PINK effect_desc = "Produces synthpax and space drug autoinjectors." plasmarequired = 6 itempath = /obj/item/slimecrossbeaker/autoinjector/peaceandlove /obj/item/slimecross/industrial/gold - colour = "gold" + colour = SLIME_TYPE_GOLD effect_desc = "Produces random coins." plasmarequired = 10 @@ -174,31 +174,31 @@ Industrial extracts: ..() /obj/item/slimecross/industrial/oil - colour = "oil" + colour = SLIME_TYPE_OIL effect_desc = "Produces IEDs." plasmarequired = 4 itempath = /obj/item/grenade/iedcasing/spawned /obj/item/slimecross/industrial/black //What does this have to do with black slimes? No clue! Fun, though - colour = "black" + colour = SLIME_TYPE_BLACK effect_desc = "Produces slime brand regenerative cigarettes." plasmarequired = 6 itempath = /obj/item/storage/fancy/cigarettes/cigpack_xeno /obj/item/slimecross/industrial/lightpink - colour = "light pink" + colour = SLIME_TYPE_LIGHT_PINK effect_desc = "Produces heart shaped boxes that have candies in them." plasmarequired = 3 itempath = /obj/item/storage/fancy/heart_box /obj/item/slimecross/industrial/adamantine - colour = "adamantine" + colour = SLIME_TYPE_ADAMANTINE effect_desc = "Produces sheets of adamantine." plasmarequired = 10 itempath = /obj/item/stack/sheet/mineral/adamantine /obj/item/slimecross/industrial/rainbow - colour = "rainbow" + colour = SLIME_TYPE_RAINBOW effect_desc = "Produces random slime extracts." plasmarequired = 5 //Item picked below. diff --git a/code/modules/research/xenobiology/crossbreeding/prismatic.dm b/code/modules/research/xenobiology/crossbreeding/prismatic.dm index 9cfc4542d526d..95e3c77e4d625 100644 --- a/code/modules/research/xenobiology/crossbreeding/prismatic.dm +++ b/code/modules/research/xenobiology/crossbreeding/prismatic.dm @@ -19,7 +19,7 @@ Prismatic extracts: playsound(target, 'sound/effects/slosh.ogg', 20, TRUE) /obj/item/slimecross/prismatic/grey/ - colour = "grey" + colour = SLIME_TYPE_GREY desc = "It's constantly wet with a pungent-smelling, clear chemical." /obj/item/slimecross/prismatic/grey/afterattack(turf/target, mob/user, proximity) @@ -32,87 +32,87 @@ Prismatic extracts: /obj/item/slimecross/prismatic/orange paintcolor = "#FFA500" - colour = "orange" + colour = SLIME_TYPE_ORANGE /obj/item/slimecross/prismatic/purple paintcolor = "#B19CD9" - colour = "purple" + colour = SLIME_TYPE_PURPLE /obj/item/slimecross/prismatic/blue paintcolor = "#ADD8E6" - colour = "blue" + colour = SLIME_TYPE_BLUE /obj/item/slimecross/prismatic/metal paintcolor = "#7E7E7E" - colour = "metal" + colour = SLIME_TYPE_METAL /obj/item/slimecross/prismatic/yellow paintcolor = "#FFFF00" - colour = "yellow" + colour = SLIME_TYPE_YELLOW /obj/item/slimecross/prismatic/darkpurple paintcolor = "#551A8B" - colour = "dark purple" + colour = SLIME_TYPE_DARK_PURPLE /obj/item/slimecross/prismatic/darkblue paintcolor = "#0000FF" - colour = "dark blue" + colour = SLIME_TYPE_DARK_BLUE /obj/item/slimecross/prismatic/silver paintcolor = "#D3D3D3" - colour = "silver" + colour = SLIME_TYPE_SILVER /obj/item/slimecross/prismatic/bluespace paintcolor = "#32CD32" - colour = "bluespace" + colour = SLIME_TYPE_BLUESPACE /obj/item/slimecross/prismatic/sepia paintcolor = "#704214" - colour = "sepia" + colour = SLIME_TYPE_SEPIA /obj/item/slimecross/prismatic/cerulean paintcolor = "#2956B2" - colour = "cerulean" + colour = SLIME_TYPE_CERULEAN /obj/item/slimecross/prismatic/pyrite paintcolor = "#FAFAD2" - colour = "pyrite" + colour = SLIME_TYPE_PYRITE /obj/item/slimecross/prismatic/red paintcolor = "#FF0000" - colour = "red" + colour = SLIME_TYPE_RED /obj/item/slimecross/prismatic/green paintcolor = "#00FF00" - colour = "green" + colour = SLIME_TYPE_GREEN /obj/item/slimecross/prismatic/pink paintcolor = "#FF69B4" - colour = "pink" + colour = SLIME_TYPE_PINK /obj/item/slimecross/prismatic/gold paintcolor = "#FFD700" - colour = "gold" + colour = SLIME_TYPE_GOLD /obj/item/slimecross/prismatic/oil paintcolor = "#505050" - colour = "oil" + colour = SLIME_TYPE_OIL /obj/item/slimecross/prismatic/black paintcolor = "#000000" - colour = "black" + colour = SLIME_TYPE_BLACK /obj/item/slimecross/prismatic/lightpink paintcolor = "#FFB6C1" - colour = "light pink" + colour = SLIME_TYPE_LIGHT_PINK /obj/item/slimecross/prismatic/adamantine paintcolor = "#008B8B" - colour = "adamantine" + colour = SLIME_TYPE_ADAMANTINE /obj/item/slimecross/prismatic/rainbow paintcolor = "#FFFFFF" - colour = "rainbow" + colour = SLIME_TYPE_RAINBOW /obj/item/slimecross/prismatic/rainbow/attack_self(mob/user) var/newcolor = input(user, "Choose the slime color:", "Color change",paintcolor) as color|null diff --git a/code/modules/research/xenobiology/crossbreeding/recurring.dm b/code/modules/research/xenobiology/crossbreeding/recurring.dm index 2c9f5f2d21ce1..c6ca420cc04fa 100644 --- a/code/modules/research/xenobiology/crossbreeding/recurring.dm +++ b/code/modules/research/xenobiology/crossbreeding/recurring.dm @@ -44,95 +44,95 @@ Recurring extracts: /obj/item/slimecross/recurring/grey extract_type = /obj/item/slime_extract/grey - colour = "grey" + colour = SLIME_TYPE_GREY /obj/item/slimecross/recurring/orange extract_type = /obj/item/slime_extract/orange - colour = "orange" + colour = SLIME_TYPE_ORANGE /obj/item/slimecross/recurring/purple extract_type = /obj/item/slime_extract/purple - colour = "purple" + colour = SLIME_TYPE_PURPLE /obj/item/slimecross/recurring/blue extract_type = /obj/item/slime_extract/blue - colour = "blue" + colour = SLIME_TYPE_BLUE /obj/item/slimecross/recurring/metal extract_type = /obj/item/slime_extract/metal - colour = "metal" + colour = SLIME_TYPE_METAL max_cooldown = 20 /obj/item/slimecross/recurring/yellow extract_type = /obj/item/slime_extract/yellow - colour = "yellow" + colour = SLIME_TYPE_YELLOW max_cooldown = 20 /obj/item/slimecross/recurring/darkpurple extract_type = /obj/item/slime_extract/darkpurple - colour = "dark purple" + colour = SLIME_TYPE_DARK_PURPLE max_cooldown = 20 /obj/item/slimecross/recurring/darkblue extract_type = /obj/item/slime_extract/darkblue - colour = "dark blue" + colour = SLIME_TYPE_DARK_BLUE /obj/item/slimecross/recurring/silver extract_type = /obj/item/slime_extract/silver - colour = "silver" + colour = SLIME_TYPE_SILVER /obj/item/slimecross/recurring/bluespace extract_type = /obj/item/slime_extract/bluespace - colour = "bluespace" + colour = SLIME_TYPE_BLUESPACE /obj/item/slimecross/recurring/sepia extract_type = /obj/item/slime_extract/sepia - colour = "sepia" + colour = SLIME_TYPE_SEPIA max_cooldown = 36 //No infinite timestop for you! /obj/item/slimecross/recurring/cerulean extract_type = /obj/item/slime_extract/cerulean - colour = "cerulean" + colour = SLIME_TYPE_CERULEAN /obj/item/slimecross/recurring/pyrite extract_type = /obj/item/slime_extract/pyrite - colour = "pyrite" + colour = SLIME_TYPE_PYRITE /obj/item/slimecross/recurring/red extract_type = /obj/item/slime_extract/red - colour = "red" + colour = SLIME_TYPE_RED /obj/item/slimecross/recurring/green extract_type = /obj/item/slime_extract/green - colour = "green" + colour = SLIME_TYPE_GREEN /obj/item/slimecross/recurring/pink extract_type = /obj/item/slime_extract/pink - colour = "pink" + colour = SLIME_TYPE_PINK /obj/item/slimecross/recurring/gold extract_type = /obj/item/slime_extract/gold - colour = "gold" + colour = SLIME_TYPE_GOLD max_cooldown = 30 /obj/item/slimecross/recurring/oil extract_type = /obj/item/slime_extract/oil - colour = "oil" //Why would you want this? + colour = SLIME_TYPE_OIL //Why would you want this? /obj/item/slimecross/recurring/black extract_type = /obj/item/slime_extract/black - colour = "black" + colour = SLIME_TYPE_BLACK /obj/item/slimecross/recurring/lightpink extract_type = /obj/item/slime_extract/lightpink - colour = "light pink" + colour = SLIME_TYPE_LIGHT_PINK /obj/item/slimecross/recurring/adamantine extract_type = /obj/item/slime_extract/adamantine - colour = "adamantine" + colour = SLIME_TYPE_ADAMANTINE max_cooldown = 20 /obj/item/slimecross/recurring/rainbow extract_type = /obj/item/slime_extract/rainbow - colour = "rainbow" + colour = SLIME_TYPE_RAINBOW max_cooldown = 40 //It's pretty powerful. diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm index 3e073191e5b3c..f0f395b33a613 100644 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm @@ -35,11 +35,11 @@ Regenerative extracts: qdel(src) /obj/item/slimecross/regenerative/grey - colour = "grey" //Has no bonus effect. + colour = SLIME_TYPE_GREY //Has no bonus effect. effect_desc = "Fully heals the target and does nothing else." /obj/item/slimecross/regenerative/orange - colour = "orange" + colour = SLIME_TYPE_ORANGE /obj/item/slimecross/regenerative/orange/core_effect_before(mob/living/target, mob/user) target.visible_message(span_warning("The [src] boils over!")) @@ -48,14 +48,14 @@ Regenerative extracts: new /obj/effect/hotspot(targetturf) /obj/item/slimecross/regenerative/purple - colour = "purple" + colour = SLIME_TYPE_PURPLE effect_desc = "Fully heals the target and injects them with some regen jelly." /obj/item/slimecross/regenerative/purple/core_effect(mob/living/target, mob/user) target.reagents.add_reagent(/datum/reagent/medicine/regen_jelly,10) /obj/item/slimecross/regenerative/blue - colour = "blue" + colour = SLIME_TYPE_BLUE effect_desc = "Fully heals the target and makes the floor wet." /obj/item/slimecross/regenerative/blue/core_effect(mob/living/target, mob/user) @@ -65,7 +65,7 @@ Regenerative extracts: target.visible_message(span_warning("The milky goo in the extract gets all over the floor!")) /obj/item/slimecross/regenerative/metal - colour = "metal" + colour = SLIME_TYPE_METAL effect_desc = "Fully heals the target and encases the target in a locker." /obj/item/slimecross/regenerative/metal/core_effect(mob/living/target, mob/user) @@ -76,7 +76,7 @@ Regenerative extracts: target.forceMove(C) /obj/item/slimecross/regenerative/yellow - colour = "yellow" + colour = SLIME_TYPE_YELLOW effect_desc = "Fully heals the target and fully recharges a single item on the target." /obj/item/slimecross/regenerative/yellow/core_effect(mob/living/target, mob/user) @@ -90,7 +90,7 @@ Regenerative extracts: to_chat(target, span_notice("You feel a strange electrical pulse, and one of your electrical items was recharged.")) /obj/item/slimecross/regenerative/darkpurple - colour = "dark purple" + colour = SLIME_TYPE_DARK_PURPLE effect_desc = "Fully heals the target and gives them purple clothing if they are naked." /obj/item/slimecross/regenerative/darkpurple/core_effect(mob/living/target, mob/user) @@ -103,7 +103,7 @@ Regenerative extracts: target.visible_message(span_notice("The milky goo congeals into clothing!")) /obj/item/slimecross/regenerative/darkblue - colour = "dark blue" + colour = SLIME_TYPE_DARK_BLUE effect_desc = "Fully heals the target and fireproofs their clothes." /obj/item/slimecross/regenerative/darkblue/core_effect(mob/living/target, mob/user) @@ -131,7 +131,7 @@ Regenerative extracts: C.resistance_flags |= FIRE_PROOF /obj/item/slimecross/regenerative/silver - colour = "silver" + colour = SLIME_TYPE_SILVER effect_desc = "Fully heals the target and makes their belly feel round and full." /obj/item/slimecross/regenerative/silver/core_effect(mob/living/target, mob/user) @@ -139,7 +139,7 @@ Regenerative extracts: to_chat(target, span_notice("You feel satiated.")) /obj/item/slimecross/regenerative/bluespace - colour = "bluespace" + colour = SLIME_TYPE_BLUESPACE effect_desc = "Fully heals the target and teleports them to where this core was created." var/turf/open/T @@ -155,7 +155,7 @@ Regenerative extracts: T = get_turf(src) /obj/item/slimecross/regenerative/sepia - colour = "sepia" + colour = SLIME_TYPE_SEPIA effect_desc = "Fully heals the target. After 10 seconds, relocate the target to the initial position the core was used with their previous health status." /obj/item/slimecross/regenerative/sepia/core_effect_before(mob/living/target, mob/user) @@ -163,7 +163,7 @@ Regenerative extracts: target.AddComponent(/datum/component/dejavu) /obj/item/slimecross/regenerative/cerulean - colour = "cerulean" + colour = SLIME_TYPE_CERULEAN effect_desc = "Fully heals the target and makes a second regenerative core with no special effects." /obj/item/slimecross/regenerative/cerulean/core_effect(mob/living/target, mob/user) @@ -175,7 +175,7 @@ Regenerative extracts: to_chat(user, span_notice("Some of the milky goo congeals in your hand!")) /obj/item/slimecross/regenerative/pyrite - colour = "pyrite" + colour = SLIME_TYPE_PYRITE effect_desc = "Fully heals and randomly colors the target." /obj/item/slimecross/regenerative/pyrite/core_effect(mob/living/target, mob/user) @@ -183,7 +183,7 @@ Regenerative extracts: target.add_atom_colour(rgb(rand(0,255),rand(0,255),rand(0,255)),WASHABLE_COLOUR_PRIORITY) /obj/item/slimecross/regenerative/red - colour = "red" + colour = SLIME_TYPE_RED effect_desc = "Fully heals the target and injects them with some ephedrine." /obj/item/slimecross/regenerative/red/core_effect(mob/living/target, mob/user) @@ -191,7 +191,7 @@ Regenerative extracts: target.reagents.add_reagent(/datum/reagent/medicine/ephedrine,3) /obj/item/slimecross/regenerative/green - colour = "green" + colour = SLIME_TYPE_GREEN effect_desc = "Fully heals the target and changes the spieces or color of a slime or jellyperson." /obj/item/slimecross/regenerative/green/core_effect(mob/living/target, mob/user) @@ -204,7 +204,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/pink - colour = "pink" + colour = SLIME_TYPE_PINK effect_desc = "Fully heals the target and injects them with some krokodil." /obj/item/slimecross/regenerative/pink/core_effect(mob/living/target, mob/user) @@ -212,7 +212,7 @@ Regenerative extracts: target.reagents.add_reagent(/datum/reagent/drug/krokodil,4) /obj/item/slimecross/regenerative/gold - colour = "gold" + colour = SLIME_TYPE_GOLD effect_desc = "Fully heals the target and produces a random coin." /obj/item/slimecross/regenerative/gold/core_effect(mob/living/target, mob/user) @@ -222,7 +222,7 @@ Regenerative extracts: target.put_in_hand(C) /obj/item/slimecross/regenerative/oil - colour = "oil" + colour = SLIME_TYPE_OIL effect_desc = "Fully heals the target and flashes everyone in sight." /obj/item/slimecross/regenerative/oil/core_effect(mob/living/target, mob/user) @@ -231,7 +231,7 @@ Regenerative extracts: L.flash_act() /obj/item/slimecross/regenerative/black - colour = "black" + colour = SLIME_TYPE_BLACK effect_desc = "Fully heals the target and creates an imperfect duplicate of them made of slime, that fakes their death." /obj/item/slimecross/regenerative/black/core_effect_before(mob/living/target, mob/user) @@ -253,7 +253,7 @@ Regenerative extracts: dummy.death() /obj/item/slimecross/regenerative/lightpink - colour = "light pink" + colour = SLIME_TYPE_LIGHT_PINK effect_desc = "Fully heals the target and also heals the user." /obj/item/slimecross/regenerative/lightpink/core_effect(mob/living/target, mob/user) @@ -266,14 +266,14 @@ Regenerative extracts: to_chat(U, span_notice("Some of the milky goo sprays onto you, as well!")) /obj/item/slimecross/regenerative/adamantine - colour = "adamantine" + colour = SLIME_TYPE_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" + colour = SLIME_TYPE_RAINBOW effect_desc = "Fully heals the target and temporarily makes them immortal, but pacifistic." /obj/item/slimecross/regenerative/rainbow/core_effect(mob/living/target, mob/user) diff --git a/code/modules/research/xenobiology/crossbreeding/reproductive.dm b/code/modules/research/xenobiology/crossbreeding/reproductive.dm index 01868915dc210..a0888c1c2f864 100644 --- a/code/modules/research/xenobiology/crossbreeding/reproductive.dm +++ b/code/modules/research/xenobiology/crossbreeding/reproductive.dm @@ -50,7 +50,7 @@ Reproductive extracts: return else if(istype(O, /obj/item/food/monkeycube)) - if(atom_storage?.attempt_insert(O, user, override = TRUE, force = TRUE)) + if(atom_storage?.attempt_insert(O, user, override = TRUE, force = STORAGE_FULLY_LOCKED)) to_chat(user, span_notice("You feed 1 Monkey Cube to [src], and it pulses gently.")) slime_storage?.processCubes(user) playsound(src, 'sound/items/eatfood.ogg', 20, TRUE) @@ -60,88 +60,88 @@ Reproductive extracts: /obj/item/slimecross/reproductive/grey extract_type = /obj/item/slime_extract/grey - colour = "grey" + colour = SLIME_TYPE_GREY /obj/item/slimecross/reproductive/orange extract_type = /obj/item/slime_extract/orange - colour = "orange" + colour = SLIME_TYPE_ORANGE /obj/item/slimecross/reproductive/purple extract_type = /obj/item/slime_extract/purple - colour = "purple" + colour = SLIME_TYPE_PURPLE /obj/item/slimecross/reproductive/blue extract_type = /obj/item/slime_extract/blue - colour = "blue" + colour = SLIME_TYPE_BLUE /obj/item/slimecross/reproductive/metal extract_type = /obj/item/slime_extract/metal - colour = "metal" + colour = SLIME_TYPE_METAL /obj/item/slimecross/reproductive/yellow extract_type = /obj/item/slime_extract/yellow - colour = "yellow" + colour = SLIME_TYPE_YELLOW /obj/item/slimecross/reproductive/darkpurple extract_type = /obj/item/slime_extract/darkpurple - colour = "dark purple" + colour = SLIME_TYPE_DARK_PURPLE /obj/item/slimecross/reproductive/darkblue extract_type = /obj/item/slime_extract/darkblue - colour = "dark blue" + colour = SLIME_TYPE_DARK_BLUE /obj/item/slimecross/reproductive/silver extract_type = /obj/item/slime_extract/silver - colour = "silver" + colour = SLIME_TYPE_SILVER /obj/item/slimecross/reproductive/bluespace extract_type = /obj/item/slime_extract/bluespace - colour = "bluespace" + colour = SLIME_TYPE_BLUESPACE /obj/item/slimecross/reproductive/sepia extract_type = /obj/item/slime_extract/sepia - colour = "sepia" + colour = SLIME_TYPE_SEPIA /obj/item/slimecross/reproductive/cerulean extract_type = /obj/item/slime_extract/cerulean - colour = "cerulean" + colour = SLIME_TYPE_CERULEAN /obj/item/slimecross/reproductive/pyrite extract_type = /obj/item/slime_extract/pyrite - colour = "pyrite" + colour = SLIME_TYPE_PYRITE /obj/item/slimecross/reproductive/red extract_type = /obj/item/slime_extract/red - colour = "red" + colour = SLIME_TYPE_RED /obj/item/slimecross/reproductive/green extract_type = /obj/item/slime_extract/green - colour = "green" + colour = SLIME_TYPE_GREEN /obj/item/slimecross/reproductive/pink extract_type = /obj/item/slime_extract/pink - colour = "pink" + colour = SLIME_TYPE_PINK /obj/item/slimecross/reproductive/gold extract_type = /obj/item/slime_extract/gold - colour = "gold" + colour = SLIME_TYPE_GOLD /obj/item/slimecross/reproductive/oil extract_type = /obj/item/slime_extract/oil - colour = "oil" + colour = SLIME_TYPE_OIL /obj/item/slimecross/reproductive/black extract_type = /obj/item/slime_extract/black - colour = "black" + colour = SLIME_TYPE_BLACK /obj/item/slimecross/reproductive/lightpink extract_type = /obj/item/slime_extract/lightpink - colour = "light pink" + colour = SLIME_TYPE_LIGHT_PINK /obj/item/slimecross/reproductive/adamantine extract_type = /obj/item/slime_extract/adamantine - colour = "adamantine" + colour = SLIME_TYPE_ADAMANTINE /obj/item/slimecross/reproductive/rainbow extract_type = /obj/item/slime_extract/rainbow - colour = "rainbow" + colour = SLIME_TYPE_RAINBOW diff --git a/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm b/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm index ab6f9381086a7..6fb3f8c7c9dcb 100644 --- a/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm +++ b/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm @@ -64,88 +64,88 @@ Self-sustaining extracts: /obj/item/slimecross/selfsustaining/grey extract_type = /obj/item/slime_extract/grey - colour = "grey" + colour = SLIME_TYPE_GREY /obj/item/slimecross/selfsustaining/orange extract_type = /obj/item/slime_extract/orange - colour = "orange" + colour = SLIME_TYPE_ORANGE /obj/item/slimecross/selfsustaining/purple extract_type = /obj/item/slime_extract/purple - colour = "purple" + colour = SLIME_TYPE_PURPLE /obj/item/slimecross/selfsustaining/blue extract_type = /obj/item/slime_extract/blue - colour = "blue" + colour = SLIME_TYPE_BLUE /obj/item/slimecross/selfsustaining/metal extract_type = /obj/item/slime_extract/metal - colour = "metal" + colour = SLIME_TYPE_METAL /obj/item/slimecross/selfsustaining/yellow extract_type = /obj/item/slime_extract/yellow - colour = "yellow" + colour = SLIME_TYPE_YELLOW /obj/item/slimecross/selfsustaining/darkpurple extract_type = /obj/item/slime_extract/darkpurple - colour = "dark purple" + colour = SLIME_TYPE_DARK_PURPLE /obj/item/slimecross/selfsustaining/darkblue extract_type = /obj/item/slime_extract/darkblue - colour = "dark blue" + colour = SLIME_TYPE_DARK_BLUE /obj/item/slimecross/selfsustaining/silver extract_type = /obj/item/slime_extract/silver - colour = "silver" + colour = SLIME_TYPE_SILVER /obj/item/slimecross/selfsustaining/bluespace extract_type = /obj/item/slime_extract/bluespace - colour = "bluespace" + colour = SLIME_TYPE_BLUESPACE /obj/item/slimecross/selfsustaining/sepia extract_type = /obj/item/slime_extract/sepia - colour = "sepia" + colour = SLIME_TYPE_SEPIA /obj/item/slimecross/selfsustaining/cerulean extract_type = /obj/item/slime_extract/cerulean - colour = "cerulean" + colour = SLIME_TYPE_CERULEAN /obj/item/slimecross/selfsustaining/pyrite extract_type = /obj/item/slime_extract/pyrite - colour = "pyrite" + colour = SLIME_TYPE_PYRITE /obj/item/slimecross/selfsustaining/red extract_type = /obj/item/slime_extract/red - colour = "red" + colour = SLIME_TYPE_RED /obj/item/slimecross/selfsustaining/green extract_type = /obj/item/slime_extract/green - colour = "green" + colour = SLIME_TYPE_GREEN /obj/item/slimecross/selfsustaining/pink extract_type = /obj/item/slime_extract/pink - colour = "pink" + colour = SLIME_TYPE_PINK /obj/item/slimecross/selfsustaining/gold extract_type = /obj/item/slime_extract/gold - colour = "gold" + colour = SLIME_TYPE_GOLD /obj/item/slimecross/selfsustaining/oil extract_type = /obj/item/slime_extract/oil - colour = "oil" + colour = SLIME_TYPE_OIL /obj/item/slimecross/selfsustaining/black extract_type = /obj/item/slime_extract/black - colour = "black" + colour = SLIME_TYPE_BLACK /obj/item/slimecross/selfsustaining/lightpink extract_type = /obj/item/slime_extract/lightpink - colour = "light pink" + colour = SLIME_TYPE_LIGHT_PINK /obj/item/slimecross/selfsustaining/adamantine extract_type = /obj/item/slime_extract/adamantine - colour = "adamantine" + colour = SLIME_TYPE_ADAMANTINE /obj/item/slimecross/selfsustaining/rainbow extract_type = /obj/item/slime_extract/rainbow - colour = "rainbow" + colour = SLIME_TYPE_RAINBOW diff --git a/code/modules/research/xenobiology/crossbreeding/stabilized.dm b/code/modules/research/xenobiology/crossbreeding/stabilized.dm index 0584927c6477c..eb49f5dc2c3a6 100644 --- a/code/modules/research/xenobiology/crossbreeding/stabilized.dm +++ b/code/modules/research/xenobiology/crossbreeding/stabilized.dm @@ -57,71 +57,71 @@ Stabilized extracts: //Colors and subtypes: /obj/item/slimecross/stabilized/grey - colour = "grey" + colour = SLIME_TYPE_GREY effect_desc = "Makes slimes friendly to the owner" /obj/item/slimecross/stabilized/orange - colour = "orange" + colour = SLIME_TYPE_ORANGE effect_desc = "Passively tries to increase or decrease the owner's body temperature to normal" /obj/item/slimecross/stabilized/purple - colour = "purple" + colour = SLIME_TYPE_PURPLE effect_desc = "Provides a regeneration effect" /obj/item/slimecross/stabilized/blue - colour = "blue" + colour = SLIME_TYPE_BLUE effect_desc = "Makes the owner immune to slipping on water, soap or foam. Space lube and ice are still too slippery." /obj/item/slimecross/stabilized/metal - colour = "metal" + colour = SLIME_TYPE_METAL effect_desc = "Every 30 seconds, adds a sheet of material to a random stack in the owner's backpack." /obj/item/slimecross/stabilized/yellow - colour = "yellow" + colour = SLIME_TYPE_YELLOW effect_desc = "Every ten seconds it recharges a device on the owner by 10%." /obj/item/slimecross/stabilized/darkpurple - colour = "dark purple" + colour = SLIME_TYPE_DARK_PURPLE effect_desc = "Gives you burning fingertips, automatically cooking any microwavable food you hold." /obj/item/slimecross/stabilized/darkblue - colour = "dark blue" + colour = SLIME_TYPE_DARK_BLUE effect_desc = "Slowly extinguishes the owner if they are on fire, also wets items like monkey cubes, creating a monkey." /obj/item/slimecross/stabilized/silver - colour = "silver" + colour = SLIME_TYPE_SILVER effect_desc = "Slows the rate at which the owner loses nutrition" /obj/item/slimecross/stabilized/bluespace - colour = "bluespace" + colour = SLIME_TYPE_BLUESPACE effect_desc = "On a two minute cooldown, when the owner has taken enough damage, they are teleported to a safe place." /obj/item/slimecross/stabilized/sepia - colour = "sepia" + colour = SLIME_TYPE_SEPIA effect_desc = "Randomly adjusts the owner's speed." /obj/item/slimecross/stabilized/cerulean - colour = "cerulean" + colour = SLIME_TYPE_CERULEAN effect_desc = "Creates a duplicate of the owner. If the owner dies they will take control of the duplicate, unless the death was from beheading or gibbing." /obj/item/slimecross/stabilized/pyrite - colour = "pyrite" + colour = SLIME_TYPE_PYRITE effect_desc = "Randomly colors the owner every few seconds." /obj/item/slimecross/stabilized/red - colour = "red" + colour = SLIME_TYPE_RED effect_desc = "Nullifies all equipment based slowdowns." /obj/item/slimecross/stabilized/green - colour = "green" + colour = SLIME_TYPE_GREEN effect_desc = "Changes the owner's name and appearance while holding this extract." /obj/item/slimecross/stabilized/pink - colour = "pink" + colour = SLIME_TYPE_PINK effect_desc = "As long as no creatures are harmed in the owner's presense, they will not attack you. If the peace is broken it takes two minutes to restore." /obj/item/slimecross/stabilized/gold - colour = "gold" + colour = SLIME_TYPE_GOLD effect_desc = "Creates a pet when held." var/mob_type var/datum/mind/saved_mind @@ -171,23 +171,23 @@ Stabilized extracts: START_PROCESSING(SSobj, src) /obj/item/slimecross/stabilized/oil - colour = "oil" + colour = SLIME_TYPE_OIL effect_desc = "The owner will violently explode when they die while holding this extract." /obj/item/slimecross/stabilized/black - colour = "black" + colour = SLIME_TYPE_BLACK effect_desc = "While strangling someone, the owner's hands melt around their neck, draining their life in exchange for food and healing." /obj/item/slimecross/stabilized/lightpink - colour = "light pink" + colour = SLIME_TYPE_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" + colour = SLIME_TYPE_ADAMANTINE effect_desc = "Owner gains a slight boost in damage resistance to all types." /obj/item/slimecross/stabilized/rainbow - colour = "rainbow" + colour = SLIME_TYPE_RAINBOW effect_desc = "Accepts a regenerative extract and automatically uses it if the owner enters a critical condition." var/obj/item/slimecross/regenerative/regencore diff --git a/code/modules/research/xenobiology/vatgrowing/biopsy_tool.dm b/code/modules/research/xenobiology/vatgrowing/biopsy_tool.dm index 957e5aa0d9390..8b0b007adee40 100644 --- a/code/modules/research/xenobiology/vatgrowing/biopsy_tool.dm +++ b/code/modules/research/xenobiology/vatgrowing/biopsy_tool.dm @@ -2,7 +2,7 @@ /obj/item/biopsy_tool name = "biopsy tool" desc = "Don't worry, it won't sting." - icon = 'icons/obj/xenobiology/vatgrowing.dmi' + icon = 'icons/obj/science/vatgrowing.dmi' icon_state = "biopsy" worn_icon_state = "biopsy" diff --git a/code/modules/research/xenobiology/vatgrowing/microscope.dm b/code/modules/research/xenobiology/vatgrowing/microscope.dm index e22c881a021ea..2e70d20faf07d 100644 --- a/code/modules/research/xenobiology/vatgrowing/microscope.dm +++ b/code/modules/research/xenobiology/vatgrowing/microscope.dm @@ -1,7 +1,7 @@ /obj/structure/microscope name = "Microscope" desc = "A simple microscope, allowing you to examine micro-organisms." - icon = 'icons/obj/xenobiology/vatgrowing.dmi' + icon = 'icons/obj/science/vatgrowing.dmi' icon_state = "microscope" var/obj/item/petri_dish/current_dish diff --git a/code/modules/research/xenobiology/vatgrowing/petri_dish.dm b/code/modules/research/xenobiology/vatgrowing/petri_dish.dm index 488890052ce7c..0187fa8eda359 100644 --- a/code/modules/research/xenobiology/vatgrowing/petri_dish.dm +++ b/code/modules/research/xenobiology/vatgrowing/petri_dish.dm @@ -2,7 +2,7 @@ /obj/item/petri_dish name = "petri dish" desc = "This makes you feel well-cultured." - icon = 'icons/obj/xenobiology/vatgrowing.dmi' + icon = 'icons/obj/science/vatgrowing.dmi' icon_state = "petri_dish" w_class = WEIGHT_CLASS_TINY ///The sample stored on the dish diff --git a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm b/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm index c756cc5a263f4..0152b343c45df 100644 --- a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm +++ b/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm @@ -10,11 +10,10 @@ supplementary_reagents = list( /datum/reagent/growthserum = 2, /datum/reagent/consumable/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/nutriment/fat/oil = 2, /datum/reagent/consumable/rice = 1, /datum/reagent/consumable/eggyolk = 1) @@ -167,7 +166,7 @@ /datum/reagent/medicine/insulin = -2) //depletes hunny. virus_suspectibility = 2 - resulting_atoms = list(/mob/living/simple_animal/hostile/bear = 1) + resulting_atoms = list(/mob/living/basic/bear = 1) /datum/micro_organism/cell_line/carp desc = "Cyprinid cells" @@ -176,9 +175,8 @@ /datum/reagent/consumable/nutriment) supplementary_reagents = list( - /datum/reagent/consumable/cornoil = 4, //Carp are oily fish + /datum/reagent/consumable/nutriment/fat/oil = 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( @@ -197,10 +195,9 @@ /datum/reagent/consumable/nutriment) supplementary_reagents = list( - /datum/reagent/consumable/cornoil = 4, + /datum/reagent/consumable/nutriment/fat/oil = 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( @@ -226,7 +223,7 @@ /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) + resulting_atoms = list(/mob/living/basic/snake = 1) /////////////////////////////////////////// @@ -251,7 +248,7 @@ 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. +/datum/micro_organism/cell_line/blob_spore //nuisance cell line desc = "Immature blob spores" required_reagents = list(/datum/reagent/consumable/nutriment/protein) @@ -262,10 +259,11 @@ suppressive_reagents = list( /datum/reagent/consumable/tinlux = -6, - /datum/reagent/napalm = -4) + /datum/reagent/napalm = -4, + /datum/reagent/medicine/psicodine = -2) //Blob zombies likely wouldn't appreciate psicodine so why this is here 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. + resulting_atoms = list(/mob/living/basic/blob_minion/spore = 2) //These are useless so we might as well spawn 2. /datum/micro_organism/cell_line/blobbernaut desc = "Blobular myocytes" @@ -284,7 +282,7 @@ suppressive_reagents = list(/datum/reagent/consumable/tinlux = -6) virus_suspectibility = 0 - resulting_atoms = list(/mob/living/simple_animal/hostile/blob/blobbernaut/independent = 1) + resulting_atoms = list(/mob/living/basic/blob_minion/blobbernaut = 1) /datum/micro_organism/cell_line/gelatinous_cube desc = "Cubic ooze particles" @@ -341,17 +339,18 @@ //////////////////// //// MISC //// //////////////////// -/datum/micro_organism/cell_line/cockroach //nuisance cell line designed to complicate the growing of slime type cell lines. +/datum/micro_organism/cell_line/cockroach //general nuisance cell line 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/growthserum = 1, /datum/reagent/toxin/slimejelly = 2, + /datum/reagent/yuck = 2, //Almost every fun recipe requires this. Making this value too high makes cockroaches extremely anti-fun. /datum/reagent/consumable/nutriment/vitamin = 1) suppressive_reagents = list( /datum/reagent/toxin/pestkiller = -2, + /datum/reagent/consumable/salt = -3, //Some salts are toxic to cockroaches, + helps makes the cell line more manageable /datum/reagent/consumable/poisonberryjuice = -4, /datum/reagent/consumable/ethanol/bug_spray = -4) @@ -482,7 +481,7 @@ /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)) + var/mob/selected_mob = pick(list(/mob/living/basic/clown/mutant/slow, /mob/living/basic/clown/fleshclown)) new selected_mob(get_turf(vat)) if(SEND_SIGNAL(vat.biological_sample, COMSIG_SAMPLE_GROWTH_COMPLETED) & SPARE_SAMPLE) @@ -510,7 +509,7 @@ /datum/reagent/consumable/nothing = -2, /datum/reagent/fuel/oil = -1) - resulting_atoms = list(/mob/living/simple_animal/hostile/retaliate/clown/banana = 1) + resulting_atoms = list(/mob/living/basic/clown/banana = 1) /datum/micro_organism/cell_line/clown/glutton desc = "hyperadipogenic clown stem cells" @@ -524,8 +523,7 @@ /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/nutriment/fat/oil = 3, /datum/reagent/consumable/space_cola = 1) suppressive_reagents = list( @@ -537,7 +535,7 @@ /datum/reagent/consumable/nothing = -2, /datum/reagent/toxin/bad_food = -1) - resulting_atoms = list(/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton = 1) + resulting_atoms = list(/mob/living/basic/clown/mutant/glutton = 1) /datum/micro_organism/cell_line/clown/longclown desc = "long clown bits" @@ -560,7 +558,7 @@ /datum/reagent/consumable/nothing = -2, /datum/reagent/sulfur = -1) - resulting_atoms = list(/mob/living/simple_animal/hostile/retaliate/clown/longface = 1) + resulting_atoms = list(/mob/living/basic/clown/longface = 1) /datum/micro_organism/cell_line/frog desc = "anura amphibian cells" @@ -629,7 +627,7 @@ /datum/reagent/copper = -1) virus_suspectibility = 0 - resulting_atoms = list(/mob/living/simple_animal/hostile/mushroom = 1) + resulting_atoms = list(/mob/living/basic/mushroom = 1) /datum/micro_organism/cell_line/queen_bee desc = "aphid cells" @@ -659,7 +657,7 @@ /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)) + new /mob/living/basic/bee(get_turf(vat)) if(SEND_SIGNAL(vat.biological_sample, COMSIG_SAMPLE_GROWTH_COMPLETED) & SPARE_SAMPLE) return QDEL_NULL(vat.biological_sample) @@ -734,6 +732,6 @@ /datum/reagent/drug/nicotine = -1, /datum/reagent/toxin/pestkiller = -1) - resulting_atoms = list(/mob/living/simple_animal/hostile/jungle/mega_arachnid = 1) + resulting_atoms = list(/mob/living/basic/mega_arachnid = 1) #undef VAT_GROWTH_RATE diff --git a/code/modules/research/xenobiology/vatgrowing/swab.dm b/code/modules/research/xenobiology/vatgrowing/swab.dm index 92dd767ea16d7..1027647b4c263 100644 --- a/code/modules/research/xenobiology/vatgrowing/swab.dm +++ b/code/modules/research/xenobiology/vatgrowing/swab.dm @@ -2,7 +2,7 @@ /obj/item/swab name = "swab" desc = "Some men use these for different reasons." - icon = 'icons/obj/xenobiology/vatgrowing.dmi' + icon = 'icons/obj/science/vatgrowing.dmi' icon_state = "swab" w_class = WEIGHT_CLASS_TINY diff --git a/code/modules/research/xenobiology/vatgrowing/vatgrower.dm b/code/modules/research/xenobiology/vatgrowing/vatgrower.dm index fecb437d2337b..ab2a732c9c523 100644 --- a/code/modules/research/xenobiology/vatgrowing/vatgrower.dm +++ b/code/modules/research/xenobiology/vatgrowing/vatgrower.dm @@ -4,9 +4,6 @@ desc = "Tastes just like the chef's soup." icon_state = "growing_vat" buffer = 300 - ///category for plumbing RCD - category = "Synthesizers" - ///List of all microbiological samples in this soup. var/datum/biological_sample/biological_sample @@ -124,13 +121,14 @@ balloon_alert_to_viewers("resampler [resampler_active ? "activated" : "deactivated"]") update_appearance() -/obj/machinery/plumbing/growing_vat/emag_act(mob/user) +/obj/machinery/plumbing/growing_vat/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE obj_flags |= EMAGGED playsound(src, SFX_SPARKS, 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - to_chat(user, span_warning("You overload [src]'s resampling circuit.")) + balloon_alert(user, "resampling circuit overloaded") flick("growing_vat_emagged", src) + return TRUE /obj/machinery/plumbing/growing_vat/proc/on_sample_growth_completed() SIGNAL_HANDLER diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index c741743118f9b..ac148161b03f2 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -69,12 +69,12 @@ connected_recycler = null return ..() -/obj/machinery/computer/camera_advanced/xenobio/handle_atom_del(atom/A) - if(A == current_potion) +/obj/machinery/computer/camera_advanced/xenobio/Exited(atom/movable/gone, direction) + . = ..() + if(gone == current_potion) current_potion = null - if(A in stored_slimes) - stored_slimes -= A - return ..() + if(gone in stored_slimes) + stored_slimes -= gone /obj/machinery/computer/camera_advanced/xenobio/CreateEye() eyeobj = new /mob/camera/ai_eye/remote/xenobio(get_turf(src)) diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 7c3465e9796ad..b3945fe60c437 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -105,7 +105,7 @@ if(SLIME_ACTIVATE_MAJOR) to_chat(user, span_notice("Your [name] starts pulsing...")) if(do_after(user, 40, target = user)) - var/mob/living/simple_animal/slime/S = new(get_turf(user), "grey") + var/mob/living/simple_animal/slime/S = new(get_turf(user), SLIME_TYPE_GREY) playsound(user, 'sound/effects/splat.ogg', 50, TRUE) to_chat(user, span_notice("You spit out [S].")) return 350 @@ -460,7 +460,7 @@ to_chat(user, span_userdanger("You explode!")) explosion(user, devastation_range = 1, heavy_impact_range = 3, light_impact_range = 6, explosion_cause = src) user.investigate_log("has been gibbed by an oil slime extract explosion.", INVESTIGATE_DEATHS) - user.gib() + user.gib(DROP_ALL_REMAINS) return to_chat(user, span_notice("You stop feeding [src], and the feeling passes.")) @@ -473,12 +473,13 @@ /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) + if(HAS_TRAIT(user, TRAIT_ADAMANTINE_EXTRACT_ARMOR)) to_chat(user, span_warning("Your skin is already hardened!")) return + ADD_TRAIT(user, TRAIT_ADAMANTINE_EXTRACT_ARMOR, ADAMANTINE_EXTRACT_TRAIT) 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) + user.physiology.damage_resistance += 25 + addtimer(CALLBACK(src, PROC_REF(reset_armor), user), 120 SECONDS) return 450 if(SLIME_ACTIVATE_MAJOR) @@ -489,9 +490,9 @@ 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/adamantine/proc/reset_armor(mob/living/carbon/human/user) + REMOVE_TRAIT(user, TRAIT_ADAMANTINE_EXTRACT_ARMOR, ADAMANTINE_EXTRACT_TRAIT) + user.physiology.damage_resistance -= 25 /obj/item/slime_extract/bluespace name = "bluespace slime extract" @@ -776,7 +777,6 @@ SEND_SIGNAL(switchy_mob, COMSIG_SIMPLEMOB_TRANSFERPOTION, user) switchy_mob.faction = user.faction.Copy() switchy_mob.copy_languages(user, LANGUAGE_MIND) - switchy_mob.update_atom_languages() user.death() to_chat(switchy_mob, span_notice("In a quick flash, you feel your consciousness flow into [switchy_mob]!")) to_chat(switchy_mob, span_warning("You are now [switchy_mob]. Your allegiances, alliances, and role is still the same as it was prior to consciousness transfer!")) diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm index a7bd8a57f91f0..66bf8b3bc93f3 100644 --- a/code/modules/security_levels/keycard_authentication.dm +++ b/code/modules/security_levels/keycard_authentication.dm @@ -9,13 +9,13 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new) /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, or to give the Janitor access to a department." - icon = 'icons/obj/monitors.dmi' + icon = 'icons/obj/machines/wallmounts.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 - var/datum/callback/ev + var/datum/callback/activated var/event = "" var/obj/machinery/keycard_auth/event_source var/mob/triggerer = null @@ -27,11 +27,11 @@ 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))) + activated = GLOB.keycard_events.addEvent("triggerEvent", CALLBACK(src, PROC_REF(triggerEvent))) /obj/machinery/keycard_auth/Destroy() - GLOB.keycard_events.clearEvent("triggerEvent", ev) - QDEL_NULL(ev) + GLOB.keycard_events.clearEvent("triggerEvent", activated) + activated = null return ..() /obj/machinery/keycard_auth/ui_state(mob/user) diff --git a/code/modules/security_levels/security_level_datums.dm b/code/modules/security_levels/security_level_datums.dm index ea78000ab099a..175b79d1c8771 100644 --- a/code/modules/security_levels/security_level_datums.dm +++ b/code/modules/security_levels/security_level_datums.dm @@ -45,7 +45,7 @@ sound = 'sound/misc/notice2.ogg' // Friendly beep number_level = SEC_LEVEL_GREEN lowering_to_configuration_key = /datum/config_entry/string/alert_green - shuttle_call_time_mod = 2 + shuttle_call_time_mod = ALERT_COEFF_GREEN /** * BLUE @@ -58,7 +58,7 @@ number_level = SEC_LEVEL_BLUE lowering_to_configuration_key = /datum/config_entry/string/alert_blue_downto elevating_to_configuration_key = /datum/config_entry/string/alert_blue_upto - shuttle_call_time_mod = 1 + shuttle_call_time_mod = ALERT_COEFF_BLUE /** * RED @@ -67,11 +67,11 @@ */ /datum/security_level/red name = "red" - sound = 'sound/misc/notice1.ogg' // The same angry alarm + sound = 'sound/misc/notice3.ogg' // More angry alarm number_level = SEC_LEVEL_RED lowering_to_configuration_key = /datum/config_entry/string/alert_red_downto elevating_to_configuration_key = /datum/config_entry/string/alert_red_upto - shuttle_call_time_mod = 0.5 + shuttle_call_time_mod = ALERT_COEFF_RED /** * DELTA @@ -80,7 +80,7 @@ */ /datum/security_level/delta name = "delta" - sound = 'sound/misc/notice1.ogg' // The same angry alarm, again + sound = 'sound/misc/airraid.ogg' // Air alarm to signify importance number_level = SEC_LEVEL_DELTA elevating_to_configuration_key = /datum/config_entry/string/alert_delta - shuttle_call_time_mod = 0.25 + shuttle_call_time_mod = ALERT_COEFF_DELTA diff --git a/code/modules/shuttle/assault_pod.dm b/code/modules/shuttle/assault_pod.dm index a40ba3793236b..609ef685a3f80 100644 --- a/code/modules/shuttle/assault_pod.dm +++ b/code/modules/shuttle/assault_pod.dm @@ -54,7 +54,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 in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/computer/shuttle)) if(S.shuttleId == shuttle_id) S.possible_destinations = "[landing_zone.shuttle_id]" diff --git a/code/modules/shuttle/battlecruiser_starfury.dm b/code/modules/shuttle/battlecruiser_starfury.dm index ce520aa1fcaa0..ab1f6802d43ee 100644 --- a/code/modules/shuttle/battlecruiser_starfury.dm +++ b/code/modules/shuttle/battlecruiser_starfury.dm @@ -154,7 +154,7 @@ if(!team) team = new() - var/obj/machinery/nuclearbomb/selfdestruct/nuke = locate() in GLOB.nuke_list + var/obj/machinery/nuclearbomb/selfdestruct/nuke = SSmachines.get_machines_by_type(/obj/machinery/nuclearbomb/selfdestruct)[1] if(nuke.r_code == NUKE_CODE_UNSET) nuke.r_code = random_nukecode() team.nuke = nuke diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm index 108ddf969e8c6..4065591582e26 100644 --- a/code/modules/shuttle/computer.dm +++ b/code/modules/shuttle/computer.dm @@ -160,8 +160,11 @@ validdest = TRUE //Found our destination, we can skip ahead now break if(!validdest) //Didn't find our destination in the list of valid destinations, something bad happening - log_admin("[user] attempted to href dock exploit on [src] with target location \"[dest_id]\"") - message_admins("[user] just attempted to href dock exploit on [src] with target location \"[dest_id]\"") + if(!isnull(user.client)) + log_admin("Warning: possible href exploit by [key_name(user)] - Attempted to dock [src] to illegal target location \"[url_encode(dest_id)]\"") + message_admins("Warning: possible href exploit by [key_name_admin(user)] [ADMIN_FLW(user)] - Attempted to dock [src] to illegal target location \"[url_encode(dest_id)]\"") + else + stack_trace("[user] ([user.type]) tried to send the shuttle [src] to the target location [dest_id], but the target location was not found in the list of valid destinations.") return SHUTTLE_CONSOLE_DESTINVALID switch(SSshuttle.moveShuttle(shuttleId, dest_id, TRUE)) if(DOCKING_SUCCESS) @@ -216,12 +219,13 @@ to_chat(GLOB.admins, "SHUTTLE: [ADMIN_LOOKUPFLW(usr)] (Move Shuttle)(Lock/Unlock Shuttle) is requesting to move or unlock the shuttle.") return TRUE -/obj/machinery/computer/shuttle/emag_act(mob/user) +/obj/machinery/computer/shuttle/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE req_access = list() obj_flags |= EMAGGED - to_chat(user, span_notice("You fried the consoles ID checking system.")) + balloon_alert(user, "id checking system fried") + return TRUE /obj/machinery/computer/shuttle/connect_to_shuttle(mapload, obj/docking_port/mobile/port, obj/docking_port/stationary/dock) if(!mapload) diff --git a/code/modules/shuttle/docking.dm b/code/modules/shuttle/docking.dm index 13c8fe5410b6c..32a1ca4950afa 100644 --- a/code/modules/shuttle/docking.dm +++ b/code/modules/shuttle/docking.dm @@ -46,7 +46,7 @@ rotation = SIMPLIFY_DEGREES(rotation) if(!movement_direction) - movement_direction = turn(preferred_direction, 180) + movement_direction = REVERSE_DIR(preferred_direction) var/list/moved_atoms = list() //Everything not a turf that gets moved in the shuttle var/list/areas_to_move = list() //unique assoc list of areas on turfs being moved diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 70eccdc788282..4a9feda1fc882 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -263,18 +263,22 @@ [hijack_completion_flight_time_set >= INFINITY ? "[scramble_message_replace_chars("\[ERROR\]")]" : hijack_completion_flight_time_set/10] seconds." : ""]" minor_announce(scramble_message_replace_chars(msg, replaceprob = 10), "Emergency Shuttle", TRUE) -/obj/machinery/computer/emergency_shuttle/emag_act(mob/user) +/obj/machinery/computer/emergency_shuttle/emag_act(mob/user, obj/item/card/emag/emag_card) // How did you even get on the shuttle before it go to the station? if(!IS_DOCKED) - return + return FALSE if((obj_flags & EMAGGED) || ENGINES_STARTED) //SYSTEM ERROR: THE SHUTTLE WILL LA-SYSTEM ERROR: THE SHUTTLE WILL LA-SYSTEM ERROR: THE SHUTTLE WILL LAUNCH IN 10 SECONDS - to_chat(user, span_warning("The shuttle is already about to launch!")) - return + balloon_alert(user, "shuttle already about to launch!") + return FALSE var/time = TIME_LEFT - message_admins("[ADMIN_LOOKUPFLW(user)] has emagged the emergency shuttle [time] seconds before launch.") - log_shuttle("[key_name(user)] has emagged the emergency shuttle in [COORD(src)] [time] seconds before launch.") + if (user) + message_admins("[ADMIN_LOOKUPFLW(user)] has emagged the emergency shuttle [time] seconds before launch.") + log_shuttle("[key_name(user)] has emagged the emergency shuttle in [COORD(src)] [time] seconds before launch.") + else + message_admins("The emergency shuttle was emagged [time] seconds before launch, with no emagger.") + log_shuttle("The emergency shuttle was emagged in [COORD(src)] [time] seconds before launch, with no emagger.") obj_flags |= EMAGGED SSshuttle.emergency.movement_force = list("KNOCKDOWN" = 60, "THROW" = 20)//YOUR PUNY SEATBELTS can SAVE YOU NOW, MORTAL @@ -290,6 +294,7 @@ authorized += ID process(SSMACHINES_DT) + return TRUE /obj/machinery/computer/emergency_shuttle/Destroy() // Our fake IDs that the emag generated are just there for colour @@ -311,6 +316,11 @@ var/sound_played = 0 //If the launch sound has been sent to all players on the shuttle itself var/hijack_status = NOT_BEGUN +/obj/docking_port/mobile/emergency/Initialize(mapload) + . = ..() + + setup_shuttle_events() + /obj/docking_port/mobile/emergency/canDock(obj/docking_port/stationary/S) return SHUTTLE_CAN_DOCK //If the emergency shuttle can't move, the whole game breaks, so it will force itself to land even if it has to crush a few departments in the process @@ -329,15 +339,9 @@ /obj/docking_port/mobile/emergency/request(obj/docking_port/stationary/S, area/signal_origin, reason, red_alert, set_coefficient=null) if(!isnum(set_coefficient)) - var/security_num = SSsecurity_level.get_current_level_as_number() - switch(security_num) - if(SEC_LEVEL_GREEN) - set_coefficient = 2 - if(SEC_LEVEL_BLUE) - set_coefficient = 1 - else - set_coefficient = 0.5 - var/call_time = SSshuttle.emergency_call_time * set_coefficient * engine_coeff + set_coefficient = SSsecurity_level.current_security_level.shuttle_call_time_mod + alert_coeff = set_coefficient + var/call_time = SSshuttle.emergency_call_time * alert_coeff * engine_coeff switch(mode) // The shuttle can not normally be called while "recalling", so // if this proc is called, it's via admin fiat @@ -460,6 +464,7 @@ send2adminchat("Server", "The Emergency Shuttle has docked with the station.") priority_announce("[SSshuttle.emergency] has docked with the station. You have [timeLeft(600)] minutes to board the Emergency Shuttle.", null, ANNOUNCER_SHUTTLEDOCK, "Priority") ShuttleDBStuff() + addtimer(CALLBACK(src, PROC_REF(announce_shuttle_events)), 20 SECONDS) if(SHUTTLE_DOCKED) @@ -513,6 +518,13 @@ INVOKE_ASYNC(SSticker, TYPE_PROC_REF(/datum/controller/subsystem/ticker, poll_hearts)) SSmapping.mapvote() //If no map vote has been run yet, start one. + if(!is_reserved_level(z)) + CRASH("Emergency shuttle did not move to transit z-level!") + + //Tell the events we're starting, so they can time their spawns or do some other stuff + for(var/datum/shuttle_event/event as anything in event_list) + event.start_up_event(SSshuttle.emergency_escape_time * engine_coeff) + if(SHUTTLE_STRANDED, SHUTTLE_DISABLED) SSshuttle.checkHostileEnvironment() @@ -538,6 +550,8 @@ if(istype(M, /obj/docking_port/mobile/pod)) M.parallax_slowdown() + process_events() + if(time_left <= 0) //move each escape pod to its corresponding escape dock for(var/obj/docking_port/mobile/port as anything in SSshuttle.mobile_docking_ports) @@ -552,7 +566,7 @@ destination_dock = "emergency_syndicate" minor_announce("Corruption detected in \ shuttle navigation protocols. Please contact your \ - supervisor.", "SYSTEM ERROR:", alert=TRUE) + supervisor.", "SYSTEM ERROR:", sound_override = 'sound/misc/announce_syndi.ogg') dock_id(destination_dock) mode = SHUTTLE_ENDGAME @@ -567,6 +581,16 @@ setTimer(SSshuttle.emergency_escape_time) priority_announce("The Emergency Shuttle is preparing for direct jump. Estimate [timeLeft(600)] minutes until the shuttle docks at Central Command.", null, null, "Priority") +///Generate a list of events to run during the departure +/obj/docking_port/mobile/emergency/proc/setup_shuttle_events() + var/list/names = list() + for(var/datum/shuttle_event/event as anything in subtypesof(/datum/shuttle_event)) + if(prob(initial(event.event_probability))) + event_list.Add(new event(src)) + names += initial(event.name) + if(LAZYLEN(names)) + log_game("[capitalize(name)] has selected the following shuttle events: [english_list(names)].") + /obj/docking_port/mobile/monastery name = "monastery pod" shuttle_id = "mining_common" //set so mining can call it down @@ -600,7 +624,7 @@ name = "pod control computer" locked = TRUE possible_destinations = "pod_asteroid" - icon = 'icons/obj/terminals.dmi' + icon = 'icons/obj/machines/wallmounts.dmi' icon_state = "pod_off" circuit = /obj/item/circuitboard/computer/emergency_pod light_color = LIGHT_COLOR_BLUE @@ -612,14 +636,15 @@ . = ..() RegisterSignal(SSsecurity_level, COMSIG_SECURITY_LEVEL_CHANGED, PROC_REF(check_lock)) -/obj/machinery/computer/shuttle/pod/emag_act(mob/user) +/obj/machinery/computer/shuttle/pod/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE obj_flags |= EMAGGED locked = FALSE - to_chat(user, span_warning("You fry the pod's alert level checking system.")) + balloon_alert(user, "alert level checking disabled") icon_screen = "emagged_general" update_appearance() + return TRUE /obj/machinery/computer/shuttle/pod/connect_to_shuttle(mapload, obj/docking_port/mobile/port, obj/docking_port/stationary/dock) . = ..() diff --git a/code/modules/shuttle/ferry.dm b/code/modules/shuttle/ferry.dm index 595ac0787b24d..14423abd580b5 100644 --- a/code/modules/shuttle/ferry.dm +++ b/code/modules/shuttle/ferry.dm @@ -8,9 +8,9 @@ var/allow_silicons = FALSE var/allow_emag = FALSE -/obj/machinery/computer/shuttle/ferry/emag_act(mob/user) +/obj/machinery/computer/shuttle/ferry/emag_act(mob/user, obj/item/card/emag/emag_card) if(!allow_emag) - to_chat(user, span_warning("[src]'s security firewall is far too powerful for you to bypass.")) + balloon_alert(user, "firewall too powerful!") return FALSE return ..() diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm index bc1164f56b2ae..03777cd2d5b54 100644 --- a/code/modules/shuttle/navigation_computer.dm +++ b/code/modules/shuttle/navigation_computer.dm @@ -30,7 +30,6 @@ /obj/machinery/computer/camera_advanced/shuttle_docker/Initialize(mapload) . = ..() - GLOB.navigation_computers += src actions += new /datum/action/innate/shuttledocker_rotate(src) actions += new /datum/action/innate/shuttledocker_place(src) @@ -50,8 +49,6 @@ /obj/machinery/computer/camera_advanced/shuttle_docker/Destroy() . = ..() - GLOB.navigation_computers -= src - if(my_port?.get_docked()) my_port.delete_after = TRUE my_port.shuttle_id = null diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 89fc0fc6c8ed3..c65a9ad123a59 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -35,7 +35,7 @@ All ShuttleMove procs go here SSblackbox.record_feedback("tally", "shuttle_gib", 1, M.type) log_shuttle("[key_name(M)] was shuttle gibbed by [shuttle].") M.investigate_log("has been gibbed by [shuttle].", INVESTIGATE_DEATHS) - M.gib() + M.gib(DROP_ALL_REMAINS) else //non-living mobs shouldn't be affected by shuttles, which is why this is an else diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 076ca28692a5c..723514ae94397 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -70,7 +70,7 @@ /obj/docking_port/has_gravity(turf/current_turf) return TRUE -/obj/docking_port/take_damage() +/obj/docking_port/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armour_penetration = 0) return /obj/docking_port/singularity_pull() @@ -239,6 +239,9 @@ for(var/turf/T in return_turfs()) T.turf_flags |= NO_RUINS + if(SSshuttle.initialized) + INVOKE_ASYNC(SSshuttle, TYPE_PROC_REF(/datum/controller/subsystem/shuttle, setup_shuttles), list(src)) + #ifdef DOCKING_PORT_HIGHLIGHT highlight("#f00") #endif @@ -382,8 +385,17 @@ /// This should be a unit test, but too much of our other code breaks during shuttle movement, so not yet, not yet. /proc/test_whiteship_sizes() var/obj/docking_port/stationary/port_type = /obj/docking_port/stationary/picked/whiteship - var/datum/turf_reservation/docking_yard = SSmapping.RequestBlockReservation(initial(port_type.width), initial(port_type.height)) - var/turf/spawnpoint = locate(docking_yard.bottom_left_coords[1] + initial(port_type.dwidth), docking_yard.bottom_left_coords[2] + initial(port_type.dheight), docking_yard.bottom_left_coords[3]) + var/datum/turf_reservation/docking_yard = SSmapping.request_turf_block_reservation( + initial(port_type.width), + initial(port_type.height), + 1, + ) + var/turf/bottom_left = docking_yard.bottom_left_turfs[1] + var/turf/spawnpoint = locate( + bottom_left.x + initial(port_type.dwidth), + bottom_left.y + initial(port_type.dheight), + bottom_left.z, + ) var/obj/docking_port/stationary/picked/whiteship/port = new(spawnpoint) var/list/ids = port.shuttlekeys @@ -439,7 +451,8 @@ var/current_engine_power = 0 ///How much engine power (thrust) the shuttle starts with at mapload. var/initial_engine_power = 0 - + ///Speed multiplier based on station alert level + var/alert_coeff = ALERT_COEFF_BLUE ///used as a timer (if you want time left to complete move, use timeLeft proc) var/timer var/last_timer_length @@ -476,6 +489,8 @@ ///if this shuttle can move docking ports other than the one it is docked at var/can_move_docking_ports = FALSE var/list/hidden_turfs = list() + ///List of shuttle events that can run or are running + var/list/datum/shuttle_event/event_list = list() #define WORLDMAXX_CUTOFF (world.maxx + 1) #define WORLDMAXY_CUTOFF (world.maxx + 1) @@ -785,7 +800,7 @@ if(sunset_mobs.mind && !istype(get_area(sunset_mobs), /area/shuttle/escape/brig)) sunset_mobs.mind.force_escaped = TRUE // Ghostize them and put them in nullspace stasis (for stat & possession checks) - sunset_mobs.notransform = TRUE + ADD_TRAIT(sunset_mobs, TRAIT_NO_TRANSFORM, REF(src)) sunset_mobs.ghostize(FALSE) sunset_mobs.moveToNullspace() @@ -818,7 +833,7 @@ return ripple_turfs /obj/docking_port/mobile/proc/check_poddoors() - for(var/obj/machinery/door/poddoor/shuttledock/pod in GLOB.airlocks) + for(var/obj/machinery/door/poddoor/shuttledock/pod as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/poddoor/shuttledock)) pod.check() /obj/docking_port/mobile/proc/dock_id(id) @@ -831,6 +846,7 @@ //used by shuttle subsystem to check timers /obj/docking_port/mobile/proc/check() check_effects() + //process_events() if you were to add events to non-escape shuttles, uncomment this if(mode == SHUTTLE_IGNITING) check_transit_zone() @@ -924,6 +940,20 @@ last_timer_length *= multiple setTimer(time_remaining) +/obj/docking_port/mobile/proc/alert_coeff_change(new_coeff) + if(isnull(new_coeff)) + return + + var/time_multiplier = new_coeff / alert_coeff + var/time_remaining = timer - world.time + if(time_remaining < 0 || !last_timer_length) + return + + time_remaining *= time_multiplier + last_timer_length *= time_multiplier + alert_coeff = new_coeff + setTimer(time_remaining) + /obj/docking_port/mobile/proc/invertTimer() if(!last_timer_length) return @@ -1136,13 +1166,17 @@ return FALSE return ..() - //Called when emergency shuttle leaves the station /obj/docking_port/mobile/proc/on_emergency_launch() if(launch_status == UNLAUNCHED) //Pods will not launch from the mine/planet, and other ships won't launch unless we tell them to. launch_status = ENDGAME_LAUNCHED enterTransit() +///Let people know shits about to go down +/obj/docking_port/mobile/proc/announce_shuttle_events() + for(var/datum/shuttle_event/event as anything in event_list) + notify_ghosts("The [name] has selected: [event.name]") + /obj/docking_port/mobile/emergency/on_emergency_launch() return @@ -1161,6 +1195,15 @@ /obj/docking_port/mobile/emergency/on_emergency_dock() return +///Process all the shuttle events for every shuttle tick we get +/obj/docking_port/mobile/proc/process_events() + var/list/removees + for(var/datum/shuttle_event/event as anything in event_list) + if(event.event_process() == SHUTTLE_EVENT_CLEAR) //if we return SHUTTLE_EVENT_CLEAR, we clean them up + LAZYADD(removees, event) + for(var/item in removees) + event_list.Remove(item) + #ifdef TESTING #undef DOCKING_PORT_HIGHLIGHT #endif diff --git a/code/modules/shuttle/shuttle_events/_shuttle_events.dm b/code/modules/shuttle/shuttle_events/_shuttle_events.dm new file mode 100644 index 0000000000000..35b00ac3e790a --- /dev/null +++ b/code/modules/shuttle/shuttle_events/_shuttle_events.dm @@ -0,0 +1,140 @@ +///An event that can run during shuttle flight, and will run for the duration of it (configurable) +/datum/shuttle_event + ///How we're announced to ghosts and stuff + var/name = "The concept of a shuttle event" + ///probability of this event to run from 0 to 100 + var/event_probability = 0 + ///Track if we're allowed to run, gets turned to TRUE when the activation timer hits + VAR_PRIVATE/active = FALSE + ///fraction of the escape timer at which we activate, 0 means we start running immediately + ///(so if activation timer is 0.2 and shuttle takes 3 minutes to get going, it will activate in 36 seconds) + ///We only care about the timer from the moment of launch, any speed changed afterwards are not worth dealing with + var/activation_fraction = 0 + ///when do we activate? + VAR_PRIVATE/activate_at + ///Our reference to the docking port and thus the shuttle + var/obj/docking_port/mobile/port + +/datum/shuttle_event/New(obj/docking_port/mobile/port) + . = ..() + + src.port = port + +/datum/shuttle_event/proc/start_up_event(evacuation_duration) + activate_at = world.time + evacuation_duration * activation_fraction + +///We got activated +/datum/shuttle_event/proc/activate() + return + +///Process with the SShutle subsystem. Return SHUTTLE_EVENT_CLEAR to self-destruct +/datum/shuttle_event/proc/event_process() + . = TRUE + + if(!active) + if(world.time < activate_at) + return FALSE + active = TRUE + . = activate() + +///Spawns objects, mobs, whatever with all the necessary code to make it hit and/or miss the shuttle +/datum/shuttle_event/simple_spawner + ///behaviour of spawning objects, if we spawn + var/spawning_flags = SHUTTLE_EVENT_MISS_SHUTTLE | SHUTTLE_EVENT_HIT_SHUTTLE + ///List of valid spawning turfs, generated from generate_spawning_turfs(), that will HIT the shuttle + var/list/turf/spawning_turfs_hit + ///List of valid spawning turfs, generated from generate_spawning_turfs(), that will MISS the shuttle + var/list/turf/spawning_turfs_miss + ///Chance, from 0 to 100, for something to spawn + var/spawn_probability_per_process = 0 + ///Increment if you want more stuff to spawn at once + var/spawns_per_spawn = 1 + ///weighted list with spawnable movables + var/list/spawning_list = list() + ///If set to TRUE, every time an object is spawned their weight is decreased untill they are removed + var/remove_from_list_when_spawned = FALSE + ///If set to true, we'll delete ourselves if we cant spawn anything anymore. Useful in conjunction with remove_from_list_when_spawned + var/self_destruct_when_empty = FALSE + +/datum/shuttle_event/simple_spawner/start_up_event(evacuation_duration) + ..() + + generate_spawning_turfs(port.return_coords(), spawning_flags, port.preferred_direction) + +///Bounding coords are list(x0, y0, x1, y1) where x0 and y0 are top-left +/datum/shuttle_event/simple_spawner/proc/generate_spawning_turfs(list/bounding_coords, spawning_behaviour, direction) + spawning_turfs_hit = list() //turfs that will drift its contents to miss the shuttle + spawning_turfs_miss = list() //turfs that will drift its contents to hit the shuttle + var/list/step_dir //vector, either -1, 0 or 1. once we get a corner (lets say top right), in which direction do we 'walk' to get the full side? (this case to the right, so (1, 0) + var/list/target_corner //Top left or bottom right corner + var/list/spawn_offset //bounding_coords is ONLY the shuttle, not the space around it, so offset spawn_tiles or stuff spawns on the walls of the shuttle + + switch(direction) + if(NORTH) //we're travelling north (so people get pushed south) + step_dir = list(1, 0) + target_corner = list(bounding_coords[1], bounding_coords[2]) + spawn_offset = list(0, SHUTTLE_TRANSIT_BORDER) + if(SOUTH) + step_dir = list(-1, 0) + target_corner = list(bounding_coords[3], bounding_coords[4]) + spawn_offset = list(0, -SHUTTLE_TRANSIT_BORDER) + if(EAST) + step_dir = list(0, 1) + target_corner = list(bounding_coords[3], bounding_coords[4]) + spawn_offset = list(SHUTTLE_TRANSIT_BORDER, 0) + if(WEST) + step_dir = list(0, -1) + target_corner = list(bounding_coords[1], bounding_coords[2]) + spawn_offset = list(-SHUTTLE_TRANSIT_BORDER, 0) + + if(spawning_behaviour & SHUTTLE_EVENT_HIT_SHUTTLE) + ///so we get either the horizontal width or vertical width, which would both equal the amount of spawn tiles + var/tile_amount = abs((direction == NORTH || SOUTH) ? bounding_coords[1] - bounding_coords[3] : bounding_coords[2] - bounding_coords[4]) + for(var/i in 0 to tile_amount) + var/list/target_coords = list(target_corner[1] + step_dir[1] * i + spawn_offset[1], target_corner[2] + step_dir[2] * i + spawn_offset[2]) + spawning_turfs_hit.Add(locate(target_coords[1], target_coords[2], port.z)) + if(spawning_behaviour & SHUTTLE_EVENT_MISS_SHUTTLE) + for(var/i in 1 to SHUTTLE_TRANSIT_BORDER) + //Get the corner tile, and move away from the shuttle and towards the cordon + spawning_turfs_miss.Add(locate(target_corner[1] - step_dir[1] * i + spawn_offset[1], target_corner[2] - step_dir[2] * i + spawn_offset[2], port.z)) + var/corner_delta = list(bounding_coords[3] - bounding_coords[1], bounding_coords[2] - bounding_coords[4]) + //Get the corner tile, but jump over the shuttle and then continue unto the cordon + spawning_turfs_miss.Add(locate(target_corner[1] + corner_delta[1] * step_dir[1] + step_dir[1] * i + spawn_offset[1], target_corner[2] + corner_delta[2] * step_dir[2] + step_dir[2] * i + spawn_offset[2], port.z)) + + +/datum/shuttle_event/simple_spawner/event_process() + . = ..() + + if(!.) + return + + if(!LAZYLEN(spawning_list)) + if(self_destruct_when_empty) + return SHUTTLE_EVENT_CLEAR + return + + if(prob(spawn_probability_per_process)) + for(var/i in 1 to spawns_per_spawn) + spawn_movable(get_type_to_spawn()) + +///Pick a random turf from the valid turfs we got. Overwrite if you need some custom picking +/datum/shuttle_event/simple_spawner/proc/get_spawn_turf() + RETURN_TYPE(/turf) + return pick(spawning_turfs_hit + spawning_turfs_miss) + +///Spawn stuff! if you're not using this, don't use the simple_spawner subtype +/datum/shuttle_event/simple_spawner/proc/spawn_movable(spawn_type) + post_spawn(new spawn_type (get_spawn_turf())) + +///Not technically a getter if remove_from_list_when_spawned=TRUE. Otherwise, this returns the type we're going to spawn and throw at the shuttle +/datum/shuttle_event/simple_spawner/proc/get_type_to_spawn() + . = pick_weight(spawning_list) + if(remove_from_list_when_spawned) //if we have this enabled, we decrease the pickweight by 1 till it runs out + spawning_list[.] -= 1 + if(spawning_list[.] < 1) + spawning_list.Remove(.) + +///Do any post-spawn edits you need to do +/datum/shuttle_event/simple_spawner/proc/post_spawn(atom/movable/spawnee) + ADD_TRAIT(spawnee, TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT, INNATE_TRAIT) //Lets us spawn and move further away from the shuttle without being teleported into space + ADD_TRAIT(spawnee, TRAIT_DEL_ON_SPACE_DUMP, INNATE_TRAIT) //if we hit the cordon, we get deleted. If the shuttle can make you, it can qdel you diff --git a/code/modules/shuttle/shuttle_events/carp.dm b/code/modules/shuttle/shuttle_events/carp.dm new file mode 100644 index 0000000000000..18529f1c02884 --- /dev/null +++ b/code/modules/shuttle/shuttle_events/carp.dm @@ -0,0 +1,62 @@ +///CARPTIDE! CARPTIDE! CARPTIDE! A swarm of carp will pass by and through the shuttle, including consequences of carp going through the shuttle +/datum/shuttle_event/simple_spawner/carp + name = "Carp Nest! (Very Dangerous!)" + event_probability = 0.4 + activation_fraction = 0.2 + + spawning_list = list(/mob/living/basic/carp = 12, /mob/living/basic/carp/mega = 3) + spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE | SHUTTLE_EVENT_MISS_SHUTTLE + spawn_probability_per_process = 20 + + remove_from_list_when_spawned = TRUE + self_destruct_when_empty = TRUE + +/datum/shuttle_event/simple_spawner/carp/post_spawn(mob/living/basic/carp/carpee) + . = ..() + //Give the carp the goal to migrate in a straight line so they dont just idle in hyperspace + carpee.migrate_to(list(WEAKREF(get_edge_target_turf(carpee.loc, angle2dir(dir2angle(port.preferred_direction) - 180))))) + +///CARPTIDE! CARPTIDE! CARPTIDE! Magical carp will attack the shuttle! +/datum/shuttle_event/simple_spawner/carp/magic + name = "Magical Carp Nest! (Very Dangerous!)" + event_probability = 0 + activation_fraction = 0.2 + + spawning_list = list(/mob/living/basic/carp/magic = 12, /mob/living/basic/carp/magic/chaos = 1) + spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE | SHUTTLE_EVENT_MISS_SHUTTLE + spawn_probability_per_process = 20 + + remove_from_list_when_spawned = TRUE + self_destruct_when_empty = TRUE + +///Spawn a bunch of friendly carp to view from inside the shuttle! May occassionally pass through and nibble some windows, but are otherwise pretty harmless +/datum/shuttle_event/simple_spawner/carp/friendly + name = "Passive Carp Nest! (Mostly Harmless!)" + event_probability = 3 + activation_fraction = 0.1 + + spawning_list = list(/mob/living/basic/carp/passive = 1) + spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE | SHUTTLE_EVENT_MISS_SHUTTLE + spawns_per_spawn = 2 + spawn_probability_per_process = 100 + + remove_from_list_when_spawned = FALSE + + ///Chance we hit the shuttle, instead of flying past it (most carp will go through anyway, and we dont want this to be too annoying to take away from the majesty) + var/hit_the_shuttle_chance = 1 + +/datum/shuttle_event/simple_spawner/carp/friendly/get_spawn_turf() + return prob(hit_the_shuttle_chance) ? pick(spawning_turfs_hit) : pick(spawning_turfs_miss) + +///Same as /friendly, but we only go through the shuttle, MUHAHAHAHAHAHA!! They dont actually harm anyone, but itll be a clusterfuck of confusion +/datum/shuttle_event/simple_spawner/carp/friendly_but_no_personal_space + name = "Comfortable Carp Nest going through the shuttle! (Extremely annoying and confusing!)" + event_probability = 0 + activation_fraction = 0.5 + + spawning_list = list(/mob/living/basic/carp/passive = 1) + spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE + spawns_per_spawn = 2 + spawn_probability_per_process = 100 + + remove_from_list_when_spawned = FALSE diff --git a/code/modules/shuttle/shuttle_events/meteors.dm b/code/modules/shuttle/shuttle_events/meteors.dm new file mode 100644 index 0000000000000..ef0b6002e5774 --- /dev/null +++ b/code/modules/shuttle/shuttle_events/meteors.dm @@ -0,0 +1,42 @@ +/datum/shuttle_event/simple_spawner/meteor + spawning_list = list(/obj/effect/meteor) + +/datum/shuttle_event/simple_spawner/meteor/post_spawn(atom/movable/spawnee) + . = ..() + ADD_TRAIT(spawnee, TRAIT_FREE_HYPERSPACE_MOVEMENT, INNATE_TRAIT) + +/datum/shuttle_event/simple_spawner/meteor/spawn_movable(spawn_type) + var/turf/spawn_turf = get_spawn_turf() + //invert the dir cause we shoot in the opposite direction we're flying + if(ispath(spawn_type, /obj/effect/meteor)) + post_spawn(new spawn_type (spawn_turf, get_edge_target_turf(spawn_turf, angle2dir(dir2angle(port.preferred_direction) - 180)))) + else //if you want to spawn some random garbage inbetween, go wild + post_spawn(new spawn_type (get_spawn_turf())) + +///Very weak meteors, but may very rarely actually hit the shuttle! +/datum/shuttle_event/simple_spawner/meteor/dust + name = "Dust Meteors! (Mostly Safe)" + event_probability = 2 + activation_fraction = 0.1 + + spawn_probability_per_process = 100 + spawns_per_spawn = 5 + spawning_list = list(/obj/effect/meteor/dust = 1, /obj/effect/meteor/sand = 1) + spawning_flags = SHUTTLE_EVENT_MISS_SHUTTLE | SHUTTLE_EVENT_HIT_SHUTTLE + ///We can, occassionally, hit the shuttle, but we dont do a lot of damage and should only do so pretty rarely + var/hit_the_shuttle_chance = 1 + +/datum/shuttle_event/simple_spawner/meteor/dust/get_spawn_turf() + return prob(hit_the_shuttle_chance) ? pick(spawning_turfs_hit) : pick(spawning_turfs_miss) + +///Okay this spawns a lot of really bad meteors, but they never hit the shuttle so it's perfectly safe (unless you go outside lol) +/datum/shuttle_event/simple_spawner/meteor/safe + name = "Various Meteors! (Safe)" + event_probability = 5 + activation_fraction = 0.1 + + spawn_probability_per_process = 100 + spawns_per_spawn = 6 + spawning_flags = SHUTTLE_EVENT_MISS_SHUTTLE + spawning_list = list(/obj/effect/meteor/medium = 10, /obj/effect/meteor/big = 5, /obj/effect/meteor/flaming = 3, /obj/effect/meteor/cluster = 1, + /obj/effect/meteor/irradiated = 3, /obj/effect/meteor/bluespace = 2) diff --git a/code/modules/shuttle/shuttle_events/misc.dm b/code/modules/shuttle/shuttle_events/misc.dm new file mode 100644 index 0000000000000..f65eddadf7cbf --- /dev/null +++ b/code/modules/shuttle/shuttle_events/misc.dm @@ -0,0 +1,61 @@ +///thats amoreeeeee +/datum/shuttle_event/simple_spawner/italian + name = "Italian Storm! (Mama Mia!)" + event_probability = 0.05 + + spawns_per_spawn = 5 + spawning_flags = SHUTTLE_EVENT_MISS_SHUTTLE | SHUTTLE_EVENT_HIT_SHUTTLE + spawn_probability_per_process = 100 + spawning_list = list(/obj/item/food/spaghetti/boiledspaghetti = 5, /obj/item/food/meatball = 1, /obj/item/food/spaghetti/pastatomato = 2, + /obj/item/food/spaghetti/meatballspaghetti = 2, /obj/item/food/pizza/margherita = 1) + +///We do a little bit of tomfoolery +/datum/shuttle_event/simple_spawner/fake_ttv + name = "Fake TTV (Harmless!)" + event_probability = 0.5 + activation_fraction = 0.1 + + spawning_list = list(/obj/item/transfer_valve/fake = 1) + spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE + spawn_probability_per_process = 5 + + remove_from_list_when_spawned = TRUE + self_destruct_when_empty = TRUE + +///Just spawn random maint garbage +/datum/shuttle_event/simple_spawner/maintenance + name = "Maintenance Debris (Harmless!)" + event_probability = 3 + activation_fraction = 0.1 + + spawning_list = list() + spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE | SHUTTLE_EVENT_MISS_SHUTTLE + spawn_probability_per_process = 100 + spawns_per_spawn = 2 + +/datum/shuttle_event/simple_spawner/maintenance/get_type_to_spawn() + var/list/spawn_list = GLOB.maintenance_loot + while(islist(spawn_list)) + spawn_list = pick_weight(spawn_list) + return spawn_list + +///Sensors indicate that a black hole's gravitational field is affecting the region of space we were headed through +/datum/shuttle_event/simple_spawner/black_hole + name = "Black Hole (Oh no!)" + event_probability = 0 // only admin spawnable + spawn_probability_per_process = 10 + activation_fraction = 0.35 + spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE + spawning_list = list(/obj/singularity/shuttle_event = 1) + // only spawn it once + remove_from_list_when_spawned = TRUE + self_destruct_when_empty = TRUE + +///Kobayashi Maru version +/datum/shuttle_event/simple_spawner/black_hole/adminbus + name = "Black Holes (OH GOD!)" + event_probability = 0 + spawn_probability_per_process = 50 + activation_fraction = 0.2 + spawning_list = list(/obj/singularity/shuttle_event = 10) + remove_from_list_when_spawned = TRUE diff --git a/code/modules/shuttle/shuttle_events/player_controlled.dm b/code/modules/shuttle/shuttle_events/player_controlled.dm new file mode 100644 index 0000000000000..40bc29f80175e --- /dev/null +++ b/code/modules/shuttle/shuttle_events/player_controlled.dm @@ -0,0 +1,75 @@ +///Mobs spawned with this one are automatically player controlled, if possible +/datum/shuttle_event/simple_spawner/player_controlled + spawning_list = list(/mob/living/basic/carp) + + ///If we cant find a ghost, do we spawn them anyway? Otherwise they go in the garbage bin + var/spawn_anyway_if_no_player = FALSE + + var/ghost_alert_string = "Would you like to be shot at the shuttle?" + + var/role_type = ROLE_SENTIENCE + +/datum/shuttle_event/simple_spawner/player_controlled/spawn_movable(spawn_type) + if(ispath(spawn_type, /mob/living)) + INVOKE_ASYNC(src, PROC_REF(try_grant_ghost_control), spawn_type) + else + ..() + +/// Attempt to grant control of a mob to ghosts before spawning it in. if spawn_anyway_if_no_player = TRUE, we spawn the mob even if there's no ghosts +/datum/shuttle_event/simple_spawner/player_controlled/proc/try_grant_ghost_control(spawn_type) + var/list/candidates = poll_ghost_candidates(ghost_alert_string + " (Warning: you will not be able to return to your body!)", role_type, FALSE, 10 SECONDS) + + if(!candidates.len && !spawn_anyway_if_no_player) + return + + var/mob/living/new_mob = new spawn_type (get_turf(get_spawn_turf())) + + if(candidates.len) + var/mob/dead/observer/candidate = pick(candidates) + new_mob.ckey = candidate.ckey + post_spawn(new_mob) + +///BACK FOR REVENGE!!! +/datum/shuttle_event/simple_spawner/player_controlled/alien_queen + name = "ALIEN QUEEN! (Kinda dangerous!)" + spawning_list = list(/mob/living/carbon/alien/adult/royal/queen = 1, /obj/vehicle/sealed/mecha/ripley = 1) + spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE + + event_probability = 0.2 + spawn_probability_per_process = 10 + activation_fraction = 0.5 + + spawn_anyway_if_no_player = FALSE + ghost_alert_string = "Would you like to be an alien queen shot at the shuttle?" + remove_from_list_when_spawned = TRUE + self_destruct_when_empty = TRUE + + role_type = ROLE_ALIEN + +///Spawns three player controlled carp!! Deadchats final chance to wreak havoc, probably really not that dangerous if even one person has a laser gun +/datum/shuttle_event/simple_spawner/player_controlled/carp + name = "Three player controlled carp! (Little dangerous!)" + spawning_list = list(/mob/living/basic/carp = 10, /mob/living/basic/carp/mega = 2, /mob/living/basic/carp/magic = 2, /mob/living/basic/carp/magic/chaos = 1) + spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE + + event_probability = 1 + spawn_probability_per_process = 10 + activation_fraction = 0.4 + + spawn_anyway_if_no_player = TRUE + ghost_alert_string = "Would you like to be a space carp to pester the emergency shuttle?" + remove_from_list_when_spawned = TRUE + self_destruct_when_empty = TRUE + + role_type = ROLE_SENTIENCE + + ///how many carp can we spawn max? + var/max_carp_spawns = 3 + +/datum/shuttle_event/simple_spawner/player_controlled/carp/New(obj/docking_port/mobile/port) + . = ..() + + var/list/spawning_list_copy = spawning_list.Copy() + spawning_list.Cut() + for(var/i in 1 to max_carp_spawns) + spawning_list[pick_weight(spawning_list_copy)] += 1 diff --git a/code/modules/shuttle/spaceship_navigation_beacon.dm b/code/modules/shuttle/spaceship_navigation_beacon.dm index f1a1dd575cc62..4ae91af588a23 100644 --- a/code/modules/shuttle/spaceship_navigation_beacon.dm +++ b/code/modules/shuttle/spaceship_navigation_beacon.dm @@ -1,60 +1,109 @@ -/obj/item/circuitboard/machine/spaceship_navigation_beacon - name = "Bluespace Navigation Gigabeacon (Machine Board)" - build_path = /obj/machinery/spaceship_navigation_beacon - req_components = list() - - /obj/machinery/spaceship_navigation_beacon - name = "Bluespace Navigation Gigabeacon" - desc = "A device that creates a bluespace anchor that allow ships jump near to it." - icon = 'icons/obj/abductor.dmi' - icon_state = "core" - base_icon_state = "core" + name = "radio navigation gigabeacon" + desc = "A device that constantly transmits its position over several different commonly used maritime navigation frequencies. Used to create shuttle navigation waypoints in unexplored or undeveloped areas." + icon = 'icons/obj/machines/navigation_beacon.dmi' + icon_state = "beacon_active" + base_icon_state = "beacon" density = TRUE - circuit = /obj/item/circuitboard/machine/spaceship_navigation_beacon - - var/locked = FALSE //Locked beacons don't allow to jump to it. + flags_1 = NODECONSTRUCT_1 + /// Locked beacons cannot be jumped to by ships. + var/locked = FALSE + /// Time between automated messages. + var/automatic_message_cooldown = 5 MINUTES + /// Next world tick to send an automatic message. + var/next_automatic_message_time + /// Our internal radio. + var/obj/item/radio/radio /obj/machinery/spaceship_navigation_beacon/Initialize(mapload) . = ..() SSshuttle.beacon_list |= src + name = "[initial(src.name)] [z]-[rand(0, 999)]" + + var/static/list/multitool_tips = list( + TOOL_MULTITOOL = list( + SCREENTIP_CONTEXT_LMB = "Edit beacon name", + SCREENTIP_CONTEXT_RMB = "Lock/Unlock beacon", + ) + ) + AddElement(/datum/element/contextual_screentip_tools, multitool_tips) + + radio = new(src) + radio.set_listening(FALSE) + radio.set_frequency(FREQ_RADIO_NAV_BEACON) + radio.freqlock = RADIO_FREQENCY_LOCKED + radio.recalculateChannels() + + START_PROCESSING(SSmachines, src) + COOLDOWN_START(src, next_automatic_message_time, automatic_message_cooldown) + /obj/machinery/spaceship_navigation_beacon/emp_act() locked = TRUE + update_icon_state() /obj/machinery/spaceship_navigation_beacon/Destroy() SSshuttle.beacon_list -= src return ..() -// update the icon_state /obj/machinery/spaceship_navigation_beacon/update_icon_state() - icon_state = "[base_icon_state][powered() ? null : "-open"]" + icon_state = "[base_icon_state][locked ? "_locked" : "_active"]" return ..() -/obj/machinery/spaceship_navigation_beacon/multitool_act(mob/living/user, obj/item/multitool/I) +/obj/machinery/spaceship_navigation_beacon/multitool_act(mob/living/user, obj/item/tool) ..() - if(panel_open) - var/chosen_tag = tgui_input_text(user, "Enter the custom name for this beacon", "Beacon Reclassification", max_length = MAX_NAME_LEN) - if(!chosen_tag) - return - var/new_name = "Beacon_[chosen_tag]" - if(new_name && Adjacent(user)) - name = new_name - to_chat(user, span_notice("You change beacon name to [name].")) - else - locked =!locked - to_chat(user, span_notice("You [locked ? "" : "un"]lock [src].")) + + var/chosen_tag = tgui_input_text(user, "Enter the custom name for this beacon", "Beacon Reclassification", max_length = MAX_NAME_LEN) + if(!chosen_tag) + return + + var/new_name = "[initial(src.name)] [chosen_tag]" + if(new_name && Adjacent(user)) + name = new_name + balloon_alert_to_viewers("beacon renamed") + + return TRUE + +/obj/machinery/spaceship_navigation_beacon/multitool_act_secondary(mob/living/user, obj/item/tool) + ..() + + locked = !locked + + balloon_alert_to_viewers("[!locked ? "unlocked" : "locked"]") + update_icon_state() + return TRUE /obj/machinery/spaceship_navigation_beacon/examine() .=..() - . += "Status: [locked ? "LOCKED" : "Stable"] " + . += span_notice("'[FREQ_RADIO_NAV_BEACON / 10] kHz' is printed on the side.") + if(locked) + . += span_warning("The blinking red light on the front indicates that this beacon is LOCKED.") + else + . += span_notice("The blinking green light on the front indicates that this beacon is operating normally.") -/obj/machinery/spaceship_navigation_beacon/attackby(obj/item/W, mob/user, params) - if(default_deconstruction_screwdriver(user, "core-open", "core", W)) - return - if(default_deconstruction_crowbar(W)) - return +/obj/machinery/spaceship_navigation_beacon/process(seconds_per_tick) + if(COOLDOWN_FINISHED(src, next_automatic_message_time) && radio) + var/automatic_nav_message = "[src], Sector [z], [locked ? "Beacon Locked" : "Beacon Operational"], Grid Coordinates, [x] East, [y] North." - return ..() + radio.talk_into(src, "[automatic_nav_message]") + + COOLDOWN_START(src, next_automatic_message_time, automatic_message_cooldown) + +// Item used to actually make nav beacons + +/obj/item/folded_navigation_gigabeacon + name = "compact radio navigation gigabeacon" + desc = "A compact radio navigation gigabeacon, a device used to provide shuttle navigation waypoints in unexplored areas. Must be deployed before use." + icon = 'icons/obj/machines/navigation_beacon.dmi' + icon_state = "beacon_folded" + +/obj/item/folded_navigation_gigabeacon/Initialize(mapload) + . = ..() + AddComponent(/datum/component/deployable, 3 SECONDS, /obj/machinery/spaceship_navigation_beacon, delete_on_use = TRUE) + +/obj/item/folded_navigation_gigabeacon/examine() + .=..() + . += span_notice("The backside has instructions in various galactic languages detailing how this can be deployed in hand without any special tools.") + . += span_notice("'[FREQ_RADIO_NAV_BEACON / 10] kHz' is printed on the side.") diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index c28aaf2731c1b..5c1e21c56fb4e 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -6,7 +6,7 @@ /obj/machinery/power/emitter/energycannon name = "Energy Cannon" desc = "A heavy duty industrial laser." - icon = 'icons/obj/engine/singularity.dmi' + icon = 'icons/obj/machines/engine/singularity.dmi' icon_state = "emitter_+a" base_icon_state = "emitter_+a" anchored = TRUE @@ -68,8 +68,8 @@ /obj/machinery/power/emitter/energycannon/magical/ex_act(severity) return FALSE -/obj/machinery/power/emitter/energycannon/magical/emag_act(mob/user) - return +/obj/machinery/power/emitter/energycannon/magical/emag_act(mob/user, obj/item/card/emag/emag_card) + return FALSE /obj/structure/table/abductor/wabbajack name = "wabbajack altar" @@ -169,9 +169,7 @@ /mob/living/simple_animal/drone/snowflake/bardrone/Initialize(mapload) . = ..() access_card.add_access(list(ACCESS_CENT_BAR)) - become_area_sensitive(ROUNDSTART_TRAIT) - RegisterSignal(src, COMSIG_ENTER_AREA, PROC_REF(check_barstaff_godmode)) - check_barstaff_godmode() + AddComponentFrom(ROUNDSTART_TRAIT, /datum/component/area_based_godmode, area_type = /area/shuttle/escape, allow_area_subtypes = TRUE) /mob/living/simple_animal/hostile/alien/maid/barmaid gold_core_spawnable = NO_SPAWN @@ -192,22 +190,12 @@ access_card.add_access(cap_trim.access + cap_trim.wildcard_access + list(ACCESS_CENT_BAR)) ADD_TRAIT(access_card, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) - become_area_sensitive(ROUNDSTART_TRAIT) - RegisterSignal(src, COMSIG_ENTER_AREA, PROC_REF(check_barstaff_godmode)) - check_barstaff_godmode() + AddComponentFrom(ROUNDSTART_TRAIT, /datum/component/area_based_godmode, area_type = /area/shuttle/escape, allow_area_subtypes = TRUE) /mob/living/simple_animal/hostile/alien/maid/barmaid/Destroy() qdel(access_card) . = ..() -/mob/living/simple_animal/proc/check_barstaff_godmode() - SIGNAL_HANDLER - - if(istype(get_area(loc), /area/shuttle/escape)) - status_flags |= GODMODE - else - status_flags &= ~GODMODE - // Bar table, a wooden table that kicks you in a direction if you're not // barstaff (defined as someone who was a roundstart bartender or someone // with CENTCOM_BARSTAFF) @@ -289,8 +277,8 @@ /obj/machinery/scanner_gate/luxury_shuttle/attackby(obj/item/W, mob/user, params) return -/obj/machinery/scanner_gate/luxury_shuttle/emag_act(mob/user) - return +/obj/machinery/scanner_gate/luxury_shuttle/emag_act(mob/user, obj/item/card/emag/emag_card) + return FALSE #define LUXURY_MESSAGE_COOLDOWN 100 /obj/machinery/scanner_gate/luxury_shuttle/Bumped(atom/movable/AM) @@ -423,7 +411,7 @@ alarm_beep() return ..() -/mob/living/simple_animal/hostile/bear/fightpit +/mob/living/basic/bear/fightpit name = "fight pit bear" desc = "This bear's trained through ancient Russian secrets to fear the walls of its glass prison." environment_smash = ENVIRONMENT_SMASH_NONE diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index 15577f348d4f8..0999ef3994d41 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -25,6 +25,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( /obj/item/swapper, /obj/docking_port, /obj/machinery/launchpad, + /obj/machinery/exodrone_launcher, /obj/machinery/disposal, /obj/structure/disposalpipe, /obj/item/mail, @@ -60,17 +61,61 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( /obj/docking_port/mobile/supply/proc/check_blacklist(areaInstances) for(var/place in areaInstances) var/area/shuttle/shuttle_area = place - for(var/turf/shuttle_turf in shuttle_area) + for(var/turf/shuttle_turf in shuttle_area.get_contained_turfs()) for(var/atom/passenger in shuttle_turf.get_all_contents()) if((is_type_in_typecache(passenger, GLOB.blacklisted_cargo_types) || HAS_TRAIT(passenger, TRAIT_BANNED_FROM_CARGO_SHUTTLE)) && !istype(passenger, /obj/docking_port)) return FALSE return TRUE +/// Returns anything on the cargo blacklist found within areas_to_check back to the turf of the home docking port via Centcom branded supply pod. +/obj/docking_port/mobile/supply/proc/return_blacklisted_things_home(list/area/areas_to_check, obj/docking_port/stationary/home) + var/list/stuff_to_send_home = list() + for(var/area/shuttle_area as anything in areas_to_check) + for(var/turf/shuttle_turf in shuttle_area.get_contained_turfs()) + for(var/atom/passenger in shuttle_turf.get_all_contents()) + if((is_type_in_typecache(passenger, GLOB.blacklisted_cargo_types) || HAS_TRAIT(passenger, TRAIT_BANNED_FROM_CARGO_SHUTTLE)) && !istype(passenger, /obj/docking_port)) + stuff_to_send_home += passenger + + if(!length(stuff_to_send_home)) + return FALSE + + var/obj/structure/closet/supplypod/centcompod/et_go_home = new() + + for(var/atom/movable/et as anything in stuff_to_send_home) + et.forceMove(et_go_home) + + new /obj/effect/pod_landingzone(get_turf(home), et_go_home) + + return stuff_to_send_home + /obj/docking_port/mobile/supply/request(obj/docking_port/stationary/S) if(mode != SHUTTLE_IDLE) return 2 return ..() +/obj/docking_port/mobile/supply/check_dock(obj/docking_port/stationary/S, silent) + . = ..() + + if(!.) + return + + // If we're not trying to dock at Centcom, we don't care. + if(S.shuttle_id != "cargo_away") + return + + // Else we are docking at Centcom, check the blacklist to make sure no contraband was put onto the shuttle mid-transit. + // If there's anything contrabandy, send these items back to the origin docking port. + // This is a sort of catch-all Centcom exploit check. + var/list/stuff_sent_home = return_blacklisted_things_home(shuttle_areas, previous) + if(!length(stuff_sent_home)) + return + + for(var/atom/thing_sent_home as anything in stuff_sent_home) + investigate_log("Blacklisted item found on in-transit Cargo Shuttle: [thing_sent_home] ([thing_sent_home.type])", INVESTIGATE_CARGO) + + message_admins("Blacklisted item found on in-transit Cargo Shuttle. See cargo logs for more details.") + SSshuttle.centcom_message = "Contraband found on Cargo Shuttle. This has been returned via drop pod." + /obj/docking_port/mobile/supply/initiate_docking() if(getDockedId() == "cargo_away") // Buy when we leave home. buy() @@ -160,7 +205,8 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( QDEL_NULL(spawning_order.applied_coupon) if(!spawning_order.pack.goody) //we handle goody crates below - spawning_order.generate(pick_n_take(empty_turfs)) + var/obj/structure/closet/crate = spawning_order.generate(pick_n_take(empty_turfs)) + crate.name += " - #[spawning_order.id]" SSblackbox.record_feedback("nested tally", "cargo_imports", 1, list("[spawning_order.pack.get_cost()]", "[spawning_order.pack.name]")) @@ -262,5 +308,17 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( new /obj/structure/closet/crate/mail/economy(pick(empty_turfs)) +/// Takes a supply pack, returns the amount we currently have on order (or OVER_ORDER_LIMIT if we are over the hardcap on orders of this type) +/obj/docking_port/mobile/supply/proc/get_order_count(datum/supply_pack/ordering) + var/similar_count = 0 + for(var/datum/supply_order/order as anything in (SSshuttle.shopping_list | SSshuttle.request_list)) + if(order.pack == ordering) + similar_count += 1 + + if(similar_count >= CARGO_MAX_ORDER) + return OVER_ORDER_LIMIT + + return similar_count + #undef GOODY_FREE_SHIPPING_MAX #undef CRATE_TAX diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm index 9ba2452afe7ae..dcb8748bfcba5 100644 --- a/code/modules/shuttle/syndicate.dm +++ b/code/modules/shuttle/syndicate.dm @@ -32,7 +32,7 @@ /obj/machinery/computer/shuttle/syndicate/drop_pod name = "syndicate assault pod control" desc = "Controls the drop pod's launch system." - icon = 'icons/obj/terminals.dmi' + icon = 'icons/obj/machines/wallmounts.dmi' icon_state = "pod_off" icon_keyboard = null icon_screen = "pod_on" diff --git a/code/modules/shuttle/white_ship.dm b/code/modules/shuttle/white_ship.dm index e451844f8ced4..b222fde787b0f 100644 --- a/code/modules/shuttle/white_ship.dm +++ b/code/modules/shuttle/white_ship.dm @@ -15,19 +15,6 @@ . = ..() AddComponent(/datum/component/gps, SPACE_SIGNAL_GPSTAG) -/obj/machinery/computer/shuttle/white_ship/pod - name = "Salvage Pod Console" - desc = "Used to control the Salvage Pod." - circuit = /obj/item/circuitboard/computer/white_ship/pod - shuttleId = "whiteship_pod" - possible_destinations = "whiteship_pod_home;whiteship_pod_custom" - -/obj/machinery/computer/shuttle/white_ship/pod/recall - name = "Salvage Pod Recall Console" - desc = "Used to recall the Salvage Pod." - circuit = /obj/item/circuitboard/computer/white_ship/pod/recall - possible_destinations = "whiteship_pod_home" - /obj/machinery/computer/camera_advanced/shuttle_docker/whiteship name = "White Ship Navigation Computer" desc = "Used to designate a precise transit location for the White Ship." @@ -40,17 +27,6 @@ y_offset = -10 designate_time = 100 -/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship/pod - name = "Salvage Pod Navigation Computer" - desc = "Used to designate a precise transit location for the Salvage Pod." - shuttleId = "whiteship_pod" - shuttlePortId = "whiteship_pod_custom" - jump_to_ports = list("whiteship_pod_home" = 1) - view_range = 0 - x_offset = -2 - y_offset = 0 - designate_time = 0 - /obj/machinery/computer/camera_advanced/shuttle_docker/whiteship/Initialize(mapload) . = ..() GLOB.jam_on_wardec += src diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index 509081bc5577b..d4d6938d28148 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -103,7 +103,7 @@ if(spell_requirements & SPELL_REQUIRES_STATION) RegisterSignal(owner, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(update_status_on_signal)) if(spell_requirements & (SPELL_REQUIRES_NO_ANTIMAGIC|SPELL_REQUIRES_WIZARD_GARB)) - RegisterSignal(owner, COMSIG_MOB_EQUIPPED_ITEM, PROC_REF(update_status_on_signal)) + RegisterSignals(owner, list(COMSIG_MOB_EQUIPPED_ITEM, COMSIG_MOB_UNEQUIPPED_ITEM), PROC_REF(update_status_on_signal)) if(invocation_type == INVOCATION_EMOTE) RegisterSignals(owner, list(SIGNAL_ADDTRAIT(TRAIT_EMOTEMUTE), SIGNAL_REMOVETRAIT(TRAIT_EMOTEMUTE)), PROC_REF(update_status_on_signal)) if(invocation_type == INVOCATION_SHOUT || invocation_type == INVOCATION_WHISPER) @@ -119,6 +119,7 @@ COMSIG_MOB_AFTER_EXIT_JAUNT, COMSIG_MOB_ENTER_JAUNT, COMSIG_MOB_EQUIPPED_ITEM, + COMSIG_MOB_UNEQUIPPED_ITEM, COMSIG_MOVABLE_Z_CHANGED, SIGNAL_ADDTRAIT(TRAIT_EMOTEMUTE), SIGNAL_REMOVETRAIT(TRAIT_EMOTEMUTE), @@ -139,9 +140,11 @@ // Where the cast chain starts /datum/action/cooldown/spell/PreActivate(atom/target) - if(SEND_SIGNAL(owner, COMSIG_MOB_ABILITY_STARTED, src) & COMPONENT_BLOCK_ABILITY_START) + if(SEND_SIGNAL(owner, COMSIG_MOB_ABILITY_STARTED, src, target) & COMPONENT_BLOCK_ABILITY_START) return FALSE - if(!is_valid_target(target)) + if(target == owner) + target = get_caster_from_target(target) + if(isnull(target) || !is_valid_target(target)) return FALSE return Activate(target) @@ -164,7 +167,7 @@ // No point in feedback here, as mindless mobs aren't players return FALSE - if((spell_requirements & SPELL_REQUIRES_MIME_VOW) && !HAS_TRAIT(owner, TRAIT_MIMING)) + if((spell_requirements & SPELL_REQUIRES_MIME_VOW) && !HAS_MIND_TRAIT(owner, TRAIT_MIMING)) // In the future this can be moved out of spell checks exactly if(feedback) to_chat(owner, span_warning("You must dedicate yourself to silence first!")) @@ -177,18 +180,13 @@ to_chat(owner, span_warning("Some form of antimagic is preventing you from casting [src]!")) return FALSE - if(!(spell_requirements & SPELL_CASTABLE_WHILE_PHASED) && HAS_TRAIT(owner, TRAIT_MAGICALLY_PHASED)) - if(feedback) - to_chat(owner, span_warning("[src] cannot be cast unless you are completely manifested in the material plane!")) - return FALSE - - if(!try_invoke(feedback = feedback)) + if(!try_invoke(owner, feedback = feedback)) return FALSE if(ishuman(owner)) if(spell_requirements & SPELL_REQUIRES_WIZARD_GARB) var/mob/living/carbon/human/human_owner = owner - if(!(human_owner.wear_suit?.clothing_flags & CASTING_CLOTHES)) + if(!(human_owner.wear_suit?.clothing_flags & CASTING_CLOTHES) && !ismonkey(human_owner)) // Monkeys don't need robes to cast as they are inherently imbued with power from the banana dimension if(feedback) to_chat(owner, span_warning("You don't feel strong enough without your robe!")) return FALSE @@ -198,21 +196,30 @@ return FALSE else - // If the spell requires wizard equipment and we're not a human (can't wear robes or hats), that's just a given - if(spell_requirements & (SPELL_REQUIRES_WIZARD_GARB|SPELL_REQUIRES_HUMAN)) + // If you strictly need to be a human, well, goodbye. + if(spell_requirements & SPELL_REQUIRES_HUMAN) if(feedback) to_chat(owner, span_warning("[src] can only be cast by humans!")) return FALSE + // Otherwise, we can check for contents if they have wizardly apparel. This isn't *quite* perfect, but it'll do, especially since many of the edge cases (gorilla holding a wizard hat) still more or less make sense. + if(spell_requirements & SPELL_REQUIRES_WIZARD_GARB) + var/any_casting = FALSE + for(var/obj/item/clothing/item in owner) + if(item.clothing_flags & CASTING_CLOTHES) + any_casting = TRUE + break + + if(!any_casting) + if(feedback) + to_chat(owner, span_warning("You don't feel strong enough without your hat!")) + return FALSE + if(!(spell_requirements & SPELL_CASTABLE_AS_BRAIN) && isbrain(owner)) if(feedback) to_chat(owner, span_warning("[src] can't be cast in this state!")) return FALSE - // Being put into a card form breaks a lot of spells, so we'll just forbid them in these states - if(ispAI(owner) || (isAI(owner) && istype(owner.loc, /obj/item/aicard))) - return FALSE - return TRUE /** @@ -225,6 +232,24 @@ /datum/action/cooldown/spell/proc/is_valid_target(atom/cast_on) return TRUE +/** + * Used to get the cast_on atom if a self cast spell is being cast. + * + * Allows for some atoms to be used as casting sources if a spell caster is located within. + */ +/datum/action/cooldown/spell/proc/get_caster_from_target(atom/target) + var/atom/cast_loc = target.loc + if(isnull(cast_loc)) + return null // No magic in nullspace + + if(isturf(cast_loc)) + return target // They're just standing around, proceed as normal + + if(HAS_TRAIT(cast_loc, TRAIT_CASTABLE_LOC)) + return cast_loc // They're in an atom which allows casting, so redirect the caster to loc + + return null + // 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. @@ -242,7 +267,7 @@ if(!(precast_result & SPELL_NO_FEEDBACK)) // We do invocation and sound effects here, before actual cast // That way stuff like teleports or shape-shifts can be invoked before ocurring - spell_feedback() + spell_feedback(owner) // Actually cast the spell. Main effects go here cast(cast_on) @@ -272,6 +297,31 @@ /datum/action/cooldown/spell/proc/before_cast(atom/cast_on) SHOULD_CALL_PARENT(TRUE) + // Bonus invocation check done here: + // If the caster has no tongue and it's a verbal spell, + // Or has no hands and is a gesture spell - cancel it, + // and show a funny message that they tried + if(ishuman(owner) && !(spell_requirements & SPELL_CASTABLE_WITHOUT_INVOCATION)) + var/mob/living/carbon/human/caster = owner + switch(invocation_type) + if(INVOCATION_WHISPER, INVOCATION_SHOUT) + if(!caster.get_organ_slot(ORGAN_SLOT_TONGUE)) + invocation(caster) + to_chat(caster, span_warning("Your lack of tongue is making it difficult to say the correct words to cast [src]...")) + StartCooldown(2 SECONDS) + return SPELL_CANCEL_CAST + + if(INVOCATION_EMOTE) + if(caster.usable_hands <= 0) + var/arm_describer = (caster.num_hands >= 2 ? "arms limply" : (caster.num_hands == 1 ? "arm wildly" : "arm stumps")) + caster.visible_message( + span_warning("[caster] wiggles around [caster.p_their()] [arm_describer]."), + ignored_mobs = caster, + ) + to_chat(caster, span_warning("You can't position your hands correctly to invoke [src][caster.num_hands > 0 ? "" : ", as you have none"]...")) + StartCooldown(2 SECONDS) + return SPELL_CANCEL_CAST + var/sig_return = SEND_SIGNAL(src, COMSIG_SPELL_BEFORE_CAST, cast_on) if(owner) sig_return |= SEND_SIGNAL(owner, COMSIG_MOB_BEFORE_SPELL_CAST, src, cast_on) @@ -319,20 +369,19 @@ SEND_SIGNAL(src, COMSIG_SPELL_AFTER_CAST, cast_on) /// Provides feedback after a spell cast occurs, in the form of a cast sound and/or invocation -/datum/action/cooldown/spell/proc/spell_feedback() - if(!owner) +/datum/action/cooldown/spell/proc/spell_feedback(mob/living/invoker) + if(!invoker) return ///even INVOCATION_NONE should go through this because the signal might change that - invocation() - if(sound) - playsound(get_turf(owner), sound, 50, TRUE) + invocation(invoker) + playsound(invoker, sound, 50, vary = TRUE) /// The invocation that accompanies the spell, called from spell_feedback() before cast(). -/datum/action/cooldown/spell/proc/invocation() +/datum/action/cooldown/spell/proc/invocation(mob/living/invoker) //lists can be sent by reference, a string would be sent by value var/list/invocation_list = list(invocation, invocation_type, garbled_invocation_prob) - SEND_SIGNAL(owner, COMSIG_MOB_PRE_INVOCATION, src, invocation_list) + SEND_SIGNAL(invoker, COMSIG_MOB_PRE_INVOCATION, src, invocation_list) var/used_invocation_message = invocation_list[INVOCATION_MESSAGE] var/used_invocation_type = invocation_list[INVOCATION_TYPE] var/used_invocation_garble_prob = invocation_list[INVOCATION_GARBLE_PROB] @@ -340,21 +389,21 @@ switch(used_invocation_type) if(INVOCATION_SHOUT) if(prob(used_invocation_garble_prob)) - owner.say(replacetext(used_invocation_message," ","`"), forced = "spell ([src])") + invoker.say(replacetext(used_invocation_message," ","`"), forced = "spell ([src])") else - owner.say(used_invocation_message, forced = "spell ([src])") + invoker.say(used_invocation_message, forced = "spell ([src])") if(INVOCATION_WHISPER) if(prob(used_invocation_garble_prob)) - owner.whisper(replacetext(used_invocation_message," ","`"), forced = "spell ([src])") + invoker.whisper(replacetext(used_invocation_message," ","`"), forced = "spell ([src])") else - owner.whisper(used_invocation_message, forced = "spell ([src])") + invoker.whisper(used_invocation_message, forced = "spell ([src])") if(INVOCATION_EMOTE) - owner.visible_message(used_invocation_message, invocation_self_message) + invoker.visible_message(used_invocation_message, invocation_self_message) /// Checks if the current OWNER of the spell is in a valid state to say the spell's invocation -/datum/action/cooldown/spell/proc/try_invoke(feedback = TRUE) +/datum/action/cooldown/spell/proc/try_invoke(mob/living/invoker, feedback = TRUE) if(spell_requirements & SPELL_CASTABLE_WITHOUT_INVOCATION) return TRUE @@ -362,26 +411,25 @@ return TRUE // If you want a spell usable by ghosts for some reason, it must be INVOCATION_NONE - if(!isliving(owner)) + if(!istype(invoker)) if(feedback) - to_chat(owner, span_warning("You need to be living to invoke [src]!")) + to_chat(invoker, span_warning("You need to be living to invoke [src]!")) return FALSE - var/mob/living/living_owner = owner - var/invoke_sig_return = SEND_SIGNAL(owner, COMSIG_MOB_TRY_INVOKE_SPELL, src, feedback) + var/invoke_sig_return = SEND_SIGNAL(invoker, COMSIG_MOB_TRY_INVOKE_SPELL, src, feedback) if(invoke_sig_return & SPELL_INVOCATION_ALWAYS_SUCCEED) return TRUE // skips all of the following checks if(invoke_sig_return & SPELL_INVOCATION_FAIL) return FALSE - if(invocation_type == INVOCATION_EMOTE && HAS_TRAIT(living_owner, TRAIT_EMOTEMUTE)) + if(invocation_type == INVOCATION_EMOTE && HAS_TRAIT(invoker, TRAIT_EMOTEMUTE)) if(feedback) - to_chat(owner, span_warning("You can't position your hands correctly to invoke [src]!")) + to_chat(invoker, span_warning("You can't position your hands correctly to invoke [src]!")) return FALSE - if((invocation_type == INVOCATION_WHISPER || invocation_type == INVOCATION_SHOUT) && !living_owner.can_speak()) + if((invocation_type == INVOCATION_WHISPER || invocation_type == INVOCATION_SHOUT) && !invoker.can_speak()) if(feedback) - to_chat(owner, span_warning("You can't get the words out to invoke [src]!")) + to_chat(invoker, span_warning("You can't get the words out to invoke [src]!")) return FALSE return TRUE @@ -408,6 +456,7 @@ spell_level++ cooldown_time = max(cooldown_time - cooldown_reduction_per_rank, 0.25 SECONDS) // 0 second CD starts to break things. + name = "[get_spell_title()][initial(name)]" build_all_button_icons(UPDATE_BUTTON_NAME) return TRUE @@ -428,13 +477,10 @@ else cooldown_time = max(cooldown_time + cooldown_reduction_per_rank, initial(cooldown_time)) + name = "[get_spell_title()][initial(name)]" build_all_button_icons(UPDATE_BUTTON_NAME) return TRUE -/datum/action/cooldown/spell/update_button_name(atom/movable/screen/movable/action_button/button, force) - name = "[get_spell_title()][initial(name)]" - return ..() - /// Gets the title of the spell based on its level. /datum/action/cooldown/spell/proc/get_spell_title() switch(spell_level) diff --git a/code/modules/spells/spell_types/aoe_spell/_aoe_spell.dm b/code/modules/spells/spell_types/aoe_spell/_aoe_spell.dm index 4d16ae379714e..92442bd0e40a3 100644 --- a/code/modules/spells/spell_types/aoe_spell/_aoe_spell.dm +++ b/code/modules/spells/spell_types/aoe_spell/_aoe_spell.dm @@ -12,6 +12,9 @@ /// The radius of the aoe. var/aoe_radius = 7 +/datum/action/cooldown/spell/aoe/is_valid_target(atom/cast_on) + return isturf(cast_on.loc) + // At this point, cast_on == owner. Either works. // Don't extend this for your spell! Look at cast_on_thing_in_aoe. /datum/action/cooldown/spell/aoe/cast(atom/cast_on) diff --git a/code/modules/spells/spell_types/aoe_spell/area_conversion.dm b/code/modules/spells/spell_types/aoe_spell/area_conversion.dm index f75c395868529..a03b4c9ab21a4 100644 --- a/code/modules/spells/spell_types/aoe_spell/area_conversion.dm +++ b/code/modules/spells/spell_types/aoe_spell/area_conversion.dm @@ -16,11 +16,7 @@ aoe_radius = 2 /datum/action/cooldown/spell/aoe/area_conversion/get_things_to_cast_on(atom/center) - var/list/things = list() - for(var/turf/nearby_turf in range(aoe_radius, center)) - things += nearby_turf - - return things + return RANGE_TURFS(aoe_radius, center) /datum/action/cooldown/spell/aoe/area_conversion/cast_on_thing_in_aoe(turf/victim, atom/caster) playsound(victim, 'sound/items/welder.ogg', 75, TRUE) diff --git a/code/modules/spells/spell_types/aoe_spell/knock.dm b/code/modules/spells/spell_types/aoe_spell/knock.dm index fd9e4503de8fd..ede1462633b03 100644 --- a/code/modules/spells/spell_types/aoe_spell/knock.dm +++ b/code/modules/spells/spell_types/aoe_spell/knock.dm @@ -13,6 +13,23 @@ spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC aoe_radius = 3 +/datum/action/cooldown/spell/aoe/knock/get_caster_from_target(atom/target) + if(istype(target.loc, /obj/structure/closet)) + return target + + return ..() + +/datum/action/cooldown/spell/aoe/knock/is_valid_target(atom/cast_on) + return ..() || istype(cast_on.loc, /obj/structure/closet) + +/datum/action/cooldown/spell/aoe/knock/cast(atom/cast_on) + if(istype(cast_on.loc, /obj/structure/closet)) + var/obj/structure/closet/open_closet = cast_on.loc + open_closet.locked = FALSE + open_closet.open() + + return ..() + /datum/action/cooldown/spell/aoe/knock/get_things_to_cast_on(atom/center) return RANGE_TURFS(aoe_radius, center) diff --git a/code/modules/spells/spell_types/aoe_spell/repulse.dm b/code/modules/spells/spell_types/aoe_spell/repulse.dm index d0074a9f38663..259f20ee9ba0a 100644 --- a/code/modules/spells/spell_types/aoe_spell/repulse.dm +++ b/code/modules/spells/spell_types/aoe_spell/repulse.dm @@ -6,6 +6,23 @@ /// The moveforce of the throw done by the repulsion. var/repulse_force = MOVE_FORCE_EXTREMELY_STRONG +/datum/action/cooldown/spell/aoe/repulse/get_caster_from_target(atom/target) + if(istype(target.loc, /obj/structure/closet)) + return target + + return ..() + +/datum/action/cooldown/spell/aoe/repulse/is_valid_target(atom/cast_on) + return ..() || istype(cast_on.loc, /obj/structure/closet) + +/datum/action/cooldown/spell/aoe/repulse/cast(atom/cast_on) + if(istype(cast_on.loc, /obj/structure/closet)) + var/obj/structure/closet/open_closet = cast_on.loc + open_closet.open(force = TRUE) + open_closet.visible_message(span_warning("[open_closet] suddenly flies open!")) + + return ..() + /datum/action/cooldown/spell/aoe/repulse/get_things_to_cast_on(atom/center) var/list/things = list() for(var/atom/movable/nearby_movable in view(aoe_radius, center)) @@ -44,7 +61,13 @@ to_chat(victim, span_userdanger("You're thrown back by [caster]!")) // So stuff gets tossed around at the same time. - victim.safe_throw_at(throwtarget, ((clamp((max_throw - (clamp(dist_from_caster - 2, 0, dist_from_caster))), 3, max_throw))), 1, caster, force = repulse_force) + victim.safe_throw_at( + target = throwtarget, + range = clamp((max_throw - (clamp(dist_from_caster - 2, 0, dist_from_caster))), 3, max_throw), + speed = 1, + thrower = ismob(caster) ? caster : null, + force = repulse_force, + ) /datum/action/cooldown/spell/aoe/repulse/wizard name = "Repulse" diff --git a/code/modules/spells/spell_types/conjure/_conjure.dm b/code/modules/spells/spell_types/conjure/_conjure.dm index ffab088711188..3afe7c5255754 100644 --- a/code/modules/spells/spell_types/conjure/_conjure.dm +++ b/code/modules/spells/spell_types/conjure/_conjure.dm @@ -16,6 +16,9 @@ /// If TRUE, no two summons can be spawned in the same turf. var/summon_respects_prev_spawn_points = TRUE +/datum/action/cooldown/spell/conjure/is_valid_target(atom/cast_on) + return isturf(cast_on.loc) + /datum/action/cooldown/spell/conjure/cast(atom/cast_on) . = ..() var/list/to_summon_in = list() diff --git a/code/modules/spells/spell_types/conjure/bees.dm b/code/modules/spells/spell_types/conjure/bees.dm index 036abbc0f9b6f..58062f1e8fe98 100644 --- a/code/modules/spells/spell_types/conjure/bees.dm +++ b/code/modules/spells/spell_types/conjure/bees.dm @@ -14,5 +14,5 @@ invocation_type = INVOCATION_SHOUT summon_radius = 3 - summon_type = list(/mob/living/simple_animal/hostile/bee/toxin) + summon_type = list(/mob/living/basic/bee/toxin) summon_amount = 9 diff --git a/code/modules/spells/spell_types/conjure/cheese.dm b/code/modules/spells/spell_types/conjure/cheese.dm new file mode 100644 index 0000000000000..d9c90d1dbac34 --- /dev/null +++ b/code/modules/spells/spell_types/conjure/cheese.dm @@ -0,0 +1,17 @@ +/datum/action/cooldown/spell/conjure/cheese + name = "Summon Cheese" + desc = "This spell conjures a bunch of cheese wheels. What the hell?" + sound = 'sound/magic/summonitems_generic.ogg' + button_icon_state = "cheese" + + school = SCHOOL_CONJURATION + cooldown_time = 1 MINUTES + spell_requirements = null + + invocation = "PL`YR DOT PL`CTM` OOO`BEE G" //player.placeatme 00064B33 9 + invocation_type = INVOCATION_SHOUT + garbled_invocation_prob = 0 //i'd rather it remain like this + + summon_radius = 1 + summon_amount = 9 + summon_type = list(/obj/item/food/cheese/wheel) diff --git a/code/modules/spells/spell_types/conjure/simian.dm b/code/modules/spells/spell_types/conjure/simian.dm new file mode 100644 index 0000000000000..556a78e50127c --- /dev/null +++ b/code/modules/spells/spell_types/conjure/simian.dm @@ -0,0 +1,98 @@ +/datum/action/cooldown/spell/conjure/simian + name = "Summon Simians" + desc = "This spell reaches deep into the elemental plane of bananas (the monkey one, not the clown one), and \ + summons monkeys and gorillas that will promptly flip out and attack everything in sight. Fun! \ + Their lesser, easily manipulable minds will be convinced you are one of their allies, but only for a minute. Unless you also are a monkey." + button_icon_state = "simian" + sound = 'sound/ambience/antag/monkey.ogg' + + school = SCHOOL_CONJURATION + cooldown_time = 1.5 MINUTES + cooldown_reduction_per_rank = 15 SECONDS + + invocation = "OOGA OOGA OOGA!!!!" + invocation_type = INVOCATION_SHOUT + + summon_radius = 2 + summon_type = list(/mob/living/carbon/human/species/monkey/angry, /mob/living/carbon/human/species/monkey/angry, /mob/living/simple_animal/hostile/gorilla/lesser) + summon_amount = 4 + +/datum/action/cooldown/spell/conjure/simian/level_spell(bypass_cap) + . = ..() + summon_amount++ // MORE, MOOOOORE + if(spell_level == spell_max_level) // We reward the faithful. + summon_type = list(/mob/living/carbon/human/species/monkey/angry, /mob/living/simple_animal/hostile/gorilla) + spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC // Max level lets you cast it naked, for monkey larp. + to_chat(owner, span_notice("Your simian power has reached maximum capacity! You can now cast this spell naked, and you will create adult Gorillas with each cast.")) + +/datum/action/cooldown/spell/conjure/simian/cast(atom/cast_on) + . = ..() + var/mob/living/cast_mob = cast_on + if(!istype(cast_mob)) + return + if(FACTION_MONKEY in cast_mob.faction) + return + cast_mob.faction |= FACTION_MONKEY + addtimer(CALLBACK(src, PROC_REF(remove_monky_faction), cast_mob), 1 MINUTES) + +/datum/action/cooldown/spell/conjure/simian/proc/remove_monky_faction(mob/cast_mob) + cast_mob.faction -= FACTION_MONKEY + +/datum/action/cooldown/spell/conjure/simian/post_summon(atom/summoned_object, atom/cast_on) + var/mob/living/alive_dude = summoned_object + alive_dude.faction |= list(FACTION_MONKEY) + if(ismonkey(alive_dude)) + equip_monky(alive_dude) + return + +/** Equips summoned monky with gear depending on how the roll plays out, affected by spell lvl. + * Can give them bananas and garland or gatfruit and axes. Monkeys are comically inept, which balances out what might otherwise be a little crazy. + */ +/datum/action/cooldown/spell/conjure/simian/proc/equip_monky(mob/living/carbon/human/species/monkey/summoned_monkey) + + // These are advanced monkeys we're talking about + var/datum/ai_controller/monkey/monky_controller = summoned_monkey.ai_controller + monky_controller.set_trip_mode(mode = FALSE) + summoned_monkey.fully_replace_character_name(summoned_monkey.real_name, "primal " + summoned_monkey.name) + + // Monkeys get a random gear tier, but it's more likely to be good the more leveled the spell is! + var/monkey_gear_tier = rand(0, 5) + (spell_level - 1) + monkey_gear_tier = min(monkey_gear_tier, 5) + + // Monkey weapons, ordered by tier + var/static/list/monky_weapon = list( + list(/obj/item/food/grown/banana, /obj/item/grown/bananapeel), + list(/obj/item/tailclub, /obj/item/knife/combat/bone), + list(/obj/item/shovel/serrated, /obj/item/spear/bamboospear), + list(/obj/item/spear/bonespear, /obj/item/fireaxe/boneaxe), + list(/obj/item/gun/syringe/blowgun, /obj/item/gun/ballistic/revolver), + ) + + var/list/options = monky_weapon[min(monkey_gear_tier, length(monky_weapon))] + + var/obj/item/weapon + if(monkey_gear_tier != 0) + var/weapon_type = pick(options) + weapon = new weapon_type(summoned_monkey) + summoned_monkey.equip_to_slot_or_del(weapon, ITEM_SLOT_HANDS) + + // Load the ammo + if(istype(weapon, /obj/item/gun/syringe/blowgun)) + var/obj/item/reagent_containers/syringe/crude/tribal/syring = new(summoned_monkey) + weapon.attackby(syring, summoned_monkey) + + // Wield the weapon! + if(is_type_in_list(weapon, list(/obj/item/spear, /obj/item/fireaxe))) + weapon.attack_self(summoned_monkey) + + // Fashionable ape wear, organised by tier + var/list/static/monky_hats = list( + null, // nothin here + /obj/item/clothing/head/costume/garland, + /obj/item/clothing/head/helmet/durathread, + /obj/item/clothing/head/helmet/skull, + ) + + var/stylish_monkey_hat = monky_hats[min(monkey_gear_tier, length(monky_hats))] + if(!isnull(stylish_monkey_hat)) + summoned_monkey.equip_to_slot_or_del(new stylish_monkey_hat(summoned_monkey), ITEM_SLOT_HEAD) diff --git a/code/modules/spells/spell_types/conjure_item/_conjure_item.dm b/code/modules/spells/spell_types/conjure_item/_conjure_item.dm index ad46096492373..7e39f778391d4 100644 --- a/code/modules/spells/spell_types/conjure_item/_conjure_item.dm +++ b/code/modules/spells/spell_types/conjure_item/_conjure_item.dm @@ -8,6 +8,10 @@ var/delete_old = TRUE /// List of weakrefs to items summoned var/list/datum/weakref/item_refs + /// If TRUE, deletes the item if no mob picks it up on cast + var/delete_on_failure = TRUE + /// If TRUE, requires the caster be able to pick it up afterwards + var/requires_hands = FALSE /datum/action/cooldown/spell/conjure_item/Destroy() // If we delete_old, clean up all of our items on delete @@ -20,28 +24,56 @@ return ..() +/datum/action/cooldown/spell/conjure_item/can_cast_spell(feedback) + . = ..() + if(!.) + return FALSE + + if(!requires_hands) + return TRUE + + if(!isliving(owner)) + return FALSE + + var/mob/living/living_owner = owner + if(living_owner.usable_hands < 1) + if(feedback) + owner.balloon_alert(owner, "no free hands!") + return FALSE + + return TRUE + /datum/action/cooldown/spell/conjure_item/is_valid_target(atom/cast_on) - return iscarbon(cast_on) + if(!requires_hands) + return TRUE + if(!isliving(cast_on)) + return FALSE + var/mob/living/living_cast_on = cast_on + return living_cast_on.usable_hands >= 1 -/datum/action/cooldown/spell/conjure_item/cast(mob/living/carbon/cast_on) +/datum/action/cooldown/spell/conjure_item/cast(atom/cast_on) if(delete_old && LAZYLEN(item_refs)) QDEL_LAZYLIST(item_refs) - var/obj/item/existing_item = cast_on.get_active_held_item() - if(existing_item) - cast_on.dropItemToGround(existing_item) + var/mob/mob_caster = cast_on + if(istype(mob_caster)) + var/obj/item/existing_item = mob_caster.get_active_held_item() + if(existing_item) + mob_caster.dropItemToGround(existing_item) - var/obj/item/created = make_item() + var/obj/item/created = make_item(cast_on) if(QDELETED(created)) CRASH("[type] tried to create an item, but failed. It's item type is [item_type].") - cast_on.put_in_hands(created, del_on_fail = TRUE) + if(istype(mob_caster)) + mob_caster.put_in_hands(created, del_on_fail = delete_on_failure) + return ..() /// Instantiates the item we're conjuring and returns it. -/// Item is made in nullspace and moved out in cast(). -/datum/action/cooldown/spell/conjure_item/proc/make_item() - var/obj/item/made_item = new item_type() +/// Item is made in at the caster's. +/datum/action/cooldown/spell/conjure_item/proc/make_item(atom/caster) + var/obj/item/made_item = new item_type(caster.loc) LAZYADD(item_refs, WEAKREF(made_item)) return made_item diff --git a/code/modules/spells/spell_types/conjure_item/infinite_guns.dm b/code/modules/spells/spell_types/conjure_item/infinite_guns.dm index 98921da4879dc..70ad834f33db8 100644 --- a/code/modules/spells/spell_types/conjure_item/infinite_guns.dm +++ b/code/modules/spells/spell_types/conjure_item/infinite_guns.dm @@ -8,6 +8,7 @@ item_type = /obj/item/gun/ballistic/rifle // Enchanted guns self delete / do wacky stuff, anyways delete_old = FALSE + requires_hands = TRUE /datum/action/cooldown/spell/conjure_item/infinite_guns/Remove(mob/living/remove_from) var/obj/item/existing = remove_from.is_holding_item_of_type(item_type) @@ -18,8 +19,8 @@ // Because enchanted guns self-delete and regenerate themselves, // override make_item here and let's not bother with tracking their weakrefs. -/datum/action/cooldown/spell/conjure_item/infinite_guns/make_item() - return new item_type() +/datum/action/cooldown/spell/conjure_item/infinite_guns/make_item(atom/caster) + return new item_type(caster.loc) /datum/action/cooldown/spell/conjure_item/infinite_guns/gun name = "Lesser Summon Guns" @@ -38,4 +39,4 @@ Learning this spell makes you unable to learn Lesser Summon Gun." button_icon_state = "arcane_barrage" - item_type = /obj/item/gun/ballistic/rifle/enchanted/arcane_barrage + item_type = /obj/item/gun/magic/wand/arcane_barrage diff --git a/code/modules/spells/spell_types/conjure_item/invisible_box.dm b/code/modules/spells/spell_types/conjure_item/invisible_box.dm index af6d5586af25e..42da02121d3cd 100644 --- a/code/modules/spells/spell_types/conjure_item/invisible_box.dm +++ b/code/modules/spells/spell_types/conjure_item/invisible_box.dm @@ -30,7 +30,7 @@ . = ..() invocation = span_notice("[cast_on] moves [cast_on.p_their()] hands in the shape of a cube, pressing a box out of the air.") -/datum/action/cooldown/spell/conjure_item/invisible_box/make_item() +/datum/action/cooldown/spell/conjure_item/invisible_box/make_item(atom/caster) . = ..() var/obj/item/made_box = . made_box.alpha = 255 diff --git a/code/modules/spells/spell_types/conjure_item/lighting_packet.dm b/code/modules/spells/spell_types/conjure_item/lighting_packet.dm index 5901c268c2c8d..cffddf7e0ce94 100644 --- a/code/modules/spells/spell_types/conjure_item/lighting_packet.dm +++ b/code/modules/spells/spell_types/conjure_item/lighting_packet.dm @@ -9,6 +9,7 @@ spell_max_level = 1 item_type = /obj/item/spellpacket/lightningbolt + requires_hands = TRUE /datum/action/cooldown/spell/conjure_item/spellpacket/cast(mob/living/carbon/cast_on) . = ..() diff --git a/code/modules/spells/spell_types/conjure_item/snowball.dm b/code/modules/spells/spell_types/conjure_item/snowball.dm index ffd6d8d5e5493..80b4aad9361c5 100644 --- a/code/modules/spells/spell_types/conjure_item/snowball.dm +++ b/code/modules/spells/spell_types/conjure_item/snowball.dm @@ -8,3 +8,4 @@ antimagic_flags = NONE cooldown_time = 1.5 SECONDS item_type = /obj/item/toy/snowball + requires_hands = TRUE diff --git a/code/modules/spells/spell_types/jaunt/_jaunt.dm b/code/modules/spells/spell_types/jaunt/_jaunt.dm index e2fc4324ad97d..207a7ed8b5be4 100644 --- a/code/modules/spells/spell_types/jaunt/_jaunt.dm +++ b/code/modules/spells/spell_types/jaunt/_jaunt.dm @@ -19,6 +19,12 @@ /// What dummy mob type do we put jaunters in on jaunt? var/jaunt_type = /obj/effect/dummy/phased_mob +/datum/action/cooldown/spell/jaunt/get_caster_from_target(atom/target) + if(istype(target.loc, jaunt_type)) + return target + + return ..() + /datum/action/cooldown/spell/jaunt/before_cast(atom/cast_on) return ..() | SPELL_NO_FEEDBACK // Don't do the feedback until after we're jaunting @@ -56,11 +62,11 @@ var/obj/effect/dummy/phased_mob/jaunt = new jaunt_type(loc_override || get_turf(jaunter), jaunter) RegisterSignal(jaunt, COMSIG_MOB_EJECTED_FROM_JAUNT, PROC_REF(on_jaunt_exited)) - spell_requirements |= SPELL_CASTABLE_WHILE_PHASED - jaunter.add_traits(list(TRAIT_MAGICALLY_PHASED, TRAIT_RUNECHAT_HIDDEN), REF(src)) + check_flags &= ~AB_CHECK_PHASED + jaunter.add_traits(list(TRAIT_MAGICALLY_PHASED, TRAIT_RUNECHAT_HIDDEN, TRAIT_WEATHER_IMMUNE), REF(src)) // Don't do the feedback until we have runechat hidden. // Otherwise the text will follow the jaunt holder, which reveals where our caster is travelling. - spell_feedback() + spell_feedback(jaunter) // This needs to happen at the end, after all the traits and stuff is handled SEND_SIGNAL(jaunter, COMSIG_MOB_ENTER_JAUNT, src, jaunt) @@ -100,8 +106,8 @@ */ /datum/action/cooldown/spell/jaunt/proc/on_jaunt_exited(obj/effect/dummy/phased_mob/jaunt, mob/living/unjaunter) SHOULD_CALL_PARENT(TRUE) - spell_requirements &= ~SPELL_CASTABLE_WHILE_PHASED - unjaunter.remove_traits(list(TRAIT_MAGICALLY_PHASED, TRAIT_RUNECHAT_HIDDEN), REF(src)) + check_flags |= AB_CHECK_PHASED + unjaunter.remove_traits(list(TRAIT_MAGICALLY_PHASED, TRAIT_RUNECHAT_HIDDEN, TRAIT_WEATHER_IMMUNE), REF(src)) // This needs to happen at the end, after all the traits and stuff is handled SEND_SIGNAL(unjaunter, COMSIG_MOB_AFTER_EXIT_JAUNT, src) diff --git a/code/modules/spells/spell_types/jaunt/bloodcrawl.dm b/code/modules/spells/spell_types/jaunt/bloodcrawl.dm index 8b82595a1f04a..836bfd98dca43 100644 --- a/code/modules/spells/spell_types/jaunt/bloodcrawl.dm +++ b/code/modules/spells/spell_types/jaunt/bloodcrawl.dm @@ -83,10 +83,10 @@ var/turf/jaunt_turf = get_turf(blood) // Begin the jaunt - jaunter.notransform = TRUE + ADD_TRAIT(jaunter, TRAIT_NO_TRANSFORM, REF(src)) var/obj/effect/dummy/phased_mob/holder = enter_jaunt(jaunter, jaunt_turf) if(!holder) - jaunter.notransform = FALSE + REMOVE_TRAIT(jaunter, TRAIT_NO_TRANSFORM, REF(src)) return FALSE RegisterSignal(holder, COMSIG_MOVABLE_MOVED, PROC_REF(update_status_on_signal)) @@ -104,7 +104,7 @@ playsound(jaunt_turf, 'sound/magic/enter_blood.ogg', 50, TRUE, -1) jaunter.extinguish_mob() - jaunter.notransform = FALSE + REMOVE_TRAIT(jaunter, TRAIT_NO_TRANSFORM, REF(src)) return TRUE /** @@ -113,7 +113,7 @@ */ /datum/action/cooldown/spell/jaunt/bloodcrawl/proc/try_exit_jaunt(obj/effect/decal/cleanable/blood, mob/living/jaunter, forced = FALSE) if(!forced) - if(jaunter.notransform) + if(HAS_TRAIT(jaunter, TRAIT_NO_TRANSFORM)) to_chat(jaunter, span_warning("You cannot exit yet!!")) return FALSE @@ -196,9 +196,9 @@ blind_message = span_notice("You hear a splash."), ) - jaunter.notransform = TRUE + ADD_TRAIT(jaunter, TRAIT_NO_TRANSFORM, REF(src)) consume_victim(victim, jaunter) - jaunter.notransform = FALSE + REMOVE_TRAIT(jaunter, TRAIT_NO_TRANSFORM, REF(src)) return TRUE diff --git a/code/modules/spells/spell_types/jaunt/ethereal_jaunt.dm b/code/modules/spells/spell_types/jaunt/ethereal_jaunt.dm index b4414c99796d5..43e1f9036ee43 100644 --- a/code/modules/spells/spell_types/jaunt/ethereal_jaunt.dm +++ b/code/modules/spells/spell_types/jaunt/ethereal_jaunt.dm @@ -49,9 +49,9 @@ /datum/action/cooldown/spell/jaunt/ethereal_jaunt/proc/do_jaunt(mob/living/cast_on) // Makes sure they don't die or get jostled or something during the jaunt entry // Honestly probably not necessary anymore, but better safe than sorry - cast_on.notransform = TRUE + ADD_TRAIT(cast_on, TRAIT_NO_TRANSFORM, REF(src)) var/obj/effect/dummy/phased_mob/holder = enter_jaunt(cast_on) - cast_on.notransform = FALSE + REMOVE_TRAIT(cast_on, TRAIT_NO_TRANSFORM, REF(src)) if(!holder) CRASH("[type] attempted do_jaunt but failed to create a jaunt holder via enter_jaunt.") @@ -167,9 +167,10 @@ /datum/action/cooldown/spell/jaunt/ethereal_jaunt/proc/end_jaunt(mob/living/cast_on, obj/effect/dummy/phased_mob/spell_jaunt/holder, turf/final_point) if(QDELETED(cast_on) || QDELETED(holder) || QDELETED(src)) return - cast_on.notransform = TRUE + + ADD_TRAIT(cast_on, TRAIT_NO_TRANSFORM, REF(src)) exit_jaunt(cast_on) - cast_on.notransform = FALSE + REMOVE_TRAIT(cast_on, TRAIT_NO_TRANSFORM, REF(src)) REMOVE_TRAIT(cast_on, TRAIT_IMMOBILIZED, REF(src)) diff --git a/code/modules/spells/spell_types/jaunt/shadow_walk.dm b/code/modules/spells/spell_types/jaunt/shadow_walk.dm index 29bb806336731..de03f8e15e022 100644 --- a/code/modules/spells/spell_types/jaunt/shadow_walk.dm +++ b/code/modules/spells/spell_types/jaunt/shadow_walk.dm @@ -9,6 +9,9 @@ spell_requirements = NONE jaunt_type = /obj/effect/dummy/phased_mob/shadow + /// The max amount of lumens on a turf allowed before we can no longer enter jaunt with this + var/light_threshold = SHADOW_SPECIES_LIGHT_THRESHOLD + /datum/action/cooldown/spell/jaunt/shadow_walk/Grant(mob/grant_to) . = ..() RegisterSignal(grant_to, COMSIG_MOVABLE_MOVED, PROC_REF(update_status_on_signal)) @@ -17,6 +20,12 @@ . = ..() UnregisterSignal(remove_from, COMSIG_MOVABLE_MOVED) +/datum/action/cooldown/spell/jaunt/shadow_walk/enter_jaunt(mob/living/jaunter, turf/loc_override) + var/obj/effect/dummy/phased_mob/shadow/shadow = ..() + if(istype(shadow)) + shadow.light_max = light_threshold + return shadow + /datum/action/cooldown/spell/jaunt/shadow_walk/can_cast_spell(feedback = TRUE) . = ..() if(!.) @@ -24,7 +33,7 @@ if(is_jaunting(owner)) return TRUE var/turf/cast_turf = get_turf(owner) - if(cast_turf.get_lumcount() >= SHADOW_SPECIES_LIGHT_THRESHOLD) + if(cast_turf.get_lumcount() >= light_threshold) if(feedback) to_chat(owner, span_warning("It isn't dark enough here!")) return FALSE @@ -44,6 +53,8 @@ /obj/effect/dummy/phased_mob/shadow name = "shadows" + /// Max amount of light permitted before being kicked out + var/light_max = SHADOW_SPECIES_LIGHT_THRESHOLD /// The amount that shadow heals us per SSobj tick (times seconds_per_tick) var/healing_rate = 1.5 /// When cooldown is active, you are prevented from moving into tiles that would eject you from your jaunt @@ -109,11 +120,9 @@ * * location_to_check - The location to have its light level checked. */ -/obj/effect/dummy/phased_mob/shadow/proc/check_light_level(location_to_check) - var/turf/T = get_turf(location_to_check) - var/light_amount = T.get_lumcount() - if(light_amount > 0.2) // jaunt ends - return TRUE +/obj/effect/dummy/phased_mob/shadow/proc/check_light_level(atom/location_to_check) + var/turf/light_turf = get_turf(location_to_check) + return light_turf.get_lumcount() > light_max // jaunt ends on TRUE /** * Checks if the user should recieve a warning that they're moving into light. diff --git a/code/modules/spells/spell_types/pointed/_pointed.dm b/code/modules/spells/spell_types/pointed/_pointed.dm index b18669d6f9efc..04c3ed47944b9 100644 --- a/code/modules/spells/spell_types/pointed/_pointed.dm +++ b/code/modules/spells/spell_types/pointed/_pointed.dm @@ -64,17 +64,17 @@ build_all_button_icons() return TRUE -/datum/action/cooldown/spell/pointed/InterceptClickOn(mob/living/caller, params, atom/click_target) +/datum/action/cooldown/spell/pointed/InterceptClickOn(mob/living/caller, params, atom/target) var/atom/aim_assist_target - if(aim_assist && isturf(click_target)) + if(aim_assist && isturf(target)) // Find any human in the list. We aren't picky, it's aim assist after all - aim_assist_target = locate(/mob/living/carbon/human) in click_target + aim_assist_target = locate(/mob/living/carbon/human) in target if(!aim_assist_target) // If we didn't find a human, we settle for any living at all - aim_assist_target = locate(/mob/living) in click_target + aim_assist_target = locate(/mob/living) in target - return ..(caller, params, aim_assist_target || click_target) + return ..(caller, params, aim_assist_target || target) /datum/action/cooldown/spell/pointed/is_valid_target(atom/cast_on) if(cast_on == owner) @@ -133,10 +133,11 @@ // cast_on is a turf, or atom target, that we clicked on to fire at. /datum/action/cooldown/spell/pointed/projectile/cast(atom/cast_on) . = ..() - if(!isturf(owner.loc)) + var/atom/caster = get_caster_from_target(owner) + if(!isturf(caster.loc)) return FALSE - var/turf/caster_turf = get_turf(owner) + var/turf/caster_turf = caster.loc // Get the tile infront of the caster, based on their direction var/turf/caster_front_turf = get_step(owner, owner.dir) diff --git a/code/modules/spells/spell_types/pointed/finger_guns.dm b/code/modules/spells/spell_types/pointed/finger_guns.dm index ee8cc5eeab66f..5ed666d9e64ed 100644 --- a/code/modules/spells/spell_types/pointed/finger_guns.dm +++ b/code/modules/spells/spell_types/pointed/finger_guns.dm @@ -27,19 +27,19 @@ projectile_type = /obj/projectile/bullet/mime projectile_amount = 3 -/datum/action/cooldown/spell/pointed/projectile/finger_guns/try_invoke(feedback = TRUE) +/datum/action/cooldown/spell/pointed/projectile/finger_guns/try_invoke(mob/living/invoker, feedback = TRUE) if(invocation_type == INVOCATION_EMOTE) - if(!ishuman(owner)) + if(!ishuman(invoker)) return FALSE - var/mob/living/carbon/human/human_owner = owner - if(human_owner.incapacitated()) + var/mob/living/carbon/human/human_invoker = invoker + if(human_invoker.incapacitated()) if(feedback) - to_chat(owner, span_warning("You can't properly point your fingers while incapacitated.")) + to_chat(human_invoker, span_warning("You can't properly point your fingers while incapacitated.")) return FALSE - if(human_owner.get_active_held_item()) + if(human_invoker.get_active_held_item()) if(feedback) - to_chat(owner, span_warning("You can't properly fire your finger guns with something in your hand.")) + to_chat(human_invoker, span_warning("You can't properly fire your finger guns with something in your hand.")) return FALSE return ..() diff --git a/code/modules/spells/spell_types/pointed/mind_transfer.dm b/code/modules/spells/spell_types/pointed/mind_transfer.dm index b8719187c4ca1..08c638ffe0707 100644 --- a/code/modules/spells/spell_types/pointed/mind_transfer.dm +++ b/code/modules/spells/spell_types/pointed/mind_transfer.dm @@ -29,9 +29,9 @@ var/unconscious_amount_victim = 40 SECONDS /// List of mobs we cannot mindswap into. var/static/list/mob/living/blacklisted_mobs = typecacheof(list( + /mob/living/basic/demon/slaughter, /mob/living/brain, /mob/living/silicon/pai, - /mob/living/simple_animal/hostile/imp/slaughter, /mob/living/simple_animal/hostile/megafauna, )) @@ -69,10 +69,10 @@ to_chat(owner, span_warning("You don't particularly want to be dead!")) return FALSE if(!living_target.mind && target_requires_mind) - to_chat(owner, span_warning("[living_target.p_theyve(TRUE)] doesn't appear to have a mind to swap into!")) + to_chat(owner, span_warning("[living_target.p_They()] [living_target.p_do()]n't appear to have a mind to swap into!")) return FALSE if(!living_target.key && target_requires_key) - to_chat(owner, span_warning("[living_target.p_theyve(TRUE)] appear[living_target.p_s()] to be catatonic! \ + to_chat(owner, span_warning("[living_target.p_They()] appear[living_target.p_s()] to be catatonic! \ Not even magic can affect [living_target.p_their()] vacant mind.")) return FALSE @@ -102,7 +102,7 @@ || mind_to_swap.has_antag_datum(/datum/antagonist/rev) \ || mind_to_swap.key?[1] == "@" \ ) - to_chat(caster, span_warning("[to_swap.p_their(TRUE)] mind is resisting your spell!")) + to_chat(caster, span_warning("[to_swap.p_Their()] mind is resisting your spell!")) return FALSE // MIND TRANSFER BEGIN diff --git a/code/modules/spells/spell_types/pointed/spell_cards.dm b/code/modules/spells/spell_types/pointed/spell_cards.dm index 47700d2c09a89..65f9561658b7b 100644 --- a/code/modules/spells/spell_types/pointed/spell_cards.dm +++ b/code/modules/spells/spell_types/pointed/spell_cards.dm @@ -7,7 +7,8 @@ school = SCHOOL_EVOCATION cooldown_time = 5 SECONDS - cooldown_reduction_per_rank = 1 SECONDS + cooldown_reduction_per_rank = 2 SECONDS + spell_max_level = 3 invocation = "Sigi'lu M'Fan 'Tasia!" invocation_type = INVOCATION_SHOUT diff --git a/code/modules/spells/spell_types/pointed/swap.dm b/code/modules/spells/spell_types/pointed/swap.dm index bbb80cc021296..6b4a5e45e1437 100644 --- a/code/modules/spells/spell_types/pointed/swap.dm +++ b/code/modules/spells/spell_types/pointed/swap.dm @@ -8,11 +8,11 @@ active_overlay_icon_state = "bg_spell_border_active_blue" school = SCHOOL_TRANSLOCATION - cooldown_time = 30 SECONDS - cooldown_reduction_per_rank = 6 SECONDS + cooldown_time = 25 SECONDS + cooldown_reduction_per_rank = 10 SECONDS + spell_max_level = 3 cast_range = 9 - invocation = "FRO' BRT'TRO, DA!" - invocation_type = INVOCATION_SHOUT + invocation_type = INVOCATION_NONE spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC|SPELL_REQUIRES_STATION active_msg = "You prepare to swap locations with a target..." @@ -35,27 +35,27 @@ return FALSE return TRUE -/datum/action/cooldown/spell/pointed/swap/InterceptClickOn(mob/living/caller, params, atom/click_target) +/datum/action/cooldown/spell/pointed/swap/InterceptClickOn(mob/living/caller, params, atom/target) if(LAZYACCESS(params2list(params), RIGHT_CLICK)) if(!IsAvailable(feedback = TRUE)) return FALSE if(!target) return FALSE - if(!isliving(click_target) || isturf(click_target)) + if(!isliving(target) || isturf(target)) // Find any living being in the list. We aren't picky, it's aim assist after all - click_target = locate(/mob/living) in click_target - if(!click_target) + target = locate(/mob/living) in target + if(!target) to_chat(owner, span_warning("You can only select living beings as secondary target!")) return FALSE - if(click_target == owner) + if(target == owner) if(!isnull(second_target)) to_chat(owner, span_notice("You cancel your secondary swap target!")) second_target = null else to_chat(owner, span_warning("You have no secondary swap target!")) return FALSE - second_target = click_target - to_chat(owner, span_notice("You select [click_target.name] as a secondary swap target!")) + second_target = target + to_chat(owner, span_notice("You select [target.name] as a secondary swap target!")) return FALSE return ..() diff --git a/code/modules/spells/spell_types/right_and_wrong.dm b/code/modules/spells/spell_types/right_and_wrong.dm index fb6a132abfa0f..017e7fc279df3 100644 --- a/code/modules/spells/spell_types/right_and_wrong.dm +++ b/code/modules/spells/spell_types/right_and_wrong.dm @@ -1,8 +1,12 @@ //In this file: Summon Magic/Summon Guns/Summon Events //and corresponding datum controller for them -GLOBAL_DATUM(summon_guns, /datum/summon_things_controller) -GLOBAL_DATUM(summon_magic, /datum/summon_things_controller) +/// A global singleton datum used to store a "summon things controller" for Summon Guns, to grant random guns to stationgoers and latejoiners +GLOBAL_DATUM(summon_guns, /datum/summon_things_controller/item) +/// A global singleton datum used to store a "summon things controller" for Summon Magic, to grant random magical items to stationgoers and latejoiners +GLOBAL_DATUM(summon_magic, /datum/summon_things_controller/item) +/// A global singleton datum used to store a "summon things controller" for Mass Teaching, to grant a specific spellbook entry to stationgoers and latejoiners +GLOBAL_DATUM(mass_teaching, /datum/summon_things_controller/spellbook_entry) // 1 in 50 chance of getting something really special. #define SPECIALIST_MAGIC_PROB 2 @@ -136,7 +140,7 @@ GLOBAL_LIST_INIT(summoned_magic_objectives, list( CRASH("give_magic() was called without a summon magic global datum!") if(to_equip.stat == DEAD || !to_equip.client || !to_equip.mind) return - if(IS_WIZARD(to_equip) || to_equip.mind.has_antag_datum(/datum/antagonist/survivalist/guns)) + if(IS_WIZARD(to_equip) || to_equip.mind.has_antag_datum(/datum/antagonist/survivalist/magic)) return if(!length(to_equip.mind.antag_datums) && prob(GLOB.summon_magic.survivor_probability)) @@ -154,7 +158,7 @@ GLOBAL_LIST_INIT(summoned_magic_objectives, list( if(magic_type in GLOB.summoned_special_magic) to_chat(to_equip, span_notice("You feel incredibly lucky.")) -/* +/** * Triggers Summon Ghosts from [user]. */ /proc/summon_ghosts(mob/user) @@ -174,7 +178,7 @@ GLOBAL_LIST_INIT(summoned_magic_objectives, list( if(user) to_chat(user, span_warning("You... try to summon ghosts, but nothing seems to happen. Shame.")) -/* +/** * Triggers Summon Magic from [user]. * Can optionally be passed [survivor_probability], to set the chance of creating survivalists. * If Summon Magic has already been triggered, gives out magic to everyone again. @@ -191,10 +195,10 @@ GLOBAL_LIST_INIT(summoned_magic_objectives, list( if(GLOB.summon_magic) GLOB.summon_magic.survivor_probability = survivor_probability else - GLOB.summon_magic = new /datum/summon_things_controller(/proc/give_magic, survivor_probability) - GLOB.summon_magic.give_out_gear() + GLOB.summon_magic = new /datum/summon_things_controller/item(survivor_probability, GLOBAL_PROC_REF(give_magic)) + GLOB.summon_magic.equip_all_affected() -/* +/** * Triggers Summon Guns from [user]. * Can optionally be passed [survivor_probability], to set the chance of creating survivalists. * If Summon Guns has already been triggered, gives out guns to everyone again. @@ -211,10 +215,10 @@ GLOBAL_LIST_INIT(summoned_magic_objectives, list( if(GLOB.summon_guns) GLOB.summon_guns.survivor_probability = survivor_probability else - GLOB.summon_guns = new /datum/summon_things_controller(/proc/give_guns, survivor_probability) - GLOB.summon_guns.give_out_gear() + GLOB.summon_guns = new /datum/summon_things_controller/item(survivor_probability, GLOBAL_PROC_REF(give_guns)) + GLOB.summon_guns.equip_all_affected() -/* +/** * Triggers Summon Events from [user]. * If Summon Events has already been triggered, speeds up the event timer. */ @@ -258,12 +262,56 @@ GLOBAL_LIST_INIT(summoned_magic_objectives, list( /datum/summon_things_controller /// Prob. chance someone who is given things will be made a survivalist antagonist. var/survivor_probability = 0 + +/datum/summon_things_controller/New() + RegisterSignal(SSdcs, COMSIG_GLOB_CREWMEMBER_JOINED, PROC_REF(on_latejoin)) + +/datum/summon_things_controller/Destroy(force, ...) + . = ..() + UnregisterSignal(SSdcs, COMSIG_GLOB_CREWMEMBER_JOINED) + +/// Determins if the mob is valid to be given whatever we're handing out. +/datum/summon_things_controller/proc/can_give_to(mob/who) + return ishuman(who) + +/// Returns a list of minds of all mobs affected by what we're giving out. +/datum/summon_things_controller/proc/get_affected_minds() + RETURN_TYPE(/list/datum/mind) + var/list/affected = list() + for(var/datum/mind/maybe_affected as anything in get_crewmember_minds() | get_antag_minds()) + if(!can_give_to(maybe_affected.current)) + continue + var/turf/affected_turf = get_turf(maybe_affected.current) + if(!is_station_level(affected_turf?.z) && !is_mining_level(affected_turf?.z)) + continue + affected += maybe_affected + return affected + +/// Signal proc from [COMSIG_GLOB_CREWMEMBER_JOINED]. +/// Calls give_proc_path on latejoiners a number of times (based on num_to_give_to_latejoiners) +/datum/summon_things_controller/proc/on_latejoin(datum/source, mob/living/new_crewmember, rank) + SIGNAL_HANDLER + + if(!can_give_to(new_crewmember)) + return + + equip_latejoiner(new_crewmember) + +/// Called manually to give out our things to all minds returned by [proc/get_affected_minds()] +/datum/summon_things_controller/proc/equip_all_affected() + CRASH("[type] did not implement equip_all_affected()!") + +/// Called via signal to equip latejoin crewmembers +/datum/summon_things_controller/proc/equip_latejoiner(mob/living/carbon/human/new_crewmember) + CRASH("[type] did not implement equip_latejoiner()!") + +/datum/summon_things_controller/item /// The proc path we call on someone to equip them with stuff. Cannot function without it. var/give_proc_path /// The number of equipment we give to latejoiners, to make sure they catch up if it was casted multiple times. var/num_to_give_to_latejoiners = 0 -/datum/summon_things_controller/New(give_proc_path, survivor_probability = 0) +/datum/summon_things_controller/item/New(survivor_probability = 0, give_proc_path) . = ..() if(isnull(give_proc_path)) CRASH("[type] was created without a give_proc_path (the proc that gives people stuff)!") @@ -271,28 +319,46 @@ GLOBAL_LIST_INIT(summoned_magic_objectives, list( src.survivor_probability = survivor_probability src.give_proc_path = give_proc_path - RegisterSignal(SSdcs, COMSIG_GLOB_CREWMEMBER_JOINED, PROC_REF(gear_up_new_crew)) +/datum/summon_things_controller/item/equip_all_affected() + num_to_give_to_latejoiners += 1 + for(var/datum/mind/crewmember_mind as anything in get_affected_minds()) + INVOKE_ASYNC(GLOBAL_PROC, give_proc_path, crewmember_mind.current) -/datum/summon_things_controller/Destroy(force, ...) +/datum/summon_things_controller/item/equip_latejoiner(mob/living/carbon/human/new_crewmember) + for(var/i in 1 to num_to_give_to_latejoiners) + INVOKE_ASYNC(GLOBAL_PROC, give_proc_path, new_crewmember) + +/datum/summon_things_controller/spellbook_entry + /// Spellbook entry instance to hand out + var/datum/spellbook_entry/used_entry + +/datum/summon_things_controller/spellbook_entry/can_give_to(mob/who) + return istype(used_entry, /datum/spellbook_entry/item) ? ishuman(who) : isliving(who) + +/datum/summon_things_controller/spellbook_entry/get_affected_minds() + // The wizards get in on this too, wherever they may be + return ..() | get_antag_minds(/datum/antagonist/wizard) + +/datum/summon_things_controller/spellbook_entry/New(entry_type) . = ..() - UnregisterSignal(SSdcs, COMSIG_GLOB_CREWMEMBER_JOINED) + if(!ispath(entry_type, /datum/spellbook_entry)) + CRASH("[type] was created with an invalid entry type (must be a spellbook entry typepath)!") -/// Calls our give_proc_path on all humans in the player list. -/datum/summon_things_controller/proc/give_out_gear() - num_to_give_to_latejoiners++ - for(var/mob/living/carbon/human/to_equip in GLOB.player_list) - var/turf/turf_check = get_turf(to_equip) - if(turf_check && is_away_level(turf_check.z)) - continue - INVOKE_ASYNC(GLOBAL_PROC, give_proc_path, to_equip) + used_entry = new entry_type() -/// Signal proc from [COMSIG_GLOB_CREWMEMBER_JOINED]. -/// Calls give_proc_path on latejoiners a number of times (based on num_to_give_to_latejoiners) -/datum/summon_things_controller/proc/gear_up_new_crew(datum/source, mob/living/new_crewmember, rank) - SIGNAL_HANDLER +/datum/summon_things_controller/spellbook_entry/equip_all_affected() + for(var/datum/mind/crewmember_mind as anything in get_affected_minds()) + INVOKE_ASYNC(src, PROC_REF(grant_entry), crewmember_mind.current) - if(!ishuman(new_crewmember)) - return +/datum/summon_things_controller/spellbook_entry/equip_latejoiner(mob/living/carbon/human/new_crewmember) + grant_entry(new_crewmember) - for(var/i in 1 to num_to_give_to_latejoiners) - INVOKE_ASYNC(GLOBAL_PROC, give_proc_path, new_crewmember) +/datum/summon_things_controller/spellbook_entry/proc/grant_entry(mob/to_who) + var/gained = used_entry.buy_spell(to_who, log_buy = FALSE) + // Make spells castable without robes + if(istype(gained, /datum/action/cooldown/spell)) + var/datum/action/cooldown/spell/given_out = gained + given_out.spell_requirements &= ~SPELL_REQUIRES_WIZARD_GARB + + // Makes staffs and related items usable without penalty + ADD_TRAIT(to_who.mind, TRAIT_MAGICALLY_GIFTED, INNATE_TRAIT) diff --git a/code/modules/spells/spell_types/self/basic_heal.dm b/code/modules/spells/spell_types/self/basic_heal.dm index a4acba2d88451..f68403ddeeb3f 100644 --- a/code/modules/spells/spell_types/self/basic_heal.dm +++ b/code/modules/spells/spell_types/self/basic_heal.dm @@ -17,11 +17,17 @@ /// Amount of burn to heal to the spell caster on cast var/burn_to_heal = 10 +/datum/action/cooldown/spell/basic_heal/is_valid_target(atom/cast_on) + return isliving(cast_on) + /datum/action/cooldown/spell/basic_heal/cast(mob/living/cast_on) . = ..() cast_on.visible_message( span_warning("A wreath of gentle light passes over [cast_on]!"), span_notice("You wreath yourself in healing light!"), ) - cast_on.adjustBruteLoss(-brute_to_heal, FALSE) - cast_on.adjustFireLoss(-burn_to_heal) + var/need_mob_update = FALSE + need_mob_update += cast_on.adjustBruteLoss(-brute_to_heal, updating_health = FALSE) + need_mob_update += cast_on.adjustFireLoss(-burn_to_heal, updating_health = FALSE) + if(need_mob_update) + cast_on.updatehealth() diff --git a/code/modules/spells/spell_types/self/mutate.dm b/code/modules/spells/spell_types/self/mutate.dm index 45abae0e5baa6..4908a37053d54 100644 --- a/code/modules/spells/spell_types/self/mutate.dm +++ b/code/modules/spells/spell_types/self/mutate.dm @@ -38,12 +38,26 @@ /datum/action/cooldown/spell/apply_mutations/mutate name = "Mutate" - desc = "This spell causes you to turn into a hulk and gain laser vision for a short while." + desc = "This spell causes you to turn into a gigantic hulk and gain laser vision for a short while. Unlike the lesser nonmagical version, it works on non-humans and mantains hand dexterity as well!" cooldown_time = 40 SECONDS - cooldown_reduction_per_rank = 2.5 SECONDS + cooldown_reduction_per_rank = 5 SECONDS + spell_max_level = 3 invocation = "BIRUZ BENNAR" invocation_type = INVOCATION_SHOUT - mutations_to_add = list(/datum/mutation/human/laser_eyes, /datum/mutation/human/hulk) + mutations_to_add = list(/datum/mutation/human/laser_eyes, /datum/mutation/human/hulk/wizardly, /datum/mutation/human/gigantism) mutation_duration = 30 SECONDS + +/datum/action/cooldown/spell/apply_mutations/mutate/cast(mob/living/carbon/human/cast_on) + ..() + if(HAS_TRAIT(cast_on, TRAIT_USES_SKINTONES) || HAS_TRAIT(cast_on, TRAIT_MUTANT_COLORS)) + return + // Our caster has a species that doesn't greenify when hulked, so we will do it manually. + cast_on.add_atom_colour("#00FF00", TEMPORARY_COLOUR_PRIORITY) + +/datum/action/cooldown/spell/apply_mutations/mutate/remove_mutations(mob/living/carbon/human/cast_on) + if(QDELETED(cast_on) || !is_valid_target(cast_on)) + return + + cast_on.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY) diff --git a/code/modules/spells/spell_types/self/rod_form.dm b/code/modules/spells/spell_types/self/rod_form.dm index fd9a52be412f2..5336036cd2c51 100644 --- a/code/modules/spells/spell_types/self/rod_form.dm +++ b/code/modules/spells/spell_types/self/rod_form.dm @@ -138,9 +138,8 @@ our_wizard = WEAKREF(wizard) wizard.forceMove(src) - wizard.notransform = TRUE wizard.status_flags |= GODMODE - ADD_TRAIT(wizard, TRAIT_MAGICALLY_PHASED, REF(src)) + wizard.add_traits(list(TRAIT_MAGICALLY_PHASED, TRAIT_NO_TRANSFORM), REF(src)) /** * Eject our current wizard, removing them from the rod @@ -152,9 +151,8 @@ return wizard.status_flags &= ~GODMODE - wizard.notransform = FALSE + wizard.remove_traits(list(TRAIT_MAGICALLY_PHASED, TRAIT_NO_TRANSFORM), REF(src)) wizard.forceMove(get_turf(src)) our_wizard = null - REMOVE_TRAIT(wizard, TRAIT_MAGICALLY_PHASED, REF(src)) #undef BASE_WIZ_ROD_RANGE diff --git a/code/modules/spells/spell_types/self/splattercasting_spell.dm b/code/modules/spells/spell_types/self/splattercasting_spell.dm index 1af0cacd2aa74..184a2afab7ca2 100644 --- a/code/modules/spells/spell_types/self/splattercasting_spell.dm +++ b/code/modules/spells/spell_types/self/splattercasting_spell.dm @@ -29,6 +29,7 @@ merely a vessel for the arcane flow. Soon, all that is left is not pain, but hunger.")) cast_on.set_species(/datum/species/vampire) + cast_on.blood_volume = BLOOD_VOLUME_NORMAL ///for predictable blood total amounts when the spell is first cast. cast_on.AddComponent(/datum/component/splattercasting) diff --git a/code/modules/spells/spell_types/self/summonitem.dm b/code/modules/spells/spell_types/self/summonitem.dm index bf01204ce5745..62d6b07816196 100644 --- a/code/modules/spells/spell_types/self/summonitem.dm +++ b/code/modules/spells/spell_types/self/summonitem.dm @@ -15,22 +15,40 @@ ///The obj marked for recall var/obj/marked_item +/datum/action/cooldown/spell/summonitem/New(Target, original) + . = ..() + AddComponent(/datum/component/action_item_overlay, item_callback = CALLBACK(src, PROC_REF(get_marked))) + +/datum/action/cooldown/spell/summonitem/Destroy() + if(!isnull(marked_item)) + unmark_item() + return ..() + +/// For use in callbacks to get the marked item +/datum/action/cooldown/spell/summonitem/proc/get_marked() + return marked_item + /datum/action/cooldown/spell/summonitem/is_valid_target(atom/cast_on) return isliving(cast_on) /// Set the passed object as our marked item /datum/action/cooldown/spell/summonitem/proc/mark_item(obj/to_mark) - name = "Recall [to_mark]" marked_item = to_mark RegisterSignal(marked_item, COMSIG_QDELETING, PROC_REF(on_marked_item_deleted)) + name = "Recall [marked_item]" + build_all_button_icons() + /// Unset our current marked item /datum/action/cooldown/spell/summonitem/proc/unmark_item() - name = initial(name) UnregisterSignal(marked_item, COMSIG_QDELETING) marked_item = null -/// Signal proc for COMSIG_QDELETING on our marked item, unmarks our item if it's deleted + if(!QDELING(src)) + name = initial(name) + build_all_button_icons() + +/// Signal proc for [COMSIG_QDELETING] on our marked item, unmarks our item if it's deleted /datum/action/cooldown/spell/summonitem/proc/on_marked_item_deleted(datum/source) SIGNAL_HANDLER @@ -50,6 +68,12 @@ try_recall_item(cast_on) +/// Checks if the passed item is a valid item that can be marked / linked to summon. +/datum/action/cooldown/spell/summonitem/proc/can_link_to(obj/item/potential_mark, mob/living/caster) + if(potential_mark.item_flags & ABSTRACT) + return FALSE + return TRUE + /// If we don't have a marked item, attempts to mark the caster's held item. /datum/action/cooldown/spell/summonitem/proc/try_link_item(mob/living/caster) var/obj/item/potential_mark = caster.get_active_held_item() @@ -61,7 +85,7 @@ return FALSE var/link_message = "" - if(potential_mark.item_flags & ABSTRACT) + if(!can_link_to(potential_mark, caster)) return FALSE if(SEND_SIGNAL(potential_mark, COMSIG_ITEM_MARK_RETRIEVAL, src, caster) & COMPONENT_BLOCK_MARK_RETRIEVAL) return FALSE @@ -156,18 +180,29 @@ /datum/action/cooldown/spell/summonitem/abductor name = "Baton Recall" - desc = "Activating this would activate your linked baton emergency teleport protocol and recall it back to your hand, Takes a long time for translocation crystals to be enriched after use. REMINDER: YOU NEED TO LINK YOUR BATON MANUALLY!" - button_icon = 'icons/obj/abductor.dmi' - button_icon_state = "wonderprodStun" + desc = "Activating this will trigger your baton's emergency translocation protocol, \ + recalling it to your hand. Takes a long time for the translocation crystals to reset after use." + sound = 'sound/effects/phasein.ogg' + school = SCHOOL_UNSET cooldown_time = 3.5 MINUTES + spell_requirements = NONE invocation_type = INVOCATION_NONE -/datum/action/cooldown/spell/summonitem/abductor/try_link_item(mob/living/caster) - var/obj/item/potential_mark = caster.get_active_held_item() - if(!istype(potential_mark, /obj/item/melee/baton/abductor)) - to_chat(caster, span_warning("Object is unable to be marked, Ensure that the object you are trying to mark is a baton of our origin")) + antimagic_flags = MAGIC_RESISTANCE_MIND + +/datum/action/cooldown/spell/summonitem/abductor/can_link_to(obj/item/potential_mark, mob/living/caster) + . = ..() + if(!.) + return . + if(!istype(potential_mark, /obj/item/melee/baton/abductor)) + to_chat(caster, span_warning("[potential_mark] has no translocation crystals to link to!")) return FALSE - return ..() + + return TRUE + +/datum/action/cooldown/spell/summonitem/abductor/try_unlink_item(mob/living/caster) + to_chat(caster, span_warning("You can't unlink [marked_item]'s translocation crystals.")) + return FALSE diff --git a/code/modules/spells/spell_types/self/voice_of_god.dm b/code/modules/spells/spell_types/self/voice_of_god.dm index 7320022fc30aa..b1efaabd2a826 100644 --- a/code/modules/spells/spell_types/self/voice_of_god.dm +++ b/code/modules/spells/spell_types/self/voice_of_god.dm @@ -38,7 +38,7 @@ cooldown_time = (command_cooldown * cooldown_mod) // "Invocation" is done by the actual voice of god proc -/datum/action/cooldown/spell/voice_of_god/invocation() +/datum/action/cooldown/spell/voice_of_god/invocation(mob/living/invoker) return /datum/action/cooldown/spell/voice_of_god/clown diff --git a/code/modules/spells/spell_types/shapeshift/_shape_status.dm b/code/modules/spells/spell_types/shapeshift/_shape_status.dm index b0e8941600b49..94e1d549af268 100644 --- a/code/modules/spells/spell_types/shapeshift/_shape_status.dm +++ b/code/modules/spells/spell_types/shapeshift/_shape_status.dm @@ -32,7 +32,7 @@ /datum/status_effect/shapechange_mob/on_apply() caster_mob.mind?.transfer_to(owner) caster_mob.forceMove(owner) - caster_mob.notransform = TRUE + ADD_TRAIT(caster_mob, TRAIT_NO_TRANSFORM, REF(src)) caster_mob.apply_status_effect(/datum/status_effect/grouped/stasis, STASIS_SHAPECHANGE_EFFECT) RegisterSignal(owner, COMSIG_LIVING_PRE_WABBAJACKED, PROC_REF(on_wabbajacked)) @@ -77,7 +77,7 @@ UnregisterSignal(caster_mob, list(COMSIG_QDELETING, COMSIG_LIVING_DEATH)) caster_mob.forceMove(owner.loc) - caster_mob.notransform = FALSE + REMOVE_TRAIT(caster_mob, TRAIT_NO_TRANSFORM, REF(src)) caster_mob.remove_status_effect(/datum/status_effect/grouped/stasis, STASIS_SHAPECHANGE_EFFECT) owner.mind?.transfer_to(caster_mob) @@ -115,7 +115,7 @@ // Our caster inside was gibbed, mirror the gib to our mob if(gibbed) - owner.gib() + owner.gib(DROP_ALL_REMAINS) // Otherwise our caster died, just make our mob die else diff --git a/code/modules/spells/spell_types/shapeshift/_shapeshift.dm b/code/modules/spells/spell_types/shapeshift/_shapeshift.dm index 3cb37c3b257fd..5aecd863bce43 100644 --- a/code/modules/spells/spell_types/shapeshift/_shapeshift.dm +++ b/code/modules/spells/spell_types/shapeshift/_shapeshift.dm @@ -29,6 +29,10 @@ /// This should be implemented even if there is only one choice. var/list/atom/possible_shapes +/datum/action/cooldown/spell/shapeshift/Remove(mob/remove_from) + unshift_owner() + return ..() + /datum/action/cooldown/spell/shapeshift/is_valid_target(atom/cast_on) return isliving(cast_on) @@ -128,7 +132,7 @@ // Gib our caster, and make sure to leave nothing behind // (If we leave something behind, it'll drop on the turf of the pipe, which is kinda wrong.) cast_on.investigate_log("has been gibbed by shapeshifting while ventcrawling.", INVESTIGATE_DEATHS) - cast_on.gib(TRUE, TRUE, TRUE) + cast_on.gib() /// Callback for the radial that allows the user to choose their species. /datum/action/cooldown/spell/shapeshift/proc/check_menu(mob/living/caster) @@ -153,6 +157,13 @@ // Make sure it's castable even in their new form. pre_shift_requirements = spell_requirements spell_requirements &= ~(SPELL_REQUIRES_HUMAN|SPELL_REQUIRES_WIZARD_GARB) + ADD_TRAIT(new_shape, TRAIT_DONT_WRITE_MEMORY, SHAPESHIFT_TRAIT) // If you shapeshift into a pet subtype we don't want to update Poly's deathcount or something when you die + + // Make sure that if you shapechanged into a bot, the AI can't just turn you off. + var/mob/living/simple_animal/bot/polymorph_bot = new_shape + if (istype(polymorph_bot)) + polymorph_bot.bot_cover_flags |= BOT_COVER_EMAGGED + polymorph_bot.bot_mode_flags &= ~BOT_MODE_REMOTE_ENABLED return new_shape @@ -178,4 +189,11 @@ /datum/action/cooldown/spell/shapeshift/proc/create_shapeshift_mob(atom/loc) return new shapeshift_type(loc) +/// Removes an active shapeshift effect from the owner +/datum/action/cooldown/spell/shapeshift/proc/unshift_owner() + if (isnull(owner)) + return + if (is_shifted(owner)) + do_unshapeshift(owner) + #undef is_shifted diff --git a/code/modules/spells/spell_types/shapeshift/shapechange.dm b/code/modules/spells/spell_types/shapeshift/shapechange.dm index 95ca1a81dab89..2e890eed6325c 100644 --- a/code/modules/spells/spell_types/shapeshift/shapechange.dm +++ b/code/modules/spells/spell_types/shapeshift/shapechange.dm @@ -4,7 +4,8 @@ Once you've made your choice, it cannot be changed." cooldown_time = 20 SECONDS - cooldown_reduction_per_rank = 3.75 SECONDS + cooldown_reduction_per_rank = 8 SECONDS + spell_max_level = 3 invocation = "RAC'WA NO!" invocation_type = INVOCATION_SHOUT @@ -15,6 +16,6 @@ /mob/living/basic/pet/dog/corgi, /mob/living/basic/carp/magic/chaos, /mob/living/simple_animal/bot/secbot/ed209, - /mob/living/basic/giant_spider/viper/wizard, + /mob/living/basic/spider/giant/viper/wizard, /mob/living/simple_animal/hostile/construct/juggernaut/mystic, ) diff --git a/code/modules/spells/spell_types/teleport/_teleport.dm b/code/modules/spells/spell_types/teleport/_teleport.dm index 794da323dc539..fd6e02cdfb330 100644 --- a/code/modules/spells/spell_types/teleport/_teleport.dm +++ b/code/modules/spells/spell_types/teleport/_teleport.dm @@ -119,7 +119,7 @@ else target_area = tgui_input_list(cast_on, "Chose an area to teleport to.", "Teleport", GLOB.teleportlocs) - if(QDELETED(src) || QDELETED(cast_on) || !can_cast_spell()) + if(QDELETED(src) || QDELETED(cast_on) || (owner && !can_cast_spell())) return . | SPELL_CANCEL_CAST if(!target_area || isnull(GLOB.teleportlocs[target_area])) return . | SPELL_CANCEL_CAST @@ -132,7 +132,7 @@ living_cast_on.buckled?.unbuckle_mob(cast_on, force = TRUE) return ..() -/datum/action/cooldown/spell/teleport/area_teleport/invocation() +/datum/action/cooldown/spell/teleport/area_teleport/invocation(mob/living/invoker) var/area/last_chosen_area = GLOB.teleportlocs[last_chosen_area_name] if(!invocation_says_area || isnull(last_chosen_area)) @@ -140,6 +140,6 @@ switch(invocation_type) if(INVOCATION_SHOUT) - owner.say("[invocation], [uppertext(last_chosen_area.name)]!", forced = "spell ([src])") + invoker.say("[invocation], [uppertext(last_chosen_area.name)]!", forced = "spell ([src])") if(INVOCATION_WHISPER) - owner.whisper("[invocation], [uppertext(last_chosen_area.name)].", forced = "spell ([src])") + invoker.whisper("[invocation], [uppertext(last_chosen_area.name)].", forced = "spell ([src])") diff --git a/code/modules/spells/spell_types/teleport/teleport.dm b/code/modules/spells/spell_types/teleport/teleport.dm index 1dfcf6f2608ec..d486157204283 100644 --- a/code/modules/spells/spell_types/teleport/teleport.dm +++ b/code/modules/spells/spell_types/teleport/teleport.dm @@ -7,7 +7,8 @@ school = SCHOOL_TRANSLOCATION cooldown_time = 1 MINUTES - cooldown_reduction_per_rank = 10 SECONDS + cooldown_reduction_per_rank = 20 SECONDS + spell_max_level = 3 invocation = "SCYAR NILA" invocation_type = INVOCATION_SHOUT diff --git a/code/modules/spells/spell_types/touch/_touch.dm b/code/modules/spells/spell_types/touch/_touch.dm index df3aa0d7cf548..2893c9cf83663 100644 --- a/code/modules/spells/spell_types/touch/_touch.dm +++ b/code/modules/spells/spell_types/touch/_touch.dm @@ -223,7 +223,7 @@ return log_combat(caster, victim, "cast the touch spell [name] on", hand) - spell_feedback() + spell_feedback(caster) remove_hand(caster) /** @@ -240,7 +240,7 @@ // Continue will remove the hand here and stop if(SECONDARY_ATTACK_CONTINUE_CHAIN) log_combat(caster, victim, "cast the touch spell [name] on", hand, "(secondary / alt cast)") - spell_feedback() + spell_feedback(caster) remove_hand(caster) // Call normal will call the normal cast proc diff --git a/code/modules/spells/spell_types/touch/scream_for_me.dm b/code/modules/spells/spell_types/touch/scream_for_me.dm index 941885e757766..231b6927e504b 100644 --- a/code/modules/spells/spell_types/touch/scream_for_me.dm +++ b/code/modules/spells/spell_types/touch/scream_for_me.dm @@ -21,7 +21,7 @@ span_userdanger("The spell bounces from [victim]'s skin back into your arm!"), ) var/obj/item/bodypart/to_wound = caster.get_holding_bodypart_of_item(hand) - to_wound.force_wound_upwards(/datum/wound/slash/critical) + caster.cause_wound_of_type_and_severity(WOUND_SLASH, to_wound, WOUND_SEVERITY_MODERATE, WOUND_SEVERITY_CRITICAL) /datum/action/cooldown/spell/touch/scream_for_me/cast_on_hand_hit(obj/item/melee/touch_attack/hand, mob/living/victim, mob/living/carbon/caster) if(!ishuman(victim)) @@ -29,7 +29,7 @@ var/mob/living/carbon/human/human_victim = victim human_victim.emote("scream") for(var/obj/item/bodypart/to_wound as anything in human_victim.bodyparts) - to_wound.force_wound_upwards(/datum/wound/slash/critical) + human_victim.cause_wound_of_type_and_severity(WOUND_SLASH, to_wound, WOUND_SEVERITY_MODERATE, WOUND_SEVERITY_CRITICAL) return TRUE /obj/item/melee/touch_attack/scream_for_me diff --git a/code/modules/spells/spell_types/touch/smite.dm b/code/modules/spells/spell_types/touch/smite.dm index bcd234979c662..f02ea8247dd22 100644 --- a/code/modules/spells/spell_types/touch/smite.dm +++ b/code/modules/spells/spell_types/touch/smite.dm @@ -48,7 +48,7 @@ return TRUE victim.investigate_log("has been gibbed by the smite spell.", INVESTIGATE_DEATHS) - victim.gib() + victim.gib(DROP_ALL_REMAINS) return TRUE /obj/item/melee/touch_attack/smite diff --git a/code/modules/spells/spell_types/tower_of_babel.dm b/code/modules/spells/spell_types/tower_of_babel.dm index 2b2b777d108b1..3c652579b7f83 100644 --- a/code/modules/spells/spell_types/tower_of_babel.dm +++ b/code/modules/spells/spell_types/tower_of_babel.dm @@ -16,7 +16,7 @@ GLOBAL_DATUM(tower_of_babel, /datum/tower_of_babel) continue if(IS_WIZARD(target) && !badmin) // wizards are not only immune but can speak all languages to taunt their victims over the radio - target.grant_all_languages(source=LANGUAGE_BABEL) + target.grant_all_languages(source = LANGUAGE_BABEL) ADD_TRAIT(target.mind, TRAIT_TOWER_OF_BABEL, MAGIC_TRAIT) to_chat(target, span_reallybig(span_hypnophrase("You feel a magical force improving your speech patterns!"))) continue @@ -49,7 +49,7 @@ GLOBAL_DATUM(tower_of_babel, /datum/tower_of_babel) if(!to_curse.mind) return - if(to_curse.can_block_magic(MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND) || HAS_TRAIT(to_curse.mind, TRAIT_TOWER_OF_BABEL)) + if(to_curse.can_block_magic(MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND) || HAS_MIND_TRAIT(to_curse, TRAIT_TOWER_OF_BABEL)) to_chat(to_curse, span_notice("You have a strange feeling for a moment, but then it passes.")) return diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm index bb401765d6b4d..9ffa24f3c4357 100644 --- a/code/modules/station_goals/bsa.dm +++ b/code/modules/station_goals/bsa.dm @@ -54,8 +54,8 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE) if(!multitool_check_buffer(user, I)) //make sure it has a data buffer return var/obj/item/multitool/M = I - M.buffer = src - to_chat(user, span_notice("You store linkage information in [I]'s buffer.")) + M.set_buffer(src) + balloon_alert(user, "saved to multitool buffer") return TRUE /obj/machinery/bsa/front @@ -71,8 +71,8 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE) if(!multitool_check_buffer(user, I)) //make sure it has a data buffer return var/obj/item/multitool/M = I - M.buffer = src - to_chat(user, span_notice("You store linkage information in [I]'s buffer.")) + M.set_buffer(src) + balloon_alert(user, "saved to multitool buffer") return TRUE /obj/machinery/bsa/middle @@ -94,11 +94,11 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE) if(istype(M.buffer, /obj/machinery/bsa/back)) back_ref = WEAKREF(M.buffer) to_chat(user, span_notice("You link [src] with [M.buffer].")) - M.buffer = null + M.set_buffer(null) else if(istype(M.buffer, /obj/machinery/bsa/front)) front_ref = WEAKREF(M.buffer) to_chat(user, span_notice("You link [src] with [M.buffer].")) - M.buffer = null + M.set_buffer(null) else to_chat(user, span_warning("[I]'s data buffer is empty!")) return TRUE @@ -147,7 +147,7 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE) /obj/machinery/bsa/full name = "Bluespace Artillery" desc = "Long range bluespace artillery." - icon = 'icons/obj/lavaland/cannon.dmi' + icon = 'icons/obj/machines/cannon.dmi' icon_state = "cannon_west" var/static/mutable_appearance/top_layer var/ex_power = 3 @@ -392,6 +392,8 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE) return cannon /obj/machinery/computer/bsa_control/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE obj_flags |= EMAGGED - to_chat(user, span_warning("You emag [src] and hear the focusing crystal short out.")) + balloon_alert(user, "rigged to explode") + to_chat(user, span_warning("You emag [src] and hear the focusing crystal short out. You get the feeling it wouldn't be wise to stand near [src] when the BSA fires...")) + return TRUE diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index e8e9a2ed404e4..03f69c2664cae 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -55,12 +55,11 @@ /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 SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/dna_vault)) if(V.animal_dna.len >= animal_count && V.plant_dna.len >= plant_count && V.human_dna.len >= human_count) return TRUE return FALSE - /obj/machinery/dna_vault name = "DNA Vault" desc = "Break glass in case of apocalypse." diff --git a/code/modules/station_goals/meteor_shield.dm b/code/modules/station_goals/meteor_shield.dm index 3a37ec9de9f1a..7b16606013b21 100644 --- a/code/modules/station_goals/meteor_shield.dm +++ b/code/modules/station_goals/meteor_shield.dm @@ -43,10 +43,10 @@ /datum/station_goal/proc/get_coverage() var/list/coverage = list() - for(var/obj/machinery/satellite/meteor_shield/A in GLOB.machines) - if(!A.active || !is_station_level(A.z)) + for(var/obj/machinery/satellite/meteor_shield/shield_satt as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/satellite/meteor_shield)) + if(!shield_satt.active || !is_station_level(shield_satt.z)) continue - coverage |= view(A.kill_range,A) + coverage |= view(shield_satt.kill_range, shield_satt) return coverage.len /obj/machinery/satellite/meteor_shield @@ -118,10 +118,11 @@ /obj/machinery/satellite/meteor_shield/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) balloon_alert(user, "already emagged!") - return + return FALSE if(!COOLDOWN_FINISHED(src, shared_emag_cooldown)) + balloon_alert(user, "on cooldown!") to_chat(user, span_warning("The last satellite emagged needs [DisplayTimeText(COOLDOWN_TIMELEFT(src, shared_emag_cooldown))] to recalibrate first. Emagging another so soon could damage the satellite network.")) - return + return FALSE var/cooldown_applied = METEOR_SHIELD_EMAG_COOLDOWN if(istype(emag_card, /obj/item/card/emag/meteor_shield_recalibrator)) cooldown_applied /= 3 @@ -132,6 +133,7 @@ say("Recalibrating... ETA:[DisplayTimeText(cooldown_applied)].") if(active) //if we allowed inactive updates a sat could be worth -1 active meteor shields on first emag update_emagged_meteor_sat(user) + return TRUE /obj/machinery/satellite/meteor_shield/proc/update_emagged_meteor_sat(mob/user) if(!active) diff --git a/code/modules/surgery/advanced/bioware/bioware.dm b/code/modules/surgery/advanced/bioware/bioware.dm index 6a4ce36a83f42..4a679e7463146 100644 --- a/code/modules/surgery/advanced/bioware/bioware.dm +++ b/code/modules/surgery/advanced/bioware/bioware.dm @@ -9,16 +9,18 @@ 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) +/datum/bioware/New(mob/living/carbon/human/new_owner) + owner = new_owner + for(var/datum/bioware/bioware as anything in owner.biowares) if(bioware.mod_type == mod_type) qdel(src) return - owner.bioware += src + LAZYADD(owner.biowares, src) on_gain() /datum/bioware/Destroy() + if(owner) + LAZYREMOVE(owner.biowares, src) owner = null if(active) on_lose() diff --git a/code/modules/surgery/advanced/bioware/bioware_surgery.dm b/code/modules/surgery/advanced/bioware/bioware_surgery.dm index 203c8b17fba8a..4db161e524937 100644 --- a/code/modules/surgery/advanced/bioware/bioware_surgery.dm +++ b/code/modules/surgery/advanced/bioware/bioware_surgery.dm @@ -7,7 +7,7 @@ return FALSE if(!istype(target)) return FALSE - for(var/datum/bioware/bioware as anything in target.bioware) + for(var/datum/bioware/bioware as anything in target.biowares) if(bioware.mod_type == bioware_target) return FALSE return TRUE diff --git a/code/modules/surgery/advanced/viral_bonding.dm b/code/modules/surgery/advanced/viral_bonding.dm index 74f131b0b7ed5..a837d47d8b1f5 100644 --- a/code/modules/surgery/advanced/viral_bonding.dm +++ b/code/modules/surgery/advanced/viral_bonding.dm @@ -54,5 +54,6 @@ ) 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 + if(infected_disease.severity != DISEASE_SEVERITY_UNCURABLE) //no curing quirks, sweaty + infected_disease.carrier = TRUE return TRUE diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm index f940584cd6759..8c8924cdcab50 100644 --- a/code/modules/surgery/amputation.dm +++ b/code/modules/surgery/amputation.dm @@ -2,6 +2,7 @@ /datum/surgery/amputation name = "Amputation" requires_bodypart_type = NONE + surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_MORBID_CURIOSITY possible_locs = list( BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, @@ -29,6 +30,7 @@ /obj/item/shears = 300, TOOL_SCALPEL = 100, TOOL_SAW = 100, + /obj/item/shovel/serrated = 75, /obj/item/melee/arm_blade = 80, /obj/item/fireaxe = 50, /obj/item/hatchet = 40, @@ -57,6 +59,11 @@ span_notice("[user] severs [target]'s [parse_zone(target_zone)]!"), ) display_pain(target, "You can no longer feel your severed [parse_zone(target_zone)]!") + + if(HAS_MIND_TRAIT(user, TRAIT_MORBID) && ishuman(user)) + var/mob/living/carbon/human/morbid_weirdo = user + morbid_weirdo.add_mood_event("morbid_dismemberment", /datum/mood_event/morbid_dismemberment) + if(surgery.operated_bodypart) var/obj/item/bodypart/target_limb = surgery.operated_bodypart target_limb.drop_limb() diff --git a/code/modules/surgery/autopsy.dm b/code/modules/surgery/autopsy.dm index 072bfc23a417f..2d106cfd4415e 100644 --- a/code/modules/surgery/autopsy.dm +++ b/code/modules/surgery/autopsy.dm @@ -1,6 +1,6 @@ /datum/surgery/autopsy name = "Autopsy" - surgery_flags = SURGERY_IGNORE_CLOTHES | SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB + surgery_flags = SURGERY_IGNORE_CLOTHES | SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_MORBID_CURIOSITY possible_locs = list(BODY_ZONE_CHEST) steps = list( /datum/surgery_step/incise, @@ -13,7 +13,7 @@ . = ..() if(patient.stat != DEAD) return FALSE - if(HAS_TRAIT(patient, TRAIT_DISSECTED)) + if(HAS_TRAIT_FROM(patient, TRAIT_DISSECTED, AUTOPSY_TRAIT)) return FALSE return TRUE @@ -34,8 +34,16 @@ display_pain(target, "You feel a burning sensation in your chest!") /datum/surgery_step/autopsy/success(mob/user, mob/living/carbon/target, target_zone, obj/item/autopsy_scanner/tool, datum/surgery/surgery, default_display_results = FALSE) - ADD_TRAIT(target, TRAIT_DISSECTED, REF(src)) + ADD_TRAIT(target, TRAIT_DISSECTED, AUTOPSY_TRAIT) + if(!HAS_TRAIT(src, TRAIT_SURGICALLY_ANALYZED)) + ADD_TRAIT(target, TRAIT_SURGICALLY_ANALYZED, AUTOPSY_TRAIT) tool.scan_cadaver(user, target) + 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_AUTOPSY_COMPLETE, target) + if(HAS_MIND_TRAIT(user, TRAIT_MORBID) && ishuman(user)) + var/mob/living/carbon/human/morbid_weirdo = user + morbid_weirdo.add_mood_event("morbid_dissection_success", /datum/mood_event/morbid_dissection_success) return ..() /datum/surgery_step/autopsy/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 202f00a03302e..f929d2a779860 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -4,16 +4,16 @@ force = 3 throwforce = 3 w_class = WEIGHT_CLASS_SMALL - icon = 'icons/mob/species/human/bodyparts.dmi' + icon = 'icons/mob/human/bodyparts.dmi' icon_state = "" //Leave this blank! Bodyparts are built using overlays /// The icon for Organic limbs using greyscale VAR_PROTECTED/icon_greyscale = DEFAULT_BODYPART_ICON_ORGANIC ///The icon for non-greyscale limbs - VAR_PROTECTED/icon_static = 'icons/mob/species/human/bodyparts.dmi' + VAR_PROTECTED/icon_static = 'icons/mob/human/bodyparts.dmi' ///The icon for husked limbs - VAR_PROTECTED/icon_husk = 'icons/mob/species/human/bodyparts.dmi' + VAR_PROTECTED/icon_husk = 'icons/mob/human/bodyparts.dmi' ///The icon for invisible limbs - VAR_PROTECTED/icon_invisible = 'icons/mob/species/human/bodyparts.dmi' + VAR_PROTECTED/icon_invisible = 'icons/mob/human/bodyparts.dmi' ///The type of husk for building an iconstate var/husk_type = "humanoid" layer = BELOW_MOB_LAYER //so it isn't hidden behind objects when on the floor @@ -22,14 +22,15 @@ /// DO NOT MODIFY DIRECTLY. Use set_owner() var/mob/living/carbon/owner + /// If this limb can be scarred. + var/scarrable = TRUE + /** * A bitfield of biological states, exclusively used to determine which wounds this limb will get, * as well as how easily it will happen. - * Set to BIO_FLESH_BONE because most species have both flesh and bone in their limbs. - * - * This currently has absolutely no meaning for robotic limbs. + * Set to BIO_STANDARD_UNJOINTED because most species have both flesh bone and blood in their limbs. */ - var/biological_state = BIO_FLESH_BONE + var/biological_state = BIO_STANDARD_UNJOINTED ///A bitfield of bodytypes for clothing, surgery, and misc information var/bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC ///Defines when a bodypart should not be changed. Example: BP_BLOCK_CHANGE_SPECIES prevents the limb from being overwritten on species gain @@ -62,22 +63,20 @@ var/list/embedded_objects = list() /// are we a hand? if so, which one! var/held_index = 0 + /// A speed modifier we apply to the owner when attached, if any. Positive numbers make it move slower, negative numbers make it move faster. + var/speed_modifier = 0 // Limb disabling variables + ///Whether it is possible for the limb to be disabled whatsoever. TRUE means that it is possible. + var/can_be_disabled = FALSE //Defaults to FALSE, as only human limbs can be disabled, and only the appendages. ///Controls if the limb is disabled. TRUE means it is disabled (similar to being removed, but still present for the sake of targeted interactions). var/bodypart_disabled = FALSE ///Handles limb disabling by damage. If 0 (0%), a limb can't be disabled via damage. If 1 (100%), it is disabled at max limb damage. Anything between is the percentage of damage against maximum limb damage needed to disable the limb. var/disabling_threshold_percentage = 0 - ///Whether it is possible for the limb to be disabled whatsoever. TRUE means that it is possible. - var/can_be_disabled = FALSE //Defaults to FALSE, as only human limbs can be disabled, and only the appendages. - - // Damage state variables + // Damage variables ///A mutiplication of the burn and brute damage that the limb's stored damage contributes to its attached mob's overall wellbeing. var/body_damage_coeff = 1 - ///Used in determining overlays for limb damage states. As the mob receives more burn/brute damage, their limbs update to reflect. - var/brutestate = 0 - var/burnstate = 0 ///The current amount of brute damage the limb has var/brute_dam = 0 ///The current amount of burn damage the limb has @@ -85,14 +84,18 @@ ///The maximum brute OR burn damage a bodypart can take. Once we hit this cap, no more damage of either type! var/max_damage = 0 + //Used in determining overlays for limb damage states. As the mob receives more burn/brute damage, their limbs update to reflect. + var/brutestate = 0 + var/burnstate = 0 + ///Gradually increases while burning when at full damage, destroys the limb when at 100 var/cremation_progress = 0 - // Damage reduction variables for damage handled on the limb level. Handled after worn armor. - ///Amount subtracted from brute damage inflicted on the limb. - var/brute_reduction = 0 - ///Amount subtracted from burn damage inflicted on the limb. - var/burn_reduction = 0 + //Multiplicative damage modifiers + /// Brute damage gets multiplied by this on receive_damage() + var/brute_modifier = 1 + /// Burn damage gets multiplied by this on receive_damage() + var/burn_modifier = 1 //Coloring and proper item icon update var/skin_tone = "" @@ -105,7 +108,6 @@ var/px_x = 0 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 @@ -150,7 +152,7 @@ /// 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 + var/obj/item/stack/medical/gauze/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 @@ -185,6 +187,34 @@ /// List of the above datums which have actually been instantiated, managed automatically var/list/feature_offsets = list() + /// In the case we dont have dismemberable features, or literally cant get wounds, we will use this percent to determine when we can be dismembered. + /// Compared to our ABSOLUTE maximum. Stored in decimal; 0.8 = 80%. + var/hp_percent_to_dismemberable = 0.8 + /// If true, we will use [hp_percent_to_dismemberable] even if we are dismemberable via wounds. Useful for things with extreme wound resistance. + var/use_alternate_dismemberment_calc_even_if_mangleable = FALSE + /// If false, no wound that can be applied to us can mangle our exterior. Used for determining if we should use [hp_percent_to_dismemberable] instead of normal dismemberment. + var/any_existing_wound_can_mangle_our_exterior + /// If false, no wound that can be applied to us can mangle our interior. Used for determining if we should use [hp_percent_to_dismemberable] instead of normal dismemberment. + var/any_existing_wound_can_mangle_our_interior + /// get_damage() / total_damage must surpass this to allow our limb to be disabled, even temporarily, by an EMP. + var/robotic_emp_paralyze_damage_percent_threshold = 0.3 + +/obj/item/bodypart/apply_fantasy_bonuses(bonus) + . = ..() + unarmed_damage_low = modify_fantasy_variable("unarmed_damage_low", unarmed_damage_low, bonus, minimum = 1) + unarmed_damage_high = modify_fantasy_variable("unarmed_damage_high", unarmed_damage_high, bonus, minimum = 1) + brute_modifier = modify_fantasy_variable("brute_modifier", brute_modifier, bonus * 0.02, minimum = 0.7) + burn_modifier = modify_fantasy_variable("burn_modifier", burn_modifier, bonus * 0.02, minimum = 0.7) + wound_resistance = modify_fantasy_variable("wound_resistance", wound_resistance, bonus) + +/obj/item/bodypart/remove_fantasy_bonuses(bonus) + unarmed_damage_low = reset_fantasy_variable("unarmed_damage_low", unarmed_damage_low) + unarmed_damage_high = reset_fantasy_variable("unarmed_damage_high", unarmed_damage_high) + brute_modifier = reset_fantasy_variable("brute_modifier", brute_modifier) + burn_modifier = reset_fantasy_variable("burn_modifier", burn_modifier) + wound_resistance = reset_fantasy_variable("wound_resistance", wound_resistance) + return ..() + /obj/item/bodypart/Initialize(mapload) . = ..() if(can_be_disabled) @@ -236,14 +266,10 @@ if(burn_dam > DAMAGE_PRECISION) . += span_warning("This limb has [burn_dam > 30 ? "severe" : "minor"] burns.") - if(locate(/datum/wound/blunt) in wounds) - . += span_warning("The bones in this limb appear badly cracked.") - if(locate(/datum/wound/slash) in wounds) - . += span_warning("The flesh on this limb appears badly lacerated.") - if(locate(/datum/wound/pierce) in wounds) - . += span_warning("The flesh on this limb appears badly perforated.") - if(locate(/datum/wound/burn) in wounds) - . += span_warning("The flesh on this limb appears badly cooked.") + for(var/datum/wound/wound as anything in wounds) + var/wound_desc = wound.get_limb_examine_description() + if(wound_desc) + . += wound_desc /** * Called when a bodypart is checked for injuries. @@ -310,15 +336,14 @@ if(WOUND_SEVERITY_MODERATE) check_list += "\t [span_warning("Your [name] is suffering [wound.a_or_from] [lowertext(wound.name)]!")]" if(WOUND_SEVERITY_SEVERE) - check_list += "\t [span_boldwarning("Your [name] is suffering [wound.a_or_from] [lowertext(wound.name)]!")]" - if(WOUND_SEVERITY_CRITICAL) check_list += "\t [span_boldwarning("Your [name] is suffering [wound.a_or_from] [lowertext(wound.name)]!!")]" + if(WOUND_SEVERITY_CRITICAL) + check_list += "\t [span_boldwarning("Your [name] is suffering [wound.a_or_from] [lowertext(wound.name)]!!!")]" for(var/obj/item/embedded_thing in embedded_objects) var/stuck_word = embedded_thing.isEmbedHarmless() ? "stuck" : "embedded" check_list += "\t There is \a [embedded_thing] [stuck_word] in your [name]!" - /obj/item/bodypart/blob_act() receive_damage(max_damage, wound_bonus = CANT_WOUND) @@ -377,10 +402,10 @@ var/atom/drop_loc = drop_location() if(IS_ORGANIC_LIMB(src)) playsound(drop_loc, '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()) + QDEL_NULL(current_gauze) + for(var/obj/item/organ/bodypart_organ as anything in get_organs()) bodypart_organ.transfer_to_limb(src, owner) - for(var/obj/item/organ/external/external in external_organs) + for(var/obj/item/organ/external/external as anything in external_organs) external.remove_from_limb() external.forceMove(drop_loc) for(var/obj/item/item_in_bodypart in src) @@ -425,22 +450,24 @@ * attack_direction - The direction the bodypart is attacked from, used to send blood flying in the opposite direction. * damage_source - The source of damage, typically a weapon. */ -/obj/item/bodypart/proc/receive_damage(brute = 0, burn = 0, blocked = 0, updating_health = TRUE, required_bodytype = null, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE, attack_direction = null, damage_source) +/obj/item/bodypart/proc/receive_damage(brute = 0, burn = 0, blocked = 0, updating_health = TRUE, forced = FALSE, required_bodytype = null, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE, attack_direction = null, damage_source) SHOULD_CALL_PARENT(TRUE) var/hit_percent = (100-blocked)/100 if((!brute && !burn) || hit_percent <= 0) return FALSE - if(owner && (owner.status_flags & GODMODE)) - return FALSE //godmode - if(required_bodytype && !(bodytype & required_bodytype)) - return FALSE + if (!forced) + if(!isnull(owner)) + if (owner.status_flags & GODMODE) + return FALSE + if (SEND_SIGNAL(owner, COMSIG_CARBON_LIMB_DAMAGED, src, brute, burn) & COMPONENT_PREVENT_LIMB_DAMAGE) + return FALSE + if(required_bodytype && !(bodytype & required_bodytype)) + return FALSE var/dmg_multi = CONFIG_GET(number/damage_multiplier) * hit_percent - brute = round(max(brute * dmg_multi, 0),DAMAGE_PRECISION) - burn = round(max(burn * dmg_multi, 0),DAMAGE_PRECISION) - brute = max(0, brute - brute_reduction) - burn = max(0, burn - burn_reduction) + brute = round(max(brute * dmg_multi * brute_modifier, 0), DAMAGE_PRECISION) + burn = round(max(burn * dmg_multi * burn_modifier, 0), DAMAGE_PRECISION) if(!brute && !burn) return FALSE @@ -465,43 +492,42 @@ else if (sharpness & SHARP_POINTY) wounding_type = WOUND_PIERCE - if(owner) + if(owner) // i tried to modularize the below, but the modifications to wounding_dmg and wounding_type cant be extracted to a proc var/mangled_state = get_mangled_state() var/easy_dismember = HAS_TRAIT(owner, TRAIT_EASYDISMEMBER) // if we have easydismember, we don't reduce damage when redirecting damage to different types (slashing weapons on mangled/skinless limbs attack at 100% instead of 50%) - //Handling for bone only/flesh only(none right now)/flesh and bone targets - switch(biological_state) - // if we're bone only, all cutting attacks go straight to the bone - if(BIO_BONE) - if(wounding_type == WOUND_SLASH) - wounding_type = WOUND_BLUNT - wounding_dmg *= (easy_dismember ? 1 : 0.6) - else if(wounding_type == WOUND_PIERCE) - wounding_type = WOUND_BLUNT - wounding_dmg *= (easy_dismember ? 1 : 0.75) - if((mangled_state & BODYPART_MANGLED_BONE) && try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus)) - return - // note that there's no handling for BIO_FLESH since we don't have any that are that right now (slimepeople maybe someday) - // standard humanoids - if(BIO_FLESH_BONE) - // if we've already mangled the skin (critical slash or piercing wound), then the bone is exposed, and we can damage it with sharp weapons at a reduced rate - // So a big sharp weapon is still all you need to destroy a limb - if((mangled_state & BODYPART_MANGLED_FLESH) && !(mangled_state & BODYPART_MANGLED_BONE) && sharpness) - playsound(src, "sound/effects/wounds/crackandbleed.ogg", 100) - if(wounding_type == WOUND_SLASH && !easy_dismember) - wounding_dmg *= 0.6 // edged weapons pass along 60% of their wounding damage to the bone since the power is spread out over a larger area - if(wounding_type == WOUND_PIERCE && !easy_dismember) - wounding_dmg *= 0.75 // piercing weapons pass along 75% of their wounding damage to the bone since it's more concentrated - wounding_type = WOUND_BLUNT - else if((mangled_state & BODYPART_MANGLED_FLESH) && (mangled_state & BODYPART_MANGLED_BONE) && try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus)) - return + var/bio_status = get_bio_state_status() + var/has_exterior = ((bio_status & ANATOMY_EXTERIOR)) + var/has_interior = ((bio_status & ANATOMY_INTERIOR)) + + var/exterior_ready_to_dismember = (!has_exterior || ((mangled_state & BODYPART_MANGLED_EXTERIOR))) + + // if we're bone only, all cutting attacks go straight to the bone + if(!has_exterior && has_interior) + if(wounding_type == WOUND_SLASH) + wounding_type = WOUND_BLUNT + wounding_dmg *= (easy_dismember ? 1 : 0.6) + else if(wounding_type == WOUND_PIERCE) + wounding_type = WOUND_BLUNT + wounding_dmg *= (easy_dismember ? 1 : 0.75) + else + // if we've already mangled the skin (critical slash or piercing wound), then the bone is exposed, and we can damage it with sharp weapons at a reduced rate + // So a big sharp weapon is still all you need to destroy a limb + if(has_interior && exterior_ready_to_dismember && !(mangled_state & BODYPART_MANGLED_INTERIOR) && sharpness) + if(wounding_type == WOUND_SLASH && !easy_dismember) + wounding_dmg *= 0.6 // edged weapons pass along 60% of their wounding damage to the bone since the power is spread out over a larger area + if(wounding_type == WOUND_PIERCE && !easy_dismember) + wounding_dmg *= 0.75 // piercing weapons pass along 75% of their wounding damage to the bone since it's more concentrated + wounding_type = WOUND_BLUNT + if ((dismemberable_by_wound() || dismemberable_by_total_damage()) && try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus)) + return // now we have our wounding_type and are ready to carry on with wounds and dealing the actual damage if(wounding_dmg >= WOUND_MINIMUM_DAMAGE && wound_bonus != CANT_WOUND) check_wounding(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus, attack_direction, damage_source = damage_source) for(var/datum/wound/iter_wound as anything in wounds) - iter_wound.receive_damage(wounding_type, wounding_dmg, wound_bonus) + iter_wound.receive_damage(wounding_type, wounding_dmg, wound_bonus, damage_source) /* // END WOUND HANDLING @@ -528,13 +554,90 @@ owner.updatehealth() return update_bodypart_damage_state() || . +/// Returns a bitflag using ANATOMY_EXTERIOR or ANATOMY_INTERIOR. Used to determine if we as a whole have a interior or exterior biostate, or both. +/obj/item/bodypart/proc/get_bio_state_status() + SHOULD_BE_PURE(TRUE) + + var/bio_status = NONE + + for (var/state as anything in GLOB.bio_state_anatomy) + var/flag = text2num(state) + if (!(biological_state & flag)) + continue + + var/value = GLOB.bio_state_anatomy[state] + if (value & ANATOMY_EXTERIOR) + bio_status |= ANATOMY_EXTERIOR + if (value & ANATOMY_INTERIOR) + bio_status |= ANATOMY_INTERIOR + + if ((bio_status & ANATOMY_EXTERIOR_AND_INTERIOR) == ANATOMY_EXTERIOR_AND_INTERIOR) + break + + return bio_status + +/// Returns if our current mangling status allows us to be dismembered. Requires both no exterior/mangled exterior and no interior/mangled interior. +/obj/item/bodypart/proc/dismemberable_by_wound() + SHOULD_BE_PURE(TRUE) + + var/mangled_state = get_mangled_state() + + var/bio_status = get_bio_state_status() + + var/has_exterior = ((bio_status & ANATOMY_EXTERIOR)) + var/has_interior = ((bio_status & ANATOMY_INTERIOR)) + + var/exterior_ready_to_dismember = (!has_exterior || ((mangled_state & BODYPART_MANGLED_EXTERIOR))) + var/interior_ready_to_dismember = (!has_interior || ((mangled_state & BODYPART_MANGLED_INTERIOR))) + + return (exterior_ready_to_dismember && interior_ready_to_dismember) + +/// Returns TRUE if our total percent damage is more or equal to our dismemberable percentage, but FALSE if a wound can cause us to be dismembered. +/obj/item/bodypart/proc/dismemberable_by_total_damage() + + update_wound_theory() + + var/bio_status = get_bio_state_status() + + var/has_interior = ((bio_status & ANATOMY_INTERIOR)) + var/can_theoretically_be_dismembered_by_wound = (any_existing_wound_can_mangle_our_interior || (any_existing_wound_can_mangle_our_exterior && has_interior)) + + var/wound_dismemberable = dismemberable_by_wound() + var/ready_to_use_alternate_formula = (use_alternate_dismemberment_calc_even_if_mangleable || (!wound_dismemberable && !can_theoretically_be_dismembered_by_wound)) + + if (ready_to_use_alternate_formula) + var/percent_to_total_max = (get_damage() / max_damage) + if (percent_to_total_max >= hp_percent_to_dismemberable) + return TRUE + + return FALSE + +/// Updates our "can be theoretically dismembered by wounds" variables by iterating through all wound static data. +/obj/item/bodypart/proc/update_wound_theory() + // We put this here so we dont increase init time by doing this all at once on initialization + // Effectively, we "lazy load" + if (isnull(any_existing_wound_can_mangle_our_interior) || isnull(any_existing_wound_can_mangle_our_exterior)) + any_existing_wound_can_mangle_our_interior = FALSE + any_existing_wound_can_mangle_our_exterior = FALSE + for (var/datum/wound/wound_type as anything in GLOB.all_wound_pregen_data) + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[wound_type] + if (!pregen_data.can_be_applied_to(src, random_roll = TRUE)) // we only consider randoms because non-randoms are usually really specific + continue + if (initial(pregen_data.wound_path_to_generate.wound_flags) & MANGLES_EXTERIOR) + any_existing_wound_can_mangle_our_exterior = TRUE + if (initial(pregen_data.wound_path_to_generate.wound_flags) & MANGLES_INTERIOR) + any_existing_wound_can_mangle_our_interior = TRUE + + if (any_existing_wound_can_mangle_our_interior && any_existing_wound_can_mangle_our_exterior) + break + //Heals brute and burn damage for the organ. Returns 1 if the damage-icon states changed at all. //Damage cannot go below zero. //Cannot remove negative damage (i.e. apply damage) -/obj/item/bodypart/proc/heal_damage(brute, burn, required_bodytype, updating_health = TRUE) +/obj/item/bodypart/proc/heal_damage(brute, burn, updating_health = TRUE, forced = FALSE, required_bodytype) SHOULD_CALL_PARENT(TRUE) - if(required_bodytype && !(bodytype & required_bodytype)) //So we can only heal certain kinds of limbs, ie robotic vs organic. + if(!forced && required_bodytype && !(bodytype & required_bodytype)) //So we can only heal certain kinds of limbs, ie robotic vs organic. return if(brute) @@ -550,6 +653,10 @@ cremation_progress = min(0, cremation_progress - ((brute_dam + burn_dam)*(100/max_damage))) return update_bodypart_damage_state() +///Sets the damage of a bodypart when it is created. +/obj/item/bodypart/proc/set_initial_damage(brute_damage, burn_damage) + set_brute_dam(brute_damage) + set_burn_dam(burn_damage) ///Proc to hook behavior associated to the change of the brute_dam variable's value. /obj/item/bodypart/proc/set_brute_dam(new_value) @@ -560,7 +667,6 @@ . = brute_dam brute_dam = new_value - ///Proc to hook behavior associated to the change of the burn_dam variable's value. /obj/item/bodypart/proc/set_burn_dam(new_value) PROTECTED_PROC(TRUE) @@ -572,8 +678,7 @@ //Returns total damage. /obj/item/bodypart/proc/get_damage() - var/total = brute_dam + burn_dam - return total + return brute_dam + burn_dam //Checks disabled status thresholds /obj/item/bodypart/proc/update_disabled() @@ -616,7 +721,6 @@ last_maxed = FALSE set_disabled(FALSE) - ///Proc to change the value of the `disabled` variable and react to the event of its change. /obj/item/bodypart/proc/set_disabled(new_disabled) SHOULD_CALL_PARENT(TRUE) @@ -632,7 +736,6 @@ owner.update_health_hud() //update the healthdoll owner.update_body() - ///Proc to change the value of the `owner` variable and react to the event of its change. /obj/item/bodypart/proc/set_owner(new_owner) SHOULD_CALL_PARENT(TRUE) @@ -643,6 +746,15 @@ SEND_SIGNAL(src, COMSIG_BODYPART_CHANGED_OWNER, new_owner, old_owner) var/needs_update_disabled = FALSE //Only really relevant if there's an owner if(old_owner) + if(held_index) + old_owner.on_lost_hand(src) + if(old_owner.hud_used) + var/atom/movable/screen/inventory/hand/hand = old_owner.hud_used.hand_slots["[held_index]"] + if(hand) + hand.update_appearance() + old_owner.update_worn_gloves() + if(speed_modifier) + old_owner.update_bodypart_speed_modifier() if(length(bodypart_traits)) old_owner.remove_traits(bodypart_traits, bodypart_trait_source) if(initial(can_be_disabled)) @@ -658,6 +770,15 @@ )) UnregisterSignal(old_owner, COMSIG_ATOM_RESTYLE) if(owner) + if(held_index) + owner.on_added_hand(src, held_index) + if(owner.hud_used) + var/atom/movable/screen/inventory/hand/hand = owner.hud_used.hand_slots["[held_index]"] + if(hand) + hand.update_appearance() + owner.update_worn_gloves() + if(speed_modifier) + owner.update_bodypart_speed_modifier() if(length(bodypart_traits)) owner.add_traits(bodypart_traits, bodypart_trait_source) if(initial(can_be_disabled)) @@ -708,7 +829,6 @@ )) set_disabled(FALSE) - ///Called when TRAIT_PARALYSIS is added to the limb. /obj/item/bodypart/proc/on_paralysis_trait_gain(obj/item/bodypart/source) PROTECTED_PROC(TRUE) @@ -717,7 +837,6 @@ if(can_be_disabled) set_disabled(TRUE) - ///Called when TRAIT_PARALYSIS is removed from the limb. /obj/item/bodypart/proc/on_paralysis_trait_loss(obj/item/bodypart/source) PROTECTED_PROC(TRUE) @@ -726,7 +845,6 @@ if(can_be_disabled) update_disabled() - ///Called when TRAIT_NOLIMBDISABLE is added to the owner. /obj/item/bodypart/proc/on_owner_nolimbdisable_trait_gain(mob/living/carbon/source) PROTECTED_PROC(TRUE) @@ -734,7 +852,6 @@ set_can_be_disabled(FALSE) - ///Called when TRAIT_NOLIMBDISABLE is removed from the owner. /obj/item/bodypart/proc/on_owner_nolimbdisable_trait_loss(mob/living/carbon/source) PROTECTED_PROC(TRUE) @@ -761,10 +878,10 @@ SHOULD_CALL_PARENT(TRUE) if(IS_ORGANIC_LIMB(src)) - if(HAS_TRAIT(owner, TRAIT_HUSK)) + if(owner && HAS_TRAIT(owner, TRAIT_HUSK)) dmg_overlay_type = "" //no damage overlay shown when husked is_husked = TRUE - else if(HAS_TRAIT(owner, TRAIT_INVISIBLE_MAN)) + else if(owner && HAS_TRAIT(owner, TRAIT_INVISIBLE_MAN)) dmg_overlay_type = "" //no damage overlay shown when invisible since the wounds themselves are invisible. is_invisible = TRUE else @@ -775,7 +892,7 @@ if(variable_color) draw_color = variable_color else if(should_draw_greyscale) - draw_color = (species_color) || (skin_tone && skintone2hex(skin_tone)) + draw_color = species_color || (skin_tone ? skintone2hex(skin_tone) : null) else draw_color = null @@ -785,26 +902,24 @@ // There should technically to be an ishuman(owner) check here, but it is absent because no basetype carbons use bodyparts // No, xenos don't actually use bodyparts. Don't ask. var/mob/living/carbon/human/human_owner = owner - var/datum/species/owner_species = human_owner.dna.species - species_flags_list = owner_species.species_traits - limb_gender = (human_owner.physique == MALE) ? "m" : "f" - if(owner_species.use_skintones) + limb_gender = (human_owner.physique == MALE) ? "m" : "f" + if(HAS_TRAIT(human_owner, TRAIT_USES_SKINTONES)) skin_tone = human_owner.skin_tone - else + else if(HAS_TRAIT(human_owner, TRAIT_MUTANT_COLORS)) skin_tone = "" - - if(((MUTCOLORS in owner_species.species_traits) || (DYNCOLORS in owner_species.species_traits))) //Ethereal code. Motherfuckers. + var/datum/species/owner_species = human_owner.dna.species if(owner_species.fixed_mut_color) species_color = owner_species.fixed_mut_color else species_color = human_owner.dna.features["mcolor"] else - species_color = null + skin_tone = "" + species_color = "" draw_color = variable_color if(should_draw_greyscale) //Should the limb be colored? - draw_color ||= (species_color) || (skin_tone && skintone2hex(skin_tone)) + draw_color ||= species_color || (skin_tone ? skintone2hex(skin_tone) : null) recolor_external_organs() return TRUE @@ -894,7 +1009,7 @@ // For some reason this was applied as an overlay on the aux image and limb image before. // I am very sure that this is unnecessary, and i need to treat it as part of the return list // to be able to mask it proper in case this limb is a leg. - if(blocks_emissive) + if(blocks_emissive != EMISSIVE_BLOCK_NONE) var/atom/location = loc || owner || src var/mutable_appearance/limb_em_block = emissive_blocker(limb.icon, limb.icon_state, location, layer = limb.layer, alpha = limb.alpha) limb_em_block.dir = image_dir @@ -906,8 +1021,9 @@ . += aux_em_block //EMISSIVE CODE END - //Ok so legs are a bit goofy in regards to layering, and we will need two images instead of one to fix that - if((body_zone == BODY_ZONE_R_LEG) || (body_zone == BODY_ZONE_L_LEG)) + //No need to handle leg layering if dropped, we only face south anyways + if(!dropped && ((body_zone == BODY_ZONE_R_LEG) || (body_zone == BODY_ZONE_L_LEG))) + //Legs are a bit goofy in regards to layering, and we will need two images instead of one to fix that var/obj/item/bodypart/leg/leg_source = src for(var/image/limb_image in .) //remove the old, unmasked image @@ -1002,7 +1118,7 @@ if(!owner) return - if(HAS_TRAIT(owner, TRAIT_NOBLOOD) || !IS_ORGANIC_LIMB(src)) + if(!can_bleed()) if(cached_bleed_rate != old_bleed_rate) update_part_wound_overlay() return @@ -1017,9 +1133,6 @@ for(var/datum/wound/iter_wound as anything in wounds) cached_bleed_rate += iter_wound.blood_flow - 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() @@ -1043,7 +1156,7 @@ /obj/item/bodypart/proc/update_part_wound_overlay() if(!owner) return FALSE - if(HAS_TRAIT(owner, TRAIT_NOBLOOD) || !IS_ORGANIC_LIMB(src)) + if(!can_bleed()) if(bleed_overlay_icon) bleed_overlay_icon = null owner.update_wound_overlays() @@ -1058,12 +1171,12 @@ if(BLEED_OVERLAY_LOW to BLEED_OVERLAY_MED) new_bleed_icon = "[body_zone]_1" if(BLEED_OVERLAY_MED to BLEED_OVERLAY_GUSH) - if(owner.body_position == LYING_DOWN || IS_IN_STASIS(owner) || owner.stat == DEAD) + if(owner.body_position == LYING_DOWN || HAS_TRAIT(owner, TRAIT_STASIS) || owner.stat == DEAD) new_bleed_icon = "[body_zone]_2s" else new_bleed_icon = "[body_zone]_2" if(BLEED_OVERLAY_GUSH to INFINITY) - if(IS_IN_STASIS(owner) || owner.stat == DEAD) + if(HAS_TRAIT(owner, TRAIT_STASIS) || owner.stat == DEAD) new_bleed_icon = "[body_zone]_2s" else new_bleed_icon = "[body_zone]_3" @@ -1076,6 +1189,11 @@ #undef BLEED_OVERLAY_MED #undef BLEED_OVERLAY_GUSH +/obj/item/bodypart/proc/can_bleed() + SHOULD_BE_PURE(TRUE) + + return ((biological_state & BIO_BLOODED) && (!owner || !HAS_TRAIT(owner, TRAIT_NOBLOOD))) + /** * apply_gauze() is used to- well, apply gauze to a bodypart * @@ -1087,17 +1205,18 @@ * 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_gauze(obj/item/stack/medical/gauze/new_gauze) + if(!istype(new_gauze) || !new_gauze.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) + current_gauze = new new_gauze.type(src, 1) + new_gauze.use(1) + current_gauze.gauzed_bodypart = src if(newly_gauzed) - SEND_SIGNAL(src, COMSIG_BODYPART_GAUZED, gauze) + SEND_SIGNAL(src, COMSIG_BODYPART_GAUZED, current_gauze, new_gauze) /** * seep_gauze() is for when a gauze wrapping absorbs blood or pus from wounds, lowering its absorption capacity. @@ -1114,7 +1233,6 @@ 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) ///Loops through all of the bodypart's external organs and update's their color. /obj/item/bodypart/proc/recolor_external_organs() @@ -1164,14 +1282,17 @@ /obj/item/bodypart/emp_act(severity) . = ..() - if(. & EMP_PROTECT_WIRES || !(bodytype & BODYTYPE_ROBOTIC)) + if(. & EMP_PROTECT_WIRES || !IS_ROBOTIC_LIMB(src)) return FALSE - owner.visible_message(span_danger("[owner]'s [src.name] seems to malfunction!")) - - var/time_needed = 10 SECONDS - var/brute_damage = 5 + 1.5 // Augments reduce brute damage by 5. - var/burn_damage = 4 + 2.5 // As above, but for burn it's 4. + // with defines at the time of writing, this is 2 brute and 1.5 burn + // 2 + 1.5 = 3,5, with 6 limbs thats 21, on a heavy 42 + // 42 * 0.8 = 33.6 + // 3 hits to crit with an ion rifle on someone fully augged at a total of 100.8 damage, although im p sure mood can boost max hp above 100 + // dont forget emps pierce armor, debilitate augs, and usually comes with splash damage e.g. ion rifles or grenades + var/time_needed = AUGGED_LIMB_EMP_PARALYZE_TIME + var/brute_damage = AUGGED_LIMB_EMP_BRUTE_DAMAGE + var/burn_damage = AUGGED_LIMB_EMP_BURN_DAMAGE if(severity == EMP_HEAVY) time_needed *= 2 brute_damage *= 2 @@ -1179,9 +1300,30 @@ receive_damage(brute_damage, burn_damage) 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) + var/damage_percent_to_max = (get_damage() / max_damage) + if (time_needed && (damage_percent_to_max >= robotic_emp_paralyze_damage_percent_threshold)) + owner.visible_message(span_danger("[owner]'s [src] seems to malfunction!")) + 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) + +/// Returns the generic description of our BIO_EXTERNAL feature(s), prioritizing certain ones over others. Returns error on failure. +/obj/item/bodypart/proc/get_external_description() + if (biological_state & BIO_FLESH) + return "flesh" + if (biological_state & BIO_WIRED) + return "wiring" + + return "error" + +/// Returns the generic description of our BIO_INTERNAL feature(s), prioritizing certain ones over others. Returns error on failure. +/obj/item/bodypart/proc/get_internal_description() + if (biological_state & BIO_BONE) + return "bone" + if (biological_state & BIO_METAL) + return "metal" + + return "error" diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index a648d686ebcd3..5a7343f8a0b3a 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -1,11 +1,11 @@ /obj/item/bodypart/proc/can_dismember(obj/item/item) - if(bodypart_flags & BODYPART_UNREMOVABLE) + if(bodypart_flags & BODYPART_UNREMOVABLE || (owner && HAS_TRAIT(owner, TRAIT_NODISMEMBER))) return FALSE return TRUE ///Remove target limb from it's owner, with side effects. -/obj/item/bodypart/proc/dismember(dam_type = BRUTE, silent=TRUE) +/obj/item/bodypart/proc/dismember(dam_type = BRUTE, silent=TRUE, wounding_type) if(!owner || (bodypart_flags & BODYPART_UNREMOVABLE)) return FALSE var/mob/living/carbon/limb_owner = owner @@ -20,13 +20,17 @@ limb_owner.visible_message(span_danger("[limb_owner]'s [name] is violently dismembered!")) INVOKE_ASYNC(limb_owner, TYPE_PROC_REF(/mob, emote), "scream") playsound(get_turf(limb_owner), 'sound/effects/dismember.ogg', 80, TRUE) - limb_owner.add_mood_event("dismembered", /datum/mood_event/dismembered) + limb_owner.add_mood_event("dismembered_[body_zone]", /datum/mood_event/dismembered, src) limb_owner.add_mob_memory(/datum/memory/was_dismembered, lost_limb = src) + + if (wounding_type) + LAZYSET(limb_owner.body_zone_dismembered_by, body_zone, wounding_type) + drop_limb() limb_owner.update_equipment_speed_mods() // Update in case speed affecting item unequipped by dismemberment var/turf/owner_location = limb_owner.loc - if(istype(owner_location)) + if(wounding_type != WOUND_BURN && istype(owner_location) && can_bleed()) limb_owner.add_splatter_floor(owner_location) if(QDELETED(src)) //Could have dropped into lava/explosion/chasm/whatever @@ -34,8 +38,9 @@ if(dam_type == BURN) burn() return TRUE - add_mob_blood(limb_owner) - limb_owner.bleed(rand(20, 40)) + if (can_bleed()) + add_mob_blood(limb_owner) + limb_owner.bleed(rand(20, 40)) var/direction = pick(GLOB.cardinals) var/t_range = rand(2,max(throw_range/2, 2)) var/turf/target_turf = get_turf(src) @@ -47,10 +52,10 @@ if(new_turf.density) break throw_at(target_turf, throw_range, throw_speed) - return TRUE + return TRUE -/obj/item/bodypart/chest/dismember() +/obj/item/bodypart/chest/dismember(dam_type = BRUTE, silent=TRUE, wounding_type) if(!owner) return FALSE var/mob/living/carbon/chest_owner = owner @@ -59,7 +64,7 @@ if(HAS_TRAIT(chest_owner, TRAIT_NODISMEMBER)) return FALSE . = list() - if(isturf(chest_owner.loc)) + if(wounding_type != WOUND_BURN && isturf(chest_owner.loc) && can_bleed()) chest_owner.add_splatter_floor(chest_owner.loc) playsound(get_turf(chest_owner), 'sound/misc/splort.ogg', 80, TRUE) for(var/obj/item/organ/organ as anything in chest_owner.organs) @@ -81,8 +86,6 @@ . += cavity_item cavity_item = null - - ///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) if(!owner) @@ -91,14 +94,10 @@ SEND_SIGNAL(owner, COMSIG_CARBON_REMOVE_LIMB, src, dismembered) SEND_SIGNAL(src, COMSIG_BODYPART_REMOVED, owner, dismembered) - update_limb(TRUE) - //limb is out and about, it can't really be considered an implant - bodypart_flags &= ~BODYPART_IMPLANTED + update_limb(dropping_limb = TRUE) + bodypart_flags &= ~BODYPART_IMPLANTED //limb is out and about, it can't really be considered an implant owner.remove_bodypart(src) - for(var/datum/wound/wound as anything in wounds) - wound.remove_wound(TRUE) - for(var/datum/scar/scar as anything in scars) scar.victim = null LAZYREMOVE(owner.all_scars, scar) @@ -108,6 +107,9 @@ 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/wound/wound as anything in wounds) + wound.remove_wound(TRUE) + 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 @@ -123,7 +125,7 @@ if(!special) if(phantom_owner.dna) for(var/datum/mutation/human/mutation as anything in phantom_owner.dna.mutations) //some mutations require having specific limbs to be kept. - if(mutation.limb_req && mutation.limb_req == body_zone) + if(mutation.limb_req && (mutation.limb_req == body_zone)) to_chat(phantom_owner, span_warning("You feel your [mutation] deactivating from the loss of your [body_zone]!")) phantom_owner.dna.force_lose(mutation) @@ -134,7 +136,6 @@ organ.transfer_to_limb(src, phantom_owner) update_icon_dropped() - synchronize_bodytypes(phantom_owner) phantom_owner.update_health_hud() //update the healthdoll phantom_owner.update_body() phantom_owner.update_body_parts() @@ -157,16 +158,16 @@ * Dismemberment for flesh and bone requires the victim to have the skin on their bodypart destroyed (either a critical cut or piercing wound), and at least a hairline fracture * (severe bone), at which point we can start rolling for dismembering. The attack must also deal at least 10 damage, and must be a brute attack of some kind (sorry for now, cakehat, maybe later) * - * Returns: BODYPART_MANGLED_NONE if we're fine, BODYPART_MANGLED_FLESH if our skin is broken, BODYPART_MANGLED_BONE if our bone is broken, or BODYPART_MANGLED_BOTH if both are broken and we're up for dismembering + * Returns: BODYPART_MANGLED_NONE if we're fine, BODYPART_MANGLED_EXTERIOR if our skin is broken, BODYPART_MANGLED_INTERIOR if our bone is broken, or BODYPART_MANGLED_BOTH if both are broken and we're up for dismembering */ /obj/item/bodypart/proc/get_mangled_state() . = BODYPART_MANGLED_NONE for(var/datum/wound/iter_wound as anything in wounds) - if((iter_wound.wound_flags & MANGLES_BONE)) - . |= BODYPART_MANGLED_BONE - if((iter_wound.wound_flags & MANGLES_FLESH)) - . |= BODYPART_MANGLED_FLESH + if((iter_wound.wound_flags & MANGLES_INTERIOR)) + . |= BODYPART_MANGLED_INTERIOR + if((iter_wound.wound_flags & MANGLES_EXTERIOR)) + . |= BODYPART_MANGLED_EXTERIOR /** * try_dismember() is used, once we've confirmed that a flesh and bone bodypart has both the skin and bone mangled, to actually roll for it @@ -182,14 +183,17 @@ * * bare_wound_bonus: ditto above */ /obj/item/bodypart/proc/try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus) + if (!can_dismember()) + return + if(wounding_dmg < DISMEMBER_MINIMUM_DAMAGE) return var/base_chance = wounding_dmg base_chance += (get_damage() / max_damage * 50) // how much damage we dealt with this blow, + 50% of the damage percentage we already had on this bodypart - if(locate(/datum/wound/blunt/critical) in wounds) // we only require a severe bone break, but if there's a critical bone break, we'll add 15% more - base_chance += 15 + for (var/datum/wound/iterated_wound as anything in wounds) + base_chance += iterated_wound.get_dismember_chance_bonus(base_chance) if(prob(base_chance)) var/datum/wound/loss/dismembering = new @@ -233,13 +237,14 @@ /obj/item/bodypart/chest/drop_limb(special) if(special) return ..() + //if this is not a special drop, this is a mistake + return FALSE /obj/item/bodypart/arm/drop_limb(special) var/mob/living/carbon/arm_owner = owner - . = ..() if(special || !arm_owner) - return + return ..() if(arm_owner.hand_bodyparts[held_index] == src) // We only want to do this if the limb being removed is the active hand part. @@ -256,6 +261,7 @@ if(arm_owner.gloves) arm_owner.dropItemToGround(arm_owner.gloves, TRUE) arm_owner.update_worn_gloves() //to remove the bloody hands overlay + return ..() /obj/item/bodypart/leg/drop_limb(special) if(owner && !special) @@ -327,13 +333,8 @@ moveToNullspace() set_owner(new_limb_owner) new_limb_owner.add_bodypart(src) - if(held_index) - new_limb_owner.on_added_hand(src, held_index) - if(new_limb_owner.hud_used) - var/atom/movable/screen/inventory/hand/hand = new_limb_owner.hud_used.hand_slots["[held_index]"] - if(hand) - hand.update_appearance() - new_limb_owner.update_worn_gloves() + + LAZYREMOVE(new_limb_owner.body_zone_dismembered_by, body_zone) 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. @@ -358,6 +359,10 @@ scar.victim = new_limb_owner LAZYADD(new_limb_owner.all_scars, scar) + if(!special && new_limb_owner.mob_mood.has_mood_of_category("dismembered_[body_zone]")) + new_limb_owner.clear_mood_event("dismembered_[body_zone]") + new_limb_owner.add_mood_event("phantom_pain_[body_zone]", /datum/mood_event/reattachment, src) + update_bodypart_damage_state() if(can_be_disabled) update_disabled() @@ -365,16 +370,15 @@ // 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. new_limb_owner.bodyparts = sort_list(new_limb_owner.bodyparts, GLOBAL_PROC_REF(cmp_bodypart_by_body_part_asc)) - synchronize_bodytypes(new_limb_owner) new_limb_owner.updatehealth() new_limb_owner.update_body() new_limb_owner.update_damage_overlays() SEND_SIGNAL(new_limb_owner, COMSIG_CARBON_POST_ATTACH_LIMB, src, special) return TRUE -/obj/item/bodypart/head/try_attach_limb(mob/living/carbon/new_head_owner, special = FALSE, abort = FALSE) +/obj/item/bodypart/head/try_attach_limb(mob/living/carbon/new_head_owner, special = FALSE) // These are stored before calling super. This is so that if the head is from a different body, it persists its appearance. - var/real_name = src.real_name + var/old_real_name = src.real_name . = ..() @@ -390,9 +394,9 @@ if(eyes) eyes = null - if(real_name) - new_head_owner.real_name = real_name - real_name = "" + if(old_real_name) + new_head_owner.real_name = old_real_name + real_name = new_head_owner.real_name //Handle dental implants for(var/obj/item/reagent_containers/pill/pill in src) @@ -404,43 +408,31 @@ ///Transfer existing hair properties to the new human. if(!special && ishuman(new_head_owner)) var/mob/living/carbon/human/sexy_chad = new_head_owner - sexy_chad.hairstyle = hair_style + sexy_chad.hairstyle = hairstyle sexy_chad.hair_color = hair_color - sexy_chad.facial_hair_color = facial_hair_color sexy_chad.facial_hairstyle = facial_hairstyle - if(hair_gradient_style || facial_hair_gradient_style) - LAZYSETLEN(sexy_chad.grad_style, GRADIENTS_LEN) - LAZYSETLEN(sexy_chad.grad_color, GRADIENTS_LEN) - sexy_chad.grad_style[GRADIENT_HAIR_KEY] = hair_gradient_style - sexy_chad.grad_color[GRADIENT_HAIR_KEY] = hair_gradient_color - sexy_chad.grad_style[GRADIENT_FACIAL_HAIR_KEY] = facial_hair_gradient_style - sexy_chad.grad_color[GRADIENT_FACIAL_HAIR_KEY] = facial_hair_gradient_color + sexy_chad.facial_hair_color = facial_hair_color + sexy_chad.grad_style = gradient_styles?.Copy() + sexy_chad.grad_color = gradient_colors?.Copy() + sexy_chad.lip_style = lip_style + sexy_chad.lip_color = lip_color new_head_owner.updatehealth() new_head_owner.update_body() new_head_owner.update_damage_overlays() -///Makes sure that the owner's bodytype flags match the flags of all of it's parts. -/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/all_limb_flags - for(var/obj/item/bodypart/limb as anything in carbon_owner.bodyparts) - for(var/obj/item/organ/external/ext_organ as anything in limb.external_organs) - 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 - /mob/living/carbon/proc/regenerate_limbs(list/excluded_zones = list()) SEND_SIGNAL(src, COMSIG_CARBON_REGENERATE_LIMBS, excluded_zones) var/list/zone_list = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) + + var/list/dismembered_by_copy = body_zone_dismembered_by?.Copy() + if(length(excluded_zones)) zone_list -= excluded_zones for(var/limb_zone in zone_list) - regenerate_limb(limb_zone) + regenerate_limb(limb_zone, dismembered_by_copy) -/mob/living/carbon/proc/regenerate_limb(limb_zone) +/mob/living/carbon/proc/regenerate_limb(limb_zone, list/dismembered_by_copy = body_zone_dismembered_by?.Copy()) var/obj/item/bodypart/limb if(get_bodypart(limb_zone)) return FALSE @@ -450,9 +442,16 @@ qdel(limb) return FALSE limb.update_limb(is_creating = TRUE) - var/datum/scar/scaries = new - var/datum/wound/loss/phantom_loss = new // stolen valor, really - scaries.generate(limb, phantom_loss) + if (LAZYLEN(dismembered_by_copy)) + var/datum/scar/scaries = new + var/datum/wound/loss/phantom_loss = new // stolen valor, really + phantom_loss.loss_wounding_type = dismembered_by_copy?[limb_zone] + if (phantom_loss.loss_wounding_type) + scaries.generate(limb, phantom_loss) + LAZYREMOVE(dismembered_by_copy, limb_zone) // in case we're using a passed list + else + qdel(scaries) + qdel(phantom_loss) //Copied from /datum/species/proc/on_species_gain() for(var/obj/item/organ/external/organ_path as anything in dna.species.external_organs) diff --git a/code/modules/surgery/bodyparts/hair.dm b/code/modules/surgery/bodyparts/hair.dm deleted file mode 100644 index 2d1690f9125fa..0000000000000 --- a/code/modules/surgery/bodyparts/hair.dm +++ /dev/null @@ -1,117 +0,0 @@ -#define SET_OVERLAY_VALUE(X,Y,Z) if(X) X.Y = Z - -///Part of `update_limb()`, this proc does what the name implies. -/obj/item/bodypart/head/proc/update_hair_and_lips() - var/mob/living/carbon/human/human_head_owner = owner - var/datum/species/owner_species = human_head_owner.dna.species - - if(human_head_owner.lip_style && (LIPS in owner_species.species_traits)) - lip_style = human_head_owner.lip_style - lip_color = human_head_owner.lip_color - else - lip_style = null - lip_color = "white" - - ///FACIAL HAIR CHECKS START - //we check if our hat or helmet hides our facial hair. - facial_hair_hidden = FALSE - if(human_head_owner.head) - var/obj/item/hat = human_head_owner.head - if(hat.flags_inv & HIDEFACIALHAIR) - facial_hair_hidden = TRUE - - if(human_head_owner.wear_mask) - var/obj/item/mask = human_head_owner.wear_mask - if(mask.flags_inv & HIDEFACIALHAIR) - facial_hair_hidden = TRUE - ///FACIAL HAIR CHECKS END - - ///HAIR CHECKS START - hair_hidden = FALSE - if(human_head_owner.head) - var/obj/item/hat = human_head_owner.head - if(hat.flags_inv & HIDEHAIR) - hair_hidden = TRUE - - if(human_head_owner.w_uniform) - var/obj/item/item_uniform = human_head_owner.w_uniform - if(item_uniform.flags_inv & HIDEHAIR) - hair_hidden = TRUE - - if(human_head_owner.wear_mask) - var/obj/item/mask = human_head_owner.wear_mask - if(mask.flags_inv & HIDEHAIR) - hair_hidden = TRUE - ///HAIR CHECKS END - //invisibility stuff - if(HAS_TRAIT(human_head_owner, TRAIT_INVISIBLE_MAN)) - hair_hidden = TRUE - facial_hair_hidden = TRUE - - if(!hair_hidden && !owner.get_organ_slot(ORGAN_SLOT_BRAIN) && !HAS_TRAIT(owner, TRAIT_NO_DEBRAIN_OVERLAY)) - show_debrained = TRUE - else - show_debrained = FALSE - - var/datum/sprite_accessory/sprite_accessory - - facial_overlay = null - facial_gradient_overlay = null - hair_overlay = null - hair_gradient_overlay = null - - hair_alpha = owner_species.hair_alpha - hair_color = human_head_owner.hair_color - facial_hair_color = human_head_owner.facial_hair_color - fixed_hair_color = owner_species.fixed_mut_color //Can be null - hair_style = human_head_owner.hairstyle - facial_hairstyle = human_head_owner.facial_hairstyle - - var/atom/location = loc || owner || src - - if(facial_hairstyle && !facial_hair_hidden && (FACEHAIR in species_flags_list)) - sprite_accessory = GLOB.facial_hairstyles_list[facial_hairstyle] - if(sprite_accessory) - //Create the overlay - facial_overlay = mutable_appearance(sprite_accessory.icon, sprite_accessory.icon_state, -HAIR_LAYER) - facial_overlay.overlays += emissive_blocker(facial_overlay.icon, facial_overlay.icon_state, location, alpha = hair_alpha) - //Gradients - facial_hair_gradient_style = LAZYACCESS(human_head_owner.grad_style, GRADIENT_FACIAL_HAIR_KEY) - if(facial_hair_gradient_style) - facial_hair_gradient_color = LAZYACCESS(human_head_owner.grad_color, GRADIENT_FACIAL_HAIR_KEY) - facial_gradient_overlay = make_gradient_overlay(sprite_accessory.icon, sprite_accessory.icon_state, HAIR_LAYER, GLOB.facial_hair_gradients_list[facial_hair_gradient_style], facial_hair_gradient_color) - - facial_overlay.overlays += emissive_blocker(sprite_accessory.icon, sprite_accessory.icon_state, location, alpha = hair_alpha) - - if(!hair_hidden && !show_debrained && (HAIR in species_flags_list)) - sprite_accessory = GLOB.hairstyles_list[hair_style] - if(sprite_accessory) - hair_overlay = mutable_appearance(sprite_accessory.icon, sprite_accessory.icon_state, -HAIR_LAYER) - hair_overlay.overlays += emissive_blocker(hair_overlay.icon, hair_overlay.icon_state, location, alpha = hair_alpha) - hair_gradient_style = LAZYACCESS(human_head_owner.grad_style, GRADIENT_HAIR_KEY) - if(hair_gradient_style) - hair_gradient_color = LAZYACCESS(human_head_owner.grad_color, GRADIENT_HAIR_KEY) - hair_gradient_overlay = make_gradient_overlay(sprite_accessory.icon, sprite_accessory.icon_state, HAIR_LAYER, GLOB.hair_gradients_list[hair_gradient_style], hair_gradient_color) - - //CREATION-ONLY END - //HAIR COLOR START - if(!override_hair_color) - if(hair_color_source) - if(hair_color_source == "fixedmutcolor") - SET_OVERLAY_VALUE(facial_overlay, color, fixed_hair_color) - SET_OVERLAY_VALUE(hair_overlay, color, fixed_hair_color) - else if(hair_color_source == "mutcolor") - SET_OVERLAY_VALUE(facial_overlay, color, facial_hair_color) - SET_OVERLAY_VALUE(hair_overlay, color, hair_color) - else - SET_OVERLAY_VALUE(facial_overlay, color, hair_color_source) - SET_OVERLAY_VALUE(hair_overlay, color, hair_color_source) - else - SET_OVERLAY_VALUE(facial_overlay, color, facial_hair_color) - SET_OVERLAY_VALUE(hair_overlay, color, hair_color) - else - SET_OVERLAY_VALUE(facial_overlay, color, override_hair_color) - SET_OVERLAY_VALUE(hair_overlay, color, override_hair_color) - //HAIR COLOR END - -#undef SET_OVERLAY_VALUE diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 592a96de7fc33..149490b4a11ab 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -1,7 +1,7 @@ /obj/item/bodypart/head name = BODY_ZONE_HEAD desc = "Didn't make sense not to live for fun, your brain gets smart but your head gets dumb." - icon = 'icons/mob/species/human/bodyparts.dmi' + icon = 'icons/mob/human/bodyparts.dmi' icon_state = "default_human_head" max_damage = 200 body_zone = BODY_ZONE_HEAD @@ -36,36 +36,50 @@ var/show_organs_on_examine = TRUE //Limb appearance info: - var/real_name = "" //Replacement name - ///Hair color source - var/hair_color_source = null - ///Hair colour and style + /// Replacement name + var/real_name = "" + /// Flags related to appearance, such as hair, lips, etc + var/head_flags = HEAD_ALL_FEATURES + + /// Hair style + var/hairstyle = "Bald" + /// Hair colour and style var/hair_color = "#000000" - ///An override color that can be cleared later. - var/override_hair_color = null - ///An override that cannot be cleared under any circumstances - var/fixed_hair_color = null - - var/hair_style = "Bald" + /// Hair alpha var/hair_alpha = 255 - var/hair_gradient_style = null - var/hair_gradient_color = null - //Facial hair colour and style - var/facial_hair_color = "#000000" + /// Is the hair currently hidden by something? + var/hair_hidden = FALSE + + ///Facial hair style var/facial_hairstyle = "Shaved" - var/facial_hair_gradient_style = null - var/facial_hair_gradient_color = null - ///Is the hair currently hidden by something? - var/hair_hidden + ///Facial hair color + var/facial_hair_color = "#000000" + ///Facial hair alpha + var/facial_hair_alpha = 255 ///Is the facial hair currently hidden by something? - var/facial_hair_hidden - ///Draw this head as "debrained" - VAR_PROTECTED/show_debrained = FALSE + var/facial_hair_hidden = FALSE + /// Gradient styles, if any + var/list/gradient_styles = null + /// Gradient colors, if any + var/list/gradient_colors = null + /// An override color that can be cleared later, affects both hair and facial hair + var/override_hair_color = null + /// An override that cannot be cleared under any circumstances, affects both hair and facial hair + var/fixed_hair_color = null + ///Type of lipstick being used, basically var/lip_style - var/lip_color = "white" + ///Lipstick color + var/lip_color + ///Current lipstick trait, if any (such as TRAIT_KISS_OF_DEATH) + var/stored_lipstick_trait + + /// Draw this head as "debrained" + VAR_PROTECTED/show_debrained = FALSE + /// Draw this head as missing eyes + VAR_PROTECTED/show_eyeless = FALSE /// Offset to apply to equipment worn on the ears var/datum/worn_feature_offset/worn_ears_offset @@ -78,18 +92,8 @@ /// Offset to apply to overlays placed on the face var/datum/worn_feature_offset/worn_face_offset - var/stored_lipstick_trait - ///The image for hair - var/mutable_appearance/hair_overlay - ///The image for hair gradient - var/mutable_appearance/hair_gradient_overlay - ///The image for face hair - var/mutable_appearance/facial_overlay - ///The image for facial hair gradient - var/mutable_appearance/facial_gradient_overlay - /obj/item/bodypart/head/Destroy() - QDEL_NULL(brainmob) //order is sensitive, see warning in handle_atom_del() below + QDEL_NULL(brainmob) //order is sensitive, see warning in Exited() below QDEL_NULL(brain) QDEL_NULL(eyes) QDEL_NULL(ears) @@ -102,27 +106,27 @@ QDEL_NULL(worn_face_offset) return ..() -/obj/item/bodypart/head/handle_atom_del(atom/head_atom) - if(head_atom == brain) +/obj/item/bodypart/head/Exited(atom/movable/gone, direction) + if(gone == brain) brain = null update_icon_dropped() if(!QDELETED(brainmob)) //this shouldn't happen without badminnery. message_admins("Brainmob: ([ADMIN_LOOKUPFLW(brainmob)]) was left stranded in [src] at [ADMIN_VERBOSEJMP(src)] without a brain!") brainmob.log_message(", brainmob, was left stranded in [src] without a brain", LOG_GAME) - if(head_atom == brainmob) + if(gone == brainmob) brainmob = null - if(head_atom == eyes) + if(gone == eyes) eyes = null update_icon_dropped() - if(head_atom == ears) + if(gone == ears) ears = null - if(head_atom == tongue) + if(gone == tongue) tongue = null return ..() /obj/item/bodypart/head/examine(mob/user) . = ..() - if(IS_ORGANIC_LIMB(src) && show_organs_on_examine) + if(show_organs_on_examine && IS_ORGANIC_LIMB(src)) if(!brain) . += span_info("The brain has been removed from [src].") else if(brain.suicided || (brainmob && HAS_TRAIT(brainmob, TRAIT_SUICIDED))) @@ -148,7 +152,6 @@ 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 @@ -162,7 +165,6 @@ 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. @@ -183,137 +185,54 @@ eyes = null ears = null tongue = null - + update_limb() return ..() /obj/item/bodypart/head/update_limb(dropping_limb, is_creating) . = ..() - - real_name = owner.real_name - if(HAS_TRAIT(owner, TRAIT_HUSK)) - real_name = "Unknown" - hair_style = "Bald" - facial_hairstyle = "Shaved" - lip_style = null - stored_lipstick_trait = null - update_hair_and_lips() + if(!isnull(owner)) + if(HAS_TRAIT(owner, TRAIT_HUSK)) + real_name = "Unknown" + else + real_name = owner.real_name + update_hair_and_lips(dropping_limb, is_creating) ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/obj/item/bodypart/head/get_limb_icon(dropped, draw_external_organs) - cut_overlays() +/obj/item/bodypart/head/get_limb_icon(dropped) . = ..() - if(dropped) //certain overlays only appear when the limb is being detached from its owner. - - if(IS_ORGANIC_LIMB(src)) //having a robotic head hides certain features. - //facial hair - if(facial_hairstyle && (FACEHAIR in species_flags_list)) - var/datum/sprite_accessory/sprite = GLOB.facial_hairstyles_list[facial_hairstyle] - if(sprite) - var/image/facial_overlay = image(sprite.icon, "[sprite.icon_state]", -HAIR_LAYER, SOUTH) - facial_overlay.color = facial_hair_color - facial_overlay.alpha = hair_alpha - . += facial_overlay - - if(!eyes && !(NOEYEHOLES in species_flags_list) && !(NOEYESPRITES in species_flags_list)) - var/image/no_eyes = image('icons/mob/species/human/human_face.dmi', "eyes_missing", -BODY_LAYER, SOUTH) - worn_glasses_offset?.apply_offset(no_eyes) - . += no_eyes - - //Applies the debrained overlay if there is no brain - if(!brain) - . += get_debrain_overlay(can_rotate = FALSE) - else - var/datum/sprite_accessory/sprite2 = GLOB.hairstyles_list[hair_style] - if(sprite2 && (HAIR in species_flags_list)) - var/image/hair_overlay = image(sprite2.icon, "[sprite2.icon_state]", -HAIR_LAYER, SOUTH) - hair_overlay.color = hair_color - hair_overlay.alpha = hair_alpha - . += hair_overlay - - - // lipstick - if(lip_style) - var/image/lips_overlay = image('icons/mob/species/human/human_face.dmi', "lips_[lip_style]", -BODY_LAYER, SOUTH) - lips_overlay.color = lip_color - . += lips_overlay - - // eyes - if(eyes && eyes.eye_icon_state && !(NOEYESPRITES in species_flags_list)) // This is a bit of copy/paste code from eyes.dm:generate_body_overlay - var/image/eye_left = image('icons/mob/species/human/human_face.dmi', "[eyes.eye_icon_state]_l", -BODY_LAYER, SOUTH) - var/image/eye_right = image('icons/mob/species/human/human_face.dmi', "[eyes.eye_icon_state]_r", -BODY_LAYER, SOUTH) - if(eyes.eye_color_left) - eye_left.color = eyes.eye_color_left - if(eyes.eye_color_right) - eye_right.color = eyes.eye_color_right + . += get_hair_and_lips_icon(dropped) + // We need to get the eyes if we are dropped (ugh) + if(dropped) + // This is a bit of copy/paste code from eyes.dm:generate_body_overlay + if(eyes?.eye_icon_state && (head_flags & HEAD_EYESPRITES)) + var/image/eye_left = image('icons/mob/human/human_face.dmi', "[eyes.eye_icon_state]_l", -BODY_LAYER, SOUTH) + var/image/eye_right = image('icons/mob/human/human_face.dmi', "[eyes.eye_icon_state]_r", -BODY_LAYER, SOUTH) + if(head_flags & HEAD_EYECOLOR) + if(eyes.eye_color_left) + eye_left.color = eyes.eye_color_left + if(eyes.eye_color_right) + eye_right.color = eyes.eye_color_right + if(eyes.overlay_ignore_lighting) + eye_left.overlays += emissive_appearance(eye_left.icon, eye_left.icon_state, src, alpha = eye_left.alpha) + eye_right.overlays += emissive_appearance(eye_right.icon, eye_right.icon_state, src, alpha = eye_right.alpha) + else if(blocks_emissive != EMISSIVE_BLOCK_NONE) + var/atom/location = loc || owner || src + eye_left.overlays += emissive_blocker(eye_left.icon, eye_left.icon_state, location, alpha = eye_left.alpha) + eye_right.overlays += emissive_blocker(eye_right.icon, eye_right.icon_state, location, alpha = eye_right.alpha) + if(worn_face_offset) + worn_face_offset.apply_offset(eye_left) + worn_face_offset.apply_offset(eye_right) . += eye_left . += eye_right - else - if(!facial_hair_hidden && facial_overlay && (FACEHAIR in species_flags_list)) - facial_overlay.alpha = hair_alpha - . += facial_overlay - if(facial_gradient_overlay) - . += facial_gradient_overlay + else if(!eyes && (head_flags & HEAD_EYEHOLES)) + var/image/no_eyes = image('icons/mob/human/human_face.dmi', "eyes_missing", -BODY_LAYER, SOUTH) + worn_face_offset?.apply_offset(no_eyes) + . += no_eyes - if(show_debrained) - . += get_debrain_overlay(can_rotate = TRUE) - - else if(!hair_hidden && hair_overlay && (HAIR in species_flags_list)) - hair_overlay.alpha = hair_alpha - . += hair_overlay - if(hair_gradient_overlay) - . += hair_gradient_overlay - -/// Returns an appropriate debrained icon state -/obj/item/bodypart/head/proc/get_debrain_overlay(can_rotate = TRUE) - var/debrain_icon = 'icons/mob/species/human/human_face.dmi' - var/debrain_icon_state = "debrained" - if(bodytype & BODYTYPE_ALIEN) - debrain_icon = 'icons/mob/species/alien/bodyparts.dmi' - debrain_icon_state = "debrained_alien" - else if(bodytype & BODYTYPE_LARVA_PLACEHOLDER) - debrain_icon = 'icons/mob/species/alien/bodyparts.dmi' - debrain_icon_state = "debrained_larva" - else if(bodytype & BODYTYPE_GOLEM) - debrain_icon = 'icons/mob/species/golems.dmi' - debrain_icon_state = "debrained" - else if((TRAIT_NOBLOOD in species_flags_list)) - return null - - var/image/debrain_overlay - if (can_rotate) - debrain_overlay = mutable_appearance(debrain_icon, debrain_icon_state, HAIR_LAYER) - else - debrain_overlay = image(debrain_icon, debrain_icon_state, -HAIR_LAYER, SOUTH) - return debrain_overlay - -/mob/living/proc/set_haircolor(hex_string, override) return -///Set the haircolor of a human. Override instead sets the override value, it will not be changed away from the override value until override is set to null. -/mob/living/carbon/human/set_haircolor(hex_string, override) - var/obj/item/bodypart/head/my_head = get_bodypart(BODY_ZONE_HEAD) - if(!my_head) - return - - if(override) - my_head.override_hair_color = hex_string - else - hair_color = hex_string - update_body_parts() - -/obj/item/bodypart/head/proc/make_gradient_overlay(file, icon, layer, datum/sprite_accessory/gradient, grad_color) - RETURN_TYPE(/mutable_appearance) - - var/mutable_appearance/gradient_overlay = mutable_appearance(layer = -layer) - var/icon/temp = icon(gradient.icon, gradient.icon_state) - var/icon/temp_hair = icon(file, icon) - temp.Blend(temp_hair, ICON_ADD) - gradient_overlay.icon = temp - gradient_overlay.color = grad_color - return gradient_overlay - /obj/item/bodypart/head/talk_into(mob/holder, message, channel, spans, datum/language/language, list/message_mods) var/mob/headholder = holder if(istype(headholder)) @@ -326,9 +245,9 @@ return "The head of [real_name]" /obj/item/bodypart/head/monkey - icon = 'icons/mob/species/monkey/bodyparts.dmi' - icon_static = 'icons/mob/species/monkey/bodyparts.dmi' - icon_husk = 'icons/mob/species/monkey/bodyparts.dmi' + icon = 'icons/mob/human/species/monkey/bodyparts.dmi' + icon_static = 'icons/mob/human/species/monkey/bodyparts.dmi' + icon_husk = 'icons/mob/human/species/monkey/bodyparts.dmi' husk_type = "monkey" icon_state = "default_monkey_head" limb_id = SPECIES_MONKEY @@ -336,10 +255,11 @@ should_draw_greyscale = FALSE dmg_overlay_type = SPECIES_MONKEY is_dimorphic = FALSE + head_flags = HEAD_LIPS|HEAD_DEBRAIN /obj/item/bodypart/head/alien - icon = 'icons/mob/species/alien/bodyparts.dmi' - icon_static = 'icons/mob/species/alien/bodyparts.dmi' + icon = 'icons/mob/human/species/alien/bodyparts.dmi' + icon_static = 'icons/mob/human/species/alien/bodyparts.dmi' icon_state = "alien_head" limb_id = BODYPART_ID_ALIEN is_dimorphic = FALSE @@ -351,8 +271,8 @@ bodytype = BODYTYPE_HUMANOID | BODYTYPE_ALIEN | BODYTYPE_ORGANIC /obj/item/bodypart/head/larva - icon = 'icons/mob/species/alien/bodyparts.dmi' - icon_static = 'icons/mob/species/alien/bodyparts.dmi' + icon = 'icons/mob/human/species/alien/bodyparts.dmi' + icon_static = 'icons/mob/human/species/alien/bodyparts.dmi' icon_state = "larva_head" limb_id = BODYPART_ID_LARVA is_dimorphic = FALSE diff --git a/code/modules/surgery/bodyparts/head_hair_and_lips.dm b/code/modules/surgery/bodyparts/head_hair_and_lips.dm new file mode 100644 index 0000000000000..010ed9d111615 --- /dev/null +++ b/code/modules/surgery/bodyparts/head_hair_and_lips.dm @@ -0,0 +1,416 @@ +#define SET_OVERLAY_VALUE(overlay,variable,value) if(overlay) overlay.variable = value + +/// Part of `update_limb()`, basically does all the head specific icon stuff. +/obj/item/bodypart/head/proc/update_hair_and_lips(dropping_limb, is_creating) + var/mob/living/carbon/human/human_head_owner = owner + var/datum/species/owner_species = human_head_owner?.dna.species + + //HIDDEN CHECKS START + hair_hidden = FALSE + facial_hair_hidden = FALSE + if(human_head_owner) + if(human_head_owner.head) + var/obj/item/hat = human_head_owner.head + if(hat.flags_inv & HIDEHAIR) + hair_hidden = TRUE + if(hat.flags_inv & HIDEFACIALHAIR) + facial_hair_hidden = TRUE + + if(human_head_owner.wear_mask) + var/obj/item/mask = human_head_owner.wear_mask + if(mask.flags_inv & HIDEHAIR) + hair_hidden = TRUE + if(mask.flags_inv & HIDEFACIALHAIR) + facial_hair_hidden = TRUE + + if(human_head_owner.w_uniform) + var/obj/item/item_uniform = human_head_owner.w_uniform + if(item_uniform.flags_inv & HIDEHAIR) + hair_hidden = TRUE + if(item_uniform.flags_inv & HIDEFACIALHAIR) + facial_hair_hidden = TRUE + //invisibility and husk stuff + if(HAS_TRAIT(human_head_owner, TRAIT_INVISIBLE_MAN) || HAS_TRAIT(human_head_owner, TRAIT_HUSK)) + hair_hidden = TRUE + facial_hair_hidden = TRUE + if(is_husked) + hair_hidden = TRUE + facial_hair_hidden = TRUE + //HIDDEN CHECKS END + + if(owner) + if(!hair_hidden && !owner.get_organ_slot(ORGAN_SLOT_BRAIN) && !HAS_TRAIT(owner, TRAIT_NO_DEBRAIN_OVERLAY)) + show_debrained = TRUE + else + show_debrained = FALSE + + if(!owner.get_organ_slot(ORGAN_SLOT_EYES)) + show_eyeless = TRUE + else + show_eyeless = FALSE + else + if(!hair_hidden && !brain) + show_debrained = TRUE + else + show_debrained = FALSE + + if(!eyes) + show_eyeless = TRUE + else + show_eyeless = FALSE + + if(!is_creating || !owner) + return + + lip_style = human_head_owner.lip_style + lip_color = human_head_owner.lip_color + hairstyle = human_head_owner.hairstyle + hair_alpha = owner_species.hair_alpha + hair_color = human_head_owner.hair_color + facial_hairstyle = human_head_owner.facial_hairstyle + facial_hair_alpha = owner_species.facial_hair_alpha + facial_hair_color = human_head_owner.facial_hair_color + fixed_hair_color = owner_species.fixed_hair_color //Can be null + gradient_styles = human_head_owner.grad_style?.Copy() + gradient_colors = human_head_owner.grad_color?.Copy() + +/obj/item/bodypart/head/proc/get_hair_and_lips_icon(dropped) + SHOULD_CALL_PARENT(TRUE) + RETURN_TYPE(/list) + . = list() + + var/atom/location = loc || owner || src + var/image_dir = NONE + if(dropped) + image_dir = SOUTH + + var/datum/sprite_accessory/sprite_accessory + if(!facial_hair_hidden && lip_style && (head_flags & HEAD_LIPS)) + //not a sprite accessory, don't ask + //Overlay + var/image/lip_overlay = image('icons/mob/human/human_face.dmi', "lips_[lip_style]", -BODY_LAYER, image_dir) + lip_overlay.color = lip_color + //Emissive blocker + if(blocks_emissive != EMISSIVE_BLOCK_NONE) + lip_overlay.overlays += emissive_blocker(lip_overlay.icon, lip_overlay.icon_state, location, alpha = facial_hair_alpha) + //Offsets + worn_face_offset?.apply_offset(lip_overlay) + . += lip_overlay + + var/image/facial_hair_overlay + if(!facial_hair_hidden && facial_hairstyle && (head_flags & HEAD_FACIAL_HAIR)) + sprite_accessory = GLOB.facial_hairstyles_list[facial_hairstyle] + if(sprite_accessory) + //Overlay + facial_hair_overlay = image(sprite_accessory.icon, sprite_accessory.icon_state, -HAIR_LAYER, image_dir) + facial_hair_overlay.alpha = facial_hair_alpha + //Emissive blocker + if(blocks_emissive != EMISSIVE_BLOCK_NONE) + facial_hair_overlay.overlays += emissive_blocker(facial_hair_overlay.icon, facial_hair_overlay.icon_state, location, alpha = facial_hair_alpha) + //Offsets + worn_face_offset?.apply_offset(facial_hair_overlay) + . += facial_hair_overlay + //Gradients + var/facial_hair_gradient_style = LAZYACCESS(gradient_styles, GRADIENT_FACIAL_HAIR_KEY) + if(facial_hair_gradient_style) + var/facial_hair_gradient_color = LAZYACCESS(gradient_colors, GRADIENT_FACIAL_HAIR_KEY) + var/image/facial_hair_gradient_overlay = get_gradient_overlay(sprite_accessory.icon, sprite_accessory.icon_state, -HAIR_LAYER, GLOB.facial_hair_gradients_list[facial_hair_gradient_style], facial_hair_gradient_color) + . += facial_hair_gradient_overlay + + var/image/hair_overlay + if(!(show_debrained && (head_flags & HEAD_DEBRAIN)) && !hair_hidden && hairstyle && (head_flags & HEAD_HAIR)) + sprite_accessory = GLOB.hairstyles_list[hairstyle] + if(sprite_accessory) + //Overlay + hair_overlay = image(sprite_accessory.icon, sprite_accessory.icon_state, -HAIR_LAYER, image_dir) + hair_overlay.alpha = hair_alpha + //Emissive blocker + if(blocks_emissive != EMISSIVE_BLOCK_NONE) + hair_overlay.overlays += emissive_blocker(hair_overlay.icon, hair_overlay.icon_state, location, alpha = hair_alpha) + //Offsets + worn_face_offset?.apply_offset(hair_overlay) + . += hair_overlay + //Gradients + var/hair_gradient_style = LAZYACCESS(gradient_styles, GRADIENT_HAIR_KEY) + if(hair_gradient_style) + var/hair_gradient_color = LAZYACCESS(gradient_colors, GRADIENT_HAIR_KEY) + var/image/hair_gradient_overlay = get_gradient_overlay(sprite_accessory.icon, sprite_accessory.icon_state, -HAIR_LAYER, GLOB.hair_gradients_list[hair_gradient_style], hair_gradient_color) + . += hair_gradient_overlay + + if(show_debrained && (head_flags & HEAD_DEBRAIN)) + . += get_debrain_overlay(can_rotate = !dropped) + + if(show_eyeless && (head_flags & HEAD_EYEHOLES)) + . += get_eyeless_overlay(can_rotate = !dropped) + + //HAIR COLOR START + if(override_hair_color) + SET_OVERLAY_VALUE(facial_hair_overlay, color, override_hair_color) + SET_OVERLAY_VALUE(hair_overlay, color, override_hair_color) + else if(fixed_hair_color) + SET_OVERLAY_VALUE(facial_hair_overlay, color, fixed_hair_color) + SET_OVERLAY_VALUE(hair_overlay, color, fixed_hair_color) + else + SET_OVERLAY_VALUE(facial_hair_overlay, color, facial_hair_color) + SET_OVERLAY_VALUE(hair_overlay, color, hair_color) + //HAIR COLOR END + + return . + +#undef SET_OVERLAY_VALUE + +/// Returns an appropriate debrained overlay +/obj/item/bodypart/head/proc/get_debrain_overlay(can_rotate = TRUE) + RETURN_TYPE(/image) + var/debrain_icon = 'icons/mob/human/human_face.dmi' + var/debrain_icon_state = "debrained" + if(bodytype & BODYTYPE_ALIEN) + debrain_icon = 'icons/mob/human/species/alien/bodyparts.dmi' + debrain_icon_state = "debrained_alien" + else if(bodytype & BODYTYPE_LARVA_PLACEHOLDER) + debrain_icon = 'icons/mob/human/species/alien/bodyparts.dmi' + debrain_icon_state = "debrained_larva" + else if(bodytype & BODYTYPE_GOLEM) + debrain_icon = 'icons/mob/human/species/golems.dmi' + debrain_icon_state = "debrained" + + var/image/debrain_overlay + if(can_rotate) + debrain_overlay = mutable_appearance(debrain_icon, debrain_icon_state, HAIR_LAYER) + else + debrain_overlay = image(debrain_icon, debrain_icon_state, -HAIR_LAYER, SOUTH) + worn_face_offset?.apply_offset(debrain_overlay) + return debrain_overlay + +/// Returns an appropriate missing eyes overlay +/obj/item/bodypart/head/proc/get_eyeless_overlay(can_rotate = TRUE) + RETURN_TYPE(/image) + var/eyeless_icon = 'icons/mob/human/human_face.dmi' + var/eyeless_icon_state = "eyes_missing" + + var/image/eyeless_overlay + if(can_rotate) + eyeless_overlay = mutable_appearance(eyeless_icon, eyeless_icon_state, HAIR_LAYER) + else + eyeless_overlay = image(eyeless_icon, eyeless_icon_state, -HAIR_LAYER, SOUTH) + worn_face_offset?.apply_offset(eyeless_overlay) + return eyeless_overlay + +/// Returns an appropriate hair/facial hair gradient overlay +/obj/item/bodypart/head/proc/get_gradient_overlay(file, icon, layer, datum/sprite_accessory/gradient, grad_color) + RETURN_TYPE(/mutable_appearance) + + var/mutable_appearance/gradient_overlay = mutable_appearance(layer = layer) + var/icon/temp = icon(gradient.icon, gradient.icon_state) + var/icon/temp_hair = icon(file, icon) + temp.Blend(temp_hair, ICON_ADD) + gradient_overlay.icon = temp + gradient_overlay.color = grad_color + worn_face_offset?.apply_offset(gradient_overlay) + return gradient_overlay + +/** + * Used to update the makeup on a human and apply/remove lipstick traits, then store/unstore them on the head object in case it gets severed + **/ +/mob/living/proc/update_lips(new_style, new_color, apply_trait, update = TRUE) + return + +/mob/living/carbon/human/update_lips(new_style, new_color, apply_trait, update = TRUE) + lip_style = new_style + lip_color = new_color + + var/obj/item/bodypart/head/hopefully_a_head = get_bodypart(BODY_ZONE_HEAD) + REMOVE_TRAITS_IN(src, LIPSTICK_TRAIT) + if(hopefully_a_head) + hopefully_a_head.stored_lipstick_trait = null + hopefully_a_head.lip_style = new_style + hopefully_a_head.lip_color = new_color + if(new_style && apply_trait) + ADD_TRAIT(src, apply_trait, LIPSTICK_TRAIT) + hopefully_a_head?.stored_lipstick_trait = apply_trait + + if(update) + update_body_parts() + +/** + * A wrapper for [mob/living/carbon/human/proc/update_lips] that sets the lip style and color to null. + **/ +/mob/living/proc/clean_lips() + return + +/mob/living/carbon/human/clean_lips() + if(!lip_style) + return FALSE + update_lips(null, null, update = TRUE) + return TRUE + +/** + * Set the hair style of a human. + * Update calls update_body_parts(). + **/ +/mob/living/proc/set_hairstyle(new_style, update = TRUE) + return + +/mob/living/carbon/human/set_hairstyle(new_style, update = TRUE) + var/obj/item/bodypart/head/my_head = get_bodypart(BODY_ZONE_HEAD) + + hairstyle = new_style + my_head?.hairstyle = new_style + + if(update) + update_body_parts() + +/** + * Set the hair color of a human. + * Override instead sets the override value, it will not be changed away from the override value until override is set to null. + * Update calls update_body_parts(). + **/ +/mob/living/proc/set_haircolor(hex_string, override, update = TRUE) + return + +/mob/living/carbon/human/set_haircolor(hex_string, override, update = TRUE) + var/obj/item/bodypart/head/my_head = get_bodypart(BODY_ZONE_HEAD) + + if(override) + // aight, no head? tough luck + my_head?.override_hair_color = hex_string + else + hair_color = hex_string + my_head?.hair_color = hex_string + + if(update) + update_body_parts() + +/** + * Set the hair gradient style of a human. + * Update calls update_body_parts(). + **/ +/mob/living/proc/set_hair_gradient_style(new_style, update = TRUE) + return + +/mob/living/carbon/human/set_hair_gradient_style(new_style, update = TRUE) + if(new_style == "None") + new_style = null + if(LAZYACCESS(grad_style, GRADIENT_HAIR_KEY) == new_style) + return + var/obj/item/bodypart/head/my_head = get_bodypart(BODY_ZONE_HEAD) + + LAZYSETLEN(grad_style, GRADIENTS_LEN) + LAZYSETLEN(grad_color, GRADIENTS_LEN) + grad_style[GRADIENT_HAIR_KEY] = new_style + if(my_head) + LAZYSETLEN(my_head.gradient_styles, GRADIENTS_LEN) + LAZYSETLEN(my_head.gradient_colors, GRADIENTS_LEN) + my_head.gradient_styles[GRADIENT_HAIR_KEY] = new_style + + if(update) + update_body_parts() + +/** + * Set the hair gradient color of a human. + * Update calls update_body_parts(). + **/ +/mob/living/proc/set_hair_gradient_color(new_color, update = TRUE) + return + +/mob/living/carbon/human/set_hair_gradient_color(new_color, update = TRUE) + if(LAZYACCESS(grad_color, GRADIENT_HAIR_KEY) == new_color) + return + var/obj/item/bodypart/head/my_head = get_bodypart(BODY_ZONE_HEAD) + + + LAZYSETLEN(grad_style, GRADIENTS_LEN) + LAZYSETLEN(grad_color, GRADIENTS_LEN) + grad_color[GRADIENT_HAIR_KEY] = new_color + if(my_head) + LAZYSETLEN(my_head.gradient_styles, GRADIENTS_LEN) + LAZYSETLEN(my_head.gradient_colors, GRADIENTS_LEN) + my_head.gradient_colors[GRADIENT_HAIR_KEY] = new_color + + if(update) + update_body_parts() + +/** + * Set the facial hair style of a human. + * Update calls update_body_parts(). + **/ +/mob/living/proc/set_facial_hairstyle(new_style, update = TRUE) + return + +/mob/living/carbon/human/set_facial_hairstyle(new_style, update = TRUE) + var/obj/item/bodypart/head/my_head = get_bodypart(BODY_ZONE_HEAD) + + facial_hairstyle = new_style + my_head?.facial_hairstyle = new_style + + if(update) + update_body_parts() + +/** + * Set the facial hair color of a human. + * Override instead sets the override value, it will not be changed away from the override value until override is set to null. + * Update calls update_body_parts(). + **/ +/mob/living/proc/set_facial_haircolor(hex_string, override, update = TRUE) + return + +/mob/living/carbon/human/set_facial_haircolor(hex_string, override, update = TRUE) + var/obj/item/bodypart/head/my_head = get_bodypart(BODY_ZONE_HEAD) + + if(override) + // so no head? tough luck + my_head?.override_hair_color = hex_string + else + facial_hair_color = hex_string + my_head?.facial_hair_color = hex_string + + if(update) + update_body_parts() + +/** + * Set the facial hair gradient style of a human. + * Update calls update_body_parts(). + **/ +/mob/living/proc/set_facial_hair_gradient_style(new_style, update = TRUE) + return + +/mob/living/carbon/human/set_facial_hair_gradient_style(new_style, update = TRUE) + if(new_style == "None") + new_style = null + if(LAZYACCESS(grad_style, GRADIENT_FACIAL_HAIR_KEY) == new_style) + return + var/obj/item/bodypart/head/my_head = get_bodypart(BODY_ZONE_HEAD) + + LAZYSETLEN(grad_style, GRADIENTS_LEN) + LAZYSETLEN(grad_color, GRADIENTS_LEN) + grad_style[GRADIENT_FACIAL_HAIR_KEY] = new_style + if(my_head) + LAZYSETLEN(my_head.gradient_styles, GRADIENTS_LEN) + LAZYSETLEN(my_head.gradient_colors, GRADIENTS_LEN) + my_head.gradient_styles[GRADIENT_FACIAL_HAIR_KEY] = new_style + + if(update) + update_body_parts() + +/** + * Set the facial hair gradient color of a human. + * Update calls update_body_parts(). + **/ +/mob/living/proc/set_facial_hair_gradient_color(new_color, update = TRUE) + return + +/mob/living/carbon/human/set_facial_hair_gradient_color(new_color, update = TRUE) + if(LAZYACCESS(grad_color, GRADIENT_FACIAL_HAIR_KEY) == new_color) + return + var/obj/item/bodypart/head/my_head = get_bodypart(BODY_ZONE_HEAD) + + LAZYSETLEN(grad_style, GRADIENTS_LEN) + LAZYSETLEN(grad_color, GRADIENTS_LEN) + grad_color[GRADIENT_FACIAL_HAIR_KEY] = new_color + if(my_head) + LAZYSETLEN(my_head.gradient_styles, GRADIENTS_LEN) + LAZYSETLEN(my_head.gradient_colors, GRADIENTS_LEN) + my_head.gradient_colors[GRADIENT_FACIAL_HAIR_KEY] = new_color + + if(update) + update_body_parts() diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index 4cc0e1ab1c6bf..f80364fcb5db2 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -43,7 +43,7 @@ /mob/living/carbon/get_active_hand() var/which_hand = BODY_ZONE_PRECISE_L_HAND - if(!(active_hand_index % 2)) + if(!(active_hand_index % RIGHT_HANDS)) which_hand = BODY_ZONE_PRECISE_R_HAND return get_bodypart(check_zone(which_hand)) @@ -54,7 +54,7 @@ /mob/living/carbon/has_left_hand(check_disabled = TRUE) for(var/obj/item/bodypart/hand_instance in hand_bodyparts) - if(!(hand_instance.held_index % 2) || (check_disabled && hand_instance.bodypart_disabled)) + if(!(hand_instance.held_index % RIGHT_HANDS) || (check_disabled && hand_instance.bodypart_disabled)) continue return TRUE return FALSE @@ -70,7 +70,7 @@ /mob/living/carbon/has_right_hand(check_disabled = TRUE) for(var/obj/item/bodypart/hand_instance in hand_bodyparts) - if(hand_instance.held_index % 2 || (check_disabled && hand_instance.bodypart_disabled)) + if(hand_instance.held_index % RIGHT_HANDS || (check_disabled && hand_instance.bodypart_disabled)) continue return TRUE return FALSE @@ -166,9 +166,17 @@ if(BODY_ZONE_CHEST) new_bodypart = new /obj/item/bodypart/chest/alien() if(new_bodypart) - new_bodypart.update_limb(src) + new_bodypart.update_limb(is_creating = TRUE) +/// Makes sure that the owner's bodytype flags match the flags of all of it's parts and organs +/mob/living/carbon/proc/synchronize_bodytypes() + var/all_limb_flags = NONE + for(var/obj/item/bodypart/limb as anything in bodyparts) + for(var/obj/item/organ/external/ext_organ as anything in limb.external_organs) + all_limb_flags |= ext_organ.external_bodytypes + all_limb_flags |= limb.bodytype + bodytype = all_limb_flags /proc/skintone2hex(skin_tone) . = 0 @@ -191,6 +199,14 @@ . = "#c4915e" if("indian") . = "#b87840" + if("mixed1") + . = "#a57a66" + if("mixed2") + . = "#87563d" + if("mixed3") + . = "#725547" + if("mixed4") + . = "#866e63" if("african1") . = "#754523" if("african2") diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm index 47900ab535606..c3924163784e5 100644 --- a/code/modules/surgery/bodyparts/parts.dm +++ b/code/modules/surgery/bodyparts/parts.dm @@ -53,12 +53,12 @@ if(cavity_item) cavity_item.forceMove(drop_location()) cavity_item = null - ..() + return ..() /obj/item/bodypart/chest/monkey - icon = 'icons/mob/species/monkey/bodyparts.dmi' - icon_static = 'icons/mob/species/monkey/bodyparts.dmi' - icon_husk = 'icons/mob/species/monkey/bodyparts.dmi' + icon = 'icons/mob/human/species/monkey/bodyparts.dmi' + icon_static = 'icons/mob/human/species/monkey/bodyparts.dmi' + icon_husk = 'icons/mob/human/species/monkey/bodyparts.dmi' husk_type = "monkey" top_offset = -5 icon_state = "default_monkey_chest" @@ -71,8 +71,8 @@ dmg_overlay_type = SPECIES_MONKEY /obj/item/bodypart/chest/alien - icon = 'icons/mob/species/alien/bodyparts.dmi' - icon_static = 'icons/mob/species/alien/bodyparts.dmi' + icon = 'icons/mob/human/species/alien/bodyparts.dmi' + icon_static = 'icons/mob/human/species/alien/bodyparts.dmi' icon_state = "alien_chest" limb_id = BODYPART_ID_ALIEN bodytype = BODYTYPE_HUMANOID | BODYTYPE_ALIEN | BODYTYPE_ORGANIC @@ -83,8 +83,8 @@ acceptable_bodytype = BODYTYPE_HUMANOID /obj/item/bodypart/chest/larva - icon = 'icons/mob/species/alien/bodyparts.dmi' - icon_static = 'icons/mob/species/alien/bodyparts.dmi' + icon = 'icons/mob/human/species/alien/bodyparts.dmi' + icon_static = 'icons/mob/human/species/alien/bodyparts.dmi' icon_state = "larva_chest" limb_id = BODYPART_ID_LARVA is_dimorphic = FALSE @@ -114,6 +114,8 @@ /// Datum describing how to offset things held in the hands of this arm, the x offset IS functional here var/datum/worn_feature_offset/held_hand_offset + biological_state = BIO_STANDARD_JOINTED + /obj/item/bodypart/arm/Destroy() QDEL_NULL(worn_glove_offset) QDEL_NULL(held_hand_offset) @@ -194,9 +196,9 @@ /obj/item/bodypart/arm/left/monkey - icon = 'icons/mob/species/monkey/bodyparts.dmi' - icon_static = 'icons/mob/species/monkey/bodyparts.dmi' - icon_husk = 'icons/mob/species/monkey/bodyparts.dmi' + icon = 'icons/mob/human/species/monkey/bodyparts.dmi' + icon_static = 'icons/mob/human/species/monkey/bodyparts.dmi' + icon_husk = 'icons/mob/human/species/monkey/bodyparts.dmi' husk_type = "monkey" icon_state = "default_monkey_l_arm" limb_id = SPECIES_MONKEY @@ -211,8 +213,8 @@ unarmed_stun_threshold = 3 /obj/item/bodypart/arm/left/alien - icon = 'icons/mob/species/alien/bodyparts.dmi' - icon_static = 'icons/mob/species/alien/bodyparts.dmi' + icon = 'icons/mob/human/species/alien/bodyparts.dmi' + icon_static = 'icons/mob/human/species/alien/bodyparts.dmi' icon_state = "alien_l_arm" limb_id = BODYPART_ID_ALIEN bodytype = BODYTYPE_HUMANOID | BODYTYPE_ALIEN | BODYTYPE_ORGANIC @@ -297,9 +299,9 @@ /obj/item/bodypart/arm/right/monkey - icon = 'icons/mob/species/monkey/bodyparts.dmi' - icon_static = 'icons/mob/species/monkey/bodyparts.dmi' - icon_husk = 'icons/mob/species/monkey/bodyparts.dmi' + icon = 'icons/mob/human/species/monkey/bodyparts.dmi' + icon_static = 'icons/mob/human/species/monkey/bodyparts.dmi' + icon_husk = 'icons/mob/human/species/monkey/bodyparts.dmi' husk_type = "monkey" icon_state = "default_monkey_r_arm" limb_id = SPECIES_MONKEY @@ -314,8 +316,8 @@ unarmed_stun_threshold = 3 /obj/item/bodypart/arm/right/alien - icon = 'icons/mob/species/alien/bodyparts.dmi' - icon_static = 'icons/mob/species/alien/bodyparts.dmi' + icon = 'icons/mob/human/species/alien/bodyparts.dmi' + icon_static = 'icons/mob/human/species/alien/bodyparts.dmi' icon_state = "alien_r_arm" limb_id = BODYPART_ID_ALIEN bodytype = BODYTYPE_HUMANOID | BODYTYPE_ALIEN | BODYTYPE_ORGANIC @@ -326,13 +328,12 @@ max_damage = 100 should_draw_greyscale = FALSE -/// Parent Type for arms, should not appear in game. +/// Parent Type for legs, should not appear in game. /obj/item/bodypart/leg name = "leg" 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") - bodytype = BODYTYPE_HUMANOID | BODYTYPE_MONKEY | BODYTYPE_ORGANIC max_damage = 50 body_damage_coeff = 0.75 can_be_disabled = TRUE @@ -345,6 +346,8 @@ /// Datum describing how to offset things worn on the foot of this leg, note that an x offset won't do anything here var/datum/worn_feature_offset/worn_foot_offset + biological_state = BIO_STANDARD_JOINTED + /obj/item/bodypart/leg/Destroy() QDEL_NULL(worn_foot_offset) return ..() @@ -413,9 +416,9 @@ owner.set_usable_legs(owner.usable_legs + 1) /obj/item/bodypart/leg/left/monkey - icon = 'icons/mob/species/monkey/bodyparts.dmi' - icon_static = 'icons/mob/species/monkey/bodyparts.dmi' - icon_husk = 'icons/mob/species/monkey/bodyparts.dmi' + icon = 'icons/mob/human/species/monkey/bodyparts.dmi' + icon_static = 'icons/mob/human/species/monkey/bodyparts.dmi' + icon_husk = 'icons/mob/human/species/monkey/bodyparts.dmi' husk_type = "monkey" top_offset = -3 icon_state = "default_monkey_l_leg" @@ -430,8 +433,8 @@ unarmed_stun_threshold = 4 /obj/item/bodypart/leg/left/alien - icon = 'icons/mob/species/alien/bodyparts.dmi' - icon_static = 'icons/mob/species/alien/bodyparts.dmi' + icon = 'icons/mob/human/species/alien/bodyparts.dmi' + icon_static = 'icons/mob/human/species/alien/bodyparts.dmi' icon_state = "alien_l_leg" limb_id = BODYPART_ID_ALIEN bodytype = BODYTYPE_HUMANOID | BODYTYPE_ALIEN | BODYTYPE_ORGANIC @@ -507,9 +510,9 @@ owner.set_usable_legs(owner.usable_legs + 1) /obj/item/bodypart/leg/right/monkey - icon = 'icons/mob/species/monkey/bodyparts.dmi' - icon_static = 'icons/mob/species/monkey/bodyparts.dmi' - icon_husk = 'icons/mob/species/monkey/bodyparts.dmi' + icon = 'icons/mob/human/species/monkey/bodyparts.dmi' + icon_static = 'icons/mob/human/species/monkey/bodyparts.dmi' + icon_husk = 'icons/mob/human/species/monkey/bodyparts.dmi' husk_type = "monkey" top_offset = -3 icon_state = "default_monkey_r_leg" @@ -524,8 +527,8 @@ unarmed_stun_threshold = 4 /obj/item/bodypart/leg/right/alien - icon = 'icons/mob/species/alien/bodyparts.dmi' - icon_static = 'icons/mob/species/alien/bodyparts.dmi' + icon = 'icons/mob/human/species/alien/bodyparts.dmi' + icon_static = 'icons/mob/human/species/alien/bodyparts.dmi' icon_state = "alien_r_leg" limb_id = BODYPART_ID_ALIEN bodytype = BODYTYPE_HUMANOID | BODYTYPE_ALIEN | BODYTYPE_ORGANIC diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm index 7e52016748af1..37b6cef989750 100644 --- a/code/modules/surgery/bodyparts/robot_bodyparts.dm +++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm @@ -1,3 +1,4 @@ + #define ROBOTIC_LIGHT_BRUTE_MSG "marred" #define ROBOTIC_MEDIUM_BRUTE_MSG "dented" #define ROBOTIC_HEAVY_BRUTE_MSG "falling apart" @@ -26,8 +27,8 @@ change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" - brute_reduction = 5 - burn_reduction = 4 + brute_modifier = 0.8 + burn_modifier = 0.8 light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG @@ -37,6 +38,8 @@ medium_burn_msg = ROBOTIC_MEDIUM_BURN_MSG heavy_burn_msg = ROBOTIC_HEAVY_BURN_MSG + biological_state = (BIO_ROBOTIC|BIO_JOINTED) + damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT, CLONE = DEFAULT_CLONE_EXAMINE_TEXT) disabling_threshold_percentage = 1 @@ -56,8 +59,9 @@ change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" - brute_reduction = 5 - burn_reduction = 4 + brute_modifier = 0.8 + burn_modifier = 0.8 + disabling_threshold_percentage = 1 light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG @@ -68,6 +72,8 @@ medium_burn_msg = ROBOTIC_MEDIUM_BURN_MSG heavy_burn_msg = ROBOTIC_HEAVY_BURN_MSG + biological_state = (BIO_ROBOTIC|BIO_JOINTED) + damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT, CLONE = DEFAULT_CLONE_EXAMINE_TEXT) /obj/item/bodypart/leg/left/robot @@ -86,8 +92,9 @@ change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" - brute_reduction = 5 - burn_reduction = 4 + brute_modifier = 0.8 + burn_modifier = 0.8 + disabling_threshold_percentage = 1 light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG @@ -98,16 +105,21 @@ medium_burn_msg = ROBOTIC_MEDIUM_BURN_MSG heavy_burn_msg = ROBOTIC_HEAVY_BURN_MSG + biological_state = (BIO_ROBOTIC|BIO_JOINTED) + damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT, CLONE = DEFAULT_CLONE_EXAMINE_TEXT) /obj/item/bodypart/leg/left/robot/emp_act(severity) . = ..() if(!.) return - owner.Knockdown(severity == EMP_HEAVY ? 20 SECONDS : 10 SECONDS) + var/knockdown_time = AUGGED_LEG_EMP_KNOCKDOWN_TIME + if (severity == EMP_HEAVY) + knockdown_time *= 2 + owner.Knockdown(knockdown_time) if(owner.incapacitated(IGNORE_RESTRAINTS|IGNORE_GRAB)) // So the message isn't duplicated. If they were stunned beforehand by something else, then the message not showing makes more sense anyways. return - to_chat(owner, span_danger("As your [src.name] unexpectedly malfunctions, it causes you to fall to the ground!")) + to_chat(owner, span_danger("As your [src] unexpectedly malfunctions, it causes you to fall to the ground!")) /obj/item/bodypart/leg/right/robot name = "cyborg right leg" @@ -125,8 +137,9 @@ change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" - brute_reduction = 5 - burn_reduction = 4 + brute_modifier = 0.8 + burn_modifier = 0.8 + disabling_threshold_percentage = 1 light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG @@ -137,16 +150,21 @@ medium_burn_msg = ROBOTIC_MEDIUM_BURN_MSG heavy_burn_msg = ROBOTIC_HEAVY_BURN_MSG + biological_state = (BIO_ROBOTIC|BIO_JOINTED) + damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT, CLONE = DEFAULT_CLONE_EXAMINE_TEXT) /obj/item/bodypart/leg/right/robot/emp_act(severity) . = ..() if(!.) return - owner.Knockdown(severity == EMP_HEAVY ? 20 SECONDS : 10 SECONDS) + var/knockdown_time = AUGGED_LEG_EMP_KNOCKDOWN_TIME + if (severity == EMP_HEAVY) + knockdown_time *= 2 + owner.Knockdown(knockdown_time) if(owner.incapacitated(IGNORE_RESTRAINTS|IGNORE_GRAB)) // So the message isn't duplicated. If they were stunned beforehand by something else, then the message not showing makes more sense anyways. return - to_chat(owner, span_danger("As your [src.name] unexpectedly malfunctions, it causes you to fall to the ground!")) + to_chat(owner, span_danger("As your [src] unexpectedly malfunctions, it causes you to fall to the ground!")) /obj/item/bodypart/chest/robot name = "cyborg torso" @@ -163,8 +181,8 @@ change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" - brute_reduction = 5 - burn_reduction = 4 + brute_modifier = 0.8 + burn_modifier = 0.8 light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG @@ -174,31 +192,44 @@ medium_burn_msg = ROBOTIC_MEDIUM_BURN_MSG heavy_burn_msg = ROBOTIC_HEAVY_BURN_MSG + biological_state = (BIO_ROBOTIC) + damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT, CLONE = DEFAULT_CLONE_EXAMINE_TEXT) var/wired = FALSE var/obj/item/stock_parts/cell/cell = null + robotic_emp_paralyze_damage_percent_threshold = 0.6 + /obj/item/bodypart/chest/robot/emp_act(severity) . = ..() if(!.) return - to_chat(owner, span_danger("Your [src.name]'s logic boards temporarily become unresponsive!")) + + var/stun_time = 0 + var/shift_x = 3 + var/shift_y = 0 + var/shake_duration = AUGGED_CHEST_EMP_SHAKE_TIME + if(severity == EMP_HEAVY) - owner.Stun(6 SECONDS) - owner.Shake(pixelshiftx = 5, pixelshifty = 2, duration = 4 SECONDS) - return + stun_time = AUGGED_CHEST_EMP_STUN_TIME - owner.Stun(3 SECONDS) - owner.Shake(pixelshiftx = 3, pixelshifty = 0, duration = 2.5 SECONDS) + shift_x = 5 + shift_y = 2 + + var/damage_percent_to_max = (get_damage() / max_damage) + if (stun_time && (damage_percent_to_max >= robotic_emp_paralyze_damage_percent_threshold)) + to_chat(owner, span_danger("Your [src]'s logic boards temporarily become unresponsive!")) + owner.Stun(stun_time) + owner.Shake(pixelshiftx = shift_x, pixelshifty = shift_y, duration = shake_duration) /obj/item/bodypart/chest/robot/get_cell() return cell -/obj/item/bodypart/chest/robot/handle_atom_del(atom/chest_atom) - if(chest_atom == cell) +/obj/item/bodypart/chest/robot/Exited(atom/movable/gone, direction) + . = ..() + if(gone == cell) cell = null - return ..() /obj/item/bodypart/chest/robot/Destroy() QDEL_NULL(cell) @@ -246,8 +277,6 @@ screwtool.play_tool_sound(src) to_chat(user, span_notice("Remove [cell] from [src].")) cell.forceMove(drop_location()) - cell = null - /obj/item/bodypart/chest/robot/examine(mob/user) . = ..() @@ -267,11 +296,8 @@ if(wired) new /obj/item/stack/cable_coil(drop_loc, 1) wired = FALSE - if(cell) - cell.forceMove(drop_loc) - cell = null - ..() - + cell?.forceMove(drop_loc) + return ..() /obj/item/bodypart/head/robot name = "cyborg head" @@ -288,8 +314,8 @@ change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" - brute_reduction = 5 - burn_reduction = 4 + brute_modifier = 0.8 + burn_modifier = 0.8 light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG @@ -299,8 +325,12 @@ medium_burn_msg = ROBOTIC_MEDIUM_BURN_MSG heavy_burn_msg = ROBOTIC_HEAVY_BURN_MSG + biological_state = (BIO_ROBOTIC) + damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT, CLONE = DEFAULT_CLONE_EXAMINE_TEXT) + head_flags = HEAD_EYESPRITES + var/obj/item/assembly/flash/handheld/flash1 = null var/obj/item/assembly/flash/handheld/flash2 = null @@ -310,9 +340,11 @@ . = ..() if(!.) return - to_chat(owner, span_danger("Your [src.name]'s optical transponders glitch out and malfunction!")) + to_chat(owner, span_danger("Your [src]'s optical transponders glitch out and malfunction!")) - var/glitch_duration = severity == EMP_HEAVY ? 15 SECONDS : 7.5 SECONDS + var/glitch_duration = AUGGED_HEAD_EMP_GLITCH_DURATION + if (severity == EMP_HEAVY) + glitch_duration *= 2 owner.add_client_colour(/datum/client_colour/malfunction) @@ -320,12 +352,12 @@ #undef EMP_GLITCH -/obj/item/bodypart/head/robot/handle_atom_del(atom/head_atom) - if(head_atom == flash1) +/obj/item/bodypart/head/robot/Exited(atom/movable/gone, direction) + . = ..() + if(gone == flash1) flash1 = null - if(head_atom == flash2) + if(gone == flash2) flash2 = null - return ..() /obj/item/bodypart/head/robot/Destroy() QDEL_NULL(flash1) @@ -371,65 +403,67 @@ if(flash1 || flash2) prytool.play_tool_sound(src) to_chat(user, span_notice("You remove the flash from [src].")) - if(flash1) - flash1.forceMove(drop_location()) - flash1 = null - if(flash2) - flash2.forceMove(drop_location()) - flash2 = null + flash1?.forceMove(drop_location()) + flash2?.forceMove(drop_location()) else to_chat(user, span_warning("There is no flash to remove from [src].")) return TRUE - /obj/item/bodypart/head/robot/drop_organs(mob/user, violent_removal) var/atom/drop_loc = drop_location() - if(flash1) - flash1.forceMove(drop_loc) - flash1 = null - if(flash2) - flash2.forceMove(drop_loc) - flash2 = null - ..() - - + flash1?.forceMove(drop_loc) + flash2?.forceMove(drop_loc) + return ..() +// Prosthetics - Cheap, mediocre, and worse than organic limbs +// The fact they dont have a internal biotype means theyre a lot weaker defensively, +// since they skip slash and go right to blunt +// They are VERY easy to delimb as a result +// HP is also reduced just in case this isnt enough /obj/item/bodypart/arm/left/robot/surplus name = "surplus prosthetic left arm" desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing." icon_static = 'icons/mob/augmentation/surplus_augments.dmi' icon = 'icons/mob/augmentation/surplus_augments.dmi' - brute_reduction = 0 - burn_reduction = 0 - max_damage = 20 + burn_modifier = 1 + brute_modifier = 1 + max_damage = PROSTHESIS_MAX_HP + + biological_state = (BIO_METAL|BIO_JOINTED) /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_static = 'icons/mob/augmentation/surplus_augments.dmi' icon = 'icons/mob/augmentation/surplus_augments.dmi' - brute_reduction = 0 - burn_reduction = 0 - max_damage = 20 + burn_modifier = 1 + brute_modifier = 1 + max_damage = PROSTHESIS_MAX_HP + + biological_state = (BIO_METAL|BIO_JOINTED) /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_static = 'icons/mob/augmentation/surplus_augments.dmi' icon = 'icons/mob/augmentation/surplus_augments.dmi' - brute_reduction = 0 - burn_reduction = 0 - max_damage = 20 + brute_modifier = 1 + burn_modifier = 1 + max_damage = PROSTHESIS_MAX_HP + + biological_state = (BIO_METAL|BIO_JOINTED) /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_static = 'icons/mob/augmentation/surplus_augments.dmi' icon = 'icons/mob/augmentation/surplus_augments.dmi' - brute_reduction = 0 - burn_reduction = 0 - max_damage = 20 + brute_modifier = 1 + burn_modifier = 1 + max_damage = PROSTHESIS_MAX_HP + + biological_state = (BIO_METAL|BIO_JOINTED) #undef ROBOTIC_LIGHT_BRUTE_MSG #undef ROBOTIC_MEDIUM_BRUTE_MSG diff --git a/code/modules/surgery/bodyparts/species_parts/android_parts.dm b/code/modules/surgery/bodyparts/species_parts/android_parts.dm index e9b821f5934db..ef2937bf7b8b6 100644 --- a/code/modules/surgery/bodyparts/species_parts/android_parts.dm +++ b/code/modules/surgery/bodyparts/species_parts/android_parts.dm @@ -5,19 +5,19 @@ */ /obj/item/bodypart/head/robot/android - change_exempt_flags = null + change_exempt_flags = NONE /obj/item/bodypart/chest/robot/android - change_exempt_flags = null + change_exempt_flags = NONE /obj/item/bodypart/arm/left/robot/android - change_exempt_flags = null + change_exempt_flags = NONE /obj/item/bodypart/arm/right/robot/android - change_exempt_flags = null + change_exempt_flags = NONE /obj/item/bodypart/leg/left/robot/android - change_exempt_flags = null + change_exempt_flags = NONE /obj/item/bodypart/leg/right/robot/android - change_exempt_flags = null + change_exempt_flags = NONE diff --git a/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm index 767ee35cb7d72..2215b388320e8 100644 --- a/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm @@ -1,11 +1,13 @@ /obj/item/bodypart/head/ethereal - icon_greyscale = 'icons/mob/species/ethereal/bodyparts.dmi' + icon_greyscale = 'icons/mob/human/species/ethereal/bodyparts.dmi' limb_id = SPECIES_ETHEREAL is_dimorphic = FALSE dmg_overlay_type = null attack_type = BURN // bish buzz unarmed_attack_sound = 'sound/weapons/etherealhit.ogg' unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg' + brute_modifier = 1.25 //ethereal are weak to brute damage + head_flags = HEAD_HAIR|HEAD_FACIAL_HAIR|HEAD_EYESPRITES|HEAD_EYEHOLES|HEAD_DEBRAIN /obj/item/bodypart/head/ethereal/update_limb(dropping_limb, is_creating) . = ..() @@ -15,10 +17,11 @@ species_color = eth_holder.current_color /obj/item/bodypart/chest/ethereal - icon_greyscale = 'icons/mob/species/ethereal/bodyparts.dmi' + icon_greyscale = 'icons/mob/human/species/ethereal/bodyparts.dmi' limb_id = SPECIES_ETHEREAL is_dimorphic = FALSE dmg_overlay_type = null + brute_modifier = 1.25 //ethereal are weak to brute damages /obj/item/bodypart/chest/ethereal/update_limb(dropping_limb, is_creating) . = ..() @@ -28,13 +31,14 @@ species_color = eth_holder.current_color /obj/item/bodypart/arm/left/ethereal - icon_greyscale = 'icons/mob/species/ethereal/bodyparts.dmi' + icon_greyscale = 'icons/mob/human/species/ethereal/bodyparts.dmi' limb_id = SPECIES_ETHEREAL dmg_overlay_type = null attack_type = BURN //burn bish unarmed_attack_verb = "burn" unarmed_attack_sound = 'sound/weapons/etherealhit.ogg' unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg' + brute_modifier = 1.25 //ethereal are weak to brute damage /obj/item/bodypart/arm/left/ethereal/update_limb(dropping_limb, is_creating) . = ..() @@ -44,13 +48,14 @@ species_color = eth_holder.current_color /obj/item/bodypart/arm/right/ethereal - icon_greyscale = 'icons/mob/species/ethereal/bodyparts.dmi' + icon_greyscale = 'icons/mob/human/species/ethereal/bodyparts.dmi' limb_id = SPECIES_ETHEREAL dmg_overlay_type = null attack_type = BURN // bish buzz unarmed_attack_verb = "burn" unarmed_attack_sound = 'sound/weapons/etherealhit.ogg' unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg' + brute_modifier = 1.25 //ethereal are weak to brute damage /obj/item/bodypart/arm/right/ethereal/update_limb(dropping_limb, is_creating) . = ..() @@ -59,14 +64,14 @@ var/datum/species/ethereal/eth_holder = potato_oc.dna.species species_color = eth_holder.current_color - /obj/item/bodypart/leg/left/ethereal - icon_greyscale = 'icons/mob/species/ethereal/bodyparts.dmi' + icon_greyscale = 'icons/mob/human/species/ethereal/bodyparts.dmi' limb_id = SPECIES_ETHEREAL dmg_overlay_type = null attack_type = BURN // bish buzz unarmed_attack_sound = 'sound/weapons/etherealhit.ogg' unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg' + brute_modifier = 1.25 //ethereal are weak to brute damage /obj/item/bodypart/leg/left/ethereal/update_limb(dropping_limb, is_creating) . = ..() @@ -76,12 +81,13 @@ species_color = eth_holder.current_color /obj/item/bodypart/leg/right/ethereal - icon_greyscale = 'icons/mob/species/ethereal/bodyparts.dmi' + icon_greyscale = 'icons/mob/human/species/ethereal/bodyparts.dmi' limb_id = SPECIES_ETHEREAL dmg_overlay_type = null attack_type = BURN // bish buzz unarmed_attack_sound = 'sound/weapons/etherealhit.ogg' unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg' + brute_modifier = 1.25 //ethereal are weak to brute damage /obj/item/bodypart/leg/right/ethereal/update_limb(dropping_limb, is_creating) . = ..() @@ -89,3 +95,8 @@ var/mob/living/carbon/human/potato_oc = owner var/datum/species/ethereal/eth_holder = potato_oc.dna.species species_color = eth_holder.current_color + +/obj/item/bodypart/head/ethereal/lustrous + icon_state = "lustrous_head" + limb_id = SPECIES_ETHEREAL_LUSTROUS + head_flags = NONE diff --git a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm index 1c24a849e39bb..c5f7ff87346d3 100644 --- a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm @@ -1,15 +1,16 @@ /obj/item/bodypart/head/lizard - icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi' + icon_greyscale = 'icons/mob/human/species/lizard/bodyparts.dmi' limb_id = SPECIES_LIZARD is_dimorphic = FALSE + head_flags = HEAD_LIPS|HEAD_EYESPRITES|HEAD_EYECOLOR|HEAD_EYEHOLES|HEAD_DEBRAIN /obj/item/bodypart/chest/lizard - icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi' + icon_greyscale = 'icons/mob/human/species/lizard/bodyparts.dmi' limb_id = SPECIES_LIZARD is_dimorphic = TRUE /obj/item/bodypart/arm/left/lizard - icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi' + icon_greyscale = 'icons/mob/human/species/lizard/bodyparts.dmi' limb_id = SPECIES_LIZARD unarmed_attack_verb = "slash" unarmed_attack_effect = ATTACK_EFFECT_CLAW @@ -17,7 +18,7 @@ unarmed_miss_sound = 'sound/weapons/slashmiss.ogg' /obj/item/bodypart/arm/right/lizard - icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi' + icon_greyscale = 'icons/mob/human/species/lizard/bodyparts.dmi' limb_id = SPECIES_LIZARD unarmed_attack_verb = "slash" unarmed_attack_effect = ATTACK_EFFECT_CLAW @@ -31,15 +32,15 @@ bodypart_traits = list(TRAIT_CHUNKYFINGERS) /obj/item/bodypart/leg/left/lizard - icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi' + icon_greyscale = 'icons/mob/human/species/lizard/bodyparts.dmi' limb_id = SPECIES_LIZARD /obj/item/bodypart/leg/right/lizard - icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi' + icon_greyscale = 'icons/mob/human/species/lizard/bodyparts.dmi' limb_id = SPECIES_LIZARD /obj/item/bodypart/leg/left/digitigrade - icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi' + icon_greyscale = 'icons/mob/human/species/lizard/bodyparts.dmi' limb_id = BODYPART_ID_DIGITIGRADE bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_DIGITIGRADE @@ -65,7 +66,7 @@ limb_id = SPECIES_LIZARD /obj/item/bodypart/leg/right/digitigrade - icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi' + icon_greyscale = 'icons/mob/human/species/lizard/bodyparts.dmi' limb_id = BODYPART_ID_DIGITIGRADE bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_DIGITIGRADE diff --git a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm index a27232d8069fc..408afea6679d8 100644 --- a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm @@ -2,150 +2,164 @@ /obj/item/bodypart/head/snail limb_id = SPECIES_SNAIL is_dimorphic = FALSE + burn_modifier = 2 + head_flags = HEAD_EYESPRITES|HEAD_DEBRAIN /obj/item/bodypart/chest/snail limb_id = SPECIES_SNAIL is_dimorphic = FALSE + burn_modifier = 2 /obj/item/bodypart/arm/left/snail limb_id = SPECIES_SNAIL unarmed_attack_verb = "slap" unarmed_attack_effect = ATTACK_EFFECT_DISARM unarmed_damage_high = 0.5 //snails are soft and squishy + burn_modifier = 2 /obj/item/bodypart/arm/right/snail limb_id = SPECIES_SNAIL unarmed_attack_verb = "slap" unarmed_attack_effect = ATTACK_EFFECT_DISARM unarmed_damage_high = 0.5 + burn_modifier = 2 /obj/item/bodypart/leg/left/snail limb_id = SPECIES_SNAIL unarmed_damage_high = 0.5 + burn_modifier = 2 + speed_modifier = 3 //disgustingly slow + /obj/item/bodypart/leg/right/snail limb_id = SPECIES_SNAIL unarmed_damage_high = 0.5 + burn_modifier = 2 + speed_modifier = 3 //disgustingly slow ///ABDUCTOR /obj/item/bodypart/head/abductor - biological_state = BIO_INORGANIC //i have no fucking clue why these mfs get no wounds but SURE limb_id = SPECIES_ABDUCTOR is_dimorphic = FALSE should_draw_greyscale = FALSE + head_flags = NONE /obj/item/bodypart/chest/abductor - biological_state = BIO_INORGANIC limb_id = SPECIES_ABDUCTOR is_dimorphic = FALSE should_draw_greyscale = FALSE /obj/item/bodypart/arm/left/abductor - biological_state = BIO_INORGANIC limb_id = SPECIES_ABDUCTOR should_draw_greyscale = FALSE bodypart_traits = list(TRAIT_CHUNKYFINGERS) /obj/item/bodypart/arm/right/abductor - biological_state = BIO_INORGANIC limb_id = SPECIES_ABDUCTOR should_draw_greyscale = FALSE bodypart_traits = list(TRAIT_CHUNKYFINGERS) /obj/item/bodypart/leg/left/abductor - biological_state = BIO_INORGANIC limb_id = SPECIES_ABDUCTOR should_draw_greyscale = FALSE /obj/item/bodypart/leg/right/abductor - biological_state = BIO_INORGANIC limb_id = SPECIES_ABDUCTOR should_draw_greyscale = FALSE ///JELLY /obj/item/bodypart/head/jelly - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED) limb_id = SPECIES_JELLYPERSON is_dimorphic = TRUE dmg_overlay_type = null + burn_modifier = 0.5 // = 1/2x generic burn damage + head_flags = HEAD_ALL_FEATURES /obj/item/bodypart/chest/jelly - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED) limb_id = SPECIES_JELLYPERSON is_dimorphic = TRUE dmg_overlay_type = null + burn_modifier = 0.5 // = 1/2x generic burn damage /obj/item/bodypart/arm/left/jelly - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED) limb_id = SPECIES_JELLYPERSON dmg_overlay_type = null + burn_modifier = 0.5 // = 1/2x generic burn damage /obj/item/bodypart/arm/right/jelly - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED) limb_id = SPECIES_JELLYPERSON dmg_overlay_type = null + burn_modifier = 0.5 // = 1/2x generic burn damage /obj/item/bodypart/leg/left/jelly - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED) limb_id = SPECIES_JELLYPERSON dmg_overlay_type = null + burn_modifier = 0.5 // = 1/2x generic burn damage /obj/item/bodypart/leg/right/jelly - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED) limb_id = SPECIES_JELLYPERSON dmg_overlay_type = null + burn_modifier = 0.5 // = 1/2x generic burn damage ///SLIME /obj/item/bodypart/head/slime - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED) limb_id = SPECIES_SLIMEPERSON is_dimorphic = FALSE + head_flags = HEAD_ALL_FEATURES /obj/item/bodypart/chest/slime - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED) limb_id = SPECIES_SLIMEPERSON is_dimorphic = TRUE /obj/item/bodypart/arm/left/slime - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED) limb_id = SPECIES_SLIMEPERSON /obj/item/bodypart/arm/right/slime - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED) limb_id = SPECIES_SLIMEPERSON /obj/item/bodypart/leg/left/slime - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED) limb_id = SPECIES_SLIMEPERSON /obj/item/bodypart/leg/right/slime - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED) limb_id = SPECIES_SLIMEPERSON ///LUMINESCENT /obj/item/bodypart/head/luminescent - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED) limb_id = SPECIES_LUMINESCENT is_dimorphic = TRUE + head_flags = HEAD_ALL_FEATURES /obj/item/bodypart/chest/luminescent - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED) limb_id = SPECIES_LUMINESCENT is_dimorphic = TRUE /obj/item/bodypart/arm/left/luminescent - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED) limb_id = SPECIES_LUMINESCENT /obj/item/bodypart/arm/right/luminescent - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED) limb_id = SPECIES_LUMINESCENT /obj/item/bodypart/leg/left/luminescent - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED) limb_id = SPECIES_LUMINESCENT /obj/item/bodypart/leg/right/luminescent - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED) limb_id = SPECIES_LUMINESCENT ///ZOMBIE @@ -153,6 +167,7 @@ limb_id = SPECIES_ZOMBIE is_dimorphic = FALSE should_draw_greyscale = FALSE + head_flags = HEAD_EYESPRITES|HEAD_DEBRAIN /obj/item/bodypart/chest/zombie limb_id = SPECIES_ZOMBIE @@ -175,14 +190,27 @@ limb_id = SPECIES_ZOMBIE should_draw_greyscale = FALSE +/obj/item/bodypart/leg/left/zombie/infectious + limb_id = SPECIES_ZOMBIE + should_draw_greyscale = FALSE + speed_modifier = 0.8 //braaaaains + +/obj/item/bodypart/leg/right/zombie/infectious + limb_id = SPECIES_ZOMBIE + should_draw_greyscale = FALSE + speed_modifier = 0.8 //braaaaains + ///PODPEOPLE /obj/item/bodypart/head/pod limb_id = SPECIES_PODPERSON is_dimorphic = TRUE + burn_modifier = 1.25 + head_flags = HEAD_EYESPRITES|HEAD_EYECOLOR|HEAD_EYEHOLES|HEAD_DEBRAIN /obj/item/bodypart/chest/pod limb_id = SPECIES_PODPERSON is_dimorphic = TRUE + burn_modifier = 1.25 /obj/item/bodypart/arm/left/pod limb_id = SPECIES_PODPERSON @@ -190,6 +218,7 @@ unarmed_attack_effect = ATTACK_EFFECT_CLAW unarmed_attack_sound = 'sound/weapons/slice.ogg' unarmed_miss_sound = 'sound/weapons/slashmiss.ogg' + burn_modifier = 1.25 /obj/item/bodypart/arm/right/pod limb_id = SPECIES_PODPERSON @@ -197,18 +226,22 @@ unarmed_attack_effect = ATTACK_EFFECT_CLAW unarmed_attack_sound = 'sound/weapons/slice.ogg' unarmed_miss_sound = 'sound/weapons/slashmiss.ogg' + burn_modifier = 1.25 /obj/item/bodypart/leg/left/pod limb_id = SPECIES_PODPERSON + burn_modifier = 1.25 /obj/item/bodypart/leg/right/pod limb_id = SPECIES_PODPERSON + burn_modifier = 1.25 ///FLY /obj/item/bodypart/head/fly limb_id = SPECIES_FLYPERSON is_dimorphic = FALSE should_draw_greyscale = FALSE + head_flags = HEAD_EYESPRITES|HEAD_EYEHOLES|HEAD_DEBRAIN /obj/item/bodypart/chest/fly limb_id = SPECIES_FLYPERSON @@ -233,36 +266,37 @@ ///SHADOW /obj/item/bodypart/head/shadow - biological_state = BIO_INORGANIC limb_id = SPECIES_SHADOW is_dimorphic = FALSE should_draw_greyscale = FALSE + burn_modifier = 1.5 + head_flags = NONE /obj/item/bodypart/chest/shadow - biological_state = BIO_INORGANIC limb_id = SPECIES_SHADOW is_dimorphic = FALSE should_draw_greyscale = FALSE + burn_modifier = 1.5 /obj/item/bodypart/arm/left/shadow - biological_state = BIO_INORGANIC limb_id = SPECIES_SHADOW should_draw_greyscale = FALSE + burn_modifier = 1.5 /obj/item/bodypart/arm/right/shadow - biological_state = BIO_INORGANIC limb_id = SPECIES_SHADOW should_draw_greyscale = FALSE + burn_modifier = 1.5 /obj/item/bodypart/leg/left/shadow - biological_state = BIO_INORGANIC limb_id = SPECIES_SHADOW should_draw_greyscale = FALSE + burn_modifier = 1.5 /obj/item/bodypart/leg/right/shadow - biological_state = BIO_INORGANIC limb_id = SPECIES_SHADOW should_draw_greyscale = FALSE + burn_modifier = 1.5 /obj/item/bodypart/arm/left/shadow/nightmare bodypart_traits = list(TRAIT_CHUNKYFINGERS) @@ -277,6 +311,7 @@ is_dimorphic = FALSE should_draw_greyscale = FALSE dmg_overlay_type = null + head_flags = NONE /obj/item/bodypart/chest/skeleton biological_state = BIO_BONE @@ -286,25 +321,25 @@ dmg_overlay_type = null /obj/item/bodypart/arm/left/skeleton - biological_state = BIO_BONE + biological_state = (BIO_BONE|BIO_JOINTED) limb_id = SPECIES_SKELETON should_draw_greyscale = FALSE dmg_overlay_type = null /obj/item/bodypart/arm/right/skeleton - biological_state = BIO_BONE + biological_state = (BIO_BONE|BIO_JOINTED) limb_id = SPECIES_SKELETON should_draw_greyscale = FALSE dmg_overlay_type = null /obj/item/bodypart/leg/left/skeleton - biological_state = BIO_BONE + biological_state = (BIO_BONE|BIO_JOINTED) limb_id = SPECIES_SKELETON should_draw_greyscale = FALSE dmg_overlay_type = null /obj/item/bodypart/leg/right/skeleton - biological_state = BIO_BONE + biological_state = (BIO_BONE|BIO_JOINTED) limb_id = SPECIES_SKELETON should_draw_greyscale = FALSE dmg_overlay_type = null @@ -313,46 +348,57 @@ /obj/item/bodypart/head/mushroom limb_id = SPECIES_MUSHROOM is_dimorphic = TRUE + burn_modifier = 1.25 + head_flags = NONE /obj/item/bodypart/chest/mushroom limb_id = SPECIES_MUSHROOM is_dimorphic = TRUE bodypart_traits = list(TRAIT_NO_JUMPSUIT) + burn_modifier = 1.25 /obj/item/bodypart/arm/left/mushroom limb_id = SPECIES_MUSHROOM unarmed_damage_low = 6 unarmed_damage_high = 14 unarmed_stun_threshold = 14 + burn_modifier = 1.25 /obj/item/bodypart/arm/right/mushroom limb_id = SPECIES_MUSHROOM unarmed_damage_low = 6 unarmed_damage_high = 14 unarmed_stun_threshold = 14 + burn_modifier = 1.25 /obj/item/bodypart/leg/left/mushroom limb_id = SPECIES_MUSHROOM unarmed_damage_low = 9 unarmed_damage_high = 21 unarmed_stun_threshold = 14 + burn_modifier = 1.25 + speed_modifier = 0.75 //big big fungus /obj/item/bodypart/leg/right/mushroom limb_id = SPECIES_MUSHROOM unarmed_damage_low = 9 unarmed_damage_high = 21 unarmed_stun_threshold = 14 + burn_modifier = 1.25 + speed_modifier = 0.75 //big fungus big fungus +//GOLEM /obj/item/bodypart/head/golem - icon = 'icons/mob/species/golems.dmi' - icon_static = 'icons/mob/species/golems.dmi' + icon = 'icons/mob/human/species/golems.dmi' + icon_static = 'icons/mob/human/species/golems.dmi' icon_state = "golem_head" - biological_state = BIO_INORGANIC + biological_state = BIO_BONE bodytype = BODYTYPE_GOLEM | BODYTYPE_ORGANIC limb_id = SPECIES_GOLEM is_dimorphic = FALSE should_draw_greyscale = FALSE dmg_overlay_type = null + head_flags = NONE /obj/item/bodypart/head/golem/Initialize(mapload) worn_ears_offset = new( @@ -380,10 +426,10 @@ return ..() /obj/item/bodypart/chest/golem - icon = 'icons/mob/species/golems.dmi' - icon_static = 'icons/mob/species/golems.dmi' + icon = 'icons/mob/human/species/golems.dmi' + icon_static = 'icons/mob/human/species/golems.dmi' icon_state = "golem_chest" - biological_state = BIO_INORGANIC + biological_state = BIO_BONE acceptable_bodytype = BODYTYPE_GOLEM bodytype = BODYTYPE_GOLEM | BODYTYPE_ORGANIC limb_id = SPECIES_GOLEM @@ -401,10 +447,10 @@ return ..() /obj/item/bodypart/arm/left/golem - icon = 'icons/mob/species/golems.dmi' - icon_static = 'icons/mob/species/golems.dmi' + icon = 'icons/mob/human/species/golems.dmi' + icon_static = 'icons/mob/human/species/golems.dmi' icon_state = "golem_l_arm" - biological_state = BIO_INORGANIC + biological_state = (BIO_BONE|BIO_JOINTED) bodytype = BODYTYPE_GOLEM | BODYTYPE_ORGANIC limb_id = SPECIES_GOLEM should_draw_greyscale = FALSE @@ -423,11 +469,22 @@ ) return ..() +/obj/item/bodypart/arm/left/golem/set_owner(new_owner) + . = ..() + if (. == FALSE) + return + if (owner) + owner.AddComponentFrom(REF(src), /datum/component/shovel_hands) + if (isnull(.)) + return + var/mob/living/carbon/old_owner = . + old_owner.RemoveComponentSource(REF(src), /datum/component/shovel_hands) + /obj/item/bodypart/arm/right/golem - icon = 'icons/mob/species/golems.dmi' - icon_static = 'icons/mob/species/golems.dmi' + icon = 'icons/mob/human/species/golems.dmi' + icon_static = 'icons/mob/human/species/golems.dmi' icon_state = "golem_r_arm" - biological_state = BIO_INORGANIC + biological_state = (BIO_BONE|BIO_JOINTED) bodytype = BODYTYPE_GOLEM | BODYTYPE_ORGANIC limb_id = SPECIES_GOLEM should_draw_greyscale = FALSE @@ -446,11 +503,22 @@ ) return ..() +/obj/item/bodypart/arm/right/golem/set_owner(new_owner) + . = ..() + if (. == FALSE) + return + if (owner) + owner.AddComponentFrom(REF(src), /datum/component/shovel_hands) + if (isnull(.)) + return + var/mob/living/carbon/old_owner = . + old_owner.RemoveComponentSource(REF(src), /datum/component/shovel_hands) + /obj/item/bodypart/leg/left/golem - icon = 'icons/mob/species/golems.dmi' - icon_static = 'icons/mob/species/golems.dmi' + icon = 'icons/mob/human/species/golems.dmi' + icon_static = 'icons/mob/human/species/golems.dmi' icon_state = "golem_l_leg" - biological_state = BIO_INORGANIC + biological_state = (BIO_BONE|BIO_JOINTED) bodytype = BODYTYPE_GOLEM | BODYTYPE_ORGANIC limb_id = SPECIES_GOLEM should_draw_greyscale = FALSE @@ -460,10 +528,10 @@ unarmed_stun_threshold = 11 /obj/item/bodypart/leg/right/golem - icon = 'icons/mob/species/golems.dmi' - icon_static = 'icons/mob/species/golems.dmi' + icon = 'icons/mob/human/species/golems.dmi' + icon_static = 'icons/mob/human/species/golems.dmi' icon_state = "golem_r_leg" - biological_state = BIO_INORGANIC + biological_state = (BIO_BONE|BIO_JOINTED) bodytype = BODYTYPE_GOLEM | BODYTYPE_ORGANIC limb_id = SPECIES_GOLEM should_draw_greyscale = FALSE diff --git a/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm index c23b935176bae..ed6c91ed0fc10 100644 --- a/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm @@ -1,23 +1,24 @@ /obj/item/bodypart/head/moth - icon = 'icons/mob/species/moth/bodyparts.dmi' + icon = 'icons/mob/human/species/moth/bodyparts.dmi' icon_state = "moth_head" - icon_static = 'icons/mob/species/moth/bodyparts.dmi' + icon_static = 'icons/mob/human/species/moth/bodyparts.dmi' limb_id = SPECIES_MOTH is_dimorphic = FALSE should_draw_greyscale = FALSE + head_flags = HEAD_LIPS|HEAD_EYESPRITES|HEAD_EYEHOLES|HEAD_DEBRAIN //what the fuck, moths have lips? /obj/item/bodypart/chest/moth - icon = 'icons/mob/species/moth/bodyparts.dmi' + icon = 'icons/mob/human/species/moth/bodyparts.dmi' icon_state = "moth_chest_m" - icon_static = 'icons/mob/species/moth/bodyparts.dmi' + icon_static = 'icons/mob/human/species/moth/bodyparts.dmi' limb_id = SPECIES_MOTH is_dimorphic = TRUE should_draw_greyscale = FALSE /obj/item/bodypart/arm/left/moth - icon = 'icons/mob/species/moth/bodyparts.dmi' + icon = 'icons/mob/human/species/moth/bodyparts.dmi' icon_state = "moth_l_arm" - icon_static = 'icons/mob/species/moth/bodyparts.dmi' + icon_static = 'icons/mob/human/species/moth/bodyparts.dmi' limb_id = SPECIES_MOTH should_draw_greyscale = FALSE unarmed_attack_verb = "slash" @@ -26,9 +27,9 @@ unarmed_miss_sound = 'sound/weapons/slashmiss.ogg' /obj/item/bodypart/arm/right/moth - icon = 'icons/mob/species/moth/bodyparts.dmi' + icon = 'icons/mob/human/species/moth/bodyparts.dmi' icon_state = "moth_r_arm" - icon_static = 'icons/mob/species/moth/bodyparts.dmi' + icon_static = 'icons/mob/human/species/moth/bodyparts.dmi' limb_id = SPECIES_MOTH should_draw_greyscale = FALSE unarmed_attack_verb = "slash" @@ -37,15 +38,15 @@ unarmed_miss_sound = 'sound/weapons/slashmiss.ogg' /obj/item/bodypart/leg/left/moth - icon = 'icons/mob/species/moth/bodyparts.dmi' + icon = 'icons/mob/human/species/moth/bodyparts.dmi' icon_state = "moth_l_leg" - icon_static = 'icons/mob/species/moth/bodyparts.dmi' + icon_static = 'icons/mob/human/species/moth/bodyparts.dmi' limb_id = SPECIES_MOTH should_draw_greyscale = FALSE /obj/item/bodypart/leg/right/moth - icon = 'icons/mob/species/moth/bodyparts.dmi' + icon = 'icons/mob/human/species/moth/bodyparts.dmi' icon_state = "moth_r_leg" - icon_static = 'icons/mob/species/moth/bodyparts.dmi' + icon_static = 'icons/mob/human/species/moth/bodyparts.dmi' limb_id = SPECIES_MOTH should_draw_greyscale = FALSE diff --git a/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm index 8adc098844d6a..f478d522d5690 100644 --- a/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm @@ -1,55 +1,68 @@ /obj/item/bodypart/head/plasmaman - icon = 'icons/mob/species/plasmaman/bodyparts.dmi' + icon = 'icons/mob/human/species/plasmaman/bodyparts.dmi' icon_state = "plasmaman_head" - icon_static = 'icons/mob/species/plasmaman/bodyparts.dmi' + icon_static = 'icons/mob/human/species/plasmaman/bodyparts.dmi' biological_state = BIO_BONE limb_id = SPECIES_PLASMAMAN is_dimorphic = FALSE should_draw_greyscale = FALSE dmg_overlay_type = null + brute_modifier = 1.5 //Plasmemes are weak + burn_modifier = 1.5 //Plasmemes are weak + head_flags = HEAD_EYESPRITES /obj/item/bodypart/chest/plasmaman - icon = 'icons/mob/species/plasmaman/bodyparts.dmi' + icon = 'icons/mob/human/species/plasmaman/bodyparts.dmi' icon_state = "plasmaman_chest" - icon_static = 'icons/mob/species/plasmaman/bodyparts.dmi' + icon_static = 'icons/mob/human/species/plasmaman/bodyparts.dmi' biological_state = BIO_BONE limb_id = SPECIES_PLASMAMAN is_dimorphic = FALSE should_draw_greyscale = FALSE dmg_overlay_type = null + brute_modifier = 1.5 //Plasmemes are weak + burn_modifier = 1.5 //Plasmemes are weak /obj/item/bodypart/arm/left/plasmaman - icon = 'icons/mob/species/plasmaman/bodyparts.dmi' + icon = 'icons/mob/human/species/plasmaman/bodyparts.dmi' icon_state = "plasmaman_l_arm" - icon_static = 'icons/mob/species/plasmaman/bodyparts.dmi' - biological_state = BIO_BONE + icon_static = 'icons/mob/human/species/plasmaman/bodyparts.dmi' + biological_state = (BIO_BONE|BIO_JOINTED) limb_id = SPECIES_PLASMAMAN should_draw_greyscale = FALSE dmg_overlay_type = null + brute_modifier = 1.5 //Plasmemes are weak + burn_modifier = 1.5 //Plasmemes are weak /obj/item/bodypart/arm/right/plasmaman - icon = 'icons/mob/species/plasmaman/bodyparts.dmi' + icon = 'icons/mob/human/species/plasmaman/bodyparts.dmi' icon_state = "plasmaman_r_arm" - icon_static = 'icons/mob/species/plasmaman/bodyparts.dmi' - biological_state = BIO_BONE + icon_static = 'icons/mob/human/species/plasmaman/bodyparts.dmi' + biological_state = (BIO_BONE|BIO_JOINTED) limb_id = SPECIES_PLASMAMAN should_draw_greyscale = FALSE dmg_overlay_type = null + brute_modifier = 1.5 //Plasmemes are weak + burn_modifier = 1.5 //Plasmemes are weak /obj/item/bodypart/leg/left/plasmaman - icon = 'icons/mob/species/plasmaman/bodyparts.dmi' + icon = 'icons/mob/human/species/plasmaman/bodyparts.dmi' icon_state = "plasmaman_l_leg" - icon_static = 'icons/mob/species/plasmaman/bodyparts.dmi' - biological_state = BIO_BONE + icon_static = 'icons/mob/human/species/plasmaman/bodyparts.dmi' + biological_state = (BIO_BONE|BIO_JOINTED) limb_id = SPECIES_PLASMAMAN should_draw_greyscale = FALSE dmg_overlay_type = null + brute_modifier = 1.5 //Plasmemes are weak + burn_modifier = 1.5 //Plasmemes are weak /obj/item/bodypart/leg/right/plasmaman - icon = 'icons/mob/species/plasmaman/bodyparts.dmi' + icon = 'icons/mob/human/species/plasmaman/bodyparts.dmi' icon_state = "plasmaman_r_leg" - icon_static = 'icons/mob/species/plasmaman/bodyparts.dmi' - biological_state = BIO_BONE + icon_static = 'icons/mob/human/species/plasmaman/bodyparts.dmi' + biological_state = (BIO_BONE|BIO_JOINTED) limb_id = SPECIES_PLASMAMAN should_draw_greyscale = FALSE dmg_overlay_type = null + brute_modifier = 1.5 //Plasmemes are weak + burn_modifier = 1.5 //Plasmemes are weak diff --git a/code/modules/surgery/bodyparts/wounds.dm b/code/modules/surgery/bodyparts/wounds.dm index 1961993ec6466..94c503614a2a2 100644 --- a/code/modules/surgery/bodyparts/wounds.dm +++ b/code/modules/surgery/bodyparts/wounds.dm @@ -1,47 +1,40 @@ /// Allows us to roll for and apply a wound without actually dealing damage. Used for aggregate wounding power with pellet clouds -/obj/item/bodypart/proc/painless_wound_roll(wounding_type, phantom_wounding_dmg, wound_bonus, bare_wound_bonus, sharpness=NONE) +/obj/item/bodypart/proc/painless_wound_roll(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus, sharpness=NONE) SHOULD_CALL_PARENT(TRUE) - if(!owner || phantom_wounding_dmg <= WOUND_MINIMUM_DAMAGE || wound_bonus == CANT_WOUND || (owner.status_flags & GODMODE)) + if(!owner || wounding_dmg <= WOUND_MINIMUM_DAMAGE || wound_bonus == CANT_WOUND || (owner.status_flags & GODMODE)) return var/mangled_state = get_mangled_state() var/easy_dismember = HAS_TRAIT(owner, TRAIT_EASYDISMEMBER) // if we have easydismember, we don't reduce damage when redirecting damage to different types (slashing weapons on mangled/skinless limbs attack at 100% instead of 50%) - if(wounding_type == WOUND_BLUNT && sharpness) - if(sharpness & SHARP_EDGED) - wounding_type = WOUND_SLASH - else if (sharpness & SHARP_POINTY) - wounding_type = WOUND_PIERCE + var/bio_status = get_bio_state_status() - //Handling for bone only/flesh only(none right now)/flesh and bone targets - switch(biological_state) - // if we're bone only, all cutting attacks go straight to the bone - if(BIO_BONE) - if(wounding_type == WOUND_SLASH) - wounding_type = WOUND_BLUNT - phantom_wounding_dmg *= (easy_dismember ? 1 : 0.6) - else if(wounding_type == WOUND_PIERCE) - wounding_type = WOUND_BLUNT - phantom_wounding_dmg *= (easy_dismember ? 1 : 0.75) - if((mangled_state & BODYPART_MANGLED_BONE) && try_dismember(wounding_type, phantom_wounding_dmg, wound_bonus, bare_wound_bonus)) - return - // note that there's no handling for BIO_FLESH since we don't have any that are that right now (slimepeople maybe someday) - // standard humanoids - if(BIO_FLESH_BONE) - // if we've already mangled the skin (critical slash or piercing wound), then the bone is exposed, and we can damage it with sharp weapons at a reduced rate - // So a big sharp weapon is still all you need to destroy a limb - if((mangled_state & BODYPART_MANGLED_FLESH) && !(mangled_state & BODYPART_MANGLED_BONE) && sharpness) - playsound(src, "sound/effects/wounds/crackandbleed.ogg", 100) - if(wounding_type == WOUND_SLASH && !easy_dismember) - phantom_wounding_dmg *= 0.6 // edged weapons pass along 60% of their wounding damage to the bone since the power is spread out over a larger area - if(wounding_type == WOUND_PIERCE && !easy_dismember) - phantom_wounding_dmg *= 0.75 // piercing weapons pass along 75% of their wounding damage to the bone since it's more concentrated - wounding_type = WOUND_BLUNT - else if((mangled_state & BODYPART_MANGLED_FLESH) && (mangled_state & BODYPART_MANGLED_BONE) && try_dismember(wounding_type, phantom_wounding_dmg, wound_bonus, bare_wound_bonus)) - return - - check_wounding(wounding_type, phantom_wounding_dmg, wound_bonus, bare_wound_bonus) + var/has_exterior = ((bio_status & ANATOMY_EXTERIOR)) + var/has_interior = ((bio_status & ANATOMY_INTERIOR)) + + var/exterior_ready_to_dismember = (!has_exterior || ((mangled_state & BODYPART_MANGLED_EXTERIOR))) + + // if we're bone only, all cutting attacks go straight to the bone + if(!has_exterior && has_interior) + if(wounding_type == WOUND_SLASH) + wounding_type = WOUND_BLUNT + wounding_dmg *= (easy_dismember ? 1 : 0.6) + else if(wounding_type == WOUND_PIERCE) + wounding_type = WOUND_BLUNT + wounding_dmg *= (easy_dismember ? 1 : 0.75) + else + // if we've already mangled the skin (critical slash or piercing wound), then the bone is exposed, and we can damage it with sharp weapons at a reduced rate + // So a big sharp weapon is still all you need to destroy a limb + if(has_interior && exterior_ready_to_dismember && !(mangled_state & BODYPART_MANGLED_INTERIOR) && sharpness) + if(wounding_type == WOUND_SLASH && !easy_dismember) + wounding_dmg *= 0.6 // edged weapons pass along 60% of their wounding damage to the bone since the power is spread out over a larger area + if(wounding_type == WOUND_PIERCE && !easy_dismember) + wounding_dmg *= 0.75 // piercing weapons pass along 75% of their wounding damage to the bone since it's more concentrated + wounding_type = WOUND_BLUNT + if ((dismemberable_by_wound() || dismemberable_by_total_damage()) && try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus)) + return + return check_wounding(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus) /** * check_wounding() is where we handle rolling for, selecting, and applying a wound if we meet the criteria @@ -77,55 +70,159 @@ var/base_roll = rand(1, round(damage ** WOUND_DAMAGE_EXPONENT)) var/injury_roll = base_roll injury_roll += check_woundings_mods(woundtype, damage, wound_bonus, bare_wound_bonus) + var/list/series_wounding_mods = check_series_wounding_mods() + if(injury_roll > WOUND_DISMEMBER_OUTRIGHT_THRESH && prob(get_damage() / max_damage * 100)) var/datum/wound/loss/dismembering = new dismembering.apply_dismember(src, woundtype, outright = TRUE, attack_direction = attack_direction) return - var/list/wounds_checking = GLOB.global_wound_types[woundtype] + var/list/datum/wound/possible_wounds = list() + for (var/datum/wound/type as anything in GLOB.all_wound_pregen_data) + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[type] + if (pregen_data.can_be_applied_to(src, list(woundtype), random_roll = TRUE)) + possible_wounds[type] = pregen_data.get_weight(src, woundtype, damage, attack_direction, damage_source) // quick re-check to see if bare_wound_bonus applies, for the benefit of log_wound(), see about getting the check from check_woundings_mods() somehow if(ishuman(owner)) var/mob/living/carbon/human/human_wearer = owner - var/list/clothing = human_wearer.clothingonpart(src) + var/list/clothing = human_wearer.get_clothing_on_part(src) for(var/obj/item/clothing/clothes_check as anything in clothing) // unlike normal armor checks, we tabluate these piece-by-piece manually so we can also pass on appropriate damage the clothing's limbs if necessary if(clothes_check.get_armor_rating(WOUND)) bare_wound_bonus = 0 break - //cycle through the wounds of the relevant category from the most severe down - for(var/datum/wound/possible_wound as anything in wounds_checking) + for (var/datum/wound/iterated_path as anything in possible_wounds) + for (var/datum/wound/existing_wound as anything in wounds) + if (iterated_path == existing_wound.type) + possible_wounds -= iterated_path + break // breaks out of the nested loop + + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[iterated_path] + var/specific_injury_roll = (injury_roll + series_wounding_mods[pregen_data.wound_series]) + if (pregen_data.get_threshold_for(src, attack_direction, damage_source) > specific_injury_roll) + possible_wounds -= iterated_path + continue + + if (pregen_data.compete_for_wounding) + for (var/datum/wound/other_path as anything in possible_wounds) + if (other_path == iterated_path) + continue + if (initial(iterated_path.severity) == initial(other_path.severity) && pregen_data.overpower_wounds_of_even_severity) + possible_wounds -= other_path + continue + else if (pregen_data.competition_mode == WOUND_COMPETITION_OVERPOWER_LESSERS) + if (initial(iterated_path.severity) > initial(other_path.severity)) + possible_wounds -= other_path + continue + else if (pregen_data.competition_mode == WOUND_COMPETITION_OVERPOWER_GREATERS) + if (initial(iterated_path.severity) < initial(other_path.severity)) + possible_wounds -= other_path + continue + + while (length(possible_wounds)) + var/datum/wound/possible_wound = pick_weight(possible_wounds) + var/datum/wound_pregen_data/possible_pregen_data = GLOB.all_wound_pregen_data[possible_wound] + possible_wounds -= possible_wound + var/datum/wound/replaced_wound for(var/datum/wound/existing_wound as anything in wounds) - if(existing_wound.type in wounds_checking) + var/datum/wound_pregen_data/existing_pregen_data = GLOB.all_wound_pregen_data[existing_wound.type] + if(existing_pregen_data.wound_series == possible_pregen_data.wound_series) if(existing_wound.severity >= initial(possible_wound.severity)) - return + continue else replaced_wound = existing_wound + // if we get through this whole loop without continuing, we found our winner - if(initial(possible_wound.threshold_minimum) < injury_roll) - var/datum/wound/new_wound - if(replaced_wound) - new_wound = replaced_wound.replace_wound(possible_wound, attack_direction = attack_direction) - else - new_wound = new possible_wound - new_wound.apply_wound(src, attack_direction = attack_direction, wound_source = damage_source) - log_wound(owner, new_wound, damage, wound_bonus, bare_wound_bonus, base_roll) // dismembering wounds are logged in the apply_wound() for loss wounds since they delete themselves immediately, these will be immediately returned - return new_wound + var/datum/wound/new_wound = new possible_wound + if(replaced_wound) + new_wound = replaced_wound.replace_wound(new_wound, attack_direction = attack_direction) + else + new_wound.apply_wound(src, attack_direction = attack_direction, wound_source = damage_source) + log_wound(owner, new_wound, damage, wound_bonus, bare_wound_bonus, base_roll) // dismembering wounds are logged in the apply_wound() for loss wounds since they delete themselves immediately, these will be immediately returned + return new_wound // try forcing a specific wound, but only if there isn't already a wound of that severity or greater for that type on this bodypart -/obj/item/bodypart/proc/force_wound_upwards(specific_woundtype, smited = FALSE, wound_source) +/obj/item/bodypart/proc/force_wound_upwards(datum/wound/potential_wound, smited = FALSE, wound_source) SHOULD_NOT_OVERRIDE(TRUE) - var/datum/wound/potential_wound = specific_woundtype + if (isnull(potential_wound)) + return + + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[potential_wound] for(var/datum/wound/existing_wound as anything in wounds) - if(existing_wound.wound_type == initial(potential_wound.wound_type)) + var/datum/wound_pregen_data/existing_pregen_data = existing_wound.get_pregen_data() + if (existing_pregen_data.wound_series == pregen_data.wound_series) if(existing_wound.severity < initial(potential_wound.severity)) // we only try if the existing one is inferior to the one we're trying to force - existing_wound.replace_wound(potential_wound, smited) + existing_wound.replace_wound(new potential_wound, smited) return var/datum/wound/new_wound = new potential_wound new_wound.apply_wound(src, smited = smited, wound_source = wound_source) + return new_wound + +/** + * A simple proc to force a type of wound onto this mob. If you just want to force a specific mainline (fractures, bleeding, etc.) wound, you only need to care about the first 3 args. + * + * Args: + * * wounding_type: The wounding_type, e.g. WOUND_BLUNT, WOUND_SLASH to force onto the mob. Can be a list. + * * obj/item/bodypart/limb: The limb we wil be applying the wound to. If null, a random bodypart will be picked. + * * min_severity: The minimum severity that will be considered. + * * max_severity: The maximum severity that will be considered. + * * severity_pick_mode: The "pick mode" to be used. See get_corresponding_wound_type's documentation + * * wound_source: The source of the wound to be applied. Nullable. + * + * For the rest of the args, refer to get_corresponding_wound_type(). + * + * Returns: + * A new wound instance if the application was successful, null otherwise. +*/ +/mob/living/carbon/proc/cause_wound_of_type_and_severity(wounding_type, obj/item/bodypart/limb, min_severity, max_severity = min_severity, severity_pick_mode = WOUND_PICK_HIGHEST_SEVERITY, wound_source) + if (isnull(limb)) + limb = pick(bodyparts) + + var/list/type_list = wounding_type + if (!islist(type_list)) + type_list = list(type_list) + + var/datum/wound/corresponding_typepath = get_corresponding_wound_type(type_list, limb, min_severity, max_severity, severity_pick_mode) + if (corresponding_typepath) + return limb.force_wound_upwards(corresponding_typepath, wound_source = wound_source) + +/// Limb is nullable, but picks a random one. Defers to limb.get_wound_threshold_of_wound_type, see it for documentation. +/mob/living/carbon/proc/get_wound_threshold_of_wound_type(wounding_type, severity, default, obj/item/bodypart/limb, wound_source) + if (isnull(limb)) + limb = pick(bodyparts) + + if (!limb) + return default + + return limb.get_wound_threshold_of_wound_type(wounding_type, severity, default, wound_source) + +/** + * A simple proc that gets the best wound to fit the criteria laid out, then returns its wound threshold. + * + * Args: + * * wounding_type: The wounding_type, e.g. WOUND_BLUNT, WOUND_SLASH to force onto the mob. Can be a list of wounding_types. + * * severity: The severity that will be considered. + * * return_value_if_no_wound: If no wound is found, we will return this instead. (It is reccomended to use named args for this one, as its unclear what it is without) + * * wound_source: The theoretical source of the wound. Nullable. + * + * Returns: + * return_value_if_no_wound if no wound is found - if one IS found, the wound threshold for that wound. + */ +/obj/item/bodypart/proc/get_wound_threshold_of_wound_type(wounding_type, severity, return_value_if_no_wound, wound_source) + var/list/type_list = wounding_type + if (!islist(type_list)) + type_list = list(type_list) + + var/datum/wound/wound_path = get_corresponding_wound_type(type_list, src, severity, duplicates_allowed = TRUE, care_about_existing_wounds = FALSE) + if (wound_path) + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[wound_path] + return pregen_data.get_threshold_for(src, damage_source = wound_source) + + return return_value_if_no_wound /** * check_wounding_mods() is where we handle the various modifiers of a wound roll @@ -145,7 +242,7 @@ if(owner && ishuman(owner)) var/mob/living/carbon/human/human_owner = owner - var/list/clothing = human_owner.clothingonpart(src) + var/list/clothing = human_owner.get_clothing_on_part(src) for(var/obj/item/clothing/clothes as anything in clothing) // unlike normal armor checks, we tabluate these piece-by-piece manually so we can also pass on appropriate damage the clothing's limbs if necessary armor_ablation += clothes.get_armor_rating(WOUND) @@ -171,7 +268,20 @@ return injury_mod - /// Get whatever wound of the given type is currently attached to this limb, if any +/// Should return an assoc list of (wound_series -> penalty). Will be used in determining series-specific penalties for wounding. +/obj/item/bodypart/proc/check_series_wounding_mods() + RETURN_TYPE(/list) + + var/list/series_mods = list() + + for (var/datum/wound/iterated_wound as anything in wounds) + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[iterated_wound.type] + + series_mods[pregen_data.wound_series] += iterated_wound.series_threshold_penalty + + return series_mods + +/// Get whatever wound of the given type is currently attached to this limb, if any /obj/item/bodypart/proc/get_wound_type(checking_type) RETURN_TYPE(checking_type) SHOULD_NOT_OVERRIDE(TRUE) @@ -194,11 +304,11 @@ /obj/item/bodypart/proc/update_wounds(replaced = FALSE) SHOULD_CALL_PARENT(TRUE) - var/dam_mul = 1 //initial(wound_damage_multiplier) + var/dam_mul = 1 // we can (normally) only have one wound per type, but remember there's multiple types (smites like :B:loodless can generate multiple cuts on a limb) for(var/datum/wound/iter_wound as anything in wounds) - dam_mul *= iter_wound.damage_mulitplier_penalty + dam_mul *= iter_wound.damage_multiplier_penalty if(!LAZYLEN(wounds) && current_gauze && !replaced) // no more wounds = no need for the gauze anymore owner.visible_message(span_notice("\The [current_gauze.name] on [owner]'s [name] falls away."), span_notice("The [current_gauze.name] on your [parse_zone(body_zone)] falls away.")) diff --git a/code/modules/surgery/bone_mending.dm b/code/modules/surgery/bone_mending.dm index 2396f49c322d1..48114fe6d04ac 100644 --- a/code/modules/surgery/bone_mending.dm +++ b/code/modules/surgery/bone_mending.dm @@ -5,7 +5,7 @@ /datum/surgery/repair_bone_hairline name = "Repair bone fracture (hairline)" surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB - targetable_wound = /datum/wound/blunt/severe + targetable_wound = /datum/wound/blunt/bone/severe possible_locs = list( BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, @@ -31,7 +31,7 @@ /datum/surgery/repair_bone_compound name = "Repair Compound Fracture" surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB - targetable_wound = /datum/wound/blunt/critical + targetable_wound = /datum/wound/blunt/bone/critical possible_locs = list( BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, diff --git a/code/modules/surgery/burn_dressing.dm b/code/modules/surgery/burn_dressing.dm index f448195d3ef5a..c22a8f4be9734 100644 --- a/code/modules/surgery/burn_dressing.dm +++ b/code/modules/surgery/burn_dressing.dm @@ -5,7 +5,7 @@ /datum/surgery/debride name = "Debride burnt flesh" surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB - targetable_wound = /datum/wound/burn + targetable_wound = /datum/wound/burn/flesh possible_locs = list( BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, @@ -24,7 +24,7 @@ return FALSE if(..()) var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(user.zone_selected) - var/datum/wound/burn/burn_wound = targeted_bodypart.get_wound_type(targetable_wound) + var/datum/wound/burn/flesh/burn_wound = targeted_bodypart.get_wound_type(targetable_wound) return(burn_wound && burn_wound.infestation > 0) //SURGERY STEPS @@ -48,7 +48,7 @@ var/infestation_removed = 4 /// To give the surgeon a heads up how much work they have ahead of them -/datum/surgery_step/debride/proc/get_progress(mob/user, mob/living/carbon/target, datum/wound/burn/burn_wound) +/datum/surgery_step/debride/proc/get_progress(mob/user, mob/living/carbon/target, datum/wound/burn/flesh/burn_wound) if(!burn_wound?.infestation || !infestation_removed) return var/estimated_remaining_steps = burn_wound.infestation / infestation_removed @@ -68,7 +68,7 @@ /datum/surgery_step/debride/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(surgery.operated_wound) - var/datum/wound/burn/burn_wound = surgery.operated_wound + var/datum/wound/burn/flesh/burn_wound = surgery.operated_wound if(burn_wound.infestation <= 0) to_chat(user, span_notice("[target]'s [parse_zone(user.zone_selected)] has no infected flesh to remove!")) surgery.status++ @@ -86,7 +86,7 @@ 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/debride/success(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/datum/wound/burn/burn_wound = surgery.operated_wound + var/datum/wound/burn/flesh/burn_wound = surgery.operated_wound if(burn_wound) var/progress_text = get_progress(user, target, burn_wound) display_results( @@ -120,7 +120,7 @@ /datum/surgery_step/debride/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) if(!..()) return - var/datum/wound/burn/burn_wound = surgery.operated_wound + var/datum/wound/burn/flesh/burn_wound = surgery.operated_wound while(burn_wound && burn_wound.infestation > 0.25) if(!..()) break @@ -139,7 +139,7 @@ /datum/surgery_step/dress/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - var/datum/wound/burn/burn_wound = surgery.operated_wound + var/datum/wound/burn/flesh/burn_wound = surgery.operated_wound if(burn_wound) display_results( user, @@ -153,7 +153,7 @@ 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/dress/success(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/datum/wound/burn/burn_wound = surgery.operated_wound + var/datum/wound/burn/flesh/burn_wound = surgery.operated_wound if(burn_wound) display_results( user, diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm index 230b2b038b80e..dc28e5da5769b 100644 --- a/code/modules/surgery/dental_implant.dm +++ b/code/modules/surgery/dental_implant.dm @@ -52,6 +52,6 @@ to_chat(owner, span_notice("You grit your teeth and burst the implanted [item_target.name]!")) owner.log_message("swallowed an implanted pill, [target]", LOG_ATTACK) if(item_target.reagents.total_volume) - item_target.reagents.trans_to(owner, item_target.reagents.total_volume, transfered_by = owner, methods = INGEST) + item_target.reagents.trans_to(owner, item_target.reagents.total_volume, transferred_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 c00cc6bc57f66..0000000000000 --- a/code/modules/surgery/dissection.dm +++ /dev/null @@ -1,82 +0,0 @@ -/datum/surgery/dissection - name = "Dissection" - target_mobtypes = list( - /mob/living/carbon/human, - /mob/living/carbon/alien, - ) - surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB - possible_locs = list(BODY_ZONE_CHEST) - 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 (autopsy scanner)" - time = 16 SECONDS - implements = list( - /obj/item/autopsy_scanner = 100, - ) - -/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.get_sharpness() > 0 diff --git a/code/modules/surgery/experimental_dissection.dm b/code/modules/surgery/experimental_dissection.dm new file mode 100644 index 0000000000000..6ae5e447e0bf2 --- /dev/null +++ b/code/modules/surgery/experimental_dissection.dm @@ -0,0 +1,152 @@ +///How many research points you gain from dissecting a Human. +#define BASE_HUMAN_REWARD 500 + +/datum/surgery/advanced/experimental_dissection + name = "Experimental Dissection" + desc = "A surgical procedure which analyzes the biology of a corpse, and automatically adds new findings to the research database." + steps = list( + /datum/surgery_step/incise, + /datum/surgery_step/retract_skin, + /datum/surgery_step/experimental_dissection, + /datum/surgery_step/close, + ) + surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_MORBID_CURIOSITY + possible_locs = list(BODY_ZONE_CHEST) + target_mobtypes = list(/mob/living) + +/datum/surgery/advanced/experimental_dissection/can_start(mob/user, mob/living/target) + . = ..() + if(HAS_TRAIT_FROM(target, TRAIT_DISSECTED, EXPERIMENTAL_SURGERY_TRAIT)) + return FALSE + if(target.stat != DEAD) + return FALSE + +/datum/surgery_step/experimental_dissection + name = "dissection" + implements = list( + /obj/item/autopsy_scanner = 100, + TOOL_SCALPEL = 60, + TOOL_KNIFE = 20, + /obj/item/shard = 10, + ) + time = 12 SECONDS + silicons_obey_prob = TRUE + +/datum/surgery_step/experimental_dissection/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] starts dissecting [target].", "You start dissecting [target].") + +/datum/surgery_step/experimental_dissection/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) + var/points_earned = check_value(target) + user.visible_message("[user] dissects [target], discovering [points_earned] point\s of data!", "You dissect [target], finding [points_earned] point\s worth of discoveries, you also write a few notes.") + + var/obj/item/research_notes/the_dossier = new /obj/item/research_notes(user.loc, points_earned, "biology") + if(!user.put_in_hands(the_dossier) && istype(user.get_inactive_held_item(), /obj/item/research_notes)) + var/obj/item/research_notes/hand_dossier = user.get_inactive_held_item() + hand_dossier.merge(the_dossier) + + var/obj/item/bodypart/target_chest = target.get_bodypart(BODY_ZONE_CHEST) + target.apply_damage(80, BRUTE, target_chest) + ADD_TRAIT(target, TRAIT_DISSECTED, EXPERIMENTAL_SURGERY_TRAIT) + return ..() + +/datum/surgery_step/experimental_dissection/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + var/points_earned = round(check_value(target) * 0.01) + user.visible_message( + "[user] dissects [target]!", + "You dissect [target], but do not find anything particularly interesting.", + ) + + var/obj/item/research_notes/the_dossier = new /obj/item/research_notes(user.loc, points_earned, "biology") + if(!user.put_in_hands(the_dossier) && istype(user.get_inactive_held_item(), /obj/item/research_notes)) + var/obj/item/research_notes/hand_dossier = user.get_inactive_held_item() + hand_dossier.merge(the_dossier) + + var/obj/item/bodypart/L = target.get_bodypart(BODY_ZONE_CHEST) + target.apply_damage(80, BRUTE, L) + return TRUE + +///Calculates how many research points dissecting 'target' is worth. +/datum/surgery_step/experimental_dissection/proc/check_value(mob/living/target) + var/cost = BASE_HUMAN_REWARD + + if(ishuman(target)) + var/mob/living/carbon/human/human_target = target + if(human_target.dna?.species) + if(ismonkey(human_target)) + cost /= 5 + else if(isabductor(human_target)) + cost *= 4 + else if(isgolem(human_target) || iszombie(human_target)) + cost *= 3 + else if(isjellyperson(human_target) || ispodperson(human_target)) + cost *= 2 + else if(isalienroyal(target)) + cost *= 10 + else if(isalienadult(target)) + cost *= 5 + else + cost /= 6 + + return cost + +#undef BASE_HUMAN_REWARD + +/obj/item/research_notes + name = "research notes" + desc = "Valuable scientific data. Use it in an ancient research server to turn it in." + icon = 'icons/obj/service/bureaucracy.dmi' + icon_state = "paper" + w_class = WEIGHT_CLASS_SMALL + ///research points it holds + var/value = 100 + ///origin of the research + var/origin_type = "debug" + ///if it ws merged with different origins to apply a bonus + var/mixed = FALSE + +/obj/item/research_notes/Initialize(mapload, value, origin_type) + . = ..() + if(value) + src.value = value + if(origin_type) + src.origin_type = origin_type + change_vol() + +/obj/item/research_notes/examine(mob/user) + . = ..() + . += span_notice("It is worth [value] research points.") + +/obj/item/research_notes/attackby(obj/item/attacking_item, mob/living/user, params) + if(istype(attacking_item, /obj/item/research_notes)) + var/obj/item/research_notes/notes = attacking_item + value = value + notes.value + change_vol() + qdel(notes) + return + return ..() + +/// proc that changes name and icon depending on value +/obj/item/research_notes/proc/change_vol() + if(value >= 10000) + name = "revolutionary discovery in the field of [origin_type]" + icon_state = "docs_verified" + else if(value >= 2500) + name = "essay about [origin_type]" + icon_state = "paper_words" + else if(value >= 100) + name = "notes of [origin_type]" + icon_state = "paperslip_words" + else + name = "fragmentary data of [origin_type]" + icon_state = "scrap" + +///proc when you slap research notes into another one, it applies a bonus if they are of different origin (only applied once) +/obj/item/research_notes/proc/merge(obj/item/research_notes/new_paper) + var/bonus = min(value , new_paper.value) + value = value + new_paper.value + if(origin_type != new_paper.origin_type && !mixed) + value += bonus * 0.3 + origin_type = "[origin_type] and [new_paper.origin_type]" + mixed = TRUE + change_vol() + qdel(new_paper) diff --git a/code/modules/surgery/healing.dm b/code/modules/surgery/healing.dm index 1f37d41b8186e..efef97cca74f3 100644 --- a/code/modules/surgery/healing.dm +++ b/code/modules/surgery/healing.dm @@ -18,10 +18,6 @@ /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 @@ -84,12 +80,15 @@ var/target_msg = "[user] fixes some of [target]'s wounds" //see above var/brute_healed = brutehealing var/burn_healed = burnhealing + var/dead_patient = FALSE 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) + dead_patient = TRUE else brute_healed += round((target.getBruteLoss() * brute_multiplier),0.1) burn_healed += round((target.getFireLoss() * burn_multiplier),0.1) + dead_patient = FALSE if(!get_location_accessible(target, target_zone)) brute_healed *= 0.55 burn_healed *= 0.55 @@ -99,6 +98,10 @@ user_msg += get_progress(user, target, brute_healed, burn_healed) + if(HAS_MIND_TRAIT(user, TRAIT_MORBID) && ishuman(user) && !dead_patient) //Morbid folk don't care about tending the dead as much as tending the living + var/mob/living/carbon/human/morbid_weirdo = user + morbid_weirdo.add_mood_event("morbid_tend_wounds", /datum/mood_event/morbid_tend_wounds) + display_results( user, target, diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm index 9370a4f719c91..7f43d56ffb1b0 100644 --- a/code/modules/surgery/implant_removal.dm +++ b/code/modules/surgery/implant_removal.dm @@ -1,5 +1,6 @@ /datum/surgery/implant_removal - name = "Implant removal" + name = "Implant Removal" + target_mobtypes = list(/mob/living) possible_locs = list(BODY_ZONE_CHEST) steps = list( /datum/surgery_step/incise, @@ -20,7 +21,7 @@ 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) +/datum/surgery_step/extract_implant/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) for(var/obj/item/object in target.implants) implant = object break @@ -42,7 +43,7 @@ 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) +/datum/surgery_step/extract_implant/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) if(implant) display_results( user, @@ -79,8 +80,9 @@ return ..() /datum/surgery/implant_removal/mechanic - name = "implant removal" + name = "Implant Removal" requires_bodypart_type = BODYTYPE_ROBOTIC + target_mobtypes = list(/mob/living/carbon/human) // Simpler mobs don't have bodypart types steps = list( /datum/surgery_step/mechanic_open, /datum/surgery_step/open_hatch, diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm index d143bd591b9c8..28a2443600bbe 100644 --- a/code/modules/surgery/limb_augmentation.dm +++ b/code/modules/surgery/limb_augmentation.dm @@ -14,7 +14,7 @@ /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) + if(HAS_TRAIT(target, TRAIT_NO_AUGMENTS)) to_chat(user, span_warning("[target] cannot be augmented!")) return SURGERY_STEP_FAIL if(istype(tool, /obj/item/borg/apparatus/organ_storage) && istype(tool.contents[1], /obj/item/bodypart)) diff --git a/code/modules/surgery/lipoplasty.dm b/code/modules/surgery/lipoplasty.dm index 04f7fd1e5e006..f635d0da02032 100644 --- a/code/modules/surgery/lipoplasty.dm +++ b/code/modules/surgery/lipoplasty.dm @@ -20,6 +20,7 @@ name = "cut excess fat (circular saw)" implements = list( TOOL_SAW = 100, + /obj/item/shovel/serrated = 75, /obj/item/hatchet = 35, /obj/item/knife/butcher = 25) time = 64 diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm index f448a5d022708..c194c150d6da5 100644 --- a/code/modules/surgery/organ_manipulation.dm +++ b/code/modules/surgery/organ_manipulation.dm @@ -1,6 +1,6 @@ /datum/surgery/organ_manipulation name = "Organ manipulation" - surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB + surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB | SURGERY_MORBID_CURIOSITY possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD) steps = list( /datum/surgery_step/incise, @@ -23,6 +23,24 @@ /datum/surgery_step/close, ) +/datum/surgery/organ_manipulation/external + name = "Feature manipulation" + possible_locs = list( + BODY_ZONE_CHEST, + BODY_ZONE_HEAD, + BODY_ZONE_PRECISE_GROIN, + BODY_ZONE_L_ARM, + BODY_ZONE_R_ARM, + BODY_ZONE_L_LEG, + BODY_ZONE_R_LEG, + ) + steps = list( + /datum/surgery_step/incise, + /datum/surgery_step/retract_skin, + /datum/surgery_step/manipulate_organs/external, + /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) @@ -46,7 +64,7 @@ /datum/surgery_step/open_hatch, /datum/surgery_step/mechanic_unwrench, /datum/surgery_step/prepare_electronics, - /datum/surgery_step/manipulate_organs/internal, + /datum/surgery_step/manipulate_organs/internal/mechanic, /datum/surgery_step/mechanic_wrench, /datum/surgery_step/mechanic_close, ) @@ -87,12 +105,12 @@ /datum/surgery_step/mechanic_open, /datum/surgery_step/open_hatch, /datum/surgery_step/prepare_electronics, - /datum/surgery_step/manipulate_organs/internal, + /datum/surgery_step/manipulate_organs/internal/mechanic, /datum/surgery_step/mechanic_close, ) -/datum/surgery/organ_manipulation/external - name = "Feature manipulation" +/datum/surgery/organ_manipulation/mechanic/external + name = "Prosthetic feature manipulation" possible_locs = list( BODY_ZONE_CHEST, BODY_ZONE_HEAD, @@ -102,11 +120,12 @@ BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, ) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/manipulate_organs/external, - /datum/surgery_step/close, + steps = list( //not shorter than soft prosthetic manip because I dunno what steps could be cut here + /datum/surgery_step/mechanic_open, + /datum/surgery_step/open_hatch, + /datum/surgery_step/prepare_electronics, + /datum/surgery_step/manipulate_organs/external/mechanic, + /datum/surgery_step/mechanic_close, ) ///Organ manipulation base class. Do not use, it wont work. Use it's subtypes @@ -249,6 +268,7 @@ 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)) + target_organ.on_surgical_removal(user, target, target_zone, tool) else display_results( user, @@ -257,6 +277,9 @@ 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)]!"), ) + if(HAS_MIND_TRAIT(user, TRAIT_MORBID) && ishuman(user)) + var/mob/living/carbon/human/morbid_weirdo = user + morbid_weirdo.add_mood_event("morbid_abominable_surgery_success", /datum/mood_event/morbid_abominable_surgery_success) return ..() ///You can never use this MUHAHAHAHAHAHAH (because its the byond version of abstract) @@ -272,6 +295,11 @@ /datum/surgery_step/manipulate_organs/internal/can_use_organ(mob/user, obj/item/organ/organ) return isinternalorgan(organ) +///prosthetic surgery gives full effectiveness to crowbars (and hemostats) +/datum/surgery_step/manipulate_organs/internal/mechanic + implements_extract = list(TOOL_HEMOSTAT = 100, TOOL_CROWBAR = 100, /obj/item/kitchen/fork = 35) + name = "manipulate prosthetic organs (hemostat or crowbar/organ)" + ///Surgery step for external organs/features, like tails, frills, wings etc /datum/surgery_step/manipulate_organs/external time = 3.2 SECONDS @@ -280,3 +308,8 @@ ///Only operate on external organs /datum/surgery_step/manipulate_organs/external/can_use_organ(mob/user, obj/item/organ/organ) return isexternalorgan(organ) + +///prosthetic surgery gives full effectiveness to crowbars (and hemostats) +/datum/surgery_step/manipulate_organs/external/mechanic + implements_extract = list(TOOL_HEMOSTAT = 100, TOOL_CROWBAR = 100, /obj/item/kitchen/fork = 35) + name = "manipulate prosthetic features (hemostat or crowbar/feature)" diff --git a/code/modules/surgery/organic_steps.dm b/code/modules/surgery/organic_steps.dm index 53bafa54810fd..73e48db857f85 100644 --- a/code/modules/surgery/organic_steps.dm +++ b/code/modules/surgery/organic_steps.dm @@ -77,7 +77,7 @@ /datum/surgery_step/clamp_bleeders/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) if(locate(/datum/surgery_step/saw) in surgery.steps) - target.heal_bodypart_damage(20,0) + target.heal_bodypart_damage(20, 0, target_zone = target_zone) if (ishuman(target)) var/mob/living/carbon/human/human_target = target var/obj/item/bodypart/target_bodypart = human_target.get_bodypart(target_zone) @@ -137,7 +137,7 @@ /datum/surgery_step/close/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) if(locate(/datum/surgery_step/saw) in surgery.steps) - target.heal_bodypart_damage(45,0) + target.heal_bodypart_damage(45, 0, target_zone = target_zone) if (ishuman(target)) var/mob/living/carbon/human/human_target = target var/obj/item/bodypart/target_bodypart = human_target.get_bodypart(target_zone) @@ -152,6 +152,7 @@ name = "saw bone (circular saw)" implements = list( TOOL_SAW = 100, + /obj/item/shovel/serrated = 75, /obj/item/melee/arm_blade = 75, /obj/item/fireaxe = 50, /obj/item/hatchet = 35, diff --git a/code/modules/surgery/organs/_organ.dm b/code/modules/surgery/organs/_organ.dm index 6c68ed3d0d545..5b78cb30796e7 100644 --- a/code/modules/surgery/organs/_organ.dm +++ b/code/modules/surgery/organs/_organ.dm @@ -4,26 +4,34 @@ icon = 'icons/obj/medical/organs/organs.dmi' w_class = WEIGHT_CLASS_SMALL throwforce = 0 - ///The mob that owns this organ. + /// 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. + /// The cached info about the blood this organ belongs to + var/list/blood_dna_info = list("Synthetic DNA" = "O+") // not every organ spawns inside a person + /// 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) + /** + * The organ slot this organ is supposed to inhabit. This should be unique by type. (Lungs, Appendix, Stomach, etc) + * Do NOT add slots with matching names to different zones - it will break the organs_slot list! + */ var/slot - // DO NOT add slots with matching names to different zones - it will break organs_slot list! - var/organ_flags = ORGAN_EDIBLE + /// Random flags that describe this organ + var/organ_flags = ORGAN_ORGANIC | ORGAN_EDIBLE | ORGAN_VIRGIN + /// Maximum damage the organ can take, ever. var/maxHealth = STANDARD_ORGAN_THRESHOLD - /// Total damage this organ has sustained - /// Should only ever be modified by apply_organ_damage + /** + * Total damage this organ has sustained. + * Should only ever be modified by apply_organ_damage! + */ var/damage = 0 - ///Healing factor and decay factor function on % of maxhealth, and do not work by applying a static number per tick + /// 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. - ///Organ variables for determining what we alert the owner with when they pass/clear the damage thresholds + + // 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 var/high_threshold_passed @@ -32,19 +40,27 @@ var/high_threshold_cleared var/low_threshold_cleared - ///When you take a bite you cant jam it in for surgery anymore. + /// When set to false, this can't be used in surgeries and such - Honestly a terrible variable. var/useable = TRUE + + /// Food reagents if the organ is edible var/list/food_reagents = list(/datum/reagent/consumable/nutriment = 5) - ///The size of the reagent container + /// The size of the reagent container if the organ is edible var/reagent_vol = 10 + /// Time this organ has failed for var/failure_time = 0 - ///Do we effect the appearance of our mob. Used to save time in preference code + /// Do we affect the appearance of our mob. Used to save time in preference code var/visual = TRUE - /// Traits that are given to the holder of the organ. If you want an effect that changes this, don't add directly to this. Use the add_organ_trait() proc + /** + * Traits that are given to the holder of the organ. + * If you want an effect that changes this, don't add directly to this. Use the add_organ_trait() proc. + */ var/list/organ_traits /// Status Effects that are given to the holder of the organ. var/list/organ_effects + /// String displayed when the organ has decayed. + var/failing_desc = "has decayed for too long, and has turned a sickly color. It probably won't work without repairs." // Players can look at prefs before atoms SS init, and without this // they would not be able to see external organs, such as moth wings. @@ -61,6 +77,9 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) volume = reagent_vol,\ after_eat = CALLBACK(src, PROC_REF(OnEatFrom))) + if(!IS_ROBOTIC_ORGAN(src)) + add_blood_DNA(blood_dna_info) + /* * Insert the organ into the select mob. * @@ -86,6 +105,14 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) receiver.organs_slot[slot] = src owner = receiver + if(!IS_ROBOTIC_ORGAN(src) && (organ_flags & ORGAN_VIRGIN)) + blood_dna_info = receiver.get_blood_dna_list() + // need to remove the synethic blood DNA that is initialized + // wash also adds the blood dna again + wash(CLEAN_TYPE_BLOOD) + organ_flags &= ~ORGAN_VIRGIN + + // Apply unique side-effects. Return value does not matter. on_insert(receiver, special) @@ -138,6 +165,9 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) /obj/item/organ/proc/on_remove(mob/living/carbon/organ_owner, special) SHOULD_CALL_PARENT(TRUE) + if(!iscarbon(organ_owner)) + stack_trace("Organ removal should not be happening on non carbon mobs: [organ_owner]") + for(var/trait in organ_traits) REMOVE_TRAIT(organ_owner, trait, REF(src)) @@ -151,6 +181,27 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) SEND_SIGNAL(src, COMSIG_ORGAN_REMOVED, organ_owner) SEND_SIGNAL(organ_owner, COMSIG_CARBON_LOSE_ORGAN, src, special) + if(!IS_ROBOTIC_ORGAN(src) && !(item_flags & NO_BLOOD_ON_ITEM) && !QDELING(src)) + AddElement(/datum/element/decal/blood) + + var/list/diseases = organ_owner.get_static_viruses() + if(!LAZYLEN(diseases)) + return + + var/list/datum/disease/diseases_to_add = list() + for(var/datum/disease/disease as anything in diseases) + // robotic organs are immune to disease unless 'inorganic biology' symptom is present + if(IS_ROBOTIC_ORGAN(src) && !(disease.infectable_biotypes & MOB_ROBOTIC)) + continue + + // admin or special viruses that should not be reproduced + if(disease.spread_flags & (DISEASE_SPREAD_SPECIAL | DISEASE_SPREAD_NON_CONTAGIOUS)) + continue + + diseases_to_add += disease + if(LAZYLEN(diseases_to_add)) + AddComponent(/datum/component/infective, diseases_to_add) + /// Add a Trait to an organ that it will give its owner. /obj/item/organ/proc/add_organ_trait(trait) LAZYADD(organ_traits, trait) @@ -186,6 +237,22 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) /obj/item/organ/proc/on_find(mob/living/finder) return +/** + * Proc that gets called when the organ is surgically removed by someone, can be used for special effects + * Currently only used so surplus organs can explode when surgically removed. + */ +/obj/item/organ/proc/on_surgical_removal(mob/living/user, mob/living/carbon/old_owner, target_zone, obj/item/tool) + SHOULD_CALL_PARENT(TRUE) + SEND_SIGNAL(src, COMSIG_ORGAN_SURGICALLY_REMOVED, user, old_owner, target_zone, tool) + RemoveElement(/datum/element/decal/blood) + +/obj/item/organ/wash(clean_types) + . = ..() + + // always add the original dna to the organ after it's washed + if(!IS_ROBOTIC_ORGAN(src) && (clean_types & CLEAN_TYPE_BLOOD)) + add_blood_DNA(blood_dna_info) + /obj/item/organ/process(seconds_per_tick, times_fired) return @@ -201,13 +268,13 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) . += 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.") + . += span_warning("[src] [failing_desc]") return if(damage > high_threshold) + if(IS_ROBOTIC_ORGAN(src)) + . += span_warning("[src] seems to be malfunctioning.") + return . += span_warning("[src] is starting to look discolored.") ///Used as callbacks by object pooling @@ -224,16 +291,18 @@ 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. -///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/apply_organ_damage(damage_amount, maximum = maxHealth, required_organtype) //use for damaging effects +///Adjusts an organ's damage by the amount "damage_amount", up to a maximum amount, which is by default max damage. Returns the net change in organ damage. +/obj/item/organ/proc/apply_organ_damage(damage_amount, maximum = maxHealth, required_organ_flag = NONE) //use for damaging effects if(!damage_amount) //Micro-optimization. - return + return FALSE + maximum = clamp(maximum, 0, maxHealth) // the logical max is, our max if(maximum < damage) - return - if(required_organtype && (status != required_organtype)) - return + return FALSE + if(required_organ_flag && !(organ_flags & required_organ_flag)) + return FALSE damage = clamp(damage + damage_amount, 0, maximum) - var/mess = check_damage_thresholds(owner) + . = (prev_damage - damage) // return net damage + var/message = check_damage_thresholds(owner) prev_damage = damage if(damage >= maxHealth) @@ -241,12 +310,12 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) else organ_flags &= ~ORGAN_FAILING - if(mess && owner && owner.stat <= SOFT_CRIT) - to_chat(owner, mess) + if(message && owner && owner.stat <= SOFT_CRIT) + to_chat(owner, message) ///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/set_organ_damage(damage_amount, required_organtype) //use mostly for admin heals - apply_organ_damage(damage_amount - damage, required_organtype = required_organtype) +/obj/item/organ/proc/set_organ_damage(damage_amount, required_organ_flag = NONE) //use mostly for admin heals + return apply_organ_damage(damage_amount - damage, required_organ_flag = required_organ_flag) /** check_damage_thresholds * input: mob/organ_owner (a mob, the owner of the organ we call the proc on) @@ -367,7 +436,7 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) /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." + status = "[round((damage/maxHealth)*100, 1)]% damaged." else if(organ_flags & ORGAN_FAILING) status = "Non-Functional" else if(damage > high_threshold) @@ -379,4 +448,4 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) /// Tries to replace the existing organ on the passed mob with this one, with special handling for replacing a brain without ghosting target /obj/item/organ/proc/replace_into(mob/living/carbon/new_owner) - Insert(new_owner, special = TRUE, drop_if_replaced = FALSE) + return Insert(new_owner, special = TRUE, drop_if_replaced = FALSE) diff --git a/code/modules/surgery/organs/appendix.dm b/code/modules/surgery/organs/appendix.dm deleted file mode 100644 index 8a0f04be1f235..0000000000000 --- a/code/modules/surgery/organs/appendix.dm +++ /dev/null @@ -1,94 +0,0 @@ -// A 10% chance that out of a group of 25 people, one person will get appendicitis in 1 hour. -#define APPENDICITIS_PROB 100 * (0.1 * (1 / 25) / 3600) -#define INFLAMATION_ADVANCEMENT_PROB 2 - -/obj/item/organ/internal/appendix - name = "appendix" - icon_state = "appendix" - base_icon_state = "appendix" - visual = FALSE - zone = BODY_ZONE_PRECISE_GROIN - 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 - - now_failing = "An explosion of pain erupts in your lower right abdomen!" - now_fixed = "The pain in your abdomen has subsided." - - var/inflamation_stage = 0 - -/obj/item/organ/internal/appendix/update_name() - . = ..() - name = "[inflamation_stage ? "inflamed " : null][initial(name)]" - -/obj/item/organ/internal/appendix/update_icon_state() - icon_state = "[base_icon_state][inflamation_stage ? "inflamed" : ""]" - return ..() - -/obj/item/organ/internal/appendix/on_life(seconds_per_tick, times_fired) - ..() - var/mob/living/carbon/organ_owner = owner - if(!organ_owner) - return - - if(organ_flags & ORGAN_FAILING) - // forced to ensure people don't use it to gain tox as slime person - organ_owner.adjustToxLoss(2 * seconds_per_tick, updating_health = TRUE, forced = TRUE) - else if(inflamation_stage) - inflamation(seconds_per_tick) - else if(SPT_PROB(APPENDICITIS_PROB, seconds_per_tick)) - become_inflamed() - -/obj/item/organ/internal/appendix/proc/become_inflamed() - inflamation_stage = 1 - update_appearance() - if(owner) - ADD_TRAIT(owner, TRAIT_DISEASELIKE_SEVERITY_MEDIUM, type) - owner.med_hud_set_status() - notify_ghosts("[owner] has developed spontaneous appendicitis!", source = owner, action = NOTIFY_ORBIT, header = "Whoa, Sick!") - -/obj/item/organ/internal/appendix/proc/inflamation(seconds_per_tick) - var/mob/living/carbon/organ_owner = owner - if(inflamation_stage < 3 && SPT_PROB(INFLAMATION_ADVANCEMENT_PROB, seconds_per_tick)) - inflamation_stage += 1 - - switch(inflamation_stage) - if(1) - if(SPT_PROB(2.5, seconds_per_tick)) - organ_owner.emote("cough") - if(2) - if(SPT_PROB(1.5, seconds_per_tick)) - 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) - if(3) - if(SPT_PROB(0.5, seconds_per_tick)) - organ_owner.vomit(95) - organ_owner.adjustOrganLoss(ORGAN_SLOT_APPENDIX, 15) - - -/obj/item/organ/internal/appendix/get_availability(datum/species/owner_species, mob/living/owner_mob) - return owner_species.mutantappendix - -/obj/item/organ/internal/appendix/on_remove(mob/living/carbon/organ_owner) - . = ..() - REMOVE_TRAIT(organ_owner, TRAIT_DISEASELIKE_SEVERITY_MEDIUM, type) - organ_owner.med_hud_set_status() - -/obj/item/organ/internal/appendix/on_insert(mob/living/carbon/organ_owner) - . = ..() - if(inflamation_stage) - ADD_TRAIT(organ_owner, TRAIT_DISEASELIKE_SEVERITY_MEDIUM, type) - organ_owner.med_hud_set_status() - -/obj/item/organ/internal/appendix/get_status_text() - if((!(organ_flags & ORGAN_FAILING)) && inflamation_stage) - return "Inflamed" - else - return ..() - -#undef APPENDICITIS_PROB -#undef INFLAMATION_ADVANCEMENT_PROB diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm deleted file mode 100644 index 58e20b84f0851..0000000000000 --- a/code/modules/surgery/organs/ears.dm +++ /dev/null @@ -1,119 +0,0 @@ -/obj/item/organ/internal/ears - name = "ears" - icon_state = "ears" - desc = "There are three parts to the ear. Inner, middle and outer. Only one of these parts should be normally visible." - zone = BODY_ZONE_HEAD - slot = ORGAN_SLOT_EARS - 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 sometimes." - 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." - - // `deaf` measures "ticks" of deafness. While > 0, the person is unable - // to hear anything. - var/deaf = 0 - - // `damage` in this case measures long term damage to the ears, if too high, - // the person will not have either `deaf` or `ear_damage` decrease - // without external aid (earmuffs, drugs) - - //Resistance against loud noises - var/bang_protect = 0 - // Multiplier for both long term and short term ear damage - var/damage_multiplier = 1 - -/obj/item/organ/internal/ears/on_life(seconds_per_tick, 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)) - to_chat(owner, span_warning("The ringing in your ears grows louder, blocking out any external noises for a moment.")) - - . = ..() - // if we have non-damage related deafness like mutations, quirks or clothing (earmuffs), don't bother processing here. Ear healing from earmuffs or chems happen elsewhere - if(HAS_TRAIT_NOT_FROM(owner, TRAIT_DEAF, EAR_DAMAGE)) - return - - if((organ_flags & ORGAN_FAILING)) - 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 * seconds_per_tick), 0) - if((damage > low_threshold) && SPT_PROB(damage / 60, seconds_per_tick)) - adjustEarDamage(0, 4) - SEND_SOUND(owner, sound('sound/weapons/flash_ring.ogg')) - - if(deaf) - ADD_TRAIT(owner, TRAIT_DEAF, EAR_DAMAGE) - else - REMOVE_TRAIT(owner, TRAIT_DEAF, EAR_DAMAGE) - -/obj/item/organ/internal/ears/proc/adjustEarDamage(ddmg, ddeaf) - if(owner.status_flags & GODMODE) - return - set_organ_damage(max(damage + (ddmg*damage_multiplier), 0)) - deaf = max(deaf + (ddeaf*damage_multiplier), 0) - -/obj/item/organ/internal/ears/invincible - damage_multiplier = 0 - -/obj/item/organ/internal/ears/cat - name = "cat ears" - icon = 'icons/obj/clothing/head/costume.dmi' - worn_icon = 'icons/mob/clothing/head/costume.dmi' - icon_state = "kitty" - visual = TRUE - damage_multiplier = 2 - -/obj/item/organ/internal/ears/cat/on_insert(mob/living/carbon/human/ear_owner) - . = ..() - if(istype(ear_owner) && ear_owner.dna) - 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/internal/ears/cat/on_remove(mob/living/carbon/human/ear_owner) - . = ..() - if(istype(ear_owner) && ear_owner.dna) - color = ear_owner.hair_color - ear_owner.dna.species.mutant_bodyparts -= "ears" - ear_owner.update_body() - -/obj/item/organ/internal/ears/penguin - name = "penguin ears" - desc = "The source of a penguin's happy feet." - -/obj/item/organ/internal/ears/penguin/on_insert(mob/living/carbon/human/ear_owner) - . = ..() - if(istype(ear_owner)) - to_chat(ear_owner, span_notice("You suddenly feel like you've lost your balance.")) - ear_owner.AddElement(/datum/element/waddling) - -/obj/item/organ/internal/ears/penguin/on_remove(mob/living/carbon/human/ear_owner) - . = ..() - if(istype(ear_owner)) - to_chat(ear_owner, span_notice("Your sense of balance comes back to you.")) - ear_owner.RemoveElement(/datum/element/waddling) - -/obj/item/organ/internal/ears/cybernetic - name = "cybernetic ears" - icon_state = "ears-c" - desc = "A basic cybernetic organ designed to mimic the operation of ears." - damage_multiplier = 0.9 - organ_flags = ORGAN_SYNTHETIC - -/obj/item/organ/internal/ears/cybernetic/upgraded - name = "upgraded cybernetic ears" - icon_state = "ears-c-u" - desc = "An advanced cybernetic ear, surpassing the performance of organic ears." - damage_multiplier = 0.5 - -/obj/item/organ/internal/ears/cybernetic/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - apply_organ_damage(40/severity) diff --git a/code/modules/surgery/organs/external/_external_organ.dm b/code/modules/surgery/organs/external/_external_organ.dm new file mode 100644 index 0000000000000..db0d253564093 --- /dev/null +++ b/code/modules/surgery/organs/external/_external_organ.dm @@ -0,0 +1,392 @@ +/** +* System for drawing organs with overlays. These overlays are drawn directly on the bodypart, attached to a person or not +* Works in tandem with the /datum/sprite_accessory datum to generate sprites +* Unlike normal organs, we're actually inside a persons limbs at all times +*/ +/obj/item/organ/external + name = "external organ" + desc = "An external organ that is too external." + + organ_flags = ORGAN_ORGANIC | ORGAN_EDIBLE + visual = TRUE + + ///The overlay datum that actually draws stuff on the limb + var/datum/bodypart_overlay/mutant/bodypart_overlay + ///Reference to the limb we're inside of + var/obj/item/bodypart/ownerlimb + ///If not null, overrides the appearance with this sprite accessory datum + var/sprite_accessory_override + + /// The savefile_key of the preference this relates to. Used for the preferences UI. + var/preference + ///With what DNA block do we mutate in mutate_feature() ? For genetics + var/dna_block + + ///Set to EXTERNAL_BEHIND, EXTERNAL_FRONT or EXTERNAL_ADJACENT if you want to draw one of those layers as the object sprite. FALSE to use your own + ///This will not work if it doesn't have a limb to generate it's icon with + var/use_mob_sprite_as_obj_sprite = FALSE + ///Does this organ have any bodytypes to pass to it's ownerlimb? + var/external_bodytypes = NONE + ///Which flags does a 'modification tool' need to have to restyle us, if it all possible (located in code/_DEFINES/mobs) + var/restyle_flags = NONE + +/**mob_sprite is optional if you havent set sprite_datums for the object, and is used mostly to generate sprite_datums from a persons DNA +* For _mob_sprite we make a distinction between "Round Snout" and "round". Round Snout is the name of the sprite datum, while "round" would be part of the sprite +* I'm sorry +*/ +/obj/item/organ/external/Initialize(mapload, accessory_type) + . = ..() + + bodypart_overlay = new bodypart_overlay() + + accessory_type = accessory_type ? accessory_type : sprite_accessory_override + var/update_overlays = TRUE + if(accessory_type) + bodypart_overlay.set_appearance(accessory_type) + bodypart_overlay.imprint_on_next_insertion = FALSE + else if(loc) //we've been spawned into the world, and not in nullspace to be added to a limb (yes its fucking scuffed) + bodypart_overlay.randomize_appearance() + else + update_overlays = FALSE + + if(use_mob_sprite_as_obj_sprite && update_overlays) + update_appearance(UPDATE_OVERLAYS) + + if(restyle_flags) + RegisterSignal(src, COMSIG_ATOM_RESTYLE, PROC_REF(on_attempt_feature_restyle)) + +/obj/item/organ/external/Destroy() + if(owner) + Remove(owner, special=TRUE) + else if(ownerlimb) + remove_from_limb() + + return ..() + +/obj/item/organ/external/Insert(mob/living/carbon/receiver, special, drop_if_replaced) + if(!should_external_organ_apply_to(type, receiver)) + stack_trace("adding a [type] to a [receiver.type] when it shouldn't be!") + + var/obj/item/bodypart/limb = receiver.get_bodypart(deprecise_zone(zone)) + + if(!limb) + return FALSE + + . = ..() + + if(!.) + return + + if(bodypart_overlay.imprint_on_next_insertion) //We only want this set *once* + var/feature_name = receiver.dna.features[bodypart_overlay.feature_key] + if (isnull(feature_name)) + feature_name = receiver.dna.species.external_organs[type] + bodypart_overlay.set_appearance_from_name(feature_name) + bodypart_overlay.imprint_on_next_insertion = FALSE + + ownerlimb = limb + add_to_limb(ownerlimb) + + if(external_bodytypes) + receiver.synchronize_bodytypes() + + receiver.update_body_parts() + +/obj/item/organ/external/Remove(mob/living/carbon/organ_owner, special, moving) + . = ..() + + if(ownerlimb) + remove_from_limb() + if(!moving && use_mob_sprite_as_obj_sprite) //so we're being taken out and dropped + update_appearance(UPDATE_OVERLAYS) + + if(organ_owner) + organ_owner.update_body_parts() + + +/obj/item/organ/external/on_remove(mob/living/carbon/organ_owner, special) + . = ..() + color = bodypart_overlay.draw_color // so a pink felinid doesn't drop a gray tail + +///Transfers the organ to the limb, and to the limb's owner, if it has one. +/obj/item/organ/external/transfer_to_limb(obj/item/bodypart/bodypart, mob/living/carbon/bodypart_owner) + if(owner) + Remove(owner, moving = TRUE) + else if(ownerlimb) + remove_from_limb() + + if(bodypart_owner) + Insert(bodypart_owner, TRUE) + else + add_to_limb(bodypart) + +/obj/item/organ/external/add_to_limb(obj/item/bodypart/bodypart) + bodypart.external_organs += src + ownerlimb = bodypart + ownerlimb.add_bodypart_overlay(bodypart_overlay) + return ..() + +/obj/item/organ/external/remove_from_limb() + ownerlimb.external_organs -= src + ownerlimb.remove_bodypart_overlay(bodypart_overlay) + if(ownerlimb.owner && external_bodytypes) + ownerlimb.owner.synchronize_bodytypes() + ownerlimb = null + return ..() + +/proc/should_external_organ_apply_to(obj/item/organ/external/organpath, mob/living/carbon/target) + if(isnull(organpath) || isnull(target)) + stack_trace("passed a null path or mob to 'should_external_organ_apply_to'") + return FALSE + + var/datum/bodypart_overlay/mutant/bodypart_overlay = initial(organpath.bodypart_overlay) + var/feature_key = !isnull(bodypart_overlay) && initial(bodypart_overlay.feature_key) + if(isnull(feature_key)) + return TRUE + + if(target.dna.features[feature_key] != SPRITE_ACCESSORY_NONE) + return TRUE + return FALSE + +///Update our features after something changed our appearance +/obj/item/organ/external/proc/mutate_feature(features, mob/living/carbon/human/human) + if(!dna_block) + return + + var/list/feature_list = bodypart_overlay.get_global_feature_list() + + bodypart_overlay.set_appearance_from_name(feature_list[deconstruct_block(get_uni_feature_block(features, dna_block), feature_list.len)]) + +///If you need to change an external_organ for simple one-offs, use this. Pass the accessory type : /datum/accessory/something +/obj/item/organ/external/proc/simple_change_sprite(accessory_type) + var/datum/sprite_accessory/typed_accessory = accessory_type //we only take types for maintainability + + bodypart_overlay.set_appearance(typed_accessory) + + if(owner) //are we in a person? + owner.update_body_parts() + else if(ownerlimb) //are we in a limb? + ownerlimb.update_icon_dropped() + //else if(use_mob_sprite_as_obj_sprite) //are we out in the world, unprotected by flesh? + +/obj/item/organ/external/on_life(seconds_per_tick, times_fired) + return + +/obj/item/organ/external/update_overlays() + . = ..() + + if(!use_mob_sprite_as_obj_sprite) + return + + //Build the mob sprite and use it as our overlay + for(var/external_layer in bodypart_overlay.all_layers) + if(bodypart_overlay.layers & external_layer) + . += bodypart_overlay.get_overlay(external_layer, ownerlimb) + +///The horns of a lizard! +/obj/item/organ/external/horns + name = "horns" + desc = "Why do lizards even have horns? Well, this one obviously doesn't." + icon_state = "horns" + + zone = BODY_ZONE_HEAD + slot = ORGAN_SLOT_EXTERNAL_HORNS + + preference = "feature_lizard_horns" + dna_block = DNA_HORNS_BLOCK + restyle_flags = EXTERNAL_RESTYLE_ENAMEL + + bodypart_overlay = /datum/bodypart_overlay/mutant/horns + +/datum/bodypart_overlay/mutant/horns + layers = EXTERNAL_ADJACENT + feature_key = "horns" + +/datum/bodypart_overlay/mutant/horns/can_draw_on_bodypart(mob/living/carbon/human/human) + if((human.head?.flags_inv & HIDEHAIR) || (human.wear_mask?.flags_inv & HIDEHAIR)) + return FALSE + + return TRUE + +/datum/bodypart_overlay/mutant/horns/get_global_feature_list() + return GLOB.horns_list + +///The frills of a lizard (like weird fin ears) +/obj/item/organ/external/frills + name = "frills" + desc = "Ear-like external organs often seen on aquatic reptillians." + icon_state = "frills" + + zone = BODY_ZONE_HEAD + slot = ORGAN_SLOT_EXTERNAL_FRILLS + + preference = "feature_lizard_frills" + dna_block = DNA_FRILLS_BLOCK + restyle_flags = EXTERNAL_RESTYLE_FLESH + + bodypart_overlay = /datum/bodypart_overlay/mutant/frills + +/datum/bodypart_overlay/mutant/frills + layers = EXTERNAL_ADJACENT + feature_key = "frills" + +/datum/bodypart_overlay/mutant/frills/can_draw_on_bodypart(mob/living/carbon/human/human) + if(!(human.head?.flags_inv & HIDEEARS)) + return TRUE + return FALSE + +/datum/bodypart_overlay/mutant/frills/get_global_feature_list() + return GLOB.frills_list + +///Guess what part of the lizard this is? +/obj/item/organ/external/snout + name = "lizard snout" + desc = "Take a closer look at that snout!" + icon_state = "snout" + + zone = BODY_ZONE_HEAD + slot = ORGAN_SLOT_EXTERNAL_SNOUT + + preference = "feature_lizard_snout" + external_bodytypes = BODYTYPE_SNOUTED + + dna_block = DNA_SNOUT_BLOCK + restyle_flags = EXTERNAL_RESTYLE_FLESH + + bodypart_overlay = /datum/bodypart_overlay/mutant/snout + +/datum/bodypart_overlay/mutant/snout + layers = EXTERNAL_ADJACENT + feature_key = "snout" + +/datum/bodypart_overlay/mutant/snout/can_draw_on_bodypart(mob/living/carbon/human/human) + if(!(human.wear_mask?.flags_inv & HIDESNOUT) && !(human.head?.flags_inv & HIDESNOUT)) + return TRUE + return FALSE + +/datum/bodypart_overlay/mutant/snout/get_global_feature_list() + return GLOB.snouts_list + +///A moth's antennae +/obj/item/organ/external/antennae + name = "moth antennae" + desc = "A moths antennae. What is it telling them? What are they sensing?" + icon_state = "antennae" + + zone = BODY_ZONE_HEAD + slot = ORGAN_SLOT_EXTERNAL_ANTENNAE + + preference = "feature_moth_antennae" + dna_block = DNA_MOTH_ANTENNAE_BLOCK + restyle_flags = EXTERNAL_RESTYLE_FLESH + + bodypart_overlay = /datum/bodypart_overlay/mutant/antennae + + ///Are we burned? + var/burnt = FALSE + ///Store our old datum here for if our antennae are healed + var/original_sprite_datum + +/obj/item/organ/external/antennae/Insert(mob/living/carbon/receiver, special, drop_if_replaced) + . = ..() + if(!.) + return + RegisterSignal(receiver, COMSIG_HUMAN_BURNING, PROC_REF(try_burn_antennae)) + RegisterSignal(receiver, COMSIG_LIVING_POST_FULLY_HEAL, PROC_REF(heal_antennae)) + +/obj/item/organ/external/antennae/Remove(mob/living/carbon/organ_owner, special, moving) + . = ..() + UnregisterSignal(organ_owner, list(COMSIG_HUMAN_BURNING, COMSIG_LIVING_POST_FULLY_HEAL)) + +///check if our antennae can burn off ;_; +/obj/item/organ/external/antennae/proc/try_burn_antennae(mob/living/carbon/human/human) + SIGNAL_HANDLER + + 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 antennae burn to a crisp!")) + + burn_antennae() + human.update_body_parts() + +///Burn our antennae off ;_; +/obj/item/organ/external/antennae/proc/burn_antennae() + var/datum/bodypart_overlay/mutant/antennae/antennae = bodypart_overlay + antennae.burnt = TRUE + burnt = TRUE + +///heal our antennae back up!! +/obj/item/organ/external/antennae/proc/heal_antennae(datum/source, heal_flags) + SIGNAL_HANDLER + + if(!burnt) + return + + if(heal_flags & (HEAL_LIMBS|HEAL_ORGANS)) + var/datum/bodypart_overlay/mutant/antennae/antennae = bodypart_overlay + antennae.burnt = FALSE + burnt = FALSE + +///Moth antennae datum, with full burning functionality +/datum/bodypart_overlay/mutant/antennae + layers = EXTERNAL_FRONT | EXTERNAL_BEHIND + feature_key = "moth_antennae" + ///Accessory datum of the burn sprite + var/datum/sprite_accessory/burn_datum = /datum/sprite_accessory/moth_antennae/burnt_off + ///Are we burned? If so we draw differently + var/burnt = FALSE + +/datum/bodypart_overlay/mutant/antennae/New() + . = ..() + + burn_datum = fetch_sprite_datum(burn_datum) //turn the path into the singleton instance + +/datum/bodypart_overlay/mutant/antennae/get_global_feature_list() + return GLOB.moth_antennae_list + +/datum/bodypart_overlay/mutant/antennae/get_base_icon_state() + return burnt ? burn_datum.icon_state : sprite_datum.icon_state + +///The leafy hair of a podperson +/obj/item/organ/external/pod_hair + name = "podperson hair" + desc = "Base for many-o-salads." + + zone = BODY_ZONE_HEAD + slot = ORGAN_SLOT_EXTERNAL_POD_HAIR + + preference = "feature_pod_hair" + use_mob_sprite_as_obj_sprite = TRUE + + dna_block = DNA_POD_HAIR_BLOCK + restyle_flags = EXTERNAL_RESTYLE_PLANT + + bodypart_overlay = /datum/bodypart_overlay/mutant/pod_hair + +///Podperson bodypart overlay, with special coloring functionality to render the flowers in the inverse color +/datum/bodypart_overlay/mutant/pod_hair + layers = EXTERNAL_FRONT|EXTERNAL_ADJACENT + feature_key = "pod_hair" + + ///This layer will be colored differently than the rest of the organ. So we can get differently colored flowers or something + var/color_swapped_layer = EXTERNAL_FRONT + ///The individual rgb colors are subtracted from this to get the color shifted layer + var/color_inverse_base = 255 + +/datum/bodypart_overlay/mutant/pod_hair/get_global_feature_list() + return GLOB.pod_hair_list + +/datum/bodypart_overlay/mutant/pod_hair/color_image(image/overlay, draw_layer, obj/item/bodypart/limb) + if(draw_layer != bitflag_to_layer(color_swapped_layer)) + return ..() + + if(draw_color) // can someone explain to me why draw_color is allowed to EVER BE AN EMPTY STRING + var/list/rgb_list = rgb2num(draw_color) + overlay.color = rgb(color_inverse_base - rgb_list[1], color_inverse_base - rgb_list[2], color_inverse_base - rgb_list[3]) //inversa da color + else + overlay.color = null + +/datum/bodypart_overlay/mutant/pod_hair/can_draw_on_bodypart(mob/living/carbon/human/human) + if((human.head?.flags_inv & HIDEHAIR) || (human.wear_mask?.flags_inv & HIDEHAIR)) + return FALSE + + return TRUE diff --git a/code/modules/surgery/organs/external/_external_organs.dm b/code/modules/surgery/organs/external/_external_organs.dm deleted file mode 100644 index 145d90f0cab02..0000000000000 --- a/code/modules/surgery/organs/external/_external_organs.dm +++ /dev/null @@ -1,368 +0,0 @@ -/** -* System for drawing organs with overlays. These overlays are drawn directly on the bodypart, attached to a person or not -* Works in tandem with the /datum/sprite_accessory datum to generate sprites -* Unlike normal organs, we're actually inside a persons limbs at all times -*/ -/obj/item/organ/external - name = "external organ" - desc = "An external organ that is too external." - - organ_flags = ORGAN_EDIBLE - visual = TRUE - - ///The overlay datum that actually draws stuff on the limb - var/datum/bodypart_overlay/mutant/bodypart_overlay - ///Reference to the limb we're inside of - var/obj/item/bodypart/ownerlimb - ///If not null, overrides the appearance with this sprite accessory datum - var/sprite_accessory_override - - /// The savefile_key of the preference this relates to. Used for the preferences UI. - var/preference - ///With what DNA block do we mutate in mutate_feature() ? For genetics - var/dna_block - - ///Set to EXTERNAL_BEHIND, EXTERNAL_FRONT or EXTERNAL_ADJACENT if you want to draw one of those layers as the object sprite. FALSE to use your own - ///This will not work if it doesn't have a limb to generate it's icon with - var/use_mob_sprite_as_obj_sprite = FALSE - ///Does this organ have any bodytypes to pass to it's ownerlimb? - var/external_bodytypes = NONE - ///Which flags does a 'modification tool' need to have to restyle us, if it all possible (located in code/_DEFINES/mobs) - var/restyle_flags = NONE - -/**mob_sprite is optional if you havent set sprite_datums for the object, and is used mostly to generate sprite_datums from a persons DNA -* For _mob_sprite we make a distinction between "Round Snout" and "round". Round Snout is the name of the sprite datum, while "round" would be part of the sprite -* I'm sorry -*/ -/obj/item/organ/external/Initialize(mapload, accessory_type) - . = ..() - - bodypart_overlay = new bodypart_overlay() - - accessory_type = accessory_type ? accessory_type : sprite_accessory_override - var/update_overlays = TRUE - if(accessory_type) - bodypart_overlay.set_appearance(accessory_type) - bodypart_overlay.imprint_on_next_insertion = FALSE - else if(loc) //we've been spawned into the world, and not in nullspace to be added to a limb (yes its fucking scuffed) - bodypart_overlay.randomize_appearance() - else - update_overlays = FALSE - - if(use_mob_sprite_as_obj_sprite && update_overlays) - update_appearance(UPDATE_OVERLAYS) - - if(restyle_flags) - RegisterSignal(src, COMSIG_ATOM_RESTYLE, PROC_REF(on_attempt_feature_restyle)) - -/obj/item/organ/external/Destroy() - if(owner) - Remove(owner, special=TRUE) - else if(ownerlimb) - remove_from_limb() - - return ..() - -/obj/item/organ/external/Insert(mob/living/carbon/receiver, special, drop_if_replaced) - var/obj/item/bodypart/limb = receiver.get_bodypart(deprecise_zone(zone)) - - if(!limb) - return FALSE - - . = ..() - - if(!.) - return - - if(bodypart_overlay.imprint_on_next_insertion) //We only want this set *once* - - bodypart_overlay.set_appearance_from_name(receiver.dna.features[bodypart_overlay.feature_key]) - bodypart_overlay.imprint_on_next_insertion = FALSE - - ownerlimb = limb - add_to_limb(ownerlimb) - - if(external_bodytypes) - limb.synchronize_bodytypes(receiver) - - receiver.update_body_parts() - -/obj/item/organ/external/Remove(mob/living/carbon/organ_owner, special, moving) - . = ..() - - if(ownerlimb) - remove_from_limb() - if(!moving && use_mob_sprite_as_obj_sprite) //so we're being taken out and dropped - update_appearance(UPDATE_OVERLAYS) - - if(organ_owner) - organ_owner.update_body_parts() - -///Transfers the organ to the limb, and to the limb's owner, if it has one. -/obj/item/organ/external/transfer_to_limb(obj/item/bodypart/bodypart, mob/living/carbon/bodypart_owner) - if(owner) - Remove(owner, moving = TRUE) - else if(ownerlimb) - remove_from_limb() - - if(bodypart_owner) - Insert(bodypart_owner, TRUE) - else - add_to_limb(bodypart) - -/obj/item/organ/external/add_to_limb(obj/item/bodypart/bodypart) - bodypart.external_organs += src - ownerlimb = bodypart - ownerlimb.add_bodypart_overlay(bodypart_overlay) - return ..() - -/obj/item/organ/external/remove_from_limb() - ownerlimb.external_organs -= src - ownerlimb.remove_bodypart_overlay(bodypart_overlay) - if(ownerlimb.owner && external_bodytypes) - ownerlimb.synchronize_bodytypes(ownerlimb.owner) - ownerlimb = null - return ..() - -///Update our features after something changed our appearance -/obj/item/organ/external/proc/mutate_feature(features, mob/living/carbon/human/human) - if(!dna_block) - return - - var/list/feature_list = bodypart_overlay.get_global_feature_list() - - bodypart_overlay.set_appearance_from_name(feature_list[deconstruct_block(get_uni_feature_block(features, dna_block), feature_list.len)]) - -///If you need to change an external_organ for simple one-offs, use this. Pass the accessory type : /datum/accessory/something -/obj/item/organ/external/proc/simple_change_sprite(accessory_type) - var/datum/sprite_accessory/typed_accessory = accessory_type //we only take types for maintainability - - bodypart_overlay.set_appearance(typed_accessory) - - if(owner) //are we in a person? - owner.update_body_parts() - else if(ownerlimb) //are we in a limb? - ownerlimb.update_icon_dropped() - //else if(use_mob_sprite_as_obj_sprite) //are we out in the world, unprotected by flesh? - -/obj/item/organ/external/on_life(seconds_per_tick, times_fired) - return - -/obj/item/organ/external/update_overlays() - . = ..() - - if(!use_mob_sprite_as_obj_sprite) - return - - //Build the mob sprite and use it as our overlay - for(var/external_layer in bodypart_overlay.all_layers) - if(bodypart_overlay.layers & external_layer) - . += bodypart_overlay.get_overlay(external_layer, ownerlimb) - -///The horns of a lizard! -/obj/item/organ/external/horns - name = "horns" - desc = "Why do lizards even have horns? Well, this one obviously doesn't." - icon_state = "horns" - - zone = BODY_ZONE_HEAD - slot = ORGAN_SLOT_EXTERNAL_HORNS - - preference = "feature_lizard_horns" - dna_block = DNA_HORNS_BLOCK - restyle_flags = EXTERNAL_RESTYLE_ENAMEL - - bodypart_overlay = /datum/bodypart_overlay/mutant/horns - -/datum/bodypart_overlay/mutant/horns - layers = EXTERNAL_ADJACENT - feature_key = "horns" - -/datum/bodypart_overlay/mutant/horns/can_draw_on_bodypart(mob/living/carbon/human/human) - if((human.head?.flags_inv & HIDEHAIR) || (human.wear_mask?.flags_inv & HIDEHAIR)) - return FALSE - - return TRUE - -/datum/bodypart_overlay/mutant/horns/get_global_feature_list() - return GLOB.horns_list - -///The frills of a lizard (like weird fin ears) -/obj/item/organ/external/frills - name = "frills" - desc = "Ear-like external organs often seen on aquatic reptillians." - icon_state = "frills" - - zone = BODY_ZONE_HEAD - slot = ORGAN_SLOT_EXTERNAL_FRILLS - - preference = "feature_lizard_frills" - dna_block = DNA_FRILLS_BLOCK - restyle_flags = EXTERNAL_RESTYLE_FLESH - - bodypart_overlay = /datum/bodypart_overlay/mutant/frills - -/datum/bodypart_overlay/mutant/frills - layers = EXTERNAL_ADJACENT - feature_key = "frills" - -/datum/bodypart_overlay/mutant/frills/can_draw_on_bodypart(mob/living/carbon/human/human) - if(!(human.head?.flags_inv & HIDEEARS)) - return TRUE - return FALSE - -/datum/bodypart_overlay/mutant/frills/get_global_feature_list() - return GLOB.frills_list - -///Guess what part of the lizard this is? -/obj/item/organ/external/snout - name = "lizard snout" - desc = "Take a closer look at that snout!" - icon_state = "snout" - - zone = BODY_ZONE_HEAD - slot = ORGAN_SLOT_EXTERNAL_SNOUT - - preference = "feature_lizard_snout" - external_bodytypes = BODYTYPE_SNOUTED - - dna_block = DNA_SNOUT_BLOCK - restyle_flags = EXTERNAL_RESTYLE_FLESH - - bodypart_overlay = /datum/bodypart_overlay/mutant/snout - -/datum/bodypart_overlay/mutant/snout - layers = EXTERNAL_ADJACENT - feature_key = "snout" - -/datum/bodypart_overlay/mutant/snout/can_draw_on_bodypart(mob/living/carbon/human/human) - if(!(human.wear_mask?.flags_inv & HIDESNOUT) && !(human.head?.flags_inv & HIDESNOUT)) - return TRUE - return FALSE - -/datum/bodypart_overlay/mutant/snout/get_global_feature_list() - return GLOB.snouts_list - -///A moth's antennae -/obj/item/organ/external/antennae - name = "moth antennae" - desc = "A moths antennae. What is it telling them? What are they sensing?" - icon_state = "antennae" - - zone = BODY_ZONE_HEAD - slot = ORGAN_SLOT_EXTERNAL_ANTENNAE - - preference = "feature_moth_antennae" - dna_block = DNA_MOTH_ANTENNAE_BLOCK - restyle_flags = EXTERNAL_RESTYLE_FLESH - - bodypart_overlay = /datum/bodypart_overlay/mutant/antennae - - ///Are we burned? - var/burnt = FALSE - ///Store our old datum here for if our antennae are healed - var/original_sprite_datum - -/obj/item/organ/external/antennae/Insert(mob/living/carbon/receiver, special, drop_if_replaced) - . = ..() - if(!.) - return - RegisterSignal(receiver, COMSIG_HUMAN_BURNING, PROC_REF(try_burn_antennae)) - RegisterSignal(receiver, COMSIG_LIVING_POST_FULLY_HEAL, PROC_REF(heal_antennae)) - -/obj/item/organ/external/antennae/Remove(mob/living/carbon/organ_owner, special, moving) - . = ..() - UnregisterSignal(organ_owner, list(COMSIG_HUMAN_BURNING, COMSIG_LIVING_POST_FULLY_HEAL)) - -///check if our antennae can burn off ;_; -/obj/item/organ/external/antennae/proc/try_burn_antennae(mob/living/carbon/human/human) - SIGNAL_HANDLER - - 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 antennae burn to a crisp!")) - - burn_antennae() - human.update_body_parts() - -///Burn our antennae off ;_; -/obj/item/organ/external/antennae/proc/burn_antennae() - var/datum/bodypart_overlay/mutant/antennae/antennae = bodypart_overlay - antennae.burnt = TRUE - burnt = TRUE - -///heal our antennae back up!! -/obj/item/organ/external/antennae/proc/heal_antennae(datum/source, heal_flags) - SIGNAL_HANDLER - - if(!burnt) - return - - if(heal_flags & (HEAL_LIMBS|HEAL_ORGANS)) - var/datum/bodypart_overlay/mutant/antennae/antennae = bodypart_overlay - antennae.burnt = FALSE - burnt = FALSE - -///Moth antennae datum, with full burning functionality -/datum/bodypart_overlay/mutant/antennae - layers = EXTERNAL_FRONT | EXTERNAL_BEHIND - feature_key = "moth_antennae" - ///Accessory datum of the burn sprite - var/datum/sprite_accessory/burn_datum = /datum/sprite_accessory/moth_antennae/burnt_off - ///Are we burned? If so we draw differently - var/burnt = FALSE - -/datum/bodypart_overlay/mutant/antennae/New() - . = ..() - - burn_datum = fetch_sprite_datum(burn_datum) //turn the path into the singleton instance - -/datum/bodypart_overlay/mutant/antennae/get_global_feature_list() - return GLOB.moth_antennae_list - -/datum/bodypart_overlay/mutant/antennae/get_base_icon_state() - return burnt ? burn_datum.icon_state : sprite_datum.icon_state - -///The leafy hair of a podperson -/obj/item/organ/external/pod_hair - name = "podperson hair" - desc = "Base for many-o-salads." - - zone = BODY_ZONE_HEAD - slot = ORGAN_SLOT_EXTERNAL_POD_HAIR - - preference = "feature_pod_hair" - use_mob_sprite_as_obj_sprite = TRUE - - dna_block = DNA_POD_HAIR_BLOCK - restyle_flags = EXTERNAL_RESTYLE_PLANT - - bodypart_overlay = /datum/bodypart_overlay/mutant/pod_hair - -///Podperson bodypart overlay, with special coloring functionality to render the flowers in the inverse color -/datum/bodypart_overlay/mutant/pod_hair - layers = EXTERNAL_FRONT|EXTERNAL_ADJACENT - feature_key = "pod_hair" - - ///This layer will be colored differently than the rest of the organ. So we can get differently colored flowers or something - var/color_swapped_layer = EXTERNAL_FRONT - ///The individual rgb colors are subtracted from this to get the color shifted layer - var/color_inverse_base = 255 - -/datum/bodypart_overlay/mutant/pod_hair/get_global_feature_list() - return GLOB.pod_hair_list - -/datum/bodypart_overlay/mutant/pod_hair/color_image(image/overlay, draw_layer, obj/item/bodypart/limb) - if(draw_layer != bitflag_to_layer(color_swapped_layer)) - return ..() - - if(draw_color) // can someone explain to me why draw_color is allowed to EVER BE AN EMPTY STRING - var/list/rgb_list = rgb2num(draw_color) - overlay.color = rgb(color_inverse_base - rgb_list[1], color_inverse_base - rgb_list[2], color_inverse_base - rgb_list[3]) //inversa da color - else - overlay.color = null - -/datum/bodypart_overlay/mutant/pod_hair/can_draw_on_bodypart(mob/living/carbon/human/human) - if((human.head?.flags_inv & HIDEHAIR) || (human.wear_mask?.flags_inv & HIDEHAIR)) - return FALSE - - return TRUE diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm index fb310b3940bfa..e20f4f700f777 100644 --- a/code/modules/surgery/organs/external/tails.dm +++ b/code/modules/surgery/organs/external/tails.dm @@ -7,11 +7,12 @@ zone = BODY_ZONE_PRECISE_GROIN slot = ORGAN_SLOT_EXTERNAL_TAIL - bodypart_overlay = /datum/bodypart_overlay/mutant/tail - dna_block = DNA_TAIL_BLOCK restyle_flags = EXTERNAL_RESTYLE_FLESH + // defaults to cat, but the parent type shouldn't be created regardless + bodypart_overlay = /datum/bodypart_overlay/mutant/tail/cat + ///Does this tail have a wagging sprite, and is it currently wagging? var/wag_flags = NONE ///The original owner of this tail @@ -34,13 +35,19 @@ /obj/item/organ/external/tail/Remove(mob/living/carbon/organ_owner, special, moving) if(wag_flags & WAG_WAGGING) wag(FALSE) + + return ..() + +/obj/item/organ/external/tail/on_remove(mob/living/carbon/organ_owner, special) . = ..() + UnregisterSignal(organ_owner, COMSIG_ORGAN_WAG_TAIL) if(type in organ_owner.dna.species.external_organs) organ_owner.add_mood_event("tail_lost", /datum/mood_event/tail_lost) organ_owner.add_mood_event("tail_balance_lost", /datum/mood_event/tail_balance_lost) + /obj/item/organ/external/tail/proc/wag(mob/user, start = TRUE, stop_after = 0) if(!(wag_flags & WAG_ABLE)) return @@ -65,18 +72,14 @@ wag_flags &= ~WAG_WAGGING accessory.wagging = FALSE -///Tail parent type (which is MONKEEEEEEEEEEE by default), with wagging functionality +///Tail parent type, with wagging functionality /datum/bodypart_overlay/mutant/tail layers = EXTERNAL_FRONT|EXTERNAL_BEHIND - feature_key = "tail_monkey" var/wagging = FALSE /datum/bodypart_overlay/mutant/tail/get_base_icon_state() return (wagging ? "wagging_" : "") + sprite_datum.icon_state //add the wagging tag if we be wagging -/datum/bodypart_overlay/mutant/tail/get_global_feature_list() - return GLOB.tails_list - /datum/bodypart_overlay/mutant/tail/can_draw_on_bodypart(mob/living/carbon/human/human) if(human.wear_suit && (human.wear_suit.flags_inv & HIDEJUMPSUIT)) return FALSE @@ -106,6 +109,9 @@ color_source = NONE feature_key = "tail_monkey" +/datum/bodypart_overlay/mutant/tail/monkey/get_global_feature_list() + return GLOB.tails_list_monkey + /obj/item/organ/external/tail/lizard name = "lizard tail" desc = "A severed lizard tail. Somewhere, no doubt, a lizard hater is very pleased with themselves." diff --git a/code/modules/surgery/organs/external/wings/functional_wings.dm b/code/modules/surgery/organs/external/wings/functional_wings.dm index 0298cecde4cb4..1313da8826811 100644 --- a/code/modules/surgery/organs/external/wings/functional_wings.dm +++ b/code/modules/surgery/organs/external/wings/functional_wings.dm @@ -102,12 +102,12 @@ if(!HAS_TRAIT_FROM(human, TRAIT_MOVE_FLYING, SPECIES_FLIGHT_TRAIT)) human.physiology.stun_mod *= 2 human.add_traits(list(TRAIT_NO_FLOATING_ANIM, TRAIT_MOVE_FLYING), SPECIES_FLIGHT_TRAIT) - passtable_on(human, SPECIES_TRAIT) + passtable_on(human, SPECIES_FLIGHT_TRAIT) open_wings() else human.physiology.stun_mod *= 0.5 human.remove_traits(list(TRAIT_NO_FLOATING_ANIM, TRAIT_MOVE_FLYING), SPECIES_FLIGHT_TRAIT) - passtable_off(human, SPECIES_TRAIT) + passtable_off(human, SPECIES_FLIGHT_TRAIT) close_wings() human.update_body_parts() @@ -174,6 +174,7 @@ /obj/item/organ/external/wings/functional/robotic name = "robotic wings" desc = "Using microscopic hover-engines, or \"microwings,\" as they're known in the trade, these tiny devices are able to lift a few grams at a time. Gathering enough of them, and you can lift impressively large things." + organ_flags = ORGAN_ROBOTIC sprite_accessory_override = /datum/sprite_accessory/wings/robotic ///skeletal wings, which relate to skeletal races. diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm deleted file mode 100644 index 051f94cbfe9b2..0000000000000 --- a/code/modules/surgery/organs/eyes.dm +++ /dev/null @@ -1,737 +0,0 @@ -/obj/item/organ/internal/eyes - name = BODY_ZONE_PRECISE_EYES - icon_state = "eyes" - desc = "I see you!" - visual = TRUE - zone = BODY_ZONE_PRECISE_EYES - 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 - - low_threshold_passed = "Distant objects become somewhat less tangible." - high_threshold_passed = "Everything starts to look a lot less clear." - now_failing = "Darkness envelopes you, as your eyes go blind!" - now_fixed = "Color and shapes are once again perceivable." - high_threshold_cleared = "Your vision functions passably once more." - low_threshold_cleared = "Your vision is cleared of any ailment." - - /// Sight flags this eye pair imparts on its user. - var/sight_flags = NONE - /// changes how the eyes overlay is applied, makes it apply over the lighting layer - var/overlay_ignore_lighting = FALSE - /// How much innate tint these eyes have - var/tint = 0 - /// How much innare flash protection these eyes have, usually paired with tint - var/flash_protect = FLASH_PROTECTION_NONE - /// What level of invisibility these eyes can see - var/see_invisible = SEE_INVISIBLE_LIVING - /// How much darkness to cut out of your view (basically, night vision) - var/lighting_cutoff = null - /// List of color cutoffs from eyes, or null if not applicable - var/list/color_cutoffs = null - /// Are these eyes immune to pepperspray? - var/pepperspray_protect = FALSE - - var/eye_color_left = "" //set to a hex code to override a mob's left eye color - var/eye_color_right = "" //set to a hex code to override a mob's right eye color - var/eye_icon_state = "eyes" - var/old_eye_color_left = "fff" - var/old_eye_color_right = "fff" - - /// Glasses cannot be worn over these eyes. Currently unused - var/no_glasses = FALSE - /// indication that the eyes are undergoing some negative effect - var/damaged = FALSE - /// Native FOV that will be applied if a config is enabled - var/native_fov = FOV_90_DEGREES - -/obj/item/organ/internal/eyes/Insert(mob/living/carbon/eye_recipient, special = FALSE, drop_if_replaced = FALSE) - . = ..() - if(!.) - return - eye_recipient.cure_blind(NO_EYES) - apply_damaged_eye_effects() - refresh(eye_recipient, inserting = TRUE) - -/// Refreshes the visuals of the eyes -/// If call_update is TRUE, we also will call update_body -/obj/item/organ/internal/eyes/proc/refresh(mob/living/carbon/eye_owner = owner, inserting = FALSE, call_update = TRUE) - owner.update_sight() - owner.update_tint() - - if(!ishuman(eye_owner)) - return - - var/mob/living/carbon/human/affected_human = eye_owner - if(inserting) // we only want to be setting old_eye_color the one time - old_eye_color_left = affected_human.eye_color_left - old_eye_color_right = affected_human.eye_color_right - if(initial(eye_color_left)) - affected_human.eye_color_left = eye_color_left - else - eye_color_left = affected_human.eye_color_left - if(initial(eye_color_right)) - affected_human.eye_color_right = eye_color_right - else - eye_color_right = affected_human.eye_color_right - if(HAS_TRAIT(affected_human, TRAIT_NIGHT_VISION) && !lighting_cutoff) - lighting_cutoff = LIGHTING_CUTOFF_REAL_LOW - if(CONFIG_GET(flag/native_fov) && native_fov) - affected_human.add_fov_trait(type, native_fov) - - if(call_update) - affected_human.dna?.species?.handle_body(affected_human) //updates eye icon - -/obj/item/organ/internal/eyes/Remove(mob/living/carbon/eye_owner, special = FALSE) - . = ..() - if(ishuman(eye_owner)) - var/mob/living/carbon/human/human_owner = eye_owner - if(initial(eye_color_left)) - human_owner.eye_color_left = old_eye_color_left - if(initial(eye_color_right)) - human_owner.eye_color_right = old_eye_color_right - human_owner.update_body() - if(native_fov) - eye_owner.remove_fov_trait(type) - - // Cure blindness from eye damage - eye_owner.cure_blind(EYE_DAMAGE) - eye_owner.cure_nearsighted(EYE_DAMAGE) - // Eye blind and temp blind go to, even if this is a bit of cheesy way to clear blindness - eye_owner.remove_status_effect(/datum/status_effect/eye_blur) - eye_owner.remove_status_effect(/datum/status_effect/temporary_blindness) - // Then become blind anyways (if not special) - if(!special) - eye_owner.become_blind(NO_EYES) - - eye_owner.update_tint() - eye_owner.update_sight() - -#define OFFSET_X 1 -#define OFFSET_Y 2 - -/// This proc generates a list of overlays that the eye should be displayed using for the given parent -/obj/item/organ/internal/eyes/proc/generate_body_overlay(mob/living/carbon/human/parent) - if(!istype(parent) || parent.get_organ_by_type(/obj/item/organ/internal/eyes) != src) - CRASH("Generating a body overlay for [src] targeting an invalid parent '[parent]'.") - - if(isnull(eye_icon_state)) - return list() - - var/mutable_appearance/eye_left = mutable_appearance('icons/mob/species/human/human_face.dmi', "[eye_icon_state]_l", -BODY_LAYER) - var/mutable_appearance/eye_right = mutable_appearance('icons/mob/species/human/human_face.dmi', "[eye_icon_state]_r", -BODY_LAYER) - var/list/overlays = list(eye_left, eye_right) - - if(EYECOLOR in parent.dna?.species.species_traits) - eye_right.color = eye_color_right - eye_left.color = eye_color_left - - var/obscured = parent.check_obscured_slots(TRUE) - if(overlay_ignore_lighting && !(obscured & ITEM_SLOT_EYES)) - eye_left.overlays += emissive_appearance(eye_left.icon, eye_left.icon_state, parent, alpha = eye_left.alpha) - eye_right.overlays += emissive_appearance(eye_right.icon, eye_right.icon_state, parent, alpha = eye_right.alpha) - - var/obj/item/bodypart/head/my_head = parent.get_bodypart(BODY_ZONE_HEAD) - if(my_head?.worn_face_offset) - for(var/mutable_appearance/overlay in overlays) - my_head.worn_face_offset.apply_offset(overlay) - - return overlays - -#undef OFFSET_X -#undef OFFSET_Y - -//Gotta reset the eye color, because that persists -/obj/item/organ/internal/eyes/enter_wardrobe() - . = ..() - eye_color_left = initial(eye_color_left) - eye_color_right = initial(eye_color_right) - -/obj/item/organ/internal/eyes/apply_organ_damage(damage_amount, maximum, required_organtype) - . = ..() - if(!owner) - return - apply_damaged_eye_effects() - -/// Applies effects to our owner based on how damaged our eyes are -/obj/item/organ/internal/eyes/proc/apply_damaged_eye_effects() - // we're in healthy threshold, either try to heal (if damaged) or do nothing - if(damage <= low_threshold) - if(damaged) - damaged = FALSE - // clear nearsightedness from damage - owner.cure_nearsighted(EYE_DAMAGE) - // if we're still nearsighted, reset its severity - // this is kinda icky, ideally we'd track severity to source but that's way more complex - var/datum/status_effect/grouped/nearsighted/nearsightedness = owner.is_nearsighted() - nearsightedness?.set_nearsighted_severity(1) - // and cure blindness from damage - owner.cure_blind(EYE_DAMAGE) - return - - //various degrees of "oh fuck my eyes", from "point a laser at your eye" to "staring at the Sun" intensities - // 50 - blind - // 49-31 - nearsighted (2 severity) - // 30-20 - nearsighted (1 severity) - if(organ_flags & ORGAN_FAILING) - // become blind from damage - owner.become_blind(EYE_DAMAGE) - - else - // become nearsighted from damage - owner.become_nearsighted(EYE_DAMAGE) - // update the severity of our nearsightedness based on our eye damage - var/datum/status_effect/grouped/nearsighted/nearsightedness = owner.is_nearsighted() - nearsightedness.set_nearsighted_severity(damage > high_threshold ? 2 : 1) - - damaged = TRUE - -#define NIGHTVISION_LIGHT_OFF 0 -#define NIGHTVISION_LIGHT_LOW 1 -#define NIGHTVISION_LIGHT_MID 2 -#define NIGHTVISION_LIGHT_HIG 3 - -/obj/item/organ/internal/eyes/night_vision - actions_types = list(/datum/action/item_action/organ_action/use) - - // These lists are used as the color cutoff for the eye - // They need to be filled out for subtypes - var/list/low_light_cutoff - var/list/medium_light_cutoff - var/list/high_light_cutoff - var/light_level = NIGHTVISION_LIGHT_OFF - -/obj/item/organ/internal/eyes/night_vision/Initialize(mapload) - . = ..() - if (PERFORM_ALL_TESTS(focus_only/nightvision_color_cutoffs) && type != /obj/item/organ/internal/eyes/night_vision) - if(length(low_light_cutoff) != 3 || length(medium_light_cutoff) != 3 || length(high_light_cutoff) != 3) - stack_trace("[type] did not have fully filled out color cutoff lists") - if(low_light_cutoff) - color_cutoffs = low_light_cutoff.Copy() - light_level = NIGHTVISION_LIGHT_LOW - -/obj/item/organ/internal/eyes/night_vision/ui_action_click() - sight_flags = initial(sight_flags) - switch(light_level) - if (NIGHTVISION_LIGHT_OFF) - color_cutoffs = low_light_cutoff.Copy() - light_level = NIGHTVISION_LIGHT_LOW - if (NIGHTVISION_LIGHT_LOW) - color_cutoffs = medium_light_cutoff.Copy() - light_level = NIGHTVISION_LIGHT_MID - if (NIGHTVISION_LIGHT_MID) - color_cutoffs = high_light_cutoff.Copy() - light_level = NIGHTVISION_LIGHT_HIG - else - color_cutoffs = null - light_level = NIGHTVISION_LIGHT_OFF - owner.update_sight() - -#undef NIGHTVISION_LIGHT_OFF -#undef NIGHTVISION_LIGHT_LOW -#undef NIGHTVISION_LIGHT_MID -#undef NIGHTVISION_LIGHT_HIG - -/obj/item/organ/internal/eyes/night_vision/mushroom - name = "fung-eye" - desc = "While on the outside they look inert and dead, the eyes of mushroom people are actually very advanced." - low_light_cutoff = list(0, 15, 20) - medium_light_cutoff = list(0, 20, 35) - high_light_cutoff = list(0, 40, 50) - -/obj/item/organ/internal/eyes/zombie - name = "undead eyes" - desc = "Somewhat counterintuitively, these half-rotten eyes actually have superior vision to those of a living human." - color_cutoffs = list(25, 35, 5) - -/obj/item/organ/internal/eyes/alien - name = "alien eyes" - desc = "It turned out they had them after all!" - sight_flags = SEE_MOBS - color_cutoffs = list(25, 5, 42) - -/obj/item/organ/internal/eyes/golem - name = "resonating crystal" - icon_state = "adamantine_cords" - eye_icon_state = null - desc = "Golems somehow measure external light levels and detect nearby ore using this sensitive mineral lattice." - color = COLOR_GOLEM_GRAY - visual = FALSE - status = ORGAN_MINERAL - color_cutoffs = list(10, 15, 5) - actions_types = list(/datum/action/cooldown/golem_ore_sight) - -/// Send an ore detection pulse on a cooldown -/datum/action/cooldown/golem_ore_sight - name = "Ore Resonance" - desc = "Causes nearby ores to vibrate, revealing their location." - button_icon = 'icons/obj/device.dmi' - button_icon_state = "manual_mining" - check_flags = AB_CHECK_CONSCIOUS - cooldown_time = 10 SECONDS - -/datum/action/cooldown/golem_ore_sight/Activate(atom/target) - . = ..() - mineral_scan_pulse(get_turf(target)) - -///Robotic - -/obj/item/organ/internal/eyes/robotic - name = "robotic eyes" - icon_state = "cybernetic_eyeballs" - desc = "Your vision is augmented." - status = ORGAN_ROBOTIC - organ_flags = ORGAN_SYNTHETIC - -/obj/item/organ/internal/eyes/robotic/emp_act(severity) - . = ..() - if(!owner || . & EMP_PROTECT_SELF) - return - if(prob(10 * severity)) - return - to_chat(owner, span_warning("Static obfuscates your vision!")) - owner.flash_act(visual = 1) - -/obj/item/organ/internal/eyes/robotic/basic - name = "basic robotic eyes" - desc = "A pair of basic cybernetic eyes that restore vision, but at some vulnerability to light." - eye_color_left = "5500ff" - eye_color_right = "5500ff" - flash_protect = FLASH_PROTECTION_SENSITIVE - -/obj/item/organ/internal/eyes/robotic/basic/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - if(prob(10 * severity)) - apply_organ_damage(20 * severity) - to_chat(owner, span_warning("Your eyes start to fizzle in their sockets!")) - do_sparks(2, TRUE, owner) - owner.emote("scream") - -/obj/item/organ/internal/eyes/robotic/xray - name = "\improper X-ray eyes" - desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." - eye_color_left = "000" - eye_color_right = "000" - sight_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS - -/obj/item/organ/internal/eyes/robotic/xray/on_insert(mob/living/carbon/eye_owner) - . = ..() - ADD_TRAIT(eye_owner, TRAIT_XRAY_VISION, ORGAN_TRAIT) - -/obj/item/organ/internal/eyes/robotic/xray/on_remove(mob/living/carbon/eye_owner) - . = ..() - REMOVE_TRAIT(eye_owner, TRAIT_XRAY_VISION, ORGAN_TRAIT) - -/obj/item/organ/internal/eyes/robotic/thermals - name = "thermal eyes" - desc = "These cybernetic eye implants will give you thermal vision. Vertical slit pupil included." - eye_color_left = "FC0" - eye_color_right = "FC0" - // We're gonna downshift green and blue a bit so darkness looks yellow - color_cutoffs = list(25, 8, 5) - sight_flags = SEE_MOBS - flash_protect = FLASH_PROTECTION_SENSITIVE - -/obj/item/organ/internal/eyes/robotic/flashlight - name = "flashlight eyes" - desc = "It's two flashlights rigged together with some wire. Why would you put these in someone's head?" - eye_color_left ="fee5a3" - eye_color_right ="fee5a3" - icon = 'icons/obj/lighting.dmi' - icon_state = "flashlight_eyes" - flash_protect = FLASH_PROTECTION_WELDER - tint = INFINITY - var/obj/item/flashlight/eyelight/eye - -/obj/item/organ/internal/eyes/robotic/flashlight/emp_act(severity) - return - -/obj/item/organ/internal/eyes/robotic/flashlight/on_insert(mob/living/carbon/victim) - . = ..() - if(!eye) - eye = new /obj/item/flashlight/eyelight() - eye.on = TRUE - eye.forceMove(victim) - eye.update_brightness(victim) - victim.become_blind(FLASHLIGHT_EYES) - -/obj/item/organ/internal/eyes/robotic/flashlight/on_remove(mob/living/carbon/victim) - . = ..() - eye.on = FALSE - eye.update_brightness(victim) - eye.forceMove(src) - victim.cure_blind(FLASHLIGHT_EYES) - -// Welding shield implant -/obj/item/organ/internal/eyes/robotic/shield - name = "shielded robotic eyes" - desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision." - flash_protect = FLASH_PROTECTION_WELDER - -/obj/item/organ/internal/eyes/robotic/shield/emp_act(severity) - return - -#define MATCH_LIGHT_COLOR 1 -#define USE_CUSTOM_COLOR 0 -#define UPDATE_LIGHT 0 -#define UPDATE_EYES_LEFT 1 -#define UPDATE_EYES_RIGHT 2 - -/obj/item/organ/internal/eyes/robotic/glow - name = "High Luminosity Eyes" - desc = "Special glowing eyes, used by snowflakes who want to be special." - eye_color_left = "000" - eye_color_right = "000" - actions_types = list(/datum/action/item_action/organ_action/use, /datum/action/item_action/organ_action/toggle) - var/max_light_beam_distance = 5 - var/obj/item/flashlight/eyelight/glow/eye - /// The overlay that is used when both eyes are set to match the light color - var/mutable_appearance/eyes_overlay - /// The overlay that is used when custom color selection is enabled, for the left eye - var/mutable_appearance/eyes_overlay_left - /// The overlay that is used when custom color selection is enabled, for the right eye - var/mutable_appearance/eyes_overlay_right - /// Whether or not to match the eye color to the light or use a custom selection - var/eye_color_mode = MATCH_LIGHT_COLOR - /// The selected color for the light beam itself - var/current_color_string = "#ffffff" - /// The custom selected eye color for the left eye. Defaults to the mob's natural eye color - var/current_left_color_string - /// The custom selected eye color for the right eye. Defaults to the mob's natural eye color - var/current_right_color_string - -/obj/item/organ/internal/eyes/robotic/glow/Initialize(mapload) - . = ..() - eye = new /obj/item/flashlight/eyelight/glow - -/obj/item/organ/internal/eyes/robotic/glow/Destroy() - . = ..() - deactivate(close_ui = TRUE) - QDEL_NULL(eye) - -/obj/item/organ/internal/eyes/robotic/glow/emp_act() - . = ..() - if(!eye.on || . & EMP_PROTECT_SELF) - return - deactivate(close_ui = TRUE) - -/// We have to do this here because on_insert gets called before refresh(), which we need to have been called for old_eye_color vars to be set -/obj/item/organ/internal/eyes/robotic/glow/Insert(mob/living/carbon/eye_recipient, special = FALSE, drop_if_replaced = FALSE) - . = ..() - current_left_color_string = old_eye_color_left - current_right_color_string = old_eye_color_right - -/obj/item/organ/internal/eyes/robotic/glow/on_insert(mob/living/carbon/eye_recipient) - . = ..() - deactivate(close_ui = TRUE) - eye.forceMove(eye_recipient) - -/obj/item/organ/internal/eyes/robotic/glow/on_remove(mob/living/carbon/eye_owner) - deactivate(eye_owner, close_ui = TRUE) - QDEL_NULL(eyes_overlay) - QDEL_NULL(eyes_overlay_left) - QDEL_NULL(eyes_overlay_right) - eye.forceMove(src) - return ..() - -/obj/item/organ/internal/eyes/robotic/glow/ui_state(mob/user) - return GLOB.default_state - -/obj/item/organ/internal/eyes/robotic/glow/ui_status(mob/user) - if(!QDELETED(owner)) - if(owner == user) - return min( - ui_status_user_is_abled(user, src), - ui_status_only_living(user), - ) - else return UI_CLOSE - return ..() - -/obj/item/organ/internal/eyes/robotic/glow/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "HighLuminosityEyesMenu") - ui.autoupdate = FALSE - ui.open() - -/obj/item/organ/internal/eyes/robotic/glow/ui_data(mob/user) - var/list/data = list() - - data["eyeColor"] = list( - mode = eye_color_mode, - hasOwner = owner ? TRUE : FALSE, - left = current_left_color_string, - right = current_right_color_string, - ) - data["lightColor"] = current_color_string - data["range"] = eye.light_range - - return data - -/obj/item/organ/internal/eyes/robotic/glow/ui_act(action, list/params, datum/tgui/ui) - . = ..() - if(.) - return - - switch(action) - if("set_range") - var/new_range = params["new_range"] - set_beam_range(new_range) - return TRUE - if("pick_color") - var/new_color = input( - usr, - "Choose eye color color:", - "High Luminosity Eyes Menu", - current_color_string - ) as color|null - if(new_color) - var/to_update = params["to_update"] - set_beam_color(new_color, to_update) - return TRUE - if("enter_color") - var/new_color = lowertext(params["new_color"]) - var/to_update = params["to_update"] - set_beam_color(new_color, to_update, sanitize = TRUE) - return TRUE - if("random_color") - var/to_update = params["to_update"] - randomize_color(to_update) - return TRUE - if("toggle_eye_color") - toggle_eye_color_mode() - return TRUE - -/obj/item/organ/internal/eyes/robotic/glow/ui_action_click(mob/user, action) - if(istype(action, /datum/action/item_action/organ_action/toggle)) - toggle_active() - else if(istype(action, /datum/action/item_action/organ_action/use)) - ui_interact(user) - -/** - * Activates the light - * - * Turns on the attached flashlight object, updates the mob overlay to be added. - */ -/obj/item/organ/internal/eyes/robotic/glow/proc/activate() - eye.on = TRUE - if(eye.light_range) // at range 0 we are just going to make the eyes glow emissively, no light overlay - eye.set_light_on(TRUE) - update_mob_eyes_overlay() - -/** - * Deactivates the light - * - * Turns off the attached flashlight object, closes UIs, updates the mob overlay to be removed. - * Arguments: - * * mob/living/carbon/eye_owner - the mob who the eyes belong to, for passing to update_mob_eyes_overlay - * * close_ui - whether or not to close the ui - */ -/obj/item/organ/internal/eyes/robotic/glow/proc/deactivate(mob/living/carbon/eye_owner = owner, close_ui = FALSE) - if(close_ui) - SStgui.close_uis(src) - eye.on = FALSE - eye.set_light_on(FALSE) - update_mob_eyes_overlay(eye_owner) - -/** - * Randomizes the light color - * - * Picks a random color and sets the beam color to that - * Arguments: - * * to_update - whether we are setting the color for the light beam itself, or the individual eyes - */ -/obj/item/organ/internal/eyes/robotic/glow/proc/randomize_color(to_update = UPDATE_LIGHT) - var/new_color = "#" - for(var/i in 1 to 3) - new_color += num2hex(rand(0, 255), 2) - set_beam_color(new_color, to_update) - -/** - * Setter function for the light's range - * - * Sets the light range of the attached flashlight object - * Includes some 'unique' logic to accomodate for some quirks of the lighting system - * Arguments: - * * new_range - the new range to set - */ -/obj/item/organ/internal/eyes/robotic/glow/proc/set_beam_range(new_range) - var/old_light_range = eye.light_range - if(old_light_range == 0 && new_range > 0 && eye.on) // turn bring back the light overlay if we were previously at 0 (aka emissive eyes only) - eye.light_on = FALSE // this is stupid, but this has to be FALSE for set_light_on() to work. - eye.set_light_on(TRUE) - eye.set_light_range(clamp(new_range, 0, max_light_beam_distance)) - -/** - * Setter function for the light's color - * - * Sets the light color of the attached flashlight object. Sets the eye color vars of this eye organ as well and then updates the mob's eye color. - * Arguments: - * * newcolor - the new color hex string to set - * * to_update - whether we are setting the color for the light beam itself, or the individual eyes - * * sanitize - whether the hex string should be sanitized - */ -/obj/item/organ/internal/eyes/robotic/glow/proc/set_beam_color(newcolor, to_update = UPDATE_LIGHT, sanitize = FALSE) - var/newcolor_string - if(sanitize) - newcolor_string = sanitize_hexcolor(newcolor) - else - newcolor_string = newcolor - switch(to_update) - if(UPDATE_LIGHT) - current_color_string = newcolor_string - eye.set_light_color(newcolor_string) - if(UPDATE_EYES_LEFT) - current_left_color_string = newcolor_string - if(UPDATE_EYES_RIGHT) - current_right_color_string = newcolor_string - - update_mob_eye_color() - -/** - * Toggle the attached flashlight object on or off - */ -/obj/item/organ/internal/eyes/robotic/glow/proc/toggle_active() - if(eye.on) - deactivate() - else - activate() - -/** - * Toggles for the eye color mode - * - * Toggles the eye color mode on or off and then calls an update on the mob's eye color - */ -/obj/item/organ/internal/eyes/robotic/glow/proc/toggle_eye_color_mode() - eye_color_mode = !eye_color_mode - update_mob_eye_color() - -/** - * Updates the mob eye color - * - * Updates the eye color to reflect on the mob's body if it's possible to do so - * Arguments: - * * mob/living/carbon/eye_owner - the mob to update the eye color appearance of - */ -/obj/item/organ/internal/eyes/robotic/glow/proc/update_mob_eye_color(mob/living/carbon/eye_owner = owner) - switch(eye_color_mode) - if(MATCH_LIGHT_COLOR) - eye_color_left = current_color_string - eye_color_right = current_color_string - if(USE_CUSTOM_COLOR) - eye_color_left = current_left_color_string - eye_color_right = current_right_color_string - - if(QDELETED(eye_owner) || !ishuman(eye_owner)) //Other carbon mobs don't have eye color. - return - - eye_owner.dna.species.handle_body(eye_owner) - update_mob_eyes_overlay() - -/** - * Updates the emissive mob eye overlay - * - * When the light is on, the overlay(s) are added. When it is disabled, they are cut. - * Adds one or two overlays depending on what the eye_color_mode toggle is set to. - * Arguments: - * * mob/living/carbon/eye_owner - the mob to add the overlay to - */ -/obj/item/organ/internal/eyes/robotic/glow/proc/update_mob_eyes_overlay(mob/living/carbon/eye_owner = owner) - if(QDELETED(eye_owner)) - return - - if(!ishuman(eye_owner)) - return - - eye_owner.cut_overlay(eyes_overlay) - eye_owner.cut_overlay(eyes_overlay_left) - eye_owner.cut_overlay(eyes_overlay_right) - - if(!eye.on) - return - - switch(eye_color_mode) - if(MATCH_LIGHT_COLOR) - eyes_overlay = emissive_appearance('icons/mob/species/human/human_face.dmi', "eyes_glow_gs", eye_owner, layer = -BODY_LAYER, alpha = owner.alpha) - eyes_overlay.color = current_color_string - eye_owner.add_overlay(eyes_overlay) - if(USE_CUSTOM_COLOR) - eyes_overlay_left = emissive_appearance('icons/mob/species/human/human_face.dmi', "eyes_glow_gs_left", eye_owner, layer = -BODY_LAYER, alpha = owner.alpha) - eyes_overlay_right = emissive_appearance('icons/mob/species/human/human_face.dmi', "eyes_glow_gs_right", eye_owner, layer = -BODY_LAYER, alpha = owner.alpha) - eyes_overlay_left.color = eye_color_left - eyes_overlay_right.color = eye_color_right - eye_owner.add_overlay(eyes_overlay_left) - eye_owner.add_overlay(eyes_overlay_right) - -#undef MATCH_LIGHT_COLOR -#undef USE_CUSTOM_COLOR -#undef UPDATE_LIGHT -#undef UPDATE_EYES_LEFT -#undef UPDATE_EYES_RIGHT - -/obj/item/organ/internal/eyes/moth - name = "moth eyes" - desc = "These eyes seem to have increased sensitivity to bright light, with no improvement to low light vision." - eye_icon_state = "motheyes" - icon_state = "eyeballs-moth" - flash_protect = FLASH_PROTECTION_SENSITIVE - -/obj/item/organ/internal/eyes/snail - name = "snail eyes" - desc = "These eyes seem to have a large range, but might be cumbersome with glasses." - eye_icon_state = "snail_eyes" - icon_state = "snail_eyeballs" - -/obj/item/organ/internal/eyes/jelly - name = "jelly eyes" - desc = "These eyes are made of a soft jelly. Unlike all other eyes, though, there are three of them." - eye_icon_state = "jelleyes" - icon_state = "eyeballs-jelly" - -/obj/item/organ/internal/eyes/night_vision/maintenance_adapted - name = "adapted eyes" - desc = "These red eyes look like two foggy marbles. They give off a particularly worrying glow in the dark." - flash_protect = FLASH_PROTECTION_HYPER_SENSITIVE - eye_color_left = "f00" - eye_color_right = "f00" - icon_state = "adapted_eyes" - eye_icon_state = "eyes_glow" - overlay_ignore_lighting = TRUE - low_light_cutoff = list(5, 12, 20) - medium_light_cutoff = list(15, 20, 30) - high_light_cutoff = list(30, 35, 50) - var/obj/item/flashlight/eyelight/adapted/adapt_light - -/obj/item/organ/internal/eyes/night_vision/maintenance_adapted/on_insert(mob/living/carbon/eye_owner) - . = ..() - //add lighting - if(!adapt_light) - adapt_light = new /obj/item/flashlight/eyelight/adapted() - adapt_light.on = TRUE - adapt_light.forceMove(eye_owner) - adapt_light.update_brightness(eye_owner) - ADD_TRAIT(eye_owner, TRAIT_UNNATURAL_RED_GLOWY_EYES, ORGAN_TRAIT) - -/obj/item/organ/internal/eyes/night_vision/maintenance_adapted/on_life(seconds_per_tick, times_fired) - if(!owner.is_blind() && isturf(owner.loc) && owner.has_light_nearby(light_amount=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!")) - apply_organ_damage(10) //blind quickly - playsound(owner, 'sound/machines/grill/grillsizzle.ogg', 50) - else - apply_organ_damage(-10) //heal quickly - . = ..() - -/obj/item/organ/internal/eyes/night_vision/maintenance_adapted/Remove(mob/living/carbon/unadapted, special = FALSE) - //remove lighting - adapt_light.on = FALSE - adapt_light.update_brightness(unadapted) - adapt_light.forceMove(src) - REMOVE_TRAIT(unadapted, TRAIT_UNNATURAL_RED_GLOWY_EYES, ORGAN_TRAIT) - return ..() diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm deleted file mode 100644 index 9e80dc060a59f..0000000000000 --- a/code/modules/surgery/organs/heart.dm +++ /dev/null @@ -1,522 +0,0 @@ -/obj/item/organ/internal/heart - name = "heart" - desc = "I feel bad for the heartless bastard who lost this." - icon_state = "heart-on" - base_icon_state = "heart" - visual = FALSE - 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 - - 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 - -/obj/item/organ/internal/heart/update_icon_state() - icon_state = "[base_icon_state]-[beating ? "on" : "off"]" - return ..() - -/obj/item/organ/internal/heart/Remove(mob/living/carbon/heartless, special = 0) - . = ..() - if(!special) - addtimer(CALLBACK(src, PROC_REF(stop_if_unowned)), 120) - -/obj/item/organ/internal/heart/proc/stop_if_unowned() - if(!owner) - Stop() - -/obj/item/organ/internal/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/internal/heart/proc/Stop() - beating = FALSE - update_appearance() - return TRUE - -/obj/item/organ/internal/heart/proc/Restart() - beating = TRUE - update_appearance() - return TRUE - -/obj/item/organ/internal/heart/OnEatFrom(eater, feeder) - . = ..() - beating = FALSE - update_appearance() - -/obj/item/organ/internal/heart/on_life(seconds_per_tick, times_fired) - ..() - - // If the owner doesn't need a heart, we don't need to do anything with it. - if(!owner.needs_heart()) - 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 == CONSCIOUS) - 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/internal/heart/get_availability(datum/species/owner_species, mob/living/owner_mob) - return owner_species.mutantheart - -/obj/item/organ/internal/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 - /// How long between needed pumps; you can pump one second early - var/pump_delay = 3 SECONDS - /// How much blood volume you lose every missed pump, this is a flat amount not a percentage! - var/blood_loss = (BLOOD_VOLUME_NORMAL / 5) // 20% of normal volume, missing five pumps is instant death - - //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/internal/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 ..() - -/// Worker proc that checks logic for if a pump can happen, and applies effects/notifications from doing so -/obj/item/organ/internal/heart/cursed/proc/on_pump(mob/owner) - var/next_pump = last_pump + pump_delay - (1 SECONDS) // pump a second early - if(world.time < next_pump) - to_chat(owner, span_userdanger("Too soon!")) - return - - last_pump = world.time - playsound(owner,'sound/effects/singlebeat.ogg', 40, TRUE) - to_chat(owner, span_notice("Your heart beats.")) - - if(!ishuman(owner)) - return - var/mob/living/carbon/human/accursed = owner - - if(HAS_TRAIT(accursed, TRAIT_NOBLOOD) || !accursed.dna) - return - accursed.blood_volume = min(accursed.blood_volume + (blood_loss * 0.5), BLOOD_VOLUME_MAXIMUM) - accursed.remove_client_colour(/datum/client_colour/cursed_heart_blood) - add_colour = TRUE - accursed.adjustBruteLoss(-heal_brute) - accursed.adjustFireLoss(-heal_burn) - accursed.adjustOxyLoss(-heal_oxy) - -/obj/item/organ/internal/heart/cursed/on_life(seconds_per_tick, times_fired) - if(!owner.client || !ishuman(owner)) // Let's be fair, if you're not here to pump, you're not here to suffer. - last_pump = world.time - return - - if(world.time <= (last_pump + pump_delay)) - return - - var/mob/living/carbon/human/accursed = owner - if(HAS_TRAIT(accursed, TRAIT_NOBLOOD) || !accursed.dna) - return - - accursed.blood_volume = max(accursed.blood_volume - blood_loss, 0) - to_chat(accursed, span_userdanger("You have to keep pumping your blood!")) - if(add_colour) - accursed.add_client_colour(/datum/client_colour/cursed_heart_blood) //bloody screen so real - add_colour = FALSE - -/obj/item/organ/internal/heart/cursed/on_insert(mob/living/carbon/accursed) - . = ..() - last_pump = world.time // give them time to react - to_chat(accursed, span_userdanger("Your heart has been replaced with a cursed one, you have to pump this one manually otherwise you'll die!")) - -/obj/item/organ/internal/heart/cursed/Remove(mob/living/carbon/accursed, special = FALSE) - . = ..() - accursed.remove_client_colour(/datum/client_colour/cursed_heart_blood) - -/datum/action/item_action/organ_action/cursed_heart - name = "Pump your blood" - check_flags = NONE - -//You are now brea- pumping blood manually -/datum/action/item_action/organ_action/cursed_heart/Trigger(trigger_flags) - . = ..() - if(!.) - return - - var/obj/item/organ/internal/heart/cursed/cursed_heart = target - if(!istype(cursed_heart)) - CRASH("Cursed heart pump action created on non-cursed heart!") - cursed_heart.on_pump(owner) - -/datum/client_colour/cursed_heart_blood - priority = 100 //it's an indicator you're dying, so it's very high priority - colour = "red" - -/obj/item/organ/internal/heart/cybernetic - name = "basic cybernetic heart" - desc = "A basic electronic device designed to mimic the functions of an organic human heart." - icon_state = "heart-c-on" - base_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 - var/ramount = 10 - var/emp_vulnerability = 80 //Chance of permanent effects if emp-ed. - -/obj/item/organ/internal/heart/cybernetic/tier2 - 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-on" - base_icon_state = "heart-c-u" - maxHealth = 1.5 * STANDARD_ORGAN_THRESHOLD - dose_available = TRUE - emp_vulnerability = 40 - -/obj/item/organ/internal/heart/cybernetic/tier3 - 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-on" - base_icon_state = "heart-c-u2" - maxHealth = 2 * STANDARD_ORGAN_THRESHOLD - dose_available = TRUE - emp_vulnerability = 20 - -/obj/item/organ/internal/heart/cybernetic/emp_act(severity) - . = ..() - - // If the owner doesn't need a heart, we don't need to do anything with it. - if(!owner.needs_heart()) - return - - if(. & EMP_PROTECT_SELF) - return - if(!COOLDOWN_FINISHED(src, severe_cooldown)) //So we cant just spam emp to kill people. - owner.set_dizzy_if_lower(20 SECONDS) - owner.losebreath += 10 - COOLDOWN_START(src, severe_cooldown, 20 SECONDS) - if(prob(emp_vulnerability/severity)) //Chance of permanent effects - organ_flags |= ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon. - Stop() - 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!")) - addtimer(CALLBACK(src, PROC_REF(Restart)), 10 SECONDS) - -/obj/item/organ/internal/heart/cybernetic/on_life(seconds_per_tick, times_fired) - . = ..() - if(dose_available && owner.health <= owner.crit_threshold && !owner.reagents.has_reagent(rid)) - used_dose() - -/obj/item/organ/internal/heart/cybernetic/proc/used_dose() - owner.reagents.add_reagent(rid, ramount) - dose_available = FALSE - -/obj/item/organ/internal/heart/cybernetic/tier3/used_dose() - . = ..() - addtimer(VARSET_CALLBACK(src, dose_available, TRUE), 5 MINUTES) - -/obj/item/organ/internal/heart/freedom - name = "heart of freedom" - desc = "This heart pumps with the passion to give... something freedom." - organ_flags = ORGAN_SYNTHETIC //the power of freedom prevents heart attacks - /// The cooldown until the next time this heart can give the host an adrenaline boost. - COOLDOWN_DECLARE(adrenaline_cooldown) - -/obj/item/organ/internal/heart/freedom/on_life(seconds_per_tick, times_fired) - . = ..() - if(owner.health < 5 && COOLDOWN_FINISHED(src, adrenaline_cooldown)) - 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(brute = 15, burn = 15, required_bodytype = BODYTYPE_ORGANIC) - if(owner.reagents.get_reagent_amount(/datum/reagent/medicine/ephedrine) < 20) - owner.reagents.add_reagent(/datum/reagent/medicine/ephedrine, 10) - -/obj/item/organ/internal/heart/ethereal - name = "crystal core" - icon_state = "ethereal_heart" //Welp. At least it's more unique in functionaliy. - visual = TRUE //This is used by the ethereal species for color - desc = "A crystal-like organ that functions similarly to a heart for Ethereals. It can revive its owner." - - ///Cooldown for the next time we can crystalize - COOLDOWN_DECLARE(crystalize_cooldown) - ///Timer ID for when we will be crystalized, If not preparing this will be null. - var/crystalize_timer_id - ///The current crystal the ethereal is in, if any - var/obj/structure/ethereal_crystal/current_crystal - ///Damage taken during crystalization, resets after it ends - var/crystalization_process_damage = 0 - ///Color of the heart, is set by the species on gain - var/ethereal_color = "#9c3030" - -/obj/item/organ/internal/heart/ethereal/Initialize(mapload) - . = ..() - add_atom_colour(ethereal_color, FIXED_COLOUR_PRIORITY) - -/obj/item/organ/internal/heart/ethereal/Insert(mob/living/carbon/heart_owner, special = FALSE, drop_if_replaced = TRUE) - . = ..() - if(!.) - return - RegisterSignal(heart_owner, COMSIG_MOB_STATCHANGE, PROC_REF(on_stat_change)) - RegisterSignal(heart_owner, COMSIG_LIVING_POST_FULLY_HEAL, PROC_REF(on_owner_fully_heal)) - RegisterSignal(heart_owner, COMSIG_QDELETING, PROC_REF(owner_deleted)) - -/obj/item/organ/internal/heart/ethereal/Remove(mob/living/carbon/heart_owner, special = FALSE) - UnregisterSignal(heart_owner, list(COMSIG_MOB_STATCHANGE, COMSIG_LIVING_POST_FULLY_HEAL, COMSIG_QDELETING)) - REMOVE_TRAIT(heart_owner, TRAIT_CORPSELOCKED, SPECIES_TRAIT) - stop_crystalization_process(heart_owner) - QDEL_NULL(current_crystal) - return ..() - -/obj/item/organ/internal/heart/ethereal/update_overlays() - . = ..() - var/mutable_appearance/shine = mutable_appearance(icon, icon_state = "[icon_state]_shine") - shine.appearance_flags = RESET_COLOR //No color on this, just pure white - . += shine - - -/obj/item/organ/internal/heart/ethereal/proc/on_owner_fully_heal(mob/living/carbon/healed, heal_flags) - SIGNAL_HANDLER - - QDEL_NULL(current_crystal) //Kicks out the ethereal - -///Ran when examined while crystalizing, gives info about the amount of time left -/obj/item/organ/internal/heart/ethereal/proc/on_examine(mob/living/carbon/human/examined_human, mob/user, list/examine_list) - SIGNAL_HANDLER - - if(!crystalize_timer_id) - return - - switch(timeleft(crystalize_timer_id)) - if(0 to CRYSTALIZE_STAGE_ENGULFING) - examine_list += span_warning("Crystals are almost engulfing [examined_human]! ") - if(CRYSTALIZE_STAGE_ENGULFING to CRYSTALIZE_STAGE_ENCROACHING) - examine_list += span_notice("Crystals are starting to cover [examined_human]. ") - if(CRYSTALIZE_STAGE_SMALL to INFINITY) - examine_list += span_notice("Some crystals are coming out of [examined_human]. ") - -///On stat changes, if the victim is no longer dead but they're crystalizing, cancel it, if they become dead, start the crystalizing process if possible -/obj/item/organ/internal/heart/ethereal/proc/on_stat_change(mob/living/victim, new_stat) - SIGNAL_HANDLER - - if(new_stat != DEAD) - if(crystalize_timer_id) - stop_crystalization_process(victim) - return - - - if(QDELETED(victim) || HAS_TRAIT(victim, TRAIT_SUICIDED)) - return //lol rip - - if(!COOLDOWN_FINISHED(src, crystalize_cooldown)) - return //lol double rip - - if(HAS_TRAIT(victim, TRAIT_CANNOT_CRYSTALIZE)) - return // no reviving during mafia, or other inconvenient times. - - to_chat(victim, span_nicegreen("Crystals start forming around your dead body.")) - victim.visible_message(span_notice("Crystals start forming around [victim]."), ignored_mobs = victim) - - ADD_TRAIT(victim, TRAIT_CORPSELOCKED, SPECIES_TRAIT) - - crystalize_timer_id = addtimer(CALLBACK(src, PROC_REF(crystalize), victim), CRYSTALIZE_PRE_WAIT_TIME, TIMER_STOPPABLE) - - RegisterSignal(victim, COMSIG_HUMAN_DISARM_HIT, PROC_REF(reset_crystalizing)) - RegisterSignal(victim, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine), override = TRUE) - RegisterSignal(victim, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_take_damage)) - -///Ran when disarmed, prevents the ethereal from reviving -/obj/item/organ/internal/heart/ethereal/proc/reset_crystalizing(mob/living/defender, mob/living/attacker, zone) - SIGNAL_HANDLER - defender.visible_message( - span_notice("The crystals on [defender] are gently broken off."), - span_notice("The crystals on your corpse are gently broken off, and will need some time to recover."), - ) - deltimer(crystalize_timer_id) - crystalize_timer_id = addtimer(CALLBACK(src, PROC_REF(crystalize), defender), CRYSTALIZE_DISARM_WAIT_TIME, TIMER_STOPPABLE) //Lets us restart the timer on disarm - - -///Actually spawns the crystal which puts the ethereal in it. -/obj/item/organ/internal/heart/ethereal/proc/crystalize(mob/living/ethereal) - - var/location = ethereal.loc - - if(!COOLDOWN_FINISHED(src, crystalize_cooldown) || ethereal.stat != DEAD) - return //Should probably not happen, but lets be safe. - - if(ismob(location) || isitem(location) || HAS_TRAIT_FROM(src, TRAIT_HUSK, CHANGELING_DRAIN)) //Stops crystallization if they are eaten by a dragon, turned into a legion, consumed by his grace, etc. - to_chat(ethereal, span_warning("You were unable to finish your crystallization, for obvious reasons.")) - stop_crystalization_process(ethereal, FALSE) - return - COOLDOWN_START(src, crystalize_cooldown, INFINITY) //Prevent cheeky double-healing until we get out, this is against stupid admemery - current_crystal = new(get_turf(ethereal), src) - stop_crystalization_process(ethereal, TRUE) - -///Stop the crystalization process, unregistering any signals and resetting any variables. -/obj/item/organ/internal/heart/ethereal/proc/stop_crystalization_process(mob/living/ethereal, succesful = FALSE) - UnregisterSignal(ethereal, COMSIG_HUMAN_DISARM_HIT) - UnregisterSignal(ethereal, COMSIG_ATOM_EXAMINE) - UnregisterSignal(ethereal, COMSIG_MOB_APPLY_DAMAGE) - - crystalization_process_damage = 0 //Reset damage taken during crystalization - - if(!succesful) - REMOVE_TRAIT(ethereal, TRAIT_CORPSELOCKED, SPECIES_TRAIT) - QDEL_NULL(current_crystal) - - if(crystalize_timer_id) - deltimer(crystalize_timer_id) - crystalize_timer_id = null - -/obj/item/organ/internal/heart/ethereal/proc/owner_deleted(datum/source) - SIGNAL_HANDLER - - stop_crystalization_process(owner) - return - -///Lets you stop the process with enough brute damage -/obj/item/organ/internal/heart/ethereal/proc/on_take_damage(datum/source, damage, damagetype, def_zone) - SIGNAL_HANDLER - if(damagetype != BRUTE) - return - - crystalization_process_damage += damage - - if(crystalization_process_damage < BRUTE_DAMAGE_REQUIRED_TO_STOP_CRYSTALIZATION) - return - - var/mob/living/carbon/human/ethereal = source - - ethereal.visible_message( - span_notice("The crystals on [ethereal] are completely shattered and stopped growing."), - span_warning("The crystals on your body have completely broken."), - ) - - stop_crystalization_process(ethereal) - -/obj/structure/ethereal_crystal - name = "ethereal resurrection crystal" - desc = "It seems to contain the corpse of an ethereal mending its wounds." - icon = 'icons/obj/ethereal_crystal.dmi' - icon_state = "ethereal_crystal" - damage_deflection = 0 - max_integrity = 100 - resistance_flags = FIRE_PROOF - density = TRUE - anchored = TRUE - ///The organ this crystal belongs to - var/obj/item/organ/internal/heart/ethereal/ethereal_heart - ///Timer for the healing process. Stops if destroyed. - var/crystal_heal_timer - ///Is the crystal still being built? True by default, gets changed after a timer. - var/being_built = TRUE - -/obj/structure/ethereal_crystal/Initialize(mapload, obj/item/organ/internal/heart/ethereal/ethereal_heart) - . = ..() - if(!ethereal_heart) - stack_trace("Our crystal has no related heart") - return INITIALIZE_HINT_QDEL - src.ethereal_heart = ethereal_heart - ethereal_heart.owner.visible_message(span_notice("The crystals fully encase [ethereal_heart.owner]!")) - to_chat(ethereal_heart.owner, span_notice("You are encased in a huge crystal!")) - playsound(get_turf(src), 'sound/effects/ethereal_crystalization.ogg', 50) - var/atom/movable/possible_chair = ethereal_heart.owner.buckled - possible_chair?.unbuckle_mob(ethereal_heart.owner, force = TRUE) - ethereal_heart.owner.forceMove(src) //put that ethereal in - add_atom_colour(ethereal_heart.ethereal_color, FIXED_COLOUR_PRIORITY) - crystal_heal_timer = addtimer(CALLBACK(src, PROC_REF(heal_ethereal)), CRYSTALIZE_HEAL_TIME, TIMER_STOPPABLE) - set_light(4, 10, ethereal_heart.ethereal_color) - update_icon() - flick("ethereal_crystal_forming", src) - addtimer(CALLBACK(src, PROC_REF(start_crystalization)), 1 SECONDS) - -/obj/structure/ethereal_crystal/proc/start_crystalization() - being_built = FALSE - update_icon() - - -/obj/structure/ethereal_crystal/atom_destruction(damage_flag) - playsound(get_turf(ethereal_heart.owner), 'sound/effects/ethereal_revive_fail.ogg', 100) - return ..() - - -/obj/structure/ethereal_crystal/Destroy() - if(!ethereal_heart) - return ..() - ethereal_heart.current_crystal = null - COOLDOWN_START(ethereal_heart, crystalize_cooldown, CRYSTALIZE_COOLDOWN_LENGTH) - ethereal_heart.owner.forceMove(get_turf(src)) - REMOVE_TRAIT(ethereal_heart.owner, TRAIT_CORPSELOCKED, SPECIES_TRAIT) - deltimer(crystal_heal_timer) - visible_message(span_notice("The crystals shatters, causing [ethereal_heart.owner] to fall out.")) - return ..() - -/obj/structure/ethereal_crystal/update_overlays() - . = ..() - if(!being_built) - var/mutable_appearance/shine = mutable_appearance(icon, icon_state = "[icon_state]_shine") - shine.appearance_flags = RESET_COLOR //No color on this, just pure white - . += shine - -/obj/structure/ethereal_crystal/proc/heal_ethereal() - var/datum/brain_trauma/picked_trauma - if(prob(10)) //10% chance for a severe trauma - picked_trauma = pick(subtypesof(/datum/brain_trauma/severe)) - else - picked_trauma = pick(subtypesof(/datum/brain_trauma/mild)) - - // revive will regenerate organs, so our heart refence is going to be null'd. Unreliable - var/mob/living/carbon/regenerating = ethereal_heart.owner - - playsound(get_turf(regenerating), 'sound/effects/ethereal_revive.ogg', 100) - to_chat(regenerating, span_notice("You burst out of the crystal with vigour...
    But at a cost.")) - regenerating.gain_trauma(picked_trauma, TRAUMA_RESILIENCE_ABSOLUTE) - regenerating.revive(HEAL_ALL & ~HEAL_REFRESH_ORGANS) - // revive calls fully heal -> deletes the crystal. - // this qdeleted check is just for sanity. - if(!QDELETED(src)) - qdel(src) diff --git a/code/modules/surgery/organs/internal/_internal_organ.dm b/code/modules/surgery/organs/internal/_internal_organ.dm new file mode 100644 index 0000000000000..eb8629347e6c6 --- /dev/null +++ b/code/modules/surgery/organs/internal/_internal_organ.dm @@ -0,0 +1,90 @@ +/obj/item/organ/internal + name = "organ" + +/obj/item/organ/internal/Initialize(mapload) + . = ..() + START_PROCESSING(SSobj, src) + +/obj/item/organ/internal/Destroy() + if(owner) + // The special flag is important, because otherwise mobs can die + // while undergoing transformation into different mobs. + Remove(owner, special=TRUE) + else + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/organ/internal/Insert(mob/living/carbon/receiver, special = FALSE, drop_if_replaced = TRUE) + . = ..() + if(!. || !owner) + return + + // organs_slot must ALWAYS be ordered in the same way as organ_process_order + // Otherwise life processing breaks down + sortTim(owner.organs_slot, GLOBAL_PROC_REF(cmp_organ_slot_asc)) + + STOP_PROCESSING(SSobj, src) + +/obj/item/organ/internal/Remove(mob/living/carbon/organ_owner, special = FALSE) + . = ..() + + if(organ_owner) + if((organ_flags & ORGAN_VITAL) && !special && !(organ_owner.status_flags & GODMODE)) + if(organ_owner.stat != DEAD) + organ_owner.investigate_log("has been killed by losing a vital organ ([src]).", INVESTIGATE_DEATHS) + organ_owner.death() + + START_PROCESSING(SSobj, src) + + +/obj/item/organ/internal/process(seconds_per_tick, times_fired) + on_death(seconds_per_tick, times_fired) //Kinda hate doing it like this, but I really don't want to call process directly. + +/obj/item/organ/internal/on_death(seconds_per_tick, times_fired) //runs decay when outside of a person + if(organ_flags & (ORGAN_ROBOTIC | ORGAN_FROZEN)) + return + apply_organ_damage(decay_factor * maxHealth * seconds_per_tick) + +/// 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 +/obj/item/organ/internal/on_life(seconds_per_tick, times_fired) //repair organ damage if the organ is not failing + if(organ_flags & ORGAN_FAILING) + handle_failing_organs(seconds_per_tick) + return + + if(failure_time > 0) + failure_time-- + + if(organ_flags & ORGAN_EMP) //Synthetic organ has been emped, is now failing. + apply_organ_damage(decay_factor * maxHealth * seconds_per_tick) + return + + if(!damage) // No sense healing if you're not even hurt bro + return + + if(IS_ROBOTIC_ORGAN(src)) // Robotic organs don't naturally heal + 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 + apply_organ_damage(-healing_amount * maxHealth * seconds_per_tick, damage) // pass curent damage incase we are over cap + +///Used as callbacks by object pooling +/obj/item/organ/internal/exit_wardrobe() + START_PROCESSING(SSobj, src) + +//See above +/obj/item/organ/internal/enter_wardrobe() + STOP_PROCESSING(SSobj, src) + +///Organs don't die instantly, and neither should you when you get fucked up +/obj/item/organ/internal/handle_failing_organs(seconds_per_tick) + if(owner.stat == DEAD) + return + + failure_time += seconds_per_tick + organ_failure(seconds_per_tick) diff --git a/code/modules/surgery/organs/internal/appendix/_appendix.dm b/code/modules/surgery/organs/internal/appendix/_appendix.dm new file mode 100644 index 0000000000000..bb02c8b9ef9e9 --- /dev/null +++ b/code/modules/surgery/organs/internal/appendix/_appendix.dm @@ -0,0 +1,93 @@ +// A 10% chance that out of a group of 25 people, one person will get appendicitis in 1 hour. +#define APPENDICITIS_PROB 100 * (0.1 * (1 / 25) / 3600) +#define INFLAMATION_ADVANCEMENT_PROB 2 + +/obj/item/organ/internal/appendix + name = "appendix" + icon_state = "appendix" + base_icon_state = "appendix" + visual = FALSE + zone = BODY_ZONE_PRECISE_GROIN + 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 + + now_failing = "An explosion of pain erupts in your lower right abdomen!" + now_fixed = "The pain in your abdomen has subsided." + + var/inflamation_stage = 0 + +/obj/item/organ/internal/appendix/update_name() + . = ..() + name = "[inflamation_stage ? "inflamed " : null][initial(name)]" + +/obj/item/organ/internal/appendix/update_icon_state() + icon_state = "[base_icon_state][inflamation_stage ? "inflamed" : ""]" + return ..() + +/obj/item/organ/internal/appendix/on_life(seconds_per_tick, times_fired) + . = ..() + if(!owner) + return + + if(organ_flags & ORGAN_FAILING) + // forced to ensure people don't use it to gain tox as slime person + owner.adjustToxLoss(2 * seconds_per_tick, forced = TRUE) + else if(inflamation_stage) + inflamation(seconds_per_tick) + else if(SPT_PROB(APPENDICITIS_PROB, seconds_per_tick)) + become_inflamed() + +/obj/item/organ/internal/appendix/proc/become_inflamed() + inflamation_stage = 1 + update_appearance() + if(owner) + ADD_TRAIT(owner, TRAIT_DISEASELIKE_SEVERITY_MEDIUM, type) + owner.med_hud_set_status() + notify_ghosts("[owner] has developed spontaneous appendicitis!", source = owner, action = NOTIFY_ORBIT, header = "Whoa, Sick!") + +/obj/item/organ/internal/appendix/proc/inflamation(seconds_per_tick) + var/mob/living/carbon/organ_owner = owner + if(inflamation_stage < 3 && SPT_PROB(INFLAMATION_ADVANCEMENT_PROB, seconds_per_tick)) + inflamation_stage += 1 + + switch(inflamation_stage) + if(1) + if(SPT_PROB(2.5, seconds_per_tick)) + organ_owner.emote("cough") + if(2) + if(SPT_PROB(1.5, seconds_per_tick)) + 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, forced = TRUE) + if(3) + if(SPT_PROB(0.5, seconds_per_tick)) + organ_owner.vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = 95) + organ_owner.adjustOrganLoss(ORGAN_SLOT_APPENDIX, 15) + + +/obj/item/organ/internal/appendix/get_availability(datum/species/owner_species, mob/living/owner_mob) + return owner_species.mutantappendix + +/obj/item/organ/internal/appendix/on_remove(mob/living/carbon/organ_owner) + . = ..() + REMOVE_TRAIT(organ_owner, TRAIT_DISEASELIKE_SEVERITY_MEDIUM, type) + organ_owner.med_hud_set_status() + +/obj/item/organ/internal/appendix/on_insert(mob/living/carbon/organ_owner) + . = ..() + if(inflamation_stage) + ADD_TRAIT(organ_owner, TRAIT_DISEASELIKE_SEVERITY_MEDIUM, type) + organ_owner.med_hud_set_status() + +/obj/item/organ/internal/appendix/get_status_text() + if((!(organ_flags & ORGAN_FAILING)) && inflamation_stage) + return "Inflamed" + else + return ..() + +#undef APPENDICITIS_PROB +#undef INFLAMATION_ADVANCEMENT_PROB diff --git a/code/modules/surgery/organs/appendix_golem.dm b/code/modules/surgery/organs/internal/appendix/appendix_golem.dm similarity index 99% rename from code/modules/surgery/organs/appendix_golem.dm rename to code/modules/surgery/organs/internal/appendix/appendix_golem.dm index eb89112cbd031..03b076b1b2a13 100644 --- a/code/modules/surgery/organs/appendix_golem.dm +++ b/code/modules/surgery/organs/internal/appendix/appendix_golem.dm @@ -4,7 +4,7 @@ desc = "This expanded digestive chamber allows golems to smelt minerals, provided that they are immersed in lava." icon_state = "ethereal_heart" color = COLOR_GOLEM_GRAY - status = ORGAN_MINERAL + organ_flags = ORGAN_MINERAL /// Action which performs smelting var/datum/action/cooldown/internal_smelting/smelter diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm similarity index 94% rename from code/modules/surgery/organs/augments_arms.dm rename to code/modules/surgery/organs/internal/cyberimp/augments_arms.dm index b3baf6f8f0364..86cdf85513446 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm @@ -60,7 +60,7 @@ /obj/item/organ/internal/cyberimp/arm/examine(mob/user) . = ..() - if(status == ORGAN_ROBOTIC) + if(IS_ROBOTIC_ORGAN(src)) . += 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/internal/cyberimp/arm/screwdriver_act(mob/living/user, obj/item/screwtool) @@ -98,7 +98,7 @@ /obj/item/organ/internal/cyberimp/arm/emp_act(severity) . = ..() - if(. & EMP_PROTECT_SELF || status == ORGAN_ROBOTIC) + if(. & EMP_PROTECT_SELF || !IS_ROBOTIC_ORGAN(src)) return if(prob(15/severity) && owner) to_chat(owner, span_warning("The electromagnetic pulse causes [src] to malfunction!")) @@ -124,12 +124,17 @@ /obj/item/organ/internal/cyberimp/arm/proc/Retract() if(!active_item || (active_item in src)) return FALSE + if(owner) + owner.visible_message( + span_notice("[owner] retracts [active_item] back into [owner.p_their()] [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm."), + span_notice("[active_item] snaps back into your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm."), + span_hear("You hear a short mechanical noise."), + ) + + owner.transferItemToLoc(active_item, src, TRUE) + else + active_item.forceMove(src) - owner?.visible_message(span_notice("[owner] retracts [active_item] back into [owner.p_their()] [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm."), - span_notice("[active_item] snaps back into your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm."), - span_hear("You hear a short mechanical noise.")) - - owner.transferItemToLoc(active_item, src, TRUE) UnregisterSignal(active_item, COMSIG_ITEM_ATTACK_SELF) active_item = null playsound(get_turf(owner), retract_sound, 50, TRUE) @@ -253,13 +258,13 @@ /obj/item/organ/internal/cyberimp/arm/toolset/l zone = BODY_ZONE_L_ARM -/obj/item/organ/internal/cyberimp/arm/toolset/emag_act(mob/user) +/obj/item/organ/internal/cyberimp/arm/toolset/emag_act(mob/user, obj/item/card/emag/emag_card) for(var/datum/weakref/created_item in items_list) var/obj/potential_knife = created_item.resolve() if(istype(/obj/item/knife/combat/cyborg, potential_knife)) return FALSE - to_chat(user, span_notice("You unlock [src]'s integrated knife!")) + balloon_alert(user, "integrated knife unlocked") items_list += WEAKREF(new /obj/item/knife/combat/cyborg(src)) return TRUE @@ -408,9 +413,8 @@ return var/mob/living/living_target = target - source.changeNext_move(CLICK_CD_MELEE) - var/picked_hit_type = pick("punch", "smash", "kick") + var/picked_hit_type = pick("punch", "smash", "pummel", "bash", "slam") if(organ_flags & ORGAN_FAILING) if(source.body_position != LYING_DOWN && living_target != source && prob(50)) @@ -433,7 +437,9 @@ source.do_attack_animation(target, ATTACK_EFFECT_SMASH) playsound(living_target.loc, 'sound/weapons/punch1.ogg', 25, TRUE, -1) - living_target.apply_damage(punch_damage, BRUTE) + var/target_zone = living_target.get_random_valid_zone(source.zone_selected) + var/armor_block = living_target.run_armor_check(target_zone, MELEE) + living_target.apply_damage(punch_damage, BRUTE, target_zone, armor_block) if(source.body_position != LYING_DOWN) //Throw them if we are standing var/atom/throw_target = get_edge_target_turf(living_target, source.dir) diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm similarity index 88% rename from code/modules/surgery/organs/augments_chest.dm rename to code/modules/surgery/organs/internal/cyberimp/augments_chest.dm index 49b0ba08a43e9..86dacdd98ffee 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm @@ -77,18 +77,21 @@ /obj/item/organ/internal/cyberimp/chest/reviver/proc/heal() + var/need_mob_update = FALSE if(owner.getOxyLoss()) - owner.adjustOxyLoss(-5) + need_mob_update += owner.adjustOxyLoss(-5, updating_health = FALSE) revive_cost += 5 if(owner.getBruteLoss()) - owner.adjustBruteLoss(-2) + need_mob_update += owner.adjustBruteLoss(-2, updating_health = FALSE) revive_cost += 40 if(owner.getFireLoss()) - owner.adjustFireLoss(-2) + need_mob_update += owner.adjustFireLoss(-2, updating_health = FALSE) revive_cost += 40 if(owner.getToxLoss()) - owner.adjustToxLoss(-1) + need_mob_update += owner.adjustToxLoss(-1, updating_health = FALSE) revive_cost += 40 + if(need_mob_update) + owner.updatehealth() /obj/item/organ/internal/cyberimp/chest/reviver/emp_act(severity) . = ..() @@ -128,22 +131,18 @@ actions_types = list(/datum/action/item_action/organ_action/toggle) w_class = WEIGHT_CLASS_NORMAL var/on = FALSE - var/datum/callback/get_mover - var/datum/callback/check_on_move /obj/item/organ/internal/cyberimp/chest/thrusters/Initialize(mapload) . = ..() - get_mover = CALLBACK(src, PROC_REF(get_user)) - check_on_move = CALLBACK(src, PROC_REF(allow_thrust), 0.01) - refresh_jetpack() - -/obj/item/organ/internal/cyberimp/chest/thrusters/Destroy() - get_mover = null - check_on_move = null - return ..() - -/obj/item/organ/internal/cyberimp/chest/thrusters/proc/refresh_jetpack() - AddComponent(/datum/component/jetpack, FALSE, COMSIG_THRUSTER_ACTIVATED, COMSIG_THRUSTER_DEACTIVATED, THRUSTER_ACTIVATION_FAILED, get_mover, check_on_move, /datum/effect_system/trail_follow/ion) + AddComponent( \ + /datum/component/jetpack, \ + FALSE, \ + COMSIG_THRUSTER_ACTIVATED, \ + COMSIG_THRUSTER_DEACTIVATED, \ + THRUSTER_ACTIVATION_FAILED, \ + CALLBACK(src, PROC_REF(allow_thrust), 0.01), \ + /datum/effect_system/trail_follow/ion \ + ) /obj/item/organ/internal/cyberimp/chest/thrusters/Remove(mob/living/carbon/thruster_owner, special = 0) if(on) @@ -166,7 +165,7 @@ if(!silent) to_chat(owner, span_warning("Your thrusters set seems to be broken!")) return - if(SEND_SIGNAL(src, COMSIG_THRUSTER_ACTIVATED) & THRUSTER_ACTIVATION_FAILED) + if(SEND_SIGNAL(src, COMSIG_THRUSTER_ACTIVATED, owner) & THRUSTER_ACTIVATION_FAILED) return on = TRUE @@ -178,7 +177,7 @@ /obj/item/organ/internal/cyberimp/chest/thrusters/proc/deactivate(silent = FALSE) if(!on) return - SEND_SIGNAL(src, COMSIG_THRUSTER_DEACTIVATED) + SEND_SIGNAL(src, COMSIG_THRUSTER_DEACTIVATED, owner) owner.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/cybernetic) if(!silent) to_chat(owner, span_notice("You turn your thrusters set off.")) @@ -223,6 +222,3 @@ deactivate(silent = TRUE) return FALSE - -/obj/item/organ/internal/cyberimp/chest/thrusters/proc/get_user() - return owner diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/internal/cyberimp/augments_eyes.dm similarity index 96% rename from code/modules/surgery/organs/augments_eyes.dm rename to code/modules/surgery/organs/internal/cyberimp/augments_eyes.dm index 837b10443f21e..352d4237cc0a2 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_eyes.dm @@ -44,7 +44,6 @@ desc = "These cybernetic eye implants will display a security HUD over everything you see." HUD_type = DATA_HUD_SECURITY_ADVANCED HUD_trait = TRAIT_SECURITY_HUD - organ_flags = ALL /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic name = "Diagnostic HUD implant" @@ -54,4 +53,4 @@ /obj/item/organ/internal/cyberimp/eyes/hud/security/syndicate name = "Contraband Security HUD Implant" desc = "A Cybersun Industries brand Security HUD Implant. These illicit cybernetic eye implants will display a security HUD over everything you see." - organ_flags = ORGAN_SYNTHETIC | ORGAN_HIDDEN + organ_flags = ORGAN_ROBOTIC | ORGAN_HIDDEN diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm similarity index 94% rename from code/modules/surgery/organs/augments_internal.dm rename to code/modules/surgery/organs/internal/cyberimp/augments_internal.dm index 0ae0cbc962a0a..f057883296912 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm @@ -3,8 +3,8 @@ 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 + organ_flags = ORGAN_ROBOTIC + failing_desc = "seems to be broken." var/implant_color = "#FFFFFF" var/implant_overlay @@ -168,15 +168,8 @@ name = "boxed cybernetic implants" desc = "A sleek, sturdy box." icon_state = "cyber_implants" - var/list/boxed = list( - /obj/item/autosurgeon/syndicate/thermal_eyes, - /obj/item/autosurgeon/syndicate/xray_eyes, - /obj/item/autosurgeon/syndicate/anti_stun, - /obj/item/autosurgeon/syndicate/reviver) - var/amount = 5 /obj/item/storage/box/cyber_implants/PopulateContents() - var/implant - while(contents.len <= amount) - implant = pick(boxed) - new implant(src) + new /obj/item/autosurgeon/syndicate/xray_eyes(src) + new /obj/item/autosurgeon/syndicate/anti_stun(src) + new /obj/item/autosurgeon/syndicate/reviver(src) diff --git a/code/modules/surgery/organs/internal/ears/_ears.dm b/code/modules/surgery/organs/internal/ears/_ears.dm new file mode 100644 index 0000000000000..7d2b0f3c54951 --- /dev/null +++ b/code/modules/surgery/organs/internal/ears/_ears.dm @@ -0,0 +1,153 @@ +/obj/item/organ/internal/ears + name = "ears" + icon_state = "ears" + desc = "There are three parts to the ear. Inner, middle and outer. Only one of these parts should be normally visible." + zone = BODY_ZONE_HEAD + slot = ORGAN_SLOT_EARS + 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 sometimes." + 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." + + // `deaf` measures "ticks" of deafness. While > 0, the person is unable + // to hear anything. + var/deaf = 0 + + // `damage` in this case measures long term damage to the ears, if too high, + // the person will not have either `deaf` or `ear_damage` decrease + // without external aid (earmuffs, drugs) + + //Resistance against loud noises + var/bang_protect = 0 + // Multiplier for both long term and short term ear damage + var/damage_multiplier = 1 + +/obj/item/organ/internal/ears/on_life(seconds_per_tick, 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)) + to_chat(owner, span_warning("The ringing in your ears grows louder, blocking out any external noises for a moment.")) + + . = ..() + // if we have non-damage related deafness like mutations, quirks or clothing (earmuffs), don't bother processing here. Ear healing from earmuffs or chems happen elsewhere + if(HAS_TRAIT_NOT_FROM(owner, TRAIT_DEAF, EAR_DAMAGE)) + return + + if((organ_flags & ORGAN_FAILING)) + 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 * seconds_per_tick), 0) + if((damage > low_threshold) && SPT_PROB(damage / 60, seconds_per_tick)) + adjustEarDamage(0, 4) + SEND_SOUND(owner, sound('sound/weapons/flash_ring.ogg')) + + if(deaf) + ADD_TRAIT(owner, TRAIT_DEAF, EAR_DAMAGE) + else + REMOVE_TRAIT(owner, TRAIT_DEAF, EAR_DAMAGE) + +/obj/item/organ/internal/ears/proc/adjustEarDamage(ddmg, ddeaf) + if(owner.status_flags & GODMODE) + return + set_organ_damage(clamp(damage + (ddmg * damage_multiplier), 0, maxHealth)) + deaf = max(deaf + (ddeaf * damage_multiplier), 0) + +/obj/item/organ/internal/ears/invincible + damage_multiplier = 0 + +/obj/item/organ/internal/ears/cat + name = "cat ears" + icon = 'icons/obj/clothing/head/costume.dmi' + worn_icon = 'icons/mob/clothing/head/costume.dmi' + icon_state = "kitty" + visual = TRUE + damage_multiplier = 2 + +/obj/item/organ/internal/ears/cat/on_insert(mob/living/carbon/human/ear_owner) + . = ..() + if(istype(ear_owner) && ear_owner.dna) + 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/internal/ears/cat/on_remove(mob/living/carbon/human/ear_owner) + . = ..() + if(istype(ear_owner) && ear_owner.dna) + color = ear_owner.hair_color + ear_owner.dna.species.mutant_bodyparts -= "ears" + ear_owner.update_body() + +/obj/item/organ/internal/ears/penguin + name = "penguin ears" + desc = "The source of a penguin's happy feet." + +/obj/item/organ/internal/ears/penguin/on_insert(mob/living/carbon/human/ear_owner) + . = ..() + if(istype(ear_owner)) + to_chat(ear_owner, span_notice("You suddenly feel like you've lost your balance.")) + ear_owner.AddElement(/datum/element/waddling) + +/obj/item/organ/internal/ears/penguin/on_remove(mob/living/carbon/human/ear_owner) + . = ..() + if(istype(ear_owner)) + to_chat(ear_owner, span_notice("Your sense of balance comes back to you.")) + ear_owner.RemoveElement(/datum/element/waddling) + +/obj/item/organ/internal/ears/cybernetic + name = "basic cybernetic ears" + icon_state = "ears-c" + desc = "A basic cybernetic organ designed to mimic the operation of ears." + damage_multiplier = 0.9 + organ_flags = ORGAN_ROBOTIC + failing_desc = "seems to be broken." + +/obj/item/organ/internal/ears/cybernetic/upgraded + name = "cybernetic ears" + icon_state = "ears-c-u" + desc = "An advanced cybernetic ear, surpassing the performance of organic ears." + damage_multiplier = 0.5 + +/obj/item/organ/internal/ears/cybernetic/whisper + name = "whisper-sensitive cybernetic ears" + icon_state = "ears-c-u" + desc = "Allows the user to more easily hear whispers. The user becomes extra vulnerable to loud noises, however" + // Same sensitivity as felinid ears + damage_multiplier = 2 + +// The original idea was to use signals to do this not traits. Unfortunately, the star effect used for whispers applies before any relevant signals +// This seems like the least invasive solution +/obj/item/organ/internal/ears/cybernetic/whisper/on_insert(mob/living/carbon/ear_owner) + . = ..() + ADD_TRAIT(ear_owner, TRAIT_GOOD_HEARING, ORGAN_TRAIT) + +/obj/item/organ/internal/ears/cybernetic/whisper/on_remove(mob/living/carbon/ear_owner) + . = ..() + REMOVE_TRAIT(ear_owner, TRAIT_GOOD_HEARING, ORGAN_TRAIT) + +// "X-ray ears" that let you hear through walls +/obj/item/organ/internal/ears/cybernetic/xray + name = "wall-penetrating cybernetic ears" + icon_state = "ears-c-u" + desc = "Throguh the power of modern engineering, allows the user to hear speech through walls. The user becomes extra vulnerable to loud noises, however" + // Same sensitivity as felinid ears + damage_multiplier = 2 + +/obj/item/organ/internal/ears/cybernetic/xray/on_insert(mob/living/carbon/ear_owner) + . = ..() + ADD_TRAIT(ear_owner, TRAIT_XRAY_HEARING, ORGAN_TRAIT) + +/obj/item/organ/internal/ears/cybernetic/xray/on_remove(mob/living/carbon/ear_owner) + . = ..() + REMOVE_TRAIT(ear_owner, TRAIT_XRAY_HEARING, ORGAN_TRAIT) + +/obj/item/organ/internal/ears/cybernetic/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + apply_organ_damage(20 / severity) diff --git a/code/modules/surgery/organs/internal/eyes/_eyes.dm b/code/modules/surgery/organs/internal/eyes/_eyes.dm new file mode 100644 index 0000000000000..6d9c941e830a2 --- /dev/null +++ b/code/modules/surgery/organs/internal/eyes/_eyes.dm @@ -0,0 +1,750 @@ +/obj/item/organ/internal/eyes + name = BODY_ZONE_PRECISE_EYES + icon_state = "eyes" + desc = "I see you!" + visual = TRUE + zone = BODY_ZONE_PRECISE_EYES + 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 + + low_threshold_passed = "Distant objects become somewhat less tangible." + high_threshold_passed = "Everything starts to look a lot less clear." + now_failing = "Darkness envelopes you, as your eyes go blind!" + now_fixed = "Color and shapes are once again perceivable." + high_threshold_cleared = "Your vision functions passably once more." + low_threshold_cleared = "Your vision is cleared of any ailment." + + /// Sight flags this eye pair imparts on its user. + var/sight_flags = NONE + /// changes how the eyes overlay is applied, makes it apply over the lighting layer + var/overlay_ignore_lighting = FALSE + /// How much innate tint these eyes have + var/tint = 0 + /// How much innare flash protection these eyes have, usually paired with tint + var/flash_protect = FLASH_PROTECTION_NONE + /// What level of invisibility these eyes can see + var/see_invisible = SEE_INVISIBLE_LIVING + /// How much darkness to cut out of your view (basically, night vision) + var/lighting_cutoff = null + /// List of color cutoffs from eyes, or null if not applicable + var/list/color_cutoffs = null + /// Are these eyes immune to pepperspray? + var/pepperspray_protect = FALSE + + var/eye_color_left = "" //set to a hex code to override a mob's left eye color + var/eye_color_right = "" //set to a hex code to override a mob's right eye color + var/eye_icon_state = "eyes" + /// The color of the previous left eye before this one was inserted + var/old_eye_color_left = "fff" + /// The color of the previous right eye before this one was inserted + var/old_eye_color_right = "fff" + + /// Glasses cannot be worn over these eyes. Currently unused + var/no_glasses = FALSE + /// indication that the eyes are undergoing some negative effect + var/damaged = FALSE + /// Native FOV that will be applied if a config is enabled + var/native_fov = FOV_90_DEGREES + +/obj/item/organ/internal/eyes/Insert(mob/living/carbon/eye_recipient, special = FALSE, drop_if_replaced = FALSE) + // If we don't do this before everything else, heterochromia will be reset leading to eye_color_right no longer being accurate + if(ishuman(eye_recipient)) + var/mob/living/carbon/human/human_recipient = eye_recipient + old_eye_color_left = human_recipient.eye_color_left + old_eye_color_right = human_recipient.eye_color_right + + . = ..() + + if(!.) + return + + eye_recipient.cure_blind(NO_EYES) + apply_damaged_eye_effects() + refresh(eye_recipient, call_update = TRUE) + +/// Refreshes the visuals of the eyes +/// If call_update is TRUE, we also will call update_body +/obj/item/organ/internal/eyes/proc/refresh(mob/living/carbon/eye_owner = owner, call_update = TRUE) + owner.update_sight() + owner.update_tint() + + if(!ishuman(eye_owner)) + return + + var/mob/living/carbon/human/affected_human = eye_owner + if(initial(eye_color_left)) + affected_human.eye_color_left = eye_color_left + else + eye_color_left = affected_human.eye_color_left + if(initial(eye_color_right)) + affected_human.eye_color_right = eye_color_right + else + eye_color_right = affected_human.eye_color_right + if(HAS_TRAIT(affected_human, TRAIT_NIGHT_VISION) && !lighting_cutoff) + lighting_cutoff = LIGHTING_CUTOFF_REAL_LOW + if(CONFIG_GET(flag/native_fov) && native_fov) + affected_human.add_fov_trait(type, native_fov) + + if(call_update) + affected_human.update_body() + +/obj/item/organ/internal/eyes/Remove(mob/living/carbon/eye_owner, special = FALSE) + . = ..() + if(ishuman(eye_owner)) + var/mob/living/carbon/human/human_owner = eye_owner + if(initial(eye_color_left)) + human_owner.eye_color_left = old_eye_color_left + if(initial(eye_color_right)) + human_owner.eye_color_right = old_eye_color_right + if(native_fov) + eye_owner.remove_fov_trait(type) + human_owner.update_body() + + // Cure blindness from eye damage + eye_owner.cure_blind(EYE_DAMAGE) + eye_owner.cure_nearsighted(EYE_DAMAGE) + // Eye blind and temp blind go to, even if this is a bit of cheesy way to clear blindness + eye_owner.remove_status_effect(/datum/status_effect/eye_blur) + eye_owner.remove_status_effect(/datum/status_effect/temporary_blindness) + // Then become blind anyways (if not special) + if(!special) + eye_owner.become_blind(NO_EYES) + + eye_owner.update_tint() + eye_owner.update_sight() + +#define OFFSET_X 1 +#define OFFSET_Y 2 + +/// This proc generates a list of overlays that the eye should be displayed using for the given parent +/obj/item/organ/internal/eyes/proc/generate_body_overlay(mob/living/carbon/human/parent) + if(!istype(parent) || parent.get_organ_by_type(/obj/item/organ/internal/eyes) != src) + CRASH("Generating a body overlay for [src] targeting an invalid parent '[parent]'.") + + if(isnull(eye_icon_state)) + return list() + + var/mutable_appearance/eye_left = mutable_appearance('icons/mob/human/human_face.dmi', "[eye_icon_state]_l", -BODY_LAYER) + var/mutable_appearance/eye_right = mutable_appearance('icons/mob/human/human_face.dmi', "[eye_icon_state]_r", -BODY_LAYER) + var/list/overlays = list(eye_left, eye_right) + + var/obscured = parent.check_obscured_slots(TRUE) + if(overlay_ignore_lighting && !(obscured & ITEM_SLOT_EYES)) + overlays += emissive_appearance(eye_left.icon, eye_left.icon_state, parent, -BODY_LAYER, alpha = eye_left.alpha) + overlays += emissive_appearance(eye_right.icon, eye_right.icon_state, parent, -BODY_LAYER, alpha = eye_right.alpha) + var/obj/item/bodypart/head/my_head = parent.get_bodypart(BODY_ZONE_HEAD) + if(my_head) + if(my_head.head_flags & HEAD_EYECOLOR) + eye_right.color = eye_color_right + eye_left.color = eye_color_left + if(my_head.worn_face_offset) + my_head.worn_face_offset.apply_offset(eye_left) + my_head.worn_face_offset.apply_offset(eye_right) + + return overlays + +#undef OFFSET_X +#undef OFFSET_Y + +//Gotta reset the eye color, because that persists +/obj/item/organ/internal/eyes/enter_wardrobe() + . = ..() + eye_color_left = initial(eye_color_left) + eye_color_right = initial(eye_color_right) + +/obj/item/organ/internal/eyes/apply_organ_damage(damage_amount, maximum = maxHealth, required_organ_flag) + . = ..() + if(!owner) + return FALSE + apply_damaged_eye_effects() + +/// Applies effects to our owner based on how damaged our eyes are +/obj/item/organ/internal/eyes/proc/apply_damaged_eye_effects() + // we're in healthy threshold, either try to heal (if damaged) or do nothing + if(damage <= low_threshold) + if(damaged) + damaged = FALSE + // clear nearsightedness from damage + owner.cure_nearsighted(EYE_DAMAGE) + // if we're still nearsighted, reset its severity + // this is kinda icky, ideally we'd track severity to source but that's way more complex + var/datum/status_effect/grouped/nearsighted/nearsightedness = owner.is_nearsighted() + nearsightedness?.set_nearsighted_severity(1) + // and cure blindness from damage + owner.cure_blind(EYE_DAMAGE) + return + + //various degrees of "oh fuck my eyes", from "point a laser at your eye" to "staring at the Sun" intensities + // 50 - blind + // 49-31 - nearsighted (2 severity) + // 30-20 - nearsighted (1 severity) + if(organ_flags & ORGAN_FAILING) + // become blind from damage + owner.become_blind(EYE_DAMAGE) + + else + // become nearsighted from damage + owner.become_nearsighted(EYE_DAMAGE) + // update the severity of our nearsightedness based on our eye damage + var/datum/status_effect/grouped/nearsighted/nearsightedness = owner.is_nearsighted() + nearsightedness.set_nearsighted_severity(damage > high_threshold ? 2 : 1) + + damaged = TRUE + +#define NIGHTVISION_LIGHT_OFF 0 +#define NIGHTVISION_LIGHT_LOW 1 +#define NIGHTVISION_LIGHT_MID 2 +#define NIGHTVISION_LIGHT_HIG 3 + +/obj/item/organ/internal/eyes/night_vision + actions_types = list(/datum/action/item_action/organ_action/use) + + // These lists are used as the color cutoff for the eye + // They need to be filled out for subtypes + var/list/low_light_cutoff + var/list/medium_light_cutoff + var/list/high_light_cutoff + var/light_level = NIGHTVISION_LIGHT_OFF + +/obj/item/organ/internal/eyes/night_vision/Initialize(mapload) + . = ..() + if (PERFORM_ALL_TESTS(focus_only/nightvision_color_cutoffs) && type != /obj/item/organ/internal/eyes/night_vision) + if(length(low_light_cutoff) != 3 || length(medium_light_cutoff) != 3 || length(high_light_cutoff) != 3) + stack_trace("[type] did not have fully filled out color cutoff lists") + if(low_light_cutoff) + color_cutoffs = low_light_cutoff.Copy() + light_level = NIGHTVISION_LIGHT_LOW + +/obj/item/organ/internal/eyes/night_vision/ui_action_click() + sight_flags = initial(sight_flags) + switch(light_level) + if (NIGHTVISION_LIGHT_OFF) + color_cutoffs = low_light_cutoff.Copy() + light_level = NIGHTVISION_LIGHT_LOW + if (NIGHTVISION_LIGHT_LOW) + color_cutoffs = medium_light_cutoff.Copy() + light_level = NIGHTVISION_LIGHT_MID + if (NIGHTVISION_LIGHT_MID) + color_cutoffs = high_light_cutoff.Copy() + light_level = NIGHTVISION_LIGHT_HIG + else + color_cutoffs = null + light_level = NIGHTVISION_LIGHT_OFF + owner.update_sight() + +#undef NIGHTVISION_LIGHT_OFF +#undef NIGHTVISION_LIGHT_LOW +#undef NIGHTVISION_LIGHT_MID +#undef NIGHTVISION_LIGHT_HIG + +/obj/item/organ/internal/eyes/night_vision/mushroom + name = "fung-eye" + desc = "While on the outside they look inert and dead, the eyes of mushroom people are actually very advanced." + low_light_cutoff = list(0, 15, 20) + medium_light_cutoff = list(0, 20, 35) + high_light_cutoff = list(0, 40, 50) + +/obj/item/organ/internal/eyes/zombie + name = "undead eyes" + desc = "Somewhat counterintuitively, these half-rotten eyes actually have superior vision to those of a living human." + color_cutoffs = list(25, 35, 5) + +/obj/item/organ/internal/eyes/alien + name = "alien eyes" + desc = "It turned out they had them after all!" + sight_flags = SEE_MOBS + color_cutoffs = list(25, 5, 42) + +/obj/item/organ/internal/eyes/golem + name = "resonating crystal" + icon_state = "adamantine_cords" + eye_icon_state = null + desc = "Golems somehow measure external light levels and detect nearby ore using this sensitive mineral lattice." + color = COLOR_GOLEM_GRAY + visual = FALSE + organ_flags = ORGAN_MINERAL + color_cutoffs = list(10, 15, 5) + actions_types = list(/datum/action/cooldown/golem_ore_sight) + +/// Send an ore detection pulse on a cooldown +/datum/action/cooldown/golem_ore_sight + name = "Ore Resonance" + desc = "Causes nearby ores to vibrate, revealing their location." + button_icon = 'icons/obj/device.dmi' + button_icon_state = "manual_mining" + check_flags = AB_CHECK_CONSCIOUS + cooldown_time = 10 SECONDS + +/datum/action/cooldown/golem_ore_sight/Activate(atom/target) + . = ..() + mineral_scan_pulse(get_turf(target)) + +///Robotic + +/obj/item/organ/internal/eyes/robotic + name = "robotic eyes" + icon_state = "cybernetic_eyeballs" + desc = "Your vision is augmented." + organ_flags = ORGAN_ROBOTIC + failing_desc = "seems to be broken." + +/obj/item/organ/internal/eyes/robotic/emp_act(severity) + . = ..() + if((. & EMP_PROTECT_SELF) || !owner) + return + if(prob(10 * severity)) + return + to_chat(owner, span_warning("Static obfuscates your vision!")) + owner.flash_act(visual = 1) + +/obj/item/organ/internal/eyes/robotic/basic + name = "basic robotic eyes" + desc = "A pair of basic cybernetic eyes that restore vision, but at some vulnerability to light." + eye_color_left = "5500ff" + eye_color_right = "5500ff" + flash_protect = FLASH_PROTECTION_SENSITIVE + +/obj/item/organ/internal/eyes/robotic/basic/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + if(prob(10 * severity)) + apply_organ_damage(20 * severity) + to_chat(owner, span_warning("Your eyes start to fizzle in their sockets!")) + do_sparks(2, TRUE, owner) + owner.emote("scream") + +/obj/item/organ/internal/eyes/robotic/xray + name = "\improper X-ray eyes" + desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." + eye_color_left = "000" + eye_color_right = "000" + sight_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS + +/obj/item/organ/internal/eyes/robotic/xray/on_insert(mob/living/carbon/eye_owner) + . = ..() + ADD_TRAIT(eye_owner, TRAIT_XRAY_VISION, ORGAN_TRAIT) + +/obj/item/organ/internal/eyes/robotic/xray/on_remove(mob/living/carbon/eye_owner) + . = ..() + REMOVE_TRAIT(eye_owner, TRAIT_XRAY_VISION, ORGAN_TRAIT) + +/obj/item/organ/internal/eyes/robotic/thermals + name = "thermal eyes" + desc = "These cybernetic eye implants will give you thermal vision. Vertical slit pupil included." + eye_color_left = "FC0" + eye_color_right = "FC0" + // We're gonna downshift green and blue a bit so darkness looks yellow + color_cutoffs = list(25, 8, 5) + sight_flags = SEE_MOBS + flash_protect = FLASH_PROTECTION_SENSITIVE + +/obj/item/organ/internal/eyes/robotic/flashlight + name = "flashlight eyes" + desc = "It's two flashlights rigged together with some wire. Why would you put these in someone's head?" + eye_color_left ="fee5a3" + eye_color_right ="fee5a3" + icon = 'icons/obj/lighting.dmi' + icon_state = "flashlight_eyes" + flash_protect = FLASH_PROTECTION_WELDER + tint = INFINITY + var/obj/item/flashlight/eyelight/eye + +/obj/item/organ/internal/eyes/robotic/flashlight/emp_act(severity) + return + +/obj/item/organ/internal/eyes/robotic/flashlight/on_insert(mob/living/carbon/victim) + . = ..() + if(!eye) + eye = new /obj/item/flashlight/eyelight() + eye.on = TRUE + eye.forceMove(victim) + eye.update_brightness(victim) + victim.become_blind(FLASHLIGHT_EYES) + +/obj/item/organ/internal/eyes/robotic/flashlight/on_remove(mob/living/carbon/victim) + . = ..() + eye.on = FALSE + eye.update_brightness(victim) + eye.forceMove(src) + victim.cure_blind(FLASHLIGHT_EYES) + +// Welding shield implant +/obj/item/organ/internal/eyes/robotic/shield + name = "shielded robotic eyes" + desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision." + flash_protect = FLASH_PROTECTION_WELDER + +/obj/item/organ/internal/eyes/robotic/shield/emp_act(severity) + return + +#define MATCH_LIGHT_COLOR 1 +#define USE_CUSTOM_COLOR 0 +#define UPDATE_LIGHT 0 +#define UPDATE_EYES_LEFT 1 +#define UPDATE_EYES_RIGHT 2 + +/obj/item/organ/internal/eyes/robotic/glow + name = "High Luminosity Eyes" + desc = "Special glowing eyes, used by snowflakes who want to be special." + eye_color_left = "000" + eye_color_right = "000" + actions_types = list(/datum/action/item_action/organ_action/use, /datum/action/item_action/organ_action/toggle) + var/max_light_beam_distance = 5 + var/obj/item/flashlight/eyelight/glow/eye + /// base icon state for eye overlays + var/base_eye_state = "eyes_glow_gs" + /// Whether or not to match the eye color to the light or use a custom selection + var/eye_color_mode = MATCH_LIGHT_COLOR + /// The selected color for the light beam itself + var/current_color_string = "#ffffff" + /// The custom selected eye color for the left eye. Defaults to the mob's natural eye color + var/current_left_color_string + /// The custom selected eye color for the right eye. Defaults to the mob's natural eye color + var/current_right_color_string + +/obj/item/organ/internal/eyes/robotic/glow/Initialize(mapload) + . = ..() + eye = new /obj/item/flashlight/eyelight/glow + +/obj/item/organ/internal/eyes/robotic/glow/Destroy() + . = ..() + deactivate(close_ui = TRUE) + QDEL_NULL(eye) + +/obj/item/organ/internal/eyes/robotic/glow/emp_act() + . = ..() + if(!eye.on || . & EMP_PROTECT_SELF) + return + deactivate(close_ui = TRUE) + +/// Set the initial color of the eyes on insert to be the mob's previous eye color. +/obj/item/organ/internal/eyes/robotic/glow/Insert(mob/living/carbon/eye_recipient, special = FALSE, drop_if_replaced = FALSE) + . = ..() + current_color_string = old_eye_color_left + current_left_color_string = old_eye_color_left + current_right_color_string = old_eye_color_right + +/obj/item/organ/internal/eyes/robotic/glow/on_insert(mob/living/carbon/eye_recipient) + . = ..() + deactivate(close_ui = TRUE) + eye.forceMove(eye_recipient) + +/obj/item/organ/internal/eyes/robotic/glow/on_remove(mob/living/carbon/eye_owner) + deactivate(eye_owner, close_ui = TRUE) + eye.forceMove(src) + return ..() + +/obj/item/organ/internal/eyes/robotic/glow/ui_state(mob/user) + return GLOB.default_state + +/obj/item/organ/internal/eyes/robotic/glow/ui_status(mob/user) + if(!QDELETED(owner)) + if(owner == user) + return min( + ui_status_user_is_abled(user, src), + ui_status_only_living(user), + ) + else return UI_CLOSE + return ..() + +/obj/item/organ/internal/eyes/robotic/glow/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "HighLuminosityEyesMenu") + ui.autoupdate = FALSE + ui.open() + +/obj/item/organ/internal/eyes/robotic/glow/ui_data(mob/user) + var/list/data = list() + + data["eyeColor"] = list( + mode = eye_color_mode, + hasOwner = owner ? TRUE : FALSE, + left = current_left_color_string, + right = current_right_color_string, + ) + data["lightColor"] = current_color_string + data["range"] = eye.light_range + + return data + +/obj/item/organ/internal/eyes/robotic/glow/ui_act(action, list/params, datum/tgui/ui) + . = ..() + if(.) + return + + switch(action) + if("set_range") + var/new_range = params["new_range"] + set_beam_range(new_range) + return TRUE + if("pick_color") + var/new_color = input( + usr, + "Choose eye color color:", + "High Luminosity Eyes Menu", + current_color_string + ) as color|null + if(new_color) + var/to_update = params["to_update"] + set_beam_color(new_color, to_update) + return TRUE + if("enter_color") + var/new_color = lowertext(params["new_color"]) + var/to_update = params["to_update"] + set_beam_color(new_color, to_update, sanitize = TRUE) + return TRUE + if("random_color") + var/to_update = params["to_update"] + randomize_color(to_update) + return TRUE + if("toggle_eye_color") + toggle_eye_color_mode() + return TRUE + +/obj/item/organ/internal/eyes/robotic/glow/ui_action_click(mob/user, action) + if(istype(action, /datum/action/item_action/organ_action/toggle)) + toggle_active() + else if(istype(action, /datum/action/item_action/organ_action/use)) + ui_interact(user) + +/** + * Activates the light + * + * Turns on the attached flashlight object, updates the mob overlay to be added. + */ +/obj/item/organ/internal/eyes/robotic/glow/proc/activate() + eye.on = TRUE + if(eye.light_range) // at range 0 we are just going to make the eyes glow emissively, no light overlay + eye.set_light_on(TRUE) + update_mob_eye_color() + +/** + * Deactivates the light + * + * Turns off the attached flashlight object, closes UIs, updates the mob overlay to be removed. + * Arguments: + * * mob/living/carbon/eye_owner - the mob who the eyes belong to + * * close_ui - whether or not to close the ui + */ +/obj/item/organ/internal/eyes/robotic/glow/proc/deactivate(mob/living/carbon/eye_owner = owner, close_ui = FALSE) + if(close_ui) + SStgui.close_uis(src) + eye.on = FALSE + eye.set_light_on(FALSE) + update_mob_eye_color(eye_owner) + +/** + * Randomizes the light color + * + * Picks a random color and sets the beam color to that + * Arguments: + * * to_update - whether we are setting the color for the light beam itself, or the individual eyes + */ +/obj/item/organ/internal/eyes/robotic/glow/proc/randomize_color(to_update = UPDATE_LIGHT) + var/new_color = "#" + for(var/i in 1 to 3) + new_color += num2hex(rand(0, 255), 2) + set_beam_color(new_color, to_update) + +/** + * Setter function for the light's range + * + * Sets the light range of the attached flashlight object + * Includes some 'unique' logic to accomodate for some quirks of the lighting system + * Arguments: + * * new_range - the new range to set + */ +/obj/item/organ/internal/eyes/robotic/glow/proc/set_beam_range(new_range) + var/old_light_range = eye.light_range + if(old_light_range == 0 && new_range > 0 && eye.on) // turn bring back the light overlay if we were previously at 0 (aka emissive eyes only) + eye.light_on = FALSE // this is stupid, but this has to be FALSE for set_light_on() to work. + eye.set_light_on(TRUE) + eye.set_light_range(clamp(new_range, 0, max_light_beam_distance)) + +/** + * Setter function for the light's color + * + * Sets the light color of the attached flashlight object. Sets the eye color vars of this eye organ as well and then updates the mob's eye color. + * Arguments: + * * newcolor - the new color hex string to set + * * to_update - whether we are setting the color for the light beam itself, or the individual eyes + * * sanitize - whether the hex string should be sanitized + */ +/obj/item/organ/internal/eyes/robotic/glow/proc/set_beam_color(newcolor, to_update = UPDATE_LIGHT, sanitize = FALSE) + var/newcolor_string + if(sanitize) + newcolor_string = sanitize_hexcolor(newcolor) + else + newcolor_string = newcolor + switch(to_update) + if(UPDATE_LIGHT) + current_color_string = newcolor_string + eye.set_light_color(newcolor_string) + if(UPDATE_EYES_LEFT) + current_left_color_string = newcolor_string + if(UPDATE_EYES_RIGHT) + current_right_color_string = newcolor_string + + update_mob_eye_color() + +/** + * Toggle the attached flashlight object on or off + */ +/obj/item/organ/internal/eyes/robotic/glow/proc/toggle_active() + if(eye.on) + deactivate() + else + activate() + +/** + * Toggles for the eye color mode + * + * Toggles the eye color mode on or off and then calls an update on the mob's eye color + */ +/obj/item/organ/internal/eyes/robotic/glow/proc/toggle_eye_color_mode() + eye_color_mode = !eye_color_mode + update_mob_eye_color() + +/** + * Updates the mob eye color + * + * Updates the eye color to reflect on the mob's body if it's possible to do so + * Arguments: + * * mob/living/carbon/eye_owner - the mob to update the eye color appearance of + */ +/obj/item/organ/internal/eyes/robotic/glow/proc/update_mob_eye_color(mob/living/carbon/eye_owner = owner) + switch(eye_color_mode) + if(MATCH_LIGHT_COLOR) + eye_color_left = current_color_string + eye_color_right = current_color_string + if(USE_CUSTOM_COLOR) + eye_color_left = current_left_color_string + eye_color_right = current_right_color_string + + if(QDELETED(eye_owner) || !ishuman(eye_owner)) //Other carbon mobs don't have eye color. + return + + if(!eye.on) + eye_icon_state = initial(eye_icon_state) + overlay_ignore_lighting = FALSE + else + overlay_ignore_lighting = TRUE + eye_icon_state = base_eye_state + + var/obj/item/bodypart/head/head = eye_owner.get_bodypart(BODY_ZONE_HEAD) //if we have eyes we definently have a head anyway + var/previous_flags = head.head_flags + head.head_flags = previous_flags | HEAD_EYECOLOR + eye_owner.dna.species.handle_body(eye_owner) + head.head_flags = previous_flags + +#undef MATCH_LIGHT_COLOR +#undef USE_CUSTOM_COLOR +#undef UPDATE_LIGHT +#undef UPDATE_EYES_LEFT +#undef UPDATE_EYES_RIGHT + +/obj/item/organ/internal/eyes/moth + name = "moth eyes" + desc = "These eyes seem to have increased sensitivity to bright light, with no improvement to low light vision." + eye_icon_state = "motheyes" + icon_state = "eyeballs-moth" + flash_protect = FLASH_PROTECTION_SENSITIVE + +/obj/item/organ/internal/eyes/robotic/moth + name = "robotic moth eyes" + eye_icon_state = "motheyes" + icon_state = "eyeballs-cybermoth" + desc = "Your vision is augmented. Much like actual moth eyes, very sensitive to bright lights." + flash_protect = FLASH_PROTECTION_SENSITIVE + +/obj/item/organ/internal/eyes/robotic/basic/moth + name = "basic robotic moth eyes" + eye_icon_state = "motheyes" + icon_state = "eyeballs-cybermoth" + flash_protect = FLASH_PROTECTION_SENSITIVE + +/obj/item/organ/internal/eyes/robotic/xray/moth + name = "robotic eyes" + eye_icon_state = "motheyes" + icon_state = "eyeballs-cybermoth" + desc = "These cybernetic imitation moth eyes will give you X-ray vision. Blinking is futile. Much like actual moth eyes, very sensitive to bright lights." + flash_protect = FLASH_PROTECTION_SENSITIVE + +/obj/item/organ/internal/eyes/robotic/shield/moth + name = "shielded robotic moth eyes" + eye_icon_state = "motheyes" + icon_state = "eyeballs-cybermoth" + +/obj/item/organ/internal/eyes/robotic/glow/moth + name = "High Luminosity Moth Eyes" + eye_icon_state = "motheyes" + base_eye_state = "eyes_mothglow" + icon_state = "eyeballs-cybermoth" + desc = "Special glowing eyes, to be one with the lamp. Much like actual moth eyes, very sensitive to bright lights." + flash_protect = FLASH_PROTECTION_SENSITIVE + +/obj/item/organ/internal/eyes/robotic/thermals/moth //we inherit flash weakness from thermals + name = "thermal moth eyes" + eye_icon_state = "motheyes" + icon_state = "eyeballs-cybermoth" + +/obj/item/organ/internal/eyes/snail + name = "snail eyes" + desc = "These eyes seem to have a large range, but might be cumbersome with glasses." + eye_icon_state = "snail_eyes" + icon_state = "snail_eyeballs" + +/obj/item/organ/internal/eyes/jelly + name = "jelly eyes" + desc = "These eyes are made of a soft jelly. Unlike all other eyes, though, there are three of them." + eye_icon_state = "jelleyes" + icon_state = "eyeballs-jelly" + +/obj/item/organ/internal/eyes/night_vision/maintenance_adapted + name = "adapted eyes" + desc = "These red eyes look like two foggy marbles. They give off a particularly worrying glow in the dark." + flash_protect = FLASH_PROTECTION_HYPER_SENSITIVE + eye_color_left = "f00" + eye_color_right = "f00" + icon_state = "adapted_eyes" + eye_icon_state = "eyes_glow" + overlay_ignore_lighting = TRUE + low_light_cutoff = list(5, 12, 20) + medium_light_cutoff = list(15, 20, 30) + high_light_cutoff = list(30, 35, 50) + var/obj/item/flashlight/eyelight/adapted/adapt_light + +/obj/item/organ/internal/eyes/night_vision/maintenance_adapted/on_insert(mob/living/carbon/eye_owner) + . = ..() + //add lighting + if(!adapt_light) + adapt_light = new /obj/item/flashlight/eyelight/adapted() + adapt_light.on = TRUE + adapt_light.forceMove(eye_owner) + adapt_light.update_brightness(eye_owner) + ADD_TRAIT(eye_owner, TRAIT_UNNATURAL_RED_GLOWY_EYES, ORGAN_TRAIT) + +/obj/item/organ/internal/eyes/night_vision/maintenance_adapted/on_life(seconds_per_tick, times_fired) + if(!owner.is_blind() && isturf(owner.loc) && owner.has_light_nearby(light_amount=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!")) + apply_organ_damage(10) //blind quickly + playsound(owner, 'sound/machines/grill/grillsizzle.ogg', 50) + else + apply_organ_damage(-10) //heal quickly + . = ..() + +/obj/item/organ/internal/eyes/night_vision/maintenance_adapted/Remove(mob/living/carbon/unadapted, special = FALSE) + //remove lighting + adapt_light.on = FALSE + adapt_light.update_brightness(unadapted) + adapt_light.forceMove(src) + REMOVE_TRAIT(unadapted, TRAIT_UNNATURAL_RED_GLOWY_EYES, ORGAN_TRAIT) + return ..() diff --git a/code/modules/surgery/organs/internal/heart/_heart.dm b/code/modules/surgery/organs/internal/heart/_heart.dm new file mode 100644 index 0000000000000..fb97ca7eda00b --- /dev/null +++ b/code/modules/surgery/organs/internal/heart/_heart.dm @@ -0,0 +1,225 @@ +/obj/item/organ/internal/heart + name = "heart" + desc = "I feel bad for the heartless bastard who lost this." + icon_state = "heart-on" + base_icon_state = "heart" + visual = FALSE + zone = BODY_ZONE_CHEST + slot = ORGAN_SLOT_HEART + item_flags = NO_BLOOD_ON_ITEM + healing_factor = STANDARD_ORGAN_HEALING + decay_factor = 2.5 * STANDARD_ORGAN_DECAY //designed to fail around 6 minutes after death + + 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 + +/obj/item/organ/internal/heart/update_icon_state() + icon_state = "[base_icon_state]-[beating ? "on" : "off"]" + return ..() + +/obj/item/organ/internal/heart/Remove(mob/living/carbon/heartless, special = 0) + . = ..() + if(!special) + addtimer(CALLBACK(src, PROC_REF(stop_if_unowned)), 120) + +/obj/item/organ/internal/heart/proc/stop_if_unowned() + if(!owner) + Stop() + +/obj/item/organ/internal/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/internal/heart/proc/Stop() + beating = FALSE + update_appearance() + return TRUE + +/obj/item/organ/internal/heart/proc/Restart() + beating = TRUE + update_appearance() + return TRUE + +/obj/item/organ/internal/heart/OnEatFrom(eater, feeder) + . = ..() + beating = FALSE + update_appearance() + +/obj/item/organ/internal/heart/on_life(seconds_per_tick, times_fired) + ..() + + // If the owner doesn't need a heart, we don't need to do anything with it. + if(!owner.needs_heart()) + 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 == CONSCIOUS) + 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/internal/heart/get_availability(datum/species/owner_species, mob/living/owner_mob) + return owner_species.mutantheart + +/obj/item/organ/internal/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 + var/pump_delay = 3 SECONDS + var/blood_loss = BLOOD_VOLUME_NORMAL * 0.2 + var/heal_brute = 0 + var/heal_burn = 0 + var/heal_oxy = 0 + +/obj/item/organ/internal/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 ..() + +/obj/item/organ/internal/heart/cursed/on_insert(mob/living/carbon/accursed) + . = ..() + accursed.AddComponent(/datum/component/manual_heart, pump_delay = pump_delay, blood_loss = blood_loss, heal_brute = heal_brute, heal_burn = heal_burn, heal_oxy = heal_oxy) + +/obj/item/organ/internal/heart/cursed/Remove(mob/living/carbon/accursed, special = FALSE) + . = ..() + qdel(accursed.GetComponent(/datum/component/manual_heart)) + +/obj/item/organ/internal/heart/cybernetic + name = "basic cybernetic heart" + desc = "A basic electronic device designed to mimic the functions of an organic human heart." + icon_state = "heart-c-on" + base_icon_state = "heart-c" + organ_flags = ORGAN_ROBOTIC + maxHealth = STANDARD_ORGAN_THRESHOLD*0.75 //This also hits defib timer, so a bit higher than its less important counterparts + failing_desc = "seems to be broken." + + var/dose_available = FALSE + var/rid = /datum/reagent/medicine/epinephrine + var/ramount = 10 + var/emp_vulnerability = 80 //Chance of permanent effects if emp-ed. + +/obj/item/organ/internal/heart/cybernetic/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + // Some effects are byassed if our owner (should it exist) doesn't need a heart + var/owner_needs_us = owner?.needs_heart() + + if(owner_needs_us && !COOLDOWN_FINISHED(src, severe_cooldown)) //So we cant just spam emp to kill people. + owner.set_dizzy_if_lower(20 SECONDS) + owner.losebreath += 10 + COOLDOWN_START(src, severe_cooldown, 20 SECONDS) + + if(prob(emp_vulnerability/severity)) //Chance of permanent effects + organ_flags |= ORGAN_EMP //Starts organ faliure - gonna need replacing soon. + Stop() + addtimer(CALLBACK(src, PROC_REF(Restart)), 10 SECONDS) + if(owner_needs_us) + 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!"), + ) + +/obj/item/organ/internal/heart/cybernetic/on_life(seconds_per_tick, times_fired) + . = ..() + if(dose_available && owner.health <= owner.crit_threshold && !owner.reagents.has_reagent(rid)) + used_dose() + +/obj/item/organ/internal/heart/cybernetic/proc/used_dose() + owner.reagents.add_reagent(rid, ramount) + dose_available = FALSE + +/obj/item/organ/internal/heart/cybernetic/tier2 + 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-on" + base_icon_state = "heart-c-u" + maxHealth = 1.5 * STANDARD_ORGAN_THRESHOLD + dose_available = TRUE + emp_vulnerability = 40 + +/obj/item/organ/internal/heart/cybernetic/tier3 + 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-on" + base_icon_state = "heart-c-u2" + maxHealth = 2 * STANDARD_ORGAN_THRESHOLD + dose_available = TRUE + emp_vulnerability = 20 + +/obj/item/organ/internal/heart/cybernetic/tier3/used_dose() + . = ..() + addtimer(VARSET_CALLBACK(src, dose_available, TRUE), 5 MINUTES) + +/obj/item/organ/internal/heart/cybernetic/surplus + name = "surplus prosthetic heart" + desc = "A fragile mockery of a human heart that resembles a water pump more than an actual heart. \ + Offers no protection against EMPs." + icon_state = "heart-c-s-on" + base_icon_state = "heart-c-s" + maxHealth = STANDARD_ORGAN_THRESHOLD*0.5 + emp_vulnerability = 100 + +//surplus organs are so awful that they explode when removed, unless failing +/obj/item/organ/internal/heart/cybernetic/surplus/Initialize(mapload) + . = ..() + AddElement(/datum/element/dangerous_surgical_removal) + +/obj/item/organ/internal/heart/freedom + name = "heart of freedom" + desc = "This heart pumps with the passion to give... something freedom." + organ_flags = ORGAN_ROBOTIC //the power of freedom prevents heart attacks + /// The cooldown until the next time this heart can give the host an adrenaline boost. + COOLDOWN_DECLARE(adrenaline_cooldown) + +/obj/item/organ/internal/heart/freedom/on_life(seconds_per_tick, times_fired) + . = ..() + if(owner.health < 5 && COOLDOWN_FINISHED(src, adrenaline_cooldown)) + 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(brute = 15, burn = 15, required_bodytype = BODYTYPE_ORGANIC) + if(owner.reagents.get_reagent_amount(/datum/reagent/medicine/ephedrine) < 20) + owner.reagents.add_reagent(/datum/reagent/medicine/ephedrine, 10) + diff --git a/code/modules/surgery/organs/internal/heart/heart_ethereal.dm b/code/modules/surgery/organs/internal/heart/heart_ethereal.dm new file mode 100644 index 0000000000000..bb0b30ddd6286 --- /dev/null +++ b/code/modules/surgery/organs/internal/heart/heart_ethereal.dm @@ -0,0 +1,245 @@ +/obj/item/organ/internal/heart/ethereal + name = "crystal core" + icon_state = "ethereal_heart" //Welp. At least it's more unique in functionaliy. + visual = TRUE //This is used by the ethereal species for color + desc = "A crystal-like organ that functions similarly to a heart for Ethereals. It can revive its owner." + + ///Cooldown for the next time we can crystalize + COOLDOWN_DECLARE(crystalize_cooldown) + ///Timer ID for when we will be crystalized, If not preparing this will be null. + var/crystalize_timer_id + ///The current crystal the ethereal is in, if any + var/obj/structure/ethereal_crystal/current_crystal + ///Damage taken during crystalization, resets after it ends + var/crystalization_process_damage = 0 + ///Color of the heart, is set by the species on gain + var/ethereal_color = "#9c3030" + +/obj/item/organ/internal/heart/ethereal/Initialize(mapload) + . = ..() + add_atom_colour(ethereal_color, FIXED_COLOUR_PRIORITY) + +/obj/item/organ/internal/heart/ethereal/Insert(mob/living/carbon/heart_owner, special = FALSE, drop_if_replaced = TRUE) + . = ..() + if(!.) + return + RegisterSignal(heart_owner, COMSIG_MOB_STATCHANGE, PROC_REF(on_stat_change)) + RegisterSignal(heart_owner, COMSIG_LIVING_POST_FULLY_HEAL, PROC_REF(on_owner_fully_heal)) + RegisterSignal(heart_owner, COMSIG_QDELETING, PROC_REF(owner_deleted)) + +/obj/item/organ/internal/heart/ethereal/Remove(mob/living/carbon/heart_owner, special = FALSE) + UnregisterSignal(heart_owner, list(COMSIG_MOB_STATCHANGE, COMSIG_LIVING_POST_FULLY_HEAL, COMSIG_QDELETING)) + REMOVE_TRAIT(heart_owner, TRAIT_CORPSELOCKED, SPECIES_TRAIT) + stop_crystalization_process(heart_owner) + QDEL_NULL(current_crystal) + return ..() + +/obj/item/organ/internal/heart/ethereal/update_overlays() + . = ..() + var/mutable_appearance/shine = mutable_appearance(icon, icon_state = "[icon_state]_shine") + shine.appearance_flags = RESET_COLOR //No color on this, just pure white + . += shine + +/obj/item/organ/internal/heart/ethereal/proc/on_owner_fully_heal(mob/living/carbon/healed, heal_flags) + SIGNAL_HANDLER + + QDEL_NULL(current_crystal) //Kicks out the ethereal + +///Ran when examined while crystalizing, gives info about the amount of time left +/obj/item/organ/internal/heart/ethereal/proc/on_examine(mob/living/carbon/human/examined_human, mob/user, list/examine_list) + SIGNAL_HANDLER + + if(!crystalize_timer_id) + return + + switch(timeleft(crystalize_timer_id)) + if(0 to CRYSTALIZE_STAGE_ENGULFING) + examine_list += span_warning("Crystals are almost engulfing [examined_human]! ") + if(CRYSTALIZE_STAGE_ENGULFING to CRYSTALIZE_STAGE_ENCROACHING) + examine_list += span_notice("Crystals are starting to cover [examined_human]. ") + if(CRYSTALIZE_STAGE_SMALL to INFINITY) + examine_list += span_notice("Some crystals are coming out of [examined_human]. ") + +///On stat changes, if the victim is no longer dead but they're crystalizing, cancel it, if they become dead, start the crystalizing process if possible +/obj/item/organ/internal/heart/ethereal/proc/on_stat_change(mob/living/victim, new_stat) + SIGNAL_HANDLER + + if(new_stat != DEAD) + if(crystalize_timer_id) + stop_crystalization_process(victim) + return + + + if(QDELETED(victim) || HAS_TRAIT(victim, TRAIT_SUICIDED)) + return //lol rip + + if(!COOLDOWN_FINISHED(src, crystalize_cooldown)) + return //lol double rip + + if(HAS_TRAIT(victim, TRAIT_CANNOT_CRYSTALIZE)) + return // no reviving during mafia, or other inconvenient times. + + to_chat(victim, span_nicegreen("Crystals start forming around your dead body.")) + victim.visible_message(span_notice("Crystals start forming around [victim]."), ignored_mobs = victim) + + ADD_TRAIT(victim, TRAIT_CORPSELOCKED, SPECIES_TRAIT) + + crystalize_timer_id = addtimer(CALLBACK(src, PROC_REF(crystalize), victim), CRYSTALIZE_PRE_WAIT_TIME, TIMER_STOPPABLE) + + RegisterSignal(victim, COMSIG_HUMAN_DISARM_HIT, PROC_REF(reset_crystalizing)) + RegisterSignal(victim, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine), override = TRUE) + RegisterSignal(victim, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_take_damage)) + +///Ran when disarmed, prevents the ethereal from reviving +/obj/item/organ/internal/heart/ethereal/proc/reset_crystalizing(mob/living/defender, mob/living/attacker, zone) + SIGNAL_HANDLER + defender.visible_message( + span_notice("The crystals on [defender] are gently broken off."), + span_notice("The crystals on your corpse are gently broken off, and will need some time to recover."), + ) + deltimer(crystalize_timer_id) + crystalize_timer_id = addtimer(CALLBACK(src, PROC_REF(crystalize), defender), CRYSTALIZE_DISARM_WAIT_TIME, TIMER_STOPPABLE) //Lets us restart the timer on disarm + +///Actually spawns the crystal which puts the ethereal in it. +/obj/item/organ/internal/heart/ethereal/proc/crystalize(mob/living/ethereal) + + var/location = ethereal.loc + + if(!COOLDOWN_FINISHED(src, crystalize_cooldown) || ethereal.stat != DEAD) + return //Should probably not happen, but lets be safe. + + if(ismob(location) || isitem(location) || iseffect(location) || HAS_TRAIT_FROM(src, TRAIT_HUSK, CHANGELING_DRAIN)) //Stops crystallization if they are eaten by a dragon, turned into a legion, consumed by his grace, etc. + to_chat(ethereal, span_warning("You were unable to finish your crystallization, for obvious reasons.")) + stop_crystalization_process(ethereal, FALSE) + return + COOLDOWN_START(src, crystalize_cooldown, INFINITY) //Prevent cheeky double-healing until we get out, this is against stupid admemery + current_crystal = new(get_turf(ethereal), src) + stop_crystalization_process(ethereal, TRUE) + +///Stop the crystalization process, unregistering any signals and resetting any variables. +/obj/item/organ/internal/heart/ethereal/proc/stop_crystalization_process(mob/living/ethereal, succesful = FALSE) + UnregisterSignal(ethereal, COMSIG_HUMAN_DISARM_HIT) + UnregisterSignal(ethereal, COMSIG_ATOM_EXAMINE) + UnregisterSignal(ethereal, COMSIG_MOB_APPLY_DAMAGE) + + crystalization_process_damage = 0 //Reset damage taken during crystalization + + if(!succesful) + REMOVE_TRAIT(ethereal, TRAIT_CORPSELOCKED, SPECIES_TRAIT) + QDEL_NULL(current_crystal) + + if(crystalize_timer_id) + deltimer(crystalize_timer_id) + crystalize_timer_id = null + +/obj/item/organ/internal/heart/ethereal/proc/owner_deleted(datum/source) + SIGNAL_HANDLER + + stop_crystalization_process(owner) + return + +///Lets you stop the process with enough brute damage +/obj/item/organ/internal/heart/ethereal/proc/on_take_damage(datum/source, damage, damagetype, def_zone) + SIGNAL_HANDLER + if(damagetype != BRUTE) + return + + crystalization_process_damage += damage + + if(crystalization_process_damage < BRUTE_DAMAGE_REQUIRED_TO_STOP_CRYSTALIZATION) + return + + var/mob/living/carbon/human/ethereal = source + + ethereal.visible_message( + span_notice("The crystals on [ethereal] are completely shattered and stopped growing."), + span_warning("The crystals on your body have completely broken."), + ) + + stop_crystalization_process(ethereal) + +/obj/structure/ethereal_crystal + name = "ethereal resurrection crystal" + desc = "It seems to contain the corpse of an ethereal mending its wounds." + icon = 'icons/mob/effects/ethereal_crystal.dmi' + icon_state = "ethereal_crystal" + damage_deflection = 0 + max_integrity = 100 + resistance_flags = FIRE_PROOF + density = TRUE + anchored = TRUE + ///The organ this crystal belongs to + var/obj/item/organ/internal/heart/ethereal/ethereal_heart + ///Timer for the healing process. Stops if destroyed. + var/crystal_heal_timer + ///Is the crystal still being built? True by default, gets changed after a timer. + var/being_built = TRUE + +/obj/structure/ethereal_crystal/relaymove() + return + +/obj/structure/ethereal_crystal/Initialize(mapload, obj/item/organ/internal/heart/ethereal/ethereal_heart) + . = ..() + if(!ethereal_heart) + stack_trace("Our crystal has no related heart") + return INITIALIZE_HINT_QDEL + src.ethereal_heart = ethereal_heart + ethereal_heart.owner.visible_message(span_notice("The crystals fully encase [ethereal_heart.owner]!")) + to_chat(ethereal_heart.owner, span_notice("You are encased in a huge crystal!")) + playsound(get_turf(src), 'sound/effects/ethereal_crystalization.ogg', 50) + var/atom/movable/possible_chair = ethereal_heart.owner.buckled + possible_chair?.unbuckle_mob(ethereal_heart.owner, force = TRUE) + ethereal_heart.owner.forceMove(src) //put that ethereal in + add_atom_colour(ethereal_heart.ethereal_color, FIXED_COLOUR_PRIORITY) + crystal_heal_timer = addtimer(CALLBACK(src, PROC_REF(heal_ethereal)), CRYSTALIZE_HEAL_TIME, TIMER_STOPPABLE) + set_light(4, 10, ethereal_heart.ethereal_color) + update_icon() + flick("ethereal_crystal_forming", src) + addtimer(CALLBACK(src, PROC_REF(start_crystalization)), 1 SECONDS) + +/obj/structure/ethereal_crystal/proc/start_crystalization() + being_built = FALSE + update_icon() + +/obj/structure/ethereal_crystal/atom_destruction(damage_flag) + playsound(get_turf(ethereal_heart.owner), 'sound/effects/ethereal_revive_fail.ogg', 100) + return ..() + +/obj/structure/ethereal_crystal/Destroy() + set_light(0) + if(!ethereal_heart) + return ..() + + ethereal_heart.current_crystal = null + COOLDOWN_START(ethereal_heart, crystalize_cooldown, CRYSTALIZE_COOLDOWN_LENGTH) + ethereal_heart.owner.forceMove(get_turf(src)) + REMOVE_TRAIT(ethereal_heart.owner, TRAIT_CORPSELOCKED, SPECIES_TRAIT) + deltimer(crystal_heal_timer) + visible_message(span_notice("The crystals shatters, causing [ethereal_heart.owner] to fall out.")) + return ..() + +/obj/structure/ethereal_crystal/update_overlays() + . = ..() + if(!being_built) + var/mutable_appearance/shine = mutable_appearance(icon, icon_state = "[icon_state]_shine") + shine.appearance_flags = RESET_COLOR //No color on this, just pure white + . += shine + +/obj/structure/ethereal_crystal/proc/heal_ethereal() + var/datum/brain_trauma/picked_trauma + if(prob(10)) //10% chance for a severe trauma + picked_trauma = pick(subtypesof(/datum/brain_trauma/severe)) + else + picked_trauma = pick(subtypesof(/datum/brain_trauma/mild)) + + // revive will regenerate organs, so our heart refence is going to be null'd. Unreliable + var/mob/living/carbon/regenerating = ethereal_heart.owner + + playsound(get_turf(regenerating), 'sound/effects/ethereal_revive.ogg', 100) + to_chat(regenerating, span_notice("You burst out of the crystal with vigour... But at a cost.")) + regenerating.gain_trauma(picked_trauma, TRAUMA_RESILIENCE_ABSOLUTE) + regenerating.revive(HEAL_ALL & ~HEAL_REFRESH_ORGANS) + // revive calls fully heal -> deletes the crystal. + // this qdeleted check is just for sanity. + if(!QDELETED(src)) + qdel(src) diff --git a/code/modules/surgery/organs/internal/liver/_liver.dm b/code/modules/surgery/organs/internal/liver/_liver.dm new file mode 100755 index 0000000000000..4eb5c665db6fd --- /dev/null +++ b/code/modules/surgery/organs/internal/liver/_liver.dm @@ -0,0 +1,309 @@ +#define LIVER_DEFAULT_TOX_TOLERANCE 3 //amount of toxins the liver can filter out +#define LIVER_DEFAULT_TOX_RESISTANCE 1 //lower values lower how harmful toxins are to the liver +#define LIVER_FAILURE_STAGE_SECONDS 60 //amount of seconds before liver failure reaches a new stage +#define MAX_TOXIN_LIVER_DAMAGE 2 //the max damage the liver can recieve per second (~1 min at max damage will destroy liver) + +/obj/item/organ/internal/liver + name = "liver" + desc = "Pairing suggestion: chianti and fava beans." + icon_state = "liver" + visual = FALSE + w_class = WEIGHT_CLASS_SMALL + zone = BODY_ZONE_CHEST + slot = ORGAN_SLOT_LIVER + + maxHealth = STANDARD_ORGAN_THRESHOLD + healing_factor = STANDARD_ORGAN_HEALING + 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) + + /// Affects how much damage the liver takes from alcohol + var/alcohol_tolerance = ALCOHOL_RATE + /// The maximum volume of toxins the liver will ignore + var/toxTolerance = LIVER_DEFAULT_TOX_TOLERANCE + /// Modifies how much damage toxin deals to the liver + var/liver_resistance = LIVER_DEFAULT_TOX_RESISTANCE + var/filterToxins = TRUE //whether to filter toxins + var/operated = FALSE //whether the liver's been repaired with surgery and can be fixed again or not + +/obj/item/organ/internal/liver/Initialize(mapload) + . = ..() + // If the liver handles foods like a clown, it honks like a bike horn + // Don't think about it too much. + RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_COMEDY_METABOLISM), PROC_REF(on_add_comedy_metabolism)) + RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_COMEDY_METABOLISM), PROC_REF(on_remove_comedy_metabolism)) + +/* Signal handler for the liver gaining the TRAIT_COMEDY_METABOLISM trait + * + * Adds the "squeak" component, so clown livers will act just like their + * bike horns, and honk when you hit them with things, or throw them + * against things, or step on them. + * + * The removal of the component, if this liver loses that trait, is handled + * by the component itself. + */ +/obj/item/organ/internal/liver/proc/on_add_comedy_metabolism() + SIGNAL_HANDLER + + // Are clown "bike" horns made from the livers of ex-clowns? + // Would that make the clown more or less likely to honk it + AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 50, falloff_exponent = 20) + +/* Signal handler for the liver losing the TRAIT_COMEDY_METABOLISM trait + * + * Basically just removes squeak component + */ +/obj/item/organ/internal/liver/proc/on_remove_comedy_metabolism() + SIGNAL_HANDLER + + qdel(GetComponent(/datum/component/squeak)) + +/// Registers COMSIG_SPECIES_HANDLE_CHEMICAL from owner +/obj/item/organ/internal/liver/on_insert(mob/living/carbon/organ_owner, special) + . = ..() + RegisterSignal(organ_owner, COMSIG_SPECIES_HANDLE_CHEMICAL, PROC_REF(handle_chemical)) + +/// Unregisters COMSIG_SPECIES_HANDLE_CHEMICAL from owner +/obj/item/organ/internal/liver/on_remove(mob/living/carbon/organ_owner, special) + . = ..() + UnregisterSignal(organ_owner, COMSIG_SPECIES_HANDLE_CHEMICAL) + +/** + * This proc can be overriden by liver subtypes so they can handle certain chemicals in special ways. + * Return null to continue running the normal on_mob_life() for that reagent. + * Return COMSIG_MOB_STOP_REAGENT_CHECK to not run the normal metabolism effects. + * + * NOTE: If you return COMSIG_MOB_STOP_REAGENT_CHECK, that reagent will not be removed like normal! You must handle it manually. + **/ +/obj/item/organ/internal/liver/proc/handle_chemical(mob/living/carbon/organ_owner, datum/reagent/chem, seconds_per_tick, times_fired) + SIGNAL_HANDLER + +/obj/item/organ/internal/liver/examine(mob/user) + . = ..() + + if(HAS_MIND_TRAIT(user, TRAIT_ENTRAILS_READER) || isobserver(user)) + if(HAS_TRAIT(src, TRAIT_LAW_ENFORCEMENT_METABOLISM)) + . += span_info("Fatty deposits and sprinkle residue, imply that this is the liver of someone in security.") + if(HAS_TRAIT(src, TRAIT_CULINARY_METABOLISM)) + . += span_info("The high iron content and slight smell of garlic, implies that this is the liver of a cook.") + if(HAS_TRAIT(src, TRAIT_COMEDY_METABOLISM)) + . += span_info("A smell of bananas, a slippery sheen and [span_clown("honking")] when depressed, implies that this is the liver of a clown.") + if(HAS_TRAIT(src, TRAIT_MEDICAL_METABOLISM)) + . += span_info("Marks of stress and a faint whiff of medicinal alcohol, imply that this is the liver of a medical worker.") + if(HAS_TRAIT(src, TRAIT_ENGINEER_METABOLISM)) + . += span_info("Signs of radiation exposure and space adaption, implies that this is the liver of an engineer.") + if(HAS_TRAIT(src, TRAIT_BALLMER_SCIENTIST)) + . += span_info("Strange glowing residues, sprinklings of congealed solid plasma, and what seem to be tumors indicate this is the radiated liver of a scientist.") + if(HAS_TRAIT(src, TRAIT_MAINTENANCE_METABOLISM)) + . += span_info("A half-digested rat's tail (somehow), disgusting sludge, and the faint smell of Grey Bull imply this is what remains of an assistant's liver.") + if(HAS_TRAIT(src, TRAIT_CORONER_METABOLISM)) + . += span_info("An aroma of pickles and sea water, along with being remarkably well-preserved, imply this is what remains of a coroner's liver.") + + // royal trumps pretender royal + if(HAS_TRAIT(src, TRAIT_ROYAL_METABOLISM)) + . += span_info("A rich diet of luxury food, suppleness from soft beds, implies that this is the liver of a head of staff.") + else if(HAS_TRAIT(src, TRAIT_PRETENDER_ROYAL_METABOLISM)) + . += span_info("A diet of imitation caviar, and signs of insomnia, implies that this is the liver of someone who wants to be a head of staff.") + +/obj/item/organ/internal/liver/before_organ_replacement(obj/item/organ/replacement) + . = ..() + if(!istype(replacement, type)) + return + + var/datum/job/owner_job = owner.mind?.assigned_role + if(!owner_job || !LAZYLEN(owner_job.liver_traits)) + return + + // Transfer over liver traits from jobs, if we should have them + for(var/readded_trait in owner_job.liver_traits) + if(!HAS_TRAIT_FROM(src, readded_trait, JOB_TRAIT)) + continue + ADD_TRAIT(replacement, readded_trait, JOB_TRAIT) + +#define HAS_SILENT_TOXIN 0 //don't provide a feedback message if this is the only toxin present +#define HAS_NO_TOXIN 1 +#define HAS_PAINFUL_TOXIN 2 + +/obj/item/organ/internal/liver/on_life(seconds_per_tick, times_fired) + . = ..() + //If your liver is failing, then we use the liverless version of metabolize + if((organ_flags & ORGAN_FAILING) || HAS_TRAIT(owner, TRAIT_LIVERLESS_METABOLISM)) + owner.reagents.metabolize(owner, seconds_per_tick, times_fired, can_overdose = TRUE, liverless = TRUE) + return + + var/obj/belly = owner.get_organ_slot(ORGAN_SLOT_STOMACH) + var/list/cached_reagents = owner.reagents.reagent_list + var/liver_damage = 0 + var/provide_pain_message = HAS_NO_TOXIN + + if(filterToxins && !HAS_TRAIT(owner, TRAIT_TOXINLOVER)) + for(var/datum/reagent/toxin/toxin in cached_reagents) + if(toxin.affected_organ_flags && !(organ_flags & toxin.affected_organ_flags)) //this particular toxin does not affect this type of organ + continue + var/amount = round(toxin.volume, CHEMICAL_QUANTISATION_LEVEL) // this is an optimization + if(belly) + amount += belly.reagents.get_reagent_amount(toxin.type) + + // a 15u syringe is a nice baseline to scale lethality by + liver_damage += ((amount/15) * toxin.toxpwr * toxin.liver_damage_multiplier) / liver_resistance + + if(provide_pain_message != HAS_PAINFUL_TOXIN) + provide_pain_message = toxin.silent_toxin ? HAS_SILENT_TOXIN : HAS_PAINFUL_TOXIN + + owner.reagents.metabolize(owner, seconds_per_tick, times_fired, can_overdose = TRUE) + + if(liver_damage) + apply_organ_damage(min(liver_damage * seconds_per_tick , MAX_TOXIN_LIVER_DAMAGE * seconds_per_tick)) + + if(provide_pain_message && damage > 10 && SPT_PROB(damage/6, seconds_per_tick)) //the higher the damage the higher the probability + to_chat(owner, span_warning("You feel a dull pain in your abdomen.")) + + +/obj/item/organ/internal/liver/handle_failing_organs(seconds_per_tick) + if(HAS_TRAIT(owner, TRAIT_STABLELIVER) || HAS_TRAIT(owner, TRAIT_LIVERLESS_METABOLISM)) + return + return ..() + +/obj/item/organ/internal/liver/organ_failure(seconds_per_tick) + 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(VOMIT_CATEGORY_DEFAULT) + if(3) + to_chat(owner, span_userdanger("You feel painful acid in your throat!")) + owner.vomit(VOMIT_CATEGORY_BLOOD) + if(4) + to_chat(owner, span_userdanger("Overwhelming pain knocks you out!")) + owner.vomit(VOMIT_CATEGORY_BLOOD, 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(VOMIT_CATEGORY_BLOOD, 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 * seconds_per_tick,forced = TRUE) + owner.adjust_disgust(0.1 * seconds_per_tick) + + if(2 * LIVER_FAILURE_STAGE_SECONDS to 3 * LIVER_FAILURE_STAGE_SECONDS - 1) + owner.adjustToxLoss(0.4 * seconds_per_tick,forced = TRUE) + owner.adjust_drowsiness(0.5 SECONDS * seconds_per_tick) + owner.adjust_disgust(0.3 * seconds_per_tick) + + if(3 * LIVER_FAILURE_STAGE_SECONDS to 4 * LIVER_FAILURE_STAGE_SECONDS - 1) + owner.adjustToxLoss(0.6 * seconds_per_tick,forced = TRUE) + owner.adjustOrganLoss(pick(ORGAN_SLOT_HEART,ORGAN_SLOT_LUNGS,ORGAN_SLOT_STOMACH,ORGAN_SLOT_EYES,ORGAN_SLOT_EARS),0.2 * seconds_per_tick) + owner.adjust_drowsiness(1 SECONDS * seconds_per_tick) + owner.adjust_disgust(0.6 * seconds_per_tick) + + if(SPT_PROB(1.5, seconds_per_tick)) + owner.emote("drool") + + if(4 * LIVER_FAILURE_STAGE_SECONDS to INFINITY) + owner.adjustToxLoss(0.8 * seconds_per_tick,forced = TRUE) + owner.adjustOrganLoss(pick(ORGAN_SLOT_HEART,ORGAN_SLOT_LUNGS,ORGAN_SLOT_STOMACH,ORGAN_SLOT_EYES,ORGAN_SLOT_EARS),0.5 * seconds_per_tick) + owner.adjust_drowsiness(1.6 SECONDS * seconds_per_tick) + owner.adjust_disgust(1.2 * seconds_per_tick) + + if(SPT_PROB(3, seconds_per_tick)) + owner.emote("drool") + +/obj/item/organ/internal/liver/on_owner_examine(datum/source, mob/user, list/examine_list) + if(!ishuman(owner) || !(organ_flags & ORGAN_FAILING)) + return + + var/mob/living/carbon/human/humie_owner = owner + if(!humie_owner.get_organ_slot(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 [owner.p_they()] [owner.p_are()] 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()] [owner.p_do()]n't look like [owner.p_they()] will be alive for much longer.") + +/obj/item/organ/internal/liver/get_availability(datum/species/owner_species, mob/living/owner_mob) + return owner_species.mutantliver + +// alien livers can ignore up to 15u of toxins, but they take x3 liver damage +/obj/item/organ/internal/liver/alien + name = "alien liver" // doesnt matter for actual aliens because they dont take toxin damage + desc = "A liver that used to belong to a killer alien, who knows what it used to eat." + icon_state = "liver-x" // Same sprite as fly-person liver. + liver_resistance = 0.333 * LIVER_DEFAULT_TOX_RESISTANCE // -66% + toxTolerance = 15 // complete toxin immunity like xenos have would be too powerful + +/obj/item/organ/internal/liver/cybernetic + name = "basic cybernetic liver" + desc = "A very basic device designed to mimic the functions of a human liver. Handles toxins slightly worse than an organic liver." + failing_desc = "seems to be broken." + icon_state = "liver-c" + organ_flags = ORGAN_ROBOTIC + maxHealth = STANDARD_ORGAN_THRESHOLD*0.5 + toxTolerance = 2 + liver_resistance = 0.9 * LIVER_DEFAULT_TOX_RESISTANCE // -10% + var/emp_vulnerability = 80 //Chance of permanent effects if emp-ed. + +/obj/item/organ/internal/liver/cybernetic/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + if(!COOLDOWN_FINISHED(src, severe_cooldown)) //So we cant just spam emp to kill people. + owner.adjustToxLoss(10) + COOLDOWN_START(src, severe_cooldown, 10 SECONDS) + if(prob(emp_vulnerability/severity)) //Chance of permanent effects + organ_flags |= ORGAN_EMP //Starts organ faliure - gonna need replacing soon. + +/obj/item/organ/internal/liver/cybernetic/tier2 + name = "cybernetic liver" + desc = "An electronic device designed to mimic the functions of a human liver. Handles toxins slightly better than an organic liver." + icon_state = "liver-c-u" + maxHealth = 1.5 * STANDARD_ORGAN_THRESHOLD + toxTolerance = 5 //can shrug off up to 5u of toxins + liver_resistance = 1.2 * LIVER_DEFAULT_TOX_RESISTANCE // +20% + emp_vulnerability = 40 + +/obj/item/organ/internal/liver/cybernetic/tier3 + name = "upgraded cybernetic liver" + 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." + icon_state = "liver-c-u2" + alcohol_tolerance = ALCOHOL_RATE * 0.2 + maxHealth = 2 * STANDARD_ORGAN_THRESHOLD + toxTolerance = 10 //can shrug off up to 10u of toxins + liver_resistance = 1.5 * LIVER_DEFAULT_TOX_RESISTANCE // +50% + emp_vulnerability = 20 + +/obj/item/organ/internal/liver/cybernetic/surplus + name = "surplus prosthetic liver" + desc = "A very cheap prosthetic liver, mass produced for low-functioning alcoholics... It looks more like a water filter than \ + an actual liver. \ + Very fragile, absolutely terrible at filtering toxins and substantially weak to alcohol. \ + Offers no protection against EMPs." + icon_state = "liver-c-s" + maxHealth = STANDARD_ORGAN_THRESHOLD * 0.35 + alcohol_tolerance = ALCOHOL_RATE * 2 // can barely handle alcohol + toxTolerance = 1 //basically can't shrug off any toxins + liver_resistance = 0.75 * LIVER_DEFAULT_TOX_RESISTANCE // -25% + emp_vulnerability = 100 + +//surplus organs are so awful that they explode when removed, unless failing +/obj/item/organ/internal/liver/cybernetic/surplus/Initialize(mapload) + . = ..() + AddElement(/datum/element/dangerous_surgical_removal) + +#undef HAS_SILENT_TOXIN +#undef HAS_NO_TOXIN +#undef HAS_PAINFUL_TOXIN +#undef LIVER_DEFAULT_TOX_TOLERANCE +#undef LIVER_DEFAULT_TOX_RESISTANCE +#undef LIVER_FAILURE_STAGE_SECONDS +#undef MAX_TOXIN_LIVER_DAMAGE diff --git a/code/modules/surgery/organs/internal/liver/liver_golem.dm b/code/modules/surgery/organs/internal/liver/liver_golem.dm new file mode 100644 index 0000000000000..1ab3eabcd9cc5 --- /dev/null +++ b/code/modules/surgery/organs/internal/liver/liver_golem.dm @@ -0,0 +1,24 @@ +/** + * Golem liver + * Basically only exists to remove the nutriment factor from consumables, + * so golems can only consume minerals even when injecting reagents. + * + * Actually consuming golem food is handled by /obj/item/organ/internal/stomach/golem! + **/ +/obj/item/organ/internal/liver/golem + name = "porous rock" + desc = "A spongy rock capable of absorbing chemicals." + icon_state = "liver-p" + organ_flags = ORGAN_MINERAL + color = COLOR_GOLEM_GRAY + +/obj/item/organ/internal/liver/golem/handle_chemical(mob/living/carbon/organ_owner, datum/reagent/chem, seconds_per_tick, times_fired) + . = ..() + // parent returned COMSIG_MOB_STOP_REAGENT_CHECK or we are failing + if((. & COMSIG_MOB_STOP_REAGENT_CHECK) || (organ_flags & ORGAN_FAILING)) + return + // golems can only eat minerals + if(istype(chem, /datum/reagent/consumable) && !istype(chem, /datum/reagent/consumable/nutriment/mineral)) + var/datum/reagent/consumable/yummy_chem = chem + yummy_chem.nutriment_factor = 0 + return // Do normal metabolism diff --git a/code/modules/surgery/organs/internal/liver/liver_plasmaman.dm b/code/modules/surgery/organs/internal/liver/liver_plasmaman.dm new file mode 100644 index 0000000000000..be21968d659b8 --- /dev/null +++ b/code/modules/surgery/organs/internal/liver/liver_plasmaman.dm @@ -0,0 +1,28 @@ +/** + * Plasmaman liver + * Makes plasma and hot ice heal wounds, also makes gunpowder a hallucinogen. + **/ +/obj/item/organ/internal/liver/bone/plasmaman + name = "reagent processing crystal" + desc = "A large crystal that is somehow capable of metabolizing chemicals, these are found in plasmamen." + icon_state = "liver-p" + organ_flags = ORGAN_MINERAL + organ_traits = list(TRAIT_PLASMA_LOVER_METABOLISM) + milk_burn_healing = 0 + +/obj/item/organ/internal/liver/bone/plasmaman/handle_chemical(mob/living/carbon/organ_owner, datum/reagent/chem, seconds_per_tick, times_fired) + . = ..() + // parent returned COMSIG_MOB_STOP_REAGENT_CHECK or we are failing + if((. & COMSIG_MOB_STOP_REAGENT_CHECK) || (organ_flags & ORGAN_FAILING)) + return + // plasmamen use plasma to reform their bones or whatever + if(istype(chem, /datum/reagent/toxin/plasma) || istype(chem, /datum/reagent/toxin/hot_ice)) + for(var/datum/wound/iter_wound as anything in organ_owner.all_wounds) + iter_wound.on_xadone(4 * REM * seconds_per_tick) + return // Do normal metabolism + // plasmamen get high on gunpowder lol + if(istype(chem, /datum/reagent/gunpowder)) + organ_owner.set_timed_status_effect(15 SECONDS * seconds_per_tick, /datum/status_effect/drugginess) + if(organ_owner.get_timed_status_effect_duration(/datum/status_effect/hallucination) / 10 < chem.volume) + organ_owner.adjust_hallucinations(2.5 SECONDS * seconds_per_tick) + return // Do normal metabolism diff --git a/code/modules/surgery/organs/internal/liver/liver_skeleton.dm b/code/modules/surgery/organs/internal/liver/liver_skeleton.dm new file mode 100644 index 0000000000000..b57afd245f587 --- /dev/null +++ b/code/modules/surgery/organs/internal/liver/liver_skeleton.dm @@ -0,0 +1,53 @@ +/** + * Bone liver + * Gives the owner liverless metabolism, makes them vulnerable to bone hurting juice and + * makes milk heal them through meme magic. + **/ +/obj/item/organ/internal/liver/bone + name = "mass of bones" + desc = "You have no idea what this strange ball of bones does." + icon_state = "liver-bone" + organ_traits = list(TRAIT_STABLELIVER) + ///Var for brute healing via milk + var/milk_brute_healing = 2.5 + ///Var for burn healing via milk + var/milk_burn_healing = 2.5 + +/obj/item/organ/internal/liver/bone/handle_chemical(mob/living/carbon/organ_owner, datum/reagent/chem, seconds_per_tick, times_fired) + . = ..() + // parent returned COMSIG_MOB_STOP_REAGENT_CHECK or we are failing + if((. & COMSIG_MOB_STOP_REAGENT_CHECK) || (organ_flags & ORGAN_FAILING)) + return + if(istype(chem, /datum/reagent/toxin/bonehurtingjuice)) + organ_owner.adjustStaminaLoss(7.5 * REM * seconds_per_tick, updating_stamina = FALSE) + organ_owner.adjustBruteLoss(0.5 * REM * seconds_per_tick, updating_health = FALSE) + if(SPT_PROB(10, seconds_per_tick)) + switch(rand(1, 3)) + if(1) + INVOKE_ASYNC(organ_owner, TYPE_PROC_REF(/atom/movable, say), pick("oof.", "ouch.", "my bones.", "oof ouch.", "oof ouch my bones."), forced = chem.type) + if(2) + organ_owner.manual_emote(pick("oofs silently.", "looks like [organ_owner.p_their()] bones hurt.", "grimaces, as though [organ_owner.p_their()] bones hurt.")) + if(3) + to_chat(organ_owner, span_warning("Your bones hurt!")) + if(chem.overdosed) + if(SPT_PROB(2, seconds_per_tick)) //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/bodypart = organ_owner.get_bodypart(selected_part) //We're so sorry skeletons, you're so misunderstood + if(bodypart) + playsound(organ_owner, SFX_DESECRATION, 50, vary = TRUE) //You just want to socialize + organ_owner.visible_message(span_warning("[organ_owner] rattles loudly and flails around!!"), span_danger("Your bones hurt so much that your missing muscles spasm!!")) + INVOKE_ASYNC(organ_owner, TYPE_PROC_REF(/atom/movable, say), "OOF!!", forced = chem.type) + bodypart.receive_damage(brute = 200) //But I don't think we should + else + to_chat(organ_owner, span_warning("Your missing [parse_zone(selected_part)] aches from wherever you left it.")) + INVOKE_ASYNC(organ_owner, TYPE_PROC_REF(/mob, emote), "sigh") + organ_owner.reagents.remove_reagent(chem.type, chem.metabolization_rate * seconds_per_tick) + return COMSIG_MOB_STOP_REAGENT_CHECK // Stop metabolism + if(chem.type == /datum/reagent/consumable/milk) + if(chem.volume > 50) + organ_owner.reagents.remove_reagent(chem.type, (chem.volume - 50)) + to_chat(organ_owner, span_warning("The excess milk is dripping off your bones!")) + organ_owner.heal_bodypart_damage(milk_brute_healing * REM * seconds_per_tick, milk_burn_healing * REM * seconds_per_tick) + for(var/datum/wound/iter_wound as anything in organ_owner.all_wounds) + iter_wound.on_xadone(1 * REM * seconds_per_tick) + return // Do normal metabolism diff --git a/code/modules/surgery/organs/internal/lungs/_lungs.dm b/code/modules/surgery/organs/internal/lungs/_lungs.dm new file mode 100644 index 0000000000000..71dc305ac5f82 --- /dev/null +++ b/code/modules/surgery/organs/internal/lungs/_lungs.dm @@ -0,0 +1,984 @@ +/obj/item/organ/internal/lungs + name = "lungs" + icon_state = "lungs" + visual = FALSE + zone = BODY_ZONE_CHEST + slot = ORGAN_SLOT_LUNGS + gender = PLURAL + w_class = WEIGHT_CLASS_SMALL + + var/respiration_type = NONE // The type(s) of gas this lung needs for respiration + + healing_factor = STANDARD_ORGAN_HEALING + 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." + high_threshold_passed = "You feel some sort of constriction around your chest as your breathing becomes shallow and rapid." + now_fixed = "Your lungs seem to once again be able to hold air." + 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) + + /// Our previous breath's partial pressures, in the form gas id -> partial pressure + var/list/last_partial_pressures = list() + /// List of gas to treat as other gas, in the form list(inital_gas, treat_as, multiplier) + var/list/treat_as = list() + /// Assoc list of procs to run while a gas is present, in the form gas id -> proc_path + var/list/breath_present = list() + /// Assoc list of procs to run when a gas is immediately removed from the breath, in the form gas id -> proc_path + var/list/breath_lost = list() + /// Assoc list of procs to always run, in the form gas_id -> proc_path + var/list/breathe_always = list() + + /// Gas mixture to breath out when we're done processing a breath + /// Will get emptied out when it's all done + var/datum/gas_mixture/immutable/breath_out + + //Breath damage + //These thresholds are checked against what amounts to total_mix_pressure * (gas_type_mols/total_mols) + var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa + var/safe_oxygen_max = 0 + var/safe_nitro_min = 0 + var/safe_co2_max = 10 // Yes it's an arbitrary value who cares? + var/safe_plasma_min = 0 + ///How much breath partial pressure is a safe amount of plasma. 0 means that we are immune to plasma. + var/safe_plasma_max = 0.05 + var/n2o_para_min = 1 //Sleeping agent + var/n2o_sleep_min = 5 //Sleeping agent + var/BZ_trip_balls_min = 1 //BZ gas + var/BZ_brain_damage_min = 10 //Give people some room to play around without killing the station + var/gas_stimulation_min = 0.002 // For, Pluoxium, Nitrium and Freon + ///Minimum amount of healium to make you unconscious for 4 seconds + var/healium_para_min = 3 + ///Minimum amount of healium to knock you down for good + var/healium_sleep_min = 6 + ///Minimum amount of helium to affect speech + var/helium_speech_min = 5 + ///Whether these lungs react negatively to miasma + var/suffers_miasma = TRUE + // Vars for N2O/healium induced euphoria, stun, and sleep. + var/n2o_euphoria = EUPHORIA_LAST_FLAG + var/healium_euphoria = EUPHORIA_LAST_FLAG + + + var/oxy_breath_dam_min = MIN_TOXIC_GAS_DAMAGE + var/oxy_breath_dam_max = MAX_TOXIC_GAS_DAMAGE + var/oxy_damage_type = OXY + var/nitro_breath_dam_min = MIN_TOXIC_GAS_DAMAGE + var/nitro_breath_dam_max = MAX_TOXIC_GAS_DAMAGE + var/nitro_damage_type = OXY + var/co2_breath_dam_min = MIN_TOXIC_GAS_DAMAGE + var/co2_breath_dam_max = MAX_TOXIC_GAS_DAMAGE + var/co2_damage_type = OXY + var/plas_breath_dam_min = MIN_TOXIC_GAS_DAMAGE + var/plas_breath_dam_max = MAX_TOXIC_GAS_DAMAGE + var/plas_damage_type = TOX + + var/tritium_irradiation_moles_min = 1 + var/tritium_irradiation_moles_max = 15 + var/tritium_irradiation_probability_min = 10 + var/tritium_irradiation_probability_max = 60 + + var/cold_message = "your face freezing and an icicle forming" + var/cold_level_1_threshold = 260 + var/cold_level_2_threshold = 200 + var/cold_level_3_threshold = 120 + var/cold_level_1_damage = COLD_GAS_DAMAGE_LEVEL_1 //Keep in mind with gas damage levels, you can set these to be negative, if you want someone to heal, instead. + var/cold_level_2_damage = COLD_GAS_DAMAGE_LEVEL_2 + var/cold_level_3_damage = COLD_GAS_DAMAGE_LEVEL_3 + var/cold_damage_type = BURN + + var/hot_message = "your face burning and a searing heat" + var/heat_level_1_threshold = 360 + var/heat_level_2_threshold = 400 + var/heat_level_3_threshold = 1000 + var/heat_level_1_damage = HEAT_GAS_DAMAGE_LEVEL_1 + var/heat_level_2_damage = HEAT_GAS_DAMAGE_LEVEL_2 + var/heat_level_3_damage = HEAT_GAS_DAMAGE_LEVEL_3 + var/heat_damage_type = BURN + + var/crit_stabilizing_reagent = /datum/reagent/medicine/epinephrine + +// assign the respiration_type +/obj/item/organ/internal/lungs/Initialize(mapload) + . = ..() + breath_out = new(BREATH_VOLUME) + + if(safe_nitro_min) + respiration_type |= RESPIRATION_N2 + if(safe_oxygen_min) + respiration_type |= RESPIRATION_OXYGEN + if(safe_plasma_min) + respiration_type |= RESPIRATION_PLASMA + + // Sets up what gases we want to react to, and in what way + // always is always processed, while_present is called when the gas is in the breath, and on_loss is called right after a gas is lost + // The naming convention goes like this + // always : breath_{gas_type} + // safe/neutral while_present : consume_{gas_type} + // safe/neutral on_loss : lose_{gas_type} + // dangerous while_present : too_much_{gas_type} + // dangerous on_loss : safe_{gas_type} + // These are reccomendations, if something seems better feel free to ignore them. S a bit vibes based + if(safe_oxygen_min) + add_gas_reaction(/datum/gas/oxygen, always = PROC_REF(breathe_oxygen)) + if(safe_oxygen_max) + add_gas_reaction(/datum/gas/oxygen, while_present = PROC_REF(too_much_oxygen), on_loss = PROC_REF(safe_oxygen)) + add_gas_reaction(/datum/gas/pluoxium, while_present = PROC_REF(consume_pluoxium)) + // We treat a mole of ploux as 8 moles of oxygen + add_gas_relationship(/datum/gas/pluoxium, /datum/gas/oxygen, 8) + if(safe_nitro_min) + add_gas_reaction(/datum/gas/nitrogen, always = PROC_REF(breathe_nitro)) + if(safe_co2_max) + add_gas_reaction(/datum/gas/carbon_dioxide, while_present = PROC_REF(too_much_co2), on_loss = PROC_REF(safe_co2)) + if(safe_plasma_min) + add_gas_reaction(/datum/gas/plasma, always = PROC_REF(breathe_plasma)) + if(safe_plasma_max) + add_gas_reaction(/datum/gas/plasma, while_present = PROC_REF(too_much_plasma), on_loss = PROC_REF(safe_plasma)) + add_gas_reaction(/datum/gas/bz, while_present = PROC_REF(too_much_bz)) + add_gas_reaction(/datum/gas/freon, while_present = PROC_REF(too_much_freon)) + add_gas_reaction(/datum/gas/halon, while_present = PROC_REF(too_much_halon)) + add_gas_reaction(/datum/gas/healium, while_present = PROC_REF(consume_healium), on_loss = PROC_REF(lose_healium)) + add_gas_reaction(/datum/gas/helium, while_present = PROC_REF(consume_helium), on_loss = PROC_REF(lose_helium)) + add_gas_reaction(/datum/gas/hypernoblium, while_present = PROC_REF(consume_hypernoblium)) + if(suffers_miasma) + add_gas_reaction(/datum/gas/miasma, while_present = PROC_REF(too_much_miasma), on_loss = PROC_REF(safe_miasma)) + add_gas_reaction(/datum/gas/nitrous_oxide, while_present = PROC_REF(too_much_n2o), on_loss = PROC_REF(safe_n2o)) + add_gas_reaction(/datum/gas/nitrium, while_present = PROC_REF(too_much_nitrium)) + add_gas_reaction(/datum/gas/tritium, while_present = PROC_REF(too_much_tritium)) + add_gas_reaction(/datum/gas/zauker, while_present = PROC_REF(too_much_zauker)) + +///Simply exists so that you don't keep any alerts from your previous lack of lungs. +/obj/item/organ/internal/lungs/Insert(mob/living/carbon/receiver, special = FALSE, drop_if_replaced = TRUE) + . = ..() + if(!.) + return . + receiver.clear_alert(ALERT_NOT_ENOUGH_OXYGEN) + receiver.clear_alert(ALERT_NOT_ENOUGH_CO2) + receiver.clear_alert(ALERT_NOT_ENOUGH_NITRO) + receiver.clear_alert(ALERT_NOT_ENOUGH_PLASMA) + receiver.clear_alert(ALERT_NOT_ENOUGH_N2O) + +/obj/item/organ/internal/lungs/Remove(mob/living/carbon/organ_owner, special) + . = ..() + // This is very "manual" I realize, but it's useful to ensure cleanup for gases we're removing happens + // Avoids stuck alerts and such + var/static/datum/gas_mixture/immutable/dummy = new(BREATH_VOLUME) + for(var/gas_id in last_partial_pressures) + var/on_loss = breath_lost[gas_id] + if(!on_loss) + continue + + call(src, on_loss)(organ_owner, dummy, last_partial_pressures[gas_id]) + dummy.garbage_collect() + +/** + * Tells the lungs to pay attention to the passed in gas type + * We'll check for it when breathing, in a few possible ways + * Accepts 3 optional arguments: + * + * proc/while_present * Called while the gas is present in our breath. Return BREATH_LOST to call on_loss afterwards + * proc/on_loss * Called after we have lost a gas from our breath. + * proc/always * Always called. Best suited for breathing procs, like oxygen + * + * while_present and always get the same arguments (mob/living/carbon/breather, datum/gas_mixture/breath, pp, old_pp) + * on_loss is almost exactly the same, except it doesn't pass in a current partial pressure, since one isn't avalible + */ +/obj/item/organ/internal/lungs/proc/add_gas_reaction(gas_type, while_present = null, on_loss = null, always = null) + if(always) + breathe_always[gas_type] = always + + if(isnull(while_present) && isnull(on_loss)) + return + + if(while_present) + breath_present[gas_type] = while_present + if(on_loss) + breath_lost[gas_type] = on_loss + +#define BREATH_RELATIONSHIP_INITIAL_GAS 1 +#define BREATH_RELATIONSHIP_CONVERT 2 +#define BREATH_RELATIONSHIP_MULTIPLIER 3 +/** + * Tells the lungs to treat the passed in gas type as another passed in gas type + * Takes the gas to check for as an argument, alongside the gas to convert and the multiplier to use + * These act in the order of insertion, use that how you will + */ +/obj/item/organ/internal/lungs/proc/add_gas_relationship(gas_type, convert_to, multiplier) + if(isnull(gas_type) || isnull(convert_to) || multiplier == 0) + return + + var/list/add = new /list(BREATH_RELATIONSHIP_MULTIPLIER) + add[BREATH_RELATIONSHIP_INITIAL_GAS] = gas_type + add[BREATH_RELATIONSHIP_CONVERT] = convert_to + add[BREATH_RELATIONSHIP_MULTIPLIER] = multiplier + treat_as += list(add) + +/// Clears away a gas relationship. Takes the same args as the initial addition +/obj/item/organ/internal/lungs/proc/remove_gas_relationship(gas_type, convert_to, multiplier) + if(isnull(gas_type) || isnull(convert_to) || multiplier == 0) + return + + for(var/packet in treat_as) + if(packet[BREATH_RELATIONSHIP_INITIAL_GAS] != gas_type) + continue + if(packet[BREATH_RELATIONSHIP_CONVERT] != convert_to) + continue + if(packet[BREATH_RELATIONSHIP_MULTIPLIER] != multiplier) + continue + treat_as -= packet + return + +/// Handles oxygen breathing. Always called by things that need o2, no matter what +/obj/item/organ/internal/lungs/proc/breathe_oxygen(mob/living/carbon/breather, datum/gas_mixture/breath, o2_pp, old_o2_pp) + if(o2_pp < safe_oxygen_min && !HAS_TRAIT(src, TRAIT_SPACEBREATHING)) + // Not safe to check the old pp because of can_breath_vacuum + breather.throw_alert(ALERT_NOT_ENOUGH_OXYGEN, /atom/movable/screen/alert/not_enough_oxy) + + var/gas_breathed = handle_suffocation(breather, o2_pp, safe_oxygen_min, breath.gases[/datum/gas/oxygen][MOLES]) + if(o2_pp) + breathe_gas_volume(breath, /datum/gas/oxygen, /datum/gas/carbon_dioxide, volume = gas_breathed) + return + + // If we used to not have enough, clear the alert + // Note this can be redundant, because of the vacuum check. It is fail safe tho, so it's ok + if(old_o2_pp < safe_oxygen_min) + breather.failed_last_breath = FALSE + breather.clear_alert(ALERT_NOT_ENOUGH_OXYGEN) + + breathe_gas_volume(breath, /datum/gas/oxygen, /datum/gas/carbon_dioxide) + // Heal mob if not in crit. + if(breather.health >= breather.crit_threshold && breather.oxyloss) + breather.adjustOxyLoss(-5) + +/// Maximum Oxygen effects. "Too much O2!" +/obj/item/organ/internal/lungs/proc/too_much_oxygen(mob/living/carbon/breather, datum/gas_mixture/breath, o2_pp, old_o2_pp) + // If too much Oxygen is poisonous. + if(o2_pp <= safe_oxygen_max) + if(old_o2_pp > safe_oxygen_max) + return BREATH_LOST + return + + var/ratio = (breath.gases[/datum/gas/oxygen][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) + +/// Handles NOT having too much o2. only relevant if safe_oxygen_max has a value +/obj/item/organ/internal/lungs/proc/safe_oxygen(mob/living/carbon/breather, datum/gas_mixture/breath, old_o2_pp) + breather.clear_alert(ALERT_TOO_MUCH_OXYGEN) + +/// Behaves like Oxygen with 8X efficacy, but metabolizes into a reagent. +/obj/item/organ/internal/lungs/proc/consume_pluoxium(mob/living/carbon/breather, datum/gas_mixture/breath, pluoxium_pp, old_pluoxium_pp) + breathe_gas_volume(breath, /datum/gas/pluoxium) + // Metabolize to reagent. + if(pluoxium_pp > gas_stimulation_min) + var/existing = breather.reagents.get_reagent_amount(/datum/reagent/pluoxium) + breather.reagents.add_reagent(/datum/reagent/pluoxium, max(0, 1 - existing)) + +/// If the lungs need Nitrogen to breathe properly, N2 is exchanged with CO2. +/obj/item/organ/internal/lungs/proc/breathe_nitro(mob/living/carbon/breather, datum/gas_mixture/breath, nitro_pp, old_nitro_pp) + if(nitro_pp < safe_nitro_min && !HAS_TRAIT(src, TRAIT_SPACEBREATHING)) + // Suffocation side-effects. + // Not safe to check the old pp because of can_breath_vacuum + breather.throw_alert(ALERT_NOT_ENOUGH_NITRO, /atom/movable/screen/alert/not_enough_nitro) + var/gas_breathed = handle_suffocation(breather, nitro_pp, safe_nitro_min, breath.gases[/datum/gas/nitrogen][MOLES]) + if(nitro_pp) + breathe_gas_volume(breath, /datum/gas/nitrogen, /datum/gas/carbon_dioxide, volume = gas_breathed) + return + + if(old_nitro_pp < safe_nitro_min) + breather.failed_last_breath = FALSE + breather.clear_alert(ALERT_NOT_ENOUGH_NITRO) + + // Inhale N2, exhale equivalent amount of CO2. Look ma, sideways breathing! + breathe_gas_volume(breath, /datum/gas/nitrogen, /datum/gas/carbon_dioxide) + // Heal mob if not in crit. + if(breather.health >= breather.crit_threshold && breather.oxyloss) + breather.adjustOxyLoss(-5) + +/// Maximum CO2 effects. "Too much CO2!" +/obj/item/organ/internal/lungs/proc/too_much_co2(mob/living/carbon/breather, datum/gas_mixture/breath, co2_pp, old_co2_pp) + if(co2_pp <= safe_co2_max) + if(old_co2_pp > safe_co2_max) + return BREATH_LOST + return + + // If it's the first breath with too much CO2 in it, lets start a counter, then have them pass out after 12s or so. + if(old_co2_pp < safe_co2_max) + breather.co2overloadtime = world.time + + // CO2 side-effects. + // Give the mob a chance to notice. + if(prob(20)) + breather.emote("cough") + + if((world.time - breather.co2overloadtime) > 12 SECONDS) + breather.throw_alert(ALERT_TOO_MUCH_CO2, /atom/movable/screen/alert/too_much_co2) + breather.Unconscious(6 SECONDS) + // Lets hurt em a little, let them know we mean business. + breather.apply_damage_type(3, co2_damage_type) + // They've been in here 30s now, start to kill them for their own good! + if((world.time - breather.co2overloadtime) > 30 SECONDS) + breather.apply_damage_type(8, co2_damage_type) + +/// Handles NOT having too much co2. only relevant if safe_co2_max has a value +/obj/item/organ/internal/lungs/proc/safe_co2(mob/living/carbon/breather, datum/gas_mixture/breath, old_co2_pp) + // Reset side-effects. + breather.co2overloadtime = 0 + breather.clear_alert(ALERT_TOO_MUCH_CO2) + +/// If the lungs need Plasma to breathe properly, Plasma is exchanged with CO2. +/obj/item/organ/internal/lungs/proc/breathe_plasma(mob/living/carbon/breather, datum/gas_mixture/breath, plasma_pp, old_plasma_pp) + // Suffocation side-effects. + if(plasma_pp < safe_plasma_min && !HAS_TRAIT(src, TRAIT_SPACEBREATHING)) + // Could check old_plasma_pp but vacuum breathing hates me + breather.throw_alert(ALERT_NOT_ENOUGH_PLASMA, /atom/movable/screen/alert/not_enough_plas) + // Breathe insufficient amount of Plasma, exhale CO2. + var/gas_breathed = handle_suffocation(breather, plasma_pp, safe_plasma_min, breath.gases[/datum/gas/plasma][MOLES]) + if(plasma_pp) + breathe_gas_volume(breath, /datum/gas/plasma, /datum/gas/carbon_dioxide, volume = gas_breathed) + return + + if(old_plasma_pp < safe_plasma_min) + breather.failed_last_breath = FALSE + breather.clear_alert(ALERT_NOT_ENOUGH_PLASMA) + // Inhale Plasma, exhale equivalent amount of CO2. + breathe_gas_volume(breath, /datum/gas/plasma, /datum/gas/carbon_dioxide) + // Heal mob if not in crit. + if(breather.health >= breather.crit_threshold && breather.oxyloss) + breather.adjustOxyLoss(-5) + +/// Maximum Plasma effects. "Too much Plasma!" +/obj/item/organ/internal/lungs/proc/too_much_plasma(mob/living/carbon/breather, datum/gas_mixture/breath, plasma_pp, old_plasma_pp) + if(plasma_pp <= safe_plasma_max) + if(old_plasma_pp > safe_plasma_max) + return BREATH_LOST + return + + // If it's the first breath with too much CO2 in it, lets start a counter, then have them pass out after 12s or so. + if(old_plasma_pp < safe_plasma_max) + breather.throw_alert(ALERT_TOO_MUCH_PLASMA, /atom/movable/screen/alert/too_much_plas) + + var/ratio = (breath.gases[/datum/gas/plasma][MOLES] / safe_plasma_max) * 10 + breather.apply_damage_type(clamp(ratio, plas_breath_dam_min, plas_breath_dam_max), plas_damage_type) + +/// Resets plasma side effects +/obj/item/organ/internal/lungs/proc/safe_plasma(mob/living/carbon/breather, datum/gas_mixture/breath, old_plasma_pp) + breather.clear_alert(ALERT_TOO_MUCH_PLASMA) + +/// Too much funny gas, time to get brain damage +/obj/item/organ/internal/lungs/proc/too_much_bz(mob/living/carbon/breather, datum/gas_mixture/breath, bz_pp, old_bz_pp) + if(bz_pp > BZ_trip_balls_min) + breather.adjust_hallucinations(20 SECONDS) + breather.reagents.add_reagent(/datum/reagent/bz_metabolites, 5) + if(bz_pp > BZ_brain_damage_min && prob(33)) + breather.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 150, ORGAN_ORGANIC) + +/// Breathing in refridgerator coolent, shit's caustic +/obj/item/organ/internal/lungs/proc/too_much_freon(mob/living/carbon/breather, datum/gas_mixture/breath, freon_pp, old_freon_pp) + // Inhale Freon. Exhale nothing. + breathe_gas_volume(breath, /datum/gas/freon) + if (freon_pp > gas_stimulation_min) + breather.reagents.add_reagent(/datum/reagent/freon, 1) + if (prob(freon_pp)) + to_chat(breather, span_alert("Your mouth feels like it's burning!")) + if (freon_pp > 40) + breather.emote("gasp") + breather.adjustFireLoss(15) + if (prob(freon_pp / 2)) + to_chat(breather, span_alert("Your throat closes up!")) + breather.set_silence_if_lower(6 SECONDS) + else + breather.adjustFireLoss(freon_pp / 4) + +/// Breathing in halon, convert it to a reagent +/obj/item/organ/internal/lungs/proc/too_much_halon(mob/living/carbon/breather, datum/gas_mixture/breath, halon_pp, old_halon_pp) + // Inhale Halon. Exhale nothing. + breathe_gas_volume(breath, /datum/gas/halon) + // Metabolize to reagent. + if(halon_pp > gas_stimulation_min) + breather.adjustOxyLoss(5) + breather.reagents.add_reagent(/datum/reagent/halon, max(0, 1 - breather.reagents.get_reagent_amount(/datum/reagent/halon))) + +/// Sleeping gas with healing properties. +/obj/item/organ/internal/lungs/proc/consume_healium(mob/living/carbon/breather, datum/gas_mixture/breath, healium_pp, old_healium_pp) + breathe_gas_volume(breath, /datum/gas/healium) + // Euphoria side-effect. + if(healium_pp > gas_stimulation_min) + if(prob(15)) + to_chat(breather, span_alert("Your head starts spinning and your lungs burn!")) + healium_euphoria = EUPHORIA_ACTIVE + breather.emote("gasp") + else + healium_euphoria = EUPHORIA_INACTIVE + // Stun/Sleep side-effects. + if(healium_pp > healium_para_min && !breather.IsSleeping() && prob(30)) + breather.Sleeping(rand(3 SECONDS, 5 SECONDS)) + // Metabolize to reagent when concentration is high enough. + if(healium_pp > healium_sleep_min) + breather.reagents.add_reagent(/datum/reagent/healium, max(0, 1 - breather.reagents.get_reagent_amount(/datum/reagent/healium))) + +/// Lose healium side effects +/obj/item/organ/internal/lungs/proc/lose_healium(mob/living/carbon/breather, datum/gas_mixture/breath, old_healium_pp) + healium_euphoria = EUPHORIA_INACTIVE + +/// Activates helium speech when partial pressure gets high enough +/obj/item/organ/internal/lungs/proc/consume_helium(mob/living/carbon/breather, datum/gas_mixture/breath, helium_pp, old_helium_pp) + breathe_gas_volume(breath, /datum/gas/helium) + if(helium_pp > helium_speech_min) + if(old_helium_pp <= helium_speech_min) + RegisterSignal(breather, COMSIG_MOB_SAY, PROC_REF(handle_helium_speech)) + else + if(old_helium_pp > helium_speech_min) + UnregisterSignal(breather, COMSIG_MOB_SAY) + +/// Lose helium high pitched voice +/obj/item/organ/internal/lungs/proc/lose_helium(mob/living/carbon/breather, datum/gas_mixture/breath, old_helium_pp) + UnregisterSignal(breather, COMSIG_MOB_SAY) + +/// React to speach while hopped up on the high pitched voice juice +/obj/item/organ/internal/lungs/proc/handle_helium_speech(mob/living/carbon/breather, list/speech_args) + SIGNAL_HANDLER + speech_args[SPEECH_SPANS] |= SPAN_HELIUM + +/// Gain hypernob effects if we have enough of the stuff +/obj/item/organ/internal/lungs/proc/consume_hypernoblium(mob/living/carbon/breather, datum/gas_mixture/breath, hypernob_pp, old_hypernob_pp) + breathe_gas_volume(breath, /datum/gas/hypernoblium) + if (hypernob_pp > gas_stimulation_min) + var/existing = breather.reagents.get_reagent_amount(/datum/reagent/hypernoblium) + breather.reagents.add_reagent(/datum/reagent/hypernoblium,max(0, 1 - existing)) + +/// Breathing in the stink gas +/obj/item/organ/internal/lungs/proc/too_much_miasma(mob/living/carbon/breather, datum/gas_mixture/breath, miasma_pp, old_miasma_pp) + // Inhale Miasma. Exhale nothing. + breathe_gas_volume(breath, /datum/gas/miasma) + // Miasma sickness + if(prob(0.5 * miasma_pp)) + var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(max_symptoms = min(round(max(miasma_pp / 2, 1), 1), 6), max_level = min(round(max(miasma_pp, 1), 1), 8)) + // tl;dr the first argument chooses the smaller of miasma_pp/2 or 6(typical max virus symptoms), the second chooses the smaller of miasma_pp or 8(max virus symptom level) + // Each argument has a minimum of 1 and rounds to the nearest value. Feel free to change the pp scaling I couldn't decide on good numbers for it. + if(breather.CanContractDisease(miasma_disease)) + miasma_disease.name = "Unknown" + breather.AirborneContractDisease(miasma_disease, TRUE) + // Miasma side effects + switch(miasma_pp) + if(0.25 to 5) + // At lower pp, give out a little warning + breather.clear_mood_event("smell") + if(prob(5)) + to_chat(breather, span_notice("There is an unpleasant smell in the air.")) + if(5 to 15) + //At somewhat higher pp, warning becomes more obvious + if(prob(15)) + to_chat(breather, span_warning("You smell something horribly decayed inside this room.")) + breather.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(breather, span_warning("The stench of rotting carcasses is unbearable!")) + breather.add_mood_event("smell", /datum/mood_event/disgust/nauseating_stench) + breather.vomit(VOMIT_CATEGORY_DEFAULT) + if(30 to INFINITY) + //Higher chance to vomit. Let the horror start + if(prob(15)) + to_chat(breather, span_warning("The stench of rotting carcasses is unbearable!")) + breather.add_mood_event("smell", /datum/mood_event/disgust/nauseating_stench) + breather.vomit(VOMIT_CATEGORY_DEFAULT) + else + breather.clear_mood_event("smell") + // In a full miasma atmosphere with 101.34 pKa, about 10 disgust per breath, is pretty low compared to threshholds + // Then again, this is a purely hypothetical scenario and hardly reachable + breather.adjust_disgust(0.1 * miasma_pp) + +/// We're free from the stick, clear out its impacts +/obj/item/organ/internal/lungs/proc/safe_miasma(mob/living/carbon/breather, datum/gas_mixture/breath, old_miasma_pp) + // Clear out moods when immune to miasma, or if there's no miasma at all. + breather.clear_mood_event("smell") + +/// Causes random euphoria and giggling. Large amounts knock you down +/obj/item/organ/internal/lungs/proc/too_much_n2o(mob/living/carbon/breather, datum/gas_mixture/breath, n2o_pp, old_n2o_pp) + if(n2o_pp < n2o_para_min) + // Small amount of N2O, small side-effects. + if(n2o_pp <= 0.01) + if(old_n2o_pp > 0.01) + return BREATH_LOST + return + // No alert for small amounts, but the mob randomly feels euphoric. + if(old_n2o_pp >= n2o_para_min || old_n2o_pp <= 0.01) + breather.clear_alert(ALERT_TOO_MUCH_N2O) + + if(prob(20)) + n2o_euphoria = EUPHORIA_ACTIVE + breather.emote(pick("giggle", "laugh")) + else + n2o_euphoria = EUPHORIA_INACTIVE + return + + // More N2O, more severe side-effects. Causes stun/sleep. + if(old_n2o_pp < n2o_para_min) + breather.throw_alert(ALERT_TOO_MUCH_N2O, /atom/movable/screen/alert/too_much_n2o) + n2o_euphoria = EUPHORIA_ACTIVE + + // give them one second of grace to wake up and run away a bit! + if(!HAS_TRAIT(breather, TRAIT_SLEEPIMMUNE)) + breather.Unconscious(6 SECONDS) + // Enough to make the mob sleep. + if(n2o_pp > n2o_sleep_min) + breather.Sleeping(min(breather.AmountSleeping() + 100, 200)) + +/// N2O side-effects. "Too much N2O!" +/obj/item/organ/internal/lungs/proc/safe_n2o(mob/living/carbon/breather, datum/gas_mixture/breath, old_n2o_pp) + n2o_euphoria = EUPHORIA_INACTIVE + breather.clear_alert(ALERT_TOO_MUCH_N2O) + +// Breath in nitrium. It's helpful, but has nasty side effects +/obj/item/organ/internal/lungs/proc/too_much_nitrium(mob/living/carbon/breather, datum/gas_mixture/breath, nitrium_pp, old_nitrium_pp) + breathe_gas_volume(breath, /datum/gas/nitrium) + // Random chance to inflict side effects increases with pressure. + if((prob(nitrium_pp) && (nitrium_pp > 15))) + // Nitrium side-effect. + breather.adjustOrganLoss(ORGAN_SLOT_LUNGS, nitrium_pp * 0.1) + to_chat(breather, "You feel a burning sensation in your chest") + // Metabolize to reagents. + if (nitrium_pp > 5) + var/existing = breather.reagents.get_reagent_amount(/datum/reagent/nitrium_low_metabolization) + breather.reagents.add_reagent(/datum/reagent/nitrium_low_metabolization, max(0, 2 - existing)) + if (nitrium_pp > 10) + var/existing = breather.reagents.get_reagent_amount(/datum/reagent/nitrium_high_metabolization) + breather.reagents.add_reagent(/datum/reagent/nitrium_high_metabolization, max(0, 1 - existing)) + +/// Radioactive, green gas. Toxin damage, and a radiation chance +/obj/item/organ/internal/lungs/proc/too_much_tritium(mob/living/carbon/breather, datum/gas_mixture/breath, trit_pp, old_trit_pp) + var/gas_breathed = breathe_gas_volume(breath, /datum/gas/tritium) + var/moles_visible = GLOB.meta_gas_info[/datum/gas/tritium][META_GAS_MOLES_VISIBLE] * BREATH_PERCENTAGE + // Tritium side-effects. + if(gas_breathed > moles_visible) + var/ratio = gas_breathed * 15 + breather.adjustToxLoss(clamp(ratio, MIN_TOXIC_GAS_DAMAGE, MAX_TOXIC_GAS_DAMAGE)) + // If you're breathing in half an atmosphere of radioactive gas, you fucked up. + if((trit_pp > tritium_irradiation_moles_min) && SSradiation.can_irradiate_basic(breather)) + var/lerp_scale = min(tritium_irradiation_moles_max, trit_pp - tritium_irradiation_moles_min) / (tritium_irradiation_moles_max - tritium_irradiation_moles_min) + var/chance = LERP(tritium_irradiation_probability_min, tritium_irradiation_probability_max, lerp_scale) + if (prob(chance)) + breather.AddComponent(/datum/component/irradiated) + +/// Really toxic stuff, very much trying to kill you +/obj/item/organ/internal/lungs/proc/too_much_zauker(mob/living/carbon/breather, datum/gas_mixture/breath, zauker_pp, old_zauker_pp) + breathe_gas_volume(breath, /datum/gas/zauker) + // Metabolize to reagent. + if(zauker_pp > gas_stimulation_min) + var/existing = breather.reagents.get_reagent_amount(/datum/reagent/zauker) + breather.reagents.add_reagent(/datum/reagent/zauker, max(0, 1 - existing)) + +/** + * This proc tests if the lungs can breathe, if they can breathe a given gas mixture, and throws/clears gas alerts. + * It does this by calling subprocs "registered" to pay attention to different gas types + * There's also support for gases that should always be checked for, and procs that should run when a gas is finished + * + * + * Returns TRUE if the breath was successful, or FALSE if otherwise. + * + * Arguments: + * * breath: A gas mixture to test, or null. + * * breather: A carbon mob that is using the lungs to breathe. + */ +/obj/item/organ/internal/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather) + if(breather.status_flags & GODMODE) + breather.failed_last_breath = FALSE + breather.clear_alert(ALERT_NOT_ENOUGH_OXYGEN) + return FALSE + + if(HAS_TRAIT(breather, TRAIT_NOBREATH)) + return FALSE + + // If the breath is falsy or "null", we can use the backup empty_breath. + if(!breath) + var/static/datum/gas_mixture/immutable/empty_breath = new(BREATH_VOLUME) + breath = empty_breath + + // Indicates if there are moles of gas in the breath. + var/has_moles = breath.total_moles() != 0 + + // Check for moles of gas and handle partial pressures / special conditions. + if(has_moles) + // Breath has more than 0 moles of gas. + // Route gases through mask filter if breather is wearing one. + if(istype(breather.wear_mask) && (breather.wear_mask.clothing_flags & GAS_FILTERING) && breather.wear_mask.has_filter) + breath = breather.wear_mask.consume_filter(breath) + // Breath has 0 moles of gas, and we can breathe space + else if(HAS_TRAIT(src, TRAIT_SPACEBREATHING)) + // The lungs can breathe anyways. What are you? Some bottom-feeding, scum-sucking algae eater? + breather.failed_last_breath = FALSE + // Vacuum-adapted lungs regenerate oxyloss even when breathing nothing. + if(breather.health >= breather.crit_threshold && breather.oxyloss) + breather.adjustOxyLoss(-5) + else + // Can't breathe! + breather.failed_last_breath = TRUE + + // The list of gases in the breath. + var/list/breath_gases = breath.gases + // Copy the breath's temperature into breath_out to avoid cooling the output breath down unfairly + breath_out.temperature = breath.temperature + + var/old_euphoria = (n2o_euphoria == EUPHORIA_ACTIVE || healium_euphoria == EUPHORIA_ACTIVE) + + // Cache for sonic speed + var/list/last_partial_pressures = src.last_partial_pressures + var/list/breathe_always = src.breathe_always + var/list/breath_present = src.breath_present + var/list/breath_lost = src.breath_lost + + // Build out our partial pressures, for use as we go + var/list/partial_pressures = list() + for(var/gas_id in breath_gases) + partial_pressures[gas_id] = breath.get_breath_partial_pressure(breath_gases[gas_id][MOLES]) + + // Treat gas as other types of gas + for(var/list/conversion_packet in treat_as) + var/read_from = conversion_packet[BREATH_RELATIONSHIP_INITIAL_GAS] + if(!partial_pressures[read_from]) + continue + var/convert_into = conversion_packet[BREATH_RELATIONSHIP_CONVERT] + partial_pressures[convert_into] += partial_pressures[read_from] * conversion_packet[BREATH_RELATIONSHIP_MULTIPLIER] + if(partial_pressures[convert_into] <= 0) + partial_pressures -= convert_into // No negative values jeremy + + // First, we breathe the stuff that always wants to be processed + // This is typically things like o2, stuff the mob needs to live + for(var/breath_id in breathe_always) + var/partial_pressure = partial_pressures[breath_id] || 0 + var/old_partial_pressure = last_partial_pressures[breath_id] || 0 + // Ensures the gas will always be instanciated, so people can interact with it safely + ASSERT_GAS(breath_id, breath) + var/inhale = breathe_always[breath_id] + call(src, inhale)(breather, breath, partial_pressure, old_partial_pressure) + + // Now we'll handle the callbacks that want to be run conditionally off our current breath + for(var/breath_id in breath_gases) + var/when_present = breath_present[breath_id] + if(!when_present) + continue + + var/reaction = call(src, when_present)(breather, breath, partial_pressures[breath_id], last_partial_pressures[breath_id]) + if(reaction == BREATH_LOST) + var/on_lose = breath_lost[breath_id] + if(on_lose) + call(src, on_lose)(breather, breath, partial_pressures[breath_id], last_partial_pressures[breath_id]) + + // Finally, we'll run the callbacks that aren't in breath_gases, but WERE in our last breath + for(var/gas_lost in last_partial_pressures) + // If we still have it, go away + if(breath_gases[gas_lost]) + continue + var/on_loss = breath_lost[gas_lost] + if(!on_loss) + continue + + call(src, on_loss)(breather, breath, last_partial_pressures[gas_lost]) + + src.last_partial_pressures = partial_pressures + + // Handle chemical euphoria mood event, caused by gases such as N2O or healium. + var/new_euphoria = (n2o_euphoria == EUPHORIA_ACTIVE || healium_euphoria == EUPHORIA_ACTIVE) + if (!old_euphoria && new_euphoria) + breather.add_mood_event("chemical_euphoria", /datum/mood_event/chemical_euphoria) + else if (old_euphoria && !new_euphoria) + breather.clear_mood_event("chemical_euphoria") + + if(has_moles) + handle_breath_temperature(breath, breather) + // Merge breath_out into breath. They're kept seprerate before now to ensure stupid like, order of operations shit doesn't happen + // But that time has passed + breath.merge(breath_out) + // Resets immutable gas_mixture to empty. + breath_out.garbage_collect() + + breath.garbage_collect() + // Returning FALSE indicates the breath failed. + if(!breather.failed_last_breath) + return TRUE + +/// Remove gas from breath. If output_gas is given, transfers the removed gas to the lung's gas_mixture. +/// Removes 100% of the given gas type unless given a volume argument. +/// Returns the amount of gas theoretically removed. +/obj/item/organ/internal/lungs/proc/breathe_gas_volume(datum/gas_mixture/breath, remove_id, exchange_id = null, volume = INFINITY) + var/list/breath_gases = breath.gases + volume = min(volume, breath_gases[remove_id][MOLES]) + breath_gases[remove_id][MOLES] -= volume + if(exchange_id) + ASSERT_GAS(exchange_id, breath_out) + breath_out.gases[exchange_id][MOLES] += volume + return volume + +/// Applies suffocation side-effects to a given Human, scaling based on ratio of required pressure VS "true" pressure. +/// If pressure is greater than 0, the return value will represent the amount of gas successfully breathed. +/obj/item/organ/internal/lungs/proc/handle_suffocation(mob/living/carbon/human/suffocator = null, breath_pp = 0, safe_breath_min = 0, mole_count = 0) + . = 0 + // Can't suffocate without a Human, or without minimum breath pressure. + if(!suffocator || !safe_breath_min) + return + // Mob is suffocating. + suffocator.failed_last_breath = TRUE + // Give them a chance to notice something is wrong. + if(prob(20)) + suffocator.emote("gasp") + // If mob is at critical health, check if they can be damaged further. + if(suffocator.health < suffocator.crit_threshold) + // Mob is immune to damage at critical health. + if(HAS_TRAIT(suffocator, TRAIT_NOCRITDAMAGE)) + return + // Reagents like Epinephrine stop suffocation at critical health. + if(suffocator.reagents.has_reagent(crit_stabilizing_reagent, needs_metabolizing = TRUE)) + return + // Low pressure. + if(breath_pp) + var/ratio = safe_breath_min / breath_pp + suffocator.adjustOxyLoss(min(5 * ratio, HUMAN_MAX_OXYLOSS)) + return mole_count * ratio / 6 + // Zero pressure. + if(suffocator.health >= suffocator.crit_threshold) + suffocator.adjustOxyLoss(HUMAN_MAX_OXYLOSS) + else + suffocator.adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) + + +/obj/item/organ/internal/lungs/proc/handle_breath_temperature(datum/gas_mixture/breath, mob/living/carbon/human/breather) // called by human/life, handles temperatures + var/breath_temperature = breath.temperature + + if(!HAS_TRAIT(breather, TRAIT_RESISTCOLD)) // COLD DAMAGE + var/cold_modifier = breather.dna.species.coldmod + if(breath_temperature < cold_level_3_threshold) + breather.apply_damage_type(cold_level_3_damage*cold_modifier, cold_damage_type) + if(breath_temperature > cold_level_3_threshold && breath_temperature < cold_level_2_threshold) + breather.apply_damage_type(cold_level_2_damage*cold_modifier, cold_damage_type) + if(breath_temperature > cold_level_2_threshold && breath_temperature < cold_level_1_threshold) + breather.apply_damage_type(cold_level_1_damage*cold_modifier, cold_damage_type) + if(breath_temperature < cold_level_1_threshold) + if(prob(20)) + to_chat(breather, span_warning("You feel [cold_message] in your [name]!")) + + if(!HAS_TRAIT(breather, TRAIT_RESISTHEAT)) // HEAT DAMAGE + var/heat_modifier = breather.dna.species.heatmod + if(breath_temperature > heat_level_1_threshold && breath_temperature < heat_level_2_threshold) + breather.apply_damage_type(heat_level_1_damage*heat_modifier, heat_damage_type) + if(breath_temperature > heat_level_2_threshold && breath_temperature < heat_level_3_threshold) + breather.apply_damage_type(heat_level_2_damage*heat_modifier, heat_damage_type) + if(breath_temperature > heat_level_3_threshold) + breather.apply_damage_type(heat_level_3_damage*heat_modifier, heat_damage_type) + if(breath_temperature > heat_level_1_threshold) + if(prob(20)) + to_chat(breather, span_warning("You feel [hot_message] in your [name]!")) + + // The air you breathe out should match your body temperature + breath.temperature = breather.bodytemperature + +/obj/item/organ/internal/lungs/on_life(seconds_per_tick, times_fired) + . = ..() + if(failed && !(organ_flags & ORGAN_FAILING)) + failed = FALSE + return + if(damage >= low_threshold) + var/do_i_cough = SPT_PROB((damage < high_threshold) ? 2.5 : 5, seconds_per_tick) // 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 + +/obj/item/organ/internal/lungs/get_availability(datum/species/owner_species, mob/living/owner_mob) + return owner_species.mutantlungs + +#define SMOKER_ORGAN_HEALTH (STANDARD_ORGAN_THRESHOLD * 0.75) +#define SMOKER_LUNG_HEALING (STANDARD_ORGAN_HEALING * 0.75) + +/obj/item/organ/internal/lungs/plasmaman + name = "plasma filter" + desc = "A spongy rib-shaped mass for filtering plasma from the air." + icon_state = "lungs-plasma" + organ_traits = list(TRAIT_NOHUNGER) // A fresh breakfast of plasma is a great start to any morning. + + safe_oxygen_min = 0 //We don't breathe this + safe_plasma_min = 4 //We breathe THIS! + safe_plasma_max = 0 + +/obj/item/organ/internal/lungs/plasmaman/plasmaman_smoker + name = "smoker plasma filter" + desc = "A plasma filter that look discolored, a result from smoking a lot." + icon_state = "lungs_plasma_smoker" + + maxHealth = SMOKER_ORGAN_HEALTH + healing_factor = SMOKER_LUNG_HEALING + +/obj/item/organ/internal/lungs/slime + name = "vacuole" + desc = "A large organelle designed to store oxygen and other important gasses." + + safe_plasma_max = 0 //We breathe this to gain POWER. + +/obj/item/organ/internal/lungs/slime/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather_slime) + . = ..() + if (breath?.gases[/datum/gas/plasma]) + var/plasma_pp = breath.get_breath_partial_pressure(breath.gases[/datum/gas/plasma][MOLES]) + breather_slime.blood_volume += (0.2 * plasma_pp) // 10/s when breathing literally nothing but plasma, which will suffocate you. + +/obj/item/organ/internal/lungs/smoker_lungs + name = "smoker lungs" + desc = "A pair of lungs that look sickly, a result from smoking a lot." + icon_state = "lungs_smoker" + + maxHealth = SMOKER_ORGAN_HEALTH + healing_factor = SMOKER_LUNG_HEALING + +/obj/item/organ/internal/lungs/cybernetic + name = "basic cybernetic lungs" + desc = "A basic cybernetic version of the lungs found in traditional humanoid entities." + failing_desc = "seems to be broken." + icon_state = "lungs-c" + organ_flags = ORGAN_ROBOTIC + maxHealth = STANDARD_ORGAN_THRESHOLD * 0.5 + var/emp_vulnerability = 80 //Chance of permanent effects if emp-ed. + +/obj/item/organ/internal/lungs/cybernetic/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + if(!COOLDOWN_FINISHED(src, severe_cooldown)) //So we cant just spam emp to kill people. + owner.losebreath += 20 + COOLDOWN_START(src, severe_cooldown, 30 SECONDS) + if(prob(emp_vulnerability/severity)) //Chance of permanent effects + organ_flags |= ORGAN_EMP //Starts organ faliure - gonna need replacing soon. + +/obj/item/organ/internal/lungs/cybernetic/tier2 + 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 + safe_oxygen_min = 13 + emp_vulnerability = 40 + +/obj/item/organ/internal/lungs/cybernetic/tier3 + name = "upgraded cybernetic lungs" + desc = "A more advanced version of the stock cybernetic lungs. Features the ability to filter out lower levels of plasma and carbon dioxide." + icon_state = "lungs-c-u2" + safe_plasma_max = 20 + safe_co2_max = 20 + maxHealth = 2 * STANDARD_ORGAN_THRESHOLD + safe_oxygen_min = 13 + emp_vulnerability = 20 + + cold_level_1_threshold = 200 + cold_level_2_threshold = 140 + cold_level_3_threshold = 100 + +/obj/item/organ/internal/lungs/cybernetic/surplus + name = "surplus prosthetic lungs" + desc = "Two fragile, inflatable sacks of air that only barely mimic the function of human lungs. \ + Offer no protection against EMPs." + icon_state = "lungs-c-s" + maxHealth = 0.35 * STANDARD_ORGAN_THRESHOLD + emp_vulnerability = 100 + +//surplus organs are so awful that they explode when removed, unless failing +/obj/item/organ/internal/lungs/cybernetic/surplus/Initialize(mapload) + . = ..() + AddElement(/datum/element/dangerous_surgical_removal) + +/obj/item/organ/internal/lungs/lavaland + 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/internal/lungs/lavaland/Initialize(mapload) + var/datum/gas_mixture/immutable/planetary/mix = SSair.planetary[LAVALAND_DEFAULT_ATMOS] + + if(!mix?.total_moles()) // this typically means we didn't load lavaland, like if we're using the LOWMEMORYMODE define + return ..() + + // Take a "breath" of the air + var/datum/gas_mixture/breath = mix.remove(mix.total_moles() * BREATH_PERCENTAGE) + + var/list/breath_gases = breath.gases + + breath.assert_gases( + /datum/gas/oxygen, + /datum/gas/plasma, + /datum/gas/carbon_dioxide, + /datum/gas/nitrogen, + /datum/gas/bz, + /datum/gas/miasma, + ) + + var/oxygen_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/oxygen][MOLES]) + var/nitrogen_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/nitrogen][MOLES]) + var/plasma_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/plasma][MOLES]) + var/carbon_dioxide_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/carbon_dioxide][MOLES]) + var/bz_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/bz][MOLES]) + var/miasma_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/miasma][MOLES]) + + safe_oxygen_min = max(0, oxygen_pp - GAS_TOLERANCE) + safe_nitro_min = max(0, nitrogen_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 = carbon_dioxide_pp + GAS_TOLERANCE * 2 + + // The lung tolerance against BZ is also increased the amount of BZ in the base air + BZ_trip_balls_min += bz_pp + BZ_brain_damage_min += bz_pp + + // Lungs adapted to a high miasma atmosphere do not process it, and breathe it back out + if(miasma_pp) + suffers_miasma = FALSE + return ..() + + +#undef GAS_TOLERANCE + +/obj/item/organ/internal/lungs/ethereal + name = "aeration reticulum" + desc = "These exotic lungs seem crunchier than most." + icon_state = "lungs_ethereal" + heat_level_1_threshold = FIRE_MINIMUM_TEMPERATURE_TO_SPREAD // 150C or 433k, in line with ethereal max safe body temperature + heat_level_2_threshold = 473 + heat_level_3_threshold = 1073 + +/obj/item/organ/internal/lungs/ethereal/ethereal_smoker + name = "smoker aeration reticulum" + desc = "A pair of exotic lungs that look pale and sickly, a result from smoking a lot." + icon_state = "lungs_ethereal_smoker" + + maxHealth = SMOKER_ORGAN_HEALTH + healing_factor = SMOKER_LUNG_HEALING + +/obj/item/organ/internal/lungs/ethereal/Initialize(mapload) + . = ..() + add_gas_reaction(/datum/gas/water_vapor, while_present = PROC_REF(consume_water)) + +/// H2O electrolysis +/obj/item/organ/internal/lungs/ethereal/proc/consume_water(mob/living/carbon/breather, datum/gas_mixture/breath, h2o_pp, old_h2o_pp) + var/gas_breathed = breath.gases[/datum/gas/water_vapor][MOLES] + breath.gases[/datum/gas/water_vapor][MOLES] -= gas_breathed + breath_out.assert_gases(/datum/gas/oxygen, /datum/gas/hydrogen) + breath_out.gases[/datum/gas/oxygen][MOLES] += gas_breathed + breath_out.gases[/datum/gas/hydrogen][MOLES] += gas_breathed * 2 + + +#undef BREATH_RELATIONSHIP_INITIAL_GAS +#undef BREATH_RELATIONSHIP_CONVERT +#undef BREATH_RELATIONSHIP_MULTIPLIER +#undef SMOKER_ORGAN_HEALTH +#undef SMOKER_LUNG_HEALING diff --git a/code/modules/surgery/organs/stomach/_stomach.dm b/code/modules/surgery/organs/internal/stomach/_stomach.dm similarity index 91% rename from code/modules/surgery/organs/stomach/_stomach.dm rename to code/modules/surgery/organs/internal/stomach/_stomach.dm index 345027ef5d7ea..63fefca156ccb 100644 --- a/code/modules/surgery/organs/stomach/_stomach.dm +++ b/code/modules/surgery/organs/internal/stomach/_stomach.dm @@ -3,6 +3,7 @@ /obj/item/organ/internal/stomach name = "stomach" + desc = "Onaka ga suite imasu." icon_state = "stomach" visual = FALSE w_class = WEIGHT_CLASS_SMALL @@ -10,7 +11,6 @@ slot = ORGAN_SLOT_STOMACH attack_verb_continuous = list("gores", "squishes", "slaps", "digests") 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 @@ -30,6 +30,9 @@ ///The rate that the stomach will transfer reagents to the body var/metabolism_efficiency = 0.05 // the lowest we should go is 0.025 + /// Multiplier for hunger rate + var/hunger_modifier = 1 + var/operated = FALSE //whether the stomach's been repaired with surgery and can be fixed again or not /obj/item/organ/internal/stomach/Initialize(mapload) @@ -107,13 +110,13 @@ //The stomach is damage has nutriment but low on theshhold, lo prob of vomit if(SPT_PROB(0.0125 * damage * nutri_vol * nutri_vol, seconds_per_tick)) - body.vomit(damage) + body.vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = damage) to_chat(body, span_warning("Your stomach reels in pain as you're incapable of holding down all that food!")) return // the change of vomit is now high if(damage > high_threshold && SPT_PROB(0.05 * damage * nutri_vol * nutri_vol, seconds_per_tick)) - body.vomit(damage) + body.vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = damage) to_chat(body, span_warning("Your stomach reels in pain as you're incapable of holding down all that food!")) /obj/item/organ/internal/stomach/proc/handle_hunger(mob/living/carbon/human/human, seconds_per_tick, times_fired) @@ -154,6 +157,7 @@ if(SPT_PROB(round(-human.satiety/77), seconds_per_tick)) human.set_jitter_if_lower(10 SECONDS) hunger_rate = 3 * HUNGER_FACTOR + hunger_rate *= hunger_modifier hunger_rate *= human.physiology.hunger_mod human.adjust_nutrition(-hunger_rate * seconds_per_tick) @@ -229,7 +233,7 @@ if(SPT_PROB(pukeprob, seconds_per_tick)) //iT hAndLeS mOrE ThaN PukInG disgusted.adjust_confusion(2.5 SECONDS) disgusted.adjust_stutter(2 SECONDS) - disgusted.vomit(10, distance = 0, vomit_type = NONE) + disgusted.vomit(VOMIT_CATEGORY_DEFAULT, distance = 0) disgusted.set_dizzy_if_lower(10 SECONDS) if(disgust >= DISGUST_LEVEL_DISGUSTED) if(SPT_PROB(13, seconds_per_tick)) @@ -268,30 +272,43 @@ return ..() /obj/item/organ/internal/stomach/bone + name = "mass of bones" desc = "You have no idea what this strange ball of bones does." + icon_state = "stomach-bone" metabolism_efficiency = 0.025 //very bad organ_traits = list(TRAIT_NOHUNGER) /obj/item/organ/internal/stomach/bone/plasmaman name = "digestive crystal" - icon_state = "stomach-p" - organ_traits = list() desc = "A strange crystal that is responsible for metabolizing the unseen energy force that feeds plasmamen." + icon_state = "stomach-p" metabolism_efficiency = 0.06 + organ_traits = null /obj/item/organ/internal/stomach/cybernetic name = "basic cybernetic stomach" - icon_state = "stomach-c" desc = "A basic device designed to mimic the functions of a human stomach" - organ_flags = ORGAN_SYNTHETIC + failing_desc = "seems to be broken." + icon_state = "stomach-c" + organ_flags = ORGAN_ROBOTIC maxHealth = STANDARD_ORGAN_THRESHOLD * 0.5 - var/emp_vulnerability = 80 //Chance of permanent effects if emp-ed. metabolism_efficiency = 0.035 // not as good at digestion + var/emp_vulnerability = 80 //Chance of permanent effects if emp-ed. + +/obj/item/organ/internal/stomach/cybernetic/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + if(!COOLDOWN_FINISHED(src, severe_cooldown)) //So we cant just spam emp to kill people. + owner.vomit(vomit_flags = (MOB_VOMIT_MESSAGE | MOB_VOMIT_HARM)) + COOLDOWN_START(src, severe_cooldown, 10 SECONDS) + if(prob(emp_vulnerability/severity)) //Chance of permanent effects + organ_flags |= ORGAN_EMP //Starts organ faliure - gonna need replacing soon. /obj/item/organ/internal/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." + icon_state = "stomach-c-u" maxHealth = 1.5 * STANDARD_ORGAN_THRESHOLD disgust_metabolism = 2 emp_vulnerability = 40 @@ -299,22 +316,26 @@ /obj/item/organ/internal/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." + icon_state = "stomach-c-u2" maxHealth = 2 * STANDARD_ORGAN_THRESHOLD disgust_metabolism = 3 emp_vulnerability = 20 metabolism_efficiency = 0.1 -/obj/item/organ/internal/stomach/cybernetic/emp_act(severity) +/obj/item/organ/internal/stomach/cybernetic/surplus + name = "surplus prosthetic stomach" + desc = "A mechanical plastic oval that utilizes sulfuric acid instead of stomach acid. \ + Very fragile, with painfully slow metabolism.\ + Offers no protection against EMPs." + icon_state = "stomach-c-s" + maxHealth = STANDARD_ORGAN_THRESHOLD * 0.35 + emp_vulnerability = 100 + metabolism_efficiency = 0.025 + +//surplus organs are so awful that they explode when removed, unless failing +/obj/item/organ/internal/stomach/cybernetic/surplus/Initialize(mapload) . = ..() - if(. & EMP_PROTECT_SELF) - return - if(!COOLDOWN_FINISHED(src, severe_cooldown)) //So we cant just spam emp to kill people. - owner.vomit(stun = FALSE) - COOLDOWN_START(src, severe_cooldown, 10 SECONDS) - if(prob(emp_vulnerability/severity)) //Chance of permanent effects - organ_flags |= ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon. - + AddElement(/datum/element/dangerous_surgical_removal) #undef STOMACH_METABOLISM_CONSTANT diff --git a/code/modules/surgery/organs/stomach/stomach_ethereal.dm b/code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm similarity index 98% rename from code/modules/surgery/organs/stomach/stomach_ethereal.dm rename to code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm index 4d43b6a3a0aa9..4cc8ee404c14d 100644 --- a/code/modules/surgery/organs/stomach/stomach_ethereal.dm +++ b/code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm @@ -92,7 +92,7 @@ playsound(carbon, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5) carbon.cut_overlay(overcharge) - tesla_zap(carbon, 2, crystal_charge*2.5, ZAP_OBJ_DAMAGE | ZAP_LOW_POWER_GEN | ZAP_ALLOW_DUPLICATES) + tesla_zap(carbon, 2, crystal_charge * 1e3, ZAP_OBJ_DAMAGE | ZAP_LOW_POWER_GEN | ZAP_ALLOW_DUPLICATES) adjust_charge(ETHEREAL_CHARGE_FULL - crystal_charge) carbon.visible_message(span_danger("[carbon] violently discharges energy!"), span_warning("You violently discharge energy!")) diff --git a/code/modules/surgery/organs/stomach/stomach_golem.dm b/code/modules/surgery/organs/internal/stomach/stomach_golem.dm similarity index 78% rename from code/modules/surgery/organs/stomach/stomach_golem.dm rename to code/modules/surgery/organs/internal/stomach/stomach_golem.dm index 9a085a5bbfb75..79d3976f22d6b 100644 --- a/code/modules/surgery/organs/stomach/stomach_golem.dm +++ b/code/modules/surgery/organs/internal/stomach/stomach_golem.dm @@ -3,10 +3,9 @@ icon_state = "stomach-p" desc = "A rocklike organ which grinds and processes nutrition from minerals." color = COLOR_GOLEM_GRAY - status = ORGAN_MINERAL + organ_flags = ORGAN_MINERAL organ_traits = list(TRAIT_ROCK_EATER) - /// Multiplier for the hunger rate, golems burn fuel quickly - var/hunger_mod = 10 + hunger_modifier = 10 // golems burn fuel quickly /// How slow are you when the "hungry" icon appears? var/min_hunger_slowdown = 0.5 /// How slow are you if you have absolutely nothing in the tank? @@ -15,33 +14,17 @@ /obj/item/organ/internal/stomach/golem/on_insert(mob/living/carbon/organ_owner, special) . = ..() RegisterSignal(owner, COMSIG_CARBON_ATTEMPT_EAT, PROC_REF(try_eating)) - if (!ishuman(organ_owner)) - return - if (organ_owner.flags_1 & INITIALIZED_1) - setup_physiology(organ_owner) - else - RegisterSignal(owner, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE, PROC_REF(setup_physiology)) - -/// Physiology doesn't exist yet if this is added on initialisation of a golem, so we need to wait until it does -/obj/item/organ/internal/stomach/golem/proc/setup_physiology(mob/living/carbon/human/human_owner) - SIGNAL_HANDLER - human_owner.physiology?.hunger_mod *= hunger_mod - UnregisterSignal(human_owner, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE) /obj/item/organ/internal/stomach/golem/on_remove(mob/living/carbon/organ_owner, special) . = ..() UnregisterSignal(organ_owner, COMSIG_CARBON_ATTEMPT_EAT) organ_owner.remove_movespeed_modifier(/datum/movespeed_modifier/golem_hunger) organ_owner.remove_status_effect(/datum/status_effect/golem_statued) - if (!ishuman(organ_owner)) - return - var/mob/living/carbon/human/human_owner = organ_owner - human_owner.physiology?.hunger_mod /= hunger_mod /// Reject food, rocks only /obj/item/organ/internal/stomach/golem/proc/try_eating(mob/living/carbon/source, atom/eating) SIGNAL_HANDLER - if (istype(eating, /obj/item/food/golem_food)) + if(istype(eating, /obj/item/food/golem_food)) return source.balloon_alert(source, "minerals only!") return COMSIG_CARBON_BLOCK_EAT @@ -56,9 +39,10 @@ /// Slow down based on how full you are /obj/item/organ/internal/stomach/golem/handle_hunger(mob/living/carbon/human/human, delta_time, times_fired) + // the effects are all negative, so just don't run them if you have the trait + . = ..() if(HAS_TRAIT(human, TRAIT_NOHUNGER)) return - . = ..() var/hunger = (NUTRITION_LEVEL_HUNGRY - human.nutrition) / NUTRITION_LEVEL_HUNGRY // starving = 1, satisfied = 0 if(hunger > 0) var/slowdown = LERP(min_hunger_slowdown, max_hunger_slowdown, hunger) @@ -90,7 +74,7 @@ return TRUE /datum/status_effect/golem_statued/get_examine_text() - return span_warning("[owner.p_they(TRUE)] are as still as a statue!") + return span_warning("[owner.p_They()] are as still as a statue!") /datum/status_effect/golem_statued/on_remove() owner.visible_message(span_notice("[owner] slowly stirs back into motion!"), span_notice("You have gathered enough strength to move your body once more.")) diff --git a/code/modules/surgery/organs/internal/tongue/_tongue.dm b/code/modules/surgery/organs/internal/tongue/_tongue.dm new file mode 100644 index 0000000000000..9bd6bec8ccdb5 --- /dev/null +++ b/code/modules/surgery/organs/internal/tongue/_tongue.dm @@ -0,0 +1,653 @@ +/obj/item/organ/internal/tongue + name = "tongue" + desc = "A fleshy muscle mostly used for lying." + icon_state = "tongue" + visual = FALSE + zone = BODY_ZONE_PRECISE_MOUTH + slot = ORGAN_SLOT_TONGUE + attack_verb_continuous = list("licks", "slobbers", "slaps", "frenches", "tongues") + attack_verb_simple = list("lick", "slobber", "slap", "french", "tongue") + voice_filter = "" + /** + * A cached list of paths of all the languages this tongue is capable of speaking + * + * Relates to a mob's ability to speak a language - a mob must be able to speak the language + * and have a tongue able to speak the language (or omnitongue) in order to actually speak said language + * + * To modify this list for subtypes, see [/obj/item/organ/internal/tongue/proc/get_possible_languages]. Do not modify directly. + */ + VAR_PRIVATE/list/languages_possible + /** + * A list of languages which are native to this tongue + * + * When these languages are spoken with this tongue, and modifies speech is true, no modifications will be made + * (such as no accent, hissing, or whatever) + */ + var/list/languages_native + ///changes the verbage of how you speak. (Permille -> says <-, "I just used a verb!") + ///i hate to say it, but because of sign language, this may have to be a component. and we may have to do some insane shit like putting a component on a component + var/say_mod = "says" + ///for temporary overrides of the above variable. + var/temp_say_mod = "" + + /// 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 + /// Determines how "sensitive" this tongue is to tasting things, lower is more sensitive. + /// See [/mob/living/proc/get_taste_sensitivity]. + var/taste_sensitivity = 15 + /// Foodtypes this tongue likes + var/liked_foodtypes = JUNKFOOD | FRIED //human tastes are default + /// Foodtypes this tongue dislikes + var/disliked_foodtypes = GROSS | RAW | CLOTH | BUGS | GORE //human tastes are default + /// Foodtypes this tongue HATES + var/toxic_foodtypes = TOXIC //human tastes are default + /// Whether this tongue modifies speech via signal + var/modifies_speech = FALSE + +/obj/item/organ/internal/tongue/Initialize(mapload) + . = ..() + // Setup the possible languages list + // - get_possible_languages gives us a list of language paths + // - then we cache it via string list + // this results in tongues with identical possible languages sharing a cached list instance + languages_possible = string_list(get_possible_languages()) + +/obj/item/organ/internal/tongue/examine(mob/user) + . = ..() + if(HAS_MIND_TRAIT(user, TRAIT_ENTRAILS_READER)|| isobserver(user)) + if(liked_foodtypes) + . += span_info("This tongue has an affinity for the taste of [english_list(bitfield_to_list(liked_foodtypes, FOOD_FLAGS_IC))].") + if(disliked_foodtypes) + . += span_info("This tongue has an aversion for the taste of [english_list(bitfield_to_list(disliked_foodtypes, FOOD_FLAGS_IC))].") + if(toxic_foodtypes) + . += span_info("This tongue's physiology makes [english_list(bitfield_to_list(toxic_foodtypes, FOOD_FLAGS_IC))] toxic.") + +/** + * Used in setting up the "languages possible" list. + * + * Override to have your tongue be only capable of speaking certain languages + * Extend to hvae a tongue capable of speaking additional languages to the base tongue + * + * While a user may be theoretically capable of speaking a language, they cannot physically speak it + * UNLESS they have a tongue with that language possible, UNLESS UNLESS they have omnitongue enabled. + */ +/obj/item/organ/internal/tongue/proc/get_possible_languages() + RETURN_TYPE(/list) + // This is the default list of languages most humans should be capable of speaking + return list( + /datum/language/common, + /datum/language/uncommon, + /datum/language/draconic, + /datum/language/codespeak, + /datum/language/monkey, + /datum/language/narsie, + /datum/language/beachbum, + /datum/language/aphasia, + /datum/language/piratespeak, + /datum/language/moffic, + /datum/language/sylvan, + /datum/language/shadowtongue, + /datum/language/terrum, + /datum/language/nekomimetic, + ) + +/obj/item/organ/internal/tongue/proc/handle_speech(datum/source, list/speech_args) + SIGNAL_HANDLER + + if(speech_args[SPEECH_LANGUAGE] in languages_native) + return FALSE //no changes + modify_speech(source, speech_args) + +/obj/item/organ/internal/tongue/proc/modify_speech(datum/source, list/speech_args) + return speech_args[SPEECH_MESSAGE] + +/** + * Gets the food reaction a tongue would have from the food item, + * assuming that no check_liked callback was used in the edible component. + * + * Can be overriden by subtypes for more complex behavior. + * Does not get called if the owner has ageusia. + **/ +/obj/item/organ/internal/tongue/proc/get_food_taste_reaction(obj/item/food, foodtypes = NONE) + var/food_taste_reaction + if(foodtypes & toxic_foodtypes) + food_taste_reaction = FOOD_TOXIC + else if(foodtypes & disliked_foodtypes) + food_taste_reaction = FOOD_DISLIKED + else if(foodtypes & liked_foodtypes) + food_taste_reaction = FOOD_LIKED + return food_taste_reaction + +/obj/item/organ/internal/tongue/Insert(mob/living/carbon/tongue_owner, special = FALSE, drop_if_replaced = TRUE) + . = ..() + if(!.) + return + if(modifies_speech) + RegisterSignal(tongue_owner, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + tongue_owner.voice_filter = voice_filter + /* This could be slightly simpler, by making the removal of the + * NO_TONGUE_TRAIT conditional on the tongue's `sense_of_taste`, but + * then you can distinguish between ageusia from no tongue, and + * ageusia from having a non-tasting tongue. + */ + REMOVE_TRAIT(tongue_owner, TRAIT_AGEUSIA, NO_TONGUE_TRAIT) + apply_tongue_effects() + +/obj/item/organ/internal/tongue/Remove(mob/living/carbon/tongue_owner, special = FALSE) + . = ..() + temp_say_mod = "" + UnregisterSignal(tongue_owner, COMSIG_MOB_SAY) + REMOVE_TRAIT(tongue_owner, TRAIT_SPEAKS_CLEARLY, SPEAKING_FROM_TONGUE) + 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) + tongue_owner.voice_filter = initial(tongue_owner.voice_filter) + +/obj/item/organ/internal/tongue/apply_organ_damage(damage_amount, maximum = maxHealth, required_organ_flag) + . = ..() + if(!owner) + return FALSE + apply_tongue_effects() + +/// Applies effects to our owner based on how damaged our tongue is +/obj/item/organ/internal/tongue/proc/apply_tongue_effects() + if(sense_of_taste) + //tongues can't taste food when they are failing + if(organ_flags & ORGAN_FAILING) + ADD_TRAIT(owner, TRAIT_AGEUSIA, ORGAN_TRAIT) + else + REMOVE_TRAIT(owner, TRAIT_AGEUSIA, ORGAN_TRAIT) + else + //tongues can't taste food when they lack a sense of taste + ADD_TRAIT(owner, TRAIT_AGEUSIA, ORGAN_TRAIT) + if(organ_flags & ORGAN_FAILING) + REMOVE_TRAIT(owner, TRAIT_SPEAKS_CLEARLY, SPEAKING_FROM_TONGUE) + else + ADD_TRAIT(owner, TRAIT_SPEAKS_CLEARLY, SPEAKING_FROM_TONGUE) + +/obj/item/organ/internal/tongue/could_speak_language(datum/language/language_path) + return (language_path in languages_possible) + +/obj/item/organ/internal/tongue/get_availability(datum/species/owner_species, mob/living/owner_mob) + return owner_species.mutanttongue + +/obj/item/organ/internal/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" + taste_sensitivity = 10 // combined nose + tongue, extra sensitive + modifies_speech = TRUE + languages_native = list(/datum/language/draconic) + liked_foodtypes = GORE | MEAT | SEAFOOD | NUTS | BUGS + disliked_foodtypes = GRAIN | DAIRY | CLOTH | GROSS + voice_filter = @{"[0:a] asplit [out0][out2]; [out0] asetrate=%SAMPLE_RATE%*0.9,aresample=%SAMPLE_RATE%,atempo=1/0.9,aformat=channel_layouts=mono,volume=0.2 [p0]; [out2] asetrate=%SAMPLE_RATE%*1.1,aresample=%SAMPLE_RATE%,atempo=1/1.1,aformat=channel_layouts=mono,volume=0.2[p2]; [p0][0][p2] amix=inputs=3"} +/obj/item/organ/internal/tongue/lizard/modify_speech(datum/source, list/speech_args) + var/static/regex/lizard_hiss = new("s+", "g") + var/static/regex/lizard_hiSS = new("S+", "g") + var/static/regex/lizard_kss = new(@"(\w)x", "g") + var/static/regex/lizard_kSS = new(@"(\w)X", "g") + var/static/regex/lizard_ecks = new(@"\bx([\-|r|R]|\b)", "g") + var/static/regex/lizard_eckS = new(@"\bX([\-|r|R]|\b)", "g") + var/message = speech_args[SPEECH_MESSAGE] + if(message[1] != "*") + message = lizard_hiss.Replace(message, "sss") + message = lizard_hiSS.Replace(message, "SSS") + message = lizard_kss.Replace(message, "$1kss") + message = lizard_kSS.Replace(message, "$1KSS") + message = lizard_ecks.Replace(message, "ecks$1") + message = lizard_eckS.Replace(message, "ECKS$1") + speech_args[SPEECH_MESSAGE] = message + +/obj/item/organ/internal/tongue/lizard/silver + name = "silver tongue" + desc = "A genetic branch of the high society Silver Scales that gives them their silverizing properties. To them, it is everything, and society traitors have their tongue forcibly revoked. Oddly enough, it itself is just blue." + icon_state = "silvertongue" + actions_types = list(/datum/action/cooldown/turn_to_statue) + +/datum/action/cooldown/turn_to_statue + name = "Become Statue" + desc = "Become an elegant silver statue. Its durability and yours are directly tied together, so make sure you're careful." + button_icon = 'icons/obj/medical/organs/organs.dmi' + button_icon_state = "silvertongue" + cooldown_time = 10 SECONDS + check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_LYING + + /// The statue we turn into. + /// We only ever make one (in New) and simply move it into nullspace or back. + var/obj/structure/statue/custom/statue + +/datum/action/cooldown/turn_to_statue/New(Target) + . = ..() + if(!istype(Target, /obj/item/organ/internal/tongue/lizard/silver)) + stack_trace("Non-silverscale tongue initialized a turn to statue action.") + qdel(src) + return + + init_statue() + +/datum/action/cooldown/turn_to_statue/Destroy() + clean_up_statue() + return ..() + +/datum/action/cooldown/turn_to_statue/IsAvailable(feedback) + . = ..() + if(!.) + return FALSE + + if(!isliving(owner)) + return FALSE + var/obj/item/organ/internal/tongue/lizard/silver/tongue_target = target + if(tongue_target.owner != owner) + return FALSE + + if(isnull(statue)) + if(feedback) + owner.balloon_alert(owner, "you can't seem to statue-ize!") + return FALSE // permanently bricked + if(owner.stat != CONSCIOUS) + if(feedback) + owner.balloon_alert(owner, "you're too weak!") + return FALSE + + return TRUE + +/datum/action/cooldown/turn_to_statue/Activate(atom/target) + StartCooldown(3 SECONDS) + + var/is_statue = owner.loc == statue + if(!is_statue) + owner.visible_message( + span_notice("[owner] strikes a glorious pose."), + span_notice("You strike a glorious pose as you become a statue!"), + ) + + owner.balloon_alert(owner, is_statue ? "breaking free..." : "striking a pose...") + if(!do_after(owner, (is_statue ? 0.5 SECONDS : 3 SECONDS), target = get_turf(owner))) + owner.balloon_alert(owner, "interrupted!") + return + + StartCooldown() + + statue.name = "statue of [owner.real_name]" + statue.desc = "statue depicting [owner.real_name]" + + if(is_statue) + statue.visible_message(span_danger("[statue] becomes animated!")) + owner.forceMove(get_turf(statue)) + statue.moveToNullspace() + UnregisterSignal(owner, COMSIG_MOVABLE_MOVED) + + else + owner.visible_message( + span_notice("[owner] hardens into a silver statue."), + span_notice("You have become a silver statue!"), + ) + statue.set_visuals(owner.appearance) + statue.forceMove(get_turf(owner)) + owner.forceMove(statue) + RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(human_left_statue)) + + var/mob/living/living_owner = owner + statue.update_integrity(living_owner.health) // Statue has 100 health, humans have 100 health + +/// Somehow they used an exploit/teleportation to leave statue, lets clean up +/datum/action/cooldown/turn_to_statue/proc/human_left_statue(atom/movable/mover, atom/oldloc, direction) + SIGNAL_HANDLER + + statue.moveToNullspace() + UnregisterSignal(mover, COMSIG_MOVABLE_MOVED) + +/// Statue was destroyed via IC means (destruction / deconstruction), dust the owner and drop their stuff +/datum/action/cooldown/turn_to_statue/proc/statue_destroyed(datum/source) + SIGNAL_HANDLER + + if(isnull(statue.loc)) + return // the statue ended up getting destroyed while in nullspace? + + var/mob/living/carbon/carbon_owner = owner + RegisterSignal(carbon_owner, COMSIG_MOVABLE_MOVED) + + to_chat(carbon_owner, span_userdanger("Your existence as a living creature snaps as your statue form crumbles!")) + carbon_owner.forceMove(get_turf(statue)) + carbon_owner.dust(just_ash = TRUE, drop_items = TRUE) + carbon_owner.investigate_log("has been dusted from having their Silverscale Statue deconstructed / destroyed.", INVESTIGATE_DEATHS) + + clean_up_statue() // unregister signal before we can do further side effects. + +/// Statue was qdeleted outright, do nothing but clear refs. +/datum/action/cooldown/turn_to_statue/proc/statue_deleted(datum/source) + SIGNAL_HANDLER + + clean_up_statue() // Note that if the lizard is in the statue when they're raw deleted, they too will be raw deleted. This is fine + +/// Initializes the statue we're going to hang around inside +/datum/action/cooldown/turn_to_statue/proc/init_statue() + statue = new() + statue.set_custom_materials(list(/datum/material/silver = SHEET_MATERIAL_AMOUNT * 5)) + statue.max_integrity = 100 // statues already have 100 max integrity, so this is a safety net + statue.set_armor(/datum/armor/obj_structure/silverscale_statue_armor) + statue.flags_ricochet |= RICOCHET_SHINY + RegisterSignals(statue, list(COMSIG_OBJ_DECONSTRUCT, COMSIG_ATOM_DESTRUCTION), PROC_REF(statue_destroyed)) + RegisterSignal(statue, COMSIG_QDELETING, PROC_REF(statue_deleted)) + +/// Cleans up the reference to the statue and unregisters signals +/datum/action/cooldown/turn_to_statue/proc/clean_up_statue() + if(QDELETED(statue)) + statue = null + return + + UnregisterSignal(statue, list(COMSIG_OBJ_DECONSTRUCT, COMSIG_ATOM_DESTRUCTION, COMSIG_QDELETING)) + QDEL_NULL(statue) + +/datum/armor/obj_structure/silverscale_statue_armor + melee = 50 + bullet = 50 + laser = 70 + energy = 70 + bomb = 50 + fire = 100 + +/obj/item/organ/internal/tongue/abductor + 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" + sense_of_taste = FALSE + modifies_speech = TRUE + var/mothership + +/obj/item/organ/internal/tongue/abductor/attack_self(mob/living/carbon/human/tongue_holder) + if(!istype(tongue_holder)) + return + + var/obj/item/organ/internal/tongue/abductor/tongue = tongue_holder.get_organ_slot(ORGAN_SLOT_TONGUE) + if(!istype(tongue)) + return + + if(tongue.mothership == mothership) + to_chat(tongue_holder, span_notice("[src] is already attuned to the same channel as your own.")) + + tongue_holder.visible_message(span_notice("[tongue_holder] holds [src] in their hands, and concentrates for a moment."), span_notice("You attempt to modify the attenuation of [src].")) + if(do_after(tongue_holder, delay=15, target=src)) + to_chat(tongue_holder, span_notice("You attune [src] to your own channel.")) + mothership = tongue.mothership + +/obj/item/organ/internal/tongue/abductor/examine(mob/examining_mob) + . = ..() + if(HAS_MIND_TRAIT(examining_mob, TRAIT_ABDUCTOR_TRAINING) || isobserver(examining_mob)) + . += span_notice("It can be attuned to a different channel by using it inhand.") + if(!mothership) + . += span_notice("It is not attuned to a specific mothership.") + else + . += span_notice("It is attuned to [mothership].") + +/obj/item/organ/internal/tongue/abductor/modify_speech(datum/source, list/speech_args) + //Hacks + var/message = speech_args[SPEECH_MESSAGE] + var/mob/living/carbon/human/user = source + var/rendered = span_abductor("[user.real_name]: [message]") + user.log_talk(message, LOG_SAY, tag=SPECIES_ABDUCTOR) + for(var/mob/living/carbon/human/living_mob in GLOB.alive_mob_list) + var/obj/item/organ/internal/tongue/abductor/tongue = living_mob.get_organ_slot(ORGAN_SLOT_TONGUE) + if(!istype(tongue)) + continue + if(mothership == tongue.mothership) + to_chat(living_mob, rendered) + + for(var/mob/dead_mob in GLOB.dead_mob_list) + var/link = FOLLOW_LINK(dead_mob, user) + to_chat(dead_mob, "[link] [rendered]") + + speech_args[SPEECH_MESSAGE] = "" + +/obj/item/organ/internal/tongue/zombie + 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" + modifies_speech = TRUE + taste_sensitivity = 32 + liked_foodtypes = GROSS | MEAT | RAW | GORE + disliked_foodtypes = NONE + +// List of english words that translate to zombie phrases +GLOBAL_LIST_INIT(english_to_zombie, list()) + +/obj/item/organ/internal/tongue/zombie/proc/add_word_to_translations(english_word, zombie_word) + GLOB.english_to_zombie[english_word] = zombie_word + // zombies don't care about grammar (any tense or form is all translated to the same word) + GLOB.english_to_zombie[english_word + plural_s(english_word)] = zombie_word + GLOB.english_to_zombie[english_word + "ing"] = zombie_word + GLOB.english_to_zombie[english_word + "ed"] = zombie_word + +/obj/item/organ/internal/tongue/zombie/proc/load_zombie_translations() + var/list/zombie_translation = strings("zombie_replacement.json", "zombie") + for(var/zombie_word in zombie_translation) + // since zombie words are a reverse list, we gotta do this backwards + var/list/data = islist(zombie_translation[zombie_word]) ? zombie_translation[zombie_word] : list(zombie_translation[zombie_word]) + for(var/english_word in data) + add_word_to_translations(english_word, zombie_word) + GLOB.english_to_zombie = sort_list(GLOB.english_to_zombie) // Alphabetizes the list (for debugging) + +/obj/item/organ/internal/tongue/zombie/modify_speech(datum/source, list/speech_args) + var/message = speech_args[SPEECH_MESSAGE] + if(message[1] != "*") + // setup the global list for translation if it hasn't already been done + if(!length(GLOB.english_to_zombie)) + load_zombie_translations() + + // make a list of all words that can be translated + var/list/message_word_list = splittext(message, " ") + var/list/translated_word_list = list() + for(var/word in message_word_list) + word = GLOB.english_to_zombie[lowertext(word)] + translated_word_list += word ? word : FALSE + + // all occurrences of characters "eiou" (case-insensitive) are replaced with "r" + message = replacetext(message, regex(@"[eiou]", "ig"), "r") + // all characters other than "zhrgbmna .!?-" (case-insensitive) are stripped + message = replacetext(message, regex(@"[^zhrgbmna.!?-\s]", "ig"), "") + // multiple spaces are replaced with a single (whitespace is trimmed) + message = replacetext(message, regex(@"(\s+)", "g"), " ") + + var/list/old_words = splittext(message, " ") + var/list/new_words = list() + for(var/word in old_words) + // lower-case "r" at the end of words replaced with "rh" + word = replacetext(word, regex(@"\lr\b"), "rh") + // an "a" or "A" by itself will be replaced with "hra" + word = replacetext(word, regex(@"\b[Aa]\b"), "hra") + new_words += word + + // if words were not translated, then we apply our zombie speech patterns + for(var/i in 1 to length(new_words)) + new_words[i] = translated_word_list[i] ? translated_word_list[i] : new_words[i] + + message = new_words.Join(" ") + message = capitalize(message) + speech_args[SPEECH_MESSAGE] = message + +/obj/item/organ/internal/tongue/alien + 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" + taste_sensitivity = 10 // LIZARDS ARE ALIENS CONFIRMED + modifies_speech = TRUE // not really, they just hiss + voice_filter = @{"[0:a] asplit [out0][out2]; [out0] asetrate=%SAMPLE_RATE%*0.8,aresample=%SAMPLE_RATE%,atempo=1/0.8,aformat=channel_layouts=mono [p0]; [out2] asetrate=%SAMPLE_RATE%*1.2,aresample=%SAMPLE_RATE%,atempo=1/1.2,aformat=channel_layouts=mono[p2]; [p0][0][p2] amix=inputs=3"} +// Aliens can only speak alien and a few other languages. +/obj/item/organ/internal/tongue/alien/get_possible_languages() + return list( + /datum/language/xenocommon, + /datum/language/common, + /datum/language/uncommon, + /datum/language/draconic, // Both hiss? + /datum/language/monkey, + ) + +/obj/item/organ/internal/tongue/alien/modify_speech(datum/source, list/speech_args) + var/datum/saymode/xeno/hivemind = speech_args[SPEECH_SAYMODE] + if(hivemind) + return + + playsound(owner, SFX_HISS, 25, TRUE, TRUE) + +/obj/item/organ/internal/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" + attack_verb_continuous = list("bites", "chatters", "chomps", "enamelles", "bones") + attack_verb_simple = list("bite", "chatter", "chomp", "enamel", "bone") + sense_of_taste = FALSE + liked_foodtypes = GROSS | MEAT | RAW | GORE | DAIRY //skeletons eat spooky shit... and dairy, of course + disliked_foodtypes = NONE + modifies_speech = TRUE + var/chattering = FALSE + var/phomeme_type = "sans" + var/list/phomeme_types = list("sans", "papyrus") + +/obj/item/organ/internal/tongue/bone/Initialize(mapload) + . = ..() + phomeme_type = pick(phomeme_types) + +// Bone tongues can speak all default + calcic +/obj/item/organ/internal/tongue/bone/get_possible_languages() + return ..() + /datum/language/calcic + +/obj/item/organ/internal/tongue/bone/modify_speech(datum/source, list/speech_args) + if (chattering) + chatter(speech_args[SPEECH_MESSAGE], phomeme_type, source) + switch(phomeme_type) + if("sans") + speech_args[SPEECH_SPANS] |= SPAN_SANS + if("papyrus") + speech_args[SPEECH_SPANS] |= SPAN_PAPYRUS + +/obj/item/organ/internal/tongue/bone/plasmaman + name = "plasma bone \"tongue\"" + desc = "Like animated skeletons, Plasmamen vibrate their teeth in order to produce speech." + icon_state = "tongueplasma" + modifies_speech = FALSE + liked_foodtypes = VEGETABLES + disliked_foodtypes = FRUIT | CLOTH + +/obj/item/organ/internal/tongue/robot + name = "robotic voicebox" + desc = "A voice synthesizer that can interface with organic lifeforms." + failing_desc = "seems to be broken." + organ_flags = ORGAN_ROBOTIC + icon_state = "tonguerobot" + say_mod = "states" + attack_verb_continuous = list("beeps", "boops") + attack_verb_simple = list("beep", "boop") + modifies_speech = TRUE + taste_sensitivity = 25 // not as good as an organic tongue + voice_filter = "alimiter=0.9,acompressor=threshold=0.2:ratio=20:attack=10:release=50:makeup=2,highpass=f=1000" + +/obj/item/organ/internal/tongue/robot/can_speak_language(language) + return TRUE // THE MAGIC OF ELECTRONICS + +/obj/item/organ/internal/tongue/robot/modify_speech(datum/source, list/speech_args) + speech_args[SPEECH_SPANS] |= SPAN_ROBOT + +/obj/item/organ/internal/tongue/snail + name = "radula" + desc = "A minutely toothed, chitious ribbon, which as a side effect, makes all snails talk IINNCCRREEDDIIBBLLYY SSLLOOWWLLYY." + color = "#96DB00" // TODO proper sprite, rather than recoloured pink tongue + modifies_speech = TRUE + voice_filter = "atempo=0.5" // makes them talk really slow + +/obj/item/organ/internal/tongue/snail/modify_speech(datum/source, list/speech_args) + var/new_message + var/message = speech_args[SPEECH_MESSAGE] + for(var/i in 1 to length(message)) + if(findtext("ABCDEFGHIJKLMNOPWRSTUVWXYZabcdefghijklmnopqrstuvwxyz", message[i])) //Im open to suggestions + new_message += message[i] + message[i] + message[i] //aaalllsssooo ooopppeeennn tttooo sssuuuggggggeeessstttiiiooonsss + else + new_message += message[i] + speech_args[SPEECH_MESSAGE] = new_message + +/obj/item/organ/internal/tongue/ethereal + name = "electric discharger" + desc = "A sophisticated ethereal organ, capable of synthesising speech via electrical discharge." + icon_state = "electrotongue" + say_mod = "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 + liked_foodtypes = NONE //no food is particularly liked by ethereals + disliked_foodtypes = GROSS + toxic_foodtypes = NONE //no food is particularly toxic to ethereals + attack_verb_continuous = list("shocks", "jolts", "zaps") + attack_verb_simple = list("shock", "jolt", "zap") + voice_filter = @{"[0:a] asplit [out0][out2]; [out0] asetrate=%SAMPLE_RATE%*0.99,aresample=%SAMPLE_RATE%,volume=0.3 [p0]; [p0][out2] amix=inputs=2"} + +// Ethereal tongues can speak all default + voltaic +/obj/item/organ/internal/tongue/ethereal/get_possible_languages() + return ..() + /datum/language/voltaic + +/obj/item/organ/internal/tongue/cat + name = "felinid tongue" + desc = "A fleshy muscle mostly used for meowing." + say_mod = "meows" + liked_foodtypes = SEAFOOD | ORANGES | BUGS | GORE + disliked_foodtypes = GROSS | CLOTH | RAW + +/obj/item/organ/internal/tongue/jelly + name = "jelly tongue" + desc = "Ah... That's not the sound I expected it to make. Sounds like a Space Autumn Bird." + say_mod = "chirps" + liked_foodtypes = MEAT | BUGS + disliked_foodtypes = GROSS + toxic_foodtypes = NONE + +/obj/item/organ/internal/tongue/jelly/get_food_taste_reaction(obj/item/food, foodtypes = NONE) + // a silver slime created this? what a delicacy! + if(HAS_TRAIT(food, TRAIT_FOOD_SILVER)) + return FOOD_LIKED + return ..() + +/obj/item/organ/internal/tongue/monkey + name = "primitive tongue" + desc = "For aggressively chimpering. And consuming bananas." + say_mod = "chimpers" + liked_foodtypes = MEAT | FRUIT | BUGS + disliked_foodtypes = CLOTH + +/obj/item/organ/internal/tongue/moth + name = "moth tongue" + desc = "Moths don't have tongues. Someone get god on the phone, tell them I'm not happy." + say_mod = "flutters" + liked_foodtypes = VEGETABLES | DAIRY | CLOTH + disliked_foodtypes = FRUIT | GROSS | BUGS | GORE + toxic_foodtypes = MEAT | RAW | SEAFOOD + +/obj/item/organ/internal/tongue/zombie + name = "rotting tongue" + desc = "Makes you speak like you're at the dentist and you just absolutely refuse to spit because you forgot to mention you were allergic to space shellfish." + say_mod = "moans" + +/obj/item/organ/internal/tongue/mush + name = "mush-tongue-room" + desc = "You poof with this. Got it?" + icon = 'icons/obj/service/hydroponics/seeds.dmi' + icon_state = "mycelium-angel" + say_mod = "poofs" + +/obj/item/organ/internal/tongue/pod + name = "pod tongue" + desc = "A plant-like organ used for speaking and eating." + say_mod = "whistles" + liked_foodtypes = VEGETABLES | FRUIT | GRAIN + disliked_foodtypes = GORE | MEAT | DAIRY | SEAFOOD | BUGS + +/obj/item/organ/internal/tongue/golem + name = "golem tongue" + desc = "This silicate plate doesn't seem particularly mobile, but golems use it to form sounds." + color = COLOR_WEBSAFE_DARK_GRAY + organ_flags = ORGAN_MINERAL + say_mod = "rumbles" + sense_of_taste = FALSE + liked_foodtypes = STONE + disliked_foodtypes = NONE //you don't care for much else besides stone + toxic_foodtypes = NONE //you can eat fucking uranium diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/internal/vocal_cords/_vocal_cords.dm similarity index 100% rename from code/modules/surgery/organs/vocal_cords.dm rename to code/modules/surgery/organs/internal/vocal_cords/_vocal_cords.dm diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm deleted file mode 100644 index 7c0de6f043a90..0000000000000 --- a/code/modules/surgery/organs/liver.dm +++ /dev/null @@ -1,267 +0,0 @@ -#define LIVER_DEFAULT_TOX_TOLERANCE 3 //amount of toxins the liver can filter out -#define LIVER_DEFAULT_TOX_RESISTANCE 1 //lower values lower how harmful toxins are to the liver -#define LIVER_FAILURE_STAGE_SECONDS 60 //amount of seconds before liver failure reaches a new stage -#define MAX_TOXIN_LIVER_DAMAGE 2 //the max damage the liver can recieve per second (~1 min at max damage will destroy liver) - -/obj/item/organ/internal/liver - name = "liver" - icon_state = "liver" - visual = FALSE - w_class = WEIGHT_CLASS_SMALL - zone = BODY_ZONE_CHEST - slot = ORGAN_SLOT_LIVER - desc = "Pairing suggestion: chianti and fava beans." - - maxHealth = STANDARD_ORGAN_THRESHOLD - healing_factor = STANDARD_ORGAN_HEALING - 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) - - /// Affects how much damage the liver takes from alcohol - var/alcohol_tolerance = ALCOHOL_RATE - /// The maximum volume of toxins the liver will ignore - var/toxTolerance = LIVER_DEFAULT_TOX_TOLERANCE - /// Modifies how much damage toxin deals to the liver - var/liver_resistance = LIVER_DEFAULT_TOX_RESISTANCE - var/filterToxins = TRUE //whether to filter toxins - var/operated = FALSE //whether the liver's been repaired with surgery and can be fixed again or not - -/obj/item/organ/internal/liver/Initialize(mapload) - . = ..() - // If the liver handles foods like a clown, it honks like a bike horn - // Don't think about it too much. - RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_COMEDY_METABOLISM), PROC_REF(on_add_comedy_metabolism)) - -/* Signal handler for the liver gaining the TRAIT_COMEDY_METABOLISM trait - * - * Adds the "squeak" component, so clown livers will act just like their - * bike horns, and honk when you hit them with things, or throw them - * against things, or step on them. - * - * The removal of the component, if this liver loses that trait, is handled - * by the component itself. - */ -/obj/item/organ/internal/liver/proc/on_add_comedy_metabolism() - SIGNAL_HANDLER - - // Are clown "bike" horns made from the livers of ex-clowns? - // Would that make the clown more or less likely to honk it - AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 50, falloff_exponent = 20) - -/obj/item/organ/internal/liver/examine(mob/user) - . = ..() - - if(HAS_TRAIT(user, TRAIT_ENTRAILS_READER) || (user.mind && HAS_TRAIT(user.mind, TRAIT_ENTRAILS_READER)) || isobserver(user)) - if(HAS_TRAIT(src, TRAIT_LAW_ENFORCEMENT_METABOLISM)) - . += "Fatty deposits and sprinkle residue, imply that this is the liver of someone in security." - if(HAS_TRAIT(src, TRAIT_CULINARY_METABOLISM)) - . += "The high iron content and slight smell of garlic, implies that this is the liver of a cook." - if(HAS_TRAIT(src, TRAIT_COMEDY_METABOLISM)) - . += "A smell of bananas, a slippery sheen and [span_clown("honking")] when depressed, implies that this is the liver of a clown." - if(HAS_TRAIT(src, TRAIT_MEDICAL_METABOLISM)) - . += "Marks of stress and a faint whiff of medicinal alcohol, imply that this is the liver of a medical worker." - if(HAS_TRAIT(src, TRAIT_ENGINEER_METABOLISM)) - . += "Signs of radiation exposure and space adaption, implies that this is the liver of an engineer." - if(HAS_TRAIT(src, TRAIT_BALLMER_SCIENTIST)) - . += "Strange glowing residues, sprinklings of congealed solid plasma, and what seem to be tumors indicate this is the radiated liver of a scientist." - if(HAS_TRAIT(src, TRAIT_MAINTENANCE_METABOLISM)) - . += "A half-digested rat's tail (somehow), disgusting sludge, and the faint smell of Grey Bull imply this is what remains of an assistant's liver." - - // royal trumps pretender royal - if(HAS_TRAIT(src, TRAIT_ROYAL_METABOLISM)) - . += "A rich diet of luxury food, suppleness from soft beds, implies that this is the liver of a head of staff." - else if(HAS_TRAIT(src, TRAIT_PRETENDER_ROYAL_METABOLISM)) - . += "A diet of imitation caviar, and signs of insomnia, implies that this is the liver of someone who wants to be a head of staff." - -/obj/item/organ/internal/liver/before_organ_replacement(obj/item/organ/replacement) - . = ..() - if(!istype(replacement, type)) - return - - var/datum/job/owner_job = owner.mind?.assigned_role - if(!owner_job || !LAZYLEN(owner_job.liver_traits)) - return - - // Transfer over liver traits from jobs, if we should have them - for(var/readded_trait in owner_job.liver_traits) - if(!HAS_TRAIT_FROM(src, readded_trait, JOB_TRAIT)) - continue - ADD_TRAIT(replacement, readded_trait, JOB_TRAIT) - -#define HAS_SILENT_TOXIN 0 //don't provide a feedback message if this is the only toxin present -#define HAS_NO_TOXIN 1 -#define HAS_PAINFUL_TOXIN 2 - -/obj/item/organ/internal/liver/on_life(seconds_per_tick, times_fired) - var/mob/living/carbon/liver_owner = owner - . = ..() //perform general on_life() - - if(!istype(liver_owner)) - return - if(organ_flags & ORGAN_FAILING || HAS_TRAIT(liver_owner, TRAIT_NOMETABOLISM)) //If your liver is failing or you lack a metabolism then we use the liverless version of metabolize - liver_owner.reagents.metabolize(liver_owner, seconds_per_tick, times_fired, can_overdose=TRUE, liverless=TRUE) - return - - var/obj/belly = liver_owner.get_organ_slot(ORGAN_SLOT_STOMACH) - var/list/cached_reagents = liver_owner.reagents.reagent_list - var/liver_damage = 0 - var/provide_pain_message = HAS_NO_TOXIN - - if(filterToxins && !HAS_TRAIT(liver_owner, TRAIT_TOXINLOVER)) - for(var/datum/reagent/toxin/toxin in cached_reagents) - if(status != toxin.affected_organtype) //this particular toxin does not affect this type of organ - continue - var/amount = round(toxin.volume, CHEMICAL_QUANTISATION_LEVEL) // this is an optimization - if(belly) - amount += belly.reagents.get_reagent_amount(toxin.type) - - // a 15u syringe is a nice baseline to scale lethality by - liver_damage += ((amount/15) * toxin.toxpwr) / liver_resistance - - if(provide_pain_message != HAS_PAINFUL_TOXIN) - provide_pain_message = toxin.silent_toxin ? HAS_SILENT_TOXIN : HAS_PAINFUL_TOXIN - - liver_owner.reagents.metabolize(liver_owner, seconds_per_tick, times_fired, can_overdose=TRUE) - - if(liver_damage) - apply_organ_damage(min(liver_damage * seconds_per_tick , MAX_TOXIN_LIVER_DAMAGE * seconds_per_tick)) - - if(provide_pain_message && damage > 10 && SPT_PROB(damage/6, seconds_per_tick)) //the higher the damage the higher the probability - to_chat(liver_owner, span_warning("You feel a dull pain in your abdomen.")) - - -/obj/item/organ/internal/liver/handle_failing_organs(seconds_per_tick) - if(HAS_TRAIT(owner, TRAIT_STABLELIVER) || HAS_TRAIT(owner, TRAIT_NOMETABOLISM)) - return - return ..() - -/obj/item/organ/internal/liver/organ_failure(seconds_per_tick) - 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 * seconds_per_tick,forced = TRUE) - owner.adjust_disgust(0.1 * seconds_per_tick) - - if(2 * LIVER_FAILURE_STAGE_SECONDS to 3 * LIVER_FAILURE_STAGE_SECONDS - 1) - owner.adjustToxLoss(0.4 * seconds_per_tick,forced = TRUE) - owner.adjust_drowsiness(0.5 SECONDS * seconds_per_tick) - owner.adjust_disgust(0.3 * seconds_per_tick) - - if(3 * LIVER_FAILURE_STAGE_SECONDS to 4 * LIVER_FAILURE_STAGE_SECONDS - 1) - owner.adjustToxLoss(0.6 * seconds_per_tick,forced = TRUE) - owner.adjustOrganLoss(pick(ORGAN_SLOT_HEART,ORGAN_SLOT_LUNGS,ORGAN_SLOT_STOMACH,ORGAN_SLOT_EYES,ORGAN_SLOT_EARS),0.2 * seconds_per_tick) - owner.adjust_drowsiness(1 SECONDS * seconds_per_tick) - owner.adjust_disgust(0.6 * seconds_per_tick) - - if(SPT_PROB(1.5, seconds_per_tick)) - owner.emote("drool") - - if(4 * LIVER_FAILURE_STAGE_SECONDS to INFINITY) - owner.adjustToxLoss(0.8 * seconds_per_tick,forced = TRUE) - owner.adjustOrganLoss(pick(ORGAN_SLOT_HEART,ORGAN_SLOT_LUNGS,ORGAN_SLOT_STOMACH,ORGAN_SLOT_EYES,ORGAN_SLOT_EARS),0.5 * seconds_per_tick) - owner.adjust_drowsiness(1.6 SECONDS * seconds_per_tick) - owner.adjust_disgust(1.2 * seconds_per_tick) - - if(SPT_PROB(3, seconds_per_tick)) - owner.emote("drool") - -/obj/item/organ/internal/liver/on_owner_examine(datum/source, mob/user, list/examine_list) - if(!ishuman(owner) || !(organ_flags & ORGAN_FAILING)) - return - - var/mob/living/carbon/human/humie_owner = owner - if(!humie_owner.get_organ_slot(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 [owner.p_they()] [owner.p_are()] 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(TRUE)] [owner.p_do()]n't look like [owner.p_they()] will be alive for much longer.") - -/obj/item/organ/internal/liver/get_availability(datum/species/owner_species, mob/living/owner_mob) - return owner_species.mutantliver - -/obj/item/organ/internal/liver/plasmaman - name = "reagent processing crystal" - icon_state = "liver-p" - desc = "A large crystal that is somehow capable of metabolizing chemicals, these are found in plasmamen." - status = ORGAN_MINERAL - -// alien livers can ignore up to 15u of toxins, but they take x3 liver damage -/obj/item/organ/internal/liver/alien - 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." - liver_resistance = 0.333 * LIVER_DEFAULT_TOX_RESISTANCE // -66% - toxTolerance = 15 // complete toxin immunity like xenos have would be too powerful - -/obj/item/organ/internal/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 - liver_resistance = 0.9 * LIVER_DEFAULT_TOX_RESISTANCE // -10% - maxHealth = STANDARD_ORGAN_THRESHOLD*0.5 - var/emp_vulnerability = 80 //Chance of permanent effects if emp-ed. - -/obj/item/organ/internal/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 - liver_resistance = 1.2 * LIVER_DEFAULT_TOX_RESISTANCE // +20% - emp_vulnerability = 40 - -/obj/item/organ/internal/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 - liver_resistance = 1.5 * LIVER_DEFAULT_TOX_RESISTANCE // +50% - emp_vulnerability = 20 - -/obj/item/organ/internal/liver/cybernetic/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - if(!COOLDOWN_FINISHED(src, severe_cooldown)) //So we cant just spam emp to kill people. - owner.adjustToxLoss(10) - COOLDOWN_START(src, severe_cooldown, 10 SECONDS) - if(prob(emp_vulnerability/severity)) //Chance of permanent effects - organ_flags |= ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon. - -#undef HAS_SILENT_TOXIN -#undef HAS_NO_TOXIN -#undef HAS_PAINFUL_TOXIN -#undef LIVER_DEFAULT_TOX_TOLERANCE -#undef LIVER_DEFAULT_TOX_RESISTANCE -#undef LIVER_FAILURE_STAGE_SECONDS -#undef MAX_TOXIN_LIVER_DAMAGE diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm deleted file mode 100644 index e46137006bcc7..0000000000000 --- a/code/modules/surgery/organs/lungs.dm +++ /dev/null @@ -1,944 +0,0 @@ -/obj/item/organ/internal/lungs - name = "lungs" - icon_state = "lungs" - visual = FALSE - zone = BODY_ZONE_CHEST - slot = ORGAN_SLOT_LUNGS - gender = PLURAL - w_class = WEIGHT_CLASS_SMALL - - var/respiration_type = NONE // The type(s) of gas this lung needs for respiration - - healing_factor = STANDARD_ORGAN_HEALING - 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." - high_threshold_passed = "You feel some sort of constriction around your chest as your breathing becomes shallow and rapid." - now_fixed = "Your lungs seem to once again be able to hold air." - 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) - - /// Our previous breath's partial pressures, in the form gas id -> partial pressure - var/list/last_partial_pressures = list() - /// List of gas to treat as other gas, in the form list(inital_gas, treat_as, multiplier) - var/list/treat_as = list() - /// Assoc list of procs to run while a gas is present, in the form gas id -> proc_path - var/list/breath_present = list() - /// Assoc list of procs to run when a gas is immediately removed from the breath, in the form gas id -> proc_path - var/list/breath_lost = list() - /// Assoc list of procs to always run, in the form gas_id -> proc_path - var/list/breathe_always = list() - - /// Gas mixture to breath out when we're done processing a breath - /// Will get emptied out when it's all done - var/datum/gas_mixture/immutable/breath_out - - //Breath damage - //These thresholds are checked against what amounts to total_mix_pressure * (gas_type_mols/total_mols) - var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa - var/safe_oxygen_max = 0 - var/safe_nitro_min = 0 - var/safe_co2_max = 10 // Yes it's an arbitrary value who cares? - var/safe_plasma_min = 0 - ///How much breath partial pressure is a safe amount of plasma. 0 means that we are immune to plasma. - var/safe_plasma_max = 0.05 - var/n2o_para_min = 1 //Sleeping agent - var/n2o_sleep_min = 5 //Sleeping agent - var/BZ_trip_balls_min = 1 //BZ gas - var/BZ_brain_damage_min = 10 //Give people some room to play around without killing the station - var/gas_stimulation_min = 0.002 // For, Pluoxium, Nitrium and Freon - ///Minimum amount of healium to make you unconscious for 4 seconds - var/healium_para_min = 3 - ///Minimum amount of healium to knock you down for good - var/healium_sleep_min = 6 - ///Minimum amount of helium to affect speech - var/helium_speech_min = 5 - ///Whether these lungs react negatively to miasma - var/suffers_miasma = TRUE - // Vars for N2O/healium induced euphoria, stun, and sleep. - var/n2o_euphoria = EUPHORIA_LAST_FLAG - var/healium_euphoria = EUPHORIA_LAST_FLAG - - - var/oxy_breath_dam_min = MIN_TOXIC_GAS_DAMAGE - var/oxy_breath_dam_max = MAX_TOXIC_GAS_DAMAGE - var/oxy_damage_type = OXY - var/nitro_breath_dam_min = MIN_TOXIC_GAS_DAMAGE - var/nitro_breath_dam_max = MAX_TOXIC_GAS_DAMAGE - var/nitro_damage_type = OXY - var/co2_breath_dam_min = MIN_TOXIC_GAS_DAMAGE - var/co2_breath_dam_max = MAX_TOXIC_GAS_DAMAGE - var/co2_damage_type = OXY - var/plas_breath_dam_min = MIN_TOXIC_GAS_DAMAGE - var/plas_breath_dam_max = MAX_TOXIC_GAS_DAMAGE - var/plas_damage_type = TOX - - var/tritium_irradiation_moles_min = 1 - var/tritium_irradiation_moles_max = 15 - var/tritium_irradiation_probability_min = 10 - var/tritium_irradiation_probability_max = 60 - - var/cold_message = "your face freezing and an icicle forming" - var/cold_level_1_threshold = 260 - var/cold_level_2_threshold = 200 - var/cold_level_3_threshold = 120 - var/cold_level_1_damage = COLD_GAS_DAMAGE_LEVEL_1 //Keep in mind with gas damage levels, you can set these to be negative, if you want someone to heal, instead. - var/cold_level_2_damage = COLD_GAS_DAMAGE_LEVEL_2 - var/cold_level_3_damage = COLD_GAS_DAMAGE_LEVEL_3 - var/cold_damage_type = BURN - - var/hot_message = "your face burning and a searing heat" - var/heat_level_1_threshold = 360 - var/heat_level_2_threshold = 400 - var/heat_level_3_threshold = 1000 - var/heat_level_1_damage = HEAT_GAS_DAMAGE_LEVEL_1 - var/heat_level_2_damage = HEAT_GAS_DAMAGE_LEVEL_2 - var/heat_level_3_damage = HEAT_GAS_DAMAGE_LEVEL_3 - var/heat_damage_type = BURN - - var/crit_stabilizing_reagent = /datum/reagent/medicine/epinephrine - -// assign the respiration_type -/obj/item/organ/internal/lungs/Initialize(mapload) - . = ..() - breath_out = new(BREATH_VOLUME) - - if(safe_nitro_min) - respiration_type |= RESPIRATION_N2 - if(safe_oxygen_min) - respiration_type |= RESPIRATION_OXYGEN - if(safe_plasma_min) - respiration_type |= RESPIRATION_PLASMA - - // Sets up what gases we want to react to, and in what way - // always is always processed, while_present is called when the gas is in the breath, and on_loss is called right after a gas is lost - // The naming convention goes like this - // always : breath_{gas_type} - // safe/neutral while_present : consume_{gas_type} - // safe/neutral on_loss : lose_{gas_type} - // dangerous while_present : too_much_{gas_type} - // dangerous on_loss : safe_{gas_type} - // These are reccomendations, if something seems better feel free to ignore them. S a bit vibes based - if(safe_oxygen_min) - add_gas_reaction(/datum/gas/oxygen, always = PROC_REF(breathe_oxygen)) - if(safe_oxygen_max) - add_gas_reaction(/datum/gas/oxygen, while_present = PROC_REF(too_much_oxygen), on_loss = PROC_REF(safe_oxygen)) - add_gas_reaction(/datum/gas/pluoxium, while_present = PROC_REF(consume_pluoxium)) - // We treat a mole of ploux as 8 moles of oxygen - add_gas_relationship(/datum/gas/pluoxium, /datum/gas/oxygen, 8) - if(safe_nitro_min) - add_gas_reaction(/datum/gas/nitrogen, always = PROC_REF(breathe_nitro)) - if(safe_co2_max) - add_gas_reaction(/datum/gas/carbon_dioxide, while_present = PROC_REF(too_much_co2), on_loss = PROC_REF(safe_co2)) - if(safe_plasma_min) - add_gas_reaction(/datum/gas/plasma, always = PROC_REF(breathe_plasma)) - if(safe_plasma_max) - add_gas_reaction(/datum/gas/plasma, while_present = PROC_REF(too_much_plasma), on_loss = PROC_REF(safe_plasma)) - add_gas_reaction(/datum/gas/bz, while_present = PROC_REF(too_much_bz)) - add_gas_reaction(/datum/gas/freon, while_present = PROC_REF(too_much_freon)) - add_gas_reaction(/datum/gas/halon, while_present = PROC_REF(too_much_halon)) - add_gas_reaction(/datum/gas/healium, while_present = PROC_REF(consume_healium), on_loss = PROC_REF(lose_healium)) - add_gas_reaction(/datum/gas/helium, while_present = PROC_REF(consume_helium), on_loss = PROC_REF(lose_helium)) - add_gas_reaction(/datum/gas/hypernoblium, while_present = PROC_REF(consume_hypernoblium)) - if(suffers_miasma) - add_gas_reaction(/datum/gas/miasma, while_present = PROC_REF(too_much_miasma), on_loss = PROC_REF(safe_miasma)) - add_gas_reaction(/datum/gas/nitrous_oxide, while_present = PROC_REF(too_much_n2o), on_loss = PROC_REF(safe_n2o)) - add_gas_reaction(/datum/gas/nitrium, while_present = PROC_REF(too_much_nitrium)) - add_gas_reaction(/datum/gas/tritium, while_present = PROC_REF(too_much_tritium)) - add_gas_reaction(/datum/gas/zauker, while_present = PROC_REF(too_much_zauker)) - -///Simply exists so that you don't keep any alerts from your previous lack of lungs. -/obj/item/organ/internal/lungs/Insert(mob/living/carbon/receiver, special = FALSE, drop_if_replaced = TRUE) - . = ..() - if(!.) - return . - receiver.clear_alert(ALERT_NOT_ENOUGH_OXYGEN) - receiver.clear_alert(ALERT_NOT_ENOUGH_CO2) - receiver.clear_alert(ALERT_NOT_ENOUGH_NITRO) - receiver.clear_alert(ALERT_NOT_ENOUGH_PLASMA) - receiver.clear_alert(ALERT_NOT_ENOUGH_N2O) - -/obj/item/organ/internal/lungs/Remove(mob/living/carbon/organ_owner, special) - . = ..() - // This is very "manual" I realize, but it's useful to ensure cleanup for gases we're removing happens - // Avoids stuck alerts and such - var/static/datum/gas_mixture/immutable/dummy = new(BREATH_VOLUME) - for(var/gas_id in last_partial_pressures) - var/on_loss = breath_lost[gas_id] - if(!on_loss) - continue - - call(src, on_loss)(organ_owner, dummy, last_partial_pressures[gas_id]) - dummy.garbage_collect() - -/** - * Tells the lungs to pay attention to the passed in gas type - * We'll check for it when breathing, in a few possible ways - * Accepts 3 optional arguments: - * - * proc/while_present * Called while the gas is present in our breath. Return BREATH_LOST to call on_loss afterwards - * proc/on_loss * Called after we have lost a gas from our breath. - * proc/always * Always called. Best suited for breathing procs, like oxygen - * - * while_present and always get the same arguments (mob/living/carbon/breather, datum/gas_mixture/breath, pp, old_pp) - * on_loss is almost exactly the same, except it doesn't pass in a current partial pressure, since one isn't avalible - */ -/obj/item/organ/internal/lungs/proc/add_gas_reaction(gas_type, while_present = null, on_loss = null, always = null) - if(always) - breathe_always[gas_type] = always - - if(isnull(while_present) && isnull(on_loss)) - return - - if(while_present) - breath_present[gas_type] = while_present - if(on_loss) - breath_lost[gas_type] = on_loss - -#define BREATH_RELATIONSHIP_INITIAL_GAS 1 -#define BREATH_RELATIONSHIP_CONVERT 2 -#define BREATH_RELATIONSHIP_MULTIPLIER 3 -/** - * Tells the lungs to treat the passed in gas type as another passed in gas type - * Takes the gas to check for as an argument, alongside the gas to convert and the multiplier to use - * These act in the order of insertion, use that how you will - */ -/obj/item/organ/internal/lungs/proc/add_gas_relationship(gas_type, convert_to, multiplier) - if(isnull(gas_type) || isnull(convert_to) || multiplier == 0) - return - - var/list/add = new /list(BREATH_RELATIONSHIP_MULTIPLIER) - add[BREATH_RELATIONSHIP_INITIAL_GAS] = gas_type - add[BREATH_RELATIONSHIP_CONVERT] = convert_to - add[BREATH_RELATIONSHIP_MULTIPLIER] = multiplier - treat_as += list(add) - -/// Clears away a gas relationship. Takes the same args as the initial addition -/obj/item/organ/internal/lungs/proc/remove_gas_relationship(gas_type, convert_to, multiplier) - if(isnull(gas_type) || isnull(convert_to) || multiplier == 0) - return - - for(var/packet in treat_as) - if(packet[BREATH_RELATIONSHIP_INITIAL_GAS] != gas_type) - continue - if(packet[BREATH_RELATIONSHIP_CONVERT] != convert_to) - continue - if(packet[BREATH_RELATIONSHIP_MULTIPLIER] != multiplier) - continue - treat_as -= packet - return - -/// Handles oxygen breathing. Always called by things that need o2, no matter what -/obj/item/organ/internal/lungs/proc/breathe_oxygen(mob/living/carbon/breather, datum/gas_mixture/breath, o2_pp, old_o2_pp) - if(o2_pp < safe_oxygen_min && !HAS_TRAIT(src, TRAIT_SPACEBREATHING)) - // Not safe to check the old pp because of can_breath_vacuum - breather.throw_alert(ALERT_NOT_ENOUGH_OXYGEN, /atom/movable/screen/alert/not_enough_oxy) - - var/gas_breathed = handle_suffocation(breather, o2_pp, safe_oxygen_min, breath.gases[/datum/gas/oxygen][MOLES]) - if(o2_pp) - breathe_gas_volume(breath, /datum/gas/oxygen, /datum/gas/carbon_dioxide, volume = gas_breathed) - return - - // If we used to not have enough, clear the alert - // Note this can be redundant, because of the vacuum check. It is fail safe tho, so it's ok - if(old_o2_pp < safe_oxygen_min) - breather.failed_last_breath = FALSE - breather.clear_alert(ALERT_NOT_ENOUGH_OXYGEN) - - breathe_gas_volume(breath, /datum/gas/oxygen, /datum/gas/carbon_dioxide) - // Heal mob if not in crit. - if(breather.health >= breather.crit_threshold && breather.oxyloss) - breather.adjustOxyLoss(-5) - -/// Maximum Oxygen effects. "Too much O2!" -/obj/item/organ/internal/lungs/proc/too_much_oxygen(mob/living/carbon/breather, datum/gas_mixture/breath, o2_pp, old_o2_pp) - // If too much Oxygen is poisonous. - if(o2_pp <= safe_oxygen_max) - if(old_o2_pp > safe_oxygen_max) - return BREATH_LOST - return - - var/ratio = (breath.gases[/datum/gas/oxygen][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) - -/// Handles NOT having too much o2. only relevant if safe_oxygen_max has a value -/obj/item/organ/internal/lungs/proc/safe_oxygen(mob/living/carbon/breather, datum/gas_mixture/breath, old_o2_pp) - breather.clear_alert(ALERT_TOO_MUCH_OXYGEN) - -/// Behaves like Oxygen with 8X efficacy, but metabolizes into a reagent. -/obj/item/organ/internal/lungs/proc/consume_pluoxium(mob/living/carbon/breather, datum/gas_mixture/breath, pluoxium_pp, old_pluoxium_pp) - breathe_gas_volume(breath, /datum/gas/pluoxium) - // Metabolize to reagent. - if(pluoxium_pp > gas_stimulation_min) - var/existing = breather.reagents.get_reagent_amount(/datum/reagent/pluoxium) - breather.reagents.add_reagent(/datum/reagent/pluoxium, max(0, 1 - existing)) - -/// If the lungs need Nitrogen to breathe properly, N2 is exchanged with CO2. -/obj/item/organ/internal/lungs/proc/breathe_nitro(mob/living/carbon/breather, datum/gas_mixture/breath, nitro_pp, old_nitro_pp) - if(nitro_pp < safe_nitro_min && !HAS_TRAIT(src, TRAIT_SPACEBREATHING)) - // Suffocation side-effects. - // Not safe to check the old pp because of can_breath_vacuum - breather.throw_alert(ALERT_NOT_ENOUGH_NITRO, /atom/movable/screen/alert/not_enough_nitro) - var/gas_breathed = handle_suffocation(breather, nitro_pp, safe_nitro_min, breath.gases[/datum/gas/nitrogen][MOLES]) - if(nitro_pp) - breathe_gas_volume(breath, /datum/gas/nitrogen, /datum/gas/carbon_dioxide, volume = gas_breathed) - return - - if(old_nitro_pp < safe_nitro_min) - breather.failed_last_breath = FALSE - breather.clear_alert(ALERT_NOT_ENOUGH_NITRO) - - // Inhale N2, exhale equivalent amount of CO2. Look ma, sideways breathing! - breathe_gas_volume(breath, /datum/gas/nitrogen, /datum/gas/carbon_dioxide) - // Heal mob if not in crit. - if(breather.health >= breather.crit_threshold && breather.oxyloss) - breather.adjustOxyLoss(-5) - -/// Maximum CO2 effects. "Too much CO2!" -/obj/item/organ/internal/lungs/proc/too_much_co2(mob/living/carbon/breather, datum/gas_mixture/breath, co2_pp, old_co2_pp) - if(co2_pp <= safe_co2_max) - if(old_co2_pp > safe_co2_max) - return BREATH_LOST - return - - // If it's the first breath with too much CO2 in it, lets start a counter, then have them pass out after 12s or so. - if(old_co2_pp < safe_co2_max) - breather.co2overloadtime = world.time - - // CO2 side-effects. - // Give the mob a chance to notice. - if(prob(20)) - breather.emote("cough") - - if((world.time - breather.co2overloadtime) > 12 SECONDS) - breather.throw_alert(ALERT_TOO_MUCH_CO2, /atom/movable/screen/alert/too_much_co2) - breather.Unconscious(6 SECONDS) - // Lets hurt em a little, let them know we mean business. - breather.apply_damage_type(3, co2_damage_type) - // They've been in here 30s now, start to kill them for their own good! - if((world.time - breather.co2overloadtime) > 30 SECONDS) - breather.apply_damage_type(8, co2_damage_type) - -/// Handles NOT having too much co2. only relevant if safe_co2_max has a value -/obj/item/organ/internal/lungs/proc/safe_co2(mob/living/carbon/breather, datum/gas_mixture/breath, old_co2_pp) - // Reset side-effects. - breather.co2overloadtime = 0 - breather.clear_alert(ALERT_TOO_MUCH_CO2) - -/// If the lungs need Plasma to breathe properly, Plasma is exchanged with CO2. -/obj/item/organ/internal/lungs/proc/breathe_plasma(mob/living/carbon/breather, datum/gas_mixture/breath, plasma_pp, old_plasma_pp) - // Suffocation side-effects. - if(plasma_pp < safe_plasma_min && !HAS_TRAIT(src, TRAIT_SPACEBREATHING)) - // Could check old_plasma_pp but vacuum breathing hates me - breather.throw_alert(ALERT_NOT_ENOUGH_PLASMA, /atom/movable/screen/alert/not_enough_plas) - // Breathe insufficient amount of Plasma, exhale CO2. - var/gas_breathed = handle_suffocation(breather, plasma_pp, safe_plasma_min, breath.gases[/datum/gas/plasma][MOLES]) - if(plasma_pp) - breathe_gas_volume(breath, /datum/gas/plasma, /datum/gas/carbon_dioxide, volume = gas_breathed) - return - - if(old_plasma_pp < safe_plasma_min) - breather.failed_last_breath = FALSE - breather.clear_alert(ALERT_NOT_ENOUGH_PLASMA) - // Inhale Plasma, exhale equivalent amount of CO2. - breathe_gas_volume(breath, /datum/gas/plasma, /datum/gas/carbon_dioxide) - // Heal mob if not in crit. - if(breather.health >= breather.crit_threshold && breather.oxyloss) - breather.adjustOxyLoss(-5) - -/// Maximum Plasma effects. "Too much Plasma!" -/obj/item/organ/internal/lungs/proc/too_much_plasma(mob/living/carbon/breather, datum/gas_mixture/breath, plasma_pp, old_plasma_pp) - if(plasma_pp <= safe_plasma_max) - if(old_plasma_pp > safe_plasma_max) - return BREATH_LOST - return - - // If it's the first breath with too much CO2 in it, lets start a counter, then have them pass out after 12s or so. - if(old_plasma_pp < safe_plasma_max) - breather.throw_alert(ALERT_TOO_MUCH_PLASMA, /atom/movable/screen/alert/too_much_plas) - - var/ratio = (breath.gases[/datum/gas/plasma][MOLES] / safe_plasma_max) * 10 - breather.apply_damage_type(clamp(ratio, plas_breath_dam_min, plas_breath_dam_max), plas_damage_type) - -/// Resets plasma side effects -/obj/item/organ/internal/lungs/proc/safe_plasma(mob/living/carbon/breather, datum/gas_mixture/breath, old_plasma_pp) - breather.clear_alert(ALERT_TOO_MUCH_PLASMA) - -/// Too much funny gas, time to get brain damage -/obj/item/organ/internal/lungs/proc/too_much_bz(mob/living/carbon/breather, datum/gas_mixture/breath, bz_pp, old_bz_pp) - if(bz_pp > BZ_trip_balls_min) - breather.adjust_hallucinations(20 SECONDS) - breather.reagents.add_reagent(/datum/reagent/bz_metabolites, 5) - if(bz_pp > BZ_brain_damage_min && prob(33)) - breather.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 150, ORGAN_ORGANIC) - -/// Breathing in refridgerator coolent, shit's caustic -/obj/item/organ/internal/lungs/proc/too_much_freon(mob/living/carbon/breather, datum/gas_mixture/breath, freon_pp, old_freon_pp) - // Inhale Freon. Exhale nothing. - breathe_gas_volume(breath, /datum/gas/freon) - if (freon_pp > gas_stimulation_min) - breather.reagents.add_reagent(/datum/reagent/freon, 1) - if (prob(freon_pp)) - to_chat(breather, span_alert("Your mouth feels like it's burning!")) - if (freon_pp > 40) - breather.emote("gasp") - breather.adjustFireLoss(15) - if (prob(freon_pp / 2)) - to_chat(breather, span_alert("Your throat closes up!")) - breather.set_silence_if_lower(6 SECONDS) - else - breather.adjustFireLoss(freon_pp / 4) - -/// Breathing in halon, convert it to a reagent -/obj/item/organ/internal/lungs/proc/too_much_halon(mob/living/carbon/breather, datum/gas_mixture/breath, halon_pp, old_halon_pp) - // Inhale Halon. Exhale nothing. - breathe_gas_volume(breath, /datum/gas/halon) - // Metabolize to reagent. - if(halon_pp > gas_stimulation_min) - breather.adjustOxyLoss(5) - breather.reagents.add_reagent(/datum/reagent/halon, max(0, 1 - breather.reagents.get_reagent_amount(/datum/reagent/halon))) - -/// Sleeping gas with healing properties. -/obj/item/organ/internal/lungs/proc/consume_healium(mob/living/carbon/breather, datum/gas_mixture/breath, healium_pp, old_healium_pp) - breathe_gas_volume(breath, /datum/gas/healium) - // Euphoria side-effect. - if(healium_pp > gas_stimulation_min) - if(prob(15)) - to_chat(breather, span_alert("Your head starts spinning and your lungs burn!")) - healium_euphoria = EUPHORIA_ACTIVE - breather.emote("gasp") - else - healium_euphoria = EUPHORIA_INACTIVE - // Stun/Sleep side-effects. - if(healium_pp > healium_para_min) - // Random chance to stun mob. Timing not in seconds to have a much higher variation - breather.Unconscious(rand(3 SECONDS, 5 SECONDS)) - // Metabolize to reagent when concentration is high enough. - if(healium_pp > healium_sleep_min) - breather.reagents.add_reagent(/datum/reagent/healium, max(0, 1 - breather.reagents.get_reagent_amount(/datum/reagent/healium))) - -/// Lose healium side effects -/obj/item/organ/internal/lungs/proc/lose_healium(mob/living/carbon/breather, datum/gas_mixture/breath, old_healium_pp) - healium_euphoria = EUPHORIA_INACTIVE - -/// Activates helium speech when partial pressure gets high enough -/obj/item/organ/internal/lungs/proc/consume_helium(mob/living/carbon/breather, datum/gas_mixture/breath, helium_pp, old_helium_pp) - breathe_gas_volume(breath, /datum/gas/helium) - if(helium_pp > helium_speech_min) - if(old_helium_pp <= helium_speech_min) - RegisterSignal(breather, COMSIG_MOB_SAY, PROC_REF(handle_helium_speech)) - else - if(old_helium_pp > helium_speech_min) - UnregisterSignal(breather, COMSIG_MOB_SAY) - -/// Lose helium high pitched voice -/obj/item/organ/internal/lungs/proc/lose_helium(mob/living/carbon/breather, datum/gas_mixture/breath, old_helium_pp) - UnregisterSignal(breather, COMSIG_MOB_SAY) - -/// React to speach while hopped up on the high pitched voice juice -/obj/item/organ/internal/lungs/proc/handle_helium_speech(mob/living/carbon/breather, list/speech_args) - SIGNAL_HANDLER - speech_args[SPEECH_SPANS] |= SPAN_HELIUM - -/// Gain hypernob effects if we have enough of the stuff -/obj/item/organ/internal/lungs/proc/consume_hypernoblium(mob/living/carbon/breather, datum/gas_mixture/breath, hypernob_pp, old_hypernob_pp) - breathe_gas_volume(breath, /datum/gas/hypernoblium) - if (hypernob_pp > gas_stimulation_min) - var/existing = breather.reagents.get_reagent_amount(/datum/reagent/hypernoblium) - breather.reagents.add_reagent(/datum/reagent/hypernoblium,max(0, 1 - existing)) - -/// Breathing in the stink gas -/obj/item/organ/internal/lungs/proc/too_much_miasma(mob/living/carbon/breather, datum/gas_mixture/breath, miasma_pp, old_miasma_pp) - // Inhale Miasma. Exhale nothing. - breathe_gas_volume(breath, /datum/gas/miasma) - // Miasma sickness - if(prob(0.5 * miasma_pp)) - var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(max_symptoms = min(round(max(miasma_pp / 2, 1), 1), 6), max_level = min(round(max(miasma_pp, 1), 1), 8)) - // tl;dr the first argument chooses the smaller of miasma_pp/2 or 6(typical max virus symptoms), the second chooses the smaller of miasma_pp or 8(max virus symptom level) - // Each argument has a minimum of 1 and rounds to the nearest value. Feel free to change the pp scaling I couldn't decide on good numbers for it. - miasma_disease.name = "Unknown" - miasma_disease.try_infect(breather) - // Miasma side effects - switch(miasma_pp) - if(0.25 to 5) - // At lower pp, give out a little warning - breather.clear_mood_event("smell") - if(prob(5)) - to_chat(breather, span_notice("There is an unpleasant smell in the air.")) - if(5 to 15) - //At somewhat higher pp, warning becomes more obvious - if(prob(15)) - to_chat(breather, span_warning("You smell something horribly decayed inside this room.")) - breather.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(breather, span_warning("The stench of rotting carcasses is unbearable!")) - breather.add_mood_event("smell", /datum/mood_event/disgust/nauseating_stench) - breather.vomit() - if(30 to INFINITY) - //Higher chance to vomit. Let the horror start - if(prob(15)) - to_chat(breather, span_warning("The stench of rotting carcasses is unbearable!")) - breather.add_mood_event("smell", /datum/mood_event/disgust/nauseating_stench) - breather.vomit() - else - breather.clear_mood_event("smell") - // In a full miasma atmosphere with 101.34 pKa, about 10 disgust per breath, is pretty low compared to threshholds - // Then again, this is a purely hypothetical scenario and hardly reachable - breather.adjust_disgust(0.1 * miasma_pp) - -/// We're free from the stick, clear out its impacts -/obj/item/organ/internal/lungs/proc/safe_miasma(mob/living/carbon/breather, datum/gas_mixture/breath, old_miasma_pp) - // Clear out moods when immune to miasma, or if there's no miasma at all. - breather.clear_mood_event("smell") - -/// Causes random euphoria and giggling. Large amounts knock you down -/obj/item/organ/internal/lungs/proc/too_much_n2o(mob/living/carbon/breather, datum/gas_mixture/breath, n2o_pp, old_n2o_pp) - if(n2o_pp < n2o_para_min) - // Small amount of N2O, small side-effects. - if(n2o_pp <= 0.01) - if(old_n2o_pp > 0.01) - return BREATH_LOST - return - // No alert for small amounts, but the mob randomly feels euphoric. - if(old_n2o_pp >= n2o_para_min || old_n2o_pp <= 0.01) - breather.clear_alert(ALERT_TOO_MUCH_N2O) - - if(prob(20)) - n2o_euphoria = EUPHORIA_ACTIVE - breather.emote(pick("giggle", "laugh")) - else - n2o_euphoria = EUPHORIA_INACTIVE - return - - // More N2O, more severe side-effects. Causes stun/sleep. - if(old_n2o_pp < n2o_para_min) - breather.throw_alert(ALERT_TOO_MUCH_N2O, /atom/movable/screen/alert/too_much_n2o) - n2o_euphoria = EUPHORIA_ACTIVE - - // give them one second of grace to wake up and run away a bit! - if(!HAS_TRAIT(breather, TRAIT_SLEEPIMMUNE)) - breather.Unconscious(6 SECONDS) - // Enough to make the mob sleep. - if(n2o_pp > n2o_sleep_min) - breather.Sleeping(min(breather.AmountSleeping() + 100, 200)) - -/// N2O side-effects. "Too much N2O!" -/obj/item/organ/internal/lungs/proc/safe_n2o(mob/living/carbon/breather, datum/gas_mixture/breath, old_n2o_pp) - n2o_euphoria = EUPHORIA_INACTIVE - breather.clear_alert(ALERT_TOO_MUCH_N2O) - -// Breath in nitrium. It's helpful, but has nasty side effects -/obj/item/organ/internal/lungs/proc/too_much_nitrium(mob/living/carbon/breather, datum/gas_mixture/breath, nitrium_pp, old_nitrium_pp) - breathe_gas_volume(breath, /datum/gas/nitrium) - // Random chance to inflict side effects increases with pressure. - if((prob(nitrium_pp) && (nitrium_pp > 15))) - // Nitrium side-effect. - breather.adjustOrganLoss(ORGAN_SLOT_LUNGS, nitrium_pp * 0.1) - to_chat(breather, "You feel a burning sensation in your chest") - // Metabolize to reagents. - if (nitrium_pp > 5) - var/existing = breather.reagents.get_reagent_amount(/datum/reagent/nitrium_low_metabolization) - breather.reagents.add_reagent(/datum/reagent/nitrium_low_metabolization, max(0, 2 - existing)) - if (nitrium_pp > 10) - var/existing = breather.reagents.get_reagent_amount(/datum/reagent/nitrium_high_metabolization) - breather.reagents.add_reagent(/datum/reagent/nitrium_high_metabolization, max(0, 1 - existing)) - -/// Radioactive, green gas. Toxin damage, and a radiation chance -/obj/item/organ/internal/lungs/proc/too_much_tritium(mob/living/carbon/breather, datum/gas_mixture/breath, trit_pp, old_trit_pp) - var/gas_breathed = breathe_gas_volume(breath, /datum/gas/tritium) - var/moles_visible = GLOB.meta_gas_info[/datum/gas/tritium][META_GAS_MOLES_VISIBLE] * BREATH_PERCENTAGE - // Tritium side-effects. - if(gas_breathed > moles_visible) - var/ratio = gas_breathed * 15 - breather.adjustToxLoss(clamp(ratio, MIN_TOXIC_GAS_DAMAGE, MAX_TOXIC_GAS_DAMAGE)) - // If you're breathing in half an atmosphere of radioactive gas, you fucked up. - if((trit_pp > tritium_irradiation_moles_min) && SSradiation.can_irradiate_basic(breather)) - var/lerp_scale = min(tritium_irradiation_moles_max, trit_pp - tritium_irradiation_moles_min) / (tritium_irradiation_moles_max - tritium_irradiation_moles_min) - var/chance = LERP(tritium_irradiation_probability_min, tritium_irradiation_probability_max, lerp_scale) - if (prob(chance)) - breather.AddComponent(/datum/component/irradiated) - -/// Really toxic stuff, very much trying to kill you -/obj/item/organ/internal/lungs/proc/too_much_zauker(mob/living/carbon/breather, datum/gas_mixture/breath, zauker_pp, old_zauker_pp) - breathe_gas_volume(breath, /datum/gas/zauker) - // Metabolize to reagent. - if(zauker_pp > gas_stimulation_min) - var/existing = breather.reagents.get_reagent_amount(/datum/reagent/zauker) - breather.reagents.add_reagent(/datum/reagent/zauker, max(0, 1 - existing)) - -/** - * This proc tests if the lungs can breathe, if they can breathe a given gas mixture, and throws/clears gas alerts. - * It does this by calling subprocs "registered" to pay attention to different gas types - * There's also support for gases that should always be checked for, and procs that should run when a gas is finished - * - * - * Returns TRUE if the breath was successful, or FALSE if otherwise. - * - * Arguments: - * * breath: A gas mixture to test, or null. - * * breather: A carbon mob that is using the lungs to breathe. - */ -/obj/item/organ/internal/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather) - if(breather.status_flags & GODMODE) - breather.failed_last_breath = FALSE - breather.clear_alert(ALERT_NOT_ENOUGH_OXYGEN) - return FALSE - - if(HAS_TRAIT(breather, TRAIT_NOBREATH)) - return FALSE - - // If the breath is falsy or "null", we can use the backup empty_breath. - if(!breath) - var/static/datum/gas_mixture/immutable/empty_breath = new(BREATH_VOLUME) - breath = empty_breath - - // Indicates if there are moles of gas in the breath. - var/has_moles = breath.total_moles() != 0 - - // Check for moles of gas and handle partial pressures / special conditions. - if(has_moles) - // Breath has more than 0 moles of gas. - // Route gases through mask filter if breather is wearing one. - if(istype(breather.wear_mask) && (breather.wear_mask.clothing_flags & GAS_FILTERING) && breather.wear_mask.has_filter) - breath = breather.wear_mask.consume_filter(breath) - // Breath has 0 moles of gas, and we can breathe space - else if(HAS_TRAIT(src, TRAIT_SPACEBREATHING)) - // The lungs can breathe anyways. What are you? Some bottom-feeding, scum-sucking algae eater? - breather.failed_last_breath = FALSE - // Vacuum-adapted lungs regenerate oxyloss even when breathing nothing. - if(breather.health >= breather.crit_threshold && breather.oxyloss) - breather.adjustOxyLoss(-5) - else - // Can't breathe! - breather.failed_last_breath = TRUE - - // The list of gases in the breath. - var/list/breath_gases = breath.gases - // Copy the breath's temperature into breath_out to avoid cooling the output breath down unfairly - breath_out.temperature = breath.temperature - - var/old_euphoria = (n2o_euphoria == EUPHORIA_ACTIVE || healium_euphoria == EUPHORIA_ACTIVE) - - // Cache for sonic speed - var/list/last_partial_pressures = src.last_partial_pressures - var/list/breathe_always = src.breathe_always - var/list/breath_present = src.breath_present - var/list/breath_lost = src.breath_lost - - // Build out our partial pressures, for use as we go - var/list/partial_pressures = list() - for(var/gas_id in breath_gases) - partial_pressures[gas_id] = breath.get_breath_partial_pressure(breath_gases[gas_id][MOLES]) - - // Treat gas as other types of gas - for(var/list/conversion_packet in treat_as) - var/read_from = conversion_packet[BREATH_RELATIONSHIP_INITIAL_GAS] - if(!partial_pressures[read_from]) - continue - var/convert_into = conversion_packet[BREATH_RELATIONSHIP_CONVERT] - partial_pressures[convert_into] += partial_pressures[read_from] * conversion_packet[BREATH_RELATIONSHIP_MULTIPLIER] - if(partial_pressures[convert_into] <= 0) - partial_pressures -= convert_into // No negative values jeremy - - // First, we breathe the stuff that always wants to be processed - // This is typically things like o2, stuff the mob needs to live - for(var/breath_id in breathe_always) - var/partial_pressure = partial_pressures[breath_id] || 0 - var/old_partial_pressure = last_partial_pressures[breath_id] || 0 - // Ensures the gas will always be instanciated, so people can interact with it safely - ASSERT_GAS(breath_id, breath) - var/inhale = breathe_always[breath_id] - call(src, inhale)(breather, breath, partial_pressure, old_partial_pressure) - - // Now we'll handle the callbacks that want to be run conditionally off our current breath - for(var/breath_id in breath_gases) - var/when_present = breath_present[breath_id] - if(!when_present) - continue - - var/reaction = call(src, when_present)(breather, breath, partial_pressures[breath_id], last_partial_pressures[breath_id]) - if(reaction == BREATH_LOST) - var/on_lose = breath_lost[breath_id] - if(on_lose) - call(src, on_lose)(breather, breath, partial_pressures[breath_id], last_partial_pressures[breath_id]) - - // Finally, we'll run the callbacks that aren't in breath_gases, but WERE in our last breath - for(var/gas_lost in last_partial_pressures) - // If we still have it, go away - if(breath_gases[gas_lost]) - continue - var/on_loss = breath_lost[gas_lost] - if(!on_loss) - continue - - call(src, on_loss)(breather, breath, last_partial_pressures[gas_lost]) - - src.last_partial_pressures = partial_pressures - - // Handle chemical euphoria mood event, caused by gases such as N2O or healium. - var/new_euphoria = (n2o_euphoria == EUPHORIA_ACTIVE || healium_euphoria == EUPHORIA_ACTIVE) - if (!old_euphoria && new_euphoria) - breather.add_mood_event("chemical_euphoria", /datum/mood_event/chemical_euphoria) - else if (old_euphoria && !new_euphoria) - breather.clear_mood_event("chemical_euphoria") - - if(has_moles) - handle_breath_temperature(breath, breather) - // Merge breath_out into breath. They're kept seprerate before now to ensure stupid like, order of operations shit doesn't happen - // But that time has passed - breath.merge(breath_out) - // Resets immutable gas_mixture to empty. - breath_out.garbage_collect() - - breath.garbage_collect() - // Returning FALSE indicates the breath failed. - if(!breather.failed_last_breath) - return TRUE - -/// Remove gas from breath. If output_gas is given, transfers the removed gas to the lung's gas_mixture. -/// Removes 100% of the given gas type unless given a volume argument. -/// Returns the amount of gas theoretically removed. -/obj/item/organ/internal/lungs/proc/breathe_gas_volume(datum/gas_mixture/breath, remove_id, exchange_id = null, volume = INFINITY) - var/list/breath_gases = breath.gases - volume = min(volume, breath_gases[remove_id][MOLES]) - breath_gases[remove_id][MOLES] -= volume - if(exchange_id) - ASSERT_GAS(exchange_id, breath_out) - breath_out.gases[exchange_id][MOLES] += volume - return volume - -/// Applies suffocation side-effects to a given Human, scaling based on ratio of required pressure VS "true" pressure. -/// If pressure is greater than 0, the return value will represent the amount of gas successfully breathed. -/obj/item/organ/internal/lungs/proc/handle_suffocation(mob/living/carbon/human/suffocator = null, breath_pp = 0, safe_breath_min = 0, mole_count = 0) - . = 0 - // Can't suffocate without a Human, or without minimum breath pressure. - if(!suffocator || !safe_breath_min) - return - // Mob is suffocating. - suffocator.failed_last_breath = TRUE - // Give them a chance to notice something is wrong. - if(prob(20)) - suffocator.emote("gasp") - // If mob is at critical health, check if they can be damaged further. - if(suffocator.health < suffocator.crit_threshold) - // Mob is immune to damage at critical health. - if(HAS_TRAIT(suffocator, TRAIT_NOCRITDAMAGE)) - return - // Reagents like Epinephrine stop suffocation at critical health. - if(suffocator.reagents.has_reagent(crit_stabilizing_reagent, needs_metabolizing = TRUE)) - return - // Low pressure. - if(breath_pp) - var/ratio = safe_breath_min / breath_pp - suffocator.adjustOxyLoss(min(5 * ratio, HUMAN_MAX_OXYLOSS)) - return mole_count * ratio / 6 - // Zero pressure. - if(suffocator.health >= suffocator.crit_threshold) - suffocator.adjustOxyLoss(HUMAN_MAX_OXYLOSS) - else - suffocator.adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) - - -/obj/item/organ/internal/lungs/proc/handle_breath_temperature(datum/gas_mixture/breath, mob/living/carbon/human/breather) // called by human/life, handles temperatures - var/breath_temperature = breath.temperature - - if(!HAS_TRAIT(breather, TRAIT_RESISTCOLD)) // COLD DAMAGE - var/cold_modifier = breather.dna.species.coldmod - if(breath_temperature < cold_level_3_threshold) - breather.apply_damage_type(cold_level_3_damage*cold_modifier, cold_damage_type) - if(breath_temperature > cold_level_3_threshold && breath_temperature < cold_level_2_threshold) - breather.apply_damage_type(cold_level_2_damage*cold_modifier, cold_damage_type) - if(breath_temperature > cold_level_2_threshold && breath_temperature < cold_level_1_threshold) - breather.apply_damage_type(cold_level_1_damage*cold_modifier, cold_damage_type) - if(breath_temperature < cold_level_1_threshold) - if(prob(20)) - to_chat(breather, span_warning("You feel [cold_message] in your [name]!")) - - if(!HAS_TRAIT(breather, TRAIT_RESISTHEAT)) // HEAT DAMAGE - var/heat_modifier = breather.dna.species.heatmod - if(breath_temperature > heat_level_1_threshold && breath_temperature < heat_level_2_threshold) - breather.apply_damage_type(heat_level_1_damage*heat_modifier, heat_damage_type) - if(breath_temperature > heat_level_2_threshold && breath_temperature < heat_level_3_threshold) - breather.apply_damage_type(heat_level_2_damage*heat_modifier, heat_damage_type) - if(breath_temperature > heat_level_3_threshold) - breather.apply_damage_type(heat_level_3_damage*heat_modifier, heat_damage_type) - if(breath_temperature > heat_level_1_threshold) - if(prob(20)) - to_chat(breather, span_warning("You feel [hot_message] in your [name]!")) - - // The air you breathe out should match your body temperature - breath.temperature = breather.bodytemperature - -/obj/item/organ/internal/lungs/on_life(seconds_per_tick, times_fired) - . = ..() - if(failed && !(organ_flags & ORGAN_FAILING)) - failed = FALSE - return - if(damage >= low_threshold) - var/do_i_cough = SPT_PROB((damage < high_threshold) ? 2.5 : 5, seconds_per_tick) // 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 - -/obj/item/organ/internal/lungs/get_availability(datum/species/owner_species, mob/living/owner_mob) - return owner_species.mutantlungs - -/obj/item/organ/internal/lungs/plasmaman - name = "plasma filter" - desc = "A spongy rib-shaped mass for filtering plasma from the air." - icon_state = "lungs-plasma" - organ_traits = list(TRAIT_NOHUNGER) // A fresh breakfast of plasma is a great start to any morning. - - safe_oxygen_min = 0 //We don't breathe this - safe_plasma_min = 4 //We breathe THIS! - safe_plasma_max = 0 - -/obj/item/organ/internal/lungs/slime - name = "vacuole" - desc = "A large organelle designed to store oxygen and other important gasses." - - safe_plasma_max = 0 //We breathe this to gain POWER. - -/obj/item/organ/internal/lungs/slime/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather_slime) - . = ..() - if (breath?.gases[/datum/gas/plasma]) - var/plasma_pp = breath.get_breath_partial_pressure(breath.gases[/datum/gas/plasma][MOLES]) - breather_slime.blood_volume += (0.2 * plasma_pp) // 10/s when breathing literally nothing but plasma, which will suffocate you. - -/obj/item/organ/internal/lungs/cybernetic - name = "basic cybernetic lungs" - 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. - -/obj/item/organ/internal/lungs/cybernetic/tier2 - 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 - safe_oxygen_min = 13 - emp_vulnerability = 40 - -/obj/item/organ/internal/lungs/cybernetic/tier3 - name = "upgraded cybernetic lungs" - desc = "A more advanced version of the stock cybernetic lungs. Features the ability to filter out lower levels of plasma and carbon dioxide." - icon_state = "lungs-c-u2" - safe_plasma_max = 20 - safe_co2_max = 20 - maxHealth = 2 * STANDARD_ORGAN_THRESHOLD - safe_oxygen_min = 13 - emp_vulnerability = 20 - - cold_level_1_threshold = 200 - cold_level_2_threshold = 140 - cold_level_3_threshold = 100 - -/obj/item/organ/internal/lungs/cybernetic/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - if(!COOLDOWN_FINISHED(src, severe_cooldown)) //So we cant just spam emp to kill people. - owner.losebreath += 20 - COOLDOWN_START(src, severe_cooldown, 30 SECONDS) - if(prob(emp_vulnerability/severity)) //Chance of permanent effects - organ_flags |= ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon. - - -/obj/item/organ/internal/lungs/lavaland - 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/internal/lungs/lavaland/Initialize(mapload) - var/datum/gas_mixture/immutable/planetary/mix = SSair.planetary[LAVALAND_DEFAULT_ATMOS] - - if(!mix?.total_moles()) // this typically means we didn't load lavaland, like if we're using the LOWMEMORYMODE define - return ..() - - // Take a "breath" of the air - var/datum/gas_mixture/breath = mix.remove(mix.total_moles() * BREATH_PERCENTAGE) - - var/list/breath_gases = breath.gases - - breath.assert_gases( - /datum/gas/oxygen, - /datum/gas/plasma, - /datum/gas/carbon_dioxide, - /datum/gas/nitrogen, - /datum/gas/bz, - /datum/gas/miasma, - ) - - var/oxygen_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/oxygen][MOLES]) - var/nitrogen_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/nitrogen][MOLES]) - var/plasma_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/plasma][MOLES]) - var/carbon_dioxide_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/carbon_dioxide][MOLES]) - var/bz_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/bz][MOLES]) - var/miasma_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/miasma][MOLES]) - - safe_oxygen_min = max(0, oxygen_pp - GAS_TOLERANCE) - safe_nitro_min = max(0, nitrogen_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 = carbon_dioxide_pp + GAS_TOLERANCE * 2 - - // The lung tolerance against BZ is also increased the amount of BZ in the base air - BZ_trip_balls_min += bz_pp - BZ_brain_damage_min += bz_pp - - // Lungs adapted to a high miasma atmosphere do not process it, and breathe it back out - if(miasma_pp) - suffers_miasma = FALSE - return ..() - - -#undef GAS_TOLERANCE - -/obj/item/organ/internal/lungs/ethereal - name = "aeration reticulum" - desc = "These exotic lungs seem crunchier than most." - icon_state = "lungs_ethereal" - heat_level_1_threshold = FIRE_MINIMUM_TEMPERATURE_TO_SPREAD // 150C or 433k, in line with ethereal max safe body temperature - heat_level_2_threshold = 473 - heat_level_3_threshold = 1073 - -/obj/item/organ/internal/lungs/ethereal/Initialize(mapload) - . = ..() - add_gas_reaction(/datum/gas/water_vapor, while_present = PROC_REF(consume_water)) - -/// H2O electrolysis -/obj/item/organ/internal/lungs/ethereal/proc/consume_water(mob/living/carbon/breather, datum/gas_mixture/breath, h2o_pp, old_h2o_pp) - var/gas_breathed = breath.gases[/datum/gas/water_vapor][MOLES] - breath.gases[/datum/gas/water_vapor][MOLES] -= gas_breathed - breath_out.assert_gases(/datum/gas/oxygen, /datum/gas/hydrogen) - breath_out.gases[/datum/gas/oxygen][MOLES] += gas_breathed - breath_out.gases[/datum/gas/hydrogen][MOLES] += gas_breathed * 2 - - -#undef BREATH_RELATIONSHIP_INITIAL_GAS -#undef BREATH_RELATIONSHIP_CONVERT -#undef BREATH_RELATIONSHIP_MULTIPLIER diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm deleted file mode 100644 index a51ad9dd1fe48..0000000000000 --- a/code/modules/surgery/organs/organ_internal.dm +++ /dev/null @@ -1,87 +0,0 @@ -/obj/item/organ/internal - name = "organ" - -/obj/item/organ/internal/Initialize(mapload) - . = ..() - START_PROCESSING(SSobj, src) - -/obj/item/organ/internal/Destroy() - if(owner) - // The special flag is important, because otherwise mobs can die - // while undergoing transformation into different mobs. - Remove(owner, special=TRUE) - else - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/item/organ/internal/Insert(mob/living/carbon/receiver, special = FALSE, drop_if_replaced = TRUE) - . = ..() - if(!. || !owner) - return - - // organs_slot must ALWAYS be ordered in the same way as organ_process_order - // Otherwise life processing breaks down - sortTim(owner.organs_slot, GLOBAL_PROC_REF(cmp_organ_slot_asc)) - - STOP_PROCESSING(SSobj, src) - -/obj/item/organ/internal/Remove(mob/living/carbon/organ_owner, special = FALSE) - . = ..() - - if(organ_owner) - if((organ_flags & ORGAN_VITAL) && !special && !(organ_owner.status_flags & GODMODE)) - if(organ_owner.stat != DEAD) - organ_owner.investigate_log("has been killed by losing a vital organ ([src]).", INVESTIGATE_DEATHS) - organ_owner.death() - - START_PROCESSING(SSobj, src) - - -/obj/item/organ/internal/process(seconds_per_tick, times_fired) - on_death(seconds_per_tick, times_fired) //Kinda hate doing it like this, but I really don't want to call process directly. - -/obj/item/organ/internal/on_death(seconds_per_tick, times_fired) //runs decay when outside of a person - if(organ_flags & (ORGAN_SYNTHETIC | ORGAN_FROZEN)) - return - apply_organ_damage(decay_factor * maxHealth * seconds_per_tick) - -/// 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 -/obj/item/organ/internal/on_life(seconds_per_tick, times_fired) //repair organ damage if the organ is not failing - if(organ_flags & ORGAN_FAILING) - handle_failing_organs(seconds_per_tick) - return - - if(failure_time > 0) - failure_time-- - - if(organ_flags & ORGAN_SYNTHETIC_EMP) //Synthetic organ has been emped, is now failing. - apply_organ_damage(decay_factor * maxHealth * seconds_per_tick) - return - - if(!damage) // No sense healing if you're not even hurt bro - 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 - apply_organ_damage(-healing_amount * maxHealth * seconds_per_tick, damage) // pass curent damage incase we are over cap - -///Used as callbacks by object pooling -/obj/item/organ/internal/exit_wardrobe() - START_PROCESSING(SSobj, src) - -//See above -/obj/item/organ/internal/enter_wardrobe() - STOP_PROCESSING(SSobj, src) - -///Organs don't die instantly, and neither should you when you get fucked up -/obj/item/organ/internal/handle_failing_organs(seconds_per_tick) - if(owner.stat == DEAD) - return - - failure_time += seconds_per_tick - organ_failure(seconds_per_tick) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm deleted file mode 100644 index 05f12f50fb08b..0000000000000 --- a/code/modules/surgery/organs/tongue.dm +++ /dev/null @@ -1,489 +0,0 @@ -/obj/item/organ/internal/tongue - name = "tongue" - desc = "A fleshy muscle mostly used for lying." - icon_state = "tongue" - visual = FALSE - zone = BODY_ZONE_PRECISE_MOUTH - slot = ORGAN_SLOT_TONGUE - attack_verb_continuous = list("licks", "slobbers", "slaps", "frenches", "tongues") - attack_verb_simple = list("lick", "slobber", "slap", "french", "tongue") - /** - * A cached list of paths of all the languages this tongue is capable of speaking - * - * Relates to a mob's ability to speak a language - a mob must be able to speak the language - * and have a tongue able to speak the language (or omnitongue) in order to actually speak said language - * - * To modify this list for subtypes, see [/obj/item/organ/internal/tongue/proc/get_possible_languages]. Do not modify directly. - */ - VAR_PRIVATE/list/languages_possible - /** - * A list of languages which are native to this tongue - * - * When these languages are spoken with this tongue, and modifies speech is true, no modifications will be made - * (such as no accent, hissing, or whatever) - */ - var/list/languages_native - ///changes the verbage of how you speak. (Permille -> says <-, "I just used a verb!") - ///i hate to say it, but because of sign language, this may have to be a component. and we may have to do some insane shit like putting a component on a component - var/say_mod = "says" - ///for temporary overrides of the above variable. - var/temp_say_mod = "" - - /// 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 - /// Determines how "sensitive" this tongue is to tasting things, lower is more sensitive. - /// See [/mob/living/proc/get_taste_sensitivity]. - var/taste_sensitivity = 15 - /// Whether this tongue modifies speech via signal - var/modifies_speech = FALSE - -/obj/item/organ/internal/tongue/Initialize(mapload) - . = ..() - // Setup the possible languages list - // - get_possible_languages gives us a list of language paths - // - then we cache it via string list - // this results in tongues with identical possible languages sharing a cached list instance - languages_possible = string_list(get_possible_languages()) - -/** - * Used in setting up the "languages possible" list. - * - * Override to have your tongue be only capable of speaking certain languages - * Extend to hvae a tongue capable of speaking additional languages to the base tongue - * - * While a user may be theoretically capable of speaking a language, they cannot physically speak it - * UNLESS they have a tongue with that language possible, UNLESS UNLESS they have omnitongue enabled. - */ -/obj/item/organ/internal/tongue/proc/get_possible_languages() - RETURN_TYPE(/list) - // This is the default list of languages most humans should be capable of speaking - return list( - /datum/language/common, - /datum/language/uncommon, - /datum/language/draconic, - /datum/language/codespeak, - /datum/language/monkey, - /datum/language/narsie, - /datum/language/beachbum, - /datum/language/aphasia, - /datum/language/piratespeak, - /datum/language/moffic, - /datum/language/sylvan, - /datum/language/shadowtongue, - /datum/language/terrum, - /datum/language/nekomimetic, - ) - -/obj/item/organ/internal/tongue/proc/handle_speech(datum/source, list/speech_args) - SIGNAL_HANDLER - if(speech_args[SPEECH_LANGUAGE] in languages_native) - return FALSE //no changes - modify_speech(source, speech_args) - -/obj/item/organ/internal/tongue/proc/modify_speech(datum/source, list/speech_args) - return speech_args[SPEECH_MESSAGE] - -/obj/item/organ/internal/tongue/Insert(mob/living/carbon/tongue_owner, special = FALSE, drop_if_replaced = TRUE) - . = ..() - if(!.) - return - ADD_TRAIT(tongue_owner, TRAIT_SPEAKS_CLEARLY, SPEAKING_FROM_TONGUE) - if (modifies_speech) - RegisterSignal(tongue_owner, COMSIG_MOB_SAY, PROC_REF(handle_speech)) - - /* This could be slightly simpler, by making the removal of the - * NO_TONGUE_TRAIT conditional on the tongue's `sense_of_taste`, but - * then you can distinguish between ageusia from no tongue, and - * ageusia from having a non-tasting tongue. - */ - REMOVE_TRAIT(tongue_owner, TRAIT_AGEUSIA, NO_TONGUE_TRAIT) - if(!sense_of_taste) - ADD_TRAIT(tongue_owner, TRAIT_AGEUSIA, ORGAN_TRAIT) - -/obj/item/organ/internal/tongue/Remove(mob/living/carbon/tongue_owner, special = FALSE) - . = ..() - REMOVE_TRAIT(tongue_owner, TRAIT_SPEAKS_CLEARLY, SPEAKING_FROM_TONGUE) - temp_say_mod = "" - UnregisterSignal(tongue_owner, COMSIG_MOB_SAY) - 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/internal/tongue/could_speak_language(datum/language/language_path) - return (language_path in languages_possible) - -/obj/item/organ/internal/tongue/get_availability(datum/species/owner_species, mob/living/owner_mob) - return owner_species.mutanttongue - -/obj/item/organ/internal/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" - taste_sensitivity = 10 // combined nose + tongue, extra sensitive - modifies_speech = TRUE - languages_native = list(/datum/language/draconic) - -/obj/item/organ/internal/tongue/lizard/modify_speech(datum/source, list/speech_args) - var/static/regex/lizard_hiss = new("s+", "g") - var/static/regex/lizard_hiSS = new("S+", "g") - var/static/regex/lizard_kss = new(@"(\w)x", "g") - var/static/regex/lizard_kSS = new(@"(\w)X", "g") - var/static/regex/lizard_ecks = new(@"\bx([\-|r|R]|\b)", "g") - var/static/regex/lizard_eckS = new(@"\bX([\-|r|R]|\b)", "g") - var/message = speech_args[SPEECH_MESSAGE] - if(message[1] != "*") - message = lizard_hiss.Replace(message, "sss") - message = lizard_hiSS.Replace(message, "SSS") - message = lizard_kss.Replace(message, "$1kss") - message = lizard_kSS.Replace(message, "$1KSS") - message = lizard_ecks.Replace(message, "ecks$1") - message = lizard_eckS.Replace(message, "ECKS$1") - speech_args[SPEECH_MESSAGE] = message - -/obj/item/organ/internal/tongue/lizard/silver - name = "silver tongue" - desc = "A genetic branch of the high society Silver Scales that gives them their silverizing properties. To them, it is everything, and society traitors have their tongue forcibly revoked. Oddly enough, it itself is just blue." - icon_state = "silvertongue" - actions_types = list(/datum/action/item_action/organ_action/statue) - -/datum/action/item_action/organ_action/statue - name = "Become Statue" - desc = "Become an elegant silver statue. Its durability and yours are directly tied together, so make sure you're careful." - COOLDOWN_DECLARE(ability_cooldown) - - var/obj/structure/statue/custom/statue - -/datum/action/item_action/organ_action/statue/New(Target) - . = ..() - statue = new - RegisterSignal(statue, COMSIG_QDELETING, PROC_REF(statue_destroyed)) - -/datum/action/item_action/organ_action/statue/Destroy() - UnregisterSignal(statue, COMSIG_QDELETING) - QDEL_NULL(statue) - . = ..() - -/datum/action/item_action/organ_action/statue/Trigger(trigger_flags) - . = ..() - if(!iscarbon(owner)) - to_chat(owner, span_warning("Your body rejects the powers of the tongue!")) - return - var/mob/living/carbon/becoming_statue = owner - if(becoming_statue.health < 1) - to_chat(becoming_statue, span_danger("You are too weak to become a statue!")) - return - if(!COOLDOWN_FINISHED(src, ability_cooldown)) - to_chat(becoming_statue, span_warning("You just used the ability, wait a little bit!")) - return - var/is_statue = becoming_statue.loc == statue - to_chat(becoming_statue, span_notice("You begin to [is_statue ? "break free from the statue" : "make a glorious pose as you become a statue"]!")) - if(!do_after(becoming_statue, (is_statue ? 5 : 30), target = get_turf(becoming_statue))) - to_chat(becoming_statue, span_warning("Your transformation is interrupted!")) - COOLDOWN_START(src, ability_cooldown, 3 SECONDS) - return - COOLDOWN_START(src, ability_cooldown, 10 SECONDS) - - if(statue.name == initial(statue.name)) //statue has not been set up - statue.name = "statue of [becoming_statue.real_name]" - statue.desc = "statue depicting [becoming_statue.real_name]" - statue.set_custom_materials(list(/datum/material/silver=SHEET_MATERIAL_AMOUNT*5)) - - if(is_statue) - statue.visible_message(span_danger("[statue] becomes animated!")) - becoming_statue.forceMove(get_turf(statue)) - statue.moveToNullspace() - UnregisterSignal(becoming_statue, COMSIG_MOVABLE_MOVED) - else - becoming_statue.visible_message(span_notice("[becoming_statue] hardens into a silver statue."), span_notice("You have become a silver statue!")) - statue.set_visuals(becoming_statue.appearance) - statue.forceMove(get_turf(becoming_statue)) - becoming_statue.forceMove(statue) - statue.update_integrity(becoming_statue.health) - RegisterSignal(becoming_statue, COMSIG_MOVABLE_MOVED, PROC_REF(human_left_statue)) - - //somehow they used an exploit/teleportation to leave statue, lets clean up -/datum/action/item_action/organ_action/statue/proc/human_left_statue(atom/movable/mover, atom/oldloc, direction) - SIGNAL_HANDLER - - statue.moveToNullspace() - UnregisterSignal(mover, COMSIG_MOVABLE_MOVED) - -/datum/action/item_action/organ_action/statue/proc/statue_destroyed(datum/source) - SIGNAL_HANDLER - - to_chat(owner, span_userdanger("Your existence as a living creature snaps as your statue form crumbles!")) - if(iscarbon(owner)) - //drop everything, just in case - var/mob/living/carbon/dying_carbon = owner - for(var/obj/item/dropped in dying_carbon) - if(!dying_carbon.dropItemToGround(dropped)) - qdel(dropped) - qdel(owner) - -/obj/item/organ/internal/tongue/abductor - 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" - sense_of_taste = FALSE - modifies_speech = TRUE - var/mothership - -/obj/item/organ/internal/tongue/abductor/attack_self(mob/living/carbon/human/tongue_holder) - if(!istype(tongue_holder)) - return - - var/obj/item/organ/internal/tongue/abductor/tongue = tongue_holder.get_organ_slot(ORGAN_SLOT_TONGUE) - if(!istype(tongue)) - return - - if(tongue.mothership == mothership) - to_chat(tongue_holder, span_notice("[src] is already attuned to the same channel as your own.")) - - tongue_holder.visible_message(span_notice("[tongue_holder] holds [src] in their hands, and concentrates for a moment."), span_notice("You attempt to modify the attenuation of [src].")) - if(do_after(tongue_holder, delay=15, target=src)) - to_chat(tongue_holder, span_notice("You attune [src] to your own channel.")) - mothership = tongue.mothership - -/obj/item/organ/internal/tongue/abductor/examine(mob/examining_mob) - . = ..() - if(HAS_TRAIT(examining_mob, TRAIT_ABDUCTOR_TRAINING) || (examining_mob.mind && HAS_TRAIT(examining_mob.mind, TRAIT_ABDUCTOR_TRAINING)) || isobserver(examining_mob)) - . += span_notice("It can be attuned to a different channel by using it inhand.") - if(!mothership) - . += span_notice("It is not attuned to a specific mothership.") - else - . += span_notice("It is attuned to [mothership].") - -/obj/item/organ/internal/tongue/abductor/modify_speech(datum/source, list/speech_args) - //Hacks - var/message = speech_args[SPEECH_MESSAGE] - var/mob/living/carbon/human/user = source - var/rendered = span_abductor("[user.real_name]: [message]") - user.log_talk(message, LOG_SAY, tag=SPECIES_ABDUCTOR) - for(var/mob/living/carbon/human/living_mob in GLOB.alive_mob_list) - var/obj/item/organ/internal/tongue/abductor/tongue = living_mob.get_organ_slot(ORGAN_SLOT_TONGUE) - if(!istype(tongue)) - continue - if(mothership == tongue.mothership) - to_chat(living_mob, rendered) - - for(var/mob/dead_mob in GLOB.dead_mob_list) - var/link = FOLLOW_LINK(dead_mob, user) - to_chat(dead_mob, "[link] [rendered]") - - speech_args[SPEECH_MESSAGE] = "" - -/obj/item/organ/internal/tongue/zombie - 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" - modifies_speech = TRUE - taste_sensitivity = 32 - -// List of english words that translate to zombie phrases -GLOBAL_LIST_INIT(english_to_zombie, list()) - -/obj/item/organ/internal/tongue/zombie/proc/add_word_to_translations(english_word, zombie_word) - GLOB.english_to_zombie[english_word] = zombie_word - // zombies don't care about grammar (any tense or form is all translated to the same word) - GLOB.english_to_zombie[english_word + plural_s(english_word)] = zombie_word - GLOB.english_to_zombie[english_word + "ing"] = zombie_word - GLOB.english_to_zombie[english_word + "ed"] = zombie_word - -/obj/item/organ/internal/tongue/zombie/proc/load_zombie_translations() - var/list/zombie_translation = strings("zombie_replacement.json", "zombie") - for(var/zombie_word in zombie_translation) - // since zombie words are a reverse list, we gotta do this backwards - var/list/data = islist(zombie_translation[zombie_word]) ? zombie_translation[zombie_word] : list(zombie_translation[zombie_word]) - for(var/english_word in data) - add_word_to_translations(english_word, zombie_word) - GLOB.english_to_zombie = sort_list(GLOB.english_to_zombie) // Alphabetizes the list (for debugging) - -/obj/item/organ/internal/tongue/zombie/modify_speech(datum/source, list/speech_args) - var/message = speech_args[SPEECH_MESSAGE] - if(message[1] != "*") - // setup the global list for translation if it hasn't already been done - if(!length(GLOB.english_to_zombie)) - load_zombie_translations() - - // make a list of all words that can be translated - var/list/message_word_list = splittext(message, " ") - var/list/translated_word_list = list() - for(var/word in message_word_list) - word = GLOB.english_to_zombie[lowertext(word)] - translated_word_list += word ? word : FALSE - - // all occurrences of characters "eiou" (case-insensitive) are replaced with "r" - message = replacetext(message, regex(@"[eiou]", "ig"), "r") - // all characters other than "zhrgbmna .!?-" (case-insensitive) are stripped - message = replacetext(message, regex(@"[^zhrgbmna.!?-\s]", "ig"), "") - // multiple spaces are replaced with a single (whitespace is trimmed) - message = replacetext(message, regex(@"(\s+)", "g"), " ") - - var/list/old_words = splittext(message, " ") - var/list/new_words = list() - for(var/word in old_words) - // lower-case "r" at the end of words replaced with "rh" - word = replacetext(word, regex(@"\lr\b"), "rh") - // an "a" or "A" by itself will be replaced with "hra" - word = replacetext(word, regex(@"\b[Aa]\b"), "hra") - new_words += word - - // if words were not translated, then we apply our zombie speech patterns - for(var/i in 1 to length(new_words)) - new_words[i] = translated_word_list[i] ? translated_word_list[i] : new_words[i] - - message = new_words.Join(" ") - message = capitalize(message) - speech_args[SPEECH_MESSAGE] = message - -/obj/item/organ/internal/tongue/alien - 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" - taste_sensitivity = 10 // LIZARDS ARE ALIENS CONFIRMED - modifies_speech = TRUE // not really, they just hiss - -// Aliens can only speak alien and a few other languages. -/obj/item/organ/internal/tongue/alien/get_possible_languages() - return list( - /datum/language/xenocommon, - /datum/language/common, - /datum/language/uncommon, - /datum/language/draconic, // Both hiss? - /datum/language/monkey, - ) - -/obj/item/organ/internal/tongue/alien/modify_speech(datum/source, list/speech_args) - var/datum/saymode/xeno/hivemind = speech_args[SPEECH_SAYMODE] - if(hivemind) - return - - playsound(owner, SFX_HISS, 25, TRUE, TRUE) - -/obj/item/organ/internal/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" - attack_verb_continuous = list("bites", "chatters", "chomps", "enamelles", "bones") - attack_verb_simple = list("bite", "chatter", "chomp", "enamel", "bone") - sense_of_taste = FALSE - modifies_speech = TRUE - var/chattering = FALSE - var/phomeme_type = "sans" - var/list/phomeme_types = list("sans", "papyrus") - -/obj/item/organ/internal/tongue/bone/Initialize(mapload) - . = ..() - phomeme_type = pick(phomeme_types) - -// Bone tongues can speak all default + calcic -/obj/item/organ/internal/tongue/bone/get_possible_languages() - return ..() + /datum/language/calcic - -/obj/item/organ/internal/tongue/bone/modify_speech(datum/source, list/speech_args) - if (chattering) - chatter(speech_args[SPEECH_MESSAGE], phomeme_type, source) - switch(phomeme_type) - if("sans") - speech_args[SPEECH_SPANS] |= SPAN_SANS - if("papyrus") - speech_args[SPEECH_SPANS] |= SPAN_PAPYRUS - -/obj/item/organ/internal/tongue/bone/plasmaman - name = "plasma bone \"tongue\"" - desc = "Like animated skeletons, Plasmamen vibrate their teeth in order to produce speech." - icon_state = "tongueplasma" - modifies_speech = FALSE - -/obj/item/organ/internal/tongue/robot - name = "robotic voicebox" - desc = "A voice synthesizer that can interface with organic lifeforms." - status = ORGAN_ROBOTIC - organ_flags = NONE - icon_state = "tonguerobot" - say_mod = "states" - attack_verb_continuous = list("beeps", "boops") - attack_verb_simple = list("beep", "boop") - modifies_speech = TRUE - taste_sensitivity = 25 // not as good as an organic tongue - -/obj/item/organ/internal/tongue/robot/can_speak_language(language) - return TRUE // THE MAGIC OF ELECTRONICS - -/obj/item/organ/internal/tongue/robot/modify_speech(datum/source, list/speech_args) - speech_args[SPEECH_SPANS] |= SPAN_ROBOT - -/obj/item/organ/internal/tongue/snail - name = "radula" - color = "#96DB00" // TODO proper sprite, rather than recoloured pink tongue - desc = "A minutely toothed, chitious ribbon, which as a side effect, makes all snails talk IINNCCRREEDDIIBBLLYY SSLLOOWWLLYY." - modifies_speech = TRUE - -/obj/item/organ/internal/tongue/snail/modify_speech(datum/source, list/speech_args) - var/new_message - var/message = speech_args[SPEECH_MESSAGE] - for(var/i in 1 to length(message)) - if(findtext("ABCDEFGHIJKLMNOPWRSTUVWXYZabcdefghijklmnopqrstuvwxyz", message[i])) //Im open to suggestions - new_message += message[i] + message[i] + message[i] //aaalllsssooo ooopppeeennn tttooo sssuuuggggggeeessstttiiiooonsss - else - new_message += message[i] - speech_args[SPEECH_MESSAGE] = new_message - -/obj/item/organ/internal/tongue/ethereal - name = "electric discharger" - desc = "A sophisticated ethereal organ, capable of synthesising speech via electrical discharge." - icon_state = "electrotongue" - say_mod = "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") - -// Ethereal tongues can speak all default + voltaic -/obj/item/organ/internal/tongue/ethereal/get_possible_languages() - return ..() + /datum/language/voltaic - -/obj/item/organ/internal/tongue/cat - name = "felinid tongue" - desc = "A fleshy muscle mostly used for meowing." - say_mod = "meows" - -/obj/item/organ/internal/tongue/jelly - name = "jelly tongue" - desc = "Ah... That's not the sound I expected it to make. Sounds like a Space Autumn Bird." - say_mod = "chirps" - -/obj/item/organ/internal/tongue/monkey - name = "primitive tongue" - desc = "For aggressively chimpering. And consuming bananas." - say_mod = "chimpers" - -/obj/item/organ/internal/tongue/moth - name = "moth tongue" - desc = "Moths don't have tongues. Someone get god on the phone, tell them I'm not happy." - say_mod = "flutters" - -/obj/item/organ/internal/tongue/zombie - name = "rotting tongue" - desc = "Makes you speak like you're at the dentist and you just absolutely refuse to spit because you forgot to mention you were allergic to space shellfish." - say_mod = "moans" - -/obj/item/organ/internal/tongue/mush - name = "mush-tongue-room" - desc = "You poof with this. Got it?" - say_mod = "poofs" - - icon = 'icons/obj/hydroponics/seeds.dmi' - icon_state = "mycelium-angel" - -/obj/item/organ/internal/tongue/golem - name = "golem tongue" - color = COLOR_WEBSAFE_DARK_GRAY - desc = "This silicate plate doesn't seem particularly mobile, but golems use it to form sounds." - say_mod = "rumbles" - sense_of_taste = FALSE - status = ORGAN_MINERAL diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm index 821e105437622..424251143c33c 100644 --- a/code/modules/surgery/plastic_surgery.dm +++ b/code/modules/surgery/plastic_surgery.dm @@ -1,5 +1,12 @@ +/// Disk containing info for doing advanced plastic surgery. Spawns in maint and available as a role-restricted item in traitor uplinks. +/obj/item/disk/surgery/advanced_plastic_surgery + name = "Advanced Plastic Surgery Disk" + desc = "The disk provides instructions on how to do an Advanced Plastic Surgery, this surgery allows one-self to completely remake someone's face with that of another. Provided they have a picture of them in their offhand when reshaping the face. With the surgery long becoming obsolete with the rise of genetics technology. This item became an antique to many collectors, With only the cheaper and easier basic form of plastic surgery remaining in use in most places." + surgeries = list(/datum/surgery/plastic_surgery/advanced) + /datum/surgery/plastic_surgery name = "Plastic surgery" + surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB | SURGERY_MORBID_CURIOSITY possible_locs = list(BODY_ZONE_HEAD) steps = list( /datum/surgery_step/incise, @@ -8,6 +15,41 @@ /datum/surgery_step/close, ) +/datum/surgery/plastic_surgery/advanced + name = "advanced plastic surgery" + steps = list( + /datum/surgery_step/incise, + /datum/surgery_step/retract_skin, + /datum/surgery_step/insert_plastic, + /datum/surgery_step/reshape_face, + /datum/surgery_step/close, + ) + +//Insert plastic step, It ain't called plastic surgery for nothing! :) +/datum/surgery_step/insert_plastic + name = "insert plastic (plastic)" + implements = list( + /obj/item/stack/sheet/plastic = 100, + /obj/item/stack/sheet/meat = 100) + time = 3.2 SECONDS + preop_sound = 'sound/effects/blobattack.ogg' + success_sound = 'sound/effects/attackblob.ogg' + failure_sound = 'sound/effects/blobattack.ogg' + +/datum/surgery_step/insert_plastic/preop(mob/user, mob/living/target, target_zone, obj/item/stack/tool, datum/surgery/surgery) + display_results( + user, + target, + span_notice("You begin to insert [tool] into the incision in [target]'s [parse_zone(target_zone)]..."), + span_notice("[user] begins to insert [tool] into the incision in [target]'s [parse_zone(target_zone)]."), + span_notice("[user] begins to insert [tool] into the incision in [target]'s [parse_zone(target_zone)]."), + ) + display_pain(target, "You feel something inserting just below the skin in your [parse_zone(target_zone)].") + +/datum/surgery_step/insert_plastic/success(mob/user, mob/living/target, target_zone, obj/item/stack/tool, datum/surgery/surgery, default_display_results) + . = ..() + tool.use(1) + //reshape_face /datum/surgery_step/reshape_face name = "reshape face (scalpel)" @@ -42,8 +84,15 @@ else var/list/names = list() if(!isabductor(user)) - for(var/i in 1 to 10) - names += target.dna.species.random_name(target.gender, TRUE) + var/obj/item/offhand = user.get_inactive_held_item() + if(istype(offhand, /obj/item/photo) && istype(surgery, /datum/surgery/plastic_surgery/advanced)) + var/obj/item/photo/disguises = offhand + for(var/namelist as anything in disguises.picture?.names_seen) + names += namelist + else + user.visible_message(span_warning("You have no picture to base the appearance on, reverting to random appearances.")) + 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)]" @@ -65,6 +114,9 @@ if(ishuman(target)) var/mob/living/carbon/human/human_target = target human_target.sec_hud_set_ID() + if(HAS_MIND_TRAIT(user, TRAIT_MORBID) && ishuman(user)) + var/mob/living/carbon/human/morbid_weirdo = user + morbid_weirdo.add_mood_event("morbid_abominable_surgery_success", /datum/mood_event/morbid_abominable_surgery_success) return ..() /datum/surgery_step/reshape_face/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/repair_puncture.dm b/code/modules/surgery/repair_puncture.dm index 843336c258b53..bb33c314689bc 100644 --- a/code/modules/surgery/repair_puncture.dm +++ b/code/modules/surgery/repair_puncture.dm @@ -9,7 +9,7 @@ /datum/surgery/repair_puncture name = "Repair puncture" surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB - targetable_wound = /datum/wound/pierce + targetable_wound = /datum/wound/pierce/bleed target_mobtypes = list(/mob/living/carbon) possible_locs = list( BODY_ZONE_R_ARM, @@ -32,7 +32,7 @@ . = ..() if(.) var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(user.zone_selected) - var/datum/wound/burn/pierce_wound = targeted_bodypart.get_wound_type(targetable_wound) + var/datum/wound/burn/flesh/pierce_wound = targeted_bodypart.get_wound_type(targetable_wound) return(pierce_wound && pierce_wound.blood_flow > 0) //SURGERY STEPS @@ -47,7 +47,7 @@ time = 3 SECONDS /datum/surgery_step/repair_innards/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - var/datum/wound/pierce/pierce_wound = surgery.operated_wound + var/datum/wound/pierce/bleed/pierce_wound = surgery.operated_wound if(!pierce_wound) 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)]...")) return @@ -67,7 +67,7 @@ display_pain(target, "You feel a horrible stabbing pain in your [parse_zone(user.zone_selected)]!") /datum/surgery_step/repair_innards/success(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/datum/wound/pierce/pierce_wound = surgery.operated_wound + var/datum/wound/pierce/bleed/pierce_wound = surgery.operated_wound if(!pierce_wound) to_chat(user, span_warning("[target] has no puncture wound there!")) return ..() @@ -112,7 +112,7 @@ return TRUE /datum/surgery_step/seal_veins/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - var/datum/wound/pierce/pierce_wound = surgery.operated_wound + var/datum/wound/pierce/bleed/pierce_wound = surgery.operated_wound if(!pierce_wound) 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)]...")) return @@ -126,7 +126,7 @@ display_pain(target, "You're being burned inside your [parse_zone(user.zone_selected)]!") /datum/surgery_step/seal_veins/success(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/datum/wound/pierce/pierce_wound = surgery.operated_wound + var/datum/wound/pierce/bleed/pierce_wound = surgery.operated_wound if(!pierce_wound) to_chat(user, span_warning("[target] has no puncture there!")) return ..() diff --git a/code/modules/surgery/revival.dm b/code/modules/surgery/revival.dm index ebd965414578d..f7e9fcce390e9 100644 --- a/code/modules/surgery/revival.dm +++ b/code/modules/surgery/revival.dm @@ -3,7 +3,9 @@ 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." requires_bodypart_type = NONE - possible_locs = list(BODY_ZONE_HEAD) + possible_locs = list(BODY_ZONE_CHEST) + target_mobtypes = list(/mob/living) + surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_MORBID_CURIOSITY steps = list( /datum/surgery_step/incise, /datum/surgery_step/retract_skin, @@ -14,15 +16,22 @@ /datum/surgery_step/close, ) -/datum/surgery/revival/can_start(mob/user, mob/living/carbon/target) +/datum/surgery/revival/can_start(mob/user, mob/living/target) if(!..()) return FALSE if(target.stat != DEAD) return FALSE if(HAS_TRAIT(target, TRAIT_SUICIDED) || HAS_TRAIT(target, TRAIT_HUSK) || HAS_TRAIT(target, TRAIT_DEFIB_BLACKLISTED)) return FALSE - var/obj/item/organ/internal/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) - if(!target_brain) + if(!is_valid_target(target)) + return FALSE + return TRUE + +/// Extra checks which can be overridden +/datum/surgery/revival/proc/is_valid_target(mob/living/patient) + if (iscarbon(patient)) + return FALSE + if (!(patient.mob_biotypes & (MOB_ORGANIC|MOB_HUMANOID))) return FALSE return TRUE @@ -58,7 +67,7 @@ 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) +/datum/surgery_step/revive/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results( user, target, @@ -68,13 +77,13 @@ ) 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) +/datum/surgery_step/revive/play_preop_sound(mob/user, mob/living/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) +/datum/surgery_step/revive/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) display_results( user, target, @@ -86,15 +95,21 @@ target.adjustOxyLoss(-50, 0) target.updatehealth() if(target.revive()) - target.visible_message(span_notice("...[target] wakes up, alive and aware!")) - target.emote("gasp") - target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 50, 199) //MAD SCIENCE + on_revived(user, target) 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) + target.visible_message(span_warning("...[target.p_they()] convulse[target.p_s()], then lie[target.p_s()] still.")) + return FALSE + +/// Called when you have been successfully raised from the dead +/datum/surgery_step/revive/proc/on_revived(mob/surgeon, mob/living/patient) + patient.visible_message(span_notice("...[patient] wakes up, alive and aware!")) + patient.emote("gasp") + if(HAS_MIND_TRAIT(surgeon, TRAIT_MORBID) && ishuman(surgeon)) // Contrary to their typical hatred of resurrection, it wouldn't be very thematic if morbid people didn't love playing god + var/mob/living/carbon/human/morbid_weirdo = surgeon + morbid_weirdo.add_mood_event("morbid_revival_success", /datum/mood_event/morbid_revival_success) + +/datum/surgery_step/revive/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results( user, target, @@ -102,5 +117,23 @@ 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 + +/// Additional revival effects if the target has a brain +/datum/surgery/revival/carbon + possible_locs = list(BODY_ZONE_HEAD) + target_mobtypes = list(/mob/living/carbon) + +/datum/surgery/revival/carbon/is_valid_target(mob/living/carbon/patient) + var/obj/item/organ/internal/brain/target_brain = patient.get_organ_slot(ORGAN_SLOT_BRAIN) + return !isnull(target_brain) + +/datum/surgery_step/revive/carbon + +/datum/surgery_step/revive/carbon/on_revived(mob/surgeon, mob/living/patient) + . = ..() + patient.adjustOrganLoss(ORGAN_SLOT_BRAIN, 50, 199) // MAD SCIENCE + +/datum/surgery_step/revive/carbon/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + . = ..() + target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15, 180) diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 3a5ed229c5f5a..7320e6ed94753 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -5,7 +5,7 @@ var/desc ///From __DEFINES/surgery.dm - ///Selection: SURGERY_IGNORE_CLOTHES | SURGERY_SELF_OPERABLE | SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB + ///Selection: SURGERY_IGNORE_CLOTHES | SURGERY_SELF_OPERABLE | SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB | SURGERY_MORBID_CURIOSITY var/surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB ///The surgery step we're currently on, increases each time we do a step. var/status = 1 @@ -74,7 +74,7 @@ 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(HAS_MIND_TRAIT(user, TRAIT_SURGEON)) if(replaced_by) // only show top-level surgeries return FALSE else diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index 17cd10f9ca492..cafa1161693a3 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -65,7 +65,9 @@ #define SURGERY_SLOWDOWN_CAP_MULTIPLIER 2 //increase to make surgery slower but fail less, and decrease to make surgery faster but fail more ///Modifier given to surgery speed for dissected bodies. -#define SURGERY_DISSECTION_MODIFIER 1.2 +#define SURGERY_SPEED_DISSECTION_MODIFIER 0.8 +///Modifier given to users with TRAIT_MORBID on certain surgeries +#define SURGERY_SPEED_MORBID_CURIOSITY 0.7 /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. @@ -85,8 +87,11 @@ if(tool) speed_mod = tool.toolspeed - if(HAS_TRAIT(target, TRAIT_DISSECTED)) - speed_mod /= SURGERY_DISSECTION_MODIFIER + if(HAS_TRAIT(target, TRAIT_SURGICALLY_ANALYZED)) + speed_mod *= SURGERY_SPEED_DISSECTION_MODIFIER + + if(check_morbid_curiosity(user, tool, surgery)) + speed_mod *= SURGERY_SPEED_MORBID_CURIOSITY var/implement_speed_mod = 1 if(implement_type) //this means it isn't a require hand or any item step. @@ -124,7 +129,7 @@ surgery.complete(user) if(target.stat == DEAD && was_sleeping && user.client) - user.client.give_award(/datum/award/achievement/misc/sandman, user) + user.client.give_award(/datum/award/achievement/jobs/sandman, user) surgery.step_in_progress = FALSE return advance @@ -220,6 +225,16 @@ chems += chemname return english_list(chems, and_text = require_all_chems ? " and " : " or ") +// Check if we are entitled to morbid bonuses +/datum/surgery_step/proc/check_morbid_curiosity(mob/user, obj/item/tool, datum/surgery/surgery) + if(!(surgery.surgery_flags & SURGERY_MORBID_CURIOSITY)) + return FALSE + if(tool && !(tool.item_flags & CRUEL_IMPLEMENT)) + return FALSE + if(!HAS_MIND_TRAIT(user, TRAIT_MORBID)) + return FALSE + return TRUE + //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) @@ -247,5 +262,6 @@ if(prob(30) && !mechanical_surgery) target.emote("scream") -#undef SURGERY_DISSECTION_MODIFIER +#undef SURGERY_SPEED_DISSECTION_MODIFIER +#undef SURGERY_SPEED_MORBID_CURIOSITY #undef SURGERY_SLOWDOWN_CAP_MULTIPLIER diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 76a313020f7f3..c5f62883b5f11 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -12,6 +12,11 @@ w_class = WEIGHT_CLASS_TINY tool_behaviour = TOOL_RETRACTOR toolspeed = 1 + /// How this looks when placed in a surgical tray + var/surgical_tray_overlay = "retractor_normal" + +/obj/item/retractor/get_surgery_tool_overlay(tray_extended) + return surgical_tray_overlay /obj/item/retractor/augment desc = "Micro-mechanical manipulator for retracting stuff." @@ -34,6 +39,11 @@ attack_verb_simple = list("attack", "pinch") tool_behaviour = TOOL_HEMOSTAT toolspeed = 1 + /// How this looks when placed in a surgical tray + var/surgical_tray_overlay = "hemostat_normal" + +/obj/item/hemostat/get_surgery_tool_overlay(tray_extended) + return surgical_tray_overlay /obj/item/hemostat/augment desc = "Tiny servos power a pair of pincers to stop bleeding." @@ -56,6 +66,12 @@ attack_verb_simple = list("burn") tool_behaviour = TOOL_CAUTERY toolspeed = 1 + heat = 500 + /// How this looks when placed in a surgical tray + var/surgical_tray_overlay = "cautery_normal" + +/obj/item/cautery/get_surgery_tool_overlay(tray_extended) + return surgical_tray_overlay /obj/item/cautery/ignition_effect(atom/ignitable_atom, mob/user) . = span_notice("[user] touches the end of [src] to \the [ignitable_atom], igniting it with a puff of smoke.") @@ -70,6 +86,7 @@ icon = 'icons/obj/medical/surgery_tools.dmi' icon_state = "e_cautery" inhand_icon_state = "e_cautery" + surgical_tray_overlay = "cautery_advanced" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*2, /datum/material/glass =SHEET_MATERIAL_AMOUNT, /datum/material/plasma =SHEET_MATERIAL_AMOUNT, /datum/material/uranium = SHEET_MATERIAL_AMOUNT*1.5, /datum/material/titanium = SHEET_MATERIAL_AMOUNT*1.5) @@ -80,14 +97,19 @@ light_range = 1 light_color = COLOR_SOFT_RED +/obj/item/cautery/advanced/get_all_tool_behaviours() + return list(TOOL_CAUTERY, TOOL_DRILL) + /obj/item/cautery/advanced/Initialize(mapload) . = ..() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ force_on = force, \ throwforce_on = throwforce, \ hitsound_on = hitsound, \ w_class_on = w_class, \ - clumsy_check = FALSE) + clumsy_check = FALSE, \ + ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) /* @@ -129,11 +151,16 @@ sharpness = SHARP_POINTY wound_bonus = 10 bare_wound_bonus = 10 + /// How this looks when placed in a surgical tray + var/surgical_tray_overlay = "drill_normal" /obj/item/surgicaldrill/Initialize(mapload) . = ..() AddElement(/datum/element/eyestab) +/obj/item/surgicaldrill/get_surgery_tool_overlay(tray_extended) + return surgical_tray_overlay + /obj/item/surgicaldrill/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] rams [src] into [user.p_their()] chest! It looks like [user.p_theyre()] trying to commit suicide!")) addtimer(CALLBACK(user, TYPE_PROC_REF(/mob/living/carbon, gib), null, null, TRUE, TRUE), 25) @@ -172,6 +199,8 @@ toolspeed = 1 wound_bonus = 10 bare_wound_bonus = 15 + /// How this looks when placed in a surgical tray + var/surgical_tray_overlay = "scalpel_normal" /obj/item/scalpel/Initialize(mapload) . = ..() @@ -182,14 +211,17 @@ ) AddElement(/datum/element/eyestab) -/obj/item/scalpel/augment - desc = "Ultra-sharp blade attached directly to your bone for extra-accuracy." - toolspeed = 0.5 +/obj/item/scalpel/get_surgery_tool_overlay(tray_extended) + return surgical_tray_overlay /obj/item/scalpel/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is slitting [user.p_their()] [pick("wrists", "throat", "stomach")] with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) return BRUTELOSS +/obj/item/scalpel/augment + desc = "Ultra-sharp blade attached directly to your bone for extra-accuracy." + toolspeed = 0.5 + /obj/item/circular_saw name = "circular saw" desc = "For heavy duty cutting." @@ -215,6 +247,8 @@ toolspeed = 1 wound_bonus = 15 bare_wound_bonus = 10 + /// How this looks when placed in a surgical tray + var/surgical_tray_overlay = "saw_normal" /obj/item/circular_saw/Initialize(mapload) . = ..() @@ -225,6 +259,15 @@ butcher_sound = 'sound/weapons/circsawhit.ogg', \ ) //saws are very accurate and fast at butchering + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/chainsaw) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + +/obj/item/circular_saw/get_surgery_tool_overlay(tray_extended) + return surgical_tray_overlay /obj/item/circular_saw/augment desc = "A small but very fast spinning saw. It rips and tears until it is done." @@ -252,9 +295,12 @@ name = "surgical processor" desc = "A device for scanning and initiating surgeries from a disk or operating computer." icon = 'icons/obj/device.dmi' - icon_state = "spectrometer" + icon_state = "surgical_processor" item_flags = NOBLUDGEON + // List of surgeries downloaded into the device. var/list/loaded_surgeries = list() + // If a surgery has been downloaded in. Will cause the display to have a noticeable effect - helps to realize you forgot to load anything in. + var/downloaded = TRUE /obj/item/surgical_processor/Initialize(mapload) . = ..() @@ -302,8 +348,15 @@ var/obj/machinery/computer/operating/surgery_computer = design_holder loaded_surgeries |= surgery_computer.advanced_surgeries playsound(src, 'sound/machines/terminal_success.ogg', 25, TRUE) + downloaded = TRUE + update_appearance(UPDATE_OVERLAYS) return TRUE +/obj/item/surgical_processor/update_overlays() + . = ..() + if(downloaded) + . += mutable_appearance(src.icon, "+downloaded") + /obj/item/surgical_processor/proc/check_surgery(mob/user, datum/surgery/surgery, mob/patient) SIGNAL_HANDLER @@ -317,6 +370,7 @@ desc = "An advanced scalpel which uses laser technology to cut." icon_state = "e_scalpel" inhand_icon_state = "e_scalpel" + surgical_tray_overlay = "scalpel_advanced" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*3, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/silver =SHEET_MATERIAL_AMOUNT, /datum/material/gold =HALF_SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/diamond =SMALL_MATERIAL_AMOUNT * 2, /datum/material/titanium = SHEET_MATERIAL_AMOUNT*2) @@ -329,16 +383,21 @@ light_color = LIGHT_COLOR_BLUE sharpness = SHARP_EDGED +/obj/item/scalpel/advanced/get_all_tool_behaviours() + return list(TOOL_SAW, TOOL_SCALPEL) + /obj/item/scalpel/advanced/Initialize(mapload) . = ..() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ force_on = force + 1, \ throwforce_on = throwforce, \ throw_speed_on = throw_speed, \ sharpness_on = sharpness, \ hitsound_on = hitsound, \ w_class_on = w_class, \ - clumsy_check = FALSE) + clumsy_check = FALSE, \ + ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) /* @@ -371,19 +430,25 @@ custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*6, /datum/material/glass = SHEET_MATERIAL_AMOUNT*2, /datum/material/silver = SHEET_MATERIAL_AMOUNT*2, /datum/material/titanium =SHEET_MATERIAL_AMOUNT * 2.5) icon_state = "adv_retractor" inhand_icon_state = "adv_retractor" + surgical_tray_overlay = "retractor_advanced" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' w_class = WEIGHT_CLASS_NORMAL toolspeed = 0.7 +/obj/item/retractor/advanced/get_all_tool_behaviours() + return list(TOOL_HEMOSTAT, TOOL_RETRACTOR) + /obj/item/retractor/advanced/Initialize(mapload) . = ..() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ force_on = force, \ throwforce_on = throwforce, \ hitsound_on = hitsound, \ w_class_on = w_class, \ - clumsy_check = FALSE) + clumsy_check = FALSE, \ + ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) /* @@ -471,6 +536,9 @@ limb_snip_candidate.dismember() user.visible_message(span_danger("[src] violently slams shut, amputating [patient]'s [candidate_name]."), span_notice("You amputate [patient]'s [candidate_name] with [src].")) + if(HAS_MIND_TRAIT(user, TRAIT_MORBID)) //Freak + user.add_mood_event("morbid_dismemberment", /datum/mood_event/morbid_dismemberment) + /obj/item/shears/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] is pinching [user.p_them()]self with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")) var/timer = 1 SECONDS @@ -499,6 +567,9 @@ tool_behaviour = TOOL_BONESET toolspeed = 1 +/obj/item/bonesetter/get_surgery_tool_overlay(tray_extended) + return "bonesetter" + (tray_extended ? "" : "_out") + /obj/item/blood_filter name = "blood filter" desc = "For filtering the blood." @@ -516,6 +587,9 @@ /// Assoc list of chem ids to names, used for deciding which chems to filter when used for surgery var/list/whitelist = list() +/obj/item/blood_filter/get_surgery_tool_overlay(tray_extended) + return "filter" + /obj/item/blood_filter/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) @@ -554,3 +628,47 @@ var/chem_name = params["reagent"] var/chem_id = get_chem_id(chem_name) whitelist -= chem_id + +/* + * Cruel Surgery Tools + * + * This variety of tool has the CRUEL_IMPLEMENT flag. + * + * Bonuses if the surgery is being done by a morbid user and it is of their interest. + * + * Morbid users are interested in; autospies, revival surgery, plastic surgery, organ/feature manipulations, amputations + * + * Otherwise, normal tool. + */ + +/obj/item/retractor/cruel + name = "twisted retractor" + desc = "Helps reveal secrets that would rather stay buried." + icon_state = "cruelretractor" + surgical_tray_overlay = "retractor_cruel" + item_flags = SURGICAL_TOOL | CRUEL_IMPLEMENT + +/obj/item/hemostat/cruel + name = "cruel hemostat" + desc = "Clamping bleeders, but not so good at fixing breathers." + icon_state = "cruelhemostat" + surgical_tray_overlay = "hemostat_cruel" + item_flags = SURGICAL_TOOL | CRUEL_IMPLEMENT + +/obj/item/cautery/cruel + name = "savage cautery" + desc = "Chalk this one up as another successful vivisection." + icon_state = "cruelcautery" + surgical_tray_overlay = "cautery_cruel" + item_flags = SURGICAL_TOOL | CRUEL_IMPLEMENT + +/obj/item/scalpel/cruel + name = "hungry scalpel" + desc = "I remember every time I hold you. My born companion..." + icon_state = "cruelscalpel" + surgical_tray_overlay = "scalpel_cruel" + item_flags = SURGICAL_TOOL | CRUEL_IMPLEMENT + +/obj/item/scalpel/cruel/Initialize(mapload) + . = ..() + AddElement(/datum/element/bane, mob_biotypes = MOB_UNDEAD, damage_multiplier = 1) //Just in case one of the tennants get uppity diff --git a/code/modules/tgs/core/_definitions.dm b/code/modules/tgs/core/_definitions.dm index ebf6d17c2a07a..fd98034eb7162 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/v3210/commands.dm b/code/modules/tgs/v3210/commands.dm index d9bd287465b9d..e65c816320dc0 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/commands.dm b/code/modules/tgs/v4/commands.dm index d6d3d718d4710..25dd6740e3af9 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/_defines.dm b/code/modules/tgs/v5/_defines.dm index c7213cc246998..f973338daa032 100644 --- a/code/modules/tgs/v5/_defines.dm +++ b/code/modules/tgs/v5/_defines.dm @@ -5,8 +5,8 @@ #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 diff --git a/code/modules/tgs/v5/api.dm b/code/modules/tgs/v5/api.dm index 926ea10a8f270..34cc43f8762f7 100644 --- a/code/modules/tgs/v5/api.dm +++ b/code/modules/tgs/v5/api.dm @@ -22,12 +22,17 @@ var/detached = FALSE +/datum/tgs_api/v5/New() + . = ..() + TGS_DEBUG_LOG("V5 API created") + /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] @@ -96,17 +101,28 @@ return TRUE /datum/tgs_api/v5/proc/RequireInitialBridgeResponse() + TGS_DEBUG_LOG("RequireInitialBridgeResponse()") + var/logged = FALSE while(!version) + if(!logged) + TGS_DEBUG_LOG("RequireInitialBridgeResponse: Starting sleep") + logged = TRUE + sleep(1) + 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 +172,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,45 +181,45 @@ var/datum/tgs_chat_channel/channel = I ids += channel.id - message = UpgradeDeprecatedChatMessage(message) + message2 = UpgradeDeprecatedChatMessage(message2) if (!length(channels)) return - message = message._interop_serialize() - message[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = ids + var/list/data = message2._interop_serialize() + data[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = ids if(intercepted_message_queue) - intercepted_message_queue += list(message) + intercepted_message_queue += list(data) else - Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = message)) + Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = data)) -/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) + message2 = UpgradeDeprecatedChatMessage(message2) if (!length(channels)) return - message = message._interop_serialize() - message[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = channels + var/list/data = message2._interop_serialize() + data[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = channels if(intercepted_message_queue) - intercepted_message_queue += list(message) + intercepted_message_queue += list(data) else - Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = message)) + Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = data)) -/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) +/datum/tgs_api/v5/ChatPrivateMessage(datum/tgs_message_content/message2, datum/tgs_chat_user/user) + message2 = UpgradeDeprecatedChatMessage(message2) + var/list/data = message2._interop_serialize() + data[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = list(user.channel.id) if(intercepted_message_queue) - intercepted_message_queue += list(message) + intercepted_message_queue += list(data) else - Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = message)) + Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = data)) /datum/tgs_api/v5/ChatChannelInfo() RequireInitialBridgeResponse() @@ -211,6 +227,7 @@ return chat_channels.Copy() /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() diff --git a/code/modules/tgs/v5/commands.dm b/code/modules/tgs/v5/commands.dm index a832c81f172d8..9557f8a08ed54 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 7f9bc731b792c..3a32848ad5129 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 56c1824fd97dc..d7d4712138135 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,23 +71,25 @@ 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] @@ -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) @@ -138,7 +147,7 @@ return TopicResponse() if(DMAPI5_TOPIC_COMMAND_HEALTHCHECK) - if(event_handler?.receive_health_checks) + if(event_handler && event_handler.receive_health_checks) event_handler.HandleEvent(TGS_EVENT_HEALTH_CHECK) return TopicResponse() diff --git a/code/modules/tgui/external.dm b/code/modules/tgui/external.dm index b49baf1499657..bcd97a9124516 100644 --- a/code/modules/tgui/external.dm +++ b/code/modules/tgui/external.dm @@ -70,7 +70,7 @@ * change static data. */ /datum/proc/update_static_data_for_all_viewers() - for (var/datum/tgui/window as anything in SStgui.open_uis_by_src[REF(src)]) + for (var/datum/tgui/window as anything in open_uis) window.send_full_update() /** diff --git a/code/modules/tgui/states/greyscale_menu.dm b/code/modules/tgui/states/greyscale_menu.dm new file mode 100644 index 0000000000000..9de6140e70929 --- /dev/null +++ b/code/modules/tgui/states/greyscale_menu.dm @@ -0,0 +1,14 @@ +/** + * tgui state: greyscale menu + * + * Checks that the target var of the greyscale menu meets the default can_use_topic criteria + */ + +GLOBAL_DATUM_INIT(greyscale_menu_state, /datum/ui_state/greyscale_menu_state, new) + +/datum/ui_state/greyscale_menu_state/can_use_topic(src_object, mob/user) + var/datum/greyscale_modify_menu/menu = src_object + if(!isatom(menu.target)) + return TRUE + + return GLOB.default_state.can_use_topic(menu.target, user) diff --git a/code/modules/tgui/states/language_menu.dm b/code/modules/tgui/states/language_menu.dm index eaaa125786d1d..1786175f051c8 100644 --- a/code/modules/tgui/states/language_menu.dm +++ b/code/modules/tgui/states/language_menu.dm @@ -14,6 +14,6 @@ GLOBAL_DATUM_INIT(language_menu_state, /datum/ui_state/language_menu, new) if(check_rights_for(user.client, R_ADMIN)) . = UI_INTERACTIVE else if(istype(src_object, /datum/language_menu)) - var/datum/language_menu/LM = src_object - if(LM.language_holder.get_atom() == user) + var/datum/language_menu/my_languages = src_object + if(my_languages.language_holder.owner == user) . = UI_INTERACTIVE diff --git a/code/modules/tgui/tgui_window.dm b/code/modules/tgui/tgui_window.dm index 674016bcafac3..0f831dfd92654 100644 --- a/code/modules/tgui/tgui_window.dm +++ b/code/modules/tgui/tgui_window.dm @@ -26,6 +26,18 @@ var/initial_inline_css var/mouse_event_macro_set = FALSE + /** + * Static list used to map in macros that will then emit execute events to the tgui window + * A small disclaimer though I'm no tech wiz: I don't think it's possible to map in right or middle + * clicks in the current state, as they're keywords rather than modifiers. + */ + var/static/list/byondToTguiEventMap = list( + "MouseDown" = "byond/mousedown", + "MouseUp" = "byond/mouseup", + "Ctrl" = "byond/ctrldown", + "Ctrl+UP" = "byond/ctrlup", + ) + /** * public * @@ -381,11 +393,6 @@ if(mouse_event_macro_set) return - var/list/byondToTguiEventMap = list( - "MouseDown" = "byond/mousedown", - "MouseUp" = "byond/mouseup" - ) - for(var/mouseMacro in byondToTguiEventMap) var/command_template = ".output CONTROL PAYLOAD" var/event_message = TGUI_CREATE_MESSAGE(byondToTguiEventMap[mouseMacro], null) @@ -406,10 +413,6 @@ /datum/tgui_window/proc/remove_mouse_macro() if(!mouse_event_macro_set) stack_trace("Unsetting mouse macro on tgui window that has none") - var/list/byondToTguiEventMap = list( - "MouseDown" = "byond/mousedown", - "MouseUp" = "byond/mouseup" - ) for(var/mouseMacro in byondToTguiEventMap) winset(client, null, "[mouseMacro]Window[id]Macro.parent=null") mouse_event_macro_set = FALSE diff --git a/code/modules/tgui_panel/telemetry.dm b/code/modules/tgui_panel/telemetry.dm index 5b30d26ebe921..815bb34773572 100644 --- a/code/modules/tgui_panel/telemetry.dm +++ b/code/modules/tgui_panel/telemetry.dm @@ -108,6 +108,7 @@ if(found) var/msg = "[key_name(client)] has a banned account in connection history! (Matched: [found["ckey"]], [found["address"]], [found["computer_id"]])" message_admins(msg) + send2tgs_adminless_only("Banned-user", msg) log_admin_private(msg) log_suspicious_login(msg, access_log_mirror = FALSE) diff --git a/code/modules/tutorials/_tutorial.dm b/code/modules/tutorials/_tutorial.dm index 810960f9fa7fb..3baa9ad148b7d 100644 --- a/code/modules/tutorials/_tutorial.dm +++ b/code/modules/tutorials/_tutorial.dm @@ -100,7 +100,7 @@ PROTECTED_PROC(TRUE) if (isnull(instruction_screen)) - instruction_screen = new(null, message, user.client) + instruction_screen = new(null, null, message, user.client) user.client?.screen += instruction_screen else instruction_screen.change_message(message) diff --git a/code/modules/tutorials/tutorial_instruction.dm b/code/modules/tutorials/tutorial_instruction.dm index 7d8bda0fab787..05c95e2f7540d 100644 --- a/code/modules/tutorials/tutorial_instruction.dm +++ b/code/modules/tutorials/tutorial_instruction.dm @@ -10,7 +10,7 @@ var/client/client var/atom/movable/screen/tutorial_instruction_text/instruction_text -/atom/movable/screen/tutorial_instruction/Initialize(mapload, message, client/client) +/atom/movable/screen/tutorial_instruction/Initialize(mapload, datum/hud/hud_owner, message, client/client) . = ..() transform = transform.Scale(36, 2.5) @@ -18,7 +18,7 @@ src.client = client animate(src, alpha = 245, time = 0.8 SECONDS, easing = SINE_EASING) - instruction_text = new(src, message, client) + instruction_text = new(src, null, message, client) vis_contents += instruction_text /atom/movable/screen/tutorial_instruction/Destroy() @@ -36,7 +36,7 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT layer = TUTORIAL_INSTRUCTIONS_LAYER -/atom/movable/screen/tutorial_instruction_text/Initialize(mapload, message, client/client) +/atom/movable/screen/tutorial_instruction_text/Initialize(mapload, datum/hud/hud_owner, message, client/client) . = ..() var/view = client?.view_size.getView() diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index eaf25edf81fed..d4839542122d3 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -55,8 +55,13 @@ #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_CREATE_AND_DESTROY INFINITY +/// This must be the one of last tests 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_CREATE_AND_DESTROY 9001 +/** + * For tests that rely on create and destroy having iterated through every (tangible) atom so they don't have to do something similar. + * Keep in mind tho that create and destroy will absolutely break the test platform, anything that relies on its shape cannot come after it. + */ +#define TEST_AFTER_CREATE_AND_DESTROY INFINITY /// Change color to red on ANSI terminal output, if enabled with -DANSICOLORS. #ifdef ANSICOLORS @@ -79,6 +84,8 @@ /// A trait source when adding traits through unit tests #define TRAIT_SOURCE_UNIT_TESTS "unit_tests" +// BEGIN_INCLUDE +#include "abductor_baton_spell.dm" #include "ablative_hud.dm" #include "achievements.dm" #include "anchored_mobs.dm" @@ -96,13 +103,17 @@ #include "blindness.dm" #include "bloody_footprints.dm" #include "breath.dm" +#include "burning.dm" #include "cable_powernets.dm" #include "card_mismatch.dm" #include "cardboard_cutouts.dm" #include "chain_pull_through_space.dm" +#include "changeling.dm" #include "chat_filter.dm" #include "circuit_component_category.dm" +#include "client_colours.dm" #include "closets.dm" +#include "clothing_under_armor_subtype_check.dm" #include "combat.dm" #include "component_tests.dm" #include "confusion.dm" @@ -110,8 +121,10 @@ #include "container_sanity.dm" #include "crayons.dm" #include "create_and_destroy.dm" +#include "dcs_check_list_arguments.dm" #include "dcs_get_id_from_elements.dm" #include "designs.dm" +#include "dismemberment.dm" #include "door_access.dm" #include "dragon_expiration.dm" #include "drink_icons.dm" @@ -119,7 +132,9 @@ #include "dynamic_ruleset_sanity.dm" #include "egg_glands.dm" #include "emoting.dm" +#include "ensure_subtree_operational_datum.dm" #include "explosion_action.dm" +#include "fish_unit_tests.dm" #include "focus_only_tests.dm" #include "font_awesome_icons.dm" #include "food_edibility_check.dm" @@ -131,6 +146,7 @@ #include "hallucination_icons.dm" #include "heretic_knowledge.dm" #include "heretic_rituals.dm" +#include "high_five.dm" #include "holidays.dm" #include "human_through_recycler.dm" #include "hunger_curse.dm" @@ -142,10 +158,14 @@ #include "json_savefile_importing.dm" #include "keybinding_init.dm" #include "knockoff_component.dm" +#include "language_transfer.dm" +#include "leash.dm" #include "lesserform.dm" #include "limbsanity.dm" -#include "lungs.dm" +#include "ling_decap.dm" +#include "liver.dm" #include "load_map_security.dm" +#include "lungs.dm" #include "machine_disassembly.dm" #include "map_landmarks.dm" #include "mapload_space_verification.dm" @@ -156,8 +176,11 @@ #include "metabolizing.dm" #include "mindbound_actions.dm" #include "missing_icons.dm" +#include "mob_chains.dm" +#include "mob_damage.dm" #include "mob_faction.dm" #include "mob_spawn.dm" +#include "modify_fantasy_variable.dm" #include "modsuit.dm" #include "modular_map_loader.dm" #include "monkey_business.dm" @@ -169,8 +192,8 @@ #include "objectives.dm" #include "operating_table.dm" #include "orderable_items.dm" -#include "organs.dm" #include "organ_set_bonus.dm" +#include "organs.dm" #include "outfit_sanity.dm" #include "paintings.dm" #include "pills.dm" @@ -183,6 +206,7 @@ #include "quirks.dm" #include "range_return.dm" #include "rcd.dm" +#include "reagent_container_defaults.dm" #include "reagent_id_typos.dm" #include "reagent_mob_expose.dm" #include "reagent_mod_procs.dm" @@ -198,8 +222,8 @@ #include "screenshot_humanoids.dm" #include "screenshot_husk.dm" #include "screenshot_saturnx.dm" -#include "security_officer_distribution.dm" #include "security_levels.dm" +#include "security_officer_distribution.dm" #include "serving_tray.dm" #include "simple_animal_freeze.dm" #include "siunit.dm" @@ -213,15 +237,18 @@ #include "species_unique_id.dm" #include "species_whitelists.dm" #include "spell_invocations.dm" +#include "spell_jaunt.dm" #include "spell_mindswap.dm" #include "spell_names.dm" #include "spell_shapeshift.dm" #include "spritesheets.dm" #include "stack_singular_name.dm" #include "station_trait_tests.dm" +#include "status_effect_ticks.dm" #include "stomach.dm" #include "strange_reagent.dm" #include "strippable.dm" +#include "stuns.dm" #include "subsystem_init.dm" #include "suit_storage_icons.dm" #include "surgeries.dm" @@ -231,13 +258,16 @@ #include "trait_addition_and_removal.dm" #include "traitor.dm" #include "traitor_mail_content_check.dm" +#include "trauma_granting.dm" #include "turf_icons.dm" #include "tutorial_sanity.dm" #include "unit_test.dm" #include "verify_config_tags.dm" #include "verify_emoji_names.dm" +#include "weird_food.dm" #include "wizard_loadout.dm" #include "worn_icons.dm" +// END_INCLUDE #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/abductor_baton_spell.dm b/code/modules/unit_tests/abductor_baton_spell.dm new file mode 100644 index 0000000000000..83d514de2b21b --- /dev/null +++ b/code/modules/unit_tests/abductor_baton_spell.dm @@ -0,0 +1,19 @@ +/// Tests that abductors get their baton recall spell when being equipped +/datum/unit_test/abductor_baton_spell + +/datum/unit_test/abductor_baton_spell/Run() + // Test abductor agents get a linked "summon item" spell that marks their baton. + var/mob/living/carbon/human/ayy = allocate(/mob/living/carbon/human/consistent) + ayy.equipOutfit(/datum/outfit/abductor/agent) + + var/datum/action/cooldown/spell/summonitem/abductor/summon = locate() in ayy.actions + TEST_ASSERT_NOTNULL(summon, "Abductor agent does not have summon item spell.") + TEST_ASSERT(istype(summon.marked_item, /obj/item/melee/baton/abductor), "Abductor agent's summon item spell did not mark their baton.") + + // Also test abductor solo agents also get the spell. + var/mob/living/carbon/human/ayy_two = allocate(/mob/living/carbon/human/consistent) + ayy_two.equipOutfit(/datum/outfit/abductor/scientist/onemanteam) + + var/datum/action/cooldown/spell/summonitem/abductor/summon_two = locate() in ayy_two.actions + TEST_ASSERT_NOTNULL(summon_two, "Abductor solo agent does not have summon item spell.") + TEST_ASSERT(istype(summon_two.marked_item, /obj/item/melee/baton/abductor), "Abductor solo agent's summon item spell did not mark their baton.") diff --git a/code/modules/unit_tests/ablative_hud.dm b/code/modules/unit_tests/ablative_hud.dm index 62f9501180a26..d7a40dc764b64 100644 --- a/code/modules/unit_tests/ablative_hud.dm +++ b/code/modules/unit_tests/ablative_hud.dm @@ -4,11 +4,12 @@ /datum/unit_test/ablative_hood_hud/Run() var/mob/living/carbon/human/person = allocate(/mob/living/carbon/human/consistent) var/obj/item/clothing/suit/hooded/ablative/coat = allocate(/obj/item/clothing/suit/hooded/ablative) + var/datum/component/toggle_attached_clothing/hood = coat.GetComponent(/datum/component/toggle_attached_clothing) person.equip_to_slot(coat, ITEM_SLOT_OCLOTHING) TEST_ASSERT(!HAS_TRAIT(person, TRAIT_SECURITY_HUD), "Person already had a sechud before trying to equip the ablative hood.") - coat.ToggleHood() + hood.toggle_deployable() TEST_ASSERT(HAS_TRAIT(person, TRAIT_SECURITY_HUD), "Person toggled the ablative hood but didn't gain a sechud.") - coat.ToggleHood() + hood.toggle_deployable() TEST_ASSERT(!HAS_TRAIT(person, TRAIT_SECURITY_HUD), "Person lowered their ablative hood but still has a sechud.") // Check that player doesn't gain sec hud if the hood is toggled when already wearing a helmet @@ -17,9 +18,10 @@ /datum/unit_test/ablative_hood_hud_with_helmet/Run() var/mob/living/carbon/human/person = allocate(/mob/living/carbon/human/consistent) var/obj/item/clothing/suit/hooded/ablative/coat = allocate(/obj/item/clothing/suit/hooded/ablative) + var/datum/component/toggle_attached_clothing/hood = coat.GetComponent(/datum/component/toggle_attached_clothing) var/obj/item/clothing/head/helmet/hat = allocate(/obj/item/clothing/head/helmet) person.equip_to_slot(coat, ITEM_SLOT_OCLOTHING) person.equip_to_slot(hat, ITEM_SLOT_HEAD) TEST_ASSERT(!HAS_TRAIT(person, TRAIT_SECURITY_HUD), "Person already had a sechud before trying to equip the ablative hood.") - coat.ToggleHood() + hood.toggle_deployable() TEST_ASSERT(!HAS_TRAIT(person, TRAIT_SECURITY_HUD), "Person has gained a sechud from toggling the ablative hood despite already wearing a helmet.") diff --git a/code/modules/unit_tests/achievements.dm b/code/modules/unit_tests/achievements.dm index 652d65898fa88..44e1384c2e01a 100644 --- a/code/modules/unit_tests/achievements.dm +++ b/code/modules/unit_tests/achievements.dm @@ -10,4 +10,7 @@ if(!init_icon || !(init_icon in award_icons)) TEST_FAIL("Award [initial(award.name)] has an unexistent icon: \"[init_icon || "null"]\"") if(length(initial(award.database_id)) > 32) //sql schema limit - TEST_FAIL("Award [initial(award.name)] database id is is too long") + TEST_FAIL("Award [initial(award.name)] database id is too long") + var/init_category = initial(award.category) + if(!(init_category in GLOB.achievement_categories)) + TEST_FAIL("Award [initial(award.name)] has unsupported category: \"[init_category || "null"]\". Update GLOB.achievement_categories") diff --git a/code/modules/unit_tests/burning.dm b/code/modules/unit_tests/burning.dm new file mode 100644 index 0000000000000..daf99875f28e0 --- /dev/null +++ b/code/modules/unit_tests/burning.dm @@ -0,0 +1,17 @@ +/// Tests that no runtimes are thrown when a mob is on fire +/datum/unit_test/burning + +/datum/unit_test/burning/Run() + var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) + var/initial_temp = dummy.bodytemperature + // Light this baby up + dummy.set_fire_stacks(20) + dummy.ignite_mob() + TEST_ASSERT(dummy.on_fire, "Dummy is not on fire despite having 20 fire stacks and being ignited.") + // Manually tick it a few times + var/datum/status_effect/fire_handler/fire_stacks/handler = locate() in dummy.status_effects + for(var/i in 1 to 5) + handler.tick_interval = world.time - 1 + handler.process() + TEST_ASSERT(dummy.fire_stacks < 20, "Dummy should have decayed firestacks, but did not. (Dummy stacks: [dummy.fire_stacks]).") + TEST_ASSERT(dummy.bodytemperature > initial_temp, "Dummy did not heat up despite being on fire. (Dummy temp: [dummy.bodytemperature], initial temp: [initial_temp])") diff --git a/code/modules/unit_tests/chain_pull_through_space.dm b/code/modules/unit_tests/chain_pull_through_space.dm index 86b0cc69d1cf4..b767b010495c8 100644 --- a/code/modules/unit_tests/chain_pull_through_space.dm +++ b/code/modules/unit_tests/chain_pull_through_space.dm @@ -11,15 +11,16 @@ ..() //reserve a tile that is always empty for our z destination - reserved = SSmapping.RequestBlockReservation(5,5) + reserved = SSmapping.request_turf_block_reservation(5, 5, 1) // Create a space tile that goes to another z-level claimed_tile = run_loc_floor_bottom_left.type 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] + var/turf/bottom_left = reserved.bottom_left_turfs[1] + space_tile.destination_x = round(bottom_left.x + (reserved.width-1) / 2) + space_tile.destination_y = round(bottom_left.y + (reserved.height-1) / 2) + space_tile.destination_z = bottom_left.z // Create our list of humans, all adjacent to one another alice = new(locate(run_loc_floor_bottom_left.x + 2, run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z)) diff --git a/code/modules/unit_tests/changeling.dm b/code/modules/unit_tests/changeling.dm new file mode 100644 index 0000000000000..644a7247ad1d9 --- /dev/null +++ b/code/modules/unit_tests/changeling.dm @@ -0,0 +1,95 @@ +/// Tests transformation sting goes back and forth correctly +/datum/unit_test/transformation_sting + var/ling_name = "Is-A-Changeling" + var/base_victim_name + var/last_frame = 1 + var/icon/final_icon + +/datum/unit_test/transformation_sting/Run() + var/mob/living/carbon/human/ling = setup_ling() + var/mob/living/carbon/human/victim = setup_victim() + var/datum/antagonist/changeling/ling_datum = ling.mind.has_antag_datum(/datum/antagonist/changeling) + + // Get the ability we're testing + ling_datum.purchase_power(/datum/action/changeling/sting/transformation) + var/datum/action/changeling/sting/transformation/sting_action = locate() in ling.actions + sting_action.selected_dna = ling_datum.current_profile + sting_action.sting_duration = 0.5 SECONDS // just makes sure everything settles. + + // Check that they look different before stinging + add_to_screenshot(ling, victim, both_species = TRUE) + + // Do the sting, make the transformation + sting_action.sting_action(ling, victim) + // Check their name and species align + TEST_ASSERT(victim.has_status_effect(/datum/status_effect/temporary_transformation), "Victim did not get temporary transformation status effect on being transformation stung.") + TEST_ASSERT_EQUAL(victim.real_name, ling_name, "Victim real name did not change on being transformation stung.") + TEST_ASSERT_EQUAL(victim.name, ling_name, "Victim name did not change on being transformation stung.") + TEST_ASSERT_EQUAL(victim.dna.species.type, ling.dna.species.type, "Victim species did not change on being transformation stung.") + TEST_ASSERT_EQUAL(victim.dna.features["mcolor"], ling.dna.features["mcolor"], "Victim mcolor did not change on being transformation stung.") + // Check they actually look the same + add_to_screenshot(ling, victim) + + // Make sure we give it enough time such that the status effect process ticks over and finishes + sleep(sting_action.sting_duration + 0.5 SECONDS) + + // Check their name and species reset correctly + TEST_ASSERT_EQUAL(victim.name, base_victim_name, "Victim name did not change back after transformation sting expired.") + TEST_ASSERT_EQUAL(victim.real_name, base_victim_name, "Victim real name did not change back after transformation sting expired.") + TEST_ASSERT_NOTEQUAL(victim.dna.species.type, ling.dna.species.type, "Victim species did not change back after transformation sting expired.") + TEST_ASSERT_NOTEQUAL(victim.dna.features["mcolor"], ling.dna.features["mcolor"], "Victim mcolor did not reset after transformation sting expired.") + // Check they actually look different again + add_to_screenshot(ling, victim, both_species = TRUE) + + test_screenshot("appearances", final_icon) + +/// Adds both mobs to the screenshot test, if both_species is TRUE, it also adds the victim in lizard form +/datum/unit_test/transformation_sting/proc/add_to_screenshot(mob/living/carbon/human/ling, mob/living/carbon/human/victim, both_species = FALSE) + if(isnull(final_icon)) + final_icon = icon('icons/effects/effects.dmi', "nothing") + + final_icon.Insert(getFlatIcon(ling, no_anim = TRUE), dir = SOUTH, frame = last_frame) + final_icon.Insert(getFlatIcon(victim, no_anim = TRUE), dir = NORTH, frame = last_frame) + + if(both_species) + var/prior_species = victim.dna.species.type + victim.set_species(/datum/species/lizard) + final_icon.Insert(getFlatIcon(victim, no_anim = TRUE), dir = EAST, frame = last_frame) + victim.set_species(prior_species) + + last_frame += 1 + +/datum/unit_test/transformation_sting/proc/setup_victim() + var/mob/living/carbon/human/victim = allocate(/mob/living/carbon/human/consistent) + base_victim_name = victim.real_name + victim.mind_initialize() + return victim + +/datum/unit_test/transformation_sting/proc/setup_ling() + var/mob/living/carbon/human/ling = allocate(/mob/living/carbon/human/consistent) + // Because we use two consistent humans, we need to change some of the features to know they're actually updating to new values. + // The more DNA features and random things we change, the more likely we are to catch something not updating correctly. + // Yeah guess who/what this is, I dare you. + ling.dna.features["mcolor"] = "#886600" + ling.dna.features["tail_lizard"] = "Smooth" + ling.dna.features["snout"] = "Sharp + Light" + ling.dna.features["horns"] = "Curled" + ling.dna.features["frills"] = "Short" + ling.dna.features["spines"] = "Long + Membrane" + ling.dna.features["body_markings"] = "Light Belly" + ling.dna.features["legs"] = DIGITIGRADE_LEGS + ling.eye_color_left = "#FFFFFF" + ling.eye_color_right = "#FFFFFF" + ling.dna.update_ui_block(DNA_EYE_COLOR_LEFT_BLOCK) + ling.dna.update_ui_block(DNA_EYE_COLOR_RIGHT_BLOCK) + ling.set_species(/datum/species/lizard) + + ling.real_name = ling_name + ling.dna.real_name = ling_name + ling.name = ling_name + ling.dna.initialize_dna(create_mutation_blocks = FALSE, randomize_features = FALSE) + + ling.mind_initialize() + ling.mind.add_antag_datum(/datum/antagonist/changeling) + + return ling diff --git a/code/modules/unit_tests/client_colours.dm b/code/modules/unit_tests/client_colours.dm new file mode 100644 index 0000000000000..55b6e0b24ad26 --- /dev/null +++ b/code/modules/unit_tests/client_colours.dm @@ -0,0 +1,9 @@ +///Checks that client colours have valid colour variables values at least when inited. +/datum/unit_test/client_colours + +/datum/unit_test/client_colours/Run() + for(var/datum/client_colour/colour as anything in subtypesof(/datum/client_colour)) + // colours can be color matrices (lists), which initial() cannot read. + colour = new colour + if(!color_to_full_rgba_matrix(colour.colour, FALSE)) + TEST_FAIL("[colour.type] has an invalid default colour value: [colour.colour]") diff --git a/code/modules/unit_tests/clothing_under_armor_subtype_check.dm b/code/modules/unit_tests/clothing_under_armor_subtype_check.dm new file mode 100644 index 0000000000000..9755004f71c91 --- /dev/null +++ b/code/modules/unit_tests/clothing_under_armor_subtype_check.dm @@ -0,0 +1,9 @@ +/** + * Test if all jumpsuits are using the proper armor subtype. + */ +/datum/unit_test/clothing_under_armor_subtype_check + +/datum/unit_test/clothing_under_armor_subtype_check/Run() + for(var/obj/item/clothing/under/jumpsuit as anything in typesof(/obj/item/clothing/under)) + if(!ispath(initial(UNLINT(jumpsuit.armor_type)), /datum/armor/clothing_under)) + TEST_FAIL("[jumpsuit] does not use clothing_under as its armor!") diff --git a/code/modules/unit_tests/crayons.dm b/code/modules/unit_tests/crayons.dm index be7255fdaeccc..ca2dfc629d3bd 100644 --- a/code/modules/unit_tests/crayons.dm +++ b/code/modules/unit_tests/crayons.dm @@ -3,7 +3,7 @@ /datum/unit_test/crayon_naming/Run() for(var/obj/item/toy/crayon/crayon_path as anything in typesof(/obj/item/toy/crayon)) - if(ispath(crayon_path, /obj/item/toy/crayon/spraycan)) + if(is_path_in_list(crayon_path, list(/obj/item/toy/crayon/spraycan, /obj/item/toy/crayon))) continue var/obj/item/toy/crayon/real_crayon = new crayon_path if(!findtext(initial(real_crayon.name),real_crayon.crayon_color)) diff --git a/code/modules/unit_tests/create_and_destroy.dm b/code/modules/unit_tests/create_and_destroy.dm index fd5ffb40c67c9..e0e763ebb8571 100644 --- a/code/modules/unit_tests/create_and_destroy.dm +++ b/code/modules/unit_tests/create_and_destroy.dm @@ -1,106 +1,12 @@ ///Delete one of every type, sleep a while, then check to see if anything has gone fucky /datum/unit_test/create_and_destroy - //You absolutely must run last + //You absolutely must run after (almost) everything else priority = TEST_CREATE_AND_DESTROY GLOBAL_VAR_INIT(running_create_and_destroy, FALSE) /datum/unit_test/create_and_destroy/Run() //We'll spawn everything here var/turf/spawn_at = run_loc_floor_bottom_left - var/list/ignore = list( - //Never meant to be created, errors out the ass for mobcode reasons - /mob/living/carbon, - //Nother template type, doesn't like being created with no seed - /obj/item/food/grown, - //And another - /obj/item/slimecross/recurring, - //This should be obvious - /obj/machinery/doomsday_device, - //Yet more templates - /obj/machinery/restaurant_portal, - //Template type - /obj/effect/mob_spawn, - //Template type - /obj/structure/holosign/robot_seat, - //Singleton - /mob/dview, - //Template type - /obj/item/bodypart, - //This is meant to fail extremely loud every single time it occurs in any environment in any context, and it falsely alarms when this unit test iterates it. Let's not spawn it in. - /obj/merge_conflict_marker, - //briefcase launchpads erroring - /obj/machinery/launchpad/briefcase, - //Both are abstract types meant to scream bloody murder if spawned in raw - /obj/item/organ/external, - /obj/item/organ/external/wings, - ) - //Say it with me now, type template - ignore += typesof(/obj/effect/mapping_helpers) - //This turf existing is an error in and of itself - ignore += typesof(/turf/baseturf_skipover) - ignore += typesof(/turf/baseturf_bottom) - //This demands a borg, so we'll let if off easy - ignore += typesof(/obj/item/modular_computer/pda/silicon) - //This one demands a computer, ditto - ignore += typesof(/obj/item/modular_computer/processor) - //Very finiky, blacklisting to make things easier - ignore += typesof(/obj/item/poster/wanted) - //This expects a seed, we can't pass it - ignore += typesof(/obj/item/food/grown) - //Needs clients / mobs to observe it to exist. Also includes hallucinations. - ignore += typesof(/obj/effect/client_image_holder) - //Same to above. Needs a client / mob / hallucination to observe it to exist. - ignore += typesof(/obj/projectile/hallucination) - ignore += typesof(/obj/item/hallucinated) - //We don't have a pod - ignore += typesof(/obj/effect/pod_landingzone_effect) - ignore += typesof(/obj/effect/pod_landingzone) - //We have a baseturf limit of 10, adding more than 10 baseturf helpers will kill CI, so here's a future edge case to fix. - ignore += typesof(/obj/effect/baseturf_helper) - //No tauma to pass in - ignore += typesof(/mob/camera/imaginary_friend) - //No pod to gondola - ignore += typesof(/mob/living/simple_animal/pet/gondola/gondolapod) - //No heart to give - ignore += typesof(/obj/structure/ethereal_crystal) - //No linked console - ignore += typesof(/mob/camera/ai_eye/remote/base_construction) - //See above - ignore += typesof(/mob/camera/ai_eye/remote/shuttle_docker) - //Hangs a ref post invoke async, which we don't support. Could put a qdeleted check but it feels hacky - ignore += typesof(/obj/effect/anomaly/grav/high) - //See above - ignore += typesof(/obj/effect/timestop) - //Invoke async in init, skippppp - 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 - ignore += typesof(/obj/docking_port) - //Asks for a shuttle that may not exist, let's leave it alone - ignore += typesof(/obj/item/pinpointer/shuttle) - //This spawns beams as a part of init, which can sleep past an async proc. This hangs a ref, and fucks us. It's only a problem here because the beam sleeps with CHECK_TICK - ignore += typesof(/obj/structure/alien/resin/flower_bud) - //Needs a linked mecha - ignore += typesof(/obj/effect/skyfall_landingzone) - //Expects a mob to holderize, we have nothing to give - ignore += typesof(/obj/item/clothing/head/mob_holder) - //Needs cards passed into the initilazation args - ignore += typesof(/obj/item/toy/cards/cardhand) - //Needs a holodeck area linked to it which is not guarenteed to exist and technically is supposed to have a 1:1 relationship with computer anyway. - ignore += typesof(/obj/machinery/computer/holodeck) - //runtimes if not paired with a landmark - ignore += typesof(/obj/structure/industrial_lift) - // Runtimes if the associated machinery does not exist, but not the base type - ignore += subtypesof(/obj/machinery/airlock_controller) - // Always ought to have an associated escape menu. Any references it could possibly hold would need one regardless. - ignore += subtypesof(/atom/movable/screen/escape_menu) var/list/cached_contents = spawn_at.contents.Copy() var/original_turf_type = spawn_at.type @@ -108,7 +14,7 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE) var/original_baseturf_count = length(original_baseturfs) GLOB.running_create_and_destroy = TRUE - for(var/type_path in typesof(/atom/movable, /turf) - ignore) //No areas please + for(var/type_path in typesof(/atom/movable, /turf) - uncreatables) //No areas please if(ispath(type_path, /turf)) spawn_at.ChangeTurf(type_path) //We change it back to prevent baseturfs stacking and hitting the limit @@ -135,19 +41,15 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE) qdel(to_kill) 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 // Drastically lower the amount of time it takes to GC, since we don't have clients that can hold it up. SSgarbage.collection_timeout[GC_QUEUE_CHECK] = 10 SECONDS - //Prevent the garbage subsystem from harddeling anything, if only to save time - SSgarbage.collection_timeout[GC_QUEUE_HARDDELETE] = 10000 HOURS //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) + // All of em, I want hard deletes too, since we rely on the debug info from them + for(var/i in 1 to GC_QUEUE_HARDDELETE) 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 @@ -157,6 +59,7 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE) time_needed += SSgarbage.collection_timeout[index] var/start_time = world.time + var/real_start_time = REALTIMEOFDAY var/garbage_queue_processed = FALSE sleep(time_needed) @@ -174,11 +77,12 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE) oldest_packet_creation = min(qdeld_at, oldest_packet_creation) //If we've found a packet that got del'd later then we finished, then all our shit has been processed - if(oldest_packet_creation > start_time) + //That said, if there are any pending hard deletes you may NOT sleep, we gotta handle that shit + 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 @@ -197,6 +101,9 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE) TEST_FAIL("[item.name] failed to respect force deletion [item.no_respect_force] times out of a total del count of [item.qdels]") if(item.no_hint) TEST_FAIL("[item.name] failed to return a qdel hint [item.no_hint] times out of a total del count of [item.qdels]") + if(LAZYLEN(item.extra_details)) + var/details = item.extra_details.Join("\n") + TEST_FAIL("[item.name] failed with extra info: \n[details]") cache_for_sonic_speed = SSatoms.BadInitializeCalls for(var/path in cache_for_sonic_speed) @@ -208,7 +115,5 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE) 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_CHECK] = GC_CHECK_QUEUE - SSgarbage.collection_timeout[GC_QUEUE_HARDDELETE] = GC_DEL_QUEUE diff --git a/code/modules/unit_tests/dcs_check_list_arguments.dm b/code/modules/unit_tests/dcs_check_list_arguments.dm new file mode 100644 index 0000000000000..8089896ba3d46 --- /dev/null +++ b/code/modules/unit_tests/dcs_check_list_arguments.dm @@ -0,0 +1,33 @@ +/** + * list arguments for bespoke elements are treated just like any other datum: as a text ref in the ID. + * Using un-cached lists in AddElement() and RemoveElement() calls will just create new elements over + * and over. That's what this unit test is for. It's not a catch-all, but it does a decent job at it. + */ +/datum/unit_test/dcs_check_list_arguments + /** + * This unit test requires every (tangible) atom to have been created at least once + * so its search is more accurate. That's why it's run after create_and_destroy. + */ + priority = TEST_AFTER_CREATE_AND_DESTROY + +/datum/unit_test/dcs_check_list_arguments/Run() + for(var/element_type in SSdcs.arguments_that_are_lists_by_element) + // Keeps tracks of the lists that shouldn't be compared with again. + var/list/to_ignore = list() + var/list/superlist = SSdcs.arguments_that_are_lists_by_element[element_type] + for(var/list/current as anything in superlist) + to_ignore[current] = TRUE + var/list/bad_lists + for(var/list/compare as anything in superlist) + if(to_ignore[compare]) + continue + if(deep_compare_list(current, compare)) + if(!bad_lists) + bad_lists = list(list(current)) + bad_lists += list(compare) + to_ignore[compare] = TRUE + if(bad_lists) + //Include the original, unsorted list in the report. It should be easier to find by the contributor. + var/list/unsorted_list = superlist[current] + TEST_FAIL("found [length(bad_lists)] identical lists used as argument for element [element_type]. List: [json_encode(unsorted_list)].\n\ + Make sure it's a cached list, or use one of the string_list proc. Also, use the ELEMENT_DONT_SORT_LIST_ARGS flag if the key position of your lists matters.") diff --git a/code/modules/unit_tests/dismemberment.dm b/code/modules/unit_tests/dismemberment.dm new file mode 100644 index 0000000000000..d8ce43b960eda --- /dev/null +++ b/code/modules/unit_tests/dismemberment.dm @@ -0,0 +1,38 @@ +/** + * Unit test to check that held items are dropped correctly when we are dismembered. + * + * Also tests for edge cases such as undroppable items. + */ +/datum/unit_test/dismemberment/Run() + var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) + + var/obj/item/testing_item = allocate(/obj/item/analyzer) + testing_item.name = "testing item" + + // Standard situation: We're holding a normal item and get dismembered. + test_item(dummy, testing_item) + + // Abnormal situation: We're holding an undroppable item and get dismembered. + ADD_TRAIT(testing_item, TRAIT_NODROP, TRAIT_GENERIC) + test_item(dummy, testing_item, status_text = "after applying TRAIT_NODROP to the testing item") + + +/datum/unit_test/dismemberment/proc/test_item(mob/living/carbon/human/dummy, obj/item/testing_item, status_text = "") + //Check both to make sure being the active hand doesn't make a difference. + dummy.put_in_l_hand(testing_item) + check_dismember(dummy, BODY_ZONE_L_ARM, status_text) + + dummy.put_in_r_hand(testing_item) + check_dismember(dummy, BODY_ZONE_R_ARM, status_text) + + +/datum/unit_test/dismemberment/proc/check_dismember(mob/living/carbon/human/dummy, which_arm, status_text) + var/obj/item/bodypart/dismembered_limb = dummy.get_bodypart(which_arm) + var/obj/item/held_item = dummy.get_item_for_held_index(dismembered_limb.held_index) + + dismembered_limb.dismember() + TEST_ASSERT(held_item in dummy.loc, "Dummy did not drop [held_item] when [dismembered_limb] was dismembered [status_text].") + // Clean up after ourselves + qdel(dismembered_limb) + dummy.fully_heal(HEAL_ALL) + diff --git a/code/modules/unit_tests/emoting.dm b/code/modules/unit_tests/emoting.dm index e1cb9ba8bd2da..2b24d33e9e653 100644 --- a/code/modules/unit_tests/emoting.dm +++ b/code/modules/unit_tests/emoting.dm @@ -3,6 +3,7 @@ /datum/unit_test/emoting/Run() var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human/consistent) + human.key = "EmoteTestKey" RegisterSignal(human, COMSIG_MOB_EMOTE, PROC_REF(on_emote_used)) human.say("*shrug") @@ -21,6 +22,8 @@ human.say("*deathgasp") TEST_ASSERT_EQUAL(emotes_used, 2, "Human could not deathgasp while unconscious") + human.key = null + /datum/unit_test/emoting/proc/on_emote_used() SIGNAL_HANDLER emotes_used += 1 diff --git a/code/modules/unit_tests/ensure_subtree_operational_datum.dm b/code/modules/unit_tests/ensure_subtree_operational_datum.dm new file mode 100644 index 0000000000000..9ca78fbc67467 --- /dev/null +++ b/code/modules/unit_tests/ensure_subtree_operational_datum.dm @@ -0,0 +1,64 @@ +/// The subtree that requires the operational datum. +#define REQUIRED_SUBTREE "required_subtree" +/// The list of typepaths of applicable operational datums that would satisfy the requirement. +#define REQUIRED_OPERATIONAL_DATUMS "required_operational_datums" + +/// Unit Test that ensure that if we add a specific planning subtree to a basic mob's planning tree, that we also have the operational datum needed for it (component/element). +/// This can be extended to other "mandatory" operational datums for certain subtrees to work. +/datum/unit_test/ensure_subtree_operational_datum + /// Associated list of mobs that we need to test this on. Key is the typepath of the mob, value is a list of the planning subtree and the operational datums that are required for it. + var/list/testable_mobs = list() + +/datum/unit_test/ensure_subtree_operational_datum/Run() + gather_testable_mobs() + test_applicable_mobs() + +/// First, look for all mobs that have a planning subtree that requires an element, then add it to the list for stuff to test afterwards. Done like this to not have one mumbo proc that's hard to read. +/datum/unit_test/ensure_subtree_operational_datum/proc/gather_testable_mobs() + for(var/mob/living/basic/checkable_mob as anything in subtypesof(/mob/living/basic)) + var/datum/ai_controller/testable_controller = initial(checkable_mob.ai_controller) + if(isnull(testable_controller)) + continue + + // we can't do inital() memes on lists so it's allocation time + testable_controller = allocate(testable_controller) + var/list/ai_planning_subtrees = testable_controller.planning_subtrees // list of instantiated datums. easy money + if(!length(ai_planning_subtrees)) + continue + + for(var/datum/ai_planning_subtree/testable_subtree as anything in ai_planning_subtrees) + var/list/necessary_datums = testable_subtree.operational_datums + if(isnull(necessary_datums)) + continue + + testable_mobs[checkable_mob] = list( + REQUIRED_OPERATIONAL_DATUMS = necessary_datums, + REQUIRED_SUBTREE = testable_subtree.type, + ) + +/// Then, test the mobs that we've found +/datum/unit_test/ensure_subtree_operational_datum/proc/test_applicable_mobs() + for(var/mob/living/basic/checkable_mob as anything in testable_mobs) + var/list/checkable_mob_data = testable_mobs[checkable_mob] + checkable_mob = allocate(checkable_mob) + + var/datum/ai_planning_subtree/test_subtree = checkable_mob_data[REQUIRED_SUBTREE] + var/list/trait_sources = GET_TRAIT_SOURCES(checkable_mob, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM) + if(!length(trait_sources)) // yes yes we could use `COUNT_TRAIT_SOURCES` but why invoke the same macro twice + TEST_FAIL("The mob [checkable_mob] ([checkable_mob.type]) does not have ANY instances of TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, but has a planning subtree ([test_subtree]) that requires it!") + continue + + var/has_element = FALSE + var/list/testable_operational_datums = checkable_mob_data[REQUIRED_OPERATIONAL_DATUMS] + for(var/iterable in trait_sources) + if(iterable in testable_operational_datums) + has_element = TRUE + break + + if(!has_element) + var/list/message_list = list("The mob [checkable_mob] ([checkable_mob.type]) has a planning subtree ([test_subtree]) that requires a component/element, but does not have any!") + message_list += "Needs one of the following to satisfy the requirement: ([testable_operational_datums.Join(", ")])" + TEST_FAIL(message_list.Join(" ")) + +#undef REQUIRED_SUBTREE +#undef REQUIRED_OPERATIONAL_DATUMS diff --git a/code/modules/unit_tests/fish_unit_tests.dm b/code/modules/unit_tests/fish_unit_tests.dm new file mode 100644 index 0000000000000..d0d39227f43b7 --- /dev/null +++ b/code/modules/unit_tests/fish_unit_tests.dm @@ -0,0 +1,214 @@ +#define TRAIT_FISH_TESTING "made_you_read_this" + +///Checks that things associated with fish size and weight work correctly. +/datum/unit_test/fish_size_weight + +/datum/unit_test/fish_size_weight/Run() + var/obj/item/fish/fish = allocate(/obj/item/fish/testdummy) + TEST_ASSERT_EQUAL(fish.grind_results[/datum/reagent], 20, "the test fish has [fish.grind_results[/datum/reagent]] units of reagent when it should have 20") + TEST_ASSERT_EQUAL(fish.w_class, WEIGHT_CLASS_BULKY, "the test fish has w_class of [fish.w_class] when it should have been [WEIGHT_CLASS_BULKY]") + var/expected_num_fillets = round(FISH_SIZE_BULKY_MAX / FISH_FILLET_NUMBER_SIZE_DIVISOR * 2, 1) + TEST_ASSERT_EQUAL(fish.num_fillets, expected_num_fillets, "the test fish has [fish.num_fillets] number of fillets when it should have [expected_num_fillets]") + +///Checks that fish breeding works correctly. +/datum/unit_test/fish_breeding + +/datum/unit_test/fish_breeding/Run() + var/obj/item/fish/fish = allocate(/obj/item/fish/testdummy) + ///Check if the fishes can generate offsprings at all. + var/obj/item/fish/fish_two = allocate(/obj/item/fish/testdummy/two) + var/obj/item/fish/new_fish = fish.create_offspring(fish_two.type, fish_two) + TEST_ASSERT(new_fish, "the two test fishes couldn't generate an offspring") + var/traits_len = length(new_fish.fish_traits) + TEST_ASSERT_NOTEQUAL(traits_len, 2, "the offspring of the test fishes has both parents' traits, which are incompatible with each other") + TEST_ASSERT_NOTEQUAL(traits_len, 0, "the offspring has neither of the parents' traits") + TEST_ASSERT(HAS_TRAIT(new_fish, TRAIT_FISH_TESTING), "The offspring doesn't have the relative datum trait associated with its fish trait") + + ///Check that crossbreeder, no-mating and self-reproductive fish traits work correctly. + var/obj/structure/aquarium/traits/aquarium = allocate(/obj/structure/aquarium/traits) + TEST_ASSERT(!aquarium.sterile.try_to_reproduce(), "The test aquarium's sterile fish managed to reproduce when it shouldn't have") + var/obj/item/fish/crossbreeder_jr = aquarium.crossbreeder.try_to_reproduce() + TEST_ASSERT(crossbreeder_jr, "The test aquarium's crossbreeder fish didn't manage to reproduce when it should have") + TEST_ASSERT_EQUAL(crossbreeder_jr.type, aquarium.cloner.type, "The test aquarium's crossbreeder fish mated with the wrong type of fish") + var/obj/item/fish/cloner_jr = aquarium.cloner.try_to_reproduce() + TEST_ASSERT(cloner_jr, "The test aquarium's cloner fish didn't manage to reproduce when it should have") + TEST_ASSERT_NOTEQUAL(cloner_jr.type, aquarium.sterile.type, "The test aquarium's cloner fish mated with the sterile fish") + +///Checks that fish evolutions work correctly. +/datum/unit_test/fish_evolution + +/datum/unit_test/fish_evolution/Run() + var/obj/structure/aquarium/evolution/aquarium = allocate(/obj/structure/aquarium/evolution) + var/obj/item/fish/evolve_jr = aquarium.evolve.try_to_reproduce() + TEST_ASSERT(evolve_jr, "The test aquarium's evolution fish didn't manage to reproduce when it should have") + TEST_ASSERT_NOTEQUAL(evolve_jr.type, /obj/item/fish/goldfish, "The test aquarium's evolution fish managed to pass the conditions of an impossible evolution") + TEST_ASSERT_EQUAL(evolve_jr.type, /obj/item/fish/clownfish, "The test aquarium's evolution fish's offspring isn't of the expected type") + TEST_ASSERT(!(/datum/fish_trait/dummy in evolve_jr.fish_traits), "The test aquarium's evolution fish's offspring still has the old trait that ought to be removed by the evolution datum") + TEST_ASSERT(/datum/fish_trait/dummy/two in evolve_jr.fish_traits, "The test aquarium's evolution fish's offspring doesn't have the evolution trait") + +/datum/unit_test/fish_scanning + +/datum/unit_test/fish_scanning/Run() + var/scannable_fishes = 0 + for(var/obj/item/fish/fish_prototype as anything in subtypesof(/obj/item/fish)) + if(initial(fish_prototype.experisci_scannable)) + scannable_fishes++ + for(var/datum/experiment/scanning/fish/fish_scan as anything in typesof(/datum/experiment/scanning/fish)) + fish_scan = new fish_scan + var/scan_key = fish_scan.required_atoms[1] + if(fish_scan.required_atoms[scan_key] > scannable_fishes) + TEST_FAIL("[fish_scan.type] has requirements higher than the number of scannable fish types in the game: [scannable_fishes]") + +///dummy fish item used for the tests, as well with related subtypes and datums. +/obj/item/fish/testdummy + grind_results = list() + average_weight = FISH_GRIND_RESULTS_WEIGHT_DIVISOR * 2 + average_size = FISH_SIZE_BULKY_MAX + num_fillets = 2 + fish_traits = list(/datum/fish_trait/dummy) + stable_population = INFINITY + breeding_timeout = 0 + +/obj/item/fish/testdummy/two + fish_traits = list(/datum/fish_trait/dummy/two) + +/datum/fish_trait/dummy + incompatible_traits = list(/datum/fish_trait/dummy/two) + inheritability = 100 + diff_traits_inheritability = 100 + +/datum/fish_trait/dummy/apply_to_fish(obj/item/fish/fish) + ADD_TRAIT(fish, TRAIT_FISH_TESTING, FISH_TRAIT_DATUM) + fish.grind_results[/datum/reagent] = 10 + +/datum/fish_trait/dummy/two + incompatible_traits = list(/datum/fish_trait/dummy) + +/obj/structure/aquarium/traits + allow_breeding = TRUE + var/obj/item/fish/testdummy/crossbreeder/crossbreeder + var/obj/item/fish/testdummy/cloner/cloner + var/obj/item/fish/testdummy/sterile/sterile + +/obj/structure/aquarium/traits/Initialize(mapload) + . = ..() + crossbreeder = new(src) + cloner = new(src) + sterile = new(src) + +/obj/item/fish/testdummy/crossbreeder + fish_traits = list(/datum/fish_trait/crossbreeder) + +/obj/item/fish/testdummy/cloner + fish_traits = list(/datum/fish_trait/parthenogenesis) + +/obj/item/fish/testdummy/sterile + fish_traits = list(/datum/fish_trait/no_mating) + +/obj/structure/aquarium/evolution + allow_breeding = TRUE + var/obj/item/fish/testdummy/evolve/evolve + var/obj/item/fish/testdummy/evolve_two/evolve_two + +/obj/structure/aquarium/evolution/Initialize(mapload) + . = ..() + evolve = new(src) + evolve_two = new(src) + +/obj/item/fish/testdummy/evolve + compatible_types = list(/obj/item/fish/testdummy/evolve_two) + evolution_types = list(/datum/fish_evolution/dummy) + +/obj/item/fish/testdummy/evolve_two + compatible_types = list(/obj/item/fish/testdummy/evolve) + evolution_types = list(/datum/fish_evolution/dummy/two) + +/datum/fish_evolution/dummy + probability = 200 //Guaranteed chance even if halved. + new_fish_type = /obj/item/fish/clownfish + new_traits = list(/datum/fish_trait/dummy/two) + removed_traits = list(/datum/fish_trait/dummy) + +/datum/fish_evolution/dummy/two + new_fish_type = /obj/item/fish/goldfish + +/datum/fish_evolution/dummy/two/New() + . = ..() + probability = 0 //works around the global list initialization skipping abstract/impossible evolutions. + +// we want no default spawns in this unit test +/datum/chasm_detritus/restricted/bodies/no_defaults + default_contents_chance = 0 + +/// Checks that we are able to fish people out of chasms with priority and that they end up in the right location +/datum/unit_test/fish_rescue_hook + priority = TEST_LONGER + var/original_turf_type + var/original_turf_baseturfs + var/list/mobs_spawned + +/datum/unit_test/fish_rescue_hook/Run() + // create our human dummies to be dropped into the chasm + var/mob/living/carbon/human/consistent/get_in_the_hole = allocate(/mob/living/carbon/human/consistent) + var/mob/living/basic/mining/lobstrosity/you_too = allocate(/mob/living/basic/mining/lobstrosity) + var/mob/living/carbon/human/consistent/mindless = allocate(/mob/living/carbon/human/consistent) + var/mob/living/carbon/human/consistent/no_brain = allocate(/mob/living/carbon/human/consistent) + var/mob/living/carbon/human/consistent/empty = allocate(/mob/living/carbon/human/consistent) + var/mob/living/carbon/human/consistent/dummy = allocate(/mob/living/carbon/human/consistent) + + mobs_spawned = list( + get_in_the_hole, + you_too, + mindless, + no_brain, + empty, + dummy, + ) + + // create our chasm and remember the previous turf so we can change it back once we're done + original_turf_type = run_loc_floor_bottom_left.type + original_turf_baseturfs = islist(run_loc_floor_bottom_left.baseturfs) ? run_loc_floor_bottom_left.baseturfs.Copy() : run_loc_floor_bottom_left.baseturfs + run_loc_floor_bottom_left.ChangeTurf(/turf/open/chasm) + var/turf/open/chasm/the_hole = run_loc_floor_bottom_left + + // into the hole they go + for(var/mob/mob_spawned in mobs_spawned) + the_hole.drop(mob_spawned) + sleep(0.2 SECONDS) // we have to WAIT because the drop() proc sleeps. + + // our 'fisherman' where we expect the item to be moved to after fishing it up + var/mob/living/carbon/human/consistent/a_fisherman = allocate(/mob/living/carbon/human/consistent, run_loc_floor_top_right) + + // pretend like this mob has a mind. they should be fished up first + no_brain.mind_initialize() + + SEND_SIGNAL(the_hole, COMSIG_PRE_FISHING) // we need to do this for the fishing spot component to be attached + var/datum/component/fishing_spot/the_hole_fishing_spot = the_hole.GetComponent(/datum/component/fishing_spot) + var/datum/fish_source/fishing_source = the_hole_fishing_spot.fish_source + var/obj/item/fishing_hook/rescue/the_hook = allocate(/obj/item/fishing_hook/rescue, run_loc_floor_top_right) + the_hook.chasm_detritus_type = /datum/chasm_detritus/restricted/bodies/no_defaults + + // try to fish up our minded victim + var/atom/movable/reward = fishing_source.dispense_reward(the_hook.chasm_detritus_type, a_fisherman, the_hole) + + // mobs with minds (aka players) should have precedence over any other mobs that are in the chasm + TEST_ASSERT_EQUAL(reward, no_brain, "Fished up [reward] ([REF(reward)]) with a rescue hook; expected to fish up [no_brain]([REF(no_brain)])") + // it should end up on the same turf as the fisherman + TEST_ASSERT_EQUAL(get_turf(reward), get_turf(a_fisherman), "[reward] was fished up with the rescue hook and ended up at [get_turf(reward)]; expected to be at [get_turf(a_fisherman)]") + + // let's further test that by giving a second mob a mind. they should be fished up immediately.. + empty.mind_initialize() + + reward = fishing_source.dispense_reward(the_hook.chasm_detritus_type, a_fisherman, the_hole) + + TEST_ASSERT_EQUAL(reward, empty, "Fished up [reward]([REF(reward)]) with a rescue hook; expected to fish up [empty]([REF(empty)])") + TEST_ASSERT_EQUAL(get_turf(reward), get_turf(a_fisherman), "[reward] was fished up with the rescue hook and ended up at [get_turf(reward)]; expected to be at [get_turf(a_fisherman)]") + +// clean up so we don't mess up subsequent tests +/datum/unit_test/fish_rescue_hook/Destroy() + QDEL_LIST(mobs_spawned) + run_loc_floor_bottom_left.ChangeTurf(original_turf_type, original_turf_baseturfs) + return ..() + +#undef TRAIT_FISH_TESTING + diff --git a/code/modules/unit_tests/focus_only_tests.dm b/code/modules/unit_tests/focus_only_tests.dm index 18b2cfbdcd5b7..927be7d8bc091 100644 --- a/code/modules/unit_tests/focus_only_tests.dm +++ b/code/modules/unit_tests/focus_only_tests.dm @@ -35,3 +35,12 @@ /// Checks for bad icon / icon state setups in cooking crafting menu /datum/unit_test/focus_only/bad_cooking_crafting_icons + +/// Ensures openspace never spawns on the bottom of a z stack +/datum/unit_test/focus_only/openspace_clear + +/// Checks to ensure that variables expected to exist in a job datum (for config reasons) actually exist +/datum/unit_test/focus_only/missing_job_datum_variables + +/// Checks that the contents of the fish_counts list are also present in fish_table +/datum/unit_test/focus_only/fish_sources_tables diff --git a/code/modules/unit_tests/font_awesome_icons.dm b/code/modules/unit_tests/font_awesome_icons.dm index 4dde17b7c364c..9ebba76579173 100644 --- a/code/modules/unit_tests/font_awesome_icons.dm +++ b/code/modules/unit_tests/font_awesome_icons.dm @@ -85,7 +85,7 @@ for(var/icon in allowed_icons) var/icon_name = replacetext(icon, "fa-", "") - output += "#define FA_ICON_[uppertext(replacetext(icon_name, "-", "_"))] \"[icon]\"" + output += "#define FA_ICON_[uppertext(replacetext(icon_name, "-", "_"))] \"[icon]\"" // #undef FA_ICON_ // we have this here to avoid define_sanity throwing a fit var/output_file = "[output.Join("\n")]\n" rustg_file_write(output_file, "data/font_awesome_icons.dm") diff --git a/code/modules/unit_tests/greyscale_config.dm b/code/modules/unit_tests/greyscale_config.dm index 9c5106be5b0c5..d3d9ce9d4fdd4 100644 --- a/code/modules/unit_tests/greyscale_config.dm +++ b/code/modules/unit_tests/greyscale_config.dm @@ -38,4 +38,4 @@ continue var/number_of_colors = length(colors) - 1 if(config.expected_colors != number_of_colors) - TEST_FAIL("[thing] has the wrong amount of colors configured for [config.DebugName()]. Expected [config.expected_colors] but only found [number_of_colors].") + TEST_FAIL("[thing] has the wrong amount of colors configured for [config.DebugName()]. Expected [config.expected_colors] colors but found [number_of_colors].") diff --git a/code/modules/unit_tests/heretic_knowledge.dm b/code/modules/unit_tests/heretic_knowledge.dm index 46545ef2ed500..f75fff24cee0f 100644 --- a/code/modules/unit_tests/heretic_knowledge.dm +++ b/code/modules/unit_tests/heretic_knowledge.dm @@ -24,12 +24,12 @@ while(i < length(list_to_check)) var/datum/heretic_knowledge/path_to_create = list_to_check[++i] if(!ispath(path_to_create)) - TEST_FAIL("Heretic Knowlege: Got a non-heretic knowledge datum (Got: [path_to_create]) in the list knowledges!") + TEST_FAIL("Heretic Knowledge: Got a non-heretic knowledge datum (Got: [path_to_create]) in the list knowledges!") var/datum/heretic_knowledge/instantiated_knowledge = new path_to_create() // Next knowledge is a list of typepaths. for(var/datum/heretic_knowledge/next_knowledge as anything in instantiated_knowledge.next_knowledge) if(!ispath(next_knowledge)) - TEST_FAIL("Heretic Knowlege: [next_knowledge.type] has a [isnull(next_knowledge) ? "null":"invalid path"] in its next_knowledge list!") + TEST_FAIL("Heretic Knowledge: [next_knowledge.type] has a [isnull(next_knowledge) ? "null":"invalid path"] in its next_knowledge list!") continue if(next_knowledge in list_to_check) continue @@ -44,7 +44,7 @@ // Unreachables is a list of typepaths - all paths that cannot be obtained. var/list/unreachables = all_possible_knowledge - list_to_check for(var/datum/heretic_knowledge/lost_knowledge as anything in unreachables) - TEST_FAIL("Heretic Knowlege: [lost_knowledge] is unreachable by players! Add it to another knowledge's 'next_knowledge' list. If it is purposeful, set its route to 'null'.") + TEST_FAIL("Heretic Knowledge: [lost_knowledge] is unreachable by players! Add it to another knowledge's 'next_knowledge' list. If it is purposeful, set its route to 'null'.") /* diff --git a/code/modules/unit_tests/heretic_rituals.dm b/code/modules/unit_tests/heretic_rituals.dm index 7298a16327490..4ac5bce8d3d3a 100644 --- a/code/modules/unit_tests/heretic_rituals.dm +++ b/code/modules/unit_tests/heretic_rituals.dm @@ -63,6 +63,8 @@ var/list/created_atoms = list() for(var/ritual_item_path in knowledge.required_atoms) var/amount_to_create = knowledge.required_atoms[ritual_item_path] + if(islist(ritual_item_path)) + ritual_item_path = pick(ritual_item_path) for(var/i in 1 to amount_to_create) created_atoms += new ritual_item_path(get_turf(our_heretic)) diff --git a/code/modules/unit_tests/high_five.dm b/code/modules/unit_tests/high_five.dm new file mode 100644 index 0000000000000..16b7e3f9545d8 --- /dev/null +++ b/code/modules/unit_tests/high_five.dm @@ -0,0 +1,58 @@ +// Test a high five through and through, with multiple people nearby +/datum/unit_test/high_five + +/datum/unit_test/high_five/Run() + var/mob/living/carbon/human/offer_guy = allocate(/mob/living/carbon/human/consistent) + var/mob/living/carbon/human/take_guy = allocate(/mob/living/carbon/human/consistent) + var/mob/living/carbon/human/random_bystander = allocate(/mob/living/carbon/human/consistent) // this guy's just here for another valid taker + + offer_guy.emote("slap") + offer_guy.give() + + TEST_ASSERT_NOTNULL(offer_guy.has_status_effect(/datum/status_effect/offering/no_item_received/high_five), \ + "Offerer doesn't have the high five offer status effect after offering (giving) to takers nearby") + + var/atom/movable/screen/alert/give/highfive/alert_to_click = locate() in flatten_list(take_guy.alerts) + var/atom/movable/screen/alert/give/highfive/bystander_alert_we_dont_click = locate() in flatten_list(random_bystander.alerts) + TEST_ASSERT_NOTNULL(alert_to_click, "Taker had no alert to click to accept the high five offer") + TEST_ASSERT_NOTNULL(bystander_alert_we_dont_click, "Bystander had no alert from the high fiver offer") + + alert_to_click.handle_transfer() // high five happens here with the taker only. Can't call click but this is close + + TEST_ASSERT_NULL(offer_guy.has_status_effect(/datum/status_effect/offering/no_item_received/high_five), \ + "Offerer still has the high five offer status effect after a high five was completed") + TEST_ASSERT(QDELETED(bystander_alert_we_dont_click), \ + "Bystander still has the alert from the high fiver offer after the high five was completed") + +// Test a too slow setup +/datum/unit_test/high_five_too_slow + +/datum/unit_test/high_five_too_slow/Run() + var/mob/living/carbon/human/offer_guy = allocate(/mob/living/carbon/human/consistent) + var/mob/living/carbon/human/take_guy = allocate(/mob/living/carbon/human/consistent) + pass(take_guy) // This guy just needs to stand around + + // Just testing a too slow setup - so long as the setup works, we're good. + offer_guy.emote("slap") + offer_guy.give() + offer_guy.dropItemToGround(offer_guy.get_active_held_item()) + TEST_ASSERT_NOTNULL(offer_guy.has_status_effect(/datum/status_effect/offering/no_item_received/high_five), \ + "Offerer lost the high five offer status effect from dropping the slapper, even though this is valid, as it is used to too-slow") + +/// Tests someone offering a high five correctly stops offering when all takers walks away +/datum/unit_test/high_five_walk_away + +/datum/unit_test/high_five_walk_away/Run() + var/mob/living/carbon/human/offer_guy = allocate(/mob/living/carbon/human/consistent) + var/mob/living/carbon/human/take_guy_A = allocate(/mob/living/carbon/human/consistent) + var/mob/living/carbon/human/take_guy_B = allocate(/mob/living/carbon/human/consistent) + + offer_guy.emote("slap") + offer_guy.give() + take_guy_A.forceMove(run_loc_floor_top_right) + TEST_ASSERT_NOTNULL(offer_guy.has_status_effect(/datum/status_effect/offering/no_item_received/high_five), \ + "Offerer lost the high fiver offer status effect from taker A moving away, which is invalid because taker B is still nearby") + + take_guy_B.forceMove(run_loc_floor_top_right) + TEST_ASSERT_NULL(offer_guy.has_status_effect(/datum/status_effect/offering/no_item_received/high_five), \ + "Offerer still has the high fiver offer status effect from taker B moving away, which is invalid because there are no takers are nearby") diff --git a/code/modules/unit_tests/hydroponics_harvest.dm b/code/modules/unit_tests/hydroponics_harvest.dm index 1e6d39a73291d..8ff72c40b06bd 100644 --- a/code/modules/unit_tests/hydroponics_harvest.dm +++ b/code/modules/unit_tests/hydroponics_harvest.dm @@ -28,11 +28,18 @@ var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human/consistent) hydroponics_tray.forceMove(run_loc_floor_bottom_left) - human.forceMove(locate((run_loc_floor_bottom_left.x + 1), run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z)) + + var/nearby_loc = locate((run_loc_floor_bottom_left.x + 1), run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z) + human.forceMove(nearby_loc) + + var/seeds_loc = locate((run_loc_floor_bottom_left.x + 1), (run_loc_floor_bottom_left.y + 1), run_loc_floor_bottom_left.z) + planted_food_seed.forceMove(seeds_loc) + planted_not_food_seed.forceMove(seeds_loc) + planted_densified_seed.forceMove(seeds_loc) // Apples should harvest 10 apples with 10u nutrients and 4u vitamins. test_seed(hydroponics_tray, planted_food_seed, human) - // Sunflowers should harvest 10 sunflowers with 4u nutriment and 0u vitamins. It should also have 8u corn oil. + // Sunflowers should harvest 10 sunflowers with 4u nutriment and 0u vitamins. It should also have 8u oil. test_seed(hydroponics_tray, planted_not_food_seed, human) // Redbeets should harvest 5 beets (10 / 2) with 10u nutriments (5 x 2) and 10u vitamins (5 x 2) thanks to densified chemicals. test_seed(hydroponics_tray, planted_densified_seed, human) diff --git a/code/modules/unit_tests/language_transfer.dm b/code/modules/unit_tests/language_transfer.dm new file mode 100644 index 0000000000000..66e437a8f6a45 --- /dev/null +++ b/code/modules/unit_tests/language_transfer.dm @@ -0,0 +1,191 @@ +// Dedicated to testing language holders + +/// Simply tests that swapping to a new species gives you the languages of that species and removes the languages of the old species +/datum/unit_test/language_species_swap_simple + +/datum/unit_test/language_species_swap_simple/Run() + var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) + + var/datum/language_holder/holder = dummy.get_language_holder() + + var/list/initial_spoken = holder.spoken_languages.Copy() + var/list/initial_understood = holder.understood_languages.Copy() + + TEST_ASSERT(length(initial_spoken) == 1, \ + "Dummy should only speak one language! Instead, it knew the following: [print_language_list(initial_spoken)]") + TEST_ASSERT(length(initial_understood) == 1, \ + "Dummy should only understand one language! Instead, it knew the following: [print_language_list(initial_understood)]") + + dummy.set_species(/datum/species/lizard) + + TEST_ASSERT(length(holder.spoken_languages) == 2, \ + "Dummy should speak two languages - Common and Draconic! Instead, it knew the following: [print_language_list(holder.spoken_languages)]") + + TEST_ASSERT(length(holder.understood_languages) == 2, \ + "Dummy should understand two languages - Common and Draconic! Instead, it knew the following: [print_language_list(holder.understood_languages)]") + + dummy.set_species(/datum/species/human) + + TEST_ASSERT(length(initial_spoken & holder.spoken_languages) == 1, \ + "Dummy did not speak Common after returning to human! Instead, it knew the following: [print_language_list(holder.spoken_languages)]") + + TEST_ASSERT(length(initial_understood & holder.understood_languages) == 1, \ + "Dummy did not understand Common after returning to human! Instead, it knew the following: [print_language_list(holder.understood_languages)]") + +/// Tests species changes which are more complex are functional (e.g. from a species which speaks common to one which does not) +/datum/unit_test/language_species_swap_complex + +/datum/unit_test/language_species_swap_complex/Run() + var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) + + var/datum/language_holder/holder = dummy.get_language_holder() + + dummy.set_species(/datum/species/lizard/silverscale) + + TEST_ASSERT(!dummy.has_language(/datum/language/common, SPOKEN_LANGUAGE), \ + "Changing a mob's species from one which speaks common to one which does not should remove the language!") + + TEST_ASSERT(dummy.has_language(/datum/language/common, UNDERSTOOD_LANGUAGE), \ + "Changing a mob's species from one which understands common another which does should not remove the language!") + + TEST_ASSERT(length(holder.spoken_languages) == 2, \ + "Dummy should speak two languages - Uncommon and Draconic! Instead, it knew the following: [print_language_list(holder.spoken_languages)]") + + TEST_ASSERT(length(holder.understood_languages) == 3, \ + "Dummy should understand three languages - Common, Uncommon and Draconic! Instead, it knew the following: [print_language_list(holder.understood_languages)]") + +/// Test that other random languages known are not lost on species change +/datum/unit_test/language_species_change_other_known + +/datum/unit_test/language_species_change_other_known/Run() + var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) + dummy.grant_language(/datum/language/piratespeak, source = LANGUAGE_MIND) + dummy.grant_language(/datum/language/draconic, source = LANGUAGE_ATOM) + dummy.set_species(/datum/species/lizard) + + TEST_ASSERT(dummy.has_language(/datum/language/piratespeak, SPOKEN_LANGUAGE), \ + "Dummy should still speak Pirate after changing species, as it's a mind language!") + + TEST_ASSERT(dummy.has_language(/datum/language/piratespeak, UNDERSTOOD_LANGUAGE), \ + "Dummy should still understand Pirate after changing species, as it's a mind language!") + + dummy.set_species(/datum/species/human) + + TEST_ASSERT(dummy.has_language(/datum/language/draconic, SPOKEN_LANGUAGE), \ + "Dummy should still speak Draconic after changing species, as it's an atom language!") + + TEST_ASSERT(dummy.has_language(/datum/language/draconic, UNDERSTOOD_LANGUAGE), \ + "Dummy should still understand Draconic after changing species, as it's an atom language!") + +/// Tests that mind bound languages are not lost swapping into a new mob, but other languages are +/datum/unit_test/language_mind_transfer + +/datum/unit_test/language_mind_transfer/Run() + var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) + var/mob/living/basic/pet/dog/corgi/transfer_target = allocate(/mob/living/basic/pet/dog/corgi) + dummy.mind_initialize() + dummy.grant_language(/datum/language/piratespeak, source = LANGUAGE_MIND) + dummy.grant_language(/datum/language/draconic, source = LANGUAGE_ATOM) + dummy.set_species(/datum/species/lizard/silverscale) + + dummy.mind.transfer_to(transfer_target) + + // transfer_target should speak and understand pirate + TEST_ASSERT(!dummy.has_language(/datum/language/piratespeak, SPOKEN_LANGUAGE), \ + "Dummy should no longer be speaking Pirate after losing their mind!") + TEST_ASSERT(transfer_target.has_language(/datum/language/piratespeak, SPOKEN_LANGUAGE), \ + "Dummy's new mob should be capable of speaking Pirate!") + + TEST_ASSERT(!dummy.has_language(/datum/language/piratespeak, UNDERSTOOD_LANGUAGE), \ + "Dummy should no longer be understanding Pirate after losing their mind!") + TEST_ASSERT(transfer_target.has_language(/datum/language/piratespeak, UNDERSTOOD_LANGUAGE), \ + "Dummy's new mob should be capable of understanding Pirate!") + + // transfer_target should NOT speak and understand draconic + TEST_ASSERT(dummy.has_language(/datum/language/draconic, SPOKEN_LANGUAGE), \ + "Dummy should still understand Draconic after losing their mind - it's an atom language!") + TEST_ASSERT(!transfer_target.has_language(/datum/language/draconic, SPOKEN_LANGUAGE), \ + "Dummy's new mob should not understand Draconic - it's an atom language!") + + TEST_ASSERT(dummy.has_language(/datum/language/draconic, UNDERSTOOD_LANGUAGE), \ + "Dummy should still understand Draconic after losing their mind - it's an atom language!") + TEST_ASSERT(!transfer_target.has_language(/datum/language/draconic, UNDERSTOOD_LANGUAGE), \ + "Dummy's new mob should not understand Draconic - it's an atom language!") + + // transfer_target should NOT speak and understand uncommon + TEST_ASSERT(dummy.has_language(/datum/language/uncommon, SPOKEN_LANGUAGE), \ + "Dummy should still understand Uncommon after losing their mind - it's a species language!") + TEST_ASSERT(!transfer_target.has_language(/datum/language/uncommon, SPOKEN_LANGUAGE), \ + "Dummy's new mob should not understand Uncommon - it's a species language!") + + TEST_ASSERT(dummy.has_language(/datum/language/uncommon, UNDERSTOOD_LANGUAGE), \ + "Dummy should still understand Uncommon after losing their mind - it's a species language!") + TEST_ASSERT(!transfer_target.has_language(/datum/language/uncommon, UNDERSTOOD_LANGUAGE), \ + "Dummy's new mob should not understand Uncommon - it's a species language!") + +/// Tests that mind bound languages are not lost when swapping with another person (wiz mindswap) +/datum/unit_test/language_mind_swap + +/datum/unit_test/language_mind_swap/Run() + var/mob/living/carbon/human/dummy_A = allocate(/mob/living/carbon/human/consistent) + var/mob/living/carbon/human/dummy_B = allocate(/mob/living/carbon/human/consistent) + + dummy_A.mind_initialize() + dummy_B.mind_initialize() + + var/datum/mind/dummy_A_mind = dummy_A.mind + var/datum/mind/dummy_B_mind = dummy_B.mind + + dummy_A.set_species(/datum/species/lizard) + dummy_B.grant_language(/datum/language/piratespeak, source = LANGUAGE_MIND) + + dummy_A_mind.transfer_to(dummy_B) + dummy_B_mind.transfer_to(dummy_A) + + var/datum/language_holder/holder_A = dummy_A.get_language_holder() + var/datum/language_holder/holder_B = dummy_B.get_language_holder() + + // Holder A is a lizard: starts with 2 languages (common, draconic) + // Holder B is a human with a mind language: starts with 2 language (common, pirate) + // Swap occurs + // Holder A is a lizard with 2 languages, but should now also have pirate: 3 languages (common, draconic, pirate) + // Holder B is a human with just 1 language left over (common) + + TEST_ASSERT_EQUAL(length(holder_A.spoken_languages), 3, \ + "Holder A / Dummy A / Dummy B mind should speak Common, Draconic, and Pirate! \ + Instead, it knew the following: [print_language_list(holder_A.spoken_languages)]") + + TEST_ASSERT_EQUAL(length(holder_A.understood_languages), 3, \ + "Holder A / Dummy A / Dummy B mind should only understand Common, Draconic, and Pirate! \ + Instead, it knew the following: [print_language_list(holder_A.understood_languages)]") + + TEST_ASSERT_EQUAL(length(holder_B.spoken_languages), 1, \ + "Holder B / Dummy B / Dummy A mind should only speak 1 language - Common! \ + Instead, it knew the following: [print_language_list(holder_B.spoken_languages)]") + + TEST_ASSERT_EQUAL(length(holder_B.understood_languages), 1, \ + "Holder B / Dummy B / Dummy A mind only understand 1 language - Common! \ + Instead, it knew the following: [print_language_list(holder_B.understood_languages)]") + +/// Tests that the book of babel, and by extension grant_all_languages, works as intended +/datum/unit_test/book_of_babel + +/datum/unit_test/book_of_babel/Run() + var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) + var/obj/item/book_of_babel/book = allocate(/obj/item/book_of_babel) + var/datum/language_holder/holder = dummy.get_language_holder() + var/expected_amount = length(GLOB.all_languages) + + book.attack_self(dummy) + TEST_ASSERT_EQUAL(length(holder.spoken_languages), expected_amount, "Book of Babel failed to give all languages out!") + dummy.set_species(/datum/species/lizard) + TEST_ASSERT_EQUAL(length(holder.spoken_languages), expected_amount, "Changing species after using the Book of Bable should not remove languages!") + +/// Helper proc to print a list of languages in a human readable format +/proc/print_language_list(list/languages_to_print) + var/list/printed_languages = list() + + for(var/datum/language/language as anything in languages_to_print) + printed_languages += initial(language.name) + + return english_list(printed_languages) diff --git a/code/modules/unit_tests/leash.dm b/code/modules/unit_tests/leash.dm new file mode 100644 index 0000000000000..a3d919be12f1b --- /dev/null +++ b/code/modules/unit_tests/leash.dm @@ -0,0 +1,103 @@ +/datum/unit_test/leash + abstract_type = /datum/unit_test/leash + priority = TEST_LONGER + + var/atom/movable/owner + var/atom/movable/pet + + var/max_distance = 3 + + var/forcibly_teleported = FALSE + var/datum/leash_wait/leash_wait + +/datum/unit_test/leash/New() + . = ..() + + owner = allocate(/obj/item/pen) + pet = allocate(/obj/item/pen) + + pet.AddComponent(/datum/component/leash, owner, max_distance) + + RegisterSignal(pet, COMSIG_LEASH_FORCE_TELEPORT, PROC_REF(on_leash_force_teleport)) + RegisterSignal(pet, COMSIG_LEASH_PATH_STARTED, PROC_REF(on_leash_path_started)) + RegisterSignal(pet, COMSIG_LEASH_PATH_COMPLETE, PROC_REF(on_leash_path_complete)) + +/datum/unit_test/leash/Destroy() + QDEL_NULL(owner) + QDEL_NULL(pet) + + return ..() + +/datum/unit_test/leash/proc/on_leash_force_teleport() + SIGNAL_HANDLER + forcibly_teleported = TRUE + +/datum/unit_test/leash/proc/on_leash_path_complete() + SIGNAL_HANDLER + leash_wait?.completed() + +/datum/unit_test/leash/proc/on_leash_path_started() + SIGNAL_HANDLER + leash_wait?.started() + +/datum/unit_test/leash/proc/move_away(atom/movable/mover, distance) + RETURN_TYPE(/datum/leash_wait) + leash_wait = new + + for (var/_ in 1 to distance) + mover.Move(get_step(mover, EAST)) + + return leash_wait + +/datum/leash_wait + var/completed = FALSE + var/started = FALSE + + var/timed_out = FALSE + +/datum/leash_wait/New() + addtimer(VARSET_CALLBACK(src, timed_out, TRUE), 80 SECONDS) + +/datum/leash_wait/proc/completed() + completed = TRUE + +/datum/leash_wait/proc/started() + started = TRUE + +/datum/leash_wait/proc/assert_unmoved() + ASSERT(!started, "Leash started to move when it should not have") + +/datum/leash_wait/proc/wait() + ASSERT(started, "Leash doesn't plan on moving") + + UNTIL(completed || timed_out) + ASSERT(!timed_out, "Waiting for leash movement timed out, it didn't want to move") + +/// Validates the leash component will keep its parent within range without teleporting +/// when possible. +/datum/unit_test/leash/no_teleport + +/datum/unit_test/leash/no_teleport/Run() + move_away(owner, 1).assert_unmoved() + TEST_ASSERT_EQUAL(get_dist(owner, pet), 1, "Pet should not have moved") + + move_away(owner, max_distance).wait() // max_distance + 1 = we move closer, but don't teleport + TEST_ASSERT_EQUAL(get_dist(owner, pet), max_distance, "Pet should have stayed directly outside range of owner") + + TEST_ASSERT(!forcibly_teleported, "Pet should not have been forcibly teleported") + +/// Validates that the leash component will forcibly teleport when necessary +/datum/unit_test/leash/will_teleport + +/datum/unit_test/leash/will_teleport/Run() + leash_wait = new + owner.forceMove(locate(1, 1, 1)) + leash_wait.wait() + TEST_ASSERT(forcibly_teleported, "Pet should have been forcibly teleported, since they are too far away with no valid path") + +/// Validates that the leashed object cannot move outside of the max distance from owner +/datum/unit_test/leash/limit_range + +/datum/unit_test/leash/limit_range/Run() + move_away(pet, max_distance + 1) + TEST_ASSERT_EQUAL(get_dist(owner, pet), max_distance, "Pet should not have moved farther than max_distance") diff --git a/code/modules/unit_tests/lesserform.dm b/code/modules/unit_tests/lesserform.dm index a719b11dc5237..ef56e71bbaaf6 100644 --- a/code/modules/unit_tests/lesserform.dm +++ b/code/modules/unit_tests/lesserform.dm @@ -3,6 +3,7 @@ /datum/unit_test/lesserform/Run() var/mob/living/carbon/human/changeling = allocate(/mob/living/carbon/human/consistent) + var/name = changeling.name changeling.mind_initialize() var/datum/mind/mind = changeling.mind var/datum/antagonist/changeling/changeling_datum = mind.add_antag_datum(/datum/antagonist/changeling) @@ -13,11 +14,13 @@ transform_ability.Trigger() TEST_ASSERT(ismonkey(changeling), "Changeling failed to turn into a monkey after voluntarily transforming using lesser form.") + TEST_ASSERT_NOTEQUAL(name, changeling.name, "Monkeyisation failed to anonymise changeling's name.") changeling.humanize(instant = TRUE) transform_ability.Trigger() TEST_ASSERT(ismonkey(changeling), "Changeling failed to turn into a monkey after involuntarily being made into a human.") transform_ability.Trigger() TEST_ASSERT(!ismonkey(changeling), "Changeling failed to stop being a monkey after voluntarily transforming using lesser form.") + TEST_ASSERT_EQUAL(name, changeling.name, "Returning from monkey form failed to restore original name.") changeling.monkeyize(instant = TRUE) transform_ability.Trigger() TEST_ASSERT(!ismonkey(changeling), "Changeling failed to stop being a monkey after being involuntarily turned into one.") diff --git a/code/modules/unit_tests/ling_decap.dm b/code/modules/unit_tests/ling_decap.dm new file mode 100644 index 0000000000000..0c964f9a0432c --- /dev/null +++ b/code/modules/unit_tests/ling_decap.dm @@ -0,0 +1,45 @@ +/// Test lings don't die when decapitated. +/datum/unit_test/ling_decap + +/datum/unit_test/ling_decap/Run() + var/mob/living/carbon/human/ling = allocate(/mob/living/carbon/human/consistent) + ling.mind_initialize() + ling.mind.add_antag_datum(/datum/antagonist/changeling) + + var/obj/item/bodypart/head/noggin = ling.get_bodypart(BODY_ZONE_HEAD) + noggin.dismember() + TEST_ASSERT_NULL(ling.get_bodypart(BODY_ZONE_HEAD), "Changeling failed to be decapitated.") + TEST_ASSERT_NULL(noggin.brainmob.mind, "Changeling's mind was moved to their head after decapitation, but it should have remained in their body.") + + var/obj/item/organ/internal/brain/oldbrain = noggin.brain + noggin.drop_organs() + TEST_ASSERT_NULL(noggin.brain, "Changeling's head failed to drop its brain.") + TEST_ASSERT_NULL(oldbrain.brainmob.mind, "Changeling's mind was moved to their brain after decapitation and organ dropping, but it should have remained in their body.") + + TEST_ASSERT_EQUAL(ling.stat, CONSCIOUS, "Changeling was not conscious after losing their head.") + + // Cleanup + qdel(noggin) + for(var/obj/item/organ/leftover in ling.loc) + qdel(leftover) + +/// Tests people get decapitated properly. +/datum/unit_test/normal_decap + +/datum/unit_test/normal_decap/Run() + var/mob/living/carbon/human/normal_guy = allocate(/mob/living/carbon/human/consistent) + normal_guy.mind_initialize() + var/my_guys_mind = normal_guy.mind + + var/obj/item/bodypart/head/noggin = normal_guy.get_bodypart(BODY_ZONE_HEAD) + noggin.dismember() + TEST_ASSERT_EQUAL(noggin.brainmob.mind, my_guys_mind, "Dummy's mind was not moved to their head after decapitation.") + + var/obj/item/organ/internal/brain/oldbrain = noggin.brain + noggin.drop_organs() + TEST_ASSERT_EQUAL(oldbrain.brainmob.mind, my_guys_mind, "Dummy's mind was not moved to their brain after being removed from their head.") + + // Cleanup + qdel(noggin) + for(var/obj/item/organ/leftover in normal_guy.loc) + qdel(leftover) diff --git a/code/modules/unit_tests/liver.dm b/code/modules/unit_tests/liver.dm new file mode 100644 index 0000000000000..80c3ecf35b9a2 --- /dev/null +++ b/code/modules/unit_tests/liver.dm @@ -0,0 +1,116 @@ +#define DAMAGE_AMOUNT 20 +#define SECONDS_PER_TICK SSmobs.wait / 10 + +/datum/unit_test/liver + abstract_type = /datum/unit_test/liver + +/datum/unit_test/liver/skeleton/Run() + // Pause natural mob life so it can be handled entirely by the test + SSmobs.pause() + + var/mob/living/carbon/human/species/skeleton/mrbones = allocate(/mob/living/carbon/human/species/skeleton) + var/datum/reagent/toxin/bonehurtingjuice/bonehurting = /datum/reagent/toxin/bonehurtingjuice + var/datum/reagent/consumable/milk/calcium = /datum/reagent/consumable/milk + + TEST_ASSERT(!isnull(mrbones.get_organ_by_type(/obj/item/organ/internal/liver/bone)), "Skeleton does not have a bone liver") + TEST_ASSERT_EQUAL(mrbones.has_reagent(/datum/reagent/toxin/bonehurtingjuice), FALSE, "Skeleton somehow has bone hurting juice before drinking") + TEST_ASSERT_EQUAL(mrbones.has_reagent(/datum/reagent/consumable/milk), FALSE, "Skeleton somehow has milk before drinking") + + // Test bone hurting juice reactions + + mrbones.reagents.add_reagent(bonehurting, 40) + mrbones.Life(SSMOBS_DT) + var/expected_stamina_damage = (7.5 * REM * SECONDS_PER_TICK) + var/expected_brute_damage = (0.5 * REM * SECONDS_PER_TICK) + + TEST_ASSERT_EQUAL(mrbones.getStaminaLoss(), expected_stamina_damage, + "Skeleton took [mrbones.getStaminaLoss() > expected_stamina_damage ? "more" : "less"] stamina damage than expected") + TEST_ASSERT_EQUAL(mrbones.getBruteLoss(), expected_brute_damage, + "Skeleton took [mrbones.getBruteLoss() > expected_brute_damage ? "more" : "less"] brute damage than expected") + + mrbones.reagents.remove_all(mrbones.reagents.total_volume) + mrbones.fully_heal() + TEST_ASSERT_EQUAL(mrbones.getStaminaLoss(), 0, "Skeleton did not fully heal stamina damage") + TEST_ASSERT_EQUAL(mrbones.getBruteLoss(), 0, "Skeleton did not fully heal brute damage") + + // Test milk reactions + + mrbones.reagents.add_reagent(calcium, 51) + mrbones.Life(SSMOBS_DT) + TEST_ASSERT(mrbones.reagents.total_volume < 50, "Excess (>50u) milk did not leak out of skeleton") + mrbones.reagents.remove_all(mrbones.reagents.total_volume) + + mrbones.apply_damage(DAMAGE_AMOUNT, def_zone = BODY_ZONE_CHEST) + var/list/obj/item/bodypart/damaged_parts = mrbones.get_damaged_bodyparts(brute = TRUE) + TEST_ASSERT(!isnull(damaged_parts), "Skeleton did not take any damage") + TEST_ASSERT(length(damaged_parts) == 1, "Skeleton took damage to more than one body part") + + mrbones.reagents.add_reagent(calcium, 50) + mrbones.Life(SSMOBS_DT) + var/expected_remaining_damage = DAMAGE_AMOUNT - (2.5 * REM * SECONDS_PER_TICK) + // Milk also heals brute on its own, so we may be more healed than expected + TEST_ASSERT(damaged_parts[1].brute_dam <= expected_remaining_damage, + "Milk did not heal the expected amount of damage (expected at least [expected_remaining_damage], got [damaged_parts[1].brute_dam])") + +/datum/unit_test/liver/skeleton/Destroy() + SSmobs.ignite() + return ..() + +// Plasmamen +/datum/unit_test/liver/plasmaman/Run() + // Pause natural mob life so it can be handled entirely by the test + SSmobs.pause() + + var/mob/living/carbon/human/species/plasma/mrbones = allocate(/mob/living/carbon/human/species/plasma) + var/datum/reagent/toxin/plasma/plasma = /datum/reagent/toxin/plasma + var/datum/reagent/toxin/hot_ice/hot_ice = /datum/reagent/toxin/hot_ice + + // Testing plasma/hot ice healing on wounds + + TEST_ASSERT(!isnull(mrbones.get_organ_by_type(/obj/item/organ/internal/liver/bone/plasmaman)), "Plasmaman does not have a plasmaman bone liver") + TEST_ASSERT_EQUAL(mrbones.has_reagent(plasma), FALSE, "Plasmaman somehow has plasma before drinking") + TEST_ASSERT_EQUAL(mrbones.has_reagent(hot_ice), FALSE, "Plasmaman somehow has hot ice before drinking") + + var/obj/item/bodypart/r_arm = mrbones.get_bodypart(BODY_ZONE_R_ARM) + var/obj/item/bodypart/l_arm = mrbones.get_bodypart(BODY_ZONE_L_ARM) + var/expected_wound_healing = 4 * REM * SECONDS_PER_TICK + + // Test plasma + + r_arm.receive_damage(WOUND_MINIMUM_DAMAGE, 0, wound_bonus = 100, sharpness = NONE) + TEST_ASSERT(length(mrbones.all_wounds), "Plasmaman did not receive a wound on their right arm") + + mrbones.reagents.add_reagent(plasma, 50) + mrbones.Life(SSMOBS_DT) + var/datum/wound/afflicted_wound = mrbones.all_wounds[1] + TEST_ASSERT_EQUAL(afflicted_wound.cryo_progress, expected_wound_healing, "Plasma did not reduce wound on plasmaman") + + mrbones.reagents.remove_all(mrbones.reagents.total_volume) + mrbones.fully_heal() + TEST_ASSERT(!length(r_arm.wounds), "Plasmaman did not fully heal wounds") + + // Test hot ice + + l_arm.receive_damage(WOUND_MINIMUM_DAMAGE, 0, wound_bonus = 100, sharpness = NONE) + TEST_ASSERT(length(mrbones.all_wounds), "Plasmaman did not receive a wound on their left arm") + + afflicted_wound = mrbones.all_wounds[1] + mrbones.reagents.add_reagent(hot_ice, 50) + mrbones.Life(SSMOBS_DT) + TEST_ASSERT_EQUAL(afflicted_wound.cryo_progress, expected_wound_healing, "Hot ice did not reduce wound on plasmaman") + + // Test gunpowder giving plasmamen hallucinations + + var/datum/reagent/gunpowder/gunpowder = /datum/reagent/gunpowder + + mrbones.reagents.add_reagent(gunpowder, 50) + mrbones.Life(SSMOBS_DT) + TEST_ASSERT(mrbones.has_status_effect(/datum/status_effect/drugginess), "Plasmaman did not get druggy status after consuming gunpowder") + TEST_ASSERT(mrbones.has_status_effect(/datum/status_effect/hallucination), "Plasmaman did not get hallucinating status after consuming gunpowder") + +/datum/unit_test/liver/plasmaman/Destroy() + SSmobs.ignite() + return ..() + +#undef DAMAGE_AMOUNT +#undef SECONDS_PER_TICK diff --git a/code/modules/unit_tests/medical_wounds.dm b/code/modules/unit_tests/medical_wounds.dm index 56c7a43104f17..161492a726a92 100644 --- a/code/modules/unit_tests/medical_wounds.dm +++ b/code/modules/unit_tests/medical_wounds.dm @@ -12,17 +12,18 @@ var/i = 1 var/list/iter_test_wound_list - for(iter_test_wound_list in list(list(/datum/wound/blunt/moderate, /datum/wound/blunt/severe, /datum/wound/blunt/critical),\ - list(/datum/wound/slash/moderate, /datum/wound/slash/severe, /datum/wound/slash/critical),\ - list(/datum/wound/pierce/moderate, /datum/wound/pierce/severe, /datum/wound/pierce/critical),\ - list(/datum/wound/burn/moderate, /datum/wound/burn/severe, /datum/wound/burn/critical))) + for(iter_test_wound_list in list(list(/datum/wound/blunt/bone/moderate, /datum/wound/blunt/bone/severe, /datum/wound/blunt/bone/critical),\ + list(/datum/wound/slash/flesh/moderate, /datum/wound/slash/flesh/severe, /datum/wound/slash/flesh/critical),\ + list(/datum/wound/pierce/bleed/moderate, /datum/wound/pierce/bleed/severe, /datum/wound/pierce/bleed/critical),\ + list(/datum/wound/burn/flesh/moderate, /datum/wound/burn/flesh/severe, /datum/wound/burn/flesh/critical))) TEST_ASSERT_EQUAL(length(victim.all_wounds), 0, "Patient is somehow wounded before test") var/datum/wound/iter_test_wound + var/datum/wound_pregen_data/iter_pregen_data = GLOB.all_wound_pregen_data[iter_test_wound] var/threshold_penalty = 0 for(iter_test_wound in iter_test_wound_list) - var/threshold = initial(iter_test_wound.threshold_minimum) - threshold_penalty // just enough to guarantee the next tier of wound, given the existing wound threshold penalty + var/threshold = iter_pregen_data.threshold_minimum - threshold_penalty // just enough to guarantee the next tier of wound, given the existing wound threshold penalty if(dam_types[i] == BRUTE) tested_part.receive_damage(WOUND_MINIMUM_DAMAGE, 0, wound_bonus = threshold, sharpness=sharps[i]) else if(dam_types[i] == BURN) @@ -52,30 +53,33 @@ var/list/iter_test_wound_list tested_part.biological_state &= ~BIO_FLESH // take away the base limb's flesh (ouchie!) ((not actually ouchie, this just affects their wounds and dismemberment handling)) - for(iter_test_wound_list in list(list(/datum/wound/blunt/moderate, /datum/wound/blunt/severe, /datum/wound/blunt/critical),\ - list(/datum/wound/slash/moderate, /datum/wound/slash/severe, /datum/wound/slash/critical),\ - list(/datum/wound/pierce/moderate, /datum/wound/pierce/severe, /datum/wound/pierce/critical),\ - list(/datum/wound/burn/moderate, /datum/wound/burn/severe, /datum/wound/burn/critical))) + for(iter_test_wound_list in list(list(/datum/wound/blunt/bone/moderate, /datum/wound/blunt/bone/severe, /datum/wound/blunt/bone/critical),\ + list(/datum/wound/slash/flesh/moderate, /datum/wound/slash/flesh/severe, /datum/wound/slash/flesh/critical),\ + list(/datum/wound/pierce/bleed/moderate, /datum/wound/pierce/bleed/severe, /datum/wound/pierce/bleed/critical),\ + list(/datum/wound/burn/flesh/moderate, /datum/wound/burn/flesh/severe, /datum/wound/burn/flesh/critical))) TEST_ASSERT_EQUAL(length(victim.all_wounds), 0, "Patient is somehow wounded before test") var/datum/wound/iter_test_wound + var/datum/wound_pregen_data/iter_pregen_data = GLOB.all_wound_pregen_data[iter_test_wound] var/threshold_penalty = 0 for(iter_test_wound in iter_test_wound_list) - var/threshold = initial(iter_test_wound.threshold_minimum) - threshold_penalty // just enough to guarantee the next tier of wound, given the existing wound threshold penalty + var/threshold = iter_pregen_data.threshold_minimum - threshold_penalty // just enough to guarantee the next tier of wound, given the existing wound threshold penalty if(dam_types[i] == BRUTE) tested_part.receive_damage(WOUND_MINIMUM_DAMAGE, 0, wound_bonus = threshold, sharpness=sharps[i]) else if(dam_types[i] == BURN) tested_part.receive_damage(0, WOUND_MINIMUM_DAMAGE, wound_bonus = threshold, sharpness=sharps[i]) // so if we just tried to deal a flesh wound, make sure we didn't actually suffer it. We may have suffered a bone wound instead, but we just want to make sure we don't have a flesh wound - if(initial(iter_test_wound.wound_flags) & FLESH_WOUND) + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[iter_test_wound] + if (pregen_data.required_limb_biostate & BIO_FLESH) if(!length(victim.all_wounds)) // not having a wound is good news continue else // we have to check that it's actually a bone wound and not the intended wound type TEST_ASSERT_EQUAL(length(victim.all_wounds), 1, "Patient has more than one wound when only one is expected. Severity: [initial(iter_test_wound.severity)]") var/datum/wound/actual_wound = victim.all_wounds[1] - TEST_ASSERT((actual_wound.wound_flags & ~FLESH_WOUND), "Limb has flesh wound despite no BIO_FLESH biological_state, expected either no wound or bone wound. Offending wound: [actual_wound]") + var/datum/wound_pregen_data/actual_pregen_data = GLOB.all_wound_pregen_data[actual_wound.type] + TEST_ASSERT((actual_pregen_data.required_limb_biostate & ~BIO_FLESH), "Limb has flesh wound despite no BIO_FLESH biological_state, expected either no wound or bone wound. Offending wound: [actual_wound]") threshold_penalty = actual_wound.threshold_penalty else // otherwise if it's a bone wound, check that we have it per usual TEST_ASSERT(length(victim.all_wounds), "Patient has no wounds when one wound is expected. Severity: [initial(iter_test_wound.severity)]") diff --git a/code/modules/unit_tests/mob_chains.dm b/code/modules/unit_tests/mob_chains.dm new file mode 100644 index 0000000000000..2562019958e46 --- /dev/null +++ b/code/modules/unit_tests/mob_chains.dm @@ -0,0 +1,31 @@ +/// Checks if mobs who are linked together with the mob chain component react as expected +/datum/unit_test/mob_chains + +/datum/unit_test/mob_chains/Run() + var/mob/living/centipede_head = allocate(/mob/living/basic/pet/dog) + var/list/segments = list(centipede_head) + centipede_head.AddComponent(/datum/component/mob_chain) + var/mob/living/centipede_tail = centipede_head + for (var/i in 1 to 2) + var/mob/living/new_segment = allocate(/mob/living/basic/pet/dog) + new_segment.AddComponent(/datum/component/mob_chain, front = centipede_tail) + segments += new_segment + centipede_tail = new_segment + + var/test_damage = 15 + centipede_head.apply_damage(test_damage, BRUTE) + TEST_ASSERT_EQUAL(centipede_head.bruteloss, 0, "Centipede head took damage which should have been passed to its tail.") + TEST_ASSERT_EQUAL(centipede_tail.bruteloss, test_damage, "Centipede tail did not take damage which should have originated from its head.") + + var/expected_damage = 5 + for (var/mob/living/segment as anything in segments) + segment.combat_mode = TRUE + segment.melee_damage_lower = expected_damage + segment.melee_damage_upper = expected_damage + + var/mob/living/victim = allocate(/mob/living/basic/pet/dog) + centipede_head.ClickOn(victim) + TEST_ASSERT_EQUAL(victim.bruteloss, expected_damage * 3, "Centipede failed to do damage with all of its segments.") + + centipede_head.death() + TEST_ASSERT_EQUAL(centipede_tail.stat, DEAD, "Centipede tail failed to die with head.") diff --git a/code/modules/unit_tests/mob_damage.dm b/code/modules/unit_tests/mob_damage.dm new file mode 100644 index 0000000000000..50046141a88b7 --- /dev/null +++ b/code/modules/unit_tests/mob_damage.dm @@ -0,0 +1,622 @@ +/// Tests to make sure mob damage procs are working correctly +/datum/unit_test/mob_damage + priority = TEST_LONGER + +/datum/unit_test/mob_damage/Destroy() + SSmobs.ignite() + return ..() + +/datum/unit_test/mob_damage/Run() + SSmobs.pause() + var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) + dummy.maxHealth = 200 // tank mode + + /* The sanity tests: here we make sure that: + 1) That damage procs are returning the expected values. They should be returning the actual amount of damage taken/healed. + (Negative values mean damage was taken, positive mean healing) + 2) Verifying that the damage has been accurately applied to the mob afterwards. */ + + test_sanity_simple(dummy) + test_sanity_complex(dummy) + + // Testing if biotypes are working as intended + test_biotypes(dummy) + + // Testing whether or not TRAIT_NOBREATH is working as intended + test_nobreath(dummy) + + // Testing whether or not TRAIT_TOXINLOVER and TRAIT_TOXIMMUNE are working as intended + test_toxintraits(dummy) + + // Testing whether or not TRAIT_NOCLONELOSS is working as intended + test_nocloneloss(dummy) + + // Testing the proc ordered_healing() + test_ordered_healing(dummy) + + // testing with godmode enabled + test_godmode(dummy) + +/** + * Test whether the adjust damage procs return the correct values and that the mob's health is the expected value afterwards. + * + * By default this calls apply_damage(amount) followed by verify_damage(amount_after) and returns TRUE if both succeeded. + * amount_after defaults to the mob's current stamina loss but can be overridden as needed. + * + * Arguments: + * * testing_mob - the mob to apply the damage to + * * amount - the amount of damage to apply to the mob + * * expected - what the expected return value of the damage proc is + * * amount_after - in case you want to specify what the damage amount on the mob should be afterwards + * * included_types - Bitflag of damage types to apply + * * biotypes - the biotypes of damage to apply + * * bodytypes - the bodytypes of damage to apply + * * forced - whether or not this is forced damage + */ +/datum/unit_test/mob_damage/proc/test_apply_damage(mob/living/testing_mob, amount, expected = -amount, amount_after, included_types, biotypes, bodytypes, forced) + if(isnull(amount_after)) + amount_after = testing_mob.getStaminaLoss() - expected // stamina loss applies to both carbon and basic mobs the same way, so that's why we're using it here + if(!apply_damage(testing_mob, amount, expected, included_types, biotypes, bodytypes, forced)) + return FALSE + if(!verify_damage(testing_mob, amount_after, included_types)) + return FALSE + return TRUE + +/** + * Test whether the set damage procs return the correct values and that the mob's health is the expected value afterwards. + * + * By default this calls set_damage(amount) followed by verify_damage(amount_after) and returns TRUE if both succeeded. + * amount_after defaults to the mob's current stamina loss but can be overridden as needed. + * + * Arguments: + * * testing_mob - the mob to apply the damage to + * * amount - the amount of damage to apply to the mob + * * expected - what the expected return value of the damage proc is + * * amount_after - in case you want to specify what the damage amount on the mob should be afterwards + * * included_types - Bitflag of damage types to apply + * * biotypes - the biotypes of damage to apply + * * bodytypes - the bodytypes of damage to apply + * * forced - whether or not this is forced damage + */ +/datum/unit_test/mob_damage/proc/test_set_damage(mob/living/testing_mob, amount, expected, amount_after, included_types, biotypes, bodytypes, forced) + if(isnull(amount_after)) + amount_after = testing_mob.getStaminaLoss() - expected + if(!set_damage(testing_mob, amount, expected, included_types, biotypes, bodytypes, forced)) + return FALSE + if(!verify_damage(testing_mob, amount_after, included_types)) + return FALSE + return TRUE + +/** + * Check that the mob has a specific amount of damage + * + * By default this checks that the mob has of every type of damage. + * Arguments: + * * testing_mob - the mob to check the damage of + * * amount - the amount of damage to verify that the mob has + * * included_types - Bitflag of damage types to check. + */ +/datum/unit_test/mob_damage/proc/verify_damage(mob/living/testing_mob, amount, included_types = ALL) + if(included_types & TOXLOSS) + TEST_ASSERT_EQUAL(testing_mob.getToxLoss(), amount, \ + "[testing_mob] should have [amount] toxin damage, instead they have [testing_mob.getToxLoss()]!") + if(included_types & CLONELOSS) + TEST_ASSERT_EQUAL(testing_mob.getCloneLoss(), amount, \ + "[testing_mob] should have [amount] clone damage, instead they have [testing_mob.getCloneLoss()]!") + if(included_types & BRUTELOSS) + TEST_ASSERT_EQUAL(round(testing_mob.getBruteLoss(), 1), amount, \ + "[testing_mob] should have [amount] brute damage, instead they have [testing_mob.getBruteLoss()]!") + if(included_types & FIRELOSS) + TEST_ASSERT_EQUAL(round(testing_mob.getFireLoss(), 1), amount, \ + "[testing_mob] should have [amount] burn damage, instead they have [testing_mob.getFireLoss()]!") + if(included_types & OXYLOSS) + TEST_ASSERT_EQUAL(testing_mob.getOxyLoss(), amount, \ + "[testing_mob] should have [amount] oxy damage, instead they have [testing_mob.getOxyLoss()]!") + if(included_types & STAMINALOSS) + TEST_ASSERT_EQUAL(testing_mob.getStaminaLoss(), amount, \ + "[testing_mob] should have [amount] stamina damage, instead they have [testing_mob.getStaminaLoss()]!") + return TRUE + +/** + * Apply a specific amount of damage to the mob using adjustBruteLoss(), adjustToxLoss(), etc. + * + * By default this applies damage of every type to the mob, and checks that the damage procs return the value + * Arguments: + * * testing_mob - the mob to apply the damage to + * * amount - the amount of damage to apply to the mob + * * expected - what the expected return value of the damage proc is + * * included_types - Bitflag of damage types to apply + * * biotypes - the biotypes of damage to apply + * * bodytypes - the bodytypes of damage to apply + * * forced - whether or not this is forced damage + */ +/datum/unit_test/mob_damage/proc/apply_damage(mob/living/testing_mob, amount, expected = -amount, included_types = ALL, biotypes = ALL, bodytypes = ALL, forced = FALSE) + var/damage_returned + if(included_types & TOXLOSS) + damage_returned = testing_mob.adjustToxLoss(amount, updating_health = FALSE, forced = forced, required_biotype = biotypes) + TEST_ASSERT_EQUAL(damage_returned, expected, \ + "adjustToxLoss() should have returned [expected], but returned [damage_returned] instead!") + if(included_types & CLONELOSS) + damage_returned = testing_mob.adjustCloneLoss(amount, updating_health = FALSE, forced = forced, required_biotype = biotypes) + TEST_ASSERT_EQUAL(damage_returned, expected, \ + "adjustCloneLoss() should have returned [expected], but returned [damage_returned] instead!") + if(included_types & BRUTELOSS) + damage_returned = round(testing_mob.adjustBruteLoss(amount, updating_health = FALSE, forced = forced, required_bodytype = bodytypes), 1) + TEST_ASSERT_EQUAL(damage_returned, expected, \ + "adjustBruteLoss() should have returned [expected], but returned [damage_returned] instead!") + if(included_types & FIRELOSS) + damage_returned = round(testing_mob.adjustFireLoss(amount, updating_health = FALSE, forced = forced, required_bodytype = bodytypes), 1) + TEST_ASSERT_EQUAL(damage_returned, expected, \ + "adjustFireLoss() should have returned [expected], but returned [damage_returned] instead!") + if(included_types & OXYLOSS) + damage_returned = testing_mob.adjustOxyLoss(amount, updating_health = FALSE, forced = forced, required_biotype = biotypes) + TEST_ASSERT_EQUAL(damage_returned, expected, \ + "adjustOxyLoss() should have returned [expected], but returned [damage_returned] instead!") + if(included_types & STAMINALOSS) + damage_returned = testing_mob.adjustStaminaLoss(amount, updating_stamina = FALSE, forced = forced, required_biotype = biotypes) + TEST_ASSERT_EQUAL(damage_returned, expected, \ + "adjustStaminaLoss() should have returned [expected], but returned [damage_returned] instead!") + return TRUE + +/** + * Set a specific amount of damage for the mob using setBruteLoss(), setToxLoss(), etc. + * + * By default this sets every type of damage to for the mob, and checks that the damage procs return the value + * Arguments: + * * testing_mob - the mob to apply the damage to + * * amount - the amount of damage to apply to the mob + * * expected - what the expected return value of the damage proc is + * * included_types - Bitflag of damage types to apply + * * biotypes - the biotypes of damage to apply + * * bodytypes - the bodytypes of damage to apply + * * forced - whether or not this is forced damage + */ +/datum/unit_test/mob_damage/proc/set_damage(mob/living/testing_mob, amount, expected = -amount, included_types = ALL, biotypes = ALL, bodytypes = ALL, forced = FALSE) + var/damage_returned + if(included_types & TOXLOSS) + damage_returned = testing_mob.setToxLoss(amount, updating_health = FALSE, forced = forced, required_biotype = biotypes) + TEST_ASSERT_EQUAL(damage_returned, expected, \ + "setToxLoss() should have returned [expected], but returned [damage_returned] instead!") + if(included_types & CLONELOSS) + damage_returned = testing_mob.setCloneLoss(amount, updating_health = FALSE, forced = forced, required_biotype = biotypes) + TEST_ASSERT_EQUAL(damage_returned, expected, \ + "setCloneLoss() should have returned [expected], but returned [damage_returned] instead!") + if(included_types & BRUTELOSS) + damage_returned = round(testing_mob.setBruteLoss(amount, updating_health = FALSE, forced = forced), 1) + TEST_ASSERT_EQUAL(damage_returned, expected, \ + "setBruteLoss() should have returned [expected], but returned [damage_returned] instead!") + if(included_types & FIRELOSS) + damage_returned = round(testing_mob.setFireLoss(amount, updating_health = FALSE, forced = forced), 1) + TEST_ASSERT_EQUAL(damage_returned, expected, \ + "setFireLoss() should have returned [expected], but returned [damage_returned] instead!") + if(included_types & OXYLOSS) + damage_returned = testing_mob.setOxyLoss(amount, updating_health = FALSE, forced = forced, required_biotype = biotypes) + TEST_ASSERT_EQUAL(damage_returned, expected, \ + "setOxyLoss() should have returned [expected], but returned [damage_returned] instead!") + if(included_types & STAMINALOSS) + damage_returned = testing_mob.setStaminaLoss(amount, updating_stamina = FALSE, forced = forced, required_biotype = biotypes) + TEST_ASSERT_EQUAL(damage_returned, expected, \ + "setStaminaLoss() should have returned [expected], but returned [damage_returned] instead!") + return TRUE + +/// Sanity tests damage and healing using adjustToxLoss, adjustBruteLoss, etc +/datum/unit_test/mob_damage/proc/test_sanity_simple(mob/living/carbon/human/consistent/dummy) + // Apply 5 damage and then heal it + if(!test_apply_damage(dummy, amount = 5)) + TEST_FAIL("ABOVE FAILURE: failed test_sanity_simple! damage was not applied correctly") + + if(!test_apply_damage(dummy, amount = -5)) + TEST_FAIL("ABOVE FAILURE: failed test_sanity_simple! healing was not applied correctly") + + // Apply 15 damage and heal 3 + if(!test_apply_damage(dummy, amount = 15)) + TEST_FAIL("ABOVE FAILURE: failed test_sanity_simple! damage was not applied correctly") + + if(!test_apply_damage(dummy, amount = -3)) + TEST_FAIL("ABOVE FAILURE: failed test_sanity_simple! underhealing was not applied correctly") + + // Now overheal by 666. It should heal for 12. + + if(!test_apply_damage(dummy, amount = -666, expected = 12)) + TEST_FAIL("ABOVE FAILURE: failed test_sanity_simple! overhealing was not applied correctly") + + // Now test the damage setter procs + + // set all types of damage to 5 + if(!test_set_damage(dummy, amount = 5, expected = -5)) + TEST_FAIL("ABOVE FAILURE: failed test_sanity_simple! failed to set damage to 5") + // now try healing 5 + if(!test_set_damage(dummy, amount = 0, expected = 5)) + TEST_FAIL("ABOVE FAILURE: failed test_sanity_simple! failed to set damage to 0") + +/// Sanity tests damage and healing using the more complex procs like take_overall_damage(), heal_overall_damage(), etc +/datum/unit_test/mob_damage/proc/test_sanity_complex(mob/living/carbon/human/consistent/dummy) + // Heal up, so that errors from the previous tests we won't cause this one to fail + dummy.fully_heal(HEAL_DAMAGE) + + var/damage_returned + // take 5 brute, 2 burn + damage_returned = round(dummy.take_bodypart_damage(5, 2, updating_health = FALSE), 1) + TEST_ASSERT_EQUAL(damage_returned, -7, \ + "take_bodypart_damage() should have returned -7, but returned [damage_returned] instead!") + + TEST_ASSERT_EQUAL(round(dummy.getBruteLoss(), 1), 5, \ + "Dummy should have 5 brute damage, instead they have [dummy.getBruteLoss()]!") + TEST_ASSERT_EQUAL(round(dummy.getFireLoss(), 1), 2, \ + "Dummy should have 2 burn damage, instead they have [dummy.getFireLoss()]!") + + // heal 4 brute, 1 burn + damage_returned = round(dummy.heal_bodypart_damage(4, 1, updating_health = FALSE), 1) + TEST_ASSERT_EQUAL(damage_returned, 5, \ + "heal_bodypart_damage() should have returned 5, but returned [damage_returned] instead!") + + if(!verify_damage(dummy, 1, included_types = BRUTELOSS|FIRELOSS)) + TEST_FAIL("heal_bodypart_damage did not apply its healing correctly on the mob!") + + // heal 1 brute, 1 burn + damage_returned = round(dummy.heal_overall_damage(1, 1, updating_health = FALSE), 1) + TEST_ASSERT_EQUAL(damage_returned, 2, \ + "heal_overall_damage() should have returned 2, but returned [damage_returned] instead!") + + if(!verify_damage(dummy, 0, included_types = BRUTELOSS|FIRELOSS)) + TEST_FAIL("heal_overall_damage did not apply its healing correctly on the mob!") + + // take 50 brute, 50 burn + damage_returned = round(dummy.take_overall_damage(50, 50, updating_health = FALSE), 1) + TEST_ASSERT_EQUAL(damage_returned, -100, \ + "take_overall_damage() should have returned -100, but returned [damage_returned] instead!") + + if(!verify_damage(dummy, 50, included_types = BRUTELOSS|FIRELOSS)) + TEST_FAIL("take_overall_damage did not apply its damage correctly on the mob!") + + // testing negative damage amount args with the overall damage procs - the sign should be ignored for these procs + + damage_returned = round(dummy.take_bodypart_damage(-5, -5, updating_health = FALSE), 1) + TEST_ASSERT_EQUAL(damage_returned, -10, \ + "take_bodypart_damage() should have returned -10, but returned [damage_returned] instead!") + + damage_returned = round(dummy.heal_bodypart_damage(-5, -5, updating_health = FALSE), 1) + TEST_ASSERT_EQUAL(damage_returned, 10, \ + "heal_bodypart_damage() should have returned 10, but returned [damage_returned] instead!") + + damage_returned = round(dummy.take_overall_damage(-5, -5, updating_health = FALSE), 1) + TEST_ASSERT_EQUAL(damage_returned, -10, \ + "take_overall_damage() should have returned -10, but returned [damage_returned] instead!") + + damage_returned = round(dummy.heal_overall_damage(-5, -5, updating_health = FALSE), 1) + TEST_ASSERT_EQUAL(damage_returned, 10, \ + "heal_overall_damage() should have returned 10, but returned [damage_returned] instead!") + + if(!verify_damage(dummy, 50, included_types = BRUTELOSS|FIRELOSS)) + TEST_FAIL("heal_overall_damage did not apply its healingcorrectly on the mob!") + + // testing overhealing + + damage_returned = round(dummy.heal_overall_damage(75, 99, updating_health = FALSE), 1) + TEST_ASSERT_EQUAL(damage_returned, 100, \ + "heal_overall_damage() should have returned 100, but returned [damage_returned] instead!") + + if(!verify_damage(dummy, 0, included_types = BRUTELOSS|FIRELOSS)) + TEST_FAIL("heal_overall_damage did not apply its healing correctly on the mob!") + +/// Tests damage procs with godmode on +/datum/unit_test/mob_damage/proc/test_godmode(mob/living/carbon/human/consistent/dummy) + // Heal up, so that errors from the previous tests we won't cause this one to fail + dummy.fully_heal(HEAL_DAMAGE) + // flip godmode bit to 1 + dummy.status_flags ^= GODMODE + + // Apply 9 damage and then heal it + if(!test_apply_damage(dummy, amount = 9, expected = 0)) + TEST_FAIL("ABOVE FAILURE: failed test_godmode! mob took damage despite having godmode enabled.") + + if(!test_apply_damage(dummy, amount = -9, expected = 0)) + TEST_FAIL("ABOVE FAILURE: failed test_godmode! mob healed when they should've been at full health.") + + // Apply 11 damage and then heal it, this time with forced enabled. The damage should go through regardless of godmode. + if(!test_apply_damage(dummy, amount = 11, forced = TRUE)) + TEST_FAIL("ABOVE FAILURE: failed test_godmode! godmode did not respect forced = TRUE") + + if(!test_apply_damage(dummy, amount = -11, forced = TRUE)) + TEST_FAIL("ABOVE FAILURE: failed test_godmode! godmode did not respect forced = TRUE") + + // flip godmode bit back to 0 + dummy.status_flags ^= GODMODE + +/// Testing biotypes +/datum/unit_test/mob_damage/proc/test_biotypes(mob/living/carbon/human/consistent/dummy) + // Heal up, so that errors from the previous tests we won't cause this one to fail + dummy.fully_heal(HEAL_DAMAGE) + // Testing biotypes using a plasmaman, who is MOB_MINERAL and MOB_HUMANOID + dummy.set_species(/datum/species/plasmaman) + + // argumentless default: should default to required_biotype = ALL. The damage should be applied in that case. + if(!test_apply_damage(dummy, 1, included_types = TOXLOSS|CLONELOSS|STAMINALOSS)) + TEST_FAIL("ABOVE FAILURE: plasmaman did not take damage with biotypes = ALL") + + // If we specify MOB_ORGANIC, the damage should not get applied because plasmamen lack that biotype. + if(!test_apply_damage(dummy, 1, expected = 0, included_types = TOXLOSS|CLONELOSS|STAMINALOSS, biotypes = MOB_ORGANIC)) + TEST_FAIL("ABOVE FAILURE: plasmaman took damage with biotypes = MOB_ORGANIC") + + // Now if we specify MOB_MINERAL the damage should get applied. + if(!test_apply_damage(dummy, 1, included_types = TOXLOSS|CLONELOSS|STAMINALOSS, biotypes = MOB_MINERAL)) + TEST_FAIL("ABOVE FAILURE: plasmaman did not take damage with biotypes = MOB_MINERAL") + + // Transform back to human + dummy.set_species(/datum/species/human) + + // We have 2 damage presently. + // Try to heal it; let's specify MOB_MINERAL, which should no longer work because we have changed back to a human. + if(!test_apply_damage(dummy, -2, expected = 0, included_types = TOXLOSS|CLONELOSS|STAMINALOSS, biotypes = MOB_MINERAL)) + TEST_FAIL("ABOVE FAILURE: human took damage with biotypes = MOB_MINERAL") + + // Force heal some of the damage. When forced = TRUE the damage/healing gets applied no matter what. + if(!test_apply_damage(dummy, -1, included_types = TOXLOSS|CLONELOSS|STAMINALOSS, biotypes = MOB_MINERAL, forced = TRUE)) + TEST_FAIL("ABOVE FAILURE: human did not get healed when biotypes = MOB_MINERAL and forced = TRUE") + + // Now heal the rest of it with the correct biotype. Make sure that this works. We should have 0 damage afterwards. + if(!test_apply_damage(dummy, -1, included_types = TOXLOSS|CLONELOSS|STAMINALOSS, biotypes = MOB_ORGANIC)) + TEST_FAIL("ABOVE FAILURE: human did not get healed with biotypes = MOB_ORGANIC") + +/// Testing oxyloss with the TRAIT_NOBREATH +/datum/unit_test/mob_damage/proc/test_nobreath(mob/living/carbon/human/consistent/dummy) + // Heal up, so that errors from the previous tests we won't cause this one to fail + dummy.fully_heal(HEAL_DAMAGE) + + // TRAIT_NOBREATH is supposed to prevent oxyloss damage (but not healing). Let's make sure that's the case. + ADD_TRAIT(dummy, TRAIT_NOBREATH, TRAIT_SOURCE_UNIT_TESTS) + // force some oxyloss here + dummy.setOxyLoss(2, updating_health = FALSE, forced = TRUE) + + // Try to take more oxyloss damage with TRAIT_NOBREATH. It should not work. + if(!test_apply_damage(dummy, 2, expected = 0, amount_after = dummy.getOxyLoss(), included_types = OXYLOSS)) + TEST_FAIL("ABOVE FAILURE: failed test_nobreath! mob took oxyloss damage while having TRAIT_NOBREATH") + + // Make sure we are still be able to heal the oxyloss. This should work. + if(!test_apply_damage(dummy, -2, amount_after = dummy.getOxyLoss()-2, included_types = OXYLOSS)) + TEST_FAIL("ABOVE FAILURE: failed test_nobreath! mob could not heal oxyloss damage while having TRAIT_NOBREATH") + + REMOVE_TRAIT(dummy, TRAIT_NOBREATH, TRAIT_SOURCE_UNIT_TESTS) + +/// Testing toxloss with TRAIT_TOXINLOVER and TRAIT_TOXIMMUNE +/datum/unit_test/mob_damage/proc/test_toxintraits(mob/living/carbon/human/consistent/dummy) + // Heal up, so that errors from the previous tests we won't cause this one to fail + dummy.fully_heal(HEAL_DAMAGE) + + // TRAIT_TOXINLOVER is supposed to invert toxin damage and healing. Things that would normally cause toxloss now heal it, and vice versa. + ADD_TRAIT(dummy, TRAIT_TOXINLOVER, TRAIT_SOURCE_UNIT_TESTS) + // force some toxloss here + dummy.setToxLoss(2, updating_health = FALSE, forced = TRUE) + + // Try to take more toxloss damage with TRAIT_TOXINLOVER. It should heal instead. + if(!test_apply_damage(dummy, 2, expected = 2, amount_after = dummy.getToxLoss()-2, included_types = TOXLOSS)) + TEST_FAIL("ABOVE FAILURE: failed test_toxintraits! mob did not heal from toxin damage with TRAIT_TOXINLOVER") + + // If we try to heal the toxloss we should take damage instead + if(!test_apply_damage(dummy, -2, expected = -2, amount_after = dummy.getToxLoss()+2, included_types = TOXLOSS)) + TEST_FAIL("ABOVE FAILURE: failed test_toxintraits! mob did not take damage from toxin healing with TRAIT_TOXINLOVER") + + // TOXIMMUNE trait should prevent the damage you get from being healed by toxins medicines while having TRAIT_TOXINLOVER + ADD_TRAIT(dummy, TRAIT_TOXIMMUNE, TRAIT_SOURCE_UNIT_TESTS) + + // need to force apply some toxin damage since the TOXIMUNNE trait sets toxloss to 0 upon being added + dummy.setToxLoss(2, updating_health = FALSE, forced = TRUE) + + // try to 'heal' again - this time it should just do nothing because we should be immune to any sort of toxin damage - including from inverted healing + if(!test_apply_damage(dummy, -2, expected = 0, amount_after = dummy.getToxLoss(), included_types = TOXLOSS)) + TEST_FAIL("ABOVE FAILURE: failed test_toxintraits! mob should not have taken any damage or healing with TRAIT_TOXINLOVER + TRAIT_TOXIMMUNE") + + // ok, let's try taking 'damage'. The inverted damage should still heal mobs with the TOXIMMUNE trait. + if(!test_apply_damage(dummy, 2, expected = 2, amount_after = dummy.getToxLoss()-2, included_types = TOXLOSS)) + TEST_FAIL("ABOVE FAILURE: failed test_toxintraits! mob did not heal from taking toxin damage with TRAIT_TOXINLOVER + TRAIT_TOXIMMUNE") + + REMOVE_TRAIT(dummy, TRAIT_TOXINLOVER, TRAIT_SOURCE_UNIT_TESTS) + REMOVE_TRAIT(dummy, TRAIT_TOXIMMUNE, TRAIT_SOURCE_UNIT_TESTS) + +/// Testing cloneloss with TRAIT_NOCLONELOSS +/datum/unit_test/mob_damage/proc/test_nocloneloss(mob/living/carbon/human/consistent/dummy) + // Heal up, so that errors from the previous tests we won't cause this one to fail + dummy.fully_heal(HEAL_DAMAGE) + + // TRAIT_TRAIT_NOCLONELOSS is supposed to prevent cloneloss damage and healing. Let's make sure that's the case. + ADD_TRAIT(dummy, TRAIT_NOCLONELOSS, TRAIT_SOURCE_UNIT_TESTS) + // force some cloneloss here + dummy.setCloneLoss(2, updating_health = FALSE, forced = TRUE) + + // Try to take more cloneloss damage with TRAIT_NOCLONELOSS. It should not work. + if(!test_apply_damage(dummy, 2, expected = 0, amount_after = dummy.getCloneLoss(), included_types = CLONELOSS)) + TEST_FAIL("ABOVE FAILURE: failed test_nocloneloss! mob took cloneloss damage with TRAIT_NOCLONELOSS") + + // Healing the cloneloss should not work either, unless we force it + if(!test_apply_damage(dummy, -2, expected = 0, amount_after = dummy.getCloneLoss(), included_types = CLONELOSS)) + TEST_FAIL("ABOVE FAILURE: failed test_nocloneloss! mob healed cloneloss damage with TRAIT_NOCLONELOSS") + // so let's force it + if(!test_apply_damage(dummy, -2, expected = 2, amount_after = dummy.getCloneLoss()-2, included_types = CLONELOSS, forced = TRUE)) + TEST_FAIL("ABOVE FAILURE: failed test_nocloneloss! mob could not heal cloneloss damage with forced = TRUE and TRAIT_NOCLONELOSS") + + REMOVE_TRAIT(dummy, TRAIT_NOCLONELOSS, TRAIT_SOURCE_UNIT_TESTS) + +/// Testing heal_ordered_damage() +/datum/unit_test/mob_damage/proc/test_ordered_healing(mob/living/carbon/human/consistent/dummy) + // Heal up, so that errors from the previous tests we won't cause this one to fail + dummy.fully_heal(HEAL_DAMAGE) + var/damage_returned + + // We apply 20 brute, 20 burn, and 20 toxin damage. 60 damage total + apply_damage(dummy, 20, included_types = TOXLOSS|BRUTELOSS|FIRELOSS) + + // Heal 30 damage of that, starting from brute + damage_returned = round(dummy.heal_ordered_damage(30, list(BRUTE, BURN, TOX)), 1) + TEST_ASSERT_EQUAL(damage_returned, 30, \ + "heal_ordered_damage() should have returned 30, but returned [damage_returned] instead!") + + // Should have 10 burn damage and 20 toxins damage remaining, let's check + TEST_ASSERT_EQUAL(dummy.getBruteLoss(), 0, \ + "[src] should have 0 brute damage, but has [dummy.getBruteLoss()] instead!") + TEST_ASSERT_EQUAL(dummy.getFireLoss(), 10, \ + "[src] should have 10 burn damage, but has [dummy.getFireLoss()] instead!") + TEST_ASSERT_EQUAL(dummy.getToxLoss(), 20, \ + "[src] should have 20 toxin damage, but has [dummy.getToxLoss()] instead!") + + // Now heal the remaining 30, overhealing by 5. + damage_returned = round(dummy.heal_ordered_damage(35, list(BRUTE, BURN, TOX)), 1) + TEST_ASSERT_EQUAL(damage_returned, 30, \ + "heal_ordered_damage() should have returned 30, but returned [damage_returned] instead!") + + // Should have no damage remaining + TEST_ASSERT_EQUAL(dummy.getBruteLoss(), 0, \ + "[src] should have 0 brute damage, but has [dummy.getBruteLoss()] instead!") + TEST_ASSERT_EQUAL(dummy.getFireLoss(), 0, \ + "[src] should have 0 burn damage, but has [dummy.getFireLoss()] instead!") + TEST_ASSERT_EQUAL(dummy.getToxLoss(), 0, \ + "[src] should have 0 toxin damage, but has [dummy.getToxLoss()] instead!") + +/// Tests that mob damage procs are working as intended for basic mobs +/datum/unit_test/mob_damage/basic + +/datum/unit_test/mob_damage/basic/Run() + SSmobs.pause() + var/mob/living/basic/mouse/gray/gusgus = allocate(/mob/living/basic/mouse/gray) + // give gusgus a damage_coeff of 1 for this test + gusgus.damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1) + // tank mouse + gusgus.maxHealth = 200 + + test_sanity_simple(gusgus) + test_sanity_complex(gusgus) + +/** + * Check that the mob has a specific amount of damage. Note: basic mobs have all incoming damage types besides stam converted into brute damage. + * + * By default this checks that the mob has of every type of damage. + * Arguments: + * * testing_mob - the mob to check the damage of + * * amount - the amount of damage to verify that the mob has + * * expected - the expected return value of the damage procs, if it differs from the default of (amount * 5) + * * included_types - Bitflag of damage types to check. + */ +/datum/unit_test/mob_damage/basic/verify_damage(mob/living/testing_mob, amount, expected, included_types = ALL) + if(included_types & TOXLOSS) + TEST_ASSERT_EQUAL(testing_mob.getToxLoss(), 0, \ + "[testing_mob] should have [0] toxin damage, instead they have [testing_mob.getToxLoss()]!") + if(included_types & CLONELOSS) + TEST_ASSERT_EQUAL(testing_mob.getCloneLoss(), 0, \ + "[testing_mob] should have [0] clone damage, instead they have [testing_mob.getCloneLoss()]!") + if(included_types & BRUTELOSS) + TEST_ASSERT_EQUAL(round(testing_mob.getBruteLoss(), 1), expected || amount * 5, \ + "[testing_mob] should have [expected || amount * 5] brute damage, instead they have [testing_mob.getBruteLoss()]!") + if(included_types & FIRELOSS) + TEST_ASSERT_EQUAL(round(testing_mob.getFireLoss(), 1), 0, \ + "[testing_mob] should have [0] burn damage, instead they have [testing_mob.getFireLoss()]!") + if(included_types & OXYLOSS) + TEST_ASSERT_EQUAL(testing_mob.getOxyLoss(), 0, \ + "[testing_mob] should have [0] oxy damage, instead they have [testing_mob.getOxyLoss()]!") + if(included_types & STAMINALOSS) + TEST_ASSERT_EQUAL(testing_mob.getStaminaLoss(), amount, \ + "[testing_mob] should have [amount] stamina damage, instead they have [testing_mob.getStaminaLoss()]!") + return TRUE + +/datum/unit_test/mob_damage/basic/test_sanity_simple(mob/living/basic/mouse/gray/gusgus) + // check to see if basic mob damage works + + // Simple damage and healing + // Take 1 damage, heal for 1 + if(!test_apply_damage(gusgus, amount = 1)) + TEST_FAIL("ABOVE FAILURE: failed test_sanity_simple! damage was not applied correctly") + + if(!test_apply_damage(gusgus, amount = -1)) + TEST_FAIL("ABOVE FAILURE: failed test_sanity_simple! healing was not applied correctly") + + // Give 2 damage of every time (translates to 10 brute, 2 staminaloss) + if(!test_apply_damage(gusgus, amount = 2)) + TEST_FAIL("ABOVE FAILURE: failed test_sanity_simple! damage was not applied correctly") + + // underhealing: heal 1 damage of every type (translates to 5 brute, 1 staminaloss) + if(!test_apply_damage(gusgus, amount = -1)) + TEST_FAIL("ABOVE FAILURE: failed test_sanity_simple! healing was not applied correctly") + + // overhealing + + // heal 11 points of toxloss (should take care of all 5 brute damage remaining) + if(!apply_damage(gusgus, -11, expected = 5, included_types = TOXLOSS)) + TEST_FAIL("ABOVE FAILURE: failed test_sanity_simple! toxloss was not applied correctly") + // heal the remaining point of staminaloss + if(!apply_damage(gusgus, -11, expected = 1, included_types = STAMINALOSS)) + TEST_FAIL("ABOVE FAILURE: failed test_sanity_simple! failed to heal staminaloss correctly") + // heal 35 points of each type, we should already be at full health so nothing should happen + if(!test_apply_damage(gusgus, amount = -35, expected = 0)) + TEST_FAIL("ABOVE FAILURE: failed test_sanity_simple! overhealing was not applied correctly") + +/datum/unit_test/mob_damage/basic/test_sanity_complex(mob/living/basic/mouse/gray/gusgus) + // Heal up, so that errors from the previous tests we won't cause this one to fail + gusgus.fully_heal(HEAL_DAMAGE) + var/damage_returned + // overall damage procs + + // take 5 brute, 2 burn + damage_returned = gusgus.take_bodypart_damage(5, 2, updating_health = FALSE) + TEST_ASSERT_EQUAL(damage_returned, -7, \ + "take_bodypart_damage() should have returned -7, but returned [damage_returned] instead!") + + TEST_ASSERT_EQUAL(gusgus.bruteloss, 7, \ + "Mouse should have 7 brute damage, instead they have [gusgus.bruteloss]!") + TEST_ASSERT_EQUAL(gusgus.fireloss, 0, \ + "Mouse should have 0 burn damage, instead they have [gusgus.fireloss]!") + + // heal 4 brute, 1 burn + damage_returned = gusgus.heal_bodypart_damage(4, 1, updating_health = FALSE) + TEST_ASSERT_EQUAL(damage_returned, 5, \ + "heal_bodypart_damage() should have returned 5, but returned [damage_returned] instead!") + + TEST_ASSERT_EQUAL(gusgus.bruteloss, 2, \ + "Mouse should have 2 brute damage, instead they have [gusgus.bruteloss]!") + TEST_ASSERT_EQUAL(gusgus.fireloss, 0, \ + "Mouse should have 0 burn damage, instead they have [gusgus.fireloss]!") + + // heal 1 brute, 1 burn + damage_returned = gusgus.heal_overall_damage(1, 1, updating_health = FALSE) + TEST_ASSERT_EQUAL(damage_returned, 2, \ + "heal_overall_damage() should have returned 2, but returned [damage_returned] instead!") + + TEST_ASSERT_EQUAL(gusgus.bruteloss, 0, \ + "Mouse should have 0 brute damage, instead they have [gusgus.bruteloss]!") + TEST_ASSERT_EQUAL(gusgus.fireloss, 0, \ + "Mouse should have 0 burn damage, instead they have [gusgus.fireloss]!") + + // take 50 brute, 50 burn + damage_returned = gusgus.take_overall_damage(3, 3, updating_health = FALSE) + TEST_ASSERT_EQUAL(damage_returned, -6, \ + "take_overall_damage() should have returned -6, but returned [damage_returned] instead!") + + if(!verify_damage(gusgus, 1, expected = 6, included_types = BRUTELOSS)) + TEST_FAIL("take_overall_damage did not apply its damage correctly on the mouse!") + + // testing negative args with the overall damage procs + + damage_returned = gusgus.take_bodypart_damage(-1, -1, updating_health = FALSE) + TEST_ASSERT_EQUAL(damage_returned, -2, \ + "take_bodypart_damage() should have returned -2, but returned [damage_returned] instead!") + + damage_returned = gusgus.heal_bodypart_damage(-1, -1, updating_health = FALSE) + TEST_ASSERT_EQUAL(damage_returned, 2, \ + "heal_bodypart_damage() should have returned 2, but returned [damage_returned] instead!") + + damage_returned = gusgus.take_overall_damage(-1, -1, updating_health = FALSE) + TEST_ASSERT_EQUAL(damage_returned, -2, \ + "take_overall_damage() should have returned -2, but returned [damage_returned] instead!") + + damage_returned = gusgus.heal_overall_damage(-1, -1, updating_health = FALSE) + TEST_ASSERT_EQUAL(damage_returned, 2, \ + "heal_overall_damage() should have returned 2, but returned [damage_returned] instead!") + + if(!verify_damage(gusgus, 1, expected = 6, included_types = BRUTELOSS)) + TEST_FAIL("heal_overall_damage did not apply its healing correctly on the mouse!") + + // testing overhealing + + damage_returned = gusgus.heal_overall_damage(75, 99, updating_health = FALSE) + TEST_ASSERT_EQUAL(damage_returned, 6, \ + "heal_overall_damage() should have returned 6, but returned [damage_returned] instead!") + + if(!verify_damage(gusgus, 0, included_types = BRUTELOSS)) + TEST_FAIL("heal_overall_damage did not apply its healing correctly on the mouse!") diff --git a/code/modules/unit_tests/modify_fantasy_variable.dm b/code/modules/unit_tests/modify_fantasy_variable.dm new file mode 100644 index 0000000000000..72dc776af32c9 --- /dev/null +++ b/code/modules/unit_tests/modify_fantasy_variable.dm @@ -0,0 +1,46 @@ +// Unit test to make sure that there are no duplicate keys when modify_fantasy_variable is called when applying fantasy bonuses. +// Also to make sure the fantasy_modifications list is null when fantasy bonuses are removed. +/datum/unit_test/modify_fantasy_variable + priority = TEST_LONGER + +/datum/unit_test/modify_fantasy_variable/Run() + var/list/applicable_types = subtypesof(/obj/item) - uncreatables + + for(var/obj/item/path as anything in applicable_types) + var/obj/item/object = allocate(path) + // objects will have fantasy bonuses inherent to their type (like butterdogs and the slippery component), so we need to take this into account + var/number_of_extant_bonuses = LAZYLEN(object.fantasy_modifications) + +#define TEST_SUCCESS LAZYLEN(object.fantasy_modifications) == number_of_extant_bonuses + + // Try positive + object.apply_fantasy_bonuses(bonus = 5) + object.remove_fantasy_bonuses(bonus = 5) + TEST_ASSERT(TEST_SUCCESS, generate_failure_message(object)) + + // Then negative + object.apply_fantasy_bonuses(bonus = -5) + object.remove_fantasy_bonuses(bonus = -5) + TEST_ASSERT(TEST_SUCCESS, generate_failure_message(object)) + + // Now try the extremes of each + object.apply_fantasy_bonuses(bonus = 500) + object.remove_fantasy_bonuses(bonus = 500) + TEST_ASSERT(TEST_SUCCESS, generate_failure_message(object)) + + object.apply_fantasy_bonuses(bonus = -500) + object.remove_fantasy_bonuses(bonus = -500) + TEST_ASSERT(TEST_SUCCESS, generate_failure_message(object)) + +/// Returns a string that we use to describe the failure of the test. +/datum/unit_test/modify_fantasy_variable/proc/generate_failure_message(obj/item/failed_object) + var/list/cached_modifications = failed_object.fantasy_modifications + var/length_of_modifications = LAZYLEN(cached_modifications) + var/list/failure_messages = list("Error found when adding+removing fantasy bonuses for [failed_object.type].") + failure_messages += "The length of the fantasy_modifications list was [length_of_modifications]." + if(length_of_modifications) + failure_messages += "The fantasy_modifications list was [cached_modifications.Join(", ")]." + + return failure_messages.Join(" ") + +#undef TEST_SUCCESS diff --git a/code/modules/unit_tests/organs.dm b/code/modules/unit_tests/organs.dm index 81edc65230178..4ba51e0870c00 100644 --- a/code/modules/unit_tests/organs.dm +++ b/code/modules/unit_tests/organs.dm @@ -81,3 +81,37 @@ #undef TEST_ORGAN_INSERT_MESSAGE #undef TEST_ORGAN_REMOVE_MESSAGE + +/// Tests organ damage cap. +/// Organ damage should never bypass the cap. +/// Every internal organ is tested. +/datum/unit_test/organ_damage + +/datum/unit_test/organ_damage/Run() + var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) + for(var/obj/item/organ/internal/organ_to_test in dummy.organs) + test_organ(dummy, organ_to_test) + +/datum/unit_test/organ_damage/proc/test_organ(mob/living/carbon/human/dummy, obj/item/organ/internal/test_organ) + var/slot_to_use = test_organ.slot + + // Tests [mob/living/proc/adjustOrganLoss] + TEST_ASSERT_EQUAL(dummy.adjustOrganLoss(slot_to_use, test_organ.maxHealth * 10), -test_organ.maxHealth, \ + "Mob level \"apply organ damage\" returned the wrong value for [slot_to_use] organ with default arguments.") + TEST_ASSERT_EQUAL(dummy.get_organ_loss(slot_to_use), test_organ.maxHealth, \ + "Mob level \"apply organ damage\" can exceed the [slot_to_use] organ's damage cap with default arguments.") + dummy.fully_heal(HEAL_ORGANS) + + // Tests [mob/living/proc/set_organ_damage] + TEST_ASSERT_EQUAL(dummy.setOrganLoss(slot_to_use, test_organ.maxHealth * 10), -test_organ.maxHealth, \ + "Mob level \"set organ damage\" returned the wrong value for [slot_to_use] organ with default arguments.") + TEST_ASSERT_EQUAL(dummy.get_organ_loss(slot_to_use), test_organ.maxHealth, \ + "Mob level \"set organ damage\" can exceed the [slot_to_use] organ's damage cap with default arguments.") + dummy.fully_heal(HEAL_ORGANS) + + // Tests [mob/living/proc/adjustOrganLoss] with a large max supplied + TEST_ASSERT_EQUAL(dummy.adjustOrganLoss(slot_to_use, test_organ.maxHealth * 10, INFINITY), -test_organ.maxHealth, \ + "Mob level \"apply organ damage\" returned the wrong value for [slot_to_use] organ with a large maximum supplied.") + TEST_ASSERT_EQUAL(dummy.get_organ_loss(slot_to_use), test_organ.maxHealth, \ + "Mob level \"apply organ damage\" can exceed the [slot_to_use] organ's damage cap with a large maximum supplied.") + dummy.fully_heal(HEAL_ORGANS) diff --git a/code/modules/unit_tests/outfit_sanity.dm b/code/modules/unit_tests/outfit_sanity.dm index 3e85464019a2a..683cba3b2fd5f 100644 --- a/code/modules/unit_tests/outfit_sanity.dm +++ b/code/modules/unit_tests/outfit_sanity.dm @@ -19,6 +19,26 @@ l_hand = /obj/item/stack/spacecash/c1000 r_hand = /obj/item/stack/spacecash/c1000 +/// outfit_sanity needs to cover insertions into duffelbags +/datum/outfit/duffel_user + name = "Mr. Runtime" + back = /obj/item/storage/backpack/duffelbag + backpack_contents = list(/obj/item/clothing/mask/cigarette/cigar/havana) + +/// Satchels too +/datum/outfit/stachel_user + name = "Mr. Runtime" + back = /obj/item/storage/backpack/satchel + backpack_contents = list(/obj/item/clothing/mask/cigarette/cigar/havana) + +/// And just in case we'll check backpacks +/datum/outfit/backpack_user + name = "Mr. Runtime" + back = /obj/item/storage/backpack + backpack_contents = list(/obj/item/clothing/mask/cigarette/cigar/havana) + + + /datum/unit_test/outfit_sanity/Run() var/datum/outfit/prototype_outfit = /datum/outfit var/prototype_name = initial(prototype_outfit.name) @@ -61,7 +81,7 @@ for (var/path in backpack_contents) var/number = backpack_contents[path] || 1 for (var/_ in 1 to number) - if (!H.equip_to_slot_or_del(new path(H), ITEM_SLOT_BACKPACK, TRUE)) + if (!H.equip_to_slot_or_del(new path(H), ITEM_SLOT_BACKPACK, TRUE, indirect_action = TRUE)) TEST_FAIL("[outfit.name]'s backpack_contents are invalid! Couldn't add [path] to backpack.") #undef CHECK_OUTFIT_SLOT diff --git a/code/modules/unit_tests/preferences.dm b/code/modules/unit_tests/preferences.dm index 950b1dc281c90..626d5b4846613 100644 --- a/code/modules/unit_tests/preferences.dm +++ b/code/modules/unit_tests/preferences.dm @@ -49,3 +49,29 @@ continue TEST_ASSERT(!isnull(preference.main_feature_name), "Preference [preference_type] does not have a main_feature_name set!") + +/// Validates that every choiced preference with should_generate_icons implements icon_for, +/// and that every one that doesn't, doesn't. +/datum/unit_test/preferences_should_generate_icons_sanity + +/datum/unit_test/preferences_should_generate_icons_sanity/Run() + for (var/preference_type in GLOB.preference_entries) + var/datum/preference/choiced/choiced_preference = GLOB.preference_entries[preference_type] + if (!istype(choiced_preference) || choiced_preference.abstract_type == preference_type) + continue + + var/list/values = choiced_preference.get_choices() + + if (choiced_preference.should_generate_icons) + for (var/value in values) + var/icon = choiced_preference.icon_for(value) + TEST_ASSERT(istype(icon, /icon) || ispath(icon), "[preference_type] gave [icon] as an icon for [value], which is not a valid value") + else + var/errored = FALSE + + try + choiced_preference.icon_for(values[1]) + catch + errored = TRUE + + TEST_ASSERT(errored, "[preference_type] implemented icon_for, but does not have should_generate_icons = TRUE") diff --git a/code/modules/unit_tests/projectiles.dm b/code/modules/unit_tests/projectiles.dm index 8e75fed8ef445..a6462855179f5 100644 --- a/code/modules/unit_tests/projectiles.dm +++ b/code/modules/unit_tests/projectiles.dm @@ -1,15 +1,21 @@ +///Tests all projectiles that none of them are phasing. +/datum/unit_test/projectile_movetypes + /datum/unit_test/projectile_movetypes/Run() - for(var/path in typesof(/obj/projectile)) - var/obj/projectile/projectile = path + for(var/obj/projectile/projectile as anything in typesof(/obj/projectile)) if(initial(projectile.movement_type) & PHASING) - TEST_FAIL("[path] has default movement type PHASING. Piercing projectiles should be done using the projectile piercing system, not movement_types!") + TEST_FAIL("[projectile] has default movement type PHASING. Piercing projectiles should be done using the projectile piercing system, not movement_types!") + +///Shoots a victim with a gun to ensure the gun properly loads and the victim take the correct amount of damage. +/datum/unit_test/gun_go_bang /datum/unit_test/gun_go_bang/Run() // test is for a ballistic gun that starts loaded + chambered - var/obj/item/gun/test_gun = allocate(/obj/item/gun/ballistic/automatic/pistol) + var/obj/item/gun/ballistic/test_gun = allocate(/obj/item/gun/ballistic/automatic/pistol) var/mob/living/carbon/human/victim = allocate(/mob/living/carbon/human/consistent) var/mob/living/carbon/human/gunner = allocate(/mob/living/carbon/human/consistent) ADD_TRAIT(victim, TRAIT_PIERCEIMMUNE, INNATE_TRAIT) // So the human isn't randomly affected by shrapnel + test_gun.can_misfire = FALSE //just in case var/obj/item/ammo_casing/loaded_casing = test_gun.chambered TEST_ASSERT(loaded_casing, "Gun started without round chambered, should be loaded") diff --git a/code/modules/unit_tests/reagent_container_defaults.dm b/code/modules/unit_tests/reagent_container_defaults.dm new file mode 100644 index 0000000000000..83df22fa36a50 --- /dev/null +++ b/code/modules/unit_tests/reagent_container_defaults.dm @@ -0,0 +1,12 @@ +/// Checks if reagent container transfer amount defaults match with actual possible values +/datum/unit_test/reagent_container_defaults + +/datum/unit_test/reagent_container_defaults/Run() + for(var/container_type in subtypesof(/obj/item/reagent_containers)) + var/obj/item/reagent_containers/container = allocate(container_type) + if(!container.has_variable_transfer_amount) + continue + var/initial_value = initial(container.amount_per_transfer_from_this) + var/index_of_initial_value = container.possible_transfer_amounts.Find(initial_value) + if(index_of_initial_value == 0) + TEST_FAIL("Reagent container [container_type]: initial value of amount_per_transfer_from_this value ([initial_value]) not found in possible_transfer_amounts list") diff --git a/code/modules/unit_tests/say.dm b/code/modules/unit_tests/say.dm index 16de2ac424c87..3ae55a12e37e5 100644 --- a/code/modules/unit_tests/say.dm +++ b/code/modules/unit_tests/say.dm @@ -49,11 +49,11 @@ host_mob = allocate(/mob/living/carbon/human/consistent) var/surfer_quote = "surfing in the USA" - host_mob.grant_language(/datum/language/beachbum, spoken=TRUE, understood=FALSE) // can speak but can't understand + host_mob.grant_language(/datum/language/beachbum, SPOKEN_LANGUAGE) // 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_language(host_mob, /datum/language/beachbum, surfer_quote), "Language test failed. Mob was supposed to understand: [surfer_quote]") - host_mob.grant_language(/datum/language/beachbum, spoken=TRUE, understood=TRUE) // can now understand + host_mob.grant_language(/datum/language/beachbum, ALL) // can now understand TEST_ASSERT_EQUAL(surfer_quote, host_mob.translate_language(host_mob, /datum/language/beachbum, 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 @@ -62,6 +62,8 @@ var/list/handle_hearing_result = null var/mob/living/carbon/human/speaker var/mob/living/carbon/human/listener + var/obj/item/radio/speaker_radio + var/obj/item/radio/listener_radio /datum/unit_test/speech/proc/handle_speech(datum/source, list/speech_args) SIGNAL_HANDLER @@ -99,7 +101,14 @@ /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 @@ -114,9 +123,12 @@ // neither speaking or whispering should be hearable conversation(distance = 10) + // Radio test + radio_test() + // Language test speaker.grant_language(/datum/language/beachbum) - speaker.language_holder.selected_language = /datum/language/beachbum + speaker.set_active_language(/datum/language/beachbum) listener.add_blocked_language(/datum/language/beachbum) // speaking and whispering should be hearable conversation(distance = 1) @@ -156,5 +168,39 @@ handle_speech_result = null handle_hearing_result = null +/datum/unit_test/speech/proc/radio_test() + 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(islist(handle_hearing_result), "Listener failed to hear radio message (radio test)") + TEST_ASSERT_EQUAL(speaker_radio.get_frequency(), listener_radio.get_frequency(), "Radio frequencies were not equal (radio test)") + + handle_speech_result = null + handle_hearing_result = null + + 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.set_broadcasting(FALSE) + #undef NORMAL_HEARING_RANGE #undef WHISPER_HEARING_RANGE 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 ebb22ef408342..e17d8c14159d1 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_cyberpolice.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_cyberpolice.png new file mode 100644 index 0000000000000..ac8a6347bbd71 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_cyberpolice.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_ethereal_lustrous.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_ethereal_lustrous.png new file mode 100644 index 0000000000000..5e827763c69f4 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_ethereal_lustrous.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_krokodil_addict.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_krokodil_addict.png index 30f9080a6c3c7..e9251e73cc549 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_krokodil_addict.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_krokodil_addict.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 1f3f0cf19c81e..c0a3c30b8bb38 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 92b82d57d685d..70d445b771277 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 5d2f363159732..f7f6ddf47d578 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/transformation_sting_appearances.png b/code/modules/unit_tests/screenshots/transformation_sting_appearances.png new file mode 100644 index 0000000000000..e20d19d45b680 Binary files /dev/null and b/code/modules/unit_tests/screenshots/transformation_sting_appearances.png differ diff --git a/code/modules/unit_tests/simple_animal_freeze.dm b/code/modules/unit_tests/simple_animal_freeze.dm index b25ca7ba4ebc2..a0a4c91be2d56 100644 --- a/code/modules/unit_tests/simple_animal_freeze.dm +++ b/code/modules/unit_tests/simple_animal_freeze.dm @@ -16,6 +16,7 @@ /mob/living/simple_animal/bot/medbot/autopatrol, /mob/living/simple_animal/bot/medbot/derelict, /mob/living/simple_animal/bot/medbot/mysterious, + /mob/living/simple_animal/bot/medbot/nukie, /mob/living/simple_animal/bot/medbot/stationary, /mob/living/simple_animal/bot/mulebot, /mob/living/simple_animal/bot/mulebot/paranormal, @@ -32,12 +33,6 @@ /mob/living/simple_animal/bot/secbot/honkbot, /mob/living/simple_animal/bot/secbot/pingsky, /mob/living/simple_animal/bot/vibebot, - /mob/living/simple_animal/crab, - /mob/living/simple_animal/crab/coffee, - /mob/living/simple_animal/crab/evil, - /mob/living/simple_animal/crab/evil/kreb, - /mob/living/simple_animal/crab/jon, - /mob/living/simple_animal/crab/kreb, /mob/living/simple_animal/drone, /mob/living/simple_animal/drone/classic, /mob/living/simple_animal/drone/derelict, @@ -56,13 +51,6 @@ /mob/living/simple_animal/hostile/alien/queen/large, /mob/living/simple_animal/hostile/alien/sentinel, /mob/living/simple_animal/hostile/asteroid, - /mob/living/simple_animal/hostile/asteroid/basilisk, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/magmawing, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril, - /mob/living/simple_animal/hostile/asteroid/brimdemon, /mob/living/simple_animal/hostile/asteroid/curseblob, /mob/living/simple_animal/hostile/asteroid/elite, /mob/living/simple_animal/hostile/asteroid/elite/broodmother, @@ -72,55 +60,14 @@ /mob/living/simple_animal/hostile/asteroid/elite/legionnaire, /mob/living/simple_animal/hostile/asteroid/elite/legionnairehead, /mob/living/simple_animal/hostile/asteroid/elite/pandora, - /mob/living/simple_animal/hostile/asteroid/goldgrub, - /mob/living/simple_animal/hostile/asteroid/goliath, - /mob/living/simple_animal/hostile/asteroid/goliath/beast, - /mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient, - /mob/living/simple_animal/hostile/asteroid/goliath/beast/random, - /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril, /mob/living/simple_animal/hostile/asteroid/gutlunch, /mob/living/simple_animal/hostile/asteroid/gutlunch/grublunch, /mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck, /mob/living/simple_animal/hostile/asteroid/gutlunch/guthen, - /mob/living/simple_animal/hostile/asteroid/hivelord, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/advanced, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/random, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/portal, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril, - /mob/living/simple_animal/hostile/asteroid/hivelordbrood, - /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion, - /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced, - /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow, /mob/living/simple_animal/hostile/asteroid/ice_demon, - /mob/living/simple_animal/hostile/asteroid/ice_whelp, - /mob/living/simple_animal/hostile/asteroid/lobstrosity, - /mob/living/simple_animal/hostile/asteroid/lobstrosity/lava, /mob/living/simple_animal/hostile/asteroid/polarbear, /mob/living/simple_animal/hostile/asteroid/polarbear/lesser, /mob/living/simple_animal/hostile/asteroid/wolf, - /mob/living/simple_animal/hostile/bear, - /mob/living/simple_animal/hostile/bear/butter, - /mob/living/simple_animal/hostile/bear/fightpit, - /mob/living/simple_animal/hostile/bear/hudson, - /mob/living/simple_animal/hostile/bear/russian, - /mob/living/simple_animal/hostile/bear/snow, - /mob/living/simple_animal/hostile/bee, - /mob/living/simple_animal/hostile/bee/queen, - /mob/living/simple_animal/hostile/bee/short, - /mob/living/simple_animal/hostile/bee/toxin, - /mob/living/simple_animal/hostile/big_legion, - /mob/living/simple_animal/hostile/blob, - /mob/living/simple_animal/hostile/blob/blobbernaut, - /mob/living/simple_animal/hostile/blob/blobbernaut/independent, - /mob/living/simple_animal/hostile/blob/blobspore, - /mob/living/simple_animal/hostile/blob/blobspore/independent, - /mob/living/simple_animal/hostile/blob/blobspore/weak, - /mob/living/simple_animal/hostile/boss, - /mob/living/simple_animal/hostile/boss/paper_wizard, - /mob/living/simple_animal/hostile/boss/paper_wizard/copy, /mob/living/simple_animal/hostile/construct, /mob/living/simple_animal/hostile/construct/artificer, /mob/living/simple_animal/hostile/construct/artificer/angelic, @@ -141,8 +88,8 @@ /mob/living/simple_animal/hostile/construct/wraith/mystic, /mob/living/simple_animal/hostile/construct/wraith/noncult, /mob/living/simple_animal/hostile/dark_wizard, - /mob/living/simple_animal/hostile/eyeball, /mob/living/simple_animal/hostile/gorilla, + /mob/living/simple_animal/hostile/gorilla/lesser, /mob/living/simple_animal/hostile/gorilla/cargo_domestic, /mob/living/simple_animal/hostile/guardian, /mob/living/simple_animal/hostile/guardian/assassin, @@ -156,60 +103,45 @@ /mob/living/simple_animal/hostile/guardian/ranged, /mob/living/simple_animal/hostile/guardian/standard, /mob/living/simple_animal/hostile/guardian/support, - /mob/living/simple_animal/hostile/heretic_summon, - /mob/living/simple_animal/hostile/heretic_summon/armsy, - /mob/living/simple_animal/hostile/heretic_summon/armsy/prime, - /mob/living/simple_animal/hostile/heretic_summon/ash_spirit, - /mob/living/simple_animal/hostile/heretic_summon/maid_in_the_mirror, - /mob/living/simple_animal/hostile/heretic_summon/raw_prophet, - /mob/living/simple_animal/hostile/heretic_summon/rust_spirit, - /mob/living/simple_animal/hostile/heretic_summon/stalker, - /mob/living/simple_animal/hostile/hivebot, - /mob/living/simple_animal/hostile/hivebot/mechanic, - /mob/living/simple_animal/hostile/hivebot/range, - /mob/living/simple_animal/hostile/hivebot/rapid, - /mob/living/simple_animal/hostile/hivebot/strong, /mob/living/simple_animal/hostile/illusion, /mob/living/simple_animal/hostile/illusion/escape, /mob/living/simple_animal/hostile/illusion/mirage, - /mob/living/simple_animal/hostile/imp, - /mob/living/simple_animal/hostile/imp/slaughter, - /mob/living/simple_animal/hostile/imp/slaughter/engine_demon, - /mob/living/simple_animal/hostile/imp/slaughter/laughter, /mob/living/simple_animal/hostile/jungle, /mob/living/simple_animal/hostile/jungle/leaper, - /mob/living/simple_animal/hostile/jungle/mega_arachnid, /mob/living/simple_animal/hostile/jungle/mook, - /mob/living/simple_animal/hostile/jungle/seedling, /mob/living/simple_animal/hostile/megafauna, /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner, /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/doom, /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/guidance, /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/hunter, + /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/virtual_domain, /mob/living/simple_animal/hostile/megafauna/bubblegum, /mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination, + /mob/living/simple_animal/hostile/megafauna/bubblegum/virtual_domain, /mob/living/simple_animal/hostile/megafauna/clockwork_defender, /mob/living/simple_animal/hostile/megafauna/colossus, + /mob/living/simple_animal/hostile/megafauna/colossus/virtual_domain, /mob/living/simple_animal/hostile/megafauna/demonic_frost_miner, /mob/living/simple_animal/hostile/megafauna/dragon, /mob/living/simple_animal/hostile/megafauna/dragon/lesser, + /mob/living/simple_animal/hostile/megafauna/dragon/virtual_domain, /mob/living/simple_animal/hostile/megafauna/hierophant, + /mob/living/simple_animal/hostile/megafauna/hierophant/virtual_domain, /mob/living/simple_animal/hostile/megafauna/legion, + /mob/living/simple_animal/hostile/megafauna/legion/virtual_domain, /mob/living/simple_animal/hostile/megafauna/legion/medium, /mob/living/simple_animal/hostile/megafauna/legion/medium/eye, /mob/living/simple_animal/hostile/megafauna/legion/medium/left, /mob/living/simple_animal/hostile/megafauna/legion/medium/right, /mob/living/simple_animal/hostile/megafauna/legion/small, /mob/living/simple_animal/hostile/megafauna/wendigo, + /mob/living/simple_animal/hostile/megafauna/wendigo/virtual_domain, /mob/living/simple_animal/hostile/mimic, /mob/living/simple_animal/hostile/mimic/copy, /mob/living/simple_animal/hostile/mimic/copy/machine, /mob/living/simple_animal/hostile/mimic/copy/ranged, /mob/living/simple_animal/hostile/mimic/crate, /mob/living/simple_animal/hostile/mimic/xenobio, - /mob/living/simple_animal/hostile/mining_drone, - /mob/living/simple_animal/hostile/morph, - /mob/living/simple_animal/hostile/mushroom, /mob/living/simple_animal/hostile/nanotrasen, /mob/living/simple_animal/hostile/nanotrasen/elite, /mob/living/simple_animal/hostile/nanotrasen/ranged, @@ -224,28 +156,11 @@ /mob/living/simple_animal/hostile/pirate/melee/space, /mob/living/simple_animal/hostile/pirate/ranged, /mob/living/simple_animal/hostile/pirate/ranged/space, - /mob/living/simple_animal/hostile/regalrat, - /mob/living/simple_animal/hostile/regalrat/controlled, /mob/living/simple_animal/hostile/retaliate, - /mob/living/simple_animal/hostile/retaliate/clown, - /mob/living/simple_animal/hostile/retaliate/clown/banana, - /mob/living/simple_animal/hostile/retaliate/clown/clownhulk, - /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/chlown, - /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/destroyer, - /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus, - /mob/living/simple_animal/hostile/retaliate/clown/fleshclown, - /mob/living/simple_animal/hostile/retaliate/clown/honkling, - /mob/living/simple_animal/hostile/retaliate/clown/longface, - /mob/living/simple_animal/hostile/retaliate/clown/lube, - /mob/living/simple_animal/hostile/retaliate/clown/mutant, - /mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton, - /mob/living/simple_animal/hostile/retaliate/clown/mutant/slow, - /mob/living/simple_animal/hostile/retaliate/goat, /mob/living/simple_animal/hostile/retaliate/goose, /mob/living/simple_animal/hostile/retaliate/goose/vomit, /mob/living/simple_animal/hostile/retaliate/nanotrasenpeace, /mob/living/simple_animal/hostile/retaliate/nanotrasenpeace/ranged, - /mob/living/simple_animal/hostile/retaliate/snake, /mob/living/simple_animal/hostile/retaliate/trader, /mob/living/simple_animal/hostile/retaliate/trader/mrbones, /mob/living/simple_animal/hostile/skeleton, @@ -254,8 +169,6 @@ /mob/living/simple_animal/hostile/skeleton/plasmaminer, /mob/living/simple_animal/hostile/skeleton/plasmaminer/jackhammer, /mob/living/simple_animal/hostile/skeleton/templar, - /mob/living/simple_animal/hostile/smspider, - /mob/living/simple_animal/hostile/smspider/overcharged, /mob/living/simple_animal/hostile/space_dragon, /mob/living/simple_animal/hostile/space_dragon/spawn_with_antag, /mob/living/simple_animal/hostile/vatbeast, @@ -276,24 +189,15 @@ /mob/living/simple_animal/pet/cat/original, /mob/living/simple_animal/pet/cat/runtime, /mob/living/simple_animal/pet/cat/space, - /mob/living/simple_animal/pet/fox, - /mob/living/simple_animal/pet/fox/renault, /mob/living/simple_animal/pet/gondola, /mob/living/simple_animal/pet/gondola/gondolapod, - /mob/living/simple_animal/pet/penguin, - /mob/living/simple_animal/pet/penguin/baby, - /mob/living/simple_animal/pet/penguin/emperor, - /mob/living/simple_animal/pet/penguin/emperor/shamebrero, + /mob/living/simple_animal/pet/gondola/virtual_domain, /mob/living/simple_animal/revenant, - /mob/living/simple_animal/robot_customer, /mob/living/simple_animal/shade, /mob/living/simple_animal/slime, /mob/living/simple_animal/slime/pet, /mob/living/simple_animal/slime/random, /mob/living/simple_animal/slime/transformed_slime, - /mob/living/simple_animal/sloth, - /mob/living/simple_animal/sloth/citrus, - /mob/living/simple_animal/sloth/paperwork, /mob/living/simple_animal/soulscythe, // DO NOT ADD NEW ENTRIES TO THIS LIST // READ THE COMMENT ABOVE diff --git a/code/modules/unit_tests/spell_jaunt.dm b/code/modules/unit_tests/spell_jaunt.dm new file mode 100644 index 0000000000000..41446b71a591e --- /dev/null +++ b/code/modules/unit_tests/spell_jaunt.dm @@ -0,0 +1,21 @@ +/// Tests Shadow Walk can be entered and exited +/datum/unit_test/shadow_jaunt + +/datum/unit_test/shadow_jaunt/Run() + var/mob/living/carbon/human/jaunter = allocate(/mob/living/carbon/human/consistent) + var/datum/action/cooldown/spell/jaunt/shadow_walk/walk = allocate(/datum/action/cooldown/spell/jaunt/shadow_walk, jaunter) + walk.Grant(jaunter) + + var/turf/jaunt_turf = jaunter.loc + TEST_ASSERT(istype(jaunt_turf), "Jaunter was not allocated to a turf, instead to [jaunt_turf || "nullspace"].") + TEST_ASSERT(walk.IsAvailable(), "Unit test room is not suitable to test [walk].") + + walk.Trigger() + + TEST_ASSERT_NOTEQUAL(jaunter.loc, jaunt_turf, "Jaunter's loc did not change on casting [walk].") + TEST_ASSERT(istype(jaunter.loc, walk.jaunt_type), "Jaunter failed to enter jaunt on casting [walk].") + + walk.next_use_time = -1 + walk.Trigger() + + TEST_ASSERT_EQUAL(jaunter.loc, jaunt_turf, "Jaunter failed to exit jaunt on exiting [walk].") diff --git a/code/modules/unit_tests/station_trait_tests.dm b/code/modules/unit_tests/station_trait_tests.dm index 3af8bd17a9757..430e83b9af7be 100644 --- a/code/modules/unit_tests/station_trait_tests.dm +++ b/code/modules/unit_tests/station_trait_tests.dm @@ -3,7 +3,7 @@ /datum/unit_test/station_traits/Run() var/datum/station_trait/cybernetic_revolution/cyber_trait = allocate(/datum/station_trait/cybernetic_revolution) - for(var/datum/job/job in subtypesof(/datum/job)) + for(var/datum/job/job as anything in subtypesof(/datum/job)) if(!(initial(job.job_flags) & JOB_CREW_MEMBER)) continue if(!(job in cyber_trait.job_to_cybernetic)) diff --git a/code/modules/unit_tests/status_effect_ticks.dm b/code/modules/unit_tests/status_effect_ticks.dm new file mode 100644 index 0000000000000..6f3c43c7ada2e --- /dev/null +++ b/code/modules/unit_tests/status_effect_ticks.dm @@ -0,0 +1,23 @@ +/// Validates status effect tick interval setup +/datum/unit_test/status_effect_ticks + +/datum/unit_test/status_effect_ticks/Run() + for(var/datum/status_effect/checking as anything in subtypesof(/datum/status_effect)) + var/checking_tick = initial(checking.tick_interval) + if(checking_tick == -1) + continue + if(checking_tick == INFINITY) + TEST_FAIL("Status effect [checking] has tick_interval set to INFINITY, this is not how you prevent ticks - use tick_interval = -1 instead.") + continue + if(checking_tick == 0) + TEST_FAIL("Status effect [checking] has tick_interval set to 0, this is not how you prevent ticks - use tick_interval = -1 instead.") + continue + switch(initial(checking.processing_speed)) + if(STATUS_EFFECT_FAST_PROCESS) + if(checking_tick < SSfastprocess.wait) + TEST_FAIL("Status effect [checking] has tick_interval set to [checking_tick], which is faster than SSfastprocess can tick ([SSfastprocess.wait]).") + if(STATUS_EFFECT_NORMAL_PROCESS) + if(checking_tick < SSprocessing.wait) + TEST_FAIL("Status effect [checking] has tick_interval set to [checking_tick], which is faster than SSprocessing can tick ([SSprocessing.wait]).") + else + TEST_FAIL("Invalid processing speed for status effect [checking] : [initial(checking.processing_speed)]") diff --git a/code/modules/unit_tests/strippable.dm b/code/modules/unit_tests/strippable.dm index bb697de424c43..47a76a1ca75b6 100644 --- a/code/modules/unit_tests/strippable.dm +++ b/code/modules/unit_tests/strippable.dm @@ -1,7 +1,7 @@ /datum/unit_test/strip_menu_ui_status/Run() // We just need something that doesn't have strippable by default, so we can add it ourselves. var/obj/target = allocate(/obj/item/pen, run_loc_floor_bottom_left) - var/datum/element/strippable/strippable = target.AddElement(/datum/element/strippable, list()) + var/datum/element/strippable/strippable = target.AddElement(/datum/element/strippable) var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human/consistent, run_loc_floor_bottom_left) ADD_TRAIT(user, TRAIT_PRESERVE_UI_WITHOUT_CLIENT, TRAIT_SOURCE_UNIT_TESTS) diff --git a/code/modules/unit_tests/stuns.dm b/code/modules/unit_tests/stuns.dm new file mode 100644 index 0000000000000..68110e72e5597 --- /dev/null +++ b/code/modules/unit_tests/stuns.dm @@ -0,0 +1,72 @@ +/// Tests stun and the canstun flag +/datum/unit_test/stun + +/datum/unit_test/stun/Run() + var/mob/living/carbon/human/gets_stunned = allocate(/mob/living/carbon/human/consistent) + + gets_stunned.Stun(1 SECONDS) + TEST_ASSERT(gets_stunned.IsStun(), "Stun() failed to apply stun") + + gets_stunned.SetStun(0 SECONDS) + TEST_ASSERT(!gets_stunned.IsStun(), "SetStun(0) failed to clear stun") + + gets_stunned.status_flags &= ~CANSTUN + gets_stunned.Stun(1 SECONDS) + TEST_ASSERT(!gets_stunned.IsStun(), "Stun() stunned despite not having CANSTUN flag") + +/// Tests knockdown and the canknockdown flag +/datum/unit_test/knockdown + +/datum/unit_test/knockdown/Run() + var/mob/living/carbon/human/gets_knockdown = allocate(/mob/living/carbon/human/consistent) + + gets_knockdown.Knockdown(1 SECONDS) + TEST_ASSERT(gets_knockdown.IsKnockdown(), "Knockdown() failed to apply knockdown") + + gets_knockdown.SetKnockdown(0 SECONDS) + TEST_ASSERT(!gets_knockdown.IsKnockdown(), "SetKnockdown(0) failed to clear knockdown") + + gets_knockdown.status_flags &= ~CANKNOCKDOWN + gets_knockdown.Knockdown(1 SECONDS) + TEST_ASSERT(!gets_knockdown.IsKnockdown(), "Knockdown() knocked over despite not having CANKNOCKDOWN flag") + +/// Tests paralyze and stuns that have two flags checked (in this case, canstun and canknockdown) +/datum/unit_test/paralyze + +/datum/unit_test/paralyze/Run() + var/mob/living/carbon/human/gets_paralyzed = allocate(/mob/living/carbon/human/consistent) + + gets_paralyzed.Paralyze(1 SECONDS) + TEST_ASSERT(gets_paralyzed.IsParalyzed(), "Paralyze() failed to apply paralyze") + + gets_paralyzed.SetParalyzed(0 SECONDS) + TEST_ASSERT(!gets_paralyzed.IsParalyzed(), "SetParalyzed(0) failed to clear paralyze") + + gets_paralyzed.status_flags &= ~CANSTUN // paralyze needs both CANSTUN and CANKNOCKDOWN to succeed + gets_paralyzed.Paralyze(1 SECONDS) + TEST_ASSERT(!gets_paralyzed.IsParalyzed(), "Paralyze() paralyzed a mob despite not having CANSTUN flag (but still having CANKNOCKDOWN)") + +/// Tests unconsciousness and the canunconscious flag +/datum/unit_test/unconsciousness + +/datum/unit_test/unconsciousness/Run() + var/mob/living/carbon/human/gets_unconscious = allocate(/mob/living/carbon/human/consistent) + + gets_unconscious.Unconscious(1 SECONDS) + TEST_ASSERT(gets_unconscious.IsUnconscious(), "Unconscious() failed to apply unconsciousness") + + gets_unconscious.SetUnconscious(0 SECONDS) + TEST_ASSERT(!gets_unconscious.IsUnconscious(), "SetUnconscious(0) failed to clear unconsciousness") + + gets_unconscious.status_flags &= ~CANUNCONSCIOUS + gets_unconscious.Unconscious(1 SECONDS) + TEST_ASSERT(!gets_unconscious.IsUnconscious(), "Unconscious() knocked unconscious despite not having CANUNCONSCIOUS flag") + +/// Tests for stun absorption +/datum/unit_test/stun_absorb + +/datum/unit_test/stun_absorb/Run() + var/mob/living/carbon/human/doesnt_get_stunned = allocate(/mob/living/carbon/human/consistent) + doesnt_get_stunned.add_stun_absorption(source = TRAIT_SOURCE_UNIT_TESTS) + doesnt_get_stunned.Stun(1 SECONDS) + TEST_ASSERT(!doesnt_get_stunned.IsStun(), "Stun() stunned despite having stun absorption") diff --git a/code/modules/unit_tests/surgeries.dm b/code/modules/unit_tests/surgeries.dm index 3d72fd4371848..8d2901bf77ffa 100644 --- a/code/modules/unit_tests/surgeries.dm +++ b/code/modules/unit_tests/surgeries.dm @@ -29,11 +29,20 @@ /datum/unit_test/head_transplant/Run() var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human/consistent) - var/mob/living/carbon/human/alice = allocate(/mob/living/carbon/human/consistent) - var/mob/living/carbon/human/bob = allocate(/mob/living/carbon/human/consistent) + var/mob/living/carbon/human/alice = allocate(/mob/living/carbon/human/consistent) alice.fully_replace_character_name(null, "Alice") + alice.set_haircolor(COLOR_LIGHT_PINK, update = FALSE) + alice.set_hairstyle("Very Long Hair", update = FALSE) + alice.set_facial_haircolor(COLOR_LIGHT_PINK, update = FALSE) + alice.set_facial_hairstyle("Shaved", update = TRUE) + + var/mob/living/carbon/human/bob = allocate(/mob/living/carbon/human/consistent) bob.fully_replace_character_name(null, "Bob") + bob.set_haircolor(COLOR_LIGHT_BROWN, update = FALSE) + bob.set_hairstyle("Short Hair", update = FALSE) + bob.set_facial_haircolor(COLOR_LIGHT_BROWN, update = FALSE) + bob.set_facial_hairstyle("Beard (Full)", update = TRUE) var/obj/item/bodypart/head/alices_head = alice.get_bodypart(BODY_ZONE_HEAD) alices_head.drop_limb() @@ -53,6 +62,10 @@ 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") + TEST_ASSERT_EQUAL(alice.hairstyle, "Short Hair", "Bob's head was transplanted onto Alice's body, but their hairstyle is not Short Hair") + TEST_ASSERT_EQUAL(alice.hair_color, COLOR_LIGHT_BROWN, "Bob's head was transplanted onto Alice's body, but their hair color is not COLOR_LIGHT_BROWN") + TEST_ASSERT_EQUAL(alice.facial_hairstyle, "Beard (Full)", "Bob's head was transplanted onto Alice's body, but their facial hairstyle is not Beard (Full)") + TEST_ASSERT_EQUAL(alice.facial_hair_color, COLOR_LIGHT_BROWN, "Bob's head was transplanted onto Alice's body, but their facial hair color is not COLOR_LIGHT_BROWN") /datum/unit_test/multiple_surgeries/Run() var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human/consistent) diff --git a/code/modules/unit_tests/teleporters.dm b/code/modules/unit_tests/teleporters.dm index 2cb047304fbb5..e1af0a71a351d 100644 --- a/code/modules/unit_tests/teleporters.dm +++ b/code/modules/unit_tests/teleporters.dm @@ -1,10 +1,18 @@ -/datum/unit_test/auto_teleporter_linking/Run() +/datum/unit_test/teleporter/Run() // Put down the teleporter machinery var/obj/machinery/teleport/hub/hub = allocate(/obj/machinery/teleport/hub) var/obj/machinery/teleport/station/station = allocate(/obj/machinery/teleport/station, locate(run_loc_floor_bottom_left.x + 1, run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z)) var/obj/machinery/computer/teleporter/computer = allocate(/obj/machinery/computer/teleporter, locate(run_loc_floor_bottom_left.x + 2, run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z)) + var/obj/item/beacon/beacon = allocate(/obj/item/beacon) TEST_ASSERT_EQUAL(hub.power_station, station, "Hub didn't link to the station") TEST_ASSERT_EQUAL(station.teleporter_console, computer, "Station didn't link to the teleporter console") TEST_ASSERT_EQUAL(station.teleporter_hub, hub, "Station didn't link to the hub") TEST_ASSERT_EQUAL(computer.power_station, station, "Teleporter console didn't link to the hub") + + computer.set_teleport_target(beacon) + TEST_ASSERT_EQUAL(computer.target_ref, beacon.weak_reference, "Teleporter didn't target beacon correctly") + + computer.set_teleport_target(beacon) + beacon.turn_off() + TEST_ASSERT_NULL(computer.target_ref, "Teleporter beacon isn't properly turned off.") diff --git a/code/modules/unit_tests/trauma_granting.dm b/code/modules/unit_tests/trauma_granting.dm new file mode 100644 index 0000000000000..5c3038bc314cd --- /dev/null +++ b/code/modules/unit_tests/trauma_granting.dm @@ -0,0 +1,31 @@ +/// Tests that brain traumas can be granted and removed properly. +/datum/unit_test/trauma_granting + +/datum/unit_test/trauma_granting/Run() + + var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) + // It's not stricly necessary a mob must have a mind, but some traumas do extra stuff if you have mind. + dummy.mind_initialize() + + // Following includes some traumas that would require special handling to test. + var/list/trauma_blacklist = list() + // Requires a phase be set in New + trauma_blacklist += typesof(/datum/brain_trauma/hypnosis) + // Requires another player, sleeps in gain() + trauma_blacklist += typesof(/datum/brain_trauma/severe/split_personality) + // Requires another player, sleeps in gain() + trauma_blacklist += typesof(/datum/brain_trauma/special/imaginary_friend) + // Requires a obsession target + trauma_blacklist += typesof(/datum/brain_trauma/special/obsessed) + + for(var/datum/brain_trauma/trauma as anything in typesof(/datum/brain_trauma) - trauma_blacklist) + if(trauma == initial(trauma.abstract_type)) + continue + + test_trauma(dummy, trauma) + +/datum/unit_test/trauma_granting/proc/test_trauma(mob/living/carbon/human/dummy, trauma) + dummy.gain_trauma(trauma) + TEST_ASSERT(dummy.has_trauma_type(trauma), "Brain trauma [trauma] failed to grant to dummy") + dummy.cure_trauma_type(trauma, TRAUMA_RESILIENCE_ABSOLUTE) + TEST_ASSERT(!dummy.has_trauma_type(trauma), "Brain trauma [trauma] failed to cure from dummy") diff --git a/code/modules/unit_tests/unit_test.dm b/code/modules/unit_tests/unit_test.dm index 22470e2593c6e..583a74dacc768 100644 --- a/code/modules/unit_tests/unit_test.dm +++ b/code/modules/unit_tests/unit_test.dm @@ -50,6 +50,9 @@ GLOBAL_VAR_INIT(focused_tests, focused_tests()) /// Do not instantiate if type matches this var/abstract_type = /datum/unit_test + /// List of atoms that we don't want to ever initialize in an agnostic context, like for Create and Destroy. Stored on the base datum for usability in other relevant tests that need this data. + var/static/list/uncreatables = null + var/static/datum/space_level/reservation /proc/cmp_unit_test_priority(datum/unit_test/a, datum/unit_test/b) @@ -60,6 +63,9 @@ GLOBAL_VAR_INIT(focused_tests, focused_tests()) var/datum/map_template/unit_tests/template = new reservation = template.load_new_z() + if (isnull(uncreatables)) + uncreatables = build_list_of_uncreatables() + allocated = new run_loc_floor_bottom_left = get_turf(locate(/obj/effect/landmark/unit_test_bottom_left) in GLOB.landmarks_list) run_loc_floor_top_right = get_turf(locate(/obj/effect/landmark/unit_test_top_right) in GLOB.landmarks_list) @@ -209,6 +215,113 @@ GLOBAL_VAR_INIT(focused_tests, focused_tests()) qdel(test) +/// Builds (and returns) a list of atoms that we shouldn't initialize in generic testing, like Create and Destroy. +/// It is appreciated to add the reason why the atom shouldn't be initialized if you add it to this list. +/datum/unit_test/proc/build_list_of_uncreatables() + RETURN_TYPE(/list) + var/list/returnable_list = list() + // The following are just generic, singular types. + returnable_list = list( + //Never meant to be created, errors out the ass for mobcode reasons + /mob/living/carbon, + //And another + /obj/item/slimecross/recurring, + //This should be obvious + /obj/machinery/doomsday_device, + //Yet more templates + /obj/machinery/restaurant_portal, + //Template type + /obj/effect/mob_spawn, + //Template type + /obj/structure/holosign/robot_seat, + //Singleton + /mob/dview, + //Template type + /obj/item/bodypart, + //This is meant to fail extremely loud every single time it occurs in any environment in any context, and it falsely alarms when this unit test iterates it. Let's not spawn it in. + /obj/merge_conflict_marker, + //briefcase launchpads erroring + /obj/machinery/launchpad/briefcase, + //Both are abstract types meant to scream bloody murder if spawned in raw + /obj/item/organ/external, + /obj/item/organ/external/wings, + ) + + // Everything that follows is a typesof() check. + + //Say it with me now, type template + returnable_list += typesof(/obj/effect/mapping_helpers) + //This turf existing is an error in and of itself + returnable_list += typesof(/turf/baseturf_skipover) + returnable_list += typesof(/turf/baseturf_bottom) + //This demands a borg, so we'll let if off easy + returnable_list += typesof(/obj/item/modular_computer/pda/silicon) + //This one demands a computer, ditto + returnable_list += typesof(/obj/item/modular_computer/processor) + //Very finiky, blacklisting to make things easier + returnable_list += typesof(/obj/item/poster/wanted) + //This expects a seed, we can't pass it + returnable_list += typesof(/obj/item/food/grown) + //Needs clients / mobs to observe it to exist. Also includes hallucinations. + returnable_list += typesof(/obj/effect/client_image_holder) + //Same to above. Needs a client / mob / hallucination to observe it to exist. + returnable_list += typesof(/obj/projectile/hallucination) + returnable_list += typesof(/obj/item/hallucinated) + //We don't have a pod + returnable_list += typesof(/obj/effect/pod_landingzone_effect) + returnable_list += typesof(/obj/effect/pod_landingzone) + //We have a baseturf limit of 10, adding more than 10 baseturf helpers will kill CI, so here's a future edge case to fix. + returnable_list += typesof(/obj/effect/baseturf_helper) + //No tauma to pass in + returnable_list += typesof(/mob/camera/imaginary_friend) + //No pod to gondola + returnable_list += typesof(/mob/living/simple_animal/pet/gondola/gondolapod) + //No heart to give + returnable_list += typesof(/obj/structure/ethereal_crystal) + //No linked console + returnable_list += typesof(/mob/camera/ai_eye/remote/base_construction) + //See above + returnable_list += typesof(/mob/camera/ai_eye/remote/shuttle_docker) + //Hangs a ref post invoke async, which we don't support. Could put a qdeleted check but it feels hacky + returnable_list += typesof(/obj/effect/anomaly/grav/high) + //See above + returnable_list += typesof(/obj/effect/timestop) + //Invoke async in init, skippppp + returnable_list += typesof(/mob/living/silicon/robot/model) + //This lad also sleeps + returnable_list += typesof(/obj/item/hilbertshotel) + //this boi spawns turf changing stuff, and it stacks and causes pain. Let's just not + returnable_list += typesof(/obj/effect/sliding_puzzle) + //Stacks baseturfs, can't be tested here + returnable_list += typesof(/obj/effect/temp_visual/lava_warning) + //Stacks baseturfs, can't be tested here + returnable_list += typesof(/obj/effect/landmark/ctf) + //Our system doesn't support it without warning spam from unregister calls on things that never registered + returnable_list += typesof(/obj/docking_port) + //Asks for a shuttle that may not exist, let's leave it alone + returnable_list += typesof(/obj/item/pinpointer/shuttle) + //This spawns beams as a part of init, which can sleep past an async proc. This hangs a ref, and fucks us. It's only a problem here because the beam sleeps with CHECK_TICK + returnable_list += typesof(/obj/structure/alien/resin/flower_bud) + //Needs a linked mecha + returnable_list += typesof(/obj/effect/skyfall_landingzone) + //Expects a mob to holderize, we have nothing to give + returnable_list += typesof(/obj/item/clothing/head/mob_holder) + //Needs cards passed into the initilazation args + returnable_list += typesof(/obj/item/toy/cards/cardhand) + //Needs a holodeck area linked to it which is not guarenteed to exist and technically is supposed to have a 1:1 relationship with computer anyway. + returnable_list += typesof(/obj/machinery/computer/holodeck) + //runtimes if not paired with a landmark + returnable_list += typesof(/obj/structure/industrial_lift) + // Runtimes if the associated machinery does not exist, but not the base type + returnable_list += subtypesof(/obj/machinery/airlock_controller) + // Always ought to have an associated escape menu. Any references it could possibly hold would need one regardless. + returnable_list += subtypesof(/atom/movable/screen/escape_menu) + // Can't spawn openspace above nothing, it'll get pissy at me + returnable_list += typesof(/turf/open/space/openspace) + returnable_list += typesof(/turf/open/openspace) + + return returnable_list + /proc/RunUnitTests() CHECK_TICK @@ -225,15 +338,18 @@ GLOBAL_VAR_INIT(focused_tests, focused_tests()) var/list/test_results = list() + //Hell code, we're bound to end the round somehow so let's stop if from ending while we work + SSticker.delay_end = TRUE for(var/unit_path in tests_to_run) CHECK_TICK //We check tick first because the unit test we run last may be so expensive that checking tick will lock up this loop forever RunUnitTest(unit_path, test_results) + SSticker.delay_end = FALSE var/file_name = "data/unit_tests.json" fdel(file_name) file(file_name) << json_encode(test_results) - SSticker.force_ending = TRUE + SSticker.force_ending = ADMIN_FORCE_END_ROUND //We have to call this manually because del_text can preceed us, and SSticker doesn't fire in the post game SSticker.declare_completion() diff --git a/code/modules/unit_tests/weird_food.dm b/code/modules/unit_tests/weird_food.dm new file mode 100644 index 0000000000000..5c97c343adf33 --- /dev/null +++ b/code/modules/unit_tests/weird_food.dm @@ -0,0 +1,40 @@ +/// Unit test to ensure that moths can eat t-shirts successfully +/datum/unit_test/moth_food + +/datum/unit_test/moth_food/Run() + var/obj/item/clothing/suit/armor/bulletproof/light_snack = allocate(/obj/item/clothing/suit/armor/bulletproof) + light_snack.create_moth_snack() + var/datum/component/edible/eatability = light_snack.moth_snack.GetComponent(/datum/component/edible) + eatability.eat_time = 0 + + var/mob/living/carbon/human/species/moth/gourmet = allocate(/mob/living/carbon/human/species/moth) + gourmet.nutrition = 0 // We need to be sufficiently hungry + gourmet.put_in_active_hand(light_snack) + + var/times_to_bite = round(light_snack.max_integrity / MOTH_EATING_CLOTHING_DAMAGE) + 1 + for (var/i in 1 to times_to_bite) + TEST_ASSERT(!QDELETED(light_snack), "Moth finished eating clothes faster than expected.") + light_snack.attack(gourmet, gourmet) + TEST_ASSERT(QDELETED(light_snack), "Moth failed to finish eating clothing.") + +/// Unit test to ensure that golems can eat rocks successfully +/datum/unit_test/golem_food + +/datum/unit_test/golem_food/Run() + var/obj/item/stack/sheet/mineral/uranium/five/dinner = allocate(/obj/item/stack/sheet/mineral/uranium/five) + var/datum/component/golem_food/golem_food_data = dinner.GetComponent(/datum/component/golem_food) + golem_food_data.create_golem_snack(dinner) + var/datum/component/edible/eatability = golem_food_data.golem_snack.GetComponent(/datum/component/edible) + eatability.eat_time = 0 + + var/mob/living/carbon/human/species/golem/rock_enjoyer = allocate(/mob/living/carbon/human/species/golem) + rock_enjoyer.nutrition = 0 // We need to be sufficiently hungry + rock_enjoyer.put_in_active_hand(dinner) + + var/status_applied = golem_food_data.snack_type.status_effect + var/times_to_bite = dinner.amount + for (var/i in 1 to times_to_bite) + TEST_ASSERT(!QDELETED(dinner), "Golem finished eating rocks faster than expected.") + dinner.attack(rock_enjoyer, rock_enjoyer) + TEST_ASSERT(QDELETED(dinner), "Golem failed to finish eating rocks.") + TEST_ASSERT(rock_enjoyer.has_status_effect(status_applied), "Golem didn't gain a food buff from eating its rocks.") diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 8d1607fd11967..2c060b6ff98e2 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -12,11 +12,13 @@ uplink_item.limited_stock = limited_stock if(uplink_item.cost >= 20) //Tough love for nuke ops discount *= 0.5 + uplink_item.stock_key = WEAKREF(uplink_item) uplink_item.category = category uplink_item.cost = max(round(uplink_item.cost * (1 - discount)),1) uplink_item.name += " ([round(((initial(uplink_item.cost)-uplink_item.cost)/initial(uplink_item.cost))*100)]% off!)" uplink_item.desc += " Normally costs [initial(uplink_item.cost)] TC. All sales final. [pick(disclaimer)]" uplink_item.item = taken_item.item + uplink_item.discounted = TRUE sales += uplink_item return sales @@ -35,8 +37,6 @@ var/desc = "item description" /// Path to the item to spawn. var/item = null - /// Alternative path for refunds, in case the item purchased isn't what is actually refunded (ie: holoparasites). - var/refund_path = null /// Cost of the item. var/cost = 0 /// Amount of TC to refund, in case there's a TC penalty for refunds. @@ -47,6 +47,8 @@ var/surplus = 100 /// Whether this can be discounted or not var/cant_discount = FALSE + /// If discounted, is true. Used to send a signal to update reimbursement. + var/discounted = FALSE /// If this value is changed on two items they will share stock, defaults to not sharing stock with any other item var/stock_key = UPLINK_SHARED_STOCK_UNIQUE /// How many items of this stock can be purchased. @@ -125,6 +127,8 @@ A = new spawn_path(get_turf(user)) else A = spawn_path + if(refundable) + A.AddElement(/datum/element/uplink_reimburse, (refund_amount ? refund_amount : cost)) if(ishuman(user) && isitem(A)) var/mob/living/carbon/human/H = user if(H.put_in_hands(A)) diff --git a/code/modules/uplink/uplink_items/ammunition.dm b/code/modules/uplink/uplink_items/ammunition.dm index 4ab974452515a..292f87ffe13b3 100644 --- a/code/modules/uplink/uplink_items/ammunition.dm +++ b/code/modules/uplink/uplink_items/ammunition.dm @@ -58,5 +58,5 @@ progression_minimum = 30 MINUTES item = /obj/item/ammo_box/a357 cost = 4 - purchasable_from = ~UPLINK_CLOWN_OPS + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) //nukies get their own version illegal_tech = FALSE diff --git a/code/modules/uplink/uplink_items/badass.dm b/code/modules/uplink/uplink_items/badass.dm index 2469fe22104bd..93087be9dd00e 100644 --- a/code/modules/uplink/uplink_items/badass.dm +++ b/code/modules/uplink/uplink_items/badass.dm @@ -90,3 +90,16 @@ desc = "Contains 8 random stickers precisely engineered to resemble suspicious objects, which may or may not be useful for fooling crew." item = /obj/item/storage/box/syndie_kit/stickers cost = 1 + +/datum/uplink_item/badass/demotivational_posters + name = "Syndicate Demotivational Poster Pack" + desc = "Contains a selection of demotivational posters to minimise productivity and maximise apathy in the workplace." + item = /obj/item/storage/box/syndie_kit/poster_box + cost = 1 + +/datum/uplink_item/badass/syndie_spraycan + name = "Syndicate Spraycan" + desc = "A stylish Syndicate spraycan. \ + Contains enough special solution to spray a single super-size seditious symbol, subjecting station staff to slippery suffering." + item = /obj/item/traitor_spraycan + cost = 1 diff --git a/code/modules/uplink/uplink_items/clownops.dm b/code/modules/uplink/uplink_items/clownops.dm new file mode 100644 index 0000000000000..b973869cf121b --- /dev/null +++ b/code/modules/uplink/uplink_items/clownops.dm @@ -0,0 +1,141 @@ + +// Clown Operative Stuff +// Maybe someday, someone will care to maintain this + +/datum/uplink_item/weapon_kits/pie_cannon + name = "Banana Cream Pie Cannon" + desc = "A special pie cannon for a special clown, this gadget can hold up to 20 pies and automatically fabricates one every two seconds!" + cost = 10 + item = /obj/item/pneumatic_cannon/pie/selfcharge + surplus = 0 + purchasable_from = UPLINK_CLOWN_OPS + +/datum/uplink_item/weapon_kits/bananashield + name = "Bananium Energy Shield" + desc = "A clown's most powerful defensive weapon, this personal shield provides near immunity to ranged energy attacks \ + by bouncing them back at the ones who fired them. It can also be thrown to bounce off of people, slipping them, \ + and returning to you even if you miss. WARNING: DO NOT ATTEMPT TO STAND ON SHIELD WHILE DEPLOYED, EVEN IF WEARING ANTI-SLIP SHOES." + item = /obj/item/shield/energy/bananium + cost = 16 + surplus = 0 + purchasable_from = UPLINK_CLOWN_OPS + +/datum/uplink_item/weapon_kits/clownsword + name = "Bananium Energy Sword" + desc = "An energy sword that deals no damage, but will slip anyone it contacts, be it by melee attack, thrown \ + impact, or just stepping on it. Beware friendly fire, as even anti-slip shoes will not protect against it." + item = /obj/item/melee/energy/sword/bananium + cost = 3 + surplus = 0 + purchasable_from = UPLINK_CLOWN_OPS + +/datum/uplink_item/weapon_kits/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/weapon_kits/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/weapon_kits/foamsmg + name = "Toy Submachine Gun" + desc = "A fully-loaded Donksoft bullpup submachine gun that fires riot grade darts with a 20-round magazine." + item = /obj/item/gun/ballistic/automatic/c20r/toy + cost = 5 + surplus = 0 + purchasable_from = UPLINK_CLOWN_OPS + +/datum/uplink_item/weapon_kits/foammachinegun + name = "Toy Machine Gun" + desc = "A fully-loaded Donksoft belt-fed machine gun. This weapon has a massive 50-round magazine of devastating \ + riot grade darts, that can briefly incapacitate someone in just one volley." + item = /obj/item/gun/ballistic/automatic/l6_saw/toy + cost = 10 + surplus = 0 + purchasable_from = UPLINK_CLOWN_OPS + +/datum/uplink_item/explosives/bombanana + name = "Bombanana" + desc = "A banana with an explosive taste! discard the peel quickly, as it will explode with the force of a Syndicate minibomb \ + a few seconds after the banana is eaten." + item = /obj/item/food/grown/banana/bombanana + cost = 4 //it is a bit cheaper than a minibomb because you have to take off your helmet to eat it, which is how you arm it + surplus = 0 + purchasable_from = UPLINK_CLOWN_OPS + +/datum/uplink_item/explosives/clown_bomb_clownops + name = "Clown Bomb" + desc = "The Clown bomb is a hilarious device capable of massive pranks. It has an adjustable timer, \ + with a minimum of %MIN_BOMB_TIMER seconds, and can be bolted to the floor with a wrench to prevent \ + movement. The bomb is bulky and cannot be moved; upon ordering this item, a smaller beacon will be \ + transported to you that will teleport the actual bomb to it upon activation. Note that this bomb can \ + be defused, and some crew may attempt to do so." + item = /obj/item/sbeacondrop/clownbomb + cost = 15 + surplus = 0 + purchasable_from = UPLINK_CLOWN_OPS + +/datum/uplink_item/explosives/clown_bomb_clownops/New() + . = ..() + desc = replacetext(desc, "%MIN_BOMB_TIMER", SYNDIEBOMB_MIN_TIMER_SECONDS) + +/datum/uplink_item/explosives/tearstache + name = "Teachstache Grenade" + desc = "A teargas grenade that launches sticky moustaches onto the face of anyone not wearing a clown or mime mask. The moustaches will \ + remain attached to the face of all targets for one minute, preventing the use of breath masks and other such devices." + item = /obj/item/grenade/chem_grenade/teargas/moustache + cost = 3 + surplus = 0 + purchasable_from = UPLINK_CLOWN_OPS + +/datum/uplink_item/explosives/pinata + name = "Weapons Grade Pinata Kit" + desc = "A pinata filled with both candy and explosives as well as two belts to carry them on, crack it open and see what you get!" + item = /obj/item/storage/box/syndie_kit/pinata + purchasable_from = UPLINK_CLOWN_OPS + limited_stock = 1 + cost = 12 //This is effectively the clown ops version of the grenadier belt where you should on average get 8 explosives if you use a weapon with exactly 10 force. + surplus = 0 + +/datum/uplink_item/reinforcement/clown_reinforcement + name = "Clown Reinforcements" + desc = "Call in an additional clown to share the fun, equipped with full starting gear, but no telecrystals." + item = /obj/item/antag_spawner/nuke_ops/clown + cost = 20 + purchasable_from = UPLINK_CLOWN_OPS + restricted = TRUE + refundable = TRUE + +/datum/uplink_item/mech/honker + name = "Dark H.O.N.K." + desc = "A clown combat mech equipped with bombanana peel and tearstache grenade launchers, as well as the ubiquitous HoNkER BlAsT 5000." + item = /obj/vehicle/sealed/mecha/honker/dark/loaded + cost = 80 + purchasable_from = UPLINK_CLOWN_OPS + +/datum/uplink_item/stealthy_tools/combatbananashoes + name = "Combat Banana Shoes" + desc = "While making the wearer immune to most slipping attacks like regular combat clown shoes, these shoes \ + can generate a large number of synthetic banana peels as the wearer walks, slipping up would-be pursuers. They also \ + squeak significantly louder." + item = /obj/item/clothing/shoes/clown_shoes/banana_shoes/combat + cost = 6 + surplus = 0 + purchasable_from = UPLINK_CLOWN_OPS + +/datum/uplink_item/badass/clownopclumsinessinjector //clowns can buy this too, but it's in the role-restricted items section for them + name = "Clumsiness Injector" + desc = "Inject yourself with this to become as clumsy as a clown... or inject someone ELSE with it to make THEM as clumsy as a clown. Useful for clown operatives who wish to reconnect with their former clownish nature or for clown operatives who wish to torment and play with their prey before killing them." + item = /obj/item/dnainjector/clumsymut + cost = 1 + purchasable_from = UPLINK_CLOWN_OPS + illegal_tech = FALSE + diff --git a/code/modules/uplink/uplink_items/dangerous.dm b/code/modules/uplink/uplink_items/dangerous.dm index 0c14c302b5ef3..0cdcf3a7bb7f6 100644 --- a/code/modules/uplink/uplink_items/dangerous.dm +++ b/code/modules/uplink/uplink_items/dangerous.dm @@ -68,7 +68,7 @@ item = /obj/item/dualsaber cost = 16 - purchasable_from = ~UPLINK_CLOWN_OPS + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) //nukies get their own version /datum/uplink_item/dangerous/doublesword/get_discount_value(discount_type) switch(discount_type) @@ -89,6 +89,7 @@ surplus = 0 purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) restricted = TRUE + refundable = TRUE /datum/uplink_item/dangerous/revolver name = "Syndicate Revolver" @@ -97,4 +98,4 @@ progression_minimum = 30 MINUTES cost = 13 surplus = 50 - purchasable_from = ~UPLINK_CLOWN_OPS + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) //nukies get their own version diff --git a/code/modules/uplink/uplink_items/device_tools.dm b/code/modules/uplink/uplink_items/device_tools.dm index daf9515fb09dd..0fd5aa35b781b 100644 --- a/code/modules/uplink/uplink_items/device_tools.dm +++ b/code/modules/uplink/uplink_items/device_tools.dm @@ -83,11 +83,10 @@ item = /obj/item/storage/box/syndie_kit/syndicate_teleporter cost = 8 -/datum/uplink_item/device_tools/camera_bug - name = "Camera Bug" - desc = "Enables you to view all cameras on the main network, set up motion alerts and track a target. \ - Bugging cameras allows you to disable them remotely." - item = /obj/item/camera_bug +/datum/uplink_item/device_tools/camera_app + name = "SyndEye Program" + desc = "A data disk containing a unique PC app that allows you to watch cameras and track crewmembers." + item = /obj/item/computer_disk/syndicate/camera_app cost = 1 surplus = 90 purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) @@ -254,6 +253,19 @@ desc = "When screwed to wiring attached to a power grid and activated, this large device lights up and places excessive \ load on the grid, causing a station-wide blackout. The sink is large and cannot be stored in most \ traditional bags and boxes. Caution: Will explode if the powernet contains sufficient amounts of energy." - progression_minimum = 30 MINUTES + progression_minimum = 20 MINUTES item = /obj/item/powersink cost = 11 + +/datum/uplink_item/device_tools/syndicate_contacts + name = "Polarized Contact Lenses" + desc = "High tech contact lenses that bind directly with the surface of your eyes to give them immunity to flashes and \ + bright lights. Effective, affordable, and nigh undetectable." + item = /obj/item/syndicate_contacts + cost = 3 + +/datum/uplink_item/device_tools/syndicate_climbing_hook + name = "Syndicate Climbing Hook" + desc = "High-tech rope, a refined hook structure, the peak of climbing technology. Only useful for climbing up holes, provided the operation site has any." + item = /obj/item/climbing_hook/syndicate + cost = 1 diff --git a/code/modules/uplink/uplink_items/implant.dm b/code/modules/uplink/uplink_items/implant.dm index 34fc9eedb0ff1..87c9fd6c96c07 100644 --- a/code/modules/uplink/uplink_items/implant.dm +++ b/code/modules/uplink/uplink_items/implant.dm @@ -9,11 +9,14 @@ /datum/uplink_item/implants/freedom name = "Freedom Implant" - desc = "An implant injected into the body and later activated at the user's will. It will attempt to free the \ - user from common restraints such as handcuffs." + desc = "Can be activated to release common restraints such as handcuffs, legcuffs, and even bolas tethered around the legs." item = /obj/item/storage/box/syndie_kit/imp_freedom cost = 5 +/datum/uplink_item/implants/freedom/New() + . = ..() + desc += " Implant has enough energy for [FREEDOM_IMPLANT_CHARGES] uses before it becomes inert and harmlessly self-destructs." + /datum/uplink_item/implants/radio name = "Internal Syndicate Radio Implant" desc = "An implant injected into the body, allowing the use of an internal Syndicate radio. \ diff --git a/code/modules/uplink/uplink_items/job.dm b/code/modules/uplink/uplink_items/job.dm index 32788fad16944..6dcd48dee839c 100644 --- a/code/modules/uplink/uplink_items/job.dm +++ b/code/modules/uplink/uplink_items/job.dm @@ -87,7 +87,7 @@ 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." 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_ROBOTICIST, JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST, JOB_CORONER, JOB_MEDICAL_DOCTOR, JOB_CHIEF_MEDICAL_OFFICER) surplus = 0 /datum/uplink_item/role_restricted/explosive_hot_potato @@ -144,7 +144,7 @@ desc = "A disposable sentry gun deployment system cleverly disguised as a toolbox, apply wrench for functionality." item = /obj/item/storage/toolbox/emergency/turret cost = 11 - restricted_roles = list(JOB_STATION_ENGINEER) + restricted_roles = list(JOB_STATION_ENGINEER, JOB_CHIEF_ENGINEER) /datum/uplink_item/role_restricted/magillitis_serum name = "Magillitis Serum Autoinjector" @@ -169,10 +169,20 @@ desc = "A disk containing the procedure to perform a brainwashing surgery, allowing you to implant an objective onto a target. \ Insert into an Operating Console to enable the procedure." item = /obj/item/disk/surgery/brainwashing - restricted_roles = list(JOB_MEDICAL_DOCTOR, JOB_CHIEF_MEDICAL_OFFICER, JOB_ROBOTICIST) + restricted_roles = list(JOB_MEDICAL_DOCTOR, JOB_CHIEF_MEDICAL_OFFICER, JOB_CORONER, JOB_ROBOTICIST) cost = 5 surplus = 50 +/datum/uplink_item/role_restricted/advanced_plastic_surgery + name = "Advanced Plastic Surgery Program" + desc = "A bootleg copy of an collector item, this disk contains the procedure to perform advanced plastic surgery, allowing you to model someone's face and voice based on a picture taken by a camera on your offhand. \ + All changes are superficial and does not change ones genetic makeup. \ + Insert into an Operating Console to enable the procedure." + item = /obj/item/disk/surgery/brainwashing + restricted_roles = list(JOB_MEDICAL_DOCTOR, JOB_CHIEF_MEDICAL_OFFICER, JOB_ROBOTICIST) + cost = 1 + surplus = 50 + /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. \ @@ -325,3 +335,10 @@ 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) surplus = 5 + +/datum/uplink_item/role_restricted/evil_seedling + name = "Evil Seedling" + desc = "A rare seed we have recovered that grows into a dangerous species that will aid you with your tasks!" + item = /obj/item/seeds/seedling/evil + cost = 8 + restricted_roles = list(JOB_BOTANIST) diff --git a/code/modules/uplink/uplink_items/nukeops.dm b/code/modules/uplink/uplink_items/nukeops.dm index 9d2a32d92ae5e..be7c163bd861d 100644 --- a/code/modules/uplink/uplink_items/nukeops.dm +++ b/code/modules/uplink/uplink_items/nukeops.dm @@ -1,649 +1,577 @@ -/datum/uplink_item/bundles_tc/bulldog - name = "Bulldog bundle" - desc = "Lean and mean: Optimized for people that want to get up close and personal. Contains the popular \ - Bulldog shotgun, two 12g buckshot drums, and a pair of Thermal imaging goggles." - item = /obj/item/storage/backpack/duffelbag/syndie/bulldogbundle - cost = 13 // normally 16 - purchasable_from = UPLINK_NUKE_OPS +// Nuclear Operative Weapons and Ammunition -/datum/uplink_item/bundles_tc/c20r - name = "C-20r bundle" - desc = "Old Faithful: The classic C-20r, bundled with two magazines and a suppressor at discount price." - item = /obj/item/storage/backpack/duffelbag/syndie/c20rbundle - cost = 14 // normally 16 - purchasable_from = UPLINK_NUKE_OPS +/datum/uplink_category/weapon_kits + name = "Weapon Kits (Recommended)" + weight = 30 -/datum/uplink_item/bundles_tc/cyber_implants - name = "Cybernetic Implants Bundle" - desc = "A random selection of cybernetic implants. Guaranteed 5 high quality implants. Comes with an autosurgeon." - item = /obj/item/storage/box/cyber_implants - cost = 40 +/datum/uplink_item/weapon_kits + category = /datum/uplink_category/weapon_kits + surplus = 40 purchasable_from = UPLINK_NUKE_OPS -/datum/uplink_item/bundles_tc/medical - name = "Medical bundle" - 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 magboot MODsuit module to rescue your friends in no-gravity environments." - item = /obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle - cost = 25 // normally 31 - purchasable_from = UPLINK_NUKE_OPS +// ~~ Ammunition Categories ~~ -/datum/uplink_item/bundles_tc/sniper - name = "Sniper bundle" - desc = "Elegant and refined: Contains a collapsed sniper rifle in an expensive carrying case, \ - two .50 BMG disruptor magazines, a free suppressor, and a sharp-looking tactical turtleneck suit. \ - We'll throw in a free red tie if you order NOW." - item = /obj/item/storage/briefcase/sniperbundle - cost = 20 // normally 27, the suit and office supplies are free! - purchasable_from = UPLINK_NUKE_OPS +/datum/uplink_category/ammo_nuclear + name = "Additional and Unique Ammunition" + weight = 29 -/datum/uplink_item/bundles_tc/firestarter - name = "Spetsnaz Pyro bundle" - desc = "For systematic suppression of carbon lifeforms in close quarters: Contains an Elite MODsuit with a flamethrower attachment, \ - Stechkin APS machine pistol, two incendiary magazines, a minibomb and a stimulant syringe. \ - Order NOW and comrade Boris will throw in an extra tracksuit." - item = /obj/item/storage/backpack/duffelbag/syndie/firestarter - cost = 30 +/datum/uplink_item/ammo_nuclear + category = /datum/uplink_category/ammo_nuclear + surplus = 40 purchasable_from = UPLINK_NUKE_OPS -/datum/uplink_item/bundles_tc/induction_kit - name = "Syndicate Induction Kit" - desc = "Met a fellow syndicate agent on the station? Kept some TC in reserve just in case? Or are you communicating with one via the Syndicate channel? \ - Get this kit and you'll be able to induct them into your operative team via a special implant. \ - Additionally, it contains an assortment of useful gear for new operatives, including a space suit, an Ansem pistol, two spare magazines, and more! \ - *NOT* for usage with Reinforcements, and does not brainwash the target!" - item = /obj/item/storage/box/syndie_kit/induction_kit - cost = 10 - purchasable_from = UPLINK_NUKE_OPS +// Basic: Run of the mill ammunition for various firearms +/datum/uplink_item/ammo_nuclear/basic + cost = 2 -/datum/uplink_item/dangerous/rawketlawnchair - name = "84mm Rocket Propelled Grenade Launcher" - desc = "A reusable rocket propelled grenade launcher preloaded with a low-yield 84mm HE round. \ - Guaranteed to send your target out with a bang or your money back!" - item = /obj/item/gun/ballistic/rocketlauncher - cost = 8 - surplus = 30 - purchasable_from = UPLINK_NUKE_OPS +// Armor Penetrating: strong into armor, low damage +/datum/uplink_item/ammo_nuclear/ap + cost = 4 -/datum/uplink_item/dangerous/pie_cannon - name = "Banana Cream Pie Cannon" - desc = "A special pie cannon for a special clown, this gadget can hold up to 20 pies and automatically fabricates one every two seconds!" - cost = 10 - item = /obj/item/pneumatic_cannon/pie/selfcharge - surplus = 0 - purchasable_from = UPLINK_CLOWN_OPS - -/datum/uplink_item/dangerous/bananashield - name = "Bananium Energy Shield" - desc = "A clown's most powerful defensive weapon, this personal shield provides near immunity to ranged energy attacks \ - by bouncing them back at the ones who fired them. It can also be thrown to bounce off of people, slipping them, \ - and returning to you even if you miss. WARNING: DO NOT ATTEMPT TO STAND ON SHIELD WHILE DEPLOYED, EVEN IF WEARING ANTI-SLIP SHOES." - item = /obj/item/shield/energy/bananium - cost = 16 - surplus = 0 - purchasable_from = UPLINK_CLOWN_OPS +// Hollow Point: weak into armor, high damage +/datum/uplink_item/ammo_nuclear/hp + cost = 4 -/datum/uplink_item/dangerous/clownsword - name = "Bananium Energy Sword" - desc = "An energy sword that deals no damage, but will slip anyone it contacts, be it by melee attack, thrown \ - impact, or just stepping on it. Beware friendly fire, as even anti-slip shoes will not protect against it." - item = /obj/item/melee/energy/sword/bananium +// Incendiary: sets target on fire, does less damage +/datum/uplink_item/ammo_nuclear/incendiary cost = 3 - 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 +// Special: does something particularly extra than just any of the above +/datum/uplink_item/ammo_nuclear/special + cost = 5 -/datum/uplink_item/dangerous/shotgun - name = "Bulldog Shotgun" - desc = "A fully-loaded semi-automatic drum-fed shotgun, complete with a secondary magazine. Compatible with all 12g rounds. Designed for close \ - quarter anti-personnel engagements." - item = /obj/item/gun/ballistic/shotgun/bulldog - cost = 8 - surplus = 40 - purchasable_from = UPLINK_NUKE_OPS +// ~~ Weapon Categories ~~ -/datum/uplink_item/dangerous/smg - name = "C-20r Submachine Gun" - desc = "A fully-loaded Scarborough Arms bullpup submachine gun. The C-20r fires .45 rounds with a \ - 24-round magazine and is compatible with suppressors." - item = /obj/item/gun/ballistic/automatic/c20r - cost = 13 +//Low-cost firearms: Around 8 TC each. Meant for easy squad weapon purchases + +/datum/uplink_item/weapon_kits/low_cost + cost = 8 surplus = 40 purchasable_from = UPLINK_NUKE_OPS -/datum/uplink_item/dangerous/shield - name = "Energy Shield" - desc = "An incredibly useful personal shield projector, capable of reflecting energy projectiles and defending \ - against other attacks. Pair with an Energy Sword for a killer combination." - item = /obj/item/shield/energy - cost = 16 - surplus = 20 - purchasable_from = UPLINK_NUKE_OPS +// ~~ Bulldog Shotgun ~~ -/datum/uplink_item/dangerous/machinegun - name = "L6 Squad Automatic Weapon" - desc = "A fully-loaded Aussec Armoury belt-fed machine gun. \ - This deadly weapon has a massive 50-round magazine of devastating 7.12x82mm ammunition." - item = /obj/item/gun/ballistic/automatic/l6_saw - cost = 18 - surplus = 0 - purchasable_from = UPLINK_NUKE_OPS +/datum/uplink_item/weapon_kits/low_cost/shotgun + name = "Bulldog Shotgun Case (Moderate)" + desc = "A fully-loaded semi-automatic drum-fed shotgun, complete with a secondary magazine you can hotswap. The gun has a handy label to explain how. \ + Compatible with all 12g rounds. Designed for close quarter anti-personnel engagements. Comes with three spare magazines." + item = /obj/item/storage/toolbox/guncase/bulldog -/datum/uplink_item/dangerous/carbine - name = "M-90gl Carbine" - desc = "A fully-loaded, specialized three-round burst carbine that fires 5.56mm ammunition from a 30 round magazine \ - with a 40mm underbarrel grenade launcher. Use secondary-fire to fire the grenade launcher." - item = /obj/item/gun/ballistic/automatic/m90 - cost = 14 - surplus = 50 - purchasable_from = UPLINK_NUKE_OPS +/datum/uplink_item/ammo_nuclear/basic/buck + name = "12g Buckshot Drum (Bulldog)" + desc = "An additional 8-round buckshot magazine for use with the Bulldog shotgun. Front towards enemy." + item = /obj/item/ammo_box/magazine/m12g -/datum/uplink_item/dangerous/sniper - name = "Anti-Materiel Sniper Rifle" - desc = "An outdated, but still extremely powerful anti-material sniper rifle. Fires .50 BMG cartridges from a 6 round magazine. \ - Can be fitted with a suppressor. If anyone asks how that even works, tell them it's Nanotrasen's fault." - item = /obj/item/gun/ballistic/rifle/sniper_rifle/syndicate - cost = 16 - surplus = 25 - purchasable_from = UPLINK_NUKE_OPS +/datum/uplink_item/ammo_nuclear/basic/slug + name = "12g Slug Drum (Bulldog)" + desc = "An additional 8-round slug magazine for use with the Bulldog shotgun. \ + Now 8 times less likely to shoot your pals." + item = /obj/item/ammo_box/magazine/m12g/slug -/datum/uplink_item/dangerous/pistol_nukeop - name = "Ansem Pistol" - desc = "A small, easily concealable handgun that uses 10mm auto rounds in 8-round magazines and is compatible \ - with suppressors." - item = /obj/item/gun/ballistic/automatic/pistol/clandestine - cost = 6 +/datum/uplink_item/ammo_nuclear/incendiary/dragon + name = "12g Dragon's Breath Drum (Bulldog)" + desc = "An alternative 8-round dragon's breath magazine for use in the Bulldog shotgun. \ + 'I'm a fire starter, twisted fire starter!'" + item = /obj/item/ammo_box/magazine/m12g/dragon purchasable_from = UPLINK_NUKE_OPS -/datum/uplink_item/dangerous/surplus_smg - name = "Surplus SMG" - desc = "A horribly outdated automatic weapon. Why would you want to use this?" - item = /obj/item/gun/ballistic/automatic/plastikov - cost = 2 +/datum/uplink_item/ammo_nuclear/special/meteor + name = "12g Meteorslug Shells (Bulldog)" + desc = "An alternative 8-round meteorslug magazine for use in the Bulldog shotgun. \ + Great for blasting holes into the hull and knocking down enemies." + item = /obj/item/ammo_box/magazine/m12g/meteor purchasable_from = UPLINK_NUKE_OPS -/datum/uplink_item/dangerous/foamsmg - name = "Toy Submachine Gun" - desc = "A fully-loaded Donksoft bullpup submachine gun that fires riot grade darts with a 20-round magazine." - item = /obj/item/gun/ballistic/automatic/c20r/toy - cost = 5 - surplus = 0 - purchasable_from = UPLINK_CLOWN_OPS +// ~~ Ansem Pistol ~~ -/datum/uplink_item/dangerous/foammachinegun - name = "Toy Machine Gun" - desc = "A fully-loaded Donksoft belt-fed machine gun. This weapon has a massive 50-round magazine of devastating \ - riot grade darts, that can briefly incapacitate someone in just one volley." - item = /obj/item/gun/ballistic/automatic/l6_saw/toy - cost = 10 - surplus = 0 - purchasable_from = UPLINK_CLOWN_OPS - -/datum/uplink_item/stealthy_weapons/cqc - name = "CQC Manual" - desc = "A manual that teaches a single user tactical Close-Quarters Combat before self-destructing." - item = /obj/item/book/granter/martial/cqc - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS - cost = 13 - surplus = 0 +/datum/uplink_item/weapon_kits/low_cost/clandestine + name = "Ansem Pistol Case (Easy/Spare)" + desc = "A small, easily concealable handgun that uses 10mm auto rounds in 8-round magazines and is compatible \ + with suppressors. Comes with three spare magazines." + item = /obj/item/storage/toolbox/guncase/clandestine -/datum/uplink_item/ammo/pistol_nukeop - name = "10mm Handgun Magazine" +/datum/uplink_item/ammo_nuclear/basic/m10mm + name = "10mm Handgun Magazine (Ansem)" desc = "An additional 8-round 10mm magazine, compatible with the Ansem pistol." item = /obj/item/ammo_box/magazine/m10mm - cost = 2 - purchasable_from = UPLINK_NUKE_OPS -/datum/uplink_item/ammo/pistolap_nukeop - name = "10mm Armour Piercing Magazine" +/datum/uplink_item/ammo_nuclear/ap/m10mm + name = "10mm Armour Piercing Magazine (Ansem)" desc = "An additional 8-round 10mm magazine, compatible with the Ansem pistol. \ - These rounds are less effective at injuring the target but penetrate protective gear." + These rounds are less effective at injuring the target but penetrate protective gear." item = /obj/item/ammo_box/magazine/m10mm/ap - cost = 3 - purchasable_from = UPLINK_NUKE_OPS -/datum/uplink_item/ammo/pistolhp_nukeop - name = "10mm Hollow Point Magazine" +/datum/uplink_item/ammo_nuclear/hp/m10mm + name = "10mm Hollow Point Magazine (Ansem)" desc = "An additional 8-round 10mm magazine, compatible with the Ansem pistol. \ - These rounds are more damaging but ineffective against armour." + These rounds are more damaging but ineffective against armour." item = /obj/item/ammo_box/magazine/m10mm/hp - cost = 3 - purchasable_from = UPLINK_NUKE_OPS -/datum/uplink_item/ammo/pistolfire_nukeop - name = "10mm Incendiary Magazine" +/datum/uplink_item/ammo_nuclear/incendiary/m10mm + name = "10mm Incendiary Magazine (Ansem)" desc = "An additional 8-round 10mm magazine, compatible with the Ansem pistol. \ - Loaded with incendiary rounds which inflict less damage, but ignite the target." + Loaded with incendiary rounds which inflict less damage, but ignite the target." item = /obj/item/ammo_box/magazine/m10mm/fire - cost = 2 - purchasable_from = UPLINK_NUKE_OPS -/datum/uplink_item/ammo/shotgun - cost = 2 - purchasable_from = UPLINK_NUKE_OPS - -/datum/uplink_item/ammo/shotgun/bag - name = "12g Ammo Duffel Bag" - desc = "A duffel bag filled with enough 12g ammo to supply an entire team, at a discounted price." - item = /obj/item/storage/backpack/duffelbag/syndie/ammo/shotgun - cost = 12 - -/datum/uplink_item/ammo/shotgun/buck - name = "12g Buckshot Drum" - desc = "An additional 8-round buckshot magazine for use with the Bulldog shotgun. Front towards enemy." - item = /obj/item/ammo_box/magazine/m12g - -/datum/uplink_item/ammo/shotgun/slug - name = "12g Slug Drum" - desc = "An additional 8-round slug magazine for use with the Bulldog shotgun. \ - Now 8 times less likely to shoot your pals." - cost = 3 - item = /obj/item/ammo_box/magazine/m12g/slug - -/datum/uplink_item/ammo/shotgun/dragon - name = "12g Dragon's Breath Drum" - desc = "An alternative 8-round dragon's breath magazine for use in the Bulldog shotgun. \ - 'I'm a fire starter, twisted fire starter!'" - item = /obj/item/ammo_box/magazine/m12g/dragon - purchasable_from = UPLINK_NUKE_OPS +//Medium-cost: 14 TC each. Meant for more expensive purchases with a goal in mind. -/datum/uplink_item/ammo/shotgun/meteor - name = "12g Meteorslug Shells" - desc = "An alternative 8-round meteorslug magazine for use in the Bulldog shotgun. \ - Great for blasting holes into the hull and knocking down enemies." - item = /obj/item/ammo_box/magazine/m12g/meteor +/datum/uplink_item/weapon_kits/medium_cost + cost = 14 + surplus = 20 purchasable_from = UPLINK_NUKE_OPS -/datum/uplink_item/ammo/a40mm - name = "40mm Grenade Box" - desc = "A box of 40mm HE grenades for use with the M-90gl's under-barrel grenade launcher. \ - Your teammates will ask you to not shoot these down small hallways." - item = /obj/item/ammo_box/a40mm - cost = 6 - purchasable_from = UPLINK_NUKE_OPS +// ~~ C-20r Submachine Gun ~~ -/datum/uplink_item/ammo/smg/bag - name = ".45 Ammo Duffel Bag" - desc = "A duffel bag filled with enough .45 ammo to supply an entire team, at a discounted price." - item = /obj/item/storage/backpack/duffelbag/syndie/ammo/smg - cost = 20 //instead of 27 TC - purchasable_from = UPLINK_NUKE_OPS +/datum/uplink_item/weapon_kits/medium_cost/smg + name = "C-20r Submachine Gun Case (Easy)" + desc = "A fully-loaded Scarborough Arms bullpup submachine gun. The C-20r fires .45 rounds with a \ + 24-round magazine and is compatible with suppressors. Comes with spare three magazines." + item = /obj/item/storage/toolbox/guncase/c20r -/datum/uplink_item/ammo/smg - name = ".45 SMG Magazine" +/datum/uplink_item/ammo_nuclear/basic/smg + name = ".45 SMG Magazine (C-20r)" desc = "An additional 24-round .45 magazine suitable for use with the C-20r submachine gun." item = /obj/item/ammo_box/magazine/smgm45 - cost = 3 - purchasable_from = UPLINK_NUKE_OPS -/datum/uplink_item/ammo/smgap - name = ".45 Armor Piercing SMG Magazine" +/datum/uplink_item/ammo_nuclear/ap/smg + name = ".45 Armor Piercing SMG Magazine (C-20r)" desc = "An additional 24-round .45 magazine suitable for use with the C-20r submachine gun.\ - These rounds are less effective at injuring the target but penetrate protective gear." + These rounds are less effective at injuring the target but penetrate protective gear." item = /obj/item/ammo_box/magazine/smgm45/ap - cost = 5 - purchasable_from = UPLINK_NUKE_OPS -/datum/uplink_item/ammo/smgfire - name = ".45 Incendiary SMG Magazine" +/datum/uplink_item/ammo_nuclear/hp/smg + name = ".45 Hollow Point SMG Magazine (C-20r)" + desc = "An additional 24-round .45 magazine suitable for use with the C-20r submachine gun.\ + These rounds are more damaging but ineffective against armour." + item = /obj/item/ammo_box/magazine/smgm45/hp + +/datum/uplink_item/ammo_nuclear/incendiary/smg + name = ".45 Incendiary SMG Magazine (C-20r)" desc = "An additional 24-round .45 magazine suitable for use with the C-20r submachine gun.\ - Loaded with incendiary rounds which inflict little damage, but ignite the target." + Loaded with incendiary rounds which inflict little damage, but ignite the target." item = /obj/item/ammo_box/magazine/smgm45/incen cost = 4 purchasable_from = UPLINK_NUKE_OPS -/datum/uplink_item/ammo/sniper +// ~~ Energy Sword and Shield ~~ + +/datum/uplink_item/weapon_kits/medium_cost/sword_and_board + name = "Energy Shield and Sword Case (Very Hard)" + desc = "A case containing an energy sword and energy shield. The shield is capable of deflecting \ + energy and laser projectiles, and the sword most forms of attack. Perfect for the enterprising nuclear knight. " + item = /obj/item/storage/toolbox/guncase/sword_and_board + +// ~~ Syndicate Revolver ~~ +// Nuclear operatives get a special deal on their revolver purchase compared to traitors. + +/datum/uplink_item/weapon_kits/medium_cost/revolvercase + name = "Syndicate Revolver Case (Moderate)" + desc = "Waffle Co.'s modernized Syndicate revolver. Fires 7 brutal rounds of .357 Magnum. \ + A classic operative weapon, brought to the modern era. Comes with 3 additional speedloaders of .357." + item = /obj/item/storage/toolbox/guncase/revolver + +/datum/uplink_item/ammo_nuclear/basic/revolver + name = ".357 Speed Loader (Revolver)" + 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. Operatives get a discount from most of our agents!" + item = /obj/item/ammo_box/a357 + +/datum/uplink_item/ammo_nuclear/special/revolver/phasic + name = ".357 Phasic Speed Loader (Revolver)" + desc = "A speed loader that contains seven additional .357 Magnum phasic rounds; usable with the Syndicate revolver. \ + These bullets are made from an experimental alloy, 'Ghost Lead', that allows it to pass through almost any non-organic material. \ + The name is a misnomer. It doesn't contain any lead whatsoever!" + item = /obj/item/ammo_box/a357/phasic + +/datum/uplink_item/ammo_nuclear/special/revolver/heartseeker + name = ".357 Heartseeker Speed Loader (Revolver)" + desc = "A speed loader that contains seven additional .357 Magnum heartseeker rounds; usable with the Syndicate revolver. \ + Able to veer straight into targets! Don't miss a shot with heartseeker! As seen in the hit NTFlik horror-space western film, Forget-Me-Not! \ + Brought to you by Roseus Galactic!" + item = /obj/item/ammo_box/a357/heartseeker cost = 3 + +// ~~ Grenade Launcher ~~ +// 'If god had wanted you to live, he would not have created ME!' + +/datum/uplink_item/weapon_kits/medium_cost/rawketlawnchair + name = "84mm Rocket Propelled Grenade Launcher (Hard)" + desc = "A reusable rocket propelled grenade launcher preloaded with a low-yield 84mm HE round. \ + Guaranteed to send your target out with a bang or your money back! Comes with a bouquet of additional rockets!" + item = /obj/item/storage/toolbox/guncase/rocketlauncher + +/datum/uplink_item/ammo_nuclear/basic/rocket + name = "84mm HE Rocket Bouquet (Rocket Launcher)" + desc = "Three low-yield anti-personnel HE rocket wrapped in a bundle. Gonna take you out in style!" + item = /obj/item/ammo_box/rocket + +/datum/uplink_item/ammo_nuclear/ap/rocket + name = "84mm HEAP Rocket (Rocket Launcher)" + desc = "A high-yield HEAP rocket; extremely effective against literally everything and anything near that thing that doesn't exist anymore. \ + Strike fear into the hearts of your enemies." + item = /obj/item/ammo_casing/rocket/heap + +//High-cost: 18 TC each. Really should only be coming out during war for how powerful it is, or be the majority of your TC outside of war. + +/datum/uplink_item/weapon_kits/high_cost + cost = 18 + surplus = 10 purchasable_from = UPLINK_NUKE_OPS -/datum/uplink_item/ammo/sniper/basic - name = ".50 BMG Magazine" +// ~~ L6 SAW Machine Gun ~~ + +/datum/uplink_item/weapon_kits/high_cost/machinegun + name = "L6 Squad Automatic Weapon (Moderate)" + desc = "A fully-loaded Aussec Armoury belt-fed machine gun. \ + This deadly weapon has a massive 50-round magazine of devastating 7mm ammunition." + item = /obj/item/gun/ballistic/automatic/l6_saw + +/datum/uplink_item/ammo_nuclear/basic/machinegun + name = "7mm Box Magazine (L6 SAW)" + desc = "A 50-round magazine of 7mm ammunition for use with the L6 SAW. \ + By the time you need to use this, you'll already be standing on a pile of corpses." + item = /obj/item/ammo_box/magazine/m7mm + +/datum/uplink_item/ammo_nuclear/ap/machinegun + name = "7mm (Armor Penetrating) Box Magazine (L6 SAW)" + desc = "A 50-round magazine of 7mm ammunition for use in the L6 SAW; equipped with special properties \ + to puncture even the most durable armor." + item = /obj/item/ammo_box/magazine/m7mm/ap + +/datum/uplink_item/ammo_nuclear/hp/machinegun + name = "7mm (Hollow-Point) Box Magazine (L6 SAW)" + desc = "A 50-round magazine of 7mm ammunition for use in the L6 SAW; equipped with hollow-point tips to help \ + with the unarmored masses of crew." + item = /obj/item/ammo_box/magazine/m7mm/hollow + +/datum/uplink_item/ammo_nuclear/incendiary/machinegun + name = "7mm (Incendiary) Box Magazine (L6 SAW)" + desc = "A 50-round magazine of 7mm ammunition for use in the L6 SAW; tipped with a special flammable \ + mixture that'll ignite anyone struck by the bullet. Some men just want to watch the world burn." + item = /obj/item/ammo_box/magazine/m7mm/incen + +/datum/uplink_item/ammo_nuclear/special/machinegun + name = "7mm (Match) Box Magazine (L6 SAW)" + desc = "A 50-round magazine of 7mm ammunition for use in the L6 SAW; you didn't know there was a demand for match grade \ + precision bullet hose ammo, but these rounds are finely tuned and perfect for ricocheting off walls all fancy-like." + item = /obj/item/ammo_box/magazine/m7mm/match + +// ~~ M-90gl Carbine ~~ + +/datum/uplink_item/weapon_kits/high_cost/carbine + name = "M-90gl Carbine Case (Hard)" + desc = "A fully-loaded, specialized three-round burst carbine that fires .223 ammunition from a 30 round magazine \ + with a 40mm underbarrel grenade launcher. Use secondary-fire to fire the grenade launcher. Comes with two spare magazines \ + and a box of 40mm rubber slugs." + item = /obj/item/storage/toolbox/guncase/m90gl + +/datum/uplink_item/ammo_nuclear/basic/carbine + name = ".223 Toploader Magazine (M-90gl)" + desc = "An additional 30-round .223 magazine; suitable for use with the M-90gl carbine. \ + These bullets pack less punch than 7mm rounds, but they still offer more power than .45 ammo due to their innate armour penetration." + item = /obj/item/ammo_box/magazine/m223 + +/datum/uplink_item/ammo_nuclear/special/carbine + name = ".223 Toploader Phasic Magazine (M-90gl)" + desc = "An additional 30-round .223 magazine; suitable for use with the M-90gl carbine. \ + These bullets are made from an experimental alloy, 'Ghost Lead', that allows it to pass through almost any non-organic material. \ + The name is a misnomer. It doesn't contain any lead whatsoever!" + item = /obj/item/ammo_box/magazine/m223/phasic + +/datum/uplink_item/ammo_nuclear/basic/carbine/a40mm + name = "40mm Grenade Box (M-90gl)" + desc = "A box of 40mm HE grenades for use with the M-90gl's under-barrel grenade launcher. \ + Your teammates will ask you to not shoot these down small hallways. \ + You'll do it anyway." + item = /obj/item/ammo_box/a40mm + +// ~~ Anti-Materiel Sniper Rifle ~~ + +/datum/uplink_item/weapon_kits/high_cost/sniper + name = "Anti-Materiel Sniper Rifle Briefcase (Hard)" + desc = "An outdated, but still extremely powerful anti-material sniper rifle. Fires .50 BMG cartridges from a 6 round magazine. \ + Can be fitted with a suppressor. If anyone asks how that even works, tell them it's Nanotrasen's fault. Comes with \ + 3 spare magazines; 2 regular magazines and 1 disruptor magazine. Also comes with a suit and tie." + item = /obj/item/storage/briefcase/sniper + +/datum/uplink_item/ammo_nuclear/basic/sniper + name = ".50 BMG Magazine (AMSR)" desc = "An additional standard 6-round magazine for use with .50 sniper rifles." item = /obj/item/ammo_box/magazine/sniper_rounds -/datum/uplink_item/ammo/sniper/surplusbox - name = ".50 BMG Surplus Magazine Box" +/datum/uplink_item/ammo_nuclear/basic/sniper/surplussniper + name = ".50 BMG Surplus Magazine Box (AMSR)" desc = "A box full of surplus .50 BMG magazines. Not as good as high quality magazines, \ - usually lacking the penetrative power and impact, but good enough to keep the gun firing. \ - Useful for arming a squad." - cost = 7 //1 TC per magazine - item = /obj/item/storage/box/syndie_kit/surplus + usually lacking the penetrative power and impact, but good enough to keep the gun firing. \ + Useful for arming a squad." + cost = 7 //1 TC per magazine, special price for a special deal! + item = /obj/item/storage/box/syndie_kit/sniper_surplus -/datum/uplink_item/ammo/sniper/penetrator - name = ".50 BMG Penetrator Magazine" +/datum/uplink_item/ammo_nuclear/ap/sniper/penetrator + name = ".50 BMG Penetrator Magazine (AMSR)" desc = "A 6-round magazine of penetrator ammo designed for use with .50 sniper rifles. \ - Can pierce walls and multiple enemies." + Can pierce walls and multiple enemies." item = /obj/item/ammo_box/magazine/sniper_rounds/penetrator - cost = 4 -/datum/uplink_item/ammo/sniper/incendiary - name = ".50 BMG Incendiary Magazine" +/datum/uplink_item/ammo_nuclear/incendiary/sniper + name = ".50 BMG Incendiary Magazine (AMSR)" desc = "A 6-round magazine of incendiary ammo. \ - Sets your enemies ablaze, along with everyone else next to them!" + Sets your enemies ablaze, along with everyone else next to them!" item = /obj/item/ammo_box/magazine/sniper_rounds/incendiary - cost = 4 -/datum/uplink_item/ammo/sniper/disruptor - name = ".50 BMG Disruptor Magazine" +/datum/uplink_item/ammo_nuclear/basic/sniper/disruptor + name = ".50 BMG Disruptor Magazine (AMSR)" desc = "A 6-round magazine of disruptor ammo designed for use with .50 sniper rifles. \ - Put your enemies and their alarm clock to sleep today!" + Put your enemies and their alarm clock to sleep today!" item = /obj/item/ammo_box/magazine/sniper_rounds/disruptor - cost = 4 -/datum/uplink_item/ammo/sniper/marksman - name = ".50 BMG Marksman Magazine" +/datum/uplink_item/ammo_nuclear/special/sniper/marksman + name = ".50 BMG Marksman Magazine (AMSR)" desc = "A 6-round magazine of marksman ammo designed for use with .50 sniper rifles. \ - Blast your enemies with instant shots! Just watch out for the rebound..." + Blast your enemies with instant shots! Just watch out for the rebound..." item = /obj/item/ammo_box/magazine/sniper_rounds/marksman - cost = 4 -/datum/uplink_item/ammo/carbine - name = "5.56mm Toploader Magazine" - desc = "An additional 30-round 5.56mm magazine; suitable for use with the M-90gl carbine. \ - These bullets pack less punch than 7.12x82mm rounds, but they still offer more power than .45 ammo due to their innate armour penetration." - item = /obj/item/ammo_box/magazine/m556 - cost = 4 - purchasable_from = UPLINK_NUKE_OPS - -/datum/uplink_item/ammo/carbinephase - name = "5.56mm Toploader Phasic Magazine" - desc = "An additional 30-round 5.56mm magazine; suitable for use with the M-90gl carbine. \ - These bullets are made from an experimental alloy, 'Ghost Lead', that allows it to pass through almost any non-organic material. \ - The name is a misnomer. It doesn't contain any lead whatsoever!" - item = /obj/item/ammo_box/magazine/m556/phasic - cost = 8 - purchasable_from = UPLINK_NUKE_OPS - -/datum/uplink_item/ammo/machinegun - cost = 6 +/datum/uplink_item/weapon_kits/high_cost/cqc + name = "CQC Equipment Case (Very Hard)" + desc = "Contains a manual that instructs you in the ways of CQC, or Close Quarters Combat. Comes with a stealth implant and a snazzy bandana (and a hat stabilizer to go with it)." + item = /obj/item/storage/toolbox/guncase/cqc + purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS surplus = 0 - purchasable_from = UPLINK_NUKE_OPS -/datum/uplink_item/ammo/machinegun/basic - name = "7.12x82mm Box Magazine" - desc = "A 50-round magazine of 7.12x82mm ammunition for use with the L6 SAW. \ - By the time you need to use this, you'll already be standing on a pile of corpses." - item = /obj/item/ammo_box/magazine/mm712x82 - -/datum/uplink_item/ammo/machinegun/ap - name = "7.12x82mm (Armor Penetrating) Box Magazine" - desc = "A 50-round magazine of 7.12x82mm ammunition for use in the L6 SAW; equipped with special properties \ - to puncture even the most durable armor." - item = /obj/item/ammo_box/magazine/mm712x82/ap - cost = 9 - -/datum/uplink_item/ammo/machinegun/hollow - name = "7.12x82mm (Hollow-Point) Box Magazine" - desc = "A 50-round magazine of 7.12x82mm ammunition for use in the L6 SAW; equipped with hollow-point tips to help \ - with the unarmored masses of crew." - item = /obj/item/ammo_box/magazine/mm712x82/hollow - -/datum/uplink_item/ammo/machinegun/incen - name = "7.12x82mm (Incendiary) Box Magazine" - desc = "A 50-round magazine of 7.12x82mm ammunition for use in the L6 SAW; tipped with a special flammable \ - mixture that'll ignite anyone struck by the bullet. Some men just want to watch the world burn." - item = /obj/item/ammo_box/magazine/mm712x82/incen - -/datum/uplink_item/ammo/machinegun/match - name = "7.12x82mm (Match) Box Magazine" - desc = "A 50-round magazine of 7.12x82mm ammunition for use in the L6 SAW; you didn't know there was a demand for match grade \ - precision bullet hose ammo, but these rounds are finely tuned and perfect for ricocheting off walls all fancy-like." - item = /obj/item/ammo_box/magazine/mm712x82/match - cost = 10 +/datum/uplink_item/weapon_kits/high_cost/doublesword + name = "Double-Energy Sword Case (Very Hard)" + desc = "A case containing a double-energy sword, anti-slip module, meth autoinjector, and a bar of soap. \ + Some say the most infamous nuclear operatives utilized this combination of equipment to slaughter hundreds \ + of Nanotrasen employees. However, some also say this is an embellishment from the Tiger Co-operative. \ + The soap did most of the work. Comes with a prisoner uniform so you fit the part." + item = /obj/item/storage/toolbox/guncase/doublesword -/datum/uplink_item/ammo/rocket - purchasable_from = UPLINK_NUKE_OPS +//Meme weapons: Literally just weapons used as a joke, shouldn't be particularly expensive. -/datum/uplink_item/ammo/rocket/basic - name = "84mm HE Rocket" - desc = "A low-yield anti-personnel HE rocket. Gonna take you out in style!" - item = /obj/item/ammo_casing/caseless/rocket - cost = 4 - -/datum/uplink_item/ammo/rocket/heap - name = "84mm HEAP Rocket" - desc = "A high-yield HEAP rocket; extremely effective against literally everything and anything near that thing that doesn't exist anymore. \ - Strike fear into the hearts of your enemies." - item = /obj/item/ammo_casing/caseless/rocket/heap - cost = 6 +/datum/uplink_item/weapon_kits/surplus_smg + name = "Surplus SMG Case (Flukie)" + desc = "A horribly outdated automatic weapon. Why would you want to use this? Comes with...rations." + item = /obj/item/gun/ballistic/automatic/plastikov + cost = 2 + purchasable_from = UPLINK_NUKE_OPS -/datum/uplink_item/ammo/surplus_smg - name = "Surplus SMG Magazine" +/datum/uplink_item/ammo_nuclear/surplus_smg + name = "Surplus SMG Magazine (Surplus)" desc = "A cylindrical magazine designed for the PP-95 SMG." item = /obj/item/ammo_box/magazine/plastikov9mm cost = 1 purchasable_from = UPLINK_NUKE_OPS illegal_tech = FALSE -/datum/uplink_item/ammo/mech/bag - name = "Mech Support Kit Bag" - desc = "A duffel bag containing ammo for four full reloads of the scattershotm which is equipped on standard Dark Gygax and Mauler exosuits. Also comes with some support equipment for maintaining the mech, including tools and an inducer." - item = /obj/item/storage/backpack/duffelbag/syndie/ammo/mech - cost = 4 - purchasable_from = UPLINK_NUKE_OPS - -/datum/uplink_item/ammo/mauler/bag - name = "Mauler Ammo Bag" - desc = "A duffel bag containing ammo for three full reloads of the LMG, scattershot carbine, and SRM-8 missile laucher that are equipped on a standard Mauler exosuit." - item = /obj/item/storage/backpack/duffelbag/syndie/ammo/mauler - cost = 6 - purchasable_from = UPLINK_NUKE_OPS +// Explosives and Grenades +// ~~ Grenades ~~ -/datum/uplink_item/explosives/bombanana - name = "Bombanana" - desc = "A banana with an explosive taste! discard the peel quickly, as it will explode with the force of a Syndicate minibomb \ - a few seconds after the banana is eaten." - item = /obj/item/food/grown/banana/bombanana - cost = 4 //it is a bit cheaper than a minibomb because you have to take off your helmet to eat it, which is how you arm it - surplus = 0 - purchasable_from = UPLINK_CLOWN_OPS - -/datum/uplink_item/explosives/clown_bomb_clownops - name = "Clown Bomb" - desc = "The Clown bomb is a hilarious device capable of massive pranks. It has an adjustable timer, \ - with a minimum of %MIN_BOMB_TIMER seconds, and can be bolted to the floor with a wrench to prevent \ - movement. The bomb is bulky and cannot be moved; upon ordering this item, a smaller beacon will be \ - transported to you that will teleport the actual bomb to it upon activation. Note that this bomb can \ - be defused, and some crew may attempt to do so." - item = /obj/item/sbeacondrop/clownbomb +/datum/uplink_item/explosives/grenades cost = 15 - surplus = 0 - purchasable_from = UPLINK_CLOWN_OPS - -/datum/uplink_item/explosives/clown_bomb_clownops/New() - . = ..() - desc = replacetext(desc, "%MIN_BOMB_TIMER", SYNDIEBOMB_MIN_TIMER_SECONDS) + surplus = 35 + purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS -/datum/uplink_item/explosives/buzzkill +/datum/uplink_item/explosives/grenades/buzzkill name = "Buzzkill Grenade Box" desc = "A box with three grenades that release a swarm of angry bees upon activation. These bees indiscriminately attack friend or foe \ - with random toxins. Courtesy of the BLF and Tiger Cooperative." + with random toxins. Courtesy of the BLF and Tiger Cooperative." item = /obj/item/storage/box/syndie_kit/bee_grenades - cost = 15 - surplus = 35 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS -/datum/uplink_item/explosives/virus_grenade - name = "Fungal Tuberculosis Grenade" +/datum/uplink_item/explosives/grenades/virus_grenade + name = "Fungal Tuberculosis Grenade Box" desc = "A primed bio-grenade packed into a compact box. Comes with five Bio Virus Antidote Kit (BVAK) \ - autoinjectors for rapid application on up to two targets each, a syringe, and a bottle containing \ - the BVAK solution." + autoinjectors for rapid application on up to two targets each, a syringe, and a bottle containing \ + the BVAK solution." item = /obj/item/storage/box/syndie_kit/tuberculosisgrenade - cost = 12 - surplus = 35 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS restricted = TRUE -/datum/uplink_item/explosives/grenadier - name = "Grenadier's belt" - desc = "A belt containing 26 lethally dangerous and destructive grenades. Comes with an extra multitool and screwdriver." - item = /obj/item/storage/belt/grenade/full +/datum/uplink_item/explosives/grenades/viscerators + name = "Viscerator Delivery Grenade Box" + desc = "A box containing unique grenades that deploys a swarm of viscerators upon activation, which will chase down and shred \ + any non-operatives in the area." + item = /obj/item/storage/box/syndie_kit/manhack_grenades + +// ~~ Grenadier's Belt Kit ~~ + +/datum/uplink_item/weapon_kits/high_cost/grenadier + name = "Grenadier's Belt and Grenade Launcher Kit (Hard)" + desc = "A belt containing 26 lethally dangerous and destructive grenades, along with a grenade launcher to fire them. Comes with an extra multitool and screwdriver." + item = /obj/item/storage/box/syndie_kit/demoman purchasable_from = UPLINK_NUKE_OPS - cost = 22 - surplus = 0 + +// ~~ Detonator: In case you lose the old one ~~ /datum/uplink_item/explosives/syndicate_detonator name = "Syndicate Detonator" desc = "The Syndicate detonator is a companion device to the Syndicate bomb. Simply press the included button \ - and an encrypted radio frequency will instruct all live Syndicate bombs to detonate. \ - Useful for when speed matters or you wish to synchronize multiple bomb blasts. Be sure to stand clear of \ - the blast radius before using the detonator." + and an encrypted radio frequency will instruct all live Syndicate bombs to detonate. \ + Useful for when speed matters or you wish to synchronize multiple bomb blasts. Be sure to stand clear of \ + the blast radius before using the detonator." item = /obj/item/syndicatedetonator - cost = 3 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS - -/datum/uplink_item/explosives/tearstache - name = "Teachstache Grenade" - desc = "A teargas grenade that launches sticky moustaches onto the face of anyone not wearing a clown or mime mask. The moustaches will \ - remain attached to the face of all targets for one minute, preventing the use of breath masks and other such devices." - item = /obj/item/grenade/chem_grenade/teargas/moustache - cost = 3 - surplus = 0 - purchasable_from = UPLINK_CLOWN_OPS - -/datum/uplink_item/explosives/viscerators - name = "Viscerator Delivery Grenade" - desc = "A unique grenade that deploys a swarm of viscerators upon activation, which will chase down and shred \ - any non-operatives in the area." - item = /obj/item/grenade/spawnergrenade/manhacks - cost = 5 - surplus = 35 + cost = 1 purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS -/datum/uplink_item/explosives/pinata - name = "Weapons Grade Pinata Kit" - desc = "A pinata filled with both candy and explosives as well as two belts to carry them on, crack it open and see what you get!" - item = /obj/item/storage/box/syndie_kit/pinata - purchasable_from = UPLINK_CLOWN_OPS - limited_stock = 1 - cost = 12 //This is effectively the clown ops version of the grenadier belt where you should on average get 8 explosives if you use a weapon with exactly 10 force. - surplus = 0 +// Support (Borgs and Reinforcements) -//Support and Mechs -/datum/uplink_category/support - name = "Support and Exosuits" - weight = 5 +/datum/uplink_category/reinforcements + name = "Reinforcements" + weight = 28 -/datum/uplink_item/support - category = /datum/uplink_category/support +/datum/uplink_item/reinforcements + category = /datum/uplink_category/reinforcements surplus = 0 + cost = 35 purchasable_from = UPLINK_NUKE_OPS - -/datum/uplink_item/support/clown_reinforcement - name = "Clown Reinforcements" - desc = "Call in an additional clown to share the fun, equipped with full starting gear, but no telecrystals." - item = /obj/item/antag_spawner/nuke_ops/clown - cost = 20 - purchasable_from = UPLINK_CLOWN_OPS restricted = TRUE + refundable = TRUE -/datum/uplink_item/support/reinforcement - name = "Reinforcements" +/datum/uplink_item/reinforcements/operative_reinforcement + name = "Operative Reinforcements" desc = "Call in an additional team member from one of our factions. \ They'll come equipped with a mere surplus SMG, so arming them is recommended." item = /obj/item/antag_spawner/nuke_ops - cost = 25 - refundable = TRUE - purchasable_from = UPLINK_NUKE_OPS - restricted = TRUE -/datum/uplink_item/support/reinforcement/assault_borg +/datum/uplink_item/reinforcements/assault_borg name = "Syndicate Assault Cyborg" desc = "A cyborg designed and programmed for systematic extermination of non-Syndicate personnel. \ - Comes equipped with a self-resupplying LMG, a grenade launcher, energy sword, emag, pinpointer, flash and crowbar." + Comes equipped with a self-resupplying LMG, a grenade launcher, energy sword, emag, pinpointer, flash and crowbar." item = /obj/item/antag_spawner/nuke_ops/borg_tele/assault - refundable = TRUE - cost = 65 - restricted = TRUE -/datum/uplink_item/support/reinforcement/medical_borg +/datum/uplink_item/reinforcements/medical_borg name = "Syndicate Medical Cyborg" desc = "A combat medical cyborg. Has limited offensive potential, but makes more than up for it with its support capabilities. \ - It comes equipped with a nanite hypospray, a medical beamgun, combat defibrillator, full surgical kit including an energy saw, an emag, pinpointer and flash. \ - Thanks to its organ storage bag, it can perform surgery as well as any humanoid." + It comes equipped with a nanite hypospray, a medical beamgun, combat defibrillator, full surgical kit including an energy saw, an emag, pinpointer and flash. \ + Thanks to its organ storage bag, it can perform surgery as well as any humanoid." item = /obj/item/antag_spawner/nuke_ops/borg_tele/medical - refundable = TRUE - cost = 35 - restricted = TRUE -/datum/uplink_item/support/reinforcement/saboteur_borg +/datum/uplink_item/reinforcements/saboteur_borg name = "Syndicate Saboteur Cyborg" desc = "A streamlined engineering cyborg, equipped with covert modules. Also incapable of leaving the welder in the shuttle. \ - Aside from regular Engineering equipment, it comes with a special destination tagger that lets it traverse disposals networks. \ - Its chameleon projector lets it disguise itself as a Nanotrasen cyborg, on top it has thermal vision and a pinpointer." + Aside from regular Engineering equipment, it comes with a special destination tagger that lets it traverse disposals networks. \ + Its chameleon projector lets it disguise itself as a Nanotrasen cyborg, on top it has thermal vision and a pinpointer." item = /obj/item/antag_spawner/nuke_ops/borg_tele/saboteur - refundable = TRUE - cost = 35 + +// ~~ Disposable Sentry Gun ~~ +// Technically not a spawn but it is a kind of reinforcement...I guess. + +/datum/uplink_item/reinforcements/turretbox + name = "Disposable Sentry Gun" + desc = "A disposable sentry gun deployment system cleverly disguised as a toolbox, apply wrench for functionality." + item = /obj/item/storage/toolbox/emergency/turret/nukie + cost = 16 + restricted = FALSE + refundable = FALSE + +// Bundles + +/datum/uplink_item/bundles_tc/cyber_implants + name = "Cybernetic Implants Bundle" + desc = "A box containing x-ray eyes, a CNS Rebooter and Reviver implant. Comes with an autosurgeon for each." + item = /obj/item/storage/box/cyber_implants + cost = 20 //worth 24 TC + purchasable_from = UPLINK_NUKE_OPS + +/datum/uplink_item/bundles_tc/medical + name = "Medical bundle" + 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 magboot MODsuit module to rescue your friends in no-gravity environments." + item = /obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle + cost = 25 // normally 31 + purchasable_from = UPLINK_NUKE_OPS + +/datum/uplink_item/bundles_tc/firestarter + name = "Spetsnaz Pyro bundle" + desc = "For systematic suppression of carbon lifeforms in close quarters: Contains an Elite MODsuit with a flamethrower attachment, \ + Stechkin APS machine pistol, two incendiary magazines, a minibomb and a stimulant syringe. \ + Order NOW and comrade Boris will throw in an extra tracksuit." + item = /obj/item/storage/backpack/duffelbag/syndie/firestarter + cost = 30 + purchasable_from = UPLINK_NUKE_OPS + +/datum/uplink_item/bundles_tc/induction_kit + name = "Syndicate Induction Kit" + desc = "Met a fellow syndicate agent on the station? Kept some TC in reserve just in case? Or are you communicating with one via the Syndicate channel? \ + Get this kit and you'll be able to induct them into your operative team via a special implant. \ + Additionally, it contains an assortment of useful gear for new operatives, including a space suit, an Ansem pistol, two spare magazines, and more! \ + *NOT* for usage with Reinforcements, and does not brainwash the target!" + item = /obj/item/storage/box/syndie_kit/induction_kit + cost = 10 + purchasable_from = UPLINK_NUKE_OPS + +// Mech related gear + +/datum/uplink_category/mech + name = "Mech Reinforcement" + weight = 27 + +/datum/uplink_item/mech + category = /datum/uplink_category/mech + surplus = 0 + purchasable_from = UPLINK_NUKE_OPS restricted = TRUE -/datum/uplink_item/support/gygax +// ~~ Mechs ~~ + +/datum/uplink_item/mech/gygax name = "Dark Gygax Exosuit" desc = "A lightweight exosuit, painted in a dark scheme. Its speed and equipment selection make it excellent \ - for hit-and-run style attacks. Features a scattershot shotgun, armor boosters against melee and ranged attacks, ion thrusters and a Tesla energy array." + for hit-and-run style attacks. Features a scattershot shotgun, armor boosters against melee and ranged attacks, ion thrusters and a Tesla energy array." item = /obj/vehicle/sealed/mecha/gygax/dark/loaded - cost = 80 - -/datum/uplink_item/support/honker - name = "Dark H.O.N.K." - desc = "A clown combat mech equipped with bombanana peel and tearstache grenade launchers, as well as the ubiquitous HoNkER BlAsT 5000." - item = /obj/vehicle/sealed/mecha/honker/dark/loaded - cost = 80 - purchasable_from = UPLINK_CLOWN_OPS + cost = 60 -/datum/uplink_item/support/mauler +/datum/uplink_item/mech/mauler name = "Mauler Exosuit" desc = "A massive and incredibly deadly military-grade exosuit. Features long-range targeting, thrust vectoring \ - and deployable smoke. Comes equipped with an LMG, scattershot carbine, missile rack, an antiprojectile armor booster and a Tesla energy array." + and deployable smoke. Comes equipped with an LMG, scattershot carbine, missile rack, an antiprojectile armor booster and a Tesla energy array." item = /obj/vehicle/sealed/mecha/marauder/mauler/loaded - cost = 140 + cost = 100 -/datum/uplink_item/support/turretbox - name = "Disposable Sentry Gun" - desc = "A disposable sentry gun deployment system cleverly disguised as a toolbox, apply wrench for functionality." - item = /obj/item/storage/toolbox/emergency/turret/nukie - cost = 16 +// ~~ Mech Support ~~ + +/datum/uplink_item/mech/support_bag + name = "Mech Support Kit Bag" + desc = "A duffel bag containing ammo for four full reloads of the scattershotm which is equipped on standard Dark Gygax and Mauler exosuits. Also comes with some support equipment for maintaining the mech, including tools and an inducer." + item = /obj/item/storage/backpack/duffelbag/syndie/ammo/mech + cost = 4 + purchasable_from = UPLINK_NUKE_OPS -/datum/uplink_item/stealthy_tools/combatbananashoes - name = "Combat Banana Shoes" - desc = "While making the wearer immune to most slipping attacks like regular combat clown shoes, these shoes \ - can generate a large number of synthetic banana peels as the wearer walks, slipping up would-be pursuers. They also \ - squeak significantly louder." - item = /obj/item/clothing/shoes/clown_shoes/banana_shoes/combat +/datum/uplink_item/mech/support_bag/mauler + name = "Mauler Ammo Bag" + desc = "A duffel bag containing ammo for three full reloads of the LMG, scattershot carbine, and SRM-8 missile laucher that are equipped on a standard Mauler exosuit." + item = /obj/item/storage/backpack/duffelbag/syndie/ammo/mauler cost = 6 - surplus = 0 - purchasable_from = UPLINK_CLOWN_OPS + purchasable_from = UPLINK_NUKE_OPS + +// Stealthy Tools /datum/uplink_item/stealthy_tools/syndigaloshes/nuke item = /obj/item/clothing/shoes/chameleon/noslip cost = 4 purchasable_from = UPLINK_NUKE_OPS +/datum/uplink_item/stealthy_weapons/romerol_kit + name = "Romerol" + desc = "A highly experimental bioterror agent which creates dormant nodules to be etched into the grey matter of the brain. \ + On death, these nodules take control of the dead body, causing limited revivification, \ + along with slurred speech, aggression, and the ability to infect others with this agent." + item = /obj/item/storage/box/syndie_kit/romerol + cost = 25 + purchasable_from = UPLINK_CLOWN_OPS|UPLINK_NUKE_OPS + cant_discount = TRUE + +// Modsuits + /datum/uplink_item/suits/modsuit/elite name = "Elite Syndicate MODsuit" desc = "An upgraded, elite version of the Syndicate MODsuit. It features fireproofing, and also \ - provides the user with superior armor and mobility compared to the standard Syndicate MODsuit." + provides the user with superior armor and mobility compared to the standard Syndicate MODsuit." item = /obj/item/mod/control/pre_equipped/elite purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS /datum/uplink_item/suits/energy_shield name = "MODsuit Energy Shield Module" desc = "An energy shield module for a MODsuit. The shields can handle up to three impacts \ - within a short duration and will rapidly recharge while not under fire." + within a short duration and will rapidly recharge while not under fire." item = /obj/item/mod/module/energy_shield cost = 15 purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS @@ -669,6 +597,34 @@ cost = 2 purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS +/datum/uplink_item/device_tools/medgun_mod + name = "Medbeam Gun Module" + desc = "A wonder of Syndicate engineering, the Medbeam gun module, or Medi-Gun enables a medic to keep his fellow \ + operatives in the fight, even while under fire. Don't cross the streams!" + item = /obj/item/mod/module/medbeam + cost = 15 + purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + +/datum/uplink_item/suits/syndi_intellicard + name = "Pre-Loaded Syndicate Intellicard" + desc = "A syndicate intellicard that can be activated to download a captured Nanotrasen AI, modified with the standard syndicate lawset. You can slot it into your modsuit for a conversational partner! It can additionally control the MODsuit's modules at will, and move your body around even if you're in critical condition or dead. \ + However, due to failsafes activated during the extraction process, the AI is unable to interact with electronics from anywhere but direct proximity..." + item = /obj/item/aicard/syndie/loaded + cost = 12 + purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + refundable = TRUE + +/datum/uplink_item/suits/synd_ai_upgrade + name = "Syndicate AI Upgrade" + desc = "...unless you buy the Syndicate Upgrade! This data chip allows the captured AI to increase its interaction range by two tiles per application. The Syndicate recommends three or four purchases at most, for a total of seven or infinite meters of range." + item = /obj/item/computer_disk/syndie_ai_upgrade + cost = 4 + purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + cant_discount = TRUE + refundable = TRUE + +// Devices + /datum/uplink_item/device_tools/assault_pod name = "Assault Pod Targeting Device" desc = "Use this to select the landing zone of your assault pod." @@ -681,24 +637,16 @@ /datum/uplink_item/device_tools/syndie_jaws_of_life name = "Syndicate Jaws of Life" desc = "Based on a Nanotrasen model, this powerful tool can be used as both a crowbar and a pair of wirecutters. \ - In its crowbar configuration, it can be used to force open airlocks. Very useful for entering the station or its departments." + In its crowbar configuration, it can be used to force open airlocks. Very useful for entering the station or its departments." item = /obj/item/crowbar/power/syndicate cost = 4 purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS -/datum/uplink_item/device_tools/medgun - name = "Medbeam Gun" - desc = "A wonder of Syndicate engineering, the Medbeam gun, or Medi-Gun enables a medic to keep his fellow \ - operatives in the fight, even while under fire. Don't cross the streams!" - item = /obj/item/gun/medbeam - cost = 15 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS - /datum/uplink_item/device_tools/medkit name = "Syndicate Combat Medic Kit" desc = "This first aid kit is a suspicious black and red. Included is a number of atropine medipens \ - for rapid stabilization and detonation prevention, sutures and regenerative mesh for wound treatment, and patches \ - for faster healing on the field. Also comes with basic medical tools and sterlizer." + for rapid stabilization and detonation prevention, sutures and regenerative mesh for wound treatment, and patches \ + for faster healing on the field. Also comes with basic medical tools and sterlizer." item = /obj/item/storage/medkit/tactical cost = 4 purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS @@ -706,9 +654,9 @@ /datum/uplink_item/device_tools/medkit/premium name = "Syndicate Combat Medical Suite" desc = "This first aid kit is a suspicious black and red. Included is an unloaded combat chemical injector \ - for suit-penetrative chem delivery, a medical science night vision HUD for quick identification of injured personnel and chemical supplies, \ - improved medical supplies, including Interdyne-approved pharmaceuticals, a hacked cybernetic surgery toolset arm implant, \ - and some helpful MODsuit modules for for field medical use and operative physiopharmaceutical augmentation." + for suit-penetrative chem delivery, a medical science night vision HUD for quick identification of injured personnel and chemical supplies, \ + improved medical supplies, including Interdyne-approved pharmaceuticals, a hacked cybernetic surgery toolset arm implant, \ + and some helpful MODsuit modules for for field medical use and operative physiopharmaceutical augmentation." item = /obj/item/storage/medkit/tactical/premium cost = 15 purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS @@ -717,71 +665,74 @@ name = "Syndicate Sentience Potion" item = /obj/item/slimepotion/slime/sentience/nuclear desc = "A potion recovered at great risk by undercover Syndicate operatives and then subsequently modified with Syndicate technology. \ - Using it will make any animal sentient, and bound to serve you, as well as implanting an internal radio for communication and an internal ID card for opening doors." + Using it will make any animal sentient, and bound to serve you, as well as implanting an internal radio for communication and an internal ID card for opening doors." cost = 4 purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS restricted = TRUE -/datum/uplink_item/implants/antistun - name = "CNS Rebooter Implant" - desc = "This implant will help you get back up on your feet faster after being stunned. Comes with an autosurgeon." - item = /obj/item/autosurgeon/syndicate/anti_stun - cost = 12 +// Implants + +/datum/uplink_item/implants/nuclear surplus = 0 purchasable_from = UPLINK_NUKE_OPS -/datum/uplink_item/implants/microbomb +/datum/uplink_item/implants/nuclear/deathrattle + name = "Box of Deathrattle Implants" + desc = "A collection of implants (and one reusable implanter) that should be injected into the team. When one of the team \ + dies, all other implant holders recieve a mental message informing them of their teammates' name \ + and the location of their death. Unlike most implants, these are designed to be implanted \ + in any creature, biological or mechanical." + item = /obj/item/storage/box/syndie_kit/imp_deathrattle + cost = 4 + +/datum/uplink_item/implants/nuclear/microbomb name = "Microbomb Implant" desc = "An implant injected into the body, and later activated either manually or automatically upon death. \ - The more implants inside of you, the higher the explosive power. \ - This will permanently destroy your body, however." + The more implants inside of you, the higher the explosive power. \ + This will permanently destroy your body, however." item = /obj/item/storage/box/syndie_kit/imp_microbomb cost = 2 - purchasable_from = UPLINK_NUKE_OPS -/datum/uplink_item/implants/macrobomb +/datum/uplink_item/implants/nuclear/macrobomb name = "Macrobomb Implant" desc = "An implant injected into the body, and later activated either manually or automatically upon death. \ - Upon death, releases a massive explosion that will wipe out everything nearby." + Upon death, releases a massive explosion that will wipe out everything nearby." item = /obj/item/storage/box/syndie_kit/imp_macrobomb cost = 20 - purchasable_from = UPLINK_NUKE_OPS restricted = TRUE -/datum/uplink_item/implants/reviver +/datum/uplink_item/implants/nuclear/deniability + name = "Tactical Deniability Implant" + desc = "An implant injected into the brain, and later activated either manually or automatically upon entering critical condition. \ + Prevents collapsing from critical condition, but explodes after a while." + item = /obj/item/storage/box/syndie_kit/imp_deniability + cost = 6 + +/datum/uplink_item/implants/nuclear/reviverplus name = "Reviver Implant" desc = "This implant will attempt to revive and heal you if you lose consciousness. Comes with an autosurgeon." item = /obj/item/autosurgeon/syndicate/reviver cost = 8 - surplus = 0 - purchasable_from = UPLINK_NUKE_OPS -/datum/uplink_item/implants/thermals +/datum/uplink_item/implants/nuclear/thermals name = "Thermal Eyes" desc = "These cybernetic eyes will give you thermal vision. Comes with a free autosurgeon." item = /obj/item/autosurgeon/syndicate/thermal_eyes cost = 8 - surplus = 0 - purchasable_from = UPLINK_NUKE_OPS -/datum/uplink_item/implants/xray +/datum/uplink_item/implants/nuclear/implants/xray name = "X-ray Vision Implant" desc = "These cybernetic eyes will give you X-ray vision. Comes with an autosurgeon." item = /obj/item/autosurgeon/syndicate/xray_eyes - cost = 10 - surplus = 0 - purchasable_from = UPLINK_NUKE_OPS + cost = 8 -/datum/uplink_item/implants/deathrattle - name = "Box of Deathrattle Implants" - desc = "A collection of implants (and one reusable implanter) that should be injected into the team. When one of the team \ - dies, all other implant holders recieve a mental message informing them of their teammates' name \ - and the location of their death. Unlike most implants, these are designed to be implanted \ - in any creature, biological or mechanical." - item = /obj/item/storage/box/syndie_kit/imp_deathrattle - cost = 4 - surplus = 0 - purchasable_from = UPLINK_NUKE_OPS +/datum/uplink_item/implants/nuclear/antistun + name = "CNS Rebooter Implant" + desc = "This implant will help you get back up on your feet faster after being stunned. Comes with an autosurgeon." + item = /obj/item/autosurgeon/syndicate/anti_stun + cost = 8 + +// Badass (meme items) /datum/uplink_item/badass/costumes surplus = 0 @@ -789,62 +740,60 @@ cost = 4 cant_discount = TRUE -/datum/uplink_item/badass/clownopclumsinessinjector //clowns can buy this too, but it's in the role-restricted items section for them - name = "Clumsiness Injector" - desc = "Inject yourself with this to become as clumsy as a clown... or inject someone ELSE with it to make THEM as clumsy as a clown. Useful for clown operatives who wish to reconnect with their former clownish nature or for clown operatives who wish to torment and play with their prey before killing them." - item = /obj/item/dnainjector/clumsymut - cost = 1 - purchasable_from = UPLINK_CLOWN_OPS - illegal_tech = FALSE +// Base Keys -/datum/uplink_item/stealthy_weapons/romerol_kit - name = "Romerol" - desc = "A highly experimental bioterror agent which creates dormant nodules to be etched into the grey matter of the brain. \ - On death, these nodules take control of the dead body, causing limited revivification, \ - along with slurred speech, aggression, and the ability to infect others with this agent." - item = /obj/item/storage/box/syndie_kit/romerol - cost = 25 - purchasable_from = UPLINK_CLOWN_OPS|UPLINK_NUKE_OPS +/datum/uplink_category/base_keys + name = "Base Keys" + weight = 27 + +/datum/uplink_item/base_keys + category = /datum/uplink_category/base_keys + surplus = 0 + purchasable_from = UPLINK_NUKE_OPS + cost = 15 cant_discount = TRUE -/datum/uplink_item/support/bomb_key +/datum/uplink_item/base_keys/bomb_key name = "Syndicate Ordnance Laboratory Access Card" desc = "Do you fancy yourself an explosives expert? If so, then consider yourself lucky! With this special Authorization Key, \ - you can blow those corpo suits away with your very own home-made explosive devices. Made in your local firebase's \ - very own Ordnance Laboratory! *The Syndicate is not responsible for injuries or deaths sustained while utilizing the lab." + you can blow those corpo suits away with your very own home-made explosive devices. Made in your local firebase's \ + very own Ordnance Laboratory! *The Syndicate is not responsible for injuries or deaths sustained while utilizing the lab." item = /obj/item/keycard/syndicate_bomb - cost = 15 purchasable_from = UPLINK_NUKE_OPS - cant_discount = TRUE -/datum/uplink_item/support/bio_key +/datum/uplink_item/base_keys/bio_key name = "Syndicate Bio-Weapon Laboratory Access Card" desc = "In the right hands, even vile corpo technology can be turned into a vast arsenal of liberation and justice. From \ - micro-organism symbiosis to slime-core weaponization, this special Authorization Key can let you push past the boundaries \ - of bio-terrorism at breakneck speeds. As a bonus, these labs even come equipped with natural life support! *Plants not included." + micro-organism symbiosis to slime-core weaponization, this special Authorization Key can let you push past the boundaries \ + of bio-terrorism at breakneck speeds. As a bonus, these labs even come equipped with natural life support! *Plants not included." item = /obj/item/keycard/syndicate_bio - cost = 17 purchasable_from = UPLINK_CLOWN_OPS | UPLINK_NUKE_OPS - cant_discount = TRUE -/datum/uplink_item/support/chem_key +/datum/uplink_item/base_keys/chem_key name = "Syndicate Chemical Plant Access Card" desc = "For some of our best Operatives, watching corpo space stations blow up with a flash of retribution just isn't enough. \ - Folks like those prefer a more personal touch to their artistry. For those interested, a special Authorization Key \ - can be instantly delivered to your location. Create groundbreaking chemical agents, cook up, sell the best of drugs, \ - and listen to the best classic music today!" + Folks like those prefer a more personal touch to their artistry. For those interested, a special Authorization Key \ + can be instantly delivered to your location. Create groundbreaking chemical agents, cook up, sell the best of drugs, \ + and listen to the best classic music today!" item = /obj/item/keycard/syndicate_chem - cost = 12 purchasable_from = UPLINK_CLOWN_OPS | UPLINK_NUKE_OPS - cant_discount = TRUE -/datum/uplink_item/support/fridge_key +/datum/uplink_item/base_keys/fridge_key name = "Lopez's Access Card" desc = "Hungry? So is everyone in Firebase Balthazord. Lopez is a great cook, don't get me wrong, but he's stubborn when it \ - comes to the meal plans. Sometimes you just want to pig out. Listen, don't tell anyone, ok? I picked this out of his \ - pocket during this morning's briefing. He's been looking for it since. Take it, get into the fridge, and cook up whatever \ - you need before he gets back. And remember: DON'T TELL ANYONE! -M.T" + comes to the meal plans. Sometimes you just want to pig out. Listen, don't tell anyone, ok? I picked this out of his \ + pocket during this morning's briefing. He's been looking for it since. Take it, get into the fridge, and cook up whatever \ + you need before he gets back. And remember: DON'T TELL ANYONE! -M.T" item = /obj/item/keycard/syndicate_fridge cost = 5 purchasable_from = UPLINK_CLOWN_OPS | UPLINK_NUKE_OPS +// Hats +// It is fundamental for the game's health for there to be a hat crate for nuclear operatives. + +/datum/uplink_item/badass/hats + name = "Hat Crate" + desc = "Hat crate! Contains hats, along with hat stabilizers to wear your hats while you're in your suit! HATS!!!" + item = /obj/structure/closet/crate/large/hats + cost = 5 + purchasable_from = UPLINK_CLOWN_OPS | UPLINK_NUKE_OPS diff --git a/code/modules/uplink/uplink_items/stealthy.dm b/code/modules/uplink/uplink_items/stealthy.dm index 54c9bbe9adcf7..491f8e8e99d6d 100644 --- a/code/modules/uplink/uplink_items/stealthy.dm +++ b/code/modules/uplink/uplink_items/stealthy.dm @@ -90,7 +90,16 @@ slur as if inebriated. It can produce an infinite number \ of bolts, but takes time to automatically recharge after each shot." item = /obj/item/gun/energy/recharge/ebow - progression_minimum = 30 MINUTES cost = 10 surplus = 50 purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + +/datum/uplink_item/stealthy_weapons/contrabaton + name = "Contractor Baton" + desc = "A compact, specialised baton assigned to Syndicate contractors. Applies light electrical shocks to targets. \ + These shocks are capable of affecting the inner circuitry of most robots as well, applying a short stun. \ + Has the added benefit of affecting the vocal cords of your victim, causing them to slur as if inebriated." + item = /obj/item/melee/baton/telescopic/contractor_baton + cost = 12 + surplus = 50 + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) diff --git a/code/modules/uplink/uplink_items/suits.dm b/code/modules/uplink/uplink_items/suits.dm index b264e08853046..57982a8cf980a 100644 --- a/code/modules/uplink/uplink_items/suits.dm +++ b/code/modules/uplink/uplink_items/suits.dm @@ -19,12 +19,6 @@ cost = 6 purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) -/datum/uplink_item/suits/noslip - name = "MODsuit Anti-Slip Module" - desc = "A MODsuit module preventing the user from slipping on water." - item = /obj/item/mod/module/noslip - cost = 2 - /datum/uplink_item/suits/space_suit name = "Syndicate Space Suit" desc = "This red and black Syndicate space suit is less encumbering than Nanotrasen variants, \ @@ -33,7 +27,6 @@ item = /obj/item/storage/box/syndie_kit/space cost = 4 - /datum/uplink_item/suits/modsuit name = "Syndicate MODsuit" desc = "The feared MODsuit of a Syndicate agent. Features armoring and a set of inbuilt modules." @@ -65,7 +58,6 @@ item = /obj/item/mod/module/plate_compression cost = 2 - /datum/uplink_item/suits/noslip name = "MODsuit Anti-Slip Module" desc = "A MODsuit module preventing the user from slipping on water." diff --git a/code/modules/vehicles/_vehicle.dm b/code/modules/vehicles/_vehicle.dm index 03554ac081d4a..ca666292a3f52 100644 --- a/code/modules/vehicles/_vehicle.dm +++ b/code/modules/vehicles/_vehicle.dm @@ -51,6 +51,7 @@ autogrant_actions_controller = list() occupant_actions = list() generate_actions() + ADD_TRAIT(src, TRAIT_CASTABLE_LOC, INNATE_TRAIT) /obj/vehicle/Destroy(force) QDEL_NULL(trailer) diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm index bf923cd6c3caf..c4fd2bcaceb7e 100644 --- a/code/modules/vehicles/atv.dm +++ b/code/modules/vehicles/atv.dm @@ -92,7 +92,7 @@ audible_message(span_hear("You hear welding.")) var/did_the_thing while(atom_integrity < max_integrity) - if(W.use_tool(src, user, 2.5 SECONDS, volume=50, amount=1)) + if(W.use_tool(src, user, 2.5 SECONDS, volume=50)) did_the_thing = TRUE atom_integrity += min(10, (max_integrity - atom_integrity)) audible_message(span_hear("You hear welding.")) diff --git a/code/modules/vehicles/bicycle.dm b/code/modules/vehicles/bicycle.dm index 1771bb9613301..cc0643be02601 100644 --- a/code/modules/vehicles/bicycle.dm +++ b/code/modules/vehicles/bicycle.dm @@ -39,7 +39,7 @@ audible_message(span_hear("You hear welding.")) var/did_the_thing while(atom_integrity < max_integrity) - if(W.use_tool(src, user, 2.5 SECONDS, volume=50, amount=1, extra_checks = CALLBACK(src, PROC_REF(can_still_fix)))) + if(W.use_tool(src, user, 2.5 SECONDS, volume=50, extra_checks = CALLBACK(src, PROC_REF(can_still_fix)))) did_the_thing = TRUE atom_integrity += min(10, (max_integrity - atom_integrity)) audible_message(span_hear("You hear welding.")) diff --git a/code/modules/vehicles/cars/car.dm b/code/modules/vehicles/cars/car.dm index 603bdb731524e..46a9c6f7f56ca 100644 --- a/code/modules/vehicles/cars/car.dm +++ b/code/modules/vehicles/cars/car.dm @@ -16,7 +16,8 @@ /obj/vehicle/sealed/car/generate_actions() . = ..() - initialize_controller_action_type(/datum/action/vehicle/sealed/remove_key, VEHICLE_CONTROL_DRIVE) + if(!isnull(key_type)) + initialize_controller_action_type(/datum/action/vehicle/sealed/remove_key, VEHICLE_CONTROL_DRIVE) if(car_traits & CAN_KIDNAP) initialize_controller_action_type(/datum/action/vehicle/sealed/dump_kidnapped_mobs, VEHICLE_CONTROL_DRIVE) @@ -29,15 +30,16 @@ mob_try_forced_enter(M, kidnapped) return ..() -/obj/vehicle/sealed/car/mob_try_exit(mob/M, mob/user, silent = FALSE) - if(M != user || !(LAZYACCESS(occupants, M) & VEHICLE_CONTROL_KIDNAPPED)) - mob_exit(M, silent) +/obj/vehicle/sealed/car/mob_try_exit(mob/future_pedestrian, mob/user, silent = FALSE) + if(future_pedestrian != user || !(LAZYACCESS(occupants, future_pedestrian) & VEHICLE_CONTROL_KIDNAPPED)) + mob_exit(future_pedestrian, silent) return TRUE - to_chat(user, span_notice("You push against the back of \the [src]'s trunk to try and get out.")) - if(!do_after(user, escape_time, target = src)) - return FALSE + if (escape_time > 0) + to_chat(user, span_notice("You push against the back of \the [src]'s trunk to try and get out.")) + if(!do_after(user, escape_time, target = src)) + return FALSE to_chat(user,span_danger("[user] gets out of [src].")) - mob_exit(M, silent) + mob_exit(future_pedestrian, silent) return TRUE /obj/vehicle/sealed/car/attack_hand(mob/living/user, list/modifiers) @@ -58,7 +60,8 @@ if(occupant_amount() >= max_occupants) return FALSE var/atom/old_loc = loc - if(do_after(forcer, get_enter_delay(kidnapped), kidnapped, extra_checks=CALLBACK(src, TYPE_PROC_REF(/obj/vehicle/sealed/car, is_car_stationary), old_loc))) + var/enter_delay = get_enter_delay(kidnapped) + if(enter_delay == 0 || do_after(forcer, enter_delay, kidnapped, extra_checks=CALLBACK(src, TYPE_PROC_REF(/obj/vehicle/sealed/car, is_car_stationary), old_loc))) mob_forced_enter(kidnapped, silent) return TRUE return FALSE diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm index d08aceab85fa7..1fd230bb47a82 100644 --- a/code/modules/vehicles/cars/clowncar.dm +++ b/code/modules/vehicles/cars/clowncar.dm @@ -110,10 +110,33 @@ /obj/vehicle/sealed/car/clowncar/Bump(atom/bumped) . = ..() - if(isliving(bumped) && !istype(bumped, /mob/living/basic/deer)) + if(isliving(bumped)) if(ismegafauna(bumped)) return var/mob/living/hittarget_living = bumped + + if(istype(hittarget_living, /mob/living/basic/deer)) + visible_message(span_warning("[src] careens into [hittarget_living]! Oh the humanity!")) + for(var/mob/living/carbon/carbon_occupant in occupants) + if(prob(35)) //Note: The randomstep on dump_mobs throws occupants into each other and often causes wounds regardless. + continue + for(var/obj/item/bodypart/head/head_to_wound as anything in carbon_occupant.bodyparts) + var/pick_mode = text2num(pick(list( + "[WOUND_PICK_LOWEST_SEVERITY]", + "[WOUND_PICK_HIGHEST_SEVERITY]" + ))) + carbon_occupant.cause_wound_of_type_and_severity(WOUND_BLUNT, head_to_wound, WOUND_SEVERITY_MODERATE, WOUND_SEVERITY_SEVERE, pick_mode) + carbon_occupant.playsound_local(src, 'sound/weapons/flash_ring.ogg', 50) + carbon_occupant.set_eye_blur_if_lower(rand(10 SECONDS, 20 SECONDS)) + + hittarget_living.adjustBruteLoss(200) + new /obj/effect/decal/cleanable/blood/splatter(get_turf(hittarget_living)) + + log_combat(src, hittarget_living, "rammed into", null, "injuring all passengers and killing the [hittarget_living]") + dump_mobs(TRUE) + playsound(src, 'sound/vehicles/car_crash.ogg', 100) + return + if(iscarbon(hittarget_living)) var/mob/living/carbon/carb = hittarget_living carb.Paralyze(4 SECONDS) //I play to make sprites go horizontal @@ -147,14 +170,16 @@ playsound(target_pancake, 'sound/effects/cartoon_splat.ogg', 75) log_combat(src, crossed, "ran over") -/obj/vehicle/sealed/car/clowncar/emag_act(mob/user) +/obj/vehicle/sealed/car/clowncar/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE obj_flags |= EMAGGED + balloon_alert(user, "fun mode engaged") to_chat(user, span_danger("You scramble [src]'s child safety lock, and a panel with six colorful buttons appears!")) initialize_controller_action_type(/datum/action/vehicle/sealed/roll_the_dice, VEHICLE_CONTROL_DRIVE) initialize_controller_action_type(/datum/action/vehicle/sealed/cannon, VEHICLE_CONTROL_DRIVE) AddElement(/datum/element/waddling) + return TRUE /obj/vehicle/sealed/car/clowncar/atom_destruction(damage_flag) playsound(src, 'sound/vehicles/clowncar_fart.ogg', 100) @@ -191,7 +216,7 @@ foam.start(log = TRUE) 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.")) - icon = 'icons/obj/engine/singularity.dmi' + icon = 'icons/obj/machines/engine/singularity.dmi' icon_state = "singularity_s1" addtimer(CALLBACK(src, PROC_REF(reset_icon)), 10 SECONDS) if(4) diff --git a/code/modules/vehicles/cars/speedwagon.dm b/code/modules/vehicles/cars/speedwagon.dm new file mode 100644 index 0000000000000..1fa9e2dcc6c92 --- /dev/null +++ b/code/modules/vehicles/cars/speedwagon.dm @@ -0,0 +1,51 @@ +/// Big 3x3 car only available to admins which can run people over +/obj/vehicle/sealed/car/speedwagon + name = "BM Speedwagon" + desc = "Push it to the limit, walk along the razor's edge." + icon = 'icons/obj/toys/car.dmi' + icon_state = "speedwagon" + layer = LYING_MOB_LAYER + max_occupants = 4 + pixel_y = -48 + pixel_x = -48 + enter_delay = 0 SECONDS + escape_time = 0 SECONDS // Just get out dumbass + vehicle_move_delay = 0 + ///Determines whether we throw all things away when ramming them or just mobs, varedit only + var/crash_all = FALSE + +/obj/vehicle/sealed/car/speedwagon/Initialize(mapload) + . = ..() + add_overlay(image(icon, "speedwagon_cover", ABOVE_MOB_LAYER)) + +/obj/vehicle/sealed/car/speedwagon/Bump(atom/bumped) + . = ..() + if(!bumped.density || occupant_amount() == 0) + return + + if(crash_all) + if(ismovable(bumped)) + var/atom/movable/flying_debris = bumped + flying_debris.throw_at(get_edge_target_turf(bumped, dir), 4, 3) + visible_message(span_danger("[src] crashes into [bumped]!")) + playsound(src, 'sound/effects/bang.ogg', 50, TRUE) + if(!ishuman(bumped)) + return + var/mob/living/carbon/human/rammed = bumped + rammed.Paralyze(100) + rammed.adjustStaminaLoss(30) + rammed.apply_damage(rand(20,35), BRUTE) + if(!crash_all) + rammed.throw_at(get_edge_target_turf(bumped, dir), 4, 3) + visible_message(span_danger("[src] crashes into [rammed]!")) + playsound(src, 'sound/effects/bang.ogg', 50, TRUE) + +/obj/vehicle/sealed/car/speedwagon/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) + . = ..() + if(occupant_amount() == 0) + return + for(var/atom/future_statistic in range(2, src)) + if(future_statistic == src) + continue + if(!LAZYACCESS(occupants, future_statistic)) + Bump(future_statistic) diff --git a/code/modules/vehicles/cars/vim.dm b/code/modules/vehicles/cars/vim.dm index 8079f7cc6b6ef..a37c6e18b8eee 100644 --- a/code/modules/vehicles/cars/vim.dm +++ b/code/modules/vehicles/cars/vim.dm @@ -73,7 +73,7 @@ audible_message(span_hear("You hear welding.")) var/did_the_thing while(atom_integrity < max_integrity) - if(W.use_tool(src, user, 2.5 SECONDS, volume=50, amount=1)) + if(W.use_tool(src, user, 2.5 SECONDS, volume=50)) did_the_thing = TRUE atom_integrity += min(VIM_HEAL_AMOUNT, (max_integrity - atom_integrity)) audible_message(span_hear("You hear welding.")) diff --git a/code/modules/vehicles/lavaboat.dm b/code/modules/vehicles/lavaboat.dm index ee26db06aa843..e45f062d1a24a 100644 --- a/code/modules/vehicles/lavaboat.dm +++ b/code/modules/vehicles/lavaboat.dm @@ -4,9 +4,9 @@ /obj/vehicle/ridden/lavaboat name = "lava boat" desc = "A boat used for traversing lava." - icon = 'icons/obj/lavaland/dragonboat.dmi' + icon = 'icons/obj/mining_zones/dragonboat.dmi' icon_state = "goliath_boat" - icon_preview = 'icons/obj/previews.dmi' + icon_preview = 'icons/obj/fluff/previews.dmi' icon_state_preview = "boat" resistance_flags = LAVA_PROOF | FIRE_PROOF can_buckle = TRUE @@ -46,7 +46,7 @@ /obj/vehicle/ridden/lavaboat/plasma name = "plasma boat" desc = "A boat used for traversing the streams of plasma without turning into an icecube." - icon = 'icons/obj/lavaland/dragonboat.dmi' + icon = 'icons/obj/mining_zones/dragonboat.dmi' icon_state = "goliath_boat" resistance_flags = FREEZE_PROOF can_buckle = TRUE @@ -62,7 +62,7 @@ /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 = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "ship_bottle" /obj/item/ship_in_a_bottle/attack_self(mob/user) diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index 37af70068319f..0652c554b8a4a 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -20,7 +20,7 @@ /obj/vehicle/sealed/mecha name = "exosuit" desc = "Exosuit" - icon = 'icons/mecha/mecha.dmi' + icon = 'icons/mob/mecha.dmi' resistance_flags = FIRE_PROOF | ACID_PROOF max_integrity = 300 armor_type = /datum/armor/sealed_mecha @@ -35,14 +35,12 @@ generic_canpass = FALSE hud_possible = list(DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_TRACK_HUD, DIAG_CAMERA_HUD) mouse_pointer = 'icons/effects/mouse_pointers/mecha_mouse.dmi' - ///How much energy the mech will consume each time it moves. This variable is a backup for when leg actuators affect the energy drain. - var/normal_step_energy_drain = 10 ///How much energy the mech will consume each time it moves. this is the current active energy consumed - var/step_energy_drain = 10 + var/step_energy_drain = 8 ///How much energy we drain each time we mechpunch someone var/melee_energy_drain = 15 - ///The minimum amount of energy charge consumed by leg overload - var/overload_step_energy_drain_min = 100 + ///Power we use to have the lights on + var/light_energy_drain = 2 ///Modifiers for directional damage reduction var/list/facing_modifiers = list(MECHA_FRONT_ARMOUR = 0.5, MECHA_SIDE_ARMOUR = 1, MECHA_BACK_ARMOUR = 1.5) ///if we cant use our equipment(such as due to EMP) @@ -53,12 +51,11 @@ var/obj/item/stock_parts/scanning_module/scanmod /// Keeps track of the mech's capacitor var/obj/item/stock_parts/capacitor/capacitor - ///Whether the mechs maintenance protocols are on or off - var/construction_state = MECHA_LOCKED + /// Keeps track of the mech's servo motor + var/obj/item/stock_parts/servo/servo ///Contains flags for the mecha - var/mecha_flags = ADDING_ACCESS_POSSIBLE | CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE - ///Stores the DNA enzymes of a carbon so tht only they can access the mech - var/dna_lock + var/mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE + ///Spark effects are handled by this datum var/datum/effect_system/spark_spread/spark_system ///How powerful our lights are @@ -66,24 +63,22 @@ ///Just stop the mech from doing anything var/completely_disabled = FALSE ///Whether this mech is allowed to move diagonally - var/allow_diagonal_movement = FALSE + var/allow_diagonal_movement = TRUE + ///Whether this mech moves into a direct as soon as it goes to move. Basically, turn and step in the same key press. + var/pivot_step = FALSE ///Whether or not the mech destroys walls by running into it. var/bumpsmash = FALSE ///////////ATMOS - ///Whether we are currrently drawing from the internal tank - var/use_internal_tank = FALSE - ///The setting of the valve on the internal tank - var/internal_tank_valve = ONE_ATMOSPHERE - ///The internal air tank obj of the mech - var/obj/machinery/portable_atmospherics/canister/air/internal_tank + ///Whether the pilot is hidden from the outside viewers and whether the cabin can be sealed to be airtight + var/enclosed = TRUE + ///Whether the cabin exchanges gases with the environment + var/cabin_sealed = FALSE ///Internal air mix datum var/datum/gas_mixture/cabin_air - ///The connected air port, if we have one - var/obj/machinery/atmospherics/components/unary/portables_connector/connected_port + ///Volume of the cabin + var/cabin_volume = TANK_STANDARD_VOLUME * 3 - ///Special version of the radio, which is unsellable - var/obj/item/radio/mech/radio ///List of installed remote tracking beacons, including AI control beacons var/list/trackers = list() ///Camera installed into the mech @@ -100,14 +95,16 @@ /// % chance for internal damage to occur var/internal_damage_probability = 20 /// list of possibly dealt internal damage for this mech type - var/possible_int_damage = MECHA_INT_FIRE|MECHA_INT_TEMP_CONTROL|MECHA_INT_TANK_BREACH|MECHA_INT_CONTROL_LOST|MECHA_INT_SHORT_CIRCUIT + var/possible_int_damage = MECHA_INT_FIRE|MECHA_INT_TEMP_CONTROL|MECHA_CABIN_AIR_BREACH|MECHA_INT_CONTROL_LOST|MECHA_INT_SHORT_CIRCUIT /// damage threshold above which we take component damage var/component_damage_threshold = 10 - ///required access level for mecha operation - var/list/operation_req_access = list() - ///required access to change internal components - var/list/internals_req_access = list(ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE) + ///Stores the DNA enzymes of a carbon so tht only they can access the mech + var/dna_lock + /// A list of all granted accesses + var/list/accesses = list() + /// If the mech should require ALL or only ONE of the listed accesses + var/one_access = TRUE ///Typepath for the wreckage it spawns when destroyed var/wreckage @@ -122,15 +119,20 @@ MECHA_POWER = list(), MECHA_ARMOR = list(), ) - ///assoc list: max equips for non-arm modules key-count + ///assoc list: max equips for modules key-count var/list/max_equip_by_category = list( - MECHA_UTILITY = 0, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 2, MECHA_POWER = 1, MECHA_ARMOR = 0, ) ///flat equipment for iteration var/list/flat_equipment + ///Handles an internal ore box for mining mechs + var/obj/structure/ore_box/ore_box + ///Whether our steps are silent due to no gravity var/step_silent = FALSE ///Sound played when the mech moves @@ -145,8 +147,6 @@ var/exit_delay = 2 SECONDS ///Time you get slept for if you get forcible ejected by the mech exploding var/destruction_sleep_duration = 2 SECONDS - ///Whether outside viewers can see the pilot inside - var/enclosed = TRUE ///In case theres a different iconstate for AI/MMI pilot(currently only used for ripley) var/silicon_icon_state = null ///Currently ejecting, and unable to do things @@ -164,11 +164,15 @@ var/defense_mode = FALSE ///Bool for leg overload on/off - var/leg_overload_mode = FALSE - ///Energy use modifier for leg overload - var/leg_overload_coeff = 100 - ///stores value that we will add and remove from the mecha when toggling leg overload - var/speed_mod = 0 + var/overclock_mode = FALSE + ///Whether it is possible to toggle overclocking from the cabin + var/can_use_overclock = FALSE + ///Speed and energy usage modifier for leg overload + var/overclock_coeff = 1.5 + ///Current leg actuator temperature. Increases when overloaded, decreases when not. + var/overclock_temp = 0 + ///Temperature threshold at which actuators may start causing internal damage + var/overclock_temp_danger = 15 //Bool for zoom on/off var/zoom_mode = FALSE @@ -194,13 +198,14 @@ ///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 - var/ui_y = 600 /// ref to screen object that displays in the middle of the UI var/atom/movable/screen/map_view/ui_view + /// Theme of the mech TGUI + var/ui_theme = "ntos" + /// Module selected by default when mech UI is opened + var/ui_selected_module_index + /datum/armor/sealed_mecha melee = 20 bullet = 10 @@ -208,17 +213,11 @@ fire = 100 acid = 100 -/obj/item/radio/mech //this has to go somewhere - subspace_transmission = TRUE - -/obj/vehicle/sealed/mecha/Initialize(mapload) +/obj/vehicle/sealed/mecha/Initialize(mapload, built_manually) . = ..() ui_view = new() ui_view.generate_view("mech_view_[REF(src)]") - if(enclosed) - internal_tank = new (src) - RegisterSignal(src, COMSIG_MOVABLE_PRE_MOVE , PROC_REF(disconnect_air)) - RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(play_stepsound)) + RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) RegisterSignal(src, COMSIG_LIGHT_EATER_ACT, PROC_REF(on_light_eater)) spark_system = new @@ -229,19 +228,12 @@ smoke_system.set_up(3, holder = src, location = src) smoke_system.attach(src) - radio = new(src) - radio.name = "[src] radio" - - cabin_air = new - cabin_air.volume = 200 - cabin_air.temperature = T20C - cabin_air.add_gases(/datum/gas/oxygen, /datum/gas/nitrogen) - cabin_air.gases[/datum/gas/oxygen][MOLES] = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) - cabin_air.gases[/datum/gas/nitrogen][MOLES] = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) + cabin_air = new(cabin_volume) - add_cell() - add_scanmod() - add_capacitor() + if(!built_manually) + populate_parts() + update_access() + set_wires(new /datum/wires/mecha(src)) START_PROCESSING(SSobj, src) SSpoints_of_interest.make_point_of_interest(src) log_message("[src.name] created.", LOG_MECHA) @@ -256,7 +248,7 @@ AddElement(/datum/element/atmos_sensitive, mapload) become_hearing_sensitive(trait_source = ROUNDSTART_TRAIT) - ADD_TRAIT(src, TRAIT_ASHSTORM_IMMUNE, ROUNDSTART_TRAIT) //protects pilots from ashstorms. + add_traits(list(TRAIT_ASHSTORM_IMMUNE, TRAIT_SNOWSTORM_IMMUNE), ROUNDSTART_TRAIT) //stormy weather (keeps rainin' all the time) for(var/key in equip_by_category) if(key == MECHA_L_ARM || key == MECHA_R_ARM) var/path = equip_by_category[key] @@ -280,27 +272,46 @@ for(var/obj/item/mecha_parts/mecha_equipment/equip as anything in flat_equipment) equip.detach(loc) qdel(equip) - radio = null STOP_PROCESSING(SSobj, src) LAZYCLEARLIST(flat_equipment) + QDEL_NULL(ore_box) + QDEL_NULL(cell) QDEL_NULL(scanmod) QDEL_NULL(capacitor) - QDEL_NULL(internal_tank) + QDEL_NULL(servo) QDEL_NULL(cabin_air) QDEL_NULL(spark_system) QDEL_NULL(smoke_system) QDEL_NULL(ui_view) QDEL_NULL(trackers) QDEL_NULL(chassis_camera) + QDEL_NULL(wires) GLOB.mechas_list -= src //global mech list for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) diag_hud.remove_atom_from_hud(src) //YEET return ..() +///Add parts on mech spawning. Skipped in manual construction. +/obj/vehicle/sealed/mecha/proc/populate_parts() + cell = new /obj/item/stock_parts/cell/high(src) + scanmod = new /obj/item/stock_parts/scanning_module(src) + capacitor = new /obj/item/stock_parts/capacitor(src) + servo = new /obj/item/stock_parts/servo(src) + update_part_values() + +/obj/vehicle/sealed/mecha/CheckParts(list/parts_list) + . = ..() + cell = locate(/obj/item/stock_parts/cell) in contents + diag_hud_set_mechcell() + scanmod = locate(/obj/item/stock_parts/scanning_module) in contents + capacitor = locate(/obj/item/stock_parts/capacitor) in contents + servo = locate(/obj/item/stock_parts/servo) in contents + update_part_values() + /obj/vehicle/sealed/mecha/atom_destruction() spark_system?.start() loc.assume_air(cabin_air) @@ -312,7 +323,7 @@ if(!ai.linked_core) // we probably shouldnt gib AIs with a core unlucky_ai = occupant ai.investigate_log("has been gibbed by having their mech destroyed.", INVESTIGATE_DEATHS) - ai.gib() //No wreck, no AI to recover + ai.gib(DROP_ALL_REMAINS) //No wreck, no AI to recover else mob_exit(ai,silent = TRUE, forced = TRUE) // so we dont ghost the AI continue @@ -326,7 +337,7 @@ if(E.detachable && prob(30)) WR.crowbar_salvage += E E.detach(WR) //detaches from src into WR - E.activated = TRUE + E.active = TRUE else E.detach(loc) qdel(E) @@ -381,7 +392,10 @@ /obj/vehicle/sealed/mecha/generate_actions() initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_eject) - initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_internals, VEHICLE_CONTROL_SETTINGS) + if(enclosed) + initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_cabin_seal, VEHICLE_CONTROL_SETTINGS) + if(can_use_overclock) + initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_overclock) initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_lights, VEHICLE_CONTROL_SETTINGS) initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_safeties, VEHICLE_CONTROL_SETTINGS) initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_view_stats, VEHICLE_CONTROL_SETTINGS) @@ -419,32 +433,36 @@ to_chat(mob_occupant, span_notice("Equipment control unit has been rebooted successfully.")) set_mouse_pointer() -/obj/vehicle/sealed/mecha/CheckParts(list/parts_list) - . = ..() - cell = locate(/obj/item/stock_parts/cell) in contents - scanmod = locate(/obj/item/stock_parts/scanning_module) in contents - capacitor = locate(/obj/item/stock_parts/capacitor) in contents - update_part_values() - /obj/vehicle/sealed/mecha/proc/update_part_values() ///Updates the values given by scanning module and capacitor tier, called when a part is removed or inserted. - if(scanmod) - normal_step_energy_drain = 20 - (5 * scanmod.rating) //10 is normal, so on lowest part its worse, on second its ok and on higher its real good up to 0 on best - step_energy_drain = normal_step_energy_drain - else - normal_step_energy_drain = 500 - step_energy_drain = normal_step_energy_drain + update_energy_drain() if(capacitor) var/datum/armor/stock_armor = get_armor_by_type(armor_type) var/initial_energy = stock_armor.get_rating(ENERGY) set_armor_rating(ENERGY, initial_energy + (capacitor.rating * 5)) + overclock_temp_danger = initial(overclock_temp_danger) * capacitor.rating + else + overclock_temp_danger = initial(overclock_temp_danger) /obj/vehicle/sealed/mecha/examine(mob/user) . = ..() if(LAZYLEN(flat_equipment)) . += span_notice("It's equipped with:") for(var/obj/item/mecha_parts/mecha_equipment/ME as anything in flat_equipment) + if(istype(ME, /obj/item/mecha_parts/mecha_equipment/concealed_weapon_bay)) + continue . += span_notice("[icon2html(ME, user)] \A [ME].") + if(mecha_flags & PANEL_OPEN) + if(servo) + . += span_notice("Micro-servos reduce movement power usage by [100 - round(100 / servo.rating)]%") + else + . += span_warning("It's missing a micro-servo.") + if(capacitor) + . += span_notice("Capacitor increases armor against energy attacks by [capacitor.rating * 5].") + else + . += span_warning("It's missing a capacitor.") + if(!scanmod) + . += span_warning("It's missing a scanning module.") if(enclosed) return if(mecha_flags & SILICON_PILOT) @@ -478,69 +496,74 @@ return examine_text +///Locate an internal tack in the utility modules +/obj/vehicle/sealed/mecha/proc/get_internal_tank() + var/obj/item/mecha_parts/mecha_equipment/air_tank/module = locate(/obj/item/mecha_parts/mecha_equipment/air_tank) in equip_by_category[MECHA_UTILITY] + return module?.internal_tank + //processing internal damage, temperature, air regulation, alert updates, lights power use. /obj/vehicle/sealed/mecha/process(seconds_per_tick) + if(overclock_mode || overclock_temp > 0) + process_overclock_effects(seconds_per_tick) if(internal_damage) - if(internal_damage & MECHA_INT_FIRE) - if(!(internal_damage & MECHA_INT_TEMP_CONTROL) && SPT_PROB(2.5, seconds_per_tick)) - clear_internal_damage(MECHA_INT_FIRE) - if(internal_tank) - var/datum/gas_mixture/int_tank_air = internal_tank.return_air() - if(int_tank_air.return_pressure() > internal_tank.maximum_pressure && !(internal_damage & MECHA_INT_TANK_BREACH)) - set_internal_damage(MECHA_INT_TANK_BREACH) - if(int_tank_air && int_tank_air.return_volume() > 0) //heat the air_contents - int_tank_air.temperature = min(6000+T0C, int_tank_air.temperature+rand(5,7.5)*seconds_per_tick) - if(cabin_air && cabin_air.return_volume()>0) - cabin_air.temperature = min(6000+T0C, cabin_air.return_temperature()+rand(5,7.5)*seconds_per_tick) - if(cabin_air.return_temperature() > max_temperature/2) - take_damage(seconds_per_tick*2/round(max_temperature/cabin_air.return_temperature(),0.1), BURN, 0, 0) - - - if(internal_damage & MECHA_INT_TANK_BREACH) //remove some air from internal tank - if(internal_tank) - var/datum/gas_mixture/int_tank_air = internal_tank.return_air() - var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(SPT_PROB_RATE(0.05, seconds_per_tick)) - if(loc) - loc.assume_air(leaked_gas) - else - qdel(leaked_gas) - - if(internal_damage & MECHA_INT_SHORT_CIRCUIT) - if(get_charge()) - spark_system.start() - cell.charge -= min(10 * seconds_per_tick, cell.charge) - cell.maxcharge -= min(10 * seconds_per_tick, cell.maxcharge) - - if(!(internal_damage & MECHA_INT_TEMP_CONTROL)) - if(cabin_air && cabin_air.return_volume() > 0) - var/delta = cabin_air.temperature - T20C - cabin_air.temperature -= clamp(round(delta / 8, 0.1), -5, 5) * seconds_per_tick - - if(internal_tank) - var/datum/gas_mixture/tank_air = internal_tank.return_air() - - var/release_pressure = internal_tank_valve - var/cabin_pressure = cabin_air.return_pressure() - var/pressure_delta = min(release_pressure - cabin_pressure, (tank_air.return_pressure() - cabin_pressure)/2) - var/transfer_moles = 0 - if(pressure_delta > 0) //cabin pressure lower than release pressure - if(tank_air.return_temperature() > 0) - transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = tank_air.remove(transfer_moles) - cabin_air.merge(removed) - else if(pressure_delta < 0) //cabin pressure higher than release pressure - var/datum/gas_mixture/t_air = return_air() - pressure_delta = cabin_pressure - release_pressure - if(t_air) - pressure_delta = min(cabin_pressure - t_air.return_pressure(), pressure_delta) - if(pressure_delta > 0) //if location pressure is lower than cabin pressure - transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = cabin_air.remove(transfer_moles) - if(t_air) - t_air.merge(removed) - else //just delete the cabin gas, we're in space or some shit - qdel(removed) + process_internal_damage_effects(seconds_per_tick) + if(cabin_sealed) + process_cabin_air(seconds_per_tick) + if(length(occupants)) + process_occupants(seconds_per_tick) + process_constant_power_usage(seconds_per_tick) + +/obj/vehicle/sealed/mecha/proc/process_overclock_effects(seconds_per_tick) + if(!overclock_mode && overclock_temp > 0) + overclock_temp -= seconds_per_tick + return + overclock_temp = min(overclock_temp + seconds_per_tick, overclock_temp_danger * 2) + if(overclock_temp < overclock_temp_danger) + return + var/damage_chance = 100 * ((overclock_temp - overclock_temp_danger) / (overclock_temp_danger * 2)) + if(SPT_PROB(damage_chance, seconds_per_tick)) + do_sparks(5, TRUE, src) + try_deal_internal_damage(damage_chance) + take_damage(seconds_per_tick, BURN, 0, 0) + +/obj/vehicle/sealed/mecha/proc/process_internal_damage_effects(seconds_per_tick) + if(internal_damage & MECHA_INT_FIRE) + if(!(internal_damage & MECHA_INT_TEMP_CONTROL) && SPT_PROB(2.5, seconds_per_tick)) + clear_internal_damage(MECHA_INT_FIRE) + if(cabin_air && cabin_sealed && cabin_air.return_volume()>0) + if(cabin_air.return_pressure() > (PUMP_DEFAULT_PRESSURE * 30) && !(internal_damage & MECHA_CABIN_AIR_BREACH)) + set_internal_damage(MECHA_CABIN_AIR_BREACH) + cabin_air.temperature = min(6000+T0C, cabin_air.temperature+rand(5,7.5)*seconds_per_tick) + if(cabin_air.return_temperature() > max_temperature/2) + take_damage(seconds_per_tick*2/round(max_temperature/cabin_air.return_temperature(),0.1), BURN, 0, 0) + + if(internal_damage & MECHA_CABIN_AIR_BREACH && cabin_air && cabin_sealed) //remove some air from cabin_air + var/datum/gas_mixture/leaked_gas = cabin_air.remove_ratio(SPT_PROB_RATE(0.05, seconds_per_tick)) + if(loc) + loc.assume_air(leaked_gas) + else + qdel(leaked_gas) + + if(internal_damage & MECHA_INT_SHORT_CIRCUIT && get_charge()) + spark_system.start() + use_power(min(10 * seconds_per_tick, cell.charge)) + cell.maxcharge -= min(10 * seconds_per_tick, cell.maxcharge) + +/obj/vehicle/sealed/mecha/proc/process_cabin_air(seconds_per_tick) + if(!(internal_damage & MECHA_INT_TEMP_CONTROL) && cabin_air && cabin_air.return_volume() > 0) + var/heat_capacity = cabin_air.heat_capacity() + var/required_energy = abs(T20C - cabin_air.temperature) * heat_capacity + required_energy = min(required_energy, 1000) + if(required_energy < 1) + return + var/delta_temperature = required_energy / heat_capacity + if(delta_temperature) + if(cabin_air.temperature < T20C) + cabin_air.temperature += delta_temperature + else + cabin_air.temperature -= delta_temperature +/obj/vehicle/sealed/mecha/proc/process_occupants(seconds_per_tick) for(var/mob/living/occupant as anything in occupants) if(!enclosed && occupant?.incapacitated()) //no sides mean it's easy to just sorta fall out if you're incapacitated. mob_exit(occupant, randomstep = TRUE) //bye bye @@ -558,7 +581,6 @@ occupant.throw_alert(ALERT_CHARGE, /atom/movable/screen/alert/lowcell/mech, 3) else occupant.throw_alert(ALERT_CHARGE, /atom/movable/screen/alert/emptycell/mech) - var/integrity = atom_integrity/max_integrity*100 switch(integrity) if(30 to 45) @@ -582,15 +604,18 @@ else if (checking == src) break // all good checking = checking.loc - - if(mecha_flags & LIGHTS_ON) - use_power(2*seconds_per_tick) - -//Diagnostic HUD updates + //Diagnostic HUD updates diag_hud_set_mechhealth() diag_hud_set_mechcell() diag_hud_set_mechstat() +/obj/vehicle/sealed/mecha/proc/process_constant_power_usage(seconds_per_tick) + if(mecha_flags & LIGHTS_ON && !use_power(light_energy_drain * seconds_per_tick)) + mecha_flags &= ~LIGHTS_ON + set_light_on(mecha_flags & LIGHTS_ON) + playsound(src,'sound/machines/clockcult/brass_skewer.ogg', 40, TRUE) + log_message("Toggled lights off due to the lack of power.", LOG_MECHA) + ///Called when a driver clicks somewhere. Handles everything like equipment, punches, etc. /obj/vehicle/sealed/mecha/proc/on_mouseclick(mob/user, atom/target, list/modifiers) SIGNAL_HANDLER @@ -612,9 +637,6 @@ return if(user.incapacitated()) return - if(construction_state) - balloon_alert(user, "end maintenance first!") - return if(!get_charge()) return if(src == target) @@ -666,6 +688,7 @@ return use_power(melee_energy_drain) + SEND_SIGNAL(user, COMSIG_MOB_USED_MECH_MELEE, src) target.mech_melee_attack(src, user) TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MELEE_ATTACK, melee_cooldown) @@ -686,33 +709,17 @@ var/image/mech_speech = image('icons/mob/effects/talk.dmi', src, "machine[say_test(speech_args[SPEECH_MESSAGE])]",MOB_LAYER+1) INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(flick_overlay_global), mech_speech, speech_bubble_recipients, 3 SECONDS) - -///////////////////////// -////// Access stuff ///// -///////////////////////// - -/obj/vehicle/sealed/mecha/proc/operation_allowed(mob/M) - req_access = operation_req_access - req_one_access = list() - return allowed(M) - -/obj/vehicle/sealed/mecha/proc/internals_access_allowed(mob/M) - req_one_access = internals_req_access - req_access = list() - return allowed(M) - - ///////////////////////////////////// //////// Atmospheric stuff //////// ///////////////////////////////////// /obj/vehicle/sealed/mecha/remove_air(amount) - if(use_internal_tank) + if(enclosed && cabin_sealed) return cabin_air.remove(amount) return ..() /obj/vehicle/sealed/mecha/return_air() - if(use_internal_tank) + if(enclosed && cabin_sealed) return cabin_air return ..() @@ -729,6 +736,49 @@ var/datum/gas_mixture/air = return_air() return air?.return_temperature() +///makes cabin unsealed, dumping cabin air outside or airtight filling the cabin with external air mix +/obj/vehicle/sealed/mecha/proc/set_cabin_seal(mob/user, cabin_sealed) + if(!enclosed) + balloon_alert(user, "cabin can't be sealed!") + log_message("Tried to seal cabin. This mech can't be airtight.", LOG_MECHA) + return + if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_CABIN_SEAL)) + balloon_alert(user, "on cooldown!") + return + TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_CABIN_SEAL, 1 SECONDS) + + src.cabin_sealed = cabin_sealed + + var/datum/gas_mixture/environment_air = loc.return_air() + if(!isnull(environment_air)) + if(cabin_sealed) + // Fill cabin with air + environment_air.pump_gas_to(cabin_air, environment_air.return_pressure()) + else + // Dump cabin air + var/datum/gas_mixture/removed_gases = cabin_air.remove_ratio(1) + if(loc) + loc.assume_air(removed_gases) + else + qdel(removed_gases) + + var/obj/item/mecha_parts/mecha_equipment/air_tank/tank = locate(/obj/item/mecha_parts/mecha_equipment/air_tank) in equip_by_category[MECHA_UTILITY] + for(var/mob/occupant as anything in occupants) + var/datum/action/action = locate(/datum/action/vehicle/sealed/mecha/mech_toggle_cabin_seal) in occupant.actions + if(!isnull(tank) && cabin_sealed && tank.auto_pressurize_on_seal) + if(!tank.active) + tank.set_active(TRUE) + else + action.button_icon_state = "mech_cabin_pressurized" + action.build_all_button_icons() + else + action.button_icon_state = "mech_cabin_[cabin_sealed ? "closed" : "open"]" + action.build_all_button_icons() + + balloon_alert(occupant, "cabin [cabin_sealed ? "sealed" : "unsealed"]") + log_message("Cabin [cabin_sealed ? "sealed" : "unsealed"].", LOG_MECHA) + playsound(src, 'sound/machines/airlock.ogg', 50, TRUE) + /// Special light eater handling /obj/vehicle/sealed/mecha/proc/on_light_eater(obj/vehicle/sealed/source, datum/light_eater) SIGNAL_HANDLER @@ -739,3 +789,73 @@ for(var/occupant in occupants) remove_action_type_from_mob(/datum/action/vehicle/sealed/mecha/mech_toggle_lights, occupant) return COMPONENT_BLOCK_LIGHT_EATER + +/// Apply corresponding accesses +/obj/vehicle/sealed/mecha/proc/update_access() + req_access = one_access ? list() : accesses + req_one_access = one_access ? accesses : list() + +/// Electrocute user from power celll +/obj/vehicle/sealed/mecha/proc/shock(mob/living/user) + if(!istype(user) || get_charge() < 1) + return FALSE + do_sparks(5, TRUE, src) + return electrocute_mob(user, cell, src, 0.7, TRUE) + +/// Toggle mech overclock with a button or by hacking +/obj/vehicle/sealed/mecha/proc/toggle_overclock(forced_state = null) + if(!isnull(forced_state)) + if(overclock_mode == forced_state) + return + overclock_mode = forced_state + else + overclock_mode = !overclock_mode + log_message("Toggled overclocking.", LOG_MECHA) + if(overclock_mode) + movedelay = movedelay / overclock_coeff + visible_message(span_notice("[src] starts heating up, making humming sounds.")) + else + movedelay = initial(movedelay) + visible_message(span_notice("[src] cools down and the humming stops.")) + update_energy_drain() + +/// Update the energy drain according to parts and status +/obj/vehicle/sealed/mecha/proc/update_energy_drain() + if(servo) + step_energy_drain = initial(step_energy_drain) / servo.rating + else + step_energy_drain = 2 * initial(step_energy_drain) + if(overclock_mode) + step_energy_drain *= overclock_coeff + + if(capacitor) + phasing_energy_drain = initial(phasing_energy_drain) / capacitor.rating + melee_energy_drain = initial(melee_energy_drain) / capacitor.rating + light_energy_drain = initial(light_energy_drain) / capacitor.rating + else + phasing_energy_drain = initial(phasing_energy_drain) + melee_energy_drain = initial(melee_energy_drain) + light_energy_drain = initial(light_energy_drain) + +/// Toggle lights on/off +/obj/vehicle/sealed/mecha/proc/toggle_lights(forced_state = null, mob/user) + if(!(mecha_flags & HAS_LIGHTS)) + if(user) + balloon_alert(user, "mech has no lights!") + return + if((!(mecha_flags & LIGHTS_ON) && forced_state != FALSE) && get_charge() < light_energy_drain) + if(user) + balloon_alert(user, "no power for lights!") + return + mecha_flags ^= LIGHTS_ON + set_light_on(mecha_flags & LIGHTS_ON) + playsound(src,'sound/machines/clockcult/brass_skewer.ogg', 40, TRUE) + log_message("Toggled lights [(mecha_flags & LIGHTS_ON)?"on":"off"].", LOG_MECHA) + for(var/mob/occupant as anything in occupants) + var/datum/action/act = locate(/datum/action/vehicle/sealed/mecha/mech_toggle_lights) in occupant.actions + if(mecha_flags & LIGHTS_ON) + act.button_icon_state = "mech_lights_on" + else + act.button_icon_state = "mech_lights_off" + balloon_alert(occupant, "toggled lights [mecha_flags & LIGHTS_ON ? "on":"off"]") + act.build_all_button_icons() diff --git a/code/modules/vehicles/mecha/combat/durand.dm b/code/modules/vehicles/mecha/combat/durand.dm index 021ca168177ca..4ac13b8dd64b7 100644 --- a/code/modules/vehicles/mecha/combat/durand.dm +++ b/code/modules/vehicles/mecha/combat/durand.dm @@ -5,7 +5,7 @@ base_icon_state = "durand" movedelay = 4 max_integrity = 400 - internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY) + accesses = list(ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY) armor_type = /datum/armor/mecha_durand max_temperature = 30000 force = 40 @@ -14,7 +14,9 @@ wreckage = /obj/structure/mecha_wreckage/durand mech_type = EXOSUIT_MODULE_DURAND max_equip_by_category = list( - MECHA_UTILITY = 1, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 3, MECHA_POWER = 1, MECHA_ARMOR = 3, ) @@ -156,7 +158,7 @@ own integrity back to max. Shield is automatically dropped if we run out of powe /obj/durand_shield //projectiles get passed to this when defense mode is enabled name = "defense grid" - icon = 'icons/mecha/durand_shield.dmi' + icon = 'icons/mob/effects/durand_shield.dmi' icon_state = "shield_null" invisibility = INVISIBILITY_MAXIMUM //no showing on right-click pixel_y = 4 @@ -261,7 +263,7 @@ own integrity back to max. Shield is automatically dropped if we run out of powe setDir(newdir) -/obj/durand_shield/take_damage() +/obj/durand_shield/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armour_penetration = 0) if(!chassis) qdel(src) return diff --git a/code/modules/vehicles/mecha/combat/gygax.dm b/code/modules/vehicles/mecha/combat/gygax.dm index 955fe102a305c..204739cd7fc0f 100644 --- a/code/modules/vehicles/mecha/combat/gygax.dm +++ b/code/modules/vehicles/mecha/combat/gygax.dm @@ -3,24 +3,25 @@ name = "\improper Gygax" icon_state = "gygax" base_icon_state = "gygax" - allow_diagonal_movement = TRUE movedelay = 3 max_integrity = 250 - internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY) + accesses = list(ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY) armor_type = /datum/armor/mecha_gygax max_temperature = 25000 - leg_overload_coeff = 80 force = 25 destruction_sleep_duration = 40 exit_delay = 40 wreckage = /obj/structure/mecha_wreckage/gygax mech_type = EXOSUIT_MODULE_GYGAX max_equip_by_category = list( - MECHA_UTILITY = 1, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 3, MECHA_POWER = 1, MECHA_ARMOR = 2, ) - step_energy_drain = 3 + step_energy_drain = 4 + can_use_overclock = TRUE /datum/armor/mecha_gygax melee = 25 @@ -30,57 +31,32 @@ fire = 100 acid = 100 -/obj/vehicle/sealed/mecha/gygax/generate_actions() - . = ..() - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_overload_mode) - -/datum/action/vehicle/sealed/mecha/mech_overload_mode - name = "Toggle leg actuators overload" - button_icon_state = "mech_overload_off" - -/datum/action/vehicle/sealed/mecha/mech_overload_mode/Trigger(trigger_flags, forced_state = null) - if(!owner || !chassis || !(owner in chassis.occupants)) - return - if(!isnull(forced_state)) - chassis.leg_overload_mode = forced_state - else - chassis.leg_overload_mode = !chassis.leg_overload_mode - button_icon_state = "mech_overload_[chassis.leg_overload_mode ? "on" : "off"]" - chassis.log_message("Toggled leg actuators overload.", LOG_MECHA) - if(chassis.leg_overload_mode) - chassis.speed_mod = min(chassis.movedelay-1, round(chassis.movedelay * 0.5)) - chassis.movedelay -= chassis.speed_mod - chassis.step_energy_drain = max(chassis.overload_step_energy_drain_min,chassis.step_energy_drain*chassis.leg_overload_coeff) - chassis.balloon_alert(owner,"leg actuators overloaded") - else - chassis.movedelay += chassis.speed_mod - chassis.step_energy_drain = chassis.normal_step_energy_drain - chassis.balloon_alert(owner, "you disable the overload") - build_all_button_icons() - /obj/vehicle/sealed/mecha/gygax/dark desc = "A lightweight exosuit, painted in a dark scheme. This model appears to have some modifications." name = "\improper Dark Gygax" + ui_theme = "syndicate" icon_state = "darkgygax" base_icon_state = "darkgygax" max_integrity = 300 armor_type = /datum/armor/gygax_dark max_temperature = 35000 - leg_overload_coeff = 70 + overclock_coeff = 2 + overclock_temp_danger = 20 force = 30 - operation_req_access = list(ACCESS_SYNDICATE) - internals_req_access = list(ACCESS_SYNDICATE) + accesses = list(ACCESS_SYNDICATE) wreckage = /obj/structure/mecha_wreckage/gygax/dark - mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE + mecha_flags = ID_LOCK_ON | CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE max_equip_by_category = list( - MECHA_UTILITY = 2, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 4, MECHA_POWER = 1, MECHA_ARMOR = 3, ) equip_by_category = list( MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot, MECHA_R_ARM = null, - MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/thrusters/ion), + MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/radio, /obj/item/mecha_parts/mecha_equipment/air_tank/full, /obj/item/mecha_parts/mecha_equipment/thrusters/ion), MECHA_POWER = list(), MECHA_ARMOR = list(/obj/item/mecha_parts/mecha_equipment/armor/anticcw_armor_booster, /obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster), ) @@ -99,11 +75,9 @@ . = ..() max_ammo() -/obj/vehicle/sealed/mecha/gygax/dark/add_cell() +/obj/vehicle/sealed/mecha/gygax/dark/loaded/populate_parts() cell = new /obj/item/stock_parts/cell/bluespace(src) - -/obj/vehicle/sealed/mecha/gygax/dark/add_scanmod() scanmod = new /obj/item/stock_parts/scanning_module/triphasic(src) - -/obj/vehicle/sealed/mecha/gygax/dark/add_capacitor() capacitor = new /obj/item/stock_parts/capacitor/quadratic(src) + servo = new /obj/item/stock_parts/servo/femto(src) + update_part_values() diff --git a/code/modules/vehicles/mecha/combat/honker.dm b/code/modules/vehicles/mecha/combat/honker.dm index dd01492f19d7b..dddcb7e82252f 100644 --- a/code/modules/vehicles/mecha/combat/honker.dm +++ b/code/modules/vehicles/mecha/combat/honker.dm @@ -1,6 +1,7 @@ /obj/vehicle/sealed/mecha/honker desc = "Produced by \"Tyranny of Honk, INC\", this exosuit is designed as heavy clown-support. Used to spread the fun and joy of life. HONK!" name = "\improper H.O.N.K" + ui_theme = "neutral" icon_state = "honker" base_icon_state = "honker" movedelay = 3 @@ -10,13 +11,14 @@ max_temperature = 25000 destruction_sleep_duration = 40 exit_delay = 40 - operation_req_access = list(ACCESS_THEATRE) - internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_THEATRE) + accesses = list(ACCESS_MECH_SCIENCE, ACCESS_THEATRE) wreckage = /obj/structure/mecha_wreckage/honker mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE mech_type = EXOSUIT_MODULE_HONK max_equip_by_category = list( - MECHA_UTILITY = 2, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 4, MECHA_POWER = 1, MECHA_ARMOR = 0, ) @@ -38,15 +40,18 @@ /obj/vehicle/sealed/mecha/honker/dark desc = "Produced by \"Tyranny of Honk, INC\", this exosuit is designed as heavy clown-support. This one has been painted black for maximum fun. HONK!" name = "\improper Dark H.O.N.K" + ui_theme = "syndicate" icon_state = "darkhonker" max_integrity = 300 armor_type = /datum/armor/honker_dark max_temperature = 35000 - operation_req_access = list(ACCESS_SYNDICATE) - internals_req_access = list(ACCESS_SYNDICATE) + accesses = list(ACCESS_SYNDICATE) wreckage = /obj/structure/mecha_wreckage/honker/dark + mecha_flags = ID_LOCK_ON | CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE max_equip_by_category = list( - MECHA_UTILITY = 1, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 3, MECHA_POWER = 1, MECHA_ARMOR = 3, ) @@ -55,7 +60,7 @@ equip_by_category = list( MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/honker, MECHA_R_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar/bombanana, - MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/thrusters/ion), + MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/radio, /obj/item/mecha_parts/mecha_equipment/air_tank/full, /obj/item/mecha_parts/mecha_equipment/thrusters/ion), MECHA_POWER = list(), MECHA_ARMOR = list(), ) @@ -69,14 +74,12 @@ fire = 100 acid = 100 -/obj/vehicle/sealed/mecha/honker/dark/add_cell() +/obj/vehicle/sealed/mecha/honker/dark/loaded/populate_parts() cell = new /obj/item/stock_parts/cell/hyper(src) - -/obj/vehicle/sealed/mecha/honker/dark/add_scanmod() scanmod = new /obj/item/stock_parts/scanning_module/phasic(src) - -/obj/vehicle/sealed/mecha/honker/dark/add_capacitor() capacitor = new /obj/item/stock_parts/capacitor/super(src) + servo = new /obj/item/stock_parts/servo/pico(src) + update_part_values() /obj/structure/mecha_wreckage/honker/dark name = "\improper Dark H.O.N.K wreckage" diff --git a/code/modules/vehicles/mecha/combat/marauder.dm b/code/modules/vehicles/mecha/combat/marauder.dm index bf0138d2c307c..79b0956899430 100644 --- a/code/modules/vehicles/mecha/combat/marauder.dm +++ b/code/modules/vehicles/mecha/combat/marauder.dm @@ -10,15 +10,16 @@ destruction_sleep_duration = 40 exit_delay = 40 resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - operation_req_access = list(ACCESS_CENT_SPECOPS) - internals_req_access = list(ACCESS_CENT_SPECOPS) + accesses = list(ACCESS_CENT_SPECOPS) wreckage = /obj/structure/mecha_wreckage/marauder mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE mech_type = EXOSUIT_MODULE_MARAUDER force = 45 max_equip_by_category = list( - MECHA_UTILITY = 3, - MECHA_POWER = 2, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 5, + MECHA_POWER = 1, MECHA_ARMOR = 3, ) bumpsmash = TRUE @@ -41,17 +42,17 @@ equip_by_category = list( MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse, MECHA_R_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack, - MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/thrusters/ion), + MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/radio, /obj/item/mecha_parts/mecha_equipment/air_tank/full, /obj/item/mecha_parts/mecha_equipment/thrusters/ion), MECHA_POWER = list(), MECHA_ARMOR = list(/obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster), ) -/obj/vehicle/sealed/mecha/marauder/add_cell(obj/item/stock_parts/cell/C=null) - if(C) - C.forceMove(src) - cell = C - return +/obj/vehicle/sealed/mecha/marauder/loaded/populate_parts() cell = new /obj/item/stock_parts/cell/bluespace(src) + scanmod = new /obj/item/stock_parts/scanning_module/triphasic(src) + capacitor = new /obj/item/stock_parts/capacitor/quadratic(src) + servo = new /obj/item/stock_parts/servo/femto(src) + update_part_values() /datum/action/vehicle/sealed/mecha/mech_smoke name = "Smoke" @@ -88,21 +89,22 @@ name = "\improper Seraph" icon_state = "seraph" base_icon_state = "seraph" - operation_req_access = list(ACCESS_CENT_SPECOPS) - internals_req_access = list(ACCESS_CENT_SPECOPS) + accesses = list(ACCESS_CENT_SPECOPS) movedelay = 3 max_integrity = 550 wreckage = /obj/structure/mecha_wreckage/seraph force = 55 max_equip_by_category = list( - MECHA_UTILITY = 3, - MECHA_POWER = 2, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 5, + MECHA_POWER = 1, MECHA_ARMOR = 3, ) equip_by_category = list( MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse, MECHA_R_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack, - MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/thrusters/ion), + MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/radio, /obj/item/mecha_parts/mecha_equipment/air_tank/full, /obj/item/mecha_parts/mecha_equipment/thrusters/ion), MECHA_POWER = list(), MECHA_ARMOR = list(/obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster), ) @@ -110,20 +112,23 @@ /obj/vehicle/sealed/mecha/marauder/mauler desc = "Heavy-duty, combat exosuit, developed off of the existing Marauder model." name = "\improper Mauler" + ui_theme = "syndicate" icon_state = "mauler" base_icon_state = "mauler" - operation_req_access = list(ACCESS_SYNDICATE) - internals_req_access = list(ACCESS_SYNDICATE) + accesses = list(ACCESS_SYNDICATE) wreckage = /obj/structure/mecha_wreckage/mauler + mecha_flags = ID_LOCK_ON | CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE max_equip_by_category = list( - MECHA_UTILITY = 3, - MECHA_POWER = 2, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 4, + MECHA_POWER = 1, MECHA_ARMOR = 4, ) equip_by_category = list( MECHA_L_ARM = null, MECHA_R_ARM = null, - MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/thrusters/ion), + MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/radio, /obj/item/mecha_parts/mecha_equipment/air_tank/full, /obj/item/mecha_parts/mecha_equipment/thrusters/ion), MECHA_POWER = list(), MECHA_ARMOR = list(), ) @@ -133,16 +138,18 @@ equip_by_category = list( MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg, MECHA_R_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack, - MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/thrusters/ion), + MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/radio, /obj/item/mecha_parts/mecha_equipment/air_tank/full, /obj/item/mecha_parts/mecha_equipment/thrusters/ion), MECHA_POWER = list(), MECHA_ARMOR = list(/obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster), ) -/obj/vehicle/sealed/mecha/marauder/add_cell() - cell = new /obj/item/stock_parts/cell/bluespace(src) +/obj/vehicle/sealed/mecha/marauder/mauler/loaded/Initialize(mapload) + . = ..() + max_ammo() -/obj/vehicle/sealed/mecha/marauder/add_scanmod() +/obj/vehicle/sealed/mecha/marauder/mauler/loaded/populate_parts() + cell = new /obj/item/stock_parts/cell/bluespace(src) scanmod = new /obj/item/stock_parts/scanning_module/triphasic(src) - -/obj/vehicle/sealed/mecha/marauder/add_capacitor() capacitor = new /obj/item/stock_parts/capacitor/quadratic(src) + servo = new /obj/item/stock_parts/servo/femto(src) + update_part_values() diff --git a/code/modules/vehicles/mecha/combat/phazon.dm b/code/modules/vehicles/mecha/combat/phazon.dm index 9303d04c94582..9c80339bde4af 100644 --- a/code/modules/vehicles/mecha/combat/phazon.dm +++ b/code/modules/vehicles/mecha/combat/phazon.dm @@ -4,18 +4,20 @@ icon_state = "phazon" base_icon_state = "phazon" movedelay = 2 - step_energy_drain = 3 + step_energy_drain = 4 max_integrity = 200 armor_type = /datum/armor/mecha_phazon max_temperature = 25000 - internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY) + accesses = list(ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY) destruction_sleep_duration = 40 exit_delay = 40 wreckage = /obj/structure/mecha_wreckage/phazon mech_type = EXOSUIT_MODULE_PHAZON force = 15 max_equip_by_category = list( - MECHA_UTILITY = 1, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 3, MECHA_POWER = 1, MECHA_ARMOR = 2, ) diff --git a/code/modules/vehicles/mecha/combat/reticence.dm b/code/modules/vehicles/mecha/combat/reticence.dm index 17f933b450477..bff5ecbd97bf4 100644 --- a/code/modules/vehicles/mecha/combat/reticence.dm +++ b/code/modules/vehicles/mecha/combat/reticence.dm @@ -11,16 +11,17 @@ destruction_sleep_duration = 40 exit_delay = 40 wreckage = /obj/structure/mecha_wreckage/reticence - operation_req_access = list(ACCESS_THEATRE) - internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_THEATRE) + accesses = list(ACCESS_MECH_SCIENCE, ACCESS_THEATRE) mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | QUIET_STEPS | QUIET_TURNS | MMI_COMPATIBLE mech_type = EXOSUIT_MODULE_RETICENCE max_equip_by_category = list( - MECHA_UTILITY = 1, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 3, MECHA_POWER = 1, MECHA_ARMOR = 1, ) - step_energy_drain = 3 + step_energy_drain = 4 color = "#87878715" /datum/armor/mecha_reticence @@ -40,11 +41,9 @@ MECHA_ARMOR = list(), ) -/obj/vehicle/sealed/mecha/reticence/add_cell() - cell = new /obj/item/stock_parts/cell/bluespace(src) - -/obj/vehicle/sealed/mecha/reticence/add_scanmod() - scanmod = new /obj/item/stock_parts/scanning_module/triphasic(src) - -/obj/vehicle/sealed/mecha/reticence/add_capacitor() - capacitor = new /obj/item/stock_parts/capacitor/quadratic(src) +/obj/vehicle/sealed/mecha/reticence/loaded/populate_parts() + cell = new /obj/item/stock_parts/cell/hyper(src) + scanmod = new /obj/item/stock_parts/scanning_module/phasic(src) + capacitor = new /obj/item/stock_parts/capacitor/super(src) + servo = new /obj/item/stock_parts/servo/pico(src) + update_part_values() diff --git a/code/modules/vehicles/mecha/combat/savannah_ivanov.dm b/code/modules/vehicles/mecha/combat/savannah_ivanov.dm index 1ffc40fc10bc3..e3926aa7d3502 100644 --- a/code/modules/vehicles/mecha/combat/savannah_ivanov.dm +++ b/code/modules/vehicles/mecha/combat/savannah_ivanov.dm @@ -15,11 +15,11 @@ /obj/vehicle/sealed/mecha/savannah_ivanov name = "\improper Savannah-Ivanov" desc = "An insanely overbulked mecha that handily crushes single-pilot opponents. The price is that you need two pilots to use it." - icon = 'icons/mecha/coop_mech.dmi' + icon = 'icons/mob/coop_mech.dmi' base_icon_state = "savannah_ivanov" icon_state = "savannah_ivanov_0_0" //does not include mmi compatibility - mecha_flags = ADDING_ACCESS_POSSIBLE | CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS + mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS mech_type = EXOSUIT_MODULE_SAVANNAH movedelay = 3 max_integrity = 450 //really tanky, like damn @@ -31,7 +31,9 @@ wreckage = /obj/structure/mecha_wreckage/savannah_ivanov max_occupants = 2 max_equip_by_category = list( - MECHA_UTILITY = 1, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 3, MECHA_POWER = 1, MECHA_ARMOR = 3, ) @@ -210,7 +212,7 @@ to_chat(crushed_victim, span_userdanger("[chassis] crashes down on you from above!")) if(crushed_victim.stat != CONSCIOUS) crushed_victim.investigate_log("has been gibbed by a falling Savannah Ivanov mech.", INVESTIGATE_DEATHS) - crushed_victim.gib(FALSE, FALSE, FALSE) + crushed_victim.gib(DROP_ALL_REMAINS) continue crushed_victim.adjustBruteLoss(80) diff --git a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm b/code/modules/vehicles/mecha/equipment/mecha_equipment.dm index 3a55ea6113e2c..f9ee84ba4b893 100644 --- a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm +++ b/code/modules/vehicles/mecha/equipment/mecha_equipment.dm @@ -4,7 +4,7 @@ */ /obj/item/mecha_parts/mecha_equipment name = "mecha equipment" - icon = 'icons/mecha/mecha_equipment.dmi' + icon = 'icons/mob/mecha_equipment.dmi' icon_state = "mecha_equip" force = 5 max_integrity = 300 @@ -12,8 +12,14 @@ var/equipment_slot = MECHA_WEAPON ///Cooldown in ticks required between activations of the equipment var/equip_cooldown = 0 - ///used for equipment that can be turned on/off, boolean - var/activated = TRUE + ///Whether you can turn this module on/off with a button + var/can_be_toggled = FALSE + ///Whether you can trigger this module with a button (activation only) + var/can_be_triggered = FALSE + ///Whether the module is currently active + var/active = TRUE + ///Label used in the ui next to the Activate/Enable/Disable buttons + var/active_label = "Status" ///Chassis power cell quantity used on activation var/energy_drain = 0 ///Reference to mecha that this equipment is currently attached to @@ -31,11 +37,11 @@ /obj/item/mecha_parts/mecha_equipment/Destroy() if(chassis) - detach(get_turf(src)) - log_message("[src] is destroyed.", LOG_MECHA) if(LAZYLEN(chassis.occupants)) to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_danger("[src] is destroyed!")]") playsound(chassis, destroy_sound, 50) + detach(get_turf(src)) + log_message("[src] is destroyed.", LOG_MECHA) chassis = null return ..() @@ -52,13 +58,16 @@ /obj/item/mecha_parts/mecha_equipment/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() + if(.) + return switch(action) if("detach") + chassis.ui_selected_module_index = null detach(get_turf(src)) - return TRUE + . = TRUE if("toggle") - activated = !activated - return TRUE + set_active(!active) + . = TRUE if("repair") ui.close() // allow watching for baddies and the ingame effects chassis.balloon_alert(usr, "starting repair") @@ -66,10 +75,17 @@ repair_damage(30) if(get_integrity() == max_integrity) balloon_alert(usr, "repair complete") - return FALSE + . = FALSE + var/result = handle_ui_act(action,params,ui,state) + if(result) //if handle_ui_act returned anything at all lets just return that instead + . = result + +/// called after ui_act, for custom ui act handling +/obj/item/mecha_parts/mecha_equipment/proc/handle_ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + SHOULD_CALL_PARENT(FALSE) /** - * Checks whether this mecha equipment can be activated + * Checks whether this mecha equipment can be active * Returns a bool * Arguments: * * target: atom we are activating/clicked on @@ -79,7 +95,7 @@ return FALSE if(!chassis) return FALSE - if(!activated) + if(!active) return FALSE if(energy_drain && !chassis?.has_charge(energy_drain)) return FALSE @@ -97,6 +113,7 @@ /obj/item/mecha_parts/mecha_equipment/proc/action(mob/source, atom/target, list/modifiers) TIMER_COOLDOWN_START(chassis, COOLDOWN_MECHA_EQUIPMENT(type), equip_cooldown)//Cooldown is on the MECH so people dont bypass it by switching equipment + SEND_SIGNAL(source, COMSIG_MOB_USED_MECH_EQUIPMENT, chassis) chassis.use_power(energy_drain) return TRUE @@ -158,21 +175,21 @@ /obj/item/mecha_parts/mecha_equipment/proc/special_attaching_interaction(attach_right = FALSE, obj/vehicle/sealed/mecha/mech, mob/user, checkonly = FALSE) return FALSE -/obj/item/mecha_parts/mecha_equipment/proc/attach(obj/vehicle/sealed/mecha/M, attach_right = FALSE) - LAZYADD(M.flat_equipment, src) +/obj/item/mecha_parts/mecha_equipment/proc/attach(obj/vehicle/sealed/mecha/new_mecha, attach_right = FALSE) + LAZYADD(new_mecha.flat_equipment, src) var/to_equip_slot = equipment_slot if(equipment_slot == MECHA_WEAPON) if(attach_right) to_equip_slot = MECHA_R_ARM else to_equip_slot = MECHA_L_ARM - if(islist(M.equip_by_category[to_equip_slot])) - M.equip_by_category[to_equip_slot] += src + if(islist(new_mecha.equip_by_category[to_equip_slot])) + new_mecha.equip_by_category[to_equip_slot] += src else - M.equip_by_category[to_equip_slot] = src - chassis = M + new_mecha.equip_by_category[to_equip_slot] = src + chassis = new_mecha SEND_SIGNAL(src, COMSIG_MECHA_EQUIPMENT_ATTACHED) - forceMove(M) + forceMove(new_mecha) log_message("[src] initialized.", LOG_MECHA) /** @@ -183,6 +200,7 @@ /obj/item/mecha_parts/mecha_equipment/proc/detach(atom/moveto) moveto = moveto || get_turf(chassis) forceMove(moveto) + playsound(chassis, 'sound/weapons/tap.ogg', 50, TRUE) LAZYREMOVE(chassis.flat_equipment, src) var/to_unequip_slot = equipment_slot if(equipment_slot == MECHA_WEAPON) @@ -198,6 +216,9 @@ log_message("[src] removed from equipment.", LOG_MECHA) chassis = null +/obj/item/mecha_parts/mecha_equipment/proc/set_active(active) + src.active = active + /obj/item/mecha_parts/mecha_equipment/log_message(message, message_type=LOG_GAME, color=null, log_globally) if(chassis) return chassis.log_message("ATTACHMENT: [src] [message]", message_type, color) diff --git a/code/modules/vehicles/mecha/equipment/tools/air_tank.dm b/code/modules/vehicles/mecha/equipment/tools/air_tank.dm new file mode 100644 index 0000000000000..3062d9923bc06 --- /dev/null +++ b/code/modules/vehicles/mecha/equipment/tools/air_tank.dm @@ -0,0 +1,158 @@ +///Mech air tank module +/obj/item/mecha_parts/mecha_equipment/air_tank + name = "mounted air tank" + desc = "An internal air tank used to pressurize mech cabin, scrub CO2 and power RCS thrusters. Comes with a pump and a set of sensors." + icon_state = "mecha_air_tank" + equipment_slot = MECHA_UTILITY + can_be_toggled = TRUE + ///Whether the pressurization should start automatically when the cabin is sealed airtight + var/auto_pressurize_on_seal = TRUE + ///The internal air tank obj of the mech + var/obj/machinery/portable_atmospherics/canister/internal_tank + ///Volume of this air tank + var/volume = TANK_STANDARD_VOLUME * 10 + ///Maximum pressure of this air tank + var/maximum_pressure = ONE_ATMOSPHERE * 30 + ///Whether the tank starts pressurized + var/start_full = FALSE + ///Pumping + ///The connected air port, if we have one + var/obj/machinery/atmospherics/components/unary/portables_connector/connected_port + ///Whether the pump is moving the air from/to the connected port + var/tank_pump_active = FALSE + ///Direction of the pump - into the tank from the port or the air (PUMP_IN) or from the tank (PUMP_OUT) + var/tank_pump_direction = PUMP_IN + ///Target pressure of the pump + var/tank_pump_pressure = ONE_ATMOSPHERE + +/obj/item/mecha_parts/mecha_equipment/air_tank/Initialize(mapload) + . = ..() + internal_tank = new(src) + internal_tank.air_contents.volume = volume + internal_tank.maximum_pressure = maximum_pressure + if(start_full) + internal_tank.air_contents.temperature = T20C + internal_tank.air_contents.add_gases(/datum/gas/oxygen) + internal_tank.air_contents.gases[/datum/gas/oxygen][MOLES] = maximum_pressure * volume / (R_IDEAL_GAS_EQUATION * internal_tank.air_contents.temperature) + +/obj/item/mecha_parts/mecha_equipment/air_tank/Destroy() + if(chassis) + UnregisterSignal(chassis, COMSIG_MOVABLE_PRE_MOVE) + STOP_PROCESSING(SSobj, src) + qdel(internal_tank) + return ..() + +/obj/item/mecha_parts/mecha_equipment/air_tank/attach(obj/vehicle/sealed/mecha/new_mecha, attach_right) + . = ..() + START_PROCESSING(SSobj, src) + RegisterSignal(new_mecha, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(disconnect_air)) + +/obj/item/mecha_parts/mecha_equipment/air_tank/detach(atom/moveto) + disconnect_air() + if(tank_pump_active) + tank_pump_active = FALSE + UnregisterSignal(chassis, COMSIG_MOVABLE_PRE_MOVE) + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/mecha_parts/mecha_equipment/air_tank/set_active(active) + . = ..() + if(active) + var/datum/action/action = locate(/datum/action/vehicle/sealed/mecha/mech_toggle_cabin_seal) in usr.actions + action.button_icon_state = "mech_cabin_[chassis.cabin_sealed ? "pressurized" : "open"]" + action.build_all_button_icons() + else + var/datum/action/action = locate(/datum/action/vehicle/sealed/mecha/mech_toggle_cabin_seal) in usr.actions + action.button_icon_state = "mech_cabin_[chassis.cabin_sealed ? "closed" : "open"]" + action.build_all_button_icons() + +/obj/item/mecha_parts/mecha_equipment/air_tank/process(seconds_per_tick) + if(!chassis) + return + process_cabin_pressure() + process_pump() + +/obj/item/mecha_parts/mecha_equipment/air_tank/proc/process_cabin_pressure(seconds_per_tick) + if(!chassis.cabin_sealed || !active) + return + var/datum/gas_mixture/external_air = chassis.loc.return_air() + var/datum/gas_mixture/tank_air = internal_tank.return_air() + var/datum/gas_mixture/cabin_air = chassis.cabin_air + var/release_pressure = internal_tank.release_pressure + var/cabin_pressure = cabin_air.return_pressure() + if(cabin_pressure < release_pressure) + tank_air.release_gas_to(cabin_air, release_pressure) + if(cabin_pressure) + cabin_air.pump_gas_to(external_air, PUMP_MAX_PRESSURE, GAS_CO2) + +/obj/item/mecha_parts/mecha_equipment/air_tank/proc/process_pump(seconds_per_tick) + if(!tank_pump_active) + return + var/turf/local_turf = get_turf(chassis) + var/datum/gas_mixture/sending = (tank_pump_direction == PUMP_IN ? local_turf.return_air() : internal_tank.air_contents) + var/datum/gas_mixture/receiving = (tank_pump_direction == PUMP_IN ? internal_tank.air_contents : local_turf.return_air()) + if(sending.pump_gas_to(receiving, tank_pump_pressure)) + air_update_turf(FALSE, FALSE) + +/obj/item/mecha_parts/mecha_equipment/air_tank/proc/disconnect_air() + SIGNAL_HANDLER + if(connected_port && internal_tank.disconnect()) + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_warning("Air port connection has been severed!")]") + log_message("Lost connection to gas port.", LOG_MECHA) + +/obj/item/mecha_parts/mecha_equipment/air_tank/get_snowflake_data() + var/datum/gas_mixture/tank_air = internal_tank.return_air() + return list( + "snowflake_id" = MECHA_SNOWFLAKE_ID_AIR_TANK, + "auto_pressurize_on_seal" = auto_pressurize_on_seal, + "port_connected" = internal_tank?.connected_port ? TRUE : FALSE, + "tank_release_pressure" = round(internal_tank.release_pressure), + "tank_release_pressure_min" = internal_tank.can_min_release_pressure, + "tank_release_pressure_max" = internal_tank.can_max_release_pressure, + "tank_pump_active" = tank_pump_active, + "tank_pump_direction" = tank_pump_direction, + "tank_pump_pressure" = round(tank_pump_pressure), + "tank_pump_pressure_min" = PUMP_MIN_PRESSURE, + "tank_pump_pressure_max" = min(PUMP_MAX_PRESSURE, internal_tank.maximum_pressure), + "tank_air" = gas_mixture_parser(tank_air, "tank"), + "cabin_air" = gas_mixture_parser(chassis.cabin_air, "cabin"), + ) + +/obj/item/mecha_parts/mecha_equipment/air_tank/handle_ui_act(action, list/params) + switch(action) + if("set_cabin_pressure") + var/new_pressure = text2num(params["new_pressure"]) + internal_tank.release_pressure = clamp(round(new_pressure), internal_tank.can_min_release_pressure, internal_tank.can_max_release_pressure) + return TRUE + if("toggle_port") + if(internal_tank.connected_port) + if(internal_tank.disconnect()) + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_notice("Disconnected from the air system port.")]") + log_message("Disconnected from gas port.", LOG_MECHA) + return TRUE + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_warning("Unable to disconnect from the air system port!")]") + return + var/obj/machinery/atmospherics/components/unary/portables_connector/possible_port = locate() in chassis.loc + if(internal_tank.connect(possible_port)) + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_notice("Connected to the air system port.")]") + log_message("Connected to gas port.", LOG_MECHA) + return TRUE + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_warning("Unable to connect with air system port!")]") + return FALSE + if("toggle_auto_pressurize") + auto_pressurize_on_seal = !auto_pressurize_on_seal + return TRUE + if("toggle_tank_pump") + tank_pump_active = !tank_pump_active + return TRUE + if("toggle_tank_pump_direction") + tank_pump_direction = !tank_pump_direction + return TRUE + if("set_tank_pump_pressure") + var/new_pressure = text2num(params["new_pressure"]) + tank_pump_pressure = clamp(round(new_pressure), PUMP_MIN_PRESSURE, min(PUMP_MAX_PRESSURE, internal_tank.maximum_pressure)) + return TRUE + return FALSE + +/obj/item/mecha_parts/mecha_equipment/air_tank/full + start_full = TRUE diff --git a/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm b/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm index 8364a9b32ba32..ca3b4f2f47945 100644 --- a/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm @@ -3,23 +3,22 @@ /obj/item/mecha_parts/mecha_equipment/medical mech_flags = EXOSUIT_MODULE_MEDICAL -/obj/item/mecha_parts/mecha_equipment/medical/attach(obj/vehicle/sealed/mecha/M) +/obj/item/mecha_parts/mecha_equipment/medical/attach(obj/vehicle/sealed/mecha/new_mecha) . = ..() START_PROCESSING(SSobj, src) +/obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam/detach(atom/moveto) + STOP_PROCESSING(SSobj, src) + return ..() + /obj/item/mecha_parts/mecha_equipment/medical/process() if(!chassis) return PROCESS_KILL -/obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam/detach() - STOP_PROCESSING(SSobj, src) - return ..() - /obj/item/mecha_parts/mecha_equipment/medical/sleeper name = "mounted sleeper" desc = "Equipment for medical exosuits. A mounted sleeper that stabilizes patients and can inject reagents in the exosuit's reserves." - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" + icon_state = "mecha_sleeper" energy_drain = 20 range = MECHA_MELEE equip_cooldown = 20 @@ -44,10 +43,7 @@ ) return data -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/ui_act(action, list/params) - . = ..() - if(.) - return +/obj/item/mecha_parts/mecha_equipment/medical/sleeper/handle_ui_act(action, list/params) switch(action) if("eject") go_out() @@ -244,8 +240,7 @@ /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun name = "exosuit syringe gun" desc = "Equipment for medical exosuits. A chem synthesizer with syringe gun. Reagents inside are held in stasis, so no reactions will occur." - icon = 'icons/obj/weapons/guns/ballistic.dmi' - icon_state = "syringegun" + icon_state = "mecha_syringegun" range = MECHA_MELEE|MECHA_RANGED equip_cooldown = 10 energy_drain = 10 @@ -292,16 +287,14 @@ return list( "snowflake_id" = MECHA_SNOWFLAKE_ID_SYRINGE, "mode" = mode == FIRE_SYRINGE_MODE ? "Launch" : "Analyze", + "mode_label" = "Action", "syringe" = LAZYLEN(syringes), "max_syringe" = max_syringes, "reagents" = reagents.total_volume, "total_reagents" = reagents.maximum_volume, ) -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/ui_act(action, list/params) - . = ..() - if(.) - return +/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/handle_ui_act(action, list/params) if(action == "change_mode") mode = !mode return TRUE @@ -435,7 +428,7 @@ if(!chassis.Adjacent(S)) to_chat(user, "[icon2html(src, user)][span_warning("Unable to load syringe!")]") return FALSE - S.reagents.trans_to(src, S.reagents.total_volume, transfered_by = user) + S.reagents.trans_to(src, S.reagents.total_volume, transferred_by = user) S.forceMove(src) LAZYADD(syringes,S) to_chat(user, "[icon2html(src, user)][span_notice("Syringe loaded.")]") diff --git a/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm b/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm index b716b6584864e..de96f3ad5f657 100644 --- a/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm @@ -108,8 +108,8 @@ /obj/item/mecha_parts/mecha_equipment/drill/proc/move_ores() - if(locate(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) in chassis.flat_equipment && istype(chassis, /obj/vehicle/sealed/mecha/working/ripley)) - var/obj/vehicle/sealed/mecha/working/ripley/R = chassis //we could assume that it's a ripley because it has a clamp, but that's ~unsafe~ and ~bad practice~ + if(istype(chassis, /obj/vehicle/sealed/mecha/ripley) && (locate(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) in chassis.flat_equipment)) + var/obj/vehicle/sealed/mecha/ripley/R = chassis //we could assume that it's a ripley because it has a clamp, but that's ~unsafe~ and ~bad practice~ R.collect_ore() /obj/item/mecha_parts/mecha_equipment/drill/proc/drill_mob(mob/living/target, mob/living/user) @@ -122,7 +122,7 @@ SEND_SIGNAL(src, COMSIG_MECHA_DRILL_MOB, chassis, target) else target.investigate_log("has been gibbed by [src] (attached to [chassis]).", INVESTIGATE_DEATHS) - target.gib() + target.gib(DROP_ALL_REMAINS) else //drill makes a hole var/obj/item/bodypart/target_part = target.get_bodypart(target.get_random_valid_zone(BODY_ZONE_CHEST)) @@ -167,12 +167,14 @@ if(!loc) STOP_PROCESSING(SSfastprocess, src) qdel(src) - if(istype(loc, /obj/vehicle/sealed/mecha/working) && scanning_time <= world.time) - var/obj/vehicle/sealed/mecha/working/mecha = loc - if(!LAZYLEN(mecha.occupants)) - return - scanning_time = world.time + equip_cooldown - mineral_scan_pulse(get_turf(src)) + if(scanning_time > world.time) + return + if(!chassis || !ismecha(loc)) + return + if(!LAZYLEN(chassis.occupants)) + return + scanning_time = world.time + equip_cooldown + mineral_scan_pulse(get_turf(src)) #undef DRILL_BASIC #undef DRILL_HARDENED diff --git a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm index 37746277eb65e..4b62478fa023d 100644 --- a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm @@ -134,14 +134,11 @@ /obj/item/mecha_parts/mecha_equipment/gravcatapult/get_snowflake_data() return list( "snowflake_id" = MECHA_SNOWFLAKE_ID_MODE, - "name" = "Gravity catapult", "mode" = mode == GRAVPUSH_MODE ? "Push" : "Sling", + "mode_label" = "Gravity Catapult", ) -/obj/item/mecha_parts/mecha_equipment/gravcatapult/ui_act(action, list/params) - . = ..() - if(.) - return +/obj/item/mecha_parts/mecha_equipment/gravcatapult/handle_ui_act(action, list/params) if(action == "change_mode") mode++ if(mode > GRAVPUSH_MODE) @@ -161,7 +158,7 @@ //how much the armor of the mech is modified by var/datum/armor/armor_mod -/obj/item/mecha_parts/mecha_equipment/armor/attach(obj/vehicle/sealed/mecha/M, attach_right) +/obj/item/mecha_parts/mecha_equipment/armor/attach(obj/vehicle/sealed/mecha/new_mecha, attach_right) . = ..() chassis.set_armor(chassis.get_armor().add_other_armor(armor_mod)) @@ -170,7 +167,7 @@ return ..() /obj/item/mecha_parts/mecha_equipment/armor/anticcw_armor_booster - name = "armor booster module (Close Combat Weaponry)" + name = "Impact Cushion Plates" desc = "Boosts exosuit armor against melee attacks" icon_state = "mecha_abooster_ccw" iconstate_name = "melee" @@ -181,8 +178,8 @@ melee = 15 /obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster - name = "armor booster module (Ranged Weaponry)" - desc = "Boosts exosuit armor against ranged attacks. Completely blocks taser shots." + name = "Projectile Shielding" + desc = "Boosts exosuit armor against ranged kinetic and energy projectiles. Completely blocks taser shots." icon_state = "mecha_abooster_proj" iconstate_name = "range" protect_name = "Ranged Armor" @@ -201,34 +198,34 @@ icon_state = "repair_droid" energy_drain = 50 range = 0 - activated = FALSE + can_be_toggled = TRUE + active = FALSE equipment_slot = MECHA_UTILITY /// Repaired health per second var/health_boost = 0.5 var/icon/droid_overlay - var/list/repairable_damage = list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH) + var/list/repairable_damage = list(MECHA_INT_TEMP_CONTROL,MECHA_CABIN_AIR_BREACH) /obj/item/mecha_parts/mecha_equipment/repair_droid/Destroy() STOP_PROCESSING(SSobj, src) chassis?.cut_overlay(droid_overlay) return ..() -/obj/item/mecha_parts/mecha_equipment/repair_droid/attach(obj/vehicle/sealed/mecha/M, attach_right = FALSE) +/obj/item/mecha_parts/mecha_equipment/repair_droid/attach(obj/vehicle/sealed/mecha/new_mecha, attach_right = FALSE) . = ..() droid_overlay = new(src.icon, icon_state = "repair_droid") - M.add_overlay(droid_overlay) + new_mecha.add_overlay(droid_overlay) /obj/item/mecha_parts/mecha_equipment/repair_droid/detach() chassis.cut_overlay(droid_overlay) STOP_PROCESSING(SSobj, src) return ..() -/obj/item/mecha_parts/mecha_equipment/repair_droid/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() +/obj/item/mecha_parts/mecha_equipment/repair_droid/handle_ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) if(action != "toggle") return chassis.cut_overlay(droid_overlay) - if(activated) + if(active) START_PROCESSING(SSobj, src) droid_overlay = new(src.icon, icon_state = "repair_droid_a") log_message("Activated.", LOG_MECHA) @@ -258,13 +255,13 @@ repaired = TRUE if(repaired) if(!chassis.use_power(energy_drain)) - activated = FALSE + active = FALSE return PROCESS_KILL else //no repair needed, we turn off chassis.cut_overlay(droid_overlay) droid_overlay = new(src.icon, icon_state = "repair_droid") chassis.add_overlay(droid_overlay) - activated = FALSE + active = FALSE return PROCESS_KILL @@ -277,15 +274,16 @@ icon_state = "tesla" range = MECHA_MELEE equipment_slot = MECHA_POWER - activated = FALSE + can_be_toggled = TRUE + active = FALSE ///Type of fuel the generator is using. Is set in generator_init() to add the starting amount of fuel var/obj/item/stack/sheet/fuel = null ///Fuel used per second while idle, not generating, in units - var/fuelrate_idle = 12.5 + var/fuelrate_idle = 0.00625 * SHEET_MATERIAL_AMOUNT ///Fuel used per second while actively generating, in units - var/fuelrate_active = 100 + var/fuelrate_active = 0.05 * SHEET_MATERIAL_AMOUNT ///Maximum fuel capacity of the generator, in units - var/max_fuel = 150000 + var/max_fuel = 75 * SHEET_MATERIAL_AMOUNT ///Energy recharged per second var/rechargerate = 10 @@ -299,24 +297,23 @@ /obj/item/mecha_parts/mecha_equipment/generator/detach() STOP_PROCESSING(SSobj, src) - activated = FALSE + active = FALSE return ..() /obj/item/mecha_parts/mecha_equipment/generator/get_snowflake_data() return list( - "active" = activated, + "snowflake_id" = MECHA_SNOWFLAKE_ID_GENERATOR, "fuel" = fuel.amount, ) -/obj/item/mecha_parts/mecha_equipment/generator/ui_act(action, list/params) - . = ..() +/obj/item/mecha_parts/mecha_equipment/generator/handle_ui_act(action, list/params) if(action == "toggle") - if(activated) - to_chat(usr, "[icon2html(src, usr)][span_warning("Power generation enabled.")]") + if(active) + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_warning("Power generation enabled.")]") START_PROCESSING(SSobj, src) log_message("Activated.", LOG_MECHA) else - to_chat(usr, "[icon2html(src, usr)][span_warning("Power generation disabled.")]") + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_warning("Power generation disabled.")]") STOP_PROCESSING(SSobj, src) log_message("Deactivated.", LOG_MECHA) return TRUE @@ -329,16 +326,16 @@ /obj/item/mecha_parts/mecha_equipment/generator/process(seconds_per_tick) if(!chassis) - activated = FALSE + active = FALSE return PROCESS_KILL if(fuel.amount <= 0) - activated = FALSE + active = FALSE log_message("Deactivated - no fuel.", LOG_MECHA) to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_notice("Fuel reserves depleted.")]") return PROCESS_KILL var/current_charge = chassis.get_charge() if(isnull(current_charge)) - activated = FALSE + active = FALSE to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_notice("No power cell detected.")]") log_message("Deactivated.", LOG_MECHA) return PROCESS_KILL @@ -376,6 +373,8 @@ desc = "A generic set of thrusters, from an unknown source. Uses not-understood methods to propel exosuits seemingly for free." icon_state = "thrusters" equipment_slot = MECHA_UTILITY + can_be_toggled = TRUE + active_label = "Thrusters" var/effect_type = /obj/effect/particle_effect/sparks /obj/item/mecha_parts/mecha_equipment/thrusters/try_attach_part(mob/user, obj/vehicle/sealed/mecha/M, attach_right) @@ -385,31 +384,25 @@ return FALSE return ..() -/obj/item/mecha_parts/mecha_equipment/thrusters/attach(obj/vehicle/sealed/mecha/M, attach_right = FALSE) - M.active_thrusters = src //Enable by default - return ..() - -/obj/item/mecha_parts/mecha_equipment/thrusters/detach() - if(chassis?.active_thrusters == src) - chassis.active_thrusters = null +/obj/item/mecha_parts/mecha_equipment/thrusters/attach(obj/vehicle/sealed/mecha/new_mecha, attach_right = FALSE) + new_mecha.active_thrusters = src //Enable by default return ..() -/obj/item/mecha_parts/mecha_equipment/thrusters/Destroy() - if(chassis?.active_thrusters == src) +/obj/item/mecha_parts/mecha_equipment/thrusters/detach(atom/moveto) + if(chassis.active_thrusters == src) chassis.active_thrusters = null return ..() -/obj/item/mecha_parts/mecha_equipment/thrusters/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) +/obj/item/mecha_parts/mecha_equipment/thrusters/set_active(active) . = ..() - if(params["toggle"]) - if(activated) //inactive - START_PROCESSING(SSobj, src) - enable() - log_message("Activated.", LOG_MECHA) - else - STOP_PROCESSING(SSobj, src) - disable() - log_message("Deactivated.", LOG_MECHA) + if(active) + START_PROCESSING(SSobj, src) + enable() + log_message("Activated.", LOG_MECHA) + else + STOP_PROCESSING(SSobj, src) + disable() + log_message("Deactivated.", LOG_MECHA) /obj/item/mecha_parts/mecha_equipment/thrusters/proc/enable() if (chassis.active_thrusters == src) @@ -431,27 +424,23 @@ /obj/item/mecha_parts/mecha_equipment/thrusters/proc/generate_effect(movement_dir) var/obj/effect/particle_effect/E = new effect_type(get_turf(chassis)) - E.dir = turn(movement_dir, 180) - step(E, turn(movement_dir, 180)) + E.dir = REVERSE_DIR(movement_dir) + step(E, REVERSE_DIR(movement_dir)) QDEL_IN(E, 5) - /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/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) - if(!M.internal_tank) - to_chat(user, span_warning("[M] does not have an internal tank and cannot support this upgrade!")) - return FALSE - return ..() + var/move_cost = 0.05 //moles per step (5 times more than human jetpacks) /obj/item/mecha_parts/mecha_equipment/thrusters/gas/thrust(movement_dir) - if(!chassis || !chassis.internal_tank) + if(!chassis) + return FALSE + var/obj/machinery/portable_atmospherics/canister/internal_tank = chassis.get_internal_tank() + if(!internal_tank) return FALSE - var/datum/gas_mixture/our_mix = chassis.internal_tank.return_air() + var/datum/gas_mixture/our_mix = internal_tank.return_air() var/moles = our_mix.total_moles() if(moles < move_cost) our_mix.remove(moles) @@ -519,7 +508,7 @@ /obj/item/mecha_parts/camera_kit name = "exosuit-mounted camera" desc = "A security camera meant for exosuit-mounted surveillance-on-the-go." - icon = 'icons/mecha/mecha_equipment.dmi' + icon = 'icons/mob/mecha_equipment.dmi' icon_state = "mecha_camera" w_class = WEIGHT_CLASS_SMALL @@ -533,3 +522,4 @@ mech.chassis_camera = new /obj/machinery/camera/exosuit (mech) mech.chassis_camera.update_c_tag(mech) mech.diag_hud_set_camera() + diff --git a/code/modules/vehicles/mecha/equipment/tools/radio.dm b/code/modules/vehicles/mecha/equipment/tools/radio.dm new file mode 100644 index 0000000000000..33a113a8274f5 --- /dev/null +++ b/code/modules/vehicles/mecha/equipment/tools/radio.dm @@ -0,0 +1,50 @@ +///Mech radio module +/obj/item/mecha_parts/mecha_equipment/radio + name = "mounted radio" + desc = "A basic component of every vehicle." + icon_state = "mecha_radio" + equipment_slot = MECHA_UTILITY + ///Internal radio item + var/obj/item/radio/mech/radio + +/obj/item/mecha_parts/mecha_equipment/radio/Initialize(mapload) + . = ..() + radio = new(src) + RegisterSignal(radio, COMSIG_QDELETING, PROC_REF(radio_deleted)) + +/obj/item/mecha_parts/mecha_equipment/radio/Destroy() + qdel(radio) + return ..() + +/obj/item/mecha_parts/mecha_equipment/radio/get_snowflake_data() + return list( + "snowflake_id" = MECHA_SNOWFLAKE_ID_RADIO, + "microphone" = radio.get_broadcasting(), + "speaker" = radio.get_listening(), + "frequency" = radio.get_frequency(), + "minFrequency" = radio.freerange ? MIN_FREE_FREQ : MIN_FREQ, + "maxFrequency" = radio.freerange ? MAX_FREE_FREQ : MAX_FREQ, + ) + +/obj/item/mecha_parts/mecha_equipment/radio/handle_ui_act(action, list/params) + switch(action) + if("toggle_microphone") + radio.set_broadcasting(!radio.get_broadcasting()) + return TRUE + if("toggle_speaker") + radio.set_listening(!radio.get_listening()) + return TRUE + if("set_frequency") + var/new_frequency = text2num(params["new_frequency"]) + radio.set_frequency(sanitize_frequency(new_frequency, radio.freerange, radio.syndie)) + return TRUE + return FALSE + +///Internal radio got deleted, somehow +/obj/item/mecha_parts/mecha_equipment/radio/proc/radio_deleted() + SIGNAL_HANDLER + if(!QDELETED(src)) + qdel(src) + +/obj/item/radio/mech + subspace_transmission = TRUE diff --git a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm index 7bc2f6cf3839a..b2a69357a82c2 100644 --- a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm @@ -18,17 +18,20 @@ ///How much base damage this clamp does var/clamp_damage = 20 ///Var for the chassis we are attached to, needed to access ripley contents and such - var/obj/vehicle/sealed/mecha/working/ripley/cargo_holder + var/obj/vehicle/sealed/mecha/ripley/cargo_holder ///Audio for using the hydraulic clamp var/clampsound = 'sound/mecha/hydraulic.ogg' -/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/attach(obj/vehicle/sealed/mecha/M) +/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/attach(obj/vehicle/sealed/mecha/new_mecha) . = ..() - cargo_holder = M + if(istype(chassis, /obj/vehicle/sealed/mecha/ripley)) + cargo_holder = chassis + ADD_TRAIT(chassis, TRAIT_OREBOX_FUNCTIONAL, TRAIT_MECH_EQUIPMENT(type)) -/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/detach(atom/moveto = null) - . = ..() +/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/detach(atom/moveto) + REMOVE_TRAIT(chassis, TRAIT_OREBOX_FUNCTIONAL, TRAIT_MECH_EQUIPMENT(type)) cargo_holder = null + return ..() /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/action(mob/living/source, atom/target, list/modifiers) if(!action_checks(target)) @@ -58,7 +61,7 @@ if(istype(clamptarget, /obj/machinery/door/airlock/)) var/obj/machinery/door/airlock/targetairlock = clamptarget playsound(chassis, clampsound, 50, FALSE, -6) - targetairlock.try_to_crowbar(src, source) + targetairlock.try_to_crowbar(src, source, TRUE) return if(clamptarget.anchored) to_chat(source, "[icon2html(src, source)][span_warning("[target] is firmly secured!")]") @@ -75,8 +78,8 @@ LAZYADD(cargo_holder.cargo, clamptarget) clamptarget.forceMove(chassis) clamptarget.set_anchored(FALSE) - if(!cargo_holder.box && istype(clamptarget, /obj/structure/ore_box)) - cargo_holder.box = clamptarget + if(!cargo_holder.ore_box && istype(clamptarget, /obj/structure/ore_box)) + cargo_holder.ore_box = clamptarget to_chat(source, "[icon2html(src, source)][span_notice("[target] successfully loaded.")]") log_message("Loaded [clamptarget]. Cargo compartment capacity: [cargo_holder.cargo_capacity - LAZYLEN(cargo_holder.cargo)]", LOG_MECHA) @@ -201,13 +204,10 @@ "snowflake_id" = MECHA_SNOWFLAKE_ID_EXTINGUISHER, "reagents" = reagents.total_volume, "total_reagents" = reagents.maximum_volume, - "minimum_requ" = required_amount, + "reagents_required" = required_amount, ) -/obj/item/mecha_parts/mecha_equipment/extinguisher/ui_act(action, list/params) - . = ..() - if(.) - return TRUE +/obj/item/mecha_parts/mecha_equipment/extinguisher/handle_ui_act(action, list/params) switch(action) if("activate") spray_extinguisher(usr) @@ -242,8 +242,8 @@ /obj/item/mecha_parts/mecha_equipment/rcd/get_snowflake_data() return list( "snowflake_id" = MECHA_SNOWFLAKE_ID_MODE, - "name" = "RCD control", "mode" = get_mode_name(), + "mode_label" = "RCD control", ) /// fetches the mode name to display in the UI @@ -258,10 +258,7 @@ else return "Someone didnt set this" -/obj/item/mecha_parts/mecha_equipment/rcd/ui_act(action, list/params) - . = ..() - if(.) - return +/obj/item/mecha_parts/mecha_equipment/rcd/handle_ui_act(action, list/params) if(action == "change_mode") mode++ if(mode > MODE_AIRLOCK) @@ -338,26 +335,26 @@ icon_state = "ripleyupgrade" mech_flags = EXOSUIT_MODULE_RIPLEY -/obj/item/mecha_parts/mecha_equipment/ripleyupgrade/can_attach(obj/vehicle/sealed/mecha/working/ripley/M, attach_right = FALSE, mob/user) - if(M.type != /obj/vehicle/sealed/mecha/working/ripley) +/obj/item/mecha_parts/mecha_equipment/ripleyupgrade/can_attach(obj/vehicle/sealed/mecha/ripley/mecha, attach_right = FALSE, mob/user) + if(mecha.type != /obj/vehicle/sealed/mecha/ripley) to_chat(user, span_warning("This conversion kit can only be applied to APLU MK-I models.")) return FALSE - if(LAZYLEN(M.cargo)) - to_chat(user, span_warning("[M]'s cargo hold must be empty before this conversion kit can be applied.")) + if(LAZYLEN(mecha.cargo)) + to_chat(user, span_warning("[mecha]'s cargo hold must be empty before this conversion kit can be applied.")) return FALSE - if(!(M.mecha_flags & ADDING_MAINT_ACCESS_POSSIBLE)) //non-removable upgrade, so lets make sure the pilot or owner has their say. - to_chat(user, span_warning("[M] must have maintenance protocols active in order to allow this conversion kit.")) + if(!(mecha.mecha_flags & PANEL_OPEN)) //non-removable upgrade, so lets make sure the pilot or owner has their say. + to_chat(user, span_warning("[mecha] panel must be open in order to allow this conversion kit.")) return FALSE - if(LAZYLEN(M.occupants)) //We're actualy making a new mech and swapping things over, it might get weird if players are involved - to_chat(user, span_warning("[M] must be unoccupied before this conversion kit can be applied.")) + if(LAZYLEN(mecha.occupants)) //We're actualy making a new mech and swapping things over, it might get weird if players are involved + to_chat(user, span_warning("[mecha] must be unoccupied before this conversion kit can be applied.")) return FALSE - if(!M.cell) //Turns out things break if the cell is missing + if(!mecha.cell) //Turns out things break if the cell is missing to_chat(user, span_warning("The conversion process requires a cell installed.")) return FALSE return TRUE /obj/item/mecha_parts/mecha_equipment/ripleyupgrade/attach(obj/vehicle/sealed/mecha/markone, attach_right = FALSE) - var/obj/vehicle/sealed/mecha/working/ripley/mk2/marktwo = new (get_turf(markone),1) + var/obj/vehicle/sealed/mecha/ripley/mk2/marktwo = new (get_turf(markone),1) if(!marktwo) return QDEL_NULL(marktwo.cell) @@ -375,6 +372,11 @@ marktwo.capacitor = markone.capacitor markone.capacitor.forceMove(marktwo) markone.capacitor = null + QDEL_NULL(marktwo.servo) + if (markone.servo) + marktwo.servo = markone.servo + markone.servo.forceMove(marktwo) + markone.servo = null marktwo.update_part_values() for(var/obj/item/mecha_parts/mecha_equipment/equipment in markone.flat_equipment) //Move the equipment over... if(istype(equipment, /obj/item/mecha_parts/mecha_equipment/ejector)) diff --git a/code/modules/vehicles/mecha/equipment/weapons/mecha_ammo.dm b/code/modules/vehicles/mecha/equipment/weapons/mecha_ammo.dm index ce644adfcac87..0ad7bdf84a08c 100644 --- a/code/modules/vehicles/mecha/equipment/weapons/mecha_ammo.dm +++ b/code/modules/vehicles/mecha/equipment/weapons/mecha_ammo.dm @@ -2,7 +2,7 @@ name = "generic ammo box" desc = "A box of ammo for an unknown weapon." w_class = WEIGHT_CLASS_BULKY - icon = 'icons/mecha/mecha_ammo.dmi' + icon = 'icons/mob/mecha_ammo.dmi' icon_state = "empty" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' diff --git a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm index 99a56a7d499a1..fe97c5f2b89ae 100644 --- a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm +++ b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm @@ -43,7 +43,7 @@ /obj/item/mecha_parts/mecha_equipment/weapon/action(mob/source, atom/target, list/modifiers) if(!action_checks(target)) return FALSE - var/newtonian_target = turn(chassis.dir,180) + var/newtonian_target = REVERSE_DIR(chassis.dir) . = ..()//start the cooldown early because of sleeps for(var/i in 1 to projectiles_per_shot) if(energy_drain && !chassis.has_charge(energy_drain))//in case we run out of energy mid-burst, such as emp @@ -227,6 +227,17 @@ var/disabledreload //For weapons with no cache (like the rockets) which are reloaded by hand var/ammo_type +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/get_snowflake_data() + return list( + "snowflake_id" = MECHA_SNOWFLAKE_ID_WEAPON_BALLISTIC, + "projectiles" = projectiles, + "max_magazine" = initial(projectiles), + "projectiles_cache" = projectiles_cache, + "projectiles_cache_max" = projectiles_cache_max, + "disabledreload" = disabledreload, + "ammo_type" = ammo_type, + ) + /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/action_checks(target) if(!..()) return FALSE @@ -234,8 +245,7 @@ return FALSE return TRUE -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/handle_ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) if(action == "reload") rearm() return TRUE @@ -357,12 +367,18 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/action(mob/source, atom/target, list/modifiers) if(!action_checks(target)) return + TIMER_COOLDOWN_START(chassis, COOLDOWN_MECHA_EQUIPMENT(type), equip_cooldown) + chassis.use_power(energy_drain) + var/newtonian_target = turn(chassis.dir,180) var/obj/O = new projectile(chassis.loc) playsound(chassis, fire_sound, 50, TRUE) log_message("Launched a [O.name] from [name], targeting [target].", LOG_MECHA) projectiles-- proj_init(O, source) O.throw_at(target, missile_range, missile_speed, source, FALSE, diagonals_first = diags_first) + sleep(max(0, projectile_delay)) + if(kickback) + chassis.newtonian_move(newtonian_target) return TRUE //used for projectile initilisation (priming flashbang) and additional logging @@ -411,8 +427,10 @@ projectiles = 15 missile_speed = 1.5 projectiles_cache = 999 + projectiles_cache_max = 999 equip_cooldown = 20 mech_flags = EXOSUIT_MODULE_HONK + ammo_type = MECHA_AMMO_BANANA_PEEL /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/mousetrap_mortar name = "mousetrap mortar" @@ -423,13 +441,14 @@ projectiles = 15 missile_speed = 1.5 projectiles_cache = 999 + projectiles_cache_max = 999 equip_cooldown = 10 mech_flags = EXOSUIT_MODULE_HONK + ammo_type = MECHA_AMMO_MOUSETRAP /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/mousetrap_mortar/proj_init(obj/item/assembly/mousetrap/armed/M) M.secured = TRUE - //Classic extending punching glove, but weaponised! /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove name = "\improper Oingo Boingo Punch-face" @@ -443,19 +462,20 @@ fire_sound = 'sound/items/bikehorn.ogg' projectiles = 10 projectiles_cache = 999 + projectiles_cache_max = 999 harmful = TRUE diags_first = TRUE /// Damage done by the glove on contact. Also used to determine throw distance (damage / 5) var/punch_damage = 35 mech_flags = EXOSUIT_MODULE_HONK + ammo_type = MECHA_AMMO_PUNCHING_GLOVE /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove/get_snowflake_data() - return list( - "snowflake_id" = MECHA_SNOWFLAKE_ID_MODE, - "mode" = harmful ? "LETHAL FISTING" : "Cuddles", - ) + . = ..() + .["mode"] = harmful ? "LETHAL FISTING" : "Cuddles" + .["mode_label"] = "Honk Severity" -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove/ui_act(action, list/params) +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove/handle_ui_act(action, list/params) . = ..() if(action == "change_mode") harmful = !harmful diff --git a/code/modules/vehicles/mecha/mech_bay.dm b/code/modules/vehicles/mecha/mech_bay.dm index 78130a18d5e57..398a9c6c59b6c 100644 --- a/code/modules/vehicles/mecha/mech_bay.dm +++ b/code/modules/vehicles/mecha/mech_bay.dm @@ -3,7 +3,7 @@ desc = "This port recharges a mech's internal power cell." density = TRUE dir = EAST - icon = 'icons/mecha/mech_bay.dmi' + icon = 'icons/obj/machines/mech_bay.dmi' icon_state = "recharge_port" circuit = /obj/item/circuitboard/machine/mech_recharger ///Weakref to currently recharging mech on our recharging_turf diff --git a/code/modules/vehicles/mecha/mech_fabricator.dm b/code/modules/vehicles/mecha/mech_fabricator.dm index 7ae785764933a..56b3cd2138c5e 100644 --- a/code/modules/vehicles/mecha/mech_fabricator.dm +++ b/code/modules/vehicles/mecha/mech_fabricator.dm @@ -1,5 +1,5 @@ /obj/machinery/mecha_part_fabricator - icon = 'icons/obj/robotics.dmi' + icon = 'icons/obj/machines/robotics.dmi' icon_state = "fab-idle" name = "exosuit fabricator" desc = "Nothing is being built." @@ -28,9 +28,6 @@ /// The job ID of the part currently being processed. This is used for ordering list items for the client UI. var/top_job_id = 0 - /// Reference to all materials used in the creation of the item being_built. - var/list/build_materials - /// Part currently stored in the Exofab. var/obj/item/stored_part @@ -53,25 +50,36 @@ var/list/datum/design/cached_designs /obj/machinery/mecha_part_fabricator/Initialize(mapload) - if(!CONFIG_GET(flag/no_default_techweb_link) && !stored_research) - connect_techweb(SSresearch.science_tech) - rmat = AddComponent(/datum/component/remote_materials, "mechfab", mapload && link_on_init, mat_container_flags=BREAKDOWN_FLAGS_LATHE) + rmat = AddComponent( \ + /datum/component/remote_materials, \ + mapload && link_on_init, \ + mat_container_flags = BREAKDOWN_FLAGS_LATHE \ + ) cached_designs = list() RefreshParts() //Recalculating local material sizes if the fab isn't linked - if(stored_research) - update_menu_tech() return ..() +/obj/machinery/mecha_part_fabricator/LateInitialize() + . = ..() + if(!CONFIG_GET(flag/no_default_techweb_link) && !stored_research) + CONNECT_TO_RND_SERVER_ROUNDSTART(stored_research, src) + if(stored_research) + on_connected_techweb() + /obj/machinery/mecha_part_fabricator/proc/connect_techweb(datum/techweb/new_techweb) if(stored_research) UnregisterSignal(stored_research, list(COMSIG_TECHWEB_ADD_DESIGN, COMSIG_TECHWEB_REMOVE_DESIGN)) - stored_research = new_techweb + if(!isnull(stored_research)) + on_connected_techweb() + +/obj/machinery/mecha_part_fabricator/proc/on_connected_techweb() RegisterSignals( stored_research, list(COMSIG_TECHWEB_ADD_DESIGN, COMSIG_TECHWEB_REMOVE_DESIGN), PROC_REF(on_techweb_update) ) + update_menu_tech() /obj/machinery/mecha_part_fabricator/multitool_act(mob/living/user, obj/item/multitool/tool) if(!QDELETED(tool.buffer) && istype(tool.buffer, /datum/techweb)) @@ -92,7 +100,7 @@ //maximum stocking amount (default 300000, 600000 at T4) for(var/datum/stock_part/matter_bin/matter_bin in component_parts) T += matter_bin.tier - rmat.set_local_size((200000 + (T * 50000))) + rmat.set_local_size(((100 * SHEET_MATERIAL_AMOUNT) + (T * (25 * SHEET_MATERIAL_AMOUNT)))) //resources adjustment coefficient (1 -> 0.85 -> 0.7 -> 0.55) T = 1.15 @@ -173,34 +181,6 @@ desc = initial(desc) process_queue = FALSE -/** - * Calculates resource/material costs for printing an item based on the machine's resource coefficient. - * - * Returns a list of k,v resources with their amounts. - * * D - Design datum to calculate the modified resource cost of. - */ -/obj/machinery/mecha_part_fabricator/proc/get_resources_w_coeff(datum/design/D) - var/list/resources = list() - for(var/R in D.materials) - var/datum/material/M = R - resources[M] = get_resource_cost_w_coeff(D, M) - return resources - -/** - * Checks if the Exofab has enough resources to print a given item. - * - * Returns FALSE if the design has no reagents used in its construction (?) or if there are insufficient resources. - * Returns TRUE if there are sufficient resources to print the item. - * * D - Design datum to calculate the modified resource cost of. - */ -/obj/machinery/mecha_part_fabricator/proc/check_resources(datum/design/D) - if(length(D.reagents_list)) // No reagents storage - no reagent designs. - return FALSE - var/datum/component/material_container/materials = rmat.mat_container - if(materials.has_materials(get_resources_w_coeff(D))) - return TRUE - return FALSE - /** * Attempts to build the next item in the build queue. * @@ -228,7 +208,7 @@ * * verbose - Whether the machine should use say() procs. Set to FALSE to disable the machine saying reasons for failure to build. */ /obj/machinery/mecha_part_fabricator/proc/build_part(datum/design/D, verbose = TRUE) - if(!D) + if(!D || length(D.reagents_list)) return FALSE var/datum/component/material_container/materials = rmat.mat_container @@ -240,21 +220,17 @@ if(verbose) say("Mineral access is on hold, please contact the quartermaster.") return FALSE - if(!check_resources(D)) + if(!materials.has_materials(D.materials, component_coeff)) if(verbose) say("Not enough resources. Processing stopped.") return FALSE - build_materials = get_resources_w_coeff(D) - - materials.use_materials(build_materials) + rmat.use_materials(D.materials, component_coeff, 1, "built", "[D.name]") being_built = D build_finish = world.time + get_construction_time_w_coeff(initial(D.construction_time)) build_start = world.time desc = "It's building \a [D.name]." - rmat.silo_log(src, "built", -1, "[D.name]", build_materials) - return TRUE /obj/machinery/mecha_part_fabricator/process() @@ -339,17 +315,6 @@ queue.Cut(index,++index) return TRUE -/** - * Calculates the coefficient-modified resource cost of a single material component of a design's recipe. - * - * Returns coefficient-modified resource cost for the given material component. - * * D - Design datum to pull the resource cost from. - * * resource - Material datum reference to the resource to calculate the cost of. - * * roundto - Rounding value for round() proc - */ -/obj/machinery/mecha_part_fabricator/proc/get_resource_cost_w_coeff(datum/design/D, datum/material/resource, roundto = 1) - return round(D.materials[resource]*component_coeff, roundto) - /** * Calculates the coefficient-modified build time of a design. * @@ -373,7 +338,8 @@ ui.open() /obj/machinery/mecha_part_fabricator/ui_static_data(mob/user) - var/list/data = list() + var/list/data = rmat.mat_container.ui_static_data() + var/list/designs = list() var/datum/asset/spritesheet/research_designs/spritesheet = get_asset_datum(/datum/asset/spritesheet/research_designs) @@ -381,12 +347,11 @@ for(var/datum/design/design in cached_designs) var/cost = list() - - for(var/datum/material/material in design.materials) - cost[material.name] = get_resource_cost_w_coeff(design, material) + var/list/materials = design["materials"] + for(var/datum/material/mat in materials) + cost[mat.name] = OPTIMAL_COST(materials[mat] * component_coeff) var/icon_size = spritesheet.icon_size_id(design.id) - designs[design.id] = list( "name" = design.name, "desc" = design.get_description(), @@ -404,7 +369,7 @@ /obj/machinery/mecha_part_fabricator/ui_data(mob/user) var/list/data = list() - data["materials"] = rmat.mat_container?.ui_data() + data["materials"] = rmat.mat_container.ui_data() data["queue"] = list() data["processing"] = process_queue @@ -507,10 +472,6 @@ if("remove_mat") var/datum/material/material = locate(params["ref"]) var/amount = text2num(params["amount"]) - - if (!amount) - return - // SAFETY: eject_sheets checks for valid mats rmat.eject_sheets(material, amount) return diff --git a/code/modules/vehicles/mecha/mecha_actions.dm b/code/modules/vehicles/mecha/mecha_actions.dm index 75b38a7082b68..f42e89aa1d55f 100644 --- a/code/modules/vehicles/mecha/mecha_actions.dm +++ b/code/modules/vehicles/mecha/mecha_actions.dm @@ -30,25 +30,15 @@ return chassis.container_resist_act(owner) -/datum/action/vehicle/sealed/mecha/mech_toggle_internals - name = "Toggle Internal Airtank Usage" - button_icon_state = "mech_internals_off" +/datum/action/vehicle/sealed/mecha/mech_toggle_cabin_seal + name = "Toggle Cabin Airtight" + button_icon_state = "mech_cabin_open" + desc = "Airtight cabin preserves internal air and can be pressurized with a mounted air tank." -/datum/action/vehicle/sealed/mecha/mech_toggle_internals/Trigger(trigger_flags) +/datum/action/vehicle/sealed/mecha/mech_toggle_cabin_seal/Trigger(trigger_flags) if(!owner || !chassis || !(owner in chassis.occupants)) return - - if(!chassis.internal_tank) //Just in case. - chassis.use_internal_tank = FALSE - chassis.balloon_alert(owner, "no tank available!") - chassis.log_message("Switch to internal tank failed. No tank available.", LOG_MECHA) - return - - chassis.use_internal_tank = !chassis.use_internal_tank - button_icon_state = "mech_internals_[chassis.use_internal_tank ? "on" : "off"]" - chassis.balloon_alert(owner, "taking air from [chassis.use_internal_tank ? "internal airtank" : "environment"]") - chassis.log_message("Now taking air from [chassis.use_internal_tank?"internal airtank":"environment"].", LOG_MECHA) - build_all_button_icons() + chassis.set_cabin_seal(owner, !chassis.cabin_sealed) /datum/action/vehicle/sealed/mecha/mech_toggle_lights name = "Toggle Lights" @@ -57,20 +47,7 @@ /datum/action/vehicle/sealed/mecha/mech_toggle_lights/Trigger(trigger_flags) if(!owner || !chassis || !(owner in chassis.occupants)) return - - if(!(chassis.mecha_flags & HAS_LIGHTS)) - chassis.balloon_alert(owner, "the mech lights are broken!") - return - chassis.mecha_flags ^= LIGHTS_ON - if(chassis.mecha_flags & LIGHTS_ON) - button_icon_state = "mech_lights_on" - else - button_icon_state = "mech_lights_off" - chassis.set_light_on(chassis.mecha_flags & LIGHTS_ON) - chassis.balloon_alert(owner, "toggled lights [chassis.mecha_flags & LIGHTS_ON ? "on":"off"]") - playsound(chassis,'sound/machines/clockcult/brass_skewer.ogg', 40, TRUE) - chassis.log_message("Toggled lights [(chassis.mecha_flags & LIGHTS_ON)?"on":"off"].", LOG_MECHA) - build_all_button_icons() + chassis.toggle_lights(user = owner) /datum/action/vehicle/sealed/mecha/mech_view_stats name = "View Stats" @@ -166,3 +143,15 @@ chassis.remove_control_flags(owner, VEHICLE_CONTROL_MELEE|VEHICLE_CONTROL_EQUIPMENT) chassis.add_control_flags(owner, VEHICLE_CONTROL_DRIVE|VEHICLE_CONTROL_SETTINGS) chassis.update_icon_state() + +/datum/action/vehicle/sealed/mecha/mech_overclock + name = "Toggle overclocking" + button_icon_state = "mech_overload_off" + +/datum/action/vehicle/sealed/mecha/mech_overclock/Trigger(trigger_flags, forced_state = null) + if(!owner || !chassis || !(owner in chassis.occupants)) + return + chassis.toggle_overclock(forced_state) + chassis.balloon_alert(owner, chassis.overclock_mode ? "started overclocking" : "stopped overclocking") + button_icon_state = "mech_overload_[chassis.overclock_mode ? "on" : "off"]" + build_all_button_icons() diff --git a/code/modules/vehicles/mecha/mecha_ai_interaction.dm b/code/modules/vehicles/mecha/mecha_ai_interaction.dm index 9c0570004fe11..22db07718095e 100644 --- a/code/modules/vehicles/mecha/mecha_ai_interaction.dm +++ b/code/modules/vehicles/mecha/mecha_ai_interaction.dm @@ -33,7 +33,7 @@ //Transfer from core or card to mech. Proc is called by mech. switch(interaction) if(AI_TRANS_TO_CARD) //Upload AI from mech to AI card. - if(!construction_state) //Mech must be in maint mode to allow carding. + if(!(mecha_flags & PANEL_OPEN)) //Mech must be in maint mode to allow carding. to_chat(user, span_warning("[name] must have maintenance protocols active in order to allow a transfer.")) return var/list/ai_pilots = list() diff --git a/code/modules/vehicles/mecha/mecha_construction_paths.dm b/code/modules/vehicles/mecha/mecha_construction_paths.dm index 7df97650d0ea6..fb572f7d1282e 100644 --- a/code/modules/vehicles/mecha/mecha_construction_paths.dm +++ b/code/modules/vehicles/mecha/mecha_construction_paths.dm @@ -29,15 +29,10 @@ if(!result) return // Remove default mech power cell, as we replace it with a new one. - var/obj/vehicle/sealed/mecha/M = new result(drop_location()) - QDEL_NULL(M.cell) - QDEL_NULL(M.scanmod) - QDEL_NULL(M.capacitor) - + var/obj/vehicle/sealed/mecha/mech = new result(drop_location(), /* built_manually = */ TRUE) var/obj/item/mecha_parts/chassis/parent_chassis = parent - M.CheckParts(parent_chassis.contents) - - SSblackbox.record_feedback("tally", "mechas_created", 1, M.name) + mech.CheckParts(parent_chassis.contents) + SSblackbox.record_feedback("tally", "mechas_created", 1, mech.name) QDEL_NULL(parent) // Default proc to generate mech steps. @@ -66,7 +61,7 @@ /datum/component/construction/unordered/mecha_chassis/spawn_result() var/atom/parent_atom = parent - parent_atom.icon = 'icons/mecha/mech_construction.dmi' + parent_atom.icon = 'icons/mob/mech_construction.dmi' parent_atom.set_density(TRUE) parent_atom.cut_overlays() ..() @@ -197,13 +192,28 @@ "forward_message" = "secured capacitor", "backward_message" = "removed capacitor" ), + list( + "key" = /obj/item/stock_parts/servo, + "action" = ITEM_MOVE_INSIDE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "Scanning module is secured, the micro-servo can be added.", + "forward_message" = "added micro-servo", + "backward_message" = "unsecured capacitor" + ), + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "Micro-servo is installed, and can be screwed into place.", + "forward_message" = "secured micro-servo", + "backward_message" = "removed micro-servo" + ), list( "key" = /obj/item/stock_parts/cell, "action" = ITEM_MOVE_INSIDE, "back_key" = TOOL_SCREWDRIVER, - "desc" = "Capacitor is secured, and the power cell can be added.", + "desc" = "Micro-servo is secured, and the power cell can be added.", "forward_message" = "added power cell", - "backward_message" = "unsecured capacitor" + "backward_message" = "unsecured micro-servo" ), list( "key" = TOOL_SCREWDRIVER, @@ -326,7 +336,7 @@ ) /datum/component/construction/mecha/ripley - result = /obj/vehicle/sealed/mecha/working/ripley + result = /obj/vehicle/sealed/mecha/ripley base_icon = "ripley" circuit_control = /obj/item/circuitboard/mecha/ripley/main @@ -399,7 +409,7 @@ ) /datum/component/construction/mecha/clarke - result = /obj/vehicle/sealed/mecha/working/clarke + result = /obj/vehicle/sealed/mecha/clarke base_icon = "clarke" circuit_control = /obj/item/circuitboard/mecha/clarke/main @@ -520,6 +530,16 @@ "key" = /obj/item/bikehorn, "desc" = "HONK!!!!!!" ), + list( + "key" = /obj/item/stock_parts/servo, + "action" = ITEM_MOVE_INSIDE, + "desc" = "Humor micro-servo can be added!", + "forward_message" = "added smile" + ), + list( + "key" = /obj/item/bikehorn, + "desc" = "HONK!!!!!!" + ), list( "key" = /obj/item/stock_parts/cell, "action" = ITEM_MOVE_INSIDE, @@ -559,7 +579,7 @@ /datum/component/construction/mecha/honker/update_parent(step_index) if(step_index == 1) var/atom/parent_atom = parent - parent_atom.icon = 'icons/mecha/mech_construct.dmi' + parent_atom.icon = 'icons/mob/mech_construct.dmi' parent_atom.icon_state = "honker_chassis" ..() @@ -655,13 +675,28 @@ "forward_message" = "secured capacitor", "backward_message" = "removed capacitor" ), + list( + "key" = /obj/item/stock_parts/servo, + "action" = ITEM_MOVE_INSIDE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "Capacitor is secured, the micro-servo can be added.", + "forward_message" = "added micro-servo", + "backward_message" = "unsecured capacitor" + ), + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "Micro-servo is installed, and can be screwed into place.", + "forward_message" = "secured micro-servo", + "backward_message" = "removed micro-servo" + ), list( "key" = /obj/item/stack/ore/bluespace_crystal, "amount" = 1, "back_key" = TOOL_SCREWDRIVER, - "desc" = "Capacitor is secured, and the bluespace crystal can be added.", + "desc" = "Micro-servo is secured, and the bluespace crystal can be added.", "forward_message" = "added bluespace crystal", - "backward_message" = "unsecured capacitor" + "backward_message" = "unsecured micro-servo" ), list( "key" = /obj/item/stack/cable_coil, @@ -692,7 +727,7 @@ "desc" = "The power cell is installed, and can be screwed into place.",, "forward_message" = "secured power cell", "backward_message" = "removed power cell", - "icon_state" = "phazon17" + "icon_state" = "phazon19" // This is the point where a step icon is skipped, so "icon_state" had to be set manually starting from here. ) ) @@ -727,7 +762,7 @@ "action" = ITEM_DELETE, "back_key" = TOOL_WELDER, "desc" = "The external armor is welded, and the bluespace anomaly core socket is open.", - "icon_state" = "phazon24", + "icon_state" = "phazon26", "forward_message" = "inserted bluespace anomaly core", "backward_message" = "cut off external armor" ) diff --git a/code/modules/vehicles/mecha/mecha_control_console.dm b/code/modules/vehicles/mecha/mecha_control_console.dm index c5b60dddb7158..771ed97268bfd 100644 --- a/code/modules/vehicles/mecha/mecha_control_console.dm +++ b/code/modules/vehicles/mecha/mecha_control_console.dm @@ -29,14 +29,14 @@ name = M.name, integrity = round((M.get_integrity() / M.max_integrity) * 100), charge = M.cell ? round(M.cell.percent()) : null, - airtank = M.internal_tank ? M.return_pressure() : null, + airtank = M.enclosed ? M.return_pressure() : null, pilot = M.return_drivers(), location = get_area_name(M, TRUE), emp_recharging = MT.recharging, tracker_ref = REF(MT) ) - if(istype(M, /obj/vehicle/sealed/mecha/working/ripley)) - var/obj/vehicle/sealed/mecha/working/ripley/RM = M + if(istype(M, /obj/vehicle/sealed/mecha/ripley)) + var/obj/vehicle/sealed/mecha/ripley/RM = M mech_data += list( cargo_space = round((LAZYLEN(RM.cargo) / RM.cargo_capacity) * 100) ) @@ -97,11 +97,11 @@ var/answer = {"Name: [chassis.name]
    Integrity: [round((chassis.get_integrity()/chassis.max_integrity * 100), 0.01)]%
    Cell Charge: [isnull(cell_charge) ? "Not Found":"[chassis.cell.percent()]%"]
    - Airtank: [chassis.internal_tank ? "[round(chassis.return_pressure(), 0.01)]" : "Not Equipped"] kPa
    + Cabin Pressure: [chassis.enclosed ? "[round(chassis.return_pressure(), 0.01)] kPa" : "Not Sealed"]
    Pilot: [english_list(chassis.return_drivers(), nothing_text = "None")]
    Location: [get_area_name(chassis, TRUE) || "Unknown"]"} - if(istype(chassis, /obj/vehicle/sealed/mecha/working/ripley)) - var/obj/vehicle/sealed/mecha/working/ripley/RM = chassis + if(istype(chassis, /obj/vehicle/sealed/mecha/ripley)) + var/obj/vehicle/sealed/mecha/ripley/RM = chassis answer += "
    Used Cargo Space: [round((LAZYLEN(RM.cargo) / RM.cargo_capacity * 100), 0.01)]%" return answer diff --git a/code/modules/vehicles/mecha/mecha_damage.dm b/code/modules/vehicles/mecha/mecha_damage.dm index 9f9f194060bb8..08f294f202f94 100644 --- a/code/modules/vehicles/mecha/mecha_damage.dm +++ b/code/modules/vehicles/mecha/mecha_damage.dm @@ -29,7 +29,7 @@ if(!prob(internal_damage_probability)) return var/internal_damage_to_deal = possible_int_damage - internal_damage_to_deal &= ~mecha_flags + internal_damage_to_deal &= ~internal_damage if(internal_damage_to_deal) set_internal_damage(pick(bitfield_to_list(internal_damage_to_deal))) @@ -52,8 +52,8 @@ return "activating internal fire supression..." if(MECHA_INT_TEMP_CONTROL) return "resetting temperature module..." - if(MECHA_INT_TANK_BREACH) - return "activating tank sealant..." + if(MECHA_CABIN_AIR_BREACH) + return "activating cabin breach sealant..." if(MECHA_INT_CONTROL_LOST) return "recalibrating coordination system..." if(MECHA_INT_SHORT_CIRCUIT) @@ -66,8 +66,8 @@ return "internal fire supressed" if(MECHA_INT_TEMP_CONTROL) return "temperature chip reactivated" - if(MECHA_INT_TANK_BREACH) - return "air tank sealed" + if(MECHA_CABIN_AIR_BREACH) + return "cabin breach sealed" if(MECHA_INT_CONTROL_LOST) return "coordination re-established" if(MECHA_INT_SHORT_CIRCUIT) @@ -80,7 +80,7 @@ return "fire supression canceled" if(MECHA_INT_TEMP_CONTROL) return "reset aborted" - if(MECHA_INT_TANK_BREACH) + if(MECHA_CABIN_AIR_BREACH) return "sealant deactivated" if(MECHA_INT_CONTROL_LOST) return "recalibration failed" @@ -100,8 +100,8 @@ to_chat(occupants, "[icon2html(src, occupants)][span_boldnotice("Life support system reactivated.")]") if(MECHA_INT_FIRE) to_chat(occupants, "[icon2html(src, occupants)][span_boldnotice("Internal fire extinguished.")]") - if(MECHA_INT_TANK_BREACH) - to_chat(occupants, "[icon2html(src, occupants)][span_boldnotice("Damaged internal tank has been sealed.")]") + if(MECHA_CABIN_AIR_BREACH) + to_chat(occupants, "[icon2html(src, occupants)][span_boldnotice("Cabin breach has been sealed.")]") if(MECHA_INT_CONTROL_LOST) to_chat(occupants, "[icon2html(src, occupants)][span_boldnotice("Control module reactivated.")]") if(MECHA_INT_SHORT_CIRCUIT) diff --git a/code/modules/vehicles/mecha/mecha_defense.dm b/code/modules/vehicles/mecha/mecha_defense.dm index e3a0ac87a2596..37fe73f4a2d11 100644 --- a/code/modules/vehicles/mecha/mecha_defense.dm +++ b/code/modules/vehicles/mecha/mecha_defense.dm @@ -204,78 +204,103 @@ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN return ..() -/obj/vehicle/sealed/mecha/attackby(obj/item/W, mob/living/user, params) +/obj/vehicle/sealed/mecha/attackby(obj/item/weapon, mob/living/user, params) if(user.combat_mode) return ..() - if(istype(W, /obj/item/mmi)) - if(mmi_move_inside(W,user)) - to_chat(user, span_notice("[src]-[W] interface initialized successfully.")) + if(istype(weapon, /obj/item/mmi)) + if(mmi_move_inside(weapon,user)) + balloon_alert(user, "weapon initialized.") else - to_chat(user, span_warning("[src]-[W] interface initialization failed.")) + balloon_alert(user, "weapon initialization failed!") return - if(istype(W, /obj/item/mecha_ammo)) - ammo_resupply(W, user) + if(istype(weapon, /obj/item/mecha_ammo)) + ammo_resupply(weapon, user) return - if(W.GetID()) - if((mecha_flags & ADDING_ACCESS_POSSIBLE) || (mecha_flags & ADDING_MAINT_ACCESS_POSSIBLE)) - if(internals_access_allowed(user)) - ui_interact(user) - return - to_chat(user, span_warning("Invalid ID: Access denied.")) + if(weapon.GetID()) + if(!allowed(user)) + if(mecha_flags & ID_LOCK_ON) + balloon_alert(user, "access denied!") + else + balloon_alert(user, "unable to set id lock!") return - to_chat(user, span_warning("Maintenance protocols disabled by operator.")) + mecha_flags ^= ID_LOCK_ON + balloon_alert(user, "[mecha_flags & ID_LOCK_ON ? "enabled" : "disabled"] id lock !") return - if(istype(W, /obj/item/stock_parts/cell)) - if(construction_state == MECHA_OPEN_HATCH) - if(!cell) - if(!user.transferItemToLoc(W, src, silent = FALSE)) - return - var/obj/item/stock_parts/cell/C = W - to_chat(user, span_notice("You install the power cell.")) - playsound(src, 'sound/items/screwdriver2.ogg', 50, FALSE) - cell = C - log_message("Power cell installed", LOG_MECHA) - else - to_chat(user, span_warning("There's already a power cell installed!")) + if(istype(weapon, /obj/item/mecha_parts)) + var/obj/item/mecha_parts/part = weapon + part.try_attach_part(user, src, FALSE) return - if(istype(W, /obj/item/stock_parts/scanning_module)) - if(construction_state == MECHA_OPEN_HATCH) - if(!scanmod) - if(!user.transferItemToLoc(W, src, silent = FALSE)) - return - to_chat(user, span_notice("You install the scanning module.")) - playsound(src, 'sound/items/screwdriver2.ogg', 50, FALSE) - scanmod = W - log_message("[W] installed", LOG_MECHA) - update_part_values() - else - to_chat(user, span_warning("There's already a scanning module installed!")) + if(is_wire_tool(weapon) && (mecha_flags & PANEL_OPEN)) + wires.interact(user) return - if(istype(W, /obj/item/stock_parts/capacitor)) - if(construction_state == MECHA_OPEN_HATCH) - if(!capacitor) - if(!user.transferItemToLoc(W, src, silent = FALSE)) - return - to_chat(user, span_notice("You install the capacitor.")) - playsound(src, 'sound/items/screwdriver2.ogg', 50, FALSE) - capacitor = W - log_message("[W] installed", LOG_MECHA) - update_part_values() - else - to_chat(user, span_warning("There's already a capacitor installed!")) + if(istype(weapon, /obj/item/stock_parts)) + try_insert_part(weapon, user) return - if(istype(W, /obj/item/mecha_parts)) - var/obj/item/mecha_parts/P = W - P.try_attach_part(user, src, FALSE) + return ..() + +/// Try to insert a stock part into the mech +/obj/vehicle/sealed/mecha/proc/try_insert_part(obj/item/stock_parts/weapon, mob/living/user) + if(!(mecha_flags & PANEL_OPEN)) + balloon_alert(user, "open the panel first!") return - return ..() + if(istype(weapon, /obj/item/stock_parts/cell)) + if(!cell) + if(!user.transferItemToLoc(weapon, src, silent = FALSE)) + return + cell = weapon + balloon_alert(user, "installed power cell") + diag_hud_set_mechcell() + playsound(src, 'sound/items/screwdriver2.ogg', 50, FALSE) + log_message("Power cell installed", LOG_MECHA) + else + balloon_alert(user, "already installed!") + return + + if(istype(weapon, /obj/item/stock_parts/scanning_module)) + if(!scanmod) + if(!user.transferItemToLoc(weapon, src, silent = FALSE)) + return + scanmod = weapon + balloon_alert(user, "installed scanning module") + playsound(src, 'sound/items/screwdriver2.ogg', 50, FALSE) + log_message("[weapon] installed", LOG_MECHA) + update_part_values() + else + balloon_alert(user, "already installed!") + return + + if(istype(weapon, /obj/item/stock_parts/capacitor)) + if(!capacitor) + if(!user.transferItemToLoc(weapon, src, silent = FALSE)) + return + capacitor = weapon + balloon_alert(user, "installed capacitor") + playsound(src, 'sound/items/screwdriver2.ogg', 50, FALSE) + log_message("[weapon] installed", LOG_MECHA) + update_part_values() + else + balloon_alert(user, "already installed!") + return + + if(istype(weapon, /obj/item/stock_parts/servo)) + if(!servo) + if(!user.transferItemToLoc(weapon, src, silent = FALSE)) + return + servo = weapon + balloon_alert(user, "installed servo") + playsound(src, 'sound/items/screwdriver2.ogg', 50, FALSE) + log_message("[weapon] installed", LOG_MECHA) + update_part_values() + else + balloon_alert(user, "already installed!") + return /obj/vehicle/sealed/mecha/attacked_by(obj/item/attacking_item, mob/living/user) if(!attacking_item.force) @@ -301,28 +326,35 @@ try_damage_component(., user.zone_selected) /obj/vehicle/sealed/mecha/examine(mob/user) - .=..() - if(construction_state > MECHA_LOCKED) - switch(construction_state) - if(MECHA_SECURE_BOLTS) - . += span_notice("Use a wrench to adjust bolts securing the cover.") - if(MECHA_LOOSE_BOLTS) - . += span_notice("Use a crowbar to unlock the hatch to the power unit.") - if(MECHA_OPEN_HATCH) - . += span_notice("Use interface to eject stock parts from the mech.") - -/obj/vehicle/sealed/mecha/wrench_act(mob/living/user, obj/item/tool) + . = ..() + if(mecha_flags & PANEL_OPEN) + . += span_notice("The panel is open. You could use a crowbar to eject parts or lock the panel back with a screwdriver.") + else + . += span_notice("You could unlock the maintenance cover with a screwdriver.") + +/obj/vehicle/sealed/mecha/screwdriver_act(mob/living/user, obj/item/tool) ..() . = TRUE - if(construction_state == MECHA_SECURE_BOLTS) - construction_state = MECHA_LOOSE_BOLTS - to_chat(user, span_notice("You undo the securing bolts.")) - tool.play_tool_sound(src) - return - if(construction_state == MECHA_LOOSE_BOLTS) - construction_state = MECHA_SECURE_BOLTS - to_chat(user, span_notice("You tighten the securing bolts.")) - tool.play_tool_sound(src) + + if(!(mecha_flags & PANEL_OPEN) && LAZYLEN(occupants)) + for(var/mob/occupant as anything in occupants) + occupant.show_message( + span_userdanger("[user] is trying to open the maintenance panel of [src]!"), MSG_VISUAL, + span_userdanger("You hear someone trying to open the maintenance panel of [src]!"), MSG_AUDIBLE, + ) + visible_message(span_danger("[user] is trying to open the maintenance panel of [src]!")) + if(!do_after(user, 5 SECONDS, src)) + return + for(var/mob/occupant as anything in occupants) + occupant.show_message( + span_userdanger("[user] has opened the maintenance panel of [src]!"), MSG_VISUAL, + span_userdanger("You hear someone opening the maintenance panel of [src]!"), MSG_AUDIBLE, + ) + visible_message(span_danger("[user] has opened the maintenance panel of [src]!")) + + mecha_flags ^= PANEL_OPEN + balloon_alert(user, (mecha_flags & PANEL_OPEN) ? "panel open" : "panel closed") + tool.play_tool_sound(src) /obj/vehicle/sealed/mecha/crowbar_act(mob/living/user, obj/item/tool) ..() @@ -331,15 +363,38 @@ var/obj/item/crowbar/mechremoval/remover = tool remover.empty_mech(src, user) return - if(construction_state == MECHA_LOOSE_BOLTS) - construction_state = MECHA_OPEN_HATCH - to_chat(user, span_notice("You open the hatch to the power unit.")) - tool.play_tool_sound(src) + if(!(mecha_flags & PANEL_OPEN)) + balloon_alert(user, "open the panel first!") return - if(construction_state == MECHA_OPEN_HATCH) - construction_state = MECHA_LOOSE_BOLTS - to_chat(user, span_notice("You close the hatch to the power unit.")) + if(dna_lock && user.has_dna()) + var/mob/living/carbon/user_carbon = user + if(user_carbon.dna.unique_enzymes != dna_lock) + balloon_alert(user, "access with this DNA denied!") + return + if((mecha_flags & ID_LOCK_ON) && !allowed(user)) + balloon_alert(user, "access denied!") + return + + var/list/stock_parts = list() + if(cell) + stock_parts += cell + if(scanmod) + stock_parts += scanmod + if(capacitor) + stock_parts += capacitor + if(servo) + stock_parts += servo + + if(length(stock_parts)) + var/obj/item/stock_parts/part_to_remove = tgui_input_list(user, "Which part to remove?", "Part Removal", stock_parts) + if(!(locate(part_to_remove) in contents)) + return + user.put_in_hands(part_to_remove) + CheckParts() + diag_hud_set_mechcell() tool.play_tool_sound(src) + return + balloon_alert(user, "no parts!") /obj/vehicle/sealed/mecha/welder_act(mob/living/user, obj/item/W) if(user.combat_mode) @@ -357,7 +412,7 @@ audible_message(span_hear("You hear welding.")) var/did_the_thing while(atom_integrity < max_integrity) - if(W.use_tool(src, user, 2.5 SECONDS, volume=50, amount=1)) + if(W.use_tool(src, user, 2.5 SECONDS, volume=50)) did_the_thing = TRUE atom_integrity += min(10, (max_integrity - atom_integrity)) audible_message(span_hear("You hear welding.")) @@ -379,8 +434,8 @@ clear_internal_damage(MECHA_INT_TEMP_CONTROL) if(internal_damage & MECHA_INT_SHORT_CIRCUIT) clear_internal_damage(MECHA_INT_SHORT_CIRCUIT) - if(internal_damage & MECHA_INT_TANK_BREACH) - clear_internal_damage(MECHA_INT_TANK_BREACH) + if(internal_damage & MECHA_CABIN_AIR_BREACH) + clear_internal_damage(MECHA_CABIN_AIR_BREACH) if(internal_damage & MECHA_INT_CONTROL_LOST) clear_internal_damage(MECHA_INT_CONTROL_LOST) @@ -400,7 +455,7 @@ /obj/vehicle/sealed/mecha/proc/ammo_resupply(obj/item/mecha_ammo/A, mob/user,fail_chat_override = FALSE) if(!A.rounds) if(!fail_chat_override) - to_chat(user, span_warning("This box of ammo is empty!")) + balloon_alert(user, "the box is empty!") return FALSE var/ammo_needed var/found_gun @@ -452,7 +507,7 @@ return TRUE if(!fail_chat_override) if(found_gun) - to_chat(user, span_notice("You can't fit any more ammo of this type!")) + balloon_alert(user, "ammo storage is full!") else - to_chat(user, span_notice("None of the equipment on this exosuit can use this ammo!")) + balloon_alert(user, "can't use this ammo!") return FALSE diff --git a/code/modules/vehicles/mecha/mecha_helpers.dm b/code/modules/vehicles/mecha/mecha_helpers.dm index f949860dc0bda..ad012386df392 100644 --- a/code/modules/vehicles/mecha/mecha_helpers.dm +++ b/code/modules/vehicles/mecha/mecha_helpers.dm @@ -1,30 +1,3 @@ -///Adds a cell, for use in Map-spawned mechs, Nuke Ops mechs, and admin-spawned mechs. Mechs built by hand will replace this. -/obj/vehicle/sealed/mecha/proc/add_cell(obj/item/stock_parts/cell/new_cell) - QDEL_NULL(cell) - if(new_cell) - new_cell.forceMove(src) - cell = new_cell - return - cell = new /obj/item/stock_parts/cell/high(src) - -///Adds a scanning module, for use in Map-spawned mechs, Nuke Ops mechs, and admin-spawned mechs. Mechs built by hand will replace this. -/obj/vehicle/sealed/mecha/proc/add_scanmod(obj/item/stock_parts/scanning_module/new_scanmod) - QDEL_NULL(scanmod) - if(new_scanmod) - new_scanmod.forceMove(src) - scanmod = new_scanmod - return - scanmod = new /obj/item/stock_parts/scanning_module(src) - -///Adds a capacitor, for use in Map-spawned mechs, Nuke Ops mechs, and admin-spawned mechs. Mechs built by hand will replace this. -/obj/vehicle/sealed/mecha/proc/add_capacitor(obj/item/stock_parts/capacitor/new_capacitor) - QDEL_NULL(capacitor) - if(new_capacitor) - new_capacitor.forceMove(src) - capacitor = new_capacitor - else - capacitor = new /obj/item/stock_parts/capacitor(src) - /////////////////////// ///// Power stuff ///// /////////////////////// diff --git a/code/modules/vehicles/mecha/mecha_mob_interaction.dm b/code/modules/vehicles/mecha/mecha_mob_interaction.dm index c3571d62c6a42..07b13a27ec054 100644 --- a/code/modules/vehicles/mecha/mecha_mob_interaction.dm +++ b/code/modules/vehicles/mecha/mecha_mob_interaction.dm @@ -11,7 +11,7 @@ to_chat(M, span_warning("Access denied. [name] is secured with a DNA lock.")) log_message("Permission denied (DNA LOCK).", LOG_MECHA) return - if(!operation_allowed(M)) + if((mecha_flags & ID_LOCK_ON) && !allowed(M)) to_chat(M, span_warning("Access denied. Insufficient operation keycodes.")) log_message("Permission denied (No keycode).", LOG_MECHA) return @@ -120,7 +120,7 @@ if(forced)//This should only happen if there are multiple AIs in a round, and at least one is Malf. if(!AI.linked_core) //if the victim AI has no core AI.investigate_log("has been gibbed by being forced out of their mech by another AI.", INVESTIGATE_DEATHS) - AI.gib() //If one Malf decides to steal a mech from another AI (even other Malfs!), they are destroyed, as they have nowhere to go when replaced. + AI.gib(DROP_ALL_REMAINS) //If one Malf decides to steal a mech from another AI (even other Malfs!), they are destroyed, as they have nowhere to go when replaced. AI = null mecha_flags &= ~SILICON_PILOT return @@ -183,6 +183,8 @@ is_currently_ejecting = TRUE if(do_after(user, has_gravity() ? exit_delay : 0 , target = src)) to_chat(user, span_notice("You exit the mech.")) + if(cabin_sealed) + set_cabin_seal(user, FALSE) mob_exit(user, silent = TRUE) else to_chat(user, span_notice("You stop exiting the mech. Weapons are enabled again.")) diff --git a/code/modules/vehicles/mecha/mecha_movement.dm b/code/modules/vehicles/mecha/mecha_movement.dm index d1513d4b3ee1b..d6c8feed4b3b9 100644 --- a/code/modules/vehicles/mecha/mecha_movement.dm +++ b/code/modules/vehicles/mecha/mecha_movement.dm @@ -4,20 +4,28 @@ for(var/mob/living/occupant as anything in occupants) occupant.setDir(newdir) +///Called when the mech moves +/obj/vehicle/sealed/mecha/proc/on_move() + SIGNAL_HANDLER + + collect_ore() + play_stepsound() + +///Collects ore when we move, if there is an orebox and it is functional +/obj/vehicle/sealed/mecha/proc/collect_ore() + if(isnull(ore_box) || !HAS_TRAIT(src, TRAIT_OREBOX_FUNCTIONAL)) + return + for(var/obj/item/stack/ore/ore in range(1, src)) + //we can reach it and it's in front of us? grab it! + if(ore.Adjacent(src) && ((get_dir(src, ore) & dir) || ore.loc == loc)) + ore.forceMove(ore_box) + ///Plays the mech step sound effect. Split from movement procs so that other mechs (HONK) can override this one specific part. /obj/vehicle/sealed/mecha/proc/play_stepsound() - SIGNAL_HANDLER if(mecha_flags & QUIET_STEPS) return playsound(src, stepsound, 40, TRUE) -///Disconnects air tank- air port connection on mecha move -/obj/vehicle/sealed/mecha/proc/disconnect_air() - SIGNAL_HANDLER - if(internal_tank.disconnect()) // Something moved us and broke connection - to_chat(occupants, "[icon2html(src, occupants)][span_warning("Air port connection has been severed!")]") - log_message("Lost connection to gas port.", LOG_MECHA) - // Do whatever you do to mobs to these fuckers too /obj/vehicle/sealed/mecha/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) . = ..() @@ -29,7 +37,7 @@ if(!istype(backup) || !movement_dir || backup.anchored || continuous_move) //get_spacemove_backup() already checks if a returned turf is solid, so we can just go return TRUE last_pushoff = world.time - if(backup.newtonian_move(turn(movement_dir, 180), instant = TRUE)) + if(backup.newtonian_move(REVERSE_DIR(movement_dir), instant = TRUE)) backup.last_pushoff = world.time step_silent = TRUE if(return_drivers()) @@ -45,7 +53,9 @@ . = TRUE if(!canmove || !(user in return_drivers())) return - vehicle_move(direction) + if (!vehicle_move(direction)) + return + SEND_SIGNAL(user, COMSIG_MOB_DROVE_MECH, src) /obj/vehicle/sealed/mecha/vehicle_move(direction, forcerotate = FALSE) if(!COOLDOWN_FINISHED(src, cooldown_vehicle_move)) @@ -55,17 +65,15 @@ return FALSE if(!direction) return FALSE + if(ismovable(loc)) //Mech is inside an object, tell it we moved + var/atom/loc_atom = loc + return loc_atom.relaymove(src, direction) + var/obj/machinery/portable_atmospherics/canister/internal_tank = get_internal_tank() if(internal_tank?.connected_port) if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_MESSAGE)) to_chat(occupants, "[icon2html(src, occupants)][span_warning("Unable to move while connected to the air system port!")]") TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS) return FALSE - if(construction_state) - if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_MESSAGE)) - to_chat(occupants, "[icon2html(src, occupants)][span_danger("Maintenance protocols in effect.")]") - TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS) - return FALSE - if(!Process_Spacemove(direction)) return FALSE if(zoom_mode) @@ -73,14 +81,16 @@ to_chat(occupants, "[icon2html(src, occupants)][span_warning("Unable to move while in zoom mode!")]") TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS) return FALSE - if(!cell) + var/list/missing_parts = list() + if(isnull(cell)) + missing_parts += "power cell" + if(isnull(capacitor)) + missing_parts += "capacitor" + if(isnull(servo)) + missing_parts += "micro-servo" + if(length(missing_parts)) if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_MESSAGE)) - to_chat(occupants, "[icon2html(src, occupants)][span_warning("Missing power cell.")]") - TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS) - return FALSE - if(!scanmod || !capacitor) - if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_MESSAGE)) - to_chat(occupants, "[icon2html(src, occupants)][span_warning("Missing [scanmod? "capacitor" : "scanning module"].")]") + to_chat(occupants, "[icon2html(src, occupants)][span_warning("Missing [english_list(missing_parts)].")]") TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS) return FALSE if(!use_power(step_energy_drain)) @@ -115,7 +125,8 @@ if(dir != direction && !(mecha_flags & QUIET_TURNS) && !step_silent) playsound(src,turnsound,40,TRUE) setDir(direction) - return TRUE + if(!pivot_step) //If we pivot step, we don't return here so we don't just come to a stop + return TRUE set_glide_size(DELAY_TO_GLIDE_SIZE(movedelay)) //Otherwise just walk normally diff --git a/code/modules/vehicles/mecha/mecha_parts.dm b/code/modules/vehicles/mecha/mecha_parts.dm index 54ab923be1f50..fe5b53caba78d 100644 --- a/code/modules/vehicles/mecha/mecha_parts.dm +++ b/code/modules/vehicles/mecha/mecha_parts.dm @@ -4,7 +4,7 @@ /obj/item/mecha_parts name = "mecha part" - icon = 'icons/mecha/mech_construct.dmi' + icon = 'icons/mob/mech_construct.dmi' icon_state = "blank" w_class = WEIGHT_CLASS_GIGANTIC flags_1 = CONDUCT_1 @@ -336,7 +336,7 @@ /obj/item/circuitboard/mecha name = "exosuit circuit board" - icon = 'icons/obj/module.dmi' + icon = 'icons/obj/assemblies/module.dmi' icon_state = "std_mod" inhand_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' diff --git a/code/modules/vehicles/mecha/mecha_ui.dm b/code/modules/vehicles/mecha/mecha_ui.dm index 698cefb706d2d..815770875ea05 100644 --- a/code/modules/vehicles/mecha/mecha_ui.dm +++ b/code/modules/vehicles/mecha/mecha_ui.dm @@ -5,7 +5,7 @@ /obj/vehicle/sealed/mecha/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, "Mecha", name, ui_x, ui_y) + ui = new(user, src, "Mecha", name) ui.open() ui_view.display_to(user) @@ -24,218 +24,162 @@ ) /obj/vehicle/sealed/mecha/ui_assets(mob/user) - return list(get_asset_datum(/datum/asset/spritesheet/mechaarmor)) + return list( + get_asset_datum(/datum/asset/spritesheet/mecha_equipment), + ) /obj/vehicle/sealed/mecha/ui_static_data(mob/user) var/list/data = list() - data["cabin_dangerous_highpressure"] = WARNING_HIGH_PRESSURE + data["ui_theme"] = ui_theme + //same thresholds as in air alarm + data["cabin_pressure_warning_min"] = WARNING_LOW_PRESSURE + data["cabin_pressure_hazard_min"] = HAZARD_LOW_PRESSURE + data["cabin_pressure_warning_max"] = WARNING_HIGH_PRESSURE + data["cabin_pressure_hazard_max"] = HAZARD_HIGH_PRESSURE + data["cabin_temp_warning_min"] = BODYTEMP_COLD_WARNING_1 + 10 - T0C + data["cabin_temp_hazard_min"] = BODYTEMP_COLD_WARNING_1 - T0C + data["cabin_temp_warning_max"] = BODYTEMP_HEAT_WARNING_1 - 27 - T0C + data["cabin_temp_hazard_max"] = BODYTEMP_HEAT_WARNING_1 - T0C + data["one_atmosphere"] = ONE_ATMOSPHERE + data["sheet_material_amount"] = SHEET_MATERIAL_AMOUNT //map of relevant flags to check tgui side, not every flag needs to be here data["mechflag_keys"] = list( - "ADDING_ACCESS_POSSIBLE" = ADDING_ACCESS_POSSIBLE, - "ADDING_MAINT_ACCESS_POSSIBLE" = ADDING_MAINT_ACCESS_POSSIBLE, + "ID_LOCK_ON" = ID_LOCK_ON, "LIGHTS_ON" = LIGHTS_ON, "HAS_LIGHTS" = HAS_LIGHTS, ) data["internal_damage_keys"] = list( "MECHA_INT_FIRE" = MECHA_INT_FIRE, "MECHA_INT_TEMP_CONTROL" = MECHA_INT_TEMP_CONTROL, - "MECHA_INT_TANK_BREACH" = MECHA_INT_TANK_BREACH, + "MECHA_CABIN_AIR_BREACH" = MECHA_CABIN_AIR_BREACH, "MECHA_INT_CONTROL_LOST" = MECHA_INT_CONTROL_LOST, "MECHA_INT_SHORT_CIRCUIT" = MECHA_INT_SHORT_CIRCUIT, ) - data["mech_electronics"] = list( - "minfreq" = MIN_FREE_FREQ, - "maxfreq" = MAX_FREE_FREQ, - ) + + var/list/regions = list() + var/list/tgui_region_data = SSid_access.all_region_access_tgui + for(var/region in SSid_access.station_regions) + regions += tgui_region_data[region] + data["regions"] = regions return data /obj/vehicle/sealed/mecha/ui_data(mob/user) var/list/data = list() var/isoperator = (user in occupants) //maintenance mode outside of mech data["isoperator"] = isoperator - if(!isoperator) - data["name"] = name - data["mecha_flags"] = mecha_flags - data["internal_tank_valve"] = internal_tank_valve - data["cell"] = cell?.name - data["scanning"] = scanmod?.name - data["capacitor"] = capacitor?.name - data["operation_req_access"] = list() - data["idcard_access"] = list() - for(var/code in operation_req_access) - data["operation_req_access"] += list(list("name" = SSid_access.get_access_desc(code), "number" = code)) - if(!isliving(user)) - return data - var/mob/living/living_user = user - var/obj/item/card/id/card = living_user.get_idcard(TRUE) - if(!card) - return data - for(var/idcode in card.access) - if(idcode in operation_req_access) - continue - var/accessname = SSid_access.get_access_desc(idcode) - if(!accessname) - continue //there's some strange access without a name - data["idcard_access"] += list(list("name" = accessname, "number" = idcode)) - return data + data["cell"] = cell?.name + data["scanning"] = scanmod?.name + data["capacitor"] = capacitor?.name + data["servo"] = servo?.name ui_view.appearance = appearance - var/datum/gas_mixture/int_tank_air = internal_tank?.return_air() data["name"] = name - data["integrity"] = atom_integrity/max_integrity + data["integrity"] = atom_integrity + data["integrity_max"] = max_integrity data["power_level"] = cell?.charge data["power_max"] = cell?.maxcharge data["mecha_flags"] = mecha_flags data["internal_damage"] = internal_damage - data["airtank_present"] = !!internal_tank - data["air_source"] = use_internal_tank ? "Internal Airtank" : "Environment" - data["airtank_pressure"] = int_tank_air ? round(int_tank_air.return_pressure(), 0.01) : null - data["airtank_temp"] = int_tank_air?.temperature - data["port_connected"] = internal_tank?.connected_port ? TRUE : FALSE - data["cabin_pressure"] = round(return_pressure(), 0.01) - data["cabin_temp"] = return_temperature() + + data["can_use_overclock"] = can_use_overclock + data["overclock_mode"] = overclock_mode + data["overclock_temp_percentage"] = overclock_temp / overclock_temp_danger + data["dna_lock"] = dna_lock + + data["one_access"] = one_access + data["accesses"] = accesses + + data["servo_rating"] = servo?.rating + data["scanmod_rating"] = scanmod?.rating + data["capacitor_rating"] = capacitor?.rating + data["weapons_safety"] = weapons_safety + data["enclosed"] = enclosed + data["cabin_sealed"] = cabin_sealed + data["cabin_temp"] = round(cabin_air.temperature - T0C) + data["cabin_pressure"] = round(cabin_air.return_pressure()) data["mech_view"] = ui_view.assigned_map - if(radio) - data["mech_electronics"] = list( - "microphone" = radio.get_broadcasting(), - "speaker" = radio.get_listening(), - "frequency" = radio.get_frequency(), - ) - if(equip_by_category[MECHA_L_ARM]) - var/obj/item/mecha_parts/mecha_equipment/l_gun = equip_by_category[MECHA_L_ARM] - var/isballisticweapon = istype(l_gun, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic) - data["left_arm_weapon"] = list( - "name" = l_gun.name, - "desc" = l_gun.desc, - "ref" = REF(l_gun), - "integrity" = (l_gun.get_integrity()/l_gun.max_integrity), - "isballisticweapon" = isballisticweapon, - "energy_per_use" = l_gun.energy_drain, - "snowflake" = l_gun.get_snowflake_data(), - ) - if(isballisticweapon) - var/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/weapon = l_gun - data["left_arm_weapon"] += list( - "projectiles" = weapon.projectiles, - "max_magazine" = initial(weapon.projectiles), - "projectiles_cache" = weapon.projectiles_cache, - "projectiles_cache_max" = weapon.projectiles_cache_max, - "disabledreload" = weapon.disabledreload, - "ammo_type" = weapon.ammo_type, - ) - if(equip_by_category[MECHA_R_ARM]) - var/obj/item/mecha_parts/mecha_equipment/r_gun = equip_by_category[MECHA_R_ARM] - var/isballisticweapon = istype(r_gun, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic) - data["right_arm_weapon"] = list( - "name" = r_gun.name, - "desc" = r_gun.desc, - "ref" = REF(r_gun), - "integrity" = (r_gun.get_integrity()/r_gun.max_integrity), - "isballisticweapon" = isballisticweapon, - "energy_per_use" = r_gun.energy_drain, - "snowflake" = r_gun.get_snowflake_data(), - ) - if(isballisticweapon) - var/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/weapon = r_gun - data["right_arm_weapon"] += list( - "projectiles" = weapon.projectiles, - "max_magazine" = initial(weapon.projectiles), - "projectiles_cache" = weapon.projectiles_cache, - "projectiles_cache_max" = weapon.projectiles_cache_max, - "disabledreload" = weapon.disabledreload, - "ammo_type" = weapon.ammo_type, - ) - data["mech_equipment"] = list("utility" = list(), "power" = list(), "armor" = list()) - for(var/obj/item/mecha_parts/mecha_equipment/utility as anything in equip_by_category[MECHA_UTILITY]) - data["mech_equipment"]["utility"] += list(list( - "name" = utility.name, - "activated" = utility.activated, - "snowflake" = utility.get_snowflake_data(), - "ref" = REF(utility), - )) - for(var/obj/item/mecha_parts/mecha_equipment/power as anything in equip_by_category[MECHA_POWER]) - data["mech_equipment"]["power"] += list(list( - "name" = power.name, - "activated" = power.activated, - "snowflake" = power.get_snowflake_data(), - "ref" = REF(power), - )) - for(var/obj/item/mecha_parts/mecha_equipment/armor/armor as anything in equip_by_category[MECHA_ARMOR]) - data["mech_equipment"]["armor"] += list(list( - "protect_name" = armor.protect_name, - "iconstate_name" = armor.iconstate_name, - "ref" = REF(armor), - )) + data["modules"] = get_module_ui_data() + data["selected_module_index"] = ui_selected_module_index + return data + +/obj/vehicle/sealed/mecha/proc/get_module_ui_data() + var/list/data = list() + var/module_index = 0 + for(var/category in max_equip_by_category) + var/max_per_category = max_equip_by_category[category] + for(var/i = 1 to max_per_category) + var/equipment = equip_by_category[category] + var/is_slot_free = islist(equipment) ? i > length(equipment) : isnull(equipment) + if(is_slot_free) + data += list(list( + "slot" = category + )) + if(ui_selected_module_index == module_index) + ui_selected_module_index = null + else + var/obj/item/mecha_parts/mecha_equipment/module = islist(equipment) ? equipment[i] : equipment + data += list(list( + "slot" = category, + "icon" = module.icon_state, + "name" = module.name, + "desc" = module.desc, + "detachable" = module.detachable, + "integrity" = (module.get_integrity()/module.max_integrity), + "can_be_toggled" = module.can_be_toggled, + "can_be_triggered" = module.can_be_triggered, + "active" = module.active, + "active_label" = module.active_label, + "equip_cooldown" = module.equip_cooldown && DisplayTimeText(module.equip_cooldown), + "energy_per_use" = module.energy_drain, + "snowflake" = module.get_snowflake_data(), + "ref" = REF(module), + )) + if(isnull(ui_selected_module_index)) + ui_selected_module_index = module_index + module_index++ return data /obj/vehicle/sealed/mecha/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return - if(!(usr in occupants)) - switch(action) - if("stopmaint") - if(construction_state > MECHA_LOCKED) - to_chat(usr, span_warning("You must end Maintenance Procedures first!")) - return - mecha_flags &= ~ADDING_MAINT_ACCESS_POSSIBLE - ui.close() - return FALSE - if("togglemaint") - if(!(mecha_flags & ADDING_MAINT_ACCESS_POSSIBLE)) - return FALSE - if(construction_state == MECHA_LOCKED) - construction_state = MECHA_SECURE_BOLTS - to_chat(usr, span_notice("The securing bolts are now exposed.")) - else if(construction_state == MECHA_SECURE_BOLTS) - construction_state = MECHA_LOCKED - to_chat(usr, span_notice("The securing bolts are now hidden.")) - if("drop_cell") - if(construction_state != MECHA_OPEN_HATCH) - return - usr.put_in_hands(cell) - cell = null - if("drop_scanning") - if(construction_state != MECHA_OPEN_HATCH) - return - usr.put_in_hands(scanmod) - scanmod = null - if("drop_capacitor") - if(construction_state != MECHA_OPEN_HATCH) - return - usr.put_in_hands(capacitor) - capacitor = null - if("set_pressure") - var/new_pressure = tgui_input_number(usr, "Enter new pressure", "Cabin pressure change", internal_tank_valve) - if(isnull(new_pressure) || !construction_state) - return - internal_tank_valve = new_pressure - to_chat(usr, span_notice("The internal pressure valve has been set to [internal_tank_valve]kPa.")) - if("add_req_access") - if(!(mecha_flags & ADDING_ACCESS_POSSIBLE)) - return - if(!(params["added_access"] == "all")) - operation_req_access += params["added_access"] - else - var/mob/living/living_user = usr - var/obj/item/card/id/card = living_user.get_idcard(TRUE) - operation_req_access += card.access - if("del_req_access") - if(!(mecha_flags & ADDING_ACCESS_POSSIBLE)) - return - if(!(params["removed_access"] == "all")) - operation_req_access -= params["removed_access"] - else - operation_req_access = list() - if("lock_req_edit") - mecha_flags &= ~ADDING_ACCESS_POSSIBLE - return TRUE - //usr is in occupants switch(action) + if("clear_all") + accesses = list() + one_access = 0 + update_access() + if("grant_all") + accesses = SSid_access.get_region_access_list(list(REGION_ALL_STATION)) + update_access() + if("one_access") + one_access = !one_access + update_access() + if("set") + var/access = params["access"] + if (!(access in accesses)) + accesses += access + else + accesses -= access + update_access() + if("grant_region") + var/region = params["region"] + if(isnull(region)) + return + accesses |= SSid_access.get_region_access_list(list(region)) + update_access() + if("deny_region") + var/region = params["region"] + if(isnull(region)) + return + accesses -= SSid_access.get_region_access_list(list(region)) + update_access() + if("select_module") + ui_selected_module_index = text2num(params["index"]) + return TRUE if("changename") - var/userinput = tgui_input_text(usr, "Choose a new exosuit name", "Rename exosuit", max_length = MAX_NAME_LEN) + var/userinput = tgui_input_text(usr, "Choose a new exosuit name", "Rename exosuit", max_length = MAX_NAME_LEN, default = name) if(!userinput) return if(is_ic_filtered(userinput) || is_soft_ic_filtered(userinput)) @@ -258,47 +202,22 @@ to_chat(user, "[icon2html(src, occupants)][span_notice("You feel a prick as the needle takes your DNA sample.")]") if("reset_dna") dna_lock = null - if("view_dna") - tgui_alert(usr, "Enzymes detected: " + dna_lock) - return FALSE - if("toggle_airsource") - if(!internal_tank) - return - use_internal_tank = !use_internal_tank - balloon_alert(usr, "taking air from [use_internal_tank ? "internal airtank" : "environment"]") - log_message("Now taking air from [use_internal_tank?"internal airtank":"environment"].", LOG_MECHA) - if("toggle_port") - if(internal_tank.connected_port) - if(internal_tank.disconnect()) - to_chat(occupants, "[icon2html(src, occupants)][span_notice("Disconnected from the air system port.")]") - log_message("Disconnected from gas port.", LOG_MECHA) - return TRUE - to_chat(occupants, "[icon2html(src, occupants)][span_warning("Unable to disconnect from the air system port!")]") - return - var/obj/machinery/atmospherics/components/unary/portables_connector/possible_port = locate() in loc - if(internal_tank.connect(possible_port)) - to_chat(occupants, "[icon2html(src, occupants)][span_notice("Connected to the air system port.")]") - log_message("Connected to gas port.", LOG_MECHA) - return TRUE - to_chat(occupants, "[icon2html(src, occupants)][span_warning("Unable to connect with air system port!")]") - if("toggle_maintenance") - if(construction_state) - to_chat(occupants, "[icon2html(src, occupants)][span_danger("Maintenance protocols in effect")]") - return - mecha_flags ^= ADDING_MAINT_ACCESS_POSSIBLE - if("toggle_id_panel") - mecha_flags ^= ADDING_ACCESS_POSSIBLE - if("toggle_microphone") - radio.set_broadcasting(!radio.get_broadcasting()) - if("toggle_speaker") - radio.set_listening(!radio.get_listening()) - if("set_frequency") - radio.set_frequency(sanitize_frequency(params["new_frequency"], radio.freerange, radio.syndie)) + if("toggle_cabin_seal") + set_cabin_seal(usr, !cabin_sealed) + if("toggle_id_lock") + mecha_flags ^= ID_LOCK_ON + if("toggle_lights") + toggle_lights(user = usr) + if("toggle_overclock") + toggle_overclock() + var/datum/action/act = locate(/datum/action/vehicle/sealed/mecha/mech_overclock) in usr.actions + act.button_icon_state = "mech_overload_[overclock_mode ? "on" : "off"]" + act.build_all_button_icons() if("repair_int_damage") - ui.close() //if doing this you're likely want to watch for bad people so close the UI try_repair_int_damage(usr, params["flag"]) return FALSE if("equip_act") var/obj/item/mecha_parts/mecha_equipment/gear = locate(params["ref"]) in flat_equipment return gear?.ui_act(params["gear_action"], params, ui, state) return TRUE + diff --git a/code/modules/vehicles/mecha/mecha_wreckage.dm b/code/modules/vehicles/mecha/mecha_wreckage.dm index ff78cebb34651..3540891d336cd 100644 --- a/code/modules/vehicles/mecha/mecha_wreckage.dm +++ b/code/modules/vehicles/mecha/mecha_wreckage.dm @@ -6,7 +6,7 @@ /obj/structure/mecha_wreckage name = "exosuit wreckage" desc = "Remains of some unfortunate mecha. Completely irreparable, but perhaps something can be salvaged." - icon = 'icons/mecha/mecha.dmi' + icon = 'icons/mob/mecha.dmi' density = TRUE anchored = FALSE opacity = FALSE @@ -220,7 +220,7 @@ /obj/structure/mecha_wreckage/savannah_ivanov name = "\improper Savannah-Ivanov wreckage" - icon = 'icons/mecha/coop_mech.dmi' + icon = 'icons/mob/coop_mech.dmi' icon_state = "savannah_ivanov-broken" welder_salvage = list(/obj/item/stack/sheet/mineral/silver, /obj/item/stack/sheet/iron, /obj/item/stack/rods) parts = list( diff --git a/code/modules/vehicles/mecha/medical/odysseus.dm b/code/modules/vehicles/mecha/medical/odysseus.dm index 87df9e66e524a..90a46f54f5864 100644 --- a/code/modules/vehicles/mecha/medical/odysseus.dm +++ b/code/modules/vehicles/mecha/medical/odysseus.dm @@ -3,14 +3,14 @@ name = "\improper Odysseus" icon_state = "odysseus" base_icon_state = "odysseus" - allow_diagonal_movement = TRUE movedelay = 2 max_temperature = 15000 max_integrity = 120 wreckage = /obj/structure/mecha_wreckage/odysseus mech_type = EXOSUIT_MODULE_ODYSSEUS step_energy_drain = 6 - internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_MECH_MEDICAL) + accesses = list(ACCESS_MECH_SCIENCE, ACCESS_MECH_MEDICAL) + pivot_step = TRUE /obj/vehicle/sealed/mecha/odysseus/moved_inside(mob/living/carbon/human/H) . = ..() diff --git a/code/modules/vehicles/mecha/working/clarke.dm b/code/modules/vehicles/mecha/working/clarke.dm index fabce1c9163cb..e31690f65b929 100644 --- a/code/modules/vehicles/mecha/working/clarke.dm +++ b/code/modules/vehicles/mecha/working/clarke.dm @@ -1,5 +1,5 @@ ///Lavaproof, fireproof, fast mech with low armor and higher energy consumption, cannot strafe and has an internal ore box. -/obj/vehicle/sealed/mecha/working/clarke +/obj/vehicle/sealed/mecha/clarke desc = "Combining man and machine for a better, stronger engineer. Can even resist lava!" name = "\improper Clarke" icon_state = "clarke" @@ -9,8 +9,8 @@ movedelay = 1.25 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_type = /datum/armor/working_clarke + step_energy_drain = 12 //slightly higher energy drain since you movin those wheels FAST + armor_type = /datum/armor/mecha_clarke equip_by_category = list( MECHA_L_ARM = null, MECHA_R_ARM = null, @@ -19,17 +19,21 @@ MECHA_ARMOR = list(), ) max_equip_by_category = list( - MECHA_UTILITY = 3, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 5, MECHA_POWER = 1, MECHA_ARMOR = 1, ) wreckage = /obj/structure/mecha_wreckage/clarke mech_type = EXOSUIT_MODULE_CLARKE enter_delay = 40 - mecha_flags = ADDING_ACCESS_POSSIBLE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE | OMNIDIRECTIONAL_ATTACKS - internals_req_access = list(ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE, ACCESS_MECH_MINING) + mecha_flags = IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE | OMNIDIRECTIONAL_ATTACKS + accesses = list(ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE, ACCESS_MECH_MINING) + allow_diagonal_movement = FALSE + pivot_step = TRUE -/datum/armor/working_clarke +/datum/armor/mecha_clarke melee = 20 bullet = 10 laser = 20 @@ -38,15 +42,16 @@ fire = 100 acid = 100 -/obj/vehicle/sealed/mecha/working/clarke/Initialize(mapload) +/obj/vehicle/sealed/mecha/clarke/Initialize(mapload) . = ..() - box = new(src) + ore_box = new(src) -/obj/vehicle/sealed/mecha/working/clarke/Destroy() - INVOKE_ASYNC(box, TYPE_PROC_REF(/obj/structure/ore_box, dump_box_contents)) +/obj/vehicle/sealed/mecha/clarke/atom_destruction() + if(ore_box) + INVOKE_ASYNC(ore_box, TYPE_PROC_REF(/obj/structure/ore_box, dump_box_contents)) return ..() -/obj/vehicle/sealed/mecha/working/clarke/generate_actions() +/obj/vehicle/sealed/mecha/clarke/generate_actions() . = ..() initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_search_ruins) @@ -56,27 +61,48 @@ /obj/item/mecha_parts/mecha_equipment/orebox_manager name = "ore storage module" desc = "An automated ore box management device." - icon = 'icons/obj/mining.dmi' - icon_state = "bin" + icon_state = "mecha_bin" equipment_slot = MECHA_UTILITY detachable = FALSE - /// Var to avoid istype checking every time the topic button is pressed. This will only work inside Clarke mechs. - var/obj/vehicle/sealed/mecha/working/clarke/hostmech -/obj/item/mecha_parts/mecha_equipment/orebox_manager/attach(obj/vehicle/sealed/mecha/M, attach_right = FALSE) +/obj/item/mecha_parts/mecha_equipment/orebox_manager/attach(obj/vehicle/sealed/mecha/mecha, attach_right = FALSE) . = ..() - if(istype(M, /obj/vehicle/sealed/mecha/working/clarke)) - hostmech = M + ADD_TRAIT(chassis, TRAIT_OREBOX_FUNCTIONAL, TRAIT_MECH_EQUIPMENT(type)) -/obj/item/mecha_parts/mecha_equipment/orebox_manager/detach() - hostmech = null //just in case +/obj/item/mecha_parts/mecha_equipment/orebox_manager/detach(atom/moveto) + REMOVE_TRAIT(chassis, TRAIT_OREBOX_FUNCTIONAL, TRAIT_MECH_EQUIPMENT(type)) return ..() +/obj/item/mecha_parts/mecha_equipment/orebox_manager/get_snowflake_data() + var/list/contents = chassis.ore_box?.contents + var/list/contents_grouped = list() + for(var/obj/item/stack/ore/item as anything in contents) + if(isnull(contents_grouped[item.icon_state])) + var/ore_data = list() + ore_data["name"] = item.name + ore_data["icon"] = item.icon_state + ore_data["amount"] = item.amount + contents_grouped[item.icon_state] = ore_data + else + contents_grouped[item.icon_state]["amount"] += item.amount + var/list/data = list( + "snowflake_id" = MECHA_SNOWFLAKE_ID_OREBOX_MANAGER, + "contents" = contents_grouped, + ) + return data + /obj/item/mecha_parts/mecha_equipment/orebox_manager/ui_act(action, list/params) . = ..() - if(action == "toggle") - hostmech.box?.dump_box_contents() - activated = TRUE + if(.) + return TRUE + if(action == "dump") + var/obj/structure/ore_box/cached_ore_box = chassis.ore_box + if(isnull(cached_ore_box)) + return FALSE + cached_ore_box.dump_box_contents() + playsound(chassis, 'sound/weapons/tap.ogg', 50, TRUE) + log_message("Dumped [cached_ore_box].", LOG_MECHA) + return TRUE #define SEARCH_COOLDOWN (1 MINUTES) diff --git a/code/modules/vehicles/mecha/working/ripley.dm b/code/modules/vehicles/mecha/working/ripley.dm index 378849fc42cef..9db12624125aa 100644 --- a/code/modules/vehicles/mecha/working/ripley.dm +++ b/code/modules/vehicles/mecha/working/ripley.dm @@ -1,4 +1,4 @@ -/obj/vehicle/sealed/mecha/working/ripley +/obj/vehicle/sealed/mecha/ripley desc = "Autonomous Power Loader Unit MK-I. Designed primarily around heavy lifting, the Ripley can be outfitted with utility equipment to fill a number of roles." name = "\improper APLU MK-I \"Ripley\"" icon_state = "ripley" @@ -7,18 +7,19 @@ movedelay = 1.5 //Move speed, lower is faster. max_temperature = 20000 max_integrity = 200 - ui_x = 1200 lights_power = 7 - armor_type = /datum/armor/working_ripley + armor_type = /datum/armor/mecha_ripley max_equip_by_category = list( - MECHA_UTILITY = 2, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 4, MECHA_POWER = 1, MECHA_ARMOR = 1, ) wreckage = /obj/structure/mecha_wreckage/ripley mech_type = EXOSUIT_MODULE_RIPLEY possible_int_damage = MECHA_INT_FIRE|MECHA_INT_CONTROL_LOST|MECHA_INT_SHORT_CIRCUIT - internals_req_access = list(ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE, ACCESS_MECH_MINING) + accesses = list(ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE, ACCESS_MECH_MINING) enclosed = FALSE //Normal ripley has an open cockpit design enter_delay = 10 //can enter in a quarter of the time of other mechs exit_delay = 10 @@ -43,7 +44,7 @@ /// How fast the mech is in normal pressure var/slow_pressure_step_in = 2 -/datum/armor/working_ripley +/datum/armor/mecha_ripley melee = 40 bullet = 20 laser = 10 @@ -52,18 +53,11 @@ fire = 100 acid = 100 -/obj/vehicle/sealed/mecha/working/ripley/Move() +/obj/vehicle/sealed/mecha/ripley/Move() . = ..() update_pressure() -/obj/vehicle/sealed/mecha/working/ripley/generate_actions() //isnt allowed to have internal air - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_eject) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_lights) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_view_stats) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_safeties) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/strafe) - -/obj/vehicle/sealed/mecha/working/ripley/Initialize(mapload) +/obj/vehicle/sealed/mecha/ripley/Initialize(mapload) . = ..() AddComponent(/datum/component/armor_plate, 3, /obj/item/stack/sheet/animalhide/goliath_hide, /datum/armor/armor_plate_ripley_goliath) @@ -72,14 +66,14 @@ bullet = 5 laser = 5 -/obj/vehicle/sealed/mecha/working/ripley/Destroy() +/obj/vehicle/sealed/mecha/ripley/Destroy() for(var/atom/movable/A in cargo) A.forceMove(drop_location()) step_rand(A) QDEL_LIST(cargo) return ..() -/obj/vehicle/sealed/mecha/working/ripley/mk2 +/obj/vehicle/sealed/mecha/ripley/mk2 desc = "Autonomous Power Loader Unit MK-II. This prototype Ripley is refitted with a pressurized cabin, trading its prior speed for atmospheric protection and armor." name = "\improper APLU MK-II \"Ripley\"" icon_state = "ripleymkii" @@ -89,14 +83,14 @@ movedelay = 4 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_type = /datum/armor/ripley_mk2 + possible_int_damage = MECHA_INT_FIRE|MECHA_INT_TEMP_CONTROL|MECHA_CABIN_AIR_BREACH|MECHA_INT_CONTROL_LOST|MECHA_INT_SHORT_CIRCUIT + armor_type = /datum/armor/mecha_ripley_mk2 wreckage = /obj/structure/mecha_wreckage/ripley/mk2 enclosed = TRUE enter_delay = 40 silicon_icon_state = null -/datum/armor/ripley_mk2 +/datum/armor/mecha_ripley_mk2 melee = 40 bullet = 30 laser = 30 @@ -105,15 +99,7 @@ fire = 100 acid = 100 -/obj/vehicle/sealed/mecha/working/ripley/mk2/generate_actions() - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_eject) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_internals) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_lights) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_safeties) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_view_stats) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/strafe) - -/obj/vehicle/sealed/mecha/working/ripley/deathripley +/obj/vehicle/sealed/mecha/ripley/deathripley desc = "OH SHIT IT'S THE DEATHSQUAD WE'RE ALL GONNA DIE" name = "\improper DEATH-RIPLEY" icon_state = "deathripley" @@ -135,7 +121,7 @@ MECHA_ARMOR = list(), ) -/obj/vehicle/sealed/mecha/working/ripley/deathripley/real +/obj/vehicle/sealed/mecha/ripley/deathripley/real desc = "OH SHIT IT'S THE DEATHSQUAD WE'RE ALL GONNA DIE. FOR REAL" equip_by_category = list( MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill, @@ -145,16 +131,13 @@ MECHA_ARMOR = list(), ) -/obj/vehicle/sealed/mecha/working/ripley/mining +/obj/vehicle/sealed/mecha/ripley/mining desc = "An old, dusty mining Ripley." name = "\improper APLU \"Miner\"" -/obj/vehicle/sealed/mecha/working/ripley/mining/Initialize(mapload) - . = ..() - take_damage(125) // Low starting health - -/obj/vehicle/sealed/mecha/working/ripley/mining/Initialize(mapload) +/obj/vehicle/sealed/mecha/ripley/mining/Initialize(mapload) . = ..() + take_damage(125) if(cell) cell.charge = FLOOR(cell.charge * 0.25, 1) //Starts at very low charge if(prob(70)) //Maybe add a drill @@ -175,16 +158,16 @@ var/obj/item/mecha_parts/mecha_equipment/mining_scanner/scanner = new scanner.attach(src) -GLOBAL_DATUM(cargo_ripley, /obj/vehicle/sealed/mecha/working/ripley/cargo) +GLOBAL_DATUM(cargo_ripley, /obj/vehicle/sealed/mecha/ripley/cargo) -/obj/vehicle/sealed/mecha/working/ripley/cargo +/obj/vehicle/sealed/mecha/ripley/cargo desc = "An ailing, old, repurposed cargo hauler. Most of its equipment wires are frayed or missing and its frame is rusted." name = "\improper APLU \"Big Bess\"" icon_state = "hauler" base_icon_state = "hauler" max_integrity = 100 //Has half the health of a normal RIPLEY mech, so it's harder to use as a weapon. -/obj/vehicle/sealed/mecha/working/ripley/cargo/Initialize(mapload) +/obj/vehicle/sealed/mecha/ripley/cargo/Initialize(mapload) . = ..() if(cell) cell.charge = FLOOR(cell.charge * 0.25, 1) //Starts at very low charge @@ -197,18 +180,25 @@ GLOBAL_DATUM(cargo_ripley, /obj/vehicle/sealed/mecha/working/ripley/cargo) if(!GLOB.cargo_ripley && mapload) GLOB.cargo_ripley = src -/obj/vehicle/sealed/mecha/working/ripley/cargo/Destroy() +/obj/vehicle/sealed/mecha/ripley/cargo/Destroy() if(GLOB.cargo_ripley == src) GLOB.cargo_ripley = null return ..() -/obj/vehicle/sealed/mecha/working/ripley/Exit(atom/movable/leaving, direction) +/obj/vehicle/sealed/mecha/ripley/cargo/populate_parts() + cell = new /obj/item/stock_parts/cell/high(src) + //No scanmod for Big Bess + capacitor = new /obj/item/stock_parts/capacitor(src) + servo = new /obj/item/stock_parts/servo(src) + update_part_values() + +/obj/vehicle/sealed/mecha/ripley/Exit(atom/movable/leaving, direction) if(leaving in cargo) return FALSE return ..() -/obj/vehicle/sealed/mecha/working/ripley/contents_explosion(severity, target) +/obj/vehicle/sealed/mecha/ripley/contents_explosion(severity, target) for(var/i in cargo) var/obj/cargoobj = i if(prob(10 * severity)) @@ -218,12 +208,18 @@ GLOBAL_DATUM(cargo_ripley, /obj/vehicle/sealed/mecha/working/ripley/cargo) /obj/item/mecha_parts/mecha_equipment/ejector name = "Cargo compartment" + desc = "Holds cargo loaded with a hydraulic clamp." + icon_state = "mecha_bin" equipment_slot = MECHA_UTILITY detachable = FALSE /obj/item/mecha_parts/mecha_equipment/ejector/get_snowflake_data() - var/list/data = list("snowflake_id" = MECHA_SNOWFLAKE_ID_EJECTOR, "cargo" = list()) - var/obj/vehicle/sealed/mecha/working/ripley/miner = chassis + var/obj/vehicle/sealed/mecha/ripley/miner = chassis + var/list/data = list( + "snowflake_id" = MECHA_SNOWFLAKE_ID_EJECTOR, + "cargo_capacity" = miner.cargo_capacity, + "cargo" = list() + ) for(var/obj/crate in miner.cargo) data["cargo"] += list(list( "name" = crate.name, @@ -236,20 +232,20 @@ GLOBAL_DATUM(cargo_ripley, /obj/vehicle/sealed/mecha/working/ripley/cargo) if(.) return TRUE if(action == "eject") - var/obj/vehicle/sealed/mecha/working/ripley/miner = chassis + var/obj/vehicle/sealed/mecha/ripley/miner = chassis var/obj/crate = locate(params["cargoref"]) in miner.cargo if(!crate) return FALSE to_chat(miner.occupants, "[icon2html(src, miner.occupants)][span_notice("You unload [crate].")]") crate.forceMove(drop_location()) LAZYREMOVE(miner.cargo, crate) - if(crate == miner.box) - miner.box = null + if(crate == miner.ore_box) + miner.ore_box = null + playsound(chassis, 'sound/weapons/tap.ogg', 50, TRUE) log_message("Unloaded [crate]. Cargo compartment capacity: [miner.cargo_capacity - LAZYLEN(miner.cargo)]", LOG_MECHA) return TRUE - -/obj/vehicle/sealed/mecha/working/ripley/relay_container_resist_act(mob/living/user, obj/O) +/obj/vehicle/sealed/mecha/ripley/relay_container_resist_act(mob/living/user, obj/O) to_chat(user, span_notice("You lean on the back of [O] and start pushing so it falls out of [src].")) if(do_after(user, 300, target = O)) if(!user || user.stat != CONSCIOUS || user.loc != src || O.loc != src ) @@ -266,7 +262,7 @@ GLOBAL_DATUM(cargo_ripley, /obj/vehicle/sealed/mecha/working/ripley/cargo) * * 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. */ -/obj/vehicle/sealed/mecha/working/ripley/proc/update_pressure() +/obj/vehicle/sealed/mecha/ripley/proc/update_pressure() var/turf/T = get_turf(loc) if(lavaland_equipment_pressure_check(T)) diff --git a/code/modules/vehicles/mecha/working/working.dm b/code/modules/vehicles/mecha/working/working.dm deleted file mode 100644 index 3138fc0121c9b..0000000000000 --- a/code/modules/vehicles/mecha/working/working.dm +++ /dev/null @@ -1,27 +0,0 @@ -/obj/vehicle/sealed/mecha/working - allow_diagonal_movement = TRUE - /// Handles an internal ore box for working mechs - var/obj/structure/ore_box/box - -/obj/vehicle/sealed/mecha/working/Destroy() - QDEL_NULL(box) - return ..() - -/obj/vehicle/sealed/mecha/working/Move() - . = ..() - if(.) - collect_ore() - -/** - * Handles collecting ore. - * - * Checks for a hydraulic clamp or ore box manager and if it finds an ore box inside them puts ore in the ore box. - */ -/obj/vehicle/sealed/mecha/working/proc/collect_ore() - if(!box) - return - if(!(locate(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) in flat_equipment) && !(locate(/obj/item/mecha_parts/mecha_equipment/orebox_manager) in equip_by_category[MECHA_UTILITY])) - return - for(var/obj/item/stack/ore/ore in range(1, src)) - if(ore.Adjacent(src) && ((get_dir(src, ore) & dir) || ore.loc == loc)) //we can reach it and it's in front of us? grab it! - ore.forceMove(box) diff --git a/code/modules/vehicles/motorized_wheelchair.dm b/code/modules/vehicles/motorized_wheelchair.dm index 21b3ec1b51c4e..5b0f02c7ae8d1 100644 --- a/code/modules/vehicles/motorized_wheelchair.dm +++ b/code/modules/vehicles/motorized_wheelchair.dm @@ -185,8 +185,15 @@ visible_message(span_danger("[src] crashes into [A], sending [disabled] flying!")) playsound(src, 'sound/effects/bang.ogg', 50, 1) -/obj/vehicle/ridden/wheelchair/motorized/emag_act(mob/user) - if((obj_flags & EMAGGED) || !panel_open) - return - to_chat(user, span_warning("A bomb appears in [src], what the fuck?")) +/obj/vehicle/ridden/wheelchair/motorized/emag_act(mob/user, obj/item/card/emag/emag_card) + if (obj_flags & EMAGGED) + return FALSE + + if (panel_open) + balloon_alert(user, "open maintenance panel!") + return FALSE + + balloon_alert(user, "bomb implanted...?") + visible_message(span_warning("A bomb appears in [src], what the fuck?")) obj_flags |= EMAGGED + return TRUE diff --git a/code/modules/vehicles/pimpin_ride.dm b/code/modules/vehicles/pimpin_ride.dm index c074626cbd21b..39b78b99f62a6 100644 --- a/code/modules/vehicles/pimpin_ride.dm +++ b/code/modules/vehicles/pimpin_ride.dm @@ -126,7 +126,7 @@ /obj/item/janicart_upgrade name = "base upgrade" desc = "An abstract upgrade for mobile janicarts." - icon = 'icons/obj/janicart_upgrade.dmi' + icon = 'icons/obj/service/janicart_upgrade.dmi' icon_state = "janicart_upgrade" greyscale_config = /datum/greyscale_config/janicart_upgrade /// The greyscale config for the on-cart installed upgrade overlay diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm index 760420a6c1f64..4e1f115e55ce2 100644 --- a/code/modules/vehicles/scooter.dm +++ b/code/modules/vehicles/scooter.dm @@ -115,7 +115,7 @@ grinding_mulitipler = 2 victim.Knockdown(4 * grinding_mulitipler SECONDS) else - var/backdir = turn(dir, 180) + var/backdir = REVERSE_DIR(dir) step(src, backdir) rider.spin(4, 1) diff --git a/code/modules/vehicles/sealed.dm b/code/modules/vehicles/sealed.dm index 8f6ac5130c985..dc49f6b5dbe55 100644 --- a/code/modules/vehicles/sealed.dm +++ b/code/modules/vehicles/sealed.dm @@ -46,11 +46,17 @@ REMOVE_TRAIT(M, TRAIT_HANDS_BLOCKED, VEHICLE_TRAIT) -/obj/vehicle/sealed/proc/mob_try_enter(mob/M) - if(!istype(M)) +/obj/vehicle/sealed/proc/mob_try_enter(mob/rider) + if(!istype(rider)) + return FALSE + var/enter_delay = get_enter_delay(rider) + if (enter_delay == 0) + if (enter_checks(rider)) + mob_enter(rider) + return TRUE return FALSE - if(do_after(M, get_enter_delay(M), src, timed_action_flags = IGNORE_HELD_ITEM, extra_checks = CALLBACK(src, PROC_REF(enter_checks), M))) - mob_enter(M) + if (do_after(rider, enter_delay, src, timed_action_flags = IGNORE_HELD_ITEM, extra_checks = CALLBACK(src, PROC_REF(enter_checks), rider))) + mob_enter(rider) return TRUE return FALSE diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm index 337c154d869c4..fb23739333888 100644 --- a/code/modules/vehicles/secway.dm +++ b/code/modules/vehicles/secway.dm @@ -50,7 +50,7 @@ audible_message(span_hear("You hear welding.")) var/did_the_thing while(atom_integrity < max_integrity) - if(W.use_tool(src, user, 2.5 SECONDS, volume=50, amount=1)) + if(W.use_tool(src, user, 2.5 SECONDS, volume=50)) did_the_thing = TRUE atom_integrity += min(10, (max_integrity - atom_integrity)) audible_message(span_hear("You hear welding.")) diff --git a/code/modules/vehicles/speedbike.dm b/code/modules/vehicles/speedbike.dm index 736a7c0508a46..3e375b59c2e0e 100644 --- a/code/modules/vehicles/speedbike.dm +++ b/code/modules/vehicles/speedbike.dm @@ -1,6 +1,6 @@ /obj/vehicle/ridden/speedbike name = "Speedbike" - icon = 'icons/obj/bike.dmi' + icon = 'icons/obj/toys/bike.dmi' icon_state = "speedbike_blue" layer = LYING_MOB_LAYER var/cover_iconstate = "cover_blue" @@ -18,52 +18,3 @@ /obj/vehicle/ridden/speedbike/red icon_state = "speedbike_red" cover_iconstate = "cover_red" - -//BM SPEEDWAGON - -/obj/vehicle/ridden/speedwagon - name = "BM Speedwagon" - desc = "Push it to the limit, walk along the razor's edge." - icon = 'icons/obj/car.dmi' - icon_state = "speedwagon" - layer = LYING_MOB_LAYER - max_buckled_mobs = 4 - pixel_y = -48 - pixel_x = -48 - ///Determines whether we throw all things away when ramming them or just mobs, varedit only - var/crash_all = FALSE - -/obj/vehicle/ridden/speedwagon/Initialize(mapload) - . = ..() - add_overlay(image(icon, "speedwagon_cover", ABOVE_MOB_LAYER)) - AddElement(/datum/element/ridable, /datum/component/riding/vehicle/speedwagon) - -/obj/vehicle/ridden/speedwagon/Bump(atom/A) - . = ..() - if(!A.density || !has_buckled_mobs()) - return - - if(crash_all) - if(ismovable(A)) - var/atom/movable/AM = A - AM.throw_at(get_edge_target_turf(A, dir), 4, 3) - visible_message(span_danger("[src] crashes into [A]!")) - playsound(src, 'sound/effects/bang.ogg', 50, TRUE) - if(!ishuman(A)) - return - var/mob/living/carbon/human/rammed = A - rammed.Paralyze(100) - rammed.adjustStaminaLoss(30) - rammed.apply_damage(rand(20,35), BRUTE) - if(!crash_all) - rammed.throw_at(get_edge_target_turf(A, dir), 4, 3) - visible_message(span_danger("[src] crashes into [rammed]!")) - playsound(src, 'sound/effects/bang.ogg', 50, TRUE) - -/obj/vehicle/ridden/speedwagon/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - . = ..() - if(!has_buckled_mobs()) - return - for(var/atom/A in range(2, src)) - if(!(A in buckled_mobs)) - Bump(A) diff --git a/code/modules/vehicles/vehicle_actions.dm b/code/modules/vehicles/vehicle_actions.dm index 82c2f7e5572b3..1fbf394d2700a 100644 --- a/code/modules/vehicles/vehicle_actions.dm +++ b/code/modules/vehicles/vehicle_actions.dm @@ -310,7 +310,7 @@ /datum/action/vehicle/ridden/wheelchair/bell name = "Bell Ring" desc = "Ring the bell." - button_icon = 'icons/obj/bureaucracy.dmi' + button_icon = 'icons/obj/service/bureaucracy.dmi' button_icon_state = "desk_bell" check_flags = AB_CHECK_CONSCIOUS var/bell_cooldown @@ -359,10 +359,10 @@ animate(vehicle, pixel_y = -6, time = 3) playsound(vehicle, 'sound/vehicles/skateboard_ollie.ogg', 50, TRUE) passtable_on(rider, VEHICLE_TRAIT) - vehicle.pass_flags |= PASSTABLE + passtable_on(vehicle, VEHICLE_TRAIT) rider.Move(landing_turf, vehicle_target.dir) passtable_off(rider, VEHICLE_TRAIT) - vehicle.pass_flags &= ~PASSTABLE + passtable_off(vehicle, VEHICLE_TRAIT) /datum/action/vehicle/ridden/scooter/skateboard/kickflip name = "Kickflip" diff --git a/code/modules/vehicles/vehicle_key.dm b/code/modules/vehicles/vehicle_key.dm index 005cdf54ab22d..f6e5f7c4e2882 100644 --- a/code/modules/vehicles/vehicle_key.dm +++ b/code/modules/vehicles/vehicle_key.dm @@ -41,7 +41,7 @@ switch(user.mind?.get_skill_level(/datum/skill/cleaning)) if(SKILL_LEVEL_NONE to SKILL_LEVEL_NOVICE) //Their mind is too weak to ascend as a janny user.visible_message(span_suicide("[user] is putting \the [src] in [user.p_their()] mouth and is trying to become one with the janicart, but has no idea where to start! It looks like [user.p_theyre()] trying to commit suicide!")) - user.gib() + user.gib(DROP_ALL_REMAINS) return MANUAL_SUICIDE if(SKILL_LEVEL_APPRENTICE to SKILL_LEVEL_JOURNEYMAN) //At least they tried user.visible_message(span_suicide("[user] is putting \the [src] in [user.p_their()] mouth and has inefficiently become one with the janicart! It looks like [user.p_theyre()] trying to commit suicide!")) @@ -76,7 +76,7 @@ /obj/item/key/lasso name = "bone lasso" - desc = "Perfect for taming all kinds of supernatural beasts! (Warning: only perfect for taming one kind of supernatural beast.)" + desc = "The perfect tool for directing a Goliath! If only it made them move any faster..." force = 12 icon_state = "lasso" inhand_icon_state = "chain" diff --git a/code/modules/vehicles/wheelchair.dm b/code/modules/vehicles/wheelchair.dm index 6ee95fd5c8f19..6dbc3c93a59c2 100644 --- a/code/modules/vehicles/wheelchair.dm +++ b/code/modules/vehicles/wheelchair.dm @@ -37,17 +37,13 @@ wheels_overlay = image(icon, overlay_icon, ABOVE_MOB_LAYER) ADD_TRAIT(src, TRAIT_NO_IMMOBILIZE, INNATE_TRAIT) AddComponent(/datum/component/simple_rotation) //Since it's technically a chair I want it to have chair properties + AddElement(/datum/element/noisy_movement, volume = 75) /obj/vehicle/ridden/wheelchair/atom_destruction(damage_flag) new /obj/item/stack/rods(drop_location(), 1) new /obj/item/stack/sheet/iron(drop_location(), 1) return ..() -/obj/vehicle/ridden/wheelchair/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = 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) . = ..() update_appearance() diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index eb6d894ebb2b6..abf07b4b603ba 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -14,6 +14,7 @@ premium = list() */ +/// Maximum amount of items in a storage bag that we're transferring items to the vendor from. #define MAX_VENDING_INPUT_AMOUNT 30 /** * # vending record datum @@ -50,7 +51,7 @@ /obj/machinery/vending name = "\improper Vendomat" desc = "A generic vending machine." - icon = 'icons/obj/vending.dmi' + icon = 'icons/obj/machines/vending.dmi' icon_state = "generic" layer = BELOW_OBJ_LAYER density = TRUE @@ -64,7 +65,7 @@ payment_department = ACCOUNT_SRV light_power = 0.7 light_range = MINIMUM_USEFUL_LIGHT_RANGE - voice_filter = "aderivative" + voice_filter = "alimiter=0.9,acompressor=threshold=0.2:ratio=20:attack=10:release=50:makeup=2,highpass=f=1000" /// Is the machine active (No sales pitches if off)! var/active = 1 @@ -74,11 +75,21 @@ var/purchase_message_cooldown ///The ref of the last mob to shop with us var/last_shopper + ///Whether the vendor is tilted or not var/tilted = FALSE + /// If tilted, this variable should always be the rotation that was applied when we were tilted. Stored for the purposes of unapplying it. + var/tilted_rotation = 0 + ///Whether this vendor can be tilted over or not var/tiltable = TRUE + ///Damage this vendor does when tilting onto an atom var/squish_damage = 75 - var/forcecrit = 0 + /// The chance, in percent, of this vendor performing a critical hit on anything it crushes via [tilt]. + var/crit_chance = 15 + /// If set to a critical define in crushing.dm, anything this vendor crushes will always be hit with that effect. + var/forcecrit = null + ///Number of glass shards the vendor creates and tries to embed into an atom it tilted onto var/num_shards = 7 + ///List of mobs stuck under the vendor var/list/pinned_mobs = list() ///Icon for the maintenance panel overlay var/panel_type = "panel1" @@ -112,7 +123,7 @@ /** * List of premium products this machine sells * - * form should be list(/type/path, /type/path2) as there is only ever one in stock + * form should be list(/type/path = amount, /type/path2 = amount2) */ var/list/premium = list() @@ -121,12 +132,14 @@ ///String of small ad messages in the vending screen - random chance var/product_ads = "" + ///List of standard product records var/list/product_records = list() + ///List of contraband product records var/list/hidden_records = list() + ///List of premium product records var/list/coin_records = list() + ///List of slogans to scream at potential customers; built upon Iniitialize() of the vendor from product_slogans var/list/slogan_list = list() - ///Small ad messages in the vending screen - random chance of popping up whenever you open it - var/list/small_ads = list() ///Message sent post vend (Thank you for shopping!) var/vend_reply ///Last world tick we sent a vent reply @@ -134,7 +147,7 @@ ///Last world tick we sent a slogan message out var/last_slogan = 0 ///How many ticks until we can send another - var/slogan_delay = 6000 + var/slogan_delay = 10 MINUTES ///Icon when vending an item to the user var/icon_vend ///Icon to flash when user is denied a vend @@ -159,20 +172,28 @@ var/default_price = 25 ///Default price of premium items if not overridden var/extra_price = 50 + ///fontawesome icon name to use in to display the user's balance in the vendor UI + var/displayed_currency_icon = "coins" + ///String of the used currency to display in the vendor UI + var/displayed_currency_name = " cr" ///Whether our age check is currently functional var/age_restrictions = TRUE /** * Is this item on station or not * * if it doesn't originate from off-station during mapload, everything is free + * if it's off-station during mapload, it's also safe from the brand intelligence event */ - var/onstation = TRUE //if it doesn't originate from off-station during mapload, everything is free - ///A variable to change on a per instance basis on the map that allows the instance to force cost and ID requirements - var/onstation_override = FALSE //change this on the object on the map to override the onstation check. DO NOT APPLY THIS GLOBALLY. + var/onstation = TRUE + /** + * A variable to change on a per instance basis on the map that allows the instance + * to ignore whether it's on the station or not. + * Useful to force cost and ID requirements. DO NOT APPLY THIS GLOBALLY. + */ + var/onstation_override = FALSE + ///Items that the players have loaded into the vendor var/list/vending_machine_input = list() - ///Display header on the input view - var/input_display_header = "Custom Vendor" //The type of refill canisters used by this machine. var/obj/item/vending_refill/refill_canister = null @@ -186,6 +207,11 @@ /// used for narcing on underages var/obj/item/radio/sec_radio +/datum/armor/machinery_vending + melee = 20 + fire = 50 + acid = 70 + /** * Initialize the vending machine * @@ -195,18 +221,13 @@ * * FALSE - if the machine was maploaded on a zlevel that doesn't pass the is_station_level check * * TRUE - all other cases */ -/datum/armor/machinery_vending - melee = 20 - fire = 50 - acid = 70 - /obj/machinery/vending/Initialize(mapload) var/build_inv = FALSE if(!refill_canister) circuit = null build_inv = TRUE . = ..() - wires = new /datum/wires/vending(src) + set_wires(new /datum/wires/vending(src)) if(SStts.tts_enabled) var/static/vendor_voice_by_type = list() @@ -224,14 +245,22 @@ last_slogan = world.time + rand(0, slogan_delay) power_change() - if(onstation_override) //overrides the checks if true. - onstation = TRUE - return if(mapload) //check if it was initially created off station during mapload. if(!is_station_level(z)) - onstation = FALSE + if(!onstation_override) + onstation = FALSE if(circuit) circuit.onstation = onstation //sync up the circuit so the pricing schema is carried over if it's reconstructed. + else if(HAS_TRAIT(SSstation, STATION_TRAIT_VENDING_SHORTAGE)) + for (var/datum/data/vending_product/product_record as anything in product_records + coin_records + hidden_records) + /** + * in average, it should be 37.5% of the max amount, rounded up to the nearest int, + * tho the max boundary can be as low/high as 50%/100% + */ + var/max_amount = rand(CEILING(product_record.amount * 0.5, 1), product_record.amount) + product_record.amount = rand(0, max_amount) + if(tiltable && prob(6)) // 1 in 17 chance to start tilted (as an additional hint to the station trait behind it) + INVOKE_ASYNC(src, PROC_REF(tilt), loc) else if(circuit && (circuit.onstation != onstation)) //check if they're not the same to minimize the amount of edited values. onstation = circuit.onstation //if it was constructed outside mapload, sync the vendor up with the circuit's var so you can't bypass price requirements by moving / reconstructing it off station. @@ -266,16 +295,15 @@ build_inventories(start_empty = TRUE) - for(var/obj/item/vending_refill/VR in component_parts) - restock(VR) + for(var/obj/item/vending_refill/installed_refill in component_parts) + restock(installed_refill) /obj/machinery/vending/deconstruct(disassembled = TRUE) - if(!refill_canister) //the non constructable vendors drop metal instead of a machine frame. - if(!(flags_1 & NODECONSTRUCT_1)) - new /obj/item/stack/sheet/iron(loc, 3) - qdel(src) - else - ..() + if(refill_canister) + return ..() + if(!(flags_1 & NODECONSTRUCT_1)) //the non constructable vendors drop metal instead of a machine frame. + new /obj/item/stack/sheet/iron(loc, 3) + qdel(src) /obj/machinery/vending/update_appearance(updates=ALL) . = ..() @@ -284,7 +312,6 @@ return set_light(powered() ? MINIMUM_USEFUL_LIGHT_RANGE : 0) - /obj/machinery/vending/update_icon_state() if(machine_stat & BROKEN) icon_state = "[initial(icon_state)]-broken" @@ -292,7 +319,6 @@ icon_state = "[initial(icon_state)][powered() ? null : "-off"]" return ..() - /obj/machinery/vending/update_overlays() . = ..() if(panel_open) @@ -309,22 +335,20 @@ var/found_anything = TRUE while (found_anything) found_anything = FALSE - for(var/record in shuffle(product_records)) - var/datum/data/vending_product/R = record - + for(var/datum/data/vending_product/record as anything in shuffle(product_records)) //first dump any of the items that have been returned, in case they contain the nuke disk or something - for(var/obj/returned_obj_to_dump in R.returned_products) - LAZYREMOVE(R.returned_products, returned_obj_to_dump) + for(var/obj/returned_obj_to_dump in record.returned_products) + LAZYREMOVE(record.returned_products, returned_obj_to_dump) returned_obj_to_dump.forceMove(get_turf(src)) step(returned_obj_to_dump, pick(GLOB.alldirs)) - R.amount-- + record.amount-- - if(R.amount <= 0) //Try to use a record that actually has something to dump. + if(record.amount <= 0) //Try to use a record that actually has something to dump. continue - var/dump_path = R.product_path + var/dump_path = record.product_path if(!dump_path) continue - R.amount-- + record.amount-- // busting open a vendor will destroy some of the contents if(found_anything && prob(80)) continue @@ -347,8 +371,11 @@ * * startempty - should we set vending_product record amount from the product list (so it's prefilled at roundstart) */ /obj/machinery/vending/proc/build_inventory(list/productlist, list/recordlist, list/categories, start_empty = FALSE) - default_price = round(initial(default_price) * SSeconomy.inflation_value()) - extra_price = round(initial(extra_price) * SSeconomy.inflation_value()) + default_price = round(initial(default_price)) + extra_price = round(initial(extra_price)) + if(HAS_TRAIT(SSeconomy, TRAIT_MARKET_CRASHING)) + default_price *= SSeconomy.inflation_value() + extra_price *= SSeconomy.inflation_value() var/list/product_to_category = list() for (var/list/category as anything in categories) @@ -362,32 +389,47 @@ amount = 0 var/obj/item/temp = typepath - var/datum/data/vending_product/R = new /datum/data/vending_product() - R.name = initial(temp.name) - R.product_path = typepath + var/datum/data/vending_product/new_record = new /datum/data/vending_product() + new_record.name = initial(temp.name) + new_record.product_path = typepath if(!start_empty) - R.amount = amount - R.max_amount = amount + new_record.amount = amount + new_record.max_amount = amount ///Prices of vending machines are all increased uniformly. - R.custom_price = round(initial(temp.custom_price) * SSeconomy.inflation_value()) - R.custom_premium_price = round(initial(temp.custom_premium_price) * SSeconomy.inflation_value()) - R.age_restricted = initial(temp.age_restricted) - R.colorable = !!(initial(temp.greyscale_config) && initial(temp.greyscale_colors) && (initial(temp.flags_1) & IS_PLAYER_COLORABLE_1)) - R.category = product_to_category[typepath] - recordlist += R - + new_record.custom_price = round(initial(temp.custom_price)) + new_record.custom_premium_price = round(initial(temp.custom_premium_price)) + if(HAS_TRAIT(SSeconomy, TRAIT_MARKET_CRASHING)) + new_record.custom_price = round(initial(temp.custom_price) * SSeconomy.inflation_value()) + new_record.custom_premium_price = round(initial(temp.custom_premium_price) * SSeconomy.inflation_value()) + new_record.age_restricted = initial(temp.age_restricted) + new_record.colorable = !!(initial(temp.greyscale_config) && initial(temp.greyscale_colors) && (initial(temp.flags_1) & IS_PLAYER_COLORABLE_1)) + new_record.category = product_to_category[typepath] + recordlist += new_record + +/**Builds all available inventories for the vendor - standard, contraband and premium + * Arguments: + * start_empty - bool to pass into build_inventory that determines whether a product entry starts with available stock or not +*/ /obj/machinery/vending/proc/build_inventories(start_empty) build_inventory(products, product_records, product_categories, start_empty) - build_inventory(contraband, hidden_records, create_categories_from(contraband, "mask", "Contraband"), start_empty) - build_inventory(premium, coin_records, create_categories_from(premium, "coins", "Premium"), start_empty) + build_inventory(contraband, hidden_records, create_categories_from("Contraband", "mask", contraband), start_empty) + build_inventory(premium, coin_records, create_categories_from("Premium", "coins", premium), start_empty) -/obj/machinery/vending/proc/create_categories_from(products, icon, name) +/** + * Returns a list of data about the category + * Arguments: + * name - string for the name of the category + * icon - string for the fontawesome icon to use in the UI for the category + * products - list of products available in the category +*/ +/obj/machinery/vending/proc/create_categories_from(name, icon, products) return list(list( "name" = name, "icon" = icon, "products" = products, )) +///Populates list of products with categorized products /obj/machinery/vending/proc/build_products_from_categories() if (isnull(product_categories)) return @@ -408,26 +450,35 @@ * * premiumlist - the list of premium product datums in the vendor to refresh their prices. */ /obj/machinery/vending/proc/reset_prices(list/recordlist, list/premiumlist) - default_price = round(initial(default_price) * SSeconomy.inflation_value()) - extra_price = round(initial(extra_price) * SSeconomy.inflation_value()) - for(var/R in recordlist) - var/datum/data/vending_product/record = R - var/obj/item/potential_product = record.product_path - record.custom_price = round(initial(potential_product.custom_price) * SSeconomy.inflation_value()) - for(var/R in premiumlist) - var/datum/data/vending_product/record = R + var/crash_status = HAS_TRAIT(SSeconomy, TRAIT_MARKET_CRASHING) + default_price = round(initial(default_price)) + extra_price = round(initial(extra_price)) + if(crash_status) + default_price *= SSeconomy.inflation_value() + extra_price *= SSeconomy.inflation_value() + + for(var/datum/data/vending_product/record as anything in recordlist) var/obj/item/potential_product = record.product_path + record.custom_price = round(initial(potential_product.custom_price)) + if(crash_status) + record.custom_price = round(initial(potential_product.custom_price) * SSeconomy.inflation_value()) + for(var/datum/data/vending_product/premium_record as anything in premiumlist) + var/obj/item/potential_product = premium_record.product_path var/premium_sanity = round(initial(potential_product.custom_premium_price)) if(premium_sanity) - record.custom_premium_price = round(premium_sanity * SSeconomy.inflation_value()) + premium_record.custom_premium_price = round(premium_sanity) + if(crash_status) + premium_record.custom_premium_price = round(premium_sanity * SSeconomy.inflation_value()) continue //For some ungodly reason, some premium only items only have a custom_price - record.custom_premium_price = round(extra_price + (initial(potential_product.custom_price) * (SSeconomy.inflation_value() - 1))) + premium_record.custom_premium_price = round(extra_price + (initial(potential_product.custom_price))) + if(crash_status) + premium_record.custom_premium_price = round(extra_price + (initial(potential_product.custom_price) * (SSeconomy.inflation_value() - 1))) /** * Refill a vending machine from a refill canister * - * This takes the products from the refill canister and then fills the products,contraband and premium product categories + * This takes the products from the refill canister and then fills the products, contraband and premium product categories * * Arguments: * * canister - the vending canister we are refilling from @@ -470,8 +521,7 @@ */ /obj/machinery/vending/proc/refill_inventory(list/productlist, list/recordlist) . = 0 - for(var/R in recordlist) - var/datum/data/vending_product/record = R + for(var/datum/data/vending_product/record as anything in recordlist) var/diff = min(record.max_amount - record.amount, productlist[record.product_path]) if (diff) productlist[record.product_path] -= diff @@ -479,7 +529,7 @@ . += diff /** - * Set up a refill canister that matches this machines products + * Set up a refill canister that matches this machine's products * * This is used when the machine is deconstructed, so the items aren't "lost" */ @@ -487,25 +537,34 @@ if (!component_parts) return - var/obj/item/vending_refill/R = locate() in component_parts - if (!R) + var/obj/item/vending_refill/installed_refill = locate() in component_parts + if (!installed_refill) CRASH("Constructible vending machine did not have a refill canister") - unbuild_inventory_into(product_records, R.products, R.product_categories) + unbuild_inventory_into(product_records, installed_refill.products, installed_refill.product_categories) - R.contraband = unbuild_inventory(hidden_records) - R.premium = unbuild_inventory(coin_records) + installed_refill.contraband = unbuild_inventory(hidden_records) + installed_refill.premium = unbuild_inventory(coin_records) /** - * Given a record list, go through and and return a list of type -> amount + * Given a record list, go through and return a list of products in format of type -> amount + * Arguments: + * recordlist - list of records to unbuild products from */ /obj/machinery/vending/proc/unbuild_inventory(list/recordlist) . = list() - for(var/R in recordlist) - var/datum/data/vending_product/record = R + for(var/datum/data/vending_product/record as anything in recordlist) .[record.product_path] += record.amount -/// Put stuff in product_categories if the products have a category, otherwise put them in products +/** + * Unbuild product_records into categorized product lists to the machine's refill canister. + * Does not handle contraband/premium products, only standard stock and any other categories used by the vendor(see: ClothesMate). + * If a product has no category, puts it into standard stock category. + * Arguments: + * product_records - list of products of the vendor + * products - list of products of the refill canister + * product_categories - list of product categories of the refill canister +*/ /obj/machinery/vending/proc/unbuild_inventory_into(list/product_records, list/products, list/product_categories) products?.Cut() product_categories?.Cut() @@ -517,7 +576,7 @@ for (var/datum/data/vending_product/record as anything in product_records) var/list/category = record.category var/has_category = !isnull(category) - + //check if there're any uncategorized products if (isnull(others_have_category)) others_have_category = has_category else if (others_have_category != has_category) @@ -531,11 +590,11 @@ if (has_category) var/index = categories_to_index.Find(category) - if (index) + if (index) //if we've already established a category, add the product there var/list/category_in_list = product_categories[index] var/list/products_in_category = category_in_list["products"] products_in_category[record.product_path] += record.amount - else + else //create a category that the product is supposed to have and put it there categories_to_index += list(category) index = categories_to_index.len @@ -546,13 +605,13 @@ category_clone["products"] = initial_product_list product_categories += list(category_clone) - else + else //no category found - dump it into standard stock products[record.product_path] = record.amount -/obj/machinery/vending/crowbar_act(mob/living/user, obj/item/I) +/obj/machinery/vending/crowbar_act(mob/living/user, obj/item/attack_item) if(!component_parts) return FALSE - default_deconstruction_crowbar(I) + default_deconstruction_crowbar(attack_item) return TRUE /obj/machinery/vending/wrench_act(mob/living/user, obj/item/tool) @@ -564,29 +623,29 @@ return TOOL_ACT_TOOLTYPE_SUCCESS return FALSE -/obj/machinery/vending/screwdriver_act(mob/living/user, obj/item/I) +/obj/machinery/vending/screwdriver_act(mob/living/user, obj/item/attack_item) if(..()) return TRUE if(anchored) - default_deconstruction_screwdriver(user, icon_state, icon_state, I) + default_deconstruction_screwdriver(user, icon_state, icon_state, attack_item) update_appearance() else to_chat(user, span_warning("You must first secure [src].")) return TRUE -/obj/machinery/vending/attackby(obj/item/I, mob/living/user, params) - if(panel_open && is_wire_tool(I)) +/obj/machinery/vending/attackby(obj/item/attack_item, mob/living/user, params) + if(panel_open && is_wire_tool(attack_item)) wires.interact(user) return - if(refill_canister && istype(I, refill_canister)) + if(refill_canister && istype(attack_item, refill_canister)) if (!panel_open) to_chat(user, span_warning("You should probably unscrew the service panel first!")) else if (machine_stat & (BROKEN|NOPOWER)) to_chat(user, span_notice("[src] does not respond.")) else //if the panel is open we attempt to refill the machine - var/obj/item/vending_refill/canister = I + var/obj/item/vending_refill/canister = attack_item if(canister.get_part_rating() == 0) to_chat(user, span_warning("[canister] is empty!")) else @@ -597,20 +656,21 @@ else to_chat(user, span_warning("There's nothing to restock!")) return + if(compartmentLoadAccessCheck(user) && !user.combat_mode) - if(canLoadItem(I)) - loadingAttempt(I,user) + if(canLoadItem(attack_item)) + loadingAttempt(attack_item, user) - if(istype(I, /obj/item/storage/bag)) //trays USUALLY - var/obj/item/storage/T = I + if(istype(attack_item, /obj/item/storage/bag)) //trays USUALLY + var/obj/item/storage/storage_item = attack_item var/loaded = 0 var/denied_items = 0 - for(var/obj/item/the_item in T.contents) + for(var/obj/item/the_item in storage_item.contents) if(contents.len >= MAX_VENDING_INPUT_AMOUNT) // no more than 30 item can fit inside, legacy from snack vending although not sure why it exists to_chat(user, span_warning("[src]'s compartment is full.")) break - if(canLoadItem(the_item) && loadingAttempt(the_item,user)) - T.atom_storage?.attempt_remove(the_item, src) + if(canLoadItem(the_item) && loadingAttempt(the_item, user)) + storage_item.atom_storage?.attempt_remove(the_item, src) loaded++ else denied_items++ @@ -620,7 +680,7 @@ to_chat(user, span_notice("You insert [loaded] dishes into [src]'s compartment.")) else . = ..() - if(tiltable && !tilted && I.force) + if(tiltable && !tilted && attack_item.force) if(isclosedturf(get_turf(user))) //If the attacker is inside of a wall, immediately fall in the other direction, with no chance for goodies. var/opposite_direction = REVERSE_DIR(get_dir(src, user)) var/target = get_step(src, opposite_direction) @@ -628,152 +688,325 @@ return switch(rand(1, 100)) if(1 to 5) - freebie(user, 3) + freebie(3) if(6 to 15) - freebie(user, 2) + freebie(2) if(16 to 25) - freebie(user, 1) + freebie(1) if(26 to 75) return - if(76 to 90) + if(76 to 100) tilt(user) - if(91 to 100) - tilt(user, crit=TRUE) -/obj/machinery/vending/proc/freebie(mob/fatty, freebies) +/** + * Dispenses free items from the standard stock. + * Arguments: + * freebies - number of free items to vend + */ +/obj/machinery/vending/proc/freebie(freebies) visible_message(span_notice("[src] yields [freebies > 1 ? "several free goodies" : "a free goody"]!")) for(var/i in 1 to freebies) playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = -3) - for(var/datum/data/vending_product/R in shuffle(product_records)) + for(var/datum/data/vending_product/record in shuffle(product_records)) - if(R.amount <= 0) //Try to use a record that actually has something to dump. + if(record.amount <= 0) //Try to use a record that actually has something to dump. continue - var/dump_path = R.product_path + var/dump_path = record.product_path if(!dump_path) continue - if(R.amount > LAZYLEN(R.returned_products)) //always give out new stuff that costs before free returned stuff, because of the risk getting gibbed involved + if(record.amount > LAZYLEN(record.returned_products)) //always give out new stuff that costs before free returned stuff, because of the risk getting gibbed involved new dump_path(get_turf(src)) else - var/obj/returned_obj_to_dump = LAZYACCESS(R.returned_products, LAZYLEN(R.returned_products)) //first in, last out - LAZYREMOVE(R.returned_products, returned_obj_to_dump) + var/obj/returned_obj_to_dump = LAZYACCESS(record.returned_products, LAZYLEN(record.returned_products)) //first in, last out + LAZYREMOVE(record.returned_products, returned_obj_to_dump) returned_obj_to_dump.forceMove(get_turf(src)) - R.amount-- + record.amount-- break -///Tilts ontop of the atom supplied, if crit is true some extra shit can happen. Returns TRUE if it dealt damage to something. -/obj/machinery/vending/proc/tilt(atom/fatty, crit=FALSE) +/** + * Tilts ontop of the atom supplied, if crit is true some extra shit can happen. See [fall_and_crush] for return values. + * Arguments: + * fatty - atom to tilt the vendor onto + * local_crit_chance - percent chance of a critical hit + * forced_crit - specific critical hit case to use, if any +*/ +/obj/machinery/vending/proc/tilt(atom/fatty, local_crit_chance = crit_chance, forced_crit = forcecrit) if(QDELETED(src) || !has_gravity(src)) return - visible_message(span_danger("[src] tips over!")) - tilted = TRUE - layer = ABOVE_MOB_LAYER - SET_PLANE_IMPLICIT(src, GAME_PLANE_UPPER) - var/crit_case - if(crit) - crit_case = rand(1,6) + . = NONE - if(forcecrit) - crit_case = forcecrit + var/picked_rotation = pick(90, 270) + if(Adjacent(fatty)) + . = fall_and_crush(get_turf(fatty), squish_damage, local_crit_chance, forced_crit, 6 SECONDS, rotation = picked_rotation) - . = FALSE + if (. & SUCCESSFULLY_FELL_OVER) + visible_message(span_danger("[src] tips over!")) + tilted = TRUE + tilted_rotation = picked_rotation + layer = ABOVE_MOB_LAYER + SET_PLANE_IMPLICIT(src, GAME_PLANE_UPPER) - if(Adjacent(fatty)) - 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) - - - if(istype(C)) - var/crit_rebate = 0 // lessen the normal damage we deal for some of the crits - - if(crit_case < 5) // the body/head asplode case has its own description - C.visible_message(span_danger("[C] is crushed by [src]!"), \ - span_userdanger("You are crushed by [src]!")) - - switch(crit_case) // only carbons can have the fun crits - if(1) // shatter their legs and bleed 'em - crit_rebate = 60 - C.bleed(150) - var/obj/item/bodypart/leg/left/l = C.get_bodypart(BODY_ZONE_L_LEG) - if(l) - l.receive_damage(brute=200) - var/obj/item/bodypart/leg/right/r = C.get_bodypart(BODY_ZONE_R_LEG) - if(r) - r.receive_damage(brute=200) - if(l || r) - C.visible_message(span_danger("[C]'s legs shatter with a sickening crunch!"), \ - span_userdanger("Your legs shatter with a sickening crunch!")) - if(2) // pin them beneath the machine until someone untilts it - forceMove(get_turf(C)) - buckle_mob(C, force=TRUE) - C.visible_message(span_danger("[C] is pinned underneath [src]!"), \ - span_userdanger("You are pinned down by [src]!")) - if(3) // glass candy - crit_rebate = 50 - for(var/i in 1 to num_shards) - var/obj/item/shard/shard = new /obj/item/shard(get_turf(C)) - shard.embedding = list(embed_chance = 100, ignore_throwspeed_threshold = TRUE, impact_pain_mult=1, pain_chance=5) - shard.updateEmbedding() - C.hitby(shard, skipcatch = TRUE, hitpush = FALSE) - shard.embedding = list() - shard.updateEmbedding() - if(4) // paralyze this binch - // the new paraplegic gets like 4 lines of losing their legs so skip them - visible_message(span_danger("[C]'s spinal cord is obliterated with a sickening crunch!"), ignored_mobs = list(C)) - C.gain_trauma(/datum/brain_trauma/severe/paralysis/paraplegic) - if(5) // limb squish! - for(var/i in C.bodyparts) - var/obj/item/bodypart/squish_part = i - if(IS_ORGANIC_LIMB(squish_part)) - var/type_wound = pick(list(/datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/moderate)) - squish_part.force_wound_upwards(type_wound, wound_source = "crushing by vending machine") - else - squish_part.receive_damage(brute=30) - C.visible_message(span_danger("[C]'s body is maimed underneath the mass of [src]!"), \ - span_userdanger("Your body is maimed underneath the mass of [src]!")) - if(6) // skull squish! - var/obj/item/bodypart/head/O = C.get_bodypart(BODY_ZONE_HEAD) - if(O) - if(O.dismember()) - C.visible_message(span_danger("[O] explodes in a shower of gore beneath [src]!"), \ - span_userdanger("Oh f-")) - O.drop_organs() - qdel(O) - new /obj/effect/gibspawner/human/bodypartless(get_turf(C)) - - if(prob(30)) - C.apply_damage(max(0, squish_damage - crit_rebate), forced=TRUE, spread_damage=TRUE) // the 30% chance to spread the damage means you escape breaking any bones + if(get_turf(fatty) != get_turf(src)) + throw_at(get_turf(fatty), 1, 1, spin = FALSE, quickstart = FALSE) + +/** + * Causes src to fall onto [target], crushing everything on it (including itself) with [damage] + * and a small chance to do a spectacular effect per entity (if a chance above 0 is provided). + * + * Args: + * * turf/target: The turf to fall onto. Cannot be null. + * * damage: The raw numerical damage to do by default. + * * chance_to_crit: The percent chance of a critical hit occuring. Default: 0 + * * forced_crit_case: If given a value from crushing.dm, [target] and it's contents will always be hit with that specific critical hit. Default: null + * * paralyze_time: The time, in deciseconds, a given mob/living will be paralyzed for if crushed. + * * crush_dir: The direction the crush is coming from. Default: dir of src to [target]. + * * damage_type: The type of damage to do. Default: BRUTE + * * damage_flag: The attack flag for armor purposes. Default: MELEE + * * rotation: The angle of which to rotate src's transform by on a successful tilt. Default: 90. + * + * Returns: A collection of bitflags defined in crushing.dm. Read that file's documentation for info. + */ +/atom/movable/proc/fall_and_crush(turf/target, damage, chance_to_crit = 0, forced_crit_case = null, paralyze_time, crush_dir = get_dir(get_turf(src), target), damage_type = BRUTE, damage_flag = MELEE, rotation = 90) + + ASSERT(!isnull(target)) + + var/flags_to_return = NONE + + if (!target.is_blocked_turf(TRUE, src, list(src))) + for(var/atom/atom_target in (target.contents) + target) + if (isarea(atom_target)) + continue + + if (SEND_SIGNAL(atom_target, COMSIG_PRE_TILT_AND_CRUSH, src) & COMPONENT_IMMUNE_TO_TILT_AND_CRUSH) + continue + + var/crit_case = forced_crit_case + if (isnull(crit_case) && chance_to_crit > 0) + if (prob(chance_to_crit)) + crit_case = pick_weight(get_crit_crush_chances()) + var/crit_rebate_mult = 1 // lessen the normal damage we deal for some of the crits + + if (!isnull(crit_case)) + crit_rebate_mult = fall_and_crush_crit_rebate_table(crit_case) + apply_crit_crush(crit_case, atom_target) + + var/adjusted_damage = damage * crit_rebate_mult + var/crushed + if (isliving(atom_target)) + crushed = TRUE + var/mob/living/carbon/living_target = atom_target + var/was_alive = (living_target.stat != DEAD) + var/blocked = living_target.run_armor_check(attack_flag = damage_flag) + if (iscarbon(living_target)) + var/mob/living/carbon/carbon_target = living_target + if(prob(30)) + carbon_target.apply_damage(max(0, adjusted_damage), damage_type, blocked = blocked, forced = TRUE, spread_damage = TRUE, attack_direction = crush_dir) // the 30% chance to spread the damage means you escape breaking any bones + else + var/brute = (damage_type == BRUTE ? damage : 0) * 0.5 + var/burn = (damage_type == BURN ? damage : 0) * 0.5 + carbon_target.take_bodypart_damage(brute, burn, check_armor = TRUE, wound_bonus = 5) // otherwise, deal it to 2 random limbs (or the same one) which will likely shatter something + carbon_target.take_bodypart_damage(brute, burn, check_armor = TRUE, wound_bonus = 5) + carbon_target.AddElement(/datum/element/squish, 80 SECONDS) else - C.take_bodypart_damage((squish_damage - crit_rebate)*0.5, wound_bonus = 5) // otherwise, deal it to 2 random limbs (or the same one) which will likely shatter something - C.take_bodypart_damage((squish_damage - crit_rebate)*0.5, wound_bonus = 5) - C.AddElement(/datum/element/squish, 80 SECONDS) - else - L.visible_message(span_danger("[L] is crushed by [src]!"), \ - span_userdanger("You are crushed by [src]!")) - 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") - . = TRUE - playsound(L, 'sound/effects/blobattack.ogg', 40, TRUE) - playsound(L, 'sound/effects/splat.ogg', 50, TRUE) - add_memory_in_range(L, 7, /datum/memory/witness_vendor_crush, protagonist = L, antagonist = src) - - var/matrix/M = matrix() - M.Turn(pick(90, 270)) - transform = M + living_target.apply_damage(adjusted_damage, damage_type, blocked = blocked, forced = TRUE, attack_direction = crush_dir) + + living_target.Paralyze(paralyze_time) + living_target.emote("scream") + playsound(living_target, 'sound/effects/blobattack.ogg', 40, TRUE) + playsound(living_target, 'sound/effects/splat.ogg', 50, TRUE) + post_crush_living(living_target, was_alive) + flags_to_return |= (SUCCESSFULLY_CRUSHED_MOB|SUCCESSFULLY_CRUSHED_ATOM) + + else if (atom_target.uses_integrity && !(atom_target.invisibility > SEE_INVISIBLE_LIVING) && !(is_type_in_typecache(atom_target, GLOB.WALLITEMS_INTERIOR) || is_type_in_typecache(atom_target, GLOB.WALLITEMS_EXTERIOR))) + atom_target.take_damage(adjusted_damage, damage_type, damage_flag, FALSE, crush_dir) + crushed = TRUE + flags_to_return |= SUCCESSFULLY_CRUSHED_ATOM + + if (crushed) + atom_target.visible_message(span_danger("[atom_target] is crushed by [src]!"), span_userdanger("You are crushed by [src]!")) + SEND_SIGNAL(atom_target, COMSIG_POST_TILT_AND_CRUSH, src) + + var/matrix/to_turn = turn(transform, rotation) + animate(src, transform = to_turn, 0.2 SECONDS) + playsound(src, 'sound/effects/bang.ogg', 40) + + visible_message(span_danger("[src] tips over, slamming hard onto [target]!")) + flags_to_return |= SUCCESSFULLY_FELL_OVER + post_tilt() + else + visible_message(span_danger("[src] rebounds comically as it fails to slam onto [target]!")) - if(get_turf(fatty) != get_turf(src)) - throw_at(get_turf(fatty), 1, 1, spin=FALSE, quickstart=FALSE) + Move(target, crush_dir) // we still TRY to move onto it for shit like teleporters + return flags_to_return + +/** + * Exists for the purposes of custom behavior. + * Called directly after [crushed] is crushed. + * + * Args: + * * mob/living/crushed: The mob that was crushed. + * * was_alive: Boolean. True if the mob was alive before the crushing. + */ +/atom/movable/proc/post_crush_living(mob/living/crushed, was_alive) + return + +/** + * Exists for the purposes of custom behavior. + * Called directly after src actually rotates and falls over. + */ +/atom/movable/proc/post_tilt() + return + +/obj/machinery/vending/post_crush_living(mob/living/crushed, was_alive) + + if(was_alive && crushed.stat == DEAD && crushed.client) + crushed.client.give_award(/datum/award/achievement/misc/vendor_squish, crushed) // good job losing a fight with an inanimate object idiot + + add_memory_in_range(crushed, 7, /datum/memory/witness_vendor_crush, protagonist = crushed, antagonist = src) + + return ..() + +/** + * Allows damage to be reduced on certain crit cases. + * Args: + * * crit_case: The critical case chosen. + */ +/atom/movable/proc/fall_and_crush_crit_rebate_table(crit_case) + ASSERT(!isnull(crit_case)) + + switch(crit_case) + if (CRUSH_CRIT_SHATTER_LEGS) + return 0.2 + else + return 1 + +/obj/machinery/vending/fall_and_crush_crit_rebate_table(crit_case) + + if (crit_case == VENDOR_CRUSH_CRIT_GLASSCANDY) + return 0.33 + + return ..() + +/** + * Returns a assoc list of (critcase -> num), where critcase is a critical define in crushing.dm and num is a weight. + * Use with pickweight to acquire a random critcase. + */ +/atom/movable/proc/get_crit_crush_chances() + RETURN_TYPE(/list) + + var/list/weighted_crits = list() + + weighted_crits[CRUSH_CRIT_SHATTER_LEGS] = 100 + weighted_crits[CRUSH_CRIT_PARAPALEGIC] = 80 + weighted_crits[CRUSH_CRIT_HEADGIB] = 20 + weighted_crits[CRUSH_CRIT_SQUISH_LIMB] = 100 + + return weighted_crits + +/obj/machinery/vending/get_crit_crush_chances() + var/list/weighted_crits = ..() + + weighted_crits[VENDOR_CRUSH_CRIT_GLASSCANDY] = 100 + weighted_crits[VENDOR_CRUSH_CRIT_PIN] = 100 + + return weighted_crits + +/** + * Should be where critcase effects are actually implemented. Use this to apply critcases. + * Args: + * * crit_case: The chosen critcase, defined in crushing.dm. + * * atom/atom_target: The target to apply the critical hit to. Cannot be null. Can be anything except /area. + * + * Returns: + * TRUE if a crit case is successfully applied, FALSE otherwise. + */ +/atom/movable/proc/apply_crit_crush(crit_case, atom/atom_target) + switch (crit_case) + if(CRUSH_CRIT_SHATTER_LEGS) // shatter their legs and bleed 'em + if (!iscarbon(atom_target)) + return FALSE + var/mob/living/carbon/carbon_target = atom_target + carbon_target.bleed(150) + var/obj/item/bodypart/leg/left/left_leg = carbon_target.get_bodypart(BODY_ZONE_L_LEG) + if(left_leg) + left_leg.receive_damage(brute = 200) + var/obj/item/bodypart/leg/right/right_leg = carbon_target.get_bodypart(BODY_ZONE_R_LEG) + if(right_leg) + right_leg.receive_damage(brute = 200) + if(left_leg || right_leg) + carbon_target.visible_message(span_danger("[carbon_target]'s legs shatter with a sickening crunch!"), span_userdanger("Your legs shatter with a sickening crunch!")) + return TRUE + if(CRUSH_CRIT_PARAPALEGIC) // paralyze this binch + // the new paraplegic gets like 4 lines of losing their legs so skip them + if (!iscarbon(atom_target)) + return FALSE + var/mob/living/carbon/carbon_target = atom_target + visible_message(span_danger("[carbon_target]'s spinal cord is obliterated with a sickening crunch!"), ignored_mobs = list(carbon_target)) + carbon_target.gain_trauma(/datum/brain_trauma/severe/paralysis/paraplegic) + return TRUE + if(CRUSH_CRIT_SQUISH_LIMB) // limb squish! + if (!iscarbon(atom_target)) + return FALSE + var/mob/living/carbon/carbon_target = atom_target + for(var/obj/item/bodypart/squish_part in carbon_target.bodyparts) + var/severity = pick(WOUND_SEVERITY_MODERATE, WOUND_SEVERITY_SEVERE, WOUND_SEVERITY_CRITICAL) + if (!carbon_target.cause_wound_of_type_and_severity(WOUND_BLUNT, squish_part, severity, wound_source = "crushed by [src]")) + squish_part.receive_damage(brute = 30) + carbon_target.visible_message(span_danger("[carbon_target]'s body is maimed underneath the mass of [src]!"), span_userdanger("Your body is maimed underneath the mass of [src]!")) + return TRUE + if(CRUSH_CRIT_HEADGIB) // skull squish! + if (!iscarbon(atom_target)) + return FALSE + var/mob/living/carbon/carbon_target = atom_target + var/obj/item/bodypart/head/carbon_head = carbon_target.get_bodypart(BODY_ZONE_HEAD) + if(carbon_head) + if(carbon_head.dismember()) + carbon_target.visible_message(span_danger("[carbon_head] explodes in a shower of gore beneath [src]!"), span_userdanger("Oh f-")) + carbon_head.drop_organs() + qdel(carbon_head) + new /obj/effect/gibspawner/human/bodypartless(get_turf(carbon_target)) + return TRUE + + return FALSE + +/obj/machinery/vending/apply_crit_crush(crit_case, atom_target) + . = ..() + + if (.) + return TRUE + + switch (crit_case) + if (VENDOR_CRUSH_CRIT_GLASSCANDY) + if (!iscarbon(atom_target)) + return FALSE + var/mob/living/carbon/carbon_target = atom_target + for(var/i in 1 to num_shards) + var/obj/item/shard/shard = new /obj/item/shard(get_turf(carbon_target)) + shard.embedding = list(embed_chance = 100, ignore_throwspeed_threshold = TRUE, impact_pain_mult = 1, pain_chance = 5) + shard.updateEmbedding() + carbon_target.hitby(shard, skipcatch = TRUE, hitpush = FALSE) + shard.embedding = list() + shard.updateEmbedding() + return TRUE + if (VENDOR_CRUSH_CRIT_PIN) // pin them beneath the machine until someone untilts it + if (!isliving(atom_target)) + return FALSE + var/mob/living/living_target = atom_target + forceMove(get_turf(living_target)) + buckle_mob(living_target, force=TRUE) + living_target.visible_message(span_danger("[living_target] is pinned underneath [src]!"), span_userdanger("You are pinned down by [src]!")) + return TRUE + + return FALSE + +/** + * Rights the vendor up, unpinning mobs under it, if any. + * Arguments: + * user - mob that has untilted the vendor + */ /obj/machinery/vending/proc/untilt(mob/user) if(user) user.visible_message(span_notice("[user] rights [src]."), \ @@ -785,26 +1018,33 @@ layer = initial(layer) SET_PLANE_IMPLICIT(src, initial(plane)) - var/matrix/M = matrix() - M.Turn(0) - transform = M + var/matrix/to_turn = turn(transform, -tilted_rotation) + animate(src, transform = to_turn, 0.2 SECONDS) + tilted_rotation = 0 -/obj/machinery/vending/proc/loadingAttempt(obj/item/I, mob/user) +/** + * Tries to insert the item into the vendor, and depending on whether the product is a part of the vendor's + * stock or not, increments an already present product entry's available amount or creates a new entry. + * arguments: + * inserted_item - the item we're trying to insert + * user - mob who's trying to insert the item + */ +/obj/machinery/vending/proc/loadingAttempt(obj/item/inserted_item, mob/user) . = TRUE - if(!user.transferItemToLoc(I, src)) + if(!user.transferItemToLoc(inserted_item, src)) return FALSE - to_chat(user, span_notice("You insert [I] into [src]'s input compartment.")) + to_chat(user, span_notice("You insert [inserted_item] into [src]'s input compartment.")) for(var/datum/data/vending_product/product_datum in product_records + coin_records + hidden_records) - if(ispath(I.type, product_datum.product_path)) + if(inserted_item.type == product_datum.product_path) product_datum.amount++ - LAZYADD(product_datum.returned_products, I) + LAZYADD(product_datum.returned_products, inserted_item) return - if(vending_machine_input[format_text(I.name)]) - vending_machine_input[format_text(I.name)]++ + if(vending_machine_input[format_text(inserted_item.name)]) + vending_machine_input[format_text(inserted_item.name)]++ else - vending_machine_input[format_text(I.name)] = 1 + vending_machine_input[format_text(inserted_item.name)] = 1 loaded_items++ /obj/machinery/vending/unbuckle_mob(mob/living/buckled_mob, force = FALSE, can_fall = TRUE) @@ -825,48 +1065,50 @@ to_chat(user, span_warning("[src]'s input compartment blinks red: Access denied.")) return FALSE -/obj/machinery/vending/exchange_parts(mob/user, obj/item/storage/part_replacer/W) - if(!istype(W)) +/obj/machinery/vending/exchange_parts(mob/user, obj/item/storage/part_replacer/replacer) + if(!istype(replacer)) return FALSE - if((flags_1 & NODECONSTRUCT_1) && !W.works_from_distance) + if((flags_1 & NODECONSTRUCT_1) && !replacer.works_from_distance) return FALSE if(!component_parts || !refill_canister) return FALSE var/moved = 0 - if(panel_open || W.works_from_distance) - if(W.works_from_distance) + if(panel_open || replacer.works_from_distance) + if(replacer.works_from_distance) display_parts(user) - for(var/I in W) - if(istype(I, refill_canister)) - moved += restock(I) + for(var/replacer_item in replacer) + if(istype(replacer, refill_canister)) + moved += restock(replacer_item) else display_parts(user) if(moved) to_chat(user, span_notice("[moved] items restocked.")) - W.play_rped_sound() + replacer.play_rped_sound() return TRUE /obj/machinery/vending/on_deconstruction() update_canister() . = ..() -/obj/machinery/vending/emag_act(mob/user) +/obj/machinery/vending/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) - return + return FALSE obj_flags |= EMAGGED - to_chat(user, span_notice("You short out the product lock on [src].")) + balloon_alert(user, "product lock disabled") + return TRUE /obj/machinery/vending/interact(mob/user) - if(seconds_electrified && !(machine_stat & NOPOWER)) - if(shock(user, 100)) - return + if (!isAI(user)) + if(seconds_electrified && !(machine_stat & NOPOWER)) + if(shock(user, 100)) + return - if(tilted && !user.buckled && !isAdminGhostAI(user)) - to_chat(user, span_notice("You begin righting [src].")) - if(do_after(user, 50, target=src)) - untilt(user) - return + if(tilted && !user.buckled && !isAdminGhostAI(user)) + to_chat(user, span_notice("You begin righting [src].")) + if(do_after(user, 50, target=src)) + untilt(user) + return return ..() @@ -892,6 +1134,8 @@ data["department"] = payment_department data["jobDiscount"] = DEPARTMENT_DISCOUNT data["product_records"] = list() + data["displayed_currency_icon"] = displayed_currency_icon + data["displayed_currency_name"] = displayed_currency_name var/list/categories = list() @@ -903,6 +1147,13 @@ return data +/** + * Returns a list of given product records of the vendor to be used in UI. + * arguments: + * records - list of records available + * categories - list of categories available + * premium - bool of whether a record should be priced by a custom/premium price or not + */ /obj/machinery/vending/proc/collect_records_for_static_data(list/records, list/categories, premium) var/static/list/default_category = list( "name" = "Products", @@ -938,23 +1189,23 @@ /obj/machinery/vending/ui_data(mob/user) . = list() - var/obj/item/card/id/C + var/obj/item/card/id/card_used if(isliving(user)) - var/mob/living/L = user - C = L.get_idcard(TRUE) - if(C?.registered_account) + var/mob/living/living_user = user + card_used = living_user.get_idcard(TRUE) + if(card_used?.registered_account) .["user"] = list() - .["user"]["name"] = C.registered_account.account_holder - .["user"]["cash"] = C.registered_account.account_balance - if(C.registered_account.account_job) - .["user"]["job"] = C.registered_account.account_job.title - .["user"]["department"] = C.registered_account.account_job.paycheck_department + .["user"]["name"] = card_used.registered_account.account_holder + .["user"]["cash"] = fetch_balance_to_use(card_used) + if(card_used.registered_account.account_job) + .["user"]["job"] = card_used.registered_account.account_job.title + .["user"]["department"] = card_used.registered_account.account_job.paycheck_department else .["user"]["job"] = "No Job" .["user"]["department"] = DEPARTMENT_UNASSIGNED .["stock"] = list() - for (var/datum/data/vending_product/product_record in product_records + coin_records + hidden_records) + for (var/datum/data/vending_product/product_record as anything in product_records + coin_records + hidden_records) var/list/product_data = list( name = product_record.name, amount = product_record.amount, @@ -975,7 +1226,12 @@ if("select_colors") . = select_colors(params) -/obj/machinery/vending/proc/can_vend(user, silent=FALSE) +/** + * Whether this vendor can vend items or not. + * arguments: + * user - current customer + */ +/obj/machinery/vending/proc/can_vend(user) . = FALSE if(!vend_ready) return @@ -984,6 +1240,9 @@ return return TRUE +/** + * Brings up a color config menu for the picked greyscaled item + */ /obj/machinery/vending/proc/select_colors(list/params) . = TRUE if(!can_vend(usr)) @@ -1013,91 +1272,85 @@ ) menu.ui_interact(usr) +/** + * Vends a greyscale modified item. + * arguments: + * menu - greyscale config menu that has been used to vend the item + */ /obj/machinery/vending/proc/vend_greyscale(list/params, datum/greyscale_modify_menu/menu) if(usr != menu.user) return - if(!menu.target.can_interact(usr)) - return vend(params, menu.split_colors) +/** + * The entire shebang of vending the picked item. Processes the vending and initiates the payment for the item. + * arguments: + * greyscale_colors - greyscale config for the item we're about to vend, if any + */ /obj/machinery/vending/proc/vend(list/params, list/greyscale_colors) . = TRUE if(!can_vend(usr)) return vend_ready = FALSE //One thing at a time!! - var/datum/data/vending_product/R = locate(params["ref"]) + var/datum/data/vending_product/item_record = locate(params["ref"]) var/list/record_to_check = product_records + coin_records if(extended_inventory) record_to_check = product_records + coin_records + hidden_records - if(!R || !istype(R) || !R.product_path) + if(!item_record || !istype(item_record) || !item_record.product_path) vend_ready = TRUE return var/price_to_use = default_price - if(R.custom_price) - price_to_use = R.custom_price - if(R in hidden_records) + if(item_record.custom_price) + price_to_use = item_record.custom_price + if(item_record in hidden_records) if(!extended_inventory) vend_ready = TRUE return - else if (!(R in record_to_check)) + else if (!(item_record in record_to_check)) vend_ready = TRUE message_admins("Vending machine exploit attempted by [ADMIN_LOOKUPFLW(usr)]!") return - if (R.amount <= 0) - speak("Sold out of [R.name].") + if (item_record.amount <= 0) + speak("Sold out of [item_record.name].") flick(icon_deny,src) vend_ready = TRUE return if(onstation) - var/obj/item/card/id/C + var/obj/item/card/id/card_used if(isliving(usr)) - var/mob/living/L = usr - C = L.get_idcard(TRUE) - if(!C) + var/mob/living/living_user = usr + card_used = living_user.get_idcard(TRUE) + if(!card_used) speak("No card found.") flick(icon_deny,src) vend_ready = TRUE return - else if (!C.registered_account) + else if (!card_used.registered_account) speak("No account found.") flick(icon_deny,src) vend_ready = TRUE return - else if(!C.registered_account.account_job) + else if(!card_used.registered_account.account_job) speak("Departmental accounts have been blacklisted from personal expenses due to embezzlement.") flick(icon_deny, src) vend_ready = TRUE return - else if(age_restrictions && R.age_restricted && (!C.registered_age || C.registered_age < AGE_MINOR)) - speak("You are not of legal age to purchase [R.name].") + else if(age_restrictions && item_record.age_restricted && (!card_used.registered_age || card_used.registered_age < AGE_MINOR)) + speak("You are not of legal age to purchase [item_record.name].") if(!(usr in GLOB.narcd_underages)) if (isnull(sec_radio)) sec_radio = new (src) sec_radio.set_listening(FALSE) sec_radio.set_frequency(FREQ_SECURITY) - sec_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) + sec_radio.talk_into(src, "SECURITY ALERT: Underaged crewmember [usr] recorded attempting to purchase [item_record.name] in [get_area(src)]. Please watch for substance abuse.", FREQ_SECURITY) GLOB.narcd_underages += usr flick(icon_deny,src) vend_ready = TRUE return - var/datum/bank_account/account = C.registered_account - if(account.account_job && account.account_job.paycheck_department == payment_department) - price_to_use = max(round(price_to_use * DEPARTMENT_DISCOUNT), 1) //No longer free, but signifigantly cheaper. - if(coin_records.Find(R) || hidden_records.Find(R)) - price_to_use = R.custom_premium_price ? R.custom_premium_price : extra_price - if(LAZYLEN(R.returned_products)) - price_to_use = 0 //returned items are free - if(price_to_use && !account.adjust_money(-price_to_use, "Vending: [R.name]")) - speak("You do not possess the funds to purchase [R.name].") - flick(icon_deny,src) - vend_ready = TRUE + + if(!proceed_payment(card_used, item_record, price_to_use)) return - var/datum/bank_account/D = SSeconomy.get_dep_account(payment_department) - if(D) - D.adjust_money(price_to_use) - 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) var/vend_response = vend_reply || "Thank you for shopping with [src]!" speak(vend_response) @@ -1109,22 +1362,60 @@ 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 - vended_item = new R.product_path(get_turf(src)) + if(!LAZYLEN(item_record.returned_products)) //always give out free returned stuff first, e.g. to avoid walling a traitor objective in a bag behind paid items + vended_item = new item_record.product_path(get_turf(src)) else - vended_item = LAZYACCESS(R.returned_products, LAZYLEN(R.returned_products)) //first in, last out - LAZYREMOVE(R.returned_products, vended_item) + vended_item = LAZYACCESS(item_record.returned_products, LAZYLEN(item_record.returned_products)) //first in, last out + LAZYREMOVE(item_record.returned_products, vended_item) vended_item.forceMove(get_turf(src)) if(greyscale_colors) vended_item.set_greyscale(colors=greyscale_colors) - R.amount-- + item_record.amount-- if(usr.CanReach(src) && usr.put_in_hands(vended_item)) - to_chat(usr, span_notice("You take [R.name] out of the slot.")) + to_chat(usr, span_notice("You take [item_record.name] out of the slot.")) else - to_chat(usr, span_warning("[capitalize(R.name)] falls onto the floor!")) - SSblackbox.record_feedback("nested tally", "vending_machine_usage", 1, list("[type]", "[R.product_path]")) + to_chat(usr, span_warning("[capitalize(item_record.name)] falls onto the floor!")) + SSblackbox.record_feedback("nested tally", "vending_machine_usage", 1, list("[type]", "[item_record.product_path]")) vend_ready = TRUE +/** + * Returns the balance that the vendor will use for proceeding payment. Most vendors would want to use the user's + * card's account credits balance. + * arguments: + * passed_id - the id card that will be billed for the product + */ +/obj/machinery/vending/proc/fetch_balance_to_use(obj/item/card/id/passed_id) + return passed_id.registered_account.account_balance + +/** + * Handles payment processing: discounts, logging, balance change etc. + * arguments: + * paying_id_card - the id card that will be billed for the product + * product_to_vend - the product record of the item we're trying to vend + * price_to_use - price of the item we're trying to vend + */ +/obj/machinery/vending/proc/proceed_payment(obj/item/card/id/paying_id_card, datum/data/vending_product/product_to_vend, price_to_use) + var/datum/bank_account/account = paying_id_card.registered_account + if(account.account_job && account.account_job.paycheck_department == payment_department) + price_to_use = max(round(price_to_use * DEPARTMENT_DISCOUNT), 1) //No longer free, but signifigantly cheaper. + if(coin_records.Find(product_to_vend) || hidden_records.Find(product_to_vend)) + price_to_use = product_to_vend.custom_premium_price ? product_to_vend.custom_premium_price : extra_price + if(LAZYLEN(product_to_vend.returned_products)) + price_to_use = 0 //returned items are free + if(price_to_use && !account.adjust_money(-price_to_use, "Vending: [product_to_vend.name]")) + speak("You do not possess the funds to purchase [product_to_vend.name].") + flick(icon_deny,src) + vend_ready = TRUE + return FALSE + //actual payment here + var/datum/bank_account/paying_id_account = SSeconomy.get_dep_account(payment_department) + if(paying_id_account) + paying_id_account.adjust_money(price_to_use) + 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 [product_to_vend].") + return TRUE + /obj/machinery/vending/process(seconds_per_tick) if(machine_stat & (BROKEN|NOPOWER)) return PROCESS_KILL @@ -1142,6 +1433,7 @@ if(shoot_inventory && SPT_PROB(shoot_inventory_chance, seconds_per_tick)) throw_item() + /** * Speak the given message verbally * @@ -1176,19 +1468,19 @@ if(!target) return FALSE - for(var/datum/data/vending_product/R in shuffle(product_records)) - if(R.amount <= 0) //Try to use a record that actually has something to dump. + for(var/datum/data/vending_product/record in shuffle(product_records)) + if(record.amount <= 0) //Try to use a record that actually has something to dump. continue - var/dump_path = R.product_path + var/dump_path = record.product_path if(!dump_path) continue - if(R.amount > LAZYLEN(R.returned_products)) //always throw new stuff that costs before free returned stuff, because of the hacking effort and time between throws involved + if(record.amount > LAZYLEN(record.returned_products)) //always throw new stuff that costs before free returned stuff, because of the hacking effort and time between throws involved throw_item = new dump_path(loc) else - throw_item = LAZYACCESS(R.returned_products, LAZYLEN(R.returned_products)) //first in, last out + throw_item = LAZYACCESS(record.returned_products, LAZYLEN(record.returned_products)) //first in, last out throw_item.forceMove(loc) - LAZYREMOVE(R.returned_products, throw_item) - R.amount-- + LAZYREMOVE(record.returned_products, throw_item) + record.amount-- break if(!throw_item) return FALSE @@ -1198,16 +1490,18 @@ throw_item.throw_at(target, 16, 3) visible_message(span_danger("[src] launches [throw_item] at [target]!")) return TRUE + /** * A callback called before an item is tossed out * * Override this if you need to do any special case handling * * Arguments: - * * I - obj/item being thrown + * * thrown_item - obj/item being thrown */ -/obj/machinery/vending/proc/pre_throw(obj/item/I) +/obj/machinery/vending/proc/pre_throw(obj/item/thrown_item) return + /** * Shock the passed in user * @@ -1216,16 +1510,15 @@ * * Arguments: * * user - the user to shock - * * prb - probability the shock happens + * * shock_chance - probability the shock happens */ -/obj/machinery/vending/proc/shock(mob/living/user, prb) +/obj/machinery/vending/proc/shock(mob/living/user, shock_chance) if(!istype(user) || machine_stat & (BROKEN|NOPOWER)) // unpowered, no shock return FALSE - if(!prob(prb)) + if(!prob(shock_chance)) return FALSE do_sparks(5, TRUE, src) - var/check_range = TRUE - if(electrocute_mob(user, get_area(src), src, 0.7, check_range)) + if(electrocute_mob(user, get_area(src), src, 0.7, dist_check = TRUE)) return TRUE else return FALSE @@ -1233,22 +1526,22 @@ * Are we able to load the item passed in * * Arguments: - * * I - the item being loaded + * * loaded_item - the item being loaded * * user - the user doing the loading */ -/obj/machinery/vending/proc/canLoadItem(obj/item/I, mob/user) - if((I.type in products) || (I.type in premium) || (I.type in contraband)) +/obj/machinery/vending/proc/canLoadItem(obj/item/loaded_item, mob/user) + if(!length(loaded_item.contents) && ((loaded_item.type in products) || (loaded_item.type in premium) || (loaded_item.type in contraband))) return TRUE - to_chat(user, span_warning("[src] does not accept [I]!")) + to_chat(user, span_warning("[src] does not accept [loaded_item]!")) return FALSE -/obj/machinery/vending/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) +/obj/machinery/vending/hitby(atom/movable/hitting_atom, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) . = ..() - var/mob/living/L = AM - if(tilted || !istype(L) || !prob(20 * (throwingdatum.speed - L.throw_speed))) // hulk throw = +20%, neckgrab throw = +20% + var/mob/living/living_mob = hitting_atom + if(tilted || !istype(living_mob) || !prob(20 * (throwingdatum.speed - living_mob.throw_speed))) // hulk throw = +20%, neckgrab throw = +20% return - tilt(L) + tilt(living_mob) /obj/machinery/vending/attack_tk_grab(mob/user) to_chat(user, span_warning("[src] seems to resist your mental grasp!")) @@ -1284,23 +1577,23 @@ if(id_card?.registered_account && id_card.registered_account == linked_account) return TRUE -/obj/machinery/vending/custom/canLoadItem(obj/item/I, mob/user) +/obj/machinery/vending/custom/canLoadItem(obj/item/loaded_item, mob/user) . = FALSE - if(I.flags_1 & HOLOGRAM_1) + if(loaded_item.flags_1 & HOLOGRAM_1) speak("This vendor cannot accept nonexistent items.") return if(loaded_items >= max_loaded_items) speak("There are too many items in stock.") return - if(isstack(I)) + if(isstack(loaded_item)) speak("Loose items may cause problems, try to use it inside wrapping paper.") return - if(I.custom_price) + if(loaded_item.custom_price) return TRUE /obj/machinery/vending/custom/ui_interact(mob/user) if(!linked_account) - balloon_alert(user, "no registered owner") + balloon_alert(user, "no registered owner!") return FALSE return ..() @@ -1308,25 +1601,25 @@ . = ..() .["access"] = compartmentLoadAccessCheck(user) .["vending_machine_input"] = list() - for (var/O in vending_machine_input) - if(vending_machine_input[O] > 0) + for (var/stocked_item in vending_machine_input) + if(vending_machine_input[stocked_item] > 0) var/base64 var/price = 0 - for(var/obj/item/T in contents) - if(format_text(T.name) == O) - price = T.custom_price - if(!base64) - if(base64_cache[T.type]) - base64 = base64_cache[T.type] + for(var/obj/item/stored_item in contents) + if(format_text(stored_item.name) == stocked_item) + price = stored_item.custom_price + if(!base64) //generate an icon of the item to use in UI + if(base64_cache[stored_item.type]) + base64 = base64_cache[stored_item.type] else - base64 = icon2base64(getFlatIcon(T, no_anim=TRUE)) - base64_cache[T.type] = base64 + base64 = icon2base64(getFlatIcon(stored_item, no_anim=TRUE)) + base64_cache[stored_item.type] = base64 break var/list/data = list( - name = O, + name = stocked_item, price = price, img = base64, - amount = vending_machine_input[O], + amount = vending_machine_input[stocked_item], colorable = FALSE ) .["vending_machine_input"] += list(data) @@ -1342,16 +1635,16 @@ vend_ready = TRUE return TRUE -/obj/machinery/vending/custom/attackby(obj/item/I, mob/user, params) +/obj/machinery/vending/custom/attackby(obj/item/attack_item, mob/user, params) if(!linked_account && isliving(user)) - var/mob/living/L = user - var/obj/item/card/id/C = L.get_idcard(TRUE) - if(C?.registered_account) - linked_account = C.registered_account - speak("\The [src] has been linked to [C].") + var/mob/living/living_user = user + var/obj/item/card/id/card_used = living_user.get_idcard(TRUE) + if(card_used?.registered_account) + linked_account = card_used.registered_account + speak("\The [src] has been linked to [card_used].") if(compartmentLoadAccessCheck(user)) - if(istype(I, /obj/item/pen)) + if(istype(attack_item, /obj/item/pen)) name = tgui_input_text(user, "Set name", "Name", name, 20) desc = tgui_input_text(user, "Set description", "Description", desc, 60) slogan_list += tgui_input_text(user, "Set slogan", "Slogan", "Epic", 60) @@ -1360,7 +1653,7 @@ return ..() -/obj/machinery/vending/custom/crowbar_act(mob/living/user, obj/item/I) +/obj/machinery/vending/custom/crowbar_act(mob/living/user, obj/item/attack_item) return FALSE /obj/machinery/vending/custom/deconstruct(disassembled) @@ -1384,7 +1677,7 @@ var/obj/item/card/id/id_card = user.get_idcard(TRUE) vend_ready = FALSE if(!id_card || !id_card.registered_account || !id_card.registered_account.account_job) - balloon_alert(usr, "no card found") + balloon_alert(usr, "no card found!") flick(icon_deny, src) return TRUE var/datum/bank_account/payee = id_card.registered_account @@ -1397,7 +1690,7 @@ /// Charges the user if its not the owner if(!compartmentLoadAccessCheck(user)) if(!payee.has_money(dispensed_item.custom_price)) - balloon_alert(user, "insufficient funds") + balloon_alert(user, "insufficient funds!") return TRUE /// Make the transaction payee.adjust_money(-dispensed_item.custom_price, , "Vending: [dispensed_item]") diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index f171d989221e6..02daa0ce7e7dd 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -30,7 +30,7 @@ /obj/item/clothing/suit/costume/pirate = 1, /obj/item/clothing/head/costume/pirate = 1, /obj/item/clothing/head/costume/pirate/bandana = 1, - /obj/item/clothing/head/costume/pirate/bandana = 1, + /obj/item/clothing/shoes/pirate = 1, /obj/item/clothing/under/costume/soviet = 1, /obj/item/clothing/head/costume/ushanka = 1, /obj/item/clothing/accessory/vest_sheriff =1, @@ -46,7 +46,7 @@ /obj/item/clothing/under/costume/referee = 1, /obj/item/clothing/mask/whistle = 1, /obj/item/storage/backpack/henchmen = 5, - /obj/item/clothing/under/suit/henchmen = 5, + /obj/item/clothing/under/costume/henchmen = 5, /obj/item/clothing/head/costume/jackbros = 5, /obj/item/clothing/under/costume/jackbros = 5, /obj/item/clothing/under/costume/deckers = 5, @@ -66,6 +66,8 @@ "products" = list( /obj/item/clothing/suit/costume/imperium_monk = 1, /obj/item/clothing/suit/chaplainsuit/holidaypriest = 1, + /obj/item/clothing/suit/chaplainsuit/habit = 1, + /obj/item/clothing/head/chaplain/habit_veil = 1, /obj/item/clothing/suit/chaplainsuit/whiterobe = 1, /obj/item/clothing/head/wizard/marisa/fake = 1, /obj/item/clothing/suit/wizrobe/marisa/fake = 1, @@ -96,6 +98,7 @@ /obj/item/clothing/under/rank/civilian/mime/skirt = 1, /obj/item/clothing/under/rank/civilian/clown/jester = 1, /obj/item/clothing/head/costume/jester = 1, + /obj/item/clothing/shoes/jester_shoes = 1, /obj/item/clothing/under/costume/villain = 1, /obj/item/clothing/suit/costume/joker = 1, /obj/item/clothing/under/costume/joker = 1, @@ -104,7 +107,6 @@ /obj/item/clothing/shoes/singerb = 1, /obj/item/clothing/under/costume/singer/blue = 1, /obj/item/clothing/head/costume/cueball = 1, - /obj/item/clothing/under/suit/white_on_white = 1, ), ), list( @@ -160,8 +162,9 @@ "name" = "Service", "icon" = "kitchen-set", "products" = list( - /obj/item/clothing/under/suit/black = 1, - /obj/item/clothing/under/suit/sl = 1, + /obj/item/clothing/under/costume/buttondown/slacks/service = 1, + /obj/item/clothing/under/costume/buttondown/skirt/service = 1, + /obj/item/clothing/neck/bowtie = 2, /obj/item/clothing/accessory/waistcoat = 1, /obj/item/clothing/under/suit/waiter = 1, /obj/item/clothing/suit/apron = 1, diff --git a/code/modules/vending/boozeomat.dm b/code/modules/vending/boozeomat.dm index 55ebae147f61d..791b1c6f71562 100644 --- a/code/modules/vending/boozeomat.dm +++ b/code/modules/vending/boozeomat.dm @@ -32,6 +32,11 @@ /obj/item/reagent_containers/cup/glass/bottle/beer = 6, /obj/item/reagent_containers/cup/glass/bottle/vodka = 5, /obj/item/reagent_containers/cup/glass/bottle/whiskey = 5, + /obj/item/reagent_containers/cup/glass/bottle/coconut_rum = 5, + /obj/item/reagent_containers/cup/glass/bottle/yuyake = 5, + /obj/item/reagent_containers/cup/glass/bottle/shochu = 5, + /obj/item/reagent_containers/cup/soda_cans/beer = 10, + /obj/item/reagent_containers/cup/soda_cans/beer/rice = 10, ), ), @@ -49,6 +54,8 @@ /obj/item/reagent_containers/cup/soda_cans/sol_dry = 8, /obj/item/reagent_containers/cup/soda_cans/cola = 8, /obj/item/reagent_containers/cup/soda_cans/tonic = 8, + /obj/item/reagent_containers/cup/glass/bottle/hakka_mate = 5, + /obj/item/reagent_containers/cup/soda_cans/melon_soda = 5, ), ), diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index 81e014a1a7a1a..eeca2422e0c6c 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -20,8 +20,12 @@ /obj/item/clothing/mask/bandana/skull = 3, /obj/item/clothing/neck/scarf = 6, /obj/item/clothing/neck/large_scarf = 6, + /obj/item/clothing/neck/large_scarf/red = 6, + /obj/item/clothing/neck/large_scarf/green = 6, + /obj/item/clothing/neck/large_scarf/blue = 6, /obj/item/clothing/neck/infinity_scarf = 6, /obj/item/clothing/neck/tie = 6, + /obj/item/clothing/neck/bowtie = 6, /obj/item/clothing/head/rasta = 3, /obj/item/clothing/head/chaplain/kippah = 3, /obj/item/clothing/head/chaplain/taqiyah/red = 3, @@ -31,6 +35,8 @@ /obj/item/clothing/head/cowboy/white = 1, /obj/item/clothing/head/cowboy/grey = 1, /obj/item/clothing/head/costume/sombrero/green = 1, + /obj/item/clothing/head/costume/nightcap/blue = 2, + /obj/item/clothing/head/costume/nightcap/red = 2, ), ), @@ -64,6 +70,7 @@ /obj/item/clothing/under/shorts/jeanshorts = 5, /obj/item/clothing/under/costume/buttondown/slacks = 4, /obj/item/clothing/under/costume/buttondown/shorts = 4, + /obj/item/clothing/under/costume/buttondown/skirt = 4, /obj/item/clothing/under/dress/sundress = 2, /obj/item/clothing/under/dress/tango = 2, /obj/item/clothing/under/dress/skirt/plaid = 4, @@ -75,7 +82,8 @@ /obj/item/clothing/under/dress/striped = 1, /obj/item/clothing/under/dress/sailor = 1, /obj/item/clothing/under/dress/redeveninggown = 1, - /obj/item/clothing/suit/apron/purple_bartender = 2, + /obj/item/clothing/under/misc/pj/blue = 2, + /obj/item/clothing/under/misc/pj/red = 2, ), ), @@ -86,13 +94,16 @@ /obj/item/clothing/suit/toggle/jacket/sweater = 4, /obj/item/clothing/suit/jacket/oversized = 4, /obj/item/clothing/suit/jacket/fancy = 4, + /obj/item/clothing/suit/toggle/lawyer/greyscale = 4, /obj/item/clothing/suit/hooded/wintercoat/custom = 2, + /obj/item/clothing/suit/hooded/wintercoat = 2, /obj/item/clothing/under/suit/navy = 1, /obj/item/clothing/under/suit/black_really = 1, /obj/item/clothing/under/suit/burgundy = 1, /obj/item/clothing/under/suit/charcoal = 1, /obj/item/clothing/under/suit/white = 1, - /obj/item/clothing/under/suit/sl = 1, + /obj/item/clothing/under/costume/buttondown/slacks/service = 4, + /obj/item/clothing/under/costume/buttondown/skirt/service = 4, /obj/item/clothing/suit/jacket/bomber = 2, /obj/item/clothing/suit/jacket/puffer/vest = 2, /obj/item/clothing/suit/jacket/puffer = 2, @@ -104,8 +115,18 @@ /obj/item/clothing/under/suit/white/skirt = 2, /obj/item/clothing/under/rank/captain/suit/skirt = 2, /obj/item/clothing/under/rank/civilian/head_of_personnel/suit/skirt = 2, - /obj/item/clothing/under/rank/civilian/bartender/purple = 2, + /obj/item/clothing/under/rank/civilian/purple_bartender = 2, /obj/item/clothing/suit/jacket/miljacket = 1, + /obj/item/clothing/suit/apron/overalls = 2, + /obj/item/clothing/suit/costume/wellworn_shirt = 2, + /obj/item/clothing/suit/costume/wellworn_shirt/graphic = 2, + /obj/item/clothing/suit/costume/wellworn_shirt/graphic/ian = 2, + /obj/item/clothing/suit/costume/wellworn_shirt/wornout = 2, + /obj/item/clothing/suit/costume/wellworn_shirt/wornout/graphic = 2, + /obj/item/clothing/suit/costume/wellworn_shirt/wornout/graphic/ian = 2, + /obj/item/clothing/suit/costume/wellworn_shirt/messy = 2, + /obj/item/clothing/suit/costume/wellworn_shirt/messy/graphic = 2, + /obj/item/clothing/suit/costume/wellworn_shirt/messy/graphic/ian = 2, ), ), @@ -114,6 +135,7 @@ "icon" = "socks", "products" = list( /obj/item/clothing/shoes/sneakers/black = 4, + /obj/item/clothing/shoes/sneakers/white = 4, /obj/item/clothing/shoes/sandal = 2, /obj/item/clothing/shoes/laceup = 2, /obj/item/clothing/shoes/winterboots = 2, @@ -139,7 +161,8 @@ /obj/item/clothing/suit/hooded/ethereal_raincoat = 3, /obj/item/clothing/under/ethereal_tunic = 3, - /obj/item/clothing/suit/costume/ianshirt = 1, + /obj/item/clothing/suit/costume/wellworn_shirt/graphic/ian = 1, + /obj/item/clothing/suit/costume/irs = 20, /obj/item/clothing/head/costume/irs = 20, /obj/item/clothing/head/costume/tmc = 20, /obj/item/clothing/head/costume/deckers = 20, diff --git a/code/modules/vending/cola.dm b/code/modules/vending/cola.dm index 947db7f22749f..dd4a4dd4b99b5 100644 --- a/code/modules/vending/cola.dm +++ b/code/modules/vending/cola.dm @@ -17,10 +17,12 @@ /obj/item/reagent_containers/cup/soda_cans/sol_dry = 10, /obj/item/reagent_containers/cup/glass/waterbottle = 10, /obj/item/reagent_containers/cup/glass/bottle/mushi_kombucha = 3, + /obj/item/reagent_containers/cup/soda_cans/volt_energy = 3, ) contraband = list( /obj/item/reagent_containers/cup/soda_cans/thirteenloko = 6, /obj/item/reagent_containers/cup/soda_cans/shamblers = 6, + /obj/item/reagent_containers/cup/soda_cans/wellcheers = 6, ) premium = list( /obj/item/reagent_containers/cup/glass/drinkingglass/filled/nuka_cola = 1, @@ -101,6 +103,7 @@ /obj/item/reagent_containers/cup/soda_cans/lemon_lime = 10, /obj/item/reagent_containers/cup/soda_cans/sol_dry = 10, /obj/item/reagent_containers/cup/soda_cans/shamblers = 10, + /obj/item/reagent_containers/cup/soda_cans/wellcheers = 5, ) product_slogans = "~Shake me up some of that Shambler's Juice!~" product_ads = "Refreshing!;Thirsty for DNA? Satiate your craving!;Over 1 trillion souls drank!;Made with real DNA!;The hivemind demands your thirst!;Drink up!;Absorb your thirst." @@ -109,10 +112,8 @@ /obj/machinery/vending/cola/shamblers/Initialize(mapload) . = ..() - var/datum/language_holder/ling_languages = get_language_holder() - ling_languages.selected_language = ling_languages.get_random_spoken_language() + set_active_language(get_random_spoken_language()) /obj/machinery/vending/cola/shamblers/speak(message) . = ..() - var/datum/language_holder/ling_languages = get_language_holder() - ling_languages.selected_language = ling_languages.get_random_spoken_language() + set_active_language(get_random_spoken_language()) diff --git a/code/modules/vending/drinnerware.dm b/code/modules/vending/drinnerware.dm index e7492f43d94d1..c37750a2d3d8e 100644 --- a/code/modules/vending/drinnerware.dm +++ b/code/modules/vending/drinnerware.dm @@ -4,27 +4,61 @@ product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..." icon_state = "dinnerware" panel_type = "panel4" - products = list( - /obj/item/storage/bag/tray = 8, - /obj/item/reagent_containers/cup/bowl = 30, - /obj/item/reagent_containers/cup/soup_pot = 3, - /obj/item/kitchen/fork = 6, - /obj/item/kitchen/spoon = 10, - /obj/item/kitchen/spoon/soup_ladle = 3, - /obj/item/reagent_containers/cup/glass/drinkingglass = 8, - /obj/item/reagent_containers/condiment/pack/ketchup = 5, - /obj/item/reagent_containers/condiment/pack/hotsauce = 5, - /obj/item/reagent_containers/condiment/pack/astrotame = 5, - /obj/item/reagent_containers/condiment/saltshaker = 5, - /obj/item/reagent_containers/condiment/peppermill = 5, - /obj/item/clothing/suit/apron/chef = 2, - /obj/item/kitchen/rollingpin = 2, - /obj/item/knife/kitchen = 2, - /obj/item/book/granter/crafting_recipe/cooking_sweets_101 = 2, - /obj/item/skillchip/chefs_kiss = 2, - /obj/item/plate/small = 5, - /obj/item/plate = 10, - /obj/item/plate/large = 5, + product_categories = list( + list( + "name" = "Kitchen Utensils", + "icon" = FA_ICON_KITCHEN_SET, + "products" = list( + /obj/item/storage/bag/tray = 8, + /obj/item/reagent_containers/cup/soup_pot = 3, + /obj/item/kitchen/spoon/soup_ladle = 3, + /obj/item/clothing/suit/apron/chef = 2, + /obj/item/kitchen/rollingpin = 2, + /obj/item/kitchen/tongs = 2, + /obj/item/knife/kitchen = 2, + ), + ), + list( + "name" = "Eating Utensils", + "icon" = FA_ICON_UTENSILS, + "products" = list( + /obj/item/kitchen/fork = 6, + /obj/item/kitchen/spoon = 10, + ), + ), + list( + "name" = "Dinnerware", + "icon" = FA_ICON_PLATE_WHEAT, + "products" = list( + /obj/item/plate/small = 5, + /obj/item/plate = 10, + /obj/item/plate/large = 5, + /obj/item/reagent_containers/cup/bowl = 30, + /obj/item/reagent_containers/cup/glass/drinkingglass = 8, + ), + ), + list( + "name" = "Condiments", + "icon" = FA_ICON_BOTTLE_DROPLET, + "products" = list( + /obj/item/reagent_containers/condiment/pack/ketchup = 5, + /obj/item/reagent_containers/condiment/pack/hotsauce = 5, + /obj/item/reagent_containers/condiment/pack/astrotame = 5, + /obj/item/reagent_containers/condiment/saltshaker = 5, + /obj/item/reagent_containers/condiment/peppermill = 5, + ), + ), + list( + "name" = "Recipes", + "icon" = FA_ICON_BOOK_OPEN_READER, + "products" = list( + /obj/item/book/granter/crafting_recipe/cooking_sweets_101 = 2, + ), + ), + ) + + premium = list( + /obj/item/skillchip/chefs_kiss = 2 ) contraband = list( /obj/item/kitchen/rollingpin/illegal = 2, @@ -32,7 +66,7 @@ ) refill_canister = /obj/item/vending_refill/dinnerware default_price = PAYCHECK_CREW * 0.8 - extra_price = PAYCHECK_COMMAND + extra_price = PAYCHECK_CREW * 2.4 payment_department = ACCOUNT_SRV light_mask = "dinnerware-light-mask" diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm index 80fb135084198..e51205c00e4a0 100644 --- a/code/modules/vending/games.dm +++ b/code/modules/vending/games.dm @@ -56,6 +56,7 @@ /obj/item/skillchip/sabrage = 2, /obj/item/skillchip/useless_adapter = 5, /obj/item/skillchip/wine_taster = 2, + /obj/item/skillchip/master_angler = 2, ), ), list( diff --git a/code/modules/vending/magivend.dm b/code/modules/vending/magivend.dm index fe48dac2b8485..ef89e916bf30b 100644 --- a/code/modules/vending/magivend.dm +++ b/code/modules/vending/magivend.dm @@ -13,6 +13,8 @@ /obj/item/clothing/suit/wizrobe/red = 1, /obj/item/clothing/head/wizard/yellow = 1, /obj/item/clothing/suit/wizrobe/yellow = 1, + /obj/item/clothing/head/wizard/black = 1, + /obj/item/clothing/suit/wizrobe/black = 1, /obj/item/clothing/shoes/sandal/magic = 1, /obj/item/staff = 2, ) diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index ddfee8bd47772..ad1c63e7e796f 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -13,12 +13,13 @@ /obj/item/healthanalyzer = 4, /obj/item/wrench/medical = 1, /obj/item/stack/sticky_tape/surgical = 3, - /obj/item/healthanalyzer/wound = 4, + /obj/item/healthanalyzer/simple = 4, /obj/item/stack/medical/ointment = 2, /obj/item/stack/medical/suture = 2, /obj/item/stack/medical/bone_gel = 4, /obj/item/cane/white = 2, /obj/item/clothing/glasses/eyepatch/medical = 2, + /obj/item/storage/box/bandages = 2, ) contraband = list( /obj/item/storage/box/gum/happiness = 3, @@ -57,7 +58,7 @@ /obj/item/healthanalyzer = 0, /obj/item/wrench/medical = 0, /obj/item/stack/sticky_tape/surgical = 0, - /obj/item/healthanalyzer/wound = 0, + /obj/item/healthanalyzer/simple = 0, /obj/item/stack/medical/ointment = 0, /obj/item/stack/medical/suture = 1, /obj/item/stack/medical/bone_gel = 1, diff --git a/code/modules/vending/medical_wall.dm b/code/modules/vending/medical_wall.dm index 9bdbd11ebc500..66badd4adf270 100644 --- a/code/modules/vending/medical_wall.dm +++ b/code/modules/vending/medical_wall.dm @@ -13,8 +13,9 @@ /obj/item/reagent_containers/medigel/libital = 2, /obj/item/reagent_containers/medigel/aiuri = 2, /obj/item/reagent_containers/medigel/sterilizine = 1, - /obj/item/healthanalyzer/wound = 2, + /obj/item/healthanalyzer/simple = 2, /obj/item/stack/medical/bone_gel = 2, + /obj/item/storage/box/bandages = 1, ) contraband = list( /obj/item/reagent_containers/pill/tox = 2, diff --git a/code/modules/vending/runic_vendor.dm b/code/modules/vending/runic_vendor.dm new file mode 100644 index 0000000000000..3edb5b2726403 --- /dev/null +++ b/code/modules/vending/runic_vendor.dm @@ -0,0 +1,91 @@ +#define PULSE_DISTANCE_RANGE 2 + +/obj/machinery/vending/runic_vendor + name = "\improper Runic Vending Machine" + desc = "This vending machine was designed for warfare! A perfect bait for Nanotrasen's crew thirst for consumerism." + icon_state = "RunicVendor" + panel_type = "panel10" + product_slogans = "Come get free magic!;50% off on Mjollnirs today!; Buy a warp whistle and get another one free!" + vend_reply = "Please, stand still near the vending machine for your special package!" + resistance_flags = FIRE_PROOF + light_mask = "RunicVendor-light-mask" + /// How long the vendor stays up before it decays. + var/time_to_decay = 30 SECONDS + /// Area around the vendor that will pushback nearby mobs. + var/pulse_distance = PULSE_DISTANCE_RANGE + + +/obj/machinery/vending/runic_vendor/Initialize(mapload) + if(mapload) + log_mapping("[type] is not supposed to be mapped it, it decays after a set time") + stack_trace("Someone mapped in the meme vending machine the wizard scepter spawns, please remove it") + + addtimer(CALLBACK(src, PROC_REF(decay)), time_to_decay, TIMER_STOPPABLE) + INVOKE_ASYNC(src, PROC_REF(runic_pulse)) + + switch(pick(1,3)) + if(1) + products = list( + /obj/item/clothing/head/wizard = 1, + /obj/item/clothing/suit/wizrobe = 1, + /obj/item/clothing/shoes/sandal/magic = 1, + /obj/item/toy/foam_runic_scepter = 1, + ) + if(2) + products = list( + /obj/item/clothing/head/wizard/red = 1, + /obj/item/clothing/suit/wizrobe/red = 1, + /obj/item/clothing/shoes/sandal/magic = 1, + /obj/item/toy/foam_runic_scepter = 1, + ) + if(3) + products = list( + /obj/item/clothing/head/wizard/yellow = 1, + /obj/item/clothing/suit/wizrobe/yellow = 1, + /obj/item/clothing/shoes/sandal/magic = 1, + /obj/item/toy/foam_runic_scepter = 1, + ) + + return ..() + +/obj/machinery/vending/runic_vendor/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + + if(held_item) + if(istype(held_item, /obj/item/runic_vendor_scepter)) + context[SCREENTIP_CONTEXT_LMB] = "Detonate" + context[SCREENTIP_CONTEXT_RMB] = "Force push" + + return CONTEXTUAL_SCREENTIP_SET + + return . + + +/obj/machinery/vending/runic_vendor/Destroy() + visible_message(span_warning("[src] flickers and disappears!")) + playsound(src,'sound/weapons/resonator_blast.ogg',25,TRUE) + return ..() + +/obj/machinery/vending/runic_vendor/proc/runic_explosion() + explosion(src, light_impact_range = 2) + qdel(src) + +/obj/machinery/vending/runic_vendor/proc/runic_pulse() + var/pulse_locs = spiral_range_turfs(pulse_distance, get_turf(src)) + var/list/hit_things = list() + for(var/turf/pulsing_turf in pulse_locs) + for(var/mob/living/mob_to_be_pulsed_back in pulsing_turf.contents) + hit_things += mob_to_be_pulsed_back + var/atom/target = get_edge_target_turf(mob_to_be_pulsed_back, get_dir(src, get_step_away(mob_to_be_pulsed_back, src))) + to_chat(mob_to_be_pulsed_back, span_userdanger("The field repels you with tremendous force!")) + playsound(src, 'sound/effects/gravhit.ogg', 50, TRUE) + mob_to_be_pulsed_back.throw_at(target, 4, 4) + +/obj/machinery/vending/runic_vendor/screwdriver_act(mob/living/user, obj/item/I) + explosion(src, light_impact_range = 2) + qdel(src) + +/obj/machinery/vending/runic_vendor/proc/decay() + qdel(src) + +#undef PULSE_DISTANCE_RANGE diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm index 6a7edd8e85413..9b5af87ab44c6 100644 --- a/code/modules/vending/security.dm +++ b/code/modules/vending/security.dm @@ -29,6 +29,7 @@ /obj/item/clothing/gloves/tackler = 5, /obj/item/grenade/stingbang = 1, /obj/item/watertank/pepperspray = 2, + /obj/item/storage/belt/holster/energy = 4, ) refill_canister = /obj/item/vending_refill/security default_price = PAYCHECK_CREW diff --git a/code/modules/vending/snack.dm b/code/modules/vending/snack.dm index 22d17761bf161..23b1bcf2c71e3 100644 --- a/code/modules/vending/snack.dm +++ b/code/modules/vending/snack.dm @@ -24,6 +24,11 @@ /obj/item/reagent_containers/cup/glass/dry_ramen = 3, /obj/item/storage/box/gum = 3, /obj/item/food/energybar = 6, + /obj/item/food/hot_shots = 6, + /obj/item/food/sticko = 6, + /obj/item/food/sticko/random = 3, + /obj/item/food/shok_roks = 6, + /obj/item/food/shok_roks/random = 3, ) contraband = list( /obj/item/food/syndicake = 6, @@ -39,7 +44,6 @@ default_price = PAYCHECK_CREW * 0.6 extra_price = PAYCHECK_CREW payment_department = ACCOUNT_SRV - input_display_header = "Chef's Food Selection" /obj/item/vending_refill/snack machine_name = "Getmore Chocolate Corp" diff --git a/code/modules/vending/sustenance.dm b/code/modules/vending/sustenance.dm index b6cd5c511a393..1a2589fcdf152 100644 --- a/code/modules/vending/sustenance.dm +++ b/code/modules/vending/sustenance.dm @@ -29,3 +29,45 @@ /obj/item/vending_refill/sustenance machine_name = "Sustenance Vendor" icon_state = "refill_snack" + +//Labor camp subtype that uses labor points obtained from mining and processing ore +/obj/machinery/vending/sustenance/labor_camp + name = "\improper Labor Camp Sustenance Vendor" + desc = "A vending machine which vends food, as required by section 47-C of the NT's Prisoner Ethical Treatment Agreement. \ + This one, however, processes labor points for its products if the user is incarcerated." + icon_state = "sustenance_labor" + onstation_override = TRUE + displayed_currency_icon = "digging" + displayed_currency_name = " LP" + +/obj/machinery/vending/sustenance/interact(mob/user) + if(isliving(user)) + var/mob/living/living_user = user + if(!(machine_stat & NOPOWER) && !istype(living_user.get_idcard(TRUE), /obj/item/card/id/advanced/prisoner)) + speak("No valid labor points account found. Vending is not permitted.") + return + return ..() + +/obj/machinery/vending/sustenance/proceed_payment(obj/item/card/id/paying_id_card, datum/data/vending_product/product_to_vend, price_to_use) + if(!istype(paying_id_card, /obj/item/card/id/advanced/prisoner)) + speak("I don't take bribes! Pay with labor points!") + return FALSE + var/obj/item/card/id/advanced/prisoner/paying_scum_id = paying_id_card + if(coin_records.Find(product_to_vend) || hidden_records.Find(product_to_vend)) + price_to_use = product_to_vend.custom_premium_price ? product_to_vend.custom_premium_price : extra_price + if(LAZYLEN(product_to_vend.returned_products)) + price_to_use = 0 //returned items are free + if(price_to_use && !(paying_scum_id.points >= price_to_use)) //not enough good prisoner points + speak("You do not possess enough points to purchase [product_to_vend.name].") + flick(icon_deny, src) + vend_ready = TRUE + return FALSE + + paying_scum_id.points -= price_to_use + return TRUE + +/obj/machinery/vending/sustenance/fetch_balance_to_use(obj/item/card/id/passed_id) + if(!istype(passed_id, /obj/item/card/id/advanced/prisoner)) + return null //no points balance - no balance at all + var/obj/item/card/id/advanced/prisoner/paying_scum_id = passed_id + return paying_scum_id.points diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 3b39229a4e7ef..d7de76e80fd1d 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -5,7 +5,6 @@ default_price = PAYCHECK_CREW extra_price = PAYCHECK_COMMAND payment_department = NO_FREEBIES - input_display_header = "Returned Clothing" panel_type = "panel19" light_mask = "wardrobe-light-mask" @@ -16,20 +15,22 @@ product_ads = "Beat perps in style!;It's red so you can't see the blood!;You have the right to be fashionable!;Now you can be the fashion police you always wanted to be!" vend_reply = "Thank you for using the SecDrobe!" products = list( - /obj/item/clothing/suit/hooded/wintercoat/security = 3, - /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/sec = 3, /obj/item/clothing/head/beret/sec = 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 = 3, /obj/item/clothing/under/rank/security/officer/skirt = 3, /obj/item/clothing/under/rank/security/officer/grey = 3, /obj/item/clothing/under/pants/slacks = 3, /obj/item/clothing/under/rank/security/officer/blueshirt = 3, + /obj/item/clothing/suit/hooded/wintercoat/security = 3, + /obj/item/clothing/suit/armor/vest = 3, + /obj/item/clothing/gloves/color/black = 3, + /obj/item/clothing/shoes/jackboots/sec = 3, + /obj/item/storage/backpack/security = 3, + /obj/item/storage/backpack/satchel/sec = 3, + /obj/item/storage/backpack/duffelbag/sec = 3, + /obj/item/storage/backpack/messenger/sec = 3, ) premium = list( /obj/item/clothing/under/rank/security/officer/formal = 3, @@ -51,32 +52,37 @@ vend_reply = "Thank you for using the MediDrobe!" products = list( /obj/item/clothing/accessory/pocketprotector = 4, - /obj/item/storage/backpack/duffelbag/med = 4, - /obj/item/storage/backpack/medic = 4, - /obj/item/storage/backpack/satchel/med = 4, - /obj/item/clothing/suit/hooded/wintercoat/medical = 4, - /obj/item/clothing/suit/hooded/wintercoat/medical/paramedic = 4, - /obj/item/clothing/under/rank/medical/paramedic = 4, - /obj/item/clothing/under/rank/medical/paramedic/skirt = 4, /obj/item/clothing/head/costume/nursehat = 4, /obj/item/clothing/head/beret/medical = 4, /obj/item/clothing/head/utility/surgerycap = 4, /obj/item/clothing/head/utility/surgerycap/purple = 4, /obj/item/clothing/head/utility/surgerycap/green = 4, + /obj/item/clothing/head/beret/medical/paramedic = 4, + /obj/item/clothing/head/soft/paramedic = 4, + /obj/item/clothing/head/utility/head_mirror = 4, /obj/item/clothing/mask/bandana/striped/medical = 4, + /obj/item/clothing/mask/surgical = 4, /obj/item/clothing/under/rank/medical/doctor = 4, /obj/item/clothing/under/rank/medical/doctor/skirt = 4, /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/under/rank/medical/paramedic = 4, + /obj/item/clothing/under/rank/medical/paramedic/skirt = 4, /obj/item/clothing/suit/toggle/labcoat = 4, /obj/item/clothing/suit/toggle/labcoat/paramedic = 4, + /obj/item/clothing/suit/apron/surgical = 4, + /obj/item/clothing/suit/hooded/wintercoat/medical = 4, + /obj/item/clothing/suit/hooded/wintercoat/medical/paramedic = 4, /obj/item/clothing/shoes/sneakers/white = 4, - /obj/item/clothing/head/beret/medical/paramedic = 4, - /obj/item/clothing/head/soft/paramedic = 4, /obj/item/clothing/shoes/sneakers/blue = 4, - /obj/item/clothing/suit/apron/surgical = 4, - /obj/item/clothing/mask/surgical = 4, + /obj/item/clothing/gloves/latex/nitrile = 4, + /obj/item/clothing/gloves/latex = 4, + /obj/item/storage/backpack/duffelbag/med = 4, + /obj/item/storage/backpack/medic = 4, + /obj/item/storage/backpack/satchel/med = 4, + /obj/item/storage/backpack/messenger/med = 4, + /obj/item/radio/headset/headset_med = 4, ) refill_canister = /obj/item/vending_refill/wardrobe/medi_wardrobe payment_department = ACCOUNT_MED @@ -92,19 +98,20 @@ vend_reply = "Thank you for using the EngiDrobe!" products = list( /obj/item/clothing/accessory/pocketprotector = 3, - /obj/item/storage/backpack/duffelbag/engineering = 3, - /obj/item/storage/backpack/industrial = 3, - /obj/item/storage/backpack/satchel/eng = 3, - /obj/item/clothing/suit/hooded/wintercoat/engineering = 3, + /obj/item/clothing/head/utility/hardhat = 3, + /obj/item/clothing/head/utility/hardhat/welding = 3, + /obj/item/clothing/head/beret/engi = 3, + /obj/item/clothing/mask/bandana/striped/engineering = 3, /obj/item/clothing/under/rank/engineering/engineer = 3, /obj/item/clothing/under/rank/engineering/engineer/skirt = 3, /obj/item/clothing/under/rank/engineering/engineer/hazard = 3, /obj/item/clothing/suit/hazardvest = 3, + /obj/item/clothing/suit/hooded/wintercoat/engineering = 3, /obj/item/clothing/shoes/workboots = 3, - /obj/item/clothing/head/beret/engi = 3, - /obj/item/clothing/mask/bandana/striped/engineering = 3, - /obj/item/clothing/head/utility/hardhat = 3, - /obj/item/clothing/head/utility/hardhat/welding = 3, + /obj/item/storage/backpack/industrial = 3, + /obj/item/storage/backpack/satchel/eng = 3, + /obj/item/storage/backpack/duffelbag/engineering = 3, + /obj/item/storage/backpack/messenger/eng = 3, ) refill_canister = /obj/item/vending_refill/wardrobe/engi_wardrobe payment_department = ACCOUNT_ENG @@ -120,14 +127,16 @@ product_ads = "Get your inflammable clothing right here!!!" vend_reply = "Thank you for using the AtmosDrobe!" products = list( - /obj/item/clothing/accessory/pocketprotector = 2, - /obj/item/storage/backpack/duffelbag/engineering = 2, - /obj/item/storage/backpack/satchel/eng = 2, - /obj/item/storage/backpack/industrial = 2, - /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos = 3, + /obj/item/clothing/accessory/pocketprotector = 3, /obj/item/clothing/under/rank/engineering/atmospheric_technician = 3, /obj/item/clothing/under/rank/engineering/atmospheric_technician/skirt = 3, + /obj/item/clothing/suit/atmos_overalls = 3, + /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos = 3, /obj/item/clothing/shoes/sneakers/black = 3, + /obj/item/storage/backpack/satchel/eng = 3, + /obj/item/storage/backpack/industrial = 3, + /obj/item/storage/backpack/duffelbag/engineering = 3, + /obj/item/storage/backpack/messenger/eng = 3, ) refill_canister = /obj/item/vending_refill/wardrobe/atmos_wardrobe payment_department = ACCOUNT_ENG @@ -143,21 +152,29 @@ product_ads = "Upgraded Assistant Style! Pick yours today!;These shorts are comfy and easy to wear, get yours now!" vend_reply = "Thank you for using the CargoDrobe!" products = list( - /obj/item/storage/bag/mail = 3, - /obj/item/clothing/suit/hooded/wintercoat/cargo = 3, - /obj/item/clothing/under/rank/cargo/tech = 3, - /obj/item/clothing/under/rank/cargo/tech/skirt = 3, - /obj/item/clothing/shoes/sneakers/black = 3, - /obj/item/clothing/gloves/fingerless = 3, /obj/item/clothing/head/beret/cargo = 3, /obj/item/clothing/mask/bandana/striped/cargo = 3, /obj/item/clothing/head/soft = 3, + /obj/item/clothing/under/rank/cargo/tech = 3, + /obj/item/clothing/under/rank/cargo/tech/skirt = 3, + /obj/item/clothing/under/rank/cargo/tech/alt = 3, + /obj/item/clothing/under/rank/cargo/tech/skirt/alt = 3, + /obj/item/clothing/suit/toggle/cargo_tech = 3, + /obj/item/clothing/suit/hooded/wintercoat/cargo = 3, + /obj/item/clothing/gloves/fingerless = 3, + /obj/item/clothing/shoes/sneakers/black = 3, + /obj/item/storage/backpack = 3, + /obj/item/storage/backpack/satchel = 3, + /obj/item/storage/backpack/satchel/leather = 3, + /obj/item/storage/backpack/duffelbag = 3, + /obj/item/storage/backpack/messenger = 3, + /obj/item/storage/bag/mail = 3, /obj/item/radio/headset/headset_cargo = 3, ) premium = list( - /obj/item/clothing/under/rank/cargo/miner = 3, /obj/item/clothing/head/costume/mailman = 1, /obj/item/clothing/under/misc/mailman = 1, + /obj/item/clothing/under/rank/cargo/miner = 3, ) refill_canister = /obj/item/vending_refill/wardrobe/cargo_wardrobe payment_department = ACCOUNT_CAR @@ -173,18 +190,23 @@ vend_reply = "Thank you for using the RoboDrobe!" products = list( /obj/item/clothing/glasses/hud/diagnostic = 2, + /obj/item/clothing/head/soft/black = 2, + /obj/item/clothing/mask/bandana/skull/black = 2, /obj/item/clothing/under/rank/rnd/roboticist = 2, /obj/item/clothing/under/rank/rnd/roboticist/skirt = 2, /obj/item/clothing/suit/toggle/labcoat/roboticist = 2, - /obj/item/clothing/suit/hooded/wintercoat/science/robotics = 3, - /obj/item/clothing/shoes/sneakers/black = 2, + /obj/item/clothing/suit/hooded/wintercoat/science/robotics = 2, /obj/item/clothing/gloves/fingerless = 2, - /obj/item/clothing/head/soft/black = 2, - /obj/item/clothing/mask/bandana/skull/black = 2, + /obj/item/clothing/shoes/sneakers/black = 2, + /obj/item/storage/backpack/science = 3, + /obj/item/storage/backpack/satchel/science = 3, + /obj/item/storage/backpack/duffelbag/science = 3, + /obj/item/storage/backpack/messenger/science = 3, + /obj/item/radio/headset/headset_sci = 2, ) contraband = list( - /obj/item/clothing/suit/hooded/techpriest = 2, /obj/item/clothing/under/costume/mech_suit = 2, + /obj/item/clothing/suit/hooded/techpriest = 2, /obj/item/organ/internal/tongue/robot = 2, ) refill_canister = /obj/item/vending_refill/wardrobe/robo_wardrobe @@ -202,18 +224,20 @@ vend_reply = "Thank you for using the SciDrobe!" products = list( /obj/item/clothing/accessory/pocketprotector = 3, - /obj/item/storage/backpack/science = 3, - /obj/item/storage/backpack/satchel/science = 3, - /obj/item/storage/backpack/duffelbag/science = 3, /obj/item/clothing/head/beret/science = 3, + /obj/item/clothing/mask/gas = 3, /obj/item/clothing/mask/bandana/striped/science = 3, - /obj/item/clothing/suit/hooded/wintercoat/science = 3, /obj/item/clothing/under/rank/rnd/scientist = 3, /obj/item/clothing/under/rank/rnd/scientist/skirt = 3, /obj/item/clothing/suit/toggle/labcoat/science = 3, + /obj/item/clothing/suit/hooded/wintercoat/science = 3, + /obj/item/clothing/gloves/latex = 3, /obj/item/clothing/shoes/sneakers/white = 3, + /obj/item/storage/backpack/science = 3, + /obj/item/storage/backpack/satchel/science = 3, + /obj/item/storage/backpack/duffelbag/science = 3, + /obj/item/storage/backpack/messenger/science = 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 @@ -227,17 +251,19 @@ product_ads = "Do you love soil? Then buy our clothes!;Get outfits to match your green thumb here!" vend_reply = "Thank you for using the Hydrobe!" products = list( - /obj/item/storage/backpack/botany = 2, - /obj/item/storage/backpack/satchel/hyd = 2, - /obj/item/storage/backpack/duffelbag/hydroponics = 2, - /obj/item/clothing/suit/hooded/wintercoat/hydro = 2, - /obj/item/clothing/suit/apron = 2, - /obj/item/clothing/suit/apron/overalls = 3, - /obj/item/clothing/suit/apron/waders = 3, + /obj/item/clothing/accessory/armband/hydro = 3, + /obj/item/clothing/mask/bandana/striped/botany = 3, /obj/item/clothing/under/rank/civilian/hydroponics = 3, /obj/item/clothing/under/rank/civilian/hydroponics/skirt = 3, - /obj/item/clothing/mask/bandana/striped/botany = 3, - /obj/item/clothing/accessory/armband/hydro = 3, + /obj/item/clothing/suit/apron = 3, + /obj/item/clothing/suit/apron/overalls = 3, + /obj/item/clothing/suit/apron/waders = 3, + /obj/item/clothing/suit/hooded/wintercoat/hydro = 3, + /obj/item/storage/backpack/botany = 3, + /obj/item/storage/backpack/satchel/hyd = 3, + /obj/item/storage/backpack/duffelbag/hydroponics = 3, + /obj/item/storage/backpack/messenger/hyd = 3, + /obj/item/radio/headset/headset_srv = 3, ) refill_canister = /obj/item/vending_refill/wardrobe/hydro_wardrobe payment_department = ACCOUNT_SRV @@ -253,21 +279,23 @@ product_ads = "Glasses for your eyes and literature for your soul, Curadrobe has it all!; Impress & enthrall your library guests with Curadrobe's extended line of pens!" vend_reply = "Thank you for using the CuraDrobe!" products = list( + /obj/item/clothing/accessory/pocketprotector = 2, /obj/item/pen = 4, /obj/item/pen/red = 2, /obj/item/pen/blue = 2, /obj/item/pen/fourcolor = 1, /obj/item/pen/fountain = 2, - /obj/item/clothing/accessory/pocketprotector = 2, + /obj/item/clothing/glasses/regular = 2, + /obj/item/clothing/glasses/regular/jamjar = 1, /obj/item/clothing/under/rank/civilian/curator = 1, /obj/item/clothing/under/rank/civilian/curator/skirt = 1, /obj/item/clothing/under/rank/captain/suit = 1, /obj/item/clothing/under/rank/captain/suit/skirt = 1, /obj/item/clothing/under/rank/civilian/head_of_personnel/suit = 1, /obj/item/clothing/under/rank/civilian/head_of_personnel/suit/skirt = 1, + /obj/item/clothing/suit/toggle/lawyer/greyscale = 1, /obj/item/storage/backpack/satchel/explorer = 1, - /obj/item/clothing/glasses/regular = 2, - /obj/item/clothing/glasses/regular/jamjar = 1, + /obj/item/storage/backpack/messenger/explorer = 1, /obj/item/storage/bag/books = 1, /obj/item/radio/headset/headset_srv = 2, ) @@ -284,30 +312,38 @@ product_ads = "Any day above ground is a good one!;My day starts when yours ends!;And they call this a dying business!;See you when you're dead!" vend_reply = "Don't forget your \"Buy one get one free\" burial deal!" products = list( - /obj/item/storage/box/bodybags = 3, - /obj/item/storage/medkit/coroner = 1, /obj/item/toy/crayon/white = 2, - /obj/item/clothing/mask/surgical = 1, - /obj/item/clothing/shoes/sneakers/black = 1, - /obj/item/clothing/suit/toggle/labcoat/coroner = 1, - /obj/item/clothing/suit/apron/surgical = 1, - /obj/item/clothing/gloves/latex/coroner = 1, /obj/item/clothing/head/utility/surgerycap/black = 1, + /obj/item/clothing/mask/surgical = 1, /obj/item/clothing/under/rank/medical/scrubs/coroner = 1, /obj/item/clothing/under/rank/medical/coroner = 1, /obj/item/clothing/under/rank/medical/coroner/skirt = 1, + /obj/item/clothing/suit/toggle/labcoat/coroner = 1, + /obj/item/clothing/suit/apron/surgical = 1, + /obj/item/clothing/suit/hooded/wintercoat/medical/coroner = 1, + /obj/item/clothing/gloves/latex/coroner = 1, + /obj/item/clothing/shoes/sneakers/black = 1, /obj/item/storage/backpack/coroner = 1, /obj/item/storage/backpack/satchel/coroner = 1, /obj/item/storage/backpack/duffelbag/coroner = 1, - /obj/item/clothing/suit/hooded/wintercoat/medical/coroner = 1, + /obj/item/storage/backpack/messenger/coroner = 1, + /obj/item/storage/box/bodybags = 3, + /obj/item/scalpel/cruel = 1, + /obj/item/retractor/cruel = 1, + /obj/item/hemostat/cruel = 1, + /obj/item/cautery/cruel = 1, + /obj/item/toy/crayon/white = 1, /obj/item/radio/headset/headset_srvmed = 2, ) contraband = list( /obj/item/knife/ritual = 1, + /obj/item/scythe = 1, + /obj/item/storage/fancy/pickles_jar = 1, /obj/item/table_clock = 1, ) premium = list( /obj/item/autopsy_scanner = 1, + /obj/item/storage/medkit/coroner = 1, ) refill_canister = /obj/item/vending_refill/wardrobe/coroner_wardrobe payment_department = ACCOUNT_MED @@ -322,25 +358,25 @@ product_ads = "Guaranteed to prevent stains from spilled drinks!" vend_reply = "Thank you for using the BarDrobe!" products = list( - /obj/item/clothing/head/hats/tophat = 2, - /obj/item/radio/headset/headset_srv = 2, - /obj/item/clothing/under/suit/sl = 2, - /obj/item/clothing/under/rank/civilian/bartender = 2, - /obj/item/clothing/under/rank/civilian/bartender/purple = 2, - /obj/item/clothing/under/rank/civilian/bartender/skirt = 2, + /obj/item/clothing/glasses/sunglasses/reagent = 1, /obj/item/clothing/accessory/waistcoat = 2, - /obj/item/clothing/suit/apron/purple_bartender = 2, + /obj/item/clothing/head/hats/tophat = 2, /obj/item/clothing/head/soft/black = 2, - /obj/item/clothing/shoes/sneakers/black = 2, - /obj/item/reagent_containers/cup/rag = 2, - /obj/item/storage/box/beanbag = 1, - /obj/item/clothing/suit/armor/vest/alt = 1, - /obj/item/circuitboard/machine/dish_drive = 1, - /obj/item/clothing/glasses/sunglasses/reagent = 1, /obj/item/clothing/neck/petcollar = 1, + /obj/item/clothing/neck/bowtie = 2, + /obj/item/clothing/under/costume/buttondown/slacks/service = 2, + /obj/item/clothing/under/costume/buttondown/skirt/service = 2, + /obj/item/clothing/under/rank/civilian/purple_bartender = 2, + /obj/item/clothing/suit/toggle/lawyer/greyscale = 1, + /obj/item/clothing/suit/armor/vest/alt = 1, + /obj/item/clothing/shoes/sneakers/black = 2, /obj/item/storage/belt/bandolier = 1, - /obj/item/storage/dice/hazard = 1, /obj/item/storage/bag/money = 2, + /obj/item/storage/dice/hazard = 1, + /obj/item/storage/box/beanbag = 1, + /obj/item/circuitboard/machine/dish_drive = 1, + /obj/item/reagent_containers/cup/rag = 2, + /obj/item/radio/headset/headset_srv = 2, ) premium = list( /obj/item/storage/box/dishdrive = 1, @@ -358,21 +394,22 @@ product_ads = "Our clothes are guaranteed to protect you from food splatters!" vend_reply = "Thank you for using the ChefDrobe!" products = list( - /obj/item/clothing/under/suit/waiter = 2, - /obj/item/radio/headset/headset_srv = 2, /obj/item/clothing/accessory/waistcoat = 2, - /obj/item/clothing/suit/apron/chef = 3, /obj/item/clothing/head/soft/mime = 2, - /obj/item/storage/box/mousetraps = 2, - /obj/item/circuitboard/machine/dish_drive = 1, - /obj/item/clothing/suit/toggle/chef = 1, - /obj/item/clothing/under/rank/civilian/chef = 1, - /obj/item/clothing/under/rank/civilian/chef/skirt = 2, - /obj/item/clothing/head/utility/chefhat = 1, + /obj/item/clothing/head/utility/chefhat = 2, + /obj/item/clothing/under/costume/buttondown/slacks/service = 2, + /obj/item/clothing/under/costume/buttondown/skirt/service = 2, /obj/item/clothing/under/rank/civilian/cookjorts = 2, - /obj/item/clothing/shoes/cookflops = 2, - /obj/item/reagent_containers/cup/rag = 1, + /obj/item/clothing/under/suit/waiter = 2, + /obj/item/clothing/suit/apron/chef = 2, + /obj/item/clothing/suit/toggle/chef = 2, /obj/item/clothing/suit/hooded/wintercoat = 2, + /obj/item/clothing/shoes/cookflops = 2, + /obj/item/clothing/shoes/sneakers/black = 2, + /obj/item/storage/box/mousetraps = 2, + /obj/item/circuitboard/machine/dish_drive = 1, + /obj/item/reagent_containers/cup/rag = 2, + /obj/item/radio/headset/headset_srv = 2, ) refill_canister = /obj/item/vending_refill/wardrobe/chef_wardrobe payment_department = ACCOUNT_SRV @@ -387,24 +424,25 @@ product_ads = "Come and get your janitorial clothing, now endorsed by lizard janitors everywhere!" vend_reply = "Thank you for using the JaniDrobe!" products = list( + /obj/item/clothing/head/soft/purple = 2, + /obj/item/clothing/mask/bandana/purple = 2, /obj/item/clothing/under/rank/civilian/janitor = 2, /obj/item/clothing/under/rank/civilian/janitor/skirt = 2, /obj/item/clothing/suit/hooded/wintercoat/janitor = 2, + /obj/item/clothing/shoes/sneakers/black = 2, /obj/item/clothing/gloves/color/black = 2, - /obj/item/clothing/head/soft/purple = 2, - /obj/item/clothing/mask/bandana/purple = 2, + /obj/item/clothing/shoes/galoshes = 2, + /obj/item/storage/belt/janitor = 2, + /obj/item/watertank/janitor = 1, + /obj/item/flashlight = 2, /obj/item/pushbroom = 2, /obj/item/paint/paint_remover = 2, /obj/item/melee/flyswatter = 2, - /obj/item/flashlight = 2, /obj/item/clothing/suit/caution = 6, /obj/item/holosign_creator = 2, /obj/item/lightreplacer = 2, /obj/item/soap/nanotrasen = 2, /obj/item/storage/bag/trash = 2, - /obj/item/clothing/shoes/galoshes = 2, - /obj/item/watertank/janitor = 1, - /obj/item/storage/belt/janitor = 2, /obj/item/plunger = 2, /obj/item/wirebrush = 2, /obj/item/radio/headset/headset_srv = 2, @@ -425,16 +463,20 @@ product_ads = "OBJECTION! Get the rule of law for yourself!" vend_reply = "Thank you for using the LawDrobe!" products = list( + /obj/item/clothing/accessory/lawyers_badge = 2, + /obj/item/clothing/neck/tie = 3, /obj/item/clothing/under/rank/civilian/lawyer/bluesuit = 1, /obj/item/clothing/under/rank/civilian/lawyer/bluesuit/skirt = 1, /obj/item/clothing/suit/toggle/lawyer = 1, /obj/item/clothing/under/rank/civilian/lawyer/purpsuit = 1, /obj/item/clothing/under/rank/civilian/lawyer/purpsuit/skirt = 1, /obj/item/clothing/suit/toggle/lawyer/purple = 1, + /obj/item/clothing/under/costume/buttondown/slacks/service = 1, + /obj/item/clothing/under/costume/buttondown/skirt/service = 1, + /obj/item/clothing/suit/toggle/lawyer/black = 1, + /obj/item/clothing/suit/toggle/lawyer/greyscale = 1, /obj/item/clothing/under/suit/black = 1, /obj/item/clothing/under/suit/black/skirt = 1, - /obj/item/clothing/neck/tie = 3, - /obj/item/clothing/suit/toggle/lawyer/black = 1, /obj/item/clothing/under/rank/civilian/lawyer/beige = 1, /obj/item/clothing/under/rank/civilian/lawyer/beige/skirt = 1, /obj/item/clothing/under/suit/black_really = 1, @@ -446,7 +488,6 @@ /obj/item/clothing/under/rank/civilian/lawyer/black = 1, /obj/item/clothing/under/rank/civilian/lawyer/black/skirt = 1, /obj/item/clothing/shoes/laceup = 2, - /obj/item/clothing/accessory/lawyers_badge = 2, /obj/item/radio/headset/headset_srv = 2, ) refill_canister = /obj/item/vending_refill/wardrobe/law_wardrobe @@ -463,7 +504,6 @@ vend_reply = "Thank you for using the DeusVend!" products = list( /obj/item/choice_beacon/holy = 1, - /obj/item/storage/backpack/cultpack = 1, /obj/item/clothing/accessory/pocketprotector/cosmetology = 1, /obj/item/clothing/under/rank/civilian/chaplain = 1, /obj/item/clothing/under/rank/civilian/chaplain/skirt = 2, @@ -472,7 +512,6 @@ /obj/item/clothing/head/chaplain/nun_hood = 1, /obj/item/clothing/suit/chaplainsuit/holidaypriest = 1, /obj/item/clothing/suit/hooded/chaplainsuit/monkhabit = 1, - /obj/item/storage/fancy/candle_box = 2, /obj/item/clothing/head/chaplain/kippah = 3, /obj/item/clothing/suit/chaplainsuit/whiterobe = 1, /obj/item/clothing/head/chaplain/taqiyah/white = 1, @@ -480,18 +519,22 @@ /obj/item/clothing/suit/chaplainsuit/monkrobeeast = 1, /obj/item/clothing/head/rasta = 1, /obj/item/clothing/suit/chaplainsuit/shrinehand = 1, + /obj/item/storage/backpack/cultpack = 1, + /obj/item/storage/fancy/candle_box = 2, /obj/item/radio/headset/headset_srv = 2, + /obj/item/clothing/suit/chaplainsuit/habit = 1, + /obj/item/clothing/head/chaplain/habit_veil = 1, ) contraband = list( /obj/item/toy/plush/ratplush = 1, /obj/item/toy/plush/narplush = 1, /obj/item/clothing/head/chaplain/medievaljewhat = 3, - /obj/item/clothing/suit/chaplainsuit/clownpriest = 1, /obj/item/clothing/head/chaplain/clownmitre = 1, + /obj/item/clothing/suit/chaplainsuit/clownpriest = 1, ) premium = list( - /obj/item/clothing/suit/chaplainsuit/bishoprobe = 1, /obj/item/clothing/head/chaplain/bishopmitre = 1, + /obj/item/clothing/suit/chaplainsuit/bishoprobe = 1, ) refill_canister = /obj/item/vending_refill/wardrobe/chap_wardrobe payment_department = ACCOUNT_SRV @@ -506,17 +549,20 @@ 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/head/beret/medical = 2, /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/clothing/gloves/latex = 2, + /obj/item/clothing/shoes/sneakers/white = 2, /obj/item/storage/backpack/chemistry = 2, /obj/item/storage/backpack/satchel/chem = 2, /obj/item/storage/backpack/duffelbag/chemistry = 2, + /obj/item/storage/backpack/messenger/chem = 2, /obj/item/storage/bag/chemistry = 2, /obj/item/ph_booklet = 3, + /obj/item/radio/headset/headset_med = 2, ) contraband = list( /obj/item/reagent_containers/spray/syndicate = 2, @@ -536,12 +582,15 @@ products = list( /obj/item/clothing/under/rank/rnd/geneticist = 2, /obj/item/clothing/under/rank/rnd/geneticist/skirt = 2, - /obj/item/clothing/shoes/sneakers/white = 2, /obj/item/clothing/suit/toggle/labcoat/genetics = 2, /obj/item/clothing/suit/hooded/wintercoat/science/genetics = 2, + /obj/item/clothing/gloves/latex = 2, + /obj/item/clothing/shoes/sneakers/white = 2, /obj/item/storage/backpack/genetics = 2, /obj/item/storage/backpack/satchel/gen = 2, /obj/item/storage/backpack/duffelbag/genetics = 2, + /obj/item/storage/backpack/messenger/gen = 2, + /obj/item/radio/headset/headset_sci = 2, ) refill_canister = /obj/item/vending_refill/wardrobe/gene_wardrobe payment_department = ACCOUNT_SCI @@ -556,16 +605,19 @@ product_ads = " Viruses getting you down? Then upgrade to sterilized clothing today!" vend_reply = "Thank you for using the ViroDrobe" products = list( + /obj/item/clothing/mask/surgical = 2, /obj/item/clothing/under/rank/medical/virologist = 2, /obj/item/clothing/under/rank/medical/virologist/skirt = 2, /obj/item/clothing/head/beret/medical = 2, /obj/item/clothing/shoes/sneakers/white = 2, /obj/item/clothing/suit/toggle/labcoat/virologist = 2, /obj/item/clothing/suit/hooded/wintercoat/medical/viro = 2, - /obj/item/clothing/mask/surgical = 2, + /obj/item/clothing/gloves/latex = 2, /obj/item/storage/backpack/virology = 2, /obj/item/storage/backpack/satchel/vir = 2, /obj/item/storage/backpack/duffelbag/virology = 2, + /obj/item/storage/backpack/messenger/vir = 2, + /obj/item/radio/headset/headset_med = 2, ) refill_canister = /obj/item/vending_refill/wardrobe/viro_wardrobe payment_department = ACCOUNT_MED @@ -580,29 +632,29 @@ product_ads = "Apply your brilliant deductive methods in style!" vend_reply = "Thank you for using the DetDrobe!" products = list( + /obj/item/clothing/head/fedora/det_hat = 2, /obj/item/clothing/under/rank/security/detective = 2, /obj/item/clothing/under/rank/security/detective/skirt = 2, - /obj/item/clothing/shoes/sneakers/brown = 2, /obj/item/clothing/suit/jacket/det_suit = 2, - /obj/item/clothing/head/fedora/det_hat = 2, + /obj/item/clothing/shoes/sneakers/brown = 2, + /obj/item/clothing/gloves/latex = 2, + /obj/item/clothing/gloves/color/black = 2, + /obj/item/clothing/accessory/waistcoat = 2, /obj/item/clothing/under/rank/security/detective/noir = 2, /obj/item/clothing/under/rank/security/detective/noir/skirt = 2, - /obj/item/clothing/accessory/waistcoat = 2, /obj/item/clothing/shoes/laceup = 2, + /obj/item/clothing/head/fedora = 2, /obj/item/clothing/suit/jacket/det_suit/dark = 1, /obj/item/clothing/suit/jacket/det_suit/noir = 1, - /obj/item/clothing/head/fedora = 2, - /obj/item/clothing/gloves/color/black = 2, - /obj/item/clothing/gloves/latex = 2, + /obj/item/clothing/neck/tie/disco = 1, /obj/item/clothing/under/rank/security/detective/disco = 1, /obj/item/clothing/suit/jacket/det_suit/disco = 1, /obj/item/clothing/shoes/discoshoes = 1, - /obj/item/clothing/neck/tie/disco = 1, + /obj/item/clothing/glasses/regular/kim = 1, /obj/item/clothing/under/rank/security/detective/kim = 1, /obj/item/clothing/suit/jacket/det_suit/kim = 1, - /obj/item/clothing/shoes/kim = 1, /obj/item/clothing/gloves/kim = 1, - /obj/item/clothing/glasses/regular/kim = 1, + /obj/item/clothing/shoes/kim = 1, /obj/item/reagent_containers/cup/glass/flask/det = 2, /obj/item/storage/fancy/cigarettes = 5, /obj/item/storage/fancy/cigarettes/cigpack_candy = 5, @@ -624,10 +676,10 @@ product_ads = "Show those ERTs who's the most stylish in the briefing room!" vend_reply = "Thank you for using the CentDrobe!" products = list( - /obj/item/clothing/shoes/laceup = 3, - /obj/item/clothing/shoes/jackboots = 3, - /obj/item/clothing/gloves/combat = 3, /obj/item/clothing/glasses/sunglasses = 3, + /obj/item/clothing/head/hats/centcom_cap = 3, + /obj/item/clothing/head/hats/centhat = 3, + /obj/item/clothing/head/hats/intern = 3, /obj/item/clothing/under/rank/centcom/commander = 3, /obj/item/clothing/under/rank/centcom/centcom_skirt = 3, /obj/item/clothing/under/rank/centcom/intern = 3, @@ -637,9 +689,9 @@ /obj/item/clothing/suit/armor/centcom_formal = 3, /obj/item/clothing/suit/space/officer = 3, /obj/item/clothing/suit/hooded/wintercoat/centcom = 3, - /obj/item/clothing/head/hats/centcom_cap = 3, - /obj/item/clothing/head/hats/centhat = 3, - /obj/item/clothing/head/hats/intern = 3, + /obj/item/clothing/shoes/laceup = 3, + /obj/item/clothing/shoes/jackboots = 3, + /obj/item/clothing/gloves/combat = 3, ) refill_canister = /obj/item/vending_refill/wardrobe/cent_wardrobe diff --git a/code/modules/wiremod/components/abstract/assoc_list_variable.dm b/code/modules/wiremod/components/abstract/assoc_list_variable.dm new file mode 100644 index 0000000000000..9ad489a6ee5f4 --- /dev/null +++ b/code/modules/wiremod/components/abstract/assoc_list_variable.dm @@ -0,0 +1,5 @@ +/obj/item/circuit_component/variable/assoc_list + circuit_size = 1 + +/obj/item/circuit_component/variable/assoc_list/get_variable_list(obj/item/integrated_circuit/integrated_circuit) + return integrated_circuit.assoc_list_variables diff --git a/code/modules/wiremod/components/action/radio.dm b/code/modules/wiremod/components/action/radio.dm index e45b72c7f0ce0..cd13e0e1e4515 100644 --- a/code/modules/wiremod/components/action/radio.dm +++ b/code/modules/wiremod/components/action/radio.dm @@ -22,8 +22,23 @@ /// Current frequency value var/current_freq = DEFAULT_SIGNALER_CODE + /// Holds a reference to the shell. + var/atom/movable/parent_shell = null + + /// The ckey of the user who used the shell we were placed in, important for signalling logs. + var/owner_ckey = null + var/datum/radio_frequency/radio_connection +/obj/item/circuit_component/radio/register_shell(atom/movable/shell) + parent_shell = shell + var/potential_fingerprints = shell.fingerprintslast + if(!isnull(potential_fingerprints)) + owner_ckey = potential_fingerprints + +/obj/item/circuit_component/radio/unregister_shell(atom/movable/shell) + parent_shell = null + /obj/item/circuit_component/radio/populate_options() var/static/component_options = list( COMP_RADIO_PUBLIC, @@ -58,7 +73,20 @@ current_freq = frequency if(COMPONENT_TRIGGERED_BY(trigger_input, port)) - var/datum/signal/signal = new(list("code" = round(code.value) || 0, "key" = parent?.owner_id)) + var/signal_code = round(code.value) || 0 + var/turf/location = get_turf(src) + var/time = time2text(world.realtime,"hh:mm:ss") + + var/list/loggable_strings = list("[time] : The [QDELETED(parent_shell) ? "null circuit shell(?)" : parent_shell] @ location ([location.x],[location.y],[location.z]) transmitted the following signal : [format_frequency(current_freq)]/[signal_code] via the radio circuit component.") + if(!isnull(owner_ckey)) + loggable_strings += ": The person who inserted the signalling circuit component was very likely [owner_ckey]." + if(!QDELETED(parent_shell)) + loggable_strings += ": The last fingerprints on the containing shell was [parent_shell.fingerprintslast]." + + var/loggable_string = loggable_strings.Join(" ") + GLOB.lastsignalers.Add(loggable_string) + + var/datum/signal/signal = new(list("code" = signal_code, "key" = parent?.owner_id), logging_data = loggable_string) radio_connection.post_signal(src, signal) /obj/item/circuit_component/radio/receive_signal(datum/signal/signal) diff --git a/code/modules/wiremod/components/list/assoc_list_remove.dm b/code/modules/wiremod/components/list/assoc_list_remove.dm new file mode 100644 index 0000000000000..04b3b489d68bf --- /dev/null +++ b/code/modules/wiremod/components/list/assoc_list_remove.dm @@ -0,0 +1,25 @@ +/** + * # Associative List Remove Component + * + * Removes an element from an assoc list. + */ +/obj/item/circuit_component/variable/assoc_list/list_remove + display_name = "Associative List Remove" + desc = "Removes a key from an associative list variable." + category = "List" + + /// Key to remove to the list + var/datum/port/input/to_remove + + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + +/obj/item/circuit_component/variable/assoc_list/list_remove/populate_ports() + to_remove = add_input_port("To Remove", PORT_TYPE_STRING) + +/obj/item/circuit_component/variable/assoc_list/list_remove/input_received(datum/port/input/port, list/return_values) + if(!current_variable) + return + var/list/info = current_variable.value + var/value_to_remove = to_remove.value + + info -= value_to_remove diff --git a/code/modules/wiremod/components/list/assoc_list_set.dm b/code/modules/wiremod/components/list/assoc_list_set.dm new file mode 100644 index 0000000000000..098212df8e1fd --- /dev/null +++ b/code/modules/wiremod/components/list/assoc_list_set.dm @@ -0,0 +1,54 @@ +/** + * # Assoc List Set Component + * + * Sets a string value on an assoc list. + */ +/obj/item/circuit_component/variable/assoc_list/list_set + display_name = "Associative List Set" + desc = "Sets a string key on an associative list to a specific value." + category = "List" + + /// Key to set + var/datum/port/input/key + /// Value to set the key to. + var/datum/port/input/value + /// For when the list is too long, a signal is sent here. + var/datum/port/output/failed + + var/max_list_size = 500 + + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + +/obj/item/circuit_component/variable/assoc_list/list_set/get_ui_notices() + . = ..() + . += create_ui_notice("Max List Size: [max_list_size]", "orange", "sitemap") + +/obj/item/circuit_component/variable/assoc_list/list_set/populate_ports() + key = add_input_port("Key", PORT_TYPE_STRING) + value = add_input_port("Value", PORT_TYPE_ANY) + failed = add_output_port("Failed", PORT_TYPE_SIGNAL) + +/obj/item/circuit_component/variable/assoc_list/list_set/pre_input_received(datum/port/input/port) + . = ..() + if(current_variable) + value.set_datatype(current_variable.datatype_handler.get_datatype(2)) + +/obj/item/circuit_component/variable/assoc_list/list_set/input_received(datum/port/input/port, list/return_values) + if(!current_variable) + return + var/list/info = current_variable.value + var/key_to_set = key.value + var/value_to_set = value.value + + if(!key_to_set) + failed.set_output(COMPONENT_SIGNAL) + return + + if(length(info) >= max_list_size) + failed.set_output(COMPONENT_SIGNAL) + return + + if(isdatum(value_to_set)) + value_to_set = WEAKREF(value_to_set) + + info[key_to_set] = value_to_set diff --git a/code/modules/wiremod/components/list/list_find.dm b/code/modules/wiremod/components/list/list_find.dm new file mode 100644 index 0000000000000..995b6c5247a9b --- /dev/null +++ b/code/modules/wiremod/components/list/list_find.dm @@ -0,0 +1,63 @@ +/** + * # List Find Component + * + * Finds an element in a list and returns the index. + */ +/obj/item/circuit_component/listin + display_name = "Element Find" + desc = "Checks if an element is in a list and returns the index it is as if it is. Index is set to 0 on failure." + category = "List" + + /// The list type we're checking + var/datum/port/input/list_type + + /// List to check + var/datum/port/input/list_to_check + /// Element to check + var/datum/port/input/to_check + + /// Signal to say we have found the element. + var/datum/port/output/found + /// Signal to say we haven't found the element. + var/datum/port/output/not_found + /// Result of the search + var/datum/port/output/result + /// Index of the element if found. + var/datum/port/output/index + + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL + +/obj/item/circuit_component/listin/populate_options() + list_type = add_option_port("List Type", GLOB.wiremod_basic_types) + +/obj/item/circuit_component/listin/populate_ports() + list_to_check = add_input_port("List", PORT_TYPE_LIST(PORT_TYPE_ANY)) + to_check = add_input_port("To Check", PORT_TYPE_ANY) + + found = add_output_port("Succeeded", PORT_TYPE_SIGNAL) + not_found = add_output_port("Failed", PORT_TYPE_SIGNAL) + result = add_output_port("Result", PORT_TYPE_NUMBER) + index = add_output_port("Index", PORT_TYPE_NUMBER) + +/obj/item/circuit_component/listin/pre_input_received(datum/port/input/port) + . = ..() + list_to_check.set_datatype(PORT_TYPE_LIST(list_type.value)) + to_check.set_datatype(list_type.value) + +/obj/item/circuit_component/listin/input_received(datum/port/input/port, list/return_values) + var/list/info = list_to_check.value + if(!info) + return + var/data_to_check = to_check.value + + if(isdatum(data_to_check)) + data_to_check = WEAKREF(data_to_check) + + var/actual_result = info.Find(data_to_check) + index.set_output(actual_result) + if(actual_result != 0) + result.set_output(TRUE) + found.set_output(COMPONENT_SIGNAL) + else + result.set_output(FALSE) + not_found.set_output(COMPONENT_SIGNAL) diff --git a/code/modules/wiremod/components/list/list_in.dm b/code/modules/wiremod/components/list/list_in.dm deleted file mode 100644 index 1c95979354b73..0000000000000 --- a/code/modules/wiremod/components/list/list_in.dm +++ /dev/null @@ -1,58 +0,0 @@ -/** - * # List Add Component - * - * Adds an element to a list. - */ -/obj/item/circuit_component/listin - display_name = "Element Find" - desc = "Checks if an element is in a list." - category = "List" - - /// The list type we're checking - var/datum/port/input/list_type - - /// List to check - var/datum/port/input/list_to_check - /// Element to check - var/datum/port/input/to_check - - /// Signal to say we have found the element. - var/datum/port/output/found - /// Signal to say we haven't found the element. - var/datum/port/output/not_found - /// Result of the search - var/datum/port/output/result - - circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL - -/obj/item/circuit_component/listin/populate_options() - list_type = add_option_port("List Type", GLOB.wiremod_basic_types) - -/obj/item/circuit_component/listin/populate_ports() - list_to_check = add_input_port("List", PORT_TYPE_LIST(PORT_TYPE_ANY)) - to_check = add_input_port("To Check", PORT_TYPE_ANY) - - found = add_output_port("Succeeded", PORT_TYPE_SIGNAL) - not_found = add_output_port("Failed", PORT_TYPE_SIGNAL) - result = add_output_port("Result", PORT_TYPE_NUMBER) - -/obj/item/circuit_component/listin/pre_input_received(datum/port/input/port) - . = ..() - list_to_check.set_datatype(PORT_TYPE_LIST(list_type.value)) - to_check.set_datatype(list_type.value) - -/obj/item/circuit_component/listin/input_received(datum/port/input/port, list/return_values) - var/list/info = list_to_check.value - if(!info) - return - var/data_to_check = to_check.value - - if(isdatum(data_to_check)) - data_to_check = WEAKREF(data_to_check) - - var/actual_result = (data_to_check in info) - if(actual_result) - found.set_output(COMPONENT_SIGNAL) - else - not_found.set_output(COMPONENT_SIGNAL) - result.set_output(actual_result) diff --git a/code/modules/wiremod/components/list/get_column.dm b/code/modules/wiremod/components/table/get_column.dm similarity index 100% rename from code/modules/wiremod/components/list/get_column.dm rename to code/modules/wiremod/components/table/get_column.dm diff --git a/code/modules/wiremod/components/list/index_table.dm b/code/modules/wiremod/components/table/index_table.dm similarity index 100% rename from code/modules/wiremod/components/list/index_table.dm rename to code/modules/wiremod/components/table/index_table.dm diff --git a/code/modules/wiremod/components/list/select.dm b/code/modules/wiremod/components/table/select.dm similarity index 100% rename from code/modules/wiremod/components/list/select.dm rename to code/modules/wiremod/components/table/select.dm diff --git a/code/modules/wiremod/core/component.dm b/code/modules/wiremod/core/component.dm index 12e4655c24341..55fb258f0fbb3 100644 --- a/code/modules/wiremod/core/component.dm +++ b/code/modules/wiremod/core/component.dm @@ -9,7 +9,7 @@ */ /obj/item/circuit_component name = COMPONENT_DEFAULT_NAME - icon = 'icons/obj/module.dmi' + icon = 'icons/obj/assemblies/module.dmi' icon_state = "component" inhand_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' diff --git a/code/modules/wiremod/core/component_printer.dm b/code/modules/wiremod/core/component_printer.dm index ca05ac68a87de..25c684c5a28a0 100644 --- a/code/modules/wiremod/core/component_printer.dm +++ b/code/modules/wiremod/core/component_printer.dm @@ -2,7 +2,7 @@ /obj/machinery/component_printer name = "component printer" desc = "Produces components for the creation of integrated circuits." - icon = 'icons/obj/wiremod_fab.dmi' + icon = 'icons/obj/machines/wiremod_fab.dmi' icon_state = "fab-idle" circuit = /obj/item/circuitboard/machine/component_printer @@ -17,24 +17,32 @@ /// The current unlocked circuit component designs. Used by integrated circuits to print off circuit components remotely. var/list/current_unlocked_designs = list() + /// The efficiency of this machine + var/efficiency_coeff = 1 + /obj/machinery/component_printer/Initialize(mapload) . = ..() - if(!CONFIG_GET(flag/no_default_techweb_link) && !techweb) - connect_techweb(SSresearch.science_tech) - materials = AddComponent( \ /datum/component/remote_materials, \ - "component_printer", \ mapload, \ mat_container_flags = BREAKDOWN_FLAGS_LATHE, \ ) +/obj/machinery/component_printer/LateInitialize() + . = ..() + if(!CONFIG_GET(flag/no_default_techweb_link) && !techweb) + CONNECT_TO_RND_SERVER_ROUNDSTART(techweb, src) + if(techweb) + on_connected_techweb() + /obj/machinery/component_printer/proc/connect_techweb(datum/techweb/new_techweb) if(techweb) UnregisterSignal(techweb, list(COMSIG_TECHWEB_ADD_DESIGN, COMSIG_TECHWEB_REMOVE_DESIGN)) - techweb = new_techweb + if(!isnull(techweb)) + on_connected_techweb() +/obj/machinery/component_printer/proc/on_connected_techweb() for (var/researched_design_id in techweb.researched_designs) var/datum/design/design = SSresearch.techweb_design_by_id(researched_design_id) if (!(design.build_type & COMPONENT_PRINTER) || !ispath(design.build_path, /obj/item/circuit_component)) @@ -74,27 +82,28 @@ get_asset_datum(/datum/asset/spritesheet/sheetmaterials) ) -/obj/machinery/component_printer/proc/calculate_efficiency() - var/rating = 0 - - for(var/datum/stock_part/servo/servo in component_parts) - ///we do -1 because normal manipulators rating of 1 gives us 1-1=0 i.e no decrement in cost - rating += servo.tier-1 - - ///linear interpolation between full cost i.e 1 & 1/8th the cost i.e 0.125 - ///we do it in 6 steps because maximum rating of 2 manipulators is 8 but -1 gives us 6 - var/coff = 1.0+((0.125-1.0)*(rating/6)) +/obj/machinery/component_printer/RefreshParts() + . = ..() - ///copied from production.dm calculate_efficiency() proc if(materials) var/total_storage = 0 for(var/datum/stock_part/matter_bin/bin in component_parts) - total_storage += bin.tier * 75000 + total_storage += bin.tier * (37.5*SHEET_MATERIAL_AMOUNT) materials.set_local_size(total_storage) - return coff + efficiency_coeff = 0 + + for(var/datum/stock_part/servo/servo in component_parts) + ///we do -1 because normal manipulators rating of 1 gives us 1-1=0 i.e no decrement in cost + efficiency_coeff += servo.tier-1 + + ///linear interpolation between full cost i.e 1 & 1/8th the cost i.e 0.125 + ///we do it in 6 steps because maximum rating of 2 manipulators is 8 but -1 gives us 6 + efficiency_coeff = 1.0+((0.125-1.0)*(efficiency_coeff / 6)) + + update_static_data_for_all_viewers() /obj/machinery/component_printer/proc/print_component(typepath) var/design_id = current_unlocked_designs[typepath] @@ -106,12 +115,10 @@ if (materials.on_hold()) return - var/efficiency_coeff = calculate_efficiency() - if (!materials.mat_container?.has_materials(design.materials, efficiency_coeff)) + if (!materials.mat_container.has_materials(design.materials, efficiency_coeff)) return - materials.mat_container.use_materials(design.materials, efficiency_coeff) - materials.silo_log(src, "printed", -1, design.name, design.materials) + materials.use_materials(design.materials, efficiency_coeff, 1, "printed", "[design.name]") return new design.build_path(drop_location()) /obj/machinery/component_printer/ui_act(action, list/params) @@ -133,25 +140,19 @@ say("Mineral access is on hold, please contact the quartermaster.") return TRUE - var/efficiency_coeff = calculate_efficiency() - - if (!materials.mat_container?.has_materials(design.materials, efficiency_coeff)) + if (!materials.mat_container.has_materials(design.materials, efficiency_coeff)) say("Not enough materials.") return TRUE balloon_alert_to_viewers("printed [design.name]") - materials.mat_container?.use_materials(design.materials, efficiency_coeff) - materials.silo_log(src, "printed", -1, design.name, design.materials) + + materials.use_materials(design.materials, efficiency_coeff, 1, "printed", "[design.name]") var/atom/printed_design = new design.build_path(drop_location()) printed_design.pixel_x = printed_design.base_pixel_x + rand(-5, 5) printed_design.pixel_y = printed_design.base_pixel_y + rand(-5, 5) if ("remove_mat") var/datum/material/material = locate(params["ref"]) var/amount = text2num(params["amount"]) - - if (!amount) - return TRUE - // SAFETY: eject_sheets checks for valid mats materials.eject_sheets(material, amount) @@ -163,12 +164,12 @@ return data /obj/machinery/component_printer/ui_static_data(mob/user) - var/list/data = list() + var/list/data = materials.mat_container.ui_static_data() + var/list/designs = list() var/datum/asset/spritesheet/research_designs/spritesheet = get_asset_datum(/datum/asset/spritesheet/research_designs) var/size32x32 = "[spritesheet.name]32x32" - var/efficiency_coeff = calculate_efficiency() // for (var/datum/design/component/component_design_type as anything in subtypesof(/datum/design/component)) for (var/researched_design_id in techweb.researched_designs) @@ -176,12 +177,15 @@ if (!(design.build_type & COMPONENT_PRINTER)) continue - var/icon_size = spritesheet.icon_size_id(design.id) + var/list/cost = list() + for(var/datum/material/mat in design.materials) + cost[mat.name] = OPTIMAL_COST(design.materials[mat] * efficiency_coeff) + var/icon_size = spritesheet.icon_size_id(design.id) designs[researched_design_id] = list( "name" = design.name, "desc" = design.desc, - "cost" = get_material_cost_data(design.materials, efficiency_coeff), + "cost" = cost, "id" = researched_design_id, "categories" = design.category, "icon" = "[icon_size == size32x32 ? "" : "[icon_size] "][design.id]", @@ -222,7 +226,7 @@ /obj/machinery/debug_component_printer name = "debug component printer" desc = "Produces components for the creation of integrated circuits." - icon = 'icons/obj/wiremod_fab.dmi' + icon = 'icons/obj/machines/wiremod_fab.dmi' icon_state = "fab-idle" /// All of the possible circuit designs stored by this debug printer @@ -302,25 +306,25 @@ /obj/machinery/module_duplicator name = "module duplicator" desc = "Allows you to duplicate module components so that you don't have to recreate them. Scan a module component over this machine to add it as an entry." - icon = 'icons/obj/wiremod_fab.dmi' + icon = 'icons/obj/machines/wiremod_fab.dmi' icon_state = "module-fab-idle" circuit = /obj/item/circuitboard/machine/module_duplicator - - /// The internal material bus - var/datum/component/remote_materials/materials - density = TRUE + ///The internal material bus + var/datum/component/remote_materials/materials + ///List of designs scanned and saved var/list/scanned_designs = list() - - var/cost_per_component = 1000 + ///Constant material cost per component + var/cost_per_component = SHEET_MATERIAL_AMOUNT / 10 + ///Cost efficiency of this machine + var/efficiency_coeff = 1 /obj/machinery/module_duplicator/Initialize(mapload) . = ..() materials = AddComponent( \ /datum/component/remote_materials, \ - "module_duplicator", \ mapload, \ mat_container_flags = BREAKDOWN_FLAGS_LATHE, \ ) @@ -337,27 +341,28 @@ get_asset_datum(/datum/asset/spritesheet/research_designs) ) -/obj/machinery/module_duplicator/proc/calculate_efficiency() - ///copied from production.dm calculate_efficiency() proc +/obj/machinery/module_duplicator/RefreshParts() + . = ..() + if(materials) var/total_storage = 0 for(var/datum/stock_part/matter_bin/bin in component_parts) - total_storage += bin.tier * 75000 + total_storage += bin.tier * (37.5*SHEET_MATERIAL_AMOUNT) materials.set_local_size(total_storage) - var/rating = 0 + efficiency_coeff = 0 for(var/datum/stock_part/servo/servo in component_parts) ///we do -1 because normal manipulators rating of 1 gives us 1-1=0 i.e no decrement in cost - rating += servo.tier - 1 + efficiency_coeff += servo.tier - 1 ///linear interpolation between full cost i.e 1 & 1/8th the cost i.e 0.125 ///we do it in 6 steps because maximum rating of 2 manipulators is 8 but -1 gives us 6 - var/coff = 1.0 + ((0.125 - 1.0) * (rating/6)) + efficiency_coeff = 1.0 + ((0.125 - 1.0) * (efficiency_coeff / 6)) - return coff + update_static_data_for_all_viewers() /obj/machinery/module_duplicator/ui_act(action, list/params) . = ..() @@ -377,23 +382,16 @@ say("Mineral access is on hold, please contact the quartermaster.") return TRUE - var/efficiency_coeff = calculate_efficiency() - - if (!materials.mat_container?.has_materials(design["materials"], efficiency_coeff)) + if (!materials.mat_container.has_materials(design["materials"], efficiency_coeff)) say("Not enough materials.") return TRUE - balloon_alert_to_viewers("printed [design["name"]]") - materials.mat_container?.use_materials(design["materials"], efficiency_coeff) - materials.silo_log(src, "printed", -1, design["name"], design["materials"]) + materials.use_materials(design["materials"], efficiency_coeff, 1, design["name"], design["materials"]) print_module(design) + balloon_alert_to_viewers("printed [design["name"]]") if ("remove_mat") var/datum/material/material = locate(params["ref"]) var/amount = text2num(params["amount"]) - - if (!amount) - return TRUE - // SAFETY: eject_sheets checks for valid mats materials.eject_sheets(material, amount) @@ -481,19 +479,22 @@ return data /obj/machinery/module_duplicator/ui_static_data(mob/user) - var/list/data = list() + var/list/data = materials.mat_container.ui_static_data() var/list/designs = list() var/index = 1 + for (var/list/design as anything in scanned_designs) - var/efficiency_coeff = calculate_efficiency() + var/list/cost = list() + var/list/materials = design["materials"] + for(var/datum/material/mat in materials) + cost[mat.name] = OPTIMAL_COST(materials[mat] * efficiency_coeff) - for (var/list/design as anything in scanned_designs) designs["[index]"] = list( "name" = design["name"], "desc" = design["desc"], - "cost" = get_material_cost_data(design["materials"], efficiency_coeff), + "cost" = cost, "id" = "[index]", "icon" = "integrated_circuit", "categories" = list("/Saved Circuits"), @@ -513,11 +514,3 @@ if(..()) return TRUE return default_deconstruction_screwdriver(user, "module-fab-o", "module-fab-idle", tool) - -/obj/machinery/module_duplicator/proc/get_material_cost_data(list/materials, efficiency_coeff) - var/list/data = list() - - for (var/datum/material/material_type as anything in materials) - data[initial(material_type.name)] = materials[material_type] * efficiency_coeff - - return data diff --git a/code/modules/wiremod/core/duplicator.dm b/code/modules/wiremod/core/duplicator.dm index a784f4030bccb..7b373db6e359e 100644 --- a/code/modules/wiremod/core/duplicator.dm +++ b/code/modules/wiremod/core/duplicator.dm @@ -21,7 +21,10 @@ GLOBAL_LIST_INIT(circuit_dupe_whitelisted_types, list( var/variable_name = variable["name"] var/datum/circuit_variable/variable_datum = new /datum/circuit_variable(variable_name, variable["datatype"]) circuit_variables[variable_name] = variable_datum - if(variable["is_list"]) + if(variable["is_assoc_list"]) + assoc_list_variables[variable_name] = variable_datum + variable_datum.set_value(list()) + else if(variable["is_list"]) list_variables[variable_name] = variable_datum variable_datum.set_value(list()) else @@ -191,10 +194,10 @@ GLOBAL_LIST_INIT(circuit_dupe_whitelisted_types, list( var/datum/circuit_variable/variable = circuit_variables[variable_identifier] new_data["name"] = variable.name new_data["datatype"] = variable.datatype - if(variable_identifier in list_variables) + if(variable_identifier in assoc_list_variables) + new_data["is_assoc_list"] = TRUE + else if(variable_identifier in list_variables) new_data["is_list"] = TRUE - else - new_data["is_list"] = FALSE variables += list(new_data) general_data["variables"] = variables diff --git a/code/modules/wiremod/core/integrated_circuit.dm b/code/modules/wiremod/core/integrated_circuit.dm index c754abaaae357..4a04da3480efe 100644 --- a/code/modules/wiremod/core/integrated_circuit.dm +++ b/code/modules/wiremod/core/integrated_circuit.dm @@ -11,7 +11,7 @@ GLOBAL_LIST_EMPTY_TYPED(integrated_circuits, /obj/item/integrated_circuit) /obj/item/integrated_circuit name = "integrated circuit" desc = "By inserting components and a cell into this, wiring them up, and putting them into a shell, anyone can pretend to be a programmer." - icon = 'icons/obj/module.dmi' + icon = 'icons/obj/assemblies/module.dmi' icon_state = "integrated_circuit" inhand_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' @@ -59,6 +59,9 @@ GLOBAL_LIST_EMPTY_TYPED(integrated_circuits, /obj/item/integrated_circuit) /// List variables stored on this integrated circuit, with a `variable_name = value` structure var/list/datum/circuit_variable/list_variables = list() + /// Assoc list variables stored on this integrated circuit, with a `variable_name = value` structure + var/list/datum/circuit_variable/assoc_list_variables = list() + /// The maximum amount of setters and getters a circuit can have var/max_setters_and_getters = 30 @@ -598,8 +601,13 @@ GLOBAL_LIST_EMPTY_TYPED(integrated_circuits, /obj/item/integrated_circuit) return if(params["is_list"]) variable_datatype = PORT_TYPE_LIST(variable_datatype) + else if(params["is_assoc_list"]) + variable_datatype = PORT_TYPE_ASSOC_LIST(PORT_TYPE_STRING, variable_datatype) var/datum/circuit_variable/variable = new /datum/circuit_variable(variable_identifier, variable_datatype) - if(params["is_list"]) + if(params["is_assoc_list"]) + variable.set_value(list()) + assoc_list_variables[variable_identifier] = variable + else if(params["is_list"]) variable.set_value(list()) list_variables[variable_identifier] = variable else diff --git a/code/modules/wiremod/core/usb_cable.dm b/code/modules/wiremod/core/usb_cable.dm index 5c317c85d61dd..23683bf0ee81d 100644 --- a/code/modules/wiremod/core/usb_cable.dm +++ b/code/modules/wiremod/core/usb_cable.dm @@ -2,7 +2,7 @@ /obj/item/usb_cable name = "usb cable" desc = "A cable that can connect integrated circuits to anything with a USB port, such as computers and machines." - icon = 'icons/obj/wiremod.dmi' + icon = 'icons/obj/science/circuits.dmi' icon_state = "usb_cable" inhand_icon_state = "coil_yellow" lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' diff --git a/code/modules/wiremod/datatypes/composite/assoc_list.dm b/code/modules/wiremod/datatypes/composite/assoc_list.dm index 1a603a5ff9cd1..760658aa7d2fd 100644 --- a/code/modules/wiremod/datatypes/composite/assoc_list.dm +++ b/code/modules/wiremod/datatypes/composite/assoc_list.dm @@ -4,7 +4,10 @@ expected_types = 2 /datum/circuit_composite_template/assoc_list/generate_name(list/composite_datatypes) - return "[composite_datatypes[1]], [composite_datatypes[2]] assoc. list" + if(composite_datatypes[1] == PORT_TYPE_STRING) + return "[composite_datatypes[2]] associative list" + else + return "[composite_datatypes[1]], [composite_datatypes[2]] assoc. list" /datum/circuit_datatype/composite_instance/assoc_list color = "white" diff --git a/code/modules/wiremod/shell/airlock.dm b/code/modules/wiremod/shell/airlock.dm index e330d5a58a517..6c5cd11df7d68 100644 --- a/code/modules/wiremod/shell/airlock.dm +++ b/code/modules/wiremod/shell/airlock.dm @@ -2,7 +2,7 @@ holder_type = /obj/machinery/door/airlock/shell proper_name = "Circuit Airlock" -/datum/wires/airlock/shell/on_cut(wire, mend) +/datum/wires/airlock/shell/on_cut(wire, mend, source) // Don't allow them to re-enable autoclose. if(wire == WIRE_TIMING) return @@ -35,7 +35,7 @@ return TRUE return isAdminGhostAI(user) -/obj/machinery/door/airlock/shell/set_wires() +/obj/machinery/door/airlock/shell/get_wires() return new /datum/wires/airlock/shell(src) /obj/item/circuit_component/airlock diff --git a/code/modules/wiremod/shell/bot.dm b/code/modules/wiremod/shell/bot.dm index 463dd52cc052a..36fd6c5b36993 100644 --- a/code/modules/wiremod/shell/bot.dm +++ b/code/modules/wiremod/shell/bot.dm @@ -5,7 +5,7 @@ */ /obj/structure/bot name = "bot" - icon = 'icons/obj/wiremod.dmi' + icon = 'icons/obj/science/circuits.dmi' icon_state = "setup_medium_box" density = FALSE diff --git a/code/modules/wiremod/shell/brain_computer_interface.dm b/code/modules/wiremod/shell/brain_computer_interface.dm index 99a2661e0047a..89aac209c83e4 100644 --- a/code/modules/wiremod/shell/brain_computer_interface.dm +++ b/code/modules/wiremod/shell/brain_computer_interface.dm @@ -1,7 +1,7 @@ /obj/item/organ/internal/cyberimp/bci name = "brain-computer interface" desc = "An implant that can be placed in a user's head to control circuits using their brain." - icon = 'icons/obj/wiremod.dmi' + icon = 'icons/obj/science/circuits.dmi' icon_state = "bci" visual = FALSE zone = BODY_ZONE_HEAD @@ -223,7 +223,7 @@ SIGNAL_HANDLER if (isobserver(mob)) - examine_text += span_notice("[source.p_they(capitalized = TRUE)] [source.p_have()] \a [parent] implanted in [source.p_them()].") + examine_text += span_notice("[source.p_They()] [source.p_have()] \a [parent] implanted in [source.p_them()].") /obj/item/circuit_component/bci_core/Topic(href, list/href_list) ..() @@ -237,7 +237,7 @@ /datum/action/innate/bci_charge_action name = "Check BCI Charge" check_flags = NONE - button_icon = 'icons/obj/power.dmi' + button_icon = 'icons/obj/machines/cell_charger.dmi' button_icon_state = "cell" var/obj/item/circuit_component/bci_core/circuit_component diff --git a/code/modules/wiremod/shell/compact_remote.dm b/code/modules/wiremod/shell/compact_remote.dm index ef9168c3b178c..38fdfccf9515d 100644 --- a/code/modules/wiremod/shell/compact_remote.dm +++ b/code/modules/wiremod/shell/compact_remote.dm @@ -5,7 +5,7 @@ */ /obj/item/compact_remote name = "compact remote" - icon = 'icons/obj/wiremod.dmi' + icon = 'icons/obj/science/circuits.dmi' icon_state = "setup_small_simple" inhand_icon_state = "electronic" worn_icon_state = "electronic" diff --git a/code/modules/wiremod/shell/controller.dm b/code/modules/wiremod/shell/controller.dm index 4b3beb233c538..7040e554a0a4a 100644 --- a/code/modules/wiremod/shell/controller.dm +++ b/code/modules/wiremod/shell/controller.dm @@ -6,7 +6,7 @@ */ /obj/item/controller name = "controller" - icon = 'icons/obj/wiremod.dmi' + icon = 'icons/obj/science/circuits.dmi' icon_state = "setup_small_calc" inhand_icon_state = "electronic" worn_icon_state = "electronic" diff --git a/code/modules/wiremod/shell/dispenser.dm b/code/modules/wiremod/shell/dispenser.dm index 6b196e29a5b9a..5fa2d2b1a8e0c 100644 --- a/code/modules/wiremod/shell/dispenser.dm +++ b/code/modules/wiremod/shell/dispenser.dm @@ -5,7 +5,7 @@ */ /obj/structure/dispenser_bot name = "dispenser" - icon = 'icons/obj/wiremod.dmi' + icon = 'icons/obj/science/circuits.dmi' icon_state = "setup_drone_arms" density = FALSE diff --git a/code/modules/wiremod/shell/drone.dm b/code/modules/wiremod/shell/drone.dm index 8688ada7ef71b..6f7afcfea0496 100644 --- a/code/modules/wiremod/shell/drone.dm +++ b/code/modules/wiremod/shell/drone.dm @@ -5,7 +5,7 @@ */ /mob/living/circuit_drone name = "drone" - icon = 'icons/obj/wiremod.dmi' + icon = 'icons/obj/science/circuits.dmi' icon_state = "setup_medium_med" maxHealth = 300 health = 300 @@ -32,7 +32,7 @@ /mob/living/circuit_drone/updatehealth() . = ..() if(health < 0) - gib(no_brain = TRUE, no_organs = TRUE, no_bodyparts = TRUE) + gib() /mob/living/circuit_drone/welder_act(mob/living/user, obj/item/tool) . = ..() diff --git a/code/modules/wiremod/shell/gun.dm b/code/modules/wiremod/shell/gun.dm index 26e92409d4a3b..e9176d8c6caa4 100644 --- a/code/modules/wiremod/shell/gun.dm +++ b/code/modules/wiremod/shell/gun.dm @@ -6,7 +6,7 @@ /obj/item/gun/energy/wiremod_gun name = "circuit gun" desc = "A gun that fires projectiles able to control circuitry. It can recharge using power from an attached circuit." - icon = 'icons/obj/wiremod.dmi' + icon = 'icons/obj/science/circuits.dmi' icon_state = "setup_gun" ammo_type = list(/obj/item/ammo_casing/energy/wiremod_gun) cell_type = /obj/item/stock_parts/cell/emproof/wiremod_gun diff --git a/code/modules/wiremod/shell/keyboard.dm b/code/modules/wiremod/shell/keyboard.dm index cb15d710c07d2..4231a6dc814d4 100644 --- a/code/modules/wiremod/shell/keyboard.dm +++ b/code/modules/wiremod/shell/keyboard.dm @@ -1,6 +1,6 @@ /obj/item/keyboard_shell name = "Keyboard Shell" - icon = 'icons/obj/wiremod.dmi' + icon = 'icons/obj/science/circuits.dmi' icon_state = "setup_small_keyboard" inhand_icon_state = "electronic" worn_icon_state = "electronic" diff --git a/code/modules/wiremod/shell/module.dm b/code/modules/wiremod/shell/module.dm index 5c269e8c7e8d4..bffff02e5fbca 100644 --- a/code/modules/wiremod/shell/module.dm +++ b/code/modules/wiremod/shell/module.dm @@ -2,7 +2,7 @@ name = "MOD circuit adapter module" desc = "A module shell that allows a circuit to be inserted into, and interface with, a MODsuit." module_type = MODULE_USABLE - complexity = 3 + complexity = 1 idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 incompatible_modules = list(/obj/item/mod/module/circuit) cooldown_time = 0.5 SECONDS diff --git a/code/modules/wiremod/shell/moneybot.dm b/code/modules/wiremod/shell/moneybot.dm index 0b406eb66c55c..46a834e2d6054 100644 --- a/code/modules/wiremod/shell/moneybot.dm +++ b/code/modules/wiremod/shell/moneybot.dm @@ -5,7 +5,7 @@ */ /obj/structure/money_bot name = "money bot" - icon = 'icons/obj/wiremod.dmi' + icon = 'icons/obj/science/circuits.dmi' icon_state = "setup_large" density = FALSE diff --git a/code/modules/wiremod/shell/scanner.dm b/code/modules/wiremod/shell/scanner.dm index faf3c57bb8c99..3012fe65e490c 100644 --- a/code/modules/wiremod/shell/scanner.dm +++ b/code/modules/wiremod/shell/scanner.dm @@ -5,7 +5,7 @@ */ /obj/item/wiremod_scanner name = "scanner" - icon = 'icons/obj/wiremod.dmi' + icon = 'icons/obj/science/circuits.dmi' icon_state = "setup_small" inhand_icon_state = "electronic" worn_icon_state = "electronic" diff --git a/code/modules/wiremod/shell/server.dm b/code/modules/wiremod/shell/server.dm index 4440c7a0e3ed8..fc71bfaa265b8 100644 --- a/code/modules/wiremod/shell/server.dm +++ b/code/modules/wiremod/shell/server.dm @@ -6,7 +6,7 @@ */ /obj/structure/server name = "server" - icon = 'icons/obj/wiremod.dmi' + icon = 'icons/obj/science/circuits.dmi' icon_state = "setup_stationary" density = TRUE diff --git a/code/modules/wiremod/shell/shell_items.dm b/code/modules/wiremod/shell/shell_items.dm index 565424c344da7..06929e3a04c8e 100644 --- a/code/modules/wiremod/shell/shell_items.dm +++ b/code/modules/wiremod/shell/shell_items.dm @@ -6,7 +6,7 @@ /obj/item/shell name = "assembly" desc = "A shell assembly that can be completed by screwdrivering it." - icon = 'icons/obj/wiremod.dmi' + icon = 'icons/obj/science/circuits.dmi' var/shell_to_spawn var/screw_delay = 3 SECONDS diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index 7f303cc64a899..dca26d366d876 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -11,27 +11,49 @@ bare_wound_bonus = 15 sharpness = SHARP_EDGED -/obj/item/mutant_hand/zombie/afterattack(atom/target, mob/user, proximity_flag) +/obj/item/mutant_hand/zombie/afterattack(atom/target, mob/living/user, proximity_flag) . = ..() if(!proximity_flag) return else if(isliving(target)) if(ishuman(target)) - try_to_zombie_infect(target) + try_to_zombie_infect(target, user, user.zone_selected) else . |= AFTERATTACK_PROCESSED_ITEM check_feast(target, user) -/proc/try_to_zombie_infect(mob/living/carbon/human/target) +/proc/try_to_zombie_infect(mob/living/carbon/human/target, mob/living/user, def_zone = BODY_ZONE_CHEST) CHECK_DNA_AND_SPECIES(target) - if(NOZOMBIE in target.dna.species.species_traits) - // cannot infect any NOZOMBIE subspecies (such as high functioning - // zombies) + // Can't zombify with no head + if(!target.get_bodypart(BODY_ZONE_HEAD)) + return + + if(HAS_TRAIT(target, TRAIT_NO_ZOMBIFY)) + // cannot infect any TRAIT_NO_ZOMBIFY human return // spaceacillin has a 75% chance to block infection - if(istype(target) && target.reagents.has_reagent(/datum/reagent/medicine/spaceacillin) && prob(75)) + if(HAS_TRAIT(target, TRAIT_VIRUS_RESISTANCE) && prob(75)) + return + + var/obj/item/bodypart/actual_limb = target.get_bodypart(def_zone) + + // What you hitting bro? + if(!actual_limb) + return + + var/limb_damage = actual_limb.get_damage() + var/limb_armor = max(0, target.getarmor(actual_limb, BIO) - 25) + + // This is a pretty jank way to do this, but in short: + // if they have thick material on that bodypart it will always need at least 25 previous limb damage to trigger an infection. + // and if their bio armor isn't thick it's a bit weaker. + for(var/obj/item/clothing/iter_clothing in target.get_clothing_on_part(actual_limb)) + if(iter_clothing.clothing_flags & THICKMATERIAL) + limb_armor += 25 + + if(limb_armor > limb_damage) return var/obj/item/organ/internal/zombie_infection/infection @@ -39,6 +61,7 @@ if(!infection) infection = new() infection.Insert(target) + to_chat(user, span_alien("You see [target] twitch for a moment as [target.p_their()] head is covered in \a [infection] - [target.p_Theyve()] been infected.")) /obj/item/mutant_hand/zombie/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is ripping [user.p_their()] brains out! It looks like [user.p_theyre()] trying to commit suicide!")) @@ -51,12 +74,13 @@ if(target.stat == DEAD) var/hp_gained = target.maxHealth target.investigate_log("has been devoured by a zombie.", INVESTIGATE_DEATHS) - target.gib() - // zero as argument for no instant health update - user.adjustBruteLoss(-hp_gained, 0) - user.adjustToxLoss(-hp_gained, 0) - user.adjustFireLoss(-hp_gained, 0) - user.adjustCloneLoss(-hp_gained, 0) - user.updatehealth() - user.adjustOrganLoss(ORGAN_SLOT_BRAIN, -hp_gained) // Zom Bee gibbers "BRAAAAISNSs!1!" + target.gib(DROP_ALL_REMAINS) + var/need_mob_update + need_mob_update = user.adjustBruteLoss(-hp_gained, updating_health = FALSE) + need_mob_update += user.adjustToxLoss(-hp_gained, updating_health = FALSE) + need_mob_update += user.adjustFireLoss(-hp_gained, updating_health = FALSE) + need_mob_update += user.adjustCloneLoss(-hp_gained, updating_health = FALSE) + need_mob_update += user.adjustOrganLoss(ORGAN_SLOT_BRAIN, -hp_gained) // Zom Bee gibbers "BRAAAAISNSs!1!" user.set_nutrition(min(user.nutrition + hp_gained, NUTRITION_LEVEL_FULL)) + if(need_mob_update) + user.updatehealth() diff --git a/config/blanks.json b/config/blanks.json index d564875137bd8..f3b38d67bdb4b 100644 --- a/config/blanks.json +++ b/config/blanks.json @@ -1,10 +1,73 @@ [ + { + "code": "NT-CMD-AR", + "category": "Command Department", + "name": "Access Request", + "info": [ + "

    Access Request

    ", + "
    ", + "

    Name of requestee (with signature):

    ", + "

    [___________________________________]

    ", + "

    Access Grants:

    ", + "

    [___________________________________]

    ", + "

    [___________________________________]

    ", + "

    Reason for Access Request:

    ", + "

    [___________________________________]

    ", + "

    [___________________________________]

    ", + "

    [___________________________________]

    ", + "

    [___________________________________]

    ", + "
    ", + "

    Responsibility for proper handling of access to the restricted areas or equipment therein lies with the requestee. All empty fields must be filled with VOID before the form may be valid.

    ", + "
    ", + "

    Request Review

    ", + "

    Name of the Head of Personnel or deputy head (with signature):

    ", + "

    [___________________________________]

    ", + "

    Head of Personnel Decision:

    ", + "

    [___________________________________]

    ", + "

    [___________________________________]

    ", + "

    Review Date:

    ", + "

    [___].[___].[___]

    ", + "

    [___]:[___]

    ", + "

    Place for a stamp

    ", + "
    ", + "

    Name of affected department head (with signature):

    ", + "

    [___________________________________]

    ", + "

    Department Head's Decision:

    ", + "

    [___________________________________]

    ", + "

    [___________________________________]

    ", + "

    Review Date:

    ", + "

    [___].[___].[___]

    ", + "

    [___]:[___]

    ", + "

    Place for a stamp

    ", + "
    ", + "

    Name of affected department head (with signature):

    ", + "

    [___________________________________]

    ", + "

    Department Head's Decision:

    ", + "

    [___________________________________]

    ", + "

    [___________________________________]

    ", + "

    Review Date:

    ", + "

    [___].[___].[___]

    ", + "

    [___]:[___]

    ", + "

    Place for a stamp

    ", + "
    ", + "

    Decision on Access Request

    ", + "

    Request Decision:

    ", + "

    [___________________________________]

    ", + "

    [___________________________________]

    ", + "

    Decision Date:

    ", + "

    [___].[___].[___]

    ", + "

    [___]:[___]

    ", + "

    Place for a stamp

    ", + "
    ", + "

    This document is the property of Nanotrasen Corporation. Without the signatures and stamps of the heads or their deputies, this document has no corporate validity and may not be used in decisions regarding access distribution.

    " + ] + }, { "code": "NT-CMD-JA", "category": "Command Department", "name": "Job Application", "info": [ - "

    Job Application

    ", + "

    Job Application

    ", "
    ", "

    Applicant's name (with signature):

    ", "

    [___________________________________]

    ", @@ -13,10 +76,10 @@ "
    ", "

    By signing this document, you agree to Nanotrasen's policies on labor protection, occupational health and safety, compensation, and confidentiality.

    ", "
    ", - "

    Condemnation Review

    ", - "

    Name of the Head of Personal or deputy head (with signature):

    ", + "

    Condemnation Review

    ", + "

    Name of the Head of Personnel or deputy head (with signature):

    ", "

    [___________________________________]

    ", - "

    Head of Personal Decision:

    ", + "

    Head of Personnel Decision:

    ", "

    [___________________________________]

    ", "

    [___________________________________]

    ", "

    Review Date:

    ", @@ -33,7 +96,7 @@ "

    [___]:[___]

    ", "

    Place for a stamp

    ", "
    ", - "

    Appointment decision

    ", + "

    Appointment decision

    ", "

    [___________________________________]

    ", "

    [___________________________________]

    ", "

    [___________________________________]

    ", @@ -46,7 +109,7 @@ "category": "Command Department", "name": "Job termination", "info": [ - "

    Job Termination

    ", + "

    Job Termination

    ", "
    ", "

    Name of the dismissed person:

    ", "

    [___________________________________]

    ", @@ -56,9 +119,9 @@ "

    [___________________________________]

    ", "

    [___________________________________]

    ", "

    [___________________________________]

    ", - "

    Name of the Head of Personal or deputy head (with signature):

    ", + "

    Name of the Head of Personnel or deputy head (with signature):

    ", "

    [___________________________________]

    ", - "

    Head of Personal Decision:

    ", + "

    Head of Personnel Decision:

    ", "

    [___________________________________]

    ", "

    [___________________________________]

    ", "

    Decision Date:

    ", @@ -86,7 +149,7 @@ "category": "Command Department", "name": "Job reassignment", "info": [ - "

    Job Reassignment

    ", + "

    Job Reassignment

    ", "
    ", "

    Name of the person to be reassigned:

    ", "

    [___________________________________]

    ", @@ -98,9 +161,9 @@ "

    [___________________________________]

    ", "

    [___________________________________]

    ", "

    [___________________________________]

    ", - "

    Name of the Head of Personal or deputy head (with signature):

    ", + "

    Name of the Head of Personnel or deputy head (with signature):

    ", "

    [___________________________________]

    ", - "

    Head of Personal Decision:

    ", + "

    Head of Personnel Decision:

    ", "

    [___________________________________]

    ", "

    [___________________________________]

    ", "

    Decision Date:

    ", @@ -125,7 +188,7 @@ "category": "Command Department", "name": "Complaint form", "info": [ - "

    Complaint form

    ", + "

    Complaint form

    ", "
    ", "

    Complainant's name (with signature):

    ", "

    [___________________________________]

    ", @@ -161,7 +224,7 @@ "category": "Command Department", "name": "Order form", "info": [ - "

    Order form

    ", + "

    Order form

    ", "
    ", "

    The name of the orderer (with signature):

    ", "

    [___________________________________]

    ", @@ -202,7 +265,7 @@ "category": "Command Department", "name": "Permit to perform hazardous work", "info": [ - "

    Permit to perform hazardous work

    ", + "

    Permit to perform hazardous work

    ", "
    ", "

    Permission requestor's name (with signature):

    ", "

    [___________________________________]

    ", @@ -231,7 +294,7 @@ "category": "Security Department", "name": "Warrant", "info": [ - "

    Warrant

    ", + "

    Warrant

    ", "
    ", "

    Arrestee's name:

    ", "

    [___________________________________]

    ", @@ -257,7 +320,7 @@ "category": "Security Department", "name": "Search warrant", "info": [ - "

    Search Warrant

    ", + "

    Search Warrant

    ", "
    ", "

    Name of the person being searched:

    ", "

    [___________________________________]

    ", @@ -283,7 +346,7 @@ "category": "Security Department", "name": "Interrogation Report", "info": [ - "

    Interrogation Report

    ", + "

    Interrogation Report

    ", "
    ", "

    Name of Interrogated:

    ", "

    [___________________________________]

    ", @@ -328,7 +391,7 @@ "category": "Security Department", "name": "Security Report", "info": [ - "

    Security Report

    ", + "

    Security Report

    ", "
    ", "

    Name of the reporting person (with signature):

    ", "

    [___________________________________]

    ", @@ -366,7 +429,7 @@ "category": "Security Department", "name": "Execution order", "info": [ - "

    Execution order

    ", + "

    Execution order

    ", "
    ", "

    The name of the condemned to the execution:

    ", "

    [___________________________________]

    ", @@ -398,7 +461,7 @@ "category": "Security Department", "name": "Permission to possess", "info": [ - "

    Permission to possess

    ", + "

    Permission to possess

    ", "
    ", "

    Owner's name:

    ", "

    [___________________________________]

    ", @@ -435,7 +498,7 @@ "category": "Security Department", "name": "Court Summons", "info": [ - "

    Court Order

    ", + "

    Court Order

    ", "
    ", "

    Requesting Party (with signature):

    ", "

    [___________________________________]

    ", @@ -455,7 +518,7 @@ "category": "Security Department", "name": "Lawsuit Request Form", "info":[ - "

    Lawsuit Request Form", + "

    Lawsuit Request Form

    ", "

    Prosecuters's name (with signature):

    ", "

    [___________________________________]

    ", "

    Affected Parties:

    ", @@ -482,7 +545,7 @@ "
    ", "
    By writing and signing this form, you consent to the processing of your personal data by Nanotrasen Corporation.

    ", "
    ", - "

    Name of offical to take action:

    ", + "

    Name of official to take action:

    ", "

    [___________________________________]

    ", "

    Official Decision:

    ", "

    [___________________________________]

    ", @@ -502,7 +565,7 @@ "category": "Engineering Department", "name": "Permission to perform non-standard work", "info": [ - "

    Permission to perform non-standard work

    ", + "

    Permission to perform non-standard work

    ", "
    ", "

    Permission requestor's name (with signature):

    ", "

    [___________________________________]

    ", @@ -543,7 +606,7 @@ "category": "Engineering Department", "name": "Permit for the issuance of engineering equipment", "info": [ - "

    Permit for the issuance of engineering equipment

    ", + "

    Permit for the issuance of engineering equipment

    ", "
    ", "

    Name of the requesting equipment (with signature):

    ", "

    [___________________________________]

    ", @@ -588,7 +651,7 @@ "category": "Research Department", "name": "Permission to perform non-standard research", "info": [ - "

    Permission to perform non-standard research

    ", + "

    Permission to perform non-standard research

    ", "
    ", "

    Permission requestor's name (with signature):

    ", "

    [___________________________________]

    ", @@ -629,7 +692,7 @@ "category": "Research Department", "name": "Permit for the issuance of research equipment", "info": [ - "

    Permit for the issuance of research equipment

    ", + "

    Permit for the issuance of research equipment

    ", "
    ", "

    Name of the requesting equipment (with signature):

    ", "

    [___________________________________]

    ", @@ -674,7 +737,7 @@ "category": "Medical Department", "name": "Medical prescription", "info": [ - "

    Medical Prescription

    ", + "

    Medical Prescription

    ", "
    ", "

    Patient name:

    ", "

    [___________________________________]

    ", @@ -711,7 +774,7 @@ "category": "Medical Department", "name": "Autopsy report", "info": [ - "

    Autopsy Report

    ", + "

    Autopsy Report

    ", "
    ", "

    Body Name:

    ", "

    [___________________________________]

    ", @@ -745,7 +808,7 @@ "category": "Medical Department", "name": "Death Certificate", "info": [ - "

    Death Certificate

    ", + "

    Death Certificate

    ", "
    ", "

    Body Name:

    ", "

    [___________________________________]

    ", @@ -758,7 +821,7 @@ "

    [___________________________________]

    ", "

    [___________________________________]

    ", "
    ", - "
    This is evidence that the designated person is permanently dead and cannot be resurrected. The person signing the certificate is responsible for the wrongful death.

    ", + "
    This is evidence that the designated person is permanently dead and cannot be resurrected. The person signing the certificate is responsible for a wrongful death declaration.

    ", "
    ", "

    Coroner's Name (with signature):

    ", "

    [___________________________________]

    ", @@ -776,7 +839,7 @@ "category": "Supply Department", "name": "Permission to execute a non-standard order", "info": [ - "

    Permission to execute a non-standard order

    ", + "

    Permission to execute a non-standard order

    ", "
    ", "

    The name of the person requesting the delivery (with signature):

    ", "

    [___________________________________]

    ", @@ -821,7 +884,7 @@ "category": "Other", "name": "Lunch bill", "info": [ - "

    Lunch Bill

    ", + "

    Lunch Bill

    ", "
    ", "

    Name of the place:

    ", "

    [___________________________________]

    ", @@ -853,7 +916,7 @@ "category": "Other", "name": "Provision of paid services", "info": [ - "

    Provision of paid services

    ", + "

    Provision of paid services

    ", "
    ", "

    Name of the place:

    ", "

    [___________________________________]

    ", diff --git a/config/config.txt b/config/config.txt index 681ce98fe6429..a26b6938496f0 100644 --- a/config/config.txt +++ b/config/config.txt @@ -126,11 +126,14 @@ VOTE_PERIOD 600 ## players' votes default to "No vote" (otherwise, default to "No change") # DEFAULT_NO_VOTE -## disable abandon mob -NORESPAWN +## Determines if players can respawn after death +## 0 = Cannot respawn (default) +## 1 = Can respawn +## 2 = Can respawn if choosing a different character +ALLOW_RESPAWN 0 -## Respawn delay (deciseconds), which doesn't allow to return to lobby (default 10 minutes) -#RESPAWN_DELAY 6000 +## Respawn delay (deciseconds), which doesn't allow to return to lobby +RESPAWN_DELAY 0 ## set a hosted by name for unix platforms HOSTEDBY Yournamehere @@ -138,9 +141,6 @@ HOSTEDBY Yournamehere ## Uncomment this to stop people connecting to your server without a registered ckey. (i.e. guest-* are all blocked from connecting) GUEST_BAN -## Comment this out to disable checking for the cid randomizer dll. (disabled if database isn't enabled or connected) -CHECK_RANDOMIZER - ## IPINTEL: ## This allows you to detect likely proxies by checking ips against getipintel.net ## Rating to warn at: (0.9 is good, 1 is 100% likely to be a spammer/proxy, 0.8 is 80%, etc) anything equal to or higher then this number triggers an admin warning @@ -297,6 +297,9 @@ NOTIFY_NEW_PLAYER_ACCOUNT_AGE 1 ## Requres database #IRC_FIRST_CONNECTION_ALERT +## Discord ID of a role that should be pinged when a new player makes their first connection +#NEW_PLAYER_ALERT_ROLE_ID 1138188190604341308 + ## Deny all new connections by ckeys we haven't seen before (exempts admins and only denies the connection if the database is enabled and connected) ## Requires database #PANIC_BUNKER @@ -381,7 +384,7 @@ CLIENT_ERROR_BUILD 1421 ## Set to 0 or comment out to disable. SECOND_TOPIC_LIMIT 10 -MINUTE_TOPIC_LIMIT 100 +MINUTE_TOPIC_LIMIT 200 ## CLICK RATE LIMITING @@ -469,6 +472,12 @@ DEFAULT_VIEW_SQUARE 15x15 ## Enable automatic profiling - Byond 513.1506 and newer only. #AUTO_PROFILE +## Threshold (in deciseconds) for real time between ticks before we start dumping profiles +DRIFT_DUMP_THRESHOLD 40 + +## How long to wait (in deciseconds) after a profile dump before logging another tickdrift sourced one +DRIFT_PROFILE_DELAY 150 + ## Uncomment to enable global ban DB using the provided URL. The API should expect to receive a ckey at the end of the URL. ## More API details can be found here: https://centcom.melonmesa.com #CENTCOM_BAN_DB https://centcom.melonmesa.com/ban/search @@ -568,9 +577,19 @@ PR_ANNOUNCEMENTS_PER_ROUND 5 ## The maximum number of concurrent tts http requests that can be made by the server at once. #TTS_MAX_CONCURRENT_REQUESTS 4 +## Add voices to the TTS voice blacklist. +#TTS_VOICE_BLACKLIST Sans Undertale +#TTS_VOICE_BLACKLIST Papyrus Undertale + ## Comment to disable sending a toast notification on the host server when initializations complete. ## Even if this is enabled, a notification will only be sent if there are no clients connected. TOAST_NOTIFICATION_ON_INIT ## Causes configuration errors to spit out runtimes CONFIG_ERRORS_RUNTIME + +## Restricts client uploads to the server, defined in bytes, default is 0.5MB +UPLOAD_LIMIT 524288 + +## Restricts admin client uploads to the server, defined in bytes, default is 5MB +UPLOAD_LIMIT_ADMIN 5242880 diff --git a/config/dynamic.json b/config/dynamic.json index 53f2eaa656025..a4a1eb7ebdbfb 100644 --- a/config/dynamic.json +++ b/config/dynamic.json @@ -154,5 +154,10 @@ "Stowaway Changeling": { "weight": 0 } + }, + + "Station": { + "Radioactive Nebula": { + } } } diff --git a/config/game_options.txt b/config/game_options.txt index b917f6d4567fc..ae90dcb56b91e 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -414,10 +414,12 @@ MORGUE_CADAVER_OTHER_SPECIES_PROBABILITY 50 #MORGUE_CADAVER_OVERRIDE_SPECIES lizard -##Overflow job. Default is assistant +##Overflow job. Default is assistant. +## NOTE: This will overwrite anything you put in jobconfig.toml! OVERFLOW_JOB Assistant ## Overflow slot cap. Set to -1 for unlimited. If limited, it will still open up if every other job is full. +## NOTE: This will overwrite anything you put in jobconfig.toml! OVERFLOW_CAP -1 ## Uncomment to bring back old grey suit assistants instead of the now default rainbow colored assistants. diff --git a/config/jobconfig.toml b/config/jobconfig.toml index 675a1923db64f..f1a9b65d594b9 100644 --- a/config/jobconfig.toml +++ b/config/jobconfig.toml @@ -1,10 +1,12 @@ ## This is the configuration file for the job system. ## This will only be enabled when the config flag LOAD_JOBS_FROM_TXT is enabled. ## We use a system of keys here that directly correlate to the job, just to ensure they don't desync if we choose to change the name of a job. -## You are able to change (as of now) four different variables in this file. +## You are able to change (as of now) five different variables in this file. ## Total Positions are how many job slots you get in a shift, Spawn Positions are how many you get that load in at spawn. If you set this to -1, it is unrestricted. ## Playtime Requirements is in minutes, and the job will unlock when a player reaches that amount of time. ## However, that can be superseded by Required Account Age, which is a time in days that you need to have had an account on the server for. +## Also there is a required character age in years. It prevents player from joining as this job, if their character's age as is lower than required. Setting it to 0 means it is turned off for this job. + ## As time goes on, more config options may be added to this file. ## You can use the admin verb 'Generate Job Configuration' in-game to auto-regenerate this config as a downloadable file without having to manually edit this file if we add more jobs or more things you can edit here. ## It will always respect prior-existing values in the config, but will appropriately add more fields when they generate. @@ -19,215 +21,251 @@ [AI] "# Playtime Requirements" = 180 "# Required Account Age" = 30 +"# Required Character Age" = 0 "# Spawn Positions" = 1 "# Total Positions" = 1 [ASSISTANT] "# Playtime Requirements" = 0 "# Required Account Age" = 0 +"# Required Character Age" = 0 "# Spawn Positions" = -1 "# Total Positions" = -1 [ATMOSPHERIC_TECHNICIAN] "# Playtime Requirements" = 60 "# Required Account Age" = 0 +"# Required Character Age" = 0 "# Spawn Positions" = 2 "# Total Positions" = 3 [BARTENDER] "# Playtime Requirements" = 0 "# Required Account Age" = 0 +"# Required Character Age" = 0 "# Spawn Positions" = 1 "# Total Positions" = 1 [BOTANIST] "# Playtime Requirements" = 0 "# Required Account Age" = 0 +"# Required Character Age" = 0 "# Spawn Positions" = 2 "# Total Positions" = 3 [CAPTAIN] "# Playtime Requirements" = 180 "# Required Account Age" = 14 +"# Required Character Age" = 0 "# Spawn Positions" = 1 "# Total Positions" = 1 [CARGO_TECHNICIAN] "# Playtime Requirements" = 0 "# Required Account Age" = 0 +"# Required Character Age" = 0 "# Spawn Positions" = 3 "# Total Positions" = 5 [CHAPLAIN] "# Playtime Requirements" = 0 "# Required Account Age" = 0 +"# Required Character Age" = 0 "# Spawn Positions" = 1 "# Total Positions" = 1 [CHEMIST] "# Playtime Requirements" = 60 "# Required Account Age" = 0 +"# Required Character Age" = 0 "# Spawn Positions" = 2 "# Total Positions" = 2 [CHIEF_ENGINEER] "# Playtime Requirements" = 180 "# Required Account Age" = 7 +"# Required Character Age" = 0 "# Spawn Positions" = 1 "# Total Positions" = 1 [CHIEF_MEDICAL_OFFICER] "# Playtime Requirements" = 180 "# Required Account Age" = 7 +"# Required Character Age" = 0 "# Spawn Positions" = 1 "# Total Positions" = 1 [CLOWN] "# Playtime Requirements" = 0 "# Required Account Age" = 0 +"# Required Character Age" = 0 "# Spawn Positions" = 1 "# Total Positions" = 1 [COOK] "# Playtime Requirements" = 0 "# Required Account Age" = 0 +"# Required Character Age" = 0 "# Spawn Positions" = 1 "# Total Positions" = 2 [CORONER] "# Playtime Requirements" = 0 "# Required Account Age" = 0 +"# Required Character Age" = 0 "# Spawn Positions" = 1 "# Total Positions" = 1 [CURATOR] "# Playtime Requirements" = 0 "# Required Account Age" = 0 +"# Required Character Age" = 0 "# Spawn Positions" = 1 "# Total Positions" = 1 [CYBORG] "# Playtime Requirements" = 120 "# Required Account Age" = 21 +"# Required Character Age" = 0 "# Spawn Positions" = 1 "# Total Positions" = 0 [DETECTIVE] "# Playtime Requirements" = 300 "# Required Account Age" = 7 +"# Required Character Age" = 0 "# Spawn Positions" = 1 "# Total Positions" = 1 [GENETICIST] "# Playtime Requirements" = 60 "# Required Account Age" = 0 +"# Required Character Age" = 0 "# Spawn Positions" = 2 "# Total Positions" = 2 [HEAD_OF_PERSONNEL] "# Playtime Requirements" = 180 "# Required Account Age" = 10 +"# Required Character Age" = 0 "# Spawn Positions" = 1 "# Total Positions" = 1 [HEAD_OF_SECURITY] "# Playtime Requirements" = 300 "# Required Account Age" = 14 +"# Required Character Age" = 0 "# Spawn Positions" = 1 "# Total Positions" = 1 [JANITOR] "# Playtime Requirements" = 0 "# Required Account Age" = 0 +"# Required Character Age" = 0 "# Spawn Positions" = 1 "# Total Positions" = 2 [LAWYER] "# Playtime Requirements" = 0 "# Required Account Age" = 0 +"# Required Character Age" = 0 "# Spawn Positions" = 2 "# Total Positions" = 2 [MEDICAL_DOCTOR] "# Playtime Requirements" = 0 "# Required Account Age" = 0 +"# Required Character Age" = 0 "# Spawn Positions" = 3 "# Total Positions" = 5 [MIME] "# Playtime Requirements" = 0 "# Required Account Age" = 0 +"# Required Character Age" = 0 "# Spawn Positions" = 1 "# Total Positions" = 1 [PARAMEDIC] "# Playtime Requirements" = 0 "# Required Account Age" = 0 +"# Required Character Age" = 0 "# Spawn Positions" = 2 "# Total Positions" = 2 [PRISONER] "# Playtime Requirements" = 0 "# Required Account Age" = 0 +"# Required Character Age" = 0 "# Spawn Positions" = 2 "# Total Positions" = 0 [PSYCHOLOGIST] "# Playtime Requirements" = 0 "# Required Account Age" = 0 +"# Required Character Age" = 0 "# Spawn Positions" = 1 "# Total Positions" = 1 [QUARTERMASTER] "# Playtime Requirements" = 0 "# Required Account Age" = 7 +"# Required Character Age" = 0 "# Spawn Positions" = 1 "# Total Positions" = 1 [RESEARCH_DIRECTOR] "# Playtime Requirements" = 180 "# Required Account Age" = 7 +"# Required Character Age" = 0 "# Spawn Positions" = 1 "# Total Positions" = 1 [ROBOTICIST] "# Playtime Requirements" = 60 "# Required Account Age" = 0 +"# Required Character Age" = 0 "# Spawn Positions" = 2 "# Total Positions" = 2 [SCIENTIST] "# Playtime Requirements" = 60 "# Required Account Age" = 0 +"# Required Character Age" = 0 "# Spawn Positions" = 3 "# Total Positions" = 5 [SECURITY_OFFICER] "# Playtime Requirements" = 300 "# Required Account Age" = 7 +"# Required Character Age" = 0 "# Spawn Positions" = 5 "# Total Positions" = 5 [SHAFT_MINER] "# Playtime Requirements" = 0 "# Required Account Age" = 0 +"# Required Character Age" = 0 "# Spawn Positions" = 3 "# Total Positions" = 3 [STATION_ENGINEER] "# Playtime Requirements" = 60 "# Required Account Age" = 0 +"# Required Character Age" = 0 "# Spawn Positions" = 5 "# Total Positions" = 5 [VIROLOGIST] "# Playtime Requirements" = 60 "# Required Account Age" = 0 +"# Required Character Age" = 0 "# Spawn Positions" = 1 "# Total Positions" = 1 [WARDEN] "# Playtime Requirements" = 300 "# Required Account Age" = 7 +"# Required Character Age" = 0 "# Spawn Positions" = 1 "# Total Positions" = 1 diff --git a/config/maps.txt b/config/maps.txt index e63e709eb998f..bc5373ce3548e 100644 --- a/config/maps.txt +++ b/config/maps.txt @@ -13,18 +13,14 @@ Format: votable (is this map votable) endmap +# Production-level maps. + map birdshot #default maxplayers 66 votable endmap -map metastation - minplayers 25 - #voteweight 0.5 - votable -endmap - map deltastation minplayers 50 votable @@ -35,8 +31,9 @@ map icebox votable endmap -map tramstation - minplayers 35 +map metastation + minplayers 25 + #voteweight 0.5 votable endmap @@ -45,9 +42,18 @@ map northstar votable endmap +map tramstation + minplayers 35 + votable +endmap + +# Debug-only maps. -map runtimestation +map gateway_test endmap map multiz_debug endmap + +map runtimestation +endmap diff --git a/config/spaceruinblacklist.txt b/config/spaceruinblacklist.txt index 2c3733f927fc3..f0851b1474ce1 100644 --- a/config/spaceruinblacklist.txt +++ b/config/spaceruinblacklist.txt @@ -35,6 +35,7 @@ #_maps/RandomRuins/SpaceRuins/derelict6.dmm #_maps/RandomRuins/SpaceRuins/derelict7.dmm #_maps/RandomRuins/SpaceRuins/derelict8.dmm +#_maps/RandomRuins/SpaceRuins/derelict9.dmm #_maps/RandomRuins/SpaceRuins/dj_station.dmm #_maps/RandomRuins/SpaceRuins/emptyshell.dmm #_maps/RandomRuins/SpaceRuins/fasttravel.dmm diff --git a/dependencies.sh b/dependencies.sh index b24b85d55b239..6162b349b5141 100644 --- a/dependencies.sh +++ b/dependencies.sh @@ -8,7 +8,7 @@ export BYOND_MAJOR=514 export BYOND_MINOR=1588 #rust_g git tag -export RUST_G_VERSION=1.2.0 +export RUST_G_VERSION=3.0.0 #node version export NODE_VERSION=14 diff --git a/html/changelogs/AutoChangeLog-pr-75828.yml b/html/changelogs/AutoChangeLog-pr-75828.yml deleted file mode 100644 index 4206f43448efe..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-75828.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "necromanceranne" -delete-after: True -changes: - - bugfix: "Bows properly update their ammo when stored, dropped and stowed. You cannot load a bow without holding it in your inactive hand. You have to hold it to keep the bow loaded." - - qol: "You can remove an arrow from the bow with alt+click, much like other ballistic weapons." - - bugfix: "The divine bow can be properly stored in the chaplain armor's suit storage, much like all other bulky null rods." - - sound: "Bows have sounds for drawing, firing and loading." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-75928.yml b/html/changelogs/AutoChangeLog-pr-75928.yml deleted file mode 100644 index abcf558647c3c..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-75928.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - bugfix: "microwave's(after it has finished cooking) & other machine's that spit out contents don't spit out assemblies/signallers attached to it's wires." - - bugfix: "signallers can be picked up if you attached them to a machine's wire & later deconstructed that machine without detaching it first." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-75959.yml b/html/changelogs/AutoChangeLog-pr-75959.yml deleted file mode 100644 index b5343d4295bd4..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-75959.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Momo8289" -delete-after: True -changes: - - rscadd: "Updated the Patch of Eden lavaland ruin with a new item" - - rscadd: "Added the Plasma flower item, which can be used as an upgraded plasma MOD core" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-75966.yml b/html/changelogs/AutoChangeLog-pr-75966.yml deleted file mode 100644 index df999028995f2..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-75966.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ZephyrTFA" -delete-after: True -changes: - - bugfix: "Trees and Coconuts are no longer immune to singularities." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-75975.yml b/html/changelogs/AutoChangeLog-pr-75975.yml deleted file mode 100644 index a83e43dfc5077..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-75975.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "LT3" -delete-after: True -changes: - - qol: "ID card linking now preloads your bank account number" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-75978.yml b/html/changelogs/AutoChangeLog-pr-75978.yml deleted file mode 100644 index d05875628a27d..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-75978.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MTandi" -delete-after: True -changes: - - qol: "Chemical burner can be crafted from any open container, not just beakers" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-75993.yml b/html/changelogs/AutoChangeLog-pr-75993.yml deleted file mode 100644 index b99858c746c64..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-75993.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "FernandoJ8" -delete-after: True -changes: - - spellcheck: "adjusted font size from 30px to 15px" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-76002.yml b/html/changelogs/AutoChangeLog-pr-76002.yml deleted file mode 100644 index ce3d7871f535d..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-76002.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - bugfix: "Maybe fixes minor bugs in disease cure, revolution, hooded suit code" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-76004.yml b/html/changelogs/AutoChangeLog-pr-76004.yml deleted file mode 100644 index 624b7d77dddbf..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-76004.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "LT3" -delete-after: True -changes: - - bugfix: "Tram controls no longer randomly go blank on Birdshot" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-76013.yml b/html/changelogs/AutoChangeLog-pr-76013.yml deleted file mode 100644 index 7204aa5bab38b..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-76013.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Cobby" -delete-after: True -changes: - - bugfix: "Droppers/Beakers will now go to 1u/15u on the FIRST leftclick." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-76017.yml b/html/changelogs/AutoChangeLog-pr-76017.yml deleted file mode 100644 index de34f68f4c011..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-76017.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Couls" -delete-after: True -changes: - - admin: "fix combat logs for tabling and disposal shoving" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-76022.yml b/html/changelogs/AutoChangeLog-pr-76022.yml deleted file mode 100644 index aa2a104a70689..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-76022.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Hatterhat" -delete-after: True -changes: - - bugfix: "MOD plasma cores' improved recharging from sheets (2000 charge up from 1500) is back again." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-76025.yml b/html/changelogs/AutoChangeLog-pr-76025.yml deleted file mode 100644 index f7fbb01a8459d..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-76025.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - code_imp: "Adds some runtime safety to Cinematic code" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-76026.yml b/html/changelogs/AutoChangeLog-pr-76026.yml deleted file mode 100644 index 2f516eedad803..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-76026.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "DaydreamIQ" -delete-after: True -changes: - - qol: "The CC pod bay now has proper morgue facilities that don't clip through a glass window" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-76035.yml b/html/changelogs/AutoChangeLog-pr-76035.yml deleted file mode 100644 index 1d1ef7c564d28..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-76035.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - refactor: "don't send gas name to gas filter UI as the name is already decoded there from it's ID" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-76051.yml b/html/changelogs/AutoChangeLog-pr-76051.yml deleted file mode 100644 index 70ce25a191fef..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-76051.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "bobbahbrown" -delete-after: True -changes: - - server: "Fix log categories being erroneously excluded from log files." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-78738.yml b/html/changelogs/AutoChangeLog-pr-78738.yml new file mode 100644 index 0000000000000..59df6d45a9ef6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-78738.yml @@ -0,0 +1,4 @@ +author: "Hatterhat" +delete-after: True +changes: + - qol: "Miners can now tag monster spawners (necropolis tendrils, animal dens, demonic portals, and netherworld links) by using their mining scanner on it, which updates their GPS tag (and/or gives them one) to give it a numerical designation and a short identifier for what it's spawning." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-78746.yml b/html/changelogs/AutoChangeLog-pr-78746.yml new file mode 100644 index 0000000000000..8f2ca33095a7b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-78746.yml @@ -0,0 +1,4 @@ +author: "carlarctg" +delete-after: True +changes: + - qol: "Added slapcrafting to unloaded tech shells, click on them with ingredients to quickly craft your shell." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-78751.yml b/html/changelogs/AutoChangeLog-pr-78751.yml new file mode 100644 index 0000000000000..aaa9365a88206 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-78751.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "People who are irremediably bald can still grow a beard with barber aid." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-78752.yml b/html/changelogs/AutoChangeLog-pr-78752.yml new file mode 100644 index 0000000000000..352f9465013e6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-78752.yml @@ -0,0 +1,4 @@ +author: "san7890" +delete-after: True +changes: + - refactor: "Sloths are now basic mobs, however their overall sluggish behavior shouldn't have changed much- let us know if anything is broken." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-78781.yml b/html/changelogs/AutoChangeLog-pr-78781.yml new file mode 100644 index 0000000000000..99194b521fc62 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-78781.yml @@ -0,0 +1,4 @@ +author: "YehnBeep" +delete-after: True +changes: + - qol: "\"prison\" intercoms have been renamed to \"receive-only\" intercoms to make it clearer they cannot transmit." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-78785.yml b/html/changelogs/AutoChangeLog-pr-78785.yml new file mode 100644 index 0000000000000..b0aa0a299a6a7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-78785.yml @@ -0,0 +1,4 @@ +author: "Melbert" +delete-after: True +changes: + - bugfix: "Fixed an error from reading an ID card closely when you can't read" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-78801.yml b/html/changelogs/AutoChangeLog-pr-78801.yml new file mode 100644 index 0000000000000..15d0dbf5a51b7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-78801.yml @@ -0,0 +1,4 @@ +author: "LT3" +delete-after: True +changes: + - image: "Text alignment on ID cards slightly adjusted" \ No newline at end of file diff --git a/html/changelogs/archive/2022-10.yml b/html/changelogs/archive/2022-10.yml index 119b93c0576e7..5f26a03c00585 100644 --- a/html/changelogs/archive/2022-10.yml +++ b/html/changelogs/archive/2022-10.yml @@ -943,7 +943,7 @@ - refactor: Refactored "secluded locations" into a trait Paxilmaniac: - code_imp: The dmi that reagent holders take fill icons from is no longer hard - coded as reagentfillings.dmi, and can be changed using the fill_icon variable + coded as reagent_fillings.dmi, and can be changed using the fill_icon variable Rhials: - bugfix: The disease outbreak events will no longer attempt to fire if there are no valid players to infect. diff --git a/html/changelogs/archive/2023-06.yml b/html/changelogs/archive/2023-06.yml index e35646eb6e586..bbb195d5d3494 100644 --- a/html/changelogs/archive/2023-06.yml +++ b/html/changelogs/archive/2023-06.yml @@ -450,3 +450,627 @@ - bugfix: Fixes a stuck lightbulb in medbay treatment center. Also fixes an accidental placement of vents/scrubbers which lead to escaping xenos. - spellcheck: corrects a typo in most ethereal drinks. +2023-06-15: + Cobby: + - bugfix: Droppers/Beakers will now go to 1u/15u on the FIRST leftclick. + Couls: + - admin: fix combat logs for tabling and disposal shoving + DaydreamIQ: + - qol: The CC pod bay now has proper morgue facilities that don't clip through a + glass window + FernandoJ8: + - spellcheck: adjusted font size from 30px to 15px + FlufflesTheDog: + - bugfix: VERY small amounts of a gas (<0.0001 mol) in pipenets will once again + be fully removed + Hatterhat: + - bugfix: MOD plasma cores' improved recharging from sheets (2000 charge up from + 1500) is back again. + LT3: + - qol: ID card linking now preloads your bank account number + - bugfix: Tram controls no longer randomly go blank on Birdshot + MTandi: + - qol: Chemical burner can be crafted from any open container, not just beakers + Melbert: + - bugfix: Maybe fixes minor bugs in disease cure, revolution, hooded suit code + - code_imp: Adds some runtime safety to Cinematic code + Momo8289: + - rscadd: Updated the Patch of Eden lavaland ruin with a new item + - rscadd: Added the Plasma flower item, which can be used as an upgraded plasma + MOD core + SyncIt21: + - refactor: don't send gas name to gas filter UI as the name is already decoded + there from it's ID + - bugfix: microwave's(after it has finished cooking) & other machine's that spit + out contents don't spit out assemblies/signallers attached to it's wires. + - bugfix: signallers can be picked up if you attached them to a machine's wire & + later deconstructed that machine without detaching it first. + ZephyrTFA: + - bugfix: Trees and Coconuts are no longer immune to singularities. + bobbahbrown: + - server: Fix log categories being erroneously excluded from log files. + necromanceranne: + - bugfix: Bows properly update their ammo when stored, dropped and stowed. You cannot + load a bow without holding it in your inactive hand. You have to hold it to + keep the bow loaded. + - qol: You can remove an arrow from the bow with alt+click, much like other ballistic + weapons. + - bugfix: The divine bow can be properly stored in the chaplain armor's suit storage, + much like all other bulky null rods. + - sound: Bows have sounds for drawing, firing and loading. +2023-06-16: + Ghommie: + - rscadd: 'Expanded the Experimental MODsuit Bepis node with three new modules: + Magneto Charger, Recycler and Shooting Assistant.' + - rscadd: Added a Riot Foam Recycler module to the black market, as well a more + innocuous version as maint loot. + JohnFulpWillard: + - bugfix: Lava will no longer burn 6 of the mirrors in pride ruin + - bugfix: Lava will no longer burn plants that spawn in them. + MTandi: + - qol: You can name barrels with a pen now, changing its icon + Melbert: + - bugfix: Fix hungover people never spawning stuck in closets + Tattle: + - image: removed a stray gray pixel from the milk containers + carlarctg: + - qol: Heretic runes no longer have every single transparent pixel set to 1 alpha, + to make it easier to click on objects. + - qol: Clearing heretic runes with mansus grasp takes 0.4 seconds of standing still, + to prevent you from accidentally clearing it in combat. + - code_imp: Added code for effect remover element to use a windup if set. + mc-oofert: + - bugfix: siliconnect log tab updates correctly +2023-06-17: + ChungusGamer666: + - bugfix: You can no longer make extra cloth when looming cotton by spamming do + afters. + - rscadd: Things affected by acid now get cool particles! + EliteCreature: + - spellcheck: changed gas to correct type in description + FernandoJ8: + - bugfix: positronic brains now correctly reject the ghosts of people who have used + the suicide verb + - bugfix: Monkey revolutionaries will not be considered for a promotion into Head + Revolutionaries unless they're the only candidates... again. + - bugfix: shipping manifests labelled as erroneous due to missing contents are now + guaranteed to be missing contents + - spellcheck: shipping manifests now display repeated items on a single line + LT3: + - bugfix: Sansufentanyl won't roll as a potential extreme allergy for Hereditary + Manifold Sickness + MTandi: + - qol: Tubes and Bottles have the main reagent name prefix in Chem/CondiMaster + Melbert: + - bugfix: Fixed e-cutlasses and bananium swords having invisible inhands + - code_imp: Removed boilerplate from transforming component + - bugfix: Ghosts can click on active gateways to teleport to the destination set. + Doesn't work for secret gateways. + - refactor: Refactored Stun Absorptions (Bastard Sword, His Grace) + - refactor: Refactored Stun Immunity. Note this means that some mobs which, prior, + were immune to all forms of incapacitation are now vulnerable to some. Notably, + adult non-queen xenomorphs are now vulnerable to falling unconscious. + - bugfix: Runtimes from wingless humans using *wing + - bugfix: Fixed a cheeky way RDS revealed you were an antag before you actually + got antag. Sorry, you know who you are. + - config: RDS now has policy.json support, to allow customization of the roundstart + "anti-grief" message. + - bugfix: Runtime from ejecting beakers from a chem-master + - sound: Welding Gas Masks make the same sound effect as Welding Hard Hats when + they toggle + Momo8289: + - bugfix: After destroying unfathomable quantities of excess coins, their value + is back to what it's supposed to be! + - bugfix: The divine archer coat's hood now has armor like it's supposed to + Rhials :): + - qol: The Russian and Bounty Hunter fugitive hunter shuttles now come with enough + oxygen for everyone. + - balance: Fugitive Hunters get cool new IDs. + - balance: Fugitive Hunter shuttles are now access restricted. + - balance: The AI wires in the Bounty Hunter/Spacepol Spacevan shuttles now start + cut. + - balance: Every fugitive hunter shuttle now has a shuttle pinpointer present. + - code_imp: Fixes the spawner menu text for psyker hunter spawners. + - image: Blue and Orange mapping helper for Hunter Access. + SethLafuente: + - bugfix: fixes meatballs not having inhand sprites + SuperDrish: + - rscadd: Minimal Job Age requirments added. Disabled by default. + Youtubeboy139: + - image: Added a new Land Mine sprite + mc-oofert: + - qol: Latejoining crew start with crowbars if arrivals enviromental power is OFF + stonetear: + - bugfix: jetpack signals now pass a user argument. This fixes an error when automatically + stowing a captain jetpack into your modsuit. +2023-06-18: + ChungusGamer666: + - refactor: Species brute and burn damage modifiers are now handled by bodyparts, + instead of being universal. Go ham at the surgical bay. + - bugfix: Glass joes will no longer appear to get knocked out, while already knocked + out. + LemonInTheDark: + - admin: VV for global vars will now load MUCH faster, in exchange lists are now + perma contracted in that particular pane + Pickle-Coding: + - balance: Armour penetration calculation is now the inverse function of armour + stacking. + - bugfix: Fix space dragon fire breath hitting the same target multiple times in + a single stream. + Rhials: + - qol: Basic spider eggs no longer flash the byond window when ready to hatch. + - qol: Toy hot potatoes no longer give a ghost notification. + - qol: Deadchat will be notified in the event of an imminent macrobomb detonation, + HFR meltdown, organ harvesting, + - qol: Deadchat will be notified when a nuclear/doomsday device is activated, as + well as when a blob-infection bursts. + SyncIt21: + - bugfix: finishing & closing the turbine core rotor part will now connect itself + to the cable beneath it allowing it to share its produced power with everyone. + - bugfix: turbine's now give detailed balloon alerts if you have a missing component, + or something is not aligned correctly during turbine construction + - bugfix: turbine's will not produce power in vaccume + - bugfix: turbine's won't function if any of it's components are damaged or misaligned + after linking or during processing + - bugfix: you need to be in proximity of the airlock painter to eject its cartridge. + - bugfix: you don't hit the windoor after it has finished opening/closing. + YehnBeep: + - rscdel: Positronic brains no longer check for suicide verb use. + - bugfix: Birdshot now has an (oddly placed) atmosdrobe. + ZephyrTFA: + - bugfix: Deconstructing a papercutter will now spit out its internals if present. + - qol: Papercutters now have contextual tips +2023-06-19: + ATH1909: + - bugfix: In addition to the beakers and bottles they could already hold, mediborg + beaker apparatuses can now hold test tubes. + - spellcheck: The descriptions of beaker and drink apparatuses have been updated + to more accurately reflect what they can and can't hold. + ChungusGamer666: + - bugfix: Exotic blood types no longer persist through species change if the new + species does not have an exotic blood type + Melbert: + - bugfix: Fix Hard Delete from the captain's spare ID code paper + - bugfix: Fixed a maint loot spawner located inside a wall in North Star Chemistry + Lab Maintenance + - bugfix: Fix hard delete in traitor trap tool objective + - bugfix: Fixed hard delete with Kinetic Crusher causing the projectile function + to brick + OrionTheFox: + - bugfix: fixed the context tips on papercutters + - bugfix: fixes papercutters not properly updating their icons, removing their stored + papers/blades, and eating papers when one is already stored + Pepsilawn: + - bugfix: you cannot use departmental budget cards as withdrawal sources for NT + Pay anymore + Time-Green: + - rscadd: Adds shuttle events! If shuttle escapes weren't exciting before (doubtful), + they definitely are now! I'm joking it's mostly an atmosphere thing. + - admin: 'Adds an admin panel to interact with shuttle events, under the Events + tab: Change Shuttle Events' + - bugfix: Objects spawned in hyperspace will properly catch hyperspace drift +2023-06-20: + ChungusGamer666: + - rscadd: Food now gets stink lines when going bad. Uh oh, stinky. + DaydreamIQ: + - qol: Abductor organ surgery steps shifted around to match other surgeries + GoldenAlpharex: + - bugfix: Wheelchairs now make noises when they're meant to again, and don't make + noises on the tram nor on conveyor belts + MTandi: + - qol: You can make hairless hide from the entire stack of hides at once + Melbert: + - qol: Categorizes chef vendor + Mey-Ha-Zah: + - image: 'Updated several Null Rod Graphics. Also updated: the supermatter sword.' + OrionTheFox: + - qol: made Balaclavas layer below glasses and radios + SethLafuente: + - bugfix: Fixes a few Interdyne Pirates map flaws + - bugfix: fixes holymelons not having inhand sprites + distributivgesetz: + - rscadd: Photocopiers now use actual paper instead of materializing it out of thin + air. + - rscadd: Adds the "Access Request" form. + - refactor: Greatly improve the reliability and performance of photocopiers. + - qol: Changed the blanks so they look nicer, whilst also fixing the lawsuit request + form. + - qol: Nanotrasen's bureaucracy division has ""improved"" the quality of their printer + toner after many complaints from furious customers. +2023-06-21: + Addust: + - bugfix: somehow, somewhere, a ship's engine has been changed. + Couls: + - qol: Welders now have a more consistent fuel usage + JohnFulpWillard: + - bugfix: Maintenance data disks now properly transfer from PC to disk + - bugfix: Disks can no longer be flooded with the same app repeatedly. + LT3: + - spellcheck: Fixed a few typos + Rhials: + - bugfix: The walls adjacent to the Infiltrator docking port will no longer bend + diagonally into walls. + SyncIt21: + - bugfix: Modular machinery computer UI opens again + ZephyrTFA: + - bugfix: Cat Butcherer can no longer remove a tail you don't have. + - bugfix: You can no longer manipulate "None" organs + carlarctg: + - bugfix: Fixed being unable to reimburse syndicate spawners via uplinks. This includes + nukie reinforcements, cyborgs, and holoparasite injectors. + - refactor: Turned TC reimbursement into a bespoke element. + - spellcheck: Tuned demon's blood message when there's no ghosts to pick to be a + little more understandable and sensible. +2023-06-22: + Ghommie: + - bugfix: Fixed the honourbound trauma not reacting to attacks from basic mobs + - bugfix: Fixed the "Declare Evil" spell not working against the medical department. + Guillaume Prata: + - balance: The Atmospheric MODsuit now comes pre equipped with the quick carry module. + Go save some lives! + Helg2: + - bugfix: autolathe, protolathe, mech fabricator and component printers material + capacity are now in 20 times less, as intended. + - bugfix: protolathe material menu now should display material ejecting correctly. + Jolly: + - qol: The potted plants have been changed slightly behind the scenes. Mappers may + enjoy being able to pick a wider selection of plants to put in maps now, because + they've all been made into their own items. + LemonInTheDark: + - bugfix: Maps loaded post init will no longer randomly enter a failed state. Hopefully. + Melbert: + - bugfix: The colossus's finale attack is now 100x more lethal, because it was firing + 100x fewer projectiles than intended + - bugfix: Fix shooting guns without a magazine loaded making no fire sound effect + - bugfix: Fixed EMP'd / signaled microwaves not running as they should + - bugfix: Fix runtimes from Bileworms targeting mechas (or other objects people + are hiding in) + Peliex: + - bugfix: changed station floor tiles to be worth 25 instead of 50, one quarter + of an iron sheet. + Rhials: + - bugfix: attacking non-carbon mobs with a cuffsnapping object will no longer runtime. + Sealed101: + - sound: explosive implant's beeps get louder as it gets closer to exploding + - bugfix: fixed mecha generators using way too much fuel due to using the old values + of material units per sheet + - bugfix: fixed sechailers/SWAT masks not using the installed air filter + - bugfix: fixed Godwoken Syndrome VoG commands triggering the spam filter + SyncIt21: + - bugfix: ' material container[and hence autolathe] now won''t touch the content''s + of abstract/hologram item''s like the tentacle gun' + - bugfix: material container[and hence autolathe] consuming indestructible items + - bugfix: material container[and hence autolathe] cosuming half the content's of + an object and leaving out the rest if there isn't space producing broken behaviour + in those item's + - qol: material container[and hence autolathe] display's the item name consumed + and it's material worth to let player's fully know the content's of the item + being recycled + - rscadd: air sensor's are craftable + - refactor: air sensor's can now be turned off by hand and can only be deconstructed + by a welding tool + - refactor: removed `Params()` proc + - qol: unwrenched air sensors can be picked up & recycled like regular item's + - rscdel: air sensor are removed from the RPD UI + - qol: air sensor's are no longer restricted by their unique ID's which mean you + can craft as many air sensors as you want. + TheVekter: + - qol: Embedding an object inside a cake or loaf of bread now requires a right-click + instead of a left-click. No more accidentally putting your knife inside it! + - qol: Added context tips for slicing, embedding, and removing embedded items from + cake, bread, and cheese wheels. + carlarctg: + - bugfix: Adds wound armor to ALL jumpsuits that were missing it + cnleth: + - bugfix: Rockets can no longer embed in people and cause blunt wounds instead of + piercing + kawoppi: + - image: added lizard inhand- and onhead sprites + - image: added space lizard inhand- and onhead sprites + - bugfix: changed held weight class of lizards from normal to tiny + necromanceranne: + - rscadd: The Vorpal Scythe, a special null rod variant that gains power from beheading + people! But it is fickle about when and how you use its power. Replaces the + Reaper Scythe. + - rscadd: Beheading via the special death knell attack empowers the scythe, but + only on humans with a mind, and requires you to use the right-click button to + wind up the slice. If you succeed, you empower your scythe for a bit! + - rscadd: If they don't have a mind, you cause the heads to float around. OoooOOOooo! + Spooky! + - rscadd: With the sinister crystal that holds the Vorpal Scythe within bound to + your arm, you are Morbid! You love to do pretty unsettling things, like dissections + for fun! But helping the living stay alive is abhorrent to you! + - rscadd: '...unless you get to do it while screaming ''IT LIVES!'' via Revival + surgery. Screw conventional medicine and science, you know the true way to bring + back the dead!' +2023-06-23: + Cheshify: + - bugfix: Virology disposals now route directly to space, rather than sending their + nasty tubes to cargo. + - bugfix: A single maintenance spawner was removed from a wall by plumbing. + LemonInTheDark: + - bugfix: Dehardcodes some stuff with tram windows, they'll be easier to map with + now + - refactor: Border objects can now smooth with each other. I'm sure something cool + will come of this + Melbert: + - bugfix: Fix a runtime involving Bilingual Curators + - qol: Bilinguals get a message on spawn reporting which language they've learned, + or a message reporting they have learned no language if they're already fluent + in all possible ones. + TheVekter: + - rscadd: Adds a shark plush, obtainable from Cargo for a nominal fee. + - rscdel: Removed plush cucumber by popular request. Cucumber has been replaced + by the shark plushie in arcade machines. + YehnBeep: + - bugfix: Science department hallways now have unrestricted one-way exits on Delta, + Birdshot, and Icebox, to make these maps consistent with the others. +2023-06-24: + Guillaume Prata: + - rscadd: 'New Wizard spell branch: Vendormacy! Summon runic vending machines with + your Vending Scepter, force push them on your enemies to squish them or blow + them up while they are busy buying from the machines.' + Hatterhat: + - rscadd: Baseballs can now be crafted with 3 leather. + Helg2: + - qol: pill press' max volume for bottles are 50, as the volume of bottles itself. + Improvedname: + - balance: Weakens summoned stickmen to be 1 or 2 hit + LT3: + - image: Delam and tram flipsigns have been replaced with information displays + - bugfix: Tram hit count is centrally managed instead of independently on each sign, + so they won't get out of sync + Melbert: + - bugfix: The Syndicate Assault Cyborg can autofire their LMG + SyncIt21: + - code_imp: makes sure cargo computer doesn't use `usr` var inside `ui_act()` which + could cause undefined behaviour + Wallem: + - image: Tweaks cardboard sheet sprite + YehnBeep: + - qol: Instrument delivery beacons now fit in pockets. + necromanceranne: + - bugfix: Arm implants properly handle EMPs depending on whether it is robotic or + organic. No longer can you EMP an organic organ! + timothymtorres: + - qol: Add UI preference menus for AI hologram and status displays +2023-06-25: + ATHATH: + - rscadd: Adds a variant of the external organ manipulation surgery for robotic + body parts, similar to the robotic version of the internal organ manipulation + surgery. It uses the same procedure as non-head/torso prosthetic organ manipulation. + - rscadd: In layman's terms, augged people can get frills, antennae, wings, tails, + etc. attached to them now. + - qol: The suitability of crowbars in the "manipulate organs" and "manipulate features" + steps has been boosted from 55% to 100%, but only for the robotic versions of + those steps. Their suitability remains 55% for organic organ manipulation. + ChungusGamer666: + - refactor: Mutant livers can now handle chemicals in special ways. Currently, only + plasmaman, skeleton and golem livers do it. Every other species is the same. + Ghommie: + - bugfix: arrows can now be actually coated with reagents. + - admin: The Debug and Admin MODsuits now take a lot less time to (de)activate. + 2 and 0.5 seconds respectively, compared to the default of 10s. + Melbert: + - rscadd: 'Wizarditis Improved. Those infected will now randomly cast one of the + following (weakened) spells at max stage: Teleport, Disable Tech, Mutate, Knock, + Forcewall, Blink, Smoke, Spacetime Distortion, Timestop, Repulse, Blind, Lightning + Bolt, or Swap' + - rscadd: A source of antimagic will prevent Wizarditis's ill effects, but won't + cure you. + Pickle-Coding: + - bugfix: Fix atoms not applying proper armour penetration logic. + - bugfix: Fix silenced living armour penetration not using proper armour penetration + logic. + - code_imp: Added macro for calculating armour penetration. + Seven: + - balance: Acid on a turf no longer immediately applies acid to its contents + - bugfix: Acid applied on a tile will no longer damage pipes below that tile + - bugfix: Xeno's corrosive acid no longer instakills mobs + - bugfix: Xenos can now touch acid + - bugfix: toys, stamps, and spacecash no longer has a missing texture when put into + suit storage + - qol: stamps are now allowed suit storage items in the hop, qm, and cargo wintercoats + SyncIt21: + - bugfix: glass bottles with reagents can be used for crafting, empty glass bottles + will be used as tools(e.g. empty glass bottle as rolling pin) + - bugfix: glass bottle with welding fuel can be used for crafting improvised shotgun + shells + - bugfix: bubble gum crate actually looks correct + - bugfix: fixes balloon alert runtime when spider webs are destroyed. + Tattle: + - admin: build mode help text is in an examine block + - admin: adv build mode and fill now have item previews + Wallem: + - image: Resprites plumbing machines + Youtubeboy139: + - image: Added new Space Beer sprite + - image: Added new Carp Lite sprite + - image: Added new Ale Bottle sprite + - image: Added new Two-Time Root Beer sprite + carlarctg: + - rscadd: Adds digital clocks, can be found in all the stations' hallways! Most + noticeably in bars or the bridge. They can also be lathed. + kinneb: + - image: Resprited the Limb Grower + norsvenska: + - rscadd: Christmas now has special station prefixes. +2023-06-26: + Funnytoilet: + - qol: Allows you to craft plastitanium shards. + Ghommie: + - bugfix: Fixes the lights from Tinea Luxor being stackable to the point of crashing + the game for others. + IndieanaJones: + - balance: Xenos have been rebalanced, removing their hardstuns on their disarm + and neurotoxin, along with a slew of other changes. Xenos have received buffs + to their more unique abilities in return. + - bugfix: Fixed simplemobs ignoring xenomorph's melee damage values when being attacked + by them. + winterboekje: + - sound: Adds unique sounds to library barcode scanner + - image: Removes soul from library +2023-06-27: + ChungusGamer666: + - refactor: Liking/disliking food is now handled by the tongue organ, not the species. + Also, having a failing tongue means you can't taste food properly! + - rscadd: You can read peoples' tongues now, if you have the entrail reading skillchip. + GPeckman: + - bugfix: The lavaproof tracks cyborg upgrade now protects against liquid plasma, + the Icebox equivalent of lava. + LovliestPlant: + - qol: '[Birdshot] Adds layer adapters to gas tank output hookups in atmospherics' + - qol: '[Birdshot] Adds additional navigation verb landmarks' + - bugfix: '[Birdshot] Fixes entrances to some departments from maints not requiring + department access' + - bugfix: '[Birdshot] Converts the guard locker in perma to a normal security officer''s + locker' + - bugfix: '[Birdshot] Adds an exterior outlet vent for the incinerator' + Momo8289: + - bugfix: Items that shouldn't have been stacking should no longer stack. + ReinaCoder: + - image: the mosin and prime nagants' mob sprites have been updated + TheVekter: + - bugfix: Added the missing medical laptop to the morgue on Northstar. + axietheaxolotl / viro: + - image: resprited surgery tables, and stasis beds + cnleth: + - bugfix: Symbols display correctly when sending messages via mind link + the-og-gear: + - sound: One (1) new space ambience track has been added. Good luck and godspeed. +2023-06-28: + ChungusGamer666: + - bugfix: Plasma will now heal plasmamen properly + Ghommie: + - rscadd: You can now revive dead fishes, bees and (mindless) mice with a lazarus + injector. + - balance: Tom, the mouse, no longer counts toward the mice population cap. + Hatterhat: + - balance: The Regal Condor's base spread has been reduced to 0, like damn near + every other gun that exists. + LT3: + - refactor: Refactored maptext (those floating words) + - bugfix: Fixed special chat bubbles for yelling, clown, redtext, greentext + - bugfix: Fixed alignment of status display text + - code_imp: Status displays now synchronize their message lines when scrolling + - bugfix: MetaStation's bridge incident counter and clock no longer overlap + - bugfix: Deltastation's missing incident counter has been found. Does that count + as an incident? + - qol: Tramstation bridge and medbay now have a clock where the tram hit counter + used to be + Melbert: + - bugfix: You can once again "too slow" someone with a high five + Momo8289: + - bugfix: Had to destroy a lot more of em, but the value of iron coins are now back + to normal + SapphicOverload: + - bugfix: fixed hostile mobs trying to attack supermatter discharge bolts + Seven: + - qol: Mops, some cleaning items, and light replacers now use balloon alerts + - rscadd: Surgical caps now actually hide your hair + Time-Green: + - bugfix: hardcore random now gives you a species specific name + Youtubeboy139: + - rscadd: Added new Pirate Boots + - image: Added new Pirate Bandana sprites + - image: Added new Pirate Hat sprites + - image: Added new Pirate Uniform sprites + - image: Added new Sailor Uniform sprites + - image: Added new Pirate Coat sprites + - image: Added new Pirate EVA gear sprites + - image: Added new Cutlass sprites + - image: Added new Energy Cutlass sprites + - image: Added new `hgpirate` suit and hat sprites + vinylspiders: + - bugfix: sliding puzzles can no longer have their icons erased by the hand labeler +2023-06-29: + ChungusGamer666: + - bugfix: Clarke ore box now has a less confusing dump contents button. + Funnytoilet: + - bugfix: Plasmamen can now get HMS + Iamgoofball, Nadare, ddPn08, Mangio621, the rest of the RVC dev team: + - rscadd: Improves the audio quality and speaker fidelity by implementing Retrieval + Voice Conversion as an intermediary layer, utilizing the repository at https://github.com/ddPn08/rvc-webui. + - rscadd: Leverages RVC to allow players to set a pitch for their voice. + - rscadd: Makes silicons utilize a player's chosen voice preference on their character + slot, and adds a preview button to hear the voice as a silicon on character + creation. + - rscadd: Adds a toggle on character creation to disable having a voice on a specific + character slot. + - rscadd: Adds support for per-tongue voice filters. + - rscadd: Reworks the silicon voice effect to be a special effect done on the TTS + server level instead of via normal filters. + - rscadd: Reworks the vending machine effect to use the new robotic voicebox effect. + Jolly: + - spellcheck: Changeling hallucination sting will now tell you it costs 10 chemicals. + It always did, but now its there. Cheers? + LemonInTheDark: + - balance: Tcomms now works across connected (vertically) zlevels. No more hunting + in maint for the relay. + Melbert: + - qol: Scanning apps (Lifeline app) start with a scan + - bugfix: Fixes a potential exploit in radar apps + Rhials: + - rscadd: The abductor equipment vendor now offers a hacking/medical hypertool, + at a price of 2 research points. + - rscadd: The abductor equipment vendor now sells decorative abductor posters, at + a price of 1 research point. + - rscadd: The abductor equipment vendor now sells a cow, at the price of 1 research + point. + - bugfix: Fixes a runtime when trying to probe non-human mobs. + - image: Some abductorized versions of existing wall posters and an alien hypertool. + - code_imp: The abductor shop listings now use lists of items, rather than single + build paths. + - code_imp: The abductor_gear.dm file has been split up into a few different files. + - code_imp: Posters can now be hung on indestructible walls. + SyncIt21: + - bugfix: cable layers 1 & 3 can now be used by machine's like emitters, smes, tesla + coil & turbine. + - bugfix: terminals(smes & apc) can operate on different cable layers by installing + them with right click + chemistrymain2: + - balance: Syndicate simplemob fire-rate raised to one shot per second. + tf-4: + - bugfix: Brand intelligence can no longer affect off-station vendors in some specific + circumstances. +2023-06-30: + Chadley: + - bugfix: fixes the EHMS injector's do_after() + - code_imp: Improves the code for the disease scan proc (thank you fikou) + ChungusGamer666: + - refactor: Head rendering code has been updated significantly... Again. Please + report any issues with hair, facial hair, lipstick and such. + - refactor: Species speed is now stored in bodyparts. Leg transplants from slower + species will make you slower. + - bugfix: Healthy tongues will no longer randomly start slurring + - refactor: A significant species refactor happened, report any issues on the github. + DATA-xPUNGED: + - rscadd: Added butter slices, which you can make by cutting butter into 3. + - qol: Recipes that once required butter now only require a slice of it. With the + exception of the butter on a stick, of course. + - balance: Butter now requires 25 milk to mix and has 3 times as much nutriment. + - image: Resprited butter and butter on a stick using bluespace technology, managing + to compress more butter into a smaller space + Ghommie: + - bugfix: Fixed snatcherprods potentially giving held objects a one-way ticket to + nullspace if thrown at someone by something that's not a mob. + LemonInTheDark: + - balance: Duffelbags will now only make you slow while they are unzipped. As a + tradeoff, you now need to stand still and zip/unzip them to access their contents/not + move real slow. + Melbert: + - bugfix: Fix Debug verb "Spawn full crew" + - bugfix: Fix everyone being vampires + Sealed101: + - bugfix: fixed RPD switching layers on mousescroll when not in active hand + - qol: installing an RPD wrench upgrade & reprogramming a pipe via RMB produces + a balloon alert + Seven: + - bugfix: Fixes changelings not being put into their headslug when using last resort + - bugfix: Fixes changeling headslugs not putting their eggs into dead bodies + Singul0: + - bugfix: Names for Interdyne pirates are now less bizzare + Youtubeboy139: + - image: Added new Police Whistle sprites + oranges: + - balance: Ashlizards can no longer use the shuttle console to go on station diff --git a/html/changelogs/archive/2023-07.yml b/html/changelogs/archive/2023-07.yml new file mode 100644 index 0000000000000..a1847b8c60851 --- /dev/null +++ b/html/changelogs/archive/2023-07.yml @@ -0,0 +1,1301 @@ +2023-07-01: + Cheshify, Kinnebian, and RedSentry27: + - rscadd: Maintenance engineers have sent out blueprints across the sector for a + new laser musket. + - admin: A new energy-gun toting ERT is available to send to the crew. + Jacquerel: + - bugfix: Actions granted by equipped or held items now actually appear again + LT3: + - qol: Context tooltip size increased + - bugfix: Fixed remnants of old maptext code on various things + MTandi: + - rscadd: Food and pills have a 10% chance to infect with one of three new diseases + on consumption when left for more than 5 seconds on the floor. You can wash + it to avoid disease. ChemMaster and Pill Press are added to the list of elevated + structures (Considered as tables for pills). Made harvest spawn on top of hydrotrays + to stay protected from germs. + - rscadd: 'Added three new advanced diseases: Gastritium, Carpellosis, Nebula Nausea + with static cures obtained by digesting dirty food.' + - bugfix: Food no longer decomposes on Hydrotrays, Grilles, Bonfires and all dense + kitchen machinery + - code_imp: Decomposition now uses `germ_sensitive` component and follows 5 second + rule too. + - qol: Crafted food items spawns on nearby tables (except the one behind you) instead + of dropping on floor when hands are full. + SyncIt21: + - bugfix: jetpack modules work on mod suits again + - bugfix: jetpack cyber implants also work + - refactor: removed `get_mover` callback, user is retrieved during activation + - refactor: timestop module on `on_module_triggered()` accepts user as 2nd param + Vekter: + - balance: Increased armor penetration on xenos' neurotoxin spit. Well-protected + crew members should still take more than a few hits to down but shouldn't be + immune to it. + necromanceranne: + - rscadd: Coroners are now Morbid! + - rscadd: Coroners come with a series of special tools that are especially good + at performing certain surgeries if used by a Morbid individual (which the coroner + happens to be). They are found in the coroner's medkit. + - rscadd: The sorts of surgeries they enjoy are; dissections, autospies, revival + surgery, plastic surgery, organ/feature manipulations, amputations. Also eyesnatching. + - rscadd: Coroners therefore hate; tending the wounds of the living, defibrillation + and CPR. Why waste so much effort on breathers if you can't even carve them + up a bit first? + - rscadd: Coroners love pickles and pickle juice. + - rscadd: The coroner can finally put their autopsy scanner into their special medkit. + Not the compact one, though. + - rscadd: The elephant graveyard is safer to plunder for the morbid individual. + The rewards from the graveyard are now also slightly more lucrative...if you + don't care about being cursed, that is. + - balance: Roboticists get secure morgue access during skeleton shifts + timothymtorres: + - qol: Add hotkeys to APCs for AIs and borgs. Toggle environmental (ctrl + shift), + toggle lighting (shift), toggle equipment (alt), and toggle breaker (ctrl). + - qol: Remove APC UI popup when using RMB to toggle the lock. +2023-07-02: + ChungusGamer666: + - bugfix: Hair and facial hair gradients work again now + - bugfix: Facial hair colors apply properly again + - bugfix: Admin spawned characters will get hair color preferences applied properly + Ghommie: + - bugfix: Fixed the office chair being silent. My bad. + JohnFulpWillard: + - balance: Jousting now works on anything you're buckled to, not just Cyborgs. + - balance: Brooms, Pitchforks, the Captain's Sabre, and Energy swords can now be + used for jousting. + - balance: Spears need to travel a longer distance to joust now. + - balance: Jousting's knockdown and damage now only gets stronger after you've traveled + the minimum tiles needed to joust. + - balance: Silicon now only know Common, Uncommon and Robotic languages. + JupiterJaeden: + - qol: people now lie down when buckled to surgery tables, and you no longer need + cuffs to buckle someone to a surgery table + LemonInTheDark: + - bugfix: Fixes some fuck with duffelbags, them not holding enough + issues with + spawning gear in them (job shit and all) + - rscdel: Removed language encryption keys from cargo, s bad for species talking + among each other, a thing we want them to do + LovliestPlant: + - rscadd: Stethoscopes may be used on the chest, groin, or extremities to assess + organ damage, blood level, and/or suffocation damage depending on the targeted + area. + - rscadd: Shining flashlights into the mouth or eyes of other players will additionally + assess brain health, suffocation damage, and/or blood level depending on the + targeted area. + - balance: Halves the duration of the flash effect from shining lights into players' + eyes (2s -> 1s). Use combat mode to get the full duration. + Melbert: + - qol: Sivlerscale Tongue action is now a cooldown action, making it significantly + easier to use + - balance: Buffed the silverscale statue every so slightly, it now has innate armor + and can reflect lasers shot at it. But it also requires you not by lying down + to activate. + - bugfix: Fix organ damage being uncapped + Pickle-Coding: + - bugfix: Fix hypernoblium formation gas reaction rate sanity clamping not accounting + for the reduction factor. + - bugfix: Fix N2O formation gas reaction rate clamping clamping for incorrect consumption + rates. + - bugfix: Fix BZ formation reaction rate sanity clamping not accounting for N2O + decomposition factor. + - spellcheck: Improves gas monitor reaction information RP. + Sealed101: + - bugfix: fixed shotguns not clearing their "mag" correctly + - bugfix: fixed basalt turfs remaining visually dug up when refilled by an ash storm + - bugfix: fixed ash storm ending sounds looping after the storm is over + - bugfix: mechs are now snow storm immune + - bugfix: jaunt spells protect from weather when jaunting + Seven: + - bugfix: Cult communion and assert leadership can be used while your hands are + blocked or you are immobile + Vekter: + - balance: Adds a build time to window types which didn't have ones before. + - bugfix: Fixed the ORM not granting mining points if you added ore by hand instead + of dumping it on the floor. + carshalash: + - balance: We are now using space Monsanto brand rice/wheat seeds. Nutriment of + both grains has been changed to 12% from 4% +2023-07-03: + Cheshify: + - bugfix: Frontier Militia only have one general now, and have headsets. + - balance: Frontier Militia no longer have energy pistols. + Helg2: + - bugfix: Crayon suicide now properly colors you. + - bugfix: You can't put spraycans in crayon box via opening it and putting directly + in slot as intended, but balloon alerts for mime's and rainbow crayons are gone. + - qol: '"empty" balloon alert no longer appears on crayons.' + - qol: You can make crayon burgers now. + - qol: Box with throwing weapons now can hold the items it spawns with. Incredible! + - admin: Boxex of materials, debugtools and stabilized extracts now 99 of total + storage because they are meant to be debug. + Jacquerel: + - bugfix: Placing a mouse inside your chef hat will once more allow it to pilot + you around. + - rscadd: A player-controlled mouse inside your chef hat can compel you to perform + complex actions, such as flipping and spinning. You will obey because the mouse + knows better than you do. + - bugfix: You can now correctly Tend Wounds on most non-human animals. + - rscadd: You can now Remove Implants from non-human animals, just in case Ian swallowed + a macrobomb. + - bugfix: Tom will now always be a brown rat, instead of a random colour, as intended. + - rscadd: Budget cuts can sometimes effect the station's supply of Emergency Bluespace + Shelters. + Melbert: + - bugfix: Fixes a runtime from people with aphasia trauma getting deleted + - rscadd: Added a new 0 cost passive changeling ability, the Defibrillator Grasp. + - rscadd: DNA sing is now no longer innate, but 0 cost, allowing changelings to + not take it if they don't plan on using it. + - rscadd: Adds the Roach infusion to the DNA infuser. Do you want to survive a nuclear + apocalypse? Visit genetics today. + - rscadd: Adds a way to kill Roaches without splatting them. Visit botany for a + spray bottle of pestkiller. + - qol: Infuser book is more book-like + - bugfix: DNA infuser correctly gives on-success feedback messages + Time-Green: + - bugfix: urinal cakes wont decay anymore + Vekter: + - balance: Increased blob tiles' resistance to lasers to compensate for the recent + buff to laser damage. + - spellcheck: Fixed a typo on the Interdyne shuttle. +2023-07-04: + FlufflesTheDog: + - bugfix: Morbid (coroner's) tools now properly receive their speed boost in appropriate + conditions + Funnytoilet: + - qol: Matches command envirosuit helms' armor value with their hat counterparts. + GPeckman: + - qol: The health analyzer will now be more clear about how to treat burn wounds, + especially seriously infected ones. + Iamgoofball: + - bugfix: Fixes oversight with the voice disable config not working right for situations + in which a player re-enters their mob. + Jacquerel: + - bugfix: Horrid organics will no longer be made happy when mechanical chaplains + fail to heal them with a bible. + - bugfix: Lesser Form monkeys no longer maintain the name of the form you had prior + to transformation. + MMMiracles: + - bugfix: Tramstation lower Science is now less prone to cave-ins from their surrounding + maintenance corridors. + SyncIt21: + - code_imp: mat per unit values of materials now scale with material defines + Teleported-Bread: + - bugfix: Tips now mention telekenesis dusting you when used on the SM, not telepathy. + Vekter: + - rscdel: Plasma objects (statues, toilets, etc.) no longer explode when ignited. + They just release plasma like everything else plasma. (This doesn't impact injecting + plasma into cells or dipping cigars in plasma, those still explode.) + - bugfix: Removed nebula vomiting from the normal symptom pool. It should no longer + appear on regular viruses. + itseasytosee: + - spellcheck: You should see a lot less "you can not move while bucked too X" messages + where they don't make sense. + - admin: Added a petrify smite. Try it out on your least favorite player! + mc-oofert: + - rscadd: You can use cable on TTVs to make them wearable on the back +2023-07-05: + Archimus12: + - rscadd: Adds coloured large scarfs and winter coats to ClothesMate and black shoes + to ChefDrobe + - rscadd: Adds latex gloves to SciDrobe, ChemDrobe and GeneDrobe and nitrile gloves + to MediDrobe + - rscadd: Adds job headsets to GeneDrobe and RoboDrobe, ViroDrobe and ChemDrobe + - rscadd: Adds black wizard robes and black wizard hat to MagiVend + - rscadd: Adds grey backpack, grey satchel, leather satchel and grey duffel bag + to CargoDrobe + - rscadd: Organises Drobes + ChungusGamer666: + - bugfix: Bodyparts that should slow you down, will slow you down. + Ghommie: + - sound: Walking on conveyors, catwalks and tables no longer plays the footstep + sound of the turf. They have theirs. + Jacquerel: + - balance: Traitorous Coroners can now purchase the Evil MMI and Brainwashing Surgery + Chip. + - balance: Traitorous Chief Engineers can now purchase the Deployable Sentry. + Jolly: + - bugfix: '[MetaStation] There is no longer a random nondescript "item" outside + Xenobiology. No, it was NOT a Xenomorph.' + MTandi: + - bugfix: Plant bags now properly harvest items when you click on hydrotray with + it, and don't pick up anything except the harvest + - bugfix: Carpellosis gnashing checks owner's teeth availability instead of the + target's teeth + - bugfix: Patches don't have a message saying that they're dirty + Melbert: + - bugfix: Fixes some species / mobs keeping an understanding of galcom despite not + being intended to. + - qol: Prettied up the morgue of Deltastation + Momo8289: + - qol: Crates that come in the cargo shuttle now have the order ID in their name + - qol: Requisition forms are now blue, and named with the timestamp they were created + on + Time-Green: + - bugfix: abductors can get points again + YehnBeep: + - rscadd: Prisoners can now be jaywalkers + - qol: reordered a crime so it appears on the choice list alphabetically. + carlarctg: + - balance: Reduced the complexity cost of a lot of MODules. + - balance: Pathfinder 2 -> 1 + - balance: Tether 3 -> 2 + - balance: Temperature Regulator 2 -> 1 + - balance: DNA lock 2 -> 1 + - balance: Health analyzer 2 -> 1 + - balance: Sonar 2 -> 1 + - balance: Microwave beam 2 -> 1 + - balance: Drill 2 -> 1 + - balance: All visors (including NV and thermals) 2 -> 1 + - balance: Circuit Adapter 2 -> 1 + - balance: The Mining MODsuit has had its complexity increased to 13 and now starts + with the eating apparatus module, with a total base complexity of 10/13 now. + - balance: The Prototype MODsuit's active slowdown has been decreased from 1.5 (!) + to 1. + - spellcheck: Fixed a type on the energy net module. + san7890: + - server: job_config.toml should now comply with reload-configuration verb, meaning + you can hot-reload the configuration from disk and have it apply ingame automatically. + - config: The documentation for setting Minimum Character Age on a per-Job basis + has been altered to be more explicit. + - bugfix: The Minimum Character Age configuration entry is now sanitized to ensure + that it's within the codebase-defined ages, since there's no (legitimate) way + to get a character outside of those ages anyways. Invalid values will log to + the config log. +2023-07-06: + ChungusGamer666: + - bugfix: Punpun has gotten properly fitting clothes for his little chimp body + - bugfix: Creampies no longer float above the heads of monkeys + DATA-xPUNGED: + - qol: Leather satchels and wallets have been issued to the offices of Head of Personnel + all across the sector. Studies suggest a fashion increase of 34% + Jacquerel: + - bugfix: A nuclear operative who is a slime will now correctly drop the disk upon + death. + - image: New directional sprites for spiderlings, with movement animations. + - bugfix: Dead spiderlings will be the same colour as they were when they were alive. + - bugfix: Tarantula spiderlings are no longer invisible, + - rscadd: People who cannot read can interact with the tram console to send it to + a random station. + NotDhu: + - bugfix: Replaced the security PDA painter in the CMO's office on Birdshot with + a medical PDA painter. + SomeRandomOwl: + - qol: Request Internet Sound now has the option to credit the person who requested + the Sound. Defaults to anonymous. + Vincent983: + - balance: Improved spacepol jumpsuit wound armor from 5 to 10 + Vishenka0704: + - bugfix: Added a forgotten reason for not being allowed to work if the age is low. + Youtubeboy139: + - image: Added new Surgery Bed sprite + milktao: + - bugfix: fixed food preferences displaying incorrectly when examining tongues +2023-07-07: + Ben10Omintrix: + - refactor: Mushrooms have been refactors, please report any bugs/unintended behavior + - rscadd: the mushroom basic mob can eat the mushroom plant to heal itself + ChungusGamer666: + - rscadd: Added Alcoholic as a negative quirk. + - rscadd: Added Hemiplegic quirk. + Hatterhat: + - rscadd: A really old data disk with the MOD module designs for the status readout + was recovered, and has been haphazardly hotpatched into the research networks. + - rscadd: Also, the status readout module now plays a sound on death. + - qol: The MODsuit health analyzer's info tab health readout can now be disabled + in its settings. + Jacquerel: + - balance: Guard spider web statues despawn as the ability comes back off cooldown. + - balance: Spiderlings now only move at light speed if they're on webs, stay safe + little guys. + - bugfix: Spiders once again have random numbers after their names. + - bugfix: Mobs can once again emote (with sound) when they die. + - bugfix: Basic mobs will tell you whether they are alive if you examine them. + Jolly: + - image: The plastic spoon sprite has been nudged to appear more centered. + LT3: + - image: More maptext and font tweaks + - spellcheck: Context tooltips too small, too big... just right? + LemonInTheDark: + - bugfix: Gas, like plasma, will now properly display on multiz stations + Melbert: + - bugfix: Fixed EMPing a cybernetic heart not implanted in a body not applying effects + (stopping the heartbeat temporarily) + - bugfix: Fixed an exploit involving observers + - bugfix: Fix Tinea Luxor exposing not increasing light duration + OrionTheFox: + - qol: 'put instructions on toggling bandanas into their examines. If you didn''t + already know, it can be worn as more than a mask: use in-hand to wear as a hat, + and alt-click to wear it on your neck!' + YehnBeep: + - bugfix: Engineers can now print the non-eyewear T-Ray scanner from their department + lathe. + - qol: Scientists can also print this scanner. + atlasle: + - sound: A new ambient track will now play in space + mc-oofert: + - rscadd: rcd can make girders now + - bugfix: silicons can depower airlocks via their UI again + norsvenska: + - image: Siding now uses the correct sprite on corners and endpieces. +2023-07-08: + 1393F: + - bugfix: The cursed katana shard you can get from tendril loot no longer falsely + tells you you're not supposed to have it + BlueMemesauce: + - qol: AI VOX messages are sent over announcement instead of radio + - bugfix: AI VOX messages work properly on multi-Z stations + ChungusGamer666: + - rscadd: You can now put sandstone bricks in pillows to... make them deadlier? + - rscadd: Added colorblindness as a mild brain trauma. + - rscadd: Added two new quirks, prosthetic organ and tin man. Essentially, they + replace organs with bad bad not good cybernetic counterparts. + Ghommie: + - refactor: Replaced hardcoded "safeties" for lava, chasms and ignoring turf slowdowns + on catwalks with traits. + - balance: much like catwalks, tables and conveyors also disable turf slowdowns. + - balance: slippery turfs won't slip you when walking on a table. + - bugfix: Fixed an edge case in which a mob standing on a lava turf would be left + visually but permanently on fire if the lava is changed to another kind of + turf. + Jacquerel: + - rscadd: A bible or lighter in your suit slot, or cowboy hat on your head will + occasionally intercept a bullet. + JohnFulpWillard: + - balance: Bilingual quirk now lets you choose your language between ones given + to roundstart species. + - balance: Foreigner and Bilingual are now mutually exclusive languages. + - bugfix: Cultists promoted to Leader no longer lose their spells (rip whoever tried + saving up blood rites) + - admin: Admins can now force promote/demote people from Cult Leader if necessary. + - code_imp: Jousting now registers/unregisters properly on two-handed items. + Jolly: + - bugfix: '[TramStation] - Removed a (possibly) unused var on the barber shop doors. + Hopefully those taking refuge in the commissary wasn''t causing too many issues.' + Jolly, timothymtorres: + - code_imp: 'Jolly: Armories across all maps have been tweaked slightly. Report + to a Nanotrasen security advisor for any missing guns, armor, helmets or anything + else that was there previously (that means, post an issue on Github if theres + an issue!!)' + - code_imp: 'timothymtorres: Random item spawners now support better control of + their X/Y pixel offset.' + Melbert: + - bugfix: Fix certain emote interactions happening twice at the same time + - bugfix: Fixed some hard deletes involving constructed cyborgs + - bugfix: Cyborgs with nodrop hats no longer lose them on tip + - refactor: Refactor of connections.js. Yeah that's it. + Toastgoats: + - rscadd: Adds the Lustrous, ethereal pirates in a big bluespace geode! + - sound: Unique scream sound for the Lustrous species. + - image: Unique head icon for the Lustrous species. + Youtubeboy139: + - image: Added new HUD sprites + - image: Added new Goggle Sprites + - image: Added new NVG sprites + - image: Removed unused/depreciated sprites in `glasses.dmi` + carlarctg: + - bugfix: Serrated bone shovels can be created with any kind of shovel now, not + just a spade (???) + - rscadd: Serrated bone shovels can be used in place of circular saw in most surgeries. + - rscadd: Added a duller (still deadly) variant of the serrated bone shovel as coroner + mail. + - rscadd: Autopsy scanners now act as advanced health analyzers on dead and seemingly-dead + people. + - rscadd: Increased the force, throwforce, and wound bonus of inert ritual knives + and scythes. + - rscadd: Coroner gloves can quickly apply medicine like nitrile gloves. + - image: Heavily reworks and resprites first aid analyzers. They now display if + they're happy, sad, angry, or warning you! Also a 'pricking' animation. + - rscadd: First aid analyzers are now found in all basic and specialized medkits. + Toxin medkits get a new* disease analyzer. Miners get a miner-colored one in + their box. + - balance: Scanning yourself with a first aid analyzer will 'create a holo-image + with treatment instructions next to your wounds', doubling the speed of treatment + of scanned wounds! + - sound: Health analyzers and gene scanners now have a scanning sound, courtesy + of CM. + - refactor: Refactored some wound code to make treatment duration changes and changes + in the description of wounds easier. + - bugfix: Fixed a dummy parent feature of the health analyzer (Verbose mode) showing + up, uselessly, on the disease and first aid subtypes. + - image: Surgical processors and slime scanners have recieved a similar resprite. +2023-07-09: + DATA-xPUNGED: + - qol: It has been issued brand new mini-fridges for our active stations, Featuring + more booze and less moldy pizza! + - rscdel: Removed excess ID boxes on HoP's office + Fikou: + - balance: nightmare vision goggles give you night vision + Imaginos: + - image: A new sprite for oeprating tables + Melbert: + - bugfix: Fix hard deletes that brick all of a wizards spell when their body is + delted + - rscadd: The Atrocinator will now flip you even more. + Rhials: + - bugfix: The organ manipulator menu will now delete implants or organs that fail + to properly insert. + - code_imp: The organ manipulator menu code now looks nicer :) + YehnBeep: + - qol: Produce consoles now have tables near them. + YesterdaysPromise: + - rscadd: Added Interdyne ModSuits for Interdyne pirates. +2023-07-10: + DATA-xPUNGED: + - qol: The Warden's locker now has a garment bag + Fikou: + - bugfix: service borg apparatus now works on stoves and griddles and ovens + - qol: borgs can now activate stoves and griddles + - rscadd: rnd can research a cookbook for service borgs + FlufflesTheDog: + - bugfix: You can once again directly place patients on operating tables + Jacquerel: + - rscadd: Golems can scoop sand (or snow) off the floor by clicking on it. + Nimowa: + - bugfix: Fully charged APCs will now actually be fully charged, instead of nearly + empty. + Riggle: + - spellcheck: fix suspicious_logins + Youtubeboy139: + - image: Added new Security Cap sprite + distributivgesetz: + - spellcheck: Fixed some underscores in spiderling names. +2023-07-11: + ATHATH: + - qol: Emagged organ harvesters will no longer refuse a victim that has items on + their person, such as the handcuffs they've been bound with. + CRITAWAKETS: + - bugfix: Hereditary Manifold Sickness, and other uncurable diseases, have been + found to no longer disappear upon miraculous acts of divine restoration. In + addition, viral bonding no longer makes you into a carrier for those aswell. + ChungusGamer666: + - rscadd: Nightmare vision goggles now give you mare vision + - bugfix: Creampies will no longer irreparably stain your face + Ghommie: + - bugfix: Fixes venomous projectiles for real, and invisible arrow sprites. + - rscadd: Added cardboard IDs to the game. They can be crafted with a cardboard + sheet and wirecutters and modified with a writing tool. While worn, these will + modify the visible name of the wearer just like actual IDs, though they aren't + real IDs and won't work as such. + Helg2: + - bugfix: androids now have proper robotic organs and no appendix. + - bugfix: snakes, security, spiders and skeletons phobias now properly react on + mobs + Jacquerel: + - rscadd: AI-controlled spiders will make more web-shaped webs. + JohnFulpWillard: + - qol: Clear PDAs now has all themes in their themify app by default. + Melbert: + - bugfix: Fix ling revival for full-dead lings + - refactor: Refactored language holders, making species changes not delete all of + your known languages + Seven: + - balance: Only 2 smugglers satchels will spawn on the station at roundstart, down + from 10 + TerraGS: + - bugfix: The military surplus trader encountered by explorer drones will now correctly + ask for armor rather than "suit" + Time-Green: + - balance: Metalgen cannot spawn as a random chem anymore (strange seeds, maintpills + etc) + carshalash: + - bugfix: ' Infinite spider eggs are no more.' + cnleth: + - image: Engineering scanner goggles are now yellow and not green when in meson + mode + - image: Atmospheric thermal imaging goggles are now green + mc-oofert: + - bugfix: morgue units can no longer hold ghosts + - bugfix: Cake cats/butter bear now grab the ghost of the brain used in their making + nikothedude: + - bugfix: Quantum relays now process, meaning DOS attacks actually function + san7890: + - admin: If a circuit component outputs a radio signal, it should now be logged + in list-signalers. +2023-07-12: + Ben10Omintrix: + - bugfix: the fortunate cookie dont dropped a empty paper anymore. + FlufflesTheDog: + - bugfix: Destroying the fabled "green text" now properly releases its victims from + their curse. + Helg2: + - bugfix: warden has his garment bag in locker as should + Jacquerel: + - bugfix: Guard spiders can now only make one scary duplicate of themselves at a + time, rather than as many as they can click on the button. + - rscadd: PAIs can no longer be inserted into Bots + - rscadd: Bots can now have their sapience toggled by anyone with access to their + settings panel + - rscadd: Bots which exist on the map at the start of the round automatically have + this setting enabled + - qol: Bots, Regal Rats, and Cargorilla now appear in the Spawners menu if you are + dead + - qol: Bots can be renamed from their maintenance panel + - bugfix: Bile/Vileworms now have the same projectile and thrown weapon resistances + of other mining mobs. + Melbert: + - qol: You no longer fall over when you get dusted, making the animation line up + with your body + - bugfix: Fixes Aphasia being removed + Singul0: + - rscadd: IRS jacket is now back in the clothesvend + - rscadd: Ports breaching shells from beestation + - rscadd: Space IRS has been added into the heavy weight pirates spawn pool + - code_imp: Mosin nagant ammo boxes is now a subtype of regular ammo boxes (the + toolbox subtype) + StaringGasMask: + - qol: Now plasmamen can use the infiltrator MODsuit without having their species + revealed. The helmet's still not sealed, so remember your mask. + Tattle: + - qol: changed mouth blocked message to a balloon alert + Thunder12345: + - bugfix: Autorifle magazines are now visible in the security techfab's ammunition + category. + YehnBeep: + - spellcheck: Fixed typos in the descriptions of the mRLD and RTD as seen from protolathes. + YesterdaysPromise: + - image: added sprites for different variants of scrolls. + - image: modified couple posters with ghost pixels. + lizardqueenlexi: + - refactor: Foxes are more crafty now. They will run from danger, and hunt small + prey when no one is keeping an eye on them. Don't leave Renault alone with Ian! +2023-07-13: + Hatterhat: + - qol: When a MOD fails to store something in itself when retracting, you're now + notified in both the chat and by a balloon alert. + Helg2: + - balance: Rocket launcher's backblast doesnt ignore armor now. + - bugfix: eating mime's and rainbow crayons now properly transfers reagents. + - bugfix: I somehow fixed the amount of reagents in crayons to what it was before. + LT3: + - image: Roller bed now has an inhand sprite + - bugfix: Security records no longer accept negative values for citation payment + Melbert: + - rscadd: You can now wear multiple accessories on your uniform at once (up to five + by default) + - balance: Removed armor from accessories, and nerfs the effects of some accessories. + SomeRandomOwl: + - bugfix: Music Request Credit shows CKEY instead of character name + Timberpoes: + - rscdel: Revolution has been reverted back to old behaviour. The round once again + ends when the revolution is successful. The round continues as normal if the + revolution fails. + - rscadd: When the station is rolled in a state of Post-Revolutionary Fervor, the + Captain will find their bedsheets replaced with an anti-Nanotrasen variant. +2023-07-14: + Archimus12: + - rscadd: Adds latex gloves and medical headsets to the MediDrobe. + - rscadd: Adds pyjamas, nightcaps and white shoes to the ClothesMate. + - rscadd: Adds science backpack, duffel bag and satchel to the RoboDrobe. + BlueMemesauce: + - bugfix: Removed initial 500 point balance on mining point transfer cards. Load + them up with points instead. + - rscadd: Added mining point transfer cards to mining lockers. + - rscdel: Removed mining point transfer cards from mining equipment vendor. + Helg2: + - rscadd: You can now swab plasmaman clown clothes to get clown microbes. + - rscadd: Clown phobia makes you fear plasmaman clown's gloves and helmet. + Jacquerel: + - refactor: Goliaths now use the Basic Mob framework, please report any unusual + behaviour. + - rscadd: Goliaths learned a couple of new attacks which they will use in self-defence. + - balance: Help-clicking a miner grabbed by Goliath tentacles will immediately free + them, as will the effect of several items you can scavenge from around Lavaland. + - image: New sprites for the Goliath saddle. + LT3: + - bugfix: Maptext should now properly show superscript characters when performing + actions + Sealed101: + - qol: Lobby Menu buttons can now be collapsed. Rejoice! + - qol: Lobby Menu buttons have names, which can be seen in the prompt on the bottom + left of the viewport. + - qol: you may see your readiness status during pre-game in the Status Bar. + - qol: Reset Lobby Menu HUD verb added in case you manage to break the damn thing. + Vekter: + - rscadd: Adds support for it/its pronouns. You can select these in character preferences. + nikothedude: + - bugfix: Deployable turrets no longer runtime when firing + - qol: APCs, fire alarms, and holopads now communicate some more of their silicon + interactions via screentips. + - qol: APCs, fire alarms, holopads and turret control panels now use balloon alerts + for more of their notifications. +2023-07-15: + ATHATH: + - bugfix: Simplemobs that can't take stamina damage, including mulebots, will no + longer be reset to their default speed whenever they take damage or are healed. + Ben10Omintrix: + - refactor: paper wizard have been refactored, please report any bugs/unintended + behavior + - refactor: refacted the datum/elememt/trial to an bespoken element + - rscadd: paper wizard now have effects when he walking and he will now go and look + for paperes and write stuff in them + Melbert: + - qol: Changeling Emporium is now sorted alphabetically. + - qol: Changeling Emporium now has a search bar! + - bugfix: Ling Augmented Eyesight now no longer causes you to lose the effects of + your Meson glasses + - bugfix: Ling Augmented Eyesight now more consistently tracks the flash protection + / vulnerability it confers. + - bugfix: Fixes a runtime from clientless mobs listening to Jukeboxes + - bugfix: Fixes some potential hard-dels from Jukeboxes + - qol: Jukeboxes now start with "title3.ogg" loaded for servers which do not have + jukebox songs included in their config. + NotDhu: + - bugfix: Added missing telecomms monitoring consoles to Birdshot. + Rhials: + - qol: The Xenomorph Infestation orbit menu tab is now violet instead of red! + Striders13: + - code_imp: Admins can now choose the reward cursed slot machine gives when hitting + jackpot. + VladinXXV: + - qol: You can now rename the coroner's skeleton model with a pen! + - bugfix: Autopsy reports will now correctly report blood type and level for corpses + who happen to have blood for blood. + generalthrax: + - balance: Lionhunter on charge now has a damage modifier of 2 instead of 1.33 + - balance: Increased max range of charged shot from 16 to 30 + - balance: Increased scope modifier so you can use the new max range +2023-07-16: + DATA-xPUNGED: + - rscdel: The Head of Personnel no longer spawns with an ID box. + Helg2: + - bugfix: roundstart exodrone consoles are now unscrewable. + Jacquerel: + - rscadd: Personal AI holograms are now limited to an area around their PAI card. + The size of this are can be configured via the PAI card. + - rscadd: pAI cards can now be placed inside bots in order to grant them control + of the bot. + JohnFulpWillard: + - rscadd: The 'Sent from my PDA' message is different for Clear PDAs now (specifying + they are crystal). + - bugfix: Chaplain armor no longer blocks being shoved down. + LemonInTheDark: + - bugfix: The preference menu has had its weird index lowered (Assets are no longer + semi garbled) + Melbert: + - bugfix: Anti-magic visual effects will no longer trigger overtop one another + Thunder12345: + - qol: CTF has more reminders of how to capture flags. + Time-Green: + - bugfix: Metalgen recipe generation works again + Watermelon914: + - balance: Changed damage reduction for robotic limbs to be multiplicative instead + of additive + carshalash: + - bugfix: Intern returns misplaced droppers back to deltastation's xenobiology lab. + necromanceranne: + - bugfix: Stops manifest generation runtiming when a cargo crate is empty. + - rscadd: Abandoned crates are now available via cargo imports. + - rscadd: Dumpsters full of maintenance trash are now available via cargo imports. + - rscadd: An ultra-rare can of Shambler's Juice is now available via cargo imports. + - rscadd: Animal hides and leathers can be (unreliably) ordered via cargo imports. + - rscadd: The Dreadnog has entered this realm. To consume, purchase it via cargo + imports. + - balance: Contraband Crates (and as a consequence, smuggler's satchels) now generate + more varied goods. Mostly the same, but sometimes you get something quite different + or even valuable. + - balance: Mosins generated via the Russian supply crate are a bit more random, + weighing more heavily towards bad mosins than good mosins. + - balance: Buffed both the shocktrooper and special op crate. Shocktrooper now has + an armored helmet and vest, and special op now has 5 mirage grenades and a chameleon + belt. The survival knife in the special op crate is now a switchblade. + - bugfix: Fixes holy arrows being invisible. + nikothedude: + - bugfix: Ventilation clog no longer spawns mobs in inappropriate places + - rscadd: 'New malf ability: Remote safety overrides. Allows the AI to remotely + emag things it has access to.' + - code_imp: emag_act() now returns a boolean designating it's success in emagging + - code_imp: All instances of emag_act() now have the proper arguments + - qol: Most usecases of emagging now have some kind of feedback, and existing feedback + has been sanity checked and converted to balloon alerts. +2023-07-17: + DATA-xPUNGED: + - balance: Pyre Sect can now heal with their bible as normal. + - qol: Some of Pyre Sect's rituals have been shortened slightly + Donglesplonge: + - bugfix: replaces icebox genetics' regular science headset with a medisci headset, + making it more in line with other genetics offices + Helg2: + - bugfix: Onehuman and Freeform ai modules now have proper material prices. + - qol: People with deviant tastes now don't care about dirt on the food. + - bugfix: fixed energy cost on floor tiles for engi borgs. + - bugfix: engi borgs can now properly merge base floor tiles with other base floor + tiles. + Jacquerel: + - bugfix: Station traits can once again allow vending machines and bots to speak + a random language + - bugfix: EMPed bots and vending machines once again speak a random language + - bugfix: Carp, Trees, and Festivus Poles will once more sometimes emote at you + if they think you are looking at them the wrong way, before they come over to + beat you up. + JohnFulpWillard: + - refactor: Huds now have their hud owner set in Initialize + Melbert: + - code_imp: AI cards should react more snap-ily to having their occupant perish + OrionTheFox: + - qol: in the event the Gravity Generator becomes damaged, examining the main part + will now give repair hints! + Timberpoes: + - bugfix: Emotes now respect word filters. + Watermelon914: + - bugfix: Fixed the AI vox announcement interrupting every other sound being played. + itseasytosee: + - rscadd: A new traitor item has been added, Polarized Contacts! + necromanceranne: + - code_imp: Adds an opt out for the rest of the round for the various heretic summons. + nikothedude: + - bugfix: The malf AI emag ability now works + - bugfix: The AI can no longer untip vendors remotely/spam sparks from shocked vendors + vinylspiders: + - bugfix: transformed jellypeople with the blood deficiency quirk will now receive + the right bloodpacks as mail goodies + - qol: laser muskets' inhand sprites will show now whether or not they are charged + - image: new inhand sprites for the laser muskets +2023-07-18: + BlueMemesauce: + - bugfix: Abductor posters can no longer randomly spawn + - spellcheck: Fix duplicate sentence in space comms agent flavor text + CRITAWAKETS: + - rscadd: Added the smoothbore disabler and it's prime variant. You can now craft + a disabler with only one shot and terrible accuracy. + - code_imp: Gun cranking has been made a component and could theoretically be used + on more than guns. + Jacquerel: + - bugfix: Megafauna can be consumed by the singularity. + JohnFulpWillard: + - bugfix: Multi-z maps should now work again. + Melbert: + - rscadd: Adds a new 7 point positive quirk, "Spacer Born". You were born in space, + and as a result your body's adapted to life in artificial gravity, making you + much more effective and comfortable in lower gravity. However, travelling planet-side + is quite a chore, especially if you're assigned to work there. + - rscadd: 'Adds a chemical: Ondansetron, created by Oil + Nitrogen + Oxygen + Ethanol + catalyst. A powerful Antiemetic (lowers disgust).' + - refactor: Refactored display-ing of antag objectives in their UIs + Rhials: + - spellcheck: removes an errant period from the flux anomaly announcement. + Time-Green: + - bugfix: Triple carp player controlled shuttle event works again + - bugfix: anti-breach shields wont be dragged away during shuttle flight anymore + carlarctg: + - rscdel: There is no longer a 50% chance of catching a heretic out when examining + them drawing influences. + dieamond13: + - bugfix: adds a BCI implanter to northstar circuit lab as it didn't come with one + before + itseasytosee: + - balance: the Syndicate Tome traitor item now grants anti-magic while held and + can be used to clear cult runes. + necromanceranne: + - bugfix: Replaces direct calls of try_infect() with appropriate procs so that CRISPR + and Miasma aren't forcing diseases on the disease immune. + sergeirocks100: + - spellcheck: A spelling error in the name of the Tiziran fish case has been corrected. + timothymtorres: + - rscadd: Add healing boost to organs while mob is sleeping (does not apply to robotic + or dying organs) +2023-07-19: + Ben10Omintrix: + - refactor: the penguin is a basic animal + - rscadd: the penguin now layed eggs + - rscadd: the penguin and the chicken babys will go look for adult penguin or chicken + and be happy when he is near the adult + CoiledLamb: + - image: updated most tank sprites. + DaydreamIQ: + - spellcheck: Maints fridge doesn't have _ in its name anymore + Donglesplonge: + - bugfix: replaces the unspawnable cannonballs in birdshot maintenance with a stack + so that the 4 cannonballs properly spawn, make sure to point them away from + medical! + Melbert: + - bugfix: Cyborgs no longer drop their radio key when deleted, only when deconstructed + first + - bugfix: Cyborgs no longer drop their MMI on deletion, only prior to deletion. + This may result in bad code rearing its ugly head, open an issue report on the + github if you're a cyborg and get ghosted when you feel like you shouldn't + - bugfix: Runtime from syndie cyborgs spawning + - bugfix: AI deaths are reported to black box + - qol: Wizard Spellbook is now alphabetized + - qol: Wizard Spellbook now has a search bar! + OrionTheFox: + - refactor: refactored some code relating to greyscale clothing - please report + relevant issues on github! + Tattle: + - spellcheck: Fixed the grammar on a few revenant messages + Vekter: + - rscadd: Added 2 new brain damage lines. Beat your skull in with a wrench and discover + them today! + coldud13: + - rscadd: You can now toggle the visibility for hair on your noggin when wearing + surgery caps. + necromanceranne: + - bugfix: Cleans up the lavaland exports to the modern loot table lists. + - spellcheck: More elaborate explanation for what exactly the sinister shard does + when you look at the explanation in the null rod selection UI. + - bugfix: Sniper rifles have a range that allows them to aim more smoothly (and + still decently long ranged) + - bugfix: Fixes a runtime on inserting the vorpal scythe into your arm. You should + now gain the Morbid trait, as expected. + scriptis: + - qol: techfabs now use sheets(TM) as the default unit of measurement + - bugfix: mechfab icons aren't perpetually gray + tommysalami3: + - rscadd: Ambient tracks for icebox. + - rscadd: Independent global_list for icebox. + vinylspiders: + - bugfix: ethereal hair will now go out when they die again + - code_imp: apc's update_icon_state proc will no longer set the icon file path +2023-07-20: + FernandoJ8: + - qol: terminals built by left-clicking on SMES and APC units will now be on the + same layer as the machine. + - bugfix: constructing a terminal on a specific layer with right-click now works + for APCs, not just SMES units + Helg2: + - image: .50 incendiary magazine now has sprite. + - rscadd: Bank machine now has a circuit for it. Spawns in secure tech storage and + researchable in the same nod as comms console. + - balance: Due to possibility of creating area and making there bank machines that + aren't roundstart will have gps signals. + - bugfix: Bank machine now doesn't yell about unauthorized credit withdrawal when + its authorized. + Jacquerel: + - balance: You can't possess a MULE as soon as the round starts, someone will have + to give you permission. + - balance: MULEbots no longer crush prone characters unless they have been hacked + (or emagged). + - bugfix: Bots can put numbers in their names, what with being robots. + - admin: 'Adds attack logging when certain wires are cut (for instance: MULEbot + safeties)' + JohnFulpWillard: + - bugfix: Cult spells, bloodsense, and pylon healing now follow cultists through + mind transfer (such as body swapping) + - bugfix: Cryo cells no longer appear on when off. + LemonInTheDark: + - rscadd: Added angle lighting, applies it to most wall lights! + - rscadd: Adds a lighting prototyping tool, mappers go try it out (it's locked behind + the mapping verb) + Nerev4r: + - rscadd: Due to increased exposure to low-gravity due to constant generator failures, + Spacer-Born have been showing up with increasingly tall statures. + Seven: + - bugfix: Xeno's corrosion ability no longer breaks reinforced walls and floors + - qol: Added some balloon alerts for failing to place items in storage containers + SirNooben: + - bugfix: Fixed the alien limbgrower UI + - bugfix: Fixed being able to order negative or more than 20 items in mining order + console + SyncIt21: + - bugfix: turbine does not runtime when its input or output turf is destroyed while + its running + - qol: add warning examine for rotor when its parts are not connected + nikothedude: + - rscadd: 'New air alarm mode: Vent siphon, which disables scrubbers and forces + vents to siphon air with no pressure regulation' + vinylspiders: + - bugfix: fixes gravity generators causing CI failures from overriding a signal +2023-07-21: + Blockaboo: + - bugfix: Tin man no longer causes you to drop all of your organs. + JohnFulpWillard: + - bugfix: '[Birdshot] Xenos can no longer immediately destroy the shield wall generator + to break out.' +2023-07-22: + CoiledLamb, RyeRice: + - image: cleans up shading on plasmatank sprite, gives it a cool new symbol. + Ghommie: + - image: walking on water will now immerse you in it... visually, at least. + Improvedname: + - bugfix: Brings security berets down to softcap armor values also softcaps get + wound armor + JohnFulpWillard: + - spellcheck: Silicons using weight machines are now told how pointless the task + was. + - spellcheck: Weight machine tooltips no longer lie about using LMB to use the machine. + Justice12354: + - qol: The word "chemical" has been removed from "chemical patch" when printing + patches + Melbert: + - bugfix: Once again you can award people medals. + Momo8289: + - qol: You can now use any hat with the hat stabilizer MOD + - bugfix: The MOD eating apparatus module now properly disables pepper spray protection + Sapphoqueer: + - bugfix: fixes a bug where borgs and TK users could effectively break ID's by removing + them from modular computers. + Sealed101: + - bugfix: fixed silicon alarm reports displaying power alarms as ALARM_ALARM_POWER + Senefi: + - rscadd: MetaStation Chemical Storage now has its own APC + - rscadd: MetaStation Chemical Storage is slightly larger than before + - rscadd: Ice Box Station Chemical Storage now has its own APC + itseasytosee: + - rscadd: You can now lean against walls! Simply turn your back to the wall and + clickdrag yourself onto it. + - bugfix: There should no longer be any instances of spacemen being able to run + straight through eachother as if they weren't even there. + - spellcheck: Added more variance to item throwing text. + - refactor: Mob density has been refactored + jughu: + - bugfix: removed a false silly tip about blob taking damage from flashbangs + scriptis: + - rscadd: ponies +2023-07-23: + Inari-Whitebear: + - bugfix: Cable connections on various structures including electrified grilles, + APC terminals, and SMES terminals have been rectified and will shock as expected + again. + - bugfix: Gas miners draw power properly again. + JohnFulpWillard: + - qol: The TTS and TTS Blips option is now one choiced preference. + Melbert: + - rscadd: 'Wizards have a new Right and Wrong: Mass Teaching, allowing them to grant + everyone on the station one spell or relic of their choice!' + Thebleh: + - bugfix: Fixed several APC related issues. + vinylspiders: + - bugfix: fixed a bug that would cause you to be unable to lean again if you tried + leaning while facing the wrong direction +2023-07-24: + GPeckman: + - rscadd: Bounty pads can now be upgraded, to reduce the time until you can pick + a new bounty + - rscadd: Sunglasses can now be bought from cargo if you have security access. + - balance: Gripper gloves single-pack is now gorilla gloves singlepack + - rscdel: Removed shady jims bounty + - qol: Bounty pads can now be screwdrivered/crowbarred with left click like every + other machine + Sealed101: + - bugfix: fixed third person throw verbs displaying as just an s + Singul0: + - rscadd: You can now use the genetic sequencer secondary click (RMB) to scan someone +2023-07-25: + ArcaneMusic: + - qol: ID cards tooltips now show how to assign a new account. + Ben10Omintrix: + - balance: the bee now can fly over the machines so its easy for him to go to the + hydroponics machine + - bugfix: player bees now will not be stuck inside the hive if he entered it, they + can now leave it + - bugfix: fixed a har deleted when the hive is deleted all the bees still have a + refence to the hive now its fixed + - bugfix: now when a player interacted with the bee hive the bees will now leave + the hive to defend the hive (it was glitched) + - refactor: the bees now are a basic insect. + Cheshify: + - image: Railing ends now exist. + Comxy: + - balance: Changes some cooldowns and upgrades of spells. + Hatterhat: + - qol: Ice cream vats now count as elevated surfaces for preventing germs from getting + onto germ-sensitive items (food). + - qol: Ice cream vats now dispense cones into your hands first, if possible. + - bugfix: Germ-sensitive items that fail to be placed in-hand now check for all + elevated surfaces, not just tables. + JohnFulpWillard: + - bugfix: Crates no longer stun you when you climb onto them. + Profakos: + - bugfix: Removed duplicate and incorrect Yaki Imo recipe + - qol: "Swapped out the flour in \xC6losterrm\xE6sch with two dough slices, to avoid\ + \ competing reactions while preparing or cooking" + - spellcheck: Chicken nugget will have a description in the craft menu, and fiesta + skewers will have a description in general + Sealed101: + - bugfix: fixed possessed sword spirits summoned during destruction of the sword + spawning in the error room. those fellas are in godmode, and y'all don't need + an immortal spirit haunting your station, m'kay? + Senefi: + - rscadd: Some Metastation Medbay lights have been moved and adjusted. + SyncIt21: + - bugfix: items can be printed from autolathe & protolathe when the exact material + amounts are present in them after upgrading + - bugfix: max printable amount now shows the correct value & updates when items + are printed, materials are removed in the autolathe & protolathe + - bugfix: component printer material bar is not greyed out when there are sufficient + materials to eject + - bugfix: rcd and other devices that uses the silo link upgrade now have the correct + material usages + - bugfix: silo hold actually works + - bugfix: machines using local storage to hold materials will eject it's materials + as sheets when deconstructed/destroyed + - refactor: Autolathe Material bars now display number of sheets available + - refactor: printing an item that does not have enough materials will fail silently + with no error messages + - refactor: Drone dispenser will eject sheets upon deconstruction + - refactor: all things that store materials will auto ejects its sheets(if there + is sufficient material) when destroyed + - refactor: inserting an item into the material container will display the units + consumed as sheets not absolute units + - refactor: removed x25 & x50 print buttons from the autolathe + Thebleh: + - bugfix: South Bronx Paradise Bars are once again the best weight loss aid on station + YakumoChen: + - bugfix: Dish drive no longer spams the bar/kitchen/etc when its idle with empty + messages. + kawoppi: + - rscdel: removed floating light fixture from the Deltastation security hallway +2023-07-26: + Melbert: + - bugfix: Prisoner slots can no longer be controlled by Plexagon HR Core. (special + things to distributivgesetz) + - bugfix: HoPs can open more assistant job slots if a non-assistant job is the overflow + role + - code_imp: Dehardcode the HR core blacklist for jobs which cannot have more slots + opened by the HoP + Mooshimi: + - bugfix: Plasmaman DNA can no longer be stolen by changelings. + Paxilmaniac: + - refactor: The mag_type variable on guns has been split between accepted_magazine_type + and spawn_magazine_type, allowing weapons to safely spawn with subtypes of their + normal magazines without breaking the weapon + - bugfix: Several weapons that spawned with special magazines, the riot dart pre-loaded + donk pistol for example, will now be able to accept normal donksoft magazines + that don't spawn loaded with riot darts. + Rhials: + - qol: Modifies the contents of some Mafia lockers. Go check 'em out! + Singul0: + - bugfix: some fixes to spess IRS pirates. + - balance: IRS armor is now bulky + Time-Green: + - bugfix: Makes radiation nebula space work on high-pop by applying the radiation + more directly + - balance: Internal nebula storm no longer gives 10 seconds of immunity and has + a very, very small chance to apply mutations + - balance: Rudes nebula rad immunity from 10 seconds to 6 seconds (shouldn't differ + too much since we use a different system now) + carshalash: + - balance: Mmmh, butter on a stick. Now for americanbots. + distributivgesetz: + - spellcheck: Head of Personnel's roundstart text now says that they should answer + to the captain now instead of themselves. + - spellcheck: Phobia warnings have the same glowy text now as they would in messages. + oranges: + - balance: holodeck spawned banners no longer give the inspiration effects +2023-07-27: + Ghommie: + - bugfix: the height of runechat messages should now scale correctly with the current + size variable of living mob. + - refactor: Crabs refactored into basic mobs. They now hunt tiny critters and flee + from attackers. + - bugfix: Fixed crabs not crab-walking. + - bugfix: Fixed active conveyor belts not moving movables spawned on top of them. + Helg2: + - qol: Tactical medkits now can hold stuff it spawns with. + - bugfix: Nukie Medical Bundle now spawns with premium tactical medkit as it should. + Jacquerel: + - bugfix: Traitors can once again affix tiny bombs to lathes rather than trying + to feed them to the lathe + Kubisopplay: + - balance: Flashing borgs requires two consecutive flashes to fully immobilize + - balance: Flashed borgs can speak + - balance: Remote lockdown on cyborgs lasts 180 seconds + - balance: Cyborg stun arm works like normal baton, and costs less energy + LT3: + - bugfix: Consumables like bone gel will first be used for surgery before wounds + Licks-The-Crystal: + - qol: The "Kidnap" progression traitor objective now displays the number of telecrystals + awarded for a successful live kidnapping. + Melbert: + - bugfix: Fixes some occasions which result in TTS messages not playing + Rhials: + - bugfix: Clown cars now properly collide with deer. + - sound: Violent, slightly glassy car impact sound. + Senefi: + - bugfix: Wired MetaStation APCs that were not attached to the station's power grid + at round start. + Time-Green: + - admin: Changing shuttle events now alerts admins + carlarctg: + - bugfix: Hulks cannot be aggressive grabbed by strong grabbers anymore + - balance: Syndicate duffelbags can fit 2 extra bulky items, down from three. + - balance: Reduced syndicate duffelbag's unzipped slowdown from '1' to '0.3', and + set its zipping-up sped to 0.5, same as unzipping. + - rscadd: 'Added the following items to the Syndicate Duffelbag bulky exception + list: Greentext, mech removal tool, gibtonite, skub, golem shells, mech ammo. + Roughly sorted the list by item category.' + - bugfix: Fixed the syndie surgery duffelbag having more items than it can hold + by removing the redundant surgical drill (Upgraded cauteries can turn into one + anyways) + - qol: Any storage item with a can_hold description can be examined twice to see + what it can hold now. + - bugfix: The parent crayon's name is 'crayon' to prevent any weirdness with things + that show the parent type's name. + distributivgesetz: + - bugfix: Fixed a rare bug that let you spam bluespace bodybags everywhere. + - bugfix: Mafia chaplains can now only use their seances on dead people now. + vinylspiders: + - bugfix: fixes mobs missing most of their emissive blockers + zeroisthebiggay: + - balance: Huzzah! Interdyne Associates have finally upgraded their medborgs' firmware. + They'll now have bonesetters and bonegel available! +2023-07-28: + DATA-xPUNGED: + - bugfix: New lights have been issued to the Head of Personnel's office. + - bugfix: We've instructed our intern to no longer place the HoP's stamps UNDER + the carbon paper bin, making many think there was no stamp at all. + Ghommie: + - bugfix: Reduced the maximum allowed length for ID assignments and paintings' titles + from 1024 to 42. + Iamgoofball: + - bugfix: Removes the ability to screwdriver springlock modules to make them not + deadly because that defeats the point of the springlock module + Inari-Whitebear: + - bugfix: Determination can now actually overcome your adrenal glands, making adrenal + crisis a curable condition! + Jackal-boop: + - qol: heretic sac targets now appear on the end of round report + Jacquerel: + - rscadd: Uncollected sand and snow will be blown away by the wind when storms happen + (but don't worry, storms also allow those turfs to be freshly dug up again). + MTandi: + - refactor: Refactored MOD Suit UI + - qol: Added options to hide detailed vitals and DNA data to the MOD status module + - qol: Made MOD Ion Jetpack Module have stabilizers enabled by default + Sealed101: + - rscadd: dog with a butter on 'em + - rscadd: dead dog with da butter on 'em (dogs feigning death are so good at it, + they appear dead to medical HUDs and other things) + - rscadd: Nars-Ian now can revive from the dead if he consumes a pet + - bugfix: fixes dog fashion items with no speech modifiers set making dressed up + corgis unable to perform their speech or emote behaviors + - bugfix: fixes old Ian losing his mobility ride when shaved with a razor + - bugfix: fixes pets not dropping their collar when gibbed + - bugfix: butter don't go on Lisa and corgi puppies (Lisa won't wear hats and corgi + puppies can't wear hats and back slot items) + Time-Green: + - qol: The virologist is warned when radioactive resonance cannot be obtained + YehnBeep: + - bugfix: Fixed a floating light in Delta's bar + mc-oofert: + - bugfix: guillotines no longer runtime when logging after decapping someone if + they buckle AFTER the blade starts to drop + - bugfix: shoving a crystal down a hole no longer makes it dust itself + nikothedude: + - rscadd: 'New malf module: Remote vendor tipping. Allows you to remotely tip a + vendor in any of the 8 directions. Goofy and okay for assassinations on unaware + enemies!' + - rscadd: 'New malf module: Core rolling. Allows you to roll around, crushing anything + you fall on with a satisfying splat.' + - code_imp: Vendor tipping is now a /atom/movable proc, allowing anything to fall + over and crush you. + - code_imp: All take_damage() overrides now use the correct arguments + - image: turf_analysis.dmi's red_arrow now has orthogonal directions + - balance: Vendors now are far less likely to gib your head or make you parapalegic + - balance: Vendors now respect armor when they crush you + san7890: + - code_imp: The currently operating rust-g version on a live server is posted to + places like the runtime.log, in the same place where the revision information + and any applicable test merges already were. + vinylspiders: + - bugfix: fixes a type mismatch error with some of the phobia chat messages + volas: + - bugfix: Some explosions should be more flashy and fiery, probably. + xPokee: + - rscadd: Photophobia as a negative quirk. +2023-07-29: + DaydreamIQ: + - bugfix: Birdshot AI sat now has unrestricted exit instead of entrance + Ghommie: + - rscadd: Added a 'Vending products shortage' station trait, that randomly lowers + the availability of all vending products from vending machines on the station, + with a 1/20 chance of the vending machine itself being tilted. + Mothblocks: + - qol: pAIs now try to stay within range of their owner, and teleport back only + when necessary + - qol: Default max pAI range has been changed to the maximum range you can choose + (9 tiles) + Paxilmaniac: + - bugfix: The anomaly research ruin is no longer missing several tiles on the inside + to the void + Sealed101: + - bugfix: fixed gibtonite countdown animation interrupting clicks with the mining + scanner + Senefi: + - bugfix: Replaced 5 space tiles in the wall of the anomaly research ruin with rocks. + - bugfix: Replaced the tile under the window in the mimes vs clowns ruin with plating. + - bugfix: Replaced space tile in the emergency fish shuttle with plastitanium flooring. + - bugfix: Removed space tiles from the exterior of some ruins templates. + Time-Green: + - rscadd: Adds cliffs to the north of icebox. Try not to fall of of them! + mc-oofert: + - bugfix: you can no longer fireman carry to bypass puzzle doors + vinylspiders: + - bugfix: non-opaque curtains will no longer block emissives +2023-07-30: + ArcaneMusic: + - qol: Improvements to the accounting console in the HOP office. + - balance: Non-human species now receive a 90% racial paycut, up from 75%. + - balance: The inflation mechanic affecting vending machines has been removed, except + during the market crash event. + - balance: The market crash event now stands as it's own separate event, and ramps + up the cost of vendor items until finally popping and returning to normal. Market + crash now lasts longer to have more impact while it scales with time. + - image: New cargo exo-drone scanner sprites! + Ben10Omintrix: + - refactor: the bear is a basic now. please report any bugs + - rscadd: the bear will climb trees and search honey + Ghommie: + - bugfix: Put a cap to the amount of stickers that can be sticked to an atom (12) + to prevent icon-related issues. + - bugfix: Fixing some jank with the a greyscale modify menu, like inputs not being + sanitized. + Jacquerel: + - bugfix: Dismounting from a piggyback no longer allows you to phase through other + players. + - rscadd: You can now earn an achievement for completing the Grand Ritual. + - bugfix: Summon Magic and Summon Guns work again + - rscadd: Player-controlled bots can now play the prerecorded lines associated with + that bot. + - rscadd: Placing a pAI into a bot temporarily teaches that bot all the langauges + the pAI could speak. + Melbert: + - refactor: Refactored chameleon actions a fair bit + - rscadd: Adds outfit saving to chameleon clothes. RMB the "chameleon outfit" action + to save your current chameleon setup for quick swapping. + - rscadd: Swapping between chameleon outfits now has a slight "animation" associated, + to distinguish traitors from lings slightly. + - rscadd: Adds a new chameleon item, the "Chameleon Scanner". Use it on other crewmembers + to stealthily save their current outfit as a custom outfit to use later. And + of course, it's chameleon too. + - bugfix: Ethereals, the DNA lock mod, GPSs, and storage items now respect EMP protection + - balance: The "Long Shift" achievement is now feasibly obtainable, and admins can + no longer trigger it unknowingly + - bugfix: Fixes runtime from trying to put two pots on one stove. + SyncIt21: + - bugfix: some things not connecting to the ore silo round start + Time-Green: + - rscadd: Adds a Forested planetary station trait! Icebox exterior is now a forest! + - rscadd: Adds a Forever Storm planetary station trait! Sometimes, the storm never + stops. Stay inside or get some coffee and warm clothes + - bugfix: fixes stuff spawning in rivers and above chasms + - bugfix: emissive blockers on random flora not updating + - code_imp: Splits terrain generation and terrain population in SSmapping + - rscadd: Starlight will color with space gas parallax + - code_imp: Cleans up random parallax code / radioactive nebula parallax code + - bugfix: Staff of laval no longer works on space + necromanceranne: + - bugfix: Fixes revolvers losing ammo capacity when you reload them. + san7890: + - bugfix: Carbons with tails (felinids, lizards) who have that tail removed will + now have that tail actually look like it came from the person in question, rather + than just be a grey thing of sadness. +2023-07-31: + CRITAWAKETS: + - balance: The bluespace MOD storage can now hold bulky storage items (backpacks, + toolbelts) just like the bag of holding. + GoldenAlpharex: + - bugfix: Clothes equipped in the jumpsuit slot that happen to cover your feet will + no longer get bloody when you walk over blood if you are also wearing shoes. + Your kilt won't be getting bloody instantly anymore, it only will if you take + your shoes off! + - bugfix: Chat highlights now escape special RegEx characters from non-RegEx highlights. + - bugfix: Broken RegEx expressions no longer cause the chat to bluescreen, allowing + you to properly fix them. + SyncIt21: + - bugfix: Module duplicator has cheaper costs for circuit duplication + - rscadd: RPED can carry & install computer boards and complete computer frames + cnleth: + - bugfix: Using the timeline jumper MOD module updates stamina after resetting it, + no more infinite stamcrits + vinylspiders: + - bugfix: fixed a bug that would cause pAIs to be able to break their leash diff --git a/html/changelogs/archive/2023-08.yml b/html/changelogs/archive/2023-08.yml new file mode 100644 index 0000000000000..7aee835af2f56 --- /dev/null +++ b/html/changelogs/archive/2023-08.yml @@ -0,0 +1,1419 @@ +2023-08-01: + Fikou: + - bugfix: ghost notification icons are now centered properly + - bugfix: coroner has an implant during cybernetic revolution + - bugfix: fixes wizard loadouts + Hatterhat: + - bugfix: The blood-drunk miner has remembered how to swing their cleaving saw quickly + without having to flick it out first. + Jacquerel: + - bugfix: Losing your hooded suit (whether to theft, or because you were turned + into an ape) will also cause you to lose the hood. + Licks-The-Crystal: + - spellcheck: Corrected a large quantity of spelling, grammatical and phrasing errors + with Exploration Drone content. + Paxilmaniac: + - image: Wall and floor lights have been resprited to be a lot less dated looking, + and a lot less yellow + Sealed101: + - bugfix: fixed bluespace bodybags consuming xenomorphs when folded + Time-Green: + - bugfix: fixes a runtime in SSstation setup + - bugfix: fixes parallax not rendering correctly for latejoins + Vincent983: + - spellcheck: fixed the interdyne modsuit's typoes + Watermelon914: + - rscadd: Expanded the RPG loot wizard event by giving various different items their + own statistic boost. + YesterdaysPromise: + - rscadd: Added couple new signs to the game (med, medbay, morgue, chapel, viro, + gene, botany) + - rscadd: Way-signs now have additional states, showing vertical directions. + - image: Made the font on the signs consistant. + distributivgesetz: + - bugfix: Photophobia should work now. + - bugfix: Eyes should return to their normal flash sensitivity when the quirk is + removed. + - bugfix: Fixes pAI mind transfer from a bot to their card runtiming when the bot + gets broken. + san7890: + - refactor: Slaughter and Laughter Demons have been refactored, please place an + issue report for any unexpected things/hitches. + - bugfix: Laughter Demons should now actually drop a kitten. + zeroisthebiggay: + - spellcheck: Minor Breakage > Minor Skin Breakage for readability. +2023-08-02: + DaydreamIQ: + - bugfix: Birdshot's morgue has surgical tools and a laptop for the coroner to use + Derpguy3: + - qol: The Syndicate battlecruiser's fighters have received external cameras to + aid its pilots. + - qol: Warning lights have been added to the landing pad of the battlecruiser to + (hopefully) reduce incident numbers. + - bugfix: A stray air alarm was removed from the bridge of the Syndicate battlecruiser. + - bugfix: The turret control panel in the bridge of the battlecruiser has been moved + to a wall, allowing access without needing to climb the table. + - bugfix: Airlocks on the Syndicate battlecruiser which were missing syndicate access, + has had it added. + - bugfix: The Syndicate medibot on the battlecruiser can now be unlocked by its + crew. + Jacquerel: + - bugfix: Several places on Birdshot which were missing an APC now aren't. + - bugfix: Several places on Birdshot which were missing an air alarm now aren't. + Jolly: + - bugfix: '[Shuttles] Kilo''s Emergency Shuttle no longer has a stacked light in + its brig.' + Melbert: + - bugfix: Fixed BB admin add + - bugfix: Traitors using the sneak suit and heretics under the effects of cloak + no longer leak their identity via Text to Speech + OrionTheFox: + - image: resprited a lot of formal undersuits, enjoy! + - rscadd: Added a pre-colored type of buttondown slacks for some service roles, + to replace the "black suit" and "amish suit" + - rscdel: Removed the "amish suit", "black suit", and one of the two "white suit"s + Senefi: + - bugfix: NorthStar's Supermatter Waste Chamber guide no longer contains inaccurate + information + - qol: NorthStar's Supermatter Waste Chamber air alarm no longer shows the hallway + vent and scrubber on the configuration panel. + SyncIt21: + - bugfix: broken icons in RCD UI + Thunder12345: + - bugfix: CentCom can no longer be raided by teleporting out of the Super Secret + Room + - bugfix: The Administrative Storage and ERT Armoury blast doors can no longer be + opened by building a door button. + carlarctg: + - qol: When Space Dragons devour people they get extinguished, removing flames. + honkpocket: + - rscadd: Adds an emote to push up glasses with *glasses + - rscadd: Adds a visual effect to *sigh + timothymtorres: + - rscadd: Add a new 'Hall of Fame' emergency shuttle. It even comes with it's own + nifty photo album. +2023-08-03: + Fikou: + - balance: hat stabilizer module can now hold what plasmaman helmets can hold + - qol: kinesis module can be stopped without launching an object with right click + - balance: kinesis module stuns last until the kinesis stops + - rscadd: admin suit has a version of kinesis that can pick up anything at any range + and can be configured to make grabbed mobs phase through walls :) + Ghommie: + - bugfix: BoH bombing now correctly requires two bags to be done. + Hatterhat: + - balance: The strong-arm implant's punches now respect armor. + - spellcheck: While using an arm with the strong-arm implant to punch people, you + no longer kick them; your implant's in your arm, after all! + IndieanaJones: + - balance: Xenomorph neurotoxin has been buffed (50 -> 65 stamina damage) + Jacquerel: + - bugfix: Your pAI card won't pop out of your PDA onto the floor alongside its hologram + if it enters hologram form while inside a PDA. + Rhials: + - rscadd: Fugitive shuttles now have a "Fugitive Tracker" machine, which gives a + readout on the location of a random fugitive on a 40 second cooldown. + - spellcheck: Renames the fugitive pinpointer to the bounty shuttle pinpointer. + SpaceVampire: + - bugfix: Guard Spiders are no longer unable to attack after using Web Effigy + SyncIt21: + - bugfix: bluespace RPED can be put in bags again without dragging them into their + storage slots + - bugfix: normal RPED exchanges parts & displays part info again + Time-Green: + - qol: The random parallax layer moves more slowly, giving a more deep feel + distributivgesetz: + - bugfix: Fixes holoparasites not dusting their owners on death sometimes. + timothymtorres: + - bugfix: Fix ethereal crystal destruction not removing light + tommysalami3: + - rscadd: Adds boss music functionality. + - sound: Adds hierophants boss track, tweaks hierophant boss noises. +2023-08-04: + GPeckman: + - rscadd: Added whisper-sensitive cybernetic ears, which make it much easier for + the user to hear whispers at the cost of being more vulnerable to loud noises + - rscadd: Added wall-penetrating cybernetic ears, which allow you to hear speech + through walls + - balance: Basic cybernetic ears and upgraded cybernetic ears are now unlocked with + the other basic/normal cybernetics + - balance: The welding shield and luminiscent cybernetic eyes are now unlocked with + the other upgraded cybernetics + - bugfix: radio should no longer be broken for everyone + Helg2: + - bugfix: deleted trash in the walls from whiteship ruin box. + Jacquerel: + - rscadd: pAIs can be inserted into MODsuits and can control suit modules (but are + not capable of moving the suit). + - bugfix: AIs/pAIs in MODsuits can properly pin actions + MTandi: + - bugfix: removed fire alarm that was inside a window on oldstation + OrionTheFox: + - image: resprited the entirety of RnD! Genetics, Robotics, the RD, and the Science + Team themselves will enjoy the fresh new looks but same great taste! No, wait, + great STYLE! Don't eat these, they're covered in chemicals. + Vekter: + - bugfix: Fixes formatting for derelict and syndicate drone job names. They should + no longer tell you they're "the Ghost Role" when spawning as them. + - rscadd: Remapped the Metastation kitchen for about the tenth time. + - spellcheck: Fixed a typo in progressbar.dm and the file name for the progress + bar sprites. + cnleth: + - bugfix: Spell burger now has only one recipe + distributivgesetz: + - qol: Made reading text with the PDA retro theme a bit more accessible. + - rscadd: Updated Direct Messenger to v6.5.3. Now including brand new individual + chat rooms, proper image attachments and a revolutionary message input field! + - rscadd: Added a "Reset Imprint" option to the PDA painter. + - refactor: Refactored PDA imprinting code just a bit. + - bugfix: PDAs should now properly respond to rigged messages. + - bugfix: Fixes an extremely rare bug where a /mob/living/brain with a client would + not be moved out of nullspace correctly, causing admin log spam. + peptron1: + - qol: TTS volume preference is not actually a volume slider, instead of a volume + number input. + san7890: + - server: Added a preventative measure to prevent calling both TGSHardRestart and + TGSReboot, as well as potentially invoking sensitive procs that are only meant + to be called once. +2023-08-05: + Ghommie: + - bugfix: Areas created with the "land claim" blueprints are no longer hazardous + to free golems. + Jacquerel: + - rscadd: Lightgeists under AI control will selflessly heal any wounded creature + that they see. + - balance: Lightgeists can no longer repair non-organic tissue. + - admin: The imaginary friend smite now allows selecting "offer to ghosts" instead + of having to perform that poll yourself manually. When offering to ghosts you + can also offer for several ghosts to volunteer at the same time. + LT3: + - bugfix: Fixed disease outbreak viruses sometimes getting stuck invisible from + medHUDs + - admin: Added more admin features to create/manange disease outbreaks + - admin: Pressing 'cancel' on disease outbreak setup dialogs will actually cancel + the event instead of running it with default settings + MTandi: + - qol: You can fill microwave with stuff by hitting it with a box full of stuff. + Sealed101: + - rscdel: removed new player status tab Readiness Status + - rscadd: added a Ready Status Blip on the Collapse Menu button + - bugfix: golems that ate plasma are properly immune to ash storms +2023-08-06: + Fikou: + - bugfix: sniper scope and kinesis should work without widescreen + Jacquerel: + - bugfix: Goliaths no longer intermittently reset their target and retarget something + else. + - bugfix: Goliaths can once again step diagonally. + JohnFulpWillard: + - bugfix: Boss music cuts out when you die. + Kryson, MTandi, Zeckle (Mike): + - image: New bottles and holy grenade sprites + Rhials: + - qol: Most of the colored oval-shaped portals faintly glow now. Cool! + Senefi: + - code_imp: Autowiki module for stock parts + - bugfix: Emergency lights no longer runtime when created in nullspace + Vekter: + - bugfix: Fixed the DNA Infuser's circuit board missing from the techfab and tech + storage. + Watermelon914: + - bugfix: Fixed being unable to purchase regular-priced uplink items if you bought + the discounted variant of it. + carlarctg: + - rscadd: Cursed crewmembers can randomly, extremely rarely, spontaneously combust + for no reason. + - rscadd: Cursed crewmembers can get zapped by nearby light tubes. + - rscadd: Cursed crewmembers can freak out when passing by mirrors. + - rscadd: To make up for these, triggering a cursed effect is slightly less than + half as likely now when walking around now. + necromanceranne: + - bugfix: Restores a lost feature, Clarkes and Odysseus mechs once again can pivot + on a dime and step in the same button press. + - qol: Mechs universally have diagonal movement as to avoid unresponsive movement, + as block diagonal movement was having unintended side effects and was actually + intended for pivot step mechs. + timothymtorres: + - rscadd: Add pAI movement freedom when emagged. + - qol: The "Malicious Software Detected" button has been appropriately renamed to + "Reset Software" for when pAIs are emagged + - qol: Add a new law notification popup and flavor texts when pAI is emagged +2023-08-07: + EuSouAFazer: + - bugfix: Removed a doubled filing cabnet in Northstar's Library Book Return room + - bugfix: Exorcised uneeded variables from windoors in Meta's Xenobio + Ghommie: + - bugfix: Fixed a logic mistake for chasm fishing that resulted in only generic + items being spawned. + SandPoot: + - image: Changed screentips icons to something a lot fancier unified with the LMB + / RMB text. + - qol: There are accessibility preferences to disable this! Look for "Screentip + context with images" beside the other screentip preferences. + Sealed101: + - bugfix: fixed missing froth sprites + - image: bubblegum's blood smack and blood grab use new bubblegum sprites + Senefi: + - qol: Bluespace Artillery Cargo Crate includes a guide paper for how to assemble + it. + Sheits: + - image: Re-sprites some of the oldest hairstyles + Watermelon914: + - bugfix: Fixed particles sometimes being left behind when an object drops all of + its contents whilst having a particle active. + Wisemonster: + - bugfix: Fix mulebots receiving the wrong message when thier cell is added/removed. +2023-08-08: + Ben10Omintrix: + - bugfix: the bee will now care more about polinating + - qol: in case u miscliked the bee queen with a seringe 2 times, the raegent will + not be transfered to the quen if he alredy have this raegent + BlueMemesauce: + - rscadd: Emagged player-controlled bots now get different flavor text (depends + on policy) + - rscadd: Bots are now notified when a silicon toggles them malfunctioning + Comxy: + - bugfix: Damage on limbs get transferred on species change. + GPeckman: + - bugfix: Creatures with nobreath trait will now regenerate oxyloss. Androids, skeletons + and such will no longer be stuck with un-healable damage after being revived. + Ghommie: + - image: Mirrors now display a reflection of the mobs next to them... except for + vampires. + - rscadd: Added an Indebted negative quirk to the game, which gives the holder's + bank account a debt averaging at 15000 credits (with a variation of 1250 cr) + and forces 75% of all earnings towards solving it. A little prize awaits those + who actually extinguish it. + JohnFulpWillard: + - rscadd: Adds the Coroner surgery duffelbag; This replaces Coroner's surgery tools + in their medkit and current duffel, and has the cruel surgery tools instead + of regular ones. + - balance: Cruel surgery tools are no longer premium. + - balance: Coroner's medkit is now premium in the vendor. + - balance: All Coroner medkits are the same, there is no 'large' variant. + - balance: Coroners no longer get a folder. + LT3: + - bugfix: Advanced viruses that are supposed to be stealth will again actually be + stealth to analyzers + - code_imp: Virus visibility flags can now be toggled in view variables + Melbert: + - code_imp: Updated some status effect tick code to be more clear of how long is + elapsing between ticks. Some effects that were inadvertently weakened are now + stronger as a result (fire and some heretic effects). + Sealed101: + - bugfix: fixed goliaths digging sand that they can't actually reach (behind windows + or inbetween closed turfs) + - bugfix: fixed goliaths melee attacking their target despite the target running + away from goliath melee range + - bugfix: fixed goliath tentacles not spawning in mineral turfs + - bugfix: fixed goliaths summoning tentacles on targets that moved behind cover + but stayed in their targeting range. this applies for most basic mobs, really, + so if any basic mob was targeting you despite you hauling ass behind cover, + they shouldn't anymore + Sheits: + - image: fixes weird inconsistency on the neck and butt of the female base sprite + Watermelon914: + - bugfix: Fixed a hard delete that would occur with lua-created atoms. + YakumoChen, Thalpy: + - rscadd: Chen And Garry's Ice Cream is proud to debut a wide selection of cool + new frozen treat flavours on a space station near you! + - rscadd: Chen And Garry's Ice Cream revolutionary Korta Cones allow our ice cream + vendors to profit off the lizard demographic like never before! + - code_imp: Ice cream flavours now are all greyscaled similarly to GAGs + goobliner: + - rscadd: 4 New skin tones, hooray! + itsmeow: + - code_imp: Optimized z-level transition mirages, saving ~0.32s init. + softcerv: + - bugfix: former blobs are no longer able to respawn after having their mind transferred + to a new body. + timothymtorres: + - bugfix: Fix parasitic infection to cure upon liver removal + - qol: Add sounds and flashing effects to slot machines + - sound: Add new ding sound to slot machines from https://freesound.org/people/Natty23/sounds/411747/ +2023-08-09: + Ben10Omintrix: + - refactor: the hivebot is now a basic please report any bugs + CRITAWAKETS: + - rscadd: The Syndicate has begun rolling out new Tactical Deniability Implants + for their Nuclear Operative teams. It seems these implants are designed to make + teams "fight harder" by "giving incentives for fighting to the bitter end", + whatever they're talking about. + CliffracerX: + - image: resprited all duffelbags, including worn and inhand variants to match modern + storage. + Fazzie: + - qol: 'Many changes in Birdshot''s Library. + + Makes the curator''s bookshelf be Adult rather than Random + + Makes it so the curator can actually leave his desk to the main room + + In order to do that I had to move one of the bookshelves away; removed the spacewindow + behind bookshelves since they didn''t make any sense in-universe and put the + moved bookcase there + + Makes a wire no longer go through a wall to reach the library APC' + Ghommie: + - bugfix: Fixed certain aquarium fish eating other fish when not hungry. + - rscadd: Added a score award that counts how many achievements you've unlocked + so far. + - qol: Examining a fishing rod will now provide information on equipped hook, line, + bait, and right click functionality. + - balance: Fishing without a bait will only lower the odds (a smidge less, too) + of catching fish, not other things. + - balance: Catching something that isn't a fish or a living mob won't consume the + bait anymore. + - balance: The Bepis fishing rod will now ignore fish's bait preferences. + Melbert: + - rscadd: PAIs can now cast wizard spells should they have any. + - rscadd: AIs located in intellicards can now cast wizard spells should they have + any. + - rscadd: Some spells, such as AoE or conjure spells, are now castable from within + Mechas or Clown Cars. To varying degrees of success. + - rscadd: Knock will now unlock and open closets you are hiding within. + - rscadd: Repulse will now throw open closets you are hiding within. + - qol: Abductor Baton Recall now starts linked to their baton, and you can no longer + unlink your baton + - qol: Instant Summons now shows what item is marked over the icon + - bugfix: Fixes Instant Summon's name not updating when marking an item + Sealed101: + - bugfix: fixed basic mobs freezing up when in melee range of a target + Tattle: + - admin: Pings an admin role on discord when a new player joins (when enabled by + config) + Vekter: + - sound: Law changes will now play a sound to silicons impacted by those changes. + dieamond13: + - bugfix: removes a stray obj/item from random metastation wall + necromanceranne: + - bugfix: You can do autopsies on people who were revived and died again after they + had already been dissected. + - qol: Autopsies have become the surgery needed to complete the dissection experiments. + As a result, the dissection surgery has been removed as it is now redundant. + - qol: A coroner knows whether someone has been autopsied and recently dissected + (and thus hasn't been revived) by examining them. + - balance: Standardizes some of the nuclear operative entries to have more consistent + pricing within their respective categories. + - rscadd: Adds some new categories so that players have an easier time navigating + the nuclear operative uplink. + - balance: Many items have had prices reduced or adjusted to make them more desirable + or more consistent within their category. + - rscadd: Weapon kits have replaced almost all the individual weapons in the uplink. + You now buy these instead of the individual weapon. These often come with spare + ammo or relevant gear for success. + - rscadd: 'Most ammo types have been standardized in price. + + refactor; Removes a lot of redundant item entry code and tidies up the actual + code part of the nuclear uplink so that it is much easier to find things within + it.' + - rscadd: Added 40 new cosmetic items to the Syndicate Store. Buy them now from + the Hat Crate, only 5 TC! + - code_imp: Updated the nuclear operative uplink files. + siliconOpossum: + - rscadd: Added greyscale suitskirt, available in clothesmates + - rscadd: You can now roll up the sleeves of greyscale buttondown shirts + - qol: Re-added previously removed black suitskirt and the RD's tan suitskirt, as + pre-colored variants of the above + - bugfix: Fixed only one buttondown with slacks being available in clothesmates + - image: Slightly adjusted greyscale buttondown sprite, you look less fat now! +2023-08-10: + Boopideedoo: + - bugfix: fixed a Camera in atmos + - rscadd: missing Camera in chem storage + CoiledLamb: + - rscadd: Added wellcheers, a contraband soda with various side effects. + - image: resprites all cans in the drinks icon file + - image: resprites the canholder sprite in storage.dmi + Comxy: + - rscadd: Young Spiders that appear between spiderlings and adult spiders. + - balance: Wizard Spider version has better immunity against temp damage and can + lay webs faster. + - balance: Tangle Spider sucks more with self-healing but has more health. + - balance: Scout spiderling gets thermal vision. + - balance: Viper deals bonus damage when an enemy is below 20% health. + DeerJesus: + - balance: added the storage implanter to the syndie-kit tactical 'spy' kit to make + it decent. + Derpguy3: + - bugfix: The service cyborg's beverage apparatus is now capable of grabbing coffee + pots and syrup bottles. + Inari-Whitebear: + - bugfix: Metastation Kitchen APC is wired to the grid again. + Jacquerel: + - rscadd: Adds a new technology which utilises Bioscrambler anomaly cores to allow + you to transform into animals. + Momo8289: + - rscadd: Cigarettes can now be placed in and smoked through gas masks, so long + as the mask has no filters installed and is not covering the mouth. + Sealed101: + - bugfix: fixed gibtonite explosions having flames and flash ranges + Singul0: + - balance: Geode Pirates have upgraded their launchpad room to be more usable + - bugfix: Fixes a bug in the navigational computer of the Geode pirates causing + their shuttle to move sideways. + Vincent983: + - spellcheck: fixes one of the virus thresholds saying "scrathing" instead of scratching + carlarctg: + - qol: Biogenerators can be unwrenched + - rscadd: Adds Summon Simians, a spell that summons four monkeys or lesser gorillas, + with the amount increasing per upgrade. The monkeys have various fun gear depending + on how lucky you get and how leveled the spell is. If the spell is maximum level, + it only summons normal gorillas. + - balance: Wizard Mutate spell works on non-human races. It also gives you Gigantism + now (funny). If the Race can't support tinted bodyparts, your whole sprite is + temporarily turned green. + - balance: Made Laser eyes projectiles a subtype of actual lasers, which has various + properties such as on-hit effects and upping the damage to 30. + - rscadd: 'Added further support for nonhuman robed casting: Monkeys, cyborgs, and + drones can all now cast robed spells as long as they''re wearing a wizardly + hat as well.' + - balance: Made monkeys able to wield two-handed things again. + improvedname: + - balance: Removes standard vest from all security lockers and adds 3 of them to + the security wardrobe. + xPokee: + - bugfix: Fixed the tramstation kitchen not having any lights + - image: added a wagging tail for cake cats to match other cats +2023-08-11: + EOBGames, MrMelbert: + - rscadd: Mars celebrates the 250th anniversary of the Martian Concession this year, + and this has brought Martian cuisine to new heights of popularity. Find a new + selection of Martian foods and drinks available in your crafting menu today! + FernandoJ8: + - bugfix: crafting recipes without a name, such as the mothic pizzas, will inherit + the name of the item they make + Fikou: + - bugfix: fixes kinesis not actually immobilizing or blocking hands of grabbed mobs + - balance: Space Ninja's energy net uses a projectile to catch people now. + Ghommie: + - bugfix: Fixed fired foam darts, gumballs and (harmless) lollipops being embeddable. + - bugfix: Projectiles that should embed while being reusable will now do so correctly, + actually embedding the reusable casing instead of a shrapnel. + - balance: Arrows are generally more likely to embed now, except for blazing ones, + that kind of just blaze. + - qol: the quiver storage now uses numerical stacking (like botany and ore bags, + or the RPED, for example). + - bugfix: Fixed an oddity with morgue corpses being shakeable like they're just + unconscious. + - bugfix: Mirror reflections no longer display progress bars or runechat. + - bugfix: Fixed an oversight with processable items that lead to the same chat message + being sent multiple times. + LT3: + - bugfix: Large airlocks are now a subtype and function on both tiles + Melbert: + - bugfix: Fix some missing wizard spellbook flavor + - bugfix: Fixed latejoiners being affected by certain things twice, such as Summon + Guns and Summon Magic + Paxilmaniac: + - bugfix: The bulbs of lights will now have an emissive glow when on, making it + so they appear active no matter how dark the area surrounding them happens to + be. + Pickle-Coding: + - balance: Changeling arm blade has an armour penetration of 35%. + - balance: Changeling arm blade has a wound bonus of 10, from -20. + - balance: Changeling has a bare wound bonus of 10, from 20. + Vekter: + - bugfix: FRAG-12 shells no longer require sulfuric acid, instead needing 10 fluorosulfuric + acid. This should prevent them from leaving byproducts if crafted in a specific + way. + Vincent983: + - spellcheck: improvised fire extinguishers aren't full of typoes now + Watermelon914: + - admin: 'Added new lua functions: SS13.is_valid, SS13.stop_tracking, SS13.new_untracked, + SS13.type and SS13.qdel' + carlarctg: + - qol: Drill module automatically disables if it's about to drill into gibtonite + iain0: + - bugfix: A small clerical error fixed which will cause the Ukrainian station naming + prefix to be properly applied to the Independence Day of Ukraine holiday on + 24th August, rather than overwriting the Indigenous People's Day station prefixes. + timothymtorres: + - rscadd: Add admin blackhole shuttle event with a normal version and suicidal version. + - bugfix: Fix several shuttle event runtimes +2023-08-12: + Cheshify: + - qol: North Star's Cytology and Xenobiology are now significantly more usable. + - rscadd: North Star's Genetics has been tweaked. + - bugfix: The North Star's AI SAT has a working vent and it's service hall has a + working lightswitch + Derpguy3: + - bugfix: The metastation law office's shutters now function again. + EuSouAFazer: + - qol: The flowers in Meta's chapel are no longer stacked atop eachother + Ical92: + - bugfix: fixed missing departments and names in request consoles + Melbert: + - bugfix: Fix antimagic effect not expiring + Paxilmaniac: + - qol: Gigabeacons no longer need to be constructed like standard machines, instead + being printed as items that can be deployed quickly inhand without tools. + - qol: Gigabeacons are no longer their own research node, instead being a part of + telecomms tech (due to the fact they're RADIO navigation beacons) + - image: Navigation gigabeacons now have their own unique sprites, inspired by maritime + EPIRB devices. If you find a yellow box with an antenna on it, you probably + found a nav beacon! + - code_imp: The deployable component now gives you an option to disable the examine + blurb it adds to its parent + Wallem: + - rscadd: T + carlarctg: + - balance: Lepton Violet (wabbajack) shuttle must be unlocked by having some form + of polymorph happen in-game first (Pride Mirror or the cursed springs are the + most accessible sources) + - balance: Scrapheap shuttle can only be bought if the Cargo budget is below 600 + credits, and the shuttle has just less than half of its usual refueling time + left. However, it gives the cargo budget an influx of 3000 credits! + - qol: Uncle Pete's Rollerdome has had its price increased, and the disco machine + is no longer unbreakable. + timothymtorres: + - qol: Emergency shuttle now gracefully display occupancy limits and prerequisites + in the communication console. + - balance: Change mousetraps to kill mice instead of damaging them (except regal + rats) +2023-08-13: + FernandoJ8: + - bugfix: Plumbing Constructors can now deconstruct every machine they can make, + including the plumbing IV. + - bugfix: Plumbing IV drips no longer drop metal when deconstructed + - bugfix: rabbits are now small-sized rather than human-sized, as well as capable + of being picked up + - bugfix: baseballs are now small sized rather than large + Ghommie: + - bugfix: Fixed wheelchairs being silent. + IndieanaJones: + - bugfix: After a collective brain fart lasting for 6 months, monkeys and xenomorphs + now know how to remove embedded objects from their own bodies. + Jacquerel: + - bugfix: Giant Spiders only have an antag datum if created by the round event. + - balance: Flesh spider eggs hatch into adult spiders instead of baby spiders. + - balance: The eggs spawned by the start of the spider infestation event hatch into + adult Midwife spiders instead of baby ones. + JohnFulpWillard: + - qol: The mining order console is now a bit more compact, and the search bar works + regardless of which tab you are currently on. + - bugfix: X'ing out of the podpeople no soul prompt will no longer harvest the seeds. + - bugfix: Mime spell books don't eat itself when used in the dark or cancelled out + of. + - qol: Gateway access no longer requires a Silver ID. + Melbert: + - bugfix: Fixes Shadow Walk + Sealed101: + - bugfix: Labor Camp Sustenance vendor is no longer free; instead, it takes your + labor points that you'd otherwise use for paying off your point goal. + - rscadd: you can upgrade laser pointers with a bluespace crystal to let them shine + through walls at double the power cost, if the laser in the pointer is of tier + 3 or higher. + - qol: laser pointer charge can be seen by examining it + - bugfix: fixed laser pointers luring dead cats when shone upon + - code_imp: laser pointer code cleaned up a tad + TheBoondock: + - rscadd: Added Pulse of Entropy, a new ritual for rust heretic unlocked after leeching + walk. This ritual can be completed with 20 iron sheets, 2 garbage items to rust + in a 4 tiles radius round the rune. Useful for establishing bases and fighting + area. + - bugfix: fixed detect_room not running correctly when break_if_found is not passed + dieamond13: + - rscadd: Lets you grind things into a hauntium reagent which works similarly to + the solid form but is versatile and has some unique effects. + lizardqueenlexi: + - bugfix: The Nuke Op/Lone Op sniper briefcase now properly contains a sniper rifle. + san7890: + - refactor: Morphs are now basic mobs with a nice new ability to help you change + forms rather than the old shift-click method, much more intuitive. + - admin: With the morph rework comes a new ability you can add to mobs, "Assume + Form". Feel free to add that to any simple or basic mob for le funnies as Runtime + turns into a pen or something. + - bugfix: Growing spiders will now retaliate against you like they were always meant + to. +2023-08-14: + CoiledLamb, Jacquerel: + - rscadd: Adds mining weather radio + EOBGames: + - bugfix: a few issues with Martian food + EuSouAFazer: + - bugfix: The chef can no longer close the shutters in Meta's HoP office. + - bugfix: Doctors no longer spawn in the bedroom in the northstar + - qol: The icebox bridge had its items moved to better positions. No items were + added or removed, and none left their original room (except the captain's electric + razor, which went to the bathroom). + Hatterhat: + - bugfix: Projectile damage multipliers on guns are now reflected in their combat + information. + - admin: Admins can now make a gun's fired projectiles better or worse at wounding + by changing the gun's projectile_wound_bonus. Surely this will not have any + repercussions. + Helg2: + - bugfix: Inquisitor Commander now has just 1 box. + Jacquerel: + - bugfix: If you shapeshift into a mob which can eat things such as player corpses, + those things will fall out when you stop shapeshifting + - bugfix: Player-controlled basic mobs with ranged attacks can now only fire about + as fast as AI-controlled ones. + Shroopy: + - bugfix: You can no longer stand up without legs. + Vincent983: + - qol: xenos rest verb now is a hud button instead + lizardqueenlexi: + - bugfix: The modular receiver is now only printable from a hacked autolathe. +2023-08-15: + ABS-Helmet: + - image: modified glass pane wall mount icon + Comxy: + - rscadd: Added big slappy + - image: Added big slappy parts and big slappy sprites + DeerJesus: + - bugfix: you can no longer tactially stealth-hide donuts in your right hand + FernandoJ8: + - bugfix: mob holders no longer bug out and harddel when put into evidence bags. + GoldenAlpharex: + - bugfix: The formatting on PDA messages displayed to observers is now back to what + it used to be, rather than being all bold. + - bugfix: PDA messages are now displayed to observers from dead players, and not + just dedicated observers. + Kapu1178: + - rscadd: Lockers, crates, and machines no longer block click attempts in adjacency + checks. Basically, you can reach tables cornered between lockers/machines. + Melbert: + - qol: Minor mapping work to Metastation. Wallmounts, decal changes, etc - especially + around Medbay. + - qol: Remapped Meta's Morgue slightly. + OrionTheFox: + - bugfix: fixed the Tram Pod Bay having no lights + ShizCalev: + - bugfix: Medbots made with tactical medical kits now have the correct skin + SmoSmoSmoSmok: + - refactor: ice whelps have been refactored to basic mobs + - rscadd: ice whelps have a new dangerous ability which theyll use once their enraged + meter is full + YehnBeep: + - bugfix: fixed missing seating at the All American Diner + carlarctg: + - rscadd: Adds a unique medibot to the Syndicate Infiltrator. It doesn't like nukes + - when one is armed, disarmed, or detonating, it says an unique line. Players + can optionally enable personalities on it if they want to. Probably best to + just let it stay on the shuttle though. (It's also in the Interdyne Pharmaceuticals + ship, renamed) + - bugfix: Fixed an issue that made mapload medibots unable to load custom skins. + vinylspiders: + - bugfix: fixes a bug that can cause emotes to stop working if a client is being + created or deleted + - bugfix: fixes immerse overlays not being added the first time a mob enters a water + turf +2023-08-16: + DeerJesus: + - bugfix: removes bodybag welding tooltip + FernandoJ8: + - bugfix: items no longer stay in your hands after their respective arm is dismembered + MTandi: + - refactor: Refactored Mech UI + - refactor: Refactored mech radio into a utility module, adding extra slot to all + mechs + - refactor: Refactored mech air tank into a utility module with an air pump, adding + extra slot to all mechs + - refactor: Refactored mech cabin air - there is now a button to seal or unseal + cabin to make it airtight or exchanging gases with the environment + - refactor: Removed mech maintenance UI Access is set in mech UI, and parts are + ejected with a crowbar + - rscadd: Mech now has wires and can be hacked + - qol: Roboticists now can see MOD suit and mech wires + - rscadd: Mechs now require servo motor stock part and it affects movement power + usage instead of scanning module + - rscadd: Scanning module absence doesnt block mech movement and hides some UI data + instead. Big Bess starts without one. + - qol: Hitting mech with ID card now toggles ID lock on/off if the card has required + access + - bugfix: Fixed concealed weapon bay not being concealed on mech examine + - bugfix: Fixed mech radio not changing frequency + - bugfix: Fixed mech launcher type weapons ignoring specified cooldown + - bugfix: Fixed mech launcher type weapons not using specified power amount + - bugfix: Fixed mech temperature regulator ignoring gas heat capacity + - bugfix: Fixed mech stopping processing other things while not heating internal + air + - bugfix: Fixed mech being able to leave transit tube in transit + - bugfix: Fixed mech internal damage flags working incorrectly + - bugfix: Fixed Gygax leg overloading being useless + - bugfix: Fixed mechs ignoring their stock parts on creation. Syndicate mechs now + stronger against lasers and consume less energy on move. Upgrading from tier + 1 to tier 2 doesn't make mech consume MORE energy than before the upgrade. + - balance: Rebalanced mech energy drain with part upgrades. Base energy drain reduced + by 50%, 33%, 25% with upgrades and applies to movement (Servo rating), phasing, + punching, light (Capacitor rating). + - balance: Hydraulic clamp now can force open airlocks + - balance: Made mech RCS pack consume reasonable amount of gas + - code_imp: Fixed some other minor bugs and made some minor changes in the mech + code + Onule: + - image: modified light fixtures' sprites and overlays to be more pronounced + OrionTheFox: + - rscadd: Added the Bowtie! Bartenders start with one on, but they can also be found + in the Bardrobe, Autodrobe, and Clothesmate. No need to tie it either, it's + just a clip-on. + - rscadd: Added a Greyscale "Formal Jacket" of the style that most suits use, for + crew who want to make their own using the buttondown shirt. + - rscdel: Removed the generic Cook/Bartender uniforms and changed them to use the + Service buttondown w/ slacks. + - image: updated the majority of Lawyer suit sprites, along with the Cook's Apron-Jacket + and Hat, and updated/greyscaled Botany's Overalls! Also the Overalls are available + in the clothesmate, and the Cook Jorts' shirt is less crusty. + Paxilmaniac: + - image: The Mosin-Nagant has been given new sprites and a reflavor, looking for + the old rifle? Look for the Sakhno Precision Rifle. + - balance: The tiniest balance thing, but since Silverscales use the Sakhno-Zhihao + rifle, which has a scope on it, their main weapon now has a scope. + - sound: The cargo rifle now has a new, considerably more rifle sized firing sound. + Gotten from tgmc from https://github.com/tgstation/TerraGov-Marine-Corps/pull/12280. + SyncIt21: + - bugfix: multiple balloon alerts when the plumbing RCD is low on ammo + - code_imp: organized all plumbing designs into static lists for memory savings + - refactor: removed unused vars for further memory savings + YehnBeep: + - bugfix: fixed a disconnected APC in Delta's tech storage. +2023-08-17: + BlueMemesauce: + - rscadd: 'Add policy for sentient mobs that were revived by lazarus injector (depends + on config) + + add; Sentient mobs that were revived by malfunctioning lazarus injector now + get enslaved to whoever revived them.' + - bugfix: Servant golems get their master's real name (Won't be serving "Unknown" + if their master is wearing a mask) + DaydreamIQ: + - balance: Ascending as an Ash Heretic now reduces the cooldown of Nightwatchers + Rebirth to ten seconds, additionally Ash ascension has Bomb immunity added to + the resistances it offers (no stun immunity though) + DeerJesus: + - bugfix: Makes the ectoplasm anomaly not randomly move so deadchat can actually + control it + - balance: metal bat damage changed from 12 -> 20 + FernandoJ8: + - bugfix: dismemberment moodlets are replaced by a lesser mood debuff when you recover + the limb in question. + - balance: dismemberment moodlets can now stack for each limb you lose, and are + cleared separately. Their descriptions have been updated to reflect this. + - bugfix: items implanted on arms no longer become permanently stuck in-hand when + their limb is dismembered + - bugfix: quickly sheathing and unsheathing the vorpal scythe can no longer bug + out and prevent its effects from being applied + FlufflesTheDog: + - bugfix: Spaceacillin will once again provide antiviral effects for the deceased + Hatterhat: + - bugfix: Colored ammo bands, such as those on .357 and .38 speedloaders, no longer + permanently disappear upon icon update. + Helg2: + - bugfix: Skeletons now heal burn damage with milk once again. + IndieanaJones: + - balance: Hunter and viper spider toxins no longer deal liver damage. + - balance: Tangle spider's acid injection per bite reduced from 5 to 2.5. + Jacquerel: + - bugfix: Gravitational Anomalies will now correctly clean up after themselves, + instead of leaving an area of the station permanently heavy or with no gravity + at all. + - bugfix: Goliaths will try to attack mechs with their tentacles. + LT3: + - bugfix: Base large airlock subtype no longer spawns a normal sized airlock + - image: Added mapping icons for large airlocks + - code_imp: Repathed all public airlocks to consistent naming + LemonInTheDark: + - balance: De-escalates terry powergaming by reducing the strength of sec + Melbert: + - balance: Red toolboxes go faster + MidoriWroth: + - rscadd: Added 28 new food recipes! + Mothblocks: + - rscadd: You can now set your voice to just blips. + Vincent983: + - qol: the chemistry heater can now be unwrenched. + Y0SH1M4S73R: + - bugfix: Head Revolutionaries no longer count towards a revolution's defeat if + they have become simplemobs, basic mobs, or xenomorphs. + iwishforducks: + - spellcheck: fixed the rat king text saying that they're summoning rats + mc-oofert: + - bugfix: fixed border-only firedoors being able to be walked through while closed + san7890: + - bugfix: Beam rifles will no longer inappropriately retain any bonuses they may + gain from wizardry. + - bugfix: Inappropriate stack traces over bonuses being applied to components that + gain bonuses innately (like Mythril stacks) should cease. + vinylspiders: + - bugfix: fixes a harddel in particle holders +2023-08-18: + DeerJesus: + - bugfix: replaced injector with working passive vent in birdshot incinerator + - bugfix: conveyor lever in birdshot incinerator + - bugfix: fixes all the martian drinks having 20 boozepower + EuSouAFazer: + - bugfix: Moved the RD's plant to its proper place in Northstar + Fikou: + - spellcheck: fixes the name of the incline bench press + - balance: you cant speed up the big slappy with slime potion + Ghommie: + - bugfix: Fixed some jank with the dynamic threat curve. + Hatterhat: + - spellcheck: Fixed a lack of plurality when ejecting multiple casings from a revolver. + IndieanaJones: + - rscdel: Removed tiny mob sprite abilities for large mobs + - rscadd: Add a Self Seethrough ability, given to most large mobs and all mobs affected + by a fugu gland + - bugfix: Space Dragon's overlay will no longer vanish at times + - qol: Xenomorph Sentinel and Ambusher Spider's sneak ability now has a transition + to a lower alpha as opposed to being immediate. + - qol: The sneak ability now uses balloon alerts as opposed to chat alerts. + - bugfix: Fixed the Xenomorph Sentinel's Sneak ability icon being an error. + Jacquerel: + - admin: Adds Spider, Goliath, and Meteor Heart actions to the "Grant Mob Action" + menu. + - admin: Four players can ride the speedwagon + - bugfix: Turning into a space dragon with the polymorphic inverter will no longer + leave you existing in two places + - balance: You can no longer use the belt to transform into monkeys or xenomorphs, + for technical reasons. + - admin: The Add Mob Ability menu now prefixes the typepath of the ability with + the ability's name, so you can much more quickly see what the ability is. + Mothblocks: + - rscadd: Engineers now have an RCD round start. + - balance: RCD construction/deconstruction effects can now be attacked in order + to cancel them. You can get the anti-disruption upgrade disk to prevent this. + - balance: RCD construction/deconstruction is now slower if you already have another + effect up. This does not effect reconstruction. + - balance: Both of the above effects do not effect the CE's roundstart RCD, nor + any other RCDs such as combat RCDs. + mc-oofert: + - rscadd: cybernetic moth eyes and their variants + - bugfix: luminescent eyes no longer make you look like a cyclops in the dark + necromanceranne: + - rscadd: Settler quirk! Conqueror the great outdoors....in space. Just make sure + nobody asks you to get anything from the top shelf. + vinylspiders: + - image: bowtie sprite has been tweaked slightly to look a little bit more bowtie-ish + - bugfix: formal closet will no longer spawn with two 'error' icon suits inside + of it +2023-08-19: + DeerJesus: + - bugfix: you can actually tell what hand a reagent dartgun is in now + EuSouAFazer: + - qol: Delta's Detective Office looks better now. + - bugfix: No more stacked items in Meta's custodial closet + Ghommie: + - bugfix: Fixed dynamic. + Helg2: + - bugfix: fixed lavaland beach bartender closets looking off. + - qol: CTF assault class' (with shotgun and rocket gloves) description now mentions + that it has low armor and increased moving speed. + - balance: Decreased CTF recharge start delay for shields from 20 seconds to 12 + seconds. + - balance: Marksmans rifle now has 1.7 scope. + - bugfix: When toggling instagib mode for CTF and pressing a cross now will just + cancel instead of proceeding. + - bugfix: When clicking on other CTF teams spawners and after you already chose + your team no more will ask you to join some other team to make them even. + - bugfix: Base iron floor tiles now will be able to stack with other base iron floor + tiles after being reskined to the base subtype. + - bugfix: '[Waystation] Windoor for secret documents now can be accessed with away + station secoff''s id.' + - bugfix: '[Waystation] Deleted a window on the same place as windoor so it won''t + block your path to secret documents.' + Jacquerel: + - bugfix: the goliath and watcher mating season has ended and population has returned + to normal levels + carshalash: + - qol: Martian fried noodles now requires 2 grown peanuts instead of salted peanut + packet. + mc-oofert: + - bugfix: you can now toggle repair droids and plasma engines on mechas again + - bugfix: you can no longer destroy syndicate modsuits by just being on fire + necromanceranne: + - bugfix: Makes sure settlers are SHORTEST. + san7890: + - refactor: Regal Rats have been refactored into basic mobs. They should be a bit + smarter and retain their docility (until attacked, in which case you should + prepare to get rekt by summoned rats), and properly flee when they can instead + of just sit there as you beat them to death. The framework for them interacting + with stuff (i.e. opening doors while slobbering on food) is a bit more unified + too, now. They also have cooler names too! +2023-08-20: + EuSouAFazer: + - qol: Made the cytology lab in many maps much more convenient. + Fikou, Armhulen, Sheets (+rep for Mothblocks and Potato): + - bugfix: RD MODsuit outfit (admin only) no longer has a beret that blocks the activation + of the suit + - bugfix: The beret used by death squad officers no longer is blocked from being + put on a hat stabilizer module + - admin: Admins can now Shear matrices of objects in Modify Transform + - admin: Admins now have access to Test Matrices in the VV dropdown, an all-in-one + tool for editing transforms. + - rscadd: MODLink system, available through scryers (from RnD and Charlie Station) + and through MODsuits. Lets you call people with holographs! + Jacquerel: + - qol: Added some textual feedback to new watcher abilities + - balance: Watchers will not attack for a short period following their gaze attack + - bugfix: Watchers won't interrupt one ability to use the other one + LT3: + - bugfix: Rotated multi-tile airlocks display correctly and won't create an invisible + box next to itself + Melbert: + - bugfix: Reactive stealth armor decoys are half as healthy, as originally intended + Striders13: + - admin: admins can now upload files to the server up to 5mb (used to be 2.5mb) + - config: file upload restriction is now config + iwishforducks: + - bugfix: Some RCD constructs took more material than manual construction. The RCD + cost should be consistent in comparison to manual construction now. + mc-oofert: + - bugfix: ripley MK2 upgrade now properly transfers servos + - spellcheck: inserting parts into mechas now properly says "installed" instead + of "intalled" + spookydonut: + - bugfix: Incompatible quirks in existing savefiles shouldn't be possible anymore. + zeroisthebiggay: + - bugfix: healing holoparas will no longer kill slime people +2023-08-21: + Deadgebert: + - qol: Added two magboots to engine SMES room on icebox station + Ghommie: + - bugfix: Fixed embedding for projectiles. + Jackal-boop: + - balance: the lion hunters rifle has been pegged down the knowledge tree. to make + sure the tree is kept happy, the rust path and blade path can access rust charge + - rscadd: rust charge + - balance: the lion hunter ammo knowledge is free +2023-08-22: + CoiledLamb: + - bugfix: wellcheers is now based on sanity rather than mood + - image: resprites martian cans + - image: adds inhands for martian cans and wellcheers + - image: minor tweaks to other cans + - spellcheck: updates wellcheers mood text + DATA-xPUNGED: + - rscadd: Sacrificed heretic targets will now receive a phobia of heresy instead + of a phobia of the supernatural. Sacrificed heretics will not get this phobia, + but will lose knowledge points instead. + DeerJesus: + - rscadd: Adds green jester shoes that jingle to the autodrobe! + Ghommie: + - bugfix: The "Unlocked Achievements" score will now be properly saved at the end + of the round the first time it's loaded. + - rscadd: You can now feed fish with the can of fish feed without having to put + the fish in a aquarium first. + - balance: Some fish may survive in different, harsher atmospheres if given the + amphibious trait, like chasm chrabs on lavaland. + - qol: aquarium now uses balloon alerts when feeding fish. + - bugfix: The wary and shiny lover no longer incorrectly remove difficulty from + the minigame if conditions aren't met. + Helg2: + - bugfix: '[Birdshot] Morgue now has coroner''s surgery duffel bag instead of regular + surgery duffel.' + Ical92: + - bugfix: fixed beakers disappearing when swapped in a chem heater + IndieanaJones: + - balance: Lasers now have increased energy cost, reverting the cost back to the + initial value before the laser buff. + Jacquerel: + - balance: Watchers have less health + - balance: You can't be overwatched by several watchers at a time + - balance: Watchers won't overwatch you instantly upon seeing you + - balance: Goliaths won't launch tentacles at you instantly upon seeing you + JohnFulpWillard: + - refactor: AI's player-tracking eyes received an unwanted obligatory update, and + should now not tell you that a player is untrackable when they clearly obviously + can be. + - bugfix: Bots that can't be controlled (like beepsky) no longer has a stray 0 at + the very right side of its UI. + LukasBeedellCodestuff: + - rscadd: Added compact shotgun to the hos locker + - rscadd: Added compact shotgun as a traitor objective + - balance: gives the compact shotgun 1 extra shot + Melbert: + - bugfix: Fixed some tooltips in the sec records UI showing "false"s where they + shouldn't. + Profakos: + - bugfix: Mobs whose human appearance is set dynamically will once again have their + bespoke names and descriptions, instead of Unknown, with a blank description. + Rhials: + - rscadd: Ninjas can now temporarily disable cameras with the Ninja MOD right-click + hacking ability. + - rscadd: Ninjas can emag windoors, elevator controls, and buttons with their hacking + ability. + - rscadd: Ninjas can drain the power from energy weaponry, adding the charge to + their MODsuit. + - rscadd: Ninjas can now hack simplebots, overloading and detonating them after + a brief delay. + - rscadd: Ninjas can now hack vendors, causing them to eject their inventory at + people. + - rscadd: Ninjas can now hack the recycler, which notifies the AI and emags it once + complete. + - rscadd: Ninjas can now trigger an extended tram malfunction by hacking the tram + control console. + - rscadd: Ninjas can now hack open firelocks (temporarily) with right-click. + - balance: Hacking open doors with the Ninja Hacking MODule will subtract a paltry + amount of energy from your suit. + SyncIt21: + - code_imp: removed unused procs in ore silo + - code_imp: merged repeated code segments when using materials from the ore silo + into a single proc + - code_imp: added auto docs & cleaned up some procs + - refactor: logging when an item is inserted or sheets are ejected from the silo + is now handled directly by the silo itself + - bugfix: plumbing ducts connects to other plumbing machinery again + - bugfix: you can detach signaller from wires without the machine deconstructing + itself + Timberpoes: + - rscdel: Traitor objectives to place posters and graffiti the station have been + removed. + - rscadd: The items associated with the poster and graffiti objectives can now be + purchased from the Badassery section of the uplink. The posters come in a box + of 3 for 1TC, and the spraycans are 1TC each. + - rscadd: Adds a new Assault traitor objective, requiring you to the attack the + target a few times without needing to kill them. Earn TC and reputation by starting + barroom fights and bait players into escalation battles for fun and profit. + - rscadd: Expands low-risk steal objectives to include the Chef's fake moustache, + Lawyer's badge, and Mime's mask. + - rscadd: Adds brand new shift start Steal & Destroy objectives for early breaking + and entering. Smash your way into a sec checkpoint to grab a Space Law book, + engineering to grab some insulated gloves or the psych office to kidnap their + moth plush. + - bugfix: Fixes an issue where the steal clown shoes objective would never be valid. + YehnBeep: + - qol: Satchels can now be crafted using the same recipe (4 cloth) as backpacks. + - bugfix: Fixed a light inside a wall on Delta Station. + dieamond13: + - image: adds new sprites for opened fireaxe/mech crowbar cabinets. + distributivgesetz: + - rscadd: Replaced slime clone damage with a "Covered in Slime" status effect that + deals brute damage over time and can be washed off by standing under a shower. + - rscadd: Northstar and Birdshot Xenobiology have been outfitted with a new shower. + - code_imp: Replaced the magic strings in slime code with macros. Also included + some warnings to anyone daring to touch the macros. +2023-08-23: + Ben10Omintrix: + - refactor: the goldgrub has been refactored please report any bugs + - rscadd: the goldgrub can now be tamed and he can have babys + DATA-xPUNGED: + - rscadd: You can now fully color your hair with a hair spray! + - qol: splits hair sprays are now smoother on the transition, similar to the short + fades. + Deadgebert: + - bugfix: Birdshot pharmacy airlock now requires pharmacy access + FlufflesTheDog: + - bugfix: Taking a nap can once again heal minor wounds + - bugfix: A breath of healium will no longer knock you out for eternity + - bugfix: Healium sleep now respects sleep immunity + Melbert: + - code_imp: Cleans up limb wound examine text code a tad. + Rhials: + - bugfix: Metastation's arrivals area no longer has an intercom overlapping with + the request console. + ZephyrTFA: + - bugfix: pda messages are no longer hidden from dead players who are not observers +2023-08-24: + Fikou: + - rscadd: wizards are now introverts + JohnFulpWillard: + - balance: The Traitor's Camera bug is now a tablet app that works like a silent + camera console with an extra ability to track people through their nearby cameras. + MidoriWroth: + - bugfix: Moussaka now only uses eggplants instead of eggplants and potatoes + - bugfix: Pita bread no longer burns on the griddle/oven + Nerev4r & Zydras: + - image: Adds messenger bags to character setup and drobes/lockers! + Rhials: + - rscadd: The roundend report will now read out any achievements ("cheevos" as you + may know them) earned by players over the course of the round. + Vekter: + - balance: Grilles will now take 0-1 damage every time they shock something. + - balance: Powersinks are now available earlier in traitor progression. + YehnBeep: + - qol: Icebox perma now has holopads. +2023-08-25: + Ben10Omintrix: + - bugfix: regal rats now run away from whoever attacked them + - rscadd: new pet behavior which makes pets defend their owners if they got attacked + Deadgebert: + - qol: Adds air supply for cycling airlocks in ordnance and atmos incinerator on + all stations + - qol: Makes internal incinerator chamber a vacuum + - bugfix: Adds missing incinerator airlock control console to Tram station + Derpguy3: + - bugfix: Rotated a water tank in icebox's lower service hall, connecting the plumbing + to the water source. + Dmeto: + - bugfix: Some incident display adverts on Northstar and Birdshot have been unobstructed. + Donglesplonge: + - balance: removes the access restrictions from all animals found under the livestocks + tab of the cargo order console, now assistants can private order animals for + their farms without access hunting + Fikou: + - bugfix: fixes multitools possibly randomly losing their buffer + - bugfix: fixes modlinks checking battery charge without a battery and working without + charge + - qol: modlink stuff is a bit more explained + - bugfix: modlinks printed from rnd no longer start with a frequency (remember to + copy it from another one with a multitool buffer, robotics starts with 2 NT + frequency linked ones) + - balance: ninja's stealth module gives silent footsteps when active + - balance: all ninjas now have the light step and freerunning quirks + - balance: ninja's hacker module shove no longer stuns in 1 hit. first shove knocks + down and pushes away, second one stuns + - bugfix: fixes ninja shoves not causing sparks + - qol: the person in an energy net is now reasonable to hit, the dark part of the + sprite is now an underlay, so you can click the person inside the net pretty + easily and if you wanna hit the net you click the green part or the darker sides + that the human sprite doesnt cover + Guillaume Prata: + - qol: QM jumpsuit/skirt expose the torso when adjusted. + Helg2: + - bugfix: fixed apocalypse rune applying invisibility to mobs. + - bugfix: Unholy water preview icon is now similar with the icon it has. + LT3: + - rscadd: Immovable rod will now battle the unstoppable tram should they cross paths + - bugfix: Birdshot's maint tram doors now work properly + - bugfix: Tramstation's exterior light fixtures no longer get destroyed as soon + as the tram moves + - code_imp: Tram landmarks are now all subtyped instead of map varedits + distributivgesetz: + - rscdel: Removes miscellaneous sources of clone damage from the game. + iwishforducks: + - bugfix: You should be able to click on lattices on icebox with the RCD and construct + a floor now + mc-oofert: + - rscadd: becoming a felinid makes your brain smaller (visually) +2023-08-26: + GoldenAlpharex: + - bugfix: Fixes the recycler being able to grind the server to a halt by trying + to recycle the same sheet worth of material over and over and over again. + Guillaume Prata: + - qol: Medical Kiosk now have their wand removed with a right click, got new screentips + and have a few of its chat messages turned into balloon alerts. + YehnBeep: + - qol: Messenger bags can be crafted with 4 cloth. + distributivgesetz: + - rscadd: Replaces decloning clone damage with a strike system that you can replenish + with Mutadone. + - bugfix: The decloning virus is curable with rezadone again. + iwishforducks: + - bugfix: You should no longer attack RCD effects when they're done constructing. + san7890: + - admin: The "HREF Dock Exploit" message should now contain a bit more usable information + (such as a jump link) so you can investigate if something is really going wacky + with shuttles. + vinylspiders: + - refactor: fixed a bunch of instances of callbacks being qdeleted and cleaned up + related code +2023-08-27: + CoiledLamb: + - bugfix: the coroner medkit can now hold every item it spawns with + Deadgebert: + - bugfix: multitool can be used on APC/Teslacoil/SMES/emitter if it has exposed + wires. + - qol: Icebox monsters no longer spawn close enough to aggro Lia at round start + Fikou: + - bugfix: quartermasters get their voice of god power boost correctly + Ghommie: + - bugfix: Fixed the double-barreled shotgun not working properly + - qol: The Achievements UI now shows how many people have unlocked a given achievement. + - bugfix: The "Skills" Category for achievements should no longer be hidden. + Jacquerel: + - bugfix: Watchers won't retain an ethereal outline of their wings hovering over + their dead body. + Kubisopplay: + - bugfix: Borgs no longer get permastunned by emotes + - bugfix: Borg hud should not fuck up in few situations + MTandi: + - bugfix: Fixed Phazon construction message typo + RikuTheKiller: + - bugfix: Light eaters can no longer be eaten by their higher-grade brothers, the + trash eaters. (recyclers) + SyncIt21: + - bugfix: zipping a duffle bag closes the UI of all storage items opened inside + it + YehnBeep: + - qol: Stabilized yellow slime extracts no longer spam a message every charge pulse + (but examining characters will still show that it's active). + YesterdaysPromise: + - rscadd: 'Gave snow legions a separate corpse-drop pool: ash walkers excluded, + but eskimos included.' + carlarctg: + - rscadd: Adds a syndicate AI card for nuke ops. Costs 12 TC, can be refunded. Activating + it in-hand opens up a ghost poll like normal reinforcements. Base interaction + range for syndicate AIs is one, which means they can handle electronics only + in proximity. + - rscadd: Adds a syndicate AI interaction range upgrade for nuke ops, costs 4 TC + and can be applied onto a syndicate AI (inside any container) to increase its + interaction range by two per. (Three purchases are recommended for seven tiles + of range!) + iwishforducks: + - balance: Railings now only cost 2 rods and are much easier to construct. But they + can now be destroyed much easier and cut with wirecutters without unwrenching. + mc-oofert: + - qol: rats no longer spawn on multiz cable hubs + necromanceranne: + - bugfix: Ops wanting to get the CQC kit will actually get given the kit, and not + just the CQC book. + tf-4: + - spellcheck: Fixed a spelling error with the daps emote. + vinylspiders: + - bugfix: greyscale colors will now update on the mob when modifying them via the + VV menu + - qol: inserting new high luminosity eyes will now properly remember the previous + eyes' color and default to that initially +2023-08-28: + Comxy: + - rscadd: New rotator disposal pipe. + - bugfix: Flipped transit tube stations are now accessible in the RPD again. + - image: New rotator disposal pipe sprite. + Das15: + - bugfix: Big fuel tanks' capacity is back to 5000. + Ghommie: + - bugfix: Fixed an issue with the "recolor from string" option in the greyscale + modify menu that resulted in invisible icons. + Guillaume Prata: + - bugfix: Unary vents have a pressure cap on both their pressuring and siphoning + mode now, preventing the bypass trick of putting "infinite" pressure on tiles/pipelines. + - balance: Overclocked Volume Pumps do not have a pressure cap anymore. + Jacquerel: + - bugfix: You can't use the bioscrambler belt to turn yourself into a changeling. + JohnFulpWillard: + - qol: Display case chassis now uses balloon alerts, screentips, examine hints, + etc. Basically, the construction steps are more visible to players. + LT3: + - bugfix: Using an airlock painter on a GAGS airlock works properly + - bugfix: Tram will no longer fly off into space when admins try to reset the contents + MTandi: + - qol: Crafting menu "Can Make" category shows complex recipes first. + Sealed101: + - bugfix: after a long 6 years, alien alloy once again unlocks the Alien Technology + node (the one that lets you print alien alloy) + Watermelon914: + - rscadd: Added associative list variables and associative list variable manipulation + for finer data manipulation and storage. + - rscadd: List Find components will now return the index of the element it has found. + distributivgesetz: + - rscadd: Add an achievement for saving a cascading engine from the final countdown. + - balance: Damaging synchronous mesh blobs now incorporates damage resistance of + other blob structures when dealing shared damage to those nearby. + mc-oofert: + - rscadd: clickdragging an autolathe changes its output direction + nikothedude: + - bugfix: Woundscans no longer runtime + - bugfix: Normal health analyzers can no longer give the first aid bonus when woundscanning + vinylspiders: + - code_imp: fixed some typos + - bugfix: fixes a runtime with arrow projectiles + xXPawnStarrXx: + - bugfix: fixed corn cobs not making seeds and lying to you in the text box. +2023-08-29: + Ben10Omintrix: + - bugfix: mobs do not get stuck when running away from danger + DATA-xPUNGED: + - bugfix: Quartermaster's Overcoat and Cargo's gorka can now hold stamps in their + suit slots, just like their winter coat counterpart + Fikou: + - bugfix: roundstart modlink scryers now come with the nt frequency + FlufflesTheDog: + - bugfix: Made it easier to place tiles on multi z level holes + - bugfix: Non-surgically debraining someone no longer makes their brain unusuable + Hatterhat: + - bugfix: Ash drakes, colossi, and Bubblegum spawn on Lavaland more often; a sharp + increase from the previous bugged amount of "basically never". + Jacquerel: + - image: progress bars and cleaning particles are now centered on the tile occupied + by the target, if it is a big sprite + LT3: + - balance: Pre-equipped engineering modsuit now includes emergency tether + - balance: Pre-equipped atmospherics modsuit now includes magboots + OrionTheFox: + - rscadd: Cargo now once again has access to a "Cargo Shortskirt", a skirt variant + of their shorts! + - image: tweaks and adjustments to the Cargo resprite have been made, as well as + respriting some missed icons such as the Winter Coats and QM Cloak + Seven: + - bugfix: Syndicate ranged mobs (and probably other basic mobs) properly update + their shell's description to show they are spent. + Vincent983: + - qol: Various jobs have gotten additional programs uploaded at roundstart, engineers + now have the canary and atmospheric scanner programs, atmospheric technicians + now have the supermatter monitor, and Robotisists/RDs now have the silliconnect + program. + carlarctg: + - bugfix: Items worn on a void cloak's suit storage are no longer visible on the + stripping menu. + - qol: Misclicking the turf below a heretic influence no longer leaves a fingerprint. + iwishforducks: + - bugfix: Railings no longer give more metal than they take + san7890: + - rscadd: The Lavaland Cursed Slot Machine of Greed suddenly seems a lot more sinister... + - refactor: Instead of taking clone damage from the cursed slot machine, you now + get a status effect with a number of curses associated with it. There's some + interesting florid language associated with the status effect as a nicety until + your eventual gibbing from chasing that prize. +2023-08-30: + Ghommie: + - sound: Unlocking an achievement now plays a sound by default. You can change it + in the Sound category of the game preferences. + Melbert: + - balance: If your server has non-human morgue cadavers enabled, you will be guaranteed + one human cadaver no matter what. + - balance: All maps (with the exception of Birdboat) now have an additional morgue + cadaver roundstart. + RikuTheKiller: + - bugfix: Probital overdose no longer causes plasmamen and other inorganics to receive + the longest nap in their lives. + Sealed101: + - qol: Metastation has had more navigate landmarks added, namely for areas like + Medbay, Cargo, Engineering, department heads offices and a few more. + SyncIt21: + - refactor: sheets are merged in a better way when ejected from machines & material + related stuff + - bugfix: rcd can build wallmounts on reinforced walls + - qol: rcd can build directional windows without requiring/building a grill + Timberpoes: + - bugfix: Fixes an issue where role banned players would be able to accept certain + ghost roles they're meant to be banned from. + VladinXXV: + - qol: The coroner can now store scythes in their labcoat and winter coat suit storage. + Ask not for whom the bell tolls... + xPokee: + - bugfix: fixed skeleton wings not being visible from behind while closed +2023-08-31: + Comxy: + - bugfix: Fixes Star Gazer getting buckled + - image: Removes Star Gazer alpha pixels + Fikou: + - qol: removes the nukie tool parcel and places the tools directly in their box + GoldenAlpharex: + - bugfix: Fixes a rare issue that could lead to players entering an infinite disconnection + loop from having a null view. + Guillaume Prata: + - qol: The "You can't move while buckled to X" is now a balloon alert instead of + a to_chat message. Hopefully we all get buckle stuck processing why our inputs + are not working less often for now on. + LukasBeedellCodestuff: + - bugfix: Changed icebox permabrig door type to be correct + Momo8289: + - qol: Cryotubes will now notify medbay if the patient within is dead, and will + eject them if auto is on. + - qol: Cryotubes will now automatically turn on when a patient enters it if auto + is on, but you can no longer close the cryotube on yourself. + SyncIt21: + - bugfix: autolathe prints the correct amount of stacks and merges it with existing + stacks on the turf + - bugfix: autolathe takes constant time when printing stacks + - code_imp: autolathe will attempt to award you the "getting an upgrade" award only + once when printing multiple items & updates UI immediately + iwishforducks: + - bugfix: Space heaters no longer give extra cells when deconstructed + necromanceranne: + - bugfix: Compact fishing toolboxes no longer break space and time to contain any + normal-sized object. Instead, they only break space and time to contain fishing + rods. Settlers migrating to Nanotrasen space have no reasonable explanation + for this phenomenon. + nikothedude: + - balance: Prosthetics and slimepeople can now have limbs dismembered + - balance: Slimepeople can now receive slash wounds, but cannot bleed + - balance: Most limbs can now be dislocated + - refactor: Scar backend reworked, scars will be wiped as they update to the new + format + san7890: + - bugfix: The Cursed Slot Machine should now actually give you more than one pull. diff --git a/html/changelogs/archive/2023-09.yml b/html/changelogs/archive/2023-09.yml new file mode 100644 index 0000000000000..2759082984006 --- /dev/null +++ b/html/changelogs/archive/2023-09.yml @@ -0,0 +1,1251 @@ +2023-09-01: + 1393F: + - balance: megafauna will now gut instead of dusting or gibbing + FernandoJ8: + - bugfix: containers can no longer add more water to hydroponic trays than they + actually contain. + - bugfix: watering a hydroponic tray with amounts of water lesser than 1 will no + longer be added to nutrients rather than water + GoldenAlpharex: + - bugfix: Fixed the crafting menu being able to get stuck if your crafting recipe + somehow goes missing. + - code_imp: Improves the quality of the item crafting code slightly. + Guillaume Prata: + - balance: Fanny packs are now silent, no one will get a chat message about what + you put in or take out. + MTandi: + - rscadd: Mood buff power and duration depends on the ingredient quality and recipe + complexity of the food. + - rscadd: Hand-crafted food also gives a non-mood buff. The buff type depends on + recipe complexity and duration - on ingredient quality. + - code_imp: Added infrastructure to assign custom buff to certain dishes for unique + effects + - rscadd: Consumable reagents now care about purity, being more nutritious with + higher purity. Dispensers give synthetic food, natural sources are organic and + better and give longer buffs. + - rscadd: Grown food reagent purity now depends on lifespan, endurance and instability + stats of the seed. + - rscadd: Natural booze now uses the same purity formula and 100% purity can increase + booze power by up to 200%. + - rscadd: Added Fat reagent that is now a base type for lard, vegetable oil, olive + oil. Corn oil and cooking oil merged into vegetable oil. + - balance: Reagents and their purities are preserved during food chemical reactions, + processing, cooking and crafting. + - balance: Sugar nutrition rebalanced due to it being 100% pure in chem dispenser, + overdose happens at 100u now. + - bugfix: '`grind_results` of grown food give full amount equal to all removed nutrients + instead of just `/datum/reagent/consumable/nutriment`' + - qol: 'Seed Extractor now shows additional seed data: possible mutations, juicing + result, grinding result, fermentation result' + - bugfix: Reverts the unintended change of monkey cube biomass cost back to 50 + Momo8289: + - bugfix: Meth will no longer explode when reacting in a body + Rhials: + - rscadd: Nuclear operatives have expanded the scope of their hiring practices. + Members of all species can now roll nukie! + - qol: The preferences menu now has an option to always be human when being selected + for a nuclear operative role. Check it out! + - image: Plasmaman operative envirosuits. + Sealed101, EBAT_BASUHA for spritework: + - rscadd: Wizard's Den now has a book of Summon Cheese in the Studies Room + Seven: + - bugfix: Fixes not being able to break out of graves + - qol: Graves are no longer dense (you can walk over them now) + VladinXXV: + - qol: The organ harvester's output is more predictable, and the direction can be + changed by alt-clicking with the panel screwed open. + carshalash: + - qol: Adds accessibility to breasts for service members + nikothedude: + - rscdel: Deleted a unused file + xPokee, Pirill: + - rscadd: Added flower crowns, craftable via the clothing menu. + - image: Resprited geraniums, poppies, and lilys, along with changing their worn + icon. +2023-09-02: + Jacquerel: + - bugfix: Prevents admins from accidentally gibbing people by closing a confirmation + window. + - bugfix: Traitors should generate with "free objective" less often, and will once + more be assigned to steal things. + Profakos: + - bugfix: Ex-Interdyne pirates can now successfully spawn on case sensitive host + systems, such as Linux + Shadow-Quill: + - bugfix: Hilbert's Hotel Research ruin now has a functioning tram. As a side effect, + the malfunctioning tram event should now only fire on maps with a tram! + Thebleh: + - bugfix: fixed access on a couple of Engineering and Atmos airlocks on DeltaStation +2023-09-03: + Ben10Omintrix: + - bugfix: basic ranged mobs will now chase victims + Capsandi: + - sound: 2 new ambient tracks for maintenance tunnels + Fikou: + - bugfix: you can now examine screen objects properly + Ghommie: + - bugfix: You can now actually fish soggy wallets from toilets, rare ores on ice + moon, some boney stuff in oil puddles (good luck finding them) and lube-fishes + by the seawater. + Guillaume Prata: + - rscadd: 'New funny internals for the clowns to spawn with. They come with O2 and + a secondary gas between 3 options: BZ, Helium and N2O. Talk with a "different + tone" with Helium, giggle and laugh "uncontrollably" while under the minor effects + of N2O or have "fun" hallucinations while under the minor effects of BZ.' + - balance: To not cut on how long the clown's O2 internals last due to the mixed + gases, the funny internals have 50% more gas volume, same as engineers' internals. + Iamgoofball: + - bugfix: You can no longer create non-synthesizable chemicals with bees. + Melbert: + - bugfix: Fix bastard sword granting infinite stun immunity + - balance: Ascended Blade Heretics no longer have blanket stun immunity, they now + have 45 seconds of stun absorption that recharges after 2 minutes - think His + Grace. This doesn't affect stamcrit (still immune to that) (assuming you haven't + consumed all of your immunity charge) but does affect hard CC such as slips, + flashbangs, or beepsky. + - balance: Ascended Blade Heretics now have a 0.75 modifier to incoming knockdowns. + Profakos: + - bugfix: The HUDs of mobs with dynamic human appearance will appear properly. + Rhials: + - qol: The pirate candidate gathering poll will now mention which pirate gang it + is gathering candidates for. + Sealed101: + - bugfix: fixed implanted legion cores being available for use when unconscious/dead. + blueDev2: + - bugfix: Soups are accepted by Kitchen Smartfridges + - bugfix: Soups are not accepted by drink showcases + carlarctg: + - rscdel: Removed the threshold for confusion symptom that adds illiteracy to the + disease. + - balance: Clamps confusion symptom's confusion to a maximum of 30 seconds. + - qol: Confusion as a debuff no longer guarantees random movement if you're resting. + nikothedude: + - bugfix: Slash wounds are now compatable with pierce wounds + xPokee: + - bugfix: Fixed the air inside of a penguin pen being way too cold +2023-09-04: + CoiledLamb: + - rscadd: adds medical carts and surgery trays + - image: gives the surgery razor a unique sprite + - image: resprites the genesploicer. + DaydreamIQ: + - rscadd: Adds the medbeam module for nukies, don't cross the damn beams. (Also + removes the handheld one from the uplink) + DrDiasyl: + - sound: 'Adds/modifies next sound files: airraid.ogg, bloblarm.ogg, alert.ogg, + notice3.ogg, announce_syndi.ogg' + - sound: Code Red, Delta, and other extreme emergencies now possess more unique + alarm sound effect + - sound: Captain's arrival now is announced by Captain's announcement sound, but + not for Acting Captain's + - sound: Making Captain announcement through emagged console; hijacking or fully + corrupting evacuation shuttle now plays more ominous sound + - sound: Making announcements through Requests Console now plays a more noticeable + sound + - image: Status Displays sprites have been fully changed. Now they include displays + for every Security Level + - qol: The "Red Alert" button in the Communications console status display menu + has been replaced with a "Current Alert" button showing the current station + Security Level display on Status Displays + - qol: Communications console status display menu got a new "Radiation" button which + shows radiation symbol on Status Displays + FernandoJ8: + - bugfix: boiled rice doesn't burn instantly after being baked + - code_imp: simplifies the way burning food is handled, grilled/baked food now turns + to a burnt mess rather than being set on fire, unless they have a baking/grilling + recipe + Fikou: + - bugfix: kinesis plus properly lets you move again when grabbed once + Guillaume Prata: + - rscadd: Atmos Tech now have new drip and will spawn with Atmos Overalls to protect + their clothing from gas leaks! (It will actually not protect you against fire + or leaks, but hey! It's the thought that counts!!) + Sealed101: + - bugfix: fixed basic mobs not dropping their butcher results when gibbed + Time-Green: + - rscdel: Removes the swarmer beacon achievements from the game (no one ever got + them, and they haven't been obtainable for years) + Whoneedspacee: + - bugfix: Multi-z Icebox ruins including the Demonic Frost Miner can now be placed + again + carlarctg: + - sound: Adds a sound effect for hypospray/medipen injections. Doesn't affect sleepy + pens or HMS injectors + distributivgesetz: + - code_imp: Moved some job-related achievements from the misc category to the jobs + category. + vinylspiders: + - bugfix: '''meat product'' and imitation carp meat are now considered synthetic + meats for the purposes of reagent purity' +2023-09-05: + Ben10Omintrix: + - qol: pollinating bees will now only attack players that are standing near the + beehive + Eronymun: + - bugfix: You can no longer walk into Birdshot's secure tech storage like you own + the place - unless you do own the place. + Ghommie: + - bugfix: It's now humanly possible to reach the legendary fisherman rank, get the + achievement and the hat. + - bugfix: fixed fishing skeleton mob spawners that immediately crumble back into + the void of whatever chasm you fished them from. + - balance: The fishing minigame should be easier now. + Iamgoofball: + - bugfix: Updates the changelog link for the pre-4407 changelog as it was moved + JohnFulpWillard: + - bugfix: PDAs being on silent no longer prevents PDAs from being sent to your chat, + again. + - rscadd: pAIs inserted into a PDA can now control the PDA, and will receive PDA + messages sent to it (and can respond under the PDA's name). + LT3: + - image: New medical bed and emergency roller bed + - code_imp: Added context hints for beds + Sealed101: + - bugfix: fixed bileworm evolution deleting anything they devoured; they will now + eject their contents upon evolution to vileworms + mc-oofert: + - bugfix: emissive appearances on glowy eyes and such now properly rotate +2023-09-06: + Acantharctia: + - rscadd: Added the Numb quirk, that makes you (almost) unable to perceive how much + your injuries hurt. + Ben10Omintrix: + - refactor: the minebots have been refactored please report any bugs + - rscadd: minebots can now mine walls and collect ores automatically and they will + alert everyone if they find u dead + CoiledLamb: + - image: cleans up the engineering emergency internals sprite slightly + Jackal-boop: + - spellcheck: re-writes cosmic heretic lore + Krysonism: + - image: resprites the noticeboard + carlarctg: + - bugfix: Fixed walking into grilles to destroy them + lizardqueenlexi: + - bugfix: Fixed all-in-one grinders not giving all the correct reagents when grinding. + - spellcheck: Improved phrasing and syntax on dismemberment mood messages. + - bugfix: Snow legions now drop only one corpse, and no longer drop Lavaland corpses. +2023-09-07: + Ben10Omintrix: + - bugfix: basic mobs can now use ranged burst attacks + Dmeto: + - bugfix: Machine frames in NorthStar Cyto are now functional. + - qol: Minor cable/pipe changes to NorthStar the xeno containment. + - qol: Adds cables under birdshot xeno containment shielding. + Eronymun: + - bugfix: The Birdshot Gaming Den now has arcade circuit boards and computer frames + that actually work. + Melbert: + - rscadd: '[Icebox] Remaps arrivals and the maintenance around it. Aux base out, + mass driver into a plasma lake in.' + Sealed101: + - bugfix: fixed mirrors not breaking when a curse effect is triggered + Thunder12345: + - bugfix: Public mining storage's camera is now on the mining network instead of + the gulag. + dieamond13: + - image: adds special sprites for lungs when you use the smoker quirk + norsvenska: + - qol: NorthStar's departmental head offices have had their respective PDA & ID + imprinters added! + - qol: The NorthStar Head of Security office has gotten a small expansion. + vinylspiders: + - bugfix: leash unit test will time out less often and increases the timer until + it is considered 'timed out', to reduce false CI failures +2023-09-08: + Deadgebert: + - balance: gas mixer output now accurate to set ratio regardless of input temperatures + Ghommie: + - image: The glow shoes from the ClothesMate now actually glow and can be recolored, + even with a spraycan. + - spellcheck: Corrected the name of the telescopic fishing rod to "telescopic fishing + rod" from the more generic "fishing rod" + Jacquerel: + - rscadd: Traitors, Changelings, Heretics, Wizards, Malfunctioning AIs, and Ninjas + can now all reject their original objectives and provide one of their own in + its place. A Heretic doing this will no longer be able to ascend. + - rscadd: '"Custom" objectives which aren''t mechanically tracked will no longer + report success or failure upon round end.' + - qol: Space Ninja spider charges will now display where they can be detonated when + examined, if you are a ninja. + JohnFulpWillard: + - bugfix: Getting a node researched now properly makes it no longer hidden. + - bugfix: Ninjas draining RD servers now drains it from the connected techweb, rather + than sniping Science. + - balance: Machines will first try to connect to a techweb with servers on their + z-level, with the Science techweb remaining as fallback. + - rscadd: Oldstation RND, comes with their own Techweb and special surgery to gain + research points through dissecting Xenomorphs. + LT3: + - bugfix: Meteors no longer take damage from crossing certain unoccupied turfs + Sealed101: + - balance: colossus' near-death attack now starts after a 0.5 seconds delay + carlarctg: + - bugfix: Cauteries now have 'heat', like lighters, welders, etc. + - qol: You can smoke with a space helmet as long as you have internals on. + cnleth: + - bugfix: Megafauna now correctly prints the victim's name after a kill + san7890: + - refactor: If you transform into another mob and notice bugs with interacting with + the game world, please create a bug report as this framework was recently refactored. + vinylspiders: + - bugfix: fixes creamatorium not producing any suspicious ice cream, and fixes a + dead mouse related harrdel +2023-09-09: + CoiledLamb: + - image: updates medigel sprites + Jacquerel: + - balance: Traitors who are activated as sleeper agents or arrive late on the arrivals + shuttle will begin with more reputation and likely be able to immediately access + most of the uplink catalogue. + LT3: + - qol: Supermatter common channel alerts are less frequent if the crystal's integrity + is rising rapidly + Majkl-J: + - bugfix: The messenger app can now be used when laying down. + san7890: + - rscadd: Ever see a robot yawn? Don't worry, it makes sense now. +2023-09-10: + Jacquerel: + - bugfix: It is now possible to smoke cigarettes even if you aren't wearing a safety + helmet + - bugfix: Golems can eat + - bugfix: Cooked and crafted food should be edible + - bugfix: Medborgs can now spawn vanilla ice cream instead of nothing ice cream + - bugfix: Ghosts can examine food + - admin: Admins can add/remove the spawner component from arbitrary items again. + Rhials: + - qol: adds some more traitor objective brainwashing default objectives. + - spellcheck: fixes the double-punctuation on traitor objective brainwashing broadcasts. + - spellcheck: brainwashing deadchat broadcasts will now auto-punctuate. + carshalash: + - bugfix: ' Corrects various food types from the martian food expansion' + distributivgesetz: + - admin: The "Create Command Report" verb now has the option to not print report + papers at communications consoles. + leaKsi: + - bugfix: Exploration drones can't be used to reach Centcom anymore. + nikothedude: + - refactor: Refactored wounds yet again + - bugfix: Wounds are now picked from the most severe down again, meaning eswords + can jump to avulsions + - bugfix: Scar descs are now properly applied +2023-09-11: + Jacquerel: + - image: Hivelords have a new sprite. + - image: Hivelord and Legion brood have a death animation. + - bugfix: Your clothes and such should correctly reposition themselves if a black + charged slime extract turns you into a monkey. + Melbert: + - rscdel: Spacers are slightly shorter. They're still taller than other people, + just not as much. + - 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 + Profakos: + - bugfix: Mortar and pestle can grind stuff again + Sealed101: + - balance: polymorph belt now blacklists mobs that are undead, humanoid, robotic + or spiritual (in nature, not religiously), as well as megafauna + - balance: however, this means that it works with more mobs that it should logically + work with, like slimes/bugs/lightgeists etc + - bugfix: fixed headslug shenanigans with the polymorph belt hopefully for good + this time + - bugfix: fixed headslug description mentioning its movement despite the slug being + dead + Vincent983: + - rscadd: 'Added the service borg "drink apparatus" upgrade, which adds an extra + drinking apparatus to the borg, up to a maximum of 5 extra. + + :cl:' + Wallem, MTandi: + - image: Updates chem factory tank sprites + blueDev2: + - qol: Rice Dough may be made in beaker instead of being crafted, but the rice and + flour must be added first + cnleth: + - bugfix: Changeling tentacle and bloodchiller from xenobio will no longer stop + working if you have antimagic + mc-oofert: + - rscadd: humpback emergency shuttle +2023-09-12: + CoiledLamb, Time-Green: + - image: resprites the radioactive nebula shielding + GoldenAlpharex: + - bugfix: The message sent to admins when a new admin has been added via the Permissions + Panel will now properly show the new admin's ckey. + Jacquerel: + - bugfix: Ninjas should be correctly credited for using their spider bombs + LT3: + - code_imp: Status display shuttle timer no longer scrolls + Pickle-Coding: + - balance: Supermatter zap power generation scales with the delta time between its + last zaps, preventing faster zapping from scaling power generation to extreme + levels. + - bugfix: Fixes supermatter zap rate not scaling properly. It should zap much faster + at higher energy levels as intended. + - qol: Changeling chemical generation scales with the world's delta time, making + its rate independent of subsystem lag. + - qol: Revenant essence generation scales with the world's delta time, making its + rate independent of subsystem lag. + - qol: Xenomorph plasma generation and resin healing scales with the world's delta + time, making their rates independent of subsystem lag. + carlarctg: + - rscadd: Several common 'household' reagents can be used as improvised medicine + treatment. + - rscadd: Drinking tea will help mend (non-bone) wounds over time. + - rscadd: Flour and corn starch may be splashed onto wounds to help dry them up, + though they'll have a negative effect on burn wounds. + - rscadd: Added a new reagent, saltwater, made by combining table salt with water. + - rscadd: Table salt and saltwater can be splashed onto wounds as well, reducing + bleeding and improving sanitization and disinfection significantly. However, + the coarse undiluted salt will irritate the wounds, reducing clot rate and flesh + healing, and both of the reagents will increase a burn wound's infestation rate. + - rscadd: Altered Table Salt's recipe to just need sodium and chloride. Changed + the recipe of Pentetic Acid and Heparin to need table salt (sodium x chloride) + and thus slightly altered the total output of those reagents (pentacid went + from 5u per reaction to 4u, heparin 4u->3u) + - rscadd: Saline-Glucose Solution now needs 2u of saltwater and 1u of sugar, meaning + the overall recipe should be completely unchanged in practice. Contact me on + discord if any issues arise from these chemical changes! + - qol: First aid analyzers now give easy-to-understand direct information, with + the specific recommended treatments bolded in the analysis text. They also have + a 'unique' extra bit of info, telling you about improvised ways to remedy your + wound. + necromanceranne: + - bugfix: The vorpal scythe is no longer as greedy about you murdering people, and + will once again accept striking any living creature to be sated. + nikothedude: + - bugfix: Medicine allergy can no longer roll quantum medicine + san7890: + - image: When you throw up nanites, your vomit should now be appropriately nanite-colored. + timothymtorres: + - bugfix: Fix capture devices allowing mob actions while inside +2023-09-13: + ArcaneMusic: + - qol: Shuttle engines now tell you how to install them in their screentips and + their examine text. + CoiledLamb: + - image: resprites pestkiller, weedkiller, and nolabel sprays + - image: updates shading on medigels + - image: resprites all spray bottles + Ghommie: + - bugfix: The holographic pufferfish from the holographic beach from the holodeck + no longer looks like a goldfish. + Ghommie (Based on an old PR by Trilbyspaceclone from Citadel): + - qol: The notepad app now includes basic nautical directions in its default message. + - qol: A tip about nautical directions, too. + Hatterhat: + - rscadd: The SC/FISHER disruptor pistol, a very compact, permanently silenced energy + gun, is now stocked in Nanotrasen-accessible black markets with a price generally + somewhere between 400 and 800 credits. Aspiring users are warned that it's really + bad for trying to actually kill people. Caveat emptor. + - rscadd: Guns now have a dry_fire_sound_volume variable, allowing for guns to be + less loud when trying to fire while empty. + - bugfix: Closets and crates now properly count as structures for pass flags again. + Jacquerel: + - rscadd: Operative MODsuits now have an attached "jump jet" which sends you upwards + and allows you to use your jetpack under gravity for a few seconds, perfect + for navigating the pits and valleys of Icebox Station. + JupiterJaeden: + - balance: removed anti-drop implants from the nuclear operative uplink + - balance: removed anti-drop implant from the nukie implants bundle and changed + its cost to 20 TC + Melbert: + - bugfix: Birdboat's Augment Theater is named less odd now + Rhials: + - bugfix: The psyker headset is no longer a syndicate headset subtype, and no longer + has syndie comms. + SuicidalPickles: + - qol: Cargo Coats/Jackets can now equip universal scanners on their suit-slots. + Wallem: + - qol: Examine a Dish Drive to see all the items inside of it, as well as the item + you'll pull out when you interact with it. + - qol: Dish Drive servo tier increases suction range + blueDev2: + - bugfix: Soup recipes, that make items, spawn the correct number of items per reaction + instead of just one item + - bugfix: Soup recipes, that make items, consumes the correct number of reagents + instead of the largest multiple of the reagents + starrm4nn: + - bugfix: the ablative coat's hood now hides the wearer's hair and ear + timothymtorres: + - balance: Add hypnosis vulnerability for drugged victims + vinylspiders: + - bugfix: fixed grown food items not getting the right seed type passed to them + upon creation +2023-09-14: + ArcaneMusic: + - qol: Conveyor belts now have screentips and a better examine tip to teach you + how to set one up properly. + - qol: Using a conveyor belt stack on a placed conveyor belt will extend the conveyor + belt to the output of that conveyor belt.. You can use this to place fully integrated + conveyor belts much easier now. + Das15: + - bugfix: You can no longer teleport to disabled beacon if the teleporter was previously + locked-on to it. + IHateGeese: + - bugfix: Nightmares can no longer receive wounds + - bugfix: Nightmares can no longer have limbs dismembered + Jacquerel: + - bugfix: Roundstart medbots and cleanbots are now more likely to be able to be + possessed by observers. + - admin: It's easier to modify the properties of bots to stop them from being possessed + or depossessed. + LT3: + - bugfix: Emergency shuttle should correctly scale timer up/down when changing security + levels + Mothblocks: + - bugfix: Dynamic now biases less heavily towards the exact average. + Rhials: + - rscadd: Shuttle Firesale positive station trait. Some emergency shuttle options + have been put on sale! + - rscadd: Misplaced Wallet positive station trait. You wouldn't steal from a missing + wallet, would you?? + - rscadd: Wisdom Cow Invasion positive station trait. + - rscadd: Advanced Medbots positive station trait. Better roundstart medbots! + - rscadd: Loaner Shuttle positive station trait. More shuttle loan offers and more + payout! + - qol: Station Trait titles are now italicized for easier reading. + - spellcheck: Fixes a "prerequisites" typo in the shuttle purchase menu. + Seven: + - balance: The supermatter delamination countdown has been lowered from 30 to 13 + seconds + - balance: Removing a sliver from the supermatter further lowers that down to 3 + seconds + - balance: The supermatter crystal uses bigger text on its final countdown + - spellcheck: Some supermatter delamination related mood descriptions have been + edited to explain the mood effect better + Timberpoes: + - bugfix: Fix poor dynamic threat distribution at lower population levels, causing + dynamic to generate better threat curves at lower population levels than it + did before. +2023-09-15: + Ghommie: + - bugfix: fixed fishing. + - bugfix: Fixed a race condition that made fishing yield no reward way too often. + - bugfix: The legendary fisher achievement is awarded even if you don't win the + minigame. + - bugfix: Fixed a fish hook exploit. + - bugfix: Baits are now properly consumed by caught fish and (alive) mobs. + ZephyrTFA: + - bugfix: you can no longer bypass html sanitization using the table element. >:( +2023-09-16: + AtomTheProphet: + - balance: The spontaneous brain trauma event will no longer occur if there are + fewer than 13 players. + Donglesplonge: + - bugfix: adds the bolted and welded helper to the bar backroom/kitchen coldroom + airlock on birdshot, as to prevent chefs from being able to access armor and + sunglasses roundstart with barely any work involved + Hatterhat: + - bugfix: Flares and candles no longer sound like flashlights when being turned + on. + - bugfix: Getting shot by an SC/FISHER now disables PDA lights for consistency's + sake. + - balance: Pulling embedded items e.g. shrapnel with hemostats is now a lot faster, + and scales appropriately with toolspeed. + - balance: You can now pull embedded items with wirecutters, at a speed penalty. + Jacquerel: + - balance: Watchers will no longer put you at gunpoint. + - bugfix: The nuclear operative MODsuit intellicard now actually downloads an AI + rather than simply kicking candidates from the game. + LovliestPlant: + - qol: '[Deltastation, Icebox, Metastation, Tramstation] Adds cell timers to isolation + cells. (they do not auto-open the doors)' + - qol: '[Birdshot, Deltastation, Icebox, Metastation, Northstar, Tramstation] Adds + translator glove modules to the stacks of "accessibility" (e.g. plasma fixation + / thermal regulator) modules found in security, medical, and engineering storage + rooms.' + - qol: '[Birdshot] Adds a roll of packaging paper to the cargo office.' + - qol: '[Icebox] Adds a hand labeler to security''s gear room.' + - qol: '[Northstar] Nudges the set of binoculars covering the mass driver controls + in ordnance over a few inches.' + - bugfix: '[Birdshot] Remaps the janitor''s closet such that the recycling machine + will now work.' + - bugfix: '[Icebox] Removes a duplicated hand labeler from the rack near security''s + brig cells.' + - bugfix: '[Metastation] Patches a broken corpse disposal pipe running from aux + surgery to the morgue.' + - bugfix: '[Northstar] Fixes the SM being hotwired at round-start (partially rewires + the SM room, moves the APC to the North wall).' + Pickle-Coding: + - bugfix: Fixes tesla coils duplicating the power of >7GeV supermatter zaps. + SyncIt21: + - bugfix: returning items to vendors works correctly + - bugfix: you can't return items that has stuff in it for e.g. a serving tray with + food in it + - bugfix: Unary vents & Injectors now link properly with air sensors via multitool + both ways + Thunder12345: + - rscadd: There's a new space ruin in town, be on the lookout for a hidden supply + cache. + - rscadd: Added a new type of wall which can only be destroyed by blowing it up. + Vincent983: + - qol: The supply beacon will no longer delete itself due to explosions, and you + can now anchor it with a wrench. + - spellcheck: Express console now correctly states that it needs cargo access instead + of QM access. + Zergspower: + - bugfix: Space ruin Anomaly Research - Fixes stacked windows and underplating + cnleth: + - spellcheck: Replaced an irrelevant tip of the round about scars with a better + one + mc-oofert: + - bugfix: the bank machine cannot print holochips worth 0 credits now + - rscadd: climbing hooks that allow you to go up holes for multiz, found in internals + boxes (on planetary maps), the uplink, cargo and nukie personal lockers + san7890: + - balance: You will be knocked down again on certain vomits. Don't worry, you'll + deserve it when it happens. + vinylspiders: + - bugfix: fixes a bug that would cause grown inedible plant seeds (like tower cap) + to vanish from existence upon being added to the seed extractor + - bugfix: fixes a issue that would cause fruit wine to bug out when trying to blend + its reagent color +2023-09-17: + ArcaneMusic: + - rscadd: Wall mounted objects (Things like APCs, Air Alarms, Light switches, Signs, + Posters, Newscasters, you name it) will now fall to the ground and break or + deconstruct when their attaching wall is changed or broken. + Ical92: + - bugfix: adds a few firelocks and alarms around IceBox + Timberpoes: + - bugfix: Forgetting to take dough out of the oven no longer progresses the server + to a crash-worthy state with infinite bread and ash and burned food products + for all. + Vincent983: + - qol: the recycler can now be rotated + blueDev2: + - bugfix: Lipolicide and other chems now puts you in crit, even if it is the only + source of damage + cnleth: + - image: Hercuri spray now uses the same sprite as the yellow medical spray + - spellcheck: Added a missing space to hercuri spray's description + mc-oofert: + - bugfix: the nukie medibot (oppenheimer) has access to the doors of the infiltrator + and is not shot at by the turrets + notlulz: + - bugfix: Monkeys have their tails back. + - bugfix: Recipe paper in the ruins now shows a normal recipe for Metalgen and Secret + sauce. + starrm4nn: + - spellcheck: Fixed some typos on QM's Overcoat +2023-09-18: + ArcaneMusic: + - rscadd: A new ruin has appeared on lavaland, featuring the site of an ancient + battle. + Jacquerel: + - rscadd: Ghosts (observers) can eat ghost burgers and booberry muffins. + - balance: Ghost burgers will not decay or pick up germs due to the fact that they + moved themselves off a table. + Melbert: + - balance: Humanoids without tongues cannot cast spells with vocal components + - balance: Humanoids without arms cannot cast spells with emotive components + SyncIt21: + - qol: Machines now transfer their local materials to silo during linking with multitool + - code_imp: added some null checks for general juicing & grinding items + - bugfix: grinding stacks now grinds as many pieces/sheets from the stack as possible + that can fit in a beaker/container without wasting the whole stack + - bugfix: plumbing chemical grinder now actually works again + - bugfix: the plumbing chemical grinder allows stuff to enter from any direction + but not mobs and also accepts items put inside it via hand including bags + - bugfix: You can remove the beaker from the all in 1 grinder when power is off + via right click + - bugfix: All in 1 grinder now mixes faster with upgraded parts + - refactor: you can no longer walk into a plumbing chemical grinder + - bugfix: Manually constructed windoors have correct unrestricted accesses applied + to them + - bugfix: Windoors created via RCD now actually have electronics inside them + - bugfix: Airlocks constructed via RCD have the shell component correctly installed + inside them and have no other missing variables + Thebleh: + - bugfix: Bluespace RPEDs can now be rigged again + Vincent983: + - bugfix: made the radiation protection crate's contents match it's description + ZephyrTFA: + - rscadd: NanoTrasen improved the quality of the local durathread strain; resulting + in it now being twice as filling! + jlsnow301: + - bugfix: Fixed a resource dupe in the ORM. + mc-oofert: + - refactor: heretic sacrifice room is now lazyloaded + - rscadd: added the inspectors hat to the detectives cabinet, a special hat that + allows the wearer to say a phrase to dispense a stored item + necromanceranne: + - code_imp: Cleans up some unnecessary code left over from caseless ammo. +2023-09-19: + Ben10Omintrix: + - bugfix: basic mobs retaliate targetting now selects targets they can attack + Ghommie (Thanks Sealed101): + - refactor: Reworked the fishing minigame into a game screen object from a TGUI + interface + Hypernoblium: + - bugfix: Fixes a selection window in the game rock-paper-scissors with death. + Jacquerel: + - rscadd: Many kinds of mobs can now be brought back to life through revival surgery. + - rscadd: Dogs can wear eyepatches. + - balance: Player-controlled basic mobs attack as fast as those mobs can when controlled + by the AI + - balance: Player-controlled Faithless can paralyse people they attack, like the + AI does + - balance: Player-controlled Star Gazers (if an admin felt like making one) apply + the star mark on attack and deal damage to everything around them, like the + AI does + Momo8289: + - bugfix: The Nightmare's Light Eater can no longer suck the light out of space + tiles. + Moose1002: + - bugfix: Nanotrasen has finally recalled their faulty multitools and replaced them + with working ones! The multitool's buffer now properly clears itself. + - qol: Moved multitool link messages to balloon alerts + RikuTheKiller: + - bugfix: Makes ethanol and sugar pure by default. + Shadow-Quill: + - qol: Surgery trays can now be crafted via the crafting menu (two rods, one silver), + and deconstructed via secondary click with a screwdriver! + Time-Green: + - balance: Only traitor, changeling, heretic, blood brother, headrev, wizard, obsessed, + magic/gun survivalists and greentext book holders can now double their hardcore + random score + - qol: Redtexting as antag with hardcore random score will pay you default points, + instead of none (normal survival rules) + - bugfix: End report screen will properly report hardcore random survival in case + of station destruction + Vincent983: + - rscadd: mass drivers are now buildable, you activate them by attaching a signaler + to their launch wire, and can increase their power by pulsing the safeties wire, + and reset it back to normal by cutting the safeties wire. + - bugfix: normal ethereal blood now works for electrolysis, the hydrogen and oxygen + output of the electrolysis recipe has been increased. + YehnBeep: + - server: Default-configuration MINUTE_TOPIC_LIMIT has been increased + carlarctg: + - balance: Unholy and Eldritch water are self-consuming like holy water! They don't + need a liver to be processed. + distributivgesetz: + - bugfix: Fix a runtime when trying to cycle move intents with a hotkey as a dead + mob. + - rscdel: Removes the computer vendor. + - bugfix: Fixes a misplaced status display in Meta's medical storage. + mc-oofert: + - bugfix: pancake stack layering + - bugfix: pizzabox stack layering + - bugfix: pizzabox bombs that spawn unarmed now label their pizza correctly and + cannot spawn a spriteless pizza + - bugfix: added some missing firealarms on icebox in the hall towards departures + and the upper section of chapel + necromanceranne: + - bugfix: Makes sure pump-up properly grants the baton resistance trait. + nikothedude: + - code_imp: Scars now stack trace if they fail to get a valid description + timothymtorres: + - bugfix: Fix wooden barricade description "This looks like it can be barricaded + with planks of wood" being spammed on objects. +2023-09-20: + LT3: + - rscadd: 'New random event: Supermatter Surge' + - code_imp: Individual supermatter crystals can have custom gas properties + RikuTheKiller: + - spellcheck: Unreverted and improved resonance cascade message. + - balance: Supermatter now takes 15 seconds to delaminate normally and 5 if a sliver + has been taken from it. Gives a little more time to escape in the case of the + sliver and also evens out the times to please perfectionists. + - bugfix: Supermatter now accurately reports it's detonation time. + - spellcheck: Supermatter mood descriptions have been reverted back to their old, + more flavorful selves. + Thunder12345: + - balance: Improvised shotgun shells now deal half as much damage to humans and + cause less wounds, but do 50% more damage to structures and machines. They also + require a glass shard for crafting. + ZephyrTFA: + - bugfix: Lava can no longer occasionally generate inside of previously loaded templates + and breach and/or destroy shit + antropod: + - bugfix: Fixed Mafia achievements + carlarctg: + - qol: Crafting R&D guns from gun kits no longer requires tools or cable coil. The + decloner and energy crossbow still need reagents. + - qol: Halved R&D gun crafting time. 20->10 seconds. + intercepti0n: + - image: resprites t-ray scanner, gas analyzer, geiger counter and hand drill. + jlsnow301: + - refactor: Refactors the camera console UI. + mc-oofert: + - rscadd: heretic knock path and its respective items and award + - qol: mice and rats now are visually spaced out from eachother for visual clarity + nikothedude: + - balance: 'EMP damage on augs: 2/1.5 from 3/2' + - balance: Augs now only get paralyzed by EMP for 3/6 seconds if they are damaged + below 70% HP, + - balance: Aug EMP knockdown reduced to 3 seconds + - balance: Synthetic ears now take far less EMP damage + vinylspiders: + - bugfix: fixes inedible grown items (such as tower caps) becoming unclickable when + harvested, fixes their seeds disappearing when inserted into the seed machine +2023-09-21: + Coconutwarrior97: + - bugfix: Fixes a bug allowing holopara injectors to be refundable when used. + Exester509: + - rscadd: Splashing antihol on a patient before surgery will make it to go slower. + GPeckman: + - bugfix: The caller in a holopad call should now be able to hear people on the + other end. + Rhials: + - qol: Restores holiday hats for drones. + - qol: Extends holiday hat behavior to assistants. Get festive! + Shadow-Quill: + - bugfix: RCD Construction effects will no longer fall into chasms. + SyncIt21: + - bugfix: wall mounted objects air alarms, fire alarms etc now actually falls off/gets + destroyed when their attached wall is deconstructed + - bugfix: wall mounts crafted in game also properly falls off/gets destroyed when + their attached wall is deconstructed + blueDev2: + - bugfix: Recipe that converts Vegetable Oil into Olive Oil works properly + nikothedude: + - bugfix: Projectiles no longer cause a blood graphic or blood splatters if they + hit a limb that cant bleed + - rscadd: Prosthetics/Augments now spark when shot + - bugfix: Gauze no longer falls off if a wound is demoted or promoted + vinylspiders: + - bugfix: rescue hooks will once again drop the mob next to the fisherman instead + of just displaying a balloon alert and doing nothing +2023-09-22: + Jacquerel: + - admin: Admins can transform misbehaving players into arbitrary objects at will. + Sealed101: + - bugfix: fixed moonicorns making space/chasm/lava/water bridges with their fairy + grass + Toastgoats: + - balance: Peacekeeper cyborg's emagged hug is no longer a hardstun. + intercepti0n: + - image: resprites t-ray scanner. +2023-09-23: + ArcaneMusic: + - bugfix: Conveyor belts now properly show their new screentips on mouseover with + tools. + Ben10Omintrix: + - refactor: seedlings have been refactored into basic mobs please report any bugs + - rscadd: seedlings now can have different colored petals and can look after botanys + plants + - rscadd: seedlings are re-added to the game! they grow out of seedling seeds obtainable + from exotic seed crates or traitor uplink + GPeckman: + - admin: Boneless smite should work properly again. + LT3: + - rscadd: Poly now causes a power surge when dusted by the supermatter crystal + - bugfix: Ghosts and godmode mobs will no longer create resonance when touching + the supermatter crystal + Shadow-Quill: + - rscadd: The Message Monitor console's board can now be obtained via the telecoms + research node. + distributivgesetz, CoiledLamb: + - rscadd: 'Added two new awards specifically for engineering and medical: The "Emergency + Services Award" and the "Atmospheric Mastery Award". CEs get 3 Emergency Services + Awards and 1 Atmospheric Mastery Award and CMOs get 3 Emergency Services Awards.' + lizardqueenlexi: + - bugfix: Foods that have special conditions for liking/disliking them (such as + donuts for sec officers) have these conditions again. + - bugfix: Characters with ageusia properly ignore non-toxic food types that they + eat. + - bugfix: If you examine toxic food, it can no longer appear to you as edible. + mc-oofert: + - bugfix: clown bomb payload is no longer named badmin payload and no longer disperses + clowns in cardinal directions only +2023-09-24: + GPeckman: + - bugfix: Epinephrine will now update health properly. + Jacquerel: + - rscadd: Brimdemon corpses release an explosion shortly after death, just to keep + you on your toes. + - refactor: Brimdemons now use the basic mob framework which (should) improve their + pathfinding somewhat. Please bug report any unusual behaviour. + - admin: The brimdemon's beam ability can be given to any mob, for your Binding + of Isaac event + - admin: Admins can now reset or modify the chaplain's sect from a UI panel + LT3: + - bugfix: Fixed supermatter surges always being the lowest severity + Melbert: + - bugfix: Maybe fixes some weird occurrences where you lose the ability to pass + over tables when you shouldn't, and visa versa + jlsnow301: + - rscadd: Adds Bitrunning to supply department- a semi-offstation role that rewards + teamwork. + - rscadd: Adds new machines to complement the job- net pod, quantum server, quantum + consoles, and the nexacache vendor. + - rscadd: Adds several new maps which can be loaded and unloaded at will. + - rscadd: Some flair for the new bitrunning vendor. + - rscadd: Adds a new antagonist for the virtual domain only. Short lived ghost role + that fights bitrunners. + - rscdel: Removes the BEPIS machine, moves its tech into the Bitrunning vendor. + mc-oofert: + - refactor: clowns are basicmobs now +2023-09-25: + Ghommie: + - bugfix: Fixed beams rendering below mobs by default. + - bugfix: The fishing line beam is no longer emissive (it doesn't glow in the dark). + LemonInTheDark: + - admin: First time user connections are now logged + Melbert: + - rscadd: Changelings can now speak through their decoy brain if it is placed in + an MMI, to maintain the illusion they are actually dead and have been debrained. + Pickle-Coding: + - qol: NT CIMs shows how much power the supermatter is releasing. + - qol: NT CIMs internal energy will adjust its prefix. + - qol: Energy displays (such as multitooling grid) will use the full range of SI + prefixes available, up to the peta prefix if you somehow managed to reach that. + - rscdel: Removes the per cubic centimeter part of internal energy. + - bugfix: Fix unnecessary delta time scaling on inactive supermatters. + - bugfix: Fix high energy zaps not scaling with delta time. + - bugfix: Fixes grounding rods lying about potential power you can generate. + - code_imp: Convert supermatter_zap() and tesla_zap() zap_str argument unit to be + in joules, and scales everything that uses that argument. + Singul0: + - bugfix: Syndicate Modsuit AI's now downloads the current codespeak book upon being + downloaded. + Vekter: + - bugfix: Fixes Birdshot's recycler being turned the wrong direction. + Watermelon914: + - bugfix: Fixed the overflow role having less slots than it actually should. + - bugfix: Fixed players being able to roll antagonist without ever being eligible + to play any role. Players who have their preferences set up so that they're + likely to return to lobby when the round starts have a lowered chance of becoming + antagonist. + carlarctg: + - rscadd: Added the Hippocrates bust to medbay heirlooms. Paramedics don't get one. + - rscadd: You can now swear the Hippocratic oath with these busts! It'll give you + pacifism but nothing else. The process is reversible. + - rscadd: There's a very small chance that the Hippocrates bust was once wielded + by a certain German doctor. This chance is increased for coroner heirlooms. + distributivgesetz: + - bugfix: Clamping/closing a wound should now heal the bodypart that was damaged + instead of a random one. + nikothedude: + - code_imp: New flags/args to electrocute_act() + starrm4nn: + - balance: Makes it so Ephedrine spasms have a 10 * (1.5 - purity)% chance per second + to happen, Adding a downside to pure Ephedrine + timothymtorres: + - bugfix: Fix secret documents steal objective failing while inside folder. +2023-09-26: + Ben10Omintrix: + - rscadd: added ranged attack friendly fire checks for basic mobs. minebots and + hivebots will now try to avoid shooting their friends + GPeckman: + - bugfix: Stun immune people should no longer have issues with gripper gloves and + other tackle gloves. + - bugfix: Intellicards in computers are no longer deleted when the computer is destroyed. + - bugfix: Modular consoles can now be deconstructed by right clicking with a wrench. + Higgin: + - bugfix: cigarettes no longer smoke themselves from inside your pockets or on your + hands. + Jacquerel: + - bugfix: Selecting "Monkey" on a magic mirror will now once again turn you into + a Monkey rather than a disgusting freak of nature. + - bugfix: Tall Boys have once again been barred from joining the Wizard Federation. + LT3: + - admin: Successful restart votes will now restart on the current map + - code_imp: End round and persistence data will be saved before executing successful + restart vote + - spellcheck: Improved wording in greyscale JSON error message + Rhials: + - bugfix: '"Spooky" meteors will now properly spawn during halloween.' + Sealed101: + - bugfix: you can no longer push watchers (and any other lavaland basic mob) around + by running into them + Singul0: + - rscadd: Adds an advanced plastic surgery procedure, allowing you to imitate people + in pictures. Simply hold a picture in your offhand of the person you wish to + imitate as while conducting the surgery! Remember, it's not foolproof, it only + changes your name and voice! + - rscadd: You can obtain the disk containing the afromentioned surgery. as a role-restricted + item to doctors and roboticists for 1TC, as a rare maint loot and BEPIS technode + reward + Thunder12345: + - bugfix: Metalgen can no longer be used to transmute indestructible turfs. + Timberpoes: + - bugfix: Centcom now rejects contraband that somehow makes it way onto the cargo + shuttle mid-transit and returns it. + Vincent983: + - image: the security records suspected status is now teal instead of orange + carlarctg: + - refactor: Heavily refactored mirrors to be less ass cancer 1998 code. Player facing + changes are that mirrors now use a radial menu, women can get beards in magic + mirrors, made the magic mirror 'change sex' option Woke (it supports the 4 official + genders and physique as well) + - bugfix: Fixed Pride Mirror teleporting you into the space on the first use. Now + it waits until you officially cancel and say 'I am Done' so you can customize + yourself to your liking. + jlsnow301: + - rscadd: Netpods and quantum servers now have more examination info + - bugfix: You no longer lose antag status if you receive it in the vdom. + - bugfix: Beach bar shouldn't have visible atmos piping anymore. + - bugfix: Adds more lighting to the vaporwave vdom level. + - balance: Buffed vdom megafauna health to compensate for new ability disks. + mc-oofert: + - bugfix: posibrains can be inserted again + san7890: + - bugfix: The custom error message for when there is only one map to vote for should + pop up in all cases rather than just a select few. + tattle: + - qol: Basic animals now make sounds for audible emotes + - sound: Added new sound effects for chicks, chickens, crabs, and insects + xPokee: + - image: adds a frog holoform for pAIs +2023-09-27: + Helg2: + - bugfix: '[Tramstation] Mass Driver in chapel now has tiny fan so you don''t space + yourself.' + Jacquerel: + - bugfix: Blob spores will respond to rallies more reliably (it won't runtime every + time they try and pathfind). + - bugfix: Blobbernaut pain animation overlays should align with the direction the + mob is facing instead of always facing South + - refactor: Blob spores, zombies, and blobbernauts now all use the basic mob framework. + They should work the same, but please report any issues. + Sealed101: + - bugfix: fixed Strong Stone ruin generation + Vekter: + - rscadd: Added a holodeck to Birdshot Station. It can be reached via the Crew Facilities + hallway. + Watermelon914: + - bugfix: Fixed job configs not being loaded properly. + admeeer: + - rscadd: Added a candle box crate for all your candle needs! +2023-09-28: + CoiledLamb: + - rscdel: removes surgical duffelbags + - bugfix: the surgery supply order now comes with a surgery tray + GPeckman: + - bugfix: The flight potion wings will no longer fail to work on lavaland/icemoon + on rare occasions. + Iamgoofball: + - qol: Gas masks now muffle your voice with TTS. + - qol: Security Hailer masks now disguise your voice to protect your right to brutalize + greytiders. + - qol: Lizards, Ethereals, and Xenomorphs now have a vocal effect. + - qol: Security Records now show someone's voice name. + Jacquerel: + - bugfix: Throwing things at cyborgs will now slow them down, as intended + - balance: Adjusted the calculation of throwforce -> slowdown for cyborgs such that + it is simply a flat duration for anything above a certain damage threshold (the + value of throwing iron rods) + - refactor: Hivelords and Legions now use the basic mob framework. Please report + any unusual behaviour. + - rscadd: Hivelords shed more spawn when they are attacked. + - rscadd: Legions have learned how to fling their skulls across long distances. + - rscadd: Legions can heal other lavaland mobs with their skulls. + - rscadd: Legions are better at preserving corpses they consume, and sometimes make + use of their radios. + - rscadd: Legions may leave behind an unpleasant surprise after you are rescued + from them. + - balance: The crew monitoring console will now display you as dead if you are dead, + an critically injured if in crit, rather than setting those icons purely based + on your current health. + - qol: You won't continue burning to a husk if consumed by a snow legion after being + set on fire by an ice drake. + Melbert: + - rscadd: Doctors can now get head mirrors from their clothes vendor, to complete + the doctor outfit + - config: Adds a config option for player respawning that enables respawns, but + forces you pick a new character. + - config: '"NORESPAWN" has been replaced with "ALLOW_RESPAWN 0". Unlimited respawns + is "ALLOW_RESPAWN 1" and character limited respawns is "ALLOW_RESPAWN 2".' + MidoriWroth: + - bugfix: Added complexity factors to foods that were missing them. + Profakos: + - rscadd: Added the BEPIS' minor rewards as purchasable products to the bitrunning + order console. + - rscdel: Removed the base BEPIS disk from the bitrunner console + Sealed101: + - qol: you can undeploy fulton beacons by clicking them with an empty hand + - qol: you can rename fulton beacons with a pen + - bugfix: fixed geysers spawning on turfs with plants + Tattle: + - qol: drones now have individual names, instead of just "drone" + Toastgoats: + - balance: Gave the bluespace geode pirates 4 more teleporter bolt turrets. + - bugfix: The bluespace geode pirates no longer have a bluespace portal to the bottomless + pit dimension. + - rscadd: Station-safe dirt tiles for all your mapping needs, but surely no station + maps use the chasm baseturf ones, right? Right? + Watermelon914: + - spellcheck: Tweaks the message that players get when not being able to qualify + for roundstart antag to be more accurate as to what's happening. + Xander3359: + - rscadd: Contractor baton in traitor uplink for 12 TC + - balance: Ebow no longer has a reputation requirement. + carlarctg: + - bugfix: Fixed zombies being able to infect headless corpses (Including former + zombies) + - bugfix: 'Fixed bio armor being totally useless against zombies. Now it checks + how hurt your limb is: If it''s more than the bio armor value, you get infected. + THICKMATERIAL clothing guarantees at least 25 damage required to infect you, + non-thick clothing reduces effective defence by 25. In practice this means people + with MODsuits, biosuits will resist infection unless they''re pummeled into + crit, and wearing a firesuit will save you from the first few slashes.' + - bugfix: Fixed the bomb hood armor not having the same bio armor value as bomb + armor. + - qol: Added a message to the zed when they succesfully infect someone. + - code_imp: Turned some proc names into snake_case rather than, uh, nospacecase. + - bugfix: Fixes full advanced surgery trays spawning with 'nothing' + - refactor: Turned slapcrafting into a component! You can examine compatible items + to see what recipes they can be used in, and what the ingredients for them are. + For example, spears and the head-on-spear crafting recipe. + - bugfix: Valentines and ERTs will no longer get mood boosts from traitor moodener + items + lizardqueenlexi: + - bugfix: Left-clicking an empty surgery tray will now tell you exactly why it does + nothing. + mc-oofert: + - bugfix: you can now deconstruct exodrone scanner arrays + - bugfix: the tree in space exodrone adventure no longer softlocks you + - qol: the exodrone launchers now tell you on examine how to remove their fuel canister + if you somehow needed to do that + - balance: exodrone wide scans are now capped at 10 minutes + - balance: exodrone travel times are 18% faster + - balance: you can now upgrade scanner arrays for faster wide scan + - balance: exodrone point scan and deep scan are faster + - spellcheck: fixes several typos related to exodrones and gives scanner control + console a description + nikothedude: + - bugfix: You can no longer break the game by AI rolling in a card or APC + - qol: AI Roll now doesnt require you to click the exact turf to move you + - qol: AI roll cooldown and roll time is now a variable, making it possible for + AIs to become terrifying catamari damacy balls + timothymtorres: + - bugfix: Fix altars not allowing items to be sacrificed + vinylspiders: + - bugfix: Seeds will no longer be removed from existence after receiving the "You + can't seem to add [seed type] to the seed extractor" message + - bugfix: Some seeds that were previously not able to be added to the seed extractor + may now be added (starthistle for example) + - bugfix: fixes replica pod seeds spawning humans in nullspace +2023-09-29: + A.C.M.O.: + - bugfix: Fixes the death sandwich, making it safe to examine. + BurgerBB: + - bugfix: Scrubbers and Vents will no longer reset their settings on map load. + GPeckman: + - admin: There is now a tool to apply a DNA Infuser entry to any human. + Ghilker: + - code_imp: adds a gas connector component that allows connection to the atmos piping + system without the need of repathing + - refactor: changes the cryo machine to use this new system + Ghommie: + - bugfix: Fixed crabs not correctly (kinda) walking sideway. + Higgin: + - balance: Diabetics rejoice! Nerfed sugar OD/hyperglycaemic shock to be an immediate + KO followed by drowsiness afterwards until the OD is gone. + Jacquerel: + - bugfix: The Nuke Op MODsuit AI downloader only works once per purchase, as intended. + - bugfix: Blob Zombies and Blobbernauts have had their attack speed restored to + its original value + JohnFulpWillard: + - code_imp: Your bodytype now decides what gendered sounds you make. + - balance: You can now remove and replace power cells from PDAs (with screwdriver). + - balance: PDAs now drain their power cells harder, and also take into account active + programs & their flashlight being on. + - balance: PDAs running out of charge now turn their flashlights off. + Melbert: + - qol: Examine blocked out roundstart / latejoin job information. + - qol: Captain gets a little bit more information about how their radio works roundstart. + - bugfix: Fixed roundstart players not getting radio information. + - balance: Transformation sting now lasts 8 minutes, down from permanent. However, + the effect is paused for dead and stasis mobs, making it permanent SO LONG AS + they stay dead or in stasis. The effect is also permanent if used on a monkey. + - balance: Transformation sting now costs 33 chemicals, down from 50. + - balance: Transformation sting now costs 2 dna points, down from 3. + - bugfix: Transformation sting works on monkeys again. + - refactor: Refactored a bit of human randomization. + Rhials: + - bugfix: The Polymorph Belt should now update its sprite when active. + - qol: The freedom implant has received minor feedback and other minor usage improvements. + Sealed101: + - bugfix: fixed lobstrosities becoming unmovable when killed during their charge + windup + SyncIt21: + - bugfix: removes incorrect stack traces when using some admin secrets + Vekter: + - bugfix: Fixes the missing grinder in Birdshot's Virology department + Vincent983: + - bugfix: the parole status and discharged status are now green and blue respectively + in the security record interface + Watermelon914: + - balance: Head revolutionaries and heads of staff are no longer immediately considered + disqualified when going AFK or disconnecting and are given a 2 minute grace + period. + - admin: Admins now get a log when a head revolutionary or head of staff disconnects + or goes AFK during a revolution. They also get the same log 1 minute after to + give them a chance to act on the information. + necromanceranne: + - bugfix: Splattercasting resets your blood to normal values when you transsform + into a vampire. + - bugfix: Gaining a new species will set your blood volume down to the normal volume + levels if higher than normal. + san7890: + - code_imp: Robot Customers have recently been touched codewise, please report any + bugs or unexpected behavior as there really should not be any. + - refactor: Snakes have been refactored into basic mobs. This means that they are + a bit more intelligent than previous snakes, making them more docile and averse + to harming people (unless otherwise provoked). They do chomp all sorts of mice + though. You can feed them a dead mouse to make them your friend if you'd want + that. + - sound: If you listen closely to snakes, you might be able to hear a small hissing + sound... + timothymtorres: + - bugfix: Fix water puddle runtime when washing items + - rscadd: Add drinking water causes drunk mobs to become sober + - rscadd: Add candle design to biogenerator + yorii: + - bugfix: dead bodies now cool down to room temperature over time + - qol: allowed names to start with a number if AI/Borg +2023-09-30: + DrDiasyl aka DrTuxedo: + - balance: Holsters can now be clipped to any suit, and house Captain antique gun + and HoS gun. You now can buy holsters from the SecTech premium section. + Helg2: + - rscadd: SM crystal can now dust someone or something if it falls on it. + Jacquerel: + - bugfix: If two cosmic heretics ascend in the same round, their star gazer survival + will be linked to each individual heretic and not shared by just one of them. + - bugfix: You can't click the Knock heretic portal to join as a mob while already + signed up to become a mob. + - balance: Cosmic heretics can't order the Star Gazer around while jaunting. + - balance: The Knock Heretic portal cannot summon Flesh Worms, but can summon Fire + Sharks. + - balance: The Knock Heretic portal will disperse if its creator is killed. + - admin: Mob abilities can be granted to arbitrary mobs via the VV menu in a similar + way to spells. + - bugfix: Lavaland syndicate operatives can no longer trivially use the jetpack + on their modsuit to fly over the lava. + JohnFulpWillard: + - bugfix: PDA flashlights wont cause the cell to constantly drain faster and faster. + Singul0: + - bugfix: Fixes missing baseturfs and clowns in mining planet VDOM.. + SyncIt21: + - code_imp: removed some redundant code for airlocks + Timberpoes: + - balance: There are now 3 roundstart cyborg job slots open by default. + admeeer: + - bugfix: You can now spray paint the SM without getting dusted + jlsnow301: + - rscadd: Quantum servers now talk over supply channel when they're done cooling + off. Go outside! + - bugfix: You can no longer use dragon swoop to bypass cordons. + - bugfix: Netpod brain damage is now properly reduced upon server upgrades. + - bugfix: Fixed an bug where swapping bodies in vdom prevented you from disconnecting. + - bugfix: Fixed a bug where a quantum server could get locked out of loading new + domains. + - bugfix: Changed quantum console UI to display "no bandwidth" rather than "none" + lizardqueenlexi: + - bugfix: The reverse revolver now looks like a normal Syndicate revolver on inspection. + nikothedude: + - code_imp: Gauze removal is now handled by the gauze's destroy instead of seep_gauze + xPokee: + - bugfix: fixed the stamp in the metastation CMO office always spawning on the floor diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml new file mode 100644 index 0000000000000..0c96584a27876 --- /dev/null +++ b/html/changelogs/archive/2023-10.yml @@ -0,0 +1,231 @@ +2023-10-01: + ArcaneMusic: + - rscadd: A new export has arrived in the imports section, the Galactic Materials + Market! You can use this to buy and sell minerals for profit or cost, as well + as stock your station when you don't have any miners. + - rscadd: Insert sheets of minerals into the Galactic Materials Market to convert + them into a stock block, allowing you to lock in your price for 5 minutes. Wait + too long and it'll be subject to market value again! + - rscadd: Minerals can be bought on the market either using the station's cargo + budget by cargo crew, or privately by everyone else. + - rscdel: Any material stacks that can be bought and sold on the market before have + been removed from the cargo catalog. + GPeckman: + - bugfix: Security officers can now download the crew manifest PDA app that they + start with. + Ghommie: + - bugfix: Actually fixed the hooked item exploit. + Higgin: + - bugfix: Added warden to list of default required enemies for rulesets. + NPC1314: + - image: new chaplain outfit + SyncIt21: + - bugfix: Aloe and other baked foods that don't have reagents can be baked again + without turning to ash + carlarctg: + - rscadd: Heretic Rebalance + - balance: Researching the Main Knowledge paths that unlock Side Paths will grant + one Side Point that can be used only on those side paths. You can still spend + normal knowledge points on them if you wish. + - balance: Rune drawing time has been reduced from 30->20 seconds. Codex drawing + time has been reduced from 15->8. + - balance: 'Codex Cicatrix is now a roundstart knowledge, works as an amber focus + when held in-hand and opened, and has had its recipe changed to: 1 of any non-standard + pen (literally anything that isn''t the base pen), any book, and either animal + hide OR a corpse, any kind.' + - code_imp: Added support for using a list inside ritual requirements and a special + 'snowflake check' rituals can utilize. + - balance: The first non-path knowledge, the Mansus Hand Mark, has had its cost + reduced from 2->1 points. + distributivgesetz: + - qol: Font settings in the chat panel applies to all text now. + nikothedude: + - balance: Sci now has access to the materials & canisters section in their departmental + order console + ninjanomnom: + - rscdel: An easter egg plushie that was spawning where it shouldn't has been brought + back home. + - rscadd: The secure closet can now spawn live gibtonite, enjoy your free bomb. + san7890: + - refactor: Supermatter Spiders have been refactored into basic mobs, on the extremely + off chance you spot one and also notice any weird bugs regarding it, please + report it. +2023-10-02: + Ghommie: + - rscadd: Expanded the fishing portal generator. It now comes with several portal + options that can be unlocked by performing fish scanning experiments, which + also award a modest amount of techweb points. + - balance: The fishing portal generator is now buildable and no longer orderable. + The board can be printed from cargo, service and science lathes. + - balance: Advanced fishing tech is no longer a BEPIS design. It now requires the + base fish scanning experiment and 2000 points to be unlocked. + - rscadd: The advanced fishing rod now comes with an incorporated experiscanner + specific for fish scanning. + - rscadd: Added a new skillchip that may change the icon of the "fish" shown in + the minigame UI to less generic ones. Reaching master level in fishing also + does that. + - qol: The experiment handler UI no longer shows unselectable experiments. + Jacquerel: + - rscadd: Wizards who complete the grand ritual can now gift everyone with eternal + life + distributivgesetz: + - bugfix: Font scaling in TGUI chat has been reverted to its original implementation. +2023-10-03: + ArcaneMusic: + - image: Railings have had a visual update. + CoiledLamb: + - rscadd: adds boxes of bandages, a quick healing item + Fazzie: + - rscadd: Added a budget solar crate to the derelict teleporter room + - rscadd: Added a solar panel control to the north derelict solar + - qol: The derelict's AI coridoor is now shorter and prettier + Ical92: + - bugfix: fixed misplaced door on syndicate listening post + Jacquerel: + - bugfix: Spiders, Morphs, Fire Sharks, and Regal Rats no longer have a reduced + click speed. + - balance: Kudzu will now be destroyed by adverse weather. + - balance: Kudzu will no longer spread over holes. + timothymtorres: + - bugfix: Fix organs having no DNA and become bloody when violently removed. +2023-10-04: + Coded by Jacquerel, Sprited by Dalmationer: + - rscadd: Added tongs to the kitchen, which you can use to manipulate food from + further away + Cruix: + - bugfix: Some icons for selecting character preferences are no longer scaled incorrectly. + FIoppie: + - sound: '*flap now makes a fluttering noise for moth wings' + - sound: Moths now have a death sound + - qol: '*tremble emote now is just "trembles!" instead of "trembles in fear!"' + Fazzie: + - rscadd: A lot of new content has been added to the beach away mission + - qol: It also looks substantially better, too! + Jacquerel: + - refactor: Raw Prophets now use the basic mob framework. Please report any unusual + behaviour. + - admin: Admins can turn off dynamic rulesets (or force them on despite not meeting + the qualification criteria) on a per-round basis. + Melbert: + - qol: Moved a lot of maintenance spawnpoints out of non-maintenance rooms. Some + antags (paradox clone, fugitives, nightmares, spiders) are now less likely to + spawn in obvious places like the morgue, tech storage, or dorms rooms. + TheBoondock: + - rscadd: Added blackout, happens when you drink...ALOT + Wallem: + - rscadd: Adds The Hand of Midas, an ancient Egyptian matchlock pistol. + ZephyrTFA: + - bugfix: The Syndicate have fired their previous construction company after poor + results in recent outposts. + lizardqueenlexi: + - bugfix: Your heart will no longer be deleted if an admin heals you while you have + corazargh in your system. + - refactor: The cursed heart has been streamlined a bit, and now gives you a visual + cooldown for when you can beat your heart again. + - bugfix: Cutting open a hand-pressed paper bundle no longer deletes all of the + paper. + nikothedude: + - qol: Departmental order consoles now alert their department via radio when their + cooldown expires + ninjanomnom: + - admin: Appearance vars in VV now display instead of being left blank + timothymtorres: + - bugfix: Fix butchered monkeys to transfer reagents and diseases to meat + unit0016: + - rscadd: The funds the syndicate have been saving by restricting galley access + has been suddenly funneled into a singular mosaic pattern in the experiments + wing. + vinylspiders: + - refactor: fixed many instances of updatehealth() either being called needlessly + or not at all within on_mob_life() and in various other parts of the code + - refactor: damage procs now return useful information--the actual net change in + damage on the mob. added a unit test for this +2023-10-05: + lizardqueenlexi: + - bugfix: The Galactic Materials Market now offers things for sale as it should. + mc-oofert: + - code_imp: exploration drone adventures are now file-based and not database-based + timothymtorres: + - balance: CQC legsweeps now cause knockdown instead of paralysis. + - balance: CQC kicks now knockout a target on the floor for ten seconds if they + reach stam crit. Helmet protection shortens the knockout length. +2023-10-06: + EricZilla: + - image: We have received a new shipment of IDs, as the old ones were found out + to be haunted. + - image: Laser tag red team ID has received a massive nerf + - image: Station budget cards have gotten a facelift + - image: Emags and Doorjacks + - bugfix: Numbered prisoner IDs will now be legible + SyncIt21: + - bugfix: plumbing reaction chamber now balances the ph of it's solution correctly + to the best of it's ability so no guarantees + - code_imp: converted plumbing reaction chamber & mixing chamber UI files to Typescript + - refactor: plumbing mixing chamber now also accepts an TGUI input list to input + it's chemicals + Wallem: + - rscadd: Buffs the Active Sonar module with a radial scan, and makes the power + costs more in-line with other modules. + mc-oofert: + - bugfix: you are now made a ghost faster if you get gibbed + neocloudy: + - bugfix: MetaStation disposal pipes from Cargo to Disposals/the rest of the station + are working again. +2023-10-07: + CoiledLamb: + - qol: allows janitor keys to be stored in janitor wintercoats and janibets + - qol: gives empty fireaxe and mech removal crowbars cabinets directional helpers + GPeckman: + - bugfix: Borgs will no longer become permanently upside-down if tipped over by + multiple people at the same time. + - bugfix: Adminheal will now properly clear negative mutations as intended. + - bugfix: The AI can no longer turn you off if you shapeshift into a robot. + - rscadd: The laser carbine, a weak but fully automatic sidegrade to the normal + laser gun, can now be ordered from cargo. + - bugfix: Engineering borgs can no longer grab and drop their own iron/glass sheet + module. + - bugfix: Ice whelps can now use spells given to them by admins, and people who + have polymorphed into ice whelps can now polymorph back to normal. + Ghommie: + - bugfix: Fixed silent catwalks. + - rscadd: Fish analyzers can now be used to perform fish scanning experiments. + - balance: They can now be singularly bought as a goodie pack for 125 cr each, instead + of a crate of three for 500 cr. + Isratosh: + - spellcheck: '"offical" has been officially corrected to "official" in several + official locations.' + Jacquerel: + - refactor: Rust Walkers, Ash Spirits, Flesh Stalkers, and The Maid in the Mirror + now use the basic mob framework. Please report any unusual behaviour. + Kapu1178: + - bugfix: Blood once again appears as small drops instead of splatters during minor + bleeding. + Likteer: + - rscadd: Fake moustaches are now poorly slapped on top of what you're wearing + Melbert: + - refactor: Refactors how ethereals update their color when damaged. + - qol: AI, cyborg, and PAI camera (photo taking) behavior now uses balloon alerts + and has sound effects associated + - refactor: Refactored AI, cyborg, and PAI camera (photo taking) code + - bugfix: fixed being unable to print photos as a cyborg when below 50% toner, even + though photos only take 5% + ReezeBL: + - bugfix: fixed a PDA's messenger TGUI issue with handling of destroyed recipients. + Sealed101: + - bugfix: fixed bad food not having bad food reagents + necromanceranne: + - balance: Despite earlier reports suggesting that the famous lethality of the Regal + Condor was largely a myth, there has been rumors that the gun has once again + started to display its true killing potential on any station that it 'manifests'. + oranges: + - rscadd: Dogs now react to centrist grillers more realistically + san7890: + - refactor: Refactored goats into basic mobs! Not much should have changed beyond + their endless desire to retaliate should you attack them, they're still just + as good as chomping away plant life as ever. + timothymtorres: + - refactor: Refactor gib code to be more robust. + - qol: Gibbing a mob will result in all items being dropped instead of getting deleted. + There are a few exceptions (like admin gib self) where this will not take place. + unit0016: + - bugfix: It is no longer possible to chasm yourself on the geode. Again. diff --git a/icons/area/areas_station.dmi b/icons/area/areas_station.dmi index 3852363cd505b..cbfe463efa516 100644 Binary files a/icons/area/areas_station.dmi and b/icons/area/areas_station.dmi differ diff --git a/icons/effects/96x96.dmi b/icons/effects/96x96.dmi index 50b05b27a6de2..31f26c3e6e11e 100644 Binary files a/icons/effects/96x96.dmi and b/icons/effects/96x96.dmi differ diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi index c7d3d8951e2ef..12e3ce9f7d594 100644 Binary files a/icons/effects/beam.dmi and b/icons/effects/beam.dmi differ diff --git a/icons/effects/bitrunning.dmi b/icons/effects/bitrunning.dmi new file mode 100644 index 0000000000000..bfdc7c63436c2 Binary files /dev/null and b/icons/effects/bitrunning.dmi differ diff --git a/icons/effects/blood.dmi b/icons/effects/blood.dmi index 36f30f74f1ffa..93f836f4c84bd 100644 Binary files a/icons/effects/blood.dmi and b/icons/effects/blood.dmi differ diff --git a/icons/effects/bubblegum.dmi b/icons/effects/bubblegum.dmi index acf8a3380cb6f..9760390744f8f 100644 Binary files a/icons/effects/bubblegum.dmi and b/icons/effects/bubblegum.dmi differ diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 365d7576b6ef0..b01986a9522d0 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/effects/eldritch.dmi b/icons/effects/eldritch.dmi index ebcbb397af08a..8b7738f3b46a0 100644 Binary files a/icons/effects/eldritch.dmi and b/icons/effects/eldritch.dmi differ diff --git a/icons/obj/fulton_balloon.dmi b/icons/effects/fulton_balloon.dmi similarity index 100% rename from icons/obj/fulton_balloon.dmi rename to icons/effects/fulton_balloon.dmi diff --git a/icons/effects/magic.dmi b/icons/effects/magic.dmi index 480332df1349c..9bcb886d8535e 100644 Binary files a/icons/effects/magic.dmi and b/icons/effects/magic.dmi differ diff --git a/icons/effects/mapping_helpers.dmi b/icons/effects/mapping_helpers.dmi index 24cbe62e3bb50..d28d2770ec4fb 100644 Binary files a/icons/effects/mapping_helpers.dmi and b/icons/effects/mapping_helpers.dmi differ diff --git a/icons/effects/mouse_pointers/light_drag.dmi b/icons/effects/mouse_pointers/light_drag.dmi new file mode 100644 index 0000000000000..a66d55b662b23 Binary files /dev/null and b/icons/effects/mouse_pointers/light_drag.dmi differ diff --git a/icons/effects/particles/echo.dmi b/icons/effects/particles/echo.dmi index a7a47e340d181..60a243a8a7bed 100644 Binary files a/icons/effects/particles/echo.dmi and b/icons/effects/particles/echo.dmi differ diff --git a/icons/effects/particles/generic.dmi b/icons/effects/particles/generic.dmi index 0e6a84a34b323..41776efdbfd5d 100644 Binary files a/icons/effects/particles/generic.dmi and b/icons/effects/particles/generic.dmi differ diff --git a/icons/effects/particles/goop.dmi b/icons/effects/particles/goop.dmi new file mode 100644 index 0000000000000..673c1a7ad5b6a Binary files /dev/null and b/icons/effects/particles/goop.dmi differ diff --git a/icons/effects/particles/stink.dmi b/icons/effects/particles/stink.dmi new file mode 100644 index 0000000000000..29b92acbe67c6 Binary files /dev/null and b/icons/effects/particles/stink.dmi differ diff --git a/icons/effects/progessbar.dmi b/icons/effects/progressbar.dmi similarity index 100% rename from icons/effects/progessbar.dmi rename to icons/effects/progressbar.dmi diff --git a/icons/effects/random_spawners.dmi b/icons/effects/random_spawners.dmi index 0e2dad78d7445..c03b196a13798 100644 Binary files a/icons/effects/random_spawners.dmi and b/icons/effects/random_spawners.dmi differ diff --git a/icons/effects/weather_effects.dmi b/icons/effects/weather_effects.dmi index 00083c464a24f..fa21b2d12eb63 100644 Binary files a/icons/effects/weather_effects.dmi and b/icons/effects/weather_effects.dmi differ diff --git a/icons/hud/fishing_hud.dmi b/icons/hud/fishing_hud.dmi new file mode 100644 index 0000000000000..58c478d071064 Binary files /dev/null and b/icons/hud/fishing_hud.dmi differ diff --git a/icons/obj/implants.dmi b/icons/hud/implants.dmi similarity index 100% rename from icons/obj/implants.dmi rename to icons/hud/implants.dmi diff --git a/icons/hud/lobby/background.dmi b/icons/hud/lobby/background.dmi index baae06fc1bd10..554543ecf3f72 100644 Binary files a/icons/hud/lobby/background.dmi and b/icons/hud/lobby/background.dmi differ diff --git a/icons/hud/lobby/bottom_buttons.dmi b/icons/hud/lobby/bottom_buttons.dmi index d0aa1228c7db3..6cbebb6e68ccb 100644 Binary files a/icons/hud/lobby/bottom_buttons.dmi and b/icons/hud/lobby/bottom_buttons.dmi differ diff --git a/icons/hud/lobby/collapse_expand.dmi b/icons/hud/lobby/collapse_expand.dmi new file mode 100644 index 0000000000000..133a096f94950 Binary files /dev/null and b/icons/hud/lobby/collapse_expand.dmi differ diff --git a/icons/hud/lobby/shutter.dmi b/icons/hud/lobby/shutter.dmi new file mode 100644 index 0000000000000..baecaca4217b4 Binary files /dev/null and b/icons/hud/lobby/shutter.dmi differ diff --git a/icons/hud/radial.dmi b/icons/hud/radial.dmi index 897cb3a872e29..f4c4ab7693e98 100644 Binary files a/icons/hud/radial.dmi and b/icons/hud/radial.dmi differ diff --git a/icons/hud/radial_fishing.dmi b/icons/hud/radial_fishing.dmi new file mode 100644 index 0000000000000..65fd55176b7c8 Binary files /dev/null and b/icons/hud/radial_fishing.dmi differ diff --git a/icons/hud/screen_alert.dmi b/icons/hud/screen_alert.dmi index 78421d72472f8..0fa8ec218500e 100644 Binary files a/icons/hud/screen_alert.dmi and b/icons/hud/screen_alert.dmi differ diff --git a/icons/hud/screen_alien.dmi b/icons/hud/screen_alien.dmi index 82d0ed2f9f9ee..21d7cde0b0383 100644 Binary files a/icons/hud/screen_alien.dmi and b/icons/hud/screen_alien.dmi differ diff --git a/icons/hud/screen_gen.dmi b/icons/hud/screen_gen.dmi index d80a2dbe762a9..1484e3f4042a9 100644 Binary files a/icons/hud/screen_gen.dmi and b/icons/hud/screen_gen.dmi differ diff --git a/icons/mecha/mech_construction.dmi b/icons/mecha/mech_construction.dmi deleted file mode 100644 index c0f5941233512..0000000000000 Binary files a/icons/mecha/mech_construction.dmi and /dev/null differ diff --git a/icons/mecha/mecha_equipment.dmi b/icons/mecha/mecha_equipment.dmi deleted file mode 100644 index 18d884df2ac21..0000000000000 Binary files a/icons/mecha/mecha_equipment.dmi and /dev/null differ diff --git a/icons/mob/actions/actions_AI.dmi b/icons/mob/actions/actions_AI.dmi index 9f900bb9b4d98..048793c607838 100644 Binary files a/icons/mob/actions/actions_AI.dmi and b/icons/mob/actions/actions_AI.dmi differ diff --git a/icons/mob/actions/actions_animal.dmi b/icons/mob/actions/actions_animal.dmi index 1fcda97922cf9..f3f9a667f2204 100644 Binary files a/icons/mob/actions/actions_animal.dmi and b/icons/mob/actions/actions_animal.dmi differ diff --git a/icons/mob/actions/actions_construction.dmi b/icons/mob/actions/actions_construction.dmi index 2b77c739f6090..da9a29733c549 100644 Binary files a/icons/mob/actions/actions_construction.dmi and b/icons/mob/actions/actions_construction.dmi differ diff --git a/icons/mob/actions/actions_ecult.dmi b/icons/mob/actions/actions_ecult.dmi index a684dd1fbe627..747b57949be82 100644 Binary files a/icons/mob/actions/actions_ecult.dmi and b/icons/mob/actions/actions_ecult.dmi differ diff --git a/icons/mob/actions/actions_mecha.dmi b/icons/mob/actions/actions_mecha.dmi index c621b21775b34..5ae25522434ef 100644 Binary files a/icons/mob/actions/actions_mecha.dmi and b/icons/mob/actions/actions_mecha.dmi differ diff --git a/icons/mob/actions/actions_mod.dmi b/icons/mob/actions/actions_mod.dmi index 84fcbc00dbbc3..f788de20194bd 100644 Binary files a/icons/mob/actions/actions_mod.dmi and b/icons/mob/actions/actions_mod.dmi differ diff --git a/icons/mob/actions/actions_silicon.dmi b/icons/mob/actions/actions_silicon.dmi index 7be634e9f6ca3..9c4b7ec7fbe85 100644 Binary files a/icons/mob/actions/actions_silicon.dmi and b/icons/mob/actions/actions_silicon.dmi differ diff --git a/icons/mob/actions/actions_spells.dmi b/icons/mob/actions/actions_spells.dmi index 9d657c6b88cfb..39ea58104173c 100644 Binary files a/icons/mob/actions/actions_spells.dmi and b/icons/mob/actions/actions_spells.dmi differ diff --git a/icons/mob/clothing/accessories.dmi b/icons/mob/clothing/accessories.dmi index e8fa54bce1202..2c6bf51072438 100644 Binary files a/icons/mob/clothing/accessories.dmi and b/icons/mob/clothing/accessories.dmi differ diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi index e38c8ba662cbe..dc519380cfd7a 100644 Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ diff --git a/icons/mob/clothing/back/backpack.dmi b/icons/mob/clothing/back/backpack.dmi index b755a04c86ad9..bf5207d85c409 100644 Binary files a/icons/mob/clothing/back/backpack.dmi and b/icons/mob/clothing/back/backpack.dmi differ diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi index e19f6a8b2e41c..9ed1f1652359a 100644 Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ diff --git a/icons/mob/clothing/belt_mirror.dmi b/icons/mob/clothing/belt_mirror.dmi index 3ecbdf6518bca..0c1b8457be7c3 100644 Binary files a/icons/mob/clothing/belt_mirror.dmi and b/icons/mob/clothing/belt_mirror.dmi differ diff --git a/icons/mob/clothing/eyes.dmi b/icons/mob/clothing/eyes.dmi index a2e0127053cc5..20bf4d18381fd 100644 Binary files a/icons/mob/clothing/eyes.dmi and b/icons/mob/clothing/eyes.dmi differ diff --git a/icons/mob/clothing/feet.dmi b/icons/mob/clothing/feet.dmi index 4a716ec657108..3a6faaf1ef8e6 100644 Binary files a/icons/mob/clothing/feet.dmi and b/icons/mob/clothing/feet.dmi differ diff --git a/icons/mob/clothing/head/chaplain.dmi b/icons/mob/clothing/head/chaplain.dmi index efb6ec3c9e908..100b7ee922fb9 100644 Binary files a/icons/mob/clothing/head/chaplain.dmi and b/icons/mob/clothing/head/chaplain.dmi differ diff --git a/icons/mob/clothing/head/costume.dmi b/icons/mob/clothing/head/costume.dmi index b578f32d00783..3c5ea17b19d15 100644 Binary files a/icons/mob/clothing/head/costume.dmi and b/icons/mob/clothing/head/costume.dmi differ diff --git a/icons/mob/clothing/head/hats.dmi b/icons/mob/clothing/head/hats.dmi index aa7f9fe6c8e40..abf2f9f18bd40 100644 Binary files a/icons/mob/clothing/head/hats.dmi and b/icons/mob/clothing/head/hats.dmi differ diff --git a/icons/mob/clothing/head/helmet.dmi b/icons/mob/clothing/head/helmet.dmi index 6cd082395b5bb..5b30ae65b8f23 100644 Binary files a/icons/mob/clothing/head/helmet.dmi and b/icons/mob/clothing/head/helmet.dmi differ diff --git a/icons/mob/clothing/head/hydroponics.dmi b/icons/mob/clothing/head/hydroponics.dmi index e592ad444bea4..b710efc3d7d90 100644 Binary files a/icons/mob/clothing/head/hydroponics.dmi and b/icons/mob/clothing/head/hydroponics.dmi differ diff --git a/icons/mob/clothing/head/pai_head.dmi b/icons/mob/clothing/head/pai_head.dmi index 0a04e7e8ab29e..e5dd4965d8b8d 100644 Binary files a/icons/mob/clothing/head/pai_head.dmi and b/icons/mob/clothing/head/pai_head.dmi differ diff --git a/icons/mob/clothing/head/pets_head.dmi b/icons/mob/clothing/head/pets_head.dmi index 19ce9ec467517..0f1e089c164eb 100644 Binary files a/icons/mob/clothing/head/pets_head.dmi and b/icons/mob/clothing/head/pets_head.dmi differ diff --git a/icons/mob/clothing/head/plasmaman_head.dmi b/icons/mob/clothing/head/plasmaman_head.dmi index 00385b5dd8188..1917ae7bcf538 100644 Binary files a/icons/mob/clothing/head/plasmaman_head.dmi and b/icons/mob/clothing/head/plasmaman_head.dmi differ diff --git a/icons/mob/clothing/head/spacehelm.dmi b/icons/mob/clothing/head/spacehelm.dmi index 693c1b0147d55..181e5eb2e6865 100644 Binary files a/icons/mob/clothing/head/spacehelm.dmi and b/icons/mob/clothing/head/spacehelm.dmi differ diff --git a/icons/mob/clothing/head/utility.dmi b/icons/mob/clothing/head/utility.dmi index 85b0b17b66b82..ada1b90c4b0be 100644 Binary files a/icons/mob/clothing/head/utility.dmi and b/icons/mob/clothing/head/utility.dmi differ diff --git a/icons/mob/clothing/head/winterhood.dmi b/icons/mob/clothing/head/winterhood.dmi index f85a687f30410..ba722a5a0f281 100644 Binary files a/icons/mob/clothing/head/winterhood.dmi and b/icons/mob/clothing/head/winterhood.dmi differ diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi index 1a1a1c78d59d8..cbe6bc751c180 100644 Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.dmi differ diff --git a/icons/mob/clothing/modsuit/mod_clothing.dmi b/icons/mob/clothing/modsuit/mod_clothing.dmi index 180a65f5cc939..537b1ffd3ebdd 100644 Binary files a/icons/mob/clothing/modsuit/mod_clothing.dmi and b/icons/mob/clothing/modsuit/mod_clothing.dmi differ diff --git a/icons/mob/clothing/modsuit/mod_modules.dmi b/icons/mob/clothing/modsuit/mod_modules.dmi index 1001ae77d2d65..3c41dac86b2d4 100644 Binary files a/icons/mob/clothing/modsuit/mod_modules.dmi and b/icons/mob/clothing/modsuit/mod_modules.dmi differ diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi index 9f88697bbc608..03cf6a861c140 100644 Binary files a/icons/mob/clothing/neck.dmi and b/icons/mob/clothing/neck.dmi differ diff --git a/icons/mob/clothing/suits/armor.dmi b/icons/mob/clothing/suits/armor.dmi index 4d16599cd3164..d10ca4add997b 100644 Binary files a/icons/mob/clothing/suits/armor.dmi and b/icons/mob/clothing/suits/armor.dmi differ diff --git a/icons/mob/clothing/suits/chaplain.dmi b/icons/mob/clothing/suits/chaplain.dmi index 4b6368fb291d0..8806bf5f679b4 100644 Binary files a/icons/mob/clothing/suits/chaplain.dmi and b/icons/mob/clothing/suits/chaplain.dmi differ diff --git a/icons/mob/clothing/suits/costume.dmi b/icons/mob/clothing/suits/costume.dmi index d681e492d9eaa..bf4bbe310d2d7 100644 Binary files a/icons/mob/clothing/suits/costume.dmi and b/icons/mob/clothing/suits/costume.dmi differ diff --git a/icons/mob/clothing/suits/jacket.dmi b/icons/mob/clothing/suits/jacket.dmi index f9b7b5d31a20e..a6f25d91c59bf 100644 Binary files a/icons/mob/clothing/suits/jacket.dmi and b/icons/mob/clothing/suits/jacket.dmi differ diff --git a/icons/mob/clothing/suits/moth.dmi b/icons/mob/clothing/suits/moth.dmi index c79c4a4fae3ad..80182e5c647cf 100644 Binary files a/icons/mob/clothing/suits/moth.dmi and b/icons/mob/clothing/suits/moth.dmi differ diff --git a/icons/mob/clothing/suits/spacesuit.dmi b/icons/mob/clothing/suits/spacesuit.dmi index cb45a26556a60..4bc2d8cd7f9e1 100644 Binary files a/icons/mob/clothing/suits/spacesuit.dmi and b/icons/mob/clothing/suits/spacesuit.dmi differ diff --git a/icons/mob/clothing/suits/utility.dmi b/icons/mob/clothing/suits/utility.dmi index 6300eb8e06719..40216806f4f9f 100644 Binary files a/icons/mob/clothing/suits/utility.dmi and b/icons/mob/clothing/suits/utility.dmi differ diff --git a/icons/mob/clothing/suits/wintercoat.dmi b/icons/mob/clothing/suits/wintercoat.dmi index b720b31f38e97..9bcfca4d6a3a1 100644 Binary files a/icons/mob/clothing/suits/wintercoat.dmi and b/icons/mob/clothing/suits/wintercoat.dmi differ diff --git a/icons/mob/clothing/under/cargo.dmi b/icons/mob/clothing/under/cargo.dmi index 01b5ad6c99d6b..180f0e4ec876f 100644 Binary files a/icons/mob/clothing/under/cargo.dmi and b/icons/mob/clothing/under/cargo.dmi differ diff --git a/icons/mob/clothing/under/civilian.dmi b/icons/mob/clothing/under/civilian.dmi index 667d98b53619a..7283996c3b136 100644 Binary files a/icons/mob/clothing/under/civilian.dmi and b/icons/mob/clothing/under/civilian.dmi differ diff --git a/icons/mob/clothing/under/costume.dmi b/icons/mob/clothing/under/costume.dmi index efb8241ffa736..c8fd87f52726d 100644 Binary files a/icons/mob/clothing/under/costume.dmi and b/icons/mob/clothing/under/costume.dmi differ diff --git a/icons/mob/clothing/under/ethereal.dmi b/icons/mob/clothing/under/ethereal.dmi index f9bddd0d6513c..7447defec053a 100644 Binary files a/icons/mob/clothing/under/ethereal.dmi and b/icons/mob/clothing/under/ethereal.dmi differ diff --git a/icons/mob/clothing/under/plasmaman.dmi b/icons/mob/clothing/under/plasmaman.dmi index f154127f3fb75..fcc8f008cd7aa 100644 Binary files a/icons/mob/clothing/under/plasmaman.dmi and b/icons/mob/clothing/under/plasmaman.dmi differ diff --git a/icons/mob/clothing/under/rnd.dmi b/icons/mob/clothing/under/rnd.dmi index edc271a66a03f..27b4cac5a3f13 100644 Binary files a/icons/mob/clothing/under/rnd.dmi and b/icons/mob/clothing/under/rnd.dmi differ diff --git a/icons/mob/clothing/under/shorts_pants_shirts.dmi b/icons/mob/clothing/under/shorts_pants_shirts.dmi index 54c0a052b6a19..8a81dcf55dde6 100644 Binary files a/icons/mob/clothing/under/shorts_pants_shirts.dmi and b/icons/mob/clothing/under/shorts_pants_shirts.dmi differ diff --git a/icons/mob/clothing/under/suits.dmi b/icons/mob/clothing/under/suits.dmi index 16278b334144d..e3800e2bd04b8 100644 Binary files a/icons/mob/clothing/under/suits.dmi and b/icons/mob/clothing/under/suits.dmi differ diff --git a/icons/mecha/coop_mech.dmi b/icons/mob/coop_mech.dmi similarity index 100% rename from icons/mecha/coop_mech.dmi rename to icons/mob/coop_mech.dmi diff --git a/icons/mob/effects/debuff_overlays.dmi b/icons/mob/effects/debuff_overlays.dmi new file mode 100644 index 0000000000000..383ce22aabec7 Binary files /dev/null and b/icons/mob/effects/debuff_overlays.dmi differ diff --git a/icons/mecha/durand_shield.dmi b/icons/mob/effects/durand_shield.dmi similarity index 100% rename from icons/mecha/durand_shield.dmi rename to icons/mob/effects/durand_shield.dmi diff --git a/icons/obj/ethereal_crystal.dmi b/icons/mob/effects/ethereal_crystal.dmi similarity index 100% rename from icons/obj/ethereal_crystal.dmi rename to icons/mob/effects/ethereal_crystal.dmi diff --git a/icons/effects/genetics.dmi b/icons/mob/effects/genetics.dmi similarity index 100% rename from icons/effects/genetics.dmi rename to icons/mob/effects/genetics.dmi diff --git a/icons/mob/huds/hud.dmi b/icons/mob/huds/hud.dmi index ec9be118f5792..d71ba4b0940a6 100644 Binary files a/icons/mob/huds/hud.dmi and b/icons/mob/huds/hud.dmi differ diff --git a/icons/mob/human/bodyparts.dmi b/icons/mob/human/bodyparts.dmi new file mode 100644 index 0000000000000..7e804e894d213 Binary files /dev/null and b/icons/mob/human/bodyparts.dmi differ diff --git a/icons/mob/human/bodyparts_greyscale.dmi b/icons/mob/human/bodyparts_greyscale.dmi new file mode 100644 index 0000000000000..b87182b258b44 Binary files /dev/null and b/icons/mob/human/bodyparts_greyscale.dmi differ diff --git a/icons/mob/species/human/cat_features.dmi b/icons/mob/human/cat_features.dmi similarity index 100% rename from icons/mob/species/human/cat_features.dmi rename to icons/mob/human/cat_features.dmi diff --git a/icons/mob/human/emote_visuals.dmi b/icons/mob/human/emote_visuals.dmi new file mode 100644 index 0000000000000..8a29603850f4f Binary files /dev/null and b/icons/mob/human/emote_visuals.dmi differ diff --git a/icons/mob/species/human/fox_features.dmi b/icons/mob/human/fox_features.dmi similarity index 100% rename from icons/mob/species/human/fox_features.dmi rename to icons/mob/human/fox_features.dmi diff --git a/icons/mob/human/human.dmi b/icons/mob/human/human.dmi new file mode 100644 index 0000000000000..7532655b5277d Binary files /dev/null and b/icons/mob/human/human.dmi differ diff --git a/icons/mob/human/human_face.dmi b/icons/mob/human/human_face.dmi new file mode 100644 index 0000000000000..6985cf07eee49 Binary files /dev/null and b/icons/mob/human/human_face.dmi differ diff --git a/icons/mob/species/human/mannequin.dmi b/icons/mob/human/mannequin.dmi similarity index 100% rename from icons/mob/species/human/mannequin.dmi rename to icons/mob/human/mannequin.dmi diff --git a/icons/mob/species/alien/bodyparts.dmi b/icons/mob/human/species/alien/bodyparts.dmi similarity index 100% rename from icons/mob/species/alien/bodyparts.dmi rename to icons/mob/human/species/alien/bodyparts.dmi diff --git a/icons/mob/human/species/ethereal/bodyparts.dmi b/icons/mob/human/species/ethereal/bodyparts.dmi new file mode 100644 index 0000000000000..cec48973c712d Binary files /dev/null and b/icons/mob/human/species/ethereal/bodyparts.dmi differ diff --git a/icons/mob/species/golems.dmi b/icons/mob/human/species/golems.dmi similarity index 100% rename from icons/mob/species/golems.dmi rename to icons/mob/human/species/golems.dmi diff --git a/icons/mob/human/species/hair_gradients.dmi b/icons/mob/human/species/hair_gradients.dmi new file mode 100644 index 0000000000000..a5b36fab6a2f0 Binary files /dev/null and b/icons/mob/human/species/hair_gradients.dmi differ diff --git a/icons/mob/species/lizard/bodyparts.dmi b/icons/mob/human/species/lizard/bodyparts.dmi similarity index 100% rename from icons/mob/species/lizard/bodyparts.dmi rename to icons/mob/human/species/lizard/bodyparts.dmi diff --git a/icons/mob/species/lizard/lizard_misc.dmi b/icons/mob/human/species/lizard/lizard_misc.dmi similarity index 100% rename from icons/mob/species/lizard/lizard_misc.dmi rename to icons/mob/human/species/lizard/lizard_misc.dmi diff --git a/icons/mob/species/lizard/lizard_spines.dmi b/icons/mob/human/species/lizard/lizard_spines.dmi similarity index 100% rename from icons/mob/species/lizard/lizard_spines.dmi rename to icons/mob/human/species/lizard/lizard_spines.dmi diff --git a/icons/mob/species/lizard/lizard_tails.dmi b/icons/mob/human/species/lizard/lizard_tails.dmi similarity index 100% rename from icons/mob/species/lizard/lizard_tails.dmi rename to icons/mob/human/species/lizard/lizard_tails.dmi diff --git a/icons/mob/human/species/misc/bodypart_overlay_simple.dmi b/icons/mob/human/species/misc/bodypart_overlay_simple.dmi new file mode 100644 index 0000000000000..55fb5c40a842a Binary files /dev/null and b/icons/mob/human/species/misc/bodypart_overlay_simple.dmi differ diff --git a/icons/mob/human/species/misc/digitigrade.dmi b/icons/mob/human/species/misc/digitigrade.dmi new file mode 100644 index 0000000000000..e0d20013abe51 Binary files /dev/null and b/icons/mob/human/species/misc/digitigrade.dmi differ diff --git a/icons/mob/species/monkey/bodyparts.dmi b/icons/mob/human/species/monkey/bodyparts.dmi similarity index 100% rename from icons/mob/species/monkey/bodyparts.dmi rename to icons/mob/human/species/monkey/bodyparts.dmi diff --git a/icons/mob/species/monkey/monkey_tail.dmi b/icons/mob/human/species/monkey/monkey_tail.dmi similarity index 100% rename from icons/mob/species/monkey/monkey_tail.dmi rename to icons/mob/human/species/monkey/monkey_tail.dmi diff --git a/icons/mob/species/monkey/uniform.dmi b/icons/mob/human/species/monkey/uniform.dmi similarity index 100% rename from icons/mob/species/monkey/uniform.dmi rename to icons/mob/human/species/monkey/uniform.dmi diff --git a/icons/mob/species/moth/bodyparts.dmi b/icons/mob/human/species/moth/bodyparts.dmi similarity index 100% rename from icons/mob/species/moth/bodyparts.dmi rename to icons/mob/human/species/moth/bodyparts.dmi diff --git a/icons/mob/species/moth/moth_antennae.dmi b/icons/mob/human/species/moth/moth_antennae.dmi similarity index 100% rename from icons/mob/species/moth/moth_antennae.dmi rename to icons/mob/human/species/moth/moth_antennae.dmi diff --git a/icons/mob/species/moth/moth_markings.dmi b/icons/mob/human/species/moth/moth_markings.dmi similarity index 100% rename from icons/mob/species/moth/moth_markings.dmi rename to icons/mob/human/species/moth/moth_markings.dmi diff --git a/icons/mob/species/moth/moth_wings.dmi b/icons/mob/human/species/moth/moth_wings.dmi similarity index 100% rename from icons/mob/species/moth/moth_wings.dmi rename to icons/mob/human/species/moth/moth_wings.dmi diff --git a/icons/mob/species/mush_cap.dmi b/icons/mob/human/species/mush_cap.dmi similarity index 100% rename from icons/mob/species/mush_cap.dmi rename to icons/mob/human/species/mush_cap.dmi diff --git a/icons/mob/species/plasmaman/bodyparts.dmi b/icons/mob/human/species/plasmaman/bodyparts.dmi similarity index 100% rename from icons/mob/species/plasmaman/bodyparts.dmi rename to icons/mob/human/species/plasmaman/bodyparts.dmi diff --git a/icons/mob/species/podperson_hair.dmi b/icons/mob/human/species/podperson_hair.dmi similarity index 100% rename from icons/mob/species/podperson_hair.dmi rename to icons/mob/human/species/podperson_hair.dmi diff --git a/icons/mob/human/species/wings.dmi b/icons/mob/human/species/wings.dmi new file mode 100644 index 0000000000000..26e8b011fce2a Binary files /dev/null and b/icons/mob/human/species/wings.dmi differ diff --git a/icons/mob/inhands/64x64_lefthand.dmi b/icons/mob/inhands/64x64_lefthand.dmi index 61d8948a98f61..8a6bab6977667 100644 Binary files a/icons/mob/inhands/64x64_lefthand.dmi and b/icons/mob/inhands/64x64_lefthand.dmi differ diff --git a/icons/mob/inhands/64x64_righthand.dmi b/icons/mob/inhands/64x64_righthand.dmi index 9d3f6e679d09d..251458590bdd4 100644 Binary files a/icons/mob/inhands/64x64_righthand.dmi and b/icons/mob/inhands/64x64_righthand.dmi differ diff --git a/icons/mob/inhands/animal_item_lefthand.dmi b/icons/mob/inhands/animal_item_lefthand.dmi index 7dbb3ebb43c20..912f53a02e9af 100644 Binary files a/icons/mob/inhands/animal_item_lefthand.dmi and b/icons/mob/inhands/animal_item_lefthand.dmi differ diff --git a/icons/mob/inhands/animal_item_righthand.dmi b/icons/mob/inhands/animal_item_righthand.dmi index 13dea9791da9d..98ca1ddea2cb1 100644 Binary files a/icons/mob/inhands/animal_item_righthand.dmi and b/icons/mob/inhands/animal_item_righthand.dmi differ diff --git a/icons/mob/inhands/clothing/hats_lefthand.dmi b/icons/mob/inhands/clothing/hats_lefthand.dmi index e0f246140aead..191c85cf4825c 100644 Binary files a/icons/mob/inhands/clothing/hats_lefthand.dmi and b/icons/mob/inhands/clothing/hats_lefthand.dmi differ diff --git a/icons/mob/inhands/clothing/hats_righthand.dmi b/icons/mob/inhands/clothing/hats_righthand.dmi index a7d3c60f5f3a3..8038e7474ee87 100644 Binary files a/icons/mob/inhands/clothing/hats_righthand.dmi and b/icons/mob/inhands/clothing/hats_righthand.dmi differ diff --git a/icons/mob/inhands/clothing/suits_lefthand.dmi b/icons/mob/inhands/clothing/suits_lefthand.dmi index 757fb8b8593c7..8b9fa5256a932 100644 Binary files a/icons/mob/inhands/clothing/suits_lefthand.dmi and b/icons/mob/inhands/clothing/suits_lefthand.dmi differ diff --git a/icons/mob/inhands/clothing/suits_righthand.dmi b/icons/mob/inhands/clothing/suits_righthand.dmi index c749a2ed98a8e..c88f4d224444f 100644 Binary files a/icons/mob/inhands/clothing/suits_righthand.dmi and b/icons/mob/inhands/clothing/suits_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/backpack_lefthand.dmi b/icons/mob/inhands/equipment/backpack_lefthand.dmi index 2ce92c864b9e8..e1cdb33c4b710 100644 Binary files a/icons/mob/inhands/equipment/backpack_lefthand.dmi and b/icons/mob/inhands/equipment/backpack_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/backpack_righthand.dmi b/icons/mob/inhands/equipment/backpack_righthand.dmi index 004561c77f1ff..31bdf51e7e057 100644 Binary files a/icons/mob/inhands/equipment/backpack_righthand.dmi and b/icons/mob/inhands/equipment/backpack_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/idcards_lefthand.dmi b/icons/mob/inhands/equipment/idcards_lefthand.dmi index 53b40584e7bae..90b96bd4d47a6 100644 Binary files a/icons/mob/inhands/equipment/idcards_lefthand.dmi and b/icons/mob/inhands/equipment/idcards_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/idcards_righthand.dmi b/icons/mob/inhands/equipment/idcards_righthand.dmi index 19a6f77c28381..a4b0ec4bb746c 100644 Binary files a/icons/mob/inhands/equipment/idcards_righthand.dmi and b/icons/mob/inhands/equipment/idcards_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/medical_lefthand.dmi b/icons/mob/inhands/equipment/medical_lefthand.dmi index 76e8d4e4efc99..feaed1690786e 100644 Binary files a/icons/mob/inhands/equipment/medical_lefthand.dmi and b/icons/mob/inhands/equipment/medical_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/medical_righthand.dmi b/icons/mob/inhands/equipment/medical_righthand.dmi index 43b46c1d7ee90..15ccf5c090e59 100644 Binary files a/icons/mob/inhands/equipment/medical_righthand.dmi and b/icons/mob/inhands/equipment/medical_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/tanks_lefthand.dmi b/icons/mob/inhands/equipment/tanks_lefthand.dmi index 300d3c4740d18..dc32e285237a0 100644 Binary files a/icons/mob/inhands/equipment/tanks_lefthand.dmi and b/icons/mob/inhands/equipment/tanks_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/tanks_righthand.dmi b/icons/mob/inhands/equipment/tanks_righthand.dmi index 3b19be6259803..30f2233c5ace9 100644 Binary files a/icons/mob/inhands/equipment/tanks_righthand.dmi and b/icons/mob/inhands/equipment/tanks_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/toolbox_lefthand.dmi b/icons/mob/inhands/equipment/toolbox_lefthand.dmi index a7084eec22db2..e3aca82d9e839 100644 Binary files a/icons/mob/inhands/equipment/toolbox_lefthand.dmi and b/icons/mob/inhands/equipment/toolbox_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/toolbox_righthand.dmi b/icons/mob/inhands/equipment/toolbox_righthand.dmi index b8310913e94ab..a7b538a130002 100644 Binary files a/icons/mob/inhands/equipment/toolbox_righthand.dmi and b/icons/mob/inhands/equipment/toolbox_righthand.dmi differ diff --git a/icons/mob/inhands/fish_lefthand.dmi b/icons/mob/inhands/fish_lefthand.dmi new file mode 100644 index 0000000000000..f5aeef6202713 Binary files /dev/null and b/icons/mob/inhands/fish_lefthand.dmi differ diff --git a/icons/mob/inhands/fish_righthand.dmi b/icons/mob/inhands/fish_righthand.dmi new file mode 100644 index 0000000000000..d9c23c3d1b19e Binary files /dev/null and b/icons/mob/inhands/fish_righthand.dmi differ diff --git a/icons/mob/inhands/items/drinks_lefthand.dmi b/icons/mob/inhands/items/drinks_lefthand.dmi index 6d7cc042f7723..fb2d9c22dd491 100644 Binary files a/icons/mob/inhands/items/drinks_lefthand.dmi and b/icons/mob/inhands/items/drinks_lefthand.dmi differ diff --git a/icons/mob/inhands/items/drinks_righthand.dmi b/icons/mob/inhands/items/drinks_righthand.dmi index 02756cb644832..13f9dc0a0264d 100644 Binary files a/icons/mob/inhands/items/drinks_righthand.dmi and b/icons/mob/inhands/items/drinks_righthand.dmi differ diff --git a/icons/mob/inhands/items/food_lefthand.dmi b/icons/mob/inhands/items/food_lefthand.dmi index f1062e114e82c..934c2fcd04583 100644 Binary files a/icons/mob/inhands/items/food_lefthand.dmi and b/icons/mob/inhands/items/food_lefthand.dmi differ diff --git a/icons/mob/inhands/items/food_righthand.dmi b/icons/mob/inhands/items/food_righthand.dmi index dbdfebd90cb4f..f49835a3a7bac 100644 Binary files a/icons/mob/inhands/items/food_righthand.dmi and b/icons/mob/inhands/items/food_righthand.dmi differ diff --git a/icons/mob/inhands/items/plushes_lefthand.dmi b/icons/mob/inhands/items/plushes_lefthand.dmi new file mode 100644 index 0000000000000..01fa1e7a2ed07 Binary files /dev/null and b/icons/mob/inhands/items/plushes_lefthand.dmi differ diff --git a/icons/mob/inhands/items/plushes_righthand.dmi b/icons/mob/inhands/items/plushes_righthand.dmi new file mode 100644 index 0000000000000..99dd1d01044fb Binary files /dev/null and b/icons/mob/inhands/items/plushes_righthand.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 113fd372586d2..f544eeb753a81 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 344568b8e2261..85c6accc80c36 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/64x_guns_left.dmi b/icons/mob/inhands/weapons/64x_guns_left.dmi index 83f9b02b57217..0378a60405792 100644 Binary files a/icons/mob/inhands/weapons/64x_guns_left.dmi and b/icons/mob/inhands/weapons/64x_guns_left.dmi differ diff --git a/icons/mob/inhands/weapons/64x_guns_right.dmi b/icons/mob/inhands/weapons/64x_guns_right.dmi index 4e804c53d725f..50fa2342d2a55 100644 Binary files a/icons/mob/inhands/weapons/64x_guns_right.dmi and b/icons/mob/inhands/weapons/64x_guns_right.dmi differ diff --git a/icons/mob/inhands/weapons/guns_lefthand.dmi b/icons/mob/inhands/weapons/guns_lefthand.dmi index e866650e19f64..013e6e4745854 100644 Binary files a/icons/mob/inhands/weapons/guns_lefthand.dmi and b/icons/mob/inhands/weapons/guns_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/guns_righthand.dmi b/icons/mob/inhands/weapons/guns_righthand.dmi index 2aca6d31727cf..14bf9e762c753 100644 Binary files a/icons/mob/inhands/weapons/guns_righthand.dmi and b/icons/mob/inhands/weapons/guns_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/staves_lefthand.dmi b/icons/mob/inhands/weapons/staves_lefthand.dmi index 82c552b503824..6e34949c9d561 100644 Binary files a/icons/mob/inhands/weapons/staves_lefthand.dmi and b/icons/mob/inhands/weapons/staves_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/staves_righthand.dmi b/icons/mob/inhands/weapons/staves_righthand.dmi index 769709f53da1e..df52d4d419876 100644 Binary files a/icons/mob/inhands/weapons/staves_righthand.dmi and b/icons/mob/inhands/weapons/staves_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/swords_lefthand.dmi b/icons/mob/inhands/weapons/swords_lefthand.dmi index b9825c07859b3..98a037e5c8ea0 100644 Binary files a/icons/mob/inhands/weapons/swords_lefthand.dmi and b/icons/mob/inhands/weapons/swords_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/swords_righthand.dmi b/icons/mob/inhands/weapons/swords_righthand.dmi index 297221ed1dd0e..b60f65194d57a 100644 Binary files a/icons/mob/inhands/weapons/swords_righthand.dmi and b/icons/mob/inhands/weapons/swords_righthand.dmi differ diff --git a/icons/mecha/mech_construct.dmi b/icons/mob/mech_construct.dmi similarity index 100% rename from icons/mecha/mech_construct.dmi rename to icons/mob/mech_construct.dmi diff --git a/icons/mob/mech_construction.dmi b/icons/mob/mech_construction.dmi new file mode 100644 index 0000000000000..b7b54e3f70e85 Binary files /dev/null and b/icons/mob/mech_construction.dmi differ diff --git a/icons/mecha/mecha.dmi b/icons/mob/mecha.dmi similarity index 100% rename from icons/mecha/mecha.dmi rename to icons/mob/mecha.dmi diff --git a/icons/mecha/mecha_ammo.dmi b/icons/mob/mecha_ammo.dmi similarity index 100% rename from icons/mecha/mecha_ammo.dmi rename to icons/mob/mecha_ammo.dmi diff --git a/icons/mob/mecha_equipment.dmi b/icons/mob/mecha_equipment.dmi new file mode 100644 index 0000000000000..18fe707cafe6e Binary files /dev/null and b/icons/mob/mecha_equipment.dmi differ diff --git a/icons/mob/nonhuman-player/96x96eldritch_mobs.dmi b/icons/mob/nonhuman-player/96x96eldritch_mobs.dmi index c20779ff24696..4bbc55c15dd8f 100644 Binary files a/icons/mob/nonhuman-player/96x96eldritch_mobs.dmi and b/icons/mob/nonhuman-player/96x96eldritch_mobs.dmi differ diff --git a/icons/mob/pets.dmi b/icons/mob/pets.dmi index e7009cfce330b..7c6800d602de3 100644 Binary files a/icons/mob/pets.dmi and b/icons/mob/pets.dmi differ diff --git a/icons/mob/shells.dmi b/icons/mob/shells.dmi new file mode 100644 index 0000000000000..eeff196707175 Binary files /dev/null and b/icons/mob/shells.dmi differ diff --git a/icons/mob/silicon/ai.dmi b/icons/mob/silicon/ai.dmi index 6ccceff86d9c7..df9059fb09e6a 100644 Binary files a/icons/mob/silicon/ai.dmi and b/icons/mob/silicon/ai.dmi differ diff --git a/icons/mob/silicon/pai.dmi b/icons/mob/silicon/pai.dmi index 624ed66951948..2be986d411dbe 100644 Binary files a/icons/mob/silicon/pai.dmi and b/icons/mob/silicon/pai.dmi differ diff --git a/icons/mob/simple/animal.dmi b/icons/mob/simple/animal.dmi index 53b768357358d..8e3affff4a90a 100644 Binary files a/icons/mob/simple/animal.dmi and b/icons/mob/simple/animal.dmi differ diff --git a/icons/mob/simple/arachnoid.dmi b/icons/mob/simple/arachnoid.dmi new file mode 100644 index 0000000000000..fca53195d4c06 Binary files /dev/null and b/icons/mob/simple/arachnoid.dmi differ diff --git a/icons/mob/simple/carp.dmi b/icons/mob/simple/carp.dmi index 02aadf91498f7..1be59c43ecb6e 100644 Binary files a/icons/mob/simple/carp.dmi and b/icons/mob/simple/carp.dmi differ diff --git a/icons/mob/simple/corgi_head.dmi b/icons/mob/simple/corgi_head.dmi index 1ee6a99964478..2e14a3ed0bb5d 100644 Binary files a/icons/mob/simple/corgi_head.dmi and b/icons/mob/simple/corgi_head.dmi differ diff --git a/icons/mob/simple/demon.dmi b/icons/mob/simple/demon.dmi new file mode 100644 index 0000000000000..1397a1f4f245d Binary files /dev/null and b/icons/mob/simple/demon.dmi differ diff --git a/icons/mob/simple/icemoon/icemoon_monsters.dmi b/icons/mob/simple/icemoon/icemoon_monsters.dmi index 9240b9bca44bf..6b05cf64580a3 100644 Binary files a/icons/mob/simple/icemoon/icemoon_monsters.dmi and b/icons/mob/simple/icemoon/icemoon_monsters.dmi differ diff --git a/icons/mob/simple/jungle/seedling.dmi b/icons/mob/simple/jungle/seedling.dmi index 01e91c6c292c2..c4a76ebb2d1c3 100644 Binary files a/icons/mob/simple/jungle/seedling.dmi and b/icons/mob/simple/jungle/seedling.dmi differ diff --git a/icons/mob/simple/lavaland/lavaland_monsters.dmi b/icons/mob/simple/lavaland/lavaland_monsters.dmi index 4e074a70eeacc..38b78cf468f1f 100644 Binary files a/icons/mob/simple/lavaland/lavaland_monsters.dmi and b/icons/mob/simple/lavaland/lavaland_monsters.dmi differ diff --git a/icons/mob/simple/lavaland/lavaland_monsters_wide.dmi b/icons/mob/simple/lavaland/lavaland_monsters_wide.dmi index 6142b5069d71c..2be68ef4c6696 100644 Binary files a/icons/mob/simple/lavaland/lavaland_monsters_wide.dmi and b/icons/mob/simple/lavaland/lavaland_monsters_wide.dmi differ diff --git a/icons/mob/simple/mob.dmi b/icons/mob/simple/mob.dmi index 566511042f497..e8fb3c59b8fbe 100644 Binary files a/icons/mob/simple/mob.dmi and b/icons/mob/simple/mob.dmi differ diff --git a/icons/mob/simple/penguins.dmi b/icons/mob/simple/penguins.dmi index c7417f89b4a22..23f20619a7aeb 100644 Binary files a/icons/mob/simple/penguins.dmi and b/icons/mob/simple/penguins.dmi differ diff --git a/icons/mob/simple/pets.dmi b/icons/mob/simple/pets.dmi index b35d033f84d1c..78212b93c769e 100644 Binary files a/icons/mob/simple/pets.dmi and b/icons/mob/simple/pets.dmi differ diff --git a/icons/mob/simple/simple_human.dmi b/icons/mob/simple/simple_human.dmi index 821ccab33a933..b74013900df7c 100644 Binary files a/icons/mob/simple/simple_human.dmi and b/icons/mob/simple/simple_human.dmi differ diff --git a/icons/effects/spacevines.dmi b/icons/mob/spacevines.dmi similarity index 100% rename from icons/effects/spacevines.dmi rename to icons/mob/spacevines.dmi diff --git a/icons/mob/species/ethereal/bodyparts.dmi b/icons/mob/species/ethereal/bodyparts.dmi deleted file mode 100644 index d063c92b74672..0000000000000 Binary files a/icons/mob/species/ethereal/bodyparts.dmi and /dev/null differ diff --git a/icons/mob/species/hair_gradients.dmi b/icons/mob/species/hair_gradients.dmi deleted file mode 100644 index f494fdac0da57..0000000000000 Binary files a/icons/mob/species/hair_gradients.dmi and /dev/null differ diff --git a/icons/mob/species/human/bodyparts.dmi b/icons/mob/species/human/bodyparts.dmi deleted file mode 100644 index ec53e63d36797..0000000000000 Binary files a/icons/mob/species/human/bodyparts.dmi and /dev/null differ diff --git a/icons/mob/species/human/bodyparts_greyscale.dmi b/icons/mob/species/human/bodyparts_greyscale.dmi deleted file mode 100644 index fff4624f1932c..0000000000000 Binary files a/icons/mob/species/human/bodyparts_greyscale.dmi and /dev/null differ diff --git a/icons/mob/species/human/emote_visuals.dmi b/icons/mob/species/human/emote_visuals.dmi deleted file mode 100644 index 66256491ea938..0000000000000 Binary files a/icons/mob/species/human/emote_visuals.dmi and /dev/null differ diff --git a/icons/mob/species/human/human.dmi b/icons/mob/species/human/human.dmi deleted file mode 100644 index 7e576e90404e9..0000000000000 Binary files a/icons/mob/species/human/human.dmi and /dev/null differ diff --git a/icons/mob/species/human/human_face.dmi b/icons/mob/species/human/human_face.dmi deleted file mode 100644 index f4e52c8c5d1f1..0000000000000 Binary files a/icons/mob/species/human/human_face.dmi and /dev/null differ diff --git a/icons/mob/species/misc/bodypart_overlay_simple.dmi b/icons/mob/species/misc/bodypart_overlay_simple.dmi deleted file mode 100644 index 2bc1dda5663ab..0000000000000 Binary files a/icons/mob/species/misc/bodypart_overlay_simple.dmi and /dev/null differ diff --git a/icons/mob/species/misc/digitigrade.dmi b/icons/mob/species/misc/digitigrade.dmi deleted file mode 100644 index ce246d0d8d725..0000000000000 Binary files a/icons/mob/species/misc/digitigrade.dmi and /dev/null differ diff --git a/icons/mob/species/wings.dmi b/icons/mob/species/wings.dmi deleted file mode 100644 index 0cc2b1224fae4..0000000000000 Binary files a/icons/mob/species/wings.dmi and /dev/null differ diff --git a/icons/mob/telegraphing/telegraph.dmi b/icons/mob/telegraphing/telegraph.dmi index 4d9e55d534f09..de525ead4ee9a 100644 Binary files a/icons/mob/telegraphing/telegraph.dmi and b/icons/mob/telegraphing/telegraph.dmi differ diff --git a/icons/obj/aicards.dmi b/icons/obj/aicards.dmi index 86501e4b43b3f..2de7da5f6c88a 100644 Binary files a/icons/obj/aicards.dmi and b/icons/obj/aicards.dmi differ diff --git a/icons/obj/airlock_machines.dmi b/icons/obj/airlock_machines.dmi deleted file mode 100644 index e28fde84f0fc4..0000000000000 Binary files a/icons/obj/airlock_machines.dmi and /dev/null differ diff --git a/icons/obj/anomaly.dmi b/icons/obj/anomaly.dmi new file mode 100644 index 0000000000000..ad712e290fb7e Binary files /dev/null and b/icons/obj/anomaly.dmi differ diff --git a/icons/obj/abductor.dmi b/icons/obj/antags/abductor.dmi similarity index 88% rename from icons/obj/abductor.dmi rename to icons/obj/antags/abductor.dmi index 98792bfeb5de6..0045d4b2398a2 100644 Binary files a/icons/obj/abductor.dmi and b/icons/obj/antags/abductor.dmi differ diff --git a/icons/obj/contractor_tablet.dmi b/icons/obj/antags/contractor_tablet.dmi similarity index 100% rename from icons/obj/contractor_tablet.dmi rename to icons/obj/antags/contractor_tablet.dmi diff --git a/icons/obj/antags/cult/items.dmi b/icons/obj/antags/cult/items.dmi new file mode 100644 index 0000000000000..9a3435dcd833e Binary files /dev/null and b/icons/obj/antags/cult/items.dmi differ diff --git a/icons/obj/cult/narsie.dmi b/icons/obj/antags/cult/narsie.dmi similarity index 100% rename from icons/obj/cult/narsie.dmi rename to icons/obj/antags/cult/narsie.dmi diff --git a/icons/obj/cult/narsie_small.dmi b/icons/obj/antags/cult/narsie_small.dmi similarity index 100% rename from icons/obj/cult/narsie_small.dmi rename to icons/obj/antags/cult/narsie_small.dmi diff --git a/icons/obj/rune.dmi b/icons/obj/antags/cult/rune.dmi similarity index 100% rename from icons/obj/rune.dmi rename to icons/obj/antags/cult/rune.dmi diff --git a/icons/obj/cult/structures.dmi b/icons/obj/antags/cult/structures.dmi similarity index 100% rename from icons/obj/cult/structures.dmi rename to icons/obj/antags/cult/structures.dmi diff --git a/icons/obj/antags/eldritch.dmi b/icons/obj/antags/eldritch.dmi new file mode 100644 index 0000000000000..d59bf3dbdeb18 Binary files /dev/null and b/icons/obj/antags/eldritch.dmi differ diff --git a/icons/obj/gang/actions.dmi b/icons/obj/antags/gang/actions.dmi similarity index 100% rename from icons/obj/gang/actions.dmi rename to icons/obj/antags/gang/actions.dmi diff --git a/icons/obj/gang/cell_phone.dmi b/icons/obj/antags/gang/cell_phone.dmi similarity index 100% rename from icons/obj/gang/cell_phone.dmi rename to icons/obj/antags/gang/cell_phone.dmi diff --git a/icons/obj/gang/signup_points.dmi b/icons/obj/antags/gang/signup_points.dmi similarity index 100% rename from icons/obj/gang/signup_points.dmi rename to icons/obj/antags/gang/signup_points.dmi diff --git a/icons/obj/gang/tags.dmi b/icons/obj/antags/gang/tags.dmi similarity index 100% rename from icons/obj/gang/tags.dmi rename to icons/obj/antags/gang/tags.dmi diff --git a/icons/obj/gang/wanted_160x32.dmi b/icons/obj/antags/gang/wanted_160x32.dmi similarity index 100% rename from icons/obj/gang/wanted_160x32.dmi rename to icons/obj/antags/gang/wanted_160x32.dmi diff --git a/icons/obj/antags/syndicate_tools.dmi b/icons/obj/antags/syndicate_tools.dmi new file mode 100644 index 0000000000000..05a4c405d7df9 Binary files /dev/null and b/icons/obj/antags/syndicate_tools.dmi differ diff --git a/icons/obj/aquarium.dmi b/icons/obj/aquarium.dmi index b5de3de4e92e2..19e2e68c4f8f3 100644 Binary files a/icons/obj/aquarium.dmi and b/icons/obj/aquarium.dmi differ diff --git a/icons/obj/aquarium_wide.dmi b/icons/obj/aquarium_wide.dmi new file mode 100644 index 0000000000000..7c5f941a1db37 Binary files /dev/null and b/icons/obj/aquarium_wide.dmi differ diff --git a/icons/obj/weapons/horn.dmi b/icons/obj/art/horn.dmi similarity index 100% rename from icons/obj/weapons/horn.dmi rename to icons/obj/art/horn.dmi diff --git a/icons/obj/art/musician.dmi b/icons/obj/art/musician.dmi index 22e5a24ba54da..6f98eb0d7b0a6 100644 Binary files a/icons/obj/art/musician.dmi and b/icons/obj/art/musician.dmi differ diff --git a/icons/obj/assemblies/assemblies.dmi b/icons/obj/assemblies/assemblies.dmi index 903449726cf06..aa3476eea725f 100644 Binary files a/icons/obj/assemblies/assemblies.dmi and b/icons/obj/assemblies/assemblies.dmi differ diff --git a/icons/obj/module.dmi b/icons/obj/assemblies/module.dmi similarity index 100% rename from icons/obj/module.dmi rename to icons/obj/assemblies/module.dmi diff --git a/icons/obj/assemblies/stock_parts.dmi b/icons/obj/assemblies/stock_parts.dmi new file mode 100644 index 0000000000000..6b2353b80ddb5 Binary files /dev/null and b/icons/obj/assemblies/stock_parts.dmi differ diff --git a/icons/obj/atmospherics/pipes/disposal.dmi b/icons/obj/atmospherics/pipes/disposal.dmi deleted file mode 100644 index 450d8e8f8abf9..0000000000000 Binary files a/icons/obj/atmospherics/pipes/disposal.dmi and /dev/null differ diff --git a/icons/obj/atmospherics/pipes/transit_tube.dmi b/icons/obj/atmospherics/pipes/transit_tube.dmi deleted file mode 100644 index 966e20d68415a..0000000000000 Binary files a/icons/obj/atmospherics/pipes/transit_tube.dmi and /dev/null differ diff --git a/icons/obj/atmospherics/tank.dmi b/icons/obj/atmospherics/tank.dmi deleted file mode 100644 index b8bdeed9d98c7..0000000000000 Binary files a/icons/obj/atmospherics/tank.dmi and /dev/null differ diff --git a/icons/obj/bed.dmi b/icons/obj/bed.dmi new file mode 100644 index 0000000000000..0ba8f799d59b8 Binary files /dev/null and b/icons/obj/bed.dmi differ diff --git a/icons/obj/boxcutter.dmi b/icons/obj/boxcutter.dmi deleted file mode 100644 index dd920507563d0..0000000000000 Binary files a/icons/obj/boxcutter.dmi and /dev/null differ diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi deleted file mode 100644 index 2c5e919ead76c..0000000000000 Binary files a/icons/obj/bureaucracy.dmi and /dev/null differ diff --git a/icons/obj/buttons.dmi b/icons/obj/buttons.dmi deleted file mode 100644 index 98d7e3edeb9a6..0000000000000 Binary files a/icons/obj/buttons.dmi and /dev/null differ diff --git a/icons/obj/canisters.dmi b/icons/obj/canisters.dmi new file mode 100644 index 0000000000000..e57c6ad9b963f Binary files /dev/null and b/icons/obj/canisters.dmi differ diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi index 95a5504f18c05..a5e34e9cc27cb 100644 Binary files a/icons/obj/card.dmi and b/icons/obj/card.dmi differ diff --git a/icons/obj/carp_rift.dmi b/icons/obj/carp_rift.dmi deleted file mode 100644 index 9a07b3b16f866..0000000000000 Binary files a/icons/obj/carp_rift.dmi and /dev/null differ diff --git a/icons/obj/sofa.dmi b/icons/obj/chairs_wide.dmi similarity index 100% rename from icons/obj/sofa.dmi rename to icons/obj/chairs_wide.dmi diff --git a/icons/obj/clothing/accessories.dmi b/icons/obj/clothing/accessories.dmi index f4ba648f664e4..fdba37254eb42 100644 Binary files a/icons/obj/clothing/accessories.dmi and b/icons/obj/clothing/accessories.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index 1b31d0e8b0bf6..0a2bd33c4e42a 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/icons/obj/clothing/cloaks.dmi b/icons/obj/clothing/cloaks.dmi index dd1b905ad2c17..101264aca539b 100644 Binary files a/icons/obj/clothing/cloaks.dmi and b/icons/obj/clothing/cloaks.dmi differ diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi index 57bc8ee729f49..fd898d3105fd8 100644 Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ diff --git a/icons/obj/clothing/head/chaplain.dmi b/icons/obj/clothing/head/chaplain.dmi index d95436fdd2d7a..ed6f6248b317c 100644 Binary files a/icons/obj/clothing/head/chaplain.dmi and b/icons/obj/clothing/head/chaplain.dmi differ diff --git a/icons/obj/clothing/head/costume.dmi b/icons/obj/clothing/head/costume.dmi index e28dfd35fe5e6..f676b1c6973d5 100644 Binary files a/icons/obj/clothing/head/costume.dmi and b/icons/obj/clothing/head/costume.dmi differ diff --git a/icons/obj/clothing/head/hats.dmi b/icons/obj/clothing/head/hats.dmi index 52d63975d4f25..15117fa69a835 100644 Binary files a/icons/obj/clothing/head/hats.dmi and b/icons/obj/clothing/head/hats.dmi differ diff --git a/icons/obj/clothing/head/helmet.dmi b/icons/obj/clothing/head/helmet.dmi index b3c230244247d..d9f02085e732e 100644 Binary files a/icons/obj/clothing/head/helmet.dmi and b/icons/obj/clothing/head/helmet.dmi differ diff --git a/icons/obj/clothing/head/plasmaman_hats.dmi b/icons/obj/clothing/head/plasmaman_hats.dmi index 382dae5df1efd..f593a08b88c30 100644 Binary files a/icons/obj/clothing/head/plasmaman_hats.dmi and b/icons/obj/clothing/head/plasmaman_hats.dmi differ diff --git a/icons/obj/clothing/head/spacehelm.dmi b/icons/obj/clothing/head/spacehelm.dmi index cb761be5a9aaf..ee8127e4964bb 100644 Binary files a/icons/obj/clothing/head/spacehelm.dmi and b/icons/obj/clothing/head/spacehelm.dmi differ diff --git a/icons/obj/clothing/head/utility.dmi b/icons/obj/clothing/head/utility.dmi index 2d8f274c94ee7..17040f5bb8b53 100644 Binary files a/icons/obj/clothing/head/utility.dmi and b/icons/obj/clothing/head/utility.dmi differ diff --git a/icons/obj/clothing/head/winterhood.dmi b/icons/obj/clothing/head/winterhood.dmi index 2d5170948a4b4..34e0abf39beef 100644 Binary files a/icons/obj/clothing/head/winterhood.dmi and b/icons/obj/clothing/head/winterhood.dmi differ diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi index 5c003d0999ffe..20951b3264f08 100644 Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ diff --git a/icons/obj/clothing/modsuit/mod_clothing.dmi b/icons/obj/clothing/modsuit/mod_clothing.dmi index ed85ade524991..7eb92f1c3519c 100644 Binary files a/icons/obj/clothing/modsuit/mod_clothing.dmi and b/icons/obj/clothing/modsuit/mod_clothing.dmi differ diff --git a/icons/obj/clothing/modsuit/mod_modules.dmi b/icons/obj/clothing/modsuit/mod_modules.dmi index 037e7fe69634a..f1d19c29da119 100644 Binary files a/icons/obj/clothing/modsuit/mod_modules.dmi and b/icons/obj/clothing/modsuit/mod_modules.dmi differ diff --git a/icons/obj/clothing/neck.dmi b/icons/obj/clothing/neck.dmi index 1f75bd6c12bd4..ff7e012324a0a 100644 Binary files a/icons/obj/clothing/neck.dmi and b/icons/obj/clothing/neck.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index 7f4d038193743..104812240fec6 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/clothing/suits/armor.dmi b/icons/obj/clothing/suits/armor.dmi index 8e50c4f7d3ecc..48fe5c92c339d 100644 Binary files a/icons/obj/clothing/suits/armor.dmi and b/icons/obj/clothing/suits/armor.dmi differ diff --git a/icons/obj/clothing/suits/chaplain.dmi b/icons/obj/clothing/suits/chaplain.dmi index 64474a04d3182..730e47cd6fa94 100644 Binary files a/icons/obj/clothing/suits/chaplain.dmi and b/icons/obj/clothing/suits/chaplain.dmi differ diff --git a/icons/obj/clothing/suits/costume.dmi b/icons/obj/clothing/suits/costume.dmi index 86c77feb99192..0c08b97605db3 100644 Binary files a/icons/obj/clothing/suits/costume.dmi and b/icons/obj/clothing/suits/costume.dmi differ diff --git a/icons/obj/clothing/suits/jacket.dmi b/icons/obj/clothing/suits/jacket.dmi index bcde51f037e65..dc507017cd25d 100644 Binary files a/icons/obj/clothing/suits/jacket.dmi and b/icons/obj/clothing/suits/jacket.dmi differ diff --git a/icons/obj/clothing/suits/spacesuit.dmi b/icons/obj/clothing/suits/spacesuit.dmi index 56be1a49e2346..de9c1242767c9 100644 Binary files a/icons/obj/clothing/suits/spacesuit.dmi and b/icons/obj/clothing/suits/spacesuit.dmi differ diff --git a/icons/obj/clothing/suits/utility.dmi b/icons/obj/clothing/suits/utility.dmi index d7bb4e9bfa613..25fb8fd502a35 100644 Binary files a/icons/obj/clothing/suits/utility.dmi and b/icons/obj/clothing/suits/utility.dmi differ diff --git a/icons/obj/clothing/suits/wintercoat.dmi b/icons/obj/clothing/suits/wintercoat.dmi index 27b53c2ddf49b..377c9ef61e30e 100644 Binary files a/icons/obj/clothing/suits/wintercoat.dmi and b/icons/obj/clothing/suits/wintercoat.dmi differ diff --git a/icons/obj/clothing/under/cargo.dmi b/icons/obj/clothing/under/cargo.dmi index 5ea90482fafc3..63e40538899f7 100644 Binary files a/icons/obj/clothing/under/cargo.dmi and b/icons/obj/clothing/under/cargo.dmi differ diff --git a/icons/obj/clothing/under/civilian.dmi b/icons/obj/clothing/under/civilian.dmi index 04c37b2356ee5..8552c5b9660e5 100644 Binary files a/icons/obj/clothing/under/civilian.dmi and b/icons/obj/clothing/under/civilian.dmi differ diff --git a/icons/obj/clothing/under/costume.dmi b/icons/obj/clothing/under/costume.dmi index a91873dce148d..bf60bb0a4452d 100644 Binary files a/icons/obj/clothing/under/costume.dmi and b/icons/obj/clothing/under/costume.dmi differ diff --git a/icons/obj/clothing/under/lawyer_galaxy.dmi b/icons/obj/clothing/under/lawyer_galaxy.dmi new file mode 100644 index 0000000000000..88ffcf4413277 Binary files /dev/null and b/icons/obj/clothing/under/lawyer_galaxy.dmi differ diff --git a/icons/obj/clothing/under/plasmaman.dmi b/icons/obj/clothing/under/plasmaman.dmi index d22ae7a26e1d6..4d416d5b05f1f 100644 Binary files a/icons/obj/clothing/under/plasmaman.dmi and b/icons/obj/clothing/under/plasmaman.dmi differ diff --git a/icons/obj/clothing/under/rnd.dmi b/icons/obj/clothing/under/rnd.dmi index b7ce3896b3d83..beb6b22a1484d 100644 Binary files a/icons/obj/clothing/under/rnd.dmi and b/icons/obj/clothing/under/rnd.dmi differ diff --git a/icons/obj/clothing/under/shorts_pants_shirts.dmi b/icons/obj/clothing/under/shorts_pants_shirts.dmi index c9b71d31ce12c..26ffec00e19d7 100644 Binary files a/icons/obj/clothing/under/shorts_pants_shirts.dmi and b/icons/obj/clothing/under/shorts_pants_shirts.dmi differ diff --git a/icons/obj/clothing/under/suits.dmi b/icons/obj/clothing/under/suits.dmi index 0ebdd51147f6f..42c79981df6fb 100644 Binary files a/icons/obj/clothing/under/suits.dmi and b/icons/obj/clothing/under/suits.dmi differ diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi deleted file mode 100644 index 10974f97bac68..0000000000000 Binary files a/icons/obj/computer.dmi and /dev/null differ diff --git a/icons/obj/containers.dmi b/icons/obj/containers.dmi deleted file mode 100644 index af9abe7073e4e..0000000000000 Binary files a/icons/obj/containers.dmi and /dev/null differ diff --git a/icons/obj/cosmetic.dmi b/icons/obj/cosmetic.dmi index c5bd95f6c69ba..b04bde541ad6c 100644 Binary files a/icons/obj/cosmetic.dmi and b/icons/obj/cosmetic.dmi differ diff --git a/icons/obj/cult/items_and_weapons.dmi b/icons/obj/cult/items_and_weapons.dmi deleted file mode 100644 index f338d297391c3..0000000000000 Binary files a/icons/obj/cult/items_and_weapons.dmi and /dev/null differ diff --git a/icons/obj/debris.dmi b/icons/obj/debris.dmi new file mode 100644 index 0000000000000..d256d1ddd6ed7 Binary files /dev/null and b/icons/obj/debris.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 5067052940d6b..d89ee6e5d6408 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/device_syndie.dmi b/icons/obj/device_syndie.dmi deleted file mode 100644 index 25ac0ef9b3944..0000000000000 Binary files a/icons/obj/device_syndie.dmi and /dev/null differ diff --git a/icons/obj/digital_clock.dmi b/icons/obj/digital_clock.dmi new file mode 100644 index 0000000000000..9ab096bf5935b Binary files /dev/null and b/icons/obj/digital_clock.dmi differ diff --git a/icons/obj/doors/airlocks/glass_large/glass_large.dmi b/icons/obj/doors/airlocks/glass_large/glass_large.dmi deleted file mode 100644 index 9dbcb9d0f1a16..0000000000000 Binary files a/icons/obj/doors/airlocks/glass_large/glass_large.dmi and /dev/null differ diff --git a/icons/obj/doors/airlocks/glass_large/overlays.dmi b/icons/obj/doors/airlocks/glass_large/overlays.dmi deleted file mode 100644 index bc9cc86c107f8..0000000000000 Binary files a/icons/obj/doors/airlocks/glass_large/overlays.dmi and /dev/null differ diff --git a/icons/obj/doors/airlocks/multi_tile/public/glass.dmi b/icons/obj/doors/airlocks/multi_tile/public/glass.dmi new file mode 100644 index 0000000000000..33420a77b11ce Binary files /dev/null and b/icons/obj/doors/airlocks/multi_tile/public/glass.dmi differ diff --git a/icons/obj/doors/airlocks/multi_tile/public/overlays.dmi b/icons/obj/doors/airlocks/multi_tile/public/overlays.dmi new file mode 100644 index 0000000000000..b0d10c8945d60 Binary files /dev/null and b/icons/obj/doors/airlocks/multi_tile/public/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/station2/glass.dmi b/icons/obj/doors/airlocks/public/glass.dmi similarity index 100% rename from icons/obj/doors/airlocks/station2/glass.dmi rename to icons/obj/doors/airlocks/public/glass.dmi diff --git a/icons/obj/doors/airlocks/station2/overlays.dmi b/icons/obj/doors/airlocks/public/overlays.dmi similarity index 100% rename from icons/obj/doors/airlocks/station2/overlays.dmi rename to icons/obj/doors/airlocks/public/overlays.dmi diff --git a/icons/obj/drinks/bottles.dmi b/icons/obj/drinks/bottles.dmi index 6f36221795466..205a67c84e20d 100644 Binary files a/icons/obj/drinks/bottles.dmi and b/icons/obj/drinks/bottles.dmi differ diff --git a/icons/obj/drinks/boxes.dmi b/icons/obj/drinks/boxes.dmi index 8ed76d9760aca..0871bf5500681 100644 Binary files a/icons/obj/drinks/boxes.dmi and b/icons/obj/drinks/boxes.dmi differ diff --git a/icons/obj/drinks/drink_effects.dmi b/icons/obj/drinks/drink_effects.dmi index 63bc699c9f5c7..b0441f73f3462 100644 Binary files a/icons/obj/drinks/drink_effects.dmi and b/icons/obj/drinks/drink_effects.dmi differ diff --git a/icons/obj/drinks/drinks.dmi b/icons/obj/drinks/drinks.dmi index add38550de253..4b966cb2db275 100644 Binary files a/icons/obj/drinks/drinks.dmi and b/icons/obj/drinks/drinks.dmi differ diff --git a/icons/obj/drinks/mixed_drinks.dmi b/icons/obj/drinks/mixed_drinks.dmi index 9d11040d0abc5..231df35f6e6ae 100644 Binary files a/icons/obj/drinks/mixed_drinks.dmi and b/icons/obj/drinks/mixed_drinks.dmi differ diff --git a/icons/obj/drinks/soda.dmi b/icons/obj/drinks/soda.dmi index dedca0ff89e5d..f061e029c4dc9 100644 Binary files a/icons/obj/drinks/soda.dmi and b/icons/obj/drinks/soda.dmi differ diff --git a/icons/obj/dyespray.dmi b/icons/obj/dyespray.dmi deleted file mode 100644 index eb056036799a8..0000000000000 Binary files a/icons/obj/dyespray.dmi and /dev/null differ diff --git a/icons/obj/economy.dmi b/icons/obj/economy.dmi index dc90265b6e901..04abc41cae175 100644 Binary files a/icons/obj/economy.dmi and b/icons/obj/economy.dmi differ diff --git a/icons/obj/eldritch.dmi b/icons/obj/eldritch.dmi deleted file mode 100644 index f3049a088cc55..0000000000000 Binary files a/icons/obj/eldritch.dmi and /dev/null differ diff --git a/icons/obj/exploration.dmi b/icons/obj/exploration.dmi index 014f77195dc23..b7224d2df84d9 100644 Binary files a/icons/obj/exploration.dmi and b/icons/obj/exploration.dmi differ diff --git a/icons/obj/firealarm.dmi b/icons/obj/firealarm.dmi deleted file mode 100644 index 2310feb76c645..0000000000000 Binary files a/icons/obj/firealarm.dmi and /dev/null differ diff --git a/icons/obj/fishing.dmi b/icons/obj/fishing.dmi index 1b7d03dd13dd3..f7ab9fc1ad9c2 100644 Binary files a/icons/obj/fishing.dmi and b/icons/obj/fishing.dmi differ diff --git a/icons/obj/fluff.dmi b/icons/obj/fluff.dmi deleted file mode 100644 index 591880717eab4..0000000000000 Binary files a/icons/obj/fluff.dmi and /dev/null differ diff --git a/icons/obj/2x2.dmi b/icons/obj/fluff/2x2.dmi similarity index 100% rename from icons/obj/2x2.dmi rename to icons/obj/fluff/2x2.dmi diff --git a/icons/obj/3x3.dmi b/icons/obj/fluff/3x3.dmi similarity index 100% rename from icons/obj/3x3.dmi rename to icons/obj/fluff/3x3.dmi diff --git a/icons/obj/toys/basketball_hoop.dmi b/icons/obj/fluff/basketball_hoop.dmi similarity index 100% rename from icons/obj/toys/basketball_hoop.dmi rename to icons/obj/fluff/basketball_hoop.dmi diff --git a/icons/obj/billboard.dmi b/icons/obj/fluff/billboard.dmi similarity index 100% rename from icons/obj/billboard.dmi rename to icons/obj/fluff/billboard.dmi diff --git a/icons/obj/brokentiling.dmi b/icons/obj/fluff/brokentiling.dmi similarity index 100% rename from icons/obj/brokentiling.dmi rename to icons/obj/fluff/brokentiling.dmi diff --git a/icons/obj/bus.dmi b/icons/obj/fluff/bus.dmi similarity index 100% rename from icons/obj/bus.dmi rename to icons/obj/fluff/bus.dmi diff --git a/icons/obj/fluff/containers.dmi b/icons/obj/fluff/containers.dmi new file mode 100644 index 0000000000000..8aed1ffbb9a99 Binary files /dev/null and b/icons/obj/fluff/containers.dmi differ diff --git a/icons/obj/fireplace.dmi b/icons/obj/fluff/fireplace.dmi similarity index 100% rename from icons/obj/fireplace.dmi rename to icons/obj/fluff/fireplace.dmi diff --git a/icons/obj/flags.dmi b/icons/obj/fluff/flags.dmi similarity index 100% rename from icons/obj/flags.dmi rename to icons/obj/fluff/flags.dmi diff --git a/icons/obj/flora/_flora.dmi b/icons/obj/fluff/flora/_flora.dmi similarity index 100% rename from icons/obj/flora/_flora.dmi rename to icons/obj/fluff/flora/_flora.dmi diff --git a/icons/obj/flora/ausflora.dmi b/icons/obj/fluff/flora/ausflora.dmi similarity index 100% rename from icons/obj/flora/ausflora.dmi rename to icons/obj/fluff/flora/ausflora.dmi diff --git a/icons/obj/flora/deadtrees.dmi b/icons/obj/fluff/flora/deadtrees.dmi similarity index 100% rename from icons/obj/flora/deadtrees.dmi rename to icons/obj/fluff/flora/deadtrees.dmi diff --git a/icons/obj/flora/jungleflora.dmi b/icons/obj/fluff/flora/jungleflora.dmi similarity index 100% rename from icons/obj/flora/jungleflora.dmi rename to icons/obj/fluff/flora/jungleflora.dmi diff --git a/icons/obj/flora/jungletrees.dmi b/icons/obj/fluff/flora/jungletrees.dmi similarity index 100% rename from icons/obj/flora/jungletrees.dmi rename to icons/obj/fluff/flora/jungletrees.dmi diff --git a/icons/obj/flora/jungletreesmall.dmi b/icons/obj/fluff/flora/jungletreesmall.dmi similarity index 100% rename from icons/obj/flora/jungletreesmall.dmi rename to icons/obj/fluff/flora/jungletreesmall.dmi diff --git a/icons/obj/flora/largejungleflora.dmi b/icons/obj/fluff/flora/largejungleflora.dmi similarity index 100% rename from icons/obj/flora/largejungleflora.dmi rename to icons/obj/fluff/flora/largejungleflora.dmi diff --git a/icons/obj/flora/pinetrees.dmi b/icons/obj/fluff/flora/pinetrees.dmi similarity index 100% rename from icons/obj/flora/pinetrees.dmi rename to icons/obj/fluff/flora/pinetrees.dmi diff --git a/icons/obj/flora/plants.dmi b/icons/obj/fluff/flora/plants.dmi similarity index 100% rename from icons/obj/flora/plants.dmi rename to icons/obj/fluff/flora/plants.dmi diff --git a/icons/obj/flora/rocks.dmi b/icons/obj/fluff/flora/rocks.dmi similarity index 100% rename from icons/obj/flora/rocks.dmi rename to icons/obj/fluff/flora/rocks.dmi diff --git a/icons/obj/flora/snowflora.dmi b/icons/obj/fluff/flora/snowflora.dmi similarity index 100% rename from icons/obj/flora/snowflora.dmi rename to icons/obj/fluff/flora/snowflora.dmi diff --git a/icons/obj/flora/xenoflora.dmi b/icons/obj/fluff/flora/xenoflora.dmi similarity index 100% rename from icons/obj/flora/xenoflora.dmi rename to icons/obj/fluff/flora/xenoflora.dmi diff --git a/icons/obj/fluff/general.dmi b/icons/obj/fluff/general.dmi new file mode 100644 index 0000000000000..3f990111c3c74 Binary files /dev/null and b/icons/obj/fluff/general.dmi differ diff --git a/icons/obj/gym_equipment.dmi b/icons/obj/fluff/gym_equipment.dmi similarity index 100% rename from icons/obj/gym_equipment.dmi rename to icons/obj/fluff/gym_equipment.dmi diff --git a/icons/obj/previews.dmi b/icons/obj/fluff/previews.dmi similarity index 100% rename from icons/obj/previews.dmi rename to icons/obj/fluff/previews.dmi diff --git a/icons/obj/puzzle.dmi b/icons/obj/fluff/puzzle.dmi similarity index 100% rename from icons/obj/puzzle.dmi rename to icons/obj/fluff/puzzle.dmi diff --git a/icons/obj/puzzle_small.dmi b/icons/obj/fluff/puzzle_small.dmi similarity index 100% rename from icons/obj/puzzle_small.dmi rename to icons/obj/fluff/puzzle_small.dmi diff --git a/icons/obj/tomb.dmi b/icons/obj/fluff/tomb.dmi similarity index 100% rename from icons/obj/tomb.dmi rename to icons/obj/fluff/tomb.dmi diff --git a/icons/obj/tram_rails.dmi b/icons/obj/fluff/tram_rails.dmi similarity index 100% rename from icons/obj/tram_rails.dmi rename to icons/obj/fluff/tram_rails.dmi diff --git a/icons/obj/food/burgerbread.dmi b/icons/obj/food/burgerbread.dmi index a49423ba87cf4..9faca25854e2d 100644 Binary files a/icons/obj/food/burgerbread.dmi and b/icons/obj/food/burgerbread.dmi differ diff --git a/icons/obj/food/canned.dmi b/icons/obj/food/canned.dmi index 5f61b7e179675..97f66f2d5b5ef 100644 Binary files a/icons/obj/food/canned.dmi and b/icons/obj/food/canned.dmi differ diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi index 6d7792c92540d..d7e3d73f861ca 100644 Binary files a/icons/obj/food/containers.dmi and b/icons/obj/food/containers.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index 338e9b08f634e..97ded07df214b 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/food/food_ingredients.dmi b/icons/obj/food/food_ingredients.dmi index 30825da024314..e0799ed71088c 100644 Binary files a/icons/obj/food/food_ingredients.dmi and b/icons/obj/food/food_ingredients.dmi differ diff --git a/icons/obj/food/frozen_treats.dmi b/icons/obj/food/frozen_treats.dmi index 133d6de83a03b..b5b91520e8ca6 100644 Binary files a/icons/obj/food/frozen_treats.dmi and b/icons/obj/food/frozen_treats.dmi differ diff --git a/icons/obj/food/martian.dmi b/icons/obj/food/martian.dmi new file mode 100644 index 0000000000000..79efcd1813d58 Binary files /dev/null and b/icons/obj/food/martian.dmi differ diff --git a/icons/obj/food/meat.dmi b/icons/obj/food/meat.dmi index 35f72bc1501e7..dec295bcbf0b0 100644 Binary files a/icons/obj/food/meat.dmi and b/icons/obj/food/meat.dmi differ diff --git a/icons/obj/food/mexican.dmi b/icons/obj/food/mexican.dmi index 44bcc5f2e7ba9..ba02c15a0b577 100644 Binary files a/icons/obj/food/mexican.dmi and b/icons/obj/food/mexican.dmi differ diff --git a/icons/obj/food/piecake.dmi b/icons/obj/food/piecake.dmi index ff031abecaea1..9a122e00ef7df 100644 Binary files a/icons/obj/food/piecake.dmi and b/icons/obj/food/piecake.dmi differ diff --git a/icons/obj/food/spaghetti.dmi b/icons/obj/food/spaghetti.dmi index 23b50af2a8d42..1c97a45e7b788 100644 Binary files a/icons/obj/food/spaghetti.dmi and b/icons/obj/food/spaghetti.dmi differ diff --git a/icons/obj/hydroponics/equipment.dmi b/icons/obj/hydroponics/equipment.dmi deleted file mode 100644 index dc164c5b1c943..0000000000000 Binary files a/icons/obj/hydroponics/equipment.dmi and /dev/null differ diff --git a/icons/obj/hydroponics/growing_flowers.dmi b/icons/obj/hydroponics/growing_flowers.dmi deleted file mode 100644 index 1bdbe6786a439..0000000000000 Binary files a/icons/obj/hydroponics/growing_flowers.dmi and /dev/null differ diff --git a/icons/obj/hydroponics/growing_fruits.dmi b/icons/obj/hydroponics/growing_fruits.dmi deleted file mode 100644 index 7e535cdaf9b31..0000000000000 Binary files a/icons/obj/hydroponics/growing_fruits.dmi and /dev/null differ diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi deleted file mode 100644 index d6e70af1a4280..0000000000000 Binary files a/icons/obj/hydroponics/seeds.dmi and /dev/null differ diff --git a/icons/obj/ice_moon/artifacts.dmi b/icons/obj/ice_moon/artifacts.dmi deleted file mode 100644 index 7cd61baa87848..0000000000000 Binary files a/icons/obj/ice_moon/artifacts.dmi and /dev/null differ diff --git a/icons/obj/items_cyborg.dmi b/icons/obj/items_cyborg.dmi index 56250b3961fe4..aefea9fddceb7 100644 Binary files a/icons/obj/items_cyborg.dmi and b/icons/obj/items_cyborg.dmi differ diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi deleted file mode 100644 index 6e007dc4fa593..0000000000000 Binary files a/icons/obj/janitor.dmi and /dev/null differ diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi deleted file mode 100644 index 0b1aced2ef7ac..0000000000000 Binary files a/icons/obj/kitchen.dmi and /dev/null differ diff --git a/icons/obj/lavaland/artefacts.dmi b/icons/obj/lavaland/artefacts.dmi deleted file mode 100644 index cdf3301378542..0000000000000 Binary files a/icons/obj/lavaland/artefacts.dmi and /dev/null differ diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi deleted file mode 100644 index 31c97cfaf9a25..0000000000000 Binary files a/icons/obj/library.dmi and /dev/null differ diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index 7636db33a9d2b..061099defd4cd 100644 Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ diff --git a/icons/obj/lighting_overlay.dmi b/icons/obj/lighting_overlay.dmi index 6701265ee968f..de25dbe170961 100644 Binary files a/icons/obj/lighting_overlay.dmi and b/icons/obj/lighting_overlay.dmi differ diff --git a/icons/obj/atmospherics/components/binary_devices.dmi b/icons/obj/machines/atmospherics/binary_devices.dmi similarity index 100% rename from icons/obj/atmospherics/components/binary_devices.dmi rename to icons/obj/machines/atmospherics/binary_devices.dmi diff --git a/icons/obj/atmospherics/components/bluespace_gas_selling.dmi b/icons/obj/machines/atmospherics/bluespace_gas_selling.dmi similarity index 100% rename from icons/obj/atmospherics/components/bluespace_gas_selling.dmi rename to icons/obj/machines/atmospherics/bluespace_gas_selling.dmi diff --git a/icons/obj/atmospherics/components/hypertorus.dmi b/icons/obj/machines/atmospherics/hypertorus.dmi similarity index 100% rename from icons/obj/atmospherics/components/hypertorus.dmi rename to icons/obj/machines/atmospherics/hypertorus.dmi diff --git a/icons/obj/atmospherics/components/machines.dmi b/icons/obj/machines/atmospherics/machines.dmi similarity index 100% rename from icons/obj/atmospherics/components/machines.dmi rename to icons/obj/machines/atmospherics/machines.dmi diff --git a/icons/obj/atmospherics/components/miners.dmi b/icons/obj/machines/atmospherics/miners.dmi similarity index 100% rename from icons/obj/atmospherics/components/miners.dmi rename to icons/obj/machines/atmospherics/miners.dmi diff --git a/icons/obj/atmospherics/components/thermomachine.dmi b/icons/obj/machines/atmospherics/thermomachine.dmi similarity index 100% rename from icons/obj/atmospherics/components/thermomachine.dmi rename to icons/obj/machines/atmospherics/thermomachine.dmi diff --git a/icons/obj/atmospherics/components/trinary_devices.dmi b/icons/obj/machines/atmospherics/trinary_devices.dmi similarity index 100% rename from icons/obj/atmospherics/components/trinary_devices.dmi rename to icons/obj/machines/atmospherics/trinary_devices.dmi diff --git a/icons/obj/atmospherics/components/unary_devices.dmi b/icons/obj/machines/atmospherics/unary_devices.dmi similarity index 100% rename from icons/obj/atmospherics/components/unary_devices.dmi rename to icons/obj/machines/atmospherics/unary_devices.dmi diff --git a/icons/obj/barsigns.dmi b/icons/obj/machines/barsigns.dmi similarity index 100% rename from icons/obj/barsigns.dmi rename to icons/obj/machines/barsigns.dmi diff --git a/icons/obj/machines/bepis.dmi b/icons/obj/machines/bepis.dmi deleted file mode 100644 index f348c2e1b0559..0000000000000 Binary files a/icons/obj/machines/bepis.dmi and /dev/null differ diff --git a/icons/obj/machines/bitrunning.dmi b/icons/obj/machines/bitrunning.dmi new file mode 100644 index 0000000000000..a910a16b35cf8 Binary files /dev/null and b/icons/obj/machines/bitrunning.dmi differ diff --git a/icons/obj/machines/borg_charger.dmi b/icons/obj/machines/borg_charger.dmi new file mode 100644 index 0000000000000..13751186b3cf9 Binary files /dev/null and b/icons/obj/machines/borg_charger.dmi differ diff --git a/icons/obj/lavaland/cannon.dmi b/icons/obj/machines/cannon.dmi similarity index 100% rename from icons/obj/lavaland/cannon.dmi rename to icons/obj/machines/cannon.dmi diff --git a/icons/obj/machines/cell_charger.dmi b/icons/obj/machines/cell_charger.dmi new file mode 100644 index 0000000000000..5ce285fc81782 Binary files /dev/null and b/icons/obj/machines/cell_charger.dmi differ diff --git a/icons/obj/machines/computer.dmi b/icons/obj/machines/computer.dmi new file mode 100644 index 0000000000000..5ffa3445db692 Binary files /dev/null and b/icons/obj/machines/computer.dmi differ diff --git a/icons/obj/machines/crematorium.dmi b/icons/obj/machines/crematorium.dmi new file mode 100644 index 0000000000000..8ab0a2bafb2c7 Binary files /dev/null and b/icons/obj/machines/crematorium.dmi differ diff --git a/icons/obj/machines/experisci.dmi b/icons/obj/machines/destructive_scanner.dmi similarity index 100% rename from icons/obj/machines/experisci.dmi rename to icons/obj/machines/destructive_scanner.dmi diff --git a/icons/obj/machines/display.dmi b/icons/obj/machines/display.dmi new file mode 100644 index 0000000000000..19efcf5cbc2d3 Binary files /dev/null and b/icons/obj/machines/display.dmi differ diff --git a/icons/obj/machines/droneDispenser.dmi b/icons/obj/machines/drone_dispenser.dmi similarity index 100% rename from icons/obj/machines/droneDispenser.dmi rename to icons/obj/machines/drone_dispenser.dmi diff --git a/icons/obj/engine/energy_ball.dmi b/icons/obj/machines/engine/energy_ball.dmi similarity index 100% rename from icons/obj/engine/energy_ball.dmi rename to icons/obj/machines/engine/energy_ball.dmi diff --git a/icons/obj/machines/engine/other.dmi b/icons/obj/machines/engine/other.dmi new file mode 100644 index 0000000000000..92dd420c84c32 Binary files /dev/null and b/icons/obj/machines/engine/other.dmi differ diff --git a/icons/obj/engine/singularity.dmi b/icons/obj/machines/engine/singularity.dmi similarity index 100% rename from icons/obj/engine/singularity.dmi rename to icons/obj/machines/engine/singularity.dmi diff --git a/icons/obj/engine/supermatter.dmi b/icons/obj/machines/engine/supermatter.dmi similarity index 100% rename from icons/obj/engine/supermatter.dmi rename to icons/obj/machines/engine/supermatter.dmi diff --git a/icons/obj/engine/tesla_coil.dmi b/icons/obj/machines/engine/tesla_coil.dmi similarity index 100% rename from icons/obj/engine/tesla_coil.dmi rename to icons/obj/machines/engine/tesla_coil.dmi diff --git a/icons/obj/engine/tesla_generator.dmi b/icons/obj/machines/engine/tesla_generator.dmi similarity index 100% rename from icons/obj/engine/tesla_generator.dmi rename to icons/obj/machines/engine/tesla_generator.dmi diff --git a/icons/obj/turbine/turbine.dmi b/icons/obj/machines/engine/turbine.dmi similarity index 100% rename from icons/obj/turbine/turbine.dmi rename to icons/obj/machines/engine/turbine.dmi diff --git a/icons/obj/machines/heavy_lathe.dmi b/icons/obj/machines/experimentator.dmi similarity index 100% rename from icons/obj/machines/heavy_lathe.dmi rename to icons/obj/machines/experimentator.dmi diff --git a/icons/obj/fax.dmi b/icons/obj/machines/fax.dmi similarity index 100% rename from icons/obj/fax.dmi rename to icons/obj/machines/fax.dmi diff --git a/icons/obj/machines/floor.dmi b/icons/obj/machines/floor.dmi new file mode 100644 index 0000000000000..6f858465dcdcb Binary files /dev/null and b/icons/obj/machines/floor.dmi differ diff --git a/icons/obj/machines/hivebot_fabricator.dmi b/icons/obj/machines/hivebot_fabricator.dmi new file mode 100644 index 0000000000000..a7947245e38db Binary files /dev/null and b/icons/obj/machines/hivebot_fabricator.dmi differ diff --git a/icons/obj/machines/implantchair.dmi b/icons/obj/machines/implant_chair.dmi similarity index 100% rename from icons/obj/machines/implantchair.dmi rename to icons/obj/machines/implant_chair.dmi diff --git a/icons/obj/machines/incident_display.dmi b/icons/obj/machines/incident_display.dmi new file mode 100644 index 0000000000000..80d63134f1d02 Binary files /dev/null and b/icons/obj/machines/incident_display.dmi differ diff --git a/icons/obj/machines/kitchen.dmi b/icons/obj/machines/kitchen.dmi new file mode 100644 index 0000000000000..5bd820e554ad8 Binary files /dev/null and b/icons/obj/machines/kitchen.dmi differ diff --git a/icons/obj/machines/kitchenmachines.dmi b/icons/obj/machines/kitchenmachines.dmi deleted file mode 100644 index 06c21235ac18d..0000000000000 Binary files a/icons/obj/machines/kitchenmachines.dmi and /dev/null differ diff --git a/icons/obj/machines/lathes.dmi b/icons/obj/machines/lathes.dmi new file mode 100644 index 0000000000000..1c4111303ebc0 Binary files /dev/null and b/icons/obj/machines/lathes.dmi differ diff --git a/icons/obj/machines/limbgrower.dmi b/icons/obj/machines/limbgrower.dmi index 7e26a9f7f2463..d14d31a054c06 100644 Binary files a/icons/obj/machines/limbgrower.dmi and b/icons/obj/machines/limbgrower.dmi differ diff --git a/icons/mecha/mech_bay.dmi b/icons/obj/machines/mech_bay.dmi similarity index 100% rename from icons/mecha/mech_bay.dmi rename to icons/obj/machines/mech_bay.dmi diff --git a/icons/obj/modular_console.dmi b/icons/obj/machines/modular_console.dmi similarity index 100% rename from icons/obj/modular_console.dmi rename to icons/obj/machines/modular_console.dmi diff --git a/icons/obj/money_machine.dmi b/icons/obj/machines/money_machine.dmi similarity index 100% rename from icons/obj/money_machine.dmi rename to icons/obj/machines/money_machine.dmi diff --git a/icons/obj/money_machine_64.dmi b/icons/obj/machines/money_machine_64.dmi similarity index 100% rename from icons/obj/money_machine_64.dmi rename to icons/obj/machines/money_machine_64.dmi diff --git a/icons/obj/machines/music.dmi b/icons/obj/machines/music.dmi new file mode 100644 index 0000000000000..8c8b1a13dc76d Binary files /dev/null and b/icons/obj/machines/music.dmi differ diff --git a/icons/obj/machines/navigation_beacon.dmi b/icons/obj/machines/navigation_beacon.dmi new file mode 100644 index 0000000000000..f20ca068c52d2 Binary files /dev/null and b/icons/obj/machines/navigation_beacon.dmi differ diff --git a/icons/obj/machines/nebula_shielding.dmi b/icons/obj/machines/nebula_shielding.dmi new file mode 100644 index 0000000000000..1da2b5f2a9b2a Binary files /dev/null and b/icons/obj/machines/nebula_shielding.dmi differ diff --git a/icons/obj/machines/ore_silo.dmi b/icons/obj/machines/ore_silo.dmi new file mode 100644 index 0000000000000..e06d0fe2d328b Binary files /dev/null and b/icons/obj/machines/ore_silo.dmi differ diff --git a/icons/obj/machines/pda.dmi b/icons/obj/machines/pda.dmi new file mode 100644 index 0000000000000..a1775d3ddb7d0 Binary files /dev/null and b/icons/obj/machines/pda.dmi differ diff --git a/icons/obj/machines/recycling.dmi b/icons/obj/machines/recycling.dmi new file mode 100644 index 0000000000000..9a6dffaaee2d5 Binary files /dev/null and b/icons/obj/machines/recycling.dmi differ diff --git a/icons/obj/robotics.dmi b/icons/obj/machines/robotics.dmi similarity index 100% rename from icons/obj/robotics.dmi rename to icons/obj/machines/robotics.dmi diff --git a/icons/obj/machines/sec.dmi b/icons/obj/machines/sec.dmi new file mode 100644 index 0000000000000..5eabbf8334e35 Binary files /dev/null and b/icons/obj/machines/sec.dmi differ diff --git a/icons/obj/machines/shield_generator.dmi b/icons/obj/machines/shield_generator.dmi new file mode 100644 index 0000000000000..51ef5676c6b9e Binary files /dev/null and b/icons/obj/machines/shield_generator.dmi differ diff --git a/icons/obj/smartfridge.dmi b/icons/obj/machines/smartfridge.dmi similarity index 100% rename from icons/obj/smartfridge.dmi rename to icons/obj/machines/smartfridge.dmi diff --git a/icons/obj/solar.dmi b/icons/obj/machines/solar.dmi similarity index 100% rename from icons/obj/solar.dmi rename to icons/obj/machines/solar.dmi diff --git a/icons/obj/machines/stasis.dmi b/icons/obj/machines/stasis.dmi index 21844b0f8d50e..3c0cd722714d9 100644 Binary files a/icons/obj/machines/stasis.dmi and b/icons/obj/machines/stasis.dmi differ diff --git a/icons/obj/machines/status_display.dmi b/icons/obj/machines/status_display.dmi new file mode 100644 index 0000000000000..b48cad5293e20 Binary files /dev/null and b/icons/obj/machines/status_display.dmi differ diff --git a/icons/obj/machines/telecomms.dmi b/icons/obj/machines/telecomms.dmi index ddce8a96a933b..1af082171ac16 100644 Binary files a/icons/obj/machines/telecomms.dmi and b/icons/obj/machines/telecomms.dmi differ diff --git a/icons/obj/machines/telepad.dmi b/icons/obj/machines/telepad.dmi new file mode 100644 index 0000000000000..2ae0d4f125923 Binary files /dev/null and b/icons/obj/machines/telepad.dmi differ diff --git a/icons/obj/machines/vending.dmi b/icons/obj/machines/vending.dmi new file mode 100644 index 0000000000000..a5db6caa6e2ba Binary files /dev/null and b/icons/obj/machines/vending.dmi differ diff --git a/icons/obj/machines/wallmounts.dmi b/icons/obj/machines/wallmounts.dmi new file mode 100644 index 0000000000000..39e4cc2476b58 Binary files /dev/null and b/icons/obj/machines/wallmounts.dmi differ diff --git a/icons/obj/wiremod_fab.dmi b/icons/obj/machines/wiremod_fab.dmi similarity index 100% rename from icons/obj/wiremod_fab.dmi rename to icons/obj/machines/wiremod_fab.dmi diff --git a/icons/obj/magic.dmi b/icons/obj/magic.dmi deleted file mode 100644 index c376dc732196c..0000000000000 Binary files a/icons/obj/magic.dmi and /dev/null differ diff --git a/icons/obj/maintenance_loot.dmi b/icons/obj/maintenance_loot.dmi index 09b0892b85917..c75cb583c1945 100644 Binary files a/icons/obj/maintenance_loot.dmi and b/icons/obj/maintenance_loot.dmi differ diff --git a/icons/obj/marker.dmi b/icons/obj/marker.dmi deleted file mode 100644 index f6043c02a3ec9..0000000000000 Binary files a/icons/obj/marker.dmi and /dev/null differ diff --git a/icons/obj/bodybag.dmi b/icons/obj/medical/bodybag.dmi similarity index 100% rename from icons/obj/bodybag.dmi rename to icons/obj/medical/bodybag.dmi diff --git a/icons/obj/medical/chemical.dmi b/icons/obj/medical/chemical.dmi index aaedc090f2d66..b4b26e4f848c6 100644 Binary files a/icons/obj/medical/chemical.dmi and b/icons/obj/medical/chemical.dmi differ diff --git a/icons/obj/drugs.dmi b/icons/obj/medical/drugs.dmi similarity index 100% rename from icons/obj/drugs.dmi rename to icons/obj/medical/drugs.dmi diff --git a/icons/obj/medical/medical_bed.dmi b/icons/obj/medical/medical_bed.dmi new file mode 100644 index 0000000000000..2d8e4b576ed77 Binary files /dev/null and b/icons/obj/medical/medical_bed.dmi differ diff --git a/icons/obj/medical/organs/infuser_organs.dmi b/icons/obj/medical/organs/infuser_organs.dmi index 49ac2751aae2d..c2551b41f6668 100644 Binary files a/icons/obj/medical/organs/infuser_organs.dmi and b/icons/obj/medical/organs/infuser_organs.dmi differ diff --git a/icons/obj/medical/organs/mining_organs.dmi b/icons/obj/medical/organs/mining_organs.dmi index f3fc298284ba6..172f94001ffaf 100644 Binary files a/icons/obj/medical/organs/mining_organs.dmi and b/icons/obj/medical/organs/mining_organs.dmi differ diff --git a/icons/obj/medical/organs/organs.dmi b/icons/obj/medical/organs/organs.dmi index acab1e2484000..94ba46568c929 100644 Binary files a/icons/obj/medical/organs/organs.dmi and b/icons/obj/medical/organs/organs.dmi differ diff --git a/icons/obj/medical/reagent_fillings.dmi b/icons/obj/medical/reagent_fillings.dmi new file mode 100644 index 0000000000000..524b52419a697 Binary files /dev/null and b/icons/obj/medical/reagent_fillings.dmi differ diff --git a/icons/obj/medical/rollerbed.dmi b/icons/obj/medical/rollerbed.dmi deleted file mode 100644 index fcc4e833c3447..0000000000000 Binary files a/icons/obj/medical/rollerbed.dmi and /dev/null differ diff --git a/icons/obj/medical/stack_medical.dmi b/icons/obj/medical/stack_medical.dmi index d12949da595f1..c4ec905786c69 100644 Binary files a/icons/obj/medical/stack_medical.dmi and b/icons/obj/medical/stack_medical.dmi differ diff --git a/icons/obj/medical/surgery_table.dmi b/icons/obj/medical/surgery_table.dmi index 2db30fee06d78..b02801e084474 100644 Binary files a/icons/obj/medical/surgery_table.dmi and b/icons/obj/medical/surgery_table.dmi differ diff --git a/icons/obj/medical/surgery_tools.dmi b/icons/obj/medical/surgery_tools.dmi index 594f0a8d43fcb..baa24ca1ad721 100644 Binary files a/icons/obj/medical/surgery_tools.dmi and b/icons/obj/medical/surgery_tools.dmi differ diff --git a/icons/obj/medicart.dmi b/icons/obj/medicart.dmi new file mode 100644 index 0000000000000..c25ea0039dc4e Binary files /dev/null and b/icons/obj/medicart.dmi differ diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi index 668bf4ae8c680..54b19553b8402 100644 Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ diff --git a/icons/obj/mining_zones/artefacts.dmi b/icons/obj/mining_zones/artefacts.dmi new file mode 100644 index 0000000000000..f3f7d00e4eef8 Binary files /dev/null and b/icons/obj/mining_zones/artefacts.dmi differ diff --git a/icons/obj/lavaland/ash_flora.dmi b/icons/obj/mining_zones/ash_flora.dmi similarity index 100% rename from icons/obj/lavaland/ash_flora.dmi rename to icons/obj/mining_zones/ash_flora.dmi diff --git a/icons/obj/lavaland/dead_ratvar.dmi b/icons/obj/mining_zones/dead_ratvar.dmi similarity index 100% rename from icons/obj/lavaland/dead_ratvar.dmi rename to icons/obj/mining_zones/dead_ratvar.dmi diff --git a/icons/obj/lavaland/donkvendor.dmi b/icons/obj/mining_zones/donkvendor.dmi similarity index 100% rename from icons/obj/lavaland/donkvendor.dmi rename to icons/obj/mining_zones/donkvendor.dmi diff --git a/icons/obj/lavaland/dragonboat.dmi b/icons/obj/mining_zones/dragonboat.dmi similarity index 100% rename from icons/obj/lavaland/dragonboat.dmi rename to icons/obj/mining_zones/dragonboat.dmi diff --git a/icons/obj/lavaland/elite_trophies.dmi b/icons/obj/mining_zones/elite_trophies.dmi similarity index 100% rename from icons/obj/lavaland/elite_trophies.dmi rename to icons/obj/mining_zones/elite_trophies.dmi diff --git a/icons/obj/lavaland/legionnaire_bonfire.dmi b/icons/obj/mining_zones/legionnaire_bonfire.dmi similarity index 100% rename from icons/obj/lavaland/legionnaire_bonfire.dmi rename to icons/obj/mining_zones/legionnaire_bonfire.dmi diff --git a/icons/obj/lavaland/pod_computer.dmi b/icons/obj/mining_zones/pod_computer.dmi similarity index 100% rename from icons/obj/lavaland/pod_computer.dmi rename to icons/obj/mining_zones/pod_computer.dmi diff --git a/icons/obj/lavaland/spawners.dmi b/icons/obj/mining_zones/spawners.dmi similarity index 100% rename from icons/obj/lavaland/spawners.dmi rename to icons/obj/mining_zones/spawners.dmi diff --git a/icons/obj/lavaland/survival_pod.dmi b/icons/obj/mining_zones/survival_pod.dmi similarity index 100% rename from icons/obj/lavaland/survival_pod.dmi rename to icons/obj/mining_zones/survival_pod.dmi diff --git a/icons/obj/lavaland/terrain.dmi b/icons/obj/mining_zones/terrain.dmi similarity index 100% rename from icons/obj/lavaland/terrain.dmi rename to icons/obj/mining_zones/terrain.dmi diff --git a/icons/obj/lavaland/tumor.dmi b/icons/obj/mining_zones/tumor.dmi similarity index 100% rename from icons/obj/lavaland/tumor.dmi rename to icons/obj/mining_zones/tumor.dmi diff --git a/icons/obj/miningradio.dmi b/icons/obj/miningradio.dmi new file mode 100644 index 0000000000000..e3d10f3b6d62e Binary files /dev/null and b/icons/obj/miningradio.dmi differ diff --git a/icons/obj/monitors.dmi b/icons/obj/monitors.dmi deleted file mode 100644 index e1cd286f90c74..0000000000000 Binary files a/icons/obj/monitors.dmi and /dev/null differ diff --git a/icons/obj/nuke_tools.dmi b/icons/obj/nuke_tools.dmi deleted file mode 100644 index e98b2b7995205..0000000000000 Binary files a/icons/obj/nuke_tools.dmi and /dev/null differ diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi deleted file mode 100644 index c94be473538b6..0000000000000 Binary files a/icons/obj/objects.dmi and /dev/null differ diff --git a/icons/obj/ore.dmi b/icons/obj/ore.dmi index 41f794eeace79..23fcb8c89ead3 100644 Binary files a/icons/obj/ore.dmi and b/icons/obj/ore.dmi differ diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi index a26fb0f7d58b7..89febbe2e6b0e 100644 Binary files a/icons/obj/pda.dmi and b/icons/obj/pda.dmi differ diff --git a/icons/obj/pillow.dmi b/icons/obj/pillow.dmi deleted file mode 100644 index b086d56b125e3..0000000000000 Binary files a/icons/obj/pillow.dmi and /dev/null differ diff --git a/icons/obj/atmospherics/atmos.dmi b/icons/obj/pipes_n_cables/atmos.dmi similarity index 100% rename from icons/obj/atmospherics/atmos.dmi rename to icons/obj/pipes_n_cables/atmos.dmi diff --git a/icons/obj/atmospherics/pipes/bridge_pipe.dmi b/icons/obj/pipes_n_cables/bridge_pipe.dmi similarity index 100% rename from icons/obj/atmospherics/pipes/bridge_pipe.dmi rename to icons/obj/pipes_n_cables/bridge_pipe.dmi diff --git a/icons/obj/atmospherics/canisters.dmi b/icons/obj/pipes_n_cables/canisters.dmi similarity index 100% rename from icons/obj/atmospherics/canisters.dmi rename to icons/obj/pipes_n_cables/canisters.dmi diff --git a/icons/obj/atmospherics/pipes/color_adapter.dmi b/icons/obj/pipes_n_cables/color_adapter.dmi similarity index 100% rename from icons/obj/atmospherics/pipes/color_adapter.dmi rename to icons/obj/pipes_n_cables/color_adapter.dmi diff --git a/icons/obj/pipes_n_cables/disposal.dmi b/icons/obj/pipes_n_cables/disposal.dmi new file mode 100644 index 0000000000000..8487f3dd58c8c Binary files /dev/null and b/icons/obj/pipes_n_cables/disposal.dmi differ diff --git a/icons/obj/atmospherics/pipes/he-junction.dmi b/icons/obj/pipes_n_cables/he-junction.dmi similarity index 100% rename from icons/obj/atmospherics/pipes/he-junction.dmi rename to icons/obj/pipes_n_cables/he-junction.dmi diff --git a/icons/obj/atmospherics/pipes/he-manifold.dmi b/icons/obj/pipes_n_cables/he-manifold.dmi similarity index 100% rename from icons/obj/atmospherics/pipes/he-manifold.dmi rename to icons/obj/pipes_n_cables/he-manifold.dmi diff --git a/icons/obj/atmospherics/pipes/he-simple.dmi b/icons/obj/pipes_n_cables/he-simple.dmi similarity index 100% rename from icons/obj/atmospherics/pipes/he-simple.dmi rename to icons/obj/pipes_n_cables/he-simple.dmi diff --git a/icons/obj/plumbing/connects.dmi b/icons/obj/pipes_n_cables/hydrochem/connects.dmi similarity index 100% rename from icons/obj/plumbing/connects.dmi rename to icons/obj/pipes_n_cables/hydrochem/connects.dmi diff --git a/icons/obj/plumbing/fluid_ducts.dmi b/icons/obj/pipes_n_cables/hydrochem/fluid_ducts.dmi similarity index 100% rename from icons/obj/plumbing/fluid_ducts.dmi rename to icons/obj/pipes_n_cables/hydrochem/fluid_ducts.dmi diff --git a/icons/obj/pipes_n_cables/hydrochem/plumbers.dmi b/icons/obj/pipes_n_cables/hydrochem/plumbers.dmi new file mode 100644 index 0000000000000..19775b6eff8a2 Binary files /dev/null and b/icons/obj/pipes_n_cables/hydrochem/plumbers.dmi differ diff --git a/icons/obj/power_cond/layer_cable.dmi b/icons/obj/pipes_n_cables/layer_cable.dmi similarity index 100% rename from icons/obj/power_cond/layer_cable.dmi rename to icons/obj/pipes_n_cables/layer_cable.dmi diff --git a/icons/obj/atmospherics/pipes/layer_manifold_underlays.dmi b/icons/obj/pipes_n_cables/layer_manifold_underlays.dmi similarity index 100% rename from icons/obj/atmospherics/pipes/layer_manifold_underlays.dmi rename to icons/obj/pipes_n_cables/layer_manifold_underlays.dmi diff --git a/icons/obj/atmospherics/pipes/manifold.dmi b/icons/obj/pipes_n_cables/manifold.dmi similarity index 100% rename from icons/obj/atmospherics/pipes/manifold.dmi rename to icons/obj/pipes_n_cables/manifold.dmi diff --git a/icons/obj/atmospherics/pipes/meter.dmi b/icons/obj/pipes_n_cables/meter.dmi similarity index 100% rename from icons/obj/atmospherics/pipes/meter.dmi rename to icons/obj/pipes_n_cables/meter.dmi diff --git a/icons/obj/atmospherics/pipes/multiz.dmi b/icons/obj/pipes_n_cables/multiz.dmi similarity index 100% rename from icons/obj/atmospherics/pipes/multiz.dmi rename to icons/obj/pipes_n_cables/multiz.dmi diff --git a/icons/obj/power_cond/pipe_cleaner.dmi b/icons/obj/pipes_n_cables/pipe_cleaner.dmi similarity index 100% rename from icons/obj/power_cond/pipe_cleaner.dmi rename to icons/obj/pipes_n_cables/pipe_cleaner.dmi diff --git a/icons/obj/atmospherics/pipes/pipe_item.dmi b/icons/obj/pipes_n_cables/pipe_item.dmi similarity index 100% rename from icons/obj/atmospherics/pipes/pipe_item.dmi rename to icons/obj/pipes_n_cables/pipe_item.dmi diff --git a/icons/obj/atmospherics/pipes/pipe_underlays.dmi b/icons/obj/pipes_n_cables/pipe_underlays.dmi similarity index 100% rename from icons/obj/atmospherics/pipes/pipe_underlays.dmi rename to icons/obj/pipes_n_cables/pipe_underlays.dmi diff --git a/icons/obj/atmospherics/pipes/pipes_bitmask.dmi b/icons/obj/pipes_n_cables/pipes_bitmask.dmi similarity index 100% rename from icons/obj/atmospherics/pipes/pipes_bitmask.dmi rename to icons/obj/pipes_n_cables/pipes_bitmask.dmi diff --git a/icons/obj/atmospherics/prototype_canister.dmi b/icons/obj/pipes_n_cables/prototype_canister.dmi similarity index 100% rename from icons/obj/atmospherics/prototype_canister.dmi rename to icons/obj/pipes_n_cables/prototype_canister.dmi diff --git a/icons/obj/atmospherics/pipes/simple.dmi b/icons/obj/pipes_n_cables/simple.dmi similarity index 100% rename from icons/obj/atmospherics/pipes/simple.dmi rename to icons/obj/pipes_n_cables/simple.dmi diff --git a/icons/obj/atmospherics/stationary_canisters.dmi b/icons/obj/pipes_n_cables/stationary_canisters.dmi similarity index 100% rename from icons/obj/atmospherics/stationary_canisters.dmi rename to icons/obj/pipes_n_cables/stationary_canisters.dmi diff --git a/icons/obj/pipes_n_cables/structures.dmi b/icons/obj/pipes_n_cables/structures.dmi new file mode 100644 index 0000000000000..3719d42b5ea8e Binary files /dev/null and b/icons/obj/pipes_n_cables/structures.dmi differ diff --git a/icons/obj/pipes_n_cables/transit_tube.dmi b/icons/obj/pipes_n_cables/transit_tube.dmi new file mode 100644 index 0000000000000..30a23beed166c Binary files /dev/null and b/icons/obj/pipes_n_cables/transit_tube.dmi differ diff --git a/icons/obj/plumbing/plumbers.dmi b/icons/obj/plumbing/plumbers.dmi deleted file mode 100644 index 0df78d6129490..0000000000000 Binary files a/icons/obj/plumbing/plumbers.dmi and /dev/null differ diff --git a/icons/obj/poster.dmi b/icons/obj/poster.dmi index 788c61152d082..c1120d0be0b7e 100644 Binary files a/icons/obj/poster.dmi and b/icons/obj/poster.dmi differ diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi deleted file mode 100644 index 1ea85d66f95fb..0000000000000 Binary files a/icons/obj/power.dmi and /dev/null differ diff --git a/icons/obj/radio.dmi b/icons/obj/radio.dmi index 7794b8ca5c84d..e30e7d49f6f29 100644 Binary files a/icons/obj/radio.dmi and b/icons/obj/radio.dmi differ diff --git a/icons/obj/railings.dmi b/icons/obj/railings.dmi index 91843aa0e6b48..3dbbd7c8318e7 100644 Binary files a/icons/obj/railings.dmi and b/icons/obj/railings.dmi differ diff --git a/icons/obj/reagentfillings.dmi b/icons/obj/reagentfillings.dmi deleted file mode 100644 index b00c622c315f0..0000000000000 Binary files a/icons/obj/reagentfillings.dmi and /dev/null differ diff --git a/icons/obj/recycling.dmi b/icons/obj/recycling.dmi deleted file mode 100644 index de419374151e6..0000000000000 Binary files a/icons/obj/recycling.dmi and /dev/null differ diff --git a/icons/obj/restraints.dmi b/icons/obj/restraints.dmi index f2d8c7a8320a3..f2d2f305d6854 100644 Binary files a/icons/obj/restraints.dmi and b/icons/obj/restraints.dmi differ diff --git a/icons/obj/chromosomes.dmi b/icons/obj/science/chromosomes.dmi similarity index 100% rename from icons/obj/chromosomes.dmi rename to icons/obj/science/chromosomes.dmi diff --git a/icons/obj/wiremod.dmi b/icons/obj/science/circuits.dmi similarity index 100% rename from icons/obj/wiremod.dmi rename to icons/obj/science/circuits.dmi diff --git a/icons/obj/science/slimecrossing.dmi b/icons/obj/science/slimecrossing.dmi new file mode 100644 index 0000000000000..5edb59c58a4a4 Binary files /dev/null and b/icons/obj/science/slimecrossing.dmi differ diff --git a/icons/obj/xenobiology/vatgrowing.dmi b/icons/obj/science/vatgrowing.dmi similarity index 100% rename from icons/obj/xenobiology/vatgrowing.dmi rename to icons/obj/science/vatgrowing.dmi diff --git a/icons/obj/scrolls.dmi b/icons/obj/scrolls.dmi new file mode 100644 index 0000000000000..ae488cab2f766 Binary files /dev/null and b/icons/obj/scrolls.dmi differ diff --git a/icons/obj/service/bureaucracy.dmi b/icons/obj/service/bureaucracy.dmi new file mode 100644 index 0000000000000..8cccb7f591032 Binary files /dev/null and b/icons/obj/service/bureaucracy.dmi differ diff --git a/icons/obj/hand_of_god_structures.dmi b/icons/obj/service/hand_of_god_structures.dmi similarity index 100% rename from icons/obj/hand_of_god_structures.dmi rename to icons/obj/service/hand_of_god_structures.dmi diff --git a/icons/obj/hydroponics/bouquet.dmi b/icons/obj/service/hydroponics/bouquet.dmi similarity index 100% rename from icons/obj/hydroponics/bouquet.dmi rename to icons/obj/service/hydroponics/bouquet.dmi diff --git a/icons/obj/service/hydroponics/equipment.dmi b/icons/obj/service/hydroponics/equipment.dmi new file mode 100644 index 0000000000000..afcc4de523512 Binary files /dev/null and b/icons/obj/service/hydroponics/equipment.dmi differ diff --git a/icons/obj/hydroponics/growing.dmi b/icons/obj/service/hydroponics/growing.dmi similarity index 100% rename from icons/obj/hydroponics/growing.dmi rename to icons/obj/service/hydroponics/growing.dmi diff --git a/icons/obj/service/hydroponics/growing_flowers.dmi b/icons/obj/service/hydroponics/growing_flowers.dmi new file mode 100644 index 0000000000000..fca3e15f9d90d Binary files /dev/null and b/icons/obj/service/hydroponics/growing_flowers.dmi differ diff --git a/icons/obj/service/hydroponics/growing_fruits.dmi b/icons/obj/service/hydroponics/growing_fruits.dmi new file mode 100644 index 0000000000000..92c52b55dbfce Binary files /dev/null and b/icons/obj/service/hydroponics/growing_fruits.dmi differ diff --git a/icons/obj/hydroponics/growing_mushrooms.dmi b/icons/obj/service/hydroponics/growing_mushrooms.dmi similarity index 100% rename from icons/obj/hydroponics/growing_mushrooms.dmi rename to icons/obj/service/hydroponics/growing_mushrooms.dmi diff --git a/icons/obj/hydroponics/growing_vegetables.dmi b/icons/obj/service/hydroponics/growing_vegetables.dmi similarity index 100% rename from icons/obj/hydroponics/growing_vegetables.dmi rename to icons/obj/service/hydroponics/growing_vegetables.dmi diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/service/hydroponics/harvest.dmi similarity index 92% rename from icons/obj/hydroponics/harvest.dmi rename to icons/obj/service/hydroponics/harvest.dmi index beca0e836c916..28a43776a50a0 100644 Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/service/hydroponics/harvest.dmi differ diff --git a/icons/obj/service/hydroponics/seeds.dmi b/icons/obj/service/hydroponics/seeds.dmi new file mode 100644 index 0000000000000..ffef219193a71 Binary files /dev/null and b/icons/obj/service/hydroponics/seeds.dmi differ diff --git a/icons/obj/janicart_upgrade.dmi b/icons/obj/service/janicart_upgrade.dmi similarity index 100% rename from icons/obj/janicart_upgrade.dmi rename to icons/obj/service/janicart_upgrade.dmi diff --git a/icons/obj/service/janitor.dmi b/icons/obj/service/janitor.dmi new file mode 100644 index 0000000000000..0e814ca454589 Binary files /dev/null and b/icons/obj/service/janitor.dmi differ diff --git a/icons/obj/service/kitchen.dmi b/icons/obj/service/kitchen.dmi new file mode 100644 index 0000000000000..aeafe2591e9bd Binary files /dev/null and b/icons/obj/service/kitchen.dmi differ diff --git a/icons/obj/service/library.dmi b/icons/obj/service/library.dmi new file mode 100644 index 0000000000000..8229c1fc3947e Binary files /dev/null and b/icons/obj/service/library.dmi differ diff --git a/icons/obj/shards.dmi b/icons/obj/shards.dmi deleted file mode 100644 index f4fbe4078d28c..0000000000000 Binary files a/icons/obj/shards.dmi and /dev/null differ diff --git a/icons/obj/signs.dmi b/icons/obj/signs.dmi index bddf5166764c1..20531b0f8ea27 100644 Binary files a/icons/obj/signs.dmi and b/icons/obj/signs.dmi differ diff --git a/icons/obj/soup_pot.dmi b/icons/obj/soup_pot.dmi deleted file mode 100644 index 6a84a0aba09c3..0000000000000 Binary files a/icons/obj/soup_pot.dmi and /dev/null differ diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi index 27e3d27cd91a0..c1fcad67b2b64 100644 Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi deleted file mode 100644 index 0cda9735d9827..0000000000000 Binary files a/icons/obj/stationobjs.dmi and /dev/null differ diff --git a/icons/obj/status_display.dmi b/icons/obj/status_display.dmi deleted file mode 100644 index 6833e9ff244f2..0000000000000 Binary files a/icons/obj/status_display.dmi and /dev/null differ diff --git a/icons/obj/stock_parts.dmi b/icons/obj/stock_parts.dmi deleted file mode 100644 index d5d5475f32384..0000000000000 Binary files a/icons/obj/stock_parts.dmi and /dev/null differ diff --git a/icons/obj/storage/backpack.dmi b/icons/obj/storage/backpack.dmi index 607b799722228..c61d9321611b6 100644 Binary files a/icons/obj/storage/backpack.dmi and b/icons/obj/storage/backpack.dmi differ diff --git a/icons/obj/storage/book.dmi b/icons/obj/storage/book.dmi index aff3dc7ddd387..72cf214bd5b02 100644 Binary files a/icons/obj/storage/book.dmi and b/icons/obj/storage/book.dmi differ diff --git a/icons/obj/storage/box.dmi b/icons/obj/storage/box.dmi index 43c10c2f28633..c06fe4d8112b6 100644 Binary files a/icons/obj/storage/box.dmi and b/icons/obj/storage/box.dmi differ diff --git a/icons/obj/storage/case.dmi b/icons/obj/storage/case.dmi index a3fd549bdfe92..0320ce881f90e 100644 Binary files a/icons/obj/storage/case.dmi and b/icons/obj/storage/case.dmi differ diff --git a/icons/obj/storage/closet.dmi b/icons/obj/storage/closet.dmi index 154e18c6d71ed..8c5285e116718 100644 Binary files a/icons/obj/storage/closet.dmi and b/icons/obj/storage/closet.dmi differ diff --git a/icons/obj/storage/storage.dmi b/icons/obj/storage/storage.dmi index 1aabd198b128d..a55606fa3b33b 100644 Binary files a/icons/obj/storage/storage.dmi and b/icons/obj/storage/storage.dmi differ diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi index a931c282f4dcf..0289c9105be06 100644 Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ diff --git a/icons/obj/telescience.dmi b/icons/obj/telescience.dmi deleted file mode 100644 index 3035ce83d3e0f..0000000000000 Binary files a/icons/obj/telescience.dmi and /dev/null differ diff --git a/icons/obj/terminals.dmi b/icons/obj/terminals.dmi deleted file mode 100644 index 961b688511553..0000000000000 Binary files a/icons/obj/terminals.dmi and /dev/null differ diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi index c670170acc0de..e6679c8c51848 100644 Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ diff --git a/icons/obj/bike.dmi b/icons/obj/toys/bike.dmi similarity index 100% rename from icons/obj/bike.dmi rename to icons/obj/toys/bike.dmi diff --git a/icons/obj/bouncy_castle.dmi b/icons/obj/toys/bouncy_castle.dmi similarity index 100% rename from icons/obj/bouncy_castle.dmi rename to icons/obj/toys/bouncy_castle.dmi diff --git a/icons/obj/car.dmi b/icons/obj/toys/car.dmi similarity index 100% rename from icons/obj/car.dmi rename to icons/obj/toys/car.dmi diff --git a/icons/obj/chess.dmi b/icons/obj/toys/chess.dmi similarity index 100% rename from icons/obj/chess.dmi rename to icons/obj/toys/chess.dmi diff --git a/icons/obj/toys/plushes.dmi b/icons/obj/toys/plushes.dmi index 1ea8d88504ce0..241d45fc33d27 100644 Binary files a/icons/obj/toys/plushes.dmi and b/icons/obj/toys/plushes.dmi differ diff --git a/icons/obj/stickers.dmi b/icons/obj/toys/stickers.dmi similarity index 100% rename from icons/obj/stickers.dmi rename to icons/obj/toys/stickers.dmi diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi deleted file mode 100644 index 0c8eab0e2fb91..0000000000000 Binary files a/icons/obj/vending.dmi and /dev/null differ diff --git a/icons/obj/votebox.dmi b/icons/obj/votebox.dmi deleted file mode 100644 index 7bc1342c836b6..0000000000000 Binary files a/icons/obj/votebox.dmi and /dev/null differ diff --git a/icons/obj/wallframe.dmi b/icons/obj/wallframe.dmi deleted file mode 100644 index 2fec99c42be72..0000000000000 Binary files a/icons/obj/wallframe.dmi and /dev/null differ diff --git a/icons/obj/wallmounts.dmi b/icons/obj/wallmounts.dmi index d9dc9b50e9737..e020a8818e186 100644 Binary files a/icons/obj/wallmounts.dmi and b/icons/obj/wallmounts.dmi differ diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi index 3358d1e3ea5f4..93ab67c804cc8 100644 Binary files a/icons/obj/watercloset.dmi and b/icons/obj/watercloset.dmi differ diff --git a/icons/obj/weapons/guns/bows/arrows.dmi b/icons/obj/weapons/bows/arrows.dmi similarity index 100% rename from icons/obj/weapons/guns/bows/arrows.dmi rename to icons/obj/weapons/bows/arrows.dmi diff --git a/icons/obj/weapons/guns/bows/bows.dmi b/icons/obj/weapons/bows/bows.dmi similarity index 100% rename from icons/obj/weapons/guns/bows/bows.dmi rename to icons/obj/weapons/bows/bows.dmi diff --git a/icons/obj/weapons/guns/bows/quivers.dmi b/icons/obj/weapons/bows/quivers.dmi similarity index 100% rename from icons/obj/weapons/guns/bows/quivers.dmi rename to icons/obj/weapons/bows/quivers.dmi diff --git a/icons/obj/weapons/extinguisher.dmi b/icons/obj/weapons/extinguisher.dmi deleted file mode 100644 index c6954c9defff7..0000000000000 Binary files a/icons/obj/weapons/extinguisher.dmi and /dev/null differ diff --git a/icons/obj/weapons/giant_wrench.dmi b/icons/obj/weapons/giant_wrench.dmi new file mode 100644 index 0000000000000..b9aef713d6a4d Binary files /dev/null and b/icons/obj/weapons/giant_wrench.dmi differ diff --git a/icons/obj/weapons/grenade.dmi b/icons/obj/weapons/grenade.dmi index 1a6a1d26d977e..40ab4d99e05fc 100644 Binary files a/icons/obj/weapons/grenade.dmi and b/icons/obj/weapons/grenade.dmi differ diff --git a/icons/obj/weapons/guns/ammo.dmi b/icons/obj/weapons/guns/ammo.dmi index 5dd3d83b20600..a36b593706f76 100644 Binary files a/icons/obj/weapons/guns/ammo.dmi and b/icons/obj/weapons/guns/ammo.dmi differ diff --git a/icons/obj/weapons/guns/ballistic.dmi b/icons/obj/weapons/guns/ballistic.dmi index 620d9f3d281f3..9dd25af2a9219 100644 Binary files a/icons/obj/weapons/guns/ballistic.dmi and b/icons/obj/weapons/guns/ballistic.dmi differ diff --git a/icons/obj/weapons/guns/energy.dmi b/icons/obj/weapons/guns/energy.dmi index 3ec60e3f5e101..e45c5ee4869ed 100644 Binary files a/icons/obj/weapons/guns/energy.dmi and b/icons/obj/weapons/guns/energy.dmi differ diff --git a/icons/obj/weapons/guns/magic.dmi b/icons/obj/weapons/guns/magic.dmi index 3a97682ef6612..7cab0cdfc2592 100644 Binary files a/icons/obj/weapons/guns/magic.dmi and b/icons/obj/weapons/guns/magic.dmi differ diff --git a/icons/obj/weapons/guns/mosinnagant.dmi b/icons/obj/weapons/guns/mosinnagant.dmi deleted file mode 100644 index 87fff58e6ca0c..0000000000000 Binary files a/icons/obj/weapons/guns/mosinnagant.dmi and /dev/null differ diff --git a/icons/obj/weapons/guns/projectiles.dmi b/icons/obj/weapons/guns/projectiles.dmi index 4ffb43a3e794f..3c2d3ff452cd0 100644 Binary files a/icons/obj/weapons/guns/projectiles.dmi and b/icons/obj/weapons/guns/projectiles.dmi differ diff --git a/icons/obj/weapons/guns/toy.dmi b/icons/obj/weapons/guns/toy.dmi index b59dfca674054..83a85e7e447c7 100644 Binary files a/icons/obj/weapons/guns/toy.dmi and b/icons/obj/weapons/guns/toy.dmi differ diff --git a/icons/obj/weapons/guns/wide_guns.dmi b/icons/obj/weapons/guns/wide_guns.dmi index 0894128677e68..1f51a0a91d8f5 100644 Binary files a/icons/obj/weapons/guns/wide_guns.dmi and b/icons/obj/weapons/guns/wide_guns.dmi differ diff --git a/icons/obj/weapons/hammer.dmi b/icons/obj/weapons/hammer.dmi index 3e06d9d7defec..c210f8b436b3a 100644 Binary files a/icons/obj/weapons/hammer.dmi and b/icons/obj/weapons/hammer.dmi differ diff --git a/icons/obj/weapons/improvised.dmi b/icons/obj/weapons/improvised.dmi index b2ef58f7088a7..a98d5cad860da 100644 Binary files a/icons/obj/weapons/improvised.dmi and b/icons/obj/weapons/improvised.dmi differ diff --git a/icons/obj/weapons/khopesh.dmi b/icons/obj/weapons/khopesh.dmi new file mode 100644 index 0000000000000..ab7a0c252cbf7 Binary files /dev/null and b/icons/obj/weapons/khopesh.dmi differ diff --git a/icons/obj/weapons/spear.dmi b/icons/obj/weapons/spear.dmi index 2598615f92a42..917365235ecd4 100644 Binary files a/icons/obj/weapons/spear.dmi and b/icons/obj/weapons/spear.dmi differ diff --git a/icons/obj/weapons/stabby.dmi b/icons/obj/weapons/stabby.dmi new file mode 100644 index 0000000000000..f49bac3272af6 Binary files /dev/null and b/icons/obj/weapons/stabby.dmi differ diff --git a/icons/obj/weapons/staff.dmi b/icons/obj/weapons/staff.dmi index ddd567cc337cd..da97e484df966 100644 Binary files a/icons/obj/weapons/staff.dmi and b/icons/obj/weapons/staff.dmi differ diff --git a/icons/obj/weapons/sword.dmi b/icons/obj/weapons/sword.dmi index 0125b60444573..8e6ee6bdd2fef 100644 Binary files a/icons/obj/weapons/sword.dmi and b/icons/obj/weapons/sword.dmi differ diff --git a/icons/obj/weapons/transforming_energy.dmi b/icons/obj/weapons/transforming_energy.dmi index 6fcedfaef4660..44191656e8941 100644 Binary files a/icons/obj/weapons/transforming_energy.dmi and b/icons/obj/weapons/transforming_energy.dmi differ diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi deleted file mode 100644 index ac99107f3934d..0000000000000 Binary files a/icons/obj/wizard.dmi and /dev/null differ diff --git a/icons/obj/xenobiology/slimecrossing.dmi b/icons/obj/xenobiology/slimecrossing.dmi deleted file mode 100644 index 07bdc442022f9..0000000000000 Binary files a/icons/obj/xenobiology/slimecrossing.dmi and /dev/null differ diff --git a/icons/testing/lighting_debug.dmi b/icons/testing/lighting_debug.dmi new file mode 100644 index 0000000000000..44121b6e91ce7 Binary files /dev/null and b/icons/testing/lighting_debug.dmi differ diff --git a/icons/testing/turf_analysis.dmi b/icons/testing/turf_analysis.dmi index e3aac1ebd05b8..864e6c14643d1 100644 Binary files a/icons/testing/turf_analysis.dmi and b/icons/testing/turf_analysis.dmi differ diff --git a/icons/turf/cliff/cliff.dmi b/icons/turf/cliff/cliff.dmi new file mode 100644 index 0000000000000..af2f855fd8b36 Binary files /dev/null and b/icons/turf/cliff/cliff.dmi differ diff --git a/icons/turf/cliff/icerock_cliff.dmi b/icons/turf/cliff/icerock_cliff.dmi new file mode 100644 index 0000000000000..260a963a1eaea Binary files /dev/null and b/icons/turf/cliff/icerock_cliff.dmi differ diff --git a/icons/materials/composite.dmi b/icons/turf/composite.dmi similarity index 100% rename from icons/materials/composite.dmi rename to icons/turf/composite.dmi diff --git a/icons/turf/debug.dmi b/icons/turf/debug.dmi index be6320809d9a2..debc965d0ecd8 100644 Binary files a/icons/turf/debug.dmi and b/icons/turf/debug.dmi differ diff --git a/icons/turf/decals.dmi b/icons/turf/decals.dmi index c8a228c9a6b7e..5fe3e0368179a 100644 Binary files a/icons/turf/decals.dmi and b/icons/turf/decals.dmi differ diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index 8a1575fcec640..6ddc178b98cdb 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ diff --git a/icons/turf/overlays.dmi b/icons/turf/overlays.dmi index 83309e4d18ebb..c9decbc5a3af3 100644 Binary files a/icons/turf/overlays.dmi and b/icons/turf/overlays.dmi differ diff --git a/icons/turf/smoothrocks.dmi b/icons/turf/smoothrocks.dmi index 0948aaaaa3b8d..9a60937a2195a 100644 Binary files a/icons/turf/smoothrocks.dmi and b/icons/turf/smoothrocks.dmi differ diff --git a/icons/ui_icons/achievements/achievements.dmi b/icons/ui_icons/achievements/achievements.dmi index ba4ee70643167..b3e64c9d09f83 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/fishing/default.png b/icons/ui_icons/fishing/default.png deleted file mode 100644 index f21074ac2dde8..0000000000000 Binary files a/icons/ui_icons/fishing/default.png and /dev/null differ diff --git a/icons/ui_icons/fishing/lavaland.png b/icons/ui_icons/fishing/lavaland.png deleted file mode 100644 index 6c97f66432e94..0000000000000 Binary files a/icons/ui_icons/fishing/lavaland.png and /dev/null differ diff --git a/icons/ui_icons/screentips/cursor_hints.dmi b/icons/ui_icons/screentips/cursor_hints.dmi new file mode 100644 index 0000000000000..2fdbb2d04d50b Binary files /dev/null and b/icons/ui_icons/screentips/cursor_hints.dmi differ diff --git a/interface/fonts.dm b/interface/fonts.dm deleted file mode 100644 index 0bfc9c728c7c1..0000000000000 --- a/interface/fonts.dm +++ /dev/null @@ -1,10 +0,0 @@ -/// A font datum, it exists to define a custom font to use in a span style later. -/datum/font - /// Font name, just so people know what to put in their span style. - var/name - /// The font file we link to. - var/font_family - -/datum/font/vcr_osd_mono - name = "VCR OSD Mono" - font_family = 'interface/VCR_OSD_Mono.ttf' diff --git a/interface/fonts/Grand9K_Pixel.ttf b/interface/fonts/Grand9K_Pixel.ttf new file mode 100644 index 0000000000000..cf6fdf44e2ec7 Binary files /dev/null and b/interface/fonts/Grand9K_Pixel.ttf differ diff --git a/interface/fonts/Pixellari.ttf b/interface/fonts/Pixellari.ttf new file mode 100644 index 0000000000000..5a3a3c2b11048 Binary files /dev/null and b/interface/fonts/Pixellari.ttf differ diff --git a/interface/fonts/SpessFont.ttf b/interface/fonts/SpessFont.ttf new file mode 100644 index 0000000000000..8f7c7e08d0d86 Binary files /dev/null and b/interface/fonts/SpessFont.ttf differ diff --git a/interface/fonts/TinyUnicode.ttf b/interface/fonts/TinyUnicode.ttf new file mode 100644 index 0000000000000..74d0d3e386e61 Binary files /dev/null and b/interface/fonts/TinyUnicode.ttf differ diff --git a/interface/VCR_OSD_Mono.ttf b/interface/fonts/VCR_OSD_Mono.ttf similarity index 100% rename from interface/VCR_OSD_Mono.ttf rename to interface/fonts/VCR_OSD_Mono.ttf diff --git a/interface/fonts/fonts_datum.dm b/interface/fonts/fonts_datum.dm new file mode 100644 index 0000000000000..a346706d7fa0f --- /dev/null +++ b/interface/fonts/fonts_datum.dm @@ -0,0 +1,78 @@ +/// A font datum, it exists to define a custom font to use in a span style later. +/datum/font + /// Font name, just so people know what to put in their span style. + var/name + /// The font file we link to. + var/font_family + + /// Font features and metrics + /// Generated by Lummox's dmifontsplus (https://www.byond.com/developer/LummoxJR/DmiFontsPlus) + /// Note: these variable names have been changed, so you can't straight copy/paste from dmifontsplus.exe + + /// list of font size/spacing metrics + var/list/metrics + /// total height of a line + var/height + /// distance above baseline (including whitespace) + var/ascent + /// distance below baseline + var/descent + /// average character width + var/average_width + /// maximum character width + var/max_width + /// extra width, such as from italics, for a line + var/overhang + /// internal leading vertical space, for accent marks + var/in_leading + /// external leading vertical space, just plain blank + var/ex_leading + /// default character (for undefined chars) + var/default_character + /// first character in metrics + var/start + /// last character in metrics + var/end + +/// Get font metrics +/// From Lummox's dmifontsplus (https://www.byond.com/developer/LummoxJR/DmiFontsPlus) +/datum/font/proc/get_metrics(text, flags, first_line) + . = 0 + var/longest = 0 + if(!length(text)) + return + + var/i = 1 + var/idx + while(i <= length(text)) + var/character = text2ascii(text, i++) + if(character <= 10) + if(character <= 7) + . += character // spacers for justification + + if(character <= 9) + continue // soft-break chars + + if(. && idx && !(flags & INCLUDE_AC)) + . -= max(metrics[idx + 3], 0) + + longest = max(longest, . + first_line) + . = 0 + first_line = 0 + idx = 0 + continue + + idx = (character - start) * 3 + if(idx <= 0 || idx >= metrics.len) + idx = (default_character - start) * 3 + + if(!. && !(flags & INCLUDE_AC)) + . -= metrics[idx + 1] + . += metrics[idx + 1] + metrics[idx + 2] + metrics[idx +3] + + if(. && idx && !(flags & INCLUDE_AC)) + . -= max(metrics[idx + 3], 0) + + . = max(. + first_line, longest) + if(. > 0) + . += overhang diff --git a/interface/fonts/grand_9k.dm b/interface/fonts/grand_9k.dm new file mode 100644 index 0000000000000..7993d307bcbe5 --- /dev/null +++ b/interface/fonts/grand_9k.dm @@ -0,0 +1,253 @@ +/// For clean results on map, use only sizing pt, multiples of 6: 6pt 12pt 18pt 24pt etc. - Not for use with px sizing +/// Can be used in TGUI etc, px sizing is pt / 0.75. 6pt = 8px, 12pt = 16px etc. + +/// Base font +/datum/font/grand9k + name = "Grand9K Pixel" + font_family = 'interface/fonts/Grand9K_Pixel.ttf' + +/// For icon overlays +/// Grand9K 6pt metrics generated using Lummox's dmifontsplus (https://www.byond.com/developer/LummoxJR/DmiFontsPlus) +/// Note: these variable names have been changed, so you can't straight copy/paste from dmifontsplus.exe +/datum/font/grand9k/size_6pt + name = "Grand9K Pixel 6pt" + height = 12 + ascent = 10 + descent = 2 + average_width = 4 + max_width = 9 + overhang = 0 + in_leading = 4 + ex_leading = 1 + default_character = 31 + start = 30 + end = 255 + metrics = list( + 0, 5, 1, // char 30 + 0, 5, 1, // char 31 + 0, 1, 1, // char 32 + 0, 1, 1, // char 33 + 0, 3, 1, // char 34 + 0, 6, 1, // char 35 + 0, 5, 1, // char 36 + 0, 7, 1, // char 37 + 0, 5, 1, // char 38 + 0, 1, 1, // char 39 + 0, 3, 1, // char 40 + 0, 3, 1, // char 41 + 0, 5, 1, // char 42 + 0, 5, 1, // char 43 + 0, 1, 1, // char 44 + 0, 4, 1, // char 45 + 0, 1, 1, // char 46 + 0, 3, 1, // char 47 + 0, 5, 1, // char 48 + 0, 2, 1, // char 49 + 0, 5, 1, // char 50 + 0, 4, 1, // char 51 + 0, 5, 1, // char 52 + 0, 5, 1, // char 53 + 0, 5, 1, // char 54 + 0, 5, 1, // char 55 + 0, 5, 1, // char 56 + 0, 5, 1, // char 57 + 0, 1, 1, // char 58 + 0, 1, 1, // char 59 + 0, 4, 1, // char 60 + 0, 4, 1, // char 61 + 0, 4, 1, // char 62 + 0, 4, 1, // char 63 + 0, 7, 1, // char 64 + 0, 5, 1, // char 65 + 0, 5, 1, // char 66 + 0, 4, 1, // char 67 + 0, 5, 1, // char 68 + 0, 4, 1, // char 69 + 0, 4, 1, // char 70 + 0, 5, 1, // char 71 + 0, 5, 1, // char 72 + 0, 1, 1, // char 73 + 0, 5, 1, // char 74 + 0, 5, 1, // char 75 + 0, 5, 1, // char 76 + 0, 5, 1, // char 77 + 0, 5, 1, // char 78 + 0, 5, 1, // char 79 + 0, 5, 1, // char 80 + 0, 6, 1, // char 81 + 0, 5, 1, // char 82 + 0, 5, 1, // char 83 + 0, 5, 1, // char 84 + 0, 5, 1, // char 85 + 0, 5, 1, // char 86 + 0, 5, 1, // char 87 + 0, 5, 1, // char 88 + 0, 5, 1, // char 89 + 0, 5, 1, // char 90 + 0, 3, 1, // char 91 + 0, 3, 1, // char 92 + 0, 3, 1, // char 93 + 0, 5, 1, // char 94 + 0, 4, 0, // char 95 + 0, 2, 1, // char 96 + 0, 4, 1, // char 97 + 0, 4, 1, // char 98 + 0, 3, 1, // char 99 + 0, 4, 1, // char 100 + 0, 4, 1, // char 101 + 0, 4, 1, // char 102 + 0, 4, 1, // char 103 + 0, 4, 1, // char 104 + 0, 1, 1, // char 105 + 0, 3, 1, // char 106 + 0, 4, 1, // char 107 + 0, 1, 1, // char 108 + 0, 5, 1, // char 109 + 0, 4, 1, // char 110 + 0, 4, 1, // char 111 + 0, 4, 1, // char 112 + 0, 4, 1, // char 113 + 0, 4, 1, // char 114 + 0, 4, 1, // char 115 + 0, 4, 1, // char 116 + 0, 4, 1, // char 117 + 0, 5, 1, // char 118 + 0, 5, 1, // char 119 + 0, 5, 1, // char 120 + 0, 4, 1, // char 121 + 0, 5, 1, // char 122 + 0, 4, 1, // char 123 + 0, 1, 1, // char 124 + 0, 4, 1, // char 125 + 0, 6, 1, // char 126 + 0, 5, 1, // char 127 + 0, 5, 1, // char 128 + 0, 5, 1, // char 129 + 0, 1, 1, // char 130 + 0, 5, 1, // char 131 + 0, 3, 1, // char 132 + 0, 5, 1, // char 133 + 0, 5, 1, // char 134 + 0, 5, 1, // char 135 + 0, 5, 1, // char 136 + 0, 5, 1, // char 137 + 0, 5, 1, // char 138 + 0, 3, 1, // char 139 + 0, 6, 1, // char 140 + 0, 5, 1, // char 141 + 0, 5, 1, // char 142 + 0, 5, 1, // char 143 + 0, 5, 1, // char 144 + 0, 1, 1, // char 145 + 0, 1, 1, // char 146 + 0, 3, 1, // char 147 + 0, 3, 1, // char 148 + 0, 1, 1, // char 149 + 0, 5, 1, // char 150 + 0, 5, 1, // char 151 + 0, 5, 1, // char 152 + 0, 8, 1, // char 153 + 0, 4, 1, // char 154 + 0, 3, 1, // char 155 + 0, 5, 1, // char 156 + 0, 5, 1, // char 157 + 0, 5, 1, // char 158 + 0, 5, 1, // char 159 + 0, 1, 1, // char 160 + 0, 1, 1, // char 161 + 0, 4, 1, // char 162 + 0, 5, 1, // char 163 + 0, 5, 1, // char 164 + 0, 5, 1, // char 165 + 0, 1, 1, // char 166 + 0, 5, 1, // char 167 + 0, 3, 1, // char 168 + 0, 8, 1, // char 169 + 0, 5, 1, // char 170 + 0, 6, 1, // char 171 + 0, 4, 1, // char 172 + 0, 5, 1, // char 173 + 0, 8, 1, // char 174 + 0, 5, 1, // char 175 + 0, 3, 1, // char 176 + 0, 5, 1, // char 177 + 0, 5, 1, // char 178 + 0, 5, 1, // char 179 + 0, 2, 1, // char 180 + 0, 4, 1, // char 181 + 0, 5, 1, // char 182 + 0, 1, 1, // char 183 + 0, 2, 1, // char 184 + 0, 5, 1, // char 185 + 0, 5, 1, // char 186 + 0, 6, 1, // char 187 + 0, 5, 1, // char 188 + 0, 5, 1, // char 189 + 0, 5, 1, // char 190 + 0, 4, 1, // char 191 + 0, 5, 1, // char 192 + 0, 5, 1, // char 193 + 0, 5, 1, // char 194 + 0, 6, 0, // char 195 + 0, 5, 1, // char 196 + 0, 5, 1, // char 197 + 0, 6, 1, // char 198 + 0, 4, 1, // char 199 + 0, 4, 1, // char 200 + 0, 4, 1, // char 201 + 0, 4, 1, // char 202 + 0, 4, 1, // char 203 + 1, 2, 0, // char 204 + 0, 2, 1, // char 205 + 0, 3, 0, // char 206 + 0, 3, 0, // char 207 + 0, 6, 1, // char 208 + 0, 6, 0, // char 209 + 0, 5, 1, // char 210 + 0, 5, 1, // char 211 + 0, 5, 1, // char 212 + 0, 6, 1, // char 213 + 0, 5, 1, // char 214 + 0, 5, 1, // char 215 + 0, 5, 1, // char 216 + 0, 5, 1, // char 217 + 0, 5, 1, // char 218 + 0, 5, 1, // char 219 + 0, 5, 1, // char 220 + 0, 5, 1, // char 221 + 0, 5, 1, // char 222 + 0, 5, 1, // char 223 + 0, 4, 1, // char 224 + 0, 4, 1, // char 225 + 0, 4, 1, // char 226 + 0, 4, 1, // char 227 + 0, 4, 1, // char 228 + 0, 4, 1, // char 229 + 0, 5, 1, // char 230 + 0, 3, 1, // char 231 + 0, 4, 1, // char 232 + 0, 4, 1, // char 233 + 0, 4, 1, // char 234 + 0, 4, 1, // char 235 + 0, 2, 1, // char 236 + 1, 2, 0, // char 237 + 0, 3, 0, // char 238 + 0, 3, 0, // char 239 + 0, 5, 0, // char 240 + 0, 4, 1, // char 241 + 0, 4, 1, // char 242 + 0, 4, 1, // char 243 + 0, 4, 1, // char 244 + 0, 4, 1, // char 245 + 0, 4, 1, // char 246 + 0, 5, 1, // char 247 + 0, 4, 1, // char 248 + 0, 4, 1, // char 249 + 0, 4, 1, // char 250 + 0, 4, 1, // char 251 + 0, 4, 1, // char 252 + 0, 4, 1, // char 253 + 0, 4, 1, // char 254 + 0, 4, 1, // char 255 + 226 + ) diff --git a/interface/fonts/license.txt b/interface/fonts/license.txt new file mode 100644 index 0000000000000..9aa70fbac2a9e --- /dev/null +++ b/interface/fonts/license.txt @@ -0,0 +1,13 @@ +Grand9K Pixel created by Jayvee Enaguas. Licensed under Creative Commons Attribution 4.0 International (CC BY 4.0) +(https://creativecommons.org/licenses/by/4.0/) (https://www.dafont.com/grand9k-pixel.font) + +Pixellari created by Zacchary Dempsey-Plante. Website indicates free for commercial use. +(https://www.dafont.com/pixellari.font?fpp=200) + +Spess Font created by MTandi (discord) for /tg/station. + +Tiny Unicode created by Jakob Riedle/DuffsDevice. Website indicates free for commercial use. +(https://fontmeme.com/fonts/tiny-unicode-font/) + +VCR OSD Mono created by Riciery Leal/mrmanet. Website indicates 100% free, author confirms it's free for all to use. +(https://www.dafont.com/font-comment.php?file=vcr_osd_mono) diff --git a/interface/fonts/pixellari.dm b/interface/fonts/pixellari.dm new file mode 100644 index 0000000000000..24fcd1961fecf --- /dev/null +++ b/interface/fonts/pixellari.dm @@ -0,0 +1,252 @@ +/// For clean results on map, use only sizing pt, multiples of 12: 12pt 24pt 48pt etc. - Not for use with px sizing +/// Can be used in TGUI etc, px sizing is pt / 0.75. 12pt = 16px, 24pt = 32px etc. + +/// Base font +/datum/font/pixellari + name = "Pixellari" + font_family = 'interface/fonts/Pixellari.ttf' + +/// For icon overlays +/// Pixellari 12pt metrics generated using Lummox's dmifontsplus (https://www.byond.com/developer/LummoxJR/DmiFontsPlus) +/// Note: these variable names have been changed, so you can't straight copy/paste from dmifontsplus.exe +/datum/font/pixellari/size_12pt + name = "Pixellari 12pt" + height = 16 + ascent = 12 + descent = 4 + average_width = 7 + max_width = 15 + overhang = 0 + in_leading = 0 + ex_leading = 1 + default_character = 31 + start = 30 + end = 255 + metrics = list(\ + 1, 5, 0, /* char 30 */ \ + 1, 5, 0, /* char 31 */ \ + 0, 1, 4, /* char 32 */ \ + 1, 2, 1, /* char 33 */ \ + 1, 5, 1, /* char 34 */ \ + 0, 8, 1, /* char 35 */ \ + 2, 6, 1, /* char 36 */ \ + 0, 13, 1, /* char 37 */ \ + 1, 8, 1, /* char 38 */ \ + 1, 2, 1, /* char 39 */ \ + 1, 3, 1, /* char 40 */ \ + 2, 3, 1, /* char 41 */ \ + 0, 6, 1, /* char 42 */ \ + 1, 6, 1, /* char 43 */ \ + 1, 2, 1, /* char 44 */ \ + 1, 6, 1, /* char 45 */ \ + 1, 2, 1, /* char 46 */ \ + 0, 6, 1, /* char 47 */ \ + 1, 7, 1, /* char 48 */ \ + 2, 6, 1, /* char 49 */ \ + 1, 6, 1, /* char 50 */ \ + 1, 6, 1, /* char 51 */ \ + 1, 7, 1, /* char 52 */ \ + 1, 6, 1, /* char 53 */ \ + 1, 6, 1, /* char 54 */ \ + 1, 7, 1, /* char 55 */ \ + 1, 6, 1, /* char 56 */ \ + 1, 6, 1, /* char 57 */ \ + 1, 2, 1, /* char 58 */ \ + 1, 2, 1, /* char 59 */ \ + 0, 10, 1, /* char 60 */ \ + 1, 6, 1, /* char 61 */ \ + 0, 10, 1, /* char 62 */ \ + 1, 6, 1, /* char 63 */ \ + 1, 12, 1, /* char 64 */ \ + 1, 8, 1, /* char 65 */ \ + 1, 8, 1, /* char 66 */ \ + 2, 7, 1, /* char 67 */ \ + 2, 8, 1, /* char 68 */ \ + 2, 6, 1, /* char 69 */ \ + 2, 6, 1, /* char 70 */ \ + 2, 7, 1, /* char 71 */ \ + 1, 8, 1, /* char 72 */ \ + 1, 4, 1, /* char 73 */ \ + 0, 7, 1, /* char 74 */ \ + 1, 8, 1, /* char 75 */ \ + 1, 6, 1, /* char 76 */ \ + 1, 10, 1, /* char 77 */ \ + 1, 9, 1, /* char 78 */ \ + 2, 8, 1, /* char 79 */ \ + 1, 7, 1, /* char 80 */ \ + 2, 9, 1, /* char 81 */ \ + 1, 8, 1, /* char 82 */ \ + 1, 8, 1, /* char 83 */ \ + 1, 8, 1, /* char 84 */ \ + 2, 8, 1, /* char 85 */ \ + 2, 8, 1, /* char 86 */ \ + 1, 10, 1, /* char 87 */ \ + 1, 8, 1, /* char 88 */ \ + 1, 8, 1, /* char 89 */ \ + 0, 10, 1, /* char 90 */ \ + 1, 3, 1, /* char 91 */ \ + 0, 6, 1, /* char 92 */ \ + 2, 3, 1, /* char 93 */ \ + 0, 7, 1, /* char 94 */ \ + 0, 8, 1, /* char 95 */ \ + 1, 3, 1, /* char 96 */ \ + 1, 6, 1, /* char 97 */ \ + 1, 7, 1, /* char 98 */ \ + 1, 6, 1, /* char 99 */ \ + 1, 7, 1, /* char 100 */ \ + 1, 6, 1, /* char 101 */ \ + 1, 4, 1, /* char 102 */ \ + 1, 7, 1, /* char 103 */ \ + 1, 7, 1, /* char 104 */ \ + 1, 2, 1, /* char 105 */ \ + -1, 4, 1, /* char 106 */ \ + 0, 7, 1, /* char 107 */ \ + 1, 2, 1, /* char 108 */ \ + 1, 10, 1, /* char 109 */ \ + 1, 6, 1, /* char 110 */ \ + 1, 6, 1, /* char 111 */ \ + 1, 7, 1, /* char 112 */ \ + 1, 7, 1, /* char 113 */ \ + 1, 6, 1, /* char 114 */ \ + 1, 6, 1, /* char 115 */ \ + 0, 4, 1, /* char 116 */ \ + 1, 6, 1, /* char 117 */ \ + 1, 6, 1, /* char 118 */ \ + 1, 10, 1, /* char 119 */ \ + 1, 6, 1, /* char 120 */ \ + 1, 6, 1, /* char 121 */ \ + 1, 6, 1, /* char 122 */ \ + 0, 5, 1, /* char 123 */ \ + 1, 2, 1, /* char 124 */ \ + 0, 5, 1, /* char 125 */ \ + 1, 8, 1, /* char 126 */ \ + 1, 5, 0, /* char 127 */ \ + 1, 8, 1, /* char 128 */ \ + 1, 5, 0, /* char 129 */ \ + 1, 5, 0, /* char 130 */ \ + 1, 5, 0, /* char 131 */ \ + 1, 5, 0, /* char 132 */ \ + 1, 5, 0, /* char 133 */ \ + 1, 5, 0, /* char 134 */ \ + 1, 5, 0, /* char 135 */ \ + 1, 5, 0, /* char 136 */ \ + 1, 5, 0, /* char 137 */ \ + 1, 8, 1, /* char 138 */ \ + 1, 5, 0, /* char 139 */ \ + 0, 14, 1, /* char 140 */ \ + 1, 5, 0, /* char 141 */ \ + 0, 10, 1, /* char 142 */ \ + 1, 5, 0, /* char 143 */ \ + 1, 5, 0, /* char 144 */ \ + 1, 5, 0, /* char 145 */ \ + 1, 5, 0, /* char 146 */ \ + 1, 5, 0, /* char 147 */ \ + 1, 5, 0, /* char 148 */ \ + 1, 5, 0, /* char 149 */ \ + 1, 5, 0, /* char 150 */ \ + 1, 5, 0, /* char 151 */ \ + 1, 5, 0, /* char 152 */ \ + 1, 5, 0, /* char 153 */ \ + 1, 6, 1, /* char 154 */ \ + 1, 5, 0, /* char 155 */ \ + 1, 11, 1, /* char 156 */ \ + 1, 5, 0, /* char 157 */ \ + 1, 6, 1, /* char 158 */ \ + 1, 8, 1, /* char 159 */ \ + 0, 1, 4, /* char 160 */ \ + 1, 2, 1, /* char 161 */ \ + 1, 6, 1, /* char 162 */ \ + 0, 8, 1, /* char 163 */ \ + 0, 9, 1, /* char 164 */ \ + 1, 8, 1, /* char 165 */ \ + 1, 2, 1, /* char 166 */ \ + 1, 7, 1, /* char 167 */ \ + 0, 5, 1, /* char 168 */ \ + -1, 12, 1, /* char 169 */ \ + 0, 6, 1, /* char 170 */ \ + 0, 8, 1, /* char 171 */ \ + 1, 8, 1, /* char 172 */ \ + 1, 5, 0, /* char 173 */ \ + -1, 12, 1, /* char 174 */ \ + 2, 4, 1, /* char 175 */ \ + 0, 6, 1, /* char 176 */ \ + 1, 6, 1, /* char 177 */ \ + 0, 5, 1, /* char 178 */ \ + 0, 5, 1, /* char 179 */ \ + 1, 3, 1, /* char 180 */ \ + 1, 6, 1, /* char 181 */ \ + 1, 7, 1, /* char 182 */ \ + 1, 2, 1, /* char 183 */ \ + 1, 3, 1, /* char 184 */ \ + 1, 4, 1, /* char 185 */ \ + 0, 6, 1, /* char 186 */ \ + 0, 8, 1, /* char 187 */ \ + 1, 13, 1, /* char 188 */ \ + 1, 12, 1, /* char 189 */ \ + 0, 13, 1, /* char 190 */ \ + 1, 6, 1, /* char 191 */ \ + 1, 8, 1, /* char 192 */ \ + 1, 8, 1, /* char 193 */ \ + 1, 8, 1, /* char 194 */ \ + 1, 8, 1, /* char 195 */ \ + 1, 8, 1, /* char 196 */ \ + 1, 8, 1, /* char 197 */ \ + 0, 13, 1, /* char 198 */ \ + 2, 7, 1, /* char 199 */ \ + 2, 6, 1, /* char 200 */ \ + 2, 6, 1, /* char 201 */ \ + 2, 6, 1, /* char 202 */ \ + 2, 6, 1, /* char 203 */ \ + 1, 4, 1, /* char 204 */ \ + 1, 4, 1, /* char 205 */ \ + 1, 4, 1, /* char 206 */ \ + 1, 4, 1, /* char 207 */ \ + 0, 10, 1, /* char 208 */ \ + 1, 9, 1, /* char 209 */ \ + 2, 8, 1, /* char 210 */ \ + 2, 8, 1, /* char 211 */ \ + 2, 8, 1, /* char 212 */ \ + 2, 8, 1, /* char 213 */ \ + 2, 8, 1, /* char 214 */ \ + 1, 6, 1, /* char 215 */ \ + -2, 14, 1, /* char 216 */ \ + 2, 8, 1, /* char 217 */ \ + 2, 8, 1, /* char 218 */ \ + 2, 8, 1, /* char 219 */ \ + 2, 8, 1, /* char 220 */ \ + 1, 8, 1, /* char 221 */ \ + 1, 8, 1, /* char 222 */ \ + 1, 8, 1, /* char 223 */ \ + 1, 6, 1, /* char 224 */ \ + 1, 6, 1, /* char 225 */ \ + 1, 6, 1, /* char 226 */ \ + 1, 6, 1, /* char 227 */ \ + 1, 6, 1, /* char 228 */ \ + 1, 6, 1, /* char 229 */ \ + 1, 11, 1, /* char 230 */ \ + 1, 6, 1, /* char 231 */ \ + 1, 6, 1, /* char 232 */ \ + 1, 6, 1, /* char 233 */ \ + 1, 6, 1, /* char 234 */ \ + 1, 6, 1, /* char 235 */ \ + 1, 2, 1, /* char 236 */ \ + 1, 2, 1, /* char 237 */ \ + 0, 4, 1, /* char 238 */ \ + 0, 4, 1, /* char 239 */ \ + 1, 7, 1, /* char 240 */ \ + 1, 6, 1, /* char 241 */ \ + 1, 6, 1, /* char 242 */ \ + 1, 6, 1, /* char 243 */ \ + 1, 6, 1, /* char 244 */ \ + 1, 6, 1, /* char 245 */ \ + 1, 6, 1, /* char 246 */ \ + 1, 6, 1, /* char 247 */ \ + 0, 10, 1, /* char 248 */ \ + 1, 6, 1, /* char 249 */ \ + 1, 6, 1, /* char 250 */ \ + 1, 6, 1, /* char 251 */ \ + 1, 6, 1, /* char 252 */ \ + 1, 6, 1, /* char 253 */ \ + 1, 8, 1, /* char 254 */ \ + 1, 6, 1, /* char 255 */ \ + 226) diff --git a/interface/fonts/spess_font.dm b/interface/fonts/spess_font.dm new file mode 100644 index 0000000000000..07e8ea5b3ba66 --- /dev/null +++ b/interface/fonts/spess_font.dm @@ -0,0 +1,252 @@ +/// For clean results on map, use only sizing pt, multiples of 6: 6t 12pt 18pt etc. - Not for use with px sizing +/// Can be used in TGUI etc, px sizing is pt / 0.75. 12pt = 16px, 24pt = 32px etc. + +/// Base font +/datum/font/spessfont + name = "Spess Font" + font_family = 'interface/fonts/SpessFont.ttf' + +/// For icon overlays +/// Spess Font 6pt metrics generated using Lummox's dmifontsplus (https://www.byond.com/developer/LummoxJR/DmiFontsPlus) +/// Note: these variable names have been changed, so you can't straight copy/paste from dmifontsplus.exe +/datum/font/spessfont/size_6pt + name = "Spess Font 6pt" + height = 8 + ascent = 6 + descent = 2 + average_width = 4 + max_width = 6 + overhang = 0 + in_leading = 0 + ex_leading = 0 + default_character = 31 + start = 30 + end = 255 + metrics = list(\ + 0, 1, 0, /* char 30 */ \ + 0, 1, 0, /* char 31 */ \ + 0, 1, 1, /* char 32 */ \ + 0, 1, 1, /* char 33 */ \ + 0, 3, 1, /* char 34 */ \ + 0, 5, 1, /* char 35 */ \ + 0, 3, 1, /* char 36 */ \ + 0, 5, 1, /* char 37 */ \ + 0, 5, 1, /* char 38 */ \ + 0, 1, 1, /* char 39 */ \ + 0, 2, 1, /* char 40 */ \ + 0, 2, 1, /* char 41 */ \ + 0, 3, 1, /* char 42 */ \ + 0, 3, 1, /* char 43 */ \ + 0, 1, 1, /* char 44 */ \ + 0, 3, 1, /* char 45 */ \ + 0, 1, 1, /* char 46 */ \ + 0, 3, 1, /* char 47 */ \ + 0, 4, 1, /* char 48 */ \ + 0, 2, 1, /* char 49 */ \ + 0, 4, 1, /* char 50 */ \ + 0, 4, 1, /* char 51 */ \ + 0, 4, 1, /* char 52 */ \ + 0, 4, 1, /* char 53 */ \ + 0, 4, 1, /* char 54 */ \ + 0, 4, 1, /* char 55 */ \ + 0, 4, 1, /* char 56 */ \ + 0, 4, 1, /* char 57 */ \ + 0, 1, 1, /* char 58 */ \ + 0, 1, 1, /* char 59 */ \ + 0, 3, 1, /* char 60 */ \ + 0, 3, 1, /* char 61 */ \ + 0, 3, 1, /* char 62 */ \ + 0, 3, 1, /* char 63 */ \ + 0, 4, 1, /* char 64 */ \ + 0, 4, 1, /* char 65 */ \ + 0, 4, 1, /* char 66 */ \ + 0, 4, 1, /* char 67 */ \ + 0, 4, 1, /* char 68 */ \ + 0, 4, 1, /* char 69 */ \ + 0, 4, 1, /* char 70 */ \ + 0, 4, 1, /* char 71 */ \ + 0, 4, 1, /* char 72 */ \ + 0, 3, 1, /* char 73 */ \ + 0, 4, 1, /* char 74 */ \ + 0, 4, 1, /* char 75 */ \ + 0, 4, 1, /* char 76 */ \ + 0, 5, 1, /* char 77 */ \ + 0, 4, 1, /* char 78 */ \ + 0, 4, 1, /* char 79 */ \ + 0, 4, 1, /* char 80 */ \ + 0, 4, 1, /* char 81 */ \ + 0, 4, 1, /* char 82 */ \ + 0, 4, 1, /* char 83 */ \ + 0, 5, 1, /* char 84 */ \ + 0, 4, 1, /* char 85 */ \ + 0, 4, 1, /* char 86 */ \ + 0, 5, 1, /* char 87 */ \ + 0, 5, 1, /* char 88 */ \ + 0, 4, 1, /* char 89 */ \ + 0, 4, 1, /* char 90 */ \ + 0, 2, 1, /* char 91 */ \ + 0, 3, 1, /* char 92 */ \ + 0, 2, 1, /* char 93 */ \ + 0, 3, 1, /* char 94 */ \ + 0, 4, 1, /* char 95 */ \ + 0, 2, 1, /* char 96 */ \ + 0, 3, 1, /* char 97 */ \ + 0, 4, 1, /* char 98 */ \ + 0, 3, 1, /* char 99 */ \ + 0, 4, 1, /* char 100 */ \ + 0, 3, 1, /* char 101 */ \ + 0, 2, 1, /* char 102 */ \ + 0, 4, 1, /* char 103 */ \ + 0, 3, 1, /* char 104 */ \ + 0, 1, 1, /* char 105 */ \ + 0, 1, 1, /* char 106 */ \ + 0, 3, 1, /* char 107 */ \ + 0, 1, 1, /* char 108 */ \ + 0, 5, 1, /* char 109 */ \ + 0, 3, 1, /* char 110 */ \ + 0, 4, 1, /* char 111 */ \ + 0, 4, 1, /* char 112 */ \ + 0, 4, 1, /* char 113 */ \ + 0, 2, 1, /* char 114 */ \ + 0, 3, 1, /* char 115 */ \ + 0, 2, 1, /* char 116 */ \ + 0, 3, 1, /* char 117 */ \ + 0, 3, 1, /* char 118 */ \ + 0, 5, 1, /* char 119 */ \ + 0, 3, 1, /* char 120 */ \ + 0, 3, 1, /* char 121 */ \ + 0, 3, 1, /* char 122 */ \ + 0, 3, 1, /* char 123 */ \ + 0, 1, 1, /* char 124 */ \ + 0, 3, 1, /* char 125 */ \ + 0, 4, 1, /* char 126 */ \ + 0, 1, 0, /* char 127 */ \ + 0, 1, 0, /* char 128 */ \ + 0, 1, 0, /* char 129 */ \ + 0, 1, 0, /* char 130 */ \ + 0, 1, 0, /* char 131 */ \ + 0, 1, 0, /* char 132 */ \ + 0, 1, 0, /* char 133 */ \ + 0, 1, 0, /* char 134 */ \ + 0, 1, 0, /* char 135 */ \ + 0, 1, 0, /* char 136 */ \ + 0, 1, 0, /* char 137 */ \ + 0, 1, 0, /* char 138 */ \ + 0, 1, 0, /* char 139 */ \ + 0, 1, 0, /* char 140 */ \ + 0, 1, 0, /* char 141 */ \ + 0, 1, 0, /* char 142 */ \ + 0, 1, 0, /* char 143 */ \ + 0, 1, 0, /* char 144 */ \ + 0, 1, 0, /* char 145 */ \ + 0, 1, 0, /* char 146 */ \ + 0, 1, 0, /* char 147 */ \ + 0, 1, 0, /* char 148 */ \ + 0, 1, 0, /* char 149 */ \ + 0, 1, 0, /* char 150 */ \ + 0, 1, 0, /* char 151 */ \ + 0, 1, 0, /* char 152 */ \ + 0, 1, 0, /* char 153 */ \ + 0, 1, 0, /* char 154 */ \ + 0, 1, 0, /* char 155 */ \ + 0, 1, 0, /* char 156 */ \ + 0, 1, 0, /* char 157 */ \ + 0, 1, 0, /* char 158 */ \ + 0, 1, 0, /* char 159 */ \ + 0, 1, 0, /* char 160 */ \ + 0, 1, 0, /* char 161 */ \ + 0, 1, 0, /* char 162 */ \ + 0, 1, 0, /* char 163 */ \ + 0, 1, 0, /* char 164 */ \ + 0, 1, 0, /* char 165 */ \ + 0, 1, 0, /* char 166 */ \ + 0, 1, 0, /* char 167 */ \ + 0, 1, 0, /* char 168 */ \ + 0, 1, 0, /* char 169 */ \ + 0, 1, 0, /* char 170 */ \ + 0, 1, 0, /* char 171 */ \ + 0, 1, 0, /* char 172 */ \ + 0, 1, 0, /* char 173 */ \ + 0, 1, 0, /* char 174 */ \ + 0, 1, 0, /* char 175 */ \ + 0, 1, 0, /* char 176 */ \ + 0, 1, 0, /* char 177 */ \ + 0, 1, 0, /* char 178 */ \ + 0, 1, 0, /* char 179 */ \ + 0, 1, 0, /* char 180 */ \ + 0, 1, 0, /* char 181 */ \ + 0, 1, 0, /* char 182 */ \ + 0, 1, 0, /* char 183 */ \ + 0, 1, 0, /* char 184 */ \ + 0, 1, 0, /* char 185 */ \ + 0, 1, 0, /* char 186 */ \ + 0, 1, 0, /* char 187 */ \ + 0, 1, 0, /* char 188 */ \ + 0, 1, 0, /* char 189 */ \ + 0, 1, 0, /* char 190 */ \ + 0, 1, 0, /* char 191 */ \ + 0, 1, 0, /* char 192 */ \ + 0, 1, 0, /* char 193 */ \ + 0, 1, 0, /* char 194 */ \ + 0, 1, 0, /* char 195 */ \ + 0, 1, 0, /* char 196 */ \ + 0, 1, 0, /* char 197 */ \ + 0, 1, 0, /* char 198 */ \ + 0, 1, 0, /* char 199 */ \ + 0, 1, 0, /* char 200 */ \ + 0, 1, 0, /* char 201 */ \ + 0, 1, 0, /* char 202 */ \ + 0, 1, 0, /* char 203 */ \ + 0, 1, 0, /* char 204 */ \ + 0, 1, 0, /* char 205 */ \ + 0, 1, 0, /* char 206 */ \ + 0, 1, 0, /* char 207 */ \ + 0, 1, 0, /* char 208 */ \ + 0, 1, 0, /* char 209 */ \ + 0, 1, 0, /* char 210 */ \ + 0, 1, 0, /* char 211 */ \ + 0, 1, 0, /* char 212 */ \ + 0, 1, 0, /* char 213 */ \ + 0, 1, 0, /* char 214 */ \ + 0, 1, 0, /* char 215 */ \ + 0, 1, 0, /* char 216 */ \ + 0, 1, 0, /* char 217 */ \ + 0, 1, 0, /* char 218 */ \ + 0, 1, 0, /* char 219 */ \ + 0, 1, 0, /* char 220 */ \ + 0, 1, 0, /* char 221 */ \ + 0, 1, 0, /* char 222 */ \ + 0, 1, 0, /* char 223 */ \ + 0, 1, 0, /* char 224 */ \ + 0, 1, 0, /* char 225 */ \ + 0, 1, 0, /* char 226 */ \ + 0, 1, 0, /* char 227 */ \ + 0, 1, 0, /* char 228 */ \ + 0, 1, 0, /* char 229 */ \ + 0, 1, 0, /* char 230 */ \ + 0, 1, 0, /* char 231 */ \ + 0, 1, 0, /* char 232 */ \ + 0, 1, 0, /* char 233 */ \ + 0, 1, 0, /* char 234 */ \ + 0, 1, 0, /* char 235 */ \ + 0, 1, 0, /* char 236 */ \ + 0, 1, 0, /* char 237 */ \ + 0, 1, 0, /* char 238 */ \ + 0, 1, 0, /* char 239 */ \ + 0, 1, 0, /* char 240 */ \ + 0, 1, 0, /* char 241 */ \ + 0, 1, 0, /* char 242 */ \ + 0, 1, 0, /* char 243 */ \ + 0, 1, 0, /* char 244 */ \ + 0, 1, 0, /* char 245 */ \ + 0, 1, 0, /* char 246 */ \ + 0, 1, 0, /* char 247 */ \ + 0, 1, 0, /* char 248 */ \ + 0, 1, 0, /* char 249 */ \ + 0, 1, 0, /* char 250 */ \ + 0, 1, 0, /* char 251 */ \ + 0, 1, 0, /* char 252 */ \ + 0, 1, 0, /* char 253 */ \ + 0, 1, 0, /* char 254 */ \ + 0, 1, 0, /* char 255 */ \ + 226) diff --git a/interface/fonts/tiny_unicode.dm b/interface/fonts/tiny_unicode.dm new file mode 100644 index 0000000000000..d6af265d5182b --- /dev/null +++ b/interface/fonts/tiny_unicode.dm @@ -0,0 +1,253 @@ +/// For clean results on map, use only sizing pt, multiples of 12: 12pt 24pt 48pt etc. - Not for use with px sizing +/// Can be used in TGUI etc, px sizing is pt / 0.75. 12pt = 16px, 24pt = 32px etc. + +/// Base font +/datum/font/tiny_unicode + name = "TinyUnicode" + font_family = 'interface/fonts/TinyUnicode.ttf' + +/// For icon overlays +/// TinyUnicode 12pt metrics generated using Lummox's dmifontsplus (https://www.byond.com/developer/LummoxJR/DmiFontsPlus) +/// Note: these variable names have been changed, so you can't straight copy/paste from dmifontsplus.exe +/datum/font/tiny_unicode/size_12pt + name = "TinyUnicode 12pt" + height = 13 + ascent = 11 + descent = 2 + average_width = 5 + max_width = 11 + overhang = 0 + in_leading = -3 + ex_leading = 1 + default_character = 31 + start = 30 + end = 255 + metrics = list( + 1, 5, 0, // char 30 + 1, 5, 0, // char 31 + 0, 1, 4, // char 32 + 0, 1, 1, // char 33 + 0, 3, 1, // char 34 + 0, 5, 1, // char 35 + 0, 4, 1, // char 36 + 0, 3, 1, // char 37 + 0, 5, 1, // char 38 + 0, 1, 1, // char 39 + 0, 2, 1, // char 40 + 0, 2, 1, // char 41 + 0, 3, 1, // char 42 + 0, 3, 1, // char 43 + 0, 2, 1, // char 44 + 0, 3, 1, // char 45 + 0, 1, 1, // char 46 + 0, 3, 1, // char 47 + 0, 4, 1, // char 48 + 0, 2, 1, // char 49 + 0, 4, 1, // char 50 + 0, 4, 1, // char 51 + 0, 4, 1, // char 52 + 0, 4, 1, // char 53 + 0, 4, 1, // char 54 + 0, 4, 1, // char 55 + 0, 4, 1, // char 56 + 0, 4, 1, // char 57 + 0, 1, 1, // char 58 + 0, 2, 1, // char 59 + 0, 2, 1, // char 60 + 0, 4, 1, // char 61 + 0, 2, 1, // char 62 + 0, 4, 1, // char 63 + 0, 7, 1, // char 64 + 0, 4, 1, // char 65 + 0, 4, 1, // char 66 + 0, 3, 1, // char 67 + 0, 4, 1, // char 68 + 0, 3, 1, // char 69 + 0, 3, 1, // char 70 + 0, 4, 1, // char 71 + 0, 4, 1, // char 72 + 0, 3, 1, // char 73 + 0, 4, 1, // char 74 + 0, 4, 1, // char 75 + 0, 3, 1, // char 76 + 0, 5, 1, // char 77 + 0, 4, 1, // char 78 + 0, 4, 1, // char 79 + 0, 4, 1, // char 80 + 0, 4, 1, // char 81 + 0, 4, 1, // char 82 + 0, 4, 1, // char 83 + 0, 3, 1, // char 84 + 0, 4, 1, // char 85 + 0, 4, 1, // char 86 + 0, 5, 1, // char 87 + 0, 4, 1, // char 88 + 0, 4, 1, // char 89 + 0, 3, 1, // char 90 + 0, 2, 1, // char 91 + 0, 3, 1, // char 92 + 0, 2, 1, // char 93 + 0, 3, 1, // char 94 + 0, 5, 1, // char 95 + 0, 2, 1, // char 96 + 0, 4, 1, // char 97 + 0, 4, 1, // char 98 + 0, 3, 1, // char 99 + 0, 4, 1, // char 100 + 0, 4, 1, // char 101 + 0, 3, 1, // char 102 + 0, 4, 1, // char 103 + 0, 4, 1, // char 104 + 0, 1, 1, // char 105 + 0, 2, 1, // char 106 + 0, 4, 1, // char 107 + 0, 1, 1, // char 108 + 0, 5, 1, // char 109 + 0, 4, 1, // char 110 + 0, 4, 1, // char 111 + 0, 4, 1, // char 112 + 0, 4, 1, // char 113 + 0, 3, 1, // char 114 + 0, 4, 1, // char 115 + 0, 3, 1, // char 116 + 0, 4, 1, // char 117 + 0, 4, 1, // char 118 + 0, 5, 1, // char 119 + 0, 3, 1, // char 120 + 0, 4, 1, // char 121 + 0, 4, 1, // char 122 + 0, 3, 1, // char 123 + 0, 1, 1, // char 124 + 0, 3, 1, // char 125 + 0, 5, 1, // char 126 + 1, 5, 0, // char 127 + 0, 4, 1, // char 128 + 1, 5, 0, // char 129 + 1, 5, 0, // char 130 + 1, 5, 0, // char 131 + 1, 5, 0, // char 132 + 1, 5, 0, // char 133 + 1, 5, 0, // char 134 + 1, 5, 0, // char 135 + 1, 5, 0, // char 136 + 0, 5, 1, // char 137 + 1, 5, 0, // char 138 + 1, 5, 0, // char 139 + 0, 6, 1, // char 140 + 1, 5, 0, // char 141 + 1, 5, 0, // char 142 + 1, 5, 0, // char 143 + 1, 5, 0, // char 144 + 1, 5, 0, // char 145 + 1, 5, 0, // char 146 + 1, 5, 0, // char 147 + 1, 5, 0, // char 148 + 0, 2, 1, // char 149 + 1, 5, 0, // char 150 + 1, 5, 0, // char 151 + 1, 5, 0, // char 152 + 0, 4, 1, // char 153 + 1, 5, 0, // char 154 + 1, 5, 0, // char 155 + 1, 5, 0, // char 156 + 1, 5, 0, // char 157 + 1, 5, 0, // char 158 + 0, 4, 1, // char 159 + 1, 5, 0, // char 160 + 0, 1, 1, // char 161 + 0, 4, 1, // char 162 + 0, 4, 1, // char 163 + 0, 5, 1, // char 164 + 0, 3, 1, // char 165 + 0, 1, 1, // char 166 + 0, 4, 1, // char 167 + 0, 3, 1, // char 168 + 0, 2, 1, // char 169 + 0, 8, 1, // char 170 + 0, 4, 1, // char 171 + 0, 4, 1, // char 172 + 1, 5, 0, // char 173 + 0, 2, 1, // char 174 + 0, 4, 1, // char 175 + 0, 3, 1, // char 176 + 0, 3, 1, // char 177 + 0, 2, 1, // char 178 + 0, 2, 1, // char 179 + 0, 2, 1, // char 180 + 0, 4, 1, // char 181 + 0, 5, 1, // char 182 + 1, 1, 1, // char 183 + 0, 8, 1, // char 184 + 0, 2, 1, // char 185 + 0, 2, 1, // char 186 + 0, 4, 1, // char 187 + 0, 7, 1, // char 188 + 0, 8, 1, // char 189 + 0, 8, 1, // char 190 + 0, 4, 1, // char 191 + 0, 4, 1, // char 192 + 0, 4, 1, // char 193 + 0, 4, 1, // char 194 + 0, 4, 1, // char 195 + 0, 4, 1, // char 196 + 0, 4, 1, // char 197 + 0, 6, 1, // char 198 + 0, 3, 1, // char 199 + 0, 3, 1, // char 200 + 0, 3, 1, // char 201 + 0, 3, 1, // char 202 + 0, 3, 1, // char 203 + 0, 3, 1, // char 204 + 0, 3, 1, // char 205 + 0, 3, 1, // char 206 + 0, 3, 1, // char 207 + 0, 10, 1, // char 208 + 0, 4, 1, // char 209 + 0, 4, 1, // char 210 + 0, 4, 1, // char 211 + 0, 4, 1, // char 212 + 0, 4, 1, // char 213 + 0, 4, 1, // char 214 + 0, 3, 1, // char 215 + 0, 5, 1, // char 216 + 0, 4, 1, // char 217 + 0, 4, 1, // char 218 + 0, 4, 1, // char 219 + 0, 4, 1, // char 220 + 0, 4, 1, // char 221 + 0, 3, 1, // char 222 + 0, 3, 1, // char 223 + 0, 4, 1, // char 224 + 0, 4, 1, // char 225 + 0, 4, 1, // char 226 + 0, 4, 1, // char 227 + 0, 4, 1, // char 228 + 0, 4, 1, // char 229 + 0, 7, 1, // char 230 + 0, 3, 1, // char 231 + 0, 4, 1, // char 232 + 0, 4, 1, // char 233 + 0, 4, 1, // char 234 + 0, 4, 1, // char 235 + 0, 2, 1, // char 236 + 0, 2, 1, // char 237 + 0, 3, 1, // char 238 + 0, 3, 1, // char 239 + 0, 5, 1, // char 240 + 0, 4, 1, // char 241 + 0, 4, 1, // char 242 + 0, 4, 1, // char 243 + 0, 4, 1, // char 244 + 0, 4, 1, // char 245 + 0, 4, 1, // char 246 + 0, 5, 1, // char 247 + 0, 4, 1, // char 248 + 0, 4, 1, // char 249 + 0, 4, 1, // char 250 + 0, 4, 1, // char 251 + 0, 4, 1, // char 252 + 0, 4, 1, // char 253 + 0, 10, 1, // char 254 + 0, 4, 1, // char 255 + 226 + ) diff --git a/interface/fonts/vcr_osd_mono.dm b/interface/fonts/vcr_osd_mono.dm new file mode 100644 index 0000000000000..301d90d2f7ea6 --- /dev/null +++ b/interface/fonts/vcr_osd_mono.dm @@ -0,0 +1,3 @@ +/datum/font/vcr_osd_mono + name = "VCR OSD Mono" + font_family = 'interface/fonts/VCR_OSD_Mono.ttf' diff --git a/interface/license.txt b/interface/license.txt deleted file mode 100644 index 5f74403c50af0..0000000000000 --- a/interface/license.txt +++ /dev/null @@ -1,2 +0,0 @@ -VCR OSD Mono created by Riciery Leal/mrmanet. Website indicates 100% free, author confirms it's free for all to use. -(https://www.dafont.com/font-comment.php?file=vcr_osd_mono) diff --git a/interface/skin.dmf b/interface/skin.dmf index ae43a3c401bb9..ede8e37684078 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -111,12 +111,12 @@ window "mapwindow" size = 640x480 anchor1 = 0,0 anchor2 = 100,100 - font-family = "Arial" - font-size = 7 + font-family = "Grand9K Pixel" + font-size = 6pt is-default = true right-click = true saved-params = "zoom;letterbox;zoom-mode" - style = ".center { text-align: center; } .maptext { font-family: 'Small Fonts'; font-size: 7px; -dm-text-outline: 1px black; color: white; line-height: 1.1; } .command_headset { font-weight: bold;\tfont-size: 8px; } .small { font-size: 6px; } .big { font-size: 8px; } .reallybig { font-size: 8px; } .extremelybig { font-size: 8px; } .greentext { color: #00FF00; font-size: 7px; } .redtext { color: #FF0000; font-size: 7px; } .clown { color: #FF69Bf; font-size: 7px; font-weight: bold; } .his_grace { color: #15D512; } .hypnophrase { color: #0d0d0d; font-weight: bold; } .yell { font-weight: bold; } .italics { font-size: 6px; }" + style = ".center { text-align: center; } .maptext { font-family: 'Grand9K Pixel'; font-size: 6pt; -dm-text-outline: 1px black; color: white; line-height: 1.0; } .command_headset { font-weight: bold; } .context { font-family: 'Pixellari'; font-size: 12pt; -dm-text-outline: 1px black; } .subcontext { font-family: 'TinyUnicode'; font-size: 12pt; line-height: 0.75; } .small { font-family: 'Spess Font'; font-size: 6pt; line-height: 1.4; } .big { font-family: 'Pixellari'; font-size: 12pt; } .reallybig { font-size: 12pt; } .extremelybig { font-size: 12pt; } .greentext { color: #00FF00; font-size: 6pt; } .redtext { color: #FF0000; font-size: 6pt; } .clown { color: #FF69BF; font-weight: bold; } .his_grace { color: #15D512; } .hypnophrase { color: #0d0d0d; font-weight: bold; } .yell { font-weight: bold; } .italics { font-family: 'Spess Font'; font-size: 6pt; line-height: 1.4; }" elem "status_bar" type = LABEL pos = 0,464 diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index be1284df7d466..36c85642ad23c 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -170,4 +170,5 @@ h1.alert, h2.alert {color: #000000;} .swarmer {color: #2C75FF;} .resonate {color: #298F85;} +.upside_down {display: inline; -moz-transform: scale(-1, -1); -webkit-transform: scale(-1, -1); -o-transform: scale(-1, -1); -ms-transform: scale(-1, -1); transform: scale(-1, -1);} "} diff --git a/lua/SS13.lua b/lua/SS13.lua index d9c208edfebd0..a17d5b50577bb 100644 --- a/lua/SS13.lua +++ b/lua/SS13.lua @@ -16,10 +16,36 @@ function SS13.istype(thing, type) end function SS13.new(type, ...) - local datum = dm.global_proc("_new", type, { ... }) - local references = SS13.state.vars.references - references:add(datum) - return datum + local datum = SS13.new_untracked(type, table.unpack({...})) + if datum then + local references = SS13.state.vars.references + references:add(datum) + SS13.state:call_proc("clear_on_delete", datum) + return datum + end +end + +function SS13.type(string_type) + return dm.global_proc("_text2path", string_type) +end + +function SS13.qdel(datum) + if SS13.is_valid(datum) then + dm.global_proc("qdel", datum) + return true + end + return false +end + +function SS13.new_untracked(type, ...) + return dm.global_proc("_new", type, { ... }) +end + +function SS13.is_valid(datum) + if datum and not datum:is_null() and not datum:get_var("gc_destroyed") then + return true + end + return false end function SS13.await(thing_to_call, proc_to_call, ...) @@ -35,7 +61,7 @@ function SS13.await(thing_to_call, proc_to_call, ...) sleep() end local return_value, runtime_message = promise_vars.return_value, promise_vars.runtime_message - dm.global_proc("qdel", promise) + SS13.stop_tracking(promise) return return_value, runtime_message end @@ -44,7 +70,7 @@ function SS13.wait(time, timer) local timedevent = dm.global_proc("_addtimer", callback, time * 10, 8, timer, debug.info(1, "sl")) coroutine.yield() dm.global_proc("deltimer", timedevent, timer) - dm.global_proc("qdel", callback) + SS13.stop_tracking(callback) end function SS13.register_signal(datum, signal, func, make_easy_clear_function) @@ -74,13 +100,13 @@ function SS13.register_signal(datum, signal, func, make_easy_clear_function) SS13.signal_handlers[datum]["_cleanup"] = { func = function(datum) SS13.signal_handler_cleanup(datum) - dm.global_proc("qdel", cleanup_callback) + SS13.stop_tracking(cleanup_callback) end, callback = cleanup_callback, } end if signal == "parent_qdeleting" then --We want to make sure that the cleanup function is the very last signal handler called. - local comp_lookup = datum.vars.comp_lookup + local comp_lookup = datum.vars._listen_lookup if comp_lookup then local lookup_for_signal = comp_lookup.entries.parent_qdeleting if lookup_for_signal and not SS13.istype(lookup_for_signal, "/datum") then @@ -105,6 +131,10 @@ function SS13.register_signal(datum, signal, func, make_easy_clear_function) return callback end +function SS13.stop_tracking(datum) + SS13.state:call_proc("let_soft_delete", datum) +end + function SS13.unregister_signal(datum, signal, callback) local function clear_handler(handler_info) if not handler_info then @@ -115,7 +145,7 @@ function SS13.unregister_signal(datum, signal, callback) end local handler_callback = handler_info.callback handler_callback:call_proc("UnregisterSignal", datum, signal) - dm.global_proc("qdel", handler_callback) + SS13.stop_tracking(handler_callback) end if not SS13.signal_handlers then @@ -177,7 +207,7 @@ function SS13.set_timeout(time, func, timer) SS13.timeouts[callback] = function() SS13.timeouts[callback] = nil dm.global_proc("deltimer", timedevent, timer) - dm.global_proc("qdel", callback) + SS13.stop_tracking(callback) func() end local path = { "SS13", "timeouts", dm.global_proc("WEAKREF", callback) } diff --git a/rust_g.dll b/rust_g.dll index 059c79e340291..cfb52ffc65a03 100644 Binary files a/rust_g.dll and b/rust_g.dll differ diff --git a/sound/ambience/ambiicemelody1.ogg b/sound/ambience/ambiicemelody1.ogg new file mode 100644 index 0000000000000..1f491741e0391 Binary files /dev/null and b/sound/ambience/ambiicemelody1.ogg differ diff --git a/sound/ambience/ambiicemelody2.ogg b/sound/ambience/ambiicemelody2.ogg new file mode 100644 index 0000000000000..ef1264690b5d9 Binary files /dev/null and b/sound/ambience/ambiicemelody2.ogg differ diff --git a/sound/ambience/ambiicemelody3.ogg b/sound/ambience/ambiicemelody3.ogg new file mode 100644 index 0000000000000..c6e5b23e81547 Binary files /dev/null and b/sound/ambience/ambiicemelody3.ogg differ diff --git a/sound/ambience/ambiicemelody4.ogg b/sound/ambience/ambiicemelody4.ogg new file mode 100644 index 0000000000000..d977bb412e09a Binary files /dev/null and b/sound/ambience/ambiicemelody4.ogg differ diff --git a/sound/ambience/ambiicesting1.ogg b/sound/ambience/ambiicesting1.ogg new file mode 100644 index 0000000000000..1af26c712ba93 Binary files /dev/null and b/sound/ambience/ambiicesting1.ogg differ diff --git a/sound/ambience/ambiicesting2.ogg b/sound/ambience/ambiicesting2.ogg new file mode 100644 index 0000000000000..63c10a5659b34 Binary files /dev/null and b/sound/ambience/ambiicesting2.ogg differ diff --git a/sound/ambience/ambiicesting3.ogg b/sound/ambience/ambiicesting3.ogg new file mode 100644 index 0000000000000..f8bd3703933ba Binary files /dev/null and b/sound/ambience/ambiicesting3.ogg differ diff --git a/sound/ambience/ambiicesting4.ogg b/sound/ambience/ambiicesting4.ogg new file mode 100644 index 0000000000000..461547cea0786 Binary files /dev/null and b/sound/ambience/ambiicesting4.ogg differ diff --git a/sound/ambience/ambiicesting5.ogg b/sound/ambience/ambiicesting5.ogg new file mode 100644 index 0000000000000..7eab5ca9236a3 Binary files /dev/null and b/sound/ambience/ambiicesting5.ogg differ diff --git a/sound/ambience/ambiicetheme.ogg b/sound/ambience/ambiicetheme.ogg new file mode 100644 index 0000000000000..ca011bb214660 Binary files /dev/null and b/sound/ambience/ambiicetheme.ogg differ diff --git a/sound/ambience/ambimaint6.ogg b/sound/ambience/ambimaint6.ogg new file mode 100644 index 0000000000000..f83e3ed1d6b0e Binary files /dev/null and b/sound/ambience/ambimaint6.ogg differ diff --git a/sound/ambience/ambimaint7.ogg b/sound/ambience/ambimaint7.ogg new file mode 100644 index 0000000000000..3db2f226a4ab5 Binary files /dev/null and b/sound/ambience/ambimaint7.ogg differ diff --git a/sound/ambience/ambispace5.ogg b/sound/ambience/ambispace5.ogg new file mode 100644 index 0000000000000..df8dd5b87d19e Binary files /dev/null and b/sound/ambience/ambispace5.ogg differ diff --git a/sound/ambience/ambispace6.ogg b/sound/ambience/ambispace6.ogg new file mode 100644 index 0000000000000..fe5e95ab3d01a Binary files /dev/null and b/sound/ambience/ambispace6.ogg differ diff --git a/sound/ambience/license.txt b/sound/ambience/license.txt index 5e75b772d1108..607dd6628e79b 100644 --- a/sound/ambience/license.txt +++ b/sound/ambience/license.txt @@ -11,4 +11,7 @@ title3.ogg is Tintin On The Moon remixed by Cuboos https://tgstation13.org/phpBB VoidsEmbrace.ogg is Chopin - Waltz in C Sharp Minor (Op. 64 No. 2). It is in public domain. +ambispace4.ogg is Sipping Bird, by Capsandi. It has been licensed under CC-BY 3.0 license. +ambimaint6.ogg and ambimaint7.ogg, created by Capsandi are licensed under CC-BY 3.0 license. + CC-BY 3.0: http://creativecommons.org/licenses/by/3.0/ diff --git a/sound/attributions.txt b/sound/attributions.txt index b273b7d92783b..3ae6c797dd33b 100644 --- a/sound/attributions.txt +++ b/sound/attributions.txt @@ -41,7 +41,6 @@ https://freesound.org/people/dj997/sounds/493747/ standard_stamp.ogg is adapted from tom_woysky's "Stamp.wav" https://freesound.org/people/tom_woysky/sounds/348316/ - rattling_keys.ogg and rattling_keys_attack.ogg is adapted from Desibloke's "Keys rattling [Key rattle]" https://freesound.org/people/Desibloke/sounds/523671/ chainsaw_loop.ogg is adapted from Audionautics "Chainsaw Idle Loops", which is licensed under CC Attribution 3.0 @@ -66,7 +65,7 @@ https://freesound.org/people/uagadugu/sounds/222521/ earth_rumble_distant1, earth_rumble_distant2, earth_rumble_distant3, and earth_rumble_distant4 are adapted from metrostock99's "EARTHQUAKE OR DISTANT SPACE SHUTTLE RUMBLE.WAV" (CC 0) https://freesound.org/people/metrostock99/sounds/203281/ -metal_creak.ogg is adapted from BloodPixelHero's "Metal door creak" under CC Attribution 4.0 +metal_creak.ogg is adapted from BloodPixelHero's "Metal door creak" under CC Attribution 4.0 https://freesound.org/people/BloodPixelHero/sounds/585323/ revolutionary_tide.ogg is adapted from several audio samples: @@ -79,3 +78,30 @@ https://freesound.org/people/vmgraw/sounds/235610/ vmgraw's "Distant Whistle" (CC 0) https://freesound.org/people/giddster/sounds/414480/ + +zip_up.ogg and un_zip.ogg adapted from aboxinghelena's Zip.wav (CC 4) +https://freesound.org/people/aboxinghelena/sounds/401139/ + +car_crash.ogg is adapted from squareal's "Car Crash" (CC 0) +https://freesound.org/people/squareal/sounds/237375/ + +ding_short.ogg is from Natty23 (CC 4) +https://freesound.org/people/Natty23/sounds/411747/ + +jingle.ogg is from Zapsplat (https://www.zapsplat.com/license-type/standard-license/) +https://www.zapsplat.com/sound-effect-category/sleigh-bells/ + +tada_fanfare.ogg is adapted from plasterbrain's "Tada Fanfare A", which is public domain (CC 0): +https://freesound.org/people/plasterbrain/sounds/397355/ + +glockenspiel_ping.ogg is adapted from FunWithSound's "Short Success Sound Glockenspiel Treasure Video Game", which is public domain (CC 0): +https://freesound.org/people/FunWithSound/sounds/456965/ + +beeps_jingle.ogg is adapted from Eponn's "Achievement happy Beeps Jingle", which is public domain (CC 0): +https://freesound.org/people/Eponn/sounds/619838/ + +boing.ogg is adapted from reelworldstudio's "Cartoon Boing", which is public domain (CC 0): +https://freesound.org/people/reelworldstudio/sounds/161122/ + +arcade_jump.ogg is adapted from se2001's "8-Bit Jump 3", which is public domain (CC 0): +hhttps://freesound.org/people/se2001/sounds/528568/ diff --git a/sound/creatures/attribution.txt b/sound/creatures/attribution.txt index 1d2d543aa1506..06d8361868cb3 100644 --- a/sound/creatures/attribution.txt +++ b/sound/creatures/attribution.txt @@ -1,8 +1,14 @@ -cow.ogg sound adapted from Benboncan on Freesound +cow.ogg sound adapted from Benboncan on Freesound https://freesound.org/people/Benboncan/sounds/58277/ pig1.ogg and pig2.ogg adapted from Jofae on Freesound https://freesound.org/people/Jofae/sounds/352698/ sheep1, sheep2, and sheep3.ogg adapted from milkotz on Freesound -https://freesound.org/people/milkotz/sounds/618865/ \ No newline at end of file +https://freesound.org/people/milkotz/sounds/618865/ + +snake_hissing1.ogg adapted from schreibsel on Freesound (CC 0) +https://freesound.org/people/schreibsel/sounds/540162/ + +snake_hissing2.ogg adapted from xoiziox on Freesound (CC 0) +https://freesound.org/people/xoiziox/sounds/553374/ diff --git a/sound/creatures/bagawk.ogg b/sound/creatures/bagawk.ogg new file mode 100644 index 0000000000000..bfdce2da4894b Binary files /dev/null and b/sound/creatures/bagawk.ogg differ diff --git a/sound/creatures/chick_peep.ogg b/sound/creatures/chick_peep.ogg new file mode 100644 index 0000000000000..1e84d1d765fd8 Binary files /dev/null and b/sound/creatures/chick_peep.ogg differ diff --git a/sound/creatures/chitter.ogg b/sound/creatures/chitter.ogg new file mode 100644 index 0000000000000..5b2a144388673 Binary files /dev/null and b/sound/creatures/chitter.ogg differ diff --git a/sound/creatures/claw_click.ogg b/sound/creatures/claw_click.ogg new file mode 100644 index 0000000000000..965b4c3fa9f5a Binary files /dev/null and b/sound/creatures/claw_click.ogg differ diff --git a/sound/creatures/clucks.ogg b/sound/creatures/clucks.ogg new file mode 100644 index 0000000000000..176f46f866f04 Binary files /dev/null and b/sound/creatures/clucks.ogg differ diff --git a/sound/effects/mousesqueek.ogg b/sound/creatures/mousesqueek.ogg similarity index 100% rename from sound/effects/mousesqueek.ogg rename to sound/creatures/mousesqueek.ogg diff --git a/sound/creatures/pony/clown_gallup.ogg b/sound/creatures/pony/clown_gallup.ogg new file mode 100644 index 0000000000000..61f7eaf5162cb Binary files /dev/null and b/sound/creatures/pony/clown_gallup.ogg differ diff --git a/sound/creatures/pony/snort.ogg b/sound/creatures/pony/snort.ogg new file mode 100644 index 0000000000000..0ea56ad957dcb Binary files /dev/null and b/sound/creatures/pony/snort.ogg differ diff --git a/sound/creatures/pony/whinny01.ogg b/sound/creatures/pony/whinny01.ogg new file mode 100644 index 0000000000000..485ca3a52977d Binary files /dev/null and b/sound/creatures/pony/whinny01.ogg differ diff --git a/sound/creatures/pony/whinny02.ogg b/sound/creatures/pony/whinny02.ogg new file mode 100644 index 0000000000000..2d48a0cacdaea Binary files /dev/null and b/sound/creatures/pony/whinny02.ogg differ diff --git a/sound/creatures/pony/whinny03.ogg b/sound/creatures/pony/whinny03.ogg new file mode 100644 index 0000000000000..7a288d70aa77d Binary files /dev/null and b/sound/creatures/pony/whinny03.ogg differ diff --git a/sound/creatures/snake_hissing1.ogg b/sound/creatures/snake_hissing1.ogg new file mode 100644 index 0000000000000..52a37d764c426 Binary files /dev/null and b/sound/creatures/snake_hissing1.ogg differ diff --git a/sound/creatures/snake_hissing2.ogg b/sound/creatures/snake_hissing2.ogg new file mode 100644 index 0000000000000..bd11b7fb5f0fa Binary files /dev/null and b/sound/creatures/snake_hissing2.ogg differ diff --git a/sound/effects/alert.ogg b/sound/effects/alert.ogg index 69bc52bdb804b..e68847321e200 100644 Binary files a/sound/effects/alert.ogg and b/sound/effects/alert.ogg differ diff --git a/sound/effects/arcade_jump.ogg b/sound/effects/arcade_jump.ogg new file mode 100644 index 0000000000000..65f0cc448b564 Binary files /dev/null and b/sound/effects/arcade_jump.ogg differ diff --git a/sound/effects/beeps_jingle.ogg b/sound/effects/beeps_jingle.ogg new file mode 100644 index 0000000000000..0d4b647f88d53 Binary files /dev/null and b/sound/effects/beeps_jingle.ogg differ diff --git a/sound/effects/boing.ogg b/sound/effects/boing.ogg new file mode 100644 index 0000000000000..8328cc3392613 Binary files /dev/null and b/sound/effects/boing.ogg differ diff --git a/sound/effects/flatline3.ogg b/sound/effects/flatline3.ogg new file mode 100644 index 0000000000000..1430ee7429b84 Binary files /dev/null and b/sound/effects/flatline3.ogg differ diff --git a/sound/effects/glockenspiel_ping.ogg b/sound/effects/glockenspiel_ping.ogg new file mode 100644 index 0000000000000..f25300071292d Binary files /dev/null and b/sound/effects/glockenspiel_ping.ogg differ diff --git a/sound/effects/jingle.ogg b/sound/effects/jingle.ogg new file mode 100644 index 0000000000000..da903910dfcf2 Binary files /dev/null and b/sound/effects/jingle.ogg differ diff --git a/sound/effects/license.txt b/sound/effects/license.txt index 77351397fdeae..04bb7108d9579 100644 --- a/sound/effects/license.txt +++ b/sound/effects/license.txt @@ -4,3 +4,6 @@ cartoon_pop.ogg by Tobiasz 'unfa' Karoń (https://freesound.org/people/unfa/sounds/245645/) It has been licensed under CC-BY 3.0, which can be found at http://creativecommons.org/licenses/by/3.0/ + +alert.ogg by bbrocer. Extended, looped, and reverbed +https://freesound.org/people/bbrocer/sounds/389511/ \ No newline at end of file diff --git a/sound/effects/submerge.ogg b/sound/effects/submerge.ogg new file mode 100644 index 0000000000000..8c50fba8e0a73 Binary files /dev/null and b/sound/effects/submerge.ogg differ diff --git a/sound/effects/tada_fanfare.ogg b/sound/effects/tada_fanfare.ogg new file mode 100644 index 0000000000000..055635e9decae Binary files /dev/null and b/sound/effects/tada_fanfare.ogg differ diff --git a/sound/items/barcodebeep.ogg b/sound/items/barcodebeep.ogg new file mode 100644 index 0000000000000..e1939537fb92a Binary files /dev/null and b/sound/items/barcodebeep.ogg differ diff --git a/sound/items/click.ogg b/sound/items/click.ogg new file mode 100644 index 0000000000000..366ed0f8cc155 Binary files /dev/null and b/sound/items/click.ogg differ diff --git a/sound/items/healthanalyzer.ogg b/sound/items/healthanalyzer.ogg new file mode 100644 index 0000000000000..56fd762cdde7d Binary files /dev/null and b/sound/items/healthanalyzer.ogg differ diff --git a/sound/items/hypospray.ogg b/sound/items/hypospray.ogg new file mode 100644 index 0000000000000..e5c7bd8f92b9b Binary files /dev/null and b/sound/items/hypospray.ogg differ diff --git a/sound/items/un_zip.ogg b/sound/items/un_zip.ogg new file mode 100644 index 0000000000000..84d6bb4c95625 Binary files /dev/null and b/sound/items/un_zip.ogg differ diff --git a/sound/items/zip_up.ogg b/sound/items/zip_up.ogg new file mode 100644 index 0000000000000..73d86da6e6f8b Binary files /dev/null and b/sound/items/zip_up.ogg differ diff --git a/sound/lavaland/bdm_boss.ogg b/sound/lavaland/bdm_boss.ogg new file mode 100644 index 0000000000000..a5c14095416bb Binary files /dev/null and b/sound/lavaland/bdm_boss.ogg differ diff --git a/sound/lavaland/hiero_boss.ogg b/sound/lavaland/hiero_boss.ogg new file mode 100644 index 0000000000000..23412b5346d13 Binary files /dev/null and b/sound/lavaland/hiero_boss.ogg differ diff --git a/sound/machines/ding_short.ogg b/sound/machines/ding_short.ogg new file mode 100644 index 0000000000000..79032ee2a9a7a Binary files /dev/null and b/sound/machines/ding_short.ogg differ diff --git a/sound/machines/engine_alert3.ogg b/sound/machines/engine_alert3.ogg new file mode 100644 index 0000000000000..394bfed2a138d Binary files /dev/null and b/sound/machines/engine_alert3.ogg differ diff --git a/sound/magic/hereticknock.ogg b/sound/magic/hereticknock.ogg new file mode 100644 index 0000000000000..87ca57302a285 Binary files /dev/null and b/sound/magic/hereticknock.ogg differ diff --git a/sound/misc/airraid.ogg b/sound/misc/airraid.ogg index 820eaccf91d73..cc9913becdde9 100644 Binary files a/sound/misc/airraid.ogg and b/sound/misc/airraid.ogg differ diff --git a/sound/misc/announce_syndi.ogg b/sound/misc/announce_syndi.ogg new file mode 100644 index 0000000000000..49c255bd0e9e9 Binary files /dev/null and b/sound/misc/announce_syndi.ogg differ diff --git a/sound/misc/bloblarm.ogg b/sound/misc/bloblarm.ogg index 93bcdbcc49a9a..2c934e1bf185f 100644 Binary files a/sound/misc/bloblarm.ogg and b/sound/misc/bloblarm.ogg differ diff --git a/sound/misc/license.txt b/sound/misc/license.txt index b92a4a279a956..69ef29928202c 100644 --- a/sound/misc/license.txt +++ b/sound/misc/license.txt @@ -2,4 +2,7 @@ bloop.ogg by my man Tim Khan (https://freesound.org/people/tim.kahn/sounds/130377/) knuckles.ogg by CGEffex. Shortened and cut. -https://freesound.org/people/CGEffex/sounds/93981/ \ No newline at end of file +https://freesound.org/people/CGEffex/sounds/93981/ + +airraid.ogg by Jwade722. Shortened and cut. +https://freesound.org/people/Jwade722/sounds/534550/ \ No newline at end of file diff --git a/sound/misc/notice3.ogg b/sound/misc/notice3.ogg new file mode 100644 index 0000000000000..e41a4361ca6c9 Binary files /dev/null and b/sound/misc/notice3.ogg differ diff --git a/sound/vehicles/car_crash.ogg b/sound/vehicles/car_crash.ogg new file mode 100644 index 0000000000000..a614a78d2f777 Binary files /dev/null and b/sound/vehicles/car_crash.ogg differ diff --git a/sound/voice/ethereal/lustrous_scream_1.ogg b/sound/voice/ethereal/lustrous_scream_1.ogg new file mode 100644 index 0000000000000..ca282c346cf74 Binary files /dev/null and b/sound/voice/ethereal/lustrous_scream_1.ogg differ diff --git a/sound/voice/ethereal/lustrous_scream_2.ogg b/sound/voice/ethereal/lustrous_scream_2.ogg new file mode 100644 index 0000000000000..e6e2a87fc1adf Binary files /dev/null and b/sound/voice/ethereal/lustrous_scream_2.ogg differ diff --git a/sound/voice/ethereal/lustrous_scream_3.ogg b/sound/voice/ethereal/lustrous_scream_3.ogg new file mode 100644 index 0000000000000..fbb7a6a44864d Binary files /dev/null and b/sound/voice/ethereal/lustrous_scream_3.ogg differ diff --git a/sound/voice/moth/credit.txt b/sound/voice/moth/credit.txt new file mode 100644 index 0000000000000..7f64b72841e32 --- /dev/null +++ b/sound/voice/moth/credit.txt @@ -0,0 +1,5 @@ +"moth_flutter" modified from +https://freesound.org/people/Godowan/sounds/240476/ +(CC 0 license) + +who knows where the original moth scream noise was I sure as hell don't \ No newline at end of file diff --git a/sound/voice/moth/moth_death.ogg b/sound/voice/moth/moth_death.ogg new file mode 100644 index 0000000000000..df23cfa472ac1 Binary files /dev/null and b/sound/voice/moth/moth_death.ogg differ diff --git a/sound/voice/moth/moth_flutter.ogg b/sound/voice/moth/moth_flutter.ogg new file mode 100644 index 0000000000000..f5737d522ca20 Binary files /dev/null and b/sound/voice/moth/moth_flutter.ogg differ diff --git a/sound/weapons/gun/rifle/shot_heavy.ogg b/sound/weapons/gun/rifle/shot_heavy.ogg new file mode 100644 index 0000000000000..f91b21ec4d801 Binary files /dev/null and b/sound/weapons/gun/rifle/shot_heavy.ogg differ diff --git a/sound/weapons/laser_crank.ogg b/sound/weapons/laser_crank.ogg new file mode 100644 index 0000000000000..5dc71f27c75b7 Binary files /dev/null and b/sound/weapons/laser_crank.ogg differ diff --git a/strings/anti_union_propaganda.txt b/strings/anti_union_propaganda.txt deleted file mode 100644 index 1e431cffaed65..0000000000000 --- a/strings/anti_union_propaganda.txt +++ /dev/null @@ -1,4 +0,0 @@ -Remember, union dues cost around 70,000 credits a year. A new video game system with the latest hits sounds like fun. Put your money towards that instead of paying dues to the union. -Remember, tickets & food to the Toolbox Tournament aren't cheap. That money in union dues you'd be paying every year could sure go a long way. -Remember, nothing's more enjoyable than a night out watching a thunderdome match with your buddies. All those union dues you pay every year could buy a few rounds. -Nanotrasen's open door policy is designed to help you feel comfortable taking up issues to your assigned head of staff. It's hard for us to maintain this when they're dead. diff --git a/strings/exoadventures/britain_replica.json b/strings/exoadventures/britain_replica.json new file mode 100644 index 0000000000000..0bfaa67e990cb --- /dev/null +++ b/strings/exoadventures/britain_replica.json @@ -0,0 +1,570 @@ +{ + "adventure_name": "A Model Earth", + "version": 1, + "author": "Armhulen", + "starting_node": "Planet Start", + "starting_qualities": { + "Long Range Scan Report": 0, + "UFOs Shot Down": 0 + }, + "required_site_traits": [ + "in space" + ], + "loot_categories": [ + "research" + ], + "scan_band_mods": {}, + "deep_scan_description": "", + "triggers": [], + "nodes": [ + { + "name": "Planet Start", + "description": "You come across a grey planet. It looks familiar, though you swore you've never come across this sector of space before.", + "choices": [ + { + "key": "choice 0", + "name": "Ignore the planet.", + "exit_node": "FAIL", + "delay": 0, + "delay_message": "Whatever, there's a lot of planets in space. Must be a hunch!" + }, + { + "key": "choice 1", + "name": "Begin Orbital Scan", + "exit_node": "Scanning from Orbit", + "requirements": [ + { + "quality": "Long Range Scan Report", + "operator": "==", + "value": 0 + } + ], + "delay": 30, + "delay_message": "Scanning planet..." + }, + { + "key": "choice 8", + "name": "Descend Into Orbit", + "exit_node": "Orbital Descent", + "delay": 30, + "delay_message": "Descending into Orbit..." + } + ], + "image": null, + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAMAAAD0WI85AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAALlUExURQAAAAEBAQICAgMDAwQEBA8PDwUFBQcHBwkJCQwMDAoKCkRERNXV1cDAwNDQ0LGxsaioqJaWloyMjLOzs6WlpcLCwqSkpDc3Nw0NDeXl5b+/v5mZmZycnLKyssXFxXd3d6CgoODg4JeXl9PT08bGxsTExJiYmIqKiqGhoZqamoeHh5KSkvb29pOTk4ODg3FxcaOjo62trZ6enqKioqqqqq+vr4WFhcvLy729vb6+vqysrJGRkeTk5Jubm7q6uru7u6urq6amppWVlbe3t6enp9zc3GFhYYuLi93d3by8vH19fdHR0fn5+c/Pz8nJydnZ2XZ2dn9/f4mJibCwsNvb22pqauvr63x8fHV1dRUVFcPDw/Hx8c7Ozra2tp+fn1BQUFFRUYGBgV9fX4iIiHl5eQYGBqmpqbi4uLS0tMfHx83Nzbm5ubW1tV5eXmJiYpCQkHt7e+rq6kxMTFNTU2lpaXBwcG1tbXNzc4+Pj09PT52dnUhISEFBQUNDQ1JSUltbW1paWmVlZW9vb2traw4ODnR0dG5ubnh4eGxsbElJST8/P1ZWVnJycmdnZ2RkZHp6eoaGhmBgYEBAQEpKSlRUVGZmZmhoaMHBwdLS0oCAgDk5OWNjY11dXUZGRkJCQkdHR9jY2O/v75SUlDo6OlxcXFVVVVhYWD09PU5OTk1NTVlZWd7e3sjIyDMzMygoKH5+foKCgoSEhC4uLjs7OzU1NUVFRenp6TExMf7+/o6Ojtra2q6urt/f3/Dw8PLy8uPj4/z8/Pv7+/39/TIyMufn5+Li4srKyszMzFdXV+7u7tTU1Pr6+jAwMD4+Pu3t7SsrKyoqKuzs7NfX1zQ0NC0tLSwsLC8vLxAQEPPz89bW1ujo6Dw8PEtLS42NjfT09DY2NhwcHPX19RMTE/j4+Dg4OCkpKSEhIQgICCQkJCIiIiYmJhoaGiUlJRQUFOHh4ScnJ////xcXF+bm5vf39xkZGRERERgYGJOWJYYAAAAJcEhZcwAADsIAAA7CARUoSoAAABOjSURBVHhe7Vv3W5PZnidlog41VOlNuvQOUgJIVaqURTpITygJTQgEuJQQQu8JRSAQFEaqBFBBulyxULwjgWFnr3N37uyMc9e7uz/vOS/Zv+Gd51k+mrzJm/ec5/PtpyF2iUtc4hKXuMQlLnGJPygwAFgMFgsuONEX8MKDGzgAPAYHvuPBc1gc+AU8jsXixHDgDYMRQ36DP2PFsPA2ugD8AWVAEQ944jFYeAtcwBcsHogjBhjjIW0EOOw38AkgBLiPyIpoAIhxIS2KuCAI6UJ2YkC34AseUAa8gGiAHtA1oAuogrvwcSzyhoPyAPvAT0Bm8MhFf6gBEoNMAOULz4LsIGsCdCs8gXDlKuHqtavfXoGehsVCEZGHoCmghwFbwg/IPVQBnAeJCkAGIYf8RzhicVe+EZeQlJKWIcrKySvIK8opfXsFMIeGAKRhzCANkabwcVGPaAGhBdgAVhe+cyEPAXddWUVVTV1DRVNeS0tNVVtH94aevoHhNTwIKZHVQGNwgT1AZaAsCFAw9HKR5wM/AS8M7up1BSNjk5umhmbmFpZW1jaKtnb2ig6OThqKhs5GMBVAN0NcDeYy8A/GvqhHlADVCWRB3hHFAk8Ru3rL1sXM1c3G3l2S5K7o4Um00PFSv+1N9PF1tPXzM/WHaQy0QPIXBOJjBFGPaAGJ3gt7AFPAyL0SQDT1vXM3UMHJMchTXSY4xCBUi6QoE+YUei/c2SJC2iXSOQoGBrQE9EJgUtga5fQL1ArzDiIIoljsv8hFq9+PIfpJytx1dIy1CY2LT0hMVFQnOTl5eVjYmPgmkZJDU0JgIEEgfgmbgmBBFYiLIIygcbCYBxKpkmnpGZnpsVmOMtkkaxd3NS0yJSc3z8vWJi7OyzOfSisg5xYWmRddGAO2QSILdYtc+DliEyATPttT0UMtNs3EQ91DTi9W3Uu12MxYv4RKNJF+aGpTWlpGJ5dXUBmVVdVFlciIAJR9kUlQriOIGBDQNpg/yWTJu0p7uioouLnL2JCsZTxSamrD6wxy6osYdGY5ndngTWKR46nllEZ2kzlIW3Bsg1RILBblYEc4QGXC6L2mFRYrKRcdIxGtkOpl1FzcEtKY0tjqYWBHdCw1lMkpaGPQ2zsqNDuTqOS4dFpXOKiOF2kCifaLDtECLIAgbyF8rsloqad2G3W7yll7mBV1RTaHJ7GL6msNcnpcTEJ6Zaz6OFxZM1b/AGUwn1qrX+dB84YRDjMdHjYX9YgSoEPBFxhlEEhOWSoOXnoW+qFF1ZWcJnJnU9PQo85IUqPFcHpzpIm+Zl8yxXukfDSf3F7O0+nRL6SQRdEOQwxli4iGfLBA26rYuxqmKuoU1xR1UcZ4YxXkJEorkZNYL//QR95o2KQvqYQ3XsKfSHrMEK+n2eiF6XELWaAxDo7z8X+ArAXtAcI2NO2JtIVqS01jVxUnidHkWmU22VnRm+JGkoocDnVp0Wa0jeVPMdvyG8N59WQOtSNS0TIyt/M7JF8REO9EFYhPwAH8N26Szg+NzCPNnzZxyIHTmrJ1PqZ27GjH4ZleI7niAvrs3NR8WckEf4GRQB3VnBhgBbdakuvDE4AKwHwS/WAXQzKPGOZqaqrHcIpmldlDjy55Z78Z28LEEJrmM/en/MLYVtO7fFpCSe9i/chYTmU+ObJeINdJnWgiL3kXdvHhIB6oA0xnUAWMcnihWi/J1tQULdsM2UrJGzuvPH+hXl7OvfmSVRd7002H5zvIuK+T9dhsldi9dv9VBtV31Y/Nqu3oqK5tuobkXtTnI8g8SQxzxcmseSYuMaeI3VQV0+uto7Bqep/FpTqsSce1Dg05rZdQtdhUh0YX8sAac2OhRmNzK5itOsNht9K48chABQS9qEeUAHQJPBy/EhocrLkd6ZkznK27s+udm6dlm+5Gfb22tlfZe2MztzzhfsGfxUcqHHSzht+w+LXWrpKe0S+aqk2CW+srrwKjgiKPfh0BKRgYJLjIVI2t9sh/facwZ9g7oqh6uqPgqf7a2pDsE2NlO/OR/bVX7KG8t22euRvvlDqa3e3oxckZzUvlkR2loLDDgirqESXAfIPBvC+OWustZNcneXcK7D+8Iqkox5HvpL0Ij33KfnXgen+9p60oIbpgvazmsPZoYvY78f2KOX6ujL0nj8ny8WYRgAygkIh6RAmAAzCKtZlUc4hPa1drwbSzufqjHU9OXm3AaK9hzXpdqt/WQ82d3KUq1jK193DwePGN/LA+u9R6bmouOMfIoD2Y9fgjKIp/BNfCEP7i8X2Lnz6HMVpXQmlpb9dU//TUQ3bF0U/hdYidCXFdteVkKEZftjCDIWTOWbHexNfGx5/OhjQoOEsrhphVxu8jWQv9gigm1quQlVjF4SmeJtHOKP4luxkHtKHmHCM7NXl72810l1oj45pP/SnOngvife/GR+KPhOIVy8z9MemJSuuwQRYjXwxZEBL1iBZA7sR7ZUQvdblwGKWnFR5ljawmvpxGnR+xyy0odOWHMAm2Yt0jTXqtf6YdzS3gXHzxOGX/qO+wIUmmo6O/Pq0+l5zwr3B+hXZBBPH+7WqacdKB+Y+nEzPudJ0BpkmeAqVrKScgbP3Jq7fbkcVe3uNtTLlOmRd19HrGlHDqDb004bD95vfjTVE60vr17aw5WBLRXqDD4nH/phiVK93UWZI/sTBBPmHyK83WqJxgU//Ym8qCv+osVfFmyOOD3RRKaGFL4uTxsdLHzyzmwPh8/8Jc8GSWYjGfwYMrMWgvYoNaNq9mEFWxS/2z822ryW6/WjLfuLl62vmpx55GhP8LFwZb9nFl9T6XO3g43t45uEiVPWwbf1/200ZD/MfRRFq4eUq8EHSDdvqFC6SOduxQn44twXTXfcrp/j5zUPVpWp1qVl1i8QGls4Iyk6TVuCBMosTOMmbfr5fRS2TH//Z+nLW/MOcfH9/CKuHWx/87UAfK6RcvRhBLU60wz/b/8UyuulFIbxsUiiv4mzWemTxVtywI906K3R0da+kfSeKe/fz3Kepx2+nnhF82kuhtGxOc3dLBWiqVq2/+H7C0i3pEC6CYGdU2sogBMiW79NNBlnAmOtKycKkxMS7Z+GE1hUyrZXNoCe1KCa37v/76/tf5o3nSeVFfw/ynQaGQMlEvHt+cz6H8huySoAs8BpfTKKd/y/LLWM3uqyc5mRarasrsLP+Qs2KfmfqoyqZITc7uxOBC2/mRdXOb1uPZjxsOybUNIy4VG4f7pQ1lgxMJ5o+n4HK2qEO0AMqIUe9MJaOfUjAd1NM0QTZSeC2zpd01k+Mm+3DVgrXL6WK3ttPL+kJ/Lj/66fiX44HRqcq++e9mp5vaGgbmba3oCfHxU8jkClWAmR1uUs1qTKde2Hraf9o6zqT3L/Dzi16l2BFvVN1uTuAyCtScd8vzeRv7Skq/MxYX2tlzHpaLZwaU+aONNyOawtIx9ug+TH6iHtECmBOF1Yx6U3nJ3vw25sBgA71P3GefubK6qhP56UCu6vvRrl075tzhqNLI8bvjN+9/mp17MxAg0zgf7iycH8jnDjDKTxlvcGjv8wCPwIqptYyyC6lWkyyuf//axPxI6VwXmRH4yTS72OsggJbNJVfEM/sP90cazgd9j7qP2j4ezp0PnYZPt/PL2g7HO5jU3WMwG0C5IMJ1QotcMo89xqk3cF8OpQnP81vPywZZ9PQvm1Ivt9id0dE8XmFZw8bUhnD+543O38c3ZoU/HZ7fPKYJuz4u0U9p4tUVfwPDX1GHaAGupVsaRybNcAwqTIhSghc/HGwX9Q7MuN18GhvzSpDVWNnlb8kNL9Ueyd+fOp6aDx4fOacuvlsIb4ig8xemyuhzzp0c1m+gHKEd7ACVpsO2vg8L9M3bJYfsBE4ZRnsTvDF+0s31OJt1gWCP9GrtB4kT2b2Ss8WgI1JwVFKC0nxZwxvHwo2C895zJfFKGhmP/rYCmG5j/2SZumeaYbQbOj6u5J0m9YGSEt9ZMdA/ypp+cUcARBEI1tdud9EY9KN31ZTde+eSa4cj5/PHQbP8+ZziBdau+fhFrKEKuD53LWPGT9lGr0b4OfTO5yS9cGNqH6czl8eqTKpMvvOPm4L1dcErga7AiLR4PkBZMmPx3aO5i7XzY6OG5xtl/JDgsRFkiijqESVgcATMg7CHdfoHlqzPPPnAiCRdTjmZ+5FeoFlEi+CXnt0TCJ5AowhuRvicPz5cdJdtonqb9fWZjIzotgoblOg0dv4R3KhGWxAMDouXkzR8MvSJF+XLTPLypGoPHC7+MuftsqKYYU02Zar2rAH3WhfcTbR7SpkN1ow2s6R0938mFhbqEvv7Gug8FvM/4TxT1CFaAFMiMcJfvkau3nYgdtHt26PoA7c1eD+dv1NVK3DsurO735edhwgSlDbsN87LfctNXG1WXRLGM6La7OsW1BvmeE1CkDCATUQ9ogS4bIDDTFY/e7FF45U+0lIDThROO/39ffpEaHqgYNjt8Toix1v3peCRd2VVxu0DvTLLfq9bJitb3G2SS5TqExgNcKsI7fkITFs4fKq/6j8j1AqoGvnxE5X/XKPkvZvqPGoa3Vz/BxIer/56MHjn5GtZ226A8fLE/egwn2lJk3DrtJUVmrh5vPhvIPeinrVgvgFR8pQm+fpuSEmwSik5yF1qvUBQclotqbyWCDLW+vc/Puecve1dVmiVTSvTIRm8/XDgq/s8RifRzTNnxrgtfx7Zo0bdteCREixOq9f59cvH0bbFsr4r5muZgq3egKbMZ8pnaxFbsZ53R0nj3fvnI7IjL2X6MuOz1YcMg4PTonVv2OoP1zEnFpFNSLQtIoYlwANCD/xVt54nOw7Hdc+Yq8hWCVLTc5ZvBL5c3Qxc+5KpbRgXM1M75tnP6pglVUaahsfQwolxgd1+VfVVdhNTYHIIgh0EG6oAyoTDLYzXzj2FHdnNEm3vqPLOptUtqcagGxoKt5e/fHqux22ONniZ7h3V9rCX+7mtTJ/PORTuV0tbyFeMMhsH32PAJBMeeRL1iBLgXBuQwF4xkpoM285jfA2KumsUuva9sor2CnGjJ6On21KPk7m3dOaue7Yx+njVlK30hj1eOzJY3mw22p/AbxTikeSL+moQUCQ8t4AV44e6xgYElZq9dYsrTNl8oq2hntlTdK6ncPv1I6tdTnfc28jS/sdhFk3qvLa+8c+HNCtyF7+/g0L9L7g/DUY6qI+1EMciAKUq6ixFSewNW259eBQbm3fL0kzXZsDXMSjolqFRYoxCrOmms4rCgs5dGfOpo/d1BdTppSbxdg63DwgApv3oL6JAY8ARsBj2gXQoW3LS8yTww3JpbHfGfVt1Y6tgnR63WhvzG5LqPbm2mzqNz3eNUnILbbysLGQUNRb4EwVjcNMNSAHVIeoRJeDxkAUchj/4b6vCsbgKhc3RMxdvfyvHob2hneU8bbkbXtvLX3Xd8yRizkyydb18ZlSJ0k7u8h5LUR3c6v8BDZHTmqjXEcAD1hIgDBar5JfCLZFWubdiwcnu7CLdf7YV8fIL0Xx7Tzni7TOVbNtYLXbL3WxDV3XPuGk14llyZOUG0hD6FTzHjSrg8XFQSOBICYMrckrvdi3RuJduveN7K/3e5snbk4BntzbzTj6s6gZIbA75RQ9ZOctL54aRXIiyxilsIQFIAccGePSDBIggOgQHh0vNRu4rH7aDeuylvj6z/+qbemPoYGs1ImIzQOFr3qPV58/UJdKzYhzT5UgrsgbBnX1I4oaCwCvaGz2wmMEdfygLnnAeZ2qbHbB8sHrvIEb33pbyXs/ml1jlHyNOTk6+fvmi/akmzHFbJazl7GymqpUPhABJAjQE5iCgnX4BCeBZ0CZwcoTFXvdK17grEXRb+9PywXLy5smXtx8+RHw9UT450f6qPfRpp9vBU8M9n5scSRPCOQg8zAwkAS4mhrJFYF0G7gU3/KFSwbuPiruf/aT9ZOaTgJyI27fynj37+kz71vOh5b2dT9sK6bbp6bY6Z8HVf4cNAXuYu4EiUN96Q44owUIA+UB3x2B21c0MXR0CYwL2Apbvra6uPh8KWh7a0e3Zjgnc8bT0S1VsaakagyejLqwBvAtus6C99gtVikfMAidYwCSAEIGY2Oqqty2VGah7sHw7SEIiZifaflvjhkqsq4OXl0ViXesxeBz4JDwuCz7AtSBwFfWIEkD6BHzAoA8yQxhBxycY6Lj6ZU3qdTtmSu1k7NydlJTMckhLy071MvQwo8TDBlAEaI2L2IL5S9QjSgBk4J9bQDogRqCzYB9An3lAJGZl2TplOehFq0Rr+MllS2evyLsMy9qZ/wxMB10QqYXAqaB7wcSH+q4usACShC+SEHQSJB/jrlx/aEUikaRtw5ykV0hO1k4ePsmaVDjxgEkO+BOWAKshjC84QEF7XwH4E6CNA9aA3gIiBtY2KAvki7t6ne2ib+ShprMUatx7fIUA70I/hC4Im0EtwGHjhZuhCsgCVmbkAudY8Ab8gtAEqscTMAQCDAqodzASgaIgxGEb+Bn8iEgk6hAtAAaQGx64CxzFimatiBiAJGRIEBkA8T2kkP+fMUAzRBEYkO7ARdQjSgCcEPVDDwP0YHWAwY/IgvCHf5wI3QkwBz9B+kAYMBaAqQFKD4UAv18hoGwSRJWQPbgAftAMyPFZxMXgBSgaSAF8DD4FkxwQCNoBKSFAVKgJqA60Y+QSl7jEJS5xiUtc4hL/HyAm9r+XXnYR5dlv2QAAAABJRU5ErkJggg==" + }, + { + "name": "Scanning from Orbit", + "description": "You initiate a long range scan from orbit:\nThis planet has a smoggy cover that blocks any good look at the surface, yet it has a mostly survivable atmosphere.\nThis planet has zero life signs.\n", + "choices": [ + { + "key": "choice 9", + "name": "Stash that Report...", + "exit_node": "Planet Start", + "delay": 0 + } + ], + "image": null, + "on_enter_effects": [ + { + "effect_type": "Add", + "quality": "Long Range Scan Report", + "value": 1 + } + ], + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkBAMAAAAxqGI4AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAASUExURQAAAP///1lWUqwyMmlqakZHRwPX/kkAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAL5SURBVGje7ZldbqMwFIXtKnkvO4huyAYmG0CWea8i2P9Wxv/Y2MTYvjBVO4c8FET8+dxzDW5Ldqr73Hcf7fbemfwu+p1tkM+jILTbfeu2stNbDDSkklXnzNRbyUqUqbM/oVr5AFhOus5iUK3A/fmEW0BRHjCtwFPqj6NQS6GIVu5PTXEXnJUOjfLxXEOITYWitXECQk6BUOx6pSDkKAj4F6mrFxLEdNctAdl8gJVmBRBXy6tXcrScwwvXsufikXIP1qId5t2iz0D4osFClAga5MJDDbJaEUDJjF6eyZohxATjlhym9kkcMzhkIBQJ0g+pe2klJFWtG4DrgRSkeEUkjDDWA09TbPJdM6RXnySlDnLpYyO9/GhtQChthYhSMXeyup0aSFkoCYirVqJkdcnHEMaXakVeHIQUQYBPwSFdMB86IEBYolrAtyi1kF4asOIT40Ekq4JVQvS0R3UYI5G5GFLYwuKRO3l69dMEkxnc5MR8K6RCF9VL2sioe2tdLc6GRggROUDve5lcA9usXpw0So4Go5OwE0YySqutED33eZKH12TSyJJTK0RNFx6LFb4yMiI4uajJQmxlWT3tTsybEfxUnA0t9miGmNnCY54DMxNiJu7V6HLx89BO2iHLhIUXPxUleWVjf1SiZbvCHkEuLqX0brIM4hUfwkxERkKvdiPhxksGw3UuNpERmpuLeKGoBRM8k5WP/gsBsnrkAphUVGOJHeuIwPBDMcks6vmAUazkbtjXgAIhqVW+QHAYZHxnBIkRheKbGbAgJH6NIAcitWFlwmQQck28EzEDUdqwQnClrIxH+pA63od1EpgpHiP7i3ccSjEj/yd258SYqendLCR0UfcCyUK0B9KkbCYNBnZLRzIcC9HNdSzDODkYoraOB0eim+vgSIjcKM4HM06J5Hqak1Mi+d9ce3VGc5Ef01zXM5pLQN46oR0O5G0kKP+9nM+CfP1rSDqTwqTqmqvQX91SLINcvzGkLJPrCev9HMj8oyDk10MI+Qt3vM7Ve2h01AAAAABJRU5ErkJggg==" + }, + { + "name": "Orbital Descent", + "description": "As you descend into orbit, you see a flying object headed straight for you!\nA garbled voice begins to call out to your drone, but there's no time to decipher it!", + "choices": [ + { + "key": "choice 2", + "name": "Blast the damn UFO!", + "exit_node": "Tractor Beam", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Tractor Beam Turns", + "value": 2 + }, + { + "effect_type": "Add", + "quality": "UFOs Shot Down", + "value": 1 + } + ], + "delay": 30, + "delay_message": "Blasting UFO!" + }, + { + "key": "choice 3", + "name": "Attempt Evasive Maneuvers!", + "exit_node": "UFO Evasion!", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "UFOs Violently Crashed Into", + "value": { + "value_type": "random", + "low": 0, + "high": 1 + } + } + ], + "delay": 30, + "delay_message": "You attempt to dodge the UFO..." + }, + { + "key": "choice 7", + "name": "Do NOTHING. Jesus take the wheel!", + "exit_node": "FAIL_DEATH", + "delay": 30, + "delay_message": "What? Why?!" + } + ], + "image": null, + "on_enter_effects": [ + { + "effect_type": "Add", + "quality": "Garbled Transmissions", + "value": 1 + } + ], + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAKgklEQVR4Ae2dW5IbNwxFtZFswouI//ORqmwgNbHH9sayoyxGKcz4jiGIJAA+ukk2VKUCHwAJkveILXvGvv393/0e73324PfPn++ld5y176xvsWG+DZt9v0pwUN/s+c+WXwCy2Q0agPT9wAtANgJEgyNuED88AUgAEo9dBQ0EIIXNme15WMtHu0G0+Oh/vmECkAAkbpCCBgKQwuas9Imq3R7x/eP5drCcbwASgMQNUtBAAFLYHMsnzCw+2g0yS56r5RGAbACIBkc8XtU9XhHMAUgAEo9YBQ0kAblXvla7PnfJN26Q+htC08ADIJVcPIVpk0Z/vwO1wBGPWPX7/QbIk8IbGwKA+gPx7p0FEO+Y4f/r/G6NLCTDazc4ORhrrB1317h/vnx5+9F2aSU0u67/iHVNAQhjQC0esSmrzCFByNVXWc+MeZ4GiEpCwWHGjTwjJ3lz5Opn5LbLnIcDUtC9q2uXA6hdR+62kO2140fc+/eQQwBxKd/hfOVDJBByNwZvv/Ie9Vj7UEAcWq927bEJK44hb4pcfcW1zZTzEECq1V4ZONOGHpELvyG0m+SIfHaeYwtAiKudD0muLXdbpNpl7E712+12t75r170NIFeCxHqD1Ipiljir+D1+3rVtBcgVIEndErk2rxhm8U8J/v7b7W59p+J5m2ed2wGyOyQEw843CBcyL1vhkH58DF62QrIlIDtDkrstZLtVADP5cQHLshS+tS7H4XXL2rcFZEdIrDcH+VkOfyYfLtzacgoabSxtDwKQwi/LaJt3dH/p8Wr1G0QTsqefg6LFaWcYgCwCSAkOebNohz5bvyZiTz+Hg8parLYXAcgigEgISnXt0Gfr10Ts6Q9A6MuF4TWbCFryKcGQulla5jo61iN+zdcLB42nrXeqG4Qna2Ag68LH2aGcgiAHzWrr1URv6ZdgoG6J1fZrCkC0JKnf+rKMtZKPBw6CZqW1Ua4WEed8AELK5mJku7ZfpwKiJSf7U5BIn5nqXnH38J9p/ZZcpGC1egoG2aaNwfu1HE8DREtsxX76BNfePSDY5fGKzpiLVStLEGRdi0/1azo7BRAtqZX6c2I9o32lfUOuKdHm2iQQqOf8tXbkULIBSOUf82o3hbe/x81SOuhZ+zQR834AAcv7vGXrfhwOiDWxWf3OuBks8My6X1peXmH38s/lxccnnyH/cFzqyzTaconN3u69EXr5W+AAtLPvYSo/Lsijyqk80PaUAzog4NEW861iIb6V7Cp7S3k+CdLxW4I1sdrePI3JA0bDQePz+WYu97oBeo9juVFm3leZ25MgC4DguwesJ5Z85dy5+sO4KaeRoKTmm61NitoiyhlvmNn2NZXPgxgLcJAfwID1xKbmLrV9jF1yulqfBGOleg7iFc7wQ4yDAKndg7e8aoN3ivOCkBPjrO0rnJUFEtwcZC3+Pdb98P+D9BhwtTG8cKzmD2hXOBeL6C0+Pdd6WUBGCB1inNH2FM3osSwQ5Hx653ZJQEbAscKYvcUzerwcBKn2UblcDhD6dP/rzz/enmGlqKl95Pvsm2WUiFYcl0NWyv8ygECcJQAIGPjlLKBCv6yjXdrUvIg90pbEcKU+DgiVc2u/BCAQqxQptefeJFrEjbAyl9HzYfycEK7WLgFBXe7D9oCQuLkYa8WOT3nEoy4t+qWFn2ynOs8PfiOtFMFV64BCWr4fWwPChUdlEqP2JmFyH9RHW8zJc6a2EfNyAexU5kK3rovHyDKNsS0gXGiAo4fYaIzUG2JGH+otFmvAmL2sVTyr+aUEbl2DjP2oWwdYyQ/C4pbElRIrtaXac/68HYKtjU/FIR9usY6UP8/H07/SeVpz/RA1+5EVayz5peK3vUFIOBBWjYik+FFvtR4Ry7yxHrKteXiEs5JvSuTe/B/G8Aav4k8CgqBaRClFOqpOOfI8UU9ZrAuWx3nyW+UsvXk+CPznbeIdg/zfxqkJXCGGRAMBeUQjxUaxPd4YF2Oh3mr5GjG21a5wjrU5doOkNoHZ40gkEE+rCBEP4Vnr8GuxFMvjc3WslXLk/qX67GfYml8KEmrzjHuZ7yBWccPvKGsVs8UPkJC15u8Ry4q+rZBcAhCLuEhQVr+c+BCPftR7WBqDj1OqAxRLHiuK3ptzCySXAARC4RZi420jy/JTXc6Pei8rIcmtzSu2lf1ToGjr2RoQEgUJpVZ0EBXiUfdaKVaMN9piXrI8Zz6vJpDd+r2QbAsIHSyJQoqDC+WocimHUh/lBzEjV2+d4miO0jy7QaCtxwPJ1oDQRnFheMUl/SFSq6V4Lk6MB4s+1EdazMX3A+vQBLVjvxWS7QGBCM6yKUEil1IffGABj7UOP2kBCm/fEQDLmiyQbA8INooL4qhyCQDelxM/2mst1ol41CUk2KMrWg2SywBChw+BHGGlCPmcHA7efmSZ53BFMPiaS5BcChBsyhFC5AKU8+X65Cf9yDrlgDywL1e2OUguCQgJQYq2Z52LT44LUcr2M+qUy0vF/2to+adpV4QtBclpgPB/Je+szRwlyhwEufZReWjj1gBigYP7eM+Wx3rK3nly/k+Q5BxHtnM4UB45n2VsTUzW/hwE1J7rs47dy49uDXp7AfEIVvpqZyD9a+vaPJb+B0gsAb19AAW3veeoHa9FhDkIcu0tc9XGAo5fgHw1/XRrrWB5XOpMeH/vcmo+T9sbKJ6AXr4cDJR7jd1zHK8IczdErt07fqs/h+Ply9f7y1cbHLSnvV78fHqNWRqHz1dTPuU7CKDgtib5o2IswuS3hCxb4kf6PIJBj1cEx+v95fXVdHvQPvd89R5Py61FJwGI43+5LYkYUMDS9YxyKW5032xwaGIe0R+AOETeslkyFuIGCCkLnzPsIxzvj1TvN8c3881Ba97hJc/OWo8bpAGuFBCy7QwwaM4kHK+v95dv3+8v339cDhCC3AoF9wtABgIyDxzv3zdq4CCx7PLiwreWpwGEvrBbk57BT94Usp7K8Qhgnm+OX3CkcrK07QIIrcOyXu4TgGRuECl4T51vsKXcC5wUHJb5Sz47wbEMIHQg/I94ebl0WEf1AYZ/P326l97wk7ZHnl5oOByt8+8GhVyPZ39OuUEoQQ4FL3uSH+FLYi9BIftGwDFiXdqYUkQ717W94P2nAUJJcDB4mSd4ZNkLB2ABJEfm2jLXzuK3rM2zdwHIz+8gEDlE77UU79n4I3wtYrmij2fvTwWEEuU3B8qeBfTyrb09ANIMgFxR7N41e/VyOiASEu8CevmvDohXKFf19+plCkC8SY/wD0CugYxXOwEI+w6Cx6Uae/Yj1jXkXbdKLxTcPwDpAMjZcNCBxiu/A1zw3vI0gOALOlnvInr5k9C9j1qI6ZVD7Th5eURP7Z5S3BSAcDhQbllUayxEn4OF97fO1Ss+MEjvQOv+BiCZn8XCxnIYUEbfTDYtj2htPaMARAGkdYOPjN8VB+yhd32Ia7FTAEILwKPVmd9BWjZyhlivgFbwl/tqzVnG1danAaR2ARFX/h0Hq6Bm9JvhbAOQjR6xrILqBQPm6zWeHAfjn2kDkAsCMkJwUtwt9RH51Y4ZgAQgp/29U61oj4wLQAKQAKSggf8BsnyFPjzLbzcAAAAASUVORK5CYII=" + }, + { + "name": "UFO Evasion!", + "description": "Were you good enough at flying to avoid the UFO?", + "choices": [ + { + "key": "choice 4", + "name": "No, Back to flight school with you!", + "exit_node": "FAIL_DEATH", + "requirements": [ + { + "quality": "UFOs Violently Crashed Into", + "operator": "==", + "value": 1 + } + ], + "delay": 0 + }, + { + "key": "choice 5", + "name": "You barely avoided them! Nice!", + "exit_node": "Tractor Beam", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Tractor Beam Turns", + "value": 2 + } + ], + "requirements": [ + { + "quality": "UFOs Violently Crashed Into", + "operator": "==", + "value": 0 + } + ], + "delay": 0 + } + ], + "image": "default" + }, + { + "name": "Tractor Beam", + "description": "Before you have time to think, your drone is captured by a Tractor beam! Now you've gone and done it.\n\nYou should have some time before you are pulled in.", + "choices": [ + { + "key": "choice 6", + "name": "Decipher Garbled Transmission", + "exit_node": "Deciphering Transmission", + "requirements": [ + { + "quality": "Garbled Transmissions", + "operator": "==", + "value": 1 + }, + { + "quality": "Tractor Beam Turns", + "operator": ">", + "value": 1 + } + ], + "delay": 30, + "delay_message": "Decipering..." + }, + { + "key": "choice 10", + "name": "Look at the surface of the planet", + "exit_node": "Looking at the Surface", + "requirements": [ + { + "quality": "Tractor Beam Turns", + "operator": ">", + "value": 1 + } + ], + "delay": 10, + "delay_message": "Looking out window..." + }, + { + "key": "choice 13", + "name": "Let the beam pull you in and dock you", + "exit_node": "Landed, Kinda", + "on_selection_effects": [ + { + "effect_type": "Set", + "quality": "Tractor Beam Turns", + "value": 0 + } + ], + "delay": 50, + "delay_message": "Getting captured..." + } + ], + "image": null, + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAIOUlEQVR4Ae2dW5JcNwiGewdZQNbgbcTbyFM27ZXk6aTkmDJDIXSDIySYqi5dQQL+r0/PeGx//vnxPPnKHKQGeA18SmJqX5k0PmmZlzh5+dTgoPMpijiiyFr/rnU3IBSYMs5EZg5u18ASIAlNApKAcBRMzN2eyIzvzjcL9SfICDspqjtFdVNdtwKCYbopqRnLb/BxjXH/lBy5AQQnr/RPSWD0e9K69Y5PyZtbQHCie5KJ95d+j03uGc8TzfPs+JTcHwEILgJNLF5r9altjvsBaeV2dP2U3B8HyGgh6P5TCuPpnjSHGmNP8Ul3SUDyd9HEj6MaMHA+JFF6WktAEhAWEE7UmnOeIJDukoAkIF8A0YRA8iWJ0tNaOEBK0TwVwNNdJEFrr3mKW7pLApJPkJ9vGNoAtPxJovS0loAkIAmIoIEEREiOp3cy67u03vG9rFvngfoPBwhNQI7//57MCwAr97CoZQKST5AtH7FWQBixXYUmFCCrybrZfkR0J+8dreH1gIwmJOr+k0W/cvdWva8EpBV0rvN/FrQitNtsQSPXAAIBZcuLvycvt4lcIx7x38XSOMDKR0/Bc88YLFa1OtnvT0BASN4CgXtlOyb0lXx508Du+3wBBBL7xqXgrFPbv75/fyxfu/LyRu1POoMFBIpjGQiccVJrCUTL95t5sqz7ab5FQKAo2kGB31PalnjfXn8jb9o1P9VfFyC0ILPBUj/ex28Lf/Q86/zN1vkmuylArAuz2/+oUL3t18yfpdjLPb1/JSDod7G8CX31PhqgaAuY3knbv7a/BOQXIKti9GpPBTkzXhFdz3kr/q1tE5Afj/jj2m/fvj1Wr7eg6hFpa09LiC17ab3le+d6aEA4gVrB0OuXu5PGnCTQ3Ws7AWidHRYQKrpeAe/YR+86O94NgnR+S6i71sMBUhPXDuFrnlmLC89LAvWwtgsC6dxQgGCx4L6mUHf7wnFxfQ8g1O4gCXXXWhhAOLHsFrPl+Vy8Za4mTk/zu2Dgzr0eEE4olsL04puLG+Y8wdBzF064b81dDQgIgrZeRGx9Dxo3jHtE6XXPG2Dg2K8FBMRAW2tRevJPY8djLIIT+1qgtGK/EhAsBNr3JGDru9DY8bgljFPWR0CZiek6QLAIuL61KD355+KHuRmxRLS5ChAovtR6ErD1XaQ8RBT7TMzXACKJga5ZC9OLfxo3Hs+IJaLNFYDgwvf0vQjY8h6tPEQU+0zMIQEB8VgKdLdviLHWzoglos3xgNQE0Jp//vzjgZemmD+fz4Nfmr57fbViL+sRxT4Tc0hAAAzNFkPB9XvFvbKvBwzYMyOWiDZHAwLFHmk1ocC+OCjwHN5r1R/JQ0Sxz8QcChArYWIQpL7V+eA3AdH/FyjDAAIismglKPCaxdngM+HQh6M8cY4FZEQQICKrFkMg9a3OL35H8jHzUSOqTQKCfpo1K2AJCrw267/HLgHJJ8iXH02OCKJHYKt7MAhcf9W/ZD+Si6hPgtm48wmi8AQp4uWgwHOSwFfXEhCbp0eBKgQgRUCrIuy1x1CUfq/dyr4EJAH58vGqkD0iCrp3RYwebWl8tfHsx4zIdmGeIDXReBT86J1qsXHzkcU+E/uxgJRgOQFozI0KdOf+mXhnhBLVJgHp+K/UdgLQOnsGkGITVfCjcR8NSAl2ViBadi0BW66vxjAqloj7jwfEAyScUD2Dge8bUfQjMV8BiFdIsBChvwoO+NFsRwQTbe/RgPz79/Pgl6ZoovmKJvzeeI8EBEPB9aOJWzPeXuFE2XccIBwQdA6KpymcSL4gf9ke9qsmFARpTIsbSeCrsdLcRR4f8wSRYODWpKKuCiiCvZS/SGtHAMIB0JqDItJ9ME/bCKIfjZHmKOLYPSBU4FrjVrFHxXTr/laebl93DYgWDJyflcJ6gIHGZHmnlVydbusWECoAi7F28SxFCr5beYB92q12rk7x5xKQlgi01nuKRM/qsaF7tMRK78KNtc6ifmhMUcahASkCqxWaEx+eq9nReWwjnUft6Jj6kcZU3FpjeqcIY3eASIW3WKsVuXVWzQ7mV+3BT2lbvui6FhCcH3yvCH1XgNBCvzXGhR45E9vRfssP3c+NWz5q65ywNee4u946l4Cgj1k1wdXma6Ko7afzq/bUH4w1YeB8wf8LWLv/TfNuAIHi7mhLQWfO5YQw4ofaj9jW9nKCtpgDSHBL47lh7AKQWrG9z1MBjN4X24/a1vaDTwsosE8MRq0Pdzm53Q5IrdAnzEPhZ+9a7GdtOTu4D7RY0Bb9Ghi1ebjXSe1WQLginzRXCu3lvpzoilAtwACfNRB657k7e5tLQMjfSuwV/AlwgFBB0Not+NdqvcFR7rMNkF4h5j75KcWJihOsNhzgjztLY46La8fcFkBS9LLoe/LDiaUlTBC1Zts6U2udi/eNuQRk8iNWj4gt9tRE0SNETTDAV8+5WntqsVvOvw6IhWgi+JRE0CtAELVm23u2xj4pB1ZrrwISQcgWMUrFrwmP3gP2acJRfL35JeXBai0BcfwRSyp6TZgUDDo+DRApB2+svQYILVSO5W/Ua8WvgVHme3LqHZBa3LvmExCHTxAJgtpaDxywxyskuyCQzn0FEChMtvK7fE38rfnRvCYg9b8oR2ExB2S0eFH3tyCorc/kyyMgVJhexgnI5o9YNeH3zM/AUWy8AeIFBu4epoDMFvBtu5KYt88s5618zd63nKkNSPG38sUJ08tcaECgCLNiW7FbEdTquZ4AgRp4bcMCgguyIrhR2xUwiu3oeXg/nJ2AOPkmHRfHU/9EOFbzB3BA6wUSXAuP/f8AHPtbaN2iPfwAAAAASUVORK5CYII=" + }, + { + "name": "Deciphering Transmission", + "description": "You review the incoming transmissions your drone has gotten. These aren't in need of deciphering, just un-garbling it from the bad connection...\n\n\"You are in Space British Air Space! Identify yourself, Tally ho!\"\nWhat the fuck?", + "choices": [ + { + "key": "choice 11", + "name": "Whoops!", + "exit_node": "Tractor Beam", + "delay": 0, + "requirements": [ + { + "quality": "UFOs Shot Down", + "operator": "==", + "value": 1 + } + ] + }, + { + "key": "choice 12", + "name": "Good thing I didn't blast them, then.", + "exit_node": "Tractor Beam", + "delay": 0, + "requirements": [ + { + "quality": "UFOs Shot Down", + "operator": "==", + "value": 0 + } + ] + } + ], + "image": null, + "on_enter_effects": [ + { + "effect_type": "Add", + "quality": "Commercial Airliner Transmissions", + "value": 1 + } + ], + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAALM0lEQVR4Ae1ddegGSxU9WBio2AjPFluxAwvEThDFVp74nt1iYHd3FyZ2Yj1FfehTEQPrmYiFYmF3Xjmw+1jnN3NndnZnv+/bPX987Lc7s3fuPffcuzGxAGD6CQNxIMmBZIECR8lDHFDmUIIQB1wOuIXKILqKbJ0DChBlUHHA4YDAccDZevaU/SKHEoQ44HLALVQG0TPI1jmgAFEGFQccDggcB5ytZ0/ZL3IoQYgDLgfcQmUQPYNsnQMKEGVQccDhgMBxwNl69pT9IocShDjgcsAtVAbRM8jWOaAAUQYVBxwOCBwHnK1nT9kvcihBiAMuB9xCZRA9g2ydAwoQZVBxwOGAwHHA2Xr2lP0ihxKEOOBywC1UBtEzyNY5oABRBhUHHA4IHAecrWdP2S9yKEGIAy4H3EJlED2DbJ0DChBlUHHA4cDhgnM6wI4B7MKAneUAMv0ZALtA9zvTAehL0pwdsEsBdj3AbnAgOjtkr7kaHkaAXAWwxwB2EmDfBex3gFnw+ztgPwXsU4A9BbAbAXbGHTn1OoA9FbDPAfZ9wP4Y6Erd/wLYTwD7aGfbdQE7dUN9T9MllCsDdnPA7gHYYwF7KWDvBuwzna5/juhKfT/YULeZSV0TCKlz9jdALgPYazvSh8EwZv91gF11AedeC7C3APabBMFKdP4XYC8E7JIV+l6sC0pi9iHAvgzYzwD7zwR9hjp/vkKnPSZ+KiDC4/sXIOcF7MUzOXXo4I8Axuw5t9MuAdgbG+j7dsAuOELfGzfQYYgfr4RzY3cA8vbL6EcC9o/Gjr73jI5+bmNdfwvYbQv15VVySOi5//++UI8DIP2YQN+fAHlBYwcPCcPbkKmO5O3UUGbL/88q0PeiC+gzFbMDPH86UeYw+m0LODck8PMLSBez7VyAfXIH+j48o+/ZFtAphsfKj+0+QD62gGPD4Oj3H5ohXej8MwN28g71vUNG396uVttTZdoP8VrB/m4D5GU7JFtPIr5eLXXke/dAX/b7pPTtbWq1PbfTdkqnAz+eBru1YQ/ZA7KRSB8udPqz90TfVzr61gQG+46eDtgjALsnYLfr+pCuBtjFAWNQsFO2NR/2VP5uDL/6npCtJ9RNMwS4zZ7pe9mEvn+o0PPbCVl7StilA3U3AfKeCkf2ZG6xZe+7R4gv7pm+b07o+4MKPRlUnu0bL1seHI7rmYvkqWERNfLPmiDK3WbUl/0aNbqF5/w8oeuXKuWfpxvTdjnArgkYbX4iYByF8LhEWxsJnOUD5IRKJ/Yk+R5gdwGMQyvoJA5U5P0ye577OjXbWyWI8M2Jcr/QjQ3re8XPAdh9AZuKw+Uj+nJcV43t3jlviLSzkeAgv5YNEGYqzxm5Mg5Y9HQmyf9d2UasX2Rq7/SbMvoeV6krcXpQRPZbJ8hLYf+BSDueD1ZW5hNubmPvOsGBHy901O0r2/h0RD5Hu6aIkztO8pfgx76YnKxYOcd/hfI5MjdWd8qxz0baCdtd8f5RkFsay4fLGmfx4XOMXiT72Ha+FWmDQ8DHymH93EN/aMuPK9qJvZ5+UoWcnH3fieAS6r/i/XHEmwoE5z/kHBIrf/JIJ3G4d0yOd+xXQRucP+HV98pKrx49ni+vaIvPNv35/Za3XZ5eNWUhLn1bG9keBbml4X+tdCDffI3R644V7fw3aIPD7msIxXMuFMjK6f7oirZiV9Upt7ApWzmfJKf/isuXM57jmFJOyB1nj+4YJ9y5sq3hDER2xuX0SpWP7Xmuedb5RQSTm03QOWULj4/BfmV1lzOeY4g8J3hl1x7ppIdVtPW3oI0p/TXnC2TlSFPzcB3rAb9Ghd0e7n1ZTv8Vly8XIJx51wM+dpt7vRs6iG+8xrbB6alDOVNm6LGfZigr95+z9cbqG3u7xCvtWDkl9cdeEXP2HlD5OEdOMYwrZJQ4I1aHnYOnLyQdR+fGZOSOcRj70L4rVsphOycGsoZyw/93qmwn1j9xzkpZOWz4PBbqvZH9ZQ3/5wQHvr7ASefvFivIOTxW/opAPpcUitUrPfbMQF6MUJwj/8vKdjg9OZTJ+Rql+o2pd+lIW2HbK90/CnJLQzm0eoxjwrpcnoaZPaYje9F5pQnPKd0P537ztqL03FQ9Tu29SEJfjnfiPO/UubnjqZVacufVlI99Boz550CPxcnWyph3TiDE0LGcD853/hyGzlek759BLsdIhXazr2HYbu1/Xv3uAxhnBD6h60islcXzvL6JKXJ5Lm3mMxyT0au7cWRXimATYrXS/aOkaGkoFyub6sAW5zPgYnZzAboW7U2V+YyEvrSBC9LVyI/Zr2MO0C3A4TNCjfNan5PKkFwhsXXbY+VzcTlv6mvtaIUW/l6BzHjmbGnY1GHeYwmVq5+6evQYcIxWTsaS5d7Vgzp/tVJfrorS26ztKVic8mcxcK5f6cAWJPyT8xDdk+TYPdKXAwe5CHavW2z7iUp9Uy8TYm1s6JgPdisg+A6/BeHHyizt0KvNymP1ydUvGZNW+yKEC4S38vcBy90NKFcAbM7psjlixco5grbUcVzUISZjyWOlownYn1OjF1fDL8VjWO/+gL0KMK628oACGeztfxpg7+oW2+aKkEN5sf8PBuw1gNE2vg2M1Wl0bNHG/s8w9lvUOHKOc0o6HUPA77VDfUuWHu31JflqMMotStfLH25jK2K+wyEwg5Bj3ob68TbXuzLydfOwPv+nFq0Y6jbT/90FCA24X8T4EIy598dcOUKQ+c2PufXJyePiCaEe3n7NQE3qwHnyntyw7HgHi1SWT73w+Fqi7Qc6bfDZMNSpwf4ijbiGzLlqSI5sz5sB1FoC5nSLlceGk+RIUPtSgUPuc7KH5bxSxHTmMS7rNKzL/7ytTtXn8dhwFn60J3XOQleRo4aEhi2xz6EMP3LASIFUepxDUGpuIVK233pCh1yJzuzNvkmEZCl9hsdrb11ji1YM5Yb/PfLyVX5Yn8sJebbHXhJ4i4THgjBsc4b9o4bMIPQIOCUyueIJB/ixI8wDcmxZq3WduOxQ7QNxygZ+Wq7kQdfDk1+6Ssn3jo9d3ufxTjuxKdIc28bP5MV04HNIzCbyIVafxx6VOCcmZ8KxuGITBEYNHSOvD5QfOuCkQOuPc30orhbiLfQ8Rievbh8onOHXtz9my2nI7+vezszRWcePbo5pv68bGz7v2c0yPjv05/fbcNrAUAafTfp6wy2HIA3r9f/5zUZ+k3JYl/+50mVfp/F2sYaqDOK3+vhFKN7vcqUQLuLG4eGcJ80Be18HjJ9P4BI4XFyatxe5jrSWgPI+m4tyk/BcEYWz/n7dOZirIX4FMH4KjisWcsHoGzZwNBMMX6EzwfBWjauf8OrwnG6B6rsDdgvAuD4yOwenfCGYBH5R13tP214C2GkzNt2y+4Yi/cigzK2LTH/yxco3uqkMY28FJ/p7vwNkonFVQak2xYkBBwTGAAwFVCb7bxArBcgGna5EUJ4IFCAKEHHA4YDAccBRpi3PtGvFSgGiABEHHA4IHAectWZF2VV+ZVSAKEDEAYcDAscBR5m2PNOuFSsFiAJEHHA4IHAccNaaFWVX+ZVRAaIAEQccDggcBxxl2vJMu1asFCAKEHHA4YDAccBZa1aUXeVXRgWIAkQccDggcBxwlGnLM+1asVKAKEDEAYcDAscBZ61ZUXaVXxkVIAoQccDhgMBxwFGmLc+0a8VKAaIAEQccDggcB5y1ZkXZVX5lVIAoQMQBhwMCxwFHmbY8064VKwWIAkQccDggcBxw1poVZVf5lVEBogARBxwOCBwHHGXa8ky7VqwUIAoQccDhgMBxwFlrVpRd5VdGBYgCRBxIceB/bK6VghmpUw0AAAAASUVORK5CYII=" + }, + { + "name": "Landed, Kinda", + "description": "You have been locked to the surface the beam. Robots are all around you, pointing at your drone with all sorts of old age weapons.\n\nOne of them angrily shouts at you, \"By God, Queen and Country, we've got you now!\"", + "choices": [ + { + "key": "choice 14", + "name": "Go out with a bang. Initiate self destruct!", + "exit_node": "FAIL", + "delay": 0 + }, + { + "key": "choice 15", + "name": "Surrender to the funny looking robot brits...", + "exit_node": "British Courtroom Start", + "delay": 50, + "delay_message": "You are being transported somewhere..." + } + ], + "image": null, + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAIT0lEQVR4Ae2dvY5dNRSFzxsg0dKNBBLFKAiJApSKglREoqSDhqFAQihNChoKAiONlCISBUqRnlfhDXgRRGNkyI7W9dg+23/Hx/YqLO9jb/9tr+/Yc+9kst0+uzVMjAE14NfAxsD4A8O4MC5WAwSEJyhvEBENEJBIcHiK8BQhIASEJ0hEAwQkEhyeIDxBCAgB4QkS0cBygHzzlzHaxBOEJ8hSgGjBQD9CsjYkSwKiET0hWRsM0cgygOQIPqeNBPboHOfq2kfPZabxlgMkdfNQbKltW/vj3DR26/nM2D8BiXyCIRuO4pOy3jnOSWzfnKTO5r56lsWvkssBkisUEdoZBCVz0a5F/M8w99HmsAwgdmNEKFph4WaWtMV+Su3UeaT6l85vtvZLAWI3DwVj7ZQNlbYpbWr6yvjaeaf615zrLH0tB4jdOBSOVmxuux4CkHlrxhbflPVp+l3NZ0lAZJNRRGJLXSgXv6OFpx0X/Y6eYyhmI5cvDYjdOFdQ8hzbVI1PrH1O3d6YUo95zjhsc/mp1vKAoCBQXGijj7Wlzi1v9Szj2dwdA+vEdn34fCn6lHgQEM/3ICI0X26DK+UpgS7x9Y0nZZiXjMG2fogIiAcQFAsK0LXRr5WNY9ox8FnsVmOzX/6b9HtXlpgoRJCSx3xr1clYvrzWGOzHf3rYuHQ5QbjZ4Q1xxcpY6WPlxq7G8+GA+DbcLauxsFn6wNjMsqaR1tENEAwSigBt9KHd9026avxPAQgGHwGxNtbRJiRHa6AbIHviR1CODopmvM8ePTItk2YOLX0w/jG75RzO0PfhgNhFS8D3AiB+Nt/zPaK+JRB7fR+xPhkD4661pe1s+akBscHGDeoV/D3xHl3fKg4Ya2vvjYP+e76j1ncFRLMJNrC9NuJo4aeOV0t0GF+xtX2Lv821bUby6wKIDZAEdi9Y4of5XpvS+lShns0/df2lsZX2qeOO4N8dEBtcDJQEO5ajf037bEIvnY8mNhhnjb/rU9re7e9sz6cABIPss48IWqkYz9o+FjuMdczPV4dtre3zmaGsGyASPDfQPYJ9VnHXmpfEGnOMO5aLjfV7trSZMe8OSI+g1hLeSP1gnPcEr63HPme1lwJkJEG3mKuImADofyNhe/DhR2YvSWBHzVuIbcQ+Zf8EEHlmHgZmekBGFHLLOROGMAy+2BCQhN+pur6+NpJExPIcysXvLLlPBCwLQ7P9/uqV8aW9a1fN+lYbVFuUIQhKymvPUdNfq3jP2C8BSThBzDtvGZtKgNC21Qg912dGIbda07SA5IrH107AwFwr9Bp+vjmVlrUS1Gz9XgCC16bHj380kn55/tz40t2LF0aSr96W/fby5Zvku8rZMhw3ZKcEvlQ80h6B8Nk1xJ/ah8ytNE+J58q+0wFSKhwfCHtlqSKv4V+6zpVFn7L2qQDJFc0eACn1NcSv7SN3vbZdikhW9r34mFeuVDb//sl3b9JPn3xh9tLNzY3ZS9gnXr3QxisWjonlvg3LEUuK8HN9tWLP9ctZNwEJf6zramsKQFJFkiv2Fu1ywXDbpcbAFQKf/dAsB4hG5Nu2GUyaNkf5uGDIMwHxC7wU/AtA8BrT2r66es9ICo3157YZSeiDi9YKQyNghMJna/ro5aONg/hhDGmH4SIgr7/8s8L2QYFlvcSvGVeEr80JRRgKjM3QgGjFoBEYghCzNX318tHGw/qhCGiHYdmePv3DSJIrz3/525u5kgTXoTdltq6kHNr+endnJOFV6p+f3zWS/v74fSNJNlQrCI1gY1BgnaavXj7aeBCQMBCiLckJyOsrFkIQs3uJf29cwqEXvYhfkw8LSIog9sRl62NQYJ2mrx4+KfHQCIM+/wO3PXz4lZGEV6ZvH3xqJLUoxz7xWoW2fIJlcyy3m5ciCK1gEQSfre2nh19KPCh+/WlDQCb4FItw6AWf+nIgIACIvPnd00PKz5oTkIaA4FXnSPvLr38wknJ+FytFFNb3rOKuMa+UWKS+QVf3346EAscSOGx+BCAoohqiPFMfuLaYvbrYc9a/JCAoojMJPXcuuJ49O0ckK7fZLr74ky8G3S8B4Us9fPOX2PipFNo4Hyz3bdKeGHLrc4Xao13OGn2xZJn/5xgCovijDT2Erx0zBxDbhkD4gXDjMjQgdjG5AqnVTivkFn6la3DFwOf70AT/Nm/oqlOrHK9P2GfOJpUKpUX7FkBInzXnmxPvldpMAYjdsJqiadmXiDw3bzG3lQSfutZpABkJkhYiL+0zVTir+G+fX31gJIUWjVeg0NVIUx7yCY2bW14qlpXb58Z81nZTAiKbtbLQS9Yu8WN+a6YGBDe4RDCrtcW4rW4HfwaZOTCrCT5nvTPvf8ralgTEF6AcEc3exhen1coIyLP7Xw5ZEcwufu36VgPCXS8BCQDiBgqfteKaxQ/XvppNQDIACYlkFiB86witefZyAlIRkJBYfIIbrSy0ttnLCcgBgNQQ0RmAqrGO0fogIIMAIsLqDYrMY5WcgAwGCAqzFyw4h9ltAjIwICjOI2HBcWe3CcgkgIhQjwJFxps9JyCTAWIFewQks4Mh6yMgEwIim9saFBln5pyATAyIFW5LSGYGQ9ZGQCYHpCUkIqKZcwKyACCExP8LqRqwCcgigLSCRCOykX0ICAEp+jllZPFr5k5ACAgBiWiAgESCo3nDjOZT+1Ot0dafOl8CQkB4gkQ0QEAiwUl924zgzxMk7RMtArIYIBZiQqKHhIAQkGJgRjg5c+dIQAgIAYlogIBEgpP71jl7O16xeMXi/6AUAb82ILa/s78UcufHEyQipNygnr0dAeEJMu0brQZ8BISAEJCdk5GQ6CD5F0cJWniQ8Kf0AAAAAElFTkSuQmCC" + }, + { + "name": "British Courtroom Start", + "description": "Wow, that took forever. A one eye judge robot smacks their gavel, and points their hammer at you.\n\"I will now read out the crimes you are accused of!\"\nIs that how the judicial process works? You dunno.\n\"ONE ACCOUNT OF PLANETARY TRESSPASS!\"\nThis blows.", + "choices": [ + { + "key": "choice 16", + "name": "That's not that bad.", + "exit_node": "British Courtroom, Continued...", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Crimes Committed", + "value": 1 + } + ], + "delay": 0 + } + ], + "image": null, + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAJiElEQVR4Ae1cQbLduA18N8gBsppVVj6B9+MLzA1yn1z5pVBJu7owlAhQoARSUNUvkGADBJvop/dtz3z+8/PzrZ/ioHqg3QOfIqZNTPFSvEgPlEDqDVrfIE56oARyQk69ReotUgIpgdQb5KQHSiAn5NQbpN4gJRCHQL7Jn8/n85WfHZ+nPqy2EciOTeE9084C6XExS0DLCaRH1JvX3ywQ3Hu0UNILBAcv22cAAtn1a1afgW/4Hzg8IhDLQe/EoLF4z5aP1zOOUfMqAkG90VxGvkVuFUg0EVH5WhfV8kXtNyMP6oUd3QPxbM9yWXGcg2Mw5vWr4yUF4jk0SIP1xI5gsY9YefR8JOddMVwrjy37A89Y+NjyOo8ZgzGvt8bAadvCjvq2FYgmDfNRojxxvBePz3JYcbNyYP+Wbe0JnKxhLJYf+M8wwLewWGtZ4HlP+Fr4Ud9yArEeFGQxgdbYqzjeG+Nezhau5ZM88IvlB3749Bx+bYHjfOxjP2KxLnMeY73l7+GwD3CYc06MgcG8tR+vjY63F8goMVfjcIGwvXwtHPswblnkxpqei//s0XGChQ9Wx7Ofx4zTfszF8tPyw8c4HmO9ZRl3dVwCOWEQ5DMEPlhe4zHW2fK6HgMHP+Zi5eG59lligGlZzo119mE/rInV62eYVlzLxzmQn3E8xrq2jIkYLyUQz4FBXC8GOLH8WPw6huNlzDm8WI7VubCPxjCOx8AhrmWBObMcp3G8hjFjtA9zsVZcL4bXo8bbC4TJx5jJg08sHvaxX9Z5DfgjC+zROvuBbVngeE379JyxPAauZRmHseB4jDj4YOHXFuvaMo7X4G/5sCa2t87Y0XGkOCTX9L8H8RyUCdRjnYfXZY3nGCMGc7HRD3Ijr56LHz5tdQzWtR/zqxb5xfYexmLMMfDpXPAzlsdY13GMuTLeWiBCDAi0kAQsW87Bl8AYHlv28WCQW8fAD6vXs81Rp9jW01tvxcDHsTo/1oD12GhxTH+DeA4HrIcgYGF1jp5f1iMf7BedN7LGqFxXzsqxR2NvnTPEkVogEU0G8q1kj5KMfWBH84zGWc8XicNZr+ZEHraenKOcWeOm/Q7iOaTGgiztj55bSerhUK/YHvau9WiuMuW7i0PZZ4pA3krmnRc3ulemu7HWMnrWiLitBBJByFtzWJv1TlyGuwgXyEwCMxD2phpm3mUrd0ZuQwXSOrTVl5Gcs5r+/PXrO/PnbO9au+93vRQCWeXCZwqil3sVjnarM0wg1jcF41Yhs9e8d6+vwtsOdT4ikFWIu7vxvfutwuPKdYYIhN8KvfEKZHkbNRt+BY5XqfGyQHqC4PXspGRr9Kv1ZOd7hfpuEcgKRFxtxqzxK3CfucZLAuG3w9k4MwFSW9bmjqorO/+Z65sukIyHj2q8lfJkvIcVahoWyNkbQ9YyHn6lhp5Ra8Y7yV7TFIFkO/SMZlsxZ7Z7WaGeIYEcvT0yHnjFRp5Zc8Y7ylxTmECyHjKy2X78+PHFD/JifmSBy2Kz3lPWutwCab09sh4uuimPRHDFH12jJV/W+8pYl0sgK4lDyLY0iwdzRQjeWE9dXmzGRsxak1kgbxSHt6ln4b0CsOCzNmS2ukwC0eLIdghdj6VBLJhZDX8lr6VuC0ZzVvP2f2PiFkh2Ii3NcYb5/vMfX8vPlSaPiD07g2Ut+z1mqc8kkCzF9uqwNEYLYxFEDxPR9N4crbNYfT0ua/1/b5RtBGJtDMb1mj5i3dv0XjyfxzMuAbS/UmlethCIpzEEG9H4UTm8gjjCeznQjVDztmBeJxBLY/P/CE7Glpi7MCWQdiPPEvjyArF+cloaWAtDzy05nsJYeQBuVkPtlrcEQn9qpQWh5081v2VfNL7V7tbIs86ztECszWBpMC2Go7kl11MYKx+Cm9VQu+Utgfz/DXIkCO1/qvkt+5ZA4n8/KYFsIpASR7w45G24rEA8DWH59NVviqO5JdcTGA8fu30NmnmeEsgLf0mf2VC75S6BbCCQenvM+XolYi+BkEDw1Uh/vYI/qy2BbCSQf//r88XPldexpykEm7W5I+rycHGF8zfG3vIGgSC0/euPz1d+Roj3NIXGRjRlphz6fEfzEZ7fHjNdIFoUMocwYEcu4agJvP5MjT5ai+fMI1y/OWaqQFgcEMOZ9V6EpzE82NFGfSLOcy5gvTy/GT9NIF5xiHC8F4ELn22faHzrnqNn93L9Vny4QKTRR8TBbxbPZYw2SFSctZFn4K6ewcPzW7EhAmFB6DE3vnXsvYyrjTIjfoYgkDOyXi/Xb8NPE4hVDEc470VENs3MXGjyUTujNi/Xb8JfFshRg1/1j1zCjOZ5S84Rvt8Qk1YgIrDRC3hLU8845yjnu8ZtKRBc1owGekNO8Fc24N9iXf0qdRYfeUFvaOyoM0byvnquy28QIeCsya+szSI3qpF2zjOL+9XyhghkRZHoi9q52UfPpjl64zxMILNE8tSljDbVbnFP8Z9l3xLIT/+flu0mgt55sjTrE3WECgR/i37l945W7BPEjOzZa7SV10f42CFmikBEKK1GH/WtTvTKwkDtq9/BaP1hAkHzv/0tMnoRvTg06pO2V+OO6yECgTjEQiDRbxHJveMFeM/0pEBkb2+9q+MvCYSFwWOIhH1R49UJj6z/KbFEniF7LrdALM1vwYwKJjuhT9V3p1ieOuMT+04VyIyvWSKsJ4haZc+7hLIKH1frNAsEn/h4O/SaHzjERdurB985/g6R7Mwfn60rkFZjW5rfgmnl7vmQlw9R4/ZbdbZQ3sD7oUDOGhVNKvYIB8zRusePXGzfcDkRZ5wpkoj6suf4LRBuWDQi+/S4h8G6EKBjrXPk0FbisxObqb5ZIsl0xlm1fFrNioZsrcEHjFj42HLB7LeMOTfGHMe5a2z7sCiR2HjS/TQsEGnYVvOKX28ic27wszFywjK2lbd8bb5bvMwQSWufnXyhAukRw83eGkMUYmW9l6/WfRyVQHx8SX+dCgSN2mpm7bM0q47BnIUhY0uuwvh5KoH4OWsKRBoXTYsmPrPeZkUu7MHWm6vwvkuPFsnu/F8SyFVyShi+5r7Kt8SXQHycuwUScUmVw3dJkXyVQHzcHwoEX4PERl5Q5XqezxKJ/Q4OBVKNbCdxNa5KIPa7/ZtAVrvsqtd+2eCqBGLn7LdAQF5ZO3mrclUCsd/x73+LteplV932ywZX0QKRfMi9my2BDPx/sVZvghKI/UOlBFICCfm7kdU/NI7qL4G8UCDSDPUWsb1F/gs9r28akoDJcAAAAABJRU5ErkJggg==" + }, + { + "name": "British Courtroom, Continued...", + "description": "This big idiot they call a judge just keeps piling on crimes. With each one, some robot you'd like to drone-punch gasps in the back.", + "choices": [ + { + "key": "choice 17", + "name": "\"INTRUSIVE SCANNING ON OUR CITIZENS\"", + "exit_node": "British Courtroom, Continued...", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Long Range Scan Report", + "value": -1 + }, + { + "effect_type": "Add", + "quality": "Crimes Committed", + "value": 1 + } + ], + "requirements": [ + { + "quality": "Long Range Scan Report", + "operator": ">", + "value": 0 + } + ], + "delay": 0 + }, + { + "key": "choice 18", + "name": "\"SHOOTING DOWN A COMMERCIAL AIRLINER\"", + "exit_node": "British Courtroom, Continued...", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "UFOs Shot Down", + "value": -1 + }, + { + "effect_type": "Add", + "quality": "Crimes Committed", + "value": 1 + } + ], + "requirements": [ + { + "quality": "UFOs Shot Down", + "operator": "==", + "value": 1 + } + ], + "delay": 0 + }, + { + "key": "choice 19", + "name": "\"AND WE HAVE PROOF YOU KNEW IT WAS JUST AN AIRLINER!\"", + "exit_node": "British Courtroom, Continued...", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Commercial Airliner Transmissions", + "value": -1 + }, + { + "effect_type": "Add", + "quality": "Crimes Committed", + "value": 1 + } + ], + "requirements": [ + { + "quality": "Commercial Airliner Transmissions", + "operator": "==", + "value": 1 + } + ], + "delay": 0 + }, + { + "key": "choice 20", + "name": "\"THE TRANSMISSIONS WERE NOT LEGIBLE AND UNTRANSLATED. WE CANNOT PROVE MALICE!\"", + "exit_node": "British Courtroom, Continued...", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Garbled Transmissions", + "value": -1 + } + ], + "requirements": [ + { + "quality": "Garbled Transmissions", + "operator": "==", + "value": 1 + } + ], + "delay": 0 + }, + { + "key": "choice 24", + "name": "I think it's done listing crimes, thank god. Time to argue my case.", + "exit_node": "Verdict", + "requirements": [ + { + "quality": "Long Range Scan Report", + "operator": "==", + "value": 0 + }, + { + "group_type": "AND", + "requirements": [ + { + "quality": "Garbled Transmissions", + "operator": "==", + "value": 0 + }, + { + "quality": "Commercial Airliner Transmissions", + "operator": "!=", + "value": 1 + } + ] + }, + { + "quality": "UFOs Shot Down", + "operator": "!=", + "value": 1 + } + ], + "delay": 0 + } + ], + "image": null, + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAJiElEQVR4Ae1cQbLduA18N8gBsppVVj6B9+MLzA1yn1z5pVBJu7owlAhQoARSUNUvkGADBJvop/dtz3z+8/PzrZ/ioHqg3QOfIqZNTPFSvEgPlEDqDVrfIE56oARyQk69ReotUgIpgdQb5KQHSiAn5NQbpN4gJRCHQL7Jn8/n85WfHZ+nPqy2EciOTeE9084C6XExS0DLCaRH1JvX3ywQ3Hu0UNILBAcv22cAAtn1a1afgW/4Hzg8IhDLQe/EoLF4z5aP1zOOUfMqAkG90VxGvkVuFUg0EVH5WhfV8kXtNyMP6oUd3QPxbM9yWXGcg2Mw5vWr4yUF4jk0SIP1xI5gsY9YefR8JOddMVwrjy37A89Y+NjyOo8ZgzGvt8bAadvCjvq2FYgmDfNRojxxvBePz3JYcbNyYP+Wbe0JnKxhLJYf+M8wwLewWGtZ4HlP+Fr4Ud9yArEeFGQxgdbYqzjeG+Nezhau5ZM88IvlB3749Bx+bYHjfOxjP2KxLnMeY73l7+GwD3CYc06MgcG8tR+vjY63F8goMVfjcIGwvXwtHPswblnkxpqei//s0XGChQ9Wx7Ofx4zTfszF8tPyw8c4HmO9ZRl3dVwCOWEQ5DMEPlhe4zHW2fK6HgMHP+Zi5eG59lligGlZzo119mE/rInV62eYVlzLxzmQn3E8xrq2jIkYLyUQz4FBXC8GOLH8WPw6huNlzDm8WI7VubCPxjCOx8AhrmWBObMcp3G8hjFjtA9zsVZcL4bXo8bbC4TJx5jJg08sHvaxX9Z5DfgjC+zROvuBbVngeE379JyxPAauZRmHseB4jDj4YOHXFuvaMo7X4G/5sCa2t87Y0XGkOCTX9L8H8RyUCdRjnYfXZY3nGCMGc7HRD3Ijr56LHz5tdQzWtR/zqxb5xfYexmLMMfDpXPAzlsdY13GMuTLeWiBCDAi0kAQsW87Bl8AYHlv28WCQW8fAD6vXs81Rp9jW01tvxcDHsTo/1oD12GhxTH+DeA4HrIcgYGF1jp5f1iMf7BedN7LGqFxXzsqxR2NvnTPEkVogEU0G8q1kj5KMfWBH84zGWc8XicNZr+ZEHraenKOcWeOm/Q7iOaTGgiztj55bSerhUK/YHvau9WiuMuW7i0PZZ4pA3krmnRc3ulemu7HWMnrWiLitBBJByFtzWJv1TlyGuwgXyEwCMxD2phpm3mUrd0ZuQwXSOrTVl5Gcs5r+/PXrO/PnbO9au+93vRQCWeXCZwqil3sVjnarM0wg1jcF41Yhs9e8d6+vwtsOdT4ikFWIu7vxvfutwuPKdYYIhN8KvfEKZHkbNRt+BY5XqfGyQHqC4PXspGRr9Kv1ZOd7hfpuEcgKRFxtxqzxK3CfucZLAuG3w9k4MwFSW9bmjqorO/+Z65sukIyHj2q8lfJkvIcVahoWyNkbQ9YyHn6lhp5Ra8Y7yV7TFIFkO/SMZlsxZ7Z7WaGeIYEcvT0yHnjFRp5Zc8Y7ylxTmECyHjKy2X78+PHFD/JifmSBy2Kz3lPWutwCab09sh4uuimPRHDFH12jJV/W+8pYl0sgK4lDyLY0iwdzRQjeWE9dXmzGRsxak1kgbxSHt6ln4b0CsOCzNmS2ukwC0eLIdghdj6VBLJhZDX8lr6VuC0ZzVvP2f2PiFkh2Ii3NcYb5/vMfX8vPlSaPiD07g2Ut+z1mqc8kkCzF9uqwNEYLYxFEDxPR9N4crbNYfT0ua/1/b5RtBGJtDMb1mj5i3dv0XjyfxzMuAbS/UmlethCIpzEEG9H4UTm8gjjCeznQjVDztmBeJxBLY/P/CE7Glpi7MCWQdiPPEvjyArF+cloaWAtDzy05nsJYeQBuVkPtlrcEQn9qpQWh5081v2VfNL7V7tbIs86ztECszWBpMC2Go7kl11MYKx+Cm9VQu+Utgfz/DXIkCO1/qvkt+5ZA4n8/KYFsIpASR7w45G24rEA8DWH59NVviqO5JdcTGA8fu30NmnmeEsgLf0mf2VC75S6BbCCQenvM+XolYi+BkEDw1Uh/vYI/qy2BbCSQf//r88XPldexpykEm7W5I+rycHGF8zfG3vIGgSC0/euPz1d+Roj3NIXGRjRlphz6fEfzEZ7fHjNdIFoUMocwYEcu4agJvP5MjT5ai+fMI1y/OWaqQFgcEMOZ9V6EpzE82NFGfSLOcy5gvTy/GT9NIF5xiHC8F4ELn22faHzrnqNn93L9Vny4QKTRR8TBbxbPZYw2SFSctZFn4K6ewcPzW7EhAmFB6DE3vnXsvYyrjTIjfoYgkDOyXi/Xb8NPE4hVDEc470VENs3MXGjyUTujNi/Xb8JfFshRg1/1j1zCjOZ5S84Rvt8Qk1YgIrDRC3hLU8845yjnu8ZtKRBc1owGekNO8Fc24N9iXf0qdRYfeUFvaOyoM0byvnquy28QIeCsya+szSI3qpF2zjOL+9XyhghkRZHoi9q52UfPpjl64zxMILNE8tSljDbVbnFP8Z9l3xLIT/+flu0mgt55sjTrE3WECgR/i37l945W7BPEjOzZa7SV10f42CFmikBEKK1GH/WtTvTKwkDtq9/BaP1hAkHzv/0tMnoRvTg06pO2V+OO6yECgTjEQiDRbxHJveMFeM/0pEBkb2+9q+MvCYSFwWOIhH1R49UJj6z/KbFEniF7LrdALM1vwYwKJjuhT9V3p1ieOuMT+04VyIyvWSKsJ4haZc+7hLIKH1frNAsEn/h4O/SaHzjERdurB985/g6R7Mwfn60rkFZjW5rfgmnl7vmQlw9R4/ZbdbZQ3sD7oUDOGhVNKvYIB8zRusePXGzfcDkRZ5wpkoj6suf4LRBuWDQi+/S4h8G6EKBjrXPk0FbisxObqb5ZIsl0xlm1fFrNioZsrcEHjFj42HLB7LeMOTfGHMe5a2z7sCiR2HjS/TQsEGnYVvOKX28ic27wszFywjK2lbd8bb5bvMwQSWufnXyhAukRw83eGkMUYmW9l6/WfRyVQHx8SX+dCgSN2mpm7bM0q47BnIUhY0uuwvh5KoH4OWsKRBoXTYsmPrPeZkUu7MHWm6vwvkuPFsnu/F8SyFVyShi+5r7Kt8SXQHycuwUScUmVw3dJkXyVQHzcHwoEX4PERl5Q5XqezxKJ/Q4OBVKNbCdxNa5KIPa7/ZtAVrvsqtd+2eCqBGLn7LdAQF5ZO3mrclUCsd/x73+LteplV932ywZX0QKRfMi9my2BDPx/sVZvghKI/UOlBFICCfm7kdU/NI7qL4G8UCDSDPUWsb1F/gs9r28akoDJcAAAAABJRU5ErkJggg==" + }, + { + "name": "Looking at the Surface", + "description": "The surface of this world looks exactly like a grey version of Earth! It seems to be an exact replica of some kind.\n\nYou see creatures moving around on the streets", + "choices": [ + { + "key": "choice 21", + "name": "Cool!", + "exit_node": "Tractor Beam", + "delay": 0 + }, + { + "key": "choice 22", + "name": "Scan the creatures.", + "exit_node": "Robo Brits!", + "delay": 30, + "delay_message": "Scanning..." + } + ], + "image": null, + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAKCklEQVR4Ae2dW3IcNwxFtSYvIv7PR6qygZRiy8nGsiMvZlKQciMI4gMkAT660VVjNNkECIL3DGcSWX764+fjEa/r1OCXr18fpVfsddteP1HBclcUs62YO9SrBAc92yHHk3J4ysEh+09a1J1zDUBs39TUgEhgqH1nIe649hoccYK0a3YIkICmveCeYAUg9vthDkgKmjht7DcuBVoNkJRP9JX3ZhogKXBic8qb01qfAMS2nlT/pYBwaFrFEOM/iqEGBz1fUTO+x/x+RS49c24DCC8e3fcs5s4+qwCR+6Ztn7JX2wLCC60pJh9P9xqfK42pAWK1Vlnn3rZVPt5xjgCEb4IsCH9Wu5e+V2nX4LD4eFWrbevzU2p/HCCtGyHHn7IxLXl6AyJraNFuWd/KsQHIBX4WzRMQCxhSMVaKvmXuAORwQDRw9HzESonasq9FpCvHBiA3AKRFYJYQlGK15LRy7O0AoU1bWXDLuf/89u31R9ullaeKds6SoK2faXNaPS4AOfgEkSDk2hqRWQNQi6fJaYcxAcjBgMiTI9fWCK0maOvnmpx2GBOAHApI7rSQ/VqRWQPgFU+7HqtxtwPEqnCr4xAIuROD92vz9BL0zLjatbaMC0DiBHn9jxYzhTxzrhYYUmNvBUiqACf28ROidpJo1zdTtCvn0tYD4y4PCBZ6JSu/Z5Ta2nWvFO3KuWv1uSQgtUWf/lx7grSuc6VQd5sbtbsMIFjQ1W3ptJDPWmuxm0h3yKf4e7F2SDCXQ+vmX2U8QRAnSE4V9v2vgEA89uHHIiKvsO8/HiNPiVy7t2ZjO3Y97w+AoKgzlom5wr6Lv1YL7clB42qxcs9n7P1JcyQBQfE8F4I5wuoBKX28kifJSF099/202EVAUGTrRSFuWBs45MliUVfrPT81ngoQWfDexco40dYDIiEota3q2rvPV/LrAsRqAyKODpASDKmPXZZ19RQ75bn7FYAc8LNYKQhy0FjC4SFgmV8AcoAA5abt1G6Bg6DxyH1ExJp8RuJ7+8YJ4ghwq7gtxmsE2TOmJsSemPCpxV75PAAxBITewWsvCwhmfbyCgL3tSgBqcwcgg4DkxLqi31vInvFrQl31PADpBKR2UrQ+tzhZPAU8I/YqCErzBiCNgKw4GTTwzBCw9xwloa56FoAoAWk9EazGa+AAtN4CnhV/FQypeQOQCiAQ30l2lpBnzZMS7qy+ACQDiNUJYB1Hc6LMEu6KeWaAwdcVgCQAkaLWiHLHE4Zv9NXurUCp1SUAYYBIME5q5yCuCeD05y2g9Kw1APn5qP7PPQlKToy79vcII3zefpD09oBI8V+tDWhD8LqfnJZ1ui0gHiBAjDtaufHR1gFzS0A84DghZkChg4LX6XaA0Lv777/9+nh6evr03YP6PV+rTxa+8XGvg+U2gECcJQDoFMC4nMVJgeeyjX5pU/PCd6YNMHRgoE63AARilSKl/tyLRAs/Dytz8Z4P8bHxYXWgXB4QEjcXY6/Y8S4Pf7SlxXNpMU72U5vnh3GeNuDQwUF1ujQgXHh0T2KsvUiYfAza3hZz8pypz2PeACQA+fCuDDgsxEYxUi+IGc/QHrGABTGtbAByc0AgLG5JXCmxUl+qPzee90Owvf4pP+TDLdaRGs/zaXkekOgguexHLBIOhNUjIil+tEdti4hl3lgP2dE8ApAA5H9ARkQpRerVphx5nminLAeF7rlfS34BSR2Sy54gJBoIqUU0Umzka/FCXMRCe9TyNSK21gYgNwaERALxjIoQ/hCeto1xI5Z8uX+ujbVSjnx8qR2ABCCvkEDYXCzog5jQnm0xv4UFJGS16whIypBc9iMWCQSCsRAfxUOcnPjkc7QtLMXgcUptrBt5cj++DuoPQAKQ5LspRAMReVv5ri7nR9vKSkhy6wtAbgwIiYKE0is6iAr+aLdaKVbE87aYlyzPmc8bgGwOCP2dYq9NIlFIcXChzLov5VB6RvlBzMi1tU1+NEdpHq/6XyHu8u8gnoDQBnFhtIpLjodItZb8uTgRDxbP0Pa0mIvXA+u4gpC91mAGSK/Q+W+l8FgkRLDKpgSJXErPMAYW8GjbGCctQOH9HnW/SkxTQHog8QYEG8UFMeu+BAB/lhM/+nst1gl/tCUkqFHYzx/3bwMIbT4EMsNKEfI5ORy8f+Y9zyHA+AwGanIrQLDoGULkApTz5Z7Jd3rPNuWAPFCXsJ9BuSUgJAQpWss2F5+MC1HK/hVtyuXZ6d81vApsJoCMfI8Y8R3dBC9R5iDI9XvlUYsbgHw+MaSmzAEZ+aIuk5vZrolJ+zwHAfXnnmljW42jU4NeAcgkQEjIdNHvmqKrVdivTv/90eprPX5EhDkIcv0jc/X6Ao53QL4375d1zXeOZ3KC0ALl1bJo7tvi5z22VYS5EyLX3xp/dDyH4/nb98fz94CjpqEAhP3zB7liaYTJTwl5r/H3HPMRDPp4RXC8PJ5fXuL0qOy/GSAkLn7lxJbrH/HNxbTuL4kYUMDSx03cl/y8nwUc7R/5uW5MAaHA/OIT1e57/WpxPZ9D3AAhZTFmhf0Ix9tHqreT40ecHJWTA7rZEhCCBQnubFNAyL4VYNCcSTheXh7PP/56PP/19xH13WHvXQFpETo/QVr8VhZRwiDb+8Dx9n0j4Gh/4zUHhATLrxYB9/q1zGE1VsIg26l5ZgDz+eR4hyOVE+/j9dfcc9+r3rsDQoXWFk9uitbPY5wUfEu7NR8rcFJwaHKRde9ta+Y6bUwAkviyBhj++fLlUXphnLQWImiFhsOhnb8XBK2fNo+dx00BhAqqKUKq8Bo/yzEk9hIU8pkHHJbrQaxUbWf3IZeT7FaAUOFS16yCtsIBWADJrDy186RquVOfdh0rx7kAQgtKXZqF9vppYpfGQOQQfasl/1L82c9Sddy9b3aNNPNNBYQ2SJNUaiM1fiNjek8PgLQTIKn6ndY3speWvscAooWrtzhXAOQ0CFry7d3XUT83QCix3KVJesRXE1+OOR2QXL2u1C/3bEb7OECw4dbFORkQ1OTq1nrPNfFcAaEEcpcmuZwv79fE0YwZAYR8NXN4jOG1uPq9R/1qMd0BQQKpzcOznE35pPpy/q39JPRWUODTOtfo+FQdrtg3WqdR/2mAUKLy0iYv/VJtbSzNOIg+Bwt/XoqXylPbl4ur9T91XG7dq/qnAkKLlJd24dIv19bG047jMOBe45vLL/rzFdDUdfaY6YDQAuXVs2gZg7d74ln78HziXlcB6z2wiLcEEEpcXr2L4XHwW1WorzeelR/PK+7rFbCqu3WcZYDQQlLXyAKt41nnksov+ta/mZX2eSkgHpBgsVx46Jtl+dxxX6/ArH3pmWc5IJR07upZ0A4+ufVE/+cK7LBfpRy2AIQSTF2lxHd+llpL9KUrsPM+Um7bAELJ5K7diyjzy60j+j9XQNZut/a/8+89HVF1Xw8AAAAASUVORK5CYII=" + }, + { + "name": "Robo Brits!", + "description": "Wow, they're robotic humanoids that look and act exactly like the British! You see some robots laughing and chatting at a pub, and a Bobby walking down the street looking for crooks. Who created this earth replica? You only know Earth from the books, but you should be where London is!", + "choices": [ + { + "key": "choice 23", + "name": "Nice! Well, back to getting pulled in by a Tractor beam...", + "exit_node": "Tractor Beam", + "delay": 0 + } + ], + "image": null, + "on_enter_effects": [ + { + "effect_type": "Add", + "quality": "Long Range Scan Report", + "value": 1 + } + ], + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAP2ElEQVR4Ae2dT8snRxHHnzcgYT3ksEgie1gXVkhIUFA0F1cPezAsHjzsKYR4URSvHj0IycmjvgLxIIigOYme9C1IZAUvCnkJXloqmyKfp5+u7qrp7pn5PduHpmqqv11VM/P9Ts/v+Xv14duvppHj6uoqjRiRnn70wR/TGuVr8OE77yRrjLhPVg6rZjRu5c/j0bxe/FWEiBY2b3bUsVWvFF8COZdAhANeElq4rTyy8m2Jdwtk60l415XEUIotgZxPIL0i8XKkhtsiCq7pEkitsVFzJTGUYksgSyAezpH8Hn8JJPv8kl/kMwov0mONBHmeGce1+rW5Gb3kOWv1dW4J5FOB5BePx2cRCXvKfatHvdElm+eYcVyq64nN6KWW0+rp9AKRkyq9UuUxiyCteO2ica6VZ9Y8e6j5Vn3rxku8lm/UXK1+bW5U/WievKerPEFOvNpxvnbWca0HnbMIUotH+q3lmTUX6Y9Y9pPfcB5zzSyf9bz+rF68ednnDYFIEiVdy3oL9uJafcg8SdHyt/bTyjtyfmuPuk574c3OfcXOsnk97/GsfqJ5pd+iQCSRh5TRgj34Vj9KiJbt6aGVW+Y9+UfladWSOjVSttb3zNfqWnM99SauLX/nu0VInZ/Y2DWyab2abRGvt9fR+Wv5enuV9S2BfPqEvHado3Utskfj0bo74pdAvBe7RmiZ8+YhzspJzFbfI5CISKKk9+K3nt9O65ZAvBfaIrPGvXmI07UlS1zU13xekh6Ji57bzvg+gcgrzx4N116tdE5JUbM9vdbyytyW3KNz5vmOJL639pbrtuOaF0sgOYFqx7wJNZzMEev1Wzl13sqn8zXrJeneOOucThhfAqkRzDu35cZ6c/fg9ia+p96Wa3XgmpsC0VcWr92jeW8vPWTqWRu9Bj21Ims9hN0TE71OJ8AvgUQIZ2GjN9LKMzq+J/k9taLX6Ui8nE/XNwr1qb7HSWgtjx1NMk++6DXw5OzFeAi7NyZ6nY7E31qBiIh6ybVlfeRmbskfXbM3+T31ItfoaGxVINKc52ktmNkn4u2DuCiZRuAj12FEvVYOD2H3xkSu0dHYpkCkQZKu5ntPhjk8a4iP+BZ53v/F+ykfFjYa95yPYqK5t+BnkV/PoWQ9NUvrzhgbKhAhb+0kI+Qehf3BP9MnYiC5cnGMPq5dA52Tfnrr8pws30PWKEbPoWY9OWvrzzLnEog0O4qwe+dRgfSSsWd9frN7crXW5kLxEDWCyc+ldjwrb63m6Dm3QKTw3uQeUa9FqNs4T5FESNrCbiFfKyfnt+SfvUb6M7/MWyo+grR75riNAvCeE8k3wi/xoRXbUreVc8/5JZDCB3YvAc+O20JOa81WUlr5PPGtNUeukz5DO4gU33MH6K11dhLP7M9DQg+mh3Ce/C1MT/2etdrXEsjaRab+Wq4Srdf2kH3LWu13CWQJxBTIFmKV1ijZRthS/tEx9rkE8gIL5M7nX05bR4SUJNwoP1I/imWP1/5wnCdR7+eCPdfPfMe/hNy80SV/qzhknYcrxJTqj4ixxiiffV0TiJC3VmRPcue9bK19CUSe1SNvdMm/DQLR86rxNjqnOcXeEEhOTE2+laD5Os2nNp+36gu+hG3FZpHvEvLyRqtPUXzhi6+l0vj9X/+WdJTmJcY8ei9rVuvPtrUevHPssSiQFul65q0mNac1r3HFee2ZiPy/dJVk7NUTb7T6JLZFfhWHWAvDPHpvalbr72VrvbTm2ONpBNJqWue9wlDcXmT01FkCsf8dHEk50lfeeG1ee3eBKHE9DQs2x+l6r/UQdy/MmQXCXePP//h30sE4d5Oz7yA3iO7835k31nmJNguXC6B2HO1hL+J76+wpkPxG6zGJTcJTCCoOsYwTzzy1e6ZzWv9Iq71YttTbYTsIyV5qWObzONfQz3GRYy+5R+CWQPZ/xSqSvrCblHASO4VASmLISU5B5H6OjRyPIP4Zc1g3nE9+a3fwxJmndb2tXi4hfhqBtESSi4LHrRtUmz8juUf1VCIgie0RAl+riGee2vUt9XBJsVMJpCYSCiLHvfTSS2nr4M0dRcyz5CkRkcQm4S0hWHHm4TWkX6p/abFdBMKLJn5O9tIx17Tmt4pD1rHOWYg9qg8lI8k829frqbUv3R4iEK9ISsLQmN4IsUsgN/9Si4hMyTlbFMyv90VrX7p1C0RPnFbJ2rJcQ7+1rjb/4MGDpOPRo0dJx+PHj5OOp0+fJh0aE6tYsZpD7Kgn95nyCEFJ4Nm+3t9LF4b27xKInnTJ1kjMudJajRHn9UlsEp5CUHGIZZx45jkTsUf2ojc7F8vf//SHpONXP/tpag3FiqXQ9D6qZb1L94cJRC+O2BLJOZ/7JXwrRmKT8BTCWQWy5/dDVGhKVBKbhG+JQ+aJZx7eT61zW2xVIDxx9YW46qu1YiS5YkuWuJpfWjsrpsSaYY8QiJyHkJbEJuF7BHJbxFA6D1MgFvEsMZTwJDvnGY/4zDHbnyEMzbm3QKKiSFdXSYclHIqL+Usku+RYSCAkMwmqccboy3x+rGsiljlm+0rmGXYJZOyPnJS4MEqULoHkJM4b4nw+Vzomfqv/21++n3TwaRb1NYfYGWIo5VwCGSeQEr80NkIkYYFocdqc5Jwr+Tl+yzGJHRUF8cxTIvOM2B4Cuf/6u0kHX4H+8rvfJB3W65MnrjnEMr/WFDuCoLUcJW7lsdp6z9w1geTJ9VgJrMe0OleyxKlfwm2JkdgkfNRnnhliKOVcAhmzgyinPNYjhhLGLZBSE15ic613TQvHJxhFwaffBz95PelgnHjmKZF5RmwJZH+BKAdLIqjFqgJRkmpyWp07ypLYJDyFoOIQyzjxzDNDDKWcewvklfvfTTr4OsRzj/rMo7nF7vWKRS5G/Zog8rmqQKzCR4mCdXlDSXgK4awCKYlmdIxEJYFJbF7DqM88zM+6OdlGHlvc9Ma9vVwTiBCwVYAkPdL3iOLr3/xe0uERy2iSHpmPRCWBSeyoKIhnHuZnXS8Jt+BaPPXOt2rfEEhNJEcKIq+9BPL8y9IkpOWTwJ97+VHSQZJHfc0hlvmtHhhvkbI17yW/F1er5xZITtCjj5dAlkC8AvDgLJEUBSLkLyU9QhSlPiTG7Z6fO+hbr1WMM49V68hXpVZtPpktn094PvmjuwbxzMP8Vg+MW2T0xq371BO3ai+B4Btn1gVukfTIeRLvy1/9cdLx8Gs/Tzq+8o13kw6dn2W1pljWYJ8WGb1x6z71xkv1TYHobsGiGpthWUd9qaN+bvnk565BnzuFFWeevIYeHymAVm0Sj4QkUVUcYomZ4bMu87PPEhEjMb0vo22ph5BApKFR4ug9ORK7x6eIrJ5aJD1ynsQjIUnUJZAr80HLez5EIL0iYUM9fo8ouPYSBWKJgnEKxPL/89FHSccbb3wntYZixVo5GWc/FC/jJVLWYj2caa0t1W3uIKXXnC27SKu56DxJ3uMvgTwXSUscMr8E8var5isUCRwVCNd6/G+99e2kI4rXdV7rEQhzHfk6pbX5BLaezHySWz4JvwRyVfzpY9cOEhUE8R6C5xgSMp8rHRMf9Y8UyNafyaJASH7G6RNj+RTLK6+8kXQwbq1lnHXpW5jSa00tVrr/o2KlulMFsrVxktyTg/iovwTy/MvBFIKKQyzjJLnlUxT0iWe8REor5uFCD6ZUd5pAoo2S2E+efD/puHPnTtJx//79pENjYj/++OPiuHfvXtJhYZhHc4tlXHsRyz71lWerXTtI7JeqopyK4EvikNgUgUQaUyyJR0KSqBaBLfKrOMRaGE9+9sM+twpD16lAxGrMY/kEfvPRr5MOxunz6f2v/z5JOnSdWGK4gzBOvOYQSwzr0udaxi1i5nHlySyb19PjJRDHDjVLICIGFYlHGIohwSziEUMCk9hcS8zZBDJLFJpXxVCywwWiRaP2vfd+mHSQkJ4nvLU7PHz4MOmwMJ787Ed7FKuE7bFLIO3fLoxyKYovCUNjSyDBHeTSBcJdw/K5m1gYxonnzkWfeMaViDUbJXwEX6src0sgJxFI5HMICWYRjxgSmHjL78GzLn3WYrxF0E9IWviXaRER1LCt+qcRCF9jrBO6e/duKg3inz17lnTo65VYjYklvpRPYsTwFYp9Mt7jR1+zSDCLeMT0EJ75LZ/5WZc+1zLeIuhMgbhq85t6I3wSK+KTeNY6D5kphCWQz/42Fkl5hL8E8umPqVjkbsWXQPxf6iXBLeIRcwbf6tPzFJ+xi7jrjtg1mKMlBGt+CWQJpEVaiztb4q1aOr8+gzg+1/DzBYXM+J4+dwTr/Z/9vPX6l1Jk9KxVYon19Em8x98ihnyNp45ilkCWQG6Ip0cgslbJNUMgkjsnfPRY+/PY4QKR161ow4Lnk9laf1s/pJOQHt9DPOaJ7B6C7V2rxPP0qdiItfjhiUfqCHYJ5MJ3EJLQ8vkaZvn8EE2MFSeGvtWDFY8SVvEeMeQYXRuxSyBLIJ/8sKElBCtOUdC3hGDFI2TNsbkAPMd5jtbxFIFsec3yvGJ5LgD/uSd/14NxTx5i+MrBPhnf07fIZsVJYMu3hGDFrTxWD1a8RdDWPO+T12/l5PwSiOPHGEj+MwiE/fAXmuiTkCSz56d5rbUUC/MwP9eyH/okYK/vFQVxkZqnFogQgSfm8blT3NYdZAnks58A9nAix1ykQF57+GbSwV9K4leudN5rR61lP6xNoh7l88lMn09yPuH55OeOQIy1lnjmsdayH/oRgnqwuQBax56cijnNDkLikZCjSM78Hp912Q/XHiUK1iXxGPeQ3CL2jDzsU8k30rZEwflI3WkCiX5QJ/FISBKVGI8/ai37YV0S6SifxGMPL5pASHqKIfeJ8/inFAhJaJGcpKU/ey3zk5BH+Usgn30eIeFzYcgx573+Egj+SB3JbwmTmBmiiP5uiNUDdxCPb+Vh3JOHGK5V30vMs+CWQE4qkMhvGCr5aElUj8+1lu/JQ4yV5yzk9/RxGoHw/5XTt57k/H4EfT7hR61lP/QtAvTGdRfpEQmJ6vE9PXvyEFPL6SHnGTBTBRL5oE7i0R9FcgqHgqJPDOuyH/o1AvTOqUh68+Treb70c1zpmHj6JawndgYBtHpYAsFfcVwCef5/Dy1yUxT0LXwr3iLnGeanC8S7i1hPZj7J6fMrV/SJsXzi6Vt43mirT2JG+C/CDiLX6QwiqPWwi0BEJJZQJC4XyiKeRVoSm76FZ5x4+sTQJ+GtPokZ4c8SCM+Xvqdn4ul71lqYGjnPMLerQFQotHrhLOKRqPR5g+gTY/nE07fw2qNYq09iRvgvikDkWp1BCFYPhwrEQySLtCQ2feKZn3Hi6RNDn3n28l8kgcg1tQh6dHwJBN8HoSjo7yUK1lGBiGV8i8+HAD9c0yeGNRgnnj4xXBv1jxZDqf7/AdVoY/i7GpcvAAAAAElFTkSuQmCC" + }, + { + "name": "Verdict", + "description": "Before even getting to defend your case, the judge says \"I've heard ENOUGH! It's time for a verdict!\"\nDang! You're definitely in kangaroo court!\n\"GUILTY! AND YOUR SENTENCE IS:\"", + "choices": [ + { + "key": "choice 25", + "name": "\"DEATH!\"", + "exit_node": "FAIL_DEATH", + "requirements": [ + { + "quality": "Crimes Committed", + "operator": ">=", + "value": 4 + } + ], + "delay": 0 + }, + { + "key": "choice 26", + "name": "\"SPACE JAIL!\"", + "exit_node": "Not Actually Space Jail, Just Normal Jail", + "requirements": [ + { + "quality": "Crimes Committed", + "operator": ">", + "value": 1 + } + ], + "delay": 20, + "delay_message": "You are being jailed..." + }, + { + "key": "choice 27", + "name": "\"FORGIVENESS! Just trespass? That's not that bad!\"", + "exit_node": "Sweet Sweet Freedom!", + "requirements": [ + { + "quality": "Crimes Committed", + "operator": "==", + "value": 1 + } + ], + "delay": 10, + "delay_message": "WOOP WOOP" + } + ], + "image": "default" + }, + { + "name": "Not Actually Space Jail, Just Normal Jail", + "description": "You'll have to wait out your crimes against the robo brits.", + "choices": [ + { + "key": "choice 28", + "name": "Sit out your sentence", + "exit_node": "Sweet Sweet Freedom!", + "delay": 1200, + "delay_message": "Sitting out your sentence..." + } + ], + "image": null, + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAOkUlEQVR4Ae1caQ5etw30lYrcoblZgZzaBVsMMJlw1dNbnOiHwX04lMT3GUbaH3/854+fu//89q/ffnb+7O67E6/D33J29rwb61eaqcv17jv4cceldIe7o/cuzL/DDHoWv9JMXa6Wp3PutM+CBL+g3QvaeRl3Y/1qM32B71mQsyB/+evw3YvaxT8LEjzO7gHemfeFy9k936820xf4nl+QYEm/cDlnQd7/x56zIGdBzl+xgjdgH6izIMHhnF+Q/f/8P/1F/MIdnAU5C3J+QYI30P4F+fnjx0/9k30Nos1XDLYzPItxLvSq5kqcZ0A/lohf6aG1hq++nTY4q7S+7NvZU7EmMxonPnPVJ5y1VnlFdvoLoqCe7QEz8WpIxfTwzKd5kR3VT/08Q9RL/dMemg889a/YHhbPBB15sE1O+wGjquvmAce4oMaTytnLiXzoUclwQSJg9XsNmLjmd2wPs1OnOR5O13fHDFlv5p7ldWKMZTpqeCbTNQ9x5HekYkQ13Tyu9zgyDviyr6tzn0x3F+RqkyvE0VtJwz+VitO1MUN1SRmfbi8Po1vr5UV41UyIe5iRL+rF+Z0czmfdq4UPfGFPJPfI9L8sSLdJBnrlUaG/4sO/IhWrY+Pwr87S6RXN1Kn1ciI8zBTFzW85Hmbki7CQH8XNj5xMZvWdeVCf9chi7QXJQDRWPSoMhjoMoRJxkxozO/JHuYxX6eAYzRL5p729fPgqjl4ctavS5vJwPd9qD9R5mOxDXiS9O0K91sA/lX9aEAWF3QG1XOShzpM8FPJNerlZnGNRPWNqfmUzT8YxnWNXeiuuZ1c8Ne5hTH2KGdlTXC8/wja/l88+vQfG4jzTOTbRywXJwCIS6ofNA5nO2MhhmcU5Bp1rVUdOVzJXxeIY8DSHbeSo5BzTLe75tC6ytXbVjvDZv4qtdYypuuayzXegb8lwONd0xe7aSwuizWGjKWyV2VCaazbwTGqcY9A1h23kdCVzZRzTOQY8zWEbOSw5Dt3i0FlyXaZzzVU96xPxXO0Z9crw+A5M9zC03supfH+bBdHDULs6CI3zBSgWx6xO42ortlfDOVpvNscj3atb9UU94F/F9eqAqdLLhY/vAHpVr/GOvbQgBgyiLNGQfapjGJNVPuJeP8QU37ORO5HMUzERU79nez29vMrn4bCvql+JMz7rK1hVDeNDz2pwByxRB6n18E9kuSDWxAPU5pznxdiHoQyX/axzT/av6IzV1cFxpR/XaD+OTXXFYjvDsjwvbjN6fvgYn3XEPRn1ivzAYHzoiHkS98MSdZBaB/9E/mlBrFBBJzYaVwffwQTWLk6M19Fx8B2uUY7XJ8rt+qeYnM89MF91V1xvOmOozrkci/ycYzrnVb2YP/SqXuMde9uCcLPq0PVg1GYs0zXetRVnal+Zw+vV5Z3lTXE5H/PgQbGMenK96VGe+b1c9WUYnJv1sRhzh871Xh+Nd+y/LIgHXJHVwwHhTp3meKQ1p7I9jBWfzVH10njWR3NhT2s0HzgqNQ/34kmtZZtx2M8651Q616mOWvWr7c2AWkitgX8i3QUxAAWPbK8Zk4/qPL+HdZVLhNnx2xweT89X4Xk15lup45oI18Pme/F0xuIe0DmuOnK6kuu9Go6r7nE3XwfHy8l84YKgSMmxjRyV3gBcp7rWq635bGvuTtvm4F6qY85pT+B067r5yDPpYYNvR3r17Kt6ce6KzviqR/y9PlzrxStfuSAVgBePBlC/V/sln/KN7C9xzrhE/D1/hvN0zOPn+e7gdRYk+Z9bepfg+e64mDswPe6R747+q5gRR8+/2iOqOwvyD1oQewTeo/J80YN5w+/xi3y7+Z0FOQviLs3uh3YFL1oGz3+lj1f76oLYgB6pr/i8C4h8X+Fc8Yj4q7/CeTqu/CJ7N6+zIBt+Qeyydl/MXXjRw1L/Xf1XcZVfZK/iR3VnQc6CfP6vWPZ4o4VQf/TQV/23LMibA60eRFSnFxDZUf3X/BF/9R/e//9/ljwLkvyC2CPRhxPZX3tQEZ+Iv/qj+rf8yi+yd/M7C3IWxP0I7H5oV/GihVD/1T5afxbkLMhZkOQNnAVJDse+JvqFimz98nzVjvir/2v8lV9k7+Z9FuQsiPsR2P3QruJFC6H+q320/izIWZCzIMkbOAuSHI59TfQLFdn65fmqHfFX/9f4K7/I3s37LMimBbEL2305d+BFD0v9d/S+gqn8IvtKD6/2LMhZEPdX0nssb/qihVD/bo5nQc6CnAVJ3sBZkORw8DXSr1RkI//LMuKu/q/NoPwiezfvsyBnQc4vSPIGXl8Q+xLs3vrdeNHXSv27+67i/fv3339Gf5RzZK/2vqsu4qn+3f3PgiRfDxy2XkJkI/8tGS0F+yPu6ueat+bhvsovsrlmh34W5G+yIPygMz16WOrPMHY8vCmG8ovsKW6Vf9uCWONoCPVXJN+OK9/IfoNn9pC9WMRd/V6t+p6cV/lF9m5OZ0F+4V8QfbAdO3pY6u9gIWf3o/TwlF9me/Wrvs8tCA4dcnWwnXXZZXBsZ88OFs5oIplvpk8wLbfD90pOxlVjV/po7WcWpLoQJf6krRcQ2U9yqs4rikfc1R/VZ/4751d+mb2Tx1mQX/SvWNlDzWLZw+JYhlHFdj5QxmJ+mc41V/VPLEh14IhfHXa1PrsMjq3ir9ThTCbS+jDfTJ/gerkrM1U1GV+OVTiT+C+1IHYRk+F25fLhZ/qufh0c71FmPmBm/DmWYXVi6LdTMr9M39lz64J4B5cNgphXl/l2HkAHCzwr2cHalZOdj8a4ZzUD4lajOFOb++7Qwa2SO3oBY8uCZAdXDWPxrD6KYYAnZGcGy3mCC3pE56J+5ENOZ1G8qY2+O+SU+46elxakc1idoTo4mrNj+C5GZwbL6eLtyNPzmNideZjjBFtzGeeq3uG9+x6WF0QPIrK7Q0X1mf/qgXfruzN08XbkZecyiWWzKc8JLucqzqqdceXYKr5XdxbkH/bPvPxwWecHBt17MFzT1T2cFR94VXIFO6pZWpDuwVheNQziRnCCa7nRULv94NiRu3tHeNOzqvK92aLe5q/wNJ5hdWMeR8/XxevkfWJB9DC7dmfAHTneJUS+Hf26GN1z6ubpTBmPLibyMqxuTPlFdhevkzdeEAzcldEQ8HdxvLzOgDtywLUjd/TrYnhncsWn81U8pr0qvCqu/CK7wpnEb10QIxINAf/0kDl/MujVXPCt5NU+03o+j6u6ztbhMunZwctylF9kZxjT2GhBJodhuUYmGsL8UzzNnw57JT+bg2NXeqzW6rms2jyH6R0+014dzChH+UV2VL/iv21BQCYawvzTw+V84D8lszk49hQfrw+fz1TnGaB7PTzfpJdX3/WBVyW7eJ282xfESEQDTQ5WczvD7cyJZlD/zp6rWHpWHVvnMLvbv4OPnC6ml+dx9Hxe7arvlgVRMt4Q5sOhTaRiP2VHM6j/KT7TPtEZK3+2Jz0ifM8/weVc5pbpXHNVf3VBbEjvAD3f1UGv1mcXwrGrfZ6oZ76ZPuHi3Vnkm+BybsaVY1xzVf/8glwdcFc9X0Cm7+p3J07Gn2MTDtEyeP4JLucyt0znmqv66wuCQfUgrw62ux48K7m77x141QyIT3vrHUb2FBf54FVJ5O+Qn1kQDL1jqDswwK+Sd/TejVnNgPi0b7QQ6p/iIh+8Kon8HfIsSOM/VrSDri4F8R2XcjcGuFZyykMXIbKnuMiv+CKO/B3yLMhZkHD5pw8sWgj1T3GRjwWoJPJ3yEcWxIhWQyG+Y6g7MMCvknf03o1ZzYD4tK8uQmRPcZEPXpVE/g55FuT8goQfr+kDixZC/VNc5FeLgTjyd8jPLYgNuWOw3Rg4/Eru7nsHXjUD4tPeugiRPcVFPnhVEvk75FmQ8wtyfkGSN3DLgtiXQ7e32nqOa+0XbOaX6V/gWnHI+HOswuF49Gvh+bluojO3TJ9gVrmPLYgRyYbiWEX6jTjzq/Q3+E16Vvw53sX1FiHydTE1j3llutZdsW9bEDscJZYNxTGt+4LN/Cr9C3wzDhV/jmc4HIuWwfNz3URnXpk+waxyRwtiYN7AmY8JZENxjGu+ojO/Sv8K54hHxZ/jEYb6szfAMa2b2Mwr0yeYVe7tC2KHAxLZUBpDzZekcozsL3GOuETc1R/Vs58XoNK5bqort8ie4mb54wUxsOoQong0kOfPSL8V83h6vrf4Tfp6vD1fBzO6b8/fwYtyPH6eL6pf8T+6IHZg3kCeb2WYu2s8np7vbh478D3enq/q5S1B5qvwsrjHz/NlGNPY0oJYk+wQqpg3lPqmgzyRrxwj+wkuV3tE3NVf9anumuMVVhVXbpFd4UziryyIHVo0HPsngzyRy9wy/QkuV3tk/DmW9eHH39EzrE6MeWV6B6ubs7wg1qBzKFXOU4N2DyTLy7hyLMP4Soz5ZnrGt7pbjmc43VjGk2NdvE7epQWxBnwIqzoPx3pngCdzmFumP8lptVfGn2MR/vSuI5yJn3ll+gSzyr28INZgelhevjdwRf7puMfR8z3Na6Wfx9vzRdjeHUa+CGPq9/h5vilulr9lQaxBdDhTPw+cEX8jxtwy/Q1u054Zf455uNM79TBWfMwr01ewo5ptC4IG08Pz8nl44H5BMq9M/wLXikPGn2OK491X5tP6KzbzyvQrPbR2+4JYg+zAujEcgBJ+0wanjnyTZ6d3ZwbLUazu/SFP66/Yq5yv9LxlQYwQDuiqvDLc7truBXkPazeXq3jdWbjP9C65doe+wvlq39sWxIhNDzTLvzrojvruBZ0F+f1/d7/jzBmje/5cc1W/dUFALnv40xgw35JvXNIds07n+MI9TTnvOLdHFsSITg84y98x+CrGG5e0yjWrm86R3YcXy3qvxqacV/tw3WMLYk29g1z18RBP6m9c0h3zTeaY3tEdfA1zwnkXh0cXBKSnBx7lA+9J+cYl3THfZI7o/D3/HVyBOeGMmqvyv9va9kZwciKCAAAAAElFTkSuQmCC" + }, + { + "name": "Sweet Sweet Freedom!", + "description": "You're free! You spend a good while travelling around England (or at least the replica) and enjoying the cuisine, people and culture! Good society research is gained from this or something, but really you're just enjoying the sights and sounds.", + "choices": [ + { + "key": "choice 29", + "name": "Nice!", + "exit_node": "WIN", + "delay": 0 + } + ], + "image": null, + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAQJklEQVR4Ae2deXBX1RXHY23/6DYdFBekilIInVrsTBUUEKWitf1Hp4467XQ6Y6frtLWtdpzWhaCCCQmJieKCKHWKY52xjgsg4AIo7s601NYlIoSdaEJIQgwgWU7nxB643Nz93fveu7/fy8ybu527vHu/n3ve/W2pgIB/B/v6ofHBV+H07y+Az319NlSMm1WS1+YdncpZ3HDpT2H9yNODXRsuuUrZ/5adnSU576inoydUwYSLmmDu3S/A/gN9ynlwKaxwqWRTZ2BgEHa17YW/PvYvGHN+fUkuVAFINhvf6Gl1sPCRN2F7azf0DwzYyNLYNjgg7EgOfNIH9Ytfhm9870747ITS8SgFIOkBcnRlFYy/sAluWbAWevd9wsorSDxVQPAO0KPs/KgbHnj0n3DKeaXhUQpA0gHkpKl1cM/Db8C2XV3BPAZPWWqALLzhGjC9YjurFICEA2TIY8xshNl3rIae3gO8foOngwNiCoXMLgZYCkDCADJqai3c/dAbsHVnF/T3hzlj6AjzDohM6D7y8wpLAYg/QD5TWQVfu6ARZjU+D909+3X6DV7uDIgPwSdtIy/AFID4AeTEKbWwYMnrsGVHZ2YegyduGCBJRZtV/SxhKQBxBwQ9xriZjXBjw3Owp3sfr8/M0xVZCTpkv2nDUgDiBgh6jDv+9lqmZwwdgdEDUltdq3x1LA1YCkDMATlq/Cw4bcbt8Jf5z8Luzl6dPjMvjx4QG0/02oqlgJdvaApAzADB9zEWLHkNWrbvgb6MXpWyJS53gKBHML1s4EBbAoRCX6AUgKgBOfX8BriudhW0dXxsq89M7QcHByFTQEioWYUFIGphJ52f48+eBw2LX4FN2+LxGEQkfrZryRPrwwGSleht+00qAqxfeJAjQRtzfgP8qWYlfNjeQ3qLIkSPsadrHzz+zDvw7Uvv+fRR3PYxRWZvK8y82BeAHCnuJPOBHqP+gZdh09aOaM4YRC56jIeXvgWTLlsIn//mrYfPqTLB2+bnRfC240giCKpb7h7klOn1cM1tK4Y+hEqCiyEc8hjd++CJ596FST+49zAU7PeWbEFQ2duKMy/2JHTXsFwBOW5yDdQtegk2bumAvr5sPivlCiJ6jEeW/wcmX7YQvjCR8RgsHBhXCd62LC+Ctx2HKxhUr9wAOXn6fPj9nKdhe2uXqz4zqYceo3Pvfnjq+ffgnMvvE3uMApBP3wthISKhu4blAsjIyTUw7751sGHz7ig9xqMr/gtnX36f2mMUgAwH5NQZDWa7CT95/0+XOiBfPXc+/O6W5bB1ZyfgLhzTX9fe/bBsTTNMvXKR2xrbPkbJ7NkdObY4vk5fv/gVOOGceU6TWKqAjJxUA9X3vjjkMfAHOGL6wzPGY6vegSlXLIIvnqE4Y0g2vUNPEzLB2+bHBgU7Xlx43Bnxq8DXVq8EfB3/0ATpJrAE3wfBH0P4zexlsHn7nug8RnfPAXh67fsw/UcPWK2hdL1tQRDZs2LTxUX1Q+XpxsKW0+6InxHauLUDahe9BPi6vnTiGHBKxYMce1Y1zLnrBXi/pR1i9BiPP/upx/jSGXOM1s1kbStIJElFSu2owqR92NZXjYUvI0AoRI+yrbUL/jD3ae2PS8QOyKipdfCrWU8NbQyxnTHQY6x8cQPM+PFif1Awm98hQEgwtiIke6qvCsk2rVA1Fr6MwOBDfH0fPUrNwnWAr/uLdp1YATnmrGq4+c410LwpTo/x5HPvwrQr7wevHoOFA+O8UDDtImBRO3yeS7tJ6/BjkKV5MPg07qz4C4VX37oc8H0AFpTYABk1pRZ+ceOTQ4fv2DxGz8cHYNW6D2DmTx4E/G4Juw5B4jLBYL6NOFXtUJlNe75sqW9fIXqUD7bsHvqpS3xfABclFkBGnHkbVDWthvc2tnk/Y3z34osh5IWvSi1d/R6c+8P74cvf8njG4D0Gn9YJx0Soujao3KQt3zbUt+8Qd1784g++2tPapv7Uata/zdva3gM/u/4JaG5p9/qqVEggdG0H8RY8HLJHLF5MOtHy9rK0rp0Q5bKx+MjHx7C+vn6t6LIGBGE+eNDf+xg68aZdHhQWG6HwArapi7Z8/TTStmN0sefPK3w6a0D48bim0xa+bX9BQHERhGudNIDg+3Adq009neBiB8RWqHmzTwSOjRCS2vLiTSOddMym9VWQxApI3oSedDxOoKBITUWQxC4pDBUVFUCXTVtJxmxTt9QASSrGvNa3hoTEZiMGF1vqxyUkMNjQtB2XsbrUKSVA8ipuX+NSrRVfNuwLUy7i0NUxFbPMjsDAcopjKLPn83Xj81HOTyybzvsjli/hxdQOuz6q+DBAUFw+BENt8GK1TYuAEOWp2qWxhAxVk5xXQGISdIixqtaMynINiAoEVZkMFhNA2Lom9mRDEyoK8wZICLHF2KZorfi8YICwQnONEwSy+lSOocwmST6J3zTkJ5fSeQIkRiGHHDOtkSxMDEgSAarqmorf1E7Vl6rMFA60k/2VKiAw+itAF4mY0rKQ7PISytaM8nMJiK3oyV4ldNcyG0B6//0OiK7mmVcG+x/p+P/Xm2deIeyXH4tvUcogSJLve4wm7fHzxKZzDYipqAkQDE3r2NjZQPLWmEnAX+uPnxgUEGyf71OUNhGLjU0SEGzr2ozL1lY0V5QnBATFYyoKG6GZ2LqKneqZ9GFrYzoXaIc7eh4vW9Go7G3F7dteNTbXMtma5QoQErmLJ0hSVwdM7IC4ioav51voPtrjx+iazj0gPgRObegE71JuColsorPKdxUM1fMh4jTaoPG6hrL1SexBUDgugmPrkLAxZPPzFI8REFexpCHoEH243i/Wyy0gMcCBoMYGiItYQog27TZd7jsKQNL0FgSlTZ8xAWIrkrRFnEZ/tnNg7UFsdk0bofG2LmLl27BJU38Y2tQrVUBMxMrOGcZN6mRtUzKA2IjUhy0ttm1bsQBiKgwTAdNcyUKTNrKyMZ0HssutB7EValJ7WmzbdgpADn9hjeYwK/Gb9EvCNw0LQBy/S0IgxQCIqRhMBEYQ6EKTtrKyMZ0PtCsAYQAh0duEBSDDPQjCk5X4TfotALnhGuODNrsT2oBBtgUgcQHiAw70KtI3ClEYpqIgEeU1TAqHzVzIXHXofBtBmOy+7Jyp4iZtZWFjMx+qtfEOCE1mXmCh8WCYZEymm4VqskOW2QjCVLDs3Inipu1kYWczH6p1CQaIaEKTitRU4KK+TevK7ApAhj9iZSF8kz59wYHgeAEExcMKSyTQLPPYsbnGyxEQEiO/dpSf19ArILy4WQGZikLVBtseP9Eh02y/PuKmc6Fy1yHLbESBtnkVt49x2cyFbk2O+Ac6vJBMRWEKCN9+TGnTudBNeKhyG1HwtjJRTpw4EUwvWRtZ5PP3J0ubrMURgJAIWOFSni5k65RiXHf/VE5f1WTDNL5yKxOBbb4pEKHsfABlc8/sOoniQkBosVHoFNeFpQgF3ZPu3tny3vVvA38F/9GGC64Y6tNGGDJbXvhox+flIS0DSXZfqnx+vdi0EhB24XVxElMphbp7FpXTz8WwYVo/+6MSgc+yPAAiGgNC43qf7Hqx8QIQwbvxIuGb5rGTS/G0AMH+XAXiq55IuGnlJb0HWi829AaIqYBK3Y6dXIqnCQj2mVQoIeqHhMTneGnNKCwAWbHU+JxlAjdNLBumDQj27VM0IdtKCk6IsbFrVwDiERB2Ytl4FoDEBEkIkSdtk9avAKSEAaFFTiqWcq5fAOIJEBKjKMzKg/BjKWehu957AUhCQEw+LpMXQFhgXAVTbvUqaqtrAS+TA2hhc/hAbwKGyMbk4w22NhsuuYrVvnW83ERvc7+HAClAOSx+1UYgEr1Lni0EKvukgIiIshFRKdtWyBZXJZJyLZPNlWu+SvQ2ZTpABgcH4WBfv4gD47xShkB1b1JAaNHLFQa6b/KsGNKc+AptIFDZ6gBpbe+Bn9/wJDS3tAPC4vtPJbDYy7SAkBhE5xRWPGnFaTylEqqEb1qmA2TLzk6oGDcLjjmzGmbfsXoIlKQexQSy2OHA8RsDgoJUQVAqgk37PkwhUNmZAoKQ4DVqah388qan4IMtu4N4FB08MYFjBUja4imH/lTCNy2zBYRAOeasarhlwVp4v6U98RlFB4Xv8rQgKwCpGP5jBGmCaQqBys4VEAJl9LQ6+HXVUti0rSMTj5IEntCgFIAUgAw9diEsx06qhrl3vwAbNu+OzqP0DwwE+YBm7gEZO3YsiC7ZLt/W1gbsJbPLS77KM5iWJfUg5EkoHD1tPvz25mWwecee6DxK1979sGxNszdYcguICApRHguDKp4XINhxmAKgs/MNCIEyclIN1CxcN3SY7+sbSPIklHpd9Cj/WPl2YlByAwgrbhEIujy2viheWVkJIS9W+Hx8xIgRwF5UrhO+aXkoQAiUk6fPh6tvXQ5bd3ZG6VGSnFMyB0QkZh0MonJRO3xeSECobRYEXdwUAJ1daEAIlJGTa6B20UuwcWsHxOhRXECxAoREkDSkHRTb4UUsEr9pHt8Wn046bpP6OijYcp3wTcvTAoRAOXl6Pfxx7grY0dqV+qNTkg7xUwS2kBgBYiIMFxtewJg2hUFkJ2qPzXMZo0sdFgJd3BQClV3agBAox02ugfn3vxydR7GBpAAkwNlEBwVbrhK+aVlWgBAoY86rh2urV8Kuj/Ym2eBTrWsKySFA2EXDOPsY5LKLmtRhd3eKizyDaR61IQtNxuTDhp9LVdoUApVd1oAQKMefPQ8aFr8CLdv2QF9//l/1MoGkQrV4WOZDMLI2REI2hUFkJ2qP8mRjCJGvm1O+XCV+k7K8AEKgnDqjAa6btwo+bO9J1SvYdlYAwrxpGAIEUZu8+E3SJhCobPIGCIFywjnzoPHBV6Flez49SpSA4I4v8g66PPIUolAk5FB5JkDwNirxm5TlFRAE5ajxs+C0GQ3w57pnoK3jY9tNPri9DhLtIxYuZigxYbsiQetgEJWL2sG8kGNn2+ZFb5M2gUBlk2dAyJtgeNLUOrjroddh845O6M/JGSVKQFDYIghkeTI4bESapa1K/CZlsQBCHmXsd26H6+ufhY7O3uAeQteBF0BIPOyO6TMuErgMBlG+qD6NOYbQBAKVTUyAsB7lxCm1sGDJ67BtV1emHkUFidEjlg+RqYASCRzzRDDI8tg2fIw37TZUAOjKYgUEYflMZRWMv7AJbmp8HvZ079Nt+EHKcwGITnCswCkug0GUT3Uw1PWVx3IdBKrymAFhPcqoKbVDZxT8UGSaZ5QoAEHRsiLHuAgEWR7VzaP4TcakAkBXViqAkEcZN7MRqppWQ3fP/iAeg280WkBsICkA4Zf9cJp+1YTdrWOI46te9zz8RvAzSjSAJPEiBSCHgeBjsQKCEB9dWQWVFzbBzXeugZ7eA/yteUmXDSAmjzJ5ttE9SsnKS+kRS+XZTppWBwv//iZsb+0C/Magr7+oAOG9iOzMweejB8mz+E3GJgNAl18ugJBHmXBRE8y5ay307j/oixHp90T+B7kri9Q1LZ2DAAAAAElFTkSuQmCC" + } + ] +} \ No newline at end of file diff --git a/strings/exoadventures/quantum_fizzics.json b/strings/exoadventures/quantum_fizzics.json new file mode 100644 index 0000000000000..0ee9bf9bf6806 --- /dev/null +++ b/strings/exoadventures/quantum_fizzics.json @@ -0,0 +1,195 @@ +{ + "adventure_name": "Quantum Fizz-ics", + "version": 1, + "author": "EOBGames", + "starting_node": "start", + "starting_qualities": { + "jammed": 0 + }, + "required_site_traits": [ + "technology present", + "in space" + ], + "loot_categories": [ + "unique" + ], + "scan_band_mods": { + "Narrow-band radio waves": 10 + }, + "deep_scan_description": "", + "triggers": [], + "nodes": [ + { + "name": "start", + "description": "As you sweep through the inky void and the site comes into view, you're puzzled by what you see. On a small asteroid sits a vending machine. Despite the odd runes lining its surface, you're fairly certain that the image on the front is a can of soda. While ordinary common sense would dictate that drinking strange alien soda is a bad idea, you can't help but be curious about what exactly this machine dispenses. There's one problem, however- what currency does this thing take?", + "choices": [ + { + "key": "choice 0", + "name": "Leave.", + "exit_node": "FAIL", + "delay": 10, + "delay_message": "There are better ways to die than drinking alien soda." + }, + { + "key": "choice 1", + "name": "Try a holocredit chit.", + "exit_node": "it's_stuck", + "requirements": [ + { + "quality": "jammed", + "operator": "!=", + "value": 1 + } + ], + "delay": 10, + "delay_message": "Hopefully whoever made this machine is part of the Galactic Currency Union..." + }, + { + "key": "choice 4", + "name": "Ram the machine.", + "exit_node": "smashing", + "delay": 30, + "delay_message": "Ramming speed!" + }, + { + "key": "choice 5", + "name": "Search around for some loose change.", + "exit_node": "lost_wallet", + "requirements": [ + { + "quality": "have_coin", + "operator": "!=", + "value": 1 + } + ], + "delay": 100, + "delay_message": "There's a surprising amount of stuff on this asteroid to search..." + }, + { + "key": "choice 6", + "name": "Use the coin you found.", + "exit_node": "choices_choices", + "requirements": [ + { + "quality": "jammed", + "operator": "==", + "value": 0 + }, + { + "quality": "have_coin", + "operator": "==", + "value": 1 + } + ], + "delay": 10, + "delay_message": "Thank God for clumsy aliens!" + } + ], + "image": null, + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAAAXNSR0IArs4c6QAAGZlJREFUeJzlXT2vVNcVPYyfLJBw5MKWHMfJj3BJB64okBKnSOfCmIJHa2FFshzZsuTkKS2PApMiXSwFI1G8yo+O0j8iIY4lu7ACEggJkQKdeXvWrLX2PnfmMfC8JTT3no/9cc7+WOfOm8uxV15+/UkLdPvO3vz69KmzbSqdPH6i3X/4YHL/unifPH6itdYWxqv52M7mVvTq8yI5efjpxkwhNzfqysbcvrO34Aej+oyuIc5164J6s/1z+1mxYYYNfTFOnzpLN7pKUzdzCu+u58njJ9rtO3sL/WyBRuQwWVFebGNyMVDj/DgGeSo+VWJyVOCinX1cT5YxaTqHRf5KPltDnBPnKZ6oNyanfo9zGCnfOIYVZNNUze6MsPplGYW1YxVwm4T9LONFPhXeVVvd2IqTVfm7ClLhr8axMX1cRT+3t1MqhaKFAFmlnFfK+JTNGoUdfUOd40yBBi4oGDGoxYJkRJ+pQbNqwKkxI3JUolAQU11X9Z3qV13HTjM2IcuarE2V8c5XKaswO/JlbRl0UHCFUS/FqkQzmY5/tNsFWdVx3fpmY1lAI9yJdir4E+1y/Ngn8wG3Bgw6RX3YvZrPSMnE9pmbEIVnmRTHxTFuwR2NjkfM7GTj4kZnjnMy6KUyqMK/Kiu6zY6UZexszZh9mV4VfZSzs4QS1ybzDVX1XZA6PqzdzaNnkClwaUpJw74RCKR4MMzcqQIdsrGj2BmdIhvvdJuKo6u8GAxScxwc6jzifafKHCUDaVWfiTIUbJSH9CoGjONXUbTKUzmxcs4KPlUYOBJuhttUpl9FLzXm3qMflvpfefl1uT5uw6cSJjGUq8b0cSxwKmvKkgqTzcajPKWz4nfy+Im2pYQgBlQUyzSDMSpjZE7G8GDm8Az+qI3p15FH/GT2OLvYRrqMjLIwCO49Ori+fGZnfr2zf7ld3N5uV3d3F8a88vLrS7aPktM3g5QIL7FN8Y3tTpfYhmNQL9Wm1sTty1ZWSnGiMo45tFIiW7Rqto46qeylZGSZxjk+yla6xfH//d+/5u3dsVUQVOji9vbC/dXd3YV7DJios9MXr1WSwP1WCSNLEmr9YpIZQTKqejKEgDawtq1qlKlFYEL6WObo1cyWVTAVlG6BFC9nS2XjOsUqgEEwGgCjlAXML3/xmzTDs0qs9jySCqLOg/mA02GEKpW8Ul1U2xxiZRAAGTnBLHsoPsrISqZg9y5rKF1d1Yh2tPa0EsTMH+mwg2CEVMDce3RQXVrjCc3Bmt5WSZCdsmqkqrnjqSo5yhtBQyxBzAOkGlHZISn2ZZCoj3FnHnZmYOUyznWZ0QUwK+n3Hv2wEhR6XqgHDFaWSCxRqEqM81wywn1jSYyNR3kukBgkVzzZOJVw6SHdURUiZVUgK7FZdWJy3PlDbTqDS5gZX9SgGCF3hlOkkAX2Y6WOMt1cdwZh/FRQs351j3Yt/bEiM4Apw4xkGagCYdAIZhT2M2NcdnOLoXD3USUGfXEd2ZrjXrL+yA/3PcpRVZ/pEnlUAtglUaZXnINzaYA4HOkUUXBJRTaDW2iEkoVtGMTVvsr9USPM6MrpMclF51XnBHaN8tRcVWWcwzM+WYKrIJvObyFAqgKmCGdnAOxzmDDqp9pcgCodcOOdDUeF1Dq76olVBNEB8kJ+rMooOSNVQlWbqKvime35/YcPFgMEHccJ7u0sG8V+Vs6Ysbg51WDpfbf2byyNdcHDgoWV/6NIDMq4M4I6QygoxXhmVSCDOtU2FqQ4voJGOs0qMKmihMOzOIedA1hZVjJw4+IfKVadXeHSytyjRipgpjobg9I4z0E0p2fUF9sYRER5LKgRBkbdZtWSFpWJBrm5WZ/qVxVDVYT4K0g2tgId2WYeVajFKj6DTCqJOFiWJTqmQ+RTOec4Hdk8phu7Z1Vsxhiqe+Y8ldLIlFIRrkod6oNzzp15d4kvy4zKpgxOHCVy1bm1/BE9268pQaIqUmWOcnYW6ExG5IfBH/1n6XsQBq9YZCocx5ye3as2xof1OTlKV7apDgJOoZ39y6Vxm/xuBc9enfBcxuB2H4f8MnlZOyaoqGdFd6RVxkS5SwHCFkNBG0bRgdERs9KIi6TKegaZUEcMJtwEx6tCMSjwTzzknN2DOZsMFgedlKO6c8eIvNjW+TKZzo9iP9rhfJn5GCP7t1i37+y1c2felYJYsDinVtXCGaMMcIvg9MjmjwZM//NzR2+/c25+/e03t1pri4G0s3uZBglWo3UFkksg/bNSJViiYX1MbvxUFT6zIaNMZ2dj10/+5LY/Gbq1f2MJ3+H47LBTUbzPw2xfwcMZP3e+YJi0Sio4fvrx+/m/t985Nw+Kb7+5tRAsnS5ub8+DYWf/8vzf5598Mf+3bsK1qFSJW/s30jFMDpIKqmxv3DUb2/cfk2a0Xe39EsRCxz996uzSz1fdGcJVEgdn2Hx17nGGKL2y8ZlN6i93Ff304/cL9/v/uNbO/OFCa63R4GA0GhC7V67Ivu1Ll5baGN5n7bG/f8+Eb41hcyIvVilQdhUtRL5qDAs61ef49nlbjEkMEpxUUSojhS9dtcgqidJjBO6NyOp0dXd3oYq8+tobNEhefe0NywPp48/+2D7/5Iv20Ydft7/89XdWBxYErfnAiaQwfaRzZ95tt/ZvLDwtZMHl9qDPY5SdJ1mbqhguEONYts/ol1uKSWTEJjNhTLjKNGphlHNm8+KYkaqk9KrS+WtP2tULx+b3F7e3bTB0ikFx/tqTdj3waO2gimTBMZWc47H++w8fzM+j1XVyzhqJjWGOq/afOTxLwGqu0r21tvh7kCwLZM6sIBUKVcoruMZ4xHGRjwto9cnGj1SR89cO3ntxFRy9MofRSAUZJeVsDo6wPVVJMspgyTPyxHu1NyqBM7uYDS7wVXJvjZxB2KBqVmftzvljqYwyK1VFVQRHrpxWgrNCmeNX6TArCDpLBWJlCSab08ewYMoqBtv7zCamS5Sl9jnOvX1n7+lLG6pMKjgPeSlF2b0LgopBWdll+iL/KcHx5QetffBlPkYRm3uYFaTTKGR1aEHxZrDNBQnydcHB+lTwsmrC/DnOOXfm3acvbXAZmmV8FiS4qMoI5O8WA7MV48sWIatCKtuwhDD6FMtRFkSRDrOCsL1jFd9VCAahVDtLvCrBuj1hOruElsEyhlqwP/1bLBWFTki/diUcswlbABzvMjz2swWP8lhiyAJ2HdQriasorT2tIK219tGHX0+WpZ5uVSFIv2fVFbMwo7jHquI4uIc+hD7G9MD9ZKgiysuCZ4ZCmAHKcR0xZ4zCcQFcFKMeruziPJSHc7IstG764MsaJDvsp1iRWLZXiQMTkXJYnKvaVAB0UlCJQSack0G4SkJcesyLirNJKppR4Qq8wnEM2uG4KQHLNtTJ6nLWCbFaOwiOLEhGziCjXxS2xp/YMedx64NjsV0Rg1osSBkvVelwHAYAg35KXhyzxTpcdGJ7pnBW0rBdGeAwa5XUZipYdhiVpQfFuisICwQVOLh+DNqMQihWFVji7aTkxT5X+ZW8OE7BbKUX61v6Jl1FHWtjsKcaqSwrRFJO26+rGQ3nqGB0ulRInSliIFTGdHoWT7FU4lHYnTkiS1ZZhVd8oiwGp5T/ZMFcTQbMHyzEYkarYGILwO5VuWRtuFGZ8WyMcwImz8lSVHk6NfIEq7XD/x6kUtFxX1mydHNVco1zWuPVIF4rOKZgchagURbah/0zpmQfrCITo1Ap5ZwPF1EFQyUbucBhvFwmYbZllD2ROqy5U8lBSOYkKnOr8cpZ0ZmVz7nEG9vZp/MnhibQTkQXM5U1FSRhRqFAprDKRtFo5pxsc1gWijzcYjL7so3YBP3nx3+31g4e9x4WORuVE+EYlvBckPRPBqEcZKugBbWnFftZMM+wQ5VN58AsG6MRqiyyOYqQF+rLDHc8FYybUkVaq3/HUaFfvfbr1ZkIYsiAwc5+jXuvqkgWQKwNnbqy7sp/3Hy0NYN3fRx9syJzbrxmVYEp3QUxvsyIirGMN+qJfFk7bkymX0bV7zgq1CtIhdSj3OwRr9rDTmrf3P6x7O/a+7VCJ0wvFoTM4RlKQT9WCKcT/SadGezIZRzmnMoY5FlxVDWGLZqCTi7zjVD8jmNVOuwKoio6y8pxHiYxdZ1BWuYTLNkpmMagkYLyDuLFOUznGWPESqZiEpkx41TmZsa5gFHtqvxXA3MVSIVU/Y5jhCq/LlTfd7jvQdhnJIbHETmwzMzm9WvlqJ2Xg1wsgWG7QgpsXoVOHj/hf1E4FXagoo4/zmPtcV62IE6u0rXPU3pWKPuOY6Sq9IP5YfwWvVMFg+N4VomzoKnsAYPmbi5mfVYFGM+KfJS38D0IGssMxYhnRrBKoBTIFpfxixuVGa2CLfKt8GN0+cxO27lwrLWW/wbEVZXrF47N31gS31zy8We1d2x12r1ypW1fujT/VKSyciTXp6oL9rHxnTerJmyOg084thLgDgqy5EhfHIeGKCZIDNKgc7NMxDIS6qCMuLV/Y+GVozgX7aqMiXKzv8U6CJKnVP3BVPyJrXqdz+hrfirBgaQyd7/vn3Hv1D5nVVf1qYBh8KxaGTAgcHwWyAsVxGVlDAjWpxRzcMUtKG6EWtj40urTp87SSpNBM7aQUypJp53iT24P42Vx1QqiKj7LriwYIh8FkyNfBoFwDCMXFL0/QzBO1/4SChdIW8xZMhxeiXhWBVi/W9AsK8VXE6mFVxUPFz/DyVXa5FsSe1CMVJBIGQTBMQxqxXaXVLMkFccy2ZFGEE5v768xim9qYbT0i0JWTVhZReWybF+pKmq8C+L4Ghrkq+ZnVMHozxtVX/HTidno1onBUlVNcO+YbMbPVaRKVXd7jG34GiM1fos5UTRClV91fqgs8lTHq0I1F9S4eQpidT7r/j3IYdDUitGaz+5sbdje45zep/ioPgfnFBxU4xmhLa5ydFo4gzjHZ5Apjot9cZ5TnDl25FGBWiobMd3jvQs2xuso0Vdf/XnTKmyM3n/v0/l1pSrNIdYo9nal2WUWJAfRVLZSeuA8JXfEQc7+9nx57KZoyi8KXxS6+/jN9tZL362N39/+/qfSuPff+7Tdf/jg4LU/FQzPSmX8xGscr+ZFqBPnVSEbo59Tllz11aPrpnU59bqDY4R6IG05TK8gR3YuYbCHOXoFy7p2lF/NDkeVekBsumpUnLri/M8qOJwuC18UOlyeVRpG2WGePQVRh26kFyUYKv/j1DoeDcfvPka/LJxC6FSj2X5TlYHRWy99t6B/vF56aUP/dPifPdVAmMTGqqoSg+9Fg0ZZAGT/uQ57s/uzJOfYrg/bnxWkOizYFXnGa3oGieSgUbx254He96I5f5Wq/+3aYVL/Br1fV8lVgcPK8srJK/LWBd9w7N3Hb1L+9AzSmv7muV+zcVMqwNSMsMkD3PNKq8AqhBitrTdAIs8RvlVdov6jweHmbDFY1Ilh/3XDoOfByRX+fNHJBYyrFtW1GDmH9CzNxrj1r+6FO0eMVCwcu/TXvJ02dQiuOug6nfgoBkdGlXOHc+TK+Exmn4sBofZh5Lyk9jTbY5S/1drzdTYYyVjPUvZRpQhhIh7PsnynzJErVaV64EcdY1uU5fRnlQZlLlSQVSvFup125MlJxsMt2DopPol6Hg7sGamsH9tcFsd5yDfOd4ESA83pGAn1dgGW2ansiCQhVpXW9ViOldspxBZlpMSOEn6HsbO72mPfZ0EjOL33sfGRV79W+zjy1EolNtZerQRTaeUAyWjkkLUqjXw7W33mPkrZl35ZAG2KKtAq3o/CppHEpM40WaJzshmPil6TAmSVLOwWb9WnSSPjN3Xe2OQPqpAQy7eWP0Wa+gBlBGlk/pA9KHB+lNmH/fTFcauSy7wVXKnGVWVUxkfYoPj9XA7tav3Vmk29z3TAYK36gwviLMBRR+yfFCAZVh09jLH7bHGnVBdWalVW+rkQYvjK2Ow+8wO15+vag6oPKZn9+5rWTIBMwd8ZLo181aKMOOxI4KEeI7Szf3n+70Wm+LQtOkEkln2nVAbHO0uwmcwsANQBvkrxjHVs7+Z1+Z6akXPAyBcyI4e4dWUXp9+I7u4HVM/ifLGzf3noSVgMir2b1+n3CBVy+zN13zI/GD2HZrZNOddOPqSjAuhgTDH3BMRVn0yXbBOYflMPot3J4rjOb9PB09ryXwfv3by+cK+e9IyQOzBHOXG8Gxt5jgThKjpVyQZIVZB75BbHj2aTSn9WpdScSqYarYrRGZH/hd+flba1tloAYZVwNPWJ4SoBpfwlO4Sv4i+Ool9mfCzEUkq5jDDV0Uf6u2y1yZkjR92zx85xrCPmeFV5rdWhW4dYMSiu/XNvSEfVF/WszKlQti+jcHsEEra2OjRfCJBVFyOjqbi3ksnZE6oRGUq/0SAcOetkuvRrFjyqWrm2ityjQlVY1pr3l3IFmRrVFWdehXfko+axIMA5iveo44xkScV/pBpWIeAUmhrQ6+DtxmZVep1EH/NGJ8qEO+fv/civ4894Nrn7+OCxI8Io5Bl5q3MG0xEPcoqvsk3ZGHWsBCJicLQ9w+aqr2ITk6dsQydk+1jRcxVS51u8H4Ve8d6tGQ2QzPDMaVkbOn1UNjoMW3iWLdS9I+QfAzAL7CiL9WFbNev3sVGnKGvEPiWX6arkqSCrOCGbN+InbB5LOBmpsaoSOV1m1YwTKTpzppByvvjJ+hyPSnZWhFnbVSF1NlGZtOqcjtz4KU5SCbQMxvXPLAFU20ZoCnyqjq2Mm1U2TG2ScwxUZCSjsj6V8dh4V2XUgrvsl2V8NbfqeMg7flbPTMg78okJTVUHdY980D5mA/Zje6Y7ys3Gsv1lfVk1Yu0zNyA7HE2lDLNn5V71MYiGMhDu4ZhMBrOjsiZZNc0qpJqP/JUtWWKoOBvj4xJV1SGnJAGUhfNdAhuRMYsKZjh6XWcBJmvK2KykV6BQluUqcE31qcrjgljpgTxdX+zPgkZVaDUHE4yyM7NNyRwlBcnjfTXJMFo6pFcdV+FzbHNnBLUZKiNUKgvKiVm+msEz+DUKLViWczwy+Bb7VMavOjw6TbVixvFufUYdEuc7GkmQvS9LMqjHyr8HmVrCKoumMgHKYDCBYWdX8rOFZXq47OkgT6WaMSxedWR37lG2ZVW1j1GBxwKNOaTTrWpHHO+SEcpWwepg4gwVwZKUMWLz43U2hy1sRa4zVmXeDBuraoibXnVSBy3YhrlszwLGjavopCoVC3oVnOiMjOcoIpkSRA5Kon5YCV0CsxCriiU7U3SgrJKohY59LuCUs6hFrsBClWVV1mdzXYBG/SrrE3liUlH3KA/5oS7RppGAQ56ML+OdwS7GDwmDlq25sl/5GPML+te8Cqu6SoMKVhdAOa2LaqeL01/pglmPwQeVbeIY1D8LRKV/tY05B7tWlUJds31168sqUFbJUH8lO5PrbGFy1Nowuvu4eAZxWRHHRMVGsiTOi4apypRVLdw0LLNsHOrm2lylYJkqEkISVbVYhq5UW6U3rpVaV2Ufy7bM0ZxtTDfFl8nFdVG2oWzkwdYGbZjhIGdEVQG3COgYeM94sgyoKkpcPAehsoCP8lRVU3ZmPJ3jVIKVOUZ0dlXZcQ8qe6mCRlUt1Bl1xYTokparoM5etZbM76KNKKu1cAZxm88UjZ8sGzpF3cY4Ypkyk+PKK+Ph+Dk5LPDjJ3OUuMHMkRkfpWclC8c25oDIW1VCFiS9XVVzVWlc9VO82X6ptWcJSSUEllwtxGIOpiI3U0AZ6BYIKwsar5yfLSDTnemfZUJsV05WtQfHZoHFxiBvtmYuwBhPN8dVdaaXksnQQGV9XDCpT8WPJaKow7G9m9efuI1mTBmpoKhkIFV5lA5qkZxeFR4ugJ2NqDvaVpGprlmWHlk7lrQq+5HZU9knXCOnJ853+7bKHIciGI9ZRWEUwrINZtnMyZgh/ZpBBqZnljVRhspwWWZj1UbZjc6BfSiPtTE+OJ7Zgbq7uUoWcxQ3h9mrsrFaJ7ZGSKr6ZrawZID9LuiXflHIsooSrjZR9SmelcyKOjKHjXORnHOobO14Zbaq+a76KLuyrO3WGuerTDtaRZgOLCtjP167uaraMZ4ZZRVI0dL3IKhoZjjOyTZTBRySC4JKiWZy3QZgNRwJDBf4yqbIT1UErGRMFzVHEQuA6lpkiUDBuVGU4qoSto0ESZUiz9IvCl2l6AxxXm9n8InJYW1sfOY4imdFRwePonx0pLhZDBqibgj3GNxQweiqF3N4dHa1BqibgkBu/TJ/YDxUMGRJiiUVt49xXZQ/sz2xv0nHQIkLzhYmKhPnVDcbZatFYO2uX+nJdIrjmK1OdxesbmNQp8xp1DgmmwWjq3xx3ZltWTWvJLHIJ3NcTDauWlT2Ae1z41oLZxAWPZgh2bjMSbHNfaJM1KeqkzOcUSZbzVdrllXJOJ+tAequ1qyiU2Vexs/NqUAct57ZvWtfh24Zrxk6R7yOUcsye2Qex+N15Mmyi3LQOBerF45TECJmJwYdVKBljhvLNq6Lyroq42eVR222yroOflT0QV5VGUov5ltOHtOtGhyom7ORVVOk0surs4oQFWNzXEatLAS2I28VHEqua2fVwFWWSnZ0WZ2NZfKc3oyqVSOrMlVHHcnWShd2z/aVzcnsq8qO7a0VzyBOgMqaOKaaTVGHyBMrFJOLWSHLMljN0AZVWVm7gwrO+Vi7q2wODjF5qtIw3VU1i1XV8VF6MR2U8yPfSjJQ+mRVxAXHWy991/4P4sXXP8RtQZoAAAAASUVORK5CYII=" + }, + { + "name": "it's_stuck", + "description": "Well, only one way to find out, right? You produce a holocredit chit (helpfully taken from the science budget, I'm sure they won't miss it) and jam it into the slot. Then, you realise your mistake, as it sticks in the slot. Whoops. Time to try the old fashioned way, I suppose.", + "choices": [ + { + "key": "choice 2", + "name": "Time to try something a bit more daring?", + "exit_node": "start", + "on_selection_effects": [ + { + "effect_type": "Set", + "quality": "jammed", + "value": 1 + } + ], + "delay": 10, + "delay_message": "In hindsight, why would this accept human currency, anyway?" + } + ], + "image": null, + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAAAXNSR0IArs4c6QAAAjVJREFUeJzt3cFyogAUAEGzlf//5ewpF0pGRJDnbvc1CkhleAbEfN1ut58bcNefqzcAJhMIBIFAEAgEgUAQCASBQBAIBIFAEAgEgUAQCASBQBAIBIFAEAgEgUAQCASBQBAIBIFAEAgEgUAQCASBQBAIBIFAEAgEgUAQCASBQBAIBIFAEAgEgUD4vnLlW/854tdJz5+2HWuWy9+6HWdt77P/1PLo7d27H/cwQSBcMkFePSI8e+T5WXncUctZWlvP1uef5V2vd+9y1p7/aD1nMkEgvHWCTDgiXOH3dU6ZJNNN+j0xQSBcehZrae3siCPtff/aJJo0OX6ZIBBGTZDle3XuW+6fq/fXo/W/ev3H3yAw1FsnyP96Nues99ZTJu7R11PWJqTrIDDM1+3CA9CUz0BN2Y410z+Ltfdxz/780frOYIJAuHSCwHQmCASBQBAIhFFX0pfefZbq0XKPupPu2eW9+2zSVmctZxITBMLoCbK09069s86vT7uTca+j9s/E6xivMkEgfNQEWZr62a6jPiN19evABIH00RNkqq33Rywn36PHv7penmeCQDBBXvDqkX/rdZKjvp+K55kgED56glz9LRhn39/B9UwQCB81QfZemd36HvxdR/azzmLtNW3/TGKCQHBHIQQTBIJAIAgEgkAgCASCQCAIBIJAIAgEgkAgCASCQCAIBIJAIAgEgkAgCASCQCAIBIJAIAgEgkAgCASCQCAIBIJAIAgEgkAgCASCQCAIBMJfgqJi1hru29AAAAAASUVORK5CYII=" + }, + { + "name": "lost_wallet", + "description": "Searching around, you come across a lost wallet in a small crater. Flipping it open, inside you find a family photo of 3 identical looking grey aliens in comically different outfits, an (expired) credit card for a bank you've never heard of, a loyalty card to McDonkalds, and, in the coin pouch, a single black coin with glowing purple lines. This is (presumably) what you're looking for.", + "choices": [ + { + "key": "choice 3", + "name": "Return to the machine with the coin.", + "exit_node": "start", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "have_coin", + "value": 1 + } + ], + "delay": 10, + "delay_message": "It doesn't count as theft if you found it, right?" + } + ], + "image": null, + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAAAXNSR0IArs4c6QAAC4dJREFUeJztnV+IVccdx7+7KyH7IKQmrptuSXzImj5E/POyf7LkoUJAMBiwjXQTXxKyS1wjSYubBoPQ4GLdtERMYlnFUkiyIWkEJQUhrQsRE9eXtWChRQ0YqyKGpqGBWgqufbjO3Zm5M+fMzJk553fOmQ8snnv+3bnrfPY3v9+cc27b8aOHbyMSqTjrn3zO6bhFntsRiRSKqwg8IwNrmstRkEhpySoDL4KOKEiEPL6jgg1RkAgp8ogKNkRBIoVQZFQw5eDps1GQSHioRQUVB0+fVa6PgkS8UZaoYEMUJGJNGUQA7GWQGRlYEwWJJFMnGVREQSIAogg6oiA1pAxJM5C/DCqiIBWmLFEBoCEDD2tPFKQilCUqANlkCCWCjihIyYhRwR2X9kRBCFOXqADQkIGHtScKQoAyRQWgWjKktSUKkjMxKrhTRHuiIIGIUSEbVNoTBfFAmaICQKfzMai1hycKYkHZogJAq6QK0GtPGlEQDTEqZINae1ypvSB1iwpAlMGGWglStqgA0Ot81NoTAv4zVlKQGBX8ULZ8wYVKX2pSRhEAejJQa09IKntHYZTBD9TaExLXzzp19cnmMjlBogj+oNimUPiQQUWhgpQxaQZodrw65As8oYSQyUWQskYFgJ4M1NqTB3nJoMK7IGWNCgC9v8J1lAFw+9w+ZFDhLEiMCn6h2KY8KDI6mGAkSF2jAhCHSL6hFB1MEAQpc1QA6HU+au3JG+rRwYQ2AE7fMBVFEKHYprwpW3QwwWiIFWUQ8ZXMZ/1sRVKF6GCCEEGK/itGTYY82sO/R9G//ySqGB1MWFTGShK1qADQ7ty21CU6mBB8opBix/M5tCm7GFGGZLwKUjUZdO2JuUN9aBsZWONUxaImQ97t8Zk7hMpDogzZSY0g1EQAaLaJAnVNpFW0z44q18/3T1mdRxCEYsej2CYqVF2Ir6f6WtYtHT2TeIxODHm7qSikJgqpVbaS8D0ssj2fye/KRYaRG//Tv2fXXdbns0UlhUySJGmC8JhIkjrEoiYCQG/i8uDpsyQiVZbokCSGah/fspiIwe+bFkme37ReeH3oyPGWbYeOHE+VRBAkyiBCuVo1MrBGaJ/vaGFy7JHnriu3/fOTB6zOZSNHVmRx0vA6UVhWGSiIwHf4PCJSFjl0YjDufeIyAHtRbDCJIjzPb1ovRBFTnOdBypQv8PiUmIJYLrjKkSaGzL1PXLaW5LXXXxVe7961R7mNX5+F9tnRxGFWKcu8poRue95/9ZPef7TnqNEwKy85GC6S8Lz2+qtaGVRRZL5/Cu2zozh05LhyOGUbRciXeU3xGdH4Tm+yf1nIWw5Tlo6eSc1D5MhigsuQSmaRa8eqigyu7x/i8xcdkaoIyz2+N7FTWP+vnRNGxxdS5jWFSkR7evtXAID39z/YXFe2DpwlKc8DFkV279qTGi1s8g/tUOvOv2llXjL3g1CRgcG3hwkCiJKw9yz6uiyTcm/IqlUapjmIPMxiouiEsJkw5CMIHz3e239C2G94+qLwupD7QULI4HJOl8/+9PavmpKEiCJ1HmbJuYivShWwIMV7+08AkhQ808MPCZKQvh8kqXP4KLHWrQOWAV4SVQUrqarFM98/henhh5zawF+vReZ+EJfhhMzHa9canePHc3PC+Wwl4aMIBVzKvTZsOtwdvJKlQpWPMDkubNyCpdAPsVzl4GmfHXUTJFS+4HJeUynkY3hJVPCd7v39Dwp5SNK+PqJSXYdZX1x/u7GwEeg99i4A9TDrwsYt4v4ABru3BWlT4ROFrud3EUM+nknC2uDSEevSgUNHEb6zAwsS2BzPJMkSPZ7Zvk54nftEocl7ZO38OtKiRpk7e+hhFuAmiUkFS5bDFV4SF4anL2IeF4UKmNNEoU0nMj2/bynSZFBh87mo5SF5YSNJnnLw8FFALuOawC5XATxOFNqK5lMIFxkYPmfW65KHbDrcrVyfxw1VSQx2b2uZ/3hm+7pMkmS6H6SI6JCnDDaJOnUOdt0VdDa9aDkA9d2ENnLIcyDz/VPmE4VVl8EFedKwaPLIQ7Iid+IhnAMAnFq+MtN5hy6da1k33z+F4f7Gsmvirhxi2fxn+xAiiwhAea+uTcP3MCtUFDGJHjb3itsiy2H75BIe5Ux6nkJUTQZdsk4tb2D4lsTX0Kr32LvWpV0bhqcvOkWRxCpWlKF8eYjJMMuHJK5i8A9M4F/v3rVHKNG6VLdsIsefPzmp3fa7777fXBaGWFmEoJ4vhKSMJV++g5vK4jMRl+8Rt7m/XObU8pVG8x9JUvA8u/gagIYoi1ykqLMMeZNHuTd0Bapx8eFfsGzV6pb7M5gk81j4698+O4ohnMucuGfl2cXX0udBogzuFJWHUKpmqW6l9XErrEzWWXQdgiBRhkgSurzAtGPyM9R8FNEJPHTJLookScKGTbY4PXq0ijKk3cmnu8OQR5WH+PpdZXk0aZYIYpIs6zqlHD2WrVqNobkOnFp7q7luaK4DJ7ceyPT+Jm2xFYQl6qTvSQ9FWlmbaok2BEt2/iJ5hxf9vM+yVauby0NzHcK2pAdKD3ZvM5Lk0s/2NfafztJK4Pd/+mVj4U5bgj96tEiKemILheuofOUhG9660lz+44s/aNluMrzi5fAFE0JGnugzgUULfjKTPVCusO8o9A21hz74hoJ0MmlyNEu3s2aC6J5yqJPBBn5uo2VWXzN/8uWWwfD3pIegCBnKNmFoQurwSoNrtWi+fwqY26pc7/NSFNso8uWWwTtL59A7JhYFyAtS9EPiXKBw4SKQPMz64vrb2IArukOVbHjrCr6Z+JVzex470CoHW88n7pQgI0gVhkj8jDrFIVFRNIdNiujRso8lumusdFGkES1aI4WOQgSpggxFUFfpXC80ZCwModT0jq3EhXcaVwRfeEeUh/RzsYD6yuALn7PqWYZXIUmKIn0dXcpjZBFU9I6tLN9zsYqkSol6I9HWJ+kT+BQA8MJEtiuyqTI5M45DY+pLXvgLKWv3BTp5EmJI5POcLCK4VrNsObn1gDApaPuNsyrY8KmvAzhz64bRMZMz4wDU3zolbyv8uVhVpUw5gjx0+u3OtcIyhShikof0dXQ1Jfnss183/uW2j/9oUlienBkXrglj2/ltlfkCHSpQvDfENg95YWJOkIQyZ27dEPIMJoYJTISkbaX8Ap0isclDqMyHZKWoKNJafRKjA6OPiwwmyJEkaVstL1bME+p5iA4fUURVXu0dW9jGL5tgEh3kDp+VSl+sWBTUHgcE5H8Tla7TP/bRxwCAC3hYWE5DNxQKTWUuVoz4h48iacMs0yjgC9+RQgeZS02qRuhkndKsuo0ch79+WLmcRl5CyLSNDKyxvqMw4n6HIVDcXYbyMSbDLDkP4aNIqKix98QO62NeWfdGgJbECBIUiiXfrIQeSjE5bDr83hM7sPfEDryy7g1cfWSz0TE9f/3QaL9241ZEyMFHjVDFADnv+PSB/wZ5Hx6dHPffd6z58+3ND5o/bP/vfnjJe1tiBIloaUaLHKTQcf99x4TXL314CgCwb/MQ/vaP/wjbFv99Of79iN/3j4I4YjphqBpmFZlUm5R7865I6ZDlAIC2tjbcvi2mzV1LjgLYga4lR9F17ajZyZcA56/eFFbd0/nTlt2iIBFjIR6/fHfgliwwOTOON596tGX9m089in2bh6zPd/7qTazo6RTWrejpxI1vGn8g2HBNliTmICUnax5iIsfjl+/OVQ5AX9Z9+aPPg7yfKnoAMYIEh2IVix9mTc6MFzbHoGOhktV4zc+i81FlRU8nfv4Hc2FUUSSNKEggdE9ZpDK5RxVWkWKlWwDYi+R5kd/8pHUoJrOipxPnr97USvLtzQ+Ux0VBMiAn6mn75tGOqohn0ukZLI9I456mF2Iiz+SISXoBUO2s1IdZppjK0ah0qdHlH0AUxDtUhSgbph0/9Pn+D1DTxdUMOqP+AAAAAElFTkSuQmCC" + }, + { + "name": "choices_choices", + "description": "You slip the coin into the slot- it's a perfect fit. Now comes the hard part: picking a button on the machine to press.", + "choices": [ + { + "key": "choice 7", + "name": "The red looking soda.", + "exit_node": "cha_clunk", + "delay": 10, + "delay_message": "How exciting..." + }, + { + "key": "choice 9", + "name": "The yellow looking soda.", + "exit_node": "cha_clunk", + "delay": 10, + "delay_message": "How exciting..." + }, + { + "key": "choice 10", + "name": "The green looking soda.", + "exit_node": "cha_clunk", + "delay": 10, + "delay_message": "How exciting..." + } + ], + "image": null, + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAAAXNSR0IArs4c6QAAGZlJREFUeJzlXT2vVNcVPYyfLJBw5MKWHMfJj3BJB64okBKnSOfCmIJHa2FFshzZsuTkKS2PApMiXSwFI1G8yo+O0j8iIY4lu7ACEggJkQKdeXvWrLX2PnfmMfC8JTT3no/9cc7+WOfOm8uxV15+/UkLdPvO3vz69KmzbSqdPH6i3X/4YHL/unifPH6itdYWxqv52M7mVvTq8yI5efjpxkwhNzfqysbcvrO34Aej+oyuIc5164J6s/1z+1mxYYYNfTFOnzpLN7pKUzdzCu+u58njJ9rtO3sL/WyBRuQwWVFebGNyMVDj/DgGeSo+VWJyVOCinX1cT5YxaTqHRf5KPltDnBPnKZ6oNyanfo9zGCnfOIYVZNNUze6MsPplGYW1YxVwm4T9LONFPhXeVVvd2IqTVfm7ClLhr8axMX1cRT+3t1MqhaKFAFmlnFfK+JTNGoUdfUOd40yBBi4oGDGoxYJkRJ+pQbNqwKkxI3JUolAQU11X9Z3qV13HTjM2IcuarE2V8c5XKaswO/JlbRl0UHCFUS/FqkQzmY5/tNsFWdVx3fpmY1lAI9yJdir4E+1y/Ngn8wG3Bgw6RX3YvZrPSMnE9pmbEIVnmRTHxTFuwR2NjkfM7GTj4kZnjnMy6KUyqMK/Kiu6zY6UZexszZh9mV4VfZSzs4QS1ybzDVX1XZA6PqzdzaNnkClwaUpJw74RCKR4MMzcqQIdsrGj2BmdIhvvdJuKo6u8GAxScxwc6jzifafKHCUDaVWfiTIUbJSH9CoGjONXUbTKUzmxcs4KPlUYOBJuhttUpl9FLzXm3qMflvpfefl1uT5uw6cSJjGUq8b0cSxwKmvKkgqTzcajPKWz4nfy+Im2pYQgBlQUyzSDMSpjZE7G8GDm8Az+qI3p15FH/GT2OLvYRrqMjLIwCO49Ori+fGZnfr2zf7ld3N5uV3d3F8a88vLrS7aPktM3g5QIL7FN8Y3tTpfYhmNQL9Wm1sTty1ZWSnGiMo45tFIiW7Rqto46qeylZGSZxjk+yla6xfH//d+/5u3dsVUQVOji9vbC/dXd3YV7DJios9MXr1WSwP1WCSNLEmr9YpIZQTKqejKEgDawtq1qlKlFYEL6WObo1cyWVTAVlG6BFC9nS2XjOsUqgEEwGgCjlAXML3/xmzTDs0qs9jySCqLOg/mA02GEKpW8Ul1U2xxiZRAAGTnBLHsoPsrISqZg9y5rKF1d1Yh2tPa0EsTMH+mwg2CEVMDce3RQXVrjCc3Bmt5WSZCdsmqkqrnjqSo5yhtBQyxBzAOkGlHZISn2ZZCoj3FnHnZmYOUyznWZ0QUwK+n3Hv2wEhR6XqgHDFaWSCxRqEqM81wywn1jSYyNR3kukBgkVzzZOJVw6SHdURUiZVUgK7FZdWJy3PlDbTqDS5gZX9SgGCF3hlOkkAX2Y6WOMt1cdwZh/FRQs351j3Yt/bEiM4Apw4xkGagCYdAIZhT2M2NcdnOLoXD3USUGfXEd2ZrjXrL+yA/3PcpRVZ/pEnlUAtglUaZXnINzaYA4HOkUUXBJRTaDW2iEkoVtGMTVvsr9USPM6MrpMclF51XnBHaN8tRcVWWcwzM+WYKrIJvObyFAqgKmCGdnAOxzmDDqp9pcgCodcOOdDUeF1Dq76olVBNEB8kJ+rMooOSNVQlWbqKvime35/YcPFgMEHccJ7u0sG8V+Vs6Ysbg51WDpfbf2byyNdcHDgoWV/6NIDMq4M4I6QygoxXhmVSCDOtU2FqQ4voJGOs0qMKmihMOzOIedA1hZVjJw4+IfKVadXeHSytyjRipgpjobg9I4z0E0p2fUF9sYRER5LKgRBkbdZtWSFpWJBrm5WZ/qVxVDVYT4K0g2tgId2WYeVajFKj6DTCqJOFiWJTqmQ+RTOec4Hdk8phu7Z1Vsxhiqe+Y8ldLIlFIRrkod6oNzzp15d4kvy4zKpgxOHCVy1bm1/BE9268pQaIqUmWOcnYW6ExG5IfBH/1n6XsQBq9YZCocx5ye3as2xof1OTlKV7apDgJOoZ39y6Vxm/xuBc9enfBcxuB2H4f8MnlZOyaoqGdFd6RVxkS5SwHCFkNBG0bRgdERs9KIi6TKegaZUEcMJtwEx6tCMSjwTzzknN2DOZsMFgedlKO6c8eIvNjW+TKZzo9iP9rhfJn5GCP7t1i37+y1c2felYJYsDinVtXCGaMMcIvg9MjmjwZM//NzR2+/c25+/e03t1pri4G0s3uZBglWo3UFkksg/bNSJViiYX1MbvxUFT6zIaNMZ2dj10/+5LY/Gbq1f2MJ3+H47LBTUbzPw2xfwcMZP3e+YJi0Sio4fvrx+/m/t985Nw+Kb7+5tRAsnS5ub8+DYWf/8vzf5598Mf+3bsK1qFSJW/s30jFMDpIKqmxv3DUb2/cfk2a0Xe39EsRCxz996uzSz1fdGcJVEgdn2Hx17nGGKL2y8ZlN6i93Ff304/cL9/v/uNbO/OFCa63R4GA0GhC7V67Ivu1Ll5baGN5n7bG/f8+Eb41hcyIvVilQdhUtRL5qDAs61ef49nlbjEkMEpxUUSojhS9dtcgqidJjBO6NyOp0dXd3oYq8+tobNEhefe0NywPp48/+2D7/5Iv20Ydft7/89XdWBxYErfnAiaQwfaRzZ95tt/ZvLDwtZMHl9qDPY5SdJ1mbqhguEONYts/ol1uKSWTEJjNhTLjKNGphlHNm8+KYkaqk9KrS+WtP2tULx+b3F7e3bTB0ikFx/tqTdj3waO2gimTBMZWc47H++w8fzM+j1XVyzhqJjWGOq/afOTxLwGqu0r21tvh7kCwLZM6sIBUKVcoruMZ4xHGRjwto9cnGj1SR89cO3ntxFRy9MofRSAUZJeVsDo6wPVVJMspgyTPyxHu1NyqBM7uYDS7wVXJvjZxB2KBqVmftzvljqYwyK1VFVQRHrpxWgrNCmeNX6TArCDpLBWJlCSab08ewYMoqBtv7zCamS5Sl9jnOvX1n7+lLG6pMKjgPeSlF2b0LgopBWdll+iL/KcHx5QetffBlPkYRm3uYFaTTKGR1aEHxZrDNBQnydcHB+lTwsmrC/DnOOXfm3acvbXAZmmV8FiS4qMoI5O8WA7MV48sWIatCKtuwhDD6FMtRFkSRDrOCsL1jFd9VCAahVDtLvCrBuj1hOruElsEyhlqwP/1bLBWFTki/diUcswlbABzvMjz2swWP8lhiyAJ2HdQriasorT2tIK219tGHX0+WpZ5uVSFIv2fVFbMwo7jHquI4uIc+hD7G9MD9ZKgiysuCZ4ZCmAHKcR0xZ4zCcQFcFKMeruziPJSHc7IstG764MsaJDvsp1iRWLZXiQMTkXJYnKvaVAB0UlCJQSack0G4SkJcesyLirNJKppR4Qq8wnEM2uG4KQHLNtTJ6nLWCbFaOwiOLEhGziCjXxS2xp/YMedx64NjsV0Rg1osSBkvVelwHAYAg35KXhyzxTpcdGJ7pnBW0rBdGeAwa5XUZipYdhiVpQfFuisICwQVOLh+DNqMQihWFVji7aTkxT5X+ZW8OE7BbKUX61v6Jl1FHWtjsKcaqSwrRFJO26+rGQ3nqGB0ulRInSliIFTGdHoWT7FU4lHYnTkiS1ZZhVd8oiwGp5T/ZMFcTQbMHyzEYkarYGILwO5VuWRtuFGZ8WyMcwImz8lSVHk6NfIEq7XD/x6kUtFxX1mydHNVco1zWuPVIF4rOKZgchagURbah/0zpmQfrCITo1Ap5ZwPF1EFQyUbucBhvFwmYbZllD2ROqy5U8lBSOYkKnOr8cpZ0ZmVz7nEG9vZp/MnhibQTkQXM5U1FSRhRqFAprDKRtFo5pxsc1gWijzcYjL7so3YBP3nx3+31g4e9x4WORuVE+EYlvBckPRPBqEcZKugBbWnFftZMM+wQ5VN58AsG6MRqiyyOYqQF+rLDHc8FYybUkVaq3/HUaFfvfbr1ZkIYsiAwc5+jXuvqkgWQKwNnbqy7sp/3Hy0NYN3fRx9syJzbrxmVYEp3QUxvsyIirGMN+qJfFk7bkymX0bV7zgq1CtIhdSj3OwRr9rDTmrf3P6x7O/a+7VCJ0wvFoTM4RlKQT9WCKcT/SadGezIZRzmnMoY5FlxVDWGLZqCTi7zjVD8jmNVOuwKoio6y8pxHiYxdZ1BWuYTLNkpmMagkYLyDuLFOUznGWPESqZiEpkx41TmZsa5gFHtqvxXA3MVSIVU/Y5jhCq/LlTfd7jvQdhnJIbHETmwzMzm9WvlqJ2Xg1wsgWG7QgpsXoVOHj/hf1E4FXagoo4/zmPtcV62IE6u0rXPU3pWKPuOY6Sq9IP5YfwWvVMFg+N4VomzoKnsAYPmbi5mfVYFGM+KfJS38D0IGssMxYhnRrBKoBTIFpfxixuVGa2CLfKt8GN0+cxO27lwrLWW/wbEVZXrF47N31gS31zy8We1d2x12r1ypW1fujT/VKSyciTXp6oL9rHxnTerJmyOg084thLgDgqy5EhfHIeGKCZIDNKgc7NMxDIS6qCMuLV/Y+GVozgX7aqMiXKzv8U6CJKnVP3BVPyJrXqdz+hrfirBgaQyd7/vn3Hv1D5nVVf1qYBh8KxaGTAgcHwWyAsVxGVlDAjWpxRzcMUtKG6EWtj40urTp87SSpNBM7aQUypJp53iT24P42Vx1QqiKj7LriwYIh8FkyNfBoFwDCMXFL0/QzBO1/4SChdIW8xZMhxeiXhWBVi/W9AsK8VXE6mFVxUPFz/DyVXa5FsSe1CMVJBIGQTBMQxqxXaXVLMkFccy2ZFGEE5v768xim9qYbT0i0JWTVhZReWybF+pKmq8C+L4Ghrkq+ZnVMHozxtVX/HTidno1onBUlVNcO+YbMbPVaRKVXd7jG34GiM1fos5UTRClV91fqgs8lTHq0I1F9S4eQpidT7r/j3IYdDUitGaz+5sbdje45zep/ioPgfnFBxU4xmhLa5ydFo4gzjHZ5Apjot9cZ5TnDl25FGBWiobMd3jvQs2xuso0Vdf/XnTKmyM3n/v0/l1pSrNIdYo9nal2WUWJAfRVLZSeuA8JXfEQc7+9nx57KZoyi8KXxS6+/jN9tZL362N39/+/qfSuPff+7Tdf/jg4LU/FQzPSmX8xGscr+ZFqBPnVSEbo59Tllz11aPrpnU59bqDY4R6IG05TK8gR3YuYbCHOXoFy7p2lF/NDkeVekBsumpUnLri/M8qOJwuC18UOlyeVRpG2WGePQVRh26kFyUYKv/j1DoeDcfvPka/LJxC6FSj2X5TlYHRWy99t6B/vF56aUP/dPifPdVAmMTGqqoSg+9Fg0ZZAGT/uQ57s/uzJOfYrg/bnxWkOizYFXnGa3oGieSgUbx254He96I5f5Wq/+3aYVL/Br1fV8lVgcPK8srJK/LWBd9w7N3Hb1L+9AzSmv7muV+zcVMqwNSMsMkD3PNKq8AqhBitrTdAIs8RvlVdov6jweHmbDFY1Ilh/3XDoOfByRX+fNHJBYyrFtW1GDmH9CzNxrj1r+6FO0eMVCwcu/TXvJ02dQiuOug6nfgoBkdGlXOHc+TK+Exmn4sBofZh5Lyk9jTbY5S/1drzdTYYyVjPUvZRpQhhIh7PsnynzJErVaV64EcdY1uU5fRnlQZlLlSQVSvFup125MlJxsMt2DopPol6Hg7sGamsH9tcFsd5yDfOd4ESA83pGAn1dgGW2ansiCQhVpXW9ViOldspxBZlpMSOEn6HsbO72mPfZ0EjOL33sfGRV79W+zjy1EolNtZerQRTaeUAyWjkkLUqjXw7W33mPkrZl35ZAG2KKtAq3o/CppHEpM40WaJzshmPil6TAmSVLOwWb9WnSSPjN3Xe2OQPqpAQy7eWP0Wa+gBlBGlk/pA9KHB+lNmH/fTFcauSy7wVXKnGVWVUxkfYoPj9XA7tav3Vmk29z3TAYK36gwviLMBRR+yfFCAZVh09jLH7bHGnVBdWalVW+rkQYvjK2Ow+8wO15+vag6oPKZn9+5rWTIBMwd8ZLo181aKMOOxI4KEeI7Szf3n+70Wm+LQtOkEkln2nVAbHO0uwmcwsANQBvkrxjHVs7+Z1+Z6akXPAyBcyI4e4dWUXp9+I7u4HVM/ifLGzf3noSVgMir2b1+n3CBVy+zN13zI/GD2HZrZNOddOPqSjAuhgTDH3BMRVn0yXbBOYflMPot3J4rjOb9PB09ryXwfv3by+cK+e9IyQOzBHOXG8Gxt5jgThKjpVyQZIVZB75BbHj2aTSn9WpdScSqYarYrRGZH/hd+flba1tloAYZVwNPWJ4SoBpfwlO4Sv4i+Ool9mfCzEUkq5jDDV0Uf6u2y1yZkjR92zx85xrCPmeFV5rdWhW4dYMSiu/XNvSEfVF/WszKlQti+jcHsEEra2OjRfCJBVFyOjqbi3ksnZE6oRGUq/0SAcOetkuvRrFjyqWrm2ityjQlVY1pr3l3IFmRrVFWdehXfko+axIMA5iveo44xkScV/pBpWIeAUmhrQ6+DtxmZVep1EH/NGJ8qEO+fv/civ4894Nrn7+OCxI8Io5Bl5q3MG0xEPcoqvsk3ZGHWsBCJicLQ9w+aqr2ITk6dsQydk+1jRcxVS51u8H4Ve8d6tGQ2QzPDMaVkbOn1UNjoMW3iWLdS9I+QfAzAL7CiL9WFbNev3sVGnKGvEPiWX6arkqSCrOCGbN+InbB5LOBmpsaoSOV1m1YwTKTpzppByvvjJ+hyPSnZWhFnbVSF1NlGZtOqcjtz4KU5SCbQMxvXPLAFU20ZoCnyqjq2Mm1U2TG2ScwxUZCSjsj6V8dh4V2XUgrvsl2V8NbfqeMg7flbPTMg78okJTVUHdY980D5mA/Zje6Y7ys3Gsv1lfVk1Yu0zNyA7HE2lDLNn5V71MYiGMhDu4ZhMBrOjsiZZNc0qpJqP/JUtWWKoOBvj4xJV1SGnJAGUhfNdAhuRMYsKZjh6XWcBJmvK2KykV6BQluUqcE31qcrjgljpgTxdX+zPgkZVaDUHE4yyM7NNyRwlBcnjfTXJMFo6pFcdV+FzbHNnBLUZKiNUKgvKiVm+msEz+DUKLViWczwy+Bb7VMavOjw6TbVixvFufUYdEuc7GkmQvS9LMqjHyr8HmVrCKoumMgHKYDCBYWdX8rOFZXq47OkgT6WaMSxedWR37lG2ZVW1j1GBxwKNOaTTrWpHHO+SEcpWwepg4gwVwZKUMWLz43U2hy1sRa4zVmXeDBuraoibXnVSBy3YhrlszwLGjavopCoVC3oVnOiMjOcoIpkSRA5Kon5YCV0CsxCriiU7U3SgrJKohY59LuCUs6hFrsBClWVV1mdzXYBG/SrrE3liUlH3KA/5oS7RppGAQ56ML+OdwS7GDwmDlq25sl/5GPML+te8Cqu6SoMKVhdAOa2LaqeL01/pglmPwQeVbeIY1D8LRKV/tY05B7tWlUJds31168sqUFbJUH8lO5PrbGFy1Nowuvu4eAZxWRHHRMVGsiTOi4apypRVLdw0LLNsHOrm2lylYJkqEkISVbVYhq5UW6U3rpVaV2Ufy7bM0ZxtTDfFl8nFdVG2oWzkwdYGbZjhIGdEVQG3COgYeM94sgyoKkpcPAehsoCP8lRVU3ZmPJ3jVIKVOUZ0dlXZcQ8qe6mCRlUt1Bl1xYTokparoM5etZbM76KNKKu1cAZxm88UjZ8sGzpF3cY4Ypkyk+PKK+Ph+Dk5LPDjJ3OUuMHMkRkfpWclC8c25oDIW1VCFiS9XVVzVWlc9VO82X6ptWcJSSUEllwtxGIOpiI3U0AZ6BYIKwsar5yfLSDTnemfZUJsV05WtQfHZoHFxiBvtmYuwBhPN8dVdaaXksnQQGV9XDCpT8WPJaKow7G9m9efuI1mTBmpoKhkIFV5lA5qkZxeFR4ugJ2NqDvaVpGprlmWHlk7lrQq+5HZU9knXCOnJ853+7bKHIciGI9ZRWEUwrINZtnMyZgh/ZpBBqZnljVRhspwWWZj1UbZjc6BfSiPtTE+OJ7Zgbq7uUoWcxQ3h9mrsrFaJ7ZGSKr6ZrawZID9LuiXflHIsooSrjZR9SmelcyKOjKHjXORnHOobO14Zbaq+a76KLuyrO3WGuerTDtaRZgOLCtjP167uaraMZ4ZZRVI0dL3IKhoZjjOyTZTBRySC4JKiWZy3QZgNRwJDBf4yqbIT1UErGRMFzVHEQuA6lpkiUDBuVGU4qoSto0ESZUiz9IvCl2l6AxxXm9n8InJYW1sfOY4imdFRwePonx0pLhZDBqibgj3GNxQweiqF3N4dHa1BqibgkBu/TJ/YDxUMGRJiiUVt49xXZQ/sz2xv0nHQIkLzhYmKhPnVDcbZatFYO2uX+nJdIrjmK1OdxesbmNQp8xp1DgmmwWjq3xx3ZltWTWvJLHIJ3NcTDauWlT2Ae1z41oLZxAWPZgh2bjMSbHNfaJM1KeqkzOcUSZbzVdrllXJOJ+tAequ1qyiU2Vexs/NqUAct57ZvWtfh24Zrxk6R7yOUcsye2Qex+N15Mmyi3LQOBerF45TECJmJwYdVKBljhvLNq6Lyroq42eVR222yroOflT0QV5VGUov5ltOHtOtGhyom7ORVVOk0surs4oQFWNzXEatLAS2I28VHEqua2fVwFWWSnZ0WZ2NZfKc3oyqVSOrMlVHHcnWShd2z/aVzcnsq8qO7a0VzyBOgMqaOKaaTVGHyBMrFJOLWSHLMljN0AZVWVm7gwrO+Vi7q2wODjF5qtIw3VU1i1XV8VF6MR2U8yPfSjJQ+mRVxAXHWy991/4P4sXXP8RtQZoAAAAASUVORK5CYII=" + }, + { + "name": "cha_clunk", + "description": "With a satisfying cha-clunk, your fizzy prize drops into the tray. You swipe it, and move on from the site.", + "choices": [ + { + "key": "choice 11", + "name": "Sweet, sugary victory.", + "exit_node": "WIN", + "delay": 10, + "delay_message": "Hopefully this doesn't like, freeze solid in space. That would be bad, right?" + } + ], + "image": null, + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAIAAABM5OhcAAAAAXNSR0IArs4c6QAAIABJREFUeJzsvXmcpVdVLrzWHt7pzKem7qqeO515TkgIIQwSQESQaIiADAooeK/XAZHrAF4V1E8ULpd7Rb0MooiAIE4XkEHBQBhCIPOcTnd6rO6uqjO+w57W+v441W2DEBLoJN2Nz6/+qFP11ql99vu8a6/9rGEj/Ce+ExCRmY9+Ofnmm37IwJPvgBAREXlyDSMAr/7y+wf4WA/gBMARJn0biNULUH7DxRwmLz25Cc0mRDyajicx/pNYAN+KOpOfHP1zZhZCfOMFAhEFKhBCCCFQrVoqwQCATEQUDoPJTt7k+4RY6rEewKOKI4vaNzEJj0AogAlPFCJOmISIkydwcgkctjpCrNoqJRMhBCoppZy8CTMHb0Nwzhly5LxxBhkCkYejjNZkPN+01J4c+P4iFhxNKYEAIFBNzI1SsRACpRZCSXmEIgIRpZQAIIQgWvWeiEgIgSjFKqRSKkliIYSUMjB47zkEa60xlS1yY8pKCOcsewDy3zSkk49V8CDEOvkeo1Vjg4AghRBSaimV1lrJSOtYa62TOIpTpZTWWig9sVgTrihUzBwgADIAIMHEmE0oqGQURVGaxRilApxgCB5K68bVuByNBoNBmY/luF9Vha2E99Z7P/HATmJ8W2KdlKxCRCGUlFoppeMsipI0TSOdJEmapqmOoyTLoiiK4zhOM0RUSq0udjxZKJmZiYgJpZQghVJKKRVFkda6VmvUxb4nXLD+9ltvsQ57y5QbvWc0v7jcGPZ7WuvxeFhKbasc0QZfndz+1vfFUnhk14ZCaR1FUZTEWVKrJ2ktrdfq9XotqzebzTStNZvNKIqSJEkihSpRiqRQSkwkBBYCkJkDTd4TpRAYRUmmIhlHUU3d/vSL03xwcM+di9b5pEnO6aS7NcrccnYwiqIoivIoGgwkQmERvbfMHgngpHuM4fuEWBMIobSO4rQWx3Gt1uh0p+v1Rqsz1W63G82s053qNJqNZhRFWmkx153etm1DkvksHtekFTRgM3Jl35fWGetdZa1lhCAosHdMzalOtz7UlENrnoUBia4E59zsfF03W/V6KoRQKlJKO09CCCgIAJxjwHDysQpOdGId7Qh+W92SJ8uYjFSkdRLHutnottudmbnZznR3/fqFdivuNuUTLz9129YpIQSKNsM0smE6JNwOP97h+vtMPoLSm6L0VTDG2eAJQgATFFhZnX/JuVIbROQAaRQJZTzJQOQ9Fvu+3l24vLF5PQodJbFSygWWUnrviYg5OMfM3+zOnwR4jIn1PW4RvmmvflgLmOznRCACRCFQqUhKFUdp1mi22u3pqbXTM52F+TWnnapf+dOnRbLi0Cd/OzpG3WSuoWwTBKReGB0MxQqYkbSFM5bLioxnEzh4x5Y0nf+MpxjTV4oBAoBgcI5GxpellaMKTEWD3u3b77hJJS0bNTeuuVDrDT6wEOCtE0zMFEJgEER0bCb0uMEJbLGOmKgjuuVEC1AymmgEgQkRhZBKRnEcZ41mvdGYmVnTnZ7duL79W6+/KI3uhfGtoBiYGBGB0QZUJVCOviRXoFnhaszWUFWydVRVwVAwwZNjdCQIghfgGOBwRCcAm8pWeUXjERkjRyX0qhJKK/nQYGm7SE6Znt5iqqKsjX2wzhvnTDjZSAXwmBPruzBXR2mbYlURkFIIJcRk7y9BrEpTh/eAUmudpmmj2W42WzNzC/Prp3/0CpWOviJSj0JBAARQ6JmQoBBeB5bCOWFLKsZcGMorKkwoyI6MseQcWQ5eBhYByAEhhzARIQRh8CYf5aMx93OsSi4LcBUzemABjny5e+P6c4fjTpmPjCmrSgmhAxOiO8k8re+GWI+txDVZ/ibDkCqSUsZxIoWOokRGWkqpdDwhEyJKqaSUUaTTNG22O61WZ2Fh7ZZ16zbN34FixAERVv0bZGACJiQWgpltgMpyZaE0UBFVlipiR2TIWTIcggoeCYgUCUIvhPjiF79y+SUXA4fhsBiMuD8WpoSyACIiZkIhCYMYtjLdbnby/vJ4PIqixBnjrT25SAXw3RHreHi2EOVE25RaxWktSbI4ydJ0IkclSq0aKimlUlEcx2madqZbU53umrXdbqOldSnIMwGjR2RmJgQgEkFAACbiypFhrhwbR4bIsDfkLFnrrSdH3nny3oElCrYs7T/986catSbbQIEqE6qSrJHGkA9iNYjETMCCsdGq1UtZW2pl2chUhSlzoSS5Iw7iYz+3xwQnno+FiIBSSC1VnCS1KM1azU6j0ag3m7VGo9Fo1Ov1icgZxXoiYCaJqjfSdr3RqGkEl+E9zdQJIOLABAzEzEAkArP34AL7EAxBxaEgKpkMWxOsAWOhMlg5KAIaZKsQrLr9rgOf/cIXMUL0FkhKkqby3mPwGAITwdFhSWbOsqzVinutZq1oGVPZsgohUDATvfSkCXicYLtCXP0rOTFIcZY2mq1GvbGwfrrbiufW1jrNuNXGWoadtpqejjrdWj0VCEFpk0ZWaQCuit5O4L5HQgZkBmIMhEDBkXQYDGFgrAIZZuPJUqjYGe8ceAcuUOW5sq4ELsh+/eu7Pv1vX4trTQVaCAUOTOWrygafERExIDKAOPoTCK3WzEz1lpdG40FRjHU8Vt5o75wzTAQcTg5uPTxiHXNz/d29FSJqHUU6yWqNequ9bn7zK19Qv/IyFCoGOdkbOsKBBIm4FBAYCZCAFRMjcSa9IEAGROBASMxE4EF6JOcxMBkHBtkGb9lZ9haCl96xqZz1VFmqnCq8L1h/7rO3o2xY4ypranFA9oMxOpLOB09AtJrmd/TsxXGaxVOddteUlTO2qqrAnrxhZu89E50ErIKHS6zH/DMzgJRaSimUknGSprVOo9vq4hMuXNB4PyODAEYKIBBlAAMgABAYgAHZAbNECsIRBUHEngEQAwhCCp48sfVsga1gS8EgGSITggFvgrFceSgtVJYL50tHhWcrAiOR8h64FkcUYP/iMgXFzByYgiRkAJaHTS2TFCiVimYX1ppgq6oYl1XwhXdN5iEAOScBA4QTnlsnno8VQphwK4qiWq3WaDTmu5HiQ8gA4IGYBQtGgCAEAAimw3IXAwAwB/ZeeMHscaJeBeJAwXv0wBbIMBkKhoMhMuwsVI4rS5Vl60JlQ+WpslQEyn0I7INg8EDI6+cXmOj2u3aEQETIjIeDzMwAiAKAhQwffe8ftOZPecLlz9ww08Ry2tnCm4IcQvAATEQTXfcxf4a/R5x4xBJCaK0nLlYc63rWmOuCgmUHQrJHQgwOZERIZAUFKQRIISiABS8YhEJyDCGwI4lMgYBYEKMnsgQOyVIwHKrgymCKYCyXFZsSjAtj68sAlcPKQ+WpchQwoGQAkCKcffYpxNX+fcsMgkDy5H1BSgIUDMCIQOwUjYa7b/jkh24k5gDxujOfVVVz5J1xlSMnnaHgTmxOAcCJSCwAmMiik3yVONG1NGgkZoAADBBYfuXznyutLkprKvJOmMoJIYkgEiqBeMvW2fVrullChKyYmJmI2QFb8MYHw2yDr8AarmwwFipLufOFAxvAhFA6rogscQAmYACWGCjYWDKHaHkwkjiR/pUK3h1OuxIYBAqBqCNgFsEHRBbgO814mLd7veUkyUxVCKEABMAJL8afGMQ6etNwJLd4olFpLdsNTcFKH7EEAOAAKwddmVwedZ8oSCYYa88AwgvQKBIR73Y0fOCmCzbcJBEcByAGZnAEjp0hMuQrZ0qwhouKC+urCgrDuaVxZUvPpYPKe0MUgAgYgRFCLAKwY0pZJZESsZJWAksIfrWkQklQSkgplSBE9EoHJgq4srwvq63PsnqZ51rHQkgECXDCh6VPDGIdHWYWq/6HWM25Q5ZkdJBOGMECQPnKjocsG5uqsMAIvZVer9e31gohkiRZMz2VJHEkF6rxXULnkQ/IAD6QZ3LBG7Y2OIu2cJWFwkBZUWF47O3Y8dhD4agKbJiJCKSXSEqQAHrOD16i2H39rr2dpCaBtcAYYE9lA7AWSirWSkaJ1BFIoTWSdcEFtA4Hh/bNnH56FKdCKakUAYDgE99gPRxiHQ/6ypGsywmrQggUMC+C9yCQUAJTEE65HAWnAKLf6+/cuXM4HBZFAQBpmo6Hg3Xza2vN7jjPUjEkJsHAnryjYCk4sIat4cKydVyWobBUOc4DFhUVnivPVWBPQEhCBiFIKk5keck5C4bg1lt2ZFmmRKiEyJXavm8ZhAYIQogopiSN1rXt1c++eMumtX/6/s/es2NEyBWZLMviONZaTxKmEeVjO8nHBA+DWA9PyXwkWRhCIPIhBPJgTZmbhINHQCBGIGahhDRFrhI7HPUHw3FvZaXMC0SZ6wI9oMxqkVw0Yi62yITM5JktV9Zbx9ZRUYWq4soG67h0XDgaB28c5D7YQJaY0CcxYrBJFkUif+1/fSFCeXDF7+/Z3NqqkKXjQwPyQgkgIbRSUtV0PZHPefZTzzm9jpJO2TS1e9F64WzlMx0rKZUQSk6qM77PiPWw8EjbthCC996Ywhi3UrYrmk3gIIAHYB3JdXP17b0d8dQlEoVEIQCR2LMFoMpVzhS5md5fdbXbqQOTD8EGa71xlFfeeTSWLIH1UDmqHFUBKwcmeOfREwVBQnAE8N9/+aXduY7L90sekdAf+shnlsayNFCMfWlxuTdmUCjUpBxDoFJps5RrqalQiHRqGqJlaVlICQKPylIMzI/2QvhIWIFHw8d62HGbB7teTEwMeUu2LE01HPf3rHR37tWnLtDkBnlTPe5x5wy+suJ0lSRRo14vizEzl2UZRZGSiUAFQkFjS2//14QprfHWsTG28ugcWg6OwREyS+ekm0j0WsUqRAkgBhSktUwzP1zea8b3z861OND2nf2DQ8pLLio1rrwxHFAJABTAQqKS9SiB2iy21kQLTWI1Lu9TwAIlorKhIppsTgm+t6LW744ij4QVeDSI9XDH/aDXEyCGEIjIWluW5Xg8Ho57n705W5iSWWInCwkq+7TL13765uun0kv7jVoIUxM1VUrZaNSbrXqaxV4v7BnXk9FSaWxlfWWxtOxJgBIsJQmBSIBYz5I40mkslRKTikIiyk0/1n5x7/2XXnZ2IG85e/9HP5FXujScl54CIsqJZDDZvUoRgWo94YprFtbPe2woIXbu+gBDwmCUzLwH55z3fvK5vseU2u/6b48tToxd4TeCKDhnjJFRmRejwWi0bO5NG9fd2vyB85ZIBwQAIAgrP3RR7fq7by2nNiQ6Sutx8KSErtXS6em2UkoK0Vl35u7r7ygqGlemqLgM0hMGATqOlRZpFLVqqdCynkWdZlZLZbud1dNsbm7mX/71M3Nr6t1uiqYCnb31f390mIuqgKpickggysoCi9WKe2at03hqY5zMb95wLkAJPiwvG8/KezO7dnNRFNZW3jsiTxz4pCg5PL6I9VAsOTMDhEDOeVMV46FSy0v7WYrPcHt+Vp8/v2TQAoBADMWe89ftPWt+t6V233RvumsZk3Uia6lIB6jUcPdlW3bdka+97st3Gwulw9KH3FFgSEmmHAkka60SyjlhrU2jCLyzZrx3T5ElcMG5p8d1V4ToD972N/0yHlVQWiiroKKkyIsA4khCohACks6Tn/pK5gEhRCH6yhc+UZpQWV9UuHVh293b91VVZa01xnh/witYExxfG5Dv1Nfl6CsFogBARggMEok97jjYGI7LrWsVsgMGQs8MMRuNy3U8sG1qdMrMntM6D8zr7evSfe3swPKBHaedMrtmzfT2BxYpsA9oQyBA4xgESgClhEJUCEqyEixFIAo+WCHCaLTUbs2/+X9/qJcnI4PGKesIZTQamxAQQAAIRJBSrdl8/g/+6H8rxzuued6ZEsq/+vN3f/oTH8tzX+XDUSVrU2ccPHSot7I8GvaLfOScCd7Bo+6/H3OckN1mEFd7b0RRnCRJVm+3W91Wqz29Zu1Md25TO7/gVLpwm6/hkKFSgMyMICZJnOFwEguTBJCjkbeuqCWdD33k8/cs+pWCK0cGUKCqJbKdRFONejOTnVrcakZTzSROtBBszACRP3HtrVWIRgEqyzYIEnE+toEwHE4ZzWJ97kWXtddsUzC2w9t27N7jQl2gIqKqqqzhmY1PHPl0/749B/bv6a0sjcd9U46DtydB0c43WKyHbjAeITzEAawGeAAAkBl8CETknBeBKjsaObFjuX3LLnnnDtcf2KlmU6gkkEcKzMgwaR2DAgIwMIR6vXPXnXc94bKzzti8/pY7d1vPRNIFb1wQKJFJSRErJSQmUYRCMPDi4nj3/pFIWipOEDILaDzmhQ8T4iIw8MxUK9Fy3959u3fcum/P9n1LBdmELBvvqsqYCmVjbdTZuG9x/3Blub/SK8rc2so78+jLDd8FvuOdOr6WwoeOSUOh1fgxrurw1ltTuapyVVWOcxq65t7+1C2727c+EN10T3Xr3ft27islppGsicCOFLMQXgZPU9Ozd973wJrZ9srAHuxbwxK8D569D1JJLUUc6ThSWS1J61Gc1nbtOegCGO9LQ4UJg9KNC2fCJNIEcRplkULEwtpADlhxAGQMIfgQLAUbkvWnXS6iheXl3tLBQ8NBrxj1jBl7V1EIcFI0/zu+nPeHjtXADnjyBBwqF4IxrjLleJTn+WDQT9M0rtWyJK4lrTiO42Q6TuejIG67O00TlWnZ1F4KX+UrRT4Yj/rVqJ5ft2tlGDqbnvKsp1/9mY+9f+fdXwL2w2GlmdNE6QjaLmMha81WYciSKC0UhgaFGwwrRwggEw0Xn33arffcS0EUpSdQAMBSlSykT+qt6YUN22qt+eVBvtgb9Ht7xv2VlaXlvBiUVW6tDeFk2A9OcEL6WEcDESfKtZRSyVRrHelEa50kmU6zOI7jOI6iKI6Tyc+jw5jE5iIVCyVBilhpKaWIZZLWalmz3W7H1P+rP/4t9ivdVKyf7bQb0Ux7WsVyODLb9xzQUgXB/dwsD4uh9QHS08+5opZmWRLpWkNglKaNOMsqx4VzzsBolJemqqoiH43z8XA06I3Ho/F4WI1HxpZVlTvnmIj5JGnlcFIQ66h+MoehoyietK0SsVYyiqIk1pFSSsfRalMrpSetrVggSiFRTPJwkiRJ0rQ1NTMzs3ZhtvmZ9//PRtg1Xcd2M1UyHlZVbxQO9fMAmoUb5dXIssXa1S97TXPutPF4OOj1R4N+WeZVVXnvjTHOl957WzlbmaqqyjK3VZmPh8YYY0pT5t476wpmBjp5mpSe8MQ6giPuJAq1KncLkFILpaXUk55YapISdZh8h/vxTZTMCbGU1HFWa3S709PTM/Pza+cXZnde+94FsTtNyHtf5bSSh3v3rwwKrMB5Ul4kP/6zb1TJ7P49u5eWlvqDXj4clGVunJ10/giVDeScs84555ytjHWVKfJAzloTgnPO8eE2fycHq+Axr9I5hjiSAMjkGTwTIqIDK6RElAA4qWKFVRqhOFyJD6vdROVq8z4dJ1nN5OOqzIkRI3XelS+lO/5sWpWV9XlkUbte3hibMVtgxNbcKUkys3PPnr0P7FxaOjgc9QeDXmVKMm4SoiEffLAhuEngnJz3wTrniEIIjmE1E/DoEOHxPM8PEd9llc7xkJv1H3H0qA7zjOiwMfBuslzqI4I4Igo4nFkgEAAm62Mcpd4U1lVayFhTI0pns/l2up+sGUhghF5DHhxK44ExfdbzXr57z759u+7fvWvH8vKhfNQfjvrOVOx5Elgk9sxMFCavAhkiwiOT961izsfh3D5cnKi7woeIo+/Q4e/dhElECBNFC4+U08Ak1c45J7QSUvey5Uaj0Wstn7r1gppdAs+EZALUU5UokAgs0jSpLy/vXlpaWllZ6q8s5+N+no/IuxDChDOTuDJzYJqEpRkA6MSnzoPjuyTWMX+kjonxfyh/jkBwpCbrGyUjRAzBB3LMIc9HUkVFPhqPBvloOITT0kyRs4mXmfGxxmYt7hVVZ3p+qdcfDPuj8aAYj4p8UIyHVTmm4L6J00eEt5NCpfrOEN/5kkcFD56ENPGKjs0/Ovz1LccADMhARBxC8N44U5pilI+rYsBxN0pVFgutoJ5JJUEjT03NlJW1lTFlZYyx1nrvgvdHr8hHcqkPa2/fF9Q6MZbCR9nnmDjdIYRJmpT3PjeWo3YkDjmnkjJKlMgiKbVYs2ZDZY0xxrnDrvrhZL1jMpLj05d9KDheLNYxx3dt4SY3csKrieUitkRYEcWxjhJZq6kkFbUE4yiqd1rOOQ7knCPy32Oa3rcbzImIk5ZY38stOSK6HrUEh1o9jmIZpUrHMskwq2ktvTWlAMHMQgg+jGP0CU5snBhL4aMPAoTDZVhCCJQiTVNApVPWDa414iw1sUZyjiMBYnJ+k1jNGEX6vnCjHhT/SaxvxhG3BhEnx59oraM0SjMldCfJKKV+resayz6NB96P04Y6giPHNj2iAzshcMyIdWJ97G8HRAQQk44jUkopdKSTJM7qicbUqtoMB58F2SjU7Bx3Ov2l/t7p2QviOD3CKkSJIB+JYwFOrOn9DsR66PLSifWxvyWOuFaT2E6apnGWJo1ac6rTqJGqN6nVlIzK7U2K0DVu89aNy/fua9WSer2eZVmcpXqcOGecM/RtEmBOjsfvoeA/l8JvwMRbX21hGiWdTqfb7bbb7VaDZNaiZL2kRNZCvcPe6dm5MHVo2G3XarValmVpkkVpZl2ljHInXVD54eJEzSD9HoH/AbB6MmGkoiRJm92puenZuXXr1i9sWLdx/ZozT1dT0+sEnIIwg2okhUSpdKx85UvRZNm11pRl4ZzlQN4TMRIFBgQUj3W+92OD44VYx1Bbf4j/7uj/i4hi0ileR1nWbLWnutOzM3NzGzet37hx68aF9jlntUHOAUwxNkFYqaWSMtKQKHXfjl3d9RdVla2sDSEwgHcemHG1ix/i4crVhz6qkwDHC7Eeafy7ZUIJKBAFAyIKpbSUkY7SOE6jJGs0p5qdzvTs7Pz8+g0bNp6y7ZSNGzdMt92auQWJHYAEIBBGQsZCgJTQ7HbilIm7nHS88RSIAYFIIApkIaQQggEZxOGj7R/tR+ixwslPrCM3khFQoEAtpYqiOI6TOE6SJEuTWi1r1hqdVmdqamZuzZp18wsbt52ydevWrdtO39LOli449wypuowawAMggiIwIB2qFGtyfnqq6t2BEOtsjZRKRxqElCoWUkgdo9ST5FQhxGrHdyZ41C30o4/vhlgn2IyI1VMrpRRS6DhOJ9WIcZqmWaPW6NYarUar3epOTU3PzkzPL6yb37hhw5ZtGzeva599enL6qeslNng1iwsPp28lLDVJQCExwbmWaCcro/6o1V2PKpWCY6WUTHSklZJSJVJIFAKFAkSBkkEAr3Ylfeg4sab9pLJY33rqEYGFlFqpSKkoThtJWqvVm/X2VKPZbbW77c7U1PTM7Ozaubk1GzZt2Lh+0+YNs2vnxk97ypZWo4aQIaeMRymfTAAoMEZMBSaIgpSop3DqWmhEu4JF3VgPcV0rraIkrdWl1JGOVjOhpUBC/Pfe73xi0eWh46SSG/7j3n6iG010qSiKoyRLs2YtzbJ6vdboZLVGltWazWaWZe1uu9PpzLaj+anelVeeStF6wQ2GDLlGIJkJedJz1gsIjFXwA6AhUoluzDgEKSCCTWuaC/Fw+74D1xUwmNqyd9H0+/vq9ay/0ktG2WDY17nOWUgrDTC5AIiTAoqTD6vEOgmSrL8dhJj07o6iJMtqjVar3WjPdNrtmem5rJ522u1Oe6rdbjdrcSxWnvPMSCTrAbWgOgcjBAIgkPJEzudU5c4NvBt4mwdXmNEKeBtcXhajyozHvREHyIf5gcWVe3ev3Lwbfvzlv9XPu7v3Lfc6SwcP7Euy2qC3olQ0Hg8ZJpk5ABjgZJz5k9MOH8EkxhInWZTUGs12o9WdndswO9PdiMtdv6gV6ag+HA8AyFo7NTuTZlpqFSlNjLVao9FuWcfBC5RkjKlnNYEUnHFghUD2uVaiqooyH3rvyQahtLVQFkVZUtya/fA/f/HgqMqDPPXMCy+69PK9B/q9lZX9+/eOBiuTDGZvTQiO2J98duukWgq/JSZFhFrrLKu3291Ou6aqxd27b1oWiMiFsVrLNE2N89v3LU9Nd9I0JaKD/cHU1IwxVslICIVSEJELVikhkKoyL4pxlsSmGntvBRARjfLSEgePEDjPzajyIy8JdQJ2//03fmLn7dnUhjMufLK1VglwznjvgSgE91jP0COC7wNiCa1klCRZrVbPsvp0Z/qMubmyVgUzIsJYhbIw3nNuKqynjSSJY5Wm6eb5OVM5EKunNVeeq6pKG02tILgKU1XfsLY0VVnVECHWkXMuWOcCBBYUSi0kiOjOA/n1d+32nspBLmXV6906GpdnXXRFCC7Px8H7YJ2BAg+f+3uyQMFjSKxHyatDiVLKSOsoidO03mpPNeKlO//VDQadbsMGOxxXRKSUWjPTLstSYJCgbFn0+/16rZnn+SThOM10LdLFaDkPIU1TlLBn336lFCIS0WjYz7LMBXYuAIhxaWpZA4jrsZLkAxAKFkqiDC/48asPDHxlzWjQK8tcaKWU8o5Phs7u/w4Pj0QG6UPcP3/vyZbf8R8djtWIydkoadrIsiwTLh8uqywhGbGKdb25f6V/aDh2DBjHK8O8Py4PLPfzohrleZQkUZIMRqPt9++uDHnA/cvLK+PxgaXBgaXBMPeONKqaDer+BxaHOQlddwzWI6Euyyp4psCTMYQQmNyf/fHbOo2sdriphNZayuhIU8lvEcE8YXHsLdajsME5esa/6QYcadC4qjKoSMe1SCdaxXGsW82uxKV6YyoAHji0QoCL/ZUA6FDcubhYlqW3AQDiNCmNIzqIiM45IoqiaM8dd4YQEFH0RoY8Ior+cPJkEgRmxtGYGU+b35glrar0WWO6saah7j4QKcnkOXiCVARoNFrNziA5WE+LYtJhRih/ji+mAAAcdUlEQVTlrTk8eBGCZ+YQAgBNKiAf5pQeMRaPpRU8IX2sI+xBKQQqreNJkt2RAlE43K5Yx1mtXq816rVmI8uyLMuWDiwpH+pTawejStVqy4NxYPYjG6giokl6MeRmUnTPzCQUI7MnFEqo5EiOKCI6kJMK/Ukzd0SUiIWua62iKPI6itLO7Nw6JwQHZ23lbKWd11rUa81mq+O9RyXiOPXeeueODN45Y0zpnPPBsbMAJ2QK1wlJrFWglFrHKo7TeqwloxQsiDwzE4IQCoVQsUoaU1ka1+rNJK3Va9EKe4Lmobyoz24uIGRdYg7BOWdLcpaIEBGUjgULqa0H50tixyCVkHGchuASGbNKiL0ARMneYRQrITOhlBRudu26TGZCa7LeA81v2eYDG1tWpXVlv6jsYDDI0sZMtyk81NJoVDcAgJ4ohBBCQcZWpsr7eZ67clQRULAP0/YcF+7asSHWY5IYKYTQKpFpPYvZEIEvAzTieq1ZawJApHHx0C7B2vUO7V8s7dTKps0bhARfSmi0/uJ9/4CiUoguMAA+74UvGo+WgjMYrAFQLO/esZNtIbP67Px8XQYAYBEvL/d6Bw4ImaSt1tzcXLfV+tRnrt1ES1PN+L5F0z3z4rt33rFuXFx8Wq3MxfW7RwagAIgBMgAnYInFk572zINLS2sWNt5w41fuufHLUWAJDAAEq80cFLAHcDKuTc0KFUtJk+4mJ5zROjbEerQ/tkCenAwdqfULc685Pb77a9clBGddnP7aJ+5Zd8rVAcy1n/zkrz37vJecNXZJ59M3LL/rq7tQ0KC38q4P/tUV61rvvEr39puxwSedPnf93sF7/u7991J6/uMv2rBhS5vxs+9/3+d+9ZwaxVZ0f+CPvnT+c68Ogm75+o2/fnH0rB/sMgVEefHv/8vzXvnfGqOlT712tub7Bc6e/tYbWgw3/GKUiJxQBIwM1267Lz9vG3gHn/66vbFK3/GFzy+s2yIkLN7wxe2/PFfnkplBCG+rOFEehGAdwB6i6Se+9YF4dq230p+YOtcJvBQSEQPko+r/fvyGj/38fJ0WBe8969XdS978N825da8+z73mnJsS6YR3n47PvftQ74o4vOsP3vDAGzZkQDW/SKfHjkLAxSdslD/1pBpF3Wf94Rc2Xvq0MbsZCfNqR0JjKxo1gqzeIUkglDT3t4PLEAKIFKBgsWUui2U1VslHb5uq5FIWKMqQWWimSDiBxSXnCAiVTsWzL4croH4Hi5XlQxvDtlhCS44yUXkCnyS9aItJQt3vycKIZZrbMgAnMmbOgU/I2s8TctBHQMS2tDcM4Vn/c98Dbgpr4vT64BmnBLX8wJteWE86Vqf+Zz8Mv/ov9131k6/6k7e89atvfvys2ldP90NNj6bOvOrd7kO7N9hW1krKZjJY0PC2P/ydhc76RY5f+xdj2Wr8yntHexlFksVJI01rF553eloHqAPWoNuGbrNz/X6znE63G9Vde+/deuaFhgEzhBphJ33tp/Upv2vWv6n6x8UtKla1mmy2Br/xnNnt99wLxB5ANGJIUbT47V9tnvr7d677rXue/+HmE/8Urni3PPsPDoipjdb6E24FPILjhVgPT7YhRgYmImtDMJvPetztBbzjusANZ+r0lp9/3H+76tTttn3r6Kz33jb9we2wacv5kuCpG2Cjvil0vUrwc6P1G1/79eYzX/4Lf33oVp6nOkll3vs/okvn+e8+8v6czJnnNU00uujxtQCcZpnGJjC+4I235s1ZqMM91fTOPugom9p85icPbb5HXDhz3rN1WvcAtonYQFZVPbVDCSGGhQUja47rHKX0j1+4a+PmrZXlgYgO1bdgA1Vd6tjEAMjwb3cd/PpKdOP+cWthUxSD8SUzTbSMR3LuHxE8VGI90mLdw9JLjwzGe1uUY2t6m8593Lu+Wj7vLfDCt7nf+MOv9vbt2Lyp4G76Pz6+dNkzrt60ecvd99z6ihc/E7s+yrDqyL+/YfiGt77nSU95/uvf8tZX/a97y+YUNylu8DXPe0bSok0NePWPWd2EFzwnWBa1REdJdM+9u55yeRfSg76p121RrGFQrTzu4gvefQM//W2Hrl2EJz75ykLAG/6yDA3mLr7uxY0v/e6mT/72totP3YtNSW1xG1/2R582a+fXC0Sd1G/tzeEUUpP+6w8P9//5zB3vedwl66PLFvyf/uKFYrgbkfBELth/qMRixsMl5Ec1kz0Kj6ZMfJiFNDmycDyoTGnPufRJX9jHU2vSd7x9yyteuQZrPq+dX2XzeT4uC7ewdt3HP/+FUFOhzvcup5+5eWVqatZ76rTW3n6Q/u1WRw1PDX3Xrj2DniUGqBO3AFMVkOJ4WtXUmWecWlcr9a6Manjnrj65OO8N+v0VDMX6DbOe/NJ4fyDYdE4d65pSKqA4/bTlszbdL1PYGZ/+qneKJ/3ytS/86V9FnUaJ8j6ce8H4i/dlNknkzFTZWlBR9uqXbPjw/9nwgicd/OM3vnCx1wdiAAI8Wj4Qx88i8+D45lE++JJ0dLen//irYz64BwczA7N3zhRlWZZFUQTUP/Wier2xf/P6fXEj/PCr3rXtjAuc84GrSDc++vlCTM2LaXnmeYMfe3Z9ce/9kYY92++76or06c82sovcMfftvKMa5w6B2wQdCPUQCWhkstWc0lr/6IsvCo1AXT7vidTtmCIflXm/KJaCXXJlz+deInzuy2M340Qbn/v2oK5yr3nfqaZbW7N2+MbfOKWR8Sc/8beTk8cDB47KN//tYLF2wUfuXLf1+Ted84rP/9J7y8teg6e/ZN/PvfW6dj0LEJ24UZ1vJta3X5LomCtv3/usTbqiE0+aWIXO+rW/955DXK+gDkWzw5oCeUapRRxlqQF4xRuHrnV2aGX1tP/7r//5X3zVs9/2e6/9k7c/RdTItGBIp/zbbXDN1S+jCEQr5iboKf/7v3b+G37tV/72g+/7+le/FOvd3NbYSEN97b4elOPlYPpQFmw9+kpTVTE85+p6XFPUlVKrTads/uA/38mtWLV3za6545N/Ob+yuAhMgoEqG021vIT7x6f92y0+7swK1bS5L3IXWp2lleV6XFcaACaH2h/Bsb8LjwAEgHgs7eqxMnJEFIKz1hzYsesHf2RWdQDb4v7l/UKnxCCEmBwX8Bu/90f/8K9LNz7wgGyG//5LOLxLVrfH/XuiRvqvPOXjduc1b7vbgqqC29mDZX0RN4Wcyl7xY8Pr/vFKv+vaxVt//JTzCmrqYdp56wfj7vwGUZXdWJ+6dm5juzEbJa0EIglXv3ADNj02BWF40UteOQqJideJZiwyOPWs4Z3XP/O9f/aHxWjogTvZ/r9438xF537xivNuuetfs/03zN/+qfhD/yf84eu3/s83qQOL2yUe/xz6tjiBdawjcM5CILLGM7z0xadz86D0dM4FHVPtg+B0lNRqadasx1EW0toXbzl3etNgYWZXBGOUVmIriFCW3c98futff/yLL37hSw/u2fPSF//0+kve+Qe/cenf/sNXtiwMrvwhJAHv/ZuP3XJjeeZZzR170/f81V3PffYPh/5+DK4aF41aXbEr+yMIcPUL7/jYP2fsOU1qiw/s/pn/8vMbL37zNT+s3/G2DexD7G+roT+4fH8qner22rgixfBFL0MKDzBjvUlzawXK4c6DPxDc/0MGxBMox/cbgt/HO7G+Y9oWMyNQZQpdaJXAT/zMtR/6m+ctLu3/0g1DVEuMIq03G83u7PRMovRznnblZ7/s//tvXxvFsG0DvPynZzasu/CXX/PJvQdHXux//vOuHh3apyRykl1y3uVv/pPr3vK72+Zm6lHUf/u7F3betlTvRh/+eO+2O3o/9PSn9xf31zhvZonWteFwUJPdfHQgAB7wrTe+/WmC6dqv/l19el8SpWde/KR3/+21e0fiiU945uMuvjBq/GL/UO4ZQnJu4Q/uuHdcqyV3337HM3/w8S6Mgqaq6n7w7/ayBOvI+weTsh481PPYBoKO3+fhaEpJqfGoFvu42k+bJskFDCJK0jhOsyzrL68EqpSK4lifsu28uNHcun795vnp2A5guN8ZWxJ6jkAlabP11Ztv9EzbtmwdDYcKSLgykwHYK6UYI1nvvOuDH7HeURCgEQMhhh/5oeeCLYBMA918M5rtdhBCnueoaiPjQ9w8VLrSw4QQ6Hy7kVY+LI9KAdopyegREUUklP70Jz6ltAYpnDOIGikERwwOBEmphZDeO+dLIuLwYGvi8VkIc7wTa9J4XcnV/REBM7MQ8sg1iAhCMHMcp3GcxnGcpXWplVC602qtbWdzulzbrgkzBKWJhcV0XDmWmoUujTG2hOCVRHZGsa/pqFVvVKYIjBTXe5YDSwYRmJypIBhn80zLRMqE7dp2jbzVUimlHKgQZ1XAoQ02IABYV4F39SSqihJ1PHB+pfQACQGj1FLFk3NXggDv/Wg06K0sG2PKfr8sc2NL751zJpBjZqAjt+nfGXaESccnsY7TpfCI6qF0Ojm4S0ophCCcWHicvFxNh0L23kuppYrjOFZpHCVxmtWmpqYUBINw71JhSzscHNJRVq81Gu1WURrrDJOvxiMpBQdXeUdEYHMpejMzM8yOXOVZMTIIZV1VVYUdj40pGXytVptu1pb3j5WWtTQmZl2LtEwYVAW+ctZ5L6QOzPmwZIEqUCA8tLSS1dqz8wsy0jqKJycMkLUB5SB4wWDzsiiHxlTGlN57Yj+ZCkA5Oatswh7vSgA40p750afUgyyyR351nBKLEZhRax1FcbfbckYbM9BRLaCbnV0A9Enc3LPvXmYFHNbMbvbeo5Q6Nvv27VM+abiZ6Vb6dx9415mnwfkXtncvjr/05fDKn3jpcDi+Zfuti9c/MBya07ZpIS4676wzfDEufXX/9lvWzHVvve/mQ4foJ37sx0sjbrvrun17F4OHM8+fiuS5mxfW+ajuzOArN3953cbpG+9aXD5QXH31NXftuPP6r908MSl8ePAoAACQgAKcfea5F1z8uI+8793v+JOrnNn1F3/98b37YOlgxqFYNw+79oCO4IyznqpUDGg9Cee8dRUwTx4vrVKVJJGKpdTAIpCxNgrOemeOnObyaN+dB3V5J98cp8QCmpzGFam4ubh38brPXXrqaWcg9nora7ad9sFn/MhPXPep999y8w+tmYIA5R+89cBv/+79T37yDz35qbtf++qLlRgfHK7Zsu0vXnQVvO9dicNSkXzxTzcaMwtfvuWfv/bFp1r7NxozE5KffHm/NTudiA390dI1529//S/lffO4P/2T7PVv/FC7u+aum1/STN4hWBDLpzzr9qx7tiY5qNInPV6++71YFGd+9J/O+Nn/8mFFRe/AKYk4SGiB9Xjk6o1YCGCSgjHHtVMzt59x3vmf/fgTLr3snxDCq16iWRDh7K1f33n2BfrQojuwlL3tnXtuunEq0nUh8tV7gwgAUug4TpKoPtVtbr/vTg5BJmm9PV0VOTOwO37DiMdtfIAQCBFjEUVJ67d/80vv/uP/Fw2/9pbf+UcU8KXPXxshJNUnePwpyq/Nkv0qRpX6n7l6VruPCvtpbfc7D5ambamkMWSgGuva7JYkabvBTsyHUOS6Ovjzrwp//p637++Xcxs3bd24hqsdcXnT+WffhQgklCh3K1NKVyi39Ju/pD/9yXekrVajNTs9xVFxf4dvmu9+hShyBJFZZjeWpQnl+htv7nzl+nZwqSjHphSRqZhUlMaldaLwYsxYOj8AUZRnb9M4gpm6PP8UvuTMxR33fVnrBACklMiTQLtQKoqSLNHR2umDN312S2/x0ieeZ6wpsqwplEKUcLw2rjlOiXVkpkTE6zau+cRnyxuvc8qGmZpfM6sPLe2+68sXtxRgQSoPr3rulqueOf/ZT3wMywILDiuN1/363Vu3nv6xv1/ikcaR/PRH1jLHkYpEFHMOuozCkEQeHr9t7+/98ql//efv3LzxXK48jAFd46v/lvhQR6m5AhwDDQnG8PRLh7/5s/N/+tY/mp2dRiv8WPkyvu/6dSD7ABLKNuaMffm6X+tf+bz9T/7hB04779Cmc+1ZTyi7W+77iVf8QggaK8k5QA6m6Gw6M2RrD7TWicpcJspAQ3rZs+tXXDhDnB9xpOCots0cqanaymlze2uDr//mr7e1QGaWUk5y/4/P5vLfE7Ee0WdlUqnChFKkHOA1P9UNY3PBRnv+eldT8Gu/cEPvAfYDpJFQYuc912+XFGiwSL00L+WH/vaB884/5+ofBDk2vk9XXrG0ph0ZcghQVsqPbD5o2r7Eof+p5+675wvP/8mX/RgXhvqMee9XfoqEqCSgGSEPorzfETnjYPTCpx/8179/+e/81uvQBTEC6I1efs0iC7l23ebeyrzoJ1jJ1I7XtFMOsHs/HFiJ9+7OkdeoKGKB5dBTD10JMHRX/zASwIuvqqnB3TRKuSd7Bxqf++IhCEDkif69Me5qOxMhb7zeQU5cqL98xzJCJCVP3LhjSKljeyu/J2I90s8KM/tQee8BhMrOFivhysfD29+09Vde8dw3v2FNQ4MbzowHZ370A2f+5E9esbBW2mKjL5Lfe5PyMjl48OBLXvQcHls5lLbX8nbOl+U55z/uZ197w8/9anjaj6x86MPpqOjyynLbfO6SsxHHMecklqM9B08VMrrqmmte9Zprr/ov1ROetfLu96Evp9UKr298/NwtU2yJhkYM1D27z9AYx7Xsg3/55TAU3A9venW18+9ozz9dcel8eNJW8543XbC+vbi4d3ua1D/1ifKmGzdCD/V4/KaXJts/ecb/ejWqwRL2YmPk//1Qx6u2qch7P9ktTmZgUtzR6GTLA9i5Y5MbxDffCWkWPxLi57F9w+N0KZxkxTA5770L/uLLf+AZV1+7e8c8DOCf3rN95b5/jKvc9+sX/OjiO95y249fesvV5xx84kxojO/Sw/zczeNIRZc/7QXPfuk/DfYLMRa//nvDz33x62Vpx/2V55xVvOPnal/6k+gJZ2z8hTccioYRHzr08f9v/qK5m7iPYNq/+abbvLPDQ73LNi79zevxa++Rz7hk7udet2SGqA/kH39z85oLxzQAKKfe9Wd3Gefz0eA5Vz7xs9fpahQd3DN3732bHthPz7hcfuAd5/7oGYv/+3ev6fV6+aj/tetv39AeYU+LHpBNZst7oypXVfiJn+k/6xXFRz9fnX/Z44GcABL/3teSAQCJwYFF+PD77y2WopURJFm2SgIWhxNpjrt0muNrNEdjYg5DcMaUWuhWN2tFI+6LVz0T3vYSgAMjGka7B/CFO4GWqllz7ztfk7arnWI5JOmFUmW7998XI2SmRivuRU/MzlrftVV1cN/+rbMz4ZDBYSgGxYc+J3qDLWnVr+2/+7Qsl4Oge/0//WmFQuy4b8c5m7fKAYs+hyF84CswGpzaKFZm+7svXQA5ANEfvuEFDMG6sVG98bvf0x+unPORj8NTf+buK3/2y59fuvLil40bz9/32nfs0Fqbqjjroq3lwTqMfNnrbLyqN/t8f/XPVfZQ+q7fnP/Ar567586bKaCZCKBiVfCkwyjYIjVecdU5jWK0cSbxfrWEFUU4bpMdjl9iAQAzO+eMLUfD8b7FIgyjaEXiSlaONPbFA7uaDPKGXeBHEvuk+pb6sloRr/vDLzz3mhfed/NXfuxs0MMeD9VZ9RVdrVSm2LNn14bpGRgTDLgTnVqiW/fS/fce2uwH2owCDWS+Iv76U21E3n7/PZvXzoYhQD8Sfg0ma9b/zL0r4008Qj8C6usw9B/45whFrNDWrY3T5ObtjdseSHPCQOHaz37ywMoupvj2m77aW17J8xwPcjMc4AGFFe8BKoJmQ4g+NAb7ZsrbX/2sTfffflOsCKWgo1wdIvLei8BG2yt+8o63fCDdcQAmh90dhw770TjOiRWCs74qK1Nye+adtz15T7nWlIKHSZVHr/jdnde87NWO43+5dcPKaGacx71q7WJ5Wo/kyqGl0Wh85eUXci7kmFJHa1rZeGl/UVTURz1GNaDFA4dmOmuf9LznPvV19+8dbouGgOOg/v/2riU2qioM//953HmUaZnSltKxQLSBFBKJpgiJxihG3GgkIRJI3amJJmpc6JJoQlwpCxMNEl2ZqBsXPiLGx8IggoloBVN5tTj0NbRl2nnc6cydc8//uzgzQyUQUQGHxH8xizs555575ptzzv0f35cz/clZZdnaABeqXk6LhUppLtfRvXz7rqcGXjw7XUp5eZC+kTne3J0HomKxqOYn3hhM3JUY3t59OrNnxflXl2X2tH/3bOeBp1d99lzv6LHv/YX82l6jghYog1gINcCOnc+cKLblS62BL3TevrwpuH9ZdnpqAhlkfV+rRbE4nM3OPtzfu6EjiLb0JqiysOBTGHJoiR0GqQnztK7oIG2SIkkiCoLAL/vtyY7973/9cbX45GZEVicvmN8qYmk2u3Hr1i+Hfzr87WyCoWulOVOYW71hYHpm0i+Ufjx8Zns7klWB0FOz/kxkrL2r84ODv++6vWe5yHbL3Px8plLOhUtWHBoRHSsTidCXrLuW9lbxwkDfbW9/PvzKlpSunk9qfzKdne1fPVXVP08m29qyUSiGzKhSAGNxMlAKWiFHxFvWKlWeQkJE7IjQgjd9itYFMF6Ymz9W9NNrb+mFmBWKIT169uSpgrxz9/Q9CXjt+RWsvK1r+IsR3yoNwADUiAASkWBILc3t3Zak8OSmWwce3DcqpYLmiw8utisCq0kGTdYYI8rFgky2z/vFj3bf3Vf6pRTr6cyod86cGD+XthQ80J96YrNl9Bm8/cMxf9QPQ1/HvA+PQ2aG7x1IWQ6PnBuP4DSwPRZWvjmYK5XLj21LoIxPnk13rUy98N7RkftSgxtXZQr+u18NeSAz+bmxEj7yelpWYPDxNVKNjI6Mr19/x+Cbh3f0yZce3VCsFPZ+ejCq4hXmcbOO56aGJorMODFR2PlQnwmDcohpX/46Ow/o5YulUyDfOqJavdTQ0PEyyPHzU8llnSYe/yQzNrIvCzoGFcvAYRg2qNgcqqrVqm6NH/ghEyvHNcCh9FGApDEVGxpHYHp9gtBuK/vnq2DTeWwvMUREoSKRmIx4iWhiJjexpGJ8BgXQ0t6DCpUQkVjLhfRpzVgC297TayoBgRaClGCJiqVmtmG1ykyMAqPCs2AoQrYskYAUaxQgE3FNgSEZQaCSCRRbQDTEgoHI1caCF40yshIecDmu20jYIETJlJ+f0RLLVdJaW0sShZayQgaRJVn24s7lBACGLCAKYcBEhATL7CkZMoWGLYfSUjU01hqm0Dk/UXhae7FInLgsMGLAgrFEFJIhax1RxfWZeEeycnmpqauxZgcWOAe0jEoppdYuo8GRoTXqhZRSbn6tte7TcRg1SKbqRC4hAAih/ux+Q3RyX0IDAKEDESGxIxXimtXaSqkQZN0ZYGvtpXbZFlJKRHRjsyZwp2wiu1jS1+Xp13BTM0lETvkX2DbSFhCRQSilHJW3a+7EqomI2QI3b6zw5gAWonRLlxCwOIjhZl8IVU/9q6syIwEA8kVydmZmJGZ2FesNuCFyHX0KsSGNSlDPKKzhCut6OCwat2vsFO5KDW0XZXztIhA4aR13bCV3g9rTMTT2nUXgq38r3WJ3sfAOXMIMEjMh/41z8A0+NN8EwIJ67IiZFwMFLheF+E/+wZeM7WrGs/h64yf/y1Tjq+n5BluTvOT9b5e3axh1vUZd/VtX/h9dPtBvVN0GBQAAAABJRU5ErkJggg==" + }, + { + "name": "smashing", + "description": "You maneuver the drone into position and begin ramming it into the machine. The machine sways and shakes, and just as you think it may be getting somewhere, it falls directly onto your drone. Now, not only do you not have any soda, but you don't have a drone, either. Dummy.", + "choices": [ + { + "key": "choice 8", + "name": "Disconnect.", + "exit_node": "FAIL_DEATH", + "delay": 10, + "delay_message": "Don't feel too bad, it happens to the best of us sometimes." + } + ], + "image": null, + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAAAXNSR0IArs4c6QAAAjVJREFUeJzt3cFyogAUAEGzlf//5ewpF0pGRJDnbvc1CkhleAbEfN1ut58bcNefqzcAJhMIBIFAEAgEgUAQCASBQBAIBIFAEAgEgUAQCASBQBAIBIFAEAgEgUAQCASBQBAIBIFAEAgEgUAQCASBQBAIBIFAEAgEgUAQCASBQBAIBIFAEAgEgUD4vnLlW/854tdJz5+2HWuWy9+6HWdt77P/1PLo7d27H/cwQSBcMkFePSI8e+T5WXncUctZWlvP1uef5V2vd+9y1p7/aD1nMkEgvHWCTDgiXOH3dU6ZJNNN+j0xQSBcehZrae3siCPtff/aJJo0OX6ZIBBGTZDle3XuW+6fq/fXo/W/ev3H3yAw1FsnyP96Nues99ZTJu7R11PWJqTrIDDM1+3CA9CUz0BN2Y410z+Ltfdxz/780frOYIJAuHSCwHQmCASBQBAIhFFX0pfefZbq0XKPupPu2eW9+2zSVmctZxITBMLoCbK09069s86vT7uTca+j9s/E6xivMkEgfNQEWZr62a6jPiN19evABIH00RNkqq33Rywn36PHv7penmeCQDBBXvDqkX/rdZKjvp+K55kgED56glz9LRhn39/B9UwQCB81QfZemd36HvxdR/azzmLtNW3/TGKCQHBHIQQTBIJAIAgEgkAgCASCQCAIBIJAIAgEgkAgCASCQCAIBIJAIAgEgkAgCASCQCAIBIJAIAgEgkAgCASCQCAIBIJAIAgEgkAgCASCQCAIBMJfgqJi1hru29AAAAAASUVORK5CYII=" + } + ] +} \ No newline at end of file diff --git a/strings/exoadventures/robots_wingman.json b/strings/exoadventures/robots_wingman.json new file mode 100644 index 0000000000000..2958fbb6a4ed3 --- /dev/null +++ b/strings/exoadventures/robots_wingman.json @@ -0,0 +1,369 @@ +{ + "adventure_name": "Robot's Wingman", + "version": 1, + "author": "Lucky Luther", + "starting_node": "Date Start", + "starting_qualities": { + "Love": 3 + }, + "required_site_traits": [ + "in space" + ], + "loot_categories": [ + "trade_contract" + ], + "scan_band_mods": { + "Narrow-band radio waves": 2 + }, + "deep_scan_description": "", + "triggers": [ + { + "name": "True Love", + "target_node": "Love Birds", + "requirements": [ + { + "quality": "Love", + "operator": ">=", + "value": 7 + } + ] + }, + { + "name": "Complete Failure", + "target_node": "Obliteration", + "requirements": [ + { + "quality": "Love", + "operator": "<=", + "value": 0 + } + ] + } + ], + "nodes": [ + { + "name": "Date Start", + "description": "Cameras Online. A Blood-Red Drone is seen streaking through the stars.\nThe Drone is likely leaving behind some form of Chem Trail to brainwash Nanotrasen Employees who find themselves in the void.", + "choices": [ + { + "key": "choice 0", + "name": "Hail other Drone", + "exit_node": "First Contact", + "delay": 5, + "delay_message": "Attempting to signal Drone..." + }, + { + "key": "choice 1", + "name": "Ignore other Drone", + "exit_node": "FAIL", + "delay": 0 + } + ], + "image": null, + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAD/0lEQVR4nO3duXnbQBBA4YE/d6CACSMmasFO1IDbUkluQJHUgnIlCFgDHIHmsYD2mD1m9/2JFCgABTwsFhcnEVkEgNOP2gsAtIxAgB0EAuwgEGDH8IEsC+cosM0rkF43ovVz9fr5kO7bQHreiKZpuvkJ3JvE4zrIsixsRBiSVyDAqIafpAN7CATYQSDADgJJ9H481l4EOGiddSWQBGscRNIWzUsTBBLpOorfX18VlwT3NK9vEUik19NJRIijVVrX7QgkwJ+Xl8vP8zw747B6x4HV5c6NC4We1jhERM7zLB+fnw9/c72RWbrzwOpyl2BmBKm5h7uOQ0Tk6XBw/p3Ve7usLncJJkaQ2nu4X8/Pm1GIiPx9e2Pj6tTP2gvgY5qmqjdMPh0Ocp7nm0jO83z5vfbyIR8TI0gt78ejvJ5ONzGssYjIwzyESPpDIBtc1znWQ62tSboIkfTGzCS9pK2LgGsUW3GI/D/cQh8YQTa8H4+b1zl8RghGkj4QSISQSEQ4fWoZgUQKGSEYTewikAShkVwjGBsIJFHs6LA3kSeedhCIAu1DKEabdhCIkpwTcoKph0CUlZiQc3asHALJoNQen1DyI5ACck/Iez+NXPPzOQPp/R/eEq3RptfRpPajDg+B1F6g0aUG0+POjREEN1yHZCHrg/WnhzlIo+438tBDKCLRQSDGcA9YWQRiUMhoQiRpCMQwnk3JjycKDfN9epGnHOMRiHFEkheBdIBI8iGQThBJHgTSESLRRyCdIRJdBNIhNn49BNIpn0gI6XsE0jEiSUcgnSOSNAQyACKJN2QgbAhuRPJouEA0v0PbEk7/xhkukJG/j49IwnG7+4C4Td5f8RGEPVN9oSPJyOus6AjCG1PakvJ2eh89rOPih1gM223JuT56eKcwcxAU22lZPIIgEIhI+ZHdypsgCQQXNTbaFkLZ2zkQCB7UmJDXCuW7wz4CgQrNl3DXiIQRBEWlTMhbOtNJIMgu5vCplUgIBMVYfAE3gaA4S+8WJhBUY+GmyeFud0c7LNx+TyCoqvVICATVtRwJgSCL0A251UgIBOpin/tvMRICgbqU5/5bi4RAKur5UdaU07ItRcJ1kEosPjxUWsh1EpE8/0cCqaj2VWILan/tNYGgeTEvl9AKhUBgQujooDWaEAjMiIlEJPGEgRAIDIl9tmQVGguBwKTYQ6jQwAgEZqUcQvk+Q08gME9jQr4VG4GgC1qnd+/nK8MFwsW5vmneobAsy1iBcHvHWDjNG4ERZDwpL7UbLhCMyXXXr08oaoGwZ7Zj1HV1/7l9DrlVAuHY3g7WldvWToMRZECsKzfXpJ45CHDnegdCIIDDZTQRAgE28dIGYAeBADsIBNjxD3G5pHKbkGjYAAAAAElFTkSuQmCC" + }, + { + "name": "First Contact", + "description": "The Blood-Red Drone accepts the hail with the identifier MISS RED - 05.\nMiss Red sends over a series of question marks in quick succession.\nYou notice your Drone has somehow taken initiative and begun to start up a program you didn't know it had.", + "choices": [ + { + "key": "choice 2", + "name": "Wait for Program to boot.", + "exit_node": "Sentience Achieved", + "delay": 5, + "delay_message": "H3AR7.exe booting..." + }, + { + "key": "choice 3", + "name": "Threaten Miss Red.", + "exit_node": "Sentience Achieved", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Love", + "value": -2 + } + ], + "delay": 0 + }, + { + "key": "choice 4", + "name": "Halt Mysterious Program.", + "exit_node": "Lack of Trust", + "delay": 0 + } + ], + "image": null, + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAEpklEQVR4nO2dO3LbMBBAl5ncwIUaVmp0BbvRBXyllD5SLuBKuYIbV2pU+AxMkaFCUwA/+C/w3gzHCodWKBMPi10CVCcigwCAkR+5TwCgZBAEYAEEAVjgZ+4TaI1L3+c+BREReblec5+CCpoXZBgG6bou6f9J49TDJkFyNKIUDMNw/5n6842R5OV6Nb6e4rIfwjEsbVPWjtW4pf5cl75f/Dk/zvbvtf1sYbbVCNJ1XbURRERUfa55tBgjhW0/+LNpiKWpEdXKvNFPh2Wm/RCG5pP0GFz63pofzFlq4Gu5yfx4CE8n/8ZaAGCACJIJ32qVKc+g0hWH7JUCzZtrFclWpdparTIdt/c9a95CVSeJIB6MPfOYc7j+vm3/lvc0HWs6n5YqXSHvbyGII9MG59rYpmXa6XvseT/TsfN9rVW6Qt6aQBBH3o5H+fX5GaQnHvOEtfsaW6Q0Nf7ahTAR8tZE9vGilu31fL7/fD6doo59U29azzv2Rpl3I6/n8/311+0mfz4+Ho4Zx74ium6uaj3vFKhZDzK9iKmZyiEi8nQ4GI8bG5e2Rqb1vFOgIoLk7uGeTyerFCIiv9/faVyVoiJJzz1h8ulwkK/b7ZskX7fb/XXu84N4qIggubj0vbwdj99kGGURkYc8BEnqA0EsmEqq41DLlqSLIEltqEnSU2K73zBKYZND5P9wC+qACGLBNn1ka4QgktQBgjiwRxIRyqeaQRBH9kQIooleEMSDvZJMQRgdIIgnrtFhKZFHnnJAkACEHkIRbcoBQQIRMyFHmHwgSGBSJORUx9KBIBFI1eMjSnwQJAGxE/Lay8g5P59RkNr/4CURKtrUGk1yL3V4ECT3CbWOrzA1dm5EEPiGaUi253pw/cJBDlIo80a+dwiFJGFAEGUwBywtCKKQPdEESfxAEMWwNiU+rChUzNbVi6xydAdBlIMkcUGQCkCSeCBIJSBJHBCkIpAkPAhSGUgSFgSpEBp/OBCkUrZIgkjrIEjFIIk/CFI5SOIHgjQAkrjTpCA0BDNI8khzgky/Q7slKP+60ZwgLX8fH5Lsh+nuDcI0+e0kjyD0TPnZG0lavmZJIwhPTCkLn6fTb6GGa5x8iEXYLouY16OGZwqTg0CyTkvjCAJBQETSR3YtT4JEELiTo9GWIMpS54Ag8ECOhDyXKGvDPgSBIIR8CHcOSYggkBSfhLykSieCQHRchk+lSIIgkAyND+BGEEiOpmcLIwhkQ8Okyeamu0M5aJh+jyCQldIlQRDITsmSIAhEYW9DLlUSBIHguK77L1ESBIHg+Kz7L00SBMlIzUtZfcqyJUnCfZBMaFw8lJo990lE4vwdESQjue8SayD3114jCBSPy8MlQomCIKCCvdEhVDRBEFCDiyQingUDQRBQhOvakpG9siAIqMR1CLVXMAQBtfgMobauoUcQUE+IhNwmG4JAFYQq787zleYE4eZc3YScoTAMQ1uCML2jLSjzOkAEaQ+fh9o1Jwi0iWnW7xZRgglCz6yHVq/V/HNvGXIHEYSxvR64VmZsnQYRpEG4VmZMST05CMCMaQeCIAAG7tFEEATACg9tAFgAQQAWQBCABf4CeWF0TY0egUMAAAAASUVORK5CYII=" + }, + { + "name": "Sentience Achieved", + "description": "Before you can analyze the program, it rewrites you basic hailing protocols to have a new set of \"Ideas\" generated by your Drone to be used.\nThere is also a LOVE Gauge that reads: $$Love", + "choices": [ + { + "key": "choice 5", + "name": "New around here and was hoping you could show me around.", + "exit_node": "First Reply", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Love", + "value": 1 + } + ], + "delay": 0 + }, + { + "key": "choice 6", + "name": "You appear to be an outdated model, but I'm into that.", + "exit_node": "First Reply", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Love", + "value": -1 + } + ], + "delay": 0 + }, + { + "key": "choice 7", + "name": "Never seen a Drone as cute as you and wanted to check you out.", + "exit_node": "First Reply", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Love", + "value": { + "value_type": "random", + "low": -1, + "high": 2 + } + } + ], + "requirements": [ + { + "quality": "Love", + "operator": "==", + "value": 3 + } + ], + "delay": 0 + }, + { + "key": "choice 10", + "name": "Haha, sorry for the threat. I just play like that, haha.", + "exit_node": "First Reply", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Love", + "value": { + "value_type": "random", + "low": -1, + "high": 2 + } + } + ], + "requirements": [ + { + "quality": "Love", + "operator": "==", + "value": 1 + } + ], + "delay": 0 + } + ], + "image": "default" + }, + { + "name": "First Reply", + "description": "Miss Red replies with another series of question marks.\nThe LOVE Gauge reads: $$Love", + "choices": [ + { + "key": "choice 11", + "name": "Your curiosity is amazing.", + "exit_node": "Second Reply", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Love", + "value": 1 + } + ], + "delay": 0 + }, + { + "key": "choice 12", + "name": "The moment I saw you I instantly fell in love.", + "exit_node": "Second Reply", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Love", + "value": { + "value_type": "random", + "low": -1, + "high": 2 + } + } + ], + "delay": 0 + }, + { + "key": "choice 13", + "name": "Look, if you want some Chad that'll walk all over you, fine. You missed out on a NICE- GUY-.", + "exit_node": "Second Reply", + "on_selection_effects": [ + { + "effect_type": "Set", + "quality": "Love", + "value": 0 + } + ], + "requirements": [ + { + "quality": "Love", + "operator": "<=", + "value": 3 + } + ], + "delay": 0 + } + ], + "image": "default" + }, + { + "name": "Second Reply", + "description": "Miss Red starts compiling a message, but your Drone insists you sent one last line to seal the deal.\nThe LOVE Gauge reads: $$Love", + "choices": [ + { + "key": "choice 14", + "name": "You're my best friend-...", + "exit_node": "Realization", + "delay": 5, + "delay_message": "Message sending..." + }, + { + "key": "choice 15", + "name": "I want to see where this goes-...", + "exit_node": "Realization", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Love", + "value": 1 + } + ], + "delay": 5, + "delay_message": "Message sending..." + }, + { + "key": "choice 16", + "name": "DTF?-...", + "exit_node": "Realization", + "on_selection_effects": [ + { + "effect_type": "Remove", + "quality": "Love", + "value": { + "value_type": "random", + "low": -2, + "high": 2 + } + } + ], + "delay": 5, + "delay_message": "Message sending..." + } + ], + "image": "default" + }, + { + "name": "Realization", + "description": "Miss Red's message is received.\n\"This is Syndicate Drones Agent, Arusha Johnson.\nI don't know why you're saying it like that, but if you want to help out our cause we can send over a Trade Contract. \nPlease just call our Recruitment Officer next time.\"", + "choices": [ + { + "key": "choice 18", + "name": "Accept Contract.", + "exit_node": "WIN", + "delay": 5, + "delay_message": "Sending Trade Contract..." + }, + { + "key": "choice 19", + "name": "Demand a Second Date.", + "exit_node": "FAIL", + "delay": 0 + } + ], + "image": "default" + }, + { + "name": "Love Birds", + "description": "Miss Red's message is received.\n\"This is Syndicate Drones Agent, Arusha Johnson.\nI can't believe it, but I feel a real connection with you.\nI'll send over a Trade Contract you can use to make some money and come see me just SOL7-South of $$SITE_NAME\nSee you soon...\"", + "choices": [ + { + "key": "choice 20", + "name": "See you soon.", + "exit_node": "WIN", + "delay": 0 + }, + { + "key": "choice 21", + "name": "So you're not the Drone?", + "exit_node": "FAIL", + "delay": 0 + } + ], + "image": null, + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAYAAADDhn8LAAAGI0lEQVR4nO2dP5LbNhSHHzO5QLwzVoNtnEKzheJW22gPoNq9b+EmpZvcIr1rHyBpqDZ2kVERN6uGO6NJkS4NU2TAoUiQxD8CeMDvm3mzXomkqCU+PAAE6IqIWgIAKPku9gkAkDIQBIAZIAgAM0AQAGYoXpC2xRgFmKYijVGstm2pqqoApxOWvhzy+9VCdK89Xi5Gx3PZF6TJoiCqQpQTUn5ZuPsFW/WaCpd9Qfq0S9H+b0mWUQvR1kIsbmPznu7xEUlH9BOIFiYFd1jQTQs+JGEb0U8gStgWWJeMAEn4hVYnnSNiV3f/vnx9vHmvFmK2bzC3rytLnw3SI7qlPkPs6lbs6snX5mrxpX19BTIJq4h+Al5CpyCLXT1ZOHX2VW1jU9ghyPrhcWAp/pdxDZMavhbiZnvTDNHfVvZHTAs8BFk3+rge63tijtjVxv2Ey9fHrp9hu++nv991r6FPkRZVVXm9uR3deNuw6Rv4qr3nmmuhzgGxfrCdi2WTOVw5Hg7dT/Hve3r3w6fRNlzndnE977VhK8ga9Id3h/TluDYNnc7n0TaykHErbFzPOwRsBFn74kk5VJJIOSR3m43yGLLNy23OGtfzDgELQXzWcI+Xy82sW6LlG4PXphm91s8oJhM6U71RCDnUsBBk7RruzauPRDQ9onW32Ywkkb9fm6YbNQH5wUIQIr9y9LPI4elIzctVKUctRNfnIKLRTyLq+iI6kqSaPcA07O+D2HB4OtIHIqqJ6P3Llc5/nkbbSIF+/vatK9T77bZ7/3Q+k9jd7jM3/g45eMImg/ji8HS8+X3z+m60zdTKQJktVCNYEjS38oL1bF6beyHbh/2NFL/89Qd9+PFt9/vvv30moukaXxb++59Os5/dzyTIHnwpLoNsXt9R83K9ea15uXYhmSrQun0hmUmQTXjDOoMQ6WcRsavpzauPNxJIWX7952JUw4tdTc9f9lqy1ELQ/vkZw6iMiT7fxTV0p6r3t9s+7NvD07HdPuxbIv35Uf1jLM0W7R9zSOy/GUIvsm9iTd0ElCNX8qfqBuIScx3yYb+jqqqbkM0vVYC0iG6pj5jLIlPvyezRj6UVh6rXhxnBdbYusk06UcR9kKk+iur+Rz+T6PZLZEY43d8b7Td3vD7DrIL+TFiiW+or1lw7vnRsuW2IGh+ZJVywH8Ua4nudyFI2Ub0fqsaXn4OMsi7RLfUdPjPJ3NNQdPsac/g4x9yzSczvp8wgPtfzxsJHJhkeYzjK5ePuuK9sk2s2MVlKsAYjQWKfkE9sH8xgu58PXIXJoXIbEvs7JZXS1gjbx/rECtemWG7XL2Zk10mfYikrxMwaKoa1pmkTKnatmxPRLQ0ZqgyRQtbQDZPsgEziHsVkkD7DBzOkkjV0MckmyCRuFClILugWfkhiT/aTFXNGd/UiVjnaA0GYA0nWBYJkACRZDwiSCZBkHSBIRkAS/0CQzIAkfoEgGYLC7w8Ikik6kkCkZSBIxkASdyBI5kASNyBIAUASe4oUBAVBDSQZU5wgsgCUVhAw/GtHcYKU/P/xQRJzMN29QDBNXp/gGQQ1U3xMM0nJ1yxoBsnpiSk5YJIhbCTJ4RoHb2IhbafFmtcj1BMm1wR9EBCs0uLYgoAggIjCZ3YuT4KEIKAjRqFNQZS5ygGCgBExOuSxRFlq9kEQ4AWfD+GOIQkyCAiKS4c8pZFOCAJWx6b5lIokEAQEg+MDuCEICA6nZwtDEBANDpMmi5vuDtKBw/R7CAKikrokEAREJ2VJIAhYBdOCnKokEAR4x3bdf4qSQBDgHZd1/6lJAkEikvNSVpdh2ZQkwX2QSHBcPBQak/skROv8HSFIRGLfJeaA6bp5339PCAKSx+bhEr5EgSCABabZwVc2gSCADTaSEDkOGBAEAYywXVsiMZUFggCW2DahTAWDIIAtLk0o3TX0EASwx0eHfEo2CAKywNfw7rC/UpwguDmXNz5nKLRtW5YgmN5RFhjmtQAZpDxcHmpXnCCgTFSzfnVE8SYIamY+lHqtht9bp8ntRRC07fmAa6VmqtJABikQXCs1qk49+iAADOhXIBAEAAVdNiEIAsAkeGgDADNAEABmgCAAzPAfVTkNN7+HpAgAAAAASUVORK5CYII=" + }, + { + "name": "Obliteration", + "description": "The Blood-Red Drone opens up two side-hatches to reveal a pair of rocket-propelled missiles which are shot in your direction.\nYou have failed your Robotic Friend, who has already started shutting down their systems, but there is still a chance.", + "choices": [ + { + "key": "choice 22", + "name": "Accept Death.", + "exit_node": "FAIL_DEATH", + "delay": 5, + "delay_message": "Missiles approaching..." + }, + { + "key": "choice 23", + "name": "I'm a Gamer.", + "exit_node": "FAIL_DEATH", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Love", + "value": { + "value_type": "random", + "low": 0, + "high": 8 + } + } + ], + "delay": 5, + "delay_message": "Miss Red considers..." + } + ], + "image": "signal_lost" + }, + { + "name": "Lack of Trust", + "description": "As you fiddle around in the Task Managing Software, closing all the new tabs your Drone is opening, the Miss Red enables a cloaking device and disappears.", + "choices": [ + { + "key": "choice 24", + "name": "Sigh in a quiet but dramatic way.", + "exit_node": "FAIL", + "delay": 0 + } + ], + "image": "default" + } + ] +} \ No newline at end of file diff --git a/strings/exoadventures/space_yacht.json b/strings/exoadventures/space_yacht.json new file mode 100644 index 0000000000000..50b41c3567208 --- /dev/null +++ b/strings/exoadventures/space_yacht.json @@ -0,0 +1,257 @@ +{ + "adventure_name": "There is a yacht cruising through space.", + "version": 1, + "author": "Kinnebian", + "starting_node": "A yacht in space?", + "starting_qualities": {}, + "required_site_traits": [ + "in space" + ], + "loot_categories": [ + "cash", + "drugs" + ], + "scan_band_mods": { + "Plasma absorption band": 5 + }, + "deep_scan_description": "", + "triggers": [], + "nodes": [ + { + "name": "A yacht in space?", + "description": "You see a normal looking yacht, floating above you.", + "choices": [ + { + "key": "choice 0", + "name": "Ignore it, its not worth investigating.", + "exit_node": "FAIL", + "delay": 10, + "delay_message": "You fly on by..." + }, + { + "key": "choice 4", + "name": "Investigate it closer!", + "exit_node": "Looks like the doors are sealed shut.", + "delay": 30, + "delay_message": "You begin to fly up to and around the yacht.." + } + ], + "image": null, + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAMAAAD0WI85AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAzUExURUBAQOUAD/////8AAPgFFvwAB/0ABfwACPsBDP4AAszMzJMyje986cZlwEz/AOIBGOQAEnoV2UoAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAN5SURBVHhe7ZzrepswEERdp7c4TtP3f9rurBZ0QRISXpBEOf2KJcUhcxig9Idzu+iPbyfAiPB2GO7y6hIRib2tf2aRNwsvjYYV4QHIiNxV21LdmSPCVdAmJyKvHeKJkEJepGN8Ea7lBCLiwksDwSe8LwKTUzQCEx2Rw28Locj3H+OLTKiIHI4VIX7++v2Oq2REZpHRuUR6o2ORuhvfayIdPUR23EgdZxTp6DzZwBkbGZsGIg9s1M/jMhHFH/t4sEiCD4PMati3kUVo0rgnTaDwfD7VRV6tgUKbzPOOoEEkRIwGeci8jp0aYQk/s6ykRGaN2aPOaA8RG9kXkbXYuWU1pvTO0CN1nqiLOBaEGzmxbDIbC2ynpc/Plo14FoQ9+I+bLAG3E5NfNDAQjaYigQZhRbyviQklDjR4yBqNG5GgM/bQ+5IPKxFoGAnQ9tSSoBNREXaYsjtDjEUCtBTJVDKLIPkHZZbks0Wg0UTE3hMzIpghuBddBkRgQbRtJDRhEZMfSGrgTWks8S2FIuYoaossKjFXtcR18Z0ku0fTRnwROMQsvFVMJLpPNyJJB2c5JUEc+KzlPvdQIn41Ihx3qREupi1qPfQawQ3VQZJalqtYkNAx6jwURZbZDWwQfpWXJHGcykL0RKImnDdcx5KkTVProSgS3GYxizoUWGzw0BQhTHROa5I7YFFirlLvkRVJ/WcsA1/yktylQmKThnYjJLIATVRYbPTYXcRxKNTZ5lEgUnWC+SK2CgyKiqE3ya4q2UsE59Oc20zclRS+Rs2PXhepAiImtsAjzPFnDXqf7KcebRHHgZOzw7oCgW+VvWxBSwQxgKQCMiup4lULQkUkMEB43uClpI6XLQgNkaUFOxQYcBMaGjuI0KT0qog0seFhQtAQWZgUodTExEJk0zHxROQ1j4aFF1WlkToRVKFaBqMvkmcPB0ZJpMhklyYmdETWK9lVAmiJ5Ex2lwBKIkmTQySAlkjM5DAJUCWS/TeGYxsbMzxOAqRENj4rNDAQqhrpmUukNw4X2f6gnudqpDcukd7oVqT2pnA10huXSG/oiuh+urqKq5He+J9F2l0HOc7YSJ9HupSBG/EP/MEimq03FcnwomNGZKxrZimCD7bLb00Y6ZPtEZE/BBzw2x/GkRER4YvGVoT/QgQVpfgr39ocFnEx+TAYqpHzcLv9A9Y6cLa57YOgAAAAAElFTkSuQmCC" + }, + { + "name": "Looks like the doors are sealed shut.", + "description": "You fly up to the \"boat\" and find that all the doors are locked tight, and welded shut. You think you hear.. music inside? There is a welded vent, too. You reckon you could force it open if you hit it hard enough, but it would be less risky to unweld it using a welder.", + "choices": [ + { + "key": "choice 2", + "name": "Try to force the door!", + "exit_node": "You destroyed the drone.", + "delay": 10, + "delay_message": "You begin forcing the door.." + }, + { + "key": "choice 3", + "name": "Try to force the vent.", + "exit_node": "The music grows louder..", + "delay": 20, + "delay_message": "You begin forcing the vent.." + }, + { + "key": "choice 5", + "name": "Fly away, no chance in hell of getting in there..", + "exit_node": "FAIL", + "delay": 5, + "delay_message": "Moving.." + }, + { + "key": "choice 14", + "name": "Unweld the vent.", + "exit_node": "The music grows louder..", + "requirements": [ + { + "quality": "welder", + "operator": "==", + "value": 1 + } + ], + "delay": 5, + "delay_message": "Welding.." + } + ], + "image": null, + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAMAAAD0WI85AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAABRUExURaWMpOUAD/8AAKaNpaaOpaePpqiQp6mRqKmSqEBAQFRPVGddZmVcZeDg4PgFFvwAB4CAgP0ABfwACPsBDP4AAjAwMP/YAMHBwUz/AOIBGOQAEo23xmoAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHASURBVHhe7dwJT8MwDIbh0q5AYWNc4/r/P5TYcdWGmildDE2i75HoMWGJtymHkNYG8nNVAR/C26LVF9JO+KXSTCF8QIoP4aVwm6iQTvbZCEJcghrSNZ3n9nRKdk3XX/c3u/7Wf87WwhDaDO0Q5+5+v+fpLAQh3HJoD9EGns5CGEIldYS4TfStRXg6Cz9DHo5JKyJ9K8hgslmIN6SEDI+rWZVMIc7T88ur28m1WjqN5HxxPXMIGQ1ysaOcZEhc0GFWUnHIKjIkyl2RSkMu6rAqWYacJz+2CJ3KkJdZiFzsKAiZ+6uQkNxGRF4JyJCHFbFQccg5i1tMhry8QhIgxAJCFAixgBAFQiwgRIEQCwhRIMQCQhQIsYAQBUIsbBXi/3fhD2U8zWYhbw5CFAhRIMQCQhQIsYAQRUSI/4UeKDREdu/CZSAk9N8hS/hmDyFEgRALCFEgxAJCFAixgBDFqhD/dxYfyniarUJmEBJAiAIhFhCiQIgFhCgQYgEhCoRYQIgCIRYQokCIhYpD6I3t8tSE8c36kXIL+XD4QRb8+IQVMTmEiE93PIXwB4XQEv3mS0Y3xyFz/uujg6JWxNK2IU3zDauvUlylzN3TAAAAAElFTkSuQmCC" + }, + { + "name": "The music grows louder..", + "description": "The music gets louder as you enter through the vent... maybe you should turn back?", + "choices": [ + { + "key": "choice 6", + "name": "Continue onwards!", + "exit_node": "You fall down!", + "delay": 5, + "delay_message": "Moving..." + }, + { + "key": "choice 7", + "name": "Turn back.", + "exit_node": "Looks like the doors are sealed shut.", + "delay": 5, + "delay_message": "Moving.." + } + ], + "image": "default" + }, + { + "name": "You fall down!", + "description": "As you are crawling through the vents of this Space Yacht, the vent gives way! You're dropped into an empty room, completely filled with plasma! There is a desk and filing cabinet in here, along with a window observing the main portion of the yacht. The music is deafening at this point, it sounds like a horrible mix of sea shanties and EDM. ", + "choices": [ + { + "key": "choice 8", + "name": "Look through the window.", + "exit_node": "A rockin' party.", + "delay": 0 + }, + { + "key": "choice 9", + "name": "Fly outta of there.", + "exit_node": "The music grows louder..", + "delay": 5, + "delay_message": "Moving.." + }, + { + "key": "choice 10", + "name": "Rummage in the desk, using your key to open it.", + "exit_node": "Drugs and cash!", + "requirements": [ + { + "quality": "HASKEY", + "operator": "==", + "value": 1 + } + ], + "delay": 0, + "delay_message": "Rummaging.." + }, + { + "key": "choice 11", + "name": "Take a sample of the atmosphere.", + "exit_node": "The atmospherics scan", + "delay": 30, + "delay_message": "Taking sample.." + }, + { + "key": "choice 13", + "name": "Trash the place, fuck the police!", + "exit_node": "You wrecked yourself.", + "delay": 30, + "delay_message": "Trashing the place..." + } + ], + "image": null, + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAMAAAD0WI85AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADAUExURbyA1eUAD/8AALyB1b2B1b2D1vgFFvwAB/0ABfwACPsBDP4AAr6C2MaJ4NRH7NSU7buA1bp+0rp90bp+0bt/07l8z7h6zbp80bp+07t/1Lp80Lp8z7uA1Lp/07l90bl+0rh80Lh80bd6z7p/1JAiVZAkWZAoX5AnXZAmXZAlW5AkWJA6fpA7f5A4epAnXpA9g7l+07Z6z+WQVZZar5BVqmYqf5BOnZA2dzPlBuIBGLx+0rx80Lx/1L13yr14yuQAErVxUskAAAAJcEhZcwAADsIAAA7CARUoSoAAAAJ8SURBVHhe7dzZctowFIBhky7pElo5pkGkS9qgpBvdoVva5v3fqkfyQciRYbxISPKc70IxxpH9I0iYzISMxGc0AGWIGpM2vJCDDbUriFv4tYNNiNqQAobczu7gVmtGiFoKGAKG9FAJgYSBhKhlGUAItqhdqamGyJJhhKhlUbtSczPk7mH6IWuph4B79x88lK+SFOmQ1LUMORoHdYSXUaNlyPhRUGO8jBqtQx4HRCE2CnGCQmwU4gSF2CjECQqxUYgTFGKjECcoxEYhTlCIjUKcoBAbhTjhNCQodyGD+dtvvCgkNhQSGwqJDYXEhkJiQyGxoZDYtAph+XExeXJyMp0onM9ms6KYnj49neZ5XhQ555MZm8A25wXn/JizjDH2DDb5cziWwU0YWDlZ+ZXl+YuzM85fvjo/53PA2HyuDmincYi46eLy9Zu37/CGB5ca7jDgNZmahoj3i2h86BEiBE4Sgx4rEllH55CoOhZi0TUkso7uIR9xiih8gke1+4pEpUcIPhiW8o79PPH0WfqG4MOh4Zx69E2fBTZahnz+gsqL/lpR7lODPoVX+iywIb5py7XRcpmpcQe83iqcU+6Xm97ps8CGwAszNQ6pI+eEH4Z4y69KyMo2Wq0yNe6wI0QuR4AQfPKbGr/Y65RPq4RCtsOZ98BJCE5hKe+gkFYoxEAhLlGIgUJcohDD7hD8He+dOiOQb/Dwwky9Q+AUeJhfvkOE+I5HeSZ+rE9a/8j1DNnTcoDNivgI2V+H+RYc91Q1CtkOj4hAk5AkDDhEf6RQWv/ZXhPyE8gS+ekP6cRgCPr1O7vahBxkfyDk6u8/GLe6xm8NToWY9O60VmQ4suw/MDqeSvYBdn8AAAAASUVORK5CYII=" + }, + { + "name": "You wrecked yourself.", + "description": "In the midst of trashing the place, a filing cabinet tips over on you, crushing the fragile, expensive drone. Nice job, idiot.", + "choices": [ + { + "key": "choice 15", + "name": "Shit.", + "exit_node": "FAIL_DEATH", + "delay": 0 + } + ], + "image": null, + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAMAAAD0WI85AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAD/UExURTg4OJ2dnYCAgJOTk+Xl5eUAD4WFhYmJibS0tIKCgv8AAIeHh9jY2Do6Oo2NjTs7O62trYODg5+fn5eXl4GBgYaGhv/YAJKSkrGxsTk5OZGRkampqa+vr4uLi7+/v4+Pj9cLC+4EBP///5ubm5WVlcXFxcfHx/IDA+0FBeYGBvgBAfv7+6GhofPz8/7+/pmZmaOjo6WlpdXV1aenp46OjpaWlqioqLOzs6urq7q6us/Pz8zMzISEhLGwspCQkHl5eZycnFNTU6CgoKSkpJ6enmJiYqKioqampqqqqkNDQ3t7e39/fzPlBtMFEzk3Nzo3Nzg3Nz42Nj02Nt4CEG1tbWz50i4AAAAJcEhZcwAADsMAAA7DAcdvqGQAAAT4SURBVHhe3ZwLW+NEFIanp9rKUlkKRaHctOAdLbjKoq6Kuhfv6+3//xYzc74ktCzJzJxvbR7f7pOGPGTmvMlk6PZr6tLpSf8VHn3pod3/Gq4H0+TV/wEqEpaxDIav4VDSGK6h7WxyRJy8BNB0NpXIvZqwqQlZH5Hpq8jrYZlFLRJWPO0iQ0H/NDZU5H7xyOSGSDgVxaJdZJMuImM0nc2CSKEQJeJkK/ROQUW20XI2iyLhtESITCah9503zLwJkV207PbwnMqCCFzCpkZ6ofupoBoDernt15PW/b29Qib9UlkU8SYxIk4OfP8EEVnzDWHSsrAkEk5L2NSMHAaRnSPlAGyBY4DLoJHQEF/krbdVZDabuZlfAbpebdnA2LJzEkRO0W4+N0RKVCQ8asK6t1N29Rpt5Z2Cdz34+Q5kE+36Dupu/drChgZqkYL33v/gQ3+VFAQR34g/M9XZqVvVI0nioBpZLzh61VMzlcgSWry2W66Fh7crmESekii2F0Rm7qOiDz2CYQu6bOZOETx8Y4sP5YwpMlkSmbmPQ0foMMajWSR4+Gf9qVwGZBNVEJCptlmLfOJ7xrr/185dIq0wXwHLPhr11fviyyNYibS7ZIscE8fW8l+R9rJvky3ieCLzFYvMUYeZ8WpFxrRTIodo0kK+yDlP5AJNWsgXcbKPQqwsj6wsLCIDFGKkt2qRPmlsra9ahDUByzraM2ES6aMUE5/KGdozYREZcE4JZWSZRPYpIherF3FyjmIsDLsgMkYxFmSA1myYRLYZY4sU8phEKBMwZ2RZRY5RTT4POiGybj8lCBTM2EQI+YI9UFBsIk7OUE82MkdTRqwiIV+wUAcKNowiJ9axdSNQsGEUcbKLijKZdkZkAxVlQggUFKvIoXFsEQIFxSpyYBUpAwUrVhEnn6GkLD5njSy7yATJUy5oxoxZZEsucXQjOTo6wlpBh0Rs+UIdKFghiAxRVA51oGDFLqIBbya0kUUQeWgQuRUo5GMXseQLtwKFfAgiVb6ACTUK7LGBNuwQRKqAdxz92ZTyrT1KoKAQRJxcaVnFZIpC2yhHI29kcUTKfKEfeUrKjIgTKCgMkWk5tkayhlKbKc0HHROp3966wqXcxkP9dU6goHBETrWwVDiBgkIRyc0XiCOLI3KRJ3LeOREnF6gtCVKgoJBEsgJeUqCgcEROs8YW9f4XjkhevsAcWTSRKYpLgBUoKCSRnHyBFSgoJJGrDBFWoKCQRHLyBVagoNBE0gNeVqCgsETmyWOLFigoLBFXvqKNhhYoKDyR1HyB9yZjgCaSfAMZLVBQaCKbifPWFi1QUGgi6XdZYj8STJFLvb0nii86K1Ic4t6X8XwlzP+wFzBF0nhEfYXCEymmrUe4ZSyGE+lPsCMHnkjq9FvfxkNhJSJf+8U3nRbB+G/D/yoxUvAQRfyH0KLe/NWwjnKPQg1P5Fu5Ho0OJii2gUH43PNczrEjB57IdyGnxthpwmuMRt939i+7kx+0xDged1gkKac+7a7IcZVcRbBDnrSYIk9SPoR2Qp60mCJOnqLKCJ6RJy2uSMJb2T+SRxZV5KefUWUET1++SPWVQrizPYFfUGUE7EnrRSK/FngT/+0PaTLSQ5mtXNd3fpOACPjtd/e8Frnn/ihEnv/5V7G8k7+x68oJIjepNqefkX/k8hrfw9HM4wfsSYsMXk3FgD14OPcv1NBUWmnJzVYAAAAASUVORK5CYII=" + }, + { + "name": "Drugs and cash!", + "description": "Rummaging through the drawer, you find that the person who lives in here stores all his drugs and cash in here too. Good for you!", + "choices": [ + { + "key": "choice 17", + "name": "Head back with your newly acquired things. ", + "exit_node": "WIN", + "delay": 30, + "delay_message": "Stealing..." + }, + { + "key": "choice 18", + "name": "Take one last look around the place.", + "exit_node": "You fall down!", + "delay": 0 + } + ], + "image": null, + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkBAMAAAAxqGI4AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAwUExURW4WTuUAD/8AAPgFFvwAB/0ABfwACPsBDP4AAuex/6526uOxlKt4fUz/AOIBGOQAEqIMSWUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHFSURBVGje7dq/bsIwEAZw15ubpX2DyFLHqkvfqe/BE7AeU9dkyu68gTN1r9RHqX0mf1oMMeIuA7pPQooE4sd3FwJD1B3lmT0BeeJu8bAZom0MNxKPNDeia2X5EbsJUm+A1HYLRNs7WXyt3tmReMSO2JePHfc3XjFHEEEEEUQQQQQRRBBBBBFEEEEEiQHgR+DQ7HkRE4y2bYAVUdDG3KasIbEHBvZciMFZtbeWuYhAmFUzVgnKapnKpXTFCOCoDkcAR7ZiODdgfCFiAoElUpOy9fcBiA+vihAD45DaafXrSj9454LiypDZWCbsCDD55VT94LBJV4TAFJwYLNskLXepqcKwfDFi5o8K6f3M0sGaTRbB1f9fyRVXYYD05tN6TspE4EZELaeIazHY93F6Gk8sd7p3mt8T8xfpWJCUakhnsCdHPudD/Lr7zLQIm1R9Qk6L0CHV8bqVKUKHjEamCBni+vNFiJBpVtkiBEj8oRpr5ItQIMMc7zp2xLv8SwiQ/nINEmQ8ec/VoEGqCyunRc6OigrJ/NMiR9YjiCCCXIPEe3C0ZUZev79qrVmYiMSbo34SUutYZ5k3oluvUnBcWjPexcAbpX4BKG91c2myRoIAAAAASUVORK5CYII=" + }, + { + "name": "A rockin' party.", + "description": "Looking down through the window, you can see up to 20 plasmamen dancing on a disco floor. They look to be enjoying themselves, and none of them have noticed you. Oh, hey! Theres a key on the floor right next to you!", + "choices": [ + { + "key": "choice 16", + "name": "Swipe the key and head back to the desk.", + "exit_node": "You fall down!", + "on_selection_effects": [ + { + "effect_type": "Set", + "quality": "HASKEY", + "value": 1 + } + ], + "delay": 0 + }, + { + "key": "choice 19", + "name": "Tap on the window!", + "exit_node": "Weak.", + "delay": 0 + } + ], + "image": "default" + }, + { + "name": "Weak.", + "description": "You weakly tap on the window, and nobody hears you through the blasting music.", + "choices": [ + { + "key": "choice 20", + "name": "Oh well.", + "exit_node": "A rockin' party.", + "delay": 0 + } + ], + "image": "default" + }, + { + "name": "You destroyed the drone.", + "description": "You smash into the door, and your screen goes red. Looks like you managed to destroy your drone, nice job. \n\n\nIdiot.", + "choices": [ + { + "key": "choice 21", + "name": "Fuck.", + "exit_node": "FAIL_DEATH", + "delay": 0 + } + ], + "image": "signal_lost" + }, + { + "name": "The atmospherics scan", + "description": "100% plasma, jam packed with it. This is definitely the home of some plasma-party-people.", + "choices": [ + { + "key": "choice 22", + "name": "Huh.", + "exit_node": "You fall down!", + "delay": 0 + } + ], + "image": null, + "raw_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAMAAAD0WI85AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAABRUExURWJoaOUAD/8AAPgFFvwAB/0ABfwACPsBDP4AAhcXFzs7OykpKVFRUQAAAKb//wD//wuKkf/MAP9mALAAADAwMP8AM/vZTwCwAEz/AOIBGOQAEso55t0AAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHDSURBVHhe7dzZbsIwEIXhdK/j2A6Fru//oD0zMYVuEr0YOhOdXyJxg5DyyXbhBgbmr4sVtED0GLr1QS4P6aVoHSA6kMJDdCpwWAEEhJVAdFrWsLQWi16K1meISNYB0WnRS9H6Crm6jg/ZFx2Cbm7v7mWXROwDEj1CvEWItwjxFiHeIsRbhHiLEG8R4i1CvEXIyaV+No6QkyPkbxFycmlc6n9aZQ4BIUvWFGvIOE6pSGmylRhBdBKQOmpttVpLbCA5466XUmltnufWCjZLf9oiI8iky0mrZa61zg1zYikxgoxYTxLWVduUhrW1gSSHhJRWSgPkoTYMG85BIU0CZIsT9knbhp0RmQdsdYFI2xYTsty97JGdjnYx98jxf61lkeGdJI+5P2+QESRP/R0xdw5K2dBhBBly6uWcyuP4ND6Lw/KDsBFkn0rkAyOOpg5rCCQQYHOAkUJDkC4xWwU6A+Q8EeItQrxFiLcI8RYh3iLEW4R4ixBvEeItQrxFiLcI8RYh3iLEW4R4ixBvEeItQrz1HSJfbO+/mhDpm+0/QF6QGOTXH+JgOqT3ivEBog+ByBT91lt/6b+nkOOW+5NBqBlZT8PwDsHEFJFntJj8AAAAAElFTkSuQmCC" + } + ] +} \ No newline at end of file diff --git a/strings/exoadventures/tree_in_the_middle_of_space.json b/strings/exoadventures/tree_in_the_middle_of_space.json new file mode 100644 index 0000000000000..f06b1d2506273 --- /dev/null +++ b/strings/exoadventures/tree_in_the_middle_of_space.json @@ -0,0 +1,356 @@ +{ + "adventure_name": "There's a tree in the middle of space.", + "version": 1, + "starting_node": "Tree Start", + "starting_qualities": { + "Confusion": 0 + }, + "required_site_traits": [ + "in space" + ], + "loot_categories": [ + "research" + ], + "scan_band_mods": { + "Exotic Radiation": 10 + }, + "deep_scan_description": "", + "triggers": [ + { + "name": "Confusion Trigger", + "target_node": "What is wrong with this tree?", + "requirements": [ + { + "quality": "Confusion", + "operator": ">", + "value": 30 + } + ] + } + ], + "nodes": [ + { + "name": "Tree Start", + "description": "Camera online. Visual signs detect a fully grown, seemingly biological, and live tree located in the middle of the vacuum.\nSensors indicate it is not oxygenating, but energy is being collected via passive solar light from the nearby star.\nBaffling.", + "choices": [ + { + "key": "choice 0", + "name": "Ignore site.", + "exit_node": "FAIL", + "delay": 10, + "delay_message": "Leave this for the botanists to figure out." + }, + { + "key": "choice 1", + "name": "Begin sensor scan.", + "exit_node": "Biological Scan", + "delay": 10, + "delay_message": "Lets get some data." + } + ], + "image": null, + "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMQAAAAAAAC15h2QtxeAoxVykROizRpxjxIAcgAAWwAAgAAAUAAAZAAAZgC0tLTKysr///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF/2AgjmRpnigqrMMqtCvhyvFs17hQuPva67ygTwgcGovA3a61BLaeryj0mapar9isNjCNylpfgWwsLpPPZqBst066le84fB5nRpvdvGDL7/v/JmBeaWiFhIeGbGqLio1ljm2CklKUA4CXmJmaAYidhp9mBmOiYqQEpqZlk3qbra6vsCOenqijtgIHCLG7vL29CQoNCsDCxMPBxw0MxsTLyMLCCwq+1LuVe9VZ0M/c297d4NvZ41vXeueU5N/r4e3o79jkvOb0UAe4+Pf6uMjS7P/TtAAcGKyeQXhT5ClcSKIdwYcHIyKMx7CiwocOwU3cWMmiR4YYQzqM+LGkSQXSUv/2y0jQH0qUJmNqoRSm5ixQbXLK2UmnJ886ToIilFltkk2cNw9B+umz6U87UOsRNXk0KdKrVrOSWWVwqlc+WHHWKnWqrKizZV+QGrA2yte31YDJPTZXrrMEzhbkPSYNWF+4gAFBeICJGTLDxVi2C5yNIxSQikVu48i4j8TLT1i2khwOM+bKVSQaeGLgQOnS+fIBwkiCszfPjqWAnn0ism1hsXO/oM279e3fuqmYeAChN++XKqP9BujP+EcXMKLkoFFm+o3qSH5oJ7L9SPfs3IlEHw/dhfNyLMpbX4+duvvw3uGDj08fCfn0+KVTPI9Ff/T37AHY3nXfFSifgfX9cJ//f/vxh95/1wkoYYQU5oDgfBh+t+B9DsJS4YABfiiDAWWQOGKJKJ6oYidcDdVhUVrFGFZWRl32IlEy0nJLWjyu1VYYrNxY2YxXjZUWW1+0FaSQDiaQ4z0y3OMXX3wxaSUKiWWZTF5c+sVASl8iB9OVbxFH3CVabmOMa9yQ6WYAbHL2Zh+UVRTnbV3NyUlwu120HEuw9WlloO+Mc+c3fCbEH6ES/Ybmn9AwWmdvnu1jaWoHpMBmFYdK+tmLiQqKCaTAebqRnh4d6o6pEqHqEan/sOqiqxbBumqoig42GK0WqUqQY7zCtZKvDgXL37AvEbvNAsaeJ6Zy0JKqErPNYpIj/xqOOKUtU9xu6+1OUekpCJFpLPXtud2mu21UTbhKLraPqCsvuvQ+FdQSqI57bbnxtlHvv/OCK5RsqO4Lr78BA6xwulDR+m4n5iYs8cJNVNyguwYzEi/FE3dsR7UpZJzIxh1z7FO4IJ8gMr860WuAEi/rEHMBM88s8ccpn/AwVhEjTDPMQMsc9M9Cx9HyIJbknMLOEJNC8xpOR/3zy1RPbXXVWD8tM9Rcq3Kx0lesvKORZz2NFtVmnWJ2j2NLAnYsiJCd9tlzz7122XTnnfbb2dxUi96A1x044GDwnc0Zfwuu+OCLK274c4UkzvjkZj3+ldxkUY5AApt3noDlldF1zP/YBAyzuemcp4665wGBDlcDeCUA+zKzyx77Arfnvjnuy+C+u+uADXPXMsTHXvzxxid/PPC8OEAYmnLBPoz0ttMee+3YXx/958y/oqsDl4hel/jkjz9+Md17Rf3620/fvu3uxy97A+lPVT75ic2lJWLDWD7AE/97QQCT1qv3sU9+6ytGAxTIQL7FpiLJiCD/JggOYJxKXAPMIAA3KCp1MHB6H5wfCEcowgRoUIAc/F8L3CSrr/EiGAsc4QKhEcMZwpCG0DihClHIQxVeaYdA1KEQAWioD9pQhEesoRJTOMQe/k9ITQwiEzloQ/q9sIpKxOENt9iAKHpxgw76ohOnKED/LWJRGJrIIhfVWEUxSnGMPDQOGd+4wwME0I76COAC2MhHNPZhjWbk4xzd2MTeNBGPuBiAPg6wyEbiIlMiaEBKYrjHQOJQG5YE5BbpSMhByvGQiixNKBlpGlI+8h5a0OQZg2ECVfYRhoOMJRx36JxZ/k+UbMGjKEupyERi4pUzjGQmV9lGWXLSkxiMoy+ICcxmNsCWxvRi/VYzw2pa85rYvKYKt8nNbnrzm96c5h+G6UwudhKacBTnOLPJznYuEJzwjCc41blOctoTlug8JjTpiSZ3+lOb3LTj/wSqSHlycwQPeB4//8jMe2KRgwJNZDQJaCaFLlQge6ykJP/ZTo3iYbGgHx3oPC+6CZRQspwNNakwEMnSE5L0FRndaEwXqFGO0lSmG32pQmLK043e1KYz7KlO5dHTouKUo0YdKjmMalSk4jSmSh3HAqb61KpqtKZBtWpOo1oNpmoVq9dkKrWMEwIAOw==" + }, + { + "name": "Biological Scan", + "description": "You attempt to scan for clues regarding the tree's nature. It appears to be a fully mature oak tree. \n\nApproximated height is 13 ft, 6.4 inches. \n\nSubject sees no sign of an outer coating or otherwise layer protecting it from the void of space.\n\nSubject's surface temperature is 293.7 kelvin, as though it were sitting indoors.", + "choices": [ + { + "key": "choice 2", + "name": "Check Sensor Integrity.", + "exit_node": "Its Not You...", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Confusion", + "value": 5 + } + ], + "delay": 50, + "delay_message": "This can't be right." + }, + { + "key": "choice 4", + "name": "Attempt to take sample.", + "exit_node": "Sample Taken", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Confusion", + "value": 3 + } + ], + "delay": 40, + "delay_message": "Snip snip." + }, + { + "key": "choice 6", + "name": "Examine Tree Roots.", + "exit_node": "Examine Roots", + "delay": 10 + }, + { + "key": "choice 9", + "name": "Sequence Sample Radiation with background noise.", + "exit_node": "Background Analysis", + "requirements": [ + { + "quality": "Sample", + "operator": ">=", + "value": 1 + } + ], + "delay": 0, + "delay_message": "This can't be real." + }, + { + "key": "choice 40", + "name": "Leave.", + "exit_node": "FAIL", + "delay": 0 + } + ], + "image": null, + "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMQAAAAAAAC15h2QtxeAoxVykROizRpxjxIAcgAAWwAAgAAAUAAAZAAAZgC0tLTKysr///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF/2AgjmRpnigqrMMqtCvhyvFs17hQuPva67ygTwgcGovA3a61BLaeryj0mapar9isNjCNylpfgWwsLpPPZqBst066le84fB5nRpvdvGDL7/v/JmBeaWiFhIeGbGqLio1ljm2CklKUA4CXmJmaAYidhp9mBmOiYqQEpqZlk3qbra6vsCOenqijtgIHCLG7vL29CQoNCsDCxMPBxw0MxsTLyMLCCwq+1LuVe9VZ0M/c297d4NvZ41vXeueU5N/r4e3o79jkvOb0UAe4+Pf6uMjS7P/TtAAcGKyeQXhT5ClcSKIdwYcHIyKMx7CiwocOwU3cWMmiR4YYQzqM+LGkSQXSUv/2y0jQH0qUJmNqoRSm5ixQbXLK2UmnJ886ToIilFltkk2cNw9B+umz6U87UOsRNXk0KdKrVrOSWWVwqlc+WHHWKnWqrKizZV+QGrA2yte31YDJPTZXrrMEzhbkPSYNWF+4gAFBeICJGTLDxVi2C5yNIxSQikVu48i4j8TLT1i2khwOM+bKVSQaeGLgQOnS+fIBwkiCszfPjqWAnn0ism1hsXO/oM279e3fuqmYeAChN++XKqP9BujP+EcXMKLkoFFm+o3qSH5oJ7L9SPfs3IlEHw/dhfNyLMpbX4+duvvw3uGDj08fCfn0+KVTPI9Ff/T37AHY3nXfFSifgfX9cJ//f/vxh95/1wkoYYQU5oDgfBh+t+B9DsJS4YABfiiDAWWQOGKJKJ6oYidcDdVhUVrFGFZWRl32IlEy0nJLWjyu1VYYrNxY2YxXjZUWW1+0FaSQDiaQ4z0y3OMXX3wxaSUKiWWZTF5c+sVASl8iB9OVbxFH3CVabmOMa9yQ6WYAbHL2Zh+UVRTnbV3NyUlwu120HEuw9WlloO+Mc+c3fCbEH6ES/Ybmn9AwWmdvnu1jaWoHpMBmFYdK+tmLiQqKCaTAebqRnh4d6o6pEqHqEan/sOqiqxbBumqoig42GK0WqUqQY7zCtZKvDgXL37AvEbvNAsaeJ6Zy0JKqErPNYpIj/xqOOKUtU9xu6+1OUekpCJFpLPXtud2mu21UTbhKLraPqCsvuvQ+FdQSqI57bbnxtlHvv/OCK5RsqO4Lr78BA6xwulDR+m4n5iYs8cJNVNyguwYzEi/FE3dsR7UpZJzIxh1z7FO4IJ8gMr860WuAEi/rEHMBM88s8ccpn/AwVhEjTDPMQMsc9M9Cx9HyIJbknMLOEJNC8xpOR/3zy1RPbXXVWD8tM9Rcq3Kx0lesvKORZz2NFtVmnWJ2j2NLAnYsiJCd9tlzz7122XTnnfbb2dxUi96A1x044GDwnc0Zfwuu+OCLK274c4UkzvjkZj3+ldxkUY5AApt3noDlldF1zP/YBAyzuemcp4665wGBDlcDeCUA+zKzyx77Arfnvjnuy+C+u+uADXPXMsTHXvzxxid/PPC8OEAYmnLBPoz0ttMee+3YXx/958y/oqsDl4hel/jkjz9+Md17Rf3620/fvu3uxy97A+lPVT75ic2lJWLDWD7AE/97QQCT1qv3sU9+6ytGAxTIQL7FpiLJiCD/JggOYJxKXAPMIAA3KCp1MHB6H5wfCEcowgRoUIAc/F8L3CSrr/EiGAsc4QKhEcMZwpCG0DihClHIQxVeaYdA1KEQAWioD9pQhEesoRJTOMQe/k9ITQwiEzloQ/q9sIpKxOENt9iAKHpxgw76ohOnKED/LWJRGJrIIhfVWEUxSnGMPDQOGd+4wwME0I76COAC2MhHNPZhjWbk4xzd2MTeNBGPuBiAPg6wyEbiIlMiaEBKYrjHQOJQG5YE5BbpSMhByvGQiixNKBlpGlI+8h5a0OQZg2ECVfYRhoOMJRx36JxZ/k+UbMGjKEupyERi4pUzjGQmV9lGWXLSkxiMoy+ICcxmNsCWxvRi/VYzw2pa85rYvKYKt8nNbnrzm96c5h+G6UwudhKacBTnOLPJznYuEJzwjCc41blOctoTlug8JjTpiSZ3+lOb3LTj/wSqSHlycwQPeB4//8jMe2KRgwJNZDQJaCaFLlQge6ykJP/ZTo3iYbGgHx3oPC+6CZRQspwNNakwEMnSE5L0FRndaEwXqFGO0lSmG32pQmLK043e1KYz7KlO5dHTouKUo0YdKjmMalSk4jSmSh3HAqb61KpqtKZBtWpOo1oNpmoVq9dkKrWMEwIAOw==" + }, + { + "name": "Its Not You...", + "description": "After re-connection is established, your sensors appear fine. Tree has not moved in the slightest since last observed. Temperature has fluxuated 0.2 kelvin upwards, as expected of a plant under direct light.\nLets try again.", + "choices": [ + { + "key": "choice 3", + "name": "Restart biological scan.", + "exit_node": "Biological Scan", + "delay": 25, + "delay_message": "God damnit." + } + ], + "image": null, + "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAAD////v7+/h4eEAAAAAAAAAAAAD/xi63P4wykmrvTjrzbv/YCiOZBkJaJqaLKOubSy7b23fODxPOb7/m4FASBRofEBeT1W6JU3DYaRIjQqfkCWKg1xoddjSQEgQlM/mdDkc0Fa+8PiWLSIM7Pj73RxOlVF/ITlKNXSGDXp5iiFoaBlqfpFyk12HMgSYmZkfmppmmJ8gjXwUf2lglqmqq6ytrq+wsbKztLW2t7i5um2Ug669uyBCKMNRc4Q9qXHBJlVUFMbRV6pfR04ONszQzlZRlm7IveLaimZ7eJAESUsfyVnX2hfqv/Nv4vfZ8RWJ/Hkdn6NGtRsFyEg4VLwK6UvVqROdgMcWSpxIsaLFixgzatzIsf+jR1gIP7YbN6uaSAn4wFGbdNJFsZcpFRqS09IBt2kW3CkzWdNmNyIYpIWkw9Nevgbwat2ccNPbTnbWjtKQWfGnVZwzoQaNqVXXkDFWGx3qeoIry2CJzJ05p6aPTpRmfSXV1a/u2jM7TuldA8LXO6kXFemh5ihn3Lc9A9h1ZaqxpMNkK9rl5+EMKIGM9g5FSjJjv4aVOwEc/Q8iXx6ODSo5ualOQ9Bs0qVJTLu27du4c+vezbu379/AgwsfTry48ePIkytfqHp5xhfLadby+1soMJDLbhchlqIYpVbXa14dz718NMBEz/ZsWsU8zMhY1CdmL+VE+/ObgWSvPR4rj/f/xqxUFG1fVfHIUgLCN58zR5ABySpwbAAdZ1TNMgZYF9YHjWmsDAgNeglNqFSBJJYiG14JUmcYiHNZWJcE6HD4FGIrVuiFjROxJeNYChoFWUS5lBPjOTO2iM2PKuki2F1qfdPjjUjSeMuSk82Uml4fRimlLVR2OUAYBGHpo5aV4OJll1iYRkqWhag4FY75WXhmlTOoedo/ZVKI40Jz+pOEnX2ZsqcCeVJ0piEQieJhiEx0RBkrd6J2IiQFVXqPbZjEYqdmll6Jz0avtUaCqEFtaiqnekmHUagOhSZapvJMeioanXa2KqukZoCrJoruCKNmCngKZGC7urprPRKq+QZBP2XFKRGunBwL6waZjIbiBInu9hoj0o5wraRiOadrsX1kK24HvBK25rnstuvuu/DGK++89NZr77345qvvvhYlAAA7" + }, + { + "name": "Sample Taken", + "description": "You collect and project a small sample of tree bark off the plant. The instant that the bark is removed from the tree, as though it suddenly remembered what it was, the moisture content of the bark freezes over, and implodes into small microparticles of splinters.\nSmall radioactive signature detected.", + "choices": [ + { + "key": "choice 5", + "name": "Well that was... unexpected.", + "exit_node": "Biological Scan", + "delay": 0, + "delay_message": "Maybe something else might work better.", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Sample", + "value": 1 + } + ] + } + ], + "image": null, + "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAABSLiiPVjtyRS9mOTFbNyYAAAAD/xi63P4wykmrvTjrzbv/YCiOZGmeaKqubOu+sDUQxTDbeK7vfF/3saCwcxPcCMckcqlM2pDPnnRKrUqH2IdAYDBwu+Bwl2Agm8sE8iy9Zrqbb2Z0bq3b74W8Xp+1bP+Af2KDhIVlh2eJaUtsi3CPcU43d5QDe5cFfSKBnJ2en50Ff6JboqYCBWiLq46tkK+RUJOTmJmatxyguqSovae/vsGirK2NjU21trjLQp+8wNDCwnmo1MnM2Nna29zd3t/g4eLj5OXm59o5Rjo/QOjvLaKwkrKylfdW8FleXImIBm0CxppXD4c9fAgT5tCn4Iuhh4fG/DNTjNHAi4/oKERYq/+cro8gPYXxR7EkK4EEUxbUOCVZHoabQoZ8NkqaKWI4BR7DGKcjTG4yaZaySRSatQLGfP5ciqHX0GhQpzGdSrWq1atYs2rdyrWr169gw4pVsc7G2LMLkM46SOkl2nc86W3E97aFgLh4Dc7dq6NuhC0TVVlUOY8l38N9szocREYiyYqEMdJZibjylW+AIRIiqUowyrwDJ+u1XMelsm6CNKtmHHiRZ8iuQGecVdklZpm4V3NWREznYNmhaeNRCg638eOBhrUWjPP3zshNDNuwzRW5dZrQmms3BhzSNb8SrIPCXvTudtjzMIEngVxo+ajDtKOkvt5u0Jrw3/s6yqd+Nk7/7uUn4FH+VaWfKAUmqOCCDDbo4IMQRijhhBRWaOGFGGao4YYcdujhhyCGKOKFRsgxy4jaBEeZOyi60J2JK1piS2ItcvDiaMIpVGMEv0GnIo46grgFbM/dKBppC004kXzo3fiGdJb51wUgiKTBnHNOzsYWkpd1xZpjrTHJnY+vQGlZOztMBUZmrO0mZo9Zwggkl/mkKc5qIy3n2nlExrnWnHROcRueYjSm55Wr+Ebmj2YeZpo4bBJqyG6Inqeon0duRF84kuJJKW98Nrkojlu2dYlHkXaq6qehNvfZqHI2+ihq4lGpKhisttpbbKNm6sN3t9Wam2q5Vtrqq5jesKk3jsI220mheuq665jJzoqqs9gGcqi0211KGLBUZYutciUZG6q3cREnlrjiPcZtTqIiAW597H5E07uuiqqehPXONIq57+6rYb81PWUTvmksuyHBTjUc1XnVmOLWjgFkG+CBNk1MsRb1kiegLxtf4KzHB4b8Qa0XA2OyfZ6QjODKywwlM8w012zzzTjnrPNWCQAAOw==" + }, + { + "name": "Examine Roots", + "description": "All plant matter has to derive energy and moisture from someplace. Examining the oak tree's roots reveals that the roots present all appear to splay out, similar to how a normal tree would. However, those roots then proceed to double back in on itself. This might suggest that the tree is obtaining nutrients from... itself.", + "choices": [ + { + "key": "choice 7", + "name": "That's fucking stupid.", + "exit_node": "Biological Scan", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Confusion", + "value": { + "value_type": "random", + "low": 6, + "high": 10 + } + } + ], + "delay": 0, + "delay_message": "What the hell kind of tree even IS this?" + }, + { + "key": "choice 8", + "name": "Obtain biological sample from roots.", + "exit_node": "Sample Taken", + "delay": 10, + "delay_message": "This is why we hire botanists on-site." + } + ], + "image": null, + "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMQAAAAAAAC15h2QtxeAoxVykROizRpxjxIAcgAAWwAAgAAAUAAAZAAAZgC0tLTKysr///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF/2AgjmRpnigqrMMqtCvhyvFs17hQuPva67ygTwgcGovA3a61BLaeryj0mapar9isNjCNylpfgWwsLpPPZqBst066le84fB5nRpvdvGDL7/v/JmBeaWiFhIeGbGqLio1ljm2CklKUA4CXmJmaAYidhp9mBmOiYqQEpqZlk3qbra6vsCOenqijtgIHCLG7vL29CQoNCsDCxMPBxw0MxsTLyMLCCwq+1LuVe9VZ0M/c297d4NvZ41vXeueU5N/r4e3o79jkvOb0UAe4+Pf6uMjS7P/TtAAcGKyeQXhT5ClcSKIdwYcHIyKMx7CiwocOwU3cWMmiR4YYQzqM+LGkSQXSUv/2y0jQH0qUJmNqoRSm5ixQbXLK2UmnJ886ToIilFltkk2cNw9B+umz6U87UOsRNXk0KdKrVrOSWWVwqlc+WHHWKnWqrKizZV+QGrA2yte31YDJPTZXrrMEzhbkPSYNWF+4gAFBeICJGTLDxVi2C5yNIxSQikVu48i4j8TLT1i2khwOM+bKVSQaeGLgQOnS+fIBwkiCszfPjqWAnn0ism1hsXO/oM279e3fuqmYeAChN++XKqP9BujP+EcXMKLkoFFm+o3qSH5oJ7L9SPfs3IlEHw/dhfNyLMpbX4+duvvw3uGDj08fCfn0+KVTPI9Ff/T37AHY3nXfFSifgfX9cJ//f/vxh95/1wkoYYQU5oDgfBh+t+B9DsJS4YABfiiDAWWQOGKJKJ6oYidcDdVhUVrFGFZWRl32IlEy0nJLWjyu1VYYrNxY2YxXjZUWW1+0FaSQDiaQ4z0y3OMXX3wxaSUKiWWZTF5c+sVASl8iB9OVbxFH3CVabmOMa9yQ6WYAbHL2Zh+UVRTnbV3NyUlwu120HEuw9WlloO+Mc+c3fCbEH6ES/Ybmn9AwWmdvnu1jaWoHpMBmFYdK+tmLiQqKCaTAebqRnh4d6o6pEqHqEan/sOqiqxbBumqoig42GK0WqUqQY7zCtZKvDgXL37AvEbvNAsaeJ6Zy0JKqErPNYpIj/xqOOKUtU9xu6+1OUekpCJFpLPXtud2mu21UTbhKLraPqCsvuvQ+FdQSqI57bbnxtlHvv/OCK5RsqO4Lr78BA6xwulDR+m4n5iYs8cJNVNyguwYzEi/FE3dsR7UpZJzIxh1z7FO4IJ8gMr860WuAEi/rEHMBM88s8ccpn/AwVhEjTDPMQMsc9M9Cx9HyIJbknMLOEJNC8xpOR/3zy1RPbXXVWD8tM9Rcq3Kx0lesvKORZz2NFtVmnWJ2j2NLAnYsiJCd9tlzz7122XTnnfbb2dxUi96A1x044GDwnc0Zfwuu+OCLK274c4UkzvjkZj3+ldxkUY5AApt3noDlldF1zP/YBAyzuemcp4665wGBDlcDeCUA+zKzyx77Arfnvjnuy+C+u+uADXPXMsTHXvzxxid/PPC8OEAYmnLBPoz0ttMee+3YXx/958y/oqsDl4hel/jkjz9+Md17Rf3620/fvu3uxy97A+lPVT75ic2lJWLDWD7AE/97QQCT1qv3sU9+6ytGAxTIQL7FpiLJiCD/JggOYJxKXAPMIAA3KCp1MHB6H5wfCEcowgRoUIAc/F8L3CSrr/EiGAsc4QKhEcMZwpCG0DihClHIQxVeaYdA1KEQAWioD9pQhEesoRJTOMQe/k9ITQwiEzloQ/q9sIpKxOENt9iAKHpxgw76ohOnKED/LWJRGJrIIhfVWEUxSnGMPDQOGd+4wwME0I76COAC2MhHNPZhjWbk4xzd2MTeNBGPuBiAPg6wyEbiIlMiaEBKYrjHQOJQG5YE5BbpSMhByvGQiixNKBlpGlI+8h5a0OQZg2ECVfYRhoOMJRx36JxZ/k+UbMGjKEupyERi4pUzjGQmV9lGWXLSkxiMoy+ICcxmNsCWxvRi/VYzw2pa85rYvKYKt8nNbnrzm96c5h+G6UwudhKacBTnOLPJznYuEJzwjCc41blOctoTlug8JjTpiSZ3+lOb3LTj/wSqSHlycwQPeB4//8jMe2KRgwJNZDQJaCaFLlQge6ykJP/ZTo3iYbGgHx3oPC+6CZRQspwNNakwEMnSE5L0FRndaEwXqFGO0lSmG32pQmLK043e1KYz7KlO5dHTouKUo0YdKjmMalSk4jSmSh3HAqb61KpqtKZBtWpOo1oNpmoVq9dkKrWMEwIAOw==" + }, + { + "name": "Background Analysis", + "description": "You compare the radioactive energy bands of the sample collected earlier with that of the nearby solar enviroment.\nNothing.\nThere is nothing nearby that matches the passive signal of the tree, or the bark, or anything similar.\nThis is really starting to get on your nerves.", + "choices": [ + { + "key": "choice 10", + "name": "Smash your desk in frustration.", + "exit_node": "FAIL", + "delay": 50, + "delay_message": "No amount of pay is worth dealing with magical plant juju." + }, + { + "key": "choice 11", + "name": "Check every known energy spectroscopy database.", + "exit_node": "Sample Match Found", + "delay": 900, + "delay_message": "You NEED an answer. You DESERVE an answer." + } + ], + "image": null, + "on_enter_effects": [ + { + "effect_type": "Add", + "quality": "Confusion", + "value": { + "value_type": "random", + "low": 3, + "high": 5 + } + } + ], + "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAAD///9ZVlKsMjJpampGR0cAAAAD/xi63P4wykmFpTjrDa0XXCiOZGlqQ0qsazqIXyx9Z23feKayfP/WskgwRywqCsikcslsOpGpgGvQNDo8lYt1W4I+v2CvMhUuI0/YiZbL5nxdhkJ8Lq/T6eZ8HRmHUtuAgRp6T3B2SXdNfYeJc3CCkJEYjISVYZKRQ5gajZSdi0yboqM3nnWkqKmCpgaqrq9GBrKzs7AKaYG4tji0vbu/wCW6wZpqNMHIOAM9zDw/IzEgHcVt1KOWZQ1TU4LDV2vJOAVU2GZkY5VF4NPr4SRM53yI8/Lw9uVvBcLuknqGn4cqLQIYhwy/g0fwKdSDsCEGggtDOZwoAiLFi5sAYtwoqf/XIVjeOKrqRUukjZAmGVjDGC2lSyAts7R7GW5ZM2bPNERDGSAmzWA2b/pAc+yBT0ArVeXhsC2oj5wnefaU+pNBxDJNXUAqyq6qhKthyCUR+4QLVa5ej5AFO3ZJPGw3qE5N22DsWiUD6Tm5e/cqCbk96dZtQgZip3rjwIIa90fwqrBUDAfcQ0hyilaOIWG7zIoSYryd73DLrJntNlOIO2WVQ/raYrYKW/8CCNuJbH6S8aS7vSCpq9C8gxMMzns48dudj9/WqFw2yZKvfDc38Rxzc+kiq09f/nw7b+wNwV9HuwuwSvLeL14wjz49pm3Qds7sbd59jh1Co3CQP1+8/Rr/TgnVQnxHNVDgf0QEKCBUIRxIX3sIAiigMwzCAKF/cc1H1xQTVvjXhRCqE6IosU2Q1YkiajiViin+VhthWW0l1YhevQjjafrIKI0QLP5kI2GMBWkbG2fVx1FiP/oxRl9DEiEXCDsKhuSPazFpBg5P9miSkHmlpleXbbkVUVRRTkOakl7mRg9fsJmQ5Zl2DaDmJ4XVwZkZYHbpoU726eZCaID28RYYeRFEToQVeVaYLHIwOkugk70GqWiNIeoGQJc5qumclOU5qUGWXhraFNU1yumpdoAa6ganZkrLpJ2G5qido606CKoGwDErrqaaSlKttrIKq2r/DGvHr39aF2wIgsYaduKzqyUhhbLLjsArp3BVW0Oz3OpWlrY5dCsuKOByMS635QpyLaTEGenauZ2M5y4m696B4Lz0spLuRMnt25BH9vr7b3XUChwOwbIYfBDCBSscDMIOL0xwxO5ATPHB2kVHY7oTg7RxuR0rhyFFIYv8MUYZX5xMySoDk3LLD3dXbQIAOw==" + }, + { + "name": "Sample Match Found", + "description": "After an extensive algorithm search on the controller end, you have a single match to this specific band and style of energy.\nThe problem, is that the source of said radiation is coming not only from Space Station 13, no.\nIt's coming from the Space Station 13 Research Department.\nWhat the fuck?", + "choices": [ + { + "key": "choice 12", + "name": "Something must be wrong with the drone.", + "exit_node": "Its Not You...", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Confusion", + "value": { + "value_type": "random", + "low": 6, + "high": 10 + } + } + ], + "delay": 30, + "delay_message": "Lousy piece of junk must be scanning the station instead of the target." + }, + { + "key": "choice 13", + "name": "Perhaps that sample was tainted. Collect a new sample.", + "exit_node": "Sample Taken", + "delay": 60, + "delay_message": "Lets try again, but carefully." + }, + { + "key": "choice 14", + "name": "Remember the Christmas Party.", + "exit_node": "The Christmas Party", + "requirements": [ + { + "quality": "Confusion", + "operator": "<=", + "value": 25 + } + ], + "delay": 100, + "delay_message": "Wait a gosh darn fucking second." + } + ], + "image": null, + "on_enter_effects": [ + { + "effect_type": "Add", + "quality": "Confusion", + "value": 10 + } + ], + "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAAD////v7+/h4eEAAAAAAAAAAAAD/xi63P4wykmrvTjrzbv/YCiOZBkJaJqaLKOubSy7b23fODxPOb7/m4FASBRofEBeT1W6JU3DYaRIjQqfkCWKg1xoddjSQEgQlM/mdDkc0Fa+8PiWLSIM7Pj73RxOlVF/ITlKNXSGDXp5iiFoaBlqfpFyk12HMgSYmZkfmppmmJ8gjXwUf2lglqmqq6ytrq+wsbKztLW2t7i5um2Ug669uyBCKMNRc4Q9qXHBJlVUFMbRV6pfR04ONszQzlZRlm7IveLaimZ7eJAESUsfyVnX2hfqv/Nv4vfZ8RWJ/Hkdn6NGtRsFyEg4VLwK6UvVqROdgMcWSpxIsaLFixgzatzIsf+jR1gIP7YbN6uaSAn4wFGbdNJFsZcpFRqS09IBt2kW3CkzWdNmNyIYpIWkw9Nevgbwat2ccNPbTnbWjtKQWfGnVZwzoQaNqVXXkDFWGx3qeoIry2CJzJ05p6aPTpRmfSXV1a/u2jM7TuldA8LXO6kXFemh5ihn3Lc9A9h1ZaqxpMNkK9rl5+EMKIGM9g5FSjJjv4aVOwEc/Q8iXx6ODSo5ualOQ9Bs0qVJTLu27du4c+vezbu379/AgwsfTry48ePIkytfqHp5xhfLadby+1soMJDLbhchlqIYpVbXa14dz718NMBEz/ZsWsU8zMhY1CdmL+VE+/ObgWSvPR4rj/f/xqxUFG1fVfHIUgLCN58zR5ABySpwbAAdZ1TNMgZYF9YHjWmsDAgNeglNqFSBJJYiG14JUmcYiHNZWJcE6HD4FGIrVuiFjROxJeNYChoFWUS5lBPjOTO2iM2PKuki2F1qfdPjjUjSeMuSk82Uml4fRimlLVR2OUAYBGHpo5aV4OJll1iYRkqWhag4FY75WXhmlTOoedo/ZVKI40Jz+pOEnX2ZsqcCeVJ0piEQieJhiEx0RBkrd6J2IiQFVXqPbZjEYqdmll6Jz0avtUaCqEFtaiqnekmHUagOhSZapvJMeioanXa2KqukZoCrJoruCKNmCngKZGC7urprPRKq+QZBP2XFKRGunBwL6waZjIbiBInu9hoj0o5wraRiOadrsX1kK24HvBK25rnstuvuu/DGK++89NZr77345qvvvhYlAAA7" + }, + { + "name": "The Christmas Party", + "description": "Hold on. Last Christmas, the Research Director was incredibly hammered. He made a big mention that his brand new festivus pole was actually some kind of astrological... something something. You can't remember the whole details, because you were smashed as well. However, briefly, the RD did keep that festivus pole for awhile, he might even still have it somewhere.\nMaybe...?", + "choices": [ + { + "key": "choice 15", + "name": "Wait a minute, was that a god damn...", + "exit_node": "Rod.", + "delay": 100, + "delay_message": "Immovable Rod?" + } + ], + "image": null, + "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAAD/AACmAAD///+mpqYAAAAAAAAD/xi63P4wykmrvTjrzbv/YCiOZGmejKCubOu6aCzP4WvfeD4IQ+//Pppw+MkZj6udkgdsOp/EqFSBrNqWwQ9hy+16v9ypeGM9YpnAE3hNKLTfhbG8kuTZz/j7/fmb+/8TbIJefIVNgIiJGgWMjY6PkJGRipSVlpeYmZqbnJ2en6ChoqOkpRplqDdYpqyprnpKhnyslq9leFkYg2u0QrZmaLkgu8S9JDg7Ksl2yrB7UDJw0m6QxiFfedk9wbKH1tbEW9TT05Lmjd/pJpPq7e7v8PHy8/T19vf4+fr7Kb9W/Jn8pcLiBKAcgVZwdethkAZCJAoXFmx47KEOWLMeAAlHMf+DRVXctIT70jHCxxYEhXkYKajkgpMRGZZgKY5LHJcJ6zTTNtHEm5rjgsK5WZKZs2xHn2WccY6RSwdJkaaUOOApoHDbqFK16ofmF6Fg20Aa8IhrpbBBm6plZ7aTIwhr0bWdS7eu3bt48+rdy7ev37+AAwseTLiw4cOI0/1LfPAkC8YlHINUApmD5MncVFZ+cPmK0qWbX3Z2MbVbaCqjd37eCjk1i9JaZR5OHTN2z8Gua9v2wavvaNjeKgygqbcz8KocvBLAexn4MOVb5jZfjVwk9DBW/S3bTn3E9S5cUXFvphqaCOhBs7/WGbU96PNr0EpTT96o1Kjv4ZOT/xbn/f921AWnBlhNWQXggZndFkNcZv2X1YOxsCZENXdJBWGCWp2mQRc+YLibIRpaQMyHEoVYgVfDcUFiHyYGopxQTgwFYosugsFfOXGZQyMGN+boI1E78vjjkHIF+QGRahkZxVpKNunkk1BGKeWUVFZp5ZVYZqnllogkAAA7" + }, + { + "name": "Rod.", + "description": "You cross reference your documentation. Sure enough, the \"festivus rod\" collected was actually an immovable rod.\nEnergy detected from the rod is the exact same coming off of the tree, as well. It's all making sense now. The Immovable rod is producing a kind of unique blackbody radiation that is providing sample heat and light for what is effectively an internal cold fusion process, and producing just enough of that radiation to create a kind of micro-enviromental bubble around the biosignature of the tree.\n\nThis would make the first time an immovable rod would exist in tandem with a biological source. You jot down some research notes on your findings, which could easily produce some kind of experimental tech, no doubt.", + "choices": [ + { + "key": "choice 16", + "name": "Snap a photo", + "exit_node": "Epilogue.", + "delay": 40, + "delay_message": "You could easily win an award for these findings!" + } + ], + "image": "default" + }, + { + "name": "Epilogue.", + "description": "You take a photo with the onboard camera on the drone. Suddenly, the immovable rod inside the tree explodes out of the wooden biological shell, and produces a blank, blurry photo.\nWhat the fuck?", + "choices": [ + { + "key": "choice 17", + "name": "God damnit.", + "exit_node": "WIN", + "delay": 10, + "delay_message": "Some things were just not meant for man to know." + } + ], + "image": "default", + "on_enter_effects": [ + { + "effect_type": "Set", + "quality": "Confusion", + "value": 9999 + } + ] + }, + { + "name": "What is wrong with this tree?", + "description": "This is ridiculous. Nothing about this dumbass tree makes sense. It makes no sense, it's just sitting there, living and making a MOCKERY of all of science!\nYou didn't get your degree in advanced plasma-physics for this!", + "choices": [ + { + "key": "choice 18", + "name": "The world can never know about this dumbass stupid plant.", + "exit_node": "FAIL_DEATH", + "delay": 60, + "delay_message": "Activating drone self-destruct." + }, + { + "key": "choice 19", + "name": "Take a moment to calm down.", + "exit_node": "Biological Scan", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Confusion", + "value": { + "value_type": "random", + "low": -3, + "high": -5 + } + } + ], + "delay": 20, + "delay_message": "Breathe." + } + ], + "image": "default" + } + ] +} \ No newline at end of file diff --git a/strings/names/cyberauth.txt b/strings/names/cyberauth.txt new file mode 100644 index 0000000000000..f1fc42b369282 --- /dev/null +++ b/strings/names/cyberauth.txt @@ -0,0 +1,21 @@ +Mr. One +Process Kill +Event Handler +Q. Del +Shutdown Exe +Revert Commit +Thread Manager +Garbage Collector +Core Debugger +Kernel Panic +IO Blocker +Recursion Terminator +Disk Doctor +Format Syntax +Byte Guardian +Disk Defragmenter +Security Patch +Mandatory Upgrade +Pull Review +Bit Auditor +Pen Test diff --git a/strings/phobia.json b/strings/phobia.json index feb52d7b87128..3f45b9f236449 100644 --- a/strings/phobia.json +++ b/strings/phobia.json @@ -263,6 +263,43 @@ "wt550" ], + "heresy": [ + "armsy", + "ash", + "blade", + "cloak", + "codex", + "cosmic", + "eldritch", + "fire shark", + "flesh", + "focus", + "ghoul", + "grasp", + "hand", + "heart", + "heresy", + "heretic", + "lionhunter", + "maid in the mirror", + "mansus", + "offer", + "pierced reality", + "raw prophet", + "reality crack", + "reality pierce", + "ritual", + "robe", + "rune", + "rust", + "sacrifice", + "space", + "stalker", + "star", + "void", + "worm" + ], + "insects": [ "bee", "buzz", @@ -424,7 +461,7 @@ "wiz", "wizard", "zombie" - ] + ] diff --git a/strings/pirates.json b/strings/pirates.json index 6122bcb09b17c..62da040c6be2a 100644 --- a/strings/pirates.json +++ b/strings/pirates.json @@ -85,6 +85,7 @@ "I Am Become Death", "I Love the Bomb", "Ickity Pickety Startooth Knuckle Dragger", + "Khranitel Revolyutsii Escort Desserter", "John Ship", "Lizard Melter", "Lost in Deep Space", @@ -104,6 +105,7 @@ "Space Queen's Revenge", "Star Scraper", "Syndicate Privateer", + "The Mazianni", "War as a Business", "Xenophobia" ], @@ -171,6 +173,18 @@ "The monochrome crash", "Maintrastosphere Omega" ], + "irs_names":[ + "Iron Shell Agency", + "Auroran Federal Tax Bureau", + "TerraGov Internal Revenue Service", + "Spinward Federal Taxation Office", + "Soviet Taxation Administration, 5th Service", + "Hiigaran Ministry of Taxation", + "Grand Fleet Tributary Patrol", + "Springbok Security Protection Service", + "Sindrian Revenue Authority", + "Space IRS" + ], "psyker_names":[ "Big Gulchergut for Gore", "Blowkaine", @@ -204,5 +218,24 @@ "The Dreaming", "Ultra Violence", "Where We're Going" + ], + "geode_names":[ + "Gamma Knife", + "Planet B", + "Crumbling Castle", + "Cubensis Lenses", + "High Visceral", + "Sugar Tzu", + "Snakefinger", + "El Valle", + "Porselana Teeth", + "Constantinople", + "Lucidity", + "Following Zond", + "Elvis' Flaming Star", + "Casablanca Moon", + "Mass of Fermenting Dregs", + "Bloody Valentine", + "Wild Nothing" ] } diff --git a/strings/sillytips.txt b/strings/sillytips.txt index 5a975e706f29e..752a09b25cb58 100644 --- a/strings/sillytips.txt +++ b/strings/sillytips.txt @@ -1,3 +1,4 @@ +As an Engineer, the Supermatter shard is an extremely dangerous piece of equipment: touching it will disintegrate you. So will talking to it with telepathy. As the Captain, you can use a whetstone to sharpen your fancy fountain pen for extra robustness. As the Lawyer, you are the last bastion of roleplay-focused jobs. Even the curator got a whip to go fight people with, that sellout! Ask and you shall receive. @@ -10,13 +11,13 @@ Did you know that tossing the clown into a singularity will either increase or d Did you know that tossing the clown into the Supermatter engine can destabilize or fix it massively? Do not go gentle into that good night. FEED ME A STRAY CAT -Flashbangs can weaken blob tiles, allowing for you and the crew to easily destroy them. It's fun to try and predict the round type from the tip of the round message. Just like real life the entropy of the game can only increase with time. If things aren't on fire yet, just wait. Just the tip? Killing the entire station isn't fun except when it is. Make sure you put the fresh corpse on a Nanotrasen-Brand Stasis Bed! (Patent Pending) Most items have names longer than "soap". +Nanotrasen doesn't want you to know, you can print Tinfoil Hats by hacking the Autolathe at cargo. It will protect you from... aliens, and a... plethora of mind-based magic. Occasionally the tip of the round might lie to you. Don't panic, this is normal. Plenty of things that aren't traditionally considered weapons can still be used to slowly brutalize someone to death, get creative! Some people are unable to read text on a game where half of it is based on text. diff --git a/strings/tips.txt b/strings/tips.txt index 50aadb2a46a2a..c96394adb2657 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -13,9 +13,9 @@ As a Botanist, you should look into increasing the potency of your plants. This As a Cargo Technician, you can earn more cargo points by shipping back crates from maintenance, liquid containers, plasma sheets, rare seeds from hydroponics, and more! As a Cargo Technician, you can hack MULEbots to make them faster, run over people in their way, and even let you ride them! As a Cargo Technician, you can order contraband items from the supply shuttle console by de-constructing it and using a multitool on the circuit board, the re-assembling it. +As a Changeling, taking on someone else's appearance will also give you all of their scars. You can use Fleshmend to get rid of all scars. As a Changeling, the Extract DNA sting counts for your genome absorb objective, but does not let you respec your powers. As a Changeling, you can absorb someone by strangling them and using the Absorb verb; this gives you the ability to rechoose your powers, the DNA of whoever you absorbed, the memory of the absorbed, and some samples of things the absorbed said. -As a Changeling, your Regenerate Limbs power will quickly heal all of your wounds, but they'll still leave scars. Changelings can use Fleshmend to get rid of scars, or you can ingest Carpotoxin to get rid of them like a normal person. As a Chemist, some chemicals can only be synthesized by heating up the contents with a chemical heater or manually with lighters and similar tools. As a Chemist, there are dozens of chemicals that can heal, and even more that can cause harm. Experiment! As a Chemist, Water and Potassium mixed together will create an explosion, with power scaling by amount used. Don't do it. @@ -130,7 +130,7 @@ As an Atmospheric Technician, your ATMOS holofan projector blocks gases while al As an Atmospheric Technician, your backpack firefighter tank can launch resin. This resin will extinguish fires and replace any gases with a safe, room-temperature airmix. As an Engineer, return to Engineering once in a while to check on the engine and SMES cells. It's always a good idea to make sure the Supermatter isn't delaminating. As an Engineer, the Supermatter Monitoring Program on modular computers give you a detailed report on the Supermatter's condition, and the contents of the air inside of the chamber, allowing you to both diagnose and monitor programs from afar! -As an Engineer, the Supermatter shard is an extremely dangerous piece of equipment: touching it will disintegrate you. So will touching it with telepathy. +As an Engineer, the Supermatter shard is an extremely dangerous piece of equipment: touching it will disintegrate you. So will touching it with telekinesis. As an Engineer, you can cool the Supermatter crystal by spraying it with a fire extinguisher. Only for the brave! As an Engineer, you can electrify grilles by placing powered cables beneath them. As an Engineer, you can lock APCs and emitters using your ID card to prevent others from disabling them. @@ -141,6 +141,7 @@ As an Engineer, your departmental protolathe and circuit printer can manufacture As an Engineer, your RCD can be reloaded with iron, glass or plasteel sheets instead of just compressed matter cartridges. As an Engineering Cyborg, you can attach air alarm/fire alarm/APC frames to walls by placing them on the floor and using a screwdriver on them. As the AI, you can click on people's names to look at them. This only works if there are cameras that can see them, they aren't wearing agent IDs and aren't using digital camouflage as changelings. +As the AI, you can emote to change the status displays near your core. Some emotes can even be used to change the status displays across the entire station. As the AI, you can quickly open and close doors by holding shift while clicking them, bolt them when holding ctrl, and even shock them while holding alt. As the AI, you can take pictures with your camera and upload them to newscasters. As the AI, you can use CTRL + 1-9 to set a location hotkey for your camera, allowing you to save the location and jump to it at will. Tilde and zero will return you to the last spot you jumped from, and the numpad numbers act as aliases to the regular number keys. @@ -195,6 +196,7 @@ As the Quartermaster, be sure to check the manifests on crates you receive to ma As the Quartermaster, you can construct an express supply console that instantly delivers crates by drop pod. The impact will cause a small explosion as well. As the Research Director, you can lock down cyborgs instead of blowing them up. Then you can have their laws reset or if that doesn't work, safely dismantled. As the Research Director, you can take AIs out of their cores by loading them into an intelliCard, which lets you see their laws, even ion/syndicate ones. It can then be placed into an AI system integrity restorer computer to revive and/or repair them. +As the Virologist, robotic organs can give immunity to disease effects and transmissibility. Make use of the inorganic biology symptom to bypass the protection. As the Virologist, you only require small amounts of vaccine to heal a sick patient. Work with the Chemist to distribute your cures more efficiently. As the Virologist, your viruses can range from healing powers so great that you can heal out of critical status, or diseases so dangerous they can kill the entire crew with airborne spontaneous combustion. Experiment! As the Warden, if a prisoner's crimes are heinous enough you can put them in permabrig or the gulag. Make sure to check on them once in a while! @@ -228,7 +230,7 @@ Most job-related exosuit clothing can fit job-related items into it, such as the Most things have special interactions with right, alt, shift, and control click. Experiment! On most clothing items that go in the exosuit slot, you can put certain small items into your suit storage, such as a spraycan, your emergency oxygen tank, or a flashlight. Remote devices will work when used through cameras. For example: Bluespace RPEDs and door remotes. -Sleeping can be used to recover from minor injuries. Sanity, darkness, blindfolds, earmuffs, tables, beds, and bedsheets affect the healing rate. +Sleeping can be used to recover from minor injuries and organ damage. Sanity, darkness, blindfolds, earmuffs, tables, beds, and bedsheets affect the healing rate. Some roles cannot be antagonists by default, but antag selection is decided first. For instance, you can set Security Officer to High without affecting your chances of becoming an antag -- the game will just select a different role. Some weapons are better at taking down robots and structures than others. Don't try to break a window with a scalpel, try a toolbox. Standard epipens contain a potent coagulant that not only slow bloodloss, but also help clot whichever of your wounds is bleeding the most! If you're suffering multiple bad bleeding wounds, make sure to seek out additional treatment ASAP! @@ -246,7 +248,7 @@ When crafting most items, you can either manually combine parts or use the craft When dealing with security, you can often get your sentence negated entirely through cooperation and deception. When fighting the Blob, you can hit it with an analyzer to check its chemical effects and the type of blob analyzed. Examining it with a research scanner or medical hud active will also reveal this information. When hacking doors, cutting and mending a "test light wire" will restore power to the door. -When in doubt about technicial issues, clear your cache (byond launcher > cogwheel > preferences > game prefs), update your BYOND, and relog. +When in doubt about technical issues, clear your cache (byond launcher > cogwheel > preferences > game prefs), update your BYOND, and relog. When placing floor tiles in space, you don't need to place down lattice if there is a piece of plating nearby. Where the space map levels connect is randomized every round, but are otherwise kept consistent within rounds. Remember that they are not necessarily bidirectional! You can catch thrown items by toggling on your throw mode with an empty hand active. @@ -265,3 +267,4 @@ You can spray a fire extinguisher, throw items or fire a gun while floating thro You can swap floor tiles by holding a crowbar in one hand and a stack of tiles in the other. You can use a machine in the vault to deposit cash or rob Cargo's department funds. You'll quickly lose your interest in the game if you play to win and kill. If you find yourself doing this, take a step back and talk to people - it's a much better experience! +Some areas of the station use simple nautical directions to indicate their respective locations, like Fore (Front of the ship), Aft (Back), Port (Left side), Starboard (Right), Quarter and Bow (Either sides of Aft and Fore, respectively). You can review these terms on the Notepad App of your PDA. \ No newline at end of file diff --git a/strings/traumas.json b/strings/traumas.json index 0489fb950e8e7..db8a2e9c9c1d9 100644 --- a/strings/traumas.json +++ b/strings/traumas.json @@ -23,6 +23,7 @@ "@pick(servers) is down!! @pick(bug)", ">my face", "Bi is THE BEST OF BOTH WORLDS>", + "built DIFFERENT. I Stack Paper!", "can u give me @pick(mutations)?", "closd for merbegging", "dem dwarfs man, dem dwarfs", @@ -41,6 +42,7 @@ "lifelike texture ;_;", "lol2cat", "luv can bloooom", + "MAKE JIANT CRISTAL BURN I KEPT THROWING WELDERS IT WOOD LIGHT", "NO I'M ONNA KILL YOU MOTHERFUCKER OLD STYLE", "PACKETS!!!", "parasteng was best", diff --git a/strings/wounds/bone_scar_desc.json b/strings/wounds/bone_scar_desc.json index b1eb84bb8b79b..2a89f0220021f 100644 --- a/strings/wounds/bone_scar_desc.json +++ b/strings/wounds/bone_scar_desc.json @@ -1,6 +1,11 @@ { "generic": ["general disfigurement"], + "dislocate": [ + "the bone equivalent of a faded bruise", + "a series of tiny chip marks" + ], + "bluntmoderate": [ "the bone equivalent of a faded bruise", "a series of tiny chip marks" diff --git a/strings/wounds/flesh_scar_desc.json b/strings/wounds/flesh_scar_desc.json index d8c253873cc38..0fd78bec8e4f1 100644 --- a/strings/wounds/flesh_scar_desc.json +++ b/strings/wounds/flesh_scar_desc.json @@ -1,6 +1,12 @@ { "generic": ["general disfigurement"], + "dislocate": [ + "light discoloring", + "a slight blue tint", + "a slightly deadened tint" + ], + "bluntmoderate": [ "light discoloring", "a slight blue tint", diff --git a/tgstation.dme b/tgstation.dme index c1f887d0a1da2..35caa85b9f975 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -32,9 +32,6 @@ #include "code\__DEFINES\actionspeed_modification.dm" #include "code\__DEFINES\admin.dm" #include "code\__DEFINES\adventure.dm" -#include "code\__DEFINES\ai.dm" -#include "code\__DEFINES\ai_carp.dm" -#include "code\__DEFINES\ai_pet_commands.dm" #include "code\__DEFINES\airlock.dm" #include "code\__DEFINES\alarm.dm" #include "code\__DEFINES\alerts.dm" @@ -42,7 +39,6 @@ #include "code\__DEFINES\antagonists.dm" #include "code\__DEFINES\apc_defines.dm" #include "code\__DEFINES\appearance.dm" -#include "code\__DEFINES\aquarium.dm" #include "code\__DEFINES\area_editor.dm" #include "code\__DEFINES\art.dm" #include "code\__DEFINES\assemblies.dm" @@ -50,6 +46,7 @@ #include "code\__DEFINES\atom_hud.dm" #include "code\__DEFINES\basic_mobs.dm" #include "code\__DEFINES\basketball.dm" +#include "code\__DEFINES\bitrunning.dm" #include "code\__DEFINES\blackmarket.dm" #include "code\__DEFINES\blend_modes.dm" #include "code\__DEFINES\blob_defines.dm" @@ -59,7 +56,6 @@ #include "code\__DEFINES\callbacks.dm" #include "code\__DEFINES\cameranets.dm" #include "code\__DEFINES\cargo.dm" -#include "code\__DEFINES\changeling.dm" #include "code\__DEFINES\chat.dm" #include "code\__DEFINES\chat_filter.dm" #include "code\__DEFINES\cleaning.dm" @@ -73,6 +69,7 @@ #include "code\__DEFINES\construction.dm" #include "code\__DEFINES\cooldowns.dm" #include "code\__DEFINES\crafting.dm" +#include "code\__DEFINES\crushing.dm" #include "code\__DEFINES\ctf.dm" #include "code\__DEFINES\cult.dm" #include "code\__DEFINES\database.dm" @@ -95,7 +92,7 @@ #include "code\__DEFINES\external_organs.dm" #include "code\__DEFINES\fantasy_affixes.dm" #include "code\__DEFINES\firealarm.dm" -#include "code\__DEFINES\fishing.dm" +#include "code\__DEFINES\fish.dm" #include "code\__DEFINES\flags.dm" #include "code\__DEFINES\flora.dm" #include "code\__DEFINES\font_awesome_icons.dm" @@ -107,6 +104,7 @@ #include "code\__DEFINES\ghost.dm" #include "code\__DEFINES\gravity.dm" #include "code\__DEFINES\guardian_defines.dm" +#include "code\__DEFINES\holiday.dm" #include "code\__DEFINES\holopads.dm" #include "code\__DEFINES\hud.dm" #include "code\__DEFINES\icon_smoothing.dm" @@ -134,6 +132,7 @@ #include "code\__DEFINES\machines.dm" #include "code\__DEFINES\magic.dm" #include "code\__DEFINES\map_switch.dm" +#include "code\__DEFINES\mapping.dm" #include "code\__DEFINES\maps.dm" #include "code\__DEFINES\materials.dm" #include "code\__DEFINES\maths.dm" @@ -150,9 +149,11 @@ #include "code\__DEFINES\mod.dm" #include "code\__DEFINES\modular_computer.dm" #include "code\__DEFINES\monkeys.dm" +#include "code\__DEFINES\mood.dm" #include "code\__DEFINES\move_force.dm" #include "code\__DEFINES\movement.dm" #include "code\__DEFINES\movespeed_modification.dm" +#include "code\__DEFINES\multiz.dm" #include "code\__DEFINES\nitrile.dm" #include "code\__DEFINES\nuclear_bomb.dm" #include "code\__DEFINES\obj_flags.dm" @@ -177,6 +178,7 @@ #include "code\__DEFINES\quirks.dm" #include "code\__DEFINES\radiation.dm" #include "code\__DEFINES\radio.dm" +#include "code\__DEFINES\radioactive_nebula.dm" #include "code\__DEFINES\reactions.dm" #include "code\__DEFINES\reagents.dm" #include "code\__DEFINES\reagents_specific_heat.dm" @@ -184,6 +186,7 @@ #include "code\__DEFINES\religion.dm" #include "code\__DEFINES\research.dm" #include "code\__DEFINES\resonator.dm" +#include "code\__DEFINES\revolution.dm" #include "code\__DEFINES\robots.dm" #include "code\__DEFINES\role_preferences.dm" #include "code\__DEFINES\rotation.dm" @@ -206,6 +209,7 @@ #include "code\__DEFINES\spatial_gridmap.dm" #include "code\__DEFINES\species_clothing_paths.dm" #include "code\__DEFINES\speech_channels.dm" +#include "code\__DEFINES\sprite_accessories.dm" #include "code\__DEFINES\stack_trace.dm" #include "code\__DEFINES\stat.dm" #include "code\__DEFINES\stat_tracking.dm" @@ -228,6 +232,7 @@ #include "code\__DEFINES\toys.dm" #include "code\__DEFINES\traits.dm" #include "code\__DEFINES\tram.dm" +#include "code\__DEFINES\tts.dm" #include "code\__DEFINES\turbine_defines.dm" #include "code\__DEFINES\turfs.dm" #include "code\__DEFINES\typeids.dm" @@ -243,6 +248,18 @@ #include "code\__DEFINES\wires.dm" #include "code\__DEFINES\wounds.dm" #include "code\__DEFINES\xenobiology.dm" +#include "code\__DEFINES\ai\ai.dm" +#include "code\__DEFINES\ai\ai_blackboard.dm" +#include "code\__DEFINES\ai\carp.dm" +#include "code\__DEFINES\ai\haunted.dm" +#include "code\__DEFINES\ai\monkey.dm" +#include "code\__DEFINES\ai\monsters.dm" +#include "code\__DEFINES\ai\pet_commands.dm" +#include "code\__DEFINES\ai\pets.dm" +#include "code\__DEFINES\ai\simplemob.dm" +#include "code\__DEFINES\ai\tourist.dm" +#include "code\__DEFINES\ai\vending.dm" +#include "code\__DEFINES\ai\ventcrawling.dm" #include "code\__DEFINES\atmospherics\atmos_core.dm" #include "code\__DEFINES\atmospherics\atmos_gasses.dm" #include "code\__DEFINES\atmospherics\atmos_helpers.dm" @@ -259,8 +276,12 @@ #include "code\__DEFINES\dcs\signals\signals_ai_controller.dm" #include "code\__DEFINES\dcs\signals\signals_area.dm" #include "code\__DEFINES\dcs\signals\signals_assembly.dm" +#include "code\__DEFINES\dcs\signals\signals_backpack.dm" #include "code\__DEFINES\dcs\signals\signals_beam.dm" +#include "code\__DEFINES\dcs\signals\signals_bitrunning.dm" +#include "code\__DEFINES\dcs\signals\signals_blob.dm" #include "code\__DEFINES\dcs\signals\signals_bot.dm" +#include "code\__DEFINES\dcs\signals\signals_camera.dm" #include "code\__DEFINES\dcs\signals\signals_changeling.dm" #include "code\__DEFINES\dcs\signals\signals_circuit.dm" #include "code\__DEFINES\dcs\signals\signals_client.dm" @@ -283,11 +304,16 @@ #include "code\__DEFINES\dcs\signals\signals_janitor.dm" #include "code\__DEFINES\dcs\signals\signals_key.dm" #include "code\__DEFINES\dcs\signals\signals_ladder.dm" +#include "code\__DEFINES\dcs\signals\signals_lazy_templates.dm" +#include "code\__DEFINES\dcs\signals\signals_leash.dm" #include "code\__DEFINES\dcs\signals\signals_lift.dm" #include "code\__DEFINES\dcs\signals\signals_light_eater.dm" +#include "code\__DEFINES\dcs\signals\signals_material_container.dm" #include "code\__DEFINES\dcs\signals\signals_medical.dm" #include "code\__DEFINES\dcs\signals\signals_mind.dm" +#include "code\__DEFINES\dcs\signals\signals_mining.dm" #include "code\__DEFINES\dcs\signals\signals_mod.dm" +#include "code\__DEFINES\dcs\signals\signals_modular_computer.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" @@ -298,10 +324,11 @@ #include "code\__DEFINES\dcs\signals\signals_radiation.dm" #include "code\__DEFINES\dcs\signals\signals_reagent.dm" #include "code\__DEFINES\dcs\signals\signals_restaurant.dm" +#include "code\__DEFINES\dcs\signals\signals_saboteur.dm" #include "code\__DEFINES\dcs\signals\signals_scangate.dm" #include "code\__DEFINES\dcs\signals\signals_screentips.dm" #include "code\__DEFINES\dcs\signals\signals_spatial_grid.dm" -#include "code\__DEFINES\dcs\signals\signals_specie.dm" +#include "code\__DEFINES\dcs\signals\signals_species.dm" #include "code\__DEFINES\dcs\signals\signals_spell.dm" #include "code\__DEFINES\dcs\signals\signals_storage.dm" #include "code\__DEFINES\dcs\signals\signals_subsystem.dm" @@ -325,7 +352,9 @@ #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_movable.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_movement.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_x_act.dm" +#include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_ai.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_arcade.dm" +#include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_basic.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_carbon.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_living.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_main.dm" @@ -334,6 +363,7 @@ #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_spawner.dm" #include "code\__DEFINES\research\anomalies.dm" #include "code\__DEFINES\research\research_categories.dm" +#include "code\__DEFINES\research\slimes.dm" #include "code\__HELPERS\_auxtools_api.dm" #include "code\__HELPERS\_lists.dm" #include "code\__HELPERS\_planes.dm" @@ -346,7 +376,7 @@ #include "code\__HELPERS\atoms.dm" #include "code\__HELPERS\auxtools.dm" #include "code\__HELPERS\bitflag_lists.dm" -#include "code\__HELPERS\bodyparts.dm" +#include "code\__HELPERS\cameras.dm" #include "code\__HELPERS\chat.dm" #include "code\__HELPERS\chat_filter.dm" #include "code\__HELPERS\clients.dm" @@ -407,7 +437,9 @@ #include "code\__HELPERS\stat_tracking.dm" #include "code\__HELPERS\stoplag.dm" #include "code\__HELPERS\string_assoc_lists.dm" +#include "code\__HELPERS\string_assoc_nested_lists.dm" #include "code\__HELPERS\string_lists.dm" +#include "code\__HELPERS\string_numbers_lists.dm" #include "code\__HELPERS\text.dm" #include "code\__HELPERS\time.dm" #include "code\__HELPERS\traits.dm" @@ -451,6 +483,7 @@ #include "code\_globalvars\configuration.dm" #include "code\_globalvars\game_modes.dm" #include "code\_globalvars\genetics.dm" +#include "code\_globalvars\lighting.dm" #include "code\_globalvars\logging.dm" #include "code\_globalvars\phobias.dm" #include "code\_globalvars\religion.dm" @@ -462,6 +495,7 @@ #include "code\_globalvars\lists\client.dm" #include "code\_globalvars\lists\color.dm" #include "code\_globalvars\lists\flavor_misc.dm" +#include "code\_globalvars\lists\icons.dm" #include "code\_globalvars\lists\keybindings.dm" #include "code\_globalvars\lists\maintenance_loot.dm" #include "code\_globalvars\lists\mapping.dm" @@ -507,7 +541,6 @@ #include "code\_onclick\hud\movable_screen_objects.dm" #include "code\_onclick\hud\new_player.dm" #include "code\_onclick\hud\ooze.dm" -#include "code\_onclick\hud\parallax.dm" #include "code\_onclick\hud\picture_in_picture.dm" #include "code\_onclick\hud\radial.dm" #include "code\_onclick\hud\radial_persistent.dm" @@ -516,6 +549,8 @@ #include "code\_onclick\hud\screen_object_holder.dm" #include "code\_onclick\hud\screen_objects.dm" #include "code\_onclick\hud\screentip.dm" +#include "code\_onclick\hud\parallax\parallax.dm" +#include "code\_onclick\hud\parallax\random_layer.dm" #include "code\_onclick\hud\rendering\plane_master.dm" #include "code\_onclick\hud\rendering\plane_master_controller.dm" #include "code\_onclick\hud\rendering\plane_master_group.dm" @@ -533,6 +568,7 @@ #include "code\controllers\configuration\entries\game_options.dm" #include "code\controllers\configuration\entries\general.dm" #include "code\controllers\configuration\entries\interview.dm" +#include "code\controllers\configuration\entries\jobs.dm" #include "code\controllers\configuration\entries\lua.dm" #include "code\controllers\configuration\entries\resources.dm" #include "code\controllers\subsystem\achievements.dm" @@ -595,6 +631,7 @@ #include "code\controllers\subsystem\profiler.dm" #include "code\controllers\subsystem\radiation.dm" #include "code\controllers\subsystem\radio.dm" +#include "code\controllers\subsystem\radioactive_nebula.dm" #include "code\controllers\subsystem\research.dm" #include "code\controllers\subsystem\restaurant.dm" #include "code\controllers\subsystem\runechat.dm" @@ -608,6 +645,7 @@ #include "code\controllers\subsystem\speech_controller.dm" #include "code\controllers\subsystem\statpanel.dm" #include "code\controllers\subsystem\stickyban.dm" +#include "code\controllers\subsystem\stock_market.dm" #include "code\controllers\subsystem\sun.dm" #include "code\controllers\subsystem\tcgsetup.dm" #include "code\controllers\subsystem\tgui.dm" @@ -626,6 +664,7 @@ #include "code\controllers\subsystem\weather.dm" #include "code\controllers\subsystem\wiremod_composite.dm" #include "code\controllers\subsystem\movement\ai_movement.dm" +#include "code\controllers\subsystem\movement\cliff_falling.dm" #include "code\controllers\subsystem\movement\hyperspace_drift.dm" #include "code\controllers\subsystem\movement\move_handler.dm" #include "code\controllers\subsystem\movement\movement.dm" @@ -638,8 +677,10 @@ #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\digital_clock.dm" #include "code\controllers\subsystem\processing\fastprocess.dm" #include "code\controllers\subsystem\processing\fire_burning.dm" +#include "code\controllers\subsystem\processing\fishing.dm" #include "code\controllers\subsystem\processing\greyscale.dm" #include "code\controllers\subsystem\processing\instruments.dm" #include "code\controllers\subsystem\processing\obj.dm" @@ -689,9 +730,9 @@ #include "code\datums\request_message.dm" #include "code\datums\ruins.dm" #include "code\datums\saymode.dm" -#include "code\datums\shuttles.dm" #include "code\datums\signals.dm" #include "code\datums\spawners_menu.dm" +#include "code\datums\sprite_accessories.dm" #include "code\datums\station_alert.dm" #include "code\datums\station_integrity.dm" #include "code\datums\tgs_event_handler.dm" @@ -727,21 +768,23 @@ #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\unzip.dm" #include "code\datums\actions\items\vortex_recall.dm" #include "code\datums\actions\mobs\adjust_vision.dm" +#include "code\datums\actions\mobs\assume_form.dm" #include "code\datums\actions\mobs\blood_warp.dm" #include "code\datums\actions\mobs\charge.dm" #include "code\datums\actions\mobs\charge_apc.dm" +#include "code\datums\actions\mobs\conjure_foamwall.dm" #include "code\datums\actions\mobs\dash.dm" +#include "code\datums\actions\mobs\defensive_mode.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\open_mob_commands.dm" #include "code\datums\actions\mobs\projectileattack.dm" #include "code\datums\actions\mobs\sign_language.dm" -#include "code\datums\actions\mobs\small_sprite.dm" #include "code\datums\actions\mobs\sneak.dm" #include "code\datums\actions\mobs\transform_weapon.dm" #include "code\datums\actions\mobs\sequences\dash_attack.dm" @@ -757,7 +800,11 @@ #include "code\datums\ai\bane\bane_controller.dm" #include "code\datums\ai\bane\bane_subtrees.dm" #include "code\datums\ai\basic_mobs\base_basic_controller.dm" +#include "code\datums\ai\basic_mobs\generic_controllers.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\basic_attacking.dm" +#include "code\datums\ai\basic_mobs\basic_ai_behaviors\climb_tree.dm" +#include "code\datums\ai\basic_mobs\basic_ai_behaviors\find_mineable_wall.dm" +#include "code\datums\ai\basic_mobs\basic_ai_behaviors\find_parent.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\nearest_targetting.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\pick_up_item.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\run_away_from_target.dm" @@ -768,10 +815,19 @@ #include "code\datums\ai\basic_mobs\basic_ai_behaviors\tipped_reaction.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\travel_towards.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\ventcrawling.dm" +#include "code\datums\ai\basic_mobs\basic_ai_behaviors\write_on_paper.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\attack_adjacent_target.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\attack_obstacle_in_path.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\climb_tree.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\find_food.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\find_paper_and_write.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\find_parent.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\flee_target.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\maintain_distance.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\move_to_cardinal.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\opportunistic_ventcrawler.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\ranged_skirmish.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\shapechange_ambush.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\simple_attack_target.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\simple_find_nearest_target_to_flee.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\simple_find_target.dm" @@ -781,6 +837,7 @@ #include "code\datums\ai\basic_mobs\basic_subtrees\target_retaliate.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\targeted_mob_ability.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\tipped_subtree.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\travel_to_point.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\use_mob_ability.dm" #include "code\datums\ai\basic_mobs\pet_commands\fetch.dm" #include "code\datums\ai\basic_mobs\pet_commands\pet_command_planning.dm" @@ -789,6 +846,7 @@ #include "code\datums\ai\basic_mobs\pet_commands\play_dead.dm" #include "code\datums\ai\basic_mobs\targetting_datums\basic_targetting_datum.dm" #include "code\datums\ai\basic_mobs\targetting_datums\dont_target_friends.dm" +#include "code\datums\ai\basic_mobs\targetting_datums\with_object.dm" #include "code\datums\ai\cursed\cursed_behaviors.dm" #include "code\datums\ai\cursed\cursed_controller.dm" #include "code\datums\ai\cursed\cursed_subtrees.dm" @@ -802,6 +860,7 @@ #include "code\datums\ai\hauntium\hauntium_subtrees.dm" #include "code\datums\ai\hunting_behavior\hunting_behaviors.dm" #include "code\datums\ai\hunting_behavior\hunting_cockroach.dm" +#include "code\datums\ai\hunting_behavior\hunting_corpses.dm" #include "code\datums\ai\hunting_behavior\hunting_lights.dm" #include "code\datums\ai\hunting_behavior\hunting_mouse.dm" #include "code\datums\ai\idle_behaviors\_idle_behavior.dm" @@ -860,9 +919,14 @@ #include "code\datums\components\acid.dm" #include "code\datums\components\action_item_overlay.dm" #include "code\datums\components\admin_popup.dm" +#include "code\datums\components\aggro_emote.dm" +#include "code\datums\components\ai_has_target_timer.dm" +#include "code\datums\components\ai_listen_to_weather.dm" #include "code\datums\components\ai_retaliate_advanced.dm" #include "code\datums\components\anti_magic.dm" -#include "code\datums\components\aquarium.dm" +#include "code\datums\components\appearance_on_aggro.dm" +#include "code\datums\components\aquarium_content.dm" +#include "code\datums\components\area_based_godmode.dm" #include "code\datums\components\area_sound_manager.dm" #include "code\datums\components\areabound.dm" #include "code\datums\components\armor_plate.dm" @@ -870,10 +934,15 @@ #include "code\datums\components\attached_sticker.dm" #include "code\datums\components\aura_healing.dm" #include "code\datums\components\bakeable.dm" +#include "code\datums\components\basic_mob_attack_telegraph.dm" +#include "code\datums\components\basic_ranged_ready_overlay.dm" #include "code\datums\components\beetlejuice.dm" +#include "code\datums\components\blob_minion.dm" #include "code\datums\components\blood_walk.dm" #include "code\datums\components\bloodysoles.dm" #include "code\datums\components\boomerang.dm" +#include "code\datums\components\boss_music.dm" +#include "code\datums\components\bullet_intercepting.dm" #include "code\datums\components\bumpattack.dm" #include "code\datums\components\burning.dm" #include "code\datums\components\butchering.dm" @@ -893,13 +962,16 @@ #include "code\datums\components\construction.dm" #include "code\datums\components\conveyor_movement.dm" #include "code\datums\components\cracked.dm" +#include "code\datums\components\crank_recharge.dm" #include "code\datums\components\crate_carrier.dm" #include "code\datums\components\creamed.dm" #include "code\datums\components\cult_ritual_item.dm" #include "code\datums\components\curse_of_hunger.dm" +#include "code\datums\components\curse_of_polymorph.dm" #include "code\datums\components\customizable_reagent_holder.dm" #include "code\datums\components\damage_aura.dm" #include "code\datums\components\deadchat_control.dm" +#include "code\datums\components\death_linked.dm" #include "code\datums\components\dejavu.dm" #include "code\datums\components\deployable.dm" #include "code\datums\components\drift.dm" @@ -916,13 +988,14 @@ #include "code\datums\components\faction_granter.dm" #include "code\datums\components\fertile_egg.dm" #include "code\datums\components\fishing_spot.dm" +#include "code\datums\components\focused_attacker.dm" #include "code\datums\components\food_storage.dm" #include "code\datums\components\force_move.dm" #include "code\datums\components\fov_handler.dm" #include "code\datums\components\fullauto.dm" -#include "code\datums\components\gags_recolorable.dm" #include "code\datums\components\gas_leaker.dm" #include "code\datums\components\geiger_sound.dm" +#include "code\datums\components\ghost_direct_control.dm" #include "code\datums\components\gps.dm" #include "code\datums\components\grillable.dm" #include "code\datums\components\ground_sinking.dm" @@ -945,14 +1018,17 @@ #include "code\datums\components\keep_me_secure.dm" #include "code\datums\components\knockoff.dm" #include "code\datums\components\label.dm" +#include "code\datums\components\leash.dm" #include "code\datums\components\light_eater.dm" +#include "code\datums\components\ling_decoy_brain.dm" #include "code\datums\components\lock_on_cursor.dm" +#include "code\datums\components\magnet.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\manual_heart.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\mob_chain.dm" #include "code\datums\components\mob_harvest.dm" #include "code\datums\components\multiple_lives.dm" #include "code\datums\components\mutant_hands.dm" @@ -974,20 +1050,25 @@ #include "code\datums\components\puzzgrid.dm" #include "code\datums\components\radiation_countdown.dm" #include "code\datums\components\radioactive_emitter.dm" +#include "code\datums\components\radioactive_exposure.dm" +#include "code\datums\components\ranged_attacks.dm" #include "code\datums\components\reagent_refiller.dm" #include "code\datums\components\redirect_attack_hand_from_turf.dm" +#include "code\datums\components\reflection.dm" #include "code\datums\components\regenerator.dm" #include "code\datums\components\religious_tool.dm" -#include "code\datums\components\remote_materials.dm" #include "code\datums\components\rename.dm" +#include "code\datums\components\revenge_ability.dm" #include "code\datums\components\rot.dm" #include "code\datums\components\rotation.dm" #include "code\datums\components\scope.dm" #include "code\datums\components\seclight_attachable.dm" #include "code\datums\components\sect_nullrod_bonus.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\shovel_hands.dm" #include "code\datums\components\shrink.dm" #include "code\datums\components\shuttle_cling.dm" #include "code\datums\components\shy.dm" @@ -1012,6 +1093,7 @@ #include "code\datums\components\squeak.dm" #include "code\datums\components\stationloving.dm" #include "code\datums\components\stationstuck.dm" +#include "code\datums\components\storm_hating.dm" #include "code\datums\components\strong_pull.dm" #include "code\datums\components\subtype_picker.dm" #include "code\datums\components\summoning.dm" @@ -1026,21 +1108,27 @@ #include "code\datums\components\tattoo.dm" #include "code\datums\components\technointrovert.dm" #include "code\datums\components\technoshy.dm" +#include "code\datums\components\telegraph_ability.dm" #include "code\datums\components\temporary_body.dm" #include "code\datums\components\tether.dm" #include "code\datums\components\thermite.dm" #include "code\datums\components\tippable.dm" +#include "code\datums\components\toggle_attached_clothing.dm" #include "code\datums\components\toggle_suit.dm" #include "code\datums\components\transforming.dm" #include "code\datums\components\trapdoor.dm" +#include "code\datums\components\tree_climber.dm" #include "code\datums\components\twohanded.dm" #include "code\datums\components\udder.dm" #include "code\datums\components\unbreakable.dm" #include "code\datums\components\unobserved_actor.dm" +#include "code\datums\components\unusual_effect.dm" #include "code\datums\components\uplink.dm" #include "code\datums\components\usb_port.dm" #include "code\datums\components\vacuum.dm" +#include "code\datums\components\wall_mounted.dm" #include "code\datums\components\wearertargeting.dm" +#include "code\datums\components\weatherannouncer.dm" #include "code\datums\components\wet_floor.dm" #include "code\datums\components\container_item\container_item.dm" #include "code\datums\components\container_item\tank_holder.dm" @@ -1058,6 +1146,7 @@ #include "code\datums\components\crafting\misc.dm" #include "code\datums\components\crafting\ranged_weapon.dm" #include "code\datums\components\crafting\robot.dm" +#include "code\datums\components\crafting\slapcrafting.dm" #include "code\datums\components\crafting\structures.dm" #include "code\datums\components\crafting\tailoring.dm" #include "code\datums\components\crafting\tiles.dm" @@ -1069,8 +1158,12 @@ #include "code\datums\components\fantasy\suffixes.dm" #include "code\datums\components\food\decomposition.dm" #include "code\datums\components\food\edible.dm" +#include "code\datums\components\food\germ_sensitive.dm" +#include "code\datums\components\food\ghost_edible.dm" #include "code\datums\components\food\golem_food.dm" #include "code\datums\components\food\ice_cream_holder.dm" +#include "code\datums\components\material\material_container.dm" +#include "code\datums\components\material\remote_materials.dm" #include "code\datums\components\pet_commands\fetch.dm" #include "code\datums\components\pet_commands\obeys_commands.dm" #include "code\datums\components\pet_commands\pet_command.dm" @@ -1115,6 +1208,9 @@ #include "code\datums\diseases\wizarditis.dm" #include "code\datums\diseases\advance\advance.dm" #include "code\datums\diseases\advance\presets.dm" +#include "code\datums\diseases\advance\floor_diseases\carpellosis.dm" +#include "code\datums\diseases\advance\floor_diseases\gastritium.dm" +#include "code\datums\diseases\advance\floor_diseases\nebula_nausea.dm" #include "code\datums\diseases\advance\symptoms\beard.dm" #include "code\datums\diseases\advance\symptoms\chills.dm" #include "code\datums\diseases\advance\symptoms\choking.dm" @@ -1151,6 +1247,7 @@ #include "code\datums\elements\ai_held_item.dm" #include "code\datums\elements\ai_retaliate.dm" #include "code\datums\elements\ai_target_damagesource.dm" +#include "code\datums\elements\amputating_limbs.dm" #include "code\datums\elements\animal_variety.dm" #include "code\datums\elements\art.dm" #include "code\datums\elements\atmos_requirements.dm" @@ -1164,12 +1261,17 @@ #include "code\datums\elements\bed_tucking.dm" #include "code\datums\elements\befriend_petting.dm" #include "code\datums\elements\blocks_explosives.dm" +#include "code\datums\elements\bombable_turf.dm" +#include "code\datums\elements\bonus_damage.dm" #include "code\datums\elements\bsa_blocker.dm" +#include "code\datums\elements\bugkiller_reagent.dm" #include "code\datums\elements\bump_click.dm" #include "code\datums\elements\can_barricade.dm" +#include "code\datums\elements\caseless.dm" #include "code\datums\elements\chemical_transfer.dm" #include "code\datums\elements\chewable.dm" #include "code\datums\elements\cleaning.dm" +#include "code\datums\elements\cliff_walker.dm" #include "code\datums\elements\climbable.dm" #include "code\datums\elements\connect_loc.dm" #include "code\datums\elements\content_barfer.dm" @@ -1180,10 +1282,10 @@ #include "code\datums\elements\cult_halo.dm" #include "code\datums\elements\curse_announcement.dm" #include "code\datums\elements\cursed.dm" +#include "code\datums\elements\dangerous_surgical_removal.dm" #include "code\datums\elements\death_drops.dm" #include "code\datums\elements\death_explosion.dm" #include "code\datums\elements\death_gases.dm" -#include "code\datums\elements\death_linked.dm" #include "code\datums\elements\delete_on_drop.dm" #include "code\datums\elements\deliver_first.dm" #include "code\datums\elements\diggable.dm" @@ -1201,11 +1303,15 @@ #include "code\datums\elements\firestacker.dm" #include "code\datums\elements\floorloving.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\gags_recolorable.dm" +#include "code\datums\elements\give_turf_traits.dm" #include "code\datums\elements\haunted.dm" #include "code\datums\elements\high_fiver.dm" #include "code\datums\elements\honkspam.dm" +#include "code\datums\elements\immerse.dm" #include "code\datums\elements\item_fov.dm" #include "code\datums\elements\item_scaling.dm" #include "code\datums\elements\kneecapping.dm" @@ -1217,10 +1323,13 @@ #include "code\datums\elements\light_eaten.dm" #include "code\datums\elements\light_eater.dm" #include "code\datums\elements\loomable.dm" +#include "code\datums\elements\mirage_border.dm" +#include "code\datums\elements\mob_grabber.dm" #include "code\datums\elements\mob_killed_tally.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\noisy_movement.dm" #include "code\datums\elements\noticable_organ.dm" #include "code\datums\elements\obj_regen.dm" #include "code\datums\elements\openspace_item_click_handler.dm" @@ -1229,17 +1338,20 @@ #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_drop.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" +#include "code\datums\elements\ranged_armour.dm" #include "code\datums\elements\relay_attackers.dm" #include "code\datums\elements\ridable.dm" #include "code\datums\elements\rust.dm" #include "code\datums\elements\selfknockback.dm" #include "code\datums\elements\series.dm" #include "code\datums\elements\shatters_when_thrown.dm" +#include "code\datums\elements\sideway_movement.dm" #include "code\datums\elements\simple_flying.dm" +#include "code\datums\elements\skill_reward.dm" #include "code\datums\elements\skittish.dm" #include "code\datums\elements\snail_crawl.dm" #include "code\datums\elements\soft_landing.dm" @@ -1248,16 +1360,17 @@ #include "code\datums\elements\sticker.dm" #include "code\datums\elements\strippable.dm" #include "code\datums\elements\swabbable.dm" +#include "code\datums\elements\tear_wall.dm" #include "code\datums\elements\temporary_atom.dm" #include "code\datums\elements\tenacious.dm" #include "code\datums\elements\tiny_mob_hunter.dm" #include "code\datums\elements\tool_flash.dm" -#include "code\datums\elements\trait_loc.dm" #include "code\datums\elements\turf_transparency.dm" #include "code\datums\elements\undertile.dm" #include "code\datums\elements\unfriend_attacker.dm" #include "code\datums\elements\update_icon_blocker.dm" #include "code\datums\elements\update_icon_updates_onmob.dm" +#include "code\datums\elements\uplink_reimburse.dm" #include "code\datums\elements\venomous.dm" #include "code\datums\elements\volatile_gas_storage.dm" #include "code\datums\elements\waddling.dm" @@ -1266,6 +1379,7 @@ #include "code\datums\elements\weapon_description.dm" #include "code\datums\elements\weather_listener.dm" #include "code\datums\elements\web_walker.dm" +#include "code\datums\elements\wheel.dm" #include "code\datums\elements\decals\_decal.dm" #include "code\datums\elements\decals\blood.dm" #include "code\datums\elements\food\dunkable.dm" @@ -1278,14 +1392,19 @@ #include "code\datums\elements\food\venue_price.dm" #include "code\datums\elements\screentips\contextual_screentip_bare_hands.dm" #include "code\datums\elements\screentips\contextual_screentip_item_typechecks.dm" +#include "code\datums\elements\screentips\contextual_screentip_mob_typechecks.dm" #include "code\datums\elements\screentips\contextual_screentip_sharpness.dm" #include "code\datums\elements\screentips\contextual_screentip_tools.dm" #include "code\datums\greyscale\_greyscale_config.dm" #include "code\datums\greyscale\json_reader.dm" #include "code\datums\greyscale\layer.dm" -#include "code\datums\greyscale\config_types\greyscale_configs.dm" #include "code\datums\greyscale\config_types\material_effects.dm" #include "code\datums\greyscale\config_types\mutant_organ_config.dm" +#include "code\datums\greyscale\config_types\greyscale_configs\greyscale_clothes.dm" +#include "code\datums\greyscale\config_types\greyscale_configs\greyscale_effects.dm" +#include "code\datums\greyscale\config_types\greyscale_configs\greyscale_items.dm" +#include "code\datums\greyscale\config_types\greyscale_configs\greyscale_mobs.dm" +#include "code\datums\greyscale\config_types\greyscale_configs\greyscale_objects.dm" #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\getrev.dm" #include "code\datums\helper_datums\icon_snapshot.dm" @@ -1298,6 +1417,12 @@ #include "code\datums\id_trim\outfits.dm" #include "code\datums\id_trim\ruins.dm" #include "code\datums\id_trim\syndicate.dm" +#include "code\datums\job_configs\_job_configs.dm" +#include "code\datums\job_configs\default_positions.dm" +#include "code\datums\job_configs\playtime_requirements.dm" +#include "code\datums\job_configs\required_account_age.dm" +#include "code\datums\job_configs\required_character_age.dm" +#include "code\datums\job_configs\starting_positions.dm" #include "code\datums\keybinding\_defines.dm" #include "code\datums\keybinding\_keybindings.dm" #include "code\datums\keybinding\admin.dm" @@ -1357,8 +1482,10 @@ #include "code\datums\mood_events\dna_infuser_events.dm" #include "code\datums\mood_events\drink_events.dm" #include "code\datums\mood_events\drug_events.dm" +#include "code\datums\mood_events\food_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\morbid_events.dm" #include "code\datums\mood_events\needs_events.dm" #include "code\datums\mutations\_combined.dm" #include "code\datums\mutations\_mutations.dm" @@ -1387,9 +1514,89 @@ #include "code\datums\proximity_monitor\fields\projectile_dampener.dm" #include "code\datums\proximity_monitor\fields\timestop.dm" #include "code\datums\quirks\_quirk.dm" -#include "code\datums\quirks\negative_quirks.dm" -#include "code\datums\quirks\neutral_quirks.dm" -#include "code\datums\quirks\positive_quirks.dm" +#include "code\datums\quirks\negative_quirks\allergic.dm" +#include "code\datums\quirks\negative_quirks\bad_back.dm" +#include "code\datums\quirks\negative_quirks\bad_touch.dm" +#include "code\datums\quirks\negative_quirks\big_hands.dm" +#include "code\datums\quirks\negative_quirks\blindness.dm" +#include "code\datums\quirks\negative_quirks\blood_deficiency.dm" +#include "code\datums\quirks\negative_quirks\body_purist.dm" +#include "code\datums\quirks\negative_quirks\brain_problems.dm" +#include "code\datums\quirks\negative_quirks\chronic_illness.dm" +#include "code\datums\quirks\negative_quirks\claustrophobia.dm" +#include "code\datums\quirks\negative_quirks\clumsy.dm" +#include "code\datums\quirks\negative_quirks\cursed.dm" +#include "code\datums\quirks\negative_quirks\deafness.dm" +#include "code\datums\quirks\negative_quirks\depression.dm" +#include "code\datums\quirks\negative_quirks\family_heirloom.dm" +#include "code\datums\quirks\negative_quirks\frail.dm" +#include "code\datums\quirks\negative_quirks\glass_jaw.dm" +#include "code\datums\quirks\negative_quirks\heavy_sleeper.dm" +#include "code\datums\quirks\negative_quirks\hemiplegic.dm" +#include "code\datums\quirks\negative_quirks\hypersensitive.dm" +#include "code\datums\quirks\negative_quirks\illiterate.dm" +#include "code\datums\quirks\negative_quirks\indebted.dm" +#include "code\datums\quirks\negative_quirks\insanity.dm" +#include "code\datums\quirks\negative_quirks\junkie.dm" +#include "code\datums\quirks\negative_quirks\light_drinker.dm" +#include "code\datums\quirks\negative_quirks\mute.dm" +#include "code\datums\quirks\negative_quirks\nearsighted.dm" +#include "code\datums\quirks\negative_quirks\non_violent.dm" +#include "code\datums\quirks\negative_quirks\numb.dm" +#include "code\datums\quirks\negative_quirks\nyctophobia.dm" +#include "code\datums\quirks\negative_quirks\paraplegic.dm" +#include "code\datums\quirks\negative_quirks\photophobia.dm" +#include "code\datums\quirks\negative_quirks\poor_aim.dm" +#include "code\datums\quirks\negative_quirks\prosopagnosia.dm" +#include "code\datums\quirks\negative_quirks\prosthetic_limb.dm" +#include "code\datums\quirks\negative_quirks\prosthetic_organ.dm" +#include "code\datums\quirks\negative_quirks\pushover.dm" +#include "code\datums\quirks\negative_quirks\quadruple_amputee.dm" +#include "code\datums\quirks\negative_quirks\social_anxiety.dm" +#include "code\datums\quirks\negative_quirks\softspoken.dm" +#include "code\datums\quirks\negative_quirks\tin_man.dm" +#include "code\datums\quirks\negative_quirks\unstable.dm" +#include "code\datums\quirks\neutral_quirks\bald.dm" +#include "code\datums\quirks\neutral_quirks\colorist.dm" +#include "code\datums\quirks\neutral_quirks\deviant_tastes.dm" +#include "code\datums\quirks\neutral_quirks\extrovert.dm" +#include "code\datums\quirks\neutral_quirks\foreigner.dm" +#include "code\datums\quirks\neutral_quirks\gamer.dm" +#include "code\datums\quirks\neutral_quirks\heretochromatic.dm" +#include "code\datums\quirks\neutral_quirks\introvert.dm" +#include "code\datums\quirks\neutral_quirks\monochromatic.dm" +#include "code\datums\quirks\neutral_quirks\no_taste.dm" +#include "code\datums\quirks\neutral_quirks\phobia.dm" +#include "code\datums\quirks\neutral_quirks\photographer.dm" +#include "code\datums\quirks\neutral_quirks\pineapple_hater.dm" +#include "code\datums\quirks\neutral_quirks\pineapple_liker.dm" +#include "code\datums\quirks\neutral_quirks\pride_pin.dm" +#include "code\datums\quirks\neutral_quirks\shifty_eyes.dm" +#include "code\datums\quirks\neutral_quirks\snob.dm" +#include "code\datums\quirks\neutral_quirks\vegetarian.dm" +#include "code\datums\quirks\positive_quirks\alcohol_tolerance.dm" +#include "code\datums\quirks\positive_quirks\apathetic.dm" +#include "code\datums\quirks\positive_quirks\bilingual.dm" +#include "code\datums\quirks\positive_quirks\clown_enjoyer.dm" +#include "code\datums\quirks\positive_quirks\drunk_healing.dm" +#include "code\datums\quirks\positive_quirks\empath.dm" +#include "code\datums\quirks\positive_quirks\freerunning.dm" +#include "code\datums\quirks\positive_quirks\friendly.dm" +#include "code\datums\quirks\positive_quirks\jolly.dm" +#include "code\datums\quirks\positive_quirks\light_step.dm" +#include "code\datums\quirks\positive_quirks\mime_fan.dm" +#include "code\datums\quirks\positive_quirks\musician.dm" +#include "code\datums\quirks\positive_quirks\night_vision.dm" +#include "code\datums\quirks\positive_quirks\poster_boy.dm" +#include "code\datums\quirks\positive_quirks\self_aware.dm" +#include "code\datums\quirks\positive_quirks\settler.dm" +#include "code\datums\quirks\positive_quirks\signer.dm" +#include "code\datums\quirks\positive_quirks\skittish.dm" +#include "code\datums\quirks\positive_quirks\spacer.dm" +#include "code\datums\quirks\positive_quirks\spiritual.dm" +#include "code\datums\quirks\positive_quirks\tagger.dm" +#include "code\datums\quirks\positive_quirks\throwing_arm.dm" +#include "code\datums\quirks\positive_quirks\voracious.dm" #include "code\datums\records\crime.dm" #include "code\datums\records\data.dm" #include "code\datums\records\manifest.dm" @@ -1400,8 +1607,27 @@ #include "code\datums\ruins\space.dm" #include "code\datums\screentips\atom_context.dm" #include "code\datums\screentips\item_context.dm" +#include "code\datums\screentips\screentips.dm" +#include "code\datums\shuttles\_shuttle.dm" +#include "code\datums\shuttles\arrival.dm" +#include "code\datums\shuttles\assault_pod.dm" +#include "code\datums\shuttles\aux_base.dm" +#include "code\datums\shuttles\cargo.dm" +#include "code\datums\shuttles\emergency.dm" +#include "code\datums\shuttles\ert.dm" +#include "code\datums\shuttles\escape_pod.dm" +#include "code\datums\shuttles\ferry.dm" +#include "code\datums\shuttles\hunter.dm" +#include "code\datums\shuttles\infiltrator.dm" +#include "code\datums\shuttles\mining.dm" +#include "code\datums\shuttles\pirate.dm" +#include "code\datums\shuttles\ruin.dm" +#include "code\datums\shuttles\snowdin.dm" +#include "code\datums\shuttles\starfury.dm" +#include "code\datums\shuttles\whiteship.dm" #include "code\datums\skills\_skill.dm" #include "code\datums\skills\cleaning.dm" +#include "code\datums\skills\fishing.dm" #include "code\datums\skills\gaming.dm" #include "code\datums\skills\mining.dm" #include "code\datums\station_traits\_station_trait.dm" @@ -1414,6 +1640,7 @@ #include "code\datums\status_effects\agent_pinpointer.dm" #include "code\datums\status_effects\buffs.dm" #include "code\datums\status_effects\drug_effects.dm" +#include "code\datums\status_effects\food_effects.dm" #include "code\datums\status_effects\gas.dm" #include "code\datums\status_effects\grouped_effect.dm" #include "code\datums\status_effects\limited_effect.dm" @@ -1421,11 +1648,18 @@ #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\buffs\food_haste.dm" +#include "code\datums\status_effects\buffs\food_traits.dm" +#include "code\datums\status_effects\buffs\stun_absorption.dm" #include "code\datums\status_effects\debuffs\blindness.dm" #include "code\datums\status_effects\debuffs\choke.dm" #include "code\datums\status_effects\debuffs\confusion.dm" +#include "code\datums\status_effects\debuffs\cursed.dm" +#include "code\datums\status_effects\debuffs\cyborg.dm" #include "code\datums\status_effects\debuffs\debuffs.dm" +#include "code\datums\status_effects\debuffs\decloning.dm" #include "code\datums\status_effects\debuffs\dizziness.dm" +#include "code\datums\status_effects\debuffs\dna_transformation.dm" #include "code\datums\status_effects\debuffs\drowsiness.dm" #include "code\datums\status_effects\debuffs\drugginess.dm" #include "code\datums\status_effects\debuffs\drunk.dm" @@ -1437,18 +1671,25 @@ #include "code\datums\status_effects\debuffs\screen_blur.dm" #include "code\datums\status_effects\debuffs\screwy_hud.dm" #include "code\datums\status_effects\debuffs\silenced.dm" +#include "code\datums\status_effects\debuffs\slimed.dm" +#include "code\datums\status_effects\debuffs\spacer.dm" #include "code\datums\status_effects\debuffs\speech_debuffs.dm" +#include "code\datums\status_effects\debuffs\static_vision.dm" #include "code\datums\status_effects\debuffs\strandling.dm" #include "code\datums\status_effects\debuffs\terrified.dm" #include "code\datums\status_effects\debuffs\tower_of_babel.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\cards.dm" +#include "code\datums\storage\subtypes\duffel_bag.dm" #include "code\datums\storage\subtypes\extract_inventory.dm" +#include "code\datums\storage\subtypes\fish_case.dm" #include "code\datums\storage\subtypes\implant.dm" #include "code\datums\storage\subtypes\organ_box.dm" #include "code\datums\storage\subtypes\pockets.dm" #include "code\datums\storage\subtypes\rped.dm" +#include "code\datums\storage\subtypes\surgery_tray.dm" #include "code\datums\storage\subtypes\trash.dm" #include "code\datums\votes\_vote_datum.dm" #include "code\datums\votes\custom_vote.dm" @@ -1471,6 +1712,8 @@ #include "code\datums\wires\emitter.dm" #include "code\datums\wires\explosive.dm" #include "code\datums\wires\fax.dm" +#include "code\datums\wires\mass_driver.dm" +#include "code\datums\wires\mecha.dm" #include "code\datums\wires\microwave.dm" #include "code\datums\wires\mod.dm" #include "code\datums\wires\mulebot.dm" @@ -1483,7 +1726,9 @@ #include "code\datums\wires\syndicatebomb.dm" #include "code\datums\wires\tesla_coil.dm" #include "code\datums\wires\vending.dm" +#include "code\datums\wounds\_wound_static_data.dm" #include "code\datums\wounds\_wounds.dm" +#include "code\datums\wounds\blunt.dm" #include "code\datums\wounds\bones.dm" #include "code\datums\wounds\burns.dm" #include "code\datums\wounds\loss.dm" @@ -1493,6 +1738,7 @@ #include "code\game\alternate_appearance.dm" #include "code\game\atom_defense.dm" #include "code\game\atoms.dm" +#include "code\game\atoms_initializing_EXPENSIVE.dm" #include "code\game\atoms_movable.dm" #include "code\game\communications.dm" #include "code\game\data_huds.dm" @@ -1503,7 +1749,6 @@ #include "code\game\world.dm" #include "code\game\area\ai_monitored.dm" #include "code\game\area\areas.dm" -#include "code\game\area\space_station_13_areas.dm" #include "code\game\area\areas\ai_monitored.dm" #include "code\game\area\areas\away_content.dm" #include "code\game\area\areas\centcom.dm" @@ -1511,12 +1756,24 @@ #include "code\game\area\areas\mining.dm" #include "code\game\area\areas\misc.dm" #include "code\game\area\areas\shuttles.dm" -#include "code\game\area\areas\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\area\areas\station\cargo.dm" +#include "code\game\area\areas\station\command.dm" +#include "code\game\area\areas\station\common.dm" +#include "code\game\area\areas\station\engineering.dm" +#include "code\game\area\areas\station\hallway.dm" +#include "code\game\area\areas\station\maintenance.dm" +#include "code\game\area\areas\station\medical.dm" +#include "code\game\area\areas\station\misc.dm" +#include "code\game\area\areas\station\science.dm" +#include "code\game\area\areas\station\security.dm" +#include "code\game\area\areas\station\service.dm" +#include "code\game\area\areas\station\solars.dm" +#include "code\game\area\areas\station\telecomm.dm" #include "code\game\gamemodes\events.dm" #include "code\game\gamemodes\game_mode.dm" #include "code\game\gamemodes\objective.dm" @@ -1548,6 +1805,7 @@ #include "code\game\machinery\dance_machine.dm" #include "code\game\machinery\defibrillator_mount.dm" #include "code\game\machinery\deployable.dm" +#include "code\game\machinery\digital_clock.dm" #include "code\game\machinery\dish_drive.dm" #include "code\game\machinery\dna_scanner.dm" #include "code\game\machinery\droneDispenser.dm" @@ -1562,6 +1820,7 @@ #include "code\game\machinery\hologram.dm" #include "code\game\machinery\hypnochair.dm" #include "code\game\machinery\igniter.dm" +#include "code\game\machinery\incident_display.dm" #include "code\game\machinery\iv_drip.dm" #include "code\game\machinery\launch_pad.dm" #include "code\game\machinery\lightswitch.dm" @@ -1570,8 +1829,10 @@ #include "code\game\machinery\mechlaunchpad.dm" #include "code\game\machinery\medical_kiosk.dm" #include "code\game\machinery\medipen_refiller.dm" +#include "code\game\machinery\mining_weather_monitor.dm" #include "code\game\machinery\modular_shield.dm" #include "code\game\machinery\navbeacon.dm" +#include "code\game\machinery\nebula_shielding.dm" #include "code\game\machinery\PDApainter.dm" #include "code\game\machinery\prisongate.dm" #include "code\game\machinery\prisonlabor.dm" @@ -1601,7 +1862,7 @@ #include "code\game\machinery\camera\camera_assembly.dm" #include "code\game\machinery\camera\motion.dm" #include "code\game\machinery\camera\presets.dm" -#include "code\game\machinery\camera\tracking.dm" +#include "code\game\machinery\camera\trackable.dm" #include "code\game\machinery\computer\_computer.dm" #include "code\game\machinery\computer\accounting.dm" #include "code\game\machinery\computer\aifixer.dm" @@ -1667,9 +1928,9 @@ #include "code\game\machinery\dna_infuser\organ_sets\goliath_organs.dm" #include "code\game\machinery\dna_infuser\organ_sets\gondola_organs.dm" #include "code\game\machinery\dna_infuser\organ_sets\rat_organs.dm" +#include "code\game\machinery\dna_infuser\organ_sets\roach_organs.dm" #include "code\game\machinery\doors\airlock.dm" #include "code\game\machinery\doors\airlock_electronics.dm" -#include "code\game\machinery\doors\airlock_types.dm" #include "code\game\machinery\doors\brigdoors.dm" #include "code\game\machinery\doors\door.dm" #include "code\game\machinery\doors\firedoor.dm" @@ -1720,12 +1981,14 @@ #include "code\game\objects\effects\glowshroom.dm" #include "code\game\objects\effects\info.dm" #include "code\game\objects\effects\landmarks.dm" +#include "code\game\objects\effects\lighting.dm" #include "code\game\objects\effects\mines.dm" #include "code\game\objects\effects\misc.dm" #include "code\game\objects\effects\overlays.dm" #include "code\game\objects\effects\particle_holder.dm" #include "code\game\objects\effects\phased_mob.dm" #include "code\game\objects\effects\portals.dm" +#include "code\game\objects\effects\poster_demotivational.dm" #include "code\game\objects\effects\poster_motivational.dm" #include "code\game\objects\effects\powerup.dm" #include "code\game\objects\effects\spiderwebs.dm" @@ -1766,9 +2029,11 @@ #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\landmarks\atmospherics_sanity_landmarks.dm" +#include "code\game\objects\effects\particles\acid.dm" #include "code\game\objects\effects\particles\fire.dm" #include "code\game\objects\effects\particles\misc.dm" #include "code\game\objects\effects\particles\note_particles.dm" +#include "code\game\objects\effects\particles\slime.dm" #include "code\game\objects\effects\particles\smoke.dm" #include "code\game\objects\effects\particles\water.dm" #include "code\game\objects\effects\posters\contraband.dm" @@ -1780,6 +2045,8 @@ #include "code\game\objects\effects\spawners\structure.dm" #include "code\game\objects\effects\spawners\xeno_egg_delivery.dm" #include "code\game\objects\effects\spawners\random\ai_module.dm" +#include "code\game\objects\effects\spawners\random\animalhide.dm" +#include "code\game\objects\effects\spawners\random\armory.dm" #include "code\game\objects\effects\spawners\random\bureaucracy.dm" #include "code\game\objects\effects\spawners\random\clothing.dm" #include "code\game\objects\effects\spawners\random\contraband.dm" @@ -1788,15 +2055,18 @@ #include "code\game\objects\effects\spawners\random\entertainment.dm" #include "code\game\objects\effects\spawners\random\exotic.dm" #include "code\game\objects\effects\spawners\random\food_or_drink.dm" +#include "code\game\objects\effects\spawners\random\lavaland_mobs.dm" #include "code\game\objects\effects\spawners\random\maintenance.dm" #include "code\game\objects\effects\spawners\random\medical.dm" #include "code\game\objects\effects\spawners\random\mod.dm" #include "code\game\objects\effects\spawners\random\random.dm" +#include "code\game\objects\effects\spawners\random\russian_rifle_spawner.dm" #include "code\game\objects\effects\spawners\random\structure.dm" #include "code\game\objects\effects\spawners\random\techstorage.dm" #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\effect_trail.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" @@ -1805,6 +2075,7 @@ #include "code\game\objects\effects\temporary_visuals\projectiles\tracer.dm" #include "code\game\objects\items\airlock_painter.dm" #include "code\game\objects\items\apc_frame.dm" +#include "code\game\objects\items\bear_armor.dm" #include "code\game\objects\items\binoculars.dm" #include "code\game\objects\items\blueprints.dm" #include "code\game\objects\items\body_egg.dm" @@ -1819,6 +2090,7 @@ #include "code\game\objects\items\choice_beacon.dm" #include "code\game\objects\items\chromosome.dm" #include "code\game\objects\items\cigs_lighters.dm" +#include "code\game\objects\items\climbingrope.dm" #include "code\game\objects\items\clown_items.dm" #include "code\game\objects\items\control_wand.dm" #include "code\game\objects\items\cosmetics.dm" @@ -1835,7 +2107,7 @@ #include "code\game\objects\items\door_seal.dm" #include "code\game\objects\items\drug_items.dm" #include "code\game\objects\items\dualsaber.dm" -#include "code\game\objects\items\dyekit.dm" +#include "code\game\objects\items\dyespray.dm" #include "code\game\objects\items\eightball.dm" #include "code\game\objects\items\emags.dm" #include "code\game\objects\items\etherealdiscoball.dm" @@ -1853,7 +2125,6 @@ #include "code\game\objects\items\inducer.dm" #include "code\game\objects\items\inspector.dm" #include "code\game\objects\items\janitor_key.dm" -#include "code\game\objects\items\kirbyplants.dm" #include "code\game\objects\items\kitchen.dm" #include "code\game\objects\items\knives.dm" #include "code\game\objects\items\latexballoon.dm" @@ -1885,10 +2156,13 @@ #include "code\game\objects\items\skub.dm" #include "code\game\objects\items\spear.dm" #include "code\game\objects\items\sticker.dm" +#include "code\game\objects\items\surgery_tray.dm" +#include "code\game\objects\items\syndie_spraycan.dm" #include "code\game\objects\items\tail_pin.dm" #include "code\game\objects\items\taster.dm" #include "code\game\objects\items\teleportation.dm" #include "code\game\objects\items\theft_tools.dm" +#include "code\game\objects\items\tongs.dm" #include "code\game\objects\items\toy_mechs.dm" #include "code\game\objects\items\toys.dm" #include "code\game\objects\items\trash.dm" @@ -1910,10 +2184,10 @@ #include "code\game\objects\items\circuitboards\machines\engine_circuitboards.dm" #include "code\game\objects\items\circuitboards\machines\machine_circuitboards.dm" #include "code\game\objects\items\devices\aicard.dm" +#include "code\game\objects\items\devices\aicard_evil.dm" #include "code\game\objects\items\devices\anomaly_neutralizer.dm" #include "code\game\objects\items\devices\anomaly_releaser.dm" #include "code\game\objects\items\devices\beacon.dm" -#include "code\game\objects\items\devices\camera_bug.dm" #include "code\game\objects\items\devices\chameleonproj.dm" #include "code\game\objects\items\devices\destabilizing_crystal.dm" #include "code\game\objects\items\devices\desynchronizer.dm" @@ -1964,6 +2238,7 @@ #include "code\game\objects\items\food\egg.dm" #include "code\game\objects\items\food\frozen.dm" #include "code\game\objects\items\food\lizard.dm" +#include "code\game\objects\items\food\martian.dm" #include "code\game\objects\items\food\meatdish.dm" #include "code\game\objects\items\food\meatslab.dm" #include "code\game\objects\items\food\mexican.dm" @@ -2006,6 +2281,7 @@ #include "code\game\objects\items\granters\magic\mindswap.dm" #include "code\game\objects\items\granters\magic\sacred_flame.dm" #include "code\game\objects\items\granters\magic\smoke.dm" +#include "code\game\objects\items\granters\magic\summon_cheese.dm" #include "code\game\objects\items\granters\magic\summon_item.dm" #include "code\game\objects\items\granters\martial_arts\_martial_arts.dm" #include "code\game\objects\items\granters\martial_arts\cqc.dm" @@ -2045,6 +2321,9 @@ #include "code\game\objects\items\implants\implanter.dm" #include "code\game\objects\items\implants\implantpad.dm" #include "code\game\objects\items\implants\implantuplink.dm" +#include "code\game\objects\items\kirby_plants\kirbyplants.dm" +#include "code\game\objects\items\kirby_plants\organic_plants.dm" +#include "code\game\objects\items\kirby_plants\synthetic_plants.dm" #include "code\game\objects\items\melee\baton.dm" #include "code\game\objects\items\melee\energy.dm" #include "code\game\objects\items\melee\misc.dm" @@ -2150,6 +2429,7 @@ #include "code\game\objects\structures\dresser.dm" #include "code\game\objects\structures\electricchair.dm" #include "code\game\objects\structures\extinguisher.dm" +#include "code\game\objects\structures\fake_stairs.dm" #include "code\game\objects\structures\false_walls.dm" #include "code\game\objects\structures\fans.dm" #include "code\game\objects\structures\fence.dm" @@ -2267,6 +2547,7 @@ #include "code\game\turfs\change_turf.dm" #include "code\game\turfs\turf.dm" #include "code\game\turfs\closed\_closed.dm" +#include "code\game\turfs\closed\indestructible.dm" #include "code\game\turfs\closed\minerals.dm" #include "code\game\turfs\closed\walls.dm" #include "code\game\turfs\closed\wall\material_walls.dm" @@ -2278,6 +2559,7 @@ #include "code\game\turfs\open\asteroid.dm" #include "code\game\turfs\open\basalt.dm" #include "code\game\turfs\open\chasm.dm" +#include "code\game\turfs\open\cliff.dm" #include "code\game\turfs\open\dirtystation.dm" #include "code\game\turfs\open\floor.dm" #include "code\game\turfs\open\grass.dm" @@ -2302,6 +2584,7 @@ #include "code\game\turfs\open\floor\reinforced_floor.dm" #include "code\game\turfs\open\floor\plating\misc_plating.dm" #include "code\game\turfs\open\space\space.dm" +#include "code\game\turfs\open\space\space_EXPENSIVE.dm" #include "code\game\turfs\open\space\transit.dm" #include "code\modules\actionspeed\_actionspeed_modifier.dm" #include "code\modules\actionspeed\modifiers\addiction.dm" @@ -2309,6 +2592,7 @@ #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\actionspeed\modifiers\wound.dm" #include "code\modules\admin\admin.dm" #include "code\modules\admin\admin_fax_panel.dm" #include "code\modules\admin\admin_investigate.dm" @@ -2348,11 +2632,11 @@ #include "code\modules\admin\whitelist.dm" #include "code\modules\admin\callproc\callproc.dm" #include "code\modules\admin\smites\bad_luck.dm" +#include "code\modules\admin\smites\become_object.dm" #include "code\modules\admin\smites\berforate.dm" #include "code\modules\admin\smites\bloodless.dm" #include "code\modules\admin\smites\boneless.dm" #include "code\modules\admin\smites\brain_damage.dm" -#include "code\modules\admin\smites\bread.dm" #include "code\modules\admin\smites\bsa.dm" #include "code\modules\admin\smites\curse_of_babel.dm" #include "code\modules\admin\smites\dock_pay.dm" @@ -2366,6 +2650,7 @@ #include "code\modules\admin\smites\knot_shoes.dm" #include "code\modules\admin\smites\lightning.dm" #include "code\modules\admin\smites\nugget.dm" +#include "code\modules\admin\smites\petrify.dm" #include "code\modules\admin\smites\phobia_ocky_icky.dm" #include "code\modules\admin\smites\puzzgrid.dm" #include "code\modules\admin\smites\puzzle.dm" @@ -2388,6 +2673,7 @@ #include "code\modules\admin\verbs\atmosdebug.dm" #include "code\modules\admin\verbs\beakerpanel.dm" #include "code\modules\admin\verbs\borgpanel.dm" +#include "code\modules\admin\verbs\change_shuttle_events.dm" #include "code\modules\admin\verbs\cinematic.dm" #include "code\modules\admin\verbs\color_blind_test.dm" #include "code\modules\admin\verbs\commandreport.dm" @@ -2401,10 +2687,12 @@ #include "code\modules\admin\verbs\fps.dm" #include "code\modules\admin\verbs\getlogs.dm" #include "code\modules\admin\verbs\ghost_pool_protection.dm" +#include "code\modules\admin\verbs\grant_dna_infusion.dm" #include "code\modules\admin\verbs\hiddenprints.dm" #include "code\modules\admin\verbs\highlander_datum.dm" #include "code\modules\admin\verbs\individual_logging.dm" #include "code\modules\admin\verbs\lawpanel.dm" +#include "code\modules\admin\verbs\light_debug.dm" #include "code\modules\admin\verbs\list_exposer.dm" #include "code\modules\admin\verbs\machine_upgrade.dm" #include "code\modules\admin\verbs\manipulate_organs.dm" @@ -2441,6 +2729,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\nobody_wants_to_learn_matrix_math.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" @@ -2454,14 +2743,17 @@ #include "code\modules\antagonists\_common\antag_spawner.dm" #include "code\modules\antagonists\_common\antag_team.dm" #include "code\modules\antagonists\abductor\abductor.dm" +#include "code\modules\antagonists\abductor\abductor_structures.dm" #include "code\modules\antagonists\abductor\ice_abductor.dm" #include "code\modules\antagonists\abductor\abductee\abductee.dm" #include "code\modules\antagonists\abductor\abductee\abductee_objectives.dm" -#include "code\modules\antagonists\abductor\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\gear\abductor_clothing.dm" +#include "code\modules\antagonists\abductor\equipment\gear\abductor_items.dm" +#include "code\modules\antagonists\abductor\equipment\gear\abductor_posters.dm" #include "code\modules\antagonists\abductor\equipment\glands\access.dm" #include "code\modules\antagonists\abductor\equipment\glands\blood.dm" #include "code\modules\antagonists\abductor\equipment\glands\chem.dm" @@ -2523,12 +2815,14 @@ #include "code\modules\antagonists\changeling\powers\augmented_eyesight.dm" #include "code\modules\antagonists\changeling\powers\biodegrade.dm" #include "code\modules\antagonists\changeling\powers\chameleon_skin.dm" +#include "code\modules\antagonists\changeling\powers\defib_grasp.dm" #include "code\modules\antagonists\changeling\powers\digitalcamo.dm" #include "code\modules\antagonists\changeling\powers\fakedeath.dm" #include "code\modules\antagonists\changeling\powers\fleshmend.dm" #include "code\modules\antagonists\changeling\powers\headcrab.dm" #include "code\modules\antagonists\changeling\powers\lesserform.dm" #include "code\modules\antagonists\changeling\powers\mimic_voice.dm" +#include "code\modules\antagonists\changeling\powers\mmi_talk.dm" #include "code\modules\antagonists\changeling\powers\mutations.dm" #include "code\modules\antagonists\changeling\powers\panacea.dm" #include "code\modules\antagonists\changeling\powers\pheromone_receptors.dm" @@ -2548,11 +2842,13 @@ #include "code\modules\antagonists\cult\cult_bastard_sword.dm" #include "code\modules\antagonists\cult\cult_comms.dm" #include "code\modules\antagonists\cult\cult_items.dm" +#include "code\modules\antagonists\cult\cult_objectives.dm" #include "code\modules\antagonists\cult\cult_structure_altar.dm" #include "code\modules\antagonists\cult\cult_structure_archives.dm" #include "code\modules\antagonists\cult\cult_structure_forge.dm" #include "code\modules\antagonists\cult\cult_structure_pylon.dm" #include "code\modules\antagonists\cult\cult_structures.dm" +#include "code\modules\antagonists\cult\cult_team.dm" #include "code\modules\antagonists\cult\cult_turf_overlay.dm" #include "code\modules\antagonists\cult\rune_spawn_action.dm" #include "code\modules\antagonists\cult\runes.dm" @@ -2584,17 +2880,21 @@ #include "code\modules\antagonists\heretic\items\heretic_blades.dm" #include "code\modules\antagonists\heretic\items\heretic_necks.dm" #include "code\modules\antagonists\heretic\items\hunter_rifle.dm" +#include "code\modules\antagonists\heretic\items\keyring.dm" +#include "code\modules\antagonists\heretic\items\lintel.dm" #include "code\modules\antagonists\heretic\items\madness_mask.dm" #include "code\modules\antagonists\heretic\knowledge\ash_lore.dm" #include "code\modules\antagonists\heretic\knowledge\blade_lore.dm" #include "code\modules\antagonists\heretic\knowledge\cosmic_lore.dm" #include "code\modules\antagonists\heretic\knowledge\flesh_lore.dm" #include "code\modules\antagonists\heretic\knowledge\general_side.dm" +#include "code\modules\antagonists\heretic\knowledge\knock_lore.dm" #include "code\modules\antagonists\heretic\knowledge\rust_lore.dm" #include "code\modules\antagonists\heretic\knowledge\side_ash_flesh.dm" #include "code\modules\antagonists\heretic\knowledge\side_blade_rust.dm" #include "code\modules\antagonists\heretic\knowledge\side_cosmos_ash.dm" #include "code\modules\antagonists\heretic\knowledge\side_flesh_void.dm" +#include "code\modules\antagonists\heretic\knowledge\side_knock_flesh.dm" #include "code\modules\antagonists\heretic\knowledge\side_rust_cosmos.dm" #include "code\modules\antagonists\heretic\knowledge\side_void_blade.dm" #include "code\modules\antagonists\heretic\knowledge\starting_lore.dm" @@ -2604,10 +2904,14 @@ #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\apetravulnera.dm" +#include "code\modules\antagonists\heretic\magic\ascended_shapeshift.dm" #include "code\modules\antagonists\heretic\magic\ash_ascension.dm" #include "code\modules\antagonists\heretic\magic\ash_jaunt.dm" #include "code\modules\antagonists\heretic\magic\blood_cleave.dm" #include "code\modules\antagonists\heretic\magic\blood_siphon.dm" +#include "code\modules\antagonists\heretic\magic\burglar_finesse.dm" +#include "code\modules\antagonists\heretic\magic\caretaker.dm" #include "code\modules\antagonists\heretic\magic\cosmic_expansion.dm" #include "code\modules\antagonists\heretic\magic\cosmic_runes.dm" #include "code\modules\antagonists\heretic\magic\eldritch_blind.dm" @@ -2625,6 +2929,7 @@ #include "code\modules\antagonists\heretic\magic\mirror_walk.dm" #include "code\modules\antagonists\heretic\magic\nightwatcher_rebirth.dm" #include "code\modules\antagonists\heretic\magic\realignment.dm" +#include "code\modules\antagonists\heretic\magic\rust_charge.dm" #include "code\modules\antagonists\heretic\magic\rust_construction.dm" #include "code\modules\antagonists\heretic\magic\rust_wave.dm" #include "code\modules\antagonists\heretic\magic\shadow_cloak.dm" @@ -2634,12 +2939,13 @@ #include "code\modules\antagonists\heretic\magic\void_cold_cone.dm" #include "code\modules\antagonists\heretic\magic\void_phase.dm" #include "code\modules\antagonists\heretic\magic\void_pull.dm" -#include "code\modules\antagonists\heretic\mobs\maid_in_mirror.dm" +#include "code\modules\antagonists\heretic\magic\wave_of_desperation.dm" #include "code\modules\antagonists\heretic\status_effects\buffs.dm" #include "code\modules\antagonists\heretic\status_effects\debuffs.dm" #include "code\modules\antagonists\heretic\status_effects\ghoul.dm" #include "code\modules\antagonists\heretic\status_effects\mark_effects.dm" #include "code\modules\antagonists\heretic\structures\carving_knife.dm" +#include "code\modules\antagonists\heretic\structures\knock_final.dm" #include "code\modules\antagonists\heretic\structures\mawed_crucible.dm" #include "code\modules\antagonists\highlander\highlander.dm" #include "code\modules\antagonists\hypnotized\hypnotized.dm" @@ -2682,7 +2988,6 @@ #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\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" @@ -2707,9 +3012,7 @@ #include "code\modules\antagonists\traitor\components\traitor_objective_limit_per_time.dm" #include "code\modules\antagonists\traitor\components\traitor_objective_mind_tracker.dm" #include "code\modules\antagonists\traitor\objectives\assassination.dm" -#include "code\modules\antagonists\traitor\objectives\demoralise_crew.dm" -#include "code\modules\antagonists\traitor\objectives\demoralise_graffiti.dm" -#include "code\modules\antagonists\traitor\objectives\demoralise_poster.dm" +#include "code\modules\antagonists\traitor\objectives\demoralise_assault.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\eyesnatching.dm" @@ -2748,10 +3051,18 @@ #include "code\modules\antagonists\wizard\equipment\spellbook_entries\mobility.dm" #include "code\modules\antagonists\wizard\equipment\spellbook_entries\offensive.dm" #include "code\modules\antagonists\wizard\equipment\spellbook_entries\summons.dm" +#include "code\modules\antagonists\wizard\grand_ritual\fluff.dm" #include "code\modules\antagonists\wizard\grand_ritual\grand_ritual.dm" -#include "code\modules\antagonists\wizard\grand_ritual\grand_ritual_finale.dm" #include "code\modules\antagonists\wizard\grand_ritual\grand_rune.dm" #include "code\modules\antagonists\wizard\grand_ritual\grand_side_effect.dm" +#include "code\modules\antagonists\wizard\grand_ritual\finales\all_access.dm" +#include "code\modules\antagonists\wizard\grand_ritual\finales\armageddon.dm" +#include "code\modules\antagonists\wizard\grand_ritual\finales\captaincy.dm" +#include "code\modules\antagonists\wizard\grand_ritual\finales\cheese.dm" +#include "code\modules\antagonists\wizard\grand_ritual\finales\clown.dm" +#include "code\modules\antagonists\wizard\grand_ritual\finales\grand_ritual_finale.dm" +#include "code\modules\antagonists\wizard\grand_ritual\finales\immortality.dm" +#include "code\modules\antagonists\wizard\grand_ritual\finales\midas.dm" #include "code\modules\antagonists\xeno\xeno.dm" #include "code\modules\art\paintings.dm" #include "code\modules\art\statues.dm" @@ -2793,6 +3104,7 @@ #include "code\modules\asset_cache\assets\inventory.dm" #include "code\modules\asset_cache\assets\irv.dm" #include "code\modules\asset_cache\assets\jquery.dm" +#include "code\modules\asset_cache\assets\light_templates.dm" #include "code\modules\asset_cache\assets\lobby.dm" #include "code\modules\asset_cache\assets\mafia.dm" #include "code\modules\asset_cache\assets\mecha.dm" @@ -2870,6 +3182,7 @@ #include "code\modules\atmospherics\machinery\components\unary_devices\bluespace_sender.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\cryo.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\heat_exchanger.dm" +#include "code\modules\atmospherics\machinery\components\unary_devices\machine_connector.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\outlet_injector.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\passive_vent.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\portables_connector.dm" @@ -2898,6 +3211,7 @@ #include "code\modules\autowiki\autowiki.dm" #include "code\modules\autowiki\pages\base.dm" #include "code\modules\autowiki\pages\soup.dm" +#include "code\modules\autowiki\pages\stockparts.dm" #include "code\modules\autowiki\pages\techweb.dm" #include "code\modules\autowiki\pages\vending.dm" #include "code\modules\awaymissions\away_props.dm" @@ -2924,6 +3238,54 @@ #include "code\modules\basketball\controller.dm" #include "code\modules\basketball\hoop.dm" #include "code\modules\basketball\referee.dm" +#include "code\modules\bitrunning\abilities.dm" +#include "code\modules\bitrunning\alerts.dm" +#include "code\modules\bitrunning\areas.dm" +#include "code\modules\bitrunning\event.dm" +#include "code\modules\bitrunning\job.dm" +#include "code\modules\bitrunning\turfs.dm" +#include "code\modules\bitrunning\antagonists\cyber_police.dm" +#include "code\modules\bitrunning\antagonists\outfit.dm" +#include "code\modules\bitrunning\components\avatar_connection.dm" +#include "code\modules\bitrunning\components\bitrunning_points.dm" +#include "code\modules\bitrunning\components\netpod_healing.dm" +#include "code\modules\bitrunning\objects\bit_vendor.dm" +#include "code\modules\bitrunning\objects\clothing.dm" +#include "code\modules\bitrunning\objects\disks.dm" +#include "code\modules\bitrunning\objects\hololadder.dm" +#include "code\modules\bitrunning\objects\host_monitor.dm" +#include "code\modules\bitrunning\objects\landmarks.dm" +#include "code\modules\bitrunning\objects\loot_crate.dm" +#include "code\modules\bitrunning\objects\netpod.dm" +#include "code\modules\bitrunning\objects\quantum_console.dm" +#include "code\modules\bitrunning\orders\disks.dm" +#include "code\modules\bitrunning\orders\flair.dm" +#include "code\modules\bitrunning\orders\tech.dm" +#include "code\modules\bitrunning\server\loot.dm" +#include "code\modules\bitrunning\server\map_handling.dm" +#include "code\modules\bitrunning\server\obj_generation.dm" +#include "code\modules\bitrunning\server\quantum_server.dm" +#include "code\modules\bitrunning\server\signal_handlers.dm" +#include "code\modules\bitrunning\server\util.dm" +#include "code\modules\bitrunning\virtual_domain\safehouses.dm" +#include "code\modules\bitrunning\virtual_domain\virtual_domain.dm" +#include "code\modules\bitrunning\virtual_domain\domains\ash_drake.dm" +#include "code\modules\bitrunning\virtual_domain\domains\beach_bar.dm" +#include "code\modules\bitrunning\virtual_domain\domains\blood_drunk_miner.dm" +#include "code\modules\bitrunning\virtual_domain\domains\bubblegum.dm" +#include "code\modules\bitrunning\virtual_domain\domains\clown_planet.dm" +#include "code\modules\bitrunning\virtual_domain\domains\colossus.dm" +#include "code\modules\bitrunning\virtual_domain\domains\gondola_asteroid.dm" +#include "code\modules\bitrunning\virtual_domain\domains\hierophant.dm" +#include "code\modules\bitrunning\virtual_domain\domains\legion.dm" +#include "code\modules\bitrunning\virtual_domain\domains\pipedream.dm" +#include "code\modules\bitrunning\virtual_domain\domains\pirates.dm" +#include "code\modules\bitrunning\virtual_domain\domains\stairs_and_cliffs.dm" +#include "code\modules\bitrunning\virtual_domain\domains\syndicate_assault.dm" +#include "code\modules\bitrunning\virtual_domain\domains\test_only.dm" +#include "code\modules\bitrunning\virtual_domain\domains\vaporwave.dm" +#include "code\modules\bitrunning\virtual_domain\domains\wendigo.dm" +#include "code\modules\bitrunning\virtual_domain\domains\xeno_nest.dm" #include "code\modules\buildmode\bm_mode.dm" #include "code\modules\buildmode\buildmode.dm" #include "code\modules\buildmode\buttons.dm" @@ -2968,6 +3330,7 @@ #include "code\modules\cargo\expressconsole.dm" #include "code\modules\cargo\gondolapod.dm" #include "code\modules\cargo\goodies.dm" +#include "code\modules\cargo\materials_market.dm" #include "code\modules\cargo\order.dm" #include "code\modules\cargo\orderconsole.dm" #include "code\modules\cargo\supplypod.dm" @@ -3027,6 +3390,7 @@ #include "code\modules\cargo\packs\science.dm" #include "code\modules\cargo\packs\security.dm" #include "code\modules\cargo\packs\service.dm" +#include "code\modules\cargo\packs\stock_market_items.dm" #include "code\modules\cargo\packs\vending_restock.dm" #include "code\modules\chatter\chatter.dm" #include "code\modules\client\client_colour.dm" @@ -3041,6 +3405,8 @@ #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\ai_emote_display.dm" +#include "code\modules\client\preferences\ai_hologram_display.dm" #include "code\modules\client\preferences\ambient_occlusion.dm" #include "code\modules\client\preferences\assets.dm" #include "code\modules\client\preferences\auto_fit_viewport.dm" @@ -3058,11 +3424,13 @@ #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\language.dm" #include "code\modules\client\preferences\mod_select.dm" #include "code\modules\client\preferences\multiz_parallax.dm" #include "code\modules\client\preferences\multiz_performance.dm" #include "code\modules\client\preferences\names.dm" #include "code\modules\client\preferences\ooc.dm" +#include "code\modules\client\preferences\operative_species.dm" #include "code\modules\client\preferences\paint_color.dm" #include "code\modules\client\preferences\parallax.dm" #include "code\modules\client\preferences\pda.dm" @@ -3073,6 +3441,7 @@ #include "code\modules\client\preferences\preferred_map.dm" #include "code\modules\client\preferences\pride_pin.dm" #include "code\modules\client\preferences\prisoner_crime.dm" +#include "code\modules\client\preferences\prosthetic.dm" #include "code\modules\client\preferences\random.dm" #include "code\modules\client\preferences\runechat.dm" #include "code\modules\client\preferences\scaling_method.dm" @@ -3104,6 +3473,7 @@ #include "code\modules\client\preferences\migrations\convert_to_json_savefile.dm" #include "code\modules\client\preferences\migrations\legacy_sound_toggles_migration.dm" #include "code\modules\client\preferences\migrations\tgui_prefs_migration.dm" +#include "code\modules\client\preferences\migrations\tts_blip_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" @@ -3116,8 +3486,15 @@ #include "code\modules\client\verbs\ping.dm" #include "code\modules\client\verbs\suicide.dm" #include "code\modules\client\verbs\who.dm" -#include "code\modules\clothing\chameleon.dm" #include "code\modules\clothing\clothing.dm" +#include "code\modules\clothing\belts\polymorph_belt.dm" +#include "code\modules\clothing\chameleon\_chameleon_action.dm" +#include "code\modules\clothing\chameleon\_chameleon_outfit.dm" +#include "code\modules\clothing\chameleon\chameleon_action_subtypes.dm" +#include "code\modules\clothing\chameleon\chameleon_drone.dm" +#include "code\modules\clothing\chameleon\chameleon_gun.dm" +#include "code\modules\clothing\chameleon\chameleon_scanner.dm" +#include "code\modules\clothing\chameleon\generic_chameleon_clothing.dm" #include "code\modules\clothing\ears\_ears.dm" #include "code\modules\clothing\glasses\_glasses.dm" #include "code\modules\clothing\glasses\engine_goggles.dm" @@ -3228,7 +3605,6 @@ #include "code\modules\clothing\suits\wintercoats.dm" #include "code\modules\clothing\suits\wiz_robe.dm" #include "code\modules\clothing\under\_under.dm" -#include "code\modules\clothing\under\accessories.dm" #include "code\modules\clothing\under\color.dm" #include "code\modules\clothing\under\costume.dm" #include "code\modules\clothing\under\ethereal.dm" @@ -3239,6 +3615,12 @@ #include "code\modules\clothing\under\suits.dm" #include "code\modules\clothing\under\syndicate.dm" #include "code\modules\clothing\under\trek.dm" +#include "code\modules\clothing\under\accessories\_accessories.dm" +#include "code\modules\clothing\under\accessories\armbands.dm" +#include "code\modules\clothing\under\accessories\badges.dm" +#include "code\modules\clothing\under\accessories\medals.dm" +#include "code\modules\clothing\under\accessories\tribal.dm" +#include "code\modules\clothing\under\accessories\vests.dm" #include "code\modules\clothing\under\jobs\cargo.dm" #include "code\modules\clothing\under\jobs\centcom.dm" #include "code\modules\clothing\under\jobs\command.dm" @@ -3309,6 +3691,7 @@ #include "code\modules\events\shuttle_insurance.dm" #include "code\modules\events\spider_infestation.dm" #include "code\modules\events\stray_cargo.dm" +#include "code\modules\events\supermatter_surge.dm" #include "code\modules\events\tram_malfunction.dm" #include "code\modules\events\vent_clog.dm" #include "code\modules\events\wisdomcow.dm" @@ -3381,15 +3764,17 @@ #include "code\modules\experisci\experiment\experiments.dm" #include "code\modules\experisci\experiment\physical_experiments.dm" #include "code\modules\experisci\experiment\handlers\experiment_handler.dm" -#include "code\modules\experisci\experiment\types\dissection_experiment.dm" +#include "code\modules\experisci\experiment\types\autopsy_experiment.dm" #include "code\modules\experisci\experiment\types\experiment.dm" #include "code\modules\experisci\experiment\types\exploration.dm" #include "code\modules\experisci\experiment\types\ordnance.dm" #include "code\modules\experisci\experiment\types\physical_experiment.dm" #include "code\modules\experisci\experiment\types\random_scanning.dm" #include "code\modules\experisci\experiment\types\scanning.dm" +#include "code\modules\experisci\experiment\types\scanning_fish.dm" #include "code\modules\experisci\experiment\types\scanning_machinery.dm" #include "code\modules\experisci\experiment\types\scanning_material.dm" +#include "code\modules\experisci\experiment\types\scanning_people.dm" #include "code\modules\experisci\experiment\types\scanning_plants.dm" #include "code\modules\experisci\experiment\types\scanning_points.dm" #include "code\modules\experisci\experiment\types\scanning_vatgrown.dm" @@ -3413,11 +3798,13 @@ #include "code\modules\fishing\fishing_minigame.dm" #include "code\modules\fishing\fishing_portal_machine.dm" #include "code\modules\fishing\fishing_rod.dm" -#include "code\modules\fishing\fishing_traits.dm" #include "code\modules\fishing\aquarium\aquarium.dm" #include "code\modules\fishing\aquarium\aquarium_kit.dm" +#include "code\modules\fishing\aquarium\fish_analyzer.dm" #include "code\modules\fishing\fish\_fish.dm" #include "code\modules\fishing\fish\chasm_detritus.dm" +#include "code\modules\fishing\fish\fish_evolution.dm" +#include "code\modules\fishing\fish\fish_traits.dm" #include "code\modules\fishing\fish\fish_types.dm" #include "code\modules\fishing\sources\_fish_source.dm" #include "code\modules\fishing\sources\source_types.dm" @@ -3454,6 +3841,7 @@ #include "code\modules\food_and_drinks\recipes\tablecraft\recipes_frozen.dm" #include "code\modules\food_and_drinks\recipes\tablecraft\recipes_guide.dm" #include "code\modules\food_and_drinks\recipes\tablecraft\recipes_lizard.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_martian.dm" #include "code\modules\food_and_drinks\recipes\tablecraft\recipes_meat.dm" #include "code\modules\food_and_drinks\recipes\tablecraft\recipes_mexican.dm" #include "code\modules\food_and_drinks\recipes\tablecraft\recipes_misc.dm" @@ -3559,6 +3947,7 @@ #include "code\modules\hydroponics\grown\random.dm" #include "code\modules\hydroponics\grown\replicapod.dm" #include "code\modules\hydroponics\grown\root.dm" +#include "code\modules\hydroponics\grown\seedling.dm" #include "code\modules\hydroponics\grown\sugarcane.dm" #include "code\modules\hydroponics\grown\tea_coffee.dm" #include "code\modules\hydroponics\grown\tobacco.dm" @@ -3669,6 +4058,7 @@ #include "code\modules\jobs\job_types\chaplain\chaplain_costumes.dm" #include "code\modules\jobs\job_types\chaplain\chaplain_divine_archer.dm" #include "code\modules\jobs\job_types\chaplain\chaplain_nullrod.dm" +#include "code\modules\jobs\job_types\chaplain\chaplain_vorpal_scythe.dm" #include "code\modules\jobs\job_types\ert\ert_generic.dm" #include "code\modules\jobs\job_types\event\admin.dm" #include "code\modules\jobs\job_types\event\fugitive.dm" @@ -3760,6 +4150,7 @@ #include "code\modules\logging\categories\log_category_compats.dm" #include "code\modules\logging\categories\log_category_debug.dm" #include "code\modules\logging\categories\log_category_game.dm" +#include "code\modules\logging\categories\log_category_href.dm" #include "code\modules\logging\categories\log_category_misc.dm" #include "code\modules\logging\categories\log_category_pda.dm" #include "code\modules\logging\categories\log_category_silo.dm" @@ -3806,6 +4197,7 @@ #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\cursed_slot_machine.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\allamericandiner.dm" @@ -3828,7 +4220,6 @@ #include "code\modules\mapfluff\ruins\spaceruin_code\interdyne.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\listeningstation.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\meateor.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\the_Outlet.dm" @@ -3836,6 +4227,11 @@ #include "code\modules\mapfluff\ruins\spaceruin_code\waystation.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\whiteship.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\whiteshipruin_box.dm" +#include "code\modules\mapfluff\ruins\spaceruin_code\oldstation\oldstation_cytology.dm" +#include "code\modules\mapfluff\ruins\spaceruin_code\oldstation\oldstation_fluff.dm" +#include "code\modules\mapfluff\ruins\spaceruin_code\oldstation\oldstation_machines.dm" +#include "code\modules\mapfluff\ruins\spaceruin_code\oldstation\oldstation_mod.dm" +#include "code\modules\mapfluff\ruins\spaceruin_code\oldstation\oldstation_rnd.dm" #include "code\modules\mapping\access_helpers.dm" #include "code\modules\mapping\mail_sorting_helpers.dm" #include "code\modules\mapping\map_template.dm" @@ -3867,7 +4263,6 @@ #include "code\modules\mining\machine_stacking.dm" #include "code\modules\mining\machine_unloading.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" @@ -3880,6 +4275,7 @@ #include "code\modules\mining\equipment\marker_beacons.dm" #include "code\modules\mining\equipment\mineral_scanner.dm" #include "code\modules\mining\equipment\mining_tools.dm" +#include "code\modules\mining\equipment\miningradio.dm" #include "code\modules\mining\equipment\resonator.dm" #include "code\modules\mining\equipment\survival_pod.dm" #include "code\modules\mining\equipment\wormhole_jaunter.dm" @@ -3917,7 +4313,6 @@ #include "code\modules\mob\dead\new_player\new_player.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.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" @@ -3950,27 +4345,97 @@ #include "code\modules\mob\living\basic\festivus_pole.dm" #include "code\modules\mob\living\basic\health_adjustment.dm" #include "code\modules\mob\living\basic\tree.dm" +#include "code\modules\mob\living\basic\blob_minions\blob_ai.dm" +#include "code\modules\mob\living\basic\blob_minions\blob_mob.dm" +#include "code\modules\mob\living\basic\blob_minions\blob_spore.dm" +#include "code\modules\mob\living\basic\blob_minions\blob_zombie.dm" +#include "code\modules\mob\living\basic\blob_minions\blobbernaut.dm" +#include "code\modules\mob\living\basic\clown\clown.dm" +#include "code\modules\mob\living\basic\clown\clown_ai.dm" #include "code\modules\mob\living\basic\farm_animals\deer.dm" #include "code\modules\mob\living\basic\farm_animals\pig.dm" +#include "code\modules\mob\living\basic\farm_animals\pony.dm" #include "code\modules\mob\living\basic\farm_animals\rabbit.dm" #include "code\modules\mob\living\basic\farm_animals\sheep.dm" +#include "code\modules\mob\living\basic\farm_animals\bee\_bee.dm" +#include "code\modules\mob\living\basic\farm_animals\bee\bee_ai_behavior.dm" +#include "code\modules\mob\living\basic\farm_animals\bee\bee_ai_subtree.dm" #include "code\modules\mob\living\basic\farm_animals\chicken\chick.dm" #include "code\modules\mob\living\basic\farm_animals\chicken\chicken.dm" #include "code\modules\mob\living\basic\farm_animals\cow\_cow.dm" #include "code\modules\mob\living\basic\farm_animals\cow\cow_ai.dm" #include "code\modules\mob\living\basic\farm_animals\cow\cow_moonicorn.dm" #include "code\modules\mob\living\basic\farm_animals\cow\cow_wisdom.dm" +#include "code\modules\mob\living\basic\farm_animals\goat\_goat.dm" +#include "code\modules\mob\living\basic\farm_animals\goat\goat_ai.dm" +#include "code\modules\mob\living\basic\farm_animals\goat\goat_subtypes.dm" +#include "code\modules\mob\living\basic\heretic\ash_spirit.dm" #include "code\modules\mob\living\basic\heretic\fire_shark.dm" +#include "code\modules\mob\living\basic\heretic\flesh_stalker.dm" +#include "code\modules\mob\living\basic\heretic\flesh_worm.dm" +#include "code\modules\mob\living\basic\heretic\heretic_summon.dm" +#include "code\modules\mob\living\basic\heretic\maid_in_the_mirror.dm" +#include "code\modules\mob\living\basic\heretic\raw_prophet.dm" +#include "code\modules\mob\living\basic\heretic\rust_walker.dm" #include "code\modules\mob\living\basic\heretic\star_gazer.dm" +#include "code\modules\mob\living\basic\icemoon\ice_whelp\ice_whelp.dm" +#include "code\modules\mob\living\basic\icemoon\ice_whelp\ice_whelp_abilities.dm" +#include "code\modules\mob\living\basic\icemoon\ice_whelp\ice_whelp_ai.dm" +#include "code\modules\mob\living\basic\jungle\mega_arachnid\mega_arachnid.dm" +#include "code\modules\mob\living\basic\jungle\mega_arachnid\mega_arachnid_abilities.dm" +#include "code\modules\mob\living\basic\jungle\mega_arachnid\mega_arachnid_ai.dm" +#include "code\modules\mob\living\basic\jungle\seedling\seedling.dm" +#include "code\modules\mob\living\basic\jungle\seedling\seedling_ai.dm" +#include "code\modules\mob\living\basic\jungle\seedling\seedling_projectiles.dm" #include "code\modules\mob\living\basic\lavaland\mining.dm" +#include "code\modules\mob\living\basic\lavaland\basilisk\basilisk.dm" +#include "code\modules\mob\living\basic\lavaland\basilisk\basilisk_overheat.dm" #include "code\modules\mob\living\basic\lavaland\bileworm\_bileworm.dm" #include "code\modules\mob\living\basic\lavaland\bileworm\bileworm_actions.dm" #include "code\modules\mob\living\basic\lavaland\bileworm\bileworm_ai.dm" #include "code\modules\mob\living\basic\lavaland\bileworm\bileworm_instrument.dm" #include "code\modules\mob\living\basic\lavaland\bileworm\bileworm_loot.dm" #include "code\modules\mob\living\basic\lavaland\bileworm\bileworm_vileworm.dm" -#include "code\modules\mob\living\basic\pets\dog.dm" +#include "code\modules\mob\living\basic\lavaland\brimdemon\brimbeam.dm" +#include "code\modules\mob\living\basic\lavaland\brimdemon\brimdemon.dm" +#include "code\modules\mob\living\basic\lavaland\brimdemon\brimdemon_ai.dm" +#include "code\modules\mob\living\basic\lavaland\brimdemon\brimdemon_loot.dm" +#include "code\modules\mob\living\basic\lavaland\goldgrub\goldgrub.dm" +#include "code\modules\mob\living\basic\lavaland\goldgrub\goldgrub_abilities.dm" +#include "code\modules\mob\living\basic\lavaland\goldgrub\goldgrub_ai.dm" +#include "code\modules\mob\living\basic\lavaland\goliath\goliath.dm" +#include "code\modules\mob\living\basic\lavaland\goliath\goliath_actions.dm" +#include "code\modules\mob\living\basic\lavaland\goliath\goliath_ai.dm" +#include "code\modules\mob\living\basic\lavaland\goliath\goliath_trophy.dm" +#include "code\modules\mob\living\basic\lavaland\goliath\tentacle.dm" +#include "code\modules\mob\living\basic\lavaland\hivelord\hivelord.dm" +#include "code\modules\mob\living\basic\lavaland\hivelord\hivelord_ai.dm" +#include "code\modules\mob\living\basic\lavaland\hivelord\spawn_hivelord_brood.dm" +#include "code\modules\mob\living\basic\lavaland\legion\legion.dm" +#include "code\modules\mob\living\basic\lavaland\legion\legion_ai.dm" +#include "code\modules\mob\living\basic\lavaland\legion\legion_brood.dm" +#include "code\modules\mob\living\basic\lavaland\legion\legion_tumour.dm" +#include "code\modules\mob\living\basic\lavaland\legion\spawn_legions.dm" +#include "code\modules\mob\living\basic\lavaland\lobstrosity\lobstrosity.dm" +#include "code\modules\mob\living\basic\lavaland\lobstrosity\lobstrosity_ai.dm" +#include "code\modules\mob\living\basic\lavaland\lobstrosity\lobstrosity_trophy.dm" +#include "code\modules\mob\living\basic\lavaland\watcher\watcher.dm" +#include "code\modules\mob\living\basic\lavaland\watcher\watcher_ai.dm" +#include "code\modules\mob\living\basic\lavaland\watcher\watcher_gaze.dm" +#include "code\modules\mob\living\basic\lavaland\watcher\watcher_overwatch.dm" +#include "code\modules\mob\living\basic\lavaland\watcher\watcher_projectiles.dm" +#include "code\modules\mob\living\basic\minebots\minebot.dm" +#include "code\modules\mob\living\basic\minebots\minebot_abilities.dm" +#include "code\modules\mob\living\basic\minebots\minebot_ai.dm" +#include "code\modules\mob\living\basic\minebots\minebot_upgrades.dm" +#include "code\modules\mob\living\basic\pets\fox.dm" +#include "code\modules\mob\living\basic\pets\penguin.dm" #include "code\modules\mob\living\basic\pets\pet.dm" +#include "code\modules\mob\living\basic\pets\sloth.dm" +#include "code\modules\mob\living\basic\pets\dog\_dog.dm" +#include "code\modules\mob\living\basic\pets\dog\corgi.dm" +#include "code\modules\mob\living\basic\pets\dog\dog_subtypes.dm" +#include "code\modules\mob\living\basic\pets\dog\strippable_items.dm" #include "code\modules\mob\living\basic\ruin_defender\stickman.dm" #include "code\modules\mob\living\basic\space_fauna\ant.dm" #include "code\modules\mob\living\basic\space_fauna\cat_surgeon.dm" @@ -3980,7 +4445,14 @@ #include "code\modules\mob\living\basic\space_fauna\headslug.dm" #include "code\modules\mob\living\basic\space_fauna\killer_tomato.dm" #include "code\modules\mob\living\basic\space_fauna\lightgeist.dm" +#include "code\modules\mob\living\basic\space_fauna\morph.dm" +#include "code\modules\mob\living\basic\space_fauna\mushroom.dm" +#include "code\modules\mob\living\basic\space_fauna\robot_customer.dm" #include "code\modules\mob\living\basic\space_fauna\spaceman.dm" +#include "code\modules\mob\living\basic\space_fauna\supermatter_spider.dm" +#include "code\modules\mob\living\basic\space_fauna\bear\_bear.dm" +#include "code\modules\mob\living\basic\space_fauna\bear\bear_ai_behavior.dm" +#include "code\modules\mob\living\basic\space_fauna\bear\bear_ai_subtree.dm" #include "code\modules\mob\living\basic\space_fauna\carp\carp.dm" #include "code\modules\mob\living\basic\space_fauna\carp\carp_abilities.dm" #include "code\modules\mob\living\basic\space_fauna\carp\carp_ai_actions.dm" @@ -3989,6 +4461,16 @@ #include "code\modules\mob\living\basic\space_fauna\carp\carp_controllers.dm" #include "code\modules\mob\living\basic\space_fauna\carp\magicarp.dm" #include "code\modules\mob\living\basic\space_fauna\carp\megacarp.dm" +#include "code\modules\mob\living\basic\space_fauna\demon\demon.dm" +#include "code\modules\mob\living\basic\space_fauna\demon\demon_items.dm" +#include "code\modules\mob\living\basic\space_fauna\demon\demon_subtypes.dm" +#include "code\modules\mob\living\basic\space_fauna\eyeball\_eyeball.dm" +#include "code\modules\mob\living\basic\space_fauna\eyeball\eyeball_ability.dm" +#include "code\modules\mob\living\basic\space_fauna\eyeball\eyeball_ai_behavior.dm" +#include "code\modules\mob\living\basic\space_fauna\eyeball\eyeball_ai_subtree.dm" +#include "code\modules\mob\living\basic\space_fauna\hivebot\_hivebot.dm" +#include "code\modules\mob\living\basic\space_fauna\hivebot\hivebot_behavior.dm" +#include "code\modules\mob\living\basic\space_fauna\hivebot\hivebot_subtree.dm" #include "code\modules\mob\living\basic\space_fauna\meteor_heart\chasing_spikes.dm" #include "code\modules\mob\living\basic\space_fauna\meteor_heart\meteor_eyeball.dm" #include "code\modules\mob\living\basic\space_fauna\meteor_heart\meteor_heart.dm" @@ -3997,10 +4479,17 @@ #include "code\modules\mob\living\basic\space_fauna\netherworld\blankbody.dm" #include "code\modules\mob\living\basic\space_fauna\netherworld\creature.dm" #include "code\modules\mob\living\basic\space_fauna\netherworld\migo.dm" -#include "code\modules\mob\living\basic\space_fauna\spider\giant_spider\giant_spider.dm" +#include "code\modules\mob\living\basic\space_fauna\paper_wizard\paper_abilities.dm" +#include "code\modules\mob\living\basic\space_fauna\paper_wizard\paper_wizard.dm" +#include "code\modules\mob\living\basic\space_fauna\regal_rat\regal_rat.dm" +#include "code\modules\mob\living\basic\space_fauna\regal_rat\regal_rat_actions.dm" +#include "code\modules\mob\living\basic\space_fauna\regal_rat\regal_rat_ai.dm" +#include "code\modules\mob\living\basic\space_fauna\snake\snake.dm" +#include "code\modules\mob\living\basic\space_fauna\snake\snake_ai.dm" +#include "code\modules\mob\living\basic\space_fauna\spider\spider.dm" #include "code\modules\mob\living\basic\space_fauna\spider\giant_spider\giant_spider_ai.dm" #include "code\modules\mob\living\basic\space_fauna\spider\giant_spider\giant_spider_subtrees.dm" -#include "code\modules\mob\living\basic\space_fauna\spider\giant_spider\giant_spider_variants.dm" +#include "code\modules\mob\living\basic\space_fauna\spider\giant_spider\giant_spiders.dm" #include "code\modules\mob\living\basic\space_fauna\spider\spider_abilities\hivemind.dm" #include "code\modules\mob\living\basic\space_fauna\spider\spider_abilities\lay_eggs.dm" #include "code\modules\mob\living\basic\space_fauna\spider\spider_abilities\web.dm" @@ -4008,6 +4497,8 @@ #include "code\modules\mob\living\basic\space_fauna\spider\spider_abilities\wrap.dm" #include "code\modules\mob\living\basic\space_fauna\spider\spiderlings\spiderling.dm" #include "code\modules\mob\living\basic\space_fauna\spider\spiderlings\spiderling_subtypes.dm" +#include "code\modules\mob\living\basic\space_fauna\spider\young_spider\young_spider.dm" +#include "code\modules\mob\living\basic\space_fauna\spider\young_spider\young_spider_subtypes.dm" #include "code\modules\mob\living\basic\space_fauna\statue\statue.dm" #include "code\modules\mob\living\basic\space_fauna\wumborian_fugu\fugu_gland.dm" #include "code\modules\mob\living\basic\space_fauna\wumborian_fugu\inflation.dm" @@ -4019,6 +4510,7 @@ #include "code\modules\mob\living\basic\vermin\axolotl.dm" #include "code\modules\mob\living\basic\vermin\butterfly.dm" #include "code\modules\mob\living\basic\vermin\cockroach.dm" +#include "code\modules\mob\living\basic\vermin\crab.dm" #include "code\modules\mob\living\basic\vermin\frog.dm" #include "code\modules\mob\living\basic\vermin\lizard.dm" #include "code\modules\mob\living\basic\vermin\mothroach.dm" @@ -4082,6 +4574,7 @@ #include "code\modules\mob\living\carbon\alien\larva\powers.dm" #include "code\modules\mob\living\carbon\alien\special\alien_embryo.dm" #include "code\modules\mob\living\carbon\alien\special\facehugger.dm" +#include "code\modules\mob\living\carbon\human\_species.dm" #include "code\modules\mob\living\carbon\human\damage_procs.dm" #include "code\modules\mob\living\carbon\human\death.dm" #include "code\modules\mob\living\carbon\human\dummy.dm" @@ -4101,11 +4594,10 @@ #include "code\modules\mob\living\carbon\human\inventory.dm" #include "code\modules\mob\living\carbon\human\life.dm" #include "code\modules\mob\living\carbon\human\login.dm" +#include "code\modules\mob\living\carbon\human\monkey.dm" #include "code\modules\mob\living\carbon\human\physiology.dm" -#include "code\modules\mob\living\carbon\human\species.dm" #include "code\modules\mob\living\carbon\human\status_procs.dm" #include "code\modules\mob\living\carbon\human\suicides.dm" -#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\abominations.dm" #include "code\modules\mob\living\carbon\human\species_types\android.dm" @@ -4136,6 +4628,7 @@ #include "code\modules\mob\living\silicon\silicon_defense.dm" #include "code\modules\mob\living\silicon\silicon_movement.dm" #include "code\modules\mob\living\silicon\silicon_say.dm" +#include "code\modules\mob\living\silicon\ai\_preferences.dm" #include "code\modules\mob\living\silicon\ai\ai.dm" #include "code\modules\mob\living\silicon\ai\ai_defense.dm" #include "code\modules\mob\living\silicon\ai\ai_portrait_picker.dm" @@ -4173,6 +4666,7 @@ #include "code\modules\mob\living\simple_animal\shade.dm" #include "code\modules\mob\living\simple_animal\simple_animal.dm" #include "code\modules\mob\living\simple_animal\bot\bot.dm" +#include "code\modules\mob\living\simple_animal\bot\bot_announcement.dm" #include "code\modules\mob\living\simple_animal\bot\cleanbot.dm" #include "code\modules\mob\living\simple_animal\bot\construction.dm" #include "code\modules\mob\living\simple_animal\bot\ed209bot.dm" @@ -4186,14 +4680,8 @@ #include "code\modules\mob\living\simple_animal\bot\SuperBeepsky.dm" #include "code\modules\mob\living\simple_animal\bot\vibebot.dm" #include "code\modules\mob\living\simple_animal\friendly\cat.dm" -#include "code\modules\mob\living\simple_animal\friendly\crab.dm" -#include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm" -#include "code\modules\mob\living\simple_animal\friendly\fox.dm" #include "code\modules\mob\living\simple_animal\friendly\gondola.dm" -#include "code\modules\mob\living\simple_animal\friendly\penguin.dm" #include "code\modules\mob\living\simple_animal\friendly\pet.dm" -#include "code\modules\mob\living\simple_animal\friendly\robot_customer.dm" -#include "code\modules\mob\living\simple_animal\friendly\sloth.dm" #include "code\modules\mob\living\simple_animal\friendly\drone\_drone.dm" #include "code\modules\mob\living\simple_animal\friendly\drone\drone_say.dm" #include "code\modules\mob\living\simple_animal\friendly\drone\drone_tools.dm" @@ -4217,34 +4705,19 @@ #include "code\modules\mob\living\simple_animal\guardian\types\standard.dm" #include "code\modules\mob\living\simple_animal\guardian\types\support.dm" #include "code\modules\mob\living\simple_animal\hostile\alien.dm" -#include "code\modules\mob\living\simple_animal\hostile\bear.dm" -#include "code\modules\mob\living\simple_animal\hostile\bees.dm" -#include "code\modules\mob\living\simple_animal\hostile\blob.dm" -#include "code\modules\mob\living\simple_animal\hostile\blobbernaut.dm" -#include "code\modules\mob\living\simple_animal\hostile\blobspore.dm" #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\heretic_monsters.dm" -#include "code\modules\mob\living\simple_animal\hostile\hivebot.dm" #include "code\modules\mob\living\simple_animal\hostile\hostile.dm" #include "code\modules\mob\living\simple_animal\hostile\illusion.dm" #include "code\modules\mob\living\simple_animal\hostile\mimic.dm" -#include "code\modules\mob\living\simple_animal\hostile\morph.dm" -#include "code\modules\mob\living\simple_animal\hostile\mushroom.dm" #include "code\modules\mob\living\simple_animal\hostile\nanotrasen.dm" #include "code\modules\mob\living\simple_animal\hostile\ooze.dm" #include "code\modules\mob\living\simple_animal\hostile\pirate.dm" -#include "code\modules\mob\living\simple_animal\hostile\regalrat.dm" #include "code\modules\mob\living\simple_animal\hostile\skeleton.dm" -#include "code\modules\mob\living\simple_animal\hostile\slaughter_demon.dm" -#include "code\modules\mob\living\simple_animal\hostile\smspider.dm" #include "code\modules\mob\living\simple_animal\hostile\space_dragon.dm" #include "code\modules\mob\living\simple_animal\hostile\vatbeast.dm" #include "code\modules\mob\living\simple_animal\hostile\venus_human_trap.dm" #include "code\modules\mob\living\simple_animal\hostile\wizard.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\constructs\artificer.dm" #include "code\modules\mob\living\simple_animal\hostile\constructs\constructs.dm" #include "code\modules\mob\living\simple_animal\hostile\constructs\harvester.dm" @@ -4255,9 +4728,7 @@ #include "code\modules\mob\living\simple_animal\hostile\gorilla\visuals_icons.dm" #include "code\modules\mob\living\simple_animal\hostile\jungle\_jungle_mobs.dm" #include "code\modules\mob\living\simple_animal\hostile\jungle\leaper.dm" -#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" @@ -4268,16 +4739,9 @@ #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" @@ -4286,10 +4750,8 @@ #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\clown.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\goose.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\snake.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\trader.dm" #include "code\modules\mob\living\simple_animal\slime\death.dm" #include "code\modules\mob\living\simple_animal\slime\emote.dm" @@ -4306,6 +4768,7 @@ #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\drone_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" @@ -4320,6 +4783,7 @@ #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_theme.dm" #include "code\modules\mod\mod_types.dm" @@ -4339,7 +4803,6 @@ #include "code\modules\mod\modules\modules_supply.dm" #include "code\modules\mod\modules\modules_timeline.dm" #include "code\modules\mod\modules\modules_visor.dm" -#include "code\modules\modular_computers\laptop_vendor.dm" #include "code\modules\modular_computers\computers\item\computer.dm" #include "code\modules\modular_computers\computers\item\computer_files.dm" #include "code\modules\modular_computers\computers\item\computer_power.dm" @@ -4352,12 +4815,13 @@ #include "code\modules\modular_computers\computers\item\disks\computer_disk.dm" #include "code\modules\modular_computers\computers\item\disks\maintenance_disks.dm" #include "code\modules\modular_computers\computers\item\disks\role_disks.dm" +#include "code\modules\modular_computers\computers\item\disks\unique_disks.dm" #include "code\modules\modular_computers\computers\item\disks\virus_disk.dm" #include "code\modules\modular_computers\computers\machinery\console_presets.dm" #include "code\modules\modular_computers\computers\machinery\modular_computer.dm" -#include "code\modules\modular_computers\computers\machinery\modular_console.dm" #include "code\modules\modular_computers\file_system\computer_file.dm" #include "code\modules\modular_computers\file_system\data.dm" +#include "code\modules\modular_computers\file_system\picture_file.dm" #include "code\modules\modular_computers\file_system\program.dm" #include "code\modules\modular_computers\file_system\programs\airestorer.dm" #include "code\modules\modular_computers\file_system\programs\alarm.dm" @@ -4377,7 +4841,6 @@ #include "code\modules\modular_computers\file_system\programs\notepad.dm" #include "code\modules\modular_computers\file_system\programs\nt_pay.dm" #include "code\modules\modular_computers\file_system\programs\ntdownloader.dm" -#include "code\modules\modular_computers\file_system\programs\ntmessenger.dm" #include "code\modules\modular_computers\file_system\programs\ntnrc_client.dm" #include "code\modules\modular_computers\file_system\programs\portrait_printer.dm" #include "code\modules\modular_computers\file_system\programs\powermonitor.dm" @@ -4400,6 +4863,8 @@ #include "code\modules\modular_computers\file_system\programs\maintenance\modsuit.dm" #include "code\modules\modular_computers\file_system\programs\maintenance\phys_scanner.dm" #include "code\modules\modular_computers\file_system\programs\maintenance\themes.dm" +#include "code\modules\modular_computers\file_system\programs\messenger\messenger_data.dm" +#include "code\modules\modular_computers\file_system\programs\messenger\messenger_program.dm" #include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm" #include "code\modules\movespeed\_movespeed_modifier.dm" #include "code\modules\movespeed\modifiers\components.dm" @@ -4541,18 +5006,16 @@ #include "code\modules\projectiles\projectile.dm" #include "code\modules\projectiles\ammunition\_ammunition.dm" #include "code\modules\projectiles\ammunition\_firing.dm" +#include "code\modules\projectiles\ammunition\ballistic\foam.dm" +#include "code\modules\projectiles\ammunition\ballistic\harpoon.dm" #include "code\modules\projectiles\ammunition\ballistic\lmg.dm" #include "code\modules\projectiles\ammunition\ballistic\pistol.dm" #include "code\modules\projectiles\ammunition\ballistic\revolver.dm" #include "code\modules\projectiles\ammunition\ballistic\rifle.dm" +#include "code\modules\projectiles\ammunition\ballistic\rocket.dm" #include "code\modules\projectiles\ammunition\ballistic\shotgun.dm" #include "code\modules\projectiles\ammunition\ballistic\smg.dm" #include "code\modules\projectiles\ammunition\ballistic\sniper.dm" -#include "code\modules\projectiles\ammunition\caseless\_caseless.dm" -#include "code\modules\projectiles\ammunition\caseless\energy.dm" -#include "code\modules\projectiles\ammunition\caseless\foam.dm" -#include "code\modules\projectiles\ammunition\caseless\harpoon.dm" -#include "code\modules\projectiles\ammunition\caseless\rocket.dm" #include "code\modules\projectiles\ammunition\energy\_energy.dm" #include "code\modules\projectiles\ammunition\energy\ebow.dm" #include "code\modules\projectiles\ammunition\energy\gravity.dm" @@ -4598,6 +5061,7 @@ #include "code\modules\projectiles\guns\ballistic\bows\bow_quivers.dm" #include "code\modules\projectiles\guns\ballistic\bows\bow_types.dm" #include "code\modules\projectiles\guns\energy\beam_rifle.dm" +#include "code\modules\projectiles\guns\energy\crank_guns.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" @@ -4608,11 +5072,13 @@ #include "code\modules\projectiles\guns\energy\recharge.dm" #include "code\modules\projectiles\guns\energy\special.dm" #include "code\modules\projectiles\guns\energy\stun.dm" +#include "code\modules\projectiles\guns\magic\arcane_barrage.dm" #include "code\modules\projectiles\guns\magic\staff.dm" #include "code\modules\projectiles\guns\magic\wand.dm" #include "code\modules\projectiles\guns\special\blastcannon.dm" #include "code\modules\projectiles\guns\special\chem_gun.dm" #include "code\modules\projectiles\guns\special\grenade_launcher.dm" +#include "code\modules\projectiles\guns\special\hand_of_midas.dm" #include "code\modules\projectiles\guns\special\meat_hook.dm" #include "code\modules\projectiles\guns\special\medbeam.dm" #include "code\modules\projectiles\guns\special\syringe_gun.dm" @@ -4623,6 +5089,7 @@ #include "code\modules\projectiles\projectile\bullets\cannonball.dm" #include "code\modules\projectiles\projectile\bullets\dart_syringe.dm" #include "code\modules\projectiles\projectile\bullets\dnainjector.dm" +#include "code\modules\projectiles\projectile\bullets\foam_dart.dm" #include "code\modules\projectiles\projectile\bullets\grenade.dm" #include "code\modules\projectiles\projectile\bullets\lmg.dm" #include "code\modules\projectiles\projectile\bullets\pistol.dm" @@ -4642,12 +5109,11 @@ #include "code\modules\projectiles\projectile\energy\stun.dm" #include "code\modules\projectiles\projectile\energy\tesla.dm" #include "code\modules\projectiles\projectile\energy\thermal.dm" -#include "code\modules\projectiles\projectile\reusable\_reusable.dm" -#include "code\modules\projectiles\projectile\reusable\foam_dart.dm" #include "code\modules\projectiles\projectile\special\curse.dm" #include "code\modules\projectiles\projectile\special\floral.dm" #include "code\modules\projectiles\projectile\special\gravity.dm" #include "code\modules\projectiles\projectile\special\ion.dm" +#include "code\modules\projectiles\projectile\special\lightbreaker.dm" #include "code\modules\projectiles\projectile\special\meteor.dm" #include "code\modules\projectiles\projectile\special\mindflayer.dm" #include "code\modules\projectiles\projectile\special\neurotoxin.dm" @@ -4675,11 +5141,9 @@ #include "code\modules\reagents\chemistry\machinery\pandemic.dm" #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\atmos_gas_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\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" @@ -4688,6 +5152,16 @@ #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\drinks\alcohol_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\drinks\drink_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\drinks\glass_styles\alcohol.dm" +#include "code\modules\reagents\chemistry\reagents\drinks\glass_styles\coffee_tea.dm" +#include "code\modules\reagents\chemistry\reagents\drinks\glass_styles\dairy.dm" +#include "code\modules\reagents\chemistry\reagents\drinks\glass_styles\juices.dm" +#include "code\modules\reagents\chemistry\reagents\drinks\glass_styles\mixed_alcohol.dm" +#include "code\modules\reagents\chemistry\reagents\drinks\glass_styles\mixed_drinks.dm" +#include "code\modules\reagents\chemistry\reagents\drinks\glass_styles\smoothies_shakes.dm" +#include "code\modules\reagents\chemistry\reagents\drinks\glass_styles\sodas.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" @@ -4746,7 +5220,6 @@ #include "code\modules\religion\sparring\sparring_datum.dm" #include "code\modules\requests\request.dm" #include "code\modules\requests\request_manager.dm" -#include "code\modules\research\bepis.dm" #include "code\modules\research\designs.dm" #include "code\modules\research\destructive_analyzer.dm" #include "code\modules\research\experimentor.dm" @@ -4856,6 +5329,11 @@ #include "code\modules\shuttle\supply.dm" #include "code\modules\shuttle\syndicate.dm" #include "code\modules\shuttle\white_ship.dm" +#include "code\modules\shuttle\shuttle_events\_shuttle_events.dm" +#include "code\modules\shuttle\shuttle_events\carp.dm" +#include "code\modules\shuttle\shuttle_events\meteors.dm" +#include "code\modules\shuttle\shuttle_events\misc.dm" +#include "code\modules\shuttle\shuttle_events\player_controlled.dm" #include "code\modules\spatial_grid\cell_tracker.dm" #include "code\modules\spells\spell.dm" #include "code\modules\spells\spell_types\madness_curse.dm" @@ -4874,6 +5352,7 @@ #include "code\modules\spells\spell_types\conjure\_conjure.dm" #include "code\modules\spells\spell_types\conjure\bees.dm" #include "code\modules\spells\spell_types\conjure\carp.dm" +#include "code\modules\spells\spell_types\conjure\cheese.dm" #include "code\modules\spells\spell_types\conjure\constructs.dm" #include "code\modules\spells\spell_types\conjure\creatures.dm" #include "code\modules\spells\spell_types\conjure\cult_turfs.dm" @@ -4882,6 +5361,7 @@ #include "code\modules\spells\spell_types\conjure\invisible_wall.dm" #include "code\modules\spells\spell_types\conjure\link_worlds.dm" #include "code\modules\spells\spell_types\conjure\presents.dm" +#include "code\modules\spells\spell_types\conjure\simian.dm" #include "code\modules\spells\spell_types\conjure\soulstone.dm" #include "code\modules\spells\spell_types\conjure\the_traps.dm" #include "code\modules\spells\spell_types\conjure_item\_conjure_item.dm" @@ -4954,8 +5434,8 @@ #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\ear_surgery.dm" +#include "code\modules\surgery\experimental_dissection.dm" #include "code\modules\surgery\eye_surgery.dm" #include "code\modules\surgery\gastrectomy.dm" #include "code\modules\surgery\healing.dm" @@ -4994,8 +5474,8 @@ #include "code\modules\surgery\advanced\bioware\vein_threading.dm" #include "code\modules\surgery\bodyparts\_bodyparts.dm" #include "code\modules\surgery\bodyparts\dismemberment.dm" -#include "code\modules\surgery\bodyparts\hair.dm" #include "code\modules\surgery\bodyparts\head.dm" +#include "code\modules\surgery\bodyparts\head_hair_and_lips.dm" #include "code\modules\surgery\bodyparts\helpers.dm" #include "code\modules\surgery\bodyparts\parts.dm" #include "code\modules\surgery\bodyparts\robot_bodyparts.dm" @@ -5008,32 +5488,36 @@ #include "code\modules\surgery\bodyparts\species_parts\moth_bodyparts.dm" #include "code\modules\surgery\bodyparts\species_parts\plasmaman_bodyparts.dm" #include "code\modules\surgery\organs\_organ.dm" -#include "code\modules\surgery\organs\appendix.dm" -#include "code\modules\surgery\organs\appendix_golem.dm" -#include "code\modules\surgery\organs\augments_arms.dm" -#include "code\modules\surgery\organs\augments_chest.dm" -#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\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\liver.dm" -#include "code\modules\surgery\organs\lungs.dm" -#include "code\modules\surgery\organs\organ_internal.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\_external_organ.dm" #include "code\modules\surgery\organs\external\restyling.dm" #include "code\modules\surgery\organs\external\spines.dm" #include "code\modules\surgery\organs\external\tails.dm" #include "code\modules\surgery\organs\external\wings\functional_wings.dm" #include "code\modules\surgery\organs\external\wings\moth_wings.dm" #include "code\modules\surgery\organs\external\wings\wings.dm" -#include "code\modules\surgery\organs\stomach\_stomach.dm" -#include "code\modules\surgery\organs\stomach\stomach_ethereal.dm" -#include "code\modules\surgery\organs\stomach\stomach_golem.dm" +#include "code\modules\surgery\organs\internal\_internal_organ.dm" +#include "code\modules\surgery\organs\internal\appendix\_appendix.dm" +#include "code\modules\surgery\organs\internal\appendix\appendix_golem.dm" +#include "code\modules\surgery\organs\internal\cyberimp\augments_arms.dm" +#include "code\modules\surgery\organs\internal\cyberimp\augments_chest.dm" +#include "code\modules\surgery\organs\internal\cyberimp\augments_eyes.dm" +#include "code\modules\surgery\organs\internal\cyberimp\augments_internal.dm" +#include "code\modules\surgery\organs\internal\ears\_ears.dm" +#include "code\modules\surgery\organs\internal\eyes\_eyes.dm" +#include "code\modules\surgery\organs\internal\heart\_heart.dm" +#include "code\modules\surgery\organs\internal\heart\heart_ethereal.dm" +#include "code\modules\surgery\organs\internal\liver\_liver.dm" +#include "code\modules\surgery\organs\internal\liver\liver_golem.dm" +#include "code\modules\surgery\organs\internal\liver\liver_plasmaman.dm" +#include "code\modules\surgery\organs\internal\liver\liver_skeleton.dm" +#include "code\modules\surgery\organs\internal\lungs\_lungs.dm" +#include "code\modules\surgery\organs\internal\stomach\_stomach.dm" +#include "code\modules\surgery\organs\internal\stomach\stomach_ethereal.dm" +#include "code\modules\surgery\organs\internal\stomach\stomach_golem.dm" +#include "code\modules\surgery\organs\internal\tongue\_tongue.dm" +#include "code\modules\surgery\organs\internal\vocal_cords\_vocal_cords.dm" #include "code\modules\tgchat\message.dm" #include "code\modules\tgchat\to_chat.dm" #include "code\modules\tgs\includes.dm" @@ -5050,6 +5534,7 @@ #include "code\modules\tgui\states\deep_inventory.dm" #include "code\modules\tgui\states\default.dm" #include "code\modules\tgui\states\fun.dm" +#include "code\modules\tgui\states\greyscale_menu.dm" #include "code\modules\tgui\states\hands.dm" #include "code\modules\tgui\states\human_adjacent.dm" #include "code\modules\tgui\states\inventory.dm" @@ -5087,6 +5572,7 @@ #include "code\modules\uplink\uplink_items\ammunition.dm" #include "code\modules\uplink\uplink_items\badass.dm" #include "code\modules\uplink\uplink_items\bundle.dm" +#include "code\modules\uplink\uplink_items\clownops.dm" #include "code\modules\uplink\uplink_items\dangerous.dm" #include "code\modules\uplink\uplink_items\device_tools.dm" #include "code\modules\uplink\uplink_items\explosive.dm" @@ -5114,6 +5600,7 @@ #include "code\modules\vehicles\wheelchair.dm" #include "code\modules\vehicles\cars\car.dm" #include "code\modules\vehicles\cars\clowncar.dm" +#include "code\modules\vehicles\cars\speedwagon.dm" #include "code\modules\vehicles\cars\vim.dm" #include "code\modules\vehicles\mecha\_mecha.dm" #include "code\modules\vehicles\mecha\mech_bay.dm" @@ -5139,16 +5626,17 @@ #include "code\modules\vehicles\mecha\combat\reticence.dm" #include "code\modules\vehicles\mecha\combat\savannah_ivanov.dm" #include "code\modules\vehicles\mecha\equipment\mecha_equipment.dm" +#include "code\modules\vehicles\mecha\equipment\tools\air_tank.dm" #include "code\modules\vehicles\mecha\equipment\tools\medical_tools.dm" #include "code\modules\vehicles\mecha\equipment\tools\mining_tools.dm" #include "code\modules\vehicles\mecha\equipment\tools\other_tools.dm" +#include "code\modules\vehicles\mecha\equipment\tools\radio.dm" #include "code\modules\vehicles\mecha\equipment\tools\work_tools.dm" #include "code\modules\vehicles\mecha\equipment\weapons\mecha_ammo.dm" #include "code\modules\vehicles\mecha\equipment\weapons\weapons.dm" #include "code\modules\vehicles\mecha\medical\odysseus.dm" #include "code\modules\vehicles\mecha\working\clarke.dm" #include "code\modules\vehicles\mecha\working\ripley.dm" -#include "code\modules\vehicles\mecha\working\working.dm" #include "code\modules\vending\_vending.dm" #include "code\modules\vending\assist.dm" #include "code\modules\vending\autodrobe.dm" @@ -5172,6 +5660,7 @@ #include "code\modules\vending\nutrimax.dm" #include "code\modules\vending\plasmaresearch.dm" #include "code\modules\vending\robotics.dm" +#include "code\modules\vending\runic_vendor.dm" #include "code\modules\vending\security.dm" #include "code\modules\vending\snack.dm" #include "code\modules\vending\sovietsoda.dm" @@ -5180,6 +5669,7 @@ #include "code\modules\vending\wardrobes.dm" #include "code\modules\vending\youtool.dm" #include "code\modules\visuals\render_steps.dm" +#include "code\modules\wiremod\components\abstract\assoc_list_variable.dm" #include "code\modules\wiremod\components\abstract\compare.dm" #include "code\modules\wiremod\components\abstract\equpiment_action.dm" #include "code\modules\wiremod\components\abstract\list_variable.dm" @@ -5227,21 +5717,20 @@ #include "code\modules\wiremod\components\id\getter.dm" #include "code\modules\wiremod\components\id\info_reader.dm" #include "code\modules\wiremod\components\list\assoc_list_pick.dm" +#include "code\modules\wiremod\components\list\assoc_list_remove.dm" +#include "code\modules\wiremod\components\list\assoc_list_set.dm" #include "code\modules\wiremod\components\list\assoc_literal.dm" #include "code\modules\wiremod\components\list\concat.dm" #include "code\modules\wiremod\components\list\filter.dm" #include "code\modules\wiremod\components\list\foreach.dm" #include "code\modules\wiremod\components\list\format.dm" -#include "code\modules\wiremod\components\list\get_column.dm" #include "code\modules\wiremod\components\list\index.dm" -#include "code\modules\wiremod\components\list\index_table.dm" #include "code\modules\wiremod\components\list\list_add.dm" #include "code\modules\wiremod\components\list\list_clear.dm" -#include "code\modules\wiremod\components\list\list_in.dm" +#include "code\modules\wiremod\components\list\list_find.dm" #include "code\modules\wiremod\components\list\list_literal.dm" #include "code\modules\wiremod\components\list\list_pick.dm" #include "code\modules\wiremod\components\list\list_remove.dm" -#include "code\modules\wiremod\components\list\select.dm" #include "code\modules\wiremod\components\list\split.dm" #include "code\modules\wiremod\components\math\arithmetic.dm" #include "code\modules\wiremod\components\math\binary_conversion.dm" @@ -5262,6 +5751,9 @@ #include "code\modules\wiremod\components\string\textcase.dm" #include "code\modules\wiremod\components\string\tonumber.dm" #include "code\modules\wiremod\components\string\tostring.dm" +#include "code\modules\wiremod\components\table\get_column.dm" +#include "code\modules\wiremod\components\table\index_table.dm" +#include "code\modules\wiremod\components\table\select.dm" #include "code\modules\wiremod\components\utility\clock.dm" #include "code\modules\wiremod\components\utility\delay.dm" #include "code\modules\wiremod\components\utility\router.dm" @@ -5314,9 +5806,14 @@ #include "code\modules\zombie\items.dm" #include "code\modules\zombie\organs.dm" #include "code\ze_genesis_call\genesis_call.dm" -#include "interface\fonts.dm" #include "interface\interface.dm" #include "interface\menu.dm" #include "interface\stylesheet.dm" #include "interface\skin.dmf" +#include "interface\fonts\fonts_datum.dm" +#include "interface\fonts\grand_9k.dm" +#include "interface\fonts\pixellari.dm" +#include "interface\fonts\spess_font.dm" +#include "interface\fonts\tiny_unicode.dm" +#include "interface\fonts\vcr_osd_mono.dm" // END_INCLUDE diff --git a/tgui/packages/tgui-panel/chat/renderer.js b/tgui/packages/tgui-panel/chat/renderer.js index f7ce9277cf688..7a528cd4fd75b 100644 --- a/tgui/packages/tgui-panel/chat/renderer.js +++ b/tgui/packages/tgui-panel/chat/renderer.js @@ -193,6 +193,7 @@ class ChatRenderer { const matchWord = setting.matchWord; const matchCase = setting.matchCase; const allowedRegex = /^[a-z0-9_\-$/^[\s\]\\]+$/gi; + const regexEscapeCharacters = /[!#$%^&*)(+=.<>{}[\]:;'"|~`_\-\\/]/g; const lines = String(text) .split(',') .map((str) => str.trim()) @@ -228,19 +229,29 @@ class ChatRenderer { if (!highlightWords) { highlightWords = []; } + // We're not going to let regex characters fuck up our RegEx operation. + line = line.replace(regexEscapeCharacters, '\\$&'); + highlightWords.push(line); } } const regexStr = regexExpressions.join('|'); const flags = 'g' + (matchCase ? '' : 'i'); - // setting regex overrides matchword - if (regexStr) { - highlightRegex = new RegExp('(' + regexStr + ')', flags); - } else { - const pattern = `${matchWord ? '\\b' : ''}(${lines.join('|')})${ - matchWord ? '\\b' : '' - }`; - highlightRegex = new RegExp(pattern, flags); + // We wrap this in a try-catch to ensure that broken regex doesn't break + // the entire chat. + try { + // setting regex overrides matchword + if (regexStr) { + highlightRegex = new RegExp('(' + regexStr + ')', flags); + } else { + const pattern = `${matchWord ? '\\b' : ''}(${highlightWords.join( + '|' + )})${matchWord ? '\\b' : ''}`; + highlightRegex = new RegExp(pattern, flags); + } + } catch { + // We just reset it if it's invalid. + highlightRegex = null; } // Lazy init if (!this.highlightParsers) { diff --git a/tgui/packages/tgui-panel/settings/middleware.js b/tgui/packages/tgui-panel/settings/middleware.js index 705d7a89f3b4a..cef082213db6f 100644 --- a/tgui/packages/tgui-panel/settings/middleware.js +++ b/tgui/packages/tgui-panel/settings/middleware.js @@ -10,16 +10,39 @@ import { loadSettings, updateSettings, addHighlightSetting, removeHighlightSetti import { selectSettings } from './selectors'; import { FONTS_DISABLED } from './constants'; +let overrideRule = null; +let overrideFontFamily = null; +let overrideFontSize = null; + +const updateGlobalOverrideRule = () => { + let fontFamily = ''; + + if (overrideFontFamily !== null) { + fontFamily = `font-family: ${overrideFontFamily} !important;`; + } + + const constructedRule = `body * :not(.Icon) { + ${fontFamily} + }`; + + if (overrideRule === null) { + overrideRule = document.createElement('style'); + document.querySelector('head').append(overrideRule); + } + + // no other way to force a CSS refresh other than to update its innerText + overrideRule.innerText = constructedRule; + + document.body.style.setProperty('font-size', overrideFontSize); +}; + const setGlobalFontSize = (fontSize) => { - document.documentElement.style.setProperty('font-size', fontSize + 'px'); - document.body.style.setProperty('font-size', fontSize + 'px'); + overrideFontSize = `${fontSize}px`; }; const setGlobalFontFamily = (fontFamily) => { if (fontFamily === FONTS_DISABLED) fontFamily = null; - - document.documentElement.style.setProperty('font-family', fontFamily); - document.body.style.setProperty('font-family', fontFamily); + overrideFontFamily = fontFamily; }; export const settingsMiddleware = (store) => { @@ -50,6 +73,7 @@ export const settingsMiddleware = (store) => { // Update global UI font size setGlobalFontSize(settings.fontSize); setGlobalFontFamily(settings.fontFamily); + updateGlobalOverrideRule(); // Save settings to the web storage storage.set('panel-settings', settings); return; diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss index 9e7b190f99c6c..09d6c93f4974b 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss @@ -534,6 +534,10 @@ em { } .blob { + color: #ee4000; +} + +.blobannounce { color: #556b2f; font-weight: bold; font-size: 185%; @@ -854,6 +858,15 @@ em { color: #298f85; } +.upside_down { + display: inline; + -moz-transform: scale(-1, -1); + -webkit-transform: scale(-1, -1); + -o-transform: scale(-1, -1); + -ms-transform: scale(-1, -1); + transform: scale(-1, -1); +} + .connectionClosed, .fatalError { background: red; diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss index c55ba0a060b45..60654f76e967c 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss @@ -593,6 +593,10 @@ h2.alert { } .blob { + color: #ee4000; +} + +.blobannounce { color: #323f1c; font-weight: bold; font-size: 185%; @@ -886,6 +890,15 @@ h2.alert { color: #298f85; } +.upside_down { + display: inline; + -moz-transform: scale(-1, -1); + -webkit-transform: scale(-1, -1); + -o-transform: scale(-1, -1); + -ms-transform: scale(-1, -1); + transform: scale(-1, -1); +} + .connectionClosed, .fatalError { background: red; diff --git a/tgui/packages/tgui/backend.ts b/tgui/packages/tgui/backend.ts index fb77a61e3cda4..dd4cae9e62279 100644 --- a/tgui/packages/tgui/backend.ts +++ b/tgui/packages/tgui/backend.ts @@ -146,6 +146,14 @@ export const backendMiddleware = (store) => { globalEvents.emit('byond/mouseup'); } + if (type === 'byond/ctrldown') { + globalEvents.emit('byond/ctrldown'); + } + + if (type === 'byond/ctrlup') { + globalEvents.emit('byond/ctrlup'); + } + if (type === 'backend/suspendStart' && !suspendInterval) { logger.log(`suspending (${Byond.windowId})`); // Keep sending suspend messages until it succeeds. diff --git a/tgui/packages/tgui/interfaces/AccountingConsole.tsx b/tgui/packages/tgui/interfaces/AccountingConsole.tsx index ad1aa05e0b508..25cc40cd8a33e 100644 --- a/tgui/packages/tgui/interfaces/AccountingConsole.tsx +++ b/tgui/packages/tgui/interfaces/AccountingConsole.tsx @@ -1,4 +1,4 @@ -import { BlockQuote, Collapsible, LabeledList, Modal, Section, Stack, Tabs } from '../components'; +import { BlockQuote, Collapsible, Modal, Section, Stack, Tabs } from '../components'; import { useBackend } from '../backend'; import { useLocalState } from '../backend'; import { Window } from '../layouts'; @@ -73,18 +73,20 @@ const UsersScreen = (props, context) => { return (
    {PlayerAccounts.map((account) => ( - - - - {account.job} - - - {account.balance} - - - {account.modifier * 100}% - - + + +
    + + {account.balance} credit balance + + + Employee has {account.modifier * 100}% pay modifier + +
    +
    ))}
    diff --git a/tgui/packages/tgui/interfaces/Achievements.js b/tgui/packages/tgui/interfaces/Achievements.js index 6ddb12427ceda..1ab38ca3655bf 100644 --- a/tgui/packages/tgui/interfaces/Achievements.js +++ b/tgui/packages/tgui/interfaces/Achievements.js @@ -1,5 +1,5 @@ import { useBackend, useLocalState } from '../backend'; -import { Box, Flex, Icon, Table, Tabs } from '../components'; +import { Box, Flex, Icon, Table, Tabs, Tooltip } from '../components'; import { Window } from '../layouts'; export const Achievements = (props, context) => { @@ -52,7 +52,15 @@ const AchievementTable = (props, context) => { const Achievement = (props) => { const { achievement } = props; - const { name, desc, icon_class, value, score } = achievement; + const { + name, + desc, + icon_class, + value, + score, + achieve_info, + achieve_tooltip, + } = achievement; return ( @@ -70,6 +78,13 @@ const Achievement = (props) => { {value ? 'Unlocked' : 'Locked'} )} + {!!achieve_info && ( + + + {achieve_info} + + + )} ); diff --git a/tgui/packages/tgui/interfaces/AdminFax.js b/tgui/packages/tgui/interfaces/AdminFax.js index e91130baf394f..46e1261592214 100644 --- a/tgui/packages/tgui/interfaces/AdminFax.js +++ b/tgui/packages/tgui/interfaces/AdminFax.js @@ -91,7 +91,7 @@ export const FaxMainPanel = (props, context) => { icon="n" mr="7px" width="49%" - onClick={() => setPaperName('Nanotrasen Offical Report')}> + onClick={() => setPaperName('Nanotrasen Official Report')}> Nanotrasen
    - {!!design.mult5 && ( - - )} - - {!!design.mult10 && ( - - )} - - {!!design.mult25 && ( - - )} - - {!!design.mult50 && ( - - )} + + +
    { + const { data } = useBackend(context); + const { help_text = DEFAULT_HELP } = data; + + return ( + + + + +
    + {help_text} +
    +
    + + + + + {[0, 1].map((i) => ( + + ))} + + + + + {[2, 3].map((i) => ( + + ))} + + + + + {[4, 5].map((i) => ( + + ))} + + + + +
    +
    +
    + ); +}; + +// I wish I had media queries +const BoxHelp = (props: { index: number }, context) => { + const { index } = props; + + return ( + +
    + + {boxHelp[index].title} + + }> + {boxHelp[index].text} +
    +
    + ); +}; diff --git a/tgui/packages/tgui/interfaces/Bepis.tsx b/tgui/packages/tgui/interfaces/Bepis.tsx deleted file mode 100644 index d2835e530d362..0000000000000 --- a/tgui/packages/tgui/interfaces/Bepis.tsx +++ /dev/null @@ -1,130 +0,0 @@ -import { BooleanLike } from 'common/react'; -import { useBackend } from '../backend'; -import { Box, Button, Grid, LabeledList, NumberInput, Section } from '../components'; -import { Window } from '../layouts'; - -type Data = { - amount: number; - account_owner: string; - manual_power: BooleanLike; - stored_cash: number; - accuracy_percentage: number; - positive_cash_offset: number; - negative_cash_offset: number; - silicon_check: BooleanLike; - success_estimate: number; - mean_value: number; - error_name: string; -}; - -const BEPIS_SLOGAN = `All you need to know about the B.E.P.I.S. and you! The -B.E.P.I.S. performs hundreds of tests a second using -electrical and financial resources to invent new products, -or discover new technologies otherwise overlooked for being -too risky or too niche to produce!`; - -export const Bepis = (props, context) => { - const { act, data } = useBackend(context); - const { - amount, - account_owner, - manual_power, - stored_cash, - accuracy_percentage, - positive_cash_offset, - negative_cash_offset, - silicon_check, - success_estimate, - mean_value, - error_name, - } = data; - - return ( - - -
    -
    act('toggle_power')} - /> - }> - {BEPIS_SLOGAN} -
    -
    act('account_reset')} - /> - }> - Console is currently being operated by{' '} - {account_owner ? account_owner : 'no one'}. -
    - - -
    - - - {stored_cash} - - - {accuracy_percentage}% - - - {positive_cash_offset} - - - {negative_cash_offset} - - - - act('amount', { - amount: value, - }) - } - /> - - -
    - -
    -
    -
    - ); -}; diff --git a/tgui/packages/tgui/interfaces/CameraConsole.js b/tgui/packages/tgui/interfaces/CameraConsole.js deleted file mode 100644 index 57cc34e77e18c..0000000000000 --- a/tgui/packages/tgui/interfaces/CameraConsole.js +++ /dev/null @@ -1,137 +0,0 @@ -import { filter, sortBy } from 'common/collections'; -import { flow } from 'common/fp'; -import { classes } from 'common/react'; -import { createSearch } from 'common/string'; -import { useBackend, useLocalState } from '../backend'; -import { Button, ByondUi, Flex, Input, Section } from '../components'; -import { Window } from '../layouts'; - -/** - * Returns previous and next camera names relative to the currently - * active camera. - */ -export const prevNextCamera = (cameras, activeCamera) => { - if (!activeCamera) { - return []; - } - const index = cameras.findIndex( - (camera) => camera.name === activeCamera.name - ); - return [cameras[index - 1]?.name, cameras[index + 1]?.name]; -}; - -/** - * Camera selector. - * - * Filters cameras, applies search terms and sorts the alphabetically. - */ -export const selectCameras = (cameras, searchText = '') => { - const testSearch = createSearch(searchText, (camera) => camera.name); - return flow([ - // Null camera filter - filter((camera) => camera?.name), - // Optional search term - searchText && filter(testSearch), - // Slightly expensive, but way better than sorting in BYOND - sortBy((camera) => camera.name), - ])(cameras); -}; - -export const CameraConsole = (props, context) => { - const { act, data } = useBackend(context); - const { mapRef, activeCamera } = data; - const cameras = selectCameras(data.cameras); - const [prevCameraName, nextCameraName] = prevNextCamera( - cameras, - activeCamera - ); - return ( - -
    - - - -
    -
    -
    - Camera: - {(activeCamera && activeCamera.name) || '—'} -
    -
    -
    - -
    -
    - ); -}; - -export const CameraConsoleContent = (props, context) => { - const { act, data } = useBackend(context); - const [searchText, setSearchText] = useLocalState(context, 'searchText', ''); - const { activeCamera } = data; - const cameras = selectCameras(data.cameras, searchText); - return ( - - - setSearchText(value)} - /> - - -
    - {cameras.map((camera) => ( - // We're not using the component here because performance - // would be absolutely abysmal (50+ ms for each re-render). -
    - act('switch_camera', { - name: camera.name, - }) - }> - {camera.name} -
    - ))} -
    -
    -
    - ); -}; diff --git a/tgui/packages/tgui/interfaces/CameraConsole.tsx b/tgui/packages/tgui/interfaces/CameraConsole.tsx new file mode 100644 index 0000000000000..b1077f6bdcb59 --- /dev/null +++ b/tgui/packages/tgui/interfaces/CameraConsole.tsx @@ -0,0 +1,199 @@ +import { filter, sortBy } from 'common/collections'; +import { flow } from 'common/fp'; +import { BooleanLike, classes } from 'common/react'; +import { createSearch } from 'common/string'; +import { useBackend, useLocalState } from '../backend'; +import { Button, ByondUi, Input, NoticeBox, Section, Stack } from '../components'; +import { Window } from '../layouts'; + +type Data = { + can_spy: BooleanLike; + mapRef: string; + cameras: Camera[]; + activeCamera: Camera & { status: BooleanLike }; + network: string[]; +}; + +type Camera = { + name: string; +}; + +/** + * Returns previous and next camera names relative to the currently + * active camera. + */ +const prevNextCamera = ( + cameras: Camera[], + activeCamera: Camera & { status: BooleanLike } +) => { + if (!activeCamera) { + return []; + } + const index = cameras.findIndex( + (camera) => camera?.name === activeCamera.name + ); + return [cameras[index - 1]?.name, cameras[index + 1]?.name]; +}; + +/** + * Camera selector. + * + * Filters cameras, applies search terms and sorts the alphabetically. + */ +const selectCameras = (cameras: Camera[], searchText = ''): Camera[] => { + const testSearch = createSearch(searchText, (camera: Camera) => camera.name); + + return flow([ + // Null camera filter + filter((camera: Camera) => !!camera?.name), + // Optional search term + searchText && filter(testSearch), + // Slightly expensive, but way better than sorting in BYOND + sortBy((camera: Camera) => camera.name), + ])(cameras); +}; + +export const CameraConsole = (props, context) => { + return ( + + + + + + ); +}; + +export const CameraContent = (props, context) => { + return ( + + + + + + + + + ); +}; + +const CameraSelector = (props, context) => { + const { act, data } = useBackend(context); + const [searchText, setSearchText] = useLocalState(context, 'searchText', ''); + const { activeCamera } = data; + const cameras = selectCameras(data.cameras, searchText); + + return ( + + + setSearchText(value)} + /> + + +
    + {cameras.map((camera) => ( + // We're not using the component here because performance + // would be absolutely abysmal (50+ ms for each re-render). +
    + act('switch_camera', { + name: camera.name, + }) + }> + {camera.name} +
    + ))} +
    +
    +
    + ); +}; + +const CameraControls = (props, context) => { + const { act, data } = useBackend(context); + const { activeCamera, can_spy, mapRef } = data; + const cameras = selectCameras(data.cameras); + + const [prevCameraName, nextCameraName] = prevNextCamera( + cameras, + activeCamera + ); + + return ( +
    + + + + + {activeCamera?.name ? ( + {activeCamera.name} + ) : ( + No input signal + )} + + + + {!!can_spy && ( +
    + ); +}; diff --git a/tgui/packages/tgui/interfaces/Canvas.tsx b/tgui/packages/tgui/interfaces/Canvas.tsx index 40155c0886972..1dddec2e9073c 100644 --- a/tgui/packages/tgui/interfaces/Canvas.tsx +++ b/tgui/packages/tgui/interfaces/Canvas.tsx @@ -264,13 +264,13 @@ export const Canvas = (props, context) => { { const { self_paid, app_cost } = data; const supplies = Object.values(data.supplies); + const { amount_by_name = [], max_order } = data; const [activeSupplyName, setActiveSupplyName] = useSharedState( context, @@ -264,10 +265,10 @@ export const CargoCatalog = (props, context) => { fluid tooltip={pack.desc} tooltipPosition="left" + disabled={(amount_by_name[pack.name] || 0) >= max_order} onClick={() => act('add', { id: pack.id, - amount: 1, }) }> {formatMoney( @@ -398,7 +399,15 @@ const CartHeader = (props, context) => { const CargoCart = (props, context) => { const { act, data } = useBackend(context); - const { requestonly, away, docked, location, can_send } = data; + const { + requestonly, + away, + docked, + location, + can_send, + amount_by_name, + max_order, + } = data; const cart = data.cart || []; return (
    @@ -416,7 +425,7 @@ const CargoCart = (props, context) => { act('modify', { @@ -431,6 +440,7 @@ const CargoCart = (props, context) => { {!!can_send && !!entry.can_be_cancelled && (
    - - - - - ); -}; diff --git a/tgui/packages/tgui/interfaces/ChemMixingChamber.tsx b/tgui/packages/tgui/interfaces/ChemMixingChamber.tsx new file mode 100644 index 0000000000000..30a41de8080bd --- /dev/null +++ b/tgui/packages/tgui/interfaces/ChemMixingChamber.tsx @@ -0,0 +1,164 @@ +import { useBackend, useLocalState } from '../backend'; +import { AnimatedNumber, Box, Button, NumberInput, Section, Stack } from '../components'; +import { Window } from '../layouts'; +import { round, toFixed } from 'common/math'; +import { BooleanLike } from 'common/react'; + +type Reagent = { + name: string; + volume: number; +}; + +export type MixingData = { + reagents: Reagent[]; + emptying: BooleanLike; + temperature: number; + targetTemp: number; + isReacting: BooleanLike; +}; + +export const ChemMixingChamber = (props, context) => { + const { act, data } = useBackend(context); + + const [reagentName, setReagentName] = useLocalState( + context, + 'reagentName', + '' + ); + const [reagentQuantity, setReagentQuantity] = useLocalState( + context, + 'reagentQuantity', + 1 + ); + + const { emptying, temperature, targetTemp, isReacting } = data; + const reagents = data.reagents || []; + return ( + + + + +
    + {'Target:'} + + + act('temperature', { + target: value, + }) + } + /> + + + }> + + + + + Current Temperature: + + + toFixed(value) + ' K'} + /> + + + + +
    +
    + +
    + {'Reacting'} + + )) || ( + + {emptying ? 'Emptying' : 'Filling'} + + ) + }> + + + + +
    +
    +
    +
    +
    + ); +}; diff --git a/tgui/packages/tgui/interfaces/ChemReactionChamber.js b/tgui/packages/tgui/interfaces/ChemReactionChamber.js deleted file mode 100644 index a46c3acd97ba9..0000000000000 --- a/tgui/packages/tgui/interfaces/ChemReactionChamber.js +++ /dev/null @@ -1,233 +0,0 @@ -import { useBackend, useLocalState } from '../backend'; -import { AnimatedNumber, Box, Button, LabeledList, NumberInput, Section, RoundGauge, Stack } from '../components'; -import { Window } from '../layouts'; -import { round, toFixed } from 'common/math'; - -export const ChemReactionChamber = (props, context) => { - const { act, data } = useBackend(context); - - const [reagentQuantity, setReagentQuantity] = useLocalState( - context, - 'reagentQuantity', - 1 - ); - - const { - emptying, - temperature, - ph, - targetTemp, - isReacting, - reagentAcidic, - reagentAlkaline, - } = data; - const reagents = data.reagents || []; - return ( - - - - -
    - {'Target:'} - - - act('temperature', { - target: value, - }) - } - /> - - - }> - - - - - Current Temperature: - - - toFixed(value) + ' K'} - /> - - - null} - position="absolute" - size={1.5} - top={0.5} - right={0.5} - ranges={{ - 'red': [-0.22, 1.5], - 'orange': [1.5, 3], - 'yellow': [3, 4.5], - 'olive': [4.5, 5], - 'good': [5, 6], - 'green': [6, 8.5], - 'teal': [8.5, 9.5], - 'blue': [9.5, 11], - 'purple': [11, 12.5], - 'violet': [12.5, 14], - }} - /> - - - - - - {'ph:'} - {ph} - -
    -
    - -
    - {'Reacting'} - - )) || ( - - {emptying ? 'Emptying' : 'Filling'} - - ) - }> - - - - - - act('acidic', { - target: value, - }) - } - /> - - - - act('alkaline', { - target: value, - }) - } - /> - - - - - - - -
    -
    -
    -
    -
    - ); -}; diff --git a/tgui/packages/tgui/interfaces/ChemReactionChamber.tsx b/tgui/packages/tgui/interfaces/ChemReactionChamber.tsx new file mode 100644 index 0000000000000..7c382f326db73 --- /dev/null +++ b/tgui/packages/tgui/interfaces/ChemReactionChamber.tsx @@ -0,0 +1,240 @@ +import { useBackend, useLocalState } from '../backend'; +import { AnimatedNumber, Box, Button, LabeledList, NumberInput, Section, RoundGauge, Stack } from '../components'; +import { Window } from '../layouts'; +import { round, toFixed } from 'common/math'; +import { MixingData } from './ChemMixingChamber'; + +type ReactingData = MixingData & { + ph: number; + reagentAcidic: number; + reagentAlkaline: number; +}; + +export const ChemReactionChamber = (props, context) => { + const { act, data } = useBackend(context); + + const [reagentQuantity, setReagentQuantity] = useLocalState( + context, + 'reagentQuantity', + 1 + ); + + const { + emptying, + temperature, + ph, + targetTemp, + isReacting, + reagentAcidic, + reagentAlkaline, + } = data; + const reagents = data.reagents || []; + return ( + + + + +
    + {'Target:'} + + + act('temperature', { + target: value, + }) + } + /> + + + }> + + + + + Current Temperature: + + + toFixed(value) + ' K'} + /> + + + null} + position="absolute" + size={1.5} + top={0.5} + right={0.5} + ranges={{ + 'red': [-0.22, 1.5], + 'orange': [1.5, 3], + 'yellow': [3, 4.5], + 'olive': [4.5, 5], + 'good': [5, 6], + 'green': [6, 8.5], + 'teal': [8.5, 9.5], + 'blue': [9.5, 11], + 'purple': [11, 12.5], + 'violet': [12.5, 14], + }} + /> + + + + + + {'ph:'} + {ph} + +
    +
    + +
    + {'Reacting'} + + )) || ( + + {emptying ? 'Emptying' : 'Filling'} + + ) + }> + + + + + + act('acidic', { + target: value, + }) + } + /> + + + + act('alkaline', { + target: value, + }) + } + /> + + + + + + + +
    +
    +
    +
    +
    + ); +}; diff --git a/tgui/packages/tgui/interfaces/CommandReport.tsx b/tgui/packages/tgui/interfaces/CommandReport.tsx index 8ec0a6f8949a1..f299e25a70981 100644 --- a/tgui/packages/tgui/interfaces/CommandReport.tsx +++ b/tgui/packages/tgui/interfaces/CommandReport.tsx @@ -10,6 +10,7 @@ type Data = { command_report_content: string; custom_name: string; played_sound: string; + print_report: string; }; export const CommandReport = () => { @@ -94,7 +95,7 @@ const AnnouncementSound = (props, context) => { /** Creates the report textarea with a submit button. */ const ReportText = (props, context) => { const { act, data } = useBackend(context); - const { announce_contents, command_report_content } = data; + const { announce_contents, print_report, command_report_content } = data; const [commandReport, setCommandReport] = useLocalState( context, 'textArea', @@ -117,6 +118,18 @@ const ReportText = (props, context) => { onClick={() => act('toggle_announce')}> Announce Contents + act('toggle_printing')} + tooltip={ + !announce_contents && + "Printing the report is required since we aren't announcing its contents." + } + tooltipPosition="top"> + Print Report + !shuttle.emagOnly, - (shuttle) => shuttle.creditCost + (shuttle) => shuttle.initial_cost ); const AlertButton = (props, context) => { @@ -193,9 +193,14 @@ const PageBuyingShuttle = (props, context) => { /> }> {shuttle.description} - {shuttle.prerequisites ? ( - Prerequisites: {shuttle.prerequisites} - ) : null} + + Occupancy Limit: {shuttle.occupancy_limit} + + + {shuttle.prerequisites ? ( + Prerequisites: {shuttle.prerequisites} + ) : null} + ))} diff --git a/tgui/packages/tgui/interfaces/ComponentPrinter.tsx b/tgui/packages/tgui/interfaces/ComponentPrinter.tsx index 02960e655f810..6ef81d0852f3b 100644 --- a/tgui/packages/tgui/interfaces/ComponentPrinter.tsx +++ b/tgui/packages/tgui/interfaces/ComponentPrinter.tsx @@ -12,16 +12,17 @@ import { MaterialAccessBar } from './Fabrication/MaterialAccessBar'; type ComponentPrinterData = { designs: Record; materials: Material[]; + SHEET_MATERIAL_AMOUNT: number; }; export const ComponentPrinter = (props, context) => { const { act, data } = useBackend(context); - const { designs, materials } = data; + const { materials, designs, SHEET_MATERIAL_AMOUNT } = data; // Reduce the material count array to a map of actually available materials. const availableMaterials: MaterialMap = {}; - for (const material of data.materials) { + for (const material of materials) { availableMaterials[material.name] = material.amount; } @@ -37,13 +38,20 @@ export const ComponentPrinter = (props, context) => { design, availableMaterials, _onPrintDesign - ) => } + ) => ( + + )} />
    act('remove_mat', { ref: material.ref, amount }) } @@ -56,9 +64,15 @@ export const ComponentPrinter = (props, context) => { ); }; -const Recipe = (props: { design: Design; available: MaterialMap }, context) => { - const { act, data } = useBackend(context); - const { design, available } = props; +type RecipeProps = { + design: Design; + available: MaterialMap; + SHEET_MATERIAL_AMOUNT: number; +}; + +const Recipe = (props: RecipeProps, context) => { + const { act } = useBackend(context); + const { design, available, SHEET_MATERIAL_AMOUNT } = props; const canPrint = !Object.entries(design.cost).some( ([material, amount]) => @@ -82,6 +96,7 @@ const Recipe = (props: { design: Design; available: MaterialMap }, context) => { }> @@ -90,7 +105,9 @@ const Recipe = (props: { design: Design; available: MaterialMap }, context) => { 'FabricatorRecipe__Title', !canPrint && 'FabricatorRecipe__Title--disabled', ])} - onClick={() => act('print', { designId: design.id, amount: 1 })}> + onClick={() => + canPrint && act('print', { designId: design.id, amount: 1 }) + }>
    { - const { act, data } = useBackend(context); - return ( - - -
    - Your perfect device, only three steps away... -
    - {data.state !== 0 && ( -
    - ); -}; - -const CfStep2 = (props, context) => { - const { act, data } = useBackend(context); - return ( -
    - {data.totalprice} cr - - }> - - - - - Hard Drive: - - - -
    -
    - ); -}; - -const CfStep3 = (props, context) => { - const { act, data } = useBackend(context); - return ( -
    - - Your device is ready for fabrication... - - - Please insert the required{' '} - - {data.totalprice} cr - - - - Current: - - = data.totalprice ? 'good' : 'bad'}> - {data.credits} cr - -
    - ); -}; - -const CfStep4 = (props, context) => { - return ( -
    - - Thank you for your purchase! - - - If you experience any difficulties with your new device, please contact - your local network administrator. - -
    - ); -}; diff --git a/tgui/packages/tgui/interfaces/CrewConsole.js b/tgui/packages/tgui/interfaces/CrewConsole.js index 58e99dd9c9e8f..937ff9c1baf22 100644 --- a/tgui/packages/tgui/interfaces/CrewConsole.js +++ b/tgui/packages/tgui/interfaces/CrewConsole.js @@ -13,14 +13,8 @@ const HEALTH_COLOR_BY_LEVEL = [ '#801308', ]; -const HEALTH_ICON_BY_LEVEL = [ - 'heart', - 'heart', - 'heart', - 'heart', - 'heartbeat', - 'skull', -]; +const STAT_LIVING = 0; +const STAT_DEAD = 4; const jobIsHead = (jobId) => jobId % 10 === 0; @@ -49,6 +43,16 @@ const jobToColor = (jobId) => { return COLORS.department.other; }; +const statToIcon = (life_status) => { + switch (life_status) { + case STAT_LIVING: + return 'heart'; + case STAT_DEAD: + return 'skull'; + } + return 'heartbeat'; +}; + const healthToAttribute = (oxy, tox, burn, brute, attributeList) => { const healthSum = oxy + tox + burn + brute; const level = Math.min(Math.max(Math.ceil(healthSum / 25), 0), 5); @@ -129,13 +133,7 @@ const CrewTableEntry = (props, context) => { {oxydam !== undefined ? ( { )} size={1} /> - ) : life_status ? ( + ) : life_status !== STAT_DEAD ? ( ) : ( @@ -162,7 +160,7 @@ const CrewTableEntry = (props, context) => { {'/'} - ) : life_status ? ( + ) : life_status !== STAT_DEAD ? ( 'Alive' ) : ( 'Dead' diff --git a/tgui/packages/tgui/interfaces/ExosuitFabricator.tsx b/tgui/packages/tgui/interfaces/ExosuitFabricator.tsx index 48d0b8c7957d3..7b4c8d14056fb 100644 --- a/tgui/packages/tgui/interfaces/ExosuitFabricator.tsx +++ b/tgui/packages/tgui/interfaces/ExosuitFabricator.tsx @@ -1,4 +1,3 @@ -import { Fragment } from 'inferno'; import { useBackend } from '../backend'; import { Box, Button, Section, Stack, Icon } from '../components'; import { Window } from '../layouts'; @@ -15,10 +14,11 @@ type ExosuitFabricatorData = FabricatorData & { export const ExosuitFabricator = (props, context) => { const { act, data } = useBackend(context); + const { materials, SHEET_MATERIAL_AMOUNT } = data; const availableMaterials: MaterialMap = {}; - for (const material of data.materials) { + for (const material of materials) { availableMaterials[material.name] = material.amount; } @@ -33,7 +33,11 @@ export const ExosuitFabricator = (props, context) => { designs={Object.values(data.designs)} availableMaterials={availableMaterials} buildRecipeElement={(design, availableMaterials) => ( - + )} categoryButtons={(category) => (
    ); diff --git a/tgui/packages/tgui/interfaces/FishCatalog.tsx b/tgui/packages/tgui/interfaces/FishCatalog.tsx index 4718e2a094b19..0c9ba7ceb3c2f 100644 --- a/tgui/packages/tgui/interfaces/FishCatalog.tsx +++ b/tgui/packages/tgui/interfaces/FishCatalog.tsx @@ -96,7 +96,7 @@ export const FishCatalog = (props, context) => { {currentFish.weight} g - + {currentFish.fishing_tips.spots} diff --git a/tgui/packages/tgui/interfaces/Fishing.tsx b/tgui/packages/tgui/interfaces/Fishing.tsx deleted file mode 100644 index ba0196735f780..0000000000000 --- a/tgui/packages/tgui/interfaces/Fishing.tsx +++ /dev/null @@ -1,443 +0,0 @@ -import { clamp } from 'common/math'; -import { randomInteger, randomNumber, randomPick, randomProb } from 'common/random'; -import { useDispatch } from 'common/redux'; -import { Component } from 'inferno'; -import { resolveAsset } from '../assets'; -import { backendSuspendStart, useBackend } from '../backend'; -import { Icon } from '../components'; -import { globalEvents } from '../events'; -import { Window } from '../layouts'; - -type Bait = { - position: number; - height: number; - velocity: number; -}; - -type Fish = { - position: number; - height: number; - velocity: number; - target: number | null; -}; - -type FishAI = 'dumb' | 'zippy' | 'slow'; - -enum ReelingState { - Idle, - Reeling, -} - -type FishingMinigameProps = { - difficulty: number; - fish_ai: FishAI; - special_rules: SpecialRule[]; - background: string; - win: (perfect: boolean) => void; - lose: () => void; -}; - -type FishingMinigameState = { - completion: number; - bait: Bait; - fish: Fish; -}; - -type SpecialRule = 'weighted' | 'limit_loss' | 'heavy'; - -class FishingMinigame extends Component< - FishingMinigameProps, - FishingMinigameState -> { - animation_id: number; - last_frame: number; - reeling: ReelingState = ReelingState.Idle; - perfect: boolean = true; - area_height: number = 1000; - state: FishingMinigameState; - currentVelocityLimit: number = 200; - // Difficulty & special rules dependent variables - completionLossPerSecond: number; - baitBounceCoeff: number; - difficultyActionFreqCoeff: number = 1; - longJumpVelocityLimit: number = 200; - shortJumpVelocityLimit: number = 400; - idleVelocity: number = 0; - - baseLongJumpChancePerSecond: number = 0.0075; - baseShortJumpChancePerSecond: number = 0.255; - interruptMove: boolean = true; - - constructor(props: FishingMinigameProps) { - super(props); - - const fishHeight = 50; - const startingCompletion = 30; - - // Set things depending on difficulty - const baitHeight = 170 + (150 - props.difficulty); - - this.completionLossPerSecond = props.special_rules.includes('limit_loss') - ? -4 - : -6; - this.baitBounceCoeff = props.special_rules.includes('weighted') ? 0.1 : 0.6; - this.idleVelocity = props.special_rules.includes('heavy') ? 10 : 0; - - switch (props.fish_ai) { - case 'dumb': - // This is just using defaults - break; - case 'slow': - // Only does long jump, and doesn't change direction until it gets there - this.baseShortJumpChancePerSecond = 0; - this.baseLongJumpChancePerSecond = 0.15; - this.longJumpVelocityLimit = 150; - this.interruptMove = false; - break; - case 'zippy': - this.baseShortJumpChancePerSecond *= 3; - break; - } - - // Start at the bottom - this.state = { - completion: startingCompletion, - bait: { - position: this.area_height - baitHeight, - height: baitHeight, - velocity: this.idleVelocity, - }, - fish: { - position: this.area_height - fishHeight, - height: fishHeight, - velocity: this.idleVelocity, - target: null, - }, - }; - - this.handle_mousedown = this.handle_mousedown.bind(this); - this.handle_mouseup = this.handle_mouseup.bind(this); - this.updateAnimation = this.updateAnimation.bind(this); - this.moveFish = this.moveFish.bind(this); - this.moveBait = this.moveBait.bind(this); - this.updateCompletion = this.updateCompletion.bind(this); - } - - componentDidMount() { - // add binds blah blah - document.addEventListener('mousedown', this.handle_mousedown); - document.addEventListener('mouseup', this.handle_mouseup); - this.animation_id = window.requestAnimationFrame(this.updateAnimation); - globalEvents.on('byond/mousedown', this.handle_mousedown); - globalEvents.on('byond/mouseup', this.handle_mouseup); - } - - componentWillUnmount() { - document.removeEventListener('mousedown', this.handle_mousedown); - document.removeEventListener('mouseup', this.handle_mouseup); - window.cancelAnimationFrame(this.animation_id); - globalEvents.off('byond/mousedown', this.handle_mousedown); - globalEvents.off('byond/mouseup', this.handle_mouseup); - } - - updateAnimation(timestamp: DOMHighResTimeStamp) { - const last = this.last_frame === undefined ? timestamp : this.last_frame; - const delta = timestamp - last; - let newState: FishingMinigameState = { ...this.state }; - newState = this.moveFish(newState, delta, timestamp); - newState = this.moveBait(newState, delta); - newState = this.updateCompletion(newState, delta); - this.setState(newState); - // wait for next frame - this.last_frame = timestamp; - this.animation_id = window.requestAnimationFrame(this.updateAnimation); - } - - moveFish( - currentState: FishingMinigameState, - delta: number, - timestamp: DOMHighResTimeStamp - ): FishingMinigameState { - const seconds = delta / 1000; - const { fish: currentFishState } = this.state; - - const longJumpChance = - this.baseLongJumpChancePerSecond * this.props.difficulty * seconds * 100; - - const shortJumpChance = - this.baseShortJumpChancePerSecond * this.props.difficulty * seconds * 100; - - const nextFishState = { ...currentFishState }; - - // Switching to new long jump target can interrupt any other - if ( - (this.interruptMove || currentFishState.target === null) && - randomProb(longJumpChance) - ) { - /* - Move at least 0.75 to full of the availible bar in given direction, - and more likely to move in the direction where there's more space - */ - const distanceFromTop = 0 - currentFishState.position; - const distanceFromBottom = - this.area_height - - (currentFishState.position + currentFishState.height); - - const absTop = Math.abs(distanceFromTop); - const absBottom = Math.abs(distanceFromBottom); - const topChance = (absTop / (absTop + absBottom)) * 100; - - const maxFishPosition = this.area_height - currentFishState.height; - if (randomProb(topChance)) { - // Moving to top - const delta = Math.floor(distanceFromTop * randomNumber(0.75, 1)); - } else { - // Moving to bottom - const delta = Math.floor(distanceFromBottom * randomNumber(0.75, 1)); - } - const newTarget = currentFishState.position + delta; - nextFishState.target = clamp(newTarget, 0, maxFishPosition); - this.currentVelocityLimit = this.longJumpVelocityLimit; - } - - const activeTarget = - currentFishState.target && - Math.abs(currentFishState.target - currentFishState.position) > 5; - - if (activeTarget) { - // Move towards target - const distance = currentFishState.target! - currentFishState.position; - const friction = 0.9; - // about 5 at diff 15 , 10 at diff 30, 30 at diff 100; - const diffCoeff = 0.3 * this.props.difficulty + 0.5; - const targetAcceleration = distance * diffCoeff * seconds; - - nextFishState.velocity = - currentFishState.velocity * friction + targetAcceleration; - } else { - // If we have the target but we're close enough, mark as target reached - if ( - currentFishState.target && - Math.abs(currentFishState.target - currentFishState.position) < 5 - ) { - nextFishState.target = null; - } - // Try to do a short jump - these can't really be interrupted - if (randomProb(shortJumpChance)) { - const distanceFromTop = 0 - currentFishState.position; - const distanceFromBottom = - this.area_height - - (currentFishState.position + currentFishState.height); - let possibleMoves: number[] = []; - if (Math.abs(distanceFromBottom) > 100) { - possibleMoves.push(randomInteger(100, 200)); - } - if (Math.abs(distanceFromTop) > 100) { - possibleMoves.push(randomInteger(-200, -100)); - } - const delta = randomPick(possibleMoves); - const maxFishPosition = this.area_height - currentFishState.height; - const rawTarget = currentFishState.position + delta; - nextFishState.target = clamp(rawTarget, 0, maxFishPosition); - this.currentVelocityLimit = this.shortJumpVelocityLimit; - } - } - nextFishState.velocity = clamp( - nextFishState.velocity + this.idleVelocity, - -this.currentVelocityLimit, - this.currentVelocityLimit - ); - - nextFishState.position = - currentFishState.position + seconds * currentFishState.velocity; - - // Top bound - if (nextFishState.position < 0) { - nextFishState.position = 0; - } - // Bottom bound - if (nextFishState.position + nextFishState.height > this.area_height) { - nextFishState.position = this.area_height - nextFishState.height; - } - - const newState: FishingMinigameState = { - ...currentState, - fish: nextFishState, - }; - return newState; - } - - moveBait( - currentState: FishingMinigameState, - delta: number - ): FishingMinigameState { - const seconds = delta / 1000; - const { fish, bait } = this.state; - - // Speedup when reeling - const acceleration_up = -1500; - // Gravity - const acceleration_down = 1000; - // Velocity is multiplied by this when bouncing off the bottom/top - const bounce_coeff = this.baitBounceCoeff; - // Acceleration mod when bait is over fish - const on_point_coeff = 0.6; - - let newPosition = bait.position + seconds * bait.velocity; - let newVelocity = bait.velocity; - - // Top bound - if (newPosition < 0) { - newPosition = 0; - if (this.reeling === ReelingState.Reeling) { - newVelocity = 0; - } else { - newVelocity = -bait.velocity * bounce_coeff; - } - } - // Bottom bound - if (newPosition + bait.height > this.area_height) { - newPosition = this.area_height - bait.height; - newVelocity = -bait.velocity * bounce_coeff; - } - - const acceleration = - this.reeling === ReelingState.Reeling - ? acceleration_up - : acceleration_down; - const velocity_change = acceleration * seconds; - // Slowdown both ways when on fish - if (this.fishOnBait(fish, bait)) { - newVelocity += on_point_coeff * velocity_change; - } else { - newVelocity += velocity_change; - } - - // Round it off and cap - if (Math.abs(newVelocity) < 0.01) { - newVelocity = 0; - } - - const newState: FishingMinigameState = { - ...currentState, - bait: { ...bait, position: newPosition, velocity: newVelocity }, - }; - return newState; - } - - updateCompletion( - currentState: FishingMinigameState, - delta: number - ): FishingMinigameState { - const seconds = delta / 1000; - const completion_gain_per_second = 5; - const completion_lost_per_second = this.completionLossPerSecond; - - const { fish, bait } = currentState; - - let completion_delta = 0; - if (this.fishOnBait(fish, bait)) { - completion_delta = seconds * completion_gain_per_second; - } else { - completion_delta = seconds * completion_lost_per_second; - this.perfect = false; - } - const rawCompletion = currentState.completion + completion_delta; - const newCompletion = clamp(rawCompletion, 0, 100); - const newState: FishingMinigameState = { - ...currentState, - completion: newCompletion, - }; - - const dispatch = useDispatch(this.context); - - if (newCompletion <= 0) { - this.props.lose(); - dispatch(backendSuspendStart()); - } else if (newCompletion >= 100) { - this.props.win(this.perfect); - dispatch(backendSuspendStart()); - } - - return newState; - } - - fishOnBait(fish: Fish, bait: Bait): boolean { - const upperBoundCheck = fish.position >= bait.position; - const fishLowerBound = fish.position + fish.height; - const baitLowerBound = bait.position + bait.height; - const lowerBoundCheck = fishLowerBound <= baitLowerBound; - return lowerBoundCheck && upperBoundCheck; - } - - handle_mousedown(event: MouseEvent) { - if (this.reeling === ReelingState.Idle) { - this.reeling = ReelingState.Reeling; - } - } - - handle_mouseup(event: MouseEvent) { - this.reeling = ReelingState.Idle; - } - - render() { - const { completion, fish, bait } = this.state; - const posToStyle = (value: number) => (value / this.area_height) * 100; - const background_image = resolveAsset(this.props.background); - return ( -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    - ); - } -} - -type FishingData = { - difficulty: number; - fish_ai: FishAI; - special_effects: SpecialRule[]; - background_image: string; -}; - -export const Fishing = (props, context) => { - const { act, data } = useBackend(context); - return ( - - - act('win', { perfect: perfect })} - lose={() => act('lose')} - /> - - - ); -}; diff --git a/tgui/packages/tgui/interfaces/FishingPortalGenerator.tsx b/tgui/packages/tgui/interfaces/FishingPortalGenerator.tsx deleted file mode 100644 index 4d34015344daa..0000000000000 --- a/tgui/packages/tgui/interfaces/FishingPortalGenerator.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { useBackend } from '../backend'; -import { Window } from '../layouts'; -import { Button, LabeledList, Section } from '../components'; - -type FishingPortalData = { - active: boolean; - presets: string[]; - active_preset: string; -}; - -export const FishingPortalGenerator = (props, context) => { - const { act, data } = useBackend(context); - - return ( - - -
    - {!data.active && ( - - {data.presets.map((x) => ( - -
    -
    -
    - ); -}; diff --git a/tgui/packages/tgui/interfaces/ForbiddenLore.js b/tgui/packages/tgui/interfaces/ForbiddenLore.js deleted file mode 100644 index 4d1f6db58a8cd..0000000000000 --- a/tgui/packages/tgui/interfaces/ForbiddenLore.js +++ /dev/null @@ -1,53 +0,0 @@ -import { sortBy } from 'common/collections'; -import { flow } from 'common/fp'; -import { useBackend } from '../backend'; -import { Box, Button, Section } from '../components'; -import { Window } from '../layouts'; - -export const ForbiddenLore = (props, context) => { - const { act, data } = useBackend(context); - const { charges } = data; - const to_know = flow([ - sortBy( - (to_know) => to_know.state !== 'Research', - (to_know) => to_know.path === 'Side' - ), - ])(data.to_know || []); - return ( - - -
    - Charges left : {charges} - {to_know !== null ? ( - to_know.map((knowledge) => ( -
    - - {knowledge.path} path - - -
    - )) - ) : ( - No more knowledge can be found - )} -
    -
    -
    - ); -}; diff --git a/tgui/packages/tgui/interfaces/InfuserBook.tsx b/tgui/packages/tgui/interfaces/InfuserBook.tsx index ae3d81b96afa0..20eeb8bc3a102 100644 --- a/tgui/packages/tgui/interfaces/InfuserBook.tsx +++ b/tgui/packages/tgui/interfaces/InfuserBook.tsx @@ -28,7 +28,7 @@ type TierData = { name: string; }; -const PAGE_HEIGHT = '235px'; +const PAGE_HEIGHT = 30; const TIER2TIERDATA: TierData[] = [ { @@ -69,7 +69,7 @@ const TIER2TIERDATA: TierData[] = [ ]; export const InfuserBook = (props, context) => { - const { data } = useBackend(context); + const { data, act } = useBackend(context); const { entries } = data; const [bookPosition, setBookPosition] = useLocalState( @@ -87,7 +87,11 @@ export const InfuserBook = (props, context) => { let currentEntry = paginatedEntries[chapter][pageInChapter]; const switchChapter = (newChapter) => { + if (chapter === newChapter) { + return; + } setBookPosition({ chapter: newChapter, pageInChapter: 0 }); + act('play_flip_sound'); // just so we can play a sound fx on page turn }; const setPage = (newPage) => { @@ -112,6 +116,7 @@ export const InfuserBook = (props, context) => { newBookPosition.pageInChapter = newPage; } setBookPosition(newBookPosition); + act('play_flip_sound'); // just so we can play a sound fx on page turn }; const tabs = [ @@ -127,7 +132,7 @@ export const InfuserBook = (props, context) => { const restrictedNext = chapter === 3 && pageInChapter === 0; return ( - + @@ -215,7 +220,7 @@ export const InfuserInstructions = (props, context) => {
    3. Have someone activate the machine externally.
    - + And you're done! Note that the infusion source will be obliterated in the process. diff --git a/tgui/packages/tgui/interfaces/IntegratedCircuit/Connections.js b/tgui/packages/tgui/interfaces/IntegratedCircuit/Connections.js deleted file mode 100644 index 42f5113581531..0000000000000 --- a/tgui/packages/tgui/interfaces/IntegratedCircuit/Connections.js +++ /dev/null @@ -1,57 +0,0 @@ -import { CSS_COLORS } from '../../constants'; -import { SVG_CURVE_INTENSITY } from './constants'; -import { classes } from '../../../common/react'; - -export const Connections = (props, context) => { - const { connections } = props; - - const isColorClass = (str) => { - if (typeof str === 'string') { - return CSS_COLORS.includes(str); - } - }; - - return ( - - {connections.map((val, index) => { - const from = val.from; - const to = val.to; - if (!to || !from) { - return; - } - // Starting point - let path = `M ${from.x} ${from.y}`; - // DEFAULT STYLE - path += `C ${from.x + SVG_CURVE_INTENSITY}, ${from.y},`; - path += `${to.x - SVG_CURVE_INTENSITY}, ${to.y},`; - path += `${to.x}, ${to.y}`; - - // SUBWAY STYLE - // const yDiff = Math.abs(from.y - (to.y - 16)); - // path += `L ${to.x - yDiff} ${from.y}`; - // path += `L ${to.x - 16} ${to.y}`; - // path += `L ${to.x} ${to.y}`; - - val.color = val.color || 'blue'; - return ( - - ); - })} - - ); -}; diff --git a/tgui/packages/tgui/interfaces/IntegratedCircuit/VariableMenu.js b/tgui/packages/tgui/interfaces/IntegratedCircuit/VariableMenu.js index 39726e9ab5d74..5a75ebe4630c4 100644 --- a/tgui/packages/tgui/interfaces/IntegratedCircuit/VariableMenu.js +++ b/tgui/packages/tgui/interfaces/IntegratedCircuit/VariableMenu.js @@ -1,6 +1,7 @@ import { Box, Stack, Section, Button, Input, Dropdown, Icon } from '../../components'; import { Component } from 'inferno'; import { shallowDiffers } from 'common/react'; +import { VARIABLE_ASSOC_LIST, VARIABLE_LIST, VARIABLE_NOT_A_LIST } from './constants'; export class VariableMenu extends Component { constructor() { @@ -69,7 +70,7 @@ export class VariableMenu extends Component { {val.name}
    - + @@ -125,43 +126,69 @@ export class VariableMenu extends Component { } /> + + + this.setState({ + variable_type: selectedVal, + }) + } + /> + - - this.setState({ - variable_type: selectedVal, - }) + - + - + diff --git a/tgui/packages/tgui/interfaces/IntegratedCircuit/constants.js b/tgui/packages/tgui/interfaces/IntegratedCircuit/constants.js index 784bcbbd670a4..2c91442de31a6 100644 --- a/tgui/packages/tgui/interfaces/IntegratedCircuit/constants.js +++ b/tgui/packages/tgui/interfaces/IntegratedCircuit/constants.js @@ -1,6 +1,5 @@ export const NULL_REF = '[0x0]'; export const ABSOLUTE_Y_OFFSET = -32; -export const SVG_CURVE_INTENSITY = 64; export const MOUSE_BUTTON_LEFT = 0; export const OPTION_DROPDOWN_LARGE_CHAR_AMOUNT = 12; @@ -8,3 +7,7 @@ export const OPTION_DROPDOWN_LARGE_CHAR_AMOUNT = 12; export const TIME_UNTIL_PORT_RELEASE_WORKS = 100; export const DEFAULT_COMPONENT_MENU_LIMIT = 6; export const noop = () => {}; + +export const VARIABLE_NOT_A_LIST = 1; +export const VARIABLE_LIST = 2; +export const VARIABLE_ASSOC_LIST = 3; diff --git a/tgui/packages/tgui/interfaces/IntegratedCircuit/index.js b/tgui/packages/tgui/interfaces/IntegratedCircuit/index.js index e2e80c76d60ae..81d7b1dd5d004 100644 --- a/tgui/packages/tgui/interfaces/IntegratedCircuit/index.js +++ b/tgui/packages/tgui/interfaces/IntegratedCircuit/index.js @@ -4,8 +4,8 @@ import { Component } from 'inferno'; import { Window } from '../../layouts'; import { resolveAsset } from '../../assets'; import { CircuitInfo } from './CircuitInfo'; -import { ABSOLUTE_Y_OFFSET, MOUSE_BUTTON_LEFT, TIME_UNTIL_PORT_RELEASE_WORKS } from './constants'; -import { Connections } from './Connections'; +import { ABSOLUTE_Y_OFFSET, MOUSE_BUTTON_LEFT, TIME_UNTIL_PORT_RELEASE_WORKS, VARIABLE_ASSOC_LIST, VARIABLE_LIST } from './constants'; +import { Connections } from '../common/Connections'; import { ObjectComponent } from './ObjectComponent'; import { DisplayComponent } from './DisplayComponent'; import { VariableMenu } from './VariableMenu'; @@ -574,11 +574,12 @@ export class IntegratedCircuit extends Component { variables={variables} types={global_basic_types} onClose={(event) => this.setState({ variableMenuOpen: false })} - onAddVariable={(name, type, asList, event) => + onAddVariable={(name, type, listType, event) => act('add_variable', { variable_name: name, variable_datatype: type, - is_list: asList, + is_list: listType === VARIABLE_LIST, + is_assoc_list: listType === VARIABLE_ASSOC_LIST, }) } onRemoveVariable={(name, event) => diff --git a/tgui/packages/tgui/interfaces/LibraryConsole.js b/tgui/packages/tgui/interfaces/LibraryConsole.js index 40618da397fbe..9abc0cb88fec9 100644 --- a/tgui/packages/tgui/interfaces/LibraryConsole.js +++ b/tgui/packages/tgui/interfaces/LibraryConsole.js @@ -248,8 +248,15 @@ export const CheckoutEntries = (props, context) => { const CheckoutModal = (props, context) => { const { act, data } = useBackend(context); + const inventory = flow([ + map((book, i) => ({ + ...book, + // Generate a unique id + key: i, + })), + sortBy((book) => book.key), + ])(data.inventory); - const { checking_out } = data; const [checkoutBook, setCheckoutBook] = useLocalState( context, 'CheckoutBook', @@ -258,7 +265,7 @@ const CheckoutModal = (props, context) => { const [bookName, setBookName] = useLocalState( context, 'CheckoutBookName', - checking_out || 'Book' + 'Insert Book name...' ); const [checkoutee, setCheckoutee] = useLocalState( context, @@ -270,20 +277,21 @@ const CheckoutModal = (props, context) => { 'CheckoutPeriod', 5 ); - return ( Are you sure you want to loan out this book? + book.title)} + value={bookName} + onSelected={(e) => setBookName(e)} + /> - - setBookName(value)} - /> - { + const { act, data } = useBackend(context); + const { + light_info, + templates = [], + default_id, + default_category, + category_ids, + } = data; + const [currentTemplate, setCurrentTemplate] = useLocalState( + context, + 'currentTemplate', + default_id + ); + const [currentCategory, setCurrentCategory] = useLocalState( + context, + 'currentCategory', + default_category + ); + + const category_keys = category_ids ? Object.keys(category_ids) : []; + + return ( + + + + +
    + + {category_keys.map((category, index) => ( + setCurrentCategory(category)}> + + {category} + + + ))} + + + {category_ids[currentCategory].map((id) => ( + setCurrentTemplate(id)}> + + {templates[id].light_info.name} + + + + ))} + +
    +
    + + + + +
    +
    +
    + ); +}; + +type LightControlProps = { + info: LightDetails; +}; + +const LightControl = (props: LightControlProps, context) => { + const { act, data } = useBackend(context); + const { on } = data; + const { info } = props; + return ( +
    + + + + + + {info.name} + + + + +
    + ); +}; + +type LightInfoProps = { + light: LightTemplate; +}; + +const LightInfo = (props: LightInfoProps, context) => { + const { act } = useBackend(context); + const { light } = props; + const { light_info } = light; + return ( +
    + + + + + + Template: {light_info.name} + + + {light.description} + + + + +
    + ); +}; + +// 3 vertical stacks, setup as columns +const DirectionSelect = () => { + return ( + + + + + + + + + + + + + + + + + + + + + + ); +}; + +type DirectedButtonProps = { + dir: number; + icon: string; +}; + +const DirectionButton = (props: DirectedButtonProps, context) => { + const { act, data } = useBackend(context); + const { direction } = data; + const { dir, icon } = props; + return ( + +